ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMGRkMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBleGNsdWRpbmc9IioqL2ludGVybmFsLyIga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5OTUwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2MjBmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjdlNmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0jTW9uIE9jdCAyNCAxNTowNzozMCBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhYzFkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1R1ZSBPY3QgMTggMTU6MTQ6MTYgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkuamF2YWRvYz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcmV0dXJuIFJldHVybnMgdGhlICR7YmFyZV9maWVsZF9uYW1lfS5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcGFyYW0gJHtwYXJhbX0gVGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXQuXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgSmF2YSBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWxlY29tbWVudCIgbmFtZVw9ImZpbGVjb21tZW50Ij4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogQ29weXJpZ2h0IChjKSAke3llYXJ9IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4gKlxuICogQ29udHJpYnV0b3JzXDpcbiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcbiAqIEBzaW5jZSAzLjJcbiAqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCI+LyoqXG4gKiBcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cblxuJHt0eXBlY29tbWVudH1cbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9ja1xuJHtleGNlcHRpb25fdmFyfS5wcmludFN0YWNrVHJhY2UoKTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmJvZHkiIG5hbWVcPSJjb25zdHJ1Y3RvcmJvZHkiPiR7Ym9keV9zdGF0ZW1lbnR9XG4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWI8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5Ij5yZXR1cm4gJHtmaWVsZH07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjbGFzc2JvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNsYXNzIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNsYXNzYm9keSIgbmFtZVw9ImNsYXNzYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImludGVyZmFjZWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGludGVyZmFjZSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5pbnRlcmZhY2Vib2R5IiBuYW1lXD0iaW50ZXJmYWNlYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImVudW1ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmVudW1ib2R5IiBuYW1lXD0iZW51bWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJhbm5vdGF0aW9uYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgYW5ub3RhdGlvbiB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5hbm5vdGF0aW9uYm9keSIgbmFtZVw9ImFubm90YXRpb25ib2R5Ij5cbjwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjI1MTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1R1ZSBOb3YgMTYgMTQ6MTA6MjEgRVNUIDIwMDQKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWIwNGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzCi1CdW5kbGUtVmVyc2lvbjogMy4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHMsCi0gb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMudXRpbCwKLSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbW1hbmRzLm9wZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbW1hbmRzLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxNDYxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzMzRiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy9jb21wb25lbnQiCi0gICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZWNsaXBzZS5vcmcvY29tcG9uZW50IC4uL2NvbXBvbmVudC54c2QgIgotICAgbmFtZT0iUGxhdGZvcm0gQ29yZSBDb21tYW5kcyI+Ci0KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMiIC8+Ci0KLTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMiID4KLSAgPHR5cGUgbmFtZT0iQWJzdHJhY3RIYW5kbGVyIi8+Ci0gIDx0eXBlIG5hbWU9IkNhdGVnb3J5Ii8+Ci0gIDx0eXBlIG5hbWU9IkNhdGVnb3J5RXZlbnQiIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJDb21tYW5kIi8+Ci0gIDx0eXBlIG5hbWU9IkNvbW1hbmRFdmVudCIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IkNvbW1hbmRNYW5hZ2VyIi8+Ci0gIDx0eXBlIG5hbWU9IkNvbW1hbmRNYW5hZ2VyRXZlbnQiLz4KLSAgPHR5cGUgbmFtZT0iRXhlY3V0aW9uRXZlbnQiLz4KLSAgPHR5cGUgbmFtZT0iRXhlY3V0aW9uRXhjZXB0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSGFuZGxlckV2ZW50IiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSUNhdGVnb3J5TGlzdGVuZXIiLz4KLSAgPHR5cGUgbmFtZT0iSUNvbW1hbmRMaXN0ZW5lciIvPgotICA8dHlwZSBuYW1lPSJJQ29tbWFuZE1hbmFnZXJMaXN0ZW5lciIvPgotICA8dHlwZSBuYW1lPSJJSGFuZGxlciIvPgotICA8dHlwZSBuYW1lPSJJSGFuZGxlckF0dHJpYnV0ZXMiLz4KLSAgPHR5cGUgbmFtZT0iSUhhbmRsZXJMaXN0ZW5lciIvPgotICA8dHlwZSBuYW1lPSJJUGFyYW1ldGVyIi8+Ci0gIDx0eXBlIG5hbWU9IklQYXJhbWV0ZXJWYWx1ZXMiLz4KLSAgPHR5cGUgbmFtZT0iTm90SGFuZGxlZEV4Y2VwdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlBhcmFtZXRlcml6YXRpb24iLz4KLSAgPHR5cGUgbmFtZT0iUGFyYW1ldGVyaXplZENvbW1hbmQiLz4KLSAgPHR5cGUgbmFtZT0iUGFyYW1ldGVyVmFsdWVzRXhjZXB0aW9uIi8+Ci08L3BhY2thZ2U+Ci0KLTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uIiA+Ci0gIDx0eXBlIG5hbWU9IkFic3RyYWN0Qml0U2V0RXZlbnQiLz4KLSAgPHR5cGUgbmFtZT0iQWJzdHJhY3ROYW1lZEhhbmRsZUV2ZW50Ii8+Ci0gIDx0eXBlIG5hbWU9IkNvbW1hbmRFeGNlcHRpb24iIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJIYW5kbGVPYmplY3QiLz4KLSAgPHR5cGUgbmFtZT0iTmFtZWRIYW5kbGVPYmplY3QiLz4KLSAgPHR5cGUgbmFtZT0iTm90RGVmaW5lZEV4Y2VwdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci08L3BhY2thZ2U+Ci0KLTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHMiID4KLSAgPHR5cGUgbmFtZT0iQ29udGV4dCIvPgotICA8dHlwZSBuYW1lPSJDb250ZXh0RXZlbnQiLz4KLSAgPHR5cGUgbmFtZT0iQ29udGV4dE1hbmFnZXIiLz4KLSAgPHR5cGUgbmFtZT0iQ29udGV4dE1hbmFnZXJFdmVudCIvPgotICA8dHlwZSBuYW1lPSJJQ29udGV4dExpc3RlbmVyIi8+Ci0gIDx0eXBlIG5hbWU9IklDb250ZXh0TWFuYWdlckxpc3RlbmVyIi8+Ci08L3BhY2thZ2U+Ci0KLTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucyIgPgotICA8dHlwZSBuYW1lPSJBYnN0cmFjdE9wZXJhdGlvbiIvPgotICA8dHlwZSBuYW1lPSJDb250ZXh0Q29uc3VsdGluZ09wZXJhdGlvbkFwcHJvdmVyIi8+Ci0gIDx0eXBlIG5hbWU9IkRlZmF1bHRPcGVyYXRpb25IaXN0b3J5Ii8+Ci0gIDx0eXBlIG5hbWU9IklDb250ZXh0T3BlcmF0aW9uQXBwcm92ZXIiLz4KLSAgPHR5cGUgbmFtZT0iSUhpc3RvcnlOb3RpZmljYXRpb25Bd2FyZU9wZXJhdGlvbiIvPgotICA8dHlwZSBuYW1lPSJJT3BlcmF0aW9uQXBwcm92ZXIiLz4KLSAgPHR5cGUgbmFtZT0iSU9wZXJhdGlvbkhpc3RvcnkiLz4KLSAgPHR5cGUgbmFtZT0iSU9wZXJhdGlvbkhpc3RvcnlMaXN0ZW5lciIvPgotICA8dHlwZSBuYW1lPSJJVW5kb2FibGVPcGVyYXRpb24iLz4KLSAgPHR5cGUgbmFtZT0iSVVuZG9Db250ZXh0Ii8+Ci0gIDx0eXBlIG5hbWU9IkxpbmVhclVuZG9FbmZvcmNlciIvPgotICA8dHlwZSBuYW1lPSJMaW5lYXJVbmRvVmlvbGF0aW9uRGV0ZWN0b3IiLz4KLSAgPHR5cGUgbmFtZT0iT2JqZWN0VW5kb0NvbnRleHQiLz4KLSAgPHR5cGUgbmFtZT0iT3BlcmF0aW9uSGlzdG9yeUV2ZW50Ii8+Ci0gIDx0eXBlIG5hbWU9Ik9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5Ii8+Ci0gIDx0eXBlIG5hbWU9Ik9wZXJhdGlvblN0YXR1cyIvPgotICA8dHlwZSBuYW1lPSJVbmRvQ29udGV4dCIvPgotPC9wYWNrYWdlPgotCi08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIi8+Ci0KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWI2Mjk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IENvbW1hbmRzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0Fic3RyYWN0SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0Fic3RyYWN0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGRkYTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9BYnN0cmFjdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkV2ZW50TWFuYWdlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgYSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPklIYW5kbGVyPC9jb2RlPi4gVGhpcwotICogYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgc3VwcG9ydCBmb3IgaGFuZGxlciBsaXN0ZW5lcnMuIFlvdSBzaG91bGQKLSAqIHN1YmNsYXNzIGZyb20gdGhpcyBtZXRob2QgdW5sZXNzIHlvdSB3YW50IHRvIGltcGxlbWVudCB5b3VyIG93biBsaXN0ZW5lcgotICogc3VwcG9ydC4gU3ViY2xhc3NlcyBzaG91bGQgY2FsbAotICoge0BsaW5rIEFic3RyYWN0SGFuZGxlciNmaXJlSGFuZGxlckNoYW5nZWQoSGFuZGxlckV2ZW50KX13aGVuIHRoZSBoYW5kbGVyCi0gKiBjaGFuZ2VzLiBTdWJjbGFzc2VzIGNhbiBhbHNvIG92ZXJyaWRlIHtAbGluayBBYnN0cmFjdEhhbmRsZXIjaXNFbmFibGVkKCl9IGFuZAotICoge0BsaW5rIEFic3RyYWN0SGFuZGxlciNpc0hhbmRsZWQoKX0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SGFuZGxlciBleHRlbmRzIEV2ZW50TWFuYWdlciBpbXBsZW1lbnRzIElIYW5kbGVyIHsKLQotCS8qKgotCSAqIEBzZWUgSUhhbmRsZXIjYWRkSGFuZGxlckxpc3RlbmVyKElIYW5kbGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkSGFuZGxlckxpc3RlbmVyKGZpbmFsIElIYW5kbGVyTGlzdGVuZXIgaGFuZGxlckxpc3RlbmVyKSB7Ci0JCWFkZExpc3RlbmVyT2JqZWN0KGhhbmRsZXJMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIHdobyBhdHRhY2ggbGlzdGVuZXJzCi0JICogdG8gb3RoZXIgb2JqZWN0cyBhcmUgZW5jb3VyYWdlZCB0byBkZXRhY2ggdGhlbSBpbiB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gRG8gbm90aGluZy4KLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyBhbiBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgZGVzY3JpYmluZyBjaGFuZ2VzIHRvIHRoaXMKLQkgKiBpbnN0YW5jZS4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBtZXRob2QgKGkuZS4sIGlmIGEgZGlmZmVyZW50Ci0JICogdHlwZSBvZiBsaXN0ZW5lciBjYW4gYmUgYXR0YWNoZWQgdG8gYSBzdWJjbGFzcykuIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkKLQkgKiBmb3Igc3VwcG9ydCBvZiA8Y29kZT5BYnN0cmFjdEhhbmRsZXI8L2NvZGU+IGluCi0JICogPGNvZGU+b3JnLmVjbGlwc2UudWkud29ya2JlbmNoPC9jb2RlPiwgYW5kIGNsaWVudHMgc2hvdWxkIGJlIHdhcnkgb2YKLQkgKiBvdmVycmlkaW5nIHRoaXMgYmVoYXZpb3VyLiBJZiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuLCB0aGVuIHRoZSBmaXJzdAotCSAqIGxpbmUgb2YgdGhlIG1ldGhvZCBzaG91bGQgYmUgIjxjb2RlPnN1cGVyLmZpcmVIYW5kbGVyQ2hhbmdlZChoYW5kbGVyRXZlbnQpOzwvY29kZT4iLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaGFuZGxlckV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZXZlbnQgZGVzY3JpYmluZyBjaGFuZ2VzIHRvIHRoaXMgaW5zdGFuY2UuIE11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSGFuZGxlckNoYW5nZWQoZmluYWwgSGFuZGxlckV2ZW50IGhhbmRsZXJFdmVudCkgewotCQlpZiAoaGFuZGxlckV2ZW50ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlmaW5hbCBPYmplY3RbXSBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIElIYW5kbGVyTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUhhbmRsZXJMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJbGlzdGVuZXIuaGFuZGxlckNoYW5nZWQoaGFuZGxlckV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgdGhpcyBoYW5kbGVyIGlzIGNhcGFibGUgb2YgZXhlY3V0aW5nIGF0IHRoaXMgdGltZS4gU3ViY2xhc3NlcyBtYXkKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoaXMgaGFuZGxlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIGRlbGVnYXRlZCByZXNwb25zaWJpbGl0aWVzIGF0Ci0JICogdGhpcyB0aW1lLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIYW5kbGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRydWUgaWZmIHRoZXJlIGlzIG9uZSBvciBtb3JlIElIYW5kbGVyTGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMKLQkgKiBBYnN0cmFjdEhhbmRsZXIuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIG1ldGhvZCAoaS5lLiwgaWYgYSBkaWZmZXJlbnQKLQkgKiB0eXBlIG9mIGxpc3RlbmVyIGNhbiBiZSBhdHRhY2hlZCB0byBhIHN1YmNsYXNzKS4gVGhpcyBpcyB1c2VkIHByaW1hcmlseQotCSAqIGZvciBzdXBwb3J0IG9mIDxjb2RlPkFic3RyYWN0SGFuZGxlcjwvY29kZT4gaW4KLQkgKiA8Y29kZT5vcmcuZWNsaXBzZS51aS53b3JrYmVuY2g8L2NvZGU+LCBhbmQgY2xpZW50cyBzaG91bGQgYmUgd2FyeSBvZgotCSAqIG92ZXJyaWRpbmcgdGhpcyBiZWhhdmlvdXIuIElmIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIHRoZW4gdGhlIHJldHVybgotCSAqIHZhbHVlIHNob3VsZCBpbmNsdWRlICI8Y29kZT5zdXBlci5oYXNMaXN0ZW5lcnMoKSB8fDwvY29kZT4iLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWZmIHRoZXJlIGlzIG9uZSBvciBtb3JlIElIYW5kbGVyTGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMKLQkgKiAgICAgICAgIEFic3RyYWN0SGFuZGxlcgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIGlzTGlzdGVuZXJBdHRhY2hlZCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUhhbmRsZXIjcmVtb3ZlSGFuZGxlckxpc3RlbmVyKElIYW5kbGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlSGFuZGxlckxpc3RlbmVyKGZpbmFsIElIYW5kbGVyTGlzdGVuZXIgaGFuZGxlckxpc3RlbmVyKSB7Ci0JCXJlbW92ZUxpc3RlbmVyT2JqZWN0KGhhbmRsZXJMaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0Fic3RyYWN0SGFuZGxlcldpdGhTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0Fic3RyYWN0SGFuZGxlcldpdGhTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGI1YzlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9BYnN0cmFjdEhhbmRsZXJXaXRoU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9BYnN0cmFjdFBhcmFtZXRlclZhbHVlQ29udmVydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvQWJzdHJhY3RQYXJhbWV0ZXJWYWx1ZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzY0MDAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9BYnN0cmFjdFBhcmFtZXRlclZhbHVlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi0vKioKLSAqIDxwPgotICogU3VwcG9ydHMgY29udmVyc2lvbiBiZXR3ZWVuIG9iamVjdHMgYW5kIHN0cmluZ3MgZm9yIGNvbW1hbmQgcGFyYW1ldGVyIHZhbHVlcy4KLSAqIEV4dGVuZGVycyBtdXN0IHByb2R1Y2Ugc3RyaW5ncyB0aGF0IGlkZW50aWZ5IG9iamVjdHMgKG9mIGEgc3BlY2lmaWMgY29tbWFuZAotICogcGFyYW1ldGVyIHR5cGUpIGFzIHdlbGwgYXMgY29uc3VtZSB0aGUgc3RyaW5ncyB0byBsb2NhdGUgYW5kIHJldHVybiB0aGUKLSAqIG9iamVjdHMgdGhleSBpZGVudGlmeS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBvZmZlcnMgbXVsdGlwbGUgaGFuZGxlcnMgb2YgYSBjb21tYW5kIGEgY29uc2lzdGVudCB3YXkgb2YKLSAqIGNvbnZlcnRpbmcgc3RyaW5nIHBhcmFtZXRlciB2YWx1ZXMgaW50byB0aGUgb2JqZWN0cyB0aGF0IHRoZSBoYW5kbGVycyB3b3VsZAotICogcHJlZmVyIHRvIGRlYWwgd2l0aC4gVGhpcyBjbGFzcyBhbHNvIGdpdmVzIGNsaWVudHMgYSB3YXkgdG8gc2VyaWFsaXplCi0gKiBvYmplY3QgcGFyYW1ldGVycyBhcyBzdHJpbmdzIHNvIHRoYXQgZW50aXJlIHBhcmFtZXRlcml6ZWQgY29tbWFuZHMgY2FuIGJlCi0gKiBzZXJpYWxpemVkLCBzdG9yZWQgYW5kIGxhdGVyIGRlc2VyaWFsaXplZCBhbmQgZXhlY3V0ZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCB0eXBpY2FsbHkgYmUgZXh0ZW5kZWQgc28gdGhlIHN1YmNsYXNzIGNhbiBiZSByZWZlcmVuY2VkIGZyb20KLSAqIHRoZSA8Y29kZT5jb252ZXJ0ZXI8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUKLSAqIDxjb2RlPmNvbW1hbmRQYXJhbWV0ZXJUeXBlPC9jb2RlPiBlbGVtZW1lbnQgb2YgdGhlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS51aS5jb21tYW5kczwvY29kZT4gZXh0ZW5zaW9uLXBvaW50LiBPYmplY3RzIGltcGxlbWVudGluZwotICogdGhpcyBpbnRlcmZhY2UgbWF5IGFsc28gYmUgcGFzc2VkIGRpcmVjdGx5IHRvCi0gKiB7QGxpbmsgUGFyYW1ldGVyVHlwZSNkZWZpbmUoQ2xhc3MsIEFic3RyYWN0UGFyYW1ldGVyVmFsdWVDb252ZXJ0ZXIpfSBieQotICogY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBQYXJhbWV0ZXJUeXBlI2RlZmluZShTdHJpbmcsIEFic3RyYWN0UGFyYW1ldGVyVmFsdWVDb252ZXJ0ZXIpCi0gKiBAc2VlIFBhcmFtZXRlcml6ZWRDb21tYW5kI3NlcmlhbGl6ZSgpCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBhcmFtZXRlclZhbHVlQ29udmVydGVyIHsKLQotCS8qKgotCSAqIENvbnZlcnRzIGEgc3RyaW5nIGVuY29kZWQgY29tbWFuZCBwYXJhbWV0ZXIgdmFsdWUgaW50byB0aGUgcGFyYW1ldGVyCi0JICogdmFsdWUgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJhbWV0ZXJWYWx1ZQotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHBhcmFtZXRlciB2YWx1ZSBzdHJpbmcgZGVzY3JpYmluZyBhbiBvYmplY3Q7IG1heSBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QgZGVzY3JpYmVkIGJ5IHRoZSBjb21tYW5kIHBhcmFtZXRlciB2YWx1ZSBzdHJpbmc7IG1heQotCSAqICAgICAgICAgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAdGhyb3dzIFBhcmFtZXRlclZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIG9iamVjdCBjYW5ub3QgYmUgcHJvZHVjZWQgZnJvbSB0aGUKLQkgKiAgICAgICAgICAgICA8Y29kZT5wYXJhbWV0ZXJWYWx1ZTwvY29kZT4gc3RyaW5nCi0JICovCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBjb252ZXJ0VG9PYmplY3QoZmluYWwgU3RyaW5nIHBhcmFtZXRlclZhbHVlKQotCQkJdGhyb3dzIFBhcmFtZXRlclZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnZlcnRzIGEgY29tbWFuZCBwYXJhbWV0ZXIgdmFsdWUgb2JqZWN0IGludG8gYSBzdHJpbmcgdGhhdCBlbmNvZGVzIGEKLQkgKiByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvciBzZXJpYWxpemF0aW9uIG9mIHRoZSBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHBhcmFtZXRlclZhbHVlCi0JICogICAgICAgICAgICBhbiBvYmplY3QgdG8gY29udmVydCBpbnRvIGFuIGlkZW50aWZ5aW5nIHN0cmluZzsgbWF5IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvdmlkZWQgb2JqZWN0OyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAdGhyb3dzIFBhcmFtZXRlclZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgc3RyaW5nIHJlZmVyZW5jZSBvciBzZXJpYWxpemF0aW9uIGNhbm5vdCBiZSBwcm92aWRlZCBmb3IKLQkgKiAgICAgICAgICAgICB0aGUgPGNvZGU+cGFyYW1ldGVyVmFsdWU8L2NvZGU+Ci0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoZmluYWwgT2JqZWN0IHBhcmFtZXRlclZhbHVlKQotCQkJdGhyb3dzIFBhcmFtZXRlclZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0Fic3RyYWN0U3RhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9BYnN0cmFjdFN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMTA3MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0Fic3RyYWN0U3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkV2ZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbW1hbmRzLnV0aWwuVXRpbDsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJU3RhdGV9IHRoYXQgcHJvdmlkZXMgZ29vZCBkZWZhdWx0Ci0gKiBpbXBsZW1lbnRhdGlvbnMgZm9yIGFsbCBvZiB0aGUgbWV0aG9kcy4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBkZXZlbG9wZXJzCi0gKiBleHRlbmQgdGhpcyBjbGFzcywgcmF0aGVyIHRoYW4gaW1wbGVtZW50aW5nIHtAbGluayBJU3RhdGV9IHRoZW1zZWx2ZXMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGV4dGVuZCB0aGlzIGNsYXNzLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0YXRlIGV4dGVuZHMgRXZlbnRNYW5hZ2VyIGltcGxlbWVudHMgSVN0YXRlIHsKLQotCS8qKgotCSAqIFRoZSBwaWVjZSBvZiBzdGF0ZSB0byBzdG9yZS4gVGhpcyBtYXkgYmUgYW55dGhpbmcgYXQgYWxsLgotCSAqLwotCXByaXZhdGUgT2JqZWN0IHZhbHVlOwotCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkTGlzdGVuZXIoZmluYWwgSVN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJYWRkTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBsaXN0ZW5lcnMgdG8gdGhpcyBzdGF0ZSB0aGF0IGl0IGhhcyBjaGFuZ2VkIGluIHNvbWUgd2F5LgotCSAqIAotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIG9sZCB2YWx1ZTsgbWF5IGJlIGFueXRoaW5nLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoZmluYWwgT2JqZWN0IG9sZFZhbHVlKSB7Ci0JCWZpbmFsIE9iamVjdFtdIGxpc3RlbmVycyA9IGdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgSVN0YXRlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVN0YXRlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCWxpc3RlbmVyLmhhbmRsZVN0YXRlQ2hhbmdlKHRoaXMsIG9sZFZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCFVdGlsLmVxdWFscyh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCWZpbmFsIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQlmaXJlU3RhdGVDaGFuZ2VkKG9sZFZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUxpc3RlbmVyKGZpbmFsIElTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJlbW92ZUxpc3RlbmVyT2JqZWN0KGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvQ2F0ZWdvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9DYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2U0YzhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9DYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5OYW1lZEhhbmRsZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbW1hbmRzLnV0aWwuVXRpbDsKLQotLyoqCi0gKiA8cD4KLSAqIEEgbG9naWNhbCBncm91cCBmb3IgYSBzZXQgb2YgY29tbWFuZHMuIEEgY29tbWFuZCBiZWxvbmdzIHRvIGV4YWN0bHkgb25lCi0gKiBjYXRlZ29yeS4gVGhlIGNhdGVnb3J5IGhhcyBubyBmdW5jdGlvbmFsIGVmZmVjdCwgYnV0IG1heSBiZSB1c2VkIGluIGdyYXBoaWNhbAotICogdG9vbHMgdGhhdCB3YW50IHRvIGdyb3VwIHRoZSBzZXQgb2YgY29tbWFuZHMgc29tZWhvdy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2F0ZWdvcnkgZXh0ZW5kcyBOYW1lZEhhbmRsZU9iamVjdCB7Ci0KLQkvKioKLQkgKiBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBsaXN0ZW5pbmcgdG8gY2hhbmdlcyB0byB0aGlzIGNhdGVnb3J5LiBUaGlzCi0JICogY29sbGVjdGlvbiBpcyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBjYXRlZ29yeUxpc3RlbmVyczsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+Q2F0ZWdvcnk8L2NvZGU+IGJhc2VkIG9uIHRoZSBnaXZlbgotCSAqIGlkZW50aWZpZXIuIFdoZW4gYSBjYXRlZ29yeSBpcyBmaXJzdCBjb25zdHJ1Y3RlZCwgaXQgaXMgdW5kZWZpbmVkLgotCSAqIENhdGVnb3J5IHNob3VsZCBvbmx5IGJlIGNvbnN0cnVjdGVkIGJ5IHRoZSA8Y29kZT5Db21tYW5kTWFuYWdlcjwvY29kZT4KLQkgKiB0byBlbnN1cmUgdGhhdCBpZGVudGlmaWVyIHJlbWFpbiB1bmlxdWUuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGNhdGVnb3J5LiBUaGlzIHZhbHVlIG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nc3QgYWxsCi0JICogICAgICAgICAgICBjYXRlZ29yaWVzLgotCSAqLwotCUNhdGVnb3J5KGZpbmFsIFN0cmluZyBpZCkgewotCQlzdXBlcihpZCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoaXMgY2F0ZWdvcnkgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhpcwotCSAqIGNhdGVnb3J5J3Mgc3RhdGUgY2hhbmdlcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnlMaXN0ZW5lcgotCSAqICAgICAgICAgICAgVGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRDYXRlZ29yeUxpc3RlbmVyKAotCQkJZmluYWwgSUNhdGVnb3J5TGlzdGVuZXIgY2F0ZWdvcnlMaXN0ZW5lcikgewotCQlpZiAoY2F0ZWdvcnlMaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCWlmIChjYXRlZ29yeUxpc3RlbmVycyA9PSBudWxsKQotCQkJY2F0ZWdvcnlMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghY2F0ZWdvcnlMaXN0ZW5lcnMuY29udGFpbnMoY2F0ZWdvcnlMaXN0ZW5lcikpCi0JCQljYXRlZ29yeUxpc3RlbmVycy5hZGQoY2F0ZWdvcnlMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmaW5lcyB0aGlzIGNhdGVnb3J5IGJ5IGdpdmluZyBpdCBhIG5hbWUsIGFuZCBwb3NzaWJseSBhIGRlc2NyaXB0aW9uIGFzCi0JICogd2VsbC4gVGhlIGRlZmluZWQgcHJvcGVydHkgYXV0b21hdGljYWxseSBiZWNvbWVzIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RpZmljYXRpb24gaXMgc2VudCB0byBhbGwgbGlzdGVuZXJzIHRoYXQgc29tZXRoaW5nIGhhcyBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhpcyBjb21tYW5kOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBjb21tYW5kOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZGVmaW5lKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotCQkJCQkiVGhlIG5hbWUgb2YgYSBjb21tYW5kIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZpbmFsIGJvb2xlYW4gZGVmaW5lZENoYW5nZWQgPSAhdGhpcy5kZWZpbmVkOwotCQl0aGlzLmRlZmluZWQgPSB0cnVlOwotCi0JCWZpbmFsIGJvb2xlYW4gbmFtZUNoYW5nZWQgPSAhVXRpbC5lcXVhbHModGhpcy5uYW1lLCBuYW1lKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQotCQlmaW5hbCBib29sZWFuIGRlc2NyaXB0aW9uQ2hhbmdlZCA9ICFVdGlsLmVxdWFscyh0aGlzLmRlc2NyaXB0aW9uLAotCQkJCWRlc2NyaXB0aW9uKTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCi0JCWZpcmVDYXRlZ29yeUNoYW5nZWQobmV3IENhdGVnb3J5RXZlbnQodGhpcywgZGVmaW5lZENoYW5nZWQsCi0JCQkJZGVzY3JpcHRpb25DaGFuZ2VkLCBuYW1lQ2hhbmdlZCkpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBsaXN0ZW5lcnMgZm9yIHRoaXMgY2F0ZWdvcnkgdGhhdCBpdCBoYXMgY2hhbmdlZCBpbiBzb21lIHdheS4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnlFdmVudAotCSAqICAgICAgICAgICAgVGhlIGV2ZW50IHRvIHNlbmQgdG8gYWxsIG9mIHRoZSBsaXN0ZW5lcjsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBmaXJlQ2F0ZWdvcnlDaGFuZ2VkKGZpbmFsIENhdGVnb3J5RXZlbnQgY2F0ZWdvcnlFdmVudCkgewotCQlpZiAoY2F0ZWdvcnlFdmVudCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCWlmIChjYXRlZ29yeUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmaW5hbCBJdGVyYXRvciBsaXN0ZW5lckl0ciA9IGNhdGVnb3J5TGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobGlzdGVuZXJJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJZmluYWwgSUNhdGVnb3J5TGlzdGVuZXIgbGlzdGVuZXIgPSAoSUNhdGVnb3J5TGlzdGVuZXIpIGxpc3RlbmVySXRyCi0JCQkJCQkubmV4dCgpOwotCQkJCWxpc3RlbmVyLmNhdGVnb3J5Q2hhbmdlZChjYXRlZ29yeUV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoaXMgY2F0ZWdvcnkuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5TGlzdGVuZXIKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVDYXRlZ29yeUxpc3RlbmVyKAotCQkJZmluYWwgSUNhdGVnb3J5TGlzdGVuZXIgY2F0ZWdvcnlMaXN0ZW5lcikgewotCQlpZiAoY2F0ZWdvcnlMaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGNhdGVnb3J5TGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWNhdGVnb3J5TGlzdGVuZXJzLnJlbW92ZShjYXRlZ29yeUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uSGFuZGxlT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCJDYXRlZ29yeSgiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChpZCk7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGRlZmluZWQpOwotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgnKScpOwotCQkJc3RyaW5nID0gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkhhbmRsZU9iamVjdCN1bmRlZmluZSgpCi0JICovCi0JcHVibGljIHZvaWQgdW5kZWZpbmUoKSB7Ci0JCXN0cmluZyA9IG51bGw7Ci0KLQkJZmluYWwgYm9vbGVhbiBkZWZpbmVkQ2hhbmdlZCA9IGRlZmluZWQ7Ci0JCWRlZmluZWQgPSBmYWxzZTsKLQotCQlmaW5hbCBib29sZWFuIG5hbWVDaGFuZ2VkID0gbmFtZSAhPSBudWxsOwotCQluYW1lID0gbnVsbDsKLQotCQlmaW5hbCBib29sZWFuIGRlc2NyaXB0aW9uQ2hhbmdlZCA9IGRlc2NyaXB0aW9uICE9IG51bGw7Ci0JCWRlc2NyaXB0aW9uID0gbnVsbDsKLQotCQlmaXJlQ2F0ZWdvcnlDaGFuZ2VkKG5ldyBDYXRlZ29yeUV2ZW50KHRoaXMsIGRlZmluZWRDaGFuZ2VkLAotCQkJCWRlc2NyaXB0aW9uQ2hhbmdlZCwgbmFtZUNoYW5nZWQpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9DYXRlZ29yeUV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvQ2F0ZWdvcnlFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjBhYTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9DYXRlZ29yeUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkFic3RyYWN0TmFtZWRIYW5kbGVFdmVudDsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGRlc2NyaWJlcyBjaGFuZ2VzIHRvIGFuIGluc3RhbmNlIG9mCi0gKiA8Y29kZT5DYXRlZ29yeTwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIEBzZWUgSUNhdGVnb3J5TGlzdGVuZXIjY2F0ZWdvcnlDaGFuZ2VkKENhdGVnb3J5RXZlbnQpCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDYXRlZ29yeUV2ZW50IGV4dGVuZHMgQWJzdHJhY3ROYW1lZEhhbmRsZUV2ZW50IHsKLQotCS8qKgotCSAqIFRoZSBjYXRlZ29yeSB0aGF0IGhhcyBjaGFuZ2VkOyB0aGlzIHZhbHVlIGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0aGF0IGNoYW5nZWQuCi0JICogQHBhcmFtIGRlZmluZWRDaGFuZ2VkCi0JICogICAgICAgICAgICB0cnVlLCBpZmYgdGhlIGRlZmluZWQgcHJvcGVydHkgY2hhbmdlZC4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb25DaGFuZ2VkCi0JICogICAgICAgICAgICB0cnVlLCBpZmYgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5IGNoYW5nZWQuCi0JICogQHBhcmFtIG5hbWVDaGFuZ2VkCi0JICogICAgICAgICAgICB0cnVlLCBpZmYgdGhlIG5hbWUgcHJvcGVydHkgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcnlFdmVudChmaW5hbCBDYXRlZ29yeSBjYXRlZ29yeSwgZmluYWwgYm9vbGVhbiBkZWZpbmVkQ2hhbmdlZCwKLQkJCWZpbmFsIGJvb2xlYW4gZGVzY3JpcHRpb25DaGFuZ2VkLCBmaW5hbCBib29sZWFuIG5hbWVDaGFuZ2VkKSB7Ci0JCXN1cGVyKGRlZmluZWRDaGFuZ2VkLCBkZXNjcmlwdGlvbkNoYW5nZWQsIG5hbWVDaGFuZ2VkKTsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0aGF0IGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0aGF0IGNoYW5nZWQuIEd1YXJhbnRlZWQgbm90IHRvIGJlCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0ZWQyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uTm90RGVmaW5lZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLnV0aWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbW1hbmRzLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotCi0vKioKLSAqIDxwPgotICogQSBjb21tYW5kIGlzIGFuIGFic3RyYWN0IHJlcHJlc2VudGF0aW9uIGZvciBzb21lIHNlbWFudGljIGJlaGF2aW91ci4gSXQgaXMKLSAqIG5vdCB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgYmVoYXZpb3VyLCBub3IgaXMgaXQgdGhlIHZpc3VhbAotICogYXBwZWFyYW5jZSBvZiB0aGlzIGJlaGF2aW91ciBpbiB0aGUgdXNlciBpbnRlcmZhY2UuIEluc3RlYWQsIGl0IGlzIGEgYnJpZGdlCi0gKiBiZXR3ZWVuIHRoZSB0d28uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBjb25jZXB0IG9mIGEgY29tbWFuZCBpcyBiYXNlZCBvbiB0aGUgY29tbWFuZCBkZXNpZ24gcGF0dGVybi4gVGhlIG5vdGFibGUKLSAqIGRpZmZlcmVuY2UgaXMgaG93IHRoZSBjb21tYW5kIGRlbGVnYXRlcyByZXNwb25zaWJpbGl0eSBmb3IgZXhlY3V0aW9uLiBSYXRoZXIKLSAqIHRoYW4gYWxsb3dpbmcgY29uY3JldGUgc3ViY2xhc3NlcywgaXQgdXNlcyBhIGhhbmRsZXIgbWVjaGFuaXNtIChzZWUgdGhlCi0gKiA8Y29kZT5oYW5kbGVyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50KS4gVGhpcyBwcm92aWRlcyBhbm90aGVyIGxldmVsIG9mCi0gKiBpbmRpcmVjdGlvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogQSBjb21tYW5kIHdpbGwgZXhpc3QgaW4gdHdvIHN0YXRlczogZGVmaW5lZCBhbmQgdW5kZWZpbmVkLiBBIGNvbW1hbmQgaXMKLSAqIGRlZmluZWQgaWYgaXQgaXMgZGVjbGFyZWQgaW4gdGhlIFhNTCBvZiBhIHJlc29sdmVkIHBsdWctaW4uIElmIHRoZSBwbHVnLWluIGlzCi0gKiB1bmxvYWRlZCBvciB0aGUgY29tbWFuZCBpcyBzaW1wbHkgbm90IGRlY2xhcmVkLCB0aGVuIGl0IGlzIHVuZGVmaW5lZC4gVHJ5aW5nCi0gKiB0byByZWZlcmVuY2UgYW4gdW5kZWZpbmVkIGNvbW1hbmQgd2lsbCBzdWNjZWVkLCBidXQgdHJ5aW5nIHRvIGFjY2VzcyBhbnkgb2YKLSAqIGl0cyBmdW5jdGlvbmFsaXR5IHdpbGwgZmFpbCB3aXRoIGEgPGNvZGU+Tm90RGVmaW5lZEV4Y2VwdGlvbjwvY29kZT4uIElmCi0gKiB5b3UgbmVlZCB0byBrbm93IHdoZW4gYSBjb21tYW5kIGNoYW5nZXMgZnJvbSBkZWZpbmVkIHRvIHVuZGVmaW5lZCAob3IgdmljZQotICogdmVyc2EpLCB0aGVuIGF0dGFjaCBhIGNvbW1hbmQgbGlzdGVuZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENvbW1hbmRzIGFyZSBtdXRhYmxlIGFuZCB3aWxsIGNoYW5nZSBhcyB0aGVpciBkZWZpbml0aW9uIGNoYW5nZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbW1hbmQgZXh0ZW5kcyBOYW1lZEhhbmRsZU9iamVjdFdpdGhTdGF0ZSBpbXBsZW1lbnRzCi0JCUNvbXBhcmFibGUgewotCi0JLyoqCi0JICogVGhpcyBmbGFnIGNhbiBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29tbWFuZHMgc2hvdWxkIHByaW50Ci0JICogaW5mb3JtYXRpb24gdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gd2hlbiBleGVjdXRpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX0NPTU1BTkRfRVhFQ1VUSU9OID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGlzIGZsYWcgY2FuIGJlIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb21tYW5kcyBzaG91bGQgcHJpbnQKLQkgKiBpbmZvcm1hdGlvbiB0byA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPiB3aGVuIGNoYW5naW5nIGhhbmRsZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19IQU5ETEVSUyA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhpcyBmbGFnIGNhbiBiZSBzZXQgdG8gYSBwYXJ0aWN1bGFyIGNvbW1hbmQgaWRlbnRpZmllciBpZiBvbmx5IHRoYXQKLQkgKiBjb21tYW5kIHNob3VsZCBwcmludCBpbmZvcm1hdGlvbiB0byA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPiB3aGVuCi0JICogY2hhbmdpbmcgaGFuZGxlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVCVUdfSEFORExFUlNfQ09NTUFORF9JRCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyBjb21tYW5kIGJlbG9uZ3MuIFRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZQotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHVubGVzcyB0aGUgY29tbWFuZCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHJpdmF0ZSBDYXRlZ29yeSBjYXRlZ29yeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBsaXN0ZW5pbmcgdG8gdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNvbW1hbmQuIFRoaXMKLQkgKiBjb2xsZWN0aW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdGVuZXJMaXN0IGV4ZWN1dGlvbkxpc3RlbmVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgaGFuZGxlciBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tbWFuZC4gVGhpcyB2YWx1ZSBtYXkgYmUKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBoYW5kbGVyIGN1cnJlbnRseS4KLQkgKi8KLQlwcml2YXRlIHRyYW5zaWVudCBJSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBvcmRlcmVkIGFycmF5IG9mIHBhcmFtZXRlcnMgdW5kZXJzdG9vZCBieSB0aGlzIGNvbW1hbmQuIFRoaXMgdmFsdWUKLQkgKiBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMsIG9yIGlmIHRoZSBjb21tYW5kCi0JICogaXMgdW5kZWZpbmVkLiBJdCBtYXkgYWxzbyBiZSBlbXB0eS4KLQkgKi8KLQlwcml2YXRlIElQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+Q29tbWFuZDwvY29kZT4gYmFzZWQgb24gdGhlIGdpdmVuCi0JICogaWRlbnRpZmllci4gV2hlbiBhIGNvbW1hbmQgaXMgZmlyc3QgY29uc3RydWN0ZWQsIGl0IGlzIHVuZGVmaW5lZC4KLQkgKiBDb21tYW5kcyBzaG91bGQgb25seSBiZSBjb25zdHJ1Y3RlZCBieSB0aGUgPGNvZGU+Q29tbWFuZE1hbmFnZXI8L2NvZGU+Ci0JICogdG8gZW5zdXJlIHRoYXQgdGhlIGlkZW50aWZpZXIgcmVtYWlucyB1bmlxdWUuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGNvbW1hbmQuIFRoaXMgdmFsdWUgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBhbmQgbXVzdCBiZSB1bmlxdWUgYW1vbmdzdCBhbGwgY29tbWFuZHMuCi0JICovCi0JQ29tbWFuZChmaW5hbCBTdHJpbmcgaWQpIHsKLQkJc3VwZXIoaWQpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGlzIGNvbW1hbmQgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhpcyBjb21tYW5kJ3MKLQkgKiBzdGF0ZSBjaGFuZ2VzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdGVuZXIKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB0byBiZSBhZGRlZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkQ29tbWFuZExpc3RlbmVyKGZpbmFsIElDb21tYW5kTGlzdGVuZXIgY29tbWFuZExpc3RlbmVyKSB7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDYW5ub3QgYWRkIGEgbnVsbCBjb21tYW5kIGxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhZGRMaXN0ZW5lck9iamVjdChjb21tYW5kTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGlzIGNvbW1hbmQgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhpcyBjb21tYW5kCi0JICogaXMgYWJvdXQgdG8gZXhlY3V0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXhlY3V0aW9uTGlzdGVuZXIKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB0byBiZSBhZGRlZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkRXhlY3V0aW9uTGlzdGVuZXIoCi0JCQlmaW5hbCBJRXhlY3V0aW9uTGlzdGVuZXIgZXhlY3V0aW9uTGlzdGVuZXIpIHsKLQkJaWYgKGV4ZWN1dGlvbkxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLQkJCQkJIkNhbm5vdCBhZGQgYSBudWxsIGV4ZWN1dGlvbiBsaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoZXhlY3V0aW9uTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWV4ZWN1dGlvbkxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoTGlzdGVuZXJMaXN0LklERU5USVRZKTsKLQkJfQotCi0JCWV4ZWN1dGlvbkxpc3RlbmVycy5hZGQoZXhlY3V0aW9uTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgYSBzdGF0ZSB0byB0aGlzIGNvbW1hbmQuIFRoaXMgd2lsbCBhZGQgdGhpcyBzdGF0ZSB0byB0aGUgYWN0aXZlCi0JICogaGFuZGxlciwgaWYgdGhlIGFjdGl2ZSBoYW5kbGVyIGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBJT2JqZWN0V2l0aFN0YXRlfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgc3RhdGUgdG8gYWRkOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHN0YXRlCi0JICogICAgICAgICAgICBUaGUgc3RhdGUgdG8gYWRkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTdGF0ZShmaW5hbCBTdHJpbmcgaWQsIGZpbmFsIElTdGF0ZSBzdGF0ZSkgewotCQlzdXBlci5hZGRTdGF0ZShpZCwgc3RhdGUpOwotCQlpZiAoaGFuZGxlciBpbnN0YW5jZW9mIElPYmplY3RXaXRoU3RhdGUpIHsKLQkJCSgoSU9iamVjdFdpdGhTdGF0ZSkgaGFuZGxlcikuYWRkU3RhdGUoaWQsIHN0YXRlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXBhcmVzIHRoaXMgY29tbWFuZCB3aXRoIGFub3RoZXIgY29tbWFuZCBieSBjb21wYXJpbmcgZWFjaCBvZiBpdHMKLQkgKiBub24tdHJhbnNpZW50IGF0dHJpYnV0ZXMuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCB3aXRoIHdoaWNoIHRvIGNvbXBhcmU7IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YKLQkgKiAgICAgICAgICAgIDxjb2RlPkNvbW1hbmQ8L2NvZGU+LgotCSAqIEByZXR1cm4gQSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvIG9yIGEgcG9zdGl2aWUgaW50ZWdlciwgaWYgdGhlIG9iamVjdCBpcwotCSAqICAgICAgICAgZ3JlYXRlciB0aGFuLCBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhpcyBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKLQkJZmluYWwgQ29tbWFuZCBjYXN0ZWRPYmplY3QgPSAoQ29tbWFuZCkgb2JqZWN0OwotCQlpbnQgY29tcGFyZVRvID0gVXRpbC5jb21wYXJlKGNhdGVnb3J5LCBjYXN0ZWRPYmplY3QuY2F0ZWdvcnkpOwotCQlpZiAoY29tcGFyZVRvID09IDApIHsKLQkJCWNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZShkZWZpbmVkLCBjYXN0ZWRPYmplY3QuZGVmaW5lZCk7Ci0JCQlpZiAoY29tcGFyZVRvID09IDApIHsKLQkJCQljb21wYXJlVG8gPSBVdGlsLmNvbXBhcmUoZGVzY3JpcHRpb24sIGNhc3RlZE9iamVjdC5kZXNjcmlwdGlvbik7Ci0JCQkJaWYgKGNvbXBhcmVUbyA9PSAwKSB7Ci0JCQkJCWNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZShoYW5kbGVyLCBjYXN0ZWRPYmplY3QuaGFuZGxlcik7Ci0JCQkJCWlmIChjb21wYXJlVG8gPT0gMCkgewotCQkJCQkJY29tcGFyZVRvID0gVXRpbC5jb21wYXJlKGlkLCBjYXN0ZWRPYmplY3QuaWQpOwotCQkJCQkJaWYgKGNvbXBhcmVUbyA9PSAwKSB7Ci0JCQkJCQkJY29tcGFyZVRvID0gVXRpbC5jb21wYXJlKG5hbWUsIGNhc3RlZE9iamVjdC5uYW1lKTsKLQkJCQkJCQlpZiAoY29tcGFyZVRvID09IDApIHsKLQkJCQkJCQkJY29tcGFyZVRvID0gVXRpbC5jb21wYXJlKHBhcmFtZXRlcnMsCi0JCQkJCQkJCQkJY2FzdGVkT2JqZWN0LnBhcmFtZXRlcnMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tcGFyZVRvOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmluZXMgdGhpcyBjb21tYW5kIGJ5IGdpdmluZyBpdCBhIG5hbWUsIGFuZCBwb3NzaWJseSBhIGRlc2NyaXB0aW9uIGFzCi0JICogd2VsbC4gVGhlIGRlZmluZWQgcHJvcGVydHkgYXV0b21hdGljYWxseSBiZWNvbWVzIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RpZmljYXRpb24gaXMgc2VudCB0byBhbGwgbGlzdGVuZXJzIHRoYXQgc29tZXRoaW5nIGhhcyBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhpcyBjb21tYW5kOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBjb21tYW5kOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBUaGUgY2F0ZWdvcnkgZm9yIHRoaXMgY29tbWFuZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHBhcmFtZXRlcnMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIHVuZGVyc3Rvb2QgYnkgdGhpcyBjb21tYW5kLiBUaGlzIHZhbHVlIG1heSBiZQotCSAqICAgICAgICAgICAgZWl0aGVyIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5IGlmIHRoZSBjb21tYW5kIGRvZXMgbm90Ci0JICogICAgICAgICAgICBhY2NlcHQgcGFyYW1ldGVycy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBkZWZpbmUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCWZpbmFsIENhdGVnb3J5IGNhdGVnb3J5LCBmaW5hbCBJUGFyYW1ldGVyW10gcGFyYW1ldGVycykgewotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0JCQkJCSJUaGUgbmFtZSBvZiBhIGNvbW1hbmQgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLQkJCQkJIlRoZSBjYXRlZ29yeSBvZiBhIGNvbW1hbmQgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZmluYWwgYm9vbGVhbiBkZWZpbmVkQ2hhbmdlZCA9ICF0aGlzLmRlZmluZWQ7Ci0JCXRoaXMuZGVmaW5lZCA9IHRydWU7Ci0KLQkJZmluYWwgYm9vbGVhbiBuYW1lQ2hhbmdlZCA9ICFVdGlsLmVxdWFscyh0aGlzLm5hbWUsIG5hbWUpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCi0JCWZpbmFsIGJvb2xlYW4gZGVzY3JpcHRpb25DaGFuZ2VkID0gIVV0aWwuZXF1YWxzKHRoaXMuZGVzY3JpcHRpb24sCi0JCQkJZGVzY3JpcHRpb24pOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0KLQkJZmluYWwgYm9vbGVhbiBjYXRlZ29yeUNoYW5nZWQgPSAhVXRpbC5lcXVhbHModGhpcy5jYXRlZ29yeSwgY2F0ZWdvcnkpOwotCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0KLQkJZmluYWwgYm9vbGVhbiBwYXJhbWV0ZXJzQ2hhbmdlZCA9ICFVdGlsLmVxdWFscyh0aGlzLnBhcmFtZXRlcnMsCi0JCQkJcGFyYW1ldGVycyk7Ci0JCXRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7Ci0KLQkJZmlyZUNvbW1hbmRDaGFuZ2VkKG5ldyBDb21tYW5kRXZlbnQodGhpcywgY2F0ZWdvcnlDaGFuZ2VkLAotCQkJCWRlZmluZWRDaGFuZ2VkLCBkZXNjcmlwdGlvbkNoYW5nZWQsIGZhbHNlLCBuYW1lQ2hhbmdlZCwKLQkJCQlwYXJhbWV0ZXJzQ2hhbmdlZCkpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoaXMgY29tbWFuZCBieSBkZWxlZ2F0aW5nIHRvIHRoZSBjdXJyZW50IGhhbmRsZXIsIGlmIGFueS4gSWYKLQkgKiB0aGUgZGVidWdnaW5nIGZsYWcgaXMgc2V0LCB0aGVuIHRoaXMgbWV0aG9kIHByaW50cyBpbmZvcm1hdGlvbiBhYm91dAotCSAqIHdoaWNoIGhhbmRsZXIgaXMgc2VsZWN0ZWQgZm9yIHBlcmZvcm1pbmcgdGhpcyBjb21tYW5kLiBUaGlzIG1ldGhvZCB3aWxsCi0JICogc3VjY2VlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgZW5hYmxlZCBvciBkZWZpbmVkLiBJdCBpcwotCSAqIGdlbmVyYWxseSBwcmVmZXJyZWQgdG8gY2FsbCB7QGxpbmsgI2V4ZWN1dGVXaXRoQ2hlY2tzKEV4ZWN1dGlvbkV2ZW50KX0uCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBBbiBldmVudCBjb250YWluaW5nIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQKLQkgKiAgICAgICAgICAgIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbjsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBleGVjdXRpb247IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcwotCSAqICAgICAgICAgcmVzdWx0IHdpbGwgYmUgYXZhaWxhYmxlIHRvIHRoZSBjbGllbnQgZXhlY3V0aW5nIHRoZSBjb21tYW5kLCBhbmQKLQkgKiAgICAgICAgIGV4ZWN1dGlvbiBsaXN0ZW5lcnMuCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgaGFuZGxlciBoYXMgcHJvYmxlbXMgZXhlY3V0aW5nIHRoaXMgY29tbWFuZC4KLQkgKiBAdGhyb3dzIE5vdEhhbmRsZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGVyZSBpcyBubyBoYW5kbGVyLgotCSAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Uge0BsaW5rICNleGVjdXRlV2l0aENoZWNrcyhFeGVjdXRpb25FdmVudCl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgZXZlbnQpCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBOb3RIYW5kbGVkRXhjZXB0aW9uIHsKLQkJZmlyZVByZUV4ZWN1dGUoZXZlbnQpOwotCQlmaW5hbCBJSGFuZGxlciBoYW5kbGVyID0gdGhpcy5oYW5kbGVyOwotCi0JCS8vIFBlcmZvcm0gdGhlIGV4ZWN1dGlvbiwgaWYgdGhlcmUgaXMgYSBoYW5kbGVyLgotCQlpZiAoKGhhbmRsZXIgIT0gbnVsbCkgJiYgKGhhbmRsZXIuaXNIYW5kbGVkKCkpKSB7Ci0JCQl0cnkgewotCQkJCWZpbmFsIE9iamVjdCByZXR1cm5WYWx1ZSA9IGhhbmRsZXIuZXhlY3V0ZShldmVudCk7Ci0JCQkJZmlyZVBvc3RFeGVjdXRlU3VjY2VzcyhyZXR1cm5WYWx1ZSk7Ci0JCQkJcmV0dXJuIHJldHVyblZhbHVlOwotCQkJfSBjYXRjaCAoZmluYWwgRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlmaXJlUG9zdEV4ZWN1dGVGYWlsdXJlKGUpOwotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQotCQlmaW5hbCBOb3RIYW5kbGVkRXhjZXB0aW9uIGUgPSBuZXcgTm90SGFuZGxlZEV4Y2VwdGlvbigKLQkJCQkiVGhlcmUgaXMgbm8gaGFuZGxlciB0byBleGVjdXRlLiIpOyAvLyROT04tTkxTLTEkCi0JCWZpcmVOb3RIYW5kbGVkKGUpOwotCQl0aHJvdyBlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoaXMgY29tbWFuZCBieSBkZWxlZ2F0aW5nIHRvIHRoZSBjdXJyZW50IGhhbmRsZXIsIGlmIGFueS4gSWYKLQkgKiB0aGUgZGVidWdnaW5nIGZsYWcgaXMgc2V0LCB0aGVuIHRoaXMgbWV0aG9kIHByaW50cyBpbmZvcm1hdGlvbiBhYm91dAotCSAqIHdoaWNoIGhhbmRsZXIgaXMgc2VsZWN0ZWQgZm9yIHBlcmZvcm1pbmcgdGhpcyBjb21tYW5kLiBUaGlzIGRvZXMgY2hlY2tzCi0JICogdG8gc2VlIGlmIHRoZSBjb21tYW5kIGlzIGVuYWJsZWQgYW5kIGRlZmluZWQuIElmIGl0IGlzIG5vdCBib3RoIGVuYWJsZWQKLQkgKiBhbmQgZGVmaW5lZCwgdGhlbiB0aGUgZXhlY3V0aW9uIGxpc3RlbmVycyB3aWxsIGJlIG5vdGlmaWVkIGFuZCBhbgotCSAqIGV4Y2VwdGlvbiB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBBbiBldmVudCBjb250YWluaW5nIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQKLQkgKiAgICAgICAgICAgIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbjsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBleGVjdXRpb247IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcwotCSAqICAgICAgICAgcmVzdWx0IHdpbGwgYmUgYXZhaWxhYmxlIHRvIHRoZSBjbGllbnQgZXhlY3V0aW5nIHRoZSBjb21tYW5kLCBhbmQKLQkgKiAgICAgICAgIGV4ZWN1dGlvbiBsaXN0ZW5lcnMuCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgaGFuZGxlciBoYXMgcHJvYmxlbXMgZXhlY3V0aW5nIHRoaXMgY29tbWFuZC4KLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgY29tbWFuZCB5b3UgYXJlIHRyeWluZyB0byBleGVjdXRlIGlzIG5vdCBkZWZpbmVkLgotCSAqIEB0aHJvd3MgTm90RW5hYmxlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBjb21tYW5kIHlvdSBhcmUgdHJ5aW5nIHRvIGV4ZWN1dGUgaXMgbm90IGVuYWJsZWQuCi0JICogQHRocm93cyBOb3RIYW5kbGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gaGFuZGxlci4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIGZpbmFsIE9iamVjdCBleGVjdXRlV2l0aENoZWNrcyhmaW5hbCBFeGVjdXRpb25FdmVudCBldmVudCkKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIE5vdERlZmluZWRFeGNlcHRpb24sCi0JCQlOb3RFbmFibGVkRXhjZXB0aW9uLCBOb3RIYW5kbGVkRXhjZXB0aW9uIHsKLQkJZmlyZVByZUV4ZWN1dGUoZXZlbnQpOwotCQlmaW5hbCBJSGFuZGxlciBoYW5kbGVyID0gdGhpcy5oYW5kbGVyOwotCi0JCWlmICghaXNEZWZpbmVkKCkpIHsKLQkJCWZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZXhjZXB0aW9uID0gbmV3IE5vdERlZmluZWRFeGNlcHRpb24oCi0JCQkJCSJUcnlpbmcgdG8gZXhlY3V0ZSBhIGNvbW1hbmQgdGhhdCBpcyBub3QgZGVmaW5lZCIpOyAvLyROT04tTkxTLTEkCi0JCQlmaXJlTm90RGVmaW5lZChleGNlcHRpb24pOwotCQkJdGhyb3cgZXhjZXB0aW9uOwotCQl9Ci0KLQkJLy8gUGVyZm9ybSB0aGUgZXhlY3V0aW9uLCBpZiB0aGVyZSBpcyBhIGhhbmRsZXIuCi0JCWlmICgoaGFuZGxlciAhPSBudWxsKSAmJiAoaGFuZGxlci5pc0hhbmRsZWQoKSkpIHsKLQkJCWlmICghaXNFbmFibGVkKCkpIHsKLQkJCQlmaW5hbCBOb3RFbmFibGVkRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG5ldyBOb3RFbmFibGVkRXhjZXB0aW9uKAotCQkJCQkJIlRyeWluZyB0byBleGVjdXRlIGEgZGlzYWJsZWQgY29tbWFuZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJZmlyZU5vdEVuYWJsZWQoZXhjZXB0aW9uKTsKLQkJCQl0aHJvdyBleGNlcHRpb247Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJZmluYWwgT2JqZWN0IHJldHVyblZhbHVlID0gaGFuZGxlci5leGVjdXRlKGV2ZW50KTsKLQkJCQlmaXJlUG9zdEV4ZWN1dGVTdWNjZXNzKHJldHVyblZhbHVlKTsKLQkJCQlyZXR1cm4gcmV0dXJuVmFsdWU7Ci0JCQl9IGNhdGNoIChmaW5hbCBFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCWZpcmVQb3N0RXhlY3V0ZUZhaWx1cmUoZSk7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJfQotCi0JCWZpbmFsIE5vdEhhbmRsZWRFeGNlcHRpb24gZSA9IG5ldyBOb3RIYW5kbGVkRXhjZXB0aW9uKAotCQkJCSJUaGVyZSBpcyBubyBoYW5kbGVyIHRvIGV4ZWN1dGUuIik7IC8vJE5PTi1OTFMtMSQKLQkJZmlyZU5vdEhhbmRsZWQoZSk7Ci0JCXRocm93IGU7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIGxpc3RlbmVycyBmb3IgdGhpcyBjb21tYW5kIHRoYXQgaXQgaGFzIGNoYW5nZWQgaW4gc29tZSB3YXkuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRFdmVudAotCSAqICAgICAgICAgICAgVGhlIGV2ZW50IHRvIHNlbmQgdG8gYWxsIG9mIHRoZSBsaXN0ZW5lcjsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBmaXJlQ29tbWFuZENoYW5nZWQoZmluYWwgQ29tbWFuZEV2ZW50IGNvbW1hbmRFdmVudCkgewotCQlpZiAoY29tbWFuZEV2ZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ2Fubm90IGZpcmUgYSBudWxsIGV2ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZpbmFsIE9iamVjdFtdIGxpc3RlbmVycyA9IGdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0JCQlsaXN0ZW5lci5jb21tYW5kQ2hhbmdlZChjb21tYW5kRXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIGV4ZWN1dGlvbiBsaXN0ZW5lcnMgZm9yIHRoaXMgY29tbWFuZCB0aGF0IGFuIGF0dGVtcHQgdG8KLQkgKiBleGVjdXRlIGhhcyBmYWlsZWQgYmVjYXVzZSB0aGUgY29tbWFuZCBpcyBub3QgZGVmaW5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIGFib3V0IHRvIGJlIHRocm93bjsgbmV2ZXIKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZmlyZU5vdERlZmluZWQoZmluYWwgTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIERlYnVnZ2luZyBvdXRwdXQKLQkJaWYgKERFQlVHX0NPTU1BTkRfRVhFQ1VUSU9OKSB7Ci0JCQlUcmFjaW5nLnByaW50VHJhY2UoIkNPTU1BTkRTIiwgImV4ZWN1dGUiICsgVHJhY2luZy5TRVBBUkFUT1IgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSsgIm5vdCBkZWZpbmVkOiBpZD0iICsgZ2V0SWQoKSArICI7IGV4Y2VwdGlvbj0iICsgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKGV4ZWN1dGlvbkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmaW5hbCBPYmplY3RbXSBsaXN0ZW5lcnMgPSBleGVjdXRpb25MaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIE9iamVjdCBvYmplY3QgPSBsaXN0ZW5lcnNbaV07Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElFeGVjdXRpb25MaXN0ZW5lcldpdGhDaGVja3MpIHsKLQkJCQkJZmluYWwgSUV4ZWN1dGlvbkxpc3RlbmVyV2l0aENoZWNrcyBsaXN0ZW5lciA9IChJRXhlY3V0aW9uTGlzdGVuZXJXaXRoQ2hlY2tzKSBvYmplY3Q7Ci0JCQkJCWxpc3RlbmVyLm5vdERlZmluZWQoZ2V0SWQoKSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIGV4ZWN1dGlvbiBsaXN0ZW5lcnMgZm9yIHRoaXMgY29tbWFuZCB0aGF0IGFuIGF0dGVtcHQgdG8KLQkgKiBleGVjdXRlIGhhcyBmYWlsZWQgYmVjYXVzZSB0aGVyZSBpcyBubyBoYW5kbGVyLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgYWJvdXQgdG8gYmUgdGhyb3duOyBuZXZlcgotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBmaXJlTm90RW5hYmxlZChmaW5hbCBOb3RFbmFibGVkRXhjZXB0aW9uIGUpIHsKLQkJLy8gRGVidWdnaW5nIG91dHB1dAotCQlpZiAoREVCVUdfQ09NTUFORF9FWEVDVVRJT04pIHsKLQkJCVRyYWNpbmcucHJpbnRUcmFjZSgiQ09NTUFORFMiLCAiZXhlY3V0ZSIgKyBUcmFjaW5nLlNFUEFSQVRPUiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyAibm90IGVuYWJsZWQ6IGlkPSIgKyBnZXRJZCgpICsgIjsgZXhjZXB0aW9uPSIgKyBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlpZiAoZXhlY3V0aW9uTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZpbmFsIE9iamVjdFtdIGxpc3RlbmVycyA9IGV4ZWN1dGlvbkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgT2JqZWN0IG9iamVjdCA9IGxpc3RlbmVyc1tpXTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUV4ZWN1dGlvbkxpc3RlbmVyV2l0aENoZWNrcykgewotCQkJCQlmaW5hbCBJRXhlY3V0aW9uTGlzdGVuZXJXaXRoQ2hlY2tzIGxpc3RlbmVyID0gKElFeGVjdXRpb25MaXN0ZW5lcldpdGhDaGVja3MpIG9iamVjdDsKLQkJCQkJbGlzdGVuZXIubm90RW5hYmxlZChnZXRJZCgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgZXhlY3V0aW9uIGxpc3RlbmVycyBmb3IgdGhpcyBjb21tYW5kIHRoYXQgYW4gYXR0ZW1wdCB0bwotCSAqIGV4ZWN1dGUgaGFzIGZhaWxlZCBiZWNhdXNlIHRoZXJlIGlzIG5vIGhhbmRsZXIuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhhdCBpcyBhYm91dCB0byBiZSB0aHJvd247IG5ldmVyCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZmlyZU5vdEhhbmRsZWQoZmluYWwgTm90SGFuZGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIERlYnVnZ2luZyBvdXRwdXQKLQkJaWYgKERFQlVHX0NPTU1BTkRfRVhFQ1VUSU9OKSB7Ci0JCQlUcmFjaW5nLnByaW50VHJhY2UoIkNPTU1BTkRTIiwgImV4ZWN1dGUiICsgVHJhY2luZy5TRVBBUkFUT1IgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSsgIm5vdCBoYW5kbGVkOiBpZD0iICsgZ2V0SWQoKSArICI7IGV4Y2VwdGlvbj0iICsgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKGV4ZWN1dGlvbkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmaW5hbCBPYmplY3RbXSBsaXN0ZW5lcnMgPSBleGVjdXRpb25MaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIElFeGVjdXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IChJRXhlY3V0aW9uTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQlsaXN0ZW5lci5ub3RIYW5kbGVkKGdldElkKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIGV4ZWN1dGlvbiBsaXN0ZW5lcnMgZm9yIHRoaXMgY29tbWFuZCB0aGF0IGFuIGF0dGVtcHQgdG8KLQkgKiBleGVjdXRlIGhhcyBmYWlsZWQgZHVyaW5nIHRoZSBleGVjdXRpb24uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhhdCBoYXMgYmVlbiB0aHJvd247IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqICAgICAgICAgICAgQWZ0ZXIgdGhpcyBtZXRob2QgY29tcGxldGVzLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCi0JICogICAgICAgICAgICBhZ2Fpbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZmlyZVBvc3RFeGVjdXRlRmFpbHVyZShmaW5hbCBFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkvLyBEZWJ1Z2dpbmcgb3V0cHV0Ci0JCWlmIChERUJVR19DT01NQU5EX0VYRUNVVElPTikgewotCQkJVHJhY2luZy5wcmludFRyYWNlKCJDT01NQU5EUyIsICJleGVjdXRlIiArIFRyYWNpbmcuU0VQQVJBVE9SIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrICJmYWlsdXJlOiBpZD0iICsgZ2V0SWQoKSArICI7IGV4Y2VwdGlvbj0iICsgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKGV4ZWN1dGlvbkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmaW5hbCBPYmplY3RbXSBsaXN0ZW5lcnMgPSBleGVjdXRpb25MaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIElFeGVjdXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IChJRXhlY3V0aW9uTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQlsaXN0ZW5lci5wb3N0RXhlY3V0ZUZhaWx1cmUoZ2V0SWQoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgZXhlY3V0aW9uIGxpc3RlbmVycyBmb3IgdGhpcyBjb21tYW5kIHRoYXQgYW4gZXhlY3V0aW9uIGhhcwotCSAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCi0JICogCi0JICogQHBhcmFtIHJldHVyblZhbHVlCi0JICogICAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGNvbW1hbmQ7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZmlyZVBvc3RFeGVjdXRlU3VjY2VzcyhmaW5hbCBPYmplY3QgcmV0dXJuVmFsdWUpIHsKLQkJLy8gRGVidWdnaW5nIG91dHB1dAotCQlpZiAoREVCVUdfQ09NTUFORF9FWEVDVVRJT04pIHsKLQkJCVRyYWNpbmcucHJpbnRUcmFjZSgiQ09NTUFORFMiLCAiZXhlY3V0ZSIgKyBUcmFjaW5nLlNFUEFSQVRPUiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyAic3VjY2VzczogaWQ9IiArIGdldElkKCkgKyAiOyByZXR1cm5WYWx1ZT0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIHJldHVyblZhbHVlKTsKLQkJfQotCi0JCWlmIChleGVjdXRpb25MaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZmluYWwgT2JqZWN0W10gbGlzdGVuZXJzID0gZXhlY3V0aW9uTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5hbCBJRXhlY3V0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUV4ZWN1dGlvbkxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0JCQkJbGlzdGVuZXIucG9zdEV4ZWN1dGVTdWNjZXNzKGdldElkKCksIHJldHVyblZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBleGVjdXRpb24gbGlzdGVuZXJzIGZvciB0aGlzIGNvbW1hbmQgdGhhdCBhbiBhdHRlbXB0IHRvCi0JICogZXhlY3V0ZSBpcyBhYm91dCB0byBzdGFydC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBleGVjdXRpb24gZXZlbnQgdGhhdCB3aWxsIGJlIHVzZWQ7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBmaXJlUHJlRXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBldmVudCkgewotCQkvLyBEZWJ1Z2dpbmcgb3V0cHV0Ci0JCWlmIChERUJVR19DT01NQU5EX0VYRUNVVElPTikgewotCQkJVHJhY2luZy5wcmludFRyYWNlKCJDT01NQU5EUyIsICJleGVjdXRlIiArIFRyYWNpbmcuU0VQQVJBVE9SIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrICJzdGFydGluZzogaWQ9IiArIGdldElkKCkgKyAiOyBldmVudD0iICsgZXZlbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmIChleGVjdXRpb25MaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZmluYWwgT2JqZWN0W10gbGlzdGVuZXJzID0gZXhlY3V0aW9uTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5hbCBJRXhlY3V0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUV4ZWN1dGlvbkxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0JCQkJbGlzdGVuZXIucHJlRXhlY3V0ZShnZXRJZCgpLCBldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYXRlZ29yeSBmb3IgdGhpcyBjb21tYW5kLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNhdGVnb3J5IGZvciB0aGlzIGNvbW1hbmQ7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBoYW5kbGUgaXMgbm90IGN1cnJlbnRseSBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBDYXRlZ29yeSBnZXRDYXRlZ29yeSgpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RlZmluZWQoKSkgewotCQkJdGhyb3cgbmV3IE5vdERlZmluZWRFeGNlcHRpb24oCi0JCQkJCSJDYW5ub3QgZ2V0IHRoZSBjYXRlZ29yeSBmcm9tIGFuIHVuZGVmaW5lZCBjb21tYW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgd2l0aCB0aGUgcHJvdmlkZWQgaWQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcwotCSAqIGNvbW1hbmQgZG9lcyBub3QgaGF2ZSBhIHBhcmFtZXRlciB3aXRoIHRoZSBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyYW1ldGVySWQKLQkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgcGFyYW1ldGVyIHRvIHJldHJpZXZlLgotCSAqIEByZXR1cm4gVGhlIHBhcmFtZXRlciB3aXRoIHRoZSBwcm92aWRlZCBpZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzCi0JICogICAgICAgICBjb21tYW5kIGRvZXMgbm90IGhhdmUgYSBwYXJhbWV0ZXIgd2l0aCB0aGUgaWQuCi0JICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIGhhbmRsZSBpcyBub3QgY3VycmVudGx5IGRlZmluZWQuCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBmaW5hbCBJUGFyYW1ldGVyIGdldFBhcmFtZXRlcihmaW5hbCBTdHJpbmcgcGFyYW1ldGVySWQpCi0JCQl0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEZWZpbmVkKCkpIHsKLQkJCXRocm93IG5ldyBOb3REZWZpbmVkRXhjZXB0aW9uKAotCQkJCQkiQ2Fubm90IGdldCBhIHBhcmFtZXRlciBmcm9tIGFuIHVuZGVmaW5lZCBjb21tYW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBJUGFyYW1ldGVyIHBhcmFtZXRlciA9IHBhcmFtZXRlcnNbaV07Ci0JCQlpZiAocGFyYW1ldGVyLmdldElkKCkuZXF1YWxzKHBhcmFtZXRlcklkKSkgewotCQkJCXJldHVybiBwYXJhbWV0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGNvbW1hbmQuIFRoaXMgY2FsbCB0cmlnZ2VycyBwcm92aWRlcyBhCi0JICogY29weSBvZiB0aGUgYXJyYXksIHNvIGV4Y2Vzc2l2ZSBjYWxscyB0byB0aGlzIG1ldGhvZCBzaG91bGQgYmUgYXZvaWRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGNvbW1hbmQuIFRoaXMgdmFsdWUgbWlnaHQgYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpZiB0aGUgY29tbWFuZCBoYXMgbm8gcGFyYW1ldGVycy4KLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgaGFuZGxlIGlzIG5vdCBjdXJyZW50bHkgZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSVBhcmFtZXRlcltdIGdldFBhcmFtZXRlcnMoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEZWZpbmVkKCkpIHsKLQkJCXRocm93IG5ldyBOb3REZWZpbmVkRXhjZXB0aW9uKAotCQkJCQkiQ2Fubm90IGdldCB0aGUgcGFyYW1ldGVycyBmcm9tIGFuIHVuZGVmaW5lZCBjb21tYW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmICgocGFyYW1ldGVycyA9PSBudWxsKSB8fCAocGFyYW1ldGVycy5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZmluYWwgSVBhcmFtZXRlcltdIHJldHVyblZhbHVlID0gbmV3IElQYXJhbWV0ZXJbcGFyYW1ldGVycy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlcnMsIDAsIHJldHVyblZhbHVlLCAwLCBwYXJhbWV0ZXJzLmxlbmd0aCk7Ci0JCXJldHVybiByZXR1cm5WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUGFyYW1ldGVyVHlwZX0gZm9yIHRoZSBwYXJhbWV0ZXIgd2l0aCB0aGUgcHJvdmlkZWQgaWQKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGNvbW1hbmQgZG9lcyBub3QgaGF2ZSBhIHBhcmFtZXRlciB0eXBlCi0JICogd2l0aCB0aGUgaWQuCi0JICogCi0JICogQHBhcmFtIHBhcmFtZXRlcklkCi0JICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHBhcmFtZXRlciB0byByZXRyaWV2ZSB0aGUge0BsaW5rIFBhcmFtZXRlclR5cGV9Ci0JICogICAgICAgICAgICBvZi4KLQkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUGFyYW1ldGVyVHlwZX0gZm9yIHRoZSBwYXJhbWV0ZXIgd2l0aCB0aGUgcHJvdmlkZWQgaWQKLQkgKiAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgY29tbWFuZCBkb2VzIG5vdCBoYXZlIGEgcGFyYW1ldGVyCi0JICogICAgICAgICB0eXBlIHdpdGggdGhlIHByb3ZpZGVkIGlkLgotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBoYW5kbGUgaXMgbm90IGN1cnJlbnRseSBkZWZpbmVkLgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgZmluYWwgUGFyYW1ldGVyVHlwZSBnZXRQYXJhbWV0ZXJUeXBlKGZpbmFsIFN0cmluZyBwYXJhbWV0ZXJJZCkKLQkJCXRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJZmluYWwgSVBhcmFtZXRlciBwYXJhbWV0ZXIgPSBnZXRQYXJhbWV0ZXIocGFyYW1ldGVySWQpOwotCQlpZiAocGFyYW1ldGVyIGluc3RhbmNlb2YgSVR5cGVkUGFyYW1ldGVyKSB7Ci0JCQlmaW5hbCBJVHlwZWRQYXJhbWV0ZXIgcGFyYW1ldGVyV2l0aFR5cGUgPSAoSVR5cGVkUGFyYW1ldGVyKSBwYXJhbWV0ZXI7Ci0JCQlyZXR1cm4gcGFyYW1ldGVyV2l0aFR5cGUuZ2V0UGFyYW1ldGVyVHlwZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbW1hbmQgaGFzIGEgaGFuZGxlciwgYW5kIHdoZXRoZXIgdGhpcyBoYW5kbGVyIGlzCi0JICogYWxzbyBoYW5kbGVkIGFuZCBlbmFibGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbW1hbmQgaXMgaGFuZGxlZDsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gaGFuZGxlci5pc0hhbmRsZWQoKSAmJiBoYW5kbGVyLmlzRW5hYmxlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbW1hbmQgaGFzIGEgaGFuZGxlciwgYW5kIHdoZXRoZXIgdGhpcyBoYW5kbGVyIGlzCi0JICogYWxzbyBoYW5kbGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbW1hbmQgaXMgaGFuZGxlZDsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNIYW5kbGVkKCkgewotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBoYW5kbGVyLmlzSGFuZGxlZCgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoaXMgY29tbWFuZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZExpc3RlbmVyCi0JICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQ29tbWFuZExpc3RlbmVyKAotCQkJZmluYWwgSUNvbW1hbmRMaXN0ZW5lciBjb21tYW5kTGlzdGVuZXIpIHsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0JCQkJCSJDYW5ub3QgcmVtb3ZlIGEgbnVsbCBjb21tYW5kIGxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJlbW92ZUxpc3RlbmVyT2JqZWN0KGNvbW1hbmRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhpcyBjb21tYW5kLgotCSAqIAotCSAqIEBwYXJhbSBleGVjdXRpb25MaXN0ZW5lcgotCSAqICAgICAgICAgICAgVGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUV4ZWN1dGlvbkxpc3RlbmVyKAotCQkJZmluYWwgSUV4ZWN1dGlvbkxpc3RlbmVyIGV4ZWN1dGlvbkxpc3RlbmVyKSB7Ci0JCWlmIChleGVjdXRpb25MaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0JCQkJCSJDYW5ub3QgcmVtb3ZlIGEgbnVsbCBleGVjdXRpb24gbGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGV4ZWN1dGlvbkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlleGVjdXRpb25MaXN0ZW5lcnMucmVtb3ZlKGV4ZWN1dGlvbkxpc3RlbmVyKTsKLQkJCWlmIChleGVjdXRpb25MaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQkJZXhlY3V0aW9uTGlzdGVuZXJzID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZXMgYSBzdGF0ZSBmcm9tIHRoaXMgY29tbWFuZC4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgc3RhdGUgZnJvbSB0aGUKLQkgKiBhY3RpdmUgaGFuZGxlciwgaWYgdGhlIGFjdGl2ZSBoYW5kbGVyIGlzIGFuIGluc3RhbmNlIG9mCi0JICoge0BsaW5rIElPYmplY3RXaXRoU3RhdGV9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdGVJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRlIHRvIHJlbW92ZTsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVN0YXRlKGZpbmFsIFN0cmluZyBzdGF0ZUlkKSB7Ci0JCWlmIChoYW5kbGVyIGluc3RhbmNlb2YgSU9iamVjdFdpdGhTdGF0ZSkgewotCQkJKChJT2JqZWN0V2l0aFN0YXRlKSBoYW5kbGVyKS5yZW1vdmVTdGF0ZShzdGF0ZUlkKTsKLQkJfQotCQlzdXBlci5yZW1vdmVTdGF0ZShzdGF0ZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBoYW5kbGVyIGZvciB0aGlzIGNvbW1hbmQuIFRoaXMgd2lsbCByZW1vdmUgYWxsIHRoZSBzdGF0ZSBmcm9tCi0JICogdGhlIGN1cnJlbnRseSBhY3RpdmUgaGFuZGxlciAoaWYgYW55KSwgYW5kIGFkZCBpdCB0byA8Y29kZT5oYW5kbGVyPC9jb2RlPi4KLQkgKiBJZiBkZWJ1Z2dpbmcgaXMgdHVybmVkIG9uLCB0aGVuIHRoaXMgd2lsbCBhbHNvIHByaW50IGluZm9ybWF0aW9uIGFib3V0Ci0JICogdGhlIGNoYW5nZSB0byA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqICAgICAgICAgICAgVGhlIG5ldyBoYW5kbGVyOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBoYW5kbGVyIGNoYW5nZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNldEhhbmRsZXIoZmluYWwgSUhhbmRsZXIgaGFuZGxlcikgewotCQlpZiAoVXRpbC5lcXVhbHMoaGFuZGxlciwgdGhpcy5oYW5kbGVyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gU3dhcCB0aGUgc3RhdGUgYXJvdW5kLgotCQlmaW5hbCBTdHJpbmdbXSBzdGF0ZUlkcyA9IGdldFN0YXRlSWRzKCk7Ci0JCWlmIChzdGF0ZUlkcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgU3RyaW5nIHN0YXRlSWQgPSBzdGF0ZUlkc1tpXTsKLQkJCQlpZiAodGhpcy5oYW5kbGVyIGluc3RhbmNlb2YgSU9iamVjdFdpdGhTdGF0ZSkgewotCQkJCQkoKElPYmplY3RXaXRoU3RhdGUpIHRoaXMuaGFuZGxlcikucmVtb3ZlU3RhdGUoc3RhdGVJZCk7Ci0JCQkJfQotCQkJCWlmIChoYW5kbGVyIGluc3RhbmNlb2YgSU9iamVjdFdpdGhTdGF0ZSkgewotCQkJCQlmaW5hbCBJU3RhdGUgc3RhdGVUb0FkZCA9IGdldFN0YXRlKHN0YXRlSWQpOwotCQkJCQkoKElPYmplY3RXaXRoU3RhdGUpIGhhbmRsZXIpLmFkZFN0YXRlKHN0YXRlSWQsIHN0YXRlVG9BZGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFVwZGF0ZSB0aGUgaGFuZGxlciwgYW5kIGZsdXNoIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JCXRoaXMuaGFuZGxlciA9IGhhbmRsZXI7Ci0JCXN0cmluZyA9IG51bGw7Ci0KLQkJLy8gRGVidWdnaW5nIG91dHB1dAotCQlpZiAoKERFQlVHX0hBTkRMRVJTKQotCQkJCSYmICgoREVCVUdfSEFORExFUlNfQ09NTUFORF9JRCA9PSBudWxsKSB8fCAoREVCVUdfSEFORExFUlNfQ09NTUFORF9JRAotCQkJCQkJLmVxdWFscyhpZCkpKSkgewotCQkJZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkNvbW1hbmQoJyIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKGlkKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIicpIGhhcyBjaGFuZ2VkIHRvICIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgibm8gaGFuZGxlciIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCWJ1ZmZlci5hcHBlbmQoJ1wnJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChoYW5kbGVyKTsKLQkJCQlidWZmZXIuYXBwZW5kKCInIGFzIGl0cyBoYW5kbGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVRyYWNpbmcucHJpbnRUcmFjZSgiSEFORExFUlMiLCBidWZmZXIudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIFNlbmQgbm90aWZpY2F0aW9uCi0JCWZpcmVDb21tYW5kQ2hhbmdlZChuZXcgQ29tbWFuZEV2ZW50KHRoaXMsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsCi0JCQkJZmFsc2UsIGZhbHNlKSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbW1hbmQgLS0gZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgotCSAqIFRoaXMgc3RyaW5nIHNob3VsZCBub3QgYmUgc2hvd24gdG8gYW4gZW5kIHVzZXIuCi0JICogCi0JICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCJDb21tYW5kKCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGlkKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJywnKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJywnKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoY2F0ZWdvcnkpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnLCcpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChoYW5kbGVyKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJywnKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQocGFyYW1ldGVycyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGRlZmluZWQpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnKScpOwotCQkJc3RyaW5nID0gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlcyB0aGlzIGNvbW1hbmQgYmVjb21lIHVuZGVmaW5lZC4gVGhpcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNoYW5naW5nCi0JICogdGhlIG5hbWUgYW5kIGRlc2NyaXB0aW9uIHRvIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGFsc28gcmVtb3ZlcyBhbGwKLQkgKiBzdGF0ZSBhbmQgZGlzcG9zZXMgb2YgaXQuIE5vdGlmaWNhdGlvbiBpcyBzZW50IHRvIGFsbCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdW5kZWZpbmUoKSB7Ci0JCXN0cmluZyA9IG51bGw7Ci0KLQkJZmluYWwgYm9vbGVhbiBkZWZpbmVkQ2hhbmdlZCA9IGRlZmluZWQ7Ci0JCWRlZmluZWQgPSBmYWxzZTsKLQotCQlmaW5hbCBib29sZWFuIG5hbWVDaGFuZ2VkID0gbmFtZSAhPSBudWxsOwotCQluYW1lID0gbnVsbDsKLQotCQlmaW5hbCBib29sZWFuIGRlc2NyaXB0aW9uQ2hhbmdlZCA9IGRlc2NyaXB0aW9uICE9IG51bGw7Ci0JCWRlc2NyaXB0aW9uID0gbnVsbDsKLQotCQlmaW5hbCBib29sZWFuIGNhdGVnb3J5Q2hhbmdlZCA9IGNhdGVnb3J5ICE9IG51bGw7Ci0JCWNhdGVnb3J5ID0gbnVsbDsKLQotCQlmaW5hbCBib29sZWFuIHBhcmFtZXRlcnNDaGFuZ2VkID0gcGFyYW1ldGVycyAhPSBudWxsOwotCQlwYXJhbWV0ZXJzID0gbnVsbDsKLQotCQlmaW5hbCBTdHJpbmdbXSBzdGF0ZUlkcyA9IGdldFN0YXRlSWRzKCk7Ci0JCWlmIChzdGF0ZUlkcyAhPSBudWxsKSB7Ci0JCQlpZiAoaGFuZGxlciBpbnN0YW5jZW9mIElPYmplY3RXaXRoU3RhdGUpIHsKLQkJCQlmaW5hbCBJT2JqZWN0V2l0aFN0YXRlIGhhbmRsZXJXaXRoU3RhdGUgPSAoSU9iamVjdFdpdGhTdGF0ZSkgaGFuZGxlcjsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZpbmFsIFN0cmluZyBzdGF0ZUlkID0gc3RhdGVJZHNbaV07Ci0JCQkJCWhhbmRsZXJXaXRoU3RhdGUucmVtb3ZlU3RhdGUoc3RhdGVJZCk7Ci0KLQkJCQkJZmluYWwgSVN0YXRlIHN0YXRlID0gZ2V0U3RhdGUoc3RhdGVJZCk7Ci0JCQkJCXJlbW92ZVN0YXRlKHN0YXRlSWQpOwotCQkJCQlzdGF0ZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZpbmFsIFN0cmluZyBzdGF0ZUlkID0gc3RhdGVJZHNbaV07Ci0JCQkJCWZpbmFsIElTdGF0ZSBzdGF0ZSA9IGdldFN0YXRlKHN0YXRlSWQpOwotCQkJCQlyZW1vdmVTdGF0ZShzdGF0ZUlkKTsKLQkJCQkJc3RhdGUuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZpcmVDb21tYW5kQ2hhbmdlZChuZXcgQ29tbWFuZEV2ZW50KHRoaXMsIGNhdGVnb3J5Q2hhbmdlZCwKLQkJCQlkZWZpbmVkQ2hhbmdlZCwgZGVzY3JpcHRpb25DaGFuZ2VkLCBmYWxzZSwgbmFtZUNoYW5nZWQsCi0JCQkJcGFyYW1ldGVyc0NoYW5nZWQpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvQ29tbWFuZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvQ29tbWFuZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYWQ1ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0NvbW1hbmRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5BYnN0cmFjdE5hbWVkSGFuZGxlRXZlbnQ7Ci0KLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBkZXNjcmliZXMgY2hhbmdlcyB0byBhbiBpbnN0YW5jZSBvZgotICogPGNvZGU+Q29tbWFuZDwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIEBzZWUgSUNvbW1hbmRMaXN0ZW5lciNjb21tYW5kQ2hhbmdlZChDb21tYW5kRXZlbnQpCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tYW5kRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdE5hbWVkSGFuZGxlRXZlbnQgewotCi0JLyoqCi0JICogVGhlIGJpdCB1c2VkIHRvIHJlcHJlc2VudCB3aGV0aGVyIHRoZSBjb21tYW5kIGhhcyBjaGFuZ2VkIGl0cyBjYXRlZ29yeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRF9DQVRFR09SWSA9IExBU1RfVVNFRF9CSVQgPDwgMTsKLQotCS8qKgotCSAqIFRoZSBiaXQgdXNlZCB0byByZXByZXNlbnQgd2hldGhlciB0aGUgY29tbWFuZCBoYXMgY2hhbmdlZCBpdHMgaGFuZGxlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRF9IQU5ETEVEID0gTEFTVF9VU0VEX0JJVCA8PCAyOwotCi0JLyoqCi0JICogVGhlIGJpdCB1c2VkIHRvIHJlcHJlc2VudCB3aGV0aGVyIHRoZSBjb21tYW5kIGhhcyBjaGFuZ2VkIGl0cyBwYXJhbWV0ZXJzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEX1BBUkFNRVRFUlMgPSBMQVNUX1VTRURfQklUIDw8IDM7Ci0KLQkvKioKLQkgKiBUaGUgY29tbWFuZCB0aGF0IGhhcyBjaGFuZ2VkOyB0aGlzIHZhbHVlIGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29tbWFuZCBjb21tYW5kOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0aGF0IGNoYW5nZWQuCi0JICogQHBhcmFtIGNhdGVnb3J5Q2hhbmdlZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmZiB0aGUgY2F0ZWdvcnkgcHJvcGVydHkgY2hhbmdlZC4KLQkgKiBAcGFyYW0gZGVmaW5lZENoYW5nZWQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+LCBpZmYgdGhlIGRlZmluZWQgcHJvcGVydHkgY2hhbmdlZC4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb25DaGFuZ2VkCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiwgaWZmIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqIEBwYXJhbSBoYW5kbGVkQ2hhbmdlZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmZiB0aGUgaGFuZGxlZCBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqIEBwYXJhbSBuYW1lQ2hhbmdlZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmZiB0aGUgbmFtZSBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqIEBwYXJhbSBwYXJhbWV0ZXJzQ2hhbmdlZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkOwotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZEV2ZW50KGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgYm9vbGVhbiBjYXRlZ29yeUNoYW5nZWQsCi0JCQlmaW5hbCBib29sZWFuIGRlZmluZWRDaGFuZ2VkLCBmaW5hbCBib29sZWFuIGRlc2NyaXB0aW9uQ2hhbmdlZCwKLQkJCWZpbmFsIGJvb2xlYW4gaGFuZGxlZENoYW5nZWQsIGZpbmFsIGJvb2xlYW4gbmFtZUNoYW5nZWQsCi0JCQlmaW5hbCBib29sZWFuIHBhcmFtZXRlcnNDaGFuZ2VkKSB7Ci0JCXN1cGVyKGRlZmluZWRDaGFuZ2VkLCBkZXNjcmlwdGlvbkNoYW5nZWQsIG5hbWVDaGFuZ2VkKTsKLQotCQlpZiAoY29tbWFuZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0KLQkJaWYgKGNhdGVnb3J5Q2hhbmdlZCkgewotCQkJY2hhbmdlZFZhbHVlcyB8PSBDSEFOR0VEX0NBVEVHT1JZOwotCQl9Ci0JCWlmIChoYW5kbGVkQ2hhbmdlZCkgewotCQkJY2hhbmdlZFZhbHVlcyB8PSBDSEFOR0VEX0hBTkRMRUQ7Ci0JCX0KLQkJaWYgKHBhcmFtZXRlcnNDaGFuZ2VkKSB7Ci0JCQljaGFuZ2VkVmFsdWVzIHw9IENIQU5HRURfUEFSQU1FVEVSUzsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBjaGFuZ2VkLiBHdWFyYW50ZWVkIG5vdCB0byBiZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIENvbW1hbmQgZ2V0Q29tbWFuZCgpIHsKLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgY2F0ZWdvcnkgcHJvcGVydHkgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LCBpZmYgdGhlIGNhdGVnb3J5IHByb3BlcnR5IGNoYW5nZWQuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXRlZ29yeUNoYW5nZWQoKSB7Ci0JCXJldHVybiAoKGNoYW5nZWRWYWx1ZXMgJiBDSEFOR0VEX0NBVEVHT1JZKSAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBoYW5kbGVkIHByb3BlcnR5IGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiwgaWZmIHRoZSBoYW5kbGVkIHByb3BlcnR5IGNoYW5nZWQuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNIYW5kbGVkQ2hhbmdlZCgpIHsKLQkJcmV0dXJuICgoY2hhbmdlZFZhbHVlcyAmIENIQU5HRURfSEFORExFRCkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiwgaWZmIHRoZSBwYXJhbWV0ZXJzIHByb3BlcnR5IGNoYW5nZWQuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQYXJhbWV0ZXJzQ2hhbmdlZCgpIHsKLQkJcmV0dXJuICgoY2hhbmdlZFZhbHVlcyAmIENIQU5HRURfUEFSQU1FVEVSUykgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0NvbW1hbmRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvQ29tbWFuZE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxYjQ0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvQ29tbWFuZE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5IYW5kbGVPYmplY3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLQotLyoqCi0gKiA8cD4KLSAqIEEgY2VudHJhbCByZXBvc2l0b3J5IGZvciBjb21tYW5kcyAtLSBib3RoIGluIHRoZSBkZWZpbmVkIGFuZCB1bmRlZmluZWQKLSAqIHN0YXRlcy4gQ29tbWFuZHMgY2FuIGJlIGNyZWF0ZWQgYW5kIHJldHJpZXZlZCB1c2luZyB0aGlzIG1hbmFnZXIuIEl0IGlzCi0gKiBwb3NzaWJsZSB0byBsaXN0ZW4gdG8gY2hhbmdlcyBpbiB0aGUgY29sbGVjdGlvbiBvZiBjb21tYW5kcyBieSBhdHRhY2hpbmcgYQotICogbGlzdGVuZXIgdG8gdGhlIG1hbmFnZXIuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgQ29tbWFuZE1hbmFnZXIjZ2V0Q29tbWFuZChTdHJpbmcpCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tYW5kTWFuYWdlciBleHRlbmRzIEhhbmRsZU9iamVjdE1hbmFnZXIgaW1wbGVtZW50cwotCQlJQ2F0ZWdvcnlMaXN0ZW5lciwgSUNvbW1hbmRMaXN0ZW5lciwgSVBhcmFtZXRlclR5cGVMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgaW5jb21pbmcgZXhlY3V0aW9uIGV2ZW50cyB0byBleGVjdXRpb24gbGlzdGVuZXJzCi0JICogb24gdGhpcyBtYW5hZ2VyLiBUaGUgZXhlY3V0aW9uIGV2ZW50cyB3aWxsIGNvbWUgZnJvbSBhbnkgY29tbWFuZCBvbiB0aGlzCi0JICogbWFuYWdlci4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBFeGVjdXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzCi0JCQlJRXhlY3V0aW9uTGlzdGVuZXJXaXRoQ2hlY2tzIHsKLQotCQlwdWJsaWMgdm9pZCBub3REZWZpbmVkKFN0cmluZyBjb21tYW5kSWQsIE5vdERlZmluZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlpZiAoZXhlY3V0aW9uTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlmaW5hbCBPYmplY3RbXSBsaXN0ZW5lcnMgPSBleGVjdXRpb25MaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZmluYWwgT2JqZWN0IG9iamVjdCA9IGxpc3RlbmVyc1tpXTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElFeGVjdXRpb25MaXN0ZW5lcldpdGhDaGVja3MpIHsKLQkJCQkJCWZpbmFsIElFeGVjdXRpb25MaXN0ZW5lcldpdGhDaGVja3MgbGlzdGVuZXIgPSAoSUV4ZWN1dGlvbkxpc3RlbmVyV2l0aENoZWNrcykgb2JqZWN0OwotCQkJCQkJbGlzdGVuZXIubm90RGVmaW5lZChjb21tYW5kSWQsIGV4Y2VwdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub3RFbmFibGVkKFN0cmluZyBjb21tYW5kSWQsIE5vdEVuYWJsZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlpZiAoZXhlY3V0aW9uTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlmaW5hbCBPYmplY3RbXSBsaXN0ZW5lcnMgPSBleGVjdXRpb25MaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZmluYWwgT2JqZWN0IG9iamVjdCA9IGxpc3RlbmVyc1tpXTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElFeGVjdXRpb25MaXN0ZW5lcldpdGhDaGVja3MpIHsKLQkJCQkJCWZpbmFsIElFeGVjdXRpb25MaXN0ZW5lcldpdGhDaGVja3MgbGlzdGVuZXIgPSAoSUV4ZWN1dGlvbkxpc3RlbmVyV2l0aENoZWNrcykgb2JqZWN0OwotCQkJCQkJbGlzdGVuZXIubm90RW5hYmxlZChjb21tYW5kSWQsIGV4Y2VwdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgZmluYWwgdm9pZCBub3RIYW5kbGVkKGZpbmFsIFN0cmluZyBjb21tYW5kSWQsCi0JCQkJZmluYWwgTm90SGFuZGxlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWlmIChleGVjdXRpb25MaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWZpbmFsIE9iamVjdFtdIGxpc3RlbmVycyA9IGV4ZWN1dGlvbkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQlmaW5hbCBPYmplY3Qgb2JqZWN0ID0gbGlzdGVuZXJzW2ldOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUV4ZWN1dGlvbkxpc3RlbmVyKSB7Ci0JCQkJCQlmaW5hbCBJRXhlY3V0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUV4ZWN1dGlvbkxpc3RlbmVyKSBvYmplY3Q7Ci0JCQkJCQlsaXN0ZW5lci5ub3RIYW5kbGVkKGNvbW1hbmRJZCwgZXhjZXB0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBmaW5hbCB2b2lkIHBvc3RFeGVjdXRlRmFpbHVyZShmaW5hbCBTdHJpbmcgY29tbWFuZElkLAotCQkJCWZpbmFsIEV4ZWN1dGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWlmIChleGVjdXRpb25MaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWZpbmFsIE9iamVjdFtdIGxpc3RlbmVycyA9IGV4ZWN1dGlvbkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQlmaW5hbCBPYmplY3Qgb2JqZWN0ID0gbGlzdGVuZXJzW2ldOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUV4ZWN1dGlvbkxpc3RlbmVyKSB7Ci0JCQkJCQlmaW5hbCBJRXhlY3V0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUV4ZWN1dGlvbkxpc3RlbmVyKSBvYmplY3Q7Ci0JCQkJCQlsaXN0ZW5lci5wb3N0RXhlY3V0ZUZhaWx1cmUoY29tbWFuZElkLCBleGNlcHRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIGZpbmFsIHZvaWQgcG9zdEV4ZWN1dGVTdWNjZXNzKGZpbmFsIFN0cmluZyBjb21tYW5kSWQsCi0JCQkJZmluYWwgT2JqZWN0IHJldHVyblZhbHVlKSB7Ci0JCQlpZiAoZXhlY3V0aW9uTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlmaW5hbCBPYmplY3RbXSBsaXN0ZW5lcnMgPSBleGVjdXRpb25MaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZmluYWwgT2JqZWN0IG9iamVjdCA9IGxpc3RlbmVyc1tpXTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElFeGVjdXRpb25MaXN0ZW5lcikgewotCQkJCQkJZmluYWwgSUV4ZWN1dGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKElFeGVjdXRpb25MaXN0ZW5lcikgb2JqZWN0OwotCQkJCQkJbGlzdGVuZXIucG9zdEV4ZWN1dGVTdWNjZXNzKGNvbW1hbmRJZCwgcmV0dXJuVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIGZpbmFsIHZvaWQgcHJlRXhlY3V0ZShmaW5hbCBTdHJpbmcgY29tbWFuZElkLAotCQkJCWZpbmFsIEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXhlY3V0aW9uTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlmaW5hbCBPYmplY3RbXSBsaXN0ZW5lcnMgPSBleGVjdXRpb25MaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZmluYWwgT2JqZWN0IG9iamVjdCA9IGxpc3RlbmVyc1tpXTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElFeGVjdXRpb25MaXN0ZW5lcikgewotCQkJCQkJZmluYWwgSUV4ZWN1dGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKElFeGVjdXRpb25MaXN0ZW5lcikgb2JqZWN0OwotCQkJCQkJbGlzdGVuZXIucHJlRXhlY3V0ZShjb21tYW5kSWQsIGV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjYXRlZ29yeSBpbiB3aGljaCBhbGwgYXV0by1nZW5lcmF0ZWQgY29tbWFuZHMgd2lsbAotCSAqIGFwcGVhci4gVGhpcyB2YWx1ZSBtdXN0IG5ldmVyIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9HRU5FUkFURURfQ0FURUdPUllfSUQgPSAib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jYXRlZ29yaWVzLmF1dG9nZW5lcmF0ZWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXNjYXBlIGNoYXJhY3RlciB0byB1c2UgZm9yIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbiBvZgotCSAqIHBhcmFtZXRlcml6ZWQgY29tbWFuZHMuCi0JICovCi0Jc3RhdGljIGZpbmFsIGNoYXIgRVNDQVBFX0NIQVIgPSAnJSc7Ci0KLQkvKioKLQkgKiBUaGUgY2hhcmFjdGVyIHRoYXQgc2VwYXJhdGVzIGEgcGFyYW1ldGVyIGlkIGZyb20gaXRzIHZhbHVlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBjaGFyIElEX1ZBTFVFX0NIQVIgPSAnPSc7Ci0KLQkvKioKLQkgKiBUaGUgY2hhcmFjdGVyIHRoYXQgaW5kaWNhdGVzIHRoZSBlbmQgb2YgYSBsaXN0IG9mIHBhcmFtZXRlcnMuCi0JICovCi0Jc3RhdGljIGZpbmFsIGNoYXIgUEFSQU1FVEVSX0VORF9DSEFSID0gJyknOwotCi0JLyoqCi0JICogVGhlIGNoYXJhY3RlciB0aGF0IHNlcGFyYXRvcnMgcGFyYW1ldGVycyBmcm9tIGVhY2ggb3RoZXIuCi0JICovCi0Jc3RhdGljIGZpbmFsIGNoYXIgUEFSQU1FVEVSX1NFUEFSQVRPUl9DSEFSID0gJywnOwotCi0JLyoqCi0JICogVGhlIGNoYXJhY3RlciB0aGF0IGluZGljYXRlcyB0aGUgc3RhcnQgb2YgYSBsaXN0IG9mIHBhcmFtZXRlcnMuCi0JICovCi0Jc3RhdGljIGZpbmFsIGNoYXIgUEFSQU1FVEVSX1NUQVJUX0NIQVIgPSAnKCc7Ci0KLQkvKioKLQkgKiBVbmVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBjb21tYW5kIGlkLCBwYXJhbWV0ZXIgaWRzIGFuZAotCSAqIHBhcmFtZXRlciB2YWx1ZXMgZm9yIHtAbGluayAjZGVzZXJpYWxpemUoKX0uIFRoZSBzcGVjaWFsIGNoYXJhY3RlcnMKLQkgKiB7QGxpbmsgI1BBUkFNRVRFUl9TVEFSVF9DSEFSfSwge0BsaW5rICNQQVJBTUVURVJfRU5EX0NIQVJ9LAotCSAqIHtAbGluayAjSURfVkFMVUVfQ0hBUn0sIHtAbGluayAjUEFSQU1FVEVSX1NFUEFSQVRPUl9DSEFSfSBhbmQKLQkgKiB7QGxpbmsgI0VTQ0FQRV9DSEFSfSBhcmUgZXNjYXBlZCBieSBwcmVwZW5kaW5nIGFuIHtAbGluayAjRVNDQVBFX0NIQVJ9Ci0JICogY2hhcmFjdGVyLgotCSAqIAotCSAqIEBwYXJhbSBlc2NhcGVkVGV4dAotCSAqICAgICAgICAgICAgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoYXQgbWF5IGNvbnRhaW4gZXNjYXBlZCBzcGVjaWFsCi0JICogICAgICAgICAgICBjaGFyYWN0ZXJzIGZvciBjb21tYW5kIHNlcmlhbGl6YXRpb24uCi0JICogQHJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50aW5nIDxjb2RlPmVzY2FwZWRUZXh0PC9jb2RlPgotCSAqICAgICAgICAgd2l0aCBhbnkgZXNjYXBlZCBjaGFyYWN0ZXJzIHJlcGxhY2VkIGJ5IHRoZWlyIGxpdGVyYWwgdmFsdWVzCi0JICogQHRocm93cyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgPGNvZGU+ZXNjYXBlZFRleHQ8L2NvZGU+IGNvbnRhaW5zIGFuIGludmFsaWQgZXNjYXBlCi0JICogICAgICAgICAgICAgc2VxdWVuY2UKLQkgKiBAc2VlIFBhcmFtZXRlcml6ZWRDb21tYW5kI2VzY2FwZShTdHJpbmcpCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB1bmVzY2FwZShmaW5hbCBTdHJpbmcgZXNjYXBlZFRleHQpCi0JCQl0aHJvd3MgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbiB7Ci0KLQkJLy8gZGVmZXIgaW5pdGlhbGl6YXRpb24gb2YgYSBTdHJpbmdCdWZmZXIgdW50aWwgd2Uga25vdyB3ZSBuZWVkIG9uZQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVzY2FwZWRUZXh0Lmxlbmd0aCgpOyBpKyspIHsKLQotCQkJY2hhciBjID0gZXNjYXBlZFRleHQuY2hhckF0KGkpOwotCQkJaWYgKGMgIT0gRVNDQVBFX0NIQVIpIHsKLQkJCQkvLyBub3JtYWwgdW5lc2NhcGVkIGNoYXJhY3RlcgotCQkJCWlmIChidWZmZXIgIT0gbnVsbCkKLQkJCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGVzY2FwZWRUZXh0LnN1YnN0cmluZygwLCBpKSk7Ci0KLQkJCQlpZiAoKytpIDwgZXNjYXBlZFRleHQubGVuZ3RoKCkpIHsKLQkJCQkJYyA9IGVzY2FwZWRUZXh0LmNoYXJBdChpKTsKLQkJCQkJc3dpdGNoIChjKSB7Ci0JCQkJCWNhc2UgUEFSQU1FVEVSX1NUQVJUX0NIQVI6Ci0JCQkJCWNhc2UgUEFSQU1FVEVSX0VORF9DSEFSOgotCQkJCQljYXNlIElEX1ZBTFVFX0NIQVI6Ci0JCQkJCWNhc2UgUEFSQU1FVEVSX1NFUEFSQVRPUl9DSEFSOgotCQkJCQljYXNlIEVTQ0FQRV9DSEFSOgotCQkJCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FeGNlcHRpb24oCi0JCQkJCQkJCSJJbnZhbGlkIGNoYXJhY3RlciAnIiArIGMgKyAiJyBpbiBlc2NhcGUgc2VxdWVuY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbigKLQkJCQkJCQkiVW5leHBlY3RlZCB0ZXJtaW5hdGlvbiBvZiBlc2NhcGUgc2VxdWVuY2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIGVzY2FwZWRUZXh0OwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWFwIG9mIGNhdGVnb3J5IGlkZW50aWZpZXJzICg8Y29kZT5TdHJpbmc8L2NvZGU+KSB0byBjYXRlZ29yaWVzICgKLQkgKiA8Y29kZT5DYXRlZ29yeTwvY29kZT4pLiBUaGlzIGNvbGxlY3Rpb24gbWF5IGJlIGVtcHR5LCBidXQgaXQgaXMgbmV2ZXIKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCBjYXRlZ29yaWVzQnlJZCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBUaGUgc2V0IG9mIGlkZW50aWZpZXJzIGZvciB0aG9zZSBjYXRlZ29yaWVzIHRoYXQgYXJlIGRlZmluZWQuIFRoaXMgdmFsdWUKLQkgKiBtYXkgYmUgZW1wdHksIGJ1dCBpdCBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNldCBkZWZpbmVkQ2F0ZWdvcnlJZHMgPSBuZXcgSGFzaFNldCgpOwotCi0JLyoqCi0JICogVGhlIHNldCBvZiBpZGVudGlmaWVycyBmb3IgdGhvc2UgY29tbWFuZCBwYXJhbWV0ZXIgdHlwZXMgdGhhdCBhcmUKLQkgKiBkZWZpbmVkLiBUaGlzIHZhbHVlIG1heSBiZSBlbXB0eSwgYnV0IGl0IGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNldCBkZWZpbmVkUGFyYW1ldGVyVHlwZUlkcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkvKioKLQkgKiBUaGUgZXhlY3V0aW9uIGxpc3RlbmVyIGZvciB0aGlzIGNvbW1hbmQgbWFuYWdlci4gVGhpcyBqdXN0IGZvcndhcmRzCi0JICogZXZlbnRzIGZyb20gY29tbWFuZHMgY29udHJvbGxlZCBieSB0aGlzIG1hbmFnZXIgdG8gbGlzdGVuZXJzIG9uIHRoaXMKLQkgKiBtYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgSUV4ZWN1dGlvbkxpc3RlbmVyIGV4ZWN1dGlvbkxpc3RlbmVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGV4ZWN1dGlvbiBsaXN0ZW5lcnMuIFRoaXMgY29sbGVjdGlvbiBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZXhlY3V0aW9uTGlzdGVuZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBtYXAgb2YgcGFyYW1ldGVyIHR5cGUgaWRlbnRpZmllcnMgKDxjb2RlPlN0cmluZzwvY29kZT4pIHRvCi0JICogcGFyYW1ldGVyIHR5cGVzICggPGNvZGU+UGFyYW1ldGVyVHlwZTwvY29kZT4pLiBUaGlzIGNvbGxlY3Rpb24gbWF5IGJlCi0JICogZW1wdHksIGJ1dCBpdCBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAgcGFyYW1ldGVyVHlwZXNCeUlkID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGlzIGNvbW1hbmQgbWFuYWdlci4gVGhlIGxpc3RlbmVyIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoZSBzZXQgb2YgZGVmaW5lZCBjb21tYW5kcyBjaGFuZ2VzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHRyYWNrIHRoZQotCSAqIGdsb2JhbCBhcHBlYXJhbmNlIGFuZCBkaXNhcHBlYXJhbmNlIG9mIGNvbW1hbmRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgVGhlIGxpc3RlbmVyIHRvIGF0dGFjaDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkQ29tbWFuZE1hbmFnZXJMaXN0ZW5lcigKLQkJCWZpbmFsIElDb21tYW5kTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWFkZExpc3RlbmVyT2JqZWN0KGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGV4ZWN1dGlvbiBsaXN0ZW5lciB0byB0aGlzIG1hbmFnZXIuIFRoaXMgbGlzdGVuZXIgd2lsbCBiZQotCSAqIG5vdGlmaWVkIGlmIGFueSBvZiB0aGUgY29tbWFuZHMgY29udHJvbGxlZCBieSB0aGlzIG1hbmFnZXIgZXhlY3V0ZS4gVGhpcwotCSAqIGNhbiBiZSB1c2VkIHRvIHN1cHBvcnQgbWFjcm9zIGFuZCBpbnN0cnVtZW50YXRpb24gb2YgY29tbWFuZHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gYXR0YWNoOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRFeGVjdXRpb25MaXN0ZW5lcihmaW5hbCBJRXhlY3V0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLQkJCQkJIkNhbm5vdCBhZGQgYSBudWxsIGV4ZWN1dGlvbiBsaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoZXhlY3V0aW9uTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWV4ZWN1dGlvbkxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoTGlzdGVuZXJMaXN0LklERU5USVRZKTsKLQotCQkJLy8gQWRkIGFuIGV4ZWN1dGlvbiBsaXN0ZW5lciB0byBldmVyeSBjb21tYW5kLgotCQkJZXhlY3V0aW9uTGlzdGVuZXIgPSBuZXcgRXhlY3V0aW9uTGlzdGVuZXIoKTsKLQkJCWZpbmFsIEl0ZXJhdG9yIGNvbW1hbmRJdHIgPSBoYW5kbGVPYmplY3RzQnlJZC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGNvbW1hbmRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJZmluYWwgQ29tbWFuZCBjb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRJdHIubmV4dCgpOwotCQkJCWNvbW1hbmQuYWRkRXhlY3V0aW9uTGlzdGVuZXIoZXhlY3V0aW9uTGlzdGVuZXIpOwotCQkJfQotCi0JCX0KLQotCQlleGVjdXRpb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUNhdGVnb3J5TGlzdGVuZXIjY2F0ZWdvcnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQ2F0ZWdvcnlFdmVudCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjYXRlZ29yeUNoYW5nZWQoQ2F0ZWdvcnlFdmVudCBjYXRlZ29yeUV2ZW50KSB7Ci0JCWlmIChjYXRlZ29yeUV2ZW50LmlzRGVmaW5lZENoYW5nZWQoKSkgewotCQkJZmluYWwgQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBjYXRlZ29yeUV2ZW50LmdldENhdGVnb3J5KCk7Ci0JCQlmaW5hbCBTdHJpbmcgY2F0ZWdvcnlJZCA9IGNhdGVnb3J5LmdldElkKCk7Ci0JCQlmaW5hbCBib29sZWFuIGNhdGVnb3J5SWRBZGRlZCA9IGNhdGVnb3J5LmlzRGVmaW5lZCgpOwotCQkJaWYgKGNhdGVnb3J5SWRBZGRlZCkgewotCQkJCWRlZmluZWRDYXRlZ29yeUlkcy5hZGQoY2F0ZWdvcnlJZCk7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmluZWRDYXRlZ29yeUlkcy5yZW1vdmUoY2F0ZWdvcnlJZCk7Ci0JCQl9Ci0JCQlmaXJlQ29tbWFuZE1hbmFnZXJDaGFuZ2VkKG5ldyBDb21tYW5kTWFuYWdlckV2ZW50KHRoaXMsIG51bGwsCi0JCQkJCWZhbHNlLCBmYWxzZSwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlJZEFkZGVkLCB0cnVlKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvbW1hbmRzLklDb21tYW5kTGlzdGVuZXIjY29tbWFuZENoYW5nZWQob3JnLmVjbGlwc2UuY29tbWFuZHMuQ29tbWFuZEV2ZW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbW1hbmRDaGFuZ2VkKGZpbmFsIENvbW1hbmRFdmVudCBjb21tYW5kRXZlbnQpIHsKLQkJaWYgKGNvbW1hbmRFdmVudC5pc0RlZmluZWRDaGFuZ2VkKCkpIHsKLQkJCWZpbmFsIENvbW1hbmQgY29tbWFuZCA9IGNvbW1hbmRFdmVudC5nZXRDb21tYW5kKCk7Ci0JCQlmaW5hbCBTdHJpbmcgY29tbWFuZElkID0gY29tbWFuZC5nZXRJZCgpOwotCQkJZmluYWwgYm9vbGVhbiBjb21tYW5kSWRBZGRlZCA9IGNvbW1hbmQuaXNEZWZpbmVkKCk7Ci0JCQlpZiAoY29tbWFuZElkQWRkZWQpIHsKLQkJCQlkZWZpbmVkSGFuZGxlT2JqZWN0cy5hZGQoY29tbWFuZCk7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmluZWRIYW5kbGVPYmplY3RzLnJlbW92ZShjb21tYW5kKTsKLQkJCX0KLQkJCWZpcmVDb21tYW5kTWFuYWdlckNoYW5nZWQobmV3IENvbW1hbmRNYW5hZ2VyRXZlbnQodGhpcywgY29tbWFuZElkLAotCQkJCQljb21tYW5kSWRBZGRlZCwgdHJ1ZSwgbnVsbCwgZmFsc2UsIGZhbHNlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiB0aGUgY2F0ZWdvcnkgZm9yIHVuY2F0ZWdvcml6ZWQgY29tbWFuZHMuCi0JICogVGhpcyBpcyB0aGUgY2F0ZWdvcnkgdGhhdCB3aWxsIGJlIHJldHVybmVkIGlmCi0JICoge0BsaW5rICNnZXRDYXRlZ29yeShTdHJpbmcpfSBpcyBjYWxsZWQgd2l0aCA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNhdGVnb3J5IGZvciB1bmNhdGVnb3JpemVkIGNvbW1hbmRzOyBtdXN0IG5vdAotCSAqICAgICAgICAgICAgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGNhdGVnb3J5IGZvciB1bmNhdGVnb3JpemVkIGNvbW1hbmRzOwotCSAqICAgICAgICAgICAgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBkZWZpbmVVbmNhdGVnb3JpemVkQ2F0ZWdvcnkoZmluYWwgU3RyaW5nIG5hbWUsCi0JCQlmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZmluYWwgQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBnZXRDYXRlZ29yeShBVVRPR0VORVJBVEVEX0NBVEVHT1JZX0lEKTsKLQkJY2F0ZWdvcnkuZGVmaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEge0BsaW5rIFBhcmFtZXRlcml6ZWRDb21tYW5kfSB3aXRoIGEgY29tbWFuZCBhbmQKLQkgKiBwYXJhbWV0ZXJpemF0aW9ucyBhcyBzcGVjaWZpZWQgaW4gdGhlIHByb3ZpZGVkCi0JICogPGNvZGU+c2VyaWFsaXplZFBhcmFtZXRlcml6ZWRDb21tYW5kPC9jb2RlPiBzdHJpbmcuIFRoZQotCSAqIDxjb2RlPnNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZDwvY29kZT4gbXVzdCB1c2UgdGhlIGZvcm1hdAotCSAqIHJldHVybmVkIGJ5IHtAbGluayBQYXJhbWV0ZXJpemVkQ29tbWFuZCNzZXJpYWxpemUoKX0gYW5kIGRlc2NyaWJlZCBpbiB0aGUKLQkgKiBKYXZhZG9jIGZvciB0aGF0IG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgYSBwYXJhbWV0ZXIgaWQgZW5jb2RlZCBpbiB0aGUKLQkgKiA8Y29kZT5zZXJpYWxpemVkUGFyYW1ldGVyaXplZENvbW1hbmQ8L2NvZGU+IGRvZXMgbm90IGV4aXN0IGluIHRoZQotCSAqIGVuY29kZWQgY29tbWFuZCwgdGhhdCBwYXJhbWV0ZXIgaWQgYW5kIHZhbHVlIGFyZSBpZ25vcmVkLiBBIGdpdmVuCi0JICogcGFyYW1ldGVyIGlkIHNob3VsZCBub3QgYmUgdXNlZCBtb3JlIHRoYW4gb25jZSBpbgotCSAqIDxjb2RlPnNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZDwvY29kZT4uIFRoaXMgd2lsbCBub3QgcmVzdWx0IGluCi0JICogYW4gZXhjZXB0aW9uLCBidXQgaW4gdGhpcyBjYXNlIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIHdoZW4gdGhlCi0JICogY29tbWFuZCBpcyBleGVjdXRlZCBpcyB1bnNwZWNpZmllZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCBuZXZlciByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4sIGhvd2V2ZXIgaXQgbWF5IHRocm93Ci0JICogYW4gZXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwcm9jZXNzaW5nIHRoZSBzZXJpYWxpemF0aW9uIHN0cmluZyBvcgotCSAqIHRoZSBlbmNvZGVkIGNvbW1hbmQgaXMgdW5kZWZpbmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc2VyaWFsaXplZFBhcmFtZXRlcml6ZWRDb21tYW5kCi0JICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBjb21tYW5kIGlkIGFuZCBwYXJhbWV0ZXIgaWRzIGFuZAotCSAqICAgICAgICAgICAgdmFsdWVzOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gYSB7QGxpbmsgUGFyYW1ldGVyaXplZENvbW1hbmR9IHdpdGggdGhlIGNvbW1hbmQgYW5kCi0JICogICAgICAgICBwYXJhbWV0ZXJpemF0aW9ucyBlbmNvZGVkIGluIHRoZQotCSAqICAgICAgICAgPGNvZGU+c2VyaWFsaXplZFBhcmFtZXRlcml6ZWRDb21tYW5kPC9jb2RlPjsgbmV2ZXIKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBjb21tYW5kIGluZGljYXRlZCBpbgotCSAqICAgICAgICAgICAgIDxjb2RlPnNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZDwvY29kZT4gaXMgbm90IGRlZmluZWQKLQkgKiBAdGhyb3dzIFNlcmlhbGl6YXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvciBkZXNlcmlhbGl6aW5nCi0JICogICAgICAgICAgICAgPGNvZGU+c2VyaWFsaXplZFBhcmFtZXRlcml6ZWRDb21tYW5kPC9jb2RlPgotCSAqIEBzZWUgUGFyYW1ldGVyaXplZENvbW1hbmQjc2VyaWFsaXplKCkKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIGZpbmFsIFBhcmFtZXRlcml6ZWRDb21tYW5kIGRlc2VyaWFsaXplKAotCQkJZmluYWwgU3RyaW5nIHNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZCkKLQkJCXRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uLCBTZXJpYWxpemF0aW9uRXhjZXB0aW9uIHsKLQotCQlmaW5hbCBpbnQgbHBhcmVuUG9zaXRpb24gPSB1bmVzY2FwZWRJbmRleE9mKAotCQkJCXNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZCwgUEFSQU1FVEVSX1NUQVJUX0NIQVIpOwotCi0JCWZpbmFsIFN0cmluZyBjb21tYW5kSWRFc2NhcGVkOwotCQlmaW5hbCBTdHJpbmcgc2VyaWFsaXplZFBhcmFtZXRlcnM7Ci0JCWlmIChscGFyZW5Qb3NpdGlvbiA9PSAtMSkgewotCQkJY29tbWFuZElkRXNjYXBlZCA9IHNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZDsKLQkJCXNlcmlhbGl6ZWRQYXJhbWV0ZXJzID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCWNvbW1hbmRJZEVzY2FwZWQgPSBzZXJpYWxpemVkUGFyYW1ldGVyaXplZENvbW1hbmQuc3Vic3RyaW5nKDAsCi0JCQkJCWxwYXJlblBvc2l0aW9uKTsKLQotCQkJaWYgKHNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZAotCQkJCQkuY2hhckF0KHNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZC5sZW5ndGgoKSAtIDEpICE9IFBBUkFNRVRFUl9FTkRfQ0hBUikgewotCQkJCXRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKAotCQkJCQkJIlBhcmVudGhlc2VzIG11c3QgYmUgYmFsYW5jZWQgaW4gc2VyaWFsaXplZCBQYXJhbWV0ZXJpemVkQ29tbWFuZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXNlcmlhbGl6ZWRQYXJhbWV0ZXJzID0gc2VyaWFsaXplZFBhcmFtZXRlcml6ZWRDb21tYW5kLnN1YnN0cmluZygKLQkJCQkJbHBhcmVuUG9zaXRpb24gKyAxLCAvLyBza2lwIFBBUkFNRVRFUl9TVEFSVF9DSEFSCi0JCQkJCXNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZC5sZW5ndGgoKSAtIDEpOyAvLyBza2lwCi0JCQkvLyBQQVJBTUVURVJfRU5EX0NIQVIKLQkJfQotCi0JCWZpbmFsIFN0cmluZyBjb21tYW5kSWQgPSB1bmVzY2FwZShjb21tYW5kSWRFc2NhcGVkKTsKLQkJZmluYWwgQ29tbWFuZCBjb21tYW5kID0gZ2V0Q29tbWFuZChjb21tYW5kSWQpOwotCQlmaW5hbCBJUGFyYW1ldGVyW10gcGFyYW1ldGVycyA9IGNvbW1hbmQuZ2V0UGFyYW1ldGVycygpOwotCQlmaW5hbCBQYXJhbWV0ZXJpemF0aW9uW10gcGFyYW1ldGVyaXphdGlvbnMgPSBnZXRQYXJhbWV0ZXJpemF0aW9ucygKLQkJCQlzZXJpYWxpemVkUGFyYW1ldGVycywgcGFyYW1ldGVycyk7Ci0KLQkJcmV0dXJuIG5ldyBQYXJhbWV0ZXJpemVkQ29tbWFuZChjb21tYW5kLCBwYXJhbWV0ZXJpemF0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgYWxsIG9mIHRoZSBsaXN0ZW5lcnMgdG8gdGhpcyBtYW5hZ2VyIHRoYXQgdGhlIHNldCBvZiBkZWZpbmVkCi0JICogY29tbWFuZCBpZGVudGlmaWVycyBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBldmVudCB0byBzZW5kIHRvIGFsbCBvZiB0aGUgbGlzdGVuZXJzOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGZpcmVDb21tYW5kTWFuYWdlckNoYW5nZWQoZmluYWwgQ29tbWFuZE1hbmFnZXJFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCWZpbmFsIE9iamVjdFtdIGxpc3RlbmVycyA9IGdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgSUNvbW1hbmRNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUNvbW1hbmRNYW5hZ2VyTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCWxpc3RlbmVyLmNvbW1hbmRNYW5hZ2VyQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjYXRlZ29yeSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyLiBJZiBubyBzdWNoIGNhdGVnb3J5Ci0JICogY3VycmVudGx5IGV4aXN0cywgdGhlbiB0aGUgY2F0ZWdvcnkgd2lsbCBiZSBjcmVhdGVkIChidXQgYmUgdW5kZWZpbmVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnlJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgdG8gZmluZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uIElmCi0JICogICAgICAgICAgICB0aGUgY2F0ZWdvcnkgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYSBjYXRlZ29yeSBzdWl0YWJsZQotCSAqICAgICAgICAgICAgZm9yIHVuY2F0ZWdvcml6ZWQgaXRlbXMgaXMgZGVmaW5lZCBhbmQgcmV0dXJuZWQuCi0JICogQHJldHVybiBUaGUgY2F0ZWdvcnkgd2l0aCB0aGUgZ2l2ZW4gaWRlbnRpZmllcjsgdGhpcyB2YWx1ZSB3aWxsIG5ldmVyIGJlCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgYnV0IGl0IG1pZ2h0IGJlIHVuZGVmaW5lZC4KLQkgKiBAc2VlIENhdGVnb3J5Ci0JICovCi0JcHVibGljIGZpbmFsIENhdGVnb3J5IGdldENhdGVnb3J5KGZpbmFsIFN0cmluZyBjYXRlZ29yeUlkKSB7Ci0JCWlmIChjYXRlZ29yeUlkID09IG51bGwpIHsKLQkJCXJldHVybiBnZXRDYXRlZ29yeShBVVRPR0VORVJBVEVEX0NBVEVHT1JZX0lEKTsKLQkJfQotCi0JCWNoZWNrSWQoY2F0ZWdvcnlJZCk7Ci0KLQkJQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ2F0ZWdvcnkpIGNhdGVnb3JpZXNCeUlkLmdldChjYXRlZ29yeUlkKTsKLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLQkJCWNhdGVnb3J5ID0gbmV3IENhdGVnb3J5KGNhdGVnb3J5SWQpOwotCQkJY2F0ZWdvcmllc0J5SWQucHV0KGNhdGVnb3J5SWQsIGNhdGVnb3J5KTsKLQkJCWNhdGVnb3J5LmFkZENhdGVnb3J5TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyLiBJZiBubyBzdWNoIGNvbW1hbmQgY3VycmVudGx5Ci0JICogZXhpc3RzLCB0aGVuIHRoZSBjb21tYW5kIHdpbGwgYmUgY3JlYXRlZCAoYnV0IHdpbGwgYmUgdW5kZWZpbmVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZElkCi0JICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciB0byBmaW5kOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBhbmQKLQkgKiAgICAgICAgICAgIG11c3Qgbm90IGJlIHplcm8tbGVuZ3RoLgotCSAqIEByZXR1cm4gVGhlIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gaWRlbnRpZmllcjsgdGhpcyB2YWx1ZSB3aWxsIG5ldmVyIGJlCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgYnV0IGl0IG1pZ2h0IGJlIHVuZGVmaW5lZC4KLQkgKiBAc2VlIENvbW1hbmQKLQkgKi8KLQlwdWJsaWMgZmluYWwgQ29tbWFuZCBnZXRDb21tYW5kKGZpbmFsIFN0cmluZyBjb21tYW5kSWQpIHsKLQkJY2hlY2tJZChjb21tYW5kSWQpOwotCi0JCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBoYW5kbGVPYmplY3RzQnlJZC5nZXQoY29tbWFuZElkKTsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJY29tbWFuZCA9IG5ldyBDb21tYW5kKGNvbW1hbmRJZCk7Ci0JCQloYW5kbGVPYmplY3RzQnlJZC5wdXQoY29tbWFuZElkLCBjb21tYW5kKTsKLQkJCWNvbW1hbmQuYWRkQ29tbWFuZExpc3RlbmVyKHRoaXMpOwotCi0JCQlpZiAoZXhlY3V0aW9uTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCWNvbW1hbmQuYWRkRXhlY3V0aW9uTGlzdGVuZXIoZXhlY3V0aW9uTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2F0ZWdvcmllcyB0aGF0IGFyZSBkZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGRlZmluZWQgY2F0ZWdvcmllczsgdGhpcyB2YWx1ZSBtYXkgYmUgZW1wdHksIGJ1dCBpdCBpcyBuZXZlcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBmaW5hbCBDYXRlZ29yeVtdIGdldERlZmluZWRDYXRlZ29yaWVzKCkgewotCQlmaW5hbCBDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSBuZXcgQ2F0ZWdvcnlbZGVmaW5lZENhdGVnb3J5SWRzLnNpemUoKV07Ci0JCWZpbmFsIEl0ZXJhdG9yIGNhdGVnb3J5SWRJdHIgPSBkZWZpbmVkQ2F0ZWdvcnlJZHMuaXRlcmF0b3IoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoY2F0ZWdvcnlJZEl0ci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBjYXRlZ29yeUlkID0gKFN0cmluZykgY2F0ZWdvcnlJZEl0ci5uZXh0KCk7Ci0JCQljYXRlZ29yaWVzW2krK10gPSBnZXRDYXRlZ29yeShjYXRlZ29yeUlkKTsKLQkJfQotCQlyZXR1cm4gY2F0ZWdvcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgaWRlbnRpZmllcnMgZm9yIHRob3NlIGNhdGVnb3J5IHRoYXQgYXJlIGRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgc2V0IG9mIGRlZmluZWQgY2F0ZWdvcnkgaWRlbnRpZmllcnM7IHRoaXMgdmFsdWUgbWF5IGJlIGVtcHR5LAotCSAqICAgICAgICAgYnV0IGl0IGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCBTZXQgZ2V0RGVmaW5lZENhdGVnb3J5SWRzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGRlZmluZWRDYXRlZ29yeUlkcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2V0IG9mIGlkZW50aWZpZXJzIGZvciB0aG9zZSBjb21tYW5kcyB0aGF0IGFyZSBkZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNldCBvZiBkZWZpbmVkIGNvbW1hbmQgaWRlbnRpZmllcnM7IHRoaXMgdmFsdWUgbWF5IGJlIGVtcHR5LAotCSAqICAgICAgICAgYnV0IGl0IGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCBTZXQgZ2V0RGVmaW5lZENvbW1hbmRJZHMoKSB7Ci0JCXJldHVybiBnZXREZWZpbmVkSGFuZGxlT2JqZWN0SWRzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tbWFuZHMgdGhhdCBhcmUgZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBkZWZpbmVkIGNvbW1hbmRzOyB0aGlzIHZhbHVlIG1heSBiZSBlbXB0eSwgYnV0IGl0IGlzIG5ldmVyCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIGZpbmFsIENvbW1hbmRbXSBnZXREZWZpbmVkQ29tbWFuZHMoKSB7Ci0JCXJldHVybiAoQ29tbWFuZFtdKSBkZWZpbmVkSGFuZGxlT2JqZWN0cwotCQkJCS50b0FycmF5KG5ldyBDb21tYW5kW2RlZmluZWRIYW5kbGVPYmplY3RzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldCBvZiBpZGVudGlmaWVycyBmb3IgdGhvc2UgcGFyYW1ldGVyIHR5cGVzIHRoYXQgYXJlCi0JICogZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzZXQgb2YgZGVmaW5lZCBjb21tYW5kIHBhcmFtZXRlciB0eXBlIGlkZW50aWZpZXJzOyB0aGlzIHZhbHVlCi0JICogICAgICAgICBtYXkgYmUgZW1wdHksIGJ1dCBpdCBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIGZpbmFsIFNldCBnZXREZWZpbmVkUGFyYW1ldGVyVHlwZUlkcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChkZWZpbmVkUGFyYW1ldGVyVHlwZUlkcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tbWFuZCBwYXJhbWV0ZXIgdHlwZXMgdGhhdCBhcmUgZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBkZWZpbmVkIGNvbW1hbmQgcGFyYW1ldGVyIHR5cGVzOyB0aGlzIHZhbHVlIG1heSBiZSBlbXB0eSwgYnV0Ci0JICogICAgICAgICBpdCBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIGZpbmFsIFBhcmFtZXRlclR5cGVbXSBnZXREZWZpbmVkUGFyYW1ldGVyVHlwZXMoKSB7Ci0JCWZpbmFsIFBhcmFtZXRlclR5cGVbXSBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBQYXJhbWV0ZXJUeXBlW2RlZmluZWRQYXJhbWV0ZXJUeXBlSWRzCi0JCQkJLnNpemUoKV07Ci0JCWZpbmFsIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmaW5lZFBhcmFtZXRlclR5cGVJZHMuaXRlcmF0b3IoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlmaW5hbCBTdHJpbmcgcGFyYW1ldGVyVHlwZUlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJcGFyYW1ldGVyVHlwZXNbaSsrXSA9IGdldFBhcmFtZXRlclR5cGUocGFyYW1ldGVyVHlwZUlkKTsKLQkJfQotCQlyZXR1cm4gcGFyYW1ldGVyVHlwZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBwYXJhbWV0ZXJpemF0aW9ucyBmb3IgdGhlIHByb3ZpZGVkIGNvbW1hbmQgYnkKLQkgKiBkZXJpdmluZyB0aGUgcGFyYW1ldGVyIGlkcyBhbmQgdmFsdWVzIGZyb20gdGhlIHByb3ZpZGVkCi0JICogPGNvZGU+c2VyaWFsaXplZFBhcmFtZXRlcnM8L2NvZGU+IHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VyaWFsaXplZFBhcmFtZXRlcnMKLQkgKiAgICAgICAgICAgIGEgU3RyaW5nIGVuY29kaW5nIHBhcmFtZXRlciBpZHMgYW5kIHZhbHVlczsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBwYXJhbWV0ZXJzCi0JICogICAgICAgICAgICBhcnJheSBvZiBwYXJhbWV0ZXJzIG9mIHRoZSBjb21tYW5kIGJlaW5nIGRlc2VyaWFsaXplZDsgbWF5IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBhcmFtZXRlcml6YXRpb25zOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGNvbW1hbmQgaXMgbm90IGRlZmluZWQKLQkgKiBAdGhyb3dzIFNlcmlhbGl6YXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvciBkZXNlcmlhbGl6aW5nIHRoZSBwYXJhbWV0ZXJzCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByaXZhdGUgZmluYWwgUGFyYW1ldGVyaXphdGlvbltdIGdldFBhcmFtZXRlcml6YXRpb25zKAotCQkJU3RyaW5nIHNlcmlhbGl6ZWRQYXJhbWV0ZXJzLCBmaW5hbCBJUGFyYW1ldGVyW10gcGFyYW1ldGVycykKLQkJCXRocm93cyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uIHsKLQotCQlpZiAoc2VyaWFsaXplZFBhcmFtZXRlcnMgPT0gbnVsbAotCQkJCXx8IChzZXJpYWxpemVkUGFyYW1ldGVycy5sZW5ndGgoKSA9PSAwKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICgocGFyYW1ldGVycyA9PSBudWxsKSB8fCAocGFyYW1ldGVycy5sZW5ndGggPT0gMCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmaW5hbCBBcnJheUxpc3QgcGFyYW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWludCBjb21tYVBvc2l0aW9uOyAvLyBzcGxpdCBvZmYgZWFjaCBwYXJhbSBieSBsb29raW5nIGZvciAnLCcKLQkJZG8gewotCQkJY29tbWFQb3NpdGlvbiA9IHVuZXNjYXBlZEluZGV4T2Yoc2VyaWFsaXplZFBhcmFtZXRlcnMsICcsJyk7Ci0KLQkJCWZpbmFsIFN0cmluZyBpZEVxdWFsc1ZhbHVlOwotCQkJaWYgKGNvbW1hUG9zaXRpb24gPT0gLTEpIHsKLQkJCQkvLyBubyBtb3JlIHBhcmFtZXRlcnMgYWZ0ZXIgdGhpcwotCQkJCWlkRXF1YWxzVmFsdWUgPSBzZXJpYWxpemVkUGFyYW1ldGVyczsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gdGFrZSB0aGUgZmlyc3QgcGFyYW1ldGVyLi4uCi0JCQkJaWRFcXVhbHNWYWx1ZSA9IHNlcmlhbGl6ZWRQYXJhbWV0ZXJzCi0JCQkJCQkuc3Vic3RyaW5nKDAsIGNvbW1hUG9zaXRpb24pOwotCi0JCQkJLy8gLi4uIGFuZCBwdXQgdGhlIHJlc3QgYmFjayBpbnRvIHNlcmlhbGl6ZWRQYXJhbWV0ZXJzCi0JCQkJc2VyaWFsaXplZFBhcmFtZXRlcnMgPSBzZXJpYWxpemVkUGFyYW1ldGVycwotCQkJCQkJLnN1YnN0cmluZyhjb21tYVBvc2l0aW9uICsgMSk7Ci0JCQl9Ci0KLQkJCWZpbmFsIGludCBlcXVhbHNQb3NpdGlvbiA9IHVuZXNjYXBlZEluZGV4T2YoaWRFcXVhbHNWYWx1ZSwgJz0nKTsKLQotCQkJZmluYWwgU3RyaW5nIHBhcmFtZXRlcklkOwotCQkJZmluYWwgU3RyaW5nIHBhcmFtZXRlclZhbHVlOwotCQkJaWYgKGVxdWFsc1Bvc2l0aW9uID09IC0xKSB7Ci0JCQkJLy8gbWlzc2luZyB2YWx1ZXMgYXJlIG51bGwKLQkJCQlwYXJhbWV0ZXJJZCA9IHVuZXNjYXBlKGlkRXF1YWxzVmFsdWUpOwotCQkJCXBhcmFtZXRlclZhbHVlID0gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGFyYW1ldGVySWQgPSB1bmVzY2FwZShpZEVxdWFsc1ZhbHVlLnN1YnN0cmluZygwLAotCQkJCQkJZXF1YWxzUG9zaXRpb24pKTsKLQkJCQlwYXJhbWV0ZXJWYWx1ZSA9IHVuZXNjYXBlKGlkRXF1YWxzVmFsdWUKLQkJCQkJCS5zdWJzdHJpbmcoZXF1YWxzUG9zaXRpb24gKyAxKSk7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIElQYXJhbWV0ZXIgcGFyYW1ldGVyID0gcGFyYW1ldGVyc1tpXTsKLQkJCQlpZiAocGFyYW1ldGVyLmdldElkKCkuZXF1YWxzKHBhcmFtZXRlcklkKSkgewotCQkJCQlwYXJhbUxpc3QuYWRkKG5ldyBQYXJhbWV0ZXJpemF0aW9uKHBhcmFtZXRlciwKLQkJCQkJCQlwYXJhbWV0ZXJWYWx1ZSkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSB3aGlsZSAoY29tbWFQb3NpdGlvbiAhPSAtMSk7Ci0KLQkJcmV0dXJuIChQYXJhbWV0ZXJpemF0aW9uW10pIHBhcmFtTGlzdAotCQkJCS50b0FycmF5KG5ldyBQYXJhbWV0ZXJpemF0aW9uW3BhcmFtTGlzdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb21tYW5kIHtAbGluayBQYXJhbWV0ZXJUeXBlfSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyLiBJZiBubwotCSAqIHN1Y2ggY29tbWFuZCBwYXJhbWV0ZXIgdHlwZSBjdXJyZW50bHkgZXhpc3RzLCB0aGVuIHRoZSBjb21tYW5kIHBhcmFtZXRlcgotCSAqIHR5cGUgd2lsbCBiZSBjcmVhdGVkIChidXQgd2lsbCBiZSB1bmRlZmluZWQpLgotCSAqIAotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIHRvIGZpbmQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IGFuZAotCSAqICAgICAgICAgICAgbXVzdCBub3QgYmUgemVyby1sZW5ndGguCi0JICogQHJldHVybiBUaGUge0BsaW5rIFBhcmFtZXRlclR5cGV9IHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXI7IHRoaXMgdmFsdWUKLQkgKiAgICAgICAgIHdpbGwgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGJ1dCBpdCBtaWdodCBiZSB1bmRlZmluZWQuCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBmaW5hbCBQYXJhbWV0ZXJUeXBlIGdldFBhcmFtZXRlclR5cGUoZmluYWwgU3RyaW5nIHBhcmFtZXRlclR5cGVJZCkgewotCQljaGVja0lkKHBhcmFtZXRlclR5cGVJZCk7Ci0KLQkJUGFyYW1ldGVyVHlwZSBwYXJhbWV0ZXJUeXBlID0gKFBhcmFtZXRlclR5cGUpIHBhcmFtZXRlclR5cGVzQnlJZAotCQkJCS5nZXQocGFyYW1ldGVyVHlwZUlkKTsKLQkJaWYgKHBhcmFtZXRlclR5cGUgPT0gbnVsbCkgewotCQkJcGFyYW1ldGVyVHlwZSA9IG5ldyBQYXJhbWV0ZXJUeXBlKHBhcmFtZXRlclR5cGVJZCk7Ci0JCQlwYXJhbWV0ZXJUeXBlc0J5SWQucHV0KHBhcmFtZXRlclR5cGVJZCwgcGFyYW1ldGVyVHlwZSk7Ci0JCQlwYXJhbWV0ZXJUeXBlLmFkZExpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmFtZXRlclR5cGU7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwYXJhbWV0ZXJUeXBlQ2hhbmdlZCgKLQkJCWZpbmFsIFBhcmFtZXRlclR5cGVFdmVudCBwYXJhbWV0ZXJUeXBlRXZlbnQpIHsKLQkJaWYgKHBhcmFtZXRlclR5cGVFdmVudC5pc0RlZmluZWRDaGFuZ2VkKCkpIHsKLQkJCWZpbmFsIFBhcmFtZXRlclR5cGUgcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGVFdmVudAotCQkJCQkuZ2V0UGFyYW1ldGVyVHlwZSgpOwotCQkJZmluYWwgU3RyaW5nIHBhcmFtZXRlclR5cGVJZCA9IHBhcmFtZXRlclR5cGUuZ2V0SWQoKTsKLQkJCWZpbmFsIGJvb2xlYW4gcGFyYW1ldGVyVHlwZUlkQWRkZWQgPSBwYXJhbWV0ZXJUeXBlLmlzRGVmaW5lZCgpOwotCQkJaWYgKHBhcmFtZXRlclR5cGVJZEFkZGVkKSB7Ci0JCQkJZGVmaW5lZFBhcmFtZXRlclR5cGVJZHMuYWRkKHBhcmFtZXRlclR5cGVJZCk7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmluZWRQYXJhbWV0ZXJUeXBlSWRzLnJlbW92ZShwYXJhbWV0ZXJUeXBlSWQpOwotCQkJfQotCi0JCQlmaXJlQ29tbWFuZE1hbmFnZXJDaGFuZ2VkKG5ldyBDb21tYW5kTWFuYWdlckV2ZW50KHRoaXMsCi0JCQkJCXBhcmFtZXRlclR5cGVJZCwgcGFyYW1ldGVyVHlwZUlkQWRkZWQsIHRydWUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoaXMgY29tbWFuZCBtYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgVGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUNvbW1hbmRNYW5hZ2VyTGlzdGVuZXIoCi0JCQlmaW5hbCBJQ29tbWFuZE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZW1vdmVMaXN0ZW5lck9iamVjdChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbiBleGVjdXRpb24gbGlzdGVuZXIgZnJvbSB0aGlzIGNvbW1hbmQgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVFeGVjdXRpb25MaXN0ZW5lcihmaW5hbCBJRXhlY3V0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ2Fubm90IHJlbW92ZSBhIG51bGwgbGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGV4ZWN1dGlvbkxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlleGVjdXRpb25MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQotCQlpZiAoZXhlY3V0aW9uTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZXhlY3V0aW9uTGlzdGVuZXJzID0gbnVsbDsKLQotCQkJLy8gUmVtb3ZlIHRoZSBleGVjdXRpb24gbGlzdGVuZXIgdG8gZXZlcnkgY29tbWFuZC4KLQkJCWZpbmFsIEl0ZXJhdG9yIGNvbW1hbmRJdHIgPSBoYW5kbGVPYmplY3RzQnlJZC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGNvbW1hbmRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJZmluYWwgQ29tbWFuZCBjb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRJdHIubmV4dCgpOwotCQkJCWNvbW1hbmQucmVtb3ZlRXhlY3V0aW9uTGlzdGVuZXIoZXhlY3V0aW9uTGlzdGVuZXIpOwotCQkJfQotCQkJZXhlY3V0aW9uTGlzdGVuZXIgPSBudWxsOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCbG9jayB1cGRhdGVzIGFsbCBvZiB0aGUgaGFuZGxlcnMgZm9yIGFsbCBvZiB0aGUgY29tbWFuZHMuIElmIHRoZSBoYW5kbGVyCi0JICogaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIGNvbW1hbmQgaWQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCwgdGhlbgotCSAqIHRoZSBjb21tYW5kIGJlY29tZXMgdW5oYW5kbGVkLiBPdGhlcndpc2UsIHRoZSBoYW5kbGVyIGlzIHNldCB0byB0aGUKLQkgKiBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBtYXAuCi0JICogCi0JICogQHBhcmFtIGhhbmRsZXJzQnlDb21tYW5kSWQKLQkgKiAgICAgICAgICAgIEEgbWFwIG9mIGNvbW1hbmQgaWRlbnRpZmllcnMgKDxjb2RlPlN0cmluZzwvY29kZT4pIHRvCi0JICogICAgICAgICAgICBoYW5kbGVycyAoPGNvZGU+SUhhbmRsZXI8L2NvZGU+KS4gVGhpcyBtYXAgbWF5IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbGwgaGFuZGxlcnMgc2hvdWxkIGJlIGNsZWFyZWQuCi0JICogICAgICAgICAgICBTaW1pbGFybHksIGlmIHRoZSBtYXAgaXMgZW1wdHksIHRoZW4gYWxsIGNvbW1hbmRzIHdpbGwgYmVjb21lCi0JICogICAgICAgICAgICB1bmhhbmRsZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0SGFuZGxlcnNCeUNvbW1hbmRJZChmaW5hbCBNYXAgaGFuZGxlcnNCeUNvbW1hbmRJZCkgewotCQkvLyBNYWtlIHRoYXQgYWxsIHRoZSByZWZlcmVuY2UgY29tbWFuZHMgYXJlIGNyZWF0ZWQuCi0JCWZpbmFsIEl0ZXJhdG9yIGNvbW1hbmRJZEl0ciA9IGhhbmRsZXJzQnlDb21tYW5kSWQua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNvbW1hbmRJZEl0ci5oYXNOZXh0KCkpIHsKLQkJCWdldENvbW1hbmQoKFN0cmluZykgY29tbWFuZElkSXRyLm5leHQoKSk7Ci0JCX0KLQotCQkvLyBOb3csIHNldC11cCB0aGUgaGFuZGxlcnMgb24gYWxsIG9mIHRoZSBleGlzdGluZyBjb21tYW5kcy4KLQkJZmluYWwgSXRlcmF0b3IgY29tbWFuZEl0ciA9IGhhbmRsZU9iamVjdHNCeUlkLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb21tYW5kSXRyLmhhc05leHQoKSkgewotCQkJZmluYWwgQ29tbWFuZCBjb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRJdHIubmV4dCgpOwotCQkJZmluYWwgU3RyaW5nIGNvbW1hbmRJZCA9IGNvbW1hbmQuZ2V0SWQoKTsKLQkJCWZpbmFsIE9iamVjdCB2YWx1ZSA9IGhhbmRsZXJzQnlDb21tYW5kSWQuZ2V0KGNvbW1hbmRJZCk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJSGFuZGxlcikgewotCQkJCWNvbW1hbmQuc2V0SGFuZGxlcigoSUhhbmRsZXIpIHZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29tbWFuZC5zZXRIYW5kbGVyKG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgZm9yIHRoZSBpbmRleCBvZiBhIDxjb2RlPmNoYXI8L2NvZGU+IGluIGEgPGNvZGU+U3RyaW5nPC9jb2RlPgotCSAqIGJ1dCBkaXNyZWdhcmRzIGNoYXJhY3RlcnMgcHJlZml4ZWQgd2l0aCB0aGUge0BsaW5rICNFU0NBUEVfQ0hBUn0gZXNjYXBlCi0JICogY2hhcmFjdGVyLiBUaGlzIGlzIHVzZWQgYnkge0BsaW5rICNkZXNlcmlhbGl6ZShTdHJpbmcpfSBhbmQKLQkgKiB7QGxpbmsgI2dldFBhcmFtZXRlcml6YXRpb25zKFN0cmluZywgSVBhcmFtZXRlcltdKX0gdG8gcGFyc2UgdGhlCi0JICogc2VyaWFsaXplZCBwYXJhbWV0ZXJpemVkIGNvbW1hbmQgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBlc2NhcGVkVGV4dAotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBzZWFyY2ggZm9yIHRoZSBpbmRleCBvZiA8Y29kZT5jaDwvY29kZT4gaW4KLQkgKiBAcGFyYW0gY2gKLQkgKiAgICAgICAgICAgIGEgY2hhcmFjdGVyIHRvIHNlYXJjaCBmb3IgaW4gPGNvZGU+ZXNjYXBlZFRleHQ8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVuZXNjYXBlZCBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIgaW4KLQkgKiAgICAgICAgIDxjb2RlPmVzY2FwZWRUZXh0PC9jb2RlPiwgb3IgPGNvZGU+LTE8L2NvZGU+IGlmIHRoZQotCSAqICAgICAgICAgY2hhcmFjdGVyIGRvZXMgbm90IG9jY3VyIHVuZXNjYXBlZC4KLQkgKiBAc2VlIFN0cmluZyNpbmRleE9mKGludCkKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB1bmVzY2FwZWRJbmRleE9mKGZpbmFsIFN0cmluZyBlc2NhcGVkVGV4dCwgZmluYWwgY2hhciBjaCkgewotCi0JCWludCBwb3MgPSBlc2NhcGVkVGV4dC5pbmRleE9mKGNoKTsKLQotCQkvLyBmaXJzdCBjaGFyIGNhbid0IGJlIGVzY2FwZWQKLQkJaWYgKHBvcyA9PSAwKQotCQkJcmV0dXJuIHBvczsKLQotCQl3aGlsZSAocG9zICE9IC0xKSB7Ci0JCQkvLyBsb29rIGJhY2sgZm9yIHRoZSBlc2NhcGUgY2hhcmFjdGVyCi0JCQlpZiAoZXNjYXBlZFRleHQuY2hhckF0KHBvcyAtIDEpICE9IEVTQ0FQRV9DSEFSKQotCQkJCXJldHVybiBwb3M7Ci0KLQkJCS8vIHNjYW4gZm9yIHRoZSBuZXh0IGluc3RhbmNlIG9mIGNoCi0JCQlwb3MgPSBlc2NhcGVkVGV4dC5pbmRleE9mKGNoLCBwb3MgKyAxKTsKLQkJfQotCi0JCXJldHVybiBwb3M7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9Db21tYW5kTWFuYWdlckV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvQ29tbWFuZE1hbmFnZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzQzMzI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9Db21tYW5kTWFuYWdlckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7Ci0KLS8qKgotICogPHA+Ci0gKiBBbiBldmVudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHNldCBvZiBkZWZpbmVkIGNvbW1hbmQgaWRlbnRpZmllcnMgaGFzIGNoYW5nZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIEBzZWUgSUNvbW1hbmRNYW5hZ2VyTGlzdGVuZXIjY29tbWFuZE1hbmFnZXJDaGFuZ2VkKENvbW1hbmRNYW5hZ2VyRXZlbnQpCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tYW5kTWFuYWdlckV2ZW50IHsKLQotCS8qKgotCSAqIFRoZSBiaXQgdXNlZCB0byByZXByZXNlbnQgd2hldGhlciB0aGUgZ2l2ZW4gY2F0ZWdvcnkgaGFzIGJlY29tZSBkZWZpbmVkLgotCSAqIElmIHRoaXMgYml0IGlzIG5vdCBzZXQgYW5kIHRoZXJlIGlzIG5vIGNhdGVnb3J5IGlkLCB0aGVuIG5vIGNhdGVnb3J5IGhhcwotCSAqIGJlY29tZSBkZWZpbmVkIG5vciB1bmRlZmluZWQuIElmIHRoaXMgYml0IGlzIG5vdCBzZXQgYW5kIHRoZXJlIGlzIGEKLQkgKiBjYXRlZ29yeSBpZCwgdGhlbiB0aGUgY2F0ZWdvcnkgaGFzIGJlY29tZSB1bmRlZmluZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIQU5HRURfQ0FURUdPUllfREVGSU5FRCA9IDE7Ci0KLQkvKioKLSAgICAgKiBUaGUgYml0IHVzZWQgdG8gcmVwcmVzZW50IHdoZXRoZXIgdGhlIGdpdmVuIGNvbW1hbmQgaGFzIGJlY29tZSBkZWZpbmVkLgotICAgICAqIElmIHRoaXMgYml0IGlzIG5vdCBzZXQgYW5kIHRoZXJlIGlzIG5vIGNvbW1hbmQgaWQsIHRoZW4gbm8gY29tbWFuZCBoYXMKLSAgICAgKiBiZWNvbWUgZGVmaW5lZCBub3IgdW5kZWZpbmVkLiBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0IGFuZCB0aGVyZSBpcyBhCi0gICAgICogY29tbWFuZCBpZCwgdGhlbiB0aGUgY29tbWFuZCBoYXMgYmVjb21lIHVuZGVmaW5lZC4KLSAgICAgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRF9DT01NQU5EX0RFRklORUQgPSAxIDw8IDE7Ci0JCi0JLyoqCi0JICogVGhlIGJpdCB1c2VkIHRvIHJlcHJlc2VudCB3aGV0aGVyIHRoZSBnaXZlbiBjb21tYW5kIHBhcmFtZXRlciB0eXBlIGhhcwotCSAqIGJlY29tZSBkZWZpbmVkLiBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0IGFuZCB0aGVyZSBpcyBubyBwYXJhbWV0ZXIgdHlwZSBpZCwKLQkgKiB0aGVuIG5vIHBhcmFtZXRlciB0eXBlIGhhcyBiZWNvbWUgZGVmaW5lZCBub3IgdW5kZWZpbmVkLiBJZiB0aGlzIGJpdCBpcwotCSAqIG5vdCBzZXQgYW5kIHRoZXJlIGlzIGEgcGFyYW1ldGVyIHR5cGUgaWQsIHRoZW4gdGhlIHBhcmFtZXRlciB0eXBlIGhhcwotCSAqIGJlY29tZSB1bmRlZmluZWQuCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEX1BBUkFNRVRFUl9UWVBFX0RFRklORUQgPSAxIDw8IDI7Ci0KLQkvKioKLQkgKiBUaGUgY2F0ZWdvcnkgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YKLQkgKiBkZWZpbmVkIGNhdGVnb3J5IGlkZW50aWZpZXJzLiBUaGlzIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqIGxpc3Qgb2YgZGVmaW5lZCBjYXRlZ29yeSBpZGVudGlmaWVycyBkaWQgbm90IGNoYW5nZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBjYXRlZ29yeUlkOwotCi0JLyoqCi0JICogQSBjb2xsZWN0aW9uIG9mIGJpdHMgcmVwcmVzZW50aW5nIHdoZXRoZXIgY2VydGFpbiB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLiBBCi0JICogYml0IGlzIHNldCAoaS5lLiwgPGNvZGU+MTwvY29kZT4pIGlmIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgY2hhbmdlZFZhbHVlczsKLQotCS8qKgotCSAqIFRoZSBjb21tYW5kIGlkZW50aWZpZXIgdGhhdCB3YXMgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIGRlZmluZWQKLQkgKiBjb21tYW5kIGlkZW50aWZpZXJzLiBUaGlzIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBsaXN0IG9mCi0JICogZGVmaW5lZCBjb21tYW5kIGlkZW50aWZpZXJzIGRpZCBub3QgY2hhbmdlLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGNvbW1hbmRJZDsKLQkKLQkvKioKLQkgKiBUaGUgY29tbWFuZCBwYXJhbWV0ZXIgdHlwZSBpZGVudGlmaWVyIHRoYXQgd2FzIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUKLQkgKiBsaXN0IG9mIGRlZmluZWQgcGFyYW1ldGVyIHR5cGUgaWRlbnRpZmllcnMuIFRoaXMgdmFsdWUgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdCBvZiBkZWZpbmVkIHBhcmFtZXRlciB0eXBlIGlkZW50aWZpZXJzIGRpZAotCSAqIG5vdCBjaGFuZ2UuCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHBhcmFtZXRlclR5cGVJZDsKLQotCS8qKgotCSAqIFRoZSBjb21tYW5kIG1hbmFnZXIgdGhhdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21tYW5kTWFuYWdlckV2ZW50PC9jb2RlPiBpbnN0YW5jZSB0byBkZXNjcmliZQotCSAqIGNoYW5nZXMgdG8gY29tbWFuZHMgYW5kL29yIGNhdGVnb3JpZXMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0aGF0IGNoYW5nZWQ7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gY29tbWFuZElkCi0JICogICAgICAgICAgICBUaGUgY29tbWFuZCBpZGVudGlmaWVyIHRoYXQgd2FzIGFkZGVkIG9yIHJlbW92ZWQ7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBjb21tYW5kSWRDaGFuZ2VkIGlzIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIEBwYXJhbSBjb21tYW5kSWRBZGRlZAotCSAqICAgICAgICAgICAgV2hldGhlciB0aGUgY29tbWFuZCBpZGVudGlmaWVyIGJlY2FtZSBkZWZpbmVkIChvdGhlcndpc2UsIGl0Ci0JICogICAgICAgICAgICBiZWNhbWUgdW5kZWZpbmVkKS4KLQkgKiBAcGFyYW0gY29tbWFuZElkQ2hhbmdlZAotCSAqICAgICAgICAgICAgV2hldGhlciB0aGUgbGlzdCBvZiBkZWZpbmVkIGNvbW1hbmQgaWRlbnRpZmllcnMgaGFzIGNoYW5nZWQuCi0JICogQHBhcmFtIGNhdGVnb3J5SWQKLQkgKiAgICAgICAgICAgIFRoZSBjYXRlZ29yeSBpZGVudGlmaWVyIHRoYXQgd2FzIGFkZGVkIG9yIHJlbW92ZWQ7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBjYXRlZ29yeUlkQ2hhbmdlZCBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJZEFkZGVkCi0JICogICAgICAgICAgICBXaGV0aGVyIHRoZSBjYXRlZ29yeSBpZGVudGlmaWVyIGJlY2FtZSBkZWZpbmVkIChvdGhlcndpc2UsIGl0Ci0JICogICAgICAgICAgICBiZWNhbWUgdW5kZWZpbmVkKS4KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJZENoYW5nZWQKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgdGhlIGxpc3Qgb2YgZGVmaW5lZCBjYXRlZ29yeSBpZGVudGlmaWVycyBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZE1hbmFnZXJFdmVudChmaW5hbCBDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlciwKLQkJCWZpbmFsIFN0cmluZyBjb21tYW5kSWQsIGZpbmFsIGJvb2xlYW4gY29tbWFuZElkQWRkZWQsCi0JCQlmaW5hbCBib29sZWFuIGNvbW1hbmRJZENoYW5nZWQsIGZpbmFsIFN0cmluZyBjYXRlZ29yeUlkLAotCQkJZmluYWwgYm9vbGVhbiBjYXRlZ29yeUlkQWRkZWQsIGZpbmFsIGJvb2xlYW4gY2F0ZWdvcnlJZENoYW5nZWQpIHsKLQkJaWYgKGNvbW1hbmRNYW5hZ2VyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLQkJCQkJIkFuIGV2ZW50IG11c3QgcmVmZXIgdG8gaXRzIGNvbW1hbmQgbWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoY29tbWFuZElkQ2hhbmdlZCAmJiAoY29tbWFuZElkID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0JCQkJCSJJZiB0aGUgbGlzdCBvZiBkZWZpbmVkIGNvbW1hbmRzIGNoYW5nZWQsIHRoZW4gdGhlIGFkZGVkL3JlbW92ZWQgY29tbWFuZCBtdXN0IGJlIG1lbnRpb25lZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoY2F0ZWdvcnlJZENoYW5nZWQgJiYgKGNhdGVnb3J5SWQgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLQkJCQkJIklmIHRoZSBsaXN0IG9mIGRlZmluZWQgY2F0ZWdvcmllcyBjaGFuZ2VkLCB0aGVuIHRoZSBhZGRlZC9yZW1vdmVkIGNhdGVnb3J5IG11c3QgYmUgbWVudGlvbmVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRoaXMuY29tbWFuZE1hbmFnZXIgPSBjb21tYW5kTWFuYWdlcjsKLQkJdGhpcy5jb21tYW5kSWQgPSBjb21tYW5kSWQ7Ci0JCXRoaXMuY2F0ZWdvcnlJZCA9IGNhdGVnb3J5SWQ7Ci0JCQotCQkvLyB0aGlzIGNvbnN0cnVjdG9yIG9ubHkgd29ya3MgZm9yIGNoYW5nZXMgdG8gY29tbWFuZHMgYW5kIGNhdGVnb3JpZXMKLQkJdGhpcy5wYXJhbWV0ZXJUeXBlSWQgPSBudWxsOwotCi0JCWludCBjaGFuZ2VkVmFsdWVzID0gMDsKLQkJaWYgKGNhdGVnb3J5SWRDaGFuZ2VkICYmIGNhdGVnb3J5SWRBZGRlZCkgewotCQkJY2hhbmdlZFZhbHVlcyB8PSBDSEFOR0VEX0NBVEVHT1JZX0RFRklORUQ7Ci0JCX0KLQkJaWYgKGNvbW1hbmRJZENoYW5nZWQgJiYgY29tbWFuZElkQWRkZWQpIHsKLQkJCWNoYW5nZWRWYWx1ZXMgfD0gQ0hBTkdFRF9DT01NQU5EX0RFRklORUQ7Ci0JCX0KLQkJdGhpcy5jaGFuZ2VkVmFsdWVzID0gY2hhbmdlZFZhbHVlczsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21tYW5kTWFuYWdlckV2ZW50PC9jb2RlPiBpbnN0YW5jZSB0byBkZXNjcmliZQotCSAqIGNoYW5nZXMgdG8gY29tbWFuZCBwYXJhbWV0ZXIgdHlwZXMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0aGF0IGNoYW5nZWQ7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZUlkCi0JICogICAgICAgICAgICBUaGUgY29tbWFuZCBwYXJhbWV0ZXIgdHlwZSBpZGVudGlmaWVyIHRoYXQgd2FzIGFkZGVkIG9yCi0JICogICAgICAgICAgICByZW1vdmVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgICAgcGFyYW1ldGVyVHlwZUlkQ2hhbmdlZCBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZUlkQWRkZWQKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgdGhlIHBhcmFtZXRlciB0eXBlIGlkZW50aWZpZXIgYmVjYW1lIGRlZmluZWQKLQkgKiAgICAgICAgICAgIChvdGhlcndpc2UsIGl0IGJlY2FtZSB1bmRlZmluZWQpLgotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlSWRDaGFuZ2VkCi0JICogICAgICAgICAgICBXaGV0aGVyIHRoZSBsaXN0IG9mIGRlZmluZWQgcGFyYW1ldGVyIHR5cGUgaWRlbnRpZmllcnMgaGFzCi0JICogICAgICAgICAgICBjaGFuZ2VkLgotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZE1hbmFnZXJFdmVudChmaW5hbCBDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlciwKLQkJCWZpbmFsIFN0cmluZyBwYXJhbWV0ZXJUeXBlSWQsIGZpbmFsIGJvb2xlYW4gcGFyYW1ldGVyVHlwZUlkQWRkZWQsCi0JCQlmaW5hbCBib29sZWFuIHBhcmFtZXRlclR5cGVJZENoYW5nZWQpIHsKLQotCQlpZiAoY29tbWFuZE1hbmFnZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotCQkJCQkiQW4gZXZlbnQgbXVzdCByZWZlciB0byBpdHMgY29tbWFuZCBtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChwYXJhbWV0ZXJUeXBlSWRDaGFuZ2VkICYmIChwYXJhbWV0ZXJUeXBlSWQgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLQkJCQkJIklmIHRoZSBsaXN0IG9mIGRlZmluZWQgY29tbWFuZCBwYXJhbWV0ZXIgdHlwZXMgY2hhbmdlZCwgdGhlbiB0aGUgYWRkZWQvcmVtb3ZlZCBwYXJhbWV0ZXIgdHlwZSBtdXN0IGJlIG1lbnRpb25lZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0aGlzLmNvbW1hbmRNYW5hZ2VyID0gY29tbWFuZE1hbmFnZXI7Ci0JCXRoaXMuY29tbWFuZElkID0gbnVsbDsKLQkJdGhpcy5jYXRlZ29yeUlkID0gbnVsbDsKLQotCQl0aGlzLnBhcmFtZXRlclR5cGVJZCA9IHBhcmFtZXRlclR5cGVJZDsKLQotCQlpbnQgY2hhbmdlZFZhbHVlcyA9IDA7Ci0JCWlmIChwYXJhbWV0ZXJUeXBlSWRDaGFuZ2VkICYmIHBhcmFtZXRlclR5cGVJZEFkZGVkKSB7Ci0JCQljaGFuZ2VkVmFsdWVzIHw9IENIQU5HRURfUEFSQU1FVEVSX1RZUEVfREVGSU5FRDsKLQkJfQotCi0JCXRoaXMuY2hhbmdlZFZhbHVlcyA9IGNoYW5nZWRWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2F0ZWdvcnkgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNhdGVnb3J5IGlkZW50aWZpZXIgdGhhdCB3YXMgYWRkZWQgb3IgcmVtb3ZlZDsgbWF5IGJlCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldENhdGVnb3J5SWQoKSB7Ci0JCXJldHVybiBjYXRlZ29yeUlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbW1hbmQgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkOyBtYXkgYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q29tbWFuZElkKCkgewotCQlyZXR1cm4gY29tbWFuZElkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBjaGFuZ2VkLiBHdWFyYW50ZWVkIG5vdCB0byBiZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIENvbW1hbmRNYW5hZ2VyIGdldENvbW1hbmRNYW5hZ2VyKCkgewotCQlyZXR1cm4gY29tbWFuZE1hbmFnZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgcGFyYW1ldGVyIHR5cGUgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbW1hbmQgcGFyYW1ldGVyIHR5cGUgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkOwotCSAqICAgICAgICAgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqICAgICAgICAgCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGFyYW1ldGVyVHlwZUlkKCkgewotCQlyZXR1cm4gcGFyYW1ldGVyVHlwZUlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgbGlzdCBvZiBkZWZpbmVkIGNhdGVnb3J5IGlkZW50aWZpZXJzIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpc3Qgb2YgY2F0ZWdvcnkgaWRlbnRpZmllcnMgaGFzCi0JICogICAgICAgICBjaGFuZ2VkOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2F0ZWdvcnlDaGFuZ2VkKCkgewotCQlyZXR1cm4gKGNhdGVnb3J5SWQgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjYXRlZ29yeSBpZGVudGlmaWVyIGJlY2FtZSBkZWZpbmVkLiBPdGhlcndpc2UsIHRoZQotCSAqIGNhdGVnb3J5IGlkZW50aWZpZXIgYmVjYW1lIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjYXRlZ29yeSBpZGVudGlmaWVyIGJlY2FtZSBkZWZpbmVkOwotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjYXRlZ29yeSBpZGVudGlmaWVyIGJlY2FtZSB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXRlZ29yeURlZmluZWQoKSB7Ci0JCXJldHVybiAoKChjaGFuZ2VkVmFsdWVzICYgQ0hBTkdFRF9DQVRFR09SWV9ERUZJTkVEKSAhPSAwKSAmJiAoY2F0ZWdvcnlJZCAhPSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsaXN0IG9mIGRlZmluZWQgY29tbWFuZCBpZGVudGlmaWVycyBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsaXN0IG9mIGNvbW1hbmQgaWRlbnRpZmllcnMgaGFzCi0JICogICAgICAgICBjaGFuZ2VkOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ29tbWFuZENoYW5nZWQoKSB7Ci0JCXJldHVybiAoY29tbWFuZElkICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tbWFuZCBpZGVudGlmaWVyIGJlY2FtZSBkZWZpbmVkLiBPdGhlcndpc2UsIHRoZQotCSAqIGNvbW1hbmQgaWRlbnRpZmllciBiZWNhbWUgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbW1hbmQgaWRlbnRpZmllciBiZWNhbWUgZGVmaW5lZDsKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY29tbWFuZCBpZGVudGlmaWVyIGJlY2FtZSB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb21tYW5kRGVmaW5lZCgpIHsKLQkJcmV0dXJuICgoKGNoYW5nZWRWYWx1ZXMgJiBDSEFOR0VEX0NPTU1BTkRfREVGSU5FRCkgIT0gMCkgJiYgKGNvbW1hbmRJZCAhPSBudWxsKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgbGlzdCBvZiBkZWZpbmVkIGNvbW1hbmQgcGFyYW1ldGVyIHR5cGUgaWRlbnRpZmllcnMKLQkgKiBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsaXN0IG9mIGNvbW1hbmQgcGFyYW1ldGVyIHR5cGUKLQkgKiAgICAgICAgIGlkZW50aWZpZXJzIGhhcyBjaGFuZ2VkOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1BhcmFtZXRlclR5cGVDaGFuZ2VkKCkgewotCQlyZXR1cm4gKHBhcmFtZXRlclR5cGVJZCAhPSBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21tYW5kIHBhcmFtZXRlciB0eXBlIGlkZW50aWZpZXIgYmVjYW1lIGRlZmluZWQuCi0JICogT3RoZXJ3aXNlLCB0aGUgY29tbWFuZCBwYXJhbWV0ZXIgdHlwZSBpZGVudGlmaWVyIGJlY2FtZSB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29tbWFuZCBwYXJhbWV0ZXIgdHlwZSBpZGVudGlmaWVyCi0JICogICAgICAgICBiZWNhbWUgZGVmaW5lZDsgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjb21tYW5kIHBhcmFtZXRlcgotCSAqICAgICAgICAgdHlwZSBpZGVudGlmaWVyIGJlY2FtZSB1bmRlZmluZWQuCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzUGFyYW1ldGVyVHlwZURlZmluZWQoKSB7Ci0JCXJldHVybiAoKChjaGFuZ2VkVmFsdWVzICYgQ0hBTkdFRF9QQVJBTUVURVJfVFlQRV9ERUZJTkVEKSAhPSAwKSAmJiAocGFyYW1ldGVyVHlwZUlkICE9IG51bGwpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvRXhlY3V0aW9uRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9FeGVjdXRpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGI3ZGNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9FeGVjdXRpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Ob3REZWZpbmVkRXhjZXB0aW9uOwotCi0vKioKLSAqIDxwPgotICogVGhlIGRhdGEgb2JqZWN0IHRvIHBhc3MgdG8gdGhlIGNvbW1hbmQgKGFuZCBpdHMgaGFuZGxlcikgYXMgaXQgZXhlY3V0ZXMuIFRoaXMKLSAqIGNhcnJpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgdGhlCi0gKiBhcHBsaWNhdGlvbiBjb250ZXh0IGluIHdoaWNoIHRoZSBjb21tYW5kIHdhcyBleGVjdXRlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogQW4gZXhlY3V0aW9uIGV2ZW50IGNhcnJpZXMgdGhyZWUgYmxvY2tzIG9mIGRhdGE6IHRoZSBwYXJhbWV0ZXJzLCB0aGUgdHJpZ2dlciwKLSAqIGFuZCB0aGUgYXBwbGljYXRpb24gY29udGV4dC4gSG93IHRoZXNlIGJsb2NrcyBhcmUgdXNlZCBpcyBhcHBsaWNhdGlvbgotICogZGVwZW5kZW50LiBJbiB0aGUgRWNsaXBzZSB3b3JrYmVuY2gsIHRoZSB0cmlnZ2VyIGlzIGFuIFNXVCBldmVudCwgYW5kIHRoZQotICogYXBwbGljYXRpb24gY29udGV4dCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VsZWN0aW9uIGFuZCBhY3RpdmUgcGFydC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXhlY3V0aW9uRXZlbnQgewotCi0JLyoqCi0JICogVGhlIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbiBhdCB0aGUgdGltZSB0aGUgZXhlY3V0aW9uIHdhcyB0cmlnZ2VyZWQuIEluCi0JICogdGhlIEVjbGlwc2Ugd29ya2JlbmNoLCB0aGlzIG1pZ2h0IGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjdGl2ZQotCSAqIHBhcnQgb2YgdGhlIGFjdGl2ZSBzZWxlY3Rpb24gKGZvciBleGFtcGxlKS4gVGhpcyB2YWx1ZSBtYXkgYmUKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBhcHBsaWNhdGlvbkNvbnRleHQ7Ci0KLQkvKioKLQkgKiBUaGUgY29tbWFuZCBiZWluZyBleGVjdXRlZC4gVGhpcyB2YWx1ZSBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb21tYW5kIGNvbW1hbmQ7Ci0KLQkvKioKLQkgKiBUaGUgcGFyYW1ldGVycyB0byBxdWFsaWZ5IHRoZSBleGVjdXRpb24uIEZvciBoYW5kbGVycyB0aGF0IG5vcm1hbGx5Ci0JICogcHJvbXB0IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCB0aGVzZSBjYW4gYmUgdXNlZCB0byBhdm9pZCBwcm9tcHRpbmcuCi0JICogVGhpcyB2YWx1ZSBtYXkgYmUgZW1wdHksIGJ1dCBpdCBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCBwYXJhbWV0ZXJzOwotCi0JLyoqCi0JICogVGhlIG9iamVjdCB0aGF0IHRyaWdnZXJlZCB0aGUgZXhlY3V0aW9uLiBJbiBhbiBldmVudC1kcml2ZW4gYXJjaGl0ZWN0dXJlLAotCSAqIHRoaXMgaXMgdHlwaWNhbGx5IGp1c3QgYW5vdGhlciBldmVudC4gSW4gdGhlIEVjbGlwc2Ugd29ya2JlbmNoLCB0aGlzIGlzCi0JICogdHlwaWNhbGx5IGFuIFNXVCBldmVudC4gVGhpcyB2YWx1ZSBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgdHJpZ2dlcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+RXhlY3V0aW9uRXZlbnQ8L2NvZGU+IHdpdGggbm8KLQkgKiBwYXJhbWV0ZXJzLCBubyB0cmlnZ2VyIGFuZCBubyBhcHBsaWNhdGlvbiBjb250ZXh0LiBUaGlzIGlzIGp1c3QgYQotCSAqIGNvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIEV4ZWN1dGlvbkV2ZW50KCkgewotCQl0aGlzKG51bGwsIENvbGxlY3Rpb25zLkVNUFRZX01BUCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5FeGVjdXRpb25FdmVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmFtZXRlcnMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIHRvIHF1YWxpZnkgdGhlIGV4ZWN1dGlvbjsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIG11c3QgYmUgYSBtYXAgb2YgcGFyYW1ldGVyIG5hbWVzICg8Y29kZT5TdHJpbmc8L2NvZGU+KQotCSAqICAgICAgICAgICAgdG8gcGFyYW1ldGVyIHZhbHVlcyAoPGNvZGU+U3RyaW5nPC9jb2RlPikuCi0JICogQHBhcmFtIHRyaWdnZXIKLQkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdGhhdCB0cmlnZ2VyZWQgdGhlIGV4ZWN1dGlvbjsgbWF5IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gYXBwbGljYXRpb25Db250ZXh0Ci0JICogICAgICAgICAgICBUaGUgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uIGF0IHRoZSB0aW1lIHRoZSBleGVjdXRpb24gd2FzCi0JICogICAgICAgICAgICB0cmlnZ2VyZWQ7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAZGVwcmVjYXRlZCB1c2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgRXhlY3V0aW9uRXZlbnQjRXhlY3V0aW9uRXZlbnQoQ29tbWFuZCwgTWFwLCBPYmplY3QsIE9iamVjdCl9Ci0JICovCi0JcHVibGljIEV4ZWN1dGlvbkV2ZW50KGZpbmFsIE1hcCBwYXJhbWV0ZXJzLCBmaW5hbCBPYmplY3QgdHJpZ2dlciwKLQkJCWZpbmFsIE9iamVjdCBhcHBsaWNhdGlvbkNvbnRleHQpIHsKLQkJdGhpcyhudWxsLCBwYXJhbWV0ZXJzLCB0cmlnZ2VyLCBhcHBsaWNhdGlvbkNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+RXhlY3V0aW9uRXZlbnQ8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICBUaGUgY29tbWFuZCBiZWluZyBleGVjdXRlZDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBwYXJhbWV0ZXJzCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyB0byBxdWFsaWZ5IHRoZSBleGVjdXRpb247IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcyBtdXN0IGJlIGEgbWFwIG9mIHBhcmFtZXRlciBuYW1lcyAoPGNvZGU+U3RyaW5nPC9jb2RlPikKLQkgKiAgICAgICAgICAgIHRvIHBhcmFtZXRlciB2YWx1ZXMgKDxjb2RlPlN0cmluZzwvY29kZT4pLgotCSAqIEBwYXJhbSB0cmlnZ2VyCi0JICogICAgICAgICAgICBUaGUgb2JqZWN0IHRoYXQgdHJpZ2dlcmVkIHRoZSBleGVjdXRpb247IG1heSBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGFwcGxpY2F0aW9uQ29udGV4dAotCSAqICAgICAgICAgICAgVGhlIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbiBhdCB0aGUgdGltZSB0aGUgZXhlY3V0aW9uIHdhcwotCSAqICAgICAgICAgICAgdHJpZ2dlcmVkOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBFeGVjdXRpb25FdmVudChmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIE1hcCBwYXJhbWV0ZXJzLAotCQkJZmluYWwgT2JqZWN0IHRyaWdnZXIsIGZpbmFsIE9iamVjdCBhcHBsaWNhdGlvbkNvbnRleHQpIHsKLQkJaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotCQkJCQkiQW4gZXhlY3V0aW9uIGV2ZW50IG11c3QgaGF2ZSBhIG5vbi1udWxsIG1hcCBvZiBwYXJhbWV0ZXJzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCXRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7Ci0JCXRoaXMudHJpZ2dlciA9IHRyaWdnZXI7Ci0JCXRoaXMuYXBwbGljYXRpb25Db250ZXh0ID0gYXBwbGljYXRpb25Db250ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbiBhdCB0aGUgdGltZSB0aGUgZXhlY3V0aW9uIHdhcwotCSAqIHRyaWdnZXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBhcHBsaWNhdGlvbiBjb250ZXh0OyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbkNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tbWFuZCBiZWluZyBleGVjdXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb21tYW5kIGJlaW5nIGV4ZWN1dGVkLgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgZmluYWwgQ29tbWFuZCBnZXRDb21tYW5kKCkgewotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIHdpdGgKLQkgKiB0aGUgcHJvdmlkZWQgaWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIHRoZSBzY29wZSBvZiBhbgotCSAqIHtAbGluayBJSGFuZGxlciNleGVjdXRlKEV4ZWN1dGlvbkV2ZW50KX0gbWV0aG9kLCBzbyBhbnkgcHJvYmxlbSBnZXR0aW5nCi0JICogdGhlIG9iamVjdCB2YWx1ZSBjYXVzZXMgPGNvZGU+RXhlY3V0aW9uRXhjZXB0aW9uPC9jb2RlPiB0byBiZSB0aHJvd24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJhbWV0ZXJJZAotCSAqICAgICAgICAgICAgVGhlIGlkIG9mIGEgcGFyYW1ldGVyIHRvIHJldHJpZXZlIHRoZSBvYmplY3QgdmFsdWUgb2YuCi0JICogQHJldHVybiBUaGUgb2JqZWN0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgd2l0aCB0aGUgcHJvdmlkZWQgaWQuCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgcGFyYW1ldGVyIG9iamVjdCB2YWx1ZSBjb3VsZCBub3QgYmUgb2J0YWluZWQgZm9yIGFueQotCSAqICAgICAgICAgICAgIHJlYXNvbgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldE9iamVjdFBhcmFtZXRlckZvckV4ZWN1dGlvbihmaW5hbCBTdHJpbmcgcGFyYW1ldGVySWQpCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigKLQkJCQkJIk5vIGNvbW1hbmQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXhlY3V0aW9uIGV2ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlmaW5hbCBQYXJhbWV0ZXJUeXBlIHBhcmFtZXRlclR5cGUgPSBjb21tYW5kCi0JCQkJCS5nZXRQYXJhbWV0ZXJUeXBlKHBhcmFtZXRlcklkKTsKLQkJCWlmIChwYXJhbWV0ZXJUeXBlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKAotCQkJCQkJIkNvbW1hbmQgZG9lcyBub3QgaGF2ZSBhIHBhcmFtZXRlciB0eXBlIGZvciB0aGUgZ2l2ZW4gcGFyYW1ldGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZpbmFsIEFic3RyYWN0UGFyYW1ldGVyVmFsdWVDb252ZXJ0ZXIgdmFsdWVDb252ZXJ0ZXIgPSBwYXJhbWV0ZXJUeXBlCi0JCQkJCS5nZXRWYWx1ZUNvbnZlcnRlcigpOwotCQkJaWYgKHZhbHVlQ29udmVydGVyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKAotCQkJCQkJIkNvbW1hbmQgZG9lcyBub3QgaGF2ZSBhIHZhbHVlIGNvbnZlcnRlciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmaW5hbCBTdHJpbmcgc3RyaW5nVmFsdWUgPSBnZXRQYXJhbWV0ZXIocGFyYW1ldGVySWQpOwotCQkJZmluYWwgT2JqZWN0IG9iamVjdFZhbHVlID0gdmFsdWVDb252ZXJ0ZXIKLQkJCQkJLmNvbnZlcnRUb09iamVjdChzdHJpbmdWYWx1ZSk7Ci0JCQlyZXR1cm4gb2JqZWN0VmFsdWU7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiQ29tbWFuZCBpcyBub3QgZGVmaW5lZCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKGZpbmFsIFBhcmFtZXRlclZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKAotCQkJCQkiVGhlIHBhcmFtZXRlciBzdHJpbmcgY291bGQgbm90IGJlIGNvbnZlcnRlZCB0byBhbiBvYmplY3QiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyYW1ldGVySWQKLQkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgcGFyYW1ldGVyIHRvIHJldHJpZXZlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgcGFyYW1ldGVyIHZhbHVlOyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGFyYW1ldGVyIGNhbm5vdAotCSAqICAgICAgICAgYmUgZm91bmQuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIHBhcmFtZXRlcklkKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChwYXJhbWV0ZXJJZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgb2YgdGhlIHBhcmFtZXRlcnMuCi0JICogCi0JICogQHJldHVybiBUaGUgcGFyYW1ldGVyczsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4sIGJ1dCBtYXkgYmUgZW1wdHkuCi0JICovCi0JcHVibGljIGZpbmFsIE1hcCBnZXRQYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gcGFyYW1ldGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgdGhhdCB0cmlnZ2VyZWQgdGhlIGV4ZWN1dGlvbgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHRyaWdnZXI7IDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIHdhcyBubyB0cmlnZ2VyLgotCSAqLwotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0VHJpZ2dlcigpIHsKLQkJcmV0dXJuIHRyaWdnZXI7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGV4ZWN1dGlvbiBldmVudCAtLSBmb3IgZGVidWdnaW5nCi0JICogcHVycG9zZXMgb25seS4gVGhpcyBzdHJpbmcgc2hvdWxkIG5vdCBiZSBzaG93biB0byBhbiBlbmQgdXNlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb247IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN0cmluZ0J1ZmZlci5hcHBlbmQoIkV4ZWN1dGlvbkV2ZW50KCIpOyAvLyROT04tTkxTLTEkCi0JCXN0cmluZ0J1ZmZlci5hcHBlbmQoY29tbWFuZCk7Ci0JCXN0cmluZ0J1ZmZlci5hcHBlbmQoJywnKTsKLQkJc3RyaW5nQnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJzKTsKLQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnLCcpOwotCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHRyaWdnZXIpOwotCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0JCXN0cmluZ0J1ZmZlci5hcHBlbmQoYXBwbGljYXRpb25Db250ZXh0KTsKLQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0V4ZWN1dGlvbkV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0V4ZWN1dGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVjODkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9FeGVjdXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYW4gZXhjZXB0aW9uIG9jY3VyZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgYSBjb21tYW5kLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFeGVjdXRpb25FeGNlcHRpb24gZXh0ZW5kcyBDb21tYW5kRXhjZXB0aW9uIHsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTgxMzAyNjI3Njc0NDgxMjBMOwotCi0gICAgLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBFeGVjdXRpb25FeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UKLSAgICAgKiBhbmQgY2F1c2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIEV4ZWN1dGlvbkV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSGFuZGxlckV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSGFuZGxlckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTBmMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0hhbmRsZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5BYnN0cmFjdEJpdFNldEV2ZW50OwotCi0vKioKLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZGVzY3JpYmVzIGNoYW5nZXMgdG8gYW4gaW5zdGFuY2Ugb2YKLSAqIDxjb2RlPklIYW5kbGVyPC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICogQHNlZSBJSGFuZGxlckxpc3RlbmVyI2hhbmRsZXJDaGFuZ2VkKEhhbmRsZXJFdmVudCkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEhhbmRsZXJFdmVudCBleHRlbmRzIEFic3RyYWN0Qml0U2V0RXZlbnQgewotCi0JLyoqCi0JICogVGhlIGJpdCB1c2VkIHRvIHJlcHJlc2VudCB3aGV0aGVyIHRoZSBoYW5kbGVyIGhhcyBjaGFuZ2VkIGl0cyBlbmFibGVkCi0JICogc3RhdGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIQU5HRURfRU5BQkxFRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgYml0IHVzZWQgdG8gcmVwcmVzZW50IHdoZXRoZXIgdGhlIGhhbmRsZXIgaGFzIGNoYW5nZWQgaXRzIGhhbmRsZWQKLQkgKiBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRF9IQU5ETEVEID0gMSA8PCAxOwotCi0JLyoqCi0JICogVGhlIGhhbmRsZXIgdGhhdCBjaGFuZ2VkOyB0aGlzIHZhbHVlIGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgSUhhbmRsZXIgaGFuZGxlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqICAgICAgICAgICAgdGhlIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBjaGFuZ2VkOyBtdXN0IG5vdCBiZQotICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGVuYWJsZWRDaGFuZ2VkCi0JICogICAgICAgICAgICBXaGV0aGVyIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBoYW5kbGVyIGhhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBoYW5kbGVkQ2hhbmdlZAotCSAqICAgICAgICAgICAgV2hldGhlciB0aGUgaGFuZGxlZCBzdGF0ZSBvZiB0aGUgaGFuZGxlciBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgSGFuZGxlckV2ZW50KGZpbmFsIElIYW5kbGVyIGhhbmRsZXIsIGZpbmFsIGJvb2xlYW4gZW5hYmxlZENoYW5nZWQsCi0JCQlmaW5hbCBib29sZWFuIGhhbmRsZWRDaGFuZ2VkKSB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLQotCQlpZiAoZW5hYmxlZENoYW5nZWQpIHsKLQkJCWNoYW5nZWRWYWx1ZXMgfD0gQ0hBTkdFRF9FTkFCTEVEOwotCQl9Ci0JCWlmIChoYW5kbGVkQ2hhbmdlZCkgewotCQkJY2hhbmdlZFZhbHVlcyB8PSBDSEFOR0VEX0hBTkRMRUQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgY2hhbmdlZC4gR3VhcmFudGVlZCBub3QgdG8gYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBJSGFuZGxlciBnZXRIYW5kbGVyKCkgewotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBlbmFibGVkIHByb3BlcnR5IGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiwgaWZmIHRoZSBlbmFibGVkIHByb3BlcnR5IGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkQ2hhbmdlZCgpIHsKLQkJcmV0dXJuICgoY2hhbmdlZFZhbHVlcyAmIENIQU5HRURfRU5BQkxFRCkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgaGFuZGxlZCBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4sIGlmZiB0aGUgaGFuZGxlZCBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSGFuZGxlZENoYW5nZWQoKSB7Ci0JCXJldHVybiAoKGNoYW5nZWRWYWx1ZXMgJiBDSEFOR0VEX0hBTkRMRUQpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JQ2F0ZWdvcnlMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lDYXRlZ29yeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDFiNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lDYXRlZ29yeUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kczsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCBieSBjbGllbnRzIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uCi0gKiBvZiBjaGFuZ2VzIHRvIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiA8Y29kZT5DYXRlZ29yeTwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKiBAc2VlIENhdGVnb3J5I2FkZENhdGVnb3J5TGlzdGVuZXIoSUNhdGVnb3J5TGlzdGVuZXIpCi0gKiBAc2VlIENhdGVnb3J5I3JlbW92ZUNhdGVnb3J5TGlzdGVuZXIoSUNhdGVnb3J5TGlzdGVuZXIpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGVnb3J5TGlzdGVuZXIgewotCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIG9mIGFuIGluc3RhbmNlIG9mCi0JICogPGNvZGU+Q2F0ZWdvcnk8L2NvZGU+IGhhdmUgY2hhbmdlZC4gU3BlY2lmaWMgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGluCi0JICogdGhlIDxjb2RlPkNhdGVnb3J5RXZlbnQ8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeUV2ZW50Ci0JICogICAgICAgICAgICB0aGUgY2F0ZWdvcnkgZXZlbnQuIEd1YXJhbnRlZWQgbm90IHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXZvaWQgY2F0ZWdvcnlDaGFuZ2VkKENhdGVnb3J5RXZlbnQgY2F0ZWdvcnlFdmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSUNvbW1hbmRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lDb21tYW5kTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxYmMwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSUNvbW1hbmRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7Ci0KLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgYnkgY2xpZW50cyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbgotICogb2YgY2hhbmdlcyB0byBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2YgPGNvZGU+Q29tbWFuZDwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKiBAc2VlIENvbW1hbmQjYWRkQ29tbWFuZExpc3RlbmVyKElDb21tYW5kTGlzdGVuZXIpCi0gKiBAc2VlIENvbW1hbmQjcmVtb3ZlQ29tbWFuZExpc3RlbmVyKElDb21tYW5kTGlzdGVuZXIpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbW1hbmRMaXN0ZW5lciB7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGF0IG9uZSBvciBtb3JlIHByb3BlcnRpZXMgb2YgYW4gaW5zdGFuY2Ugb2YKLSAgICAgKiA8Y29kZT5Db21tYW5kPC9jb2RlPiBoYXZlIGNoYW5nZWQuIFNwZWNpZmljIGRldGFpbHMgYXJlIGRlc2NyaWJlZCBpbgotICAgICAqIHRoZSA8Y29kZT5Db21tYW5kRXZlbnQ8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21tYW5kRXZlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIGV2ZW50LiBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICB2b2lkIGNvbW1hbmRDaGFuZ2VkKENvbW1hbmRFdmVudCBjb21tYW5kRXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lDb21tYW5kTWFuYWdlckxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSUNvbW1hbmRNYW5hZ2VyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2NjVkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSUNvbW1hbmRNYW5hZ2VyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi0vKioKLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24KLSAqIG9mIGNoYW5nZXMgdG8gb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mIDxjb2RlPklDb21tYW5kTWFuYWdlcjwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKiBAc2VlIENvbW1hbmRNYW5hZ2VyI2FkZENvbW1hbmRNYW5hZ2VyTGlzdGVuZXIoSUNvbW1hbmRNYW5hZ2VyTGlzdGVuZXIpCi0gKiBAc2VlIENvbW1hbmRNYW5hZ2VyI3JlbW92ZUNvbW1hbmRNYW5hZ2VyTGlzdGVuZXIoSUNvbW1hbmRNYW5hZ2VyTGlzdGVuZXIpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbW1hbmRNYW5hZ2VyTGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIG9mIGFuIGluc3RhbmNlIG9mCi0gICAgICogPGNvZGU+SUNvbW1hbmRNYW5hZ2VyPC9jb2RlPiBoYXZlIGNoYW5nZWQuIFNwZWNpZmljIGRldGFpbHMgYXJlCi0gICAgICogZGVzY3JpYmVkIGluIHRoZSA8Y29kZT5Db21tYW5kTWFuYWdlckV2ZW50PC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tbWFuZE1hbmFnZXJFdmVudAotICAgICAqICAgICAgICAgICAgdGhlIGNvbW1hbmRNYW5hZ2VyIGV2ZW50LiBHdWFyYW50ZWVkIG5vdCB0byBiZQotICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgdm9pZCBjb21tYW5kTWFuYWdlckNoYW5nZWQoQ29tbWFuZE1hbmFnZXJFdmVudCBjb21tYW5kTWFuYWdlckV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JRXhlY3V0aW9uTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JRXhlY3V0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhNDM0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSUV4ZWN1dGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7Ci0KLS8qKgotICogPHA+Ci0gKiBBIGxpc3RlbmVyIHRvIHRoZSBleGVjdXRpb24gb2YgY29tbWFuZHMuIFRoaXMgbGlzdGVuZXIgd2lsbCBiZSBub3RpZmllZCBpZiBhCi0gKiBjb21tYW5kIGlzIGFib3V0IHRvIGV4ZWN1dGUsIGFuZCB3aGVuIHRoYXQgZXhlY3V0aW9uIGNvbXBsZXRlcy4gSXQgaXMgbm90Ci0gKiBwb3NzaWJsZSBmb3IgdGhlIGxpc3RlbmVyIHRvIHByZXZlbnQgdGhlIGV4ZWN1dGlvbiwgb25seSB0byByZXNwb25kIHRvIGl0IGluCi0gKiBzb21lIHdheS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeGVjdXRpb25MaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgbGlzdGVuZXIgdGhhdCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGV4ZWN1dGUgYSBjb21tYW5kIHdpdGgKLQkgKiBubyBoYW5kbGVyLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIGNvbW1hbmQgdGhhdCBpcyBub3QgaGFuZGxlZDsgbmV2ZXIKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RIYW5kbGVkKFN0cmluZyBjb21tYW5kSWQsIE5vdEhhbmRsZWRFeGNlcHRpb24gZXhjZXB0aW9uKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBsaXN0ZW5lciB0aGF0IGEgY29tbWFuZCBoYXMgZmFpbGVkIHRvIGNvbXBsZXRlIGV4ZWN1dGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZElkCi0JICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29tbWFuZCB0aGF0IGhhcyBleGVjdXRlZDsgbmV2ZXIKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhhdCBvY2N1cnJlZDsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcG9zdEV4ZWN1dGVGYWlsdXJlKFN0cmluZyBjb21tYW5kSWQsCi0JCQlFeGVjdXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBsaXN0ZW5lciB0aGF0IGEgY29tbWFuZCBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbgotCSAqIHN1Y2Nlc3NmdWxseS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZElkCi0JICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29tbWFuZCB0aGF0IGhhcyBleGVjdXRlZDsgbmV2ZXIKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSByZXR1cm5WYWx1ZQotCSAqICAgICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBjb21tYW5kOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcG9zdEV4ZWN1dGVTdWNjZXNzKFN0cmluZyBjb21tYW5kSWQsIE9iamVjdCByZXR1cm5WYWx1ZSk7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgbGlzdGVuZXIgdGhhdCBhIGNvbW1hbmQgaXMgYWJvdXQgdG8gZXhlY3V0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZElkCi0JICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29tbWFuZCB0aGF0IGlzIGFib3V0IHRvIGV4ZWN1dGUsIG5ldmVyCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBldmVudCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqICAgICAgICAgICAgbWV0aG9kOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVFeGVjdXRlKFN0cmluZyBjb21tYW5kSWQsIEV4ZWN1dGlvbkV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JRXhlY3V0aW9uTGlzdGVuZXJXaXRoQ2hlY2tzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSUV4ZWN1dGlvbkxpc3RlbmVyV2l0aENoZWNrcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTQ4Y2EzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JRXhlY3V0aW9uTGlzdGVuZXJXaXRoQ2hlY2tzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Ob3REZWZpbmVkRXhjZXB0aW9uOwotCi0vKioKLSAqIDxwPgotICogQSBsaXN0ZW5lciB0byB0aGUgZXhlY3V0aW9uIG9mIGNvbW1hbmRzLiBUaGlzIGxpc3RlbmVyIHdpbGwgYmUgbm90aWZpZWQgaWYKLSAqIHNvbWVvbmUgdHJpZXMgdG8gZXhlY3V0ZSBhIGNvbW1hbmQgYW5kIGl0IGlzIG5vdCBlbmFibGVkIG9yIG5vdCBkZWZpbmVkLiBUaGUKLSAqIGxpc3RlbmVyIGFsc28gYmUgbm90aWZpZWQgaWYgYSBjb21tYW5kIGlzIGFib3V0IHRvIGV4ZWN1dGUsIGFuZCB3aGVuIHRoYXQKLSAqIGV4ZWN1dGlvbiBjb21wbGV0ZXMuIEl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIGxpc3RlbmVyIHRvIHByZXZlbnQgdGhlCi0gKiBleGVjdXRpb24sIG9ubHkgdG8gcmVzcG9uZCB0byBpdCBpbiBzb21lIHdheS4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50LCBidXQgbXVzdCBub3QgZXh0ZW5kLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4ZWN1dGlvbkxpc3RlbmVyV2l0aENoZWNrcyBleHRlbmRzIElFeGVjdXRpb25MaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgbGlzdGVuZXIgdGhhdCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGV4ZWN1dGUgYSBjb21tYW5kIHRoYXQKLQkgKiBpcyBub3QgZGVmaW5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZElkCi0JICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiBjb21tYW5kIHRoYXQgaXMgbm90IGRlZmluZWQ7IG5ldmVyCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhhdCBvY2N1cnJlZDsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgbm90RGVmaW5lZChTdHJpbmcgY29tbWFuZElkLCBOb3REZWZpbmVkRXhjZXB0aW9uIGV4Y2VwdGlvbik7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgbGlzdGVuZXIgdGhhdCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGV4ZWN1dGUgYSBjb21tYW5kIHRoYXQKLQkgKiBpcyBkaXNhYmxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZElkCi0JICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiBjb21tYW5kIHRoYXQgaXMgbm90IGVuYWJsZWQ7IG5ldmVyCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhhdCBvY2N1cnJlZDsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgbm90RW5hYmxlZChTdHJpbmcgY29tbWFuZElkLCBOb3RFbmFibGVkRXhjZXB0aW9uIGV4Y2VwdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTYyZmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7Ci0KLQotLyoqCi0gKiBBIGhhbmRsZXIgaXMgdGhlIHBsdWdnYWJsZSBwaWVjZSBvZiBhIGNvbW1hbmQgdGhhdCBoYW5kbGVzIGV4ZWN1dGlvbi4gRWFjaAotICogY29tbWFuZCBjYW4gaGF2ZSB6ZXJvIG9yIG1vcmUgaGFuZGxlcnMgYXNzb2NpYXRlZCB3aXRoIGl0IChpbiBnZW5lcmFsKSwgb2YKLSAqIHdoaWNoIG9ubHkgb25lIHdpbGwgYmUgYWN0aXZlIGF0IGFueSBnaXZlbiBtb21lbnQgaW4gdGltZS4gV2hlbiB0aGUgY29tbWFuZAotICogaXMgYXNrZWQgdG8gZXhlY3V0ZSwgaXQgd2lsbCBzaW1wbHkgcGFzcyB0aGF0IHJlcXVlc3Qgb24gdG8gaXRzIGFjdGl2ZQotICogaGFuZGxlciwgaWYgYW55LgotICogCi0gKiBAc2VlIEFic3RyYWN0SGFuZGxlcgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIYW5kbGVyIHsKLQotCS8qKgotCSAqIFJlZ2lzdGVycyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JSGFuZGxlckxpc3RlbmVyPC9jb2RlPiB0byBsaXN0ZW4gZm9yCi0JICogY2hhbmdlcyB0byBwcm9wZXJ0aWVzIG9mIHRoaXMgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGhhbmRsZXJMaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGluc3RhbmNlIHRvIHJlZ2lzdGVyLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSWYKLQkgKiAgICAgICAgICAgIGFuIGF0dGVtcHQgaXMgbWFkZSB0byByZWdpc3RlciBhbiBpbnN0YW5jZSB3aGljaCBpcyBhbHJlYWR5Ci0JICogICAgICAgICAgICByZWdpc3RlcmVkIHdpdGggdGhpcyBpbnN0YW5jZSwgbm8gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KLQkgKi8KLQl2b2lkIGFkZEhhbmRsZXJMaXN0ZW5lcihJSGFuZGxlckxpc3RlbmVyIGhhbmRsZXJMaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIGhhbmRsZXIuIFRoaXMgbWV0aG9kIGlzIHJ1biBvbmNlIHdoZW4gdGhlIG9iamVjdCBpcyBubwotCSAqIGxvbmdlciByZWZlcmVuY2VkLiBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHVuaG9vayBsaXN0ZW5lcnMKLQkgKiBmcm9tIG90aGVyIG9iamVjdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi0JLyoqCi0JICogRXhlY3V0ZXMgd2l0aCB0aGUgbWFwIG9mIHBhcmFtZXRlciB2YWx1ZXMgYnkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIEFuIGV2ZW50IGNvbnRhaW5pbmcgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudAotCSAqICAgICAgICAgICAgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGV4ZWN1dGlvbi4gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UsIG11c3QgYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBleGVjdXRpb24uCi0JICovCi0JT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBoYW5kbGVyIGlzIGNhcGFibGUgb2YgZXhlY3V0aW5nIGF0IHRoaXMgbW9tZW50IGluCi0JICogdGltZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb21tYW5kIGlzIGVuYWJsZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaGFuZGxlciBpcyByZWFsbHkgY2FwYWJsZSBvZiBoYW5kbGluZyBkZWxlZ2F0aW9uLiBJbgotCSAqIHRoZSBjYXNlIG9mIGEgaGFuZGxlciB0aGF0IGlzIGEgY29tcG9zaXRpb24gb2Ygb3RoZXIgaGFuZGxlcnMsIHRoaXMgcmVwbHkKLQkgKiBpcyBpbnRlbmRlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBoYW5kbGVyIGlzIHRydWx5IGNhcGFibGUgb2YgcmVjZWl2aW5nCi0JICogZGVsZWdhdGVkIHJlc3BvbnNpYmlsaXRpZXMgYXQgdGhpcyB0aW1lLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGhhbmRsZXIgaXMgaGFuZGxlZDsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIYW5kbGVkKCk7Ci0KLQkvKioKLQkgKiBVbnJlZ2lzdGVycyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JSGFuZGxlckxpc3RlbmVyPC9jb2RlPiBsaXN0ZW5pbmcgZm9yCi0JICogY2hhbmdlcyB0byBwcm9wZXJ0aWVzIG9mIHRoaXMgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGhhbmRsZXJMaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGluc3RhbmNlIHRvIHVucmVnaXN0ZXIuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqICAgICAgICAgICAgSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHVucmVnaXN0ZXIgYW4gaW5zdGFuY2Ugd2hpY2ggaXMgbm90Ci0JICogICAgICAgICAgICBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGluc3RhbmNlLCBubyBvcGVyYXRpb24gaXMKLQkgKiAgICAgICAgICAgIHBlcmZvcm1lZC4KLQkgKi8KLQl2b2lkIHJlbW92ZUhhbmRsZXJMaXN0ZW5lcihJSGFuZGxlckxpc3RlbmVyIGhhbmRsZXJMaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSUhhbmRsZXJBdHRyaWJ1dGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSUhhbmRsZXJBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZWY3ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lIYW5kbGVyQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7Ci0KLS8qKgotICogPHA+Ci0gKiBBdHRyaWJ1dGUgY29uc3RhbnRzIHRoYXQgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIHdpdGhpbiB0aGlzIHBhY2thZ2UuICBUaGVzZQotICogYXR0cmlidXRlcyBjYW4gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSBleHRyYSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBoYW5kbGVyIHRvCi0gKiBlaXRoZXIgdGhlIGNvbW1hbmQgb3IgdGhlIGNvbW1hbmQgbWFuYWdlci4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIYW5kbGVyQXR0cmlidXRlcyB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaGFuZGxlciBpcyBoYW5kbGVkLgotCSAqIFRoaXMgaXMgaW50ZW5kZWQgbGFyZ2VseSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB3b3JrYmVuY2gKLQkgKiA8Y29kZT5SZXRhcmdldEFjdGlvbjwvY29kZT4gY2xhc3MuICBJdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgd2hpbGUKLQkgKiB0aGUgaGFuZGxlciBpcyBoYW5kbGluZyBhIGNvbW1hbmQsIGl0IHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBzdWNoLgotCSAqIFRoZSBjb21tYW5kIHNob3VsZCBhY3QgYW5kIGJlaGF2ZSBhcyBpZiBpdCBoYXMgbm8gaGFuZGxlci4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0hBTkRMRUQgPSAiaGFuZGxlZCI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lIYW5kbGVyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JSGFuZGxlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYmQzOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lIYW5kbGVyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi0vKioKLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24KLSAqIG9mIGNoYW5nZXMgdG8gb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mIDxjb2RlPklIYW5kbGVyPC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIEBzZWUgSUhhbmRsZXIjYWRkSGFuZGxlckxpc3RlbmVyKElIYW5kbGVyTGlzdGVuZXIpCi0gKiBAc2VlIElIYW5kbGVyI3JlbW92ZUhhbmRsZXJMaXN0ZW5lcihJSGFuZGxlckxpc3RlbmVyKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIYW5kbGVyTGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIG9mIGFuIGluc3RhbmNlIG9mCi0gICAgICogPGNvZGU+SUhhbmRsZXI8L2NvZGU+IGhhdmUgY2hhbmdlZC4gU3BlY2lmaWMgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGluCi0gICAgICogdGhlIDxjb2RlPkhhbmRsZXJFdmVudDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGhhbmRsZXJFdmVudAotICAgICAqICAgICAgICAgICAgdGhlIGhhbmRsZXIgZXZlbnQuIEd1YXJhbnRlZWQgbm90IHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHZvaWQgaGFuZGxlckNoYW5nZWQoSGFuZGxlckV2ZW50IGhhbmRsZXJFdmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSU5hbWVkSGFuZGxlU3RhdGVJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JTmFtZWRIYW5kbGVTdGF0ZUlkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGMzM2MzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JTmFtZWRIYW5kbGVTdGF0ZUlkcy5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lPYmplY3RXaXRoU3RhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JT2JqZWN0V2l0aFN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZjAwNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lPYmplY3RXaXRoU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kczsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIG9iamVjdCB0aGF0IGhvbGRzIHplcm8gb3IgbW9yZSBzdGF0ZSBvYmplY3RzLiBUaGlzIHN0YXRlIGluZm9ybWF0aW9uIGNhbgotICogYmUgc2hhcmVkIGJldHdlZW4gZGlmZmVyZW50IGluc3RhbmNlcyBvZiA8Y29kZT5JT2JqZWN0V2l0aFN0YXRlPC9jb2RlPi4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50LCBidXQgbXVzdCBub3QgZXh0ZW5kIHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2VlIEFic3RyYWN0SGFuZGxlcldpdGhTdGF0ZQotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPYmplY3RXaXRoU3RhdGUgewotCi0JLyoqCi0JICogQWRkcyBzdGF0ZSB0byB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIGluZGljYXRpbmcgdGhlIHR5cGUgb2Ygc3RhdGUgYmVpbmcgYWRkZWQ7IG11c3QKLQkgKiAgICAgICAgICAgIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gc3RhdGUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgc3RhdGUgdG8gYWRkIHRvIHRoaXMgb2JqZWN0OyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgYWRkU3RhdGUoU3RyaW5nIGlkLCBJU3RhdGUgc3RhdGUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc3RhdGUgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICogCi0JICogQHBhcmFtIHN0YXRlSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzdGF0ZSB0byByZXRyaWV2ZTsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gVGhlIHN0YXRlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3RhdGUgd2l0aAotCSAqICAgICAgICAgdGhlIGdpdmVuIGlkLgotCSAqLwotCXB1YmxpYyBJU3RhdGUgZ2V0U3RhdGUoU3RyaW5nIHN0YXRlSWQpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaWRlbnRpZmllcnMgZm9yIGFsbCBvZiB0aGUgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gQWxsIG9mIHRoZSBzdGF0ZSBpZGVudGlmaWVyczsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlCi0JICogICAgICAgICBpcyBubyBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFN0YXRlSWRzKCk7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHN0YXRlIGZyb20gdGhpcyBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHN0YXRlSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgc3RhdGUgdG8gcmVtb3ZlIGZyb20gdGhpcyBvYmplY3Q7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTdGF0ZShTdHJpbmcgc3RhdGVJZCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSVBhcmFtZXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjOTIyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSVBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi0vKioKLSAqIDxwPgotICogQSBwYXJhbWV0ZXIgZm9yIGEgY29tbWFuZC4gQSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBhIHR5cGUgb2YgaW5mb3JtYXRpb24gdGhhdAotICogdGhlIGNvbW1hbmQgbWlnaHQgYWNjZXB0LiBGb3IgZXhhbXBsZSwgYSAiU2hvdyBWaWV3IiBjb21tYW5kIG1pZ2h0IGFjY2VwdCB0aGUKLSAqIGlkIG9mIGEgdmlldyBmb3IgZGlzcGxheS4gVGhpcyBwYXJhbWV0ZXIgYWxzbyBpZGVudGlmaWVzIHBvc3NpYmxlIHZhbHVlcywgZm9yCi0gKiBkaXNwbGF5IGluIHRoZSB1c2VyIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQYXJhbWV0ZXIgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWRlbnRpZmllciBmb3IgdGhpcyBwYXJhbWV0ZXIuCi0JICogCi0JICogQHJldHVybiBUaGUgaWRlbnRpZmllcjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCi0JICogCi0JICogQHJldHVybiBUaGUgcGFyYW1ldGVyIG5hbWU7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhcmFtZXRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFyYW1ldGVyLiBUaGlzIG11c3Qgbm90IGJlCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAdGhyb3dzIFBhcmFtZXRlclZhbHVlc0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSB2YWx1ZXMgY2FuJ3QgYmUgcmV0cmlldmVkIGZvciBzb21lIHJlYXNvbi4KLQkgKi8KLQlwdWJsaWMgSVBhcmFtZXRlclZhbHVlcyBnZXRWYWx1ZXMoKSB0aHJvd3MgUGFyYW1ldGVyVmFsdWVzRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHBhcmFtZXRlciBpcyBvcHRpb25hbC4gT3RoZXJ3aXNlLCBpdCBpcyByZXF1aXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXJhbWV0ZXIgaXMgb3B0aW9uYWw7Ci0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lQYXJhbWV0ZXJUeXBlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JUGFyYW1ldGVyVHlwZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0Y2Y5ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lQYXJhbWV0ZXJUeXBlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7Ci0KLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgYnkgY2xpZW50cyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbgotICogb2YgY2hhbmdlcyB0byBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2Yge0BsaW5rIFBhcmFtZXRlclR5cGV9LgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogQHNlZSBQYXJhbWV0ZXJUeXBlI2FkZExpc3RlbmVyKElQYXJhbWV0ZXJUeXBlTGlzdGVuZXIpCi0gKiBAc2VlIFBhcmFtZXRlclR5cGUjcmVtb3ZlTGlzdGVuZXIoSVBhcmFtZXRlclR5cGVMaXN0ZW5lcikKLSAqLwotcHVibGljIGludGVyZmFjZSBJUGFyYW1ldGVyVHlwZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgb25lIG9yIG1vcmUgcHJvcGVydGllcyBvZiBhbiBpbnN0YW5jZSBvZgotCSAqIHtAbGluayBQYXJhbWV0ZXJUeXBlfSBoYXZlIGNoYW5nZWQuIFNwZWNpZmljIGRldGFpbHMgYXJlIGRlc2NyaWJlZCBpbiB0aGUKLQkgKiB7QGxpbmsgUGFyYW1ldGVyVHlwZUV2ZW50fS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZUV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZXZlbnQuIEd1YXJhbnRlZWQgbm90IHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXZvaWQgcGFyYW1ldGVyVHlwZUNoYW5nZWQoUGFyYW1ldGVyVHlwZUV2ZW50IHBhcmFtZXRlclR5cGVFdmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JUGFyYW1ldGVyVmFsdWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSVBhcmFtZXRlclZhbHVlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDVkZWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JUGFyYW1ldGVyVmFsdWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIDxwPgotICogVGhlIHBhcmFtZXRlcnMgZm9yIGEgY29tbWFuZC4gVGhpcyBpbnRlcmZhY2Ugd2lsbCBvbmx5IGJlIGNvbnN1bHRlZCBpZiB0aGUKLSAqIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIGlnbm9yZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJUGFyYW1ldGVyVmFsdWVzIHsKLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAga2V5ZWQgYnkgZXh0ZXJuYWxpemVkIG5hbWVzIGZvciBwYXJhbWV0ZXIgdmFsdWVzLiBUaGVzZQotCSAqIG5hbWVzIHNob3VsZCBiZSBodW1hbi1yZWFkYWJsZSwgYW5kIGFyZSBnZW5lcmFsbHkgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIKLQkgKiBpbiBhIHVzZXIgaW50ZXJmYWNlIG9mIHNvbWUgc29ydC4gVGhlIHZhbHVlcyBzaG91bGQgYmUgYWN0dWFsIHZhbHVlcyB0aGF0Ci0JICogd2lsbCBiZSBpbnRlcnByZXRlZCBieSB0aGUgaGFuZGxlciBmb3IgdGhlIGNvbW1hbmQuCi0JICogCi0JICogQHJldHVybiBBIG1hcCBvZiB0aGUgZXh0ZXJuYWxpemFibGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHZhbHVlICg8Y29kZT5TdHJpbmc8L2NvZGU+KQotCSAqICAgICAgICAgdG8gdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyICg8Y29kZT5TdHJpbmc8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFBhcmFtZXRlclZhbHVlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL0lTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODZjNzQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kczsKLQotLyoqCi0gKiA8cD4KLSAqIEEgcGllY2Ugb2Ygc3RhdGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgc2hhcmVkIGJldHdlZW4gb2JqZWN0cywgYW5kIG1pZ2h0IGJlCi0gKiBwZXJzaXN0ZWQgYmV0d2VlbiBzZXNzaW9ucy4gVGhpcyBjYW4gYmUgdXNlZCBmb3IgY29tbWFuZHMgdGhhdCB0b2dnbGUgYmV0d2VlbgotICogdHdvIHN0YXRlcyBhbmQgd2lzaCB0byBwYXNzIHRoaXMgc3RhdGUgaW5mb3JtYXRpb24gYmV0d2VlbiBkaWZmZXJlbnQKLSAqIGhhbmRsZXJzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIHN0YXRlIG9iamVjdCBjYW4gZWl0aGVyIGJlIHVzZWQgYXMgYSBzaW5nbGUgc3RhdGUgb2JqZWN0IHNoYXJlZCBiZXR3ZWVuCi0gKiBzZXZlcmFsIGNvbW1hbmRzLCBvciBvbmUgc3RhdGUgb2JqZWN0IHBlciBjb21tYW5kIC0tIGRlcGVuZGluZyBvbiB0aGUgbmVlZHMKLSAqIG9mIHRoZSBhcHBsaWNhdGlvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IG9yIGV4dGVuZCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBBYnN0cmFjdFN0YXRlCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YXRlIHsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBjaGFuZ2VzIGZvciB0aGlzIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgVGhlIGxpc3RlbmVyIHRvIGFkZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhpcyBzdGF0ZS4gVGhpcyBhbGxvd3MgdGhlIHN0YXRlIHRvIHVucmVnaXN0ZXIgaXRzZWxmIHdpdGgKLQkgKiBhbnkgbWFuYWdlcnMgb3IgYXMgYSBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdGF0ZS4gVGhpcyBjYW4gYmUgYW55IHR5cGUgb2YKLQkgKiBvYmplY3QsIGJ1dCBpbXBsZW1lbnRhdGlvbnMgd2lsbCB1c3VhbGx5IHJlc3RyaWN0IHRoaXMgdmFsdWUgdG8gYQotCSAqIHBhcnRpY3VsYXIgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlOyBtYXkgYmUgYW55dGhpbmcuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoaXMgc3RhdGUgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIHNldDsgbWF5IGJlIGFueXRoaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdG8gY2hhbmdlcyBmcm9tIHRoaXMgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSVN0YXRlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JU3RhdGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUzZDNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JU3RhdGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi0vKioKLSAqIDxwPgotICogQSBsaXN0ZW5lciB0byBjaGFuZ2VzIGluIHNvbWUgc3RhdGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCwgYnV0IG11c3Qgbm90IGV4dGVuZCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGF0ZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIEhhbmRsZXMgYSBjaGFuZ2UgdG8gdGhlIHZhbHVlIGluIHNvbWUgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIHN0YXRlCi0JICogICAgICAgICAgICBUaGUgc3RhdGUgdGhhdCBoYXMgY2hhbmdlZDsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uIFRoZQotCSAqICAgICAgICAgICAgdmFsdWUgZm9yIHRoaXMgc3RhdGUgaGFzIGJlZW4gdXBkYXRlZCB0byB0aGUgbmV3IHZhbHVlLgotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIG9sZCB2YWx1ZTsgbWF5IGJlIGFueXRoaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZVN0YXRlQ2hhbmdlKElTdGF0ZSBzdGF0ZSwgT2JqZWN0IG9sZFZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JVHlwZWRQYXJhbWV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9JVHlwZWRQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwZjNkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvSVR5cGVkUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi0vKioKLSAqIEEgY29tbWFuZCBwYXJhbWV0ZXIgdGhhdCBoYXMgYSBkZWNsYXJlZCB0eXBlLiBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0bwotICogYmUgaW1wbGVtZW50ZWQgYnkgaW1wbGVtZW50b3JzIG9mIHtAbGluayBJUGFyYW1ldGVyfSB0aGF0IHdpbGwgc3VwcG9ydAotICogcGFyYW1ldGVyIHR5cGVzLgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVR5cGVkUGFyYW1ldGVyIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHtAbGluayBQYXJhbWV0ZXJUeXBlfSBhc3NvY2lhdGVkIHdpdGggYSBjb21tYW5kIHBhcmFtZXRlciBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwYXJhbWV0ZXIgZG9lcyBub3QgZGVjbGFyZSBhIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoZSBwYXJhbWV0ZXIgdHlwZSByZXR1cm5lZCBtYXkgYmUgdW5kZWZpbmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgdHlwZSBhc3NvY2lhdGVkIHdpdGggYSBjb21tYW5kIHBhcmFtZXRlciBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHBhcmFtZXRlciBkb2VzIG5vdCBkZWNsYXJlIGEgdHlwZQotCSAqLwotCXB1YmxpYyBQYXJhbWV0ZXJUeXBlIGdldFBhcmFtZXRlclR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9OYW1lZEhhbmRsZU9iamVjdFdpdGhTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL05hbWVkSGFuZGxlT2JqZWN0V2l0aFN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YTljMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL05hbWVkSGFuZGxlT2JqZWN0V2l0aFN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvTm90RW5hYmxlZEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL05vdEVuYWJsZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1OWVkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvTm90RW5hYmxlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGV4ZWN1dGUgYSBjb21tYW5kIHRoYXQgaXMgbm90IGVuYWJsZWQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5vdEVuYWJsZWRFeGNlcHRpb24gZXh0ZW5kcyBDb21tYW5kRXhjZXB0aW9uIHsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc1NzI3ODg5OTgxMjQ1OTZMOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcwotICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIE5vdEVuYWJsZWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKLSAgICAgICAgc3VwZXIocyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL05vdEhhbmRsZWRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9Ob3RIYW5kbGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmJmMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL05vdEhhbmRsZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhY2Nlc3MgdGhlIHByb3BlcnRpZXMgb2YgYW4gdW5oYW5kbGVkCi0gKiBvYmplY3QuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5vdEhhbmRsZWRFeGNlcHRpb24gZXh0ZW5kcyBDb21tYW5kRXhjZXB0aW9uIHsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTY0NDY5MTQ4Mjc3MjY5MDRMOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcwotICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBOb3RIYW5kbGVkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7Ci0gICAgICAgIHN1cGVyKHMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9QYXJhbWV0ZXJUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvUGFyYW1ldGVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTBhMjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9QYXJhbWV0ZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkhhbmRsZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Ob3REZWZpbmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29tbWFuZHMudXRpbC5VdGlsOwotCi0vKioKLSAqIDxwPgotICogUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgYSBjb21tYW5kIHBhcmFtZXRlci4gQ2xpZW50cyBjYW4gdXNlIGEKLSAqIHBhcmFtZXRlciB0eXBlIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBtYXRjaGVzIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgd2l0aAotICoge0BsaW5rICNpc0NvbXBhdGlibGUoT2JqZWN0KX0gYW5kIGNhbiBnZXQgYW4KLSAqIHtAbGluayBBYnN0cmFjdFBhcmFtZXRlclZhbHVlQ29udmVydGVyfSB0byBjb252ZXJ0IGJldHdlZW4gb2JqZWN0cyBtYXRjaGluZwotICogdGhlIHBhcmFtZXRlciB0eXBlIGFuZCBzdHJpbmdzIHRoYXQgZW5jb2RlIHRoZSBvYmplY3QncyBpZGVudGl0eS4KLSAqIDwvcD4KLSAqIDxwPgotICogQSBjb21tYW5kIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQgdG8gZGVjbGFyZSBhIHR5cGUuIFRvIGRldGVybWluZSBpZiBhCi0gKiBnaXZlbiBwYXJhbWV0ZXIgaGFzIGEgdHlwZSwgY2hlY2sgaWYgYW4ge0BsaW5rIElQYXJhbWV0ZXJ9IGltcGxlbWVudHMKLSAqIHtAbGluayBJVHlwZWRQYXJhbWV0ZXJ9IGFuZCBpZiBzbywgdXNlCi0gKiB7QGxpbmsgSVR5cGVkUGFyYW1ldGVyI2dldFBhcmFtZXRlclR5cGUoKX0gbGlrZSB0aGlzOgotICogPC9wPgotICogCi0gKiA8cHJlPgotICogICAgICAgICAgICAgICAgICAgSVBhcmFtZXRlciBwYXJhbWV0ZXIgPSAvLyAuLi4gZ2V0IElQYXJhbWV0ZXIgZnJvbSBDb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyIGluc3RhbmNlb2YgSVR5cGVkUGFyYW1ldGVyKSB7Ci0gKiAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlclR5cGUgdHlwZSA9ICgoSVR5cGVkUGFyYW1ldGVyKXBhcmFtZXRlcikuZ2V0UGFyYW1ldGVyVHlwZSgpOwotICogICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwYXJhbWV0ZXIgaGFzIGEgUGFyYW1ldGVyVHlwZQotICogICAgICAgICAgICAgICAgICAgICB9Ci0gKiAgICAgICAgICAgICAgICAgICB9Ci0gKiA8L3ByZT4KLSAqIAotICogQHNlZSBJUGFyYW1ldGVyCi0gKiBAc2VlIElUeXBlZFBhcmFtZXRlciNnZXRQYXJhbWV0ZXJUeXBlKCkKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBhcmFtZXRlclR5cGUgZXh0ZW5kcyBIYW5kbGVPYmplY3QgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQotCS8qKgotCSAqIFRPRE86IHRoaXMgd2FzIGNvcGllZCBmcm9tCi0JICogb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5leHByZXNzaW9ucy5FeHByZXNzaW9ucyBpcyB0aGVyZSBhIGJldHRlciBwbGFjZQotCSAqIHRvIHJlZmVyZW5jZSB0aGlzPwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCB0byB0ZXN0OyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIGFnYWluc3Qgd2hpY2ggd2UgYXJlIHRlc3Rpbmc7bWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPmVsZW1lbnQ8L2NvZGU+IGlzIGFuIGluc3RhbmNlCi0JICogICAgICAgICBvZiA8Y29kZT50eXBlPC9jb2RlPjsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSW5zdGFuY2VPZihmaW5hbCBPYmplY3QgZWxlbWVudCwKLQkJCWZpbmFsIFN0cmluZyB0eXBlKSB7Ci0JCS8vIG51bGwgaXNuJ3QgYW4gaW5zdGFuY2VvZiBvZiBhbnl0aGluZy4KLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGlzU3VidHlwZShlbGVtZW50LmdldENsYXNzKCksIHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRPRE86IHRoaXMgd2FzIGNvcGllZCBmcm9tCi0JICogb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5leHByZXNzaW9ucy5FeHByZXNzaW9ucyBpcyB0aGVyZSBhIGJldHRlciBwbGFjZQotCSAqIHRvIHJlZmVyZW5jZSB0aGlzPwotCSAqIAotCSAqIEBwYXJhbSBjbGF6egotCSAqICAgICAgICAgICAgVGhlIGNsYXNzIHRvIG1hdGNoOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIGFnYWluc3Qgd2hpY2ggd2UgYXJlIHRlc3Rpbmc7bWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPmVsZW1lbnQ8L2NvZGU+IGlzIGFuIGluc3RhbmNlCi0JICogICAgICAgICBvZiA8Y29kZT50eXBlPC9jb2RlPjsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU3VidHlwZShmaW5hbCBDbGFzcyBjbGF6eiwgZmluYWwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKGNsYXp6LmdldE5hbWUoKS5lcXVhbHModHlwZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZmluYWwgQ2xhc3Mgc3VwZXJDbGFzcyA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKLQkJaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiBpc1N1YnR5cGUoc3VwZXJDbGFzcywgdHlwZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZmluYWwgQ2xhc3NbXSBpbnRlcmZhY2VzID0gY2xhenouZ2V0SW50ZXJmYWNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpc1N1YnR5cGUoaW50ZXJmYWNlc1tpXSwgdHlwZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFuIHtAbGluayBBYnN0cmFjdFBhcmFtZXRlclZhbHVlQ29udmVydGVyfSBmb3IgY29udmVydGluZyBwYXJhbWV0ZXIKLQkgKiB2YWx1ZXMgYmV0d2VlbiBvYmplY3RzIGFuZCBzdHJpbmdzLiBUaGlzIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHRyYW5zaWVudCBBYnN0cmFjdFBhcmFtZXRlclZhbHVlQ29udmVydGVyIHBhcmFtZXRlclR5cGVDb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBBIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBvYmplY3QgdHlwZSBvZiB0aGlzIHBhcmFtZXRlciB0eXBlLiBUaGlzIHdpbGwgYmUKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHRoZSBwYXJhbWV0ZXIgdHlwZSBpcyB1bmRlZmluZWQgYnV0IG5ldmVyIG51bGwKLQkgKiB3aGVuIGl0IGlzIGRlZmluZWQuCi0JICovCi0JcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIHR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gaWRlbnRpZmllci4gV2hlbiBhIHBhcmFtZXRlcgotCSAqIHR5cGUgaXMgZmlyc3QgY29uc3RydWN0ZWQsIGl0IGlzIHVuZGVmaW5lZC4gUGFyYW1ldGVyIHR5cGVzIHNob3VsZCBvbmx5Ci0JICogYmUgY29uc3RydWN0ZWQgYnkgdGhlIHtAbGluayBDb21tYW5kTWFuYWdlcn0gdG8gZW5zdXJlIHRoYXQgdGhlCi0JICogaWRlbnRpZmllciByZW1haW5zIHVuaXF1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHR5cGUuIFRoaXMgdmFsdWUgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBhbmQgbXVzdCBiZSB1bmlxdWUgYW1vbmdzdCBhbGwgcGFyYW1ldGVyCi0JICogICAgICAgICAgICB0eXBlcy4KLQkgKi8KLQlQYXJhbWV0ZXJUeXBlKGZpbmFsIFN0cmluZyBpZCkgewotCQlzdXBlcihpZCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoaXMgcGFyYW1ldGVyIHR5cGUgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gaXRzCi0JICogc3RhdGUgY2hhbmdlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB0byBiZSBhZGRlZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkTGlzdGVuZXIoZmluYWwgSVBhcmFtZXRlclR5cGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlhZGRMaXN0ZW5lck9iamVjdChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ29tcGFyZXMgdGhpcyBwYXJhbWV0ZXIgdHlwZSB3aXRoIGFub3RoZXIgb2JqZWN0IGJ5IGNvbXBhcmluZyBlYWNoIG9mIHRoZQotCSAqIG5vbi10cmFuc2llbnQgYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBUaGUgb2JqZWN0IHdpdGggd2hpY2ggdG8gY29tcGFyZTsgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZgotCSAqICAgICAgICAgICAge0BsaW5rIFBhcmFtZXRlclR5cGV9LgotCSAqIEByZXR1cm4gQSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvIG9yIGEgcG9zaXRpdmUgaW50ZWdlciwgaWYgdGhlIG9iamVjdCBpcwotCSAqICAgICAgICAgZ3JlYXRlciB0aGFuLCBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhpcyBwYXJhbWV0ZXIgdHlwZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZpbmFsIFBhcmFtZXRlclR5cGUgY2FzdGVkT2JqZWN0ID0gKFBhcmFtZXRlclR5cGUpIG9iamVjdDsKLQkJaW50IGNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZShkZWZpbmVkLCBjYXN0ZWRPYmplY3QuZGVmaW5lZCk7Ci0JCWlmIChjb21wYXJlVG8gPT0gMCkgewotCQkJY29tcGFyZVRvID0gVXRpbC5jb21wYXJlKGlkLCBjYXN0ZWRPYmplY3QuaWQpOwotCQl9Ci0JCXJldHVybiBjb21wYXJlVG87Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmaW5lcyB0aGlzIHBhcmFtZXRlciB0eXBlLCBzZXR0aW5nIHRoZSBkZWZpbmVkIHByb3BlcnR5IHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGlmaWNhdGlvbiBpcyBzZW50IHRvIGFsbCBsaXN0ZW5lcnMgdGhhdCBzb21ldGhpbmcgaGFzIGNoYW5nZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgSmF2YSBvYmplY3QgdHlwZSBmb3IgdGhpcyBwYXJhbWV0ZXIKLQkgKiAgICAgICAgICAgIHR5cGU7IDxjb2RlPm51bGw8L2NvZGU+IGlzIGludGVycHJldGVkIGFzCi0JICogICAgICAgICAgICA8Y29kZT4iamF2YS5sYW5nLk9iamVjdCI8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVDb252ZXJ0ZXIKLQkgKiAgICAgICAgICAgIGFuIHtAbGluayBBYnN0cmFjdFBhcmFtZXRlclZhbHVlQ29udmVydGVyfSB0byBwZXJmb3JtCi0JICogICAgICAgICAgICBzdHJpbmcvb2JqZWN0IGNvbnZlcnNpb25zIGZvciBwYXJhbWV0ZXIgdmFsdWVzOyBtYXkgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZGVmaW5lKGZpbmFsIFN0cmluZyB0eXBlLAotCQkJZmluYWwgQWJzdHJhY3RQYXJhbWV0ZXJWYWx1ZUNvbnZlcnRlciBwYXJhbWV0ZXJUeXBlQ29udmVydGVyKSB7Ci0KLQkJZmluYWwgYm9vbGVhbiBkZWZpbmVkQ2hhbmdlZCA9ICF0aGlzLmRlZmluZWQ7Ci0JCXRoaXMuZGVmaW5lZCA9IHRydWU7Ci0KLQkJdGhpcy50eXBlID0gKHR5cGUgPT0gbnVsbCkgPyBPYmplY3QuY2xhc3MuZ2V0TmFtZSgpIDogdHlwZTsKLQkJdGhpcy5wYXJhbWV0ZXJUeXBlQ29udmVydGVyID0gcGFyYW1ldGVyVHlwZUNvbnZlcnRlcjsKLQotCQlmaXJlUGFyYW1ldGVyVHlwZUNoYW5nZWQobmV3IFBhcmFtZXRlclR5cGVFdmVudCh0aGlzLCBkZWZpbmVkQ2hhbmdlZCkpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIGFsbCBsaXN0ZW5lcnMgdGhhdCB0aGlzIHBhcmFtZXRlciB0eXBlIGhhcyBjaGFuZ2VkLiBUaGlzIHNlbmRzCi0JICogdGhlIGdpdmVuIGV2ZW50IHRvIGFsbCBvZiB0aGUgbGlzdGVuZXJzLCBpZiBhbnkuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgZXZlbnQgdG8gc2VuZCB0byB0aGUgbGlzdGVuZXJzOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGZpcmVQYXJhbWV0ZXJUeXBlQ2hhbmdlZChmaW5hbCBQYXJhbWV0ZXJUeXBlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLQkJCQkJIkNhbm5vdCBzZW5kIGEgbnVsbCBldmVudCB0byBsaXN0ZW5lcnMuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmICghaXNMaXN0ZW5lckF0dGFjaGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZpbmFsIE9iamVjdFtdIGxpc3RlbmVycyA9IGdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgSVBhcmFtZXRlclR5cGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJUGFyYW1ldGVyVHlwZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0JCQlsaXN0ZW5lci5wYXJhbWV0ZXJUeXBlQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBjb252ZXJ0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFyYW1ldGVyLCBpZiBhbnkuCi0JICogCi0JICogQHJldHVybiBUaGUgcGFyYW1ldGVyIHZhbHVlIGNvbnZlcnRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMKLQkgKiAgICAgICAgIG5vIHZhbHVlIGNvbnZlcnRlciBmb3IgdGhpcyBwYXJhbWV0ZXIuCi0JICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlciB0eXBlIGlzIG5vdCBjdXJyZW50bHkgZGVmaW5lZAotCSAqLwotCXB1YmxpYyBmaW5hbCBBYnN0cmFjdFBhcmFtZXRlclZhbHVlQ29udmVydGVyIGdldFZhbHVlQ29udmVydGVyKCkKLQkJCXRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RlZmluZWQoKSkgewotCQkJdGhyb3cgbmV3IE5vdERlZmluZWRFeGNlcHRpb24oCi0JCQkJCSJDYW5ub3QgdXNlIGdldFZhbHVlQ29udmVydGVyKCkgd2l0aCBhbiB1bmRlZmluZWQgUGFyYW1ldGVyVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gcGFyYW1ldGVyVHlwZUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHZhbHVlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGlzIHBhcmFtZXRlcgotCSAqIHR5cGUuIEFuIG9iamVjdCBpcyBjb21wYXRpYmxlIHdpdGggYSBwYXJhbWV0ZXIgdHlwZSBpZiB0aGUgb2JqZWN0IGlzIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGRlZmluZWQgYXMgdGhlIHBhcmFtZXRlcidzIHR5cGUgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBhbiBvYmplY3QgdG8gY2hlY2sgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGlzIHBhcmFtZXRlciB0eXBlOwotCSAqICAgICAgICAgICAgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHZhbHVlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGlzIHR5cGUsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlciB0eXBlIGlzIG5vdCBjdXJyZW50bHkgZGVmaW5lZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZShPYmplY3QgdmFsdWUpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RlZmluZWQoKSkgewotCQkJdGhyb3cgbmV3IE5vdERlZmluZWRFeGNlcHRpb24oCi0JCQkJCSJDYW5ub3QgdXNlIGlzQ29tcGF0aWJsZSgpIHdpdGggYW4gdW5kZWZpbmVkIFBhcmFtZXRlclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBpc0luc3RhbmNlT2YodmFsdWUsIHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFVucmVnaXN0ZXJzIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgb2YgdGhpcyBwYXJhbWV0ZXIgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBpbnN0YW5jZSB0byB1bnJlZ2lzdGVyLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAgICAgICAgICAgIElmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1bnJlZ2lzdGVyIGFuIGluc3RhbmNlIHdoaWNoIGlzIG5vdAotCSAqICAgICAgICAgICAgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggdGhpcyBpbnN0YW5jZSwgbm8gb3BlcmF0aW9uIGlzCi0JICogICAgICAgICAgICBwZXJmb3JtZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlTGlzdGVuZXIoZmluYWwgSVBhcmFtZXRlclR5cGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZW1vdmVMaXN0ZW5lck9iamVjdChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBhcmFtZXRlciB0eXBlLiBGb3IgZGVidWdnaW5nIHB1cnBvc2VzCi0JICogb25seS4gVGhpcyBzdHJpbmcgc2hvdWxkIG5vdCBiZSBzaG93biB0byBhbiBlbmQgdXNlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb247IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoIlBhcmFtZXRlclR5cGUoIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoaWQpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnLCcpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChkZWZpbmVkKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJyknKTsKLQkJCXN0cmluZyA9IHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgdHlwZSBiZWNvbWUgdW5kZWZpbmVkLiBOb3RpZmljYXRpb24gaXMgc2VudCB0byBhbGwKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdW5kZWZpbmUoKSB7Ci0JCXN0cmluZyA9IG51bGw7Ci0KLQkJZmluYWwgYm9vbGVhbiBkZWZpbmVkQ2hhbmdlZCA9IGRlZmluZWQ7Ci0JCWRlZmluZWQgPSBmYWxzZTsKLQotCQl0eXBlID0gbnVsbDsKLQkJcGFyYW1ldGVyVHlwZUNvbnZlcnRlciA9IG51bGw7Ci0KLQkJZmlyZVBhcmFtZXRlclR5cGVDaGFuZ2VkKG5ldyBQYXJhbWV0ZXJUeXBlRXZlbnQodGhpcywgZGVmaW5lZENoYW5nZWQpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9QYXJhbWV0ZXJUeXBlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9QYXJhbWV0ZXJUeXBlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyOTRjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvUGFyYW1ldGVyVHlwZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uQWJzdHJhY3RIYW5kbGVPYmplY3RFdmVudDsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGRlc2NyaWJlcyBjaGFuZ2VzIHRvIGFuIGluc3RhbmNlIG9mCi0gKiB7QGxpbmsgUGFyYW1ldGVyVHlwZX0uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgSVBhcmFtZXRlclR5cGVMaXN0ZW5lciNwYXJhbWV0ZXJUeXBlQ2hhbmdlZChQYXJhbWV0ZXJUeXBlRXZlbnQpCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQYXJhbWV0ZXJUeXBlRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZU9iamVjdEV2ZW50IHsKLQotCS8qKgotCSAqIFRoZSBwYXJhbWV0ZXIgdHlwZSB0aGF0IGhhcyBjaGFuZ2VkLiBUaGlzIHZhbHVlIGlzIG5ldmVyCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQYXJhbWV0ZXJUeXBlIHBhcmFtZXRlclR5cGU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVyIHR5cGUgdGhhdCBjaGFuZ2VkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gZGVmaW5lZENoYW5nZWQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+LCBpZmYgdGhlIGRlZmluZWQgcHJvcGVydHkgY2hhbmdlZC4KLQkgKi8KLQlQYXJhbWV0ZXJUeXBlRXZlbnQoZmluYWwgUGFyYW1ldGVyVHlwZSBwYXJhbWV0ZXJUeXBlLAotCQkJZmluYWwgYm9vbGVhbiBkZWZpbmVkQ2hhbmdlZCkgewotCi0JCXN1cGVyKGRlZmluZWRDaGFuZ2VkKTsKLQotCQlpZiAocGFyYW1ldGVyVHlwZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJdGhpcy5wYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUgdGhhdCBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSB0aGF0IGNoYW5nZWQuIEd1YXJhbnRlZWQgbm90Ci0JICogICAgICAgICB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgUGFyYW1ldGVyVHlwZSBnZXRQYXJhbWV0ZXJUeXBlKCkgewotCQlyZXR1cm4gcGFyYW1ldGVyVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9QYXJhbWV0ZXJWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9QYXJhbWV0ZXJWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjOTc2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvUGFyYW1ldGVyVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBwcm9ibGVtIG9jY3VycmVkIHdoaWxlIGNvbnZlcnRpbmcgYSBjb21tYW5kIHBhcmFtZXRlciB2YWx1ZQotICogZnJvbSBzdHJpbmcgdG8gb2JqZWN0LCBvciBvYmplY3QgdG8gc3RyaW5nLgotICogCi0gKiBAc2VlIEFic3RyYWN0UGFyYW1ldGVyVmFsdWVDb252ZXJ0ZXIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFBhcmFtZXRlclZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBleHRlbmRzIENvbW1hbmRFeGNlcHRpb24gewotCi0JLyoqCi0JICogR2VuZXJhdGVkIHNlcmlhbCB2ZXJzaW9uIFVJRCBmb3IgdGhpcyBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0NzAzMDc3NzI5NTA1MDY2MTA0TDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQYXJhbWV0ZXJWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UKLQkgKiBhbmQgY2F1c2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBjYXVzZQotCSAqICAgICAgICAgICAgdGhlIGNhdXNlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFBhcmFtZXRlclZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSwKLQkJCWZpbmFsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL1BhcmFtZXRlclZhbHVlc0V4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL1BhcmFtZXRlclZhbHVlc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1MTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9QYXJhbWV0ZXJWYWx1ZXNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci0KLS8qKgotICogPHA+Ci0gKiBTaWduYWxzIHRoYXQgYSBwcm9ibGVtIGhhcyBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mCi0gKiA8Y29kZT5JUGFyYW1ldGVyVmFsdWVzPC9jb2RlPi4gSW4gYXBwbGljYXRpb25zIGJhc2VkIG9uIHRoZSByZWdpc3RyeQotICogcHJvdmlkZWQgYnkgY29yZSwgdGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIHByb2JsZW0gY3JlYXRpbmcgYW4KLSAqIDxjb2RlPklFeGVjdXRhYmxlRXh0ZW5zaW9uPC9jb2RlPi4gRm9yIG90aGVyIGFwcGxpY2F0aW9ucywgdGhpcyBleGNlcHRpb24KLSAqIGNvdWxkIGJlIHVzZWQgdG8gc2lnbmlmeSBhbnkgZ2VuZXJhbCBwcm9ibGVtIGR1cmluZyBpbml0aWFsaXphdGlvbi4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQYXJhbWV0ZXJWYWx1ZXNFeGNlcHRpb24gZXh0ZW5kcyBDb21tYW5kRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIEdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQgZm9yIHRoaXMgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzYxODk3Njc5MzUyMDg0NTYyM0w7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlCi0JICogYW5kIGNhdXNlLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2U7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gY2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSBjYXVzZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQYXJhbWV0ZXJWYWx1ZXNFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL1BhcmFtZXRlcml6YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9QYXJhbWV0ZXJpemF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MzVlYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL1BhcmFtZXRlcml6YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29tbWFuZHMudXRpbC5VdGlsOwotCi0vKioKLSAqIDxwPgotICogQSBwYXJhbWV0ZXIgd2l0aCBhIHNwZWNpZmljIHZhbHVlLiBUaGlzIGlzIHVzdWFsbHkgYSBwYXJ0IG9mIGEKLSAqIDxjb2RlPlBhcmFtZXRlcml6ZWRDb21tYW5kPC9jb2RlPiwgd2hpY2ggaXMgdXNlZCB0byByZWZlciB0byBhIGNvbW1hbmQKLSAqIHdpdGggYSBjb2xsZWN0aW9uIG9mIHBhcmFtZXRlcml6YXRpb25zLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQYXJhbWV0ZXJpemF0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBjb25zdGFudCBpbnRlZ2VyIGhhc2ggY29kZSB2YWx1ZSBtZWFuaW5nIHRoZSBoYXNoIGNvZGUgaGFzIG5vdCB5ZXQKLQkgKiBiZWVuIGNvbXB1dGVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0NPREVfTk9UX0NPTVBVVEVEID0gLTE7Ci0KLQkvKioKLQkgKiBBIGZhY3RvciBmb3IgY29tcHV0aW5nIHRoZSBoYXNoIGNvZGUgZm9yIGFsbCBwYXJhbWV0ZXJpemVkIGNvbW1hbmRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0ZBQ1RPUiA9IDg5OwotCi0JLyoqCi0JICogVGhlIHNlZWQgZm9yIHRoZSBoYXNoIGNvZGUgZm9yIGFsbCBwYXJhbWV0ZXJpemVkIGNvbW1hbmRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0lOSVRJQUwgPSBQYXJhbWV0ZXJpemF0aW9uLmNsYXNzLmdldE5hbWUoKQotCQkJLmhhc2hDb2RlKCk7Ci0KLQkvKioKLQkgKiBUaGUgaGFzaCBjb2RlIGZvciB0aGlzIG9iamVjdC4gVGhpcyB2YWx1ZSBpcyBjb21wdXRlZCBsYXppbHksIGFuZCBtYXJrZWQKLQkgKiBhcyBpbnZhbGlkIHdoZW4gb25lIG9mIHRoZSB2YWx1ZXMgb24gd2hpY2ggaXQgaXMgYmFzZWQgY2hhbmdlcy4KLQkgKi8KLQlwcml2YXRlIHRyYW5zaWVudCBpbnQgaGFzaENvZGUgPSBIQVNIX0NPREVfTk9UX0NPTVBVVEVEOwotCi0JLyoqCi0JICogVGhlIHBhcmFtZXRlciB0aGF0IGlzIGJlaW5nIHBhcmFtZXRlcml6ZWQuIFRoaXMgdmFsdWUgaXMgbmV2ZXIKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElQYXJhbWV0ZXIgcGFyYW1ldGVyOwotCi0JLyoqCi0JICogVGhlIHZhbHVlIHRoYXQgZGVmaW5lcyB0aGUgcGFyYW1ldGVyaXphdGlvbi4gVGhpcyB2YWx1ZSBtYXkgYmUKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+UGFyYW1ldGVyaXphdGlvbjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmFtZXRlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlciB0aGF0IGlzIGJlaW5nIHBhcmFtZXRlcml6ZWQ7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlcjsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQYXJhbWV0ZXJpemF0aW9uKGZpbmFsIElQYXJhbWV0ZXIgcGFyYW1ldGVyLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHBhcmFtZXRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0JCQkJCSJZb3UgY2Fubm90IHBhcmFtZXRlcml6ZSBhIG51bGwgcGFyYW1ldGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRoaXMucGFyYW1ldGVyID0gcGFyYW1ldGVyOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAodGhpcyA9PSBvYmplY3QpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgUGFyYW1ldGVyaXphdGlvbikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZpbmFsIFBhcmFtZXRlcml6YXRpb24gcGFyYW1ldGVyaXphdGlvbiA9IChQYXJhbWV0ZXJpemF0aW9uKSBvYmplY3Q7Ci0JCWlmICghKFV0aWwuZXF1YWxzKHRoaXMucGFyYW1ldGVyLmdldElkKCksIHBhcmFtZXRlcml6YXRpb24ucGFyYW1ldGVyCi0JCQkJLmdldElkKCkpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIFV0aWwuZXF1YWxzKHRoaXMudmFsdWUsIHBhcmFtZXRlcml6YXRpb24udmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmFtZXRlciB0aGF0IGlzIGJlaW5nIHBhcmFtZXRlcml6ZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgcGFyYW1ldGVyOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSVBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoKSB7Ci0JCXJldHVybiBwYXJhbWV0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgaW4gdGhpcyBwYXJhbWV0ZXJpemF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoZSBjdXJyZW50IHZhbHVlLCBpZiBhbnkuIElmIHRoZQotCSAqIG5hbWUgY2Fubm90IGJlIGZvdW5kLCB0aGVuIGl0IHNpbXBseSByZXR1cm5zIHRoZSB2YWx1ZS4gSXQgYWxzbyBlbnN1cmVzCi0JICogdGhhdCBhbnkgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWVzIGFyZSBjb252ZXJ0ZWQgaW50byBhbiBlbXB0eSBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiBUaGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdmFsdWU7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEB0aHJvd3MgUGFyYW1ldGVyVmFsdWVzRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHBhcmFtZXRlciBuZWVkZWQgdG8gYmUgaW5pdGlhbGl6ZWQsIGJ1dCBjb3VsZG4ndCBiZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhbHVlTmFtZSgpIHRocm93cyBQYXJhbWV0ZXJWYWx1ZXNFeGNlcHRpb24gewotCQlmaW5hbCBNYXAgcGFyYW1ldGVyVmFsdWVzID0gcGFyYW1ldGVyLmdldFZhbHVlcygpLmdldFBhcmFtZXRlclZhbHVlcygpOwotCQlmaW5hbCBJdGVyYXRvciBwYXJhbWV0ZXJWYWx1ZUl0ciA9IHBhcmFtZXRlclZhbHVlcy5lbnRyeVNldCgpCi0JCQkJLml0ZXJhdG9yKCk7Ci0JCVN0cmluZyByZXR1cm5WYWx1ZSA9IG51bGw7Ci0JCXdoaWxlIChwYXJhbWV0ZXJWYWx1ZUl0ci5oYXNOZXh0KCkpIHsKLQkJCWZpbmFsIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIHBhcmFtZXRlclZhbHVlSXRyLm5leHQoKTsKLQkJCWZpbmFsIFN0cmluZyBjdXJyZW50VmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKFV0aWwuZXF1YWxzKHZhbHVlLCBjdXJyZW50VmFsdWUpKSB7Ci0JCQkJcmV0dXJuVmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChyZXR1cm5WYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVXRpbC5aRVJPX0xFTkdUSF9TVFJJTkc7Ci0JCX0KLQotCQlyZXR1cm4gcmV0dXJuVmFsdWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKGhhc2hDb2RlID09IEhBU0hfQ09ERV9OT1RfQ09NUFVURUQpIHsKLQkJCWhhc2hDb2RlID0gSEFTSF9JTklUSUFMICogSEFTSF9GQUNUT1IgKyBVdGlsLmhhc2hDb2RlKHBhcmFtZXRlcik7Ci0JCQloYXNoQ29kZSA9IGhhc2hDb2RlICogSEFTSF9GQUNUT1IgKyBVdGlsLmhhc2hDb2RlKHZhbHVlKTsKLQkJCWlmIChoYXNoQ29kZSA9PSBIQVNIX0NPREVfTk9UX0NPTVBVVEVEKSB7Ci0JCQkJaGFzaENvZGUrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFzaENvZGU7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvUGFyYW1ldGVyaXplZENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9QYXJhbWV0ZXJpemVkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTVhZjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9QYXJhbWV0ZXJpemVkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uTm90RGVmaW5lZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbW1hbmRzLnV0aWwuVXRpbDsKLQotLyoqCi0gKiA8cD4KLSAqIEEgY29tbWFuZCB0aGF0IGhhcyBoYWQgb25lIG9yIG1vcmUgb2YgaXRzIHBhcmFtZXRlcnMgc3BlY2lmaWVkLiBUaGlzIGNsYXNzCi0gKiBzZXJ2ZXMgYXMgYSB1dGlsaXR5IGNsYXNzIGZvciBkZXZlbG9wZXJzIHRoYXQgbmVlZCB0byBtYW5pcHVsYXRlIGNvbW1hbmRzCi0gKiB3aXRoIHBhcmFtZXRlcnMuIEl0IGhhbmRsZXMgdGhlIGJlaGF2aW91ciBvZiBnZW5lcmF0aW5nIGEgcGFyYW1ldGVyIG1hcCBhbmQgYQotICogaHVtYW4tcmVhZGFibGUgbmFtZS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUGFyYW1ldGVyaXplZENvbW1hbmQgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQotCS8qKgotCSAqIFRoZSBjb25zdGFudCBpbnRlZ2VyIGhhc2ggY29kZSB2YWx1ZSBtZWFuaW5nIHRoZSBoYXNoIGNvZGUgaGFzIG5vdCB5ZXQKLQkgKiBiZWVuIGNvbXB1dGVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0NPREVfTk9UX0NPTVBVVEVEID0gLTE7Ci0KLQkvKioKLQkgKiBBIGZhY3RvciBmb3IgY29tcHV0aW5nIHRoZSBoYXNoIGNvZGUgZm9yIGFsbCBwYXJhbWV0ZXJpemVkIGNvbW1hbmRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0ZBQ1RPUiA9IDg5OwotCi0JLyoqCi0JICogVGhlIHNlZWQgZm9yIHRoZSBoYXNoIGNvZGUgZm9yIGFsbCBwYXJhbWV0ZXJpemVkIGNvbW1hbmRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0lOSVRJQUwgPSBQYXJhbWV0ZXJpemVkQ29tbWFuZC5jbGFzcwotCQkJLmdldE5hbWUoKS5oYXNoQ29kZSgpOwotCi0JLyoqCi0JICogVGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgaWQgaW4gdGhlIHBhcmFtZXRlciB2YWx1ZXMuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgbm8gbG9uZ2VyIHVzZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkRFWF9QQVJBTUVURVJfSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGluZGV4IG9mIHRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaXRzZWxmLCBpbiB0aGUKLQkgKiBwYXJhbWV0ZXIgdmFsdWVzLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIG5vIGxvbmdlciB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfUEFSQU1FVEVSX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGluZGV4IG9mIHRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIGZvcgotCSAqIHRoaXMgY29tbWFuZC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOREVYX1BBUkFNRVRFUl9WQUxVRV9OQU1FID0gMjsKLQotCS8qKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciB0aGF0IHRoZSBjb21tYW5kIGNhbiB1bmRlcnN0YW5kLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIG5vIGxvbmdlciB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfUEFSQU1FVEVSX1ZBTFVFX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIEVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBjb21tYW5kIGlkLCBwYXJhbWV0ZXIgaWRzIGFuZCBwYXJhbWV0ZXIKLQkgKiB2YWx1ZXMgZm9yIHtAbGluayAjc2VyaWFsaXplKCl9LiBUaGUgc3BlY2lhbCBjaGFyYWN0ZXJzCi0JICoge0BsaW5rIENvbW1hbmRNYW5hZ2VyI1BBUkFNRVRFUl9TVEFSVF9DSEFSfSwKLQkgKiB7QGxpbmsgQ29tbWFuZE1hbmFnZXIjUEFSQU1FVEVSX0VORF9DSEFSfSwKLQkgKiB7QGxpbmsgQ29tbWFuZE1hbmFnZXIjSURfVkFMVUVfQ0hBUn0sCi0JICoge0BsaW5rIENvbW1hbmRNYW5hZ2VyI1BBUkFNRVRFUl9TRVBBUkFUT1JfQ0hBUn0gYW5kCi0JICoge0BsaW5rIENvbW1hbmRNYW5hZ2VyI0VTQ0FQRV9DSEFSfSBhcmUgZXNjYXBlZCBieSBwcmVwZW5kaW5nIGEKLQkgKiB7QGxpbmsgQ29tbWFuZE1hbmFnZXIjRVNDQVBFX0NIQVJ9IGNoYXJhY3Rlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmF3VGV4dAotCSAqICAgICAgICAgICAgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gZm9yCi0JICogICAgICAgICAgICBzZXJpYWxpemF0aW9uLgotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGluZyA8Y29kZT5yYXdUZXh0PC9jb2RlPiB3aXRoCi0JICogICAgICAgICBzcGVjaWFsIHNlcmlhbGl6YXRpb24gY2hhcmFjdGVycyBlc2NhcGVkCi0JICogQHNlZSBDb21tYW5kTWFuYWdlciN1bmVzY2FwZShTdHJpbmcpCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlc2NhcGUoZmluYWwgU3RyaW5nIHJhd1RleHQpIHsKLQotCQkvLyBkZWZlciBpbml0aWFsaXphdGlvbiBvZiBhIFN0cmluZ0J1ZmZlciB1bnRpbCB3ZSBrbm93IHdlIG5lZWQgb25lCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmF3VGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0KLQkJCWNoYXIgYyA9IHJhd1RleHQuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlIENvbW1hbmRNYW5hZ2VyLlBBUkFNRVRFUl9TVEFSVF9DSEFSOgotCQkJY2FzZSBDb21tYW5kTWFuYWdlci5QQVJBTUVURVJfRU5EX0NIQVI6Ci0JCQljYXNlIENvbW1hbmRNYW5hZ2VyLklEX1ZBTFVFX0NIQVI6Ci0JCQljYXNlIENvbW1hbmRNYW5hZ2VyLlBBUkFNRVRFUl9TRVBBUkFUT1JfQ0hBUjoKLQkJCWNhc2UgQ29tbWFuZE1hbmFnZXIuRVNDQVBFX0NIQVI6Ci0JCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHJhd1RleHQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCQlidWZmZXIuYXBwZW5kKENvbW1hbmRNYW5hZ2VyLkVTQ0FQRV9DSEFSKTsKLQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpZiAoYnVmZmVyICE9IG51bGwpCi0JCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfQotCi0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybiByYXdUZXh0OwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIGV2ZXJ5IHBvc3NpYmxlIGNvbWJpbmF0aW9uIG9mIHBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSBnaXZlbgotCSAqIHBhcmFtZXRlcnMuIFBhcmFtZXRlcnMgdmFsdWVzIHRoYXQgY2Fubm90IGJlIGluaXRpYWxpemVkIGFyZSBqdXN0Ci0JICogaWdub3JlZC4gT3B0aW9uYWwgcGFyYW1ldGVycyBhcmUgY29uc2lkZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRJbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IGluIHRoZSA8Y29kZT5wYXJhbWV0ZXJzPC9jb2RlPiB0aGF0IHdlIHNob3VsZAotCSAqICAgICAgICAgICAgcHJvY2Vzcy4gVGhpcyBtdXN0IGJlIGEgdmFsaWQgaW5kZXguCi0JICogQHBhcmFtIHBhcmFtZXRlcnMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGluIHRvIHByb2Nlc3M7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gQSBjb2xsZWN0aW9uICg8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPikgb2YgY29tYmluYXRpb25zICg8Y29kZT5MaXN0PC9jb2RlPgotCSAqICAgICAgICAgb2YgPGNvZGU+UGFyYW1ldGVyaXphdGlvbjwvY29kZT4pLgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gZXhwYW5kUGFyYW1ldGVycyhmaW5hbCBpbnQgc3RhcnRJbmRleCwKLQkJCWZpbmFsIElQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKSB7Ci0JCWZpbmFsIGJvb2xlYW4gbm9Nb3JlUGFyYW1ldGVycyA9IChzdGFydEluZGV4ICsgMSA+PSBwYXJhbWV0ZXJzLmxlbmd0aCk7Ci0KLQkJZmluYWwgSVBhcmFtZXRlciBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzW3N0YXJ0SW5kZXhdOwotCQlmaW5hbCBMaXN0IHBhcmFtZXRlcml6YXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocGFyYW1ldGVyLmlzT3B0aW9uYWwoKSkgewotCQkJcGFyYW1ldGVyaXphdGlvbnMuYWRkKG51bGwpOwotCQl9Ci0JCQotCQlJUGFyYW1ldGVyVmFsdWVzIHZhbHVlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2YWx1ZXMgPSBwYXJhbWV0ZXIuZ2V0VmFsdWVzKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIFBhcmFtZXRlclZhbHVlc0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAobm9Nb3JlUGFyYW1ldGVycykgewotCQkJCXJldHVybiBwYXJhbWV0ZXJpemF0aW9uczsKLQkJCX0KLQotCQkJcmV0dXJuIGV4cGFuZFBhcmFtZXRlcnMoc3RhcnRJbmRleCwgcGFyYW1ldGVycyk7Ci0JCX0KLQkJZmluYWwgTWFwIHBhcmFtZXRlclZhbHVlcyA9IHZhbHVlcy5nZXRQYXJhbWV0ZXJWYWx1ZXMoKTsKLQkJZmluYWwgSXRlcmF0b3IgcGFyYW1ldGVyVmFsdWVJdHIgPSBwYXJhbWV0ZXJWYWx1ZXMuZW50cnlTZXQoKQotCQkJCS5pdGVyYXRvcigpOwotCQl3aGlsZSAocGFyYW1ldGVyVmFsdWVJdHIuaGFzTmV4dCgpKSB7Ci0JCQlmaW5hbCBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBwYXJhbWV0ZXJWYWx1ZUl0ci5uZXh0KCk7Ci0JCQlmaW5hbCBQYXJhbWV0ZXJpemF0aW9uIHBhcmFtZXRlcml6YXRpb24gPSBuZXcgUGFyYW1ldGVyaXphdGlvbigKLQkJCQkJcGFyYW1ldGVyLCAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCXBhcmFtZXRlcml6YXRpb25zLmFkZChwYXJhbWV0ZXJpemF0aW9uKTsKLQkJfQotCi0JCS8vIENoZWNrIGlmIGFub3RoZXIgaXRlcmF0aW9uIHdpbGwgcHJvZHVjZSBhbnkgbW9yZSBuYW1lcy4KLQkJZmluYWwgaW50IHBhcmFtZXRlcml6YXRpb25Db3VudCA9IHBhcmFtZXRlcml6YXRpb25zLnNpemUoKTsKLQkJaWYgKG5vTW9yZVBhcmFtZXRlcnMpIHsKLQkJCS8vIFRoaXMgaXMgaXQsIHNvIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHBhcmFtZXRlcml6YXRpb25zLgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJpemF0aW9uQ291bnQ7IGkrKykgewotCQkJCWZpbmFsIFBhcmFtZXRlcml6YXRpb24gcGFyYW1ldGVyaXphdGlvbiA9IChQYXJhbWV0ZXJpemF0aW9uKSBwYXJhbWV0ZXJpemF0aW9ucwotCQkJCQkJLmdldChpKTsKLQkJCQlmaW5hbCBMaXN0IGNvbWJpbmF0aW9uID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQljb21iaW5hdGlvbi5hZGQocGFyYW1ldGVyaXphdGlvbik7Ci0JCQkJcGFyYW1ldGVyaXphdGlvbnMuc2V0KGksIGNvbWJpbmF0aW9uKTsKLQkJCX0KLQkJCXJldHVybiBwYXJhbWV0ZXJpemF0aW9uczsKLQkJfQotCi0JCS8vIE1ha2UgcmVjdXJzaXZlIGNhbGwKLQkJZmluYWwgQ29sbGVjdGlvbiBzdWZmaXhlcyA9IGV4cGFuZFBhcmFtZXRlcnMoc3RhcnRJbmRleCArIDEsIHBhcmFtZXRlcnMpOwotCQlpZiAoc3VmZml4ZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBUaGlzIGlzIGl0LCBzbyBqdXN0IHJldHVybiB0aGUgY3VycmVudCBwYXJhbWV0ZXJpemF0aW9ucy4KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyaXphdGlvbkNvdW50OyBpKyspIHsKLQkJCQlmaW5hbCBQYXJhbWV0ZXJpemF0aW9uIHBhcmFtZXRlcml6YXRpb24gPSAoUGFyYW1ldGVyaXphdGlvbikgcGFyYW1ldGVyaXphdGlvbnMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJZmluYWwgTGlzdCBjb21iaW5hdGlvbiA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQkJY29tYmluYXRpb24uYWRkKHBhcmFtZXRlcml6YXRpb24pOwotCQkJCXBhcmFtZXRlcml6YXRpb25zLnNldChpLCBjb21iaW5hdGlvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gcGFyYW1ldGVyaXphdGlvbnM7Ci0JCX0KLQkJZmluYWwgQ29sbGVjdGlvbiByZXR1cm5WYWx1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmluYWwgSXRlcmF0b3Igc3VmZml4SXRyID0gc3VmZml4ZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN1ZmZpeEl0ci5oYXNOZXh0KCkpIHsKLQkJCWZpbmFsIExpc3QgY29tYmluYXRpb24gPSAoTGlzdCkgc3VmZml4SXRyLm5leHQoKTsKLQkJCWZpbmFsIGludCBjb21iaW5hdGlvblNpemUgPSBjb21iaW5hdGlvbi5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcml6YXRpb25Db3VudDsgaSsrKSB7Ci0JCQkJZmluYWwgUGFyYW1ldGVyaXphdGlvbiBwYXJhbWV0ZXJpemF0aW9uID0gKFBhcmFtZXRlcml6YXRpb24pIHBhcmFtZXRlcml6YXRpb25zCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWZpbmFsIExpc3QgbmV3Q29tYmluYXRpb24gPSBuZXcgQXJyYXlMaXN0KGNvbWJpbmF0aW9uU2l6ZSArIDEpOwotCQkJCW5ld0NvbWJpbmF0aW9uLmFkZChwYXJhbWV0ZXJpemF0aW9uKTsKLQkJCQluZXdDb21iaW5hdGlvbi5hZGRBbGwoY29tYmluYXRpb24pOwotCQkJCXJldHVyblZhbHVlLmFkZChuZXdDb21iaW5hdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0dXJuVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogR2VuZXJhdGVzIGFsbCB0aGUgcG9zc2libGUgY29tYmluYXRpb25zIG9mIGNvbW1hbmQgcGFyYW1ldGVyaXphdGlvbnMgZm9yCi0JICogdGhlIGdpdmVuIGNvbW1hbmQuIElmIHRoZSBjb21tYW5kIGhhcyBubyBwYXJhbWV0ZXJzLCB0aGVuIHRoaXMgaXMgc2ltcGx5Ci0JICogYSBwYXJhbWV0ZXJpemVkIHZlcnNpb24gb2YgdGhhdCBjb21tYW5kLiBJZiBhIHBhcmFtZXRlciBpcyBvcHRpb25hbCwgYm90aAotCSAqIHRoZSBpbmNsdWRlZCBhbmQgbm90IGluY2x1ZGVkIGNhc2VzIGFyZSBjb25zaWRlcmVkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgY2Fubm90IGJlIGxvYWRlZCBkdWUgdG8gYQotCSAqIDxjb2RlPlBhcmFtZXRlclZhbHVlc0V4Y2VwdGlvbjwvY29kZT4sIHRoZW4gaXQgaXMgc2ltcGx5IGlnbm9yZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICBUaGUgY29tbWFuZCBmb3Igd2hpY2ggdGhlIHBhcmFtZXRlciBjb21iaW5hdGlvbnMgc2hvdWxkIGJlCi0JICogICAgICAgICAgICBnZW5lcmF0ZWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gQSBjb2xsZWN0aW9uIG9mIDxjb2RlPlBhcmFtZXRlcml6ZWRDb21tYW5kPC9jb2RlPiBpbnN0YW5jZXMKLQkgKiAgICAgICAgIHJlcHJlc2VudGluZyBhbGwgb2YgdGhlIHBvc3NpYmxlIGNvbWJpbmF0aW9ucy4gVGhpcyB2YWx1ZSBpcwotCSAqICAgICAgICAgbmV2ZXIgZW1wdHkgYW5kIGl0IGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBjb21tYW5kIGlzIG5vdCBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBnZW5lcmF0ZUNvbWJpbmF0aW9ucyhmaW5hbCBDb21tYW5kIGNvbW1hbmQpCi0JCQl0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gY29tbWFuZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCWlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucwotCQkJCQkuc2luZ2xldG9uKG5ldyBQYXJhbWV0ZXJpemVkQ29tbWFuZChjb21tYW5kLCBudWxsKSk7Ci0JCX0KLQotCQlmaW5hbCBDb2xsZWN0aW9uIGV4cGFuc2lvbiA9IGV4cGFuZFBhcmFtZXRlcnMoMCwgcGFyYW1ldGVycyk7Ci0JCWZpbmFsIENvbGxlY3Rpb24gY29tYmluYXRpb25zID0gbmV3IEFycmF5TGlzdChleHBhbnNpb24uc2l6ZSgpKTsKLQkJZmluYWwgSXRlcmF0b3IgZXhwYW5zaW9uSXRyID0gZXhwYW5zaW9uLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChleHBhbnNpb25JdHIuaGFzTmV4dCgpKSB7Ci0JCQlmaW5hbCBMaXN0IGNvbWJpbmF0aW9uID0gKExpc3QpIGV4cGFuc2lvbkl0ci5uZXh0KCk7Ci0JCQlpZiAoY29tYmluYXRpb24gPT0gbnVsbCkgewotCQkJCWNvbWJpbmF0aW9ucy5hZGQobmV3IFBhcmFtZXRlcml6ZWRDb21tYW5kKGNvbW1hbmQsIG51bGwpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJd2hpbGUgKGNvbWJpbmF0aW9uLnJlbW92ZShudWxsKSkgewotCQkJCQkvLyBKdXN0IGtlZXAgcmVtb3Zpbmcgd2hpbGUgdGhlcmUgYXJlIG51bGwgZW50cmllcyBsZWZ0LgotCQkJCX0KLQkJCQlpZiAoY29tYmluYXRpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCWNvbWJpbmF0aW9ucy5hZGQobmV3IFBhcmFtZXRlcml6ZWRDb21tYW5kKGNvbW1hbmQsIG51bGwpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaW5hbCBQYXJhbWV0ZXJpemF0aW9uW10gcGFyYW1ldGVyaXphdGlvbnMgPSAoUGFyYW1ldGVyaXphdGlvbltdKSBjb21iaW5hdGlvbgotCQkJCQkJCS50b0FycmF5KG5ldyBQYXJhbWV0ZXJpemF0aW9uW2NvbWJpbmF0aW9uLnNpemUoKV0pOwotCQkJCQljb21iaW5hdGlvbnMuYWRkKG5ldyBQYXJhbWV0ZXJpemVkQ29tbWFuZChjb21tYW5kLAotCQkJCQkJCXBhcmFtZXRlcml6YXRpb25zKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gY29tYmluYXRpb25zOwotCX0KLQotCS8qKgotCSAqIFRoZSBiYXNlIGNvbW1hbmQgd2hpY2ggaXMgYmVpbmcgcGFyYW1ldGVyaXplZC4gVGhpcyB2YWx1ZSBpcyBuZXZlcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29tbWFuZCBjb21tYW5kOwotCi0JLyoqCi0JICogVGhlIGhhc2ggY29kZSBmb3IgdGhpcyBvYmplY3QuIFRoaXMgdmFsdWUgaXMgY29tcHV0ZWQgbGF6aWx5LCBhbmQgbWFya2VkCi0JICogYXMgaW52YWxpZCB3aGVuIG9uZSBvZiB0aGUgdmFsdWVzIG9uIHdoaWNoIGl0IGlzIGJhc2VkIGNoYW5nZXMuCi0JICovCi0JcHJpdmF0ZSB0cmFuc2llbnQgaW50IGhhc2hDb2RlID0gSEFTSF9DT0RFX05PVF9DT01QVVRFRDsKLQotCS8qKgotCSAqIFRoaXMgaXMgYW4gYXJyYXkgb2YgcGFyYW1ldGVyaXphdGlvbiBkZWZpbmVkIGZvciB0aGlzIGNvbW1hbmQuIFRoaXMgdmFsdWUKLQkgKiBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNvbW1hbmQgaGFzIG5vIHBhcmFtZXRlcnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQYXJhbWV0ZXJpemF0aW9uW10gcGFyYW1ldGVyaXphdGlvbnM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPlBhcmFtZXRlcml6ZWRDb21tYW5kPC9jb2RlPiB3aXRoCi0JICogc3BlY2lmaWMgdmFsdWVzIGZvciB6ZXJvIG9yIG1vcmUgb2YgaXRzIHBhcmFtZXRlcnMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIFRoZSBjb21tYW5kIHRoYXQgaXMgcGFyYW1ldGVyaXplZDsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBwYXJhbWV0ZXJpemF0aW9ucwotCSAqICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVyaXphdGlvbnMgYmluZGluZyBwYXJhbWV0ZXJzIHRvIHZhbHVlcyBmb3IKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kLiBUaGlzIHZhbHVlIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcwotCSAqICAgICAgICAgICAgYXJndW1lbnQgaXMgbm90IGNvcGllZDsgaWYgeW91IG5lZWQgdG8gbWFrZSBjaGFuZ2VzIHRvIGl0Ci0JICogICAgICAgICAgICBhZnRlciBjb25zdHJ1Y3RpbmcgdGhpcyBwYXJhbWV0ZXJpemVkIGNvbW1hbmQsIHRoZW4gbWFrZSBhCi0JICogICAgICAgICAgICBjb3B5IHlvdXJzZWxmLgotCSAqLwotCXB1YmxpYyBQYXJhbWV0ZXJpemVkQ29tbWFuZChmaW5hbCBDb21tYW5kIGNvbW1hbmQsCi0JCQlmaW5hbCBQYXJhbWV0ZXJpemF0aW9uW10gcGFyYW1ldGVyaXphdGlvbnMpIHsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotCQkJCQkiQSBwYXJhbWV0ZXJpemVkIGNvbW1hbmQgY2Fubm90IGhhdmUgYSBudWxsIGNvbW1hbmQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJdGhpcy5wYXJhbWV0ZXJpemF0aW9ucyA9IChwYXJhbWV0ZXJpemF0aW9ucyA9PSBudWxsIHx8IHBhcmFtZXRlcml6YXRpb25zLmxlbmd0aCA9PSAwKSA/IG51bGwKLQkJCQk6IHBhcmFtZXRlcml6YXRpb25zOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgT2JqZWN0IG9iamVjdCkgewotCQlmaW5hbCBQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kID0gKFBhcmFtZXRlcml6ZWRDb21tYW5kKSBvYmplY3Q7Ci0JCWZpbmFsIGJvb2xlYW4gdGhpc0RlZmluZWQgPSB0aGlzLmNvbW1hbmQuaXNEZWZpbmVkKCk7Ci0JCWZpbmFsIGJvb2xlYW4gb3RoZXJEZWZpbmVkID0gY29tbWFuZC5jb21tYW5kLmlzRGVmaW5lZCgpOwotCQlpZiAoIXRoaXNEZWZpbmVkIHx8ICFvdGhlckRlZmluZWQpIHsKLQkJCXJldHVybiBVdGlsLmNvbXBhcmUodGhpc0RlZmluZWQsIG90aGVyRGVmaW5lZCk7Ci0JCX0KLQotCQl0cnkgewotCQkJZmluYWwgaW50IGNvbXBhcmVUbyA9IGdldE5hbWUoKS5jb21wYXJlVG8oY29tbWFuZC5nZXROYW1lKCkpOwotCQkJaWYgKGNvbXBhcmVUbyA9PSAwKSB7Ci0JCQkJcmV0dXJuIGdldElkKCkuY29tcGFyZVRvKGNvbW1hbmQuZ2V0SWQoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29tcGFyZVRvOwotCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFcnJvcigKLQkJCQkJIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIGEgY29tbWFuZCdzIGRlZmluZWQgc3RhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICh0aGlzID09IG9iamVjdCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkQ29tbWFuZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZpbmFsIFBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmQgPSAoUGFyYW1ldGVyaXplZENvbW1hbmQpIG9iamVjdDsKLQkJaWYgKCFVdGlsLmVxdWFscyh0aGlzLmNvbW1hbmQsIGNvbW1hbmQuY29tbWFuZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBVdGlsLmVxdWFscyh0aGlzLnBhcmFtZXRlcml6YXRpb25zLCBjb21tYW5kLnBhcmFtZXRlcml6YXRpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGlzIGNvbW1hbmQgd2l0aCBpdHMgcGFyYW1ldGVycy4gVGhpcyBtZXRob2Qgd2lsbCBzdWNjZWVkCi0JICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGVuYWJsZWQgb3IgZGVmaW5lZC4gSXQgaXMKLQkgKiBwcmVmZXJyYWJsZSB0byB1c2Uge0BsaW5rICNleGVjdXRlV2l0aENoZWNrcyhPYmplY3QsIE9iamVjdCl9LgotCSAqIAotCSAqIEBwYXJhbSB0cmlnZ2VyCi0JICogICAgICAgICAgICBUaGUgb2JqZWN0IHRoYXQgdHJpZ2dlcmVkIHRoZSBleGVjdXRpb247IG1heSBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGFwcGxpY2F0aW9uQ29udGV4dAotCSAqICAgICAgICAgICAgVGhlIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbiBhdCB0aGUgdGltZSB0aGUgZXhlY3V0aW9uIHdhcwotCSAqICAgICAgICAgICAgdHJpZ2dlcmVkOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBleGVjdXRpb247IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBoYW5kbGVyIGhhcyBwcm9ibGVtcyBleGVjdXRpbmcgdGhpcyBjb21tYW5kLgotCSAqIEB0aHJvd3MgTm90SGFuZGxlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIG5vIGhhbmRsZXIuCi0JICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB7QGxpbmsgI2V4ZWN1dGVXaXRoQ2hlY2tzKE9iamVjdCwgT2JqZWN0KX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBPYmplY3QgZXhlY3V0ZShmaW5hbCBPYmplY3QgdHJpZ2dlciwKLQkJCWZpbmFsIE9iamVjdCBhcHBsaWNhdGlvbkNvbnRleHQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sCi0JCQlOb3RIYW5kbGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbW1hbmQuZXhlY3V0ZShuZXcgRXhlY3V0aW9uRXZlbnQoY29tbWFuZCwgZ2V0UGFyYW1ldGVyTWFwKCksCi0JCQkJdHJpZ2dlciwgYXBwbGljYXRpb25Db250ZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhpcyBjb21tYW5kIHdpdGggaXRzIHBhcmFtZXRlcnMuIFRoaXMgZG9lcyBleHRyYSBjaGVja2luZyB0bwotCSAqIHNlZSBpZiB0aGUgY29tbWFuZCBpcyBlbmFibGVkIGFuZCBkZWZpbmVkLiBJZiBpdCBpcyBub3QgYm90aCBlbmFibGVkIGFuZAotCSAqIGRlZmluZWQsIHRoZW4gdGhlIGV4ZWN1dGlvbiBsaXN0ZW5lcnMgd2lsbCBiZSBub3RpZmllZCBhbmQgYW4gZXhjZXB0aW9uCi0JICogdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSB0cmlnZ2VyCi0JICogICAgICAgICAgICBUaGUgb2JqZWN0IHRoYXQgdHJpZ2dlcmVkIHRoZSBleGVjdXRpb247IG1heSBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGFwcGxpY2F0aW9uQ29udGV4dAotCSAqICAgICAgICAgICAgVGhlIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbiBhdCB0aGUgdGltZSB0aGUgZXhlY3V0aW9uIHdhcwotCSAqICAgICAgICAgICAgdHJpZ2dlcmVkOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBleGVjdXRpb247IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBoYW5kbGVyIGhhcyBwcm9ibGVtcyBleGVjdXRpbmcgdGhpcyBjb21tYW5kLgotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBjb21tYW5kIHlvdSBhcmUgdHJ5aW5nIHRvIGV4ZWN1dGUgaXMgbm90IGRlZmluZWQuCi0JICogQHRocm93cyBOb3RFbmFibGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIGNvbW1hbmQgeW91IGFyZSB0cnlpbmcgdG8gZXhlY3V0ZSBpcyBub3QgZW5hYmxlZC4KLQkgKiBAdGhyb3dzIE5vdEhhbmRsZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGVyZSBpcyBubyBoYW5kbGVyLgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGV4ZWN1dGVXaXRoQ2hlY2tzKGZpbmFsIE9iamVjdCB0cmlnZ2VyLAotCQkJZmluYWwgT2JqZWN0IGFwcGxpY2F0aW9uQ29udGV4dCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwKLQkJCU5vdERlZmluZWRFeGNlcHRpb24sIE5vdEVuYWJsZWRFeGNlcHRpb24sIE5vdEhhbmRsZWRFeGNlcHRpb24gewotCQlyZXR1cm4gY29tbWFuZC5leGVjdXRlV2l0aENoZWNrcyhuZXcgRXhlY3V0aW9uRXZlbnQoY29tbWFuZCwKLQkJCQlnZXRQYXJhbWV0ZXJNYXAoKSwgdHJpZ2dlciwgYXBwbGljYXRpb25Db250ZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBjb21tYW5kLiBJdCBpcyBwb3NzaWJsZSBmb3IgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXJpemVkCi0JICogY29tbWFuZCB0byBoYXZlIHRoZSBzYW1lIGlkZW50aWZpZXIuCi0JICogCi0JICogQHJldHVybiBUaGUgY29tbWFuZDsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4sIGJ1dCBtYXkgYmUgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBDb21tYW5kIGdldENvbW1hbmQoKSB7Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQncyBiYXNlIGlkZW50aWZpZXIuIEl0IGlzIHBvc3NpYmxlIGZvciBtb3JlIHRoYW4gb25lCi0JICogcGFyYW1ldGVyaXplZCBjb21tYW5kIHRvIGhhdmUgdGhlIHNhbWUgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb21tYW5kIGlkOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gY29tbWFuZC5nZXRJZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCBhbGwgb2YgaXRzCi0JICogcGFyYW1ldGVyaXphdGlvbnMuCi0JICogCi0JICogQHJldHVybiBUaGUgaHVtYW4tcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwYXJhbWV0ZXJpemVkIGNvbW1hbmQ7Ci0JICogICAgICAgICBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgdW5kZXJseWluZyBjb21tYW5kIGlzIG5vdCBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nQnVmZmVyIG5hbWVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCW5hbWVCdWZmZXIuYXBwZW5kKGNvbW1hbmQuZ2V0TmFtZSgpKTsKLQkJaWYgKHBhcmFtZXRlcml6YXRpb25zICE9IG51bGwpIHsKLQkJCW5hbWVCdWZmZXIuYXBwZW5kKCIgKCIpOyAvLyROT04tTkxTLTEkCi0JCQlmaW5hbCBpbnQgcGFyYW1ldGVyaXphdGlvbkNvdW50ID0gcGFyYW1ldGVyaXphdGlvbnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJpemF0aW9uQ291bnQ7IGkrKykgewotCQkJCWZpbmFsIFBhcmFtZXRlcml6YXRpb24gcGFyYW1ldGVyaXphdGlvbiA9IHBhcmFtZXRlcml6YXRpb25zW2ldOwotCQkJCW5hbWVCdWZmZXIuYXBwZW5kKHBhcmFtZXRlcml6YXRpb24uZ2V0UGFyYW1ldGVyKCkuZ2V0TmFtZSgpKTsKLQkJCQluYW1lQnVmZmVyLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCW5hbWVCdWZmZXIuYXBwZW5kKHBhcmFtZXRlcml6YXRpb24uZ2V0VmFsdWVOYW1lKCkpOwotCQkJCX0gY2F0Y2ggKGZpbmFsIFBhcmFtZXRlclZhbHVlc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEp1c3QgbGV0IGl0IGdvIGZvciBub3cuIElmIHNvbWVvbmUgY29tcGxhaW5zIHdlIGNhbiBhZGQKLQkJCQkJICogbW9yZSBpbmZvIGxhdGVyLgotCQkJCQkgKi8KLQkJCQl9Ci0KLQkJCQkvLyBJZiB0aGVyZSBpcyBhbm90aGVyIGl0ZW0sIGFwcGVuZCBhIHNlcGFyYXRvci4KLQkJCQlpZiAoaSArIDEgPCBwYXJhbWV0ZXJpemF0aW9uQ291bnQpIHsKLQkJCQkJbmFtZUJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQluYW1lQnVmZmVyLmFwcGVuZCgnKScpOwotCQl9Ci0JCXJldHVybiBuYW1lQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIG1hcCwgYXMgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IGFuCi0JICogPGNvZGU+RXhlY3V0aW9uRXZlbnQ8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG1hcCBvZiBwYXJhbWV0ZXIgaWRzICg8Y29kZT5TdHJpbmc8L2NvZGU+KSB0byBwYXJhbWV0ZXIKLQkgKiAgICAgICAgIHZhbHVlcyAoPGNvZGU+U3RyaW5nPC9jb2RlPikuIFRoaXMgbWFwIGlzIG5ldmVyCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgYnV0IG1heSBiZSBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgTWFwIGdldFBhcmFtZXRlck1hcCgpIHsKLQkJaWYgKChwYXJhbWV0ZXJpemF0aW9ucyA9PSBudWxsKSB8fCAocGFyYW1ldGVyaXphdGlvbnMubGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQl9Ci0KLQkJZmluYWwgTWFwIHBhcmFtZXRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyaXphdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIFBhcmFtZXRlcml6YXRpb24gcGFyYW1ldGVyaXphdGlvbiA9IHBhcmFtZXRlcml6YXRpb25zW2ldOwotCQkJcGFyYW1ldGVyTWFwLnB1dChwYXJhbWV0ZXJpemF0aW9uLmdldFBhcmFtZXRlcigpLmdldElkKCksCi0JCQkJCXBhcmFtZXRlcml6YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHBhcmFtZXRlck1hcDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoaGFzaENvZGUgPT0gSEFTSF9DT0RFX05PVF9DT01QVVRFRCkgewotCQkJaGFzaENvZGUgPSBIQVNIX0lOSVRJQUwgKiBIQVNIX0ZBQ1RPUiArIFV0aWwuaGFzaENvZGUoY29tbWFuZCk7Ci0JCQloYXNoQ29kZSA9IGhhc2hDb2RlICogSEFTSF9GQUNUT1IKLQkJCQkJKyBVdGlsLmhhc2hDb2RlKHBhcmFtZXRlcml6YXRpb25zKTsKLQkJCWlmIChoYXNoQ29kZSA9PSBIQVNIX0NPREVfTk9UX0NPTVBVVEVEKSB7Ci0JCQkJaGFzaENvZGUrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFzaENvZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHtAbGluayBTdHJpbmd9IGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgaWQsIHBhcmFtZXRlciBpZHMgYW5kCi0JICogcGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhpcyB7QGxpbmsgUGFyYW1ldGVyaXplZENvbW1hbmR9LiBUaGUgcmV0dXJuZWQKLQkgKiB7QGxpbmsgU3RyaW5nfSBjYW4gYmUgc3RvcmVkIGJ5IGEgY2xpZW50IGFuZCBsYXRlciB1c2VkIHRvIHJlY29udHJ1Y3QgYW4KLQkgKiBlcXVpdmFsZW50IHtAbGluayBQYXJhbWV0ZXJpemVkQ29tbWFuZH0gdXNpbmcgdGhlCi0JICoge0BsaW5rIENvbW1hbmRNYW5hZ2VyI2Rlc2VyaWFsaXplKFN0cmluZyl9IG1ldGhvZC4KLQkgKiA8cD4KLQkgKiBUaGUgc3ludGF4IG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgU3RyaW5nfSBpcyBhcyBmb2xsb3dzOgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8YmxvY2txdW90ZT4KLQkgKiA8Y29kZT5zZXJpYWxpemF0aW9uID0gPHU+Y29tbWFuZElkPC91PiBbICcoJyBwYXJhbWV0ZXJzICcpJyBdPC9jb2RlPjxicj4KLQkgKiA8Y29kZT5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyIFsgJywnIHBhcmFtZXRlcnMgXTwvY29kZT48YnI+Ci0JICogPGNvZGU+cGFyYW1ldGVyID0gPHU+cGFyYW1ldGVySWQ8L3U+IFsgJz0nIDx1PnBhcmFtZXRlclZhbHVlPC91PiBdPC9jb2RlPgotCSAqIDwvYmxvY2txdW90ZT4KLQkgKiAKLQkgKiA8cD4KLQkgKiBJbiB0aGUgc3ludGF4IGFib3ZlLCBzZWN0aW9ucyBpbnNpZGUgc3F1YXJlLWJyYWNrZXRzIGFyZSBvcHRpb25hbC4gVGhlCi0JICogY2hhcmFjdGVycyBpbiBzaW5nbGUgcXVvdGVzICg8Y29kZT4oPC9jb2RlPiwgPGNvZGU+KTwvY29kZT4sCi0JICogPGNvZGU+LDwvY29kZT4gYW5kIDxjb2RlPj08L2NvZGU+KSBpbmRpY2F0ZSBsaXRlcmFsIGNoYXJhY3RlcnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPjx1PmNvbW1hbmRJZDwvdT48L2NvZGU+IHJlcHJlc2VudHMgdGhlIGNvbW1hbmQgaWQgZW5jb2RlZCB3aXRoCi0JICogc2VwYXJhdG9yIGNoYXJhY3RlcnMgZXNjYXBlZC4gPGNvZGU+PHU+cGFyYW1ldGVySWQ8L3U+PC9jb2RlPiBhbmQKLQkgKiA8Y29kZT48dT5wYXJhbWV0ZXJWYWx1ZTwvdT48L2NvZGU+IHJlcHJlc2VudCB0aGUgcGFyYW1ldGVyIGlkcyBhbmQKLQkgKiB2YWx1ZXMgZW5jb2RlZCB3aXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGVzY2FwZWQuIFRoZSBzZXBhcmF0b3IKLQkgKiBjaGFyYWN0ZXJzIDxjb2RlPig8L2NvZGU+LCA8Y29kZT4pPC9jb2RlPiwgPGNvZGU+LDwvY29kZT4gYW5kCi0JICogPGNvZGU+PTwvY29kZT4gYXJlIGVzY2FwZWQgYnkgcHJlcGVuZGluZyBhIDxjb2RlPiU8L2NvZGU+LiBUaGlzCi0JICogcmVxdWlyZXMgPGNvZGU+JTwvY29kZT4gdG8gYmUgZXNjYXBlZCwgd2hpY2ggaXMgYWxzbyBkb25lIGJ5IHByZXBlbmRpbmcKLQkgKiBhIDxjb2RlPiU8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgb3JkZXIgb2YgdGhlIHBhcmFtZXRlcnMgaXMgbm90IGRlZmluZWQgKGFuZCBub3QgaW1wb3J0YW50KS4gQSBtaXNzaW5nCi0JICogPGNvZGU+PHU+cGFyYW1ldGVyVmFsdWU8L3U+PC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlCi0JICogcGFyYW1ldGVyIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgdGhlIHN0cmluZyBzaG93biBiZWxvdyByZXByZXNlbnRzIGEgc2VyaWFsaXplZCBwYXJhbWV0ZXJpemVkCi0JICogY29tbWFuZCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNob3cgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlOgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT5vcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMuc2hvd1BlcnNwZWN0aXZlKG9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUucGVyc3BlY3RpdmVJZD1vcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlKTwvY29kZT4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBleGFtcGxlIHNob3dzIHRoZSBtb3JlIGdlbmVyYWwgZm9ybSB3aXRoIG11bHRpcGxlIHBhcmFtZXRlcnMsCi0JICogPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgcGFyYW1ldGVycywgYW5kIGVzY2FwZWQgPGNvZGU+PTwvY29kZT4gaW4gdGhlCi0JICogdGhpcmQgcGFyYW1ldGVyIHZhbHVlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT5jb21tYW5kLmlkKHBhcmFtMS5pZD12YWx1ZTEscGFyYW0yLmlkLHBhcmFtMy5pZD1lc2MlPXZhbDMpPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVzY2FwZWQgY29tbWFuZCBpZCwgcGFyYW1ldGVyIGlkcyBhbmQKLQkgKiAgICAgICAgIHBhcmFtZXRlciB2YWx1ZXM7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzZWUgQ29tbWFuZE1hbmFnZXIjZGVzZXJpYWxpemUoU3RyaW5nKQotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIHNlcmlhbGl6ZSgpIHsKLQkJZmluYWwgU3RyaW5nIGVzY2FwZWRJZCA9IGVzY2FwZShnZXRJZCgpKTsKLQotCQlpZiAoKHBhcmFtZXRlcml6YXRpb25zID09IG51bGwpIHx8IChwYXJhbWV0ZXJpemF0aW9ucy5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBlc2NhcGVkSWQ7Ci0JCX0KLQotCQlmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihlc2NhcGVkSWQpOwotCQlidWZmZXIuYXBwZW5kKENvbW1hbmRNYW5hZ2VyLlBBUkFNRVRFUl9TVEFSVF9DSEFSKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcml6YXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0KLQkJCWlmIChpID4gMCkgewotCQkJCS8vIGluc2VydCBzZXBhcmF0b3IgYmV0d2VlbiBwYXJhbWV0ZXJzCi0JCQkJYnVmZmVyLmFwcGVuZChDb21tYW5kTWFuYWdlci5QQVJBTUVURVJfU0VQQVJBVE9SX0NIQVIpOwotCQkJfQotCi0JCQlmaW5hbCBQYXJhbWV0ZXJpemF0aW9uIHBhcmFtZXRlcml6YXRpb24gPSBwYXJhbWV0ZXJpemF0aW9uc1tpXTsKLQkJCWZpbmFsIFN0cmluZyBwYXJhbWV0ZXJJZCA9IHBhcmFtZXRlcml6YXRpb24uZ2V0UGFyYW1ldGVyKCkuZ2V0SWQoKTsKLQkJCWZpbmFsIFN0cmluZyBlc2NhcGVkUGFyYW1ldGVySWQgPSBlc2NhcGUocGFyYW1ldGVySWQpOwotCi0JCQlidWZmZXIuYXBwZW5kKGVzY2FwZWRQYXJhbWV0ZXJJZCk7Ci0KLQkJCWZpbmFsIFN0cmluZyBwYXJhbWV0ZXJWYWx1ZSA9IHBhcmFtZXRlcml6YXRpb24uZ2V0VmFsdWUoKTsKLQkJCWlmIChwYXJhbWV0ZXJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGVzY2FwZWRQYXJhbWV0ZXJWYWx1ZSA9IGVzY2FwZShwYXJhbWV0ZXJWYWx1ZSk7Ci0JCQkJYnVmZmVyLmFwcGVuZChDb21tYW5kTWFuYWdlci5JRF9WQUxVRV9DSEFSKTsKLQkJCQlidWZmZXIuYXBwZW5kKGVzY2FwZWRQYXJhbWV0ZXJWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlidWZmZXIuYXBwZW5kKENvbW1hbmRNYW5hZ2VyLlBBUkFNRVRFUl9FTkRfQ0hBUik7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlBhcmFtZXRlcml6ZWRDb21tYW5kKCIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoY29tbWFuZCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJywnKTsKLQkJYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJpemF0aW9ucyk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9TZXJpYWxpemF0aW9uRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvU2VyaWFsaXphdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTAxMzQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9TZXJpYWxpemF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGFuIGV4Y2VwdGlvbiBvY2N1cmVkIHdoaWxlIHNlcmlhbGl6aW5nIGEKLSAqIHtAbGluayBQYXJhbWV0ZXJpemVkQ29tbWFuZH0gdG8gYSBzdHJpbmcgb3IgZGVzZXJpYWxpemluZyBhIFN0cmluZyB0byBhCi0gKiB7QGxpbmsgUGFyYW1ldGVyaXplZENvbW1hbmR9LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZWQgc2VyaWFsIHZlcnNpb24gVUlEIGZvciB0aGlzIGNsYXNzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI2OTE1OTk2NzQ1NjE2ODQ5NDlMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFNlcmlhbGl6YXRpb25FeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UKLQkgKiBhbmQgY2F1c2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBjYXVzZQotCSAqICAgICAgICAgICAgdGhlIGNhdXNlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFNlcmlhbGl6YXRpb25FeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbW1vbi9BYnN0cmFjdEJpdFNldEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29tbW9uL0Fic3RyYWN0Qml0U2V0RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhNmE0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29tbW9uL0Fic3RyYWN0Qml0U2V0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uOwotCi0vKioKLSAqIDxwPgotICogQW4gZXZlbnQgdGhhdCBjYXJyaWVzIHdpdGggaXQgdHdvIG9yIG1vcmUgYm9vbGVhbiB2YWx1ZXMuICBUaGlzIHByb3ZpZGVzIGEKLSAqIHNpbmdsZSBpbnRlZ2VyIHZhbHVlIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgYXMgYSBiaXQgc2V0LgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJpdFNldEV2ZW50IHsKLQotCS8qKgotCSAqIEEgY29sbGVjdGlvbiBvZiBiaXRzIHJlcHJlc2VudGluZyB3aGV0aGVyIGNlcnRhaW4gdmFsdWVzIGhhdmUgY2hhbmdlZC4gQQotCSAqIGJpdCBpcyBzZXQgKGkuZS4sIDxjb2RlPjE8L2NvZGU+KSBpZiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBoYXMKLQkgKiBjaGFuZ2VkLiBJdCBjYW4gYmUgYXNzdW1lZCB0aGF0IHRoaXMgdmFsdWUgd2lsbCBiZSBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQKLQkgKiBieSB0aGUgc3VwZXJjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNoYW5nZWRWYWx1ZXMgPSAwOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbW1vbi9BYnN0cmFjdEhhbmRsZU9iamVjdEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29tbW9uL0Fic3RyYWN0SGFuZGxlT2JqZWN0RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwY2ZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29tbW9uL0Fic3RyYWN0SGFuZGxlT2JqZWN0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb247Ci0KLS8qKgotICogPHA+Ci0gKiBBbiBldmVudCBmaXJlZCBmcm9tIGEgPGNvZGU+TmFtZWRIYW5kbGVPYmplY3Q8L2NvZGU+LiBUaGlzIHByb3ZpZGVzCi0gKiBub3RpZmljYXRpb24gb2YgY2hhbmdlcyB0byB0aGUgZGVmaW5lZCBzdGF0ZSwgdGhlIG5hbWUgYW5kIHRoZSBkZXNjcmlwdGlvbi4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIYW5kbGVPYmplY3RFdmVudCBleHRlbmRzIEFic3RyYWN0Qml0U2V0RXZlbnQgewotCi0JLyoqCi0JICogVGhlIGJpdCB1c2VkIHRvIHJlcHJlc2VudCB3aGV0aGVyIHRoZSBjYXRlZ29yeSBoYXMgY2hhbmdlZCBpdHMgZGVmaW5lZAotCSAqIHN0YXRlLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENIQU5HRURfREVGSU5FRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbGFzdCB1c2VkIGJpdCBzbyB0aGF0IHN1YmNsYXNzZXMgY2FuIGFkZCBtb3JlIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9CSVRfVVNFRF9BQlNUUkFDVF9IQU5ETEUgPSBDSEFOR0VEX0RFRklORUQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPkFic3RyYWN0SGFuZGxlT2JqZWN0RXZlbnQ8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBkZWZpbmVkQ2hhbmdlZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmZiB0aGUgZGVmaW5lZCBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEhhbmRsZU9iamVjdEV2ZW50KGZpbmFsIGJvb2xlYW4gZGVmaW5lZENoYW5nZWQpIHsKLQkJaWYgKGRlZmluZWRDaGFuZ2VkKSB7Ci0JCQljaGFuZ2VkVmFsdWVzIHw9IENIQU5HRURfREVGSU5FRDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGRlZmluZWQgcHJvcGVydHkgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LCBpZmYgdGhlIGRlZmluZWQgcHJvcGVydHkgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmluZWRDaGFuZ2VkKCkgewotCQlyZXR1cm4gKChjaGFuZ2VkVmFsdWVzICYgQ0hBTkdFRF9ERUZJTkVEKSAhPSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29tbW9uL0Fic3RyYWN0TmFtZWRIYW5kbGVFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbW1vbi9BYnN0cmFjdE5hbWVkSGFuZGxlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2YTc5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29tbW9uL0Fic3RyYWN0TmFtZWRIYW5kbGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbjsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIGV2ZW50IGZpcmVkIGZyb20gYSA8Y29kZT5OYW1lZEhhbmRsZU9iamVjdDwvY29kZT4uIFRoaXMgcHJvdmlkZXMKLSAqIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIHRvIHRoZSBkZWZpbmVkIHN0YXRlLCB0aGUgbmFtZSBhbmQgdGhlIGRlc2NyaXB0aW9uLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5hbWVkSGFuZGxlRXZlbnQgZXh0ZW5kcwotCQlBYnN0cmFjdEhhbmRsZU9iamVjdEV2ZW50IHsKLQotCS8qKgotCSAqIFRoZSBiaXQgdXNlZCB0byByZXByZXNlbnQgd2hldGhlciB0aGUgY2F0ZWdvcnkgaGFzIGNoYW5nZWQgaXRzCi0JICogZGVzY3JpcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRF9ERVNDUklQVElPTiA9IDEgPDwgTEFTVF9CSVRfVVNFRF9BQlNUUkFDVF9IQU5ETEU7Ci0KLQkvKioKLQkgKiBUaGUgYml0IHVzZWQgdG8gcmVwcmVzZW50IHdoZXRoZXIgdGhlIGNhdGVnb3J5IGhhcyBjaGFuZ2VkIGl0cyBuYW1lLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENIQU5HRURfTkFNRSA9IDEgPDwgTEFTVF9CSVRfVVNFRF9BQlNUUkFDVF9IQU5ETEU7Ci0KLQkvKioKLQkgKiBUaGUgbGFzdCB1c2VkIGJpdCBzbyB0aGF0IHN1YmNsYXNzZXMgY2FuIGFkZCBtb3JlIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9VU0VEX0JJVCA9IENIQU5HRURfTkFNRTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+QWJzdHJhY3RIYW5kbGVPYmplY3RFdmVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGRlZmluZWRDaGFuZ2VkCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiwgaWZmIHRoZSBkZWZpbmVkIHByb3BlcnR5IGNoYW5nZWQuCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uQ2hhbmdlZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkgY2hhbmdlZC4KLQkgKiBAcGFyYW0gbmFtZUNoYW5nZWQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+LCBpZmYgdGhlIG5hbWUgcHJvcGVydHkgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3ROYW1lZEhhbmRsZUV2ZW50KGZpbmFsIGJvb2xlYW4gZGVmaW5lZENoYW5nZWQsCi0JCQlmaW5hbCBib29sZWFuIGRlc2NyaXB0aW9uQ2hhbmdlZCwgZmluYWwgYm9vbGVhbiBuYW1lQ2hhbmdlZCkgewotCQlzdXBlcihkZWZpbmVkQ2hhbmdlZCk7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uQ2hhbmdlZCkgewotCQkJY2hhbmdlZFZhbHVlcyB8PSBDSEFOR0VEX0RFU0NSSVBUSU9OOwotCQl9Ci0JCWlmIChuYW1lQ2hhbmdlZCkgewotCQkJY2hhbmdlZFZhbHVlcyB8PSBDSEFOR0VEX05BTUU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4sIGlmZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Rlc2NyaXB0aW9uQ2hhbmdlZCgpIHsKLQkJcmV0dXJuICgoY2hhbmdlZFZhbHVlcyAmIENIQU5HRURfREVTQ1JJUFRJT04pICE9IDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG5hbWUgcHJvcGVydHkgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LCBpZmYgdGhlIG5hbWUgcHJvcGVydHkgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc05hbWVDaGFuZ2VkKCkgewotCQlyZXR1cm4gKChjaGFuZ2VkVmFsdWVzICYgQ0hBTkdFRF9OQU1FKSAhPSAwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vQ29tbWFuZEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbW1vbi9Db21tYW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODQ2MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbW1vbi9Db21tYW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb247Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGFuIGV4Y2VwdGlvbiBvY2N1cmVkIHdpdGhpbiB0aGUgY29tbWFuZCBhcmNoaXRlY3R1cmUuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1hbmRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQotCS8qKgotCSAqIFRoaXMgbWVtYmVyIHZhcmlhYmxlIGlzIHJlcXVpcmVkIGhlcmUgdG8gYWxsb3cgdXMgdG8gY29tcGlsZSBhZ2FpbnN0IEpDTAotCSAqIGZvdW5kYXRpb24gbGlicmFyaWVzLiAgVGhlIHZhbHVlIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIFRocm93YWJsZSBjYXVzZTsKLQkKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2U7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tbWFuZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlCi0gICAgICogYW5kIGNhdXNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2U7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBDb21tYW5kRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgICAgIC8vIGRvbid0IHBhc3MgdGhlIGNhdXNlIHRvIHN1cGVyLCB0byBhbGxvdyBjb21waWxhdGlvbiBhZ2FpbnN0IEpDTCBGb3VuZGF0aW9uCi0gICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2F1c2Ugb2YgdGhpcyB0aHJvd2FibGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0gICAgICogY2F1c2UgaXMgbm9uZXhpc3RlbnQgb3IgdW5rbm93bi4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2F1c2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewotICAgICAgICByZXR1cm4gY2F1c2U7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbW1vbi9FdmVudE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vRXZlbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYTJiMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbW1vbi9FdmVudE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vSGFuZGxlT2JqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29tbW9uL0hhbmRsZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmEwN2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vSGFuZGxlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5jb21tYW5kcy51dGlsLlV0aWw7Ci0KLS8qKgotICogPHA+Ci0gKiBBbiBvYmplY3QgdGhhdCBjYW4gZXhpc3QgaW4gb25lIG9mIHR3byBzdGF0ZXM6IGRlZmluZWQgYW5kIHVuZGVmaW5lZC4gVGhpcyBpcwotICogdXNlZCBieSBBUElzIHRoYXQgd2FudCB0byBnaXZlIGEgaGFuZGxlIHRvIGFuIG9iamVjdCwgZXZlbiB0aG91Z2ggdGhlIG9iamVjdAotICogZG9lcyBub3QgZnVsbHkgZXhpc3QgeWV0LiBUaGlzIHdheSwgdXNlcnMgY2FuIGF0dGFjaCBsaXN0ZW5lcnMgdG8gb2JqZWN0cwotICogYmVmb3JlIHRoZXkgY29tZSBpbnRvIGV4aXN0ZW5jZS4gSXQgYWxzbyBwcm90ZWN0cyB0aGUgQVBJIGZyb20gdXNlcnMgdGhhdCBkbwotICogbm90IHJlbGVhc2UgcmVmZXJlbmNlcyB3aGVuIHRoZXkgc2hvdWxkLgotICogPC9wPgotICogPHA+Ci0gKiBUbyBlbmZvcmNlIGdvb2QgY29kaW5nIHByYWN0aWNlLCBhbGwgaGFuZGxlIG9iamVjdHMgbXVzdCBpbXBsZW1lbnQKLSAqIDxjb2RlPmVxdWFsczwvY29kZT4gYW5kIDxjb2RlPnRvU3RyaW5nPC9jb2RlPi4gUGxlYXNlIHVzZQotICogPGNvZGU+c3RyaW5nPC9jb2RlPiB0byBjYWNoZSB0aGUgcmVzdWx0IGZvciA8Y29kZT50b1N0cmluZzwvY29kZT4gb25jZQotICogY2FsY3VsYXRlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogQWxsIGhhbmRsZSBvYmplY3RzIGFyZSByZWZlcnJlZCB0byB1c2luZyBhIHNpbmdsZSBpZGVudGlmaWVyLiBUaGlzIGlkZW50aWZpZXIKLSAqIGlzIGEgaW5zdGFuY2Ugb2YgPGNvZGU+U3RyaW5nPC9jb2RlPi4gSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhpcyBpZGVudGlmaWVyCi0gKiByZW1haW4gdW5pcXVlIHdpdGhpbiB3aGF0ZXZlciBjb250ZXh0IHRoYXQgaGFuZGxlIG9iamVjdCBpcyBiZWluZyB1c2VkLiBGb3IKLSAqIGV4YW1wbGUsIHRoZXJlIHNob3VsZCBvbmx5IGV2ZXIgYmUgb25lIGluc3RhbmNlIG9mIDxjb2RlPkNvbW1hbmQ8L2NvZGU+Ci0gKiB3aXRoIGEgZ2l2ZW4gaWRlbnRpZmllci4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSGFuZGxlT2JqZWN0IGV4dGVuZHMgRXZlbnRNYW5hZ2VyIHsKLQotCS8qKgotCSAqIFRoZSBjb25zdGFudCBpbnRlZ2VyIGhhc2ggY29kZSB2YWx1ZSBtZWFuaW5nIHRoZSBoYXNoIGNvZGUgaGFzIG5vdCB5ZXQKLQkgKiBiZWVuIGNvbXB1dGVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0NPREVfTk9UX0NPTVBVVEVEID0gLTE7Ci0JCi0gICAgLyoqCi0gICAgICogQSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgaGFzaCBjb2RlIGZvciBhbGwgc2NoZW1lcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9GQUNUT1IgPSA4OTsKLQotICAgIC8qKgotICAgICAqIFRoZSBzZWVkIGZvciB0aGUgaGFzaCBjb2RlIGZvciBhbGwgc2NoZW1lcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9JTklUSUFMID0gSGFuZGxlT2JqZWN0LmNsYXNzLmdldE5hbWUoKQotICAgICAgICAgICAgLmhhc2hDb2RlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoaXMgb2JqZWN0IGlzIGRlZmluZWQuIEEgZGVmaW5lZCBvYmplY3QgaXMgb25lIHRoYXQgaGFzIGJlZW4KLSAgICAgKiBmdWxseSBpbml0aWFsaXplZC4gQnkgZGVmYXVsdCwgYWxsIG9iamVjdHMgc3RhcnQgYXMgdW5kZWZpbmVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgYm9vbGVhbiBkZWZpbmVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaGFzaCBjb2RlIGZvciB0aGlzIG9iamVjdC4gVGhpcyB2YWx1ZSBpcyBjb21wdXRlZCBsYXppbHksIGFuZCBtYXJrZWQKLSAgICAgKiBhcyBpbnZhbGlkIHdoZW4gb25lIG9mIHRoZSB2YWx1ZXMgb24gd2hpY2ggaXQgaXMgYmFzZWQgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBpbnQgaGFzaENvZGUgPSBIQVNIX0NPREVfTk9UX0NPTVBVVEVEOwotCi0gICAgLyoqCi0gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgb2JqZWN0LiBUaGlzIGlkZW50aWZpZXIgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MKLSAgICAgKiBhbGwgb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGFuZCBzaG91bGQgbmV2ZXIgY2hhbmdlLiBUaGlzIHZhbHVlIHdpbGwKLSAgICAgKiBuZXZlciBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4gVGhpcyBzdHJpbmcgaXMgZm9yIGRlYnVnZ2luZwotICAgICAqIHB1cnBvc2VzIG9ubHksIGFuZCBpcyBub3QgbWVhbnQgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBUaGlzIHZhbHVlCi0gICAgICogaXMgY29tcHV0ZWQgbGF6aWx5LCBhbmQgaXMgY2xlYXJlZCBpZiBvbmUgb2YgaXRzIGRlcGVuZGVudCB2YWx1ZXMKLSAgICAgKiBjaGFuZ2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPkhhbmRsZU9iamVjdDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICBUaGUgaWQgb2YgdGhpcyBoYW5kbGU7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHByb3RlY3RlZCBIYW5kbGVPYmplY3QoZmluYWwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGEgaGFuZGxlIHdpdGggYSBudWxsIGlkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMgb2JqZWN0IGlzIGVxdWFsIHRvIGFub3RoZXIgb2JqZWN0LiBBIGhhbmRsZSBvYmplY3QgaXMKLSAgICAgKiBvbmx5IGVxdWFsIHRvIGFub3RoZXIgaGFuZGxlIG9iamVjdCB3aXRoIHRoZSBzYW1lIGlkIGFuZCB0aGUgc2FtZSBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICBUaGUgb2JqZWN0IHdpdGggd2hpY2ggdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdHMgYXJlIGVxdWFsOyA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KLSAgICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iamVjdCkgewotCQkvLyBDaGVjayBpZiB0aGV5J3JlIHRoZSBzYW1lLgotCQlpZiAob2JqZWN0ID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gQ2hlY2sgaWYgdGhleSdyZSB0aGUgc2FtZSB0eXBlLgotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBIYW5kbGVPYmplY3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIENoZWNrIGVhY2ggcHJvcGVydHkgaW4gdHVybi4KLQkJZmluYWwgSGFuZGxlT2JqZWN0IGhhbmRsZT0gKEhhbmRsZU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gVXRpbC5lcXVhbHMoaWQsIGhhbmRsZS5pZCkKLQkJCQkmJiAodGhpcy5nZXRDbGFzcygpID09IGhhbmRsZS5nZXRDbGFzcygpKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIGZvciB0aGlzIGNvbW1hbmQuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgaWRlbnRpZmllcjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGVzIHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgb2JqZWN0IGJhc2VkIG9uIHRoZSBpZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGlmIChoYXNoQ29kZSA9PSBIQVNIX0NPREVfTk9UX0NPTVBVVEVEKSB7Ci0JCQloYXNoQ29kZSA9IEhBU0hfSU5JVElBTCAqIEhBU0hfRkFDVE9SICsgVXRpbC5oYXNoQ29kZShpZCk7Ci0JCQlpZiAoaGFzaENvZGUgPT0gSEFTSF9DT0RFX05PVF9DT01QVVRFRCkgewotCQkJCWhhc2hDb2RlKys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhhc2hDb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhpcyBpbnN0YW5jZSBpcyBkZWZpbmVkLiBBIGRlZmluZWQgaW5zdGFuY2UgaXMgb25lIHRoYXQgaGFzIGJlZW4KLSAgICAgKiBmdWxseSBpbml0aWFsaXplZC4gVGhpcyBhbGxvd3Mgb2JqZWN0cyB0byBlZmZlY3RpdmVseSBkaXNhcHBlYXIgZXZlbgotICAgICAqIHRob3VnaCBvdGhlciBvYmplY3RzIG1heSBzdGlsbCBoYXZlIHJlZmVyZW5jZXMgdG8gdGhlbS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGlzIGRlZmluZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVmaW5lZCgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmluZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdCAtLSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCi0gICAgICogVGhpcyBzdHJpbmcgc2hvdWxkIG5vdCBiZSBzaG93biB0byBhbiBlbmQgdXNlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb247IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdG9TdHJpbmcoKTsKLQotICAgIC8qKgotICAgICAqIE1ha2VzIHRoaXMgb2JqZWN0IGJlY29tZXMgdW5kZWZpbmVkLiBUaGlzIG1ldGhvZCBzaG91bGQgbWFrZSBhbnkgZGVmaW5lZAotICAgICAqIHByb3BlcnRpZXMgPGNvZGU+bnVsbDwvY29kZT4uIEl0IHNob3VsZCBhbHNvIHNlbmQgbm90aWZpY2F0aW9uIHRvIGFueQotICAgICAqIGxpc3RlbmVycyB0aGF0IHRoZXNlIHByb3BlcnRpZXMgaGF2ZSBjaGFuZ2VkLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHVuZGVmaW5lKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29tbW9uL0hhbmRsZU9iamVjdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vSGFuZGxlT2JqZWN0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjBjODg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vSGFuZGxlT2JqZWN0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbW1vbi9OYW1lZEhhbmRsZU9iamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbW1vbi9OYW1lZEhhbmRsZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWVhMDY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vTmFtZWRIYW5kbGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbjsKLQotLyoqCi0gKiBBIGhhbmRsZSBvYmplY3QgdGhhdCBjYXJyaWVzIHdpdGggaXQgYSBuYW1lIGFuZCBhIGRlc2NyaXB0aW9uLiBUaGlzIHR5cGUgb2YKLSAqIGhhbmRsZSBvYmplY3QgaXMgcXVpdGUgY29tbW9uIGFjcm9zcyB0aGUgY29tbWFuZHMgY29kZSBiYXNlLiBGb3IgZXhhbXBsZSwKLSAqIDxjb2RlPkNvbW1hbmQ8L2NvZGU+LCA8Y29kZT5Db250ZXh0PC9jb2RlPiBhbmQgPGNvZGU+U2NoZW1lPC9jb2RlPi4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZWRIYW5kbGVPYmplY3QgZXh0ZW5kcyBIYW5kbGVPYmplY3QgewotCi0JLyoqCi0JICogVGhlIGRlc2NyaXB0aW9uIGZvciB0aGlzIGhhbmRsZS4gVGhpcyB2YWx1ZSBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGUgaGFuZGxlIGlzIHVuZGVmaW5lZCBvciBoYXMgbm8gZGVzY3JpcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGlzIGhhbmRsZS4gVGhpcyB2YWx1ZCBzaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogdW5sZXNzIHRoZSBoYW5kbGUgaXMgdW5kZWZpbmVkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPk5hbWVkSGFuZGxlT2JqZWN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIGhhbmRsZTsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIE5hbWVkSGFuZGxlT2JqZWN0KGZpbmFsIFN0cmluZyBpZCkgewotCQlzdXBlcihpZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgaGFuZGxlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGRlc2NyaXB0aW9uOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIGRlc2NyaXB0aW9uLgotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBoYW5kbGUgaXMgbm90IGN1cnJlbnRseSBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEZWZpbmVkKCkpIHsKLQkJCXRocm93IG5ldyBOb3REZWZpbmVkRXhjZXB0aW9uKAotCQkJCQkiQ2Fubm90IGdldCBhIGRlc2NyaXB0aW9uIGZyb20gYW4gdW5kZWZpbmVkIG9iamVjdC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgZm9yIHRoaXMgaGFuZGxlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5hbWUgZm9yIHRoaXMgaGFuZGxlOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgaGFuZGxlIGlzIG5vdCBjdXJyZW50bHkgZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEZWZpbmVkKCkpIHsKLQkJCXRocm93IG5ldyBOb3REZWZpbmVkRXhjZXB0aW9uKAotCQkJCQkiQ2Fubm90IGdldCB0aGUgbmFtZSBmcm9tIGFuIHVuZGVmaW5lZCBvYmplY3QuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vTmFtZWRIYW5kbGVPYmplY3RDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29tbW9uL05hbWVkSGFuZGxlT2JqZWN0Q29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFhZWMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vTmFtZWRIYW5kbGVPYmplY3RDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29tbW9uL05vdERlZmluZWRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vTm90RGVmaW5lZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDkyMDlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vTm90RGVmaW5lZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFjY2VzcyB0aGUgcHJvcGVydGllcyBvZiBhbiB1bmRlZmluZWQKLSAqIG9iamVjdC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTm90RGVmaW5lZEV4Y2VwdGlvbiBleHRlbmRzIENvbW1hbmRFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcmlhbCB2ZXJzaW9uIFVJRCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzU3Mjc4ODk5ODEyNDU5Nkw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2U7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm90RGVmaW5lZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgewotICAgICAgICBzdXBlcihzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29tbW9uL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTdiYzIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb21tb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9kZWZhdWx0X3N0eWxlLmNzcyIKLQl0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci08Ym9keSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOyBjb2xvcjogcmdiKDAsIDAsIDApIj4KLUFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZXMgZm9yIGNvbW1vbiBiYXNlIGNsYXNzZXMuCi08aDI+UGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLTxwPgotVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHNvbWUgY29tbW9uIGJhc2UgY2xhc3NlcyBhbmQgZXhjZXB0aW9ucyB0aGF0IGFyZSB1c2VkIGluCi1vbmUgb3IgbW9yZSBwYWNrYWdlcyBlbHNld2hlcmUuICBOb3RoaW5nIGluIHRoaXMgcGFja2FnZSBpcyBpbnRlbmRlZCB0byBiZQotZGlyZWN0bHkgc3ViY2xhc3NlZCwgb3IgdXNlZC4gIFRoZSBjb2RlIGhlcmUgb25seSBzdXBwb3J0cyBjb2RlIGluIG90aGVyCi1wYWNrYWdlcy4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb250ZXh0cy9Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29udGV4dHMvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDVjNWUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb250ZXh0cy9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uTmFtZWRIYW5kbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uTm90RGVmaW5lZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbW1hbmRzLnV0aWwuVXRpbDsKLQotLyoqCi0gKiA8cD4KLSAqIEEgY29udGV4dCBpcyBhbiBhbnN3ZXIgdG8gdGhlIHF1ZXN0aW9uICJ3aGVuIi4gT3RoZXIgc2VydmljZXMgY2FuIGxpc3RlbiBmb3IKLSAqIHRoZSBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24gb2YgY29udGV4dHMsIGFuZCBjaGFuZ2UgdGhlaXIgb3duIHN0YXRlIGluCi0gKiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2VzLiBGb3IgZXhhbXBsZSwgRWNsaXBzZSdzIGtleSBiaW5kaW5nIHNlcnZpY2UgbGlzdGVucwotICogdG8gY29udGV4dCBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGtleSBiaW5kaW5ncyBzaG91bGQKLSAqIGJlIGFjdGl2ZS4KLSAqIDwvcD4KLSAqIDxwPgotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIG9idGFpbmVkIGZyb20gYW4gaW5zdGFuY2Ugb2YKLSAqIDxjb2RlPkNvbnRleHRNYW5hZ2VyPC9jb2RlPiBmb3IgYW55IGlkZW50aWZpZXIsIHdoZXRoZXIgb3Igbm90IGFuIGNvbnRleHQKLSAqIHdpdGggdGhhdCBpZGVudGlmaWVyIGlzIGRlZmluZWQgaW4gdGhlIGV4dGVuc2lvbiByZWdpc3RyeS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGhhbmRsZS1iYXNlZCBuYXR1cmUgb2YgdGhpcyBBUEkgYWxsb3dzIGl0IHRvIHdvcmsgd2VsbCB3aXRoIHJ1bnRpbWUKLSAqIHBsdWdpbiBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24uIElmIGEgY29udGV4dCBpcyBkZWZpbmVkLCB0aGF0IG1lYW5zIHRoYXQKLSAqIGl0cyBjb3JyZXNwb25kaW5nIHBsdWctaW4gaXMgYWN0aXZlLiBJZiB0aGUgcGx1Zy1pbiBpcyB0aGVuIGRlYWN0aXZhdGVkLCB0aGUKLSAqIGNvbnRleHQgd2lsbCBzdGlsbCBleGlzdCBidXQgaXQgd2lsbCBiZSB1bmRlZmluZWQuIEFuIGF0dGVtcHRzIHRvIHVzZSBhbgotICogdW5kZWZpbmVkIGNvbnRleHQgd2lsbCByZXN1bHQgaW4gYSA8Y29kZT5Ob3REZWZpbmVkRXhjZXB0aW9uPC9jb2RlPiBiZWluZwotICogdGhyb3duLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKiBAc2VlIENvbnRleHRNYW5hZ2VyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZXh0IGV4dGVuZHMgTmFtZWRIYW5kbGVPYmplY3QgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb2xsZWN0aW9uIG9mIGFsbCBvYmplY3RzIGxpc3RlbmluZyB0byBjaGFuZ2VzIG9uIHRoaXMgY29udGV4dC4gVGhpcwotICAgICAqIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZXQgbGlzdGVuZXJzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYXJlbnQgaWRlbnRpZmllciBmb3IgdGhpcyBjb250ZXh0LiBUaGUgbWVhbmluZyBvZiBhIHBhcmVudCBpcwotICAgICAqIGRlcGVuZGVudCBvbiB0aGUgc3lzdGVtIHVzaW5nIGNvbnRleHRzLiBUaGlzIHZhbHVlIGNhbiBiZQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb250ZXh0IGhhcyBubyBwYXJlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyZW50SWQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5Db250ZXh0PC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBpZCBmb3IgdGhpcyBjb250ZXh0OyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBDb250ZXh0KGZpbmFsIFN0cmluZyBpZCkgewotICAgICAgICBzdXBlcihpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGFuIGluc3RhbmNlIG9mIDxjb2RlPklDb250ZXh0TGlzdGVuZXI8L2NvZGU+IHRvIGxpc3RlbiBmb3IKLSAgICAgKiBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnN0YW5jZSB0byByZWdpc3Rlci4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uIElmCi0gICAgICogICAgICAgICAgICBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVnaXN0ZXIgYW4gaW5zdGFuY2Ugd2hpY2ggaXMgYWxyZWFkeQotICAgICAqICAgICAgICAgICAgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgaW5zdGFuY2UsIG5vIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgYWRkQ29udGV4dExpc3RlbmVyKGZpbmFsIElDb250ZXh0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfSAKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGZpbmFsIENvbnRleHQgc2NoZW1lID0gKENvbnRleHQpIG9iamVjdDsKLSAgICAgICAgaW50IGNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZSh0aGlzLmlkLCBzY2hlbWUuaWQpOwotICAgICAgICBpZiAoY29tcGFyZVRvID09IDApIHsKLSAgICAgICAgICAgIGNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZSh0aGlzLm5hbWUsIHNjaGVtZS5uYW1lKTsKLSAgICAgICAgICAgIGlmIChjb21wYXJlVG8gPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZSh0aGlzLnBhcmVudElkLCBzY2hlbWUucGFyZW50SWQpOwotICAgICAgICAgICAgICAgIGlmIChjb21wYXJlVG8gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb21wYXJlVG8gPSBVdGlsLmNvbXBhcmUodGhpcy5kZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWUuZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZVRvID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZSh0aGlzLmRlZmluZWQsIHNjaGVtZS5kZWZpbmVkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb21wYXJlVG87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRGVmaW5lcyB0aGlzIGNvbnRleHQgYnkgZ2l2aW5nIGl0IGEgbmFtZSwgYW5kIHBvc3NpYmx5IGEgZGVzY3JpcHRpb24gYW5kCi0gICAgICogYSBwYXJlbnQgaWRlbnRpZmllciBhcyB3ZWxsLiBUaGUgZGVmaW5lZCBwcm9wZXJ0eSBhdXRvbWF0aWNhbGx5IGJlY29tZXMKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90aWZpY2F0aW9uIGlzIHNlbnQgdG8gYWxsIGxpc3RlbmVycyB0aGF0IHNvbWV0aGluZyBoYXMgY2hhbmdlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoaXMgY29udGV4dDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uCi0gICAgICogICAgICAgICAgICBUaGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgY29udGV4dDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBwYXJlbnRJZAotICAgICAqICAgICAgICAgICAgVGhlIHBhcmVudCBpZGVudGlmaWVyIGZvciB0aGlzIGNvbnRleHQ7IG1heSBiZQotICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVmaW5lKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlIG5hbWUgb2YgYSBzY2hlbWUgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBkZWZpbmVkQ2hhbmdlZCA9ICF0aGlzLmRlZmluZWQ7Ci0gICAgICAgIHRoaXMuZGVmaW5lZCA9IHRydWU7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBuYW1lQ2hhbmdlZCA9ICFVdGlsLmVxdWFscyh0aGlzLm5hbWUsIG5hbWUpOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gZGVzY3JpcHRpb25DaGFuZ2VkID0gIVV0aWwuZXF1YWxzKHRoaXMuZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24pOwotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBwYXJlbnRJZENoYW5nZWQgPSAhVXRpbC5lcXVhbHModGhpcy5wYXJlbnRJZCwgcGFyZW50SWQpOwotICAgICAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7Ci0KLSAgICAgICAgZmlyZUNvbnRleHRDaGFuZ2VkKG5ldyBDb250ZXh0RXZlbnQodGhpcywgZGVmaW5lZENoYW5nZWQsIG5hbWVDaGFuZ2VkLAotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uQ2hhbmdlZCwgcGFyZW50SWRDaGFuZ2VkKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgYWxsIGxpc3RlbmVycyB0aGF0IHRoaXMgY29udGV4dCBoYXMgY2hhbmdlZC4gVGhpcyBzZW5kcyB0aGUKLSAgICAgKiBnaXZlbiBldmVudCB0byBhbGwgb2YgdGhlIGxpc3RlbmVycywgaWYgYW55LgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudAotICAgICAqICAgICAgICAgICAgVGhlIGV2ZW50IHRvIHNlbmQgdG8gdGhlIGxpc3RlbmVyczsgbXVzdCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBmaXJlQ29udGV4dENoYW5nZWQoZmluYWwgQ29udGV4dEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgc2VuZCBhIG51bGwgZXZlbnQgdG8gbGlzdGVuZXJzLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEl0ZXJhdG9yIGxpc3RlbmVySXRyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChsaXN0ZW5lckl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIElDb250ZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoSUNvbnRleHRMaXN0ZW5lcikgbGlzdGVuZXJJdHIKLSAgICAgICAgICAgICAgICAgICAgLm5leHQoKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLmNvbnRleHRDaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCBvZiB0aGlzIGluc3RhbmNlLgotICAgICAqIDxwPgotICAgICAqIE5vdGlmaWNhdGlvbiBpcyBzZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycyBpZiB0aGlzIHByb3BlcnR5Ci0gICAgICogY2hhbmdlcy4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50IG9mIHRoaXMgaW5zdGFuY2UuIE1heSBiZQotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBpbnN0YW5jZSBpcyBub3QgZGVmaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBhcmVudElkKCkgdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24gewotICAgICAgICBpZiAoIWRlZmluZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb3REZWZpbmVkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGdldCB0aGUgcGFyZW50IGlkZW50aWZpZXIgZnJvbSBhbiB1bmRlZmluZWQgY29udGV4dC4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhcmVudElkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVucmVnaXN0ZXJzIGFuIGluc3RhbmNlIG9mIDxjb2RlPklDb250ZXh0TGlzdGVuZXI8L2NvZGU+IGxpc3RlbmluZyBmb3IKLSAgICAgKiBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dExpc3RlbmVyCi0gICAgICogICAgICAgICAgICB0aGUgaW5zdGFuY2UgdG8gdW5yZWdpc3Rlci4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogICAgICAgICAgICBJZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdW5yZWdpc3RlciBhbiBpbnN0YW5jZSB3aGljaCBpcyBub3QKLSAgICAgKiAgICAgICAgICAgIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgaW5zdGFuY2UsIG5vIG9wZXJhdGlvbiBpcwotICAgICAqICAgICAgICAgICAgcGVyZm9ybWVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUNvbnRleHRMaXN0ZW5lcigKLSAgICAgICAgICAgIGZpbmFsIElDb250ZXh0TGlzdGVuZXIgY29udGV4dExpc3RlbmVyKSB7Ci0gICAgICAgIGlmIChjb250ZXh0TGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDYW5ub3QgcmVtb3ZlIGEgbnVsbCBsaXN0ZW5lci4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKGNvbnRleHRMaXN0ZW5lcik7Ci0KLSAgICAgICAgaWYgKGxpc3RlbmVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGxpc3RlbmVycyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29udGV4dCAtLSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCi0gICAgICogVGhpcyBzdHJpbmcgc2hvdWxkIG5vdCBiZSBzaG93biB0byBhbiBlbmQgdXNlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb247IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIkNvbnRleHQoIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoaWQpOwotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChwYXJlbnRJZCk7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGRlZmluZWQpOwotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgnKScpOwotICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlcyB0aGlzIGNvbnRleHQgYmVjb21lIHVuZGVmaW5lZC4gVGhpcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNoYW5naW5nCi0gICAgICogdGhlIG5hbWUsIGRlc2NyaXB0aW9uIGFuZCBwYXJlbnQgaWRlbnRpZmllciB0byA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBOb3RpZmljYXRpb24gaXMgc2VudCB0byBhbGwgbGlzdGVuZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHVuZGVmaW5lKCkgewotICAgICAgICBzdHJpbmcgPSBudWxsOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gZGVmaW5lZENoYW5nZWQgPSBkZWZpbmVkOwotICAgICAgICBkZWZpbmVkID0gZmFsc2U7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBuYW1lQ2hhbmdlZCA9IG5hbWUgIT0gbnVsbDsKLSAgICAgICAgbmFtZSA9IG51bGw7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBkZXNjcmlwdGlvbkNoYW5nZWQgPSBkZXNjcmlwdGlvbiAhPSBudWxsOwotICAgICAgICBkZXNjcmlwdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBwYXJlbnRJZENoYW5nZWQgPSBwYXJlbnRJZCAhPSBudWxsOwotICAgICAgICBwYXJlbnRJZCA9IG51bGw7Ci0KLSAgICAgICAgZmlyZUNvbnRleHRDaGFuZ2VkKG5ldyBDb250ZXh0RXZlbnQodGhpcywgZGVmaW5lZENoYW5nZWQsIG5hbWVDaGFuZ2VkLAotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uQ2hhbmdlZCwgcGFyZW50SWRDaGFuZ2VkKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbnRleHRzL0NvbnRleHRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbnRleHRzL0NvbnRleHRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2M0ODRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb250ZXh0cy9Db250ZXh0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5BYnN0cmFjdE5hbWVkSGFuZGxlRXZlbnQ7Ci0KLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBkZXNjcmliZXMgY2hhbmdlcyB0byBhbiBpbnN0YW5jZSBvZgotICogPGNvZGU+SUNvbnRleHQ8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKiBAc2VlIElDb250ZXh0TGlzdGVuZXIjY29udGV4dENoYW5nZWQoQ29udGV4dEV2ZW50KQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGV4dEV2ZW50IGV4dGVuZHMgQWJzdHJhY3ROYW1lZEhhbmRsZUV2ZW50IHsKLQotCS8qKgotCSAqIFRoZSBiaXQgdXNlZCB0byByZXByZXNlbnQgd2hldGhlciB0aGUgY29udGV4dCBoYXMgY2hhbmdlZCBpdHMgcGFyZW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEX1BBUkVOVF9JRCA9IExBU1RfVVNFRF9CSVQgPDwgMTsKLQotCS8qKgotCSAqIFRoZSBjb250ZXh0IHRoYXQgaGFzIGNoYW5nZWQuIFRoaXMgdmFsdWUgaXMgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb250ZXh0IGNvbnRleHQ7Ci0KLQkvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnN0YW5jZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgY2hhbmdlZDsgbXVzdCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBkZWZpbmVkQ2hhbmdlZAotICAgICAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmZiB0aGUgZGVmaW5lZCBwcm9wZXJ0eSBjaGFuZ2VkLgotICAgICAqIEBwYXJhbSBuYW1lQ2hhbmdlZAotICAgICAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmZiB0aGUgbmFtZSBwcm9wZXJ0eSBjaGFuZ2VkLgotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbkNoYW5nZWQKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+LCBpZmYgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5IGNoYW5nZWQuCi0gICAgICogQHBhcmFtIHBhcmVudElkQ2hhbmdlZAotICAgICAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmZiB0aGUgcGFyZW50SWQgcHJvcGVydHkgY2hhbmdlZC4KLSAgICAgKi8KLQlwdWJsaWMgQ29udGV4dEV2ZW50KGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgYm9vbGVhbiBkZWZpbmVkQ2hhbmdlZCwKLQkJCWZpbmFsIGJvb2xlYW4gbmFtZUNoYW5nZWQsIGZpbmFsIGJvb2xlYW4gZGVzY3JpcHRpb25DaGFuZ2VkLAotCQkJZmluYWwgYm9vbGVhbiBwYXJlbnRJZENoYW5nZWQpIHsKLQkJc3VwZXIoZGVmaW5lZENoYW5nZWQsIGRlc2NyaXB0aW9uQ2hhbmdlZCwgbmFtZUNoYW5nZWQpOwotCQkKLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQkKLQkJaWYgKHBhcmVudElkQ2hhbmdlZCkgewotCQkJY2hhbmdlZFZhbHVlcyB8PSBDSEFOR0VEX1BBUkVOVF9JRDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBjaGFuZ2VkLiBHdWFyYW50ZWVkIG5vdCB0byBiZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcGFyZW50SWQgcHJvcGVydHkgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LCBpZmYgdGhlIHBhcmVudElkIHByb3BlcnR5IGNoYW5nZWQuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQYXJlbnRJZENoYW5nZWQoKSB7Ci0JCXJldHVybiAoKGNoYW5nZWRWYWx1ZXMgJiBDSEFOR0VEX1BBUkVOVF9JRCkgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbnRleHRzL0NvbnRleHRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29udGV4dHMvQ29udGV4dE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwNzk4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29udGV4dHMvQ29udGV4dE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbnRleHRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5IYW5kbGVPYmplY3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMudXRpbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29tbWFuZHMudXRpbC5VdGlsOwotCi0vKioKLSAqIDxwPgotICogQSBjb250ZXh0IG1hbmFnZXIgdHJhY2tzIHRoZSBzZXRzIG9mIGRlZmluZWQgYW5kIGVuYWJsZWQgY29udGV4dHMgd2l0aGluIHRoZQotICogYXBwbGljYXRpb24uIFRoZSBtYW5hZ2VyIHNlbmRzIG5vdGlmaWNhdGlvbiBldmVudHMgdG8gbGlzdGVuZXJzIHdoZW4gdGhlc2UKLSAqIHNldHMgY2hhbmdlLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJldHJpZXZlIGFueSBnaXZlbiBjb250ZXh0IHdpdGggaXRzCi0gKiBpZGVudGlmaWVyLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZXh0TWFuYWdlciBleHRlbmRzIEhhbmRsZU9iamVjdE1hbmFnZXIgaW1wbGVtZW50cwotCQlJQ29udGV4dExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoaXMgZmxhZyBjYW4gYmUgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZXh0IG1hbmFnZXIgc2hvdWxkCi0JICogcHJpbnQgaW5mb3JtYXRpb24gdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gd2hlbiBjZXJ0YWluIGJvdW5kYXJ5Ci0JICogY29uZGl0aW9ucyBvY2N1ci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBzZXQgb2YgYWN0aXZlIGNvbnRleHQgaWRlbnRpZmllcnMuIFRoaXMgdmFsdWUgbWF5IGJlIGVtcHR5LCBidXQgaXQgaXMKLQkgKiBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIFNldCBhY3RpdmVDb250ZXh0SWRzID0gbmV3IEhhc2hTZXQoKTsKLQotCS8qKgotCSAqIEFjdGl2YXRlcyBhIGNvbnRleHQgaW4gdGhpcyBjb250ZXh0IG1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbnRleHQgdG8gYWN0aXZhdGU7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRBY3RpdmVDb250ZXh0KGZpbmFsIFN0cmluZyBjb250ZXh0SWQpIHsKLQkJaWYgKGFjdGl2ZUNvbnRleHRJZHMuY29udGFpbnMoY29udGV4dElkKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZmluYWwgU2V0IHByZXZpb3VzbHlBY3RpdmVDb250ZXh0SWRzID0gbmV3IEhhc2hTZXQoYWN0aXZlQ29udGV4dElkcyk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKGNvbnRleHRJZCk7Ci0KLQkJaWYgKERFQlVHKSB7Ci0JCQlUcmFjaW5nLnByaW50VHJhY2UoIkNPTlRFWFRTIiwgYWN0aXZlQ29udGV4dElkcy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZmlyZUNvbnRleHRNYW5hZ2VyQ2hhbmdlZChuZXcgQ29udGV4dE1hbmFnZXJFdmVudCh0aGlzLCBudWxsLCBmYWxzZSwKLQkJCQl0cnVlLCBwcmV2aW91c2x5QWN0aXZlQ29udGV4dElkcykpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGlzIGNvbnRleHQgbWFuYWdlci4gVGhlIGxpc3RlbmVyIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoZSBzZXQgb2YgZGVmaW5lZCBjb250ZXh0cyBjaGFuZ2VzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHRyYWNrIHRoZQotCSAqIGdsb2JhbCBhcHBlYXJhbmNlIGFuZCBkaXNhcHBlYXJhbmNlIG9mIGNvbnRleHRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgVGhlIGxpc3RlbmVyIHRvIGF0dGFjaDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkQ29udGV4dE1hbmFnZXJMaXN0ZW5lcigKLQkJCWZpbmFsIElDb250ZXh0TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWFkZExpc3RlbmVyT2JqZWN0KGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250ZXh0Q2hhbmdlZChmaW5hbCBDb250ZXh0RXZlbnQgY29udGV4dEV2ZW50KSB7Ci0JCWlmIChjb250ZXh0RXZlbnQuaXNEZWZpbmVkQ2hhbmdlZCgpKSB7Ci0JCQlmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0RXZlbnQuZ2V0Q29udGV4dCgpOwotCQkJZmluYWwgU3RyaW5nIGNvbnRleHRJZCA9IGNvbnRleHQuZ2V0SWQoKTsKLQkJCWZpbmFsIGJvb2xlYW4gY29udGV4dElkQWRkZWQgPSBjb250ZXh0LmlzRGVmaW5lZCgpOwotCQkJaWYgKGNvbnRleHRJZEFkZGVkKSB7Ci0JCQkJZGVmaW5lZEhhbmRsZU9iamVjdHMuYWRkKGNvbnRleHQpOwotCQkJfSBlbHNlIHsKLQkJCQlkZWZpbmVkSGFuZGxlT2JqZWN0cy5yZW1vdmUoY29udGV4dCk7Ci0JCQl9Ci0JCQlmaXJlQ29udGV4dE1hbmFnZXJDaGFuZ2VkKG5ldyBDb250ZXh0TWFuYWdlckV2ZW50KHRoaXMsIGNvbnRleHRJZCwKLQkJCQkJY29udGV4dElkQWRkZWQsIGZhbHNlLCBudWxsKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBhbGwgb2YgdGhlIGxpc3RlbmVycyB0byB0aGlzIG1hbmFnZXIgdGhhdCB0aGUgc2V0IG9mIGRlZmluZWQKLQkgKiBjb250ZXh0IGlkZW50aWZpZXJzIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgVGhlIGV2ZW50IHRvIHNlbmQgdG8gYWxsIG9mIHRoZSBsaXN0ZW5lcnM7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZmlyZUNvbnRleHRNYW5hZ2VyQ2hhbmdlZChmaW5hbCBDb250ZXh0TWFuYWdlckV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJZmluYWwgT2JqZWN0W10gbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBJQ29udGV4dE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lciA9IChJQ29udGV4dE1hbmFnZXJMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJbGlzdGVuZXIuY29udGV4dE1hbmFnZXJDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldCBvZiBhY3RpdmUgY29udGV4dCBpZGVudGlmaWVycy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzZXQgb2YgYWN0aXZlIGNvbnRleHQgaWRlbnRpZmllcnM7IHRoaXMgdmFsdWUgbWF5IGJlCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhY3RpdmUgY29udGV4dHMgaGF2ZSBiZWVuIHNldCB5ZXQuIElmCi0JICogICAgICAgICB0aGUgc2V0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBpdCBjb250YWlucyBvbmx5Ci0JICogICAgICAgICBpbnN0YW5jZXMgb2YgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU2V0IGdldEFjdGl2ZUNvbnRleHRJZHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoYWN0aXZlQ29udGV4dElkcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGV4dCB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyLiBJZiBubyBzdWNoIGNvbnRleHQgY3VycmVudGx5Ci0JICogZXhpc3RzLCB0aGVuIHRoZSBjb250ZXh0IHdpbGwgYmUgY3JlYXRlZCAoYnV0IGJlIHVuZGVmaW5lZCkuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgdG8gZmluZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgY29udGV4dCB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyOyB0aGlzIHZhbHVlIHdpbGwgbmV2ZXIgYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBidXQgaXQgbWlnaHQgYmUgdW5kZWZpbmVkLgotCSAqIEBzZWUgQ29udGV4dAotCSAqLwotCXB1YmxpYyBmaW5hbCBDb250ZXh0IGdldENvbnRleHQoZmluYWwgU3RyaW5nIGNvbnRleHRJZCkgewotCQljaGVja0lkKGNvbnRleHRJZCk7Ci0KLQkJQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhhbmRsZU9iamVjdHNCeUlkLmdldChjb250ZXh0SWQpOwotCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQljb250ZXh0ID0gbmV3IENvbnRleHQoY29udGV4dElkKTsKLQkJCWhhbmRsZU9iamVjdHNCeUlkLnB1dChjb250ZXh0SWQsIGNvbnRleHQpOwotCQkJY29udGV4dC5hZGRDb250ZXh0TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgaWRlbnRpZmllcnMgZm9yIHRob3NlIGNvbnRleHRzIHRoYXQgYXJlIGRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgc2V0IG9mIGRlZmluZWQgY29udGV4dCBpZGVudGlmaWVyczsgdGhpcyB2YWx1ZSBtYXkgYmUgZW1wdHksCi0JICogICAgICAgICBidXQgaXQgaXMgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIFNldCBnZXREZWZpbmVkQ29udGV4dElkcygpIHsKLQkJcmV0dXJuIGdldERlZmluZWRIYW5kbGVPYmplY3RJZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aG9zZSBjb250ZXh0cyB0aGF0IGFyZSBkZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGRlZmluZWQgY29udGV4dHM7IHRoaXMgdmFsdWUgbWF5IGJlIGVtcHR5LCBidXQgaXQgaXMgbmV2ZXIKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgZmluYWwgQ29udGV4dFtdIGdldERlZmluZWRDb250ZXh0cygpIHsKLQkJcmV0dXJuIChDb250ZXh0W10pIGRlZmluZWRIYW5kbGVPYmplY3RzCi0JCQkJLnRvQXJyYXkobmV3IENvbnRleHRbZGVmaW5lZEhhbmRsZU9iamVjdHMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogRGVhY3RpdmF0ZXMgYSBjb250ZXh0IGluIHRoaXMgY29udGV4dCBtYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0SWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb250ZXh0IHRvIGRlYWN0aXZhdGU7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVBY3RpdmVDb250ZXh0KGZpbmFsIFN0cmluZyBjb250ZXh0SWQpIHsKLQkJaWYgKCFhY3RpdmVDb250ZXh0SWRzLmNvbnRhaW5zKGNvbnRleHRJZCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZpbmFsIFNldCBwcmV2aW91c2x5QWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KGFjdGl2ZUNvbnRleHRJZHMpOwotCQlhY3RpdmVDb250ZXh0SWRzLnJlbW92ZShjb250ZXh0SWQpOwotCi0JCWlmIChERUJVRykgewotCQkJVHJhY2luZy5wcmludFRyYWNlKCJDT05URVhUUyIsIGFjdGl2ZUNvbnRleHRJZHMudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZpcmVDb250ZXh0TWFuYWdlckNoYW5nZWQobmV3IENvbnRleHRNYW5hZ2VyRXZlbnQodGhpcywgbnVsbCwgZmFsc2UsCi0JCQkJdHJ1ZSwgcHJldmlvdXNseUFjdGl2ZUNvbnRleHRJZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbnRleHQgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVDb250ZXh0TWFuYWdlckxpc3RlbmVyKAotCQkJZmluYWwgSUNvbnRleHRNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmVtb3ZlTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIHNldCBvZiBhY3RpdmUgY29udGV4dHMgZm9yIHRoaXMgY29udGV4dCBtYW5hZ2VyLiBUaGUgd2hvbGUKLQkgKiBzZXQgaXMgcmVxdWlyZWQgc28gdGhhdCBpbnRlcm5hbCBjb25zaXN0ZW5jeSBjYW4gYmUgbWFpbnRhaW5lZCBhbmQgc28KLQkgKiB0aGF0IGV4Y2Vzc2l2ZSByZWNvbXB1dGF0aW9ucyBkbyBub3RoaW5nIG9jY3VyLgotCSAqIAotCSAqIEBwYXJhbSBhY3RpdmVDb250ZXh0SWRzCi0JICogICAgICAgICAgICBUaGUgbmV3IHNldCBvZiBhY3RpdmUgY29udGV4dCBpZGVudGlmaWVyczsgbWF5IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRBY3RpdmVDb250ZXh0SWRzKGZpbmFsIFNldCBhY3RpdmVDb250ZXh0SWRzKSB7Ci0JCWlmIChVdGlsLmVxdWFscyh0aGlzLmFjdGl2ZUNvbnRleHRJZHMsIGFjdGl2ZUNvbnRleHRJZHMpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmaW5hbCBTZXQgcHJldmlvdXNseUFjdGl2ZUNvbnRleHRJZHMgPSB0aGlzLmFjdGl2ZUNvbnRleHRJZHM7Ci0JCWlmIChhY3RpdmVDb250ZXh0SWRzICE9IG51bGwpIHsKLQkJCXRoaXMuYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQl0aGlzLmFjdGl2ZUNvbnRleHRJZHMuYWRkQWxsKGFjdGl2ZUNvbnRleHRJZHMpOwotCQl9IGVsc2UgewotCQkJdGhpcy5hY3RpdmVDb250ZXh0SWRzID0gbnVsbDsKLQkJfQotCi0JCWlmIChERUJVRykgewotCQkJVHJhY2luZy5wcmludFRyYWNlKCJDT05URVhUUyIsIGFjdGl2ZUNvbnRleHRJZHMudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZpcmVDb250ZXh0TWFuYWdlckNoYW5nZWQobmV3IENvbnRleHRNYW5hZ2VyRXZlbnQodGhpcywgbnVsbCwgZmFsc2UsCi0JCQkJdHJ1ZSwgcHJldmlvdXNseUFjdGl2ZUNvbnRleHRJZHMpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29udGV4dHMvQ29udGV4dE1hbmFnZXJFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbnRleHRzL0NvbnRleHRNYW5hZ2VyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkZmE1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29udGV4dHMvQ29udGV4dE1hbmFnZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbnRleHRzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkFic3RyYWN0Qml0U2V0RXZlbnQ7Ci0KLS8qKgotICogPHA+Ci0gKiBBbiBldmVudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHNldCBvZiBkZWZpbmVkIGNvbnRleHQgaWRlbnRpZmllcnMgaGFzIGNoYW5nZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIEBzZWUgSUNvbnRleHRNYW5hZ2VyTGlzdGVuZXIjY29udGV4dE1hbmFnZXJDaGFuZ2VkKENvbnRleHRNYW5hZ2VyRXZlbnQpCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZXh0TWFuYWdlckV2ZW50IGV4dGVuZHMgQWJzdHJhY3RCaXRTZXRFdmVudCB7Ci0KLQkvKioKLQkgKiBUaGUgYml0IHVzZWQgdG8gcmVwcmVzZW50IHdoZXRoZXIgdGhlIHNldCBvZiBkZWZpbmVkIGNvbnRleHRzIGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIQU5HRURfQ09OVEVYVF9ERUZJTkVEID0gMSA8PCAxOwotCi0JLyoqCi0JICogVGhlIGJpdCB1c2VkIHRvIHJlcHJlc2VudCB3aGV0aGVyIHRoZSBzZXQgb2YgYWN0aXZlIGNvbnRleHRzIGhhcyBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEX0NPTlRFWFRTX0FDVElWRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgY29udGV4dCBpZGVudGlmaWVyIHRoYXQgd2FzIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBkZWZpbmVkCi0JICogY29udGV4dCBpZGVudGlmaWVycy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBjb250ZXh0SWQ7Ci0KLQkvKioKLQkgKiBUaGUgY29udGV4dCBtYW5hZ2VyIHRoYXQgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlcjsKLQotCS8qKgotCSAqIFRoZSBzZXQgb2YgY29udGV4dCBpZGVudGlmaWVycyAoc3RyaW5ncykgdGhhdCB3ZXJlIGFjdGl2ZSBiZWZvcmUgdGhlCi0JICogY2hhbmdlIG9jY3VycmVkLiBJZiB0aGUgYWN0aXZlIGNvbnRleHRzIGRpZCBub3QgY2hhbmdlZCwgdGhlbiB0aGlzIHZhbHVlCi0JICogaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTZXQgcHJldmlvdXNseUFjdGl2ZUNvbnRleHRJZHM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0aGF0IGNoYW5nZWQ7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gY29udGV4dElkCi0JICogICAgICAgICAgICBUaGUgY29udGV4dCBpZGVudGlmaWVyIHRoYXQgd2FzIGFkZGVkIG9yIHJlbW92ZWQ7IG1heSBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGFjdGl2ZSBjb250ZXh0cyBhcmUgY2hhbmdpbmcuCi0JICogQHBhcmFtIGNvbnRleHRJZEFkZGVkCi0JICogICAgICAgICAgICBXaGV0aGVyIHRoZSBjb250ZXh0IGlkZW50aWZpZXIgYmVjYW1lIGRlZmluZWQgKG90aGVyd2lzZSwgaXQKLQkgKiAgICAgICAgICAgIGJlY2FtZSB1bmRlZmluZWQpLgotCSAqIEBwYXJhbSBhY3RpdmVDb250ZXh0c0NoYW5nZWQKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgdGhlIGxpc3Qgb2YgYWN0aXZlIGNvbnRleHRzIGhhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBwcmV2aW91c2x5QWN0aXZlQ29udGV4dElkcwotCSAqICAgICAgICAgICAgdGhlIHNldCBvZiBpZGVudGlmaWVycyBvZiBwcmV2aW91c2x5IGFjdGl2ZSBjb250ZXh0cy4gVGhpcyBzZXQKLQkgKiAgICAgICAgICAgIG1heSBiZSBlbXB0eS4gSWYgdGhpcyBzZXQgaXMgbm90IGVtcHR5LCBpdCBtdXN0IG9ubHkgY29udGFpbgotCSAqICAgICAgICAgICAgaW5zdGFuY2VzIG9mIDxjb2RlPlN0cmluZzwvY29kZT4uIFRoaXMgc2V0IG11c3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFjdGl2ZUNvbnRleHRDaGFuZ2VkIGlzCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIG11c3Qgbm90IGJlIG51bGwgaWYKLQkgKiAgICAgICAgICAgIGFjdGl2ZUNvbnRleHRDaGFuZ2VkIGlzIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDb250ZXh0TWFuYWdlckV2ZW50KGZpbmFsIENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyLAotCQkJZmluYWwgU3RyaW5nIGNvbnRleHRJZCwgZmluYWwgYm9vbGVhbiBjb250ZXh0SWRBZGRlZCwKLQkJCWZpbmFsIGJvb2xlYW4gYWN0aXZlQ29udGV4dHNDaGFuZ2VkLAotCQkJZmluYWwgU2V0IHByZXZpb3VzbHlBY3RpdmVDb250ZXh0SWRzKSB7Ci0JCWlmIChjb250ZXh0TWFuYWdlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCi0JCXRoaXMuY29udGV4dE1hbmFnZXIgPSBjb250ZXh0TWFuYWdlcjsKLQkJdGhpcy5jb250ZXh0SWQgPSBjb250ZXh0SWQ7Ci0JCXRoaXMucHJldmlvdXNseUFjdGl2ZUNvbnRleHRJZHMgPSBwcmV2aW91c2x5QWN0aXZlQ29udGV4dElkczsKLQotCQlpZiAoY29udGV4dElkQWRkZWQpIHsKLQkJCWNoYW5nZWRWYWx1ZXMgfD0gQ0hBTkdFRF9DT05URVhUX0RFRklORUQ7Ci0JCX0KLQkJaWYgKGFjdGl2ZUNvbnRleHRzQ2hhbmdlZCkgewotCQkJY2hhbmdlZFZhbHVlcyB8PSBDSEFOR0VEX0NPTlRFWFRTX0FDVElWRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRleHQgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbnRleHQgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkLiBUaGlzIHZhbHVlIG1heQotCSAqICAgICAgICAgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY29udGV4dCBpZGVudGlmaWVyIHdhcyBhZGRlZCBvcgotCSAqICAgICAgICAgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldENvbnRleHRJZCgpIHsKLQkJcmV0dXJuIGNvbnRleHRJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgY2hhbmdlZC4gR3VhcmFudGVlZCBub3QgdG8gYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCBDb250ZXh0TWFuYWdlciBnZXRDb250ZXh0TWFuYWdlcigpIHsKLQkJcmV0dXJuIGNvbnRleHRNYW5hZ2VyOwotCX0KLQotCS8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBpZGVudGlmaWVycyB0byBwcmV2aW91c2x5IGFjdGl2ZSBjb250ZXh0cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgaWRlbnRpZmllcnMgdG8gcHJldmlvdXNseSBhY3RpdmUgY29udGV4dHMuIFRoaXMgc2V0Ci0gICAgICogICAgICAgICBtYXkgYmUgZW1wdHkuIElmIHRoaXMgc2V0IGlzIG5vdCBlbXB0eSwgaXQgaXMgZ3VhcmFudGVlZCB0byBvbmx5Ci0gICAgICogICAgICAgICBjb250YWluIGluc3RhbmNlcyBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+LiBUaGlzIHNldCBpcwotICAgICAqICAgICAgICAgZ3VhcmFudGVlZCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqICAgICAgICAgaGF2ZUFjdGl2ZUNvbnRleHRDaGFuZ2VkKCkgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGFuZCBpcwotICAgICAqICAgICAgICAgZ3VhcmFudGVlZCB0byBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAgKiAgICAgICAgIGhhdmVBY3RpdmVDb250ZXh0c0NoYW5nZWQoKSBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKi8KLQlwdWJsaWMgZmluYWwgU2V0IGdldFByZXZpb3VzbHlBY3RpdmVDb250ZXh0SWRzKCkgewotCQlyZXR1cm4gcHJldmlvdXNseUFjdGl2ZUNvbnRleHRJZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBhY3RpdmUgY29udGV4dCBpZGVudGlmaWVycyBoYXZlIGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29sbGVjdGlvbiBvZiBhY3RpdmUgY29udGV4dHMgY2hhbmdlZDsKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBY3RpdmVDb250ZXh0c0NoYW5nZWQoKSB7Ci0JCXJldHVybiAoKGNoYW5nZWRWYWx1ZXMgJiBDSEFOR0VEX0NPTlRFWFRTX0FDVElWRSkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsaXN0IG9mIGRlZmluZWQgY29udGV4dCBpZGVudGlmaWVycyBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsaXN0IG9mIGNvbnRleHQgaWRlbnRpZmllcnMgaGFzCi0JICogICAgICAgICBjaGFuZ2VkOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ29udGV4dENoYW5nZWQoKSB7Ci0JCXJldHVybiAoY29udGV4dElkICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29udGV4dCBpZGVudGlmaWVyIGJlY2FtZSBkZWZpbmVkLiBPdGhlcndpc2UsIHRoZQotCSAqIGNvbnRleHQgaWRlbnRpZmllciBiZWNhbWUgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRleHQgaWRlbnRpZmllciBiZWNhbWUgZGVmaW5lZDsKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY29udGV4dCBpZGVudGlmaWVyIGJlY2FtZSB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb250ZXh0RGVmaW5lZCgpIHsKLQkJcmV0dXJuICgoKGNoYW5nZWRWYWx1ZXMgJiBDSEFOR0VEX0NPTlRFWFRfREVGSU5FRCkgIT0gMCkgJiYgKGNvbnRleHRJZCAhPSBudWxsKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbnRleHRzL0lDb250ZXh0TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb250ZXh0cy9JQ29udGV4dExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlM2YyZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbnRleHRzL0lDb250ZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHM7Ci0KLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgYnkgY2xpZW50cyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbgotICogb2YgY2hhbmdlcyB0byBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2YgPGNvZGU+SUNvbnRleHQ8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICogQHNlZSBDb250ZXh0I2FkZENvbnRleHRMaXN0ZW5lcihJQ29udGV4dExpc3RlbmVyKQotICogQHNlZSBDb250ZXh0I3JlbW92ZUNvbnRleHRMaXN0ZW5lcihJQ29udGV4dExpc3RlbmVyKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZXh0TGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIG9mIGFuIGluc3RhbmNlIG9mCi0gICAgICogPGNvZGU+SUNvbnRleHQ8L2NvZGU+IGhhdmUgY2hhbmdlZC4gU3BlY2lmaWMgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGluCi0gICAgICogdGhlIDxjb2RlPkNvbnRleHRFdmVudDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHRFdmVudAotICAgICAqICAgICAgICAgICAgdGhlIGNvbnRleHQgZXZlbnQuIEd1YXJhbnRlZWQgbm90IHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHZvaWQgY29udGV4dENoYW5nZWQoQ29udGV4dEV2ZW50IGNvbnRleHRFdmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvY29udGV4dHMvSUNvbnRleHRNYW5hZ2VyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb250ZXh0cy9JQ29udGV4dE1hbmFnZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDIzYTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb250ZXh0cy9JQ29udGV4dE1hbmFnZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0czsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCBieSBjbGllbnRzIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uCi0gKiBvZiBjaGFuZ2VzIHRvIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiA8Y29kZT5JQ29udGV4dE1hbmFnZXI8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICogQHNlZSBDb250ZXh0TWFuYWdlciNhZGRDb250ZXh0TWFuYWdlckxpc3RlbmVyKElDb250ZXh0TWFuYWdlckxpc3RlbmVyKQotICogQHNlZSBDb250ZXh0TWFuYWdlciNyZW1vdmVDb250ZXh0TWFuYWdlckxpc3RlbmVyKElDb250ZXh0TWFuYWdlckxpc3RlbmVyKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZXh0TWFuYWdlckxpc3RlbmVyIHsKLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoYXQgb25lIG9yIG1vcmUgcHJvcGVydGllcyBvZiBhbiBpbnN0YW5jZSBvZgotICAgICAqIDxjb2RlPklDb250ZXh0TWFuYWdlcjwvY29kZT4gaGF2ZSBjaGFuZ2VkLiBTcGVjaWZpYyBkZXRhaWxzIGFyZQotICAgICAqIGRlc2NyaWJlZCBpbiB0aGUgPGNvZGU+Q29udGV4dE1hbmFnZXJFdmVudDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHRNYW5hZ2VyRXZlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IG1hbmFnZXIgZXZlbnQuIEd1YXJhbnRlZWQgbm90IHRvIGJlCi0gICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICB2b2lkIGNvbnRleHRNYW5hZ2VyQ2hhbmdlZChDb250ZXh0TWFuYWdlckV2ZW50IGNvbnRleHRNYW5hZ2VyRXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbnRleHRzL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9jb250ZXh0cy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZDRjZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL2NvbnRleHRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2RlZmF1bHRfc3R5bGUuY3NzIgotCXR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLTxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7IGNvbG9yOiByZ2IoMCwgMCwgMCkiPgotQXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcyBmb3IgY29udGV4dHMuCi08aDI+UGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLTxwPgotVGhpcyBwYWNrYWdlIHByb3ZpZGVzIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gY2xhc3NlcyB0byBkZWZpbmUgYWJzdHJhY3QKLXJlcHJlc2VudGF0aW9ucyBvZiBhcHBsaWNhdGlvbiBzdGF0ZS4gIFRoZXNlIHJlcHJlc2VudGF0aW9ucyBvZiBhcHBsaWNhdGlvbgotc3RhdGUgY2FuIGJlIHVzZWQgYXMgYW4gYWJzdHJhY3Rpb24gb2YgdGhlIGV2ZW50LWxpc3RlbmVyIG1vZGVsIC0tIHdoZXJlCi1kaWZmZXJlbnQgc2VjdGlvbnMgb2YgY29kZSBkbyBub3QgKG9yIGNhbm5vdCkgcmVmZXIgdG8gZWFjaCBkaXJlY3RseS4KLTwvcD4KLTxwPgotVGhpcyBwYWNrYWdlIGlzIGRlc2lnbmVkIHNvIHRoYXQgaXRzIGVsZW1lbnRzIGNhbiBiZSBwdWJsaWMgYW5kIGR5bmFtaWMuICBUaGF0Ci1pcywgZWxlbWVudHMgaW4gdGhpcyBwYWNrYWdlIGNhbiBhcHBlYXIgYW5kIGRpc2FwcGVhciBvdmVyIHRoZSBsaWZlIG9mIHRoZQotYXBwbGljYXRpb24uCi08L3A+Ci08aDM+Q29udGV4dDwvaDM+Ci08cD4KLUEgY29udGV4dCBpcyBhbiBhbnN3ZXIgdG8gdGhlIHF1ZXN0aW9uLCAiV2hlbj8iICBGb3IgZXhhbXBsZSwgdGhlcmUgbWlnaHQgYmUgYQotY29udGV4dCBjYWxsZWQgInNlcnZlciBydW5uaW5nIi4gIFdoZW4gdGhlIHNlcnZlciBpcyBydW5uaW5nLCB0aGVuIHRoYXQgY29udGV4dAotd291bGQgYmUgYWN0aXZlLiAgSWYgYSBwcm9ncmFtIG1vZHVsZSBvdGhlciB0aGFuIHRoZSBzZXJ2ZXIgd2FudHMgdG8gdGVzdCBmb3IKLXRoaXMsIHRoZXkgY2FuIHNpbXBseSBjaGVjayB0byBzZWUgaWYgdGhlIGNvbnRleHQgaXMgYWN0aXZlLiAgVGhpcyBhbGxvd3MgdGhlCi10d28gcHJvZ3JhbSBtb2R1bGVzIHRvIGJlIGRlY291cGxlZCBmcm9tIGVhY2ggb3RoZXIuICBJbiBmYWN0LCBhIGRpZmZlcmVudAotc2VydmVyIG1vZHVsZSBjb3VsZCBiZSBkcm9wcGVkIGluIHBsYWNlIG9mIHRoZSBmaXJzdC4KLTwvcD4KLTxwPgotQ29udGV4dHMgYXJlIG1hbmFnZWQgYnkgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+Q29udGV4dE1hbmFnZXI8L2NvZGU+LiAgSW4gZmFjdCwgYQotY29udGV4dCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkuICBDb250ZXh0cyBhcmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlCi1tZXRob2QgPGNvZGU+Q29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChTdHJpbmcpPC9jb2RlPi4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZXJlCi1pcyBvbmx5IGV2ZXIgb25lIGNvbnRleHQgd2l0aCBhIGdpdmVuIGlkZW50aWZpZXIgZXZlciBhc3NvY2lhdGVkIHdpdGggYSBjb250ZXh0Ci1tYW5hZ2VyLgotPC9wPgotPHA+Ci1XaGVuIGEgY29udGV4dCBpcyBmaXJzdCBjb25zdHJ1Y3RlZCwgaXQgaXMgdW5kZWZpbmVkLiAgQW4gdW5kZWZpbmVkIGNvbnRleHQgaXMKLW9uZSB0aGF0IGlzIGNhcnJ5aW5nIG5vIGluZm9ybWF0aW9uIGV4Y2VwdCBmb3IgYW4gaWQuICBBdHRlbXB0cyB0byBpbnRlcmFjdAotd2l0aCBhIGNvbnRleHQgdGhhdCBpcyB1bmRlZmluZWQgd2lsbCByZXN1bHQgaW4gYSAKLTxjb2RlPk5vdERlZmluZWRFeGNlcHRpb248L2NvZGU+LiAgVGhyb3VnaCB0aGlzIG1lY2hhbmlzbSwgaXQgaXMgcG9zc2libGUgZm9yCi1jbGllbnRzIHRvIGhvbGQgcmVmZXJlbmNlcyB0byBjb250ZXh0cywgYW5kIHN0aWxsIGhhdmUgdGhvc2UgY29udGV4dHMKLSJkaXNhcHBlYXIiIChpLmUuLCBiZWNvbWUgdW5kZWZpbmVkKS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBpbiBhIHN5c3RlbQotYnVpbHQgYXJvdW5kIGR5bmFtaWMgY29tcG9uZW50cyAoZS5nLiwgcGx1Zy1pbnMpLgotPC9wPgotPHA+Ci1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGF0dGFjaCBsaXN0ZW5lcnMgdG8gYm90aCBjb250ZXh0cyBhbmQgY29udGV4dCBtYW5hZ2Vycy4KLUEgbGlzdGVuZXIgb24gYSBjb250ZXh0IG1hbmFnZXIgd2lsbCBiZSBub3RpZmllZCBpZiB0aGUgbGlzdCBvZiBkZWZpbmVkCi1jb250ZXh0cyBjaGFuZ2VzLgotPC9wPgotPGg0PkV4YW1wbGVzPC9oND4KLTxibG9ja3F1b3RlPjxwcmU+PGNvZGU+Ci0JQ29udGV4dE1hbmFnZXIgbWFuYWdlciA9IG5ldyBDb250ZXh0TWFuYWdlcigpOwotCUNvbnRleHQgY29udGV4dCA9IG1hbmFnZXIuZ2V0Q29udGV4dCgiY29udGV4dElkIik7Ci0JY29udGV4dC5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLTwvY29kZT48L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gY3JlYXRlIGEgY29udGV4dCBmcm9tIHNjcmF0Y2ggLS0gd2l0aCBubyBleGlzdGluZwotbWFuYWdlci4KLTwvcD4KLTxibG9ja3F1b3RlPjxwcmU+PGNvZGU+Ci0JY29udGV4dC51bmRlZmluZSgpOwotCWNvbnRleHQgPSBudWxsOwotPC9jb2RlPjwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSWYgeW91IHdpc2ggdG8gZ2V0IHJpZCBvZiB0aGUgY29udGV4dCwgdGhlbiB5b3Ugc2ltcGx5IHVuZGVmaW5lIGl0LiAgVGhpcwotd2lsbCBzZW5kIG5vdGlmaWNhdGlvbiB0byB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXJzLCBhbmQgZnV0dXJlIGF0dGVtcHRzIHRvCi1hY2Nlc3MgaXQgd2lsbCBmYWlsLiAgSWYgeW91IGFyZSB0aGUgb25seSBvbmUgaG9sZGluZyBvbiB0byB0aGUgY29udGV4dCwgdGhlbgotaXQgd2lsbCBiZSBnYXJiYWdlIGNvbGxlY3RlZC4gIEhvd2V2ZXIsIGlmIG90aGVyIHBlb3BsZSBzdGlsbCBoYXZlIGEgcmVmZXJlbmNlCi10byB0aGUgY29udGV4dCwgdGhlbiB0aGUgc3R1YiB3aWxsIHJlbWFpbiB1bnRpbCB0aGV5IHJlc3BvbmQgdG8gdGhlIGNoYW5nZS4KLTwvcD4KLTxibG9ja3F1b3RlPjxwcmU+PGNvZGU+Ci0JU3RyaW5nIG5hbWU7Ci0JdHJ5IHsKLQkJbmFtZSA9IGNvbnRleHQuZ2V0TmFtZSgpOwotCX0gY2F0Y2ggKE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkvLyBDbGVhbi11cCBteSByZWZlcmVuY2UgdG8gdGhlIGNvbnRleHQuCi0JCWNvbnRleHQgPSBudWxsOwotCQlyZXR1cm47Ci0JfQotPC9jb2RlPjwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyBzaG93cyBvbmUgd2F5IG9mIGRlYWxpbmcgd2l0aCBjb250ZXh0cy4gIEluc3RlYWQgb2YgbGlzdGVuaW5nIGZvcgotY2hhbmdlcyB0byB0aGUgY29udGV4dHMsIHlvdSBjYW4gc2ltcGx5IGxpc3RlbiBmb3IgdGhlIGV4Y2VwdGlvbnMgdG8gYmUgdGhyb3duLgotV2hlbiBhIDxjb2RlPk5vdERlZmluZWRFeGNlcHRpb248L2NvZGU+IGlzIHRocm93biwgeW91IGNhbiBjbGVhbiB1cCB5b3VyIG93bgotY29kZS4gIEhvdyB5b3UgY2xlYW4gdXAgaXMgYXBwbGljYXRpb24gZGVwZW5kZW50LiAgSW4gdGhpcyBjYXNlLCB0aGUgcmVmZXJlbmNlCi1pcyBjbGVhcmVkIGFuZCB3ZSByZXR1cm4gZnJvbSB0aGUgbWV0aG9kLgotPC9wPgotPGJsb2NrcXVvdGU+PHByZT48Y29kZT4KLQl0cnkgewotCQlTdHJpbmcgbmFtZSA9IGNvbnRleHQuZ2V0TmFtZSgpOwotCQkKLQkJLy8gRG8gYWxsIHlvdXIgd29yayBpbiB0aGUgYmxvY2suCi0JCQotCX0gY2F0Y2ggKE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkvLyBJZ25vcmUsIG9yIHBvc3NpYmx5IHRocm93IGFuIGVycm9yCi0JfQotCQotCS4uLgotCQotCXB1YmxpYyBjb250ZXh0Q2hhbmdlZChDb250ZXh0RXZlbnQgZSkgewotCQlpZiAoZS5oYXNEZWZpbmVkQ2hhbmdlZCgpKSB7Ci0JCQljb250ZXh0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJY29udGV4dCA9IG51bGw7Ci0JCX0KLQl9Ci08L2NvZGU+PC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Bbm90aGVyIHdheSBpcyB0byBhdHRhY2ggYSBsaXN0ZW5lciwgYW5kIHRoZW4gc2ltcGx5IGlnbm9yZSB0aGUgZXhjZXB0aW9ucy4KLVdoZW4gdGhlIGNvbnRleHQgYmVjb21lcyB1bmRlZmluZWQsIHlvdSB3aWxsIGJlIG5vdGlmaWVkLiAgVGhpcyBnaXZlcyB5b3VyIHRoZQotb3Bwb3J0dW5pdHkgdG8gdW5ob29rIHlvdXIgbGlzdGVuZXIgYW5kIHJlbGVhc2UgeW91ciByZWZlcmVuY2UuCi08L3A+Ci08YmxvY2txdW90ZT48cHJlPjxjb2RlPgotCUNvbnRleHRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQ29udGV4dE1hbmFnZXIoKTsKLQlDb250ZXh0IHBhcmVudCA9IG1hbmFnZXIuZ2V0Q29udGV4dCgicGFyZW50SWQiKTsKLQlwYXJlbnQuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0JQ29udGV4dCBjaGlsZCA9IG1hbmFnZXIuZ2V0Q29udGV4dCgiY2hpbGRJZCIpOwotCWNoaWxkLmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsICJwYXJlbnRJZCIpOwotPC9jb2RlPjwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQ29udGV4dHMgY2FuIGJlIHJlbGF0ZWQgdG8gZWFjaCBvdGhlciB3aXRoIGEgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcC4gIEhvdwoteW91ciBhcHBsaWNhdGlvbiBkZWFscyB3aXRoIHRoaXMgaXMgdXAgdG8geW91LiAgSW4gdGhlIGNhc2Ugb2YgdGhlIGtleWJvYXJkCi1zaG9ydGN1dHMgaW4gRWNsaXBzZSwgdGhpcyBpcyB1c2VkIHRvIGFsbG93IGJlaGF2aW91ciBhdHRyaWJ1dGVkIHRvIGNoaWxkCi1jb250ZXh0cyB0byBvdmVycmlkZSBiZWhhdmlvdXIgYXR0cmlidXRlZCB0byBwYXJlbnQgY29udGV4dHMuCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9BYnN0cmFjdE9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvQWJzdHJhY3RPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlOTExZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9BYnN0cmFjdE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiA8cD4KLSAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIGZvciBhbiB1bmRvYWJsZSBvcGVyYXRpb24uIEF0IGEgbWluaW11bSwgc3ViY2xhc3NlcwotICogc2hvdWxkIGltcGxlbWVudCBiZWhhdmlvciBmb3IKLSAqIHtAbGluayBJVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpfSwKLSAqIHtAbGluayBJVW5kb2FibGVPcGVyYXRpb24jcmVkbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpfSwKLSAqIGFuZAotICoge0BsaW5rIElVbmRvYWJsZU9wZXJhdGlvbiN1bmRvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSl9LgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcGVyYXRpb24gaW1wbGVtZW50cyBJVW5kb2FibGVPcGVyYXRpb24gewotCUxpc3QgY29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICB0aGUgbGFiZWwgdG8gYmUgdXNlZCBmb3IgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RPcGVyYXRpb24oU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jYWRkQ29udGV4dChvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9Db250ZXh0KQotCSAqIAotCSAqIDxwPiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZC4gPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbnRleHQoSVVuZG9Db250ZXh0IGNvbnRleHQpIHsKLQkJaWYgKCFjb250ZXh0cy5jb250YWlucyhjb250ZXh0KSkgewotCQkJY29udGV4dHMuYWRkKGNvbnRleHQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2NhbkV4ZWN1dGUoKQotCSAqICAgICAgPHA+IERlZmF1bHQgaW1wbGVtZW50YXRpb24uIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqICAgICAgPC9wPgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNjYW5SZWRvKCkKLQkgKiAgICAgIDxwPiBEZWZhdWx0IGltcGxlbWVudGF0aW9uLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAgICAgIDwvcD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZWRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jY2FuVW5kbygpCi0JICogICAgICA8cD4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogICAgICA8L3A+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2Rpc3Bvc2UoKQotCSAqICAgICAgPHA+IERlZmF1bHQgaW1wbGVtZW50YXRpb24uIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqICAgICAgPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZGlzcG9zZS4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0JcHVibGljIGZpbmFsIElVbmRvQ29udGV4dFtdIGdldENvbnRleHRzKCkgewotCQlyZXR1cm4gKElVbmRvQ29udGV4dFtdKSBjb250ZXh0cy50b0FycmF5KG5ldyBJVW5kb0NvbnRleHRbY29udGV4dHMKLQkJCQkuc2l6ZSgpXSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2dldExhYmVsKCkKLQkgKiAgICAgIDxwPiBEZWZhdWx0IGltcGxlbWVudGF0aW9uLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAgICAgIDwvcD4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBsYWJlbCBvZiB0aGUgb3BlcmF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSB1c2VkIGZvciB0aGUgbGFiZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIG5hbWUpIHsKLQkJbGFiZWwgPSBuYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNoYXNDb250ZXh0KG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQ29udGV4dChJVW5kb0NvbnRleHQgY29udGV4dCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRleHQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLnNpemUoKTsgaSsrKSB7Ci0JCQlJVW5kb0NvbnRleHQgb3RoZXJDb250ZXh0ID0gKElVbmRvQ29udGV4dCkgY29udGV4dHMuZ2V0KGkpOwotCQkJLy8gaGF2ZSB0byBjaGVjayBib3RoIHdheXMgYmVjYXVzZSBvbmUgY29udGV4dCBtYXkgYmUgbW9yZSBnZW5lcmFsCi0JCQkvLyBpbgotCQkJLy8gaXRzIG1hdGNoaW5nIHJ1bGVzIHRoYW4gYW5vdGhlci4KLQkJCWlmIChjb250ZXh0Lm1hdGNoZXMob3RoZXJDb250ZXh0KSB8fCBvdGhlckNvbnRleHQubWF0Y2hlcyhjb250ZXh0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI3JlZG8ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNyZW1vdmVDb250ZXh0KG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQpCi0JICogICAgICA8cD4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogICAgICA8L3A+Ci0JICovCi0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0KElVbmRvQ29udGV4dCBjb250ZXh0KSB7Ci0JCWNvbnRleHRzLnJlbW92ZShjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jdW5kbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9wZXJhdGlvbi4gVXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCi0JICogb25seS4gVGhpcyBzdHJpbmcgc2hvdWxkIG5vdCBiZSBzaG93biB0byBhbiBlbmQgdXNlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3RyaW5nQnVmZmVyLmFwcGVuZChnZXRMYWJlbCgpKTsKLQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0JCUlVbmRvQ29udGV4dFtdIGNvbnRleHRzID0gZ2V0Q29udGV4dHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChjb250ZXh0c1tpXS50b1N0cmluZygpKTsKLQkJCWlmIChpICE9IGNvbnRleHRzLmxlbmd0aCAtIDEpIHsKLQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQl9Ci0JCX0KLQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvRGVmYXVsdE9wZXJhdGlvbkhpc3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL0RlZmF1bHRPcGVyYXRpb25IaXN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDVkNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvRGVmYXVsdE9wZXJhdGlvbkhpc3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy51dGlsLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0vKioKLSAqIDxwPgotICogQSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIElPcGVyYXRpb25IaXN0b3J5IHRoYXQgaW1wbGVtZW50cyBhIGxpbmVhciB1bmRvIGFuZAotICogcmVkbyBtb2RlbCAuIFRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIG9wZXJhdGlvbiBpcyBhdmFpbGFibGUgZm9yIHVuZG8sIGFuZCB0aGUKLSAqIG1vc3QgcmVjZW50bHkgdW5kb25lIG9wZXJhdGlvbiBpcyBhdmFpbGFibGUgZm9yIHJlZG8uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIElmIHRoZSBvcGVyYXRpb24gZWxpZ2libGUgZm9yIHVuZG8gaXMgbm90IGluIGEgc3RhdGUgd2hlcmUgaXQgY2FuIGJlIHVuZG9uZSwKLSAqIHRoZW4gbm8gdW5kbyBpcyBhdmFpbGFibGUuIE5vIG90aGVyIG9wZXJhdGlvbnMgYXJlIGNvbnNpZGVyZWQuIExpa2V3aXNlLCBpZgotICogdGhlIG9wZXJhdGlvbiBhdmFpbGFibGUgZm9yIHJlZG8gY2Fubm90IGJlIHJlZG9uZSwgdGhlbiBubyByZWRvIGlzIGF2YWlsYWJsZS4KLSAqIDwvcD4KLSAqIDxwPgotICogSW1wbGVtZW50YXRpb25zIGZvciB0aGUgZGlyZWN0IHVuZG8gYW5kIHJlZG8gb2YgYSBzcGVjaWZpZWQgb3BlcmF0aW9uIGFyZQotICogYXZhaWxhYmxlLiBJZiBhIHN0cmljdCBsaW5lYXIgdW5kbyBpcyB0byBiZSBlbmZvcmNlZCwgdGhhbiBhbgotICogSU9wZXJhdGlvbkFwcHJvdmVyIHNob3VsZCBiZSBpbnN0YWxsZWQgdGhhdCBwcmV2ZW50cyB1bmRvIGFuZCByZWRvIG9mIGFueQotICogb3BlcmF0aW9uIHRoYXQgaXMgbm90IHRoZSBtb3N0IHJlY2VudGx5IHVuZG9uZSBvciByZWRvbmUgb3BlcmF0aW9uIGluIGFsbCBvZgotICogaXRzIHVuZG8gY29udGV4dHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBkYXRhIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgRGVmYXVsdE9wZXJhdGlvbkhpc3RvcnkgYXJlIHN5bmNocm9uaXplZCwgYW5kCi0gKiBlbnRyeSBwb2ludHMgdGhhdCBtb2RpZnkgdGhlIHVuZG8gYW5kIHJlZG8gaGlzdG9yeSBjb25jdXJyZW50bHkgYXJlIGFsc28KLSAqIHN5bmNocm9uaXplZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBEZWZhdWx0T3BlcmF0aW9uSGlzdG9yeSBpcyByZWxhdGl2ZWx5Ci0gKiAidGhyZWFkLWZyaWVuZGx5IiBpbiBpdHMgaW1wbGVtZW50YXRpb24uIE91dGJvdW5kIG5vdGlmaWNhdGlvbnMgb3Igb3BlcmF0aW9uCi0gKiBhcHByb3ZhbCByZXF1ZXN0cyB3aWxsIG9jY3VyIG9uIHRoZSB0aHJlYWQgdGhhdCBpbml0aWF0ZWQgdGhlIHJlcXVlc3QuCi0gKiBDbGllbnRzIG1heSB1c2UgRGVmYXVsdE9wZXJhdGlvbkhpc3RvcnkgQVBJIGZyb20gYW55IHRocmVhZDsgaG93ZXZlciwKLSAqIGxpc3RlbmVycyBvciBvcGVyYXRpb24gYXBwcm92ZXJzIHRoYXQgcmVjZWl2ZSBub3RpZmljYXRpb25zIGZyb20gdGhlCi0gKiBEZWZhdWx0T3BlcmF0aW9uSGlzdG9yeSBtdXN0IGJlIHByZXBhcmVkIHRvIHJlY2VpdmUgdGhlc2Ugbm90aWZpY2F0aW9ucyBmcm9tCi0gKiBhIGJhY2tncm91bmQgdGhyZWFkLiBBbnkgVUkgYWNjZXNzIG9jY3VycmluZyBpbnNpZGUgdGhlc2Ugbm90aWZpY2F0aW9ucyBtdXN0Ci0gKiBiZSBwcm9wZXJseSBzeW5jaHJvbml6ZWQgdXNpbmcgdGhlIHRlY2huaXF1ZXMgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQncwotICogd2lkZ2V0IGxpYnJhcnkuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25BcHByb3ZlcgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWZhdWx0T3BlcmF0aW9uSGlzdG9yeSBpbXBsZW1lbnRzIElPcGVyYXRpb25IaXN0b3J5IHsKLQkvKioKLQkgKiBUaGlzIGZsYWcgY2FuIGJlIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaGlzdG9yeSBzaG91bGQgcHJpbnQKLQkgKiBpbmZvcm1hdGlvbiB0byA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPiB3aGVuZXZlciBub3RpZmljYXRpb25zIGFib3V0Ci0JICogY2hhbmdlcyB0byB0aGUgaGlzdG9yeSBvY2N1ci4gVGhpcyBmbGFnIHNob3VsZCBiZSB1c2VkIGZvciBkZWJ1ZyBwdXJwb3NlcwotCSAqIG9ubHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX09QRVJBVElPTl9ISVNUT1JZX05PVElGSUNBVElPTiA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhpcyBmbGFnIGNhbiBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGhpc3Rvcnkgc2hvdWxkIHByaW50Ci0JICogaW5mb3JtYXRpb24gdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gd2hlbmV2ZXIgYW4gdW5leHBlY3RlZCBjb25kaXRpb24KLQkgKiBhcmlzZXMuIFRoaXMgZmxhZyBzaG91bGQgYmUgdXNlZCBmb3IgZGVidWcgcHVycG9zZXMgb25seS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfVU5FWFBFQ1RFRCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhpcyBmbGFnIGNhbiBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGhpc3Rvcnkgc2hvdWxkIHByaW50Ci0JICogaW5mb3JtYXRpb24gdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gd2hlbmV2ZXIgYW4gdW5kbyBjb250ZXh0IGlzCi0JICogZGlzcG9zZWQuIFRoaXMgZmxhZyBzaG91bGQgYmUgdXNlZCBmb3IgZGVidWcgcHVycG9zZXMgb25seS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfRElTUE9TRSA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhpcyBmbGFnIGNhbiBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGhpc3Rvcnkgc2hvdWxkIHByaW50Ci0JICogaW5mb3JtYXRpb24gdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gZHVyaW5nIHRoZSBvcGVuL2Nsb3NlIHNlcXVlbmNlLgotCSAqIFRoaXMgZmxhZyBzaG91bGQgYmUgdXNlZCBmb3IgZGVidWcgcHVycG9zZXMgb25seS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfT1BFTk9QRVJBVElPTiA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhpcyBmbGFnIGNhbiBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGhpc3Rvcnkgc2hvdWxkIHByaW50Ci0JICogaW5mb3JtYXRpb24gdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gd2hlbmV2ZXIgYW4gb3BlcmF0aW9uIGlzIG5vdAotCSAqIGFwcHJvdmVkLiBUaGlzIGZsYWcgc2hvdWxkIGJlIHVzZWQgZm9yIGRlYnVnIHB1cnBvc2VzIG9ubHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX09QRVJBVElPTl9ISVNUT1JZX0FQUFJPVkFMID0gZmFsc2U7Ci0KLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTElNSVQgPSAyMDsKLQotCS8qKgotCSAqIHRoZSBsaXN0IG9mIHtAbGluayBJT3BlcmF0aW9uQXBwcm92ZXJ9cwotCSAqLwotCUxpc3RlbmVyTGlzdCBhcHByb3ZlcnMgPSBuZXcgTGlzdGVuZXJMaXN0KExpc3RlbmVyTGlzdC5JREVOVElUWSk7Ci0KLQkvKioKLQkgKiBhIG1hcCBvZiB1bmRvIGxpbWl0cyBwZXIgY29udGV4dAotCSAqLwotCXByaXZhdGUgTWFwIGxpbWl0cyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLQotCS8qKgotCSAqIHRoZSBsaXN0IG9mIHtAbGluayBJT3BlcmF0aW9uSGlzdG9yeUxpc3RlbmVyfXMKLQkgKi8KLQlMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdChMaXN0ZW5lckxpc3QuSURFTlRJVFkpOwotCi0JLyoqCi0JICogdGhlIGxpc3Qgb2Ygb3BlcmF0aW9ucyBhdmFpbGFibGUgZm9yIHJlZG8sIExJRk8KLQkgKi8KLQlwcml2YXRlIExpc3QgcmVkb0xpc3QgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3QoKSk7Ci0KLQkvKioKLQkgKiB0aGUgbGlzdCBvZiBvcGVyYXRpb25zIGF2YWlsYWJsZSBmb3IgdW5kbywgTElGTwotCSAqLwotCXByaXZhdGUgTGlzdCB1bmRvTGlzdCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdCgpKTsKLQotCS8qKgotCSAqIGEgbG9jayB0aGF0IGlzIHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIGJldHdlZW4gdGhlIHVuZG8gYW5kIHJlZG8KLQkgKiBoaXN0b3J5Ci0JICovCi0JZmluYWwgT2JqZWN0IHVuZG9SZWRvSGlzdG9yeUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBBbiBvcGVyYXRpb24gdGhhdCBpcyAiYWJzb3JiaW5nIiBhbGwgb3RoZXIgb3BlcmF0aW9ucyB3aGlsZSBpdCBpcyBvcGVuLgotCSAqIFdoZW4gdGhpcyBpcyBub3QgbnVsbCwgb3RoZXIgb3BlcmF0aW9ucyBhZGRlZCBvciBleGVjdXRlZCBhcmUgYWRkZWQgdG8KLQkgKiB0aGlzIGNvbXBvc2l0ZS4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIElDb21wb3NpdGVPcGVyYXRpb24gb3BlbkNvbXBvc2l0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBhIGxvY2sgdGhhdCBpcyB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgb3BlbiBjb21wb3NpdGUuCi0JICovCi0JZmluYWwgT2JqZWN0IG9wZW5Db21wb3NpdGVMb2NrID0gbmV3IE9iamVjdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIERlZmF1bHRPcGVyYXRpb25IaXN0b3J5LgotCSAqLwotCXB1YmxpYyBEZWZhdWx0T3BlcmF0aW9uSGlzdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGlzdG9yeSNhZGQob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlBc3NlcnQuaXNOb3ROdWxsKG9wZXJhdGlvbik7Ci0KLQkJLyoKLQkJICogSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgZXhlY3V0aW5nIGFuIG9wZW4gYmF0Y2hpbmcgb3BlcmF0aW9uLCBhbmQKLQkJICogdGhpcyBpcyBub3QgdGhhdCBvcGVyYXRpb24sIHRoZW4gd2UgbmVlZCBvbmx5IGFkZCB0aGUgY29udGV4dCBvZiB0aGUKLQkJICogbmV3IG9wZXJhdGlvbiB0byB0aGUgYmF0Y2guIFRoZSBvcGVyYXRpb24gaXRzZWxmIGlzIGRpc3Bvc2VkIHNpbmNlIHdlCi0JCSAqIHdpbGwgbmV2ZXIgdW5kbyBvciByZWRvIGl0LiBXZSBjb25zaWRlciBpdCB0byBiZSB0cmlnZ2VyZWQgYnkgdGhlCi0JCSAqIGJhdGNoaW5nIG9wZXJhdGlvbiBhbmQgYXNzdW1lIHRoYXQgaXRzIHVuZG8gd2lsbCBiZSB0cmlnZ2VyZWQgYnkgdGhlCi0JCSAqIGJhdGNoaW5nIG9wZXJhdGlvbiB1bmRvLgotCQkgKi8KLQkJc3luY2hyb25pemVkIChvcGVuQ29tcG9zaXRlTG9jaykgewotCQkJaWYgKG9wZW5Db21wb3NpdGUgIT0gbnVsbCAmJiBvcGVuQ29tcG9zaXRlICE9IG9wZXJhdGlvbikgewotCQkJCW9wZW5Db21wb3NpdGUuYWRkKG9wZXJhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNoZWNrVW5kb0xpbWl0KG9wZXJhdGlvbikpIHsKLQkJCXN5bmNocm9uaXplZCAodW5kb1JlZG9IaXN0b3J5TG9jaykgewotCQkJCXVuZG9MaXN0LmFkZChvcGVyYXRpb24pOwotCQkJfQotCQkJbm90aWZ5QWRkKG9wZXJhdGlvbik7Ci0KLQkJCS8vIGZsdXNoIHJlZG8gc3RhY2sgZm9yIHJlbGF0ZWQgY29udGV4dHMKLQkJCUlVbmRvQ29udGV4dFtdIGNvbnRleHRzID0gb3BlcmF0aW9uLmdldENvbnRleHRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmx1c2hSZWRvKGNvbnRleHRzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGFwcHJvdmVyIHRvIHRoZSBsaXN0IG9mIG9wZXJhdGlvbiBhcHByb3ZlcnMgY29uc3VsdGVkCi0JICogYnkgdGhlIG9wZXJhdGlvbiBoaXN0b3J5IGJlZm9yZSBhbiB1bmRvIG9yIHJlZG8gaXMgYWxsb3dlZCB0byBwcm9jZWVkLgotCSAqIFRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QgaWYgdGhlIGluc3RhbmNlIGJlaW5nIGFkZGVkIGlzIGFscmVhZHkgaW4gdGhlCi0JICogbGlzdC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogT3BlcmF0aW9uIGFwcHJvdmVycyBtdXN0IGJlIHByZXBhcmVkIHRvIHJlY2VpdmUgdGhlc2UgdGhlIG9wZXJhdGlvbgotCSAqIGFwcHJvdmFsIG1lc3NhZ2VzIGZyb20gYSBiYWNrZ3JvdW5kIHRocmVhZC4gQW55IFVJIGFjY2VzcyBvY2N1cnJpbmcKLQkgKiBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgYmUgcHJvcGVybHkgc3luY2hyb25pemVkIHVzaW5nIHRoZQotCSAqIHRlY2huaXF1ZXMgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQncyB3aWRnZXQgbGlicmFyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFwcHJvdmVyCi0JICogICAgICAgICAgICB0aGUgSU9wZXJhdGlvbkFwcHJvdmVyIHRvIGJlIGFkZGVkIGFzIGFuIGFwcHJvdmVyLgotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkT3BlcmF0aW9uQXBwcm92ZXIoSU9wZXJhdGlvbkFwcHJvdmVyIGFwcHJvdmVyKSB7Ci0JCWFwcHJvdmVycy5hZGQoYXBwcm92ZXIpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIG9wZXJhdGlvbiBoaXN0b3J5IGxpc3RlbmVycwotCSAqIHRoYXQgYXJlIG5vdGlmaWVkIGFib3V0IGNoYW5nZXMgaW4gdGhlIGhpc3Rvcnkgb3Igb3BlcmF0aW9ucyB0aGF0IGFyZQotCSAqIGV4ZWN1dGVkLCB1bmRvbmUsIG9yIHJlZG9uZS4gVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiB0aGUgaW5zdGFuY2UKLQkgKiBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IGluIHRoZSBsaXN0LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBPcGVyYXRpb24gaGlzdG9yeSBsaXN0ZW5lcnMgbXVzdCBiZSBwcmVwYXJlZCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMKLQkgKiBmcm9tIGEgYmFja2dyb3VuZCB0aHJlYWQuIEFueSBVSSBhY2Nlc3Mgb2NjdXJyaW5nIGluc2lkZSB0aGUKLQkgKiBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIHByb3Blcmx5IHN5bmNocm9uaXplZCB1c2luZyB0aGUgdGVjaG5pcXVlcwotCSAqIHNwZWNpZmllZCBieSB0aGUgY2xpZW50J3Mgd2lkZ2V0IGxpYnJhcnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIElPcGVyYXRpb25IaXN0b3J5TGlzdGVuZXIgdG8gYmUgYWRkZWQgYXMgYSBsaXN0ZW5lci4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGlzdG9yeUxpc3RlbmVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkT3BlcmF0aW9uSGlzdG9yeUxpc3RlbmVyKElPcGVyYXRpb25IaXN0b3J5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3RvcnkjY2FuUmVkbyhvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9Db250ZXh0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlZG8oSVVuZG9Db250ZXh0IGNvbnRleHQpIHsKLQkJLy8gbnVsbCBjb250ZXh0IGlzIGFsbG93ZWQgYW5kIHBhc3NlZCB0aHJvdWdoCi0JCUlVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24gPSBnZXRSZWRvT3BlcmF0aW9uKGNvbnRleHQpOwotCQlyZXR1cm4gKG9wZXJhdGlvbiAhPSBudWxsICYmIG9wZXJhdGlvbi5jYW5SZWRvKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25IaXN0b3J5I2NhblVuZG8ob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKElVbmRvQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIG51bGwgY29udGV4dCBpcyBhbGxvd2VkIGFuZCBwYXNzZWQgdGhyb3VnaAotCQlJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uID0gZ2V0VW5kb09wZXJhdGlvbihjb250ZXh0KTsKLQkJcmV0dXJuIChvcGVyYXRpb24gIT0gbnVsbCAmJiBvcGVyYXRpb24uY2FuVW5kbygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0aGUgcmVkbyBsaW1pdCBiZWZvcmUgYWRkaW5nIGFuIG9wZXJhdGlvbi4gSW4gdGhlb3J5IHRoZSByZWRvIGxpbWl0Ci0JICogc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQsIGJlY2F1c2UgdGhlIHJlZG8gaXRlbXMgYXJlIHRyYW5zZmVycmVkIGZyb20gdGhlCi0JICogdW5kbyBoaXN0b3J5LCB3aGljaCBoYXMgdGhlIHNhbWUgbGltaXQuIFRoZSByZWRvIGhpc3RvcnkgaXMgY2xlYXJlZAotCSAqIHdoZW5ldmVyIGEgbmV3IG9wZXJhdGlvbiBpcyBhZGRlZC4gV2UgY2hlY2sgZm9yIGNvbXBsZXRlbmVzcyBzaW5jZQotCSAqIGltcGxlbWVudGF0aW9ucyBtYXkgY2hhbmdlIG92ZXIgdGltZS4KLQkgKiAKLQkgKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVkbyBzaG91bGQgcHJvY2VlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tSZWRvTGltaXQoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlJVW5kb0NvbnRleHRbXSBjb250ZXh0cyA9IG9wZXJhdGlvbi5nZXRDb250ZXh0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgbGltaXQgPSBnZXRMaW1pdChjb250ZXh0c1tpXSk7Ci0JCQlpZiAobGltaXQgPiAwKSB7Ci0JCQkJZm9yY2VSZWRvTGltaXQoY29udGV4dHNbaV0sIGxpbWl0IC0gMSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHRoaXMgY29udGV4dCBoYXMgYSAwIGxpbWl0Ci0JCQkJb3BlcmF0aW9uLnJlbW92ZUNvbnRleHQoY29udGV4dHNbaV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBvcGVyYXRpb24uZ2V0Q29udGV4dHMoKS5sZW5ndGggPiAwOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRoZSB1bmRvIGxpbWl0IGJlZm9yZSBhZGRpbmcgYW4gb3BlcmF0aW9uLiBSZXR1cm4gYSBib29sZWFuCi0JICogaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB1bmRvIHNob3VsZCBwcm9jZWVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1VuZG9MaW1pdChJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCUlVbmRvQ29udGV4dFtdIGNvbnRleHRzID0gb3BlcmF0aW9uLmdldENvbnRleHRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBsaW1pdCA9IGdldExpbWl0KGNvbnRleHRzW2ldKTsKLQkJCWlmIChsaW1pdCA+IDApIHsKLQkJCQlmb3JjZVVuZG9MaW1pdChjb250ZXh0c1tpXSwgbGltaXQgLSAxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gdGhpcyBjb250ZXh0IGhhcyBhIDAgbGltaXQKLQkJCQlvcGVyYXRpb24ucmVtb3ZlQ29udGV4dChjb250ZXh0c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9wZXJhdGlvbi5nZXRDb250ZXh0cygpLmxlbmd0aCA+IDA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3RvcnkjZGlzcG9zZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9Db250ZXh0LAotCSAqICAgICAgYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKElVbmRvQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGZsdXNoVW5kbywKLQkJCWJvb2xlYW4gZmx1c2hSZWRvLCBib29sZWFuIGZsdXNoQ29udGV4dCkgewotCQkvLyBkaXNwb3NlIG9mIGFueSBsaW1pdCB0aGF0IHdhcyBzZXQgZm9yIHRoZSBjb250ZXh0IGlmIGl0IGlzIG5vdCB0byBiZQotCQkvLyB1c2VkIGFnYWluLgotCQlpZiAoZmx1c2hDb250ZXh0KSB7Ci0JCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfRElTUE9TRSkgewotCQkJCVRyYWNpbmcucHJpbnRUcmFjZSgiT1BFUkFUSU9OSElTVE9SWSIsICJGbHVzaGluZyBjb250ZXh0ICIgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCQkrIGNvbnRleHQpOwotCQkJfQotCQkJZmx1c2hVbmRvKGNvbnRleHQpOwotCQkJZmx1c2hSZWRvKGNvbnRleHQpOwotCQkJbGltaXRzLnJlbW92ZShjb250ZXh0KTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZmx1c2hVbmRvKQotCQkJZmx1c2hVbmRvKGNvbnRleHQpOwotCQlpZiAoZmx1c2hSZWRvKQotCQkJZmx1c2hSZWRvKGNvbnRleHQpOwotCi0JfQotCi0JLyoqCi0JICogUGVyZm9ybSB0aGUgcmVkby4gQWxsIHZhbGlkaXR5IGNoZWNrcyBoYXZlIGFscmVhZHkgb2NjdXJyZWQuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIGRvUmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbywKLQkJCUlVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCi0JCUlTdGF0dXMgc3RhdHVzID0gZ2V0UmVkb0FwcHJvdmFsKG9wZXJhdGlvbiwgaW5mbyk7Ci0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQlub3RpZnlBYm91dFRvUmVkbyhvcGVyYXRpb24pOwotCQkJdHJ5IHsKLQkJCQlzdGF0dXMgPSBvcGVyYXRpb24ucmVkbyhtb25pdG9yLCBpbmZvKTsKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJbm90aWZ5Tm90T0sob3BlcmF0aW9uKTsKLQkJCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfVU5FWFBFQ1RFRCkgewotCQkJCQlUcmFjaW5nLnByaW50VHJhY2UoIk9QRVJBVElPTkhJU1RPUlkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJIkV4ZWN1dGlvbkV4Y2VwdGlvbiB3aGlsZSByZWRvaW5nICIgKyBvcGVyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXRocm93IGU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCW5vdGlmeU5vdE9LKG9wZXJhdGlvbik7Ci0JCQkJaWYgKERFQlVHX09QRVJBVElPTl9ISVNUT1JZX1VORVhQRUNURUQpIHsKLQkJCQkJVHJhY2luZy5wcmludFRyYWNlKCJPUEVSQVRJT05ISVNUT1JZIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSJFeGNlcHRpb24gd2hpbGUgcmVkb2luZyAiICsgb3BlcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKAotCQkJCQkJIldoaWxlIHJlZG9pbmcgdGhlIG9wZXJhdGlvbiwgYW4gZXhjZXB0aW9uIG9jY3VycmVkIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8vIGlmIHN1Y2Nlc3NmdWwsIHRoZSBvcGVyYXRpb24gaXMgcmVtb3ZlZCBmcm9tIHRoZSByZWRvIGhpc3RvcnkgYW5kCi0JCS8vIHBsYWNlZCBiYWNrIGluIHRoZSB1bmRvIGhpc3RvcnkuCi0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkvLyBXZSB3aWxsIG9ubHkgYWRkIHRoZSBvcGVyYXRpb24gdG8gdGhlIHVuZG8gc3RhY2sgaWYgaXQgY2FuIGluZGVlZAotCQkJLy8gYmUgdW5kb25lLiBUaGlzIGNvbnNlcnZhdGlzbSBpcyBhZGRlZCB0byBzdXBwb3J0IHRoZSBpbnRlZ3JhdGlvbgotCQkJLy8gb2YgZXhpc3RpbmcgZnJhbWV3b3JrcyAoc3VjaCBhcyBSZWZhY3RvcmluZykgdGhhdCBwcm9kdWNlCi0JCQkvLyB1bmRvIGFuZCByZWRvIGJlaGF2aW9yIG9uIHRoZSBmbHkgYW5kIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBhCi0JCQkvLyBzdWNjZXNzZnVsIHJlZG8gbWVhbnMgYSBzdWNjZXNzZnVsIHVuZG8gd2lsbCBiZSBhdmFpbGFibGUuCi0JCQkvLyBXZSBjaGVjayB0aGlzIGNvbmRpdGlvbiBvdXRzaWRlIG9mIHRoZSBzeW5jaHJvbml6ZWQgYmxvY2suCi0JCQkvLyBTZWUgYnVnICM4NDQ0NAotCQkJYm9vbGVhbiBhZGRUb1VuZG9TdGFjayA9IG9wZXJhdGlvbi5jYW5VbmRvKCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHVuZG9SZWRvSGlzdG9yeUxvY2spIHsKLQkJCQlyZWRvTGlzdC5yZW1vdmUob3BlcmF0aW9uKTsKLQkJCQlpZiAoYWRkVG9VbmRvU3RhY2sgJiYgY2hlY2tVbmRvTGltaXQob3BlcmF0aW9uKSkgewotCQkJCQl1bmRvTGlzdC5hZGQob3BlcmF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWFkZFRvVW5kb1N0YWNrKSB7Ci0JCQkJLy8gZGlzcG9zZSB0aGUgb3BlcmF0aW9uIHNpbmNlIHdlIGRpZCBub3QgYWRkIGl0IHRvIHRoZSBzdGFjawotCQkJCS8vIGFuZCB3aWxsIG5vIGxvbmdlciBoYXZlIGEgcmVmZXJlbmNlIHRvIGl0LgotCQkJCS8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTQ0MDAKLQkJCQlvcGVyYXRpb24uZGlzcG9zZSgpOwotCQkJfQotCQkJLy8gbm90aWZ5IGxpc3RlbmVycyBtdXN0IGhhcHBlbiBhZnRlciBoaXN0b3J5IGlzIHVwZGF0ZWQKLQkJCW5vdGlmeVJlZG9uZShvcGVyYXRpb24pOwotCQl9IGVsc2UgewotCQkJbm90aWZ5Tm90T0sob3BlcmF0aW9uLCBzdGF0dXMpOwotCQl9Ci0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtIHRoZSB1bmRvLiBBbGwgdmFsaWRpdHkgY2hlY2tzIGhhdmUgYWxyZWFkeSBvY2N1cnJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgZG9VbmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvLAotCQkJSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gZ2V0VW5kb0FwcHJvdmFsKG9wZXJhdGlvbiwgaW5mbyk7Ci0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQlub3RpZnlBYm91dFRvVW5kbyhvcGVyYXRpb24pOwotCQkJdHJ5IHsKLQkJCQlzdGF0dXMgPSBvcGVyYXRpb24udW5kbyhtb25pdG9yLCBpbmZvKTsKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJbm90aWZ5Tm90T0sob3BlcmF0aW9uKTsKLQkJCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfVU5FWFBFQ1RFRCkgewotCQkJCQlUcmFjaW5nLnByaW50VHJhY2UoIk9QRVJBVElPTkhJU1RPUlkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJIkV4ZWN1dGlvbkV4Y2VwdGlvbiB3aGlsZSB1bmRvaW5nICIgKyBvcGVyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXRocm93IGU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCW5vdGlmeU5vdE9LKG9wZXJhdGlvbik7Ci0JCQkJaWYgKERFQlVHX09QRVJBVElPTl9ISVNUT1JZX1VORVhQRUNURUQpIHsKLQkJCQkJVHJhY2luZy5wcmludFRyYWNlKCJPUEVSQVRJT05ISVNUT1JZIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSJFeGNlcHRpb24gd2hpbGUgdW5kb2luZyAiICsgb3BlcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKAotCQkJCQkJIldoaWxlIHVuZG9pbmcgdGhlIG9wZXJhdGlvbiwgYW4gZXhjZXB0aW9uIG9jY3VycmVkIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkvLyBpZiBzdWNjZXNzZnVsLCB0aGUgb3BlcmF0aW9uIGlzIHJlbW92ZWQgZnJvbSB0aGUgdW5kbyBoaXN0b3J5IGFuZAotCQkvLyBwbGFjZWQgaW4gdGhlIHJlZG8gaGlzdG9yeS4KLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCS8vIE9ubHkgYWRkIHRoZSBvcGVyYXRpb24gdG8gdGhlIHJlZG8gc3RhY2sgaWYgaXQgY2FuIGluZGVlZCBiZQotCQkJLy8gcmVkb25lLiBUaGlzIGNvbnNlcnZhdGlzbSBpcyBhZGRlZCB0byBzdXBwb3J0IHRoZSBpbnRlZ3JhdGlvbgotCQkJLy8gb2YgZXhpc3RpbmcgZnJhbWV3b3JrcyAoc3VjaCBhcyBSZWZhY3RvcmluZykgdGhhdCBwcm9kdWNlCi0JCQkvLyB1bmRvIGFuZCByZWRvIGJlaGF2aW9yIG9uIHRoZSBmbHkgYW5kIGNhbm5vdCBndWFyYW50ZWUgdGhhdAotCQkJLy8gYSBzdWNjZXNzZnVsIHVuZG8gbWVhbnMgYSBzdWNjZXNzZnVsIHJlZG8gd2lsbCBiZSBhdmFpbGFibGUuCi0JCQkvLyBXZSBjaGVjayB0aGlzIG91dHNpZGUgb2YgdGhlIHN5bmNocm9uaXplZCBibG9jay4KLQkJCS8vIFNlZSBidWcgIzg0NDQ0Ci0JCQlib29sZWFuIGFkZFRvUmVkb1N0YWNrID0gb3BlcmF0aW9uLmNhblJlZG8oKTsKLQkJCXN5bmNocm9uaXplZCAodW5kb1JlZG9IaXN0b3J5TG9jaykgewotCQkJCXVuZG9MaXN0LnJlbW92ZShvcGVyYXRpb24pOwotCQkJCWlmIChhZGRUb1JlZG9TdGFjayAmJiBjaGVja1JlZG9MaW1pdChvcGVyYXRpb24pKSB7Ci0JCQkJCXJlZG9MaXN0LmFkZChvcGVyYXRpb24pOwotCQkJCX0KLQkJCX0KLQkJCWlmICghYWRkVG9SZWRvU3RhY2spIHsKLQkJCQkvLyBkaXNwb3NlIHRoZSBvcGVyYXRpb24gc2luY2Ugd2UgZGlkIG5vdCBhZGQgaXQgdG8gdGhlIHN0YWNrCi0JCQkJLy8gYW5kIHdpbGwgbm8gbG9uZ2VyIGhhdmUgYSByZWZlcmVuY2UgdG8gaXQuCi0JCQkJLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NDQwMAotCQkJCW9wZXJhdGlvbi5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQkvLyBub3RpZmljYXRpb24gb2NjdXJzIGFmdGVyIHRoZSB1bmRvIGFuZCByZWRvIGhpc3RvcmllcyBhcmUKLQkJCS8vIGFkanVzdGVkCi0JCQlub3RpZnlVbmRvbmUob3BlcmF0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCW5vdGlmeU5vdE9LKG9wZXJhdGlvbiwgc3RhdHVzKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25IaXN0b3J5I2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChvcGVyYXRpb24pOwotCi0JCS8vIGVycm9yIGlmIG9wZXJhdGlvbiBpcyBpbnZhbGlkCi0JCWlmICghb3BlcmF0aW9uLmNhbkV4ZWN1dGUoKSkgewotCQkJcmV0dXJuIElPcGVyYXRpb25IaXN0b3J5Lk9QRVJBVElPTl9JTlZBTElEX1NUQVRVUzsKLQkJfQotCi0JCS8qCi0JCSAqIElmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIG9wZW4gY29tcG9zaXRlLCB0aGVuIHdlIHdpbGwgYWRkIHRoaXMKLQkJICogb3BlcmF0aW9uIHRvIHRoZSBvcGVuIG9wZXJhdGlvbiByYXRoZXIgdGhhbiBhZGQgdGhlIG9wZXJhdGlvbiB0byB0aGUKLQkJICogaGlzdG9yeS4gV2Ugd2lsbCBzdGlsbCBleGVjdXRlIGl0LgotCQkgKi8KLQkJYm9vbGVhbiBtZXJnaW5nID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCAob3BlbkNvbXBvc2l0ZUxvY2spIHsKLQkJCWlmIChvcGVuQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCQkvLyB0aGUgY29tcG9zaXRlIHNob3VsZG4ndCBiZSBleGVjdXRlZCBleHBsaWNpdGx5IHdoaWxlIGl0IGlzCi0JCQkJLy8gc3RpbGwKLQkJCQkvLyBvcGVuCi0JCQkJaWYgKG9wZW5Db21wb3NpdGUgPT0gb3BlcmF0aW9uKSB7Ci0JCQkJCXJldHVybiBJT3BlcmF0aW9uSGlzdG9yeS5PUEVSQVRJT05fSU5WQUxJRF9TVEFUVVM7Ci0JCQkJfQotCQkJCW9wZW5Db21wb3NpdGUuYWRkKG9wZXJhdGlvbik7Ci0JCQkJbWVyZ2luZyA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBFeGVjdXRlIHRoZSBvcGVyYXRpb24KLQkJICovCi0JCWlmICghbWVyZ2luZykKLQkJCW5vdGlmeUFib3V0VG9FeGVjdXRlKG9wZXJhdGlvbik7Ci0JCUlTdGF0dXMgc3RhdHVzOwotCQl0cnkgewotCQkJc3RhdHVzID0gb3BlcmF0aW9uLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cyA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJbm90aWZ5Tm90T0sob3BlcmF0aW9uKTsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlub3RpZnlOb3RPSyhvcGVyYXRpb24pOwotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigKLQkJCQkJIldoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uLCBhbiBleGNlcHRpb24gb2NjdXJyZWQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gaWYgc3VjY2Vzc2Z1bCwgdGhlIG5vdGlmeSBsaXN0ZW5lcnMgYXJlIG5vdGlmaWVkIGFuZCB0aGUgb3BlcmF0aW9uIGlzCi0JCS8vIGFkZGVkIHRvIHRoZSBoaXN0b3J5Ci0JCWlmICghbWVyZ2luZykgewotCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCQlub3RpZnlEb25lKG9wZXJhdGlvbik7Ci0JCQkJLy8gT25seSBhZGQgdGhlIG9wZXJhdGlvbiB0byB0aGUgaGlzdG9yeSBpZiBpdCBjYW4gaW5kZWVkIGJlCi0JCQkJLy8gdW5kb25lLiBUaGlzIGNvbnNlcnZhdGlzbSBpcyBhZGRlZCB0byBzdXBwb3J0IHRoZQotCQkJCS8vIGludGVncmF0aW9uIG9mIGV4aXN0aW5nIGZyYW1ld29ya3MgKHN1Y2ggYXMgUmVmYWN0b3JpbmcpCi0JCQkJLy8gdGhhdCBtYXkgYmUgdXNpbmcgYSBoaXN0b3J5IHRvIGV4ZWN1dGUKLQkJCQkvLyBhbGwgb3BlcmF0aW9ucywgZXZlbiB0aG9zZSB0aGF0IGFyZSBub3QgdW5kb2FibGUuCi0JCQkJLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDQ0NAotCQkJCWlmIChvcGVyYXRpb24uY2FuVW5kbygpKSB7Ci0JCQkJCWFkZChvcGVyYXRpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGRpc3Bvc2UgdGhlIG9wZXJhdGlvbiBzaW5jZSB3ZSBkaWQgbm90IGFkZCBpdCB0byB0aGUKLQkJCQkJLy8gc3RhY2sKLQkJCQkJLy8gYW5kIHdpbGwgbm8gbG9uZ2VyIGhhdmUgYSByZWZlcmVuY2UgdG8gaXQuCi0JCQkJCS8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTQ0MDAKLQkJCQkJb3BlcmF0aW9uLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW5vdGlmeU5vdE9LKG9wZXJhdGlvbiwgc3RhdHVzKTsKLQkJCQkvLyBkaXNwb3NlIHRoZSBvcGVyYXRpb24gc2luY2Ugd2UgZGlkIG5vdCBhZGQgaXQgdG8gdGhlIHN0YWNrCi0JCQkJLy8gYW5kIHdpbGwgbm8gbG9uZ2VyIGhhdmUgYSByZWZlcmVuY2UgdG8gaXQuCi0JCQkJb3BlcmF0aW9uLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQkvLyBhbGwgb3RoZXIgc2V2ZXJpdGllcyBhcmUgbm90IGludGVycHJldGVkLiBTaW1wbHkgcmV0dXJuIHRoZSBzdGF0dXMuCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoKLQkgKiBGaWx0ZXIgdGhlIHNwZWNpZmllZCBsaXN0IHRvIGluY2x1ZGUgb25seSB0aGUgc3BlY2lmaWVkIHVuZG8gY29udGV4dC4KLQkgKi8KLQlwcml2YXRlIElVbmRvYWJsZU9wZXJhdGlvbltdIGZpbHRlcihMaXN0IGxpc3QsIElVbmRvQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8qCi0JCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbmV2ZXIgdGhlcmUgaXMgYSBuZWVkIHRvIGZpbHRlciB0aGUgdW5kbyBvcgotCQkgKiByZWRvIGhpc3Rvcnkgb24gYSBwYXJ0aWN1bGFyIGNvbnRleHQuIEN1cnJlbnRseSB0aGVyZSBhcmUgbm8gY2FjaGVzCi0JCSAqIGtlcHQgdG8gb3B0aW1pemUgcmVwZWF0ZWQgcmVxdWVzdHMgZm9yIHRoZSBzYW1lIGZpbHRlci4gSWYgYmVuY2htYXJrcwotCQkgKiBzaG93IHRoaXMgdG8gYmUgYSBjb21tb24gcGF0dGVybiB0aGF0IGNhdXNlcyBwZXJmb3JtYW5jZXMgcHJvYmxlbXMsCi0JCSAqIHdlIGNvdWxkIGltcGxlbWVudCBhIGZpbHRlcmVkIGNhY2hlIGhlcmUgdGhhdCBpcyBudWxsaWZpZWQgd2hlbmV2ZXIKLQkJICogdGhlIGdsb2JhbCBoaXN0b3J5IGNoYW5nZXMuCi0JCSAqLwotCi0JCUxpc3QgZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQlzeW5jaHJvbml6ZWQgKHVuZG9SZWRvSGlzdG9yeUxvY2spIHsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uID0gKElVbmRvYWJsZU9wZXJhdGlvbikgaXRlcmF0b3IKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJaWYgKG9wZXJhdGlvbi5oYXNDb250ZXh0KGNvbnRleHQpKSB7Ci0JCQkJCWZpbHRlcmVkLmFkZChvcGVyYXRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElVbmRvYWJsZU9wZXJhdGlvbltdKSBmaWx0ZXJlZAotCQkJCS50b0FycmF5KG5ldyBJVW5kb2FibGVPcGVyYXRpb25bZmlsdGVyZWQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoKLQkgKiBGbHVzaCB0aGUgcmVkbyBzdGFjayBvZiBhbGwgb3BlcmF0aW9ucyB0aGF0IGhhdmUgdGhlIGdpdmVuIGNvbnRleHQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZsdXNoUmVkbyhJVW5kb0NvbnRleHQgY29udGV4dCkgewotCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfRElTUE9TRSkgewotCQkJVHJhY2luZy5wcmludFRyYWNlKCJPUEVSQVRJT05ISVNUT1JZIiwgIkZsdXNoaW5nIHJlZG8gaGlzdG9yeSBmb3IgIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyBjb250ZXh0KTsKLQkJfQotCi0JCU9iamVjdFtdIGZpbHRlcmVkID0gZmlsdGVyKHJlZG9MaXN0LCBjb250ZXh0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJlZC5sZW5ndGg7IGkrKykgewotCQkJSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChJVW5kb2FibGVPcGVyYXRpb24pIGZpbHRlcmVkW2ldOwotCQkJaWYgKGNvbnRleHQgPT0gR0xPQkFMX1VORE9fQ09OVEVYVAotCQkJCQl8fCBvcGVyYXRpb24uZ2V0Q29udGV4dHMoKS5sZW5ndGggPT0gMSkgewotCQkJCS8vIHJlbW92ZSB0aGUgb3BlcmF0aW9uIGlmIGl0IG9ubHkgaGFzIHRoZSBjb250ZXh0IG9yIHdlIGFyZQotCQkJCS8vIGZsdXNoaW5nIGFsbAotCQkJCXJlZG9MaXN0LnJlbW92ZShvcGVyYXRpb24pOwotCQkJCWludGVybmFsUmVtb3ZlKG9wZXJhdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjb250ZXh0Ci0JCQkJb3BlcmF0aW9uLnJlbW92ZUNvbnRleHQoY29udGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEZsdXNoIHRoZSB1bmRvIHN0YWNrIG9mIGFsbCBvcGVyYXRpb25zIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmx1c2hVbmRvKElVbmRvQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmIChERUJVR19PUEVSQVRJT05fSElTVE9SWV9ESVNQT1NFKSB7Ci0JCQlUcmFjaW5nLnByaW50VHJhY2UoIk9QRVJBVElPTkhJU1RPUlkiLCAiRmx1c2hpbmcgdW5kbyBoaXN0b3J5IGZvciAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIGNvbnRleHQpOwotCQl9Ci0KLQkJT2JqZWN0W10gZmlsdGVyZWQgPSBmaWx0ZXIodW5kb0xpc3QsIGNvbnRleHQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcmVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uID0gKElVbmRvYWJsZU9wZXJhdGlvbikgZmlsdGVyZWRbaV07Ci0JCQlpZiAoY29udGV4dCA9PSBHTE9CQUxfVU5ET19DT05URVhUCi0JCQkJCXx8IG9wZXJhdGlvbi5nZXRDb250ZXh0cygpLmxlbmd0aCA9PSAxKSB7Ci0JCQkJLy8gcmVtb3ZlIHRoZSBvcGVyYXRpb24gaWYgaXQgb25seSBoYXMgdGhlIGNvbnRleHQgb3Igd2UgYXJlCi0JCQkJLy8gZmx1c2hpbmcgYWxsCi0JCQkJdW5kb0xpc3QucmVtb3ZlKG9wZXJhdGlvbik7Ci0JCQkJaW50ZXJuYWxSZW1vdmUob3BlcmF0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNvbnRleHQKLQkJCQlvcGVyYXRpb24ucmVtb3ZlQ29udGV4dChjb250ZXh0KTsKLQkJCX0KLQkJfQotCQkvKgotCQkgKiBUaGVyZSBtYXkgYmUgYW4gb3BlbiBjb21wb3NpdGUuIElmIGl0IGhhcyB0aGlzIGNvbnRleHQsIHRoZW4gdGhlCi0JCSAqIGNvbnRleHQgbXVzdCBiZSByZW1vdmVkLiBJZiBpdCBoYXMgb25seSB0aGlzIGNvbnRleHQgb3Igd2UgYXJlCi0JCSAqIGZsdXNoaW5nIGFsbCBvcGVyYXRpb25zLCB0aGVuIG51bGwgaXQgb3V0IGFuZCBub3RpZnkgdGhhdCB3ZSBhcmUKLQkJICogZW5kaW5nIGl0LiBXZSBkb24ndCByZW1vdmUgaXQgc2luY2UgaXQgd2FzIG5ldmVyIGFkZGVkLgotCQkgKi8KLQkJSUNvbXBvc2l0ZU9wZXJhdGlvbiBlbmRlZENvbXBvc2l0ZSA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAob3BlbkNvbXBvc2l0ZUxvY2spIHsKLQkJCWlmIChvcGVuQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCQlpZiAob3BlbkNvbXBvc2l0ZS5oYXNDb250ZXh0KGNvbnRleHQpKSB7Ci0JCQkJCWlmIChjb250ZXh0ID09IEdMT0JBTF9VTkRPX0NPTlRFWFQKLQkJCQkJCQl8fCBvcGVuQ29tcG9zaXRlLmdldENvbnRleHRzKCkubGVuZ3RoID09IDEpIHsKLQkJCQkJCWVuZGVkQ29tcG9zaXRlID0gb3BlbkNvbXBvc2l0ZTsKLQkJCQkJCW9wZW5Db21wb3NpdGUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJb3BlbkNvbXBvc2l0ZS5yZW1vdmVDb250ZXh0KGNvbnRleHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIG5vdGlmeSBvdXRzaWRlIG9mIHRoZSBzeW5jaHJvbml6ZWQgYmxvY2suCi0JCWlmIChlbmRlZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlub3RpZnlOb3RPSyhlbmRlZENvbXBvc2l0ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEZvcmNlIHRoZSByZWRvIGhpc3RvcnkgZm9yIHRoZSBnaXZlbiBjb250ZXh0IHRvIGNvbnRhaW4gbWF4IG9yIGxlc3MKLQkgKiBpdGVtcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZm9yY2VSZWRvTGltaXQoSVVuZG9Db250ZXh0IGNvbnRleHQsIGludCBtYXgpIHsKLQkJT2JqZWN0W10gZmlsdGVyZWQgPSBmaWx0ZXIocmVkb0xpc3QsIGNvbnRleHQpOwotCQlpbnQgc2l6ZSA9IGZpbHRlcmVkLmxlbmd0aDsKLQkJaWYgKHNpemUgPiAwKSB7Ci0JCQlpbnQgaW5kZXggPSAwOwotCQkJd2hpbGUgKHNpemUgPiBtYXgpIHsKLQkJCQlJVW5kb2FibGVPcGVyYXRpb24gcmVtb3ZlZCA9IChJVW5kb2FibGVPcGVyYXRpb24pIGZpbHRlcmVkW2luZGV4XTsKLQkJCQlpZiAoY29udGV4dCA9PSBHTE9CQUxfVU5ET19DT05URVhUCi0JCQkJCQl8fCByZW1vdmVkLmdldENvbnRleHRzKCkubGVuZ3RoID09IDEpIHsKLQkJCQkJLyoKLQkJCQkJICogcmVtb3ZlIHRoZSBvcGVyYXRpb24gaWYgd2UgYXJlIGVuZm9yY2luZyBhIGdsb2JhbCBsaW1pdAotCQkJCQkgKiBvciBpZiB0aGUgb3BlcmF0aW9uIG9ubHkgaGFzIHRoZSBzcGVjaWZpZWQgY29udGV4dAotCQkJCQkgKi8KLQkJCQkJcmVkb0xpc3QucmVtb3ZlKHJlbW92ZWQpOwotCQkJCQlpbnRlcm5hbFJlbW92ZShyZW1vdmVkKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBpZiB0aGUgb3BlcmF0aW9uIGhhcyBtdWx0aXBsZSBjb250ZXh0cyBhbmQgd2UndmUgcmVhY2hlZAotCQkJCQkgKiB0aGUgbGltaXQgZm9yIG9ubHkgb25lIG9mIHRoZW0sIHRoZW4ganVzdCByZW1vdmUgdGhlCi0JCQkJCSAqIGNvbnRleHQsIG5vdCB0aGUgb3BlcmF0aW9uLgotCQkJCQkgKi8KLQkJCQkJcmVtb3ZlZC5yZW1vdmVDb250ZXh0KGNvbnRleHQpOwotCQkJCX0KLQkJCQlzaXplLS07Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogRm9yY2UgdGhlIHVuZG8gaGlzdG9yeSBmb3IgdGhlIGdpdmVuIGNvbnRleHQgdG8gY29udGFpbiBtYXggb3IgbGVzcwotCSAqIGl0ZW1zLgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JjZVVuZG9MaW1pdChJVW5kb0NvbnRleHQgY29udGV4dCwgaW50IG1heCkgewotCQlPYmplY3RbXSBmaWx0ZXJlZCA9IGZpbHRlcih1bmRvTGlzdCwgY29udGV4dCk7Ci0JCWludCBzaXplID0gZmlsdGVyZWQubGVuZ3RoOwotCQlpZiAoc2l6ZSA+IDApIHsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQl3aGlsZSAoc2l6ZSA+IG1heCkgewotCQkJCUlVbmRvYWJsZU9wZXJhdGlvbiByZW1vdmVkID0gKElVbmRvYWJsZU9wZXJhdGlvbikgZmlsdGVyZWRbaW5kZXhdOwotCQkJCWlmIChjb250ZXh0ID09IEdMT0JBTF9VTkRPX0NPTlRFWFQKLQkJCQkJCXx8IHJlbW92ZWQuZ2V0Q29udGV4dHMoKS5sZW5ndGggPT0gMSkgewotCQkJCQkvKgotCQkJCQkgKiByZW1vdmUgdGhlIG9wZXJhdGlvbiBpZiB3ZSBhcmUgZW5mb3JjaW5nIGEgZ2xvYmFsIGxpbWl0Ci0JCQkJCSAqIG9yIGlmIHRoZSBvcGVyYXRpb24gb25seSBoYXMgdGhlIHNwZWNpZmllZCBjb250ZXh0Ci0JCQkJCSAqLwotCQkJCQl1bmRvTGlzdC5yZW1vdmUocmVtb3ZlZCk7Ci0JCQkJCWludGVybmFsUmVtb3ZlKHJlbW92ZWQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIGlmIHRoZSBvcGVyYXRpb24gaGFzIG11bHRpcGxlIGNvbnRleHRzIGFuZCB3ZSd2ZSByZWFjaGVkCi0JCQkJCSAqIHRoZSBsaW1pdCBmb3Igb25seSBvbmUgb2YgdGhlbSwgdGhlbiBqdXN0IHJlbW92ZSB0aGUKLQkJCQkJICogY29udGV4dCwgbm90IHRoZSBvcGVyYXRpb24uCi0JCQkJCSAqLwotCQkJCQlyZW1vdmVkLnJlbW92ZUNvbnRleHQoY29udGV4dCk7Ci0JCQkJfQotCQkJCXNpemUtLTsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3RvcnkjZ2V0TGltaXQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGltaXQoSVVuZG9Db250ZXh0IGNvbnRleHQpIHsKLQkJaWYgKCFsaW1pdHMuY29udGFpbnNLZXkoY29udGV4dCkpIHsKLQkJCXJldHVybiBERUZBVUxUX0xJTUlUOwotCQl9Ci0JCXJldHVybiAoKEludGVnZXIpIChsaW1pdHMuZ2V0KGNvbnRleHQpKSkuaW50VmFsdWUoKTsKLQl9Ci0KLQkvKgotCSAqIENvbnN1bHQgdGhlIElPcGVyYXRpb25BcHByb3ZlcnMgdG8gc2VlIGlmIHRoZSBwcm9wb3NlZCByZWRvIHNob3VsZCBiZQotCSAqIGFsbG93ZWQuCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIGdldFJlZG9BcHByb3ZhbChJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uLAotCQkJSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCQotCQlmaW5hbCBPYmplY3RbXSBhcHByb3ZlckFycmF5ID0gYXBwcm92ZXJzLmdldExpc3RlbmVycygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXBwcm92ZXJBcnJheS5sZW5ndGg7IGkrKykgewotCQkJSU9wZXJhdGlvbkFwcHJvdmVyIGFwcHJvdmVyID0gKElPcGVyYXRpb25BcHByb3ZlcilhcHByb3ZlckFycmF5W2ldOwotCQkJSVN0YXR1cyBhcHByb3ZhbCA9IGFwcHJvdmVyLnByb2NlZWRSZWRvaW5nKG9wZXJhdGlvbiwgdGhpcywgaW5mbyk7Ci0JCQlpZiAoIWFwcHJvdmFsLmlzT0soKSkgewotCQkJCWlmIChERUJVR19PUEVSQVRJT05fSElTVE9SWV9BUFBST1ZBTCkgewotCQkJCQlUcmFjaW5nLnByaW50VHJhY2UoIk9QRVJBVElPTkhJU1RPUlkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJIlJlZG8gbm90IGFwcHJvdmVkIGJ5ICIgKyBhcHByb3ZlciAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJmb3Igb3BlcmF0aW9uICIgKyBvcGVyYXRpb24gLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiIGFwcHJvdmVkIGJ5ICIgKyBhcHByb3ZhbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIGFwcHJvdmFsOwotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25IaXN0b3J5I2dldFJlZG9IaXN0b3J5KG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQpCi0JICovCi0JcHVibGljIElVbmRvYWJsZU9wZXJhdGlvbltdIGdldFJlZG9IaXN0b3J5KElVbmRvQ29udGV4dCBjb250ZXh0KSB7Ci0JCUFzc2VydC5pc05vdE51bGwoY29udGV4dCk7Ci0JCXJldHVybiBmaWx0ZXIocmVkb0xpc3QsIGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25IaXN0b3J5I2dldE9wZXJhdGlvbihvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9Db250ZXh0KQotCSAqLwotCXB1YmxpYyBJVW5kb2FibGVPcGVyYXRpb24gZ2V0UmVkb09wZXJhdGlvbihJVW5kb0NvbnRleHQgY29udGV4dCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRleHQpOwotCQlzeW5jaHJvbml6ZWQgKHVuZG9SZWRvSGlzdG9yeUxvY2spIHsKLQkJCWZvciAoaW50IGkgPSByZWRvTGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCUlVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoSVVuZG9hYmxlT3BlcmF0aW9uKSByZWRvTGlzdAotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAob3BlcmF0aW9uLmhhc0NvbnRleHQoY29udGV4dCkpIHsKLQkJCQkJcmV0dXJuIG9wZXJhdGlvbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBDb25zdWx0IHRoZSBJT3BlcmF0aW9uQXBwcm92ZXJzIHRvIHNlZSBpZiB0aGUgcHJvcG9zZWQgdW5kbyBzaG91bGQgYmUKLQkgKiBhbGxvd2VkLgotCSAqLwotCXByaXZhdGUgSVN0YXR1cyBnZXRVbmRvQXBwcm92YWwoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbiwKLQkJCUlBZGFwdGFibGUgaW5mbykgewotCi0JCWZpbmFsIE9iamVjdFtdIGFwcHJvdmVyQXJyYXkgPSBhcHByb3ZlcnMuZ2V0TGlzdGVuZXJzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcHByb3ZlckFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlJT3BlcmF0aW9uQXBwcm92ZXIgYXBwcm92ZXIgPSAoSU9wZXJhdGlvbkFwcHJvdmVyKWFwcHJvdmVyQXJyYXlbaV07Ci0JCQlJU3RhdHVzIGFwcHJvdmFsID0gYXBwcm92ZXIucHJvY2VlZFVuZG9pbmcob3BlcmF0aW9uLCB0aGlzLCBpbmZvKTsKLQkJCWlmICghYXBwcm92YWwuaXNPSygpKSB7Ci0JCQkJaWYgKERFQlVHX09QRVJBVElPTl9ISVNUT1JZX0FQUFJPVkFMKSB7Ci0JCQkJCVRyYWNpbmcucHJpbnRUcmFjZSgiT1BFUkFUSU9OSElTVE9SWSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkiVW5kbyBub3QgYXBwcm92ZWQgYnkgIiArIGFwcHJvdmVyIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgImZvciBvcGVyYXRpb24gIiArIG9wZXJhdGlvbiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICIgd2l0aCBzdGF0dXMgIiArIGFwcHJvdmFsKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gYXBwcm92YWw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3RvcnkjZ2V0VW5kb0hpc3Rvcnkob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgSVVuZG9hYmxlT3BlcmF0aW9uW10gZ2V0VW5kb0hpc3RvcnkoSVVuZG9Db250ZXh0IGNvbnRleHQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZXh0KTsKLQkJcmV0dXJuIGZpbHRlcih1bmRvTGlzdCwgY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3RvcnkjZ2V0VW5kb09wZXJhdGlvbihvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9Db250ZXh0KQotCSAqLwotCXB1YmxpYyBJVW5kb2FibGVPcGVyYXRpb24gZ2V0VW5kb09wZXJhdGlvbihJVW5kb0NvbnRleHQgY29udGV4dCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRleHQpOwotCQlzeW5jaHJvbml6ZWQgKHVuZG9SZWRvSGlzdG9yeUxvY2spIHsKLQkJCWZvciAoaW50IGkgPSB1bmRvTGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCUlVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoSVVuZG9hYmxlT3BlcmF0aW9uKSB1bmRvTGlzdAotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAob3BlcmF0aW9uLmhhc0NvbnRleHQoY29udGV4dCkpIHsKLQkJCQkJcmV0dXJuIG9wZXJhdGlvbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBSZW1vdmUgdGhlIG9wZXJhdGlvbiBieSBkaXNwb3NpbmcgaXQgYW5kIG5vdGlmeWluZyBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsUmVtb3ZlKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJb3BlcmF0aW9uLmRpc3Bvc2UoKTsKLQkJbm90aWZ5UmVtb3ZlZChvcGVyYXRpb24pOwotCX0KLQotCS8qCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhbiBvcGVyYXRpb24gZXZlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUxpc3RlbmVycyhPcGVyYXRpb25IaXN0b3J5RXZlbnQgZXZlbnQpIHsKLQkJcHJlTm90aWZ5T3BlcmF0aW9uKGV2ZW50LmdldE9wZXJhdGlvbigpLCBldmVudCk7Ci0KLQkJLy8gY29weWluZyBsaXN0ZW5lciBsaXN0IHRvIGFycmF5IHRvIHByZXZlbnQgY29uY3VycmVudAotCQkvLyBtb2RpZmljYXRpb24gb2YgdGhlIGxpc3QuIFNlZQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTEzNDMKLQotCQlmaW5hbCBPYmplY3RbXSBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJBcnJheS5sZW5ndGg7IGkrKykKLQkJCXRyeSB7Ci0JCQkJKChJT3BlcmF0aW9uSGlzdG9yeUxpc3RlbmVyKWxpc3RlbmVyQXJyYXlbaV0pLmhpc3RvcnlOb3RpZmljYXRpb24oZXZlbnQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQloYW5kbGVOb3RpZmljYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUFib3V0VG9FeGVjdXRlKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKERFQlVHX09QRVJBVElPTl9ISVNUT1JZX05PVElGSUNBVElPTikgewotCQkJVHJhY2luZy5wcmludFRyYWNlKCJPUEVSQVRJT05ISVNUT1JZIiwgIkFCT1VUX1RPX0VYRUNVVEUgIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyBvcGVyYXRpb24pOwotCQl9Ci0KLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBPcGVyYXRpb25IaXN0b3J5RXZlbnQoCi0JCQkJT3BlcmF0aW9uSGlzdG9yeUV2ZW50LkFCT1VUX1RPX0VYRUNVVEUsIHRoaXMsIG9wZXJhdGlvbikpOwotCX0KLQotCS8qCi0JICogTm90aWZ5IGxpc3RlbmVycyB0aGF0IGFuIG9wZXJhdGlvbiBpcyBhYm91dCB0byByZWRvLgotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlBYm91dFRvUmVkbyhJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChERUJVR19PUEVSQVRJT05fSElTVE9SWV9OT1RJRklDQVRJT04pIHsKLQkJCVRyYWNpbmcKLQkJCQkJLnByaW50VHJhY2UoIk9QRVJBVElPTkhJU1RPUlkiLCAiQUJPVVRfVE9fUkVETyAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCSsgb3BlcmF0aW9uKTsKLQkJfQotCi0JCW5vdGlmeUxpc3RlbmVycyhuZXcgT3BlcmF0aW9uSGlzdG9yeUV2ZW50KAotCQkJCU9wZXJhdGlvbkhpc3RvcnlFdmVudC5BQk9VVF9UT19SRURPLCB0aGlzLCBvcGVyYXRpb24pKTsKLQl9Ci0KLQkvKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgdGhhdCBhbiBvcGVyYXRpb24gaXMgYWJvdXQgdG8gdW5kby4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5QWJvdXRUb1VuZG8oSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfTk9USUZJQ0FUSU9OKSB7Ci0JCQlUcmFjaW5nCi0JCQkJCS5wcmludFRyYWNlKCJPUEVSQVRJT05ISVNUT1JZIiwgIkFCT1VUX1RPX1VORE8gIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkrIG9wZXJhdGlvbik7Ci0JCX0KLQotCQlub3RpZnlMaXN0ZW5lcnMobmV3IE9wZXJhdGlvbkhpc3RvcnlFdmVudCgKLQkJCQlPcGVyYXRpb25IaXN0b3J5RXZlbnQuQUJPVVRfVE9fVU5ETywgdGhpcywgb3BlcmF0aW9uKSk7Ci0JfQotCi0JLyoKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIHRoYXQgYW4gb3BlcmF0aW9uIGhhcyBiZWVuIGFkZGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlBZGQoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfTk9USUZJQ0FUSU9OKSB7Ci0JCQlUcmFjaW5nLnByaW50VHJhY2UoIk9QRVJBVElPTkhJU1RPUlkiLCAiT1BFUkFUSU9OX0FEREVEICIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSsgb3BlcmF0aW9uKTsKLQkJfQotCi0JCW5vdGlmeUxpc3RlbmVycyhuZXcgT3BlcmF0aW9uSGlzdG9yeUV2ZW50KAotCQkJCU9wZXJhdGlvbkhpc3RvcnlFdmVudC5PUEVSQVRJT05fQURERUQsIHRoaXMsIG9wZXJhdGlvbikpOwotCX0KLQotCS8qCi0JICogTm90aWZ5IGxpc3RlbmVycyB0aGF0IGFuIG9wZXJhdGlvbiBpcyBkb25lIGV4ZWN1dGluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5RG9uZShJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChERUJVR19PUEVSQVRJT05fSElTVE9SWV9OT1RJRklDQVRJT04pIHtUcmFjaW5nCi0JCQkucHJpbnRUcmFjZSgiT1BFUkFUSU9OSElTVE9SWSIsICJET05FICIgKyBvcGVyYXRpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCW5vdGlmeUxpc3RlbmVycyhuZXcgT3BlcmF0aW9uSGlzdG9yeUV2ZW50KE9wZXJhdGlvbkhpc3RvcnlFdmVudC5ET05FLAotCQkJCXRoaXMsIG9wZXJhdGlvbikpOwotCX0KLQotCS8qCi0JICogTm90aWZ5IGxpc3RlbmVycyB0aGF0IGFuIG9wZXJhdGlvbiBkaWQgbm90IHN1Y2NlZWQgYWZ0ZXIgYW4gYXR0ZW1wdCB0bwotCSAqIGV4ZWN1dGUsIHVuZG8sIG9yIHJlZG8gd2FzIG1hZGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeU5vdE9LKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJbm90aWZ5Tm90T0sob3BlcmF0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgdGhhdCBhbiBvcGVyYXRpb24gZGlkIG5vdCBzdWNjZWVkIGFmdGVyIGFuIGF0dGVtcHQgdG8KLQkgKiBleGVjdXRlLCB1bmRvLCBvciByZWRvIHdhcyBtYWRlLiBJbmNsdWRlIHRoZSBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGF0dGVtcHQuCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlOb3RPSyhJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uLCBJU3RhdHVzIHN0YXR1cykgewotCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfTk9USUZJQ0FUSU9OKSB7Ci0JCQlUcmFjaW5nLnByaW50VHJhY2UoIk9QRVJBVElPTkhJU1RPUlkiLCAiT1BFUkFUSU9OX05PVF9PSyAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIG9wZXJhdGlvbik7Ci0JCX0KLQotCQlub3RpZnlMaXN0ZW5lcnMobmV3IE9wZXJhdGlvbkhpc3RvcnlFdmVudCgKLQkJCQlPcGVyYXRpb25IaXN0b3J5RXZlbnQuT1BFUkFUSU9OX05PVF9PSywgdGhpcywgb3BlcmF0aW9uLCBzdGF0dXMpKTsKLQl9Ci0KLQkvKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgdGhhdCBhbiBvcGVyYXRpb24gd2FzIHJlZG9uZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5UmVkb25lKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKERFQlVHX09QRVJBVElPTl9ISVNUT1JZX05PVElGSUNBVElPTikgewotCQkJVHJhY2luZy5wcmludFRyYWNlKCJPUEVSQVRJT05ISVNUT1JZIiwgIlJFRE9ORSAiICsgb3BlcmF0aW9uKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlub3RpZnlMaXN0ZW5lcnMobmV3IE9wZXJhdGlvbkhpc3RvcnlFdmVudChPcGVyYXRpb25IaXN0b3J5RXZlbnQuUkVET05FLAotCQkJCXRoaXMsIG9wZXJhdGlvbikpOwotCX0KLQotCS8qCi0JICogTm90aWZ5IGxpc3RlbmVycyB0aGF0IGFuIG9wZXJhdGlvbiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGhpc3RvcnkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVJlbW92ZWQoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfTk9USUZJQ0FUSU9OKSB7Ci0JCQlUcmFjaW5nLnByaW50VHJhY2UoIk9QRVJBVElPTkhJU1RPUlkiLCAiT1BFUkFUSU9OX1JFTU9WRUQgIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyBvcGVyYXRpb24pOwotCQl9Ci0KLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBPcGVyYXRpb25IaXN0b3J5RXZlbnQoCi0JCQkJT3BlcmF0aW9uSGlzdG9yeUV2ZW50Lk9QRVJBVElPTl9SRU1PVkVELCB0aGlzLCBvcGVyYXRpb24pKTsKLQl9Ci0KLQkvKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgdGhhdCBhbiBvcGVyYXRpb24gaGFzIGJlZW4gdW5kb25lLgotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlVbmRvbmUoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfTk9USUZJQ0FUSU9OKSB7Ci0JCQlUcmFjaW5nLnByaW50VHJhY2UoIk9QRVJBVElPTkhJU1RPUlkiLCAiVU5ET05FICIgKyBvcGVyYXRpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCW5vdGlmeUxpc3RlbmVycyhuZXcgT3BlcmF0aW9uSGlzdG9yeUV2ZW50KE9wZXJhdGlvbkhpc3RvcnlFdmVudC5VTkRPTkUsCi0JCQkJdGhpcywgb3BlcmF0aW9uKSk7Ci0JfQotCi0JLyoKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIHRoYXQgYW4gb3BlcmF0aW9uIGhhcyBiZWVuIHVuZG9uZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5Q2hhbmdlZChJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChERUJVR19PUEVSQVRJT05fSElTVE9SWV9OT1RJRklDQVRJT04pIHsKLQkJCVRyYWNpbmcucHJpbnRUcmFjZSgiT1BFUkFUSU9OSElTVE9SWSIsICJPUEVSQVRJT05fQ0hBTkdFRCAiICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCQkrIG9wZXJhdGlvbik7Ci0JCX0KLQotCQlub3RpZnlMaXN0ZW5lcnMobmV3IE9wZXJhdGlvbkhpc3RvcnlFdmVudCgKLQkJCQlPcGVyYXRpb25IaXN0b3J5RXZlbnQuT1BFUkFUSU9OX0NIQU5HRUQsIHRoaXMsIG9wZXJhdGlvbikpOwotCX0KLQotCS8qCi0JICogQSBoaXN0b3J5IG5vdGlmaWNhdGlvbiBpcyBhYm91dCB0byBiZSBzZW50LiBOb3RpZnkgdGhlIG9wZXJhdGlvbiBiZWZvcmUKLQkgKiBoYW5kIGlmIGl0IGltcGxlbWVudHMgSUhpc3RvcnlOb3RpZmljYXRpb25Bd2FyZU9wZXJhdGlvbi4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBmb3IgbGVnYWN5IHVuZG8gZnJhbWV3b3JrcyB0aGF0IHJlbHkgb24KLQkgKiBub3RpZmljYXRpb24gZnJvbSB0aGVpciB1bmRvIG1hbmFnZXJzIGJlZm9yZSBhbnkgbGlzdGVuZXJzIGFyZSBub3RpZmllZAotCSAqIGFib3V0IGNoYW5nZXMgaW4gdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQotCXByaXZhdGUgdm9pZCBwcmVOb3RpZnlPcGVyYXRpb24oSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbiwKLQkJCU9wZXJhdGlvbkhpc3RvcnlFdmVudCBldmVudCkgewotCi0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJQWR2YW5jZWRVbmRvYWJsZU9wZXJhdGlvbikgewotCQkJdHJ5IHsKLQkJCQkoKElBZHZhbmNlZFVuZG9hYmxlT3BlcmF0aW9uKSBvcGVyYXRpb24pLmFib3V0VG9Ob3RpZnkoZXZlbnQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQloYW5kbGVOb3RpZmljYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGlzdG9yeSNyZWRvKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVVuZG9Db250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoY29udGV4dCk7Ci0JCUlVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24gPSBnZXRSZWRvT3BlcmF0aW9uKGNvbnRleHQpOwotCi0JCS8vIGluZm8gaWYgdGhlcmUgaXMgbm8gb3BlcmF0aW9uCi0JCWlmIChvcGVyYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBJT3BlcmF0aW9uSGlzdG9yeS5OT1RISU5HX1RPX1JFRE9fU1RBVFVTOwotCi0JCS8vIGVycm9yIGlmIG9wZXJhdGlvbiBpcyBpbnZhbGlkCi0JCWlmICghb3BlcmF0aW9uLmNhblJlZG8oKSkgewotCQkJaWYgKERFQlVHX09QRVJBVElPTl9ISVNUT1JZX1VORVhQRUNURUQpIHsKLQkJCQlUcmFjaW5nLnByaW50VHJhY2UoIk9QRVJBVElPTkhJU1RPUlkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkiUmVkbyBvcGVyYXRpb24gbm90IHZhbGlkIC0gIiArIG9wZXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJcmV0dXJuIElPcGVyYXRpb25IaXN0b3J5Lk9QRVJBVElPTl9JTlZBTElEX1NUQVRVUzsKLQkJfQotCi0JCXJldHVybiBkb1JlZG8obW9uaXRvciwgaW5mbywgb3BlcmF0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGlzdG9yeSNyZWRvT3BlcmF0aW9uKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCi0JcHVibGljIElTdGF0dXMgcmVkb09wZXJhdGlvbihJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChvcGVyYXRpb24pOwotCQlJU3RhdHVzIHN0YXR1czsKLQkJaWYgKG9wZXJhdGlvbi5jYW5SZWRvKCkpIHsKLQkJCXN0YXR1cyA9IGdldFJlZG9BcHByb3ZhbChvcGVyYXRpb24sIGluZm8pOwotCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCQlzdGF0dXMgPSBkb1JlZG8obW9uaXRvciwgaW5mbywgb3BlcmF0aW9uKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChERUJVR19PUEVSQVRJT05fSElTVE9SWV9VTkVYUEVDVEVEKSB7Ci0JCQkJVHJhY2luZy5wcmludFRyYWNlKCJPUEVSQVRJT05ISVNUT1JZIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJIlJlZG8gb3BlcmF0aW9uIG5vdCB2YWxpZCAtICIgKyBvcGVyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXN0YXR1cyA9IElPcGVyYXRpb25IaXN0b3J5Lk9QRVJBVElPTl9JTlZBTElEX1NUQVRVUzsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25IaXN0b3J5I3JlbW92ZU9wZXJhdGlvbkFwcHJvdmVyKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uQXBwcm92ZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlT3BlcmF0aW9uQXBwcm92ZXIoSU9wZXJhdGlvbkFwcHJvdmVyIGFwcHJvdmVyKSB7Ci0JCWFwcHJvdmVycy5yZW1vdmUoYXBwcm92ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25IaXN0b3J5I3JlbW92ZU9wZXJhdGlvbkhpc3RvcnlMaXN0ZW5lcihvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3RvcnlMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVPcGVyYXRpb25IaXN0b3J5TGlzdGVuZXIoCi0JCQlJT3BlcmF0aW9uSGlzdG9yeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25IaXN0b3J5I3JlcGxhY2VPcGVyYXRpb24ob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24gW10pCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZU9wZXJhdGlvbihJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uLAotCQkJSVVuZG9hYmxlT3BlcmF0aW9uW10gcmVwbGFjZW1lbnRzKSB7Ci0JCS8vIGNoZWNrIHRoZSB1bmRvIGhpc3RvcnkgZmlyc3QuCi0JCWJvb2xlYW4gaW5VbmRvID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCAodW5kb1JlZG9IaXN0b3J5TG9jaykgewotCQkJaW50IGluZGV4ID0gdW5kb0xpc3QuaW5kZXhPZihvcGVyYXRpb24pOwotCQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCQlpblVuZG8gPSB0cnVlOwotCQkJCXVuZG9MaXN0LnJlbW92ZShvcGVyYXRpb24pOwotCQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMgYWZ0ZXIgdGhlIGxvY2sgb24gdW5kb0xpc3QgaXMgcmVsZWFzZWQKLQkJCQlBcnJheUxpc3QgYWxsQ29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KHJlcGxhY2VtZW50cy5sZW5ndGgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVwbGFjZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlVbmRvQ29udGV4dFtdIG9wQ29udGV4dHMgPSByZXBsYWNlbWVudHNbaV0uZ2V0Q29udGV4dHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvcENvbnRleHRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlhbGxDb250ZXh0cy5hZGQob3BDb250ZXh0c1tqXSk7Ci0JCQkJCX0KLQkJCQkJdW5kb0xpc3QuYWRkKGluZGV4LCByZXBsYWNlbWVudHNbaV0pOwotCQkJCQkvLyBub3RpZnkgbGlzdGVuZXJzIGFmdGVyIHRoZSBsb2NrIG9uIHRoZSBoaXN0b3J5IGlzCi0JCQkJCS8vIHJlbGVhc2VkCi0JCQkJfQotCQkJCS8vIHJlY2hlY2sgYWxsIHRoZSBsaW1pdHMuIFdlIGRvIHRoaXMgYXQgdGhlIGVuZCBzbyB0aGUgaW5kZXgKLQkJCQkvLyBkb2Vzbid0IGNoYW5nZSBkdXJpbmcgcmVwbGFjZW1lbnQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbENvbnRleHRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlVbmRvQ29udGV4dCBjb250ZXh0ID0gKElVbmRvQ29udGV4dCkgYWxsQ29udGV4dHMuZ2V0KGkpOwotCQkJCQlmb3JjZVVuZG9MaW1pdChjb250ZXh0LCBnZXRMaW1pdChjb250ZXh0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpblVuZG8pIHsKLQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMgb2Ygb3BlcmF0aW9ucyBhZGRlZCBhbmQgcmVtb3ZlZAotCQkJaW50ZXJuYWxSZW1vdmUob3BlcmF0aW9uKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVwbGFjZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbm90aWZ5QWRkKHJlcGxhY2VtZW50c1tpXSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBvcGVyYXRpb24gd2FzIG5vdCBpbiB0aGUgdW5kbyBoaXN0b3J5LiBDaGVjayB0aGUgcmVkbyBoaXN0b3J5LgotCi0JCXN5bmNocm9uaXplZCAodW5kb1JlZG9IaXN0b3J5TG9jaykgewotCQkJaW50IGluZGV4ID0gcmVkb0xpc3QuaW5kZXhPZihvcGVyYXRpb24pOwotCQkJaWYgKGluZGV4ID09IC0xKQotCQkJCXJldHVybjsKLQkJCUFycmF5TGlzdCBhbGxDb250ZXh0cyA9IG5ldyBBcnJheUxpc3QocmVwbGFjZW1lbnRzLmxlbmd0aCk7Ci0JCQlyZWRvTGlzdC5yZW1vdmUob3BlcmF0aW9uKTsKLQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMgYWZ0ZXIgd2UgcmVsZWFzZSB0aGUgbG9jayBvbiByZWRvTGlzdAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJVW5kb0NvbnRleHRbXSBvcENvbnRleHRzID0gcmVwbGFjZW1lbnRzW2ldLmdldENvbnRleHRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvcENvbnRleHRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWFsbENvbnRleHRzLmFkZChvcENvbnRleHRzW2pdKTsKLQkJCQl9Ci0JCQkJcmVkb0xpc3QuYWRkKGluZGV4LCByZXBsYWNlbWVudHNbaV0pOwotCQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMgYWZ0ZXIgd2UgcmVsZWFzZSB0aGUgbG9jayBvbiByZWRvTGlzdAotCQkJfQotCQkJLy8gcmVjaGVjayBhbGwgdGhlIGxpbWl0cy4gV2UgZG8gdGhpcyBhdCB0aGUgZW5kIHNvIHRoZSBpbmRleAotCQkJLy8gZG9lc24ndCBjaGFuZ2UgZHVyaW5nIHJlcGxhY2VtZW50Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbENvbnRleHRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVVuZG9Db250ZXh0IGNvbnRleHQgPSAoSVVuZG9Db250ZXh0KSBhbGxDb250ZXh0cy5nZXQoaSk7Ci0JCQkJZm9yY2VSZWRvTGltaXQoY29udGV4dCwgZ2V0TGltaXQoY29udGV4dCkpOwotCQkJfQotCQl9Ci0JCS8vIHNlbmQgbGlzdGVuZXIgbm90aWZpY2F0aW9ucyBhZnRlciB3ZSByZWxlYXNlIHRoZSBsb2NrIG9uIHRoZSBoaXN0b3J5Ci0JCWludGVybmFsUmVtb3ZlKG9wZXJhdGlvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVwbGFjZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJbm90aWZ5QWRkKHJlcGxhY2VtZW50c1tpXSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3Rvcnkjc2V0TGltaXQob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvQ29udGV4dCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW1pdChJVW5kb0NvbnRleHQgY29udGV4dCwgaW50IGxpbWl0KSB7Ci0JCUFzc2VydC5pc1RydWUobGltaXQgPj0gMCk7Ci0JCS8qCi0JCSAqIFRoZSBsaW1pdCBjaGVja2luZyBtZXRob2RzIGludGVycHJldCBhIG51bGwgY29udGV4dCBhcyBhIGdsb2JhbCBsaW1pdAotCQkgKiB0byBiZSBlbmZvcmNlZC4gV2UgZG8gbm90IHdpc2ggdG8gc3VwcG9ydCBhIGdsb2JhbCBsaW1pdCBpbiB0aGlzCi0JCSAqIGltcGxlbWVudGF0aW9uLCBzbyB3ZSB0aHJvdyBhbiBleGNlcHRpb24gZm9yIGEgbnVsbCBjb250ZXh0LiBUaGUgcmVzdAotCQkgKiBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2FuIGhhbmRsZSBhIG51bGwgY29udGV4dCwgc28gc3ViY2xhc3NlcyBjYW4KLQkJICogb3ZlcnJpZGUgdGhpcyBpZiBhIGdsb2JhbCBsaW1pdCBpcyBkZXNpcmVkLgotCQkgKi8KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZXh0KTsKLQkJbGltaXRzLnB1dChjb250ZXh0LCBuZXcgSW50ZWdlcihsaW1pdCkpOwotCQlmb3JjZVVuZG9MaW1pdChjb250ZXh0LCBsaW1pdCk7Ci0JCWZvcmNlUmVkb0xpbWl0KGNvbnRleHQsIGxpbWl0KTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25IaXN0b3J5I3VuZG8ob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvQ29udGV4dCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgdW5kbyhJVW5kb0NvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZXh0KTsKLQkJSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGdldFVuZG9PcGVyYXRpb24oY29udGV4dCk7Ci0KLQkJLy8gaW5mbyBpZiB0aGVyZSBpcyBubyBvcGVyYXRpb24KLQkJaWYgKG9wZXJhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIElPcGVyYXRpb25IaXN0b3J5Lk5PVEhJTkdfVE9fVU5ET19TVEFUVVM7Ci0KLQkJLy8gZXJyb3IgaWYgb3BlcmF0aW9uIGlzIGludmFsaWQKLQkJaWYgKCFvcGVyYXRpb24uY2FuVW5kbygpKSB7Ci0JCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfVU5FWFBFQ1RFRCkgewotCQkJCVRyYWNpbmcucHJpbnRUcmFjZSgiT1BFUkFUSU9OSElTVE9SWSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSJVbmRvIG9wZXJhdGlvbiBub3QgdmFsaWQgLSAiICsgb3BlcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIElPcGVyYXRpb25IaXN0b3J5Lk9QRVJBVElPTl9JTlZBTElEX1NUQVRVUzsKLQkJfQotCi0JCXJldHVybiBkb1VuZG8obW9uaXRvciwgaW5mbywgb3BlcmF0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGlzdG9yeSN1bmRvT3BlcmF0aW9uKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHVuZG9PcGVyYXRpb24oSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbiwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwob3BlcmF0aW9uKTsKLQkJSVN0YXR1cyBzdGF0dXM7Ci0JCWlmIChvcGVyYXRpb24uY2FuVW5kbygpKSB7Ci0JCQlzdGF0dXMgPSBnZXRVbmRvQXBwcm92YWwob3BlcmF0aW9uLCBpbmZvKTsKLQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJc3RhdHVzID0gZG9VbmRvKG1vbml0b3IsIGluZm8sIG9wZXJhdGlvbik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfVU5FWFBFQ1RFRCkgewotCQkJCVRyYWNpbmcucHJpbnRUcmFjZSgiT1BFUkFUSU9OSElTVE9SWSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSJVbmRvIG9wZXJhdGlvbiBub3QgdmFsaWQgLSAiICsgb3BlcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc3RhdHVzID0gSU9wZXJhdGlvbkhpc3RvcnkuT1BFUkFUSU9OX0lOVkFMSURfU1RBVFVTOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3Rvcnkjb3Blbk9wZXJhdGlvbihvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSUNvbXBvc2l0ZU9wZXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuT3BlcmF0aW9uKElDb21wb3NpdGVPcGVyYXRpb24gb3BlcmF0aW9uLCBpbnQgbW9kZSkgewotCQlzeW5jaHJvbml6ZWQgKG9wZW5Db21wb3NpdGVMb2NrKSB7Ci0JCQlpZiAob3BlbkNvbXBvc2l0ZSAhPSBudWxsICYmIG9wZW5Db21wb3NpdGUgIT0gb3BlcmF0aW9uKSB7Ci0JCQkJLy8gdW5leHBlY3RlZCBuZXN0aW5nIG9mIG9wZXJhdGlvbnMuCi0JCQkJaWYgKERFQlVHX09QRVJBVElPTl9ISVNUT1JZX1VORVhQRUNURUQpIHsKLQkJCQkJVHJhY2luZy5wcmludFRyYWNlKCJPUEVSQVRJT05ISVNUT1JZIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSJPcGVuIG9wZXJhdGlvbiBjYWxsZWQgd2hpbGUgYW5vdGhlciBvcGVyYXRpb24gaXMgb3Blbi4gIG9sZDogIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrIG9wZW5Db21wb3NpdGUgKyAiOyBuZXc6ICAiICsgb3BlcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0JCQkJCQkiQ2Fubm90IG9wZW4gYW4gb3BlcmF0aW9uIHdoaWxlIG9uZSBpcyBhbHJlYWR5IG9wZW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJb3BlbkNvbXBvc2l0ZSA9IG9wZXJhdGlvbjsKLQkJfQotCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfT1BFTk9QRVJBVElPTikgewotCQkJVHJhY2luZy5wcmludFRyYWNlKCJPUEVSQVRJT05ISVNUT1JZIiwgIk9wZW5pbmcgb3BlcmF0aW9uICIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSsgb3BlbkNvbXBvc2l0ZSk7Ci0JCX0KLQotCQlpZiAobW9kZSA9PSBFWEVDVVRFKSB7Ci0JCQlub3RpZnlBYm91dFRvRXhlY3V0ZShvcGVuQ29tcG9zaXRlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25IaXN0b3J5I2Nsb3NlT3BlcmF0aW9uKGJvb2xlYW4sCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlT3BlcmF0aW9uKGJvb2xlYW4gb3BlcmF0aW9uT0ssIGJvb2xlYW4gYWRkVG9IaXN0b3J5LAotCQkJaW50IG1vZGUpIHsKLQkJSUNvbXBvc2l0ZU9wZXJhdGlvbiBlbmRlZENvbXBvc2l0ZSA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkIChvcGVuQ29tcG9zaXRlTG9jaykgewotCQkJaWYgKERFQlVHX09QRVJBVElPTl9ISVNUT1JZX1VORVhQRUNURUQpIHsKLQkJCQlpZiAob3BlbkNvbXBvc2l0ZSA9PSBudWxsKSB7Ci0JCQkJCVRyYWNpbmcucHJpbnRUcmFjZSgiT1BFUkFUSU9OSElTVE9SWSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkiQXR0ZW1wdGVkIHRvIGNsb3NlIG9wZXJhdGlvbiB3aGVuIG5vbmUgd2FzIG9wZW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJLy8gbm90aWZpY2F0aW9ucyB3aWxsIG9jY3VyIG91dHNpZGUgdGhlIHN5bmNob25pemVkIGJsb2NrCi0JCQlpZiAob3BlbkNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKERFQlVHX09QRVJBVElPTl9ISVNUT1JZX09QRU5PUEVSQVRJT04pIHsKLQkJCQkJVHJhY2luZy5wcmludFRyYWNlKCJPUEVSQVRJT05ISVNUT1JZIiwgIkNsb3Npbmcgb3BlcmF0aW9uICIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJKyBvcGVuQ29tcG9zaXRlKTsKLQkJCQl9Ci0JCQkJZW5kZWRDb21wb3NpdGUgPSBvcGVuQ29tcG9zaXRlOwotCQkJCW9wZW5Db21wb3NpdGUgPSBudWxsOwotCQkJfQotCQl9Ci0JCS8vIGFueSBtb2RlIG90aGVyIHRoYW4gRVhFQ1VURSB3YXMgdHJpZ2dlcmVkIGJ5IGEgcmVxdWVzdCB0byB1bmRvIG9yCi0JCS8vIHJlZG8gc29tZXRoaW5nIGFscmVhZHkgaW4gdGhlIGhpc3RvcnksIHNvIHVuZG8gYW5kIHJlZG8KLQkJLy8gbm90aWZpY2F0aW9uIHdpbGwgb2NjdXIgYXQgdGhlIGVuZCBvZiB0aGF0IHNlcXVlbmNlLgotCQlpZiAoZW5kZWRDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJaWYgKG9wZXJhdGlvbk9LKSB7Ci0JCQkJaWYgKG1vZGUgPT0gRVhFQ1VURSkKLQkJCQkJbm90aWZ5RG9uZShlbmRlZENvbXBvc2l0ZSk7Ci0JCQkJaWYgKGFkZFRvSGlzdG9yeSkKLQkJCQkJYWRkKGVuZGVkQ29tcG9zaXRlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1vZGUgPT0gRVhFQ1VURSkKLQkJCQkJbm90aWZ5Tm90T0soZW5kZWRDb21wb3NpdGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3Rvcnkjb3BlcmF0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG9wZXJhdGlvbkNoYW5nZWQoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAodW5kb0xpc3QuY29udGFpbnMob3BlcmF0aW9uKSB8fCByZWRvTGlzdC5jb250YWlucyhvcGVyYXRpb24pKSB7Ci0JCQlub3RpZnlDaGFuZ2VkKG9wZXJhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEhhbmRsZSBhbiBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCB3aGlsZSBzZW5kaW5nIGEgbm90aWZpY2F0aW9uIGFib3V0Ci0JICogc29tZXRoaW5nIGhhcHBlbmluZyBpbiB0aGUgb3BlcmF0aW9uIGhpc3RvcnkuIFdoZW4gbm90aWZpY2F0aW9ucyBmYWlsLAotCSAqIGV4ZWN1dGlvbiBzaG91bGQgY29udGludWUsIGJ1dCB0aGUgZXhjZXB0aW9uIHNob3VsZCBiZSBsb2dnZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKQotCQkJcmV0dXJuOwotCQkvLyBUaGlzIHBsdWctaW4gaXMgaW50ZW5kZWQgdG8gcnVuIHN0YW5kLWFsb25lIG91dHNpZGUgb2YgdGhlCi0JCS8vIHBsYXRmb3JtLCBzbyB3ZSBkbyBub3QgZW1wbG95IHN0YW5kYXJkIHBsYXRmb3JtIGV4Y2VwdGlvbiBsb2dnaW5nLgotCQlpZiAoREVCVUdfT1BFUkFUSU9OX0hJU1RPUllfVU5FWFBFQ1RFRCkgewotCQkJVHJhY2luZy5wcmludFRyYWNlKCJPUEVSQVRJT05ISVNUT1JZIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkiRXhjZXB0aW9uIGR1cmluZyBub3RpZmljYXRpb24gY2FsbGJhY2sgIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL0lBZHZhbmNlZFVuZG9hYmxlT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9JQWR2YW5jZWRVbmRvYWJsZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTZjODBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL0lBZHZhbmNlZFVuZG9hYmxlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIDxwPgotICogSUFkdmFuY2VkVW5kb2FibGVPcGVyYXRpb24gZGVmaW5lcyBhbiBpbnRlcmZhY2UgZm9yIHVuZG9hYmxlIG9wZXJhdGlvbnMgdGhhdAotICogbW9kaWZ5IG9uZSBvciBtb3JlIGVsZW1lbnRzIGluIGEgbW9kZWwgYW5kIGF0dGVtcHQgdG8ga2VlcCBtb2RlbCBsaXN0ZW5lcnMgdXAKLSAqIHRvIGRhdGUgd2l0aCBjaGFuZ2VzIHRoYXQgb2NjdXIgaW4gdGhlIHVuZG8gYW5kIHJlZG8gaGlzdG9yeSBpbnZvbHZpbmcgcGFydGljdWxhcgotICogbW9kZWwgZWxlbWVudHMuICBJdCBhbHNvIGRlZmluZXMgbWV0aG9kcyBmb3IgY29tcHV0aW5nIHRoZSB2YWxpZGl0eSBvZiBhbiBvcGVyYXRpb24KLSAqIGZvciB1bmRvIG9yIHJlZG8gYmVmb3JlIGF0dGVtcHRpbmcgdG8gcGVyZm9ybSB0aGUgdW5kbyBvciByZWRvLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGxlZ2FjeSBmcmFtZXdvcmtzIHRoYXQgYXJlIGFkYXB0aW5nCi0gKiB0aGVpciBvcmlnaW5hbCB1bmRvIGFuZCByZWRvIHN1cHBvcnQgdG8gdGhpcyBmcmFtZXdvcmsuIFRoZSBtZXRob2RzIGluIHRoaXMKLSAqIGludGVyZmFjZSBhbGxvdyBsZWdhY3kgY2xpZW50cyB0byBtYWludGFpbiBmZWF0dXJlcyBub3Qgc3VwcG9ydGVkIGluIHRoZQotICogYmFzaWMgb3BlcmF0aW9ucyBmcmFtZXdvcmsuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBZHZhbmNlZFVuZG9hYmxlT3BlcmF0aW9uIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIEFuIG9wZXJhdGlvbiBoaXN0b3J5IG5vdGlmaWNhdGlvbiBhYm91dCB0aGlzIG9wZXJhdGlvbiBpcyBhYm91dCB0byBiZQotCSAqIHNlbnQgdG8gb3BlcmF0aW9uIGhpc3RvcnkgbGlzdGVuZXJzLiBBbnkgcHJlcGFyYXRpb24gbmVlZGVkIGJlZm9yZQotCSAqIGxpc3RlbmVycyBhcmUgbm90aWZpZWQgYWJvdXQgdGhpcyBvcGVyYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBoZXJlLgotCSAqIAotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGhhcyBiZWVuIGFkZGVkIHRvIHN1cHBvcnQgbGVnYWN5IHVuZG8gZnJhbWV3b3JrcyB0aGF0IGFyZQotCSAqIGFkYXB0aW5nIHRvIElVbmRvYWJsZU9wZXJhdGlvbi4gT3BlcmF0aW9ucyB0aGF0IHByZXZpb3VzbHkgcmVsaWVkIG9uCi0JICogbm90aWZpY2F0aW9uIGZyb20gdGhlaXIgY29udGFpbmluZyBoaXN0b3J5IG9yIHN0YWNrIGJlZm9yZSBhbnkgbGlzdGVuZXJzCi0JICogYXJlIG5vdGlmaWVkIGFib3V0IGNoYW5nZXMgdG8gdGhlIG9wZXJhdGlvbiBzaG91bGQgaW1wbGVtZW50IHRoaXMKLQkgKiBpbnRlcmZhY2UuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IAotCSAqICAgICAgICAgICAgdGhlIGV2ZW50IHRoYXQgaXMgYWJvdXQgdG8gYmUgc2VudCB3aXRoIHRoZSBwZW5kaW5nCi0JICogICAgICAgICAgICBub3RpZmljYXRpb24KLQkgKiAKLQkgKi8KLQl2b2lkIGFib3V0VG9Ob3RpZnkoT3BlcmF0aW9uSGlzdG9yeUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBvYmplY3RzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IGV4ZWN1dGluZywgdW5kb2luZywgb3IKLQkgKiByZWRvaW5nIHRoaXMgb3BlcmF0aW9uLiBJZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB3aGljaCBvYmplY3RzIGFyZQotCSAqIGFmZmVjdGVkLCByZXR1cm4gbnVsbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgT2JqZWN0cyBtb2RpZmllZCBieSB0aGlzIG9wZXJhdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhZmZlY3RlZCBvYmplY3RzIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgotCSAqLwotCU9iamVjdFtdIGdldEFmZmVjdGVkT2JqZWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RhdHVzIGluZGljYXRpbmcgdGhlIHByb2plY3RlZCBvdXRjb21lIG9mIHVuZG9pbmcgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIHJlcG9ydCB0aGUgcG9zc2libGUgb3V0Y29tZSBvZiBhbiB1bmRvIGFuZAotCSAqIGlzIHVzZWQgd2hlbiBjb21wdXRpbmcgdGhlIHZhbGlkaXR5IG9mIGFuIHVuZG8gaXMgdG9vIGV4cGVuc2l2ZSB0bwotCSAqIHBlcmZvcm0gaW4ge0BsaW5rIElVbmRvYWJsZU9wZXJhdGlvbiNjYW5VbmRvKCl9LiBJdCBpcyBub3QgY2FsbGVkIGJ5IHRoZQotCSAqIG9wZXJhdGlvbiBoaXN0b3J5LCBidXQgaW5zdGVhZCBpcyB1c2VkIGJ5IGNsaWVudHMgKHN1Y2ggYXMgaW1wbGVtZW50ZXJzCi0JICogb2Yge0BsaW5rIElPcGVyYXRpb25BcHByb3Zlcn0pIHdobyB3aXNoIHRvIHBlcmZvcm0gYWR2YW5jZWQgdmFsaWRhdGlvbiBvZgotCSAqIGFuIG9wZXJhdGlvbiBiZWZvcmUgYXR0ZW1wdGluZyB0byB1bmRvIGl0LgotCSAqIAotCSAqIElmIHRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgdGhlIGRpc2NvdmVyeSB0aGF0IGFuIG9wZXJhdGlvbiBjYW4gaW4KLQkgKiBmYWN0IG5vdCBiZSB1bmRvbmUsIHRoZW4gdGhlIG9wZXJhdGlvbiBpcyBleHBlY3RlZCB0byBjb3JyZWN0bHkgYW5zd2VyCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG9uIHN1YnNlcXVlbnQgY2FsbHMgdG8KLQkgKiB7QGxpbmsgSVVuZG9hYmxlT3BlcmF0aW9uI2NhblVuZG8oKX0uCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHRvIHVzZSBmb3IKLQkgKiAgICAgICAgICAgIHJlcG9ydGluZyBwcm9ncmVzcyB0byB0aGUgdXNlciB3aGlsZSBjb21wdXRpbmcgdGhlIHZhbGlkaXR5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElTdGF0dXMgaW5kaWNhdGluZyB0aGUgdmFsaWRpdHkgb2YgdGhlIHVuZG8uIFRoZSBzdGF0dXMKLQkgKiAgICAgICAgIHNldmVyaXR5IHNob3VsZCBiZSBzZXQgdG8gPGNvZGU+T0s8L2NvZGU+IGlmIHRoZSB1bmRvIGNhbgotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5IGJlIHBlcmZvcm1lZCwgYW5kIDxjb2RlPkVSUk9SPC9jb2RlPiBpZiBpdAotCSAqICAgICAgICAgY2Fubm5vdC4gQW55IG90aGVyIHN0YXR1cyBpcyBhc3N1bWVkIHRvIHJlcHJlc2VudCBhbiBhbWJpZ3VvdXMKLQkgKiAgICAgICAgIHN0YXRlLgotCSAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBjb21wdXRpbmcgdGhlIHZhbGlkaXR5LgotCSAqLwotCUlTdGF0dXMgY29tcHV0ZVVuZG9hYmxlU3RhdHVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdGF0dXMgaW5kaWNhdGluZyB0aGUgcHJvamVjdGVkIG91dGNvbWUgb2YgcmVkb2luZyB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgdG8gcmVwb3J0IHRoZSBwb3NzaWJsZSBvdXRjb21lIG9mIGEgcmVkbyBhbmQKLQkgKiBpcyB1c2VkIHdoZW4gY29tcHV0aW5nIHRoZSB2YWxpZGl0eSBvZiBhIHJlZG8gaXMgdG9vIGV4cGVuc2l2ZSB0byBwZXJmb3JtCi0JICogaW4ge0BsaW5rIElVbmRvYWJsZU9wZXJhdGlvbiNjYW5SZWRvKCl9LiBJdCBpcyBub3QgY2FsbGVkIGJ5IHRoZQotCSAqIG9wZXJhdGlvbiBoaXN0b3J5LCBidXQgaW5zdGVhZCBpcyB1c2VkIGJ5IGNsaWVudHMgKHN1Y2ggYXMgaW1wbGVtZW50ZXJzCi0JICogb2Yge0BsaW5rIElPcGVyYXRpb25BcHByb3Zlcn0pIHdobyB3aXNoIHRvIHBlcmZvcm0gYWR2YW5jZWQgdmFsaWRhdGlvbiBvZgotCSAqIGFuIG9wZXJhdGlvbiBiZWZvcmUgYXR0ZW1wdGluZyB0byByZWRvIGl0LgotCSAqIAotCSAqIElmIHRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgdGhlIGRpc2NvdmVyeSB0aGF0IGFuIG9wZXJhdGlvbiBjYW4gaW4KLQkgKiBmYWN0IG5vdCBiZSByZWRvbmUsIHRoZW4gdGhlIG9wZXJhdGlvbiBpcyBleHBlY3RlZCB0byBjb3JyZWN0bHkgYW5zd2VyCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG9uIHN1YnNlcXVlbnQgY2FsbHMgdG8KLQkgKiB7QGxpbmsgSVVuZG9hYmxlT3BlcmF0aW9uI2NhblJlZG8oKX0uCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHRvIHVzZSBmb3IKLQkgKiAgICAgICAgICAgIHJlcG9ydGluZyBwcm9ncmVzcyB0byB0aGUgdXNlciB3aGlsZSBjb21wdXRpbmcgdGhlIHZhbGlkaXR5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElTdGF0dXMgaW5kaWNhdGluZyB0aGUgdmFsaWRpdHkgb2YgdGhlIHJlZG8uIFRoZSBzdGF0dXMKLQkgKiAgICAgICAgIHNldmVyaXR5IHNob3VsZCBiZSBzZXQgdG8gPGNvZGU+T0s8L2NvZGU+IGlmIHRoZSByZWRvIGNhbgotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5IGJlIHBlcmZvcm1lZCwgYW5kIDxjb2RlPkVSUk9SPC9jb2RlPiBpZiBpdAotCSAqICAgICAgICAgY2Fubm5vdC4gQW55IG90aGVyIHN0YXR1cyBpcyBhc3N1bWVkIHRvIHJlcHJlc2VudCBhbiBhbWJpZ3VvdXMKLQkgKiAgICAgICAgIHN0YXRlLgotCSAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBjb21wdXRpbmcgdGhlIHZhbGlkaXR5LgotCSAqLwotCUlTdGF0dXMgY29tcHV0ZVJlZG9hYmxlU3RhdHVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL0lDb21wb3NpdGVPcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL0lDb21wb3NpdGVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1MzU5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9JQ29tcG9zaXRlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zOwotCi0vKioKLSAqIDxwPgotICogSUNvbXBvc2l0ZU9wZXJhdGlvbiBkZWZpbmVzIGFuIHVuZG9hYmxlIG9wZXJhdGlvbiB0aGF0IGlzIGNvbXBvc2VkIG9mIGNoaWxkCi0gKiBvcGVyYXRpb25zLiBSZXF1ZXN0cyB0byBleGVjdXRlLCB1bmRvLCBvciByZWRvIGEgY29tcG9zaXRlIHJlc3VsdCBpbiB0aGUgdGhlCi0gKiBleGVjdXRpb24sIHVuZG8sIG9yIHJlZG8gb2YgdGhlIGNvbXBvc2l0ZSBhcyBhIHdob2xlLiBTaW1pbGFybHksIGEgcmVxdWVzdCB0byAKLSAqIGRpc3Bvc2UgdGhlIGNvbXBvc2l0ZSBzaG91bGQgcmVzdWx0IGluIGFsbCBjaGlsZCBvcGVyYXRpb25zIGJlaW5nIGRpc3Bvc2VkLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvc2l0ZU9wZXJhdGlvbiBleHRlbmRzIElVbmRvYWJsZU9wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gYXMgYSBjaGlsZCBvZiB0aGlzIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0byBiZSBhZGRlZC4gSWYgdGhlIG9wZXJhdGlvbiBpbnN0YW5jZSBoYXMKLQkgKiAgICAgICAgICAgIGFscmVhZHkgYmVlbiBhZGRlZCwgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQkgKi8KLQl2b2lkIGFkZChJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBmcm9tIHRoaXMgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgY29tcG9zaXRlIG9wZXJhdGlvbiBzaG91bGQgZGlzcG9zZSB0aGUgb3BlcmF0aW9uIGFzIHBhcnQgb2YgcmVtb3ZpbmcKLQkgKiBpdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0byBiZSByZW1vdmVkLiBUaGUgb3BlcmF0aW9uIHNob3VsZCBiZSBkaXNwb3NlZAotCSAqICAgICAgICAgICAgYnkgdGhlIHJlY2VpdmVyLiBUaGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gZWZmZWN0IGlmIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uIGluc3RhbmNlIGlzIG5vdCBhbHJlYWR5IGEgY2hpbGQuCi0JICovCi0Jdm9pZCByZW1vdmUoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9JT3BlcmF0aW9uQXBwcm92ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL0lPcGVyYXRpb25BcHByb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQ0NmY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL0lPcGVyYXRpb25BcHByb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiA8cD4KLSAqIElPcGVyYXRpb25BcHByb3ZlciBkZWZpbmVzIGFuIGludGVyZmFjZSBmb3IgYXBwcm92aW5nIHRoZSB1bmRvIG9yIHJlZG8gb2YgYQotICogcGFydGljdWxhciBvcGVyYXRpb24gd2l0aGluIGFuIG9wZXJhdGlvbiBoaXN0b3J5LiBPcGVyYXRpb25zIHRoYXQgYXJlCi0gKiBjYW5kaWRhdGVzIGZvciB1bmRvIG9yIHJlZG8gaGF2ZSBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFnYWluc3QgdGhlaXIgY3VycmVudAotICogc3RhdGUgYW5kIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGhpc3RvcnkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEJ5IHRoZSB0aW1lIGFuIElPcGVyYXRpb25BcHByb3ZlciBpcyBjb25zdWx0ZWQsIHRoZSB1bmRvIGhhcyBhbHJlYWR5IGJlZW4KLSAqIHJlcXVlc3RlZC4gQXBwcm92ZXJzIHNob3VsZCByZXR1cm4gYW4gPGNvZGU+SVN0YXR1czwvY29kZT4gb2JqZWN0IHdpdGgKLSAqIHNldmVyaXR5IDxjb2RlPk9LPC9jb2RlPiBpZiB0aGUgb3BlcmF0aW9uIHNob3VsZCBwcm9jZWVkLCBhbmQgYW55IG90aGVyCi0gKiBzZXZlcml0eSBpZiBpdCBzaG91bGQgbm90LiBXaGVuIGFuIG9wZXJhdGlvbiBpcyBub3QgYXBwcm92ZWQsIGl0IGlzIGV4cGVjdGVkCi0gKiB0aGF0IHRoZSBvYmplY3Qgbm90IGFsbG93aW5nIHRoZSBvcGVyYXRpb24gaGFzIGFscmVhZHkgY29uc3VsdGVkIHRoZSB1c2VyIGlmCi0gKiBuZWNlc3Nhcnkgb3Igb3RoZXJ3aXNlIHByb3ZpZGVkIGFueSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgYWJvdXQKLSAqIHRoZSBmYWN0IHRoYXQgdGhlIG9wZXJhdGlvbiBpcyBub3QgYXBwcm92ZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIE9wZXJhdGlvbiBhcHByb3ZlcnMgbXVzdCBiZSBwcmVwYXJlZCB0byByZWNlaXZlIHRoZSBhcHByb3ZhbCBtZXNzYWdlcyBmcm9tIGEKLSAqIGJhY2tncm91bmQgdGhyZWFkLiBBbnkgVUkgYWNjZXNzIG9jY3VycmluZyBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgYmUKLSAqIHByb3Blcmx5IHN5bmNocm9uaXplZCB1c2luZyB0aGUgdGVjaG5pcXVlcyBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudCdzIHdpZGdldAotICogbGlicmFyeS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPcGVyYXRpb25BcHByb3ZlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdGF0dXMgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIHNob3VsZCBiZQotCSAqIHJlZG9uZS4gQW55IHN0YXR1cyB0aGF0IGRvZXMgbm90IGhhdmUgc2V2ZXJpdHkgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4KLQkgKiB3aWxsIG5vdCBiZSBhcHByb3ZlZC4gSW1wbGVtZW50ZXJzIHNob3VsZCBub3QgYXNzdW1lIHRoYXQgdGhlIHJlZG8gd2lsbAotCSAqIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBzdGF0dXMgaXMgPGNvZGU+T0s8L2NvZGU+LCBzaW5jZSBvdGhlciBvcGVyYXRpb24KLQkgKiBhcHByb3ZlcnMgbWF5IHZldG8gdGhlIHJlZG8uCi0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbiAKLQkgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gdG8gYmUgcmVkb25lCi0JICogQHBhcmFtIGhpc3RvcnkgCi0JICogICAgICAgICAgICB0aGUgaGlzdG9yeSByZWRvaW5nIHRoZSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gaW5mbyAKLQkgKiAgICAgICAgICAgIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlCi0JICogICAgICAgICAgICBjYWxsZXIgaW4gb3JkZXIgdG8gc3VwcGx5IFVJIGluZm9ybWF0aW9uIGZvciBwcm9tcHRpbmcgdGhlCi0JICogICAgICAgICAgICB1c2VyIGlmIG5lY2Vzc2FyeS4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3QKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlcgotCSAqICAgICAgICAgICAgZm9yIHRoZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbC5jbGFzcy4gRXZlbiBpZiBVSQotCSAqICAgICAgICAgICAgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZAotCSAqICAgICAgICAgICAgbXVzdCBiZSBwcmVwYXJlZCBmb3IgYmVpbmcgY2FsbGVkIGZyb20gYSBiYWNrZ3JvdW5kIHRocmVhZC4KLQkgKiAgICAgICAgICAgIEFueSBVSSBhY2Nlc3MgbXVzdCBiZSBwcm9wZXJseSBzeW5jaHJvbml6ZWQgdXNpbmcgdGhlCi0JICogICAgICAgICAgICB0ZWNobmlxdWVzIHNwZWNpZmllZCBieSB0aGUgY2xpZW50J3Mgd2lkZ2V0IGxpYnJhcnkuCi0JICogQHJldHVybiB0aGUgSVN0YXR1cyBkZXNjcmliaW5nIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBhcHByb3ZlZC4gVGhlCi0JICogICAgICAgICByZWRvIHdpbGwgbm90IHByb2NlZWQgaWYgdGhlIHN0YXR1cyBzZXZlcml0eSBpcyBub3QKLQkgKiAgICAgICAgIDxjb2RlPk9LPC9jb2RlPiwgYW5kIHRoZSBjYWxsZXIgcmVxdWVzdGluZyB0aGUgcmVkbyB3aWxsIGJlCi0JICogICAgICAgICByZXR1cm5lZCB0aGUgc3RhdHVzIHRoYXQgY2F1c2VkIHRoZSByZWplY3Rpb24uIEFueSBvdGhlciBzdGF0dXMKLQkgKiAgICAgICAgIHNldmVyaXRpZXMgd2lsbCBub3QgYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIGhpc3RvcnkuCi0JICovCi0JSVN0YXR1cyBwcm9jZWVkUmVkb2luZyhJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uLAotCQkJSU9wZXJhdGlvbkhpc3RvcnkgaGlzdG9yeSwgSUFkYXB0YWJsZSBpbmZvKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHN0YXR1cyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gc2hvdWxkIGJlCi0JICogdW5kb25lLiBBbnkgc3RhdHVzIHRoYXQgZG9lcyBub3QgaGF2ZSBzZXZlcml0eSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPgotCSAqIHdpbGwgbm90IGJlIGFwcHJvdmVkLiBJbXBsZW1lbnRlcnMgc2hvdWxkIG5vdCBhc3N1bWUgdGhhdCB0aGUgdW5kbyB3aWxsCi0JICogYmUgcGVyZm9ybWVkIHdoZW4gdGhlIHN0YXR1cyBpcyA8Y29kZT5PSzwvY29kZT4sIHNpbmNlIG90aGVyIG9wZXJhdGlvbgotCSAqIGFwcHJvdmVycyBjYW4gdmV0byB0aGUgdW5kby4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uIAotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0byBiZSB1bmRvbmUKLQkgKiBAcGFyYW0gaGlzdG9yeSAKLQkgKiAgICAgICAgICAgIHRoZSBoaXN0b3J5IHVuZG9pbmcgdGhlIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBpbmZvIAotCSAqICAgICAgICAgICAgdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUKLQkgKiAgICAgICAgICAgIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUKLQkgKiAgICAgICAgICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIGl0IHNob3VsZCBtaW5pbWFsbHkgY29udGFpbiBhbiBhZGFwdGVyCi0JICogICAgICAgICAgICBmb3IgdGhlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsLmNsYXNzLiBFdmVuIGlmIFVJCi0JICogICAgICAgICAgICBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCwgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kCi0JICogICAgICAgICAgICBtdXN0IGJlIHByZXBhcmVkIGZvciBiZWluZyBjYWxsZWQgZnJvbSBhIGJhY2tncm91bmQgdGhyZWFkLgotCSAqICAgICAgICAgICAgQW55IFVJIGFjY2VzcyBtdXN0IGJlIHByb3Blcmx5IHN5bmNocm9uaXplZCB1c2luZyB0aGUKLQkgKiAgICAgICAgICAgIHRlY2huaXF1ZXMgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQncyB3aWRnZXQgbGlicmFyeS4KLQkgKiBAcmV0dXJuIHRoZSBJU3RhdHVzIGRlc2NyaWJpbmcgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIGFwcHJvdmVkLiBUaGUKLQkgKiAgICAgICAgIHVuZG8gd2lsbCBub3QgcHJvY2VlZCBpZiB0aGUgc3RhdHVzIHNldmVyaXR5IGlzIG5vdAotCSAqICAgICAgICAgPGNvZGU+T0s8L2NvZGU+LCBhbmQgdGhlIGNhbGxlciByZXF1ZXN0aW5nIHRoZSB1bmRvIHdpbGwgYmUKLQkgKiAgICAgICAgIHJldHVybmVkIHRoZSBzdGF0dXMgdGhhdCBjYXVzZWQgdGhlIHJlamVjdGlvbi4gQW55IG90aGVyIHN0YXR1cwotCSAqICAgICAgICAgc2V2ZXJpdGllcyB3aWxsIG5vdCBiZSBpbnRlcnByZXRlZCBieSB0aGUgaGlzdG9yeS4KLQkgKi8KLQlJU3RhdHVzIHByb2NlZWRVbmRvaW5nKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24sCi0JCQlJT3BlcmF0aW9uSGlzdG9yeSBoaXN0b3J5LCBJQWRhcHRhYmxlIGluZm8pOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9JT3BlcmF0aW9uSGlzdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvSU9wZXJhdGlvbkhpc3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYxNzhiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9JT3BlcmF0aW9uSGlzdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbW1hbmRzLm9wZXJhdGlvbnMuR2xvYmFsVW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogPHA+Ci0gKiBJT3BlcmF0aW9uSGlzdG9yeSB0cmFja3MgYSBoaXN0b3J5IG9mIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgdW5kb25lIG9yCi0gKiByZWRvbmUuIE9wZXJhdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBoaXN0b3J5IG9uY2UgdGhleSBoYXZlIGJlZW4gaW5pdGlhbGx5Ci0gKiBleGVjdXRlZC4gQ2xpZW50cyBtYXkgY2hvb3NlIHdoZXRoZXIgdG8gaGF2ZSB0aGUgb3BlcmF0aW9ucyBoaXN0b3J5IHBlcmZvcm0KLSAqIHRoZSBpbml0aWFsIGV4ZWN1dGlvbiBvciB0byBzaW1wbHkgYWRkIGFuIGFscmVhZHktZXhlY3V0ZWQgb3BlcmF0aW9uIHRvIHRoZQotICogaGlzdG9yeS4KLSAqIDwvcD4KLSAqIDxwPgotICogT25jZSBvcGVyYXRpb25zIGFyZSBhZGRlZCB0byB0aGUgaGlzdG9yeSwgdGhlIG1ldGhvZHMKLSAqIHtAbGluayAjY2FuUmVkbyhJVW5kb0NvbnRleHQpfSBhbmQge0BsaW5rICNjYW5VbmRvKElVbmRvQ29udGV4dCl9IGFyZSB1c2VkIHRvCi0gKiBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhbiBvcGVyYXRpb24gYXZhaWxhYmxlIGZvciB1bmRvIGFuZCByZWRvIGluIGEKLSAqIGdpdmVuIHVuZG8gY29udGV4dC4gVGhlIGNvbnRleHQtYmFzZWQgcHJvdG9jb2wgaW1wbGllcyB0aGF0IHRoZXJlIGlzIG9ubHkgb25lCi0gKiBvcGVyYXRpb24gdGhhdCBjYW4gYmUgdW5kb25lIG9yIHJlZG9uZSBhdCBhIGdpdmVuIHRpbWUgaW4gYSBnaXZlbiBjb250ZXh0LgotICogVGhpcyBpcyB0eXBpY2FsIG9mIGEgbGluZWFyIHVuZG8gbW9kZWwsIHdoZW4gb25seSB0aGUgbW9zdCByZWNlbnRseSBleGVjdXRlZAotICogb3BlcmF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgdW5kby4gV2hlbiB0aGlzIHByb3RvY29sIGlzIHVzZWQsIGEgbGluZWFyIG1vZGVsCi0gKiBpcyBlbmZvcmNlZCBieSB0aGUgaGlzdG9yeS4KLSAqIDwvcD4KLSAqIDxwPgotICogSXQgaXMgdXAgdG8gY2xpZW50cyB0byBkZXRlcm1pbmUgaG93IHRvIG1haW50YWluIGEgaGlzdG9yeSB0aGF0IGlzIGludmFsaWQgb3IKLSAqIHN0YWxlLiBGb3IgZXhhbXBsZSwgd2hlbiB0aGUgbW9zdCByZWNlbnQgb3BlcmF0aW9uIGZvciBhIGNvbnRleHQgY2Fubm90IGJlCi0gKiBwZXJmb3JtZWQsIGNsaWVudHMgbWF5IHdpc2ggdG8gZGlzcG9zZSB0aGUgaGlzdG9yeSBmb3IgdGhhdCBjb250ZXh0LgotICogPC9wPgotICogPHA+Ci0gKiBBZGRpdGlvbmFsIHByb3RvY29sIGFsbG93cyBkaXJlY3QgdW5kbyBhbmQgcmVkbyBvZiBhIHNwZWNpZmllZCBvcGVyYXRpb24sCi0gKiByZWdhcmRsZXNzIG9mIGl0cyBwb3NpdGlvbiBpbiB0aGUgaGlzdG9yeS4gV2hlbiBhIG1vcmUgZmxleGlibGUgdW5kbyBtb2RlbCBpcwotICogc3VwcG9ydGVkLCB0aGVzZSBtZXRob2RzIGNhbiBiZSBpbXBsZW1lbnRlZCB0byB1bmRvIGFuZCByZWRvIGRpcmVjdGx5Ci0gKiBzcGVjaWZpZWQgb3BlcmF0aW9ucy4gSWYgYW4gaW1wbGVtZW50ZXIgb2YgSU9wZXJhdGlvbkhpc3RvcnkgZG9lcyBub3QgYWxsb3cKLSAqIGRpcmVjdCB1bmRvIGFuZCByZWRvLCB0aGVzZSBtZXRob2RzIGNhbiByZXR1cm4gYSBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IGl0IGlzCi0gKiBub3QgYWxsb3dlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogTGlzdGVuZXJzICh7QGxpbmsgSU9wZXJhdGlvbkhpc3RvcnlMaXN0ZW5lcn0pIGNhbiBsaXN0ZW4gZm9yIG5vdGlmaWNhdGlvbnMKLSAqIGFib3V0IGNoYW5nZXMgaW4gdGhlIGhpc3RvcnkgKG9wZXJhdGlvbnMgYWRkZWQgb3IgcmVtb3ZlZCksIGFuZCBmb3IKLSAqIG5vdGlmaWNhdGlvbiBiZWZvcmUgYW5kIGFmdGVyIGFueSBvcGVyYXRpb24gaXMgZXhlY3V0ZWQsIHVuZG9uZSBvciByZWRvbmUuCi0gKiBOb3RpZmljYXRpb24gb2Ygb3BlcmF0aW9uIGV4ZWN1dGlvbiBvbmx5IG9jY3VycyB3aGVuIGNsaWVudHMgZGlyZWN0IHRoZQotICogaGlzdG9yeSB0byBleGVjdXRlIHRoZSBvcGVyYXRpb24uIElmIHRoZSBvcGVyYXRpb24gaXMgYWRkZWQgYWZ0ZXIgaXQgaXMKLSAqIGV4ZWN1dGVkLCB0aGVyZSBjYW4gYmUgbm8gbm90aWZpY2F0aW9uIG9mIGl0cyBleGVjdXRpb24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIHtAbGluayBJT3BlcmF0aW9uQXBwcm92ZXJ9IGRlZmluZXMgYW4gaW50ZXJmYWNlIGZvciBhcHByb3ZpbmcgYW4gdW5kbyBvciByZWRvCi0gKiBiZWZvcmUgaXQgb2NjdXJzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW5qZWN0aW5nIHBvbGljeS1kZWNpc2lvbnMgaW50byB0aGUgdW5kbwotICogbW9kZWwgLSB3aGV0aGVyIGRpcmVjdCB1bmRvIGFuZCByZWRvIGFyZSBzdXBwb3J0ZWQsIG9yIHdhcm5pbmcgdGhlIHVzZXIgYWJvdXQKLSAqIGNlcnRhaW4ga2luZHMgb2Ygb3BlcmF0aW9ucy4gSXQgY2FuIGFsc28gYmUgdXNlZCB3aGVuIGNsaWVudHMgbWFpbnRhaW4gc3RhdGUKLSAqIHJlbGF0ZWQgdG8gYW4gb3BlcmF0aW9uIGFuZCBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIHVuZG8gb3IgcmVkbyB3aWxsCi0gKiBjYXVzZSBhbnkgY29uZmxpY3RzIHdpdGggdGhlaXIgbG9jYWwgc3RhdGUuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uSGlzdG9yeSB7Ci0KLQkvKioKLQkgKiBBbiBvcGVyYXRpb24gaXMgdG8gYmUgb3BlbmVkIG9yIGNsb3NlZCBmb3IgZXhlY3V0aW9uLiAodmFsdWUgaXMgMSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhFQ1VURSA9IDE7Ci0KLQkvKioKLQkgKiBBbiBvcGVyYXRpb24gaXMgdG8gYmUgb3BlbmVkIGZvciB1bmRvLiAodmFsdWUgaXMgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ETyA9IDI7Ci0KLQkvKioKLQkgKiBBbiBvcGVyYXRpb24gaXMgdG8gYmUgb3BlbmVkIGZvciByZWRvLiAodmFsdWUgaXMgMykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVETyA9IDM7Ci0KLQkvKioKLQkgKiBBbiB1bmRvIGNvbnRleHQgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlciB0byB0aGUgZ2xvYmFsIHVuZG8gaGlzdG9yeS4KLQkgKiBUaGlzIGNvbnRleHQgaXMgbm90IGludGVuZGVkIHRvIGJlIGFzc2lnbmVkIHRvIG9wZXJhdGlvbnMuIEluc3RlYWQsIGl0IGlzCi0JICogdXNlZCBmb3IgcXVlcnlpbmcgdGhlIGhpc3Rvcnkgb3IgcGVyZm9ybWluZyBhbiB1bmRvIG9yIHJlZG8gb24gdGhlIGVudGlyZQotCSAqIGhpc3RvcnksIHJlZ2FyZGxlc3Mgb2YgZWFjaCBvcGVyYXRpb24ncyB1bmRvIGNvbnRleHRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVVuZG9Db250ZXh0IEdMT0JBTF9VTkRPX0NPTlRFWFQgPSBuZXcgR2xvYmFsVW5kb0NvbnRleHQoKTsKLQotCS8qKgotCSAqIEFuIG9wZXJhdGlvbiBpbmZvIHN0YXR1cyBkZXNjcmliaW5nIHRoZSBjb25kaXRpb24gdGhhdCB0aGVyZSBpcyBubwotCSAqIGF2YWlsYWJsZSBvcGVyYXRpb24gZm9yIHJlZG8uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIE5PVEhJTkdfVE9fUkVET19TVEFUVVMgPSBuZXcgT3BlcmF0aW9uU3RhdHVzKAotCQkJSVN0YXR1cy5JTkZPLCBPcGVyYXRpb25TdGF0dXMuREVGQVVMVF9QTFVHSU5fSUQsCi0JCQlPcGVyYXRpb25TdGF0dXMuTk9USElOR19UT19SRURPLCAiTm8gb3BlcmF0aW9uIHRvIHJlZG8iLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3BlcmF0aW9uIGluZm8gc3RhdHVzIGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbiB0aGF0IHRoZXJlIGlzIG5vCi0JICogYXZhaWxhYmxlIG9wZXJhdGlvbiBmb3IgdW5kby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgTk9USElOR19UT19VTkRPX1NUQVRVUyA9IG5ldyBPcGVyYXRpb25TdGF0dXMoCi0JCQlJU3RhdHVzLklORk8sIE9wZXJhdGlvblN0YXR1cy5ERUZBVUxUX1BMVUdJTl9JRCwKLQkJCU9wZXJhdGlvblN0YXR1cy5OT1RISU5HX1RPX1VORE8sICJObyBvcGVyYXRpb24gdG8gdW5kbyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcGVyYXRpb24gZXJyb3Igc3RhdHVzIGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBvcGVyYXRpb24KLQkgKiBhdmFpbGFibGUgZm9yIGV4ZWN1dGlvbiwgdW5kbyBvciByZWRvIGlzIG5vdCBpbiBhIHZhbGlkIHN0YXRlIGZvciB0aGUKLQkgKiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN0YXR1cyBPUEVSQVRJT05fSU5WQUxJRF9TVEFUVVMgPSBuZXcgT3BlcmF0aW9uU3RhdHVzKAotCQkJSVN0YXR1cy5FUlJPUiwgT3BlcmF0aW9uU3RhdHVzLkRFRkFVTFRfUExVR0lOX0lELAotCQkJT3BlcmF0aW9uU3RhdHVzLk9QRVJBVElPTl9JTlZBTElELCAiT3BlcmF0aW9uIGlzIG5vdCB2YWxpZCIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gdG8gdGhlIGhpc3Rvcnkgd2l0aG91dCBleGVjdXRpbmcgaXQuIFRoZQotCSAqIG9wZXJhdGlvbiBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgYnkgdGhlIHRpbWUgaXQgaXMgYWRkZWQgdG8KLQkgKiB0aGUgaGlzdG9yeS4gTGlzdGVuZXJzIHdpbGwgYmUgbm90aWZpZWQgdGhhdCB0aGUgb3BlcmF0aW9uIHdhcyBhZGRlZCB0bwotCSAqIHRoZSBoaXN0b3J5ICg8Y29kZT5PUEVSQVRJT05fQURERUQ8L2NvZGU+KS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0byBiZSBhZGRlZCB0byB0aGUgaGlzdG9yeQotCSAqLwotCXZvaWQgYWRkKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24pOwotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkIHRoZSBzcGVjaWZpZWQgYXBwcm92ZXIgdG8gdGhlIGxpc3Qgb2Ygb3BlcmF0aW9uIGFwcHJvdmVycyBjb25zdWx0ZWQKLQkgKiBieSB0aGUgb3BlcmF0aW9uIGhpc3RvcnkgYmVmb3JlIGFuIHVuZG8gb3IgcmVkbyBpcyBhbGxvd2VkIHRvIHByb2NlZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhcHByb3ZlcgotCSAqICAgICAgICAgICAgdGhlIElPcGVyYXRpb25BcHByb3ZlciB0byBiZSBhZGRlZCBhcyBhbiBhcHByb3Zlci50aGUgaW5zdGFuY2UKLQkgKiAgICAgICAgICAgIHRvIHJlbW92ZS4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uIElmIGFuIGF0dGVtcHQgaXMKLQkgKiAgICAgICAgICAgIG1hZGUgdG8gcmVnaXN0ZXIgYW4gaW5zdGFuY2Ugd2hpY2ggaXMgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIHRoaXMgaW5zdGFuY2UsIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkFwcHJvdmVyCi0JICovCi0Jdm9pZCBhZGRPcGVyYXRpb25BcHByb3ZlcihJT3BlcmF0aW9uQXBwcm92ZXIgYXBwcm92ZXIpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgdG8gdGhlIGxpc3Qgb2Ygb3BlcmF0aW9uIGhpc3RvcnkgbGlzdGVuZXJzCi0JICogdGhhdCBhcmUgbm90aWZpZWQgYWJvdXQgY2hhbmdlcyBpbiB0aGUgaGlzdG9yeSBvciBvcGVyYXRpb25zIHRoYXQgYXJlCi0JICogZXhlY3V0ZWQsIHVuZG9uZSwgb3IgcmVkb25lLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBJT3BlcmF0aW9uSGlzdG9yeUxpc3RlbmVyIHRvIGJlIGFkZGVkIGFzIGEgbGlzdGVuZXIuIE11c3QKLQkgKiAgICAgICAgICAgIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHJlZ2lzdGVyCi0JICogICAgICAgICAgICBhbiBpbnN0YW5jZSB3aGljaCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGluc3RhbmNlLCB0aGlzCi0JICogICAgICAgICAgICBtZXRob2QgaGFzIG5vIGVmZmVjdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGlzdG9yeUxpc3RlbmVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUV2ZW50Ci0JICovCi0Jdm9pZCBhZGRPcGVyYXRpb25IaXN0b3J5TGlzdGVuZXIoSU9wZXJhdGlvbkhpc3RvcnlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDbG9zZSB0aGUgY3VycmVudCBvcGVyYXRpb24uIElmIHRoZSBvcGVyYXRpb24gaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQsCi0JICogc2VuZCBsaXN0ZW5lcnMgYSA8Y29kZT5ET05FPC9jb2RlPiwgPGNvZGU+VU5ET05FPC9jb2RlPiwgb3IKLQkgKiA8Y29kZT5SRURPTkU8L2NvZGU+IG5vdGlmaWNhdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBtb2RlLiBPdGhlcndpc2Ugc2VuZAotCSAqIGFuIDxjb2RlPk9QRVJBVElPTl9OT1RfT0s8L2NvZGU+IG5vdGlmaWNhdGlvbi4gQWRkIHRoZSBvcGVyYXRpb24gdG8gdGhlCi0JICogaGlzdG9yeSBpZiBzcGVjaWZpZWQgYW5kIHNlbmQgYW4gPGNvZGU+T1BFUkFUSU9OX0FEREVEPC9jb2RlPgotCSAqIG5vdGlmaWNhdGlvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW55IG9wZXJhdGlvbnMgdGhhdCBhcmUgZXhlY3V0ZWQgYW5kIGFkZGVkIGFmdGVyIHRoaXMgb3BlcmF0aW9uIGlzIGNsb3NlZAotCSAqIHdpbGwgbm8gbG9uZ2VyIGJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGlzIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiB0aGUgY2FsbGVyIGhhcyBub3QgcHJldmlvdXNseSBjYWxsZWQKLQkgKiB7QGxpbmsgI29wZW5PcGVyYXRpb259LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uT0sKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KLQkgKiAgICAgICAgICAgIExpc3RlbmVycyBzaG91bGQgYmUgbm90aWZpZWQgd2l0aCA8Y29kZT5ET05FPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPlVORE9ORTwvY29kZT4sIG9yIDxjb2RlPlJFRE9ORTwvY29kZT4uCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIG9wZXJhdGlvbiBkaWQgbm90IHN1Y2Nlc3NmdWxseQotCSAqICAgICAgICAgICAgY29tcGxldGUuIExpc3RlbmVycyBzaG91bGQgYmUgbm90aWZpZWQgd2l0aAotCSAqICAgICAgICAgICAgPGNvZGU+T1BFUkFUSU9OX05PVF9PSzwvY29kZT4uCi0JICogQHBhcmFtIGFkZFRvSGlzdG9yeQotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgYWRkZWQgdG8gdGhlCi0JICogICAgICAgICAgICBoaXN0b3J5LCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgc2hvdWxkIG5vdC4gSWYgdGhlCi0JICogICAgICAgICAgICA8Y29kZT5vcGVyYXRpb25PSzwvY29kZT4gcGFyYW1ldGVyIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gd2lsbCBuZXZlciBiZSBhZGRlZCB0byB0aGUgaGlzdG9yeS4KLQkgKiBAcGFyYW0gbW9kZQotCSAqICAgICAgICAgICAgdGhlIG1vZGUgdGhlIG9wZXJhdGlvbiB3YXMgb3BlbmVkIGluLiBDYW4gYmUgb25lIG9mCi0JICogICAgICAgICAgICA8Y29kZT5FWEVDVVRFPC9jb2RlPiwgPGNvZGU+VU5ETzwvY29kZT4sIG9yCi0JICogICAgICAgICAgICA8Y29kZT5SRURPPC9jb2RlPi4gVGhpcyBkZXRlcm1pbmVzIHdoYXQgbm90aWZpY2F0aW9ucyBhcmUKLQkgKiAgICAgICAgICAgIHNlbnQuCi0JICovCi0Jdm9pZCBjbG9zZU9wZXJhdGlvbihib29sZWFuIG9wZXJhdGlvbk9LLCBib29sZWFuIGFkZFRvSGlzdG9yeSwgaW50IG1vZGUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgaXMgYSB2YWxpZCByZWRvYWJsZSBvcGVyYXRpb24gYXZhaWxhYmxlIGluIHRoZSBnaXZlbgotCSAqIGNvbnRleHQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhIHJlZG9hYmxlIG9wZXJhdGlvbiwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0KLQlib29sZWFuIGNhblJlZG8oSVVuZG9Db250ZXh0IGNvbnRleHQpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgaXMgYSB2YWxpZCB1bmRvYWJsZSBvcGVyYXRpb24gYXZhaWxhYmxlIGluIHRoZSBnaXZlbgotCSAqIGNvbnRleHQKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHRvIGJlIGNoZWNrZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGFuIHVuZG9hYmxlIG9wZXJhdGlvbiwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JYm9vbGVhbiBjYW5VbmRvKElVbmRvQ29udGV4dCBjb250ZXh0KTsKLQotCS8qKgotCSAqIDxwPgotCSAqIERpc3Bvc2Ugb2YgdGhlIHNwZWNpZmllZCBjb250ZXh0IGluIHRoZSBoaXN0b3J5LiBBbGwgb3BlcmF0aW9ucyB0aGF0IGhhdmUKLQkgKiBvbmx5IHRoZSBnaXZlbiBjb250ZXh0IHdpbGwgYmUgZGlzcG9zZWQuIFJlZmVyZW5jZXMgdG8gdGhlIGNvbnRleHQgaW4KLQkgKiBvcGVyYXRpb25zIHRoYXQgaGF2ZSBtb3JlIHRoYW4gb25lIGNvbnRleHQgd2lsbCBhbHNvIGJlIHJlbW92ZWQuIEEKLQkgKiBoaXN0b3J5IG5vdGlmaWNhdGlvbiBmb3IgdGhlIHJlbW92YWwgb2YgZWFjaCBvcGVyYXRpb24gYmVpbmcgZGlzcG9zZWQKLQkgKiB3aWxsIGJlIHNlbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0byBiZSBkaXNwb3NlZAotCSAqIEBwYXJhbSBmbHVzaFVuZG8KLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZXh0IHNob3VsZCBiZSBmbHVzaGVkIGZyb20gdGhlCi0JICogICAgICAgICAgICB1bmRvIGhpc3RvcnksIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBzaG91bGQgbm90Ci0JICogQHBhcmFtIGZsdXNoUmVkbwotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRleHQgc2hvdWxkIGJlIGZsdXNoZWQgZnJvbSB0aGUKLQkgKiAgICAgICAgICAgIHJlZG8gaGlzdG9yeSwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHNob3VsZCBub3QuCi0JICogQHBhcmFtIGZsdXNoQ29udGV4dAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRleHQgaXMgbm8gbG9uZ2VyIGluIHVzZSBhbmQKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gaXQgc2hvdWxkIGJlIGZsdXNoZWQuCi0JICovCi0Jdm9pZCBkaXNwb3NlKElVbmRvQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGZsdXNoVW5kbywgYm9vbGVhbiBmbHVzaFJlZG8sCi0JCQlib29sZWFuIGZsdXNoQ29udGV4dCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGFuZCBhZGQgaXQgdG8gdGhlIG9wZXJhdGlvbnMgaGlzdG9yeSBpZgotCSAqIHN1Y2Nlc3NmdWwuIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgY2xpZW50cyB3aG8gd2lzaCBvcGVyYXRpb24gaGlzdG9yeQotCSAqIGxpc3RlbmVycyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgYmVmb3JlIGFuZCBhZnRlciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotCSAqIG9wZXJhdGlvbi4gTGlzdGVuZXJzIHdpbGwgYmUgbm90aWZpZWQgYmVmb3JlICgKLQkgKiA8Y29kZT5BQk9VVF9UT19FWEVDVVRFPC9jb2RlPikgYW5kIGFmdGVyICg8Y29kZT5ET05FPC9jb2RlPiBvcgotCSAqIDxjb2RlPk9QRVJBVElPTl9OT1RfT0s8L2NvZGU+KS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhlIG9wZXJhdGlvbiBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIGFuIGFkZGl0aW9uYWwgbm90aWZpY2F0aW9uIHRoYXQKLQkgKiB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBoaXN0b3J5ICg8Y29kZT5PUEVSQVRJT05fQURERUQ8L2NvZGU+KQotCSAqIHdpbGwgYmUgc2VudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0byBiZSBleGVjdXRlZCBhbmQgdGhlbiBhZGRlZCB0byB0aGUgaGlzdG9yeQotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byBiZSB1c2VkIChvciA8Y29kZT5udWxsPC9jb2RlPikKLQkgKiAgICAgICAgICAgIGR1cmluZyB0aGUgb3BlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbmZvCi0JICogICAgICAgICAgICB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZQotCSAqICAgICAgICAgICAgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZQotCSAqICAgICAgICAgICAgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIKLQkgKiAgICAgICAgICAgIGZvciB0aGUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwuY2xhc3MuCi0JICogCi0JICogQHJldHVybiB0aGUgSVN0YXR1cyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGV4ZWN1dGlvbiBzdWNjZWVkZWQuCi0JICogCi0JICogPHA+Ci0JICogVGhlIHNldmVyaXR5IGNvZGUgaW4gdGhlIHJldHVybmVkIHN0YXR1cyBkZXNjcmliZXMgd2hldGhlciB0aGUgb3BlcmF0aW9uCi0JICogc3VjY2VlZGVkIGFuZCB3aGV0aGVyIGl0IHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeS4gPGNvZGU+T0s8L2NvZGU+Ci0JICogc2V2ZXJpdHkgaW5kaWNhdGVzIHRoYXQgdGhlIGV4ZWN1dGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGFuZCB0aGF0IHRoZQotCSAqIG9wZXJhdGlvbiBoYXMgYmVlbiBhZGRlZCB0byB0aGUgaGlzdG9yeS4gTGlzdGVuZXJzIHdpbGwgcmVjZWl2ZQotCSAqIG5vdGlmaWNhdGlvbnMgYWJvdXQgdGhlIG9wZXJhdGlvbidzIHN1Y2Nlc3MgKDxjb2RlPkRPTkU8L2NvZGU+KSBhbmQKLQkgKiBhYm91dCB0aGUgb3BlcmF0aW9uIGJlaW5nIGFkZGVkIHRvIHRoZSBoaXN0b3J5ICg8Y29kZT5PUEVSQVRJT05fQURERUQ8L2NvZGU+KS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+Q0FOQ0VMPC9jb2RlPiBzZXZlcml0eSBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBjYW5jZWxsZWQgdGhlCi0JICogb3BlcmF0aW9uIGFuZCB0aGF0IHRoZSBvcGVyYXRpb24gd2FzIG5vdCBhZGRlZCB0byB0aGUgaGlzdG9yeS4KLQkgKiA8Y29kZT5FUlJPUjwvY29kZT4gc2V2ZXJpdHkgaW5kaWNhdGVzIHRoYXQgdGhlIG9wZXJhdGlvbiBkaWQgbm90Ci0JICogc3VjY2Vzc2Z1bGx5IGV4ZWN1dGUgYW5kIHRoYXQgaXQgd2FzIG5vdCBhZGRlZCB0byB0aGUgaGlzdG9yeS4gQW55IG90aGVyCi0JICogc2V2ZXJpdHkgY29kZSBpcyBub3Qgc3BlY2lmaWNhbGx5IGludGVycHJldGVkIGJ5IHRoZSBoaXN0b3J5LCBhbmQgdGhlCi0JICogb3BlcmF0aW9uIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBoaXN0b3J5LiBGb3IgYWxsIHNldmVyaXRpZXMgb3RoZXIgdGhhbgotCSAqIDxjb2RlPk9LPC9jb2RlPiwgbGlzdGVuZXJzIHdpbGwgcmVjZWl2ZSB0aGUKLQkgKiA8Y29kZT5PUEVSQVRJT05fTk9UX09LPC9jb2RlPiBub3RpZmljYXRpb24gaW5zdGVhZCBvZiB0aGUKLQkgKiA8Y29kZT5ET05FPC9jb2RlPiBub3RpZmljYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBleGVjdXRpb24uCi0JICogCi0JICovCi0JSVN0YXR1cyBleGVjdXRlKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybiB0aGUgbGltaXQgb24gdGhlIHVuZG8gYW5kIHJlZG8gaGlzdG9yeSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRleHQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCB3aG9zZSBsaW1pdCBpcyByZXF1ZXN0ZWQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB1bmRvIGFuZCByZWRvIGhpc3RvcnkgbGltaXQgZm9yIHRoZSBzcGVjaWZpZWQgY29udGV4dC4KLQkgKi8KLQlpbnQgZ2V0TGltaXQoSVVuZG9Db250ZXh0IGNvbnRleHQpOwotCi0JLyoqCi0JICogPHA+Ci0JICogR2V0IHRoZSBhcnJheSBvZiBvcGVyYXRpb25zIGluIHRoZSByZWRvIGhpc3RvcnkgZm9yIGEgdGhlIHNwZWNpZmllZCB1bmRvCi0JICogY29udGV4dC4gVGhlIG9wZXJhdGlvbnMgYXJlIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBhZGRlZCB0byB0aGUKLQkgKiBoaXN0b3J5LCB3aXRoIHRoZSBtb3N0IHJlY2VudGx5IHVuZG9uZSBvcGVyYXRpb24gYXBwZWFyaW5nIGxhc3QgaW4gdGhlCi0JICogYXJyYXkuIFRoaXMgaGlzdG9yeSBpcyB1c2VkIExJRk8gKGxhc3QgaW4sIGZpcnN0IG91dCkgd2hlbiBzdWNjZXNzaXZlCi0JICogIlJlZG8iIGNvbW1hbmRzIGFyZSBpbnZva2VkLgotCSAqIAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgZm9yIHRoZSByZWRvCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2Ygb3BlcmF0aW9ucyBpbiB0aGUgaGlzdG9yeQotCSAqLwotCUlVbmRvYWJsZU9wZXJhdGlvbltdIGdldFJlZG9IaXN0b3J5KElVbmRvQ29udGV4dCBjb250ZXh0KTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEdldCB0aGUgb3BlcmF0aW9uIHRoYXQgd2lsbCBuZXh0IGJlIHJlZG9uZSBpbiB0aGUgZ2l2ZW4gdW5kbyBjb250ZXh0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgZm9yIHRoZSByZWRvCi0JICogQHJldHVybiB0aGUgb3BlcmF0aW9uIHRvIGJlIHJlZG9uZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgb3BlcmF0aW9uIGF2YWlsYWJsZS4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHJldHVybmVkCi0JICogICAgICAgICBvcGVyYXRpb24gaXMgdmFsaWQgZm9yIHJlZG8uCi0JICovCi0JSVVuZG9hYmxlT3BlcmF0aW9uIGdldFJlZG9PcGVyYXRpb24oSVVuZG9Db250ZXh0IGNvbnRleHQpOwotCi0JLyoqCi0JICogPHA+Ci0JICogR2V0IHRoZSBhcnJheSBvZiBvcGVyYXRpb25zIGluIHRoZSB1bmRvIGhpc3RvcnkgZm9yIHRoZSBzcGVjaWZpZWQgdW5kbwotCSAqIGNvbnRleHQuIFRoZSBvcGVyYXRpb25zIGFyZSBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWRkZWQgdG8gdGhlCi0JICogaGlzdG9yeSwgd2l0aCB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBvcGVyYXRpb24gYXBwZWFyaW5nIGxhc3QgaW4gdGhlCi0JICogYXJyYXkuIFRoaXMgaGlzdG9yeSBpcyB1c2VkIExJRk8gKGxhc3QgaW4sIGZpcnN0IG91dCkgd2hlbiBzdWNjZXNzaXZlCi0JICogIlVuZG8iIGNvbW1hbmRzIGFyZSBpbnZva2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgZm9yIHRoZSB1bmRvCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2Ygb3BlcmF0aW9ucyBpbiB0aGUgaGlzdG9yeQotCSAqLwotCUlVbmRvYWJsZU9wZXJhdGlvbltdIGdldFVuZG9IaXN0b3J5KElVbmRvQ29udGV4dCBjb250ZXh0KTsKLQotCS8qKgotCSAqIDxwPgotCSAqIE9wZW4gdGhpcyBjb21wb3NpdGUgb3BlcmF0aW9uIGFuZCBjb25zaWRlciBpdCBhbiBvcGVyYXRpb24gdGhhdCBjb250YWlucwotCSAqIG90aGVyIHJlbGF0ZWQgb3BlcmF0aW9ucy4gQ29uc2lkZXIgYWxsIG9wZXJhdGlvbnMgdGhhdCBhcmUgc3Vic2VxdWVudGx5Ci0JICogZXhlY3V0ZWQgb3IgYWRkZWQgdG8gYmUgcGFydCBvZiB0aGlzIG9wZXJhdGlvbi4gV2hlbiBhbiBvcGVyYXRpb24gaXMKLQkgKiBvcGVuZWQsIGxpc3RlbmVycyB3aWxsIGltbWVkaWF0ZWx5IHJlY2VpdmUgYSBub3RpZmljYXRpb24gZm9yIHRoZSBvcGVuZWQKLQkgKiBvcGVyYXRpb24uIFRoZSBzcGVjaWZpYyBub3RpZmljYXRpb24gZGVwZW5kcyBvbiB0aGUgbW9kZSBpbiB3aGljaCB0aGUKLQkgKiBvcGVyYXRpb24gaXMgb3BlbmVkICg8Y29kZT5BQk9VVF9UT19FWEVDVVRFPC9jb2RlPiwKLQkgKiA8Y29kZT5BQk9VVF9UT19VTkRPPC9jb2RlPiwgPGNvZGU+QUJPVVRfVE9fUkVETzwvY29kZT4pLgotCSAqIE5vdGlmaWNhdGlvbnMgZm9yIGFueSBvdGhlciBleGVjdXRlIG9yIGFkZCB3aGlsZSB0aGlzIG9wZXJhdGlvbiBpcyBvcGVuCi0JICogd2lsbCBub3Qgb2NjdXIuIEluc3RlYWQsIHRob3NlIG9wZXJhdGlvbnMgd2lsbCBiZSBhZGRlZCB0byB0aGUgY3VycmVudAotCSAqIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBsZWdhY3kgdW5kbyBmcmFtZXdvcmtzIHRoYXQKLQkgKiBkbyBub3QgZXhwZWN0IHJlbGF0ZWQgdW5kbyBvcGVyYXRpb25zIHRvIGFwcGVhciBpbiB0aGUgc2FtZSB1bmRvIGhpc3RvcnkKLQkgKiBhcyB0aGUgdHJpZ2dlcmluZyB1bmRvIG9wZXJhdGlvbi4gV2hlbiBhbiBvcGVyYXRpb24gaXMgb3BlbiwgYW55Ci0JICogc3Vic2VxdWVudCByZXF1ZXN0cyB0byBleGVjdXRlLCBhZGQsIHVuZG8sIG9yIHJlZG8gYW5vdGhlciBvcGVyYXRpb24gd2lsbAotCSAqIHJlc3VsdCBpbiB0aGF0IG9wZXJhdGlvbiBiZWluZyBhZGRlZCB0byB0aGUgb3BlbiBvcGVyYXRpb24uIE9uY2UgdGhlCi0JICogb3BlcmF0aW9uIGlzIGNsb3NlZCwgdGhlIGNvbXBvc2l0ZSB3aWxsIGJlIGNvbnNpZGVyZWQgYW4gYXRvbWljCi0JICogb3BlcmF0aW9uLiBDbGllbnRzIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBjb21wb3NpdGUgZGlyZWN0bHkgKGJ5IGFkZGluZwotCSAqIGFuZCByZW1vdmluZyBjaGlsZHJlbikgd2hpbGUgaXQgaXMgb3Blbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogV2hlbiBhIGNvbXBvc2l0ZSBpcyBvcGVuLCBvcGVyYXRpb25zIHRoYXQgYXJlIGFkZGVkIHRvIHRoZSBoaXN0b3J5IHdpbGwKLQkgKiBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIG9wZW4gb3BlcmF0aW9uIGluc3RlYWQuIE9wZXJhdGlvbnMgdGhhdCBhcmUKLQkgKiBleGVjdXRlZCB3aGlsZSBhIGNvbXBvc2l0ZSBpcyBvcGVuIHdpbGwgZmlyc3QgYmUgZXhlY3V0ZWQgYW5kIHRoZW4gYWRkZWQKLQkgKiB0byB0aGUgY29tcG9zaXRlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBPcGVuIG9wZXJhdGlvbnMgY2Fubm90IGJlIG5lc3RlZC4gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYQotCSAqIGRpZmZlcmVudCBvcGVyYXRpb24gaXMgb3BlbiwgaXQgaXMgcHJlc3VtZWQgdG8gYmUgYW4gYXBwbGljYXRpb24gY29kaW5nCi0JICogZXJyb3IgYW5kIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogICAgICAgICAgICB0aGUgY29tcG9zaXRlIG9wZXJhdGlvbiB0byBiZSBjb25zaWRlcmVkIGFzIHRoZSBwYXJlbnQgZm9yIGFsbAotCSAqICAgICAgICAgICAgc3Vic2VxdWVudCBvcGVyYXRpb25zLgotCSAqIEBwYXJhbSBtb2RlCi0JICogICAgICAgICAgICB0aGUgbW9kZSB0aGUgb3BlcmF0aW9uIGlzIGV4ZWN1dGluZyBpbi4gQ2FuIGJlIG9uZSBvZgotCSAqICAgICAgICAgICAgPGNvZGU+RVhFQ1VURTwvY29kZT4sIDxjb2RlPlVORE88L2NvZGU+LCBvcgotCSAqICAgICAgICAgICAgPGNvZGU+UkVETzwvY29kZT4uIFRoaXMgZGV0ZXJtaW5lcyB3aGF0IG5vdGlmaWNhdGlvbnMgYXJlCi0JICogICAgICAgICAgICBzZW50LgotCSAqLwotCXZvaWQgb3Blbk9wZXJhdGlvbihJQ29tcG9zaXRlT3BlcmF0aW9uIG9wZXJhdGlvbiwgaW50IG1vZGUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIHNwZWNpZmllZCBvcGVyYXRpb24gaGFzIGNoYW5nZWQgaW4gc29tZSB3YXkgc2luY2UgaXQgd2FzIGFkZGVkIHRvIHRoZQotCSAqIG9wZXJhdGlvbiBoaXN0b3J5LiBOb3RpZnkgbGlzdGVuZXJzIHdpdGggYW4gT1BFUkFUSU9OX0NIQU5HRUQgZXZlbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gdGhhdCBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKi8KLQl2b2lkIG9wZXJhdGlvbkNoYW5nZWQoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbik7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBHZXQgdGhlIG9wZXJhdGlvbiB0aGF0IHdpbGwgbmV4dCBiZSB1bmRvbmUgaW4gdGhlIGdpdmVuIHVuZG8gY29udGV4dC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IGZvciB0aGUgdW5kbwotCSAqIEByZXR1cm4gdGhlIG9wZXJhdGlvbiB0byBiZSB1bmRvbmUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIG9wZXJhdGlvbiBhdmFpbGFibGUuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBhdmFpbGFibGUKLQkgKiAgICAgICAgIG9wZXJhdGlvbiBpcyB2YWxpZCBmb3IgdGhlIHVuZG8uCi0JICovCi0JSVVuZG9hYmxlT3BlcmF0aW9uIGdldFVuZG9PcGVyYXRpb24oSVVuZG9Db250ZXh0IGNvbnRleHQpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmVkbyB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgb3BlcmF0aW9uIGluIHRoZSBnaXZlbiBjb250ZXh0Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0byBiZSByZWRvbmUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZCBmb3IgdGhlIHJlZG8sIG9yCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcyBtb25pdG9yIGlzIHByb3ZpZGVkLgotCSAqIEBwYXJhbSBpbmZvCi0JICogICAgICAgICAgICB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZQotCSAqICAgICAgICAgICAgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZQotCSAqICAgICAgICAgICAgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIKLQkgKiAgICAgICAgICAgIGZvciB0aGUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwuY2xhc3MuCi0JICogQHJldHVybiB0aGUgSVN0YXR1cyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlZG8gc3VjY2VlZGVkLgotCSAqIAotCSAqIDxwPgotCSAqIFRoZSBzZXZlcml0eSBjb2RlIGluIHRoZSByZXR1cm5lZCBzdGF0dXMgZGVzY3JpYmVzIHdoZXRoZXIgdGhlIG9wZXJhdGlvbgotCSAqIHN1Y2NlZWRlZCBhbmQgd2hldGhlciBpdCByZW1haW5zIGluIHRoZSBoaXN0b3J5LiA8Y29kZT5PSzwvY29kZT4KLQkgKiBzZXZlcml0eSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVkbyBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuIFRoZSBvcGVyYXRpb24KLQkgKiB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgdW5kbyBoaXN0b3J5LCBwcm92aWRlZCBpdCBjYW4gYmUgdW5kb25lIChhbnN3ZXJzCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gdG8ge0BsaW5rIElVbmRvYWJsZU9wZXJhdGlvbiNjYW5VbmRvKCl9KS4gTGlzdGVuZXJzCi0JICogd2lsbCByZWNlaXZlIHRoZSA8Y29kZT5SRURPTkU8L2NvZGU+IG5vdGlmaWNhdGlvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogT3RoZXIgc2V2ZXJpdHkgY29kZXMgKDxjb2RlPkNBTkNFTDwvY29kZT4sIDxjb2RlPkVSUk9SPC9jb2RlPiwgPGNvZGU+SU5GTzwvY29kZT4sCi0JICogZXRjLikgYXJlIG5vdCBzcGVjaWZpY2FsbHkgaW50ZXJwcmV0ZWQgYnkgdGhlIGhpc3RvcnkuICBUaGUgb3BlcmF0aW9uIHdpbGwgcmVtYWluCi0JICogaW4gdGhlIGhpc3RvcnkgYW5kIHRoZSByZXR1cm5lZCBzdGF0dXMgaXMgc2ltcGx5IHBhc3NlZCBiYWNrIHRvIHRoZQotCSAqIGNhbGxlci4gRm9yIGFsbCBzZXZlcml0aWVzIG90aGVyIHRoYW4gPGNvZGU+T0s8L2NvZGU+LCBsaXN0ZW5lcnMKLQkgKiB3aWxsIHJlY2VpdmUgdGhlIDxjb2RlPk9QRVJBVElPTl9OT1RfT0s8L2NvZGU+IG5vdGlmaWNhdGlvbgotCSAqIGluc3RlYWQgb2YgdGhlIDxjb2RlPlJFRE9ORTwvY29kZT4gbm90aWZpY2F0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgcmVkby4KLQkgKgotCSAqLwotCUlTdGF0dXMgcmVkbyhJVW5kb0NvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmVkbyB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogICAgICAgICAgICB0aGUgb3BlcmF0aW9uIHRvIGJlIHJlZG9uZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byBiZSB1c2VkIGZvciB0aGUgcmVkbywgb3IgY29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgaWYgbm8gcHJvZ3Jlc3MgbW9uaXRvciBpcyBwcm92aWRlZAotCSAqIEBwYXJhbSBpbmZvCi0JICogICAgICAgICAgICB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZQotCSAqICAgICAgICAgICAgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZQotCSAqICAgICAgICAgICAgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LAotCSAqICAgICAgICAgICAgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIgZm9yIHRoZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwuY2xhc3MuCi0JICogCi0JICogQHJldHVybiB0aGUgSVN0YXR1cyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlZG8gc3VjY2VlZGVkLgotCSAqIAotCSAqIDxwPgotCSAqIFRoZSBzZXZlcml0eSBjb2RlIGluIHRoZSByZXR1cm5lZCBzdGF0dXMgZGVzY3JpYmVzIHdoZXRoZXIgdGhlIG9wZXJhdGlvbgotCSAqIHN1Y2NlZWRlZCBhbmQgd2hldGhlciBpdCByZW1haW5zIGluIHRoZSBoaXN0b3J5LiA8Y29kZT5PSzwvY29kZT4KLQkgKiBzZXZlcml0eSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVkbyBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuIFRoZSBvcGVyYXRpb24KLQkgKiB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgdW5kbyBoaXN0b3J5LCBwcm92aWRlZCBpdCBjYW4gYmUgdW5kb25lIChhbnN3ZXJzCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gdG8ge0BsaW5rIElVbmRvYWJsZU9wZXJhdGlvbiNjYW5VbmRvKCl9KS4gTGlzdGVuZXJzCi0JICogd2lsbCByZWNlaXZlIHRoZSA8Y29kZT5SRURPTkU8L2NvZGU+IG5vdGlmaWNhdGlvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogT3RoZXIgc2V2ZXJpdHkgY29kZXMgKDxjb2RlPkNBTkNFTDwvY29kZT4sIDxjb2RlPkVSUk9SPC9jb2RlPiwKLQkgKiA8Y29kZT5JTkZPPC9jb2RlPiwgZXRjLikgYXJlIG5vdCBzcGVjaWZpY2FsbHkgaW50ZXJwcmV0ZWQgYnkgdGhlCi0JICogaGlzdG9yeS4gVGhlIG9wZXJhdGlvbiB3aWxsIHJlbWFpbiBpbiB0aGUgaGlzdG9yeSBhbmQgdGhlIHJldHVybmVkIHN0YXR1cwotCSAqIGlzIHNpbXBseSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyLiBGb3IgYWxsIHNldmVyaXRpZXMgb3RoZXIgdGhhbgotCSAqIDxjb2RlPk9LPC9jb2RlPiwgbGlzdGVuZXJzIHdpbGwgcmVjZWl2ZSB0aGUKLQkgKiA8Y29kZT5PUEVSQVRJT05fTk9UX09LPC9jb2RlPiBub3RpZmljYXRpb24gaW5zdGVhZCBvZiB0aGUKLQkgKiA8Y29kZT5SRURPTkU8L2NvZGU+IG5vdGlmaWNhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIHJlZG8uCi0JICovCi0JSVN0YXR1cyByZWRvT3BlcmF0aW9uKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24sCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gYXBwcm92ZXIgZnJvbSB0aGUgbGlzdCBvZiBvcGVyYXRpb24KLQkgKiBhcHByb3ZlcnMgdGhhdCBhcmUgY29uc3VsdGVkIGJlZm9yZSBhbiBvcGVyYXRpb24gaXMgdW5kb25lIG9yIHJlZG9uZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFwcHJvdmVyCi0JICogICAgICAgICAgICB0aGUgSU9wZXJhdGlvbkFwcHJvdmVyIHRvIGJlIHJlbW92ZWQuIE11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4gSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHJlbW92ZSBhbgotCSAqICAgICAgICAgICAgaW5zdGFuY2Ugd2hpY2ggaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgaW5zdGFuY2UsCi0JICogICAgICAgICAgICB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgotCSAqLwotCXZvaWQgcmVtb3ZlT3BlcmF0aW9uQXBwcm92ZXIoSU9wZXJhdGlvbkFwcHJvdmVyIGFwcHJvdmVyKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGZyb20gdGhlIGxpc3Qgb2Ygb3BlcmF0aW9uIGhpc3RvcnkKLQkgKiBsaXN0ZW5lcnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgVGhlIElPcGVyYXRpb25IaXN0b3J5TGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4gTXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LiBJZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVtb3ZlIGFuCi0JICogICAgICAgICAgICBpbnN0YW5jZSB3aGljaCBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggdGhpcyBpbnN0YW5jZSwKLQkgKiAgICAgICAgICAgIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuCi0JICovCi0Jdm9pZCByZW1vdmVPcGVyYXRpb25IaXN0b3J5TGlzdGVuZXIoSU9wZXJhdGlvbkhpc3RvcnlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXBsYWNlIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGluIHRoZSB1bmRvIG9yIHJlZG8gaGlzdG9yeSB3aXRoIHRoZQotCSAqIHByb3ZpZGVkIGxpc3Qgb2YgcmVwbGFjZW1lbnRzLiBUaGlzIHByb3RvY29sIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gYQotCSAqIGNvbXBvc2l0ZSBpcyBicm9rZW4gdXAgaW50byBpdHMgYXRvbWljIHBhcnRzLiBUaGUgcmVwbGFjZW1lbnRzIHdpbGwgYmUKLQkgKiBpbnNlcnRlZCBzbyB0aGF0IHRoZSBmaXJzdCByZXBsYWNlbWVudCB3aWxsIGJlIHRoZSBmaXJzdCBvZiB0aGUKLQkgKiByZXBsYWNlbWVudHMgdG8gYmUgdW5kb25lIG9yIHJlZG9uZS4gTGlzdGVuZXJzIHdpbGwgYmUgbm90aWZpZWQgYWJvdXQgdGhlCi0JICogcmVtb3ZhbCBvZiB0aGUgcmVwbGFjZWQgZWxlbWVudCBhbmQgdGhlIGFkZGl0aW9uIG9mIGVhY2ggcmVwbGFjZW1lbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiAgICAgICAgICAgIFRoZSBJVW5kb2FibGVPcGVyYXRpb24gdG8gYmUgcmVwbGFjZWQKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRzCi0JICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgSVVuZG9hYmxlT3BlcmF0aW9uIHRvIHJlcGxhY2UgdGhlIGZpcnN0IG9wZXJhdGlvbgotCSAqLwotCXZvaWQgcmVwbGFjZU9wZXJhdGlvbihJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uLAotCQkJSVVuZG9hYmxlT3BlcmF0aW9uW10gcmVwbGFjZW1lbnRzKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFNldCB0aGUgbGltaXQgb24gdGhlIHVuZG8gYW5kIHJlZG8gaGlzdG9yeSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRleHQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCB3aG9zZSBsaW1pdCBpcyBiZWluZyBzZXQuCi0JICogCi0JICogQHBhcmFtIGxpbWl0Ci0JICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3BlcmF0aW9ucyB0aGF0IHNob3VsZCBiZSBrZXB0IGluIHRoZQotCSAqICAgICAgICAgICAgdW5kbyBvciByZWRvIGhpc3RvcnkgZm9yIHRoZSBzcGVjaWZpZWQgY29udGV4dC4gTXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIG5lZ2F0aXZlLgotCSAqLwotCXZvaWQgc2V0TGltaXQoSVVuZG9Db250ZXh0IGNvbnRleHQsIGludCBsaW1pdCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBVbmRvIHRoZSBtb3N0IHJlY2VudGx5IGV4ZWN1dGVkIG9wZXJhdGlvbiBpbiB0aGUgZ2l2ZW4gY29udGV4dAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdG8gYmUgdW5kb25lCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIGJlIHVzZWQgZm9yIHRoZSB1bmRvLCBvcgotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvZ3Jlc3MgbW9uaXRvciBpcyBwcm92aWRlZC4KLQkgKiBAcGFyYW0gaW5mbwotCSAqICAgICAgICAgICAgdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUKLQkgKiAgICAgICAgICAgIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUKLQkgKiAgICAgICAgICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIGl0IHNob3VsZCBtaW5pbWFsbHkgY29udGFpbiBhbiBhZGFwdGVyCi0JICogICAgICAgICAgICBmb3IgdGhlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsLmNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElTdGF0dXMgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB1bmRvIHN1Y2NlZWRlZC4KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGUgc2V2ZXJpdHkgY29kZSBpbiB0aGUgcmV0dXJuZWQgc3RhdHVzIGRlc2NyaWJlcyB3aGV0aGVyIHRoZSBvcGVyYXRpb24KLQkgKiBzdWNjZWVkZWQgYW5kIHdoZXRoZXIgaXQgcmVtYWlucyBpbiB0aGUgaGlzdG9yeS4gPGNvZGU+T0s8L2NvZGU+Ci0JICogc2V2ZXJpdHkgaW5kaWNhdGVzIHRoYXQgdGhlIHVuZG8gb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLiBUaGUgb3BlcmF0aW9uCi0JICogd2lsbCBiZSBwbGFjZWQgb24gdGhlIHJlZG8gaGlzdG9yeSwgcHJvdmlkZWQgaXQgY2FuIGJlIHJlZG9uZSAoYW5zd2VycwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IHRvIHtAbGluayBJVW5kb2FibGVPcGVyYXRpb24jY2FuUmVkbygpfSkuIExpc3RlbmVycwotCSAqIHdpbGwgcmVjZWl2ZSB0aGUgPGNvZGU+VU5ET05FPC9jb2RlPiBub3RpZmljYXRpb24uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE90aGVyIHNldmVyaXR5IGNvZGVzICg8Y29kZT5DQU5DRUw8L2NvZGU+LCA8Y29kZT5FUlJPUjwvY29kZT4sIDxjb2RlPklORk88L2NvZGU+LAotCSAqIGV0Yy4pIGFyZSBub3Qgc3BlY2lmaWNhbGx5IGludGVycHJldGVkIGJ5IHRoZSBoaXN0b3J5LiAgVGhlIG9wZXJhdGlvbiB3aWxsIHJlbWFpbgotCSAqIGluIHRoZSBoaXN0b3J5IGFuZCB0aGUgcmV0dXJuZWQgc3RhdHVzIGlzIHNpbXBseSBwYXNzZWQgYmFjayB0byB0aGUKLQkgKiBjYWxsZXIuIEZvciBhbGwgc2V2ZXJpdGllcyBvdGhlciB0aGFuIDxjb2RlPk9LPC9jb2RlPiwgbGlzdGVuZXJzCi0JICogd2lsbCByZWNlaXZlIHRoZSA8Y29kZT5PUEVSQVRJT05fTk9UX09LPC9jb2RlPiBub3RpZmljYXRpb24KLQkgKiBpbnN0ZWFkIG9mIHRoZSA8Y29kZT5VTkRPTkU8L2NvZGU+IG5vdGlmaWNhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIHVuZG8uCi0JICovCi0KLQlJU3RhdHVzIHVuZG8oSVVuZG9Db250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIDxwPgotCSAqIFVuZG8gdGhlIHNwZWNpZmllZCBvcGVyYXRpb24KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0byBiZSB1bmRvbmUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZCBmb3IgdGhlIHVuZG8sIG9yCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcyBtb25pdG9yIGlzIHByb3ZpZGVkCi0JICogQHBhcmFtIGluZm8KLQkgKiAgICAgICAgICAgIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlCi0JICogICAgICAgICAgICBjYWxsZXIgaW4gb3JkZXIgdG8gc3VwcGx5IFVJIGluZm9ybWF0aW9uIGZvciBwcm9tcHRpbmcgdGhlCi0JICogICAgICAgICAgICB1c2VyIGlmIG5lY2Vzc2FyeS4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3QKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlcgotCSAqICAgICAgICAgICAgZm9yIHRoZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbC5jbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJU3RhdHVzIGluZGljYXRpbmcgd2hldGhlciB0aGUgdW5kbyBzdWNjZWVkZWQuCi0JICogCi0JICogPHA+Ci0JICogVGhlIHNldmVyaXR5IGNvZGUgaW4gdGhlIHJldHVybmVkIHN0YXR1cyBkZXNjcmliZXMgd2hldGhlciB0aGUgb3BlcmF0aW9uCi0JICogc3VjY2VlZGVkIGFuZCB3aGV0aGVyIGl0IHJlbWFpbnMgaW4gdGhlIGhpc3RvcnkuIDxjb2RlPk9LPC9jb2RlPgotCSAqIHNldmVyaXR5IGluZGljYXRlcyB0aGF0IHRoZSB1bmRvIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gVGhlIG9wZXJhdGlvbgotCSAqIHdpbGwgYmUgcGxhY2VkIG9uIHRoZSByZWRvIGhpc3RvcnksIHByb3ZpZGVkIGl0IGNhbiBiZSByZWRvbmUgKGFuc3dlcnMKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiB0byB7QGxpbmsgSVVuZG9hYmxlT3BlcmF0aW9uI2NhblJlZG8oKX0pLiBMaXN0ZW5lcnMKLQkgKiB3aWxsIHJlY2VpdmUgdGhlIDxjb2RlPlVORE9ORTwvY29kZT4gbm90aWZpY2F0aW9uLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBPdGhlciBzZXZlcml0eSBjb2RlcyAoPGNvZGU+Q0FOQ0VMPC9jb2RlPiwgPGNvZGU+RVJST1I8L2NvZGU+LCA8Y29kZT5JTkZPPC9jb2RlPiwKLQkgKiBldGMuKSBhcmUgbm90IHNwZWNpZmljYWxseSBpbnRlcnByZXRlZCBieSB0aGUgaGlzdG9yeS4gIFRoZSBvcGVyYXRpb24gd2lsbCByZW1haW4KLQkgKiBpbiB0aGUgaGlzdG9yeSBhbmQgdGhlIHJldHVybmVkIHN0YXR1cyBpcyBzaW1wbHkgcGFzc2VkIGJhY2sgdG8gdGhlCi0JICogY2FsbGVyLiBGb3IgYWxsIHNldmVyaXRpZXMgb3RoZXIgdGhhbiA8Y29kZT5PSzwvY29kZT4sIGxpc3RlbmVycwotCSAqIHdpbGwgcmVjZWl2ZSB0aGUgPGNvZGU+T1BFUkFUSU9OX05PVF9PSzwvY29kZT4gbm90aWZpY2F0aW9uCi0JICogaW5zdGVhZCBvZiB0aGUgPGNvZGU+VU5ET05FPC9jb2RlPiBub3RpZmljYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyB1bmRvLgotCSAqLwotCUlTdGF0dXMgdW5kb09wZXJhdGlvbihJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9JT3BlcmF0aW9uSGlzdG9yeUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9JT3BlcmF0aW9uSGlzdG9yeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NjUyMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvSU9wZXJhdGlvbkhpc3RvcnlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9uczsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gbGlzdGVuIHRvIG5vdGlmaWNhdGlvbnMgZnJvbSBhbiBJT3BlcmF0aW9uSGlzdG9yeS4KLSAqIFRoZSBzdXBwbGllZCBPcGVyYXRpb25IaXN0b3J5RXZlbnQgZGVzY3JpYmVzIHRoZSBwYXJ0aWN1bGFyIG5vdGlmaWNhdGlvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogT3BlcmF0aW9uIGhpc3RvcnkgbGlzdGVuZXJzIG11c3QgYmUgcHJlcGFyZWQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIGZyb20gYQotICogYmFja2dyb3VuZCB0aHJlYWQuIEFueSBVSSBhY2Nlc3Mgb2NjdXJyaW5nIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCBiZQotICogcHJvcGVybHkgc3luY2hyb25pemVkIHVzaW5nIHRoZSB0ZWNobmlxdWVzIHNwZWNpZmllZCBieSB0aGUgY2xpZW50J3Mgd2lkZ2V0Ci0gKiBsaWJyYXJ5LgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZXJhdGlvbkhpc3RvcnlMaXN0ZW5lciB7Ci0JLyoqCi0JICogU29tZXRoaW5nIG9mIG5vdGUgaGFzIGhhcHBlbmVkIGluIHRoZSBJT3BlcmF0aW9uSGlzdG9yeS4gTGlzdGVuZXJzIHNob3VsZAotCSAqIGNoZWNrIHRoZSBzdXBwbGllZCBldmVudCBmb3IgZGV0YWlscy4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgCi0JICogICAgICAgICAgICB0aGUgT3BlcmF0aW9uSGlzdG9yeUV2ZW50IHRoYXQgZGVzY3JpYmVzIHRoZSBwYXJ0aWN1bGFyCi0JICogICAgICAgICAgICBub3RpZmljYXRpb24uCi0JICovCi0Jdm9pZCBoaXN0b3J5Tm90aWZpY2F0aW9uKE9wZXJhdGlvbkhpc3RvcnlFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL0lVbmRvQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvSVVuZG9Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzBjZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvSVVuZG9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zOwotCi0vKioKLSAqIDxwPgotICogQW4gdW5kbyBjb250ZXh0IGlzIHVzZWQgdG8gInRhZyIgb3BlcmF0aW9ucyBhcyBiZWluZyBhcHBsaWNhYmxlIHRvIGEgY2VydGFpbgotICogY29udGV4dC4gVGhlIHVuZG8gY29udGV4dCBpcyB1c2VkIHRvIGZpbHRlciB0aGUgaGlzdG9yeSBvZiBvcGVyYXRpb25zCi0gKiBhdmFpbGFibGUgZm9yIHVuZG8gb3IgcmVkbyBzbyB0aGF0IG9ubHkgb3BlcmF0aW9ucyBhcHByb3ByaWF0ZSBmb3IgYSBnaXZlbgotICogdW5kbyBjb250ZXh0IGFyZSBzaG93biB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBwcmVzZW50aW5nIHRoYXQgY29udGV4dC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIHNjb3BlIG9mIGFuIHVuZG8gY29udGV4dCBpcyBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0aGF0IGlzIG1ha2luZwotICogdW5kbyBhbmQgcmVkbyBvZiBvcGVyYXRpb25zIGF2YWlsYWJsZS4gVW5kbyBjb250ZXh0cyBtYXkgYmUgcmVsYXRlZCB0bwotICogYXBwbGljYXRpb24gbW9kZWxzLCBvciBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIFVJIG9iamVjdHMgdGhhdCBhcmUgcHJvdmlkaW5nCi0gKiB1bmRvIGFuZCByZWRvIHN1cHBvcnQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEFuIHVuZG8gY29udGV4dCBtYXkgYmUgZGVmaW5lZCBhcyAibWF0Y2hpbmciIGFub3RoZXIgY29udGV4dC4gVGhpcyBhbGxvd3MKLSAqIGFwcGxpY2F0aW9ucyB0byBwcm92aWRlIHNwZWNpYWxpemVkIGltcGxlbWVudGF0aW9ucyBvZiBhbiB1bmRvIGNvbnRleHQgdGhhdAotICogd2lsbCBhcHBlYXIgaW4gdGhlIG9wZXJhdGlvbiBoaXN0b3J5IGZvciB0aGVpciBtYXRjaGluZyBjb250ZXh0LgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJVW5kb0NvbnRleHQgewotCi0JLyoqCi0JICogR2V0IHRoZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgdW5kbyBjb250ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhYmVsIGZvciB0aGUgY29udGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbnRleHQgaXMgY29uc2lkZXJlZCBhIG1hdGNoIGZvciB0aGUKLQkgKiByZWNlaXZpbmcgY29udGV4dC4gV2hlbiBhIGNvbnRleHQgbWF0Y2hlcyBhbm90aGVyIGNvbnRleHQsIG9wZXJhdGlvbnMKLQkgKiB0aGF0IGhhdmUgdGhlIGNvbnRleHQgYXJlIGNvbnNpZGVyZWQgdG8gYWxzbyBoYXZlIHRoZSBtYXRjaGluZyBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0IAotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSByZWNlaXZpbmcgY29udGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWNlaXZpbmcgY29udGV4dCBjYW4gYmUgY29uc2lkZXJlZCBhCi0JICogICAgICAgICBtYXRjaCBmb3IgdGhlIHNwZWNpZmllZCBjb250ZXh0LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0Ci0JICogICAgICAgICBjYW5ub3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJVW5kb0NvbnRleHQgY29udGV4dCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL0lVbmRvYWJsZU9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvSVVuZG9hYmxlT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Y2VjZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvSVVuZG9hYmxlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIDxwPgotICogSVVuZG9hYmxlT3BlcmF0aW9uIGRlZmluZXMgYW4gb3BlcmF0aW9uIHRoYXQgY2FuIGJlIGV4ZWN1dGVkLCB1bmRvbmUsIGFuZAotICogcmVkb25lLiBPcGVyYXRpb25zIHR5cGljYWxseSBoYXZlIGZ1bGx5IGRlZmluZWQgcGFyYW1ldGVycy4gVGhhdCBpcywgdGhleSBhcmUKLSAqIHVzdWFsbHkgY3JlYXRlZCBhZnRlciB0aGUgdXNlciBoYXMgYmVlbiBxdWVyaWVkIGZvciBhbnkgaW5wdXQgbmVlZGVkIHRvCi0gKiBkZWZpbmUgdGhlIG9wZXJhdGlvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogT3BlcmF0aW9ucyBkZXRlcm1pbmUgdGhlaXIgYWJpbGl0eSB0byBleGVjdXRlLCB1bmRvLCBvciByZWRvIGFjY29yZGluZyB0byB0aGUKLSAqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uLiBUaGV5IGRvIG5vdCBtYWtlIGRlY2lzaW9ucyBhYm91dCB0aGVpcgotICogdmFsaWRpdHkgYmFzZWQgb24gd2hlcmUgdGhleSBvY2N1ciBpbiB0aGUgb3BlcmF0aW9uIGhpc3RvcnkuIFRoYXQgaXMgbGVmdCB0bwotICogdGhlIHBhcnRpY3VsYXIgb3BlcmF0aW9uIGhpc3RvcnkuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJVW5kb2FibGVPcGVyYXRpb24gewotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkIHRoZSBzcGVjaWZpZWQgY29udGV4dCB0byB0aGUgb3BlcmF0aW9uLiBJZiBhIGNvbnRleHQgZXF1YWwgdG8gdGhlCi0JICogc3BlY2lmaWVkIGNvbnRleHQgaXMgYWxyZWFkeSBwcmVzZW50LCBkbyBub3QgYWRkIGl0IGFnYWluLiBOb3RlIHRoYXQKLQkgKiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgY29udGV4dCBpcyBhbHJlYWR5IHByZXNlbnQgaXMgYmFzZWQgb24gZXF1YWxpdHksCi0JICogbm90IHdoZXRoZXIgdGhlIGNvbnRleHQgbWF0Y2hlcyAoe0BsaW5rIElVbmRvQ29udGV4dCNtYXRjaGVzKElVbmRvQ29udGV4dCl9KQotCSAqIGFub3RoZXIgY29udGV4dC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHRvIGJlIGFkZGVkCi0JICovCi0Jdm9pZCBhZGRDb250ZXh0KElVbmRvQ29udGV4dCBjb250ZXh0KTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGNhbiBiZSBleGVjdXRlZCBpbiBpdHMgY3VycmVudCBzdGF0ZS4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGNvbXB1dGF0aW9uIGZvciB0aGlzIG1ldGhvZCBtdXN0IGJlIGZhc3QsIGFzIGl0IGlzIGNhbGxlZAotCSAqIGZyZXF1ZW50bHkuIElmIG5lY2Vzc2FyeSwgdGhpcyBtZXRob2QgY2FuIGJlIG9wdGltaXN0aWMgaW4gaXRzCi0JICogY29tcHV0YXRpb24gKHJldHVybmluZyB0cnVlKSBhbmQgbGF0ZXIgcGVyZm9ybSBtb3JlIHRpbWUtY29uc3VtaW5nCi0JICogY29tcHV0YXRpb25zIGR1cmluZyB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBvZiB0aGUgb3BlcmF0aW9uLCByZXR1cm5pbmcgdGhlCi0JICogYXBwcm9wcmlhdGUgc3RhdHVzIGlmIHRoZSBvcGVyYXRpb24gY2Fubm90IGFjdHVhbGx5IGV4ZWN1dGUgYXQgdGhhdCB0aW1lLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gY2FuIGJlIGV4ZWN1dGVkOwotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIGNhbkV4ZWN1dGUoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGNhbiBiZSByZWRvbmUgaW4gaXRzIGN1cnJlbnQgc3RhdGUuCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBjb21wdXRhdGlvbiBmb3IgdGhpcyBtZXRob2QgbXVzdCBiZSBmYXN0LCBhcyBpdCBpcyBjYWxsZWQKLQkgKiBmcmVxdWVudGx5LiBJZiBuZWNlc3NhcnksIHRoaXMgbWV0aG9kIGNhbiBiZSBvcHRpbWlzdGljIGluIGl0cwotCSAqIGNvbXB1dGF0aW9uIChyZXR1cm5pbmcgdHJ1ZSkgYW5kIGxhdGVyIHBlcmZvcm0gbW9yZSB0aW1lLWNvbnN1bWluZwotCSAqIGNvbXB1dGF0aW9ucyBkdXJpbmcgdGhlIGFjdHVhbCByZWRvIG9mIHRoZSBvcGVyYXRpb24sIHJldHVybmluZyB0aGUKLQkgKiBhcHByb3ByaWF0ZSBzdGF0dXMgaWYgdGhlIG9wZXJhdGlvbiBjYW5ub3QgYWN0dWFsbHkgYmUgcmVkb25lIGF0IHRoYXQKLQkgKiB0aW1lLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gY2FuIGJlIHJlZG9uZTsKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JYm9vbGVhbiBjYW5SZWRvKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBjYW4gYmUgdW5kb25lIGluIGl0cyBjdXJyZW50IHN0YXRlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgY29tcHV0YXRpb24gZm9yIHRoaXMgbWV0aG9kIG11c3QgYmUgZmFzdCwgYXMgaXQgaXMgY2FsbGVkCi0JICogZnJlcXVlbnRseS4gSWYgbmVjZXNzYXJ5LCB0aGlzIG1ldGhvZCBjYW4gYmUgb3B0aW1pc3RpYyBpbiBpdHMKLQkgKiBjb21wdXRhdGlvbiAocmV0dXJuaW5nIHRydWUpIGFuZCBsYXRlciBwZXJmb3JtIG1vcmUgdGltZS1jb25zdW1pbmcKLQkgKiBjb21wdXRhdGlvbnMgZHVyaW5nIHRoZSBhY3R1YWwgdW5kbyBvZiB0aGUgb3BlcmF0aW9uLCByZXR1cm5pbmcgdGhlCi0JICogYXBwcm9wcmlhdGUgc3RhdHVzIGlmIHRoZSBvcGVyYXRpb24gY2Fubm90IGFjdHVhbGx5IGJlIHVuZG9uZSBhdCB0aGF0Ci0JICogdGltZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb3BlcmF0aW9uIGNhbiBiZSB1bmRvbmU7Ci0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCWJvb2xlYW4gY2FuVW5kbygpOwotCi0JLyoqCi0JICogRGlzcG9zZSBvZiB0aGUgb3BlcmF0aW9uLiBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBubwotCSAqIGxvbmdlciBrZXB0IGluIHRoZSBoaXN0b3J5LiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBtZXRob2QgdHlwaWNhbGx5Ci0JICogdW5yZWdpc3RlciBhbnkgbGlzdGVuZXJzLgotCSAqIAotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgb3BlcmF0aW9uLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgdGhlIGZpcnN0IHRpbWUKLQkgKiB0aGF0IGFuIG9wZXJhdGlvbiBpcyBleGVjdXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSB0byB1c2UgZm9yCi0JICogICAgICAgICAgICByZXBvcnRpbmcgcHJvZ3Jlc3MgdG8gdGhlIHVzZXIuCi0JICogQHBhcmFtIGluZm8KLQkgKiAgICAgICAgICAgIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlCi0JICogICAgICAgICAgICBjYWxsZXIgaW4gb3JkZXIgdG8gc3VwcGx5IFVJIGluZm9ybWF0aW9uIGZvciBwcm9tcHRpbmcgdGhlCi0JICogICAgICAgICAgICB1c2VyIGlmIG5lY2Vzc2FyeS4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3QKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlcgotCSAqICAgICAgICAgICAgZm9yIHRoZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbC5jbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJU3RhdHVzIG9mIHRoZSBleGVjdXRpb24uIFRoZSBzdGF0dXMgc2V2ZXJpdHkgc2hvdWxkIGJlIHNldAotCSAqICAgICAgICAgdG8gPGNvZGU+T0s8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGFuZAotCSAqICAgICAgICAgPGNvZGU+RVJST1I8L2NvZGU+IGlmIGl0IHdhcyBub3QuIEFueSBvdGhlciBzdGF0dXMgaXMgYXNzdW1lZAotCSAqICAgICAgICAgdG8gcmVwcmVzZW50IGFuIGluY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLgotCSAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBleGVjdXRpb24uCi0JICovCi0JSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYnkgdGhlIG9wZXJhdGlvbiBoaXN0b3J5IGZyb20gaW5zaWRlIGEKLQkgKiBzeW5jaHJvbml6ZWQgYmxvY2suIFRvIGF2b2lkIGRlYWRsb2NrIGNvbmRpdGlvbnMsIGltcGxlbWVudGVycyBvZiB0aGlzCi0JICogbWV0aG9kIG11c3QgYXZvaWQgZGlzcGF0Y2hpbmcgYW5kIHdhaXRpbmcgb24gdGhyZWFkcyB0aGF0IG1vZGlmeSB0aGUKLQkgKiBvcGVyYXRpb24gaGlzdG9yeSBkdXJpbmcgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGNvbnRleHRzCi0JICovCi0JSVVuZG9Db250ZXh0W10gZ2V0Q29udGV4dHMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGFiZWwgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBzaG93IHRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdG8KLQkgKiB0aGUgdXNlci4gVGhpcyBsYWJlbCBpcyB0eXBpY2FsbHkgY29tYmluZWQgd2l0aCB0aGUgY29tbWFuZCBzdHJpbmdzIHNob3duCi0JICogdG8gdGhlIHVzZXIgaW4gIlVuZG8iIGFuZCAiUmVkbyIgdXNlciBpbnRlcmZhY2VzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhYmVsCi0JICovCi0JU3RyaW5nIGdldExhYmVsKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBoYXMgYSBtYXRjaGluZyBjb250ZXh0IGZvciB0aGUgc3BlY2lmaWVkCi0JICogY29udGV4dC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBieSB0aGUgb3BlcmF0aW9uIGhpc3RvcnkgZnJvbSBpbnNpZGUgYQotCSAqIHN5bmNocm9uaXplZCBibG9jay4gVG8gYXZvaWQgZGVhZGxvY2sgY29uZGl0aW9ucywgaW1wbGVtZW50ZXJzIG9mIHRoaXMKLQkgKiBtZXRob2QgbXVzdCBhdm9pZCBkaXNwYXRjaGluZyBhbmQgd2FpdGluZyBvbiB0aHJlYWRzIHRoYXQgbW9kaWZ5IHRoZQotCSAqIG9wZXJhdGlvbiBoaXN0b3J5IGR1cmluZyB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJVW5kb0NvbnRleHQjbWF0Y2hlcyhJVW5kb0NvbnRleHQpCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IGluIHF1ZXN0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGV4dCBpcyBwcmVzZW50LCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIGlmIGl0IGlzIG5vdC4KLQkgKi8KLQlib29sZWFuIGhhc0NvbnRleHQoSVVuZG9Db250ZXh0IGNvbnRleHQpOwotCi0JLyoqCi0JICogUmVkbyB0aGUgb3BlcmF0aW9uLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYW4gb3BlcmF0aW9uCi0JICogaGFzIGJlZW4gdW5kb25lLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHRvIHVzZSBmb3IKLQkgKiAgICAgICAgICAgIHJlcG9ydGluZyBwcm9ncmVzcyB0byB0aGUgdXNlci4KLQkgKiBAcGFyYW0gaW5mbwotCSAqICAgICAgICAgICAgdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUKLQkgKiAgICAgICAgICAgIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUKLQkgKiAgICAgICAgICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIGl0IHNob3VsZCBtaW5pbWFsbHkgY29udGFpbiBhbiBhZGFwdGVyCi0JICogICAgICAgICAgICBmb3IgdGhlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsLmNsYXNzLgotCSAqIEByZXR1cm4gdGhlIElTdGF0dXMgb2YgdGhlIHJlZG8uIFRoZSBzdGF0dXMgc2V2ZXJpdHkgc2hvdWxkIGJlIHNldCB0bwotCSAqICAgICAgICAgPGNvZGU+T0s8L2NvZGU+IGlmIHRoZSByZWRvIHdhcyBzdWNjZXNzZnVsLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPkVSUk9SPC9jb2RlPiBpZiBpdCB3YXMgbm90LiBBbnkgb3RoZXIgc3RhdHVzIGlzIGFzc3VtZWQKLQkgKiAgICAgICAgIHRvIHJlcHJlc2VudCBhbiBpbmNvbXBsZXRpb24gb2YgdGhlIHJlZG8uCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIHJlZG8uCi0JICovCi0KLQlJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY29udGV4dCBmcm9tIHRoZSBvcGVyYXRpb24uIFRoaXMgbWV0aG9kIGhhcyBubwotCSAqIGVmZmVjdCBpZiB0aGUgY29udGV4dCBpcyBub3QgZXF1YWwgdG8gYW5vdGhlciBjb250ZXh0IGluIHRoZSBjb250ZXh0Ci0JICogbGlzdC4gTm90ZSB0aGF0IGRldGVybWluaW5nIHdoZXRoZXIgYSBjb250ZXh0IGlzIHByZXNlbnQgd2hlbiByZW1vdmluZyBpdAotCSAqIGlzIGJhc2VkIG9uIGVxdWFsaXR5LCBub3Qgd2hldGhlciB0aGUgY29udGV4dCBtYXRjaGVzICh7QGxpbmsKLQkgKiBJVW5kb0NvbnRleHQjbWF0Y2hlcyhJVW5kb0NvbnRleHQpfSkgYW5vdGhlciBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0byBiZSByZW1vdmVkCi0JICovCi0Jdm9pZCByZW1vdmVDb250ZXh0KElVbmRvQ29udGV4dCBjb250ZXh0KTsKLQotCS8qKgotCSAqIFVuZG8gdGhlIG9wZXJhdGlvbi4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGFuIG9wZXJhdGlvbgotCSAqIGhhcyBiZWVuIGV4ZWN1dGVkLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHRvIHVzZSBmb3IKLQkgKiAgICAgICAgICAgIHJlcG9ydGluZyBwcm9ncmVzcyB0byB0aGUgdXNlci4KLQkgKiBAcGFyYW0gaW5mbwotCSAqICAgICAgICAgICAgdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUKLQkgKiAgICAgICAgICAgIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUKLQkgKiAgICAgICAgICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIGl0IHNob3VsZCBtaW5pbWFsbHkgY29udGFpbiBhbiBhZGFwdGVyCi0JICogICAgICAgICAgICBmb3IgdGhlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsLmNsYXNzLgotCSAqIEByZXR1cm4gdGhlIElTdGF0dXMgb2YgdGhlIHVuZG8uIFRoZSBzdGF0dXMgc2V2ZXJpdHkgc2hvdWxkIGJlIHNldCB0bwotCSAqICAgICAgICAgPGNvZGU+T0s8L2NvZGU+IGlmIHRoZSByZWRvIHdhcyBzdWNjZXNzZnVsLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPkVSUk9SPC9jb2RlPiBpZiBpdCB3YXMgbm90LiBBbnkgb3RoZXIgc3RhdHVzIGlzIGFzc3VtZWQKLQkgKiAgICAgICAgIHRvIHJlcHJlc2VudCBhbiBpbmNvbXBsZXRpb24gb2YgdGhlIHVuZG8uCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIHVuZG8uCi0JICovCi0JSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvTGluZWFyVW5kb0VuZm9yY2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9MaW5lYXJVbmRvRW5mb3JjZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmMDE4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9MaW5lYXJVbmRvRW5mb3JjZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0vKioKLSAqIDxwPgotICogQW4gb3BlcmF0aW9uIGFwcHJvdmVyIHRoYXQgZW5mb3JjZXMgYSBzdHJpY3QgbGluZWFyIHVuZG8uIEl0IGRvZXMgbm90IGFsbG93Ci0gKiB0aGUgdW5kbyBvciByZWRvIG9mIGFueSBvcGVyYXRpb24gdGhhdCBpcyBub3QgdGhlIGxhdGVzdCBhdmFpbGFibGUgb3BlcmF0aW9uCi0gKiBpbiBhbGwgb2YgaXRzIHVuZG8gY29udGV4dHMuICBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGluZWFyVW5kb0VuZm9yY2VyIGV4dGVuZHMgTGluZWFyVW5kb1Zpb2xhdGlvbkRldGVjdG9yIHsKLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgTGluZWFyVW5kb0VuZm9yY2VyLgotCSAqLwotCXB1YmxpYyBMaW5lYXJVbmRvRW5mb3JjZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gd2hldGhlciBhIGxpbmVhciByZWRvIHZpb2xhdGlvbiBpcyBhbGxvd2FibGUuICBBIGxpbmVhciByZWRvIHZpb2xhdGlvbgotCSAqIGlzIGRlZmluZWQgYXMgYSByZXF1ZXN0IHRvIHJlZG8gYSBwYXJ0aWN1bGFyIG9wZXJhdGlvbiBldmVuIGlmIGl0IGlzIG5vdCB0aGUgbW9zdAotCSAqIHJlY2VudGx5IGFkZGVkIG9wZXJhdGlvbiB0byB0aGUgcmVkbyBoaXN0b3J5LgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIGFsbG93TGluZWFyUmVkb1Zpb2xhdGlvbihJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uLAotCQkJSVVuZG9Db250ZXh0IGNvbnRleHQsIElPcGVyYXRpb25IaXN0b3J5IGhpc3RvcnksIElBZGFwdGFibGUgdWlJbmZvKSB7Ci0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB3aGV0aGVyIGEgbGluZWFyIHVuZG8gdmlvbGF0aW9uIGlzIGFsbG93YWJsZS4gIEEgbGluZWFyIHVuZG8gdmlvbGF0aW9uCi0JICogaXMgZGVmaW5lZCBhcyBhIHJlcXVlc3QgdG8gdW5kbyBhIHBhcnRpY3VsYXIgb3BlcmF0aW9uIGV2ZW4gaWYgaXQgaXMgbm90IHRoZSBtb3N0Ci0JICogcmVjZW50bHkgYWRkZWQgb3BlcmF0aW9uIHRvIHRoZSB1bmRvIGhpc3RvcnkuCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgYWxsb3dMaW5lYXJVbmRvVmlvbGF0aW9uKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24sCi0JCQlJVW5kb0NvbnRleHQgY29udGV4dCwgSU9wZXJhdGlvbkhpc3RvcnkgaGlzdG9yeSwgSUFkYXB0YWJsZSB1aUluZm8pIHsKLQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvTGluZWFyVW5kb1Zpb2xhdGlvbkRldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9MaW5lYXJVbmRvVmlvbGF0aW9uRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwMDBiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9MaW5lYXJVbmRvVmlvbGF0aW9uRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIGFic3RyYWN0IGNsYXNzIGZvciBkZXRlY3RpbmcgdmlvbGF0aW9ucyBpbiBhIHN0cmljdCBsaW5lYXIgdW5kby9yZWRvCi0gKiBtb2RlbC4gT25jZSBhIHZpb2xhdGlvbiBpcyBkZXRlY3RlZCwgc3ViY2xhc3NlcyBpbXBsZW1lbnQgdGhlIHNwZWNpZmljCi0gKiBiZWhhdmlvciBmb3IgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdW5kby9yZWRvIHNob3VsZCBwcm9jZWVkLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaW5lYXJVbmRvVmlvbGF0aW9uRGV0ZWN0b3IgaW1wbGVtZW50cyBJT3BlcmF0aW9uQXBwcm92ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIExpbmVhclVuZG9WaW9sYXRpb25EZXRlY3Rvci4KLQkgKi8KLQlwdWJsaWMgTGluZWFyVW5kb1Zpb2xhdGlvbkRldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0YXR1cyBpbmRpY2F0aW5nIHdoZXRoZXIgYSBsaW5lYXIgcmVkbyB2aW9sYXRpb24gaXMgYWxsb3dhYmxlLgotCSAqIEEgbGluZWFyIHJlZG8gdmlvbGF0aW9uIGlzIGRlZmluZWQgYXMgYSByZXF1ZXN0IHRvIHJlZG8gYSBwYXJ0aWN1bGFyCi0JICogb3BlcmF0aW9uIGV2ZW4gaWYgaXQgaXMgbm90IHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIG9wZXJhdGlvbiB0byB0aGUgcmVkbwotCSAqIGhpc3RvcnkuCi0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiBmb3Igd2hpY2ggYSBsaW5lYXIgcmVkbyB2aW9sYXRpb24gaGFzIGJlZW4KLQkgKiAgICAgICAgICAgIGRldGVjdGVkLgotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgdW5kbyBjb250ZXh0IGluIHdoaWNoIHRoZSBsaW5lYXIgcmVkbyB2aW9sYXRpb24gZXhpc3RzCi0JICogQHBhcmFtIGhpc3RvcnkKLQkgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gaGlzdG9yeSBjb250YWluaW5nIHRoZSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gaW5mbwotCSAqICAgICAgICAgICAgdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUKLQkgKiAgICAgICAgICAgIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUKLQkgKiAgICAgICAgICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIGl0IHNob3VsZCBtaW5pbWFsbHkgY29udGFpbiBhbiBhZGFwdGVyCi0JICogICAgICAgICAgICBmb3IgdGhlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsLmNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElTdGF0dXMgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSByZWRvIHZpb2xhdGlvbiBpcyBhbGxvd2VkLiBUaGUKLQkgKiAgICAgICAgIHJlZG8gd2lsbCBub3QgcHJvY2VlZCBpZiB0aGUgc3RhdHVzIHNldmVyaXR5IGlzIG5vdAotCSAqICAgICAgICAgPGNvZGU+T0s8L2NvZGU+LCBhbmQgdGhlIGNhbGxlciByZXF1ZXN0aW5nIHRoZSByZWRvIHdpbGwgYmUKLQkgKiAgICAgICAgIHJldHVybmVkIHRoZSBzdGF0dXMgdGhhdCBjYXVzZWQgdGhlIHJlamVjdGlvbi4gU3BlY2lmaWMgc3RhdHVzCi0JICogICAgICAgICBzZXZlcml0aWVzIHdpbGwgbm90IGJlIGludGVycHJldGVkIGJ5IHRoZSBoaXN0b3J5LgotCSAqLwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElTdGF0dXMgYWxsb3dMaW5lYXJSZWRvVmlvbGF0aW9uKAotCQkJSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbiwgSVVuZG9Db250ZXh0IGNvbnRleHQsCi0JCQlJT3BlcmF0aW9uSGlzdG9yeSBoaXN0b3J5LCBJQWRhcHRhYmxlIGluZm8pOwotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RhdHVzIGluZGljYXRpbmcgd2hldGhlciBhIGxpbmVhciB1bmRvIHZpb2xhdGlvbiBpcyBhbGxvd2FibGUuCi0JICogQSBsaW5lYXIgdW5kbyB2aW9sYXRpb24gaXMgZGVmaW5lZCBhcyBhIHJlcXVlc3QgdG8gdW5kbyBhIHBhcnRpY3VsYXIKLQkgKiBvcGVyYXRpb24gZXZlbiBpZiBpdCBpcyBub3QgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgb3BlcmF0aW9uIHRvIHRoZSB1bmRvCi0JICogaGlzdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogICAgICAgICAgICB0aGUgb3BlcmF0aW9uIGZvciB3aGljaCBhIGxpbmVhciB1bmRvIHZpb2xhdGlvbiBoYXMgYmVlbgotCSAqICAgICAgICAgICAgZGV0ZWN0ZWQuCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSB1bmRvIGNvbnRleHQgaW4gd2hpY2ggdGhlIGxpbmVhciB1bmRvIHZpb2xhdGlvbiBleGlzdHMKLQkgKiBAcGFyYW0gaGlzdG9yeQotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiBoaXN0b3J5IGNvbnRhaW5pbmcgdGhlIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBpbmZvCi0JICogICAgICAgICAgICB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZQotCSAqICAgICAgICAgICAgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZQotCSAqICAgICAgICAgICAgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIKLQkgKiAgICAgICAgICAgIGZvciB0aGUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwuY2xhc3MuCi0JICogCi0JICogQHJldHVybiB0aGUgSVN0YXR1cyBkZXNjcmliaW5nIHdoZXRoZXIgdGhlIHVuZG8gdmlvbGF0aW9uIGlzIGFsbG93ZWQuIFRoZQotCSAqICAgICAgICAgdW5kbyB3aWxsIG5vdCBwcm9jZWVkIGlmIHRoZSBzdGF0dXMgc2V2ZXJpdHkgaXMgbm90Ci0JICogICAgICAgICA8Y29kZT5PSzwvY29kZT4sIGFuZCB0aGUgY2FsbGVyIHJlcXVlc3RpbmcgdGhlIHVuZG8gd2lsbCBiZQotCSAqICAgICAgICAgcmV0dXJuZWQgdGhlIHN0YXR1cyB0aGF0IGNhdXNlZCB0aGUgcmVqZWN0aW9uLiBTcGVjaWZpYyBzdGF0dXMKLQkgKiAgICAgICAgIHNldmVyaXRpZXMgd2lsbCBub3QgYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIGhpc3RvcnkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElTdGF0dXMgYWxsb3dMaW5lYXJVbmRvVmlvbGF0aW9uKAotCQkJSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbiwgSVVuZG9Db250ZXh0IGNvbnRleHQsCi0JCQlJT3BlcmF0aW9uSGlzdG9yeSBoaXN0b3J5LCBJQWRhcHRhYmxlIGluZm8pOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkFwcHJvdmVyI3Byb2NlZWRSZWRvaW5nKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3RvcnksCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgZmluYWwgSVN0YXR1cyBwcm9jZWVkUmVkb2luZyhJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uLAotCQkJSU9wZXJhdGlvbkhpc3RvcnkgaGlzdG9yeSwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCUlVbmRvQ29udGV4dFtdIGNvbnRleHRzID0gb3BlcmF0aW9uLmdldENvbnRleHRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCUlVbmRvQ29udGV4dCBjb250ZXh0ID0gY29udGV4dHNbaV07Ci0JCQlpZiAoaGlzdG9yeS5nZXRSZWRvT3BlcmF0aW9uKGNvbnRleHQpICE9IG9wZXJhdGlvbikgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gYWxsb3dMaW5lYXJSZWRvVmlvbGF0aW9uKG9wZXJhdGlvbiwgY29udGV4dCwKLQkJCQkJCWhpc3RvcnksIGluZm8pOwotCQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uQXBwcm92ZXIjcHJvY2VlZFVuZG9pbmcob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGlzdG9yeSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCi0JcHVibGljIGZpbmFsIElTdGF0dXMgcHJvY2VlZFVuZG9pbmcoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbiwKLQkJCUlPcGVyYXRpb25IaXN0b3J5IGhpc3RvcnksIElBZGFwdGFibGUgaW5mbykgewotCQlJVW5kb0NvbnRleHRbXSBjb250ZXh0cyA9IG9wZXJhdGlvbi5nZXRDb250ZXh0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVW5kb0NvbnRleHQgY29udGV4dCA9IGNvbnRleHRzW2ldOwotCQkJaWYgKGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihjb250ZXh0KSAhPSBvcGVyYXRpb24pIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGFsbG93TGluZWFyVW5kb1Zpb2xhdGlvbihvcGVyYXRpb24sIGNvbnRleHQsCi0JCQkJCQloaXN0b3J5LCBpbmZvKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvT2JqZWN0VW5kb0NvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL09iamVjdFVuZG9Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTg0ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvT2JqZWN0VW5kb0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIHVuZG8gY29udGV4dCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhbnkgZ2l2ZW4gb2JqZWN0LiBDbGllbnRzCi0gKiBjYW4gYWRkIG1hdGNoaW5nIGNvbnRleHRzIHRvIHRoaXMgY29udGV4dC4gIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZAotICogYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT2JqZWN0VW5kb0NvbnRleHQgZXh0ZW5kcyBVbmRvQ29udGV4dCB7Ci0KLQlwcml2YXRlIE9iamVjdCBvYmplY3Q7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBvcGVyYXRpb24gY29udGV4dCB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBiZSByZXByZXNlbnRlZC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0VW5kb0NvbnRleHQoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzKG9iamVjdCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIG9wZXJhdGlvbiBjb250ZXh0IHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gb2JqZWN0IGFuZCBoYXMgYQotCSAqIHNwZWNpYWxpemVkIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIHJlcHJlc2VudGVkLgotCSAqIEBwYXJhbSBsYWJlbCAKLQkgKiAgICAgICAgICAgIHRoZSBsYWJlbCBmb3IgdGhlIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0VW5kb0NvbnRleHQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9Db250ZXh0I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJaWYgKG9iamVjdCAhPSBudWxsKSAJCi0JCQlyZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0JCXJldHVybiBzdXBlci5nZXRMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoYXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhpcyBjb250ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIGNvbnRleHQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgY29udGV4dCBhcyBhIG1hdGNoIG9mIHRoaXMgY29udGV4dC4gQ29udGV4dHMgYWRkZWQgYXMKLQkgKiBtYXRjaGVzIG9mIHRoaXMgY29udGV4dCB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgbWF0Y2ggb2YgdGhpcyBjb250ZXh0Ci0JICogd2hlbiB0aGUgaGlzdG9yeSBpcyBmaWx0ZXJlZCBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRleHQuIEFkZGluZyBhIG1hdGNoCi0JICogYWxsb3dzIGNvbXBvbmVudHMgdG8gY3JlYXRlIHRoZWlyIG93biBjb250ZXh0cyBmb3IgaW1wbGVtZW50aW5nCi0JICogc3BlY2lhbGl6ZWQgYmVoYXZpb3IsIHlldCBoYXZlIHRoZWlyIG9wZXJhdGlvbnMgYXBwZWFyIGluIGEgbW9yZQotCSAqIGdsb2JhbCBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0IAotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdG8gYmUgYWRkZWQgYXMgYSBtYXRjaCBvZiB0aGlzIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNYXRjaChJVW5kb0NvbnRleHQgY29udGV4dCkgewotCQljaGlsZHJlbi5hZGQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY29udGV4dCBhcyBhIG1hdGNoIG9mIHRoaXMgY29udGV4dC4gVGhlIGNvbnRleHQgd2lsbAotCSAqIG5vIGxvbmdlciBiZSBpbnRlcnByZXRlZCBhcyBhIG1hdGNoIG9mIHRoaXMgY29udGV4dCB3aGVuIHRoZSBoaXN0b3J5IGlzCi0JICogZmlsdGVyZWQgZm9yIGEgcGFydGljdWxhciBjb250ZXh0LiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIHRoZQotCSAqIHNwZWNpZmllZCBjb250ZXh0IHdhcyBuZXZlciBwcmV2aW91c2x5IGFkZGVkIGFzIGEgbWF0Y2guCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQgCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0byBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgbWF0Y2hlcyBmb3IgdGhpcwotCSAqICAgICAgICAgICAgY29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1hdGNoKElVbmRvQ29udGV4dCBjb250ZXh0KSB7Ci0JCWNoaWxkcmVuLnJlbW92ZShjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQjbWF0Y2hlcyhJVW5kb0NvbnRleHQKLQkgKiAgICAgIGNvbnRleHQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJVW5kb0NvbnRleHQgY29udGV4dCkgewotCQkvLyBDaGVjayBmaXJzdCBmb3IgZXhwbGljaXQgbWF0Y2hlcyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZC4KLQkJaWYgKGNoaWxkcmVuLmNvbnRhaW5zKGNvbnRleHQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCS8vIENvbnRleHRzIGZvciBlcXVhbCBvYmplY3RzIGFyZSBjb25zaWRlcmVkIG1hdGNoaW5nCi0JCWlmIChjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0VW5kb0NvbnRleHQgJiYgZ2V0T2JqZWN0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRPYmplY3QoKS5lcXVhbHMoKChPYmplY3RVbmRvQ29udGV4dCljb250ZXh0KS5nZXRPYmplY3QoKSk7Ci0JCS8vIFVzZSB0aGUgbm9ybWFsIG1hdGNoaW5nIGltcGxlbWVudGF0aW9uCi0JCXJldHVybiBzdXBlci5tYXRjaGVzKGNvbnRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb3BlcmF0aW9uLiAgVXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCi0JICogVGhpcyBzdHJpbmcgc2hvdWxkIG5vdCBiZSBzaG93biB0byBhbiBlbmQgdXNlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldExhYmVsKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL09wZXJhdGlvbkhpc3RvcnlFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvT3BlcmF0aW9uSGlzdG9yeUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODk2ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvT3BlcmF0aW9uSGlzdG9yeUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIDxwPgotICogT3BlcmF0aW9uSGlzdG9yeUV2ZW50IGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgY2hhbmdlcyB0aGF0IG9jY3VyIGluIGEKLSAqIERlZmF1bHRPcGVyYXRpb25IaXN0b3J5LCBpbmNsdWRpbmcgdGhlIGFkZGl0aW9uIG9yIHJlbW92YWwgb2Ygb3BlcmF0aW9ucywgYW5kCi0gKiB0aGUgZXhlY3V0aW9uLCB1bmRvLCBhbmQgcmVkbyBvZiBvcGVyYXRpb25zLgotICogPC9wPgotICogPHA+Ci0gKiBPcGVyYXRpb24gaGlzdG9yeSBsaXN0ZW5lcnMgbXVzdCBiZSBwcmVwYXJlZCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZnJvbSBhCi0gKiBiYWNrZ3JvdW5kIHRocmVhZC4gQW55IFVJIGFjY2VzcyBvY2N1cnJpbmcgaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlCi0gKiBwcm9wZXJseSBzeW5jaHJvbml6ZWQgdXNpbmcgdGhlIHRlY2huaXF1ZXMgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQncyB3aWRnZXQKLSAqIGxpYnJhcnkuCi0gKiA8L3A+Ci0gKiAKLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT3BlcmF0aW9uSGlzdG9yeUV2ZW50IHsKLQotCS8qKgotCSAqIEFCT1VUX1RPX0VYRUNVVEUgaW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIGlzIGFib3V0IHRvIGV4ZWN1dGUuCi0JICogTGlzdGVuZXJzIHNob3VsZCBwcmVwYXJlIGZvciB0aGUgZXhlY3V0aW9uIGFzIGFwcHJvcHJpYXRlLiBMaXN0ZW5lcnMgd2lsbAotCSAqIHJlY2VpdmUgYSBET05FIG5vdGlmaWNhdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIG9yIGFuCi0JICogT1BFUkFUSU9OX05PVF9PSyBub3RpZmljYXRpb24gaWYgdGhlIGV4ZWN1dGlvbiBpcyBjYW5jZWxsZWQgb3Igb3RoZXJ3aXNlCi0JICogZmFpbHMuIFRoaXMgbm90aWZpY2F0aW9uIGlzIG9ubHkgcmVjZWl2ZWQgZm9yIHRob3NlIG9wZXJhdGlvbnMgZXhlY3V0ZWQKLQkgKiBieSB0aGUgb3BlcmF0aW9uIGhpc3RvcnkuIE9wZXJhdGlvbnMgdGhhdCBhcmUgYWRkZWQgdG8gdGhlIGhpc3RvcnkgYWZ0ZXIKLQkgKiBleGVjdXRpb24gZG8gbm90IHRyaWdnZXIgdGhlc2Ugbm90aWZpY2F0aW9ucy4KLQkgKiAKLQkgKiBJZiB0aGUgb3BlcmF0aW9uIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgY2xpZW50cyB3aWxsIGFsc28gcmVjZWl2ZSBhCi0JICogbm90aWZpY2F0aW9uIHRoYXQgaXQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGhpc3RvcnkuCi0JICogCi0JICogKHZhbHVlIGlzIDEpLgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJPVVRfVE9fRVhFQ1VURSA9IDE7Ci0KLQkvKioKLQkgKiBBQk9VVF9UT19SRURPIGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiBpcyBhYm91dCB0byBiZSByZWRvbmUuCi0JICogTGlzdGVuZXJzIHNob3VsZCBwcmVwYXJlIGZvciB0aGUgcmVkbyBhcyBhcHByb3ByaWF0ZS4gTGlzdGVuZXJzIHdpbGwKLQkgKiByZWNlaXZlIGEgUkVET05FIG5vdGlmaWNhdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIG9yIGFuCi0JICogT1BFUkFUSU9OX05PVF9PSyBub3RpZmljYXRpb24gaWYgdGhlIHJlZG8gaXMgY2FuY2VsbGVkIG9yIG90aGVyd2lzZQotCSAqIGZhaWxzLgotCSAqIAotCSAqICh2YWx1ZSBpcyAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQk9VVF9UT19SRURPID0gMjsKLQotCS8qKgotCSAqIEFCT1VUX1RPX1VORE8gaW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIGlzIGFib3V0IHRvIGJlIHVuZG9uZS4KLQkgKiBMaXN0ZW5lcnMgc2hvdWxkIHByZXBhcmUgZm9yIHRoZSB1bmRvIGFzIGFwcHJvcHJpYXRlLiBMaXN0ZW5lcnMgd2lsbAotCSAqIHJlY2VpdmUgYW4gVU5ET05FIG5vdGlmaWNhdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIG9yIGFuCi0JICogT1BFUkFUSU9OX05PVF9PSyBub3RpZmljYXRpb24gaWYgdGhlIHVuZG8gaXMgY2FuY2VsbGVkIG9yIG90aGVyd2lzZQotCSAqIGZhaWxzLgotCSAqIAotCSAqICh2YWx1ZSBpcyAzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQk9VVF9UT19VTkRPID0gMzsKLQotCS8qKgotCSAqIERPTkUgaW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBMaXN0ZW5lcnMgY2FuIHRha2UKLQkgKiBhcHByb3ByaWF0ZSBhY3Rpb24sIHN1Y2ggYXMgcmV2ZWFsaW5nIGFueSByZWxldmFudCBzdGF0ZSBpbiB0aGUgVUkuIFRoaXMKLQkgKiBub3RpZmljYXRpb24gaXMgb25seSByZWNlaXZlZCBmb3IgdGhvc2Ugb3BlcmF0aW9ucyBleGVjdXRlZCBieSB0aGUKLQkgKiBvcGVyYXRpb24gaGlzdG9yeS4gT3BlcmF0aW9ucyB0aGF0IGFyZSBhZGRlZCB0byB0aGUgaGlzdG9yeSBhZnRlcgotCSAqIGV4ZWN1dGlvbiBkbyBub3QgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBDbGllbnRzIHdpbGwgYWxzbyByZWNlaXZlIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIG9wZXJhdGlvbiBoYXMgYmVlbgotCSAqIGFkZGVkIHRvIHRoZSBoaXN0b3J5LgotCSAqIAotCSAqICh2YWx1ZSBpcyA0KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET05FID0gNDsKLQotCS8qKgotCSAqIE9QRVJBVElPTl9BRERFRCBpbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5LgotCSAqIExpc3RlbmVycyBjYW4gdXNlIHRoaXMgbm90aWZpY2F0aW9uIHRvIGFkZCB0aGVpciB1bmRvIGNvbnRleHQgdG8gYSBuZXcKLQkgKiBvcGVyYXRpb24gYXMgYXBwcm9wcmlhdGUgb3Igb3RoZXJ3aXNlIHJlY29yZCB0aGUgb3BlcmF0aW9uLgotCSAqIAotCSAqICh2YWx1ZSBpcyA1KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVSQVRJT05fQURERUQgPSA1OwotCi0JLyoqCi0JICogT1BFUkFUSU9OX0NIQU5HRUQgaW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIGhhcyBjaGFuZ2VkIGluIHNvbWUgd2F5Ci0JICogc2luY2UgaXQgd2FzIGFkZGVkIHRvIHRoZSBvcGVyYXRpb25zIGhpc3RvcnkuCi0JICogCi0JICogKHZhbHVlIGlzIDYpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVElPTl9DSEFOR0VEID0gNjsKLQotCS8qKgotCSAqIE9QRVJBVElPTl9OT1RfT0sgaW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgYW5kIG5vdAotCSAqIHN1Y2Nlc3NmdWwuIExpc3RlbmVycyB0eXBpY2FsbHkgdXNlIHRoaXMgd2hlbiB0aGV5IGhhdmUgcHJlcGFyZWQgZm9yIGFuCi0JICogZXhlY3V0ZSwgdW5kbywgb3IgcmVkbywgYW5kIG5lZWQgdG8ga25vdyB0aGF0IHRoZSBvcGVyYXRpb24gZGlkIG5vdAotCSAqIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZS4gRm9yIGV4YW1wbGUsIGxpc3RlbmVycyB0aGF0IHR1cm4gcmVkcmF3IG9mZiBiZWZvcmUKLQkgKiBhbiBvcGVyYXRpb24gaXMgdW5kb25lIHdvdWxkIHR1cm4gcmVkcmF3IG9uIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMsCi0JICogb3Igd2hlbiB0aGlzIG5vdGlmaWNhdGlvbiBpcyByZWNlaXZlZCwgc2luY2UgdGhlcmUgd2lsbCBiZSBubwotCSAqIG5vdGlmaWNhdGlvbiBvZiB0aGUgY29tcGxldGlvbi4KLQkgKiAKLQkgKiAodmFsdWUgaXMgNykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BFUkFUSU9OX05PVF9PSyA9IDc7Ci0KLQkvKioKLQkgKiBPUEVSQVRJT05fUkVNT1ZFRCBpbmRpY2F0ZXMgYW4gb3BlcmF0aW9uIHdhcyByZW1vdmVkIGZyb20gdGhlIGhpc3RvcnkuCi0JICogTGlzdGVuZXJzIHR5cGljYWxseSByZW1vdmUgYW55IHJlY29yZCBvZiB0aGUgb3BlcmF0aW9uIHRoYXQgdGhleSBtYXkgaGF2ZQotCSAqIGtlcHQgaW4gdGhlaXIgb3duIHN0YXRlLiBUaGUgb3BlcmF0aW9uIGhhcyBiZWVuIGRpc3Bvc2VkIGJ5IHRoZSB0aW1lCi0JICogbGlzdGVuZXJzIHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24uCi0JICogCi0JICogKHZhbHVlIGlzIDgpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVElPTl9SRU1PVkVEID0gODsKLQotCS8qKgotCSAqIFJFRE9ORSBpbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gd2FzIHJlZG9uZS4gTGlzdGVuZXJzIGNhbiB0YWtlCi0JICogYXBwcm9wcmlhdGUgYWN0aW9uLCBzdWNoIGFzIHJldmVhbGluZyBhbnkgcmVsZXZhbnQgc3RhdGUgaW4gdGhlIFVJLgotCSAqIAotCSAqICh2YWx1ZSBpcyA5KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRURPTkUgPSA5OwotCi0JLyoqCi0JICogVU5ET05FIGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiB3YXMgdW5kb25lLiBMaXN0ZW5lcnMgY2FuIHRha2UKLQkgKiBhcHByb3ByaWF0ZSBhY3Rpb24sIHN1Y2ggYXMgcmV2ZWFsaW5nIGFueSByZWxldmFudCBzdGF0ZSBpbiB0aGUgVUkuCi0JICogCi0JICogKHZhbHVlIGlzIDEwKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRPTkUgPSAxMDsKLQotCXByaXZhdGUgaW50IGNvZGUgPSAwOwotCi0JcHJpdmF0ZSBJT3BlcmF0aW9uSGlzdG9yeSBoaXN0b3J5OwotCi0JcHJpdmF0ZSBJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uOwotCi0JLyogQHNpbmNlIDMuMiAqLwotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZXZlbnQgZm9yIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGhpc3RvcnkuCi0JICogCi0JICogQHBhcmFtIGNvZGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCBjb2RlIHRvIGJlIHVzZWQuCi0JICogQHBhcmFtIGhpc3RvcnkKLQkgKiAgICAgICAgICAgIHRoZSBoaXN0b3J5IHRyaWdnZXJpbmcgdGhlIGV2ZW50LgotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gaW52b2x2ZWQgaW4gdGhlIGV2ZW50LgotCSAqLwotCXB1YmxpYyBPcGVyYXRpb25IaXN0b3J5RXZlbnQoaW50IGNvZGUsIElPcGVyYXRpb25IaXN0b3J5IGhpc3RvcnksCi0JCQlJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCXRoaXMoY29kZSwgaGlzdG9yeSwgb3BlcmF0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZXZlbnQgZm9yIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGhpc3RvcnkuCi0JICogCi0JICogQHBhcmFtIGNvZGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCBjb2RlIHRvIGJlIHVzZWQuCi0JICogQHBhcmFtIGhpc3RvcnkKLQkgKiAgICAgICAgICAgIHRoZSBoaXN0b3J5IHRyaWdnZXJpbmcgdGhlIGV2ZW50LgotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gaW52b2x2ZWQgaW4gdGhlIGV2ZW50LgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCwgb3IgbnVsbCBpZiBubyBzdGF0dXMgaXMKLQkgKiAgICAgICAgICAgIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIE9wZXJhdGlvbkhpc3RvcnlFdmVudChpbnQgY29kZSwgSU9wZXJhdGlvbkhpc3RvcnkgaGlzdG9yeSwKLQkJCUlVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24sIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChoaXN0b3J5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJaWYgKG9wZXJhdGlvbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCXRoaXMuY29kZSA9IGNvZGU7Ci0JCXRoaXMuaGlzdG9yeSA9IGhpc3Rvcnk7Ci0JCXRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBpcyBvY2N1cnJpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgdHlwZSBjb2RlIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZXZlbnQuCi0JICovCi0JcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7Ci0JCXJldHVybiBjb2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb3BlcmF0aW9uIGhpc3RvcnkgdGhhdCB0cmlnZ2VyZWQgdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcGVyYXRpb24gaGlzdG9yeQotCSAqLwotCi0JcHVibGljIElPcGVyYXRpb25IaXN0b3J5IGdldEhpc3RvcnkoKSB7Ci0JCXJldHVybiBoaXN0b3J5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb3BlcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9wZXJhdGlvbgotCSAqLwotCi0JcHVibGljIElVbmRvYWJsZU9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBvcGVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LiBUaGUgc3RhdHVzIG1heSBiZSBudWxsLgotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQotCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL09wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9PcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjRkNzQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL09wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zOwotCi0vKioKLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG1haW50YWluIHRoZSBpbnN0YW5jZSBvZiB0aGUgb3BlcmF0aW9uIGhpc3RvcnkgdGhhdAotICogc2hvdWxkIGJlIHVzZWQgYnkgY2xhc3NlcyB0aGF0IGFjY2VzcyB0aGUgdW5kbyBvciByZWRvIGhpc3RvcnkgYW5kIGFkZAotICogdW5kb2FibGUgb3BlcmF0aW9ucyB0byB0aGUgaGlzdG9yeS4gCi0gKiAKLSAqIDxwPgotICogSXQgaXMgaW50ZW5kZWQgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gY3JlYXRlIGFuIG9wZXJhdGlvbiBoaXN0b3J5IGFwcHJvcHJpYXRlCi0gKiBmb3IgaXRzIG5lZWRzIGFuZCBzZXQgaXQgaW50byB0aGlzIGNsYXNzLiAgT3RoZXJ3aXNlLCBhIGRlZmF1bHQgb3BlcmF0aW9uIGhpc3RvcnkKLSAqIHdpbGwgYmUgY3JlYXRlZC4gIFRoZSBvcGVyYXRpb24gaGlzdG9yeSBtYXkgb25seSBiZSBzZXQgb25lIHRpbWUuICBBbGwgY2xhc3NlcyB0aGF0IAotICogYWNjZXNzIGFuIG9wZXJhdGlvbnMgaGlzdG9yeSB1c2UgdGhpcyBjbGFzcyB0byBvYnRhaW4gdGhlIGNvcnJlY3QgaW5zdGFuY2UuICAKLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgSU9wZXJhdGlvbkhpc3Rvcnkgb3BlcmF0aW9uSGlzdG9yeTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgb3BlcmF0aW9uIGhpc3RvcnkgdG8gYmUgdXNlZCBmb3IgbWFuYWdpbmcgdW5kb2FibGUgb3BlcmF0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcGVyYXRpb24gaGlzdG9yeSB0byBiZSB1c2VkIGZvciBleGVjdXRpbmcsIHVuZG9pbmcsIGFuZAotCSAqICAgICAgICAgcmVkb2luZyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU9wZXJhdGlvbkhpc3RvcnkgZ2V0T3BlcmF0aW9uSGlzdG9yeSgpIHsKLQkJaWYgKG9wZXJhdGlvbkhpc3RvcnkgPT0gbnVsbCkgewotCQkJb3BlcmF0aW9uSGlzdG9yeSA9IG5ldyBEZWZhdWx0T3BlcmF0aW9uSGlzdG9yeSgpOwotCQl9Ci0JCXJldHVybiBvcGVyYXRpb25IaXN0b3J5OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgb3BlcmF0aW9uIGhpc3RvcnkgdG8gYmUgdXNlZCBmb3IgbWFuYWdpbmcgdW5kb2FibGUgb3BlcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgb25lIHRpbWUsIGFuZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IAotCSAqIHJlcXVlc3QgdG8gZ2V0IHRoZSBoaXN0b3J5LiAgQXR0ZW1wdHMgdG8gc2V0IHRoZSBvcGVyYXRpb24gaGlzdG9yeSB3aWxsCi0JICogYmUgaWdub3JlZCBhZnRlciBpdCBoYXMgYmVlbiBhbHJlYWR5IHNldCwgb3IgYWZ0ZXIgYSBkZWZhdWx0IG9uZSBoYXMgCi0JICogYmVlbiBjcmVhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBoaXN0b3J5IAotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiBoaXN0b3J5IHRvIGJlIHVzZWQgZm9yIGV4ZWN1dGluZywgdW5kb2luZywgYW5kCi0JICogICAgICAgICAgICByZWRvaW5nIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE9wZXJhdGlvbkhpc3RvcnkoSU9wZXJhdGlvbkhpc3RvcnkgaGlzdG9yeSkgewotCQkvLyBJZiBvbmUgaGFzIGFscmVhZHkgYmVlbiBzZXQgb3IgY3JlYXRlZCwgaWdub3JlIHRoaXMgcmVxdWVzdC4KLQkJaWYgKG9wZXJhdGlvbkhpc3RvcnkgPT0gbnVsbCkgewotCQkJb3BlcmF0aW9uSGlzdG9yeSA9IGhpc3Rvcnk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBPcGVyYXRpb25IaXN0b3J5RmFjdG9yeSgpIHsKLQkJLy8gbWF5IG5vdCBiZSBpbnN0YW50aWF0ZWQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL09wZXJhdGlvblN0YXR1cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvT3BlcmF0aW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODNkMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvT3BlcmF0aW9uU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotLyoqCi0gKiA8cD4KLSAqIE9wZXJhdGlvblN0YXR1cyBkZXNjcmliZXMgdGhlIHN0YXR1cyBvZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSwgdW5kbywgb3IgcmVkbwotICogYW4gb3BlcmF0aW9uLiAgVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE9wZXJhdGlvblN0YXR1cyBleHRlbmRzIFN0YXR1cyB7Ci0JLyoqCi0JICogTk9USElOR19UT19SRURPIGluZGljYXRlcyB0aGVyZSB3YXMgbm8gb3BlcmF0aW9uIGF2YWlsYWJsZSBmb3IgcmVkby4KLQkgKiAKLQkgKiAodmFsdWUgaXMgMSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9USElOR19UT19SRURPID0gMTsKLQotCS8qKgotCSAqIE5PVEhJTkdfVE9fVU5ETyBpbmRpY2F0ZXMgdGhlcmUgd2FzIG5vIG9wZXJhdGlvbiBhdmFpbGFibGUgZm9yIHVuZG8uCi0JICogCi0JICogKHZhbHVlIGlzIDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVEhJTkdfVE9fVU5ETyA9IDI7Ci0KLQkvKioKLQkgKiBPUEVSQVRJT05fSU5WQUxJRCBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIGF2YWlsYWJsZSBmb3IgdW5kbyBvciByZWRvCi0JICogaXMgbm90IGluIGEgc3RhdGUgdG8gc3VjY2Vzc2Z1bGx5IHBlcmZvcm0gdGhlIHVuZG8gb3IgcmVkby4KLQkgKiAKLQkgKiAodmFsdWUgaXMgMykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BFUkFUSU9OX0lOVkFMSUQgPSAzOwotCi0JLyoqCi0JICogREVGQVVMVF9QTFVHSU5fSUQgaWRlbnRpZmllcyB0aGUgZGVmYXVsdCBwbHVnaW4gcmVwb3J0aW5nIHRoZSBzdGF0dXMuCi0JICogCi0JICogKHZhbHVlIGlzICJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzIikuCi0JICovCi0Jc3RhdGljIFN0cmluZyBERUZBVUxUX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24gc3RhdHVzLCBzcGVjaWZ5aW5nIGFsbCBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqICAgICAgICAgICAgdGhlIHNldmVyaXR5IGZvciB0aGUgc3RhdHVzCi0JICogQHBhcmFtIHBsdWdpbklkIAotCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZWxldmFudCBwbHVnLWluCi0JICogQHBhcmFtIGNvZGUKLQkgKiAgICAgICAgICAgIHRoZSBpbmZvcm1hdGlvbmFsIGNvZGUgZm9yIHRoZSBzdGF0dXMKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgYSBodW1hbi1yZWFkYWJsZSBtZXNzYWdlLCBsb2NhbGl6ZWQgdG8gdGhlIGN1cnJlbnQgbG9jYWxlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgYSBsb3ctbGV2ZWwgZXhjZXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QKLQkgKiAgICAgICAgICAgIGFwcGxpY2FibGUKLQkgKi8KLQlwdWJsaWMgT3BlcmF0aW9uU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIHBsdWdpbklkLCBpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJc3VwZXIoc2V2ZXJpdHksIHBsdWdpbklkLCBjb2RlLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL1RyaWdnZXJlZE9wZXJhdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL1RyaWdnZXJlZE9wZXJhdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4Y2ZkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvb3BlcmF0aW9ucy9UcmlnZ2VyZWRPcGVyYXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLS8qKgotICogPHA+Ci0gKiBUcmlnZ2VyZWQgb3BlcmF0aW9ucyBhcmUgYSBzcGVjaWFsaXplZCBpbXBsZW1lbnRhdGlvbiBvZiBhIGNvbXBvc2l0ZSBvcGVyYXRpb24KLSAqIHRoYXQga2VlcHMgdHJhY2sgb2Ygb3BlcmF0aW9ucyB0cmlnZ2VyZWQgYnkgdGhlIGV4ZWN1dGlvbiBvZiBzb21lIHByaW1hcnkgb3BlcmF0aW9uLiAKLSAqIFRoZSBjb21wb3NpdGUga25vd3Mgd2hpY2ggb3BlcmF0aW9uIHdhcyB0aGUgdHJpZ2dlciBmb3Igc3Vic2VxdWVudCBvcGVyYXRpb25zLCBhbmQgCi0gKiBhZGRzIGFsbCB0cmlnZ2VyZWQgb3BlcmF0aW9ucyBhcyBjaGlsZHJlbi4gV2hlbiBleGVjdXRpb24sIHVuZG8sIG9yIHJlZG8gaXMgcGVyZm9ybWVkLCAKLSAqIG9ubHkgdGhlIHRyaWdnZXJlZCBvcGVyYXRpb24gaXMgZXhlY3V0ZWQsIHVuZG9uZSwgb3IgcmVkb25lIGlmIGl0IGlzIHN0aWxsIHByZXNlbnQuIElmCi0gKiB0aGUgdHJpZ2dlciBpcyByZW1vdmVkIGZyb20gdGhlIHRyaWdnZXJlZCBvcGVyYXRpb25zLCB0aGVuIHRoZSBjaGlsZCBvcGVyYXRpb25zIHdpbGwgCi0gKiByZXBsYWNlIHRoZSB0cmlnZ2VyZWQgb3BlcmF0aW9ucyBpbiB0aGUgaGlzdG9yeS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyaWdnZXJlZE9wZXJhdGlvbnMgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiBpbXBsZW1lbnRzCi0JCUlDb21wb3NpdGVPcGVyYXRpb24sIElBZHZhbmNlZFVuZG9hYmxlT3BlcmF0aW9uIHsKLQotCXByaXZhdGUgSVVuZG9hYmxlT3BlcmF0aW9uIHRyaWdnZXJpbmdPcGVyYXRpb247Ci0KLQlwcml2YXRlIElPcGVyYXRpb25IaXN0b3J5IGhpc3Rvcnk7Ci0KLQlwcml2YXRlIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb21wb3NpdGUgdHJpZ2dlcmVkIG9wZXJhdGlvbnMgdXNpbmcgdGhlIHNwZWNpZmllZCB1bmRvYWJsZQotCSAqIG9wZXJhdGlvbiBhcyB0aGUgdHJpZ2dlci4gVXNlIHRoZSBsYWJlbCBvZiB0aGlzIHRyaWdnZXIgYXMgdGhlIGxhYmVsIG9mCi0JICogdGhlIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uIAotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0aGF0IHdpbGwgdHJpZ2dlciBvdGhlciBvcGVyYXRpb25zLgotCSAqIEBwYXJhbSBoaXN0b3J5IAotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiBoaXN0b3J5IGNvbnRhaW5pbmcgdGhlIHRyaWdnZXJlZCBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBUcmlnZ2VyZWRPcGVyYXRpb25zKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24sCi0JCQlJT3BlcmF0aW9uSGlzdG9yeSBoaXN0b3J5KSB7Ci0JCXN1cGVyKG9wZXJhdGlvbi5nZXRMYWJlbCgpKTsKLQkJdHJpZ2dlcmluZ09wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLQkJcmVjb21wdXRlQ29udGV4dHMoKTsKLQkJdGhpcy5oaXN0b3J5ID0gaGlzdG9yeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jYWRkKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgYWRkKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJY2hpbGRyZW4uYWRkKG9wZXJhdGlvbik7Ci0JCUlVbmRvQ29udGV4dFtdIGNvbnRleHRzID0gb3BlcmF0aW9uLmdldENvbnRleHRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghaGFzQ29udGV4dChjb250ZXh0c1tpXSkpIHsKLQkJCQlhZGRDb250ZXh0KGNvbnRleHRzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNyZW1vdmUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uID09IHRyaWdnZXJpbmdPcGVyYXRpb24pIHsKLQkJCS8vIHRoZSB0cmlnZ2VyaW5nIG9wZXJhdGlvbiBpcyBiZWluZyByZW1vdmVkLCBzbyB3ZSBtdXN0IHJlcGxhY2UgdGhpcyBjb21wb3NpdGUKLQkJCS8vIHdpdGggaXRzIGluZGl2aWR1YWwgdHJpZ2dlcnMuCi0JCQl0cmlnZ2VyaW5nT3BlcmF0aW9uID0gbnVsbDsKLQkJCS8vIHNhdmUgdGhlIGNoaWxkcmVuIGJlZm9yZSByZXBsYWNpbmcgdGhlIG9wZXJhdGlvbiwgc2luY2UgdGhpcwotCQkJLy8gb3BlcmF0aW9uIHdpbGwgYmUgZGlzcG9zZWQgYXMgcGFydCBvZiByZXBsYWNpbmcgaXQuICBXZSBkb24ndCB3YW50IHRoZQotCQkJLy8gY2hpbGRyZW4gdG8gYmUgZGlzcG9zZWQgc2luY2UgdGhleSBhcmUgdG8gcmVwbGFjZSB0aGlzIG9wZXJhdGlvbi4KLQkJCUxpc3QgY2hpbGRyZW5Ub1Jlc3RvcmUgPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJCXJlY29tcHV0ZUNvbnRleHRzKCk7Ci0JCQlvcGVyYXRpb24uZGlzcG9zZSgpOwotCQkJLy8gbm93IHJlcGxhY2UgdGhlIHRyaWdnZXJpbmcgb3BlcmF0aW9uCi0JCQloaXN0b3J5LnJlcGxhY2VPcGVyYXRpb24odGhpcywgKElVbmRvYWJsZU9wZXJhdGlvbltdKSBjaGlsZHJlblRvUmVzdG9yZQotCQkJCQkudG9BcnJheShuZXcgSVVuZG9hYmxlT3BlcmF0aW9uW2NoaWxkcmVuVG9SZXN0b3JlLnNpemUoKV0pKTsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuLnJlbW92ZShvcGVyYXRpb24pOwotCQkJb3BlcmF0aW9uLmRpc3Bvc2UoKTsKLQkJCXJlY29tcHV0ZUNvbnRleHRzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb250ZXh0IGZyb20gdGhlIHJlY2VpdmVyLiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkKLQkgKiBpbnZva2VkIHdoZW4gdGhlIGhpc3RvcnkgaXMgYmVpbmcgZmx1c2hlZCBmb3IgYSBjZXJ0YWluIGNvbnRleHQuIEluIHRoZQotCSAqIGNhc2Ugb2YgdHJpZ2dlcmVkIG9wZXJhdGlvbnMsIGlmIHRoZSBvbmx5IGNvbnRleHQgZm9yIHRoZSB0cmlnZ2VyaW5nIG9wZXJhdGlvbgotCSAqIGlzIGJlaW5nIHJlbW92ZWQsIHRoZW4gdGhlIHRyaWdnZXJpbmcgb3BlcmF0aW9uIG11c3QgYmUgcmVwbGFjZWQgaW4gdGhlCi0JICogb3BlcmF0aW9uIGhpc3Rvcnkgd2l0aCB0aGUgYXRvbWljIG9wZXJhdGlvbnMgdGhhdCBpdCB0cmlnZ2VyZWQuICBJZiB0aGUgY29udGV4dAotCSAqIGJlaW5nIHJlbW92ZWQgaXMgbm90IHRoZSBvbmx5IGNvbnRleHQgZm9yIHRoZSB0cmlnZ2VyaW5nIG9wZXJhdGlvbiwgdGhlCi0JICogdHJpZ2dlcmluZyBvcGVyYXRpb24gd2lsbCByZW1haW4sIGFuZCB0aGUgY2hpbGRyZW4gd2lsbCBlYWNoIGJlIHNpbWlsYXJseSAKLQkgKiBjaGVja2VkLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0IAotCSAqICAgICAgICAgICAgdGhlIHVuZG8gY29udGV4dCBiZWluZyByZW1vdmVkIGZyb20gdGhlIHJlY2VpdmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHQoSVVuZG9Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCS8vIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIG9ubHkgY29udGV4dCBvZiB0aGUKLQkJLy8gdHJpZ2dlcmluZyBvcGVyYXRpb24KLQkJaWYgKHRyaWdnZXJpbmdPcGVyYXRpb24gIT0gbnVsbCAmJiB0cmlnZ2VyaW5nT3BlcmF0aW9uLmhhc0NvbnRleHQoY29udGV4dCkpIHsKLQkJCWlmICh0cmlnZ2VyaW5nT3BlcmF0aW9uLmdldENvbnRleHRzKCkubGVuZ3RoID09IDEpIHsKLQkJCQlyZW1vdmUodHJpZ2dlcmluZ09wZXJhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdHJpZ2dlcmluZ09wZXJhdGlvbi5yZW1vdmVDb250ZXh0KGNvbnRleHQpOwotCQkJcmVjb21wdXRlQ29udGV4dHMoKTsKLQkJfQotCQkvLyB0aGUgdHJpZ2dlcmluZyBvcGVyYXRpb24gcmVtYWlucywgY2hlY2sgYWxsIHRoZSBjaGlsZHJlbgotCQlBcnJheUxpc3QgdG9CZVJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUlVbmRvYWJsZU9wZXJhdGlvbiBjaGlsZCA9IChJVW5kb2FibGVPcGVyYXRpb24pIGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChjaGlsZC5oYXNDb250ZXh0KGNvbnRleHQpKSB7Ci0JCQkJaWYgKGNoaWxkLmdldENvbnRleHRzKCkubGVuZ3RoID09IDEpIHsKLQkJCQkJdG9CZVJlbW92ZWQuYWRkKGNoaWxkKTsKLQkJCQl9IGVsc2UgewotCQkJCQljaGlsZC5yZW1vdmVDb250ZXh0KGNvbnRleHQpOwotCQkJCQlyZWNvbXB1dGVDb250ZXh0cygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvQmVSZW1vdmVkLnNpemUoKTsgaSsrKSB7Ci0JCQlyZW1vdmUoKElVbmRvYWJsZU9wZXJhdGlvbikgdG9CZVJlbW92ZWQuZ2V0KGkpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZiAodHJpZ2dlcmluZ09wZXJhdGlvbiAhPSBudWxsKSB7Ci0JCQloaXN0b3J5Lm9wZW5PcGVyYXRpb24odGhpcywgSU9wZXJhdGlvbkhpc3RvcnkuRVhFQ1VURSk7Ci0JCQl0cnkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gdHJpZ2dlcmluZ09wZXJhdGlvbi5leGVjdXRlKG1vbml0b3IsIGluZm8pOwotCQkJCWhpc3RvcnkuY2xvc2VPcGVyYXRpb24oc3RhdHVzLmlzT0soKSwgZmFsc2UsCi0JCQkJCQlJT3BlcmF0aW9uSGlzdG9yeS5FWEVDVVRFKTsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQloaXN0b3J5LmNsb3NlT3BlcmF0aW9uKGZhbHNlLCBmYWxzZSwgSU9wZXJhdGlvbkhpc3RvcnkuRVhFQ1VURSk7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gSU9wZXJhdGlvbkhpc3RvcnkuT1BFUkFUSU9OX0lOVkFMSURfU1RBVFVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNyZWRvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZiAodHJpZ2dlcmluZ09wZXJhdGlvbiAhPSBudWxsKSB7Ci0JCQloaXN0b3J5Lm9wZW5PcGVyYXRpb24odGhpcywgSU9wZXJhdGlvbkhpc3RvcnkuUkVETyk7Ci0JCQlMaXN0IGNoaWxkcmVuVG9SZXN0b3JlID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0JCQl0cnkgewotCQkJCXJlbW92ZUFsbENoaWxkcmVuKCk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSB0cmlnZ2VyaW5nT3BlcmF0aW9uLnJlZG8obW9uaXRvciwgaW5mbyk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCWNoaWxkcmVuID0gY2hpbGRyZW5Ub1Jlc3RvcmU7Ci0JCQkJfQotCQkJCWhpc3RvcnkuY2xvc2VPcGVyYXRpb24oc3RhdHVzLmlzT0soKSwgZmFsc2UsCi0JCQkJCQlJT3BlcmF0aW9uSGlzdG9yeS5SRURPKTsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQljaGlsZHJlbiA9IGNoaWxkcmVuVG9SZXN0b3JlOwotCQkJCWhpc3RvcnkuY2xvc2VPcGVyYXRpb24oZmFsc2UsIGZhbHNlLCBJT3BlcmF0aW9uSGlzdG9yeS5SRURPKTsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBJT3BlcmF0aW9uSGlzdG9yeS5PUEVSQVRJT05fSU5WQUxJRF9TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI3VuZG8ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICh0cmlnZ2VyaW5nT3BlcmF0aW9uICE9IG51bGwpIHsKLQkJCWhpc3Rvcnkub3Blbk9wZXJhdGlvbih0aGlzLCBJT3BlcmF0aW9uSGlzdG9yeS5VTkRPKTsKLQkJCUxpc3QgY2hpbGRyZW5Ub1Jlc3RvcmUgPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLQkJCXRyeSB7Ci0JCQkJcmVtb3ZlQWxsQ2hpbGRyZW4oKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHRyaWdnZXJpbmdPcGVyYXRpb24udW5kbyhtb25pdG9yLCBpbmZvKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJY2hpbGRyZW4gPSBjaGlsZHJlblRvUmVzdG9yZTsKLQkJCQl9Ci0JCQkJaGlzdG9yeS5jbG9zZU9wZXJhdGlvbihzdGF0dXMuaXNPSygpLCBmYWxzZSwKLQkJCQkJCUlPcGVyYXRpb25IaXN0b3J5LlVORE8pOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCWNoaWxkcmVuID0gY2hpbGRyZW5Ub1Jlc3RvcmU7Ci0JCQkJaGlzdG9yeS5jbG9zZU9wZXJhdGlvbihmYWxzZSwgZmFsc2UsIElPcGVyYXRpb25IaXN0b3J5LlVORE8pOwotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIElPcGVyYXRpb25IaXN0b3J5Lk9QRVJBVElPTl9JTlZBTElEX1NUQVRVUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jY2FuVW5kbygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJaWYgKHRyaWdnZXJpbmdPcGVyYXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIHRyaWdnZXJpbmdPcGVyYXRpb24uY2FuVW5kbygpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jY2FuRXhlY3V0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKHRyaWdnZXJpbmdPcGVyYXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIHRyaWdnZXJpbmdPcGVyYXRpb24uY2FuRXhlY3V0ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jY2FuUmVkbygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmVkbygpIHsKLQkJaWYgKHRyaWdnZXJpbmdPcGVyYXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIHRyaWdnZXJpbmdPcGVyYXRpb24uY2FuUmVkbygpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIERpc3Bvc2UgYWxsIG9wZXJhdGlvbnMgaW4gdGhlIHJlY2VpdmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCSgoSVVuZG9hYmxlT3BlcmF0aW9uKSAoY2hpbGRyZW4uZ2V0KGkpKSkuZGlzcG9zZSgpOwotCQl9Ci0JCWlmICh0cmlnZ2VyaW5nT3BlcmF0aW9uICE9IG51bGwpIHsKLQkJCXRyaWdnZXJpbmdPcGVyYXRpb24uZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZWNvbXB1dGUgY29udGV4dHMgaW4gbGlnaHQgb2Ygc29tZSBjaGFuZ2UgaW4gdGhlIGNoaWxkcmVuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlY29tcHV0ZUNvbnRleHRzKCkgewotCQlBcnJheUxpc3QgYWxsQ29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICh0cmlnZ2VyaW5nT3BlcmF0aW9uICE9IG51bGwpIHsKLQkJCUlVbmRvQ29udGV4dFtdIGNvbnRleHRzID0gdHJpZ2dlcmluZ09wZXJhdGlvbi5nZXRDb250ZXh0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykKLQkJCQlhbGxDb250ZXh0cy5hZGQoY29udGV4dHNbaV0pOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUlVbmRvQ29udGV4dFtdIGNvbnRleHRzID0gKChJVW5kb2FibGVPcGVyYXRpb24pIGNoaWxkcmVuLmdldChpKSkKLQkJCQkJLmdldENvbnRleHRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbnRleHRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKCFhbGxDb250ZXh0cy5jb250YWlucyhjb250ZXh0c1tqXSkpIHsKLQkJCQkJYWxsQ29udGV4dHMuYWRkKGNvbnRleHRzW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY29udGV4dHMgPSBhbGxDb250ZXh0czsKLQotCX0KLQotCS8qCi0JICogUmVtb3ZlIGFsbCBub24tdHJpZ2dlcmluZyBjaGlsZHJlbgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBbGxDaGlsZHJlbigpIHsKLQkJSVVuZG9hYmxlT3BlcmF0aW9uW10gbm9uVHJpZ2dlcnMgPSAoSVVuZG9hYmxlT3BlcmF0aW9uW10pIGNoaWxkcmVuCi0JCQkJLnRvQXJyYXkobmV3IElVbmRvYWJsZU9wZXJhdGlvbltjaGlsZHJlbi5zaXplKCldKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25UcmlnZ2Vycy5sZW5ndGg7IGkrKykgewotCQkJY2hpbGRyZW4ucmVtb3ZlKG5vblRyaWdnZXJzW2ldKTsKLQkJCW5vblRyaWdnZXJzW2ldLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb3BlcmF0aW9uIHRoYXQgdHJpZ2dlcmVkIHRoZSBvdGhlciBvcGVyYXRpb25zIGluIHRoaXMKLQkgKiBjb21wb3NpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgSVVuZG9hYmxlT3BlcmF0aW9uIHRoYXQgdHJpZ2dlcmVkIHRoZSBvdGhlciBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgSVVuZG9hYmxlT3BlcmF0aW9uIGdldFRyaWdnZXJpbmdPcGVyYXRpb24oKSB7Ci0JCXJldHVybiB0cmlnZ2VyaW5nT3BlcmF0aW9uOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JQWR2YW5jZWRNb2RlbE9wZXJhdGlvbiNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgW10gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAodHJpZ2dlcmluZ09wZXJhdGlvbiBpbnN0YW5jZW9mIElBZHZhbmNlZFVuZG9hYmxlT3BlcmF0aW9uKQotCQkJcmV0dXJuICgoSUFkdmFuY2VkVW5kb2FibGVPcGVyYXRpb24pdHJpZ2dlcmluZ09wZXJhdGlvbikuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JQWR2YW5jZWRNb2RlbE9wZXJhdGlvbiNhYm91dFRvTm90aWZ5KG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb05vdGlmeShPcGVyYXRpb25IaXN0b3J5RXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRyaWdnZXJpbmdPcGVyYXRpb24gaW5zdGFuY2VvZiBJQWR2YW5jZWRVbmRvYWJsZU9wZXJhdGlvbikKLQkJCSgoSUFkdmFuY2VkVW5kb2FibGVPcGVyYXRpb24pdHJpZ2dlcmluZ09wZXJhdGlvbikuYWJvdXRUb05vdGlmeShldmVudCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklBZHZhbmNlZFVuZG9hYmxlT3BlcmF0aW9uI2NvbXB1dGVVbmRvYWJsZVN0YXR1cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjb21wdXRlVW5kb2FibGVTdGF0dXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKHRyaWdnZXJpbmdPcGVyYXRpb24gaW5zdGFuY2VvZiBJQWR2YW5jZWRVbmRvYWJsZU9wZXJhdGlvbikKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoSUFkdmFuY2VkVW5kb2FibGVPcGVyYXRpb24pdHJpZ2dlcmluZ09wZXJhdGlvbikuY29tcHV0ZVVuZG9hYmxlU3RhdHVzKG1vbml0b3IpOwotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSUFkdmFuY2VkVW5kb2FibGVPcGVyYXRpb24jY29tcHV0ZVJlZG9hYmxlU3RhdHVzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNvbXB1dGVSZWRvYWJsZVN0YXR1cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZiAodHJpZ2dlcmluZ09wZXJhdGlvbiBpbnN0YW5jZW9mIElBZHZhbmNlZFVuZG9hYmxlT3BlcmF0aW9uKQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChJQWR2YW5jZWRVbmRvYWJsZU9wZXJhdGlvbil0cmlnZ2VyaW5nT3BlcmF0aW9uKS5jb21wdXRlUmVkb2FibGVTdGF0dXMobW9uaXRvcik7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvVW5kb0NvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL1VuZG9Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZDViYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvVW5kb0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnM7Ci0KLS8qKgotICogPHA+Ci0gKiBBIHNpbXBsZSwgbGlnaHR3ZWlnaHQgdW5kbyBjb250ZXh0IHRoYXQgY2FuIGJlIHVzZWQgdG8gdGFnIGFueSBvcGVyYXRpb24uIEl0Ci0gKiBkb2VzIG5vdCBwcm92aWRlZCBhIHNwZWNpYWxpemVkIGxhYmVsLiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgYnkKLSAqIGNsaWVudHMuIFRoaXMgY2xhc3MgbWF5IGFsc28gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgVW5kb0NvbnRleHQgaW1wbGVtZW50cyBJVW5kb0NvbnRleHQgewotCi0JLyoqCi0JICogPHA+Ci0JICogR2V0IHRoZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgdW5kbyBjb250ZXh0LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCSAqIHJldHVybnMgdGhlIGVtcHR5IFN0cmluZy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhYmVsIGZvciB0aGUgY29udGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbnRleHQgaXMgY29uc2lkZXJlZCBhIG1hdGNoIGZvciB0aGUKLQkgKiByZWNlaXZpbmcgY29udGV4dC4gV2hlbiBhIGNvbnRleHQgbWF0Y2hlcyBhbm90aGVyIGNvbnRleHQsIG9wZXJhdGlvbnMKLQkgKiB0aGF0IGhhdmUgdGhlIGNvbnRleHQgYXJlIGNvbnNpZGVyZWQgdG8gYWxzbyBoYXZlIHRoZSBtYXRjaGluZyBjb250ZXh0LgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSBzdXBwbGllZCBjb250ZXh0IGlzCi0JICogaWRlbnRpY2FsIHRvIHRoaXMgY29udGV4dC4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0byBiZSBjaGVja2VkIGFnYWluc3QgdGhlIHJlY2VpdmluZyBjb250ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlY2VpdmluZyBjb250ZXh0IGNhbiBiZSBjb25zaWRlcmVkIGEKLQkgKiAgICAgICAgIG1hdGNoIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRleHQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQKLQkgKiAgICAgICAgIGNhbm5vdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKElVbmRvQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBjb250ZXh0ID09IHRoaXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL29wZXJhdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODQ0NDJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy9vcGVyYXRpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbk5UOyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1DbGFzc2VzIGZvciB0aGUgY3JlYXRpb24gb2YgdW5kb2FibGUgb3BlcmF0aW9ucyB3aGljaCBjYW4gYmUgYWRkZWQgdG8gYW4gb3BlcmF0aW9ucwotaGlzdG9yeSBhbmQgbGF0ZXIgYmUgdW5kb25lIGFuZCByZWRvbmUuCi08aDI+Ci1QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotQW4gPGI+dW5kb2FibGUgb3BlcmF0aW9uPC9iPiBpcyBhIHVuaXQgb2Ygd29yayB0aGF0IGNhbiBiZSBleGVjdXRlZCwgdW5kb25lLCBhbmQgcmVkb25lLgotT3BlcmF0aW9ucyBjYW4gYmUgYWRkZWQgdG8gYW4gPGI+b3BlcmF0aW9uIGhpc3Rvcnk8L2I+IHNvIHRoYXQgdGhleSBjYW4gbGF0ZXIgYmUKLXVuZG9uZSBhbmQgcmVkb25lIGFjY29yZGluZyB0byB0aGUgdW5kbyBtb2RlbCBmb3IgYW4gYXBwbGljYXRpb24uICBPcGVyYXRpb25zIG1heSBiZSAKLWFzc2lnbmVkIG9uZSBvciBtb3JlIDxiPnVuZG8gY29udGV4dHM8L2I+IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZpbHRlciB0aGUgYXZhaWxhYmxlIAotb3BlcmF0aW9ucyBmb3IgdW5kbyBvciByZWRvIGluIHRoZSBvcGVyYXRpb24gaGlzdG9yeS4gIENsaWVudHMgbWF5IGNob29zZSB0byBwcm92aWRlCi11bmRvIGFuZCByZWRvIGZ1bmN0aW9uIGZvciBhbGwgb3BlcmF0aW9ucyBpbiBhIGhpc3RvcnksIG9yIG9ubHkgZm9yIGEgcGFydGljdWxhcgotdW5kbyBjb250ZXh0IGluIHRoYXQgaGlzdG9yeS4gIE9wZXJhdGlvbiBoaXN0b3JpZXMgbWF5IGJlIGNvbmZpZ3VyZWQgd2l0aCBhbiAKLTxiPm9wZXJhdGlvbiBhcHByb3ZlcjwvYj4gc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGVuZm9yY2UgYW55IGRlc2lyZWQgdW5kbyBtb2RlbCwgCi1zdWNoIGFzIHN0cmljdCBsaW5lYXIgKExJRk8pIHVuZG8uICBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIGRlZmluaXRpb24gYW5kIGEgCi1iYXNpYyBpbXBsZW1lbnRhdGlvbiBmb3Igb3BlcmF0aW9ucywgdW5kbyBjb250ZXh0cywgaGlzdG9yaWVzLCBhbmQgb3BlcmF0aW9uCi1hcHByb3ZlcnMuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkYWJmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvZGVmYXVsdF9zdHlsZS5jc3MiCi0JdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotPGJvZHkgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsgY29sb3I6IHJnYigwLCAwLCAwKSI+Ci1BcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2VzIGZvciBjb21tYW5kcyBhbmQgaGFuZGxlcnMuIAotPGgyPlBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci08cD4KLVRoaXMgcGFja2FnZSBwcm92aWRlcyBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgdG8gZGVmaW5lIGFic3RyYWN0Ci1waWVjZXMgb2YgZnVuY3Rpb25hbGl0eS4gIFRoZXNlIHBpZWNlcyBvZiBmdW5jdGlvbmFsaXR5IGFyZSBpbnRlbmRlZCB0bwotcHJvdmlkZSBhIGNvbW1vbiB3YXkgZm9yIHBsdWctaW5zIGFuZCB0aGUgdXNlciBpbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUKLXBvdGVudGlhbCBiZWhhdmlvdXIuCi08L3A+Ci08cD4KLVRoaXMgcGFja2FnZSBpcyBkZXNpZ25lZCBzbyB0aGF0IGl0cyBlbGVtZW50cyBjYW4gYmUgcHVibGljIGFuZCBkeW5hbWljLiAgVGhhdAotaXMsIGVsZW1lbnRzIGluIHRoaXMgcGFja2FnZSBjYW4gYXBwZWFyIGFuZCBkaXNhcHBlYXIgb3ZlciB0aGUgbGlmZSBvZiB0aGUKLWFwcGxpY2F0aW9uLgotPC9wPgotPGgzPkNvbW1hbmQ8L2gzPgotPHA+Ci1BIGNvbW1hbmQgaXMgYW4gYWJzdHJhY3QgcmVwcmVzZW50YXRpb24gZm9yIHNvbWUgc2VtYW50aWMgYmVoYXZpb3VyLiAgRm9yCi1leGFtcGxlLCB0aGVyZSBtaWdodCBiZSBhICJjb3B5IiBjb21tYW5kLiAgSG93IHRoaXMgY29tbWFuZCBhY3R1YWxseQotYmVoYXZlcyBtaWdodCBiZSBkZXBlbmRlbnQgb24gd2hhdCBzdGF0ZSB5b3VyIGFwcGxpY2F0aW9uIGlzIGluLiAgSXQgaXMgbm90Ci10aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoYXQgYmVoYXZpb3VyLCBhbmQgaXQgaXMgbm90IHRoZSB2aXN1YWwKLXJlcHJlc2VudGF0aW9uIG9mIHRoYXQgYmVoYXZpb3VyLgotPC9wPgotPHA+Ci1Db21tYW5kcyBhcmUgbWFuYWdlZCBieSBhbiBpbnN0YW5jZSBvZiA8Y29kZT5Db21tYW5kTWFuYWdlcjwvY29kZT4uICBJbiBmYWN0LCBhCi1jb21tYW5kIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS4gIENvbW1hbmRzIGFyZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUKLW1ldGhvZCA8Y29kZT5Db21tYW5kTWFuYWdlci5nZXRDb21tYW5kKFN0cmluZyk8L2NvZGU+LiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlcmUKLWlzIG9ubHkgZXZlciBvbmUgY29tbWFuZCB3aXRoIGEgZ2l2ZW4gaWRlbnRpZmllciBldmVyIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1hbmQuICAKLW1hbmFnZXIuCi08L3A+Ci08cD4KLVdoZW4gYSBjb21tYW5kIGlzIGZpcnN0IGNvbnN0cnVjdGVkLCBpdCBpcyB1bmRlZmluZWQuICBBbiB1bmRlZmluZWQgY29tbWFuZCBpcwotb25lIHRoYXQgaXMgY2Fycnlpbmcgbm8gaW5mb3JtYXRpb24gZXhjZXB0IGZvciBhbiBpZC4gIEF0dGVtcHRzIHRvIGludGVyYWN0Ci13aXRoIGEgY29tbWFuZCB0aGF0IGlzIHVuZGVmaW5lZCB3aWxsIHJlc3VsdCBpbiBhIAotPGNvZGU+Tm90RGVmaW5lZEV4Y2VwdGlvbjwvY29kZT4uICBUaHJvdWdoIHRoaXMgbWVjaGFuaXNtLCBpdCBpcyBwb3NzaWJsZSBmb3IKLWNsaWVudHMgdG8gaG9sZCByZWZlcmVuY2VzIHRvIGNvbW1hbmRzLCBhbmQgc3RpbGwgaGF2ZSB0aG9zZSBjb21tYW5kcwotImRpc2FwcGVhciIgKGkuZS4sIGJlY29tZSB1bmRlZmluZWQpLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGluIGEgc3lzdGVtCi1idWlsdCBhcm91bmQgZHluYW1pYyBjb21wb25lbnRzIChlLmcuLCBwbHVnLWlucykuCi08cD4KLUNvbW1hbmRzIGNhbiBiZSBncm91cGVkIGludG8gY2F0ZWdvcmllcy4gIFRoZXNlIGNhdGVnb3JpZXMgYXJlIGFyYml0cmFyeQotZ3JvdXBpbmdzLCBhbmQgaGF2ZSBubyBkZWZpbmVkIGJlaGF2aW91ci4gIFRoZXNlIGNhdGVnb3JpZXMgbWlnaHQgYmUgdXNlZCBpbiBhCi11c2VyIGludGVyZmFjZSBmb3IgYnJlYWtpbmcgdXAgYSBsYXJnZSBsaXN0IG9mIGNvbW1hbmRzIGludG8gc2VtYW50aWNhbGx5Ci1zaW1pbGFyIGNvbW1hbmRzIC0tIG1ha2luZyB0aGUgbGlzdCBlYXNpZXIgdG8gbmF2aWdhdGUuCi08L3A+Ci08cD4KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gYXR0YWNoIGxpc3RlbmVycyB0byBib3RoIGNvbW1hbmRzIGFuZCBjb21tYW5kIG1hbmFnZXJzLgotQSBsaXN0ZW5lciBvbiBhIGNvbW1hbmQgbWFuYWdlciB3aWxsIGJlIG5vdGlmaWVkIGlmIHRoZSBsaXN0IG9mIGRlZmluZWQKLWNvbW1hbmRzIG9yIGNhdGVnb3JpZXMgY2hhbmdlcy4KLTwvcD4KLTxoND5FeGFtcGxlczwvaDQ+Ci08YmxvY2txdW90ZT48cHJlPjxjb2RlPgotCUNvbW1hbmRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQ29tbWFuZE1hbmFnZXIoKTsKLQlDYXRlZ29yeSBjYXRlZ29yeSA9IG1hbmFnZXIuZ2V0Q2F0ZWdvcnkoImNhdGVnb3J5SWQiKTsKLQljYXRlZ29yeS5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iKTsKLQlDb21tYW5kIGNvbW1hbmQgPSBtYW5hZ2VyLmdldENvbW1hbmQoImNvbW1hbmRJZCIpOwotCWNvbW1hbmQuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgY2F0ZWdvcnkpOwotPC9jb2RlPjwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPlRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gY3JlYXRlIGEgY29tbWFuZCBmcm9tIHNjcmF0Y2ggLS0gd2l0aCBubyBleGlzdGluZwotbWFuYWdlciBvciBjYXRlZ29yaWVzLjwvcD4KLTxibG9ja3F1b3RlPjxwcmU+PGNvZGU+Ci0JY29tbWFuZC51bmRlZmluZSgpOwotCWNvbW1hbmQgPSBudWxsOwotCWNhdGVnb3J5LnVuZGVmaW5lKCk7Ci0JY2F0ZWdvcnkgPSBudWxsOwotPC9jb2RlPjwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPklmIHlvdSB3aXNoIHRvIGdldCByaWQgb2YgdGhlIGNvbW1hbmQsIHRoZW4geW91IHNpbXBseSB1bmRlZmluZSBpdC4gIFRoaXMKLXdpbGwgc2VuZCBub3RpZmljYXRpb24gdG8gdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVycywgYW5kIGZ1dHVyZSBhdHRlbXB0cyB0bwotYWNjZXNzIGl0IHdpbGwgZmFpbC4gIElmIHlvdSBhcmUgdGhlIG9ubHkgb25lIGhvbGRpbmcgb24gdG8gdGhlIGNvbW1hbmQsIHRoZW4KLWl0IHdpbGwgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuICBIb3dldmVyLCBpZiBvdGhlciBwZW9wbGUgc3RpbGwgaGF2ZSBhIHJlZmVyZW5jZQotdG8gdGhlIGNvbW1hbmQsIHRoZW4gdGhlIHN0dWIgd2lsbCByZW1haW4gdW50aWwgdGhleSByZXNwb25kIHRvIHRoZSBjaGFuZ2UuPC9wPgotPGJsb2NrcXVvdGU+PHByZT48Y29kZT4KLQlTdHJpbmcgbmFtZTsKLQl0cnkgewotCQluYW1lID0gY29tbWFuZC5nZXROYW1lKCk7Ci0JfSBjYXRjaCAoTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIENsZWFuLXVwIG15IHJlZmVyZW5jZSB0byB0aGUgY29tbWFuZC4KLQkJY29tbWFuZCA9IG51bGw7Ci0JCXJldHVybjsKLQl9Ci08L2NvZGU+PC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+VGhpcyBzaG93cyBvbmUgd2F5IG9mIGRlYWxpbmcgd2l0aCBjb21tYW5kcy4gIEluc3RlYWQgb2YgbGlzdGVuaW5nIGZvcgotY2hhbmdlcyB0byB0aGUgY29tbWFuZCwgeW91IGNhbiBzaW1wbHkgbGlzdGVuIGZvciB0aGUgZXhjZXB0aW9ucyB0byBiZSB0aHJvd24uCi1XaGVuIGEgPGNvZGU+Tm90RGVmaW5lZEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duLCB5b3UgY2FuIGNsZWFuIHVwIHlvdXIgb3duCi1jb2RlLiAgSG93IHlvdSBjbGVhbiB1cCBpcyBhcHBsaWNhdGlvbiBkZXBlbmRlbnQuICBJbiB0aGlzIGNhc2UsIHRoZSByZWZlcmVuY2UKLWlzIGNsZWFyZWQgYW5kIHdlIHJldHVybiBmcm9tIHRoZSBtZXRob2QuPC9wPgotPGJsb2NrcXVvdGU+PHByZT48Y29kZT4KLQl0cnkgewotCQlTdHJpbmcgbmFtZSA9IGNvbW1hbmQuZ2V0TmFtZSgpOwotCQkKLQkJLy8gRG8gYWxsIHlvdXIgd29yayBpbiB0aGUgYmxvY2suCi0JCQotCX0gY2F0Y2ggKE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkvLyBJZ25vcmUsIG9yIHBvc3NpYmx5IHRocm93IGFuIGVycm9yCi0JfQotCQotCS4uLgotCQotCXB1YmxpYyBjb21tYW5kQ2hhbmdlZChDb21tYW5kRXZlbnQgZSkgewotCQlpZiAoZS5oYXNEZWZpbmVkQ2hhbmdlZCgpKSB7Ci0JCQljb21tYW5kLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJY29tbWFuZCA9IG51bGw7Ci0JCX0KLQl9Ci08L2NvZGU+PC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+QW5vdGhlciB3YXkgaXMgdG8gYXR0YWNoIGEgbGlzdGVuZXIsIGFuZCB0aGVuIHNpbXBseSBpZ25vcmUgdGhlIGV4Y2VwdGlvbnMuCi1XaGVuIHRoZSBjb21tYW5kIGJlY29tZXMgdW5kZWZpbmVkLCB5b3Ugd2lsbCBiZSBub3RpZmllZC4gIFRoaXMgZ2l2ZXMgeW91ciB0aGUKLW9wcG9ydHVuaXR5IHRvIHVuaG9vayB5b3VyIGxpc3RlbmVyIGFuZCByZWxlYXNlIHlvdXIgcmVmZXJlbmNlLjwvcD4KLQotPGgzPkhhbmRsZXI8L2gzPgotPHA+Ci1BIGhhbmRsZXIgaXMgdGhlIGJlaGF2aW91ciBvZiBhIGNvbW1hbmQgYXQgYSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuICBUaGlzIGlzCi10aGUgcGllY2UgdGhhdCB3aWxsIGFjdHVhbGx5IGludGVyYWN0IHdpdGggeW91ciBhcHBsaWNhdGlvbiBtb2RlbC4gIEZvciBldmVyeQotY29tbWFuZCwgdGhlcmUgY2FuIGJlIHplcm8gb3IgbW9yZSBwb3NzaWJsZSBoYW5kbGVycy4gIEhvd2V2ZXIsIGF0IGFueSBvbmUKLXRpbWUsIHRoZXJlIGlzIGVpdGhlciBvbmUgaGFuZGxlciAoaS5lLiwgaGFuZGxlZCkgb3Igbm8gaGFuZGxlciAoaS5lLiwKLXVuaGFuZGxlZCkuCi08L3A+Ci08cD4KLUhhbmRsZXJzIG11c3QgaW1wbGVtZW50IDxjb2RlPklIYW5kbGVyPC9jb2RlPi4gIEhvd2V2ZXIsIHRoZXJlIGlzIGEgY29udmVuaWVudAotYWJzdHJhY3QgY2xhc3MsIDxjb2RlPkFic3RyYWN0SGFuZGxlcjwvY29kZT4gd2hpY2ggcHJvdmlkZXMgZGVmYXVsdCBiZWhhdmlvdXIKLWZvciBzb21lIG9mIHRoZSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGRldmVsb3BlcnMKLXN1YmNsYXNzIDxjb2RlPkFic3RyYWN0SGFuZGxlcjwvY29kZT4uCi08L3A+Ci08cD4KLUJlc2lkZSBmdW5jdGlvbmFsIGJlaGF2aW91ciwgYSBoYW5kbGVyIGNhcnJpZXMgd2l0aCBpdCBhIG1hcCBvZiBhdHRyaWJ1dGUKLXZhbHVlcy4gIFRoaXMgaXMgYSBjb21wbGV0ZWx5IG9wdGlvbmFseSB3YXkgb2YgY2FycnlpbmcgZXh0cmEgZGF0YS4gIEluIHRoZQotY2FzZSBvZiB0aGUgPGNvZGU+QWJzdHJhY3RIYW5kbGVyPC9jb2RlPiwgdGhpcyBtYXAgaXMgZW1wdHkuICBTb21lIGF0dHJpYnV0ZXMKLWhhdmUgd2VsbCBkZWZpbmVkIG1lYW5pbmdzLiAgVGhlc2UgYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBpbgotPGNvZGU+SUhhbmRsZXJBdHRyaWJ1dGVzPC9jb2RlPi4KLTwvcD4KLTxwPgotTGlrZSBjb21tYW5kcywgaGFuZGxlcnMgY2FuIGhhdmUgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoZW0uICBMaXN0ZW5lcnMgd2lsbCBiZQotbm90aWZpZWQgd2hlbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgaGFuZGxlciBjaGFuZ2UuCi08L3A+Ci08cD4KLVdoZW4gYSBoYW5kbGVyIGV4ZWN1dGVzLCBpdCBpcyBwYXNzZWQgYW4gZXZlbnQgb2JqZWN0Ci0oPGNvZGU+RXhlY3V0aW9uRXZlbnQ8L2NvZGU+KSB0aGF0IGNhcnJpZXMgd2l0aCBpdCBzb21lIHBpZWNlcyBvZiBpbmZvcm1hdGlvbi4KLUZpcnN0IG9mIGFsbCwgaXQgY29udGFpbnMgdGhlIHBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbi4gIFBhcmFtZXRlcnMgYXJlIHNpbXBsZQota2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlIGludGVuZGVkIHRvIG1vZGlmeSB0aGUgZXhlY3V0aW9uIGluIHNvbWUgd2F5LiAgVGhlCi1ldmVudCBhbHNvIGNhcnJpZXMgd2l0aCBpdCBhIGNvbGxlY3Rpb24gb2YgY29udGV4dHMgdGhhdCB3ZXJlIGFjdGl2ZSBhdCB0aGUKLXRpbWUgb2YgZXhlY3V0aW9uLiAgVGhlIGV2ZW50IGFsc28gY2FycmllcyB0d28gdW50eXBlZCBvYmplY3RzOiB0aGUgdHJpZ2dlcmluZwotZXZlbnQgYW5kIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIHN0YXRlLiAgSW4gdGhlIGNhc2Ugb2YgYSBncmFwaGljYWwgdG9vbCwgdGhlCi10cmlnZ2VyaW5nIGV2ZW50IGlzIGxpa2VseSB0byBiZSB0aGUgdW5kZXJseWluZyB3aWRnZXQgdG9vbGtpdCBldmVudC4gIFRoZSAKLWFwcGxpY2F0aW9uIHN0YXRlIG1pZ2h0IGNvbnRhaW4gaW5mb3JtYXRpb24gbGlrZSB3aWRnZXQgZm9jdXMgaW5mb3JtYXRpb24uICBJbgoteW91ciBvd24gYXBwbGljYXRpb24sIGZlZWwgZnJlZSB0byB1c2Ugd2hpY2hldmVyIG9mIHRoZXNlIGV2ZW50IGF0dHJpYnV0ZXMgdGhhdAotZml0IHlvdXIgYXBwbGljYXRpb24uCi08L3A+Ci08aDQ+RXhhbXBsZXM8L2g0PgotPGJsb2NrcXVvdGU+PHByZT48Y29kZT4KLQlJSGFuZGxlciBteUhhbmRsZXIgPSBjcmVhdGVIYW5kbGVyKCk7Ci0JY29tbWFuZC5zZXRIYW5kbGVyKG15SGFuZGxlcik7Ci0JCi0JRXhlY3V0aW9uRXZlbnQgZSA9IG5ldyBFeGVjdXRpb25FdmVudChwYXJhbWV0ZXJzLGNvbnRleHRzLHRyaWdnZXIsc3RhdGUpOwotCXRyeSB7Ci0JCWNvbW1hbmQuZXhlY3V0ZShlKTsKLQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZXgpIHsKLQkJLy8gTm90aWZ5IHRoZSB1c2VyLCBsb2cgdGhlIHByb2JsZW0sIGV0Yy4KLQl9Ci08L2NvZGU+PC9wcmU+PC9ibG9ja3F1b3RlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL3V0aWwvTGlzdGVuZXJMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvdXRpbC9MaXN0ZW5lckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiZjYwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvY29tbWFuZHMvdXRpbC9MaXN0ZW5lckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy51dGlsOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG1haW50YWluIGEgbGlzdCBvZiBsaXN0ZW5lcnMsIGFuZCBpcyB1c2VkIGluIHRoZQotICogaW1wbGVtZW50YXRpb25zIG9mIHNldmVyYWwgY2xhc3NlcyB3aXRoaW4gSkZhY2Ugd2hpY2ggYWxsb3cgeW91IHRvIHJlZ2lzdGVyCi0gKiBsaXN0ZW5lcnMgb2YgdmFyaW91cyBraW5kcy4gSXQgaXMgYSBmYWlybHkgbGlnaHR3ZWlnaHQgb2JqZWN0LCBvY2N1cHlpbmcKLSAqIG1pbmltYWwgc3BhY2Ugd2hlbiBubyBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGUgPGNvZGU+YWRkPC9jb2RlPiBtZXRob2QgY2hlY2tzIGZvciBhbmQgZWxpbWluYXRlcyBkdXBsaWNhdGVzCi0gKiBiYXNlZCBvbiBpZGVudGl0eSAobm90IGVxdWFsaXR5KS4gTGlrZXdpc2UsIHRoZSA8Y29kZT5yZW1vdmU8L2NvZGU+IG1ldGhvZAotICogY29tcGFyZXMgYmFzZWQgb24gaWRlbnRpdHkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFVzZSB0aGUgPGNvZGU+Z2V0TGlzdGVuZXJzPC9jb2RlPiBtZXRob2Qgd2hlbiBub3RpZnlpbmcgbGlzdGVuZXJzLiBOb3RlCi0gKiB0aGF0IG5vIGdhcmJhZ2UgaXMgY3JlYXRlZCBpZiBubyBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQuIFRoZSByZWNvbW1lbmRlZAotICogY29kZSBzZXF1ZW5jZSBmb3Igbm90aWZ5aW5nIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycyBvZiBzYXksCi0gKiA8Y29kZT5Gb29MaXN0ZW5lci5ldmVudEhhcHBlbmVkPC9jb2RlPiwgaXM6Ci0gKiAKLSAqIDxwcmU+Ci0gKiBPYmplY3RbXSBsaXN0ZW5lcnMgPSBteUxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLSAqIGZvciAoaW50IGkgPSAwOyBpICZsdDsgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0gKiAJKChGb29MaXN0ZW5lcikgbGlzdGVuZXJzW2ldKS5ldmVudEhhcHBlbmVkKGV2ZW50KTsKLSAqIH0KLSAqIDwvcHJlPgotICogCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3R9IGluc3RlYWQuCi0gKiAgICAgICAgICAgICA8c3Ryb25nPlRoaXMgY2xhc3Mgd2lsbCBiZSByZW1vdmVkIGJlZm9yZSAzLjIgaXMgcmVsZWFzZWQ8L3N0cm9uZz4uCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckxpc3QgZXh0ZW5kcyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsaXN0ZW5lciBsaXN0IHdpdGggYW4gaW5pdGlhbCBjYXBhY2l0eSBvZiAxLgotCSAqLwotCXB1YmxpYyBMaXN0ZW5lckxpc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3RlbmVyIGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gaW5pdGlhbCBjYXBhY2l0eS4KLQkgKiAKLQkgKiBAcGFyYW0gY2FwYWNpdHkKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIHdoaWNoIHRoaXMgbGlzdCBjYW4gaW5pdGlhbGx5IGFjY2VwdAotCSAqICAgICAgICAgICAgd2l0aG91dCBncm93aW5nIGl0cyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbjsgbXVzdCBiZSBhdCBsZWFzdAotCSAqICAgICAgICAgICAgMQotCSAqLwotCXB1YmxpYyBMaXN0ZW5lckxpc3QoaW50IGNhcGFjaXR5KSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL3V0aWwvVHJhY2luZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2NvbW1hbmRzL3V0aWwvVHJhY2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzZjNjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9jb21tYW5kcy91dGlsL1RyYWNpbmcuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9pbnRlcm5hbC9jb21tYW5kcy9vcGVyYXRpb25zL0dsb2JhbFVuZG9Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvaW50ZXJuYWwvY29tbWFuZHMvb3BlcmF0aW9ucy9HbG9iYWxVbmRvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWFlNGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvY29yZS9pbnRlcm5hbC9jb21tYW5kcy9vcGVyYXRpb25zL0dsb2JhbFVuZG9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5jb21tYW5kcy5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvQ29udGV4dDsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIG9wZXJhdGlvbiBjb250ZXh0IHRoYXQgbWF0Y2hlcyB0byBhbnkgY29udGV4dC4gIEl0IGNhbiBiZSB1c2VkIHRvIAotICogZ2V0IGFuIHVuZmlsdGVyZWQgKGdsb2JhbCkgaGlzdG9yeS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgR2xvYmFsVW5kb0NvbnRleHQgaW1wbGVtZW50cyBJVW5kb0NvbnRleHQgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvQ29udGV4dCNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuICJHbG9iYWwgVW5kbyBDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9Db250ZXh0I21hdGNoZXMoSVVuZG9Db250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJVW5kb0NvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvaW50ZXJuYWwvY29tbWFuZHMvdXRpbC9VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2NvcmUvaW50ZXJuYWwvY29tbWFuZHMvdXRpbC9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMDk2OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2ludGVybmFsL2NvbW1hbmRzL3V0aWwvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29tbWFuZHMudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotLyoqCi0gKiBBIGNsYXNzIHByb3ZpZGluZyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIGNvbW1hbmRzIHBsdWctaW4uCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFV0aWwgewotCi0gICAgLyoqCi0gICAgICogQSBzaGFyZWQsIHVubW9kaWZpYWJsZSwgZW1wdHksIHNvcnRlZCBtYXAuIFRoaXMgdmFsdWUgaXMgZ3VhcmFudGVlZCB0bwotICAgICAqIGFsd2F5cyBiZSB0aGUgc2FtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFNvcnRlZE1hcCBFTVBUWV9TT1JURURfTUFQID0gQ29sbGVjdGlvbnMKLSAgICAgICAgICAgIC51bm1vZGlmaWFibGVTb3J0ZWRNYXAobmV3IFRyZWVNYXAoKSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHNoYXJlZCwgdW5tb2RpZmlhYmxlLCBlbXB0eSwgc29ydGVkIHNldC4gVGhpcyB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvCi0gICAgICogYWx3YXlzIGJlIHRoZSBzYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU29ydGVkU2V0IEVNUFRZX1NPUlRFRF9TRVQgPSBDb2xsZWN0aW9ucwotICAgICAgICAgICAgLnVubW9kaWZpYWJsZVNvcnRlZFNldChuZXcgVHJlZVNldCgpKTsKLQotICAgIC8qKgotICAgICAqIEEgc2hhcmVkLCB6ZXJvLWxlbmd0aCBzdHJpbmcgLS0gZm9yIGF2b2lkaW5nIG5vbi1leHRlcm5hbGl6ZWQgc3RyaW5nCi0gICAgICogdGFncy4gVGhpcyB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cyBiZSB0aGUgc2FtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBaRVJPX0xFTkdUSF9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0cyB0aGUgdGhlIGdpdmVuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MgLS0KLSAgICAgKiBvcHRpb25hbGx5IGFsbG93aW5nIHRoZSBvYmplY3QgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgVGhlIG9iamVjdCBmb3Igd2hpY2ggdGhlIHR5cGUgc2hvdWxkIGJlIGNoZWNrZWQuCi0gICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IHRoZSBvYmplY3QgbXVzdCBiZTsgZmFpbHMgaWYgdGhlIGNsYXNzIGlzCi0gICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gYWxsb3dOdWxsCi0gICAgICogICAgICAgICAgICBXaGV0aGVyIHRoZSBvYmplY3QgYmVpbmcgPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBub3QgY2F1c2UgYQotICAgICAqICAgICAgICAgICAgZmFpbHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgYXNzZXJ0SW5zdGFuY2UoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3MgYywKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWxsb3dOdWxsKSB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCAmJiBhbGxvd051bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsIHx8IGMgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICBlbHNlIGlmICghYy5pc0luc3RhbmNlKG9iamVjdCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGJvb2xlYW4gdmFsdWVzLiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgY29uc2lkZXJlZCB0byBiZQotICAgICAqIGxlc3MgdGhhbiA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGVmdAotICAgICAqICAgICAgICAgICAgVGhlIGxlZnQgdmFsdWUgdG8gY29tcGFyZS4KLSAgICAgKiBAcGFyYW0gcmlnaHQKLSAgICAgKiAgICAgICAgICAgIFRoZSByaWdodCB2YWx1ZSB0byBjb21wYXJlLgotICAgICAqIEByZXR1cm4gPGNvZGU+LTE8L2NvZGU+IGlmIDxjb2RlPmxlZnQ8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgYW5kIDxjb2RlPnJpZ2h0PC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPjs8Y29kZT4wPC9jb2RlPgotICAgICAqICAgICAgICAgaWYgdGhleSBhcmUgZXF1YWw7IDxjb2RlPjE8L2NvZGU+IGlmIDxjb2RlPmxlZnQ8L2NvZGU+IGlzCi0gICAgICogICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBhbmQgPGNvZGU+cmlnaHQ8L2NvZGU+IGlzCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wYXJlKGZpbmFsIGJvb2xlYW4gbGVmdCwgZmluYWwgYm9vbGVhbiByaWdodCkgewotICAgICAgICByZXR1cm4gbGVmdCA9PSBmYWxzZSA/IChyaWdodCA9PSB0cnVlID8gLTEgOiAwKSA6IChyaWdodCA9PSB0cnVlID8gMAotICAgICAgICAgICAgICAgIDogMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGNvbXBhcmFibGUgb2JqZWN0cywgYnV0IHdpdGggcHJvdGVjdGlvbiBhZ2FpbnN0Ci0gICAgICogPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGxlZnQKLSAgICAgKiAgICAgICAgICAgIFRoZSBsZWZ0IHZhbHVlIHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gcmlnaHQKLSAgICAgKiAgICAgICAgICAgIFRoZSByaWdodCB2YWx1ZSB0byBjb21wYXJlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHJldHVybiA8Y29kZT4tMTwvY29kZT4gaWYgPGNvZGU+bGVmdDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAgICAgICAgIGFuZCA8Y29kZT5yaWdodDwvY29kZT4gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+OwotICAgICAqICAgICAgICAgPGNvZGU+MDwvY29kZT4gaWYgdGhleSBhcmUgYm90aCA8Y29kZT5udWxsPC9jb2RlPjsKLSAgICAgKiAgICAgICAgIDxjb2RlPjE8L2NvZGU+IGlmIDxjb2RlPmxlZnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICAgICAgICAgYW5kIDxjb2RlPnJpZ2h0PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4gT3RoZXJ3aXNlLCB0aGUKLSAgICAgKiAgICAgICAgIHJlc3VsdCBvZiA8Y29kZT5sZWZ0LmNvbXBhcmVUbyhyaWdodCk8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbXBhcmUoZmluYWwgQ29tcGFyYWJsZSBsZWZ0LAotICAgICAgICAgICAgZmluYWwgQ29tcGFyYWJsZSByaWdodCkgewotICAgICAgICBpZiAobGVmdCA9PSBudWxsICYmIHJpZ2h0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgZWxzZSBpZiAobGVmdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBlbHNlIGlmIChyaWdodCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBsZWZ0LmNvbXBhcmVUbyhyaWdodCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGludGVnZXIgdmFsdWVzLiBUaGlzIG1ldGhvZCBmYWlscyBpZiB0aGUgZGlzdGFuY2UgYmV0d2VlbgotICAgICAqIDxjb2RlPmxlZnQ8L2NvZGU+IGFuZCA8Y29kZT5yaWdodDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuCi0gICAgICogPGNvZGU+SW50ZWdlci5NQVhfVkFMVUU8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBsZWZ0Ci0gICAgICogICAgICAgICAgICBUaGUgbGVmdCB2YWx1ZSB0byBjb21wYXJlLgotICAgICAqIEBwYXJhbSByaWdodAotICAgICAqICAgICAgICAgICAgVGhlIHJpZ2h0IHZhbHVlIHRvIGNvbXBhcmUuCi0gICAgICogQHJldHVybiA8Y29kZT5sZWZ0IC0gcmlnaHQ8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tcGFyZShmaW5hbCBpbnQgbGVmdCwgZmluYWwgaW50IHJpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBsZWZ0IC0gcmlnaHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMgdGhhdCBhcmUgbm90IG90aGVyd2lzZSBjb21wYXJhYmxlLiBJZiBuZWl0aGVyIG9iamVjdAotICAgICAqIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBvYmplY3QgaXMKLSAgICAgKiB1c2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsZWZ0Ci0gICAgICogICAgICAgICAgICBUaGUgbGVmdCB2YWx1ZSB0byBjb21wYXJlLiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMKLSAgICAgKiAgICAgICAgICAgIHZhbHVlIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSByaWdodAotICAgICAqICAgICAgICAgICAgVGhlIHJpZ2h0IHZhbHVlIHRvIGNvbXBhcmUuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcwotICAgICAqICAgICAgICAgICAgdmFsdWUgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHJldHVybiA8Y29kZT4tMTwvY29kZT4gaWYgPGNvZGU+bGVmdDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAgICAgICAgIGFuZCA8Y29kZT5yaWdodDwvY29kZT4gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+OwotICAgICAqICAgICAgICAgPGNvZGU+MDwvY29kZT4gaWYgdGhleSBhcmUgYm90aCA8Y29kZT5udWxsPC9jb2RlPjsKLSAgICAgKiAgICAgICAgIDxjb2RlPjE8L2NvZGU+IGlmIDxjb2RlPmxlZnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICAgICAgICAgYW5kIDxjb2RlPnJpZ2h0PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4gT3RoZXJ3aXNlLCB0aGUKLSAgICAgKiAgICAgICAgIHJlc3VsdCBvZgotICAgICAqICAgICAgICAgPGNvZGU+bGVmdC50b1N0cmluZygpLmNvbXBhcmVUbyhyaWdodC50b1N0cmluZygpKTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tcGFyZShmaW5hbCBPYmplY3QgbGVmdCwgZmluYWwgT2JqZWN0IHJpZ2h0KSB7Ci0gICAgICAgIGlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBlbHNlIGlmIChsZWZ0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGVsc2UgaWYgKHJpZ2h0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGxlZnQudG9TdHJpbmcoKS5jb21wYXJlVG8ocmlnaHQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVjaWRlcyB3aGV0aGVyIHR3byBib29sZWFucyBhcmUgZXF1YWwuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxlZnQKLSAgICAgKiAgICAgICAgICAgIFRoZSBmaXJzdCBib29sZWFuIHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gcmlnaHQKLSAgICAgKiAgICAgICAgICAgIFRoZSBzZWNvbmQgYm9vbGVhbiB0byBjb21wYXJlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYm9vbGVhbnMgYXJlIGVxdWFsOyA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGJvb2xlYW4gbGVmdCwgZmluYWwgYm9vbGVhbiByaWdodCkgewotICAgICAgICByZXR1cm4gbGVmdCA9PSByaWdodDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWNpZGVzIHdoZXRoZXIgdHdvIG9iamVjdHMgYXJlIGVxdWFsIC0tIGRlZmVuZGluZyBhZ2FpbnN0Ci0gICAgICogPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGxlZnQKLSAgICAgKiAgICAgICAgICAgIFRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSByaWdodAotICAgICAqICAgICAgICAgICAgVGhlIHNlY29uZCBvYmplY3QgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdHMgYXJlIGVxdWFsczsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbGVmdCwgZmluYWwgT2JqZWN0IHJpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBsZWZ0ID09IG51bGwgPyByaWdodCA9PSBudWxsIDogKChyaWdodCAhPSBudWxsKSAmJiBsZWZ0Ci0gICAgICAgICAgICAgICAgLmVxdWFscyhyaWdodCkpOwotICAgIH0KLQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdHdvIGFycmF5cyBvZiBvYmplY3RzIGFyZSBlcXVhbCB0byBlYWNoIG90aGVyLiBUaGUgYXJyYXlzCi0JICogbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGJ1dCB0aGVpciBlbGVtZW50cyBtYXkgYmUKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbGVmdEFycmF5Ci0JICogICAgICAgICAgICBUaGUgbGVmdCBhcnJheSB0byBjb21wYXJlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGFuZAotCSAqICAgICAgICAgICAgbWF5IGJlIGVtcHR5IGFuZCBtYXkgY29udGFpbiA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50cy4KLQkgKiBAcGFyYW0gcmlnaHRBcnJheQotCSAqICAgICAgICAgICAgVGhlIHJpZ2h0IGFycmF5IHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgYW5kCi0JICogICAgICAgICAgICBtYXkgYmUgZW1wdHkgYW5kIG1heSBjb250YWluIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnRzLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFycmF5cyBhcmUgZXF1YWwgbGVuZ3RoIGFuZCB0aGUKLQkgKiAgICAgICAgIGVsZW1lbnRzIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFyZSBlcXVhbDsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3RbXSBsZWZ0QXJyYXksCi0JCQlmaW5hbCBPYmplY3RbXSByaWdodEFycmF5KSB7Ci0JCWlmIChsZWZ0QXJyYXkgPT0gbnVsbCkgewotCQkJcmV0dXJuIChyaWdodEFycmF5ID09IG51bGwpOwotCQl9IGVsc2UgaWYgKHJpZ2h0QXJyYXkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGxlZnRBcnJheS5sZW5ndGggIT0gcmlnaHRBcnJheS5sZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVmdEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBPYmplY3QgbGVmdCA9IGxlZnRBcnJheVtpXTsKLQkJCWZpbmFsIE9iamVjdCByaWdodCA9IHJpZ2h0QXJyYXlbaV07Ci0JCQlmaW5hbCBib29sZWFuIGVxdWFsID0gKGxlZnQgPT0gbnVsbCkgPyAocmlnaHQgPT0gbnVsbCkgOiAobGVmdAotCQkJCQkuZXF1YWxzKHJpZ2h0KSk7Ci0JCQlpZiAoIWVxdWFsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIGhhc2ggY29kZSBmb3IgYW4gaW50ZWdlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaQotICAgICAqICAgICAgICAgICAgVGhlIGludGVnZXIgZm9yIHdoaWNoIGEgaGFzaCBjb2RlIHNob3VsZCBiZSBjb21wdXRlZC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPmk8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhhc2hDb2RlKGZpbmFsIGludCBpKSB7Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGVzIHRoZSBoYXNoIGNvZGUgZm9yIGFuIG9iamVjdCwgYnV0IHdpdGggZGVmZW5zZSBhZ2FpbnN0Ci0gICAgICogPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgVGhlIG9iamVjdCBmb3Igd2hpY2ggYSBoYXNoIGNvZGUgaXMgbmVlZGVkOyBtYXkgYmUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEByZXR1cm4gVGhlIGhhc2ggY29kZSBmb3IgPGNvZGU+b2JqZWN0PC9jb2RlPjsgb3IgPGNvZGU+MDwvY29kZT4gaWYKLSAgICAgKiAgICAgICAgIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGFzaENvZGUoZmluYWwgT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgPyBvYmplY3QuaGFzaENvZGUoKSA6IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZXMgYSB0eXBlLXNhZmUgY29weSBvZiB0aGUgZ2l2ZW4gbWFwLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuCi0gICAgICogYSBtYXAgaXMgY3Jvc3NpbmcgYW4gQVBJIGJvdW5kYXJ5IChpLmUuLCBmcm9tIGEgaG9zdGlsZSBwbHVnLWluIGludG8KLSAgICAgKiBpbnRlcm5hbCBjb2RlLCBvciB2aWNlIHZlcnNhKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogICAgICAgICAgICBUaGUgbWFwIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBrZXlDbGFzcwotICAgICAqICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgYWxsIHRoZSBrZXlzIG11c3QgYmU7IG11c3Qgbm90IGJlCi0gICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gdmFsdWVDbGFzcwotICAgICAqICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgYWxsIHRoZSB2YWx1ZXMgbXVzdCBiZTsgbXVzdCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBhbGxvd051bGxLZXlzCi0gICAgICogICAgICAgICAgICBXaGV0aGVyIDxjb2RlPm51bGw8L2NvZGU+IGtleXMgc2hvdWxkIGJlIGFsbG93ZWQuCi0gICAgICogQHBhcmFtIGFsbG93TnVsbFZhbHVlcwotICAgICAqICAgICAgICAgICAgV2hldGhlciA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZXMgc2hvdWxkIGJlIGFsbG93ZWQuCi0gICAgICogQHJldHVybiBBIGNvcHkgb2YgdGhlIG1hcDsgbWF5IGJlIGVtcHR5LCBidXQgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgc2FmZUNvcHkoZmluYWwgTWFwIG1hcCwgZmluYWwgQ2xhc3Mga2V5Q2xhc3MsCi0gICAgICAgICAgICBmaW5hbCBDbGFzcyB2YWx1ZUNsYXNzLCBmaW5hbCBib29sZWFuIGFsbG93TnVsbEtleXMsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGFsbG93TnVsbFZhbHVlcykgewotICAgICAgICBpZiAobWFwID09IG51bGwgfHwga2V5Q2xhc3MgPT0gbnVsbCB8fCB2YWx1ZUNsYXNzID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotICAgICAgICBmaW5hbCBNYXAgY29weSA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChuZXcgSGFzaE1hcChtYXApKTsKLSAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlcmF0b3IgPSBjb3B5LmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBhc3NlcnRJbnN0YW5jZShlbnRyeS5nZXRLZXkoKSwga2V5Q2xhc3MsIGFsbG93TnVsbEtleXMpOwotICAgICAgICAgICAgYXNzZXJ0SW5zdGFuY2UoZW50cnkuZ2V0VmFsdWUoKSwgdmFsdWVDbGFzcywgYWxsb3dOdWxsVmFsdWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZXMgYSB0eXBlLXNhZmUgY29weSBvZiB0aGUgZ2l2ZW4gc2V0LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuCi0gICAgICogYSBzZXQgaXMgY3Jvc3NpbmcgYW4gQVBJIGJvdW5kYXJ5IChpLmUuLCBmcm9tIGEgaG9zdGlsZSBwbHVnLWluIGludG8KLSAgICAgKiBpbnRlcm5hbCBjb2RlLCBvciB2aWNlIHZlcnNhKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2V0Ci0gICAgICogICAgICAgICAgICBUaGUgc2V0IHdoaWNoIHNob3VsZCBiZSBjb3BpZWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBjCi0gICAgICogICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBhbGwgdGhlIHZhbHVlcyBtdXN0IGJlOyBtdXN0IG5vdCBiZQotICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHJldHVybiBBIGNvcHkgb2YgdGhlIHNldDsgbWF5IGJlIGVtcHR5LCBidXQgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogICAgICAgICBOb25lIG9mIGl0cyBlbGVtZW50IHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQgc2FmZUNvcHkoZmluYWwgU2V0IHNldCwgZmluYWwgQ2xhc3MgYykgewotICAgICAgICByZXR1cm4gc2FmZUNvcHkoc2V0LCBjLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZXMgYSB0eXBlLXNhZmUgY29weSBvZiB0aGUgZ2l2ZW4gc2V0LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuCi0gICAgICogYSBzZXQgaXMgY3Jvc3NpbmcgYW4gQVBJIGJvdW5kYXJ5IChpLmUuLCBmcm9tIGEgaG9zdGlsZSBwbHVnLWluIGludG8KLSAgICAgKiBpbnRlcm5hbCBjb2RlLCBvciB2aWNlIHZlcnNhKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2V0Ci0gICAgICogICAgICAgICAgICBUaGUgc2V0IHdoaWNoIHNob3VsZCBiZSBjb3BpZWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBjCi0gICAgICogICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBhbGwgdGhlIHZhbHVlcyBtdXN0IGJlOyBtdXN0IG5vdCBiZQotICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHBhcmFtIGFsbG93TnVsbEVsZW1lbnRzCi0gICAgICogICAgICAgICAgICBXaGV0aGVyIG51bGwgdmFsdWVzIHNob3VsZCBiZSBhbGxvd2VkLgotICAgICAqIEByZXR1cm4gQSBjb3B5IG9mIHRoZSBzZXQ7IG1heSBiZSBlbXB0eSwgYnV0IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IHNhZmVDb3B5KGZpbmFsIFNldCBzZXQsIGZpbmFsIENsYXNzIGMsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGFsbG93TnVsbEVsZW1lbnRzKSB7Ci0gICAgICAgIGlmIChzZXQgPT0gbnVsbCB8fCBjID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotICAgICAgICBmaW5hbCBTZXQgY29weSA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldChzZXQpKTsKLSAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlcmF0b3IgPSBjb3B5Lml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgIGFzc2VydEluc3RhbmNlKGl0ZXJhdG9yLm5leHQoKSwgYywgYWxsb3dOdWxsRWxlbWVudHMpOwotCi0gICAgICAgIHJldHVybiBzZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHV0aWxpdHkgY2xhc3MgaXMgbWVhbnQgdG8ganVzdCBwcm92aWRlIHN0YXRpYyBtZW1iZXJzLgotICAgICAqLwotICAgIHByaXZhdGUgVXRpbCgpIHsKLSAgICAgICAgLy8gU2hvdWxkIG5vdCBiZSBjYWxsZWQuCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjVlOTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDMxMWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IERlYyAyMiAxNTozNzoyNiBDU1QgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvbWVzc2FnZXMucHJvcGVydGllcz04ODU5XzEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjc0MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotI1RodSBPY3QgMjAgMTE6NDA6NDUgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnRhc2tDYXNlU2Vuc2l0aXZlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnRhc2tQcmlvcml0aWVzPU5PUk1BTCxISUdILE5PUk1BTAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIudGFza1RhZ3M9VE9ETyxGSVhNRSxYWFgKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyYmExNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVGh1IE9jdCAyMCAxMTo0MDo0NSBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTgKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT11c2VyCi1vcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQotb3JnLmVjbGlwc2UuamR0LnVpLmdldHRlcnNldHRlci51c2UuaXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztjb207Ci1vcmcuZWNsaXBzZS5qZHQudWkuamF2YWRvYz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9OTkKLW9yZy5lY2xpcHNlLmpkdC51aS5vdmVycmlkZWFubm90YXRpb249dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcz48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50IiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGdldHRlciBtZXRob2QiIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4vKipcclxuICogQHJldHVybiBSZXR1cm5zIHRoZSAke2JhcmVfZmllbGRfbmFtZX0uXHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBzZXR0ZXIgbWV0aG9kIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBlbmFibGVkXD0idHJ1ZSIgZGVsZXRlZFw9ImZhbHNlIiBhdXRvaW5zZXJ0XD0idHJ1ZSI+LyoqXHJcbiAqIEBwYXJhbSAke3BhcmFtfSBUaGUgJHtiYXJlX2ZpZWxkX25hbWV9IHRvIHNldC5cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yY29tbWVudCIgbmFtZVw9ImNvbnN0cnVjdG9yY29tbWVudCIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIGNvbnN0cnVjdG9ycyIgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBlbmFibGVkXD0idHJ1ZSIgZGVsZXRlZFw9ImZhbHNlIiBhdXRvaW5zZXJ0XD0idHJ1ZSI+LyoqXHJcbiAqICR7dGFnc31cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpbGVjb21tZW50IiBuYW1lXD0iZmlsZWNvbW1lbnQiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBKYXZhIGZpbGVzIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIENvcHlyaWdodCAoYykgJHt5ZWFyfSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cclxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xyXG4gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcclxuICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcclxuICogaHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXHJcbiAqXHJcbiAqIENvbnRyaWJ1dG9yc1w6XHJcbiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnR5cGVjb21tZW50IiBuYW1lXD0idHlwZWNvbW1lbnQiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgY29udGV4dFw9InR5cGVjb21tZW50X2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJmYWxzZSI+LyoqXHJcbiAqIEBzaW5jZSAzLjJcclxuICpcclxuICogJHt0YWdzfVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50IiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGZpZWxkcyIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBlbmFibGVkXD0idHJ1ZSIgZGVsZXRlZFw9ImZhbHNlIiBhdXRvaW5zZXJ0XD0idHJ1ZSI+LyoqXHJcbiAqIFxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPi8qKlxyXG4gKiAke3RhZ3N9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5vdmVycmlkZWNvbW1lbnQiIG5hbWVcPSJvdmVycmlkZWNvbW1lbnQiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBjb250ZXh0XD0ib3ZlcnJpZGVjb21tZW50X2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4vKiAobm9uLUphdmFkb2MpXHJcbiAqICR7c2VlX3RvX292ZXJyaWRkZW59XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSIgZGVzY3JpcHRpb25cPSJOZXdseSBjcmVhdGVkIGZpbGVzIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBlbmFibGVkXD0idHJ1ZSIgZGVsZXRlZFw9ImZhbHNlIiBhdXRvaW5zZXJ0XD0idHJ1ZSI+JHtmaWxlY29tbWVudH1cclxuJHtwYWNrYWdlX2RlY2xhcmF0aW9ufVxyXG5cclxuJHt0eXBlY29tbWVudH1cclxuJHt0eXBlX2RlY2xhcmF0aW9ufTwvdGVtcGxhdGU+PHRlbXBsYXRlIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrXHJcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5IiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXHJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yYm9keSIgbmFtZVw9ImNvbnN0cnVjdG9yYm9keSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmJvZHlfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPiR7Ym9keV9zdGF0ZW1lbnR9XHJcbi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YjwvdGVtcGxhdGU+PHRlbXBsYXRlIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPnJldHVybiAke2ZpZWxkfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4ke2ZpZWxkfSBcPSAke3BhcmFtfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2xhc3Nib2R5IiBuYW1lXD0iY2xhc3Nib2R5IiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNsYXNzIHR5cGUgYm9kaWVzIiBjb250ZXh0XD0iY2xhc3Nib2R5X2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj5cclxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmludGVyZmFjZWJvZHkiIG5hbWVcPSJpbnRlcmZhY2Vib2R5IiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGludGVyZmFjZSB0eXBlIGJvZGllcyIgY29udGV4dFw9ImludGVyZmFjZWJvZHlfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZW51bWJvZHkiIG5hbWVcPSJlbnVtYm9keSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBjb250ZXh0XD0iZW51bWJvZHlfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuYW5ub3RhdGlvbmJvZHkiIG5hbWVcPSJhbm5vdGF0aW9uYm9keSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBhbm5vdGF0aW9uIHR5cGUgYm9kaWVzIiBjb250ZXh0XD0iYW5ub3RhdGlvbmJvZHlfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPlxyXG48L3RlbXBsYXRlPjwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWU0YjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNTYXQgTWFyIDE5IDE1OjMxOjMxIEVTVCAyMDA1Ci1jb21waWxlcnMucC5kZXByZWNhdGVkPTAKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0xCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTk4YjEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLAotIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlciwKLSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJzLAotIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9uLAotIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9ucywKLSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5zd3QsCi0gb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudXBkYXRhYmxlcywKLSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IsCi0gb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9ycywKLSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52aWV3ZXJzLAotIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuYmVhbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5zd3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy52aWV3ZXJzO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qZmFjZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljMDhkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLW91dHB1dC5kYXRhYmluZGluZy5qYXIgPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2OGMzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvY29tcG9uZW50IgotICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2NvbXBvbmVudCAuLi9jb21wb25lbnQueHNkICIKLSAgIG5hbWU9IkpGYWNlIERhdGEgQmluZGluZyI+Ci0gPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmciIC8+Ci0KLSA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZyIgPgotICAgPHR5cGUgbmFtZT0iQmluZGluZ0V4Y2VwdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJCaW5kU3BlYyIvPgotICAgPHR5cGUgbmFtZT0iQ2hhbmdlRXZlbnQiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iQ29uZGl0aW9uYWxVcGRhdGFibGVWYWx1ZSIvPgotICAgPHR5cGUgbmFtZT0iQ29udmVydGVyIi8+Ci0gICA8dHlwZSBuYW1lPSJEYXRhQmluZGluZyIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJEZWZhdWx0Q2VsbE1vZGlmaWVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9IklCaW5kU3BlYyIgaW1wbGVtZW50PSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iSUJpbmRTdXBwb3J0RmFjdG9yeSIvPgotICAgPHR5cGUgbmFtZT0iSUNoYW5nZUV2ZW50IiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJJQ2hhbmdlTGlzdGVuZXIiLz4KLSAgIDx0eXBlIG5hbWU9IklDb252ZXJ0ZXIiLz4KLSAgIDx0eXBlIG5hbWU9IklEYXRhQmluZGluZ0NvbnRleHQiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9IklkZW50aXR5Q29udmVydGVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9IklVcGRhdGFibGUiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9IklVcGRhdGFibGVDb2xsZWN0aW9uIi8+Ci0gICA8dHlwZSBuYW1lPSJJVXBkYXRhYmxlRmFjdG9yeSIvPgotICAgPHR5cGUgbmFtZT0iSVVwZGF0YWJsZVZhbHVlIi8+Ci0gICA8dHlwZSBuYW1lPSJJVmFsaWRhdGlvbkNvbnRleHQiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9IklWYWxpZGF0b3IiLz4KLSAgIDx0eXBlIG5hbWU9IlByb3BlcnR5RGVzY3JpcHRpb24iIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iU2V0dGFibGVWYWx1ZSIvPgotICAgPHR5cGUgbmFtZT0iVGFibGVWaWV3ZXJEZXNjcmlwdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJVcGRhdGFibGUiLz4KLSAgIDx0eXBlIG5hbWU9IlVwZGF0YWJsZVZhbHVlIi8+Ci0gPC9wYWNrYWdlPgotCi0gPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSIvPgotCi08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE5NjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gSkZhY2UgRGF0YSBCaW5kaW5nCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvQmVhbkJpbmRTdXBwb3J0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvQmVhbkJpbmRTdXBwb3J0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODgzYjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0JlYW5CaW5kU3VwcG9ydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vIFRPRE8gZGpvOiBjb3B5cmlnaHQKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXIuSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBBIEJpbmRTdXBwb3J0RmFjdG9yeSB0aGF0IHdpbGwgYXV0b21hdGljYWxseSBncmFiIHZhbGlkYXRvcnMgZnJvbSBhbiBvYmplY3QncyBwcm9wZXJ0aWVzLAotICogaWYgYSBnZXQmbHQ7UHJvcGVydHlOYW1lPlZhbGlkYXRvciBtZXRob2QgaXMgZGVmaW5lZC4gIE1ha2VzIGl0IGVhc3kgdG8gYXNzb2NpYXRlCi0gKiB2YWxpZGF0b3JzIHdpdGggdGhlIHByb3BlcnRpZXMgdGhhdCB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IgdmFsaWRhdGluZy4KLSAqIAotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIEJlYW5CaW5kU3VwcG9ydEZhY3RvcnkgaW1wbGVtZW50cyBJQmluZFN1cHBvcnRGYWN0b3J5IHsKLQotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihDbGFzcyBmcm9tVHlwZSwgQ2xhc3MgdG9UeXBlLCBPYmplY3QgbW9kZWxEZXNjcmlwdGlvbikgewotCQlpZiAobW9kZWxEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIFByb3BlcnR5KSB7Ci0JCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSkgbW9kZWxEZXNjcmlwdGlvbjsKLQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUlEKCk7Ci0JCQlTdHJpbmcgZ2V0VmFsaWRhdG9yTWV0aG9kTmFtZSA9ICJnZXQiICsgdXBwZXJDYXNlRmlyc3RMZXR0ZXIocHJvcGVydHlOYW1lKSArICJWYWxpZGF0b3IiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQotCQkJQ2xhc3Mgb2JqZWN0Q2xhc3MgPSBwcm9wZXJ0eS5nZXRPYmplY3QoKS5nZXRDbGFzcygpOwotCQkJCi0JCQlNZXRob2QgZ2V0VmFsaWRhdG9yOwotCQkJdHJ5IHsKLQkJCQlnZXRWYWxpZGF0b3IgPSBvYmplY3RDbGFzcy5nZXRNZXRob2QoZ2V0VmFsaWRhdG9yTWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge0NsYXNzLmNsYXNzfSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCUlWYWxpZGF0b3IgcmVzdWx0ID0gKElWYWxpZGF0b3IpIGdldFZhbGlkYXRvci5pbnZva2UocHJvcGVydHkuZ2V0T2JqZWN0KCksIG5ldyBPYmplY3RbXSB7ZnJvbVR5cGV9KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLSAgICBwcml2YXRlIFN0cmluZyB1cHBlckNhc2VGaXJzdExldHRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBJQ29udmVydGVyIGNyZWF0ZUNvbnZlcnRlcihDbGFzcyBmcm9tVHlwZSwgQ2xhc3MgdG9UeXBlLCBPYmplY3QgbW9kZWxEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0JlYW5VcGRhdGFibGVGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9CZWFuVXBkYXRhYmxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDdiMTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0JlYW5VcGRhdGFibGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZzsKLQotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5iZWFucy5KYXZhQmVhblRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuYmVhbnMuSmF2YUJlYW5VcGRhdGFibGVDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLmJlYW5zLkphdmFCZWFuVXBkYXRhYmxlVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5iZWFucy5KYXZhQmVhblVwZGF0YWJsZVZhbHVlOwotCi0vKioKLSAqIEEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgdXBkYXRhYmxlIG9iamVjdHMgZm9yIHByb3BlcnRpZXMgb2YgcGxhaW4gSmF2YSBvYmplY3RzCi0gKiB3aXRoIEphdmFCZWFucy1zdHlsZSBub3RpZmljYXRpb24uCi0gKiAKLSAqIFRoaXMgZmFjdG9yeSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIG9iamVjdHM6Ci0gKiA8dWw+Ci0gKiA8bGk+b3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuUHJvcGVydHlEZXNjcmlwdGlvbjoKLSAqIDx1bD4KLSAqIDxsaT5SZXR1cm5zIGFuIHVwZGF0YWJsZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZCB2YWx1ZSBwcm9wZXJ0eSBvZgotICogdGhlIGdpdmVuIG9iamVjdCwgaWYge0BsaW5rIFByb3BlcnR5I2lzQ29sbGVjdGlvblByb3BlcnR5KCl9Ci0gKiByZXR1cm5zIGZhbHNlPC9saT4KLSAqIDxsaT5SZXR1cm5zIGFuIHVwZGF0YWJsZSBjb2xsZWN0aW9uIHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24KLSAqIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBvYmplY3QsIGlmCi0gKiB7QGxpbmsgUHJvcGVydHkjaXNDb2xsZWN0aW9uUHJvcGVydHkoKX0gcmV0dXJucyBmYWxzZTwvbGk+Ci0gKiA8L3VsPgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1maW5hbCBwdWJsaWMgY2xhc3MgQmVhblVwZGF0YWJsZUZhY3RvcnkgaW1wbGVtZW50cyBJVXBkYXRhYmxlRmFjdG9yeSB7Ci0KLQlwdWJsaWMgSVVwZGF0YWJsZSBjcmVhdGVVcGRhdGFibGUoTWFwIHByb3BlcnRpZXMsIE9iamVjdCBkZXNjcmlwdGlvbiwKLQkJCUlEYXRhQmluZGluZ0NvbnRleHQgYmluZGluZ0NvbnRleHQpIHsKLQkJaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgUHJvcGVydHkpIHsKLQkJCVByb3BlcnR5IHByb3BlcnR5RGVzY3JpcHRpb24gPSAoUHJvcGVydHkpIGRlc2NyaXB0aW9uOwotCQkJaWYgKHByb3BlcnR5RGVzY3JpcHRpb24uZ2V0T2JqZWN0KCkgIT0gbnVsbCkgewotCQkJCU9iamVjdCBvYmplY3QgPSBwcm9wZXJ0eURlc2NyaXB0aW9uLmdldE9iamVjdCgpOwotCQkJCUJlYW5JbmZvIGJlYW5JbmZvOwotCQkJCXRyeSB7Ci0JCQkJCWJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKG9iamVjdC5nZXRDbGFzcygpKTsKLQkJCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gY2Fubm90IGludHJvc3BlY3QsIGdpdmUgdXAKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCVByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnR5RGVzY3JpcHRvcnMgPSBiZWFuSW5mbwotCQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3JzW2ldOwotCQkJCQlpZiAoZGVzY3JpcHRvci5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCXByb3BlcnR5RGVzY3JpcHRpb24uZ2V0UHJvcGVydHlJRCgpKSkgewotCQkJCQkJaWYgKGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCkuaXNBcnJheSgpIHx8IENvbGxlY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShkZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpKSl7Ci0JCQkJCQkJLy8gSWYgd2UgYXJlIGEgY29sbGVjdGlvbiB0aGVtIHRoZSB0eXBlIG11c3QgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gb3JkZXIgdG8gYmUgZWRpdGVkLgotCQkJCQkJCS8vIFRoZXJlIGlzIG5vIHdheSB0byBkZXJpdmUgaXQgYnkgbmFtZSBtYXRjaGluZyAoYmVjYXVzZSBvZiBkaWZmZXJlbnQgd2F5cyBvZiBwbHVyYWxzIGJlaW5nIG1hZGUsIAotCQkJCQkJCS8vIGUuZy4gZ2V0RmxpZXMoKSBhbmQgYWRkRmx5KEZseSBhRmx5KSBvciBnZXRIb292ZXMoKSBhbmQgYWRkSG9vZihIb29mIGFIb29mKQotCQkJCQkJCUNsYXNzIGVsZW1lbnRUeXBlID0gZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5pc0FycmF5KCkgPwotCQkJCQkJCQkJZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkgOgotCQkJCQkJCQkJcHJvcGVydHlEZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eVR5cGUoKTsKLQkJCQkJCQlpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkgewotCQkJCQkJCQkvLyBJZiB3ZSBkb24ndCBrbm93IHRoZSBlbGVtZW50IHR5cGUsIHVzZSB0aGUgcG9seW1vcnBoaWMgY29udmVydGVyCi0JCQkJCQkJCS8vIFRoaXMgc2hvdWxkIHVzdWFsbHkgZ2V0IHVzIG9iamVjdCB0byBzdHJpbmcsIGJ1dCB3b24ndCBnZXQgdXMgc3RyaW5nCi0JCQkJCQkJCS8vIGJhY2sgdG8gdGhlIG9iamVjdC4gIEF0IGxlYXN0IHRoaXMgaGFuZGxlcyB0aGUgcmVhZC1vbmx5IGNhc2UgZm9yCi0JCQkJCQkJCS8vIHRhYmxlcyBhbmQgaGFuZGxlcyBDb21ib3MgYW5kIExpc3RzLgotCQkJCQkJCQllbGVtZW50VHlwZSA9IE9iamVjdC5jbGFzczsKLQkJCQkJCQl9Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiBGSVhNRTogQ29weU9mSmF2YUJlYW5VcGRhdGFibGVDb2xsZWN0aW9uIGlzIHRoZSBuZXcgSVVwZGF0YWJsZUNvbGxlY3Rpb24KLQkJCQkJCQkgKiB0aGF0IGZpeGVzIGJ1ZyAjMTE5OTMwLiAgSXQgc2VlbXMgdG8gd29yayBub3cuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcwotCQkJCQkJCSAqIGEgYnVuY2ggb2YgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhlIElVcGRhdGFibGVDb2xsZWN0aW9ucyB0aGVtc2VsdmVzCi0JCQkJCQkJICogbGlzdGVuaW5nIHRvIHRoZSBnZW5lcmljIGNoYW5nZSBldmVudCBvbiBlYWNoIG9mIHRoZSBjb2xsZWN0aW9ucycgZWxlbWVudHMuCi0JCQkJCQkJICogCi0JCQkJCQkJICogRXhhbXBsZXMgb2YgdGhpcyBpbmNsdWRlIFN0cnVjdHVyZWRWaWV3ZXJVcGRhdGFibGVWYWx1ZSBhbmQgdGhlIHRhYmxlCi0JCQkJCQkJICogaW1wbGVtZW50YXRpb25zLiAgVGhlc2UgbmVlZCB0byBiZSBmaXhlZCB0byB1c2UgSVVwZGF0YWJsZVZhbHVlcwotCQkJCQkJCSAqIHBvaW50aW5nIHRvIHRoZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIGJlaW5nIGRpc3BsYXllZC9lZGl0ZWQgcmF0aGVyIHRoYW4KLQkJCQkJCQkgKiBleHBlY3RpbmcgdGhlIElVcGRhdGFibGVDb2xsZWN0aW9uIHRvIGJlIHJlZ2lzdGVyZWQgdG8gdGhlIGdlbmVyaWMgCi0JCQkJCQkJICogcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCQkJCQkJCSAqLwotCQkJCQkJCXJldHVybiBuZXcgSmF2YUJlYW5VcGRhdGFibGVDb2xsZWN0aW9uKG9iamVjdCwKLQkJCQkJCQkJCWRlc2NyaXB0b3IsIGVsZW1lbnRUeXBlKTsKLS8vCQkJCQkJCXJldHVybiBuZXcgQ29weU9mSmF2YUJlYW5VcGRhdGFibGVDb2xsZWN0aW9uKG9iamVjdCwgZGVzY3JpcHRvciwgZWxlbWVudFR5cGUpOwotCQkJCQkJfQkJCQkJCQotCQkJCQkJcmV0dXJuIG5ldyBKYXZhQmVhblVwZGF0YWJsZVZhbHVlKG9iamVjdCwgZGVzY3JpcHRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBJVHJlZSkKLQkJCXJldHVybiBuZXcgSmF2YUJlYW5VcGRhdGFibGVUcmVlKChJVHJlZSlkZXNjcmlwdGlvbik7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgVHJlZU1vZGVsRGVzY3JpcHRpb24pIHsKLQkJCU9iamVjdCByb290ID0gKChUcmVlTW9kZWxEZXNjcmlwdGlvbilkZXNjcmlwdGlvbikuZ2V0Um9vdCgpOwkJCQotCQkJaWYgKHJvb3Q9PW51bGwgfHwgISAocm9vdCBpbnN0YW5jZW9mIElVcGRhdGFibGUpICYmICEocm9vdCBpbnN0YW5jZW9mIFByb3BlcnR5KSkgLy8gVE9ETyB3b3JrYXJvdW5kIHVudGlsIHRoZSBjb250ZXh0J3MgZmFjdG9yeSBpcyBkcml2ZW4gZmlyc3QJCSAgICAgCQkJCi0JCQkgICAgcmV0dXJuIG5ldyBKYXZhQmVhblVwZGF0YWJsZVRyZWUobmV3IEphdmFCZWFuVHJlZSgoVHJlZU1vZGVsRGVzY3JpcHRpb24pZGVzY3JpcHRpb24pKTsJCQkJCQkgCQkJCQkJCQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0JpbmRTcGVjLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9CaW5kU3BlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDEwZGEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0JpbmRTcGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyLklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3I7Ci0KLS8qKgotICogQSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBJQmluZFNwZWMsIHN1aXRhYmxlIGVpdGhlciBmb3IgaW5zdGFudGlhdGluZyBvcgotICogc3ViY2xhc3NpbmcuCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIEJpbmRTcGVjIGltcGxlbWVudHMgSUJpbmRTcGVjIHsKLQotCXByaXZhdGUgSUNvbnZlcnRlciBjb252ZXJ0ZXI7Ci0KLQlwcml2YXRlIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JcHJpdmF0ZSBmaW5hbCBJbnRlZ2VyIG1vZGVsVXBkYXRlUG9saWN5OwotCi0JcHJpdmF0ZSBmaW5hbCBJbnRlZ2VyIHZhbGlkYXRlUG9saWN5OwotCi0JcHJpdmF0ZSBmaW5hbCBJbnRlZ2VyIHRhcmdldFVwZGF0ZVBvbGljeTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBiaW5kIHNwZWMgd2l0aCB0aGUgZ2l2ZW4gY29udmVydGVyLCB2YWxpZGF0b3IsIGFuZCB1cGRhdGUKLQkgKiBwb2xpY2llcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udmVydGVyCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqIEBwYXJhbSBtb2RlbFVwZGF0ZVBvbGljeQotCSAqIEBwYXJhbSB2YWxpZGF0ZVBvbGljeQotCSAqIEBwYXJhbSB0YXJnZXRVcGRhdGVQb2xpY3kKLQkgKi8KLQlwdWJsaWMgQmluZFNwZWMoSUNvbnZlcnRlciBjb252ZXJ0ZXIsIElWYWxpZGF0b3IgdmFsaWRhdG9yLAotCQkJSW50ZWdlciBtb2RlbFVwZGF0ZVBvbGljeSwgSW50ZWdlciB2YWxpZGF0ZVBvbGljeSwKLQkJCUludGVnZXIgdGFyZ2V0VXBkYXRlUG9saWN5KSB7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJdGhpcy5tb2RlbFVwZGF0ZVBvbGljeSA9IG1vZGVsVXBkYXRlUG9saWN5OwotCQl0aGlzLnZhbGlkYXRlUG9saWN5ID0gdmFsaWRhdGVQb2xpY3k7Ci0JCXRoaXMudGFyZ2V0VXBkYXRlUG9saWN5ID0gdGFyZ2V0VXBkYXRlUG9saWN5OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBiaW5kIHNwZWMgd2l0aCB0aGUgZ2l2ZW4gY29udmVydGVyIGFuZCB2YWxpZGF0b3IuIFRoZSB1cGRhdGUKLQkgKiBwb2xpY2llcyBhcmUgc2V0IHRvIDxjb2RlPklCaW5kU3BlYy5QT0xJQ1lfQ09OVEVYVDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGNvbnZlcnRlcgotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgQmluZFNwZWMoSUNvbnZlcnRlciBjb252ZXJ0ZXIsIElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMoY29udmVydGVyLCB2YWxpZGF0b3IsIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJQ29udmVydGVyIGdldENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIGNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRNb2RlbFVwZGF0ZVBvbGljeSgpIHsKLQkJcmV0dXJuIG1vZGVsVXBkYXRlUG9saWN5OwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFRhcmdldFVwZGF0ZVBvbGljeSgpIHsKLQkJcmV0dXJuIHRhcmdldFVwZGF0ZVBvbGljeTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRWYWxpZGF0ZVBvbGljeSgpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUG9saWN5OwotCX0KLQotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyKElDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvQmluZGluZ0V4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvQmluZGluZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWNjMGQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0JpbmRpbmdFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZzsKLQotLyoqCi0gKiBBIGNoZWNrZWQgZXhjZXB0aW9uIGluZGljYXRpbmcgYSBiaW5kaW5nIHByb2JsZW0uCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIFRPRE8gQVBJIHJldmlldyBpc3N1ZTogVXNlIENvcmVFeGNlcHRpb24gaW5zdGVhZD8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgQmluZGluZ0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JLyoKLQkgKiBOZWVkZWQgYmVjYXVzZSBhbGwgVGhyb3dhYmxlcyBhcmUgU2VyaWFsaXphYmxlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MDkyODI4NDUyOTM2NzI0MjE3TDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQmluZGluZ0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIEJpbmRpbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIEJpbmRpbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvQ2hhbmdlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0NoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjZkZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLS8qKgotICogQW4gZXZlbnQgZGVzY3JpYmluZyBhIGNoYW5nZSB0byBhbiB1cGRhdGFibGUgb2JqZWN0LgotICogPHA+Ci0gKiA8Y29kZT5DaGFuZ2VFdmVudDwvY29kZT4gb2JqZWN0cyBhcmUgZGVsaXZlcmVkIHRvCi0gKiA8Y29kZT5JQ2hhbmdlRXZlbnRMaXN0ZW5lcjwvY29kZT4gb2JqZWN0cyByZWdpc3RlcmVkIHdpdGggYW4KLSAqIDxjb2RlPklVcGRhdGFibGU8L2NvZGU+IG9iamVjdCB3aGVuIGEgY2hhbmdlIG9jY3VycyBpbiB0aGUgdXBkYXRhYmxlLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgcmVtYWluCi0gKiB1bmNoYW5nZWQgZHVyaW5nIHRoZSAzLjIgcmVsZWFzZSBjeWNsZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0ICB7Ci0KLQkKLQkvKioKLQkgKiBQb3NpdGlvbiBjb25zdGFudCBkZW5vdGluZyBhIGNoYW5nZSBhZmZlY3RpbmcgbW9yZSB0aGFuIG9uZSBlbGVtZW50LCBvciBhCi0JICogY2hhbmdlIHdpdGggYW4gdW5rbm93biBwb3NpdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NJVElPTl9VTktOT1dOID0gLTE7Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdHlwZSBjb25zdGFudCBkZW5vdGluZyBhIGdlbmVyYWwgY2hhbmdlLiBJZiB0aGUgc291cmNlIGlzIGEKLQkgKiBsaXN0LCBnZXRQb3NpdGlvbigpIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjaGFuZ2VkIGVsZW1lbnQsIG9yCi0JICogPGNvZGU+UE9TSVRJT05fVU5LTk9XTjwvY29kZT4gaWYgbW9yZSB0aGFuIG9uZSBlbGVtZW50IHdhcyBjaGFuZ2VkLAotCSAqIGFkZGVkIG9yIHJlbW92ZWQsIG9yIGlmIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhbmdlZCwgYWRkZWQgb3IgcmVtb3ZlZAotCSAqIGVsZW1lbnQgaXMgbm90IGtub3duLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRSA9IDE7Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdHlwZSBjb25zdGFudCBkZW5vdGluZyBhbiBhZGRpdGlvbiBvZiBhbiBlbGVtZW50IHRvIGEgbGlzdC4gVGhlCi0JICogYWRkZWQgZWxlbWVudCB3aWxsIGJlIHJldHVybmVkIGJ5IGdldE5ld1ZhbHVlKCksIGFuZCB0aGUgcG9zaXRpb24gb2YgdGhlCi0JICogYWRkZWQgZWxlbWVudCB3aWxsIGJlIHJldHVybmVkIGJ5IGdldFBvc2l0aW9uKCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREID0gMjsKLQotCS8qKgotCSAqIENoYW5nZSB0eXBlIGNvbnN0YW50IGRlbm90aW5nIGEgcmVtb3ZhbCBvZiBhbiBlbGVtZW50IGZyb20gYSBsaXN0LiBUaGUKLQkgKiByZW1vdmVkIGVsZW1lbnQgd2lsbCBiZSByZXR1cm5lZCBieSBnZXRPbGRWYWx1ZSgpLCBhbmQgdGhlIHBvc2l0aW9uIG9mCi0JICogdGhlIHJlbW92ZWQgZWxlbWVudCBiZWZvcmUgdGhlIHJlbW92YWwgd2lsbCBiZSByZXR1cm5lZCBieSBnZXRQb3NpdGlvbigpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IDM7Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdHlwZSBjb25zdGFudCB1c2VkIHRvIGluZm9ybSBsaXN0ZW5lcnMgYWJvdXQgYSBwZW5kaW5nIGNoYW5nZSB0aGF0Ci0JICogY2FuIHN0aWxsIGJlIHZldG9lZC4gVGhlIHVwZGF0YWJsZSdzIHZhbHVlIGhhcyBub3QgYmVlbiBjaGFuZ2VkIHlldCwKLQkgKiA8Y29kZT5nZXROZXdWYWx1ZSgpPC9jb2RlPiByZXR1cm5zIHRoZSBuZXcgdmFsdWUgdGhhdCB3aWxsIGJlIHRoZQotCSAqIHVwZGF0YWJsZSdzIG5ldyB2YWx1ZSBpZiB0aGUgY2hhbmdlIGlzIG5vdCB2ZXRvZWQgYnkgY2FsbGluZwotCSAqIDxjb2RlPnNldFZldG8odHJ1ZSk8L2NvZGU+LgotCSAqIFRPRE8gdHVybiB0aGlzIGludG8gZmxhZ3MsIHNvIHRoYXQgd2UgY2FuCi0JICogZXhwcmVzcyBwcmUtYWRkIGV0Yy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJJRlkgPSA0OwotCQotCS8qKgotCSAqIENoYW5nZSB0eXBlIGNvbnN0YW50IGRlbm90aW5nIGEgY29tcGxldGUgcmVwbGFjZW1lbnQgb2YgYSBsaXN0LiBUaGUKLQkgKiBhZGRlZCBsaXN0IHdpbGwgYmUgcmV0dXJuZWQgYnkgZ2V0TmV3VmFsdWUoKSwgYW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUKLQkgKiBhZGRlZCBlbGVtZW50IHdpbGwgYmUgcmV0dXJuZWQgYnkgZ2V0UG9zaXRpb24oKS4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRSA9IDU7Ci0JCQotCS8qKgotCSAqIENoYW5nZSB0eXBlIGNvbnN0YW50IHRoYXQgaXMgdXNlZCB0byBpbmZvcm0gYSBsaXN0ZW5lciB0aGF0IGEgdmlydHVhbCBkYXRhIGlzIGJlaW5nCi0JICogcmVxdWVzdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJUlRVQUwgPSA2OwotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwcml2YXRlIGZpbmFsIGludCBjaGFuZ2VUeXBlOwotCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkKLQlwcml2YXRlIGZpbmFsIE9iamVjdCBwYXJlbnQ7Ci0KLQlwcml2YXRlIGZpbmFsIGludCBwb3NpdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiB2ZXRvZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gY2hhbmdlVHlwZQotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqLwotCXB1YmxpYyBDaGFuZ2VFdmVudChPYmplY3Qgc291cmNlLCBpbnQgY2hhbmdlVHlwZSwgT2JqZWN0IG9sZFZhbHVlLAotCQkJT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMoc291cmNlLCBjaGFuZ2VUeXBlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIFBPU0lUSU9OX1VOS05PV04pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gY2hhbmdlVHlwZQotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqLwotCXB1YmxpYyBDaGFuZ2VFdmVudChPYmplY3Qgc291cmNlLCBpbnQgY2hhbmdlVHlwZSwgT2JqZWN0IG9sZFZhbHVlLAotCQkJT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zaXRpb24pIHsKLQkJdGhpcyhzb3VyY2UsIGNoYW5nZVR5cGUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgbnVsbCwgcG9zaXRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIGNoYW5nZVR5cGUKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiBAcGFyYW0gcGFyZW50IAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqLwotCXB1YmxpYyBDaGFuZ2VFdmVudChPYmplY3Qgc291cmNlLCBpbnQgY2hhbmdlVHlwZSwgT2JqZWN0IG9sZFZhbHVlLAotCQkJT2JqZWN0IG5ld1ZhbHVlLCBPYmplY3QgcGFyZW50LCBpbnQgcG9zaXRpb24pIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQl0aGlzLmNoYW5nZVR5cGUgPSBjaGFuZ2VUeXBlOwotCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247CQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFuZ2UgdHlwZSAoQ0hBTkdFLCBBREQsIG9yIFJFTU9WRSkuCi0JICogCi0JICogQHJldHVybiB0aGUgY2hhbmdlIHR5cGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoYW5nZVR5cGUoKSB7Ci0JCXJldHVybiBjaGFuZ2VUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIGFmdGVyIHRoZSBjaGFuZ2UsIGlmIGF2YWlsYWJsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB0aGUgY2hhbmdlIGlzIGEgcmVtb3ZhbCBmcm9tIGEgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUsIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5ld1ZhbHVlKCkgewotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgYmVmb3JlIHRoZSBjaGFuZ2UsIGlmIGF2YWlsYWJsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB0aGUgY2hhbmdlIGlzIGFuIGFkZGl0aW9uIHRvIGEgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUsIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9sZFZhbHVlKCkgewotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHVwZGF0YWJsZSBpcyBhIGxpc3QsIHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYW5nZWQgZWxlbWVudCwKLQkgKiBvciBQT1NJVElPTl9BTEwgaWYgbW9yZSB0aGFuIG9uZSBlbGVtZW50IHdhcyBjaGFuZ2VkLCBhZGRlZCBvciByZW1vdmVkLgotCSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdW5zcGVjaWZpZWQgaWYgdGhlIHVwZGF0YWJsZSBpcyBub3QgYSBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFuZ2VkIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgewotCQlyZXR1cm4gcG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGNoYW5nZSBldmVudCBpcyBvZiB0eXBlIFZFUklGWSwgdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoaXMKLQkgKiBldmVudCBoYXMgYmVlbiB2ZXRvZWQgYnkgYSBsaXN0ZW5lci4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGFuZ2UgaGFzIGJlZW4gdmV0b2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFZldG8oKSB7Ci0JCXJldHVybiB2ZXRvZWQ7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGNoYW5nZSBldmVudCBpcyBvZiB0eXBlIFZFUklGWSwgbGlzdGVuZXJzIGNhbiBjYWxsIHRoaXMgbWV0aG9kIHRvCi0JICogdmV0byB0aGUgY2hhbmdlLgotCSAqIAotCSAqIEBwYXJhbSB2ZXRvCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmV0byhib29sZWFuIHZldG8pIHsKLQkJdmV0b2VkID0gdmV0bzsKLQl9Ci0KLQkvKioKLQkgKiBwYXJlbnQgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0cmVlIHN0cnVjdHVyZXMuCi0JICogQHJldHVybiBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0RhdGFCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9EYXRhQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjk2YTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0RhdGFCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5EYXRhQmluZGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBQcm92aWRlcyBzdGF0aWMgbWV0aG9kcyB0byBjcmVhdGUgZGF0YSBiaW5kaW5nIGNvbnRleHRzLiAgSXRzIHNvbGUgcHVycG9zZQotICogaXMgdG8gcHJvdmlkZSBhbiBBUEkgZm9yIGNyZWF0aW5nIElEYXRhQmluZGluZ0NvbnRleHQgaW1wbGVtZW50YXRpb25zLgotICogPHA+Ci0gKiBJbiBvcmRlciB0byB1c2UgdGhpcyBjbGFzcywgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBlYWNoIHByb2plY3QgY3JlYXRlIGl0cwotICogb3duIHN0YXRpYyAmbHQ7cHJvamVjdE5hbWUmZ3Q7QmluZGluZyBzaW1pbGFyIHRvIHRoZSBvbmUgaW4gdGhlIAotICogb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcgIHBhY2thZ2UgaW4gdGhlIAotICogb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcgcGx1Z2luLgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHJlbWFpbgotICogdW5jaGFuZ2VkIGR1cmluZyB0aGUgMy4yIHJlbGVhc2UgY3ljbGUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhQmluZGluZyB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IGRhdGEgYmluZGluZyBjb250ZXh0IG9uIHdoaWNoIHRoZSBnaXZlbiBmYWN0b3JpZXMgaGF2ZSBiZWVuCi0JICogcmVnaXN0ZXJlZCB1c2luZwotCSAqIHtAbGluayBJRGF0YUJpbmRpbmdDb250ZXh0I2FkZFVwZGF0YWJsZUZhY3RvcnkoSVVwZGF0YWJsZUZhY3RvcnkpfS4gVGhlCi0JICogZmFjdG9yaWVzIHdpbGwgYmUgYWRkZWQgaW4gdGhlIG9yZGVyIGdpdmVuLgotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3JpZXMKLQkgKiBAcmV0dXJuIGEgZGF0YSBiaW5kaW5nIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElEYXRhQmluZGluZ0NvbnRleHQgY3JlYXRlQ29udGV4dCgKLQkJCUlVcGRhdGFibGVGYWN0b3J5W10gZmFjdG9yaWVzKSB7Ci0JCURhdGFCaW5kaW5nQ29udGV4dCByZXN1bHQgPSBuZXcgRGF0YUJpbmRpbmdDb250ZXh0KCk7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVzdWx0LmFkZFVwZGF0YWJsZUZhY3RvcnkoZmFjdG9yaWVzW2ldKTsKLQkJCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZGF0YSBiaW5kaW5nIGNvbnRleHQgd2hvc2UgbGlmZWN5Y2xlIGlzIGJvdW5kIHRvIGFuIFNXVAotCSAqIGNvbnRyb2wsIHVzaW5nIHRoZSBnaXZlbiBmYWN0b3JpZXMgdG8gY3JlYXRlIHVwZGF0YWJsZSBvYmplY3RzIGZyb20KLQkgKiBkZXNjcmlwdGlvbiBvYmplY3RzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kOyBpdHMgaW1wbGVtZW50YXRpb24gY3JlYXRlcyBhIG5ldwotCSAqIGRhdGEgYmluZGluZyBjb250ZXh0IGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2NyZWF0ZUNvbnRleHQoSVVwZGF0YWJsZUZhY3RvcnlbXSl9IGFuZCByZWdpc3RlcnMgYSBkaXNwb3NlCi0JICogbGlzdGVuZXIgb24gdGhlIGdpdmVuIGNvbnRyb2wgYW5kIGNhbGxzCi0JICoge0BsaW5rIElEYXRhQmluZGluZ0NvbnRleHQjZGlzcG9zZSgpfSB3aGVuIHRoZSBjb250cm9sIGlzIGRpc3Bvc2VkIG9mLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSBmYWN0b3JpZXMKLQkgKiBAcmV0dXJuIGEgZGF0YSBiaW5kaW5nIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElEYXRhQmluZGluZ0NvbnRleHQgY3JlYXRlQ29udGV4dChDb250cm9sIGNvbnRyb2wsCi0JCQlJVXBkYXRhYmxlRmFjdG9yeVtdIGZhY3RvcmllcykgewotCQlmaW5hbCBJRGF0YUJpbmRpbmdDb250ZXh0IHJlc3VsdCA9IGNyZWF0ZUNvbnRleHQoZmFjdG9yaWVzKTsKLQkJY29udHJvbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlyZXN1bHQuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0lCaW5kU3BlYy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSUJpbmRTcGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNjQwYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSUJpbmRTcGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXIuSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgcmVtYWluCi0gKiB1bmNoYW5nZWQgZHVyaW5nIHRoZSAzLjIgcmVsZWFzZSBjeWNsZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCaW5kU3BlYyB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udmVydGVyIHRvIGJlIHVzZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEgZGVmYXVsdAotCSAqIGNvbnZlcnRlciBzaG91bGQgYmUgdXNlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIElDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsaWRhdG9yIHRvIGJlIHVzZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEgZGVmYXVsdAotCSAqIHZhbGlkYXRvciBzaG91bGQgYmUgdXNlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXBkYXRlIHBvbGljeSB0byBiZSB1c2VkIGZvciB1cGRhdGluZyB0aGUgbW9kZWwgd2hlbiB0aGUgdGFyZ2V0IGhhcyBjaGFuZ2VkCi0JICogQHJldHVybiB0aGUgdXBkYXRlIHBvbGljeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5zcGVjaWZpZWQKLQkgKiAKLQkgKiBAc2VlIElEYXRhQmluZGluZ0NvbnRleHQjUE9MSUNZX0FVVE9NQVRJQwotCSAqIEBzZWUgSURhdGFCaW5kaW5nQ29udGV4dCNQT0xJQ1lfRVhQTElDSVQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRNb2RlbFVwZGF0ZVBvbGljeSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbGlkYXRlIHBvbGljeSB0byBiZSB1c2VkIGZvciB2YWxpZGF0aW5nIGNoYW5nZXMgdG8gdGhlIHRhcmdldAotCSAqIEByZXR1cm4gdGhlIHVwZGF0ZSBwb2xpY3ksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuc3BlY2lmaWVkCi0JICogCi0JICogQHNlZSBJRGF0YUJpbmRpbmdDb250ZXh0I1BPTElDWV9BVVRPTUFUSUMKLQkgKiBAc2VlIElEYXRhQmluZGluZ0NvbnRleHQjUE9MSUNZX0VYUExJQ0lUCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0VmFsaWRhdGVQb2xpY3koKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1cGRhdGUgcG9saWN5IHRvIGJlIHVzZWQgZm9yIHVwZGF0aW5nIHRoZSB0YXJnZXQgd2hlbiB0aGUgbW9kZWwgaGFzIGNoYW5nZWQKLQkgKiBAcmV0dXJuIHRoZSB1cGRhdGUgcG9saWN5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bnNwZWNpZmllZAotCSAqIAotCSAqIEBzZWUgSURhdGFCaW5kaW5nQ29udGV4dCNQT0xJQ1lfQVVUT01BVElDCi0JICogQHNlZSBJRGF0YUJpbmRpbmdDb250ZXh0I1BPTElDWV9FWFBMSUNJVAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldFRhcmdldFVwZGF0ZVBvbGljeSgpOwotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSUJpbmRTdXBwb3J0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSUJpbmRTdXBwb3J0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM3YmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0lCaW5kU3VwcG9ydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvci5JVmFsaWRhdG9yOwotCi0vKioKLSAqIEEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgdmFsaWRhdG9ycyBhbmQgY29udmVydGVycy4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCaW5kU3VwcG9ydEZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHZhbGlkYXRvciBmb3IgdGhlIGdpdmVuIGZyb20gYW5kIHRvIHR5cGVzIGFuZCBtb2RlbAotCSAqIGRlc2NyaXB0aW9uLiBFaXRoZXIgdG9UeXBlIG9yIG1vZGVsRGVzY3JpcHRpb24gY2FuIGJlIG51bGwsIGJ1dCBub3QgYm90aC4KLQkgKiBUaGUgcmV0dXJuZWQgdmFsaWRhdG9yIChpZiBub3QgbnVsbCkgc2hvdWxkIHZhbGlkYXRlIGFyYml0cmFyeSB2YWx1ZXMgb2YKLQkgKiB0eXBlIHRvVHlwZSwgYW5kIChpbiB0aGUgY2FzZSB0aGF0IHRvVHlwZSBpcyBnaXZlbikgZW5zdXJlIHRoYXQgdGhleSBjYW4KLQkgKiBiZSBjb252ZXJ0ZWQgdG8gdG9UeXBlLCBhbmQgKGluIHRoZSBjYXNlIHRoYXQgbW9kZWxEZXNjcmlwdGlvbiBpcyBnaXZlbikKLQkgKiBlbnN1cmUgdGhhdCB0aGV5IGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhlIHR5cGUgZXhwZWN0ZWQgYnkgdXBkYXRhYmxlCi0JICogb2JqZWN0cyBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIG1vZGVsIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmcm9tVHlwZQotCSAqICAgICAgICAgICAgVGhlIHR5cGUgdG8gdmFsaWRhdGUKLQkgKiBAcGFyYW0gdG9UeXBlCi0JICogICAgICAgICAgICBUaGUgdHlwZSB0byBjb252ZXJ0IHRvIGFmdGVyIHN1Y2Nlc3NmdWwgdmFsaWRhdGlvbiwgb3IKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBrbm93bgotCSAqIEBwYXJhbSBtb2RlbERlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBUaGUgbW9kZWwgZGVzY3JpcHRpb24gb2JqZWN0IHBhc3NlZCB0bwotCSAqICAgICAgICAgICAgRGF0YUJpbmRpbmdDb250ZXh0I2JpbmQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBrbm93bgotCSAqIEByZXR1cm4gYSB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZmFjdG9yeSBjYW5ub3QgY3JlYXRlCi0JICogICAgICAgICBhIHZhbGlkYXRvciBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cy4KLQkgKi8KLQlJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihDbGFzcyBmcm9tVHlwZSwgQ2xhc3MgdG9UeXBlLAotCQkJT2JqZWN0IG1vZGVsRGVzY3JpcHRpb24pOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbnZlcnRlciBmb3IgdGhlIGdpdmVuIGZyb20gYW5kIHRvIHR5cGVzIGFuZCBtb2RlbAotCSAqIGRlc2NyaXB0aW9uLiBFaXRoZXIgdG9UeXBlIG9yIG1vZGVsRGVzY3JpcHRpb24gY2FuIGJlIG51bGwsIGJ1dCBub3QgYm90aC4KLQkgKiBUaGUgcmV0dXJuZWQgY29udmVydGVyIChpZiBub3QgbnVsbCkgc2hvdWxkIGNvbnZlcnQgdmFsdWVzIG9mIHR5cGUKLQkgKiBmcm9tVHlwZSB0byB2YWx1ZXMgb2YgdHlwZSB0b1R5cGUgKGluIHRoZSBjYXNlIHRoYXQgdG9UeXBlIGlzIGdpdmVuKSwgYW5kCi0JICogKGluIHRoZSBjYXNlIHRoYXQgbW9kZWxEZXNjcmlwdGlvbiBpcyBnaXZlbikgY29udmVydCB0byB0aGUgdHlwZSBleHBlY3RlZAotCSAqIGJ5IHVwZGF0YWJsZSBvYmplY3RzIGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gbW9kZWwgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGZyb21UeXBlCi0JICogICAgICAgICAgICBUaGUgdHlwZSB0byBjb252ZXJ0IGZyb20KLQkgKiBAcGFyYW0gdG9UeXBlCi0JICogICAgICAgICAgICBUaGUgdHlwZSB0byBjb252ZXJ0IHRvLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qga25vd24KLQkgKiBAcGFyYW0gbW9kZWxEZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIGRlc2NyaXB0aW9uIG9iamVjdCBwYXNzZWQgdG8KLQkgKiAgICAgICAgICAgIERhdGFCaW5kaW5nQ29udGV4dCNiaW5kLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qga25vd24KLQkgKiBAcmV0dXJuIGEgY29udmVydGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGZhY3RvcnkgY2Fubm90IGNyZWF0ZQotCSAqICAgICAgICAgYSBjb252ZXJ0ZXIgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMuCi0JICovCi0JSUNvbnZlcnRlciBjcmVhdGVDb252ZXJ0ZXIoQ2xhc3MgZnJvbVR5cGUsIENsYXNzIHRvVHlwZSwKLQkJCU9iamVjdCBtb2RlbERlc2NyaXB0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0lDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjY3MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmc7Ci0KLS8qKgotICogQSBsaXN0ZW5lciB0aGF0IGNhbiBiZSBub3RpZmllZCBvZiBjaGFuZ2VzIHRvIG9iamVjdHMgb2YgdHlwZQotICoge0BsaW5rIElVcGRhdGFibGV9LgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHJlbWFpbgotICogdW5jaGFuZ2VkIGR1cmluZyB0aGUgMy4yIHJlbGVhc2UgY3ljbGUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBjaGFuZ2VFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUNoYW5nZShDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSURhdGFCaW5kaW5nQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSURhdGFCaW5kaW5nQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGRmNmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0lEYXRhQmluZGluZ0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXIuSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBBIGNvbnRleHQgZm9yIGJpbmRpbmcgdXBkYXRhYmxlIG9iamVjdHMgd2l0aCBhIHNoYXJlZCBsaWZlY3ljbGUuIFRoZQotICogZmFjdG9yaWVzIHJlZ2lzdGVyZWQgd2l0aCBhIGRhdGEgYmluZGluZyBjb250ZXh0IGRldGVybWluZSBob3cgdXBkYXRhYmxlCi0gKiBvYmplY3RzIGFyZSBjcmVhdGVkIGZyb20gZGVzY3JpcHRpb24gb2JqZWN0cywgYW5kIHdoaWNoIGNvbnZlcnRlcnMgYW5kCi0gKiB2YWxpZGF0b3JzIGFyZSB1c2VkIHdoZW4gbm8gc3BlY2lmaWMgY29udmVydGVyIG9yIHZhbGlkYXRvciBpcyBnaXZlbi4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHJlbWFpbgotICogdW5jaGFuZ2VkIGR1cmluZyB0aGUgMy4yIHJlbGVhc2UgY3ljbGUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFCaW5kaW5nQ29udGV4dCB7Ci0KLQkvKioKLQkgKiBQb2xpY3kgY29uc3RhbnQgc3BlY2lmeWluZyB0aGF0IHVwZGF0ZSBvciB2YWxpZGF0aW9uIHNob3VsZCBvY2N1cgotCSAqIGF1dG9tYXRpY2FsbHkgd2hlbmV2ZXIgYSBib3VuZCB1cGRhdGFibGUgb2JqZWN0IGdlbmVyYXRlcyBhIGNoYW5nZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT0xJQ1lfQVVUT01BVElDID0gMTsKLQotCS8qKgotCSAqIFBvbGljeSBjb25zdGFudCBzcGVjaWZ5aW5nIHRoYXQgdXBkYXRlIG9yIHZhbGlkYXRpb24gc2hvdWxkIG9ubHkgb2NjdXIKLQkgKiB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVNb2RlbHMoKSB9IG9yCi0JICoge0BsaW5rICN1cGRhdGVUYXJnZXRzKCkgfS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT0xJQ1lfRVhQTElDSVQgPSAyOwotCQotCS8qKgotCSAqIENvbnN0YW50IHNwZWNpZml5aW5nIHRoYXQgdmFsaWRhdGlvbiBvciB1cGRhdGUgZXZlbnRzIGZyb20gVUkgdXBkYXRhYmxlcwotCSAqIHNob3VsZCBiZSB0cmlnZ2VyZWQgZWFybHksIHR5cGljYWxseSBvbiBlYWNoIGtleXN0cm9rZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FX0VBUkxZID0gMDsKLQkvKioKLQkgKiBDb25zdGFudCBzcGVjaWZpeWluZyB0aGF0IHZhbGlkYXRpb24gb3IgdXBkYXRlIGV2ZW50cyBmcm9tIFVJIHVwZGF0YWJsZXMKLQkgKiBzaG91bGQgYmUgdHJpZ2dlcmVkIGxhdGUsIHR5cGljYWxseSBvbiBmb2N1cyBsb3N0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVfTEFURSA9IDE7CQotCQotCi0JLyoqCi0JICogQWRkcyBhIGZhY3RvcnkgdGhhdCBjYW4gY3JlYXRlIGNvbnZlcnRlcnMgYW5kIHZhbGlkYXRvcnMuIFRoZSBsaXN0IG9mCi0JICogYmluZCBzdXBwb3J0IGZhY3RvcmllcyBpcyB1c2VkIGZvciBjcmVhdGluZyBjb252ZXJ0ZXJzIGFuZCB2YWxpZGF0b3JzCi0JICogd2hlbiBiaW5kaW5nIHdpdGhvdXQgc3BlY2lmeWluZyBhIGNvbnZlcnRlciBvciB2YWxpZGF0b3IuCi0JICogCi0JICogQHBhcmFtIGZhY3RvcnkKLQkgKiAgICAgICAgICAgIHRoZSBmYWN0b3J5IHRvIGFkZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCaW5kU3VwcG9ydEZhY3RvcnkoSUJpbmRTdXBwb3J0RmFjdG9yeSBmYWN0b3J5KTsKLQotCS8qKgotCSAqIEFkZHMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyB1cGRhdGFibGUgb2JqZWN0cyBmcm9tIGRlc2NyaXB0aW9uIG9iamVjdHMgdG8KLQkgKiB0aGlzIGNvbnRleHQuIFRoZSBsaXN0IG9mIHVwZGF0YWJsZSBmYWN0b3JpZXMgaXMgdXNlZCBmb3IgY3JlYXRpbmcKLQkgKiB1cGRhdGFibGUgb2JqZWN0cyB3aGVuIGJpbmRpbmcgYmFzZWQgb24gZGVzY3JpcHRpb24gb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gdXBkYXRhYmxlRmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFVwZGF0YWJsZUZhY3RvcnkoSVVwZGF0YWJsZUZhY3RvcnkgdXBkYXRhYmxlRmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBCaW5kcyB0YXJnZXRVcGRhdGFibGUgYW5kIG1vZGVsVXBkYXRhYmxlIHVzaW5nIGNvbnZlcnRlciBhbmQgdmFsaWRhdG9yIGFzCi0JICogc3BlY2lmaWVkIGluIGJpbmRTcGVjLiBJZiBiaW5kU3BlYyBpcyBudWxsLCBhIGRlZmF1bHQgY29udmVydGVyIGFuZAotCSAqIHZhbGlkYXRvciBpcyB1c2VkLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXRVcGRhdGFibGUKLQkgKiBAcGFyYW0gbW9kZWxVcGRhdGFibGUKLQkgKiBAcGFyYW0gYmluZFNwZWMKLQkgKiAgICAgICAgICAgIHRoZSBiaW5kIHNwZWMsIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBiaW5kKElVcGRhdGFibGUgdGFyZ2V0VXBkYXRhYmxlLCBJVXBkYXRhYmxlIG1vZGVsVXBkYXRhYmxlLAotCQkJSUJpbmRTcGVjIGJpbmRTcGVjKSA7Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gYmluZCB0YXJnZXRVcGRhdGFibGUgYW5kCi0JICogY3JlYXRlVXBkYXRhYmxlKG1vZGVsRGVzY3JpcHRpb24pLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXRVcGRhdGFibGUKLQkgKiBAcGFyYW0gbW9kZWxEZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBiaW5kU3BlYwotCSAqICAgICAgICAgICAgdGhlIGJpbmQgc3BlYywgb3IgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIGJpbmQoSVVwZGF0YWJsZSB0YXJnZXRVcGRhdGFibGUsIE9iamVjdCBtb2RlbERlc2NyaXB0aW9uLAotCQkJSUJpbmRTcGVjIGJpbmRTcGVjKTsKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBiaW5kIGNyZWF0ZVVwZGF0YWJsZSh0YXJnZXREZXNjcmlwdGlvbikgYW5kCi0JICogbW9kZWxVcGRhdGFibGUuCi0JICogCi0JICogQHBhcmFtIHRhcmdldERlc2NyaXB0aW9uCi0JICogQHBhcmFtIG1vZGVsVXBkYXRhYmxlCi0JICogQHBhcmFtIGJpbmRTcGVjCi0JICogICAgICAgICAgICB0aGUgYmluZCBzcGVjLCBvciBudWxsCi0JICovCi0JcHVibGljIHZvaWQgYmluZChPYmplY3QgdGFyZ2V0RGVzY3JpcHRpb24sIElVcGRhdGFibGUgbW9kZWxVcGRhdGFibGUsCi0JCQlJQmluZFNwZWMgYmluZFNwZWMpIDsKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBiaW5kIGNyZWF0ZVVwZGF0YWJsZSh0YXJnZXREZXNjcmlwdGlvbikgYW5kCi0JICogY3JlYXRlVXBkYXRhYmxlKG1vZGVsRGVzY3JpcHRpb24pLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXREZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBtb2RlbERlc2NyaXB0aW9uCi0JICogQHBhcmFtIGJpbmRTcGVjCi0JICogICAgICAgICAgICB0aGUgYmluZCBzcGVjLCBvciBudWxsCi0JICovCi0JcHVibGljIHZvaWQgYmluZChPYmplY3QgdGFyZ2V0RGVzY3JpcHRpb24sIE9iamVjdCBtb2RlbERlc2NyaXB0aW9uLAotCQkJSUJpbmRTcGVjIGJpbmRTcGVjKSA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHVwZGF0YWJsZSBvYmplY3QgZnJvbSBhIGRlc2NyaXB0aW9uLiBEZXNjcmlwdGlvbiBvYmplY3RzIGFyZQotCSAqIGludGVycHJldGVkIGJ5IGltcGxlbWVudG9ycyBvZiBJVXBkYXRhYmxlRmFjdG9yeSwgdGhlIGRhdGEgYmluZGluZwotCSAqIGZyYW1ld29yayBkb2VzIG5vdCBpbXBvc2UgYW55IHNlbWFudGljcyBvbiB0aGVtLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4gSVVwZGF0YWJsZSBmb3IgdGhlIGdpdmVuIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIElVcGRhdGFibGUgY3JlYXRlVXBkYXRhYmxlKE9iamVjdCBkZXNjcmlwdGlvbik7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmVzdGVkIHVwZGF0YWJsZSBvYmplY3QgZnJvbSBhIGRlc2NyaXB0aW9uLiBEZXNjcmlwdGlvbiBvYmplY3RzIGFyZQotCSAqIGludGVycHJldGVkIGJ5IGltcGxlbWVudG9ycyBvZiBJVXBkYXRhYmxlRmFjdG9yeSwgdGhlIGRhdGEgYmluZGluZwotCSAqIGZyYW1ld29yayBkb2VzIG5vdCBpbXBvc2UgYW55IHNlbWFudGljcyBvbiB0aGVtLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4gSVVwZGF0YWJsZSBmb3IgdGhlIGdpdmVuIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIElVcGRhdGFibGUgY3JlYXRlTmVzdGVkVXBkYXRhYmxlKE5lc3RlZFByb3BlcnR5IG5lc3RlZFByb3BlcnR5KTsKLQotCS8qKgotCSAqIFRyaWVzIHRvIGNyZWF0ZSBhIHZhbGlkYXRvciB0aGF0IGNhbiB2YWxpZGF0ZSB2YWx1ZXMgb2YgdHlwZSBmcm9tVHlwZS4KLQkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHZhbGlkYXRvciBjb3VsZCBiZSBjcmVhdGVkLiBFaXRoZXIKLQkgKiB0b1R5cGUgb3IgbW9kZWxEZXNjcmlwdGlvbiBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4sIGJ1dCBub3QgYm90aC4gVGhlCi0JICogaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBpdGVyYXRlIG92ZXIgdGhlIHJlZ2lzdGVyZWQgYmluZAotCSAqIHN1cHBvcnQgZmFjdG9yaWVzIGluIHJldmVyc2Ugb3JkZXIsIHBhc3NpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cyB0bwotCSAqIHtAbGluayBJQmluZFN1cHBvcnRGYWN0b3J5I2NyZWF0ZVZhbGlkYXRvcihDbGFzcywgQ2xhc3MsIE9iamVjdCl9LiBUaGUKLQkgKiBmaXJzdCBub24tbnVsbCB2YWxpZGF0b3Igd2lsbCBiZSByZXR1cm5lZC4gCi0JICogQHBhcmFtIGZyb21UeXBlCi0JICogQHBhcmFtIHRvVHlwZQotCSAqIEBwYXJhbSBtb2RlbERlc2NyaXB0aW9uCi0JICogQHJldHVybiBhbiBJVmFsaWRhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bnN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoQ2xhc3MgZnJvbVR5cGUsIENsYXNzIHRvVHlwZSwKLQkJCU9iamVjdCBtb2RlbERlc2NyaXB0aW9uKTsKLQotCS8qKgotCSAqIFRyaWVzIHRvIGNyZWF0ZSBhIGNvbnZlcnRlciB0aGF0IGNhbiBjb252ZXJ0IGZyb20gdmFsdWVzIG9mIHR5cGUgZnJvbVR5cGUuCi0JICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjb252ZXJ0ZXIgY291bGQgYmUgY3JlYXRlZC4gRWl0aGVyCi0JICogdG9UeXBlIG9yIG1vZGVsRGVzY3JpcHRpb24gY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LCBidXQgbm90IGJvdGguIFRoZQotCSAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgaXRlcmF0ZSBvdmVyIHRoZSByZWdpc3RlcmVkIGJpbmQKLQkgKiBzdXBwb3J0IGZhY3RvcmllcyBpbiByZXZlcnNlIG9yZGVyLCBwYXNzaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgdG8KLQkgKiB7QGxpbmsgSUJpbmRTdXBwb3J0RmFjdG9yeSNjcmVhdGVDb252ZXJ0ZXIoQ2xhc3MsIENsYXNzLCBPYmplY3QpfS4gVGhlCi0JICogZmlyc3Qgbm9uLW51bGwgY29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuIAotCSAqIEBwYXJhbSBmcm9tVHlwZQotCSAqIEBwYXJhbSB0b1R5cGUKLQkgKiBAcGFyYW0gbW9kZWxEZXNjcmlwdGlvbgotCSAqIEByZXR1cm4gYW4gSUNvbnZlcnRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5zdWNjZXNzZnVsCi0JICovCi0JcHVibGljIElDb252ZXJ0ZXIgY3JlYXRlQ29udmVydGVyKENsYXNzIGZyb21UeXBlLCBDbGFzcyB0b1R5cGUsCi0JCQlPYmplY3QgbW9kZWxEZXNjcmlwdGlvbik7Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIGRhdGEgYmluZGluZyBjb250ZXh0IGFuZCBhbGwgdXBkYXRhYmxlIG9iamVjdHMgY3JlYXRlZAotCSAqIGluIHRoaXMgY29udGV4dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIGFsbCB0YXJnZXQgdXBkYXRhYmxlIG9iamVjdHMgdG8gcmVmbGVjdCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKLQkgKiBtb2RlbCB1cGRhdGFibGUgb2JqZWN0cy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVUYXJnZXRzKCk7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIGFsbCBtb2RlbCB1cGRhdGFibGUgb2JqZWN0cyB0byByZWZsZWN0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQotCSAqIHRhcmdldCB1cGRhdGFibGUgb2JqZWN0cy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNb2RlbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gdXBkYXRhYmxlIHZhbHVlIG9mIHR5cGUgU3RyaW5nCi0JICogCi0JICogQHJldHVybiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHVwZGF0YWJsZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBJVXBkYXRhYmxlVmFsdWUgZ2V0Q29tYmluZWRWYWxpZGF0aW9uTWVzc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiB1cGRhdGFibGUgdmFsdWUgb2YgdHlwZSBTdHJpbmcKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0aW9uIHVwZGF0YWJsZQotCSAqLwotCXB1YmxpYyBJVXBkYXRhYmxlVmFsdWUgZ2V0UGFydGlhbFZhbGlkYXRpb25NZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHVwZGF0YWJsZSB2YWx1ZSBvZiB0eXBlIFN0cmluZwotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbGlkYXRpb24gdXBkYXRhYmxlCi0JICovCi0JcHVibGljIElVcGRhdGFibGVWYWx1ZSBnZXRWYWxpZGF0aW9uTWVzc2FnZSgpOwotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgY3VycmVudCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2Ugb3JpZ2luYXRpbmcgZnJvbSB0aGUKLQkgKiBnaXZlbiBsaXN0ZW5lciB0byBhbiB1cGRhdGFibGUgb2JqZWN0LiAKLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiBAcGFyYW0gdmFsaWRhdGlvbk1lc3NhZ2UgdGhlIG5ldyBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVZhbGlkYXRpb25FcnJvcihJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIsCi0JCQlTdHJpbmcgdmFsaWRhdGlvbk1lc3NhZ2UpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSVRyZWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0lUcmVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTFlZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSVRyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHJlbWFpbgotICogdW5jaGFuZ2VkIGR1cmluZyB0aGUgMy4yIHJlbGVhc2UgY3ljbGUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQSBkb21haW4gbW9kZWwgaGFzIHRvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBpbiBvcmRlciB0byBlc3RhYmxpc2ggYSB0cmVlCi0gKiBiaW5kaW5nLiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBkb21haW4gbW9kZWwgaXRzZWxmIGlzIG5vdCBvcmdhbml6ZWQgYXMgYSB0cmVlIGFuZAotICogcmVxdWlyZXMgc3BlY2lmaWMgbG9naWMgdGhhdCBpcyBiZXlvbmQgdGhlIHN1cHBvcnQgb2YgYSA8Y29kZT5UcmVlTW9kZWxEZXNjcmlwdGlvbjwvY29kZT4KLSAqIAotICogCi0gKiBAc2VlIFRyZWVNb2RlbERlc2NyaXB0aW9uIGZvciBhIHNpbXBsZXIgd2F5IHRvIGJpbmQgYSB0cmVlLiAKLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRyZWUgIHsKLQkJCi0JLyoqCi0JICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyBmb3IgSVRyZWUgaW1wbGVtZW50b3JzIGFuZCBzaW1wbGlmeSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbgotCSAqIGhhbmRsaW5nLgotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hhbmdlU3VwcG9ydCB7Ci0JCXByaXZhdGUgSVRyZWUgc291cmNlOwotCQlwcml2YXRlIExpc3QgbGlzdGVuZXJzID0gbnVsbDsKLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gc291cmNlIHRyZWUKLQkJICovCi0JCXB1YmxpYyBDaGFuZ2VTdXBwb3J0KElUcmVlIHNvdXJjZSl7Ci0JCQl0aGlzLnNvdXJjZT1zb3VyY2U7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWlmIChsaXN0ZW5lciE9bnVsbCkgewotCQkJCWlmIChsaXN0ZW5lcnM9PW51bGwpCi0JCQkJCWxpc3RlbmVycz1uZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWlmIChsaXN0ZW5lcj09bnVsbCB8fCBsaXN0ZW5lcnM9PW51bGwpCi0JCQkJcmV0dXJuOwotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gY2hhbmdlVHlwZQotCQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkJICogQHBhcmFtIG5ld1ZhbHVlCi0JCSAqIEBwYXJhbSBwYXJlbnQKLQkJICogQHBhcmFtIGluZGV4Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZShpbnQgY2hhbmdlVHlwZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIE9iamVjdCBwYXJlbnQsIGludCBpbmRleCkgewotCQkJQ2hhbmdlRXZlbnQgZXZ0ID0gbmV3IENoYW5nZUV2ZW50KHNvdXJjZSwgY2hhbmdlVHlwZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwYXJlbnQsIGluZGV4KTsKLQkJCWZpcmVUcmVlQ2hhbmdlKGV2dCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gZXZ0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZShDaGFuZ2VFdmVudCBldnQpIHsKLQkJCU9iamVjdCBvdmFsID0gZXZ0LmdldE9sZFZhbHVlKCk7Ci0JCQlPYmplY3QgbnZhbCA9IGV2dC5nZXROZXdWYWx1ZSgpOwotCQkJCi0JCQlpZiAobGlzdGVuZXJzPT1udWxsIHx8Ci0JCQkJKG92YWwgIT0gbnVsbCAmJiBudmFsICE9IG51bGwgJiYgb3ZhbC5lcXVhbHMobnZhbCkpKQotCQkJCXJldHVybjsKLQkJCQotCQkJSUNoYW5nZUxpc3RlbmVyW10gbGlzdCA9IChJQ2hhbmdlTGlzdGVuZXJbXSlsaXN0ZW5lcnMudG9BcnJheShuZXcgSUNoYW5nZUxpc3RlbmVyW2xpc3RlbmVycy5zaXplKCldKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJCWxpc3RbaV0uaGFuZGxlQ2hhbmdlKGV2dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoaWxkcmVuIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgZWxlbWVudC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IHRoZSBwYXJlbnQgZWxlbWVudCwgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHJvb3QgZWxlbWVudHMKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNoaWxkIGVsZW1lbnRzCi0JICovCi0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpOwotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciByb290IGVsZW1lbnRzCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdFtdIGNoaWxkcmVuKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCBoYXMgY2hpbGRyZW4uCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaGFzIGNoaWxkcmVuLAotCSAqICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGhhcyBubyBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KTsKLQkKLSAgICAvKioKLSAgICAgKiBUaGUgaW1wbGVtZW50b3Igb2YgYW4gSVRyZWUgaXMgcmVzcG9uc2libGUgdG8gcHJvdmlkZSB0aGUgZXZlbnQKLSAgICAgKiBtb2RlbCBmb3IgY2hhbmdlcyBvbiB0aGUgdHJlZSdzIHNoYXBlIGFuZCBjb250ZW50LiAgSXQgc2hvdWxkIGJlIHVzaW5nIAotICAgICAqIDxjb2RlPklUcmVlLkNoYW5nZUV2ZW50PC9jb2RlPiB0byBub3RpZnkgdGhlIGxpc3RlbmVyIG9mIGFueSBjaGFuZ2VzIHRvIHRoZSB0cmVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIAotICAgIC8qKiAKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLQotCQotCS8qKgotCSAqIEByZXR1cm4gdHlwZXMgb2YgYWxsIHRyZWUgbm9kZXMgdGhhdCBhcmUgZXhwZWN0ZWQgb24gdGhpcyB0cmVlLgotCSAqLwotCXB1YmxpYyBDbGFzc1tdIGdldFR5cGVzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0lVcGRhdGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0lVcGRhdGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3OGI4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9JVXBkYXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmc7Ci0KLS8qKgotICogQW4gdXBkYXRhYmxlIHN1cHBvcnRzIGxpc3RlbmluZyB0byBpdHMgY2hhbmdlcy4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gSW5zdGVhZCwKLSAqIGNyZWF0ZSBhIHN1YmNsYXNzIG9mIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIHtAbGluayBVcGRhdGFibGV9LgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgcmVtYWluCi0gKiB1bmNoYW5nZWQgZHVyaW5nIHRoZSAzLjIgcmVsZWFzZSBjeWNsZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVwZGF0YWJsZSB7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGdpdmVuIGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIHVwZGF0YWJsZS4gSGFzIG5vIGVmZmVjdCBpZiBhbgotCSAqIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICogPHA+Ci0JICogQ2hhbmdlIGxpc3RlbmVycyBhcmUgaW5mb3JtZWQgYWJvdXQgc3RhdGUgY2hhbmdlcyB0aGF0IGFmZmVjdCB0aGUgdmFsdWUKLQkgKiBvciBzdHJ1Y3R1cmUgb2YgdGhpcyB1cGRhdGFibGUgb2JqZWN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY2hhbmdlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihJQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgdXBkYXRhYmxlLiBIYXMgbm8gZWZmZWN0IGlmIGFuCi0JICogaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqIEBwYXJhbSBjaGFuZ2VMaXN0ZW5lciAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihJQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIpOwotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhpcyB1cGRhdGFibGUuIFRoaXMgcmVtb3ZlcyBhbGwgcmVtYWluaW5nIGNoYW5nZSBsaXN0ZW5lcnMKLQkgKiBmcm9tIHRoaXMgdXBkYXRhYmxlLCBhbmQgZGVyZWdpc3RlcnMgYW55IGxpc3RlbmVycyB0aGlzIHVwZGF0YWJsZSBvYmplY3QKLQkgKiBoYXMgcmVnaXN0ZXJlZCBvbiBvdGhlciAoVUkgb3IgbW9kZWwpIG9iamVjdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSVVwZGF0YWJsZUNvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0lVcGRhdGFibGVDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZjlmYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSVVwZGF0YWJsZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZzsKLQotLyoqCi0gKiAKLSAqIElNUE9SVEFOVDogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICAKLSAqIEluc3RlYWQsIGV4dGVuZCBVcGRhdGFibGVDb2xsZWN0aW9uLgotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgcmVtYWluCi0gKiB1bmNoYW5nZWQgZHVyaW5nIHRoZSAzLjIgcmVsZWFzZSBjeWNsZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVXBkYXRhYmxlQ29sbGVjdGlvbiBleHRlbmRzIElVcGRhdGFibGUgewotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2l6ZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpOwotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHJldHVybiB0aGUgaW5kZXggd2hlcmUgdGhlIGVsZW1lbnQgd2FzIGFkZGVkCi0JICovCi0JcHVibGljIGludCBhZGRFbGVtZW50KE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEBwYXJhbSBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnQoaW50IGluZGV4KTsKLQotCS8vIFRPRE8gcmVuYW1lIHRvIHVwZGF0ZUVsZW1lbnQ/Ci0JLyoqCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZWxlbWVudCB0eXBlCi0JICovCi0JcHVibGljIENsYXNzIGdldEVsZW1lbnRUeXBlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9JVXBkYXRhYmxlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSVVwZGF0YWJsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwZWQ4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9JVXBkYXRhYmxlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBIGZhY3RvcnkgZm9yIGNyZWF0aW5nIHVwZGF0YWJsZSBvYmplY3RzIGZyb20gZGVzY3JpcHRpb24gb2JqZWN0cy4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVcGRhdGFibGVGYWN0b3J5IHsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gdXBkYXRhYmxlIGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRpb24sIG9yIG51bGwgaWYgdGhpcyBmYWN0b3J5Ci0JICogY2Fubm90IGNyZWF0ZSB1cGRhdGFibGVzIGZvciB0aGlzIGRlc2NyaXB0aW9uLiBUaGUgQmluZGluZ0V4Y2VwdGlvbiBpcwotCSAqIG9ubHkgdGhyb3duIGluIGVycm9yIGNhc2VzLCBlLmcuIGlmIHRoZSBkZXNjcmlwdGlvbiBpdHNlbGYgaXMgaW52YWxpZCwgb3IKLQkgKiBpZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIHRoZSB1cGRhdGFibGUuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnRpZXMKLQkgKiAgICAgICAgICAgIGEgbWFwcGluZyBmcm9tIGNvbnRleHQtZGVmaW5lZCBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgZS5nLiBmb3IKLQkgKiAgICAgICAgICAgIHBhc3NpbmcgcG9saWNpZXMgdG8gdGhlIGZhY3RvcnkuCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybiBhbiB1cGRhdGFibGUKLQkgKi8KLQlJVXBkYXRhYmxlIGNyZWF0ZVVwZGF0YWJsZShNYXAgcHJvcGVydGllcywgT2JqZWN0IGRlc2NyaXB0aW9uLCBJRGF0YUJpbmRpbmdDb250ZXh0IGJpbmRpbmdDb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0lVcGRhdGFibGVUcmVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9JVXBkYXRhYmxlVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njc0M2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0lVcGRhdGFibGVUcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmc7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgcmVtYWluCi0gKiB1bmNoYW5nZWQgZHVyaW5nIHRoZSAzLjIgcmVsZWFzZSBjeWNsZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVXBkYXRhYmxlVHJlZSBleHRlbmRzIElVcGRhdGFibGUgewotCi0JLyoqCi1cCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IDxjb2RlPm51bGw8L2NvZGU+IGZvciByb290IGVsZW1lbnQKLQkgKiBAcGFyYW0gdmFsdWUgaXMgdGhlIG5ldyB0cmVlIGVsZW1lbnQgYXMgYSBjaGlsZCBvZiBwYXJlbnRFbGVtZW50Ci0JICogQHBhcmFtIGluZGV4Ci0JICogQHJldHVybiB0aGUgaW5kZXggd2hlcmUgdGhlIGVsZW1lbnQgd2FzIGFkZGVkCi0JICovCi0JcHVibGljIGludCBhZGRFbGVtZW50KE9iamVjdCBwYXJlbnRFbGVtZW50LCBpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50RWxlbWVudCA8Y29kZT5udWxsPC9jb2RlPiBmb3Igcm9vdCBlbGVtZW50Ci0JICogQHBhcmFtIGluZGV4Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudChPYmplY3QgcGFyZW50RWxlbWVudCwgaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50RWxlbWVudCA8Y29kZT5udWxsPC9jb2RlPiBmb3Igcm9vdCBlbGVtZW50Ci0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIHZhbHVlIGZvciB0aGUgdXBkYXRlZCB0cmVlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50KE9iamVjdCBwYXJlbnRFbGVtZW50LCBpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudEVsZW1lbnQgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHJvb3QgZWxlbWVudAotCSAqIEBwYXJhbSB2YWx1ZXMgdG8gc2V0IGFzIHRoZSBjaGlsZHJlbiBvZiBwYXJlbnRFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdFtdIHZhbHVlcyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50RWxlbWVudCA8Y29kZT5udWxsPC9jb2RlPiBmb3Igcm9vdCBlbGVtZW50Ci0JICogQHBhcmFtIGluZGV4Ci0JICogQHJldHVybiBwYXJlbnRFbGVtZW50J3MgY2hpbGUgYXQgdGhlIGdpdmVuIGluZGV4Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRFbGVtZW50KE9iamVjdCBwYXJlbnRFbGVtZW50LCBpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IDxjb2RlPm51bGw8L2NvZGU+IGZvciByb290IGVsZW1lbnQKLQkgKiBAcmV0dXJuIGNoaWxkcmVuIGVsZW1lbnRzIG9mIHBhcmVudEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudEVsZW1lbnQpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgcG90ZW50aWFsIHR5cGVzIG9mIHRyZWUgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRUeXBlcygpOwkJCQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvSVVwZGF0YWJsZVZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9JVXBkYXRhYmxlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkM2U3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9JVXBkYXRhYmxlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZzsKLQotLyoqCi0gKiBBbiB1cGRhdGFibGUgdmFsdWUgd3JhcHMgYSBzaW5nbGUgdmFsdWUgdGhhdCBjYW4gYmUgdXBkYXRlZCBwcm9ncmFtbWF0aWNhbGx5LAotICogYW5kIHdob3NlIGNoYW5nZXMgY2FuIGJlIHRyYWNrZWQgYnkgcmVnaXN0ZXJpbmcgYSBjaGFuZ2UgbGlzdGVuZXIuCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJVXBkYXRhYmxlVmFsdWUgZXh0ZW5kcyBJVXBkYXRhYmxlIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgdXBkYXRhYmxlIHZhbHVlIHRvIHRoZSBnaXZlbiBvYmplY3QsIHdoaWNoIG11c3QgYmUKLQkgKiBhbiBpbnN0YW5jZSBvZiB0aGUgdmFsdWUgdHlwZSByZXR1cm5lZCBieSBnZXRWYWx1ZVR5cGUoKS4gSWYgdGhlIHZhbHVlCi0JICogdHlwZSBpcyBhbiBvYmplY3QgdHlwZSwgdGhlbiB0aGUgZ2l2ZW4gdmFsdWUgbWF5IGJlIDwvY29kZT5udWxsPC9jb2RlPi4KLQkgKiBDaGFuZ2UgbGlzdGVuZXJzIHdpbGwgYmUgbm90aWZpZWQgb2YgdGhpcyBjaGFuZ2Ugd2l0aCB0aGUgZXhjZXB0aW9uIG9mCi0JICogdGhlIGdpdmVuIGxpc3RlbmVyLiBJZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgaXMgbnVsbCwgYWxsIGxpc3RlbmVycyB3aWxsIGJlCi0JICogbm90aWZpZWQuCi0JICogCi0JICogVE9ETyB3ZSBwcm9iYWJseSBuZWVkIHRvIGJlIGFibGUgdG8gdmV0byBhIGNoYW5nZS4gTWF5YmUgcmV0dXJuaW5nIGEKLQkgKiBzdGF0dXM/ICBkam86IGlmIHdlIGRvIHRoYXQsIHdlIHdpbGwgaGF2ZSB0byBoYXZlIGEgc2VwYXJhdGUgbWV0aG9kCi0JICogZm9yIHRoYXQgKDItcGhhc2UgY29tbWl0KSBvciB3ZSB3aWxsIGhhdmUgdG8gaGF2ZSBhIHJvbGxiYWNrIG1ldGhvZAotCSAqIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBtdWx0aXBsZSB1cGRhdGFibGVzIGFyZSBsaXN0ZW5pbmcgYW5kIHNvbWUgaGF2ZSAKLQkgKiBjb21taXR0ZWQgYnV0IG9uZSB2ZXRvcyB0aGUgY2hhbmdlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlLCB3aGljaCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHRoZSB2YWx1ZSB0eXBlCi0JICogcmV0dXJuZWQgYnkgZ2V0VmFsdWVUeXBlKCkuIElmIHRoZSB2YWx1ZSB0eXBlIGlzIGFuIG9iamVjdCB0eXBlLCB0aGVuIHRoZQotCSAqIHJldHVybmVkIHZhbHVlIG1heSBiZSA8L2NvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCB2YWx1ZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHZhbHVlcyB0aGF0IHRoaXMgdXBkYXRhYmxlIHZhbHVlIGNhbiBob2xkLiBUaGlzCi0JICogbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIGRvZXMgbm90IGNoYW5nZSBvdmVyIHRpbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgdHlwZQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9KYXZhQmVhbnNTY2FsYXJVcGRhdGFibGVWYWx1ZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0phdmFCZWFuc1NjYWxhclVwZGF0YWJsZVZhbHVlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTdlOWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL0phdmFCZWFuc1NjYWxhclVwZGF0YWJsZVZhbHVlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZzsKLQotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5iZWFucy5KYXZhQmVhblVwZGF0YWJsZVZhbHVlOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gb3B0aW9uYWwgSVVwZGF0YWJsZUZhY3RvcnkgdGhhdCBmb3JjZXMgYWxsIEphdmFCZWFucyB1cGRhdGFibGVzCi0gKiB0aGF0IGl0IGNyZWF0ZXMgdG8gYmUgYW4gSVVwZGF0YWJsZVZhbHVlLCBldmVuIGlmIHRoZSBhY3R1YWwgdHlwZSBvZgotICogdGhlIHByb3BlcnR5IGlzIGEgY29sbGVjdGlvbi4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUJlYW5zU2NhbGFyVXBkYXRhYmxlVmFsdWVGYWN0b3J5IGV4dGVuZHMgT2JqZWN0IGltcGxlbWVudHMKLQkJSVVwZGF0YWJsZUZhY3RvcnkgewotCi0gICAgcHVibGljIElVcGRhdGFibGUgY3JlYXRlVXBkYXRhYmxlKE1hcCBwcm9wZXJ0aWVzLCBPYmplY3QgZGVzY3JpcHRpb24sIElEYXRhQmluZGluZ0NvbnRleHQgYmluZGluZ0NvbnRleHQpIHsKLSAgICAgICAgaWYgKCEgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgUHJvcGVydHkpKSB7Ci0gICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KSBkZXNjcmlwdGlvbjsKLSAgICAgICAgT2JqZWN0IGNvbGxlY3Rpb25Db250YWluZXIgPSBwcm9wZXJ0eS5nZXRPYmplY3QoKTsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIHByb3BlcnR5LmdldFByb3BlcnR5SUQoKTsKLSAgICAgICAgCi0gICAgICAgIEJlYW5JbmZvIGJlYW5JbmZvID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oY29sbGVjdGlvbkNvbnRhaW5lci5nZXRDbGFzcygpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBpbnQgcG9zaXRpb24gPSAwOwotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZHMgPSBiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIHdoaWxlICghZm91bmQgJiYgcG9zaXRpb24gPCBwZHMubGVuZ3RoKSB7Ci0gICAgICAgICAgIGlmIChwZHNbcG9zaXRpb25dLmdldE5hbWUoKS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgICsrcG9zaXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBJVXBkYXRhYmxlVmFsdWUgdXBkYXRhYmxlID0gbmV3IEphdmFCZWFuVXBkYXRhYmxlVmFsdWUoY29sbGVjdGlvbkNvbnRhaW5lciwgcGRzW3Bvc2l0aW9uXSk7Ci0gICAgICAgIHJldHVybiB1cGRhdGFibGU7Ci0gICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvTmVzdGVkUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL05lc3RlZFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNDhmNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvTmVzdGVkUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZzsKLQotCi1wdWJsaWMgY2xhc3MgTmVzdGVkUHJvcGVydHkgIGV4dGVuZHMgUHJvcGVydHkgewotCi0JcHJpdmF0ZSBDbGFzc1tdIHR5cGVzOwotCXByaXZhdGUgQ2xhc3MgcHJvdG90eXBlQ2xhc3M7Ci0KLQlwdWJsaWMgTmVzdGVkUHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nW10gcHJvcGVydGllcywgQ2xhc3NbXSB0eXBlcykgewotCQlzdXBlcihvYmplY3QsIHByb3BlcnRpZXMpOwotCQl0aGlzLnR5cGVzID0gdHlwZXM7Ci0JfQotCQotCXB1YmxpYyBOZXN0ZWRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydGllcywgQ2xhc3MgcHJvdG90eXBlQ2xhc3MpIHsKLQkJc3VwZXIob2JqZWN0LCBwcm9wZXJ0aWVzKTsKLQkJdGhpcy5wcm90b3R5cGVDbGFzcyA9IHByb3RvdHlwZUNsYXNzOwkJCi0JfQotCi0JcHVibGljIENsYXNzW10gZ2V0VHlwZXMoKSB7Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0UHJvdG90eXBlQ2xhc3MoKSB7Ci0JCXJldHVybiBwcm90b3R5cGVDbGFzczsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2Y2NmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZzsKLQotLyoqCi0gKiBBIHN0YW5kYXJkIGRlc2NyaXB0aW9uIHR5cGUgcmVwcmVzZW50aW5nIGEgcHJvcGVydHkgb2YgYW4gb2JqZWN0LiBEZXNjcmlwdGlvbgotICogb2JqZWN0cyBjYW4gYmUgcGFzc2VkIHRvIDxjb2RlPkRhdGFCaW5kaW5nQ29udGV4dC5iaW5kKCk8L2NvZGU+IG9yCi0gKiA8Y29kZT5EYXRhQmluZGluZ0NvbnRleHQuY3JlYXRlVXBkYXRhYmxlKCk8L2NvZGU+LiBUaGV5IGFyZSBwYXNzZWQgdG8KLSAqIDxjb2RlPklVcGRhdGFibGVGYWN0b3J5LmNyZWF0ZVVwZGF0YWJsZSgpPC9jb2RlPiB0byBjcmVhdGUgYW4gdXBkYXRhYmxlCi0gKiBvYmplY3QuIEl0IGlzIHVwIHRvIHRoZSBJVXBkYXRhYmxlRmFjdG9yeSBvYmplY3RzIHRvIGludGVycHJldCB0aGlzCi0gKiBkZXNjcmlwdGlvbi4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHkgewotCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2JqZWN0OwotCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgcHJvcGVydHlJRDsKLQotCXByaXZhdGUgZmluYWwgQ2xhc3MgcHJvcGVydHlUeXBlOwotCi0JcHJpdmF0ZSBmaW5hbCBCb29sZWFuIGlzQ29sbGVjdGlvblByb3BlcnR5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwcm9wZXJ0eSBkZXNjcmlwdGlvbiBmcm9tIHRoZSBnaXZlbiBvYmplY3QgYW5kIHByb3BlcnR5Ci0JICogaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIHByb3BlcnR5SUQKLQkgKi8KLQlwdWJsaWMgUHJvcGVydHkoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHByb3BlcnR5SUQpIHsKLQkJdGhpcyhvYmplY3QsIHByb3BlcnR5SUQsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcHJvcGVydHkgZGVzY3JpcHRpb24gZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0LCBwcm9wZXJ0eQotCSAqIGlkZW50aWZpZXIsIHByb3BlcnR5IHR5cGUsIGFuZCBpbmZvcm1hdGlvbiB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBhCi0JICogY29sbGVjdGlvbiBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eQotCSAqIEBwYXJhbSBwcm9wZXJ0eUlECi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgaWRlbnRpZmllcgotCSAqIEBwYXJhbSBwcm9wZXJ0eVR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmtub3duCi0JICogQHBhcmFtIGlzQ29sbGVjdGlvblByb3BlcnR5Ci0JICogICAgICAgICAgICA8Y29kZT5Cb29sZWFuLlRSVUU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBhIGNvbGxlY3Rpb24KLQkgKiAgICAgICAgICAgIHByb3BlcnR5LCA8Y29kZT5Cb29sZWFuLkZBTFNFPC9jb2RlPiBpZiBpdCBpcyBhIHNpbXBsZQotCSAqICAgICAgICAgICAgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVua25vd24KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHkoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHByb3BlcnR5SUQsCi0JCQlDbGFzcyBwcm9wZXJ0eVR5cGUsIEJvb2xlYW4gaXNDb2xsZWN0aW9uUHJvcGVydHkpIHsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCXRoaXMucHJvcGVydHlJRCA9IHByb3BlcnR5SUQ7Ci0JCXRoaXMucHJvcGVydHlUeXBlID0gcHJvcGVydHlUeXBlOwotCQl0aGlzLmlzQ29sbGVjdGlvblByb3BlcnR5ID0gaXNDb2xsZWN0aW9uUHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IG9mIHRoaXMgcHJvcGVydHkgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgaWRlbnRpZmllciBvZiB0aGlzIHByb3BlcnR5IGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGlkZW50aWZpZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5SUQoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eUlEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IHR5cGUgb2YgdGhpcyBwcm9wZXJ0eSBkZXNjcmlwdGlvbiwgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmtub3duLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIENsYXNzIGdldFByb3BlcnR5VHlwZSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIGEgY29sbGVjdGlvbiBwcm9wZXJ0eSwgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmtub3duLiBJZiB0aGUgcHJvcGVydHkgaXMgYSBjb2xsZWN0aW9uIHByb3BlcnR5LAotCSAqIGdldFByb3BlcnR5VHlwZSgpIHJldHVybnMgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgY29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPkJvb2xlYW4uVFJVRTwvY29kZT4gaWYgdGhlIHByb3BlcnR5IGlzIGEgY29sbGVjdGlvbgotCSAqICAgICAgICAgcHJvcGVydHksIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIGEgc2ltcGxlIHByb3BlcnR5LCBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5rbm93bgotCSAqLwotCXB1YmxpYyBCb29sZWFuIGlzQ29sbGVjdGlvblByb3BlcnR5KCkgewotCQlyZXR1cm4gaXNDb2xsZWN0aW9uUHJvcGVydHk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUHJvcGVydHlEZXNjcmlwdGlvbigiICsgb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiwgIiArIHByb3BlcnR5SUQudG9TdHJpbmcoKSArICIsIC4uLikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL1RyZWVNb2RlbERlc2NyaXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9UcmVlTW9kZWxEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWI4YjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL1RyZWVNb2RlbERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuYmVhbnMuUHJvcGVydHlIZWxwZXI7Ci0KLQotLyoqCi0gKiBBIGRlc2NyaXB0aW9uIG9iamVjdCBmb3IgYSBwcm9wZXJ0eSBiYXNlZCB0cmVlIHN0cnVjdHVyZS4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqICBJZiBhIGRvbWFpbiBtb2RlbCBpcyBvcmdhbml6ZWQgYXMgYSB0cmVlLCB5b3UgY2FuIGRlc2NyaWJlIHRoZSB0cmVlIHdpdGggdGhpcyBjbGFzcyBpbiBvcmRlcgotICogIHRvIGJpbmQgaXQgdG8gYSB2aXN1YWwgdHJlZS4KLSAqIAotICogQHNlZSBJVHJlZSBmb3IgYSBtb3JlIGZsZXhpYmxlIG1hbm5lciB0byBiaW5kIGEgdHJlZS4gCi0gKiBAc2luY2UgMy4yCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBUcmVlTW9kZWxEZXNjcmlwdGlvbiB7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIGNoaWxkcmVuUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBDbGFzc1tdIHR5cGVzID0gbmV3IENsYXNzWzBdOwotCQotCXByaXZhdGUgT2JqZWN0IHJvb3Q7Ci0JCQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gcm9vdCBlbGVtZW50L3Mgb3IgZm9yIHRoZSB0cmVlLiAgCi0JICovCi0JcHVibGljIFRyZWVNb2RlbERlc2NyaXB0aW9uKE9iamVjdCByb290KSB7IC8vIElVcGRhdGFibGUgb3IgUHJvcGVydHkKLQkJdGhpcy5yb290ID0gcm9vdDsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgYSBwcm9wZXJ0eSBmb3IgZ2V0dGluZywgb3Igc2V0dGluZyB0aGUgVHJlZSdzIGNoaWxkcmVuKGFycmF5IG9yIGNvbGxlY3Rpb24pLgotCSAqIFRoaXMgcHJvcGVydHkgbWF5IG9yIG1heSBub3QgYmUgYW4gaW5kZXggcHJvcGVydHkuIAotCSAqIEEgZ2l2ZW4gaW5zdGFuY2VUeXBlLCBtYXkgaGF2ZSBtdWx0aXBsZSBjaGlsZHJlbiBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YW5jZVR5cGUKLQkgKiBAcGFyYW0gY2hpbGRyZW5Qcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkcmVuUHJvcGVydHkgKENsYXNzIGluc3RhbmNlVHlwZSwgU3RyaW5nIGNoaWxkcmVuUHJvcGVydHkpIHsJCQotCQlQcm9wZXJ0eUhlbHBlciBwcm9wID0gbmV3IFByb3BlcnR5SGVscGVyKGNoaWxkcmVuUHJvcGVydHksIGluc3RhbmNlVHlwZSk7Ci0JCWlmIChwcm9wLmdldEdldHRlcigpPT1udWxsKQotCQkJdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24oIkludmFsaWQgY2hpbGRyZW4gcHJvcGVydHk6ICIrY2hpbGRyZW5Qcm9wZXJ0eSk7CQkgLy8kTk9OLU5MUy0xJAkJCQkKLQkJYWRkVHlwZShpbnN0YW5jZVR5cGUpOwotCQljaGlsZHJlblByb3BlcnRpZXMucHV0KGluc3RhbmNlVHlwZSwgYWRkUHJvcGVydHkoY2hpbGRyZW5Qcm9wZXJ0eSwgKFN0cmluZ1tdKWNoaWxkcmVuUHJvcGVydGllcy5nZXQoaW5zdGFuY2VUeXBlKSkpOwotCX0KLQkKLQkKLQlwcml2YXRlIFN0cmluZ1tdIGFkZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nW10gbGlzdCkgewotCQlpZiAobGlzdD09bnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nW10geyBwcm9wZXJ0eSB9IDsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxpc3RbaV0uZXF1YWxzKHByb3BlcnR5KSkgcmV0dXJuIGxpc3Q7CQkJCi0JCX0KLQkJU3RyaW5nW10gbmV3TGlzdCA9IG5ldyBTdHJpbmdbbGlzdC5sZW5ndGgrMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkobGlzdCwwLCBuZXdMaXN0LCAwLCBsaXN0Lmxlbmd0aCk7Ci0JCW5ld0xpc3RbbGlzdC5sZW5ndGhdPXByb3BlcnR5OwotCQlyZXR1cm4gbmV3TGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBhZGRQcm9wZXJ0aWVzKFN0cmluZ1tdIHByb3BlcnRpZXMsIFN0cmluZ1tdIGxpc3QpIHsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbGlzdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSAKLQkJCXJlc3VsdCA9IGFkZFByb3BlcnR5KHByb3BlcnRpZXNbaV0sIHJlc3VsdCk7CQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRUeXBlKENsYXNzIGluc3RhbmNlVHlwZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodHlwZXNbaV09PWluc3RhbmNlVHlwZSkgcmV0dXJuOwkJCQotCQl9Ci0JCUNsYXNzW10gbmV3VHlwZXMgPSBuZXcgQ2xhc3NbdHlwZXMubGVuZ3RoKzFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVzLDAsIG5ld1R5cGVzLCAwLCB0eXBlcy5sZW5ndGgpOwotCQluZXdUeXBlc1t0eXBlcy5sZW5ndGhdPWluc3RhbmNlVHlwZTsKLQkJdHlwZXMgPSBuZXdUeXBlczsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGluc3RhbmNlVHlwZQotCSAqIEByZXR1cm4gcHJvcGVydHkgZGVub3RpbmcgdGhlIGNoaWxkcmVuIGZvciBpbnN0YW5jZVR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2hpbGRyZW5Qcm9wZXJ0aWVzKENsYXNzIGluc3RhbmNlVHlwZSkgewotCQlTdHJpbmdbXSBwcm9wZXJ0aWVzID0gbnVsbDsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0eXBlc1tpXS5pc0Fzc2lnbmFibGVGcm9tKGluc3RhbmNlVHlwZSkpIHsKLQkJCQlTdHJpbmdbXSBwcm9wcyA9IChTdHJpbmdbXSljaGlsZHJlblByb3BlcnRpZXMuZ2V0KHR5cGVzW2ldKTsKLQkJCQlwcm9wZXJ0aWVzID0gYWRkUHJvcGVydGllcyhwcm9wcywgcHJvcGVydGllcyk7CQkKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdHlwZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmVlCi0JICovCi0JcHVibGljIENsYXNzW10gZ2V0VHlwZXMoKSB7Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBUcmVlIHJvb3Qgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHJvb3Q7Ci0JfSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL1VwZGF0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvVXBkYXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZDFhYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvVXBkYXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHVwZGF0YWJsZSBvYmplY3RzLgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHJlbWFpbgotICogdW5jaGFuZ2VkIGR1cmluZyB0aGUgMy4yIHJlbGVhc2UgY3ljbGUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBVcGRhdGFibGUgaW1wbGVtZW50cyBJVXBkYXRhYmxlIHsKLQotCXByaXZhdGUgTGlzdCBjaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihJQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIpIHsKLQkJaWYgKCFjaGFuZ2VMaXN0ZW5lcnMuY29udGFpbnMoY2hhbmdlTGlzdGVuZXIpKSB7Ci0JCQljaGFuZ2VMaXN0ZW5lcnMuYWRkKGNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKElDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lcikgewotCQlpZiAoY2hhbmdlTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQljaGFuZ2VMaXN0ZW5lcnMucmVtb3ZlKGNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2hhbmdlRXZlbnQgZmlyZUNoYW5nZUV2ZW50KGludCBjaGFuZ2VUeXBlLCBPYmplY3Qgb2xkVmFsdWUsCi0JCQlPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIGZpcmVDaGFuZ2VFdmVudChjaGFuZ2VUeXBlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIENoYW5nZUV2ZW50LlBPU0lUSU9OX1VOS05PV04pOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ2hhbmdlRXZlbnQgZmlyZUNoYW5nZUV2ZW50KGludCBjaGFuZ2VUeXBlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgIGludCBwb3NpdGlvbikgewotCQlyZXR1cm4gZmlyZUNoYW5nZUV2ZW50KGNoYW5nZVR5cGUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgbnVsbCwgcG9zaXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBDaGFuZ2VFdmVudCBmaXJlQ2hhbmdlRXZlbnQoaW50IGNoYW5nZVR5cGUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBPYmplY3QgcGFyZW50LCBpbnQgcG9zaXRpb24pIHsKLQkJQ2hhbmdlRXZlbnQgY2hhbmdlRXZlbnQgPSBuZXcgQ2hhbmdlRXZlbnQodGhpcywgY2hhbmdlVHlwZSwgb2xkVmFsdWUsCi0JCQkJbmV3VmFsdWUsIHBhcmVudCwgcG9zaXRpb24pOwotCQlpZihjaGFuZ2VMaXN0ZW5lcnM9PW51bGwpIHsKLQkJCS8vIGRpc3Bvc2VkIAotCQkJcmV0dXJuIGNoYW5nZUV2ZW50OwotCQl9Ci0JCUlDaGFuZ2VMaXN0ZW5lcltdIGxpc3RlbmVycyA9IChJQ2hhbmdlTGlzdGVuZXJbXSkgY2hhbmdlTGlzdGVuZXJzCi0JCQkJLnRvQXJyYXkobmV3IElDaGFuZ2VMaXN0ZW5lcltjaGFuZ2VMaXN0ZW5lcnMuc2l6ZSgpXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CQkJCi0JCQkJbGlzdGVuZXJzW2ldLmhhbmRsZUNoYW5nZShjaGFuZ2VFdmVudCk7Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZUV2ZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNoYW5nZUxpc3RlbmVycyA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9VcGRhdGFibGVDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9VcGRhdGFibGVDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWE3NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvVXBkYXRhYmxlQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZzsKLQotLyoqCi0gKiBDbGFzcyBVcGRhdGFibGVDb2xsZWN0aW9uLiAgUHJvdmlkZXMgYSBiYXNlIGNsYXNzIGZvciBjbGllbnRzIHRoYXQgd2lzaCB0bwotICogaW1wbGVtZW50IElVcGRhdGFibGVDb2xsZWN0aW9uIGFuZCBwZXJtaXRzIGV2b2x1dGlvbiBvZiB0aGUgSVVwZGF0YWJsZUNvbGxlY3Rpb24KLSAqIGludGVyZmFjZSBvdmVyIHRpbWUuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFVwZGF0YWJsZUNvbGxlY3Rpb24gZXh0ZW5kcyBVcGRhdGFibGUgaW1wbGVtZW50cyBJVXBkYXRhYmxlQ29sbGVjdGlvbiB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlQ29sbGVjdGlvbiNnZXRTaXplKCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldFNpemUoKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVDb2xsZWN0aW9uI2FkZEVsZW1lbnQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgYWRkRWxlbWVudChPYmplY3QgdmFsdWUsIGludCBpbmRleCk7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlQ29sbGVjdGlvbiNyZW1vdmVFbGVtZW50KGludCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVFbGVtZW50KGludCBpbmRleCk7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlQ29sbGVjdGlvbiNzZXRFbGVtZW50KGludCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFbGVtZW50KGludCBpbmRleCwgT2JqZWN0IHZhbHVlKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVDb2xsZWN0aW9uI2dldEVsZW1lbnQoaW50KQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0RWxlbWVudChpbnQgaW5kZXgpOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZUNvbGxlY3Rpb24jZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBDbGFzcyBnZXRFbGVtZW50VHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvVXBkYXRhYmxlVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL1VwZGF0YWJsZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMGM2ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvVXBkYXRhYmxlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZzsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB1cGRhdGFibGUgdmFsdWVzLgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHJlbWFpbgotICogdW5jaGFuZ2VkIGR1cmluZyB0aGUgMy4yIHJlbGVhc2UgY3ljbGUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFVwZGF0YWJsZVZhbHVlIGV4dGVuZHMgVXBkYXRhYmxlIGltcGxlbWVudHMKLQkJSVVwZGF0YWJsZVZhbHVlIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyL0NvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyL0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTg3MzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlci9Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyOwotCi0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgY29udmVuaWVuY2UgZm9yIGltcGxlbWVudGluZyBjdXN0b20KLSAqIGNvbnZlcnRlcnMuCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnZlcnRlciBpbXBsZW1lbnRzIElDb252ZXJ0ZXIgewotCi0JcHJpdmF0ZSBDbGFzcyB0YXJnZXRUeXBlOwotCi0JcHJpdmF0ZSBDbGFzcyBtb2RlbFR5cGU7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0VHlwZQotCSAqIEBwYXJhbSBtb2RlbFR5cGUKLQkgKi8KLQlwdWJsaWMgQ29udmVydGVyKENsYXNzIHRhcmdldFR5cGUsIENsYXNzIG1vZGVsVHlwZSkgewotCQl0aGlzLnRhcmdldFR5cGUgPSB0YXJnZXRUeXBlOwotCQl0aGlzLm1vZGVsVHlwZSA9IG1vZGVsVHlwZTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0TW9kZWxUeXBlKCkgewotCQlyZXR1cm4gbW9kZWxUeXBlOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRUYXJnZXRUeXBlKCkgewotCQlyZXR1cm4gdGFyZ2V0VHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlci9JQ29udmVydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXIvSUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWIzZWFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlci9JQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyOwotCi0vKioKLSAqIEEgdHdvLXdheSBjb252ZXJ0ZXIuCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgcmVtYWluCi0gKiB1bmNoYW5nZWQgZHVyaW5nIHRoZSAzLjIgcmVsZWFzZSBjeWNsZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udmVydGVyIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzIHdob3NlIGluc3RhbmNlcyBjYW4gYmUgY29udmVydGVkIGJ5IHRoaXMgY29udmVydGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNsYXNzIHdob3NlIGluc3RhbmNlcyBjYW4gYmUgY29udmVydGVkCi0JICovCi0JcHVibGljIENsYXNzIGdldE1vZGVsVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xhc3MgdG8gd2hpY2ggdGhpcyBjb252ZXJ0ZXIgY2FuIGNvbnZlcnQuCi0JICogCi0JICogQHJldHVybiB0aGUgY2xhc3MgdG8gd2hpY2ggdGhpcyBjb252ZXJ0ZXIgY2FuIGNvbnZlcnQKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0VGFyZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uIG9mIHRoZSBnaXZlbiBvYmplY3QuIFRoZSBnaXZlbgotCSAqIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGdldFRhcmdldFR5cGUoKSwgYW5kIHRoZSByZXN1bHQgbXVzdCBiZSBhbgotCSAqIGluc3RhbmNlIG9mIGdldE1vZGVsVHlwZSgpLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXRPYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29udmVydAotCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRUYXJnZXRUb01vZGVsKE9iamVjdCB0YXJnZXRPYmplY3QpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uIG9mIHRoZSBnaXZlbiBvYmplY3QuIFRoZSBnaXZlbgotCSAqIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGdldE1vZGVsVHlwZSgpLCBhbmQgdGhlIHJlc3VsdCBtdXN0IGJlIGFuCi0JICogaW5zdGFuY2Ugb2YgZ2V0VGFyZ2V0VHlwZSgpLgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbE9iamVjdAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb252ZXJ0Ci0JICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydE1vZGVsVG9UYXJnZXQoT2JqZWN0IG1vZGVsT2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlci9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmQ2NmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+UHJvdmlkZXMgc3VwcG9ydCBmb3IgZGF0YSBiaW5kaW5nLCBmb3IgZXhhbXBsZSBiaW5kaW5nIGFuIGF0dHJpYnV0ZSB2YWx1ZSBvZiBhIG1vZGVsCi1vYmplY3QgdG8gYSBVSSB3aWRnZXQncyBzdGF0ZS48L3A+Ci0KLTxwPlRoaXMgcGFja2FnZSBpbmNsdWRlcyBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHRoYXQgZGVmaW5lIHRoZSBjb252ZXJ0ZXIgQVBJPC9wPgotPGgyPlBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci08cD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbi9Db252ZXJzaW9uRnVuY3Rpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb24vQ29udmVyc2lvbkZ1bmN0aW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhOTlhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbi9Db252ZXJzaW9uRnVuY3Rpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgZGI0b2JqZWN0cyBJbmMuICBodHRwOi8vd3d3LmRiNG8uY29tCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIGRiNG9iamVjdHMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zLkNvbnZlcnREYXRlMlN0cmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbnMuQ29udmVydE9iamVjdDJTdHJpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zLkNvbnZlcnRTdHJpbmcyQmlnRGVjaW1hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbnMuQ29udmVydFN0cmluZzJCb29sZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9ucy5Db252ZXJ0U3RyaW5nMkJ5dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zLkNvbnZlcnRTdHJpbmcyQ2hhcmFjdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9ucy5Db252ZXJ0U3RyaW5nMkRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zLkNvbnZlcnRTdHJpbmcyRG91YmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9ucy5Db252ZXJ0U3RyaW5nMkZsb2F0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9ucy5Db252ZXJ0U3RyaW5nMkludGVnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zLkNvbnZlcnRTdHJpbmcyTG9uZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbnMuQ29udmVydFN0cmluZzJPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zLkNvbnZlcnRTdHJpbmcyU2hvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zLlRoZUlkZW50aXR5RnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zLlRoZU51bGxTdHJpbmdGdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbnMuVG9TdHJpbmdDb252ZXJ0ZXI7Ci0KLQotLyoqCi0gKiBDb252ZXJzaW9uRnVuY3Rpb25SZWdpc3RyeS4gIFRoZSBwbGFjZSB3aGVyZSBhbGwgY29udmVydGVycyBjYW4gYmUgZm91bmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJzaW9uRnVuY3Rpb25SZWdpc3RyeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBjb252ZXJ0ZXJGdW5jdGlvbnM7Ci0gICAgCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgY29udmVydGVycyB0byBjb252ZXJ0IGZyb20gYSBzcGVjaWZpZWQgc291cmNlIGNsYXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBnZXRTb3VyY2VDbGFzc0NvbnZlcnRlcnMoQ2xhc3Mgc291cmNlQ2xhc3MpIHsKLSAgICAgICAgSGFzaE1hcCByZXN1bHQgPSAoSGFzaE1hcCkgY29udmVydGVyRnVuY3Rpb25zLmdldChzb3VyY2VDbGFzcyk7Ci0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBjb252ZXJ0ZXJGdW5jdGlvbnMucHV0KHNvdXJjZUNsYXNzLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBc3NvY2lhdGUgYSBwYXJ0aWN1bGFyIGNvbnZlcnRlciB3aXRoIGEgcGFydGljdWxhciBwYWlyIG9mIGNsYXNzZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZUNsYXNzIFRoZSB0eXBlIHRvIGNvbnZlcnQgZnJvbQotICAgICAqIEBwYXJhbSBkZXN0Q2xhc3MgVGhlIHR5cGUgdG8gY29udmVydCB0bwotICAgICAqIEBwYXJhbSBjb252ZXJzaW9uRnVuY3Rpb24gVGhlIElDb252ZXJzaW9uRnVuY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzb2NpYXRlKENsYXNzIHNvdXJjZUNsYXNzLCBDbGFzcyBkZXN0Q2xhc3MsIElDb252ZXJzaW9uRnVuY3Rpb24gY29udmVyc2lvbkZ1bmN0aW9uKSB7Ci0gICAgICAgIEhhc2hNYXAgc291cmNlQ2xhc3NDb252ZXJ0ZXJzID0gZ2V0U291cmNlQ2xhc3NDb252ZXJ0ZXJzKHNvdXJjZUNsYXNzKTsKLSAgICAgICAgc291cmNlQ2xhc3NDb252ZXJ0ZXJzLnB1dChkZXN0Q2xhc3MsIGNvbnZlcnNpb25GdW5jdGlvbik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBJQ29udmVyc2lvbkZ1bmN0aW9uIGZvciBhIHNwZWNpZmljIGNsYXNzMmNsYXNzIGNvbnZlcnNpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZUNsYXNzIFRoZSBzb3VyY2UgY2xhc3MKLSAgICAgKiBAcGFyYW0gZGVzdENsYXNzIFRoZSBkZXN0aW5hdGlvbiBjbGFzcwotICAgICAqIEByZXR1cm4gQW4gYXBwcm9wcmlhdGUgSUNvbnZlcnNpb25GdW5jdGlvbiBvciBUaGVOdWxsQ29udmVydGVyLk5VTEwgb24gZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElDb252ZXJzaW9uRnVuY3Rpb24gZ2V0KENsYXNzIHNvdXJjZUNsYXNzLCBDbGFzcyBkZXN0Q2xhc3MpIHsKLSAgICAgICAgaWYgKHNvdXJjZUNsYXNzLmVxdWFscyhkZXN0Q2xhc3MpKQotICAgICAgICAgICAgcmV0dXJuIFRoZUlkZW50aXR5RnVuY3Rpb24uSURFTlRJVFk7Ci0gICAgICAgIAotICAgICAgICBIYXNoTWFwIHNvdXJjZUNsYXNzQ29udmVydGVycyA9IChIYXNoTWFwKSBjb252ZXJ0ZXJGdW5jdGlvbnMuZ2V0KHNvdXJjZUNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChzb3VyY2VDbGFzc0NvbnZlcnRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJObyBjb252ZXJ0ZXJzIGZvciBwYWlyICgiICsgc291cmNlQ2xhc3MgKyAiLCAiICsgZGVzdENsYXNzICsgIikgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgICAgIHJldHVybiBUaGVOdWxsU3RyaW5nRnVuY3Rpb24uTlVMTDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSUNvbnZlcnNpb25GdW5jdGlvbiByZXN1bHQgPSAoSUNvbnZlcnNpb25GdW5jdGlvbikgc291cmNlQ2xhc3NDb252ZXJ0ZXJzLmdldChkZXN0Q2xhc3MpOwotICAgICAgICAKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgIAlTeXN0ZW0uZXJyLnByaW50bG4oIk5vIGNvbnZlcnRlcnMgZm9yIHBhaXIgKCIgKyBzb3VyY2VDbGFzcyArICIsICIgKyBkZXN0Q2xhc3MgKyAiKSBoYXZlIGJlZW4gcmVnaXN0ZXJlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICAgICAgcmV0dXJuIFRoZU51bGxTdHJpbmdGdW5jdGlvbi5OVUxMOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZXJlIGlzIGEgY29udmVydGVyIHJlZ2lzdGVyZWQgZm9yIGEgc3BlY2lmaWMgY2xhc3MyY2xhc3MKLSAgICAgKiBjb252ZXJzaW9uLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gc291cmNlQ2xhc3MKLSAgICAgKiBAcGFyYW0gZGVzdENsYXNzCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgY29udmVydGVyIGlzIHJlZ2lzdGVyZWQ7IGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQ29udmVydChDbGFzcyBzb3VyY2VDbGFzcywgQ2xhc3MgZGVzdENsYXNzKSB7Ci0gICAgICAgIGlmIChzb3VyY2VDbGFzcy5lcXVhbHMoZGVzdENsYXNzKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEhhc2hNYXAgc291cmNlQ2xhc3NDb252ZXJ0ZXJzID0gKEhhc2hNYXApIGNvbnZlcnRlckZ1bmN0aW9ucy5nZXQoc291cmNlQ2xhc3MpOwotICAgICAgICAKLSAgICAgICAgaWYgKHNvdXJjZUNsYXNzQ29udmVydGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElDb252ZXJzaW9uRnVuY3Rpb24gcmVzdWx0ID0gKElDb252ZXJzaW9uRnVuY3Rpb24pIHNvdXJjZUNsYXNzQ29udmVydGVycy5nZXQoZGVzdENsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgcGFpciAoc291cmNlQ2xhc3MsIGRlc3RDbGFzcykgY2FuIGJlIGNvbnZlcnRlZCBpbiBib3RoIGRpcmVjdGlvbnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZUNsYXNzIHRoZSBzb3VyY2UgQ2xhc3MgCi0gICAgICogQHBhcmFtIGRlc3RDbGFzcyB0aGUgZGVzdGluYXRpb24gQ2xhc3MKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhaXIgY2FuIGJlIGNvbnZlcnRlZCBpbiBib3RoIGRpcmVjdGlvbnM7IGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQ29udmVydFBhaXIoQ2xhc3Mgc291cmNlQ2xhc3MsIENsYXNzIGRlc3RDbGFzcykgewotICAgIAlpZiAoY2FuQ29udmVydChzb3VyY2VDbGFzcywgZGVzdENsYXNzKSAmJiBjYW5Db252ZXJ0KGRlc3RDbGFzcywgc291cmNlQ2xhc3MpKSB7Ci0gICAgCQlyZXR1cm4gdHJ1ZTsKLSAgICAJfQotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogUmVnaXN0ZXIgY29udmVydGVycyBmb3IgYnVpbHQtaW4gSmF2YSB0eXBlcwotICAgICAqLwotICAgIHN0YXRpYyB7Ci0gICAgICAgIGNvbnZlcnRlckZ1bmN0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBCb3hpbmcvdW5ib3hpbmcKLSAgICAgICAgYXNzb2NpYXRlKE9iamVjdC5jbGFzcywgU3RyaW5nLmNsYXNzLCBuZXcgQ29udmVydE9iamVjdDJTdHJpbmcoKSk7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIE9iamVjdC5jbGFzcywgbmV3IENvbnZlcnRTdHJpbmcyT2JqZWN0KCkpOwotICAgICAgICAKLSAgICAgICAgYXNzb2NpYXRlKENoYXJhY3Rlci5UWVBFLCBDaGFyYWN0ZXIuY2xhc3MsIFRoZUlkZW50aXR5RnVuY3Rpb24uSURFTlRJVFkpOwotICAgICAgICBhc3NvY2lhdGUoQ2hhcmFjdGVyLmNsYXNzLCBDaGFyYWN0ZXIuVFlQRSwgVGhlSWRlbnRpdHlGdW5jdGlvbi5JREVOVElUWSk7Ci0gICAgICAgIAotICAgICAgICBhc3NvY2lhdGUoQm9vbGVhbi5UWVBFLCBCb29sZWFuLmNsYXNzLCBUaGVJZGVudGl0eUZ1bmN0aW9uLklERU5USVRZKTsKLSAgICAgICAgYXNzb2NpYXRlKEJvb2xlYW4uY2xhc3MsIEJvb2xlYW4uVFlQRSwgVGhlSWRlbnRpdHlGdW5jdGlvbi5JREVOVElUWSk7Ci0gICAgICAgIAotICAgICAgICBhc3NvY2lhdGUoSW50ZWdlci5UWVBFLCBJbnRlZ2VyLmNsYXNzLCBUaGVJZGVudGl0eUZ1bmN0aW9uLklERU5USVRZKTsKLSAgICAgICAgYXNzb2NpYXRlKEludGVnZXIuY2xhc3MsIEludGVnZXIuVFlQRSwgVGhlSWRlbnRpdHlGdW5jdGlvbi5JREVOVElUWSk7Ci0gICAgICAgIAotICAgICAgICBhc3NvY2lhdGUoQnl0ZS5UWVBFLCBCeXRlLmNsYXNzLCBUaGVJZGVudGl0eUZ1bmN0aW9uLklERU5USVRZKTsKLSAgICAgICAgYXNzb2NpYXRlKEJ5dGUuY2xhc3MsIEJ5dGUuVFlQRSwgVGhlSWRlbnRpdHlGdW5jdGlvbi5JREVOVElUWSk7Ci0gICAgICAgIAotICAgICAgICBhc3NvY2lhdGUoU2hvcnQuVFlQRSwgU2hvcnQuY2xhc3MsIFRoZUlkZW50aXR5RnVuY3Rpb24uSURFTlRJVFkpOwotICAgICAgICBhc3NvY2lhdGUoU2hvcnQuY2xhc3MsIFNob3J0LlRZUEUsIFRoZUlkZW50aXR5RnVuY3Rpb24uSURFTlRJVFkpOwotICAgICAgICAKLSAgICAgICAgYXNzb2NpYXRlKExvbmcuVFlQRSwgTG9uZy5jbGFzcywgVGhlSWRlbnRpdHlGdW5jdGlvbi5JREVOVElUWSk7Ci0gICAgICAgIGFzc29jaWF0ZShMb25nLmNsYXNzLCBMb25nLlRZUEUsIFRoZUlkZW50aXR5RnVuY3Rpb24uSURFTlRJVFkpOwotICAgICAgICAKLSAgICAgICAgYXNzb2NpYXRlKEZsb2F0LlRZUEUsIEZsb2F0LmNsYXNzLCBUaGVJZGVudGl0eUZ1bmN0aW9uLklERU5USVRZKTsKLSAgICAgICAgYXNzb2NpYXRlKEZsb2F0LmNsYXNzLCBGbG9hdC5UWVBFLCBUaGVJZGVudGl0eUZ1bmN0aW9uLklERU5USVRZKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFN0cmluZyB0by9mcm9tIHByaW1pdGl2ZQotICAgICAgICBhc3NvY2lhdGUoQ2hhcmFjdGVyLlRZUEUsIFN0cmluZy5jbGFzcywgVG9TdHJpbmdDb252ZXJ0ZXIuVE9TVFJJTkdGVU5DVElPTik7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIENoYXJhY3Rlci5UWVBFLCBuZXcgQ29udmVydFN0cmluZzJDaGFyYWN0ZXIoKSk7Ci0KLSAgICAgICAgYXNzb2NpYXRlKEJvb2xlYW4uVFlQRSwgU3RyaW5nLmNsYXNzLCBuZXcgVG9TdHJpbmdDb252ZXJ0ZXIoKSk7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIEJvb2xlYW4uVFlQRSwgbmV3IENvbnZlcnRTdHJpbmcyQm9vbGVhbigpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc29jaWF0ZShJbnRlZ2VyLlRZUEUsIFN0cmluZy5jbGFzcywgVG9TdHJpbmdDb252ZXJ0ZXIuVE9TVFJJTkdGVU5DVElPTik7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIEludGVnZXIuVFlQRSwgbmV3IENvbnZlcnRTdHJpbmcySW50ZWdlcigpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc29jaWF0ZShCeXRlLlRZUEUsIFN0cmluZy5jbGFzcywgVG9TdHJpbmdDb252ZXJ0ZXIuVE9TVFJJTkdGVU5DVElPTik7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIEJ5dGUuVFlQRSwgbmV3IENvbnZlcnRTdHJpbmcyQnl0ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc29jaWF0ZShTaG9ydC5UWVBFLCBTdHJpbmcuY2xhc3MsIFRvU3RyaW5nQ29udmVydGVyLlRPU1RSSU5HRlVOQ1RJT04pOwotICAgICAgICBhc3NvY2lhdGUoU3RyaW5nLmNsYXNzLCBTaG9ydC5UWVBFLCBuZXcgQ29udmVydFN0cmluZzJTaG9ydCgpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc29jaWF0ZShMb25nLlRZUEUsIFN0cmluZy5jbGFzcywgVG9TdHJpbmdDb252ZXJ0ZXIuVE9TVFJJTkdGVU5DVElPTik7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIExvbmcuVFlQRSwgbmV3IENvbnZlcnRTdHJpbmcyTG9uZygpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc29jaWF0ZShGbG9hdC5UWVBFLCBTdHJpbmcuY2xhc3MsIFRvU3RyaW5nQ29udmVydGVyLlRPU1RSSU5HRlVOQ1RJT04pOwotICAgICAgICBhc3NvY2lhdGUoU3RyaW5nLmNsYXNzLCBGbG9hdC5UWVBFLCBuZXcgQ29udmVydFN0cmluZzJGbG9hdCgpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc29jaWF0ZShEb3VibGUuVFlQRSwgU3RyaW5nLmNsYXNzLCBUb1N0cmluZ0NvbnZlcnRlci5UT1NUUklOR0ZVTkNUSU9OKTsKLSAgICAgICAgYXNzb2NpYXRlKFN0cmluZy5jbGFzcywgRG91YmxlLlRZUEUsIG5ldyBDb252ZXJ0U3RyaW5nMkRvdWJsZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFN0cmluZyB0by9mcm9tIGJveGVkIHR5cGVzCi0gICAgICAgIGFzc29jaWF0ZShCb29sZWFuLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFRvU3RyaW5nQ29udmVydGVyLlRPU1RSSU5HRlVOQ1RJT04pOwotICAgICAgICBhc3NvY2lhdGUoU3RyaW5nLmNsYXNzLCBCb29sZWFuLmNsYXNzLCBuZXcgQ29udmVydFN0cmluZzJCb29sZWFuKCkpOwotICAgICAgICAKLSAgICAgICAgYXNzb2NpYXRlKEludGVnZXIuY2xhc3MsIFN0cmluZy5jbGFzcywgVG9TdHJpbmdDb252ZXJ0ZXIuVE9TVFJJTkdGVU5DVElPTik7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIEludGVnZXIuY2xhc3MsIG5ldyBDb252ZXJ0U3RyaW5nMkludGVnZXIoKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NvY2lhdGUoQnl0ZS5jbGFzcywgU3RyaW5nLmNsYXNzLCBUb1N0cmluZ0NvbnZlcnRlci5UT1NUUklOR0ZVTkNUSU9OKTsKLSAgICAgICAgYXNzb2NpYXRlKFN0cmluZy5jbGFzcywgQnl0ZS5jbGFzcywgbmV3IENvbnZlcnRTdHJpbmcyQnl0ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc29jaWF0ZShTaG9ydC5jbGFzcywgU3RyaW5nLmNsYXNzLCBUb1N0cmluZ0NvbnZlcnRlci5UT1NUUklOR0ZVTkNUSU9OKTsKLSAgICAgICAgYXNzb2NpYXRlKFN0cmluZy5jbGFzcywgU2hvcnQuY2xhc3MsIG5ldyBDb252ZXJ0U3RyaW5nMlNob3J0KCkpOwotICAgICAgICAKLSAgICAgICAgYXNzb2NpYXRlKExvbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgVG9TdHJpbmdDb252ZXJ0ZXIuVE9TVFJJTkdGVU5DVElPTik7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIExvbmcuY2xhc3MsIG5ldyBDb252ZXJ0U3RyaW5nMkxvbmcoKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NvY2lhdGUoRmxvYXQuY2xhc3MsIFN0cmluZy5jbGFzcywgVG9TdHJpbmdDb252ZXJ0ZXIuVE9TVFJJTkdGVU5DVElPTik7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIEZsb2F0LmNsYXNzLCBuZXcgQ29udmVydFN0cmluZzJGbG9hdCgpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc29jaWF0ZShEb3VibGUuY2xhc3MsIFN0cmluZy5jbGFzcywgVG9TdHJpbmdDb252ZXJ0ZXIuVE9TVFJJTkdGVU5DVElPTik7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIERvdWJsZS5jbGFzcywgbmV3IENvbnZlcnRTdHJpbmcyRG91YmxlKCkpOwotICAgICAgICAKLSAgICAgICAgYXNzb2NpYXRlKERhdGUuY2xhc3MsIFN0cmluZy5jbGFzcywgbmV3IENvbnZlcnREYXRlMlN0cmluZygpKTsKLSAgICAgICAgYXNzb2NpYXRlKFN0cmluZy5jbGFzcywgRGF0ZS5jbGFzcywgbmV3IENvbnZlcnRTdHJpbmcyRGF0ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc29jaWF0ZShCaWdEZWNpbWFsLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFRvU3RyaW5nQ29udmVydGVyLlRPU1RSSU5HRlVOQ1RJT04pOwotICAgICAgICBhc3NvY2lhdGUoU3RyaW5nLmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzLCBuZXcgQ29udmVydFN0cmluZzJCaWdEZWNpbWFsKCkpOwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbi9JQ29udmVyc2lvbkZ1bmN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbi9JQ29udmVyc2lvbkZ1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYjA5ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb24vSUNvbnZlcnNpb25GdW5jdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBkYjRvYmplY3RzIEluYy4gIGh0dHA6Ly93d3cuZGI0by5jb20KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgZGI0b2JqZWN0cyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9uOwotCi0vKioKLSAqIEludGVyZmFjZSBJQ29udmVyc2lvbkZ1bmN0aW9uLiBBbiBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBjYW4gY29udmVydCBmcm9tIG9uZSBkYXRhCi0gKiB0eXBlIHRvIGFub3RoZXIuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnZlcnNpb25GdW5jdGlvbiB7Ci0JLyoqCi0gICAgICogTWV0aG9kIGNvbnZlcnQuICBDb252ZXJ0IHRoZSB2YWx1ZSBpbiAnc291cmNlJyB0byBzb21lIG90aGVyIHR5cGUKLSAgICAgKiBhbmQgcmV0dXJuIGl0LgotICAgICAqIAotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIHZhbHVlIHRvIGNvbnZlcnQKLQkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnQoT2JqZWN0IHNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbi9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYzgzNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlByb3ZpZGVzIHN1cHBvcnQgZm9yIGRhdGEgYmluZGluZywgZm9yIGV4YW1wbGUgYmluZGluZyBhbiBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBtb2RlbAotb2JqZWN0IHRvIGEgVUkgd2lkZ2V0J3Mgc3RhdGUuPC9wPgotCi08cD5UaGlzIHBhY2thZ2UgaW5jbHVkZXMgYW4gaW50ZXJmYWNlIGFuZCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBzdGFuZGFyZCBjb252ZXJ0ZXIgZnVuY3Rpb25zLjwvcD4KLTxoMj5QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotPHA+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0NvbnZlcnREYXRlMlN0cmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0NvbnZlcnREYXRlMlN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2MxY2VjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0RGF0ZTJTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgZGI0b2JqZWN0cyBJbmMuICBodHRwOi8vd3d3LmRiNG8uY29tCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIGRiNG9iamVjdHMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9uLklDb252ZXJzaW9uRnVuY3Rpb247Ci0KLQotLyoqCi0gKiBDb252ZXJ0IGEgSmF2YS51dGlsLkRhdGUgdG8gYSBTdHJpbmcgdXNpbmcgdGhlIGN1cnJlbnQgbG9jYWxlLiAgTnVsbCBkYXRlCi0gKiB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byBhbiBlbXB0eSBzdHJpbmcuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnREYXRlMlN0cmluZyBleHRlbmRzIERhdGVDb252ZXJzaW9uU3VwcG9ydCBpbXBsZW1lbnRzIElDb252ZXJzaW9uRnVuY3Rpb24gewkKLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnQoT2JqZWN0IHNvdXJjZSkgewotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gZm9ybWF0KChEYXRlKXNvdXJjZSk7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydE9iamVjdDJTdHJpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0T2JqZWN0MlN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDUzNGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0T2JqZWN0MlN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBkYjRvYmplY3RzIEluYy4gIGh0dHA6Ly93d3cuZGI0by5jb20KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgZGI0b2JqZWN0cyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9uLkNvbnZlcnNpb25GdW5jdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9uLklDb252ZXJzaW9uRnVuY3Rpb247Ci0KLQotLyoqCi0gKiBDb252ZXJ0T2JqZWN0MlN0cmluZy4gVGhpcyBpcyB0aGUgZmFsbC1iYWNrIGNvbnZlcnRlci4gIElmIHRoZSBwcm9wZXJ0eSB0eXBlCi0gKiBpcyBhYnN0cmFjdCwgd2UgbWlnaHQgbm90IGhhdmUgYSBjb252ZXJ0ZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIHByb3BlcnR5IHR5cGUuCi0gKiBJbiB0aGF0IGNhc2UsIHRoaXMgY29udmVydGVyIHdpbGwgYmUgdXNlZCwgd2hpY2ggd2lsbCB0cnkgdG8gZmluZCBhIAotICogY29udmVydGVyIHRoYXQgd2lsbCBjb252ZXJ0IHRoZSBzb3VyY2Ugb2JqZWN0J3MgYWN0dWFsIChjb25jcmV0ZSkgdHlwZQotICogdG8gYSBTdHJpbmcgYW5kIHVzZSB0aGF0IGlmIGl0IGZpbmRzIG9uZS4KLSAqIDxwPgotICogTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHdheSB0byByZXZlcnNlIHRoaXMgcHJvY2Vzcy4KLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRPYmplY3QyU3RyaW5nIGltcGxlbWVudHMgSUNvbnZlcnNpb25GdW5jdGlvbiB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyI2NvbnZlcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnQoT2JqZWN0IHNvdXJjZSkgewotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIAotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBJQ29udmVyc2lvbkZ1bmN0aW9uIGNvbnZlcnRlciA9IENvbnZlcnNpb25GdW5jdGlvblJlZ2lzdHJ5LmdldChzb3VyY2UuZ2V0Q2xhc3MoKSwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnQoc291cmNlKTsKLSAgICAgICAgfQotICAgICAgICAKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5hYmxlIHRvIGZpbmQgYSBjb252ZXJ0ZXIgZm9yICIgKyBzb3VyY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHRvIFN0cmluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0U3RyaW5nMkJpZ0RlY2ltYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0U3RyaW5nMkJpZ0RlY2ltYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmOWM1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydFN0cmluZzJCaWdEZWNpbWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbi5JQ29udmVyc2lvbkZ1bmN0aW9uOwotCi0KLQotLyoqCi0gKiBDb252ZXJ0U3RyaW5nMkJpZ0RlY2ltYWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0U3RyaW5nMkJpZ0RlY2ltYWwgaW1wbGVtZW50cyBJQ29udmVyc2lvbkZ1bmN0aW9uIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmcuY29udmVydGVyLklDb252ZXJ0ZXIjY29udmVydChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydChPYmplY3Qgc291cmNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIAlyZXR1cm4gbmV3IEJpZ0RlY2ltYWwoKFN0cmluZylzb3VyY2UpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nMkJpZ0RlY2ltYWw6ICIgKyBlLmdldE1lc3NhZ2UoKSArICI6ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0NvbnZlcnRTdHJpbmcyQm9vbGVhbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0NvbnZlcnRTdHJpbmcyQm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWUyOGQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0U3RyaW5nMkJvb2xlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgZGI0b2JqZWN0cyBJbmMuICBodHRwOi8vd3d3LmRiNG8uY29tCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIGRiNG9iamVjdHMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbi5JQ29udmVyc2lvbkZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLkJpbmRpbmdNZXNzYWdlczsKLQotCi0KLS8qKgotICogQ29udmVydFN0cmluZzJCb29sZWFuLgotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydFN0cmluZzJCb29sZWFuIGltcGxlbWVudHMgSUNvbnZlcnNpb25GdW5jdGlvbiB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyI2NvbnZlcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnQoT2JqZWN0IHNvdXJjZSkgewotICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpIHNvdXJjZTsKLSAgICAgICAgaWYgKHMuZXF1YWxzKEJpbmRpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlllcyIpKSB8fCBzLmVxdWFscyhCaW5kaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJ5ZXMiKSkgfHwgcy5lcXVhbHMoQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygidHJ1ZSIpKSB8fCBzLmVxdWFscyhCaW5kaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJUcnVlIikpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgICAgICBpZiAocy5lcXVhbHMoQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygiTm8iKSkgfHwgcy5lcXVhbHMoQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygibm8iKSkgfHwgcy5lcXVhbHMoQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygiZmFsc2UiKSkgfHwgcy5lcXVhbHMoQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygiRmFsc2UiKSkpICAgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtNCQKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOwotICAgICAgICAKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihzICsgIiBpcyBub3QgYSBsZWdhbCBib29sZWFuIHZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0U3RyaW5nMkJ5dGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0U3RyaW5nMkJ5dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhOTIyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydFN0cmluZzJCeXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb24uSUNvbnZlcnNpb25GdW5jdGlvbjsKLQotCi0KLS8qKgotICogQ29udmVydFN0cmluZzJCeXRlLgotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydFN0cmluZzJCeXRlIGltcGxlbWVudHMgSUNvbnZlcnNpb25GdW5jdGlvbiB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyI2NvbnZlcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnQoT2JqZWN0IHNvdXJjZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlKEJ5dGUucGFyc2VCeXRlKChTdHJpbmcpIHNvdXJjZSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nMkJ5dGU6ICIgKyBlLmdldE1lc3NhZ2UoKSArICI6ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0NvbnZlcnRTdHJpbmcyQ2hhcmFjdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydFN0cmluZzJDaGFyYWN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkMmQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydFN0cmluZzJDaGFyYWN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgZGI0b2JqZWN0cyBJbmMuICBodHRwOi8vd3d3LmRiNG8uY29tCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIGRiNG9iamVjdHMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbi5JQ29udmVyc2lvbkZ1bmN0aW9uOwotCi0KLQotLyoqCi0gKiBDb252ZXJ0U3RyaW5nMkNoYXJhY3Rlci4KLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRTdHJpbmcyQ2hhcmFjdGVyIGltcGxlbWVudHMgSUNvbnZlcnNpb25GdW5jdGlvbiB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyI2NvbnZlcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnQoT2JqZWN0IHNvdXJjZSkgewotICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpIHNvdXJjZTsKLSAgICAgICAgQ2hhcmFjdGVyIHJlc3VsdDsKLSAgICAgICAgCi0gICAgICAgIGlmIChzLmxlbmd0aCgpID4gMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZzJDaGFyYWN0ZXI6IHN0cmluZyB0b28gbG9uZzogIiArIHMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENoYXJhY3RlcihzLmNoYXJBdCgwKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcyQ2hhcmFjdGVyOiAiICsgZS5nZXRNZXNzYWdlKCkgKyAiOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0NvbnZlcnRTdHJpbmcyRGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0NvbnZlcnRTdHJpbmcyRGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDNjMDI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0U3RyaW5nMkRhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgZGI0b2JqZWN0cyBJbmMuICBodHRwOi8vd3d3LmRiNG8uY29tCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIGRiNG9iamVjdHMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbi5JQ29udmVyc2lvbkZ1bmN0aW9uOwotCi0vKioKLSAqIENvbnZlcnQgYSBTdHJpbmcgdG8gYSBqYXZhLnV0aWwuRGF0ZSwgcmVzcGVjdGluZyB0aGUgY3VycmVudCBsb2NhbGUKLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydFN0cmluZzJEYXRlIGV4dGVuZHMgRGF0ZUNvbnZlcnNpb25TdXBwb3J0IGltcGxlbWVudHMgSUNvbnZlcnNpb25GdW5jdGlvbiB7Ci0JcHVibGljIE9iamVjdCBjb252ZXJ0KE9iamVjdCBzb3VyY2UpIHsKLQkJcmV0dXJuIHBhcnNlKHNvdXJjZS50b1N0cmluZygpKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0NvbnZlcnRTdHJpbmcyRG91YmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydFN0cmluZzJEb3VibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkN2Q0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydFN0cmluZzJEb3VibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgZGI0b2JqZWN0cyBJbmMuICBodHRwOi8vd3d3LmRiNG8uY29tCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIGRiNG9iamVjdHMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbi5JQ29udmVyc2lvbkZ1bmN0aW9uOwotCi0KLQotLyoqCi0gKiBDb252ZXJ0U3RyaW5nMkRvdWJsZS4KLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRTdHJpbmcyRG91YmxlIGltcGxlbWVudHMgSUNvbnZlcnNpb25GdW5jdGlvbiB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyI2NvbnZlcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnQoT2JqZWN0IHNvdXJjZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoRG91YmxlLnBhcnNlRG91YmxlKChTdHJpbmcpIHNvdXJjZSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nMkRvdWJsZTogIiArIGUuZ2V0TWVzc2FnZSgpICsgIjogIiArIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydFN0cmluZzJGbG9hdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0NvbnZlcnRTdHJpbmcyRmxvYXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyYTgyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydFN0cmluZzJGbG9hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBkYjRvYmplY3RzIEluYy4gIGh0dHA6Ly93d3cuZGI0by5jb20KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgZGI0b2JqZWN0cyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9uLklDb252ZXJzaW9uRnVuY3Rpb247Ci0KLQotCi0vKioKLSAqIENvbnZlcnRTdHJpbmcyRmxvYXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0U3RyaW5nMkZsb2F0IGltcGxlbWVudHMgSUNvbnZlcnNpb25GdW5jdGlvbiB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyI2NvbnZlcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnQoT2JqZWN0IHNvdXJjZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChGbG9hdC5wYXJzZUZsb2F0KChTdHJpbmcpIHNvdXJjZSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nMkZsb2F0OiAiICsgZS5nZXRNZXNzYWdlKCkgKyAiOiAiICsgc291cmNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0U3RyaW5nMkludGVnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0U3RyaW5nMkludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiMDAwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydFN0cmluZzJJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb24uSUNvbnZlcnNpb25GdW5jdGlvbjsKLQotCi0KLS8qKgotICogQ29udmVydFN0cmluZzJJbnRlZ2VyLgotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydFN0cmluZzJJbnRlZ2VyIGltcGxlbWVudHMgSUNvbnZlcnNpb25GdW5jdGlvbiB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyI2NvbnZlcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnQoT2JqZWN0IHNvdXJjZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgc291cmNlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcySW50ZWdlcjogIiArIGUuZ2V0TWVzc2FnZSgpICsgIjogIiArIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydFN0cmluZzJMb25nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydFN0cmluZzJMb25nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNGIyNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0NvbnZlcnRTdHJpbmcyTG9uZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBkYjRvYmplY3RzIEluYy4gIGh0dHA6Ly93d3cuZGI0by5jb20KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgZGI0b2JqZWN0cyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9uLklDb252ZXJzaW9uRnVuY3Rpb247Ci0KLQotCi0vKioKLSAqIENvbnZlcnRTdHJpbmcyTG9uZy4KLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRTdHJpbmcyTG9uZyBpbXBsZW1lbnRzIElDb252ZXJzaW9uRnVuY3Rpb24gewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZy5jb252ZXJ0ZXIuSUNvbnZlcnRlciNjb252ZXJ0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0KE9iamVjdCBzb3VyY2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZyhMb25nLnBhcnNlTG9uZygoU3RyaW5nKSBzb3VyY2UpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZzJMb25nOiAiICsgZS5nZXRNZXNzYWdlKCkgKyAiOiAiICsgc291cmNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0U3RyaW5nMk9iamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0NvbnZlcnRTdHJpbmcyT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMGEwZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0NvbnZlcnRTdHJpbmcyT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb24uSUNvbnZlcnNpb25GdW5jdGlvbjsKLQotCi0KLS8qKgotICogQ29udmVydFN0cmluZzJPYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0U3RyaW5nMk9iamVjdCBpbXBsZW1lbnRzIElDb252ZXJzaW9uRnVuY3Rpb24gewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZy5jb252ZXJ0ZXIuSUNvbnZlcnRlciNjb252ZXJ0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0KE9iamVjdCBzb3VyY2UpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5hYmxlIHRvIGdlbmVyaWNhbGx5IGNvbnZlcnQgamF2YS5sYW5nLlN0cmluZyB0byBqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0U3RyaW5nMlNob3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvQ29udmVydFN0cmluZzJTaG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmFjYzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Db252ZXJ0U3RyaW5nMlNob3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb24uSUNvbnZlcnNpb25GdW5jdGlvbjsKLQotCi0KLS8qKgotICogQ29udmVydFN0cmluZzJTaG9ydC4KLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRTdHJpbmcyU2hvcnQgaW1wbGVtZW50cyBJQ29udmVyc2lvbkZ1bmN0aW9uIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmcuY29udmVydGVyLklDb252ZXJ0ZXIjY29udmVydChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydChPYmplY3Qgc291cmNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNob3J0KFNob3J0LnBhcnNlU2hvcnQoKFN0cmluZykgc291cmNlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcyU2hvcnQ6ICIgKyBlLmdldE1lc3NhZ2UoKSArICI6ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0RhdGVDb252ZXJzaW9uU3VwcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL0RhdGVDb252ZXJzaW9uU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjY4Njc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9EYXRlQ29udmVyc2lvblN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgZGI0b2JqZWN0cyBJbmMuICBodHRwOi8vd3d3LmRiNG8uY29tCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIGRiNG9iamVjdHMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBCYXNlIHN1cHBvcnQgZm9yIGRhdGUvc3RyaW5nIGNvbnZlcnNpb24gaGFuZGxpbmcgYWNjb3JkaW5nIHRvIHRoZQotICogZGVmYXVsdCBsb2NhbGUgb3IgaW4gcGxhaW4gbG9uZyBtaWxsaXNlY29uZHMuCi0gKiAKLSAqIE5PVEU6IHBhcnNlKGZvcm1hdChkYXRlKSkgd2lsbCBnZW5lcmFsbHkgKm5vdCogYmUgZXF1YWwgdG8gZGF0ZSwgc2luY2UgdGhlCi0gKiBzdHJpbmcgcmVwcmVzZW50YXRpb24gbWF5IG5vdCBjb3ZlciB0aGUgc3ViLXNlY29uZCByYW5nZSwgdGltZS1vbmx5IHN0cmluZwotICogcmVwcmVzZW50YXRpb25zIHdpbGwgYmUgY291bnRlZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVyYSwgZXRjLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0ZUNvbnZlcnNpb25TdXBwb3J0IHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgREFURV9GT1JNQVQ9RGF0ZUZvcm1hdC5TSE9SVDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9GT1JNQVRURVJfSU5ERVg9MDsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBOVU1fVklSVFVBTF9GT1JNQVRURVJTPTE7Ci0JCi0JLyoqCi0JICogQWx0ZXJuYXRpdmUgZm9ybWF0dGVycyBmb3IgZGF0ZSwgdGltZSBhbmQgZGF0ZS90aW1lLgotCSAqIFJhdyBtaWxsaXNlY29uZHMgYXJlIGNvdmVyZWQgYXMgYSBzcGVjaWFsIGNhc2UuCi0JICovCi0JLy8gVE9ETzogVGhlc2UgY291bGQgYmUgc2hhcmVkLCBidXQgd291bGQgaGF2ZSB0byBiZSBzeW5jaHJvbml6ZWQuCi0JcHJpdmF0ZSBEYXRlRm9ybWF0W10gZm9ybWF0dGVycz17Ci0JCQluZXcgU2ltcGxlRGF0ZUZvcm1hdCgiZGQuTU0ueXl5eSBISDptbTpzcy5TU1MgWiIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiSEg6bW06c3MuU1NTIiksIC8vJE5PTi1OTFMtMSQKLQkJCURhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZShEQVRFX0ZPUk1BVCxEYXRlRm9ybWF0LlNIT1JUKSwKLQkJCURhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERBVEVfRk9STUFUKSwKLQkJCURhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKERhdGVGb3JtYXQuU0hPUlQpLAotICAgICAgICAgICAgRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKERBVEVfRk9STUFULERhdGVGb3JtYXQuTUVESVVNKSwKLSAgICAgICAgICAgIERhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKERhdGVGb3JtYXQuTUVESVVNKQotCX07Ci0JCi0JLyoqCi0JICogVHJpZXMgYWxsIGF2YWlsYWJsZSBmb3JtYXR0ZXJzIHRvIHBhcnNlIHRoZSBnaXZlbiBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZQotCSAqIGRlZmF1bHQgbG9jYWxlIG9yIGFzIGEgcmF3IG1pbGxpc2Vjb25kIHZhbHVlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlCi0JICogZmlyc3Qgc3VjY2Vzc2Z1bCBydW4uCi0JICogCi0JICogQHBhcmFtIHN0ciBBIHN0cmluZyBzcGVjaWZ5aW5nIGEgZGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGRlZmF1bHQgbG9jYWxlIG9yIGluIHJhdyBtaWxsaXNlY29uZHMKLQkgKiBAcmV0dXJuIFRoZSBwYXJzZWQgZGF0ZSwgb3IgbnVsbCwgaWYgbm8gYXZhaWxhYmxlIGZvcm1hdHRlciBjb3VsZCBpbnRlcnByZXQgdGhlIGlucHV0IHN0cmluZwotCSAqLwotCXByb3RlY3RlZCBEYXRlIHBhcnNlKFN0cmluZyBzdHIpIHsKLQkJZm9yIChpbnQgZm9ybWF0dGVySWR4ID0gMDsgZm9ybWF0dGVySWR4IDwgZm9ybWF0dGVycy5sZW5ndGg7IGZvcm1hdHRlcklkeCsrKSB7Ci0JCQlEYXRlIHBhcnNlZD1wYXJzZShzdHIsZm9ybWF0dGVySWR4KTsKLQkJCWlmKHBhcnNlZCE9bnVsbCkgewotCQkJCXJldHVybiBwYXJzZWQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIERhdGUgcGFyc2UoU3RyaW5nIHN0cixpbnQgZm9ybWF0dGVySWR4KSB7Ci0JCWlmKGZvcm1hdHRlcklkeD49MCkgewotCQkJCVBhcnNlUG9zaXRpb24gcG9zPW5ldyBQYXJzZVBvc2l0aW9uKDApOwotCQkJCURhdGUgZGF0ZT1mb3JtYXR0ZXJzW2Zvcm1hdHRlcklkeF0ucGFyc2Uoc3RyLHBvcyk7Ci0JCQkJaWYocG9zLmdldEVycm9ySW5kZXgoKSE9LTF8fHBvcy5nZXRJbmRleCgpIT1zdHIubGVuZ3RoKCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBkYXRlOwotCQl9Ci0JCXRyeSB7Ci0JCQlsb25nIG1pbGxpc2Vjcz1Mb25nLnBhcnNlTG9uZyhzdHIpOwotCQkJcmV0dXJuIG5ldyBEYXRlKG1pbGxpc2Vjcyk7Ci0JCX0KLQkJY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4YykgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBGb3JtYXRzIHRoZSBnaXZlbiBkYXRlIHdpdGggdGhlIGRlZmF1bHQgZm9ybWF0dGVyIGFjY29yZGluZyB0byB0aGUgZGVmYXVsdCBsb2NhbGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtYXQoRGF0ZSBkYXRlKSB7Ci0JCXJldHVybiBmb3JtYXQoZGF0ZSxERUZBVUxUX0ZPUk1BVFRFUl9JTkRFWCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtYXQoRGF0ZSBkYXRlLGludCBmb3JtYXR0ZXJJZHgpIHsKLQkJaWYoZm9ybWF0dGVySWR4Pj0wKSB7Ci0JCQlyZXR1cm4gZm9ybWF0dGVyc1tmb3JtYXR0ZXJJZHhdLmZvcm1hdChkYXRlKTsKLQkJfQotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZGF0ZS5nZXRUaW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgbnVtRm9ybWF0dGVycygpIHsKLQkJcmV0dXJuIGZvcm1hdHRlcnMubGVuZ3RoK05VTV9WSVJUVUFMX0ZPUk1BVFRFUlM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9UaGVJZGVudGl0eUZ1bmN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvVGhlSWRlbnRpdHlGdW5jdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjYzNzc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9UaGVJZGVudGl0eUZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb24uSUNvbnZlcnNpb25GdW5jdGlvbjsKLQotCi0KLS8qKgotICogVGhlSWRlbnRpdHlDb252ZXJ0ZXIuICBSZXR1cm5zIHRoZSBzb3VyY2UgdmFsdWUgKHRoZSBpZGVudGl0eSBmdW5jdGlvbikuCi0gKi8KLXB1YmxpYyBjbGFzcyBUaGVJZGVudGl0eUZ1bmN0aW9uIGltcGxlbWVudHMgSUNvbnZlcnNpb25GdW5jdGlvbiB7Ci0KLQkvKioKLQkgKiBJZGVudGl0eSBjb252ZXJ0ZXIgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJQ29udmVyc2lvbkZ1bmN0aW9uIElERU5USVRZID0gbmV3IFRoZUlkZW50aXR5RnVuY3Rpb24oKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmcuY29udmVydGVyLklDb252ZXJ0ZXIjY29udmVydChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydChPYmplY3Qgc291cmNlKSB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9UaGVOdWxsU3RyaW5nRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9UaGVOdWxsU3RyaW5nRnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2Yzc5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvVGhlTnVsbFN0cmluZ0Z1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb24uSUNvbnZlcnNpb25GdW5jdGlvbjsKLQotCi0KLS8qKgotICogVGhlTnVsbENvbnZlcnRlci4gIFRoZU51bGxPYmplY3RQYXR0ZXJuIGZvciBhbnkgdHlwZSB0byBTdHJpbmcgY29udmVyc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIFRoZU51bGxTdHJpbmdGdW5jdGlvbiBpbXBsZW1lbnRzIElDb252ZXJzaW9uRnVuY3Rpb24gewotCi0JLyoqCi0JICogTnVsbCBjb252ZXJ0ZXIgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJQ29udmVyc2lvbkZ1bmN0aW9uIE5VTEwgPSBuZXcgVGhlTnVsbFN0cmluZ0Z1bmN0aW9uKCk7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyI2NvbnZlcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnQoT2JqZWN0IHNvdXJjZSkgewotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcmZ1bmN0aW9ucy9Ub1N0cmluZ0NvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL1RvU3RyaW5nQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNzE5NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL1RvU3RyaW5nQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb24uSUNvbnZlcnNpb25GdW5jdGlvbjsKLQotCi0KLS8qKgotICogQ29udmVydHMgYW55IG9iamVjdCB0byBhIHN0cmluZyBieSBjYWxsaW5nIGl0cyB0b1N0cmluZygpIG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIFRvU3RyaW5nQ29udmVydGVyIGltcGxlbWVudHMgSUNvbnZlcnNpb25GdW5jdGlvbiB7Ci0JCi0JLyoqCi0JICogQSBzaW5nbGV0b24gZm9yIHRoZSB0b1N0cmluZygpIGNvbnZlcnRlciBmdW5jdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVG9TdHJpbmdDb252ZXJ0ZXIgVE9TVFJJTkdGVU5DVElPTiA9IG5ldyBUb1N0cmluZ0NvbnZlcnRlcigpOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZy5jb252ZXJ0ZXIuSUNvbnZlcnRlciNjb252ZXJ0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0KE9iamVjdCBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc291cmNlLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVyZnVuY3Rpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxZjNjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJmdW5jdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlByb3ZpZGVzIHN1cHBvcnQgZm9yIGRhdGEgYmluZGluZywgZm9yIGV4YW1wbGUgYmluZGluZyBhbiBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBtb2RlbAotb2JqZWN0IHRvIGEgVUkgd2lkZ2V0J3Mgc3RhdGUuPC9wPgotCi08cD5UaGlzIHBhY2thZ2UgaW5jbHVkZXMgdGhlIHN0YW5kYXJkIGNvbnZlcnRlciBmdW5jdGlvbnMgZm9yIGphdmEubGFuZy4qIGFuZCBqYXZhLnV0aWwuKi48L3A+Ci08aDI+UGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLTxwPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcnMvRnVuY3Rpb25hbENvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVycy9GdW5jdGlvbmFsQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNWFiNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVycy9GdW5jdGlvbmFsQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLyBUT0RPIGRqbzogY29weXJpZ2h0Ci1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXIuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9uLkNvbnZlcnNpb25GdW5jdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcmZ1bmN0aW9uLklDb252ZXJzaW9uRnVuY3Rpb247Ci0KLS8qKgotICogQ29udmVydGVyIHRoYXQgbG9va3MgdXAgaXRzIHRhcmdldCB0byBtb2RlbCBhbmQgbW9kZWwgdG8gdGFyZ2V0IG1ldGhvZHMKLSAqIGluIHRoZSBDb252ZXJ0c2lvbkZ1bmN0aW9uUmVnaXN0cnkuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIEZ1bmN0aW9uYWxDb252ZXJ0ZXIgZXh0ZW5kcyBDb252ZXJ0ZXIgewotCi0JcHJpdmF0ZSBJQ29udmVyc2lvbkZ1bmN0aW9uIHRhcmdldFRvTW9kZWw7Ci0JcHJpdmF0ZSBJQ29udmVyc2lvbkZ1bmN0aW9uIG1vZGVsVG9UYXJnZXQ7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIENvbnZlcnRlciB0aGF0IGxvb2tzIHVwIGl0cyB0YXJnZXQgdG8gbW9kZWwgYW5kIG1vZGVsIHRvIHRhcmdldCBtZXRob2RzCi0JICogaW4gdGhlIENvbnZlcnRzaW9uRnVuY3Rpb25SZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0VHlwZSBUaGUgdGFyZ2V0IHR5cGUgQ2xhc3MKLQkgKiBAcGFyYW0gbW9kZWxUeXBlIFRoZSBtb2RlbCB0eXBlIENsYXNzCi0JICovCi0JcHVibGljIEZ1bmN0aW9uYWxDb252ZXJ0ZXIoQ2xhc3MgdGFyZ2V0VHlwZSwgQ2xhc3MgbW9kZWxUeXBlKSB7Ci0JCXN1cGVyKHRhcmdldFR5cGUsIG1vZGVsVHlwZSk7Ci0JCXRhcmdldFRvTW9kZWwgPSBDb252ZXJzaW9uRnVuY3Rpb25SZWdpc3RyeS5nZXQodGFyZ2V0VHlwZSwgbW9kZWxUeXBlKTsKLQkJbW9kZWxUb1RhcmdldCA9IENvbnZlcnNpb25GdW5jdGlvblJlZ2lzdHJ5LmdldChtb2RlbFR5cGUsIHRhcmdldFR5cGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyI2NvbnZlcnRUYXJnZXRUb01vZGVsKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0VGFyZ2V0VG9Nb2RlbChPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCXJldHVybiB0YXJnZXRUb01vZGVsLmNvbnZlcnQodGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXIuSUNvbnZlcnRlciNjb252ZXJ0TW9kZWxUb1RhcmdldChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydE1vZGVsVG9UYXJnZXQoT2JqZWN0IG1vZGVsT2JqZWN0KSB7Ci0JCXJldHVybiBtb2RlbFRvVGFyZ2V0LmNvbnZlcnQobW9kZWxPYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVycy9JZGVudGl0eUNvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvY29udmVydGVycy9JZGVudGl0eUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDc3ZGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcnMvSWRlbnRpdHlDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyLkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXIuSUNvbnZlcnRlcjsKLQotLyoqCi0gKiBBIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJQ29udmVydGVyfS4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBJZGVudGl0eUNvbnZlcnRlciBleHRlbmRzIENvbnZlcnRlciBpbXBsZW1lbnRzIElDb252ZXJ0ZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlDb252ZXJ0ZXIoQ2xhc3MgdHlwZSkgewotCQlzdXBlcih0eXBlLCB0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VmdWwgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiwgZS5nLiwgSW50ZWdlci5jbGFzcyBhbmQgaW50LmNsYXNzCi0JICogCi0JICogQHBhcmFtIHRhcmdldFR5cGUKLQkgKiBAcGFyYW0gbW9kZWxUeXBlCi0JICovCi0JcHVibGljIElkZW50aXR5Q29udmVydGVyKENsYXNzIHRhcmdldFR5cGUsIENsYXNzIG1vZGVsVHlwZSkgewotCQlzdXBlcih0YXJnZXRUeXBlLCBtb2RlbFR5cGUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY29udmVydFRhcmdldFRvTW9kZWwoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoZ2V0TW9kZWxUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykgJiYgb2JqZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjb252ZXJ0TW9kZWxUb1RhcmdldChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChnZXRUYXJnZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykgJiYgb2JqZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9jb252ZXJ0ZXJzL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2E3MmY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL2NvbnZlcnRlcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlByb3ZpZGVzIHN1cHBvcnQgZm9yIGRhdGEgYmluZGluZywgZm9yIGV4YW1wbGUgYmluZGluZyBhbiBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBtb2RlbAotb2JqZWN0IHRvIGEgVUkgd2lkZ2V0J3Mgc3RhdGUuPC9wPgotCi08cD5UaGlzIHBhY2thZ2UgaW5jbHVkZXMgc3RhbmRhcmQgY29udmVydGVycyBmb3IgSmF2YSdzIGJ1aWx0LWluIGRhdGEgdHlwZXMuPC9wPgotPGgyPlBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci08cD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MTkxYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlByb3ZpZGVzIHN1cHBvcnQgZm9yIGRhdGEgYmluZGluZywgZm9yIGV4YW1wbGUgYmluZGluZyBhbiBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBtb2RlbAotb2JqZWN0IHRvIGEgVUkgd2lkZ2V0J3Mgc3RhdGUuPC9wPgotCi08cD5UaGlzIHBhY2thZ2UgaW5jbHVkZXMgaW50ZXJmYWNlcyBhbmQgY2xhc3NlcyB0aGF0IGRlZmluZSB0aGUgbWFpbiBkYXRhIGJpbmRpbmcgQVBJPC9wPgotPGgyPlBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci08cD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9zd3QvU1dUUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvc3d0L1NXVFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2OGM0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9zd3QvU1dUUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuc3d0OwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIHRvIGRlc2NyaWJlIHByb3BlcnRpZXMgb2YgU1dUIGNvbnRyb2xzLgotICogCi0gKiBAc2luY2UgMy4yCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNXVFByb3BlcnRpZXMgewotCi0JLyoqCi0JICogQXBwbGllcyB0byBDb250cm9sCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFRCA9ICJlbmFibGVkIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEFwcGxpZXMgdG8gQ29udHJvbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lCTEUgPSAidmlzaWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBBcHBsaWVzIHRvCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTVMgPSAiaXRlbXMiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQXBwbGllcyB0byBTcGlubmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYID0gIm1heCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBBcHBsaWVzIHRvIFNwaW5uZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU4gPSAibWluIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEFwcGxpZXMgdG8gU3Bpbm5lciwgQnV0dG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OID0gInNlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBBcHBsaWVzIHRvIFRleHQsIExhYmVsLCBDb21ibwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvc3d0L1NXVFVwZGF0YWJsZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3N3dC9TV1RVcGRhdGFibGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZDI2MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvc3d0L1NXVFVwZGF0YWJsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSURhdGFCaW5kaW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZpZXdlcnMuVmlld2Vyc1Byb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuc3d0LkJ1dHRvblVwZGF0YWJsZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dC5DQ29tYm9VcGRhdGFibGVDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dC5DQ29tYm9VcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5zd3QuQ29tYm9VcGRhdGFibGVDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dC5Db21ib1VwZGF0YWJsZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dC5Db250cm9sVXBkYXRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuc3d0LkxhYmVsVXBkYXRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuc3d0Lkxpc3RVcGRhdGFibGVDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dC5MaXN0VXBkYXRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuc3d0LlNwaW5uZXJVcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5zd3QuVGFibGVVcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5zd3QuVGV4dFVwZGF0YWJsZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlclVwZGF0YWJsZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnZpZXdlcnMuVGFibGVWaWV3ZXJVcGRhdGFibGVDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnZpZXdlcnMuVXBkYXRhYmxlQ29sbGVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0TGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgZmFjdG9yeSB0aGF0IHN1cHBvcnRzIGJpbmRpbmcgdG8gU1dUIGNvbnRyb2xzLiBUaGlzCi0gKiBmYWN0b3J5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb24gb2JqZWN0czoKLSAqIDx1bD4KLSAqIDxsaT5vcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0IC0gZGVub3RlcyB0aGUgdGV4dCdzIHRleHQgcHJvcGVydHk8L2xpPgotICogPGxpPm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbiAtIGRlbm90ZXMgdGhlIGJ1dHRvbidzIHNlbGVjdGlvbgotICogcHJvcGVydHk8L2xpPgotICogPGxpPm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvIC0gZGVub3RlcyB0aGUgY29tYm8ncyBpdGVtcyBjb2xsZWN0aW9uPC9saT4KLSAqIDxsaT5vcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DQ29tYm8gLSBkZW5vdGVzIHRoZSBjY29tYm8ncyBpdGVtcwotICogY29sbGVjdGlvbjwvbGk+Ci0gKiA8bGk+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCAtIGRlbm90ZXMgdGhlIGxpc3QncyBpdGVtcyBjb2xsZWN0aW9uPC9saT4KLSAqIDxsaT5vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5Qcm9wZXJ0eURlc2NyaXB0aW9uIC0gZGVwZW5kaW5nIG9uIHRoZQotICogcHJvcGVydHkgZGVzY3JpcHRpb24ncyBvYmplY3QgYW5kIHByb3BlcnR5IElEOgotICogPHVsPgotICogPGxpPm9iamVjdCBpbnN0YW5jZW9mIFdpZGdldCwgcHJvcGVydHkgSUQgaXMgU1dUX0VOQUJMRUQgLSBkZW5vdGluZyB0aGUKLSAqIHdpZGdldCdzIGVuYWJsZWQgcHJvcGVydHk8L2xpPgotICogPGxpPm9iamVjdCBpbnN0YW5jZW9mIFNwaW5uZXIsIHByb3BlcnR5IElEIGlzIFNXVF9TRUxFQ1RJT04gLSBkZW5vdGluZwotICogdGhlIHNwaW5uZXIncyBzZWxlY3Rpb24gcHJvcGVydHk8L2xpPgotICogPGxpPm9iamVjdCBpbnN0YW5jZW9mIFNwaW5uZXIsIHByb3BlcnR5IElEIGlzIFNXVF9NSU5JTVVNIC0gZGVub3RpbmcgdGhlCi0gKiBzcGlubmVyJ3MgbWluaW11bSBwcm9wZXJ0eTwvbGk+Ci0gKiA8bGk+b2JqZWN0IGluc3RhbmNlb2YgU3Bpbm5lciwgcHJvcGVydHkgSUQgaXMgU1dUX01BWElNVU0gLSBkZW5vdGluZyB0aGUKLSAqIHNwaW5uZXIncyBtYXhpbXVtIHByb3BlcnR5PC9saT4KLSAqIDwvdWw+Ci0gKiA8L2xpPgotICogPC91bD4KLSAqIFRPRE8gY29tcGxldGUgdGhlIGxpc3QKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBTV1RVcGRhdGFibGVGYWN0b3J5IGltcGxlbWVudHMgSVVwZGF0YWJsZUZhY3RvcnkgewotCi0JcHJpdmF0ZSBpbnQgdXBkYXRlVGltZSA9IElEYXRhQmluZGluZ0NvbnRleHQuVElNRV9MQVRFOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIGZhY3RvcnkgdGhhdCBjYW4gY3JlYXRlIHVwZGF0YWJsZXMgZm9yIFNXVCBjb250cm9scwotCSAqLwotCXB1YmxpYyBTV1RVcGRhdGFibGVGYWN0b3J5KCl7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB1cGRhdGVUaW1lCVRoZSB1cGRhdGUgcG9saWN5IG9mIElEYXRhQmluZWluZ0NvbnRleHQuVElNRV9MQVRFIG9yIElEYXRhQmluZGluZ0NvbnRleHQuVElNRV9FQVJMWSBpcyBhIGhpbnQKLQkgKiAJCQkJCQl0aGF0IHNvbWUgZWRpdGFibGUgY29udHJvbHMgbWF5IGltcGxlbWVudCAoc3VjaCBhcyBUZXh0KSB0byBkZXRlcm1pbmUgd2hlbiB0byBmaXJlIHVwZGF0ZXMKLQkgKi8KLQlwdWJsaWMgU1dUVXBkYXRhYmxlRmFjdG9yeShpbnQgdXBkYXRlVGltZSl7Ci0JCXRoaXMudXBkYXRlVGltZSA9IHVwZGF0ZVRpbWU7Ci0JfQotCQotCXB1YmxpYyBJVXBkYXRhYmxlIGNyZWF0ZVVwZGF0YWJsZShNYXAgcHJvcGVydGllcywKLQkJCU9iamVjdCBkZXNjcmlwdGlvbiwgSURhdGFCaW5kaW5nQ29udGV4dCBiaW5kaW5nQ29udGV4dCkgewotCQlpZiAoZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBQcm9wZXJ0eSkgewotCQkJT2JqZWN0IG9iamVjdCA9ICgoUHJvcGVydHkpIGRlc2NyaXB0aW9uKQotCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQlPYmplY3QgYXR0cmlidXRlID0gKChQcm9wZXJ0eSkgZGVzY3JpcHRpb24pCi0JCQkJCS5nZXRQcm9wZXJ0eUlEKCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29udHJvbAotCQkJCQkmJiBTV1RQcm9wZXJ0aWVzLkVOQUJMRUQuZXF1YWxzKGF0dHJpYnV0ZSkpIHsKLQkJCQlyZXR1cm4gbmV3IENvbnRyb2xVcGRhdGFibGVWYWx1ZSgoQ29udHJvbCkgb2JqZWN0LAotCQkJCQkJKFN0cmluZykgYXR0cmlidXRlKTsKLQkJCX0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb250cm9sCi0JCQkJCSYmIFNXVFByb3BlcnRpZXMuVklTSUJMRS5lcXVhbHMoYXR0cmlidXRlKSkgewotCQkJCXJldHVybiBuZXcgQ29udHJvbFVwZGF0YWJsZVZhbHVlKChDb250cm9sKSBvYmplY3QsCi0JCQkJCQkoU3RyaW5nKSBhdHRyaWJ1dGUpOwotCQkJfQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNwaW5uZXIKLQkJCQkJJiYgKFNXVFByb3BlcnRpZXMuU0VMRUNUSU9OLmVxdWFscyhhdHRyaWJ1dGUpCi0JCQkJCXx8IFNXVFByb3BlcnRpZXMuTUlOLmVxdWFscyhhdHRyaWJ1dGUpCi0JCQkJCXx8IFNXVFByb3BlcnRpZXMuTUFYLmVxdWFscyhhdHRyaWJ1dGUpKSkgewotCQkJCXJldHVybiBuZXcgU3Bpbm5lclVwZGF0YWJsZVZhbHVlKChTcGlubmVyKSBvYmplY3QsCi0JCQkJCQkoU3RyaW5nKSBhdHRyaWJ1dGUpOwotCQkJfQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRleHQKLQkJCQkJJiYgU1dUUHJvcGVydGllcy5URVhULmVxdWFscyhhdHRyaWJ1dGUpKSB7Ci0JCQkJcmV0dXJuIG5ldyBUZXh0VXBkYXRhYmxlVmFsdWUoKFRleHQpIG9iamVjdCxTV1QuTW9kaWZ5KTsKLQkJCX0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMYWJlbAotCQkJCQkmJiBTV1RQcm9wZXJ0aWVzLlRFWFQuZXF1YWxzKGF0dHJpYnV0ZSkpIHsKLQkJCQlyZXR1cm4gbmV3IExhYmVsVXBkYXRhYmxlVmFsdWUoKExhYmVsKSBvYmplY3QpOwotCQkJfQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJ1dHRvbgotCQkJCQkmJiBTV1RQcm9wZXJ0aWVzLlNFTEVDVElPTi5lcXVhbHMoYXR0cmlidXRlKSkgewotCQkJCXJldHVybiBuZXcgQnV0dG9uVXBkYXRhYmxlVmFsdWUoKEJ1dHRvbikgb2JqZWN0LAotCQkJCQkJU1dULlNlbGVjdGlvbik7Ci0JCQl9Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29tYm8KLQkJCQkJJiYgKFNXVFByb3BlcnRpZXMuVEVYVC5lcXVhbHMoYXR0cmlidXRlKSB8fCBTV1RQcm9wZXJ0aWVzLlNFTEVDVElPTgotCQkJCQkJCS5lcXVhbHMoYXR0cmlidXRlKSkpIHsKLQkJCQlyZXR1cm4gbmV3IENvbWJvVXBkYXRhYmxlVmFsdWUoKENvbWJvKSBvYmplY3QsCi0JCQkJCQkoU3RyaW5nKSBhdHRyaWJ1dGUpOwotCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDb21ibwotCQkJCQkmJiBTV1RQcm9wZXJ0aWVzLklURU1TLmVxdWFscyhhdHRyaWJ1dGUpKSB7Ci0JCQkJcmV0dXJuIG5ldyBDb21ib1VwZGF0YWJsZUNvbGxlY3Rpb24oKENvbWJvKSBvYmplY3QsCi0JCQkJCQkoU3RyaW5nKSBhdHRyaWJ1dGUpOwotCQkJfQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENDb21ibwotCQkJCQkmJiAoU1dUUHJvcGVydGllcy5URVhULmVxdWFscyhhdHRyaWJ1dGUpIHx8IFNXVFByb3BlcnRpZXMuU0VMRUNUSU9OCi0JCQkJCQkJLmVxdWFscyhhdHRyaWJ1dGUpKSkgewotCQkJCXJldHVybiBuZXcgQ0NvbWJvVXBkYXRhYmxlVmFsdWUoKENDb21ibykgb2JqZWN0LAotCQkJCQkJKFN0cmluZykgYXR0cmlidXRlKTsKLQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ0NvbWJvCi0JCQkJCSYmIFNXVFByb3BlcnRpZXMuSVRFTVMuZXF1YWxzKGF0dHJpYnV0ZSkpIHsKLQkJCQlyZXR1cm4gbmV3IENDb21ib1VwZGF0YWJsZUNvbGxlY3Rpb24oKENDb21ibykgb2JqZWN0LAotCQkJCQkJKFN0cmluZykgYXR0cmlidXRlKTsKLQkJCX0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0Ci0JCQkJCSYmIFNXVFByb3BlcnRpZXMuU0VMRUNUSU9OLmVxdWFscyhhdHRyaWJ1dGUpKSB7Ci0JCQkJLy8gU1dULlNJTkdMRSBzZWxlY3Rpb24gb25seQotCQkJCXJldHVybiBuZXcgTGlzdFVwZGF0YWJsZVZhbHVlKChMaXN0KSBvYmplY3QsCi0JCQkJCQkoU3RyaW5nKSBhdHRyaWJ1dGUpOwotCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0Ci0JCQkJCSYmIFNXVFByb3BlcnRpZXMuSVRFTVMuZXF1YWxzKGF0dHJpYnV0ZSkpIHsKLQkJCQlyZXR1cm4gbmV3IExpc3RVcGRhdGFibGVDb2xsZWN0aW9uKChMaXN0KSBvYmplY3QsCi0JCQkJCQkoU3RyaW5nKSBhdHRyaWJ1dGUpOwotCQkJfQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIKLQkJCQkJJiYgU1dUUHJvcGVydGllcy5TRUxFQ1RJT04uZXF1YWxzKGF0dHJpYnV0ZSkpIHsKLQkJCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRWaWV3ZXJVcGRhdGFibGVWYWx1ZSgKLQkJCQkJCShTdHJ1Y3R1cmVkVmlld2VyKSBvYmplY3QsIChTdHJpbmcpIGF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWJzdHJhY3RMaXN0Vmlld2VyCi0JCQkJCSYmIFNXVFByb3BlcnRpZXMuU0VMRUNUSU9OLmVxdWFscyhhdHRyaWJ1dGUpKQotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZFZpZXdlclVwZGF0YWJsZVZhbHVlKAotCQkJCQkJKEFic3RyYWN0TGlzdFZpZXdlcikgb2JqZWN0LCAoU3RyaW5nKSBhdHRyaWJ1dGUpOwotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWJzdHJhY3RMaXN0Vmlld2VyCi0JCQkJCSYmIFZpZXdlcnNQcm9wZXJ0aWVzLkNPTlRFTlQuZXF1YWxzKGF0dHJpYnV0ZSkpCi0JCQkJcmV0dXJuIG5ldyBVcGRhdGFibGVDb2xsZWN0aW9uVmlld2VyKAotCQkJCQkJKEFic3RyYWN0TGlzdFZpZXdlcikgb2JqZWN0KTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcgotCQkJCQkmJiBWaWV3ZXJzUHJvcGVydGllcy5DT05URU5ULmVxdWFscyhhdHRyaWJ1dGUpKSB7Ci0JCQkJcmV0dXJuIG5ldyBUYWJsZVZpZXdlclVwZGF0YWJsZUNvbGxlY3Rpb24oCi0JCQkJCQkoVGFibGVWaWV3ZXIpIG9iamVjdCk7Ci0JCQl9Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFibGUpIHsKLQkJCQlyZXR1cm4gbmV3IFRhYmxlVXBkYXRhYmxlVmFsdWUoKFRhYmxlKSBvYmplY3QsCi0JCQkJCQkoU3RyaW5nKSBhdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JCWlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEFic3RyYWN0TGlzdFZpZXdlcikgewotCQkJLy8gYmluZGluZyB0byBhIFZpZXdlciBkaXJlY3RseSBpbXBsaWVzIGJpbmRpbmcgdG8gaXRzCi0JCQkvLyBjb250ZW50Ci0JCQlyZXR1cm4gbmV3IFVwZGF0YWJsZUNvbGxlY3Rpb25WaWV3ZXIoCi0JCQkJCShBYnN0cmFjdExpc3RWaWV3ZXIpIGRlc2NyaXB0aW9uKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCWludCB1cGRhdGVQb2xpY3kgPSBuZXcgaW50W117U1dULk1vZGlmeSxTV1QuRm9jdXNPdXQsU1dULk5vbmV9W3VwZGF0ZVRpbWVdOwotCQkJcmV0dXJuIG5ldyBUZXh0VXBkYXRhYmxlVmFsdWUoKFRleHQpIGRlc2NyaXB0aW9uLHVwZGF0ZVBvbGljeSk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCWludCB1cGRhdGVQb2xpY3kgPSBuZXcgaW50W117U1dULk1vZGlmeSxTV1QuRm9jdXNPdXQsU1dULk5vbmV9W3VwZGF0ZVRpbWVdOwotCQkJcmV0dXJuIG5ldyBCdXR0b25VcGRhdGFibGVWYWx1ZSgoQnV0dG9uKSBkZXNjcmlwdGlvbiwKLQkJCQkJdXBkYXRlUG9saWN5KTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlyZXR1cm4gbmV3IExhYmVsVXBkYXRhYmxlVmFsdWUoKExhYmVsKSBkZXNjcmlwdGlvbik7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBDb21ibykgewotCQkJcmV0dXJuIG5ldyBDb21ib1VwZGF0YWJsZUNvbGxlY3Rpb24oKENvbWJvKSBkZXNjcmlwdGlvbiwKLQkJCQkJVmlld2Vyc1Byb3BlcnRpZXMuQ09OVEVOVCk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBTcGlubmVyKSB7Ci0JCQlyZXR1cm4gbmV3IFNwaW5uZXJVcGRhdGFibGVWYWx1ZSgoU3Bpbm5lcikgZGVzY3JpcHRpb24sCi0JCQkJCVNXVFByb3BlcnRpZXMuU0VMRUNUSU9OKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIENDb21ibykgewotCQkJcmV0dXJuIG5ldyBDQ29tYm9VcGRhdGFibGVDb2xsZWN0aW9uKChDQ29tYm8pIGRlc2NyaXB0aW9uLAotCQkJCQlWaWV3ZXJzUHJvcGVydGllcy5DT05URU5UKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCXJldHVybiBuZXcgTGlzdFVwZGF0YWJsZUNvbGxlY3Rpb24oKExpc3QpIGRlc2NyaXB0aW9uLAotCQkJCQlWaWV3ZXJzUHJvcGVydGllcy5DT05URU5UKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGltZS4gIFZhbHVlcyBhcmUgVElNRV9FQVJMWSBvciBUSU1FX0xBVEUgYW5kIHNwZWNpZnkgd2hlbiB1cGRhdGUgb2NjdXJzCi0JICogCQkJCSBGb3IgZXhhbXBsZSBUSU1FX0VBUkxZIG9uIFRleHQgY29udHJvbCBhbmQgdXBkYXRlIG9jY3VycyBwZXIga2V5c3Ryb2tlLAotCSAqIAkJCQkgVElNRV9MQVRFIGFuZCB2YWxpZGF0aW9uIG9jY3VycyB3aGVuIHRoZSBmaWVsZCBsb3NlcyBmb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZVRpbWUoaW50IHRpbWUpIHsKLQkJdXBkYXRlVGltZSA9IHRpbWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3N3dC9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy9zd3QvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjdhODViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3N3dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+UHJvdmlkZXMgc3VwcG9ydCBmb3IgZGF0YSBiaW5kaW5nLCBmb3IgZXhhbXBsZSBiaW5kaW5nIGFuIGF0dHJpYnV0ZSB2YWx1ZSBvZiBhIG1vZGVsCi1vYmplY3QgdG8gYSBVSSB3aWRnZXQncyBzdGF0ZS48L3A+Ci0KLTxwPlRoaXMgcGFja2FnZSBpbmNsdWRlcyBoZWxwZXIgY2xhc3NlcyBmb3IgaW1wbGVtZW50aW5nIFNXVCBzdXBwb3J0LjwvcD4KLTxoMj5QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotPHA+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdXBkYXRhYmxlcy9Db25kaXRpb25hbFVwZGF0YWJsZVZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy91cGRhdGFibGVzL0NvbmRpdGlvbmFsVXBkYXRhYmxlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhN2Q2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy91cGRhdGFibGVzL0NvbmRpdGlvbmFsVXBkYXRhYmxlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudXBkYXRhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuVXBkYXRhYmxlVmFsdWU7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgY2xhc3MgZm9yIGltcGxlbWVudGluZyB1cGRhdGFibGUgdmFsdWVzIG9mIHR5cGUgYm9vbGVhbiB0aGF0Ci0gKiB0cmFjayBjaGFuZ2VzIG9mIGFub3RoZXIgdXBkYXRhYmxlIHZhbHVlLgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHJlbWFpbgotICogdW5jaGFuZ2VkIGR1cmluZyB0aGUgMy4yIHJlbGVhc2UgY3ljbGUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25kaXRpb25hbFVwZGF0YWJsZVZhbHVlIGV4dGVuZHMgVXBkYXRhYmxlVmFsdWUgewotCi0JcHJpdmF0ZSBmaW5hbCBJVXBkYXRhYmxlVmFsdWVbXSBpbm5lclVwZGF0YWJsZVZhbHVlczsKLQotCUlDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA9IG5ldyBJQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUNoYW5nZShDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudCkgewotCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5uZXJVcGRhdGFibGVWYWx1ZQotCSAqLwotCXB1YmxpYyBDb25kaXRpb25hbFVwZGF0YWJsZVZhbHVlKElVcGRhdGFibGVWYWx1ZSBpbm5lclVwZGF0YWJsZVZhbHVlKSB7Ci0JCXRoaXMobmV3IElVcGRhdGFibGVWYWx1ZVtde2lubmVyVXBkYXRhYmxlVmFsdWV9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBpbm5lclVwZGF0YWJsZVZhbHVlcwotCSAqLwotCXB1YmxpYyBDb25kaXRpb25hbFVwZGF0YWJsZVZhbHVlKElVcGRhdGFibGVWYWx1ZVtdIGlubmVyVXBkYXRhYmxlVmFsdWVzKSB7Ci0JCXRoaXMuaW5uZXJVcGRhdGFibGVWYWx1ZXMgPSBpbm5lclVwZGF0YWJsZVZhbHVlczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbm5lclVwZGF0YWJsZVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJaW5uZXJVcGRhdGFibGVWYWx1ZXNbaV0uYWRkQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlPYmplY3RbXSBjdXJyZW50VmFsdWVzID0gbmV3IE9iamVjdFtpbm5lclVwZGF0YWJsZVZhbHVlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWN1cnJlbnRWYWx1ZXNbaV0gPSBpbm5lclVwZGF0YWJsZVZhbHVlc1tpXS5nZXRWYWx1ZSgpOwotCQl9CQkKLQkJcmV0dXJuIG5ldyBCb29sZWFuKGNvbXB1dGUoY3VycmVudFZhbHVlcy5sZW5ndGg9PTE/Y3VycmVudFZhbHVlc1swXTpjdXJyZW50VmFsdWVzKSk7Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gY3VycmVudFZhbHVlCi0JICogICAgICAgICAgICB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdHJhY2tlZCB1cGRhdGFibGUgdmFsdWUsIG9yCi0JICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSB0cmFja2VkIHVwZGF0YWJsZSB2YWx1ZXMuCi0JICogQHJldHVybiBhIGJvb2xlYW4gcmVzdWx0Ci0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gY29tcHV0ZShPYmplY3QgY3VycmVudFZhbHVlKTsKLQotCXB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKSB7Ci0JCXJldHVybiBCb29sZWFuLmNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbm5lclVwZGF0YWJsZVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJaW5uZXJVcGRhdGFibGVWYWx1ZXNbaV0ucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpOwotCQl9CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3VwZGF0YWJsZXMvU2V0dGFibGVWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdXBkYXRhYmxlcy9TZXR0YWJsZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OWNiMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdXBkYXRhYmxlcy9TZXR0YWJsZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudXBkYXRhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlVwZGF0YWJsZVZhbHVlOwotCi0vKioKLSAqIEFuIHVwZGF0YWJsZSB2YWx1ZSB0aGF0IGNhbiBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuIAotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgcmVtYWluCi0gKiB1bmNoYW5nZWQgZHVyaW5nIHRoZSAzLjIgcmVsZWFzZSBjeWNsZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2V0dGFibGVWYWx1ZSBleHRlbmRzIFVwZGF0YWJsZVZhbHVlIHsKLQotCXByaXZhdGUgZmluYWwgQ2xhc3MgdHlwZTsKLQotCXByaXZhdGUgT2JqZWN0IHZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzZXR0YWJsZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gdmFsdWUgdHlwZSwgYW5kIHdpdGggdGhlIGdpdmVuCi0JICogaW5pdGlhbCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBpbml0aWFsVmFsdWUKLQkgKi8KLQlwdWJsaWMgU2V0dGFibGVWYWx1ZShDbGFzcyB0eXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXZhbHVlID0gaW5pdGlhbFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2V0dGFibGUgdmFsdWUgb2YgdGhlIGdpdmVuIHZhbHVlIHR5cGUsIGFuZCB3aXRoIGFuCi0JICogaW5pdGlhbCB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqLwotCXB1YmxpYyBTZXR0YWJsZVZhbHVlKENsYXNzIHR5cGUpIHsKLQkJdGhpcyh0eXBlLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgb2xkVmFsdWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldFZhbHVlVHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy91cGRhdGFibGVzL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3VwZGF0YWJsZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDI1YjMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3VwZGF0YWJsZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlByb3ZpZGVzIHN1cHBvcnQgZm9yIGRhdGEgYmluZGluZywgZm9yIGV4YW1wbGUgYmluZGluZyBhbiBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBtb2RlbAotb2JqZWN0IHRvIGEgVUkgd2lkZ2V0J3Mgc3RhdGUuPC9wPgotCi08cD5UaGlzIHBhY2thZ2UgcHJvdmlkZXMgY2xhc3NlcyB0aGF0IGVpdGhlciBpbXBsZW1lbnQgSVVwZGF0YWJsZSBvciBtYWtlIGl0IGVhc2llciAKLXRvIGltcGxlbWVudCBJVXBkYXRhYmxlIGZvciBjZXJ0YWluIHR5cGVzIG9mIHRoaW5ncy48L3A+Ci08aDI+UGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLTxwPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZhbGlkYXRvci9JVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3IvSVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWY4NmMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZhbGlkYXRvci9JVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yOwotCi0vKioKLSAqIEEgdmFsaWRhdG9yLgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHJlbWFpbgotICogdW5jaGFuZ2VkIGR1cmluZyB0aGUgMy4yIHJlbGVhc2UgY3ljbGUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIHBhcnRpYWxseSB2YWxpZC4gVGhpcyBtZXRob2QgaXMgdXNlZCB0bwotCSAqIGRldGVybWluZSwgZm9yIGV4YW1wbGUsIGlmIGtleXN0cm9rZXMgY2FuIHN0aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHZhbGlkYXRlCi0JICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSwgb3IgPC9jb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2YWx1ZSBpcwotCSAqICAgICAgICAgcGFydGlhbGx5IHZhbGlkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNQYXJ0aWFsbHlWYWxpZChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgdmFsaWQuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdmFsaWRhdGUKLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlLCBvciA8L2NvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZhbHVlIGlzIHZhbGlkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3IvUmVhZE9ubHlWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZhbGlkYXRvci9SZWFkT25seVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTA2ZmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZhbGlkYXRvci9SZWFkT25seVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBkYjRvYmplY3RzIEluYy4gIGh0dHA6Ly93d3cuZGI0by5jb20KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgZGI0b2JqZWN0cyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLkJpbmRpbmdNZXNzYWdlczsKLQotCi0vKioKLSAqIFJlYWRPbmx5VmFsaWRhdG9yLiAgVGhlIHZhbGlkYXRvciB0aGF0IGNhbiBiZSB1c2VkIGZvciByZWFkLW9ubHkgZmllbGRzLgotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBSZWFkT25seVZhbGlkYXRvciBzaW5nbGV0b24gPSBudWxsOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFJlYWRPbmx5VmFsaWRhdG9yCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgUmVhZE9ubHlWYWxpZGF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlYWRPbmx5VmFsaWRhdG9yIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIGlmIChzaW5nbGV0b24gPT0gbnVsbCkgewotICAgICAgICAgICAgc2luZ2xldG9uID0gbmV3IFJlYWRPbmx5VmFsaWRhdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjsKLSAgICB9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvciNpc1BhcnRpYWxseVZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1BhcnRpYWxseVZhbGlkKE9iamVjdCBmcmFnbWVudCkgewotCQkvLyBObyBjaGFuZ2VzIGFyZSBhbGxvd2VkCi0JCXJldHVybiBCaW5kaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJWYWxpZGF0ZV9Ob0NoYW5nZUFsbG93ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgdmFsdWUgaXMgYWx3YXlzIHZhbGlkCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9yL1JlZ2V4U3RyaW5nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3IvUmVnZXhTdHJpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwNmIwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3IvUmVnZXhTdHJpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgZGI0b2JqZWN0cyBJbmMuICBodHRwOi8vd3d3LmRiNG8uY29tCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIGRiNG9iamVjdHMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotCi0vKioKLSAqIFJlZ3VsYXJFeHByZXNzaW9uVmVyaWZpZXIuICBBIGdlbmVyaWMgU3RyaW5nIHZhbGlkYXRvciB0aGF0IHVzZXMgcmVndWxhciBleHByZXNzaW9ucyB0bwotICogc3BlY2lmeSB2YWxpZGF0aW9uIHJ1bGVzLgotICovCi1wdWJsaWMgY2xhc3MgUmVnZXhTdHJpbmdWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLSAgICAKLSAgICBwcml2YXRlIFBhdHRlcm4gZnJhZ21lbnRSZWdleDsKLSAgICBwcml2YXRlIFBhdHRlcm4gZnVsbFZhbHVlUmVnZXg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaGludDsKLSAgICAKLQkvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBSZWd1bGFyRXhwcmVzc2lvblZhbGlkYXRvci4gIENvbnN0cnVjdCBhIHN0cmluZyB2YWxpZGF0b3IgYmFzZWQgb24gcmVndWxhcgotICAgICAqIGV4cHJlc3Npb25zLgotICAgICAqIAotICAgICAqIFZlcmlmeSBpbnB1dCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zLgotICAgICAqIAotCSAqIEBwYXJhbSBwYXJ0aWFsbHlWYWxpZFJlZ2V4IEEgcmVnZXggdGhhdCBtYXRjaGVzIGlmZiB0aGUgdmFsdWUgaXMgcGFydGlhbGx5IHZhbGlkCi0JICogQHBhcmFtIGZ1bGx5VmFsaWRSZWdleCBBIHJlZ2V4IHRoYXQgbWF0Y2hlcyBpZmYgdGhlIHZhbHVlIGlzIGZ1bGx5IHZhbGlkCi0JICogQHBhcmFtIGhpbnQgVGhlIGhpbnQgdG8gZGlzcGxheSBpZiB0aGUgdmFsdWUgaXMgaW52YWxpZAotCSAqLwotCXB1YmxpYyBSZWdleFN0cmluZ1ZhbGlkYXRvcihTdHJpbmcgcGFydGlhbGx5VmFsaWRSZWdleCwKLQkJCVN0cmluZyBmdWxseVZhbGlkUmVnZXgsIFN0cmluZyBoaW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZnJhZ21lbnRSZWdleCA9IFBhdHRlcm4uY29tcGlsZShwYXJ0aWFsbHlWYWxpZFJlZ2V4KTsKLQkJdGhpcy5mdWxsVmFsdWVSZWdleCA9IFBhdHRlcm4uY29tcGlsZShmdWxseVZhbGlkUmVnZXgpOwotCQl0aGlzLmhpbnQgPSBoaW50OwotCX0KLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvciNpc1BhcnRpYWxseVZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1BhcnRpYWxseVZhbGlkKE9iamVjdCBmcmFnbWVudCkgewotICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBmcmFnbWVudFJlZ2V4Lm1hdGNoZXIoKFN0cmluZylmcmFnbWVudCk7Ci0JCWlmIChtYXRjaGVyLmZpbmQoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBoaW50OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IGZ1bGxWYWx1ZVJlZ2V4Lm1hdGNoZXIoc3RyaW5nVmFsdWUpOwotICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gaGludDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZhbGlkYXRvci9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9yL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5N2IyNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9yL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBkYjRvYmplY3RzIEluYy4gIGh0dHA6Ly93d3cuZGI0by5jb20KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgZGI0b2JqZWN0cyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9ycy5TdHJpbmcyQmlnRGVjaW1hbFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3JzLlN0cmluZzJCeXRlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvcnMuU3RyaW5nMkRhdGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9ycy5TdHJpbmcyRG91YmxlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvcnMuU3RyaW5nMkZsb2F0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvcnMuU3RyaW5nMkludFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3JzLlN0cmluZzJMb25nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvcnMuU3RyaW5nMlNob3J0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLkJpbmRpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5QYWlyOwotCi0KLS8qKgotICogVmFsaWRhdG9yUmVnaXN0cnkuICBBIHJlZ2lzdHJ5IGZvciB2YWxpZGF0b3JzLiAgQSBzaW5nbGV0b24gaXMgcHJvdmlkZWQgdGhhdCBpbmNsdWRlcyBhbGwKLSAqIG9mIHRoZSBzeXN0ZW0tcHJvdmlkZWQgdmFsaWRhdG9ycyBieSBkZWZhdWx0LCBidXQgY2xpZW50cyBhcmUgZnJlZSB0byB1c2UgYXMgbWFueSBpbnN0YW5jZXMKLSAqIG9mIHRoaXMgY2xhc3MgYXMgdGhleSBsaWtlLiAgQ2xpZW50LWNyZWF0ZWQgaW5zdGFuY2VzIGRvIG5vdCBjb250YWluIHRoZSBzeXN0ZW0tcHJvdmlkZWQKLSAqIHZhbGlkYXRvcnMgYnkgZGVmYXVsdCwgYnV0IHRoZXNlIGNhbiBiZSBhZGRlZCBieSBjYWxsaW5nIGFkZFN5c3RlbVZhbGlkYXRvcnMoKS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IHsKLQkKLQlwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3JSZWdpc3RyeSByZWdpc3RyeSA9IG51bGw7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHZhbGlkYXRvciByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbGlkYXRvciByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvclJlZ2lzdHJ5IGdldERlZmF1bHQoKSB7Ci0JCWlmIChyZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlyZWdpc3RyeSA9IG5ldyBWYWxpZGF0b3JSZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkuYWRkU3lzdGVtVmFsaWRhdG9ycygpOwotCQl9Ci0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIHZhbGlkYXRvcnMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIC8qKgotICAgICAqIEFzc29jaWF0ZSBhIHBhcnRpY3VsYXIgdmFsaWRhdG9yIHRoYXQgY2FuIHZhbGlkYXRlIHRoZSBjb252ZXJzaW9uIChmcm9tQ2xhc3MsIHRvQ2xhc3MpCi0gICAgICogCi0gICAgICogQHBhcmFtIGZyb21DbGFzcyBUaGUgQ2xhc3MgdG8gY29udmVydCBmcm9tCi0gICAgICogQHBhcmFtIHRvQ2xhc3MgVGhlIENsYXNzIHRvIGNvbnZlcnQgdG8KLSAgICAgKiBAcGFyYW0gdmFsaWRhdG9yIFRoZSBJVmFsaWRhdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXNzb2NpYXRlKENsYXNzIGZyb21DbGFzcywgQ2xhc3MgdG9DbGFzcywgSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLSAgICAgICAgdmFsaWRhdG9ycy5wdXQobmV3IFBhaXIoZnJvbUNsYXNzLCB0b0NsYXNzKSwgdmFsaWRhdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFuIElWZXJpZmllciBmb3IgYSBzcGVjaWZpYyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJvbUNsYXNzIFRoZSBDbGFzcyB0byBjb252ZXJ0IGZyb20KLSAgICAgKiBAcGFyYW0gdG9DbGFzcyBUaGUgQ2xhc3MgdG8gY29udmVydCB0bwotICAgICAqIEByZXR1cm4gQW4gYXBwcm9wcmlhdGUgSVZhbGlkYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBJVmFsaWRhdG9yIGdldChDbGFzcyBmcm9tQ2xhc3MsIENsYXNzIHRvQ2xhc3MpIHsKLSAgICAgICAgSVZhbGlkYXRvciByZXN1bHQgPSAoSVZhbGlkYXRvcikgdmFsaWRhdG9ycy5nZXQobmV3IFBhaXIoZnJvbUNsYXNzLCB0b0NsYXNzKSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIFJlYWRPbmx5VmFsaWRhdG9yLmdldERlZmF1bHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBzeXN0ZW0tcHJvdmlkZWQgdmFsaWRhdG9ycyB0byB0aGUgY3VycmVudCB2YWxpZGF0b3IgcmVnaXN0cnkuICBUaGlzIGlzIGRvbmUKLSAgICAgKiBhdXRvbWF0aWNhbGx5IGZvciB0aGUgdmFsaWRhdG9yIHJlZ2lzdHJ5IHNpbmdsZXRvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTeXN0ZW1WYWxpZGF0b3JzKCkgewotICAgICAgICAvLyBTdGFuZGFsb25lIHZhbGlkYXRvcnMgaGVyZS4uLgotICAgICAgICBhc3NvY2lhdGUoU3RyaW5nLmNsYXNzLCBJbnRlZ2VyLlRZUEUsIG5ldyBTdHJpbmcySW50VmFsaWRhdG9yKCkpOwotICAgICAgICBhc3NvY2lhdGUoU3RyaW5nLmNsYXNzLCBCeXRlLlRZUEUsIG5ldyBTdHJpbmcyQnl0ZVZhbGlkYXRvcigpKTsKLSAgICAgICAgYXNzb2NpYXRlKFN0cmluZy5jbGFzcywgU2hvcnQuVFlQRSwgbmV3IFN0cmluZzJTaG9ydFZhbGlkYXRvcigpKTsKLSAgICAgICAgYXNzb2NpYXRlKFN0cmluZy5jbGFzcywgTG9uZy5UWVBFLCBuZXcgU3RyaW5nMkxvbmdWYWxpZGF0b3IoKSk7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIEZsb2F0LlRZUEUsIG5ldyBTdHJpbmcyRmxvYXRWYWxpZGF0b3IoKSk7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIERvdWJsZS5UWVBFLCBuZXcgU3RyaW5nMkRvdWJsZVZhbGlkYXRvcigpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIEludGVnZXIuY2xhc3MsIG5ldyBTdHJpbmcySW50VmFsaWRhdG9yKCkpOwotICAgICAgICBhc3NvY2lhdGUoU3RyaW5nLmNsYXNzLCBCeXRlLmNsYXNzLCBuZXcgU3RyaW5nMkJ5dGVWYWxpZGF0b3IoKSk7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIFNob3J0LmNsYXNzLCBuZXcgU3RyaW5nMlNob3J0VmFsaWRhdG9yKCkpOwotICAgICAgICBhc3NvY2lhdGUoU3RyaW5nLmNsYXNzLCBMb25nLmNsYXNzLCBuZXcgU3RyaW5nMkxvbmdWYWxpZGF0b3IoKSk7Ci0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIEZsb2F0LmNsYXNzLCBuZXcgU3RyaW5nMkZsb2F0VmFsaWRhdG9yKCkpOwotICAgICAgICBhc3NvY2lhdGUoU3RyaW5nLmNsYXNzLCBEb3VibGUuY2xhc3MsIG5ldyBTdHJpbmcyRG91YmxlVmFsaWRhdG9yKCkpOwotICAgICAgICBhc3NvY2lhdGUoU3RyaW5nLmNsYXNzLCBEYXRlLmNsYXNzLCBuZXcgU3RyaW5nMkRhdGVWYWxpZGF0b3IoKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NvY2lhdGUoU3RyaW5nLmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzLCBuZXcgU3RyaW5nMkJpZ0RlY2ltYWxWYWxpZGF0b3IoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBSZWdleC1pbXBsZW1lbnRlZCB2YWxpZGF0b3JzIGhlcmUuLi4KLSAgICAgICAgYXNzb2NpYXRlKFN0cmluZy5jbGFzcywgQ2hhcmFjdGVyLlRZUEUsIG5ldyBSZWdleFN0cmluZ1ZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAiXi4kfF4kIiwgIi4iLCBCaW5kaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJWYWxpZGF0ZV9DaGFyYWN0ZXJIZWxwIikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgYXNzb2NpYXRlKFN0cmluZy5jbGFzcywgQ2hhcmFjdGVyLmNsYXNzLCBuZXcgUmVnZXhTdHJpbmdWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgIl4uJHxeJCIsICIuIiwgQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygiVmFsaWRhdGVfQ2hhcmFjdGVySGVscCIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIEJvb2xlYW4uVFlQRSwgbmV3IFJlZ2V4U3RyaW5nVmFsaWRhdG9yKAotICAgICAgICAJCUJpbmRpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlZhbGlkYXRlX0Jvb2xlYW5QYXJ0aWFsVmFsaWRSZWdleCIpLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAJCUJpbmRpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlZhbGlkYXRlX0Jvb2xlYW5WYWxpZFJlZ2V4IiksICAvLyROT04tTkxTLTEkCi0gICAgICAgIAkJQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygiVmFsaWRhdGVfQm9vbGVhbkhlbHAiKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc29jaWF0ZShTdHJpbmcuY2xhc3MsIEJvb2xlYW4uY2xhc3MsIG5ldyBSZWdleFN0cmluZ1ZhbGlkYXRvcigKLSAgICAgICAgCQlCaW5kaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJWYWxpZGF0ZV9Cb29sZWFuUGFydGlhbFZhbGlkUmVnZXgiKSwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCQlCaW5kaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJWYWxpZGF0ZV9Cb29sZWFuVmFsaWRSZWdleCIpLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAJCUJpbmRpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlZhbGlkYXRlX0Jvb2xlYW5IZWxwIikpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NvY2lhdGUoU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIG5ldyBSZWdleFN0cmluZ1ZhbGlkYXRvcigiXi4qJCIsICJeLiokIiwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3IvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9yL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzZjg1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3IvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlByb3ZpZGVzIHN1cHBvcnQgZm9yIGRhdGEgYmluZGluZywgZm9yIGV4YW1wbGUgYmluZGluZyBhbiBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBtb2RlbAotb2JqZWN0IHRvIGEgVUkgd2lkZ2V0J3Mgc3RhdGUuPC9wPgotCi08cD5UaGlzIHBhY2thZ2UgaW5jbHVkZXMgaW50ZXJmYWNlcyBhbmQgY2xhc3NlcyB0aGF0IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBBUEk8L3A+Ci08aDI+UGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLTxwPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZhbGlkYXRvcnMvU3RyaW5nMkJpZ0RlY2ltYWxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZhbGlkYXRvcnMvU3RyaW5nMkJpZ0RlY2ltYWxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyOTUxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3JzL1N0cmluZzJCaWdEZWNpbWFsVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuQmluZGluZ01lc3NhZ2VzOwotCi0KLS8qKgotICogRG91YmxlVmFsaWRhdG9yLiAgVmVyaWZ5IGRhdGEgaW5wdXQgZm9yIERvdWJsZXMKLSAqCi0gKiBAYXV0aG9yIGRqbwotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nMkJpZ0RlY2ltYWxWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvciNpc1BhcnRpYWxseVZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1BhcnRpYWxseVZhbGlkKE9iamVjdCBmcmFnbWVudCkgewotCQlpZiAoKChTdHJpbmcpZnJhZ21lbnQpLm1hdGNoZXMoIlxcLT9bMC05XSpcXC4/WzAtOV0qKFswLTldK1tlfEVdXFwtPyhbMC05XStcXC4pP1swLTldKik/IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBnZXRIaW50KCk7Ci0JfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCW5ldyBCaWdEZWNpbWFsKChTdHJpbmcpdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0SGludCgpOwotICAgICAgICB9Ci0gICAgfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SGludCgpIHsKLQkJcmV0dXJuIEJpbmRpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlZhbGlkYXRlX0xpa2UiKSArICAvLyROT04tTkxTLTEkCi0JCQlCaW5kaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJWYWxpZGF0ZV9OdW1iZXJfRXhhbXBsZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9ycy9TdHJpbmcyQnl0ZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9ycy9TdHJpbmcyQnl0ZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzNlOWUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZhbGlkYXRvcnMvU3RyaW5nMkJ5dGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgZGI0b2JqZWN0cyBJbmMuICBodHRwOi8vd3d3LmRiNG8uY29tCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIGRiNG9iamVjdHMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuQmluZGluZ01lc3NhZ2VzOwotCi0KLS8qKgotICogQnl0ZVZhbGlkYXRvci4gIFZhbGlkYXRlIFN0cmluZyBpbnB1dCBmb3IgQnl0ZXMKLSAqLwotcHVibGljIGNsYXNzIFN0cmluZzJCeXRlVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0gICAgCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3IjaXNQYXJ0aWFsbHlWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNQYXJ0aWFsbHlWYWxpZChPYmplY3QgZnJhZ21lbnQpIHsKLQkJaWYgKCgoU3RyaW5nKWZyYWdtZW50KS5tYXRjaGVzKCJcXC0/WzAtOV0qIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBnZXRIaW50KCk7Ci0JfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvci5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCeXRlLnBhcnNlQnl0ZSgoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgcmV0dXJuIGdldEhpbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotCXByaXZhdGUgU3RyaW5nIGdldEhpbnQoKSB7Ci0JCXJldHVybiBCaW5kaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJWYWxpZGF0ZV9SYW5nZVN0YXJ0IikgKyBCeXRlLk1JTl9WQUxVRSArICAvLyROT04tTkxTLTEkCi0JCQlCaW5kaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJhbmQiKSArIEJ5dGUuTUFYX1ZBTFVFICsgIi4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZhbGlkYXRvcnMvU3RyaW5nMkRhdGVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZhbGlkYXRvcnMvU3RyaW5nMkRhdGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlYzI1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3JzL1N0cmluZzJEYXRlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyZnVuY3Rpb25zLkRhdGVDb252ZXJzaW9uU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5CaW5kaW5nTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBEYXRlVmFsaWRhdG9yLiAgQW4gSVZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiBmb3IgZGF0ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmcyRGF0ZVZhbGlkYXRvciBleHRlbmRzIERhdGVDb252ZXJzaW9uU3VwcG9ydCBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvci5JVmFsaWRhdG9yI2lzUGFydGlhbGx5VmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGlzUGFydGlhbGx5VmFsaWQoT2JqZWN0IGZyYWdtZW50KSB7Ci0JCS8vIFRPRE86IENhbiB3ZSBkbyBhbnkgc2Vuc2libGUgKGxvY2FsZS1pbmRlcGVuZGVudCkgY2hlY2tpbmcgaGVyZT8KLQkJcmV0dXJuIG51bGw7Ci0JfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvci5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBwYXJzZSgoU3RyaW5nKXZhbHVlKSE9bnVsbCA/IG51bGwgOiBnZXRIaW50KCk7Ci0gICAgfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SGludCgpIHsKLQkJRGF0ZSBzYW1wbGVEYXRlPW5ldyBEYXRlKCk7Ci0JCVN0cmluZ0J1ZmZlciBzYW1wbGVzPW5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yKGludCBmb3JtYXR0ZXJJZHg9MTtmb3JtYXR0ZXJJZHg8bnVtRm9ybWF0dGVycygpLTI7Zm9ybWF0dGVySWR4KyspIHsKLQkJCXNhbXBsZXMuYXBwZW5kKCdcJycpOwotCQkJc2FtcGxlcy5hcHBlbmQoZm9ybWF0KHNhbXBsZURhdGUsZm9ybWF0dGVySWR4KSk7Ci0JCQlzYW1wbGVzLmFwcGVuZCgiJywgIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotICAgICAgICBzYW1wbGVzLmFwcGVuZCgnXCcnKTsKLSAgICAgICAgc2FtcGxlcy5hcHBlbmQoZm9ybWF0KHNhbXBsZURhdGUsMCkpOwotICAgICAgICBzYW1wbGVzLmFwcGVuZCgnXCcnKTsKLQkJcmV0dXJuIEJpbmRpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIkV4YW1wbGVzIikgKyAiOiAiK3NhbXBsZXMrIiwuLi4iOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZhbGlkYXRvcnMvU3RyaW5nMkRvdWJsZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9ycy9TdHJpbmcyRG91YmxlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNDQ4NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9ycy9TdHJpbmcyRG91YmxlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvci5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLkJpbmRpbmdNZXNzYWdlczsKLQotCi0vKioKLSAqIERvdWJsZVZhbGlkYXRvci4gIFZlcmlmeSBkYXRhIGlucHV0IGZvciBEb3VibGVzCi0gKgotICogQGF1dGhvciBkam8KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZzJEb3VibGVWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvciNpc1BhcnRpYWxseVZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1BhcnRpYWxseVZhbGlkKE9iamVjdCBmcmFnbWVudCkgewotCQlpZiAoKChTdHJpbmcpZnJhZ21lbnQpLm1hdGNoZXMoIlxcLT9bMC05XSpcXC4/WzAtOV0qKFswLTldK1tlfEVdXFwtPyhbMC05XStcXC4pP1swLTldKik/IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBnZXRIaW50KCk7Ci0JfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvdWJsZS5wYXJzZURvdWJsZSgoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgcmV0dXJuIGdldEhpbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotCXByaXZhdGUgU3RyaW5nIGdldEhpbnQoKSB7Ci0JCXJldHVybiBCaW5kaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJWYWxpZGF0ZV9MaWtlIikgKyAgLy8kTk9OLU5MUy0xJAotCQkJQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygiVmFsaWRhdGVfTnVtYmVyX0V4YW1wbGVzIikgLy8kTk9OLU5MUy0xJAotCQkJKyBEb3VibGUuTUlOX1ZBTFVFICsgCi0JCQkiLCAiICsgRG91YmxlLk1BWF9WQUxVRSArICIuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3JzL1N0cmluZzJGbG9hdFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9ycy9TdHJpbmcyRmxvYXRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4YWIyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3JzL1N0cmluZzJGbG9hdFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBkYjRvYmplY3RzIEluYy4gIGh0dHA6Ly93d3cuZGI0by5jb20KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgZGI0b2JqZWN0cyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5CaW5kaW5nTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBGbG9hdFZhbGlkYXRvci4gIFZlcmlmeSBzdHJpbmcgdG8gZmxvYXQgZGF0YSBjb252ZXJzaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmcyRmxvYXRWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLSAgICAKLQlwdWJsaWMgU3RyaW5nIGlzUGFydGlhbGx5VmFsaWQoT2JqZWN0IGZyYWdtZW50KSB7Ci0JCWlmICgoKFN0cmluZylmcmFnbWVudCkubWF0Y2hlcygiXFwtP1swLTldKlxcLj9bMC05XSooWzAtOV0rW2V8RV1cXC0/KFswLTldK1xcLik/WzAtOV0qKT8iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIGdldEhpbnQoKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmxvYXQucGFyc2VGbG9hdCgoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGdldEhpbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotCXByaXZhdGUgU3RyaW5nIGdldEhpbnQoKSB7Ci0JCXJldHVybiBCaW5kaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJWYWxpZGF0ZV9MaWtlIikgKyAgLy8kTk9OLU5MUy0xJAotCQlCaW5kaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJWYWxpZGF0ZV9OdW1iZXJfRXhhbXBsZXMiKSAvLyROT04tTkxTLTEkCi0JCSsgRmxvYXQuTUlOX1ZBTFVFICsgCi0JCSIsICIgKyBGbG9hdC5NQVhfVkFMVUUgKyAiLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9ycy9TdHJpbmcySW50VmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3JzL1N0cmluZzJJbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2OGZiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3JzL1N0cmluZzJJbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgZGI0b2JqZWN0cyBJbmMuICBodHRwOi8vd3d3LmRiNG8uY29tCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIGRiNG9iamVjdHMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuQmluZGluZ01lc3NhZ2VzOwotCi0KLS8qKgotICogSW50VmFsaWRhdG9yLiAgVmFsaWRhdGUgU3RyaW5nIHRvIGludC9JbnRlZ2VyIGRhdGEgaW5wdXQKLSAqLwotcHVibGljIGNsYXNzIFN0cmluZzJJbnRWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvciNpc1BhcnRpYWxseVZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1BhcnRpYWxseVZhbGlkKE9iamVjdCBmcmFnbWVudCkgewotCQlpZiAoKChTdHJpbmcpZnJhZ21lbnQpLm1hdGNoZXMoIlxcLT9bMC05XSoiKSkgLy8kTk9OLU5MUy0xJAotCQkgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIGdldEhpbnQoKTsKLQl9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoKFN0cmluZyl2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRIaW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRIaW50KCkgewotCQlyZXR1cm4gQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygiVmFsaWRhdGVfUmFuZ2VTdGFydCIpICsgSW50ZWdlci5NSU5fVkFMVUUgKyAgLy8kTk9OLU5MUy0xJAotCQkJQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygiYW5kIikgKyBJbnRlZ2VyLk1BWF9WQUxVRSArICIuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3JzL1N0cmluZzJMb25nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3JzL1N0cmluZzJMb25nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOGNmYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9ycy9TdHJpbmcyTG9uZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBkYjRvYmplY3RzIEluYy4gIGh0dHA6Ly93d3cuZGI0by5jb20KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgZGI0b2JqZWN0cyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5CaW5kaW5nTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBMb25nVmFsaWRhdG9yLiAgVmFsaWRhdGUgU3RyaW5nIHRvIExvbmcvbG9uZyBkYXRhIGlucHV0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmcyTG9uZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3IjaXNQYXJ0aWFsbHlWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNQYXJ0aWFsbHlWYWxpZChPYmplY3QgZnJhZ21lbnQpIHsKLQkJaWYgKCgoU3RyaW5nKWZyYWdtZW50KS5tYXRjaGVzKCJcXC0/WzAtOV0qIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBnZXRIaW50KCk7Ci0JfQotICAgIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvci5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMb25nLnBhcnNlTG9uZygoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgcmV0dXJuIGdldEhpbnQoKTsKLSAgICAgICAgfQotICAgIH0gICAgCi0KLQlwcml2YXRlIFN0cmluZyBnZXRIaW50KCkgewotCQlyZXR1cm4gQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygiVmFsaWRhdGVfUmFuZ2VTdGFydCIpICsgTG9uZy5NSU5fVkFMVUUgKyAgLy8kTk9OLU5MUy0xJAotCQkJQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygiYW5kIikgKyBMb25nLk1BWF9WQUxVRSArICIuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3JzL1N0cmluZzJTaG9ydFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9ycy9TdHJpbmcyU2hvcnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExMDAxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92YWxpZGF0b3JzL1N0cmluZzJTaG9ydFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBkYjRvYmplY3RzIEluYy4gIGh0dHA6Ly93d3cuZGI0by5jb20KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgZGI0b2JqZWN0cyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5CaW5kaW5nTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBTaG9ydFZhbGlkYXRvci4gIFZhbGlkYXRlIFN0cmluZyB0byBTaG9ydCBkYXRhIGlucHV0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmcyU2hvcnRWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvciNpc1BhcnRpYWxseVZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1BhcnRpYWxseVZhbGlkKE9iamVjdCBmcmFnbWVudCkgewotCQlpZiAoKChTdHJpbmcpZnJhZ21lbnQpLm1hdGNoZXMoIlxcLT9bMC05XSoiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIGdldEhpbnQoKTsKLQl9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNob3J0LnBhcnNlU2hvcnQoKFN0cmluZyl2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRIaW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRIaW50KCkgewotCQlyZXR1cm4gQmluZGluZ01lc3NhZ2VzLmdldFN0cmluZygiVmFsaWRhdGVfUmFuZ2VTdGFydCIpICsgU2hvcnQuTUlOX1ZBTFVFICsgIC8vJE5PTi1OTFMtMSQKLQkJCUJpbmRpbmdNZXNzYWdlcy5nZXRTdHJpbmcoImFuZCIpICsgU2hvcnQuTUFYX1ZBTFVFICsgIi4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZhbGlkYXRvcnMvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9ycy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2M2FhMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmFsaWRhdG9ycy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+UHJvdmlkZXMgc3VwcG9ydCBmb3IgZGF0YSBiaW5kaW5nLCBmb3IgZXhhbXBsZSBiaW5kaW5nIGFuIGF0dHJpYnV0ZSB2YWx1ZSBvZiBhIG1vZGVsCi1vYmplY3QgdG8gYSBVSSB3aWRnZXQncyBzdGF0ZS48L3A+Ci0KLTxwPlRoaXMgcGFja2FnZSBzdXBwbGllcyBkZWZhdWx0IHZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbnMuPC9wPgotPGgyPlBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci08cD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92aWV3ZXJzL0RlZmF1bHRDZWxsTW9kaWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZpZXdlcnMvRGVmYXVsdENlbGxNb2RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmQzMjNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZpZXdlcnMvRGVmYXVsdENlbGxNb2RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZpZXdlcnMuVGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci0KLS8qKgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHJlbWFpbgotICogdW5jaGFuZ2VkIGR1cmluZyB0aGUgMy4yIHJlbGVhc2UgY3ljbGUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICoKLSAqIFRPRE8gPGJiPnRoaXMgY2xhc3Mgc2hvdWxkIGJlIHJlZmFjdG9yZWQsIG9yIG1vdmVkIHRvIGEgZGlmZmVyZW50IHBsYWNlPC9iYj4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRDZWxsTW9kaWZpZXIgaW1wbGVtZW50cyBJQ2VsbE1vZGlmaWVyewotCQotCXByaXZhdGUgVGFibGVWaWV3ZXJEZXNjcmlwdGlvbiB0YWJsZVZpZXdlckRlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIHRhYmxlVmlld2VyRGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgRGVmYXVsdENlbGxNb2RpZmllcihUYWJsZVZpZXdlckRlc2NyaXB0aW9uIHRhYmxlVmlld2VyRGVzY3JpcHRpb24pewotCQl0aGlzLnRhYmxlVmlld2VyRGVzY3JpcHRpb24gPSB0YWJsZVZpZXdlckRlc2NyaXB0aW9uOwotCX0KLQotCXByaXZhdGUgQ29sdW1uIGZpbmRDb2x1bW4oU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5nZXRDb2x1bW5Db3VudCgpOyBpKyspIHsKLQkJCUNvbHVtbiBjb2x1bW4gPSB0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmdldENvbHVtbihpKTsKLQkJCWlmIChjb2x1bW4uZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJCXJldHVybiBjb2x1bW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUNvbHVtbiBjb2x1bW4gPSBmaW5kQ29sdW1uKHByb3BlcnR5KTsKLQkJaWYgKGNvbHVtbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0cnkgewotCQkJTWV0aG9kIGdldHRlciA9IGVsZW1lbnQKLQkJCQkJLmdldENsYXNzKCkKLQkJCQkJLmdldE1ldGhvZCgKLQkJCQkJCQkiZ2V0IgkrIHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSksIG5ldyBDbGFzc1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBnZXR0ZXIuaW52b2tlKGVsZW1lbnQsIG5ldyBPYmplY3RbMF0pOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIGxvZwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBsb2cKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gbG9nCi0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBsb2cKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIGxvZwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJQ29sdW1uIGNvbHVtbiA9IGZpbmRDb2x1bW4ocHJvcGVydHkpOwotCQlpZiAoY29sdW1uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEl0ZW0pIHsKLQkJCWVsZW1lbnQgPSAoKEl0ZW0pIGVsZW1lbnQpLmdldERhdGEoKTsKLQkJfQotCQl0cnkgewotCQkJTWV0aG9kIHNldHRlciA9IGVsZW1lbnQKLQkJCQkJLmdldENsYXNzKCkKLQkJCQkJLmdldE1ldGhvZCgKLQkJCQkJCQkic2V0IgkrIHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSksIG5ldyBDbGFzc1tdIHsgY29sdW1uLmdldENvbnZlcnRlcigpLmdldFRhcmdldFR5cGUoKSB9KTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0dGVyLmludm9rZShlbGVtZW50LCBuZXcgT2JqZWN0W10geyB2YWx1ZSB9KTsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBsb2cKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gbG9nCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIGxvZwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gbG9nCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBsb2cKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92aWV3ZXJzL1RhYmxlVmlld2VyRGVzY3JpcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZpZXdlcnMvVGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjM3MjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZpZXdlcnMvVGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZhbGlkYXRvci5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotLyoqCi0gKiBBIGRlc2NyaXB0aW9uIG9iamVjdCBmb3IgdGFibGUgdmlld2Vycy4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZVZpZXdlckRlc2NyaXB0aW9uIHsKLQkKLQkKLQkvKioKLQkgKiBUYWJsZSBjb2x1bW4gbWF5IHNwZWRpZnkgYSBuZXN0ZWQgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUFJPUEVSVFlfTkVTVElOR19TRVBFUkFUT1IgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBzaW5jZSAzLjIKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29sdW1uIHsKLQotCQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0JCQotCQlwcml2YXRlIENsYXNzICBwcm9wZXJ0eVR5cGU7Ci0KLQkJcHJpdmF0ZSBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCQlwcml2YXRlIElDb252ZXJ0ZXIgY29udmVydGVyOwotCi0JCXByaXZhdGUgQ2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIHJlYWRPbmx5ID0gdHJ1ZTsKLQotCQkvKioKLQkJICogQHBhcmFtIHByb3BlcnR5TmFtZQotCQkgKiBAcGFyYW0gY2VsbEVkaXRvcgotCQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JCSAqIEBwYXJhbSBjb252ZXJ0ZXIKLQkJICovCi0JCXB1YmxpYyBDb2x1bW4oU3RyaW5nIHByb3BlcnR5TmFtZSwgQ2VsbEVkaXRvciBjZWxsRWRpdG9yLAotCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yLCBJQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0JCQl0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JCQl0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJCXJlYWRPbmx5ID0gZmFsc2U7Ci0JCX0KLQotCQkKLQkJQ29sdW1uKFN0cmluZyBwcm9wZXJ0eU5hbWUsIElDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQkJCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCQkJcmVhZE9ubHkgPSB0cnVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gSUNvbnZlcnRlcgotCQkgKi8KLQkJcHVibGljIElDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgewotCQkJcmV0dXJuIGNvbnZlcnRlcjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFN0cmluZyBuYW1lCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBwcm9wZXJ0eU5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBJVmFsaWRhdG9yCi0JCSAqLwotCQlwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdG9yOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBjb252ZXJ0ZXIKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihJQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHZhbGlkYXRvcgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIENlbGxFZGl0b3IKLQkJICovCi0JCXB1YmxpYyBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoKSB7Ci0JCQlyZXR1cm4gY2VsbEVkaXRvcjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gY2VsbEVkaXRvcgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0Q2VsbEVkaXRvcihDZWxsRWRpdG9yIGNlbGxFZGl0b3IpIHsKLQkJCXRoaXMuY2VsbEVkaXRvciA9IGNlbGxFZGl0b3I7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBwcm9wZXJ0eSBDbGFzcwotCQkgKi8KLQkJcHVibGljIENsYXNzIGdldFByb3BlcnR5VHlwZSgpIHsKLQkJCXJldHVybiBwcm9wZXJ0eVR5cGU7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHByb3BlcnR5VHlwZQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UHJvcGVydHlUeXBlKENsYXNzIHByb3BlcnR5VHlwZSkgewotCQkJdGhpcy5wcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eVR5cGU7Ci0JCX0KLQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIGJvb2xlYW4gZm9yIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBlZGl0YWJsZQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJCXJldHVybiAhcmVhZE9ubHk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBMaXN0IGNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIElDZWxsTW9kaWZpZXIgY2VsbE1vZGlmaWVyID0gbnVsbDsKLQotCS8qKgotCSAqIEBwYXJhbSB0YWJsZVZpZXdlcgotCSAqLwotCXB1YmxpYyBUYWJsZVZpZXdlckRlc2NyaXB0aW9uKFRhYmxlVmlld2VyIHRhYmxlVmlld2VyKSB7Ci0JCXRoaXMudGFibGVWaWV3ZXIgPSB0YWJsZVZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIGNlbGxFZGl0b3IgCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqIEBwYXJhbSBjb252ZXJ0ZXIKLQkgKiAgICAgICAgICAgIGNvbnZlcnRlciBmcm9tIG1vZGVsIG9iamVjdHMgdG8gU3RyaW5nLCBvciBJbWFnZUFuZFN0cmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFZGl0YWJsZUNvbHVtbihpbnQgY29sdW1uSW5kZXgsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0JCQlDZWxsRWRpdG9yIGNlbGxFZGl0b3IsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlDb2x1bW4gY29sdW1uID0gbmV3IENvbHVtbihwcm9wZXJ0eU5hbWUsIGNlbGxFZGl0b3IgLCB2YWxpZGF0b3IsCi0JCQkJY29udmVydGVyKTsKLQkJaWYoY29sdW1uSW5kZXggPT0gLTEpewotCQkJY29sdW1ucy5hZGQoY29sdW1uKTsKLQkJfSBlbHNlIHsKLQkJCWNvbHVtbnMuYWRkKGNvbHVtbkluZGV4LGNvbHVtbik7CQkJCQotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkUmVhZE9ubHlDb2x1bW4oaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBJQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlDb2x1bW4gY29sdW1uID0gbmV3IENvbHVtbihwcm9wZXJ0eU5hbWUsIGNvbnZlcnRlcik7Ci0JCWlmKGNvbHVtbkluZGV4ID09IC0xKXsKLQkJCWNvbHVtbnMuYWRkKGNvbHVtbik7Ci0JCX0gZWxzZSB7Ci0JCQljb2x1bW5zLmFkZChjb2x1bW5JbmRleCxjb2x1bW4pOwkJCQkKLQkJfQkKLQl9CQotCQotCS8qKgotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcGFyYW0gY2VsbEVkaXRvcgotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gY29udmVydGVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWRpdGFibGVDb2x1bW4oU3RyaW5nIHByb3BlcnR5TmFtZSwKLQkJCUNlbGxFZGl0b3IgY2VsbEVkaXRvciwgSVZhbGlkYXRvciB2YWxpZGF0b3IsIElDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCWFkZEVkaXRhYmxlQ29sdW1uKC0xLHByb3BlcnR5TmFtZSxjZWxsRWRpdG9yLHZhbGlkYXRvcixjb252ZXJ0ZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcGFyYW0gY29udmVydGVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHByb3BlcnR5TmFtZSxJQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlhZGRSZWFkT25seUNvbHVtbihjb2x1bW5JbmRleCxwcm9wZXJ0eU5hbWUsY29udmVydGVyKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSBjb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW4oU3RyaW5nIHByb3BlcnR5TmFtZSxJQ29udmVydGVyIGNvbnZlcnRlcikgewkKLQkJYWRkUmVhZE9ubHlDb2x1bW4oLTEscHJvcGVydHlOYW1lLGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgY29sdW1uIHRoYXQgaXMgcmVhZE9ubHkKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJYWRkUmVhZE9ubHlDb2x1bW4oLTEsIHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JfQotCQotCi0JLyoqCi0JICogQWRkIGEgY29sdW1uIHRoYXQgaXMgZWRpdGFibGUuICBUaGUgY2VsbCBlZGl0b3Igd2lsbCBiZSBkZWZhdWx0ZWQgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5Ci0JICogb3IgY2FuIGJlIGV4cGxpY2l0bHkgc2V0IHVzaW5nIHRoZSBtb3JlIHZlcmJvc2UgQVBJIHRoYXQgaW5jbHVkZXMgdGhlIENlbGxFZGl0b3IgYXJndW1lbnQKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWRpdGFibGVDb2x1bW4oU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlhZGRFZGl0YWJsZUNvbHVtbigtMSwgcHJvcGVydHlOYW1lKTsKLQl9CQotCQotCS8qKgotCSAqIEFkZCBhIGNvbHVtbiB0aGF0IGlzIGVkaXRhYmxlLiAgVGhlIGNlbGwgZWRpdG9yIHdpbGwgYmUgZGVmYXVsdGVkIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIG9yIGNhbiBiZSBleHBsaWNpdGx5IHNldCB1c2luZyB0aGUgbW9yZSB2ZXJib3NlIEFQSSB0aGF0IGluY2x1ZGVzIHRoZSBDZWxsRWRpdG9yIGFyZ3VtZW50Ci0JICogQHBhcmFtIGluZGV4CQkJCVRoZSBjb2x1bW4gaW5kZXgKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCQlUaGUgcHJvcGVydHkgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVkaXRhYmxlQ29sdW1uKGludCBpbmRleCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlhZGRFZGl0YWJsZUNvbHVtbihpbmRleCwgcHJvcGVydHlOYW1lLG51bGwsbnVsbCxudWxsKTsKLQl9CQotCQotCS8qKgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW4oaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWFkZFJlYWRPbmx5Q29sdW1uKGNvbHVtbkluZGV4LCBwcm9wZXJ0eU5hbWUsIG51bGwpOwotCX0JCi0KLQkvKioKLQkgKiBAcmV0dXJuIGNlbGxNb2RpZmllciAgIFRoZSBjZWxsIE1vZGlmaWVyCi0JICovCi0JcHVibGljIElDZWxsTW9kaWZpZXIgZ2V0Q2VsbE1vZGlmaWVyKCkgewotCQlyZXR1cm4gY2VsbE1vZGlmaWVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjZWxsTW9kaWZpZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDZWxsTW9kaWZpZXIoSUNlbGxNb2RpZmllciBjZWxsTW9kaWZpZXIpIHsKLQkJdGhpcy5jZWxsTW9kaWZpZXIgPSBjZWxsTW9kaWZpZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb2x1bW5Db3VudCAgVGhlIG51bWJlciBvZiBDb2x1bW5zCi0JICovCi0JcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsKLQkJcmV0dXJuIGNvbHVtbnMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqIEByZXR1cm4gQ29sdW1uICBUaGUgY29sdW1uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkgKi8KLQlwdWJsaWMgQ29sdW1uIGdldENvbHVtbihpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIChDb2x1bW4pIGNvbHVtbnMuZ2V0KGNvbHVtbkluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRhYmxlVmlld2VyCi0JICovCi0JcHVibGljIFRhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92aWV3ZXJzL1RyZWVWaWV3ZXJEZXNjcmlwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGF0YWJpbmRpbmcvdmlld2Vycy9UcmVlVmlld2VyRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4ZmE3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92aWV3ZXJzL1RyZWVWaWV3ZXJEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52aWV3ZXJzOwotLyoqCi0gKiBBIGRlc2NyaXB0aW9uIG9iamVjdCBmb3IgdGFibGUgdmlld2Vycy4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyLklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2Vycy5UYWJsZVZpZXdlckRlc2NyaXB0aW9uLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLQotLyoqCi0gKiBAc2luY2UgMy4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVHJlZVZpZXdlckRlc2NyaXB0aW9uIHsKLQotCS8qKgotCSAqIFRhYmxlIGNvbHVtbiBtYXkgc3BlZGlmeSBhIG5lc3RlZCBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9QUk9QRVJUWV9ORVNUSU5HX1NFUEVSQVRPUiA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCi0KLQotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCQotCXByaXZhdGUgSGFzaE1hcCBjb2x1bW5zTWFwID0gbmV3IEhhc2hNYXAoKTsgIC8vIFRPRE8gTmVlZCB0byBkZWFsIHdpdGggaW5zdGFuY2VvZiB2cy4gZXhhY3QgdHlwZQotCQotCi0JcHJpdmF0ZSBJQ2VsbE1vZGlmaWVyIGNlbGxNb2RpZmllciA9IG51bGw7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdHJlZVZpZXdlcgotCSAqLwotCXB1YmxpYyBUcmVlVmlld2VyRGVzY3JpcHRpb24oVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXRoaXMudHJlZVZpZXdlciA9IHRyZWVWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGluc3RhbmNlVHlwZSAKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIGNlbGxFZGl0b3IgCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqIEBwYXJhbSBjb252ZXJ0ZXIKLQkgKiAgICAgICAgICAgIGNvbnZlcnRlciBmcm9tIG1vZGVsIG9iamVjdHMgdG8gU3RyaW5nLCBvciBJbWFnZUFuZFN0cmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW4oQ2xhc3MgaW5zdGFuY2VUeXBlLCBpbnQgY29sdW1uSW5kZXgsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0JCQlDZWxsRWRpdG9yIGNlbGxFZGl0b3IsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlMaXN0IGNvbHVtbnMgPSAoTGlzdCljb2x1bW5zTWFwLmdldChpbnN0YW5jZVR5cGUpOwotCQlpZiAoY29sdW1ucz09bnVsbCkgewotCQkJY29sdW1ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNvbHVtbnNNYXAucHV0KGluc3RhbmNlVHlwZSwgY29sdW1ucyk7Ci0JCX0KLQkJQ29sdW1uIGNvbHVtbiA9IG5ldyBDb2x1bW4ocHJvcGVydHlOYW1lLCBjZWxsRWRpdG9yICwgdmFsaWRhdG9yLAotCQkJCWNvbnZlcnRlcik7Ci0JCWlmKGNvbHVtbkluZGV4ID09IC0xKQotCQkJY29sdW1ucy5hZGQoY29sdW1uKTsJCQkKLQkJZWxzZSAKLQkJCWNvbHVtbnMuYWRkKGNvbHVtbkluZGV4LGNvbHVtbik7CQkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBpbnN0YW5jZVR5cGUgCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSBjZWxsRWRpdG9yCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqIEBwYXJhbSBjb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW4oQ2xhc3MgaW5zdGFuY2VUeXBlLCBTdHJpbmcgcHJvcGVydHlOYW1lLAotCQkJQ2VsbEVkaXRvciBjZWxsRWRpdG9yLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgSUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJYWRkQ29sdW1uKGluc3RhbmNlVHlwZSwgLTEscHJvcGVydHlOYW1lLGNlbGxFZGl0b3IsdmFsaWRhdG9yLGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGluc3RhbmNlVHlwZSAKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqIEBwYXJhbSBjb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW4oQ2xhc3MgaW5zdGFuY2VUeXBlLCBpbnQgY29sdW1uSW5kZXgsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0JCQlJVmFsaWRhdG9yIHZhbGlkYXRvciwgSUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJYWRkQ29sdW1uKGluc3RhbmNlVHlwZSwgY29sdW1uSW5kZXgscHJvcGVydHlOYW1lLG51bGwsdmFsaWRhdG9yLGNvbnZlcnRlcik7Ci0JfQotCQotCQotCS8qKgotCSAqIEBwYXJhbSBpbnN0YW5jZVR5cGUgCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gY29udmVydGVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uKENsYXNzIGluc3RhbmNlVHlwZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yLCBJQ29udmVydGVyIGNvbnZlcnRlcikgewkKLQkJYWRkQ29sdW1uKGluc3RhbmNlVHlwZSwgLTEscHJvcGVydHlOYW1lLHZhbGlkYXRvcixjb252ZXJ0ZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbnN0YW5jZVR5cGUgCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbHVtbihDbGFzcyBpbnN0YW5jZVR5cGUsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJYWRkQ29sdW1uKGluc3RhbmNlVHlwZSwgLTEsIHByb3BlcnR5TmFtZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBpbnN0YW5jZVR5cGUgCi0JICogQHBhcmFtIGNvbHVtbkluZGV4Ci0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbHVtbihDbGFzcyBpbnN0YW5jZVR5cGUsIGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlhZGRDb2x1bW4oaW5zdGFuY2VUeXBlLCBjb2x1bW5JbmRleCwgcHJvcGVydHlOYW1lLCBudWxsLCBudWxsLCBudWxsKTsKLQl9CQotCi0JLyoqCi0JICogQHJldHVybiBjZWxsTW9kaWZpZXIgICBUaGUgY2VsbCBNb2RpZmllcgotCSAqLwotCXB1YmxpYyBJQ2VsbE1vZGlmaWVyIGdldENlbGxNb2RpZmllcigpIHsKLQkJcmV0dXJuIGNlbGxNb2RpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2VsbE1vZGlmaWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VsbE1vZGlmaWVyKElDZWxsTW9kaWZpZXIgY2VsbE1vZGlmaWVyKSB7Ci0JCXRoaXMuY2VsbE1vZGlmaWVyID0gY2VsbE1vZGlmaWVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbnN0YW5jZVR5cGUgCi0JICogQHJldHVybiBjb2x1bW5Db3VudCAgVGhlIG51bWJlciBvZiBDb2x1bW5zCi0JICovCi0JcHVibGljIGludCBnZXRDb2x1bW5Db3VudChDbGFzcyBpbnN0YW5jZVR5cGUpIHsKLQkJTGlzdCBjb2x1bW5zID0gKExpc3QpIGNvbHVtbnNNYXAuZ2V0KGluc3RhbmNlVHlwZSk7Ci0JCWlmIChjb2x1bW5zIT1udWxsKQotCQkgIHJldHVybiBjb2x1bW5zLnNpemUoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGluc3RhbmNlVHlwZSAKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiBAcmV0dXJuIENvbHVtbiAgVGhlIGNvbHVtbiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICovCi0JcHVibGljIENvbHVtbiBnZXRDb2x1bW4oQ2xhc3MgaW5zdGFuY2VUeXBlLCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJTGlzdCBjb2x1bW5zID0gKExpc3QpIGNvbHVtbnNNYXAuZ2V0KGluc3RhbmNlVHlwZSk7Ci0JCWlmIChjb2x1bW5zIT1udWxsICYmIGNvbHVtbnMuc2l6ZSgpPmNvbHVtbkluZGV4KQotCQkgICByZXR1cm4gKENvbHVtbikgY29sdW1ucy5nZXQoY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQkvKioKLQkgKiBAcGFyYW0gaW5zdGFuY2VUeXBlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqIEByZXR1cm4gY29sdW1uJ3MgaW5kZXgsIG9yIC0xIGlmIGl0IGlzIG5vdCBhIHZhbGlkIGNvbHVtbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoQ2xhc3MgaW5zdGFuY2VUeXBlLCBDb2x1bW4gY29sdW1uKSB7Ci0JCUxpc3QgY29sdW1ucyA9IChMaXN0KSBjb2x1bW5zTWFwLmdldChpbnN0YW5jZVR5cGUpOwotCQlpZiAoY29sdW1ucyE9bnVsbCkKLQkJCXJldHVybiBjb2x1bW5zLmluZGV4T2YoY29sdW1uKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJlZVZpZXdlcgotCSAqLwotCXB1YmxpYyBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKSB7Ci0JCXJldHVybiB0cmVlVmlld2VyOwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NbXSBnZXRDbGFzc1R5cGVzKCkgewotCQlpZiAoY29sdW1uc01hcC5rZXlTZXQoKS5zaXplKCk9PTApIHJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIChDbGFzc1tdKSBjb2x1bW5zTWFwLmtleVNldCgpLnRvQXJyYXkobmV3IENsYXNzW2NvbHVtbnNNYXAua2V5U2V0KCkuc2l6ZSgpXSk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZpZXdlcnMvVmlld2Vyc1Byb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZpZXdlcnMvVmlld2Vyc1Byb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2ZTQzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92aWV3ZXJzL1ZpZXdlcnNQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52aWV3ZXJzOwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIHRvIGRlc2NyaWJlIHByb3BlcnRpZXMgb2YgSkZhY2Ugdmlld2Vycy4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlld2Vyc1Byb3BlcnRpZXMgewotCi0JLyoqCi0JICogUHJvcGVydHkgSUQgY29uc3RhbnQgZGVub3RpbmcgdGhlIGNvbnRlbnQgY29sbGVjdGlvbiBwcm9wZXJ0eSBvZiBKRmFjZQotCSAqIHN0cnVjdHVyZWQgdmlld2Vycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UID0gImNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcm9wZXJ0eSBJRCBjb25zdGFudCBkZW5vdGluZyB0aGUgKHNpbmdsZSkgc2VsZWN0aW9uIHByb3BlcnR5IG9mIEpGYWNlCi0JICogc3RydWN0dXJlZCB2aWV3ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9TRUxFQ1RJT04gPSAic2luZ2xlX3NlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByb3BlcnR5IElEIGNvbnN0YW50IGRlbm90aW5nIHRoZSAobXVsdGkpIHNlbGVjdGlvbiBjb2xsZWN0aW9uIHByb3BlcnR5Ci0JICogb2YgSkZhY2Ugc3RydWN0dXJlZCB2aWV3ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJX1NFTEVDVElPTiA9ICJtdWx0aV9zZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZpZXdlcnMvVmlld2Vyc1VwZGF0YWJsZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZpZXdlcnMvVmlld2Vyc1VwZGF0YWJsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5YzQ1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92aWV3ZXJzL1ZpZXdlcnNVcGRhdGFibGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JRGF0YUJpbmRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyVXBkYXRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcudmlld2Vycy5UYWJsZVZpZXdlclVwZGF0YWJsZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcudmlld2Vycy5UYWJsZVZpZXdlclVwZGF0YWJsZUNvbGxlY3Rpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy52aWV3ZXJzLlRyZWVWaWV3ZXJVcGRhdGFibGVUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnZpZXdlcnMuVHJlZVZpZXdlclVwZGF0YWJsZVRyZWVFeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy52aWV3ZXJzLlVwZGF0YWJsZUNvbGxlY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdExpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotCi0vKioKLSAqIEEgZmFjdG9yeSB0aGF0IHN1cHBvcnRzIGJpbmRpbmcgdG8gSkZhY2Ugdmlld2Vycy4gVGhpcwotICogZmFjdG9yeSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIG9iamVjdHM6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIEFic3RyYWN0TGlzdFZpZXdlcn0gLSBkZW5vdGVzIHRoZSB2aWV3ZXIncyBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzPC9saT4KLSAqIDxsaT57QGxpbmsgVGFibGVWaWV3ZXJEZXNjcmlwdGlvbn0gLSBUT0RPIGRlc2NyaWJlPC9saT4KLSAqIDxsaT5vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5Qcm9wZXJ0eURlc2NyaXB0aW9uIC0gZGVwZW5kaW5nIG9uIHRoZQotICogcHJvcGVydHkgZGVzY3JpcHRpb24ncyBvYmplY3QgYW5kIHByb3BlcnR5IElEOgotICogPHVsPgotICogPGxpPm9iamVjdCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIsIHByb3BlcnR5IElEIGlzIFZpZXdlcnNQcm9wZXJ0aWVzLlNJTkdMRV9TRUxFQ1RJT04gLSBkZW5vdGluZyB0aGUKLSAqIHZpZXdlcidzIChzaW5nbGUpIHNlbGVjdGlvbjwvbGk+Ci0gKiA8bGk+b2JqZWN0IGluc3RhbmNlb2YgVGFibGVWaWV3ZXIsIHByb3BlcnR5IElEIGlzIFZpZXdlcnNQcm9wZXJ0aWVzLkNPTlRFTlQ8L2xpPgotICogPGxpPm9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0TGlzdFZpZXdlciwgcHJvcGVydHkgSUQgaXMgVmlld2Vyc1Byb3BlcnRpZXMuQ09OVEVOVDwvbGk+Ci0gKiA8L3VsPgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiBUT0RPIGNvbXBsZXRlIHRoZSBsaXN0Ci0gKiBAc2luY2UgMy4yCi0gKgotICovCi1maW5hbCBwdWJsaWMgY2xhc3MgVmlld2Vyc1VwZGF0YWJsZUZhY3RvcnkgaW1wbGVtZW50cyBJVXBkYXRhYmxlRmFjdG9yeSB7Ci0JCi0JcHJpdmF0ZSBpbnQgdXBkYXRlVGltZTsJCi0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZmFjdG9yeSB0aGF0IGNhbiBjcmVhdGUgdWRhdGFibGVzIGZvciBKRmFjZSB2aWV3ZXJzCi0JICovCi0JcHVibGljIFZpZXdlcnNVcGRhdGFibGVGYWN0b3J5KCl7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHVwZGF0ZVRpbWUuICAJCVVwZGF0ZSBwb2xpY3kgb2YgSURhdGFCaW5kaW5nQ29udGV4dC5USU1FX0VBUkxZIG9yIFRJTUVfTEFURS4gIFRoaXMgaXMgb25seSBhIGhpbnQKLQkgKiAJCQkJCQkJdGhhdCBzb21lIGVkaXRhYmxlIHZpZXdlcnMgbWF5IHN1cHBvcnQKLQkgKi8KLQlwdWJsaWMgVmlld2Vyc1VwZGF0YWJsZUZhY3RvcnkoaW50IHVwZGF0ZVRpbWUpIHsKLQkJdGhpcy51cGRhdGVUaW1lID0gdXBkYXRlVGltZTsKLQl9Ci0KLQlwdWJsaWMgSVVwZGF0YWJsZSBjcmVhdGVVcGRhdGFibGUoTWFwIHByb3BlcnRpZXMsIE9iamVjdCBkZXNjcmlwdGlvbiwKLQkJCUlEYXRhQmluZGluZ0NvbnRleHQgYmluZGluZ0NvbnRleHQpIHsKLQkJaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgUHJvcGVydHkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKFByb3BlcnR5KSBkZXNjcmlwdGlvbikuZ2V0T2JqZWN0KCk7Ci0JCQlPYmplY3QgYXR0cmlidXRlID0gKChQcm9wZXJ0eSkgZGVzY3JpcHRpb24pCi0JCQkJCS5nZXRQcm9wZXJ0eUlEKCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcgotCQkJCQkmJiBWaWV3ZXJzUHJvcGVydGllcy5TSU5HTEVfU0VMRUNUSU9OLmVxdWFscyhhdHRyaWJ1dGUpKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVmlld2VyVXBkYXRhYmxlVmFsdWUoCi0JCQkJCQkoU3RydWN0dXJlZFZpZXdlcikgb2JqZWN0LCAoU3RyaW5nKSBhdHRyaWJ1dGUpOwotCQkJfQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0TGlzdFZpZXdlcgotCQkJCQkmJiBWaWV3ZXJzUHJvcGVydGllcy5TSU5HTEVfU0VMRUNUSU9OLmVxdWFscyhhdHRyaWJ1dGUpKQotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZFZpZXdlclVwZGF0YWJsZVZhbHVlKAotCQkJCQkJKEFic3RyYWN0TGlzdFZpZXdlcikgb2JqZWN0LCAoU3RyaW5nKSBhdHRyaWJ1dGUpOwotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWJzdHJhY3RMaXN0Vmlld2VyCi0JCQkJCSYmIFZpZXdlcnNQcm9wZXJ0aWVzLkNPTlRFTlQuZXF1YWxzKGF0dHJpYnV0ZSkpCi0JCQkJcmV0dXJuIG5ldyBVcGRhdGFibGVDb2xsZWN0aW9uVmlld2VyKAotCQkJCQkJKEFic3RyYWN0TGlzdFZpZXdlcikgb2JqZWN0KTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcgotCQkJCQkmJiBWaWV3ZXJzUHJvcGVydGllcy5DT05URU5ULmVxdWFscyhhdHRyaWJ1dGUpKSB7Ci0JCQkJcmV0dXJuIG5ldyBUYWJsZVZpZXdlclVwZGF0YWJsZUNvbGxlY3Rpb24oKFRhYmxlVmlld2VyKSBvYmplY3QpOwotCQkJfQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRyZWVWaWV3ZXIKLQkJCQkJJiYgVmlld2Vyc1Byb3BlcnRpZXMuQ09OVEVOVC5lcXVhbHMoYXR0cmlidXRlKSkgewotCQkJCXJldHVybiBuZXcgVHJlZVZpZXdlclVwZGF0YWJsZVRyZWUoKFRyZWVWaWV3ZXIpIG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQWJzdHJhY3RMaXN0Vmlld2VyKSB7Ci0JCQkvLyBiaW5kaW5nIHRvIGEgVmlld2VyIGRpcmVjdGx5IGltcGxpZXMgYmluZGluZyB0byBpdHMKLQkJCS8vIGNvbnRlbnQKLQkJCXJldHVybiBuZXcgVXBkYXRhYmxlQ29sbGVjdGlvblZpZXdlcigKLQkJCQkJKEFic3RyYWN0TGlzdFZpZXdlcikgZGVzY3JpcHRpb24pOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgVGFibGVWaWV3ZXJEZXNjcmlwdGlvbikgewotCQkJcmV0dXJuIG5ldyBUYWJsZVZpZXdlclVwZGF0YWJsZUNvbGxlY3Rpb25FeHRlbmRlZCgKLQkJCQkJKFRhYmxlVmlld2VyRGVzY3JpcHRpb24pIGRlc2NyaXB0aW9uLCBiaW5kaW5nQ29udGV4dCwgdXBkYXRlVGltZSk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBUcmVlVmlld2VyRGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiBuZXcgVHJlZVZpZXdlclVwZGF0YWJsZVRyZWVFeHRlbmRlZCgKLQkJCQkoVHJlZVZpZXdlckRlc2NyaXB0aW9uKSBkZXNjcmlwdGlvbiwgYmluZGluZ0NvbnRleHQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kYXRhYmluZGluZy92aWV3ZXJzL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZpZXdlcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjNjMGE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RhdGFiaW5kaW5nL3ZpZXdlcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlByb3ZpZGVzIHN1cHBvcnQgZm9yIGRhdGEgYmluZGluZywgZm9yIGV4YW1wbGUgYmluZGluZyBhbiBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBtb2RlbAotb2JqZWN0IHRvIGEgVUkgd2lkZ2V0J3Mgc3RhdGUuPC9wPgotCi08cD5UaGlzIHBhY2thZ2UgaW5jbHVkZXMgaGVscGVyIGNsYXNzZXMgZm9yIGltcGxlbWVudGluZyBKRmFjZSBWaWV3ZXIgc3VwcG9ydDwvcD4KLTxoMj5QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotPHA+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvQmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDlkNDVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL0JpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZzsKLQotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBCaW5kaW5nIHsKLQotCXByb3RlY3RlZCBmaW5hbCBEYXRhQmluZGluZ0NvbnRleHQgY29udGV4dDsKLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHVibGljIEJpbmRpbmcoRGF0YUJpbmRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JYWJzdHJhY3QgcHVibGljIHZvaWQgdXBkYXRlVGFyZ2V0RnJvbU1vZGVsKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL0JpbmRpbmdNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvQmluZGluZ01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NjdhNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvQmluZGluZ01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdNZXNzYWdlcyB7Ci0KLQkvKioKLQkgKiBUaGUgQmluZGluZyByZXNvdXJjZSBidW5kbGU7IGVhZ2VybHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLm1lc3NhZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBrZXkgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IKLQkgKiBKRmFjZSBEYXRhIEJpbmRpbmcuIElmIHRoZXJlIGlzbid0IGFueSB2YWx1ZSB1bmRlciB0aGUgZ2l2ZW4ga2V5LCB0aGUga2V5Ci0JICogaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9Db2xsZWN0aW9uQmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvQ29sbGVjdGlvbkJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViYmEyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9Db2xsZWN0aW9uQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5CaW5kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklCaW5kU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyLklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3I7Ci0KLS8qKgotICogCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3Rpb25CaW5kaW5nIGV4dGVuZHMgQmluZGluZyB7Ci0KLQlwcml2YXRlIGZpbmFsIElVcGRhdGFibGVDb2xsZWN0aW9uIHRhcmdldDsKLQotCXByaXZhdGUgZmluYWwgSVVwZGF0YWJsZUNvbGxlY3Rpb24gbW9kZWw7Ci0KLQlwcml2YXRlIElDb252ZXJ0ZXIgY29udmVydGVyOwotCi0JcHJpdmF0ZSBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIGJpbmRTcGVjIAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQmluZGluZyhEYXRhQmluZGluZ0NvbnRleHQgY29udGV4dCwKLQkJCUlVcGRhdGFibGVDb2xsZWN0aW9uIHRhcmdldCwgSVVwZGF0YWJsZUNvbGxlY3Rpb24gbW9kZWwsCi0JCQlJQmluZFNwZWMgYmluZFNwZWMpIHsKLQkJc3VwZXIoY29udGV4dCk7Ci0JCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMuY29udmVydGVyID0gYmluZFNwZWMuZ2V0Q29udmVydGVyKCk7Ci0JCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24oIk1pc3NpbmcgY29udmVydGVyIGZyb20gIiArIHRhcmdldC5nZXRFbGVtZW50VHlwZSgpICsgIiB0byAiICsgbW9kZWwuZ2V0RWxlbWVudFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmKCFjb252ZXJ0ZXIuZ2V0TW9kZWxUeXBlKCkuZXF1YWxzKG1vZGVsLmdldEVsZW1lbnRUeXBlKCkpKSB7Ci0JCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigiQ29udmVydGVyIGRvZXMgbm90IGFwcGx5IHRvIG1vZGVsIHR5cGUuIEV4cGVjdGVkOiAiICsgbW9kZWwuZ2V0RWxlbWVudFR5cGUoKSArICIsIGFjdHVhbDogIiArIGNvbnZlcnRlci5nZXRNb2RlbFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmKCFjb252ZXJ0ZXIuZ2V0VGFyZ2V0VHlwZSgpLmVxdWFscyh0YXJnZXQuZ2V0RWxlbWVudFR5cGUoKSkpIHsKLQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKCJDb252ZXJ0ZXIgZG9lcyBub3QgYXBwbHkgdG8gdGFyZ2V0IHR5cGUuIEV4cGVjdGVkOiAiICsgdGFyZ2V0LmdldEVsZW1lbnRUeXBlKCkgKyAiLCBhY3R1YWw6ICIgKyBjb252ZXJ0ZXIuZ2V0VGFyZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJdGhpcy52YWxpZGF0b3IgPSBiaW5kU3BlYy5nZXRWYWxpZGF0b3IoKTsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigiTWlzc2luZyB2YWxpZGF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRhcmdldC5hZGRDaGFuZ2VMaXN0ZW5lcih0YXJnZXRDaGFuZ2VMaXN0ZW5lcik7Ci0JCW1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKG1vZGVsQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIGZpbmFsIElDaGFuZ2VMaXN0ZW5lciB0YXJnZXRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUNoYW5nZShDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudCkgewotCQkJaWYgKHVwZGF0aW5nKQotCQkJCXJldHVybjsKLQkJCWlmIChjaGFuZ2VFdmVudC5nZXRDaGFuZ2VUeXBlKCkgPT0gQ2hhbmdlRXZlbnQuVkVSSUZZKSB7Ci0JCQkJLy8gd2UgYXJlIG5vdGlmaWVkIG9mIGEgcGVuZGluZyBjaGFuZ2UsIGRvIHZhbGlkYXRpb24KLQkJCQkvLyBhbmQgdmV0byB0aGUgY2hhbmdlIGlmIGl0IGlzIG5vdCB2YWxpZAotCQkJCU9iamVjdCB2YWx1ZSA9IGNoYW5nZUV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJU3RyaW5nIHBhcnRpYWxWYWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0b3IKLQkJCQkJCS5pc1BhcnRpYWxseVZhbGlkKHZhbHVlKTsKLQkJCQljb250ZXh0LnVwZGF0ZVBhcnRpYWxWYWxpZGF0aW9uRXJyb3IodGhpcywKLQkJCQkJCXBhcnRpYWxWYWxpZGF0aW9uRXJyb3IpOwotCQkJCWlmIChwYXJ0aWFsVmFsaWRhdGlvbkVycm9yICE9IG51bGwpIHsKLQkJCQkJY2hhbmdlRXZlbnQuc2V0VmV0byh0cnVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIFVwZGF0ZQkKLQkJCQkvLyBUT0RPLCBhdCB0aGlzIHRpbWUgd2UgdmFsaWRhdGUgb25seSB0aGUgInZhbHVlL2NvbnZlcnNpb24iIG5vdCB0aGUgaW5kZXggKGFkZC9yZW1vdmUpCi0JCQkJU3RyaW5nIHZhbGlkYXRpb25FcnJvciA9IG51bGw7Ci0JCQkJaWYgKGNoYW5nZUV2ZW50LmdldENoYW5nZVR5cGUoKSAhPSBDaGFuZ2VFdmVudC5SRU1PVkUpIHsKLQkJCQkJT2JqZWN0IHZhbHVlID0gY2hhbmdlRXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdG9yLmlzVmFsaWQodmFsdWUpOwotCQkJCQljb250ZXh0LnVwZGF0ZVBhcnRpYWxWYWxpZGF0aW9uRXJyb3IodGhpcywgbnVsbCk7Ci0JCQkJCWNvbnRleHQudXBkYXRlVmFsaWRhdGlvbkVycm9yKHRoaXMsIHZhbGlkYXRpb25FcnJvcik7Ci0JCQkJfQotCQkJCWlmICh2YWxpZGF0aW9uRXJyb3IgPT0gbnVsbCkgCi0JCQkJICAgICB1cGRhdGUobW9kZWwsIHRhcmdldCwgY2hhbmdlRXZlbnQpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUNoYW5nZUxpc3RlbmVyIG1vZGVsQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVDaGFuZ2UoQ2hhbmdlRXZlbnQgY2hhbmdlRXZlbnQpIHsKLQkJCWlmICh1cGRhdGluZykKLQkJCQlyZXR1cm47Ci0JCQkvLyBUT0RPIHZhbGlkYXRpb24KLQkJCXVwZGF0ZSh0YXJnZXQsIG1vZGVsLCBjaGFuZ2VFdmVudCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBjb2xsZWN0aW9uIGZyb20gdGhlIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBuZWVkc1VwZGF0ZQotCSAqICAgICAgICAgICAgSVVwZGF0YWJsZSB0byBiZSB1cGRhdGVkCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZShJVXBkYXRhYmxlQ29sbGVjdGlvbiBuZWVkc1VwZGF0ZSwgSVVwZGF0YWJsZUNvbGxlY3Rpb24gc291cmNlLCBDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgcm93ID0gZXZlbnQuZ2V0UG9zaXRpb24oKTsKLQkJaWYgKHJvdyA9PSAtMSkgewotCQkJLy8gZnVsbCB1cGRhdGUKLQkJCWNvcHlDb250ZW50cyhuZWVkc1VwZGF0ZSwgc291cmNlKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWlmIChldmVudC5nZXRDaGFuZ2VUeXBlKCkgPT0gQ2hhbmdlRXZlbnQuQ0hBTkdFKQotCQkJCQluZWVkc1VwZGF0ZS5zZXRFbGVtZW50KHJvdywgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJZWxzZSBpZiAoZXZlbnQuZ2V0Q2hhbmdlVHlwZSgpID09IENoYW5nZUV2ZW50LkFERCkKLQkJCQkJbmVlZHNVcGRhdGUuYWRkRWxlbWVudChldmVudC5nZXROZXdWYWx1ZSgpLCByb3cpOwotCQkJCWVsc2UgaWYgKGV2ZW50LmdldENoYW5nZVR5cGUoKSA9PSBDaGFuZ2VFdmVudC5SRU1PVkUpCi0JCQkJCW5lZWRzVXBkYXRlLnJlbW92ZUVsZW1lbnQocm93KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgbW9kZWwncyBlbGVtZW50IGludG8gdGhlIHRhcmdldAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRhcmdldEZyb21Nb2RlbCgpIHsKLQkJY29weUNvbnRlbnRzKHRhcmdldCwgbW9kZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5Q29udGVudHMoSVVwZGF0YWJsZUNvbGxlY3Rpb24gZGVzdGluYXRpb24sCi0JCQlJVXBkYXRhYmxlQ29sbGVjdGlvbiBzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCS8vIFJlbW92ZSBvbGQsIGlmIGFueQotCQkJd2hpbGUgKGRlc3RpbmF0aW9uLmdldFNpemUoKSA+IDApCi0JCQkJZGVzdGluYXRpb24ucmVtb3ZlRWxlbWVudCgwKTsKLQotCQkJLy8gU2V0IHRoZSB0YXJnZXQgTGlzdCB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBNb2RlbCBMaXN0Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZS5nZXRTaXplKCk7IGkrKykgewotCQkJCS8vIFRPRE86IFNob3VsZG4ndCB0aGlzIGdvIHRocm91Z2ggdGhlIGNvbnZlcnRlcj8KLQkJCQlkZXN0aW5hdGlvbi5hZGRFbGVtZW50KHNvdXJjZS5nZXRFbGVtZW50KGkpLCBpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9EYXRhQmluZGluZ0NvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL0RhdGFCaW5kaW5nQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzc4ZDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL0RhdGFCaW5kaW5nQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZzsKLQotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQmluZFNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQmluZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JQmluZFNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSUJpbmRTdXBwb3J0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSURhdGFCaW5kaW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5OZXN0ZWRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5UcmVlTW9kZWxEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXIuSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJmdW5jdGlvbi5Db252ZXJzaW9uRnVuY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJzLkZ1bmN0aW9uYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVycy5JZGVudGl0eUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy51cGRhdGFibGVzLlNldHRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLlZhbGlkYXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgRGF0YUJpbmRpbmdDb250ZXh0IGltcGxlbWVudHMgSURhdGFCaW5kaW5nQ29udGV4dCB7Ci0KLQlwcml2YXRlIExpc3QgY3JlYXRlZFVwZGF0YWJsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIERhdGFCaW5kaW5nQ29udGV4dCBwYXJlbnQ7Ci0KLQlwcml2YXRlIExpc3QgcGFydGlhbFZhbGlkYXRpb25NZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTGlzdCB2YWxpZGF0aW9uTWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIFNldHRhYmxlVmFsdWUgcGFydGlhbFZhbGlkYXRpb25NZXNzYWdlID0gbmV3IFNldHRhYmxlVmFsdWUoCi0JCQlTdHJpbmcuY2xhc3MsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTZXR0YWJsZVZhbHVlIHZhbGlkYXRpb25NZXNzYWdlID0gbmV3IFNldHRhYmxlVmFsdWUoU3RyaW5nLmNsYXNzLAotCQkJIiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFNldHRhYmxlVmFsdWUgY29tYmluZWRWYWxpZGF0aW9uTWVzc2FnZSA9IG5ldyBTZXR0YWJsZVZhbHVlKAotCQkJU3RyaW5nLmNsYXNzLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIExpc3QgYmluZFN1cHBvcnRGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgaW50IHZhbGlkYXRpb25UaW1lOwotCi0JcHJvdGVjdGVkIGludCB1cGRhdGVUaW1lOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JRGF0YUJpbmRpbmdDb250ZXh0I2FkZEJpbmRTdXBwb3J0RmFjdG9yeShvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JQmluZFN1cHBvcnRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEJpbmRTdXBwb3J0RmFjdG9yeShJQmluZFN1cHBvcnRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJYmluZFN1cHBvcnRGYWN0b3JpZXMuYWRkKGZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEYXRhQmluZGluZ0NvbnRleHQoKSB7Ci0JCXJlZ2lzdGVyRmFjdG9yaWVzKCk7Ci0JCXJlZ2lzdGVyRGVmYXVsdEJpbmRTdXBwb3J0RmFjdG9yeSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSURhdGFCaW5kaW5nQ29udGV4dCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY3JlYXRlZFVwZGF0YWJsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSVVwZGF0YWJsZSB1cGRhdGFibGUgPSAoSVVwZGF0YWJsZSkgaXQubmV4dCgpOwotCQkJdXBkYXRhYmxlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSURhdGFCaW5kaW5nQ29udGV4dCNnZXRDb21iaW5lZFZhbGlkYXRpb25NZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVVwZGF0YWJsZVZhbHVlIGdldENvbWJpbmVkVmFsaWRhdGlvbk1lc3NhZ2UoKSB7Ci0JCXJldHVybiBjb21iaW5lZFZhbGlkYXRpb25NZXNzYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSURhdGFCaW5kaW5nQ29udGV4dCNnZXRQYXJ0aWFsVmFsaWRhdGlvbk1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBJVXBkYXRhYmxlVmFsdWUgZ2V0UGFydGlhbFZhbGlkYXRpb25NZXNzYWdlKCkgewotCQlyZXR1cm4gcGFydGlhbFZhbGlkYXRpb25NZXNzYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSURhdGFCaW5kaW5nQ29udGV4dCNnZXRWYWxpZGF0aW9uTWVzc2FnZSgpCi0JICovCi0JcHVibGljIElVcGRhdGFibGVWYWx1ZSBnZXRWYWxpZGF0aW9uTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHZhbGlkYXRpb25NZXNzYWdlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRGVmYXVsdEJpbmRTdXBwb3J0RmFjdG9yeSgpIHsKLQkJLy8gQWRkIHRoZSBkZWZhdWx0IGJpbmQgc3VwcG9ydCBmYWN0b3J5Ci0JCWFkZEJpbmRTdXBwb3J0RmFjdG9yeShuZXcgSUJpbmRTdXBwb3J0RmFjdG9yeSgpIHsKLQotCQkJcHVibGljIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKENsYXNzIGZyb21UeXBlLCBDbGFzcyB0b1R5cGUsCi0JCQkJCU9iamVjdCBtb2RlbERlc2NyaXB0aW9uKSB7Ci0JCQkJaWYgKGZyb21UeXBlID09IG51bGwgfHwgdG9UeXBlID09IG51bGwpIHsKLQkJCQkJLy8gU3lzdGVtLmVyci5wcmludGxuKCJGSVhNRTogQm9yaXMsIGlzIHRoaXMgYSBidWc/IEluCi0JCQkJCS8vIHJlZ2lzdGVyRGVmYXVsdEJpbmRTdXBwb3J0RmFjdG9yeS5hZGRCaW5kU3VwcG9ydEZhY3RvcnkuY3JlYXRlVmFsaWRhdG9yOgotCQkJCQkvLyBmcm9tVHlwZSBpcyBudWxsIG9yIHRvVHlwZSBpcyBudWxsISEhISEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyB0cnkgewotCQkJCQkvLyB0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBwcm9wZXIKLQkJCQkJLy8gSVZhbGlkYXRvci4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyB9IGNhdGNoIChCaW5kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJLy8gU3lzdGVtLmVyci5wcmludGxuKCk7Ci0JCQkJCS8vIH0KLQkJCQkJcmV0dXJuIG5ldyBJVmFsaWRhdG9yKCkgewotCi0JCQkJCQlwdWJsaWMgU3RyaW5nIGlzUGFydGlhbGx5VmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0KLQkJCQlJVmFsaWRhdG9yIGRhdGFUeXBlVmFsaWRhdG9yID0gVmFsaWRhdG9yUmVnaXN0cnkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0KGZyb21UeXBlLCB0b1R5cGUpOwotCQkJCWlmIChkYXRhVHlwZVZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKAotCQkJCQkJCSJObyBJVmFsaWRhdG9yIGlzIHJlZ2lzdGVyZWQgZm9yIGNvbnZlcnNpb25zIGZyb20gIiArIGZyb21UeXBlLmdldE5hbWUoKSArICIgdG8gIiArIHRvVHlwZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJcmV0dXJuIGRhdGFUeXBlVmFsaWRhdG9yOwotCQkJfQotCi0JCQlwdWJsaWMgSUNvbnZlcnRlciBjcmVhdGVDb252ZXJ0ZXIoQ2xhc3MgZnJvbVR5cGUsIENsYXNzIHRvVHlwZSwKLQkJCQkJT2JqZWN0IG1vZGVsRGVzY3JpcHRpb24pIHsKLQkJCQlpZiAodG9UeXBlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCWlmIChmcm9tVHlwZSA9PSB0b1R5cGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBJZGVudGl0eUNvbnZlcnRlcihmcm9tVHlwZSwgdG9UeXBlKTsKLQkJCQl9Ci0JCQkJaWYgKENvbnZlcnNpb25GdW5jdGlvblJlZ2lzdHJ5LmNhbkNvbnZlcnRQYWlyKGZyb21UeXBlLCB0b1R5cGUpKSB7Ci0JCQkJCXJldHVybiBuZXcgRnVuY3Rpb25hbENvbnZlcnRlcihmcm9tVHlwZSwgdG9UeXBlKTsKLQkJCQl9Ci0JCQkJLy8gRklYTUU6IGRqbyAtLSBUaGlzIGRvZXNuJ3QgYWx3YXlzIHdvcmsgaW4gdGhlIGNhc2Ugb2Ygb2JqZWN0Ci0JCQkJLy8gdHlwZXM/Ci0JCQkJaWYgKHRvVHlwZS5pc0Fzc2lnbmFibGVGcm9tKGZyb21UeXBlKQotCQkJCQkJfHwgZnJvbVR5cGUuaXNBc3NpZ25hYmxlRnJvbSh0b1R5cGUpKSB7Ci0JCQkJCXJldHVybiBuZXcgSWRlbnRpdHlDb252ZXJ0ZXIoZnJvbVR5cGUsIHRvVHlwZSk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckZhY3RvcmllcygpIHsKLQkJYWRkVXBkYXRhYmxlRmFjdG9yeShuZXcgSVVwZGF0YWJsZUZhY3RvcnkoKSB7Ci0JCQlwdWJsaWMgSVVwZGF0YWJsZSBjcmVhdGVVcGRhdGFibGUoTWFwIHByb3BlcnRpZXMsCi0JCQkJCU9iamVjdCBkZXNjcmlwdGlvbiwgSURhdGFCaW5kaW5nQ29udGV4dCBiaW5kaW5nQ29udGV4dCkgewotCQkJCWlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIFByb3BlcnR5KSB7Ci0JCQkJCVByb3BlcnR5IHByb3BlcnR5RGVzY3JpcHRpb24gPSAoUHJvcGVydHkpIGRlc2NyaXB0aW9uOwotCQkJCQlPYmplY3QgbyA9IHByb3BlcnR5RGVzY3JpcHRpb24uZ2V0T2JqZWN0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgSVVwZGF0YWJsZVZhbHVlKSB7Ci0JCQkJCQlJVXBkYXRhYmxlVmFsdWUgdXBkYXRhYmxlVmFsdWUgPSAoSVVwZGF0YWJsZVZhbHVlKSBvOwotCQkJCQkJQ2xhc3MgcHJvcGVydHlUeXBlID0gcHJvcGVydHlEZXNjcmlwdGlvbgotCQkJCQkJCQkuZ2V0UHJvcGVydHlUeXBlKCk7Ci0JCQkJCQlpZiAocHJvcGVydHlUeXBlID09IG51bGwpIHsKLQkJCQkJCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigKLQkJCQkJCQkJCSJNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IHR5cGUgZm9yIGJpbmRpbmcgdG8gYSBwcm9wZXJ0eSBvZiBhbiBJVXBkYXRhYmxlVmFsdWUuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCUJvb2xlYW4gaXNDb2xsZWN0aW9uUHJvcGVydHkgPSBwcm9wZXJ0eURlc2NyaXB0aW9uCi0JCQkJCQkJCS5pc0NvbGxlY3Rpb25Qcm9wZXJ0eSgpOwotCQkJCQkJaWYgKGlzQ29sbGVjdGlvblByb3BlcnR5ID09IG51bGwpIHsKLQkJCQkJCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigKLQkJCQkJCQkJCSJNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IGNvbGxlY3Rpb24gaW5mb3JtYXRpb24gZm9yIGJpbmRpbmcgdG8gYSBwcm9wZXJ0eSBvZiBhbiBJVXBkYXRhYmxlVmFsdWUuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCU9iamVjdCBwcm9wZXJ0eUlEID0gcHJvcGVydHlEZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eUlEKCk7Ci0JCQkJCQlpZiAoaXNDb2xsZWN0aW9uUHJvcGVydHkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQlyZXR1cm4gbmV3IE5lc3RlZFVwZGF0YWJsZUNvbGxlY3Rpb24oCi0JCQkJCQkJCQlEYXRhQmluZGluZ0NvbnRleHQudGhpcywgdXBkYXRhYmxlVmFsdWUsCi0JCQkJCQkJCQlwcm9wZXJ0eUlELCBwcm9wZXJ0eVR5cGUpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG5ldyBOZXN0ZWRVcGRhdGFibGVWYWx1ZSgKLQkJCQkJCQkJRGF0YUJpbmRpbmdDb250ZXh0LnRoaXMsIHVwZGF0YWJsZVZhbHVlLAotCQkJCQkJCQlwcm9wZXJ0eUlELCBwcm9wZXJ0eVR5cGUpOwotCQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCQlyZXR1cm4gbmV3IExpc3RVcGRhdGFibGVDb2xsZWN0aW9uKAotCQkJCQkJCQkoTGlzdCkgbywKLQkJCQkJCQkJcHJvcGVydHlEZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eVR5cGUoKSA9PSBudWxsID8gT2JqZWN0LmNsYXNzCi0JCQkJCQkJCQkJOiBwcm9wZXJ0eURlc2NyaXB0aW9uLmdldFByb3BlcnR5VHlwZSgpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBUcmVlTW9kZWxEZXNjcmlwdGlvbikgewotCQkJCQlUcmVlTW9kZWxEZXNjcmlwdGlvbiB0cmVlTW9kZWxEZXNjcmlwdGlvbiA9IChUcmVlTW9kZWxEZXNjcmlwdGlvbikgZGVzY3JpcHRpb247Ci0JCQkJCWlmICh0cmVlTW9kZWxEZXNjcmlwdGlvbi5nZXRSb290KCkgIT0gbnVsbCkgewotCQkJCQkJaWYgKHRyZWVNb2RlbERlc2NyaXB0aW9uLmdldFJvb3QoKSBpbnN0YW5jZW9mIElVcGRhdGFibGUpIHsKLQkJCQkJCQlpZiAodHJlZU1vZGVsRGVzY3JpcHRpb24uZ2V0Um9vdCgpIGluc3RhbmNlb2YgSVVwZGF0YWJsZVRyZWUpCi0JCQkJCQkJCXJldHVybiAoSVVwZGF0YWJsZVRyZWUpIHRyZWVNb2RlbERlc2NyaXB0aW9uCi0JCQkJCQkJCQkJLmdldFJvb3QoKTsKLQkJCQkJCQkvLyBOZXN0IHRoZSBUcmVlTW9kZWxEZXNjcmlwdGlvbidzIHJvb3QKLQkJCQkJCQlyZXR1cm4gbmV3IE5lc3RlZFVwZGF0YWJsZVRyZWUoCi0JCQkJCQkJCQlEYXRhQmluZGluZ0NvbnRleHQudGhpcywKLQkJCQkJCQkJCXRyZWVNb2RlbERlc2NyaXB0aW9uKTsKLQkJCQkJCX0gZWxzZSBpZiAodHJlZU1vZGVsRGVzY3JpcHRpb24uZ2V0Um9vdCgpIGluc3RhbmNlb2YgUHJvcGVydHkpIHsKLQkJCQkJCQkvLyBDcmVhdGUgYW4gVXBkYXRhYmxlIGZvciB0aGUKLQkJCQkJCQkvLyBUcmVlTW9kZWxEZXNjcmlwdGlvbidzIHJvb3QgZmlyc3QKLQkJCQkJCQlUcmVlTW9kZWxEZXNjcmlwdGlvbiBuZXdEZXNjcmlwdGlvbiA9IG5ldyBUcmVlTW9kZWxEZXNjcmlwdGlvbigKLQkJCQkJCQkJCURhdGFCaW5kaW5nQ29udGV4dC50aGlzCi0JCQkJCQkJCQkJCS5jcmVhdGVVcGRhdGFibGUodHJlZU1vZGVsRGVzY3JpcHRpb24KLQkJCQkJCQkJCQkJCQkuZ2V0Um9vdCgpKSk7Ci0JCQkJCQkJQ2xhc3NbXSB0eXBlcyA9IHRyZWVNb2RlbERlc2NyaXB0aW9uLmdldFR5cGVzKCk7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlTdHJpbmdbXSBwcm9wcyA9IHRyZWVNb2RlbERlc2NyaXB0aW9uCi0JCQkJCQkJCQkJLmdldENoaWxkcmVuUHJvcGVydGllcyh0eXBlc1tpXSk7Ci0JCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcHMubGVuZ3RoOyBqKyspCi0JCQkJCQkJCQluZXdEZXNjcmlwdGlvbi5hZGRDaGlsZHJlblByb3BlcnR5KAotCQkJCQkJCQkJCQl0eXBlc1tpXSwgcHJvcHNbal0pOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gRGF0YUJpbmRpbmdDb250ZXh0LnRoaXMKLQkJCQkJCQkJCS5jcmVhdGVVcGRhdGFibGUobmV3RGVzY3JpcHRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVZhbGlkYXRpb25MaXN0ZW5lckFuZE1lc3NhZ2UoTGlzdCBsaXN0T2ZQYWlycywKLQkJCU9iamVjdCBmaXJzdCkgewotCQlmb3IgKGludCBpID0gbGlzdE9mUGFpcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVBhaXIgcGFpciA9IChQYWlyKSBsaXN0T2ZQYWlycy5nZXQoaSk7Ci0JCQlpZiAocGFpci5hLmVxdWFscyhmaXJzdCkpIHsKLQkJCQlsaXN0T2ZQYWlycy5yZW1vdmUoaSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiBAcGFyYW0gcGFydGlhbFZhbGlkYXRpb25FcnJvck9yTnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVBhcnRpYWxWYWxpZGF0aW9uRXJyb3IoSUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyLAotCQkJU3RyaW5nIHBhcnRpYWxWYWxpZGF0aW9uRXJyb3JPck51bGwpIHsKLQkJcmVtb3ZlVmFsaWRhdGlvbkxpc3RlbmVyQW5kTWVzc2FnZShwYXJ0aWFsVmFsaWRhdGlvbk1lc3NhZ2VzLCBsaXN0ZW5lcik7Ci0JCWlmIChwYXJ0aWFsVmFsaWRhdGlvbkVycm9yT3JOdWxsICE9IG51bGwpIHsKLQkJCXBhcnRpYWxWYWxpZGF0aW9uTWVzc2FnZXMuYWRkKG5ldyBQYWlyKGxpc3RlbmVyLAotCQkJCQlwYXJ0aWFsVmFsaWRhdGlvbkVycm9yT3JOdWxsKSk7Ci0JCX0KLQkJdXBkYXRlVmFsaWRhdGlvbk1lc3NhZ2UoCi0JCQkJY29tYmluZWRWYWxpZGF0aW9uTWVzc2FnZSwKLQkJCQlwYXJ0aWFsVmFsaWRhdGlvbk1lc3NhZ2VzLnNpemUoKSA+IDAgPyBwYXJ0aWFsVmFsaWRhdGlvbk1lc3NhZ2VzCi0JCQkJCQk6IHZhbGlkYXRpb25NZXNzYWdlcyk7Ci0JCXVwZGF0ZVZhbGlkYXRpb25NZXNzYWdlKHBhcnRpYWxWYWxpZGF0aW9uTWVzc2FnZSwKLQkJCQlwYXJ0aWFsVmFsaWRhdGlvbk1lc3NhZ2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiBAcGFyYW0gdmFsaWRhdGlvbkVycm9yT3JOdWxsCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVmFsaWRhdGlvbkVycm9yKElDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciwKLQkJCVN0cmluZyB2YWxpZGF0aW9uRXJyb3JPck51bGwpIHsKLQkJcmVtb3ZlVmFsaWRhdGlvbkxpc3RlbmVyQW5kTWVzc2FnZSh2YWxpZGF0aW9uTWVzc2FnZXMsIGxpc3RlbmVyKTsKLQkJaWYgKHZhbGlkYXRpb25FcnJvck9yTnVsbCAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0aW9uTWVzc2FnZXMuYWRkKG5ldyBQYWlyKGxpc3RlbmVyLCB2YWxpZGF0aW9uRXJyb3JPck51bGwpKTsKLQkJfQotCQl1cGRhdGVWYWxpZGF0aW9uTWVzc2FnZSgKLQkJCQljb21iaW5lZFZhbGlkYXRpb25NZXNzYWdlLAotCQkJCXBhcnRpYWxWYWxpZGF0aW9uTWVzc2FnZXMuc2l6ZSgpID4gMCA/IHBhcnRpYWxWYWxpZGF0aW9uTWVzc2FnZXMKLQkJCQkJCTogdmFsaWRhdGlvbk1lc3NhZ2VzKTsKLQkJdXBkYXRlVmFsaWRhdGlvbk1lc3NhZ2UodmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkYXRpb25NZXNzYWdlcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVZhbGlkYXRpb25NZXNzYWdlKAotCQkJU2V0dGFibGVWYWx1ZSB2YWxpZGF0aW9uU2V0dGFibGVNZXNzYWdlLCBMaXN0IGxpc3RPZlBhaXJzKSB7Ci0JCWlmIChsaXN0T2ZQYWlycy5zaXplKCkgPT0gMCkgewotCQkJdmFsaWRhdGlvblNldHRhYmxlTWVzc2FnZS5zZXRWYWx1ZSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXZhbGlkYXRpb25TZXR0YWJsZU1lc3NhZ2Uuc2V0VmFsdWUoKChQYWlyKSBsaXN0T2ZQYWlycwotCQkJCQkuZ2V0KGxpc3RPZlBhaXJzLnNpemUoKSAtIDEpKS5iKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSURhdGFCaW5kaW5nQ29udGV4dCNiaW5kKG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGUsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSUJpbmRTcGVjKQotCSAqLwotCXB1YmxpYyB2b2lkIGJpbmQoSVVwZGF0YWJsZSB0YXJnZXRVcGRhdGFibGUsIElVcGRhdGFibGUgbW9kZWxVcGRhdGFibGUsCi0JCQlJQmluZFNwZWMgYmluZFNwZWMpIHsKLQkJQmluZGluZyBiaW5kaW5nOwotCQlpZiAoYmluZFNwZWMgPT0gbnVsbCkgewotCQkJYmluZFNwZWMgPSBuZXcgQmluZFNwZWMobnVsbCwgbnVsbCk7Ci0JCX0KLQkJaWYgKHRhcmdldFVwZGF0YWJsZSBpbnN0YW5jZW9mIElVcGRhdGFibGVWYWx1ZSkgewotCQkJaWYgKG1vZGVsVXBkYXRhYmxlIGluc3RhbmNlb2YgSVVwZGF0YWJsZVZhbHVlKSB7Ci0JCQkJSVVwZGF0YWJsZVZhbHVlIHRhcmdldCA9IChJVXBkYXRhYmxlVmFsdWUpIHRhcmdldFVwZGF0YWJsZTsKLQkJCQlJVXBkYXRhYmxlVmFsdWUgbW9kZWwgPSAoSVVwZGF0YWJsZVZhbHVlKSBtb2RlbFVwZGF0YWJsZTsKLQkJCQlmaWxsQmluZFNwZWNEZWZhdWx0cyhiaW5kU3BlYywgdGFyZ2V0LmdldFZhbHVlVHlwZSgpLCBtb2RlbAotCQkJCQkJLmdldFZhbHVlVHlwZSgpLCBudWxsKTsKLQkJCQliaW5kaW5nID0gbmV3IFZhbHVlQmluZGluZyh0aGlzLCB0YXJnZXQsIG1vZGVsLCBiaW5kU3BlYyk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKAotCQkJCQkJImluY29tcGF0aWJsZSB1cGRhdGFibGVzOiB0YXJnZXQgaXMgdmFsdWUsIG1vZGVsIGlzICIgKyBtb2RlbFVwZGF0YWJsZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIGlmICh0YXJnZXRVcGRhdGFibGUgaW5zdGFuY2VvZiBJVXBkYXRhYmxlQ29sbGVjdGlvbikgewotCQkJaWYgKG1vZGVsVXBkYXRhYmxlIGluc3RhbmNlb2YgSVVwZGF0YWJsZUNvbGxlY3Rpb24pIHsKLQkJCQlJVXBkYXRhYmxlQ29sbGVjdGlvbiB0YXJnZXQgPSAoSVVwZGF0YWJsZUNvbGxlY3Rpb24pIHRhcmdldFVwZGF0YWJsZTsKLQkJCQlJVXBkYXRhYmxlQ29sbGVjdGlvbiBtb2RlbCA9IChJVXBkYXRhYmxlQ29sbGVjdGlvbikgbW9kZWxVcGRhdGFibGU7Ci0JCQkJZmlsbEJpbmRTcGVjRGVmYXVsdHMoYmluZFNwZWMsIHRhcmdldC5nZXRFbGVtZW50VHlwZSgpLCBtb2RlbAotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCksIG51bGwpOwotCQkJCWJpbmRpbmcgPSBuZXcgQ29sbGVjdGlvbkJpbmRpbmcodGhpcywgdGFyZ2V0LCBtb2RlbCwgYmluZFNwZWMpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigKLQkJCQkJCSJpbmNvbXBhdGlibGUgdXBkYXRhYmxlczogdGFyZ2V0IGlzIGNvbGxlY3Rpb24sIG1vZGVsIGlzICIgKyBtb2RlbFVwZGF0YWJsZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIGlmICh0YXJnZXRVcGRhdGFibGUgaW5zdGFuY2VvZiBJVXBkYXRhYmxlVHJlZSkgewotCQkJaWYgKG1vZGVsVXBkYXRhYmxlIGluc3RhbmNlb2YgSVVwZGF0YWJsZVRyZWUpIHsKLQkJCQlJVXBkYXRhYmxlVHJlZSB0YXJnZXQgPSAoSVVwZGF0YWJsZVRyZWUpIHRhcmdldFVwZGF0YWJsZTsKLQkJCQlJVXBkYXRhYmxlVHJlZSBtb2RlbCA9IChJVXBkYXRhYmxlVHJlZSkgbW9kZWxVcGRhdGFibGU7Ci0JCQkJLy8gVHJlZSBiaW5kaW5ncyBkb2VzIG5vdCBwcm92aWRlIGNvbnZlcnNpb25zIGJldHdlZW4gbGV2ZWwKLQkJCQkvLyBlbGVtZW50cyAobm8gYmluZFNwZWMpCi0JCQkJYmluZGluZyA9IG5ldyBUcmVlQmluZGluZyh0aGlzLCB0YXJnZXQsIG1vZGVsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24oCi0JCQkJCQkiaW5jb21wYXRpYmxlIHVwZGF0YWJsZXM6IHRhcmdldCBpcyBjb2xsZWN0aW9uLCBtb2RlbCBpcyAiICsgbW9kZWxVcGRhdGFibGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKCJub3QgeWV0IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBESk86IEVhY2ggYmluZGVyIGlzIG5vdyByZXNwb25zaWJsZSBmb3IgYWRkaW5nIGl0cyBvd24gY2hhbmdlCi0JCS8vIGxpc3RlbmVycy4KLQkJLy8gdGFyZ2V0VXBkYXRhYmxlLmFkZENoYW5nZUxpc3RlbmVyKGJpbmRpbmcpOwotCQkvLyBtb2RlbFVwZGF0YWJsZS5hZGRDaGFuZ2VMaXN0ZW5lcihiaW5kaW5nKTsKLQkJYmluZGluZy51cGRhdGVUYXJnZXRGcm9tTW9kZWwoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklEYXRhQmluZGluZ0NvbnRleHQjYmluZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklCaW5kU3BlYykKLQkgKi8KLQlwdWJsaWMgdm9pZCBiaW5kKE9iamVjdCB0YXJnZXREZXNjcmlwdGlvbiwgSVVwZGF0YWJsZSBtb2RlbFVwZGF0YWJsZSwKLQkJCUlCaW5kU3BlYyBiaW5kU3BlYykgewotCQliaW5kKGNyZWF0ZVVwZGF0YWJsZSh0YXJnZXREZXNjcmlwdGlvbiksIG1vZGVsVXBkYXRhYmxlLCBiaW5kU3BlYyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JRGF0YUJpbmRpbmdDb250ZXh0I2JpbmQob3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZSwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklCaW5kU3BlYykKLQkgKi8KLQlwdWJsaWMgdm9pZCBiaW5kKElVcGRhdGFibGUgdGFyZ2V0VXBkYXRhYmxlLCBPYmplY3QgbW9kZWxEZXNjcmlwdGlvbiwKLQkJCUlCaW5kU3BlYyBiaW5kU3BlYykgewotCQlpZiAoYmluZFNwZWMgPT0gbnVsbCkgewotCQkJYmluZFNwZWMgPSBuZXcgQmluZFNwZWMobnVsbCwgbnVsbCk7Ci0JCX0KLQkJQ2xhc3MgZnJvbVR5cGUgPSBudWxsOwotCQlpZiAodGFyZ2V0VXBkYXRhYmxlIGluc3RhbmNlb2YgSVVwZGF0YWJsZVZhbHVlKSB7Ci0JCQlmcm9tVHlwZSA9ICgoSVVwZGF0YWJsZVZhbHVlKSB0YXJnZXRVcGRhdGFibGUpLmdldFZhbHVlVHlwZSgpOwotCQl9IGVsc2UgaWYgKHRhcmdldFVwZGF0YWJsZSBpbnN0YW5jZW9mIElVcGRhdGFibGVDb2xsZWN0aW9uKSB7Ci0JCQlmcm9tVHlwZSA9ICgoSVVwZGF0YWJsZUNvbGxlY3Rpb24pIHRhcmdldFVwZGF0YWJsZSkKLQkJCQkJLmdldEVsZW1lbnRUeXBlKCk7Ci0JCX0KLQkJZmlsbEJpbmRTcGVjRGVmYXVsdHMoYmluZFNwZWMsIGZyb21UeXBlLCBudWxsLCBtb2RlbERlc2NyaXB0aW9uKTsKLQkJYmluZCh0YXJnZXRVcGRhdGFibGUsIGNyZWF0ZVVwZGF0YWJsZShtb2RlbERlc2NyaXB0aW9uKSwgYmluZFNwZWMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbGxCaW5kU3BlY0RlZmF1bHRzKElCaW5kU3BlYyBiaW5kU3BlYywgQ2xhc3MgZnJvbVR5cGUsCi0JCQlDbGFzcyB0b1R5cGUsIE9iamVjdCBtb2RlbERlc2NyaXB0aW9uT3JOdWxsKSB7Ci0JCWlmIChiaW5kU3BlYy5nZXRWYWxpZGF0b3IoKSA9PSBudWxsKSB7Ci0JCQkoKEJpbmRTcGVjKSBiaW5kU3BlYykuc2V0VmFsaWRhdG9yKGNyZWF0ZVZhbGlkYXRvcihmcm9tVHlwZSwKLQkJCQkJdG9UeXBlLCBtb2RlbERlc2NyaXB0aW9uT3JOdWxsKSk7Ci0JCX0KLQkJaWYgKGJpbmRTcGVjLmdldENvbnZlcnRlcigpID09IG51bGwpIHsKLQkJCSgoQmluZFNwZWMpIGJpbmRTcGVjKS5zZXRDb252ZXJ0ZXIoY3JlYXRlQ29udmVydGVyKGZyb21UeXBlLAotCQkJCQl0b1R5cGUsIG1vZGVsRGVzY3JpcHRpb25Pck51bGwpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihDbGFzcyBmcm9tVHlwZSwgQ2xhc3MgdG9UeXBlLAotCQkJT2JqZWN0IG1vZGVsRGVzY3JpcHRpb24pIHsKLQkJZm9yIChpbnQgaSA9IGJpbmRTdXBwb3J0RmFjdG9yaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlJQmluZFN1cHBvcnRGYWN0b3J5IGJpbmRTdXBwb3J0RmFjdG9yeSA9IChJQmluZFN1cHBvcnRGYWN0b3J5KSBiaW5kU3VwcG9ydEZhY3RvcmllcwotCQkJCQkuZ2V0KGkpOwotCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBiaW5kU3VwcG9ydEZhY3RvcnkuY3JlYXRlVmFsaWRhdG9yKGZyb21UeXBlLAotCQkJCQl0b1R5cGUsIG1vZGVsRGVzY3JpcHRpb24pOwotCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHZhbGlkYXRvcjsKLQkJCX0KLQkJfQotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQuY3JlYXRlVmFsaWRhdG9yKGZyb21UeXBlLCB0b1R5cGUsIG1vZGVsRGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ29udmVydGVyIGNyZWF0ZUNvbnZlcnRlcihDbGFzcyBmcm9tVHlwZSwgQ2xhc3MgdG9UeXBlLAotCQkJT2JqZWN0IG1vZGVsRGVzY3JpcHRpb24pIHsKLQkJZm9yIChpbnQgaSA9IGJpbmRTdXBwb3J0RmFjdG9yaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlJQmluZFN1cHBvcnRGYWN0b3J5IGJpbmRTdXBwb3J0RmFjdG9yeSA9IChJQmluZFN1cHBvcnRGYWN0b3J5KSBiaW5kU3VwcG9ydEZhY3RvcmllcwotCQkJCQkuZ2V0KGkpOwotCQkJSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiaW5kU3VwcG9ydEZhY3RvcnkuY3JlYXRlQ29udmVydGVyKGZyb21UeXBlLAotCQkJCQl0b1R5cGUsIG1vZGVsRGVzY3JpcHRpb24pOwotCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcjsKLQkJCX0KLQkJfQotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQuY3JlYXRlQ29udmVydGVyKGZyb21UeXBlLCB0b1R5cGUsIG1vZGVsRGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSURhdGFCaW5kaW5nQ29udGV4dCNiaW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JQmluZFNwZWMpCi0JICovCi0JcHVibGljIHZvaWQgYmluZChPYmplY3QgdGFyZ2V0RGVzY3JpcHRpb24sIE9iamVjdCBtb2RlbERlc2NyaXB0aW9uLAotCQkJSUJpbmRTcGVjIGJpbmRTcGVjKSB7Ci0JCWJpbmQoY3JlYXRlVXBkYXRhYmxlKHRhcmdldERlc2NyaXB0aW9uKSwgbW9kZWxEZXNjcmlwdGlvbiwgYmluZFNwZWMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSURhdGFCaW5kaW5nQ29udGV4dCNjcmVhdGVVcGRhdGFibGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVVwZGF0YWJsZSBjcmVhdGVVcGRhdGFibGUoT2JqZWN0IGRlc2NyaXB0aW9uKSB7Ci0JCUlVcGRhdGFibGUgdXBkYXRhYmxlID0gZG9DcmVhdGVVcGRhdGFibGUoZGVzY3JpcHRpb24sIHRoaXMpOwotCQlpZiAodXBkYXRhYmxlICE9IG51bGwpIHsKLQkJCWNyZWF0ZWRVcGRhdGFibGVzLmFkZCh1cGRhdGFibGUpOwotCQl9Ci0JCXJldHVybiB1cGRhdGFibGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JRGF0YUJpbmRpbmdDb250ZXh0I2NyZWF0ZU5lc3RlZFVwZGF0YWJsZShvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5OZXN0ZWRQcm9wZXJ0eSkKLQkgKi8KLQlwdWJsaWMgSVVwZGF0YWJsZSBjcmVhdGVOZXN0ZWRVcGRhdGFibGUoTmVzdGVkUHJvcGVydHkgbmVzdGVkUHJvcGVydHkpIHsKLQkJSVVwZGF0YWJsZSBsYXN0Q2hpbGRVcGRhdGFibGUgPSBudWxsOwotCQlPYmplY3QgdGFyZ2V0T2JqZWN0ID0gbmVzdGVkUHJvcGVydHkuZ2V0T2JqZWN0KCk7Ci0JCWlmIChuZXN0ZWRQcm9wZXJ0eS5nZXRQcm90b3R5cGVDbGFzcygpICE9IG51bGwpIHsKLQkJCUNsYXNzIHRhcmdldENsYXp6ID0gbmVzdGVkUHJvcGVydHkuZ2V0UHJvdG90eXBlQ2xhc3MoKTsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKChTdHJpbmcpIG5lc3RlZFByb3BlcnR5LmdldFByb3BlcnR5SUQoKSwgIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBuZXh0RGVzYyA9IChTdHJpbmcpIHRva2VuaXplci5uZXh0RWxlbWVudCgpOwotCQkJCXRyeSB7Ci0JCQkJCUJlYW5JbmZvIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKHRhcmdldENsYXp6KTsKLQkJCQkJUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydHlEZXNjcmlwdG9ycyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJCQkJQ2xhc3MgZGlzY292ZXJlZENsYXp6ID0gbnVsbDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHByb3BlcnR5RGVzY3JpcHRvcnNbaV07Ci0JCQkJCQlpZiAoZGVzY3JpcHRvci5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCQluZXh0RGVzYykpIHsKLQkJCQkJCQlkaXNjb3ZlcmVkQ2xhenogPSBkZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChkaXNjb3ZlcmVkQ2xhenogIT0gbnVsbCkgewotCQkJCQkJdGFyZ2V0Q2xhenogPSBkaXNjb3ZlcmVkQ2xheno7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigiRXJyb3IgdXNpbmcgcHJvdG90eXBlIGNsYXNzIHRvIGRldGVybWluZSBiaW5kaW5nIHR5cGVzLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9IGNhdGNoIChCaW5kaW5nRXhjZXB0aW9uIGJlKSB7Ci0JCQkJCXRocm93IGJlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKCJFeGVjZXB0aW9uIHVzaW5nIHByb3RvdHlwZSBjbGFzcyB0byBkZXRlcm1pbmUgYmluZGluZyB0eXBlcy4iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlsYXN0Q2hpbGRVcGRhdGFibGUgPSBjcmVhdGVVcGRhdGFibGUobmV3IFByb3BlcnR5KHRhcmdldE9iamVjdCwKLQkJCQkJCW5leHREZXNjLCB0YXJnZXRDbGF6eiwgbmV3IEJvb2xlYW4oZmFsc2UpKSk7Ci0JCQkJdGFyZ2V0T2JqZWN0ID0gbGFzdENoaWxkVXBkYXRhYmxlOwotCQkJfQotCi0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdbXSBwcm9wZXJ0aWVzID0gKFN0cmluZ1tdKSBuZXN0ZWRQcm9wZXJ0eS5nZXRQcm9wZXJ0eUlEKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmV4dERlc2MgPSBwcm9wZXJ0aWVzW2ldOwotCQkJCUNsYXNzIGNsYXp6ID0gbmVzdGVkUHJvcGVydHkuZ2V0VHlwZXMoKVtpXTsKLQkJCQlsYXN0Q2hpbGRVcGRhdGFibGUgPSBjcmVhdGVVcGRhdGFibGUobmV3IFByb3BlcnR5KHRhcmdldE9iamVjdCwKLQkJCQkJCW5leHREZXNjLCBjbGF6eiwgbmV3IEJvb2xlYW4oZmFsc2UpKSk7Ci0JCQkJdGFyZ2V0T2JqZWN0ID0gbGFzdENoaWxkVXBkYXRhYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBsYXN0Q2hpbGRVcGRhdGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIElVcGRhdGFibGUgZG9DcmVhdGVVcGRhdGFibGUoT2JqZWN0IGRlc2NyaXB0aW9uLAotCQkJRGF0YUJpbmRpbmdDb250ZXh0IHRoaXNEYXRhYmluZGluZ0NvbnRleHQpIHsKLQkJZm9yIChpbnQgaSA9IGZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJSVVwZGF0YWJsZUZhY3RvcnkgZmFjdG9yeSA9IChJVXBkYXRhYmxlRmFjdG9yeSkgZmFjdG9yaWVzLmdldChpKTsKLQkJCUlVcGRhdGFibGUgcmVzdWx0ID0gZmFjdG9yeS5jcmVhdGVVcGRhdGFibGUobnVsbCwgZGVzY3JpcHRpb24sCi0JCQkJCXRoaXNEYXRhYmluZGluZ0NvbnRleHQpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQKLQkJCQkJLmRvQ3JlYXRlVXBkYXRhYmxlKGRlc2NyaXB0aW9uLCB0aGlzRGF0YWJpbmRpbmdDb250ZXh0KTsKLQkJfQotCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigiY291bGQgbm90IGZpbmQgdXBkYXRhYmxlIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklEYXRhQmluZGluZ0NvbnRleHQjYWRkVXBkYXRhYmxlRmFjdG9yeShvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRVcGRhdGFibGVGYWN0b3J5KElVcGRhdGFibGVGYWN0b3J5IHVwZGF0YWJsZUZhY3RvcnkpIHsKLQkJLy8gVE9ETzogY29uc2lkZXIgdGhlIGZhY3QgdGhhdCBhZGRpbmcgbmV3IGZhY3RvcmllcyBmb3IgYSBnaXZlbgotCQkvLyBkZXNjcmlwdGlvbgotCQkvLyBtYXkgaGlkZSBkZWZhdWx0IG9uZXMgKGUuZy4sIGEgbmV3IFByb3BlcnR5RGVzY3JpcHRvciBtYXkgb3ZlcmlkZSB0aGUKLQkJLy8gb25kIGZvciBFTUYpCi0JCWZhY3Rvcmllcy5hZGQodXBkYXRhYmxlRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlVGFyZ2V0cygpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgInVwZGF0ZVRhcmdldHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlTW9kZWxzKCkgewotCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAidXBkYXRlTW9kZWxzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvTGlzdFVwZGF0YWJsZUNvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL0xpc3RVcGRhdGFibGVDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDIxZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvTGlzdFVwZGF0YWJsZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuVXBkYXRhYmxlOwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0VXBkYXRhYmxlQ29sbGVjdGlvbiBleHRlbmRzIFVwZGF0YWJsZSBpbXBsZW1lbnRzCi0JCUlVcGRhdGFibGVDb2xsZWN0aW9uIHsKLQotCXByaXZhdGUgZmluYWwgTGlzdCBlbGVtZW50czsKLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZzsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBlbGVtZW50VHlwZQotCSAqLwotCXB1YmxpYyBMaXN0VXBkYXRhYmxlQ29sbGVjdGlvbihMaXN0IGVsZW1lbnRzLCBDbGFzcyBlbGVtZW50VHlwZSkgewotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JfQotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gZWxlbWVudHMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgYWRkRWxlbWVudChPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQl1cGRhdGluZyA9IHRydWU7Ci0JCXRyeSB7Ci0JCQllbGVtZW50cy5hZGQoaW5kZXgsIHZhbHVlKTsKLQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5BREQsIG51bGwsIHZhbHVlLCBpbmRleCk7Ci0JCQlyZXR1cm4gaW5kZXg7Ci0JCX0gZmluYWxseSB7Ci0JCQl1cGRhdGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJdXBkYXRpbmcgPSB0cnVlOwotCQl0cnkgewotCQkJT2JqZWN0IG9sZFZhbHVlID0gZWxlbWVudHMucmVtb3ZlKGluZGV4KTsKLQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5SRU1PVkUsIG9sZFZhbHVlLCBudWxsLCBpbmRleCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl1cGRhdGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSkgewotCQl1cGRhdGluZyA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2xkVmFsdWUgPSBlbGVtZW50cy5zZXQoaW5kZXgsIHZhbHVlKTsKLQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5DSEFOR0UsIG9sZFZhbHVlLCB2YWx1ZSwgaW5kZXgpOwotCQl9IGZpbmFsbHkgewotCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGVsZW1lbnRzLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldEVsZW1lbnRUeXBlKCkgewotCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvTmVzdGVkVXBkYXRhYmxlQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvTmVzdGVkVXBkYXRhYmxlQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2YyZjQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL05lc3RlZFVwZGF0YWJsZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSURhdGFCaW5kaW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuVXBkYXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkVXBkYXRhYmxlQ29sbGVjdGlvbiBleHRlbmRzIFVwZGF0YWJsZSBpbXBsZW1lbnRzCi0JCUlVcGRhdGFibGVDb2xsZWN0aW9uIHsKLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJQ2hhbmdlTGlzdGVuZXIgaW5uZXJDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUNoYW5nZShDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudCkgewotCQkJaWYgKCF1cGRhdGluZykgewotCQkJCUNoYW5nZUV2ZW50IG5lc3RlZEV2ZW50ID0gZmlyZUNoYW5nZUV2ZW50KGNoYW5nZUV2ZW50LmdldENoYW5nZVR5cGUoKSwgY2hhbmdlRXZlbnQKLQkJCQkJCS5nZXRPbGRWYWx1ZSgpLCBjaGFuZ2VFdmVudC5nZXROZXdWYWx1ZSgpLCBjaGFuZ2VFdmVudC5nZXRQYXJlbnQoKSwgY2hhbmdlRXZlbnQuZ2V0UG9zaXRpb24oKSk7Ci0JCQkJaWYobmVzdGVkRXZlbnQuZ2V0VmV0bygpKSB7Ci0JCQkJCWNoYW5nZUV2ZW50LnNldFZldG8odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgT2JqZWN0IGN1cnJlbnRPdXRlclZhbHVlOwotCi0JcHJpdmF0ZSBPYmplY3QgZmVhdHVyZTsKLQotCXByaXZhdGUgSVVwZGF0YWJsZUNvbGxlY3Rpb24gaW5uZXJVcGRhdGFibGVDb2xsZWN0aW9uOwotCi0JcHJpdmF0ZSBJRGF0YUJpbmRpbmdDb250ZXh0IGRhdGFiaW5kaW5nQ29udGV4dDsKLQotCXByaXZhdGUgQ2xhc3MgZWxlbWVudFR5cGU7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGF0YWJpbmRpbmdDb250ZXh0Ci0JICogQHBhcmFtIG91dGVyVXBkYXRhYmxlVmFsdWUKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50VHlwZSAKLQkgKi8KLQlwdWJsaWMgTmVzdGVkVXBkYXRhYmxlQ29sbGVjdGlvbihJRGF0YUJpbmRpbmdDb250ZXh0IGRhdGFiaW5kaW5nQ29udGV4dCwKLQkJCWZpbmFsIElVcGRhdGFibGVWYWx1ZSBvdXRlclVwZGF0YWJsZVZhbHVlLCBPYmplY3QgZmVhdHVyZSwKLQkJCUNsYXNzIGVsZW1lbnRUeXBlKSB7Ci0JCXRoaXMuZGF0YWJpbmRpbmdDb250ZXh0ID0gZGF0YWJpbmRpbmdDb250ZXh0OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7Ci0JCXVwZGF0ZUlubmVyVXBkYXRhYmxlVmFsdWUob3V0ZXJVcGRhdGFibGVWYWx1ZSk7Ci0JCUlDaGFuZ2VMaXN0ZW5lciBvdXRlckNoYW5nZUxpc3RlbmVyID0gbmV3IElDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNoYW5nZShDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudCkgewotCQkJCXVwZGF0ZUlubmVyVXBkYXRhYmxlVmFsdWUob3V0ZXJVcGRhdGFibGVWYWx1ZSk7Ci0JCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JCW91dGVyVXBkYXRhYmxlVmFsdWUuYWRkQ2hhbmdlTGlzdGVuZXIob3V0ZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUlubmVyVXBkYXRhYmxlVmFsdWUoSVVwZGF0YWJsZVZhbHVlIG91dGVyVXBkYXRhYmxlVmFsdWUpIHsKLQkJY3VycmVudE91dGVyVmFsdWUgPSBvdXRlclVwZGF0YWJsZVZhbHVlLmdldFZhbHVlKCk7Ci0JCWlmIChpbm5lclVwZGF0YWJsZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotCQkJaW5uZXJVcGRhdGFibGVDb2xsZWN0aW9uLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGlubmVyQ2hhbmdlTGlzdGVuZXIpOwotCQkJaW5uZXJVcGRhdGFibGVDb2xsZWN0aW9uLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY3VycmVudE91dGVyVmFsdWUgPT0gbnVsbCkgewotCQkJaW5uZXJVcGRhdGFibGVDb2xsZWN0aW9uID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuaW5uZXJVcGRhdGFibGVDb2xsZWN0aW9uID0gKElVcGRhdGFibGVDb2xsZWN0aW9uKSBkYXRhYmluZGluZ0NvbnRleHQKLQkJCQkJLmNyZWF0ZVVwZGF0YWJsZShuZXcgUHJvcGVydHkoCi0JCQkJCQkJY3VycmVudE91dGVyVmFsdWUsIGZlYXR1cmUsIGVsZW1lbnRUeXBlLCBCb29sZWFuLlRSVUUpKTsKLQkJCUNsYXNzIGlubmVyRWxlbWVudFR5cGUgPSBpbm5lclVwZGF0YWJsZUNvbGxlY3Rpb24KLQkJCQkJLmdldEVsZW1lbnRUeXBlKCk7Ci0JCQlpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkgewotCQkJCWVsZW1lbnRUeXBlID0gaW5uZXJFbGVtZW50VHlwZTsKLQkJCX0gZWxzZSB7Ci0JCQkJQXNzZXJ0LmlzVHJ1ZShlbGVtZW50VHlwZS5lcXVhbHMoaW5uZXJFbGVtZW50VHlwZSksICJDYW5ub3QgY2hhbmdlIGVsZW1lbnQgdHlwZSBpbiBhIG5lc3RlZCB1cGRhdGFibGUgY29sbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IAotCQkJaW5uZXJVcGRhdGFibGVDb2xsZWN0aW9uLmFkZENoYW5nZUxpc3RlbmVyKGlubmVyQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLy8gcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JLy8gaW5uZXJVcGRhdGFibGVWYWx1ZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JLy8gfQotCS8vCi0JLy8gcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkvLyByZXR1cm4gaW5uZXJVcGRhdGFibGVWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGlubmVyVXBkYXRhYmxlVmFsdWUKLQkvLyAuZ2V0VmFsdWUoKTsKLQkvLyB9Ci0JLy8KLQkvLyBwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlKCkgewotCS8vIHJldHVybiBmZWF0dXJlVHlwZTsKLQkvLyB9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChpbm5lclVwZGF0YWJsZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotCQkJaW5uZXJVcGRhdGFibGVDb2xsZWN0aW9uLmRpc3Bvc2UoKTsKLQkJfQotCQljdXJyZW50T3V0ZXJWYWx1ZSA9IG51bGw7Ci0JCWRhdGFiaW5kaW5nQ29udGV4dCA9IG51bGw7Ci0JCWZlYXR1cmUgPSBudWxsOwotCQlpbm5lclVwZGF0YWJsZUNvbGxlY3Rpb24gPSBudWxsOwotCQlpbm5lckNoYW5nZUxpc3RlbmVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiBpbm5lclVwZGF0YWJsZUNvbGxlY3Rpb24gPT0gbnVsbCA/IDAgOiBpbm5lclVwZGF0YWJsZUNvbGxlY3Rpb24KLQkJCQkuZ2V0U2l6ZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgYWRkRWxlbWVudChPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlyZXR1cm4gaW5uZXJVcGRhdGFibGVDb2xsZWN0aW9uLmFkZEVsZW1lbnQodmFsdWUsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50KGludCBpbmRleCkgewotCQlpbm5lclVwZGF0YWJsZUNvbGxlY3Rpb24ucmVtb3ZlRWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSkgewotCQlpbm5lclVwZGF0YWJsZUNvbGxlY3Rpb24uc2V0RWxlbWVudChpbmRleCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGlubmVyVXBkYXRhYmxlQ29sbGVjdGlvbi5nZXRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0RWxlbWVudFR5cGUoKSB7Ci0JCXJldHVybiBlbGVtZW50VHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL05lc3RlZFVwZGF0YWJsZVRyZWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL05lc3RlZFVwZGF0YWJsZVRyZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxNWIyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9OZXN0ZWRVcGRhdGFibGVUcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklEYXRhQmluZGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuVHJlZU1vZGVsRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuVXBkYXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRVcGRhdGFibGVUcmVlIGV4dGVuZHMgVXBkYXRhYmxlIGltcGxlbWVudHMgSVVwZGF0YWJsZVRyZWUgewotCQotCXByaXZhdGUgSURhdGFCaW5kaW5nQ29udGV4dCAgZGF0YWJpbmRpbmdDb250ZXh0OwotCXByaXZhdGUgVHJlZU1vZGVsRGVzY3JpcHRpb24gb3JpZ2luYWxEZXNjcmlwdGlvbjsKLQkKLQlwcml2YXRlIElVcGRhdGFibGVUcmVlIGlubmVyVXBkYXRhYmxlVHJlZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRpbmcgPSBmYWxzZTsKLQkKLQlwcml2YXRlIElDaGFuZ2VMaXN0ZW5lciBpbm5lckNoYW5nZUxpc3RlbmVyID0gbmV3IElDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlQ2hhbmdlKENoYW5nZUV2ZW50IGNoYW5nZUV2ZW50KSB7Ci0JCQlpZiAoIXVwZGF0aW5nKSB7Ci0JCQkJQ2hhbmdlRXZlbnQgbmVzdGVkRXZlbnQgPSBmaXJlQ2hhbmdlRXZlbnQoY2hhbmdlRXZlbnQuZ2V0Q2hhbmdlVHlwZSgpLCBjaGFuZ2VFdmVudAotCQkJCQkJLmdldE9sZFZhbHVlKCksIGNoYW5nZUV2ZW50LmdldE5ld1ZhbHVlKCksIGNoYW5nZUV2ZW50LmdldFBhcmVudCgpLCBjaGFuZ2VFdmVudC5nZXRQb3NpdGlvbigpKTsKLQkJCQlpZihuZXN0ZWRFdmVudC5nZXRWZXRvKCkpIHsKLQkJCQkJY2hhbmdlRXZlbnQuc2V0VmV0byh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCQotCi0JLyoqCi0JICogQHBhcmFtIGRhdGFiaW5kaW5nQ29udGV4dAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBOZXN0ZWRVcGRhdGFibGVUcmVlKElEYXRhQmluZGluZ0NvbnRleHQgZGF0YWJpbmRpbmdDb250ZXh0LCBUcmVlTW9kZWxEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRhdGFiaW5kaW5nQ29udGV4dD1kYXRhYmluZGluZ0NvbnRleHQ7Ci0JCXRoaXMub3JpZ2luYWxEZXNjcmlwdGlvbj1kZXNjcmlwdGlvbjsJCi0JCUFzc2VydC5pc1RydWUoZGVzY3JpcHRpb24uZ2V0Um9vdCgpIGluc3RhbmNlb2YgSVVwZGF0YWJsZSk7Ci0JCQotCQlmaW5hbCBJVXBkYXRhYmxlIG91dGVyVXBkYXRhYmxlVmFsdWUgPSAoSVVwZGF0YWJsZSkgZGVzY3JpcHRpb24uZ2V0Um9vdCgpOwkJCi0JCXVwZGF0ZUlubmVyVXBkYXRhYmxlVmFsdWUob3V0ZXJVcGRhdGFibGVWYWx1ZSk7Ci0JCUlDaGFuZ2VMaXN0ZW5lciBvdXRlckNoYW5nZUxpc3RlbmVyID0gbmV3IElDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNoYW5nZShDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudCkgewotCQkJCU9iamVjdFtdIG9sZCA9IGdldEVsZW1lbnRzKG51bGwpOwotCQkJCXVwZGF0ZUlubmVyVXBkYXRhYmxlVmFsdWUob3V0ZXJVcGRhdGFibGVWYWx1ZSk7CQkJCQotCQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5SRVBMQUNFLCBvbGQsIGdldEVsZW1lbnRzKG51bGwpLCBudWxsLCAtMSk7IAotCQkJfQotCQl9OwotCQlvdXRlclVwZGF0YWJsZVZhbHVlLmFkZENoYW5nZUxpc3RlbmVyKG91dGVyQ2hhbmdlTGlzdGVuZXIpOwotCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlSW5uZXJVcGRhdGFibGVWYWx1ZShJVXBkYXRhYmxlIG91dGVyVXBkYXRhYmxlVmFsdWUpIHsKLQkJCi0JCXVwZGF0aW5nPXRydWU7Ci0JCXRyeSB7Ci0JCQlpZiAoaW5uZXJVcGRhdGFibGVUcmVlICE9IG51bGwpIHsKLQkJCQlpbm5lclVwZGF0YWJsZVRyZWUucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoaW5uZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JCQkJaW5uZXJVcGRhdGFibGVUcmVlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCQotCQkJT2JqZWN0IGN1cnJlbnRPdXRlclZhbHVlOwotCQkJaWYgKG91dGVyVXBkYXRhYmxlVmFsdWUgaW5zdGFuY2VvZiBJVXBkYXRhYmxlVmFsdWUpCi0JCQkJY3VycmVudE91dGVyVmFsdWUgPSAoKElVcGRhdGFibGVWYWx1ZSlvdXRlclVwZGF0YWJsZVZhbHVlKS5nZXRWYWx1ZSgpOwotCQkJZWxzZSB7Ci0JCQkJSVVwZGF0YWJsZUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChJVXBkYXRhYmxlQ29sbGVjdGlvbilvdXRlclVwZGF0YWJsZVZhbHVlOwotCQkJCU9iamVjdFtdIGVsZW1lbnRzID0gbmV3IE9iamVjdFtjb2xsZWN0aW9uLmdldFNpemUoKV07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgCi0JCQkJCWVsZW1lbnRzW2ldPWNvbGxlY3Rpb24uZ2V0RWxlbWVudChpKTsKLQkJCQljdXJyZW50T3V0ZXJWYWx1ZT1lbGVtZW50czsJCQkJCQotCQkJfQotCQkJLy8gQ29uc3RydWN0IGEgbmV3IGRlc2NyaXB0aW9uCi0JCQlUcmVlTW9kZWxEZXNjcmlwdGlvbiBuZXdEZXNjcmlwdG9yID0gbmV3IFRyZWVNb2RlbERlc2NyaXB0aW9uKGN1cnJlbnRPdXRlclZhbHVlKTsKLQkJCUNsYXNzW10gdHlwZXMgPSBvcmlnaW5hbERlc2NyaXB0aW9uLmdldFR5cGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nW10gcHJvcGVydGllcyA9IG9yaWdpbmFsRGVzY3JpcHRpb24uZ2V0Q2hpbGRyZW5Qcm9wZXJ0aWVzKHR5cGVzW2ldKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHByb3BlcnRpZXMubGVuZ3RoOyBqKyspIAotCQkJCQluZXdEZXNjcmlwdG9yLmFkZENoaWxkcmVuUHJvcGVydHkodHlwZXNbaV0sIHByb3BlcnRpZXNbal0pOwotCQkJfQkJCQkJCQkgICAgCi0JCQlpbm5lclVwZGF0YWJsZVRyZWUgPSAoSVVwZGF0YWJsZVRyZWUpIGRhdGFiaW5kaW5nQ29udGV4dC5jcmVhdGVVcGRhdGFibGUobmV3RGVzY3JpcHRvcik7Ci0JCQlpbm5lclVwZGF0YWJsZVRyZWUuYWRkQ2hhbmdlTGlzdGVuZXIoaW5uZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl1cGRhdGluZz1mYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgYWRkRWxlbWVudChPYmplY3QgcGFyZW50RWxlbWVudCwgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGlubmVyVXBkYXRhYmxlVHJlZS5hZGRFbGVtZW50KHBhcmVudEVsZW1lbnQsIGluZGV4LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudChPYmplY3QgcGFyZW50RWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCWlubmVyVXBkYXRhYmxlVHJlZS5yZW1vdmVFbGVtZW50KHBhcmVudEVsZW1lbnQsIGluZGV4KTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChPYmplY3QgcGFyZW50RWxlbWVudCwgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKLQkJaW5uZXJVcGRhdGFibGVUcmVlLnNldEVsZW1lbnQocGFyZW50RWxlbWVudCwgaW5kZXgsIHZhbHVlKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRzKE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJaW5uZXJVcGRhdGFibGVUcmVlLnNldEVsZW1lbnRzKHBhcmVudEVsZW1lbnQsIHZhbHVlcyk7CQkKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnQoT2JqZWN0IHBhcmVudEVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gaW5uZXJVcGRhdGFibGVUcmVlLmdldEVsZW1lbnQocGFyZW50RWxlbWVudCwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gaW5uZXJVcGRhdGFibGVUcmVlLmdldEVsZW1lbnRzKHBhcmVudEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldFR5cGVzKCkgewotCQlyZXR1cm4gaW5uZXJVcGRhdGFibGVUcmVlLmdldFR5cGVzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9OZXN0ZWRVcGRhdGFibGVWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvTmVzdGVkVXBkYXRhYmxlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3OTFiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9OZXN0ZWRVcGRhdGFibGVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JRGF0YUJpbmRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5VcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5lc3RlZFVwZGF0YWJsZVZhbHVlIGV4dGVuZHMgVXBkYXRhYmxlVmFsdWUgewotCQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZz1mYWxzZTsKLQotCXByaXZhdGUgSUNoYW5nZUxpc3RlbmVyIGlubmVyQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVDaGFuZ2UoQ2hhbmdlRXZlbnQgY2hhbmdlRXZlbnQpIHsKLQkJCWlmICghdXBkYXRpbmcpIHsKLQkJCQlmaXJlQ2hhbmdlRXZlbnQoY2hhbmdlRXZlbnQuZ2V0Q2hhbmdlVHlwZSgpLCBjaGFuZ2VFdmVudAotCQkJCQkJLmdldE9sZFZhbHVlKCksIGNoYW5nZUV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgT2JqZWN0IGN1cnJlbnRPdXRlclZhbHVlOwotCi0JcHJpdmF0ZSBPYmplY3QgZmVhdHVyZTsKLQotCXByaXZhdGUgSVVwZGF0YWJsZVZhbHVlIGlubmVyVXBkYXRhYmxlVmFsdWU7Ci0KLQlwcml2YXRlIElEYXRhQmluZGluZ0NvbnRleHQgZGF0YWJpbmRpbmdDb250ZXh0OwotCi0JcHJpdmF0ZSBDbGFzcyBmZWF0dXJlVHlwZTsKLQotCXByaXZhdGUgSVVwZGF0YWJsZVZhbHVlIG91dGVyVXBkYXRhYmxlVmFsdWU7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGF0YWJpbmRpbmdDb250ZXh0Ci0JICogQHBhcmFtIG91dGVyVXBkYXRhYmxlVmFsdWUKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBmZWF0dXJlVHlwZSAKLQkgKi8KLQlwdWJsaWMgTmVzdGVkVXBkYXRhYmxlVmFsdWUoSURhdGFCaW5kaW5nQ29udGV4dCBkYXRhYmluZGluZ0NvbnRleHQsCi0JCQlJVXBkYXRhYmxlVmFsdWUgb3V0ZXJVcGRhdGFibGVWYWx1ZSwgT2JqZWN0IGZlYXR1cmUsIENsYXNzIGZlYXR1cmVUeXBlKSB7Ci0JCXRoaXMuZGF0YWJpbmRpbmdDb250ZXh0ID0gZGF0YWJpbmRpbmdDb250ZXh0OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmZlYXR1cmVUeXBlID0gZmVhdHVyZVR5cGU7Ci0JCXRoaXMub3V0ZXJVcGRhdGFibGVWYWx1ZSA9IG91dGVyVXBkYXRhYmxlVmFsdWU7Ci0JCXVwZGF0ZUlubmVyVXBkYXRhYmxlVmFsdWUob3V0ZXJVcGRhdGFibGVWYWx1ZSk7Ci0JCQotCQlvdXRlclVwZGF0YWJsZVZhbHVlLmFkZENoYW5nZUxpc3RlbmVyKG91dGVyQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCUlDaGFuZ2VMaXN0ZW5lciBvdXRlckNoYW5nZUxpc3RlbmVyID0gbmV3IElDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlQ2hhbmdlKENoYW5nZUV2ZW50IGNoYW5nZUV2ZW50KSB7Ci0JCQlPYmplY3Qgb2xkVmFsdWUgPSBnZXRWYWx1ZSgpOwotCQkJdXBkYXRlSW5uZXJVcGRhdGFibGVWYWx1ZShvdXRlclVwZGF0YWJsZVZhbHVlKTsKLQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5DSEFOR0UsIG9sZFZhbHVlLCBnZXRWYWx1ZSgpKTsKLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUlubmVyVXBkYXRhYmxlVmFsdWUoSVVwZGF0YWJsZVZhbHVlIG91dGVyVXBkYXRhYmxlVmFsdWUpIHsKLQkJY3VycmVudE91dGVyVmFsdWUgPSBvdXRlclVwZGF0YWJsZVZhbHVlLmdldFZhbHVlKCk7Ci0JCWlmIChpbm5lclVwZGF0YWJsZVZhbHVlICE9IG51bGwpIHsKLQkJCWlubmVyVXBkYXRhYmxlVmFsdWUucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoaW5uZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JCQlpbm5lclVwZGF0YWJsZVZhbHVlLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY3VycmVudE91dGVyVmFsdWUgPT0gbnVsbCkgewotCQkJaW5uZXJVcGRhdGFibGVWYWx1ZSA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmlubmVyVXBkYXRhYmxlVmFsdWUgPSAoSVVwZGF0YWJsZVZhbHVlKSBkYXRhYmluZGluZ0NvbnRleHQKLQkJCQkJLmNyZWF0ZVVwZGF0YWJsZShuZXcgUHJvcGVydHkoY3VycmVudE91dGVyVmFsdWUsIGZlYXR1cmUpKTsKLQkJCUNsYXNzIGlubmVyVmFsdWVUeXBlID0gaW5uZXJVcGRhdGFibGVWYWx1ZS5nZXRWYWx1ZVR5cGUoKTsKLQkJCWlmKGZlYXR1cmVUeXBlPT1udWxsKSB7Ci0JCQkJZmVhdHVyZVR5cGUgPSBpbm5lclZhbHVlVHlwZTsKLQkJCX0gZWxzZSB7Ci0JCQkJQXNzZXJ0LmlzVHJ1ZShmZWF0dXJlVHlwZS5lcXVhbHMoaW5uZXJWYWx1ZVR5cGUpLCAiQ2Fubm90IGNoYW5nZSB2YWx1ZSB0eXBlIGluIGEgbmVzdGVkIHVwZGF0YWJsZSB2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbm5lclVwZGF0YWJsZVZhbHVlLmFkZENoYW5nZUxpc3RlbmVyKGlubmVyQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChpbm5lclVwZGF0YWJsZVZhbHVlIT1udWxsKQotCQkgICBpbm5lclVwZGF0YWJsZVZhbHVlLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gaW5uZXJVcGRhdGFibGVWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGlubmVyVXBkYXRhYmxlVmFsdWUKLQkJCQkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlKCkgewotCQlyZXR1cm4gZmVhdHVyZVR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChvdXRlclVwZGF0YWJsZVZhbHVlICE9IG51bGwpIHsKLQkJCW91dGVyVXBkYXRhYmxlVmFsdWUucmVtb3ZlQ2hhbmdlTGlzdGVuZXIob3V0ZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JCQlvdXRlclVwZGF0YWJsZVZhbHVlLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoaW5uZXJVcGRhdGFibGVWYWx1ZSAhPSBudWxsKSB7Ci0JCQlpbm5lclVwZGF0YWJsZVZhbHVlLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGlubmVyQ2hhbmdlTGlzdGVuZXIpOwotCQkJaW5uZXJVcGRhdGFibGVWYWx1ZS5kaXNwb3NlKCk7Ci0JCX0KLQkJY3VycmVudE91dGVyVmFsdWUgPSBudWxsOwotCQlkYXRhYmluZGluZ0NvbnRleHQgPSBudWxsOwotCQlmZWF0dXJlID0gbnVsbDsKLQkJaW5uZXJVcGRhdGFibGVWYWx1ZSA9IG51bGw7Ci0JCWlubmVyQ2hhbmdlTGlzdGVuZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyBJVXBkYXRhYmxlVmFsdWUgZ2V0SW5uZXJVcGRhdGFibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGlubmVyVXBkYXRhYmxlVmFsdWU7Ci0JfQotCi0JcHVibGljIElVcGRhdGFibGVWYWx1ZSBnZXRPdXRlclVwZGF0YWJsZVZhbHVlKCkgewotCQlyZXR1cm4gb3V0ZXJVcGRhdGFibGVWYWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9QYWlyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9QYWlyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMmE5MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvUGFpci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmc7Ci0KLS8qKgotICogQ2xhc3MgUGFpci4gIFJlcHJlc2VudHMgYSBtYXRoZW1hdGljYWwgcGFpciBvZiBvYmplY3RzIChhLCBiKS4KLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFBhaXIgewotCi0JLyoqCi0JICogYSBpbiB0aGUgcGFpciAoYSwgYikKLQkgKi8KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGE7Ci0KLQkvKioKLQkgKiBiIGluIHRoZSBwYWlyIChhLCBiKQotCSAqLwotCXB1YmxpYyBmaW5hbCBPYmplY3QgYjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFBhaXIoYSwgYikKLQkgKiAKLQkgKiBAcGFyYW0gYSBhIGluIHRoZSBwYWlyIChhLCBiKQotCSAqIEBwYXJhbSBiIGIgaW4gdGhlIHBhaXIgKGEsIGIpCi0JICovCi0JcHVibGljIFBhaXIoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCXRoaXMuYSA9IGE7Ci0JCXRoaXMuYiA9IGI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqLmdldENsYXNzKCkgIT0gUGFpci5jbGFzcykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVBhaXIgb3RoZXIgPSAoUGFpcikgb2JqOwotCQlyZXR1cm4gYS5lcXVhbHMob3RoZXIuYSkgJiYgYi5lcXVhbHMob3RoZXIuYik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGEuaGFzaENvZGUoKSArIGIuaGFzaENvZGUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvVHJlZUJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL1RyZWVCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDA0ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvVHJlZUJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5CaW5kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlVHJlZTsKLQotLyoqCi0gKiBUcmVlQmluZGluZyBmYWN0czoKLSAqICAgIG8gTm8gQ29udmVyc2lvbiwgVmFsaWRhdGlvbiBvbiB2YXJpb3VzIHRyZWUgZWxlbWVudHMKLSAqICAgIG8gT24gYSBiaW5kLCBvbmx5IHJvb3QgZWxlbWVudHMgd2lsbCBiZSBwdXNoZWQgZnJvbSB0aGUgbW9kZWwgdG8gdGhlIHRhcmdldAotICogICAgbyA8Y29kZT5DaGFuZ2VFdmVudC5WSVJUVUFMPC9jb2RlPiBldmVudCB3aWxsIHJlcXVlc3QgY2hpbGRyZW4gYXMgbmVlZGVkCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRyZWVCaW5kaW5nIGV4dGVuZHMgQmluZGluZyB7Ci0KLQlwcml2YXRlIGZpbmFsIElVcGRhdGFibGVUcmVlIHRhcmdldDsKLQotCXByaXZhdGUgZmluYWwgSVVwZGF0YWJsZVRyZWUgbW9kZWw7Ci0KLQlwcml2YXRlIGludCB1cGRhdGluZyA9IDA7ICAvLyBWaXJ0dWFsIHJlcXVlc3RzIGFyZSBhbGxvd2VkIHdoaWxlIGFuIHVwZGF0ZSBpcyBpbiBwcm9ncmVzcwotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHBhcmFtIG1vZGVsIAotCSAqLwotCXB1YmxpYyBUcmVlQmluZGluZyhEYXRhQmluZGluZ0NvbnRleHQgY29udGV4dCwKLQkJCUlVcGRhdGFibGVUcmVlIHRhcmdldCwgSVVwZGF0YWJsZVRyZWUgbW9kZWwpIHsKLQkJc3VwZXIoY29udGV4dCk7Ci0JCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCQotCQkvLyBzb21lIHNhbml0eSBjaGVjaywgdGFyZ2V0IHNob3VsZCBzdXBwb3J0IGFsbCBkZWNsYXJlZCBtb2RlbCBlbGVtZW50cwotCQlDbGFzc1tdIHRhcmdldFR5cGVzPXRhcmdldC5nZXRUeXBlcygpOwotCQlDbGFzc1tdIG1vZGVsVHlwZXM9bW9kZWwuZ2V0VHlwZXMoKTsKLQkJaWYgKHRhcmdldFR5cGVzPT1udWxsIHx8IG1vZGVsVHlwZXM9PW51bGwpCi0JCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigiVHJlZSB0eXBlIGlzIG5vdCBzZXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCi0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGVsVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gY2FuSGFuZGxlPWZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0YXJnZXRUeXBlcy5sZW5ndGg7IGorKykgCi0JCQkJaWYgKHRhcmdldFR5cGVzW2pdLmlzQXNzaWduYWJsZUZyb20obW9kZWxUeXBlc1tpXSkpIHsKLQkJCQkJY2FuSGFuZGxlPXRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCWlmICghY2FuSGFuZGxlKQotCQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKCJUYXJnZXQgZG9lcyBub3Qgc3VwcG9ydHMgdHlwZTogIiArIG1vZGVsVHlwZXNbaV0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGFyZ2V0LmFkZENoYW5nZUxpc3RlbmVyKHRhcmdldENoYW5nZUxpc3RlbmVyKTsKLQkJbW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIobW9kZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVDaGFuZ2UoQ2hhbmdlRXZlbnQgY2hhbmdlRXZlbnQpIHsKLQkJCWlmICh1cGRhdGluZyAhPSAwICAmJiBjaGFuZ2VFdmVudC5nZXRDaGFuZ2VUeXBlKCkhPUNoYW5nZUV2ZW50LlZJUlRVQUwpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAoY2hhbmdlRXZlbnQuZ2V0Q2hhbmdlVHlwZSgpID09IENoYW5nZUV2ZW50LlZFUklGWSkgewotCQkJCS8vIE5vIENvbnZlcnNpb24gb24gdGhlIG9iamVjdCBpdHNlbGYKLQkJCX0gZWxzZSB7Ci0JCQkJdXBkYXRlKG1vZGVsLCB0YXJnZXQsIGNoYW5nZUV2ZW50KTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIElDaGFuZ2VMaXN0ZW5lciBtb2RlbENoYW5nZUxpc3RlbmVyID0gbmV3IElDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlQ2hhbmdlKENoYW5nZUV2ZW50IGNoYW5nZUV2ZW50KSB7Ci0JCQlpZiAodXBkYXRpbmcgIT0gMCAgJiYgY2hhbmdlRXZlbnQuZ2V0Q2hhbmdlVHlwZSgpIT1DaGFuZ2VFdmVudC5WSVJUVUFMKQotCQkJCXJldHVybjsKLQotCQkJdXBkYXRlKHRhcmdldCwgbW9kZWwsIGNoYW5nZUV2ZW50KTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGNvbGxlY3Rpb24gZnJvbSB0aGUgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIG5lZWRzVXBkYXRlCi0JICogICAgICAgICAgICBJVXBkYXRhYmxlIHRvIGJlIHVwZGF0ZWQKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlKElVcGRhdGFibGVUcmVlIG5lZWRzVXBkYXRlLCBJVXBkYXRhYmxlVHJlZSBzb3VyY2UsIENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBpbmRleCA9IGV2ZW50LmdldFBvc2l0aW9uKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBldmVudC5nZXRQYXJlbnQoKTsKLQkJCXRyeSB7Ci0JCQkJdXBkYXRpbmcgKys7Ci0JCQkJc3dpdGNoIChldmVudC5nZXRDaGFuZ2VUeXBlKCkpIHsKLQkJCQkJY2FzZSBDaGFuZ2VFdmVudC5WSVJUVUFMOgotCQkJCQkJc291cmNlLnNldEVsZW1lbnRzKHBhcmVudCwgbmVlZHNVcGRhdGUuZ2V0RWxlbWVudHMocGFyZW50KSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIENoYW5nZUV2ZW50LkNIQU5HRToKLQkJCQkJCW5lZWRzVXBkYXRlLnNldEVsZW1lbnQocGFyZW50LCBpbmRleCwgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIENoYW5nZUV2ZW50LkFERDoKLQkJCQkJCW5lZWRzVXBkYXRlLmFkZEVsZW1lbnQocGFyZW50LCBpbmRleCwgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIENoYW5nZUV2ZW50LlJFTU9WRToKLQkJCQkJCW5lZWRzVXBkYXRlLnJlbW92ZUVsZW1lbnQocGFyZW50LCBpbmRleCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIENoYW5nZUV2ZW50LlJFUExBQ0U6Ci0JCQkJCQlPYmplY3QgdmFsID0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWlmICh2YWwuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpCi0JCQkJCQkgICBuZWVkc1VwZGF0ZS5zZXRFbGVtZW50cyhwYXJlbnQsIChPYmplY3RbXSkgdmFsKTsKLQkJCQkJCWVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCi0JCQkJCQkJbmVlZHNVcGRhdGUuc2V0RWxlbWVudHMocGFyZW50LCAoKENvbGxlY3Rpb24pdmFsKS50b0FycmF5KCkpOwotCQkJCQkJZWxzZQotCQkJCQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uICgiSW52YWxpZCBSRVBMQUNFIGV2ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJICAgIGJyZWFrOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJdXBkYXRpbmcgLS07CQkJCQotCQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgbW9kZWwncyByb290IGVsZW1lbnRzIGludG8gdGhlIHRhcmdldAotCSAqIEl0IGlzIHVwIHRvIHRoZSB0YXJnZXQgdG8gZmlyZSBhIFZpcnR1YWwgcmVxdWVzdCBldmVudCB0byBnZXQKLQkgKiB0aGUgcmVzdCBvZiB0aGUgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVUYXJnZXRGcm9tTW9kZWwoKSB7Ci0JCWNvcHlSb290Q29udGVudHModGFyZ2V0LCBtb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlSb290Q29udGVudHMoSVVwZGF0YWJsZVRyZWUgZGVzdGluYXRpb24sCi0JCQlJVXBkYXRhYmxlVHJlZSBzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCXVwZGF0aW5nICsrOwotCQkJZGVzdGluYXRpb24uc2V0RWxlbWVudHMobnVsbCwgc291cmNlLmdldEVsZW1lbnRzKG51bGwpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXVwZGF0aW5nIC0tOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvVmFsdWVCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9WYWx1ZUJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzMzVlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9WYWx1ZUJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQmluZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JQmluZFNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXIuSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlQmluZGluZyBleHRlbmRzIEJpbmRpbmcgewotCi0JcHJpdmF0ZSBmaW5hbCBJVXBkYXRhYmxlVmFsdWUgdGFyZ2V0OwotCi0JcHJpdmF0ZSBmaW5hbCBJVXBkYXRhYmxlVmFsdWUgbW9kZWw7Ci0KLQlwcml2YXRlIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JcHJpdmF0ZSBJQ29udmVydGVyIGNvbnZlcnRlcjsKLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIGJpbmRTcGVjCi0JICovCi0JcHVibGljIFZhbHVlQmluZGluZyhEYXRhQmluZGluZ0NvbnRleHQgY29udGV4dCwgSVVwZGF0YWJsZVZhbHVlIHRhcmdldCwKLQkJCUlVcGRhdGFibGVWYWx1ZSBtb2RlbCwgSUJpbmRTcGVjIGJpbmRTcGVjKSB7Ci0JCXN1cGVyKGNvbnRleHQpOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQljb252ZXJ0ZXIgPSBiaW5kU3BlYy5nZXRDb252ZXJ0ZXIoKTsKLQkJaWYgKGNvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigiTWlzc2luZyBjb252ZXJ0ZXIgZnJvbSAiICsgdGFyZ2V0LmdldFZhbHVlVHlwZSgpICsgIiB0byAiICsgbW9kZWwuZ2V0VmFsdWVUeXBlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQkvLyBGSVhNRTogV2FpdGluZyBmb3IgTTQgdG8gc2hpcCB0byBjb21taXQ7IGFsc28gbmVlZCB0byB3cml0ZSBhIHRlc3QgY2FzZQotCQlpZiAoIWNvbnZlcnRlci5nZXRNb2RlbFR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKG1vZGVsLmdldFZhbHVlVHlwZSgpKSkgewotCQkJdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24oCi0JCQkJCSJDb252ZXJ0ZXIgZG9lcyBub3QgYXBwbHkgdG8gbW9kZWwgdHlwZS4gRXhwZWN0ZWQ6ICIgKyBtb2RlbC5nZXRWYWx1ZVR5cGUoKSArICIsIGFjdHVhbDogIiArIGNvbnZlcnRlci5nZXRNb2RlbFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmICghY29udmVydGVyLmdldFRhcmdldFR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldC5nZXRWYWx1ZVR5cGUoKSkpIHsKLQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKAotCQkJCQkiQ29udmVydGVyIGRvZXMgbm90IGFwcGx5IHRvIHRhcmdldCB0eXBlLiBFeHBlY3RlZDogIiArIHRhcmdldC5nZXRWYWx1ZVR5cGUoKSArICIsIGFjdHVhbDogIiArIGNvbnZlcnRlci5nZXRUYXJnZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQl2YWxpZGF0b3IgPSBiaW5kU3BlYy5nZXRWYWxpZGF0b3IoKTsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigiTWlzc2luZyB2YWxpZGF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRhcmdldC5hZGRDaGFuZ2VMaXN0ZW5lcih0YXJnZXRDaGFuZ2VMaXN0ZW5lcik7Ci0JCW1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKG1vZGVsQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgZmluYWwgSUNoYW5nZUxpc3RlbmVyIHRhcmdldENoYW5nZUxpc3RlbmVyID0gbmV3IElDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlQ2hhbmdlKENoYW5nZUV2ZW50IGNoYW5nZUV2ZW50KSB7Ci0JCQlpZiAodXBkYXRpbmcpIAotCQkJCXJldHVybjsKLQkJCWlmIChjaGFuZ2VFdmVudC5nZXRDaGFuZ2VUeXBlKCkgPT0gQ2hhbmdlRXZlbnQuVkVSSUZZKSB7Ci0JCQkJLy8gd2UgYXJlIG5vdGlmaWVkIG9mIGEgcGVuZGluZyBjaGFuZ2UsIGRvIHZhbGlkYXRpb24KLQkJCQkvLyBhbmQgdmV0byB0aGUgY2hhbmdlIGlmIGl0IGlzIG5vdCB2YWxpZAotCQkJCU9iamVjdCB2YWx1ZSA9IGNoYW5nZUV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJU3RyaW5nIHBhcnRpYWxWYWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0b3IKLQkJCQkJCS5pc1BhcnRpYWxseVZhbGlkKHZhbHVlKTsKLQkJCQljb250ZXh0LnVwZGF0ZVBhcnRpYWxWYWxpZGF0aW9uRXJyb3IodGhpcywKLQkJCQkJCXBhcnRpYWxWYWxpZGF0aW9uRXJyb3IpOwotCQkJCWlmIChwYXJ0aWFsVmFsaWRhdGlvbkVycm9yICE9IG51bGwpIHsKLQkJCQkJY2hhbmdlRXZlbnQuc2V0VmV0byh0cnVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHRoZSB0YXJnZXQgKHVzdWFsbHkgYSB3aWRnZXQpIGhhcyBjaGFuZ2VkLCB2YWxpZGF0ZQotCQkJCS8vIHRoZSB2YWx1ZSBhbmQgdXBkYXRlIHRoZSBzb3VyY2UKLQkJCQl1cGRhdGVNb2RlbEZyb21UYXJnZXQoKTsKLQkJCX0KLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBJQ2hhbmdlTGlzdGVuZXIgbW9kZWxDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUNoYW5nZShDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudCkgewotCQkJaWYgKHVwZGF0aW5nKSAKLQkJCQlyZXR1cm47Ci0JCQkvLyBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgc28gd2UgbXVzdCB1cGRhdGUgdGhlIHRhcmdldAotCQkJaWYgKGNoYW5nZUV2ZW50LmdldENoYW5nZVR5cGUoKSA9PSBDaGFuZ2VFdmVudC5WRVJJRlkpIHsKLQkJCX0gZWxzZSB7Ci0JCQkJdXBkYXRlVGFyZ2V0RnJvbU1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogVGhpcyBhbHNvIGRvZXMgdmFsaWRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNb2RlbEZyb21UYXJnZXQoKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IHRhcmdldC5nZXRWYWx1ZSgpOwotCQlTdHJpbmcgdmFsaWRhdGlvbkVycm9yID0gZG9WYWxpZGF0ZVRhcmdldCh2YWx1ZSk7Ci0JCWNvbnRleHQudXBkYXRlVmFsaWRhdGlvbkVycm9yKHRhcmdldENoYW5nZUxpc3RlbmVyLCB2YWxpZGF0aW9uRXJyb3IpOwotCQlpZiAodmFsaWRhdGlvbkVycm9yID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCW1vZGVsLnNldFZhbHVlKGNvbnZlcnRlci5jb252ZXJ0VGFyZ2V0VG9Nb2RlbCh2YWx1ZSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJY29udGV4dC51cGRhdGVWYWxpZGF0aW9uRXJyb3IodGFyZ2V0Q2hhbmdlTGlzdGVuZXIsIEJpbmRpbmdNZXNzYWdlcwotCQkJCQkJLmdldFN0cmluZygiVmFsdWVCaW5kaW5nX0Vycm9yV2hpbGVTZXR0aW5nVmFsdWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZmluYWxseSB7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlVGFyZ2V0KCkgewotCQlPYmplY3QgdmFsdWUgPSB0YXJnZXQuZ2V0VmFsdWUoKTsKLQkJZG9WYWxpZGF0ZVRhcmdldCh2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZG9WYWxpZGF0ZVRhcmdldChPYmplY3QgdmFsdWUpIHsKLQkJU3RyaW5nIHZhbGlkYXRpb25FcnJvciA9IHZhbGlkYXRvci5pc1ZhbGlkKHZhbHVlKTsKLQkJY29udGV4dC51cGRhdGVQYXJ0aWFsVmFsaWRhdGlvbkVycm9yKHRhcmdldENoYW5nZUxpc3RlbmVyLCBudWxsKTsKLQkJY29udGV4dC51cGRhdGVWYWxpZGF0aW9uRXJyb3IodGFyZ2V0Q2hhbmdlTGlzdGVuZXIsIHZhbGlkYXRpb25FcnJvcik7Ci0JCXJldHVybiB2YWxpZGF0aW9uRXJyb3I7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVGFyZ2V0RnJvbU1vZGVsKCkgewotCQl0cnkgewotCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJdGFyZ2V0LnNldFZhbHVlKGNvbnZlcnRlci5jb252ZXJ0TW9kZWxUb1RhcmdldChtb2RlbC5nZXRWYWx1ZSgpKSk7Ci0JCQl2YWxpZGF0ZVRhcmdldCgpOwotCQl9IGZpbmFsbHkgewotCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9iZWFucy9Db3B5T2ZKYXZhQmVhblVwZGF0YWJsZUNvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL2JlYW5zL0NvcHlPZkphdmFCZWFuVXBkYXRhYmxlQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGFhMmRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL2JlYW5zL0NvcHlPZkphdmFCZWFuVXBkYXRhYmxlQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuYmVhbnM7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuRGF0YUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklEYXRhQmluZGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkphdmFCZWFuc1NjYWxhclVwZGF0YWJsZVZhbHVlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5VcGRhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5T2ZKYXZhQmVhblVwZGF0YWJsZUNvbGxlY3Rpb24gZXh0ZW5kcyBVcGRhdGFibGUgaW1wbGVtZW50cwotCQlJVXBkYXRhYmxlQ29sbGVjdGlvbiB7Ci0KLS8vCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjb2xsZWN0aW9uTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLS8vCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLS8vCQkJaWYgKCF1cGRhdGluZykgewotLy8JCQkJT2JqZWN0W10gdmFsdWVzID0gZ2V0VmFsdWVzKCk7Ci0vLwkJCQllbGVtZW50TGlzdGVuZXJTdXBwb3J0LnNldEhvb2tUYXJnZXRzKHZhbHVlcyk7Ci0vLwkJCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBudWxsLAotLy8JCQkJCQludWxsLCBDaGFuZ2VFdmVudC5QT1NJVElPTl9VTktOT1dOKTsKLS8vCQkJfQotLy8JCX0KLS8vCX07Ci0vLwotLy8JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGVsZW1lbnRMaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotLy8JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotLy8JCQlpZiAoIXVwZGF0aW5nKSB7Ci0vLwkJCQlPYmplY3RbXSB2YWx1ZXMgPSBnZXRWYWx1ZXMoKTsKLS8vCQkJCWludCBwb3NpdGlvbiA9IEFycmF5cy5hc0xpc3QodmFsdWVzKS5pbmRleE9mKGV2ZW50LmdldFNvdXJjZSgpKTsKLS8vCQkJCWlmKHBvc2l0aW9uIT0tMSl7Ci0vLwkJCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgZXZlbnQuZ2V0U291cmNlKCksCi0vLwkJCQkJCQlldmVudC5nZXRTb3VyY2UoKSwgcG9zaXRpb24pOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JfTsKLS8vCQotLy8JcHJpdmF0ZSBMaXN0ZW5lclN1cHBvcnQgY29sbGVjdGlvbkxpc3RlblN1cHBvcnQgPSBuZXcgTGlzdGVuZXJTdXBwb3J0KGNvbGxlY3Rpb25MaXN0ZW5lcik7Ci0vLwlwcml2YXRlIExpc3RlbmVyU3VwcG9ydCBlbGVtZW50TGlzdGVuZXJTdXBwb3J0ID0gbmV3IExpc3RlbmVyU3VwcG9ydChlbGVtZW50TGlzdGVuZXIpOwotCQotCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0aW5nID0gZmFsc2U7Ci0KLQlwcml2YXRlIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCXByaXZhdGUgQ2xhc3MgZWxlbWVudFR5cGU9bnVsbDsKLQkKLQlwcml2YXRlIElVcGRhdGFibGVWYWx1ZSBvYmplY3RVcGRhdGFibGU7Ci0JCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdCBUaGUgY29sbGVjdGlvbiBvYmplY3Qgd2UncmUgYmluZGluZwotCSAqIEBwYXJhbSBkZXNjcmlwdG9yIEEgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiBAcGFyYW0gZWxlbWVudFR5cGUgIFRoZSBlbGVtZW50IGRhdGEgdHlwZSAoc3RpbGwgbmVlZGVkPykKLQkgKi8KLQlwdWJsaWMgQ29weU9mSmF2YUJlYW5VcGRhdGFibGVDb2xsZWN0aW9uKE9iamVjdCBvYmplY3QsCi0JCQlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciwgQ2xhc3MgZWxlbWVudFR5cGUpIHsKLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwotCQkKLQkJLy8gQ3JlYXRlIGFuIElVcGRhdGFibGVWYWx1ZSBmb3IgdGhlIGNvbGxlY3Rpb24gaXRzZWxmCi0JCUlEYXRhQmluZGluZ0NvbnRleHQgZGJjID0gRGF0YUJpbmRpbmcuY3JlYXRlQ29udGV4dChuZXcgSVVwZGF0YWJsZUZhY3RvcnlbXSB7Ci0JCQkJbmV3IEphdmFCZWFuc1NjYWxhclVwZGF0YWJsZVZhbHVlRmFjdG9yeSgpCi0JCX0pOwotCQlvYmplY3RVcGRhdGFibGUgPSAoSVVwZGF0YWJsZVZhbHVlKSBkYmMuY3JlYXRlVXBkYXRhYmxlKG5ldyBQcm9wZXJ0eShvYmplY3QsIGRlc2NyaXB0b3IuZ2V0TmFtZSgpKSk7Ci0JCW9iamVjdFVwZGF0YWJsZS5hZGRDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCXByaXZhdGUgSUNoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyID0gbmV3IElDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlQ2hhbmdlKENoYW5nZUV2ZW50IGNoYW5nZUV2ZW50KSB7Ci0JCQlpZiAoIXVwZGF0aW5nKSB7Ci0JCQkJZmlyZUNoYW5nZUV2ZW50KGNoYW5nZUV2ZW50LmdldENoYW5nZVR5cGUoKSwgbnVsbCwKLQkJCQkJCW51bGwsIENoYW5nZUV2ZW50LlBPU0lUSU9OX1VOS05PV04pOwotCQkJfQotCQl9Ci0JfTsKLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJb2JqZWN0VXBkYXRhYmxlLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gY29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIChDb2xsZWN0aW9uKW9iamVjdFVwZGF0YWJsZS5nZXRWYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gYXJyYXkoKSB7Ci0JCXJldHVybiAoT2JqZWN0W10pb2JqZWN0VXBkYXRhYmxlLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlpZiAoZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5pc0FycmF5KCkpIHsKLQkJCXJldHVybiBhcnJheSgpLmxlbmd0aDsKLQkJfQotCQlyZXR1cm4gY29sbGVjdGlvbigpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGFkZEVsZW1lbnQoT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCkuaXNBcnJheSgpKQotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgImNhbm5vdCBhZGQgZWxlbWVudHMiKTsgLy8kTk9OLU5MUy0xJAkJICAgCi0JCQotCQlDb2xsZWN0aW9uIGxpc3QgPSBjb2xsZWN0aW9uKCk7Ci0JCWxpc3QuYWRkKHZhbHVlKTsJCi0JCWlmIChpbmRleCA8PSAwIHx8IGluZGV4ID4gbGlzdC5zaXplKCkpCi0JCQlpbmRleCA9IGxpc3Quc2l6ZSgpOwotCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQURELCBudWxsLCB2YWx1ZSwgaW5kZXgpOwotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGZpbmRFbGVtZW50KGludCBpbmRleCkgewotCQlDb2xsZWN0aW9uIGxpc3QgPSBjb2xsZWN0aW9uKCk7Ci0JCU9iamVjdCBvID0gbnVsbDsKLQkJaW50IGk9MDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlpZiAoaW5kZXg9PWkpIHsKLQkJCQlvID0gaXRlci5uZXh0KCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpdGVyLm5leHQoKTsKLQkJfQotCQlyZXR1cm4gbzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50KGludCBpbmRleCkgewotCQlpZiAoZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5pc0FycmF5KCkpCi0JCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiY2Fubm90IHJlbW92ZSBlbGVtZW50cyIpOyAvLyROT04tTkxTLTEkCQkgICAKLQkJCi0JCU9iamVjdCBvID0gZmluZEVsZW1lbnQoaW5kZXgpOwotCQlpZiAobyE9bnVsbCkgewotCQkgICBjb2xsZWN0aW9uKCkucmVtb3ZlKG8pOwotCQkgICBmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuUkVNT1ZFLCBvLCBudWxsLCBpbmRleCk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHVwZGF0aW5nKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdXBkYXRpbmcgPSB0cnVlOwotCQl0cnkgewotCQkJT2JqZWN0IG9sZFZhbHVlOwotCQkJaWYgKGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCkuaXNBcnJheSgpKSB7Ci0JCQkJb2xkVmFsdWUgPSBhcnJheSgpW2luZGV4XTsKLQkJCQlhcnJheSgpW2luZGV4XSA9IHZhbHVlOwotCQkJfSBlbHNlIHsKLQkJCQlDb2xsZWN0aW9uIGMgPSBjb2xsZWN0aW9uKCk7Ci0JCQkJb2xkVmFsdWUgPSBmaW5kRWxlbWVudChpbmRleCk7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gVHJ5IHRvIHByZXNlcnZlIGNvbGxlY3Rpb24gb3JkZXIgaWYgcG9zc2libGUKLQkJCQkJTWV0aG9kIHNldE1ldGhvZCA9IGMuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInNldCIsIG5ldyBDbGFzc1tdIHtJbnRlZ2VyLlRZUEUsIE9iamVjdC5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCQkJCXNldE1ldGhvZC5pbnZva2UoYywgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihpbmRleCksIHZhbHVlfSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWYgd2UgY2FuJ3QgcHJlc2VydmUgb3JkZXIKLQkJCQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCQkJCWMucmVtb3ZlKG9sZFZhbHVlKTsKLQkJCQkJfQotCQkJCQljLmFkZCh2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgb2xkVmFsdWUsIHZhbHVlLCBpbmRleCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl1cGRhdGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRFbGVtZW50KGludCBpbmRleCkgewotCQlpZiAoZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5pc0FycmF5KCkpIHsKLQkJCXJldHVybiBhcnJheSgpW2luZGV4XTsKLQkJfQotCQlyZXR1cm4gZmluZEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRFbGVtZW50VHlwZSgpIHsJCQotCQlyZXR1cm4gZWxlbWVudFR5cGU7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL2JlYW5zL0VkaXRlZENvbGxlY3Rpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvYmVhbnMvRWRpdGVkQ29sbGVjdGlvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzAwYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvYmVhbnMvRWRpdGVkQ29sbGVjdGlvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5iZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZUNvbGxlY3Rpb247Ci0KLS8qKgotICogTWFpbnRhaW5zIGEgcmVnaXN0cnkgb2YgYWxsIEphdmFCZWFuIGNvbGxlY3Rpb25zIHRoYXQgYXJlIGJlaW5nIGVkaXRlZAotICogdXNpbmcgZGF0YSBiaW5kaW5nLgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0ZWRDb2xsZWN0aW9uUmVnaXN0cnkgewotCXByaXZhdGUgc3RhdGljIEVkaXRlZENvbGxlY3Rpb25SZWdpc3RyeSBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgRWRpdGVkQ29sbGVjdGlvblJlZ2lzdHJ5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWRpdGVkQ29sbGVjdGlvblJlZ2lzdHJ5IGdldERlZmF1bHQoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBFZGl0ZWRDb2xsZWN0aW9uUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgRWRpdGVkQ29sbGVjdGlvblJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgbmV3IGRlZmF1bHQgRWRpdGVkQ29sbGVjdGlvblJlZ2lzdHJ5IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdChFZGl0ZWRDb2xsZWN0aW9uUmVnaXN0cnkgaW5zdGFuY2UpIHsKLQkJRWRpdGVkQ29sbGVjdGlvblJlZ2lzdHJ5Lmluc3RhbmNlID0gaW5zdGFuY2U7Ci0JfQotCQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVkaXRlZENvbGxlY3Rpb24gewotCQlwdWJsaWMgaW50IGNvdW50ID0gMDsKLQkJcHVibGljIE9iamVjdCBjb2xsZWN0aW9uOwotCQlwdWJsaWMgSVVwZGF0YWJsZUNvbGxlY3Rpb24gd3JhcHBlcjsKLQkJCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYXJnMCkgewotCQkJcmV0dXJuIGNvbGxlY3Rpb24uZXF1YWxzKGFyZzApOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIGNvbGxlY3Rpb24uaGFzaENvZGUoKTsKLQkJfQotCQkKLQkJcHVibGljIEVkaXRlZENvbGxlY3Rpb24oT2JqZWN0IGNvbGxlY3Rpb24pIHsKLQkJCXRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIGVkaXRlZENvbGxlY3Rpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBNZXRob2QgcmVnaXN0ZXIuICBSZWdpc3RlciBhIGNvbGxlY3Rpb24gdG8gZWRpdC4KLQkgKiAKLQkgKiAjcmVnaXN0ZXIgYW5kICN1blJlZ2lzdGVyIG1haW50YWluIGEgcmVnaXN0cmF0aW9uIGNvdW50LgotCSAqIFRoZSBjb2xsZWN0aW9uIHdvbid0IGJlIHVucmVnaXN0ZXJlZCB1bnRpbCB0aGUgc2FtZSBudW1iZXIKLQkgKiBvZiAjdW5SZWdpc3RlciBjYWxscyBoYXZlIGJlZW4gbWFkZSBhcyAjcmVnaXN0ZXIgY2FsbHMuCi0JICogCi0JICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gZWRpdC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXIoT2JqZWN0IGNvbGxlY3Rpb24pIHsKLQkJaWYgKCFlZGl0ZWRDb2xsZWN0aW9ucy5jb250YWluc0tleShjb2xsZWN0aW9uKSkgewotCQkJRWRpdGVkQ29sbGVjdGlvbiBlZGl0ZWRDb2xsZWN0aW9uID0gbmV3IEVkaXRlZENvbGxlY3Rpb24oY29sbGVjdGlvbik7Ci0JCQkrK2VkaXRlZENvbGxlY3Rpb24uY291bnQ7Ci0JCQllZGl0ZWRDb2xsZWN0aW9ucy5wdXQoY29sbGVjdGlvbiwgZWRpdGVkQ29sbGVjdGlvbik7Ci0JCQkvLyBUT0RPOiBJbml0aWFsaXplIGVkaXRlZENvbGxlY3Rpb24ud3JhcHBlcgotCQl9IGVsc2UgewotCQkJLy8gVE9ETwotCQl9Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCB1blJlZ2lzdGVyLiAgVW5yZWdpc3RlciBhIGNvbGxlY3Rpb24uCi0JICogCi0JICogI3JlZ2lzdGVyIGFuZCAjdW5SZWdpc3RlciBtYWludGFpbiBhIHJlZ2lzdHJhdGlvbiBjb3VudC4KLQkgKiBUaGUgY29sbGVjdGlvbiB3b24ndCBiZSB1bnJlZ2lzdGVyZWQgdW50aWwgdGhlIHNhbWUgbnVtYmVyCi0JICogb2YgI3VuUmVnaXN0ZXIgY2FsbHMgaGF2ZSBiZWVuIG1hZGUgYXMgI3JlZ2lzdGVyIGNhbGxzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xsZWN0aW9uIHRoZSBjb2xsZWN0aW9uIHRvIG5vIGxvbmdlciBlZGl0LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1blJlZ2lzdGVyKE9iamVjdCBjb2xsZWN0aW9uKSB7Ci0JCUVkaXRlZENvbGxlY3Rpb24gZWMgPSAoRWRpdGVkQ29sbGVjdGlvbikgZWRpdGVkQ29sbGVjdGlvbnMuZ2V0KGNvbGxlY3Rpb24pOwotCQlpZiAoZWMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXR0ZXB0IHRvIHVuUmVnaXN0ZXIgYW4gdW5yZWdpc3RlcmVkIGNvbGxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVjLmNvdW50LS07Ci0JCWlmIChlYy5jb3VudCA8PSAwKSB7Ci0JCQllZGl0ZWRDb2xsZWN0aW9ucy5yZW1vdmUoY29sbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0VXBkYXRhYmxlLiAgUmV0dXJucyBhbiBJVXBkYXRhYmxlQ29sbGVjdGlvbiBnaXZlbgotCSAqIGEgY29sbGVjdGlvbiB0byBlZGl0IG9yIG51bGwgaWYgYW4gSVVwZGF0YWJsZUNvbGxlY3Rpb24KLQkgKiBjYW5ub3QgYmUgbWFkZS4gICNyZWdpc3RlcihPYmplY3QgY29sbGVjdGlvbikgbXVzdCBoYXZlIGJlZW4KLQkgKiBwcmV2aW91c2x5IGNhbGxlZCB0byByZWdpc3RlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gZWRpdC4KLQkgKiBAcmV0dXJuIEFuIElVcGRhdGFibGVDb2xsZWN0aW9uIG9yIG51bGwgaWYgbm9uZSBjYW4gYmUgbWFkZS4KLQkgKi8KLQlwdWJsaWMgSVVwZGF0YWJsZUNvbGxlY3Rpb24gZ2V0VXBkYXRhYmxlKE9iamVjdCBjb2xsZWN0aW9uKSB7Ci0JCUVkaXRlZENvbGxlY3Rpb24gZWMgPSAoRWRpdGVkQ29sbGVjdGlvbikgZWRpdGVkQ29sbGVjdGlvbnMuZ2V0KGNvbGxlY3Rpb24pOwotCQlpZiAoZWMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXR0ZXB0IHRvIGdldFVwZGF0YWJsZSBvbiBhbiB1bnJlZ2lzdGVyZWQgY29sbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGVjLndyYXBwZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvYmVhbnMvSmF2YUJlYW5UcmVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9iZWFucy9KYXZhQmVhblRyZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwMDlkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9iZWFucy9KYXZhQmVhblRyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLmJlYW5zOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5CaW5kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5UcmVlTW9kZWxEZXNjcmlwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgSmF2YUJlYW4gaW1wbGVtZW50YXRpb24gZm9yIGEgSVRyZWUuICBJdCBpcyBhIElUcmVlIGZhY2FkZSB0aGF0IGlzIGJ1aWx0Ci0gKiBmcm9tIGEgPGNvZGU+VHJlZU1vZGVsRGVzY3JpcHRpb248L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQmVhblRyZWUgaW1wbGVtZW50cyBJVHJlZSB7Ci0JCi0JLyoqCi0JICogS2VlcCB0cmFjayBvZiBlbGVtZW50IHBhcmVudHMsIGFuZCBjaGlsZHJlbgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRyZWVOb2RlIHsKLQkJcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCQlwcml2YXRlIExpc3QgY2hpbGRyZW47Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIHBhcmVudAotCQkgKi8KLQkJcHVibGljIFRyZWVOb2RlKE9iamVjdCBwYXJlbnQpIHsKLQkJCXRoaXMucGFyZW50PXBhcmVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIGNoaWxkcmVuCi0JCSAqLwotCQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJCXJldHVybiBjaGlsZHJlbj09bnVsbD8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDogY2hpbGRyZW47Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGNoaWxkcmVuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihMaXN0IGNoaWxkcmVuKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBwYXJlbnQKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUkVBRCA9IDA7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFdSSVRFID0gMTsKLQotCXByaXZhdGUgVHJlZU1vZGVsRGVzY3JpcHRpb24gbW9kZWxEZXNjcmlwdGlvbjsKLQkKLQlwcml2YXRlIE9iamVjdFtdICByb290RWxlbWVudHM7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIGRlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIElUcmVlLkNoYW5nZVN1cHBvcnQgY2hhbmdlU3VwcG9ydCA9IG51bGw7Ci0JCQotCXByaXZhdGUgSGFzaE1hcCBub2RlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0aW5nID0gZmFsc2U7Ci0JCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGVsZW1lbnRMaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmICghdXBkYXRpbmcgJiYgY2hhbmdlU3VwcG9ydCE9bnVsbCkgewkKLQkJCQlTdHJpbmdbXSBwcm9wZXJ0aWVzID0gbW9kZWxEZXNjcmlwdGlvbi5nZXRDaGlsZHJlblByb3BlcnRpZXMoZXZlbnQuZ2V0U291cmNlKCkuZ2V0Q2xhc3MoKSk7Ci0JCQkJLy8gRGV0ZXJtaW5lIGlmIHRoZSBjaGFuZ2UgaXMgb24gYSBjaGlsZHJlbiBQcm9wZXJ0eSwgaW4gd2hpY2ggY2FzZQotCQkJCS8vIHRoYXQgbGV2ZWwgb2YgdGhlIHRyZWUgaGFzIGNoYW5nZWQuCi0JCQkJaWYgKHByb3BlcnRpZXMhPW51bGwgJiYgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkhPW51bGwgJiYgCi0JCQkJCQlBcnJheXMuYXNMaXN0KHByb3BlcnRpZXMpLmNvbnRhaW5zKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQkvLyBBc3N1bWUgY2hpbGRyZW4gaGF2ZSBjaGFuZ2VkCi0JCQkJCWNoYW5nZVN1cHBvcnQuZmlyZVRyZWVDaGFuZ2UoQ2hhbmdlRXZlbnQuUkVQTEFDRSwgbnVsbCwgZ2V0Q2hpbGRyZW4oZXZlbnQuZ2V0U291cmNlKCkpLCBldmVudC5nZXRTb3VyY2UoKSwgLTEpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQXNzdW1lIGEgcHJvcGVydHkgaGFzIGNoYW5nZWQgdGhhdCBtYXkgY2hhbmdlIHRoZSB3YXkgdGhpcyBlbGVtZW50Ci0JCQkJCS8vIGlzIHJlbmRlcmVkIGluIGEgdmlld2VyLCB1c2Ugb3VyIHRyYWNraW5nIHRvIGZpZ3VyZSBvdXQgdGhlIGluZGV4LgotCQkJCQlUcmVlTm9kZSBub2RlID0gKFRyZWVOb2RlKW5vZGVzLmdldChldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQkJCWlmIChub2RlIT1udWxsKSB7Ci0JCQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4obm9kZS5nZXRQYXJlbnQoKSk7Ci0JCQkJCQlpZiAoY2hpbGRyZW4hPW51bGwpIHsKLQkJCQkJCQlpbmRleCA9IEFycmF5cy5hc0xpc3QoY2hpbGRyZW4pLmluZGV4T2YoZXZlbnQuZ2V0U291cmNlKCkpOwotCQkJCQkJfQotCQkJCQkJaWYgKGluZGV4PDApIGluZGV4ID0gQ2hhbmdlRXZlbnQuUE9TSVRJT05fVU5LTk9XTjsKLQkJCQkJICAgIGNoYW5nZVN1cHBvcnQuZmlyZVRyZWVDaGFuZ2UoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBudWxsLCBldmVudC5nZXRTb3VyY2UoKSwgbm9kZS5nZXRQYXJlbnQoKSwgaW5kZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQkKLQlIYXNoTWFwIGxpc3RlbmVyU3VwcG9ydCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsRGVzY3JpcHRvbgotCSAqLwotCXB1YmxpYyBKYXZhQmVhblRyZWUoVHJlZU1vZGVsRGVzY3JpcHRpb24gbW9kZWxEZXNjcmlwdG9uKSB7Ci0JCXRoaXMubW9kZWxEZXNjcmlwdGlvbiA9IG1vZGVsRGVzY3JpcHRvbjsKLQkJaWYgKG1vZGVsRGVzY3JpcHRvbi5nZXRSb290KCk9PW51bGwpCi0JCQlyb290RWxlbWVudHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULnRvQXJyYXkoKTsKLQkJZWxzZQotCQkJcm9vdEVsZW1lbnRzID0gbW9kZWxEZXNjcmlwdG9uLmdldFJvb3QoKS5nZXRDbGFzcygpLmlzQXJyYXkoKT8KLQkJCQkgICAgICAgICAgKE9iamVjdFtdKSBtb2RlbERlc2NyaXB0b24uZ2V0Um9vdCgpOgotCQkJCSAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgbW9kZWxEZXNjcmlwdG9uLmdldFJvb3QoKSB9OwotCQlUcmVlTm9kZSByb290ID0gbmV3IFRyZWVOb2RlKG51bGwpOwotCQlub2Rlcy5wdXQodGhpcywgcm9vdCk7Ci0JCWhvb2t1cChudWxsLCByb290RWxlbWVudHMpOwkJCi0JfQotCQotCQotCS8vIHBpY2sgdXAgdGhlIGxlYWYgbW9zdCByZWdpc3RlcmVkIGNsYXNzIHRoYXQgaXMgYXNzaWduYWJsZQotCS8vIGZyb20gby5jbGFzcy4KLQlwcml2YXRlIENsYXNzIGdldFJlbGV2YW50Q2xhc3MoT2JqZWN0IG8pIHsKLQkJaWYgKG89PW51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ2xhc3MgbGVhZkNsYXNzID0gbnVsbDsKLQkJQ2xhc3MgY3VycmVudCA9IG8uZ2V0Q2xhc3MoKTsKLQkJQ2xhc3NbXSBsaXN0ID0gbW9kZWxEZXNjcmlwdGlvbi5nZXRUeXBlcygpOwkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCWlmIChsaXN0W2ldLmlzQXNzaWduYWJsZUZyb20oY3VycmVudCkpIHsKLQkJCQkvLyBmb3VuZCByZWdpc3RlcmVkIGNsYXNzCi0JCQkJaWYgKGxlYWZDbGFzcz09bnVsbCkKLQkJCQkJbGVhZkNsYXNzPWxpc3RbaV07Ci0JCQkJZWxzZQotCQkJCQlpZiAobGVhZkNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdFtpXSkpCi0JCQkJCQkJbGVhZkNsYXNzPWxpc3RbaV07IAotCQkJfQotCQlyZXR1cm4gbGVhZkNsYXNzOwotCX0KLQkJCi0JcHJpdmF0ZSBNZXRob2RbXSBnZXRJbnZvY2F0aW9uTWV0aG9kcyhDbGFzcyBjbGF6eiwgaW50IG1ldGhvZFR5cGUpIHsKLQkJaWYgKGNsYXp6PT1udWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ1tdIGNoaWxkcmVuUHJvcGVydGllcyA9IG1vZGVsRGVzY3JpcHRpb24KLQkJCQkuZ2V0Q2hpbGRyZW5Qcm9wZXJ0aWVzKGNsYXp6KTsKLQkJaWYgKGNoaWxkcmVuUHJvcGVydGllcyA9PSBudWxsIHx8IGNoaWxkcmVuUHJvcGVydGllcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJUHJvcGVydHlIZWxwZXJbXSBwcm9wZXJ0aWVzID0gKFByb3BlcnR5SGVscGVyW10pIGRlc2NyaXB0b3JzLmdldChjbGF6eik7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCUxpc3QgbmV3cFByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCS8vIFdhbGsgYnkgcHJvcGVydGllcyB0byBwcmVzZXJ2ZSB0aGUgdHJlZSBvcmRlcgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlblByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlQcm9wZXJ0eUhlbHBlciBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eUhlbHBlcigKLQkJCQkJCWNoaWxkcmVuUHJvcGVydGllc1tpXSwgY2xhenopOwotCQkJCWlmIChwcm9wZXJ0eS5nZXRHZXR0ZXIoKSAhPSBudWxsIHx8ICBwcm9wZXJ0eS5nZXRTZXR0ZXIoKSAhPSBudWxsKSB7Ci0JCQkJCW5ld3BQcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eSk7Ci0JCQkJfQotCQkJfQotCi0JCQlwcm9wZXJ0aWVzID0gKFByb3BlcnR5SGVscGVyW10pIG5ld3BQcm9wZXJ0aWVzCi0JCQkJCS50b0FycmF5KG5ldyBQcm9wZXJ0eUhlbHBlcltuZXdwUHJvcGVydGllcy5zaXplKCldKTsKLQkJCWRlc2NyaXB0b3JzLnB1dChjbGF6eiwgcHJvcGVydGllcyk7Ci0KLQkJfQotCQlMaXN0IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1ldGhvZFR5cGU9PVJFQUQpCi0JCQkJbWV0aG9kcy5hZGQocHJvcGVydGllc1tpXS5nZXRHZXR0ZXIoKSk7Ci0JCQllbHNlCi0JCQkJbWV0aG9kcy5hZGQocHJvcGVydGllc1tpXS5nZXRTZXR0ZXIoKSk7CQkJCi0JCX0JCQotCQlyZXR1cm4gKE1ldGhvZFtdKW1ldGhvZHMudG9BcnJheShuZXcgTWV0aG9kW21ldGhvZHMuc2l6ZSgpXSk7Ci0JfQotCQkKLQlwcml2YXRlIE1ldGhvZFtdIGdldFJlYWRNZXRob2RzKE9iamVjdCBlbGVtZW50KSB7CQkKLQkJQ2xhc3MgY2xhenogPSBnZXRSZWxldmFudENsYXNzKGVsZW1lbnQpOwotCQlpZiAoY2xheno9PW51bGwpIHJldHVybiBudWxsOwotCQkKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGdldEludm9jYXRpb25NZXRob2RzKGNsYXp6LCBSRUFEKTsJCQotCQlyZXR1cm4gbWV0aG9kczsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBNZXRob2RbXSBnZXRXcml0ZU1ldGhvZHMgKE9iamVjdCBlbGVtZW50KSB7Ci0JCUNsYXNzIGNsYXp6ID0gZ2V0UmVsZXZhbnRDbGFzcyhlbGVtZW50KTsKLQkJaWYgKGNsYXp6PT1udWxsKSByZXR1cm4gbnVsbDsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGdldEludm9jYXRpb25NZXRob2RzKGNsYXp6LCBXUklURSk7CQkKLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBob29rdXAgKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCU9iamVjdCBrZXkgPSBwYXJlbnQ9PW51bGw/SmF2YUJlYW5UcmVlLnRoaXM6cGFyZW50OwotCQkKLQkJTGlzdGVuZXJTdXBwb3J0IHN1cHBvcnQgPSAoTGlzdGVuZXJTdXBwb3J0KSBsaXN0ZW5lclN1cHBvcnQuZ2V0KGtleSk7Ci0JCWlmIChzdXBwb3J0PT1udWxsKSB7Ci0JCQlzdXBwb3J0ID0gbmV3IExpc3RlbmVyU3VwcG9ydChlbGVtZW50TGlzdGVuZXIpOwotCQkJbGlzdGVuZXJTdXBwb3J0LnB1dChrZXksIHN1cHBvcnQpOwotCQl9CQkJCi0JCXN1cHBvcnQuc2V0SG9va1RhcmdldHMoY2hpbGRyZW4pOwotCQkvLyBUcmFjayBhIGNoaWxkJ3MgaW5kZXgKLQkJdHJhY2tDaGlsZHJlbihwYXJlbnQsIGNoaWxkcmVuKTsKLQl9Ci0JCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAocGFyZW50RWxlbWVudD09bnVsbCkgCi0JCQlyZXR1cm4gcm9vdEVsZW1lbnRzOwotCQkKLQkJCi0JCU1ldGhvZFtdIGdldHRlcnMgPSBnZXRSZWFkTWV0aG9kcyhwYXJlbnRFbGVtZW50KTsKLQkJaWYgKGdldHRlcnM9PW51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0JCQotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0dGVycy5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBsaXN0ID0gZ2V0dGVyc1tpXS5pbnZva2UocGFyZW50RWxlbWVudCwgbmV3IE9iamVjdFswXSk7Ci0JCQkJaWYgKGxpc3QhPW51bGwpIHsKLQkJCQkJaWYgKGdldHRlcnNbaV0uZ2V0UmV0dXJuVHlwZSgpLmlzQXJyYXkoKSkgCQkJCQkKLQkJCQkJCWNoaWxkcmVuLmFkZEFsbChBcnJheXMuYXNMaXN0KChPYmplY3RbXSlsaXN0KSk7Ci0JCQkJCWVsc2UKLQkJCQkJICAgIGNoaWxkcmVuLmFkZEFsbCgoQ29sbGVjdGlvbikgZ2V0dGVyc1tpXS5pbnZva2UocGFyZW50RWxlbWVudCwgbmV3IE9iamVjdFswXSkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsJCi0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwkJCQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsJCQkKLQkJfSAKLQkJT2JqZWN0W10gcmVzdWx0ID0gY2hpbGRyZW4udG9BcnJheSgpOwotCQlob29rdXAocGFyZW50RWxlbWVudCwgcmVzdWx0KTsKLQkJdHJhY2tDaGlsZHJlbihwYXJlbnRFbGVtZW50LCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdHJhY2tDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJT2JqZWN0IGtleSA9IHBhcmVudEVsZW1lbnQ9PW51bGw/SmF2YUJlYW5UcmVlLnRoaXMgOiBwYXJlbnRFbGVtZW50OwotCQlUcmVlTm9kZSBub2RlID0gKFRyZWVOb2RlKSBub2Rlcy5nZXQoa2V5KTsKLQkJU2V0IHJlbW92ZWQgPSBuZXcgSGFzaFNldChub2RlLmdldENoaWxkcmVuKCkpOwotCQlMaXN0IG5ld0xpc3QgPSBjaGlsZHJlbj09bnVsbD8gbmV3IEFycmF5TGlzdCgpOiBBcnJheXMuYXNMaXN0KGNoaWxkcmVuKTsKLQkJaWYgKGNoaWxkcmVuIT1udWxsKQotCQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFyZW1vdmVkLnJlbW92ZShjaGlsZHJlbltpXSkpIHsKLQkJCQkJLy8gbmV3IGNoaWxkCi0JCQkJCVRyZWVOb2RlIGNoaWxkID0gbmV3IFRyZWVOb2RlKHBhcmVudEVsZW1lbnQpOwotCQkJCQlub2Rlcy5wdXQoY2hpbGRyZW5baV0sIGNoaWxkKTsKLQkJCQl9CQkJCQotCQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0cj1yZW1vdmVkLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQotCQkJbm9kZXMucmVtb3ZlKGl0ci5uZXh0KCkpOwotCQlub2RlLnNldENoaWxkcmVuKG5ld0xpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCQlpZiAocGFyZW50RWxlbWVudD09bnVsbCkgCi0JCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbiAoIkNoYW5naW5nIHJvb3QgZWxlbWVudC9zIGlzIG5vdCBzdXBwb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJTWV0aG9kW10gc2V0dGVycyA9IGdldFdyaXRlTWV0aG9kcyhwYXJlbnRFbGVtZW50KTsKLQkJLy8gVE9ETyB3ZSBjYW4gdHJ5IHRvIGZpZ3VyZSBvdXQgKGJ5IHR5cGUpIHdoaWNoIG1ldGhvZHMgdG8gaW52b2tlIG9uIHdoaWNoIG9iamVjdAotCQlpZiAoc2V0dGVycz09bnVsbCB8fCBzZXR0ZXJzLmxlbmd0aCE9MSkKLQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKCJDYW4gbm90IGRldGVybWluZSBjaGlsZHJlbiBzZXQgbWV0aG9kIGZvcjogIitwYXJlbnRFbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJTWV0aG9kIHNldHRlciA9IHNldHRlcnNbMF07Ci0JCUNsYXNzW10gcGFyYW1ldGVycyA9IHNldHRlci5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlPYmplY3QgYXJnOwotCQlpZiAocGFyYW1ldGVyc1swXS5pc0FycmF5KCkpCi0JCQlhcmcgPSBjaGlsZHJlbjsKLQkJZWxzZQotCQkJYXJnID0gQXJyYXlzLmFzTGlzdChjaGlsZHJlbik7CQkKLQkJdHJ5IHsKLQkJCXNldHRlci5pbnZva2UocGFyZW50RWxlbWVudCwgbmV3IE9iamVjdFtdIHsgYXJnIH0gKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsJCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwkKLQkJfQotCQlob29rdXAocGFyZW50RWxlbWVudCwgY2hpbGRyZW4pOwkJCi0JCWlmIChjaGFuZ2VTdXBwb3J0IT1udWxsKQotCQkgICBjaGFuZ2VTdXBwb3J0LmZpcmVUcmVlQ2hhbmdlKENoYW5nZUV2ZW50LlJFUExBQ0UsIG51bGwsIGNoaWxkcmVuLCBwYXJlbnRFbGVtZW50LCAtMSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJcmV0dXJuIChjaGlsZHJlbiE9bnVsbCAmJiBjaGlsZHJlbi5sZW5ndGg+MCk7Ci0JfQotCi0JcHVibGljIENsYXNzW10gZ2V0VHlwZXMoKSB7CQkKLQkJcmV0dXJuIG1vZGVsRGVzY3JpcHRpb24uZ2V0VHlwZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRUcmVlQ2hhbmdlTGlzdGVuZXIoSUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcj09bnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGNoYW5nZVN1cHBvcnQ9PW51bGwpCi0JCQljaGFuZ2VTdXBwb3J0ID0gbmV3IElUcmVlLkNoYW5nZVN1cHBvcnQodGhpcyk7Ci0JCWNoYW5nZVN1cHBvcnQuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyPT1udWxsIHx8IGNoYW5nZVN1cHBvcnQ9PW51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQljaGFuZ2VTdXBwb3J0LnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAobGlzdGVuZXJTdXBwb3J0IT1udWxsKSB7Ci0JCSAgZm9yIChJdGVyYXRvciBpdHI9bGlzdGVuZXJTdXBwb3J0LnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSAKLQkJICAgKChMaXN0ZW5lclN1cHBvcnQpaXRyLm5leHQoKSkuZGlzcG9zZSgpOwotCQkgIGxpc3RlbmVyU3VwcG9ydD1udWxsOwotCQkgIGRlc2NyaXB0b3JzPW51bGw7Ci0JCSAgY2hhbmdlU3VwcG9ydD1udWxsOwotCQkgIG1vZGVsRGVzY3JpcHRpb249bnVsbDsKLQkJfQotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL2JlYW5zL0phdmFCZWFuVXBkYXRhYmxlQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvYmVhbnMvSmF2YUJlYW5VcGRhdGFibGVDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzBmNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvYmVhbnMvSmF2YUJlYW5VcGRhdGFibGVDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLmJlYW5zOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuVXBkYXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUJlYW5VcGRhdGFibGVDb2xsZWN0aW9uIGV4dGVuZHMgVXBkYXRhYmxlIGltcGxlbWVudHMKLQkJSVVwZGF0YWJsZUNvbGxlY3Rpb24gewotCXByaXZhdGUgZmluYWwgT2JqZWN0IG9iamVjdDsKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjb2xsZWN0aW9uTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoIXVwZGF0aW5nKSB7Ci0JCQkJT2JqZWN0W10gdmFsdWVzID0gZ2V0VmFsdWVzKCk7Ci0JCQkJZWxlbWVudExpc3RlbmVyU3VwcG9ydC5zZXRIb29rVGFyZ2V0cyh2YWx1ZXMpOwotCQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5DSEFOR0UsIG51bGwsCi0JCQkJCQludWxsLCBDaGFuZ2VFdmVudC5QT1NJVElPTl9VTktOT1dOKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZWxlbWVudExpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKCF1cGRhdGluZykgewotCQkJCU9iamVjdFtdIHZhbHVlcyA9IGdldFZhbHVlcygpOwotCQkJCWludCBwb3NpdGlvbiA9IEFycmF5cy5hc0xpc3QodmFsdWVzKS5pbmRleE9mKGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJCQlpZihwb3NpdGlvbiE9LTEpewotCQkJCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBldmVudC5nZXRTb3VyY2UoKSwKLQkJCQkJCQlldmVudC5nZXRTb3VyY2UoKSwgcG9zaXRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0aW5nID0gZmFsc2U7Ci0KLQlwcml2YXRlIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQotCXByaXZhdGUgQ2xhc3MgZWxlbWVudFR5cGU9bnVsbDsKLQkKLQlwcml2YXRlIExpc3RlbmVyU3VwcG9ydCBjb2xsZWN0aW9uTGlzdGVuU3VwcG9ydCA9IG5ldyBMaXN0ZW5lclN1cHBvcnQoY29sbGVjdGlvbkxpc3RlbmVyKTsKLQkKLQlwcml2YXRlIExpc3RlbmVyU3VwcG9ydCBlbGVtZW50TGlzdGVuZXJTdXBwb3J0ID0gbmV3IExpc3RlbmVyU3VwcG9ydChlbGVtZW50TGlzdGVuZXIpOwotCQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElkZW50aXR5V3JhcHBlciB7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG87Ci0JCUlkZW50aXR5V3JhcHBlcihPYmplY3QgbykgewotCQkJdGhpcy5vID0gbzsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYob2JqLmdldENsYXNzKCkhPUlkZW50aXR5V3JhcHBlci5jbGFzcykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBvPT0oKElkZW50aXR5V3JhcHBlcilvYmopLm87Ci0JCX0KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBKYXZhQmVhblVwZGF0YWJsZUNvbGxlY3Rpb24oT2JqZWN0IG9iamVjdCwKLQkJCVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBDbGFzcyBlbGVtZW50VHlwZSkgewotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwkKLQkJY29sbGVjdGlvbkxpc3RlblN1cHBvcnQuaG9va0xpc3RlbmVyKHRoaXMub2JqZWN0KTsKLQkJZWxlbWVudExpc3RlbmVyU3VwcG9ydC5zZXRIb29rVGFyZ2V0cyhnZXRWYWx1ZXMoKSk7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5ob29rTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciwgT2JqZWN0IHRhcmdldCkgewotCQlNZXRob2QgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lck1ldGhvZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyTWV0aG9kID0gdGFyZ2V0LmdldENsYXNzKCkuZ2V0TWV0aG9kKAotCQkJCQkicmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IENsYXNzW10geyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzIH0pOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCWlmIChyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyTWV0aG9kICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lck1ldGhvZC5pbnZva2UodGFyZ2V0LAotCQkJCQkJbmV3IE9iamVjdFtdIHsgbGlzdGVuZXIgfSk7Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWVsZW1lbnRMaXN0ZW5lclN1cHBvcnQuZGlzcG9zZSgpOwotCQljb2xsZWN0aW9uTGlzdGVuU3VwcG9ydC5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gZ2V0VmFsdWVzKCkubGVuZ3RoOwotCX0KLQotCQotCXByaXZhdGUgT2JqZWN0IHByaW1HZXRWYWx1ZXMoKSB7Ci0JCXRyeSB7Ci0JCSAgIE1ldGhvZCByZWFkTWV0aG9kID0gZGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0JCQlpZiAoIXJlYWRNZXRob2QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlyZWFkTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVhZE1ldGhvZC5pbnZva2Uob2JqZWN0LCBuZXcgT2JqZWN0WzBdKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQl9Ci0JCUFzc2VydC5pc1RydWUoZmFsc2UsICJDb3VsZCBub3QgcmVhZCBjb2xsZWN0aW9uIHZhbHVlcyIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIE9iamVjdFtdIGdldFZhbHVlcygpIHsKLQkJT2JqZWN0W10gdmFsdWVzID0gbnVsbDsKLQotCQlPYmplY3QgcmVzdWx0ID0gcHJpbUdldFZhbHVlcygpOwotCQlpZiAoZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5pc0FycmF5KCkpCi0JCQl2YWx1ZXMgPSAoT2JqZWN0W10pcmVzdWx0OwotCQllbHNlIHsKLQkJCS8vVE9ETyBhZGQgalVuaXQgZm9yIFBPSk8gKHZhci4gU2V0dGFibGVWYWx1ZSkgY29sbGVjdGlvbnMgIAotCQkJQ29sbGVjdGlvbiBsaXN0ID0gKENvbGxlY3Rpb24pIHJlc3VsdDsKLQkJCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCQl2YWx1ZXMgPSBsaXN0LnRvQXJyYXkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsdWVzID0gbmV3IE9iamVjdFtdIHt9OwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JcHVibGljIGludCBhZGRFbGVtZW50KE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmIChkZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpLmlzQXJyYXkoKSkKLQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJjYW5ub3QgYWRkIGVsZW1lbnRzIik7IC8vJE5PTi1OTFMtMSQJCSAgIAotCQkKLQkJQ29sbGVjdGlvbiBsaXN0ID0gKENvbGxlY3Rpb24pcHJpbUdldFZhbHVlcygpOwotCQlpZiAoaW5kZXggPD0gMCB8fCBpbmRleCA+IGxpc3Quc2l6ZSgpKQotCQkJaW5kZXggPSBsaXN0LnNpemUoKTsKLQkJbGlzdC5hZGQodmFsdWUpOwkKLQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkFERCwgbnVsbCwgdmFsdWUsIGluZGV4KTsKLQkJcmV0dXJuIGluZGV4OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnQoaW50IGluZGV4KSB7Ci0JCWlmIChkZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpLmlzQXJyYXkoKSkKLQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJjYW5ub3QgcmVtb3ZlIGVsZW1lbnRzIik7IC8vJE5PTi1OTFMtMSQJCSAgIAotCQkKLQkJQ29sbGVjdGlvbiBsaXN0ID0gKENvbGxlY3Rpb24pcHJpbUdldFZhbHVlcygpOwotCQlPYmplY3QgbyA9IG51bGw7Ci0JCWludCBpPTA7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7IGkrKykgewotCQkJaWYgKGluZGV4PT1pKSB7Ci0JCQkJbyA9IGl0ZXIubmV4dCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaXRlci5uZXh0KCk7Ci0JCX0KLQkJaWYgKG8hPW51bGwpIHsKLQkJICAgbGlzdC5yZW1vdmUobyk7Ci0JCSAgIGZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5SRU1PVkUsIG8sIG51bGwsIGluZGV4KTsKLQkJfQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSkgewotCQl1cGRhdGluZyA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlPYmplY3RbXSB2YWx1ZXMgPSBnZXRWYWx1ZXMoKTsKLQkJCU9iamVjdCBvbGRWYWx1ZSA9IHZhbHVlc1tpbmRleF07Ci0JCQl2YWx1ZXNbaW5kZXhdID0gdmFsdWU7Ci0JCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBvbGRWYWx1ZSwgdmFsdWUsIGluZGV4KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBnZXRWYWx1ZXMoKVtpbmRleF07Ci0JfQotCi0JcHVibGljIENsYXNzIGdldEVsZW1lbnRUeXBlKCkgewkJCi0JCXJldHVybiBlbGVtZW50VHlwZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9iZWFucy9KYXZhQmVhblVwZGF0YWJsZVRyZWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL2JlYW5zL0phdmFCZWFuVXBkYXRhYmxlVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjBjNmU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL2JlYW5zL0phdmFCZWFuVXBkYXRhYmxlVHJlZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5iZWFuczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5VcGRhdGFibGU7Ci0KLQotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQmVhblVwZGF0YWJsZVRyZWUgZXh0ZW5kcyBVcGRhdGFibGUgaW1wbGVtZW50cyBJVXBkYXRhYmxlVHJlZSB7Ci0JCi0JcHJpdmF0ZSBJVHJlZSB0cmVlOwotCXByaXZhdGUgQ2xhc3NbXSBjbGFzc1R5cGVzOwotCQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZz1mYWxzZTsKLQotCS8vIFRoZSBUcmVlIHVwZGF0YWJsZSByZWxpZXMgb24gdGhlIElUcmVlIHRvIHByb3ZpZGUgY2hhbmdlIG5vdGlmaWNhdGlvbgotCXByaXZhdGUgSUNoYW5nZUxpc3RlbmVyIHRyZWVMaXN0ZW5lciA9IG5ldyBJQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUNoYW5nZShDaGFuZ2VFdmVudCBlKSB7Ci0JCQlpZiAoIXVwZGF0aW5nKSB7Ci0JCQkJdXBkYXRpbmc9dHJ1ZTsgCi0JCQkJdHJ5IHsJCQkJCQotCQkJCQlmaXJlQ2hhbmdlRXZlbnQoZS5nZXRDaGFuZ2VUeXBlKCksIGUuZ2V0T2xkVmFsdWUoKSwgZS5nZXROZXdWYWx1ZSgpLCBlLmdldFBhcmVudCgpLCBlLmdldFBvc2l0aW9uKCkpOwotCQkJCX0gCi0JCQkJZmluYWxseXsKLQkJCQkJdXBkYXRpbmc9ZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdHJlZQotCSAqLwotCXB1YmxpYyBKYXZhQmVhblVwZGF0YWJsZVRyZWUgKElUcmVlIHRyZWUpICB7Ci0JCXRoaXMudHJlZSA9IHRyZWU7CQotCQl0aGlzLmNsYXNzVHlwZXMgPSB0cmVlLmdldFR5cGVzKCk7Ci0JCXRyZWUuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVMaXN0ZW5lcik7CQotCX0KLQkJCi0JcHJpdmF0ZSBPYmplY3RbXSBwcmltUmVtb3ZlRWxlbWVudChPYmplY3RbXSBzb3VyY2UsIGludCBpbmRleCkgewotCQlPYmplY3RbXSBuZXdBcnJheSA9IG5ldyBPYmplY3Rbc291cmNlLmxlbmd0aC0xXTsJCQotCQlTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZSwgMCwgbmV3QXJyYXksIDAsIGluZGV4KTsJCQotCQlTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZSwgaW5kZXgrMSwgbmV3QXJyYXksIGluZGV4LCBzb3VyY2UubGVuZ3RoLWluZGV4KTsKLQkJcmV0dXJuIG5ld0FycmF5OwotCX0KLQkKLQlwcml2YXRlIE9iamVjdFtdIHByaW1BZGRFbGVtZW50KE9iamVjdFtdIHNvdXJjZSwgT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlPYmplY3RbXSBuZXdBcnJheSA9IG5ldyBPYmplY3Rbc291cmNlLmxlbmd0aCsxXTsJCQotCQlTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZSwgMCwgbmV3QXJyYXksIDAsIGluZGV4KTsKLQkJbmV3QXJyYXlbaW5kZXhdPWVsZW1lbnQ7Ci0JCVN5c3RlbS5hcnJheWNvcHkoc291cmNlLCBpbmRleCsxLCBuZXdBcnJheSwgaW5kZXgrMSwgc291cmNlLmxlbmd0aC1pbmRleCk7Ci0JCXJldHVybiBuZXdBcnJheTsKLQl9Ci0KLQlwdWJsaWMgaW50IGFkZEVsZW1lbnQoT2JqZWN0IHBhcmVudEVsZW1lbnQsIGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7Ci0JCXVwZGF0aW5nPXRydWU7Ci0JCXRyeSB7Ci0JCQlPYmplY3RbXSBsaXN0ID0gdHJlZS5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQkJCWlmIChpbmRleCA8PSAwIHx8IGluZGV4ID4gbGlzdC5sZW5ndGgpCi0JCQkJaW5kZXggPSBsaXN0Lmxlbmd0aDsKLQkJCU9iamVjdFtdIG5ld0xpc3QgPSBwcmltQWRkRWxlbWVudChsaXN0LCB2YWx1ZSwgaW5kZXgpOwkKLQkJCXRyZWUuc2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCwgbmV3TGlzdCk7Ci0JCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQURELCBudWxsLCB2YWx1ZSwgcGFyZW50RWxlbWVudCwgaW5kZXgpOwotCQkJcmV0dXJuIGluZGV4OwotCQl9IGZpbmFsbHkgewotCQkJdXBkYXRpbmc9ZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50KE9iamVjdCBwYXJlbnRFbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJdXBkYXRpbmc9dHJ1ZTsKLQkJdHJ5IHsKLQkJCU9iamVjdFtdIGxpc3QgPSB0cmVlLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gbGlzdC5sZW5ndGgpCi0JCQkJcmV0dXJuOwotCi0JCQlPYmplY3QgbyA9IGxpc3RbaW5kZXhdOwotCQkJT2JqZWN0W10gbmV3TGlzdD1wcmltUmVtb3ZlRWxlbWVudChsaXN0LGluZGV4KTsKLQkJCXRyZWUuc2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCwgbmV3TGlzdCk7Ci0JCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuUkVNT1ZFLCBvLCBudWxsLCBwYXJlbnRFbGVtZW50LCBpbmRleCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl1cGRhdGluZz1mYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoT2JqZWN0IHBhcmVudEVsZW1lbnQsIGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7Ci0JCXVwZGF0aW5nID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCU9iamVjdFtdIGxpc3QgPSB0cmVlLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCQkJaWYgKGxpc3Q9PW51bGwgfHwgaW5kZXg8MCB8fCBpbmRleD49bGlzdC5sZW5ndGgpIHJldHVybjsKLQkJCQotCQkJT2JqZWN0IG9sZFZhbHVlID0gbGlzdFtpbmRleF07Ci0JCQlsaXN0W2luZGV4XT0gdmFsdWU7Ci0JCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBvbGRWYWx1ZSwgdmFsdWUsIHBhcmVudEVsZW1lbnQsIGluZGV4KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCX0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdFtdIHZhbHVlcykgewotCQl1cGRhdGluZyA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlPYmplY3RbXSBsaXN0ID0gdHJlZS5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsJCQkKLQkJCXRyZWUuc2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCwgdmFsdWVzKTsJCQkKLQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5SRVBMQUNFLCBsaXN0LCB2YWx1ZXMsIHBhcmVudEVsZW1lbnQsIC0xKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCX0KLQkJCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRFbGVtZW50KE9iamVjdCBwYXJlbnRFbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJT2JqZWN0W10gbGlzdCA9IHRyZWUuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0JCWlmIChsaXN0PT1udWxsIHx8IGluZGV4PDAgfHwgaW5kZXg+PWxpc3QubGVuZ3RoKSByZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiBsaXN0W2luZGV4XTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIHRyZWUuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7CQkKLQl9CQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQl0cmVlLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTGlzdGVuZXIpOwotCQl0cmVlLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRUeXBlcygpIHsKLQkJcmV0dXJuIGNsYXNzVHlwZXM7Ci0JfQotCi0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL2JlYW5zL0phdmFCZWFuVXBkYXRhYmxlVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL2JlYW5zL0phdmFCZWFuVXBkYXRhYmxlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmNmM5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9iZWFucy9KYXZhQmVhblVwZGF0YWJsZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLmJlYW5zOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQmluZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5VcGRhdGFibGVWYWx1ZTsKLQotLyoqCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFCZWFuVXBkYXRhYmxlVmFsdWUgZXh0ZW5kcyBVcGRhdGFibGVWYWx1ZSB7Ci0JcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2JqZWN0OwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0aW5nID0gZmFsc2U7Ci0KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3I7Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgSmF2YUJlYW5VcGRhdGFibGVWYWx1ZShPYmplY3Qgb2JqZWN0LCBQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCQlob29rTGlzdGVuZXIoZGVzY3JpcHRvci5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBob29rTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCF1cGRhdGluZykgewotCQkJCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBldmVudC5nZXRPbGRWYWx1ZSgpLAotCQkJCQkJCWV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJTWV0aG9kIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJNZXRob2QgPSBudWxsOwotCQl0cnkgewotCQkJYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lck1ldGhvZCA9IG9iamVjdC5nZXRDbGFzcygpLmdldE1ldGhvZCgKLQkJCQkJImFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzIH0pOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCWlmIChhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyTWV0aG9kICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lck1ldGhvZC5pbnZva2Uob2JqZWN0LAotCQkJCQkJIG5ldyBPYmplY3RbXSB7IHByb3BlcnR5TmFtZSxsaXN0ZW5lciB9KTsKLQkJCQlyZXR1cm47Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQkvLyBzZXQgbGlzdGVuZXIgdG8gbnVsbCBiZWNhdXNlIHdlIGFyZSBub3QgbGlzdGVuaW5nCi0JCWxpc3RlbmVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJdXBkYXRpbmcgPSB0cnVlOwotCQl0cnkgewotCQkJT2JqZWN0IG9sZFZhbHVlID0gZ2V0VmFsdWUoKTsKLQkJCU1ldGhvZCB3cml0ZU1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRXcml0ZU1ldGhvZCgpOwotCQkJaWYgKCF3cml0ZU1ldGhvZC5pc0FjY2Vzc2libGUoKSkgewotCQkJCXdyaXRlTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCQl9Ci0JCQl3cml0ZU1ldGhvZC5pbnZva2Uob2JqZWN0LAotCQkJCQluZXcgT2JqZWN0W10geyB2YWx1ZSB9KTsKLQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5DSEFOR0UsIG9sZFZhbHVlLCBnZXRWYWx1ZSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl1cGRhdGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJdHJ5IHsKLQkJCU1ldGhvZCByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLQkJCWlmIChyZWFkTWV0aG9kID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbihwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0TmFtZSgpICsgIiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgcmVhZCBtZXRob2QuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICghcmVhZE1ldGhvZC5pc0FjY2Vzc2libGUoKSkgewotCQkJCXJlYWRNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCX0KLQkJCXJldHVybiByZWFkTWV0aG9kLmludm9rZShvYmplY3QsIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJTWV0aG9kIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJNZXRob2QgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyTWV0aG9kID0gb2JqZWN0LmdldENsYXNzKCkKLQkJCQkJCS5nZXRNZXRob2QoInJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCW5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzIH0pOwotCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCS8vIGJlc3QgZWZmb3J0IC0gaWdub3JlCi0JCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCS8vIGJlc3QgZWZmb3J0IC0gaWdub3JlCi0JCQl9Ci0JCQlpZiAocmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lck1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lck1ldGhvZC5pbnZva2Uob2JqZWN0LAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IHByb3BlcnR5RGVzY3JpcHRvci5nZXROYW1lKCksIGxpc3RlbmVyIH0pOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGJlc3QgZWZmb3J0IC0gaWdub3JlCi0JCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGJlc3QgZWZmb3J0IC0gaWdub3JlCi0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGJlc3QgZWZmb3J0IC0gaWdub3JlCi0JCQkJfQotCQkJfQotCQkJLy8gc2V0IGxpc3RlbmVyIHRvIG51bGwgYmVjYXVzZSB3ZSBhcmUgbm8gbG9uZ2VyIGxpc3RlbmluZwotCQkJbGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIENsYXNzIGdldFZhbHVlVHlwZSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9iZWFucy9MaXN0ZW5lclN1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL2JlYW5zL0xpc3RlbmVyU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODFlZGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL2JlYW5zL0xpc3RlbmVyU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5iZWFuczsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSBoZWxwZXIgdGhhdCB3aWxsIGhvb2sgdXAgYW5kIGxpc3RlbiBmb3IgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4gZXZlbnRzCi0gKiBmb3IgYSBzZXQgb2YgdGFyZ2V0IEphdmFCZWFucwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lclN1cHBvcnQgewotCi0JLyoqCi0JICogQHNpbmNlIDMuMgotCSAqLwotCSBzdGF0aWMgY2xhc3MgSWRlbnRpdHlXcmFwcGVyIHsKLQkJZmluYWwgT2JqZWN0IG87Ci0JCUlkZW50aXR5V3JhcHBlcihPYmplY3QgbykgewotCQkJdGhpcy5vID0gbzsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYob2JqLmdldENsYXNzKCkhPUlkZW50aXR5V3JhcHBlci5jbGFzcykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBvPT0oKElkZW50aXR5V3JhcHBlcilvYmopLm87Ci0JCX0KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFNldCBlbGVtZW50c0xpc3RlbmVkVG8gPSBuZXcgSGFzaFNldCgpOwotCQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIgaXMgdGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQKLQkgKiAJCXdoZW4gYSA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBmaXJlZCBvbiBhbnkKLQkgKiAJCW9mIHRoZSB0YXJnZXQgb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXJTdXBwb3J0IChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXI9bGlzdGVuZXI7Ci0JfQotCQotCQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbiB0byB0YXJnZXQgKGlmIGl0IHN1cHBvcnRzIHRoZSBKYXZhQmVhbiBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgcGF0dGVybikKLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICovCi0JcHVibGljIHZvaWQgaG9va0xpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJTWV0aG9kIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJNZXRob2QgPSBudWxsOwotCQl0cnkgewotCQkJYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lck1ldGhvZCA9IHRhcmdldC5nZXRDbGFzcygpLmdldE1ldGhvZCgKLQkJCQkJImFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBDbGFzc1tdIHsgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcyB9KTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlpZiAoYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lck1ldGhvZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJNZXRob2QuaW52b2tlKHRhcmdldCwKLQkJCQkJCW5ldyBPYmplY3RbXSB7IGxpc3RlbmVyIH0pOwotCQkJCWVsZW1lbnRzTGlzdGVuZWRUby5hZGQobmV3IElkZW50aXR5V3JhcHBlcih0YXJnZXQpKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQkJCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycyBmb3IgbmV3IHRhcmdldHMgKHRob3NlIHRoaXMgaW5zdGFuY2Ugb2Y8Y29kZT5MaXN0ZW5lclN1cHBvcnQ8L2NvZGU+IGRvZXMgbm90IAotCSAqIGFscmVhZHkgbGlzdGVuIHRvKSwKLQkgKiBTdG9wIHRvIGxpc3RlbiB0byB0aG9zZSBvYmplY3QgdGhhdCB0aGlzIGluc3RhbmNlIGxpc3RlbiB0byBhbmQgaXMgb25lIG9mIHRoZSBvYmplY3QgaW4gdGFyZ2V0cyAKLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0cyAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb29rVGFyZ2V0cyhPYmplY3RbXSB0YXJnZXRzKSB7CQkKLQkJU2V0IGVsZW1lbnRzVG9Vbmhvb2sgPSBuZXcgSGFzaFNldChlbGVtZW50c0xpc3RlbmVkVG8pOwotCQlpZiAodGFyZ2V0cyE9bnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGFyZ2V0c1tpXTsKLQkJCQlJZGVudGl0eVdyYXBwZXIgaWRlbnRpdHlXcmFwcGVyID0gbmV3IElkZW50aXR5V3JhcHBlcihuZXdWYWx1ZSk7Ci0JCQkJaWYoIWVsZW1lbnRzVG9Vbmhvb2sucmVtb3ZlKGlkZW50aXR5V3JhcHBlcikpIAkJCQkKLQkJCQkJaG9va0xpc3RlbmVyKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50c1RvVW5ob29rLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8uZ2V0Q2xhc3MoKSE9SWRlbnRpdHlXcmFwcGVyLmNsYXNzKQotCQkJCW8gPSBuZXcgSWRlbnRpdHlXcmFwcGVyKG8pOwotCQkJZWxlbWVudHNMaXN0ZW5lZFRvLnJlbW92ZShvKTsKLQkJCXVuaG9va0xpc3RlbmVyKG8pOwotCQl9CQkJCQkJCQotCX0KLQkKLQkvKioKLQkgKiBTdG9wIGxpc3RlbiB0byB0YXJnZXQKLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICovCi0JcHVibGljIHZvaWQgdW5ob29rTGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlpZiAodGFyZ2V0LmdldENsYXNzKCk9PUlkZW50aXR5V3JhcHBlci5jbGFzcykKLQkJCXRhcmdldCA9ICgoSWRlbnRpdHlXcmFwcGVyKXRhcmdldCkubzsKLQkJCi0JCU1ldGhvZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyTWV0aG9kID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJNZXRob2QgPSB0YXJnZXQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoCi0JCQkJCSJyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgQ2xhc3NbXSB7IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3MgfSk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJaWYgKHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJNZXRob2QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyTWV0aG9kLmludm9rZSh0YXJnZXQsCi0JCQkJCQluZXcgT2JqZWN0W10geyBsaXN0ZW5lciB9KTsKLQkJCQllbGVtZW50c0xpc3RlbmVkVG8ucmVtb3ZlKG5ldyBJZGVudGl0eVdyYXBwZXIodGFyZ2V0KSk7Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVsZW1lbnRzTGlzdGVuZWRUbyE9bnVsbCkgewotCQkJT2JqZWN0W10gdGFyZ2V0cyA9IGVsZW1lbnRzTGlzdGVuZWRUby50b0FycmF5KCk7CQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkrKykgewkJCi0JCQkJdW5ob29rTGlzdGVuZXIodGFyZ2V0c1tpXSk7Ci0JCQl9CQkJCi0JCQllbGVtZW50c0xpc3RlbmVkVG89bnVsbDsKLQkJCWxpc3RlbmVyPW51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBlbGVtZW50cyB0aGF0IHdlcmUgcmVnaXN0cmVkIHRvCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEhvb2tlZFRhcmdldHMoKSB7Ci0JCU9iamVjdFtdIHRhcmdldHMgPSBudWxsOwotCQlpZiAoZWxlbWVudHNMaXN0ZW5lZFRvIT1udWxsICYmIGVsZW1lbnRzTGlzdGVuZWRUby5zaXplKCk+MCkgewotCQkJT2JqZWN0W10gaWRlbnRpdHlMaXN0ID0gZWxlbWVudHNMaXN0ZW5lZFRvLnRvQXJyYXkoKTsKLQkJCXRhcmdldHMgPSBuZXcgT2JqZWN0W2lkZW50aXR5TGlzdC5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZGVudGl0eUxpc3QubGVuZ3RoOyBpKyspIAotCQkJCXRhcmdldHNbaV09KChJZGVudGl0eVdyYXBwZXIpaWRlbnRpdHlMaXN0W2ldKS5vOwkJCQkJCQkKLQkJfQotCQlyZXR1cm4gdGFyZ2V0czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9iZWFucy9Qcm9wZXJ0eUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvYmVhbnMvUHJvcGVydHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliMWFjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9iZWFucy9Qcm9wZXJ0eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuYmVhbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5CaW5kaW5nRXhjZXB0aW9uOwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUhlbHBlciB7Ci0JCi0JLyoqCi0JICogbmVzdGVkIHByb3BlcnR5IHNlcGVyYXRvcgotCSAqIFRPRE8gZGlzY3VzcyBuZXN0aW5nIHdpdGggLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZX05FU1RJTkdfU0VQRVJBVE9SID0gIi4iOyAgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nICAgcHJvcGVydHlTdHJpbmc7Ci0JcHJpdmF0ZSBmaW5hbCBDbGFzcyAgICByb290Q2xhc3M7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBwcm9wZXJ0eUxpc3Q7Ci0JIAotCQotCXByaXZhdGUgTWV0aG9kW10gZ2V0dGVyTGlzdD1udWxsOwotCXByaXZhdGUgTWV0aG9kIHNldHRlcj1udWxsOwotCQkKLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqIEBwYXJhbSByb290Q2xhc3MgCi0JICovCi0JcHVibGljIFByb3BlcnR5SGVscGVyKFN0cmluZyBwcm9wZXJ0eSwgQ2xhc3Mgcm9vdENsYXNzKSB7CQkKLQkJcHJvcGVydHlTdHJpbmc9cHJvcGVydHk7Ci0JCVN0cmluZ1Rva2VuaXplciBzdGsgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3BlcnR5LCBQUk9QRVJUWV9ORVNUSU5HX1NFUEVSQVRPUik7Ci0JCXByb3BlcnR5TGlzdCA9IG5ldyBTdHJpbmcgW3N0ay5jb3VudFRva2VucygpXTsJCQotCQlmb3IoaW50IGk9MDsgc3RrLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0JCQlwcm9wZXJ0eUxpc3RbaV09KFN0cmluZylzdGsubmV4dEVsZW1lbnQoKTsKLQkJdGhpcy5yb290Q2xhc3M9cm9vdENsYXNzOwotCX0KLQkJCi0JcHJpdmF0ZSBNZXRob2QgZ2V0R2V0dGVyTWV0aG9kIChDbGFzcyBjLCBTdHJpbmcgcHJvcGVydHkpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJaWYgKGM9PW51bGwgfHwgcHJvcGVydHk9PW51bGwpIAotCQkJcmV0dXJuIG51bGw7Ci0JCU1ldGhvZCBnZXR0ZXI9bnVsbDsKLQkJLy8gVHJ5IGEgdmFuaWxsYSBnZXR0ZXIKLQkJdHJ5IHsKLQkJCWdldHRlciA9IGMuZ2V0TWV0aG9kKAotCQkJCQkiZ2V0IisgcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKSArIHByb3BlcnR5LnN1YnN0cmluZygxKSwgbmV3IENsYXNzWzBdKTsgLy8kTk9OLU5MUy0xJAkJCQotCQl9IAotCQljYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkge30gCi0JCWNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkge30KLQkJCi0JCWlmIChnZXR0ZXI9PW51bGwpIHsKLQkJCS8vIHZhbmlsbGEgYm9vbGVhbjsKLQkJCXRyeSB7Ci0JCQkJZ2V0dGVyID0gYy5nZXRNZXRob2QoCi0JCQkJCQkiaXMiKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEpLCBuZXcgQ2xhc3NbMF0pOyAvLyROT04tTkxTLTEkCi0JCQl9IAotCQkJY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHt9IAotCQkJY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7fQotCQkJCi0JCQlpZiAoZ2V0dGVyPT1udWxsKSAgLy8gYWxsb3cgZm9yIG1ldGhvZCBpbnZvY2F0aW9uCi0JCQkJZ2V0dGVyID0gIGMuZ2V0TWV0aG9kKHByb3BlcnR5LCBuZXcgQ2xhc3NbMF0pOwkJCQotCQl9Ci0JCQotCQlpZiAoZ2V0dGVyIT1udWxsICYmICFnZXR0ZXIuaXNBY2Nlc3NpYmxlKCkpCi0JCQlnZXR0ZXIuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCQotCQlyZXR1cm4gZ2V0dGVyOwkJCi0JfQotCQotCXByaXZhdGUgTWV0aG9kIGdldFNldHRlck1ldGhvZCAoQ2xhc3MgYywgU3RyaW5nIHByb3BlcnR5LCBDbGFzcyBhcmdUeXBlKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCWlmIChjPT1udWxsIHx8IHByb3BlcnR5PT1udWxsKSAKLQkJCXJldHVybiBudWxsOwotCQlNZXRob2Qgc2V0dGVyPW51bGw7Ci0JCXRyeSB7Ci0JCQlzZXR0ZXIgPSBjLmdldE1ldGhvZCgKLQkJCQkJInNldCIrIHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSksIG5ldyBDbGFzc1tdIHsgYXJnVHlwZSB9KTsgLy8kTk9OLU5MUy0xJAotCQl9IAotCQljYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkge30gCi0JCWNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkge30KLQkJaWYgKHNldHRlcj09bnVsbCkgIC8vIGFsbG93IGZvciBtZXRob2QgaW52b2NhdGlvbgotCQkJc2V0dGVyID0gIGMuZ2V0TWV0aG9kKHByb3BlcnR5LCBuZXcgQ2xhc3NbXSB7IGFyZ1R5cGUgfSk7Ci0JCQotCQlpZiAoc2V0dGVyIT1udWxsICYmICFzZXR0ZXIuaXNBY2Nlc3NpYmxlKCkpCi0JCQlzZXR0ZXIuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCQkKLQkJcmV0dXJuIHNldHRlcjsJCQotCX0KLQkKLQlwcml2YXRlIE1ldGhvZFtdIGdldEdldHRlcnMoQ2xhc3Mgcm9vdCkgewotCQlpZiAoZ2V0dGVyTGlzdCE9bnVsbCkKLQkJCXJldHVybiBnZXR0ZXJMaXN0OwotCQkKLQkJZ2V0dGVyTGlzdCA9IG5ldyBNZXRob2RbcHJvcGVydHlMaXN0Lmxlbmd0aF07Ci0JCU1ldGhvZCBnZXR0ZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5TGlzdC5sZW5ndGg7IGkrKykgewkJCi0JCQl0cnkgewotCQkJCWdldHRlciA9IGdldEdldHRlck1ldGhvZChyb290LCBwcm9wZXJ0eUxpc3RbaV0pOwotCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigiSW52YWxpZCBwcm9wZXJ0eTogIitwcm9wZXJ0eVN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQkKLQkJCXJvb3QgPSBnZXR0ZXIuZ2V0UmV0dXJuVHlwZSgpOwotCQkJZ2V0dGVyTGlzdFtpXT1nZXR0ZXI7Ci0JCX0JCQkJCQkJCi0JCXJldHVybiBnZXR0ZXJMaXN0OwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHNldHRlcgotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0U2V0dGVyKCkgewotCQlpZiAoc2V0dGVyIT1udWxsKQotCQkJcmV0dXJuIHNldHRlcjsKLQkJCi0JCU1ldGhvZFtdIGxpc3QgPSBnZXRHZXR0ZXJzKHJvb3RDbGFzcyk7Ci0JCUNsYXNzIHRhcmdldCA9IGxpc3QubGVuZ3RoPjE/IGxpc3RbbGlzdC5sZW5ndGgtMl0uZ2V0UmV0dXJuVHlwZSgpOiByb290Q2xhc3M7Ci0JCXRyeSB7Ci0JCQlzZXR0ZXIgPSBnZXRTZXR0ZXJNZXRob2QodGFyZ2V0LCAKLQkJCQkJCQkJCXByb3BlcnR5TGlzdFtwcm9wZXJ0eUxpc3QubGVuZ3RoLTFdLAotCQkJCQkgICAgICAgICAgICAgICAgbGlzdFtsaXN0Lmxlbmd0aC0xXS5nZXRSZXR1cm5UeXBlKCkpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CQkJCi0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CQkJCQkKLQkJfQotCQlyZXR1cm4gc2V0dGVyOwotCQkKLQl9Ci0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcm9vdAotCSAqIEByZXR1cm4gdmFsdWUgZm9yIHRoZSBnZXQgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qgcm9vdCkgewotCQlyZXR1cm4gZ2V0KHJvb3QsIHByb3BlcnR5TGlzdC5sZW5ndGgtMSk7Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGdldChPYmplY3Qgcm9vdCwgaW50IGxlbmd0aCkgewotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJT2JqZWN0IHJlc3VsdCA9IHJvb3Q7Ci0JCU1ldGhvZCBsaXN0W10gPSBnZXRHZXR0ZXJzKHJvb3RDbGFzcyk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8PSBsZW5ndGg7IGkrKykgewotCQkJCXJlc3VsdCA9IGxpc3RbaV0uaW52b2tlKHJlc3VsdCwgbmV3IE9iamVjdFswXSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNldHRlciBtZXRob2QKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldEdldHRlcigpIHsKLQkJCi0JCQotCQlNZXRob2RbXSBnZXR0ZXJzID0gZ2V0R2V0dGVycyhyb290Q2xhc3MpOwotCQlyZXR1cm4gZ2V0dGVyc1tnZXR0ZXJzLmxlbmd0aC0xXTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHBhcmFtIHJvb3QKLQkgKiBAcGFyYW0gc2luZ2xlQXJnIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChPYmplY3Qgcm9vdCwgT2JqZWN0IHNpbmdsZUFyZykgewotCQlNZXRob2Qgc2V0dGVyID0gZ2V0U2V0dGVyKCk7Ci0JCU9iamVjdCB0YXJnZXQgPSBnZXRMZWFmVGFyZ2V0KHJvb3QpOwotCQlpZiAoc2V0dGVyIT1udWxsICYmIHRhcmdldCE9bnVsbCkKLQkJCXRyeSB7Ci0JCQkJc2V0dGVyLmludm9rZSh0YXJnZXQsIG5ldyBPYmplY3RbXSB7c2luZ2xlQXJnfSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sJCQkJCi0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcm9vdAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIHNldHRlciBpcyBhdmFpbGFibGUgKG5lc3RlZCwgYW5kIG1ldGhvZCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TZXQoT2JqZWN0IHJvb3QpIHsKLQkJcmV0dXJuIGdldFNldHRlcigpIT1udWxsICYmIGdldChyb290LCBwcm9wZXJ0eUxpc3QubGVuZ3RoLTIpIT1udWxsOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcm9vdAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBnZXR0ZXIgaXMgYXZhaWxhYmxlIChuZXN0ZWQgZWxlbWVudCBwcm9wZXJ0eSBtYXkgbm90IGJlIGF2YWlsYWJsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5HZXQoT2JqZWN0IHJvb3QpIHsKLQkJcmV0dXJuIGdldEdldHRlcigpIT1udWxsICYmIGdldChyb290LCBwcm9wZXJ0eUxpc3QubGVuZ3RoLTIpIT1udWxsOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIGZpbmFsIG5lc3RlZCBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGVhZlByb3BlcnR5KCkgewotCQlyZXR1cm4gcHJvcGVydHlMaXN0W3Byb3BlcnR5TGlzdC5sZW5ndGgtMV07Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSByb290Ci0JICogQHJldHVybiAobmVzdGVkKSB0YXJnZXQgb2JqZWN0IAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGVhZlRhcmdldChPYmplY3Qgcm9vdCkgewotCQlpbnQgaW5kZXggPSBwcm9wZXJ0eUxpc3QubGVuZ3RoLTI7Ci0JCWlmIChpbmRleDwwKSByZXR1cm4gcm9vdDsKLQkJcmV0dXJuIGdldChyb290LCBpbmRleCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNTA0ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTIGZpbGUgZm9yIEpGYWNlIERhdGEgQmluZGluZwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotWWVzPVllcwoteWVzPXllcwotTm89Tm8KLW5vPW5vCi1UcnVlPVRydWUKLXRydWU9dHJ1ZQotRmFsc2U9RmFsc2UKLWZhbHNlPWZhbHNlCi1hbmQ9YW5kCi1vcj1vcgotRXhhbXBsZXM9RXhhbXBsZXMKLVZhbHVlQmluZGluZ19FcnJvcldoaWxlU2V0dGluZ1ZhbHVlPUFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNldHRpbmcgdGhlIHZhbHVlLgotVmFsaWRhdGVfQm9vbGVhbkhlbHA9UGxlYXNlIHR5cGUgIlllcyIsICJObyIsICJUcnVlIiwgb3IgIkZhbHNlIgotVmFsaWRhdGVfQ2hhcmFjdGVySGVscD1QbGVhc2UgdHlwZSBhIGNoYXJhY3RlcgotVmFsaWRhdGVfTm9DaGFuZ2VBbGxvd2VkSGVscD1DaGFuZ2VzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIGZpZWxkCi1WYWxpZGF0ZV9SYW5nZVN0YXJ0PVBsZWFzZSBlbnRlciBhIG51bWJlciBiZXR3ZWVuCi1WYWxpZGF0ZV9MaWtlPVBsZWFzZSBlbnRlciBhIG51bWJlciBsaWtlCi1WYWxpZGF0ZV9OdW1iZXJfRXhhbXBsZXM9IDEuMjM0LCAyNTZFLTE1LCA0MgotCi0jIFRoZSBmb2xsb3dpbmcgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZXhwcmVzcyBhbnkgb2Y6IFllcywgeWVzLCBObywgbm8sIFRydWUsIHRydWUsIEZhbHNlLCBmYWxzZQotIyBpbiBib3RoIHBhcnRpYWxseSB2YWxpZCBhbmQgZnVsbHkgdmFsaWQgZm9ybXMuCi1WYWxpZGF0ZV9Cb29sZWFuUGFydGlhbFZhbGlkUmVnZXg9XiR8XlkkfF55JHxeWWUkfF55ZSR8XlllcyR8XnllcyR8XlQkfF50JHxeVHIkfF50ciR8XlRydSR8XnRydSR8XlRydWUkfF50cnVlJHxeTiR8Xm4kfF5ObyR8Xm5vJHxeRiR8XmYkfF5GYSR8XmZhJHxeRmFsJHxeZmFsJHxeRmFscyR8XmZhbHMkfF5GYWxzZSR8XmZhbHNlJAotVmFsaWRhdGVfQm9vbGVhblZhbGlkUmVnZXg9XlllcyR8XnllcyR8Xk5vJHxebm8kfF5UcnVlJHxedHJ1ZSR8XkZhbHNlJHxeZmFsc2UkCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvQXN5bmNSdW5uYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvc3d0L0FzeW5jUnVubmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0OTFiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvQXN5bmNSdW5uYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2lsbCBlbnN1cmUgdGhhdCB0aGUgY29kZSBpbiB0aGUgcnVuKCkgbWV0aG9kIGlzIGV4ZWN1dGVkIGFzeW5jaHJvbm91c2x5IG9uIHRoZSBEaXNwbGF5IHRocmVhZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXN5bmNSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJCi0JLyoqCi0JICogUnVuIHRoZSByZWNlaXZlciBhc3luY2hyb25vdXNseSBvbiB0aGUgRGlzcGxheSB0aHJlYWQKLQkgKiBAcGFyYW0gYURpc3BsYXkgVGhlIGRpc3BsYXkgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcnVuT24oRGlzcGxheSBhRGlzcGxheSl7Ci0JCWlmKGFEaXNwbGF5ID09IERpc3BsYXkuZ2V0Q3VycmVudCgpKXsKLQkJCXJ1bigpOwotCQl9IGVsc2UgewotCQkJYURpc3BsYXkuYXN5bmNFeGVjKHRoaXMpOwotCQl9CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvQnV0dG9uVXBkYXRhYmxlVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9CdXR0b25VcGRhdGFibGVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTQ5ZjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9CdXR0b25VcGRhdGFibGVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlVwZGF0YWJsZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQnV0dG9uVXBkYXRhYmxlVmFsdWUgZXh0ZW5kcyBVcGRhdGFibGVWYWx1ZSB7Ci0KLQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBidXR0b247Ci0KLQlwcml2YXRlIExpc3RlbmVyIHVwZGF0ZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgbmV3IEJvb2xlYW4oYnV0dG9uCi0JCQkJCS5nZXRTZWxlY3Rpb24oKSkpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBwYXJhbSBidXR0b24KLQkgKiBAcGFyYW0gdXBkYXRlUG9saWN5Ci0JICovCi0JcHVibGljIEJ1dHRvblVwZGF0YWJsZVZhbHVlKEJ1dHRvbiBidXR0b24sIGludCB1cGRhdGVQb2xpY3kpIHsKLQkJdGhpcy5idXR0b24gPSBidXR0b247Ci0JCWlmICh1cGRhdGVQb2xpY3kgIT0gU1dULk5vbmUpIHsKLQkJCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB1cGRhdGVMaXN0ZW5lcik7Ci0JCQlidXR0b24uYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIHVwZGF0ZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQlBc3luY1J1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IEFzeW5jUnVubmFibGUoKXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJCWJ1dHRvbi5zZXRTZWxlY3Rpb24odmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogKChCb29sZWFuKSB2YWx1ZSkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgbmV3IEJvb2xlYW4oCi0JCQkJCQlidXR0b24uZ2V0U2VsZWN0aW9uKCkpKTsJCQkJCi0JCQl9Ci0JCX07Ci0JCXJ1bm5hYmxlLnJ1bk9uKGJ1dHRvbi5nZXREaXNwbGF5KCkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCVN5bmNSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBTeW5jUnVubmFibGUoKXsKLQkJCXB1YmxpYyBPYmplY3QgcnVuKCl7Ci0JCQkJcmV0dXJuIG5ldyBCb29sZWFuKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7CQkJCQotCQkJfQotCQl9OwotCQlyZXR1cm4gcnVubmFibGUucnVuT24oYnV0dG9uLmdldERpc3BsYXkoKSk7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldFZhbHVlVHlwZSgpIHsKLQkJcmV0dXJuIGJvb2xlYW4uY2xhc3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvQ0NvbWJvVXBkYXRhYmxlQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvc3d0L0NDb21ib1VwZGF0YWJsZUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1ZTZiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvQ0NvbWJvVXBkYXRhYmxlQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQmluZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5VcGRhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuc3d0LlNXVFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2Vycy5WaWV3ZXJzUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci0KLS8qKgotICogQHNpbmNlIDMuMgotICoKLSAqLwotcHVibGljIGNsYXNzIENDb21ib1VwZGF0YWJsZUNvbGxlY3Rpb24gZXh0ZW5kcyBVcGRhdGFibGUgaW1wbGVtZW50cyBJVXBkYXRhYmxlQ29sbGVjdGlvbiB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBDQ29tYm8gY2NvbWJvOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYXR0cmlidXRlOwotCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0aW5nID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2NvbWJvCi0JICogQHBhcmFtIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBDQ29tYm9VcGRhdGFibGVDb2xsZWN0aW9uKENDb21ibyBjY29tYm8sIFN0cmluZyBhdHRyaWJ1dGUpIHsKLQkJdGhpcy5jY29tYm8gPSBjY29tYm87Ci0JCQotCQkKLQkJaWYgKGF0dHJpYnV0ZS5lcXVhbHMoVmlld2Vyc1Byb3BlcnRpZXMuQ09OVEVOVCkpCi0JCQl0aGlzLmF0dHJpYnV0ZSA9IFNXVFByb3BlcnRpZXMuSVRFTVM7Ci0JCWVsc2UKLQkJCXRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotCQkKLQkJaWYgKHRoaXMuYXR0cmlidXRlLmVxdWFscyhTV1RQcm9wZXJ0aWVzLklURU1TKSkgewotCQkJY2NvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKCF1cGRhdGluZykgewotCQkJCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gY2NvbWJvLmdldEl0ZW1Db3VudCgpOwotCX0KLQotCXB1YmxpYyBpbnQgYWRkRWxlbWVudChPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQl1cGRhdGluZz10cnVlOwkJCi0JCXRyeSB7Ci0JCQlpZiAoaW5kZXg8MCB8fCBpbmRleD5nZXRTaXplKCkpCi0JCQkJaW5kZXg9Z2V0U2l6ZSgpOwotCQkJU3RyaW5nW10gbmV3SXRlbXMgPSBuZXcgU3RyaW5nW2dldFNpemUoKSsxXTsJCQkKLQkJCVN5c3RlbS5hcnJheWNvcHkoY2NvbWJvLmdldEl0ZW1zKCksIDAsIG5ld0l0ZW1zLDAsIGluZGV4KTsKLQkJCW5ld0l0ZW1zW2luZGV4XT0oU3RyaW5nKXZhbHVlOwotCQkJU3lzdGVtLmFycmF5Y29weShjY29tYm8uZ2V0SXRlbXMoKSwgaW5kZXgsIG5ld0l0ZW1zLGluZGV4KzEsIGdldFNpemUoKS1pbmRleCk7Ci0JCQljY29tYm8uc2V0SXRlbXMobmV3SXRlbXMpOwotCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkFERCwgbnVsbCwgdmFsdWUsIGluZGV4KTsKLQkJfQotCQlmaW5hbGx5ewotCQkJdXBkYXRpbmc9ZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGluZGV4OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnQoaW50IGluZGV4KSB7Ci0JCXVwZGF0aW5nPXRydWU7CQkKLQkJdHJ5IHsKLQkJCWlmIChpbmRleDwwIHx8IGluZGV4ID4gZ2V0U2l6ZSgpIC0gMSkKLQkJCQl0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigiUmVxdWVzdCB0byByZW1vdmUgYW4gZWxlbWVudCBvdXQgb2YgdGhlIGNvbGxlY3Rpb24gYm91bmRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJU3RyaW5nW10gbmV3SXRlbXMgPSBuZXcgU3RyaW5nW2dldFNpemUoKS0xXTsKLQkJCVN0cmluZyBvbGQgPSBjY29tYm8uZ2V0SXRlbShpbmRleCk7Ci0JCQlpZiAobmV3SXRlbXMubGVuZ3RoID4gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoY2NvbWJvLmdldEl0ZW1zKCksIDAsIG5ld0l0ZW1zLDAsIGluZGV4KTsKLQkJCQlpZiAoZ2V0U2l6ZSgpIC0gMSA+IGluZGV4KSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoY2NvbWJvLmdldEl0ZW1zKCksIGluZGV4ICsgMSwgbmV3SXRlbXMsIGluZGV4LCBnZXRTaXplKCkgLSBpbmRleCAtIDEpOwotCQkJCX0KLQkJCX0KLQkJCWNjb21iby5zZXRJdGVtcyhuZXdJdGVtcyk7Ci0JCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuUkVNT1ZFLCBvbGQsIG51bGwsIGluZGV4KTsKLQkJfQotCQlmaW5hbGx5ewotCQkJdXBkYXRpbmc9ZmFsc2U7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IGNjb21iby5nZXRJdGVtKGluZGV4KTsKLQkJY2NvbWJvLnNldEl0ZW0oaW5kZXgsIChTdHJpbmcpdmFsdWUpOwotCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBvbGQsIHZhbHVlLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRFbGVtZW50KGludCBpbmRleCkgewotCQlyZXR1cm4gY2NvbWJvLmdldEl0ZW0oaW5kZXgpOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRFbGVtZW50VHlwZSgpIHsKLQkJcmV0dXJuIFN0cmluZy5jbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9DQ29tYm9VcGRhdGFibGVWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvc3d0L0NDb21ib1VwZGF0YWJsZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZGEyNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvc3d0L0NDb21ib1VwZGF0YWJsZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlVwZGF0YWJsZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnN3dC5TV1RQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZpZXdlcnMuVmlld2Vyc1Byb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ0NvbWJvVXBkYXRhYmxlVmFsdWUgZXh0ZW5kcyBVcGRhdGFibGVWYWx1ZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQotCXByaXZhdGUgZmluYWwgQ0NvbWJvIGNjb21ibzsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIGNjb21ibwotCSAqIEBwYXJhbSBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgQ0NvbWJvVXBkYXRhYmxlVmFsdWUoQ0NvbWJvIGNjb21ibywgU3RyaW5nIGF0dHJpYnV0ZSkgewotCQl0aGlzLmNjb21ibyA9IGNjb21ibzsKLQkJdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0JCWlmIChhdHRyaWJ1dGUuZXF1YWxzKFZpZXdlcnNQcm9wZXJ0aWVzLkNPTlRFTlQpKQotCQkJYXR0cmlidXRlID0gU1dUUHJvcGVydGllcy5URVhUOwotCi0JCWlmIChhdHRyaWJ1dGUuZXF1YWxzKFNXVFByb3BlcnRpZXMuU0VMRUNUSU9OKSB8fCAKLQkJCWF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5URVhUKSkgewotCQkJY2NvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKCF1cGRhdGluZykgewotCQkJCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCUFzeW5jUnVubmFibGUgcnVubmFibGUgPSBuZXcgQXN5bmNSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBjY29tYm8uZ2V0VGV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJaWYgKGF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5URVhUKSkgewotCQkJCQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkKLQkJCQkJCQkJOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJY2NvbWJvLnNldFRleHQoc3RyaW5nVmFsdWUpOwotCQkJCQl9IGVsc2UgaWYgKGF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5TRUxFQ1RJT04pKSB7Ci0JCQkJCQlTdHJpbmcgaXRlbXNbXSA9IGNjb21iby5nZXRJdGVtcygpOwotCQkJCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlpZiAodmFsdWUuZXF1YWxzKGl0ZW1zW2ldKSkgewotCQkJCQkJCQkJaW5kZXggPSBpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2NvbWJvLnNlbGVjdChpbmRleCk7IC8vIC0xIHdpbGwgbm90ICJ1bnNlbGVjdCIKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJfQotCQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5DSEFOR0UsIG9sZFZhbHVlLCBjY29tYm8uZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfTsKLQkJcnVubmFibGUucnVuT24oY2NvbWJvLmdldERpc3BsYXkoKSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJU3luY1J1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFN5bmNSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyBPYmplY3QgcnVuKCkgewotCQkJCWlmIChhdHRyaWJ1dGUuZXF1YWxzKFNXVFByb3BlcnRpZXMuVEVYVCkpIAotCQkJCQlyZXR1cm4gY2NvbWJvLmdldFRleHQoKTsKLQkJCQkKLQkJCQlBc3NlcnQuaXNUcnVlKGF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5TRUxFQ1RJT04pLAotCQkJCQkJInVuZXhwZWN0ZWQgYXR0cmlidXRlOiAiICsgYXR0cmlidXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIFRoZSBwcm9ibGVtIHdpdGggYSBjY29tYm8sIGlzIHRoYXQgaXQgY2hhbmdlcyB0aGUgdGV4dCBhbmQKLQkJCQkvLyBmaXJlcyBiZWZvcmUgaXQgdXBkYXRlIGl0cyBzZWxlY3Rpb24gaW5kZXgKLQkJCQlyZXR1cm4gY2NvbWJvLmdldFRleHQoKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIHJ1bm5hYmxlLnJ1bigpOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKSB7Ci0JCUFzc2VydC5pc1RydWUoYXR0cmlidXRlLmVxdWFscyhTV1RQcm9wZXJ0aWVzLlRFWFQpCi0JCQkJfHwgYXR0cmlidXRlLmVxdWFscyhTV1RQcm9wZXJ0aWVzLlNFTEVDVElPTiksCi0JCQkJInVuZXhwZWN0ZWQgYXR0cmlidXRlOiAiICsgYXR0cmlidXRlKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gU3RyaW5nLmNsYXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvc3d0L0NvbWJvVXBkYXRhYmxlQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvc3d0L0NvbWJvVXBkYXRhYmxlQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGY0MDEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9Db21ib1VwZGF0YWJsZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkJpbmRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuVXBkYXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnN3dC5TV1RQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZpZXdlcnMuVmlld2Vyc1Byb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21ib1VwZGF0YWJsZUNvbGxlY3Rpb24gZXh0ZW5kcyBVcGRhdGFibGUgaW1wbGVtZW50cyBJVXBkYXRhYmxlQ29sbGVjdGlvbiB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBDb21ibyBjb21ibzsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIGNvbWJvCi0JICogQHBhcmFtIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBDb21ib1VwZGF0YWJsZUNvbGxlY3Rpb24oQ29tYm8gY29tYm8sIFN0cmluZyBhdHRyaWJ1dGUpIHsKLQkJdGhpcy5jb21ibyA9IGNvbWJvOwotCQkKLQkJCi0JCWlmIChhdHRyaWJ1dGUuZXF1YWxzKFZpZXdlcnNQcm9wZXJ0aWVzLkNPTlRFTlQpKQotCQkJdGhpcy5hdHRyaWJ1dGUgPSBTV1RQcm9wZXJ0aWVzLklURU1TOwotCQllbHNlCi0JCQl0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLQkJCi0JCWlmICh0aGlzLmF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5JVEVNUykpIHsKLQkJCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKCF1cGRhdGluZykgewotCQkJCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gY29tYm8uZ2V0SXRlbUNvdW50KCk7Ci0JfQotCi0JcHVibGljIGludCBhZGRFbGVtZW50KE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCXVwZGF0aW5nPXRydWU7CQkKLQkJdHJ5IHsKLQkJCWlmIChpbmRleDwwIHx8IGluZGV4PmdldFNpemUoKSkKLQkJCQlpbmRleD1nZXRTaXplKCk7Ci0JCQlTdHJpbmdbXSBuZXdJdGVtcyA9IG5ldyBTdHJpbmdbZ2V0U2l6ZSgpKzFdOwkJCQotCQkJU3lzdGVtLmFycmF5Y29weShjb21iby5nZXRJdGVtcygpLCAwLCBuZXdJdGVtcywwLCBpbmRleCk7Ci0JCQluZXdJdGVtc1tpbmRleF09KFN0cmluZyl2YWx1ZTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoY29tYm8uZ2V0SXRlbXMoKSwgaW5kZXgsIG5ld0l0ZW1zLGluZGV4KzEsIGdldFNpemUoKS1pbmRleCk7Ci0JCQljb21iby5zZXRJdGVtcyhuZXdJdGVtcyk7Ci0JCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQURELCBudWxsLCB2YWx1ZSwgaW5kZXgpOwotCQl9Ci0JCWZpbmFsbHl7Ci0JCQl1cGRhdGluZz1mYWxzZTsKLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJdXBkYXRpbmc9dHJ1ZTsJCQotCQl0cnkgewotCQkJaWYgKGluZGV4PDAgfHwgaW5kZXggPiBnZXRTaXplKCkgLSAxKQotCQkJCXRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKCJSZXF1ZXN0IHRvIHJlbW92ZSBhbiBlbGVtZW50IG91dCBvZiB0aGUgY29sbGVjdGlvbiBib3VuZHMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlTdHJpbmdbXSBuZXdJdGVtcyA9IG5ldyBTdHJpbmdbZ2V0U2l6ZSgpLTFdOwotCQkJU3RyaW5nIG9sZCA9IGNvbWJvLmdldEl0ZW0oaW5kZXgpOwotCQkJU3lzdGVtLmFycmF5Y29weShjb21iby5nZXRJdGVtcygpLCAwLCBuZXdJdGVtcywwLCBpbmRleCk7Ci0JCQlpZiAobmV3SXRlbXMubGVuZ3RoID4gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoY29tYm8uZ2V0SXRlbXMoKSwgMCwgbmV3SXRlbXMsMCwgaW5kZXgpOwotCQkJCWlmIChnZXRTaXplKCkgLSAxID4gaW5kZXgpIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShjb21iby5nZXRJdGVtcygpLCBpbmRleCArIDEsIG5ld0l0ZW1zLCBpbmRleCwgZ2V0U2l6ZSgpIC0gaW5kZXggLSAxKTsKLQkJCQl9Ci0JCQl9Ci0JCQljb21iby5zZXRJdGVtcyhuZXdJdGVtcyk7Ci0JCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuUkVNT1ZFLCBvbGQsIG51bGwsIGluZGV4KTsKLQkJfQotCQlmaW5hbGx5ewotCQkJdXBkYXRpbmc9ZmFsc2U7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IGNvbWJvLmdldEl0ZW0oaW5kZXgpOwotCQljb21iby5zZXRJdGVtKGluZGV4LCAoU3RyaW5nKXZhbHVlKTsKLQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgb2xkLCB2YWx1ZSwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldEl0ZW0oaW5kZXgpOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRFbGVtZW50VHlwZSgpIHsKLQkJcmV0dXJuIFN0cmluZy5jbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9Db21ib1VwZGF0YWJsZVZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvQ29tYm9VcGRhdGFibGVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzI5YTRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9Db21ib1VwZGF0YWJsZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlVwZGF0YWJsZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnN3dC5TV1RQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZpZXdlcnMuVmlld2Vyc1Byb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9VcGRhdGFibGVWYWx1ZSBleHRlbmRzIFVwZGF0YWJsZVZhbHVlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCi0JcHJpdmF0ZSBmaW5hbCBDb21ibyBjb21ibzsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIGNvbWJvCi0JICogQHBhcmFtIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBDb21ib1VwZGF0YWJsZVZhbHVlKENvbWJvIGNvbWJvLCBTdHJpbmcgYXR0cmlidXRlKSB7Ci0JCXRoaXMuY29tYm8gPSBjb21ibzsKLQkJdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0JCWlmIChhdHRyaWJ1dGUuZXF1YWxzKFZpZXdlcnNQcm9wZXJ0aWVzLkNPTlRFTlQpKQotCQkJYXR0cmlidXRlID0gU1dUUHJvcGVydGllcy5URVhUOwotCi0JCWlmIChhdHRyaWJ1dGUuZXF1YWxzKFNXVFByb3BlcnRpZXMuVEVYVCkKLQkJCQl8fCBhdHRyaWJ1dGUuZXF1YWxzKFNXVFByb3BlcnRpZXMuU0VMRUNUSU9OKSkgewotCQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAoIXVwZGF0aW5nKSB7Ci0JCQkJCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBudWxsLCBudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJQXN5bmNSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBBc3luY1J1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVN0cmluZyBvbGRWYWx1ZSA9IGNvbWJvLmdldFRleHQoKTsKLQkJCQl0cnkgewotCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCWlmIChhdHRyaWJ1dGUuZXF1YWxzKFNXVFByb3BlcnRpZXMuVEVYVCkpIHsKLQkJCQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpCi0JCQkJCQkJCTogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbWJvLnNldFRleHQoc3RyaW5nVmFsdWUpOwotCQkJCQl9IGVsc2UgaWYgKGF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5TRUxFQ1RJT04pKSB7Ci0JCQkJCQlTdHJpbmcgaXRlbXNbXSA9IGNvbWJvLmdldEl0ZW1zKCk7Ci0JCQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQkJCWlmIChpdGVtcyAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCWlmICh2YWx1ZS5lcXVhbHMoaXRlbXNbaV0pKSB7Ci0JCQkJCQkJCQlpbmRleCA9IGk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQljb21iby5zZWxlY3QoaW5kZXgpOyAvLyAtMSB3aWxsIG5vdCAidW5zZWxlY3QiCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCX0KLQkJCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBvbGRWYWx1ZSwgY29tYm8uZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfTsKLQkJcnVubmFibGUucnVuT24oY29tYm8uZ2V0RGlzcGxheSgpKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlTeW5jUnVubmFibGUgcnVubmFibGUgPSBuZXcgU3luY1J1bm5hYmxlKCkgewotCQkJcHVibGljIE9iamVjdCBydW4oKSB7Ci0JCQkJaWYgKGF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5URVhUKSkKLQkJCQkJcmV0dXJuIGNvbWJvLmdldFRleHQoKTsKLQotCQkJCUFzc2VydC5pc1RydWUoYXR0cmlidXRlLmVxdWFscyhTV1RQcm9wZXJ0aWVzLlNFTEVDVElPTiksCi0JCQkJCQkidW5leHBlY3RlZCBhdHRyaWJ1dGUiICsgYXR0cmlidXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJaWYgKGluZGV4ID49IDApCi0JCQkJCXJldHVybiBjb21iby5nZXRJdGVtKGluZGV4KTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIHJ1bm5hYmxlLnJ1bigpOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKSB7Ci0JCUFzc2VydC5pc1RydWUoYXR0cmlidXRlLmVxdWFscyhTV1RQcm9wZXJ0aWVzLlRFWFQpCi0JCQkJfHwgYXR0cmlidXRlLmVxdWFscyhTV1RQcm9wZXJ0aWVzLlNFTEVDVElPTiksCi0JCQkJInVuZXhwZWN0ZWQgYXR0cmlidXRlIiArIGF0dHJpYnV0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIFN0cmluZy5jbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9Db250cm9sVXBkYXRhYmxlVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9Db250cm9sVXBkYXRhYmxlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmNGU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvQ29udHJvbFVwZGF0YWJsZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlVwZGF0YWJsZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnN3dC5TV1RQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQHNpbmNlIDMuMgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xVcGRhdGFibGVWYWx1ZSBleHRlbmRzIFVwZGF0YWJsZVZhbHVlIHsKLQotCXByaXZhdGUgZmluYWwgQ29udHJvbCBjb250cm9sOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZTsKLQotCS8qKgotCSAqIEBwYXJhbSBjb250cm9sCi0JICogQHBhcmFtIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBDb250cm9sVXBkYXRhYmxlVmFsdWUoQ29udHJvbCBjb250cm9sLCBTdHJpbmcgYXR0cmlidXRlKSB7Ci0JCXRoaXMuY29udHJvbCA9IGNvbnRyb2w7Ci0JCXRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotCQlpZiAoIWF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5FTkFCTEVEKSAmJiAhYXR0cmlidXRlLmVxdWFscyhTV1RQcm9wZXJ0aWVzLlZJU0lCTEUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0IG9sZFZhbHVlID0gZ2V0VmFsdWUoKTsKLQkJaWYgKGF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5FTkFCTEVEKSkgewotCQkJY29udHJvbC5zZXRFbmFibGVkKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfSBlbHNlIGlmIChhdHRyaWJ1dGUuZXF1YWxzKFNXVFByb3BlcnRpZXMuVklTSUJMRSkpIHsKLQkJCWNvbnRyb2wuc2V0VmlzaWJsZSgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgb2xkVmFsdWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW4oYXR0cmlidXRlLmVxdWFscyhTV1RQcm9wZXJ0aWVzLkVOQUJMRUQpID8gY29udHJvbC5nZXRFbmFibGVkKCkgOiBjb250cm9sLmdldFZpc2libGUoKSk7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldFZhbHVlVHlwZSgpIHsKLQkJcmV0dXJuIEJvb2xlYW4uVFlQRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9MYWJlbFVwZGF0YWJsZVZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvTGFiZWxVcGRhdGFibGVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzRiYzk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9MYWJlbFVwZGF0YWJsZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuVXBkYXRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogQHNpbmNlIDMuMgotICoKLSAqLwotcHVibGljIGNsYXNzIExhYmVsVXBkYXRhYmxlVmFsdWUgZXh0ZW5kcyBVcGRhdGFibGVWYWx1ZSB7Ci0KLQlwcml2YXRlIGZpbmFsIExhYmVsIGxhYmVsOwotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIExhYmVsVXBkYXRhYmxlVmFsdWUoTGFiZWwgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQlBc3luY1J1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IEFzeW5jUnVubmFibGUoKXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJCVN0cmluZyBvbGRWYWx1ZSA9IGxhYmVsLmdldFRleHQoKTsKLQkJCQlsYWJlbC5zZXRUZXh0KHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgb2xkVmFsdWUsIGxhYmVsLmdldFRleHQoKSk7CQkKLQkJCX0KLQkJfTsJCi0JCXJ1bm5hYmxlLnJ1bk9uKGxhYmVsLmdldERpc3BsYXkoKSk7Ci0JfQotIAotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCQotCQlTeW5jUnVubmFibGUgcnVubmFibGUgPSBuZXcgU3luY1J1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgT2JqZWN0IHJ1bigpewotCQkJCXJldHVybiBsYWJlbC5nZXRUZXh0KCk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBydW5uYWJsZS5ydW5PbihsYWJlbC5nZXREaXNwbGF5KCkpOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKSB7Ci0JCXJldHVybiBTdHJpbmcuY2xhc3M7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvc3d0L0xpc3RVcGRhdGFibGVDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvTGlzdFVwZGF0YWJsZUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4OWJhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvTGlzdFVwZGF0YWJsZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlVwZGF0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5zd3QuU1dUUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52aWV3ZXJzLlZpZXdlcnNQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci0KLS8qKgotICogQHNpbmNlIDMuMgotICoKLSAqLwotcHVibGljIGNsYXNzIExpc3RVcGRhdGFibGVDb2xsZWN0aW9uIGV4dGVuZHMgVXBkYXRhYmxlIGltcGxlbWVudHMgSVVwZGF0YWJsZUNvbGxlY3Rpb24gewotCQotCXByaXZhdGUgZmluYWwgTGlzdCBsaXN0OwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYXR0cmlidXRlOwotCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0aW5nID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEBwYXJhbSBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgTGlzdFVwZGF0YWJsZUNvbGxlY3Rpb24oTGlzdCBsaXN0LCBTdHJpbmcgYXR0cmlidXRlKSB7Ci0JCXRoaXMubGlzdCA9IGxpc3Q7Ci0JCQotCQkKLQkJaWYgKGF0dHJpYnV0ZS5lcXVhbHMoVmlld2Vyc1Byb3BlcnRpZXMuQ09OVEVOVCkpCi0JCQl0aGlzLmF0dHJpYnV0ZSA9IFNXVFByb3BlcnRpZXMuSVRFTVM7Ci0JCWVsc2UKLQkJCXRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotCQkKLQkJaWYgKHRoaXMuYXR0cmlidXRlLmVxdWFscyhTV1RQcm9wZXJ0aWVzLklURU1TKSkgewotCQkJLy9UT0RPIExpc3QgZG9lcyBub3QgZmlyZSBhbnkgZXZlbnQgd2hlbiBpdGVtcyBhcmUgY2hhbmdlZC4KLS8vCQkJbGlzdC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0vLwkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLS8vCQkJCQlpZiAoIXVwZGF0aW5nKSB7Ci0vLwkJCQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5DSEFOR0UsIG51bGwsIG51bGwpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfSk7Ci0JCX0KLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIGxpc3QuZ2V0SXRlbUNvdW50KCk7Ci0JfQotCi0JcHVibGljIGludCBhZGRFbGVtZW50KE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCXVwZGF0aW5nPXRydWU7CQkKLQkJdHJ5IHsKLQkJCWlmIChpbmRleDwwIHx8IGluZGV4PmdldFNpemUoKSkKLQkJCQlpbmRleD1nZXRTaXplKCk7Ci0JCQlTdHJpbmdbXSBuZXdJdGVtcyA9IG5ldyBTdHJpbmdbZ2V0U2l6ZSgpKzFdOwkJCQotCQkJU3lzdGVtLmFycmF5Y29weShsaXN0LmdldEl0ZW1zKCksIDAsIG5ld0l0ZW1zLDAsIGluZGV4KTsKLQkJCW5ld0l0ZW1zW2luZGV4XT0oU3RyaW5nKXZhbHVlOwotCQkJU3lzdGVtLmFycmF5Y29weShsaXN0LmdldEl0ZW1zKCksIGluZGV4LCBuZXdJdGVtcyxpbmRleCsxLCBnZXRTaXplKCktaW5kZXgpOwotCQkJbGlzdC5zZXRJdGVtcyhuZXdJdGVtcyk7Ci0JCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQURELCBudWxsLCB2YWx1ZSwgaW5kZXgpOwotCQl9Ci0JCWZpbmFsbHl7Ci0JCQl1cGRhdGluZz1mYWxzZTsKLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJdXBkYXRpbmc9dHJ1ZTsJCQotCQl0cnkgewotCQkJaWYgKGluZGV4PDAgfHwgaW5kZXg+Z2V0U2l6ZSgpKQotCQkJCWluZGV4PWdldFNpemUoKTsKLQkJCVN0cmluZ1tdIG5ld0l0ZW1zID0gbmV3IFN0cmluZ1tnZXRTaXplKCktMV07Ci0JCQlTdHJpbmcgb2xkID0gbGlzdC5nZXRJdGVtKGluZGV4KTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobGlzdC5nZXRJdGVtcygpLCAwLCBuZXdJdGVtcywwLCBpbmRleCk7CQkJCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3QuZ2V0SXRlbXMoKSwgaW5kZXgsIG5ld0l0ZW1zLGluZGV4LTEsIGdldFNpemUoKS1pbmRleCk7CQkJCi0JCQlsaXN0LnNldEl0ZW1zKG5ld0l0ZW1zKTsKLQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5SRU1PVkUsIG9sZCwgbnVsbCwgaW5kZXgpOwotCQl9Ci0JCWZpbmFsbHl7Ci0JCQl1cGRhdGluZz1mYWxzZTsKLQkJfQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gbGlzdC5nZXRJdGVtKGluZGV4KTsKLQkJbGlzdC5zZXRJdGVtKGluZGV4LCAoU3RyaW5nKXZhbHVlKTsKLQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgb2xkLCB2YWx1ZSwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGxpc3QuZ2V0SXRlbShpbmRleCk7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldEVsZW1lbnRUeXBlKCkgewotCQlyZXR1cm4gU3RyaW5nLmNsYXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvc3d0L0xpc3RVcGRhdGFibGVWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvc3d0L0xpc3RVcGRhdGFibGVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWNiNzE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9MaXN0VXBkYXRhYmxlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuVXBkYXRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuc3d0LlNXVFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGlzdFVwZGF0YWJsZVZhbHVlIGV4dGVuZHMgVXBkYXRhYmxlVmFsdWUgewotCi0JLyoqCi0JICogCi0JICovCi0KLQlwcml2YXRlIGZpbmFsIExpc3QgbGlzdDsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcGFyYW0gYXR0cmlidXRlCi0JICovCi0JcHVibGljIExpc3RVcGRhdGFibGVWYWx1ZShMaXN0IGxpc3QsIFN0cmluZyBhdHRyaWJ1dGUpIHsKLQkJdGhpcy5saXN0ID0gbGlzdDsKLQkJdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0JCQotCQlpZiAoKGxpc3QuZ2V0U3R5bGUoKSZTV1QuTVVMVEkpPjApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTV1QuU0lOR0xFIHN1cHBvcnQgb25seSBmb3IgYSBMaXN0IHNlbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoYXR0cmlidXRlLmVxdWFscyhTV1RQcm9wZXJ0aWVzLlNFTEVDVElPTikpIHsKLQkJCWxpc3QuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCl7CQkJCi0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKCF1cGRhdGluZykgewotCQkJCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgbnVsbCk7Ci0JCQkJCX0JCQotCQkJCX0KLQkJCQotCQkJfSk7Ci0JCX0gZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSBudWxsOwotCQlpZiAobGlzdC5nZXRTZWxlY3Rpb24oKSE9bnVsbCAmJiBsaXN0LmdldFNlbGVjdGlvbigpLmxlbmd0aD4wKQotCQkJb2xkVmFsdWUgPSBsaXN0LmdldFNlbGVjdGlvbigpWzBdOwotCQl0cnkgewotCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJaWYgKGF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5TRUxFQ1RJT04pKSB7Ci0JCQkJU3RyaW5nIGl0ZW1zW10gPSBsaXN0LmdldEl0ZW1zKCk7Ci0JCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAodmFsdWUuZXF1YWxzKGl0ZW1zW2ldKSkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlsaXN0LnNlbGVjdChpbmRleCk7IC8vIC0xIHdpbGwgbm90ICJ1bnNlbGVjdCIKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl1cGRhdGluZyA9IGZhbHNlOwotCQl9Ci0JCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5DSEFOR0UsIG9sZFZhbHVlLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShhdHRyaWJ1dGUuZXF1YWxzKFNXVFByb3BlcnRpZXMuU0VMRUNUSU9OKSwKLQkJCQkidW5leHBlY3RlZCBhdHRyaWJ1dGUiICsgYXR0cmlidXRlKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA+PSAwKQotCQkJcmV0dXJuIGxpc3QuZ2V0SXRlbShpbmRleCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKSB7Ci0JCUFzc2VydC5pc1RydWUoYXR0cmlidXRlLmVxdWFscyhTV1RQcm9wZXJ0aWVzLlNFTEVDVElPTiksCi0JCQkJInVuZXhwZWN0ZWQgYXR0cmlidXRlIiArIGF0dHJpYnV0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIFN0cmluZy5jbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9TcGlubmVyVXBkYXRhYmxlVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9TcGlubmVyVXBkYXRhYmxlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyZWEwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvU3Bpbm5lclVwZGF0YWJsZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlVwZGF0YWJsZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnN3dC5TV1RQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3Bpbm5lclVwZGF0YWJsZVZhbHVlIGV4dGVuZHMgVXBkYXRhYmxlVmFsdWUgewotCi0JcHJpdmF0ZSBmaW5hbCBTcGlubmVyIHNwaW5uZXI7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRpbmcgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBwYXJhbSBzcGlubmVyCi0JICogQHBhcmFtIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBTcGlubmVyVXBkYXRhYmxlVmFsdWUoU3Bpbm5lciBzcGlubmVyLCBTdHJpbmcgYXR0cmlidXRlKSB7Ci0JCXRoaXMuc3Bpbm5lciA9IHNwaW5uZXI7Ci0JCXRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotCQlpZiAoYXR0cmlidXRlLmVxdWFscyhTV1RQcm9wZXJ0aWVzLlNFTEVDVElPTikpIHsKLQkJCXNwaW5uZXIuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAoIXVwZGF0aW5nKSB7Ci0JCQkJCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBudWxsLCBudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGVsc2UgaWYgKCFhdHRyaWJ1dGUuZXF1YWxzKFNXVFByb3BlcnRpZXMuTUlOKQotCQkJCSYmICFhdHRyaWJ1dGUuZXF1YWxzKFNXVFByb3BlcnRpZXMuTUFYKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIkF0dHJpYnV0ZSBuYW1lIG5vdCB2YWxpZDogIiArIGF0dHJpYnV0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQlBc3luY1J1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IEFzeW5jUnVubmFibGUoKXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJCWludCBvbGRWYWx1ZTsKLQkJCQlpbnQgbmV3VmFsdWU7Ci0JCQkJdHJ5IHsKLQkJCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCQluZXdWYWx1ZSA9ICgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCk7Ci0JCQkJCWlmIChhdHRyaWJ1dGUuZXF1YWxzKFNXVFByb3BlcnRpZXMuU0VMRUNUSU9OKSkgewotCQkJCQkJb2xkVmFsdWUgPSBzcGlubmVyLmdldFNlbGVjdGlvbigpOwotCQkJCQkJc3Bpbm5lci5zZXRTZWxlY3Rpb24obmV3VmFsdWUpOwotCQkJCQl9IGVsc2UgaWYgKGF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5NSU4pKSB7Ci0JCQkJCQlvbGRWYWx1ZSA9IHNwaW5uZXIuZ2V0TWluaW11bSgpOwotCQkJCQkJc3Bpbm5lci5zZXRNaW5pbXVtKG5ld1ZhbHVlKTsKLQkJCQkJfSBlbHNlIGlmIChhdHRyaWJ1dGUuZXF1YWxzKFNXVFByb3BlcnRpZXMuTUFYKSkgewotCQkJCQkJb2xkVmFsdWUgPSBzcGlubmVyLmdldE1heGltdW0oKTsKLQkJCQkJCXNwaW5uZXIuc2V0TWF4aW11bShuZXdWYWx1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiaW52YWxpZCBhdHRyaWJ1dGUgbmFtZToiICsgYXR0cmlidXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5DSEFOR0UsIG5ldyBJbnRlZ2VyKAotCQkJCQkJCW9sZFZhbHVlKSwgbmV3IEludGVnZXIobmV3VmFsdWUpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCX0JCQkJCi0JCQl9Ci0JCX07Ci0JCXJ1bm5hYmxlLnJ1bk9uKHNwaW5uZXIuZ2V0RGlzcGxheSgpKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlTeW5jUnVubmFibGUgcnVubmFibGUgPSBuZXcgU3luY1J1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgT2JqZWN0IHJ1bigpewotCQkJCWludCB2YWx1ZSA9IDA7Ci0JCQkJaWYgKGF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5TRUxFQ1RJT04pKSB7Ci0JCQkJCXZhbHVlID0gc3Bpbm5lci5nZXRTZWxlY3Rpb24oKTsKLQkJCQl9IGVsc2UgaWYgKGF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5NSU4pKSB7Ci0JCQkJCXZhbHVlID0gc3Bpbm5lci5nZXRNaW5pbXVtKCk7Ci0JCQkJfSBlbHNlIGlmIChhdHRyaWJ1dGUuZXF1YWxzKFNXVFByb3BlcnRpZXMuTUFYKSkgewotCQkJCQl2YWx1ZSA9IHNwaW5uZXIuZ2V0TWF4aW11bSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IEludGVnZXIodmFsdWUpOwkJCQkKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIHJ1bm5hYmxlLnJ1bk9uKHNwaW5uZXIuZ2V0RGlzcGxheSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlKCkgewotCQlyZXR1cm4gSW50ZWdlci5jbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9TeW5jUnVubmFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9TeW5jUnVubmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1NWFjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvU3luY1J1bm5hYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBjb2RlIGluIHRoZSBydW4oKSBtZXRob2QgaXMgZXhlY3V0ZWQgc3luY2hyb25vdXNseSBvbiB0aGUgRGlzcGxheSB0aHJlYWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN5bmNSdW5uYWJsZSB7Ci0JCi0JcHJpdmF0ZSBPYmplY3QgcmVzdWx0OwotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvZGUgdGhhdCBpcyBndWFyYW50ZWVkIHRvIHJ1biBvbiB0aGUgRGlzcGxheSB0aHJlYWQKLQkgKiBAcmV0dXJuIE9iamVjdCAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IHJ1bigpOwotCQotCS8qKgotCSAqIEBwYXJhbSBhRGlzcGxheQotCSAqIEByZXR1cm4gT2JqZWN0IHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgcnVuKCkgbWV0aG9kCi0JICovCi0JcHVibGljIGZpbmFsIE9iamVjdCBydW5PbihEaXNwbGF5IGFEaXNwbGF5KXsKLQkJaWYoYURpc3BsYXkgPT0gRGlzcGxheS5nZXRDdXJyZW50KCkpewotCQkJcmVzdWx0ID0gcnVuKCk7Ci0JCX0gZWxzZSB7Ci0JCQlhRGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCQkJcmVzdWx0ID0gU3luY1J1bm5hYmxlLnRoaXMucnVuKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9UYWJsZVVwZGF0YWJsZVZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvVGFibGVVcGRhdGFibGVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzA2YmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9UYWJsZVVwZGF0YWJsZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuVXBkYXRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuc3d0LlNXVFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZVVwZGF0YWJsZVZhbHVlIGV4dGVuZHMgVXBkYXRhYmxlVmFsdWUgewotCi0JcHJpdmF0ZSBmaW5hbCBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIHRhYmxlCi0JICogQHBhcmFtIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBUYWJsZVVwZGF0YWJsZVZhbHVlKFRhYmxlIHRhYmxlLCBTdHJpbmcgYXR0cmlidXRlKSB7Ci0JCXRoaXMudGFibGUgPSB0YWJsZTsKLQkJaWYgKGF0dHJpYnV0ZS5lcXVhbHMoU1dUUHJvcGVydGllcy5TRUxFQ1RJT04pKSB7Ci0JCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAoIXVwZGF0aW5nKSB7Ci0JCQkJCQlmaXJlQ2hhbmdlRXZlbnQoIENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQl0cnkgewotCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJdGFibGUuc2V0U2VsZWN0aW9uKCgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBuZXcgSW50ZWdlcih0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlKCkgewotCQlyZXR1cm4gSW50ZWdlci5jbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9UZXh0VXBkYXRhYmxlVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3N3dC9UZXh0VXBkYXRhYmxlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFlMmJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy9zd3QvVGV4dFVwZGF0YWJsZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlVwZGF0YWJsZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGV4dFVwZGF0YWJsZVZhbHVlIGV4dGVuZHMgVXBkYXRhYmxlVmFsdWUgewotCi0JcHJpdmF0ZSBmaW5hbCBUZXh0IHRleHQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRpbmcgPSBmYWxzZTsKLQotCXByaXZhdGUgaW50IHVwZGF0ZVBvbGljeTsKLQkKLQlwcml2YXRlIFN0cmluZyBidWZmZXJlZFZhbHVlOwkKLQkKLQlwcml2YXRlIExpc3RlbmVyIHZhbGlkYXRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoIXVwZGF0aW5nKSB7Ci0JCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgdGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXIgdXBkYXRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoIXVwZGF0aW5nKSB7Ci0JCQkJU3RyaW5nIG9sZFZhbHVlID0gYnVmZmVyZWRWYWx1ZTsKLQkJCQlTdHJpbmcgbmV3VmFsdWUgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQkKLQkJCQkvLyBJZiB3ZSBhcmUgdXBkYXRpbmcgb24gZm9jdXMgbG9zdCB0aGVuIHdoZW4gd2UgZmlyZSB0aGUgY2hhbmdlIGV2ZW50IGNoYW5nZSB0aGUgYnVmZmVyZWQgdmFsdWUJCQkJCi0JCQkJaWYgKHVwZGF0ZVBvbGljeSA9PSBTV1QuRm9jdXNPdXQpewotCQkJCQlidWZmZXJlZFZhbHVlID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghb2xkVmFsdWUuZXF1YWxzKG5ld1ZhbHVlKSkgewotCQkJCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgdGV4dC5nZXRUZXh0KCkpOwkJCQkJCQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgdGV4dC5nZXRUZXh0KCkpOwkJCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIFZlcmlmeUxpc3RlbmVyIHZlcmlmeUxpc3RlbmVyOwotCQotCXByaXZhdGUgS2V5TGlzdGVuZXIga2V5TGlzdGVuZXI7IAotCi0JLyoqCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gdXBkYXRlUG9saWN5Ci0JICovCi0JcHVibGljIFRleHRVcGRhdGFibGVWYWx1ZShmaW5hbCBUZXh0IHRleHQsIGludCB1cGRhdGVQb2xpY3kpIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJdGhpcy51cGRhdGVQb2xpY3kgPSB1cGRhdGVQb2xpY3k7Ci0JCWlmICh1cGRhdGVQb2xpY3kgIT0gU1dULk5vbmUpIHsKLQkJCXRleHQuYWRkTGlzdGVuZXIodXBkYXRlUG9saWN5LCB1cGRhdGVMaXN0ZW5lcik7Ci0JCX0KLQkJLy8gSWYgdGhlIHVwZGF0ZSBwb2xpY3kgaXMgVElNRV9FQVJMWSB0aGVuIHRoZSBtb2RlbCBpcyBub3RpZmllZCBvZiBjaGFuZ2VkIG9uIGtleSBzdHJva2UgYnkga2V5IHN0cm9rZQotCQkvLyBXaGVuIGVzY2FwZSBpcyBwcmVzc2VkIHdlIG5lZWQgdG8gcm9sbGJhY2sgdG8gdGhlIHByZXZpb3VzIHZhbHVlIHdoaWNoIGlzIGRvbmUgd2l0aCBhIGtleSBsaXN0ZW5lciwgaG93ZXZlcgotCQkvLyB0aGUgYnVmZmVyZWRWYWx1ZSAodGhlIGxhc3QgcmVtZW1iZXJlZCBjaGFuZ2UgdmFsdWUpIG11c3QgYmUgY2hhbmdlZCBvbiBmb2N1cyBsb3N0Ci0JCWlmKHVwZGF0ZVBvbGljeSA9PSBTV1QuTW9kaWZ5KXsKLQkJCXRleHQuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBuZXcgTGlzdGVuZXIoKXsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCl7Ci0JCQkJCWlmKCF1cGRhdGluZyl7Ci0JCQkJCQlidWZmZXJlZFZhbHVlID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQkJCi0JCXZlcmlmeUxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCF1cGRhdGluZykgewotCQkJCQlTdHJpbmcgY3VycmVudFRleHQgPSBUZXh0VXBkYXRhYmxlVmFsdWUudGhpcy50ZXh0LmdldFRleHQoKTsKLQkJCQkJU3RyaW5nIG5ld1RleHQgPSBjdXJyZW50VGV4dC5zdWJzdHJpbmcoMCwgZS5zdGFydCkgKyBlLnRleHQKLQkJCQkJCQkrIGN1cnJlbnRUZXh0LnN1YnN0cmluZyhlLmVuZCk7Ci0JCQkJCUNoYW5nZUV2ZW50IGNoYW5nZUV2ZW50ID0gZmlyZUNoYW5nZUV2ZW50KAotCQkJCQkJCUNoYW5nZUV2ZW50LlZFUklGWSwgY3VycmVudFRleHQsIG5ld1RleHQpOwotCQkJCQlpZiAoY2hhbmdlRXZlbnQuZ2V0VmV0bygpKSB7Ci0JCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCWtleUxpc3RlbmVyID0gbmV3IEtleUxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZihlLmNoYXJhY3RlciA9PSBTV1QuRVNDICYmIGJ1ZmZlcmVkVmFsdWUgIT0gbnVsbCl7Ci0JCQkJCS8vIFJldmVydCB0aGUgdmFsdWUgaW4gdGhlIHRleHQgZmllbGQgdG8gdGhlIG1vZGVsIHZhbHVlCi0JCQkJCXRleHQuc2V0VGV4dChidWZmZXJlZFZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7CQotCQkJfQotCQl9OwotCQl0ZXh0LmFkZEtleUxpc3RlbmVyKGtleUxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCi0JCUFzeW5jUnVubmFibGUgcnVubmFibGUgPSBuZXcgQXN5bmNSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQkJU3RyaW5nIG9sZFZhbHVlID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCQlidWZmZXJlZFZhbHVlID0gKFN0cmluZyl2YWx1ZTsJCQkJCQotCQkJCQl0ZXh0LnNldFRleHQodmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCX0KLQkJCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBvbGRWYWx1ZSwgdGV4dC5nZXRUZXh0KCkpOwkJCQkKLQkJCX0KLQkJfTsKLQkJcnVubmFibGUucnVuT24odGV4dC5nZXREaXNwbGF5KCkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCVN5bmNSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBTeW5jUnVubmFibGUoKXsKLQkJCXB1YmxpYyBPYmplY3QgcnVuKCkgewotCQkJCXJldHVybiB0ZXh0LmdldFRleHQoKTsKLQkJCX0JCQkKLQkJfTsKLQkJcmV0dXJuIHJ1bm5hYmxlLnJ1bk9uKHRleHQuZ2V0RGlzcGxheSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlKCkgewotCQlyZXR1cm4gU3RyaW5nLmNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICghdGV4dC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICh1cGRhdGVQb2xpY3kgIT0gU1dULk5vbmUpIHsKLQkJCQl0ZXh0LnJlbW92ZUxpc3RlbmVyKHVwZGF0ZVBvbGljeSwgdXBkYXRlTGlzdGVuZXIpOwotCQkJfQotCQkJdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3ZpZXdlcnMvU3RydWN0dXJlZFZpZXdlclVwZGF0YWJsZVZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy92aWV3ZXJzL1N0cnVjdHVyZWRWaWV3ZXJVcGRhdGFibGVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDIyMmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3ZpZXdlcnMvU3RydWN0dXJlZFZpZXdlclVwZGF0YWJsZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5VcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52aWV3ZXJzLlZpZXdlcnNQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dC5Bc3luY1J1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnN3dC5TeW5jUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci0KLS8qKgotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVmlld2VyVXBkYXRhYmxlVmFsdWUgZXh0ZW5kcyBVcGRhdGFibGVWYWx1ZSB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYXR0cmlidXRlOwotCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0aW5nID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVmlld2VyVXBkYXRhYmxlVmFsdWUoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIsCi0JCQlTdHJpbmcgYXR0cmlidXRlKSB7Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCQl0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLQkJaWYgKGF0dHJpYnV0ZS5lcXVhbHMoVmlld2Vyc1Byb3BlcnRpZXMuU0lOR0xFX1NFTEVDVElPTikpIHsKLQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKCF1cGRhdGluZykgewotCQkJCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkNIQU5HRSwgbnVsbCwgZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJBdHRyaWJ1dGUgbmFtZSBub3QgdmFsaWQ6ICIgKyBhdHRyaWJ1dGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJQXN5bmNSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBBc3luY1J1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCQl0cnkgewotCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCWlmIChhdHRyaWJ1dGUuZXF1YWxzKFZpZXdlcnNQcm9wZXJ0aWVzLlNJTkdMRV9TRUxFQ1RJT04pKSB7Ci0JCQkJCQlPYmplY3Qgb2xkVmFsdWU9IGdldFZhbHVlKCk7Ci0JCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHZhbHVlID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZCi0JCQkJCQkJCTogbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odmFsdWUpKTsKLQkJCQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5DSEFOR0UsIG9sZFZhbHVlLCBnZXRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlydW5uYWJsZS5ydW5Pbih2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJU3luY1J1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFN5bmNSdW5uYWJsZSgpewotCQkJcHVibGljIE9iamVjdCBydW4oKXsKLQkJCQlpZiAoYXR0cmlidXRlLmVxdWFscyhWaWV3ZXJzUHJvcGVydGllcy5TSU5HTEVfU0VMRUNUSU9OKSkgewotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJCXJldHVybiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7CQkJCQotCQkJfQotCQl9OwotCQlyZXR1cm4gcnVubmFibGUucnVuT24odmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkpOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKSB7Ci0JCUFzc2VydC5pc1RydWUoYXR0cmlidXRlLmVxdWFscyhWaWV3ZXJzUHJvcGVydGllcy5TSU5HTEVfU0VMRUNUSU9OKSwgInVuZXhwZWN0ZWQgYXR0cmlidXRlOiAiICsgYXR0cmlidXRlKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvdmlld2Vycy9UYWJsZVZpZXdlclVwZGF0YWJsZUNvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3ZpZXdlcnMvVGFibGVWaWV3ZXJVcGRhdGFibGVDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMTUzMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvdmlld2Vycy9UYWJsZVZpZXdlclVwZGF0YWJsZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5VcGRhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuc3d0LkFzeW5jUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuc3d0LlN5bmNSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogQHNpbmNlIDMuMgotICogVE9ETzogcmF0aGVyIHRoYW4gbWFpbnRhaW5pbmcgaXRzIG93biBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzLCBpdCBzaG91bGQgdXNlIHRoZSBtb2RlbCBzaWRlIG9mIHRoZSBiaW5kaW5nIGRpcmVjdGx5IGFzIHRoZSB2aWV3ZXIncyBtb2RlbAotICogKHRob3VnaCBJJ20gYXNzdW1pbmcgdGhlIHZpZXdlciBjb2xsZWN0aW9uIGlzIGJlaW5nIHVzZWQgYXMgdGhlIHRhcmdldCBpbiB0aGlzIGNhc2UpLiAgCi0gKiBOb3RlIHRoYXQgQ29sbGVjdGlvbkJpbmRpbmcgY29waWVzIG9uZSBhdCBhIHRpbWUgZnJvbSB0aGUgbW9kZWwgdG8gdGhlIHRhcmdldCBhcyB3ZWxsLgotICovCi1wdWJsaWMgY2xhc3MgVGFibGVWaWV3ZXJVcGRhdGFibGVDb2xsZWN0aW9uIGV4dGVuZHMgVXBkYXRhYmxlIGltcGxlbWVudHMKLQkJSVVwZGF0YWJsZUNvbGxlY3Rpb24gewotCi0JcHJpdmF0ZSBmaW5hbCBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0KLQlwcml2YXRlIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIFRhYmxlVmlld2VyVXBkYXRhYmxlQ29sbGVjdGlvbihUYWJsZVZpZXdlciB2aWV3ZXIpIHsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiBlbGVtZW50cy50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCi0JCQkJCU9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiBlbGVtZW50cy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgYWRkRWxlbWVudChmaW5hbCBPYmplY3QgZWxlbWVudCwgZmluYWwgaW50IGluZGV4KXsKLQkJU3luY1J1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFN5bmNSdW5uYWJsZSgpewotCQkJcHVibGljIE9iamVjdCBydW4oKXsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoaW50ZXJuYWxBZGRFbGVtZW50KGVsZW1lbnQsaW5kZXgpKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuICgoSW50ZWdlcilydW5uYWJsZS5ydW5Pbih2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSkpLmludFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgaW50ZXJuYWxBZGRFbGVtZW50KE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJaW50IHBvc2l0aW9uID0gcHJpbUFkZEVsZW1lbnQoZWxlbWVudCwgaW5kZXgpOwotCQlpZiAocG9zaXRpb24gPT0gZWxlbWVudHMuc2l6ZSgpIC0gMSB8fCB2aWV3ZXIuZ2V0U29ydGVyKCkgIT0gbnVsbCkKLQkJCXZpZXdlci5hZGQoZWxlbWVudCk7Ci0JCWVsc2UKLQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCXJldHVybiBwb3NpdGlvbjsKLQl9Ci0KLQlwcml2YXRlIGludCBwcmltQWRkRWxlbWVudChPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCWludCBwb3NpdGlvbjsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IGVsZW1lbnRzLnNpemUoKSkgewotCQkJcG9zaXRpb24gPSBlbGVtZW50cy5zaXplKCk7Ci0JCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQllbGVtZW50cy5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCQkJcG9zaXRpb24gPSBpbmRleDsKLQkJfQotCQlyZXR1cm4gcG9zaXRpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnQoZmluYWwgaW50IGluZGV4KXsKLQkJLy8gRXZlbiB0aG91Z2ggdGhpcyBjb3VsZCBiZSBydW4gQXN5bmMgYmVjYXVzZSB3ZSBkb24ndCBuZWVkIGEgcmVzdWx0LCB3ZSBtdXN0IHJ1biBpdCBzeW5jIG90aGVyd2lzZQotCQkvLyBpdCByYWNlcyBhZ2FpbnN0IHRoZSBzeW5jIGNvZGUgaW4gYWRkRWxlbWVudCguLi4pCi0JCVN5bmNSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBTeW5jUnVubmFibGUoKXsKLQkJCXB1YmxpYyBPYmplY3QgcnVuKCl7Ci0JCQkJaW50ZXJuYWxSZW1vdmVFbGVtZW50KGluZGV4KTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcnVubmFibGUucnVuT24odmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGludGVybmFsUmVtb3ZlRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50cy5yZW1vdmUoaW5kZXgpOwotCQl2aWV3ZXIucmVtb3ZlKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgZWxlbWVudCkgewotCQlBc3luY1J1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IEFzeW5jUnVubmFibGUoKXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJCWlmIChlbGVtZW50cy5nZXQoaW5kZXgpLmVxdWFscyhlbGVtZW50KSkgewotCQkJCQl2aWV3ZXIudXBkYXRlKGVsZW1lbnQsIG51bGwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludGVybmFsUmVtb3ZlRWxlbWVudChpbmRleCk7Ci0JCQkJCWludGVybmFsQWRkRWxlbWVudChlbGVtZW50LCBpbmRleCk7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfTsKLQkJcnVubmFibGUucnVuT24odmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGVsZW1lbnRzLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldEVsZW1lbnRUeXBlKCkgewotCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvdmlld2Vycy9UYWJsZVZpZXdlclVwZGF0YWJsZUNvbGxlY3Rpb25FeHRlbmRlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvdmlld2Vycy9UYWJsZVZpZXdlclVwZGF0YWJsZUNvbGxlY3Rpb25FeHRlbmRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzAxMWM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3ZpZXdlcnMvVGFibGVWaWV3ZXJVcGRhdGFibGVDb2xsZWN0aW9uRXh0ZW5kZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLmRhdGFiaW5kaW5nLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JRGF0YUJpbmRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcnMuSWRlbnRpdHlDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2Vycy5UYWJsZVZpZXdlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZpZXdlcnMuVGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuYmVhbnMuUHJvcGVydHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZVZpZXdlclVwZGF0YWJsZUNvbGxlY3Rpb25FeHRlbmRlZCBleHRlbmRzCi0JCVRhYmxlVmlld2VyVXBkYXRhYmxlQ29sbGVjdGlvbiB7Ci0JCi0JY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzCi0JCQlJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIENvbHVtbiBjb2x1bW4pIHsKLQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBjb2x1bW4uZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQlpZiAocHJvcGVydHlOYW1lID09IG51bGwpIAotCQkJCXJldHVybiBlbGVtZW50OwotCQkJCi0JCQlPYmplY3QgdmFsdWUgPSB0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmdldENlbGxNb2RpZmllcigpLmdldFZhbHVlKAotCQkJCQllbGVtZW50LCBwcm9wZXJ0eU5hbWUpOwotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJcHJpdmF0ZSBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGVsZW1lbnQsIENvbHVtbiBjb2x1bW4pIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGdldFZhbHVlKGVsZW1lbnQsIGNvbHVtbik7Ci0JCQlPYmplY3QgY29udmVydGVkVmFsdWUgPSBjb2x1bW4uZ2V0Q29udmVydGVyKCkuY29udmVydE1vZGVsVG9UYXJnZXQoCi0JCQkJCXZhbHVlKTsKLQkJCXJldHVybiBjb252ZXJ0ZWRWYWx1ZTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlpZiAoY29sdW1uSW5kZXggPCB0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmdldENvbHVtbkNvdW50KCkKLQkJCQkJJiYgY29sdW1uSW5kZXggPj0gMCkgewotCQkJCUNvbHVtbiBjb2x1bW4gPSBnZXRDb2x1bW4oY29sdW1uSW5kZXgpOwotCQkJCUlDb252ZXJ0ZXIgY29udmVydGVyID0gY29sdW1uLmdldENvbnZlcnRlcigpOwotCQkJCWlmIChjb252ZXJ0ZXIuZ2V0VGFyZ2V0VHlwZSgpLmVxdWFscyhWaWV3ZXJMYWJlbC5jbGFzcykpIHsKLQkJCQkJVmlld2VyTGFiZWwgdmlld2VyTGFiZWwgPSAoVmlld2VyTGFiZWwpIGdldENvbnZlcnRlZFZhbHVlKAotCQkJCQkJCWVsZW1lbnQsIGNvbHVtbik7Ci0JCQkJCXJldHVybiB2aWV3ZXJMYWJlbC5nZXRJbWFnZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCU9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoY29sdW1uSW5kZXggPCB0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmdldENvbHVtbkNvdW50KCkKLQkJCQkJJiYgY29sdW1uSW5kZXggPj0gMCkgewotCQkJCUNvbHVtbiBjb2x1bW4gPSBnZXRDb2x1bW4oY29sdW1uSW5kZXgpOwotCQkJCWNvbnZlcnRlZFZhbHVlID0gZ2V0Q29udmVydGVkVmFsdWUoZWxlbWVudCwgY29sdW1uKTsKLQkJCQlJQ29udmVydGVyIGNvbnZlcnRlciA9IGNvbHVtbi5nZXRDb252ZXJ0ZXIoKTsKLQkJCQlpZiAoY29udmVydGVyLmdldFRhcmdldFR5cGUoKS5lcXVhbHMoVmlld2VyTGFiZWwuY2xhc3MpKSB7Ci0JCQkJCVZpZXdlckxhYmVsIHZpZXdlckxhYmVsID0gKFZpZXdlckxhYmVsKSBjb252ZXJ0ZWRWYWx1ZTsKLQkJCQkJcmV0dXJuIHZpZXdlckxhYmVsLmdldFRleHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY29udmVydGVkVmFsdWUgPT0gbnVsbCA/ICIiIDogKFN0cmluZykgY29udmVydGVkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIEluIGNhc2UgdGhhdCBubyBUcmVlQ29sdW1uKCkgd2FzIGFkZGVkIHRvIHRoZSB2aXN1YWwKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q29sdW1uSW1hZ2UoZWxlbWVudCwgMCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRDb2x1bW5UZXh0KGVsZW1lbnQsIDApOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIFRhYmxlVmlld2VyRGVzY3JpcHRpb24gdGFibGVWaWV3ZXJEZXNjcmlwdGlvbjsKLQkJCQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciB0YWJsZUxhYmVsUHJvdmlkZXIgPSBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKCk7IAotCi0JcHJpdmF0ZSBJRGF0YUJpbmRpbmdDb250ZXh0IGRhdGFCaW5kaW5nQ29udGV4dDsKLQotCXByaXZhdGUgaW50IHVwZGF0ZVRpbWU7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBJQ2hhbmdlTGlzdGVuZXIgZHVtbXlMaXN0ZW5lciA9IG5ldyBJQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUNoYW5nZShDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudCkgewotCQl9Ci0JfTsKLQkJCi0JLyoqCi0JICogQHBhcmFtIHRhYmxlVmlld2VyRGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGF0YUJpbmRpbmdDb250ZXh0IAotIAkgKiBAcGFyYW0gdXBkYXRlVGltZSAKLQkgKi8KLQlwdWJsaWMgVGFibGVWaWV3ZXJVcGRhdGFibGVDb2xsZWN0aW9uRXh0ZW5kZWQoCi0JCQlUYWJsZVZpZXdlckRlc2NyaXB0aW9uIHRhYmxlVmlld2VyRGVzY3JpcHRpb24sIElEYXRhQmluZGluZ0NvbnRleHQgZGF0YUJpbmRpbmdDb250ZXh0LCBpbnQgdXBkYXRlVGltZSkgewotCQlzdXBlcih0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmdldFRhYmxlVmlld2VyKCkpOwotCQl0aGlzLnVwZGF0ZVRpbWUgPSB1cGRhdGVUaW1lOwotCQl0aGlzLnRhYmxlVmlld2VyRGVzY3JpcHRpb24gPSB0YWJsZVZpZXdlckRlc2NyaXB0aW9uOwotCQlmaWxsRGVzY3JpcHRpb25EZWZhdWx0cyhkYXRhQmluZGluZ0NvbnRleHQpOwotCQlUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IHRhYmxlVmlld2VyRGVzY3JpcHRpb24uZ2V0VGFibGVWaWV3ZXIoKTsKLQkJLy8gVE9ETyBzeW5jaHJvbml6ZSBjb2x1bW5zIG9uIHRoZSB3aWRnZXQgc2lkZSAoY3JlYXRlIG1pc3NpbmcgY29sdW1ucywKLQkJLy8gc2V0IG5hbWUgaWYgbm90IGFscmVhZHkgc2V0KQotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHRhYmxlTGFiZWxQcm92aWRlcik7Ci0JCXRhYmxlVmlld2VyLnNldENlbGxNb2RpZmllcih0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmdldENlbGxNb2RpZmllcigpKTsKLQkJaW50IGNvbHVtbkNvdW50ID0gdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5nZXRDb2x1bW5Db3VudCgpOwotCQlTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzID0gbmV3IFN0cmluZ1tjb2x1bW5Db3VudF07Ci0JCUNlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW2NvbHVtbkNvdW50XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCQlDb2x1bW4gY29sdW1uID0gdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5nZXRDb2x1bW4oaSk7Ci0JCQljb2x1bW5Qcm9wZXJ0aWVzW2ldID0gY29sdW1uLmdldFByb3BlcnR5TmFtZSgpOwotCQkJaWYoY29sdW1uLmlzRWRpdGFibGUoKSl7Ci0JCQkJY2VsbEVkaXRvcnNbaV0gPSBjb2x1bW4uZ2V0Q2VsbEVkaXRvcigpOwotCQkJfQotCQl9Ci0JCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0JCXRhYmxlVmlld2VyLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENlbGxFZGl0b3IgY3JlYXRlQ2VsbEVkaXRvcihmaW5hbCBDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3IodGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5nZXRUYWJsZVZpZXdlcigpLmdldFRhYmxlKCkpIHsJCQkJCi0JCQlwcm90ZWN0ZWQgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQkJCXN1cGVyLmRvU2V0VmFsdWUoIGNvbHVtbi5nZXRDb252ZXJ0ZXIoKS5jb252ZXJ0TW9kZWxUb1RhcmdldCh2YWx1ZSkpOwotCQkJfQotCQkJcHJvdGVjdGVkIE9iamVjdCBkb0dldFZhbHVlKCkgewotCQkJCVN0cmluZyB0ZXh0VmFsdWUgPSAoU3RyaW5nKXN1cGVyLmRvR2V0VmFsdWUoKTsKLQkJCQlyZXR1cm4gY29sdW1uLmdldENvbnZlcnRlcigpLmNvbnZlcnRUYXJnZXRUb01vZGVsKHRleHRWYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgSUNlbGxNb2RpZmllciBjcmVhdGVDZWxsTW9kaWZpZXIoZmluYWwgSURhdGFCaW5kaW5nQ29udGV4dCBkYXRhQmluZGluZ0NvbnRleHQpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCQkJcHJpdmF0ZSBDb2x1bW4gZmluZENvbHVtbihTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlVmlld2VyRGVzY3JpcHRpb24uZ2V0Q29sdW1uQ291bnQoKTsgaSsrKSB7Ci0JCQkJCUNvbHVtbiBjb2x1bW4gPSB0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmdldENvbHVtbihpKTsKLQkJCQkJaWYgKGNvbHVtbi5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQkJCQlyZXR1cm4gY29sdW1uOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCUNvbHVtbiBjb2x1bW4gPSBmaW5kQ29sdW1uKHByb3BlcnR5KTsKLQkJCQlyZXR1cm4gY29sdW1uICE9IG51bGwgJiYgY29sdW1uLmlzRWRpdGFibGUoKTsKLQkJCX0KLQotCQkJcHJpdmF0ZSBMaXN0IGdldE5lc3RlZFBvcnBlcnRpZXMgKFN0cmluZyBwcm9wZXJ0aWVzKSB7CQotCQkJCS8vVE9ETyBqVW5pdCBmb3IgbmVzdGVkIGNvbHVtbgotCQkJCVN0cmluZ1Rva2VuaXplciBzdGsgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3BlcnRpZXMsVGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5DT0xVTU5fUFJPUEVSVFlfTkVTVElOR19TRVBFUkFUT1IpOwotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qoc3RrLmNvdW50VG9rZW5zKCkpOwotCQkJCXdoaWxlKHN0ay5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJCWxpc3QuYWRkKHN0ay5uZXh0RWxlbWVudCgpKTsKLQkJCQlyZXR1cm4gbGlzdDsJCQkJCQotCQkJfQotCQkJCi0JCQlwcml2YXRlIE9iamVjdCBnZXRHZXR0ZXJWYWx1ZShPYmplY3Qgcm9vdCwgTGlzdCBwcm9wZXJ0aWVzKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQlPYmplY3QgcmVzdWx0PXJvb3Q7CQkJCQkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJaWYgKHJlc3VsdD09bnVsbCkgcmV0dXJuIG51bGw7Ci0JCQkJCVN0cmluZyBwcm9wID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJCU1ldGhvZCBnZXR0ZXIgPSByZXN1bHQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoCi0JCQkJCQkJImdldCIrIHByb3Auc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKSArIHByb3Auc3Vic3RyaW5nKDEpLCBuZXcgQ2xhc3NbMF0pOyAvLyROT04tTkxTLTEkCi0JCQkJCXJlc3VsdD1nZXR0ZXIuaW52b2tlKHJlc3VsdCwgbmV3IE9iamVjdFswXSk7CQkJCQkJCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCUNvbHVtbiBjb2x1bW4gPSBmaW5kQ29sdW1uKHByb3BlcnR5KTsKLQkJCQlpZiAoY29sdW1uID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXRyeSB7CQkJCQkJCi0JCQkJCXJldHVybiBnZXRHZXR0ZXJWYWx1ZShlbGVtZW50LGdldE5lc3RlZFBvcnBlcnRpZXMocHJvcGVydHkpKTsKLQkJCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE8gbG9nCi0JCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETyBsb2cKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIGxvZwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIGxvZwotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIGxvZwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQkJCUNvbHVtbiBjb2x1bW4gPSBmaW5kQ29sdW1uKHByb3BlcnR5KTsKLQkJCQlpZiAoY29sdW1uID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEl0ZW0pIHsKLQkJCQkJZWxlbWVudCA9ICgoSXRlbSkgZWxlbWVudCkuZ2V0RGF0YSgpOwotCQkJCX0KLQkJCQlJVmFsaWRhdG9yIGNvbHVtblZhbGlkYXRvciA9IGNvbHVtbi5nZXRWYWxpZGF0b3IoKTsKLQkJCQlpZihjb2x1bW5WYWxpZGF0b3IgIT0gbnVsbCl7Ci0JCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBjb2x1bW5WYWxpZGF0b3IuaXNWYWxpZCh2YWx1ZSk7Ci0JCQkJCWlmKGVycm9yTWVzc2FnZSAhPSBudWxsKXsKLQkJCQkJCWRhdGFCaW5kaW5nQ29udGV4dC51cGRhdGVWYWxpZGF0aW9uRXJyb3IoZHVtbXlMaXN0ZW5lciwgZXJyb3JNZXNzYWdlKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlMaXN0IGdldHRlcnMgPSBnZXROZXN0ZWRQb3JwZXJ0aWVzKHByb3BlcnR5KTsKLQkJCQkJU3RyaW5nIHNldHRlclNpZzsKLQkJCQkJT2JqZWN0IHRhcmdldDsKLQkJCQkJaWYgKGdldHRlcnMuc2l6ZSgpPjEpIHsKLQkJCQkJCXNldHRlclNpZyA9IChTdHJpbmcpIGdldHRlcnMuZ2V0KGdldHRlcnMuc2l6ZSgpLTEpOwotCQkJCQkJZ2V0dGVycy5yZW1vdmUoZ2V0dGVycy5zaXplKCktMSk7Ci0JCQkJCQl0YXJnZXQ9Z2V0R2V0dGVyVmFsdWUoZWxlbWVudCxnZXR0ZXJzKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXNldHRlclNpZyA9IHByb3BlcnR5OwotCQkJCQkJdGFyZ2V0ID0gZWxlbWVudDsKLQkJCQkJfQotCQkJCQkJCi0JCQkJCU1ldGhvZCBzZXR0ZXIgPSB0YXJnZXQKLQkJCQkJCQkuZ2V0Q2xhc3MoKQotCQkJCQkJCS5nZXRNZXRob2QoCi0JCQkJCQkJCQkic2V0IgkrIHNldHRlclNpZy5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpICsgc2V0dGVyU2lnLnN1YnN0cmluZygxKSwgbmV3IENsYXNzW10geyBjb2x1bW4uZ2V0Q29udmVydGVyKCkuZ2V0TW9kZWxUeXBlKCkgfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc2V0dGVyLmludm9rZSh0YXJnZXQsIG5ldyBPYmplY3RbXSB7IHZhbHVlIH0pOwotCQkJCQl0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmdldFRhYmxlVmlld2VyKCkucmVmcmVzaChlbGVtZW50KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETyBsb2cKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIGxvZwotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwkJCQkJCi0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETyBsb2cKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsJCQkJCQotCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIGxvZwotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwkJCQkJCi0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE8gbG9nCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCWNsYXNzIENvbHVtbkluZm97Ci0JCWJvb2xlYW4gY29udmVydGVyRGVmYXVsdGVkOwotCQlib29sZWFuIHZhbGlkYXRvckRlZmF1bHRlZDsKLQkJYm9vbGVhbiBjZWxsRWRpdG9yRGVmYXVsdGVkOwotCX0KLQlwcml2YXRlIENvbHVtbkluZm9bXSBjb2x1bW5JbmZvczsKLQlwcml2YXRlIHZvaWQgZmlsbERlc2NyaXB0aW9uRGVmYXVsdHMoZmluYWwgSURhdGFCaW5kaW5nQ29udGV4dCBkYXRhQmluZGluZ0NvbnRleHQpIHsKLQkJY29sdW1uSW5mb3MgPSBuZXcgQ29sdW1uSW5mb1t0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmdldENvbHVtbkNvdW50KCldOwotCQl0aGlzLmRhdGFCaW5kaW5nQ29udGV4dCA9IGRhdGFCaW5kaW5nQ29udGV4dDsJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlVmlld2VyRGVzY3JpcHRpb24uZ2V0Q29sdW1uQ291bnQoKTsgaSsrKSB7Ci0JCQlDb2x1bW4gY29sdW1uID0gdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5nZXRDb2x1bW4oaSk7Ci0JCQljb2x1bW5JbmZvc1tpXSA9IG5ldyBDb2x1bW5JbmZvKCk7Ci0JCQlpZiAoY29sdW1uLmdldENvbnZlcnRlcigpID09IG51bGwpIHsKLQkJCQljb2x1bW5JbmZvc1tpXS5jb252ZXJ0ZXJEZWZhdWx0ZWQgPSB0cnVlOwotCQkJCWlmIChjb2x1bW4uZ2V0UHJvcGVydHlUeXBlKCkhPW51bGwpCi0JCQkJCWluaXRpYWxpemVDb2x1bW5Db252ZXJ0ZXIoY29sdW1uLGNvbHVtbi5nZXRQcm9wZXJ0eVR5cGUoKSk7Ci0JCQkJZWxzZQotCQkJCSAgIGNvbHVtbi5zZXRDb252ZXJ0ZXIobmV3IElkZW50aXR5Q29udmVydGVyKFN0cmluZy5jbGFzcykpOwotCQkJfQotCQkJaWYgKGNvbHVtbi5nZXRWYWxpZGF0b3IoKSA9PSBudWxsICYmIGNvbHVtbi5pc0VkaXRhYmxlKCkpIHsKLQkJCQljb2x1bW5JbmZvc1tpXS52YWxpZGF0b3JEZWZhdWx0ZWQgPSB0cnVlOwotCQkJCWluaXRpYWxpemVDb2x1bW5WYWxpZGF0b3IoY29sdW1uLCBjb2x1bW4uZ2V0UHJvcGVydHlUeXBlKCkpOwotCQkJfQotCQkJaWYoY29sdW1uLmlzRWRpdGFibGUoKSl7Ci0JCQkJLy8gRGVmYXVsdCBhIGNlbGwgZWRpdG9yIGlmIHJlcXVpcmVkCi0JCQkJaWYgKGNvbHVtbi5nZXRDZWxsRWRpdG9yKCkgPT0gbnVsbCkgewotCQkJCQljb2x1bW5JbmZvc1tpXS5jZWxsRWRpdG9yRGVmYXVsdGVkID0gdHJ1ZTsKLQkJCQkJY29sdW1uLnNldENlbGxFZGl0b3IoY3JlYXRlQ2VsbEVkaXRvcihjb2x1bW4pKTsKLQkJCQl9Ci0JCQkJLy8gSWYgdGhlIGNlbGwgZWRpdG9yJ3MgY29udHJvbCBpcyBhIFRleHQgZmllbGQgYW5kIHdlIGFyZSBUSU1FX0VBUkxZIHRoZW4gd2Ugc2hvdWxkIGltcGxlbWVudCBhbiB1cGRhdGUgcG9saWN5IHdoZXJlYnkgd2UgdHJ5IHRvIGNvbW1pdCBvbiBrZXlzdHJva2UKLQkJCQlpZih1cGRhdGVUaW1lID09IElEYXRhQmluZGluZ0NvbnRleHQuVElNRV9FQVJMWSAmJiBjb2x1bW4uZ2V0Q2VsbEVkaXRvcigpICE9IG51bGwgJiYgY29sdW1uLmdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCkgaW5zdGFuY2VvZiBUZXh0KXsKLQkJCQkJVGV4dCB0ZXh0Q29udHJvbCA9IChUZXh0KSBjb2x1bW4uZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCQkJLy8gQWRkIGEgbW9kaWZ5IGxpc3RlbmVyIHRvIHRoZSBjZWxsIGVkaXRvcgotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5nZXRDZWxsTW9kaWZpZXIoKSA9PSBudWxsKSB7Ci0JCQl0YWJsZVZpZXdlckRlc2NyaXB0aW9uLnNldENlbGxNb2RpZmllcihjcmVhdGVDZWxsTW9kaWZpZXIoZGF0YUJpbmRpbmdDb250ZXh0KSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDb2x1bW5Db252ZXJ0ZXIoQ29sdW1uIGNvbHVtbiwgQ2xhc3MgcHJvcGVydHlUeXBlKXsKLQkJICAgY29sdW1uLnNldENvbnZlcnRlcihkYXRhQmluZGluZ0NvbnRleHQuY3JlYXRlQ29udmVydGVyKFN0cmluZy5jbGFzcywgcHJvcGVydHlUeXBlLCB0YWJsZVZpZXdlckRlc2NyaXB0aW9uKSk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDb2x1bW5WYWxpZGF0b3IoQ29sdW1uIGNvbHVtbiwgQ2xhc3MgcHJvcGVydHlUeXBlKXsKLQkJY29sdW1uLnNldFZhbGlkYXRvcihuZXcgSVZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1BhcnRpYWxseVZhbGlkKE9iamVjdCB2YWx1ZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0pOwkJCi0JfQotCQotCXB1YmxpYyBpbnQgYWRkRWxlbWVudChPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCS8vIElmIGZpcnN0IHRpbWUgdGhyb3VnaCBhbmQgYW55IG9mIHRoZSBjb2x1bW5zIGhhZCBkZWZhdWx0IGluZm9ybWF0aW9uIHN1cHBsaWVkIHRoZW4gd2UgbWF5IG5vdyBoYXZlCi0JCS8vIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGZyb20gdGhlIGV4cGxpY2l0IHR5cGUgd2hpY2ggbWVhbnMgd2UgY2FuIGNhbGN1bGF0ZSBiZXR0ZXIKLQkJLy8gY29udmVydGVycywgdmFsaWRhdG9ycyBhbmQgY2VsbCBlZGl0b3JzCi0JCWlmKGNvbHVtbkluZm9zICE9IG51bGwpewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmdldENvbHVtbkNvdW50KCk7IGkrKykgewotCQkJCUNvbHVtbiBjb2x1bW4gPSB0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmdldENvbHVtbihpKTsKLQkJCQlDb2x1bW5JbmZvIGNvbHVtbkluZm8gPSBjb2x1bW5JbmZvc1tpXTsKLQkJCQlpZihjb2x1bW4uZ2V0UHJvcGVydHlUeXBlKCkgPT0gbnVsbCAmJiAoY29sdW1uSW5mby5jZWxsRWRpdG9yRGVmYXVsdGVkIHx8IGNvbHVtbkluZm8uY29udmVydGVyRGVmYXVsdGVkIHx8IGNvbHVtbkluZm8udmFsaWRhdG9yRGVmYXVsdGVkKSl7Ci0JCQkJCS8vIFdvcmsgb3V0IHRoZSB0eXBlIG9mIHRoZSBjb2x1bW4gZnJvbSB0aGUgcHJvcGVydHkgbmFtZSBmcm9tIHRoZSBlbGVtZW50IHR5cGUgaXRzZWxmCi0JCQkJCQkJCQkJCi0JCQkJCVByb3BlcnR5SGVscGVyIGhlbHBlciA9IG5ldyBQcm9wZXJ0eUhlbHBlcihjb2x1bW4uZ2V0UHJvcGVydHlOYW1lKCksIGVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQkJCUNsYXNzIGNvbHVtblR5cGUgPWhlbHBlci5nZXRHZXR0ZXIoKS5nZXRSZXR1cm5UeXBlKCk7Ci0JCQkJCQkJCQkKLQkJCQkJaWYoY29sdW1uVHlwZSAhPSBudWxsKXsKLQkJCQkJCS8vIFdlIGhhdmUgYSBtb3JlIGV4cGxpY2l0IHByb3BlcnR5IHR5cGUgdGhhdCB3YXMgc3VwcGxpZWQKLQkJCQkJCWlmKGNvbHVtbkluZm8uY29udmVydGVyRGVmYXVsdGVkKXsJCi0JCQkJCQkJaW5pdGlhbGl6ZUNvbHVtbkNvbnZlcnRlcihjb2x1bW4sY29sdW1uVHlwZSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZihjb2x1bW5JbmZvLnZhbGlkYXRvckRlZmF1bHRlZCl7Ci0JCQkJCQkJaW5pdGlhbGl6ZUNvbHVtblZhbGlkYXRvcihjb2x1bW4sY29sdW1uVHlwZSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZihjb2x1bW5JbmZvLmNlbGxFZGl0b3JEZWZhdWx0ZWQpewotCQkJCQkJCWNyZWF0ZUNlbGxFZGl0b3IoY29sdW1uKTsJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljb2x1bW5JbmZvcyA9IG51bGw7CS8vIENsZWFyIHRoZSB2YXJpYWJsZSBzbyB3ZSBkb24ndCByZS1kZWZhdWx0IGFnYWluCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmFkZEVsZW1lbnQoZWxlbWVudCwgaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBDb2x1bW4gZ2V0Q29sdW1uKGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5nZXRDb2x1bW4oY29sdW1uSW5kZXgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvdmlld2Vycy9UcmVlVmlld2VyVXBkYXRhYmxlVHJlZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvdmlld2Vycy9UcmVlVmlld2VyVXBkYXRhYmxlVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGUzZjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3ZpZXdlcnMvVHJlZVZpZXdlclVwZGF0YWJsZVRyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5VcGRhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuc3d0LkFzeW5jUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwuZGF0YWJpbmRpbmcuc3d0LlN5bmNSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotLy9UT0RPIFRocmVhZCBzYWZlCi1wdWJsaWMgY2xhc3MgVHJlZVZpZXdlclVwZGF0YWJsZVRyZWUgZXh0ZW5kcyBVcGRhdGFibGUgaW1wbGVtZW50cyBJVXBkYXRhYmxlVHJlZSB7Ci0JCQkKLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciB2aWV3ZXI7Ci0JCi0JLy8gVE9ETyB1c2UgaWRlbnRpdHlXcmFwcGVyCi0JcHJpdmF0ZSBNYXAgbm9kZXMgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgT2JqZWN0IHJvb3RLZXk9dGhpczsKLQkKLQlwcml2YXRlIE9iamVjdCB2aWV3ZXJJbnB1dD1udWxsOwotCQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZ1ZpZXdlcj1mYWxzZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRpbmdWaXJ0dWFsPWZhbHNlOwotCQotCXByaXZhdGUgTGlzdCB2aWV3ZXJSZWZyZXNoTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlDbGFzc1tdIGNsYXNzVHlwZXM7Ci0JCQotCXByaXZhdGUgY2xhc3MgVHJlZU5vZGUgewotCQlPYmplY3QgcGFyZW50OwotCQlMaXN0ICAgY2hpbGRyZW47Ci0JCWJvb2xlYW4gcmVxdWVzdGVkQ2hpbGRyZW49ZmFsc2U7Ci0JCXByaXZhdGUgVHJlZU5vZGUoT2JqZWN0IHBhcmVudCwgTGlzdCBjaGlsZHJlbikgewotCQkJdGhpcy5wYXJlbnQ9cGFyZW50OwotCQkJdGhpcy5jaGlsZHJlbj1jaGlsZHJlbjsJCQkKLQkJfQotCQlwcml2YXRlIFRyZWVOb2RlKE9iamVjdCBwYXJlbnQpIHsKLQkJCXRoaXMocGFyZW50LCBudWxsKTsKLQkJfQotCQkvKioKLQkJICogQHJldHVybiBhIExpc3QsIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUKLQkJICovCi0JCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9Ci0JCS8qKgotCQkgKiBAcmV0dXJuIGFuIE9iamVjdCwgdGhlIHBhcmVudCBvZiB0aGlzIE5vZGUKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQkvKioKLQkJICogQHBhcmFtIGNoaWxkcmVuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihMaXN0IGNoaWxkcmVuKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JCQlyZXF1ZXN0ZWRDaGlsZHJlbj1mYWxzZTsKLQkJfQotCQkvKioKLQkJICogQHJldHVybiB0cnVlIGlmIFZJUlRVQUwgcmVxdWVzdCBoYXMgYmVlbiBtYWRlIGFscmVhZHkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gcmVxdWVzdGVkQ2hpbGRyZW47Ci0JCX0KLQkJLyoqCi0JCSAqIEBwYXJhbSByZXF1ZXN0ZWRDaGlsZHJlbgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UmVxdWVzdGVkQ2hpbGRyZW4oYm9vbGVhbiByZXF1ZXN0ZWRDaGlsZHJlbikgewotCQkJdGhpcy5yZXF1ZXN0ZWRDaGlsZHJlbiA9IHJlcXVlc3RlZENoaWxkcmVuOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBUcmVlVmlld2VyVXBkYXRhYmxlVHJlZShmaW5hbCBUcmVlVmlld2VyIHZpZXdlcikgewkKLQkJdGhpcyAodmlld2VyLCBuZXcgQ2xhc3NbXSB7IE9iamVjdC5jbGFzcyB9ICk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSB2aWV3ZXIgCi0JICogQHBhcmFtIGNsYXNzVHlwZXMgCi0JICovCi0JcHVibGljIFRyZWVWaWV3ZXJVcGRhdGFibGVUcmVlKGZpbmFsIFRyZWVWaWV3ZXIgdmlld2VyLCBDbGFzc1tdIGNsYXNzVHlwZXMpIHsJCQotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJdGhpcy5jbGFzc1R5cGVzPWNsYXNzVHlwZXM7Ci0JCQotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcigpIHsJCQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJdmlld2VySW5wdXQ9bmV3SW5wdXQ7Ci0JCQl9CQkKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQkJCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiBUcmVlVmlld2VyVXBkYXRhYmxlVHJlZS50aGlzLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7Ci0JCQl9CQkKLQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKGZpbmFsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFRyZWVWaWV3ZXJVcGRhdGFibGVUcmVlLnRoaXMuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JCQl9CQkKLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJVHJlZU5vZGUgbm9kZSA9IGdldFRyZWVOb2RlKGVsZW1lbnQpOwotCQkJCWlmIChub2RlIT1udWxsKQotCQkJCQlyZXR1cm4gbm9kZS5nZXRQYXJlbnQoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0JCQotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFRyZWVWaWV3ZXJVcGRhdGFibGVUcmVlLnRoaXMuZ2V0RWxlbWVudHMocGFyZW50RWxlbWVudCk7Ci0JCQl9CQkKLQkJfSk7Ci0JCQotCQl0aGlzLnZpZXdlci5zZXRJbnB1dCh0aGlzKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmVlTm9kZSBnZXRUcmVlTm9kZShPYmplY3QgZWxlbWVudCkgewkJCi0JCWlmIChlbGVtZW50PT1udWxsIHx8IGVsZW1lbnQ9PXJvb3RLZXkgfHwgZWxlbWVudD09dmlld2VySW5wdXQpIHsKLQkJCVRyZWVOb2RlIHJlc3VsdCA9IChUcmVlTm9kZSkgbm9kZXMuZ2V0KHJvb3RLZXkpOwotCQkJaWYgKHJlc3VsdD09bnVsbCkgewotCQkJCXJlc3VsdCA9IG5ldyBUcmVlTm9kZShudWxsKTsKLQkJCQlub2Rlcy5wdXQocm9vdEtleSwgcmVzdWx0KTsKLQkJCX0JCQkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIChUcmVlTm9kZSlub2Rlcy5nZXQoZWxlbWVudCk7Ci0JfQotCQotCXByaXZhdGUgaW50IHByaW1BZGRDaGlsZEVsZW1lbnQoTGlzdCBsaXN0LCBPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCWludCBwb3NpdGlvbjsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IGxpc3Quc2l6ZSgpKSB7Ci0JCQlwb3NpdGlvbiA9IGxpc3Quc2l6ZSgpOwotCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlsaXN0LmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQlwb3NpdGlvbiA9IGluZGV4OwotCQl9Ci0JCXJldHVybiBwb3NpdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlld2VyKFJ1bm5hYmxlIHJ1bmFibGUpIHsKLQkJaWYgKHVwZGF0aW5nVmlld2VyKSB7Ci0JCQl2aWV3ZXJSZWZyZXNoTGlzdC5hZGQocnVuYWJsZSk7Ci0JCQlyZXR1cm4gOwotCQl9Ci0JCQotCQl1cGRhdGluZ1ZpZXdlcj10cnVlOwotCQl0cnkgewkJCQotCQkJcnVuYWJsZS5ydW4oKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXVwZGF0aW5nVmlld2VyPWZhbHNlOwotCQl9Ci0JCS8vCVZpcnR1YWwgZXZlbnRzIG1heSBuZWVkIHRvIHVwZGF0ZSB0aGUgdmlld2VyIGFzIHdlbGwKLQkJd2hpbGUgKCF2aWV3ZXJSZWZyZXNoTGlzdC5pc0VtcHR5KCkpIHsKLQkJICAgUnVubmFibGUgd29ya1tdID0gKFJ1bm5hYmxlW10pdmlld2VyUmVmcmVzaExpc3QudG9BcnJheShuZXcgUnVubmFibGVbdmlld2VyUmVmcmVzaExpc3Quc2l6ZSgpXSk7Ci0JCSAgIHZpZXdlclJlZnJlc2hMaXN0LmNsZWFyKCk7Ci0JCSAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29yay5sZW5ndGg7IGkrKykgCi0JCQl1cGRhdGVWaWV3ZXIod29ya1tpXSk7CQkKLQkJfQotCX0KLQkJCi0JcHVibGljIGludCBhZGRFbGVtZW50KGZpbmFsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQlTeW5jUnVubmFibGUgcnVubmFibGUgPSBuZXcgU3luY1J1bm5hYmxlKCkgewotCQkJcHVibGljIE9iamVjdCBydW4oKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGFkZEVsZW1lbnQocGFyZW50RWxlbWVudCwgaW5kZXgsIHZhbHVlLCB0cnVlKSk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiAoKEludGVnZXIpcnVubmFibGUucnVuKCkpLmludFZhbHVlKCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBpbnQgYWRkRWxlbWVudChmaW5hbCBPYmplY3QgcGFyZW50RWxlbWVudCwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUsIGZpbmFsIGJvb2xlYW4gZmlyZSkgewkJCQkKLQkJVHJlZU5vZGUgcGFyZW50Tm9kZSA9IGdldFRyZWVOb2RlKHBhcmVudEVsZW1lbnQpOwotCQlpZiAocGFyZW50Tm9kZSA9PSBudWxsKSByZXR1cm4gLTE7Ci0JCQkKLQotCQlpZiAoIWhhc0NoaWxkcmVuKHBhcmVudEVsZW1lbnQpICYmIHBhcmVudE5vZGUuZ2V0Q2hpbGRyZW4oKT09bnVsbCkKLQkJCXBhcmVudE5vZGUuc2V0Q2hpbGRyZW4obmV3IEFycmF5TGlzdCgpKTsKLQkJTGlzdCBsaXN0ID0gcGFyZW50Tm9kZS5nZXRDaGlsZHJlbigpOwotCQlpbnQgYWRkZWRJbmRleCA9IC0xOwotCQlpZiAoIWxpc3QuY29udGFpbnModmFsdWUpKSB7Ci0JCQlhZGRlZEluZGV4ID0gcHJpbUFkZENoaWxkRWxlbWVudChsaXN0LCB2YWx1ZSwgaW5kZXgpOwotCQkJVHJlZU5vZGUgdmFsdWVOb2RlID0gbmV3IFRyZWVOb2RlKHBhcmVudEVsZW1lbnQpOwotCQkJbm9kZXMucHV0KHZhbHVlLCB2YWx1ZU5vZGUpOwotCQkJZmluYWwgaW50IGZpcmVJbmRleD1hZGRlZEluZGV4OwotCQkJdXBkYXRlVmlld2VyKG5ldyBSdW5uYWJsZSgpIHsJCQkKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXZpZXdlci5hZGQocGFyZW50RWxlbWVudCA9PSBudWxsID8gdmlld2VySW5wdXQgOiBwYXJlbnRFbGVtZW50LAotCQkJCQkJCXZhbHVlKTsJCQkKLQkJCQkJaWYgKGZpcmUpIAotCQkJCQkJZmlyZUNoYW5nZUV2ZW50KENoYW5nZUV2ZW50LkFERCwgbnVsbCwgdmFsdWUsIHBhcmVudEVsZW1lbnQsIGZpcmVJbmRleCk7CQkJCQkJCi0JCQkJfQkJCQotCQkJfSk7CQkJCi0JCX0KLQkJcmV0dXJuIGFkZGVkSW5kZXg7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50KGZpbmFsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBmaW5hbCBpbnQgaW5kZXgpIHsKLQkJU3luY1J1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFN5bmNSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyBPYmplY3QgcnVuKCkgewotCQkJCXJlbW92ZUVsZW1lbnQocGFyZW50RWxlbWVudCwgaW5kZXgsIHRydWUpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlydW5uYWJsZS5ydW4oKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudChmaW5hbCBPYmplY3QgcGFyZW50RWxlbWVudCwgZmluYWwgaW50IGluZGV4LCBmaW5hbCBib29sZWFuIGZpcmUpIHsKLQkJaWYgKGhhc0NoaWxkcmVuKHBhcmVudEVsZW1lbnQpKSB7Ci0JCQlUcmVlTm9kZSBwYXJlbnROb2RlID0gZ2V0VHJlZU5vZGUocGFyZW50RWxlbWVudCk7Ci0JCQlMaXN0IGNoaWxkcmVuID0gcGFyZW50Tm9kZS5nZXRDaGlsZHJlbigpOwotCQkJaWYgKGNoaWxkcmVuIT1udWxsKSB7Ci0JCQkJZmluYWwgT2JqZWN0IGVsZW1lbnQgPSBjaGlsZHJlbi5yZW1vdmUoaW5kZXgpOwkJCQotCQkJCXVwZGF0ZVZpZXdlcihuZXcgUnVubmFibGUoKSB7CQkJCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl2aWV3ZXIucmVtb3ZlKGVsZW1lbnQpOwkJCi0JCQkJCQkJaWYgKGZpcmUpCi0JCQkJCQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5SRU1PVkUsIGVsZW1lbnQsIG51bGwsIHBhcmVudEVsZW1lbnQsIGluZGV4KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJaWYgKGNoaWxkcmVuLnNpemUoKT09MCkKLQkJCQlwYXJlbnROb2RlLnNldENoaWxkcmVuKG51bGwpOwotCQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChmaW5hbCBPYmplY3QgcGFyZW50RWxlbWVudCwgZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsJCi0JCUFzeW5jUnVubmFibGUgcnVubmFibGUgPSBuZXcgQXN5bmNSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoaGFzQ2hpbGRyZW4ocGFyZW50RWxlbWVudCkpIHsKLQkJCQkJVHJlZU5vZGUgcGFyZW50Tm9kZSA9IGdldFRyZWVOb2RlKHBhcmVudEVsZW1lbnQpOwotCQkJCQlMaXN0IGNoaWxkcmVuID0gcGFyZW50Tm9kZS5nZXRDaGlsZHJlbigpOwotCQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBjaGlsZHJlbi5nZXQoaW5kZXgpOwotCQkJCQlpZiAob2xkVmFsdWUuZXF1YWxzKHZhbHVlKSkgewotCQkJCQkJdXBkYXRlVmlld2VyKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXZpZXdlci51cGRhdGUodmFsdWUsIG51bGwpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVtb3ZlRWxlbWVudChwYXJlbnRFbGVtZW50LCBpbmRleCwgZmFsc2UpOwotCQkJCQkJYWRkRWxlbWVudChwYXJlbnRFbGVtZW50LCBpbmRleCwgdmFsdWUsIGZhbHNlKTsKLQkJCQkJfQotCQkJCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBvbGRWYWx1ZSwgdmFsdWUsCi0JCQkJCQkJcGFyZW50RWxlbWVudCwgaW5kZXgpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfTsKLQkJcnVubmFibGUucnVuT24odmlld2VyLmdldFRyZWUoKS5nZXREaXNwbGF5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRzKGZpbmFsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBmaW5hbCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJU3luY1J1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFN5bmNSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyBPYmplY3QgcnVuKCkgewotCQkJCWhhc0NoaWxkcmVuKHBhcmVudEVsZW1lbnQpOyAvLyBwcmltZSBDaGlsZHJlbiBpZiBuZWVkZWQKLQkJCQlUcmVlTm9kZSBwYXJlbnROb2RlID0gZ2V0VHJlZU5vZGUocGFyZW50RWxlbWVudCk7Ci0JCQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQlMaXN0IGNoaWxkcmVuID0gcGFyZW50Tm9kZS5nZXRDaGlsZHJlbigpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCXdoaWxlIChjaGlsZHJlbi5zaXplKCkgPiAwKQotCQkJCQkJcmVtb3ZlRWxlbWVudChwYXJlbnRFbGVtZW50LCAwLCB0cnVlKTsKLQkJCQl9CQkJCQkKLQkJCQlwYXJlbnROb2RlLnNldFJlcXVlc3RlZENoaWxkcmVuKHRydWUpOwotCQkJCWlmICh2YWx1ZXMgIT0gbnVsbCkKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWFkZEVsZW1lbnQocGFyZW50RWxlbWVudCwgaSwgdmFsdWVzW2ldLCB0cnVlKTsKLQkJCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlydW5uYWJsZS5ydW5Pbih2aWV3ZXIuZ2V0VHJlZSgpLmdldERpc3BsYXkoKSk7Ci0JfQotCi0KLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnQoT2JqZWN0IHBhcmVudEVsZW1lbnQsIGludCBpbmRleCkgewkJCi0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJaWYgKGhhc0NoaWxkcmVuKHBhcmVudEVsZW1lbnQpKSB7Ci0JCQlUcmVlTm9kZSBwYXJlbnROb2RlID0gZ2V0VHJlZU5vZGUocGFyZW50RWxlbWVudCk7Ci0JCQlpZiAocGFyZW50Tm9kZSE9bnVsbCkgewotCQkJCUxpc3QgY2hpbGRyZW4gPSBwYXJlbnROb2RlLmdldENoaWxkcmVuKCk7Ci0JCQkJaWYgKGNoaWxkcmVuIT1udWxsKSAKLQkJCQkJaWYgKGluZGV4Pj0wJiZpbmRleDxjaGlsZHJlbi5zaXplKCkpCi0JCQkJCQllbGVtZW50ID0gY2hpbGRyZW4uZ2V0KGluZGV4KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAoaGFzQ2hpbGRyZW4ocGFyZW50RWxlbWVudCkpIHsKLQkJCVRyZWVOb2RlIHBhcmVudE5vZGUgPSBnZXRUcmVlTm9kZShwYXJlbnRFbGVtZW50KTsKLQkJCQotCQkJTGlzdCBjaGlsZHJlbiA9IHBhcmVudE5vZGU9PW51bGw/IG51bGwgOiBwYXJlbnROb2RlLmdldENoaWxkcmVuKCk7Ci0JCQlyZXR1cm4gY2hpbGRyZW49PW51bGw/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOmNoaWxkcmVuLnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGRyaXZlIDxjb2RlPkNoYW5nZUVsZW1lbnQuVklSVFVBTDwvY29kZT4gaWYgbm8KLQkgKiBjaGlsZHJlbnQgYXJlIHNldC4KLQkgKiAgCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCBoYXMgY2hpbGRyZW4sIGZhbHNlIGlmIG5vdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKGZpbmFsIE9iamVjdCBlbGVtZW50KSB7Ci0JCVRyZWVOb2RlIG5vZGUgPSBnZXRUcmVlTm9kZShlbGVtZW50KTsJCi0JCWlmIChub2RlPT1udWxsKSByZXR1cm4gZmFsc2U7Ci0JCWJvb2xlYW4gaGF2ZSA9IG5vZGUuZ2V0Q2hpbGRyZW4oKSE9bnVsbCAmJiBub2RlLmdldENoaWxkcmVuKCkuc2l6ZSgpPjA7Ci0JCWlmICghaGF2ZSAmJiAhdXBkYXRpbmdWaXJ0dWFsICYmICFub2RlLmlzUmVxdWVzdGVkQ2hpbGRyZW4oKSkgewkKLQkJCSAgICB1cGRhdGluZ1ZpcnR1YWw9dHJ1ZTsKLQkJCQl0cnkgewkJCQkJCi0JCQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5WSVJUVUFMLCBudWxsLCBudWxsLCBlbGVtZW50LCAtMSk7Ci0JCQkJCS8vIE9uY2UgYXNrZWQsIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIG1vZGVsIHdpbGwgbGlzdGVuLCBhbmQgdXBkYXRlCi0JCQkJCS8vIGlmIGEgbmV3IGNoaWxkIGlzIGFkZGVkCi0JCQkJCW5vZGUuc2V0UmVxdWVzdGVkQ2hpbGRyZW4odHJ1ZSk7Ci0JCQkJCS8vIFZJUlRVQUwgcHJvY2Vzc2luZyBtYXkgb3IgbWF5IG5vdCBiZSBvbiB0aGUgc2FtZSB0aHJlYWQKLQkJCQkJLy8gSW4gYW55IGNhc2UsIHRoZSBiaW5kZXIgd2lsbCBjb21lIGJhY2sgd2l0aCB0aGUgcmlnaHQgYW5zd2VyCi0JCQkJCS8vIGV2ZW50dWFsbHkKLQkJCQkJaGF2ZSA9IG5vZGUuZ2V0Q2hpbGRyZW4oKSE9bnVsbCAmJiBub2RlLmdldENoaWxkcmVuKCkuc2l6ZSgpPjA7Ci0JCQkgICAgfQotCQkJICAgIGZpbmFsbHkgewkJCSAgICAJCi0JCQkgICAgCXVwZGF0aW5nVmlydHVhbD1mYWxzZTsKLQkJCSAgICB9Ci0JCX0KLQkJcmV0dXJuIGhhdmU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGVsZW1lbnQncyBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlUcmVlTm9kZSBlbGVtZW50Tm9kZSA9IChUcmVlTm9kZSlub2Rlcy5nZXQoZWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50Tm9kZS5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRUeXBlcygpIHsKLQkJcmV0dXJuIGNsYXNzVHlwZXM7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW50ZXJuYWwvZGF0YWJpbmRpbmcvdmlld2Vycy9UcmVlVmlld2VyVXBkYXRhYmxlVHJlZUV4dGVuZGVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy92aWV3ZXJzL1RyZWVWaWV3ZXJVcGRhdGFibGVUcmVlRXh0ZW5kZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjNzM2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy92aWV3ZXJzL1RyZWVWaWV3ZXJVcGRhdGFibGVUcmVlRXh0ZW5kZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5CaW5kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JRGF0YUJpbmRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlcnMuSWRlbnRpdHlDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2Vycy5UcmVlVmlld2VyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2Vycy5UYWJsZVZpZXdlckRlc2NyaXB0aW9uLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy5iZWFucy5Qcm9wZXJ0eUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLQotLyoqCi0gKiBAc2luY2UgMy4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVHJlZVZpZXdlclVwZGF0YWJsZVRyZWVFeHRlbmRlZCBleHRlbmRzIFRyZWVWaWV3ZXJVcGRhdGFibGVUcmVlIHsKLQkKLQljbGFzcyBDb2x1bW5JbmZveyAvLyBib29sZWFuIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UKLQkJYm9vbGVhbiBjb252ZXJ0ZXJEZWZhdWx0ZWQ7Ci0JCWJvb2xlYW4gdmFsaWRhdG9yRGVmYXVsdGVkOwotCQlib29sZWFuIGNlbGxFZGl0b3JEZWZhdWx0ZWQ7Ci0JfQotCQotCWNsYXNzIFRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQlwcml2YXRlIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgQ29sdW1uIGNvbHVtbikgewotCQkJT2JqZWN0IHZhbHVlID0gdHJlZVZpZXdlckRlc2NyaXB0aW9uLmdldENlbGxNb2RpZmllcigpLmdldFZhbHVlKAotCQkJCQllbGVtZW50LCBJbnRlZ2VyLnRvU3RyaW5nKHRyZWVWaWV3ZXJEZXNjcmlwdGlvbi5nZXRDb2x1bW5JbmRleChlbGVtZW50LmdldENsYXNzKCksIGNvbHVtbikpKTsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCi0JCXByaXZhdGUgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKE9iamVjdCBlbGVtZW50LCBDb2x1bW4gY29sdW1uKSB7Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gY29sdW1uLmdldFByb3BlcnR5TmFtZSgpOwotCQkJT2JqZWN0IHZhbHVlOwotCQkJaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKSAKLQkJCQl2YWx1ZSA9IGVsZW1lbnQ7Ci0JCQllbHNlIAotCQkJCXZhbHVlID0gZ2V0VmFsdWUoZWxlbWVudCwgY29sdW1uKTsKLQkJCQotCQkJT2JqZWN0IGNvbnZlcnRlZFZhbHVlID0gY29sdW1uLmdldENvbnZlcnRlcigpLmNvbnZlcnRNb2RlbFRvVGFyZ2V0KAotCQkJCQl2YWx1ZSk7Ci0JCQlyZXR1cm4gY29udmVydGVkVmFsdWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlpZiAoY29sdW1uSW5kZXg8dHJlZVZpZXdlckRlc2NyaXB0aW9uLmdldENvbHVtbkNvdW50KGVsZW1lbnQuZ2V0Q2xhc3MoKSkgJiYgY29sdW1uSW5kZXg+PTApIHsKLQkJCQlDb2x1bW4gY29sdW1uID0gZ2V0Q29sdW1uKGVsZW1lbnQuZ2V0Q2xhc3MoKSwgY29sdW1uSW5kZXgpOwotCQkJCUlDb252ZXJ0ZXIgY29udmVydGVyID0gY29sdW1uLmdldENvbnZlcnRlcigpOwotCQkJCWlmIChjb252ZXJ0ZXIuZ2V0VGFyZ2V0VHlwZSgpLmVxdWFscyhWaWV3ZXJMYWJlbC5jbGFzcykpIHsKLQkJCQkJVmlld2VyTGFiZWwgdmlld2VyTGFiZWwgPSAoVmlld2VyTGFiZWwpIGdldENvbnZlcnRlZFZhbHVlKAotCQkJCQkJCWVsZW1lbnQsIGNvbHVtbik7Ci0JCQkJCXJldHVybiB2aWV3ZXJMYWJlbC5nZXRJbWFnZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCU9iamVjdCBjb252ZXJ0ZWRWYWx1ZT1udWxsOwotCQkJaWYgKGNvbHVtbkluZGV4PHRyZWVWaWV3ZXJEZXNjcmlwdGlvbi5nZXRDb2x1bW5Db3VudChlbGVtZW50LmdldENsYXNzKCkpICYmIGNvbHVtbkluZGV4Pj0wKSB7Ci0JCQkgIENvbHVtbiBjb2x1bW4gPSBnZXRDb2x1bW4oZWxlbWVudC5nZXRDbGFzcygpLCBjb2x1bW5JbmRleCk7Ci0JCQkgIGNvbnZlcnRlZFZhbHVlID0gZ2V0Q29udmVydGVkVmFsdWUoZWxlbWVudCwgY29sdW1uKTsKLQkJCSAgSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBjb2x1bW4uZ2V0Q29udmVydGVyKCk7Ci0JCQkgIGlmIChjb252ZXJ0ZXIuZ2V0VGFyZ2V0VHlwZSgpLmVxdWFscyhWaWV3ZXJMYWJlbC5jbGFzcykpIHsKLQkJCQkJVmlld2VyTGFiZWwgdmlld2VyTGFiZWwgPSAoVmlld2VyTGFiZWwpIGNvbnZlcnRlZFZhbHVlOwotCQkJCQlyZXR1cm4gdmlld2VyTGFiZWwuZ2V0VGV4dCgpOwotCQkJICB9CQkJCQotCQkJfQotCQkJcmV0dXJuIGNvbnZlcnRlZFZhbHVlPT1udWxsPyAiIjogKFN0cmluZykgY29udmVydGVkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIHN1cHBvcnQgdGhlIGNhc2Ugd2hlcmUgYSBUcmVlQ29sdW1uKCkgd2FzIG5vdCBwbGFjZWQgb24gdGhlIHRyZWUKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7CQkJCi0JCQlyZXR1cm4gZ2V0Q29sdW1uSW1hZ2UoZWxlbWVudCwwKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGdldENvbHVtblRleHQoZWxlbWVudCwgMCk7Ci0JCX0KLQl9Ci0JCi0KLQkKLQlwcml2YXRlIEhhc2hNYXAgY29sdW1uSW5mb3MgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgSURhdGFCaW5kaW5nQ29udGV4dCBkYXRhQmluZGluZ0NvbnRleHQ7Ci0KLQlwcml2YXRlIGZpbmFsIFRyZWVWaWV3ZXJEZXNjcmlwdGlvbiB0cmVlVmlld2VyRGVzY3JpcHRpb247Ci0KLQlwcml2YXRlIGZpbmFsIElDaGFuZ2VMaXN0ZW5lciBkdW1teUxpc3RlbmVyID0gbmV3IElDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlQ2hhbmdlKENoYW5nZUV2ZW50IGNoYW5nZUV2ZW50KSB7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHBhcmFtIHRyZWVWaWV3ZXJEZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkYXRhQmluZGluZ0NvbnRleHQgCi0JICovCi0JcHVibGljIFRyZWVWaWV3ZXJVcGRhdGFibGVUcmVlRXh0ZW5kZWQoCi0JCQlUcmVlVmlld2VyRGVzY3JpcHRpb24gdHJlZVZpZXdlckRlc2NyaXB0aW9uLCBJRGF0YUJpbmRpbmdDb250ZXh0IGRhdGFCaW5kaW5nQ29udGV4dCkgewotCQlzdXBlcih0cmVlVmlld2VyRGVzY3JpcHRpb24uZ2V0VHJlZVZpZXdlcigpLCB0cmVlVmlld2VyRGVzY3JpcHRpb24uZ2V0Q2xhc3NUeXBlcygpKTsKLQkJdGhpcy50cmVlVmlld2VyRGVzY3JpcHRpb24gPSB0cmVlVmlld2VyRGVzY3JpcHRpb247Ci0JCXRoaXMuZGF0YUJpbmRpbmdDb250ZXh0PWRhdGFCaW5kaW5nQ29udGV4dDsKLQkJCi0JCWZpbGxEZXNjcmlwdGlvbkRlZmF1bHRzKGRhdGFCaW5kaW5nQ29udGV4dCk7Ci0JCVRyZWVWaWV3ZXIgdGFibGVWaWV3ZXIgPSB0cmVlVmlld2VyRGVzY3JpcHRpb24uZ2V0VHJlZVZpZXdlcigpOwotCQkvLyBUT0RPIHN5bmNocm9uaXplIGNvbHVtbnMgb24gdGhlIHdpZGdldCBzaWRlIChjcmVhdGUgbWlzc2luZyBjb2x1bW5zLAotCQkvLyBzZXQgbmFtZSBpZiBub3QgYWxyZWFkeSBzZXQpCi0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRyZWVMYWJlbFByb3ZpZGVyKCkpOwotCQl0YWJsZVZpZXdlci5zZXRDZWxsTW9kaWZpZXIodHJlZVZpZXdlckRlc2NyaXB0aW9uLmdldENlbGxNb2RpZmllcigpKTsKLQkJaW50IGNvbHVtbkNvdW50ID0gZ2V0Q29sdW1uQ291bnQoKTsKLQkJU3RyaW5nW10gY29sdW1uUHJvcGVydGllcyA9IG5ldyBTdHJpbmdbY29sdW1uQ291bnRdOwotCQkvLwlUT0RPIG5lZWQgdG8gdXNlIHRoZSBmaXggZm9yIEJ1ZyAxMTM3MTMKLQkJLy8gIEl0IGlzIHBvc3NpYmxlIHRoYXQgb25lIGNvbHVtbiBtYXkgaGF2ZSBtdWx0aXBsZSBjZWxsIGVkaXRvcnMKLQkJQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbY29sdW1uQ291bnRdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJCWNvbHVtblByb3BlcnRpZXNbaV0gPSBJbnRlZ2VyLnRvU3RyaW5nKGkpOwotCQkJY2VsbEVkaXRvcnNbaV0gPSBjcmVhdGVDZWxsRWRpdG9yKGkpOwotCQl9Ci0JCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0JCXRhYmxlVmlld2VyLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZ2V0Q29sdW1uQ291bnQoKSB7Ci0JCWludCBjb3VudD0wOwotCQlDbGFzc1tdIHR5cGVzID0gdHJlZVZpZXdlckRlc2NyaXB0aW9uLmdldENsYXNzVHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJaW50IGNjID0gdHJlZVZpZXdlckRlc2NyaXB0aW9uLmdldENvbHVtbkNvdW50KHR5cGVzW2ldKTsKLQkJCWlmIChjYz5jb3VudCkKLQkJCQljb3VudCA9IGNjOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIENlbGxFZGl0b3IgY3JlYXRlQ2VsbEVkaXRvcihmaW5hbCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJQ2xhc3NbXSBjbGFzc1R5cGVzID0gdHJlZVZpZXdlckRlc2NyaXB0aW9uLmdldENsYXNzVHlwZXMoKTsKLQkJQ2VsbEVkaXRvciBjdXN0b21FZGl0b3IgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbHVtbiBjb2x1bW4gPSB0cmVlVmlld2VyRGVzY3JpcHRpb24uZ2V0Q29sdW1uKGNsYXNzVHlwZXNbaV0sIGNvbHVtbkluZGV4KTsKLQkJCWlmIChjb2x1bW4hPW51bGwgJiYgY29sdW1uLmdldENlbGxFZGl0b3IoKSE9bnVsbCkgewotCQkJCWlmIChjdXN0b21FZGl0b3IhPW51bGwpIHsKLQkJCQkJaWYgKGN1c3RvbUVkaXRvciE9Y29sdW1uLmdldENlbGxFZGl0b3IoKSkgLy8gTGltaXRhdGlvbiwgc2VlIEJ1ZyAxMTM3MTMJIAotCQkJCQkJdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24oIkRpZmZlcmVudCBDZWxsIEVkaXRvcnMgb24gQ29sdW1uOiAiK2NvbHVtbkluZGV4KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWN1c3RvbUVkaXRvciA9IGNvbHVtbi5nZXRDZWxsRWRpdG9yKCk7CQkJCQotCQkJfQkJCQotCQl9Ci0JCQotCQlpZiAoY3VzdG9tRWRpdG9yPT1udWxsKSAJCQkKLQkJICAgIC8vIFVzZSBhIGRlZmF1bHQKLQkJCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3IodHJlZVZpZXdlckRlc2NyaXB0aW9uLmdldFRyZWVWaWV3ZXIoKS5nZXRUcmVlKCkpIDsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJQ29sdW1uIGNvbHVtbiA9IHRyZWVWaWV3ZXJEZXNjcmlwdGlvbi5nZXRDb2x1bW4oY2xhc3NUeXBlc1tpXSwgY29sdW1uSW5kZXgpOwotCQkJY29sdW1uLnNldENlbGxFZGl0b3IoY3VzdG9tRWRpdG9yKTsKLQkJfQotCQlyZXR1cm4gY3VzdG9tRWRpdG9yOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIElDZWxsTW9kaWZpZXIgY3JlYXRlQ2VsbE1vZGlmaWVyKGZpbmFsIElEYXRhQmluZGluZ0NvbnRleHQgZGF0YUJpbmRpbmdDb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgSUNlbGxNb2RpZmllcigpIHsKLQotCQkJcHJpdmF0ZSBDb2x1bW4gZmluZENvbHVtbihDbGFzcyBpbnN0YW5jZVR5cGUsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCWludCBpbmRleCA9IEludGVnZXIucGFyc2VJbnQocHJvcGVydHkpOwotCQkJCXJldHVybiB0cmVlVmlld2VyRGVzY3JpcHRpb24uZ2V0Q29sdW1uKGluc3RhbmNlVHlwZSwgaW5kZXgpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSXRlbSkgewotCQkJCQllbGVtZW50ID0gKChJdGVtKSBlbGVtZW50KS5nZXREYXRhKCk7Ci0JCQkJfQotCQkJCUNvbHVtbiBjb2x1bW4gPSBmaW5kQ29sdW1uKGVsZW1lbnQuZ2V0Q2xhc3MoKSwgcHJvcGVydHkpOwotCQkJCWlmIChjb2x1bW4hPW51bGwgJiYgY29sdW1uLmdldFByb3BlcnR5TmFtZSgpIT1udWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgUHJvcGVydHlIZWxwZXIoY29sdW1uLmdldFByb3BlcnR5TmFtZSgpLCBlbGVtZW50LmdldENsYXNzKCkpLmNhblNldChlbGVtZW50KTsgCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEl0ZW0pIHsKLQkJCQkJZWxlbWVudCA9ICgoSXRlbSkgZWxlbWVudCkuZ2V0RGF0YSgpOwotCQkJCX0KLQkJCQlDb2x1bW4gY29sdW1uID0gZmluZENvbHVtbihlbGVtZW50LmdldENsYXNzKCksIHByb3BlcnR5KTsKLQkJCQlpZiAoY29sdW1uID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXRyeSB7CQkJCQkJCQkKLQkJCQkJT2JqZWN0IHZhbHVlID0gbmV3IFByb3BlcnR5SGVscGVyKGNvbHVtbi5nZXRQcm9wZXJ0eU5hbWUoKSwgZWxlbWVudC5nZXRDbGFzcygpKS5nZXQoZWxlbWVudCk7Ci0JCQkJCXJldHVybiBjb2x1bW4uZ2V0Q29udmVydGVyKCkuY29udmVydE1vZGVsVG9UYXJnZXQodmFsdWUpOwotCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETyBsb2cKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIGxvZwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSXRlbSkgewotCQkJCQllbGVtZW50ID0gKChJdGVtKSBlbGVtZW50KS5nZXREYXRhKCk7Ci0JCQkJfQotCQkJCUNvbHVtbiBjb2x1bW4gPSBmaW5kQ29sdW1uKGVsZW1lbnQuZ2V0Q2xhc3MoKSwgcHJvcGVydHkpOwotCQkJCWlmIChjb2x1bW4gPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXZhbHVlID0gY29sdW1uLmdldENvbnZlcnRlcigpLmNvbnZlcnRUYXJnZXRUb01vZGVsKHZhbHVlKTsKLQkJCQlJVmFsaWRhdG9yIGNvbHVtblZhbGlkYXRvciA9IGNvbHVtbi5nZXRWYWxpZGF0b3IoKTsKLQkJCQlpZihjb2x1bW5WYWxpZGF0b3IgIT0gbnVsbCl7Ci0JCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBjb2x1bW5WYWxpZGF0b3IuaXNWYWxpZCh2YWx1ZSk7Ci0JCQkJCWlmKGVycm9yTWVzc2FnZSAhPSBudWxsKXsKLQkJCQkJCWRhdGFCaW5kaW5nQ29udGV4dC51cGRhdGVWYWxpZGF0aW9uRXJyb3IoZHVtbXlMaXN0ZW5lciwgZXJyb3JNZXNzYWdlKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQluZXcgUHJvcGVydHlIZWxwZXIoY29sdW1uLmdldFByb3BlcnR5TmFtZSgpLCBlbGVtZW50LmdldENsYXNzKCkpLnNldChlbGVtZW50LCB2YWx1ZSk7Ci0JCQkJdmlld2VyLnVwZGF0ZShlbGVtZW50LCBuZXcgU3RyaW5nW10geyBwcm9wZXJ0eSB9ICk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29sdW1uQ29udmVydGVyKENvbHVtbiBjb2x1bW4sIENsYXNzIHByb3BlcnR5VHlwZSl7Ci0JCSAgIGNvbHVtbi5zZXRDb252ZXJ0ZXIoZGF0YUJpbmRpbmdDb250ZXh0LmNyZWF0ZUNvbnZlcnRlcihTdHJpbmcuY2xhc3MsIHByb3BlcnR5VHlwZSwgdHJlZVZpZXdlckRlc2NyaXB0aW9uKSk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDb2x1bW5WYWxpZGF0b3IoQ29sdW1uIGNvbHVtbiwgQ2xhc3MgcHJvcGVydHlUeXBlKXsKLQkJY29sdW1uLnNldFZhbGlkYXRvcihuZXcgSVZhbGlkYXRvcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgaXNQYXJ0aWFsbHlWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9KTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yKGZpbmFsIENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIG5ldyBUZXh0Q2VsbEVkaXRvcih0cmVlVmlld2VyRGVzY3JpcHRpb24uZ2V0VHJlZVZpZXdlcigpLmdldFRyZWUoKSkgewkJCQkKLQkJCXByb3RlY3RlZCB2b2lkIGRvU2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJc3VwZXIuZG9TZXRWYWx1ZSggY29sdW1uLmdldENvbnZlcnRlcigpLmNvbnZlcnRNb2RlbFRvVGFyZ2V0KHZhbHVlKSk7Ci0JCQl9Ci0JCQlwcm90ZWN0ZWQgT2JqZWN0IGRvR2V0VmFsdWUoKSB7Ci0JCQkJU3RyaW5nIHRleHRWYWx1ZSA9IChTdHJpbmcpc3VwZXIuZG9HZXRWYWx1ZSgpOwotCQkJCXJldHVybiBjb2x1bW4uZ2V0Q29udmVydGVyKCkuY29udmVydFRhcmdldFRvTW9kZWwodGV4dFZhbHVlKTsKLQkJCX0KLQkJfTsKLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxEZXNjcmlwdGlvbkRlZmF1bHRzKGZpbmFsIElEYXRhQmluZGluZ0NvbnRleHQgZGF0YUJpbmRpbmdDb250ZXh0KSB7Ci0JCUNsYXNzW10gdHlwZXMgPSB0cmVlVmlld2VyRGVzY3JpcHRpb24uZ2V0Q2xhc3NUeXBlcygpOwotCQlpZiAodHlwZXM9PW51bGwpIHJldHVybjsKLQkJCi0JCWZvciAoaW50IGk9MDsgaTx0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJaW50IGNvbENvdW50ID0gdHJlZVZpZXdlckRlc2NyaXB0aW9uLmdldENvbHVtbkNvdW50KHR5cGVzW2ldKTsJCQkJCQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2xDb3VudDsgaisrKSB7Ci0JCQkJQ29sdW1uIGNvbHVtbiA9IHRyZWVWaWV3ZXJEZXNjcmlwdGlvbi5nZXRDb2x1bW4odHlwZXNbaV0sIGopOwotCQkJCUNvbHVtbkluZm8gaW5mbyA9IG5ldyBDb2x1bW5JbmZvKCk7Ci0JCQkJY29sdW1uSW5mb3MucHV0KGNvbHVtbiwgaW5mbyk7Ci0JCQkJaWYgKGNvbHVtbi5nZXRDb252ZXJ0ZXIoKSA9PSBudWxsKSB7Ci0JCQkJCWluZm8uY29udmVydGVyRGVmYXVsdGVkID0gdHJ1ZTsKLQkJCQkJaWYgKGNvbHVtbi5nZXRQcm9wZXJ0eVR5cGUoKSE9bnVsbCkKLQkJCQkJCWluaXRpYWxpemVDb2x1bW5Db252ZXJ0ZXIoY29sdW1uLGNvbHVtbi5nZXRQcm9wZXJ0eVR5cGUoKSk7Ci0JCQkJCWVsc2UKLQkJCQkJICAgY29sdW1uLnNldENvbnZlcnRlcihuZXcgSWRlbnRpdHlDb252ZXJ0ZXIoU3RyaW5nLmNsYXNzKSk7Ci0JCQkJfQotCQkJCWlmIChjb2x1bW4uZ2V0VmFsaWRhdG9yKCkgPT0gbnVsbCkgewotCQkJCQlpbmZvLnZhbGlkYXRvckRlZmF1bHRlZCA9IHRydWU7Ci0JCQkJCWluaXRpYWxpemVDb2x1bW5WYWxpZGF0b3IoY29sdW1uLCBjb2x1bW4uZ2V0UHJvcGVydHlUeXBlKCkpOwotCQkJCX0KLS8vIFRPRE8gbmVlZCB0byB1c2UgdGhpcyB3aGVuIEJ1ZyAxMTM3MTMgaXMgZml4ZWQJCQkJCi0vLwkJCQlpZiAoY29sdW1uLmdldENlbGxFZGl0b3IoKSA9PSBudWxsKSB7Ci0vLwkJCQkJaW5mby5jZWxsRWRpdG9yRGVmYXVsdGVkID0gdHJ1ZTsKLS8vCQkJCQljb2x1bW4uc2V0Q2VsbEVkaXRvcihjcmVhdGVDZWxsRWRpdG9yKGNvbHVtbikpOwotLy8JCQkJfQotCQkJCQotCQkJfQotCQl9Ci0JCWlmICh0cmVlVmlld2VyRGVzY3JpcHRpb24uZ2V0Q2VsbE1vZGlmaWVyKCkgPT0gbnVsbCkgewkJCQotCQkJdHJlZVZpZXdlckRlc2NyaXB0aW9uLnNldENlbGxNb2RpZmllcihjcmVhdGVDZWxsTW9kaWZpZXIoZGF0YUJpbmRpbmdDb250ZXh0KSk7Ci0JCX0KLQkJaWYgKGNvbHVtbkluZm9zLmlzRW1wdHkoKSkKLQkJCWNvbHVtbkluZm9zPW51bGw7Ci0JfQotCi0KLQkKLQlwcm90ZWN0ZWQgQ29sdW1uIGdldENvbHVtbihDbGFzcyBpbnN0YW5jZVR5cGUsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdHJlZVZpZXdlckRlc2NyaXB0aW9uLmdldENvbHVtbihpbnN0YW5jZVR5cGUsIGNvbHVtbkluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBhZGRFbGVtZW50KGZpbmFsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBpbnQgaW5kZXgsIGZpbmFsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBmaXJlKSB7Ci0JCS8vIFZlcmlmeSBkZWZhdWx0cywgdGhlIGZpcnN0IHRpbWUgZGF0YSBjYW1lcyB0aHJvdWdoCi0JCWlmKGNvbHVtbkluZm9zICE9IG51bGwgJiYgdmFsdWUhPW51bGwpewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlVmlld2VyRGVzY3JpcHRpb24uZ2V0Q29sdW1uQ291bnQodmFsdWUuZ2V0Q2xhc3MoKSk7IGkrKykgewotCQkJCUNvbHVtbiBjb2x1bW4gPSB0cmVlVmlld2VyRGVzY3JpcHRpb24uZ2V0Q29sdW1uKHZhbHVlLmdldENsYXNzKCksIGkpOwotCQkJCUNvbHVtbkluZm8gY29sdW1uSW5mbyA9IChDb2x1bW5JbmZvKSBjb2x1bW5JbmZvcy5yZW1vdmUoY29sdW1uKTsKLQkJCQlpZiAoY29sdW1uSW5mbyE9bnVsbCAmJiBjb2x1bW4uZ2V0UHJvcGVydHlOYW1lKCkhPW51bGwpIHsKLQkJCQkJaWYoY29sdW1uLmdldFByb3BlcnR5VHlwZSgpID09IG51bGwgJiYgKGNvbHVtbkluZm8uY2VsbEVkaXRvckRlZmF1bHRlZCB8fCBjb2x1bW5JbmZvLmNvbnZlcnRlckRlZmF1bHRlZCB8fCBjb2x1bW5JbmZvLnZhbGlkYXRvckRlZmF1bHRlZCkpewotCQkJCQkJLy8gV29yayBvdXQgdGhlIHR5cGUgb2YgdGhlIGNvbHVtbiBmcm9tIHRoZSBwcm9wZXJ0eSBuYW1lIGZyb20gdGhlIGVsZW1lbnQgdHlwZSBpdHNlbGYKLQkJCQkJCVByb3BlcnR5SGVscGVyIGhlbHBlciA9IG5ldyBQcm9wZXJ0eUhlbHBlcihjb2x1bW4uZ2V0UHJvcGVydHlOYW1lKCksIHZhbHVlLmdldENsYXNzKCkpOwotCQkJCQkJQ2xhc3MgY29sdW1uVHlwZSA9aGVscGVyLmdldEdldHRlcigpLmdldFJldHVyblR5cGUoKTsKLQkJCQkJCWlmKGNvbHVtblR5cGUgIT0gbnVsbCl7Ci0JCQkJCQkJLy8gV2UgaGF2ZSBhIG1vcmUgZXhwbGljaXQgcHJvcGVydHkgdHlwZSB0aGF0IHdhcyBzdXBwbGllZAotCQkJCQkJCWlmKGNvbHVtbkluZm8uY29udmVydGVyRGVmYXVsdGVkKXsJCi0JCQkJCQkJCWluaXRpYWxpemVDb2x1bW5Db252ZXJ0ZXIoY29sdW1uLGNvbHVtblR5cGUpOwotCQkJCQkJCX0KLQkJCQkJCQlpZihjb2x1bW5JbmZvLnZhbGlkYXRvckRlZmF1bHRlZCl7Ci0JCQkJCQkJCWluaXRpYWxpemVDb2x1bW5WYWxpZGF0b3IoY29sdW1uLGNvbHVtblR5cGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkKLQkJCWlmIChjb2x1bW5JbmZvcy5pc0VtcHR5KCkpCi0JCQkJY29sdW1uSW5mb3MgPSBudWxsOwkvLyBObyBNb3JlIGNoZWNraW5nCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmFkZEVsZW1lbnQocGFyZW50RWxlbWVudCwgaW5kZXgsIHZhbHVlLCBmaXJlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbnRlcm5hbC9kYXRhYmluZGluZy92aWV3ZXJzL1VwZGF0YWJsZUNvbGxlY3Rpb25WaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3ZpZXdlcnMvVXBkYXRhYmxlQ29sbGVjdGlvblZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2YwZjBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ludGVybmFsL2RhdGFiaW5kaW5nL3ZpZXdlcnMvVXBkYXRhYmxlQ29sbGVjdGlvblZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5kYXRhYmluZGluZy52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlVwZGF0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0TGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGFibGVDb2xsZWN0aW9uVmlld2VyIGV4dGVuZHMgVXBkYXRhYmxlIGltcGxlbWVudHMKLQkJSVVwZGF0YWJsZUNvbGxlY3Rpb24gewotCi0JcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdExpc3RWaWV3ZXIgdmlld2VyOwotCi0JcHJpdmF0ZSBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZz1mYWxzZTsKLQotCS8qKgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQkvLyBUT0RPIGZvciBDb21ib1ZpZXdlciwgc29tZXRpbWVzIHlvdSB3YW50IHRvIGFkZCBhbiAiZW1wdHkgZWxlbWVudCIgc28KLQkvLyB0aGF0IHRoZSB1c2VyIGNhbiBudWxsIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4uLgotCXB1YmxpYyBVcGRhdGFibGVDb2xsZWN0aW9uVmlld2VyKEFic3RyYWN0TGlzdFZpZXdlciB2aWV3ZXIpIHsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiBlbGVtZW50cy50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCi0JCQkJCU9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJdmlld2VyLnNldElucHV0KHRoaXMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnRzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGFkZEVsZW1lbnQoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlpZiAoIXVwZGF0aW5nKSB7Ci0JCQl0cnkgewotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlpbnQgcG9zaXRpb24gPSBwcmltQWRkRWxlbWVudChlbGVtZW50LCBpbmRleCk7Ci0JCQkJaWYgKHBvc2l0aW9uID09IGVsZW1lbnRzLnNpemUoKSAtIDEKLQkJCQkJCXx8IHZpZXdlci5nZXRTb3J0ZXIoKSAhPSBudWxsKQotCQkJCQl2aWV3ZXIuYWRkKGVsZW1lbnQpOwotCQkJCWVsc2UKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQURELCBudWxsLCBlbGVtZW50LCBwb3NpdGlvbik7Ci0JCQkJcmV0dXJuIHBvc2l0aW9uOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQlwcml2YXRlIGludCBwcmltQWRkRWxlbWVudChPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCWludCBwb3NpdGlvbiA9IGVsZW1lbnRzLnNpemUoKTsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IGVsZW1lbnRzLnNpemUoKSkgewotCQkJcG9zaXRpb24gPSBlbGVtZW50cy5zaXplKCk7Ci0JCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQllbGVtZW50cy5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCQkJcG9zaXRpb24gPSBpbmRleDsKLQkJfQotCQlyZXR1cm4gcG9zaXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJaWYgKCF1cGRhdGluZykgewotCQkJdHJ5IHsKLQkJCQl1cGRhdGluZz10cnVlOwotCQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHMucmVtb3ZlKGluZGV4KTsKLQkJCQl2aWV3ZXIucmVtb3ZlKGVsZW1lbnQpOwotCQkJCWZpcmVDaGFuZ2VFdmVudChDaGFuZ2VFdmVudC5SRU1PVkUsIGVsZW1lbnQsIG51bGwsIGluZGV4KTsKLQkJCX0gZmluYWxseSAgewotCQkJCXVwZGF0aW5nPWZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQotCQlpZiAoIXVwZGF0aW5nKSB7ICAgICAgICAgICAgCi0JCQl0cnkgewotCQkJCXVwZGF0aW5nPXRydWU7Ci0JCQkJT2JqZWN0IG9sZDsKLQkJCQlpZiAoZWxlbWVudHMuZ2V0KGluZGV4KS5lcXVhbHMoZWxlbWVudCkpIHsKLQkJCQkJdmlld2VyLnVwZGF0ZShlbGVtZW50LCBudWxsKTsKLQkJCQkJb2xkID0gZWxlbWVudDsKLQkJCQl9IGVsc2UgewotCQkJCQlvbGQgPSBnZXRFbGVtZW50KGluZGV4KTsKLQkJCQkJcmVtb3ZlRWxlbWVudChpbmRleCk7Ci0JCQkJCWFkZEVsZW1lbnQoZWxlbWVudCwgaW5kZXgpOwotCQkJCX0KLQkJCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBvbGQsIGVsZW1lbnQsIGluZGV4KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdXBkYXRpbmc9ZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBlbGVtZW50cy5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRFbGVtZW50VHlwZSgpIHsKLQkJcmV0dXJuIE9iamVjdC5jbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwZGQyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBleGNsdWRpbmc9IioqL2ludGVybmFsLyIga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZWFhMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5qZmFjZSBwbHVnaW4uCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIHRoZSBvcmcuZWNsaXBzZS51aSBwbHVnaW4uCi1vcmcuZWNsaXBzZS5qZmFjZS9kZWJ1Zz1mYWxzZQotCi0jIExvZyBhIG1lc3NhZ2UgaWYgYSBkaWFsb2cgaXMgb3BlbmVkIHdpdGhvdXQgYSBwYXJlbnQKLW9yZy5lY2xpcHNlLmpmYWNlL2RlYnVnL2RpYWxvZy9ub3BhcmVudD1mYWxzZQotCi0jIFNob3cgdGhlIGpmYWNlIG5ldyBsb29rIGZvciB0aGUgcHJlZmVyZW5jZXMgZGlhbG9nCi1vcmcuZWNsaXBzZS5qZmFjZS9uZXdsb29rL3ByZWZlcmVuY2VzL3Nob3dOZXdMb29rPWZhbHNlCi0KLSMgUmVwb3J0IHdoZW4gYSB0b29sIGJhciBjb250cmlidXRpb24gaXRlbSBpcyBhc2tlZCBpdHMgdmlzaWJpbGl0eSBhZnRlciBiZWluZwotIyBkaXNwb3NlZC4gIFRPRE8gUmVtb3ZlIHRoaXMgb3B0aW9uPyAgQnVnIDUxMDAwCi1vcmcuZWNsaXBzZS5qZmFjZS90cmFjZS90b29sYmFyRGlzcG9zYWw9ZmFsc2UKLQotIyBSZXBvcnRzIHRoZSB0aW1lIHRvIHJ1biBhbiBhY3Rpb24KLW9yZy5lY2xpcHNlLmpmYWNlL3RyYWNlL2FjdGlvbnM9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczODdiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamZhY2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9uczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnN3dDwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3ZTZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNNb24gT2N0IDI0IDE1OjA3OjMwIEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NGI5ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEphbiAxMCAxNzozMjo1MCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT11c2VyCi1vcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQotb3JnLmVjbGlwc2UuamR0LnVpLmdldHRlcnNldHRlci51c2UuaXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmphdmFkb2M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLm92ZXJyaWRlYW5ub3RhdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcmV0dXJuIFJldHVybnMgdGhlICR7YmFyZV9maWVsZF9uYW1lfS5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcGFyYW0gJHtwYXJhbX0gVGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXQuXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgSmF2YSBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWxlY29tbWVudCIgbmFtZVw9ImZpbGVjb21tZW50Ij4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogQ29weXJpZ2h0IChjKSAke3llYXJ9IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4gKlxuICogQ29udHJpYnV0b3JzXDpcbiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcbiAqIEBzaW5jZSAzLjJcbiAqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCI+LyoqXG4gKiBcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cblxuJHt0eXBlY29tbWVudH1cbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9ja1xuJHtleGNlcHRpb25fdmFyfS5wcmludFN0YWNrVHJhY2UoKTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmJvZHkiIG5hbWVcPSJjb25zdHJ1Y3RvcmJvZHkiPiR7Ym9keV9zdGF0ZW1lbnR9XG4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWI8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5Ij5yZXR1cm4gJHtmaWVsZH07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjbGFzc2JvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNsYXNzIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNsYXNzYm9keSIgbmFtZVw9ImNsYXNzYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImludGVyZmFjZWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGludGVyZmFjZSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5pbnRlcmZhY2Vib2R5IiBuYW1lXD0iaW50ZXJmYWNlYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImVudW1ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmVudW1ib2R5IiBuYW1lXD0iZW51bWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJhbm5vdGF0aW9uYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgYW5ub3RhdGlvbiB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5hbm5vdGF0aW9uYm9keSIgbmFtZVw9ImFubm90YXRpb25ib2R5Ij5cbjwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTRiMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1NhdCBNYXIgMTkgMTU6MzE6MzEgRVNUIDIwMDUKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MAotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTEKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NDBhYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZmFjZQotQnVuZGxlLVZlcnNpb246IDMuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLAotIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5pbWFnZXMsCi0gb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MsCi0gb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cywKLSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLmZvcm1hdHRpbmcsCi0gb3JnLmVjbGlwc2UuamZhY2UuY29tbWFuZHMsCi0gb3JnLmVjbGlwc2UuamZhY2UuY29udGV4dHMsCi0gb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncywKLSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLmltYWdlcywKLSBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdCwKLSBvcmcuZWNsaXBzZS5qZmFjZS5pbWFnZXMsCi0gb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LAotIG9yZy5lY2xpcHNlLmpmYWNlLm1lbnVzLAotIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbiwKLSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLAotIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuaW1hZ2VzLAotIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLAotIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwsCi0gb3JnLmVjbGlwc2UuamZhY2Uudmlld2VycywKLSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLmRlZmVycmVkLAotIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdywKLSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQsCi0gb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLmltYWdlcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnN3dDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGMwMjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjM1MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL2NvbXBvbmVudCIKLSAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9lY2xpcHNlLm9yZy9jb21wb25lbnQgLi4vY29tcG9uZW50LnhzZCAiCi0gICBuYW1lPSJKRmFjZSI+Ci0gPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamZhY2UiIC8+Ci0KLSA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24iID4KLSAgIDx0eXBlIG5hbWU9IkFic3RyYWN0R3JvdXBNYXJrZXIiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iQWN0aW9uQ29udHJpYnV0aW9uSXRlbSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJFeHRlcm5hbEFjdGlvbk1hbmFnZXIiIHJlZmVyZW5jZT0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9Ikdyb3VwTWFya2VyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9IklBY3Rpb24iIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9IklDb250cmlidXRpb25JdGVtIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJJQ29udHJpYnV0aW9uTWFuYWdlck92ZXJyaWRlcyIgaW1wbGVtZW50PSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iSU1lbnVNYW5hZ2VyIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJTZXBhcmF0b3IiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iU3RhdHVzTGluZSIgcmVmZXJlbmNlPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iU3ViQ29udHJpYnV0aW9uSXRlbSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJUb29sQmFyQ29udHJpYnV0aW9uSXRlbSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gPC9wYWNrYWdlPgotCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MiIC8+Ci0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cyIgLz4KLSA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLmZvcm1hdHRpbmciIC8+Ci0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuamZhY2UuY29tbWFuZHMiIC8+Ci0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuamZhY2UuY29udGV4dHMiIC8+Ci0gCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncyI+Ci0gICA8dHlwZSBuYW1lPSJEaWFsb2dTZXR0aW5ncyIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gPC9wYWNrYWdlPgotCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uIiA+Ci0gICA8dHlwZSBuYW1lPSJNb2RhbENvbnRleHQiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gPC9wYWNrYWdlPgotCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZSIgPgotICAgIDx0eXBlIG5hbWU9IlByZWZlcmVuY2VDb252ZXJ0ZXIiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IlByZWZlcmVuY2VTdG9yZSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gPC9wYWNrYWdlPgotCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UiID4KLSAgIDx0eXBlIG5hbWU9IkNvbG9yUmVnaXN0cnkiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iRm9udFJlZ2lzdHJ5IiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9IkltYWdlQ2FjaGUiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iSW1hZ2VSZWdpc3RyeSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJKRmFjZVJlc291cmNlcyIgaW5zdGFudGlhdGU9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9IlN0cmluZ0NvbnZlcnRlciIgaW5zdGFudGlhdGU9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSA8L3BhY2thZ2U+Ci0KLSA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qZmFjZS51dGlsIiAvPgotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMiID4KLSAgIDx0eXBlIG5hbWU9IkFycmF5Q29udGVudFByb3ZpZGVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9IkNoZWNrYm94Q2VsbEVkaXRvciIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJDaGVja2JveFRhYmxlVmlld2VyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9IkNoZWNrYm94VHJlZVZpZXdlciIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJDb2xvckNlbGxFZGl0b3IiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iQ29sdW1uTGF5b3V0RGF0YSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJDb2x1bW5QaXhlbERhdGEiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iQ29sdW1uV2VpZ2h0RGF0YSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJDb21ib0JveENlbGxFZGl0b3IiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iSURlY29yYXRpb24iIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9Ikxpc3RWaWV3ZXIiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iU3RydWN0dXJlZFNlbGVjdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJUYWJsZVRyZWVWaWV3ZXIiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iVGFibGVWaWV3ZXIiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iVGV4dENlbGxFZGl0b3IiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgPHR5cGUgbmFtZT0iVHJlZVZpZXdlciIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICAKLSA8L3BhY2thZ2U+Ci0KLSA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLmRlZmVycmVkIiA+Ci0gICA8dHlwZSBuYW1lPSJJQ29uY3VycmVudE1vZGVsIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIAotIDwvcGFja2FnZT4KLQotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdyIgLz4KLSA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQiIC8+Ci0KLSA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIi8+Ci0KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2UvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODMwM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBKRmFjZQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYTQxN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFeHBvcnQgSkZhY2UiIGRlZmF1bHQ9ImV4cG9ydCIgYmFzZWRpcj0iLi4iPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8cHJvcGVydHkgbmFtZT0iZGVzdGRpciIgdmFsdWU9Ii4uLy4uL3BsdWdpbi1leHBvcnQiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iICB2YWx1ZT0ib3JnLmVjbGlwc2UuamZhY2UiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiAgdmFsdWU9Il8yLjEuMCIgLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QiICB2YWx1ZT0iJHtkZXN0ZGlyfS8ke3BsdWdpbn0ke3ZlcnNpb259IiAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgCTxlY2xpcHNlLmluY3JlbWVudGFsQnVpbGQgcHJvamVjdD0iJHtwbHVnaW59IiBraW5kPSJpbmNyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImV4cG9ydCIgZGVwZW5kcz0iYnVpbGQiPgotCQk8bWtkaXIgZGlyPSIke2Rlc3RkaXJ9IiAvPgotCQk8ZGVsZXRlIGRpcj0iJHtkZXN0fSIgLz4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0fSIgLz4KLQkJPGphciAKLQkJCWphcmZpbGU9IiR7ZGVzdH0vamZhY2UuamFyIgotCQkJYmFzZWRpcj0iYmluIgotCQkvPgotCQk8Y29weSBmaWxlPSJwbHVnaW4ueG1sIiB0b2Rpcj0iJHtkZXN0fSIvPgotCQk8Y29weSBmaWxlPSJwbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7ZGVzdH0iLz4KLQkJPHppcCB6aXBmaWxlPSIke2Rlc3R9L2pmYWNlc3JjLnppcCI+Ci0JCSAgICA8ZmlsZXNldCBkaXI9InNyYyIgLz4KLSAgCQk8L3ppcD4JCQkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vQWJzdHJhY3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9BYnN0cmFjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWE0NmZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9BYnN0cmFjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5FdmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogPHA+Ci0gKiBTb21lIGNvbW1vbiBmdW5jdGlvbmFsaXR5IHRvIHNoYXJlIGJldHdlZW4gaW1wbGVtZW50YXRpb25zIG9mCi0gKiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4gVGhpcyBmdW5jdGlvbmFsaXR5IGRlYWxzIHdpdGggdGhlIHByb3BlcnR5IGNoYW5nZQotICogZXZlbnQgbWVjaGFuaXNtLgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBuZWl0aGVyIGluc3RhbnRpYXRlIG5vciBleHRlbmQgdGhpcyBjbGFzcy4KLSAqIDwvcD4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBY3Rpb24gZXh0ZW5kcyBFdmVudE1hbmFnZXIgaW1wbGVtZW50cyBJQWN0aW9uIHsKLQotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZmluYWwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJYWRkTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIGFueSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgYSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4gT25seQotCSAqIGxpc3RlbmVycyByZWdpc3RlcmVkIGF0IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcmUgbm90aWZpZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgY2hhbmdlIGV2ZW50Ci0JICogCi0JICogQHNlZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShmaW5hbCBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWZpbmFsIE9iamVjdFtdIGxpc3QgPSBnZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7Ci0JCQkoKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBsaXN0W2ldKS5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBhbnkgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyB0aGF0IGEgcHJvcGVydHkgaGFzIGNoYW5nZWQuIE9ubHkKLQkgKiBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLiBUaGlzCi0JICogbWV0aG9kIGF2b2lkcyBjcmVhdGluZyBhbiBldmVudCBvYmplY3QgaWYgdGhlcmUgYXJlIG5vIGxpc3RlbmVycwotCSAqIHJlZ2lzdGVyZWQsIGJ1dCBjYWxscwotCSAqIDxjb2RlPmZpcmVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50KTwvY29kZT4gaWYgdGhlcmUgYXJlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGhhcyBjaGFuZ2VkCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogICAgICAgICAgICB0aGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiAKLQkgKiBAc2VlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0JCQlmaW5hbCBPYmplY3Qgb2xkVmFsdWUsIGZpbmFsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAoaXNMaXN0ZW5lckF0dGFjaGVkKCkpIHsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBwcm9wZXJ0eU5hbWUsCi0JCQkJCW9sZFZhbHVlLCBuZXdWYWx1ZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCWZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJlbW92ZUxpc3RlbmVyT2JqZWN0KGxpc3RlbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9BYnN0cmFjdEdyb3VwTWFya2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vQWJzdHJhY3RHcm91cE1hcmtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTI4MDhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9BYnN0cmFjdEdyb3VwTWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogQWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgZ3JvdXAgbWFya2VyIGNsYXNzZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSB0aGUgZnJhbWV3b3JrLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RHcm91cE1hcmtlciBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0gewotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciB1c2UgYnkgc3ViY2xhc3Nlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RHcm91cE1hcmtlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgZ3JvdXAgbWFya2VyIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogVGhlIGdyb3VwIG5hbWUgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIGVtcHR5IHN0cmluZy4KLSAgICAgKiBUaGUgZ3JvdXAgbmFtZSBpcyBhbHNvIHVzZWQgYXMgdGhlIGl0ZW0gaWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGdyb3VwTmFtZSB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RHcm91cE1hcmtlcihTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0gICAgICAgIHN1cGVyKGdyb3VwTmFtZSk7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoZ3JvdXBOYW1lICE9IG51bGwgJiYgZ3JvdXBOYW1lLmxlbmd0aCgpID4gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ3JvdXAgbmFtZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGdyb3VwIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdyb3VwTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldElkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkFic3RyYWN0R3JvdXBNYXJrZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+Ci0gICAgICogbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSBpZCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR3JvdXBNYXJrZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRJZCgpICE9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTFmODE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotCi0vKioKLSAqIFRoZSBzdGFuZGFyZCBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhbiBhY3Rpb24uCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIDxjb2RlPklBY3Rpb24ucnVuPC9jb2RlPiBtZXRob2QgdG8gY2Fycnkgb3V0Ci0gKiB0aGUgYWN0aW9uJ3Mgc2VtYW50aWNzLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElNZW51Q3JlYXRvciBWQUxfRFJPUF9ET1dOX01FTlUgPSBuZXcgSU1lbnVDcmVhdG9yKCkgewotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIE1lbnUgZ2V0TWVudShDb250cm9sIHBhcmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0KLQkvKgotCSAqIFRoZSBsaXN0IG9mIGRlZmF1bHQgdmFsdWVzIHRoZSBhY3Rpb24gY2FuIGhhdmUuIFRoZXNlIHZhbHVlcyB3aWxsCi0JICogZGV0ZXJtaW5lIHRoZSBzdHlsZSBvZiB0aGUgYWN0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxfUFVTSF9CVE4gPSAiUFVTSF9CVE4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFZBTF9SQURJT19CVE5fT0ZGID0gbmV3IEludGVnZXIoMCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFZBTF9SQURJT19CVE5fT04gPSBuZXcgSW50ZWdlcigxKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW4gVkFMX1RPR0dMRV9CVE5fT0ZGID0gQm9vbGVhbi5GQUxTRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW4gVkFMX1RPR0dMRV9CVE5fT04gPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhbiBhY2NlbGVyYXRvciBrZXkgY29kZSB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Q29kZQotCSAqICAgICAgICAgICAgdGhlIGtleSBjb2RlIHRvIGJlIHRyYW5zbGF0ZWQKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBrZXkgY29kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRBY2NlbGVyYXRvcihpbnQga2V5Q29kZSkgewotCQlyZXR1cm4gTGVnYWN5QWN0aW9uVG9vbHMuY29udmVydEFjY2VsZXJhdG9yKGtleUNvZGUpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gYWNjZWxlcmF0b3IgdGV4dCwgYW5kIGNvbnZlcnRzIGl0IHRvIGFuIGFjY2VsZXJhdG9yIGtleQotCSAqIGNvZGUuCi0JICogCi0JICogQHBhcmFtIGFjY2VsZXJhdG9yVGV4dAotCSAqICAgICAgICAgICAgdGhlIGFjY2VsZXJhdG9yIHRleHQKLQkgKiBAcmV0dXJuIHRoZSBTV1Qga2V5IGNvZGUsIG9yIDAgaWYgdGhlcmUgaXMgbm8gYWNjZWxlcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0QWNjZWxlcmF0b3IoU3RyaW5nIGFjY2VsZXJhdG9yVGV4dCkgewotCQlyZXR1cm4gTGVnYWN5QWN0aW9uVG9vbHMuY29udmVydEFjY2VsZXJhdG9yKGFjY2VsZXJhdG9yVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogTWFwcyBhIHN0YW5kYXJkIGtleWJvYXJkIGtleSBuYW1lIHRvIGFuIFNXVCBrZXkgY29kZS4gS2V5IG5hbWVzIGFyZQotCSAqIGNvbnZlcnRlZCB0byB1cHBlciBjYXNlIGJlZm9yZSBjb21wYXJpc29uLiBJZiB0aGUga2V5IG5hbWUgaXMgYSBzaW5nbGUKLQkgKiBsZXR0ZXIsIGZvciBleGFtcGxlICJTIiwgaXRzIGNoYXJhY3RlciBjb2RlIGlzIHJldHVybmVkLgotCSAqIDxwPgotCSAqIFRoZSBmb2xsb3dpbmcga2V5IG5hbWVzIGFyZSBrbm93biAoY2FzZSBpcyBpZ25vcmVkKToKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPiJCQUNLU1BBQ0UiPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJUQUIiPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJSRVRVUk4iPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJFTlRFUiI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+IkVTQyI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+IkVTQ0FQRSI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+IkRFTEVURSI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+IlNQQUNFIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iQVJST1dfVVAiPC9jb2RlPiwgPGNvZGU+IkFSUk9XX0RPV04iPC9jb2RlPiwKLQkgKiA8Y29kZT4iQVJST1dfTEVGVCI8L2NvZGU+LCBhbmQgPGNvZGU+IkFSUk9XX1JJR0hUIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iUEFHRV9VUCI8L2NvZGU+IGFuZCA8Y29kZT4iUEFHRV9ET1dOIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iSE9NRSI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+IkVORCI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+IklOU0VSVCI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+IkYxIjwvY29kZT4sIDxjb2RlPiJGMiI8L2NvZGU+IHRocm91Z2ggPGNvZGU+IkYxMiI8L2NvZGU+PC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiAgICAgICAgICAgIHRoZSBrZXkgbmFtZQotCSAqIEByZXR1cm4gdGhlIFNXVCBrZXkgY29kZSwgPGNvZGU+LTE8L2NvZGU+IGlmIG5vIG1hdGNoIHdhcyBmb3VuZAotCSAqIEBzZWUgU1dUCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZmluZEtleUNvZGUoU3RyaW5nIHRva2VuKSB7Ci0JCXJldHVybiBMZWdhY3lBY3Rpb25Ub29scy5maW5kS2V5Q29kZSh0b2tlbik7Ci0JfQotCi0JLyoqCi0JICogTWFwcyBhbiBTV1Qga2V5IGNvZGUgdG8gYSBzdGFuZGFyZCBrZXlib2FyZCBrZXkgbmFtZS4gVGhlIGtleSBjb2RlIGlzCi0JICogc3RyaXBwZWQgb2YgbW9kaWZpZXJzIChTV1QuQ1RSTCwgU1dULkFMVCwgU1dULlNISUZULCBhbmQgU1dULkNPTU1BTkQpLiBJZgotCSAqIHRoZSBrZXkgY29kZSBpcyBub3QgYW4gU1dUIGNvZGUgKGZvciBleGFtcGxlIGlmIGl0IGEga2V5IGNvZGUgZm9yIHRoZSBrZXkKLQkgKiAnUycpLCBhIHN0cmluZyBjb250YWluaW5nIGEgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBrZXkgY29kZSBpcwotCSAqIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBrZXlDb2RlCi0JICogICAgICAgICAgICB0aGUga2V5IGNvZGUgdG8gYmUgdHJhbnNsYXRlZAotCSAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUga2V5IGNvZGUKLQkgKiBAc2VlIFNXVAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kS2V5U3RyaW5nKGludCBrZXlDb2RlKSB7Ci0JCXJldHVybiBMZWdhY3lBY3Rpb25Ub29scy5maW5kS2V5U3RyaW5nKGtleUNvZGUpOwotCX0KLQotCS8qKgotCSAqIE1hcHMgc3RhbmRhcmQga2V5Ym9hcmQgbW9kaWZpZXIga2V5IG5hbWVzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFNXVAotCSAqIG1vZGlmaWVyIGJpdC4gVGhlIGZvbGxvd2luZyBtb2RpZmllciBrZXkgbmFtZXMgYXJlIHJlY29nbml6ZWQgKGNhc2UgaXMKLQkgKiBpZ25vcmVkKTogPGNvZGU+IkNUUkwiPC9jb2RlPiwgPGNvZGU+IlNISUZUIjwvY29kZT4sCi0JICogPGNvZGU+IkFMVCI8L2NvZGU+LCBhbmQgPGNvZGU+IkNPTU1BTkQiPC9jb2RlPi4gVGhlIGdpdmVuIG1vZGlmaWVyCi0JICoga2V5IG5hbWUgaXMgY29udmVydGVkIHRvIHVwcGVyIGNhc2UgYmVmb3JlIGNvbXBhcmlzb24uCi0JICogCi0JICogQHBhcmFtIHRva2VuCi0JICogICAgICAgICAgICB0aGUgbW9kaWZpZXIga2V5IG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBTV1QgbW9kaWZpZXIgYml0LCBvciA8Y29kZT4wPC9jb2RlPiBpZiBubyBtYXRjaCB3YXMgZm91bmQKLQkgKiBAc2VlIFNXVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGZpbmRNb2RpZmllcihTdHJpbmcgdG9rZW4pIHsKLQkJcmV0dXJuIExlZ2FjeUFjdGlvblRvb2xzLmZpbmRNb2RpZmllcih0b2tlbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBTV1QgbW9kaWZpZXIgYml0IChTV1QuQ1RSTCwKLQkgKiBTV1QuQUxULCBTV1QuU0hJRlQsIGFuZCBTV1QuQ09NTUFORCkuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICoga2V5IGNvZGUgaXMgbm90IGFuIFNXVCBtb2RpZmllciBiaXQuCi0JICogCi0JICogQHBhcmFtIGtleUNvZGUKLQkgKiAgICAgICAgICAgIHRoZSBTV1QgbW9kaWZpZXIgYml0IHRvIGJlIHRyYW5zbGF0ZWQKLQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFNXVCBtb2RpZmllciBiaXQsIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IGNvZGUgd2FzIG5vdCBhbiBTV1QgbW9kaWZpZXIgYml0Ci0JICogQHNlZSBTV1QKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZE1vZGlmaWVyU3RyaW5nKGludCBrZXlDb2RlKSB7Ci0JCXJldHVybiBMZWdhY3lBY3Rpb25Ub29scy5maW5kTW9kaWZpZXJTdHJpbmcoa2V5Q29kZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciByZW1vdmluZyBhbnkgb3B0aW9uYWwgYWNjZWxlcmF0b3IgdGV4dCBmcm9tIHRoZQotCSAqIGdpdmVuIHN0cmluZy4gVGhlIGFjY2VsZXJhdG9yIHRleHQgYXBwZWFycyBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LCBhbmQgaXMKLQkgKiBzZXBhcmF0ZWQgZnJvbSB0aGUgbWFpbiBwYXJ0IGJ5IGEgc2luZ2xlIHRhYiBjaGFyYWN0ZXIgPGNvZGU+J1x0JzwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0Ci0JICogQHJldHVybiB0aGUgdGV4dCBzYW5zIGFjY2VsZXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWNjZWxlcmF0b3JUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBMZWdhY3lBY3Rpb25Ub29scy5yZW1vdmVBY2NlbGVyYXRvclRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciByZW1vdmluZyBhbnkgbW5lbW9uaWNzIGZyb20gdGhlIGdpdmVuIHN0cmluZy4gRm9yCi0JICogZXhhbXBsZSwgPGNvZGU+cmVtb3ZlTW5lbW9uaWNzKCImT3BlbiIpPC9jb2RlPiB3aWxsIHJldHVybgotCSAqIDxjb2RlPiJPcGVuIjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0Ci0JICogQHJldHVybiB0aGUgdGV4dCBzYW5zIG1uZW1vbmljcwotCSAqIAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVNbmVtb25pY3MoU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIExlZ2FjeUFjdGlvblRvb2xzLnJlbW92ZU1uZW1vbmljcyh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFjdGlvbidzIGFjY2VsZXJhdG9yOyA8Y29kZT4wPC9jb2RlPiBtZWFucyBub25lLgotCSAqLwotCXByaXZhdGUgaW50IGFjY2VsZXJhdG9yID0gMDsKLQotCS8qKgotCSAqIFRoaXMgYWN0aW9uJ3MgYWN0aW9uIGRlZmluaXRpb24gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYWN0aW9uRGVmaW5pdGlvbklkOwotCi0JLyoqCi0JICogVGhpcyBhY3Rpb24ncyBkZXNjcmlwdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgYWN0aW9uJ3MgZGlzYWJsZWQgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZGlzYWJsZWRJbWFnZTsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGlzIGFjdGlvbiBpcyBlbmFibGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQotCS8qKgotCSAqIEFuIGFjdGlvbidzIGhlbHAgbGlzdGVuZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJpdmF0ZSBIZWxwTGlzdGVuZXIgaGVscExpc3RlbmVyOwotCi0JLyoqCi0JICogVGhpcyBhY3Rpb24ncyBob3ZlciBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBob3ZlckltYWdlOwotCi0JLyoqCi0JICogVGhpcyBhY3Rpb24ncyBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBpZDsKLQotCS8qKgotCSAqIFRoaXMgYWN0aW9uJ3MgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgaW1hZ2U7Ci0KLQkvKioKLQkgKiBUaGlzIGFjdGlvbidzIHRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCS8qKgotCSAqIFRoaXMgYWN0aW9uJ3MgdG9vbCB0aXAgdGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyB0b29sVGlwVGV4dDsKLQotCS8qKgotCSAqIEhvbGRzIHRoZSBhY3Rpb24ncyBtZW51IGNyZWF0b3IgKGFuIElNZW51Q3JlYXRvcikgb3IgY2hlY2tlZCBzdGF0ZSAoYQotCSAqIEJvb2xlYW4gZm9yIHRvZ2dsZSBidXR0b24sIG9yIGFuIEludGVnZXIgZm9yIHJhZGlvIGJ1dHRvbiksIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbmVpdGhlciBoYXZlIGJlZW4gc2V0LgotCSAqIDxwPgotCSAqIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGFmZmVjdHMgdGhlIHZhbHVlIG9mIDxjb2RlPmdldFN0eWxlKCk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiB3aXRoIG5vIHRleHQgYW5kIG5vIGltYWdlLgotCSAqIDxwPgotCSAqIENvbmZpZ3VyZSB0aGUgYWN0aW9uIGxhdGVyIHVzaW5nIHRoZSBzZXQgbWV0aG9kcy4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIEFjdGlvbigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIHdpdGggdGhlIGdpdmVuIHRleHQgYW5kIG5vIGltYWdlLiBDYWxscyB0aGUgemVyby1hcmcKLQkgKiBjb25zdHJ1Y3RvciwgdGhlbiA8Y29kZT5zZXRUZXh0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB1c2VkIGFzIHRoZSB0ZXh0IGZvciB0aGUgYWN0aW9uLCBvcgotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gdGV4dAotCSAqIEBzZWUgI3NldFRleHQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiB3aXRoIHRoZSBnaXZlbiB0ZXh0IGFuZCBpbWFnZS4gQ2FsbHMgdGhlIHplcm8tYXJnCi0JICogY29uc3RydWN0b3IsIHRoZW4gPGNvZGU+c2V0VGV4dDwvY29kZT4gYW5kCi0JICogPGNvZGU+c2V0SW1hZ2VEZXNjcmlwdG9yPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIGFjdGlvbidzIHRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24ncyBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgICAgIGltYWdlCi0JICogQHNlZSAjc2V0VGV4dAotCSAqIEBzZWUgI3NldEltYWdlRGVzY3JpcHRvcgotCSAqLwotCXByb3RlY3RlZCBBY3Rpb24oU3RyaW5nIHRleHQsIEltYWdlRGVzY3JpcHRvciBpbWFnZSkgewotCQl0aGlzKHRleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIHdpdGggdGhlIGdpdmVuIHRleHQgYW5kIHN0eWxlLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgYWN0aW9uJ3MgdGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gdGV4dAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgb25lIG9mIDxjb2RlPkFTX1BVU0hfQlVUVE9OPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkFTX0NIRUNLX0JPWDwvY29kZT4sIDxjb2RlPkFTX0RST1BfRE9XTl9NRU5VPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkFTX1JBRElPX0JVVFRPTjwvY29kZT4sIGFuZAotCSAqICAgICAgICAgICAgPGNvZGU+QVNfVU5TUEVDSUZJRUQ8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBBY3Rpb24oU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQl0aGlzKHRleHQpOwotCQlzd2l0Y2ggKHN0eWxlKSB7Ci0JCWNhc2UgQVNfUFVTSF9CVVRUT046Ci0JCQl2YWx1ZSA9IFZBTF9QVVNIX0JUTjsKLQkJCWJyZWFrOwotCQljYXNlIEFTX0NIRUNLX0JPWDoKLQkJCXZhbHVlID0gVkFMX1RPR0dMRV9CVE5fT0ZGOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVNfRFJPUF9ET1dOX01FTlU6Ci0JCQl2YWx1ZSA9IFZBTF9EUk9QX0RPV05fTUVOVTsKLQkJCWJyZWFrOwotCQljYXNlIEFTX1JBRElPX0JVVFRPTjoKLQkJCXZhbHVlID0gVkFMX1JBRElPX0JUTl9PRkY7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEFjY2VsZXJhdG9yKCkgewotCQlyZXR1cm4gYWNjZWxlcmF0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgewotCQlyZXR1cm4gYWN0aW9uRGVmaW5pdGlvbklkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJcmV0dXJuIGdldFRvb2xUaXBUZXh0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkaXNhYmxlZEltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgSGVscExpc3RlbmVyIGdldEhlbHBMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGhlbHBMaXN0ZW5lcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGhvdmVySW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0JICovCi0JcHVibGljIElNZW51Q3JlYXRvciBnZXRNZW51Q3JlYXRvcigpIHsKLQkJLy8gVGhlIGRlZmF1bHQgZHJvcCBkb3duIG1lbnUgdmFsdWUgaXMgb25seSB1c2VkCi0JCS8vIHRvIG1hcmsgdGhpcyBhY3Rpb24gcmVxdWVzdGVkIHN0eWxlLiBTbyBkbyBub3QKLQkJLy8gcmV0dXJuIGl0LiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb25zLgotCQlpZiAodmFsdWUgPT0gVkFMX0RST1BfRE9XTl9NRU5VKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIElNZW51Q3JlYXRvcikKLQkJCXJldHVybiAoSU1lbnVDcmVhdG9yKSB2YWx1ZTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7Ci0JCS8vIEluZmVyIHRoZSBzdHlsZSBmcm9tIHRoZSB2YWx1ZSBmaWVsZC4KLQkJaWYgKHZhbHVlID09IFZBTF9QVVNIX0JUTiB8fCB2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIEFTX1BVU0hfQlVUVE9OOwotCQlpZiAodmFsdWUgPT0gVkFMX1RPR0dMRV9CVE5fT04gfHwgdmFsdWUgPT0gVkFMX1RPR0dMRV9CVE5fT0ZGKQotCQkJcmV0dXJuIEFTX0NIRUNLX0JPWDsKLQkJaWYgKHZhbHVlID09IFZBTF9SQURJT19CVE5fT04gfHwgdmFsdWUgPT0gVkFMX1JBRElPX0JUTl9PRkYpCi0JCQlyZXR1cm4gQVNfUkFESU9fQlVUVE9OOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJTWVudUNyZWF0b3IpCi0JCQlyZXR1cm4gQVNfRFJPUF9ET1dOX01FTlU7Ci0KLQkJLy8gV2Ugc2hvdWxkIG5ldmVyIGdldCB0byB0aGlzIGxpbmUuLi4KLQkJcmV0dXJuIEFTX1BVU0hfQlVUVE9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gdG9vbFRpcFRleHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpIHsKLQkJcmV0dXJuIHZhbHVlID09IFZBTF9UT0dHTEVfQlROX09OIHx8IHZhbHVlID09IFZBTF9SQURJT19CVE5fT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSGFuZGxlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0cyB0aGUgb3V0Y29tZSBvZiB0aGUgcnVubmluZyBvZiB0aGlzIGFjdGlvbiB2aWEgdGhlCi0JICoge0BsaW5rIElBY3Rpb24jUkVTVUxUfSBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gc3VjY2VzcwotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFjdGlvbiBzdWNjZWVkZWQgYW5kCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGFjdGlvbiBmYWlsZWQgb3Igd2FzIG5vdCBjb21wbGV0ZWQKLQkgKiBAc2VlIElBY3Rpb24jUkVTVUxUCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG5vdGlmeVJlc3VsdChib29sZWFuIHN1Y2Nlc3MpIHsKLQkJLy8gYXZvaWQgQm9vbGVhbi52YWx1ZU9mKGJvb2xlYW4pIHRvIGFsbG93IGNvbXBpbGF0aW9uIGFnYWluc3QgSkNMCi0JCS8vIEZvdW5kYXRpb24gKGJ1ZyA4MDA1OSkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKFJFU1VMVCwgbnVsbCwgc3VjY2VzcyA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUFjdGlvbjwvY29kZT4gbWV0aG9kIGRvZXMKLQkgKiBub3RoaW5nLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCBuZWVkCi0JICogaW5mb3JtYXRpb24gZnJvbSB0aGUgdHJpZ2dlcmluZyBldmVudCwgb3Igb3ZlcnJpZGUKLQkgKiA8Y29kZT5ydW5XaXRoRXZlbnQoRXZlbnQpPC9jb2RlPiBpZiB0aGV5IGRvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUFjdGlvbjwvY29kZT4gbWV0aG9kIGlnbm9yZXMKLQkgKiB0aGUgZXZlbnQgYXJndW1lbnQsIGFuZCBzaW1wbHkgY2FsbHMgPGNvZGU+cnVuKCk8L2NvZGU+LiBTdWJjbGFzc2VzCi0JICogc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgbmVlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0cmlnZ2VyaW5nCi0JICogZXZlbnQsIG9yIG92ZXJyaWRlIDxjb2RlPnJ1bigpPC9jb2RlPiBpZiBub3QuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgU1dUIGV2ZW50IHdoaWNoIHRyaWdnZXJlZCB0aGlzIGFjdGlvbiBiZWluZyBydW4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bigpOwotCX0KLQotCS8qCi0JICogQHNlZSBJQWN0aW9uI3NldEFjY2VsZXJhdG9yKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2NlbGVyYXRvcihpbnQga2V5Y29kZSkgewotCQl0aGlzLmFjY2VsZXJhdG9yID0ga2V5Y29kZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uRGVmaW5pdGlvbklkKFN0cmluZyBpZCkgewotCQlhY3Rpb25EZWZpbml0aW9uSWQgPSBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKLQkJT2JqZWN0IG5ld1ZhbHVlID0gbnVsbDsKLQotCQkvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgaWYgdGhlIHN0eWxlIGlzIG5vdAotCQkvLyBzZXQgeWV0LCB0aGVuIGNvbnZlcnQgaXQgdG8gYSB0b2dnbGUgYnV0dG9uLgotCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBWQUxfVE9HR0xFX0JUTl9PTgotCQkJCXx8IHZhbHVlID09IFZBTF9UT0dHTEVfQlROX09GRikgewotCQkJbmV3VmFsdWUgPSBjaGVja2VkID8gVkFMX1RPR0dMRV9CVE5fT04gOiBWQUxfVE9HR0xFX0JUTl9PRkY7Ci0JCX0gZWxzZSBpZiAodmFsdWUgPT0gVkFMX1JBRElPX0JUTl9PTiB8fCB2YWx1ZSA9PSBWQUxfUkFESU9fQlROX09GRikgewotCQkJbmV3VmFsdWUgPSBjaGVja2VkID8gVkFMX1JBRElPX0JUTl9PTiA6IFZBTF9SQURJT19CVE5fT0ZGOwotCQl9IGVsc2UgewotCQkJLy8gU29tZSBvdGhlciBzdHlsZSBhbHJlYWR5LCBzbyBkbyBub3RoaW5nLgotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG5ld1ZhbHVlICE9IHZhbHVlKSB7Ci0JCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQkJaWYgKGNoZWNrZWQpCi0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKENIRUNLRUQsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRSk7Ci0JCQllbHNlCi0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKENIRUNLRUQsIEJvb2xlYW4uVFJVRSwgQm9vbGVhbi5GQUxTRSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHRleHQpIHsKLQotCQlpZiAoKGRlc2NyaXB0aW9uID09IG51bGwgJiYgdGV4dCAhPSBudWxsKQotCQkJCXx8IChkZXNjcmlwdGlvbiAhPSBudWxsICYmIHRleHQgPT0gbnVsbCkKLQkJCQl8fCAoZGVzY3JpcHRpb24gIT0gbnVsbCAmJiB0ZXh0ICE9IG51bGwgJiYgIXRleHQKLQkJCQkJCS5lcXVhbHMoZGVzY3JpcHRpb24pKSkgewotCQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQlkZXNjcmlwdGlvbiA9IHRleHQ7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2UoREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JCWlmIChkaXNhYmxlZEltYWdlICE9IG5ld0ltYWdlKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3Igb2xkSW1hZ2UgPSBkaXNhYmxlZEltYWdlOwotCQkJZGlzYWJsZWRJbWFnZSA9IG5ld0ltYWdlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElNQUdFLCBvbGRJbWFnZSwgbmV3SW1hZ2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmIChlbmFibGVkICE9IHRoaXMuZW5hYmxlZCkgewotCQkJQm9vbGVhbiBvbGRWYWwgPSB0aGlzLmVuYWJsZWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJQm9vbGVhbiBuZXdWYWwgPSBlbmFibGVkID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2UoRU5BQkxFRCwgb2xkVmFsLCBuZXdWYWwpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaGVscExpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotCQlpZiAoaG92ZXJJbWFnZSAhPSBuZXdJbWFnZSkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIG9sZEltYWdlID0gaG92ZXJJbWFnZTsKLQkJCWhvdmVySW1hZ2UgPSBuZXdJbWFnZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJTUFHRSwgb2xkSW1hZ2UsIG5ld0ltYWdlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JCWlmIChpbWFnZSAhPSBuZXdJbWFnZSkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIG9sZEltYWdlID0gaW1hZ2U7Ci0JCQlpbWFnZSA9IG5ld0ltYWdlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElNQUdFLCBvbGRJbWFnZSwgbmV3SW1hZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWVudSBjcmVhdG9yIGZvciB0aGlzIGFjdGlvbi4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpdCBvdmVycmlkZXMgdGhlIGNoZWNrIHN0YXR1cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGNyZWF0b3IKLQkgKiAgICAgICAgICAgIHRoZSBtZW51IGNyZWF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZW51Q3JlYXRvcihJTWVudUNyZWF0b3IgY3JlYXRvcikgewotCQkvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgaWYgdGhlIHN0eWxlIGlzIG5vdAotCQkvLyBzZXQgeWV0LCB0aGVuIGNvbnZlcnQgaXQgdG8gYSBkcm9wIGRvd24gbWVudS4KLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gY3JlYXRvcjsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIElNZW51Q3JlYXRvcikKLQkJCXZhbHVlID0gY3JlYXRvciA9PSBudWxsID8gVkFMX0RST1BfRE9XTl9NRU5VIDogY3JlYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZXh0IGZvciB0aGlzIGFjdGlvbi4KLQkgKiA8cD4KLQkgKiBGaXJlcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudCBmb3IgdGhlIDxjb2RlPlRFWFQ8L2NvZGU+IHByb3BlcnR5IGlmIHRoZQotCSAqIHRleHQgYWN0dWFsbHkgY2hhbmdlcyBhcyBhIGNvbnNlcXVlbmNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgYWNjZWxlcmF0b3IgaXMgaWRlbnRpZmllZCBieSB0aGUgbGFzdCBpbmRleCBvZiBhIHRhYiBjaGFyYWN0ZXIuIElmCi0JICogdGhlcmUgYXJlIG5vIHRhYiBjaGFyYWN0ZXJzLCB0aGVuIGl0IGlzIGlkZW50aWZpZWQgYnkgdGhlIGxhc3QgaW5kZXggb2YgYQotCSAqICdAJyBjaGFyYWN0ZXIuIElmIG5laXRoZXIsIHRoZW4gdGhlcmUgaXMgbm8gYWNjZWxlcmF0b3IgdGV4dC4gTm90ZSB0aGF0Ci0JICogaWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgJ0AnIGNoYXJhY3RlciBpbnRvIHRoZSB0ZXh0IChidXQgbm8gYWNjZWxlcmF0b3IsCi0JICogeW91IGNhbiBzaW1wbHkgaW5zZXJ0IGEgJ0AnIG9yIGEgdGFiIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIG9sZFRleHQgPSB0aGlzLnRleHQ7Ci0JCWludCBvbGRBY2NlbCA9IHRoaXMuYWNjZWxlcmF0b3I7Ci0JCXRoaXMudGV4dCA9IHRleHQ7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBhY2NlbGVyYXRvclRleHQgPSBMZWdhY3lBY3Rpb25Ub29scwotCQkJCQkuZXh0cmFjdEFjY2VsZXJhdG9yVGV4dCh0ZXh0KTsKLQkJCWlmIChhY2NlbGVyYXRvclRleHQgIT0gbnVsbCkgewotCQkJCWludCBuZXdBY2NlbGVyYXRvciA9IExlZ2FjeUFjdGlvblRvb2xzCi0JCQkJCQkuY29udmVydExvY2FsaXplZEFjY2VsZXJhdG9yKGFjY2VsZXJhdG9yVGV4dCk7Ci0JCQkJLy8gQmUgc3VyZSB0byBub3Qgd2lwZSBvdXQgdGhlIGFjY2VsZXJhdG9yIGlmIG5vdGhpbmcgZm91bmQKLQkJCQlpZiAobmV3QWNjZWxlcmF0b3IgPiAwKSB7Ci0JCQkJCXNldEFjY2VsZXJhdG9yKG5ld0FjY2VsZXJhdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCEodGhpcy5hY2NlbGVyYXRvciA9PSBvbGRBY2NlbCAmJiAob2xkVGV4dCA9PSBudWxsID8gdGhpcy50ZXh0ID09IG51bGwKLQkJCQk6IG9sZFRleHQuZXF1YWxzKHRoaXMudGV4dCkpKSkgewotCQkJZmlyZVByb3BlcnR5Q2hhbmdlKFRFWFQsIG9sZFRleHQsIHRoaXMudGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sIHRpcCB0ZXh0IGZvciB0aGlzIGFjdGlvbi4KLQkgKiA8cD4KLQkgKiBGaXJlcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudCBmb3IgdGhlIDxjb2RlPlRPT0xfVElQX1RFWFQ8L2NvZGU+Ci0JICogcHJvcGVydHkgaWYgdGhlIHRvb2wgdGlwIHRleHQgYWN0dWFsbHkgY2hhbmdlcyBhcyBhIGNvbnNlcXVlbmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFRpcFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0b29sIHRpcCB0ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRvb2xUaXBUZXh0KSB7Ci0JCVN0cmluZyBvbGRUb29sVGlwVGV4dCA9IHRoaXMudG9vbFRpcFRleHQ7Ci0JCWlmICghKG9sZFRvb2xUaXBUZXh0ID09IG51bGwgPyB0b29sVGlwVGV4dCA9PSBudWxsIDogb2xkVG9vbFRpcFRleHQKLQkJCQkuZXF1YWxzKHRvb2xUaXBUZXh0KSkpIHsKLQkJCXRoaXMudG9vbFRpcFRleHQgPSB0b29sVGlwVGV4dDsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShUT09MX1RJUF9URVhULCBvbGRUb29sVGlwVGV4dCwgdG9vbFRpcFRleHQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vQWN0aW9uQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0FjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1YWY3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vQWN0aW9uQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkV4dGVybmFsQWN0aW9uTWFuYWdlci5JQmluZGluZ01hbmFnZXJDYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLklLZXlMb29rdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlMb29rdXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Mb2NhbFJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBBIGNvbnRyaWJ1dGlvbiBpdGVtIHdoaWNoIGRlbGVnYXRlcyB0byBhbiBhY3Rpb24uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0KLSAgICAvKioKLSAgICAgKiBNb2RlIGJpdDogU2hvdyB0ZXh0IG9uIHRvb2wgaXRlbXMsIGV2ZW4gaWYgYW4gaW1hZ2UgaXMgcHJlc2VudC4KLSAgICAgKiBJZiB0aGlzIG1vZGUgYml0IGlzIG5vdCBzZXQsIHRleHQgaXMgb25seSBzaG93biBvbiB0b29sIGl0ZW1zIGlmIHRoZXJlIGlzIAotICAgICAqIG5vIGltYWdlIHByZXNlbnQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IE1PREVfRk9SQ0VfVEVYVCA9IDE7Ci0KLSAgICAvKiogYSBzdHJpbmcgaW5zZXJ0ZWQgaW4gdGhlIG1pZGRsZSBvZiB0ZXh0IHRoYXQgaGFzIGJlZW4gc2hvcnRlbmVkICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVsbGlwc2lzID0gIi4uLiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gVVNFX0NPTE9SX0lDT05TID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBjb2xvciBpY29ucyBzaG91bGQgYmUgdXNlZCBpbiB0b29sYmFycy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNvbG9yIGljb25zIHNob3VsZCBiZSB1c2VkIGluIHRvb2xiYXJzLCAKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0VXNlQ29sb3JJY29uc0luVG9vbGJhcnMoKSB7Ci0gICAgICAgIHJldHVybiBVU0VfQ09MT1JfSUNPTlM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIGNvbG9yIGljb25zIHNob3VsZCBiZSB1c2VkIGluIHRvb2xiYXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VDb2xvckljb25zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNvbG9yIGljb25zIHNob3VsZCBiZSB1c2VkIGluIHRvb2xiYXJzLCAKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXNlQ29sb3JJY29uc0luVG9vbGJhcnMoYm9vbGVhbiB1c2VDb2xvckljb25zKSB7Ci0gICAgICAgIFVTRV9DT0xPUl9JQ09OUyA9IHVzZUNvbG9ySWNvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHByZXNlbnRhdGlvbiBtb2RlLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1vZGUgPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIElBY3Rpb24gYWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIHRoZSB0ZXh0IG9mIHRoZSBhY3Rpb24gY29udHJpYnV0ZWQgYnkgYW4KLSAgICAgKiBleHRlcm5hbCBzb3VyY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBhY3Rpb25UZXh0TGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBzZWUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIHVwZGF0ZShldmVudC5nZXRQcm9wZXJ0eSgpKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBSZW1lbWJlcnMgYWxsIGltYWdlcyBpbiB1c2UgYnkgdGhpcyBjb250cmlidXRpb24gaXRlbQotICAgICAqLwotICAgIHByaXZhdGUgTG9jYWxSZXNvdXJjZU1hbmFnZXIgaW1hZ2VNYW5hZ2VyOwotICAgIAotICAgIC8qKgotICAgICAqIExpc3RlbmVyIGZvciBTV1QgYnV0dG9uIHdpZGdldCBldmVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0ZW5lciBidXR0b25MaXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIExpc3RlbmVyIGZvciBTV1QgbWVudSBpdGVtIHdpZGdldCBldmVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0ZW5lciBtZW51SXRlbUxpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogTGlzdGVuZXIgZm9yIGFjdGlvbiBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5TGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGFjdGlvblByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0ZW5lciBmb3IgU1dUIHRvb2wgaXRlbSB3aWRnZXQgZXZlbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdGVuZXIgdG9vbEl0ZW1MaXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIFRoZSB3aWRnZXQgY3JlYXRlZCBmb3IgdGhpcyBpdGVtOyA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIGJlZm9yZSBjcmVhdGlvbiBhbmQgYWZ0ZXIgZGlzcG9zYWwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBXaWRnZXQgd2lkZ2V0ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY29udHJpYnV0aW9uIGl0ZW0gZnJvbSB0aGUgZ2l2ZW4gYWN0aW9uLiBUaGUgaWQgb2YgdGhlCi0gICAgICogYWN0aW9uIGlzIHVzZWQgYXMgdGhlIGlkIG9mIHRoZSBpdGVtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBzdXBlcihhY3Rpb24uZ2V0SWQoKSk7Ci0gICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgb24gdGhlIGFjdGlvbiAoZm9yd2FyZGVkIGJ5IG5lc3RlZCBsaXN0ZW5lcikuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFjdGlvblByb3BlcnR5Q2hhbmdlKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotICAgICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIGJlIHJlbW92ZWQuIEF2b2lkIHVzaW5nIGZyZWUgYXN5bmNFeGVjCi0KLSAgICAgICAgaWYgKGlzVmlzaWJsZSgpICYmIHdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSB3aWRnZXQuZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgaWYgKGRpc3BsYXkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZShlLmdldFByb3BlcnR5KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZShlLmdldFByb3BlcnR5KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoaXMgYWN0aW9uIGNvbnRyaWJ1dGlvbiBpdGVtIHdpdGggYW5vdGhlciBvYmplY3QuCi0gICAgICogVHdvIGFjdGlvbiBjb250cmlidXRpb24gaXRlbXMgYXJlIGVxdWFsIGlmIHRoZXkgcmVmZXIgdG8gdGhlIGlkZW50aWNhbCBBY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhY3Rpb24uZXF1YWxzKCgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgbykuYWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+QWN0aW9uQ29udHJpYnV0aW9uSXRlbTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPklDb250cmlidXRpb25JdGVtPC9jb2RlPiBtZXRob2QgY3JlYXRlcyBhbiBTV1QgPGNvZGU+QnV0dG9uPC9jb2RlPiBmb3IKLSAgICAgKiB0aGUgYWN0aW9uIHVzaW5nIHRoZSBhY3Rpb24ncyBzdHlsZS4gSWYgdGhlIGFjdGlvbidzIGNoZWNrZWQgcHJvcGVydHkgaGFzCi0gICAgICogYmVlbiBzZXQsIHRoZSBidXR0b24gaXMgY3JlYXRlZCBhbmQgcHJpbWVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgY2hlY2tlZAotICAgICAqIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpZiAod2lkZ2V0ID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBmbGFncyA9IFNXVC5QVVNIOwotICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5nZXRTdHlsZSgpID09IElBY3Rpb24uQVNfQ0hFQ0tfQk9YKQotICAgICAgICAgICAgICAgICAgICBmbGFncyA9IFNXVC5UT0dHTEU7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5nZXRTdHlsZSgpID09IElBY3Rpb24uQVNfUkFESU9fQlVUVE9OKQotICAgICAgICAgICAgICAgICAgICBmbGFncyA9IFNXVC5SQURJTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgZmxhZ3MpOwotICAgICAgICAgICAgYi5zZXREYXRhKHRoaXMpOwotICAgICAgICAgICAgYi5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgZ2V0QnV0dG9uTGlzdGVuZXIoKSk7Ci0gICAgICAgICAgICAvLyBEb24ndCBob29rIGEgZGlzcG9zZSBsaXN0ZW5lciBvbiB0aGUgcGFyZW50Ci0gICAgICAgICAgICBiLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGdldEJ1dHRvbkxpc3RlbmVyKCkpOwotICAgICAgICAgICAgaWYgKGFjdGlvbi5nZXRIZWxwTGlzdGVuZXIoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGIuYWRkSGVscExpc3RlbmVyKGFjdGlvbi5nZXRIZWxwTGlzdGVuZXIoKSk7Ci0gICAgICAgICAgICB3aWRnZXQgPSBiOwotCi0gICAgICAgICAgICB1cGRhdGUobnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIEF0dGFjaCBzb21lIGV4dHJhIGxpc3RlbmVycy4KLSAgICAgICAgICAgIGFjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TGlzdGVuZXIpOwotICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbW1hbmRJZCA9IGFjdGlvbi5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKTsKLSAgICAgICAgICAgICAgICBFeHRlcm5hbEFjdGlvbk1hbmFnZXIuSUNhbGxiYWNrIGNhbGxiYWNrID0gRXh0ZXJuYWxBY3Rpb25NYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoKS5nZXRDYWxsYmFjaygpOwotCi0gICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjayAhPSBudWxsKSAmJiAoY29tbWFuZElkICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoY29tbWFuZElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvblRleHRMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5JQ29udHJpYnV0aW9uSXRlbTwvY29kZT4gbWV0aG9kIGNyZWF0ZXMgYW4gU1dUIDxjb2RlPk1lbnVJdGVtPC9jb2RlPgotICAgICAqIGZvciB0aGUgYWN0aW9uIHVzaW5nIHRoZSBhY3Rpb24ncyBzdHlsZS4gSWYgdGhlIGFjdGlvbidzIGNoZWNrZWQgcHJvcGVydHkgaGFzCi0gICAgICogYmVlbiBzZXQsIGEgYnV0dG9uIGlzIGNyZWF0ZWQgYW5kIHByaW1lZCB0byB0aGUgdmFsdWUgb2YgdGhlIGNoZWNrZWQKLSAgICAgKiBwcm9wZXJ0eS4gSWYgdGhlIGFjdGlvbidzIG1lbnUgY3JlYXRvciBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQsIGEgY2FzY2FkaW5nCi0gICAgICogc3VibWVudSBpcyBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoTWVudSBwYXJlbnQsIGludCBpbmRleCkgewotICAgICAgICBpZiAod2lkZ2V0ID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lbnUgc3ViTWVudSA9IG51bGw7Ci0gICAgICAgICAgICBpbnQgZmxhZ3MgPSBTV1QuUFVTSDsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBzdHlsZSA9IGFjdGlvbi5nZXRTdHlsZSgpOwotICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PSBJQWN0aW9uLkFTX0NIRUNLX0JPWCkKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBTV1QuQ0hFQ0s7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGUgPT0gSUFjdGlvbi5BU19SQURJT19CVVRUT04pCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzID0gU1dULlJBRElPOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlID09IElBY3Rpb24uQVNfRFJPUF9ET1dOX01FTlUpIHsKLSAgICAgICAgICAgICAgICAgICAgSU1lbnVDcmVhdG9yIG1jID0gYWN0aW9uLmdldE1lbnVDcmVhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWJNZW51ID0gbWMuZ2V0TWVudShwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBTV1QuQ0FTQ0FERTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVudUl0ZW0gbWkgPSBudWxsOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApCi0gICAgICAgICAgICAgICAgbWkgPSBuZXcgTWVudUl0ZW0ocGFyZW50LCBmbGFncywgaW5kZXgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1pID0gbmV3IE1lbnVJdGVtKHBhcmVudCwgZmxhZ3MpOwotICAgICAgICAgICAgd2lkZ2V0ID0gbWk7Ci0KLSAgICAgICAgICAgIG1pLnNldERhdGEodGhpcyk7Ci0gICAgICAgICAgICBtaS5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgZ2V0TWVudUl0ZW1MaXN0ZW5lcigpKTsKLSAgICAgICAgICAgIG1pLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGdldE1lbnVJdGVtTGlzdGVuZXIoKSk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uLmdldEhlbHBMaXN0ZW5lcigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbWkuYWRkSGVscExpc3RlbmVyKGFjdGlvbi5nZXRIZWxwTGlzdGVuZXIoKSk7Ci0KLSAgICAgICAgICAgIGlmIChzdWJNZW51ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbWkuc2V0TWVudShzdWJNZW51KTsKLQotICAgICAgICAgICAgdXBkYXRlKG51bGwpOwotCi0gICAgICAgICAgICAvLyBBdHRhY2ggc29tZSBleHRyYSBsaXN0ZW5lcnMuCi0gICAgICAgICAgICBhY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUxpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kSWQgPSBhY3Rpb24uZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCk7Ci0gICAgICAgICAgICAgICAgRXh0ZXJuYWxBY3Rpb25NYW5hZ2VyLklDYWxsYmFjayBjYWxsYmFjayA9IEV4dGVybmFsQWN0aW9uTWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCkuZ2V0Q2FsbGJhY2soKTsKLQotICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2sgIT0gbnVsbCkgJiYgKGNvbW1hbmRJZCAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGNvbW1hbmRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25UZXh0TGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5BY3Rpb25Db250cmlidXRpb25JdGVtPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzICwKLSAgICAgKiA8Y29kZT5JQ29udHJpYnV0aW9uSXRlbTwvY29kZT4gbWV0aG9kIGNyZWF0ZXMgYW4gU1dUIDxjb2RlPlRvb2xJdGVtPC9jb2RlPgotICAgICAqIGZvciB0aGUgYWN0aW9uIHVzaW5nIHRoZSBhY3Rpb24ncyBzdHlsZS4gSWYgdGhlIGFjdGlvbidzIGNoZWNrZWQgcHJvcGVydHkgaGFzCi0gICAgICogYmVlbiBzZXQsIGEgYnV0dG9uIGlzIGNyZWF0ZWQgYW5kIHByaW1lZCB0byB0aGUgdmFsdWUgb2YgdGhlIGNoZWNrZWQKLSAgICAgKiBwcm9wZXJ0eS4gSWYgdGhlIGFjdGlvbidzIG1lbnUgY3JlYXRvciBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQsIGEgZHJvcC1kb3duCi0gICAgICogdG9vbCBpdGVtIGlzIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbChUb29sQmFyIHBhcmVudCwgaW50IGluZGV4KSB7Ci0gICAgICAgIGlmICh3aWRnZXQgPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGZsYWdzID0gU1dULlBVU0g7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgc3R5bGUgPSBhY3Rpb24uZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gSUFjdGlvbi5BU19DSEVDS19CT1gpCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzID0gU1dULkNIRUNLOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlID09IElBY3Rpb24uQVNfUkFESU9fQlVUVE9OKQotICAgICAgICAgICAgICAgICAgICBmbGFncyA9IFNXVC5SQURJTzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHlsZSA9PSBJQWN0aW9uLkFTX0RST1BfRE9XTl9NRU5VKQotICAgICAgICAgICAgICAgICAgICBmbGFncyA9IFNXVC5EUk9QX0RPV047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRvb2xJdGVtIHRpID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKQotICAgICAgICAgICAgICAgIHRpID0gbmV3IFRvb2xJdGVtKHBhcmVudCwgZmxhZ3MsIGluZGV4KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0aSA9IG5ldyBUb29sSXRlbShwYXJlbnQsIGZsYWdzKTsKLSAgICAgICAgICAgIHRpLnNldERhdGEodGhpcyk7Ci0gICAgICAgICAgICB0aS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBnZXRUb29sSXRlbUxpc3RlbmVyKCkpOwotICAgICAgICAgICAgdGkuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGdldFRvb2xJdGVtTGlzdGVuZXIoKSk7Ci0KLSAgICAgICAgICAgIHdpZGdldCA9IHRpOwotCi0gICAgICAgICAgICB1cGRhdGUobnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIEF0dGFjaCBzb21lIGV4dHJhIGxpc3RlbmVycy4KLSAgICAgICAgICAgIGFjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TGlzdGVuZXIpOwotICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbW1hbmRJZCA9IGFjdGlvbi5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKTsKLSAgICAgICAgICAgICAgICBFeHRlcm5hbEFjdGlvbk1hbmFnZXIuSUNhbGxiYWNrIGNhbGxiYWNrID0gRXh0ZXJuYWxBY3Rpb25NYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoKS5nZXRDYWxsYmFjaygpOwotCi0gICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjayAhPSBudWxsKSAmJiAoY29tbWFuZElkICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoY29tbWFuZElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvblRleHRMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRyaWJ1dGlvbiBpdGVtLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIElBY3Rpb24gZ2V0QWN0aW9uKCkgewotICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3RlbmVyIGZvciBTV1QgYnV0dG9uIHdpZGdldCBldmVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3RlbmVyIGZvciBidXR0b24gZXZlbnRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0ZW5lciBnZXRCdXR0b25MaXN0ZW5lcigpIHsKLSAgICAgICAgaWYgKGJ1dHRvbkxpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGJ1dHRvbkxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNXVC5EaXNwb3NlOgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlV2lkZ2V0RGlzcG9zZShldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTV1QuU2VsZWN0aW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0IGV3ID0gZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZXZlbnQsICgoQnV0dG9uKSBldykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1dHRvbkxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3RlbmVyIGZvciBTV1QgbWVudSBpdGVtIHdpZGdldCBldmVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3RlbmVyIGZvciBtZW51IGl0ZW0gZXZlbnRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0ZW5lciBnZXRNZW51SXRlbUxpc3RlbmVyKCkgewotICAgICAgICBpZiAobWVudUl0ZW1MaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtZW51SXRlbUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNXVC5EaXNwb3NlOgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlV2lkZ2V0RGlzcG9zZShldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTV1QuU2VsZWN0aW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0IGV3ID0gZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZXZlbnQsICgoTWVudUl0ZW0pIGV3KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVudUl0ZW1MaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcmVzZW50YXRpb24gbW9kZSwgd2hpY2ggaXMgdGhlIGJpdHdpc2Utb3Igb2YgdGhlIAotICAgICAqIDxjb2RlPk1PREVfKjwvY29kZT4gY29uc3RhbnRzLiAgVGhlIGRlZmF1bHQgbW9kZSBzZXR0aW5nIGlzIDAsIG1lYW5pbmcKLSAgICAgKiB0aGF0IGZvciBtZW51IGl0ZW1zLCBib3RoIHRleHQgYW5kIGltYWdlIGFyZSBzaG93biAoaWYgcHJlc2VudCksIGJ1dCBmb3IKLSAgICAgKiB0b29sIGl0ZW1zLCB0aGUgdGV4dCBpcyBzaG93biBvbmx5IGlmIHRoZXJlIGlzIG5vIGltYWdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZXNlbnRhdGlvbiBtb2RlIHNldHRpbmdzCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdGVuZXIgZm9yIFNXVCB0b29sIGl0ZW0gd2lkZ2V0IGV2ZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdGVuZXIgZm9yIHRvb2wgaXRlbSBldmVudHMKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3RlbmVyIGdldFRvb2xJdGVtTGlzdGVuZXIoKSB7Ci0gICAgICAgIGlmICh0b29sSXRlbUxpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRvb2xJdGVtTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU1dULkRpc3Bvc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVXaWRnZXREaXNwb3NlKGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNXVC5TZWxlY3Rpb246Ci0gICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXQgZXcgPSBldmVudC53aWRnZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihldmVudCwgKChUb29sSXRlbSkgZXcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b29sSXRlbUxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYSB3aWRnZXQgZGlzcG9zZSBldmVudCBmb3IgdGhlIHdpZGdldCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaXRlbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlV2lkZ2V0RGlzcG9zZShFdmVudCBlKSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIG91ciB3aWRnZXQgaXMgdGhlIG9uZSBiZWluZyBkaXNwb3NlZC4KLSAgICAgICAgaWYgKGUud2lkZ2V0ID09IHdpZGdldCkgewotICAgICAgICAgICAgLy8gRGlzcG9zZSBvZiB0aGUgbWVudSBjcmVhdG9yLgotICAgICAgICAgICAgaWYgKGFjdGlvbi5nZXRTdHlsZSgpID09IElBY3Rpb24uQVNfRFJPUF9ET1dOX01FTlUpIHsKLSAgICAgICAgICAgICAgICBJTWVudUNyZWF0b3IgbWMgPSBhY3Rpb24uZ2V0TWVudUNyZWF0b3IoKTsKLSAgICAgICAgICAgICAgICBpZiAobWMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtYy5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVbmhvb2sgYWxsIG9mIHRoZSBsaXN0ZW5lcnMuCi0gICAgICAgICAgICBhY3Rpb24ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUxpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kSWQgPSBhY3Rpb24uZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCk7Ci0gICAgICAgICAgICAgICAgRXh0ZXJuYWxBY3Rpb25NYW5hZ2VyLklDYWxsYmFjayBjYWxsYmFjayA9IEV4dGVybmFsQWN0aW9uTWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCkuZ2V0Q2FsbGJhY2soKTsKLQotICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2sgIT0gbnVsbCkgJiYgKGNvbW1hbmRJZCAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGNvbW1hbmRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25UZXh0TGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHdpZGdldCBmaWVsZC4KLSAgICAgICAgICAgIHdpZGdldCA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRpc3Bvc2VPbGRJbWFnZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYSB3aWRnZXQgc2VsZWN0aW9uIGV2ZW50LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oRXZlbnQgZSwgYm9vbGVhbiBzZWxlY3Rpb24pIHsKLQotICAgICAgICBXaWRnZXQgaXRlbSA9IGUud2lkZ2V0OwotICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc3R5bGUgPSBpdGVtLmdldFN0eWxlKCk7Ci0KLSAgICAgICAgICAgIGlmICgoc3R5bGUgJiAoU1dULlRPR0dMRSB8IFNXVC5DSEVDSykpICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmdldFN0eWxlKCkgPT0gSUFjdGlvbi5BU19DSEVDS19CT1gpIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNldENoZWNrZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChzdHlsZSAmIFNXVC5SQURJTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uZ2V0U3R5bGUoKSA9PSBJQWN0aW9uLkFTX1JBRElPX0JVVFRPTikgewotICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2V0Q2hlY2tlZChzZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKHN0eWxlICYgU1dULkRST1BfRE9XTikgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChlLmRldGFpbCA9PSA0KSB7IC8vIG9uIGRyb3AtZG93biBidXR0b24KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5nZXRTdHlsZSgpID09IElBY3Rpb24uQVNfRFJPUF9ET1dOX01FTlUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElNZW51Q3JlYXRvciBtYyA9IGFjdGlvbi5nZXRNZW51Q3JlYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgVG9vbEl0ZW0gdGkgPSAoVG9vbEl0ZW0pIGl0ZW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjcmVhdGUgdGhlIG1lbnUgYXMgYSBzdWItbWVudSBvZiAiZHVtbXkiIHNvIHRoYXQgd2UgY2FuIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgaW4gYSBjYXNjYWRpbmcgbWVudSB0b28uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBjcmVhdGVkIG9uIGEgU1dUIGNvbnRyb2wgd2Ugd291bGQgZ2V0IGFuIFNXVCBlcnJvci4uLgotICAgICAgICAgICAgICAgICAgICAgICAgLy9NZW51IGR1bW15PSBuZXcgTWVudSh0aS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL01lbnUgbT0gbWMuZ2V0TWVudShkdW1teSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2R1bW15LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudSBtID0gbWMuZ2V0TWVudSh0aS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiB0aGUgbWVudSBiZWxvdyB0aGUgZHJvcCBkb3duIGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGIgPSB0aS5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgcCA9IHRpLmdldFBhcmVudCgpLnRvRGlzcGxheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQoYi54LCBiLnkgKyBiLmhlaWdodCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnNldExvY2F0aW9uKHAueCwgcC55KTsgLy8gd2FpdGluZyBmb3IgU1dUIDAuNDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIHdlIGRvbid0IGZpcmUgdGhlIGFjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRW5zdXJlIGFjdGlvbiBpcyBlbmFibGVkIGZpcnN0LgotICAgICAgICAgICAgLy8gU2VlIDFHQU4zTTY6IElUUFVJOldJTk5UIC0gQW55IElBY3Rpb24gaW4gdGhlIHdvcmtiZW5jaCBjYW4gYmUgZXhlY3V0ZWQgd2hpbGUgZGlzYWJsZWQuCi0gICAgICAgICAgICBpZiAoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB0cmFjZSA9IFBvbGljeS5UUkFDRV9BQ1RJT05TOwotCi0gICAgICAgICAgICAgICAgbG9uZyBtcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGlmICh0cmFjZSkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSdW5uaW5nIGFjdGlvbjogIiArIGFjdGlvbi5nZXRUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICBhY3Rpb24ucnVuV2l0aEV2ZW50KGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKHRyYWNlKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1zIHRvIHJ1biBhY3Rpb246ICIgKyBhY3Rpb24uZ2V0VGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGFjdGlvbi5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gYWN0aW9uIGhhcyBhbnkgaW1hZ2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY3Rpb25Ub0NoZWNrIHRoZSBhY3Rpb24KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhY3Rpb24gaGFzIGFueSBpbWFnZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzSW1hZ2VzKElBY3Rpb24gYWN0aW9uVG9DaGVjaykgewotICAgICAgICByZXR1cm4gYWN0aW9uVG9DaGVjay5nZXRJbWFnZURlc2NyaXB0b3IoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgfHwgYWN0aW9uVG9DaGVjay5nZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpICE9IG51bGwKLSAgICAgICAgICAgICAgICB8fCBhY3Rpb25Ub0NoZWNrLmdldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKCkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbW1hbmQgY29ycmVzcG9uZGluZyB0byB0aGlzIGFjdGlvbgotICAgICAqIGlzIGFjdGl2ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21tYW5kQWN0aXZlKCkgewotICAgICAgICBJQWN0aW9uIGFjdGlvblRvQ2hlY2sgPSBnZXRBY3Rpb24oKTsKLQotICAgICAgICBpZiAoYWN0aW9uVG9DaGVjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29tbWFuZElkID0gYWN0aW9uVG9DaGVjay5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKTsKLSAgICAgICAgICAgIEV4dGVybmFsQWN0aW9uTWFuYWdlci5JQ2FsbGJhY2sgY2FsbGJhY2sgPSBFeHRlcm5hbEFjdGlvbk1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCkuZ2V0Q2FsbGJhY2soKTsKLQotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmlzQWN0aXZlKGNvbW1hbmRJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGFjdGlvbiBpdGVtIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+Ci0gICAgICogbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIG1lbnUgaXRlbXMgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqIGZvciBldmVyeXRoaW5nIGVsc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgewotICAgICAgICBpZiAod2lkZ2V0IGluc3RhbmNlb2YgTWVudUl0ZW0pIHsKLSAgICAgICAgICAgIC8vT3B0aW1pemF0aW9uLiBPbmx5IHJlY3JlYXRlIHRoZSBpdGVtIGlzIHRoZSBjaGVjayBvciByYWRpbyBzdHlsZSBoYXMgY2hhbmdlZC4gCi0gICAgICAgICAgICBib29sZWFuIGl0ZW1Jc0NoZWNrID0gKHdpZGdldC5nZXRTdHlsZSgpICYgU1dULkNIRUNLKSAhPSAwOwotICAgICAgICAgICAgYm9vbGVhbiBhY3Rpb25Jc0NoZWNrID0gZ2V0QWN0aW9uKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBnZXRBY3Rpb24oKS5nZXRTdHlsZSgpID09IElBY3Rpb24uQVNfQ0hFQ0tfQk9YOwotICAgICAgICAgICAgYm9vbGVhbiBpdGVtSXNSYWRpbyA9ICh3aWRnZXQuZ2V0U3R5bGUoKSAmIFNXVC5SQURJTykgIT0gMDsKLSAgICAgICAgICAgIGJvb2xlYW4gYWN0aW9uSXNSYWRpbyA9IGdldEFjdGlvbigpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgZ2V0QWN0aW9uKCkuZ2V0U3R5bGUoKSA9PSBJQWN0aW9uLkFTX1JBRElPX0JVVFRPTjsKLSAgICAgICAgICAgIHJldHVybiAoaXRlbUlzQ2hlY2sgIT0gYWN0aW9uSXNDaGVjaykKLSAgICAgICAgICAgICAgICAgICAgfHwgKGl0ZW1Jc1JhZGlvICE9IGFjdGlvbklzUmFkaW8pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25JdGVtLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGFjdGlvbiAhPSBudWxsICYmIGFjdGlvbi5pc0VuYWJsZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXRlbSBpcyBhbGxvd2VkIHRvIGVuYWJsZSwKLSAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gaWYgdGhpcyBpdGVtIGlzIGFsbG93ZWQgdG8gYmUgZW5hYmxlZAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZWRBbGxvd2VkKCkgewotICAgICAgICBpZiAoZ2V0UGFyZW50KCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBCb29sZWFuIHZhbHVlID0gZ2V0UGFyZW50KCkuZ2V0T3ZlcnJpZGVzKCkuZ2V0RW5hYmxlZCh0aGlzKTsKLSAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRydWUgOiB2YWx1ZS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+QWN0aW9uQ29udHJpYnV0aW9uSXRlbTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5Db250cmlidXRpb25JdGVtPC9jb2RlPiBtZXRob2QgZXh0ZW5kcyB0aGUgc3VwZXIgaW1wbGVtZW50YXRpb24KLSAgICAgKiBieSBhbHNvIGNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbW1hbmQgY29ycmVzcG9uZGluZyB0byB0aGlzIGFjdGlvbiBpcyBhY3RpdmUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuaXNWaXNpYmxlKCkgJiYgaXNDb21tYW5kQWN0aXZlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJlc2VudGF0aW9uIG1vZGUsIHdoaWNoIGlzIHRoZSBiaXR3aXNlLW9yIG9mIHRoZSAKLSAgICAgKiA8Y29kZT5NT0RFXyo8L2NvZGU+IGNvbnN0YW50cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kZSB0aGUgcHJlc2VudGF0aW9uIG1vZGUgc2V0dGluZ3MKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TW9kZShpbnQgbW9kZSkgewotICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOwotICAgICAgICB1cGRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYWN0aW9uIGl0ZW0gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JQ29udHJpYnV0aW9uSXRlbTwvY29kZT4KLSAgICAgKiBtZXRob2QgY2FsbHMgPGNvZGU+dXBkYXRlKG51bGwpPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB1cGRhdGUoKSB7Ci0gICAgICAgIHVwZGF0ZShudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTeW5jaHJvbml6ZXMgdGhlIFVJIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IG1lYW5pbmcgYWxsIGFwcGxpY2FibGUKLSAgICAgKiAgIHByb3BlcnRpZXMgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgaWYgKHdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgd2hhdCB0byBkbwkJCQotICAgICAgICAgICAgYm9vbGVhbiB0ZXh0Q2hhbmdlZCA9IHByb3BlcnR5TmFtZSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSUFjdGlvbi5URVhUKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaW1hZ2VDaGFuZ2VkID0gcHJvcGVydHlOYW1lID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhJQWN0aW9uLklNQUdFKTsKLSAgICAgICAgICAgIGJvb2xlYW4gdG9vbHRpcFRleHRDaGFuZ2VkID0gcHJvcGVydHlOYW1lID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhJQWN0aW9uLlRPT0xfVElQX1RFWFQpOwotICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVTdGF0ZUNoYW5nZWQgPSBwcm9wZXJ0eU5hbWUgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKElBY3Rpb24uRU5BQkxFRCkKLSAgICAgICAgICAgICAgICAgICAgfHwgcHJvcGVydHlOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhJQ29udHJpYnV0aW9uTWFuYWdlck92ZXJyaWRlcy5QX0VOQUJMRUQpOwotICAgICAgICAgICAgYm9vbGVhbiBjaGVja0NoYW5nZWQgPSAoYWN0aW9uLmdldFN0eWxlKCkgPT0gSUFjdGlvbi5BU19DSEVDS19CT1ggfHwgYWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHlsZSgpID09IElBY3Rpb24uQVNfUkFESU9fQlVUVE9OKQotICAgICAgICAgICAgICAgICAgICAmJiAocHJvcGVydHlOYW1lID09IG51bGwgfHwgcHJvcGVydHlOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhJQWN0aW9uLkNIRUNLRUQpKTsKLQotICAgICAgICAgICAgaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7Ci0gICAgICAgICAgICAgICAgVG9vbEl0ZW0gdGkgPSAoVG9vbEl0ZW0pIHdpZGdldDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGFjdGlvbi5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgLy8gdGhlIHNldCB0ZXh0IGlzIHNob3duIG9ubHkgaWYgdGhlcmUgaXMgbm8gaW1hZ2Ugb3IgaWYgZm9yY2VkIGJ5IE1PREVfRk9SQ0VfVEVYVAotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvd1RleHQgPSB0ZXh0ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICgoZ2V0TW9kZSgpICYgTU9ERV9GT1JDRV9URVhUKSAhPSAwIHx8ICFoYXNJbWFnZXMoYWN0aW9uKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoZSB0cmltbWluZyBpZiB0aGUgdGV4dCB3aWxsIGJlIHVzZWQKLSAgICAgICAgICAgICAgICBpZiAoc2hvd1RleHQgJiYgdGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQgPSBBY3Rpb24ucmVtb3ZlQWNjZWxlcmF0b3JUZXh0KHRleHQpOwotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gQWN0aW9uLnJlbW92ZU1uZW1vbmljcyh0ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodGV4dENoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHRUb1NldCA9IHNob3dUZXh0ID8gdGV4dCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmlnaHRTdHlsZSA9ICh0aS5nZXRQYXJlbnQoKS5nZXRTdHlsZSgpICYgU1dULlJJR0hUKSAhPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRTdHlsZSB8fCAhdGkuZ2V0VGV4dCgpLmVxdWFscyh0ZXh0VG9TZXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBhZGRpdGlvbiB0byBiZWluZyByZXF1aXJlZCB0byB1cGRhdGUgdGhlIHRleHQgaWYgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldHMgbnVsbGVkIG91dCBpbiB0aGUgYWN0aW9uLCB0aGlzIGlzIGFsc28gYSB3b3JrYXJvdW5kIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGJ1ZyA1MDE1MTogVXNpbmcgU1dULlJJR0hUIG9uIGEgVG9vbEJhciBsZWF2ZXMgYmxhbmsgc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpLnNldFRleHQodGV4dFRvU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpbWFnZUNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSBzdWJzdGl0dXRlIGEgbWlzc2luZyBpbWFnZSBpZiBpdCBoYXMgbm8gdGV4dAotICAgICAgICAgICAgICAgICAgICB1cGRhdGVJbWFnZXMoIXNob3dUZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodG9vbHRpcFRleHRDaGFuZ2VkIHx8IHRleHRDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0b29sVGlwID0gYWN0aW9uLmdldFRvb2xUaXBUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0ZXh0IGlzIHNob3dpbmcsIHRoZW4gb25seSBzZXQgdGhlIHRvb2x0aXAgaWYgZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2hvd1RleHQgfHwgdG9vbFRpcCAhPSBudWxsICYmICF0b29sVGlwLmVxdWFscyh0ZXh0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGkuc2V0VG9vbFRpcFRleHQodG9vbFRpcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aS5zZXRUb29sVGlwVGV4dChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChlbmFibGVTdGF0ZUNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzaG91bGRCZUVuYWJsZWQgPSBhY3Rpb24uaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0VuYWJsZWRBbGxvd2VkKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpLmdldEVuYWJsZWQoKSAhPSBzaG91bGRCZUVuYWJsZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aS5zZXRFbmFibGVkKHNob3VsZEJlRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNoZWNrQ2hhbmdlZCkgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGJ2ID0gYWN0aW9uLmlzQ2hlY2tlZCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0aS5nZXRTZWxlY3Rpb24oKSAhPSBidikKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpLnNldFNlbGVjdGlvbihidik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdpZGdldCBpbnN0YW5jZW9mIE1lbnVJdGVtKSB7Ci0gICAgICAgICAgICAgICAgTWVudUl0ZW0gbWkgPSAoTWVudUl0ZW0pIHdpZGdldDsKLQotICAgICAgICAgICAgICAgIGlmICh0ZXh0Q2hhbmdlZCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgYWNjZWxlcmF0b3IgPSAwOwotCQkJCQlTdHJpbmcgYWNjZWxlcmF0b3JUZXh0ID0gbnVsbDsKLQkJCQkJSUFjdGlvbiB1cGRhdGVkQWN0aW9uID0gZ2V0QWN0aW9uKCk7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCQkJYWNjZWxlcmF0b3IgPSB1cGRhdGVkQWN0aW9uLmdldEFjY2VsZXJhdG9yKCk7Ci0JCQkJCUV4dGVybmFsQWN0aW9uTWFuYWdlci5JQ2FsbGJhY2sgY2FsbGJhY2sgPSBFeHRlcm5hbEFjdGlvbk1hbmFnZXIKLQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDYWxsYmFjaygpOwotCi0JCQkJCS8vIEJsb2NrIGFjY2VsZXJhdG9ycyB0aGF0IGFyZSBhbHJlYWR5IGluIHVzZS4KLQkJCQkJaWYgKChhY2NlbGVyYXRvciAhPSAwKSAmJiAoY2FsbGJhY2sgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2FsbGJhY2suaXNBY2NlbGVyYXRvckluVXNlKGFjY2VsZXJhdG9yKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdG9yID0gMDsKLQkJCQkJfQotCi0JCQkJCS8qCi0JCQkJCSAqIFByb2Nlc3MgYWNjZWxlcmF0b3JzIG9uIEdUSyBpbiBhIHNwZWNpYWwgd2F5IHRvIGF2b2lkIEJ1ZwotCQkJCQkgKiA0MjAwOS4gV2Ugd2lsbCBvdmVycmlkZSB0aGUgbmF0aXZlIGlucHV0IG1ldGhvZCBieQotCQkJCQkgKiBhbGxvd2luZyB0aGVzZSByZXNlcnZlZCBhY2NlbGVyYXRvcnMgdG8gYmUgcGxhY2VkIG9uIHRoZQotCQkJCQkgKiBtZW51LiBXZSB3aWxsIG9ubHkgZG8gdGhpcyBmb3IgIkN0cmwrU2hpZnQrWzAtOUEtRlVdIi4KLQkJCQkJICovCi0JCQkJCWZpbmFsIFN0cmluZyBjb21tYW5kSWQgPSB1cGRhdGVkQWN0aW9uCi0JCQkJCQkJLmdldEFjdGlvbkRlZmluaXRpb25JZCgpOwotCQkJCQlpZiAoKCJndGsiLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSkpICYmIChjYWxsYmFjayBpbnN0YW5jZW9mIElCaW5kaW5nTWFuYWdlckNhbGxiYWNrKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJJiYgKGNvbW1hbmRJZCAhPSBudWxsKSkgewotCQkJCQkJZmluYWwgSUJpbmRpbmdNYW5hZ2VyQ2FsbGJhY2sgYmluZGluZ01hbmFnZXJDYWxsYmFjayA9IChJQmluZGluZ01hbmFnZXJDYWxsYmFjaykgY2FsbGJhY2s7Ci0JCQkJCQlmaW5hbCBJS2V5TG9va3VwIGxvb2t1cCA9IEtleUxvb2t1cEZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotCQkJCQkJZmluYWwgVHJpZ2dlclNlcXVlbmNlW10gdHJpZ2dlclNlcXVlbmNlcyA9IGJpbmRpbmdNYW5hZ2VyQ2FsbGJhY2sKLQkJCQkJCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKGNvbW1hbmRJZCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRyaWdnZXJTZXF1ZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlmaW5hbCBUcmlnZ2VyU2VxdWVuY2UgdHJpZ2dlclNlcXVlbmNlID0gdHJpZ2dlclNlcXVlbmNlc1tpXTsKLQkJCQkJCQlmaW5hbCBUcmlnZ2VyW10gdHJpZ2dlcnMgPSB0cmlnZ2VyU2VxdWVuY2UKLQkJCQkJCQkJCS5nZXRUcmlnZ2VycygpOwotCQkJCQkJCWlmICh0cmlnZ2Vycy5sZW5ndGggPT0gMSkgewotCQkJCQkJCQlmaW5hbCBUcmlnZ2VyIHRyaWdnZXIgPSB0cmlnZ2Vyc1swXTsKLQkJCQkJCQkJaWYgKHRyaWdnZXIgaW5zdGFuY2VvZiBLZXlTdHJva2UpIHsKLQkJCQkJCQkJCWZpbmFsIEtleVN0cm9rZSBjdXJyZW50S2V5U3Ryb2tlID0gKEtleVN0cm9rZSkgdHJpZ2dlcjsKLQkJCQkJCQkJCWZpbmFsIGludCBjdXJyZW50TmF0dXJhbEtleSA9IGN1cnJlbnRLZXlTdHJva2UKLQkJCQkJCQkJCQkJLmdldE5hdHVyYWxLZXkoKTsKLQkJCQkJCQkJCWlmICgoY3VycmVudEtleVN0cm9rZS5nZXRNb2RpZmllcktleXMoKSA9PSAobG9va3VwCi0JCQkJCQkJCQkJCS5nZXRDdHJsKCkgfCBsb29rdXAuZ2V0U2hpZnQoKSkpCi0JCQkJCQkJCQkJCSYmICgoY3VycmVudE5hdHVyYWxLZXkgPj0gJzAnICYmIGN1cnJlbnROYXR1cmFsS2V5IDw9ICc5JykKLQkJCQkJCQkJCQkJCQl8fCAoY3VycmVudE5hdHVyYWxLZXkgPj0gJ0EnICYmIGN1cnJlbnROYXR1cmFsS2V5IDw9ICdGJykgfHwgKGN1cnJlbnROYXR1cmFsS2V5ID09ICdVJykpKSB7Ci0JCQkJCQkJCQkJYWNjZWxlcmF0b3IgPSBjdXJyZW50S2V5U3Ryb2tlCi0JCQkJCQkJCQkJCQkuZ2V0TW9kaWZpZXJLZXlzKCkKLQkJCQkJCQkJCQkJCXwgY3VycmVudE5hdHVyYWxLZXk7Ci0JCQkJCQkJCQkJYWNjZWxlcmF0b3JUZXh0ID0gdHJpZ2dlclNlcXVlbmNlCi0JCQkJCQkJCQkJCQkuZm9ybWF0KCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZWxlcmF0b3IgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjayAhPSBudWxsKSAmJiAoY29tbWFuZElkICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0b3JUZXh0ID0gY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBY2NlbGVyYXRvclRleHQoY29tbWFuZElkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdG9yVGV4dCA9IEFjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udmVydEFjY2VsZXJhdG9yKGFjY2VsZXJhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIElDb250cmlidXRpb25NYW5hZ2VyT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldFBhcmVudCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZXMgPSBnZXRQYXJlbnQoKS5nZXRPdmVycmlkZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGVzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gZ2V0UGFyZW50KCkuZ2V0T3ZlcnJpZGVzKCkuZ2V0VGV4dCh0aGlzKTsKLQotICAgICAgICAgICAgICAgICAgICBtaS5zZXRBY2NlbGVyYXRvcihhY2NlbGVyYXRvcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB1cGRhdGVkQWN0aW9uLmdldFRleHQoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBBY3Rpb24ucmVtb3ZlQWNjZWxlcmF0b3JUZXh0KHRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChhY2NlbGVyYXRvclRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pLnNldFRleHQodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pLnNldFRleHQodGV4dCArICdcdCcgKyBhY2NlbGVyYXRvclRleHQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpbWFnZUNoYW5nZWQpCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUltYWdlcyhmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZW5hYmxlU3RhdGVDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkQmVFbmFibGVkID0gYWN0aW9uLmlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNFbmFibGVkQWxsb3dlZCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtaS5nZXRFbmFibGVkKCkgIT0gc2hvdWxkQmVFbmFibGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgbWkuc2V0RW5hYmxlZChzaG91bGRCZUVuYWJsZWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjaGVja0NoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBidiA9IGFjdGlvbi5pc0NoZWNrZWQoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobWkuZ2V0U2VsZWN0aW9uKCkgIT0gYnYpCi0gICAgICAgICAgICAgICAgICAgICAgICBtaS5zZXRTZWxlY3Rpb24oYnYpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdpZGdldCBpbnN0YW5jZW9mIEJ1dHRvbikgewotICAgICAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSB3aWRnZXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW1hZ2VDaGFuZ2VkICYmIHVwZGF0ZUltYWdlcyhmYWxzZSkpCi0gICAgICAgICAgICAgICAgICAgIHRleHRDaGFuZ2VkID0gZmFsc2U7IC8vIGRvbid0IHVwZGF0ZSB0ZXh0IGlmIGl0IGhhcyBhbiBpbWFnZQotCi0gICAgICAgICAgICAgICAgaWYgKHRleHRDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gYWN0aW9uLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gQWN0aW9uLnJlbW92ZUFjY2VsZXJhdG9yVGV4dCh0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldFRleHQodGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHRvb2x0aXBUZXh0Q2hhbmdlZCkKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldFRvb2xUaXBUZXh0KGFjdGlvbi5nZXRUb29sVGlwVGV4dCgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChlbmFibGVTdGF0ZUNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzaG91bGRCZUVuYWJsZWQgPSBhY3Rpb24uaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0VuYWJsZWRBbGxvd2VkKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbi5nZXRFbmFibGVkKCkgIT0gc2hvdWxkQmVFbmFibGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldEVuYWJsZWQoc2hvdWxkQmVFbmFibGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYnYgPSBhY3Rpb24uaXNDaGVja2VkKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAhPSBidikKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRTZWxlY3Rpb24oYnYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBpbWFnZXMgZm9yIHRoaXMgYWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcmNlSW1hZ2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc29tZSBmb3JtIG9mIGltYWdlIGlzIGNvbXB1bHNvcnksCi0gICAgICogIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyBpdGVtIHRvIGhhdmUgbm8gaW1hZ2UKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBpbWFnZXMgZm9yIHRoaXMgYWN0aW9uLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUltYWdlcyhib29sZWFuIGZvcmNlSW1hZ2UpIHsKLQotICAgICAgICBSZXNvdXJjZU1hbmFnZXIgcGFyZW50UmVzb3VyY2VNYW5hZ2VyID0gSkZhY2VSZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAod2lkZ2V0IGluc3RhbmNlb2YgVG9vbEl0ZW0pIHsKLSAgICAgICAgICAgIGlmIChVU0VfQ09MT1JfSUNPTlMpIHsKLSAgICAgICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgPSBhY3Rpb24uZ2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1hZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSA9IGFjdGlvbi5nZXRJbWFnZURlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGRpc2FibGVkSW1hZ2UgPSBhY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigpOwotCi0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIGEgdmFsaWQgaW1hZ2UuCi0gICAgICAgICAgICAgICAgaWYgKGltYWdlID09IG51bGwgJiYgZm9yY2VJbWFnZSkgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgICAgICBMb2NhbFJlc291cmNlTWFuYWdlciBsb2NhbE1hbmFnZXIgPSBuZXcgTG9jYWxSZXNvdXJjZU1hbmFnZXIocGFyZW50UmVzb3VyY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBwZXJmb3JtYW5jZTogbW9yZSBlZmZpY2llbnQgaW4gU1dUIHRvIHNldCBkaXNhYmxlZCBhbmQgaG90IGltYWdlIGJlZm9yZSByZWd1bGFyIGltYWdlCi0gICAgICAgICAgICAgICAgKChUb29sSXRlbSkgd2lkZ2V0KS5zZXREaXNhYmxlZEltYWdlKGRpc2FibGVkSW1hZ2UgPT0gbnVsbCA/IG51bGwgOiBsb2NhbE1hbmFnZXIuY3JlYXRlSW1hZ2VXaXRoRGVmYXVsdChkaXNhYmxlZEltYWdlKSk7Ci0gICAgICAgICAgICAgICAgKChUb29sSXRlbSkgd2lkZ2V0KS5zZXRJbWFnZShpbWFnZSA9PSBudWxsID8gbnVsbCA6IGxvY2FsTWFuYWdlci5jcmVhdGVJbWFnZVdpdGhEZWZhdWx0KGltYWdlKSk7Ci0KLSAgICAgICAgICAgICAgICBkaXNwb3NlT2xkSW1hZ2VzKCk7Ci0gICAgICAgICAgICAgICAgaW1hZ2VNYW5hZ2VyID0gbG9jYWxNYW5hZ2VyOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZSAhPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlID0gYWN0aW9uLmdldEltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGhvdmVySW1hZ2UgPSBhY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldEhvdmVySW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgZGlzYWJsZWRJbWFnZSA9IGFjdGlvbgotICAgICAgICAgICAgICAgICAgICAuZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoKTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gcmVndWxhciBpbWFnZSwgYnV0IHRoZXJlIGlzIGEgaG92ZXIgaW1hZ2UsCi0gICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSBob3ZlciBpbWFnZSB0byBncmF5IGFuZCB1c2UgaXQgYXMgdGhlIHJlZ3VsYXIgaW1hZ2UuCi0gICAgICAgICAgICBpZiAoaW1hZ2UgPT0gbnVsbCAmJiBob3ZlckltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbWFnZSA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVXaXRoRmxhZ3MoYWN0aW9uLmdldEhvdmVySW1hZ2VEZXNjcmlwdG9yKCksIFNXVC5JTUFHRV9HUkFZKTsgCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGhvdmVyIGltYWdlLCB1c2UgdGhlIHJlZ3VsYXIgaW1hZ2UgYXMgdGhlIGhvdmVyIGltYWdlLAotICAgICAgICAgICAgICAgIC8vIGFuZCBjb252ZXJ0IHRoZSByZWd1bGFyIGltYWdlIHRvIGdyYXkKLSAgICAgICAgICAgICAgICBpZiAoaG92ZXJJbWFnZSA9PSBudWxsICYmIGltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaG92ZXJJbWFnZSA9IGltYWdlOwotICAgICAgICAgICAgICAgICAgICBpbWFnZSA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVXaXRoRmxhZ3MoYWN0aW9uLmdldEltYWdlRGVzY3JpcHRvcigpLCBTV1QuSU1BR0VfR1JBWSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgYSB2YWxpZCBpbWFnZS4KLSAgICAgICAgICAgIGlmIChob3ZlckltYWdlID09IG51bGwgJiYgaW1hZ2UgPT0gbnVsbCAmJiBmb3JjZUltYWdlKSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSBsb2NhbCByZXNvdXJjZSBtYW5hZ2VyIHRvIHJlbWVtYmVyIHRoZSBpbWFnZXMgd2UndmUgYWxsb2NhdGVkIGZvciB0aGlzIHRvb2wgaXRlbQotICAgICAgICAgICAgTG9jYWxSZXNvdXJjZU1hbmFnZXIgbG9jYWxNYW5hZ2VyID0gbmV3IExvY2FsUmVzb3VyY2VNYW5hZ2VyKHBhcmVudFJlc291cmNlTWFuYWdlcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHBlcmZvcm1hbmNlOiBtb3JlIGVmZmljaWVudCBpbiBTV1QgdG8gc2V0IGRpc2FibGVkIGFuZCBob3QgaW1hZ2UgYmVmb3JlIHJlZ3VsYXIgaW1hZ2UKLSAgICAgICAgICAgICgoVG9vbEl0ZW0pIHdpZGdldCkuc2V0RGlzYWJsZWRJbWFnZShkaXNhYmxlZEltYWdlID09IG51bGw/IG51bGwgOiBsb2NhbE1hbmFnZXIuY3JlYXRlSW1hZ2VXaXRoRGVmYXVsdChkaXNhYmxlZEltYWdlKSk7Ci0gICAgICAgICAgICAoKFRvb2xJdGVtKSB3aWRnZXQpLnNldEhvdEltYWdlKGhvdmVySW1hZ2UgPT0gbnVsbD8gbnVsbCA6IGxvY2FsTWFuYWdlci5jcmVhdGVJbWFnZVdpdGhEZWZhdWx0KGhvdmVySW1hZ2UpKTsKLSAgICAgICAgICAgICgoVG9vbEl0ZW0pIHdpZGdldCkuc2V0SW1hZ2UoaW1hZ2UgPT0gbnVsbD8gbnVsbCA6IGxvY2FsTWFuYWdlci5jcmVhdGVJbWFnZVdpdGhEZWZhdWx0KGltYWdlKSk7Ci0KLSAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlJ3JlIG5vIGxvbmdlciByZWZlcmVuY2luZyB0aGUgb2xkIGltYWdlcywgY2xlYXIgdGhlbSBvdXQuCi0gICAgICAgICAgICBkaXNwb3NlT2xkSW1hZ2VzKCk7Ci0gICAgICAgICAgICBpbWFnZU1hbmFnZXIgPSBsb2NhbE1hbmFnZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBpbWFnZSAhPSBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIEl0ZW0gfHwgd2lkZ2V0IGluc3RhbmNlb2YgQnV0dG9uKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFVzZSBob3ZlciBpbWFnZSBpZiB0aGVyZSBpcyBvbmUsIG90aGVyd2lzZSB1c2UgcmVndWxhciBpbWFnZS4KLSAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZSA9IGFjdGlvbi5nZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICAgICAgaWYgKGltYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbWFnZSA9IGFjdGlvbi5nZXRJbWFnZURlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIHZhbGlkIGltYWdlLgotICAgICAgICAgICAgaWYgKGltYWdlID09IG51bGwgJiYgZm9yY2VJbWFnZSkgewotICAgICAgICAgICAgICAgIGltYWdlID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbG9jYWwgcmVzb3VyY2UgbWFuYWdlciB0byByZW1lbWJlciB0aGUgaW1hZ2VzIHdlJ3ZlIGFsbG9jYXRlZCBmb3IgdGhpcyB3aWRnZXQKLSAgICAgICAgICAgIExvY2FsUmVzb3VyY2VNYW5hZ2VyIGxvY2FsTWFuYWdlciA9IG5ldyBMb2NhbFJlc291cmNlTWFuYWdlcihwYXJlbnRSZXNvdXJjZU1hbmFnZXIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAod2lkZ2V0IGluc3RhbmNlb2YgSXRlbSkgewotICAgICAgICAgICAgICAgICgoSXRlbSkgd2lkZ2V0KS5zZXRJbWFnZShpbWFnZSA9PSBudWxsID8gbnVsbCA6IGxvY2FsTWFuYWdlci5jcmVhdGVJbWFnZVdpdGhEZWZhdWx0KGltYWdlKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIEJ1dHRvbikgewotICAgICAgICAgICAgICAgICgoQnV0dG9uKSB3aWRnZXQpLnNldEltYWdlKGltYWdlID09IG51bGwgPyBudWxsIDogbG9jYWxNYW5hZ2VyLmNyZWF0ZUltYWdlV2l0aERlZmF1bHQoaW1hZ2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UncmUgbm8gbG9uZ2VyIHJlZmVyZW5jaW5nIHRoZSBvbGQgaW1hZ2VzLCBjbGVhciB0aGVtIG91dC4KLSAgICAgICAgICAgIGRpc3Bvc2VPbGRJbWFnZXMoKTsKLSAgICAgICAgICAgIGltYWdlTWFuYWdlciA9IGxvY2FsTWFuYWdlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGltYWdlICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3Bvc2UgYW55IGltYWdlcyBhbGxvY2F0ZWQgZm9yIHRoaXMgY29udHJpYnV0aW9uIGl0ZW0KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzcG9zZU9sZEltYWdlcygpIHsKLSAgICAgICAgaWYgKGltYWdlTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbWFnZU1hbmFnZXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgaW1hZ2VNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3J0ZW4gdGhlIGdpdmVuIHRleHQgPGNvZGU+dDwvY29kZT4gc28gdGhhdCBpdHMgbGVuZ3RoIGRvZXNuJ3QKLSAgICAgKiBleGNlZWQgdGhlIGdpdmVuIHdpZHRoLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXBsYWNlcyBjaGFyYWN0ZXJzCi0gICAgICogaW4gdGhlIGNlbnRlciBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nIHdpdGggYW4gZWxsaXBzaXMgKCIuLi4iKS4gT3ZlcnJpZGUKLSAgICAgKiBpZiB5b3UgbmVlZCBhIGRpZmZlcmVudCBzdHJhdGVneS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNob3J0ZW5UZXh0KFN0cmluZyB0ZXh0VmFsdWUsIFRvb2xJdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKHRleHRWYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgR0MgZ2MgPSBuZXcgR0MoaXRlbS5nZXRQYXJlbnQoKSk7Ci0KLSAgICAgICAgaW50IG1heFdpZHRoID0gaXRlbS5nZXRJbWFnZSgpLmdldEJvdW5kcygpLndpZHRoICogNDsKLQotICAgICAgICBpZiAoZ2MudGV4dEV4dGVudCh0ZXh0VmFsdWUpLnggPCBtYXhXaWR0aCkgewotICAgICAgICAgICAgZ2MuZGlzcG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSB0ZXh0VmFsdWUubGVuZ3RoKCk7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZXN0ID0gdGV4dFZhbHVlLnN1YnN0cmluZygwLCBpKTsKLSAgICAgICAgICAgIHRlc3QgPSB0ZXN0ICsgZWxsaXBzaXM7Ci0gICAgICAgICAgICBpZiAoZ2MudGV4dEV4dGVudCh0ZXN0KS54IDwgbWF4V2lkdGgpIHsKLSAgICAgICAgICAgICAgICBnYy5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRlc3Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBnYy5kaXNwb3NlKCk7Ci0gICAgICAgIC8vSWYgZm9yIHNvbWUgcmVhc29uIHdlIGZhbGwgdGhyb3VnaCBhYm9ydAotICAgICAgICByZXR1cm4gdGV4dFZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9Db250cmlidXRpb25JdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQ4MGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9Db250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBiYXNlIGltcGxlbWVudGF0aW9uIGZvciBjb250cmlidXRpb24gaXRlbXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250cmlidXRpb25JdGVtIGltcGxlbWVudHMgSUNvbnRyaWJ1dGlvbkl0ZW0gewotCi0gICAgLyoqCi0gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgY29udHJpYnV0aW9uIGl0ZW0sIG9mIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoaXMgaXRlbSBpcyB2aXNpYmxlIGluIGl0cyBtYW5hZ2VyOyA8Y29kZT50cnVlPC9jb2RlPiAKLSAgICAgKiBieSBkZWZhdWx0LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYXJlbnQgY29udHJpYnV0aW9uIG1hbmFnZXIgZm9yIHRoaXMgaXRlbQotICAgICAqLwotICAgIHByaXZhdGUgSUNvbnRyaWJ1dGlvbk1hbmFnZXIgcGFyZW50OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbnRyaWJ1dGlvbiBpdGVtIHdpdGggYSA8Y29kZT5udWxsPC9jb2RlPiBpZC4KLSAgICAgKiBDYWxscyA8Y29kZT50aGlzKFN0cmluZyk8L2NvZGU+IHdpdGggPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyaWJ1dGlvbkl0ZW0oKSB7Ci0gICAgICAgIHRoaXMobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbnRyaWJ1dGlvbiBpdGVtIHdpdGggdGhlIGdpdmVuIChvcHRpb25hbCkgaWQuCi0gICAgICogVGhlIGdpdmVuIGlkIGlzIHVzZWQgdG8gZmluZCBpdGVtcyBpbiBhIGNvbnRyaWJ1dGlvbiBtYW5hZ2VyLAotICAgICAqIGFuZCBmb3IgcG9zaXRpb25pbmcgaXRlbXMgcmVsYXRpdmUgdG8gb3RoZXIgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyaWJ1dGlvbkl0ZW0oU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklDb250cmlidXRpb25JdGVtPC9jb2RlPgotICAgICAqIG1ldGhvZCBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JQ29udHJpYnV0aW9uSXRlbTwvY29kZT4KLSAgICAgKiBtZXRob2QgZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklDb250cmlidXRpb25JdGVtPC9jb2RlPgotICAgICAqIG1ldGhvZCBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoTWVudSBtZW51LCBpbnQgaW5kZXgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklDb250cmlidXRpb25JdGVtPC9jb2RlPgotICAgICAqIG1ldGhvZCBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoVG9vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+Ci0gICAgICogbWV0aG9kIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoQ29vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+Ci0gICAgICogbWV0aG9kIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVXaWRnZXRTdGF0ZSgpIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25JdGVtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgY29udHJpYnV0aW9uIG1hbmFnZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgCi0gICAgICogY29udHJpYnV0aW9uIGl0ZW0gaXMgbm90IGN1cnJlbnRseSBhZGRlZCB0byBhIGNvbnRyaWJ1dGlvbiBtYW5hZ2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBjb250cmlidXRpb24gbWFuYWdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHVibGljIElDb250cmlidXRpb25NYW5hZ2VyIGdldFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklDb250cmlidXRpb25JdGVtPC9jb2RlPgotICAgICAqIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLSAgICAgICAgLy8gQGlzc3VlIHNob3VsZCB0aGlzIGJlIGZhbHNlIGluc3RlYWQgb2YgY2FsbGluZyBpc0R5bmFtaWMoKT8KLSAgICAgICAgcmV0dXJuIGlzRHluYW1pYygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+Ci0gICAgICogbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JQ29udHJpYnV0aW9uSXRlbTwvY29kZT4KLSAgICAgKiBtZXRob2QgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRHluYW1pYygpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+Ci0gICAgICogbWV0aG9kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dyb3VwTWFya2VyKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JQ29udHJpYnV0aW9uSXRlbTwvY29kZT4KLSAgICAgKiBtZXRob2QgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2VwYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JQ29udHJpYnV0aW9uSXRlbTwvY29kZT4KLSAgICAgKiBtZXRob2QgcmV0dXJucyB0aGUgdmFsdWUgcmVjb3JkZWQgaW4gYW4gaW50ZXJuYWwgc3RhdGUgdmFyaWFibGUsCi0gICAgICogd2hpY2ggaXMgPGNvZGU+dHJ1ZTwvY29kZT4gYnkgZGVmYXVsdC4gPGNvZGU+c2V0VmlzaWJsZTwvY29kZT4KLSAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBjaGFuZ2UgdGhpcyBzZXR0aW5nLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHZpc2libGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JQ29udHJpYnV0aW9uSXRlbTwvY29kZT4KLSAgICAgKiBtZXRob2Qgc3RvcmVzIHRoZSB2YWx1ZSBpbiBhbiBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZSwKLSAgICAgKiB3aGljaCBpcyA8Y29kZT50cnVlPC9jb2RlPiBieSBkZWZhdWx0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIHRoaXMudmlzaWJsZSA9IHZpc2libGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnRyaWJ1dGlvbiBpdGVtIAotICAgICAqIHN1aXRhYmxlIG9ubHkgZm9yIGRlYnVnZ2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKGlkPSIgKyBnZXRJZCgpICsgIikiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JQ29udHJpYnV0aW9uSXRlbTwvY29kZT4KLSAgICAgKiBtZXRob2QgZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db250cmlidXRpb25JdGVtPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIG1ldGhvZCBkZWNsYXJlZCBvbiA8Y29kZT5JQ29udHJpYnV0aW9uSXRlbTwvY29kZT4gZG9lcyBub3RoaW5nLgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHVwZGF0ZSB0aGVpciBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoU3RyaW5nIGlkKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0NvbnRyaWJ1dGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9Db250cmlidXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MDI0ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0NvbnRyaWJ1dGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlBvbGljeTsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgY29udHJpYnV0aW9uIG1hbmFnZXJzLCBhbmQgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gCi0gKiBvZiA8Y29kZT5JQ29udHJpYnV0aW9uTWFuYWdlcjwvY29kZT4uIFRoaXMgY2xhc3MgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSAKLSAqIGNvbW1vbiBhY3Jvc3MgdGhlIHNwZWNpZmljIG1hbmFnZXJzIGRlZmluZWQgYnkgdGhpcyBmcmFtZXdvcmsuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWFpbnRhaW5zIGEgbGlzdCBvZiBjb250cmlidXRpb24gaXRlbXMgYW5kIGEgZGlydHkgZmxhZywgYm90aCBhcyAKLSAqIGludGVybmFsIHN0YXRlLiBJbiBhZGRpdGlvbiB0byBwcm92aWRpbmcgaW1wbGVtZW50YXRpb25zIG9mIG1vc3QgCi0gKiA8Y29kZT5JQ29udHJpYnV0aW9uTWFuYWdlcjwvY29kZT4gbWV0aG9kcywgdGhpcyBjbGFzcyBhdXRvbWF0aWNhbGx5Ci0gKiBjb2FsZXNjZXMgYWRqYWNlbnQgc2VwYXJhdG9ycywgaGlkZXMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgc2VwYXJhdG9ycywKLSAqIGFuZCBkZWFscyB3aXRoIGR5bmFtaWNhbGx5IGNoYW5naW5nIHNldHMgb2YgY29udHJpYnV0aW9ucy4gV2hlbiB0aGUgc2V0Ci0gKiBvZiBjb250cmlidXRpb25zIGRvZXMgY2hhbmdlIGR5bmFtaWNhbGx5LCB0aGUgY2hhbmdlcyBhcmUgcHJvcGFnYXRlZAotICogdG8gdGhlIGNvbnRyb2wgdmlhIHRoZSA8Y29kZT51cGRhdGU8L2NvZGU+IG1ldGhvZCwgd2hpY2ggc3ViY2xhc3NlcwotICogbXVzdCBpbXBsZW1lbnQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIE5vdGU6IEEgPGNvZGU+Q29udHJpYnV0aW9uSXRlbTwvY29kZT4gY2Fubm90IGJlIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudAotICogPGNvZGU+Q29udHJpYnV0aW9uTWFuYWdlcjwvY29kZT5zLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udHJpYnV0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElDb250cmlidXRpb25NYW5hZ2VyIHsKLQotICAgIC8vCUludGVybmFsIGRlYnVnIGZsYWcuCi0gICAgLy8JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGlzdCBvZiBjb250cmlidXRpb24gaXRlbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGNvbnRyaWJ1dGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKiogCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHdpZGdldHMgYXJlIGluIHN5bmMgd2l0aCB0aGUgY29udHJpYnV0aW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEaXJ0eSA9IHRydWU7Ci0KLSAgICAvKiogCi0gICAgICogTnVtYmVyIG9mIGR5bmFtaWMgY29udHJpYnV0aW9uIGl0ZW1zLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGR5bmFtaWNJdGVtcyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgb3ZlcnJpZGVzIGZvciBpdGVtcyBvZiB0aGlzIG1hbmFnZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIElDb250cmlidXRpb25NYW5hZ2VyT3ZlcnJpZGVzIG92ZXJyaWRlczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY29udHJpYnV0aW9uIG1hbmFnZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyaWJ1dGlvbk1hbmFnZXIoKSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbikpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKGFsbG93SXRlbShpdGVtKSkgewotICAgICAgICAgICAgY29udHJpYnV0aW9ucy5hZGQoaXRlbSk7Ci0gICAgICAgICAgICBpdGVtQWRkZWQoaXRlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY29udHJpYnV0aW9uIGl0ZW0gdG8gdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgZ3JvdXAgCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBncm91cE5hbWUgdGhlIG5hbWUgb2YgdGhlIGdyb3VwCi0gICAgICogQHBhcmFtIGl0ZW0gdGhlIGNvbnRyaWJ1dGlvbiBpdGVtCi0gICAgICogQHBhcmFtIGFwcGVuZCA8Y29kZT50cnVlPC9jb2RlPiB0byBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgZ3JvdXAsIAotICAgICAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBhZGQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ3JvdXAKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBncm91cCB3aXRoCi0gICAgICogICB0aGUgZ2l2ZW4gbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRUb0dyb3VwKFN0cmluZyBncm91cE5hbWUsIElDb250cmlidXRpb25JdGVtIGl0ZW0sCi0gICAgICAgICAgICBib29sZWFuIGFwcGVuZCkgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgSXRlcmF0b3IgaXRlbXMgPSBjb250cmlidXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGl0ZW1zLmhhc05leHQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBvID0gKElDb250cmlidXRpb25JdGVtKSBpdGVtcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoby5pc0dyb3VwTWFya2VyKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBvLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQuZXF1YWxzSWdub3JlQ2FzZShncm91cE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFwcGVuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGl0ZW1zLmhhc05leHQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gY2kgPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGl0ZW1zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaS5pc0dyb3VwTWFya2VyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhbGxvd0l0ZW0oaXRlbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyaWJ1dGlvbnMuYWRkKGksIGl0ZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUFkZGVkKGl0ZW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR3JvdXAgbm90IGZvdW5kOiAiICsgZ3JvdXBOYW1lKTsvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRUb0dyb3VwKFN0cmluZyBncm91cE5hbWUsIElBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgIGFkZFRvR3JvdXAoZ3JvdXBOYW1lLCBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvR3JvdXAoU3RyaW5nIGdyb3VwTmFtZSwgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotICAgICAgICBhZGRUb0dyb3VwKGdyb3VwTmFtZSwgaXRlbSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgYWxsb3dzIHN1YmNsYXNzZXMgb2YgPGNvZGU+Q29udHJpYnV0aW9uTWFuYWdlcjwvY29kZT4gdG8gcHJldmVudAotICAgICAqIGNlcnRhaW4gaXRlbXMgaW4gdGhlIGNvbnRyaWJ1dGlvbnMgbGlzdC4gIDxjb2RlPkNvbnRyaWJ1dGlvbk1hbmFnZXI8L2NvZGU+Ci0gICAgICogd2lsbCBlaXRoZXIgYmxvY2sgb3IgYWxsb3cgYW4gYWRkaXRpb24gYmFzZWQgb24gdGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZAotICAgICAqIGNhbGwuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgZHVwbGljYXRpb24sIGZvciBleGFtcGxlLgotICAgICAqIEBwYXJhbSBpdGVtVG9BZGQgVGhlIGNvbnRyaWJ1dGlvbiBpdGVtIHRvIGJlIGFkZGVkOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYWRkaXRpb24gc2hvdWxkIGJlIGFsbG93ZWQ7IAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgYWxsIGl0ZW1zLgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd0l0ZW0oSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbVRvQWRkKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGRlYnVnIG1ldGhvZCBmb3IgcHJpbnRpbmcgc3RhdGlzdGljcyBhYm91dCB0aGlzIG1hbmFnZXIKLSAgICAgKiB0byA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wU3RhdGlzdGljcygpIHsKLSAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICBpZiAoY29udHJpYnV0aW9ucyAhPSBudWxsKQotICAgICAgICAgICAgc2l6ZSA9IGNvbnRyaWJ1dGlvbnMuc2l6ZSgpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aGlzLnRvU3RyaW5nKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIE51bWJlciBvZiBlbGVtZW50czogIiArIHNpemUpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IHN1bSA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgaWYgKCgoSUNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbnMuZ2V0KGkpKS5pc1Zpc2libGUoKSkKLSAgICAgICAgICAgICAgICBzdW0rKzsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBOdW1iZXIgb2YgdmlzaWJsZSBlbGVtZW50czogIiArIHN1bSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIElzIGRpcnR5OiAiICsgaXNEaXJ0eSgpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIElDb250cmlidXRpb25JdGVtIGZpbmQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGUgPSBjb250cmlidXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc05leHQoKSkgewotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IChJQ29udHJpYnV0aW9uSXRlbSkgZS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgaXRlbUlkID0gaXRlbS5nZXRJZCgpOwotICAgICAgICAgICAgaWYgKGl0ZW1JZCAhPSBudWxsICYmIGl0ZW1JZC5lcXVhbHNJZ25vcmVDYXNlKGlkKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbVtdIGdldEl0ZW1zKCkgewotICAgICAgICBJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW2NvbnRyaWJ1dGlvbnMuc2l6ZSgpXTsKLSAgICAgICAgY29udHJpYnV0aW9ucy50b0FycmF5KGl0ZW1zKTsKLSAgICAgICAgcmV0dXJuIGl0ZW1zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db250cmlidXRpb25NYW5hZ2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogbWV0aG9kIGRlY2xhcmVkIG9uIDxjb2RlPklDb250cmlidXRpb25NYW5hZ2VyPC9jb2RlPiByZXR1cm5zCi0gICAgICogdGhlIGN1cnJlbnQgb3ZlcnJpZGVzLiBJZiB0aGVyZSBpcyBubyBvdmVycmlkZXMgaXQgbGF6aWx5IGNyZWF0ZXMKLSAgICAgKiBvbmUgd2hpY2ggb3ZlcnJpZGVzIG5vIGl0ZW0gc3RhdGUuCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHB1YmxpYyBJQ29udHJpYnV0aW9uTWFuYWdlck92ZXJyaWRlcyBnZXRPdmVycmlkZXMoKSB7Ci0gICAgICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgb3ZlcnJpZGVzID0gbmV3IElDb250cmlidXRpb25NYW5hZ2VyT3ZlcnJpZGVzKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIGdldEVuYWJsZWQoSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgSW50ZWdlciBnZXRBY2NlbGVyYXRvcihJQ29udHJpYnV0aW9uSXRlbSBpdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZWxlcmF0b3JUZXh0KElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3ZlcnJpZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbnRyaWJ1dGlvbiBtYW5hZ2VyIGNvbnRhaW5zIGR5bmFtaWMgaXRlbXMuIAotICAgICAqIEEgZHluYW1pYyBjb250cmlidXRpb24gaXRlbSBjb250cmlidXRlcyBpdGVtcyBjb25kaXRpb25hbGx5LCAKLSAgICAgKiBkZXBlbmRlbnQgb24gc29tZSBpbnRlcm5hbCBzdGF0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBtYW5hZ2VyIGNvbnRhaW5zIGR5bmFtaWMgaXRlbXMsIGFuZAotICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzRHluYW1pY0l0ZW1zKCkgewotICAgICAgICByZXR1cm4gKGR5bmFtaWNJdGVtcyA+IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBpdGVtIHdpdGggdGhlIGdpdmVuIGlkLgotICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIGl0ZW0gd2hvc2UgaW5kZXggaXMgcmVxdWVzdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5pbnQ8L2NvZGU+IHRoZSBpbmRleCBvciAtMSBpZiB0aGUgaXRlbSBpcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0aW9ucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IChJQ29udHJpYnV0aW9uSXRlbSkgY29udHJpYnV0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgaXRlbUlkID0gaXRlbS5nZXRJZCgpOwotICAgICAgICAgICAgaWYgKGl0ZW1JZCAhPSBudWxsICYmIGl0ZW1JZC5lcXVhbHNJZ25vcmVDYXNlKGlkKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG9iamVjdCBpbiB0aGUgaW50ZXJuYWwgc3RydWN0dXJlLiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIAotICAgICAqIDxjb2RlPmluZGV4T2YoU3RyaW5nIGlkKTwvY29kZT4gc2luY2Ugc29tZSBjb250cmlidXRpb24gaXRlbXMgbWF5IG5vdCBoYXZlIGFuIGlkLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gaXRlbSBUaGUgY29udHJpYnV0aW9uIGl0ZW0gCi0gICAgICogQHJldHVybiB0aGUgaW5kZXgsIG9yIC0xIGlmIHRoZSBpdGVtIGlzIG5vdCBmb3VuZAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGluZGV4T2YoSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotICAgICAgICByZXR1cm4gY29udHJpYnV0aW9ucy5pbmRleE9mKGl0ZW0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBiZSB1c2VkIGZvciBpbnNlcnRpb24KLSAgICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBiZSBpbnNlcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluc2VydChpbnQgaW5kZXgsIElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKGluZGV4ID4gY29udHJpYnV0aW9ucy5zaXplKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgImluc2VydGluZyAiICsgaXRlbS5nZXRJZCgpICsgIiBhdCAiICsgaW5kZXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgaWYgKGFsbG93SXRlbShpdGVtKSkgewotICAgICAgICAgICAgY29udHJpYnV0aW9ucy5hZGQoaW5kZXgsIGl0ZW0pOwotICAgICAgICAgICAgaXRlbUFkZGVkKGl0ZW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRBZnRlcihTdHJpbmcgSUQsIElBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgIGluc2VydEFmdGVyKElELCBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluc2VydEFmdGVyKFN0cmluZyBJRCwgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBjaSA9IGZpbmQoSUQpOwotICAgICAgICBpZiAoY2kgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbid0IGZpbmQgSUQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGludCBpeCA9IGNvbnRyaWJ1dGlvbnMuaW5kZXhPZihjaSk7Ci0gICAgICAgIGlmIChpeCA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImluc2VydCBhZnRlcjogIiArIGl4KTsKLSAgICAgICAgICAgIGlmIChhbGxvd0l0ZW0oaXRlbSkpIHsKLSAgICAgICAgICAgICAgICBjb250cmlidXRpb25zLmFkZChpeCArIDEsIGl0ZW0pOwotICAgICAgICAgICAgICAgIGl0ZW1BZGRlZChpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0QmVmb3JlKFN0cmluZyBJRCwgSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgaW5zZXJ0QmVmb3JlKElELCBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluc2VydEJlZm9yZShTdHJpbmcgSUQsIElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gY2kgPSBmaW5kKElEKTsKLSAgICAgICAgaWYgKGNpID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4ndCBmaW5kIElEICIgKyBJRCk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBpbnQgaXggPSBjb250cmlidXRpb25zLmluZGV4T2YoY2kpOwotICAgICAgICBpZiAoaXggPj0gMCkgewotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJpbnNlcnQgYmVmb3JlOiAiICsgaXgpOwotICAgICAgICAgICAgaWYgKGFsbG93SXRlbShpdGVtKSkgewotICAgICAgICAgICAgICAgIGNvbnRyaWJ1dGlvbnMuYWRkKGl4LCBpdGVtKTsKLSAgICAgICAgICAgICAgICBpdGVtQWRkZWQoaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgICAgIGlmIChpc0RpcnR5KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChoYXNEeW5hbWljSXRlbXMoKSkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29udHJpYnV0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gKElDb250cmlidXRpb25JdGVtKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc0RpcnR5KCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiBjb250cmlidXRpb25zLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZ2l2ZW4gaXRlbSB3YXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgY29udHJpYnV0aW9ucy4KLSAgICAgKiBNYXJrcyB0aGUgbWFuYWdlciBhcyBkaXJ0eSBhbmQgdXBkYXRlcyB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgaXRlbXMsIGFuZCB0aGUgbWVtZW50by4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpdGVtQWRkZWQoSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotICAgICAgICBpdGVtLnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgbWFya0RpcnR5KCk7Ci0gICAgICAgIGlmIChpdGVtLmlzRHluYW1pYygpKQotICAgICAgICAgICAgZHluYW1pY0l0ZW1zKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGdpdmVuIGl0ZW0gd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBjb250cmlidXRpb25zLgotICAgICAqIE1hcmtzIHRoZSBtYW5hZ2VyIGFzIGRpcnR5IGFuZCB1cGRhdGVzIHRoZSBudW1iZXIgb2YgZHluYW1pYyBpdGVtcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpdGVtUmVtb3ZlZChJQ29udHJpYnV0aW9uSXRlbSBpdGVtKSB7Ci0gICAgICAgIGl0ZW0uc2V0UGFyZW50KG51bGwpOwotICAgICAgICBtYXJrRGlydHkoKTsKLSAgICAgICAgaWYgKGl0ZW0uaXNEeW5hbWljKCkpCi0gICAgICAgICAgICBkeW5hbWljSXRlbXMtLTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1hcmtEaXJ0eSgpIHsKLSAgICAgICAgc2V0RGlydHkodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmVwZW5kVG9Hcm91cChTdHJpbmcgZ3JvdXBOYW1lLCBJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBhZGRUb0dyb3VwKGdyb3VwTmFtZSwgbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJlcGVuZFRvR3JvdXAoU3RyaW5nIGdyb3VwTmFtZSwgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotICAgICAgICBhZGRUb0dyb3VwKGdyb3VwTmFtZSwgaXRlbSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIElDb250cmlidXRpb25JdGVtIHJlbW92ZShTdHJpbmcgSUQpIHsKLSAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gY2kgPSBmaW5kKElEKTsKLSAgICAgICAgaWYgKGNpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHJlbW92ZShjaSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUNvbnRyaWJ1dGlvbkl0ZW0gcmVtb3ZlKElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKGNvbnRyaWJ1dGlvbnMucmVtb3ZlKGl0ZW0pKSB7Ci0gICAgICAgICAgICBpdGVtUmVtb3ZlZChpdGVtKTsKLSAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotICAgICAgICBJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gZ2V0SXRlbXMoKTsKLSAgICAgICAgY29udHJpYnV0aW9ucy5jbGVhcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICBpdGVtUmVtb3ZlZChpdGVtKTsKLSAgICAgICAgfQotICAgICAgICBkeW5hbWljSXRlbXMgPSAwOwotICAgICAgICBtYXJrRGlydHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgaXRlbSBvZiB0aGUgZ2l2ZW4gaWRlbnRpZmllciB3aXRoIGFub3RoZXIgY29udHJpYnV0aW9uIGl0ZW0uCi0gICAgICogVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHJlcGxhY2UgbGFyZ2UgY29udHJpYnV0aW9uIGl0ZW1zIHdpdGgKLSAgICAgKiBwbGFjZWhvbGRlcnMgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLiAgSWYgdGhlIGlkZW50aWZpZXIgY2Fubm90IGJlIGZvdW5kIGluIHRoZQotICAgICAqIGN1cnJlbnQgbGlzdCBvZiBpdGVtcywgdGhlbiB0aGlzIGRvZXMgbm90aGluZy4gIElmIG11bHRpcGxlIG9jY3VycmVuY2VzIGFyZQotICAgICAqIGZvdW5kLCB0aGVuIHRoZSByZXBsYWNlbWVudCBpdGVtcyBpcyBwdXQgaW4gdGhlIGZpcnN0IHBvc2l0aW9uIGFuZCB0aGUgb3RoZXIKLSAgICAgKiBwb3NpdGlvbnMgYXJlIHJlbW92ZWQuCi0gICAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgdG8gbG9vayBmb3IgaW4gdGhlIGxpc3Qgb2YgY29udHJpYnV0aW9uczsKLSAgICAgKiBzaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSByZXBsYWNlbWVudEl0ZW0gVGhlIGNvbnRyaWJ1dGlvbiBpdGVtIHRvIHJlcGxhY2UgdGhlIG9sZCBpdGVtOyBtdXN0Ci0gICAgICogbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LiAgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uTWFuYWdlciNyZW1vdmUoamF2YS5sYW5nLlN0cmluZykgcmVtb3ZlfSBpZiB0aGF0IGlzIHdoYXQgeW91IHdhbnQgdG8gZG8uCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gaWRlbnRpZmllciBjYW4gYmU7IDxjb2RlPgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlSXRlbShmaW5hbCBTdHJpbmcgaWRlbnRpZmllciwKLSAgICAgICAgICAgIGZpbmFsIElDb250cmlidXRpb25JdGVtIHJlcGxhY2VtZW50SXRlbSkgewotICAgICAgICBpZiAoaWRlbnRpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBpbmRleE9mKGlkZW50aWZpZXIpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGNvdWxkbid0IGZpbmQgdGhlIGl0ZW0uCi0gICAgICAgIH0KLQotICAgICAgICAvLyBSZW1vdmUgdGhlIG9sZCBpdGVtLgotICAgICAgICBmaW5hbCBJQ29udHJpYnV0aW9uSXRlbSBvbGRJdGVtID0gKElDb250cmlidXRpb25JdGVtKSBjb250cmlidXRpb25zCi0gICAgICAgICAgICAgICAgLmdldChpbmRleCk7Ci0gICAgICAgIGl0ZW1SZW1vdmVkKG9sZEl0ZW0pOwotCi0gICAgICAgIC8vIEFkZCB0aGUgbmV3IGl0ZW0uCi0gICAgICAgIGNvbnRyaWJ1dGlvbnMuc2V0KGluZGV4LCByZXBsYWNlbWVudEl0ZW0pOwotICAgICAgICBpdGVtQWRkZWQocmVwbGFjZW1lbnRJdGVtKTsgLy8gdGhyb3dzIE5QRSBpZiAocmVwbGFjZW1lbnRJdGVtID09IG51bGwpCi0KLSAgICAgICAgLy8gR28gdGhyb3VnaCBhbmQgcmVtb3ZlIGR1cGxpY2F0ZXMuCi0gICAgICAgIGZvciAoaW50IGkgPSBjb250cmlidXRpb25zLnNpemUoKSAtIDE7IGkgPiBpbmRleDsgaS0tKSB7Ci0gICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gKElDb250cmlidXRpb25JdGVtKSBjb250cmlidXRpb25zLmdldChpKTsKLSAgICAgICAgICAgIGlmICgoaXRlbSAhPSBudWxsKSAmJiAoaWRlbnRpZmllci5lcXVhbHMoaXRlbS5nZXRJZCgpKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoUG9saWN5LlRSQUNFX1RPT0xCQVIpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJSZW1vdmluZyBkdXBsaWNhdGUgb24gcmVwbGFjZTogIiArIGlkZW50aWZpZXIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRyaWJ1dGlvbnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgIGl0ZW1SZW1vdmVkKGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7IC8vIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBtYW5hZ2VyIGlzIGRpcnR5LiBXaGVuIGRpcnR5LCB0aGUgbGlzdCBvZiBjb250cmlidXRpb25zIAotICAgICAqIGlzIG5vdCBhY2N1cmF0ZWx5IHJlZmxlY3RlZCBpbiB0aGUgY29ycmVzcG9uZGluZyB3aWRnZXRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGRpcnR5IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWFuYWdlciBpcyBkaXJ0eSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgaWYgaXQgaXMgdXAtdG8tZGF0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldERpcnR5KGJvb2xlYW4gZGlydHkpIHsKLSAgICAgICAgaXNEaXJ0eSA9IGRpcnR5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG92ZXJyaWRlcyBmb3IgdGhpcyBjb250cmlidXRpb24gbWFuYWdlcgotICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdPdmVycmlkZXMgdGhlIG92ZXJyaWRlcyBmb3IgdGhlIGl0ZW1zIG9mIHRoaXMgbWFuYWdlcgotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZXMoSUNvbnRyaWJ1dGlvbk1hbmFnZXJPdmVycmlkZXMgbmV3T3ZlcnJpZGVzKSB7Ci0gICAgICAgIG92ZXJyaWRlcyA9IG5ld092ZXJyaWRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBpbnRlcm5hbCBtZXRob2QgZm9yIHNldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBjb250cmlidXRpb24gaXRlbXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZW1zIHRoZSBjb250cmlidXRpb24gaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBvcmRlcgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFNldEl0ZW1zKElDb250cmlidXRpb25JdGVtW10gaXRlbXMpIHsKLSAgICAgICAgY29udHJpYnV0aW9ucy5jbGVhcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYWxsb3dJdGVtKGl0ZW1zW2ldKSkgewotICAgICAgICAgICAgICAgIGNvbnRyaWJ1dGlvbnMuYWRkKGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9Db250cm9sQ29udHJpYnV0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vQ29udHJvbENvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWYwZDJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9Db250cm9sQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGNvbnRyaWJ1dGlvbiBpdGVtIGltcGxlbWVudGF0aW9uIGZvciBhZGRpbmcgYW4gYXJiaXRyYXJ5IAotICogU1dUIGNvbnRyb2wgdG8gYSB0b29sIGJhci4gCi0gKiBOb3RlLCBob3dldmVyLCB0aGF0IHRoZXNlIGl0ZW1zIGNhbm5vdCBiZSBjb250cmlidXRlZCB0byBtZW51IGJhcnMuCi0gKiA8cD4KLSAqIFRoZSA8Y29kZT5jcmVhdGVDb250cm9sPC9jb2RlPiBmcmFtZXdvcmsgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQKLSAqIGJ5IGNvbmNyZXRlIHN1YmNsYXNzZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250cm9sQ29udHJpYnV0aW9uIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbnRyb2wgY29udHJpYnV0aW9uIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gaWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtIGlkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2xDb250cmlidXRpb24oU3RyaW5nIGlkKSB7Ci0gICAgICAgIHN1cGVyKGlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wdXRlcyB0aGUgd2lkdGggb2YgdGhlIGdpdmVuIGNvbnRyb2wgd2hpY2ggaXMgYmVpbmcgYWRkZWQKLSAgICAgKiB0byBhIHRvb2wgYmFyLiAgVGhpcyBpcyBuZWVkZWQgdG8gZGV0ZXJtaW5lIHRoZSB3aWR0aCBvZiB0aGUgdG9vbCBiYXIgaXRlbQotICAgICAqIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGNvbnRyb2wuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIHJldHVybnMgCi0gICAgICogPGNvZGU+Y29udHJvbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLng8L2NvZGU+LgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIGlmIHJlcXVpcmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250cm9sIHRoZSBjb250cm9sIGJlaW5nIGFkZGVkCi0gICAgICogQHJldHVybiB0aGUgd2lkdGggb2YgdGhlIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVXaWR0aChDb250cm9sIGNvbnRyb2wpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRyb2wgZm9yIHRoaXMgY29udHJpYnV0aW9uIGl0ZW0KLSAgICAgKiB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZyYW1ld29yayBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZQotICAgICAqIHN1YmNsYXNzZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqIEByZXR1cm4gdGhlIG5ldyBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb250cm9sIGl0ZW0gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JQ29udHJpYnV0aW9uSXRlbTwvY29kZT4KLSAgICAgKiBtZXRob2QgY2FsbHMgdGhlIDxjb2RlPmNyZWF0ZUNvbnRyb2w8L2NvZGU+IGZyYW1ld29yayBtZXRob2QuCi0gICAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCA8Y29kZT5jcmVhdGVDb250cm9sPC9jb2RlPiByYXRoZXIgdGhhbgotICAgICAqIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZmlsbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29udHJvbCBpdGVtIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+Ci0gICAgICogbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gc2luY2UgY29udHJvbHMgY2Fubm90IGJlIGFkZGVkIHRvIG1lbnVzLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZpbGwoTWVudSBwYXJlbnQsIGludCBpbmRleCkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKGZhbHNlLCAiQ2FuJ3QgYWRkIGEgY29udHJvbCB0byBhIG1lbnUiKTsvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnRyb2wgaXRlbSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklDb250cmlidXRpb25JdGVtPC9jb2RlPgotICAgICAqIG1ldGhvZCBjYWxscyB0aGUgPGNvZGU+Y3JlYXRlQ29udHJvbDwvY29kZT4gZnJhbWV3b3JrIG1ldGhvZCB0bwotICAgICAqIGNyZWF0ZSBhIGNvbnRyb2wgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCwgYW5kIHRoZW4gY3JlYXRlcwotICAgICAqIGEgbmV3IHRvb2wgaXRlbSB0byBob2xkIGl0LgotICAgICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgPGNvZGU+Y3JlYXRlQ29udHJvbDwvY29kZT4gcmF0aGVyIHRoYW4KLSAgICAgKiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZpbGwoVG9vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBjcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgICAgIFRvb2xJdGVtIHRpID0gbmV3IFRvb2xJdGVtKHBhcmVudCwgU1dULlNFUEFSQVRPUiwgaW5kZXgpOwotICAgICAgICB0aS5zZXRDb250cm9sKGNvbnRyb2wpOwotICAgICAgICB0aS5zZXRXaWR0aChjb21wdXRlV2lkdGgoY29udHJvbCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9Db29sQmFyTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0Nvb2xCYXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMjZlNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0Nvb2xCYXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci0KLS8qKgotICogQSBjb29sIGJhciBtYW5hZ2VyIGlzIGEgY29udHJpYnV0aW9uIG1hbmFnZXIgd2hpY2ggcmVhbGl6ZXMgaXRzZWxmIGFuZCBpdHMKLSAqIGl0ZW1zIGluIGEgY29vbCBiYXIgY29udHJvbC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBtYXkgYWxzbyBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb29sQmFyTWFuYWdlciBleHRlbmRzIENvbnRyaWJ1dGlvbk1hbmFnZXIgaW1wbGVtZW50cwotICAgICAgICBJQ29vbEJhck1hbmFnZXIgewotCi0gICAgLyoqCi0gICAgICogQSBzZXBhcmF0b3IgY3JlYXRlZCBieSB0aGUgZW5kIHVzZXIuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFUl9TRVBBUkFUT1IgPSAiVXNlclNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBvcmlnaW5hbCBjcmVhdGlvbiBvcmRlciBvZiB0aGUgY29udHJpYnV0aW9uIGl0ZW1zLgotICAgICAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0IGNiSXRlbXNDcmVhdGlvbk9yZGVyID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogTWVudU1hbmFnZXIgZm9yIGNvb2wgYmFyIHBvcC11cCBtZW51LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZW51TWFuYWdlciBjb250ZXh0TWVudU1hbmFnZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvb2wgYmFyIGNvbnRyb2w7IDxjb2RlPm51bGw8L2NvZGU+IGJlZm9yZSBjcmVhdGlvbiBhbmQgYWZ0ZXIKLSAgICAgKiBkaXNwb3NhbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIENvb2xCYXIgY29vbEJhciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29vbCBiYXIgaXRlbXMgc3R5bGU7IDxjb2RlPlNXVC5OT05FPC9jb2RlPiBieSBkZWZhdWx0LgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGl0ZW1TdHlsZSA9IFNXVC5OT05FOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBjb29sIGJhciBtYW5hZ2VyIHdpdGggdGhlIGRlZmF1bHQgc3R5bGUuIEVxdWl2YWxlbnQgdG8KLSAgICAgKiA8Y29kZT5Db29sQmFyTWFuYWdlcihTV1QuTk9ORSk8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBDb29sQmFyTWFuYWdlcigpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb29sIGJhciBtYW5hZ2VyIGZvciBhbiBleGlzdGluZyBjb29sIGJhciBjb250cm9sLiBUaGlzCi0gICAgICogbWFuYWdlciBiZWNvbWVzIHJlc3BvbnNpYmxlIGZvciB0aGUgY29udHJvbCwgYW5kIHdpbGwgZGlzcG9zZSBvZiBpdCB3aGVuCi0gICAgICogdGhlIG1hbmFnZXIgaXMgZGlzcG9zZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvb2xCYXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb29sIGJhciBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIENvb2xCYXJNYW5hZ2VyKENvb2xCYXIgY29vbEJhcikgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoY29vbEJhcik7Ci0gICAgICAgIHRoaXMuY29vbEJhciA9IGNvb2xCYXI7Ci0gICAgICAgIGl0ZW1TdHlsZSA9IGNvb2xCYXIuZ2V0U3R5bGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29vbCBiYXIgbWFuYWdlciB3aXRoIHRoZSBnaXZlbiBTV1Qgc3R5bGUuIENhbGxpbmcgPGNvZGU+Y3JlYXRlQ29udHJvbDwvY29kZT4KLSAgICAgKiB3aWxsIGNyZWF0ZSB0aGUgY29vbCBiYXIgY29udHJvbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3R5bGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb29sIGJhciBpdGVtIHN0eWxlOyBzZWUKLSAgICAgKiAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyIENvb2xCYXJ9Zm9yIGZvciB2YWxpZAotICAgICAqICAgICAgICAgICAgc3R5bGUgYml0cwotICAgICAqLwotICAgIHB1YmxpYyBDb29sQmFyTWFuYWdlcihpbnQgc3R5bGUpIHsKLSAgICAgICAgaXRlbVN0eWxlID0gc3R5bGU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvb2xCYXJNYW5hZ2VyI2FkZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbCh0b29sQmFyTWFuYWdlcik7Ci0gICAgICAgIHN1cGVyLmFkZChuZXcgVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0odG9vbEJhck1hbmFnZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb2xsYXBzZXMgY29uc2VjdXRpdmUgc2VwYXJhdG9ycyBhbmQgcmVtb3ZlcyBhIHNlcGFyYXRvciBmcm9tIHRoZQotICAgICAqIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250cmlidXRpb25MaXN0Ci0gICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBjb250cmlidXRpb25zOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIFRoZSBjb250cmlidXRpb24gbGlzdCBwcm92aWRlZCB3aXRoIGV4dHJhbmVvdXMgc2VwYXJhdG9ycwotICAgICAqICAgICAgICAgcmVtb3ZlZDsgdGhpcyB2YWx1ZSBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPiwgYnV0IG1heSBiZQotICAgICAqICAgICAgICAgZW1wdHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgYWRqdXN0Q29udHJpYnV0aW9uTGlzdChBcnJheUxpc3QgY29udHJpYnV0aW9uTGlzdCkgewotICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtOwotICAgICAgICAvLyBGaXN0IHJlbW92ZSBhIHNlcGFyYXRvciBpZiBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdAotICAgICAgICBpZiAoY29udHJpYnV0aW9uTGlzdC5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgaXRlbSA9IChJQ29udHJpYnV0aW9uSXRlbSkgY29udHJpYnV0aW9uTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAoaXRlbS5pc1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgY29udHJpYnV0aW9uTGlzdC5yZW1vdmUoMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3RJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRyaWJ1dGlvbkxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAvLyBjb2xsYXBzZSBjb25zZWN1dGl2ZSBzZXBhcmF0b3JzCi0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaXRlbSA9IChJQ29udHJpYnV0aW9uSXRlbSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IChJQ29udHJpYnV0aW9uSXRlbSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXNTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTm93IGNoZWNrIGxhc3QgZWxlbWVudCB0byBzZWUgaWYgdGhlcmUgaXMgYSBzZXBhcmF0b3IKLSAgICAgICAgICAgIGl0ZW0gPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbkxpc3QuZ2V0KGNvbnRyaWJ1dGlvbkxpc3QKLSAgICAgICAgICAgICAgICAgICAgLnNpemUoKSAtIDEpOwotICAgICAgICAgICAgaWYgKGl0ZW0uaXNTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgICAgIGNvbnRyaWJ1dGlvbkxpc3QucmVtb3ZlKGNvbnRyaWJ1dGlvbkxpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRyaWJ1dGlvbkxpc3Q7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uTWFuYWdlciNjaGVja0R1cGxpY2F0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd0l0ZW0oSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbVRvQWRkKSB7Ci0gICAgICAgIC8qIFdlIHdpbGwgYWxsb3cgYXMgbWFueSBudWxsIGVudHJpZXMgYXMgdGhleSBsaWtlLCB0aG91Z2ggdGhlcmUgc2hvdWxkCi0gICAgICAgICAqIGJlIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoaXRlbVRvQWRkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogTnVsbCBpZGVudGlmaWVycyBjYW4gYmUgZXhwZWN0ZWQgaW4gZ2VuZXJpYyBjb250cmlidXRpb24gaXRlbXMuCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgZmlyc3RJZCA9IGl0ZW1Ub0FkZC5nZXRJZCgpOwotICAgICAgICBpZiAoZmlyc3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEN5Y2xlIHRocm91Z2ggdGhlIGN1cnJlbnQgbGlzdCBsb29raW5nIGZvciBkdXBsaWNhdGVzLgotICAgICAgICBJQ29udHJpYnV0aW9uSXRlbVtdIGN1cnJlbnRJdGVtcyA9IGdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBjdXJyZW50SXRlbSA9IGN1cnJlbnRJdGVtc1tpXTsKLQotICAgICAgICAgICAgLy8gV2UgaWdub3JlIG51bGwgZW50cmllcy4KLSAgICAgICAgICAgIGlmIChjdXJyZW50SXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBzZWNvbmRJZCA9IGN1cnJlbnRJdGVtLmdldElkKCk7Ci0gICAgICAgICAgICBpZiAoZmlyc3RJZC5lcXVhbHMoc2Vjb25kSWQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFBvbGljeS5UUkFDRV9UT09MQkFSKSB7IAotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeWluZyB0byBhZGQgYSBkdXBsaWNhdGUgaXRlbS4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBuZXcgRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRPTkUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3NpdGlvbnMgdGhlIGxpc3QgaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiBhbGwgdGhlIHNlcGFyYXRvcnMuIENhbGxpbmcKLSAgICAgKiA8Y29kZT5uZXh0KCk8L2NvZGU+IHRoZSBpdGVyYXRvciBzaG91bGQgcmV0dXJuIHRoZSBpbW1lZGlhdGUgb2JqZWN0Ci0gICAgICogZm9sbG93aW5nIHRoZSBsYXN0IHNlcGFyYXRvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IKLSAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IGl0ZXJhdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb2xsYXBzZVNlcGFyYXRvcnMoTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0KLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IChJQ29udHJpYnV0aW9uSXRlbSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFpdGVtLmlzU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBpdGVyYXRvci5wcmV2aW91cygpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY29vbCBiYXIgY29udHJvbCBoYXMgYmVlbiBjcmVhdGVkIGFuZCBub3QgeWV0Ci0gICAgICogZGlzcG9zZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udHJvbCBoYXMgYmVlbiBjcmVhdGVkIGFuZCBub3QgeWV0Ci0gICAgICogICAgICAgICBkaXNwb3NlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb29sQmFyRXhpc3QoKSB7Ci0gICAgICAgIHJldHVybiBjb29sQmFyICE9IG51bGwgJiYgIWNvb2xCYXIuaXNEaXNwb3NlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhpcyBtYW5hZ2VyJ3MgY29vbCBiYXIgY29udHJvbC4gRG9lcyBub3QgY3JlYXRlIGEKLSAgICAgKiBuZXcgY29udHJvbCBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHJldHVybiB0aGUgY29vbCBiYXIgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBDb29sQmFyIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHBhcmVudCk7Ci0gICAgICAgIGlmICghY29vbEJhckV4aXN0KCkpIHsKLSAgICAgICAgICAgIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihwYXJlbnQsIGl0ZW1TdHlsZSk7Ci0gICAgICAgICAgICBjb29sQmFyLnNldE1lbnUoZ2V0Q29udGV4dE1lbnVDb250cm9sKCkpOwotICAgICAgICAgICAgY29vbEJhci5zZXRMb2NrZWQoZmFsc2UpOwotICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29vbEJhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlcyBvZiB0aGlzIGNvb2wgYmFyIG1hbmFnZXIgYW5kIGZyZWVzIGFsbCBhbGxvY2F0ZWQgU1dUIHJlc291cmNlcy4KLSAgICAgKiBOb3RpZmllcyBhbGwgY29udHJpYnV0aW9uIGl0ZW1zIG9mIHRoZSBkaXNwb3NlLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QKLSAgICAgKiBkb2VzIG5vdCBjbGVhbiB1cCByZWZlcmVuY2VzIGJldHdlZW4gdGhpcyBjb29sIGJhciBtYW5hZ2VyIGFuZCBpdHMKLSAgICAgKiBhc3NvY2lhdGVkIGNvbnRyaWJ1dGlvbiBpdGVtcy4gVXNlIDxjb2RlPnJlbW92ZUFsbDwvY29kZT4gZm9yIHRoYXQKLSAgICAgKiBwdXJwb3NlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChjb29sQmFyRXhpc3QoKSkgewotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IGdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGlzcG9zZXMgb2YgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtLgotICAgICAgICAgICAgICAgIC8vIElmIENvbnRyaWJ1dGlvbiBJdGVtIGlzIGEgdG9vbGJhciB0aGVuIGl0IHdpbGwgZGlzcG9zZSBvZgotICAgICAgICAgICAgICAgIC8vIGFsbCB0aGUgbmVzdGVkCi0gICAgICAgICAgICAgICAgLy8gY29udHJpYnV0aW9uIGl0ZW1zLgotICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvb2xCYXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgY29vbEJhciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgYSBjb250ZXh0IG1lbnUgZXhpc3RlZCB0aGVuIGRpc3Bvc2Ugb2YgaXQuCi0gICAgICAgIGlmIChjb250ZXh0TWVudU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dE1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGNvbnRleHRNZW51TWFuYWdlciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3Bvc2VzIHRoZSBnaXZlbiBjb29sIGl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb29sIGl0ZW0gdG8gZGlzcG9zZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkaXNwb3NlKENvb2xJdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKChpdGVtICE9IG51bGwpICYmICFpdGVtLmlzRGlzcG9zZWQoKSkgewotCi0gICAgICAgICAgICBpdGVtLnNldERhdGEobnVsbCk7Ci0gICAgICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBpdGVtLmdldENvbnRyb2woKTsKLSAgICAgICAgICAgIC8vIGlmIHRoZSBjb250cm9sIGlzIGFscmVhZHkgZGlzcG9zZWQsIHNldHRpbmcgdGhlIGNvb2xpdGVtCi0gICAgICAgICAgICAvLyBjb250cm9sIHRvIG51bGwgd2lsbCBjYXVzZSBhbiBTV1QgZXhjZXB0aW9uLCB3b3JrYXJvdW5kCi0gICAgICAgICAgICAvLyBmb3IgMTk2MzAKLSAgICAgICAgICAgIGlmICgoY29udHJvbCAhPSBudWxsKSAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBpdGVtLnNldENvbnRyb2wobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpdGVtLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBjb29sIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb250cmlidXRpb24gaXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlbQotICAgICAqICAgICAgICAgICAgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtCi0gICAgICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBjb29sIGl0ZW0sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgQ29vbEl0ZW0gZmluZENvb2xJdGVtKElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgQ29vbEl0ZW1bXSBjb29sSXRlbXMgPSAoY29vbEJhciA9PSBudWxsKSA/IG51bGwgOiBjb29sQmFyLmdldEl0ZW1zKCk7IAotICAgICAgICByZXR1cm4gZmluZENvb2xJdGVtKGNvb2xJdGVtcywgaXRlbSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQ29vbEl0ZW0gZmluZENvb2xJdGVtKENvb2xJdGVtW10gaXRlbXMsIElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW1zID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDb29sSXRlbSBjb29sSXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gZGF0YSA9IChJQ29udHJpYnV0aW9uSXRlbSkgY29vbEl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmVxdWFscyhpdGVtKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29vbEl0ZW07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgY29uc2lzdGVudCBzZXQgb2Ygd3JhcCBpbmRpY2VzLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYWx3YXlzCi0gICAgICogaW5jbHVkZSBhdCBsZWFzdCBvbmUgZW50cnkgYW5kIHRoZSBmaXJzdCBlbnRyeSB3aWxsIGFsd2F5cyBiZSB6ZXJvLgotICAgICAqIENvb2xCYXIuZ2V0V3JhcEluZGljZXMoKSBpcyBpbmNvbnNpc3RlbnQgaW4gd2hldGhlciBvciBub3QgaXQgcmV0dXJucyBhbgotICAgICAqIGluZGV4IGZvciB0aGUgZmlyc3Qgcm93LgotICAgICAqIAotICAgICAqIEBwYXJhbSB3cmFwcwotICAgICAqICAgICAgICAgICAgdGhlIHdyYXAgaW5kaWNpZXMgZnJvbSB0aGUgY29vbCBiYXIgd2lkZ2V0Ci0gICAgICogQHJldHVybiB0aGUgYWRqdXN0ZWQgd3JhcCBpbmRpY2llcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludFtdIGdldEFkanVzdGVkV3JhcEluZGljZXMoaW50W10gd3JhcHMpIHsKLSAgICAgICAgaW50W10gYWRqdXN0ZWRXcmFwSW5kaWNlczsKLSAgICAgICAgaWYgKHdyYXBzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICBhZGp1c3RlZFdyYXBJbmRpY2VzID0gbmV3IGludFtdIHsgMCB9OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHdyYXBzWzBdICE9IDApIHsKLSAgICAgICAgICAgICAgICBhZGp1c3RlZFdyYXBJbmRpY2VzID0gbmV3IGludFt3cmFwcy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgICAgICBhZGp1c3RlZFdyYXBJbmRpY2VzWzBdID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyYXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkanVzdGVkV3JhcEluZGljZXNbaSArIDFdID0gd3JhcHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGp1c3RlZFdyYXBJbmRpY2VzID0gd3JhcHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFkanVzdGVkV3JhcEluZGljZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udHJvbCBvZiB0aGUgTWVudSBNYW5hZ2VyLiBJZiB0aGUgbWVudSBtYW5hZ2VyIGRvZXMgbm90Ci0gICAgICogaGF2ZSBhIGNvbnRyb2wgdGhlbiBvbmUgaXMgY3JlYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG1lbnUgY29udHJvbCBhc3NvY2lhdGVkIHdpdGggbWFuYWdlciwgb3IgbnVsbCBpZiBub25lCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZW51IGdldENvbnRleHRNZW51Q29udHJvbCgpIHsKLSAgICAgICAgaWYgKChjb250ZXh0TWVudU1hbmFnZXIgIT0gbnVsbCkgJiYgKGNvb2xCYXIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIE1lbnUgbWVudVdpZGdldCA9IGNvbnRleHRNZW51TWFuYWdlci5nZXRNZW51KCk7Ci0gICAgICAgICAgICBpZiAoKG1lbnVXaWRnZXQgPT0gbnVsbCkgfHwgKG1lbnVXaWRnZXQuaXNEaXNwb3NlZCgpKSkgewotICAgICAgICAgICAgICAgIG1lbnVXaWRnZXQgPSBjb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoY29vbEJhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWVudVdpZGdldDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29vbEJhck1hbmFnZXIjaXNMYXlvdXRMb2NrZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBJTWVudU1hbmFnZXIgZ2V0Q29udGV4dE1lbnVNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gY29udGV4dE1lbnVNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvb2wgYmFyIGNvbnRyb2wgZm9yIHRoaXMgbWFuYWdlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb29sIGJhciBjb250cm9sLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIENvb2xCYXIgZ2V0Q29udHJvbCgpIHsKLSAgICAgICAgcmV0dXJuIGNvb2xCYXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBsaXN0IG9mIGFsbCB0aGUgY29udHJpYnV0aW9uIGl0ZW1zIGluIHRoZSBtYW5hZ2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgbGlzdCBvZiBjb250cmlidXRpb24gaXRlbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZ2V0SXRlbUxpc3QoKSB7Ci0gICAgICAgIElDb250cmlidXRpb25JdGVtW10gY2JJdGVtcyA9IGdldEl0ZW1zKCk7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChjYkl0ZW1zLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2JJdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbGlzdC5hZGQoY2JJdGVtc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvb2xCYXJNYW5hZ2VyI2lzTGF5b3V0TG9ja2VkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRMb2NrTGF5b3V0KCkgewotICAgICAgICBpZiAoIWNvb2xCYXJFeGlzdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvb2xCYXIuZ2V0TG9ja2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIHZpc3VhbGx5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpdGVtcwotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbnRyaWJ1dGluIGl0ZW1zCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXROdW1Sb3dzKElDb250cmlidXRpb25JdGVtW10gaXRlbXMpIHsKLSAgICAgICAgaW50IG51bVJvd3MgPSAxOwotICAgICAgICBib29sZWFuIHNlcGFyYXRvckZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtc1tpXS5pc1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgc2VwYXJhdG9yRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChzZXBhcmF0b3JGb3VuZCkgJiYgKGl0ZW1zW2ldLmlzVmlzaWJsZSgpKQotICAgICAgICAgICAgICAgICAgICAmJiAoIWl0ZW1zW2ldLmlzR3JvdXBNYXJrZXIoKSkgJiYgKCFpdGVtc1tpXS5pc1NlcGFyYXRvcigpKSkgewotICAgICAgICAgICAgICAgIG51bVJvd3MrKzsKLSAgICAgICAgICAgICAgICBzZXBhcmF0b3JGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudW1Sb3dzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb29sQmFyTWFuYWdlciNnZXRTdHlsZSgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTdHlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZW1TdHlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyA8Y29kZT5Db250cmlidXRpb25NYW5hZ2VyPC9jb2RlPiBtZXRob2QsCi0gICAgICogYnV0IG11c3QgY2FsbCA8Y29kZT5zdXBlci5pdGVtQWRkZWQ8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbk1hbmFnZXIjaXRlbUFkZGVkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpdGVtQWRkZWQoSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGl0ZW0pOwotICAgICAgICBzdXBlci5pdGVtQWRkZWQoaXRlbSk7Ci0gICAgICAgIGludCBpbnNlcnRlZEF0ID0gaW5kZXhPZihpdGVtKTsKLSAgICAgICAgYm9vbGVhbiByZXBsYWNlZCA9IGZhbHNlOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGNiSXRlbXNDcmVhdGlvbk9yZGVyLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGNyZWF0ZWQgPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGNiSXRlbXNDcmVhdGlvbk9yZGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoY3JlYXRlZC5nZXRJZCgpICE9IG51bGwgJiYgY3JlYXRlZC5nZXRJZCgpLmVxdWFscyhpdGVtLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgY2JJdGVtc0NyZWF0aW9uT3JkZXIuc2V0KGksIGl0ZW0pOwotICAgICAgICAgICAgICAgIHJlcGxhY2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcmVwbGFjZWQpIHsKLSAgICAgICAgICAgIGNiSXRlbXNDcmVhdGlvbk9yZGVyLmFkZChNYXRoLm1pbihNYXRoLm1heChpbnNlcnRlZEF0LCAwKSwKLSAgICAgICAgICAgICAgICAgICAgY2JJdGVtc0NyZWF0aW9uT3JkZXIuc2l6ZSgpKSwgaXRlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyA8Y29kZT5Db250cmlidXRpb25NYW5hZ2VyPC9jb2RlPiBtZXRob2QsCi0gICAgICogYnV0IG11c3QgY2FsbCA8Y29kZT5zdXBlci5pdGVtUmVtb3ZlZDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uTWFuYWdlciNpdGVtUmVtb3ZlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0pCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaXRlbVJlbW92ZWQoSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGl0ZW0pOwotICAgICAgICBzdXBlci5pdGVtUmVtb3ZlZChpdGVtKTsKLSAgICAgICAgQ29vbEl0ZW0gY29vbEl0ZW0gPSBmaW5kQ29vbEl0ZW0oaXRlbSk7Ci0gICAgICAgIGlmIChjb29sSXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb29sSXRlbS5zZXREYXRhKG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9zaXRpb25zIHRoZSBsaXN0IGl0ZXJhdG9yIHRvIHRoZSBzdGFydGluZyBvZiB0aGUgbmV4dCByb3cuIEJ5IGNhbGxpbmcKLSAgICAgKiBuZXh0IG9uIHRoZSByZXR1cm5lZCBpdGVyYXRvciwgaXQgd2lsbCByZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlCi0gICAgICogbmV4dCByb3cuCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yCi0gICAgICogICAgICAgICAgICB0aGUgbGlzdCBpdGVyYXRvciBvZiBjb250cmlidXRpb24gaXRlbXMKLSAgICAgKiBAcGFyYW0gaWdub3JlQ3VycmVudEl0ZW0KLSAgICAgKiAgICAgICAgICAgIFdoZXRoZXIgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0b3Igc2hvdWxkIGJlIGNvbnNpZGVyZWQKLSAgICAgKiAgICAgICAgICAgIChhcyB3ZWxsIGFzIHN1YnNlcXVlbnQgaXRlbXMpLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBuZXh0Um93KExpc3RJdGVyYXRvciBpdGVyYXRvciwgYm9vbGVhbiBpZ25vcmVDdXJyZW50SXRlbSkgewotCi0gICAgICAgIElDb250cmlidXRpb25JdGVtIGN1cnJlbnRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKCFpZ25vcmVDdXJyZW50SXRlbSAmJiBpdGVyYXRvci5oYXNQcmV2aW91cygpKSB7Ci0gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IChJQ29udHJpYnV0aW9uSXRlbSkgaXRlcmF0b3IucHJldmlvdXMoKTsKLSAgICAgICAgICAgIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgJiYgKGN1cnJlbnRFbGVtZW50LmlzU2VwYXJhdG9yKCkpKSB7Ci0gICAgICAgICAgICBjb2xsYXBzZVNlcGFyYXRvcnMoaXRlcmF0b3IpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IAotCi0gICAgICAgIC8vRmluZCBuZXh0IHNlcGFyYXRvcgotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gKElDb250cmlidXRpb25JdGVtKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoaXRlbS5pc1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2Ugd2UgZmluZCBhIHNlcGFyYXRvciwgY29sbGFwc2UgYW55IGNvbnNlY3V0aXZlCi0gICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9ycwotICAgICAgICAgICAgICAgIC8vIGFuZCByZXR1cm4KLSAgICAgICAgICAgICAgICBjb2xsYXBzZVNlcGFyYXRvcnMoaXRlcmF0b3IpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogVXNlZCBmb3IgZGVidWdpbmcuIFByaW50cyBhbGwgdGhlIGl0ZW1zIGluIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzLgotICAgICAqLwotICAgIC8vICAgIHByaXZhdGUgdm9pZCBwcmludENvbnRyaWJ1dGlvbnMoQXJyYXlMaXN0IGNvbnRyaWJ1dGlvbkxpc3QpIHsKLSAgICAvLyAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIC8vICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb250cmlidXRpb25MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBpbmRleCsrKSB7Ci0gICAgLy8gICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gKElDb250cmlidXRpb25JdGVtKSBpLm5leHQoKTsKLSAgICAvLyAgICAgICAgICAgIGlmIChpdGVtLmlzU2VwYXJhdG9yKCkpIHsKLSAgICAvLyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0gICAgLy8gICAgICAgICAgICB9IGVsc2UgewotICAgIC8vICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbmRleCArICIuIEl0ZW0gaWQ6ICIgKyBpdGVtLmdldElkKCkgLy8kTk9OLU5MUy0xJAotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0gaXMgVmlzaWJsZTogIiAvLyROT04tTkxTLTEkCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICArIGl0ZW0uaXNWaXNpYmxlKCkpOwotICAgIC8vICAgICAgICAgICAgfQotICAgIC8vICAgICAgICB9Ci0gICAgLy8gICAgfQotICAgIC8qKgotICAgICAqIFN5bmNocm9uaXplcyB0aGUgdmlzdWFsIG9yZGVyIG9mIHRoZSBjb29sIGl0ZW1zIGluIHRoZSBjb250cm9sIHdpdGggdGhpcwotICAgICAqIG1hbmFnZXIncyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCi0gICAgICogcmVxdWVzdGluZyB0aGUgb3JkZXIgb2YgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtcyB0byBlbnN1cmUgdGhhdCB0aGUgb3JkZXIKLSAgICAgKiBpcyBhY2N1cmF0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgPGNvZGU+dXBkYXRlKCk8L2NvZGU+IGFuZCA8Y29kZT5yZWZyZXNoKCk8L2NvZGU+IGFyZQotICAgICAqIGNvbnZlcnNlczogPGNvZGU+dXBkYXRlKCk8L2NvZGU+IGNoYW5nZXMgdGhlIHZpc3VhbCBvcmRlciB0byBtYXRjaCB0aGUKLSAgICAgKiBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBhbmQgPGNvZGU+cmVmcmVzaDwvY29kZT4gY2hhbmdlcyB0aGUgaW50ZXJuYWwKLSAgICAgKiBzdHJ1Y3R1cmVzIHRvIG1hdGNoIHRoZSB2aXN1YWwgb3JkZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIGlmICghY29vbEJhckV4aXN0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJldHJlaXZlcyB0aGUgbGlzdCBvZiBjb250cmlidXRpb24gaXRlbXMgYXMgYW4gYXJyYXkgbGlzdAotICAgICAgICBBcnJheUxpc3QgY29udHJpYnV0aW9uTGlzdCA9IGdldEl0ZW1MaXN0KCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGxpc3QKLSAgICAgICAgaWYgKGNvbnRyaWJ1dGlvbkxpc3Quc2l6ZSgpID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gVGhlIGxpc3Qgb2YgYWxsIHRoZSBjb29sIGl0ZW1zIGluIHRoZWlyIHZpc3VhbCBvcmRlcgotICAgICAgICBDb29sSXRlbVtdIGNvb2xJdGVtcyA9IGNvb2xCYXIuZ2V0SXRlbXMoKTsKLSAgICAgICAgLy8gVGhlIHdyYXAgaW5kaWNpZXMgb2YgdGhlIGNvb2xiYXIKLSAgICAgICAgaW50W10gd3JhcEluZGljaWVzID0gZ2V0QWRqdXN0ZWRXcmFwSW5kaWNlcyhjb29sQmFyLmdldFdyYXBJbmRpY2VzKCkpOwotCi0gICAgICAgIGludCByb3cgPSAwOwotICAgICAgICBpbnQgY29vbEl0ZW1JbmRleCA9IDA7Ci0KLSAgICAgICAgLy8gVHJhdmVyc2UgdGhyb3VnaCBhbGwgY29vbCBpdGVtcyBpbiB0aGUgY29vbGJhciBhZGQgdGhlbSB0byBhIG5ldwotICAgICAgICAvLyBkYXRhIHN0cnVjdHVyZQotICAgICAgICAvLyBpbiB0aGUgY29ycmVjdCBvcmRlcgotICAgICAgICBBcnJheUxpc3QgZGlzcGxheWVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KGNvb2xCYXIuZ2V0SXRlbUNvdW50KCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2xJdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ29vbEl0ZW0gY29vbEl0ZW0gPSBjb29sSXRlbXNbaV07Ci0gICAgICAgICAgICBpZiAoY29vbEl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgSUNvbnRyaWJ1dGlvbkl0ZW0pIHsKLSAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBjYkl0ZW0gPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGNvb2xJdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGRpc3BsYXllZEl0ZW1zLmFkZChNYXRoLm1pbihpLCBkaXNwbGF5ZWRJdGVtcy5zaXplKCkpLCBjYkl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIHNlcGFyYXRvcnMgdG8gdGhlIGRpc3BsYXllZCBJdGVtcyBkYXRhIHN0cnVjdHVyZQotICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB3cmFwSW5kaWNpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCBpbnNlcnRBdCA9IHdyYXBJbmRpY2llc1tpXSArIG9mZnNldDsKLSAgICAgICAgICAgIGRpc3BsYXllZEl0ZW1zLmFkZChpbnNlcnRBdCwgbmV3IFNlcGFyYXRvcihVU0VSX1NFUEFSQVRPUikpOwotICAgICAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggcm93cyBhcmUgaW52aXNpYmxlCi0gICAgICAgIEFycmF5TGlzdCBleGlzdGluZ1Zpc2libGVSb3dzID0gbmV3IEFycmF5TGlzdCg0KTsKLSAgICAgICAgTGlzdEl0ZXJhdG9yIHJvd0l0ZXJhdG9yID0gY29udHJpYnV0aW9uTGlzdC5saXN0SXRlcmF0b3IoKTsKLSAgICAgICAgY29sbGFwc2VTZXBhcmF0b3JzKHJvd0l0ZXJhdG9yKTsKLSAgICAgICAgaW50IG51bVJvdyA9IDA7Ci0gICAgICAgIHdoaWxlIChyb3dJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIFNjYW4gcm93Ci0gICAgICAgICAgICB3aGlsZSAocm93SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gY2JJdGVtID0gKElDb250cmlidXRpb25JdGVtKSByb3dJdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGlzcGxheWVkSXRlbXMuY29udGFpbnMoY2JJdGVtKSkgewotICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Zpc2libGVSb3dzLmFkZChuZXcgSW50ZWdlcihudW1Sb3cpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjYkl0ZW0uaXNTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0Um93KHJvd0l0ZXJhdG9yLCBmYWxzZSk7Ci0gICAgICAgICAgICBudW1Sb3crKzsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIGV4aXN0aW5nUm93cyA9IGV4aXN0aW5nVmlzaWJsZVJvd3MuaXRlcmF0b3IoKTsKLSAgICAgICAgLy8gQWRqdXN0IHJvdyBudW1iZXIgdG8gdGhlIGZpcnN0IHZpc2libGUKLSAgICAgICAgaWYgKGV4aXN0aW5nUm93cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHJvdyA9ICgoSW50ZWdlcikgZXhpc3RpbmdSb3dzLm5leHQoKSkuaW50VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEhhc2hNYXAgaXRlbUxvY2F0aW9uID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChMaXN0SXRlcmF0b3IgbG9jYXRpb25JdGVyYXRvciA9IGRpc3BsYXllZEl0ZW1zLmxpc3RJdGVyYXRvcigpOyBsb2NhdGlvbkl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGxvY2F0aW9uSXRlcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChpdGVtLmlzU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdSb3dzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gKEludGVnZXIpIGV4aXN0aW5nUm93cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJvdyA9IHZhbHVlLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcm93Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpdGVtTG9jYXRpb24ucHV0KGl0ZW0sIG5ldyBJbnRlZ2VyKHJvdykpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvLyBJbnNlcnQgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtcyBpbiB0aGVpciBjb3JyZWN0IGxvY2F0aW9uCi0gICAgICAgIGZvciAoTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGlzcGxheWVkSXRlbXMubGlzdEl0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGNiSXRlbSA9IChJQ29udHJpYnV0aW9uSXRlbSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKGNiSXRlbS5pc1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgY29vbEl0ZW1JbmRleCA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlbG9jYXRlKGNiSXRlbSwgY29vbEl0ZW1JbmRleCwgY29udHJpYnV0aW9uTGlzdCwgaXRlbUxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBjYkl0ZW0uc2F2ZVdpZGdldFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgY29vbEl0ZW1JbmRleCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRyaWJ1dGlvbkxpc3Quc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIGNvbnRyaWJ1dGlvbkxpc3QgPSBhZGp1c3RDb250cmlidXRpb25MaXN0KGNvbnRyaWJ1dGlvbkxpc3QpOwotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBhcnJheSA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVtjb250cmlidXRpb25MaXN0Ci0gICAgICAgICAgICAgICAgICAgIC5zaXplKCkgLSAxXTsKLSAgICAgICAgICAgIGFycmF5ID0gKElDb250cmlidXRpb25JdGVtW10pIGNvbnRyaWJ1dGlvbkxpc3QudG9BcnJheShhcnJheSk7Ci0gICAgICAgICAgICBpbnRlcm5hbFNldEl0ZW1zKGFycmF5KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsb2NhdGVzIHRoZSBnaXZlbiBjb250cmlidXRpb24gaXRlbSB0byB0aGUgc3BlY2lmaWVkIGluZGV4LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYkl0ZW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb25yaWJ1dGlvbiBpdGVtIHRvIHJlbG9jYXRlCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggdG8gbG9jYXRlIHRoaXMgaXRlbQotICAgICAqIEBwYXJhbSBjb250cmlidXRpb25MaXN0Ci0gICAgICogICAgICAgICAgICB0aGUgY3VycmVudCBsaXN0IG9mIGNvbnJ0cmlidXRpb25zCi0gICAgICogQHBhcmFtIGl0ZW1Mb2NhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWxvY2F0ZShJQ29udHJpYnV0aW9uSXRlbSBjYkl0ZW0sIGludCBpbmRleCwKLSAgICAgICAgICAgIEFycmF5TGlzdCBjb250cmlidXRpb25MaXN0LCBIYXNoTWFwIGl0ZW1Mb2NhdGlvbikgewotCi0gICAgICAgIGlmICghKGl0ZW1Mb2NhdGlvbi5nZXQoY2JJdGVtKSBpbnN0YW5jZW9mIEludGVnZXIpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpbnQgdGFyZ2V0Um93ID0gKChJbnRlZ2VyKSBpdGVtTG9jYXRpb24uZ2V0KGNiSXRlbSkpLmludFZhbHVlKCk7Ci0KLSAgICAgICAgaW50IGNiSW50ZXJuYWxJbmRleCA9IGNvbnRyaWJ1dGlvbkxpc3QuaW5kZXhPZihjYkl0ZW0pOwotCi0gICAgICAgIC8vCWJ5IGRlZmF1bHQgYWRkIHRvIGVuZCBvZiBsaXN0Ci0gICAgICAgIGludCBpbnNlcnRBdCA9IGNvbnRyaWJ1dGlvbkxpc3Quc2l6ZSgpOwotICAgICAgICAvLyBGaW5kIHRoZSByb3cgdG8gcGxhY2UgdGhpcyBpdGVtIGluLgotICAgICAgICBMaXN0SXRlcmF0b3IgaXRlcmF0b3IgPSBjb250cmlidXRpb25MaXN0Lmxpc3RJdGVyYXRvcigpOwotICAgICAgICAvLyBieXBhc3MgYW55IHNlcGFyYXRvcnMgYXQgdGhlIGJlZ2luaW5nCi0gICAgICAgIGNvbGxhcHNlU2VwYXJhdG9ycyhpdGVyYXRvcik7Ci0gICAgICAgIGludCBjdXJyZW50Um93ID0gLTE7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQotICAgICAgICAgICAgY3VycmVudFJvdysrOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cgPT0gdGFyZ2V0Um93KSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgdGhlIHJvdyB0byBpbnNlcnQgdGhlIGl0ZW0KLSAgICAgICAgICAgICAgICBpbnQgdmlydHVhbEluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBpbnNlcnRBdCA9IGl0ZXJhdG9yLm5leHRJbmRleCgpOwotICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNoZWNrIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBlbGVtZW50IChpdGVtKQotICAgICAgICAgICAgICAgIC8vIHRoZW4gZ2V0IHRoZSBuZXh0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBpdGVtUm93ID0gKEludGVnZXIpIGl0ZW1Mb2NhdGlvbi5nZXQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzU2VwYXJhdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGl0ZW0gaGFzIGFuIGFzc29jaWF0ZSB3aWRnZXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKChpdGVtUm93ICE9IG51bGwpICYmIChpdGVtUm93LmludFZhbHVlKCkgPT0gdGFyZ2V0Um93KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIG5leHQgZWxlbWVudCBpcyB0aGUgaW5kZXggd2UgYXJlIGxvb2tpbmcgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlydHVhbEluZGV4ID49IGluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbEluZGV4Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnNlcnRBdCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBuZWVkIHRvIG1vdmUgaXQgdGhlbiB3ZSByZXR1cm4KLSAgICAgICAgICAgICAgICBpZiAoY2JJbnRlcm5hbEluZGV4ID09IGluc2VydEF0KQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0Um93KGl0ZXJhdG9yLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBjb250cmlidXRpb25MaXN0LnJlbW92ZShjYkl0ZW0pOwotCi0gICAgICAgIC8vIEFkanVzdCBpbnNlcnRBdCBpbmRleAotICAgICAgICBpZiAoY2JJbnRlcm5hbEluZGV4IDwgaW5zZXJ0QXQpIHsKLSAgICAgICAgICAgIGluc2VydEF0LS07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCB0aGUgcm93IHRoZW4gYWRkIGEgbmV3IHJvdwotICAgICAgICBpZiAoY3VycmVudFJvdyAhPSB0YXJnZXRSb3cpIHsKLSAgICAgICAgICAgIGNvbnRyaWJ1dGlvbkxpc3QuYWRkKG5ldyBTZXBhcmF0b3IoVVNFUl9TRVBBUkFUT1IpKTsKLSAgICAgICAgICAgIGluc2VydEF0ID0gY29udHJpYnV0aW9uTGlzdC5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5zZXJ0QXQgPSBNYXRoLm1pbihpbnNlcnRBdCwgY29udHJpYnV0aW9uTGlzdC5zaXplKCkpOwotICAgICAgICBjb250cmlidXRpb25MaXN0LmFkZChpbnNlcnRBdCwgY2JJdGVtKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmVzIHRoZSBjYW5vbmljYWwgb3JkZXIgb2YgdGhpcyBjb29sIGJhciBtYW5hZ2VyLiBUaGUgY2Fub25pY2FsCi0gICAgICogb3JkZXIgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjb250cmlidXRpb24gaXRlbXMgd2hlcmUgYWRkZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRJdGVtT3JkZXIoKSB7Ci0gICAgICAgIGZvciAoTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2JJdGVtc0NyZWF0aW9uT3JkZXIubGlzdEl0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIC8vIGlmIGl0cyBhIHVzZXIgc2VwYXJhdG9yIHRoZW4gZG8gbm90IGluY2x1ZGUgaW4gb3JpZ2luYWwgb3JkZXIuCi0gICAgICAgICAgICBpZiAoKGl0ZW0uZ2V0SWQoKSAhPSBudWxsKSAmJiAoaXRlbS5nZXRJZCgpLmVxdWFscyhVU0VSX1NFUEFSQVRPUikpKSB7Ci0gICAgICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtc1RvU2V0ID0gbmV3IElDb250cmlidXRpb25JdGVtW2NiSXRlbXNDcmVhdGlvbk9yZGVyCi0gICAgICAgICAgICAgICAgLnNpemUoKV07Ci0gICAgICAgIGNiSXRlbXNDcmVhdGlvbk9yZGVyLnRvQXJyYXkoaXRlbXNUb1NldCk7Ci0gICAgICAgIHNldEl0ZW1zKGl0ZW1zVG9TZXQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb29sQmFyTWFuYWdlciNzZXRDb250ZXh0TWVudU1hbmFnZXIob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0TWVudU1hbmFnZXIoSU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51TWFuYWdlcikgewotICAgICAgICB0aGlzLmNvbnRleHRNZW51TWFuYWdlciA9IChNZW51TWFuYWdlcikgY29udGV4dE1lbnVNYW5hZ2VyOwotICAgICAgICBpZiAoY29vbEJhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb29sQmFyLnNldE1lbnUoZ2V0Q29udGV4dE1lbnVDb250cm9sKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgaXRlbXMgd2l0aCB0aGUgZ2l2ZW4gaXRlbXMuCi0gICAgICogRm9yY2VzIGFuIHVwZGF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3SXRlbXMgdGhlIGl0ZW1zIHdpdGggd2hpY2ggdG8gcmVwbGFjZSB0aGUgY3VycmVudCBpdGVtcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1zKElDb250cmlidXRpb25JdGVtW10gbmV3SXRlbXMpIHsKLSAgICAgICAgLy8gZGlzcG9zZSBvZiBhbGwgdGhlIGNvb2wgaXRlbXMgb24gdGhlIGNvb2wgYmFyIG1hbmFnZXIKLSAgICAgICAgaWYgKGNvb2xCYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQ29vbEl0ZW1bXSBjb29sSXRlbXMgPSBjb29sQmFyLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2xJdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGRpc3Bvc2UoY29vbEl0ZW1zW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBTZXQgdGhlIGludGVybmFsIHN0cnVjdHVyZSB0byB0aGlzIG9yZGVyCi0gICAgICAgIGludGVybmFsU2V0SXRlbXMobmV3SXRlbXMpOwotICAgICAgICAvLyBGb3JjZSBhbmQgdXBkYXRlCi0gICAgICAgIHVwZGF0ZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29vbEJhck1hbmFnZXIjbG9ja0xheW91dChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2tMYXlvdXQoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBpZiAoIWNvb2xCYXJFeGlzdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29vbEJhci5zZXRMb2NrZWQodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIDxjb2RlPklDb250cmlidXRpb25NYW5hZ2VyPC9jb2RlPiBtZXRob2QsCi0gICAgICogYnV0IG11c3QgY2FsbCA8Y29kZT5zdXBlci51cGRhdGU8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyI3VwZGF0ZShib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIGlmICgoIWlzRGlydHkoKSAmJiAhZm9yY2UpIHx8ICghY29vbEJhckV4aXN0KCkpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHJlbG9jayA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29vbEJhci5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSB3aWRnZXQgZGF0YSB3aXRoIHRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZS4KLSAgICAgICAgICAgIHJlZnJlc2goKTsKLQotICAgICAgICAgICAgaWYgKGNvb2xCYXIuZ2V0TG9ja2VkKCkpIHsKLSAgICAgICAgICAgICAgICBjb29sQmFyLnNldExvY2tlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmVsb2NrID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIE1ha2UgYSBsaXN0IG9mIGl0ZW1zIGluY2x1ZGluZyBvbmx5IHRob3NlIGl0ZW1zIHRoYXQgYXJlCi0gICAgICAgICAgICAgKiB2aXNpYmxlLiBTZXBhcmF0b3JzIHNob3VsZCBzdGF5IGJlY2F1c2UgdGhleSBtYXJrIGxpbmUgYnJlYWtzIGluCi0gICAgICAgICAgICAgKiBhIGNvb2wgYmFyLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmaW5hbCBJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgIGZpbmFsIExpc3QgdmlzaWJsZUl0ZW1zID0gbmV3IEFycmF5TGlzdChpdGVtcy5sZW5ndGgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc1Zpc2libGUoKSkgewotICAgICAgICAgICAgICAgICAgICB2aXNpYmxlSXRlbXMuYWRkKGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIE1ha2UgYSBsaXN0IG9mIENvb2xJdGVtIHdpZGdldHMgaW4gdGhlIGNvb2wgYmFyIGZvciB3aGljaCB0aGVyZQotICAgICAgICAgICAgICogaXMgbm8gY3VycmVudCB2aXNpYmxlIGNvbnRyaWJ1dGlvbiBpdGVtLiBUaGVzZSBhcmUgdGhlIHdpZGdldHMKLSAgICAgICAgICAgICAqIHRvIGJlIGRpc3Bvc2VkLiBEeW5hbWljIGl0ZW1zIGFyZSBhbHNvIHJlbW92ZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvb2xJdGVtW10gY29vbEl0ZW1zID0gY29vbEJhci5nZXRJdGVtcygpOwotICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0IGNvb2xJdGVtc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdChjb29sSXRlbXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29vbEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGRhdGEgPSBjb29sSXRlbXNbaV0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICgoZGF0YSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCF2aXNpYmxlSXRlbXMuY29udGFpbnMoZGF0YSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGRhdGEgaW5zdGFuY2VvZiBJQ29udHJpYnV0aW9uSXRlbSkgJiYgKChJQ29udHJpYnV0aW9uSXRlbSkgZGF0YSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzRHluYW1pYygpKSkgewotICAgICAgICAgICAgICAgICAgICBjb29sSXRlbXNUb1JlbW92ZS5hZGQoY29vbEl0ZW1zW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERpc3Bvc2Ugb2YgYW55IGl0ZW1zIGluIHRoZSBsaXN0IHRvIGJlIHJlbW92ZWQuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gY29vbEl0ZW1zVG9SZW1vdmUuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBDb29sSXRlbSBjb29sSXRlbSA9IChDb29sSXRlbSkgY29vbEl0ZW1zVG9SZW1vdmUuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICghY29vbEl0ZW0uaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCA9IGNvb2xJdGVtLmdldENvbnRyb2woKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29vbEl0ZW0uc2V0Q29udHJvbChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvb2xJdGVtLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBhbnkgbmV3IGl0ZW1zIGJ5IHRlbGxpbmcgdGhlbSB0byBmaWxsLgotICAgICAgICAgICAgY29vbEl0ZW1zID0gY29vbEJhci5nZXRJdGVtcygpOwotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gc291cmNlSXRlbTsKLSAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGRlc3RpbmF0aW9uSXRlbTsKLSAgICAgICAgICAgIGludCBzb3VyY2VJbmRleCA9IDA7Ci0gICAgICAgICAgICBpbnQgZGVzdGluYXRpb25JbmRleCA9IDA7Ci0gICAgICAgICAgICBmaW5hbCBJdGVyYXRvciB2aXNpYmxlSXRlbUl0ciA9IHZpc2libGVJdGVtcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKHZpc2libGVJdGVtSXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHNvdXJjZUl0ZW0gPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIHZpc2libGVJdGVtSXRyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRyaWJ1dGlvbiBpdGVtIGZyb20gU1dUJ3MKLSAgICAgICAgICAgICAgICAvLyBkYXRhLgotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IGNvb2xJdGVtcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25JdGVtID0gKElDb250cmlidXRpb25JdGVtKSBjb29sSXRlbXNbc291cmNlSW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkl0ZW0gPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRoZSBpdGVtcyBtYXRjaCBpcyB0aGV5IGFyZSBlcXVhbCBvciBib3RoIHNlcGFyYXRvcnMuCi0gICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uSXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJdGVtLmVxdWFscyhkZXN0aW5hdGlvbkl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25JbmRleCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlSXRlbS51cGRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGRlc3RpbmF0aW9uSXRlbS5pc1NlcGFyYXRvcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChzb3VyY2VJdGVtLmlzU2VwYXJhdG9yKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb29sSXRlbXNbc291cmNlSW5kZXhdLnNldERhdGEoc291cmNlSXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25JbmRleCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlSXRlbS51cGRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGEgbmV3IGl0ZW0gaGFzIHRvIGJlIGFkZGVkLgotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdGFydCA9IGNvb2xCYXIuZ2V0SXRlbUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgc291cmNlSXRlbS5maWxsKGNvb2xCYXIsIGRlc3RpbmF0aW9uSW5kZXgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBuZXdJdGVtcyA9IGNvb2xCYXIuZ2V0SXRlbUNvdW50KCkgLSBzdGFydDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld0l0ZW1zOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY29vbEJhci5nZXRJdGVtKGRlc3RpbmF0aW9uSW5kZXgrKykuc2V0RGF0YShzb3VyY2VJdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgb2xkIHdpZGdldHMgbm90IGFjY291bnRlZCBmb3IuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gY29vbEl0ZW1zLmxlbmd0aCAtIDE7IGkgPj0gc291cmNlSW5kZXg7IGktLSkgewotICAgICAgICAgICAgICAgIGZpbmFsIENvb2xJdGVtIGl0ZW0gPSBjb29sSXRlbXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKCFpdGVtLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBpdGVtLmdldENvbnRyb2woKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRDb250cm9sKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaXRlbS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIHdyYXAgaW5kaWNlcy4KLSAgICAgICAgICAgIHVwZGF0ZVdyYXBJbmRpY2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2l6ZXMuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgICAgIGl0ZW0udXBkYXRlKFNJWkUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpZiB0aGUgY29vbEJhciB3YXMgcHJldmlvdXNseSBsb2NrZWQgdGhlbiBsb2NrIGl0Ci0gICAgICAgICAgICBpZiAocmVsb2NrKSB7Ci0gICAgICAgICAgICAgICAgY29vbEJhci5zZXRMb2NrZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVGFiT3JkZXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2UgYXJlIG5vIGxvbmdlciBkaXJ0eS4KLSAgICAgICAgICAgIHNldERpcnR5KGZhbHNlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNvb2xCYXIuc2V0UmVkcmF3KHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGFiIG9yZGVyIG9mIHRoZSBjb29sYmFyIHRvIHRoZSB2aXN1YWwgb3JkZXIgb2YgaXRzIGl0ZW1zLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi92b2lkIHVwZGF0ZVRhYk9yZGVyKCkgewotICAgICAgICBpZiAoY29vbEJhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDb29sSXRlbVtdIGl0ZW1zID0gY29vbEJhci5nZXRJdGVtcygpOwotICAgICAgICAgICAgaWYgKGl0ZW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGl0ZW1zLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGl0ZW1zW2ldLmdldENvbnRyb2woKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghaXRlbXNbaV0uZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChpdGVtc1tpXS5nZXRDb250cm9sKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgYXJyYXkKLSAgICAgICAgICAgICAgICBDb250cm9sW10gY2hpbGRyZW5BcnJheSA9IG5ldyBDb250cm9sWzBdOwotICAgICAgICAgICAgICAgIGNoaWxkcmVuQXJyYXkgPSAoQ29udHJvbFtdKSBjaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuQXJyYXkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuQXJyYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb29sQmFyLnNldFRhYkxpc3QoY2hpbGRyZW5BcnJheSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBpbmRpY2VzIGF0IHdoaWNoIHRoZSBjb29sIGJhciBzaG91bGQgd3JhcC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlV3JhcEluZGljZXMoKSB7Ci0gICAgICAgIGZpbmFsIElDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBnZXRJdGVtcygpOwotICAgICAgICBmaW5hbCBpbnQgbnVtUm93cyA9IGdldE51bVJvd3MoaXRlbXMpIC0gMTsKLQotICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgbGlzdCBvZiB3cmFwIGluZGljZXMuCi0gICAgICAgIGZpbmFsIGludFtdIHdyYXBJbmRpY2VzID0gbmV3IGludFtudW1Sb3dzXTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZFNlcGFyYXRvciA9IGZhbHNlOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIENvb2xJdGVtW10gY29vbEl0ZW1zID0gKGNvb2xCYXIgPT0gbnVsbCkgPyBudWxsIDogY29vbEJhci5nZXRJdGVtcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgIENvb2xJdGVtIGNvb2xJdGVtID0gZmluZENvb2xJdGVtKGNvb2xJdGVtcywgaXRlbSk7Ci0gICAgICAgICAgICBpZiAoaXRlbS5pc1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmRTZXBhcmF0b3IgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCghaXRlbS5pc1NlcGFyYXRvcigpKSAmJiAoIWl0ZW0uaXNHcm91cE1hcmtlcigpKQotICAgICAgICAgICAgICAgICAgICAmJiAoaXRlbS5pc1Zpc2libGUoKSkgJiYgKGNvb2xJdGVtICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICYmIChmb3VuZFNlcGFyYXRvcikpIHsKLSAgICAgICAgICAgICAgICB3cmFwSW5kaWNlc1tqXSA9IGNvb2xCYXIuaW5kZXhPZihjb29sSXRlbSk7Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgIGZvdW5kU2VwYXJhdG9yID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlc2UgbmV3IHdyYXAgaW5kaWNlcyBhcmUgZGlmZmVyZW50IHRoYW4gdGhlIG9sZAotICAgICAgICAgKiBvbmVzLgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgaW50W10gb2xkSW5kaWNlcyA9IGNvb2xCYXIuZ2V0V3JhcEluZGljZXMoKTsKLSAgICAgICAgYm9vbGVhbiBzaG91bGRVcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKG9sZEluZGljZXMubGVuZ3RoID09IHdyYXBJbmRpY2VzLmxlbmd0aCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRJbmRpY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZEluZGljZXNbaV0gIT0gd3JhcEluZGljZXNbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzaG91bGRVcGRhdGUpIHsKLSAgICAgICAgICAgIGNvb2xCYXIuc2V0V3JhcEluZGljZXMod3JhcEluZGljZXMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0V4dGVybmFsQWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0V4dGVybmFsQWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWQwYjI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9FeHRlcm5hbEFjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZ01hbmFnZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5JQmluZGluZ01hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuU1dUS2V5U3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlV0aWw7Ci0KLS8qKgotICogPHA+Ci0gKiBBIG1hbmFnZXIgZm9yIGEgY2FsbGJhY2sgZmFjaWxpdHkgd2hpY2ggaXMgY2FwYWJsZSBvZiBxdWVyeWluZyBleHRlcm5hbAotICogaW50ZXJmYWNlcyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhY3Rpb25zIGFuZCBhY3Rpb24gY29udHJpYnV0aW9uCi0gKiBpdGVtcy4gVGhpcyBpbmZvcm1hdGlvbiB0eXBpY2FsbHkgaW5jbHVkZXMgdGhpbmdzIGxpa2UgYWNjZWxlcmF0b3JzIGFuZAotICogdGV4dHVhbCByZXByZXNlbnRhdGlvbnMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxlbT5JdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBtZWNoYW5pc20gaWYgeW91IHdpbGwgYmUgdXNpbmcgYSBtaXggb2YKLSAqIGFjdGlvbnMgYW5kIGNvbW1hbmRzLCBhbmQgd2lzaCB0aGUgaW50ZXJhY3Rpb25zIHRvIHdvcmsgcHJvcGVybHkuPC9lbT4KLSAqIDwvcD4KLSAqIDxwPgotICogRm9yIGV4YW1wbGUsIGluIHRoZSBFY2xpcHNlIHdvcmtiZW5jaCwgdGhpcyBtZWNoYW5pc20gaXMgdXNlZCB0byBhbGxvdyB0aGUKLSAqIGNvbW1hbmQgYXJjaGl0ZWN0dXJlIHRvIG92ZXJyaWRlIGNlcnRhaW4gdmFsdWVzIGluIGFjdGlvbiBjb250cmlidXRpb24gaXRlbXMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGNhbGxlZCBvciBleHRlbmRlZCBieSBhbnkgZXh0ZXJuYWwgY2xpZW50cy4KLSAqIFRoaXMgQVBJIGlzIHN0aWxsIHVuZGVyIGZsdXgsIGFuZCBpcyBleHBlY3RlZCB0byBjaGFuZ2UgaW4gMy4xLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHRlcm5hbEFjdGlvbk1hbmFnZXIgewotCi0JLyoqCi0JICogQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPklDYWxsYmFjazwvY29kZT4gbWVjaGFuaXNtIHRoYXQKLQkgKiBzaW1wbHkgdGFrZXMgYSA8Y29kZT5CaW5kaW5nTWFuYWdlcjwvY29kZT4gYW5kIGEKLQkgKiA8Y29kZT5Db21tYW5kTWFuYWdlcjwvY29kZT4uCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29tbWFuZENhbGxiYWNrIGltcGxlbWVudHMKLQkJCUlCaW5kaW5nTWFuYWdlckxpc3RlbmVyLCBJQmluZGluZ01hbmFnZXJDYWxsYmFjayB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBidW5kbGUgZm9yIHRleHQgcHJvZHVjZWQgYnkgdGhpcyBjbGFzcy4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCi0JCQkJLmdldEJ1bmRsZShFeHRlcm5hbEFjdGlvbk1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCQkvKioKLQkJICogVGhlIGNhbGxiYWNrIGNhcGFibGUgb2YgcmVzcG9uZGluZyB0byB3aGV0aGVyIGEgY29tbWFuZCBpcyBhY3RpdmUuCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIElBY3RpdmVDaGVja2VyIGFjdGl2ZUNoZWNrZXI7Ci0KLQkJLyoqCi0JCSAqIFRoZSBiaW5kaW5nIG1hbmFnZXIgZm9yIHlvdXIgYXBwbGljYXRpb24uIE11c3Qgbm90IGJlCi0JCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBCaW5kaW5nTWFuYWdlciBiaW5kaW5nTWFuYWdlcjsKLQotCQkvKioKLQkJICogV2hldGhlciBhIGxpc3RlbmVyIGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBiaW5kaW5nIG1hbmFnZXIgeWV0LgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGJpbmRpbmdNYW5hZ2VyTGlzdGVuZXJBdHRhY2hlZCA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBUaGUgY29tbWFuZCBtYW5hZ2VyIGZvciB5b3VyIGFwcGxpY2F0aW9uLiBNdXN0IG5vdCBiZQotCQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXI7Ci0KLQkJLyoqCi0JCSAqIEEgc2V0IG9mIGFsbCB0aGUgY29tbWFuZCBpZGVudGlmaWVycyB0aGF0IGhhdmUgYmVlbiBsb2dnZWQgYXMgYnJva2VuCi0JCSAqIHNvIGZhci4gRm9yIGVhY2ggb2YgdGhlc2UsIHRoZXJlIHdpbGwgYmUgYSBsaXN0ZW5lciBvbiB0aGUKLQkJICogY29ycmVzcG9uZGluZyBjb21tYW5kLiBJZiB0aGUgY29tbWFuZCBldmVyIGJlY29tZXMgZGVmaW5lZCwgdGhlIGl0ZW0KLQkJICogd2lsbCBiZSByZW1vdmVkIGZyb20gdGhpcyBzZXQgYW5kIHRoZSBsaXN0ZW5lciByZW1vdmVkLiBUaGlzIHZhbHVlCi0JCSAqIG1heSBiZSBlbXB0eSwgYnV0IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBTZXQgbG9nZ2VkQ29tbWFuZElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBsaXN0IG9mIGxpc3RlbmVycyB0aGF0IGhhdmUgcmVnaXN0ZXJlZCBmb3IgcHJvcGVydHkgY2hhbmdlCi0JCSAqIG5vdGlmaWNhdGlvbi4gVGhpcyBpcyBhIG1hcCBvZiBjb21tYW5kIGlkZW50aWZpZXJzICg8Y29kZT5TdHJpbmc8L2NvZGU+KQotCQkgKiB0byBsaXN0ZW5lcnMgKDxjb2RlPklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPC9jb2RlPikuCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIE1hcCByZWdpc3RlcmVkTGlzdGVuZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5Db21tYW5kQ2FsbGJhY2s8L2NvZGU+IHdpdGggdGhlCi0JCSAqIHdvcmtiZW5jaCBpdCBzaG91bGQgYmUgdXNpbmcuIEFsbCBjb21tYW5kcyB3aWxsIGJlIGNvbnNpZGVyZWQgYWN0aXZlLgotCQkgKiAKLQkJICogQHBhcmFtIGJpbmRpbmdNYW5hZ2VyCi0JCSAqICAgICAgICAgICAgVGhlIGJpbmRpbmcgbWFuYWdlciB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIGNhbGxiYWNrOyBtdXN0Ci0JCSAqICAgICAgICAgICAgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCQkgKiBAcGFyYW0gY29tbWFuZE1hbmFnZXIKLQkJICogICAgICAgICAgICBUaGUgY29tbWFuZCBtYW5hZ2VyIHdoaWNoIHdpbGwgcHJvdmlkZSB0aGUgY2FsbGJhY2s7IG11c3QKLQkJICogICAgICAgICAgICBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JCSAqIAotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgQ29tbWFuZENhbGxiYWNrKGZpbmFsIEJpbmRpbmdNYW5hZ2VyIGJpbmRpbmdNYW5hZ2VyLAotCQkJCWZpbmFsIENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyKSB7Ci0JCQl0aGlzKGJpbmRpbmdNYW5hZ2VyLCBjb21tYW5kTWFuYWdlciwgbmV3IElBY3RpdmVDaGVja2VyKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKFN0cmluZyBjb21tYW5kSWQpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPkNvbW1hbmRDYWxsYmFjazwvY29kZT4gd2l0aCB0aGUKLQkJICogd29ya2JlbmNoIGl0IHNob3VsZCBiZSB1c2luZy4KLQkJICogCi0JCSAqIEBwYXJhbSBiaW5kaW5nTWFuYWdlcgotCQkgKiAgICAgICAgICAgIFRoZSBiaW5kaW5nIG1hbmFnZXIgd2hpY2ggd2lsbCBwcm92aWRlIHRoZSBjYWxsYmFjazsgbXVzdAotCQkgKiAgICAgICAgICAgIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICogQHBhcmFtIGNvbW1hbmRNYW5hZ2VyCi0JCSAqICAgICAgICAgICAgVGhlIGNvbW1hbmQgbWFuYWdlciB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIGNhbGxiYWNrOyBtdXN0Ci0JCSAqICAgICAgICAgICAgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCQkgKiBAcGFyYW0gYWN0aXZlQ2hlY2tlcgotCQkgKiAgICAgICAgICAgIFRoZSBjYWxsYmFjayBtZWNoYW5pc20gZm9yIGNoZWNraW5nIHdoZXRoZXIgYSBjb21tYW5kIGlzCi0JCSAqICAgICAgICAgICAgYWN0aXZlOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICogCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyBDb21tYW5kQ2FsbGJhY2soZmluYWwgQmluZGluZ01hbmFnZXIgYmluZGluZ01hbmFnZXIsCi0JCQkJZmluYWwgQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXIsCi0JCQkJZmluYWwgSUFjdGl2ZUNoZWNrZXIgYWN0aXZlQ2hlY2tlcikgewotCQkJaWYgKGJpbmRpbmdNYW5hZ2VyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0JCQkJCQkiVGhlIGNhbGxiYWNrIG5lZWRzIGEgYmluZGluZyBtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKGNvbW1hbmRNYW5hZ2VyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0JCQkJCQkiVGhlIGNhbGxiYWNrIG5lZWRzIGEgY29tbWFuZCBtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKGFjdGl2ZUNoZWNrZXIgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLQkJCQkJCSJUaGUgY2FsbGJhY2sgbmVlZHMgYW4gYWN0aXZlIGNhbGxiYWNrIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJdGhpcy5hY3RpdmVDaGVja2VyID0gYWN0aXZlQ2hlY2tlcjsKLQkJCXRoaXMuYmluZGluZ01hbmFnZXIgPSBiaW5kaW5nTWFuYWdlcjsKLQkJCXRoaXMuY29tbWFuZE1hbmFnZXIgPSBjb21tYW5kTWFuYWdlcjsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5FeHRlcm5hbEFjdGlvbk1hbmFnZXIuSUNhbGxiYWNrI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLAotCQkgKiAgICAgIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIGZpbmFsIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmaW5hbCBTdHJpbmcgY29tbWFuZElkLAotCQkJCWZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlyZWdpc3RlcmVkTGlzdGVuZXJzLnB1dChjb21tYW5kSWQsIGxpc3RlbmVyKTsKLQkJCWlmICghYmluZGluZ01hbmFnZXJMaXN0ZW5lckF0dGFjaGVkKSB7Ci0JCQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZ01hbmFnZXJMaXN0ZW5lcih0aGlzKTsKLQkJCQliaW5kaW5nTWFuYWdlckxpc3RlbmVyQXR0YWNoZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGZpbmFsIHZvaWQgYmluZGluZ01hbmFnZXJDaGFuZ2VkKGZpbmFsIEJpbmRpbmdNYW5hZ2VyRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5pc0FjdGl2ZUJpbmRpbmdzQ2hhbmdlZCgpKSB7Ci0JCQkJZmluYWwgSXRlcmF0b3IgbGlzdGVuZXJJdHIgPSByZWdpc3RlcmVkTGlzdGVuZXJzLmVudHJ5U2V0KCkKLQkJCQkJCS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChsaXN0ZW5lckl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJZmluYWwgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgbGlzdGVuZXJJdHIubmV4dCgpOwotCQkJCQlmaW5hbCBTdHJpbmcgY29tbWFuZElkID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCWZpbmFsIENvbW1hbmQgY29tbWFuZCA9IGNvbW1hbmRNYW5hZ2VyCi0JCQkJCQkJLmdldENvbW1hbmQoY29tbWFuZElkKTsKLQkJCQkJZmluYWwgUGFyYW1ldGVyaXplZENvbW1hbmQgcGFyYW1ldGVyaXplZENvbW1hbmQgPSBuZXcgUGFyYW1ldGVyaXplZENvbW1hbmQoCi0JCQkJCQkJY29tbWFuZCwgbnVsbCk7Ci0JCQkJCWlmIChldmVudC5pc0FjdGl2ZUJpbmRpbmdzQ2hhbmdlZEZvcihwYXJhbWV0ZXJpemVkQ29tbWFuZCkpIHsKLQkJCQkJCWZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBlbnRyeQotCQkJCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlKG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KGV2ZW50Ci0JCQkJCQkJCS5nZXRNYW5hZ2VyKCksIElBY3Rpb24uVEVYVCwgbnVsbCwgbnVsbCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkV4dGVybmFsQWN0aW9uTWFuYWdlci5JQ2FsbGJhY2sjZ2V0QWNjZWxlcmF0b3IoU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIGZpbmFsIEludGVnZXIgZ2V0QWNjZWxlcmF0b3IoZmluYWwgU3RyaW5nIGNvbW1hbmRJZCkgewotCQkJZmluYWwgVHJpZ2dlclNlcXVlbmNlIHRyaWdnZXJTZXF1ZW5jZSA9IGJpbmRpbmdNYW5hZ2VyCi0JCQkJCS5nZXRCZXN0QWN0aXZlQmluZGluZ0Zvcihjb21tYW5kSWQpOwotCQkJaWYgKHRyaWdnZXJTZXF1ZW5jZSAhPSBudWxsKSB7Ci0JCQkJZmluYWwgVHJpZ2dlcltdIHRyaWdnZXJzID0gdHJpZ2dlclNlcXVlbmNlLmdldFRyaWdnZXJzKCk7Ci0JCQkJaWYgKHRyaWdnZXJzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCWZpbmFsIFRyaWdnZXIgdHJpZ2dlciA9IHRyaWdnZXJzWzBdOwotCQkJCQlpZiAodHJpZ2dlciBpbnN0YW5jZW9mIEtleVN0cm9rZSkgewotCQkJCQkJZmluYWwgS2V5U3Ryb2tlIGtleVN0cm9rZSA9IChLZXlTdHJva2UpIHRyaWdnZXI7Ci0JCQkJCQlmaW5hbCBpbnQgYWNjZWxlcmF0b3IgPSBTV1RLZXlTdXBwb3J0Ci0JCQkJCQkJCS5jb252ZXJ0S2V5U3Ryb2tlVG9BY2NlbGVyYXRvcihrZXlTdHJva2UpOwotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGFjY2VsZXJhdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uRXh0ZXJuYWxBY3Rpb25NYW5hZ2VyLklDYWxsYmFjayNnZXRBY2NlbGVyYXRvclRleHQoU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY2NlbGVyYXRvclRleHQoZmluYWwgU3RyaW5nIGNvbW1hbmRJZCkgewotCQkJZmluYWwgVHJpZ2dlclNlcXVlbmNlIHRyaWdnZXJTZXF1ZW5jZSA9IGJpbmRpbmdNYW5hZ2VyCi0JCQkJCS5nZXRCZXN0QWN0aXZlQmluZGluZ0Zvcihjb21tYW5kSWQpOwotCQkJaWYgKHRyaWdnZXJTZXF1ZW5jZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXJldHVybiB0cmlnZ2VyU2VxdWVuY2UuZm9ybWF0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgYWN0aXZlIGJpbmRpbmdzIGZvciBhIHBhcnRpY3VsYXIgY29tbWFuZCBpZGVudGlmaWVyLgotCQkgKiAKLQkJICogQHBhcmFtIGNvbW1hbmRJZAotCQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb21tYW5kIHdob3NlIGJpbmRpbmdzIGFyZQotCQkgKiAgICAgICAgICAgIHJlcXVlc3RlZC4gVGhpcyBhcmd1bWVudCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uIEl0Ci0JCSAqICAgICAgICAgICAgaXMgYXNzdW1lZCB0aGF0IHRoZSBjb21tYW5kIGhhcyBubyBwYXJhbWV0ZXJzLgotCQkgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBhY3RpdmUgdHJpZ2dlcnMgKDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pCi0JCSAqICAgICAgICAgZm9yIGEgcGFydGljdWxhciBjb21tYW5kIGlkZW50aWZpZXIuIFRoaXMgdmFsdWUgaXMgZ3VhcmFudGVlZAotCQkgKiAgICAgICAgIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPiwgYnV0IGl0IG1heSBiZSBlbXB0eS4KLQkJICogQHNpbmNlIDMuMgotCQkgKi8KLQkJcHVibGljIGZpbmFsIFRyaWdnZXJTZXF1ZW5jZVtdIGdldEFjdGl2ZUJpbmRpbmdzRm9yKAotCQkJCWZpbmFsIFN0cmluZyBjb21tYW5kSWQpIHsKLQkJCXJldHVybiBiaW5kaW5nTWFuYWdlci5nZXRBY3RpdmVCaW5kaW5nc0Zvcihjb21tYW5kSWQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkV4dGVybmFsQWN0aW9uTWFuYWdlci5JQ2FsbGJhY2sjaXNBY2NlbGVyYXRvckluVXNlKGludCkKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQWNjZWxlcmF0b3JJblVzZShmaW5hbCBpbnQgYWNjZWxlcmF0b3IpIHsKLQkJCWZpbmFsIEtleVNlcXVlbmNlIGtleVNlcXVlbmNlID0gS2V5U2VxdWVuY2UKLQkJCQkJLmdldEluc3RhbmNlKFNXVEtleVN1cHBvcnQKLQkJCQkJCQkuY29udmVydEFjY2VsZXJhdG9yVG9LZXlTdHJva2UoYWNjZWxlcmF0b3IpKTsKLQkJCXJldHVybiBiaW5kaW5nTWFuYWdlci5pc1BlcmZlY3RNYXRjaChrZXlTZXF1ZW5jZSkKLQkJCQkJfHwgYmluZGluZ01hbmFnZXIuaXNQYXJ0aWFsTWF0Y2goa2V5U2VxdWVuY2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCBhbiB1bmRlZmluZWQgY29tbWFuZCBpZCB3aWxsIGdlbmVyYXRlIGEgbG9nCi0JCSAqIG1lc3NhZ2UuCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5FeHRlcm5hbEFjdGlvbk1hbmFnZXIuSUNhbGxiYWNrI2lzQWN0aXZlKFN0cmluZykKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQWN0aXZlKGZpbmFsIFN0cmluZyBjb21tYW5kSWQpIHsKLQkJCWlmIChjb21tYW5kSWQgIT0gbnVsbCkgewotCQkJCWZpbmFsIENvbW1hbmQgY29tbWFuZCA9IGNvbW1hbmRNYW5hZ2VyLmdldENvbW1hbmQoY29tbWFuZElkKTsKLQotCQkJCWlmICghY29tbWFuZC5pc0RlZmluZWQoKQotCQkJCQkJJiYgKCFsb2dnZWRDb21tYW5kSWRzLmNvbnRhaW5zKGNvbW1hbmRJZCkpKSB7Ci0JCQkJCS8vIFRoZSBjb21tYW5kIGlzIG5vdCB5ZXQgZGVmaW5lZCwgc28gd2Ugc2hvdWxkIGxvZyB0aGlzLgotCQkJCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFV0aWwKLQkJCQkJCQkudHJhbnNsYXRlU3RyaW5nKFJFU09VUkNFX0JVTkRMRSwKLQkJCQkJCQkJCSJ1bmRlZmluZWRDb21tYW5kLldhcm5pbmdNZXNzYWdlIiwgbnVsbCksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQluZXcgU3RyaW5nW10geyBjb21tYW5kLmdldElkKCkgfSk7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCSJvcmcuZWNsaXBzZS5qZmFjZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkwLCBtZXNzYWdlLCBuZXcgRXhjZXB0aW9uKCkpOwotCQkJCQlQb2xpY3kuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0KLQkJCQkJLy8gQW5kIHJlbWVtYmVyIHRoaXMgaXRlbSBzbyB3ZSBkb24ndCBsb2cgaXQgYWdhaW4uCi0JCQkJCWxvZ2dlZENvbW1hbmRJZHMuYWRkKGNvbW1hbmRJZCk7Ci0JCQkJCWNvbW1hbmQuYWRkQ29tbWFuZExpc3RlbmVyKG5ldyBJQ29tbWFuZExpc3RlbmVyKCkgewotCQkJCQkJLyoKLQkJCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJCSAqIAotCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JQ29tbWFuZExpc3RlbmVyI2NvbW1hbmRDaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLkNvbW1hbmRFdmVudCkKLQkJCQkJCSAqLwotCQkJCQkJcHVibGljIGZpbmFsIHZvaWQgY29tbWFuZENoYW5nZWQoCi0JCQkJCQkJCWZpbmFsIENvbW1hbmRFdmVudCBjb21tYW5kRXZlbnQpIHsKLQkJCQkJCQlpZiAoY29tbWFuZC5pc0RlZmluZWQoKSkgewotCQkJCQkJCQljb21tYW5kLnJlbW92ZUNvbW1hbmRMaXN0ZW5lcih0aGlzKTsKLQkJCQkJCQkJbG9nZ2VkQ29tbWFuZElkcy5yZW1vdmUoY29tbWFuZElkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJCXJldHVybiBhY3RpdmVDaGVja2VyLmlzQWN0aXZlKGNvbW1hbmRJZCk7Ci0JCQl9Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkV4dGVybmFsQWN0aW9uTWFuYWdlci5JQ2FsbGJhY2sjcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsCi0JCSAqICAgICAgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZpbmFsIFN0cmluZyBjb21tYW5kSWQsCi0JCQkJZmluYWwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGV4aXN0aW5nTGlzdGVuZXIgPSAoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIHJlZ2lzdGVyZWRMaXN0ZW5lcnMKLQkJCQkJLmdldChjb21tYW5kSWQpOwotCQkJaWYgKGV4aXN0aW5nTGlzdGVuZXIgPT0gbGlzdGVuZXIpIHsKLQkJCQlyZWdpc3RlcmVkTGlzdGVuZXJzLnJlbW92ZShjb21tYW5kSWQpOwotCQkJCWlmIChyZWdpc3RlcmVkTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJCQliaW5kaW5nTWFuYWdlci5yZW1vdmVCaW5kaW5nTWFuYWdlckxpc3RlbmVyKHRoaXMpOwotCQkJCQliaW5kaW5nTWFuYWdlckxpc3RlbmVyQXR0YWNoZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWZpbmVzIGEgY2FsbGJhY2sgbWVjaGFuaXNtIGZvciBkZXZlbG9wZXIgd2hvIHdpc2ggdG8gZnVydGhlciBjb250cm9sCi0JICogdGhlIHZpc2liaWxpdHkgb2YgbGVnYWN5IGFjdGlvbi1iYXNlZCBjb250cmlidXRpb24gaXRlbXMuCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElBY3RpdmVDaGVja2VyIHsKLQkJLyoqCi0JCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXIgc2hvdWxkIGJlCi0JCSAqIGNvbnNpZGVyZWQgYWN0aXZlLiBUaGlzIGNhbiBiZSB1c2VkIGluIHN5c3RlbXMgdXNpbmcgc29tZSBraW5kIG9mCi0JCSAqIHVzZXIgaW50ZXJmYWNlIGZpbHRlcmluZyAoZS5nLiwgYWN0aXZpdGllcyBpbiB0aGUgRWNsaXBzZSB3b3JrYmVuY2gpLgotCQkgKiAKLQkJICogQHBhcmFtIGNvbW1hbmRJZAotCQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgY29tbWFuZDsgbXVzdCBub3QgYmUKLQkJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb21tYW5kIGlzIGFjdGl2ZTsKLQkJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoU3RyaW5nIGNvbW1hbmRJZCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjYWxsYmFjayB3aGljaCBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgYXBwbGljYXRpb25zIGJpbmRpbmcgbWFuYWdlci4gVGhpcwotCSAqIGludGVyZmFjZSBwcm92aWRlcyBtb3JlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJpbmRpbmcgbWFuYWdlciwgd2hpY2gKLQkgKiBhbGxvd3MgZ3JlYXRlciBpbnRlZ3JhdGlvbi4gSW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGlzIHByZWZlcnJlZCBvdmVyCi0JICoge0BsaW5rIEV4dGVybmFsQWN0aW9uTWFuYWdlci5JQ2FsbGJhY2t9LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGJ1dCBtdXN0IG5vdCBleHRlbmQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotCSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkKLQkgKiB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJCi0JICogd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0JICogPC9wPgotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJQmluZGluZ01hbmFnZXJDYWxsYmFjayBleHRlbmRzIElDYWxsYmFjayB7Ci0KLQkJLyoqCi0JCSAqIDxwPgotCQkgKiBSZXR1cm5zIHRoZSBhY3RpdmUgYmluZGluZ3MgZm9yIGEgcGFydGljdWxhciBjb21tYW5kIGlkZW50aWZpZXIuCi0JCSAqIDwvcD4KLQkJICogCi0JCSAqIEBwYXJhbSBjb21tYW5kSWQKLQkJICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29tbWFuZCB3aG9zZSBiaW5kaW5ncyBhcmUKLQkJICogICAgICAgICAgICByZXF1ZXN0ZWQuIFRoaXMgYXJndW1lbnQgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LiBJdAotCQkgKiAgICAgICAgICAgIGlzIGFzc3VtZWQgdGhhdCB0aGUgY29tbWFuZCBoYXMgbm8gcGFyYW1ldGVycy4KLQkJICogQHJldHVybiBUaGUgYXJyYXkgb2YgYWN0aXZlIHRyaWdnZXJzICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KQotCQkgKiAgICAgICAgIGZvciBhIHBhcnRpY3VsYXIgY29tbWFuZCBpZGVudGlmaWVyLiBUaGlzIHZhbHVlIGlzIGd1YXJhbnRlZWQKLQkJICogICAgICAgICBub3QgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4sIGJ1dCBpdCBtYXkgYmUgZW1wdHkuCi0JCSAqLwotCQlwdWJsaWMgVHJpZ2dlclNlcXVlbmNlW10gZ2V0QWN0aXZlQmluZGluZ3NGb3IoU3RyaW5nIGNvbW1hbmRJZCk7Ci0JfQotCi0JLyoqCi0JICogQSBjYWxsYmFjayBtZWNoYW5pc20gZm9yIHNvbWUgZXh0ZXJuYWwgdG9vbCB0byBjb21tdW5pY2F0ZSBleHRyYQotCSAqIGluZm9ybWF0aW9uIHRvIGFjdGlvbnMgYW5kIGFjdGlvbiBjb250cmlidXRpb24gaXRlbXMuCi0JICogCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElDYWxsYmFjayB7Ci0KLQkJLyoqCi0JCSAqIDxwPgotCQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIG9iamVjdCByZWZlcmVuY2VkIGJ5IDxjb2RlPmlkZW50aWZpZXI8L2NvZGU+LgotCQkgKiBUaGlzIGxpc3RlbmVyIHdpbGwgYmUgbm90aWZpZWQgaWYgYSBwcm9wZXJ0eSBvZiB0aGUgaXRlbSBpcyB0byBiZQotCQkgKiBjaGFuZ2VkLiBUaGlzIGlkZW50aWZpZXIgaXMgc3BlY2lmaWMgdG8gbWVjaGFuaXNtIGJlaW5nIHVzZWQuIEluIHRoZQotCQkgKiBjYXNlIG9mIHRoZSBFY2xpcHNlIHdvcmtiZW5jaCwgdGhpcyBpcyB0aGUgY29tbWFuZCBpZGVudGlmaWVyLgotCQkgKiA8L3A+Ci0JCSAqIDxwPgotCQkgKiBBIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgbWF5IG9ubHkgZXZlciBiZSBhc3NvY2lhdGVkIHdpdGgKLQkJICogb25lIGlkZW50aWZpZXIuIEF0dGVtcHRzIHRvIGFkZCB0aGUgbGlzdGVuZXIgdHdpY2UgKHdpdGhvdXQgYSByZW1vdmFsCi0JCSAqIGluYmV0d2VlbikgaGFzIHVuZGVmaW5lZCBiZWhhdmlvdXIuCi0JCSAqIDwvcD4KLQkJICogCi0JCSAqIEBwYXJhbSBpZGVudGlmaWVyCi0JCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGl0ZW0gdG8gd2hpY2ggdGhlIGxpc3RlbmVyIHNob3VsZCBiZQotCQkgKiAgICAgICAgICAgIGF0dGFjaGVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICogQHBhcmFtIGxpc3RlbmVyCi0JCSAqICAgICAgICAgICAgVGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGlkZW50aWZpZXIsCi0JCQkJSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JCS8qKgotCQkgKiBBbiBhY2Nlc3NvciBmb3IgdGhlIGFjY2VsZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgaXRlbSBpbmRpY2F0ZWQgYnkKLQkJICogdGhlIGlkZW50aWZpZXIuIFRoaXMgaWRlbnRpZmllciBpcyBzcGVjaWZpYyB0byBtZWNoYW5pc20gYmVpbmcgdXNlZC4KLQkJICogSW4gdGhlIGNhc2Ugb2YgdGhlIEVjbGlwc2Ugd29ya2JlbmNoLCB0aGlzIGlzIHRoZSBjb21tYW5kIGlkZW50aWZpZXIuCi0JCSAqIAotCQkgKiBAcGFyYW0gaWRlbnRpZmllcgotCQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpdGVtIGZyb20gd2hpY2ggdGhlIGFjY2VsZXJhdG9yCi0JCSAqICAgICAgICAgICAgc2hvdWxkIGJlIG9idGFpbmVkIDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JCSAqIEByZXR1cm4gQW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWNjZWxlcmF0b3IuIFRoaXMgaXMgdGhlCi0JCSAqICAgICAgICAgc2FtZSBhY2NlbGVyYXRvciBmb3JtYXQgdXNlZCBieSBTV1QuCi0JCSAqLwotCQlwdWJsaWMgSW50ZWdlciBnZXRBY2NlbGVyYXRvcihTdHJpbmcgaWRlbnRpZmllcik7Ci0KLQkJLyoqCi0JCSAqIEFuIGFjY2Vzc29yIGZvciB0aGUgYWNjZWxlcmF0b3IgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGl0ZW0KLQkJICogaW5kaWNhdGVkIGJ5IHRoZSBpZGVudGlmaWVyLiBUaGlzIGlkZW50aWZpZXIgaXMgc3BlY2lmaWMgdG8gbWVjaGFuaXNtCi0JCSAqIGJlaW5nIHVzZWQuIEluIHRoZSBjYXNlIG9mIHRoZSBFY2xpcHNlIHdvcmtiZW5jaCwgdGhpcyBpcyB0aGUgY29tbWFuZAotCQkgKiBpZGVudGlmaWVyLgotCQkgKiAKLQkJICogQHBhcmFtIGlkZW50aWZpZXIKLQkJICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgaXRlbSBmcm9tIHdoaWNoIHRoZSBhY2NlbGVyYXRvciB0ZXh0Ci0JCSAqICAgICAgICAgICAgc2hvdWxkIGJlIG9idGFpbmVkIDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JCSAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFjY2VsZXJhdG9yLiBUaGlzIGlzIHRoZQotCQkgKiAgICAgICAgIHN0cmluZyByZXByZXNlbnRhdGlvbiB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEFjY2VsZXJhdG9yVGV4dChTdHJpbmcgaWRlbnRpZmllcik7Ci0KLQkJLyoqCi0JCSAqIENoZWNrcyB0byBzZWUgd2hldGhlciB0aGUgZ2l2ZW4gYWNjZWxlcmF0b3IgaXMgYmVpbmcgdXNlZCBieSBzb21lCi0JCSAqIG90aGVyIG1lY2hhbmlzbSAob3V0c2lkZSBvZiB0aGUgbWVudXMgY29udHJvbGxlZCBieSBKRmFjZSkuIFRoaXMgaXMKLQkJICogdXNlZCB0byBrZWVwIEpGYWNlIGZyb20gdHJ5aW5nIHRvIGdyYWIgYWNjZWxlcmF0b3JzIGF3YXkgZnJvbSBzb21lb25lCi0JCSAqIGVsc2UuCi0JCSAqIAotCQkgKiBAcGFyYW0gYWNjZWxlcmF0b3IKLQkJICogICAgICAgICAgICBUaGUgYWNjZWxlcmF0b3IgdG8gY2hlY2sgLS0gaW4gU1dUJ3MgaW50ZXJuYWwgYWNjZWxlcmF0b3IKLQkJICogICAgICAgICAgICBmb3JtYXQuCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFjY2VsZXJhdG9yIGlzIGFscmVhZHkgYmVpbmcgdXNlZAotCQkgKiAgICAgICAgIGFuZCBzaG91bGRuJ3QgYmUgdXNlZCBhZ2FpbjsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQWNjZWxlcmF0b3JJblVzZShpbnQgYWNjZWxlcmF0b3IpOwotCi0JCS8qKgotCQkgKiBDaGVja3Mgd2hldGhlciB0aGUgaXRlbSBtYXRjaGluZyB0aGlzIGlkZW50aWZpZXIgaXMgYWN0aXZlLiBUaGlzIGlzCi0JCSAqIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgYSBjb250cmlidXRpb24gaXRlbSB3aXRoIHRoaXMgaWRlbnRpZmllcgotCQkgKiBzaG91bGQgYmUgbWFkZSB2aXNpYmxlLiBBbiBpbmFjdGl2ZSBpdGVtIGlzIG5vdCB2aXNpYmxlLgotCQkgKiAKLQkJICogQHBhcmFtIGlkZW50aWZpZXIKLQkJICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgaXRlbSBmcm9tIHdoaWNoIHRoZSBhY3RpdmUgc3RhdGUKLQkJICogICAgICAgICAgICBzaG91bGQgYmUgcmV0cmlldmVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaXRlbSBpcyBhY3RpdmU7IDxjb2RlPmZhbHNlPC9jb2RlPgotCQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCQkvKioKLQkJICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIG9iamVjdCByZWZlcmVuY2VkIGJ5Ci0JCSAqIDxjb2RlPmlkZW50aWZpZXI8L2NvZGU+LiBUaGlzIGlkZW50aWZpZXIgaXMgc3BlY2lmaWMgdG8gbWVjaGFuaXNtCi0JCSAqIGJlaW5nIHVzZWQuIEluIHRoZSBjYXNlIG9mIHRoZSBFY2xpcHNlIHdvcmtiZW5jaCwgdGhpcyBpcyB0aGUgY29tbWFuZAotCQkgKiBpZGVudGlmaWVyLgotCQkgKiAKLQkJICogQHBhcmFtIGlkZW50aWZpZXIKLQkJICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgaXRlbSB0byBmcm9tIHRoZSBsaXN0ZW5lciBzaG91bGQgYmUKLQkJICogICAgICAgICAgICByZW1vdmVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICogQHBhcmFtIGxpc3RlbmVyCi0JCSAqICAgICAgICAgICAgVGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgaWRlbnRpZmllciwKLQkJCQlJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLiBUaGlzIHZhbHVlIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi0tCi0JICogaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBFeHRlcm5hbEFjdGlvbk1hbmFnZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0JICogCi0JICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlOyB0aGlzIHZhbHVlIGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXh0ZXJuYWxBY3Rpb25NYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEV4dGVybmFsQWN0aW9uTWFuYWdlcigpOwotCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY2FsbGJhY2sgbWVjaGFuaXNtIHRvIHVzZSB0byByZXRyaWV2ZSBleHRyYSBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwcml2YXRlIElDYWxsYmFjayBjYWxsYmFjazsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+RXh0ZXJuYWxBY3Rpb25NYW5hZ2VyPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIEV4dGVybmFsQWN0aW9uTWFuYWdlcigpIHsKLQkJLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiBjbGFzcy4gT25seSB0aGlzIGNsYXNzIHNob3VsZCBjcmVhdGUgYW4gaW5zdGFuY2UuCi0JfQotCi0JLyoqCi0JICogQW4gYWNjZXNzb3IgZm9yIHRoZSBjdXJyZW50IGNhbGwgYmFjay4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGNhbGxiYWNrIG1lY2hhbmlzbSBiZWluZyB1c2VkLiBUaGlzIGlzIHRoZSBjYWxsYmFjawotCSAqICAgICAgICAgdGhhdCBzaG91bGQgYmUgcXVlcmllZCBmb3IgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgYWN0aW9ucyBhbmQKLQkgKiAgICAgICAgIGFjdGlvbiBjb250cmlidXRpb24gaXRlbXMuIFRoaXMgdmFsdWUgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiB0aGVyZSBpcyBubyBleHRyYSBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNhbGxiYWNrIGdldENhbGxiYWNrKCkgewotCQlyZXR1cm4gY2FsbGJhY2s7Ci0JfQotCi0JLyoqCi0JICogQSBtdXRhdG9yIGZvciB0aGUgY3VycmVudCBjYWxsIGJhY2sKLQkgKiAKLQkgKiBAcGFyYW0gY2FsbGJhY2tUb1VzZQotCSAqICAgICAgICAgICAgVGhlIG5ldyBjYWxsYmFjayBtZWNoYW5pc20gdG8gdXNlOyB0aGlzIHZhbHVlIG1heSBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRlZmF1bHQgaXMgYWNjZXB0YWJsZSAoaS5lLiwgbm8KLQkgKiAgICAgICAgICAgIGV4dHJhIGluZm9ybWF0aW9uIHdpbGwgcHJvdmlkZWQgdG8gYWN0aW9ucykuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soSUNhbGxiYWNrIGNhbGxiYWNrVG9Vc2UpIHsKLQkJY2FsbGJhY2sgPSBjYWxsYmFja1RvVXNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9FeHRlcm5hbEFjdGlvbk1hbmFnZXIucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9FeHRlcm5hbEFjdGlvbk1hbmFnZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5Yjk2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vRXh0ZXJuYWxBY3Rpb25NYW5hZ2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXVuZGVmaW5lZENvbW1hbmQuV2FybmluZ01lc3NhZ2UgPSBUaGUgY29tbWFuZCAoInswfSIpIGlzIHVuZGVmaW5lZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0dyb3VwTWFya2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vR3JvdXBNYXJrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3NGRmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vR3JvdXBNYXJrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLS8qKgotICogQSBncm91cCBtYXJrZXIgaXMgYSBzcGVjaWFsIGtpbmQgb2YgY29udHJpYnV0aW9uIGl0ZW0gZGVub3RpbmcKLSAqIHRoZSBiZWdpbm5pbmcgb2YgYSBncm91cC4gVGhlc2UgZ3JvdXBzIGFyZSB1c2VkIHRvIHN0cnVjdHVyZQotICogdGhlIGxpc3Qgb2YgaXRlbXMuIFVubGlrZSByZWd1bGFyIGNvbnRyaWJ1dGlvbiBpdGVtcyBhbmQKLSAqIHNlcGFyYXRvcnMsIGdyb3VwIG1hcmtlcnMgaGF2ZSBubyB2aXN1YWwgcmVwcmVzZW50YXRpb24uCi0gKiBUaGUgbmFtZSBvZiB0aGUgZ3JvdXAgaXMgc3lub255bW91cyB3aXRoIHRoZSBjb250cmlidXRpb24gaXRlbSBpZC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgCi0gKiBzdWJjbGFzc2VkIG91dHNpZGUgdGhlIGZyYW1ld29yay4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEdyb3VwTWFya2VyIGV4dGVuZHMgQWJzdHJhY3RHcm91cE1hcmtlciB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGdyb3VwIG1hcmtlciB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFRoZSBncm91cCBuYW1lIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIHRoZSBlbXB0eSBzdHJpbmcuCi0gICAgICogVGhlIGdyb3VwIG5hbWUgaXMgYWxzbyB1c2VkIGFzIHRoZSBpdGVtIGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBncm91cE5hbWUgdGhlIG5hbWUgb2YgdGhlIGdyb3VwCi0gICAgICovCi0gICAgcHVibGljIEdyb3VwTWFya2VyKFN0cmluZyBncm91cE5hbWUpIHsKLSAgICAgICAgc3VwZXIoZ3JvdXBOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+R3JvdXBNYXJrZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kCi0gICAgICogcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gc2luY2UgZ3JvdXAgbWFya2VycyBhcmUgYWx3YXlzIGludmlzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vSUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0lBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhYjVlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vSUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLQotLyoqCi0gKiBBbiBhY3Rpb24gcmVwcmVzZW50cyB0aGUgbm9uLVVJIHNpZGUgb2YgYSBjb21tYW5kIHdoaWNoIGNhbiBiZSB0cmlnZ2VyZWQKLSAqIGJ5IHRoZSBlbmQgdXNlci4gQWN0aW9ucyBhcmUgdHlwaWNhbGx5IGFzc29jaWF0ZWQgd2l0aCBidXR0b25zLCBtZW51IGl0ZW1zLAotICogYW5kIGl0ZW1zIGluIHRvb2wgYmFycy4gVGhlIGNvbnRyb2xzIGZvciBhIGNvbW1hbmQgYXJlIGJ1aWx0IGJ5IHNvbWUgY29udGFpbmVyLAotICogd2hpY2ggZnVybmlzaGVkIHRoZSBjb250ZXh0IHdoZXJlIHRoZXNlIGNvbnRyb2xzIGFwcGVhciBhbmQgY29uZmlndXJlcyAKLSAqIHRoZW0gd2l0aCBkYXRhIGZyb20gcHJvcGVydGllcyBkZWNsYXJlZCBieSB0aGUgYWN0aW9uLiBXaGVuIHRoZSBlbmQgdXNlcgotICogdHJpZ2dlcnMgdGhlIGNvbW1hbmQgdmlhIGl0cyBjb250cm9sLCB0aGUgYWN0aW9uJ3MgPGNvZGU+cnVuPC9jb2RlPgotICogbWV0aG9kIGlzIGludm9rZWQgdG8gZG8gdGhlIHJlYWwgd29yay4KLSAqIDxwPgotICogQWN0aW9ucyBzdXBwb3J0IGEgcHJlZGVmaW5lZCBzZXQgb2YgcHJvcGVydGllcyAoYW5kIHBvc3NpYmx5IG90aGVycyBhcyB3ZWxsKS4KLSAqIENsaWVudHMgb2YgYW4gYWN0aW9uIG1heSByZWdpc3RlciBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHNvIHRoYXQgdGhleSBnZXQgCi0gKiBub3RpZmllZCB3aGVuZXZlciB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBjaGFuZ2VzLgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIHNob3VsZCBzdWJjbGFzcyB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyA8Y29kZT5BY3Rpb248L2NvZGU+IHRvIGRlZmluZSAKLSAqIGNvbmNyZXRlIGFjdGlvbnMgcmF0aGVyIHRoYW4gaW1wbGVtZW50aW5nIDxjb2RlPklBY3Rpb248L2NvZGU+IGZyb20gc2NyYXRjaC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgZXhpc3RzIG9ubHkgdG8gZGVmaW5lIHRoZSBBUEkgZm9yIGFjdGlvbnMuCi0gKiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBBY3Rpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIEFjdGlvbiBzdHlsZSBjb25zdGFudCAodmFsdWUgPGNvZGU+MDwvY29kZT4pIGluZGljYXRpbmcgYWN0aW9uIHN0eWxlIAotICAgICAqIGlzIG5vdCBzcGVjaWZpZWQgeWV0LiBCeSBkZWZhdWx0LCB0aGUgYWN0aW9uIHdpbGwgYXNzdW1lIGEgcHVzaCBidXR0b24KLSAgICAgKiBzdHlsZS4gSWYgPGNvZGU+c2V0Q2hlY2tlZDwvY29kZT4gaXMgY2FsbGVkLCB0aGVuIHRoZSBzdHlsZSB3aWxsIGNoYW5nZQotICAgICAqIHRvIGEgY2hlY2sgYm94LCBvciBpZiA8Y29kZT5zZXRNZW51Q3JlYXRvcjwvY29kZT4gaXMgY2FsbGVkLCB0aGVuIHRoZQotICAgICAqIHN0eWxlIHdpbGwgY2hhbmdlIHRvIGEgZHJvcCBkb3duIG1lbnUuCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IEFTX1VOU1BFQ0lGSUVEID0gMHgwMDsKLQotICAgIC8qKgotICAgICAqIEFjdGlvbiBzdHlsZSBjb25zdGFudCAodmFsdWUgPGNvZGU+MTwvY29kZT4pIGluZGljYXRpbmcgYWN0aW9uIGlzIAotICAgICAqIGEgc2ltcGxlIHB1c2ggYnV0dG9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IEFTX1BVU0hfQlVUVE9OID0gMHgwMTsKLQotICAgIC8qKgotICAgICAqIEFjdGlvbiBzdHlsZSBjb25zdGFudCAodmFsdWUgPGNvZGU+MjwvY29kZT4pIGluZGljYXRpbmcgYWN0aW9uIGlzIAotICAgICAqIGEgY2hlY2sgYm94IChvciBhIHRvZ2dsZSBidXR0b24pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IEFTX0NIRUNLX0JPWCA9IDB4MDI7Ci0KLSAgICAvKioKLSAgICAgKiBBY3Rpb24gc3R5bGUgY29uc3RhbnQgKHZhbHVlIDxjb2RlPjQ8L2NvZGU+KSBpbmRpY2F0aW5nIGFjdGlvbiBpcyAKLSAgICAgKiBhIGRyb3AgZG93biBtZW51LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IEFTX0RST1BfRE9XTl9NRU5VID0gMHgwNDsKLQotICAgIC8qKgotICAgICAqIEFjdGlvbiBzdHlsZSBjb25zdGFudCAodmFsdWUgPGNvZGU+ODwvY29kZT4pIGluZGljYXRpbmcgYWN0aW9uIGlzIAotICAgICAqIGEgcmFkaW8gYnV0dG9uLgotICAgICAqIAotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBBU19SQURJT19CVVRUT04gPSAweDA4OwotCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgbmFtZSBvZiBhbiBhY3Rpb24ncyB0ZXh0ICh2YWx1ZSA8Y29kZT4idGV4dCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gInRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIG9mIGFuIGFjdGlvbidzIGVuYWJsZWQgc3RhdGUKLSAgICAgKiAodmFsdWUgPGNvZGU+ImVuYWJsZWQiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFRCA9ICJlbmFibGVkIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgbmFtZSBvZiBhbiBhY3Rpb24ncyBpbWFnZSAodmFsdWUgPGNvZGU+ImltYWdlIjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFID0gImltYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgbmFtZSBvZiBhbiBhY3Rpb24ncyB0b29sdGlwIHRleHQgKHZhbHVlIDxjb2RlPiJ0b29sVGlwVGV4dCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX1RJUF9URVhUID0gInRvb2xUaXBUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgbmFtZSBvZiBhbiBhY3Rpb24ncyBkZXNjcmlwdGlvbiAodmFsdWUgPGNvZGU+ImRlc2NyaXB0aW9uIjwvY29kZT4pLgotICAgICAqIFR5cGljYWxseSB0aGUgZGVzY3JpcHRpb24gaXMgc2hvd24gYXMgYSAobG9uZ2VyKSBoZWxwIHRleHQgaW4gdGhlIHN0YXR1cyBsaW5lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgbmFtZSBvZiBhbiBhY3Rpb24ncyBjaGVja2VkIHN0YXR1cyAodmFsdWUKLSAgICAgKiA8Y29kZT4iY2hlY2tlZCI8L2NvZGU+KS4gQXBwbGljYWJsZSB3aGVuIHRoZSBzdHlsZSBpcwotICAgICAqIDxjb2RlPkFTX0NIRUNLX0JPWDwvY29kZT4gb3IgPGNvZGU+QVNfUkFESU9fQlVUVE9OPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS0VEID0gImNoZWNrZWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIG9mIGFuIGFjdGlvbidzIHN1Y2Nlc3MvZmFpbCByZXN1bHQKLSAgICAgKiAodmFsdWUgPGNvZGU+InJlc3VsdCI8L2NvZGU+KS4gVGhlIHZhbHVlcyBhcmUKLSAgICAgKiA8Y29kZT5Cb29sZWFuLlRSVUU8L2NvZGU+IGlmIHJ1bm5pbmcgdGhlIGFjdGlvbiBzdWNjZWVkZWQgYW5kIAotICAgICAqIDxjb2RlPkJvb2xlYW4uRkFMU0U8L2NvZGU+IGlmIHJ1bm5pbmcgdGhlIGFjdGlvbiBmYWlsZWQgb3IgZGlkIG5vdAotICAgICAqIGNvbXBsZXRlLgotICAgICAqIDxwPgotICAgICAqIE5vdCBhbGwgYWN0aW9ucyByZXBvcnQgd2hldGhlciB0aGV5IHN1Y2NlZWQgb3IgZmFpbC4gVGhpcyBwcm9wZXJ0eQotICAgICAqIGlzIHByb3ZpZGVkIGZvciB1c2UgYnkgYWN0aW9ucyB0aGF0IG1heSBiZSBpbnZva2VkIGJ5IGNsaWVudHMgdGhhdCBjYW4KLSAgICAgKiB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGluZm9ybWF0aW9uIHdoZW4gcHJlc2VudCAoZm9yIGV4YW1wbGUsIGFjdGlvbnMKLSAgICAgKiB1c2VkIGluIGNoZWF0IHNoZWV0cykuIENsaWVudHMgc2hvdWxkIGFsd2F5cyBhc3N1bWUgdGhhdCBydW5uaW5nIHRoZQotICAgICAqIGFjdGlvbiBzdWNjZWVkZWQgaW4gdGhlIGFic2VuY2Ugb2Ygbm90aWZpY2F0aW9uIHRvIHRoZSBjb250cmFyeS4gCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFQgPSAicmVzdWx0IjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIFByb3BlcnR5IG5hbWUgb2YgYW4gYWN0aW9uJ3MgaGFuZGxlci4gU29tZSBhY3Rpb25zIGRlbGVnYXRlIHNvbWUgb3IgYWxsCi0gICAgICogb2YgdGhlaXIgYmVoYXZpb3VyIG9yIHN0YXRlIHRvIGFub3RoZXIgb2JqZWN0LiBJbiB0aGlzIGNhc2UsIGlmIHRoZQotICAgICAqIG9iamVjdCB0byB3aGljaCBiZWhhdmlvdXIgaGFzIGJlZW4gZGVsZWdhdGVkIGNoYW5nZXMsIHRoZW4gYSBwcm9wZXJ0eQotICAgICAqIGNoYW5nZSBldmVudCBzaG91bGQgYmUgc2VudCB3aXRoIHRoaXMgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9mIGFjdGlvbnMgd2l0aGluIHRoZQotICAgICAqIGNvbW1hbmRzIGZyYW1ld29yay4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFRCA9IElIYW5kbGVyQXR0cmlidXRlcy5BVFRSSUJVVEVfSEFORExFRDsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBhY3Rpb24uCi0gICAgICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY2NlbGVyYXRvciBrZXljb2RlIGZvciB0aGlzIGFjdGlvbi4KLSAgICAgKiBUaGUgcmVzdWx0IGlzIHRoZSBiaXQtd2lzZSBPUiBvZiB6ZXJvIG9yIG1vcmUgbW9kaWZpZXIgbWFza3MKLSAgICAgKiBhbmQgYSBrZXksIGFzIGV4cGxhaW5lZCBpbiA8Y29kZT5NZW51SXRlbS5nZXRBY2NlbGVyYXRvcjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBhY2NlbGVyYXRvciBrZXljb2RlCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbSNnZXRBY2NlbGVyYXRvcigpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRBY2NlbGVyYXRvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9uIGRlZmluaXRpb24gaWQgb2YgdGhpcyBhY3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYWN0aW9uIGRlZmluaXRpb24gaWQgb2YgdGhpcyBhY3Rpb24sIG9yCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkRlZmluaXRpb25JZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9uJ3MgZGVzY3JpcHRpb24gaWYgaXQgaGFzIG9uZS4KLSAgICAgKiBPdGhlcndpc2UgaXQgcmV0dXJucyA8Y29kZT5nZXRUb29sVGlwVGV4dCgpPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgZGVzY3JpcHRpb24gZm9yIHRoZSBhY3Rpb247IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhpcyBhY3Rpb24gYXMgYW4gaW1hZ2UgZGVzY3JpcHRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIDxjb2RlPklNQUdFPC9jb2RlPiBwcm9wZXJ0eTsKLSAgICAgKiBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCB3aGVuIGl0cyB2YWx1ZSBjaGFuZ2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBoYXMgbm8gaW1hZ2UKLSAgICAgKiBAc2VlICNJTUFHRQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBoZWxwIGxpc3RlbmVyIGZvciB0aGlzIGFjdGlvbi4gCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgaGVscCBsaXN0ZW5lciBmb3IgdGhpcyBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSGVscExpc3RlbmVyIGdldEhlbHBMaXN0ZW5lcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaG92ZXIgaW1hZ2UgZm9yIHRoaXMgYWN0aW9uIGFzIGFuIGltYWdlIGRlc2NyaXB0b3IuCi0gICAgICogPHA+Ci0gICAgICogSG92ZXIgaW1hZ2VzIHdpbGwgYmUgdXNlZCBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IGNoYW5naW5nIHRoZSBpbWFnZQotICAgICAqIHdoZW4gdGhlIHVzZXIgaG92ZXJzIG92ZXIgdGhlIGl0ZW0uIFRoaXMgbWV0aG9kIGlzIGFzc29jaWF0ZWQgd2l0aCAKLSAgICAgKiB0aGUgPGNvZGU+SU1BR0U8L2NvZGU+IHByb3BlcnR5OwotICAgICAqIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIHdoZW4gaXRzIHZhbHVlIGNoYW5nZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIGhhcyBubyBpbWFnZQotICAgICAqIEBzZWUgI0lNQUdFCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGFjdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzCi0gICAgICogbm9uZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGFjdGlvbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGltYWdlIGZvciB0aGlzIGFjdGlvbiBhcyBhbiBpbWFnZSBkZXNjcmlwdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgPGNvZGU+SU1BR0U8L2NvZGU+IHByb3BlcnR5OwotICAgICAqIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIHdoZW4gaXRzIHZhbHVlIGNoYW5nZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIGhhcyBubyBpbWFnZQotICAgICAqIEBzZWUgI0lNQUdFCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lbnUgY3JlYXRvciBmb3IgdGhpcyBhY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBtZW51IGNyZWF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgSU1lbnVDcmVhdG9yIGdldE1lbnVDcmVhdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhpcyBhY3Rpb24ncyBzdHlsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gb25lIG9mIDxjb2RlPkFTX1BVU0hfQlVUVE9OPC9jb2RlPiwgPGNvZGU+QVNfQ0hFQ0tfQk9YPC9jb2RlPiwKLSAgICAgKiA8Y29kZT5BU19SQURJT19CVVRUT048L2NvZGU+IGFuZCA8Y29kZT5BU19EUk9QX0RPV05fTUVOVTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTdHlsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhpcyBhY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSA8Y29kZT5URVhUPC9jb2RlPiBwcm9wZXJ0eTsKLSAgICAgKiBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCB3aGVuIGl0cyB2YWx1ZSBjaGFuZ2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAc2VlICNURVhUCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0b29sIHRpcCB0ZXh0IGZvciB0aGlzIGFjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIDxjb2RlPlRPT0xfVElQX1RFWFQ8L2NvZGU+IHByb3BlcnR5OwotICAgICAqIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIHdoZW4gaXRzIHZhbHVlIGNoYW5nZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdG9vbCB0aXAgdGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBzZWUgI1RPT0xfVElQX1RFWFQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXR1cyBvZiB0aGlzIGFjdGlvbi4gQXBwbGljYWJsZSBvbmx5IGlmIHRoZSBzdHlsZSBpcwotICAgICAqIDxjb2RlPkFTX0NIRUNLX0JPWDwvY29kZT4gb3IgPGNvZGU+QVNfUkFESU9fQlVUVE9OPC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIDxjb2RlPkNIRUNLRUQ8L2NvZGU+IHByb3BlcnR5OwotICAgICAqIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIHdoZW4gaXRzIHZhbHVlIGNoYW5nZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY2hlY2tlZCBzdGF0dXMKLSAgICAgKiBAc2VlICNDSEVDS0VECi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhY3Rpb24gaXMgZW5hYmxlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIDxjb2RlPkVOQUJMRUQ8L2NvZGU+IHByb3BlcnR5OwotICAgICAqIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIHdoZW4gaXRzIHZhbHVlIGNoYW5nZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmFibGVkLCBhbmQKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBkaXNhYmxlZAotICAgICAqIEBzZWUgI0VOQUJMRUQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKTsKLQotICAgIC8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGFjdGlvbiBpcyBoYW5kbGVkLiBJbiB0aGUgZGVmYXVsdCBjYXNlLCB0aGlzIGlzCi0JICogYWx3YXlzIDxjb2RlPnRydWU8L2NvZGU+LiBIb3dldmVyLCBpZiB0aGUgYWN0aW9uIGRlbGVnYXRlcyBzb21lIG9mIGl0cwotCSAqIGJlaGF2aW91ciB0byBzb21lIG90aGVyIG9iamVjdCwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgYW5zd2VyIHdoZXRoZXIKLQkgKiBzdWNoIGFuIG9iamVjdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWxsIG9mIHRoZSBhY3Rpb24ncyBiZWhhdmlvdXIgaXMKLQkgKiAgICAgICAgIGF2YWlsYWJsZTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIYW5kbGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBsaXN0ZW5lciBmcm9tIHRoaXMgYWN0aW9uLgotICAgICAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIHRoaXMgYWN0aW9uLgotICAgICAqIEVhY2ggYWN0aW9uIGltcGxlbWVudGF0aW9uIG11c3QgZGVmaW5lIHRoZSBzdGVwcyBuZWVkZWQgdG8gY2Fycnkgb3V0IHRoaXMgYWN0aW9uLgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGluIDxjb2RlPkFjdGlvbjwvY29kZT4KLSAgICAgKiBkb2VzIG5vdGhpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIHRoaXMgYWN0aW9uLCBwYXNzaW5nIHRoZSB0cmlnZ2VyaW5nIFNXVCBldmVudC4KLSAgICAgKiBBcyBvZiAyLjAsIDxjb2RlPkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+IGNhbGxzIHRoaXMgbWV0aG9kCi0gICAgICogaW5zdGVhZCBvZiA8Y29kZT5ydW4oKTwvY29kZT4uICAKLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpbiA8Y29kZT5BY3Rpb248L2NvZGU+Ci0gICAgICogc2ltcGx5IGNhbGxzIDxjb2RlPnJ1bigpPC9jb2RlPiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBTV1QgZXZlbnQgd2hpY2ggdHJpZ2dlcmVkIHRoaXMgYWN0aW9uIGJlaW5nIHJ1biAKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjdGlvbiBkZWZpbml0aW9uIGlkIG9mIHRoaXMgYWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgYWN0aW9uIGRlZmluaXRpb24gaWQKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aW9uRGVmaW5pdGlvbklkKFN0cmluZyBpZCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjaGVja2VkIHN0YXR1cyBvZiB0aGlzIGFjdGlvbi4gQXBwbGljYWJsZSBmb3IgdGhlIHN0eWxlcwotICAgICAqIDxjb2RlPkFTX0NIRUNLX0JPWDwvY29kZT4gb3IgPGNvZGU+QVNfUkFESU9fQlVUVE9OPC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBGaXJlcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudCBmb3IgdGhlIDxjb2RlPkNIRUNLRUQ8L2NvZGU+IHByb3BlcnR5Ci0gICAgICogaWYgdGhlIGNoZWNrZWQgc3RhdHVzIGFjdHVhbGx5IGNoYW5nZXMgYXMgYSBjb25zZXF1ZW5jZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY2hlY2tlZCB0aGUgbmV3IGNoZWNrZWQgc3RhdHVzCi0gICAgICogQHNlZSAjQ0hFQ0tFRAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyBhY3Rpb24ncyBkZXNjcmlwdGlvbi4KLSAgICAgKiBUeXBpY2FsbHkgdGhlIGRlc2NyaXB0aW9uIGlzIHNob3duIGFzIGEgKGxvbmdlcikgaGVscCB0ZXh0IGluIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKiA8cD4KLSAgICAgKiBGaXJlcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudCBmb3IgdGhlIDxjb2RlPkRFU0NSSVBUSU9OPC9jb2RlPiBwcm9wZXJ0eQotICAgICAqIGlmIHRoZSBkZXNjcmlwdGlvbiBhY3R1YWxseSBjaGFuZ2VzIGFzIGEgY29uc2VxdWVuY2UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgdGhlIGRlc2NyaXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciB0aGUgZGVzY3JpcHRpb24KLSAgICAgKiBAc2VlICNERVNDUklQVElPTgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB0ZXh0KTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRpc2FibGVkIGltYWdlIGZvciB0aGlzIGFjdGlvbiwgYXMgYW4gaW1hZ2UgZGVzY3JpcHRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBEaXNhYmxlZCBpbWFnZXMgd2lsbCBiZSB1c2VkIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgY2hhbmdpbmcgdGhlIGltYWdlCi0gICAgICogd2hlbiB0aGUgaXRlbSBpcyBkaXNhYmxlZC5GaXJlcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudCBmb3IgCi0gICAgICogdGhlIDxjb2RlPklNQUdFPC9jb2RlPiBwcm9wZXJ0eQotICAgICAqIGlmIHRoZSBpbWFnZSBhY3R1YWxseSBjaGFuZ2VzIGFzIGEgY29uc2VxdWVuY2UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld0ltYWdlIHRoZSBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyAKLSAgICAgKiAgIGFjdGlvbiBzaG91bGQgbm90IGhhdmUgYW4gaW1hZ2UKLSAgICAgKiBAc2VlICNJTUFHRQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoaXMgYWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gYW4gYWN0aW9uIGlzIGluIHRoZSBlbmFibGVkIHN0YXRlLCB0aGUgY29udHJvbCBhc3NvY2lhdGVkIHdpdGggCi0gICAgICogaXQgaXMgYWN0aXZlOyB0cmlnZ2VyaW5nIGl0IHdpbGwgZW5kIHVwIGlua29raW5nIHRoaXMgYWN0aW9uJ3MgCi0gICAgICogPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEZpcmVzIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGZvciB0aGUgPGNvZGU+RU5BQkxFRDwvY29kZT4gcHJvcGVydHkKLSAgICAgKiBpZiB0aGUgZW5hYmxlZCBzdGF0ZSBhY3R1YWxseSBjaGFuZ2VzIGFzIGEgY29uc2VxdWVuY2UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZW5hYmxlLCBhbmQKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBkaXNhYmxlCi0gICAgICogQHNlZSAjRU5BQkxFRAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgYSBoZWxwIGxpc3RlbmVyIGZvciB0aGlzIGFjdGlvbi4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgYSBoZWxwIGxpc3RlbmVyIGZvciB0aGlzIGFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaG92ZXIgaW1hZ2UgZm9yIHRoaXMgYWN0aW9uLCBhcyBhbiBpbWFnZSBkZXNjcmlwdG9yLgotICAgICAqIDxwPgotICAgICAqIEhvdmVyIGltYWdlcyB3aWxsIGJlIHVzZWQgb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBjaGFuZ2luZyB0aGUgaW1hZ2UKLSAgICAgKiB3aGVuIHRoZSB1c2VyIGhvdmVycyBvdmVyIHRoZSBpdGVtLkZpcmVzIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGZvciAKLSAgICAgKiB0aGUgPGNvZGU+SU1BR0U8L2NvZGU+IHByb3BlcnR5Ci0gICAgICogaWYgdGhlIGltYWdlIGFjdHVhbGx5IGNoYW5nZXMgYXMgYSBjb25zZXF1ZW5jZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV3SW1hZ2UgdGhlIGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIAotICAgICAqICAgYWN0aW9uIHNob3VsZCBub3QgaGF2ZSBhbiBpbWFnZQotICAgICAqIEBzZWUgI0lNQUdFCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGFjdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGlkZW50aWZ5IGFjdGlvbnMKLSAgICAgKiB3aGVuIGFkZGVkIHRvIGEgY29udHJpYnV0aW9uIG1hbmFnZXIuCi0gICAgICogSXQgc2hvdWxkIGJlIHNldCB3aGVuIHRoZSBhY3Rpb24gaXMgY3JlYXRlZC4gIEl0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgb25jZQotICAgICAqIHRoZSBhY3Rpb24gaXMgcGFydCBvZiBhbiBhY3Rpb24gY29udHJpYnV0aW9uIGl0ZW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGFjdGlvbiBpZAotICAgICAqCi0gICAgICogQHNlZSBBY3Rpb25Db250cmlidXRpb25JdGVtCi0gICAgICogQHNlZSBJQ29udHJpYnV0aW9uSXRlbSNnZXRJZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbWFnZSBmb3IgdGhpcyBhY3Rpb24sIGFzIGFuIGltYWdlIGRlc2NyaXB0b3IuCi0gICAgICogPHA+Ci0gICAgICogRmlyZXMgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgZm9yIHRoZSA8Y29kZT5JTUFHRTwvY29kZT4gcHJvcGVydHkKLSAgICAgKiBpZiB0aGUgaW1hZ2UgYWN0dWFsbHkgY2hhbmdlcyBhcyBhIGNvbnNlcXVlbmNlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdJbWFnZSB0aGUgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgCi0gICAgICogICBhY3Rpb24gc2hvdWxkIG5vdCBoYXZlIGFuIGltYWdlCi0gICAgICogQHNlZSAjSU1BR0UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lbnUgY3JlYXRvciBmb3IgdGhpcyBhY3Rpb24uIEFwcGxpY2FibGUgZm9yIHN0eWxlCi0gICAgICogPGNvZGU+QVNfRFJPUF9ET1dOX01FTlU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGNyZWF0b3IgdGhlIG1lbnUgY3JlYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lbnVDcmVhdG9yKElNZW51Q3JlYXRvciBjcmVhdG9yKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRleHQgZm9yIHRoaXMgYWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIEFuIGFjY2VsZXJhdG9yIHNwZWNpZmljYXRpb24gbWF5IGZvbGxvdyB0aGUgYWN0dWFsIHRleHQsIHNlcGFyYXRlZCBmcm9tIGl0IGJ5Ci0gICAgICogYW4gJ0AnIG9yIGEgJ1x0JyBjaGFyYWN0ZXIuICBBbiBhY2NlbGVyYXRvciBzcGVjaWZpY2F0aW9uIGNvbnNpc3RzIG9mIHplcm8gb3IgbW9yZSAKLSAgICAgKiBtb2RpZmllciB0b2tlbnMgZm9sbG93ZWQgYnkgYSBrZXkgY29kZSB0b2tlbi4gIFRoZSB0b2tlbnMgYXJlIHNlcGFyYXRlZCBieSBhICcrJyBjaGFyYWN0ZXIuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEZpcmVzIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGZvciB0aGUgPGNvZGU+VEVYVDwvY29kZT4gcHJvcGVydHkKLSAgICAgKiBpZiB0aGUgdGV4dCBhY3R1YWxseSBjaGFuZ2VzIGFzIGEgY29uc2VxdWVuY2UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgdGhlIHRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAc2VlICNURVhUCi0gICAgICogQHNlZSBBY3Rpb24jZmluZE1vZGlmaWVyCi0gICAgICogQHNlZSBBY3Rpb24jZmluZEtleUNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRvb2wgdGlwIHRleHQgZm9yIHRoaXMgYWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIEZpcmVzIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGZvciB0aGUgPGNvZGU+VE9PTF9USVBfVEVYVDwvY29kZT4gcHJvcGVydHkKLSAgICAgKiBpZiB0aGUgdG9vbCB0aXAgdGV4dCBhY3R1YWxseSBjaGFuZ2VzIGFzIGEgY29uc2VxdWVuY2UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgdGhlIHRvb2wgdGlwIHRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAc2VlICNUT09MX1RJUF9URVhUCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRleHQpOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogU2V0cyB0aGUgYWNjZWxlcmF0b3Iga2V5Y29kZSB0aGF0IHRoaXMgYWN0aW9uIG1hcHMgdG8uIFRoaXMgaXMgYSBiaXR3aXNlIE9SCi0gICAgICogb2YgemVybyBvciBtb3JlIFNXVCBrZXkgbW9kaWZpZXIgbWFza3MgKGkuZS4gU1dULkNUUkwgb3IgU1dULkFMVCkgYW5kIGEKLSAgICAgKiBjaGFyYWN0ZXIgY29kZS4gRm9yIGV4YW1wbGUsIGZvciBDdHJsK1osIHVzZSA8Y29kZT5TV1QuQ1RSTCB8ICdaJzwvY29kZT4uCi0gICAgICogVXNlIDAgZm9yIG5vIGFjY2VsZXJhdG9yLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm8gbG9uZ2VyIGJlIHVzZWQgZm9yIGFjdGlvbnMgaW4gdGhlIEVjbGlwc2Ugd29ya2JlbmNoLgotICAgICAqIDxjb2RlPklXb3JrYmVuY2hDb21tYW5kU3VwcG9ydDwvY29kZT4gYW5kCi0gICAgICogPGNvZGU+SVdvcmtiZW5jaENvbnRleHRTdXBwb3J0PC9jb2RlPiBwcm92aWRlIGFsbCB0aGUgZnVuY3Rpb25hbGl0eQotICAgICAqIHJlcXVpcmVkIGZvciBrZXkgYmluZGluZ3MuIElmIHlvdSBzZXQgYW4gYWNjZWxlcmF0b3IgdXNpbmcgdGhpcyBtZXRob2QsIHRoZW4KLSAgICAgKiBpdCB3aWxsIG5vdCB3b3JrIGluIHRoZSB3b3JrYmVuY2ggaWYgaXQgY29uZmxpY3RzIGFueSBleGlzdGluZyBrZXkgYmluZGluZywKLSAgICAgKiBvciBpZiB0aGVyZSBpcyBhIGRpZmZlcmVudCBrZXkgYmluZGluZyBkZWZpbmVkIGZvciB0aGlzIGFjdGlvbidzIGRlZmluaXRpb24KLSAgICAgKiBpZC4gVGhlIGRlZmluaXRpb24gaWQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCAtLSByZWZlcnJpbmcgdG8gdGhlIGNvbW1hbmQgaW4KLSAgICAgKiB0aGUgd29ya2JlbmNoIGZyb20gd2hpY2ggdGhlIGtleSBiaW5kaW5nIHNob3VsZCBiZSByZXRyaWV2ZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXljb2RlCi0gICAgICogICAgICAgICAgICB0aGUga2V5Y29kZSB0byBiZSBhY2NlcHRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY2NlbGVyYXRvcihpbnQga2V5Y29kZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vSUNvbnRyaWJ1dGlvbkl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9JQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjg1MDdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9JQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLQotLyoqCi0gKiBBIGNvbnRyaWJ1dGlvbiBpdGVtIHJlcHJlc2VudHMgYSBjb250cmlidXRpb24gdG8gYSBzaGFyZWQgVUkgcmVzb3VyY2Ugc3VjaCBhcyBhCi0gKiBtZW51IG9yIHRvb2wgYmFyLiBNb3JlIGdlbmVyYWxseSwgY29udHJpYnV0aW9uIGl0ZW1zIGFyZSBtYW5hZ2VkIGJ5IGEgY29udHJpYnV0aW9uCi0gKiBtYW5hZ2VyLgotICogRm9yIGluc3RhbmNlLCBpbiBhIHRvb2wgYmFyIGEgY29udHJpYnV0aW9uIGl0ZW0gaXMgYSB0b29sIGJhciBidXR0b24gb3IgYSBzZXBhcmF0b3IuCi0gKiBJbiBhIG1lbnUgYmFyIGEgY29udHJpYnV0aW9uIGl0ZW0gaXMgYSBtZW51LCBhbmQgaW4gYSBtZW51IGEgY29udHJpYnV0aW9uIGl0ZW0gCi0gKiBpcyBhIG1lbnUgaXRlbSBvciBzZXBhcmF0b3IuCi0gKiA8cD4KLSAqIEEgY29udHJpYnV0aW9uIGl0ZW0gY2FuIHJlYWxpemUgaXRzZWxmIGluIGRpZmZlcmVudCBTV1Qgd2lkZ2V0cywgdXNpbmcgdGhlIGRpZmZlcmVudCAKLSAqIDxjb2RlPmZpbGw8L2NvZGU+IG1ldGhvZHMuICBUaGUgc2FtZSB0eXBlIG9mIGNvbnRyaWJ1dGlvbiBpdGVtIGNhbiBiZSB1c2VkIHdpdGggYSAKLSAqIDxjb2RlPk1lbnVCYXJNYW5hZ2VyPC9jb2RlPiwgPGNvZGU+VG9vbEJhck1hbmFnZXI8L2NvZGU+LCA8Y29kZT5Db29sQmFyTWFuYWdlcjwvY29kZT4sIAotICogPC9jb2RlPm9yIGEgPGNvZGU+U3RhdHVzTGluZU1hbmFnZXI8L2NvZGU+LgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlcm5hbCB0byB0aGUgZnJhbWV3b3JrOyBpdCBzaG91bGQgbm90IGJlIGltcGxlbWVudGVkIG91dHNpZGUKLSAqIHRoZSBmcmFtZXdvcmsuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBJQ29udHJpYnV0aW9uTWFuYWdlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250cmlidXRpb25JdGVtIHsKLQotICAgIC8qKgotICAgICAqIERpc3Bvc2VzIG9mIHRoaXMgY29udHJpYnV0aW9uIGl0ZW0uIENhbGxlZCBieSB0aGUgcGFyZW50Ci0gICAgICogY29udHJpYnV0aW9uIG1hbmFnZXIgd2hlbiB0aGUgbWFuYWdlciBpcyBiZWluZyBkaXNwb3NlZC4KLSAgICAgKiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi0gICAgLyoqCi0gICAgICogRmlsbHMgdGhlIGdpdmVuIGNvbXBvc2l0ZSBjb250cm9sIHdpdGggY29udHJvbHMgcmVwcmVzZW50aW5nIHRoaXMgCi0gICAgICogY29udHJpYnV0aW9uIGl0ZW0uICBVc2VkIGJ5IDxjb2RlPlN0YXR1c0xpbmVNYW5hZ2VyPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbChDb21wb3NpdGUgcGFyZW50KTsKLQotICAgIC8qKgotICAgICAqIEZpbGxzIHRoZSBnaXZlbiBtZW51IHdpdGggY29udHJvbHMgcmVwcmVzZW50aW5nIHRoaXMgY29udHJpYnV0aW9uIGl0ZW0uCi0gICAgICogVXNlZCBieSA8Y29kZT5NZW51TWFuYWdlcjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgbWVudQotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggd2hlcmUgdGhlIGNvbnRyb2xzIGFyZSBpbnNlcnRlZCwKLSAgICAgKiAgIG9yIDxjb2RlPi0xPC9jb2RlPiB0byBpbnNlcnQgYXQgdGhlIGVuZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoTWVudSBwYXJlbnQsIGludCBpbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxscyB0aGUgZ2l2ZW4gdG9vbCBiYXIgd2l0aCBjb250cm9scyByZXByZXNlbnRpbmcgdGhpcyBjb250cmlidXRpb24gaXRlbS4KLSAgICAgKiBVc2VkIGJ5IDxjb2RlPlRvb2xCYXJNYW5hZ2VyPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCB0b29sIGJhcgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggd2hlcmUgdGhlIGNvbnRyb2xzIGFyZSBpbnNlcnRlZCwKLSAgICAgKiAgIG9yIDxjb2RlPi0xPC9jb2RlPiB0byBpbnNlcnQgYXQgdGhlIGVuZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoVG9vbEJhciBwYXJlbnQsIGludCBpbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxscyB0aGUgZ2l2ZW4gY29vbCBiYXIgd2l0aCBjb250cm9scyByZXByZXNlbnRpbmcgdGhpcyBjb250cmlidXRpb24gaXRlbS4KLSAgICAgKiBVc2VkIGJ5IDxjb2RlPkNvb2xCYXJNYW5hZ2VyPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb29sIGJhcgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggd2hlcmUgdGhlIGNvbnRyb2xzIGFyZSBpbnNlcnRlZCwKLSAgICAgKiAgIG9yIDxjb2RlPi0xPC9jb2RlPiB0byBpbnNlcnQgYXQgdGhlIGVuZAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsKENvb2xCYXIgcGFyZW50LCBpbnQgaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGlzIGNvbnRyaWJ1dGlvbiBpdGVtLgotICAgICAqIFRoZSBpZCBpcyB1c2VkIGZvciByZXRyaWV2aW5nIGFuIGl0ZW0gZnJvbSBpdHMgbWFuYWdlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNvbnRyaWJ1dGlvbiBpdGVtIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogICBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29udHJpYnV0aW9uIGl0ZW0gaXMgZW5hYmxlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXRlbSBpcyBlbmFibGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb250cmlidXRpb24gaXRlbSBpcyBkaXJ0eS4gQSBkaXJ0eSBpdGVtIHdpbGwgYmUKLSAgICAgKiByZWNyZWF0ZWQgd2hlbiB0aGUgYWN0aW9uIGJhciBpcyB1cGRhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpdGVtIGlzIGRpcnR5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29udHJpYnV0aW9uIGl0ZW0gaXMgZHluYW1pYy4gQSBkeW5hbWljIGNvbnRyaWJ1dGlvbgotICAgICAqIGl0ZW0gY29udHJpYnV0ZXMgaXRlbXMgY29uZGl0aW9uYWxseSwgZGVwZW5kZW50IG9uIHNvbWUgaW50ZXJuYWwgc3RhdGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXRlbSBpcyBkeW5hbWljLCBhbmQKLSAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBub3JtYWwgaXRlbXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbnRyaWJ1dGlvbiBpdGVtIGlzIGEgZ3JvdXAgbWFya2VyLgotICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB3aGVuIGFkZGluZyBpdGVtcyB0byBhIGdyb3VwLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGl0ZW0gaXMgYSBncm91cCBtYXJrZXIsIGFuZAotICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIG5vcm1hbCBpdGVtcwotICAgICAqCi0gICAgICogQHNlZSBHcm91cE1hcmtlcgotICAgICAqIEBzZWUgSUNvbnRyaWJ1dGlvbk1hbmFnZXIjYXBwZW5kVG9Hcm91cChTdHJpbmcsIElDb250cmlidXRpb25JdGVtKQotICAgICAqIEBzZWUgSUNvbnRyaWJ1dGlvbk1hbmFnZXIjcHJlcGVuZFRvR3JvdXAoU3RyaW5nLCBJQ29udHJpYnV0aW9uSXRlbSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dyb3VwTWFya2VyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb250cmlidXRpb24gaXRlbSBpcyBhIHNlcGFyYXRvci4KLSAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gZW5hYmxlIGhpZGluZyBvZiB1bm5lY2Vzc2FyeSBzZXBhcmF0b3JzLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGl0ZW0gaXMgYSBzZXBhcmF0b3IsIGFuZAotICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIG5vcm1hbCBpdGVtcwotICAgICAqIEBzZWUgU2VwYXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXBhcmF0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbnRyaWJ1dGlvbiBpdGVtIGlzIHZpc2liaWxlIHdpdGhpbiBpdHMgbWFuYWdlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpdGVtIGlzIHZpc2libGUsIGFuZAotICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyBhbnkgc3RhdGUgaW5mb3JtYXRpb24gb2YgdGhlIGNvbnRyb2wocykgb3duZWQgYnkgdGhpcyBjb250cmlidXRpb24gaXRlbS4KLSAgICAgKiBUaGUgY29udHJpYnV0aW9uIG1hbmFnZXIgY2FsbHMgdGhpcyBtZXRob2QgYmVmb3JlIGRpc3Bvc2luZyBvZiB0aGUgY29udHJvbHMuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVXaWRnZXRTdGF0ZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcGFyZW50IG1hbmFnZXIgb2YgdGhpcyBpdGVtCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyaWJ1dGlvbiBtYW5hZ2VyCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChJQ29udHJpYnV0aW9uTWFuYWdlciBwYXJlbnQpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRoaXMgY29udHJpYnV0aW9uIGl0ZW0gaXMgdmlzaWJpbGUgd2l0aGluIGl0cyBtYW5hZ2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIHZpc2libGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpdGVtIHNob3VsZCBiZSB2aXNpYmxlLCBhbmQKLSAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYW55IFNXVCBjb250cm9scyBjYWNoZWQgYnkgdGhpcyBjb250cmlidXRpb24gaXRlbSB3aXRoIGFueQotICAgICAqIGNoYW5nZXMgd2hpY2ggaGF2ZSBiZWVuIG1hZGUgdG8gdGhpcyBjb250cmlidXRpb24gaXRlbSBzaW5jZSB0aGUgbGFzdCB1cGRhdGUuCi0gICAgICogQ2FsbGVkIGJ5IGNvbnRyaWJ1dGlvbiBtYW5hZ2VyIHVwZGF0ZSBtZXRob2RzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyBhbnkgU1dUIGNvbnRyb2xzIGNhY2hlZCBieSB0aGlzIGNvbnRyaWJ1dGlvbiBpdGVtIHdpdGggY2hhbmdlcwotICAgICAqIGZvciB0aGUgdGhlIGdpdmVuIHByb3BlcnR5LiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5Ci0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgaWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0lDb250cmlidXRpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vSUNvbnRyaWJ1dGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczNzkyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vSUNvbnRyaWJ1dGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uOwotCi0vKioKLSAqIEEgY29udHJpYnV0aW9uIG1hbmFnZXIgb3JnYW5pemVzIGNvbnRyaWJ1dGlvbnMgdG8gc3VjaCBVSSBjb21wb25lbnRzCi0gKiBhcyBtZW51cywgdG9vbGJhcnMgYW5kIHN0YXR1cyBsaW5lcy4KLSAqIDxwPgotICogQSBjb250cmlidXRpb24gbWFuYWdlciBrZWVwcyB0cmFjayBvZiBhIGxpc3Qgb2YgY29udHJpYnV0aW9uCi0gKiBpdGVtcy4gRWFjaCBjb250cmlidXRpb24gaXRlbSBtYXkgaGFzIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkCi0gKiB0byByZXRyaWV2ZSBpdGVtcyBmcm9tIGEgbWFuYWdlciwgYW5kIGZvciBwb3NpdGlvbmluZyBpdGVtcyByZWxhdGl2ZSB0bwotICogZWFjaCBvdGhlci4gVGhlIGxpc3Qgb2YgY29udHJpYnV0aW9uIGl0ZW1zIGNhbiBiZSBzdWJkaXZpZGVkIGludG8gbmFtZWQgZ3JvdXBzIAotICogdXNpbmcgc3BlY2lhbCBjb250cmlidXRpb24gaXRlbXMgdGhhdCBzZXJ2ZSBhcyBncm91cCBtYXJrZXJzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgPGNvZGU+SUNvbnRyaWJ1dGlvbk1hbmFnZXI8L2NvZGU+IGludGVyZmFjZSBwcm92aWRlcyBnZW5lcmFsCi0gKiBwcm90b2NvbCBmb3IgYWRkaW5nLCByZW1vdmluZywgYW5kIHJldHJpZXZpbmcgY29udHJpYnV0aW9uIGl0ZW1zLgotICogSXQgYWxzbyBwcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIHRoYXQgbWFrZSBpdCBjb252ZW5pZW50Ci0gKiB0byBjb250cmlidXRlIGFjdGlvbnMuIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZAotICogYnkgYWxsIG9iamVjdHMgdGhhdCB3aXNoIHRvIG1hbmFnZSBjb250cmlidXRpb25zLgotICogPC9wPgotICogPHA+Ci0gKiBUaGVyZSBhcmUgc2V2ZXJhbCBpbXBsZW1lbnRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGluIHRoaXMgcGFja2FnZSwKLSAqIGluY2x1ZGluZyBvbmVzIGZvciBtZW51cyAoe0BsaW5rIE1lbnVNYW5hZ2VyIDxjb2RlPk1lbnVNYW5hZ2VyPC9jb2RlPn0pLAotICogdG9vbCBiYXJzICh7QGxpbmsgVG9vbEJhck1hbmFnZXIgPGNvZGU+VG9vbEJhck1hbmFnZXI8L2NvZGU+fSksCi0gKiBhbmQgc3RhdHVzIGxpbmVzICh7QGxpbmsgU3RhdHVzTGluZU1hbmFnZXIgPGNvZGU+U3RhdHVzTGluZU1hbmFnZXI8L2NvZGU+fSkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRyaWJ1dGlvbk1hbmFnZXIgewotICAgIC8qKgotICAgICAqIEFkZHMgYW4gYWN0aW9uIGFzIGEgY29udHJpYnV0aW9uIGl0ZW0gdG8gdGhpcyBtYW5hZ2VyLgotICAgICAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+YWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbikpPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChJQWN0aW9uIGFjdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY29udHJpYnV0aW9uIGl0ZW0gdG8gdGhpcyBtYW5hZ2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW0gdGhlIGNvbnRyaWJ1dGlvbiBpdGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKElDb250cmlidXRpb25JdGVtIGl0ZW0pOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGNvbnRyaWJ1dGlvbiBpdGVtIGZvciB0aGUgZ2l2ZW4gYWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGdyb3VwCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBFcXVpdmFsZW50IHRvCi0gICAgICogPGNvZGU+YXBwZW5kVG9Hcm91cChncm91cE5hbWUsbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKSk8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGdyb3VwTmFtZSB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAKLSAgICAgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24KLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBncm91cCB3aXRoCi0gICAgICogICB0aGUgZ2l2ZW4gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvR3JvdXAoU3RyaW5nIGdyb3VwTmFtZSwgSUFjdGlvbiBhY3Rpb24pOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGNvbnRyaWJ1dGlvbiBpdGVtIHRvIHRoaXMgbWFuYWdlciBhdCB0aGUgZW5kIG9mIHRoZSBncm91cAotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIHRoZSBuYW1lIG9mIHRoZSBncm91cAotICAgICAqIEBwYXJhbSBpdGVtIHRoZSBjb250cmlidXRpb24gaXRlbQotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGdyb3VwIHdpdGgKLSAgICAgKiAgIHRoZSBnaXZlbiBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kVG9Hcm91cChTdHJpbmcgZ3JvdXBOYW1lLCBJQ29udHJpYnV0aW9uSXRlbSBpdGVtKTsKLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBjb250cmlidXRpb24gaXRlbSB3aXRoIHRoZSBnaXZlbiBpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpZCB0aGUgY29udHJpYnV0aW9uIGl0ZW0gaWQKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250cmlidXRpb24gaXRlbSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAgKiAgIG5vIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gaWQgY2FuIGJlIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIElDb250cmlidXRpb25JdGVtIGZpbmQoU3RyaW5nIGlkKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGNvbnRyaWJ1dGlvbiBpdGVtcyBrbm93biB0byB0aGlzIG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBjb250cmlidXRpb24gaXRlbXMKLSAgICAgKi8KLSAgICBwdWJsaWMgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBnZXRJdGVtcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb3ZlcnJpZGVzIGZvciB0aGUgaXRlbXMgb2YgdGhpcyBtYW5hZ2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG92ZXJyaWRlcyBmb3IgdGhlIGl0ZW1zIG9mIHRoaXMgbWFuYWdlcgotICAgICAqIEBzaW5jZSAyLjAgCi0gICAgICovCi0gICAgcHVibGljIElDb250cmlidXRpb25NYW5hZ2VyT3ZlcnJpZGVzIGdldE92ZXJyaWRlcygpOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhIGNvbnRyaWJ1dGlvbiBpdGVtIGZvciB0aGUgZ2l2ZW4gYWN0aW9uIGFmdGVyIHRoZSBpdGVtIAotICAgICAqIHdpdGggdGhlIGdpdmVuIGlkLgotICAgICAqIEVxdWl2YWxlbnQgdG8KLSAgICAgKiA8Y29kZT5pbnNlcnRBZnRlcihpZCxuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtIGlkCi0gICAgICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHRvIGluc2VydAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGl0ZW0gd2l0aAotICAgICAqICAgdGhlIGdpdmVuIGlkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0QWZ0ZXIoU3RyaW5nIGlkLCBJQWN0aW9uIGFjdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgY29udHJpYnV0aW9uIGl0ZW0gYWZ0ZXIgdGhlIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gaWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtIGlkCi0gICAgICogQHBhcmFtIGl0ZW0gdGhlIGNvbnRyaWJ1dGlvbiBpdGVtIHRvIGluc2VydAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGl0ZW0gd2l0aAotICAgICAqICAgdGhlIGdpdmVuIGlkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0QWZ0ZXIoU3RyaW5nIGlkLCBJQ29udHJpYnV0aW9uSXRlbSBpdGVtKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBjb250cmlidXRpb24gaXRlbSBmb3IgdGhlIGdpdmVuIGFjdGlvbiBiZWZvcmUgdGhlIGl0ZW0gCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gaWQuCi0gICAgICogRXF1aXZhbGVudCB0bwotICAgICAqIDxjb2RlPmluc2VydEJlZm9yZShpZCxuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtIGlkCi0gICAgICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHRvIGluc2VydAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGl0ZW0gd2l0aAotICAgICAqICAgdGhlIGdpdmVuIGlkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0QmVmb3JlKFN0cmluZyBpZCwgSUFjdGlvbiBhY3Rpb24pOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhIGNvbnRyaWJ1dGlvbiBpdGVtIGJlZm9yZSB0aGUgaXRlbSB3aXRoIHRoZSBnaXZlbiBpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpZCB0aGUgY29udHJpYnV0aW9uIGl0ZW0gaWQKLSAgICAgKiBAcGFyYW0gaXRlbSB0aGUgY29udHJpYnV0aW9uIGl0ZW0gdG8gaW5zZXJ0Ci0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gaXRlbSB3aXRoCi0gICAgICogICB0aGUgZ2l2ZW4gaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRCZWZvcmUoU3RyaW5nIGlkLCBJQ29udHJpYnV0aW9uSXRlbSBpdGVtKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbGlzdCBvZiBjb250cmlidXRpb25zIGhhcyByZWNlbnRseSBjaGFuZ2VkIGFuZAotICAgICAqIGhhcyB5ZXQgdG8gYmUgcmVmbGVjdGVkIGluIHRoZSBjb3JyZXNwb25kaW5nIHdpZGdldHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWFuYWdlciBpcyBkaXJ0eSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgaWYgaXQgaXMgdXAtdG8tZGF0ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hbmFnZXIgaGFzIGFueSBjb250cmlidXRpb24gaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBpdGVtcywgYW5kCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpOwotCi0gICAgLyoqCi0gICAgICogTWFya3MgdGhpcyBjb250cmlidXRpb24gbWFuYWdlciBhcyBkaXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtYXJrRGlydHkoKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBjb250cmlidXRpb24gaXRlbSBmb3IgdGhlIGdpdmVuIGFjdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSAKLSAgICAgKiBncm91cCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIEVxdWl2YWxlbnQgdG8KLSAgICAgKiA8Y29kZT5wcmVwZW5kVG9Hcm91cChncm91cE5hbWUsbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKSk8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGdyb3VwTmFtZSB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAKLSAgICAgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24KLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBncm91cCB3aXRoCi0gICAgICogICB0aGUgZ2l2ZW4gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByZXBlbmRUb0dyb3VwKFN0cmluZyBncm91cE5hbWUsIElBY3Rpb24gYWN0aW9uKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBjb250cmlidXRpb24gaXRlbSB0byB0aGlzIG1hbmFnZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgCi0gICAgICogZ3JvdXAgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBncm91cE5hbWUgdGhlIG5hbWUgb2YgdGhlIGdyb3VwCi0gICAgICogQHBhcmFtIGl0ZW0gdGhlIGNvbnRyaWJ1dGlvbiBpdGVtCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gZ3JvdXAgd2l0aAotICAgICAqICAgdGhlIGdpdmVuIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmVwZW5kVG9Hcm91cChTdHJpbmcgZ3JvdXBOYW1lLCBJQ29udHJpYnV0aW9uSXRlbSBpdGVtKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtIHdpdGggdGhlIGdpdmVuIGlkIGZyb20gdGhpcyBtYW5hZ2VyLiAgCi0gICAgICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG1hbmFnZXIgaGFzIG5vIGNvbnRyaWJ1dGlvbiBpdGVtcwotICAgICAqIHdpdGggdGhlIGdpdmVuIGlkLgotICAgICAqCi0gICAgICogQHBhcmFtIGlkIHRoZSBjb250cmlidXRpb24gaXRlbSBpZAotICAgICAqIEByZXR1cm4gdGhlIGl0ZW0gdGhhdCB3YXMgZm91bmQgYW5kIHJlbW92ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgSUNvbnRyaWJ1dGlvbkl0ZW0gcmVtb3ZlKFN0cmluZyBpZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb250cmlidXRpb24gaXRlbSBmcm9tIHRoZSBjb250cmlidXRpb24gaXRlbXMKLSAgICAgKiBrbm93biB0byB0aGlzIG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbSB0aGUgY29udHJpYnV0aW9uIGl0ZW0KLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5pdGVtPC9jb2RlPiBwYXJhbWV0ZXIgaWYgdGhlIGl0ZW0gd2FzIHJlbW92ZWQsCi0gICAgICogICBhbmQgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgd2FzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbSByZW1vdmUoSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBjb250cmlidXRpb24gaXRlbXMgZnJvbSB0aGlzIG1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoaXMgbWFuYWdlcidzIHVuZGVybHlpbmcgd2lkZ2V0KHMpIHdpdGggYW55IGNoYW5nZXMgd2hpY2gKLSAgICAgKiBoYXZlIGJlZW4gbWFkZSB0byBpdCBvciBpdHMgaXRlbXMuICBOb3JtYWxseSBjaGFuZ2VzIHRvIGEgY29udHJpYnV0aW9uCi0gICAgICogbWFuYWdlciBtZXJlbHkgbWFyayBpdCBhcyBkaXJ0eSwgd2l0aG91dCB1cGRhdGluZyB0aGUgdW5kZXJseWluZyB3aWRnZXRzLgotICAgICAqIFRoaXMgYnJpbmdzIHRoZSB1bmRlcmx5aW5nIHdpZGdldHMgdXAgdG8gZGF0ZSB3aXRoIGFueSBjaGFuZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcmNlIDxjb2RlPnRydWU8L2NvZGU+IG1lYW5zIHVwZGF0ZSBldmVuIGlmIG5vdCBkaXJ0eSwKLSAgICAgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIG5vcm1hbCBpbmNyZW1lbnRhbCB1cGRhdGluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShib29sZWFuIGZvcmNlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9JQ29udHJpYnV0aW9uTWFuYWdlck92ZXJyaWRlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0lDb250cmlidXRpb25NYW5hZ2VyT3ZlcnJpZGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjQ1YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0lDb250cmlidXRpb25NYW5hZ2VyT3ZlcnJpZGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaW5zdGFuY2VzIG9mIDxjb2RlPklDb250cmlidXRpb25JdGVtPC9jb2RlPgotICogdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZXMgZm9yIGNlcnRhaW4gcHJvcGVydGllcyBoYXZlIGJlZW4gb3ZlcnJpZGVuCi0gKiBieSB0aGVpciBtYW5hZ2VyLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlcm5hbCB0byB0aGUgZnJhbWV3b3JrOyBpdCBzaG91bGQgbm90IGJlIGltcGxlbWVudGVkIG91dHNpZGUKLSAqIHRoZSBmcmFtZXdvcmsuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udHJpYnV0aW9uTWFuYWdlck92ZXJyaWRlcyB7Ci0gICAgLyoqCi0gICAgICogSWQgZm9yIHRoZSBlbmFibGVkIHByb3BlcnR5LiBWYWx1ZSBpcyA8Y29kZT4iZW5hYmxlZCI8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0VOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+Qm9vbGVhbi5UUlVFPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gY29udHJpYnV0aW9uIGl0ZW0gc2hvdWxkIAotICAgICAqIGJlIGVuYWJsZWQsIDxjb2RlPkJvb2xlYW4uRkFMU0U8L2NvZGU+IGlmIHRoZSBpdGVtIHNob3VsZCBiZSBkaXNhYmxlZCwgYW5kCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGl0ZW0gbWF5IGRldGVybWluZSBpdHMgb3duIGVuYWJsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZW0gdGhlIGNvbnRyaWJ1dGlvbiBpdGVtIGZvciB3aGljaCB0aGUgZW5hYmxlIG92ZXJyaWRlIHZhbHVlIGlzIAotICAgICAqIGRldGVybWluZWQKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW4gZ2V0RW5hYmxlZChJQ29udHJpYnV0aW9uSXRlbSBpdGVtKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgbm90IGludGVuZGVkIHRvIGJlIGNhbGxlZCBvdXRzaWRlIG9mIHRoZSB3b3JrYmVuY2guIFRoaXMgbWV0aG9kCi0gICAgICogaXMgaW50ZW5kZWQgdG8gYmUgZGVwcmVjYXRlZCBpbiAzLjEuCi0gICAgICogCi0gICAgICogVE9ETyBkZXByZWNhdGUgZm9yIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBJbnRlZ2VyIGdldEFjY2VsZXJhdG9yKElDb250cmlidXRpb25JdGVtIGl0ZW0pOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIG91dHNpZGUgb2YgdGhlIHdvcmtiZW5jaC4gVGhpcyBtZXRob2QKLSAgICAgKiBpcyBpbnRlbmRlZCB0byBiZSBkZXByZWNhdGVkIGluIDMuMS4KLSAgICAgKiAKLSAgICAgKiBUT0RPIGRlcHJlY2F0ZSBmb3IgMy4xCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBY2NlbGVyYXRvclRleHQoSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgb3V0c2lkZSBvZiB0aGUgd29ya2JlbmNoLiBUaGlzIG1ldGhvZAotICAgICAqIGlzIGludGVuZGVkIHRvIGJlIGRlcHJlY2F0ZWQgaW4gMy4xLgotICAgICAqIAotICAgICAqIFRPRE8gZGVwcmVjYXRlIGZvciAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vSUNvb2xCYXJNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vSUNvb2xCYXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOWZiYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0lDb29sQmFyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyOwotCi0vKioKLSAqIFRoZSA8Y29kZT5JQ29vbEJhck1hbmFnZXI8L2NvZGU+IGludGVyZmFjZSBwcm92aWRlcyBwcm90b2NvbCBmb3IgbWFuYWdpbmcKLSAqIGNvbnRyaWJ1dGlvbnMgdG8gYSBjb29sIGJhci4gQSBjb29sIGJhciBtYW5hZ2VyIGRlbGVnYXRlcyByZXNwb25zaWJpbGl0eSBmb3IKLSAqIGNyZWF0aW5nIGNoaWxkIGNvbnRyb2xzIHRvIGl0cyBjb250cmlidXRpb24gaXRlbXMgYnkgY2FsbGluZwotICoge0BsaW5rIElDb250cmlidXRpb25JdGVtI2ZpbGwoQ29vbEJhciwgaW50KX0uCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcms7IGl0IHNob3VsZCBub3QgYmUgaW1wbGVtZW50ZWQKLSAqIG91dHNpZGUgdGhlIGZyYW1ld29yay4gVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgY29uY3JldGUgY29vbCBiYXIgbWFuYWdlcgotICogaW1wbGVtZW50YXRpb24sIHtAbGluayBDb29sQmFyTWFuYWdlcn0sIHdoaWNoCi0gKiBjbGllbnRzIG1heSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBUb29sQmFyQ29udHJpYnV0aW9uSXRlbQotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb29sQmFyTWFuYWdlciBleHRlbmRzIElDb250cmlidXRpb25NYW5hZ2VyIHsKLQotICAgIC8qKgotICAgICAqIFByb3BlcnR5IG5hbWUgb2YgYSBjb29sIGl0ZW0ncyBzaXplICh2YWx1ZSA8Y29kZT4ic2l6ZSI8L2NvZGU+KS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29vbCBiYXIgbWFuYWdlciB1c2VzIHRoaXMgcHJvcGVydHkgdG8gdGVsbCBpdHMgY29vbCBpdGVtcyB0byB1cGRhdGUKLSAgICAgKiB0aGVpciBzaXplLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAc2VlIElDb250cmlidXRpb25JdGVtI3VwZGF0ZShTdHJpbmcpIEBpc3N1ZSBjb25zaWRlciBkZWNsYXJpbmcgdGhpcwotICAgICAqICAgICAgY29uc3RhbnQgZWxzZXdoZXJlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0laRSA9ICJzaXplIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIGEgdG9vbCBiYXIgYXMgYSBjb250cmlidXRpb24gaXRlbSB0byB0aGlzCi0gICAgICogY29vbCBiYXIgbWFuYWdlci4gRXF1aXZhbGVudCB0byA8Y29kZT5hZGQobmV3IFRvb2xCYXJDb250cmlidXRpb25NYW5hZ2VyKHRvb2xCYXJNYW5hZ2VyKSk8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b29sQmFyTWFuYWdlcgotICAgICAqICAgICAgICAgICAgdGhlIHRvb2wgYmFyIG1hbmFnZXIgdG8gYmUgYWRkZWQKLSAgICAgKiBAc2VlIFRvb2xCYXJDb250cmlidXRpb25JdGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZXh0IG1lbnUgbWFuYWdlciB1c2VkIGJ5IHRoaXMgY29vbCBiYXIgbWFuYWdlci4gVGhpcwotICAgICAqIGNvbnRleHQgbWVudSBtYW5hZ2VyIGlzIHVzZWQgYnkgdGhlIGNvb2wgYmFyIG1hbmFnZXIgZXhjZXB0IGZvciBjb29sCi0gICAgICogaXRlbXMgdGhhdCBwcm92aWRlIHRoZWlyIG93bi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZXh0IG1lbnUgbWFuYWdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBzZWUgI3NldENvbnRleHRNZW51TWFuYWdlcgotICAgICAqLwotICAgIHB1YmxpYyBJTWVudU1hbmFnZXIgZ2V0Q29udGV4dE1lbnVNYW5hZ2VyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxheW91dCBvZiB0aGUgdW5kZXJseWluZyBjb29sIGJhciB3aWRnZXQgaXMgbG9ja2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29vbCBiYXIgbGF5b3V0IGlzIGxvY2tlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRMb2NrTGF5b3V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBvZiB0aGUgdW5kZXJseWluZyBjb29sIGJhciB3aWRnZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3R5bGUgb2YgdGhlIGNvb2wgYmFyCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTdHlsZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGV4dCBtZW51IG9mIHRoaXMgY29vbCBiYXIgbWFuYWdlciB0byB0aGUgZ2l2ZW4gbWVudQotICAgICAqIG1hbmFnZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lbnVNYW5hZ2VyCi0gICAgICogICAgICAgICAgICB0aGUgY29udGV4dCBtZW51IG1hbmFnZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAc2VlICNnZXRDb250ZXh0TWVudU1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0TWVudU1hbmFnZXIoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKTsKLQotICAgIC8qKgotICAgICAqIExvY2tzIG9yIHVubG9ja3MgdGhlIGxheW91dCBvZiB0aGUgdW5kZXJseWluZyBjb29sIGJhciB3aWRnZXQuIE9uY2UgdGhlCi0gICAgICogY29vbCBiYXIgaXMgbG9ja2VkLCBjb29sIGl0ZW1zIGNhbm5vdCBiZSByZXBvc2l0aW9uZWQgYnkgdGhlIHVzZXIuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IGl0ZW1zIGNhbiBiZSBhZGRlZCBvciByZW1vdmVkIHByb2dyYW1tYXRpY2FsbHkgZXZlbiB3aGlsZSB0aGUKLSAgICAgKiBjb29sIGJhciBpcyBsb2NrZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbG9jayB0aGUgY29vbCBiYXIsIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgICAgdG8gdW5sb2NrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9ja0xheW91dChib29sZWFuIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0lNZW51Q3JlYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0lNZW51Q3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGM1OTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9JTWVudUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBzb21ldGhpbmcgdGhhdCBjcmVhdGVzIGFuZCBkaXNwb3NlcyBvZiBTV1QgbWVudXMuICBOb3RlIHRoYXQKLSAqIGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgaW1wbGVtZW50b3IgdG8gZGlzcG9zZSBvZiBTV1QgbWVudXMgaXQKLSAqIGNyZWF0ZXMuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZW51Q3JlYXRvciB7Ci0gICAgLyoqCi0gICAgICogRGlzcG9zZXMgdGhlIG1lbnUgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0TWVudTwvY29kZT4uIERvZXMgbm90aGluZwotICAgICAqIGlmIHRoZXJlIGlzIG5vIG1lbnUuICBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUKLSAgICAgKiBwYXJlbnQgb2YgdGhlIG1lbnUgaXMgZGlzcG9zZWQuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTV1QgbWVudSwgY3JlYXRlZCBhcyBhIHBvcCB1cCBtZW51IHBhcmVudGVkIGJ5IHRoZQotICAgICAqIGdpdmVuIGNvbnRyb2wuICBJbiBtb3N0IGNhc2VzLCB0aGlzIG1lbnUgY2FuIGJlIGNyZWF0ZWQgb25jZSwgY2FjaGVkIGFuZCByZXVzZWQKLSAgICAgKiB3aGVuIHRoZSBwb3AtdXAvZHJvcC1kb3duIGFjdGlvbiBvY2N1cnMuICBJZiB0aGUgbWVudSBtdXN0IGJlIGR5bmFtaWNhbGx5Ci0gICAgICogY3JlYXRlZCAoaS5lLiwgZWFjaCB0aW1lIGl0IGlzIHBvcHBlZCB1cCBvciBkcm9wcGVkIGRvd24pLCB0aGUgb2xkIG1lbnUKLSAgICAgKiBzaG91bGQgYmUgZGlzcG9zZWQgb2YgYmVmb3JlIHJlcGxhY2luZyBpdCB3aXRoIHRoZSBuZXcgbWVudS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHJldHVybiB0aGUgbWVudSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1lbnUgY291bGQgbm90Ci0gICAgICogIGJlIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVudSBnZXRNZW51KENvbnRyb2wgcGFyZW50KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gU1dUIG1lbnUgY3JlYXRlZCBhcyBhIGRyb3AgZG93biBtZW51IHBhcmVudGVkIGJ5IHRoZQotICAgICAqIGdpdmVuIG1lbnUuICBJbiBtb3N0IGNhc2VzLCB0aGlzIG1lbnUgY2FuIGJlIGNyZWF0ZWQgb25jZSwgY2FjaGVkIGFuZCByZXVzZWQKLSAgICAgKiB3aGVuIHRoZSBwb3AtdXAvZHJvcC1kb3duIGFjdGlvbiBvY2N1cnMuICBJZiB0aGUgbWVudSBtdXN0IGJlIGR5bmFtaWNhbGx5Ci0gICAgICogY3JlYXRlZCAoaS5lLiwgZWFjaCB0aW1lIGl0IGlzIHBvcHBlZCB1cCBvciBkcm9wcGVkIGRvd24pLCB0aGUgb2xkIG1lbnUKLSAgICAgKiBzaG91bGQgYmUgZGlzcG9zZWQgb2YgYmVmb3JlIHJlcGxhY2luZyBpdCB3aXRoIHRoZSBuZXcgbWVudS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBtZW51Ci0gICAgICogQHJldHVybiB0aGUgbWVudSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1lbnUgY291bGQgbm90Ci0gICAgICogIGJlIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9JTWVudUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vSU1lbnVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDBiMDA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9JTWVudUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uOwotCi0vKioKLSAqIEEgbWVudSBsaXN0ZW5lciB0aGF0IGdldHMgaW5mb3JtZWQgd2hlbiBhIG1lbnUgaXMgYWJvdXQgdG8gc2hvdy4KLSAqCi0gKiBAc2VlIE1lbnVNYW5hZ2VyI2FkZE1lbnVMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZW51TGlzdGVuZXIgewotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgbWVudSBpcyBhYm91dCB0byBiZSBzaG93biBieQotICAgICAqIHRoZSBnaXZlbiBtZW51IG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFuYWdlciB0aGUgbWVudSBtYW5hZ2VyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9JTWVudUxpc3RlbmVyMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0lNZW51TGlzdGVuZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNTdiY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0lNZW51TGlzdGVuZXIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uOwotCi0vKioKLSAqIEEgbWVudSBsaXN0ZW5lciB0aGF0IGdldHMgaW5mb3JtZWQgd2hlbiBhIG1lbnUgaXMgYWJvdXQgdG8gaGlkZS4KLSAqCi0gKiBAc2VlIE1lbnVNYW5hZ2VyI2FkZE1lbnVMaXN0ZW5lcgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZW51TGlzdGVuZXIyIGV4dGVuZHMgSU1lbnVMaXN0ZW5lciB7Ci0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBtZW51IGlzIGFib3V0IHRvIGJlIGhpZGRlbiBieQotICAgICAqIHRoZSBnaXZlbiBtZW51IG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFuYWdlciB0aGUgbWVudSBtYW5hZ2VyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVudUFib3V0VG9IaWRlKElNZW51TWFuYWdlciBtYW5hZ2VyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9JTWVudU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9JTWVudU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMTc2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vSU1lbnVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+SU1lbnVNYW5hZ2VyPC9jb2RlPiBpbnRlcmZhY2UgcHJvdmlkZXMgcHJvdG9jb2wgZm9yIG1hbmFnaW5nCi0gKiBjb250cmlidXRpb25zIHRvIGEgbWVudSBiYXIgYW5kIGl0cyBzdWIgbWVudXMuCi0gKiBBbiA8Y29kZT5JTWVudU1hbmFnZXI8L2NvZGU+IGlzIGFsc28gYW4gPGNvZGU+SUNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+LAotICogYWxsb3dpbmcgc3ViLW1lbnVzIHRvIGJlIG5lc3RlZCBpbiBwYXJlbnQgbWVudXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcms7IGl0IHNob3VsZCBub3QgYmUgaW1wbGVtZW50ZWQgb3V0c2lkZQotICogdGhlIGZyYW1ld29yay4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgY29uY3JldGUgbWVudSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uLAotICoge0BsaW5rIE1lbnVNYW5hZ2VyIDxjb2RlPk1lbnVNYW5hZ2VyPC9jb2RlPn0uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lbnVNYW5hZ2VyIGV4dGVuZHMgSUNvbnRyaWJ1dGlvbk1hbmFnZXIsIElDb250cmlidXRpb25JdGVtIHsKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbWVudSBsaXN0ZW5lciB0byB0aGlzIG1lbnUuCi0gICAgICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIGEgbWVudSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1lbnVMaXN0ZW5lcihJTWVudUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBtYW5hZ2VyIGZvciB0aGUgbWVudSBhdCB0aGUgZ2l2ZW4gcGF0aC4gQSBwYXRoCi0gICAgICogY29uc2lzdHMgb2YgY29udHJpYnV0aW9uIGl0ZW0gaWRzIHNlcGFyYXRlZCBieSB0aGUgc2VwYXJhdG9yIAotICAgICAqIGNoYXJhY3Rlci4gIFRoZSBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIgaXMgPGNvZGU+Jy8nPC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBDb252ZW5pZW5jZSBmb3IgPGNvZGU+ZmluZFVzaW5nUGF0aChwYXRoKTwvY29kZT4gd2hpY2gKLSAgICAgKiBleHRyYWN0cyBhbiA8Y29kZT5JTWVudU1hbmFnZXI8L2NvZGU+IGlmIHBvc3NpYmxlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHN0cmluZwotICAgICAqIEByZXR1cm4gdGhlIG1lbnUgY29udHJpYnV0aW9uIGl0ZW0sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogICBpZiB0aGVyZSBpcyBubyBzdWNoIGNvbnRyaWJ1dGlvbiBpdGVtIG9yIGlmIHRoZSBpdGVtIGRvZXMKLSAgICAgKiAgIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgbWVudSBtYW5hZ2VyCi0gICAgICovCi0gICAgcHVibGljIElNZW51TWFuYWdlciBmaW5kTWVudVVzaW5nUGF0aChTdHJpbmcgcGF0aCk7Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyB0aGUgY29udHJpYnV0aW9uIGl0ZW0gYXQgdGhlIGdpdmVuIHBhdGguIEEgcGF0aAotICAgICAqIGNvbnNpc3RzIG9mIGNvbnRyaWJ1dGlvbiBpdGVtIGlkcyBzZXBhcmF0ZWQgYnkgdGhlIHNlcGFyYXRvciAKLSAgICAgKiBjaGFyYWN0ZXIuIFRoZSBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIgaXMgPGNvZGU+Jy8nPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHN0cmluZwotICAgICAqIEByZXR1cm4gdGhlIGNvbnRyaWJ1dGlvbiBpdGVtLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotICAgICAqICAgc3VjaCBjb250cmlidXRpb24gaXRlbQotICAgICAqLwotICAgIHB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbSBmaW5kVXNpbmdQYXRoKFN0cmluZyBwYXRoKTsKLQotICAgIC8qKgotCSAqIFJldHVybnMgd2hldGhlciBhbGwgaXRlbXMgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB0aGUgbWVudSBpcyBhYm91dCB0bwotCSAqIHNob3csIGJ1dCBiZWZvcmUgbm90aWZ5aW5nIG1lbnUgbGlzdGVuZXJzLiBUaGUgZGVmYXVsdCBpcwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBpdGVtcyBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHNob3duLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFJlbW92ZUFsbFdoZW5TaG93bigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbWVudSBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVuYWJsZWQsIGFuZAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGRpc2FibGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBtZW51IGxpc3RlbmVyIGZyb20gdGhpcyBtZW51LgotICAgICAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBtZW51IGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTWVudUxpc3RlbmVyKElNZW51TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0JICogU2V0cyB3aGV0aGVyIGFsbCBpdGVtcyBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHRoZSBtZW51IGlzIGFib3V0IHRvIHNob3csCi0JICogYnV0IGJlZm9yZSBub3RpZnlpbmcgbWVudSBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIHJlbW92ZUFsbAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWxsIGl0ZW1zIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gc2hvd24sCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0JICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlQWxsV2hlblNob3duKGJvb2xlYW4gcmVtb3ZlQWxsKTsKLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudGFsbHkgYnVpbGRzIHRoZSBtZW51IGZyb20gdGhlIGNvbnRyaWJ1dGlvbiBpdGVtcywgYW5kCi0gICAgICogZG9lcyBzbyByZWN1cnNpdmVseSBmb3IgYWxsIHN1Ym1lbnVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcmNlIDxjb2RlPnRydWU8L2NvZGU+IG1lYW5zIHVwZGF0ZSBldmVuIGlmIG5vdCBkaXJ0eSwKLSAgICAgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIG5vcm1hbCBpbmNyZW1lbnRhbCB1cGRhdGluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFsbChib29sZWFuIGZvcmNlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9JU3RhdHVzTGluZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9JU3RhdHVzTGluZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNhMDg5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vSVN0YXR1c0xpbmVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGUgPGNvZGU+SVN0YXR1c0xpbmVNYW5hZ2VyPC9jb2RlPiBpbnRlcmZhY2UgcHJvdmlkZXMgcHJvdG9jb2wKLSAqIGZvciBkaXNwbGF5aW5nIG1lc3NhZ2VzIG9uIGEgc3RhdHVzIGxpbmUsIGZvciBtb25pdG9yaW5nIHByb2dyZXNzLAotICogYW5kIGZvciBtYW5hZ2luZyBjb250cmlidXRpb25zIHRvIHRoZSBzdGF0dXMgbGluZS4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IEFuIGVycm9yIG1lc3NhZ2Ugb3ZlcnJpZGVzIHRoZSBjdXJyZW50IG1lc3NhZ2UgdW50aWwKLSAqIHRoZSBlcnJvciBtZXNzYWdlIGlzIGNsZWFyZWQuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIHBhY2thZ2UgYWxzbyBwcm92aWRlcyBhIGNvbmNyZXRlIHN0YXR1cyBsaW5lIG1hbmFnZXIgaW1wbGVtZW50YXRpb24sCi0gKiB7QGxpbmsgU3RhdHVzTGluZU1hbmFnZXIgPGNvZGU+U3RhdHVzTGluZU1hbmFnZXI8L2NvZGU+fS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RhdHVzTGluZU1hbmFnZXIgZXh0ZW5kcyBJQ29udHJpYnV0aW9uTWFuYWdlciB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHByb2dyZXNzIG1vbml0b3Igd2hpY2ggcmVwb3J0cyBwcm9ncmVzcwotICAgICAqIGluIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByb2dyZXNzIG1vbml0b3IKLSAgICAgKiAKLSAgICAgKiBOb3RlOiBUaGVyZSBpcyBhIGRlbGF5IGFmdGVyIGEgYmVnaW5UYXNrIG1lc3NhZ2UgYmVmb3JlIHRoZSBtb25pdG9yIGlzIHNob3duLgotICAgICAqICAgVGhpcyBtYXkgbm90IGJlIGFwcHJvcHJpYXRlIGZvciBhbGwgYXBwcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2FuY2VsIGJ1dHRvbiBvbiB0aGUgc3RhdHVzIGxpbmUncyBwcm9ncmVzcyBtb25pdG9yCi0gICAgICogaXMgZW5hYmxlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNhbmNlbCBidXR0b24gaXMgZW5hYmxlZCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsRW5hYmxlZCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRoZSBjYW5jZWwgYnV0dG9uIG9uIHRoZSBzdGF0dXMgbGluZSdzIHByb2dyZXNzIG1vbml0b3IKLSAgICAgKiBpcyBlbmFibGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNhbmNlbCBidXR0b24gaXMgZW5hYmxlZCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGVycm9yIG1lc3NhZ2UgdGV4dCB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIHN0YXR1cyBsaW5lLgotICAgICAqIFRoZSBpbWFnZSBvbiB0aGUgc3RhdHVzIGxpbmUgaXMgY2xlYXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbiBlcnJvciBtZXNzYWdlIG92ZXJyaWRlcyB0aGUgY3VycmVudCBtZXNzYWdlIHVudGlsIHRoZSBlcnJvciAKLSAgICAgKiBtZXNzYWdlIGlzIGNsZWFyZWQgKHNldCB0byA8Y29kZT5udWxsPC9jb2RlPikuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNsZWFyCi0gICAgICogCQl0aGUgY3VycmVudCBlcnJvciBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbWFnZSBhbmQgZXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIHN0YXR1cyBsaW5lLgotICAgICAqIDxwPgotICAgICAqIEFuIGVycm9yIG1lc3NhZ2Ugb3ZlcnJpZGVzIHRoZSBjdXJyZW50IG1lc3NhZ2UgdW50aWwgdGhlIGVycm9yIAotICAgICAqIG1lc3NhZ2UgaXMgY2xlYXJlZCAoc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+KS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlIHRvIHVzZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIGltYWdlCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNsZWFyCi0gICAgICogCQl0aGUgY3VycmVudCBlcnJvciBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShJbWFnZSBpbWFnZSwgU3RyaW5nIG1lc3NhZ2UpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVzc2FnZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgc3RhdHVzIGxpbmUuCi0gICAgICogVGhlIGltYWdlIG9uIHRoZSBzdGF0dXMgbGluZSBpcyBjbGVhcmVkLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJlcGxhY2VzIHRoZSBjdXJyZW50IG1lc3NhZ2UgYnV0IGRvZXMgbm90IGFmZmVjdCB0aGUgCi0gICAgICogZXJyb3IgbWVzc2FnZS4gVGhhdCBpcywgdGhlIGVycm9yIG1lc3NhZ2UsIGlmIHNldCwgd2lsbCBjb250aW51ZQotICAgICAqIHRvIGJlIGRpc3BsYXllZCB1bnRpbCBpdCBpcyBjbGVhcmVkIChzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4pLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW1hZ2UgYW5kIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIG9uIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXBsYWNlcyB0aGUgY3VycmVudCBtZXNzYWdlIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIAotICAgICAqIGVycm9yIG1lc3NhZ2UuIFRoYXQgaXMsIHRoZSBlcnJvciBtZXNzYWdlLCBpZiBzZXQsIHdpbGwgY29udGludWUKLSAgICAgKiB0byBiZSBkaXNwbGF5ZWQgdW50aWwgaXQgaXMgY2xlYXJlZCAoc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+KS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlIHRvIHVzZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIGltYWdlCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShJbWFnZSBpbWFnZSwgU3RyaW5nIG1lc3NhZ2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0lUb29sQmFyTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL0lUb29sQmFyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM5MzJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9JVG9vbEJhck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLS8qKgotICogVGhlIDxjb2RlPklUb29sQmFyTWFuYWdlcjwvY29kZT4gaW50ZXJmYWNlIHByb3ZpZGVzIHByb3RvY29sIGZvciBtYW5hZ2luZwotICogY29udHJpYnV0aW9ucyB0byBhIHRvb2wgYmFyLiBJdCBleHRlbmRzIDxjb2RlPklDb250cmlidXRpb25NYW5hZ2VyPC9jb2RlPgotICogYnV0IGRvZXMgbm90IGRlY2xhcmUgYW55IG5ldyBtZW1iZXJzOyBpdCBleGlzdHMgb25seSB0byBpbmNyZWFzZSB0aGUKLSAqIHJlYWRhYmlsaXR5IG9mIGNvZGUgdXNpbmcgdG9vbCBiYXJzLgotICogPHA+Ci0gKiBUaGlzIHBhY2thZ2UgYWxzbyBwcm92aWRlcyBhIGNvbmNyZXRlIHRvb2wgYmFyIG1hbmFnZXIgaW1wbGVtZW50YXRpb24sCi0gKiB7QGxpbmsgVG9vbEJhck1hbmFnZXIgPGNvZGU+VG9vbEJhck1hbmFnZXI8L2NvZGU+fS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVG9vbEJhck1hbmFnZXIgZXh0ZW5kcyBJQ29udHJpYnV0aW9uTWFuYWdlciB7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vTGVnYWN5QWN0aW9uVG9vbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9MZWdhY3lBY3Rpb25Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ2NDU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9MZWdhY3lBY3Rpb25Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotLyoqCi0gKiA8cD4KLSAqIFNvbWUgc3RhdGljIHV0aWxpdHkgbWV0aG9kcyBmb3IgaGFuZGxpbmcgbGFiZWxzIG9uIGFjdGlvbnMuIFRoaXMgaW5jbHVkZXMKLSAqIG1uZW1vbmljcyBhbmQgYWNjZWxlcmF0b3JzLgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBuZWl0aGVyIGluc3RhbnRpYXRlIHRoaXMgY2xhc3Mgbm9yIGV4dGVuZC4KLSAqIDwvcD4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGVnYWN5QWN0aW9uVG9vbHMgewotCi0JLyoqCi0JICogVGFibGUgb2Yga2V5IGNvZGVzIChrZXkgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPiwgdmFsdWUgdHlwZToKLQkgKiA8Y29kZT5JbnRlZ2VyPC9jb2RlPik7IDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCB5ZXQgaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHNlZSAjZmluZEtleUNvZGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAga2V5Q29kZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGFibGUgb2Ygc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZiBrZXlzIChrZXkgdHlwZTogPGNvZGU+SW50ZWdlcjwvY29kZT4sCi0JICogdmFsdWUgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPik7IDxjb2RlPm51bGw8L2NvZGU+PiBpZiBub3QgeWV0Ci0JICogaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHNlZSAjZmluZEtleVN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBrZXlTdHJpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBsb2NhbGl6ZWQgdXBwZXJjYXNlIHZlcnNpb24gb2YgQUxUCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxvY2FsaXplZEFsdDsKLQotCS8qKgotCSAqIFRoZSBsb2NhbGl6ZWQgdXBwZXJjYXNlIHZlcnNpb24gb2YgQ09NTUFORAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBsb2NhbGl6ZWRDb21tYW5kOwotCi0JLyoqCi0JICogVGhlIGxvY2FsaXplZCB1cHBlcmNhc2UgdmVyc2lvbiBvZiBDVFJMCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxvY2FsaXplZEN0cmw7Ci0KLQkvKioKLQkgKiBUYWJsZSBvZiBrZXkgY29kZXMgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+LCB2YWx1ZSB0eXBlOgotCSAqIDxjb2RlPkludGVnZXI8L2NvZGU+KTsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHlldCBpbml0aWFsaXplZC4gVGhlCi0JICoga2V5IGlzIHRoZSBsb2NhbGFsaXplZCBuYW1lIG9mIHRoZSBrZXkgYXMgaXQgYXBwZWFycyBpbiBtZW51cy4KLQkgKiAKLQkgKiBAc2VlICNmaW5kTG9jYWxpemVkS2V5Q29kZQotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBsb2NhbGl6ZWRLZXlDb2RlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgbG9jYWxpemVkIHVwcGVyY2FzZSB2ZXJzaW9uIG9mIFNISUZUCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxvY2FsaXplZFNoaWZ0OwotCi0JLyoqCi0JICogVGhlIGNvbnN0YW50IHRvIHVzZSBpZiB0aGVyZSBpcyBubyBtbmVtb25pYyBmb3IgdGhpcyBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTU5FTU9OSUNfTk9ORSA9IDA7Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhbiBhY2NlbGVyYXRvciBrZXkgY29kZSB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Q29kZQotCSAqICAgICAgICAgICAgdGhlIGtleSBjb2RlIHRvIGJlIHRyYW5zbGF0ZWQKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBrZXkgY29kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbnZlcnRBY2NlbGVyYXRvcihmaW5hbCBpbnQga2V5Q29kZSkgewotCQlTdHJpbmcgbW9kaWZpZXIgPSBnZXRNb2RpZmllclN0cmluZyhrZXlDb2RlKTsKLQkJU3RyaW5nIGZ1bGxLZXk7Ci0JCWlmIChtb2RpZmllci5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZ1bGxLZXkgPSBmaW5kS2V5U3RyaW5nKGtleUNvZGUpOwotCQl9IGVsc2UgewotCQkJZnVsbEtleSA9IG1vZGlmaWVyICsgIisiICsgZmluZEtleVN0cmluZyhrZXlDb2RlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmdWxsS2V5OwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gYWNjZWxlcmF0b3IgdGV4dCwgYW5kIGNvbnZlcnRzIGl0IHRvIGFuIGFjY2VsZXJhdG9yIGtleQotCSAqIGNvZGUuCi0JICogCi0JICogQHBhcmFtIGFjY2VsZXJhdG9yVGV4dAotCSAqICAgICAgICAgICAgdGhlIGFjY2VsZXJhdG9yIHRleHQKLQkgKiBAcmV0dXJuIHRoZSBTV1Qga2V5IGNvZGUsIG9yIDAgaWYgdGhlcmUgaXMgbm8gYWNjZWxlcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb252ZXJ0QWNjZWxlcmF0b3IoZmluYWwgU3RyaW5nIGFjY2VsZXJhdG9yVGV4dCkgewotCQlpbnQgYWNjZWxlcmF0b3IgPSAwOwotCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYWNjZWxlcmF0b3JUZXh0LCAiKyIpOyAvLyROT04tTkxTLTEkCi0KLQkJaW50IGtleUNvZGUgPSAtMTsKLQotCQlib29sZWFuIGhhc01vcmVUb2tlbnMgPSBzdG9rLmhhc01vcmVUb2tlbnMoKTsKLQkJd2hpbGUgKGhhc01vcmVUb2tlbnMpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHN0b2submV4dFRva2VuKCk7Ci0JCQloYXNNb3JlVG9rZW5zID0gc3Rvay5oYXNNb3JlVG9rZW5zKCk7Ci0JCQkvLyBFdmVyeSB0b2tlbiBleGNlcHQgdGhlIGxhc3QgbXVzdCBiZSBvbmUgb2YgdGhlIG1vZGlmaWVycwotCQkJLy8gQ3RybCwgU2hpZnQsIEFsdCwgb3IgQ29tbWFuZAotCQkJaWYgKGhhc01vcmVUb2tlbnMpIHsKLQkJCQlpbnQgbW9kaWZpZXIgPSBmaW5kTW9kaWZpZXIodG9rZW4pOwotCQkJCWlmIChtb2RpZmllciAhPSAwKSB7Ci0JCQkJCWFjY2VsZXJhdG9yIHw9IG1vZGlmaWVyOwotCQkJCX0gZWxzZSB7IC8vIExlYXZlIGlmIHRoZXJlIGFyZSBub25lCi0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJa2V5Q29kZSA9IGZpbmRLZXlDb2RlKHRva2VuKTsKLQkJCX0KLQkJfQotCQlpZiAoa2V5Q29kZSAhPSAtMSkgewotCQkJYWNjZWxlcmF0b3IgfD0ga2V5Q29kZTsKLQkJfQotCQlyZXR1cm4gYWNjZWxlcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBhY2NlbGVyYXRvciB0ZXh0LCBhbmQgY29udmVydHMgaXQgdG8gYW4gYWNjZWxlcmF0b3Iga2V5Ci0JICogY29kZS4KLQkgKiAKLQkgKiBTdXBwb3J0IGZvciBsb2NhbGl6ZWQgbW9kaWZpZXJzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIDEuMC4KLQkgKiBVc2Ugc2V0QWNjZWxlcmF0b3IoaW50KSB0byBzZXQgYWNjZWxlcmF0b3JzIHByb2dyYW1hdGljYWxseSBvciB0aGUKLQkgKiA8Y29kZT5hY2NlbGVyYXRvcjwvY29kZT4gdGFnIGluIGFjdGlvbiBkZWZpbml0aW9ucyBpbiBwbHVnaW4ueG1sLgotCSAqIAotCSAqIEBwYXJhbSBhY2NlbGVyYXRvclRleHQKLQkgKiAgICAgICAgICAgIHRoZSBhY2NlbGVyYXRvciB0ZXh0IGxvY2FsaXplZCB0byB0aGUgY3VycmVudCBsb2NhbGUKLQkgKiBAcmV0dXJuIHRoZSBTV1Qga2V5IGNvZGUsIG9yIDAgaWYgdGhlcmUgaXMgbm8gYWNjZWxlcmF0b3IKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IGNvbnZlcnRMb2NhbGl6ZWRBY2NlbGVyYXRvcihmaW5hbCBTdHJpbmcgYWNjZWxlcmF0b3JUZXh0KSB7Ci0JCWludCBhY2NlbGVyYXRvciA9IDA7Ci0JCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihhY2NlbGVyYXRvclRleHQsICIrIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnQga2V5Q29kZSA9IC0xOwotCi0JCWJvb2xlYW4gaGFzTW9yZVRva2VucyA9IHN0b2suaGFzTW9yZVRva2VucygpOwotCQl3aGlsZSAoaGFzTW9yZVRva2VucykgewotCQkJU3RyaW5nIHRva2VuID0gc3Rvay5uZXh0VG9rZW4oKTsKLQkJCWhhc01vcmVUb2tlbnMgPSBzdG9rLmhhc01vcmVUb2tlbnMoKTsKLQkJCS8vIEV2ZXJ5IHRva2VuIGV4Y2VwdCB0aGUgbGFzdCBtdXN0IGJlIG9uZSBvZiB0aGUgbW9kaWZpZXJzCi0JCQkvLyBDdHJsLCBTaGlmdCwgQWx0LCBvciBDb21tYW5kCi0JCQlpZiAoaGFzTW9yZVRva2VucykgewotCQkJCWludCBtb2RpZmllciA9IGZpbmRMb2NhbGl6ZWRNb2RpZmllcih0b2tlbik7Ci0JCQkJaWYgKG1vZGlmaWVyICE9IDApIHsKLQkJCQkJYWNjZWxlcmF0b3IgfD0gbW9kaWZpZXI7Ci0JCQkJfSBlbHNlIHsgLy8gTGVhdmUgaWYgdGhlcmUgYXJlIG5vbmUKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlrZXlDb2RlID0gZmluZExvY2FsaXplZEtleUNvZGUodG9rZW4pOwotCQkJfQotCQl9Ci0JCWlmIChrZXlDb2RlICE9IC0xKSB7Ci0JCQlhY2NlbGVyYXRvciB8PSBrZXlDb2RlOwotCQl9Ci0JCXJldHVybiBhY2NlbGVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgYWNjZWxlcmF0b3IgdGV4dCBmcm9tIHRoZSBnaXZlbiB0ZXh0LiBSZXR1cm5zCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gYWNjZWxlcmF0b3IgdGV4dCwgYW5kIHRoZSBlbXB0eSBzdHJpbmcKLQkgKiBpZiB0aGVyZSBpcyBubyB0ZXh0IGFmdGVyIHRoZSBhY2NlbGVyYXRvciBkZWxpbWV0ZXIgKHRhYiBvciAnQCcpLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGFjdGlvbjsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gdGhlIGFjY2VsZXJhdG9yIHRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXh0cmFjdEFjY2VsZXJhdG9yVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGluZGV4ID0gdGV4dC5sYXN0SW5kZXhPZignXHQnKTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJaW5kZXggPSB0ZXh0Lmxhc3RJbmRleE9mKCdAJyk7Ci0JCWlmIChpbmRleCA+PSAwKQotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSBtbmVtb25pYyB0ZXh0IGZyb20gdGhlIGdpdmVuIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZnJvbSB3aGljaCB0aGUgbW5lbW9uaWMgc2hvdWxkIGJlIGV4dHJhY3RlZDsgbWF5IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gVGhlIHRleHQgb2YgdGhlIG1uZW1vbmljOyB3aWxsIGJlIHtAbGluayAjTU5FTU9OSUNfTk9ORX0gaWYgdGhlcmUKLQkgKiAgICAgICAgIGlzIG5vIG1uZW1vbmljOwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBleHRyYWN0TW5lbW9uaWMoZmluYWwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ORU1PTklDX05PTkU7Ci0JCX0KLQotCQlpbnQgaW5kZXggPSB0ZXh0LmluZGV4T2YoJyYnKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gTU5FTU9OSUNfTk9ORTsKLQkJfQotCi0JCWZpbmFsIGludCB0ZXh0TGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKLQotCQkvLyBJZ25vcmUgJyYnIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KLQkJaWYgKGluZGV4ID09IHRleHRMZW5ndGggLSAxKSB7Ci0JCQlyZXR1cm4gTU5FTU9OSUNfTk9ORTsKLQkJfQotCi0JCS8vIElnbm9yZSB0d28gY29uc2VjdXRpdmUgYW1wZXJzYW5kcy4KLQkJd2hpbGUgKHRleHQuY2hhckF0KGluZGV4ICsgMSkgPT0gJyYnKSB7Ci0JCQlpbmRleCA9IHRleHQuaW5kZXhPZignJicsICsraW5kZXgpOwotCQkJaWYgKGluZGV4ID09IHRleHRMZW5ndGggLSAxKSB7Ci0JCQkJcmV0dXJuIE1ORU1PTklDX05PTkU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGV4dC5jaGFyQXQoaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBNYXBzIGEgc3RhbmRhcmQga2V5Ym9hcmQga2V5IG5hbWUgdG8gYW4gU1dUIGtleSBjb2RlLiBLZXkgbmFtZXMgYXJlCi0JICogY29udmVydGVkIHRvIHVwcGVyIGNhc2UgYmVmb3JlIGNvbXBhcmlzb24uIElmIHRoZSBrZXkgbmFtZSBpcyBhIHNpbmdsZQotCSAqIGxldHRlciwgZm9yIGV4YW1wbGUgIlMiLCBpdHMgY2hhcmFjdGVyIGNvZGUgaXMgcmV0dXJuZWQuCi0JICogPHA+Ci0JICogVGhlIGZvbGxvd2luZyBrZXkgbmFtZXMgYXJlIGtub3duIChjYXNlIGlzIGlnbm9yZWQpOgotCSAqIDx1bD4KLQkgKiA8bGk+PGNvZGU+IkJBQ0tTUEFDRSI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+IlRBQiI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+IlJFVFVSTiI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+IkVOVEVSIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iRVNDIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iRVNDQVBFIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iREVMRVRFIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iU1BBQ0UiPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJBUlJPV19VUCI8L2NvZGU+LCA8Y29kZT4iQVJST1dfRE9XTiI8L2NvZGU+LAotCSAqIDxjb2RlPiJBUlJPV19MRUZUIjwvY29kZT4sIGFuZCA8Y29kZT4iQVJST1dfUklHSFQiPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJQQUdFX1VQIjwvY29kZT4gYW5kIDxjb2RlPiJQQUdFX0RPV04iPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJIT01FIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iRU5EIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iSU5TRVJUIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iRjEiPC9jb2RlPiwgPGNvZGU+IkYyIjwvY29kZT4gdGhyb3VnaCA8Y29kZT4iRjEyIjwvY29kZT48L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0b2tlbgotCSAqICAgICAgICAgICAgdGhlIGtleSBuYW1lCi0JICogQHJldHVybiB0aGUgU1dUIGtleSBjb2RlLCA8Y29kZT4tMTwvY29kZT4gaWYgbm8gbWF0Y2ggd2FzIGZvdW5kCi0JICogQHNlZSBTV1QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaW5kS2V5Q29kZShTdHJpbmcgdG9rZW4pIHsKLQkJaWYgKGtleUNvZGVzID09IG51bGwpCi0JCQlpbml0S2V5Q29kZXMoKTsKLQkJdG9rZW4gPSB0b2tlbi50b1VwcGVyQ2FzZSgpOwotCQlJbnRlZ2VyIGkgPSAoSW50ZWdlcikga2V5Q29kZXMuZ2V0KHRva2VuKTsKLQkJaWYgKGkgIT0gbnVsbCkKLQkJCXJldHVybiBpLmludFZhbHVlKCk7Ci0JCWlmICh0b2tlbi5sZW5ndGgoKSA9PSAxKQotCQkJcmV0dXJuIHRva2VuLmNoYXJBdCgwKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIE1hcHMgYW4gU1dUIGtleSBjb2RlIHRvIGEgc3RhbmRhcmQga2V5Ym9hcmQga2V5IG5hbWUuIFRoZSBrZXkgY29kZSBpcwotCSAqIHN0cmlwcGVkIG9mIG1vZGlmaWVycyAoU1dULkNUUkwsIFNXVC5BTFQsIFNXVC5TSElGVCwgYW5kIFNXVC5DT01NQU5EKS4gSWYKLQkgKiB0aGUga2V5IGNvZGUgaXMgbm90IGFuIFNXVCBjb2RlIChmb3IgZXhhbXBsZSBpZiBpdCBhIGtleSBjb2RlIGZvciB0aGUga2V5Ci0JICogJ1MnKSwgYSBzdHJpbmcgY29udGFpbmluZyBhIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBvZiB0aGUga2V5IGNvZGUgaXMKLQkgKiByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Q29kZQotCSAqICAgICAgICAgICAgdGhlIGtleSBjb2RlIHRvIGJlIHRyYW5zbGF0ZWQKLQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtleSBjb2RlCi0JICogQHNlZSBTV1QKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmluZEtleVN0cmluZyhmaW5hbCBpbnQga2V5Q29kZSkgewotCQlpZiAoa2V5U3RyaW5ncyA9PSBudWxsKQotCQkJaW5pdEtleVN0cmluZ3MoKTsKLQkJaW50IGkgPSBrZXlDb2RlICYgfihTV1QuQ1RSTCB8IFNXVC5BTFQgfCBTV1QuU0hJRlQgfCBTV1QuQ09NTUFORCk7Ci0JCUludGVnZXIgaW50ZWdlciA9IG5ldyBJbnRlZ2VyKGkpOwotCQlTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykga2V5U3RyaW5ncy5nZXQoaW50ZWdlcik7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCXJlc3VsdCA9IG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7IChjaGFyKSBpIH0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIHN1cHBsaWVkIGNvZGUgZm9yIGEgbG9jYWxpemVkIGtleS4gQXMgI2ZpbmRLZXlDb2RlIGJ1dCBsb2NhbGl6ZWQKLQkgKiB0byB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogCi0JICogU3VwcG9ydCBmb3IgbG9jYWxpemVkIG1vZGlmaWVycyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCAxLjAuCi0JICogVXNlIHNldEFjY2VsZXJhdG9yKGludCkgdG8gc2V0IGFjY2VsZXJhdG9ycyBwcm9ncmFtYXRpY2FsbHkgb3IgdGhlCi0JICogPGNvZGU+YWNjZWxlcmF0b3I8L2NvZGU+IHRhZyBpbiBhY3Rpb24gZGVmaW5pdGlvbnMgaW4gcGx1Z2luLnhtbC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiAgICAgICAgICAgIHRoZSBsb2NhbGl6ZWQga2V5IG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBTV1Qga2V5IGNvZGUsIDxjb2RlPi0xPC9jb2RlPiBpZiBubyBtYXRjaCB3YXMgZm91bmQKLQkgKiBAc2VlICNmaW5kS2V5Q29kZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBmaW5kTG9jYWxpemVkS2V5Q29kZShTdHJpbmcgdG9rZW4pIHsKLQkJaWYgKGxvY2FsaXplZEtleUNvZGVzID09IG51bGwpCi0JCQlpbml0TG9jYWxpemVkS2V5Q29kZXMoKTsKLQkJdG9rZW4gPSB0b2tlbi50b1VwcGVyQ2FzZSgpOwotCQlJbnRlZ2VyIGkgPSAoSW50ZWdlcikgbG9jYWxpemVkS2V5Q29kZXMuZ2V0KHRva2VuKTsKLQkJaWYgKGkgIT0gbnVsbCkKLQkJCXJldHVybiBpLmludFZhbHVlKCk7Ci0JCWlmICh0b2tlbi5sZW5ndGgoKSA9PSAxKQotCQkJcmV0dXJuIHRva2VuLmNoYXJBdCgwKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIE1hcHMgdGhlIGxvY2FsaXplZCBtb2RpZmllciBuYW1lcyB0byBhIGNvZGUgaW4gdGhlIHNhbWUgbWFubmVyIGFzCi0JICogI2ZpbmRNb2RpZmllci4KLQkgKiAKLQkgKiBTdXBwb3J0IGZvciBsb2NhbGl6ZWQgbW9kaWZpZXJzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIDEuMC4KLQkgKiBVc2Ugc2V0QWNjZWxlcmF0b3IoaW50KSB0byBzZXQgYWNjZWxlcmF0b3JzIHByb2dyYW1hdGljYWxseSBvciB0aGUKLQkgKiA8Y29kZT5hY2NlbGVyYXRvcjwvY29kZT4gdGFnIGluIGFjdGlvbiBkZWZpbml0aW9ucyBpbiBwbHVnaW4ueG1sLgotCSAqIAotCSAqIEBzZWUgI2ZpbmRNb2RpZmllcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBmaW5kTG9jYWxpemVkTW9kaWZpZXIoU3RyaW5nIHRva2VuKSB7Ci0JCWlmIChsb2NhbGl6ZWRDdHJsID09IG51bGwpCi0JCQlpbml0TG9jYWxpemVkTW9kaWZpZXJzKCk7Ci0KLQkJdG9rZW4gPSB0b2tlbi50b1VwcGVyQ2FzZSgpOwotCQlpZiAodG9rZW4uZXF1YWxzKGxvY2FsaXplZEN0cmwpKQotCQkJcmV0dXJuIFNXVC5DVFJMOwotCQlpZiAodG9rZW4uZXF1YWxzKGxvY2FsaXplZFNoaWZ0KSkKLQkJCXJldHVybiBTV1QuU0hJRlQ7Ci0JCWlmICh0b2tlbi5lcXVhbHMobG9jYWxpemVkQWx0KSkKLQkJCXJldHVybiBTV1QuQUxUOwotCQlpZiAodG9rZW4uZXF1YWxzKGxvY2FsaXplZENvbW1hbmQpKQotCQkJcmV0dXJuIFNXVC5DT01NQU5EOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBNYXBzIHN0YW5kYXJkIGtleWJvYXJkIG1vZGlmaWVyIGtleSBuYW1lcyB0byB0aGUgY29ycmVzcG9uZGluZyBTV1QKLQkgKiBtb2RpZmllciBiaXQuIFRoZSBmb2xsb3dpbmcgbW9kaWZpZXIga2V5IG5hbWVzIGFyZSByZWNvZ25pemVkIChjYXNlIGlzCi0JICogaWdub3JlZCk6IDxjb2RlPiJDVFJMIjwvY29kZT4sIDxjb2RlPiJTSElGVCI8L2NvZGU+LAotCSAqIDxjb2RlPiJBTFQiPC9jb2RlPiwgYW5kIDxjb2RlPiJDT01NQU5EIjwvY29kZT4uIFRoZSBnaXZlbiBtb2RpZmllcgotCSAqIGtleSBuYW1lIGlzIGNvbnZlcnRlZCB0byB1cHBlciBjYXNlIGJlZm9yZSBjb21wYXJpc29uLgotCSAqIAotCSAqIEBwYXJhbSB0b2tlbgotCSAqICAgICAgICAgICAgdGhlIG1vZGlmaWVyIGtleSBuYW1lCi0JICogQHJldHVybiB0aGUgU1dUIG1vZGlmaWVyIGJpdCwgb3IgPGNvZGU+MDwvY29kZT4gaWYgbm8gbWF0Y2ggd2FzIGZvdW5kCi0JICogQHNlZSBTV1QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaW5kTW9kaWZpZXIoU3RyaW5nIHRva2VuKSB7Ci0JCXRva2VuID0gdG9rZW4udG9VcHBlckNhc2UoKTsKLQkJaWYgKHRva2VuLmVxdWFscygiQ1RSTCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gU1dULkNUUkw7Ci0JCWlmICh0b2tlbi5lcXVhbHMoIlNISUZUIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBTV1QuU0hJRlQ7Ci0JCWlmICh0b2tlbi5lcXVhbHMoIkFMVCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gU1dULkFMVDsKLQkJaWYgKHRva2VuLmVxdWFscygiQ09NTUFORCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gU1dULkNPTU1BTkQ7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gU1dUIG1vZGlmaWVyIGJpdCAoU1dULkNUUkwsCi0JICogU1dULkFMVCwgU1dULlNISUZULCBhbmQgU1dULkNPTU1BTkQpLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqIGtleSBjb2RlIGlzIG5vdCBhbiBTV1QgbW9kaWZpZXIgYml0LgotCSAqIAotCSAqIEBwYXJhbSBrZXlDb2RlCi0JICogICAgICAgICAgICB0aGUgU1dUIG1vZGlmaWVyIGJpdCB0byBiZSB0cmFuc2xhdGVkCi0JICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBTV1QgbW9kaWZpZXIgYml0LCBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSBjb2RlIHdhcyBub3QgYW4gU1dUIG1vZGlmaWVyIGJpdAotCSAqIEBzZWUgU1dUCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmluZE1vZGlmaWVyU3RyaW5nKGZpbmFsIGludCBrZXlDb2RlKSB7Ci0JCWlmIChrZXlDb2RlID09IFNXVC5DVFJMKQotCQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiQ3RybCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChrZXlDb2RlID09IFNXVC5BTFQpCi0JCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJBbHQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoa2V5Q29kZSA9PSBTV1QuU0hJRlQpCi0JCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJTaGlmdCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChrZXlDb2RlID09IFNXVC5DT01NQU5EKQotCQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiQ29tbWFuZCIpOyAvLyROT04tTkxTLTEkCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RpZmllcnMgKEN0cmwsIEFsdCwgU2hpZnQsCi0JICogQ29tbWFuZCkgb2YgdGhlIGtleSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Q29kZQotCSAqICAgICAgICAgICAgVGhlIGtleSBjb2RlIGZvciB3aGljaCB0aGUgbW9kaWZpZXIgc3RyaW5nIGlzIGRlc2lyZWQuCi0JICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBrZXkgY29kZTsgbmV2ZXIKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRNb2RpZmllclN0cmluZyhpbnQga2V5Q29kZSkgewotCQlTdHJpbmcgbW9kU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoKGtleUNvZGUgJiBTV1QuQ1RSTCkgIT0gMCkgewotCQkJbW9kU3RyaW5nID0gZmluZE1vZGlmaWVyU3RyaW5nKGtleUNvZGUgJiBTV1QuQ1RSTCk7Ci0JCX0KLQotCQlpZiAoKGtleUNvZGUgJiBTV1QuQUxUKSAhPSAwKSB7Ci0JCQlpZiAobW9kU3RyaW5nLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW1vZFN0cmluZyA9IGZpbmRNb2RpZmllclN0cmluZyhrZXlDb2RlICYgU1dULkFMVCk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZFN0cmluZyA9IG1vZFN0cmluZwotCQkJCQkJKyAiKyIgKyBmaW5kTW9kaWZpZXJTdHJpbmcoa2V5Q29kZSAmIFNXVC5BTFQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoKGtleUNvZGUgJiBTV1QuU0hJRlQpICE9IDApIHsKLQkJCWlmIChtb2RTdHJpbmcuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbW9kU3RyaW5nID0gZmluZE1vZGlmaWVyU3RyaW5nKGtleUNvZGUgJiBTV1QuU0hJRlQpOwotCQkJfSBlbHNlIHsKLQkJCQltb2RTdHJpbmcgPSBtb2RTdHJpbmcKLQkJCQkJCSsgIisiICsgZmluZE1vZGlmaWVyU3RyaW5nKGtleUNvZGUgJiBTV1QuU0hJRlQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoKGtleUNvZGUgJiBTV1QuQ09NTUFORCkgIT0gMCkgewotCQkJaWYgKG1vZFN0cmluZy5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQltb2RTdHJpbmcgPSBmaW5kTW9kaWZpZXJTdHJpbmcoa2V5Q29kZSAmIFNXVC5DT01NQU5EKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kU3RyaW5nID0gbW9kU3RyaW5nCi0JCQkJCQkrICIrIiArIGZpbmRNb2RpZmllclN0cmluZyhrZXlDb2RlICYgU1dULkNPTU1BTkQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBrZXkgY29kZSB0YWJsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGluaXRLZXlDb2RlcygpIHsKLQkJa2V5Q29kZXMgPSBuZXcgSGFzaE1hcCg0MCk7Ci0KLQkJa2V5Q29kZXMucHV0KCJCQUNLU1BBQ0UiLCBuZXcgSW50ZWdlcig4KSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5Q29kZXMucHV0KCJUQUIiLCBuZXcgSW50ZWdlcig5KSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5Q29kZXMucHV0KCJSRVRVUk4iLCBuZXcgSW50ZWdlcigxMykpOyAvLyROT04tTkxTLTEkCi0JCWtleUNvZGVzLnB1dCgiRU5URVIiLCBuZXcgSW50ZWdlcigxMykpOyAvLyROT04tTkxTLTEkCi0JCWtleUNvZGVzLnB1dCgiRVNDQVBFIiwgbmV3IEludGVnZXIoMjcpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlDb2Rlcy5wdXQoIkVTQyIsIG5ldyBJbnRlZ2VyKDI3KSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5Q29kZXMucHV0KCJERUxFVEUiLCBuZXcgSW50ZWdlcigxMjcpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWtleUNvZGVzLnB1dCgiU1BBQ0UiLCBuZXcgSW50ZWdlcignICcpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlDb2Rlcy5wdXQoIkFSUk9XX1VQIiwgbmV3IEludGVnZXIoU1dULkFSUk9XX1VQKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5Q29kZXMucHV0KCJBUlJPV19ET1dOIiwgbmV3IEludGVnZXIoU1dULkFSUk9XX0RPV04pKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlDb2Rlcy5wdXQoIkFSUk9XX0xFRlQiLCBuZXcgSW50ZWdlcihTV1QuQVJST1dfTEVGVCkpOyAvLyROT04tTkxTLTEkCi0JCWtleUNvZGVzLnB1dCgiQVJST1dfUklHSFQiLCBuZXcgSW50ZWdlcihTV1QuQVJST1dfUklHSFQpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlDb2Rlcy5wdXQoIlBBR0VfVVAiLCBuZXcgSW50ZWdlcihTV1QuUEFHRV9VUCkpOyAvLyROT04tTkxTLTEkCi0JCWtleUNvZGVzLnB1dCgiUEFHRV9ET1dOIiwgbmV3IEludGVnZXIoU1dULlBBR0VfRE9XTikpOyAvLyROT04tTkxTLTEkCi0JCWtleUNvZGVzLnB1dCgiSE9NRSIsIG5ldyBJbnRlZ2VyKFNXVC5IT01FKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5Q29kZXMucHV0KCJFTkQiLCBuZXcgSW50ZWdlcihTV1QuRU5EKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5Q29kZXMucHV0KCJJTlNFUlQiLCBuZXcgSW50ZWdlcihTV1QuSU5TRVJUKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5Q29kZXMucHV0KCJGMSIsIG5ldyBJbnRlZ2VyKFNXVC5GMSkpOyAvLyROT04tTkxTLTEkCi0JCWtleUNvZGVzLnB1dCgiRjIiLCBuZXcgSW50ZWdlcihTV1QuRjIpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlDb2Rlcy5wdXQoIkYzIiwgbmV3IEludGVnZXIoU1dULkYzKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5Q29kZXMucHV0KCJGNCIsIG5ldyBJbnRlZ2VyKFNXVC5GNCkpOyAvLyROT04tTkxTLTEkCi0JCWtleUNvZGVzLnB1dCgiRjUiLCBuZXcgSW50ZWdlcihTV1QuRjUpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlDb2Rlcy5wdXQoIkY2IiwgbmV3IEludGVnZXIoU1dULkY2KSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5Q29kZXMucHV0KCJGNyIsIG5ldyBJbnRlZ2VyKFNXVC5GNykpOyAvLyROT04tTkxTLTEkCi0JCWtleUNvZGVzLnB1dCgiRjgiLCBuZXcgSW50ZWdlcihTV1QuRjgpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlDb2Rlcy5wdXQoIkY5IiwgbmV3IEludGVnZXIoU1dULkY5KSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5Q29kZXMucHV0KCJGMTAiLCBuZXcgSW50ZWdlcihTV1QuRjEwKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5Q29kZXMucHV0KCJGMTEiLCBuZXcgSW50ZWdlcihTV1QuRjExKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5Q29kZXMucHV0KCJGMTIiLCBuZXcgSW50ZWdlcihTV1QuRjEyKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwga2V5IHN0cmluZyB0YWJsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRLZXlTdHJpbmdzKCkgewotCQlrZXlTdHJpbmdzID0gbmV3IEhhc2hNYXAoNDApOwotCi0JCWtleVN0cmluZ3MucHV0KG5ldyBJbnRlZ2VyKDgpLCBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkJhY2tzcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlTdHJpbmdzLnB1dChuZXcgSW50ZWdlcig5KSwgSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJUYWIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5U3RyaW5ncy5wdXQobmV3IEludGVnZXIoMTMpLCBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIlJldHVybiIpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlTdHJpbmdzLnB1dChuZXcgSW50ZWdlcigxMyksIEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRW50ZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5U3RyaW5ncy5wdXQobmV3IEludGVnZXIoMjcpLCBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkVzY2FwZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlTdHJpbmdzLnB1dChuZXcgSW50ZWdlcigyNyksIEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRXNjIikpOyAvLyROT04tTkxTLTEkCi0JCWtleVN0cmluZ3MucHV0KG5ldyBJbnRlZ2VyKDEyNyksIEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRGVsZXRlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJa2V5U3RyaW5ncy5wdXQobmV3IEludGVnZXIoJyAnKSwgSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJTcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWtleVN0cmluZ3MucHV0KG5ldyBJbnRlZ2VyKFNXVC5BUlJPV19VUCksIEpGYWNlUmVzb3VyY2VzCi0JCQkJLmdldFN0cmluZygiQXJyb3dfVXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5U3RyaW5ncy5wdXQobmV3IEludGVnZXIoU1dULkFSUk9XX0RPV04pLCBKRmFjZVJlc291cmNlcwotCQkJCS5nZXRTdHJpbmcoIkFycm93X0Rvd24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5U3RyaW5ncy5wdXQobmV3IEludGVnZXIoU1dULkFSUk9XX0xFRlQpLCBKRmFjZVJlc291cmNlcwotCQkJCS5nZXRTdHJpbmcoIkFycm93X0xlZnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5U3RyaW5ncy5wdXQobmV3IEludGVnZXIoU1dULkFSUk9XX1JJR0hUKSwgSkZhY2VSZXNvdXJjZXMKLQkJCQkuZ2V0U3RyaW5nKCJBcnJvd19SaWdodCIpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlTdHJpbmdzLnB1dChuZXcgSW50ZWdlcihTV1QuUEFHRV9VUCksIEpGYWNlUmVzb3VyY2VzCi0JCQkJLmdldFN0cmluZygiUGFnZV9VcCIpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlTdHJpbmdzLnB1dChuZXcgSW50ZWdlcihTV1QuUEFHRV9ET1dOKSwgSkZhY2VSZXNvdXJjZXMKLQkJCQkuZ2V0U3RyaW5nKCJQYWdlX0Rvd24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5U3RyaW5ncy5wdXQobmV3IEludGVnZXIoU1dULkhPTUUpLCBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkhvbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5U3RyaW5ncy5wdXQobmV3IEludGVnZXIoU1dULkVORCksIEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRW5kIikpOyAvLyROT04tTkxTLTEkCi0JCWtleVN0cmluZ3MucHV0KG5ldyBJbnRlZ2VyKFNXVC5JTlNFUlQpLCBKRmFjZVJlc291cmNlcwotCQkJCS5nZXRTdHJpbmcoIkluc2VydCIpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlTdHJpbmdzLnB1dChuZXcgSW50ZWdlcihTV1QuRjEpLCBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkYxIikpOyAvLyROT04tTkxTLTEkCi0JCWtleVN0cmluZ3MucHV0KG5ldyBJbnRlZ2VyKFNXVC5GMiksIEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRjIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5U3RyaW5ncy5wdXQobmV3IEludGVnZXIoU1dULkYzKSwgSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJGMyIpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlTdHJpbmdzLnB1dChuZXcgSW50ZWdlcihTV1QuRjQpLCBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkY0IikpOyAvLyROT04tTkxTLTEkCi0JCWtleVN0cmluZ3MucHV0KG5ldyBJbnRlZ2VyKFNXVC5GNSksIEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRjUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5U3RyaW5ncy5wdXQobmV3IEludGVnZXIoU1dULkY2KSwgSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJGNiIpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlTdHJpbmdzLnB1dChuZXcgSW50ZWdlcihTV1QuRjcpLCBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkY3IikpOyAvLyROT04tTkxTLTEkCi0JCWtleVN0cmluZ3MucHV0KG5ldyBJbnRlZ2VyKFNXVC5GOCksIEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRjgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5U3RyaW5ncy5wdXQobmV3IEludGVnZXIoU1dULkY5KSwgSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJGOSIpKTsgLy8kTk9OLU5MUy0xJAotCQlrZXlTdHJpbmdzLnB1dChuZXcgSW50ZWdlcihTV1QuRjEwKSwgSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJGMTAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJa2V5U3RyaW5ncy5wdXQobmV3IEludGVnZXIoU1dULkYxMSksIEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRjExIikpOyAvLyROT04tTkxTLTEkCi0JCWtleVN0cmluZ3MucHV0KG5ldyBJbnRlZ2VyKFNXVC5GMTIpLCBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkYxMiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBsb2NhbGl6ZWQgaW50ZXJuYWwga2V5IGNvZGUgdGFibGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0TG9jYWxpemVkS2V5Q29kZXMoKSB7Ci0JCWxvY2FsaXplZEtleUNvZGVzID0gbmV3IEhhc2hNYXAoNDApOwotCi0JCWxvY2FsaXplZEtleUNvZGVzLnB1dChKRmFjZVJlc291cmNlcwotCQkJCS5nZXRTdHJpbmcoIkJhY2tzcGFjZSIpLnRvVXBwZXJDYXNlKCksIG5ldyBJbnRlZ2VyKDgpKTsgLy8kTk9OLU5MUy0xJAotCQlsb2NhbGl6ZWRLZXlDb2Rlcy5wdXQoCi0JCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJUYWIiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcig5KSk7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYWxpemVkS2V5Q29kZXMKLQkJCQkucHV0KAotCQkJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJSZXR1cm4iKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcigxMykpOyAvLyROT04tTkxTLTEkCi0JCWxvY2FsaXplZEtleUNvZGVzCi0JCQkJLnB1dCgKLQkJCQkJCUpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRW50ZXIiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcigxMykpOyAvLyROT04tTkxTLTEkCi0JCWxvY2FsaXplZEtleUNvZGVzCi0JCQkJLnB1dCgKLQkJCQkJCUpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRXNjYXBlIikudG9VcHBlckNhc2UoKSwgbmV3IEludGVnZXIoMjcpKTsgLy8kTk9OLU5MUy0xJAotCQlsb2NhbGl6ZWRLZXlDb2Rlcy5wdXQoCi0JCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJFc2MiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcigyNykpOyAvLyROT04tTkxTLTEkCi0JCWxvY2FsaXplZEtleUNvZGVzCi0JCQkJLnB1dCgKLQkJCQkJCUpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRGVsZXRlIikudG9VcHBlckNhc2UoKSwgbmV3IEludGVnZXIoMTI3KSk7IC8vJE5PTi1OTFMtMSQKLQotCQlsb2NhbGl6ZWRLZXlDb2RlcwotCQkJCS5wdXQoCi0JCQkJCQlKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIlNwYWNlIikudG9VcHBlckNhc2UoKSwgbmV3IEludGVnZXIoJyAnKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlsb2NhbGl6ZWRLZXlDb2RlcwotCQkJCS5wdXQoCi0JCQkJCQlKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkFycm93X1VwIikudG9VcHBlckNhc2UoKSwgbmV3IEludGVnZXIoU1dULkFSUk9XX1VQKSk7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYWxpemVkS2V5Q29kZXMKLQkJCQkucHV0KAotCQkJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJBcnJvd19Eb3duIikudG9VcHBlckNhc2UoKSwgbmV3IEludGVnZXIoU1dULkFSUk9XX0RPV04pKTsgLy8kTk9OLU5MUy0xJAotCQlsb2NhbGl6ZWRLZXlDb2RlcwotCQkJCS5wdXQoCi0JCQkJCQlKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkFycm93X0xlZnQiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcihTV1QuQVJST1dfTEVGVCkpOyAvLyROT04tTkxTLTEkCi0JCWxvY2FsaXplZEtleUNvZGVzCi0JCQkJLnB1dCgKLQkJCQkJCUpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiQXJyb3dfUmlnaHQiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcihTV1QuQVJST1dfUklHSFQpKTsgLy8kTk9OLU5MUy0xJAotCQlsb2NhbGl6ZWRLZXlDb2RlcwotCQkJCS5wdXQoCi0JCQkJCQlKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIlBhZ2VfVXAiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcihTV1QuUEFHRV9VUCkpOyAvLyROT04tTkxTLTEkCi0JCWxvY2FsaXplZEtleUNvZGVzCi0JCQkJLnB1dCgKLQkJCQkJCUpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiUGFnZV9Eb3duIikudG9VcHBlckNhc2UoKSwgbmV3IEludGVnZXIoU1dULlBBR0VfRE9XTikpOyAvLyROT04tTkxTLTEkCi0JCWxvY2FsaXplZEtleUNvZGVzCi0JCQkJLnB1dCgKLQkJCQkJCUpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiSG9tZSIpLnRvVXBwZXJDYXNlKCksIG5ldyBJbnRlZ2VyKFNXVC5IT01FKSk7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYWxpemVkS2V5Q29kZXMKLQkJCQkucHV0KAotCQkJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJFbmQiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcihTV1QuRU5EKSk7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYWxpemVkS2V5Q29kZXMKLQkJCQkucHV0KAotCQkJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJJbnNlcnQiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcihTV1QuSU5TRVJUKSk7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYWxpemVkS2V5Q29kZXMKLQkJCQkucHV0KAotCQkJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJGMSIpLnRvVXBwZXJDYXNlKCksIG5ldyBJbnRlZ2VyKFNXVC5GMSkpOyAvLyROT04tTkxTLTEkCi0JCWxvY2FsaXplZEtleUNvZGVzCi0JCQkJLnB1dCgKLQkJCQkJCUpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRjIiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcihTV1QuRjIpKTsgLy8kTk9OLU5MUy0xJAotCQlsb2NhbGl6ZWRLZXlDb2RlcwotCQkJCS5wdXQoCi0JCQkJCQlKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkYzIikudG9VcHBlckNhc2UoKSwgbmV3IEludGVnZXIoU1dULkYzKSk7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYWxpemVkS2V5Q29kZXMKLQkJCQkucHV0KAotCQkJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJGNCIpLnRvVXBwZXJDYXNlKCksIG5ldyBJbnRlZ2VyKFNXVC5GNCkpOyAvLyROT04tTkxTLTEkCi0JCWxvY2FsaXplZEtleUNvZGVzCi0JCQkJLnB1dCgKLQkJCQkJCUpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRjUiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcihTV1QuRjUpKTsgLy8kTk9OLU5MUy0xJAotCQlsb2NhbGl6ZWRLZXlDb2RlcwotCQkJCS5wdXQoCi0JCQkJCQlKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkY2IikudG9VcHBlckNhc2UoKSwgbmV3IEludGVnZXIoU1dULkY2KSk7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYWxpemVkS2V5Q29kZXMKLQkJCQkucHV0KAotCQkJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJGNyIpLnRvVXBwZXJDYXNlKCksIG5ldyBJbnRlZ2VyKFNXVC5GNykpOyAvLyROT04tTkxTLTEkCi0JCWxvY2FsaXplZEtleUNvZGVzCi0JCQkJLnB1dCgKLQkJCQkJCUpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiRjgiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcihTV1QuRjgpKTsgLy8kTk9OLU5MUy0xJAotCQlsb2NhbGl6ZWRLZXlDb2RlcwotCQkJCS5wdXQoCi0JCQkJCQlKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkY5IikudG9VcHBlckNhc2UoKSwgbmV3IEludGVnZXIoU1dULkY5KSk7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYWxpemVkS2V5Q29kZXMKLQkJCQkucHV0KAotCQkJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJGMTAiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcihTV1QuRjEwKSk7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYWxpemVkS2V5Q29kZXMKLQkJCQkucHV0KAotCQkJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJGMTEiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcihTV1QuRjExKSk7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYWxpemVkS2V5Q29kZXMKLQkJCQkucHV0KAotCQkJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJGMTIiKS50b1VwcGVyQ2FzZSgpLCBuZXcgSW50ZWdlcihTV1QuRjEyKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBsaXN0IG9mIGxvY2FsaXplZCBtb2RpZmllcnMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRMb2NhbGl6ZWRNb2RpZmllcnMoKSB7Ci0JCWxvY2FsaXplZEN0cmwgPSBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkN0cmwiKS50b1VwcGVyQ2FzZSgpOyAvLyROT04tTkxTLTEkCi0JCWxvY2FsaXplZFNoaWZ0ID0gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJTaGlmdCIpLnRvVXBwZXJDYXNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYWxpemVkQWx0ID0gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJBbHQiKS50b1VwcGVyQ2FzZSgpOyAvLyROT04tTkxTLTEkCi0JCWxvY2FsaXplZENvbW1hbmQgPSBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkNvbW1hbmQiKS50b1VwcGVyQ2FzZSgpOyAvLyROT04tTkxTLTEkCQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgcmVtb3ZpbmcgYW55IG9wdGlvbmFsIGFjY2VsZXJhdG9yIHRleHQgZnJvbSB0aGUKLQkgKiBnaXZlbiBzdHJpbmcuIFRoZSBhY2NlbGVyYXRvciB0ZXh0IGFwcGVhcnMgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dCwgYW5kIGlzCi0JICogc2VwYXJhdGVkIGZyb20gdGhlIG1haW4gcGFydCBieSBhIHNpbmdsZSB0YWIgY2hhcmFjdGVyIDxjb2RlPidcdCc8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dAotCSAqIEByZXR1cm4gdGhlIHRleHQgc2FucyBhY2NlbGVyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHJlbW92ZUFjY2VsZXJhdG9yVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgewotCQlpbnQgaW5kZXggPSB0ZXh0Lmxhc3RJbmRleE9mKCdcdCcpOwotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlpbmRleCA9IHRleHQubGFzdEluZGV4T2YoJ0AnKTsKLQkJaWYgKGluZGV4ID49IDApCi0JCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHJlbW92aW5nIGFueSBtbmVtb25pY3MgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLiBGb3IKLQkgKiBleGFtcGxlLCA8Y29kZT5yZW1vdmVNbmVtb25pY3MoIiZPcGVuIik8L2NvZGU+IHdpbGwgcmV0dXJuCi0JICogPGNvZGU+Ik9wZW4iPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IHNhbnMgbW5lbW9uaWNzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVtb3ZlTW5lbW9uaWNzKGZpbmFsIFN0cmluZyB0ZXh0KSB7Ci0JCWludCBpbmRleCA9IHRleHQuaW5kZXhPZignJicpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCWludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbik7Ci0JCWludCBsYXN0SW5kZXggPSAwOwotCQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJCS8vIGlnbm9yZSAmIGF0IHRoZSBlbmQKLQkJCWlmIChpbmRleCA9PSBsZW4gLSAxKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvLyBoYW5kbGUgdGhlICYmIGNhc2UKLQkJCWlmICh0ZXh0LmNoYXJBdChpbmRleCArIDEpID09ICcmJykgewotCQkJCSsraW5kZXg7Ci0JCQl9Ci0KLQkJCS8vIERCQ1MgbGFuZ3VhZ2VzIHVzZSAiKCZYKSIgZm9ybWF0Ci0JCQlpZiAoaW5kZXggPiAwICYmIHRleHQuY2hhckF0KGluZGV4IC0gMSkgPT0gJygnCi0JCQkJCSYmIHRleHQubGVuZ3RoKCkgPj0gaW5kZXggKyAzCi0JCQkJCSYmIHRleHQuY2hhckF0KGluZGV4ICsgMikgPT0gJyknKSB7Ci0JCQkJc2IuYXBwZW5kKHRleHQuc3Vic3RyaW5nKGxhc3RJbmRleCwgaW5kZXggLSAxKSk7Ci0JCQkJaW5kZXggKz0gMzsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKHRleHQuc3Vic3RyaW5nKGxhc3RJbmRleCwgaW5kZXgpKTsKLQkJCQkvLyBza2lwIHRoZSAmCi0JCQkJKytpbmRleDsKLQkJCX0KLQotCQkJbGFzdEluZGV4ID0gaW5kZXg7Ci0JCQlpbmRleCA9IHRleHQuaW5kZXhPZignJicsIGluZGV4KTsKLQkJfQotCQlpZiAobGFzdEluZGV4IDwgbGVuKSB7Ci0JCQlzYi5hcHBlbmQodGV4dC5zdWJzdHJpbmcobGFzdEluZGV4LCBsZW4pKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBMZWdhY3lBY3Rpb25Ub29scygpIHsKLQkJLy8gRG9lcyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vTWVudU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9NZW51TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjIzNGRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9NZW51TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGVjb3JhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotCi0vKioKLSAqIEEgbWVudSBtYW5hZ2VyIGlzIGEgY29udHJpYnV0aW9uIG1hbmFnZXIgd2hpY2ggcmVhbGl6ZXMgaXRzZWxmIGFuZCBpdHMgaXRlbXMKLSAqIGluIGEgbWVudSBjb250cm9sOyBlaXRoZXIgYXMgYSBtZW51IGJhciwgYSBzdWItbWVudSwgb3IgYSBjb250ZXh0IG1lbnUuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgbWF5IGFsc28gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lbnVNYW5hZ2VyIGV4dGVuZHMgQ29udHJpYnV0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElNZW51TWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWVudSBpZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIExpc3Qgb2YgcmVnaXN0ZXJlZCBtZW51IGxpc3RlbmVycyAoZWxlbWVudCB0eXBlOiA8Y29kZT5JTWVudUxpc3RlbmVyPC9jb2RlPikuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1lbnUgY29udHJvbDsgPGNvZGU+bnVsbDwvY29kZT4gYmVmb3JlCi0gICAgICogY3JlYXRpb24gYW5kIGFmdGVyIGRpc3Bvc2FsLgotICAgICAqLwotICAgIHByaXZhdGUgTWVudSBtZW51ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZW51IGl0ZW0gd2lkZ2V0OyA8Y29kZT5udWxsPC9jb2RlPiBiZWZvcmUKLSAgICAgKiBjcmVhdGlvbiBhbmQgYWZ0ZXIgZGlzcG9zYWwuIFRoaXMgZmllbGQgaXMgdXNlZAotICAgICAqIHdoZW4gdGhpcyBtZW51IG1hbmFnZXIgaXMgYSBzdWItbWVudS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1lbnVJdGVtIG1lbnVJdGVtOwotCi0gICAgLyoqCi0gICAgICogVGhlIHRleHQgZm9yIGEgc3ViLW1lbnUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVudVRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgb3ZlcnJpZGVzIGZvciBpdGVtcyBvZiB0aGlzIG1hbmFnZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIElDb250cmlidXRpb25NYW5hZ2VyT3ZlcnJpZGVzIG92ZXJyaWRlczsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYXJlbnQgY29udHJpYnV0aW9uIG1hbmFnZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJQ29udHJpYnV0aW9uTWFuYWdlciBwYXJlbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciA8Y29kZT5yZW1vdmVBbGw8L2NvZGU+IHNob3VsZCBiZQotICAgICAqIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgbWVudSBpcyBkaXNwbGF5ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZUFsbFdoZW5TaG93biA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoaXMgaXRlbSBpcyB2aXNpYmxlIGluIGl0cyBtYW5hZ2VyOyA8Y29kZT50cnVlPC9jb2RlPiAKLSAgICAgKiBieSBkZWZhdWx0LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZW51IG1hbmFnZXIuICBUaGUgdGV4dCBhbmQgaWQgYXJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIFR5cGljYWxseSB1c2VkIGZvciBjcmVhdGluZyBhIGNvbnRleHQgbWVudSwgd2hlcmUgaXQgZG9lc24ndCBuZWVkIHRvIGJlIHJlZmVycmVkIHRvIGJ5IGlkLgotICAgICAqLwotICAgIHB1YmxpYyBNZW51TWFuYWdlcigpIHsKLSAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVudSBtYW5hZ2VyIHdpdGggdGhlIGdpdmVuIHRleHQuIFRoZSBpZCBvZiB0aGUgbWVudQotICAgICAqIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIFR5cGljYWxseSB1c2VkIGZvciBjcmVhdGluZyBhIHN1Yi1tZW51LCB3aGVyZSBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgcmVmZXJyZWQgdG8gYnkgaWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCBmb3IgdGhlIG1lbnUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVudU1hbmFnZXIoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgdGhpcyh0ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVudSBtYW5hZ2VyIHdpdGggdGhlIGdpdmVuIHRleHQgYW5kIGlkLgotICAgICAqIFR5cGljYWxseSB1c2VkIGZvciBjcmVhdGluZyBhIHN1Yi1tZW51LCB3aGVyZSBpdCBuZWVkcyB0byBiZSByZWZlcnJlZCB0byBieSBpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IGZvciB0aGUgbWVudSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSBpZCB0aGUgbWVudSBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgdG8gaGF2ZSBubyBpZAotICAgICAqLwotICAgIHB1YmxpYyBNZW51TWFuYWdlcihTdHJpbmcgdGV4dCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMubWVudVRleHQgPSB0ZXh0OwotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlciNhZGRNZW51TGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWVudUxpc3RlbmVyKElNZW51TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBTV1QgY29udGV4dCBtZW51IGNvbnRyb2wgZm9yIHRoaXMgbWVudSwKLSAgICAgKiBhbmQgaW5zdGFsbHMgYWxsIHJlZ2lzdGVyZWQgY29udHJpYnV0aW9ucy4KLSAgICAgKiBEb2VzIG5vdCBjcmVhdGUgYSBuZXcgY29udHJvbCBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBtZW51IGlzIG5vdCBleHBlY3RlZCB0byBiZSBkeW5hbWljLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHJldHVybiB0aGUgbWVudSBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIE1lbnUgY3JlYXRlQ29udGV4dE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLSAgICAgICAgaWYgKCFtZW51RXhpc3QoKSkgewotICAgICAgICAgICAgbWVudSA9IG5ldyBNZW51KHBhcmVudCk7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVudSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZW51OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYW4gU1dUIG1lbnUgYmFyIGNvbnRyb2wgZm9yIHRoaXMgbWVudSwKLSAgICAgKiBmb3IgdXNlIGluIHRoZSBnaXZlbiA8Y29kZT5EZWNvcmF0aW9uczwvY29kZT4sIGFuZCBpbnN0YWxscyBhbGwgcmVnaXN0ZXJlZAotICAgICAqIGNvbnRyaWJ1dGlvbnMuIERvZXMgbm90IGNyZWF0ZSBhIG5ldyBjb250cm9sIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBkZWNvcmF0aW9ucwotICAgICAqIEByZXR1cm4gdGhlIG1lbnUgY29udHJvbAotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVudSBjcmVhdGVNZW51QmFyKERlY29yYXRpb25zIHBhcmVudCkgewotICAgICAgICBpZiAoIW1lbnVFeGlzdCgpKSB7Ci0gICAgICAgICAgICBtZW51ID0gbmV3IE1lbnUocGFyZW50LCBTV1QuQkFSKTsKLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lbnU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBTV1QgbWVudSBiYXIgY29udHJvbCBmb3IgdGhpcyBtZW51LCBmb3IgdXNlIGluIHRoZQotICAgICAqIGdpdmVuIDxjb2RlPlNoZWxsPC9jb2RlPiwgYW5kIGluc3RhbGxzIGFsbCByZWdpc3RlcmVkIGNvbnRyaWJ1dGlvbnMuIERvZXMgbm90Ci0gICAgICogY3JlYXRlIGEgbmV3IGNvbnRyb2wgaWYgb25lIGFscmVhZHkgZXhpc3RzLiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjYWxscwotICAgICAqIHRoZSA8Y29kZT5jcmVhdGVNZW51QmFyKERlY29yYXRpb25zKTwvY29kZT4gbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgZGVjb3JhdGlvbnMKLSAgICAgKiBAcmV0dXJuIHRoZSBtZW51IGNvbnRyb2wKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgPGNvZGU+Y3JlYXRlTWVudUJhcihEZWNvcmF0aW9ucyk8L2NvZGU+IGluc3RlYWQuCi0gICAgICovCi0gICAgcHVibGljIE1lbnUgY3JlYXRlTWVudUJhcihTaGVsbCBwYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU1lbnVCYXIoKERlY29yYXRpb25zKSBwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3Bvc2VzIG9mIHRoaXMgbWVudSBtYW5hZ2VyIGFuZCBmcmVlcyBhbGwgYWxsb2NhdGVkIFNXVCByZXNvdXJjZXMuCi0gICAgICogTm90aWZpZXMgYWxsIGNvbnRyaWJ1dGlvbiBpdGVtcyBvZiB0aGUgZGlzcG9zZS4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMKLSAgICAgKiBub3QgY2xlYW4gdXAgcmVmZXJlbmNlcyBiZXR3ZWVuIHRoaXMgbWVudSBtYW5hZ2VyIGFuZCBpdHMgYXNzb2NpYXRlZAotICAgICAqIGNvbnRyaWJ1dGlvbiBpdGVtcy4gVXNlIDxjb2RlPnJlbW92ZUFsbDwvY29kZT4gZm9yIHRoYXQgcHVycG9zZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAobWVudUV4aXN0KCkpCi0gICAgICAgICAgICBtZW51LmRpc3Bvc2UoKTsKLSAgICAgICAgbWVudSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKG1lbnVJdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lbnVJdGVtLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIG1lbnVJdGVtID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIElDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBnZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpdGVtc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI2ZpbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhciwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoQ29vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnUsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsKE1lbnUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKG1lbnVJdGVtID09IG51bGwgfHwgbWVudUl0ZW0uaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkKLSAgICAgICAgICAgICAgICBtZW51SXRlbSA9IG5ldyBNZW51SXRlbShwYXJlbnQsIFNXVC5DQVNDQURFLCBpbmRleCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0ocGFyZW50LCBTV1QuQ0FTQ0FERSk7Ci0KLSAgICAgICAgICAgIG1lbnVJdGVtLnNldFRleHQoZ2V0TWVudVRleHQoKSk7Ci0KLSAgICAgICAgICAgIGlmICghbWVudUV4aXN0KCkpCi0gICAgICAgICAgICAgICAgbWVudSA9IG5ldyBNZW51KHBhcmVudCk7Ci0KLSAgICAgICAgICAgIG1lbnVJdGVtLnNldE1lbnUobWVudSk7Ci0KLSAgICAgICAgICAgIGluaXRpYWxpemVNZW51KCk7Ci0KLSAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBzdWJtZW51LCBpbiBvcmRlciB0byBlbmFibGUgYWNjZWxlcmF0b3JzCi0gICAgICAgICAgICAvLyBhbmQgdG8gc2V0IGVuYWJsZWQgc3RhdGUgb24gdGhlIG1lbnVJdGVtIHByb3Blcmx5Ci0gICAgICAgICAgICB1cGRhdGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyLCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbChUb29sQmFyIHBhcmVudCwgaW50IGluZGV4KSB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlciNmaW5kTWVudVVzaW5nUGF0aChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBJTWVudU1hbmFnZXIgZmluZE1lbnVVc2luZ1BhdGgoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IGZpbmRVc2luZ1BhdGgocGF0aCk7Ci0gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgSU1lbnVNYW5hZ2VyKQotICAgICAgICAgICAgcmV0dXJuIChJTWVudU1hbmFnZXIpIGl0ZW07Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIjZmluZFVzaW5nUGF0aChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbSBmaW5kVXNpbmdQYXRoKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIFN0cmluZyBpZCA9IHBhdGg7Ci0gICAgICAgIFN0cmluZyByZXN0ID0gbnVsbDsKLSAgICAgICAgaW50IHNlcGFyYXRvciA9IHBhdGguaW5kZXhPZignLycpOwotICAgICAgICBpZiAoc2VwYXJhdG9yICE9IC0xKSB7Ci0gICAgICAgICAgICBpZCA9IHBhdGguc3Vic3RyaW5nKDAsIHNlcGFyYXRvcik7Ci0gICAgICAgICAgICByZXN0ID0gcGF0aC5zdWJzdHJpbmcoc2VwYXJhdG9yICsgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZmluZChwYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBzdXBlci5maW5kKGlkKTsKLSAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpIHsKLSAgICAgICAgICAgIElNZW51TWFuYWdlciBtYW5hZ2VyID0gKElNZW51TWFuYWdlcikgaXRlbTsKLSAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyLmZpbmRVc2luZ1BhdGgocmVzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgYW55IG1lbnUgbGlzdGVuZXJzIHRoYXQgYSBtZW51IGlzIGFib3V0IHRvIHNob3cuCi0gICAgICogT25seSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hbmFnZXIgdGhlIG1lbnUgbWFuYWdlcgotICAgICAqCi0gICAgICogQHNlZSBJTWVudUxpc3RlbmVyI21lbnVBYm91dFRvU2hvdwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmaXJlQWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgT2JqZWN0W10gbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAoKElNZW51TGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkubWVudUFib3V0VG9TaG93KG1hbmFnZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgYW55IG1lbnUgbGlzdGVuZXJzIHRoYXQgYSBtZW51IGlzIGFib3V0IHRvIGhpZGUuCi0gICAgICogT25seSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hbmFnZXIgdGhlIG1lbnUgbWFuYWdlcgotICAgICAqCi0gICAgICogQHNlZSBJTWVudUxpc3RlbmVyI21lbnVBYm91dFRvSGlkZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmaXJlQWJvdXRUb0hpZGUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgZmluYWwgT2JqZWN0W10gbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgIAlmaW5hbCBPYmplY3QgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07Ci0JCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJTWVudUxpc3RlbmVyMikgewotCQkJCWZpbmFsIElNZW51TGlzdGVuZXIyIGxpc3RlbmVyMiA9IChJTWVudUxpc3RlbmVyMikgbGlzdGVuZXI7Ci0JCQkJbGlzdGVuZXIyLm1lbnVBYm91dFRvSGlkZShtYW5hZ2VyKTsKLQkJCX0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotCSAqIFJldHVybnMgdGhlIG1lbnUgaWQuIFRoZSBtZW51IGlkIGlzIHVzZWQgd2hlbiBjcmVhdGluZyBhIGNvbnRyaWJ1dGlvbgotCSAqIGl0ZW0gZm9yIGFkZGluZyB0aGlzIG1lbnUgYXMgYSBzdWIgbWVudSBvZiBhbm90aGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1lbnUgaWQKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU1dUIG1lbnUgY29udHJvbCBmb3IgdGhpcyBtZW51IG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBtZW51IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVudSBnZXRNZW51KCkgewotICAgICAgICByZXR1cm4gbWVudTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHNob3duIGluIHRoZSBtZW51LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWVudSB0ZXh0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZW51VGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1lbnVUZXh0OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlciNnZXRPdmVycmlkZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBJQ29udHJpYnV0aW9uTWFuYWdlck92ZXJyaWRlcyBnZXRPdmVycmlkZXMoKSB7Ci0gICAgICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3ZlcnJpZGVzID0gbmV3IElDb250cmlidXRpb25NYW5hZ2VyT3ZlcnJpZGVzKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSW50ZWdlciBnZXRBY2NlbGVyYXRvcihJQ29udHJpYnV0aW9uSXRlbSBpdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZWxlcmF0b3JUZXh0KElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gZ2V0RW5hYmxlZChJQ29udHJpYnV0aW9uSXRlbSBpdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChJQ29udHJpYnV0aW9uSXRlbSBpdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG92ZXJyaWRlcyA9IHBhcmVudC5nZXRPdmVycmlkZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN1cGVyLnNldE92ZXJyaWRlcyhvdmVycmlkZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdmVycmlkZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50IGNvbnRyaWJ1dGlvbiBtYW5hZ2VyIG9mIHRoaXMgbWFuZ2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBjb250cmlidXRpb24gbWFuYWdlcgotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgSUNvbnRyaWJ1dGlvbk1hbmFnZXIgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIjZ2V0UmVtb3ZlQWxsV2hlblNob3duKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW1vdmVBbGxXaGVuU2hvd24oKSB7Ci0gICAgICAgIHJldHVybiByZW1vdmVBbGxXaGVuU2hvd247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgYWxsIGxpc3RlbmVycyB0aGF0IHRoaXMgbWVudSBpcyBhYm91dCB0byBhcHBlYXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFib3V0VG9TaG93KCkgewotICAgICAgICBpZiAocmVtb3ZlQWxsV2hlblNob3duKQotICAgICAgICAgICAgcmVtb3ZlQWxsKCk7Ci0gICAgICAgIGZpcmVBYm91dFRvU2hvdyh0aGlzKTsKLSAgICAgICAgdXBkYXRlKGZhbHNlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyBhbGwgbGlzdGVuZXJzIHRoYXQgdGhpcyBtZW51IGlzIGFib3V0IHRvIGRpc2FwcGVhci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWJvdXRUb0hpZGUoKSB7Ci0gICAgICAgIGZpcmVBYm91dFRvSGlkZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgbWVudSBjb250cm9sLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplTWVudSgpIHsKLSAgICAgICAgbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vCQkJQXBwbGljYXRpb25XaW5kb3cucmVzZXREZXNjcmlwdGlvbihlLndpZGdldCk7Ci0gICAgICAgICAgICAJaGFuZGxlQWJvdXRUb0hpZGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQWJvdXRUb1Nob3coKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIC8vIERvbid0IGRvIGFuIHVwZGF0ZSh0cnVlKSBoZXJlLCBpbiBjYXNlIG1lbnUgaXMgbmV2ZXIgb3BlbmVkLgotICAgICAgICAvLyBBbHdheXMgZG8gaXQgbGF6aWx5IGluIGhhbmRsZUFib3V0VG9TaG93KCkuCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI2lzRHluYW1pYygpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbWVudSBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuCi0gICAgICogVXNlZCB0byBlbmFibGUgdGhlIG1lbnUgaXRlbSBjb250YWluaW5nIHRoaXMgbWVudSB3aGVuIGl0IGlzIHJlYWxpemVkIGFzIGEgc3ViLW1lbnUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kCi0gICAgICogcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmFibGVkLCBhbmQKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBkaXNhYmxlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI2lzR3JvdXBNYXJrZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR3JvdXBNYXJrZXIoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jaXNTZXBhcmF0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2VwYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgdGhpcyBtZXRob2QgaXMgbm8gbG9uZ2VyIGEgcGFydCBvZiB0aGUgCi0gICAgICogICB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtfSBBUEkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdWJzdGl0dXRlRm9yKElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKGl0ZW0pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbSNpc1Zpc2libGUoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLSAgICAgICAgaWYgKCF2aXNpYmxlKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzaG9ydCBjaXJjdXQgY2FsY3VsYXRpb25zIGluIHRoaXMgY2FzZQotCi0gICAgICAgIC8vIG1lbnVzIGFyZW50IHZpc2libGUgaWYgYWxsIG9mIGl0cyBjaGlsZHJlbiBhcmUgaW52aXNpYmxlIChvciBvbmx5IGNvbnRhaW5zIHZpc2libGUgc2VwYXJhdG9ycykuCi0gICAgICAgIElDb250cmlidXRpb25JdGVtW10gY2hpbGRJdGVtcyA9IGdldEl0ZW1zKCk7Ci0gICAgICAgIGJvb2xlYW4gdmlzaWJsZUNoaWxkcmVuID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRJdGVtcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgaWYgKGNoaWxkSXRlbXNbal0uaXNWaXNpYmxlKCkgJiYgIWNoaWxkSXRlbXNbal0uaXNTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgICAgIHZpc2libGVDaGlsZHJlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmlzaWJsZUNoaWxkcmVuOwotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5NZW51TWFuYWdlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5Db250cmlidXRpb25NYW5hZ2VyPC9jb2RlPiBtZXRob2QKLSAgICAgKiBhbHNvIHByb3BhZ2F0ZXMgdGhlIGRpcnR5IGZsYWcgdXAgdGhlIHBhcmVudCBjaGFpbi4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWFya0RpcnR5KCkgewotICAgICAgICBzdXBlci5tYXJrRGlydHkoKTsKLSAgICAgICAgLy8gQ2FuJ3Qgb3B0aW1pemUgYnkgc2hvcnQtY2lyY3VpdGluZyB3aGVuIHRoZSBmaXJzdCBkaXJ0eSBtYW5hZ2VyIGlzIGVuY291bnRlcmVkLAotICAgICAgICAvLyBzaW5jZSBub24tdmlzaWJsZSBjaGlsZHJlbiBhcmUgbm90IGV2ZW4gcHJvY2Vzc2VkLgotICAgICAgICAvLyBUaGF0IGlzLCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgYSBkaXJ0eSBzdWItbWVudSB1bmRlciBhIG5vbi1kaXJ0eSBwYXJlbnQgbWVudQotICAgICAgICAvLyBldmVuIGFmdGVyIHRoZSBwYXJlbnQgbWVudSBoYXMgYmVlbiB1cGRhdGVkLiAKLSAgICAgICAgLy8gSWYgaXRlbXMgYXJlIGFkZGVkL3JlbW92ZWQgaW4gdGhlIHN1Yi1tZW51LCB3ZSBzdGlsbCBuZWVkIHRvIHByb3BhZ2F0ZSB0aGUgZGlydHkgZmxhZyB1cCwKLSAgICAgICAgLy8gZXZlbiBpZiB0aGUgc3ViLW1lbnUgaXMgYWxyZWFkeSBkaXJ0eSwgc2luY2UgdGhlIHJlc3VsdCBvZiBpc1Zpc2libGUoKSBtYXkgY2hhbmdlCi0gICAgICAgIC8vIGR1ZSB0byB0aGUgYWRkZWQvcmVtb3ZlZCBpdGVtcy4KLSAgICAgICAgSUNvbnRyaWJ1dGlvbk1hbmFnZXIgcGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyZW50Lm1hcmtEaXJ0eSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbWVudSBjb250cm9sIGlzIGNyZWF0ZWQKLSAgICAgKiBhbmQgbm90IGRpc3Bvc2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRyb2wgaXMgY3JlYXRlZAotICAgICAqCWFuZCBub3QgZGlzcG9zZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbWVudUV4aXN0KCkgewotICAgICAgICByZXR1cm4gbWVudSAhPSBudWxsICYmICFtZW51LmlzRGlzcG9zZWQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyI3JlbW92ZU1lbnVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVNZW51TGlzdGVuZXIoSU1lbnVMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jc2F2ZVdpZGdldFN0YXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzYXZlV2lkZ2V0U3RhdGUoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgb3ZlcnJpZGVzIGZvciB0aGlzIGNvbnRyaWJ1dGlvbiBtYW5hZ2VyCi0gICAgICogCi0gICAgICogQHBhcmFtIG5ld092ZXJyaWRlcyB0aGUgb3ZlcnJpZGVzIGZvciB0aGUgaXRlbXMgb2YgdGhpcyBtYW5hZ2VyCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJyaWRlcyhJQ29udHJpYnV0aW9uTWFuYWdlck92ZXJyaWRlcyBuZXdPdmVycmlkZXMpIHsKLSAgICAgICAgb3ZlcnJpZGVzID0gbmV3T3ZlcnJpZGVzOwotICAgICAgICBzdXBlci5zZXRPdmVycmlkZXMob3ZlcnJpZGVzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jc2V0UGFyZW50KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICBwYXJlbnQgPSBtYW5hZ2VyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIjc2V0UmVtb3ZlQWxsV2hlblNob3duKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlQWxsV2hlblNob3duKGJvb2xlYW4gcmVtb3ZlQWxsKSB7Ci0gICAgICAgIHRoaXMucmVtb3ZlQWxsV2hlblNob3duID0gcmVtb3ZlQWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbSNzZXRWaXNpYmxlKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jdXBkYXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0gICAgICAgIHVwZGF0ZU1lbnVJdGVtKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPk1lbnVNYW5hZ2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklDb250cmlidXRpb25NYW5hZ2VyPC9jb2RlPgotICAgICAqIHVwZGF0ZXMgdGhpcyBtZW51LCBidXQgbm90IGFueSBvZiBpdHMgc3VibWVudXMuCi0gICAgICoKLSAgICAgKiBAc2VlICN1cGRhdGVBbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoYm9vbGVhbiBmb3JjZSkgewotICAgICAgICB1cGRhdGUoZm9yY2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnRhbGx5IGJ1aWxkcyB0aGUgbWVudSBmcm9tIHRoZSBjb250cmlidXRpb24gaXRlbXMuCi0gICAgICogVGhpcyBtZXRob2QgbGVhdmVzIG91dCBkb3VibGUgc2VwYXJhdG9ycyBhbmQgc2VwYXJhdG9ycyBpbiB0aGUgZmlyc3QgCi0gICAgICogb3IgbGFzdCBwb3NpdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiBtZWFucyB1cGRhdGUgZXZlbiBpZiBub3QgZGlydHksCi0gICAgICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBub3JtYWwgaW5jcmVtZW50YWwgdXBkYXRpbmcKLSAgICAgKiBAcGFyYW0gcmVjdXJzaXZlIDxjb2RlPnRydWU8L2NvZGU+IG1lYW5zIHJlY3Vyc2l2ZWx5IHVwZGF0ZSAKLSAgICAgKiAgIGFsbCBzdWJtZW51cywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBtZWFucyBqdXN0IHRoaXMgbWVudQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZShib29sZWFuIGZvcmNlLCBib29sZWFuIHJlY3Vyc2l2ZSkgewotICAgICAgICBpZiAoaXNEaXJ0eSgpIHx8IGZvcmNlKSB7Ci0gICAgICAgICAgICBpZiAobWVudUV4aXN0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBjbGVhbiBjb250YWlucyBhbGwgYWN0aXZlIGl0ZW1zIHdpdGhvdXQgZG91YmxlIHNlcGFyYXRvcnMKLSAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICBMaXN0IGNsZWFuID0gbmV3IEFycmF5TGlzdChpdGVtcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIHNlcGFyYXRvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBjaSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWNpLmlzVmlzaWJsZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaS5pc1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheSBjcmVhdGlvbiB1bnRpbCBuZWNlc3NhcnkgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAoaGFuZGxlcyBib3RoIGFkamFjZW50IHNlcGFyYXRvcnMsIGFuZCBzZXBhcmF0b3IgYXQgZW5kKQotICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gY2k7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VwYXJhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYW4uc2l6ZSgpID4gMCkgLy8gbm8gc2VwYXJhdG9yIGlmIGZpcnN0IGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW4uYWRkKHNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuLmFkZChjaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgb2Jzb2xldGUgKHJlbW92ZWQgb3Igbm9uIGFjdGl2ZSkKLSAgICAgICAgICAgICAgICBNZW51SXRlbVtdIG1pID0gbWVudS5nZXRJdGVtcygpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgZGF0YSA9IG1pW2ldLmdldERhdGEoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsIHx8ICFjbGVhbi5jb250YWlucyhkYXRhKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWlbaV0uZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBJQ29udHJpYnV0aW9uSXRlbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoSUNvbnRyaWJ1dGlvbkl0ZW0pIGRhdGEpLmlzRHluYW1pYygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChJQ29udHJpYnV0aW9uSXRlbSkgZGF0YSkuaXNEaXJ0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaVtpXS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgbmV3Ci0gICAgICAgICAgICAgICAgbWkgPSBtZW51LmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICAgICAgaW50IHNyY0l4ID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgZGVzdEl4ID0gMDsKLQotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgZSA9IGNsZWFuLml0ZXJhdG9yKCk7IGUuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBzcmMgPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGUubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBkZXN0OwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCBjb3JyZXNwb25kaW5nIGl0ZW0gaW4gU1dUIHdpZGdldAotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjSXggPCBtaS5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKElDb250cmlidXRpb25JdGVtKSBtaVtzcmNJeF0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdCAhPSBudWxsICYmIHNyYy5lcXVhbHMoZGVzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0l4Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0SXgrKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXN0ICE9IG51bGwgJiYgZGVzdC5pc1NlcGFyYXRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3JjLmlzU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pW3NyY0l4XS5zZXREYXRhKHNyYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNJeCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdEl4Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBtZW51LmdldEl0ZW1Db3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmZpbGwobWVudSwgZGVzdEl4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdJdGVtcyA9IG1lbnUuZ2V0SXRlbUNvdW50KCkgLSBzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3SXRlbXM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBtZW51LmdldEl0ZW0oZGVzdEl4KyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0RGF0YShzcmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTWF5IGJlIHdlIGNhbiBvcHRpbWl6ZSB0aGlzIGNhbGwuIElmIHRoZSBtZW51IGhhcyBqdXN0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gY3JlYXRlZCB2aWEgdGhlIGNhbGwgc3JjLmZpbGwoZk1lbnVCYXIsIGRlc3RJeCkgdGhlbgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWVudSBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWQgd2l0aCB1cGRhdGUodHJ1ZSkgCi0gICAgICAgICAgICAgICAgICAgIC8vIChzZWUgTWVudU1hbmFnZXIpLiBTbyBpZiBmb3JjZSBpcyB0cnVlIHdlIGRvIGl0IGFnYWluLiBCdXQKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuJ3Qgc2V0IGZvcmNlIHRvIGZhbHNlIHNpbmNlIHRoZW4gaW5mb3JtYXRpb24gZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBzdWIgc3ViIG1lbnVzIGlzIGxvc3QuCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZWN1cnNpdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBzcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0SW5uZXJJdGVtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElNZW51TWFuYWdlcikgaXRlbSkudXBkYXRlQWxsKGZvcmNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFueSBvbGQgbWVudSBpdGVtcyBub3QgYWNjb3VudGVkIGZvcgotICAgICAgICAgICAgICAgIGZvciAoOyBzcmNJeCA8IG1pLmxlbmd0aDsgc3JjSXgrKykKLSAgICAgICAgICAgICAgICAgICAgbWlbc3JjSXhdLmRpc3Bvc2UoKTsKLQotICAgICAgICAgICAgICAgIHNldERpcnR5KGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEkgYW0gbm90IGRpcnR5LiBDaGVjayBpZiBJIG11c3QgcmVjdXJzaXZseSB3YWxrIGRvd24gdGhlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgIGlmIChyZWN1cnNpdmUpIHsKLSAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGNpID0gaXRlbXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgSU1lbnVNYW5hZ2VyIG1tID0gKElNZW51TWFuYWdlcikgY2k7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW0uaXNWaXNpYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbS51cGRhdGVBbGwoZm9yY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZU1lbnVJdGVtKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI3VwZGF0ZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbXNbXSA9IGdldEl0ZW1zKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGl0ZW1zW2ldLnVwZGF0ZShwcm9wZXJ0eSk7Ci0KLSAgICAgICAgaWYgKG1lbnUgIT0gbnVsbCAmJiAhbWVudS5pc0Rpc3Bvc2VkKCkgJiYgbWVudS5nZXRQYXJlbnRJdGVtKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIElBY3Rpb24uVEVYVC5lcXVhbHMocHJvcGVydHkpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGdldE92ZXJyaWRlcygpLmdldFRleHQodGhpcyk7Ci0KLSAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGV4dCA9IGdldE1lbnVUZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBFeHRlcm5hbEFjdGlvbk1hbmFnZXIuSUNhbGxiYWNrIGNhbGxiYWNrID0gRXh0ZXJuYWxBY3Rpb25NYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoKS5nZXRDYWxsYmFjaygpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gdGV4dC5pbmRleE9mKCcmJyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0ZXh0Lmxlbmd0aCgpIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaGFyYWN0ZXIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UodGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hhckF0KGluZGV4ICsgMSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suaXNBY2NlbGVyYXRvckluVXNlKFNXVC5BTFQgfCBjaGFyYWN0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRleHQuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZW51LmdldFBhcmVudEl0ZW0oKS5zZXRUZXh0KHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlciN1cGRhdGVBbGwoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVBbGwoYm9vbGVhbiBmb3JjZSkgewotICAgICAgICB1cGRhdGUoZm9yY2UsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIG1lbnUgaXRlbSBmb3IgdGhpcyBzdWIgbWVudS4KLSAgICAgKiBUaGUgbWVudSBpdGVtIGlzIGRpc2FibGVkIGlmIHRoaXMgc3ViIG1lbnUgaXMgZW1wdHkuCi0gICAgICogRG9lcyBub3RoaW5nIGlmIHRoaXMgbWVudSBpcyBub3QgYSBzdWJtZW51LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVNZW51SXRlbSgpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ29tbWVudGVkIG91dCB1bnRpbCBwcm9wZXIgc29sdXRpb24gdG8gZW5hYmxlbWVudCBvZgotICAgICAgICAgKiBtZW51IGl0ZW0gZm9yIGEgc3ViLW1lbnUgaXMgZm91bmQuIFNlZSBidWcgMzA4MzMgZm9yCi0gICAgICAgICAqIG1vcmUgZGV0YWlscy4KLSAgICAgICAgICogIAotICAgICAgICAgaWYgKG1lbnVJdGVtICE9IG51bGwgJiYgIW1lbnVJdGVtLmlzRGlzcG9zZWQoKSAmJiBtZW51RXhpc3QoKSkgewotICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbXNbXSA9IGdldEl0ZW1zKCk7Ci0gICAgICAgICBib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgIGVuYWJsZWQgPSBpdGVtLmlzRW5hYmxlZCgpOwotICAgICAgICAgaWYoZW5hYmxlZCkgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciAxR0REQ04yOiBTV1Q6TGludXggLSBNZW51SXRlbS5zZXRFbmFibGVkKCkgYWx3YXlzIGNhdXNlcyBhIHJlZHJhdwotICAgICAgICAgaWYgKG1lbnVJdGVtLmdldEVuYWJsZWQoKSAhPSBlbmFibGVkKQotICAgICAgICAgbWVudUl0ZW0uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgIH0KLSAgICAgICAgICovCi0gICAgICAgIC8vIFBhcnRpYWwgZml4IGZvciBidWcgIzM0OTY5IC0gZGlhYmxlIHRoZSBtZW51IGl0ZW0gaWYgbm8KLSAgICAgICAgLy8gaXRlbXMgaW4gc3ViLW1lbnUgKGZvciBjb250ZXh0IG1lbnVzKS4KLSAgICAgICAgaWYgKG1lbnVJdGVtICE9IG51bGwgJiYgIW1lbnVJdGVtLmlzRGlzcG9zZWQoKSAmJiBtZW51RXhpc3QoKSkgewotICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gbWVudS5nZXRJdGVtQ291bnQoKSA+IDA7Ci0gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciAxR0REQ04yOiBTV1Q6TGludXggLSBNZW51SXRlbS5zZXRFbmFibGVkKCkgYWx3YXlzIGNhdXNlcyBhIHJlZHJhdwotICAgICAgICAgICAgaWYgKG1lbnVJdGVtLmdldEVuYWJsZWQoKSAhPSBlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugb25seSBkbyB0aGlzIGZvciBjb250ZXh0IG1lbnVzIChmb3IgYnVnICMzNDk2OSkKLSAgICAgICAgICAgICAgICBNZW51IHRvcE1lbnUgPSBtZW51OwotICAgICAgICAgICAgICAgIHdoaWxlICh0b3BNZW51LmdldFBhcmVudE1lbnUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0b3BNZW51ID0gdG9wTWVudS5nZXRQYXJlbnRNZW51KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCh0b3BNZW51LmdldFN0eWxlKCkgJiBTV1QuQkFSKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBtZW51SXRlbS5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL1NlcGFyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL1NlcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjZhZTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9TZXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLQotLyoqCi0gKiBBIHNlcGFyYXRvciBpcyBhIHNwZWNpYWwga2luZCBvZiBjb250cmlidXRpb24gaXRlbSB3aGljaCBhY3RzCi0gKiBhcyBhIHZpc3VhbCBzZXBhcmF0b3IgYW5kLCBvcHRpb25hbGx5LCBhY3RzIGFzIGEgZ3JvdXAgbWFya2VyLgotICogVW5saWtlIGdyb3VwIG1hcmtlcnMsIHNlcGFyYXRvcnMgZG8gaGF2ZSBhIHZpc3VhbCByZXByZXNlbnRhdGlvbiBmb3IKLSAqIG1lbnVzIGFuZCB0b29sYmFycy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgCi0gKiBzdWJjbGFzc2VkIG91dHNpZGUgdGhlIGZyYW1ld29yay4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFNlcGFyYXRvciBleHRlbmRzIEFic3RyYWN0R3JvdXBNYXJrZXIgewotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzZXBhcmF0b3Igd2hpY2ggZG9lcyBub3Qgc3RhcnQgYSBuZXcgZ3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIFNlcGFyYXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHNlcGFyYXRvciB3aGljaCBhbHNvIGRlZmluZXMgYSBuZXcgZ3JvdXAgaGF2aW5nIHRoZSBnaXZlbiBncm91cCBuYW1lLgotICAgICAqIFRoZSBncm91cCBuYW1lIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIHRoZSBlbXB0eSBzdHJpbmcuCi0gICAgICogVGhlIGdyb3VwIG5hbWUgaXMgYWxzbyB1c2VkIGFzIHRoZSBpdGVtIGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBncm91cE5hbWUgdGhlIGdyb3VwIG5hbWUgb2YgdGhlIHNlcGFyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBTZXBhcmF0b3IoU3RyaW5nIGdyb3VwTmFtZSkgewotICAgICAgICBzdXBlcihncm91cE5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbkl0ZW0uCi0gICAgICogRmlsbHMgdGhlIGdpdmVuIG1lbnUgd2l0aCBhIFNXVCBzZXBhcmF0b3IgTWVudUl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbChNZW51IG1lbnUsIGludCBpbmRleCkgewotICAgICAgICBpZiAoaW5kZXggPj0gMCkKLSAgICAgICAgICAgIG5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SLCBpbmRleCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25JdGVtLgotICAgICAqIEZpbGxzIHRoZSBnaXZlbiB0b29sIGJhciB3aXRoIGEgU1dUIHNlcGFyYXRvciBUb29sSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsKFRvb2xCYXIgdG9vbGJhciwgaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKQotICAgICAgICAgICAgbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5TRVBBUkFUT1IsIGluZGV4KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5TRVBBUkFUT1IpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+U2VwYXJhdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklDb250cmlidXRpb25JdGVtPC9jb2RlPiAKLSAgICAgKiBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2VwYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vU3RhdHVzTGluZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL1N0YXR1c0xpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4NDliMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vU3RhdHVzTGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLQotLyoqCi0gKiBBIFN0YXR1c0xpbmUgY29udHJvbCBpcyBhIFNXVCBDb21wb3NpdGUgd2l0aCBhIGhvcml6b250YWwgbGF5b3V0IHdoaWNoIGhvc3RzCi0gKiBhIG51bWJlciBvZiBzdGF0dXMgaW5kaWNhdGlvbiBjb250cm9scy4KLSAqIFR5cGljYWxseSBpdCBpcyBzaXR1YXRlZCBiZWxvdyB0aGUgY29udGVudCBhcmVhIG9mIHRoZSB3aW5kb3cuCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQgYSBTdGF0dXNMaW5lIGhhcyB0d28gcHJlZGVmaW5lZCBzdGF0dXMgY29udHJvbHM6IGEgTWVzc2FnZUxpbmUgYW5kIGEKLSAqIFByb2dyZXNzSW5kaWNhdG9yIGFuZCBpdCBwcm92aWRlcyBBUEkgZm9yIGVhc3kgYWNjZXNzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGlzIGFuIGludGVybmFsIGNsYXNzLCBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBvdXRzaWRlIHRoZSBKRmFjZSBmcmFtZXdvcmsuCi0gKiA8L3A+Ci0gKi8KLS8qIHBhY2thZ2UgKi9jbGFzcyBTdGF0dXNMaW5lIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSVByb2dyZXNzTW9uaXRvciB7Ci0KLSAgICAvKiogSG9yaXpvbnRhbCBnYXBzIGJldHdlZW4gaXRlbXMuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0FQID0gMzsKLQotICAgIC8qKiBQcm9ncmVzcyBiYXIgY3JlYXRpb24gaXMgZGVsYXllZCBieSB0aGlzIG1zICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMQVlfUFJPR1JFU1MgPSA1MDA7Ci0KLSAgICAvLyBzdGF0ZQotICAgIHByb3RlY3RlZCBib29sZWFuIGZQcm9ncmVzc0lzVmlzaWJsZSA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZkNhbmNlbEJ1dHRvbklzVmlzaWJsZSA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZkNhbmNlbEVuYWJsZWQgPSBmYWxzZTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZlRhc2tOYW1lOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZklzQ2FuY2VsZWQ7Ci0KLSAgICBwcm90ZWN0ZWQgbG9uZyBmU3RhcnRUaW1lOwotCi0gICAgcHJpdmF0ZSBDdXJzb3IgZlN0b3BCdXR0b25DdXJzb3I7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZNZXNzYWdlVGV4dDsKLQotICAgIHByb3RlY3RlZCBJbWFnZSBmTWVzc2FnZUltYWdlOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmRXJyb3JUZXh0OwotCi0gICAgcHJvdGVjdGVkIEltYWdlIGZFcnJvckltYWdlOwotCi0gICAgLy8gU1dUIHdpZGdldHMKLSAgICBwcm90ZWN0ZWQgQ0xhYmVsIGZNZXNzYWdlTGFiZWw7Ci0KLSAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGZQcm9ncmVzc0JhckNvbXBvc2l0ZTsKLQotICAgIHByb3RlY3RlZCBQcm9ncmVzc0luZGljYXRvciBmUHJvZ3Jlc3NCYXI7Ci0KLSAgICBwcm90ZWN0ZWQgVG9vbEJhciBmVG9vbEJhcjsKLQotICAgIHByb3RlY3RlZCBUb29sSXRlbSBmQ2FuY2VsQnV0dG9uOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZmdTdG9wSW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IKLSAgICAgICAgICAgIC5jcmVhdGVGcm9tRmlsZShTdGF0dXNMaW5lLmNsYXNzLCAiaW1hZ2VzL3N0b3AuZ2lmIik7Ly8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyB7Ci0gICAgICAgIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKS5wdXQoCi0gICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpmYWNlLnBhcnRzLlN0YXR1c0xpbmUuc3RvcEltYWdlIiwgZmdTdG9wSW1hZ2UpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMYXlvdXQgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtIGNvbnRyb2xzIG9uIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgU3RhdHVzTGluZUxheW91dCBleHRlbmRzIExheW91dCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RhdHVzTGluZUxheW91dERhdGEgREVGQVVMVF9EQVRBID0gbmV3IFN0YXR1c0xpbmVMYXlvdXREYXRhKCk7Ci0KLSAgICAgICAgcHVibGljIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LAotICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCkgewotCi0gICAgICAgICAgICBpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQgJiYgaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh3SGludCwgaEhpbnQpOwotCi0gICAgICAgICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIGludCB0b3RhbFdpZHRoID0gMDsKLSAgICAgICAgICAgIGludCBtYXhIZWlnaHQgPSAwOwotICAgICAgICAgICAgaW50IHRvdGFsQ250ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHVzZVdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBDb250cm9sIHcgPSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICBpZiAodyA9PSBmUHJvZ3Jlc3NCYXJDb21wb3NpdGUgJiYgIWZQcm9ncmVzc0lzVmlzaWJsZSkKLSAgICAgICAgICAgICAgICAgICAgdXNlV2lkdGggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICh3ID09IGZUb29sQmFyICYmICFmQ2FuY2VsQnV0dG9uSXNWaXNpYmxlKQotICAgICAgICAgICAgICAgICAgICB1c2VXaWR0aCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIFN0YXR1c0xpbmVMYXlvdXREYXRhIGRhdGEgPSAoU3RhdHVzTGluZUxheW91dERhdGEpIHcKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZGF0YSA9IERFRkFVTFRfREFUQTsKLSAgICAgICAgICAgICAgICBQb2ludCBlID0gdy5jb21wdXRlU2l6ZShkYXRhLndpZHRoSGludCwgZGF0YS5oZWlnaHRIaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHVzZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gZS54OwotICAgICAgICAgICAgICAgICAgICB0b3RhbENudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsIGUueSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodG90YWxDbnQgPiAwKQotICAgICAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gKHRvdGFsQ250IC0gMSkgKiBHQVA7Ci0gICAgICAgICAgICBpZiAodG90YWxXaWR0aCA8PSAwKQotICAgICAgICAgICAgICAgIHRvdGFsV2lkdGggPSBtYXhIZWlnaHQgKiA0OwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0b3RhbFdpZHRoLCBtYXhIZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCi0gICAgICAgICAgICBpZiAoY29tcG9zaXRlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAvLyBTdGF0dXNMaW5lTWFuYWdlciBza2lwcyBvdmVyIHRoZSBzdGFuZGFyZCBzdGF0dXMgbGluZSB3aWRnZXRzIAotICAgICAgICAgICAgLy8gaW4gaXRzIHVwZGF0ZSBtZXRob2QuIFRoZXJlIGlzIHRodXMgYSBkZXBlbmRlbmN5Ci0gICAgICAgICAgICAvLyBiZXR3ZWVuIHRoZSBsYXlvdXQgb2YgdGhlIHN0YW5kYXJkIHdpZGdldHMgYW5kIHRoZSB1cGRhdGUgbWV0aG9kLgotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgY2FuY2VsIGJ1dHRvbiBhbmQgcHJvZ3Jlc3MgYmFyIGFyZSBiZWZvcmUgY29udHJpYnV0aW9ucy4KLSAgICAgICAgICAgIGZNZXNzYWdlTGFiZWwubW92ZUFib3ZlKG51bGwpOwotICAgICAgICAgICAgZlRvb2xCYXIubW92ZUJlbG93KGZNZXNzYWdlTGFiZWwpOwotICAgICAgICAgICAgZlByb2dyZXNzQmFyQ29tcG9zaXRlLm1vdmVCZWxvdyhmVG9vbEJhcik7Ci0KLSAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gY2hpbGRyZW4ubGVuZ3RoOwotCi0gICAgICAgICAgICBpbnQgd3NbXSA9IG5ldyBpbnRbY291bnRdOwotCi0gICAgICAgICAgICBpbnQgaCA9IHJlY3QuaGVpZ2h0OwotICAgICAgICAgICAgaW50IHRvdGFsV2lkdGggPSAtR0FQOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ29udHJvbCB3ID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgaWYgKHcgPT0gZlByb2dyZXNzQmFyQ29tcG9zaXRlICYmICFmUHJvZ3Jlc3NJc1Zpc2libGUpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmICh3ID09IGZUb29sQmFyICYmICFmQ2FuY2VsQnV0dG9uSXNWaXNpYmxlKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBTdGF0dXNMaW5lTGF5b3V0RGF0YSBkYXRhID0gKFN0YXR1c0xpbmVMYXlvdXREYXRhKSB3Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBERUZBVUxUX0RBVEE7Ci0gICAgICAgICAgICAgICAgaW50IHdpZHRoID0gdy5jb21wdXRlU2l6ZShkYXRhLndpZHRoSGludCwgaCwgZmx1c2hDYWNoZSkueDsKLSAgICAgICAgICAgICAgICB3c1tpXSA9IHdpZHRoOwotICAgICAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gd2lkdGggKyBHQVA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBkaWZmID0gcmVjdC53aWR0aCAtIHRvdGFsV2lkdGg7Ci0gICAgICAgICAgICB3c1swXSArPSBkaWZmOyAvLyBtYWtlIHRoZSBmaXJzdCBTdGF0dXNMYWJlbCB3aWRlcgotCi0gICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IG1pbmltdW0gcmVjb21tZW5kZWQgd2lkdGgKLSAgICAgICAgICAgIGZpbmFsIGludCBtc2dNaW5XaWR0aCA9IHJlY3Qud2lkdGggLyAzOwotICAgICAgICAgICAgaWYgKHdzWzBdIDwgbXNnTWluV2lkdGgpIHsKLSAgICAgICAgICAgICAgICBkaWZmID0gd3NbMF0gLSBtc2dNaW5XaWR0aDsKLSAgICAgICAgICAgICAgICB3c1swXSA9IG1zZ01pbldpZHRoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkaWZmID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGFrZSBzcGFjZSBhd2F5IGZyb20gdGhlIGNvbnRyaWJ1dGlvbnMgZmlyc3QuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDAgJiYgZGlmZiA8IDA7IC0taSkgewotICAgICAgICAgICAgICAgIGludCBtaW4gPSBNYXRoLm1pbih3c1tpXSwgLWRpZmYpOwotICAgICAgICAgICAgICAgIHdzW2ldIC09IG1pbjsKLSAgICAgICAgICAgICAgICBkaWZmICs9IG1pbiArIEdBUDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHggPSByZWN0Lng7Ci0gICAgICAgICAgICBpbnQgeSA9IHJlY3QueTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIENvbnRyb2wgdyA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogV29ya2Fyb3VuZCBmb3IgTGludXggTW90aWY6Ci0gICAgICAgICAgICAgICAgICogRXZlbiBpZiB0aGUgcHJvZ3Jlc3MgYmFyIGFuZCBjYW5jZWwgYnV0dG9uIGFyZQotICAgICAgICAgICAgICAgICAqIG5vdCBzZXQgdG8gYmUgdmlzaWJsZSBhZCBvZiB3aWR0aCAwLCB0aGV5IHN0aWxsCi0gICAgICAgICAgICAgICAgICogZHJhdyBvdmVyIHRoZSBmaXJzdCBwaXhlbCBvZiB0aGUgZWRpdG9yIAotICAgICAgICAgICAgICAgICAqIGNvbnRyaWJ1dGlvbnMuCi0gICAgICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAgICogVGhlIGZpeCBoZXJlIGlzIHRvIGRyYXcgdGhlIHByb2dyZXNzIGJhciBhbmQKLSAgICAgICAgICAgICAgICAgKiBjYW5jZWwgYnV0dG9uIG9mZiBzY3JlZW4gaWYgdGhleSBhcmUgbm90IHZpc2libGUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHcgPT0gZlByb2dyZXNzQmFyQ29tcG9zaXRlICYmICFmUHJvZ3Jlc3NJc1Zpc2libGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHcgPT0gZlRvb2xCYXIgJiYgIWZDYW5jZWxCdXR0b25Jc1Zpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdy5zZXRCb3VuZHMoeCArIHJlY3Qud2lkdGgsIHksIHdzW2ldLCBoKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHcuc2V0Qm91bmRzKHgsIHksIHdzW2ldLCBoKTsKLSAgICAgICAgICAgICAgICBpZiAod3NbaV0gPiAwKQotICAgICAgICAgICAgICAgICAgICB4ICs9IHdzW2ldICsgR0FQOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFN0YXR1c0xpbmUgYXMgYSBjaGlsZCBvZiB0aGUgZ2l2ZW4gcGFyZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdGF0dXNMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQotICAgICAgICBhZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBTdGF0dXNMaW5lTWFuYWdlciBza2lwcyBvdmVyIHRoZSBzdGFuZGFyZCBzdGF0dXMgbGluZSB3aWRnZXRzIAotICAgICAgICAvLyBpbiBpdHMgdXBkYXRlIG1ldGhvZC4gVGhlcmUgaXMgdGh1cyBhIGRlcGVuZGVuY3kKLSAgICAgICAgLy8gYmV0d2VlbiB0aGlzIGNvZGUgZGVmaW5pbmcgdGhlIGNyZWF0aW9uIGFuZCBsYXlvdXQgb2YgdGhlIHN0YW5kYXJkIAotICAgICAgICAvLyB3aWRnZXRzIGFuZCB0aGUgdXBkYXRlIG1ldGhvZC4KLQotICAgICAgICBzZXRMYXlvdXQobmV3IFN0YXR1c0xpbmVMYXlvdXQoKSk7Ci0KLSAgICAgICAgZk1lc3NhZ2VMYWJlbCA9IG5ldyBDTGFiZWwodGhpcywgU1dULk5PTkUpOy8vU1dULlNIQURPV19JTik7Ci0gICAgICAgIC8vCQlDb2xvcltdIGNvbG9ycyA9IG5ldyBDb2xvclsyXTsKLSAgICAgICAgLy8JCWNvbG9yc1swXSA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9MSUdIVF9TSEFET1cpOwotICAgICAgICAvLwkJY29sb3JzWzFdID0gZk1lc3NhZ2VMYWJlbC5nZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIC8vCQlpbnRbXSBncmFkaWVudCA9IG5ldyBpbnRbXSB7SkZhY2VDb2xvcnMuU1RBVFVTX1BFUkNFTlR9OwotICAgICAgICAvLwkJZk1lc3NhZ2VMYWJlbC5zZXRCYWNrZ3JvdW5kKGNvbG9ycywgZ3JhZGllbnQpOwotCi0gICAgICAgIGZQcm9ncmVzc0lzVmlzaWJsZSA9IGZhbHNlOwotICAgICAgICBmQ2FuY2VsRW5hYmxlZCA9IGZhbHNlOwotCi0gICAgICAgIGZUb29sQmFyID0gbmV3IFRvb2xCYXIodGhpcywgU1dULkZMQVQpOwotICAgICAgICBmQ2FuY2VsQnV0dG9uID0gbmV3IFRvb2xJdGVtKGZUb29sQmFyLCBTV1QuUFVTSCk7Ci0gICAgICAgIGZDYW5jZWxCdXR0b24uc2V0SW1hZ2UoZmdTdG9wSW1hZ2UuY3JlYXRlSW1hZ2UoKSk7Ci0gICAgICAgIGZDYW5jZWxCdXR0b24uc2V0VG9vbFRpcFRleHQoSkZhY2VSZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJDYW5jZWxfQ3VycmVudF9PcGVyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZkNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRDYW5jZWxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZDYW5jZWxCdXR0b24uYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEltYWdlIGkgPSBmQ2FuY2VsQnV0dG9uLmdldEltYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChpICE9IG51bGwpICYmICghaS5pc0Rpc3Bvc2VkKCkpKQotICAgICAgICAgICAgICAgICAgICBpLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gV2UgY3JlYXRlIGEgY29tcG9zaXRlIHRvIGNyZWF0ZSB0aGUgcHJvZ3Jlc3MgYmFyIGluCi0gICAgICAgIC8vIHNvIHRoYXQgaXQgY2FuIGJlIGNlbnRlcmVkLiBTZWUgYnVnICMzMjMzMQotICAgICAgICBmUHJvZ3Jlc3NCYXJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGZQcm9ncmVzc0JhckNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgZlByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzSW5kaWNhdG9yKGZQcm9ncmVzc0JhckNvbXBvc2l0ZSk7Ci0gICAgICAgIGZQcm9ncmVzc0Jhci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQotICAgICAgICBmU3RvcEJ1dHRvbkN1cnNvciA9IG5ldyBDdXJzb3IoZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX0FSUk9XKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGF0IHRoZSBtYWluIHRhc2sgaXMgYmVnaW5uaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIChvciBkZXNjcmlwdGlvbikgb2YgdGhlIG1haW4gdGFzawotICAgICAqIEBwYXJhbSB0b3RhbFdvcmsgdGhlIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzIGludG8gd2hpY2gKLSAgICAgKiB0aGUgbWFpbiB0YXNrIGlzIGJlZW4gc3ViZGl2aWRlZC4gSWYgdGhlIHZhbHVlIGlzIDAgb3IgVU5LTk9XTiB0aGUgCi0gICAgICogaW1wbGVtZW5hdGlvbiBpcyBmcmVlIHRvIGluZGljYXRlIHByb2dyZXNzIGluIGEgd2F5IHdoaWNoIGRvZXNuJ3QgCi0gICAgICogcmVxdWlyZSB0aGUgdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMgaW4gYWR2YW5jZS4gSW4gZ2VuZXJhbCB1c2VycyAKLSAgICAgKiBzaG91bGQgdXNlIHRoZSBVTktOT1dOIHZhbHVlIGlmIHRoZXkgZG9uJ3Qga25vdyB0aGUgdG90YWwgYW1vdW50IG9mCi0gICAgICogd29yayB1bml0cy4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7Ci0gICAgICAgIGZpbmFsIGxvbmcgdGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGZTdGFydFRpbWUgPSB0aW1lc3RhbXA7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gYW5pbWF0ZWQgPSAodG90YWxXb3JrID09IFVOS05PV04gfHwgdG90YWxXb3JrID09IDApOwotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHByb2dyZXNzIGJhciBpcyBtYWRlIHZpc2libGUgd2hpbGUKLSAgICAgICAgLy8gdGhlIHRhc2sgaXMgcnVubmluZy4gRml4ZXMgYnVnIDMyMTk4IGZvciB0aGUgbm9uLWFuaW1hdGVkIGNhc2UuCi0gICAgICAgIFJ1bm5hYmxlIHRpbWVyID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIFN0YXR1c0xpbmUudGhpcy5zdGFydFRhc2sodGltZXN0YW1wLCBhbmltYXRlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGlmIChmUHJvZ3Jlc3NCYXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBmUHJvZ3Jlc3NCYXIuZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyhERUxBWV9QUk9HUkVTUywgdGltZXIpOwotICAgICAgICBpZiAoIWFuaW1hdGVkKSB7Ci0gICAgICAgICAgICBmUHJvZ3Jlc3NCYXIuYmVnaW5UYXNrKHRvdGFsV29yayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIGZUYXNrTmFtZSA9ICIiOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZlRhc2tOYW1lID0gbmFtZTsKLSAgICAgICAgc2V0TWVzc2FnZShmVGFza05hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoYXQgdGhlIHdvcmsgaXMgZG9uZTsgdGhhdCBpcywgZWl0aGVyIHRoZSBtYWluIHRhc2sgaXMgY29tcGxldGVkIG9yIHRoZQotICAgICAqIHVzZXIgY2FuY2VsbGVkIGl0LgotICAgICAqIERvbmUoKSBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlOyBhbiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQgdG8gaGFuZGxlCi0gICAgICogdGhpcyBjYXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvbmUoKSB7Ci0KLSAgICAgICAgZlN0YXJ0VGltZSA9IDA7Ci0KLSAgICAgICAgaWYgKGZQcm9ncmVzc0JhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmUHJvZ3Jlc3NCYXIuc2VuZFJlbWFpbmluZ1dvcmsoKTsKLSAgICAgICAgICAgIGZQcm9ncmVzc0Jhci5kb25lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0TWVzc2FnZShudWxsKTsKLQotICAgICAgICBoaWRlUHJvZ3Jlc3MoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdGF0dXMgbGluZSdzIHByb2dyZXNzIG1vbml0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwcml2YXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGlzcG9zZSgpIHsKLSAgICAJaWYgKGZTdG9wQnV0dG9uQ3Vyc29yICE9IG51bGwpIHsKLSAgICAJCWZTdG9wQnV0dG9uQ3Vyc29yLmRpc3Bvc2UoKTsJCQotICAgIAkJZlN0b3BCdXR0b25DdXJzb3IgPSBudWxsOwotICAgIAl9Ci0gICAgCWlmIChmUHJvZ3Jlc3NCYXIgIT0gbnVsbCkgewotICAgIAkJZlByb2dyZXNzQmFyLmRpc3Bvc2UoKTsKLSAgICAJCWZQcm9ncmVzc0JhciA9IG51bGw7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIaWRlcyB0aGUgQ2FuY2VsIGJ1dHRvbiBhbmQgUHJvZ3Jlc3NJbmRpY2F0b3IuCi0gICAgICogQHByaXZhdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoaWRlUHJvZ3Jlc3MoKSB7Ci0KLSAgICAgICAgaWYgKGZQcm9ncmVzc0lzVmlzaWJsZSAmJiAhaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBmUHJvZ3Jlc3NJc1Zpc2libGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGZDYW5jZWxFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBmQ2FuY2VsQnV0dG9uSXNWaXNpYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoZlRvb2xCYXIgIT0gbnVsbCAmJiAhZlRvb2xCYXIuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgICAgIGZUb29sQmFyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgaWYgKGZQcm9ncmVzc0JhckNvbXBvc2l0ZSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFmUHJvZ3Jlc3NCYXJDb21wb3NpdGUuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgICAgIGZQcm9ncmVzc0JhckNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIGxheW91dCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI2ludGVybmFsV29ya2VkKGRvdWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgd29yaykgewotICAgICAgICBpZiAoIWZQcm9ncmVzc0lzVmlzaWJsZSkgewotICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZlN0YXJ0VGltZSA+IERFTEFZX1BST0dSRVNTKQotICAgICAgICAgICAgICAgIHNob3dQcm9ncmVzcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZQcm9ncmVzc0JhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmUHJvZ3Jlc3NCYXIud29ya2VkKHdvcmspOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB1c2VyIGRvZXMgc29tZSBVSSBhY3Rpb24gdG8gY2FuY2VsIHRoaXMgb3BlcmF0aW9uLgotICAgICAqIChsaWtlIGhpdHRpbmcgdGhlIENhbmNlbCBidXR0b24gb24gdGhlIHByb2dyZXNzIGRpYWxvZykuCi0gICAgICogVGhlIGxvbmcgcnVubmluZyBvcGVyYXRpb24gdHlwaWNhbGx5IHBvbGxzIGlzQ2FuY2VsZWQoKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotICAgICAgICByZXR1cm4gZklzQ2FuY2VsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC90cnVlPiBpZiB0aGUgUHJvZ3Jlc3NJbmRpY2F0aW9uIHByb3ZpZGVzIFVJIGZvciBjYW5jZWxpbmcKLSAgICAgKiBhIGxvbmcgcnVubmluZyBvcGVyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gZkNhbmNlbEVuYWJsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2FuY2VsIHN0YXR1cy4gVGhpcyBtZXRob2QgaXMgdXN1YWxseSBjYWxsZWQgd2l0aCB0aGUgCi0gICAgICogYXJndW1lbnQgZmFsc2UgaWYgYSBjbGllbnQgd2FudHMgdG8gYWJvcnQgYSBjYW5jZWwgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gYikgewotICAgICAgICBmSXNDYW5jZWxlZCA9IGI7Ci0gICAgICAgIGlmIChmQ2FuY2VsQnV0dG9uICE9IG51bGwpCi0gICAgICAgICAgICBmQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoIWIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIFByb2dyZXNzSW5kaWNhdGlvbiBwcm92aWRlcyBVSSBmb3IgY2FuY2VsaW5nCi0gICAgICogYSBsb25nIHJ1bm5pbmcgb3BlcmF0aW9uLgotICAgICAqIElmIHRoZSBQcm9ncmVzc0luZGljYXRpb24gaXMgY3VycmVudGx5IHZpc2libGUgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgaGF2ZQotICAgICAqIGEgZGlyZWN0IGVmZmVjdCBvbiB0aGUgbGF5b3V0IGJlY2F1c2UgaXQgd2lsbCBtYWtlIGEgY2FuY2VsIGJ1dHRvbiB2aXNpYmxlLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWxFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBmQ2FuY2VsRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgIGlmIChmUHJvZ3Jlc3NJc1Zpc2libGUgJiYgIWZDYW5jZWxCdXR0b25Jc1Zpc2libGUgJiYgZW5hYmxlZCkgewotICAgICAgICAgICAgc2hvd0J1dHRvbigpOwotICAgICAgICAgICAgbGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZDYW5jZWxCdXR0b24gIT0gbnVsbCAmJiAhZkNhbmNlbEJ1dHRvbi5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICBmQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZXJyb3IgbWVzc2FnZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgc3RhdHVzIGxpbmUuCi0gICAgICogVGhlIGltYWdlIG9uIHRoZSBzdGF0dXMgbGluZSBpcyBjbGVhcmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhbiBpbWFnZSBhbmQgZXJyb3IgbWVzc2FnZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgc3RhdHVzIGxpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBpbWFnZSB0byB1c2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyBpbWFnZQotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShJbWFnZSBpbWFnZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZkVycm9yVGV4dCA9IHRyaW0obWVzc2FnZSk7Ci0gICAgICAgIGZFcnJvckltYWdlID0gaW1hZ2U7Ci0gICAgICAgIHVwZGF0ZU1lc3NhZ2VMYWJlbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGxpZXMgdGhlIGdpdmVuIGZvbnQgdG8gdGhpcyBzdGF0dXMgbGluZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgewotICAgICAgICBzdXBlci5zZXRGb250KGZvbnQpOwotICAgICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbltpXS5zZXRGb250KGZvbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVzc2FnZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgc3RhdHVzIGxpbmUuCi0gICAgICogVGhlIGltYWdlIG9uIHRoZSBzdGF0dXMgbGluZSBpcyBjbGVhcmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc2V0TWVzc2FnZShudWxsLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGFuIGltYWdlIGFuZCBhIG1lc3NhZ2UgdGV4dCB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIHN0YXR1cyBsaW5lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgaW1hZ2UgdG8gdXNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gaW1hZ2UKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKEltYWdlIGltYWdlLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBmTWVzc2FnZVRleHQgPSB0cmltKG1lc3NhZ2UpOwotICAgICAgICBmTWVzc2FnZUltYWdlID0gaW1hZ2U7Ci0gICAgICAgIHVwZGF0ZU1lc3NhZ2VMYWJlbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNzZXRUYXNrTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZUYXNrTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZXMgdGhlIENhbmNlbCBidXR0b24gdmlzaWJsZS4KLSAgICAgKiBAcHJpdmF0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNob3dCdXR0b24oKSB7Ci0gICAgICAgIGlmIChmVG9vbEJhciAhPSBudWxsICYmICFmVG9vbEJhci5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIGZUb29sQmFyLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBmVG9vbEJhci5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgZlRvb2xCYXIuc2V0Q3Vyc29yKGZTdG9wQnV0dG9uQ3Vyc29yKTsKLSAgICAgICAgICAgIGZDYW5jZWxCdXR0b25Jc1Zpc2libGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvd3MgdGhlIENhbmNlbCBidXR0b24gYW5kIFByb2dyZXNzSW5kaWNhdG9yLgotICAgICAqIEBwcml2YXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2hvd1Byb2dyZXNzKCkgewotICAgICAgICBpZiAoIWZQcm9ncmVzc0lzVmlzaWJsZSAmJiAhaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBmUHJvZ3Jlc3NJc1Zpc2libGUgPSB0cnVlOwotICAgICAgICAgICAgaWYgKGZDYW5jZWxFbmFibGVkKQotICAgICAgICAgICAgICAgIHNob3dCdXR0b24oKTsKLSAgICAgICAgICAgIGlmIChmUHJvZ3Jlc3NCYXJDb21wb3NpdGUgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAhZlByb2dyZXNzQmFyQ29tcG9zaXRlLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICBmUHJvZ3Jlc3NCYXJDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIGxheW91dCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHByaXZhdGUKLSAgICAgKi8KLSAgICB2b2lkIHN0YXJ0VGFzayhmaW5hbCBsb25nIHRpbWVzdGFtcCwgZmluYWwgYm9vbGVhbiBhbmltYXRlZCkgewotICAgICAgICBpZiAoIWZQcm9ncmVzc0lzVmlzaWJsZSAmJiBmU3RhcnRUaW1lID09IHRpbWVzdGFtcCkgewotICAgICAgICAgICAgc2hvd1Byb2dyZXNzKCk7Ci0gICAgICAgICAgICBpZiAoYW5pbWF0ZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZlByb2dyZXNzQmFyICE9IG51bGwgJiYgIWZQcm9ncmVzc0Jhci5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZlByb2dyZXNzQmFyLmJlZ2luQW5pbWF0ZWRUYXNrKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCBhIHN1YnRhc2sgb2YgdGhlIG1haW4gdGFzayBpcyBiZWdpbm5pbmcuCi0gICAgICogU3VidGFza3MgYXJlIG9wdGlvbmFsOyB0aGUgbWFpbiB0YXNrIG1pZ2h0IG5vdCBoYXZlIHN1YnRhc2tzLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIChvciBkZXNjcmlwdGlvbikgb2YgdGhlIHN1YnRhc2sKLSAgICAgKiBAc2VlIElQcm9ncmVzc01vbml0b3Ijc3ViVGFzayhTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgdGV4dDsKLSAgICAgICAgaWYgKGZUYXNrTmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgdGV4dCA9IG5hbWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRleHQgPSBKRmFjZVJlc291cmNlcy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJTZXRfU3ViVGFzayIsIG5ldyBPYmplY3RbXSB7IGZUYXNrTmFtZSwgbmFtZSB9KTsvLyROT04tTkxTLTEkCi0gICAgICAgIHNldE1lc3NhZ2UodGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpbXMgdGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWFibGUgaW4gdGhlIHN0YXR1cyBsaW5lLgotICAgICAqIFRoaXMganVzdCBwdWxscyBvdXQgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICogQWxsb3dzIG51bGwuCi0gICAgICovCi0gICAgU3RyaW5nIHRyaW0oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpbnQgY3IgPSBtZXNzYWdlLmluZGV4T2YoJ1xyJyk7Ci0gICAgICAgIGludCBsZiA9IG1lc3NhZ2UuaW5kZXhPZignXG4nKTsKLSAgICAgICAgaWYgKGNyID09IC0xICYmIGxmID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgICAgIGludCBsZW47Ci0gICAgICAgIGlmIChjciA9PSAtMSkKLSAgICAgICAgICAgIGxlbiA9IGxmOwotICAgICAgICBlbHNlIGlmIChsZiA9PSAtMSkKLSAgICAgICAgICAgIGxlbiA9IGNyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsZW4gPSBNYXRoLm1pbihjciwgbGYpOwotICAgICAgICByZXR1cm4gbWVzc2FnZS5zdWJzdHJpbmcoMCwgbGVuKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBtZXNzYWdlIGxhYmVsIHdpZGdldC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNZXNzYWdlTGFiZWwoKSB7Ci0gICAgICAgIGlmIChmTWVzc2FnZUxhYmVsICE9IG51bGwgJiYgIWZNZXNzYWdlTGFiZWwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBmTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKTsKLSAgICAgICAgICAgIGlmICgoZkVycm9yVGV4dCAhPSBudWxsICYmIGZFcnJvclRleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB8fCBmRXJyb3JJbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZk1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKEpGYWNlQ29sb3JzLmdldEVycm9yVGV4dChkaXNwbGF5KSk7Ci0gICAgICAgICAgICAgICAgZk1lc3NhZ2VMYWJlbC5zZXRUZXh0KGZFcnJvclRleHQpOwotICAgICAgICAgICAgICAgIGZNZXNzYWdlTGFiZWwuc2V0SW1hZ2UoZkVycm9ySW1hZ2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoZGlzcGxheQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCkpOwotICAgICAgICAgICAgICAgIGZNZXNzYWdlTGFiZWwuc2V0VGV4dChmTWVzc2FnZVRleHQgPT0gbnVsbCA/ICIiIDogZk1lc3NhZ2VUZXh0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZNZXNzYWdlTGFiZWwuc2V0SW1hZ2UoZk1lc3NhZ2VJbWFnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElQcm9ncmVzc01vbml0b3Ijd29ya2VkKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKLSAgICAgICAgaW50ZXJuYWxXb3JrZWQod29yayk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL1N0YXR1c0xpbmVMYXlvdXREYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vU3RhdHVzTGluZUxheW91dERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkMWU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vU3RhdHVzTGluZUxheW91dERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgbGF5b3V0IGRhdGEgb2JqZWN0IGZvciA8Y29kZT5Db250cm9sPC9jb2RlPiB3aXRoaW4gdGhlIHN0YXR1cyBsaW5lLgotICogVG8gc2V0IGEgPGNvZGU+U3RhdHVzTGluZUxheW91dERhdGE8L2NvZGU+IG9iamVjdCBpbnRvIGEgPGNvZGU+Q29udHJvbDwvY29kZT4sIHVzZQotICogdGhlIDxjb2RlPnNldExheW91dERhdGEoKTwvY29kZT4gbWV0aG9kLiAKLSAqIDxwPgotICogTk9URTogRG8gbm90IHJldXNlIDxjb2RlPlN0YXR1c0xpbmVMYXlvdXREYXRhPC9jb2RlPiBvYmplY3RzLiBFdmVyeSBjb250cm9sIGluIHRoZQotICogc3RhdHVzIGxpbmUgbXVzdCBoYXZlIGEgdW5pcXVlIDxjb2RlPlN0YXR1c0xpbmVMYXlvdXREYXRhPC9jb2RlPiBpbnN0YW5jZSBvcgotICogPGNvZGU+bnVsbDwvY29kZT4uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIFN0YXR1c0xpbmVMYXlvdXREYXRhIHsKLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+d2lkdGhIaW50PC9jb2RlPiBzcGVjaWZpZXMgYSBtaW5pbXVtIHdpZHRoIGZvcgotICAgICAqIHRoZSA8Y29kZT5Db250cm9sPC9jb2RlPi4gQSB2YWx1ZSBvZiA8Y29kZT5TV1QuREVGQVVMVDwvY29kZT4KLSAgICAgKiBpbmRpY2F0ZXMgdGhhdCBubyBtaW5pbXVtIHdpZHRoIGlzIHNwZWNpZmllZC4KLSAgICAgKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPlNXVC5ERUZBVUxUPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHdpZHRoSGludCA9IFNXVC5ERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPmhlaWdodEhpbnQ8L2NvZGU+IHNwZWNpZmllcyBhIG1pbmltdW0gaGVpZ2h0IGZvcgotICAgICAqIHRoZSA8Y29kZT5Db250cm9sPC9jb2RlPi4gQSB2YWx1ZSBvZiA8Y29kZT5TV1QuREVGQVVMVDwvY29kZT4KLSAgICAgKiBpbmRpY2F0ZXMgdGhhdCBubyBtaW5pbXVtIGhlaWdodCBpcyBzcGVjaWZpZWQuCi0gICAgICoKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5TV1QuREVGQVVMVDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIGludCBoZWlnaHRIaW50ID0gU1dULkRFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluaXRpYWwgc3RhdHVzIGxpbmUgbGF5b3V0IGRhdGEgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBTdGF0dXNMaW5lTGF5b3V0RGF0YSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vU3RhdHVzTGluZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9TdGF0dXNMaW5lTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA3ZjM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9TdGF0dXNMaW5lTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcldpdGhCbG9ja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBBIHN0YXR1cyBsaW5lIG1hbmFnZXIgaXMgYSBjb250cmlidXRpb24gbWFuYWdlciB3aGljaCByZWFsaXplcyBpdHNlbGYgYW5kIGl0cyBpdGVtcwotICogaW4gYSBzdGF0dXMgbGluZSBjb250cm9sLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IG1heSBhbHNvIGJlIHN1YmNsYXNzZWQgaWYgYSBtb3JlCi0gKiBzb3BoaXN0aWNhdGVkIGxheW91dCBpcyByZXF1aXJlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFN0YXR1c0xpbmVNYW5hZ2VyIGV4dGVuZHMgQ29udHJpYnV0aW9uTWFuYWdlciBpbXBsZW1lbnRzCi0gICAgICAgIElTdGF0dXNMaW5lTWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBJZGVudGlmaWVyIG9mIGdyb3VwIG1hcmtlciB1c2VkIHRvIHBvc2l0aW9uIGNvbnRyaWJ1dGlvbnMgYXQgdGhlIGJlZ2lubmluZwotICAgICAqIG9mIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVHSU5fR1JPVVAgPSAiQkVHSU5fR1JPVVAiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBJZGVudGlmaWVyIG9mIGdyb3VwIG1hcmtlciB1c2VkIHRvIHBvc2l0aW9uIGNvbnRyaWJ1dGlvbnMgaW4gdGhlIG1pZGRsZQotICAgICAqIG9mIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlERExFX0dST1VQID0gIk1JRERMRV9HUk9VUCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIElkZW50aWZpZXIgb2YgZ3JvdXAgbWFya2VyIHVzZWQgdG8gcG9zaXRpb24gY29udHJpYnV0aW9ucyBhdCB0aGUgZW5kCi0gICAgICogb2YgdGhlIHN0YXR1cyBsaW5lLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfR1JPVVAgPSAiRU5EX0dST1VQIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIHN0YXR1cyBsaW5lIGNvbnRyb2w7IDxjb2RlPm51bGw8L2NvZGU+IGJlZm9yZQotICAgICAqIGNyZWF0aW9uIGFuZCBhZnRlciBkaXNwb3NhbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBzdGF0dXNMaW5lID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgc3RhdHVzIGxpbmUgbWFuYWdlci4KLSAgICAgKiBVc2UgdGhlIDxjb2RlPmNyZWF0ZUNvbnRyb2w8L2NvZGU+IG1ldGhvZCB0byBjcmVhdGUgdGhlIAotICAgICAqIHN0YXR1cyBsaW5lIGNvbnRyb2wuCi0gICAgICovCi0gICAgcHVibGljIFN0YXR1c0xpbmVNYW5hZ2VyKCkgewotICAgIAlhZGQobmV3IEdyb3VwTWFya2VyKEJFR0lOX0dST1VQKSk7Ci0gICAgICAgIGFkZChuZXcgR3JvdXBNYXJrZXIoTUlERExFX0dST1VQKSk7Ci0gICAgICAgIGFkZChuZXcgR3JvdXBNYXJrZXIoRU5EX0dST1VQKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGlzIG1hbmFnZXIncyBzdGF0dXMgbGluZSBjb250cm9sLiAKLSAgICAgKiBEb2VzIG5vdCBjcmVhdGUgYSBuZXcgY29udHJvbCBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0gICAgICogPHA+Ci0gICAgICogTm90ZTogU2luY2UgMy4wIHRoZSByZXR1cm4gdHlwZSBpcyA8Y29kZT5Db250cm9sPC9jb2RlPi4gIEJlZm9yZSAzLjAsIHRoZSByZXR1cm4gdHlwZSB3YXMgCi0gICAgICogICB0aGUgcGFja2FnZS1wcml2YXRlIGNsYXNzIDxjb2RlPlN0YXR1c0xpbmU8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHJldHVybiB0aGUgc3RhdHVzIGxpbmUgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICByZXR1cm4gY3JlYXRlQ29udHJvbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoaXMgbWFuYWdlcidzIHN0YXR1cyBsaW5lIGNvbnRyb2wuIAotICAgICAqIERvZXMgbm90IGNyZWF0ZSBhIG5ldyBjb250cm9sIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBmb3IgdGhlIGNvbnRyb2wKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGF0dXMgbGluZSBjb250cm9sCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIGlmICghc3RhdHVzTGluZUV4aXN0KCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXR1c0xpbmUgPSBuZXcgU3RhdHVzTGluZShwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1c0xpbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcG9zZXMgb2YgdGhpcyBzdGF0dXMgbGluZSBtYW5hZ2VyIGFuZCBmcmVlcyBhbGwgYWxsb2NhdGVkIFNXVCByZXNvdXJjZXMuCi0gICAgICogTm90aWZpZXMgYWxsIGNvbnRyaWJ1dGlvbiBpdGVtcyBvZiB0aGUgZGlzcG9zZS4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMKLSAgICAgKiBub3QgY2xlYW4gdXAgcmVmZXJlbmNlcyBiZXR3ZWVuIHRoaXMgc3RhdHVzIGxpbmUgbWFuYWdlciBhbmQgaXRzIGFzc29jaWF0ZWQKLSAgICAgKiBjb250cmlidXRpb24gaXRlbXMuIFVzZSA8Y29kZT5yZW1vdmVBbGw8L2NvZGU+IGZvciB0aGF0IHB1cnBvc2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgaWYgKHN0YXR1c0xpbmVFeGlzdCgpKQotICAgICAgICAgICAgc3RhdHVzTGluZS5kaXNwb3NlKCk7Ci0gICAgICAgIHN0YXR1c0xpbmUgPSBudWxsOwotCi0gICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW1zW10gPSBnZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpdGVtc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250cm9sIHVzZWQgYnkgdGhpcyBTdGF0dXNMaW5lTWFuYWdlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250cm9sIHVzZWQgYnkgdGhpcyBtYW5hZ2VyCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1c0xpbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBkZWxlZ2F0ZS4gT3ZlcnJpZGUgdGhpcyBtZXRob2QKLSAgICAgKiB0byBwcm92aWRlIHlvdXIgb3duIG9iamVjdCB1c2VkIHRvIGhhbmRsZSBwcm9ncmVzcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBJUHJvZ3Jlc3NNb25pdG9yIGRlbGVnYXRlCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvckRlbGVnYXRlKCkgewotICAgICAgICByZXR1cm4gKElQcm9ncmVzc01vbml0b3IpIGdldENvbnRyb2woKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVN0YXR1c0xpbmVNYW5hZ2VyCi0gICAgICovCi0gICAgcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCi0gICAgICAgIHJldHVybiBuZXcgSVByb2dyZXNzTW9uaXRvcldpdGhCbG9ja2luZygpIHsKLQotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc0RlbGVnYXRlID0gZ2V0UHJvZ3Jlc3NNb25pdG9yRGVsZWdhdGUoKTsKLQotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNiZWdpblRhc2soamF2YS5sYW5nLlN0cmluZywgaW50KQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLSAgICAgICAgICAgICAgICBwcm9ncmVzc0RlbGVnYXRlLmJlZ2luVGFzayhuYW1lLCB0b3RhbFdvcmspOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjZG9uZSgpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvbmUoKSB7Ci0gICAgICAgICAgICAgICAgcHJvZ3Jlc3NEZWxlZ2F0ZS5kb25lKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjaW50ZXJuYWxXb3JrZWQoZG91YmxlKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgd29yaykgewotICAgICAgICAgICAgICAgIHByb2dyZXNzRGVsZWdhdGUuaW50ZXJuYWxXb3JrZWQod29yayk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNpc0NhbmNlbGVkKCkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvZ3Jlc3NEZWxlZ2F0ZS5pc0NhbmNlbGVkKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3Ijc2V0Q2FuY2VsZWQoYm9vbGVhbikKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICAgICAgICAgIC8vRG9uJ3QgYm90aGVyIHVwZGF0aW5nIGZvciBkaXNwb3NlZCBzdGF0dXMKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzTGluZS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBwcm9ncmVzc0RlbGVnYXRlLnNldENhbmNlbGVkKHZhbHVlKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3NldFRhc2tOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgcHJvZ3Jlc3NEZWxlZ2F0ZS5zZXRUYXNrTmFtZShuYW1lKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3N1YlRhc2soamF2YS5sYW5nLlN0cmluZykKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIHByb2dyZXNzRGVsZWdhdGUuc3ViVGFzayhuYW1lKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3dvcmtlZChpbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdvcmtlZChpbnQgd29yaykgewotICAgICAgICAgICAgICAgIHByb2dyZXNzRGVsZWdhdGUud29ya2VkKHdvcmspOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yV2l0aEJsb2NraW5nI2NsZWFyQmxvY2tlZCgpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyQmxvY2tlZCgpIHsKLSAgICAgICAgICAgICAgICAvL0RvIG5vdGhpbmcgaGVyZSBhcyB3ZSBsZXQgdGhlIG1vZGFsIGNvbnRleHQgaGFuZGxlIGl0Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3JXaXRoQmxvY2tpbmcjc2V0QmxvY2tlZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QmxvY2tlZChJU3RhdHVzIHJlYXNvbikgewotICAgICAgICAgICAgICAgIC8vCQkJRG8gbm90aGluZyBoZXJlIGFzIHdlIGxldCB0aGUgbW9kYWwgY29udGV4dCBoYW5kbGUgaXQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElTdGF0dWVMaW5lTWFuYWdlcgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1c0xpbmVFeGlzdCgpICYmICgoU3RhdHVzTGluZSkgc3RhdHVzTGluZSkuaXNDYW5jZWxFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU3RhdHVlTGluZU1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWxFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBpZiAoc3RhdHVzTGluZUV4aXN0KCkpCi0gICAgICAgICAgICAoKFN0YXR1c0xpbmUpIHN0YXR1c0xpbmUpLnNldENhbmNlbEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU3RhdHVzTGluZU1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChzdGF0dXNMaW5lRXhpc3QoKSkKLSAgICAgICAgICAgICgoU3RhdHVzTGluZSkgc3RhdHVzTGluZSkuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVN0YXR1c0xpbmVNYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShJbWFnZSBpbWFnZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKHN0YXR1c0xpbmVFeGlzdCgpKQotICAgICAgICAgICAgKChTdGF0dXNMaW5lKSBzdGF0dXNMaW5lKS5zZXRFcnJvck1lc3NhZ2UoaW1hZ2UsIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVN0YXR1c0xpbmVNYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKHN0YXR1c0xpbmVFeGlzdCgpKQotICAgICAgICAgICAgKChTdGF0dXNMaW5lKSBzdGF0dXNMaW5lKS5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVN0YXR1c0xpbmVNYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoSW1hZ2UgaW1hZ2UsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChzdGF0dXNMaW5lRXhpc3QoKSkKLSAgICAgICAgICAgICgoU3RhdHVzTGluZSkgc3RhdHVzTGluZSkuc2V0TWVzc2FnZShpbWFnZSwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzdGF0dXMgbGluZSBjb250cm9sIGlzIGNyZWF0ZWQKLSAgICAgKiBhbmQgbm90IGRpc3Bvc2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRyb2wgaXMgY3JlYXRlZAotICAgICAqCWFuZCBub3QgZGlzcG9zZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc3RhdHVzTGluZUV4aXN0KCkgewotICAgICAgICByZXR1cm4gc3RhdHVzTGluZSAhPSBudWxsICYmICFzdGF0dXNMaW5lLmlzRGlzcG9zZWQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShib29sZWFuIGZvcmNlKSB7Ci0KLSAgICAgICAgLy9ib29sZWFuIERFQlVHPSBmYWxzZTsKLQotICAgICAgICBpZiAoaXNEaXJ0eSgpIHx8IGZvcmNlKSB7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXNMaW5lRXhpc3QoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1c0xpbmUuc2V0UmVkcmF3KGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoZSB1cGRhdGUgYWxnb3JpdGhtIGlzIG5vbi1pbmNyZW1lbnRhbC4KLSAgICAgICAgICAgICAgICAvLyBBbiBpbmNyZW1lbnRhbCBhbGdvcml0aG0gcmVxdWlyZXMgdGhhdCBTV1QgaXRlbXMgY2FuIGJlIGNyZWF0ZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbGlzdAotICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGUgQ29udHJpYnV0aW9uSXRlbS5maWxsKENvbXBvc2l0ZSkgbWV0aG9kIHVzZWQgaGVyZSBkb2VzIG5vdCB0YWtlIGFuIGluZGV4LCBzbyB0aGlzCi0gICAgICAgICAgICAgICAgLy8gaXMgbm90IHBvc3NpYmxlLgotCi0gICAgICAgICAgICAgICAgQ29udHJvbCB3c1tdID0gc3RhdHVzTGluZS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udHJvbCB3ID0gd3NbaV07Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBkYXRhID0gdy5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgSUNvbnRyaWJ1dGlvbkl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IG9sZENoaWxkQ291bnQgPSBzdGF0dXNMaW5lLmdldENoaWxkcmVuKCkubGVuZ3RoOwotICAgICAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBnZXRJdGVtcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gY2kgPSBpdGVtc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNpLmlzVmlzaWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaS5maWxsKHN0YXR1c0xpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzb2NpYXRlIGNvbnRyb2xzIHdpdGggY29udHJpYnV0aW9uIGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xbXSBuZXdDaGlsZHJlbiA9IHN0YXR1c0xpbmUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBvbGRDaGlsZENvdW50OyBqIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbltqXS5zZXREYXRhKGNpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9sZENoaWxkQ291bnQgPSBuZXdDaGlsZHJlbi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzZXREaXJ0eShmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICBzdGF0dXNMaW5lLmxheW91dCgpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpbmUuc2V0UmVkcmF3KHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vU3ViQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL1N1YkNvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0ZGFkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vU3ViQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci0KLS8qKgotICogQSA8Y29kZT5TdWJDb250cmlidXRpb25JdGVtPC9jb2RlPiBpcyBhIHdyYXBwZXIgZm9yIGFuIDxjb2RlPklDb250cmlidXRpb25JdGVtPC9jb2RlPi4gIAotICogSXQgaXMgdXNlZCB3aXRoaW4gYSA8Y29kZT5TdWJDb250cmlidXRpb25NYW5hZ2VyPC9jb2RlPiB0byBjb250cm9sIHRoZSB2aXNpYmlsaXR5Ci0gKiBvZiBpdGVtcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFN1YkNvbnRyaWJ1dGlvbkl0ZW0gaW1wbGVtZW50cyBJQ29udHJpYnV0aW9uSXRlbSB7Ci0gICAgLyoqCi0gICAgICogVGhlIHZpc2liaWxpdHkgb2YgdGhlIGl0ZW0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZpc2libGU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaW5uZXIgaXRlbSBmb3IgdGhpcyBjb250cmlidXRpb24uICAKLSAgICAgKi8KLSAgICBwcml2YXRlIElDb250cmlidXRpb25JdGVtIGlubmVySXRlbTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3ViQ29udHJpYnV0aW9uSXRlbTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIFN1YkNvbnRyaWJ1dGlvbkl0ZW0oSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotICAgICAgICBpbm5lckl0ZW0gPSBpdGVtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+Ci0gICAgICogZGVsZWdhdGVzIHRvIHRoZSBpbm5lciBpdGVtLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpbm5lckl0ZW0uZGlzcG9zZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbkl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGlmICh2aXNpYmxlKQotICAgICAgICAgICAgaW5uZXJJdGVtLmZpbGwocGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25JdGVtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoTWVudSBwYXJlbnQsIGludCBpbmRleCkgewotICAgICAgICBpZiAodmlzaWJsZSkKLSAgICAgICAgICAgIGlubmVySXRlbS5maWxsKHBhcmVudCwgaW5kZXgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbkl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbChUb29sQmFyIHBhcmVudCwgaW50IGluZGV4KSB7Ci0gICAgICAgIGlmICh2aXNpYmxlKQotICAgICAgICAgICAgaW5uZXJJdGVtLmZpbGwocGFyZW50LCBpbmRleCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaW5uZXJJdGVtLmdldElkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5uZXIgY29udHJpYnV0aW9uIGl0ZW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBpbm5lciBjb250cmlidXRpb24gaXRlbQotICAgICAqLwotICAgIHB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbSBnZXRJbm5lckl0ZW0oKSB7Ci0gICAgICAgIHJldHVybiBpbm5lckl0ZW07Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBpbm5lckl0ZW0uaXNFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotICAgICAgICByZXR1cm4gaW5uZXJJdGVtLmlzRGlydHkoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25JdGVtLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRHluYW1pYygpIHsKLSAgICAgICAgcmV0dXJuIGlubmVySXRlbS5pc0R5bmFtaWMoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25JdGVtLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR3JvdXBNYXJrZXIoKSB7Ci0gICAgICAgIHJldHVybiBpbm5lckl0ZW0uaXNHcm91cE1hcmtlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbkl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXBhcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBpbm5lckl0ZW0uaXNTZXBhcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25JdGVtLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHZpc2libGUgJiYgaW5uZXJJdGVtLmlzVmlzaWJsZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbkl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50KElDb250cmlidXRpb25NYW5hZ2VyIHBhcmVudCkgewotICAgICAgICAvLyBkbyBub3RoaW5nLCB0aGUgcGFyZW50IG9mIG91ciBpbm5lciBpdGVtCi0gICAgICAgIC8vIGlzIGl0cyBTdWJDb250cmlidXRpb25NYW5hZ2VyCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICB0aGlzLnZpc2libGUgPSB2aXNpYmxlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbkl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBpbm5lckl0ZW0udXBkYXRlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGlubmVySXRlbS51cGRhdGUoaWQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsKENvb2xCYXIgcGFyZW50LCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKHZpc2libGUpCi0gICAgICAgICAgICBpbm5lckl0ZW0uZmlsbChwYXJlbnQsIGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jc2F2ZVdpZGdldFN0YXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzYXZlV2lkZ2V0U3RhdGUoKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vU3ViQ29udHJpYnV0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL1N1YkNvbnRyaWJ1dGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM1YjNkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vU3ViQ29udHJpYnV0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQSA8Y29kZT5TdWJDb250cmlidXRpb25NYW5hZ2VyPC9jb2RlPiBpcyB1c2VkIHRvIGRlZmluZSBhIHNldCBvZiBjb250cmlidXRpb24KLSAqIGl0ZW1zIHdpdGhpbiBhIHBhcmVudCBtYW5hZ2VyLiAgT25jZSBkZWZpbmVkLCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZW50aXJlIHNldCBjYW4gCi0gKiBiZSBjaGFuZ2VkIGFzIGEgdW5pdC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN1YkNvbnRyaWJ1dGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJQ29udHJpYnV0aW9uTWFuYWdlciB7Ci0gICAgLyoqCi0gICAgICogVGhlIHBhcmVudCBjb250cmlidXRpb24gbWFuYWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIElDb250cmlidXRpb25NYW5hZ2VyIHBhcmVudE1ncjsKLQotICAgIC8qKgotICAgICAqIE1hcHMgZWFjaCBpdGVtIGluIHRoZSBtYW5hZ2VyIHRvIGEgd3JhcHBlci4gIFRoZSB3cmFwcGVyIGlzIHVzZWQgdG8gCi0gICAgICogY29udHJvbCB0aGUgdmlzaWJpbGl0eSBvZiBlYWNoIGl0ZW0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgbWFwSXRlbVRvV3JhcHBlciA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmlzaWJpbGl0eSBvZiB0aGUgbWFuYWdlciwKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdmlzaWJsZSA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5TdWJDb250cmlidXRpb25NYW5hZ2VyPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIG1nciB0aGUgcGFyZW50IGNvbnRyaWJ1dGlvbiBtYW5hZ2VyLiAgQWxsIGNvbnRyaWJ1dGlvbnMgbWFkZSB0byB0aGUKLSAgICAgKiAgICAgIDxjb2RlPlN1YkNvbnRyaWJ1dGlvbk1hbmFnZXI8L2NvZGU+IGFyZSBmb3J3YXJkZWQgYW5kIGFwcGVhciBpbiB0aGUKLSAgICAgKiAgICAgIHBhcmVudCBtYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBTdWJDb250cmlidXRpb25NYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1ncikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBwYXJlbnRNZ3IgPSBtZ3I7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbikpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgaXRlbS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIFN1YkNvbnRyaWJ1dGlvbkl0ZW0gd3JhcCA9IHdyYXAoaXRlbSk7Ci0gICAgICAgIHdyYXAuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgcGFyZW50TWdyLmFkZCh3cmFwKTsKLSAgICAgICAgaXRlbUFkZGVkKGl0ZW0sIHdyYXApOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kVG9Hcm91cChTdHJpbmcgZ3JvdXBOYW1lLCBJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBhcHBlbmRUb0dyb3VwKGdyb3VwTmFtZSwgbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRUb0dyb3VwKFN0cmluZyBncm91cE5hbWUsIElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgaXRlbS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIFN1YkNvbnRyaWJ1dGlvbkl0ZW0gd3JhcCA9IHdyYXAoaXRlbSk7Ci0gICAgICAgIHdyYXAuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgcGFyZW50TWdyLmFwcGVuZFRvR3JvdXAoZ3JvdXBOYW1lLCB3cmFwKTsKLSAgICAgICAgaXRlbUFkZGVkKGl0ZW0sIHdyYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3Bvc2VzIHRoaXMgc3ViIGNvbnRyaWJ1dGlvbiBtYW5hZ2VyLCByZW1vdmluZyBhbGwgaXRzIGl0ZW1zCi0gICAgICogYW5kIGNsZWFuaW5nIHVwIGFueSBvdGhlciByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IGl0LgotICAgICAqIFRoaXMgbXVzdCBsZWF2ZSBubyB0cmFjZSBvZiB0aGlzIHN1YiBjb250cmlidXRpb24gbWFuYWdlcgotICAgICAqIGluIHRoZSBwYXJlbnQgbWFuYWdlci4gIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZU1hbmFnZXIoKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbWFwSXRlbVRvV3JhcHBlci52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAvLyBEaXNwb3NlIGl0ZW1zIGluIGFkZGl0aW9uIHRvIHJlbW92aW5nIHRoZW0uCi0gICAgICAgIC8vIFNlZSBidWdzIDY0MDI0IGFuZCA3MzcxNSBmb3IgZGV0YWlscy4KLQkgICAgLy8gRG8gbm90IHVzZSBnZXRJdGVtcygpIGhlcmUgYXMgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhhdCBpbiBiYWQgd2F5cy4KLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IChJQ29udHJpYnV0aW9uSXRlbSkgaXQubmV4dCgpOwotICAgICAgICAgICAgaXRlbS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVtb3ZlQWxsKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIGl0ZW0gcGFzc2VkIHRvIHVzLCBub3QgdGhlIHdyYXBwZXIuCi0gICAgICovCi0gICAgcHVibGljIElDb250cmlidXRpb25JdGVtIGZpbmQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBwYXJlbnRNZ3IuZmluZChpZCk7Ci0gICAgICAgIC8vIFJldHVybiB0aGUgaXRlbSBwYXNzZWQgdG8gdXMsIG5vdCB0aGUgd3JhcHBlci4KLSAgICAgICAgaXRlbSA9IHVud3JhcChpdGVtKTsKLSAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIGl0ZW1zIHBhc3NlZCB0byB1cywgbm90IHRoZSB3cmFwcGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBnZXRJdGVtcygpIHsKLSAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW1bXSByZXN1bHQgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bbWFwSXRlbVRvV3JhcHBlcgotICAgICAgICAgICAgICAgIC5zaXplKCldOwotICAgICAgICBtYXBJdGVtVG9XcmFwcGVyLmtleVNldCgpLnRvQXJyYXkocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgbWFuYWdlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBtYW5hZ2VyCi0gICAgICovCi0gICAgcHVibGljIElDb250cmlidXRpb25NYW5hZ2VyIGdldFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudE1ncjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBJQ29udHJpYnV0aW9uTWFuYWdlck92ZXJyaWRlcyBnZXRPdmVycmlkZXMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRNZ3IuZ2V0T3ZlcnJpZGVzKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRBZnRlcihTdHJpbmcgaWQsIElBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgIGluc2VydEFmdGVyKGlkLCBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluc2VydEFmdGVyKFN0cmluZyBpZCwgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotICAgICAgICBpdGVtLnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgU3ViQ29udHJpYnV0aW9uSXRlbSB3cmFwID0gd3JhcChpdGVtKTsKLSAgICAgICAgd3JhcC5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgICAgICBwYXJlbnRNZ3IuaW5zZXJ0QWZ0ZXIoaWQsIHdyYXApOwotICAgICAgICBpdGVtQWRkZWQoaXRlbSwgd3JhcCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRCZWZvcmUoU3RyaW5nIGlkLCBJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBpbnNlcnRCZWZvcmUoaWQsIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbikpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0QmVmb3JlKFN0cmluZyBpZCwgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotICAgICAgICBpdGVtLnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgU3ViQ29udHJpYnV0aW9uSXRlbSB3cmFwID0gd3JhcChpdGVtKTsKLSAgICAgICAgd3JhcC5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgICAgICBwYXJlbnRNZ3IuaW5zZXJ0QmVmb3JlKGlkLCB3cmFwKTsKLSAgICAgICAgaXRlbUFkZGVkKGl0ZW0sIHdyYXApOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudE1nci5pc0RpcnR5KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gcGFyZW50TWdyLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbnRyaWJ1dGlvbiBsaXN0IGlzIHZpc2libGUuCi0gICAgICogSWYgdGhlIHZpc2liaWxpdHkgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBlYWNoIGl0ZW0gd2l0aGluIHRoZSBtYW5hZ2VyIAotICAgICAqIGFwcGVhcnMgd2l0aGluIHRoZSBwYXJlbnQgbWFuYWdlci4gIE90aGVyd2lzZSwgdGhlIGl0ZW1zIGFyZSBub3QgdmlzaWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1hbmFnZXIgaXMgdmlzaWJsZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHZpc2libGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCBhbiBpdGVtIGhhcyBiZWVuIGFkZGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgYXJlIG5vdCBleHBlY3RlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbSB0aGUgaXRlbSBjb250cmlidXRlZCBieSB0aGUgY2xpZW50Ci0gICAgICogQHBhcmFtIHdyYXAgdGhlIGl0ZW0gY29udHJpYnV0ZWQgdG8gdGhlIHBhcmVudCBtYW5hZ2VyIGFzIGEgcHJveHkgZm9yIHRoZSBpdGVtCi0gICAgICogICAgICBjb250cmlidXRlZCBieSB0aGUgY2xpZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaXRlbUFkZGVkKElDb250cmlidXRpb25JdGVtIGl0ZW0sIFN1YkNvbnRyaWJ1dGlvbkl0ZW0gd3JhcCkgewotICAgICAgICBtYXBJdGVtVG9XcmFwcGVyLnB1dChpdGVtLCB3cmFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGF0IGFuIGl0ZW0gaGFzIGJlZW4gcmVtb3ZlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIGFyZSBub3QgZXhwZWN0ZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW0gdGhlIGl0ZW0gY29udHJpYnV0ZWQgYnkgdGhlIGNsaWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGl0ZW1SZW1vdmVkKElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgbWFwSXRlbVRvV3JhcHBlci5yZW1vdmUoaXRlbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEl0ZW1zKFN0cmluZyB2YWx1ZSkgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gaXRlbXMoKSB7Ci0gICAgICAgIGZpbmFsIEl0ZXJhdG9yIGkgPSBtYXBJdGVtVG9XcmFwcGVyLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHJldHVybiBuZXcgRW51bWVyYXRpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGkuaGFzTmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpLm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1hcmtEaXJ0eSgpIHsKLSAgICAgICAgcGFyZW50TWdyLm1hcmtEaXJ0eSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJlcGVuZFRvR3JvdXAoU3RyaW5nIGdyb3VwTmFtZSwgSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgcHJlcGVuZFRvR3JvdXAoZ3JvdXBOYW1lLCBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByZXBlbmRUb0dyb3VwKFN0cmluZyBncm91cE5hbWUsIElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgaXRlbS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIFN1YkNvbnRyaWJ1dGlvbkl0ZW0gd3JhcCA9IHdyYXAoaXRlbSk7Ci0gICAgICAgIHdyYXAuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgcGFyZW50TWdyLnByZXBlbmRUb0dyb3VwKGdyb3VwTmFtZSwgd3JhcCk7Ci0gICAgICAgIGl0ZW1BZGRlZChpdGVtLCB3cmFwKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbSByZW1vdmUoU3RyaW5nIGlkKSB7Ci0gICAgICAgIElDb250cmlidXRpb25JdGVtIHJlc3VsdCA9IHBhcmVudE1nci5yZW1vdmUoaWQpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICBpdGVtUmVtb3ZlZChyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIElDb250cmlidXRpb25JdGVtIHJlbW92ZShJQ29udHJpYnV0aW9uSXRlbSBpdGVtKSB7Ci0gICAgICAgIFN1YkNvbnRyaWJ1dGlvbkl0ZW0gd3JhcCA9IChTdWJDb250cmlidXRpb25JdGVtKSBtYXBJdGVtVG9XcmFwcGVyCi0gICAgICAgICAgICAgICAgLmdldChpdGVtKTsKLSAgICAgICAgaWYgKHdyYXAgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSByZXN1bHQgPSBwYXJlbnRNZ3IucmVtb3ZlKHdyYXApOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaXRlbVJlbW92ZWQoaXRlbSk7Ci0gICAgICAgIHJldHVybiBpdGVtOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotICAgICAgICBJdGVyYXRvciBpdCA9IG1hcEl0ZW1Ub1dyYXBwZXIudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IChJQ29udHJpYnV0aW9uSXRlbSkgaXQubmV4dCgpOwotICAgICAgICAgICAgcGFyZW50TWdyLnJlbW92ZShpdGVtKTsKLSAgICAgICAgfQotICAgICAgICBtYXBJdGVtVG9XcmFwcGVyLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgbWFuYWdlci4gIElmIHRoZSB2aXNpYmlsaXR5IGlzIDxjb2RlPnRydWU8L2NvZGU+Ci0gICAgICogdGhlbiBlYWNoIGl0ZW0gd2l0aGluIHRoZSBtYW5hZ2VyIGFwcGVhcnMgd2l0aGluIHRoZSBwYXJlbnQgbWFuYWdlci4KLSAgICAgKiBPdGhlcndpc2UsIHRoZSBpdGVtcyBhcmUgbm90IHZpc2libGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmlzaWJsZSB0aGUgbmV3IHZpc2liaWxpdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICB0aGlzLnZpc2libGUgPSB2aXNpYmxlOwotICAgICAgICBpZiAobWFwSXRlbVRvV3JhcHBlci5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IG1hcEl0ZW1Ub1dyYXBwZXIudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gKElDb250cmlidXRpb25JdGVtKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyZW50TWdyLm1hcmtEaXJ0eSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JhcHMgYSBjb250cmlidXRpb24gaXRlbSBpbiBhIHN1YiBjb250cmlidXRpb24gaXRlbSwgYW5kIHJldHVybnMgdGhlIG5ldyB3cmFwcGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdWJDb250cmlidXRpb25JdGVtIHdyYXAoSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotICAgICAgICByZXR1cm4gbmV3IFN1YkNvbnRyaWJ1dGlvbkl0ZW0oaXRlbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW53cmFwcyBhIG5lc3RlZCBjb250cmlidXRpb24gaXRlbS4gSWYgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtIGlzIGFuCi0gICAgICogaW5zdGFuY2Ugb2YgPGNvZGU+U3ViQ29udHJpYnV0aW9uSXRlbTwvY29kZT4sIHRoZW4gaXRzIGlubmVyIGl0ZW0gaXMKLSAgICAgKiByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgaXRlbSBpdHNlbGYgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZW0KLSAgICAgKiAgICAgICAgICAgIFRoZSBpdGVtIHRvIHVud3JhcDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEByZXR1cm4gVGhlIGlubmVyIGl0ZW0gb2YgPGNvZGU+aXRlbTwvY29kZT4sIGlmIDxjb2RlPml0ZW08L2NvZGU+IGlzCi0gICAgICogICAgICAgICBhIDxjb2RlPlN1YkNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+Ozxjb2RlPml0ZW08L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtIHVud3JhcChJQ29udHJpYnV0aW9uSXRlbSBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgewotICAgICAgICAgICAgcmV0dXJuICgoU3ViQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0SW5uZXJJdGVtKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaXRlbTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vU3ViQ29vbEJhck1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9TdWJDb29sQmFyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjViMmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9TdWJDb29sQmFyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBBIDxjb2RlPlN1YkNvb2xCYXJNYW5hZ2VyPC9jb2RlPiBtb25pdG9ycyB0aGUgYWRkaXRpb25hbCBhbmQgcmVtb3ZhbCBvZiAKLSAqIGl0ZW1zIGZyb20gYSBwYXJlbnQgbWFuYWdlciBzbyB0aGF0IHZpc2liaWxpdHkgb2YgdGhlIGVudGlyZSBzZXQgY2FuIGJlIGNoYW5nZWQgYXMgYQotICogdW5pdC4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgU3ViQ29vbEJhck1hbmFnZXIgZXh0ZW5kcyBTdWJDb250cmlidXRpb25NYW5hZ2VyIGltcGxlbWVudHMKLSAgICAgICAgSUNvb2xCYXJNYW5hZ2VyIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgbWFuYWdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZ3IgdGhlIHBhcmVudCBtYW5hZ2VyLiAgQWxsIGNvbnRyaWJ1dGlvbnMgbWFkZSB0byB0aGUgCi0gICAgICogICAgICA8Y29kZT5TdWJDb29sQmFyTWFuYWdlcjwvY29kZT4gYXJlIGZvcndhcmRlZCBhbmQgYXBwZWFyIGluIHRoZQotICAgICAqICAgICAgcGFyZW50IG1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIFN1YkNvb2xCYXJNYW5hZ2VyKElDb29sQmFyTWFuYWdlciBtZ3IpIHsKLSAgICAgICAgc3VwZXIobWdyKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChtZ3IpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29vbEJhck1hbmFnZXIjYWRkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHRvb2xCYXJNYW5hZ2VyKTsKLSAgICAgICAgc3VwZXIuYWRkKG5ldyBUb29sQmFyQ29udHJpYnV0aW9uSXRlbSh0b29sQmFyTWFuYWdlcikpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29vbEJhck1hbmFnZXIjZ2V0U3R5bGUoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7Ci0gICAgICAgIC8vIEl0IGlzIG9rYXkgdG8gY2FzdCBkb3duIHNpbmNlIHdlIG9ubHkgYWNjZXB0IGNvb2xCYXJNYW5hZ2VyIG9iamVjdHMgaW4gdGhlCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yCi0gICAgICAgIHJldHVybiAoKElDb29sQmFyTWFuYWdlcikgZ2V0UGFyZW50KCkpLmdldFN0eWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50IGNvb2wgYmFyIG1hbmFnZXIgdGhhdCB0aGlzIHN1Yi1tYW5hZ2VyIGNvbnRyaWJ1dGVzIHRvLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBjb29sIGJhciBtYW5hZ2VyIAotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBJQ29vbEJhck1hbmFnZXIgZ2V0UGFyZW50Q29vbEJhck1hbmFnZXIoKSB7Ci0gICAgICAgIC8vIENhc3QgaXMgb2sgYmVjYXVzZSB0aGF0J3MgdGhlIG9ubHkKLSAgICAgICAgLy8gdGhpbmcgd2UgYWNjZXB0IGluIHRoZSBjb25zdHJ1dG9yLgotICAgICAgICByZXR1cm4gKElDb29sQmFyTWFuYWdlcikgZ2V0UGFyZW50KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb29sQmFyTWFuYWdlciNpc0xheW91dExvY2tlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0TG9ja0xheW91dCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBhcmVudENvb2xCYXJNYW5hZ2VyKCkuZ2V0TG9ja0xheW91dCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29vbEJhck1hbmFnZXIjbG9ja0xheW91dChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2tMYXlvdXQoYm9vbGVhbiB2YWx1ZSkgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBTdWJDb29sQmFyTWFuYWdlcnMgZG8gbm90IGhhdmUgY29udHJvbCBvZiB0aGUgZ2xvYmFsIGNvbnRleHQgbWVudS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSU1lbnVNYW5hZ2VyIGdldENvbnRleHRNZW51TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEluIFN1YkNvb2xCYXJNYW5hZ2VyIHdlIGRvIG5vdGhpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dE1lbnVNYW5hZ2VyKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyI3VwZGF0ZShib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIG5vdCBnb3Zlcm5lZCBieSB2aXNpYmlsaXR5LiAgVGhlIGNsaWVudCBtYXkKLSAgICAgICAgLy8gY2FsbCA8Y29kZT5zZXRWaXNpYmxlPC9jb2RlPiBhbmQgdGhlbiBmb3JjZSBhbiB1cGRhdGUuICBBdCB0aGF0Ci0gICAgICAgIC8vIHBvaW50IHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwYXJlbnQuCi0gICAgICAgIGdldFBhcmVudENvb2xCYXJNYW5hZ2VyKCkudXBkYXRlKGZvcmNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9TdWJNZW51TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL1N1Yk1lbnVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YmM5N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL1N1Yk1lbnVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci0KLS8qKgotICogQSA8Y29kZT5TdWJNZW51TWFuYWdlcjwvY29kZT4gaXMgdXNlZCB0byBkZWZpbmUgYSBzZXQgb2YgY29udHJpYnV0aW9uCi0gKiBpdGVtcyB3aXRoaW4gYSBwYXJlbnQgbWFuYWdlci4gIE9uY2UgZGVmaW5lZCwgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGVudGlyZSBzZXQgY2FuIAotICogYmUgY2hhbmdlZCBhcyBhIHVuaXQuCi0gKiA8cD4KLSAqIEEgY2xpZW50IG1heSBhc2sgZm9yIGFuZCBtYWtlIGFkZGl0aW9ucyB0byBhIHN1Ym1lbnUuICBUaGUgdmlzaWJpbGl0eSBvZiB0aGVzZSBpdGVtcwotICogaXMgYWxzbyBjb250cm9sbGVkIGJ5IHRoZSB2aXNpYmlsaXR5IG9mIHRoZSA8Y29kZT5TdWJNZW51TWFuYWdlcjwvY29kZT4uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdWJNZW51TWFuYWdlciBleHRlbmRzIFN1YkNvbnRyaWJ1dGlvbk1hbmFnZXIgaW1wbGVtZW50cwotICAgICAgICBJTWVudU1hbmFnZXIgewotCi0gICAgLyoqCi0gICAgICogTWFwcyBlYWNoIHN1Ym1lbnUgaW4gdGhlIG1hbmFnZXIgdG8gYSB3cmFwcGVyLiAgVGhlIHdyYXBwZXIgaXMgdXNlZCB0bwotICAgICAqIG1vbml0b3IgYWRkaXRpb25zIGFuZCByZW1vdmFscy4gIElmIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBtYW5hZ2VyIGlzIG1vZGlmaWVkCi0gICAgICogdGhlIHZpc2liaWxpdHkgb2YgdGhlIHN1Ym1lbnVzIGlzIGFsc28gbW9kaWZpZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgbWFwTWVudVRvV3JhcHBlcjsKLQotICAgIC8qKgotICAgICAqIExpc3Qgb2YgcmVnaXN0ZXJlZCBtZW51IGxpc3RlbmVycyAoZWxlbWVudCB0eXBlOiA8Y29kZT5JTWVudUxpc3RlbmVyPC9jb2RlPikuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbWVudUxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZW51IGxpc3RlbmVyIGFkZGVkIHRvIHRoZSBwYXJlbnQuICBMYXppbHkgaW5pdGlhbGl6ZWQKLSAgICAgKiBpbiBhZGRNZW51TGlzdGVuZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJTWVudUxpc3RlbmVyIG1lbnVMaXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgbWFuYWdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZ3IgdGhlIHBhcmVudCBtYW5hZ2VyLiAgQWxsIGNvbnRyaWJ1dGlvbnMgbWFkZSB0byB0aGUgCi0gICAgICogICAgICA8Y29kZT5TdWJNZW51TWFuYWdlcjwvY29kZT4gYXJlIGZvcndhcmRlZCBhbmQgYXBwZWFyIGluIHRoZQotICAgICAqICAgICAgcGFyZW50IG1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIFN1Yk1lbnVNYW5hZ2VyKElNZW51TWFuYWdlciBtZ3IpIHsKLSAgICAgICAgc3VwZXIobWdyKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyI2FkZE1lbnVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNZW51TGlzdGVuZXIoSU1lbnVMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtZW51TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgICAgIGlmIChtZW51TGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbWVudUxpc3RlbmVyID0gbmV3IElNZW51TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGxpc3RlbmVycyA9IG1lbnVMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKElNZW51TGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lbnVBYm91dFRvU2hvdyhTdWJNZW51TWFuYWdlci50aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0UGFyZW50TWVudU1hbmFnZXIoKS5hZGRNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklDb250cmlidXRpb25JdGVtPC9jb2RlPgotICAgICAqIG1ldGhvZCBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uTWFuYWdlciNkaXNwb3NlTWFuYWdlcigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZU1hbmFnZXIoKSB7Ci0gICAgICAgIGlmIChtZW51TGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0UGFyZW50TWVudU1hbmFnZXIoKS5yZW1vdmVNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLSAgICAgICAgICAgIG1lbnVMaXN0ZW5lciA9IG51bGw7Ci0gICAgICAgICAgICBjbGVhckxpc3RlbmVyTGlzdChtZW51TGlzdGVuZXJzKTsKLSAgICAgICAgfQotICAgICAgICAvLyBEaXNwb3NlIHdyYXBwZWQgbWVudXMgaW4gYWRkaXRpb24gdG8gcmVtb3ZpbmcgdGhlbS4KLSAgICAgICAgLy8gU2VlIGJ1Z3MgNjQwMjQgYW5kIDczNzE1IGZvciBkZXRhaWxzLgotICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZGlzcG9zZSBtZW51IHdyYXBwZXJzIGJlZm9yZSBjYWxsIHRvIHN1cGVyLAotICAgICAgICAvLyBvdGhlcndpc2Ugc3VwZXIncyBjYWxsIHRvIHJlbW92ZUFsbCB3aWxsIHJlbW92ZSB0aGVtCi0gICAgICAgIC8vIGJlZm9yZSB0aGV5IGNhbiBiZSBkaXNwb3NlZAotICAgICAgICBpZiAobWFwTWVudVRvV3JhcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbWFwTWVudVRvV3JhcHBlci52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3ViTWVudU1hbmFnZXIgd3JhcHBlciA9IChTdWJNZW51TWFuYWdlcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgd3JhcHBlci5kaXNwb3NlTWFuYWdlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFwTWVudVRvV3JhcHBlci5jbGVhcigpOwotICAgICAgICAgICAgbWFwTWVudVRvV3JhcHBlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZGlzcG9zZU1hbmFnZXIoKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBDbGVhcnMgYWxsIG9mIHRoZSBsaXN0ZW5lcnMgaW4gYSBsaXN0ZW5lciBsaXN0LiBUT0RPIEJ1ZyAxMTc1MTkgUmVtb3ZlCi0JICogdGhpcyBtZXRob2Qgd2hlbiBmaXhlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdAotCSAqICAgICAgICAgICAgVGhlIGxpc3QgdG8gYmUgY2xlYXI7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBjbGVhckxpc3RlbmVyTGlzdChmaW5hbCBMaXN0ZW5lckxpc3QgbGlzdCkgewotCQlmaW5hbCBPYmplY3RbXSBsaXN0ZW5lcnMgPSBsaXN0LmdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJbGlzdC5yZW1vdmUobGlzdGVuZXJzW2ldKTsKLQkJfQotCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaWYgKGlzVmlzaWJsZSgpKQotICAgICAgICAgICAgZ2V0UGFyZW50TWVudU1hbmFnZXIoKS5maWxsKHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI2ZpbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhciwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoQ29vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI2ZpbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudSwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoTWVudSBwYXJlbnQsIGludCBpbmRleCkgewotICAgICAgICBpZiAoaXNWaXNpYmxlKCkpCi0gICAgICAgICAgICBnZXRQYXJlbnRNZW51TWFuYWdlcigpLmZpbGwocGFyZW50LCBpbmRleCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI2ZpbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhciwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoVG9vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotICAgICAgICBpZiAoaXNWaXNpYmxlKCkpCi0gICAgICAgICAgICBnZXRQYXJlbnRNZW51TWFuYWdlcigpLmZpbGwocGFyZW50LCBpbmRleCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTWFuYWdlci4KLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIGl0ZW0gcGFzc2VkIHRvIHVzLCBub3QgdGhlIHdyYXBwZXIuCi0gICAgICogSW4gdGhlIGNhc2Ugb2YgbWVudSdzIG5vdCBhZGRlZCBieSB0aGlzIG1hbmFnZXIsCi0gICAgICogZW5zdXJlIHRoYXQgd2UgcmV0dXJuIGEgd3JhcHBlciBmb3IgdGhlIG1lbnUuCi0gICAgICovCi0gICAgcHVibGljIElDb250cmlidXRpb25JdGVtIGZpbmQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBnZXRQYXJlbnRNZW51TWFuYWdlcigpLmZpbmQoaWQpOwotICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pCi0gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGl0ZW0gcGFzc2VkIHRvIHVzLCBub3QgdGhlIHdyYXBwZXIuCi0gICAgICAgICAgICBpdGVtID0gdW53cmFwKGl0ZW0pOwotCi0gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgSU1lbnVNYW5hZ2VyKSB7Ci0gICAgICAgICAgICAvLyBpZiBpdCBpcyBhIG1lbnUgbWFuYWdlciB3cmFwIGl0IGJlZm9yZSByZXR1cm5pbmcKLSAgICAgICAgICAgIElNZW51TWFuYWdlciBtZW51ID0gKElNZW51TWFuYWdlcikgaXRlbTsKLSAgICAgICAgICAgIGl0ZW0gPSBnZXRXcmFwcGVyKG1lbnUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1lbnUgcmV0dXJuZWQgaXMgd3JhcHBlZCB3aXRoaW4gYSA8Y29kZT5TdWJNZW51TWFuYWdlcjwvY29kZT4gdG8KLSAgICAgKiBtb25pdG9yIGFkZGl0aW9ucyBhbmQgcmVtb3ZhbHMuICBJZiB0aGUgdmlzaWJpbGl0eSBvZiB0aGlzIG1lbnUgaXMgbW9kaWZpZWQKLSAgICAgKiB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgc3VibWVudXMgaXMgYWxzbyBtb2RpZmllZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIElNZW51TWFuYWdlciBmaW5kTWVudVVzaW5nUGF0aChTdHJpbmcgcGF0aCkgewotICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gZmluZFVzaW5nUGF0aChwYXRoKTsKLSAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoSU1lbnVNYW5hZ2VyKSBpdGVtOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSU1lbnVNYW5hZ2VyLgotICAgICAqCi0gICAgICogUmV0dXJucyB0aGUgaXRlbSBwYXNzZWQgdG8gdXMsIG5vdCB0aGUgd3JhcHBlci4KLSAgICAgKgotICAgICAqIFdlIHVzZSB1c2UgdGhlIHNhbWUgYWxnb3JpdGhtIGFzIE1lbnVNYW5hZ2VyLmZpbmRVc2luZ1BhdGgsIGJ1dCB1bndyYXAKLSAgICAgKiBzdWJtZW51cyBhbG9uZyBzbyB0aGF0IFN1Yk1lbnVNYW5hZ2VycyBhcmUgdmlzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUNvbnRyaWJ1dGlvbkl0ZW0gZmluZFVzaW5nUGF0aChTdHJpbmcgcGF0aCkgewotICAgICAgICBTdHJpbmcgaWQgPSBwYXRoOwotICAgICAgICBTdHJpbmcgcmVzdCA9IG51bGw7Ci0gICAgICAgIGludCBzZXBhcmF0b3IgPSBwYXRoLmluZGV4T2YoJy8nKTsKLSAgICAgICAgaWYgKHNlcGFyYXRvciAhPSAtMSkgewotICAgICAgICAgICAgaWQgPSBwYXRoLnN1YnN0cmluZygwLCBzZXBhcmF0b3IpOwotICAgICAgICAgICAgcmVzdCA9IHBhdGguc3Vic3RyaW5nKHNlcGFyYXRvciArIDEpOwotICAgICAgICB9Ci0gICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBmaW5kKGlkKTsgLy8gdW53cmFwcyBpdGVtCi0gICAgICAgIGlmIChyZXN0ICE9IG51bGwgJiYgaXRlbSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcikgewotICAgICAgICAgICAgSU1lbnVNYW5hZ2VyIG1lbnUgPSAoSU1lbnVNYW5hZ2VyKSBpdGVtOwotICAgICAgICAgICAgaXRlbSA9IG1lbnUuZmluZFVzaW5nUGF0aChyZXN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jZ2V0SWQoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJlbnRNZW51TWFuYWdlcigpLmdldElkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50IG1lbnUgbWFuYWdlciB0aGF0IHRoaXMgc3ViLW1hbmFnZXIgY29udHJpYnV0ZXMgdG8uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIElNZW51TWFuYWdlciBnZXRQYXJlbnRNZW51TWFuYWdlcigpIHsKLSAgICAgICAgLy8gQ2FzdCBpcyBvayBiZWNhdXNlIHRoYXQncyB0aGUgb25seQotICAgICAgICAvLyB0aGluZyB3ZSBhY2NlcHQgaW4gdGhlIGNvbnN0cnV0b3IuCi0gICAgICAgIHJldHVybiAoSU1lbnVNYW5hZ2VyKSBnZXRQYXJlbnQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyI2dldFJlbW92ZUFsbFdoZW5TaG93bigpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVtb3ZlQWxsV2hlblNob3duKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVudSB3cmFwcGVyIGZvciBhIG1lbnUgbWFuYWdlci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3ViIG1lbnVzIHdpdGhpbiB0aGlzIG1lbnUgYXJlIHdyYXBwZWQgd2l0aGluIGEgPGNvZGU+U3ViTWVudU1hbmFnZXI8L2NvZGU+IHRvCi0gICAgICogbW9uaXRvciBhZGRpdGlvbnMgYW5kIHJlbW92YWxzLiAgSWYgdGhlIHZpc2liaWxpdHkgb2YgdGhpcyBtZW51IGlzIG1vZGlmaWVkCi0gICAgICogdGhlIHZpc2liaWxpdHkgb2YgdGhlIHN1YiBtZW51cyBpcyBhbHNvIG1vZGlmaWVkLgotICAgICAqIDxwPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWVudSB3cmFwcGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElNZW51TWFuYWdlciBnZXRXcmFwcGVyKElNZW51TWFuYWdlciBtZ3IpIHsKLSAgICAgICAgaWYgKG1hcE1lbnVUb1dyYXBwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbWFwTWVudVRvV3JhcHBlciA9IG5ldyBIYXNoTWFwKDQpOwotICAgICAgICB9Ci0gICAgICAgIFN1Yk1lbnVNYW5hZ2VyIHdyYXBwZXIgPSAoU3ViTWVudU1hbmFnZXIpIG1hcE1lbnVUb1dyYXBwZXIuZ2V0KG1ncik7Ci0gICAgICAgIGlmICh3cmFwcGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHdyYXBwZXIgPSB3cmFwTWVudShtZ3IpOwotICAgICAgICAgICAgbWFwTWVudVRvV3JhcHBlci5wdXQobWdyLCB3cmFwcGVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3JhcHBlcjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jaXNEeW5hbWljKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJlbnRNZW51TWFuYWdlcigpLmlzRHluYW1pYygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbSNpc0VuYWJsZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzVmlzaWJsZSgpICYmIGdldFBhcmVudE1lbnVNYW5hZ2VyKCkuaXNFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI2lzR3JvdXBNYXJrZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR3JvdXBNYXJrZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJlbnRNZW51TWFuYWdlcigpLmlzR3JvdXBNYXJrZXIoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jaXNTZXBhcmF0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2VwYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gZ2V0UGFyZW50TWVudU1hbmFnZXIoKS5pc1NlcGFyYXRvcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25NYW5hZ2VyI2lzVmlzaWJsZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuaXNWaXNpYmxlKCkgJiYgZ2V0UGFyZW50TWVudU1hbmFnZXIoKS5pc1Zpc2libGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYWxsIGNvbnRyaWJ1dGlvbiBpdGVtcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0gICAgICAgIHN1cGVyLnJlbW92ZUFsbCgpOwotICAgICAgICBpZiAobWFwTWVudVRvV3JhcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbWFwTWVudVRvV3JhcHBlci52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3ViTWVudU1hbmFnZXIgd3JhcHBlciA9IChTdWJNZW51TWFuYWdlcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgd3JhcHBlci5yZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hcE1lbnVUb1dyYXBwZXIuY2xlYXIoKTsKLSAgICAgICAgICAgIG1hcE1lbnVUb1dyYXBwZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlciNyZW1vdmVNZW51TGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTWVudUxpc3RlbmVyKElNZW51TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbWVudUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbSNzYXZlV2lkZ2V0U3RhdGUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVXaWRnZXRTdGF0ZSgpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbSNzZXRQYXJlbnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChJQ29udHJpYnV0aW9uTWFuYWdlciBwYXJlbnQpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZywgb3VyICJwYXJlbnQgbWFuYWdlcidzIiBwYXJlbnQgCi0gICAgICAgIC8vIGlzIHNldCB3aGVuIGl0IGlzIGFkZGVkIHRvIGEgbWFuYWdlcgotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIjc2V0UmVtb3ZlQWxsV2hlblNob3duKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlQWxsV2hlblNob3duKGJvb2xlYW4gcmVtb3ZlQWxsKSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoZmFsc2UsICJTaG91bGQgbm90IGJlIGNhbGxlZCBvbiBzdWJtZW51IG1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25NYW5hZ2VyI3NldFZpc2libGUoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgICAgICBpZiAobWFwTWVudVRvV3JhcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbWFwTWVudVRvV3JhcHBlci52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3ViTWVudU1hbmFnZXIgd3JhcHBlciA9IChTdWJNZW51TWFuYWdlcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgd3JhcHBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI3VwZGF0ZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBub3QgZ292ZXJuZWQgYnkgdmlzaWJpbGl0eS4gIFRoZSBjbGllbnQgbWF5Ci0gICAgICAgIC8vIGNhbGwgPGNvZGU+c2V0VmlzaWJsZTwvY29kZT4gYW5kIHRoZW4gZm9yY2UgYW4gdXBkYXRlLiAgQXQgdGhhdAotICAgICAgICAvLyBwb2ludCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcGFyZW50LgotICAgICAgICBnZXRQYXJlbnRNZW51TWFuYWdlcigpLnVwZGF0ZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlciN1cGRhdGUoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoYm9vbGVhbiBmb3JjZSkgewotICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBub3QgZ292ZXJuZWQgYnkgdmlzaWJpbGl0eS4gIFRoZSBjbGllbnQgbWF5Ci0gICAgICAgIC8vIGNhbGwgPGNvZGU+c2V0VmlzaWJsZTwvY29kZT4gYW5kIHRoZW4gZm9yY2UgYW4gdXBkYXRlLiAgQXQgdGhhdAotICAgICAgICAvLyBwb2ludCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcGFyZW50LgotICAgICAgICBnZXRQYXJlbnRNZW51TWFuYWdlcigpLnVwZGF0ZShmb3JjZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI3VwZGF0ZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgaWQpIHsKLSAgICAgICAgZ2V0UGFyZW50TWVudU1hbmFnZXIoKS51cGRhdGUoaWQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIjdXBkYXRlQWxsKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQWxsKGJvb2xlYW4gZm9yY2UpIHsKLSAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgbm90IGdvdmVybmVkIGJ5IHZpc2liaWxpdHkuICBUaGUgY2xpZW50IG1heQotICAgICAgICAvLyBjYWxsIDxjb2RlPnNldFZpc2libGU8L2NvZGU+IGFuZCB0aGVuIGZvcmNlIGFuIHVwZGF0ZS4gIEF0IHRoYXQKLSAgICAgICAgLy8gcG9pbnQgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBhcmVudC4KLSAgICAgICAgZ2V0UGFyZW50TWVudU1hbmFnZXIoKS51cGRhdGVBbGwoZm9yY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyYXBzIGEgbWVudSBtYW5hZ2VyIGluIGEgc3ViIG1lbnUgbWFuYWdlciwgYW5kIHJldHVybnMgdGhlIG5ldyB3cmFwcGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdWJNZW51TWFuYWdlciB3cmFwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotICAgICAgICBTdWJNZW51TWFuYWdlciBtZ3IgPSBuZXcgU3ViTWVudU1hbmFnZXIobWVudSk7Ci0gICAgICAgIG1nci5zZXRWaXNpYmxlKGlzVmlzaWJsZSgpKTsKLSAgICAgICAgcmV0dXJuIG1ncjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vU3ViU3RhdHVzTGluZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9TdWJTdGF0dXNMaW5lTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzYyMzk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9TdWJTdGF0dXNMaW5lTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQSA8Y29kZT5TdWJTdGF0dXNMaW5lTWFuYWdlcjwvY29kZT4gaXMgdXNlZCB0byBkZWZpbmUgYSBzZXQgb2YgY29udHJpYnV0aW9uCi0gKiBpdGVtcyB3aXRoaW4gYSBwYXJlbnQgbWFuYWdlci4gIE9uY2UgZGVmaW5lZCwgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGVudGlyZSBzZXQgY2FuIAotICogYmUgY2hhbmdlZCBhcyBhIHVuaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJTdGF0dXNMaW5lTWFuYWdlciBleHRlbmRzIFN1YkNvbnRyaWJ1dGlvbk1hbmFnZXIgaW1wbGVtZW50cwotICAgICAgICBJU3RhdHVzTGluZU1hbmFnZXIgewotICAgIC8qKgotICAgICAqIEN1cnJlbnQgc3RhdHVzIGxpbmUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3VycmVudCBzdGF0dXMgbGluZSBlcnJvciBtZXNzYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQotICAgIC8qKgotICAgICAqIEN1cnJlbnQgc3RhdHVzIGxpbmUgbWVzc2FnZSBpbWFnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEltYWdlIG1lc3NhZ2VJbWFnZTsKLQotICAgIC8qKgotICAgICAqIEN1cnJlbnQgc3RhdHVzIGxpbmUgZXJyb3IgaW1hZ2UKLSAgICAgKi8KLSAgICBwcml2YXRlIEltYWdlIGVycm9ySW1hZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWdyIHRoZSBwYXJlbnQgbWFuYWdlci4gIEFsbCBjb250cmlidXRpb25zIG1hZGUgdG8gdGhlIAotICAgICAqICAgICAgPGNvZGU+U3ViU3RhdHVzTGluZU1hbmFnZXI8L2NvZGU+IGFyZSBmb3J3YXJkZWQgYW5kIGFwcGVhciBpbiB0aGUKLSAgICAgKiAgICAgIHBhcmVudCBtYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBTdWJTdGF0dXNMaW5lTWFuYWdlcihJU3RhdHVzTGluZU1hbmFnZXIgbWdyKSB7Ci0gICAgICAgIHN1cGVyKG1ncik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50IHN0YXR1cyBsaW5lIG1hbmFnZXIgdGhhdCB0aGlzIHN1Yi1tYW5hZ2VyIGNvbnRyaWJ1dGVzCi0gICAgICogdG8uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIElTdGF0dXNMaW5lTWFuYWdlciBnZXRQYXJlbnRTdGF0dXNMaW5lTWFuYWdlcigpIHsKLSAgICAgICAgLy8gQ2FzdCBpcyBvayBiZWNhdXNlIHRoYXQncyB0aGUgb25seQotICAgICAgICAvLyB0aGluZyB3ZSBhY2NlcHQgaW4gdGhlIGNvbnN0cnV0b3IuCi0gICAgICAgIHJldHVybiAoSVN0YXR1c0xpbmVNYW5hZ2VyKSBnZXRQYXJlbnQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElTdGF0dXNMaW5lTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJlbnRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVN0YXR1c0xpbmVNYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBhcmVudFN0YXR1c0xpbmVNYW5hZ2VyKCkuaXNDYW5jZWxFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU3RhdHVzTGluZU1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FuY2VsRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgZ2V0UGFyZW50U3RhdHVzTGluZU1hbmFnZXIoKS5zZXRDYW5jZWxFbmFibGVkKGVuYWJsZWQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVN0YXR1c0xpbmVNYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB0aGlzLmVycm9ySW1hZ2UgPSBudWxsOwotICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgIGlmIChpc1Zpc2libGUoKSkKLSAgICAgICAgICAgIGdldFBhcmVudFN0YXR1c0xpbmVNYW5hZ2VyKCkuc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU3RhdHVzTGluZU1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKEltYWdlIGltYWdlLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB0aGlzLmVycm9ySW1hZ2UgPSBpbWFnZTsKLSAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICBpZiAoaXNWaXNpYmxlKCkpCi0gICAgICAgICAgICBnZXRQYXJlbnRTdGF0dXNMaW5lTWFuYWdlcigpLnNldEVycm9yTWVzc2FnZShlcnJvckltYWdlLAotICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVN0YXR1c0xpbmVNYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlSW1hZ2UgPSBudWxsOwotICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICBpZiAoaXNWaXNpYmxlKCkpCi0gICAgICAgICAgICBnZXRQYXJlbnRTdGF0dXNMaW5lTWFuYWdlcigpLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU3RhdHVzTGluZU1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShJbWFnZSBpbWFnZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlSW1hZ2UgPSBpbWFnZTsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgaWYgKGlzVmlzaWJsZSgpKQotICAgICAgICAgICAgZ2V0UGFyZW50U3RhdHVzTGluZU1hbmFnZXIoKS5zZXRNZXNzYWdlKG1lc3NhZ2VJbWFnZSwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBTdWJDb250cmlidXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICBnZXRQYXJlbnRTdGF0dXNMaW5lTWFuYWdlcigpLnNldEVycm9yTWVzc2FnZShlcnJvckltYWdlLAotICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UpOwotICAgICAgICAgICAgZ2V0UGFyZW50U3RhdHVzTGluZU1hbmFnZXIoKS5zZXRNZXNzYWdlKG1lc3NhZ2VJbWFnZSwgbWVzc2FnZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZXRQYXJlbnRTdGF0dXNMaW5lTWFuYWdlcigpLnNldE1lc3NhZ2UobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBnZXRQYXJlbnRTdGF0dXNMaW5lTWFuYWdlcigpLnNldEVycm9yTWVzc2FnZShudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVN0YXR1c0xpbmVNYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIG5vdCBnb3Zlcm5lZCBieSB2aXNpYmlsaXR5LiAgVGhlIGNsaWVudCBtYXkKLSAgICAgICAgLy8gY2FsbCA8Y29kZT5zZXRWaXNpYmxlPC9jb2RlPiBhbmQgdGhlbiBmb3JjZSBhbiB1cGRhdGUuICBBdCB0aGF0Ci0gICAgICAgIC8vIHBvaW50IHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwYXJlbnQuCi0gICAgICAgIGdldFBhcmVudFN0YXR1c0xpbmVNYW5hZ2VyKCkudXBkYXRlKGZvcmNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vU3ViVG9vbEJhck1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9TdWJUb29sQmFyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTk3NzkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9TdWJUb29sQmFyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbjsKLQotLyoqCi0gKiBBIDxjb2RlPlN1YlRvb2xCYXJNYW5hZ2VyPC9jb2RlPiBtb25pdG9ycyB0aGUgYWRkaXRpb25hbCBhbmQgcmVtb3ZhbCBvZiAKLSAqIGl0ZW1zIGZyb20gYSBwYXJlbnQgbWFuYWdlciBzbyB0aGF0IHZpc2liaWxpdHkgb2YgdGhlIGVudGlyZSBzZXQgY2FuIGJlIGNoYW5nZWQgYXMgYQotICogdW5pdC4KLSAqLwotcHVibGljIGNsYXNzIFN1YlRvb2xCYXJNYW5hZ2VyIGV4dGVuZHMgU3ViQ29udHJpYnV0aW9uTWFuYWdlciBpbXBsZW1lbnRzCi0gICAgICAgIElUb29sQmFyTWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWdyIHRoZSBwYXJlbnQgbWFuYWdlci4gIEFsbCBjb250cmlidXRpb25zIG1hZGUgdG8gdGhlIAotICAgICAqICAgICAgPGNvZGU+U3ViVG9vbEJhck1hbmFnZXI8L2NvZGU+IGFyZSBmb3J3YXJkZWQgYW5kIGFwcGVhciBpbiB0aGUKLSAgICAgKiAgICAgIHBhcmVudCBtYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBTdWJUb29sQmFyTWFuYWdlcihJVG9vbEJhck1hbmFnZXIgbWdyKSB7Ci0gICAgICAgIHN1cGVyKG1ncik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50IHRvb2xiYXIgbWFuYWdlciB0aGF0IHRoaXMgc3ViLW1hbmFnZXIgY29udHJpYnV0ZXMgdG8uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIElUb29sQmFyTWFuYWdlciBnZXRQYXJlbnRUb29sQmFyTWFuYWdlcigpIHsKLSAgICAgICAgLy8gQ2FzdCBpcyBvayBiZWNhdXNlIHRoYXQncyB0aGUgb25seQotICAgICAgICAvLyB0aGluZyB3ZSBhY2NlcHQgaW4gdGhlIGNvbnN0cnV0b3IuCi0gICAgICAgIHJldHVybiAoSVRvb2xCYXJNYW5hZ2VyKSBnZXRQYXJlbnQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElUb29sQmFyTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoYm9vbGVhbiBmb3JjZSkgewotICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBub3QgZ292ZXJuZWQgYnkgdmlzaWJpbGl0eS4gIFRoZSBjbGllbnQgbWF5Ci0gICAgICAgIC8vIGNhbGwgPGNvZGU+c2V0VmlzaWJsZTwvY29kZT4gYW5kIHRoZW4gZm9yY2UgYW4gdXBkYXRlLiAgQXQgdGhhdAotICAgICAgICAvLyBwb2ludCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcGFyZW50LgotICAgICAgICBnZXRQYXJlbnRUb29sQmFyTWFuYWdlcigpLnVwZGF0ZShmb3JjZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL1Rvb2xCYXJDb250cmlidXRpb25JdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjZDg5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLQotLyoqCi0gKiBUaGUgPGNvZGU+VG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW08L2NvZGU+IGNsYXNzIHByb3ZpZGVzIGEgd3JhcHBlciBmb3IgdG9vbAotICogYmFyIG1hbmFnZXJzIHdoZW4gdXNlZCBpbiBjb29sIGJhciBtYW5hZ2Vycy4gSXQgZXh0ZW5kcyA8Y29kZT5Db250cmlidXRpb25JdGVtPC9jb2RlPgotICogYnV0IGFuZCBwcm92aWRlcyBzb21lIGFkZGl0aW9uYWwgbWV0aG9kcyB0byBjdXN0b21pemUgdGhlIHNpemUgb2YgdGhlIGNvb2wKLSAqIGl0ZW0gYW5kIHRvIHJldHJpZXZlIHRoZSB1bmRlcmx5aW5nIHRvb2wgYmFyIG1hbmFnZXIuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFRvb2xCYXJDb250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNvbnN0YW50IHVzZWQgYnkgPGNvZGU+c2V0TWluaW11bUl0ZW1zVG9TaG93PC9jb2RlPiBhbmQgPGNvZGU+Z2V0TWluaW11bUl0ZW1zVG9TaG93PC9jb2RlPgotICAgICAqIHRvIGluZGljYXRlIHRoYXQgYWxsIHRvb2wgaXRlbXMgc2hvdWxkIGJlIHNob3duIGluIHRoZSBjb29sIGl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BTExfSVRFTVMgPSAtMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBwdWxsIGRvd24gbWVudSB1c2VkIHRvIGxpc3QgYWxsIGhpZGRlbiB0b29sIGl0ZW1zIGlmIHRoZSBjdXJyZW50Ci0gICAgICogc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIHByZWZmZXJlZCBzaXplLgotICAgICAqLwotICAgIHByaXZhdGUgTWVudU1hbmFnZXIgY2hldnJvbk1lbnVNYW5hZ2VyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSB3aWRnZXQgY3JlYXRlZCBmb3IgdGhpcyBpdGVtOyA8Y29kZT5udWxsPC9jb2RlPiBiZWZvcmUgY3JlYXRpb24KLSAgICAgKiBhbmQgYWZ0ZXIgZGlzcG9zYWwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb29sSXRlbSBjb29sSXRlbSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDdXJyZW50IGhlaWdodCBvZiBjb29sIGl0ZW0KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBjdXJyZW50SGVpZ2h0ID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBDdXJyZW50IHdpZHRoIG9mIGNvb2wgaXRlbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBjdXJyZW50V2lkdGggPSAtMTsKLQotICAgIC8qKgotICAgICAqIEEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhpcyBpdGVtIGhhcyBiZWVuIGRpc3Bvc2VkLiBUaGlzIHByZXZlbnRzIGZ1dHVyZQotICAgICAqIG1ldGhvZCBpbnZvY2F0aW9ucyBmcm9tIGRvaW5nIHRoaW5ncyB0aGV5IHNob3VsZG4ndC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIE1pbmludW0gbnVtYmVyIG9mIHRvb2wgaXRlbXMgdG8gc2hvdyBpbiB0aGUgY29vbCBpdGVtIHdpZGdldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtaW5pbXVtSXRlbXNUb1Nob3cgPSBTSE9XX0FMTF9JVEVNUzsKLQotICAgIC8qKgotICAgICAqIFRoZSB0b29sIGJhciBtYW5hZ2VyIHVzZWQgdG8gbWFuYWdlIHRoZSB0b29sIGl0ZW1zIGNvbnRhaW5lZCBpbiB0aGUgY29vbAotICAgICAqIGl0ZW0gd2lkZ2V0LgotICAgICAqLwotICAgIHByaXZhdGUgVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogRW5hYmxlL2Rpc2FibGUgY2hldnJvbiBzdXBwb3J0LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VDaGV2cm9uID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBlcXVpdmFsZW50IHRvIDxjb2RlPlRvb2xCYXJDb250cmlidXRpb25JdGVtKG5ldyBUb29sQmFyTWFuYWdlcigpLCBudWxsKTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIFRvb2xCYXJDb250cmlidXRpb25JdGVtKCkgewotICAgICAgICB0aGlzKG5ldyBUb29sQmFyTWFuYWdlcigpLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZXF1aXZhbGVudCB0byA8Y29kZT5Ub29sQmFyQ29udHJpYnV0aW9uSXRlbSh0b29sQmFyTWFuYWdlciwgbnVsbCk8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b29sQmFyTWFuYWdlcgotICAgICAqICAgICAgICAgICAgdGhlIHRvb2wgYmFyIG1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0oSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXModG9vbEJhck1hbmFnZXIsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0b29sIGJhciBjb250cmlidXRpb24gaXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9vbEJhck1hbmFnZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSB0b29sIGJhciBtYW5hZ2VyIHRvIHdyYXAKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb250cmlidXRpb24gaXRlbSBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBUb29sQmFyQ29udHJpYnV0aW9uSXRlbShJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIFN0cmluZyBpZCkgewotICAgICAgICBzdXBlcihpZCk7Ci0gICAgICAgIEFzc2VydC5pc1RydWUodG9vbEJhck1hbmFnZXIgaW5zdGFuY2VvZiBUb29sQmFyTWFuYWdlcik7Ci0gICAgICAgIHRoaXMudG9vbEJhck1hbmFnZXIgPSAoVG9vbEJhck1hbmFnZXIpIHRvb2xCYXJNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udHJpYnV0aW9uIGl0ZW0gaGFzIGJlZW4gZGlzcG9zZWQuIElmIGl0IGhhcywgYW5kCi0gICAgICogdGhlIHRyYWNpbmcgb3B0aW9ucyBhcmUgYWN0aXZlLCB0aGVuIGl0IHByaW50cyBzb21lIGRlYnVnZ2luZwotICAgICAqIGluZm9ybWF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZW0gaXMgZGlzcG9zZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgotICAgICAqICAKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY2hlY2tEaXNwb3NlZCgpIHsKLSAgICAgICAgaWYgKGRpc3Bvc2VkKSB7Ci0gICAgICAgICAgICBpZiAoUG9saWN5LlRSQUNFX1RPT0xCQVIpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiTWV0aG9kIGludm9jYXRpb24gb24gYSBkaXNwb3NlZCB0b29sIGJhciBjb250cmlidXRpb24gaXRlbS4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIERpc3Bvc2Ugb2YgdGhlIFRvb2xCYXIgYW5kIGFsbCBpdHMgY29udHJpYnV0aW9ucwotICAgICAgICBpZiAodG9vbEJhck1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgbmVlZCB0byBkaXNwb3NlIHRoZSBjb29sIGl0ZW0gb3Igd2UgbWlnaHQgYmUgbGVmdCBob2xkaW5nIGEgY29vbAotICAgICAgICAgKiBpdGVtIHdpdGggYSBkaXNwb3NlZCBjb250cm9sLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChjb29sSXRlbSAhPSBudWxsKSAmJiAoIWNvb2xJdGVtLmlzRGlzcG9zZWQoKSkpIHsKLSAgICAgICAgICAgIGNvb2xJdGVtLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGNvb2xJdGVtID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1hcmsgdGhpcyBpdGVtIGFzIGRpc3Bvc2VkLgotICAgICAgICBkaXNwb3NlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyLAotICAgICAqICAgICAgaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGwoQ29vbEJhciBjb29sQmFyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGNoZWNrRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvb2xJdGVtID09IG51bGwgJiYgY29vbEJhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUb29sQmFyIG9sZFRvb2xCYXIgPSB0b29sQmFyTWFuYWdlci5nZXRDb250cm9sKCk7Ci0gICAgICAgICAgICBUb29sQmFyIHRvb2xCYXIgPSB0b29sQmFyTWFuYWdlci5jcmVhdGVDb250cm9sKGNvb2xCYXIpOwotICAgICAgICAgICAgaWYgKChvbGRUb29sQmFyICE9IG51bGwpICYmIChvbGRUb29sQmFyLmVxdWFscyh0b29sQmFyKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhcmUgdXNpbmcgYW4gb2xkIHRvb2wgYmFyLCBzbyB3ZSBuZWVkIHRvIHVwZGF0ZS4KLSAgICAgICAgICAgICAgICB0b29sQmFyTWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERvIG5vdCBjcmVhdGUgYSBjb29sSXRlbSBpZiB0aGUgdG9vbGJhciBpcyBlbXB0eQotICAgICAgICAgICAgaWYgKHRvb2xCYXIuZ2V0SXRlbUNvdW50KCkgPCAxKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGludCBmbGFncyA9IFNXVC5EUk9QX0RPV047Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIGZsYWdzLCBpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIGZsYWdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHNldHMgdGhlIGJhY2sgcmVmZXJlbmNlCi0gICAgICAgICAgICBjb29sSXRlbS5zZXREYXRhKHRoaXMpOwotICAgICAgICAgICAgLy8gQWRkIHRoZSB0b29sYmFyIHRvIHRoZSBDb29sSXRlbSB3aWRnZXQKLSAgICAgICAgICAgIGNvb2xJdGVtLnNldENvbnRyb2wodG9vbEJhcik7Ci0KLSAgICAgICAgICAgIC8vIEhhbmRsZSBDb250ZXh0IE1lbnUKLSAgICAgICAgICAgIC8vIFRvb2xCYXJNYW5hZ2VyLmNyZWF0ZUNvbnRyb2wgY2FuIGFjdHVhbGx5IHJldHVybiBhIHByZS1leGlzdGluZyBjb250cm9sLgotICAgICAgICAgICAgLy8gT25seSBhZGQgdGhlIGxpc3RlbmVyIGlmIHRoZSB0b29sYmFyIHdhcyBuZXdseSBjcmVhdGVkIChidWcgNjIwOTcpLgotICAgICAgICAgICAgaWYgKG9sZFRvb2xCYXIgIT0gdG9vbEJhcikgewotCSAgICAgICAgICAgIHRvb2xCYXIuYWRkTGlzdGVuZXIoU1dULk1lbnVEZXRlY3QsIG5ldyBMaXN0ZW5lcigpIHsKLQkKLQkgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0b29sYmFyIGRvZXMgbm90IGhhdmUgaXRzIG93biBjb250ZXh0IG1lbnUgdGhlbgotCSAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBldmVudAotCSAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2xCYXJNYW5hZ2VyLmdldENvbnRleHRNZW51TWFuYWdlcigpID09IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDb250ZXh0TWVudShldmVudCk7Ci0JICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSGFuZGxlIGZvciBjaGV2cm9uIGNsaWNraW5nCi0gICAgICAgICAgICBpZiAoZ2V0VXNlQ2hldnJvbigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hldnJvbiBTdXBwb3J0Ci0gICAgICAgICAgICAgICAgY29vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hldnJvbihldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSGFuZGxlIGZvciBkaXNwb3NhbAotICAgICAgICAgICAgY29vbEl0ZW0uYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlV2lkZ2V0RGlzcG9zZShldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIC8vIFNldHMgdGhlIHNpemUgb2YgdGhlIGNvb2xJdGVtCi0gICAgICAgICAgICB1cGRhdGVTaXplKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbnNpc3RlbnQgc2V0IG9mIHdyYXAgaW5kaWNlcy4gVGhlIHJldHVybiB2YWx1ZSB3aWxsIGFsd2F5cwotICAgICAqIGluY2x1ZGUgYXQgbGVhc3Qgb25lIGVudHJ5IGFuZCB0aGUgZmlyc3QgZW50cnkgd2lsbCBhbHdheXMgYmUgemVyby4KLSAgICAgKiBDb29sQmFyLmdldFdyYXBJbmRpY2VzKCkgaXMgaW5jb25zaXN0ZW50IGluIHdoZXRoZXIgb3Igbm90IGl0IHJldHVybnMgYW4KLSAgICAgKiBpbmRleCBmb3IgdGhlIGZpcnN0IHJvdy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludFtdIGdldEFkanVzdGVkV3JhcEluZGljZXMoaW50W10gd3JhcHMpIHsKLSAgICAgICAgaW50W10gYWRqdXN0ZWRXcmFwSW5kaWNlczsKLSAgICAgICAgaWYgKHdyYXBzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICBhZGp1c3RlZFdyYXBJbmRpY2VzID0gbmV3IGludFtdIHsgMCB9OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHdyYXBzWzBdICE9IDApIHsKLSAgICAgICAgICAgICAgICBhZGp1c3RlZFdyYXBJbmRpY2VzID0gbmV3IGludFt3cmFwcy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgICAgICBhZGp1c3RlZFdyYXBJbmRpY2VzWzBdID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyYXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkanVzdGVkV3JhcEluZGljZXNbaSArIDFdID0gd3JhcHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGp1c3RlZFdyYXBJbmRpY2VzID0gd3JhcHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFkanVzdGVkV3JhcEluZGljZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29vbCBpdGVtLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgaGVpZ2h0Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDdXJyZW50SGVpZ2h0KCkgewotICAgICAgICBpZiAoY2hlY2tEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRIZWlnaHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgY29ycmVzcG9uZGluZyBjb29sIGl0ZW0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBzaXplCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDdXJyZW50V2lkdGgoKSB7Ci0gICAgICAgIGlmIChjaGVja0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFdpZHRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHRvb2wgaXRlbXMgdG8gc2hvdyBpbiB0aGUgY29vbCBpdGVtLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gbnVtYmVyIG9mIHRvb2wgaXRlbXMgdG8gc2hvdywgb3IgPGNvZGU+U0hPV19BTExfSVRFTVM8L2NvZGU+Ci0gICAgICogICAgICAgICBpZiBhIHZhbHVlIHdhcyBub3Qgc2V0Ci0gICAgICogQHNlZSAjc2V0TWluaW11bUl0ZW1zVG9TaG93KGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1pbmltdW1JdGVtc1RvU2hvdygpIHsKLSAgICAgICAgaWYgKGNoZWNrRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtaW5pbXVtSXRlbXNUb1Nob3c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW50ZXJuYWwgdG9vbCBiYXIgbWFuYWdlciBvZiB0aGUgY29udHJpYnV0aW9uIGl0ZW0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdG9vbCBiYXIgbWFuYWdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgb25lIGlzIG5vdAotICAgICAqICAgICAgICAgZGVmaW5lZC4KLSAgICAgKiBAc2VlIElUb29sQmFyTWFuYWdlcgotICAgICAqLwotICAgIHB1YmxpYyBJVG9vbEJhck1hbmFnZXIgZ2V0VG9vbEJhck1hbmFnZXIoKSB7Ci0gICAgICAgIGlmIChjaGVja0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b29sQmFyTWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgY2hldnJvbiBzdXBwb3J0IGlzIGVuYWJsZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjaGV2cm9uIHN1cHBvcnQgaXMgZW5hYmxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VDaGV2cm9uKCkgewotICAgICAgICBpZiAoY2hlY2tEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVzZUNoZXZyb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuZCBkaXNwbGF5IHRoZSBjaGV2cm9uIG1lbnUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNoZXZyb24oU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgQ29vbEl0ZW0gaXRlbSA9IChDb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBpdGVtLmdldENvbnRyb2woKTsKLSAgICAgICAgaWYgKChjb250cm9sIGluc3RhbmNlb2YgVG9vbEJhcikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBDb29sQmFyIGNvb2xCYXIgPSBpdGVtLmdldFBhcmVudCgpOwotICAgICAgICBUb29sQmFyIHRvb2xCYXIgPSAoVG9vbEJhcikgY29udHJvbDsKLSAgICAgICAgUmVjdGFuZ2xlIHRvb2xCYXJCb3VuZHMgPSB0b29sQmFyLmdldEJvdW5kcygpOwotICAgICAgICBUb29sSXRlbVtdIGl0ZW1zID0gdG9vbEJhci5nZXRJdGVtcygpOwotICAgICAgICBBcnJheUxpc3QgaGlkZGVuID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgaXRlbUJvdW5kcyA9IGl0ZW1zW2ldLmdldEJvdW5kcygpOwotICAgICAgICAgICAgaWYgKCEoKGl0ZW1Cb3VuZHMueCArIGl0ZW1Cb3VuZHMud2lkdGggPD0gdG9vbEJhckJvdW5kcy53aWR0aCkgJiYgKGl0ZW1Cb3VuZHMueQotICAgICAgICAgICAgICAgICAgICArIGl0ZW1Cb3VuZHMuaGVpZ2h0IDw9IHRvb2xCYXJCb3VuZHMuaGVpZ2h0KSkpIHsKLSAgICAgICAgICAgICAgICBoaWRkZW4uYWRkKGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBhIHBvcC11cCBtZW51IHdpdGggaXRlbXMgZm9yIGVhY2ggb2YgdGhlIGhpZGRlbiBidXR0b25zLgotICAgICAgICBpZiAoY2hldnJvbk1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoZXZyb25NZW51TWFuYWdlci5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2hldnJvbk1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGhpZGRlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKSBpLm5leHQoKTsKLSAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGRhdGEgPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIHRvb2xJdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotICAgICAgICAgICAgICAgIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uID0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGRhdGEpLmdldEFjdGlvbigpKTsKLSAgICAgICAgICAgICAgICBjaGV2cm9uTWVudU1hbmFnZXIuYWRkKGNvbnRyaWJ1dGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7Ci0gICAgICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gaW5uZXJEYXRhID0gKChTdWJDb250cmlidXRpb25JdGVtKSBkYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldElubmVySXRlbSgpOwotICAgICAgICAgICAgICAgIGlmIChpbm5lckRhdGEgaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uID0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBY3Rpb25Db250cmlidXRpb25JdGVtKSBpbm5lckRhdGEpLmdldEFjdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgY2hldnJvbk1lbnVNYW5hZ2VyLmFkZChjb250cmlidXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5pc1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgY2hldnJvbk1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1lbnUgcG9wdXAgPSBjaGV2cm9uTWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoY29vbEJhcik7Ci0gICAgICAgIFBvaW50IGNoZXZyb25Qb3NpdGlvbiA9IGNvb2xCYXIudG9EaXNwbGF5KGV2ZW50LngsIGV2ZW50LnkpOwotICAgICAgICBwb3B1cC5zZXRMb2NhdGlvbihjaGV2cm9uUG9zaXRpb24ueCwgY2hldnJvblBvc2l0aW9uLnkpOwotICAgICAgICBwb3B1cC5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgdGhlIGV2ZW50IHdoZW4gdGhlIHRvb2JhciBpdGVtIGRvZXMgbm90IGhhdmUgaXRzIG93biBjb250ZXh0Ci0gICAgICogbWVudS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29udGV4dE1lbnUoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgVG9vbEJhciB0b29sQmFyID0gdG9vbEJhck1hbmFnZXIuZ2V0Q29udHJvbCgpOwotICAgICAgICAvLyBJZiBwYXJlbnQgaGFzIGEgbWVudSB0aGVuIHVzZSB0aGF0IG9uZQotICAgICAgICBNZW51IHBhcmVudE1lbnUgPSB0b29sQmFyLmdldFBhcmVudCgpLmdldE1lbnUoKTsKLSAgICAgICAgaWYgKChwYXJlbnRNZW51ICE9IG51bGwpICYmICghcGFyZW50TWVudS5pc0Rpc3Bvc2VkKCkpKSB7Ci0gICAgICAgICAgICB0b29sQmFyLnNldE1lbnUocGFyZW50TWVudSk7Ci0gICAgICAgICAgICAvLyBIb29rIGxpc3RlbmVyIHRvIHJlbW92ZSBtZW51IG9uY2UgaXQgaGFzIGRpc2FwZWFyZWQKLSAgICAgICAgICAgIHBhcmVudE1lbnUuYWRkTGlzdGVuZXIoU1dULkhpZGUsIG5ldyBMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGlubmVyRXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgVG9vbEJhciBpbm5lclRvb2xCYXIgPSB0b29sQmFyTWFuYWdlci5nZXRDb250cm9sKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lclRvb2xCYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUb29sQmFyLnNldE1lbnUobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZW51IGlubmVyUGFyZW50TWVudSA9IGlubmVyVG9vbEJhci5nZXRQYXJlbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVudSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyUGFyZW50TWVudSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJQYXJlbnRNZW51LnJlbW92ZUxpc3RlbmVyKFNXVC5IaWRlLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB0aGUgZGlzcG9zYWwgb2YgdGhlIHdpZGdldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlV2lkZ2V0RGlzcG9zZShEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgY29vbEl0ZW0gPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY29udHJpYnV0aW9uIGl0ZW0gaXMgdmlzaWJsZSBpZmYgaXRzIGludGVybmFsIHN0YXRlIGlzIHZpc2libGUgPGVtPm9yPC9lbT4KLSAgICAgKiB0aGUgdG9vbCBiYXIgbWFuYWdlciBjb250YWlucyBzb21ldGhpbmcgb3RoZXIgdGhhbiBncm91cCBtYXJrZXJzIGFuZAotICAgICAqIHNlcGFyYXRvcnMuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdG9vbCBiYXIgbWFuYWdlciBjb250YWlucyBzb21ldGhpbmcKLSAgICAgKiAgICAgICAgIG90aGVyIHRoYW4gZ3JvdXAgbWFya3MgYW5kIHNlcGFyYXRvcnMsIGFuZCB0aGUgaW50ZXJuYWwgc3RhdGUgaXMKLSAgICAgKiAgICAgICAgIHNldCB0byBiZSB2aXNpYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLSAgICAgICAgaWYgKGNoZWNrRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiB2aXNpYmxlSXRlbSA9IGZhbHNlOwotICAgICAgICBpZiAodG9vbEJhck1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjb250cmlidXRpb25JdGVtcyA9IHRvb2xCYXJNYW5hZ2VyLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJ1dGlvbkl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGNvbnRyaWJ1dGlvbkl0ZW1zW2ldOwotICAgICAgICAgICAgICAgIGlmICgoIWNvbnRyaWJ1dGlvbkl0ZW0uaXNHcm91cE1hcmtlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFjb250cmlidXRpb25JdGVtLmlzU2VwYXJhdG9yKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2libGVJdGVtID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICh2aXNpYmxlSXRlbSB8fCBzdXBlci5pc1Zpc2libGUoKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jc2F2ZVdpZGdldFN0YXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzYXZlV2lkZ2V0U3RhdGUoKSB7Ci0gICAgICAgIGlmIChjaGVja0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29vbEl0ZW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLzEuIFNhdmUgY3VycmVudCBzaXplCi0gICAgICAgIENvb2xCYXIgY29vbEJhciA9IGNvb2xJdGVtLmdldFBhcmVudCgpOwotICAgICAgICBib29sZWFuIGlzTGFzdE9uUm93ID0gZmFsc2U7Ci0gICAgICAgIGludCBsYXN0SW5kZXggPSBjb29sQmFyLmdldEl0ZW1Db3VudCgpIC0gMTsKLSAgICAgICAgaW50IGNvb2xJdGVtSW5kZXggPSBjb29sQmFyLmluZGV4T2YoY29vbEl0ZW0pOwotICAgICAgICBpbnRbXSB3cmFwSW5kaWNpZXMgPSBnZXRBZGp1c3RlZFdyYXBJbmRpY2VzKGNvb2xCYXIuZ2V0V3JhcEluZGljZXMoKSk7Ci0gICAgICAgIC8vIFRyYXZlcnNlIHRocm91Z2ggYWxsIHdyYXAgaW5kaWNpZXMgYmFja3dhcmRzCi0gICAgICAgIGZvciAoaW50IHJvdyA9IHdyYXBJbmRpY2llcy5sZW5ndGggLSAxOyByb3cgPj0gMDsgcm93LS0pIHsKLSAgICAgICAgICAgIGlmICh3cmFwSW5kaWNpZXNbcm93XSA8PSBjb29sSXRlbUluZGV4KSB7Ci0KLSAgICAgICAgICAgICAgICBpbnQgbmV4dFJvdyA9IHJvdyArIDE7Ci0gICAgICAgICAgICAgICAgaW50IG5leHRSb3dTdGFydEluZGV4OwotICAgICAgICAgICAgICAgIGlmIChuZXh0Um93ID4gKHdyYXBJbmRpY2llcy5sZW5ndGggLSAxKSkgewotICAgICAgICAgICAgICAgICAgICBuZXh0Um93U3RhcnRJbmRleCA9IGxhc3RJbmRleCArIDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dFJvd1N0YXJ0SW5kZXggPSB3cmFwSW5kaWNpZXNbbmV4dFJvd107Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGl0cyB0aGUgbGFzdCBpdGVtIG9uIHRoZSByb3cKLSAgICAgICAgICAgICAgICBpZiAoY29vbEl0ZW1JbmRleCA9PSAobmV4dFJvd1N0YXJ0SW5kZXggLSAxKSkgewotICAgICAgICAgICAgICAgICAgICBpc0xhc3RPblJvdyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2F2ZSB0aGUgcHJlZmVycmVkIHNpemUgYXMgYWN0dWFsIHNpemUgZm9yIHRoZSBsYXN0IGl0ZW0gb24gYSByb3cKLSAgICAgICAgaW50IG5DdXJyZW50V2lkdGg7Ci0gICAgICAgIGlmIChpc0xhc3RPblJvdykgewotICAgICAgICAgICAgbkN1cnJlbnRXaWR0aCA9IGNvb2xJdGVtLmdldFByZWZlcnJlZFNpemUoKS54OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbkN1cnJlbnRXaWR0aCA9IGNvb2xJdGVtLmdldFNpemUoKS54OwotICAgICAgICB9Ci0gICAgICAgIHNldEN1cnJlbnRXaWR0aChuQ3VycmVudFdpZHRoKTsKLSAgICAgICAgc2V0Q3VycmVudEhlaWdodChjb29sSXRlbS5nZXRTaXplKCkueSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIGNvb2wgaXRlbS4gVXBkYXRlKFNJWkUpIHNob3VsZCBiZSBjYWxsZWQKLSAgICAgKiB0byBhZGp1c3QgdGhlIHdpZGdldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3VycmVudEhlaWdodAotICAgICAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgaGVpZ2h0IHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRIZWlnaHQoaW50IGN1cnJlbnRIZWlnaHQpIHsKLSAgICAgICAgaWYgKGNoZWNrRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuY3VycmVudEhlaWdodCA9IGN1cnJlbnRIZWlnaHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgY29vbCBpdGVtLiBVcGRhdGUoU0laRSkgc2hvdWxkIGJlIGNhbGxlZAotICAgICAqIHRvIGFkanVzdCB0aGUgd2lkZ2V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjdXJyZW50V2lkdGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHdpZHRoIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRXaWR0aChpbnQgY3VycmVudFdpZHRoKSB7Ci0gICAgICAgIGlmIChjaGVja0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmN1cnJlbnRXaWR0aCA9IGN1cnJlbnRXaWR0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtaW5pbXVtIG51bWJlciBvZiB0b29sIGl0ZW1zIHRvIHNob3cgaW4gdGhlIGNvb2wgaXRlbS4gSWYgdGhpcwotICAgICAqIG51bWJlciBpcyBsZXNzIHRoYW4gdGhlIHRvdGFsIHRvb2wgaXRlbXMsIGEgY2hldnJvbiB3aWxsIGFwcGVhciBhbmQgdGhlCi0gICAgICogaGlkZGVuIHRvb2wgaXRlbXMgYXBwZWFyIGluIGEgZHJvcCBkb3duIG1lbnUuIEJ5IGRlZmF1bHQsIGFsbCB0aGUgdG9vbAotICAgICAqIGl0ZW1zIGFyZSBzaG93biBpbiB0aGUgY29vbCBpdGVtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtaW5pbXVtSXRlbXNUb1Nob3cKLSAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIG51bWJlciBvZiB0b29sIGl0ZW1zIHRvIHNob3cuCi0gICAgICogQHNlZSAjZ2V0TWluaW11bUl0ZW1zVG9TaG93KCkKLSAgICAgKiBAc2VlICNzZXRVc2VDaGV2cm9uKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWluaW11bUl0ZW1zVG9TaG93KGludCBtaW5pbXVtSXRlbXNUb1Nob3cpIHsKLSAgICAgICAgaWYgKGNoZWNrRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubWluaW11bUl0ZW1zVG9TaG93ID0gbWluaW11bUl0ZW1zVG9TaG93OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgY2hldnJvbiBzdXBwb3J0IGZvciB0aGUgY29vbCBpdGVtLiBCeSBkZWZhdWx0LAotICAgICAqIGNoZXZyb24gc3VwcG9ydCBpcyBlbmFibGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZW5hYmxlIGNoZXZyb24gc3VwcG9ydCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICAgICBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlQ2hldnJvbihib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmIChjaGVja0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB1c2VDaGV2cm9uID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jdXBkYXRlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgaWYgKGNoZWNrRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb29sSXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJVG9vbEJhck1hbmFnZXIgbWFuYWdlciA9IGdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgocHJvcGVydHlOYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSUNvb2xCYXJNYW5hZ2VyLlNJWkUpKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2l6ZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGNvb2wgaXRlbXMnIHByZWZlcnJlZCwgbWluaW11bSwgYW5kIGN1cnJlbnQgc2l6ZS4gVGhlCi0gICAgICogcHJlZmVycmVkIHNpemUgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgdG9vbCBiYXIgc2l6ZSBhbmQgZXh0cmEgdHJpbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhbmdlQ3VycmVudFNpemUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHNpemUgc2hvdWxkIGJlIGNoYW5nZWQgdG8KLSAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgc2l6ZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBjaGFuZ2UgdGhlCi0gICAgICogICAgICAgICAgICBjdXJyZW50IHNpemUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2l6ZShib29sZWFuIGNoYW5nZUN1cnJlbnRTaXplKSB7Ci0gICAgICAgIGlmIChjaGVja0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBjYW5ub3Qgc2V0IHNpemUgaWYgY29vbEl0ZW0gaXMgbnVsbAotICAgICAgICBpZiAoY29vbEl0ZW0gPT0gbnVsbCB8fCBjb29sSXRlbS5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIGxvY2tlZCA9IGZhbHNlOwotICAgICAgICBDb29sQmFyIGNvb2xCYXIgPSBjb29sSXRlbS5nZXRQYXJlbnQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEZpeCBvZGQgYmVoYXZpb3VyIHdpdGggbG9ja2VkIHRvb2wgYmFycwotICAgICAgICAgICAgaWYgKGNvb2xCYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjb29sQmFyLmdldExvY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvb2xCYXIuc2V0TG9ja2VkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUb29sQmFyIHRvb2xCYXIgPSAoVG9vbEJhcikgY29vbEl0ZW0uZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgaWYgKCh0b29sQmFyID09IG51bGwpIHx8ICh0b29sQmFyLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKHRvb2xCYXIuZ2V0SXRlbUNvdW50KCkgPD0gMCkpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdG9vbGJhciBkb2VzIG5vdCBjb250YWluIGFueSBpdGVtcyB0aGVuIGRpc3Bvc2Ugb2YKLSAgICAgICAgICAgICAgICAvLyBjb29sSXRlbQotICAgICAgICAgICAgICAgIGNvb2xJdGVtLnNldERhdGEobnVsbCk7Ci0gICAgICAgICAgICAgICAgQ29udHJvbCBjb250cm9sID0gY29vbEl0ZW0uZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgICAgIGlmICgoY29udHJvbCAhPSBudWxsKSAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvb2xJdGVtLnNldENvbnRyb2wobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghY29vbEl0ZW0uaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvb2xJdGVtLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0b29sYmFyIGl0ZW0gZXhpc3RzIHRoZW4gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb29sCi0gICAgICAgICAgICAgICAgLy8gaXRlbQotICAgICAgICAgICAgICAgIFBvaW50IHRvb2xCYXJTaXplID0gdG9vbEJhci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHByZWZmZXJlZCBzaXplIHRvIHRoZSBzaXplIG9mIHRoZSB0b29sYmFyIHBsdXMgdHJpbQotICAgICAgICAgICAgICAgIFBvaW50IHByZWZlcnJlZFNpemUgPSBjb29sSXRlbS5jb21wdXRlU2l6ZSh0b29sQmFyU2l6ZS54LAotICAgICAgICAgICAgICAgICAgICAgICAgdG9vbEJhclNpemUueSk7Ci0gICAgICAgICAgICAgICAgY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShwcmVmZXJyZWRTaXplKTsKLSAgICAgICAgICAgICAgICAvLyBub3RlIHNldE1pbmltdW1TaXplIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBzZXRTaXplLCBzZWUgUFIKLSAgICAgICAgICAgICAgICAvLyAxNTU2NQotICAgICAgICAgICAgICAgIC8vIFNldCBtaW5pbXVtIHNpemUKLSAgICAgICAgICAgICAgICBpZiAoZ2V0TWluaW11bUl0ZW1zVG9TaG93KCkgIT0gU0hPV19BTExfSVRFTVMpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHRvb2xJdGVtV2lkdGggPSB0b29sQmFyLmdldEl0ZW1zKClbMF0uZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1pbmltdW1XaWR0aCA9IHRvb2xJdGVtV2lkdGggKiBnZXRNaW5pbXVtSXRlbXNUb1Nob3coKTsKLSAgICAgICAgICAgICAgICAgICAgY29vbEl0ZW0uc2V0TWluaW11bVNpemUobWluaW11bVdpZHRoLCB0b29sQmFyU2l6ZS55KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb29sSXRlbS5zZXRNaW5pbXVtU2l6ZSh0b29sQmFyU2l6ZS54LCB0b29sQmFyU2l6ZS55KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNoYW5nZUN1cnJlbnRTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNldCBjdXJyZW50IHNpemUgdG8gcHJlZmVycmVkIHNpemUKLSAgICAgICAgICAgICAgICAgICAgY29vbEl0ZW0uc2V0U2l6ZShwcmVmZXJyZWRTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgY29vbCBiYXIgd2FzIGxvY2tlZCwgdGhlbiBzZXQgaXQgYmFjayB0byBsb2NrZWQKLSAgICAgICAgICAgIGlmICgobG9ja2VkKSAmJiAoY29vbEJhciAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIGNvb2xCYXIuc2V0TG9ja2VkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vVG9vbEJhck1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9Ub29sQmFyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM4MjdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9Ub29sQmFyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQUNDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIEEgdG9vbCBiYXIgbWFuYWdlciBpcyBhIGNvbnRyaWJ1dGlvbiBtYW5hZ2VyIHdoaWNoIHJlYWxpemVzIGl0c2VsZiBhbmQgaXRzCi0gKiBpdGVtcyBpbiBhIHRvb2wgYmFyIGNvbnRyb2wuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgbWF5IGFsc28gYmUgc3ViY2xhc3NlZCBpZiBhIG1vcmUKLSAqIHNvcGhpc3RpY2F0ZWQgbGF5b3V0IGlzIHJlcXVpcmVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVG9vbEJhck1hbmFnZXIgZXh0ZW5kcyBDb250cmlidXRpb25NYW5hZ2VyIGltcGxlbWVudHMKLQkJSVRvb2xCYXJNYW5hZ2VyIHsKLQotCS8qKgotCSAqIFRoZSB0b29sIGJhciBpdGVtcyBzdHlsZTsgPGNvZGU+U1dULk5PTkU8L2NvZGU+IGJ5IGRlZmF1bHQuCi0JICovCi0JcHJpdmF0ZSBpbnQgaXRlbVN0eWxlID0gU1dULk5PTkU7Ci0KLQkvKioKLQkgKiBUaGUgdG9vbCBiYXQgY29udHJvbDsgPGNvZGU+bnVsbDwvY29kZT4gYmVmb3JlIGNyZWF0aW9uIGFuZCBhZnRlcgotCSAqIGRpc3Bvc2FsLgotCSAqLwotCXByaXZhdGUgVG9vbEJhciB0b29sQmFyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBtZW51IG1hbmFnZXIgdG8gdGhlIGNvbnRleHQgbWVudSBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2xiYXIuCi0JICogCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXByaXZhdGUgTWVudU1hbmFnZXIgY29udGV4dE1lbnVNYW5hZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdG9vbCBiYXIgbWFuYWdlciB3aXRoIHRoZSBkZWZhdWx0IFNXVCBidXR0b24gc3R5bGUuIFVzZSB0aGUKLQkgKiA8Y29kZT5jcmVhdGVDb250cm9sPC9jb2RlPiBtZXRob2QgdG8gY3JlYXRlIHRoZSB0b29sIGJhciBjb250cm9sLgotCSAqLwotCXB1YmxpYyBUb29sQmFyTWFuYWdlcigpIHsKLQkJLy9EbyBub3RoaW5nIGlmIHRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRvb2wgYmFyIG1hbmFnZXIgd2l0aCB0aGUgZ2l2ZW4gU1dUIGJ1dHRvbiBzdHlsZS4gVXNlIHRoZQotCSAqIDxjb2RlPmNyZWF0ZUNvbnRyb2w8L2NvZGU+IG1ldGhvZCB0byBjcmVhdGUgdGhlIHRvb2wgYmFyIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgdG9vbCBiYXIgaXRlbSBzdHlsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhciBmb3IgdmFsaWQgc3R5bGUgYml0cwotCSAqLwotCXB1YmxpYyBUb29sQmFyTWFuYWdlcihpbnQgc3R5bGUpIHsKLQkJaXRlbVN0eWxlID0gc3R5bGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRvb2wgYmFyIG1hbmFnZXIgZm9yIGFuIGV4aXN0aW5nIHRvb2wgYmFyIGNvbnRyb2wuIFRoaXMgbWFuYWdlcgotCSAqIGJlY29tZXMgcmVzcG9uc2libGUgZm9yIHRoZSBjb250cm9sLCBhbmQgd2lsbCBkaXNwb3NlIG9mIGl0IHdoZW4gdGhlCi0JICogbWFuYWdlciBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGJhcgotCSAqICAgICAgICAgICAgdGhlIHRvb2wgYmFyIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgVG9vbEJhck1hbmFnZXIoVG9vbEJhciB0b29sYmFyKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy50b29sQmFyID0gdG9vbGJhcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoaXMgbWFuYWdlcidzIHRvb2wgYmFyIGNvbnRyb2wuIERvZXMgbm90IGNyZWF0ZSBhCi0JICogbmV3IGNvbnRyb2wgaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEByZXR1cm4gdGhlIHRvb2wgYmFyIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgVG9vbEJhciBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKCF0b29sQmFyRXhpc3QoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJdG9vbEJhciA9IG5ldyBUb29sQmFyKHBhcmVudCwgaXRlbVN0eWxlKTsKLQkJCXRvb2xCYXIuc2V0TWVudShnZXRDb250ZXh0TWVudUNvbnRyb2woKSk7Ci0JCQl1cGRhdGUoZmFsc2UpOwotCQkJCi0JCQl0b29sQmFyLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIoZ2V0QWNjZXNzaWJsZUxpc3RlbmVyKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHRvb2xCYXI7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBhY2Nlc3NpYmxlIGxpc3RlbmVyIGZvciB0aGUgdG9vbCBiYXIuCi0JICogCi0JICogQHJldHVybiBBY2Nlc3NpYmxlTGlzdGVuZXIKLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJpdmF0ZSBBY2Nlc3NpYmxlTGlzdGVuZXIgZ2V0QWNjZXNzaWJsZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCWlmIChlLmNoaWxkSUQgIT0gQUNDLkNISUxESURfU0VMRikgewotCQkJCQlUb29sSXRlbSBpdGVtID0gdG9vbEJhci5nZXRJdGVtKGUuY2hpbGRJRCk7Ci0JCQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyB0b29sVGlwID0gaXRlbS5nZXRUb29sVGlwVGV4dCgpOwotCQkJCQkJaWYgKHRvb2xUaXAgIT0gbnVsbCkgewotCQkJCQkJCWUucmVzdWx0ID0gdG9vbFRpcDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgdG9vbCBiYXIgbWFuYWdlciBhbmQgZnJlZXMgYWxsIGFsbG9jYXRlZCBTV1QgcmVzb3VyY2VzLgotCSAqIE5vdGlmaWVzIGFsbCBjb250cmlidXRpb24gaXRlbXMgb2YgdGhlIGRpc3Bvc2UuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZAotCSAqIGRvZXMgbm90IGNsZWFuIHVwIHJlZmVyZW5jZXMgYmV0d2VlbiB0aGlzIHRvb2wgYmFyIG1hbmFnZXIgYW5kIGl0cwotCSAqIGFzc29jaWF0ZWQgY29udHJpYnV0aW9uIGl0ZW1zLiBVc2UgPGNvZGU+cmVtb3ZlQWxsPC9jb2RlPiBmb3IgdGhhdAotCSAqIHB1cnBvc2UuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCQlpZiAodG9vbEJhckV4aXN0KCkpIHsKLQkJCXRvb2xCYXIuZGlzcG9zZSgpOwotCQl9Ci0JCXRvb2xCYXIgPSBudWxsOwotCi0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBnZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpdGVtc1tpXS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoZ2V0Q29udGV4dE1lbnVNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJZ2V0Q29udGV4dE1lbnVNYW5hZ2VyKCkuZGlzcG9zZSgpOwotCQkJc2V0Q29udGV4dE1lbnVNYW5hZ2VyKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9vbCBiYXIgY29udHJvbCBmb3IgdGhpcyBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvb2wgYmFyIGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgKGJlZm9yZQotCSAqICAgICAgICAgY3JlYXRpbmcgb3IgYWZ0ZXIgZGlzcG9zYWwpCi0JICovCi0JcHVibGljIFRvb2xCYXIgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHRvb2xCYXI7Ci0JfQotCi0JLyoqCi0JICogUmUtbGF5cyBvdXQgdGhlIHRvb2wgYmFyLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCByZS1sYXlzIG91dCB0aGUKLQkgKiBwYXJlbnQgd2hlbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGNyb3NzZXMgdGhlIHplcm8gdGhyZXNob2xkLiBTdWJjbGFzc2VzCi0JICogc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGVpciBvd24gcmUtbGF5b3V0IHN0cmF0ZWd5Ci0JICogCi0JICogQHBhcmFtIGxheW91dEJhcgotCSAqICAgICAgICAgICAgdGhlIHRvb2wgYmFyIGNvbnRyb2wKLQkgKiBAcGFyYW0gb2xkQ291bnQKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgbnVtYmVyIG9mIGl0ZW1zCi0JICogQHBhcmFtIG5ld0NvdW50Ci0JICogICAgICAgICAgICB0aGUgbmV3IG51bWJlciBvZiBpdGVtcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGF5b3V0KFRvb2xCYXIgbGF5b3V0QmFyLCBpbnQgb2xkQ291bnQsIGludCBuZXdDb3VudCkgewotCQlpZiAoKG9sZENvdW50ID09IDApICE9IChuZXdDb3VudCA9PSAwKSkKLQkJCWxheW91dEJhci5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRvb2wgYmFyIGNvbnRyb2wgaXMgY3JlYXRlZCBhbmQgbm90IGRpc3Bvc2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRyb2wgaXMgY3JlYXRlZCBhbmQgbm90IGRpc3Bvc2VkLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB0b29sQmFyRXhpc3QoKSB7Ci0JCXJldHVybiB0b29sQmFyICE9IG51bGwgJiYgIXRvb2xCYXIuaXNEaXNwb3NlZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRyaWJ1dGlvbk1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKGJvb2xlYW4gZm9yY2UpIHsKLQotCQkvLwlsb25nIHN0YXJ0VGltZT0gMDsKLQkJLy8JaWYgKERFQlVHKSB7Ci0JCS8vCQlkdW1wU3RhdGlzdGljcygpOwotCQkvLwkJc3RhcnRUaW1lPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOwotCQkvLwl9Ci0KLQkJaWYgKGlzRGlydHkoKSB8fCBmb3JjZSkgewotCi0JCQlpZiAodG9vbEJhckV4aXN0KCkpIHsKLQotCQkJCWludCBvbGRDb3VudCA9IHRvb2xCYXIuZ2V0SXRlbUNvdW50KCk7Ci0KLQkJCQkvLyBjbGVhbiBjb250YWlucyBhbGwgYWN0aXZlIGl0ZW1zIHdpdGhvdXQgZG91YmxlIHNlcGFyYXRvcnMKLQkJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gZ2V0SXRlbXMoKTsKLQkJCQlBcnJheUxpc3QgY2xlYW4gPSBuZXcgQXJyYXlMaXN0KGl0ZW1zLmxlbmd0aCk7Ci0JCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc2VwYXJhdG9yID0gbnVsbDsKLQkJCQkvLwkJCWxvbmcgY2xlYW5TdGFydFRpbWU9IDA7Ci0JCQkJLy8JCQlpZiAoREVCVUcpIHsKLQkJCQkvLwkJCQljbGVhblN0YXJ0VGltZT0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKLQkJCQkvLwkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0JCQkJCUlDb250cmlidXRpb25JdGVtIGNpID0gaXRlbXNbaV07Ci0JCQkJCWlmICghY2kuaXNWaXNpYmxlKCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKGNpLmlzU2VwYXJhdG9yKCkpIHsKLQkJCQkJCS8vIGRlbGF5IGNyZWF0aW9uIHVudGlsIG5lY2Vzc2FyeQotCQkJCQkJLy8gKGhhbmRsZXMgYm90aCBhZGphY2VudCBzZXBhcmF0b3JzLCBhbmQgc2VwYXJhdG9yIGF0Ci0JCQkJCQkvLyBlbmQpCi0JCQkJCQlzZXBhcmF0b3IgPSBjaTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChzZXBhcmF0b3IgIT0gbnVsbCkgewotCQkJCQkJCWlmIChjbGVhbi5zaXplKCkgPiAwKSAvLyBubyBzZXBhcmF0b3IgaWYgZmlyc3QgaXRlbQotCQkJCQkJCQljbGVhbi5hZGQoc2VwYXJhdG9yKTsKLQkJCQkJCQlzZXBhcmF0b3IgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJY2xlYW4uYWRkKGNpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLwkJCWlmIChERUJVRykgewotCQkJCS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIFRpbWUgbmVlZGVkIHRvIGJ1aWxkIGNsZWFuIHZlY3RvcjogIiArCi0JCQkJLy8gKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBjbGVhblN0YXJ0VGltZSkpOwotCQkJCS8vCQkJfQotCi0JCQkJLy8gZGV0ZXJtaW5lIG9ic29sZXRlIGl0ZW1zIChyZW1vdmVkIG9yIG5vbiBhY3RpdmUpCi0JCQkJVG9vbEl0ZW1bXSBtaSA9IHRvb2xCYXIuZ2V0SXRlbXMoKTsKLQkJCQlBcnJheUxpc3QgdG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KG1pLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaS5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgZGF0YSA9IG1pW2ldLmdldERhdGEoKTsKLQkJCQkJaWYgKGRhdGEgPT0gbnVsbAotCQkJCQkJCXx8ICFjbGVhbi5jb250YWlucyhkYXRhKQotCQkJCQkJCXx8IChkYXRhIGluc3RhbmNlb2YgSUNvbnRyaWJ1dGlvbkl0ZW0gJiYgKChJQ29udHJpYnV0aW9uSXRlbSkgZGF0YSkKLQkJCQkJCQkJCS5pc0R5bmFtaWMoKSkpIHsKLQkJCQkJCXRvUmVtb3ZlLmFkZChtaVtpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUdXJuIHJlZHJhdyBvZmYgaWYgdGhlIG51bWJlciBvZiBpdGVtcyB0byBiZSBhZGRlZAotCQkJCS8vIGlzIGFib3ZlIGEgY2VydGFpbiB0aHJlc2hvbGQsIHRvIG1pbmltaXplIGZsaWNrZXIsCi0JCQkJLy8gb3RoZXJ3aXNlIHRoZSB0b29sYmFyIGNhbiBiZSBzZWVuIHRvIHJlZHJhdyBhZnRlciBlYWNoIGl0ZW0uCi0JCQkJLy8gRG8gdGhpcyBiZWZvcmUgYW55IG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUuCi0JCQkJLy8gV2UgYXNzdW1lIGVhY2ggY29udHJpYnV0aW9uIGl0ZW0gd2lsbCBjb250cmlidXRlIGF0IGxlYXN0IG9uZQotCQkJCS8vIHRvb2xiYXIgaXRlbS4KLQkJCQlib29sZWFuIHVzZVJlZHJhdyA9IChjbGVhbi5zaXplKCkgLSAobWkubGVuZ3RoIC0gdG9SZW1vdmUKLQkJCQkJCS5zaXplKCkpKSA+PSAzOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VSZWRyYXcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xCYXIuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBvYnNvbGV0ZSBpdGVtcwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gdG9SZW1vdmUuc2l6ZSgpOyAtLWkgPj0gMDspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvb2xJdGVtIGl0ZW0gPSAoVG9vbEl0ZW0pIHRvUmVtb3ZlLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGN0cmwgPSBpdGVtLmdldENvbnRyb2woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3RybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q29udHJvbChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RybC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBpdGVtcwotICAgICAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBzcmMsIGRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgIG1pID0gdG9vbEJhci5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjSXggPSAwOwotICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdEl4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBlID0gY2xlYW4uaXRlcmF0b3IoKTsgZS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGUubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgY29ycmVzcG9uZGluZyBpdGVtIGluIFNXVCB3aWRnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNJeCA8IG1pLmxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKElDb250cmlidXRpb25JdGVtKSBtaVtzcmNJeF0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdCAhPSBudWxsICYmIHNyYy5lcXVhbHMoZGVzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJeCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RJeCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdCAhPSBudWxsICYmIGRlc3QuaXNTZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzcmMuaXNTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pW3NyY0l4XS5zZXREYXRhKHNyYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSXgrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0SXgrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gdG9vbEJhci5nZXRJdGVtQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5maWxsKHRvb2xCYXIsIGRlc3RJeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3SXRlbXMgPSB0b29sQmFyLmdldEl0ZW1Db3VudCgpIC0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld0l0ZW1zOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb29sSXRlbSBpdGVtID0gdG9vbEJhci5nZXRJdGVtKGRlc3RJeCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldERhdGEoc3JjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgb2xkIHRvb2wgaXRlbXMgbm90IGFjY291bnRlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1pLmxlbmd0aDsgLS1pID49IHNyY0l4OykgewotICAgICAgICAgICAgICAgICAgICAgICAgVG9vbEl0ZW0gaXRlbSA9IG1pW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY3RybCA9IGl0ZW0uZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRDb250cm9sKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZXREaXJ0eShmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdHVybiByZWRyYXcgYmFjayBvbiBpZiB3ZSB0dXJuZWQgaXQgb2ZmIGFib3ZlCi0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVJlZHJhdykgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9vbEJhci5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLQkJCQlpbnQgbmV3Q291bnQgPSB0b29sQmFyLmdldEl0ZW1Db3VudCgpOwotCQkJCXJlbGF5b3V0KHRvb2xCYXIsIG9sZENvdW50LCBuZXdDb3VudCk7Ci0JCQl9Ci0KLQkJfQotCi0JCS8vCWlmIChERUJVRykgewotCQkvLwkJU3lzdGVtLm91dC5wcmludGxuKCIgVGltZSBuZWVkZWQgZm9yIHVwZGF0ZTogIiArICgobmV3Ci0JCS8vIERhdGUoKSkuZ2V0VGltZSgpIC0gc3RhcnRUaW1lKSk7Ci0JCS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJLy8JfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRyb2wgb2YgdGhlIE1lbnUgTWFuYWdlci4gSWYgdGhlIG1lbnUgbWFuYWdlciBkb2VzIG5vdAotCSAqIGhhdmUgYSBjb250cm9sIHRoZW4gb25lIGlzIGNyZWF0ZWQuCi0JICogCi0JICogQHJldHVybiBtZW51IHdpZGdldCBhc3NvY2lhdGVkIHdpdGggbWFuYWdlcgotCSAqLwotCXByaXZhdGUgTWVudSBnZXRDb250ZXh0TWVudUNvbnRyb2woKSB7Ci0JCWlmICgoY29udGV4dE1lbnVNYW5hZ2VyICE9IG51bGwpICYmICh0b29sQmFyICE9IG51bGwpKSB7Ci0JCQlNZW51IG1lbnVXaWRnZXQgPSBjb250ZXh0TWVudU1hbmFnZXIuZ2V0TWVudSgpOwotCQkJaWYgKChtZW51V2lkZ2V0ID09IG51bGwpIHx8IChtZW51V2lkZ2V0LmlzRGlzcG9zZWQoKSkpIHsKLQkJCQltZW51V2lkZ2V0ID0gY29udGV4dE1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KHRvb2xCYXIpOwotCQkJfQotCQkJcmV0dXJuIG1lbnVXaWRnZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGV4dCBtZW51IG1hbmFnZXIgZm9yIHRoaXMgdG9vbCBiYXIgbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250ZXh0IG1lbnUgbWFuYWdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgTWVudU1hbmFnZXIgZ2V0Q29udGV4dE1lbnVNYW5hZ2VyKCkgewotCQlyZXR1cm4gY29udGV4dE1lbnVNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRleHQgbWVudSBtYW5hZ2VyIGZvciB0aGlzIHRvb2wgYmFyIG1hbmFnZXIgdG8gdGhlIGdpdmVuIG1lbnUKLQkgKiBtYW5hZ2VyLiBJZiB0aGUgdG9vbCBiYXIgY29udHJvbCBleGlzdHMsIGl0IGFsc28gYWRkcyB0aGUgbWVudSBjb250cm9sIHRvCi0JICogdGhlIHRvb2wgYmFyLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0TWVudU1hbmFnZXIKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IG1lbnUgbWFuYWdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0TWVudU1hbmFnZXIoTWVudU1hbmFnZXIgY29udGV4dE1lbnVNYW5hZ2VyKSB7Ci0JCXRoaXMuY29udGV4dE1lbnVNYW5hZ2VyID0gY29udGV4dE1lbnVNYW5hZ2VyOwotCQlpZiAodG9vbEJhciAhPSBudWxsKSB7Ci0JCQl0b29sQmFyLnNldE1lbnUoZ2V0Q29udGV4dE1lbnVDb250cm9sKCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vaW1hZ2VzL3N0b3AuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL2ltYWdlcy9zdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0N2VkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9hY3Rpb24vaW1hZ2VzL3N0b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2FjdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzU2YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYWN0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyBzdXBwb3J0IGZvciBzaGFyZWQgVUkgcmVzb3VyY2VzIHN1Y2ggYXMgbWVudXMsCi10b29sIGJhcnMsIGFuZCBzdGF0dXMgbGluZXMuCi08aDI+Ci1QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotQ29udHJpYnV0aW9uIG1hbmFnZXJzIGNvb3JkaW5hdGUgY29udHJpYnV0aW9ucyB0byBzaGFyZWQgVUkgcmVzb3VyY2VzIHN1Y2gKLWFzIG1lbnVzLCBtZW51IGJhcnMsIHRvb2wgYmFycywgYW5kIHN0YXR1cyBsaW5lcy4gPHR0PkNvbnRyaWJ1dGlvbk1hbmFnZXI8L3R0PgotbWFpbnRhaW5zIHRoZSBjb250cmlidXRpb25zIGFzIGEgZHluYW1pYyBsaXN0IG9mIGNvbnRyaWJ1dGlvbiBpdGVtcyAoPHR0PklDb250cmlidXRpb25JdGVtczwvdHQ+KS4KLVNlcGFyYXRvcnMgKDx0dD5TZXBhcmF0b3I8L3R0PikgY2FuIGJlIGluY2x1ZGVkIGluIGNvbnRyaWJ1dGlvbiBsaXN0cyB0bwotYnJlYWsgdXAgdGhlIGxpc3QncyB2aXN1YWwgcmVwcmVzZW50YXRpb24uIEludGVybmFsbHksIGNvbnRyaWJ1dGlvbiBsaXN0cwotY2FuIGJlIG9yZ2FuaXplZCBpbnRvIG5hbWVkIGdyb3VwcyB2aWEgc3BlY2lhbCBncm91cCBtYXJrZXJzICg8dHQ+R3JvdXBNYXJrZXI8L3R0PikKLXRvIGZhY2lsaXRhdGUgcHJvZ3JhbWF0aWMgaW5zZXJ0aW9uIGF0IHNwZWNpZmljIHBvc2l0aW9ucyB3aXRoaW4gdGhlIGxpc3QuCi08cD5UaHJlZSBzcGVjaWZpYyBjb250cmlidXRpb24gbWFuYWdlcnMgYXJlIHByb3ZpZGVkOiBhIHN0YXR1cyBsaW5lIG1hbmFnZXIKLSg8dHQ+U3RhdHVzTGluZU1hbmFnZXI8L3R0PiksIGEgdG9vbCBiYXIgbWFuYWdlciAoPHR0PlRvb2xCYXJNYW5hZ2VyPC90dD4pLAotYW5kIGEgaGllcmFyY2hpY2FsIG1lbnUgbWFuYWdlciAoPHR0Pk1lbnVNYW5hZ2VyPC90dD4pLgotPHA+QWN0aW9ucyAoPHR0PklBY3Rpb248L3R0PikgYXJlIGNvbW1hbmRzIHdoaWNoIGNhbiBiZSB0cmlnZ2VyZWQgZnJvbQotdGhlIFVJLCBsaWtlIHRoZSBvbmVzIGZvdW5kIGluIG1lbnVzLCB0b29sYmFycywgYW5kIGJ1dHRvbnMuIE1lbnVzIGFuZAotdG9vbHMgYmFycyBhcmUgdHlwaWNhbGx5IHBvcHVsYXRlZCB3aXRoIGNvbnRyaWJ1dGlvbiBpdGVtcyB0aGF0IGRlbGVnYXRlCi10byBhY3Rpb25zICg8dHQ+QWN0aW9uQ29udHJpYnV0aW9uSXRlbTwvdHQ+KS4KLTxwPk5vdGU6IE5vbmUgb2YgdGhlIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIG1haW50YWluIGdsb2JhbCBzdGF0ZS4KLTxicj4mbmJzcDsKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL0JpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL0JpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwOTdjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9CaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlV0aWw7Ci0KLS8qKgotICogPHA+Ci0gKiBBIGJpbmRpbmcgaXMgYSBsaW5rIGJldHdlZW4gdXNlciBpbnB1dCBhbmQgdGhlIHRyaWdnZXJpbmcgb2YgYSBwYXJ0aWN1bGFyCi0gKiBjb21tYW5kLiBUaGUgbW9zdCBjb21tb24gZXhhbXBsZSBvZiBhIGJpbmRpbmcgaXMgYSBrZXlib2FyZCBzaG9ydGN1dCwgYnV0Ci0gKiB0aGVyZSBhcmUgYWxzbyBtb3VzZSBhbmQgZ2VzdHVyZSBiaW5kaW5ncy4KLSAqIDwvcD4KLSAqIDxwPgotICogQmluZGluZ3MgYXJlIGxpbmtlZCB0byBwYXJ0aWN1bGFyIGNvbmRpdGlvbnMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbi4gU29tZSBvZgotICogdGhlc2UgY29uZGl0aW9ucyBjaGFuZ2UgaW5mcmVxdWVudGx5IChlLmcuLCBsb2NhbGUsIHNjaGVtZSksIHdoaWxlIHNvbWUgd2lsbAotICogdGVuZCB0byBjaGFuZ2UgcXVpdGUgZnJlcXVlbnRseSAoZS5nLiwgY29udGV4dCkuIFRoaXMgYWxsb3dzIHRoZSBiaW5kaW5ncyB0bwotICogYmUgdGFpbG9yZWQgdG8gcGFydGljdWxhciBzaXR1YXRpb25zLiBGb3IgZXhhbXBsZSwgYSBzZXQgb2YgYmluZGluZ3MgbWF5IGJlCi0gKiBhcHByb3ByaWF0ZSBvbmx5IGluc2lkZSBhIHRleHQgZWRpdG9yLiAgT3IsIHBlcmhhcHMsIGEgc2V0IG9mIGJpbmRpbmdzIG1pZ2h0Ci0gKiBiZSBhcHByb3ByaWF0ZSBvbmx5IGZvciBhIGdpdmVuIGxvY2FsZSwgc3VjaCBhcyBiaW5kaW5ncyB0aGF0IGNvZXhpc3Qgd2l0aAotICogdGhlIElucHV0IE1ldGhvZCBFZGl0b3IgKElNRSkgb24gQ2hpbmVzZSBsb2NhbGVzLgotICogPC9wPgotICogPHA+Ci0gKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlbW92ZSBhIHBhcnRpY3VsYXIgYmluZGluZy4gVGhpcyBpcyB0eXBpY2FsbHkgZG9uZSBhcwotICogcGFydCBvZiB1c2VyIGNvbmZpZ3VyYXRpb24gKGUuZy4sIHVzZXIgY2hhbmdpbmcga2V5Ym9hcmQgc2hvcnRjdXRzKS4gSG93ZXZlciwKLSAqIGl0IGNhbiBhbHNvIGJlIGhlbHBmdWwgd2hlbiB0cnlpbmcgdG8gY2hhbmdlIGEgYmluZGluZyBvbiBhIHBhcnRpY3VsYXIgbG9jYWxlCi0gKiBvciBwbGF0Zm9ybS4gQW4gInVuYmluZGluZyIgaXMgcmVhbGx5IGp1c3QgYSBiaW5kaW5nIHdpdGggbm8gY29tbWFuZAotICogaWRlbnRpZmllci4gRm9yIGl0IHRvIHVuYmluZCBhIHBhcnRpY3VsYXIgYmluZGluZywgaXQgbXVzdCBtYXRjaCB0aGF0IGJpbmRpbmcKLSAqIGluIGl0cyBjb250ZXh0IGlkZW50aWZpZXIgYW5kIHNjaGVtZSBpZGVudGlmaWVyLiBTdWJjbGFzc2VzIChlLmcuLAotICogPGNvZGU+S2V5QmluZGluZzwvY29kZT4pIG1heSByZXF1aXJlIG90aGVyIHByb3BlcnRpZXMgdG8gbWF0Y2ggKGUuZy4sCi0gKiA8Y29kZT5rZXlTZXF1ZW5jZTwvY29kZT4pLiBJZiB0aGVzZSBwcm9wZXJ0aWVzIG1hdGNoLCB0aGVuIHRoaXMgaXMgYW4KLSAqIHVuYmluZGluZy4gTm90ZTogdGhlIGxvY2FsZSBhbmQgcGxhdGZvcm0gY2FuIGJlIGRpZmZlcmVudC4KLSAqIDwvcD4KLSAqIDxwPgotICogRm9yIGV4YW1wbGUsIGltYWdpbmUgeW91IGhhdmUgYSBrZXkgYmluZGluZyB0aGF0IGxvb2tzIGxpa2UgdGhpczoKLSAqIDwvcD4KLSAqIDxjb2RlPjxwcmU+Ci0gKiBLZXlCaW5kaW5nKGNvbW1hbmQsIHNjaGVtZSwgY29udGV4dCwgJnF1b3Q7Q3RybCtTaGlmdCtGJnF1b3Q7KQotICogPC9wcmU+PC9jb2RlPgotICogPHA+Ci0gKiBPbiBHVEsrLCB0aGUgIkN0cmwrU2hpZnQrRiIgaW50ZXJmZXJlcyB3aXRoIHNvbWUgbmF0aXZlIGJlaGF2aW91ci4gVG8gY2hhbmdlCi0gKiB0aGUgYmluZGluZywgd2UgZmlyc3QgdW5iaW5kIHRoZSAiQ3RybCtTaGlmdCtGIiBrZXkgc2VxdWVuY2UgYnkgCi0gKiBhc3NpZ25pbmcgaXQgYSBudWxsIGNvbW1hbmQgb24gdGhlIGd0ayBwbGF0Zm9ybS4gIFdlIHRoZW4gY3JlYXRlIGEgbmV3IGJpbmRpbmcKLSAqIHRoYXQgbWFwcyB0aGUgY29tbWFuZCB0byB0aGUgIkVzYyBDdHJsK0YiIGtleSBzZXF1ZW5jZS4KLSAqIDwvcD4KLSAqIDxjb2RlPjxwcmU+Ci0gKiAgICAgS2V5QmluZGluZygiQ3RybCtTaGlmdCtGIixudWxsLHNjaGVtZSxjb250ZXh0LG51bGwsZ3RrLG51bGwsU1lTVEVNKQotICogICAgIEtleUJpbmRpbmcoIkVzYyBDdHJsK0YiLHBhcmFtZXRlcml6ZWRDb21tYW5kLHNjaGVtZSxjb250ZXh0LG51bGwsZ3RrLFNZU1RFTSkKLSAqIDwvcHJlPjwvY29kZT4KLSAqIDxwPgotICogQmluZGluZ3MgYXJlIGludGVuZGVkIHRvIGJlIGltbXV0YWJsZSBvYmplY3RzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCaW5kaW5nIHsKLQotCS8qKgotCSAqIFRoZSBjb25zdGFudCBpbnRlZ2VyIGhhc2ggY29kZSB2YWx1ZSBtZWFuaW5nIHRoZSBoYXNoIGNvZGUgaGFzIG5vdCB5ZXQKLQkgKiBiZWVuIGNvbXB1dGVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0NPREVfTk9UX0NPTVBVVEVEID0gLTE7Ci0KLQkvKioKLQkgKiBBIGZhY3RvciBmb3IgY29tcHV0aW5nIHRoZSBoYXNoIGNvZGUgZm9yIGFsbCBrZXkgYmluZGluZ3MuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEhBU0hfRkFDVE9SID0gODk7Ci0KLQkvKioKLQkgKiBUaGUgc2VlZCBmb3IgdGhlIGhhc2ggY29kZSBmb3IgYWxsIGtleSBiaW5kaW5ncy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSEFTSF9JTklUSUFMID0gQmluZGluZy5jbGFzcy5nZXROYW1lKCkuaGFzaENvZGUoKTsKLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIGJpbmRpbmcgdGhhdCBpcyBkZWZpbmVkIGJ5IHRoZSBzeXN0ZW0gKGkuZS4sIGJ5IHRoZQotCSAqIGFwcGxpY2F0aW9uIGRldmVsb3BlcikuIEluIHRoZSBjYXNlIG9mIGFuIGFwcGxpY2F0aW9uIGJhc2VkIG9uIHRoZQotCSAqIEVjbGlwc2Ugd29ya2JlbmNoLCB0aGlzIGlzIHRoZSByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWVNURU0gPSAwOwotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgYmluZGluZyB0aGF0IGlzIGRlZmluZWQgYnkgdGhlIHVzZXIgKGkuZS4sIGJ5IHRoZSBlbmQgdXNlciBvZgotCSAqIHRoZSBhcHBsaWNhdGlvbikuIEluIHRoZSBjYXNlIG9mIGFuIGFwcGxpY2F0aW9uIGJhc2VkIG9uIHRoZSBFY2xpcHNlCi0JICogd29ya2JlbmNoLCB0aGlzIGlzIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVIgPSAxOwotCi0JLyoqCi0JICogVGhlIHBhcmFtZXRlcml6ZWQgY29tbWFuZCB0byB3aGljaCB0aGlzIGJpbmRpbmcgYXBwbGllcy4gVGhpcyB2YWx1ZSBtYXkKLQkgKiBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGJpbmRpbmcgaXMgbWVhbnQgdG8gInVuYmluZCIgYW4gZXhpc3RpbmcKLQkgKiBiaW5kaW5nLgotCSAqLwotCXByaXZhdGUgZmluYWwgUGFyYW1ldGVyaXplZENvbW1hbmQgY29tbWFuZDsKLQotCS8qKgotCSAqIFRoZSBjb250ZXh0IGlkZW50aWZpZXIgdG8gd2hpY2ggdGhpcyBiaW5kaW5nIGFwcGxpZXMuIFRoaXMgY29udGV4dCBtdXN0Ci0JICogYmUgYWN0aXZlIGJlZm9yZSB0aGlzIGtleSBiaW5kaW5nIGJlY29tZXMgYWN0aXZlLiBUaGlzIHZhbHVlIHdpbGwgbmV2ZXIKLQkgKiBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBjb250ZXh0SWQ7Ci0KLQkvKioKLQkgKiBUaGUgaGFzaCBjb2RlIGZvciB0aGlzIGtleSBiaW5kaW5nLiBUaGlzIHZhbHVlIGlzIGNvbXB1dGVkIGxhemlseSwgYW5kCi0JICogbWFya2VkIGFzIGludmFsaWQgd2hlbiBvbmUgb2YgdGhlIHZhbHVlcyBvbiB3aGljaCBpdCBpcyBiYXNlZCBjaGFuZ2VzLgotCSAqLwotCXByaXZhdGUgdHJhbnNpZW50IGludCBoYXNoQ29kZSA9IEhBU0hfQ09ERV9OT1RfQ09NUFVURUQ7Ci0KLQkvKioKLQkgKiBUaGUgbG9jYWxlIGluIHdoaWNoIHRoaXMgYmluZGluZyBhcHBsaWVzLiBUaGlzIHZhbHVlIG1heSBiZQotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgYmluZGluZyBpcyBtZWFudCB0byBhcHBseSB0byBhbGwgbG9jYWxlcy4KLQkgKiBUaGlzIHN0cmluZyBzaG91bGQgYmUgaW4gdGhlIHNhbWUgZm9ybWF0IHJldHVybmVkIGJ5Ci0JICogPGNvZGU+TG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsb2NhbGU7Ci0KLQkvKioKLQkgKiBUaGUgcGxhdGZvcm0gb24gd2hpY2ggdGhpcyBiaW5kaW5nIGFwcGxpZXMuIFRoaXMgdmFsdWUgbWF5IGJlCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBiaW5kaW5nIGlzIG1lYW50IHRvIGFwcGx5IHRvIGFsbCBwbGF0Zm9ybXMuCi0JICogVGhpcyBzdHJpbmcgc2hvdWxkIGJlIGluIHRoZSBzYW1lIGZvcm1hdCByZXR1cm5lZCBieQotCSAqIDxjb2RlPlNXVC5nZXRQbGF0Zm9ybTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGxhdGZvcm07Ci0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2NoZW1lIGluIHdoaWNoIHRoaXMgYmluZGluZyBhcHBsaWVzLiBUaGlzIHZhbHVlCi0JICogd2lsbCBuZXZlciBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzY2hlbWVJZDsKLQotCS8qKgotCSAqIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBiaW5kaW5nLiBUaGlzIHN0cmluZyBpcyBmb3IgZGVidWdnaW5nCi0JICogcHVycG9zZXMgb25seSwgYW5kIGlzIG5vdCBtZWFudCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIFRoaXMgdmFsdWUKLQkgKiBpcyBjb21wdXRlZCBsYXppbHkuCi0JICovCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIGJpbmRpbmcgdGhpcyByZXByZXNlbnRzLiBUaGlzIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgotCSAqIGRpZmZlcmVudCBwcmlvcml0eSBsZXZlbHMgZm9yIGJpbmRpbmdzLiBGb3IgZXhhbXBsZSwgaW4gb3VyIGNhc2UsCi0JICogPGNvZGU+VVNFUjwvY29kZT4gYmluZGluZ3Mgb3ZlcnJpZGUgPGNvZGU+U1lTVEVNPC9jb2RlPiBiaW5kaW5ncy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB0eXBlOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5CaW5kaW5nPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcml6ZWQgY29tbWFuZCB0byB3aGljaCB0aGlzIGJpbmRpbmcgYXBwbGllczsgdGhpcwotCSAqICAgICAgICAgICAgdmFsdWUgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGlzIG1lYW50IHRvCi0JICogICAgICAgICAgICAidW5iaW5kIiBhIHByZXZpb3VzbHkgZGVmaW5lZCBiaW5kaW5nLgotCSAqIEBwYXJhbSBzY2hlbWVJZAotCSAqICAgICAgICAgICAgVGhlIHNjaGVtZSB0byB3aGljaCB0aGlzIGJpbmRpbmcgYmVsb25nczsgdGhpcyB2YWx1ZSBtdXN0IG5vdAotCSAqICAgICAgICAgICAgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGNvbnRleHRJZAotCSAqICAgICAgICAgICAgVGhlIGNvbnRleHQgdG8gd2hpY2ggdGhpcyBiaW5kaW5nIGFwcGxpZXM7IHRoaXMgdmFsdWUgbXVzdCBub3QKLQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBsb2NhbGUKLQkgKiAgICAgICAgICAgIFRoZSBsb2NhbGUgdG8gd2hpY2ggdGhpcyBiaW5kaW5nIGFwcGxpZXM7IHRoaXMgdmFsdWUgbWF5IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBhcHBsaWVzIHRvIGFsbCBsb2NhbGVzLgotCSAqIEBwYXJhbSBwbGF0Zm9ybQotCSAqICAgICAgICAgICAgVGhlIHBsYXRmb3JtIHRvIHdoaWNoIHRoaXMgYmluZGluZyBhcHBsaWVzOyB0aGlzIHZhbHVlIG1heSBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgYXBwbGllcyB0byBhbGwgcGxhdGZvcm1zLgotCSAqIEBwYXJhbSB3aW5kb3dNYW5hZ2VyCi0JICogICAgICAgICAgICBUaGUgd2luZG93IG1hbmFnZXIgdG8gd2hpY2ggdGhpcyBiaW5kaW5nIGFwcGxpZXM7IHRoaXMgdmFsdWUKLQkgKiAgICAgICAgICAgIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBhcHBsaWVzIHRvIGFsbCB3aW5kb3cKLQkgKiAgICAgICAgICAgIG1hbmFnZXJzLiBUaGlzIHZhbHVlIGlzIGN1cnJlbnRseSBpZ25vcmVkLgotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBUaGUgdHlwZSBvZiBiaW5kaW5nLiBUaGlzIHNob3VsZCBiZSBlaXRoZXIgPGNvZGU+U1lTVEVNPC9jb2RlPgotCSAqICAgICAgICAgICAgb3IgPGNvZGU+VVNFUjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIEJpbmRpbmcoZmluYWwgUGFyYW1ldGVyaXplZENvbW1hbmQgY29tbWFuZCwKLQkJCWZpbmFsIFN0cmluZyBzY2hlbWVJZCwgZmluYWwgU3RyaW5nIGNvbnRleHRJZCwgZmluYWwgU3RyaW5nIGxvY2FsZSwKLQkJCWZpbmFsIFN0cmluZyBwbGF0Zm9ybSwgZmluYWwgU3RyaW5nIHdpbmRvd01hbmFnZXIsIGZpbmFsIGludCB0eXBlKSB7Ci0JCWlmIChzY2hlbWVJZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBzY2hlbWUgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGNvbnRleHRJZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBjb250ZXh0IGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmICgodHlwZSAhPSBTWVNURU0pICYmICh0eXBlICE9IFVTRVIpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhlIHR5cGUgbXVzdCBiZSBTWVNURU0gb3IgVVNFUiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCQl0aGlzLnNjaGVtZUlkID0gc2NoZW1lSWQuaW50ZXJuKCk7Ci0JCXRoaXMuY29udGV4dElkID0gY29udGV4dElkLmludGVybigpOwotCQl0aGlzLmxvY2FsZSA9IChsb2NhbGUgPT0gbnVsbCkgPyBudWxsIDogbG9jYWxlLmludGVybigpOwotCQl0aGlzLnBsYXRmb3JtID0gKHBsYXRmb3JtID09IG51bGwpID8gbnVsbCA6IHBsYXRmb3JtLmludGVybigpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhpcyBiaW5kaW5nIGlzIGludGVuZGVkIHRvIGRlbGV0ZSBhbm90aGVyIGJpbmRpbmcuIFRoZQotCSAqIHJlY2VpdmVyIG11c3QgaGF2ZSBhIDxjb2RlPm51bGw8L2NvZGU+IGNvbW1hbmQgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gYmluZGluZwotCSAqICAgICAgICAgICAgVGhlIGJpbmRpbmcgdG8gdGVzdDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogICAgICAgICAgICBUaGlzIGJpbmRpbmcgbXVzdCBiZSBhIDxjb2RlPlNZU1RFTTwvY29kZT4gYmluZGluZy4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWNlaXZlciBkZWxldGVzIHRoZSBiaW5kaW5nIGRlZmluZWQgYnkKLQkgKiAJCQl0aGUgYXJndW1lbnQuCi0JICovCi0JZmluYWwgYm9vbGVhbiBkZWxldGVzKGZpbmFsIEJpbmRpbmcgYmluZGluZykgewotCQlib29sZWFuIGRlbGV0ZXMgPSB0cnVlOwotCQlkZWxldGVzICY9IFV0aWwuZXF1YWxzKGdldENvbnRleHRJZCgpLCBiaW5kaW5nLmdldENvbnRleHRJZCgpKTsKLQkJZGVsZXRlcyAmPSBVdGlsLmVxdWFscyhnZXRUcmlnZ2VyU2VxdWVuY2UoKSwgYmluZGluZwotCQkJCS5nZXRUcmlnZ2VyU2VxdWVuY2UoKSk7Ci0JCWlmIChnZXRMb2NhbGUoKSAhPSBudWxsKSB7Ci0JCQlkZWxldGVzICY9ICFVdGlsLmVxdWFscyhnZXRMb2NhbGUoKSwgYmluZGluZy5nZXRMb2NhbGUoKSk7Ci0JCX0KLQkJaWYgKGdldFBsYXRmb3JtKCkgIT0gbnVsbCkgewotCQkJZGVsZXRlcyAmPSAhVXRpbC5lcXVhbHMoZ2V0UGxhdGZvcm0oKSwgYmluZGluZy5nZXRQbGF0Zm9ybSgpKTsKLQkJfQotCQlkZWxldGVzICY9IChiaW5kaW5nLmdldFR5cGUoKSA9PSBTWVNURU0pOwotCQlkZWxldGVzICY9IFV0aWwuZXF1YWxzKGdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCksIG51bGwpOwotCi0JCXJldHVybiBkZWxldGVzOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhpcyBiaW5kaW5nIGlzIGVxdWFsIHRvIGFub3RoZXIgb2JqZWN0LiBCaW5kaW5ncyBhcmUgb25seQotCSAqIGVxdWFsIHRvIG90aGVyIGJpbmRpbmdzIHdpdGggZXF1aXZhbGVudCB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCB3aXRoIHdoaWNoIHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgYSBiaW5kaW5nIHdpdGggZXF1aXZhbGVudAotCSAqICAgICAgICAgdmFsdWVzIGZvciBhbGwgb2YgaXRzIHByb3BlcnRpZXM7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHRoaXMgPT0gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQotCQl9Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmcpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgb2JqZWN0OwotCQlpZiAoIVV0aWwuZXF1YWxzKGdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCksIGJpbmRpbmcKLQkJCQkuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIVV0aWwuZXF1YWxzKGdldENvbnRleHRJZCgpLCBiaW5kaW5nLmdldENvbnRleHRJZCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghVXRpbC5lcXVhbHMoZ2V0VHJpZ2dlclNlcXVlbmNlKCksIGJpbmRpbmcuZ2V0VHJpZ2dlclNlcXVlbmNlKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFVdGlsLmVxdWFscyhnZXRMb2NhbGUoKSwgYmluZGluZy5nZXRMb2NhbGUoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIVV0aWwuZXF1YWxzKGdldFBsYXRmb3JtKCksIGJpbmRpbmcuZ2V0UGxhdGZvcm0oKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIVV0aWwuZXF1YWxzKGdldFNjaGVtZUlkKCksIGJpbmRpbmcuZ2V0U2NoZW1lSWQoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gKGdldFR5cGUoKSAhPSBiaW5kaW5nLmdldFR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyYW1ldGVyaXplZCBjb21tYW5kIHRvIHdoaWNoIHRoaXMgYmluZGluZyBhcHBsaWVzLiBJZiB0aGUKLQkgKiBpZGVudGlmaWVyIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoaXMgYmluZGluZyBpcyAidW5iaW5kaW5nIiBhbgotCSAqIGV4aXN0aW5nIGJpbmRpbmcuCi0JICogCi0JICogQHJldHVybiBUaGUgZnVsbHktcGFyYW1ldGVyaXplZCBjb21tYW5kOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIFBhcmFtZXRlcml6ZWRDb21tYW5kIGdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCkgewotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoaXMgYmluZGluZyBhcHBsaWVzLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbnRleHQgaWRlbnRpZmllcjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRDb250ZXh0SWQoKSB7Ci0JCXJldHVybiBjb250ZXh0SWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxlIGluIHdoaWNoIHRoaXMgYmluZGluZyBhcHBsaWVzLiBJZiB0aGUgbG9jYWxlIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhpcyBiaW5kaW5nIGFwcGxpZXMgdG8gYWxsIGxvY2FsZXMuIFRoaXMKLQkgKiBzdHJpbmcgaXMgdGhlIHNhbWUgZm9ybWF0IGFzIHJldHVybmVkIGJ5Ci0JICogPGNvZGU+TG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldExvY2FsZSgpIHsKLQkJcmV0dXJuIGxvY2FsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybSBvbiB3aGljaCB0aGlzIGJpbmRpbmcgYXBwbGllcy4gSWYgdGhlIHBsYXRmb3JtIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhpcyBiaW5kaW5nIGFwcGxpZXMgdG8gYWxsIHBsYXRmb3Jtcy4gVGhpcwotCSAqIHN0cmluZyBpcyB0aGUgc2FtZSBmb3JtYXQgYXMgcmV0dXJuZWQgYnkgPGNvZGU+U1dULmdldFBsYXRmb3JtKCk8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHBsYXRmb3JtOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHBsYXRmb3JtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHNjaGVtZSBpbiB3aGljaCB0aGlzIGJpbmRpbmcgYXBwbGllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzY2hlbWUgaWRlbnRpZmllcjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRTY2hlbWVJZCgpIHsKLQkJcmV0dXJuIHNjaGVtZUlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcXVlbmNlIG9mIHRyaWdnZXIgZm9yIGEgZ2l2ZW4gYmluZGluZy4gVGhlIHRyaWdnZXJzIGNhbiBiZQotCSAqIGFueXRoaW5nLCBidXQgYWJvdmUgYWxsIGl0IG11c3QgYmUgaGFzaGFibGUuIFRoaXMgdHJpZ2dlciBzZXF1ZW5jZSBpcwotCSAqIHVzZWQgYnkgdGhlIGJpbmRpbmcgbWFuYWdlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRpZmZlcmVudCBiaW5kaW5ncy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGlucHV0IGV2ZW50IHRoYXQgd2lsbCB0cmlnZ2VyIHRoaXMKLQkgKiAgICAgICAgIGJpbmRpbmc7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBUcmlnZ2VyU2VxdWVuY2UgZ2V0VHJpZ2dlclNlcXVlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIGZvciB0aGlzIGJpbmRpbmcuIEFzIGl0IHN0YW5kcyBub3csIHRoaXMgdmFsdWUgd2lsbAotCSAqIGVpdGhlciBiZSA8Y29kZT5TWVNURU08L2NvZGU+IG9yIDxjb2RlPlVTRVI8L2NvZGU+LiBJbiB0aGUgZnV0dXJlLAotCSAqIG1vcmUgdHlwZXMgbWlnaHQgYmUgYWRkZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgdHlwZSBmb3IgdGhpcyBiaW5kaW5nLgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBrZXkgYmluZGluZyBiYXNlZCBvbiBhbGwgb2YgaXRzCi0JICogYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBoYXNoIGNvZGUgZm9yIHRoaXMga2V5IGJpbmRpbmcuCi0JICovCi0JcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKGhhc2hDb2RlID09IEhBU0hfQ09ERV9OT1RfQ09NUFVURUQpIHsKLQkJCWhhc2hDb2RlID0gSEFTSF9JTklUSUFMOwotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIEhBU0hfRkFDVE9SCi0JCQkJCSsgVXRpbC5oYXNoQ29kZShnZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpKTsKLQkJCWhhc2hDb2RlID0gaGFzaENvZGUgKiBIQVNIX0ZBQ1RPUiArIFV0aWwuaGFzaENvZGUoZ2V0Q29udGV4dElkKCkpOwotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIEhBU0hfRkFDVE9SCi0JCQkJCSsgVXRpbC5oYXNoQ29kZShnZXRUcmlnZ2VyU2VxdWVuY2UoKSk7Ci0JCQloYXNoQ29kZSA9IGhhc2hDb2RlICogSEFTSF9GQUNUT1IgKyBVdGlsLmhhc2hDb2RlKGdldExvY2FsZSgpKTsKLQkJCWhhc2hDb2RlID0gaGFzaENvZGUgKiBIQVNIX0ZBQ1RPUiArIFV0aWwuaGFzaENvZGUoZ2V0UGxhdGZvcm0oKSk7Ci0JCQloYXNoQ29kZSA9IGhhc2hDb2RlICogSEFTSF9GQUNUT1IgKyBVdGlsLmhhc2hDb2RlKGdldFNjaGVtZUlkKCkpOwotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIEhBU0hfRkFDVE9SICsgVXRpbC5oYXNoQ29kZShnZXRUeXBlKCkpOwotCQkJaWYgKGhhc2hDb2RlID09IEhBU0hfQ09ERV9OT1RfQ09NUFVURUQpIHsKLQkJCQloYXNoQ29kZSsrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGhhc2hDb2RlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBiaW5kaW5nIC0tIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KLQkgKiBUaGlzIHN0cmluZyBzaG91bGQgbm90IGJlIHNob3duIHRvIGFuIGVuZCB1c2VyLiBUaGlzIHNob3VsZCBiZSBvdmVycmlkZGVuCi0JICogYnkgc3ViY2xhc3NlcyB0aGF0IGFkZCBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQlmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgiQmluZGluZygiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChnZXRUcmlnZ2VyU2VxdWVuY2UoKSk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGNvbW1hbmQpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnLCcpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChzY2hlbWVJZCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGNvbnRleHRJZCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGxvY2FsZSk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHBsYXRmb3JtKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJywnKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoKHR5cGUgPT0gU1lTVEVNKSA/ICJzeXN0ZW0iIDogInVzZXIiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJyknKTsKLQkJCXN0cmluZyA9IHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9CaW5kaW5nTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3MvQmluZGluZ01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJhYjA3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9CaW5kaW5nTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Db21tYW5kTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkhhbmRsZU9iamVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uTm90RGVmaW5lZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbnRleHRzLkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0cy5Db250ZXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbnRleHRzLkNvbnRleHRNYW5hZ2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0cy5JQ29udGV4dE1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLnV0aWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLklLZXlMb29rdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlMb29rdXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmNvbnRleHRzLklDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi0vKioKLSAqIDxwPgotICogQSBjZW50cmFsIHJlcG9zaXRvcnkgZm9yIGJpbmRpbmdzIC0tIGJvdGggaW4gdGhlIGRlZmluZWQgYW5kIHVuZGVmaW5lZAotICogc3RhdGVzLiBTY2hlbWVzIGFuZCBiaW5kaW5ncyBjYW4gYmUgY3JlYXRlZCBhbmQgcmV0cmlldmVkIHVzaW5nIHRoaXMgbWFuYWdlci4KLSAqIEl0IGlzIHBvc3NpYmxlIHRvIGxpc3RlbiB0byBjaGFuZ2VzIGluIHRoZSBjb2xsZWN0aW9uIG9mIHNjaGVtZXMgYW5kIGJpbmRpbmdzCi0gKiBieSBhZGRpbmcgYSBsaXN0ZW5lciB0byB0aGUgbWFuYWdlci4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGJpbmRpbmcgbWFuYWdlciBpcyB2ZXJ5IHNlbnNpdGl2ZSB0byBwZXJmb3JtYW5jZS4gTWlzdXNpbmcgdGhlIG1hbmFnZXIKLSAqIGNhbiByZW5kZXIgYW4gYXBwbGljYXRpb24gdW5lbmpveWFibGUgdG8gdXNlLiBBcyBzdWNoLCBlYWNoIG9mIHRoZSBwdWJsaWMKLSAqIG1ldGhvZHMgc3RhdGVzIHRoZSBjdXJyZW50IHJ1bi10aW1lIHBlcmZvcm1hbmNlLiBJbiBmdXR1cmUgcmVsZWFzZXMsIGl0IGlzCi0gKiBndWFyYW50ZWVkIHRoYXQgdGhlIG1ldGhvZCB3aWxsIHJ1biBpbiBhdCBsZWFzdCB0aGUgc3RhdGVkIHRpbWUgY29uc3RyYWludCAtLQotICogdGhvdWdoIGl0IG1pZ2h0IGdldCBmYXN0ZXIuIFdoZXJlIHBvc3NpYmxlLCB3ZSBoYXZlIGFsc28gdHJpZWQgdG8gYmUgbWVtb3J5Ci0gKiBlZmZpY2llbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmRpbmdNYW5hZ2VyIGV4dGVuZHMgSGFuZGxlT2JqZWN0TWFuYWdlciBpbXBsZW1lbnRzCi0JCUlDb250ZXh0TWFuYWdlckxpc3RlbmVyLCBJU2NoZW1lTGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBmbGFnIGNhbiBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGJpbmRpbmcgbWFuYWdlciBzaG91bGQKLQkgKiBwcmludCBpbmZvcm1hdGlvbiB0byA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPiB3aGVuIGNlcnRhaW4gYm91bmRhcnkKLQkgKiBjb25kaXRpb25zIG9jY3VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIgdXNlZCBpbiBsb2NhbGVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEVfU0VQQVJBVE9SID0gIl8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiA8L3A+Ci0JICogQSB1dGlsaXR5IG1ldGhvZCBmb3IgYWRkaW5nIGVudHJpZXMgdG8gYSBtYXAuIFRoZSBtYXAgaXMgY2hlY2tlZCBmb3IKLQkgKiBlbnRyaWVzIGF0IHRoZSBrZXkuIElmIHN1Y2ggYW4gZW50cnkgZXhpc3RzLCBpdCBpcyBleHBlY3RlZCB0byBiZSBhCi0JICogPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4uIFRoZSB2YWx1ZSBpcyB0aGVuIGFwcGVuZGVkIHRvIHRoZSBjb2xsZWN0aW9uLgotCSAqIElmIG5vIHN1Y2ggZW50cnkgZXhpc3RzLCB0aGVuIGEgY29sbGVjdGlvbiBpcyBjcmVhdGVkLCBhbmQgdGhlIHZhbHVlCi0JICogYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIFRoZSBtYXAgdG8gbW9kaWZ5OyBpZiB0aGlzIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuCi0JICogICAgICAgICAgICB0aGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJucy4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUga2V5IHRvIGxvb2sgdXAgaW4gdGhlIG1hcDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIGxvb2sgdXAgaW4gdGhlIG1hcDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgYWRkUmV2ZXJzZUxvb2t1cChmaW5hbCBNYXAgbWFwLCBmaW5hbCBPYmplY3Qga2V5LAotCQkJZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChtYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZmluYWwgT2JqZWN0IGN1cnJlbnRWYWx1ZSA9IG1hcC5nZXQoa2V5KTsKLQkJaWYgKGN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlmaW5hbCBDb2xsZWN0aW9uIHZhbHVlcyA9IChDb2xsZWN0aW9uKSBjdXJyZW50VmFsdWU7Ci0JCQl2YWx1ZXMuYWRkKHZhbHVlKTsKLQkJfSBlbHNlIHsgLy8gY3VycmVudFZhbHVlID09IG51bGwKLQkJCWZpbmFsIENvbGxlY3Rpb24gdmFsdWVzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCXZhbHVlcy5hZGQodmFsdWUpOwotCQkJbWFwLnB1dChrZXksIHZhbHVlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUYWtlcyBhIGZ1bGx5LXNwZWNpZmllZCBzdHJpbmcsIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGFuIGFycmF5IG9mCi0JICogaW5jcmVhc2luZ2x5IGxlc3Mtc3BlY2lmaWMgc3RyaW5ncy4gU28sIGZvciBleGFtcGxlLCAiZW5fR0IiIHdvdWxkIGJlY29tZQotCSAqIFsiZW5fR0IiLCAiZW4iLCAiIiwgbnVsbF0uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHJ1bnMgaW4gbGluZWFyIHRpbWUgKE8obikpIG92ZXIgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogICAgICAgICAgICBUaGUgc3RyaW5nIHRvIGJyZWFrIGFwYXJ0IGludG8gaXRzIGxlc3Mgc3BlY2lmaWMgY29tcG9uZW50czsKLQkgKiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHNlcGFyYXRvcgotCSAqICAgICAgICAgICAgVGhlIHNlcGFyYXRvciB0aGF0IGluZGljYXRlcyBhIHNlcGFyYXRpb24gYmV0d2VlbiBhIGRlZ3JlZXMgb2YKLQkgKiAgICAgICAgICAgIHNwZWNpZmljaXR5OyBzaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2Ygc3RyaW5ncyBmcm9tIHRoZSBtb3N0IHNwZWNpZmljIChpLmUuLAotCSAqICAgICAgICAgPGNvZGU+c3RyaW5nPC9jb2RlPikgdG8gdGhlIGxlYXN0IHNwZWNpZmljIChpLmUuLAotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4pLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGV4cGFuZChTdHJpbmcgc3RyaW5nLCBmaW5hbCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCS8vIFRlc3QgZm9yIGJvdW5kYXJ5IGNvbmRpdGlvbnMuCi0JCWlmIChzdHJpbmcgPT0gbnVsbCB8fCBzZXBhcmF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCX0KLQotCQlmaW5hbCBMaXN0IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN0cmluZyA9IHN0cmluZy50cmltKCk7IC8vIHJlbW92ZSB3aGl0ZXNwYWNlCi0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlmaW5hbCBTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmcsCi0JCQkJCXNlcGFyYXRvcik7Ci0JCQl3aGlsZSAoc3RyaW5nVG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJaWYgKHN0cmluZ0J1ZmZlci5sZW5ndGgoKSA+IDApCi0JCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCgoU3RyaW5nKSBzdHJpbmdUb2tlbml6ZXIubmV4dEVsZW1lbnQoKSkKLQkJCQkJCS50cmltKCkpOwotCQkJCXN0cmluZ3MuYWRkKHN0cmluZ0J1ZmZlci50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHN0cmluZ3MpOwotCQlzdHJpbmdzLmFkZChVdGlsLlpFUk9fTEVOR1RIX1NUUklORyk7Ci0JCXN0cmluZ3MuYWRkKG51bGwpOwotCQlyZXR1cm4gKFN0cmluZ1tdKSBzdHJpbmdzLnRvQXJyYXkobmV3IFN0cmluZ1tzdHJpbmdzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFRoZSBhY3RpdmUgYmluZGluZ3MuIFRoaXMgaXMgYSBtYXAgb2YgdHJpZ2dlcnMgKAotCSAqIDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pIHRvIGJpbmRpbmdzICg8Y29kZT5CaW5kaW5nPC9jb2RlPikuCi0JICogVGhpcyB2YWx1ZSB3aWxsIG9ubHkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGFjdGl2ZSBiaW5kaW5ncyBoYXZlCi0JICogbm90IHlldCBiZWVuIGNvbXB1dGVkLiBPdGhlcndpc2UsIHRoaXMgdmFsdWUgbWF5IGJlIGVtcHR5LgotCSAqLwotCXByaXZhdGUgTWFwIGFjdGl2ZUJpbmRpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBhY3RpdmUgYmluZGluZ3MgaW5kZXhlZCBieSBmdWxseS1wYXJhbWV0ZXJpemVkIGNvbW1hbmRzLiBUaGlzIGlzIGEKLQkgKiBtYXAgb2YgZnVsbHktcGFyYW1ldGVyaXplZCBjb21tYW5kcyAoPGNvZGU+UGFyYW1ldGVyaXplZENvbW1hbmQ8L2NvZGU+KQotCSAqIHRvIHRyaWdnZXJzICggPGNvZGU+VHJpZ2dlclNlcXVlbmNlPC9jb2RlPikuIFRoaXMgdmFsdWUgd2lsbCBvbmx5IGJlCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGFjdGl2ZSBiaW5kaW5ncyBoYXZlIG5vdCB5ZXQgYmVlbiBjb21wdXRlZC4KLQkgKiBPdGhlcndpc2UsIHRoaXMgdmFsdWUgbWF5IGJlIGVtcHR5LgotCSAqLwotCXByaXZhdGUgTWFwIGFjdGl2ZUJpbmRpbmdzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgc2NoZW1lIHRoYXQgaXMgY3VycmVudGx5IGFjdGl2ZS4gQW4gYWN0aXZlIHNjaGVtZSBpcyB0aGUgb25lIHRoYXQgaXMKLQkgKiBjdXJyZW50bHkgZGljdGF0aW5nIHdoaWNoIGJpbmRpbmdzIHdpbGwgYWN0dWFsbHkgd29yay4gVGhpcyB2YWx1ZSBtYXkgYmUKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBhY3RpdmUgc2NoZW1lLiBJZiB0aGUgYWN0aXZlIHNjaGVtZQotCSAqIGJlY29tZXMgdW5kZWZpbmVkLCB0aGVuIHRoaXMgc2hvdWxkIGF1dG9tYXRpY2FsbHkgcmV2ZXJ0IHRvCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBTY2hlbWUgYWN0aXZlU2NoZW1lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBhcnJheSBvZiBzY2hlbWUgaWRlbnRpZmllcnMsIHN0YXJ0aW5nIHdpdGggdGhlIGFjdGl2ZSBzY2hlbWUgYW5kCi0JICogbW92aW5nIHVwIHRocm91Z2ggaXRzIHBhcmVudHMuIFRoaXMgdmFsdWUgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhlcmUgaXMgbm8gYWN0aXZlIHNjaGVtZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGFjdGl2ZVNjaGVtZUlkcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIGJpbmRpbmdzIGluIHRoZSA8Y29kZT5iaW5kaW5nczwvY29kZT4gYXJyYXkuCi0JICovCi0JcHJpdmF0ZSBpbnQgYmluZGluZ0NvdW50ID0gMDsKLQotCS8qKgotCSAqIFRoZSBhcnJheSBvZiBhbGwgYmluZGluZ3MgY3VycmVudGx5IGhhbmRsZWQgYnkgdGhpcyBtYW5hZ2VyLiBUaGlzIGFycmF5Ci0JICogaXMgdGhlIHJhdyBsaXN0IG9mIGJpbmRpbmdzLCBhcyBwcm92aWRlZCB0byB0aGlzIG1hbmFnZXIuIFRoaXMgdmFsdWUgbWF5Ci0JICogYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGJpbmRpbmdzLiBUaGUgc2l6ZSBvZiB0aGlzIGFycmF5Ci0JICogaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBudW1iZXIgb2YgYmluZGluZ3MuCi0JICovCi0JcHJpdmF0ZSBCaW5kaW5nW10gYmluZGluZ3MgPSBudWxsOwotCi0JLyoqCi0JICogQSBjYWNoZSBvZiB0aGUgYmluZGluZ3MgcHJldmlvdXNseSBjb21wdXRlZCBieSB0aGlzIG1hbmFnZXIuIFRoaXMgdmFsdWUKLQkgKiBtYXkgYmUgZW1wdHksIGJ1dCBpdCBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcyBpcyBhIG1hcCBvZgotCSAqIDxjb2RlPkNhY2hlZEJpbmRpbmdTZXQ8L2NvZGU+IHRvIDxjb2RlPkNhY2hlZEJpbmRpbmdTZXQ8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgTWFwIGNhY2hlZEJpbmRpbmdzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIFRoZSBjb21tYW5kIG1hbmFnZXIgZm9yIHRoaXMgYmluZGluZyBtYW5hZ2VyLiBUaGlzIG1hbmFnZXIgaXMgb25seSBuZWVkZWQKLQkgKiBmb3IgdGhlIDxjb2RlPmdldEFjdGl2ZUJpbmRpbmdzRm9yKFN0cmluZyk8L2NvZGU+IG1ldGhvZC4gVGhpcyB2YWx1ZSBpcwotCSAqIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlcjsKLQotCS8qKgotCSAqIFRoZSBjb250ZXh0IG1hbmFnZXIgZm9yIHRoaXMgYmluZGluZyBtYW5hZ2VyLiBGb3IgYSBiaW5kaW5nIG1hbmFnZXIgdG8KLQkgKiBmdW5jdGlvbiwgaXQgbmVlZHMgdG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBjb250ZXh0cy4gVGhpcyB2YWx1ZSBpcwotCSAqIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlcjsKLQotCS8qKgotCSAqIFRoZSBsb2NhbGUgZm9yIHRoaXMgbWFuYWdlci4gVGhpcyBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBsb2NhbGUuIFRoZQotCSAqIHZhbHVlIHdpbGwgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpOwotCi0JLyoqCi0JICogVGhlIGFycmF5IG9mIGxvY2FsZXMsIHN0YXJ0aW5nIHdpdGggdGhlIGFjdGl2ZSBsb2NhbGUgYW5kIG1vdmluZyB1cAotCSAqIHRocm91Z2ggbGVzcyBzcGVjaWZpYyByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGxvY2FsZS4gRm9yIGV4YW1wbGUsCi0JICogWyJlbl9VUyIsICJlbiIsICIiLCBudWxsXS4gVGhpcyB2YWx1ZSB3aWxsIG5ldmVyIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gbG9jYWxlcyA9IGV4cGFuZChsb2NhbGUsIExPQ0FMRV9TRVBBUkFUT1IpOwotCi0JLyoqCi0JICogVGhlIHBsYXRmb3JtIGZvciB0aGlzIG1hbmFnZXIuIFRoaXMgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0uIFRoZQotCSAqIHZhbHVlIHdpbGwgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcGxhdGZvcm0gPSBTV1QuZ2V0UGxhdGZvcm0oKTsKLQotCS8qKgotCSAqIFRoZSBhcnJheSBvZiBwbGF0Zm9ybXMsIHN0YXJ0aW5nIHdpdGggdGhlIGFjdGl2ZSBwbGF0Zm9ybSBhbmQgbW92aW5nIHVwCi0JICogdGhyb3VnaCBsZXNzIHNwZWNpZmljIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgcGxhdGZvcm0uIEZvciBleGFtcGxlLAotCSAqIFsiZ3RrIiwgIiIsIG51bGxdLiBUaGlzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgPGNvZGU+bnVsbCwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBwbGF0Zm9ybXMgPSBleHBhbmQocGxhdGZvcm0sIFV0aWwuWkVST19MRU5HVEhfU1RSSU5HKTsKLQotCS8qKgotCSAqIEEgbWFwIG9mIHByZWZpeGVzICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KSB0byBhIG1hcCBvZgotCSAqIGF2YWlsYWJsZSBjb21wbGV0aW9ucyAocG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4sIHdoaWNoIG1lYW5zIHRoZXJlCi0JICogaXMgYW4gZXhhY3QgbWF0Y2gpLiBUaGUgYXZhaWxhYmxlIGNvbXBsZXRpb25zIGlzIGEgbWFwIG9mIHRyaWdnZXIgKDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pCi0JICogdG8gYmluZGluZ3MgKDxjb2RlPkJpbmRpbmc8L2NvZGU+KS4gVGhpcyB2YWx1ZSBtYXkgYmUKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBleGlzdGluZyBzb2x1dGlvbi4KLQkgKi8KLQlwcml2YXRlIE1hcCBwcmVmaXhUYWJsZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPkJpbmRpbmdNYW5hZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIGFtb3J0aXplZCBjb25zdGFudCB0aW1lIChPKDEpKS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbnRleHRNYW5hZ2VyCi0JICogICAgICAgICAgICBUaGUgY29udGV4dCBtYW5hZ2VyIHRoYXQgd2lsbCBzdXBwb3J0IHRoaXMgYmluZGluZyBtYW5hZ2VyLgotCSAqICAgICAgICAgICAgVGhpcyB2YWx1ZSBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gY29tbWFuZE1hbmFnZXIKLQkgKiAgICAgICAgICAgIFRoZSBjb21tYW5kIG1hbmFnZXIgdGhhdCB3aWxsIHN1cHBvcnQgdGhpcyBiaW5kaW5nIG1hbmFnZXIuCi0JICogICAgICAgICAgICBUaGlzIHZhbHVlIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBCaW5kaW5nTWFuYWdlcihmaW5hbCBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciwKLQkJCWZpbmFsIENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyKSB7Ci0JCWlmIChjb250ZXh0TWFuYWdlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0JCQkJCSJBIGJpbmRpbmcgbWFuYWdlciByZXF1aXJlcyBhIGNvbnRleHQgbWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoY29tbWFuZE1hbmFnZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotCQkJCQkiQSBiaW5kaW5nIG1hbmFnZXIgcmVxdWlyZXMgYSBjb21tYW5kIG1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdGhpcy5jb250ZXh0TWFuYWdlciA9IGNvbnRleHRNYW5hZ2VyOwotCQljb250ZXh0TWFuYWdlci5hZGRDb250ZXh0TWFuYWdlckxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLmNvbW1hbmRNYW5hZ2VyID0gY29tbWFuZE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkcyBhIHNpbmdsZSBuZXcgYmluZGluZyB0byB0aGUgZXhpc3RpbmcgYXJyYXkgb2YgYmluZGluZ3MuIElmIHRoZSBhcnJheQotCSAqIGlzIGN1cnJlbnRseSA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBhIG5ldyBhcnJheSBpcyBjcmVhdGVkIGFuZCB0aGlzCi0JICogYmluZGluZyBpcyBhZGRlZCB0byBpdC4gVGhpcyBtZXRob2QgZG9lcyBub3QgZGV0ZWN0IGR1cGxpY2F0ZXMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpbiBhbW9ydGl6ZWQgPGNvZGU+TygxKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBiaW5kaW5nCi0JICogICAgICAgICAgICBUaGUgYmluZGluZyB0byBiZSBhZGRlZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkQmluZGluZyhmaW5hbCBCaW5kaW5nIGJpbmRpbmcpIHsKLQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDYW5ub3QgYWRkIGEgbnVsbCBiaW5kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChiaW5kaW5ncyA9PSBudWxsKSB7Ci0JCQliaW5kaW5ncyA9IG5ldyBCaW5kaW5nWzFdOwotCQl9IGVsc2UgaWYgKGJpbmRpbmdDb3VudCA+PSBiaW5kaW5ncy5sZW5ndGgpIHsKLQkJCWZpbmFsIEJpbmRpbmdbXSBvbGRCaW5kaW5ncyA9IGJpbmRpbmdzOwotCQkJYmluZGluZ3MgPSBuZXcgQmluZGluZ1tvbGRCaW5kaW5ncy5sZW5ndGggKiAyXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQmluZGluZ3MsIDAsIGJpbmRpbmdzLCAwLCBvbGRCaW5kaW5ncy5sZW5ndGgpOwotCQl9Ci0JCWJpbmRpbmdzW2JpbmRpbmdDb3VudCsrXSA9IGJpbmRpbmc7Ci0JCWNsZWFyQ2FjaGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhpcyBiaW5kaW5nIG1hbmFnZXIuIFRoZSBsaXN0ZW5lciB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGUgc2V0IG9mIGRlZmluZWQgc2NoZW1lcyBvciBiaW5kaW5ncyBjaGFuZ2VzLiBUaGlzIGNhbiBiZSB1c2VkIHRvCi0JICogdHJhY2sgdGhlIGdsb2JhbCBhcHBlYXJhbmNlIGFuZCBkaXNhcHBlYXJhbmNlIG9mIGJpbmRpbmdzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gYW1vcnRpemVkIGNvbnN0YW50IHRpbWUgKDxjb2RlPk8oMSk8L2NvZGU+KS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gYXR0YWNoOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRCaW5kaW5nTWFuYWdlckxpc3RlbmVyKAotCQkJZmluYWwgSUJpbmRpbmdNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJYWRkTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEJ1aWxkcyBhIHByZWZpeCB0YWJsZSBsb29rLXVwIGZvciBhIG1hcCBvZiBhY3RpdmUgYmluZGluZ3MuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHRha2VzIDxjb2RlPk8obW4pPC9jb2RlPiwgd2hlcmUgPGNvZGU+bTwvY29kZT4gaXMgdGhlCi0JICogbGVuZ3RoIG9mIHRoZSB0cmlnZ2VyIHNlcXVlbmNlcyBhbmQgPGNvZGU+bjwvY29kZT4gaXMgdGhlIG51bWJlciBvZgotCSAqIGJpbmRpbmdzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZlQmluZGluZ3MKLQkgKiAgICAgICAgICAgIFRoZSBtYXAgb2YgdHJpZ2dlcnMgKDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pIHRvCi0JICogICAgICAgICAgICBjb21tYW5kIGlkcyAoPGNvZGU+U3RyaW5nPC9jb2RlPikgd2hpY2ggYXJlIGN1cnJlbnRseQotCSAqICAgICAgICAgICAgYWN0aXZlLiBUaGlzIHZhbHVlIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8KLQkgKiAgICAgICAgICAgIGFjdGl2ZSBiaW5kaW5ncywgYW5kIGl0IG1heSBiZSBlbXB0eS4gSXQgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gQSBtYXAgb2YgcHJlZml4ZXMgKDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pIHRvIGEgbWFwIG9mCi0JICogICAgICAgICBhdmFpbGFibGUgY29tcGxldGlvbnMgKHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+LCB3aGljaCBtZWFucwotCSAqICAgICAgICAgdGhlcmUgaXMgYW4gZXhhY3QgbWF0Y2gpLiBUaGUgYXZhaWxhYmxlIGNvbXBsZXRpb25zIGlzIGEgbWFwIG9mCi0JICogICAgICAgICB0cmlnZ2VyICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KSB0byBjb21tYW5kIGlkZW50aWZpZXIgKDxjb2RlPlN0cmluZzwvY29kZT4pLgotCSAqICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIG5ldmVyIGJlIDxjb2RlPm51bGw8L2NvZGU+LCBidXQgbWF5IGJlIGVtcHR5LgotCSAqLwotCXByaXZhdGUgZmluYWwgTWFwIGJ1aWxkUHJlZml4VGFibGUoZmluYWwgTWFwIGFjdGl2ZUJpbmRpbmdzKSB7Ci0JCWZpbmFsIE1hcCBwcmVmaXhUYWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJZmluYWwgSXRlcmF0b3IgYmluZGluZ0l0ciA9IGFjdGl2ZUJpbmRpbmdzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGJpbmRpbmdJdHIuaGFzTmV4dCgpKSB7Ci0JCQlmaW5hbCBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBiaW5kaW5nSXRyLm5leHQoKTsKLQkJCWZpbmFsIFRyaWdnZXJTZXF1ZW5jZSB0cmlnZ2VyU2VxdWVuY2UgPSAoVHJpZ2dlclNlcXVlbmNlKSBlbnRyeQotCQkJCQkuZ2V0S2V5KCk7Ci0KLQkJCS8vIEFkZCB0aGUgcGVyZmVjdCBtYXRjaC4KLQkJCWlmICghcHJlZml4VGFibGUuY29udGFpbnNLZXkodHJpZ2dlclNlcXVlbmNlKSkgewotCQkJCXByZWZpeFRhYmxlLnB1dCh0cmlnZ2VyU2VxdWVuY2UsIG51bGwpOwotCQkJfQotCi0JCQlmaW5hbCBUcmlnZ2VyU2VxdWVuY2VbXSBwcmVmaXhlcyA9IHRyaWdnZXJTZXF1ZW5jZS5nZXRQcmVmaXhlcygpOwotCQkJZmluYWwgaW50IHByZWZpeGVzTGVuZ3RoID0gcHJlZml4ZXMubGVuZ3RoOwotCQkJaWYgKHByZWZpeGVzTGVuZ3RoID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gQnJlYWsgYXBhcnQgdGhlIHRyaWdnZXIgc2VxdWVuY2UuCi0JCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlZml4ZXNMZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIFRyaWdnZXJTZXF1ZW5jZSBwcmVmaXggPSBwcmVmaXhlc1tpXTsKLQkJCQlmaW5hbCBPYmplY3QgdmFsdWUgPSBwcmVmaXhUYWJsZS5nZXQocHJlZml4KTsKLQkJCQlpZiAoKHByZWZpeFRhYmxlLmNvbnRhaW5zS2V5KHByZWZpeCkpICYmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkpIHsKLQkJCQkJKChNYXApIHZhbHVlKS5wdXQodHJpZ2dlclNlcXVlbmNlLCBiaW5kaW5nKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaW5hbCBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJcHJlZml4VGFibGUucHV0KHByZWZpeCwgbWFwKTsKLQkJCQkJbWFwLnB1dCh0cmlnZ2VyU2VxdWVuY2UsIGJpbmRpbmcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcmVmaXhUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDbGVhcnMgdGhlIGNhY2hlLCBhbmQgdGhlIGV4aXN0aW5nIHNvbHV0aW9uLiBJZiBkZWJ1Z2dpbmcgaXMgdHVybmVkIG9uLAotCSAqIHRoZW4gdGhpcyB3aWxsIGFsc28gcHJpbnQgYSBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8oMSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgY2xlYXJDYWNoZSgpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlUcmFjaW5nLnByaW50VHJhY2UoIkJJTkRJTkdTIiwgIkNsZWFyaW5nIGNhY2hlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhY2hlZEJpbmRpbmdzLmNsZWFyKCk7Ci0JCWNsZWFyU29sdXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDbGVhcnMgdGhlIGV4aXN0aW5nIHNvbHV0aW9uLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gPGNvZGU+TygxKTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGNsZWFyU29sdXRpb24oKSB7Ci0JCXNldEFjdGl2ZUJpbmRpbmdzKG51bGwsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbXBhcmVzIHRoZSBpZGVudGlmaWVyIG9mIHR3byBzY2hlbWVzLCBhbmQgZGVjaWRlcyB3aGljaCBzY2hlbWUgaXMgdGhlCi0JICogeW91bmdlc3QgKGkuZS4sIHRoZSBjaGlsZCkgb2YgdGhlIHR3by4gQm90aCBzY2hlbWVzIHNob3VsZCBiZSBhY3RpdmUKLQkgKiBzY2hlbWVzLgotCSAqIAotCSAqIEBwYXJhbSBzY2hlbWVJZDEKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBmaXJzdCBzY2hlbWU7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gc2NoZW1lSWQyCi0JICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2Vjb25kIHNjaGVtZTsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gPGNvZGU+MDwvY29kZT4gaWYgdGhlIHR3byBzY2hlbWVzIGFyZSBlcXVhbCBvZiBpZiBuZWl0aGVyCi0JICogICAgICAgICBzY2hlbWUgaXMgYWN0aXZlOyA8Y29kZT4xPC9jb2RlPiBpZiB0aGUgc2Vjb25kIHNjaGVtZSBpcyB0aGUKLQkgKiAgICAgICAgIHlvdW5nZXN0OyBhbmQgPGNvZGU+LTE8L2NvZGU+IGlmIHRoZSBmaXJzdCBzY2hlbWUgaXMgdGhlCi0JICogICAgICAgICB5b3VuZ2VzdC4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgY29tcGFyZVNjaGVtZXMoZmluYWwgU3RyaW5nIHNjaGVtZUlkMSwKLQkJCWZpbmFsIFN0cmluZyBzY2hlbWVJZDIpIHsKLQkJaWYgKCFzY2hlbWVJZDIuZXF1YWxzKHNjaGVtZUlkMSkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aXZlU2NoZW1lSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgU3RyaW5nIHNjaGVtZVBvaW50ZXIgPSBhY3RpdmVTY2hlbWVJZHNbaV07Ci0JCQkJaWYgKHNjaGVtZUlkMi5lcXVhbHMoc2NoZW1lUG9pbnRlcikpIHsKLQkJCQkJcmV0dXJuIDE7Ci0KLQkJCQl9IGVsc2UgaWYgKHNjaGVtZUlkMS5lcXVhbHMoc2NoZW1lUG9pbnRlcikpIHsKLQkJCQkJcmV0dXJuIC0xOwotCi0JCQkJfQotCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb21wdXRlcyB0aGUgYmluZGluZ3MgZ2l2ZW4gdGhlIGNvbnRleHQgdHJlZSwgYW5kIGluc2VydHMgdGhlbSBpbnRvIHRoZQotCSAqIDxjb2RlPmNvbW1hbmRJZHNCeVRyaWdnZXI8L2NvZGU+LiBJdCBpcyBhc3N1bWVkIHRoYXQKLQkgKiA8Y29kZT5sb2NhbGVzPC9jb2RlPiw8Y29kZT5wbGF0Zm9yc208L2NvZGU+IGFuZAotCSAqIDxjb2RlPnNjaGVtZUlkczwvY29kZT4gY29ycmVjdGx5IHJlZmxlY3QgdGhlIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBkZWFsIHdpdGggY2FjaGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8obik8L2NvZGU+LCB3aGVyZSA8Y29kZT5uPC9jb2RlPiBpcwotCSAqIHRoZSBudW1iZXIgb2YgYmluZGluZ3MuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhY3RpdmVDb250ZXh0VHJlZQotCSAqICAgICAgICAgICAgVGhlIG1hcCByZXByZXNlbnRpbmcgdGhlIHRyZWUgb2YgYWN0aXZlIGNvbnRleHRzLiBUaGUgbWFwIGlzCi0JICogICAgICAgICAgICBvbmUgb2YgY2hpbGQgdG8gcGFyZW50LCBlYWNoIGJlaW5nIGEgY29udGV4dCBpZCAoCi0JICogICAgICAgICAgICA8Y29kZT5TdHJpbmc8L2NvZGU+KS4gVGhlIGtleXMgYXJlIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LAotCSAqICAgICAgICAgICAgYnV0IHRoZSB2YWx1ZXMgbWF5IGJlIChpLmUuLCBubyBwYXJlbnQpLiBUaGlzIG1hcCBtYXkgYmUKLQkgKiAgICAgICAgICAgIGVtcHR5LiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgd2Ugc2hvdWxkbid0IGNvbnNpZGVyCi0JICogICAgICAgICAgICBjb250ZXh0cy4KLQkgKiBAcGFyYW0gYmluZGluZ3NCeVRyaWdnZXIKLQkgKiAgICAgICAgICAgIFRoZSBlbXB0eSBvZiBtYXAgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBmaWxsZWQgd2l0aCB0cmlnZ2VycyAoCi0JICogICAgICAgICAgICA8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KSB0byBiaW5kaW5ncyAoCi0JICogICAgICAgICAgICA8Y29kZT5CaW5kaW5nPC9jb2RlPikuIFRoaXMgdmFsdWUgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBtdXN0IGJlIGVtcHR5LgotCSAqIEBwYXJhbSB0cmlnZ2Vyc0J5Q29tbWFuZElkCi0JICogICAgICAgICAgICBUaGUgZW1wdHkgb2YgbWFwIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZmlsbGVkIHdpdGggY29tbWFuZAotCSAqICAgICAgICAgICAgaWRlbnRpZmllcnMgKDxjb2RlPlN0cmluZzwvY29kZT4pIHRvIHRyaWdnZXJzICgKLQkgKiAgICAgICAgICAgIDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pLiBUaGlzIHZhbHVlIG11c3QgZWl0aGVyIGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiAoaW5kaWNhdGluZyB0aGF0IHRoZXNlIHZhbHVlcyBhcmUgbm90Ci0JICogICAgICAgICAgICBuZWVkZWQpLCBvciBlbXB0eSAoaW5kaWNhdGluZyB0aGF0IHRoaXMgbWFwIHNob3VsZCBiZQotCSAqICAgICAgICAgICAgY29tcHV0ZWQpLgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBjb21wdXRlQmluZGluZ3MoZmluYWwgTWFwIGFjdGl2ZUNvbnRleHRUcmVlLAotCQkJZmluYWwgTWFwIGJpbmRpbmdzQnlUcmlnZ2VyLCBmaW5hbCBNYXAgdHJpZ2dlcnNCeUNvbW1hbmRJZCkgewotCQkvKgotCQkgKiBGSVJTVCBQQVNTOiBSZW1vdmUgYWxsIG9mIHRoZSBiaW5kaW5ncyB0aGF0IGFyZSBtYXJraW5nIGRlbGV0aW9ucy4KLQkJICovCi0JCWZpbmFsIEJpbmRpbmdbXSB0cmltbWVkQmluZGluZ3MgPSByZW1vdmVEZWxldGlvbnMoYmluZGluZ3MpOwotCi0JCS8qCi0JCSAqIFNFQ09ORCBQQVNTOiBKdXN0IHRocm93IGluIGJpbmRpbmdzIHRoYXQgbWF0Y2ggdGhlIGN1cnJlbnQgc3RhdGUuIElmCi0JCSAqIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgbWF0Y2ggZm9yIGEgYmluZGluZywgdGhlbiBjcmVhdGUgYSBsaXN0LgotCQkgKi8KLQkJZmluYWwgTWFwIHBvc3NpYmxlQmluZGluZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQlmaW5hbCBpbnQgbGVuZ3RoID0gdHJpbW1lZEJpbmRpbmdzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJZmluYWwgQmluZGluZyBiaW5kaW5nID0gdHJpbW1lZEJpbmRpbmdzW2ldOwotCQkJYm9vbGVhbiBmb3VuZDsKLQotCQkJLy8gQ2hlY2sgdGhlIGNvbnRleHQuCi0JCQlmaW5hbCBTdHJpbmcgY29udGV4dElkID0gYmluZGluZy5nZXRDb250ZXh0SWQoKTsKLQkJCWlmICgoYWN0aXZlQ29udGV4dFRyZWUgIT0gbnVsbCkKLQkJCQkJJiYgKCFhY3RpdmVDb250ZXh0VHJlZS5jb250YWluc0tleShjb250ZXh0SWQpKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBDaGVjayB0aGUgbG9jYWxlLgotCQkJaWYgKCFsb2NhbGVNYXRjaGVzKGJpbmRpbmcpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIHRoZSBwbGF0Zm9ybS4KLQkJCWlmICghcGxhdGZvcm1NYXRjaGVzKGJpbmRpbmcpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIHRoZSBzY2hlbWUgaWRzLgotCQkJZmluYWwgU3RyaW5nIHNjaGVtZUlkID0gYmluZGluZy5nZXRTY2hlbWVJZCgpOwotCQkJZm91bmQgPSBmYWxzZTsKLQkJCWlmIChhY3RpdmVTY2hlbWVJZHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYWN0aXZlU2NoZW1lSWRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChVdGlsLmVxdWFscyhzY2hlbWVJZCwgYWN0aXZlU2NoZW1lSWRzW2pdKSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIEluc2VydCB0aGUgbWF0Y2ggaW50byB0aGUgbGlzdCBvZiBwb3NzaWJsZSBtYXRjaGVzLgotCQkJZmluYWwgVHJpZ2dlclNlcXVlbmNlIHRyaWdnZXIgPSBiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpOwotCQkJZmluYWwgT2JqZWN0IGV4aXN0aW5nTWF0Y2ggPSBwb3NzaWJsZUJpbmRpbmdzLmdldCh0cmlnZ2VyKTsKLQkJCWlmIChleGlzdGluZ01hdGNoIGluc3RhbmNlb2YgQmluZGluZykgewotCQkJCXBvc3NpYmxlQmluZGluZ3MucmVtb3ZlKHRyaWdnZXIpOwotCQkJCWZpbmFsIENvbGxlY3Rpb24gbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltYXRjaGVzLmFkZChleGlzdGluZ01hdGNoKTsKLQkJCQltYXRjaGVzLmFkZChiaW5kaW5nKTsKLQkJCQlwb3NzaWJsZUJpbmRpbmdzLnB1dCh0cmlnZ2VyLCBtYXRjaGVzKTsKLQotCQkJfSBlbHNlIGlmIChleGlzdGluZ01hdGNoIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJCWZpbmFsIENvbGxlY3Rpb24gbWF0Y2hlcyA9IChDb2xsZWN0aW9uKSBleGlzdGluZ01hdGNoOwotCQkJCW1hdGNoZXMuYWRkKGJpbmRpbmcpOwotCi0JCQl9IGVsc2UgewotCQkJCXBvc3NpYmxlQmluZGluZ3MucHV0KHRyaWdnZXIsIGJpbmRpbmcpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogVEhJUkQgUEFTUzogSW4gdGhpcyBwYXNzLCB3ZSBtb3ZlIGFueSBub24tY29uZmxpY3RpbmcgYmluZGluZ3MKLQkJICogZGlyZWN0bHkgaW50byB0aGUgbWFwLiBJbiB0aGUgY2FzZSBvZiBjb25mbGljdHMsIHdlIGFwcGx5IHNvbWUKLQkJICogZnVydGhlciBsb2dpYyB0byB0cnkgdG8gcmVzb2x2ZSB0aGVtLiBJZiB0aGUgY29uZmxpY3QgY2FuJ3QgYmUKLQkJICogcmVzb2x2ZWQsIHRoZW4gd2UgbG9nIHRoZSBwcm9ibGVtLgotCQkgKi8KLQkJZmluYWwgSXRlcmF0b3IgcG9zc2libGVCaW5kaW5nSXRyID0gcG9zc2libGVCaW5kaW5ncy5lbnRyeVNldCgpCi0JCQkJLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChwb3NzaWJsZUJpbmRpbmdJdHIuaGFzTmV4dCgpKSB7Ci0JCQlmaW5hbCBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBwb3NzaWJsZUJpbmRpbmdJdHIubmV4dCgpOwotCQkJZmluYWwgVHJpZ2dlclNlcXVlbmNlIHRyaWdnZXIgPSAoVHJpZ2dlclNlcXVlbmNlKSBlbnRyeS5nZXRLZXkoKTsKLQkJCWZpbmFsIE9iamVjdCBtYXRjaCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkvKgotCQkJICogV2hhdCB3ZSBkbyBkZXBlbmRzIHNsaWdodGx5IG9uIHdoZXRoZXIgd2UgYXJlIHRyeWluZyB0byBidWlsZCBhCi0JCQkgKiBsaXN0IG9mIGFsbCBwb3NzaWJsZSBiaW5kaW5ncyAoZGlzcmVnYXJkaW5nIGNvbnRleHQpLCBvciBhIGZsYXQKLQkJCSAqIG1hcCBnaXZlbiB0aGUgY3VycmVudGx5IGFjdGl2ZSBjb250ZXh0cy4KLQkJCSAqLwotCQkJaWYgKGFjdGl2ZUNvbnRleHRUcmVlID09IG51bGwpIHsKLQkJCQkvLyBXZSBhcmUgYnVpbGRpbmcgdGhlIGxpc3Qgb2YgYWxsIHBvc3NpYmxlIGJpbmRpbmdzLgotCQkJCWZpbmFsIENvbGxlY3Rpb24gYmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKG1hdGNoIGluc3RhbmNlb2YgQmluZGluZykgewotCQkJCQliaW5kaW5ncy5hZGQobWF0Y2gpOwotCQkJCQliaW5kaW5nc0J5VHJpZ2dlci5wdXQodHJpZ2dlciwgYmluZGluZ3MpOwotCQkJCQlhZGRSZXZlcnNlTG9va3VwKHRyaWdnZXJzQnlDb21tYW5kSWQsICgoQmluZGluZykgbWF0Y2gpCi0JCQkJCQkJLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCksIHRyaWdnZXIpOwotCi0JCQkJfSBlbHNlIGlmIChtYXRjaCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQkJYmluZGluZ3MuYWRkQWxsKHJlc29sdmVDb25mbGljdHMoKENvbGxlY3Rpb24pIG1hdGNoKSk7Ci0JCQkJCWJpbmRpbmdzQnlUcmlnZ2VyLnB1dCh0cmlnZ2VyLCBiaW5kaW5ncyk7Ci0KLQkJCQkJZmluYWwgSXRlcmF0b3IgbWF0Y2hJdHIgPSBiaW5kaW5ncy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAobWF0Y2hJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlhZGRSZXZlcnNlTG9va3VwKHRyaWdnZXJzQnlDb21tYW5kSWQsCi0JCQkJCQkJCSgoQmluZGluZykgbWF0Y2hJdHIubmV4dCgpKQotCQkJCQkJCQkJCS5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpLCB0cmlnZ2VyKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQkvLyBXZSBhcmUgYnVpbGRpbmcgdGhlIGZsYXQgbWFwIG9mIHRyaWdnZXIgdG8gY29tbWFuZHMuCi0JCQkJaWYgKG1hdGNoIGluc3RhbmNlb2YgQmluZGluZykgewotCQkJCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgbWF0Y2g7Ci0JCQkJCWJpbmRpbmdzQnlUcmlnZ2VyLnB1dCh0cmlnZ2VyLCBiaW5kaW5nKTsKLQkJCQkJYWRkUmV2ZXJzZUxvb2t1cCh0cmlnZ2Vyc0J5Q29tbWFuZElkLCBiaW5kaW5nCi0JCQkJCQkJLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCksIHRyaWdnZXIpOwotCi0JCQkJfSBlbHNlIGlmIChtYXRjaCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQkJZmluYWwgQmluZGluZyB3aW5uZXIgPSByZXNvbHZlQ29uZmxpY3RzKChDb2xsZWN0aW9uKSBtYXRjaCwKLQkJCQkJCQlhY3RpdmVDb250ZXh0VHJlZSk7Ci0JCQkJCWlmICh3aW5uZXIgPT0gbnVsbCkgewotCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJVHJhY2luZy5wcmludFRyYWNlKCJCSU5ESU5HUyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSJBIGNvbmZsaWN0IG9jY3VycmVkIGZvciAiICsgdHJpZ2dlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlUcmFjaW5nLnByaW50VHJhY2UoIkJJTkRJTkdTIiwgIiAgICAiICsgbWF0Y2gpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJpbmRpbmdzQnlUcmlnZ2VyLnB1dCh0cmlnZ2VyLCB3aW5uZXIpOwotCQkJCQkJYWRkUmV2ZXJzZUxvb2t1cCh0cmlnZ2Vyc0J5Q29tbWFuZElkLCB3aW5uZXIKLQkJCQkJCQkJLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCksIHRyaWdnZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogTm90aWZpZXMgdGhpcyBtYW5hZ2VyIHRoYXQgdGhlIGNvbnRleHQgbWFuYWdlciBoYXMgY2hhbmdlZC4gVGhpcyBtZXRob2QKLQkgKiBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpbiA8Y29kZT5PKDEpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY29udGV4dE1hbmFnZXJDaGFuZ2VkKAotCQkJZmluYWwgQ29udGV4dE1hbmFnZXJFdmVudCBjb250ZXh0TWFuYWdlckV2ZW50KSB7Ci0JCWlmIChjb250ZXh0TWFuYWdlckV2ZW50LmlzQWN0aXZlQ29udGV4dHNDaGFuZ2VkKCkpIHsKLQkJCWNsZWFyU29sdXRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdHJva2VzIGluIGFuIGFycmF5IG9mIHRyaWdnZXJzLiBJdCBpcyBhc3N1bWVkIHRoYXQKLQkgKiB0aGVyZSBpcyBvbmUgbmF0dXJhbCBrZXkgcGVyIHRyaWdnZXIuIFRoZSBzdHJva2VzIGFyZSBjb3VudGVkIGJhc2VkIG9uCi0JICogdGhlIHR5cGUgb2Yga2V5LiBOYXR1cmFsIGtleXMgYXJlIHdvcnRoIG9uZTsgY3RybCBpcyB3b3J0aCB0d287IHNoaWZ0IGlzCi0JICogd29ydGggZm91cjsgYW5kIGFsdCBpcyB3b3J0aCBlaWdodC4KLQkgKiAKLQkgKiBAcGFyYW0gdHJpZ2dlcnMKLQkgKiAgICAgICAgICAgIFRoZSB0cmlnZ2VycyBvbiB3aGljaCB0byBjb3VudCBzdHJva2VzOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIHN0cm9rZXMgaW4gdGhlIHRyaWdnZXJzLgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBjb3VudFN0cm9rZXMoZmluYWwgVHJpZ2dlcltdIHRyaWdnZXJzKSB7Ci0JCWludCBzdHJva2VDb3VudCA9IHRyaWdnZXJzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmlnZ2Vycy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgVHJpZ2dlciB0cmlnZ2VyID0gdHJpZ2dlcnNbaV07Ci0JCQlpZiAodHJpZ2dlciBpbnN0YW5jZW9mIEtleVN0cm9rZSkgewotCQkJCWZpbmFsIEtleVN0cm9rZSBrZXlTdHJva2UgPSAoS2V5U3Ryb2tlKSB0cmlnZ2VyOwotCQkJCWZpbmFsIGludCBtb2RpZmllcktleXMgPSBrZXlTdHJva2UuZ2V0TW9kaWZpZXJLZXlzKCk7Ci0JCQkJZmluYWwgSUtleUxvb2t1cCBsb29rdXAgPSBLZXlMb29rdXBGYWN0b3J5LmdldERlZmF1bHQoKTsKLQkJCQlpZiAoKG1vZGlmaWVyS2V5cyAmIGxvb2t1cC5nZXRBbHQoKSkgIT0gMCkgewotCQkJCQlzdHJva2VDb3VudCArPSA4OwotCQkJCX0KLQkJCQlpZiAoKG1vZGlmaWVyS2V5cyAmIGxvb2t1cC5nZXRDdHJsKCkpICE9IDApIHsKLQkJCQkJc3Ryb2tlQ291bnQgKz0gMjsKLQkJCQl9Ci0JCQkJaWYgKChtb2RpZmllcktleXMgJiBsb29rdXAuZ2V0U2hpZnQoKSkgIT0gMCkgewotCQkJCQlzdHJva2VDb3VudCArPSA0OwotCQkJCX0KLQkJCQlpZiAoKG1vZGlmaWVyS2V5cyAmIGxvb2t1cC5nZXRDb21tYW5kKCkpICE9IDApIHsKLQkJCQkJc3Ryb2tlQ291bnQgKz0gMjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXN0cm9rZUNvdW50ICs9IDk5OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN0cm9rZUNvdW50OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSB0cmVlIG9mIGNvbnRleHQgaWRlbnRpZmllcnMsIHJlcHJlc2VudGluZyB0aGUgaGllcmFyY2hpY2FsCi0JICogc3RydWN0dXJlIG9mIHRoZSBnaXZlbiBjb250ZXh0cy4gVGhlIHRyZWUgaXMgc3RydWN0dXJlZCBhcyBhIG1hcHBpbmcgZnJvbQotCSAqIGNoaWxkIHRvIHBhcmVudC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8obik8L2NvZGU+LCB3aGVyZSA8Y29kZT5uPC9jb2RlPiBpcwotCSAqIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRleHQgdHJlZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbnRleHRJZHMKLQkgKiAgICAgICAgICAgIFRoZSBzZXQgb2YgY29udGV4dCBpZGVudGlmaWVycyB0byBiZSBjb252ZXJ0ZWQgaW50byBhIHRyZWU7Ci0JICogICAgICAgICAgICBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIFRoZSB0cmVlIG9mIGNvbnRleHRzIHRvIHVzZTsgbWF5IGJlIGVtcHR5LCBidXQgbmV2ZXIKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LiBUaGUga2V5cyBhbmQgdmFsdWVzIGFyZSBib3RoIHN0cmluZ3MuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAgY3JlYXRlQ29udGV4dFRyZWVGb3IoZmluYWwgU2V0IGNvbnRleHRJZHMpIHsKLQkJZmluYWwgTWFwIGNvbnRleHRUcmVlID0gbmV3IEhhc2hNYXAoKTsKLQotCQlmaW5hbCBJdGVyYXRvciBjb250ZXh0SWRJdHIgPSBjb250ZXh0SWRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb250ZXh0SWRJdHIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgY2hpbGRDb250ZXh0SWQgPSAoU3RyaW5nKSBjb250ZXh0SWRJdHIubmV4dCgpOwotCQkJd2hpbGUgKGNoaWxkQ29udGV4dElkICE9IG51bGwpIHsKLQkJCQkvLyBDaGVjayBpZiB3ZSd2ZSBhbHJlYWR5IGdvdCB0aGUgcGFydCBvZiB0aGUgdHJlZSBmcm9tIGhlcmUgdXAuCi0JCQkJaWYgKGNvbnRleHRUcmVlLmNvbnRhaW5zS2V5KGNoaWxkQ29udGV4dElkKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvLyBSZXRyaWV2ZSB0aGUgY29udGV4dC4KLQkJCQlmaW5hbCBDb250ZXh0IGNoaWxkQ29udGV4dCA9IGNvbnRleHRNYW5hZ2VyCi0JCQkJCQkuZ2V0Q29udGV4dChjaGlsZENvbnRleHRJZCk7Ci0KLQkJCQkvLyBBZGQgdGhlIGNoaWxkLXBhcmVudCBwYWlyIHRvIHRoZSB0cmVlLgotCQkJCXRyeSB7Ci0JCQkJCWZpbmFsIFN0cmluZyBwYXJlbnRDb250ZXh0SWQgPSBjaGlsZENvbnRleHQuZ2V0UGFyZW50SWQoKTsKLQkJCQkJY29udGV4dFRyZWUucHV0KGNoaWxkQ29udGV4dElkLCBwYXJlbnRDb250ZXh0SWQpOwotCQkJCQljaGlsZENvbnRleHRJZCA9IHBhcmVudENvbnRleHRJZDsKLQkJCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJYnJlYWs7IC8vIHN0b3AgYXNjZW5kaW5nCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbnRleHRUcmVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSB0cmVlIG9mIGNvbnRleHQgaWRlbnRpZmllcnMsIHJlcHJlc2VudGluZyB0aGUgaGllcmFyY2hpY2FsCi0JICogc3RydWN0dXJlIG9mIHRoZSBnaXZlbiBjb250ZXh0cy4gVGhlIHRyZWUgaXMgc3RydWN0dXJlZCBhcyBhIG1hcHBpbmcgZnJvbQotCSAqIGNoaWxkIHRvIHBhcmVudC4gSW4gdGhpcyB0cmVlLCB0aGUga2V5IGJpbmRpbmcgc3BlY2lmaWMgZmlsdGVyaW5nIG9mCi0JICogY29udGV4dHMgd2lsbCBoYXZlIHRha2VuIHBsYWNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gPGNvZGU+TyhuXjIpPC9jb2RlPiwgd2hlcmUgPGNvZGU+bjwvY29kZT4KLQkgKiBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBjb250ZXh0IHRyZWUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0SWRzCi0JICogICAgICAgICAgICBUaGUgc2V0IG9mIGNvbnRleHQgaWRlbnRpZmllcnMgdG8gYmUgY29udmVydGVkIGludG8gYSB0cmVlOwotCSAqICAgICAgICAgICAgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgdHJlZSBvZiBjb250ZXh0cyB0byB1c2U7IG1heSBiZSBlbXB0eSwgYnV0IG5ldmVyCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIGtleXMgYW5kIHZhbHVlcyBhcmUgYm90aCBzdHJpbmdzLgotCSAqLwotCXByaXZhdGUgZmluYWwgTWFwIGNyZWF0ZUZpbHRlcmVkQ29udGV4dFRyZWVGb3IoZmluYWwgU2V0IGNvbnRleHRJZHMpIHsKLQkJLy8gQ2hlY2sgdG8gc2VlIHdoZXRoZXIgYSBkaWFsb2cgb3Igd2luZG93IGlzIGFjdGl2ZS4KLQkJYm9vbGVhbiBkaWFsb2cgPSBmYWxzZTsKLQkJYm9vbGVhbiB3aW5kb3cgPSBmYWxzZTsKLQkJSXRlcmF0b3IgY29udGV4dElkSXRyID0gY29udGV4dElkcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoY29udGV4dElkSXRyLmhhc05leHQoKSkgewotCQkJZmluYWwgU3RyaW5nIGNvbnRleHRJZCA9IChTdHJpbmcpIGNvbnRleHRJZEl0ci5uZXh0KCk7Ci0JCQlpZiAoSUNvbnRleHRJZHMuQ09OVEVYVF9JRF9ESUFMT0cuZXF1YWxzKGNvbnRleHRJZCkpIHsKLQkJCQlkaWFsb2cgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKElDb250ZXh0SWRzLkNPTlRFWFRfSURfV0lORE9XLmVxdWFscyhjb250ZXh0SWQpKSB7Ci0JCQkJd2luZG93ID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFJlbW92ZSBhbGwgY29udGV4dCBpZGVudGlmaWVycyBmb3IgY29udGV4dHMgd2hvc2UgcGFyZW50cyBhcmUgZGlhbG9nCi0JCSAqIG9yIHdpbmRvdywgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRpYWxvZyBvciB3aW5kb3cgY29udGV4dCBpcyBub3QKLQkJICogYWN0aXZlLgotCQkgKi8KLQkJdHJ5IHsKLQkJCWNvbnRleHRJZEl0ciA9IGNvbnRleHRJZHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChjb250ZXh0SWRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIGNvbnRleHRJZCA9IChTdHJpbmcpIGNvbnRleHRJZEl0ci5uZXh0KCk7Ci0JCQkJQ29udGV4dCBjb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChjb250ZXh0SWQpOwotCQkJCVN0cmluZyBwYXJlbnRJZCA9IGNvbnRleHQuZ2V0UGFyZW50SWQoKTsKLQkJCQl3aGlsZSAocGFyZW50SWQgIT0gbnVsbCkgewotCQkJCQlpZiAoSUNvbnRleHRJZHMuQ09OVEVYVF9JRF9ESUFMT0cuZXF1YWxzKHBhcmVudElkKSkgewotCQkJCQkJaWYgKCFkaWFsb2cpIHsKLQkJCQkJCQljb250ZXh0SWRJdHIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoSUNvbnRleHRJZHMuQ09OVEVYVF9JRF9XSU5ET1cuZXF1YWxzKHBhcmVudElkKSkgewotCQkJCQkJaWYgKCF3aW5kb3cpIHsKLQkJCQkJCQljb250ZXh0SWRJdHIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoSUNvbnRleHRJZHMuQ09OVEVYVF9JRF9ESUFMT0dfQU5EX1dJTkRPVwotCQkJCQkJCS5lcXVhbHMocGFyZW50SWQpKSB7Ci0JCQkJCQlpZiAoKCF3aW5kb3cpICYmICghZGlhbG9nKSkgewotCQkJCQkJCWNvbnRleHRJZEl0ci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJY29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQocGFyZW50SWQpOwotCQkJCQlwYXJlbnRJZCA9IGNvbnRleHQuZ2V0UGFyZW50SWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJVHJhY2luZy5wcmludFRyYWNlKCJCSU5ESU5HUyIsICJOb3REZWZpbmVkRXhjZXB0aW9uKCciIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJKyBlLmdldE1lc3NhZ2UoKQotCQkJCQkJKyAiJykgd2hpbGUgZmlsdGVyaW5nIGRpYWxvZy93aW5kb3cgY29udGV4dHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNyZWF0ZUNvbnRleHRUcmVlRm9yKGNvbnRleHRJZHMpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIE5vdGlmaWVzIGFsbCBvZiB0aGUgbGlzdGVuZXJzIHRvIHRoaXMgbWFuYWdlciB0aGF0IHRoZSBkZWZpbmVkIG9yIGFjdGl2ZQotCSAqIHNjaGVtZXMgb2YgYmluZGluZ3MgaGF2ZSBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgdGltZSB0aGlzIG1ldGhvZCB0YWtlcyB0byBjb21wbGV0ZSBpcyBkZXBlbmRlbnQgb24gZXh0ZXJuYWwKLQkgKiBsaXN0ZW5lcnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgVGhlIGV2ZW50IHRvIHNlbmQgdG8gYWxsIG9mIHRoZSBsaXN0ZW5lcnM7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZmlyZUJpbmRpbmdNYW5hZ2VyQ2hhbmdlZChmaW5hbCBCaW5kaW5nTWFuYWdlckV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJZmluYWwgT2JqZWN0W10gbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBJQmluZGluZ01hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lciA9IChJQmluZGluZ01hbmFnZXJMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJbGlzdGVuZXIuYmluZGluZ01hbmFnZXJDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGFjdGl2ZSBiaW5kaW5ncy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8oMSk8L2NvZGU+LiBJZiB0aGUgYWN0aXZlIGJpbmRpbmdzIGFyZQotCSAqIG5vdCB5ZXQgY29tcHV0ZWQsIHRoZW4gdGhpcyBjb21wbGV0ZXMgaW4gPGNvZGU+Tyhubik8L2NvZGU+LCB3aGVyZQotCSAqIDxjb2RlPm48L2NvZGU+IGlzIHRoZSBudW1iZXIgb2YgYmluZGluZ3MuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG1hcCBvZiB0cmlnZ2VycyAoPGNvZGU+VHJpZ2dlclNlcXVlbmNlPC9jb2RlPikgdG8KLQkgKiAgICAgICAgIGJpbmRpbmdzICg8Y29kZT5CaW5kaW5nPC9jb2RlPikgd2hpY2ggYXJlIGN1cnJlbnRseSBhY3RpdmUuCi0JICogICAgICAgICBUaGlzIHZhbHVlIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gYWN0aXZlCi0JICogICAgICAgICBiaW5kaW5ncywgYW5kIGl0IG1heSBiZSBlbXB0eS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCBnZXRBY3RpdmVCaW5kaW5ncygpIHsKLQkJaWYgKGFjdGl2ZUJpbmRpbmdzID09IG51bGwpIHsKLQkJCXJlY29tcHV0ZUJpbmRpbmdzKCk7Ci0JCX0KLQotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGFjdGl2ZUJpbmRpbmdzKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBhY3RpdmUgYmluZGluZ3MgaW5kZXhlZCBieSBjb21tYW5kIGlkZW50aWZpZXIuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpbiA8Y29kZT5PKDEpPC9jb2RlPi4gSWYgdGhlIGFjdGl2ZSBiaW5kaW5ncyBhcmUKLQkgKiBub3QgeWV0IGNvbXB1dGVkLCB0aGVuIHRoaXMgY29tcGxldGVzIGluIDxjb2RlPk8obm4pPC9jb2RlPiwgd2hlcmUKLQkgKiA8Y29kZT5uPC9jb2RlPiBpcyB0aGUgbnVtYmVyIG9mIGJpbmRpbmdzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBtYXAgb2YgZnVsbHktcGFyYW1ldGVyaXplZCBjb21tYW5kcyAoPGNvZGU+UGFyYW1ldGVyaXplZENvbW1hbmQ8L2NvZGU+KQotCSAqICAgICAgICAgdG8gdHJpZ2dlcnMgKDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pIHdoaWNoIGFyZQotCSAqICAgICAgICAgY3VycmVudGx5IGFjdGl2ZS4gVGhpcyB2YWx1ZSBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUKLQkgKiAgICAgICAgIGFyZSBubyBhY3RpdmUgYmluZGluZ3MsIGFuZCBpdCBtYXkgYmUgZW1wdHkuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAgZ2V0QWN0aXZlQmluZGluZ3NCeVBhcmFtZXRlcml6ZWRDb21tYW5kKCkgewotCQlpZiAoYWN0aXZlQmluZGluZ3NCeVBhcmFtZXRlcml6ZWRDb21tYW5kID09IG51bGwpIHsKLQkJCXJlY29tcHV0ZUJpbmRpbmdzKCk7Ci0JCX0KLQotCQlyZXR1cm4gQ29sbGVjdGlvbnMKLQkJCQkudW5tb2RpZmlhYmxlTWFwKGFjdGl2ZUJpbmRpbmdzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29tcHV0ZXMgdGhlIGJpbmRpbmdzIGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwbGljYXRpb24sIGJ1dAotCSAqIGRpc3JlZ2FyZGluZyB0aGUgY3VycmVudCBjb250ZXh0cy4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdHJ5aW5nIHRvCi0JICogZGlzcGxheSBhbGwgdGhlIHBvc3NpYmxlIGJpbmRpbmdzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gPGNvZGU+TyhuKTwvY29kZT4sIHdoZXJlIDxjb2RlPm48L2NvZGU+IGlzCi0JICogdGhlIG51bWJlciBvZiBiaW5kaW5ncy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBBIG1hcCBvZiB0cmlnZ2VyICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KSB0byBiaW5kaW5ncyAoCi0JICogICAgICAgICA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPkJpbmRpbmc8L2NvZGU+KS4KLQkgKiAgICAgICAgIFRoaXMgbWFwIG1heSBiZSBlbXB0eSwgYnV0IGl0IGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0QWN0aXZlQmluZGluZ3NEaXNyZWdhcmRpbmdDb250ZXh0KCkgewotCQlpZiAoYmluZGluZ3MgPT0gbnVsbCkgewotCQkJLy8gTm90IHlldCBpbml0aWFsaXplZC4gVGhpcyBpcyBoYXBwZW5pbmcgdG9vIGVhcmx5LiBEbyBub3RoaW5nLgotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCi0JCS8vIEJ1aWxkIGEgY2FjaGVkIGJpbmRpbmcgc2V0IGZvciB0aGF0IHN0YXRlLgotCQlmaW5hbCBDYWNoZWRCaW5kaW5nU2V0IGJpbmRpbmdDYWNoZSA9IG5ldyBDYWNoZWRCaW5kaW5nU2V0KG51bGwsCi0JCQkJbG9jYWxlcywgcGxhdGZvcm1zLCBhY3RpdmVTY2hlbWVJZHMpOwotCi0JCS8qCi0JCSAqIENoZWNrIGlmIHRoZSBjYWNoZWQgYmluZGluZyBzZXQgYWxyZWFkeSBleGlzdHMuIElmIHNvLCBzaW1wbHkgc2V0IHRoZQotCQkgKiBhY3RpdmUgYmluZGluZ3MgYW5kIHJldHVybi4KLQkJICovCi0JCUNhY2hlZEJpbmRpbmdTZXQgZXhpc3RpbmdDYWNoZSA9IChDYWNoZWRCaW5kaW5nU2V0KSBjYWNoZWRCaW5kaW5ncwotCQkJCS5nZXQoYmluZGluZ0NhY2hlKTsKLQkJaWYgKGV4aXN0aW5nQ2FjaGUgPT0gbnVsbCkgewotCQkJZXhpc3RpbmdDYWNoZSA9IGJpbmRpbmdDYWNoZTsKLQkJCWNhY2hlZEJpbmRpbmdzLnB1dChleGlzdGluZ0NhY2hlLCBleGlzdGluZ0NhY2hlKTsKLQkJfQotCQlNYXAgY29tbWFuZElkc0J5VHJpZ2dlciA9IGV4aXN0aW5nQ2FjaGUuZ2V0QmluZGluZ3NCeVRyaWdnZXIoKTsKLQkJaWYgKGNvbW1hbmRJZHNCeVRyaWdnZXIgIT0gbnVsbCkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJVHJhY2luZy5wcmludFRyYWNlKCJCSU5ESU5HUyIsICJDYWNoZSBoaXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoY29tbWFuZElkc0J5VHJpZ2dlcik7Ci0JCX0KLQotCQkvLyBUaGVyZSBpcyBubyBjYWNoZWQgZW50cnkgZm9yIHRoaXMuCi0JCWlmIChERUJVRykgewotCQkJVHJhY2luZy5wcmludFRyYWNlKCJCSU5ESU5HUyIsICJDYWNoZSBtaXNzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJLy8gQ29tcHV0ZSB0aGUgYWN0aXZlIGJpbmRpbmdzLgotCQljb21tYW5kSWRzQnlUcmlnZ2VyID0gbmV3IEhhc2hNYXAoKTsKLQkJZmluYWwgTWFwIHRyaWdnZXJzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNvbXB1dGVCaW5kaW5ncyhudWxsLCBjb21tYW5kSWRzQnlUcmlnZ2VyLAotCQkJCXRyaWdnZXJzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCk7Ci0JCWV4aXN0aW5nQ2FjaGUuc2V0QmluZGluZ3NCeVRyaWdnZXIoY29tbWFuZElkc0J5VHJpZ2dlcik7Ci0JCWV4aXN0aW5nQ2FjaGUuc2V0VHJpZ2dlcnNCeUNvbW1hbmRJZCh0cmlnZ2Vyc0J5UGFyYW1ldGVyaXplZENvbW1hbmQpOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGNvbW1hbmRJZHNCeVRyaWdnZXIpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbXB1dGVzIHRoZSBiaW5kaW5ncyBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uLCBidXQKLQkgKiBkaXNyZWdhcmRpbmcgdGhlIGN1cnJlbnQgY29udGV4dHMuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRyeWluZyB0bwotCSAqIGRpc3BsYXkgYWxsIHRoZSBwb3NzaWJsZSBiaW5kaW5ncy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8obik8L2NvZGU+LCB3aGVyZSA8Y29kZT5uPC9jb2RlPiBpcwotCSAqIHRoZSBudW1iZXIgb2YgYmluZGluZ3MuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gQSBtYXAgb2YgdHJpZ2dlciAoPGNvZGU+VHJpZ2dlclNlcXVlbmNlPC9jb2RlPikgdG8gYmluZGluZ3MgKAotCSAqICAgICAgICAgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4gY29udGFpbmluZyA8Y29kZT5CaW5kaW5nPC9jb2RlPikuCi0JICogICAgICAgICBUaGlzIG1hcCBtYXkgYmUgZW1wdHksIGJ1dCBpdCBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAgZ2V0QWN0aXZlQmluZGluZ3NEaXNyZWdhcmRpbmdDb250ZXh0QnlQYXJhbWV0ZXJpemVkQ29tbWFuZCgpIHsKLQkJaWYgKGJpbmRpbmdzID09IG51bGwpIHsKLQkJCS8vIE5vdCB5ZXQgaW5pdGlhbGl6ZWQuIFRoaXMgaXMgaGFwcGVuaW5nIHRvbyBlYXJseS4gRG8gbm90aGluZy4KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCX0KLQotCQkvLyBCdWlsZCBhIGNhY2hlZCBiaW5kaW5nIHNldCBmb3IgdGhhdCBzdGF0ZS4KLQkJZmluYWwgQ2FjaGVkQmluZGluZ1NldCBiaW5kaW5nQ2FjaGUgPSBuZXcgQ2FjaGVkQmluZGluZ1NldChudWxsLAotCQkJCWxvY2FsZXMsIHBsYXRmb3JtcywgYWN0aXZlU2NoZW1lSWRzKTsKLQotCQkvKgotCQkgKiBDaGVjayBpZiB0aGUgY2FjaGVkIGJpbmRpbmcgc2V0IGFscmVhZHkgZXhpc3RzLiBJZiBzbywgc2ltcGx5IHNldCB0aGUKLQkJICogYWN0aXZlIGJpbmRpbmdzIGFuZCByZXR1cm4uCi0JCSAqLwotCQlDYWNoZWRCaW5kaW5nU2V0IGV4aXN0aW5nQ2FjaGUgPSAoQ2FjaGVkQmluZGluZ1NldCkgY2FjaGVkQmluZGluZ3MKLQkJCQkuZ2V0KGJpbmRpbmdDYWNoZSk7Ci0JCWlmIChleGlzdGluZ0NhY2hlID09IG51bGwpIHsKLQkJCWV4aXN0aW5nQ2FjaGUgPSBiaW5kaW5nQ2FjaGU7Ci0JCQljYWNoZWRCaW5kaW5ncy5wdXQoZXhpc3RpbmdDYWNoZSwgZXhpc3RpbmdDYWNoZSk7Ci0JCX0KLQkJTWFwIHRyaWdnZXJzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCA9IGV4aXN0aW5nQ2FjaGUKLQkJCQkuZ2V0VHJpZ2dlcnNCeUNvbW1hbmRJZCgpOwotCQlpZiAodHJpZ2dlcnNCeVBhcmFtZXRlcml6ZWRDb21tYW5kICE9IG51bGwpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVRyYWNpbmcucHJpbnRUcmFjZSgiQklORElOR1MiLCAiQ2FjaGUgaGl0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRyaWdnZXJzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCk7Ci0JCX0KLQotCQkvLyBUaGVyZSBpcyBubyBjYWNoZWQgZW50cnkgZm9yIHRoaXMuCi0JCWlmIChERUJVRykgewotCQkJVHJhY2luZy5wcmludFRyYWNlKCJCSU5ESU5HUyIsICJDYWNoZSBtaXNzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJLy8gQ29tcHV0ZSB0aGUgYWN0aXZlIGJpbmRpbmdzLgotCQlmaW5hbCBNYXAgY29tbWFuZElkc0J5VHJpZ2dlciA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRyaWdnZXJzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNvbXB1dGVCaW5kaW5ncyhudWxsLCBjb21tYW5kSWRzQnlUcmlnZ2VyLAotCQkJCXRyaWdnZXJzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCk7Ci0JCWV4aXN0aW5nQ2FjaGUuc2V0QmluZGluZ3NCeVRyaWdnZXIoY29tbWFuZElkc0J5VHJpZ2dlcik7Ci0JCWV4aXN0aW5nQ2FjaGUuc2V0VHJpZ2dlcnNCeUNvbW1hbmRJZCh0cmlnZ2Vyc0J5UGFyYW1ldGVyaXplZENvbW1hbmQpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odHJpZ2dlcnNCeVBhcmFtZXRlcml6ZWRDb21tYW5kKTsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0cmlnZ2Vyc0J5UGFyYW1ldGVyaXplZENvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbXB1dGVzIHRoZSBiaW5kaW5ncyBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uLCBidXQKLQkgKiBkaXNyZWdhcmRpbmcgdGhlIGN1cnJlbnQgY29udGV4dHMuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRyeWluZyB0bwotCSAqIGRpc3BsYXkgYWxsIHRoZSBwb3NzaWJsZSBiaW5kaW5ncy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8obik8L2NvZGU+LCB3aGVyZSA8Y29kZT5uPC9jb2RlPiBpcwotCSAqIHRoZSBudW1iZXIgb2YgYmluZGluZ3MuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gQWxsIG9mIHRoZSBhY3RpdmUgYmluZGluZ3MgKDxjb2RlPkJpbmRpbmc8L2NvZGU+KSwgbm90IHNvcnRlZAotCSAqICAgICAgICAgaW4gYW55IGZhc2hpb24uIFRoaXMgY29sbGVjdGlvbiBtYXkgYmUgZW1wdHksIGJ1dCBpdCBpcyBuZXZlcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIENvbGxlY3Rpb24gZ2V0QWN0aXZlQmluZGluZ3NEaXNyZWdhcmRpbmdDb250ZXh0RmxhdCgpIHsKLQkJZmluYWwgQ29sbGVjdGlvbiBiaW5kaW5nQ29sbGVjdGlvbnMgPSBnZXRBY3RpdmVCaW5kaW5nc0Rpc3JlZ2FyZGluZ0NvbnRleHQoKQotCQkJCS52YWx1ZXMoKTsKLQkJZmluYWwgQ29sbGVjdGlvbiBtZXJnZWRCaW5kaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmluYWwgSXRlcmF0b3IgYmluZGluZ0NvbGxlY3Rpb25JdHIgPSBiaW5kaW5nQ29sbGVjdGlvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGJpbmRpbmdDb2xsZWN0aW9uSXRyLmhhc05leHQoKSkgewotCQkJZmluYWwgQ29sbGVjdGlvbiBiaW5kaW5nQ29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBiaW5kaW5nQ29sbGVjdGlvbkl0cgotCQkJCQkubmV4dCgpOwotCQkJaWYgKChiaW5kaW5nQ29sbGVjdGlvbiAhPSBudWxsKSAmJiAoIWJpbmRpbmdDb2xsZWN0aW9uLmlzRW1wdHkoKSkpIHsKLQkJCQltZXJnZWRCaW5kaW5ncy5hZGRBbGwoYmluZGluZ0NvbGxlY3Rpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1lcmdlZEJpbmRpbmdzOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGFjdGl2ZSBiaW5kaW5ncyBmb3IgYSBwYXJ0aWN1bGFyIGNvbW1hbmQgaWRlbnRpZmllciwgYnV0Ci0JICogZGlzY291bnRpbmcgdGhlIGN1cnJlbnQgY29udGV4dHMuIFRoaXMgbWV0aG9kIG9wZXJhdGVzIGluIE8obikgdGltZSBvdmVyCi0JICogdGhlIG51bWJlciBvZiBiaW5kaW5ncy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8oMSk8L2NvZGU+LiBJZiB0aGUgYWN0aXZlIGJpbmRpbmdzIGFyZQotCSAqIG5vdCB5ZXQgY29tcHV0ZWQsIHRoZW4gdGhpcyBjb21wbGV0ZXMgaW4gPGNvZGU+Tyhubik8L2NvZGU+LCB3aGVyZQotCSAqIDxjb2RlPm48L2NvZGU+IGlzIHRoZSBudW1iZXIgb2YgYmluZGluZ3MuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJhbWV0ZXJpemVkQ29tbWFuZAotCSAqICAgICAgICAgICAgVGhlIGZ1bGx5LXBhcmFtZXRlcml6ZWQgY29tbWFuZCB3aG9zZSBiaW5kaW5ncyBhcmUgcmVxdWVzdGVkLgotCSAqICAgICAgICAgICAgVGhpcyBhcmd1bWVudCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgYXJyYXkgb2YgYWN0aXZlIHRyaWdnZXJzICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KQotCSAqICAgICAgICAgZm9yIGEgcGFydGljdWxhciBjb21tYW5kIGlkZW50aWZpZXIuIFRoaXMgdmFsdWUgaXMgZ3VhcmFudGVlZCB0bwotCSAqICAgICAgICAgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGJ1dCBpdCBtYXkgYmUgZW1wdHkuCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBmaW5hbCBUcmlnZ2VyU2VxdWVuY2VbXSBnZXRBY3RpdmVCaW5kaW5nc0Rpc3JlZ2FyZGluZ0NvbnRleHRGb3IoCi0JCQlmaW5hbCBQYXJhbWV0ZXJpemVkQ29tbWFuZCBwYXJhbWV0ZXJpemVkQ29tbWFuZCkgewotCQlmaW5hbCBPYmplY3Qgb2JqZWN0ID0gZ2V0QWN0aXZlQmluZGluZ3NEaXNyZWdhcmRpbmdDb250ZXh0QnlQYXJhbWV0ZXJpemVkQ29tbWFuZCgpCi0JCQkJLmdldChwYXJhbWV0ZXJpemVkQ29tbWFuZCk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQlmaW5hbCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgb2JqZWN0OwotCQkJcmV0dXJuIChUcmlnZ2VyU2VxdWVuY2VbXSkgY29sbGVjdGlvbgotCQkJCQkudG9BcnJheShuZXcgVHJpZ2dlclNlcXVlbmNlW2NvbGxlY3Rpb24uc2l6ZSgpXSk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFRyaWdnZXJTZXF1ZW5jZVswXTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBhY3RpdmUgYmluZGluZ3MgZm9yIGEgcGFydGljdWxhciBjb21tYW5kIGlkZW50aWZpZXIuIFRoaXMKLQkgKiBtZXRob2Qgb3BlcmF0ZXMgaW4gTyhuKSB0aW1lIG92ZXIgdGhlIG51bWJlciBvZiBiaW5kaW5ncy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8oMSk8L2NvZGU+LiBJZiB0aGUgYWN0aXZlIGJpbmRpbmdzIGFyZQotCSAqIG5vdCB5ZXQgY29tcHV0ZWQsIHRoZW4gdGhpcyBjb21wbGV0ZXMgaW4gPGNvZGU+Tyhubik8L2NvZGU+LCB3aGVyZQotCSAqIDxjb2RlPm48L2NvZGU+IGlzIHRoZSBudW1iZXIgb2YgYmluZGluZ3MuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJhbWV0ZXJpemVkQ29tbWFuZAotCSAqICAgICAgICAgICAgVGhlIGZ1bGx5LXBhcmFtZXRlcml6ZWQgY29tbWFuZCB3aG9zZSBiaW5kaW5ncyBhcmUgcmVxdWVzdGVkLgotCSAqICAgICAgICAgICAgVGhpcyBhcmd1bWVudCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgYXJyYXkgb2YgYWN0aXZlIHRyaWdnZXJzICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KQotCSAqICAgICAgICAgZm9yIGEgcGFydGljdWxhciBjb21tYW5kIGlkZW50aWZpZXIuIFRoaXMgdmFsdWUgaXMgZ3VhcmFudGVlZCB0bwotCSAqICAgICAgICAgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGJ1dCBpdCBtYXkgYmUgZW1wdHkuCi0JICovCi0JcHVibGljIGZpbmFsIFRyaWdnZXJTZXF1ZW5jZVtdIGdldEFjdGl2ZUJpbmRpbmdzRm9yKAotCQkJZmluYWwgUGFyYW1ldGVyaXplZENvbW1hbmQgcGFyYW1ldGVyaXplZENvbW1hbmQpIHsKLQkJZmluYWwgT2JqZWN0IG9iamVjdCA9IGdldEFjdGl2ZUJpbmRpbmdzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCgpLmdldCgKLQkJCQlwYXJhbWV0ZXJpemVkQ29tbWFuZCk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQlmaW5hbCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgb2JqZWN0OwotCQkJcmV0dXJuIChUcmlnZ2VyU2VxdWVuY2VbXSkgY29sbGVjdGlvbgotCQkJCQkudG9BcnJheShuZXcgVHJpZ2dlclNlcXVlbmNlW2NvbGxlY3Rpb24uc2l6ZSgpXSk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFRyaWdnZXJTZXF1ZW5jZVswXTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBhY3RpdmUgYmluZGluZ3MgZm9yIGEgcGFydGljdWxhciBjb21tYW5kIGlkZW50aWZpZXIuIFRoaXMKLQkgKiBtZXRob2Qgb3BlcmF0ZXMgaW4gTyhuKSB0aW1lIG92ZXIgdGhlIG51bWJlciBvZiBiaW5kaW5ncy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8oMSk8L2NvZGU+LiBJZiB0aGUgYWN0aXZlIGJpbmRpbmdzIGFyZQotCSAqIG5vdCB5ZXQgY29tcHV0ZWQsIHRoZW4gdGhpcyBjb21wbGV0ZXMgaW4gPGNvZGU+Tyhubik8L2NvZGU+LCB3aGVyZQotCSAqIDxjb2RlPm48L2NvZGU+IGlzIHRoZSBudW1iZXIgb2YgYmluZGluZ3MuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb21tYW5kIHdob3NlIGJpbmRpbmdzIGFyZSByZXF1ZXN0ZWQuCi0JICogICAgICAgICAgICBUaGlzIGFyZ3VtZW50IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSXQgaXMgYXNzdW1lZCB0aGF0Ci0JICogICAgICAgICAgICB0aGUgY29tbWFuZCBoYXMgbm8gcGFyYW1ldGVycy4KLQkgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBhY3RpdmUgdHJpZ2dlcnMgKDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pCi0JICogICAgICAgICBmb3IgYSBwYXJ0aWN1bGFyIGNvbW1hbmQgaWRlbnRpZmllci4gVGhpcyB2YWx1ZSBpcyBndWFyYW50ZWVkIG5vdAotCSAqICAgICAgICAgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4sIGJ1dCBpdCBtYXkgYmUgZW1wdHkuCi0JICovCi0JcHVibGljIGZpbmFsIFRyaWdnZXJTZXF1ZW5jZVtdIGdldEFjdGl2ZUJpbmRpbmdzRm9yKGZpbmFsIFN0cmluZyBjb21tYW5kSWQpIHsKLQkJZmluYWwgUGFyYW1ldGVyaXplZENvbW1hbmQgcGFyYW1ldGVyaXplZENvbW1hbmQgPSBuZXcgUGFyYW1ldGVyaXplZENvbW1hbmQoCi0JCQkJY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZChjb21tYW5kSWQpLCBudWxsKTsKLQkJZmluYWwgT2JqZWN0IG9iamVjdCA9IGdldEFjdGl2ZUJpbmRpbmdzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCgpLmdldCgKLQkJCQlwYXJhbWV0ZXJpemVkQ29tbWFuZCk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQlmaW5hbCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgb2JqZWN0OwotCQkJcmV0dXJuIChUcmlnZ2VyU2VxdWVuY2VbXSkgY29sbGVjdGlvbgotCQkJCQkudG9BcnJheShuZXcgVHJpZ2dlclNlcXVlbmNlW2NvbGxlY3Rpb24uc2l6ZSgpXSk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFRyaWdnZXJTZXF1ZW5jZVswXTsKLQl9Ci0KLQkvKioKLQkgKiBBIHZhcmlhdGlvbiBvbiB7QGxpbmsgQmluZGluZ01hbmFnZXIjZ2V0QWN0aXZlQmluZGluZ3NGb3IoU3RyaW5nKX0gdGhhdAotCSAqIHJldHVybnMgYW4gYXJyYXkgb2YgYmluZGluZ3MsIHJhdGhlciB0aGFuIHRyaWdnZXIgc2VxdWVuY2VzLiBUaGlzIG1ldGhvZAotCSAqIGlzIG5lZWRlZCBmb3IgZG9pbmcgImJlc3QiIGNhbGN1bGF0aW9uZ3Mgb24gdGhlIGFjdGl2ZSBiaW5kaW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZElkCi0JICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29tbWFuZCBmb3Igd2hpY2ggdGhlIGFjdGl2ZSBiaW5kaW5ncwotCSAqICAgICAgICAgICAgc2hvdWxkIGJlIHJldHJpZXZlZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgYWN0aXZlIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gY29tbWFuZDsgdGhpcyB2YWx1ZSBtYXkgYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBhY3RpdmUgYmluZGluZ3MuCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByaXZhdGUgZmluYWwgQmluZGluZ1tdIGdldEFjdGl2ZUJpbmRpbmdzRm9yMShmaW5hbCBTdHJpbmcgY29tbWFuZElkKSB7Ci0JCWZpbmFsIFRyaWdnZXJTZXF1ZW5jZVtdIHRyaWdnZXJzID0gZ2V0QWN0aXZlQmluZGluZ3NGb3IoY29tbWFuZElkKTsKLQkJaWYgKHRyaWdnZXJzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZpbmFsIE1hcCBhY3RpdmVCaW5kaW5ncyA9IGdldEFjdGl2ZUJpbmRpbmdzKCk7Ci0JCWlmIChhY3RpdmVCaW5kaW5ncyAhPSBudWxsKSB7Ci0JCQlmaW5hbCBCaW5kaW5nW10gYmluZGluZ3MgPSBuZXcgQmluZGluZ1t0cmlnZ2Vycy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmlnZ2Vycy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIFRyaWdnZXJTZXF1ZW5jZSB0cmlnZ2VyU2VxdWVuY2UgPSB0cmlnZ2Vyc1tpXTsKLQkJCQlmaW5hbCBPYmplY3Qgb2JqZWN0ID0gYWN0aXZlQmluZGluZ3MuZ2V0KHRyaWdnZXJTZXF1ZW5jZSk7Ci0JCQkJZmluYWwgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIG9iamVjdDsKLQkJCQliaW5kaW5nc1tpXSA9IGJpbmRpbmc7Ci0JCQl9Ci0JCQlyZXR1cm4gYmluZGluZ3M7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBHZXRzIHRoZSBjdXJyZW50bHkgYWN0aXZlIHNjaGVtZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8oMSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBhY3RpdmUgc2NoZW1lOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIGFjdGl2ZSBzY2hlbWUuIElmIGEgc2NoZW1lIGlzIHJldHVybmVkLCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlCi0JICogICAgICAgICBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBTY2hlbWUgZ2V0QWN0aXZlU2NoZW1lKCkgewotCQlyZXR1cm4gYWN0aXZlU2NoZW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGJlc3QgYWN0aXZlIGJpbmRpbmcgZm9yIGEgY29tbWFuZC4gVGhlIGJlc3QgYmluZGluZyBpcyB0aGUgb25lCi0JICogdGhhdCB3b3VsZCBiZSBtb3N0IGFwcHJvcHJpYXRlIHRvIHNob3cgaW4gYSBtZW51LiBCaW5kaW5ncyB3aGljaCBiZWxvbmcKLQkgKiB0byBhIGNoaWxkIHNjaGVtZSBhcmUgZ2l2ZW4gcHJlZmVyZW5jZSBvdmVyIHRob3NlIGluIGEgcGFyZW50IHNjaGVtZS4gVGhlCi0JICogcmVzdCBvZiB0aGUgY2FsY3VsYXRvbiBpcyBiYXNlZCBtb3N0IG9uIHZhcmlvdXMgY29uY2VwdHMgb2YgImxlbmd0aCIsIGFzCi0JICogd2VsbCBhcyBnaXZpbmcgc29tZSBtb2RpZmllciBrZXlzIHByZWZlcmVuY2UgKGUuZy4sIDxjb2RlPkFsdDwvY29kZT4gaXMKLQkgKiBsZXNzIGxpa2VseSB0byBhcHBlYXIgdGhhbiA8Y29kZT5DdHJsPC9jb2RlPikuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbW1hbmQgZm9yIHdoaWNoIHRoZSBiZXN0IGFjdGl2ZQotCSAqICAgICAgICAgICAgYmluZGluZyBzaG91bGQgYmUgcmV0cmlldmVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIFRoZSB0cmlnZ2VyIHNlcXVlbmNlIGZvciB0aGUgYmVzdCBiaW5kaW5nOyBtYXkgYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGJpbmRpbmdzIGFyZSBhY3RpdmUgZm9yIHRoZSBnaXZlbgotCSAqICAgICAgICAgY29tbWFuZC4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIGZpbmFsIFRyaWdnZXJTZXF1ZW5jZSBnZXRCZXN0QWN0aXZlQmluZGluZ0ZvcihmaW5hbCBTdHJpbmcgY29tbWFuZElkKSB7Ci0JCWZpbmFsIEJpbmRpbmdbXSBiaW5kaW5ncyA9IGdldEFjdGl2ZUJpbmRpbmdzRm9yMShjb21tYW5kSWQpOwotCQlpZiAoKGJpbmRpbmdzID09IG51bGwpIHx8IChiaW5kaW5ncy5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQmluZGluZyBiZXN0QmluZGluZyA9IGJpbmRpbmdzWzBdOwotCQlpbnQgY29tcGFyZVRvOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBCaW5kaW5nIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ3NbaV07Ci0KLQkJCS8vIEJpbmRpbmdzIGluIGEgY2hpbGQgc2NoZW1lIGFyZSBhbHdheXMgZ2l2ZW4gcHJlZmVyZW5jZS4KLQkJCWZpbmFsIFN0cmluZyBiZXN0U2NoZW1lSWQgPSBiZXN0QmluZGluZy5nZXRTY2hlbWVJZCgpOwotCQkJZmluYWwgU3RyaW5nIGN1cnJlbnRTY2hlbWVJZCA9IGN1cnJlbnRCaW5kaW5nLmdldFNjaGVtZUlkKCk7Ci0JCQljb21wYXJlVG8gPSBjb21wYXJlU2NoZW1lcyhiZXN0U2NoZW1lSWQsIGN1cnJlbnRTY2hlbWVJZCk7Ci0JCQlpZiAoY29tcGFyZVRvID4gMCkgewotCQkJCWJlc3RCaW5kaW5nID0gY3VycmVudEJpbmRpbmc7Ci0JCQl9Ci0JCQlpZiAoY29tcGFyZVRvICE9IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIENoZWNrIHRvIHNlZSB3aGljaCBoYXMgdGhlIGxlYXN0IG51bWJlciBvZiB0cmlnZ2VycyBpbiB0aGUKLQkJCSAqIHRyaWdnZXIgc2VxdWVuY2UuCi0JCQkgKi8KLQkJCWZpbmFsIFRyaWdnZXJTZXF1ZW5jZSBiZXN0VHJpZ2dlclNlcXVlbmNlID0gYmVzdEJpbmRpbmcKLQkJCQkJLmdldFRyaWdnZXJTZXF1ZW5jZSgpOwotCQkJZmluYWwgVHJpZ2dlclNlcXVlbmNlIGN1cnJlbnRUcmlnZ2VyU2VxdWVuY2UgPSBjdXJyZW50QmluZGluZwotCQkJCQkuZ2V0VHJpZ2dlclNlcXVlbmNlKCk7Ci0JCQlmaW5hbCBUcmlnZ2VyW10gYmVzdFRyaWdnZXJzID0gYmVzdFRyaWdnZXJTZXF1ZW5jZS5nZXRUcmlnZ2VycygpOwotCQkJZmluYWwgVHJpZ2dlcltdIGN1cnJlbnRUcmlnZ2VycyA9IGN1cnJlbnRUcmlnZ2VyU2VxdWVuY2UKLQkJCQkJLmdldFRyaWdnZXJzKCk7Ci0JCQljb21wYXJlVG8gPSBiZXN0VHJpZ2dlcnMubGVuZ3RoIC0gY3VycmVudFRyaWdnZXJzLmxlbmd0aDsKLQkJCWlmIChjb21wYXJlVG8gPiAwKSB7Ci0JCQkJYmVzdEJpbmRpbmcgPSBjdXJyZW50QmluZGluZzsKLQkJCX0KLQkJCWlmIChjb21wYXJlVG8gIT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKgotCQkJICogQ29tcGFyZSB0aGUgbnVtYmVyIG9mIGtleXMgcHJlc3NlZCBpbiBlYWNoIHRyaWdnZXIgc2VxdWVuY2UuIFNvbWUKLQkJCSAqIHR5cGVzIG9mIGtleXMgY291bnQgbGVzcyB0aGFuIG90aGVycyAoaS5lLiwgc29tZSB0eXBlcyBvZgotCQkJICogbW9kaWZpZXJzIGtleXMgYXJlIGxlc3MgbGlrZWx5IHRvIGJlIGNob3NlbikuCi0JCQkgKi8KLQkJCWNvbXBhcmVUbyA9IGNvdW50U3Ryb2tlcyhiZXN0VHJpZ2dlcnMpCi0JCQkJCS0gY291bnRTdHJva2VzKGN1cnJlbnRUcmlnZ2Vycyk7Ci0JCQlpZiAoY29tcGFyZVRvID4gMCkgewotCQkJCWJlc3RCaW5kaW5nID0gY3VycmVudEJpbmRpbmc7Ci0JCQl9Ci0JCQlpZiAoY29tcGFyZVRvICE9IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gSWYgdGhpcyBpcyBzdGlsbCBhIHRpZSwgdGhlbiBqdXN0IGNob3NlIHRoZSBzaG9ydGVzdCB0ZXh0LgotCQkJY29tcGFyZVRvID0gYmVzdFRyaWdnZXJTZXF1ZW5jZS5mb3JtYXQoKS5sZW5ndGgoKQotCQkJCQktIGN1cnJlbnRUcmlnZ2VyU2VxdWVuY2UuZm9ybWF0KCkubGVuZ3RoKCk7Ci0JCQlpZiAoY29tcGFyZVRvID4gMCkgewotCQkJCWJlc3RCaW5kaW5nID0gY3VycmVudEJpbmRpbmc7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYmVzdEJpbmRpbmcuZ2V0VHJpZ2dlclNlcXVlbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgc2V0IG9mIGFsbCBiaW5kaW5ncyBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpbiA8Y29kZT5PKDEpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBUaGUgYXJyYXkgb2YgYWxsIGJpbmRpbmdzLiBUaGlzIHZhbHVlIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgYW5kIGl0IG1heSBiZSBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgQmluZGluZ1tdIGdldEJpbmRpbmdzKCkgewotCQlpZiAoYmluZGluZ3MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmaW5hbCBCaW5kaW5nW10gcmV0dXJuVmFsdWUgPSBuZXcgQmluZGluZ1tiaW5kaW5nQ291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGJpbmRpbmdzLCAwLCByZXR1cm5WYWx1ZSwgMCwgYmluZGluZ0NvdW50KTsKLQkJcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGFycmF5IG9mIHNjaGVtZXMgdGhhdCBhcmUgZGVmaW5lZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8oMSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBkZWZpbmVkIHNjaGVtZXM7IHRoaXMgdmFsdWUgbWF5IGJlIGVtcHR5IG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU2NoZW1lW10gZ2V0RGVmaW5lZFNjaGVtZXMoKSB7Ci0JCXJldHVybiAoU2NoZW1lW10pIGRlZmluZWRIYW5kbGVPYmplY3RzCi0JCQkJLnRvQXJyYXkobmV3IFNjaGVtZVtkZWZpbmVkSGFuZGxlT2JqZWN0cy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBhY3RpdmUgbG9jYWxlIGZvciB0aGlzIGJpbmRpbmcgbWFuYWdlci4gVGhlIGxvY2FsZSBpcyBpbiB0aGUKLQkgKiBzYW1lIGZvcm1hdCBhcyA8Y29kZT5Mb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gPGNvZGU+TygxKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGFjdGl2ZSBsb2NhbGU7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TG9jYWxlKCkgewotCQlyZXR1cm4gbG9jYWxlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYWxsIG9mIHRoZSBwb3NzaWJsZSBiaW5kaW5ncyB0aGF0IHN0YXJ0IHdpdGggdGhlIGdpdmVuIHRyaWdnZXIKLQkgKiAoYnV0IGFyZSBub3QgZXF1YWwgdG8gdGhlIGdpdmVuIHRyaWdnZXIpLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gPGNvZGU+TygxKTwvY29kZT4uIElmIHRoZSBiaW5kaW5ncyBhcmVuJ3QKLQkgKiBjdXJyZW50bHkgY29tcHV0ZWQsIHRoZW4gdGhpcyBjb21wbGV0ZXMgaW4gPGNvZGU+TyhuKTwvY29kZT4sIHdoZXJlCi0JICogPGNvZGU+bjwvY29kZT4gaXMgdGhlIG51bWJlciBvZiBiaW5kaW5ncy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHRyaWdnZXIKLQkgKiAgICAgICAgICAgIFRoZSBwcmVmaXggdG8gbG9vayBmb3I7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gQSBtYXAgb2YgdHJpZ2dlcnMgKDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pIHRvIGJpbmRpbmdzICg8Y29kZT5CaW5kaW5nPC9jb2RlPikuCi0JICogICAgICAgICBUaGlzIG1hcCBtYXkgYmUgZW1wdHksIGJ1dCBpdCBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgTWFwIGdldFBhcnRpYWxNYXRjaGVzKGZpbmFsIFRyaWdnZXJTZXF1ZW5jZSB0cmlnZ2VyKSB7Ci0JCWZpbmFsIE1hcCBwYXJ0aWFsTWF0Y2hlcyA9IChNYXApIGdldFByZWZpeFRhYmxlKCkuZ2V0KHRyaWdnZXIpOwotCQlpZiAocGFydGlhbE1hdGNoZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCi0JCXJldHVybiBwYXJ0aWFsTWF0Y2hlczsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBjb21tYW5kIGlkZW50aWZpZXIgZm9yIHRoZSBhY3RpdmUgYmluZGluZyBtYXRjaGluZyB0aGlzCi0JICogdHJpZ2dlciwgaWYgYW55LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gPGNvZGU+TygxKTwvY29kZT4uIElmIHRoZSBiaW5kaW5ncyBhcmVuJ3QKLQkgKiBjdXJyZW50bHkgY29tcHV0ZWQsIHRoZW4gdGhpcyBjb21wbGV0ZXMgaW4gPGNvZGU+TyhuKTwvY29kZT4sIHdoZXJlCi0JICogPGNvZGU+bjwvY29kZT4gaXMgdGhlIG51bWJlciBvZiBiaW5kaW5ncy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHRyaWdnZXIKLQkgKiAgICAgICAgICAgIFRoZSB0cmlnZ2VyIHRvIG1hdGNoOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgYmluZGluZyB0aGF0IG1hdGNoZXMsIGlmIGFueTsgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBCaW5kaW5nIGdldFBlcmZlY3RNYXRjaChmaW5hbCBUcmlnZ2VyU2VxdWVuY2UgdHJpZ2dlcikgewotCQlyZXR1cm4gKEJpbmRpbmcpIGdldEFjdGl2ZUJpbmRpbmdzKCkuZ2V0KHRyaWdnZXIpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGFjdGl2ZSBwbGF0Zm9ybSBmb3IgdGhpcyBiaW5kaW5nIG1hbmFnZXIuIFRoZSBwbGF0Zm9ybSBpcyBpbgotCSAqIHRoZSBzYW1lIGZvcm1hdCBhcyA8Y29kZT5TV1QuZ2V0UGxhdGZvcm0oKTwvY29kZT4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpbiA8Y29kZT5PKDEpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBUaGUgYWN0aXZlIHBsYXRmb3JtOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gcGxhdGZvcm07Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgcHJlZml4IHRhYmxlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gPGNvZGU+TygxKTwvY29kZT4uIElmIHRoZSBhY3RpdmUgYmluZGluZ3MgYXJlCi0JICogbm90IHlldCBjb21wdXRlZCwgdGhlbiB0aGlzIGNvbXBsZXRlcyBpbiA8Y29kZT5PKG4pPC9jb2RlPiwgd2hlcmUKLQkgKiA8Y29kZT5uPC9jb2RlPiBpcyB0aGUgbnVtYmVyIG9mIGJpbmRpbmdzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgbWFwIG9mIHByZWZpeGVzICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KSB0byBhIG1hcCBvZgotCSAqICAgICAgICAgYXZhaWxhYmxlIGNvbXBsZXRpb25zIChwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPiwgd2hpY2ggbWVhbnMKLQkgKiAgICAgICAgIHRoZXJlIGlzIGFuIGV4YWN0IG1hdGNoKS4gVGhlIGF2YWlsYWJsZSBjb21wbGV0aW9ucyBpcyBhIG1hcCBvZgotCSAqICAgICAgICAgdHJpZ2dlciAoPGNvZGU+VHJpZ2dlclNlcXVlbmNlPC9jb2RlPikgdG8gYmluZGluZyAoPGNvZGU+QmluZGluZzwvY29kZT4pLgotCSAqICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIG5ldmVyIGJlIDxjb2RlPm51bGw8L2NvZGU+IGJ1dCBtYXkgYmUgZW1wdHkuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAgZ2V0UHJlZml4VGFibGUoKSB7Ci0JCWlmIChwcmVmaXhUYWJsZSA9PSBudWxsKSB7Ci0JCQlyZWNvbXB1dGVCaW5kaW5ncygpOwotCQl9Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChwcmVmaXhUYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogR2V0cyB0aGUgc2NoZW1lIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXIuIElmIHRoZSBzY2hlbWUgZG9lcyBub3QgYWxyZWFkeQotCSAqIGV4aXN0LCB0aGVuIGEgbmV3ICh1bmRlZmluZWQpIHNjaGVtZSBpcyBjcmVhdGVkIHdpdGggdGhhdCBpZGVudGlmaWVyLgotCSAqIFRoaXMgZ3VhcmFudGVlcyB0aGF0IHNjaGVtZXMgd2lsbCByZW1haW4gdW5pcXVlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gYW1vcnRpemVkIDxjb2RlPk8oMSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc2NoZW1lSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgc2NoZW1lIHRvIHJldHJpZXZlOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBBIHNjaGVtZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyLgotCSAqLwotCXB1YmxpYyBmaW5hbCBTY2hlbWUgZ2V0U2NoZW1lKGZpbmFsIFN0cmluZyBzY2hlbWVJZCkgewotCQljaGVja0lkKHNjaGVtZUlkKTsKLQotCQlTY2hlbWUgc2NoZW1lID0gKFNjaGVtZSkgaGFuZGxlT2JqZWN0c0J5SWQuZ2V0KHNjaGVtZUlkKTsKLQkJaWYgKHNjaGVtZSA9PSBudWxsKSB7Ci0JCQlzY2hlbWUgPSBuZXcgU2NoZW1lKHNjaGVtZUlkKTsKLQkJCWhhbmRsZU9iamVjdHNCeUlkLnB1dChzY2hlbWVJZCwgc2NoZW1lKTsKLQkJCXNjaGVtZS5hZGRTY2hlbWVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzY2hlbWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQXNjZW5kcyBhbGwgb2YgdGhlIHBhcmVudHMgb2YgdGhlIHNjaGVtZSB1bnRpbCBubyBtb3JlIHBhcmVudHMgYXJlIGZvdW5kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gPGNvZGU+TyhuKTwvY29kZT4sIHdoZXJlIDxjb2RlPm48L2NvZGU+IGlzCi0JICogdGhlIGhlaWdodCBvZiB0aGUgY29udGV4dCB0cmVlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc2NoZW1lSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgc2NoZW1lIGZvciB3aGljaCB0aGUgcGFyZW50cyBzaG91bGQgYmUgZm91bmQ7Ci0JICogICAgICAgICAgICBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgYXJyYXkgb2Ygc2NoZW1lIGlkcyAoPGNvZGU+U3RyaW5nPC9jb2RlPikgc3RhcnRpbmcgd2l0aAotCSAqICAgICAgICAgPGNvZGU+c2NoZW1lSWQ8L2NvZGU+IGFuZCB0aGVuIGFzY2VuZGluZyB0aHJvdWdoIGl0cyBhbmNlc3RvcnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBnZXRTY2hlbWVJZHMoU3RyaW5nIHNjaGVtZUlkKSB7Ci0JCWZpbmFsIExpc3Qgc3RyaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKHNjaGVtZUlkICE9IG51bGwpIHsKLQkJCXN0cmluZ3MuYWRkKHNjaGVtZUlkKTsKLQkJCXRyeSB7Ci0JCQkJc2NoZW1lSWQgPSBnZXRTY2hlbWUoc2NoZW1lSWQpLmdldFBhcmVudElkKCk7Ci0JCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoU3RyaW5nW10pIHN0cmluZ3MudG9BcnJheShuZXcgU3RyaW5nW3N0cmluZ3Muc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiB0cmlnZ2VyIHNlcXVlbmNlIGlzIGEgcGFydGlhbCBtYXRjaCBmb3IgdGhlCi0JICogZ2l2ZW4gc2VxdWVuY2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpbiA8Y29kZT5PKDEpPC9jb2RlPi4gSWYgdGhlIGJpbmRpbmdzIGFyZW4ndAotCSAqIGN1cnJlbnRseSBjb21wdXRlZCwgdGhlbiB0aGlzIGNvbXBsZXRlcyBpbiA8Y29kZT5PKG4pPC9jb2RlPiwgd2hlcmUKLQkgKiA8Y29kZT5uPC9jb2RlPiBpcyB0aGUgbnVtYmVyIG9mIGJpbmRpbmdzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdHJpZ2dlcgotCSAqICAgICAgICAgICAgVGhlIHNlcXVlbmNlIHdoaWNoIHNob3VsZCBiZSB0aGUgcHJlZml4IGZvciBzb21lIGJpbmRpbmc7Ci0JICogICAgICAgICAgICBzaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRyaWdnZXIgY2FuIGJlIGZvdW5kIGluIHRoZSBhY3RpdmUKLQkgKiAgICAgICAgIGJpbmRpbmdzOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzUGFydGlhbE1hdGNoKGZpbmFsIFRyaWdnZXJTZXF1ZW5jZSB0cmlnZ2VyKSB7Ci0JCXJldHVybiAoZ2V0UHJlZml4VGFibGUoKS5nZXQodHJpZ2dlcikgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiB0cmlnZ2VyIHNlcXVlbmNlIGlzIGEgcGVyZmVjdCBtYXRjaCBmb3IgdGhlCi0JICogZ2l2ZW4gc2VxdWVuY2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpbiA8Y29kZT5PKDEpPC9jb2RlPi4gSWYgdGhlIGJpbmRpbmdzIGFyZW4ndAotCSAqIGN1cnJlbnRseSBjb21wdXRlZCwgdGhlbiB0aGlzIGNvbXBsZXRlcyBpbiA8Y29kZT5PKG4pPC9jb2RlPiwgd2hlcmUKLQkgKiA8Y29kZT5uPC9jb2RlPiBpcyB0aGUgbnVtYmVyIG9mIGJpbmRpbmdzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdHJpZ2dlcgotCSAqICAgICAgICAgICAgVGhlIHNlcXVlbmNlIHdoaWNoIHNob3VsZCBtYXRjaCBleGFjdGx5OyBzaG91bGQgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0cmlnZ2VyIGNhbiBiZSBmb3VuZCBpbiB0aGUgYWN0aXZlCi0JICogICAgICAgICBiaW5kaW5nczsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1BlcmZlY3RNYXRjaChmaW5hbCBUcmlnZ2VyU2VxdWVuY2UgdHJpZ2dlcikgewotCQlyZXR1cm4gZ2V0QWN0aXZlQmluZGluZ3MoKS5jb250YWluc0tleSh0cmlnZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUZXN0cyB3aGV0aGVyIHRoZSBsb2NhbGUgZm9yIHRoZSBiaW5kaW5nIG1hdGNoZXMgb25lIG9mIHRoZSBhY3RpdmUKLQkgKiBsb2NhbGVzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gPGNvZGU+TyhuKTwvY29kZT4sIHdoZXJlIDxjb2RlPm48L2NvZGU+IGlzCi0JICogdGhlIG51bWJlciBvZiBhY3RpdmUgbG9jYWxlcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGJpbmRpbmcKLQkgKiAgICAgICAgICAgIFRoZSBiaW5kaW5nIHdpdGggd2hpY2ggdG8gdGVzdDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYmluZGluZydzIGxvY2FsZSBtYXRjaGVzOwotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gbG9jYWxlTWF0Y2hlcyhmaW5hbCBCaW5kaW5nIGJpbmRpbmcpIHsKLQkJYm9vbGVhbiBtYXRjaGVzID0gZmFsc2U7Ci0KLQkJZmluYWwgU3RyaW5nIGxvY2FsZSA9IGJpbmRpbmcuZ2V0TG9jYWxlKCk7Ci0JCWlmIChsb2NhbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7IC8vIHNob3J0Y3V0IGEgY29tbW9uIGNhc2UKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFV0aWwuZXF1YWxzKGxvY2FsZXNbaV0sIGxvY2FsZSkpIHsKLQkJCQltYXRjaGVzID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtYXRjaGVzOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRlc3RzIHdoZXRoZXIgdGhlIHBsYXRmb3JtIGZvciB0aGUgYmluZGluZyBtYXRjaGVzIG9uZSBvZiB0aGUgYWN0aXZlCi0JICogcGxhdGZvcm1zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gPGNvZGU+TyhuKTwvY29kZT4sIHdoZXJlIDxjb2RlPm48L2NvZGU+IGlzCi0JICogdGhlIG51bWJlciBvZiBhY3RpdmUgcGxhdGZvcm1zLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYmluZGluZwotCSAqICAgICAgICAgICAgVGhlIGJpbmRpbmcgd2l0aCB3aGljaCB0byB0ZXN0OyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBiaW5kaW5nJ3MgcGxhdGZvcm0gbWF0Y2hlczsKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIHBsYXRmb3JtTWF0Y2hlcyhmaW5hbCBCaW5kaW5nIGJpbmRpbmcpIHsKLQkJYm9vbGVhbiBtYXRjaGVzID0gZmFsc2U7Ci0KLQkJZmluYWwgU3RyaW5nIHBsYXRmb3JtID0gYmluZGluZy5nZXRQbGF0Zm9ybSgpOwotCQlpZiAocGxhdGZvcm0gPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7IC8vIHNob3J0Y3V0IGEgY29tbW9uIGNhc2UKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGxhdGZvcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoVXRpbC5lcXVhbHMocGxhdGZvcm1zW2ldLCBwbGF0Zm9ybSkpIHsKLQkJCQltYXRjaGVzID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtYXRjaGVzOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgcmVjb21wdXRlcyB0aGUgYmluZGluZ3MgYmFzZWQgb24gY2hhbmdlcyB0byB0aGUgc3RhdGUgb2YgdGhlIHdvcmxkLgotCSAqIFRoaXMgY29tcHV0YXRpb24gY2FuIGJlIHRyaWdnZXJlZCBieSBjaGFuZ2VzIHRvIGNvbnRleHRzLCB0aGUgYWN0aXZlCi0JICogc2NoZW1lLCB0aGUgbG9jYWxlLCBvciB0aGUgcGxhdGZvcm0uIFRoaXMgbWV0aG9kIHRyaWVzIHRvIHVzZSB0aGUgY2FjaGUKLQkgKiBvZiBwcmUtY29tcHV0ZWQgYmluZGluZ3MsIGlmIHBvc3NpYmxlLiBXaGVuIHRoaXMgbWV0aG9kIGNvbXBsZXRlcywKLQkgKiA8Y29kZT5hY3RpdmVCaW5kaW5nczwvY29kZT4gd2lsbCBiZSBzZXQgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIGJpbmRpbmdzCi0JICogYW5kIDxjb2RlPmNhY2hlZEJpbmRpbmdzPC9jb2RlPiB3aWxsIGNvbnRhaW4gYW4gaW5zdGFuY2Ugb2YKLQkgKiA8Y29kZT5DYWNoZWRCaW5kaW5nU2V0PC9jb2RlPiByZXByZXNlbnRpbmcgdGhlc2UgYmluZGluZ3MuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpbiA8Y29kZT5PKG4rcG4pPC9jb2RlPiwgd2hlcmUgPGNvZGU+bjwvY29kZT4KLQkgKiBpcyB0aGUgbnVtYmVyIG9mIGJpbmRpbmdzLCBhbmQgPGNvZGU+cDwvY29kZT4gaXMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mCi0JICogdHJpZ2dlcnMgaW4gYSB0cmlnZ2VyIHNlcXVlbmNlLgotCSAqIDwvcD4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgcmVjb21wdXRlQmluZGluZ3MoKSB7Ci0JCWlmIChiaW5kaW5ncyA9PSBudWxsKSB7Ci0JCQkvLyBOb3QgeWV0IGluaXRpYWxpemVkLiBUaGlzIGlzIGhhcHBlbmluZyB0b28gZWFybHkuIERvIG5vdGhpbmcuCi0JCQlzZXRBY3RpdmVCaW5kaW5ncyhDb2xsZWN0aW9ucy5FTVBUWV9NQVAsIENvbGxlY3Rpb25zLkVNUFRZX01BUCwKLQkJCQkJQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEZpZ3VyZSBvdXQgdGhlIGN1cnJlbnQgc3RhdGUuCi0JCWZpbmFsIFNldCBhY3RpdmVDb250ZXh0SWRzID0gbmV3IEhhc2hTZXQoY29udGV4dE1hbmFnZXIKLQkJCQkuZ2V0QWN0aXZlQ29udGV4dElkcygpKTsKLQkJZmluYWwgTWFwIGFjdGl2ZUNvbnRleHRUcmVlID0gY3JlYXRlRmlsdGVyZWRDb250ZXh0VHJlZUZvcihhY3RpdmVDb250ZXh0SWRzKTsKLQotCQkvLyBCdWlsZCBhIGNhY2hlZCBiaW5kaW5nIHNldCBmb3IgdGhhdCBzdGF0ZS4KLQkJZmluYWwgQ2FjaGVkQmluZGluZ1NldCBiaW5kaW5nQ2FjaGUgPSBuZXcgQ2FjaGVkQmluZGluZ1NldCgKLQkJCQlhY3RpdmVDb250ZXh0VHJlZSwgbG9jYWxlcywgcGxhdGZvcm1zLCBhY3RpdmVTY2hlbWVJZHMpOwotCi0JCS8qCi0JCSAqIENoZWNrIGlmIHRoZSBjYWNoZWQgYmluZGluZyBzZXQgYWxyZWFkeSBleGlzdHMuIElmIHNvLCBzaW1wbHkgc2V0IHRoZQotCQkgKiBhY3RpdmUgYmluZGluZ3MgYW5kIHJldHVybi4KLQkJICovCi0JCUNhY2hlZEJpbmRpbmdTZXQgZXhpc3RpbmdDYWNoZSA9IChDYWNoZWRCaW5kaW5nU2V0KSBjYWNoZWRCaW5kaW5ncwotCQkJCS5nZXQoYmluZGluZ0NhY2hlKTsKLQkJaWYgKGV4aXN0aW5nQ2FjaGUgPT0gbnVsbCkgewotCQkJZXhpc3RpbmdDYWNoZSA9IGJpbmRpbmdDYWNoZTsKLQkJCWNhY2hlZEJpbmRpbmdzLnB1dChleGlzdGluZ0NhY2hlLCBleGlzdGluZ0NhY2hlKTsKLQkJfQotCQlNYXAgY29tbWFuZElkc0J5VHJpZ2dlciA9IGV4aXN0aW5nQ2FjaGUuZ2V0QmluZGluZ3NCeVRyaWdnZXIoKTsKLQkJaWYgKGNvbW1hbmRJZHNCeVRyaWdnZXIgIT0gbnVsbCkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJVHJhY2luZy5wcmludFRyYWNlKCJCSU5ESU5HUyIsICJDYWNoZSBoaXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlzZXRBY3RpdmVCaW5kaW5ncyhjb21tYW5kSWRzQnlUcmlnZ2VyLCBleGlzdGluZ0NhY2hlCi0JCQkJCS5nZXRUcmlnZ2Vyc0J5Q29tbWFuZElkKCksIGV4aXN0aW5nQ2FjaGUuZ2V0UHJlZml4VGFibGUoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGVyZSBpcyBubyBjYWNoZWQgZW50cnkgZm9yIHRoaXMuCi0JCWlmIChERUJVRykgewotCQkJVHJhY2luZy5wcmludFRyYWNlKCJCSU5ESU5HUyIsICJDYWNoZSBtaXNzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJLy8gQ29tcHV0ZSB0aGUgYWN0aXZlIGJpbmRpbmdzLgotCQljb21tYW5kSWRzQnlUcmlnZ2VyID0gbmV3IEhhc2hNYXAoKTsKLQkJZmluYWwgTWFwIHRyaWdnZXJzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNvbXB1dGVCaW5kaW5ncyhhY3RpdmVDb250ZXh0VHJlZSwgY29tbWFuZElkc0J5VHJpZ2dlciwKLQkJCQl0cmlnZ2Vyc0J5UGFyYW1ldGVyaXplZENvbW1hbmQpOwotCQlleGlzdGluZ0NhY2hlLnNldEJpbmRpbmdzQnlUcmlnZ2VyKGNvbW1hbmRJZHNCeVRyaWdnZXIpOwotCQlleGlzdGluZ0NhY2hlLnNldFRyaWdnZXJzQnlDb21tYW5kSWQodHJpZ2dlcnNCeVBhcmFtZXRlcml6ZWRDb21tYW5kKTsKLQkJc2V0QWN0aXZlQmluZGluZ3MoY29tbWFuZElkc0J5VHJpZ2dlciwgdHJpZ2dlcnNCeVBhcmFtZXRlcml6ZWRDb21tYW5kLAotCQkJCWJ1aWxkUHJlZml4VGFibGUoY29tbWFuZElkc0J5VHJpZ2dlcikpOwotCQlleGlzdGluZ0NhY2hlLnNldFByZWZpeFRhYmxlKHByZWZpeFRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGlzIGJpbmRpbmcgbWFuYWdlci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIGFtb3J0aXplZCA8Y29kZT5PKDEpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmluZGluZ01hbmFnZXJMaXN0ZW5lcigKLQkJCWZpbmFsIElCaW5kaW5nTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJlbW92ZUxpc3RlbmVyT2JqZWN0KGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZW1vdmVzIGFueSBiaW5kaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmFsdWVzIC0tIHJlZ2FyZGxlc3Mgb2YKLQkgKiBjb21tYW5kIGlkZW50aWZpZXIuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpbiA8Y29kZT5PKG4pPC9jb2RlPiwgd2hlcmUgPGNvZGU+bjwvY29kZT4gaXMKLQkgKiB0aGUgbnVtYmVyIG9mIGJpbmRpbmdzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc2VxdWVuY2UKLQkgKiAgICAgICAgICAgIFRoZSBzZXF1ZW5jZSB0byBtYXRjaDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBzY2hlbWVJZAotCSAqICAgICAgICAgICAgVGhlIHNjaGVtZSBpZCB0byBtYXRjaDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBjb250ZXh0SWQKLQkgKiAgICAgICAgICAgIFRoZSBjb250ZXh0IGlkIHRvIG1hdGNoOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgVGhlIGxvY2FsZSB0byBtYXRjaDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBwbGF0Zm9ybQotCSAqICAgICAgICAgICAgVGhlIHBsYXRmb3JtIHRvIG1hdGNoOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHdpbmRvd01hbmFnZXIKLQkgKiAgICAgICAgICAgIFRoZSB3aW5kb3cgbWFuYWdlciB0byBtYXRjaDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LiBUT0RPCi0JICogICAgICAgICAgICBDdXJyZW50bHkgaWdub3JlZC4KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgVGhlIHR5cGUgdG8gbG9vayBmb3IuCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmluZGluZ3MoZmluYWwgVHJpZ2dlclNlcXVlbmNlIHNlcXVlbmNlLAotCQkJZmluYWwgU3RyaW5nIHNjaGVtZUlkLCBmaW5hbCBTdHJpbmcgY29udGV4dElkLCBmaW5hbCBTdHJpbmcgbG9jYWxlLAotCQkJZmluYWwgU3RyaW5nIHBsYXRmb3JtLCBmaW5hbCBTdHJpbmcgd2luZG93TWFuYWdlciwgZmluYWwgaW50IHR5cGUpIHsKLQkJaWYgKChiaW5kaW5ncyA9PSBudWxsKSB8fCAoYmluZGluZ0NvdW50IDwgMSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZpbmFsIEJpbmRpbmdbXSBuZXdCaW5kaW5ncyA9IG5ldyBCaW5kaW5nW2JpbmRpbmdzLmxlbmd0aF07Ci0JCWJvb2xlYW4gYmluZGluZ3NDaGFuZ2VkID0gZmFsc2U7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ0NvdW50OyBpKyspIHsKLQkJCWZpbmFsIEJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdzW2ldOwotCQkJYm9vbGVhbiBlcXVhbHMgPSB0cnVlOwotCQkJZXF1YWxzICY9IFV0aWwuZXF1YWxzKHNlcXVlbmNlLCBiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpKTsKLQkJCWVxdWFscyAmPSBVdGlsLmVxdWFscyhzY2hlbWVJZCwgYmluZGluZy5nZXRTY2hlbWVJZCgpKTsKLQkJCWVxdWFscyAmPSBVdGlsLmVxdWFscyhjb250ZXh0SWQsIGJpbmRpbmcuZ2V0Q29udGV4dElkKCkpOwotCQkJZXF1YWxzICY9IFV0aWwuZXF1YWxzKGxvY2FsZSwgYmluZGluZy5nZXRMb2NhbGUoKSk7Ci0JCQllcXVhbHMgJj0gVXRpbC5lcXVhbHMocGxhdGZvcm0sIGJpbmRpbmcuZ2V0UGxhdGZvcm0oKSk7Ci0JCQllcXVhbHMgJj0gKHR5cGUgPT0gYmluZGluZy5nZXRUeXBlKCkpOwotCQkJaWYgKGVxdWFscykgewotCQkJCWJpbmRpbmdzQ2hhbmdlZCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCW5ld0JpbmRpbmdzW2luZGV4KytdID0gYmluZGluZzsKLQkJCX0KLQkJfQotCi0JCWlmIChiaW5kaW5nc0NoYW5nZWQpIHsKLQkJCXRoaXMuYmluZGluZ3MgPSBuZXdCaW5kaW5nczsKLQkJCWJpbmRpbmdDb3VudCA9IGluZGV4OwotCQkJY2xlYXJDYWNoZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQXR0ZW1wdHMgdG8gcmVtb3ZlIGRlbGV0aW9uIG1hcmtlcnMgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBiaW5kaW5ncy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8obik8L2NvZGU+LCB3aGVyZSA8Y29kZT5uPC9jb2RlPiBpcwotCSAqIHRoZSBudW1iZXIgb2YgYmluZGluZ3MuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBiaW5kaW5ncwotCSAqICAgICAgICAgICAgVGhlIGJpbmRpbmdzIGZyb20gd2hpY2ggdGhlIGRlbGV0ZWQgaXRlbXMgc2hvdWxkIGJlIHJlbW92ZWQuCi0JICogICAgICAgICAgICBUaGlzIGFycmF5IHNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGJ1dCBtYXkgYmUKLQkgKiAgICAgICAgICAgIGVtcHR5LgotCSAqIEByZXR1cm4gVGhlIGFycmF5IG9mIGJpbmRpbmdzIHdpdGggdGhlIGRlbGV0aW9ucyByZW1vdmVkOyBuZXZlcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIGJ1dCBtYXkgYmUgZW1wdHkuIENvbnRhaW5zIG9ubHkgaW5zdGFuY2VzCi0JICogICAgICAgICBvZiA8Y29kZT5CaW5kaW5nPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEJpbmRpbmdbXSByZW1vdmVEZWxldGlvbnMoZmluYWwgQmluZGluZ1tdIGJpbmRpbmdzKSB7Ci0JCWZpbmFsIE1hcCBkZWxldGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlmaW5hbCBCaW5kaW5nW10gYmluZGluZ3NDb3B5ID0gbmV3IEJpbmRpbmdbYmluZGluZ0NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShiaW5kaW5ncywgMCwgYmluZGluZ3NDb3B5LCAwLCBiaW5kaW5nQ291bnQpOwotCQlpbnQgZGVsZXRlZENvdW50ID0gMDsKLQotCQkvLyBFeHRyYWN0IHRoZSBkZWxldGlvbnMuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ0NvdW50OyBpKyspIHsKLQkJCWZpbmFsIEJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdzQ29weVtpXTsKLQkJCWlmICgoYmluZGluZy5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpID09IG51bGwpCi0JCQkJCSYmIChsb2NhbGVNYXRjaGVzKGJpbmRpbmcpKSAmJiAocGxhdGZvcm1NYXRjaGVzKGJpbmRpbmcpKSkgewotCQkJCWZpbmFsIFRyaWdnZXJTZXF1ZW5jZSBzZXF1ZW5jZSA9IGJpbmRpbmcuZ2V0VHJpZ2dlclNlcXVlbmNlKCk7Ci0JCQkJZmluYWwgT2JqZWN0IGN1cnJlbnRWYWx1ZSA9IGRlbGV0aW9ucy5nZXQoc2VxdWVuY2UpOwotCQkJCWlmIChjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBCaW5kaW5nKSB7Ci0JCQkJCWZpbmFsIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQkJCWNvbGxlY3Rpb24uYWRkKGN1cnJlbnRWYWx1ZSk7Ci0JCQkJCWNvbGxlY3Rpb24uYWRkKGJpbmRpbmcpOwotCQkJCQlkZWxldGlvbnMucHV0KHNlcXVlbmNlLCBjb2xsZWN0aW9uKTsKLQkJCQl9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQkJZmluYWwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIGN1cnJlbnRWYWx1ZTsKLQkJCQkJY29sbGVjdGlvbi5hZGQoYmluZGluZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGVsZXRpb25zLnB1dChzZXF1ZW5jZSwgYmluZGluZyk7Ci0JCQkJfQotCQkJCWJpbmRpbmdzQ29weVtpXSA9IG51bGw7Ci0JCQkJZGVsZXRlZENvdW50Kys7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoREVCVUcpIHsKLQkJCVRyYWNpbmcucHJpbnRUcmFjZSgiQklORElOR1MiLCAiVGhlcmUgYXJlICIgKyBkZWxldGlvbnMuc2l6ZSgpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrICIgZGVsZXRpb24gbWFya2VycyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBSZW1vdmUgdGhlIGRlbGV0ZWQgaXRlbXMuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ0NvdW50OyBpKyspIHsKLQkJCWZpbmFsIEJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdzQ29weVtpXTsKLQkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKLQkJCQlmaW5hbCBPYmplY3QgZGVsZXRpb24gPSBkZWxldGlvbnMuZ2V0KGJpbmRpbmcKLQkJCQkJCS5nZXRUcmlnZ2VyU2VxdWVuY2UoKSk7Ci0JCQkJaWYgKGRlbGV0aW9uIGluc3RhbmNlb2YgQmluZGluZykgewotCQkJCQlpZiAoKChCaW5kaW5nKSBkZWxldGlvbikuZGVsZXRlcyhiaW5kaW5nKSkgewotCQkJCQkJYmluZGluZ3NDb3B5W2ldID0gbnVsbDsKLQkJCQkJCWRlbGV0ZWRDb3VudCsrOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgaWYgKGRlbGV0aW9uIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJCQlmaW5hbCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgZGVsZXRpb247Ci0JCQkJCWZpbmFsIEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlmaW5hbCBPYmplY3QgZGVsZXRpb25CaW5kaW5nID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGRlbGV0aW9uQmluZGluZyBpbnN0YW5jZW9mIEJpbmRpbmcpIHsKLQkJCQkJCQlpZiAoKChCaW5kaW5nKSBkZWxldGlvbkJpbmRpbmcpLmRlbGV0ZXMoYmluZGluZykpIHsKLQkJCQkJCQkJYmluZGluZ3NDb3B5W2ldID0gbnVsbDsKLQkJCQkJCQkJZGVsZXRlZENvdW50Kys7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gQ29tcGFjdCB0aGUgYXJyYXkuCi0JCWZpbmFsIEJpbmRpbmdbXSByZXR1cm5WYWx1ZSA9IG5ldyBCaW5kaW5nW2JpbmRpbmdDb3VudCAtIGRlbGV0ZWRDb3VudF07Ci0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ0NvdW50OyBpKyspIHsKLQkJCWZpbmFsIEJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdzQ29weVtpXTsKLQkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKLQkJCQlyZXR1cm5WYWx1ZVtpbmRleCsrXSA9IGJpbmRpbmc7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0dXJuVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQXR0ZW1wdHMgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3RzIGZvciB0aGUgZ2l2ZW4gYmluZGluZ3MgLS0gaXJyZXNwZWN0aXZlCi0JICogb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29udGV4dHMuIFRoaXMgbWVhbnMgdGhhdCB0eXBlIGFuZCBzY2hlbWUgd2lsbCBiZQotCSAqIGNvbnNpZGVyZWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpbiA8Y29kZT5PKG4pPC9jb2RlPiwgd2hlcmUgPGNvZGU+bjwvY29kZT4gaXMKLQkgKiB0aGUgbnVtYmVyIG9mIGJpbmRpbmdzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYmluZGluZ3MKLQkgKiAgICAgICAgICAgIFRoZSBiaW5kaW5ncyB3aGljaCBhbGwgbWF0Y2ggdGhlIHNhbWUgdHJpZ2dlciBzZXF1ZW5jZTsgbXVzdAotCSAqICAgICAgICAgICAgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBhbmQgc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3QgdHdvCi0JICogICAgICAgICAgICBpdGVtcy4gVGhpcyBjb2xsZWN0aW9uIHNob3VsZCBvbmx5IGNvbnRhaW4gaW5zdGFuY2VzIG9mCi0JICogICAgICAgICAgICA8Y29kZT5CaW5kaW5nPC9jb2RlPiAoaS5lLiwgbm8gPGNvZGU+bnVsbDwvY29kZT4gdmFsdWVzKS4KLQkgKiBAcmV0dXJuIFRoZSBjb2xsZWN0aW9uIG9mIGJpbmRpbmdzIHdoaWNoIG1hdGNoIHRoZSBjdXJyZW50IHNjaGVtZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb24gcmVzb2x2ZUNvbmZsaWN0cyhmaW5hbCBDb2xsZWN0aW9uIGJpbmRpbmdzKSB7Ci0JCWZpbmFsIENvbGxlY3Rpb24gbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmluYWwgSXRlcmF0b3IgYmluZGluZ0l0ciA9IGJpbmRpbmdzLml0ZXJhdG9yKCk7Ci0JCUJpbmRpbmcgYmVzdE1hdGNoID0gKEJpbmRpbmcpIGJpbmRpbmdJdHIubmV4dCgpOwotCQltYXRjaGVzLmFkZChiZXN0TWF0Y2gpOwotCi0JCS8qCi0JCSAqIEl0ZXJhdGUgb3ZlciBlYWNoIGJpbmRpbmcgYW5kIGNvbXBhcmVzIGl0IHdpdGggdGhlIGJlc3QgbWF0Y2guIElmIGEKLQkJICogYmV0dGVyIG1hdGNoIGlzIGZvdW5kLCB0aGVuIHJlcGxhY2UgdGhlIGJlc3QgbWF0Y2ggYW5kIGNsZWFyIHRoZQotCQkgKiBjb2xsZWN0aW9uLiBJZiB0aGUgY3VycmVudCBiaW5kaW5nIGlzIGVxdWl2YWxlbnQsIHRoZW4gc2ltcGx5IGFkZCBpdAotCQkgKiB0byB0aGUgY29sbGVjdGlvbiBvZiBtYXRjaGVzLiBJZiB0aGUgY3VycmVudCBiaW5kaW5nIGlzIHdvcnNlLCB0aGVuCi0JCSAqIGRvIG5vdGhpbmcuCi0JCSAqLwotCQl3aGlsZSAoYmluZGluZ0l0ci5oYXNOZXh0KCkpIHsKLQkJCWZpbmFsIEJpbmRpbmcgY3VycmVudCA9IChCaW5kaW5nKSBiaW5kaW5nSXRyLm5leHQoKTsKLQotCQkJLyoKLQkJCSAqIFNDSEVNRTogVGVzdCB3aGV0aGVyIHRoZSBjdXJyZW50IGlzIGluIGEgY2hpbGQgc2NoZW1lLiBCaW5kaW5ncwotCQkJICogZGVmaW5lZCBpbiBhIGNoaWxkIHNjaGVtZSB3aWxsIHRha2UgcHJpb3JpdHkgb3ZlciBiaW5kaW5ncwotCQkJICogZGVmaW5lZCBpbiBhIHBhcmVudCBzY2hlbWUgLS0gYXNzdW1pbmcgdGhhdCBjb25zdWx0aW5nIHRoZWlyCi0JCQkgKiBjb250ZXh0cyBsZWQgdG8gYSBjb25mbGljdC4KLQkJCSAqLwotCQkJZmluYWwgU3RyaW5nIGN1cnJlbnRTY2hlbWVJZCA9IGN1cnJlbnQuZ2V0U2NoZW1lSWQoKTsKLQkJCWZpbmFsIFN0cmluZyBiZXN0U2NoZW1lSWQgPSBiZXN0TWF0Y2guZ2V0U2NoZW1lSWQoKTsKLQkJCWZpbmFsIGludCBjb21wYXJlVG8gPSBjb21wYXJlU2NoZW1lcyhiZXN0U2NoZW1lSWQsIGN1cnJlbnRTY2hlbWVJZCk7Ci0JCQlpZiAoY29tcGFyZVRvID4gMCkgewotCQkJCWJlc3RNYXRjaCA9IGN1cnJlbnQ7Ci0JCQkJbWF0Y2hlcy5jbGVhcigpOwotCQkJCW1hdGNoZXMuYWRkKGN1cnJlbnQpOwotCQkJfQotCQkJaWYgKGNvbXBhcmVUbyAhPSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBUWVBFOiBUZXN0IGZvciB0eXBlIHN1cGVyaW9yaXR5LgotCQkJICovCi0JCQlpZiAoY3VycmVudC5nZXRUeXBlKCkgPiBiZXN0TWF0Y2guZ2V0VHlwZSgpKSB7Ci0JCQkJYmVzdE1hdGNoID0gY3VycmVudDsKLQkJCQltYXRjaGVzLmNsZWFyKCk7Ci0JCQkJbWF0Y2hlcy5hZGQoY3VycmVudCk7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKGJlc3RNYXRjaC5nZXRUeXBlKCkgPiBjdXJyZW50LmdldFR5cGUoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBUaGUgYmluZGluZ3MgYXJlIGVxdWl2YWxlbnQuCi0JCQltYXRjaGVzLmFkZChjdXJyZW50KTsKLQkJfQotCi0JCS8vIFJldHVybiBhbGwgb2YgdGhlIG1hdGNoZXMuCi0JCXJldHVybiBtYXRjaGVzOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEF0dGVtcHRzIHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0cyBmb3IgdGhlIGdpdmVuIGJpbmRpbmdzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjb21wbGV0ZXMgaW4gPGNvZGU+TyhuKTwvY29kZT4sIHdoZXJlIDxjb2RlPm48L2NvZGU+IGlzCi0JICogdGhlIG51bWJlciBvZiBiaW5kaW5ncy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGJpbmRpbmdzCi0JICogICAgICAgICAgICBUaGUgYmluZGluZ3Mgd2hpY2ggYWxsIG1hdGNoIHRoZSBzYW1lIHRyaWdnZXIgc2VxdWVuY2U7IG11c3QKLQkgKiAgICAgICAgICAgIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiwgYW5kIHNob3VsZCBjb250YWluIGF0IGxlYXN0IHR3bwotCSAqICAgICAgICAgICAgaXRlbXMuIFRoaXMgY29sbGVjdGlvbiBzaG91bGQgb25seSBjb250YWluIGluc3RhbmNlcyBvZgotCSAqICAgICAgICAgICAgPGNvZGU+QmluZGluZzwvY29kZT4gKGkuZS4sIG5vIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlcykuCi0JICogQHBhcmFtIGFjdGl2ZUNvbnRleHRUcmVlCi0JICogICAgICAgICAgICBUaGUgdHJlZSBvZiBjb250ZXh0cyB0byBiZSB1c2VkIGZvciBhbGwgb2YgdGhlIGNvbXBhcmlzb24uIEFsbAotCSAqICAgICAgICAgICAgb2YgdGhlIGtleXMgc2hvdWxkIGJlIGFjdGl2ZSBjb250ZXh0IGlkZW50aWZpZXJzIChpLmUuLCBuZXZlcgotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4pLiBUaGUgdmFsdWVzIHdpbGwgYmUgdGhlaXIgcGFyZW50cyAoaS5lLiwKLQkgKiAgICAgICAgICAgIHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+KS4gQm90aCBrZXlzIGFuZCB2YWx1ZXMgYXJlCi0JICogICAgICAgICAgICBjb250ZXh0IGlkZW50aWZpZXJzICg8Y29kZT5TdHJpbmc8L2NvZGU+KS4gVGhpcyBtYXAgc2hvdWxkCi0JICogICAgICAgICAgICBuZXZlciBiZSBlbXB0eSwgYW5kIG11c3QgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgYmluZGluZyB3aGljaCBiZXN0IG1hdGNoZXMgdGhlIGN1cnJlbnQgc3RhdGUuIElmIHRoZXJlIGlzIGEKLQkgKiAgICAgICAgIHRpZSwgdGhlbiByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBCaW5kaW5nIHJlc29sdmVDb25mbGljdHMoZmluYWwgQ29sbGVjdGlvbiBiaW5kaW5ncywKLQkJCWZpbmFsIE1hcCBhY3RpdmVDb250ZXh0VHJlZSkgewotCQkvKgotCQkgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGVuIHRoZSBiZXN0TWF0Y2ggYmluZGluZyBjb25mbGljdHMKLQkJICogd2l0aCBhbm90aGVyIGJpbmRpbmcuIFdlIGtlZXAgdGhlIGJlc3QgbWF0Y2ggYmluZGluZyBzbyB0aGF0IHdlIGtub3cKLQkJICogaWYgd2UgZmluZCBhIGJldHRlciBiaW5kaW5nLiBIb3dldmVyLCBpZiB3ZSBkb24ndCBmaW5kIGEgYmV0dGVyCi0JCSAqIGJpbmRpbmcsIHRoZW4gd2Uga25vd24gdG8gcmV0dXJuIG51bGwuCi0JCSAqLwotCQlib29sZWFuIGNvbmZsaWN0ID0gZmFsc2U7Ci0KLQkJZmluYWwgSXRlcmF0b3IgYmluZGluZ0l0ciA9IGJpbmRpbmdzLml0ZXJhdG9yKCk7Ci0JCUJpbmRpbmcgYmVzdE1hdGNoID0gKEJpbmRpbmcpIGJpbmRpbmdJdHIubmV4dCgpOwotCi0JCS8qCi0JCSAqIEl0ZXJhdGUgb3ZlciBlYWNoIGJpbmRpbmcgYW5kIGNvbXBhcmUgaXQgd2l0aCB0aGUgYmVzdCBtYXRjaC4gSWYgYQotCQkgKiBiZXR0ZXIgbWF0Y2ggaXMgZm91bmQsIHRoZW4gcmVwbGFjZSB0aGUgYmVzdCBtYXRjaCBhbmQgc2V0IHRoZQotCQkgKiBjb25mbGljdCBmbGFnIHRvIGZhbHNlLiBJZiBhIGNvbmZsaWN0IGlzIGZvdW5kLCB0aGVuIGxlYXZlIHRoZSBiZXN0Ci0JCSAqIG1hdGNoIGFuZCBzZXQgdGhlIGNvbmZsaWN0IGZsYWcuIE90aGVyd2lzZSwganVzdCBjb250aW51ZS4KLQkJICovCi0JCXdoaWxlIChiaW5kaW5nSXRyLmhhc05leHQoKSkgewotCQkJZmluYWwgQmluZGluZyBjdXJyZW50ID0gKEJpbmRpbmcpIGJpbmRpbmdJdHIubmV4dCgpOwotCi0JCQkvKgotCQkJICogU0NIRU1FOiBUZXN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgaXMgaW4gYSBjaGlsZCBzY2hlbWUuIEJpbmRpbmdzCi0JCQkgKiBkZWZpbmVkIGluIGEgY2hpbGQgc2NoZW1lIHdpbGwgYWx3YXlzIHRha2UgcHJpb3JpdHkgb3ZlciBiaW5kaW5ncwotCQkJICogZGVmaW5lZCBpbiBhIHBhcmVudCBzY2hlbWUuCi0JCQkgKi8KLQkJCWZpbmFsIFN0cmluZyBjdXJyZW50U2NoZW1lSWQgPSBjdXJyZW50LmdldFNjaGVtZUlkKCk7Ci0JCQlmaW5hbCBTdHJpbmcgYmVzdFNjaGVtZUlkID0gYmVzdE1hdGNoLmdldFNjaGVtZUlkKCk7Ci0JCQlmaW5hbCBpbnQgY29tcGFyZVRvID0gY29tcGFyZVNjaGVtZXMoYmVzdFNjaGVtZUlkLCBjdXJyZW50U2NoZW1lSWQpOwotCQkJaWYgKGNvbXBhcmVUbyA+IDApIHsKLQkJCQliZXN0TWF0Y2ggPSBjdXJyZW50OwotCQkJCWNvbmZsaWN0ID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoY29tcGFyZVRvICE9IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIENPTlRFWFRTOiBDaGVjayBmb3IgY29udGV4dCBzdXBlcmlvcml0eS4gQmluZGluZ3MgZGVmaW5lZCBpbiBhCi0JCQkgKiBjaGlsZCBjb250ZXh0IHdpbGwgdGFrZSBwcmlvcml0eSBvdmVyIGJpbmRpbmdzIGRlZmluZWQgaW4gYQotCQkJICogcGFyZW50IGNvbnRleHQgLS0gYXNzdW1pbmcgdGhhdCB0aGUgc2NoZW1lcyBsZWFkIHRvIGEgY29uZmxpY3QuCi0JCQkgKi8KLQkJCWZpbmFsIFN0cmluZyBjdXJyZW50Q29udGV4dCA9IGN1cnJlbnQuZ2V0Q29udGV4dElkKCk7Ci0JCQlmaW5hbCBTdHJpbmcgYmVzdENvbnRleHQgPSBiZXN0TWF0Y2guZ2V0Q29udGV4dElkKCk7Ci0JCQlpZiAoIWN1cnJlbnRDb250ZXh0LmVxdWFscyhiZXN0Q29udGV4dCkpIHsKLQkJCQlib29sZWFuIGdvVG9OZXh0QmluZGluZyA9IGZhbHNlOwotCi0JCQkJLy8gQXNjZW5kIHRoZSBjdXJyZW50J3MgY29udGV4dCB0cmVlLgotCQkJCVN0cmluZyBjb250ZXh0UG9pbnRlciA9IGN1cnJlbnRDb250ZXh0OwotCQkJCXdoaWxlIChjb250ZXh0UG9pbnRlciAhPSBudWxsKSB7Ci0JCQkJCWlmIChjb250ZXh0UG9pbnRlci5lcXVhbHMoYmVzdENvbnRleHQpKSB7Ci0JCQkJCQkvLyB0aGUgY3VycmVudCB3aW5zCi0JCQkJCQliZXN0TWF0Y2ggPSBjdXJyZW50OwotCQkJCQkJY29uZmxpY3QgPSBmYWxzZTsKLQkJCQkJCWdvVG9OZXh0QmluZGluZyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljb250ZXh0UG9pbnRlciA9IChTdHJpbmcpIGFjdGl2ZUNvbnRleHRUcmVlCi0JCQkJCQkJLmdldChjb250ZXh0UG9pbnRlcik7Ci0JCQkJfQotCi0JCQkJLy8gQXNjZW5kIHRoZSBiZXN0IG1hdGNoJ3MgY29udGV4dCB0cmVlLgotCQkJCWNvbnRleHRQb2ludGVyID0gYmVzdENvbnRleHQ7Ci0JCQkJd2hpbGUgKGNvbnRleHRQb2ludGVyICE9IG51bGwpIHsKLQkJCQkJaWYgKGNvbnRleHRQb2ludGVyLmVxdWFscyhjdXJyZW50Q29udGV4dCkpIHsKLQkJCQkJCS8vIHRoZSBiZXN0IHdpbnMKLQkJCQkJCWdvVG9OZXh0QmluZGluZyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljb250ZXh0UG9pbnRlciA9IChTdHJpbmcpIGFjdGl2ZUNvbnRleHRUcmVlCi0JCQkJCQkJLmdldChjb250ZXh0UG9pbnRlcik7Ci0JCQkJfQotCi0JCQkJaWYgKGdvVG9OZXh0QmluZGluZykgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBUWVBFOiBUZXN0IGZvciB0eXBlIHN1cGVyaW9yaXR5LgotCQkJICovCi0JCQlpZiAoY3VycmVudC5nZXRUeXBlKCkgPiBiZXN0TWF0Y2guZ2V0VHlwZSgpKSB7Ci0JCQkJYmVzdE1hdGNoID0gY3VycmVudDsKLQkJCQljb25mbGljdCA9IGZhbHNlOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChiZXN0TWF0Y2guZ2V0VHlwZSgpID4gY3VycmVudC5nZXRUeXBlKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gV2UgY291bGQgbm90IHJlc29sdmUgdGhlIGNvbmZsaWN0IGJldHdlZW4gdGhlc2UgdHdvLgotCQkJY29uZmxpY3QgPSB0cnVlOwotCQl9Ci0KLQkJLy8gSWYgdGhlIGJlc3QgbWF0Y2ggcmVwcmVzZW50cyBhIGNvbmZsaWN0LCB0aGVuIHJldHVybiBudWxsLgotCQlpZiAoY29uZmxpY3QpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIGEgd2lubmVyLi4uLgotCQlyZXR1cm4gYmVzdE1hdGNoOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIE5vdGlmaWVzIHRoaXMgbWFuYWdlciB0aGF0IGEgc2NoZW1lIGhhcyBjaGFuZ2VkLiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZAotCSAqIGZvciBpbnRlcm5hbCB1c2Ugb25seS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FsbHMgb3V0IHRvIGxpc3RlbmVycywgYW5kIHNvIHRoZSB0aW1lIGl0IHRha2VzIHRvIGNvbXBsZXRlCi0JICogaXMgZGVwZW5kZW50IG9uIHRoaXJkLXBhcnR5IGNvZGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzY2hlbWVFdmVudAotCSAqICAgICAgICAgICAgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgY2hhbmdlIGluIHRoZSBzY2hlbWUuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2NoZW1lQ2hhbmdlZChmaW5hbCBTY2hlbWVFdmVudCBzY2hlbWVFdmVudCkgewotCQlpZiAoc2NoZW1lRXZlbnQuaXNEZWZpbmVkQ2hhbmdlZCgpKSB7Ci0JCQlmaW5hbCBTY2hlbWUgc2NoZW1lID0gc2NoZW1lRXZlbnQuZ2V0U2NoZW1lKCk7Ci0JCQlmaW5hbCBib29sZWFuIHNjaGVtZUlkQWRkZWQgPSBzY2hlbWUuaXNEZWZpbmVkKCk7Ci0JCQlib29sZWFuIGFjdGl2ZVNjaGVtZUNoYW5nZWQgPSBmYWxzZTsKLQkJCWlmIChzY2hlbWVJZEFkZGVkKSB7Ci0JCQkJZGVmaW5lZEhhbmRsZU9iamVjdHMuYWRkKHNjaGVtZSk7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmluZWRIYW5kbGVPYmplY3RzLnJlbW92ZShzY2hlbWUpOwotCi0JCQkJaWYgKGFjdGl2ZVNjaGVtZSA9PSBzY2hlbWUpIHsKLQkJCQkJYWN0aXZlU2NoZW1lID0gbnVsbDsKLQkJCQkJYWN0aXZlU2NoZW1lSWRzID0gbnVsbDsKLQkJCQkJYWN0aXZlU2NoZW1lQ2hhbmdlZCA9IHRydWU7Ci0KLQkJCQkJLy8gQ2xlYXIgdGhlIGJpbmRpbmcgc29sdXRpb24uCi0JCQkJCWNsZWFyU29sdXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZpcmVCaW5kaW5nTWFuYWdlckNoYW5nZWQobmV3IEJpbmRpbmdNYW5hZ2VyRXZlbnQodGhpcywgZmFsc2UsCi0JCQkJCW51bGwsIGFjdGl2ZVNjaGVtZUNoYW5nZWQsIHNjaGVtZSwgc2NoZW1lSWRBZGRlZCwgZmFsc2UsCi0JCQkJCWZhbHNlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhY3RpdmUgYmluZGluZ3MgYW5kIHRoZSBwcmVmaXggdGFibGUuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB0d28KLQkgKiB2YWx1ZXMgY2hhbmdlIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aGF0IGFueSBsaXN0ZW5lcnMgYXJlIG5vdGlmaWVkCi0JICogYXBwcm9wcmlhdGVseS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZlQmluZGluZ3MKLQkgKiAgICAgICAgICAgIFRoaXMgaXMgYSBtYXAgb2YgdHJpZ2dlcnMgKCA8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KQotCSAqICAgICAgICAgICAgdG8gYmluZGluZ3MgKDxjb2RlPkJpbmRpbmc8L2NvZGU+KS4gVGhpcyB2YWx1ZSB3aWxsIG9ubHkKLQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhY3RpdmUgYmluZGluZ3MgaGF2ZSBub3QgeWV0Ci0JICogICAgICAgICAgICBiZWVuIGNvbXB1dGVkLiBPdGhlcndpc2UsIHRoaXMgdmFsdWUgbWF5IGJlIGVtcHR5LgotCSAqIEBwYXJhbSBhY3RpdmVCaW5kaW5nc0J5Q29tbWFuZElkCi0JICogICAgICAgICAgICBUaGlzIGlzIGEgbWFwIG9mIGZ1bGx5LXBhcmFtZXRlcml6ZWQgY29tbWFuZHMgKDxjb2RlPlBhcmFtZXRlcml6ZWRDb21tYW5kPC9jb2RlPikKLQkgKiAgICAgICAgICAgIHRvIHRyaWdnZXJzICggPGNvZGU+VHJpZ2dlclNlcXVlbmNlPC9jb2RlPikuIFRoaXMgdmFsdWUKLQkgKiAgICAgICAgICAgIHdpbGwgb25seSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYWN0aXZlIGJpbmRpbmdzIGhhdmUKLQkgKiAgICAgICAgICAgIG5vdCB5ZXQgYmVlbiBjb21wdXRlZC4gT3RoZXJ3aXNlLCB0aGlzIHZhbHVlIG1heSBiZSBlbXB0eS4KLQkgKiBAcGFyYW0gcHJlZml4VGFibGUKLQkgKiAgICAgICAgICAgIEEgbWFwIG9mIHByZWZpeGVzICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KSB0byBhIG1hcAotCSAqICAgICAgICAgICAgb2YgYXZhaWxhYmxlIGNvbXBsZXRpb25zIChwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPiwgd2hpY2gKLQkgKiAgICAgICAgICAgIG1lYW5zIHRoZXJlIGlzIGFuIGV4YWN0IG1hdGNoKS4gVGhlIGF2YWlsYWJsZSBjb21wbGV0aW9ucyBpcyBhCi0JICogICAgICAgICAgICBtYXAgb2YgdHJpZ2dlciAoPGNvZGU+VHJpZ2dlclNlcXVlbmNlPC9jb2RlPikgdG8gYmluZGluZyAoPGNvZGU+QmluZGluZzwvY29kZT4pLgotCSAqICAgICAgICAgICAgVGhpcyB2YWx1ZSBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZXhpc3RpbmcKLQkgKiAgICAgICAgICAgIHNvbHV0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBzZXRBY3RpdmVCaW5kaW5ncyhmaW5hbCBNYXAgYWN0aXZlQmluZGluZ3MsCi0JCQlmaW5hbCBNYXAgYWN0aXZlQmluZGluZ3NCeUNvbW1hbmRJZCwgZmluYWwgTWFwIHByZWZpeFRhYmxlKSB7Ci0JCXRoaXMuYWN0aXZlQmluZGluZ3MgPSBhY3RpdmVCaW5kaW5nczsKLQkJZmluYWwgTWFwIHByZXZpb3VzQmluZGluZ3NCeVBhcmFtZXRlcml6ZWRDb21tYW5kID0gdGhpcy5hY3RpdmVCaW5kaW5nc0J5UGFyYW1ldGVyaXplZENvbW1hbmQ7Ci0JCXRoaXMuYWN0aXZlQmluZGluZ3NCeVBhcmFtZXRlcml6ZWRDb21tYW5kID0gYWN0aXZlQmluZGluZ3NCeUNvbW1hbmRJZDsKLQkJdGhpcy5wcmVmaXhUYWJsZSA9IHByZWZpeFRhYmxlOwotCi0JCWZpcmVCaW5kaW5nTWFuYWdlckNoYW5nZWQobmV3IEJpbmRpbmdNYW5hZ2VyRXZlbnQodGhpcywgdHJ1ZSwKLQkJCQlwcmV2aW91c0JpbmRpbmdzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCwgZmFsc2UsIG51bGwsIGZhbHNlLAotCQkJCWZhbHNlLCBmYWxzZSkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFNlbGVjdHMgb25lIG9mIHRoZSBzY2hlbWVzIGFzIHRoZSBhY3RpdmUgc2NoZW1lLiBUaGlzIHNjaGVtZSBtdXN0IGJlCi0JICogZGVmaW5lZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8obik8L2NvZGU+LCB3aGVyZSA8Y29kZT5uPC9jb2RlPiBpcwotCSAqIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRleHQgdHJlZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNjaGVtZQotCSAqICAgICAgICAgICAgVGhlIHNjaGVtZSB0byBiZWNvbWUgYWN0aXZlOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgZ2l2ZW4gc2NoZW1lIGlzIGN1cnJlbnRseSB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0QWN0aXZlU2NoZW1lKGZpbmFsIFNjaGVtZSBzY2hlbWUpCi0JCQl0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCWlmIChzY2hlbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDYW5ub3QgYWN0aXZhdGUgYSBudWxsIHNjaGVtZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoKHNjaGVtZSA9PSBudWxsKSB8fCAoIXNjaGVtZS5pc0RlZmluZWQoKSkpIHsKLQkJCXRocm93IG5ldyBOb3REZWZpbmVkRXhjZXB0aW9uKCJDYW5ub3QgYWN0aXZhdGUgYW4gdW5kZWZpbmVkIHNjaGVtZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoVXRpbC5lcXVhbHMoYWN0aXZlU2NoZW1lLCBzY2hlbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlhY3RpdmVTY2hlbWUgPSBzY2hlbWU7Ci0JCWFjdGl2ZVNjaGVtZUlkcyA9IGdldFNjaGVtZUlkcyhhY3RpdmVTY2hlbWUuZ2V0SWQoKSk7Ci0JCWNsZWFyU29sdXRpb24oKTsKLQkJZmlyZUJpbmRpbmdNYW5hZ2VyQ2hhbmdlZChuZXcgQmluZGluZ01hbmFnZXJFdmVudCh0aGlzLCBmYWxzZSwgbnVsbCwKLQkJCQl0cnVlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ2hhbmdlcyB0aGUgc2V0IG9mIGJpbmRpbmdzIGZvciB0aGlzIGJpbmRpbmcgbWFuYWdlci4gQ2hhbmdpbmcgdGhlIHNldCBvZgotCSAqIGJpbmRpbmdzIGFsbCBhdCBvbmNlIGVuc3VyZXMgdGhhdDogKDEpIGR1cGxpY2F0ZXMgYXJlIHJlbW92ZWQ7IGFuZCAoMikKLQkgKiBhdm9pZHMgdW5uZWNlc3NhcnkgaW50ZXJtZWRpYXRlIGNvbXB1dGF0aW9ucy4gVGhpcyBtZXRob2QgY2xlYXJzIHRoZQotCSAqIGV4aXN0aW5nIGJpbmRpbmdzLCBidXQgZG9lcyBub3QgdHJpZ2dlciBhIHJlY29tcHV0YXRpb24gKG90aGVyIG1ldGhvZAotCSAqIGNhbGxzIGFyZSByZXF1aXJlZCB0byBkbyB0aGF0KS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8obik8L2NvZGU+LCB3aGVyZSA8Y29kZT5uPC9jb2RlPiBpcwotCSAqIHRoZSBudW1iZXIgb2YgYmluZGluZ3MuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBiaW5kaW5ncwotCSAqICAgICAgICAgICAgVGhlIG5ldyBhcnJheSBvZiBiaW5kaW5nczsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzCi0JICogICAgICAgICAgICBzZXQgaXMgY29waWVkIGludG8gYSBsb2NhbCBkYXRhIHN0cnVjdHVyZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRCaW5kaW5ncyhmaW5hbCBCaW5kaW5nW10gYmluZGluZ3MpIHsKLQkJaWYgKEFycmF5cy5lcXVhbHModGhpcy5iaW5kaW5ncywgYmluZGluZ3MpKSB7Ci0JCQlyZXR1cm47IC8vIG5vdGhpbmcgaGFzIGNoYW5nZWQKLQkJfQotCi0JCWlmICgoYmluZGluZ3MgPT0gbnVsbCkgfHwgKGJpbmRpbmdzLmxlbmd0aCA9PSAwKSkgewotCQkJdGhpcy5iaW5kaW5ncyA9IG51bGw7Ci0JCQliaW5kaW5nQ291bnQgPSAwOwotCQl9IGVsc2UgewotCQkJZmluYWwgaW50IGJpbmRpbmdzTGVuZ3RoID0gYmluZGluZ3MubGVuZ3RoOwotCQkJdGhpcy5iaW5kaW5ncyA9IG5ldyBCaW5kaW5nW2JpbmRpbmdzTGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYmluZGluZ3MsIDAsIHRoaXMuYmluZGluZ3MsIDAsIGJpbmRpbmdzTGVuZ3RoKTsKLQkJCWJpbmRpbmdDb3VudCA9IGJpbmRpbmdzTGVuZ3RoOwotCQl9Ci0JCWNsZWFyQ2FjaGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDaGFuZ2VzIHRoZSBsb2NhbGUgZm9yIHRoaXMgYmluZGluZyBtYW5hZ2VyLiBUaGUgbG9jYWxlIGNhbiBiZSB1c2VkIHRvCi0JICogcHJvdmlkZSBsb2NhbGUtc3BlY2lmaWMgYmluZGluZ3MuIElmIHRoZSBsb2NhbGUgaXMgZGlmZmVyZW50IHRoYW4gdGhlCi0JICogY3VycmVudCBsb2NhbGUsIHRoaXMgd2lsbCBmb3JjZSBhIHJlY29tcHV0YXRpb24gb2YgdGhlIGJpbmRpbmdzLiBUaGUKLQkgKiBsb2NhbGUgaXMgaW4gdGhlIHNhbWUgZm9ybWF0IGFzCi0JICogPGNvZGU+TG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY29tcGxldGVzIGluIDxjb2RlPk8oMSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBUaGUgbmV3IGxvY2FsZTsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNlZSBMb2NhbGUjZ2V0RGVmYXVsdCgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0TG9jYWxlKGZpbmFsIFN0cmluZyBsb2NhbGUpIHsKLQkJaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBsb2NhbGUgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKCFVdGlsLmVxdWFscyh0aGlzLmxvY2FsZSwgbG9jYWxlKSkgewotCQkJdGhpcy5sb2NhbGUgPSBsb2NhbGU7Ci0JCQl0aGlzLmxvY2FsZXMgPSBleHBhbmQobG9jYWxlLCBMT0NBTEVfU0VQQVJBVE9SKTsKLQkJCWNsZWFyU29sdXRpb24oKTsKLQkJCWZpcmVCaW5kaW5nTWFuYWdlckNoYW5nZWQobmV3IEJpbmRpbmdNYW5hZ2VyRXZlbnQodGhpcywgZmFsc2UsCi0JCQkJCW51bGwsIGZhbHNlLCBudWxsLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENoYW5nZXMgdGhlIHBsYXRmb3JtIGZvciB0aGlzIGJpbmRpbmcgbWFuYWdlci4gVGhlIHBsYXRmb3JtIGNhbiBiZSB1c2VkCi0JICogdG8gcHJvdmlkZSBwbGF0Zm9ybS1zcGVjaWZpYyBiaW5kaW5ncy4gSWYgdGhlIHBsYXRmb3JtIGlzIGRpZmZlcmVudCB0aGFuCi0JICogdGhlIGN1cnJlbnQgcGxhdGZvcm0sIHRoZW4gdGhpcyB3aWxsIGZvcmNlIGEgcmVjb21wdXRhdGlvbiBvZiB0aGUKLQkgKiBiaW5kaW5ncy4gVGhlIGxvY2FsZSBpcyBpbiB0aGUgc2FtZSBmb3JtYXQgYXMKLQkgKiA8Y29kZT5TV1QuZ2V0UGxhdGZvcm0oKTwvY29kZT4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpbiA8Y29kZT5PKDEpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBsYXRmb3JtCi0JICogICAgICAgICAgICBUaGUgbmV3IHBsYXRmb3JtOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5TV1QjZ2V0UGxhdGZvcm0oKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFBsYXRmb3JtKGZpbmFsIFN0cmluZyBwbGF0Zm9ybSkgewotCQlpZiAocGxhdGZvcm0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGUgcGxhdGZvcm0gY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKCFVdGlsLmVxdWFscyh0aGlzLnBsYXRmb3JtLCBwbGF0Zm9ybSkpIHsKLQkJCXRoaXMucGxhdGZvcm0gPSBwbGF0Zm9ybTsKLQkJCXRoaXMucGxhdGZvcm1zID0gZXhwYW5kKHBsYXRmb3JtLCBVdGlsLlpFUk9fTEVOR1RIX1NUUklORyk7Ci0JCQljbGVhclNvbHV0aW9uKCk7Ci0JCQlmaXJlQmluZGluZ01hbmFnZXJDaGFuZ2VkKG5ldyBCaW5kaW5nTWFuYWdlckV2ZW50KHRoaXMsIGZhbHNlLAotCQkJCQludWxsLCBmYWxzZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9CaW5kaW5nTWFuYWdlckV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9CaW5kaW5nTWFuYWdlckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZTlhODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3MvQmluZGluZ01hbmFnZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuUGFyYW1ldGVyaXplZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uQWJzdHJhY3RCaXRTZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlV0aWw7Ci0KLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBkZXNjcmliZXMgY2hhbmdlcyB0byBhbiBpbnN0YW5jZSBvZgotICogPGNvZGU+QmluZGluZ01hbmFnZXI8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKiBAc2VlIElCaW5kaW5nTWFuYWdlckxpc3RlbmVyI2JpbmRpbmdNYW5hZ2VyQ2hhbmdlZChCaW5kaW5nTWFuYWdlckV2ZW50KQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluZGluZ01hbmFnZXJFdmVudCBleHRlbmRzIEFic3RyYWN0Qml0U2V0RXZlbnQgewotCi0JLyoqCi0JICogVGhlIGJpdCB1c2VkIHRvIHJlcHJlc2VudCB3aGV0aGVyIHRoZSBtYXAgb2YgYWN0aXZlIGJpbmRpbmdzIGhhcyBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEX0FDVElWRV9CSU5ESU5HUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgYml0IHVzZWQgdG8gcmVwcmVzZW50IHdoZXRoZXIgdGhlIGFjdGl2ZSBzY2hlbWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIQU5HRURfQUNUSVZFX1NDSEVNRSA9IDEgPDwgMTsKLQotCS8qKgotCSAqIFRoZSBiaXQgdXNlZCB0byByZXByZXNlbnQgd2hldGhlciB0aGUgYWN0aXZlIGxvY2FsZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRF9MT0NBTEUgPSAxIDw8IDI7Ci0KLQkvKioKLQkgKiBUaGUgYml0IHVzZWQgdG8gcmVwcmVzZW50IHdoZXRoZXIgdGhlIGFjdGl2ZSBwbGF0Zm9ybSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRF9QTEFURk9STSA9IDEgPDwgMzsKLQotCS8qKgotCSAqIFRoZSBiaXQgdXNlZCB0byByZXByZXNlbnQgd2hldGhlciB0aGUgc2NoZW1lJ3MgZGVmaW5lZCBzdGF0ZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRF9TQ0hFTUVfREVGSU5FRCA9IDEgPDwgNDsKLQotCS8qKgotCSAqIFRoZSBiaW5kaW5nIG1hbmFnZXIgdGhhdCBoYXMgY2hhbmdlZDsgdGhpcyB2YWx1ZSBpcyBuZXZlcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgQmluZGluZ01hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIFRoZSBtYXAgb2YgdHJpZ2dlcnMgKDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+IG9mCi0JICogPGNvZGU+VHJpZ2dlclNlcXVlbmNlPC9jb2RlPikgYnkgcGFyYW1ldGVyaXplZCBjb21tYW5kICg8Y29kZT5QYXJhbWV0ZXJpemVkQ29tbWFuZDwvY29kZT4pCi0JICogYmVmb3JlIHRoZSBjaGFuZ2Ugb2NjdXJyZWQuIFRoaXMgbWFwIG1heSBiZSBlbXB0eSBhbmQgaXQgbWF5IGJlCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAgcHJldmlvdXNUcmlnZ2Vyc0J5UGFyYW1ldGVyaXplZENvbW1hbmQ7Ci0KLQkvKioKLQkgKiBUaGUgc2NoZW1lIHRoYXQgYmVjYW1lIGRlZmluZWQgb3IgdW5kZWZpbmVkLiBUaGlzIHZhbHVlIG1heSBiZQotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHNjaGVtZSBjaGFuZ2VkIGl0cyBkZWZpbmVkIHN0YXRlLgotCSAqLwotCXByaXZhdGUgZmluYWwgU2NoZW1lIHNjaGVtZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIGluc3RhbmNlIG9mIHRoZSBiaW5kaW5nIG1hbmFnZXIgdGhhdCBjaGFuZ2VkOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGFjdGl2ZUJpbmRpbmdzQ2hhbmdlZAotCSAqICAgICAgICAgICAgV2hldGhlciB0aGUgYWN0aXZlIGJpbmRpbmdzIGhhdmUgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcHJldmlvdXNUcmlnZ2Vyc0J5UGFyYW1ldGVyaXplZENvbW1hbmQKLQkgKiAgICAgICAgICAgIFRoZSBtYXAgb2YgdHJpZ2dlcnMgKDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pIGJ5Ci0JICogICAgICAgICAgICBmdWxseS1wYXJhbWV0ZXJpemVkIGNvbW1hbmQgKDxjb2RlPlBhcmFtZXRlcml6ZWRDb21tYW5kPC9jb2RlPikKLQkgKiAgICAgICAgICAgIGJlZm9yZSB0aGUgY2hhbmdlIG9jY3VyZWQuIFRoaXMgbWFwIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgb3IgZW1wdHkuCi0JICogQHBhcmFtIGFjdGl2ZVNjaGVtZUNoYW5nZWQKLQkgKiAgICAgICAgICAgIHRydWUsIGlmZiB0aGUgYWN0aXZlIHNjaGVtZSBjaGFuZ2VkLgotCSAqIEBwYXJhbSBzY2hlbWUKLQkgKiAgICAgICAgICAgIFRoZSBzY2hlbWUgdGhhdCBiZWNhbWUgZGVmaW5lZCBvciB1bmRlZmluZWQ7IDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiBubyBzY2hlbWUgY2hhbmdlZCBzdGF0ZS4KLQkgKiBAcGFyYW0gc2NoZW1lRGVmaW5lZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHNjaGVtZSBiZWNhbWUgZGVmaW5lZDsKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogQHBhcmFtIGxvY2FsZUNoYW5nZWQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgYWN0aXZlIGxvY2FsZSBjaGFuZ2VkCi0JICogQHBhcmFtIHBsYXRmb3JtQ2hhbmdlZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSBhY3RpdmUgcGxhdGZvcm0gY2hhbmdlZAotCSAqLwotCXB1YmxpYyBCaW5kaW5nTWFuYWdlckV2ZW50KGZpbmFsIEJpbmRpbmdNYW5hZ2VyIG1hbmFnZXIsCi0JCQlmaW5hbCBib29sZWFuIGFjdGl2ZUJpbmRpbmdzQ2hhbmdlZCwKLQkJCWZpbmFsIE1hcCBwcmV2aW91c1RyaWdnZXJzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZCwKLQkJCWZpbmFsIGJvb2xlYW4gYWN0aXZlU2NoZW1lQ2hhbmdlZCwgZmluYWwgU2NoZW1lIHNjaGVtZSwKLQkJCWZpbmFsIGJvb2xlYW4gc2NoZW1lRGVmaW5lZCwgZmluYWwgYm9vbGVhbiBsb2NhbGVDaGFuZ2VkLAotCQkJZmluYWwgYm9vbGVhbiBwbGF0Zm9ybUNoYW5nZWQpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLQkJCQkJIkEgYmluZGluZyBtYW5hZ2VyIGV2ZW50IG5lZWRzIGEgYmluZGluZyBtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQotCQlpZiAoc2NoZW1lRGVmaW5lZCAmJiAoc2NoZW1lID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0JCQkJCSJJZiBhIHNjaGVtZSBjaGFuZ2VkIGRlZmluZWQgc3RhdGUsIHRoZW4gdGhlcmUgc2hvdWxkIGJlIGEgc2NoZW1lIGlkZW50aWZpZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuc2NoZW1lID0gc2NoZW1lOwotCi0JCXRoaXMucHJldmlvdXNUcmlnZ2Vyc0J5UGFyYW1ldGVyaXplZENvbW1hbmQgPSBwcmV2aW91c1RyaWdnZXJzQnlQYXJhbWV0ZXJpemVkQ29tbWFuZDsKLQotCQlpZiAoYWN0aXZlQmluZGluZ3NDaGFuZ2VkKSB7Ci0JCQljaGFuZ2VkVmFsdWVzIHw9IENIQU5HRURfQUNUSVZFX0JJTkRJTkdTOwotCQl9Ci0JCWlmIChhY3RpdmVTY2hlbWVDaGFuZ2VkKSB7Ci0JCQljaGFuZ2VkVmFsdWVzIHw9IENIQU5HRURfQUNUSVZFX1NDSEVNRTsKLQkJfQotCQlpZiAobG9jYWxlQ2hhbmdlZCkgewotCQkJY2hhbmdlZFZhbHVlcyB8PSBDSEFOR0VEX0xPQ0FMRTsKLQkJfQotCQlpZiAocGxhdGZvcm1DaGFuZ2VkKSB7Ci0JCQljaGFuZ2VkVmFsdWVzIHw9IENIQU5HRURfUExBVEZPUk07Ci0JCX0KLQkJaWYgKHNjaGVtZURlZmluZWQpIHsKLQkJCWNoYW5nZWRWYWx1ZXMgfD0gQ0hBTkdFRF9TQ0hFTUVfREVGSU5FRDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoZSBtYW5hZ2VyIHRoYXQgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGUgbWFuYWdlciB0aGF0IGNoYW5nZWQuIEd1YXJhbnRlZWQgbm90IHRvIGJlCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgQmluZGluZ01hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2NoZW1lIHRoYXQgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjaGFuZ2VkIHNjaGVtZQotCSAqLwotCXB1YmxpYyBmaW5hbCBTY2hlbWUgZ2V0U2NoZW1lKCkgewotCQlyZXR1cm4gc2NoZW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgYWN0aXZlIGJpbmRpbmdzIGhhdmUgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhY3RpdmUgYmluZGluZ3MgaGF2ZSBjaGFuZ2VkOwotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FjdGl2ZUJpbmRpbmdzQ2hhbmdlZCgpIHsKLQkJcmV0dXJuICgoY2hhbmdlZFZhbHVlcyAmIENIQU5HRURfQUNUSVZFX0JJTkRJTkdTKSAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB3aGV0aGVyIHRoZSBhY3RpdmUgYmluZGluZ3MgaGF2ZSBjaGFuZ2VkIGZvciBhIGdpdmVuIGNvbW1hbmQKLQkgKiBpZGVudGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJhbWV0ZXJpemVkQ29tbWFuZAotCSAqICAgICAgICAgICAgVGhlIGZ1bGx5LXBhcmFtZXRlcml6ZWQgY29tbWFuZCB3aG9zZSBiaW5kaW5ncyBtaWdodCBoYXZlCi0JICogICAgICAgICAgICBjaGFuZ2VkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhY3RpdmUgYmluZGluZ3MgaGF2ZSBjaGFuZ2VkIGZvciB0aGUKLQkgKiAgICAgICAgIGdpdmVuIGNvbW1hbmQgaWRlbnRpZmllcjsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FjdGl2ZUJpbmRpbmdzQ2hhbmdlZEZvcigKLQkJCWZpbmFsIFBhcmFtZXRlcml6ZWRDb21tYW5kIHBhcmFtZXRlcml6ZWRDb21tYW5kKSB7Ci0JCWZpbmFsIFRyaWdnZXJTZXF1ZW5jZVtdIGN1cnJlbnRCaW5kaW5ncyA9IG1hbmFnZXIKLQkJCQkuZ2V0QWN0aXZlQmluZGluZ3NGb3IocGFyYW1ldGVyaXplZENvbW1hbmQpOwotCQlmaW5hbCBUcmlnZ2VyU2VxdWVuY2VbXSBwcmV2aW91c0JpbmRpbmdzOwotCQlpZiAocHJldmlvdXNUcmlnZ2Vyc0J5UGFyYW1ldGVyaXplZENvbW1hbmQgIT0gbnVsbCkgewotCQkJZmluYWwgQ29sbGVjdGlvbiBwcmV2aW91c0JpbmRpbmdDb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHByZXZpb3VzVHJpZ2dlcnNCeVBhcmFtZXRlcml6ZWRDb21tYW5kCi0JCQkJCS5nZXQocGFyYW1ldGVyaXplZENvbW1hbmQpOwotCQkJaWYgKHByZXZpb3VzQmluZGluZ0NvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJCXByZXZpb3VzQmluZGluZ3MgPSBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlwcmV2aW91c0JpbmRpbmdzID0gKFRyaWdnZXJTZXF1ZW5jZVtdKSBwcmV2aW91c0JpbmRpbmdDb2xsZWN0aW9uCi0JCQkJCQkudG9BcnJheShuZXcgVHJpZ2dlclNlcXVlbmNlW3ByZXZpb3VzQmluZGluZ0NvbGxlY3Rpb24KLQkJCQkJCQkJLnNpemUoKV0pOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJldmlvdXNCaW5kaW5ncyA9IG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gIVV0aWwuZXF1YWxzKGN1cnJlbnRCaW5kaW5ncywgcHJldmlvdXNCaW5kaW5ncyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgYWN0aXZlIHNjaGVtZSBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSwgaWZmIHRoZSBhY3RpdmUgc2NoZW1lIHByb3BlcnR5IGNoYW5nZWQuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBY3RpdmVTY2hlbWVDaGFuZ2VkKCkgewotCQlyZXR1cm4gKChjaGFuZ2VkVmFsdWVzICYgQ0hBTkdFRF9BQ1RJVkVfU0NIRU1FKSAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxvY2FsZSBoYXMgY2hhbmdlZAotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxvY2FsZSBjaGFuZ2VkOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsZUNoYW5nZWQoKSB7Ci0JCXJldHVybiAoKGNoYW5nZWRWYWx1ZXMgJiBDSEFOR0VEX0xPQ0FMRSkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBwbGF0Zm9ybSBoYXMgY2hhbmdlZAotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBsYXRmb3JtIGNoYW5nZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGxhdGZvcm1DaGFuZ2VkKCkgewotCQlyZXR1cm4gKChjaGFuZ2VkVmFsdWVzICYgQ0hBTkdFRF9QTEFURk9STSkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsaXN0IG9mIGRlZmluZWQgc2NoZW1lIGlkZW50aWZpZXJzIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpc3Qgb2Ygc2NoZW1lIGlkZW50aWZpZXJzIGhhcwotCSAqICAgICAgICAgY2hhbmdlZDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1NjaGVtZUNoYW5nZWQoKSB7Ci0JCXJldHVybiAoc2NoZW1lICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHNjaGVtZSBiZWNhbWUgZGVmaW5lZAotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNjaGVtZSBiZWNhbWUgZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1NjaGVtZURlZmluZWQoKSB7Ci0JCXJldHVybiAoKChjaGFuZ2VkVmFsdWVzICYgQ0hBTkdFRF9TQ0hFTUVfREVGSU5FRCkgIT0gMCkgJiYgKHNjaGVtZSAhPSBudWxsKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3MvQ2FjaGVkQmluZGluZ1NldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3MvQ2FjaGVkQmluZGluZ1NldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTgyYzExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL0NhY2hlZEJpbmRpbmdTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5VdGlsOwotCi0vKioKLSAqIDxwPgotICogQSByZXNvbHV0aW9uIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHN0YXRlLiBUbyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEKLSAqIGNhY2hlZCBiaW5kaW5nIHNldCwganVzdCBjcmVhdGUgb25lIG9mIHRoZXNlIGJpbmRpbmcgc2V0cyBhbmQgdGhlbiBsb29rIGl0IHVwCi0gKiBpbiBhIG1hcC4gSWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUsIHRoZW4gYWRkIGl0IGFuZCBzZXQgdGhlIGNhY2hlZCBiaW5kaW5nCi0gKiByZXNvbHV0aW9uLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWZpbmFsIGNsYXNzIENhY2hlZEJpbmRpbmdTZXQgewotCi0JLyoqCi0JICogQSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgaGFzaCBjb2RlIGZvciBhbGwgY2FjaGVkIGJpbmRpbmcgc2V0cy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSEFTSF9GQUNUT1IgPSA4OTsKLQotCS8qKgotCSAqIFRoZSBzZWVkIGZvciB0aGUgaGFzaCBjb2RlIGZvciBhbGwgY2FjaGVkIGJpbmRpbmcgc2V0cy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSEFTSF9JTklUSUFMID0gQ2FjaGVkQmluZGluZ1NldC5jbGFzcy5nZXROYW1lKCkKLQkJCS5oYXNoQ29kZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJlZSBvZiBhY3RpdmUgY29udGV4dHMgYXQgdGhlIHRpbWUgdGhpcyBjYWNoZWQKLQkgKiBiaW5kaW5nIHNldCB3YXMgY29tcHV0ZWQuIEl0IGlzIGEgbWFwIG9mIGNvbnRleHQgaWQgKDxjb2RlPlN0cmluZzwvY29kZT4pCi0JICogdG8gY29udGV4dCBpZCAoPGNvZGU+U3RyaW5nPC9jb2RlPikuIEVhY2gga2V5IHJlcHJlc2VudHMgb25lIG9mIHRoZQotCSAqIGFjdGl2ZSBjb250ZXh0cyBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycywgd2hpbGUgZWFjaCB2YWx1ZSByZXByZXNlbnRzIGl0cwotCSAqIHBhcmVudC4gVGhpcyBpcyBhIHdheSBvZiBwZXJzZXJ2aW5nIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgdGhlIGhpZXJhcmNoeQotCSAqIGxvb2tlZCBsaWtlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIHZhbHVlIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNvbnRleHRzIHdlcmUgZGlzcmVnYXJkZWQKLQkgKiBpbiB0aGUgY29tcHV0YXRpb24uIEl0IG1heSBhbHNvIGJlIGVtcHR5LiBBbGwgb2YgdGhlIGtleXMgYXJlIGd1YXJhbnRlZWQKLQkgKiB0byBiZSBub24tIDxjb2RlPm51bGw8L2NvZGU+LCBidXQgdGhlIHZhbHVlcyBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAoaS5lLiwgbm8gcGFyZW50KS4KLQkgKiA8L3A+Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAgYWN0aXZlQ29udGV4dFRyZWU7Ci0KLQkvKioKLQkgKiBUaGUgbWFwIHJlcHJlc2VudGluZyB0aGUgcmVzb2x2ZWQgc3RhdGUgb2YgdGhlIGJpbmRpbmdzLiBUaGlzIGlzIGEgbWFwIG9mCi0JICogYSB0cmlnZ2VyICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KSB0byBiaW5kaW5nICg8Y29kZT5CaW5kaW5nPC9jb2RlPikuCi0JICogVGhpcyB2YWx1ZSBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZC4KLQkgKi8KLQlwcml2YXRlIE1hcCBiaW5kaW5nc0J5VHJpZ2dlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgaGFzaCBjb2RlIGZvciB0aGlzIG9iamVjdC4gVGhpcyB2YWx1ZSBpcyBjb21wdXRlZCBsYXppbHksIGFuZCBtYXJrZWQKLQkgKiBhcyBpbnZhbGlkIHdoZW4gb25lIG9mIHRoZSB2YWx1ZXMgb24gd2hpY2ggaXQgaXMgYmFzZWQgY2hhbmdlcy4KLQkgKi8KLQlwcml2YXRlIHRyYW5zaWVudCBpbnQgaGFzaENvZGU7Ci0KLQkvKioKLQkgKiBXaGV0aGVyIDxjb2RlPmhhc2hDb2RlPC9jb2RlPiBzdGlsbCBjb250YWlucyBhIHZhbGlkIHZhbHVlLgotCSAqLwotCXByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gaGFzaENvZGVDb21wdXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGxpc3Qgb2YgbG9jYWxlcyB0aGF0IHdlcmUgYWN0aXZlIGF0IHRoZSB0aW1lIHRoaXMgYmluZGluZyBzZXQgd2FzCi0JICogY29tcHV0ZWQuIFRoaXMgbGlzdCBzdGFydHMgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUKLQkgKiBsb2NhbGUsIGFuZCBtb3ZlcyB0byBtb3JlIGdlbmVyYWwgcmVwcmVzZW50YXRpb25zLiBGb3IgZXhhbXBsZSwgdGhpcwotCSAqIGFycmF5IG1pZ2h0IGxvb2sgbGlrZSBbImVuX1VTIiwgImVuIiwgIiIsIG51bGxdLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGFuZCBpdCB3aWxsIG5ldmVyIGJlCi0JICogZW1wdHkuIEl0IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWxlbWVudCwgYnV0IGl0cyBlbGVtZW50cyBjYW4gYmUKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBsb2NhbGVzOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGxpc3Qgb2YgcGxhdGZvcm1zIHRoYXQgd2VyZSBhY3RpdmUgYXQgdGhlIHRpbWUgdGhpcyBiaW5kaW5nIHNldCB3YXMKLQkgKiBjb21wdXRlZC4gVGhpcyBsaXN0IHN0YXJ0cyB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotCSAqIHBsYXRmb3JtLCBhbmQgbW92ZXMgdG8gbW9yZSBnZW5lcmFsIHJlcHJlc2VudGF0aW9ucy4gRm9yIGV4YW1wbGUsIHRoaXMKLQkgKiBhcnJheSBtaWdodCBsb29rIGxpa2UgWyJndGsiLCAiIiwgbnVsbF0uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgdmFsdWUgd2lsbCBuZXZlciBiZSA8Y29kZT5udWxsPC9jb2RlPiwgYW5kIGl0IHdpbGwgbmV2ZXIgYmUKLQkgKiBlbXB0eS4gSXQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbGVtZW50LCBidXQgaXRzIGVsZW1lbnRzIGNhbiBiZQotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHBsYXRmb3JtczsKLQotCS8qKgotCSAqIEEgbWFwIG9mIHByZWZpeGVzICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KSB0byBhIG1hcCBvZgotCSAqIGF2YWlsYWJsZSBjb21wbGV0aW9ucyAocG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4sIHdoaWNoIG1lYW5zIHRoZXJlCi0JICogaXMgYW4gZXhhY3QgbWF0Y2gpLiBUaGUgYXZhaWxhYmxlIGNvbXBsZXRpb25zIGlzIGEgbWFwIG9mIHRyaWdnZXIgKDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pCi0JICogdG8gY29tbWFuZCBpZGVudGlmaWVyICg8Y29kZT5TdHJpbmc8L2NvZGU+KS4gVGhpcyB2YWx1ZSBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICovCi0JcHJpdmF0ZSBNYXAgcHJlZml4VGFibGUgPSBudWxsOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGxpc3Qgb2Ygc2NoZW1lcyB0aGF0IHdlcmUgYWN0aXZlIGF0IHRoZSB0aW1lIHRoaXMgYmluZGluZyBzZXQgd2FzCi0JICogY29tcHV0ZWQuIFRoaXMgbGlzdCBzdGFydHMgd2l0aCB0aGUgYWN0aXZlIHNjaGVtZSwgYW5kIHRoZW4gY29udGludWVzCi0JICogd2l0aCBhbGwgb2YgaXRzIGFuY2VzdG9ycyAtLSBpbiBvcmRlci4gRm9yIGV4YW1wbGUsIHRoaXMgbWlnaHQgbG9vayBsaWtlCi0JICogWyJlbWFjcyIsICJkZWZhdWx0Il0uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgdmFsdWUgd2lsbCBuZXZlciBiZSA8Y29kZT5udWxsPC9jb2RlPiwgYW5kIGl0IHdpbGwgbmV2ZXIgYmUKLQkgKiBlbXB0eS4gSXQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbGVtZW50LiBJdHMgZWxlbWVudHMgY2Fubm90IGJlCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gc2NoZW1lSWRzOwotCi0JLyoqCi0JICogVGhlIG1hcCByZXByZXNlbnRpbmcgdGhlIHJlc29sdmVkIHN0YXRlIG9mIHRoZSBiaW5kaW5ncy4gVGhpcyBpcyBhIG1hcCBvZgotCSAqIGEgY29tbWFuZCBpZCAoPGNvZGU+U3RyaW5nPC9jb2RlPikgdG8gdHJpZ2dlcnMgKDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+Ci0JICogb2YgPGNvZGU+VHJpZ2dlclNlcXVlbmNlPC9jb2RlPikuIFRoaXMgdmFsdWUgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZC4KLQkgKi8KLQlwcml2YXRlIE1hcCB0cmlnZ2Vyc0J5Q29tbWFuZElkID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+Q2FjaGVkQmluZGluZ1NldDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGFjdGl2ZUNvbnRleHRUcmVlCi0JICogICAgICAgICAgICBUaGUgc2V0IG9mIGNvbnRleHQgaWRlbnRpZmllcnMgdGhhdCB3ZXJlIGFjdGl2ZSB3aGVuIHRoaXMKLQkgKiAgICAgICAgICAgIGJpbmRpbmcgc2V0IHdhcyBjYWxjdWxhdGVkOyBtYXkgYmUgZW1wdHkuIElmIGl0IGlzCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGUgY29udGV4dHMgd2VyZSBkaXNyZWdhcmRlZCBpbgotCSAqICAgICAgICAgICAgdGhlIGNvbXB1dGF0aW9uLiBUaGlzIGlzIGEgbWFwIG9mIGNvbnRleHQgaWQgKAotCSAqICAgICAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPikgdG8gcGFyZW50IGNvbnRleHQgaWQgKAotCSAqICAgICAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPikuIFRoaXMgaXMgYSB3YXkgb2YgY2FjaGluZyB0aGUgbG9vayBvZgotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHJlZSBhdCB0aGUgdGltZSB0aGUgYmluZGluZyBzZXQgd2FzIGNvbXB1dGVkLgotCSAqIEBwYXJhbSBsb2NhbGVzCi0JICogICAgICAgICAgICBUaGUgbG9jYWxlcyB0aGF0IHdlcmUgYWN0aXZlIHdoZW4gdGhpcyBiaW5kaW5nIHNldCB3YXMKLQkgKiAgICAgICAgICAgIGNhbGN1bGF0ZWQuIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBjdXJyZW50bHkgYWN0aXZlIGxvY2FsZSwKLQkgKiAgICAgICAgICAgIGFuZCBpdCBpcyBmb2xsb3dlZCBieSBpbmNyZWFzaW5nbHkgbW9yZSBnZW5lcmFsIGxvY2FsZXMuIFRoaXMKLQkgKiAgICAgICAgICAgIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lCi0JICogICAgICAgICAgICBlbGVtZW50LiBUaGUgZWxlbWVudHMgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LCB0aG91Z2guCi0JICogQHBhcmFtIHBsYXRmb3JtcwotCSAqICAgICAgICAgICAgVGhlIHBsYXRmb3JtIHRoYXQgd2VyZSBhY3RpdmUgd2hlbiB0aGlzIGJpbmRpbmcgc2V0IHdhcwotCSAqICAgICAgICAgICAgY2FsY3VsYXRlZC4gVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIGN1cnJlbnRseSBhY3RpdmUKLQkgKiAgICAgICAgICAgIHBsYXRmb3JtLCBhbmQgaXQgaXMgZm9sbG93ZWQgYnkgaW5jcmVhc2luZ2x5IG1vcmUgZ2VuZXJhbAotCSAqICAgICAgICAgICAgcGxhdGZvcm1zLiBUaGlzIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBtdXN0Ci0JICogICAgICAgICAgICBjb250YWluIGF0IGxlYXN0IG9uZSBlbGVtZW50LiBUaGUgZWxlbWVudHMgY2FuIGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgdGhvdWdoLgotCSAqIEBwYXJhbSBzY2hlbWVJZHMKLQkgKiAgICAgICAgICAgIFRoZSBzY2hlbWUgdGhhdCB3YXMgYWN0aXZlIHdoZW4gdGhpcyBiaW5kaW5nIHNldCB3YXMKLQkgKiAgICAgICAgICAgIGNhbGN1bGF0ZWQsIGZvbGxvd2VkIGJ5IGl0cyBhbmNlc3RvcnMuIFRoaXMgbWF5IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlIG9yIGVtcHR5LiBUaGUKLQkgKiAgICAgICAgICAgIGVsZW1lbnRzIGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlDYWNoZWRCaW5kaW5nU2V0KGZpbmFsIE1hcCBhY3RpdmVDb250ZXh0VHJlZSwgZmluYWwgU3RyaW5nW10gbG9jYWxlcywKLQkJCWZpbmFsIFN0cmluZ1tdIHBsYXRmb3JtcywgZmluYWwgU3RyaW5nW10gc2NoZW1lSWRzKSB7Ci0JCWlmIChsb2NhbGVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVGhlIGxvY2FsZXMgY2Fubm90IGJlIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChsb2NhbGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBsb2NhbGVzIGNhbm5vdCBiZSBlbXB0eS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHBsYXRmb3JtcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBwbGF0Zm9ybXMgY2Fubm90IGJlIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChwbGF0Zm9ybXMubGVuZ3RoID09IDApIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVGhlIHBsYXRmb3JtcyBjYW5ub3QgYmUgZW1wdHkuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRoaXMuYWN0aXZlQ29udGV4dFRyZWUgPSBhY3RpdmVDb250ZXh0VHJlZTsKLQkJdGhpcy5sb2NhbGVzID0gbG9jYWxlczsKLQkJdGhpcy5wbGF0Zm9ybXMgPSBwbGF0Zm9ybXM7Ci0JCXRoaXMuc2NoZW1lSWRzID0gc2NoZW1lSWRzOwotCX0KLQotCS8qKgotCSAqIENvbXBhcmVzIHRoaXMgYmluZGluZyBzZXQgd2l0aCBhbm90aGVyIG9iamVjdC4gVGhlIG9iamVjdHMgd2lsbCBiZSBlcXVhbAotCSAqIGlmIHRoZXkgYXJlIGJvdGggaW5zdGFuY2Ugb2YgPGNvZGU+Q2FjaGVkQmluZGluZ1NldDwvY29kZT4gYW5kIGhhdmUKLQkgKiBlcXVpdmFsZW50IHZhbHVlcyBmb3IgYWxsIG9mIHRoZWlyIHByb3BlcnRpZXMuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCB3aXRoIHdoaWNoIHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXkgYXJlIGJvdGggaW5zdGFuY2VzIG9mCi0JICogICAgICAgICA8Y29kZT5DYWNoZWRCaW5kaW5nU2V0PC9jb2RlPiBhbmQgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMgZm9yIGFsbAotCSAqICAgICAgICAgb2YgdGhlaXIgcHJvcGVydGllczsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBDYWNoZWRCaW5kaW5nU2V0KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZmluYWwgQ2FjaGVkQmluZGluZ1NldCBvdGhlciA9IChDYWNoZWRCaW5kaW5nU2V0KSBvYmplY3Q7Ci0JCQotCQlpZiAoIVV0aWwuZXF1YWxzKGFjdGl2ZUNvbnRleHRUcmVlLCBvdGhlci5hY3RpdmVDb250ZXh0VHJlZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghVXRpbC5lcXVhbHMobG9jYWxlcywgb3RoZXIubG9jYWxlcykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghVXRpbC5lcXVhbHMocGxhdGZvcm1zLCBvdGhlci5wbGF0Zm9ybXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gVXRpbC5lcXVhbHMoc2NoZW1lSWRzLCBvdGhlci5zY2hlbWVJZHMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcCBvZiBjb21tYW5kIGlkZW50aWZpZXJzIGluZGV4ZWQgYnkgdHJpZ2dlciBzZXF1ZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgbWFwIG9mIHRyaWdnZXJzICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KSB0byBiaW5kaW5ncyAoPGNvZGU+QmluZGluZzwvY29kZT4pLgotCSAqICAgICAgICAgVGhpcyB2YWx1ZSBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB3YXMgbm90IHlldAotCSAqICAgICAgICAgaW5pdGlhbGl6ZWQuCi0JICovCi0JZmluYWwgTWFwIGdldEJpbmRpbmdzQnlUcmlnZ2VyKCkgewotCQlyZXR1cm4gYmluZGluZ3NCeVRyaWdnZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFwIG9mIHByZWZpeGVzIHRvIGEgbWFwIG9mIHRyaWdnZXIgc2VxdWVuY2UgdG8gY29tbWFuZAotCSAqIGlkZW50aWZpZXJzLgotCSAqIAotCSAqIEByZXR1cm4gQSBtYXAgb2YgcHJlZml4ZXMgKDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pIHRvIGEgbWFwIG9mCi0JICogICAgICAgICBhdmFpbGFibGUgY29tcGxldGlvbnMgKHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+LCB3aGljaCBtZWFucwotCSAqICAgICAgICAgdGhlcmUgaXMgYW4gZXhhY3QgbWF0Y2gpLiBUaGUgYXZhaWxhYmxlIGNvbXBsZXRpb25zIGlzIGEgbWFwIG9mCi0JICogICAgICAgICB0cmlnZ2VyICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KSB0byBjb21tYW5kIGlkZW50aWZpZXIgKDxjb2RlPlN0cmluZzwvY29kZT4pLgotCSAqICAgICAgICAgVGhpcyB2YWx1ZSBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbgotCSAqICAgICAgICAgaW5pdGlhbGl6ZWQuCi0JICovCi0JZmluYWwgTWFwIGdldFByZWZpeFRhYmxlKCkgewotCQlyZXR1cm4gcHJlZml4VGFibGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFwIG9mIHRyaWdnZXJzIGluZGV4ZWQgYnkgY29tbWFuZCBpZGVudGlmaWVycy4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgbWFwIG9mIGNvbW1hbmQgaWRlbnRpZmllcnMgKDxjb2RlPlN0cmluZzwvY29kZT4pIHRvCi0JICogICAgICAgICB0cmlnZ2VycyAoPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4gb2YKLQkgKiAgICAgICAgIDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pLiBUaGlzIHZhbHVlIG1heSBiZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB3YXMgbm90IHlldCBpbml0aWFsaXplZC4KLQkgKi8KLQlmaW5hbCBNYXAgZ2V0VHJpZ2dlcnNCeUNvbW1hbmRJZCgpIHsKLQkJcmV0dXJuIHRyaWdnZXJzQnlDb21tYW5kSWQ7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBjYWNoZWQgYmluZGluZyBzZXQuIFRoZSBoYXNoIGNvZGUgaXMKLQkgKiBiYXNlZCBvbmx5IG9uIHRoZSBpbW11dGFibGUgdmFsdWVzLiBUaGlzIGFsbG93cyB0aGUgc2V0IHRvIGJlIGNyZWF0ZWQgYW5kCi0JICogY2hlY2tlZCBmb3IgaW4gYSBoYXNoZWQgY29sbGVjdGlvbiA8ZW0+YmVmb3JlPC9lbT4gZG9pbmcgYW55Ci0JICogY29tcHV0YXRpb24uCi0JICogCi0JICogQHJldHVybiBUaGUgaGFzaCBjb2RlIGZvciB0aGlzIGNhY2hlZCBiaW5kaW5nIHNldC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoIWhhc2hDb2RlQ29tcHV0ZWQpIHsKLQkJCWhhc2hDb2RlID0gSEFTSF9JTklUSUFMOwotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIEhBU0hfRkFDVE9SCi0JCQkJCSsgVXRpbC5oYXNoQ29kZShhY3RpdmVDb250ZXh0VHJlZSk7Ci0JCQloYXNoQ29kZSA9IGhhc2hDb2RlICogSEFTSF9GQUNUT1IgKyBVdGlsLmhhc2hDb2RlKGxvY2FsZXMpOwotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIEhBU0hfRkFDVE9SICsgVXRpbC5oYXNoQ29kZShwbGF0Zm9ybXMpOwotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIEhBU0hfRkFDVE9SICsgVXRpbC5oYXNoQ29kZShzY2hlbWVJZHMpOwotCQkJaGFzaENvZGVDb21wdXRlZCA9IHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gaGFzaENvZGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWFwIG9mIGNvbW1hbmQgaWRlbnRpZmllcnMgaW5kZXhlZCBieSB0cmlnZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kSWRzQnlUcmlnZ2VyCi0JICogICAgICAgICAgICBUaGUgbWFwIHRvIHNldDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uIFRoaXMgaXMgYQotCSAqICAgICAgICAgICAgbWFwIG9mIHRyaWdnZXJzICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KSB0byBiaW5kaW5nICg8Y29kZT5CaW5kaW5nPC9jb2RlPikuCi0JICovCi0JZmluYWwgdm9pZCBzZXRCaW5kaW5nc0J5VHJpZ2dlcihmaW5hbCBNYXAgY29tbWFuZElkc0J5VHJpZ2dlcikgewotCQlpZiAoY29tbWFuZElkc0J5VHJpZ2dlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0JCQkJCSJDYW5ub3Qgc2V0IGEgbnVsbCBiaW5kaW5nIHJlc29sdXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdGhpcy5iaW5kaW5nc0J5VHJpZ2dlciA9IGNvbW1hbmRJZHNCeVRyaWdnZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWFwIG9mIHByZWZpeGVzIHRvIGEgbWFwIG9mIHRyaWdnZXIgc2VxdWVuY2UgdG8gY29tbWFuZAotCSAqIGlkZW50aWZpZXJzLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmaXhUYWJsZQotCSAqICAgICAgICAgICAgQSBtYXAgb2YgcHJlZml4ZXMgKDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4pIHRvIGEgbWFwCi0JICogICAgICAgICAgICBvZiBhdmFpbGFibGUgY29tcGxldGlvbnMgKHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+LCB3aGljaAotCSAqICAgICAgICAgICAgbWVhbnMgdGhlcmUgaXMgYW4gZXhhY3QgbWF0Y2gpLiBUaGUgYXZhaWxhYmxlIGNvbXBsZXRpb25zIGlzIGEKLQkgKiAgICAgICAgICAgIG1hcCBvZiB0cmlnZ2VyICg8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KSB0byBjb21tYW5kCi0JICogICAgICAgICAgICBpZGVudGlmaWVyICg8Y29kZT5TdHJpbmc8L2NvZGU+KS4gTXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCWZpbmFsIHZvaWQgc2V0UHJlZml4VGFibGUoZmluYWwgTWFwIHByZWZpeFRhYmxlKSB7Ci0JCWlmIChwcmVmaXhUYWJsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNhbm5vdCBzZXQgYSBudWxsIHByZWZpeCB0YWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0aGlzLnByZWZpeFRhYmxlID0gcHJlZml4VGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWFwIG9mIHRyaWdnZXJzIGluZGV4ZWQgYnkgY29tbWFuZCBpZGVudGlmaWVycy4KLQkgKiAKLQkgKiBAcGFyYW0gdHJpZ2dlcnNCeUNvbW1hbmRJZAotCSAqICAgICAgICAgICAgVGhlIG1hcCB0byBzZXQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGlzIGEKLQkgKiAgICAgICAgICAgIG1hcCBvZiBjb21tYW5kIGlkZW50aWZpZXJzICg8Y29kZT5TdHJpbmc8L2NvZGU+KSB0bwotCSAqICAgICAgICAgICAgdHJpZ2dlcnMgKDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+IG9mCi0JICogICAgICAgICAgICA8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+KS4KLQkgKi8KLQlmaW5hbCB2b2lkIHNldFRyaWdnZXJzQnlDb21tYW5kSWQoZmluYWwgTWFwIHRyaWdnZXJzQnlDb21tYW5kSWQpIHsKLQkJaWYgKHRyaWdnZXJzQnlDb21tYW5kSWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotCQkJCQkiQ2Fubm90IHNldCBhIG51bGwgYmluZGluZyByZXNvbHV0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRoaXMudHJpZ2dlcnNCeUNvbW1hbmRJZCA9IHRyaWdnZXJzQnlDb21tYW5kSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3MvSUJpbmRpbmdNYW5hZ2VyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL0lCaW5kaW5nTWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNjNmYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3MvSUJpbmRpbmdNYW5hZ2VyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzOwotCi0vKioKLSAqIDxwPgotICogQW4gaW5zdGFuY2Ugb2YgPGNvZGU+QmluZGluZ01hbmFnZXJMaXN0ZW5lcjwvY29kZT4gY2FuIGJlIHVzZWQgYnkgY2xpZW50cyB0bwotICogcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgY2hhbmdlcyB0byBhbiBpbnN0YW5jZSBvZgotICogPGNvZGU+QmluZGluZ01hbmFnZXI8L2NvZGU+LiAKLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIEBzZWUgQmluZGluZ01hbmFnZXIjYWRkQmluZGluZ01hbmFnZXJMaXN0ZW5lcihJQmluZGluZ01hbmFnZXJMaXN0ZW5lcikKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZ01hbmFnZXIjYWRkQmluZGluZ01hbmFnZXJMaXN0ZW5lcihJQmluZGluZ01hbmFnZXJMaXN0ZW5lcikKLSAqIEBzZWUgQmluZGluZ01hbmFnZXJFdmVudAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCaW5kaW5nTWFuYWdlckxpc3RlbmVyIHsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgYXR0cmlidXRlcyBpbnNpZGUgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+QmluZGluZ01hbmFnZXI8L2NvZGU+IGhhdmUgY2hhbmdlZC4gCi0JICogU3BlY2lmaWMgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGluIHRoZSA8Y29kZT5CaW5kaW5nTWFuYWdlckV2ZW50PC9jb2RlPi4gIENoYW5nZXMgaW4gdGhlCi0JICogYmluZGluZyBtYW5hZ2VyIGNhbiBjYXVzZSB0aGUgc2V0IG9mIGRlZmluZWQgb3IgYWN0aXZlIHNjaGVtZXMgb3IgYmluZGluZ3MgdG8gY2hhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIGJpbmRpbmcgbWFuYWdlciBldmVudC4gR3VhcmFudGVlZCBub3QgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0Jdm9pZCBiaW5kaW5nTWFuYWdlckNoYW5nZWQoQmluZGluZ01hbmFnZXJFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9JU2NoZW1lTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL0lTY2hlbWVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjg4OWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL0lTY2hlbWVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3M7Ci0KLS8qKgotICogPHA+Ci0gKiBBbiBpbnN0YW5jZSBvZiA8Y29kZT5JU2NoZW1lTGlzdGVuZXI8L2NvZGU+IGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgdG8KLSAqIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgdG8gb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mCi0gKiA8Y29kZT5JU2NoZW1lPC9jb2RlPi4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIEBzZWUgU2NoZW1lI2FkZFNjaGVtZUxpc3RlbmVyKElTY2hlbWVMaXN0ZW5lcikKLSAqIEBzZWUgU2NoZW1lI3JlbW92ZVNjaGVtZUxpc3RlbmVyKElTY2hlbWVMaXN0ZW5lcikKLSAqIEBzZWUgU2NoZW1lRXZlbnQKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2NoZW1lTGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBhdHRyaWJ1dGVzIG9mIGFuIGluc3RhbmNlIG9mCi0gICAgICogPGNvZGU+SVNjaGVtZTwvY29kZT4gaGF2ZSBjaGFuZ2VkLiBTcGVjaWZpYyBkZXRhaWxzIGFyZSBkZXNjcmliZWQgaW4KLSAgICAgKiB0aGUgPGNvZGU+U2NoZW1lRXZlbnQ8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzY2hlbWVFdmVudAotICAgICAqICAgICAgICAgICAgdGhlIHNjaGVtZSBldmVudC4gR3VhcmFudGVlZCBub3QgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgdm9pZCBzY2hlbWVDaGFuZ2VkKFNjaGVtZUV2ZW50IHNjaGVtZUV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL1NjaGVtZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3MvU2NoZW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZmE0OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3MvU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5hbWVkSGFuZGxlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5VdGlsOwotCi0vKioKLSAqIDxwPgotICogQW4gaW5zdGFuY2Ugb2YgPGNvZGU+SVNjaGVtZTwvY29kZT4gaXMgYSBoYW5kbGUgcmVwcmVzZW50aW5nIGEgYmluZGluZwotICogc2NoZW1lIGFzIGRlZmluZWQgYnkgdGhlIGV4dGVuc2lvbiBwb2ludCA8Y29kZT5vcmcuZWNsaXBzZS51aS5iaW5kaW5nczwvY29kZT4uCi0gKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgaGFuZGxlIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBzY2hlbWUgYmVpbmcgcmVwcmVzZW50ZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEFuIGluc3RhbmNlIG9mIDxjb2RlPklTY2hlbWU8L2NvZGU+IGNhbiBiZSBvYnRhaW5lZCBmcm9tIGFuIGluc3RhbmNlIG9mCi0gKiA8Y29kZT5JQ29tbWFuZE1hbmFnZXI8L2NvZGU+IGZvciBhbnkgaWRlbnRpZmllciwgd2hldGhlciBvciBub3QgYSBzY2hlbWUKLSAqIHdpdGggdGhhdCBpZGVudGlmaWVyIGlzIGRlZmluZWQgaW4gdGhlIHBsdWdpbiByZWdpc3RyeS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGhhbmRsZS1iYXNlZCBuYXR1cmUgb2YgdGhpcyBBUEkgYWxsb3dzIGl0IHRvIHdvcmsgd2VsbCB3aXRoIHJ1bnRpbWUKLSAqIHBsdWdpbiBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24uIElmIGEgc2NoZW1lIGlzIGRlZmluZWQsIHRoYXQgbWVhbnMgdGhhdAotICogaXRzIGNvcnJlc3BvbmRpbmcgcGx1Zy1pbiBpcyBhY3RpdmUuIElmIHRoZSBwbHVnLWluIGlzIHRoZW4gZGVhY3RpdmF0ZWQsIHRoZQotICogc2NoZW1lIHdpbGwgc3RpbGwgZXhpc3QgYnV0IGl0IHdpbGwgYmUgdW5kZWZpbmVkLiBBbiBhdHRlbXB0IHRvIHVzZSBhbgotICogdW5kZWZpbmVkIHNjaGVtZSB3aWxsIHJlc3VsdCBpbiBhIDxjb2RlPk5vdERlZmluZWRFeGNlcHRpb248L2NvZGU+Ci0gKiBiZWluZyB0aHJvd24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIEBzZWUgSVNjaGVtZUxpc3RlbmVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQ29tbWFuZE1hbmFnZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNjaGVtZSBleHRlbmRzIE5hbWVkSGFuZGxlT2JqZWN0IGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29sbGVjdGlvbiBvZiBhbGwgb2JqZWN0cyBsaXN0ZW5pbmcgdG8gY2hhbmdlcyBvbiB0aGlzIHNjaGVtZS4gVGhpcwotICAgICAqIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZXQgbGlzdGVuZXJzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYXJlbnQgaWRlbnRpZmllciBmb3IgdGhpcyBzY2hlbWUuIFRoaXMgaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlCi0gICAgICogc2NoZW1lIGZyb20gd2hpY2ggdGhpcyBzY2hlbWUgaW5oZXJpdHMgc29tZSBvZiBpdHMgYmluZGluZ3MuIFRoaXMgdmFsdWUKLSAgICAgKiBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNjaGVtZSBoYXMgbm8gcGFyZW50LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHBhcmVudElkID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+U2NoZW1lPC9jb2RlPiB3aXRoIGFuIGlkZW50aWZpZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciB0byBjcmVhdGU7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIFNjaGVtZShmaW5hbCBTdHJpbmcgaWQpIHsKLSAgICAgICAgc3VwZXIoaWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JU2NoZW1lTGlzdGVuZXI8L2NvZGU+IHRvIGxpc3RlbiBmb3IKLSAgICAgKiBjaGFuZ2VzIHRvIGF0dHJpYnV0ZXMgb2YgdGhpcyBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2NoZW1lTGlzdGVuZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnN0YW5jZSBvZiA8Y29kZT5JU2NoZW1lTGlzdGVuZXI8L2NvZGU+IHRvIHJlZ2lzdGVyLgotICAgICAqICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uIElmIGFuIGF0dGVtcHQgaXMgbWFkZSB0bwotICAgICAqICAgICAgICAgICAgcmVnaXN0ZXIgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+SVNjaGVtZUxpc3RlbmVyPC9jb2RlPiB3aGljaAotICAgICAqICAgICAgICAgICAgaXMgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggdGhpcyBpbnN0YW5jZSwgbm8gb3BlcmF0aW9uIGlzCi0gICAgICogICAgICAgICAgICBwZXJmb3JtZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgYWRkU2NoZW1lTGlzdGVuZXIoZmluYWwgSVNjaGVtZUxpc3RlbmVyIHNjaGVtZUxpc3RlbmVyKSB7Ci0gICAgICAgIGlmIChzY2hlbWVMaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNhbid0IGFkZCBhIG51bGwgc2NoZW1lIGxpc3RlbmVyLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVycyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsaXN0ZW5lcnMuYWRkKHNjaGVtZUxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgZmluYWwgU2NoZW1lIHNjaGVtZSA9IChTY2hlbWUpIG9iamVjdDsKLSAgICAgICAgaW50IGNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZSh0aGlzLmlkLCBzY2hlbWUuaWQpOwotICAgICAgICBpZiAoY29tcGFyZVRvID09IDApIHsKLSAgICAgICAgICAgIGNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZSh0aGlzLm5hbWUsIHNjaGVtZS5uYW1lKTsKLSAgICAgICAgICAgIGlmIChjb21wYXJlVG8gPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZSh0aGlzLnBhcmVudElkLCBzY2hlbWUucGFyZW50SWQpOwotICAgICAgICAgICAgICAgIGlmIChjb21wYXJlVG8gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb21wYXJlVG8gPSBVdGlsLmNvbXBhcmUodGhpcy5kZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWUuZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZVRvID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZSh0aGlzLmRlZmluZWQsIHNjaGVtZS5kZWZpbmVkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb21wYXJlVG87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRGVmaW5lcyB0aGlzIHNjaGVtZSBieSBnaXZpbmcgaXQgYSBuYW1lLCBhbmQgcG9zc2libHkgYSBkZXNjcmlwdGlvbiBhbmQgYQotICAgICAqIHBhcmVudCBpZGVudGlmaWVyIGFzIHdlbGwuIFRoZSBkZWZpbmVkIHByb3BlcnR5IGZvciB0aGUgc2NoZW1lIGF1dG9tYXRpY2FsbHkgCi0gICAgICogYmVjb21lcyA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90aWZpY2F0aW9uIGlzIHNlbnQgdG8gYWxsIGxpc3RlbmVycyB0aGF0IHNvbWV0aGluZyBoYXMgY2hhbmdlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoaXMgc2NoZW1lOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24KLSAgICAgKiAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBzY2hlbWU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gcGFyZW50SWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgaWRlbnRpZmllciBmb3IgdGhpcyBzY2hlbWU7IG1heSBiZQotICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVmaW5lKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlIG5hbWUgb2YgYSBzY2hlbWUgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBkZWZpbmVkQ2hhbmdlZCA9ICF0aGlzLmRlZmluZWQ7Ci0gICAgICAgIHRoaXMuZGVmaW5lZCA9IHRydWU7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBuYW1lQ2hhbmdlZCA9ICFVdGlsLmVxdWFscyh0aGlzLm5hbWUsIG5hbWUpOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gZGVzY3JpcHRpb25DaGFuZ2VkID0gIVV0aWwuZXF1YWxzKHRoaXMuZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24pOwotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBwYXJlbnRJZENoYW5nZWQgPSAhVXRpbC5lcXVhbHModGhpcy5wYXJlbnRJZCwgcGFyZW50SWQpOwotICAgICAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7Ci0KLSAgICAgICAgZmlyZVNjaGVtZUNoYW5nZWQobmV3IFNjaGVtZUV2ZW50KHRoaXMsIGRlZmluZWRDaGFuZ2VkLCBuYW1lQ2hhbmdlZCwKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkNoYW5nZWQsIHBhcmVudElkQ2hhbmdlZCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIGFsbCBsaXN0ZW5lcnMgdGhhdCB0aGlzIHNjaGVtZSBoYXMgY2hhbmdlZC4gVGhpcyBzZW5kcyB0aGUgZ2l2ZW4KLSAgICAgKiBldmVudCB0byBhbGwgb2YgdGhlIGxpc3RlbmVycywgaWYgYW55LgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudAotICAgICAqICAgICAgICAgICAgVGhlIGV2ZW50IHRvIHNlbmQgdG8gdGhlIGxpc3RlbmVyczsgbXVzdCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBmaXJlU2NoZW1lQ2hhbmdlZChmaW5hbCBTY2hlbWVFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHNlbmQgYSBudWxsIGV2ZW50IHRvIGxpc3RlbmVycy4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJdGVyYXRvciBsaXN0ZW5lckl0ciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAobGlzdGVuZXJJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBJU2NoZW1lTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNjaGVtZUxpc3RlbmVyKSBsaXN0ZW5lckl0cgotICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwotICAgICAgICAgICAgbGlzdGVuZXIuc2NoZW1lQ2hhbmdlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgb2YgdGhlIHNjaGVtZSByZXByZXNlbnRlZCBieSB0aGlzCi0gICAgICogaGFuZGxlLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RpZmljYXRpb24gaXMgc2VudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgaWYgdGhpcyBhdHRyaWJ1dGUKLSAgICAgKiBjaGFuZ2VzLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgb2YgdGhlIHNjaGVtZSByZXByZXNlbnRlZCBieSB0aGlzCi0gICAgICogICAgICAgICBoYW5kbGUuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2NoZW1lIHJlcHJlc2VudGVkIGJ5IHRoaXMgaGFuZGxlIGlzIG5vdCBkZWZpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGFyZW50SWQoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZGVmaW5lZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vdERlZmluZWRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZ2V0IHRoZSBwYXJlbnQgaWRlbnRpZmllciBmcm9tIGFuIHVuZGVmaW5lZCBzY2hlbWUuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXJlbnRJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnJlZ2lzdGVycyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JU2NoZW1lTGlzdGVuZXI8L2NvZGU+IGxpc3RlbmluZyBmb3IKLSAgICAgKiBjaGFuZ2VzIHRvIGF0dHJpYnV0ZXMgb2YgdGhpcyBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2NoZW1lTGlzdGVuZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnN0YW5jZSBvZiA8Y29kZT5JU2NoZW1lTGlzdGVuZXI8L2NvZGU+IHRvIHVucmVnaXN0ZXIuCi0gICAgICogICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvCi0gICAgICogICAgICAgICAgICB1bnJlZ2lzdGVyIGFuIGluc3RhbmNlIG9mIDxjb2RlPklTY2hlbWVMaXN0ZW5lcjwvY29kZT4gd2hpY2gKLSAgICAgKiAgICAgICAgICAgIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGluc3RhbmNlLCBubyBvcGVyYXRpb24gaXMKLSAgICAgKiAgICAgICAgICAgIHBlcmZvcm1lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVTY2hlbWVMaXN0ZW5lcihmaW5hbCBJU2NoZW1lTGlzdGVuZXIgc2NoZW1lTGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKHNjaGVtZUxpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ2Fubm90IHJlbW92ZSBhIG51bGwgbGlzdGVuZXIuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShzY2hlbWVMaXN0ZW5lcik7Ci0KLSAgICAgICAgaWYgKGxpc3RlbmVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGxpc3RlbmVycyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29tbWFuZCAtLSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCi0gICAgICogVGhpcyBzdHJpbmcgc2hvdWxkIG5vdCBiZSBzaG93biB0byBhbiBlbmQgdXNlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb247IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIlNjaGVtZSgiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChpZCk7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKHBhcmVudElkKTsKLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoZGVmaW5lZCk7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCcpJyk7Ci0gICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2VzIHRoaXMgc2NoZW1lIGJlY29tZSB1bmRlZmluZWQuIFRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjaGFuZ2luZwotICAgICAqIHRoZSBuYW1lLCBkZXNjcmlwdGlvbiBhbmQgcGFyZW50IGlkZW50aWZpZXIgdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogTm90aWZpY2F0aW9uIGlzIHNlbnQgdG8gYWxsIGxpc3RlbmVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB1bmRlZmluZSgpIHsKLSAgICAgICAgc3RyaW5nID0gbnVsbDsKLQotICAgICAgICBmaW5hbCBib29sZWFuIGRlZmluZWRDaGFuZ2VkID0gZGVmaW5lZDsKLSAgICAgICAgZGVmaW5lZCA9IGZhbHNlOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gbmFtZUNoYW5nZWQgPSBuYW1lICE9IG51bGw7Ci0gICAgICAgIG5hbWUgPSBudWxsOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gZGVzY3JpcHRpb25DaGFuZ2VkID0gZGVzY3JpcHRpb24gIT0gbnVsbDsKLSAgICAgICAgZGVzY3JpcHRpb24gPSBudWxsOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gcGFyZW50SWRDaGFuZ2VkID0gcGFyZW50SWQgIT0gbnVsbDsKLSAgICAgICAgcGFyZW50SWQgPSBudWxsOwotCi0gICAgICAgIGZpcmVTY2hlbWVDaGFuZ2VkKG5ldyBTY2hlbWVFdmVudCh0aGlzLCBkZWZpbmVkQ2hhbmdlZCwgbmFtZUNoYW5nZWQsCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25DaGFuZ2VkLCBwYXJlbnRJZENoYW5nZWQpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9TY2hlbWVFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3MvU2NoZW1lRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5MjQ0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9TY2hlbWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5BYnN0cmFjdE5hbWVkSGFuZGxlRXZlbnQ7Ci0KLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBkZXNjcmliZXMgY2hhbmdlcyB0byBhbiBpbnN0YW5jZSBvZgotICogPGNvZGU+SVNjaGVtZTwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIEBzZWUgSVNjaGVtZUxpc3RlbmVyI3NjaGVtZUNoYW5nZWQoU2NoZW1lRXZlbnQpCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTY2hlbWVFdmVudCBleHRlbmRzIEFic3RyYWN0TmFtZWRIYW5kbGVFdmVudCB7Ci0KLQkvKioKLQkgKiBUaGUgYml0IHVzZWQgdG8gcmVwcmVzZW50IHdoZXRoZXIgdGhlIHNjaGVtZSBoYXMgY2hhbmdlZCBpdHMgcGFyZW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEX1BBUkVOVF9JRCA9IExBU1RfVVNFRF9CSVQgPDwgMTsKLQotCS8qKgotCSAqIFRoZSBzY2hlbWUgdGhhdCBoYXMgY2hhbmdlZDsgdGhpcyB2YWx1ZSBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNjaGVtZSBzY2hlbWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIHNjaGVtZQotCSAqICAgICAgICAgICAgdGhlIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBjaGFuZ2VkOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGRlZmluZWRDaGFuZ2VkCi0JICogICAgICAgICAgICB0cnVlLCBpZmYgdGhlIGRlZmluZWQgcHJvcGVydHkgY2hhbmdlZC4KLQkgKiBAcGFyYW0gbmFtZUNoYW5nZWQKLQkgKiAgICAgICAgICAgIHRydWUsIGlmZiB0aGUgbmFtZSBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbkNoYW5nZWQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSBjaGFuZ2VkOwotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiBAcGFyYW0gcGFyZW50SWRDaGFuZ2VkCi0JICogICAgICAgICAgICB0cnVlLCBpZmYgdGhlIHBhcmVudElkIHByb3BlcnR5IGNoYW5nZWQuCi0JICovCi0JcHVibGljIFNjaGVtZUV2ZW50KFNjaGVtZSBzY2hlbWUsIGJvb2xlYW4gZGVmaW5lZENoYW5nZWQsCi0JCQlib29sZWFuIG5hbWVDaGFuZ2VkLCBib29sZWFuIGRlc2NyaXB0aW9uQ2hhbmdlZCwKLQkJCWJvb2xlYW4gcGFyZW50SWRDaGFuZ2VkKSB7Ci0JCXN1cGVyKGRlZmluZWRDaGFuZ2VkLCBkZXNjcmlwdGlvbkNoYW5nZWQsIG5hbWVDaGFuZ2VkKTsKLQotCQlpZiAoc2NoZW1lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJdGhpcy5zY2hlbWUgPSBzY2hlbWU7Ci0KLQkJaWYgKHBhcmVudElkQ2hhbmdlZCkgewotCQkJY2hhbmdlZFZhbHVlcyB8PSBDSEFOR0VEX1BBUkVOVF9JRDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoZSBzY2hlbWUgdGhhdCBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBzY2hlbWUgdGhhdCBjaGFuZ2VkLiBHdWFyYW50ZWVkIG5vdCB0byBiZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIFNjaGVtZSBnZXRTY2hlbWUoKSB7Ci0JCXJldHVybiBzY2hlbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcGFyZW50SWQgcHJvcGVydHkgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUsIGlmZiB0aGUgcGFyZW50SWQgcHJvcGVydHkgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1BhcmVudElkQ2hhbmdlZCgpIHsKLQkJcmV0dXJuICgoY2hhbmdlZFZhbHVlcyAmIENIQU5HRURfUEFSRU5UX0lEKSAhPSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9UcmlnZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9UcmlnZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZGNlM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3MvVHJpZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzOwotCi0vKioKLSAqIDxwPgotICogVGhlIGFic3RyYWN0IGNsYXNzIGZvciBhbnkgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYXMgYSB0cmlnZ2VyIGZvciBhIGJpbmRpbmcuIAotICogVGhpcyBlbnN1cmVzIHRoYXQgdHJpZ2dlciBjb25mb3JtIHRvIGNlcnRhaW4gbWluaW11bSByZXF1aXJlbWVudHMuIE5hbWVseSwgdHJpZ2dlcnMgCi0gKiBuZWVkIHRvIGJlIGhhc2hhYmxlLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmlnZ2VyIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMgb2JqZWN0IGlzIGVxdWFsIHRvIGFub3RoZXIgb2JqZWN0LiBBIGhhbmRsZSBvYmplY3QgaXMKLSAgICAgKiBvbmx5IGVxdWFsIHRvIGFub3RoZXIgdHJpZ2dlciB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgVGhlIG9iamVjdCB3aXRoIHdoaWNoIHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3RzIGFyZSBlcXVhbDsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmplY3QpOwotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgaGFzaCBjb2RlIGZvciB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGhhc2hDb2RlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9UcmlnZ2VyU2VxdWVuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL1RyaWdnZXJTZXF1ZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzY4ZDk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL1RyaWdnZXJTZXF1ZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVXRpbDsKLQotLyoqCi0gKiA8cD4KLSAqIEEgc2VxdWVuY2Ugb2Ygb25lIG9yIG1vcmUgdHJpZ2dlcnMuIE5vbmUgb2YgdGhlc2UgdHJpZ2dlcnMgbWF5IGJlCi0gKiA8Y29kZT5udWxsPC9jb2RlPi4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJpZ2dlclNlcXVlbmNlIHsKLQkKLQkvKioKLQkgKiBUaGUgdmFsdWUgdG8gc2VlIHRoYXQgaGFzaCBjb2RlIHRvIGlmIHRoZSBoYXNoIGNvZGUgaXMgbm90IHlldCBjb21wdXRlZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9DT0RFX05PVF9DT01QVVRFRCA9IC0xOwotCi0JLyoqCi0JICogQSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgaGFzaCBjb2RlIGZvciBhbGwgdHJpZ2dlciBzZXF1ZW5jZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU0hfRkFDVE9SID0gODk7Ci0KLQkvKioKLQkgKiBBbiBpbnRlcm5hbCBjb25zdGFudCB1c2VkIG9ubHkgaW4gdGhpcyBvYmplY3QncyBoYXNoIGNvZGUgYWxnb3JpdGhtLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0lOSVRJQUwgPSBUcmlnZ2VyU2VxdWVuY2UuY2xhc3MuZ2V0TmFtZSgpCi0JCQkuaGFzaENvZGUoKTsKLQotCS8qKgotCSAqIFRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgb2JqZWN0LiBUaGlzIHZhbHVlIGlzIGNvbXB1dGVkIGxhemlseSwgYW5kIG1hcmtlZAotCSAqIGFzIGludmFsaWQgd2hlbiBvbmUgb2YgdGhlIHZhbHVlcyBvbiB3aGljaCBpdCBpcyBiYXNlZCBjaGFuZ2VzLiAgVGhpcwotCSAqIHZhbHVlcyBpcyA8Y29kZT5IQVNIX0NPREVfTk9UX0NPTVBVVEVEPC9jb2RlPiBpZmYgdGhlIGhhc2ggY29kZSBoYXMgbm90Ci0JICogeWV0IGJlZW4gY29tcHV0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBpbnQgaGFzaENvZGUgPSBIQVNIX0NPREVfTk9UX0NPTVBVVEVEOwotCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgdHJpZ2dlciBpbiB0aGlzIHNlcXVlbmNlLiBUaGlzIHZhbHVlIGlzIG5ldmVyCi0JICogPGNvZGU+bnVsbDwvY29kZT4sIGFuZCBuZXZlciBjb250YWlucyA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVHJpZ2dlcltdIHRyaWdnZXJzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB0cmlnZ2VycwotCSAqICAgICAgICAgICAgVGhlIHRyaWdnZXJzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzZXF1ZW5jZTsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW4gPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMuCi0JICogICAgICAgICAgICBNYXkgYmUgZW1wdHkuCi0JICovCi0JcHVibGljIFRyaWdnZXJTZXF1ZW5jZShmaW5hbCBUcmlnZ2VyW10gdHJpZ2dlcnMpIHsKLQkJaWYgKHRyaWdnZXJzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVGhlIHRyaWdnZXJzIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJpZ2dlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0cmlnZ2Vyc1tpXSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJBbGwgdHJpZ2dlcnMgaW4gYSB0cmlnZ2VyIHNlcXVlbmNlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVHJpZ2dlciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlmaW5hbCBpbnQgdHJpZ2dlckxlbmd0aCA9IHRyaWdnZXJzLmxlbmd0aDsKLQkJdGhpcy50cmlnZ2VycyA9IG5ldyBUcmlnZ2VyW3RyaWdnZXJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRyaWdnZXJzLCAwLCB0aGlzLnRyaWdnZXJzLCAwLCB0cmlnZ2VyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMga2V5IHNlcXVlbmNlIGVuZHMgd2l0aCB0aGUgZ2l2ZW4ga2V5Ci0JICogc2VxdWVuY2UuCi0JICogCi0JICogQHBhcmFtIHRyaWdnZXJTZXF1ZW5jZQotCSAqICAgICAgICAgICAgYSB0cmlnZ2VyIHNlcXVlbmNlLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gZXF1YWxzCi0JICogICAgICAgICAgICB3aGV0aGVyIG9yIG5vdCBhbiBpZGVudGljYWwgdHJpZ2dlciBzZXF1ZW5jZSBzaG91bGQgYmUKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyZWQgYXMgYSBwb3NzaWJsZSBtYXRjaC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LCBpZmYgdGhlIGdpdmVuIHRyaWdnZXIgc2VxdWVuY2UgZW5kcyB3aXRoCi0JICogICAgICAgICB0aGlzIHRyaWdnZXIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZW5kc1dpdGgoZmluYWwgVHJpZ2dlclNlcXVlbmNlIHRyaWdnZXJTZXF1ZW5jZSwKLQkJCWZpbmFsIGJvb2xlYW4gZXF1YWxzKSB7Ci0JCWlmICh0cmlnZ2VyU2VxdWVuY2UgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotCQkJCQkiQ2Fubm90IGVuZCB3aXRoIGEgbnVsbCB0cmlnZ2VyIHNlcXVlbmNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBVdGlsLmVuZHNXaXRoKHRyaWdnZXJzLCB0cmlnZ2VyU2VxdWVuY2UudHJpZ2dlcnMsIGVxdWFscyk7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKLQkJLy8gQ2hlY2sgaWYgdGhleSdyZSB0aGUgc2FtZS4KLQkJaWYgKG9iamVjdCA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIENoZWNrIGlmIHRoZXkncmUgdGhlIHNhbWUgdHlwZS4KLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVHJpZ2dlclNlcXVlbmNlKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmaW5hbCBUcmlnZ2VyU2VxdWVuY2UgdHJpZ2dlclNlcXVlbmNlID0gKFRyaWdnZXJTZXF1ZW5jZSkgb2JqZWN0OwotCQlyZXR1cm4gVXRpbC5lcXVhbHModHJpZ2dlcnMsIHRyaWdnZXJTZXF1ZW5jZS50cmlnZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyB0aGlzIHRyaWdnZXIgc2VxdWVuY2UgaW50byB0aGUgY3VycmVudCBkZWZhdWx0IGxvb2suCi0JICogCi0JICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyB0cmlnZ2VyIHNlcXVlbmNlIHVzaW5nIHRoZQotCSAqICAgICAgICAgZGVmYXVsdCBsb29rOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGZvcm1hdCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIGxpc3Qgb2YgcHJlZml4ZXMgZm9yIHRoZSBjdXJyZW50IHNlcXVlbmNlLiBBIHByZWZpeCBpcyBhbnkKLQkgKiBsZWFkaW5nIHN1YnNlcXVlbmNlIGluIGEgPGNvZGU+VHJpZ2dlclNlcXVlbmNlPC9jb2RlPi4gQSBwcmVmaXggaXMKLQkgKiBhbHNvIGFuIGluc3RhbmNlIG9mIDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBjb25zaWRlciBhIHRyaWdnZXIgc2VxdWVuY2UgdGhhdCBjb25zaXN0cyBvZiBmb3VyIHRyaWdnZXJzOgotCSAqIEEsIEIsIEMgYW5kIEQuIFRoZSBwcmVmaXhlcyB3b3VsZCBiZSAiIiwgIkEiLCAiQSBCIiwgYW5kICJBIEIgQyIuIFRoZQotCSAqIGxpc3Qgb2YgcHJlZml4ZXMgbXVzdCBhbHdheXMgYmUgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgdGhlIHRyaWdnZXIgbGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBUaGUgYXJyYXkgb2YgcG9zc2libGUgcHJlZml4ZXMgZm9yIHRoaXMgc2VxdWVuY2UuIFRoaXMgYXJyYXkgbXVzdAotCSAqICAgICAgICAgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBidXQgbWF5IGJlIGVtcHR5LiBJdCBtdXN0IG9ubHkKLQkgKiAgICAgICAgIGNvbnRhaW5zIGluc3RhbmNlcyBvZiA8Y29kZT5UcmlnZ2VyU2VxdWVuY2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBUcmlnZ2VyU2VxdWVuY2VbXSBnZXRQcmVmaXhlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiB0cmlnZ2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSB0cmlnZ2VyczsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4gYW5kIGd1YXJhbnRlZWQgdG8gb25seQotCSAqICAgICAgICAgY29udGFpbiBpbnN0YW5jZXMgb2YgPGNvZGU+VHJpZ2dlcjwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIFRyaWdnZXJbXSBnZXRUcmlnZ2VycygpIHsKLQkJZmluYWwgaW50IHRyaWdnZXJMZW5ndGggPSB0cmlnZ2Vycy5sZW5ndGg7Ci0JCWZpbmFsIFRyaWdnZXJbXSB0cmlnZ2VyQ29weSA9IG5ldyBUcmlnZ2VyW3RyaWdnZXJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRyaWdnZXJzLCAwLCB0cmlnZ2VyQ29weSwgMCwgdHJpZ2dlckxlbmd0aCk7Ci0JCXJldHVybiB0cmlnZ2VyQ29weTsKLQl9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7Ci0JCWlmIChoYXNoQ29kZSA9PSBIQVNIX0NPREVfTk9UX0NPTVBVVEVEKSB7Ci0JCQloYXNoQ29kZSA9IEhBU0hfSU5JVElBTDsKLQkJCWhhc2hDb2RlID0gaGFzaENvZGUgKiBIQVNIX0ZBQ1RPUiArIFV0aWwuaGFzaENvZGUodHJpZ2dlcnMpOwotCQkJaWYgKGhhc2hDb2RlID09IEhBU0hfQ09ERV9OT1RfQ09NUFVURUQpIHsKLQkJCQloYXNoQ29kZSsrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGhhc2hDb2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhpcyB0cmlnZ2VyIHNlcXVlbmNlIGlzIGVtcHR5LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4sIGlmZiB0aGUgdHJpZ2dlciBzZXF1ZW5jZSBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gKHRyaWdnZXJzLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgdHJpZ2dlciBzZXF1ZW5jZSBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4KLQkgKiB0cmlnZ2VyIHNlcXVlbmNlLgotCSAqIAotCSAqIEBwYXJhbSB0cmlnZ2VyU2VxdWVuY2UKLQkgKiAgICAgICAgICAgIGEgdHJpZ2dlciBzZXF1ZW5jZS4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGVxdWFscwotCSAqICAgICAgICAgICAgd2hldGhlciBvciBub3QgYW4gaWRlbnRpY2FsIHRyaWdnZXIgc2VxdWVuY2Ugc2hvdWxkIGJlCi0JICogICAgICAgICAgICBjb25zaWRlcmVkIGFzIGEgcG9zc2libGUgbWF0Y2guCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiwgaWZmIHRoZSBnaXZlbiB0cmlnZ2VyIHNlcXVlbmNlIHN0YXJ0cyB3aXRoCi0JICogICAgICAgICB0aGlzIGtleSBzZXF1ZW5jZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzdGFydHNXaXRoKGZpbmFsIFRyaWdnZXJTZXF1ZW5jZSB0cmlnZ2VyU2VxdWVuY2UsCi0JCQlmaW5hbCBib29sZWFuIGVxdWFscykgewotCQlpZiAodHJpZ2dlclNlcXVlbmNlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0JCQkJCSJBIHRyaWdnZXIgc2VxdWVuY2UgY2Fubm90IHN0YXJ0IHdpdGggbnVsbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIFV0aWwuc3RhcnRzV2l0aCh0cmlnZ2VycywgdHJpZ2dlclNlcXVlbmNlLnRyaWdnZXJzLCBlcXVhbHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvSUtleUxvb2t1cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9JS2V5TG9va3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDU3YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9JS2V5TG9va3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXM7Ci0KLS8qKgotICogPHA+Ci0gKiBBIGZhY2lsaXRpeSBmb3IgY29udmVydGluZyB0aGUgZm9ybWFsIHJlcHJlc2VudGF0aW9uIGZvciBrZXkgc3Ryb2tlcwotICogKGkuZS4sIHVzZWQgaW4gcGVyc2lzdGVuY2UpIGludG8gcmVhbCBrZXkgc3Ryb2tlIGluc3RhbmNlcy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElLZXlMb29rdXAgewotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ0FsdCcga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVF9OQU1FID0gIkFMVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ0Fycm93IERvd24nIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlJPV19ET1dOX05BTUUgPSAiQVJST1dfRE9XTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ0Fycm93IExlZnQnIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlJPV19MRUZUX05BTUUgPSAiQVJST1dfTEVGVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ0Fycm93IFJpZ2h0JyBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJST1dfUklHSFRfTkFNRSA9ICJBUlJPV19SSUdIVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ0Fycm93IFVwJyBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJST1dfVVBfTkFNRSA9ICJBUlJPV19VUCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBbiBhbHRlcm5hdGUgbmFtZSBmb3IgdGhlIGJhY2tzcGFjZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS1NQQUNFX05BTUUgPSAiQkFDS1NQQUNFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIGZvciB0aGUgJ0JyZWFrJyBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJFQUtfTkFNRSA9ICJCUkVBSyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgYmFja3NwYWNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCU19OQU1FID0gIkJTIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIGZvciB0aGUgJ0NhcHMgTG9jaycga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUFNfTE9DS19OQU1FID0gIkNBUFNfTE9DSyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ0NvbW1hbmQnIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX05BTUUgPSAiQ09NTUFORCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgY2FycmlhZ2UgcmV0dXJuIChVKzAwMEQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JfTkFNRSA9ICJDUiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ0N0cmwnIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVFJMX05BTUUgPSAiQ1RSTCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgZGVsZXRlIChVKzAwN0YpIGtleQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTF9OQU1FID0gIkRFTCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBbiBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGUgZGVsZXRlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfTkFNRSA9ICJERUxFVEUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdFbmQnIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfTkFNRSA9ICJFTkQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQW4gYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhlIGVudGVyIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRFUl9OQU1FID0gIkVOVEVSIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIG9mIHRoZSBlc2NhcGUgKFUrMDAxQikga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ19OQU1FID0gIkVTQyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBbiBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGUgZXNjYXBlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVfTkFNRSA9ICJFU0NBUEUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGMScga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEYxX05BTUUgPSAiRjEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGMTAnIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGMTBfTkFNRSA9ICJGMTAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGMTEnIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGMTFfTkFNRSA9ICJGMTEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGMTInIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGMTJfTkFNRSA9ICJGMTIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGMTMnIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGMTNfTkFNRSA9ICJGMTMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGMTQnIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGMTRfTkFNRSA9ICJGMTQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGMTUnIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGMTVfTkFNRSA9ICJGMTUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGMicga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEYyX05BTUUgPSAiRjIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGMycga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEYzX05BTUUgPSAiRjMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGNCcga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEY0X05BTUUgPSAiRjQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGNScga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEY1X05BTUUgPSAiRjUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGNicga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEY2X05BTUUgPSAiRjYiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGNycga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEY3X05BTUUgPSAiRjciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGOCcga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEY4X05BTUUgPSAiRjgiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdGOScga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEY5X05BTUUgPSAiRjkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlIGZvcm0gZmVlZCAoVSswMDBDKSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkZfTkFNRSA9ICJGRiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ0hvbWUnIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT01FX05BTUUgPSAiSE9NRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ0luc2VydCcga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9OQU1FID0gIklOU0VSVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgbGluZSBmZWVkIChVKzAwMEEpIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRl9OQU1FID0gIkxGIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIG9mIHRoZSAnTTEnIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNMV9OQU1FID0gIk0xIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ00yJyBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTTJfTkFNRSA9ICJNMiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ00zJyBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTTNfTkFNRSA9ICJNMyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ000JyBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTTRfTkFNRSA9ICJNNCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgbnVsbCAoVSswMDAwKSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMX05BTUUgPSAiTlVMIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIG9mIHRoZSAnTnVtTG9jaycga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTV9MT0NLX05BTUUgPSAiTlVNX0xPQ0siOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICcwJyBrZXkgb24gdGhlIG51bXBhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1QQURfMF9OQU1FID0gIk5VTVBBRF8wIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIG9mIHRoZSAnMScga2V5IG9uIHRoZSBudW1wYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNUEFEXzFfTkFNRSA9ICJOVU1QQURfMSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJzInIGtleSBvbiB0aGUgbnVtcGFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTVBBRF8yX05BTUUgPSAiTlVNUEFEXzIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICczJyBrZXkgb24gdGhlIG51bXBhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1QQURfM19OQU1FID0gIk5VTVBBRF8zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIG9mIHRoZSAnNCcga2V5IG9uIHRoZSBudW1wYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNUEFEXzRfTkFNRSA9ICJOVU1QQURfNCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJzUnIGtleSBvbiB0aGUgbnVtcGFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTVBBRF81X05BTUUgPSAiTlVNUEFEXzUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICc2JyBrZXkgb24gdGhlIG51bXBhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1QQURfNl9OQU1FID0gIk5VTVBBRF82IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIG9mIHRoZSAnNycga2V5IG9uIHRoZSBudW1wYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNUEFEXzdfTkFNRSA9ICJOVU1QQURfNyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJzgnIGtleSBvbiB0aGUgbnVtcGFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTVBBRF84X05BTUUgPSAiTlVNUEFEXzgiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICc5JyBrZXkgb24gdGhlIG51bXBhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1QQURfOV9OQU1FID0gIk5VTVBBRF85IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIG9mIHRoZSAnQWRkJyBrZXkgb24gdGhlIG51bXBhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1QQURfQUREX05BTUUgPSAiTlVNUEFEX0FERCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ0RlY2ltYWwnIGtleSBvbiB0aGUgbnVtcGFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTVBBRF9ERUNJTUFMX05BTUUgPSAiTlVNUEFEX0RFQ0lNQUwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdEaXZpZGUnIGtleSBvbiB0aGUgbnVtcGFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTVBBRF9ESVZJREVfTkFNRSA9ICJOVU1QQURfRElWSURFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIG9mIHRoZSAnRW50ZXInIGtleSBvbiB0aGUgbnVtcGFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTVBBRF9FTlRFUl9OQU1FID0gIk5VTVBBRF9FTlRFUiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJz0nIGtleSBvbiB0aGUgbnVtcGFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTVBBRF9FUVVBTF9OQU1FID0gIk5VTVBBRF9FUVVBTCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgJ011bHRpcGx5JyBrZXkgb24gdGhlIG51bXBhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1QQURfTVVMVElQTFlfTkFNRSA9ICJOVU1QQURfTVVMVElQTFkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdTdWJ0cmFjdCcga2V5IG9uIHRoZSBudW1wYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNUEFEX1NVQlRSQUNUX05BTUUgPSAiTlVNUEFEX1NVQlRSQUNUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIG9mIHRoZSAnUGFnZSBEb3duJyBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9ET1dOX05BTUUgPSAiUEFHRV9ET1dOIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIG9mIHRoZSAnUGFnZSBVcCcga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfVVBfTkFNRSA9ICJQQUdFX1VQIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIGZvciB0aGUgJ1BhdXNlJyBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFVU0VfTkFNRSA9ICJQQVVTRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBmb3IgdGhlICdQcmludCBTY3JlZW4nIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOVF9TQ1JFRU5fTkFNRSA9ICJQUklOVF9TQ1JFRU4iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQW4gYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhlIGVudGVyIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk5fTkFNRSA9ICJSRVRVUk4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgZm9yIHRoZSAnU2Nyb2xsIExvY2snIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JPTExfTE9DS19OQU1FID0gIlNDUk9MTF9MT0NLIjsgLy8kTk9OLU5MUy0xJAkJCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlICdTaGlmdCcga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNISUZUX05BTUUgPSAiU0hJRlQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlIHNwYWNlIChVKzAwMjApIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRV9OQU1FID0gIlNQQUNFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGZvcm1hbCBuYW1lIG9mIHRoZSB0YWIgKFUrMDAwOSkga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQl9OQU1FID0gIlRBQiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgdmVydGljYWwgdGFiIChVKzAwMEIpIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWVF9OQU1FID0gIlZUIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIExvb2tzIHVwIGEgc2luZ2xlIG5hdHVyYWwga2V5IGJ5IGl0cyBmb3JtYWwgbmFtZSwgYW5kIHJldHVybnMgdGhlIGludGVnZXIKLQkgKiByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBuYXR1cmFsIGtleQotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgZm9ybWFsIG5hbWUgb2YgdGhlIG5hdHVyYWwga2V5IHRvIGxvb2stdXA7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIFRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMga2V5LiBJZiB0aGUgbmF0dXJhbCBrZXkgY2Fubm90Ci0JICogICAgICAgICBiZSBmb3VuZCwgdGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPjA8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBpbnQgZm9ybWFsS2V5TG9va3VwKFN0cmluZyBuYW1lKTsJCi0KLQkvKioKLQkgKiBMb29rcyB1cCBhIHNpbmdsZSBuYXR1cmFsIGtleSBieSBpdHMgZm9ybWFsIG5hbWUsIGFuZCByZXR1cm5zIHRoZSBpbnRlZ2VyCi0JICogcmVwcmVzZW50YXRpb24gZm9yIHRoaXMgbmF0dXJhbCBrZXkKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIGZvcm1hbCBuYW1lIG9mIHRoZSBuYXR1cmFsIGtleSB0byBsb29rLXVwOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGtleS4gSWYgdGhlIG5hdHVyYWwga2V5IGNhbm5vdAotCSAqICAgICAgICAgYmUgZm91bmQsIHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT4wPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBmb3JtYWxLZXlMb29rdXBJbnRlZ2VyKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIExvb2tzIHVwIGEgc2luZ2xlIG1vZGlmaWVyIGtleSBieSBpdHMgZm9ybWFsIG5hbWUsIGFuZCByZXR1cm5zIHRoZSBpbnRlZ2VyCi0JICogcmVwcmVzZW50YXRpb24gZm9yIHRoaXMgbW9kaWZpZXIga2V5Ci0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgbW9kaWZpZXIga2V5IHRvIGxvb2stdXA7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIFRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMga2V5LiBJZiB0aGUgbW9kaWZpZXIga2V5Ci0JICogICAgICAgICBjYW5ub3QgYmUgZm91bmQsIHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT4wPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgaW50IGZvcm1hbE1vZGlmaWVyTG9va3VwKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIExvb2tzIHVwIGEga2V5IHZhbHVlLCBhbmQgcmV0dXJucyB0aGUgZm9ybWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IKLQkgKiB0aGF0IGtleQotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBrZXkgdG8gbG9vay11cC4KLQkgKiBAcmV0dXJuIFRoZSBmb3JtYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMga2V5LiBJZiB0aGlzIGtleSBjYW5ub3QKLQkgKiAgICAgICAgIGJlIGZvdW5kLCB0aGVuIGl0IGlzIHNpbXBseSB0aGUgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhhdAotCSAqICAgICAgICAgaW50ZWdlciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZvcm1hbE5hbWVMb29rdXAoaW50IGtleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBBTFQga2V5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIEFMVCBrZXkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFsdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgQ09NTUFORCBrZXkuCi0JICogCi0JICogQHJldHVybiBUaGUgQ09NTUFORCBrZXkKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbW1hbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIENUUkwga2V5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIENUUkwga2V5Ci0JICovCi0JcHVibGljIGludCBnZXRDdHJsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBTSElGVCBrZXkuCi0JICogCi0JICogQHJldHVybiBUaGUgU0hJRlQga2V5Ci0JICovCi0JcHVibGljIGludCBnZXRTaGlmdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBrZXkgaXMgYSBtb2RpZmllciBrZXkuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIGtleSB0byBjaGVjay4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBrZXkgaXMgb25lIG9mIHRoZSBtb2RpZmllciBrZXlzOwotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVyS2V5KGludCBrZXkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9LZXlCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL0tleUJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU3YTA1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL0tleUJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuUGFyYW1ldGVyaXplZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyU2VxdWVuY2U7Ci0KLS8qKgotICogPHA+Ci0gKiBBIGtleWJvYXJkIHNob3J0Y3V0LiBUaGlzIGlzIGEgYmluZGluZyBiZXR3ZWVuIHNvbWUga2V5Ym9hcmQgaW5wdXQgYW5kIHRoZQotICogdHJpZ2dlcmluZyBvZiBhIGNvbW1hbmQuIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgS2V5QmluZGluZyBleHRlbmRzIEJpbmRpbmcgewotCi0JLyoqCi0JICogVGhlIGtleSBzZXF1ZW5jZSB3aGljaCB0cmlnZ2VycyB0aGlzIGJpbmRpbmcuIFRoaXMgc2VxdWVuY2UgaXMgbmV2ZXIKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEtleVNlcXVlbmNlIGtleVNlcXVlbmNlOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5LZXlCaW5kaW5nPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5U2VxdWVuY2UKLQkgKiAgICAgICAgICAgIFRoZSBrZXkgc2VxdWVuY2Ugd2hpY2ggc2hvdWxkIHRyaWdnZXIgdGhpcyBiaW5kaW5nLiBUaGlzIHZhbHVlCi0JICogICAgICAgICAgICBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSXQgYWxzbyBtdXN0IGJlIGEgY29tcGxldGUsCi0JICogICAgICAgICAgICBub24tZW1wdHkga2V5IHNlcXVlbmNlLgotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVyaXplZCBjb21tYW5kIHRvIHdoaWNoIHRoaXMgYmluZGluZyBhcHBsaWVzOyB0aGlzCi0JICogICAgICAgICAgICB2YWx1ZSBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcgaXMgbWVhbnQgdG8KLQkgKiAgICAgICAgICAgICJ1bmJpbmQiIGEgcHJldmlvdXNseSBkZWZpbmVkIGJpbmRpbmcuCi0JICogQHBhcmFtIHNjaGVtZUlkCi0JICogICAgICAgICAgICBUaGUgc2NoZW1lIHRvIHdoaWNoIHRoaXMgYmluZGluZyBiZWxvbmdzOyB0aGlzIHZhbHVlIG11c3Qgbm90Ci0JICogICAgICAgICAgICBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gY29udGV4dElkCi0JICogICAgICAgICAgICBUaGUgY29udGV4dCB0byB3aGljaCB0aGlzIGJpbmRpbmcgYXBwbGllczsgdGhpcyB2YWx1ZSBtdXN0IG5vdAotCSAqICAgICAgICAgICAgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgVGhlIGxvY2FsZSB0byB3aGljaCB0aGlzIGJpbmRpbmcgYXBwbGllczsgdGhpcyB2YWx1ZSBtYXkgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGFwcGxpZXMgdG8gYWxsIGxvY2FsZXMuCi0JICogQHBhcmFtIHBsYXRmb3JtCi0JICogICAgICAgICAgICBUaGUgcGxhdGZvcm0gdG8gd2hpY2ggdGhpcyBiaW5kaW5nIGFwcGxpZXM7IHRoaXMgdmFsdWUgbWF5IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBhcHBsaWVzIHRvIGFsbCBwbGF0Zm9ybXMuCi0JICogQHBhcmFtIHdpbmRvd01hbmFnZXIKLQkgKiAgICAgICAgICAgIFRoZSB3aW5kb3cgbWFuYWdlciB0byB3aGljaCB0aGlzIGJpbmRpbmcgYXBwbGllczsgdGhpcyB2YWx1ZQotCSAqICAgICAgICAgICAgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGFwcGxpZXMgdG8gYWxsIHdpbmRvdwotCSAqICAgICAgICAgICAgbWFuYWdlcnMuIFRoaXMgdmFsdWUgaXMgY3VycmVudGx5IGlnbm9yZWQuCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIG9mIGJpbmRpbmcuIFRoaXMgc2hvdWxkIGJlIGVpdGhlciA8Y29kZT5TWVNURU08L2NvZGU+Ci0JICogICAgICAgICAgICBvciA8Y29kZT5VU0VSPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgS2V5QmluZGluZyhmaW5hbCBLZXlTZXF1ZW5jZSBrZXlTZXF1ZW5jZSwKLQkJCWZpbmFsIFBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN0cmluZyBzY2hlbWVJZCwKLQkJCWZpbmFsIFN0cmluZyBjb250ZXh0SWQsIGZpbmFsIFN0cmluZyBsb2NhbGUsIGZpbmFsIFN0cmluZyBwbGF0Zm9ybSwKLQkJCWZpbmFsIFN0cmluZyB3aW5kb3dNYW5hZ2VyLCBmaW5hbCBpbnQgdHlwZSkgewotCQlzdXBlcihjb21tYW5kLCBzY2hlbWVJZCwgY29udGV4dElkLCBsb2NhbGUsIHBsYXRmb3JtLCB3aW5kb3dNYW5hZ2VyLAotCQkJCXR5cGUpOwotCi0JCWlmIChrZXlTZXF1ZW5jZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBrZXkgc2VxdWVuY2UgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKCFrZXlTZXF1ZW5jZS5pc0NvbXBsZXRlKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJDYW5ub3QgYmluZCB0byBhbiBpbmNvbXBsZXRlIGtleSBzZXF1ZW5jZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoa2V5U2VxdWVuY2UuaXNFbXB0eSgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiQ2Fubm90IGJpbmQgdG8gYW4gZW1wdHkga2V5IHNlcXVlbmNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRoaXMua2V5U2VxdWVuY2UgPSBrZXlTZXF1ZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBrZXkgc2VxdWVuY2Ugd2hpY2ggdHJpZ2dlcnMgdGhpcyBiaW5kaW5nLiBUaGUga2V5IHNlcXVlbmNlCi0JICogd2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGVtcHR5IG9yIGluY29tcGxldGUuCi0JICogCi0JICogQHJldHVybiBUaGUga2V5IHNlcXVlbmNlOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgS2V5U2VxdWVuY2UgZ2V0S2V5U2VxdWVuY2UoKSB7Ci0JCXJldHVybiBrZXlTZXF1ZW5jZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLkJpbmRpbmcjZ2V0VHJpZ2dlclNlcXVlbmNlKCkKLQkgKi8KLQlwdWJsaWMgVHJpZ2dlclNlcXVlbmNlIGdldFRyaWdnZXJTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIGdldEtleVNlcXVlbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9LZXlMb29rdXBGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL0tleUxvb2t1cEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzOTJkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL0tleUxvb2t1cEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzOwotCi0KLS8qKgotICogPHA+Ci0gKiBBIGZhY3RvcnkgY2xhc3MgZm9yIDxjb2RlPklMb29rdXA8L2NvZGU+IGluc3RhbmNlcy4gVGhpcyBmYWN0b3J5IGNhbiBiZQotICogdXNlZCB0byByZXRyaWV2ZSBpbnN0YW5jZXMgb2YgbG9vay11cHMgZGVmaW5lZCBieSB0aGlzIHBhY2thZ2UuIEl0IGFsc28KLSAqIGFsbG93cyB5b3UgdG8gZGVmaW5lIHlvdXIgb3duIGxvb2stdXAgZm9yIHVzZSBpbiB0aGUgY2xhc3Nlcy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgS2V5TG9va3VwRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgU1dUIGtleSBsb29rLXVwIGRlZmluZWQgYnkgdGhpcyBwYWNrYWdlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNXVEtleUxvb2t1cCBTV1RfS0VZX0xPT0tVUCA9IG5ldyBTV1RLZXlMb29rdXAoKTsKLQotCS8qKgotCSAqIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IDxjb2RlPktleVN0cm9rZTwvY29kZT4gaW4KLQkgKiBjb252ZXJ0aW5nIHN0cmluZyByZXByZXNlbnRhdGlvbnMgdG8gaW5zdGFuY2VzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIElLZXlMb29rdXAgZGVmYXVsdExvb2t1cCA9IFNXVF9LRVlfTE9PS1VQOwotCi0JLyoqCi0JICogUHJvdmlkZXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+U1dUS2V5TG9va3VwPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBTV1QgbG9vay11cCB0YWJsZSBmb3Iga2V5IHN0cm9rZSBmb3JtYXQgaW5mb3JtYXRpb247IG5ldmVyCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElLZXlMb29rdXAgZ2V0U1dUS2V5TG9va3VwKCkgewotCQlyZXR1cm4gU1dUX0tFWV9MT09LVVA7Ci0JfQotCi0JLyoqCi0JICogQW4gYWNjZXNzb3IgZm9yIHRoZSBjdXJyZW50IGRlZmF1bHQgbG9vay11cC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IGxvb2stdXA7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUtleUxvb2t1cCBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gZGVmYXVsdExvb2t1cDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IGxvb2stdXAuCi0JICogCi0JICogQHBhcmFtIGRlZmF1bHRMb29rdXAKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IGxvb2stdXAuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXREZWZhdWx0KGZpbmFsIElLZXlMb29rdXAgZGVmYXVsdExvb2t1cCkgewotCQlpZiAoZGVmYXVsdExvb2t1cCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGUgbG9vay11cCBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQotCQlLZXlMb29rdXBGYWN0b3J5LmRlZmF1bHRMb29rdXAgPSBkZWZhdWx0TG9va3VwOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBLZXlMb29rdXBGYWN0b3J5KCkgewotCQkvLyBOb3QgdG8gYmUgY29uc3RydWN0cmVkLgotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvS2V5U2VxdWVuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvS2V5U2VxdWVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0ZGVmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL0tleVNlcXVlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLmZvcm1hdHRpbmcuS2V5Rm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlV0aWw7Ci0KLS8qKgotICogPHA+Ci0gKiBBIDxjb2RlPktleVNlcXVlbmNlPC9jb2RlPiBpcyBkZWZpbmVkIGFzIGEgbGlzdCBvZiB6ZXJvIG9yIG1vcmUKLSAqIDxjb2RlPktleVN0cm9rZXM8L2NvZGU+LCB3aXRoIHRoZSBzdGlwdWxhdGlvbiB0aGF0IGFsbAotICogPGNvZGU+S2V5U3Ryb2tlPC9jb2RlPiBvYmplY3RzIG11c3QgYmUgY29tcGxldGUsIHNhdmUgZm9yIHRoZSBsYXN0IG9uZSwKLSAqIHdob3NlIGNvbXBsZXRlbmVzcyBpcyBvcHRpb25hbC4gQSA8Y29kZT5LZXlTZXF1ZW5jZTwvY29kZT4gaXMgc2FpZCB0byBiZQotICogY29tcGxldGUgaWYgYWxsIG9mIGl0cyA8Y29kZT5LZXlTdHJva2U8L2NvZGU+IG9iamVjdHMgYXJlIGNvbXBsZXRlLgotICogPC9wPgotICogPHA+Ci0gKiBBbGwgPGNvZGU+S2V5U2VxdWVuY2U8L2NvZGU+IG9iamVjdHMgaGF2ZSBhIGZvcm1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24KLSAqIGF2YWlsYWJsZSB2aWEgdGhlIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZC4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mCi0gKiBtZXRob2RzIHRvIGdldCBpbnN0YW5jZXMgb2YgPGNvZGU+S2V5U2VxdWVuY2U8L2NvZGU+IG9iamVjdHMsIGluY2x1ZGluZyBvbmUKLSAqIHdoaWNoIGNhbiBwYXJzZSB0aGlzIGZvcm1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEFsbCA8Y29kZT5LZXlTZXF1ZW5jZTwvY29kZT4gb2JqZWN0cywgdmlhIHRoZSA8Y29kZT5mb3JtYXQoKTwvY29kZT4KLSAqIG1ldGhvZCwgcHJvdmlkZSBhIHZlcnNpb24gb2YgdGhlaXIgZm9ybWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiB0cmFuc2xhdGVkIGJ5Ci0gKiBwbGF0Zm9ybSBhbmQgbG9jYWxlLCBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byBhIHVzZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxjb2RlPktleVNlcXVlbmNlPC9jb2RlPiBvYmplY3RzIGFyZSBpbW11dGFibGUuIENsaWVudHMgYXJlIG5vdCBwZXJtaXR0ZWQKLSAqIHRvIGV4dGVuZCB0aGlzIGNsYXNzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBLZXlTZXF1ZW5jZSBleHRlbmRzIFRyaWdnZXJTZXF1ZW5jZSBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCi0JLyoqCi0JICogQW4gZW1wdHkga2V5IHNlcXVlbmNlIGluc3RhbmNlIGZvciB1c2UgYnkgZXZlcnlvbmUuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgS2V5U2VxdWVuY2UgRU1QVFlfS0VZX1NFUVVFTkNFID0gbmV3IEtleVNlcXVlbmNlKAotCQkJbmV3IEtleVN0cm9rZVswXSk7Ci0KLQkvKioKLQkgKiBUaGUgZGVsaW1pdGVyIGJldHdlZW4gbXVsdGlwbGUga2V5IHN0cm9rZXMgaW4gYSBzaW5nbGUga2V5IHNlcXVlbmNlIC0tCi0JICogZXhwcmVzc2VkIGluIHRoZSBmb3JtYWwga2V5IHN0cm9rZSBncmFtbWFyLiBUaGlzIGlzIG5vdCB0byBiZSBkaXNwbGF5ZWQKLQkgKiB0byB0aGUgdXNlci4gSXQgaXMgb25seSBpbnRlbmRlZCBhcyBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBLRVlfU1RST0tFX0RFTElNSVRFUiA9ICJcdTAwMjAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2V0IG9mIGRlbGltaXRlcnMgZm9yIDxjb2RlPktleVN0cm9rZTwvY29kZT4gb2JqZWN0cyBhbGxvd2VkIGR1cmluZwotCSAqIHBhcnNpbmcgb2YgdGhlIGZvcm1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZX1NUUk9LRV9ERUxJTUlURVJTID0gS0VZX1NUUk9LRV9ERUxJTUlURVIKLQkJCSsgIlxiXHJcdTAwN0ZcdTAwMUJcZlxuXDBcdFx1MDAwQiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdldHMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+S2V5U2VxdWVuY2U8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gYSBrZXkgc2VxdWVuY2UuIFRoaXMga2V5IHNlcXVlbmNlIHdpbGwgaGF2ZSBubyBrZXkgc3Ryb2tlcy4KLQkgKiAgICAgICAgIEd1YXJhbnRlZWQgbm90IHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgS2V5U2VxdWVuY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBFTVBUWV9LRVlfU0VRVUVOQ0U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5LZXlTZXF1ZW5jZTwvY29kZT4gZ2l2ZW4gYSBrZXkgc2VxdWVuY2UKLQkgKiBhbmQgYSBrZXkgc3Ryb2tlLgotCSAqIAotCSAqIEBwYXJhbSBrZXlTZXF1ZW5jZQotCSAqICAgICAgICAgICAgYSBrZXkgc2VxdWVuY2UuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBrZXlTdHJva2UKLQkgKiAgICAgICAgICAgIGEga2V5IHN0cm9rZS4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBhIGtleSBzZXF1ZW5jZSB0aGF0IGlzIGVxdWFsIHRvIHRoZSBnaXZlbiBrZXkgc2VxdWVuY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgIGdpdmVuIGtleSBzdHJva2UgYXBwZW5kZWQgdG8gdGhlIGVuZC4gR3VhcmFudGVlZCBub3QgdG8gYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgS2V5U2VxdWVuY2UgZ2V0SW5zdGFuY2UoZmluYWwgS2V5U2VxdWVuY2Uga2V5U2VxdWVuY2UsCi0JCQlmaW5hbCBLZXlTdHJva2Uga2V5U3Ryb2tlKSB7Ci0JCWlmIChrZXlTZXF1ZW5jZSA9PSBudWxsIHx8IGtleVN0cm9rZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJZmluYWwgS2V5U3Ryb2tlW10gb2xkS2V5U3Ryb2tlcyA9IGtleVNlcXVlbmNlLmdldEtleVN0cm9rZXMoKTsKLQkJZmluYWwgaW50IG9sZEtleVN0cm9rZUxlbmd0aCA9IG9sZEtleVN0cm9rZXMubGVuZ3RoOwotCQlmaW5hbCBLZXlTdHJva2VbXSBuZXdLZXlTdHJva2VzID0gbmV3IEtleVN0cm9rZVtvbGRLZXlTdHJva2VMZW5ndGggKyAxXTsKLQkJU3lzdGVtCi0JCQkJLmFycmF5Y29weShvbGRLZXlTdHJva2VzLCAwLCBuZXdLZXlTdHJva2VzLCAwLAotCQkJCQkJb2xkS2V5U3Ryb2tlTGVuZ3RoKTsKLQkJbmV3S2V5U3Ryb2tlc1tvbGRLZXlTdHJva2VMZW5ndGhdID0ga2V5U3Ryb2tlOwotCQlyZXR1cm4gbmV3IEtleVNlcXVlbmNlKG5ld0tleVN0cm9rZXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+S2V5U2VxdWVuY2U8L2NvZGU+IGdpdmVuIGEgc2luZ2xlIGtleQotCSAqIHN0cm9rZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5U3Ryb2tlCi0JICogICAgICAgICAgICBhIHNpbmdsZSBrZXkgc3Ryb2tlLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIGEga2V5IHNlcXVlbmNlLiBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEtleVNlcXVlbmNlIGdldEluc3RhbmNlKGZpbmFsIEtleVN0cm9rZSBrZXlTdHJva2UpIHsKLQkJcmV0dXJuIG5ldyBLZXlTZXF1ZW5jZShuZXcgS2V5U3Ryb2tlW10geyBrZXlTdHJva2UgfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5LZXlTZXF1ZW5jZTwvY29kZT4gZ2l2ZW4gYW4gYXJyYXkgb2Yga2V5Ci0JICogc3Ryb2tlcy4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5U3Ryb2tlcwotCSAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGtleSBzdHJva2VzLiBUaGlzIGFycmF5IG1heSBiZSBlbXB0eSwgYnV0IGl0IG11c3QKLQkgKiAgICAgICAgICAgIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcyBhcnJheSBtdXN0IG5vdCBjb250YWluCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50cy4KLQkgKiBAcmV0dXJuIGEga2V5IHNlcXVlbmNlLiBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEtleVNlcXVlbmNlIGdldEluc3RhbmNlKGZpbmFsIEtleVN0cm9rZVtdIGtleVN0cm9rZXMpIHsKLQkJcmV0dXJuIG5ldyBLZXlTZXF1ZW5jZShrZXlTdHJva2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPktleVNlcXVlbmNlPC9jb2RlPiBnaXZlbiBhIGxpc3Qgb2Yga2V5Ci0JICogc3Ryb2tlcy4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5U3Ryb2tlcwotCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2Yga2V5IHN0cm9rZXMuIFRoaXMgbGlzdCBtYXkgYmUgZW1wdHksIGJ1dCBpdCBtdXN0Ci0JICogICAgICAgICAgICBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgbGlzdCBpcyBub3QgZW1wdHksIGl0Ci0JICogICAgICAgICAgICBtdXN0IG9ubHkgY29udGFpbiBpbnN0YW5jZXMgb2YgPGNvZGU+S2V5U3Ryb2tlPC9jb2RlPi4KLQkgKiBAcmV0dXJuIGEga2V5IHNlcXVlbmNlLiBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEtleVNlcXVlbmNlIGdldEluc3RhbmNlKGZpbmFsIExpc3Qga2V5U3Ryb2tlcykgewotCQlyZXR1cm4gbmV3IEtleVNlcXVlbmNlKChLZXlTdHJva2VbXSkga2V5U3Ryb2tlcwotCQkJCS50b0FycmF5KG5ldyBLZXlTdHJva2Vba2V5U3Ryb2tlcy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5LZXlTZXF1ZW5jZTwvY29kZT4gYnkgcGFyc2luZyBhIGdpdmVuCi0JICogZm9ybWFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogICAgICAgICAgICB0aGUgZm9ybWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiB0byBwYXJzZS4KLQkgKiBAcmV0dXJuIGEga2V5IHNlcXVlbmNlLiBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGZvcm1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gY291bGQgbm90IGJlIHBhcnNlZAotCSAqICAgICAgICAgICAgIHRvIGEgdmFsaWQga2V5IHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgS2V5U2VxdWVuY2UgZ2V0SW5zdGFuY2UoZmluYWwgU3RyaW5nIHN0cmluZykKLQkJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCWZpbmFsIExpc3Qga2V5U3Ryb2tlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmluYWwgU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nLAotCQkJCUtFWV9TVFJPS0VfREVMSU1JVEVSUyk7Ci0KLQkJdHJ5IHsKLQkJCXdoaWxlIChzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotCQkJCWtleVN0cm9rZXMuYWRkKEtleVN0cm9rZS5nZXRJbnN0YW5jZShzdHJpbmdUb2tlbml6ZXIKLQkJCQkJCS5uZXh0VG9rZW4oKSkpOwotCi0JCQlmaW5hbCBLZXlTdHJva2VbXSBrZXlTdHJva2VBcnJheSA9IChLZXlTdHJva2VbXSkga2V5U3Ryb2tlcwotCQkJCQkudG9BcnJheShuZXcgS2V5U3Ryb2tlW2tleVN0cm9rZXMuc2l6ZSgpXSk7Ci0JCQlyZXR1cm4gbmV3IEtleVNlcXVlbmNlKGtleVN0cm9rZUFycmF5KTsKLQkJfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLQkJCQkJIkNvdWxkIG5vdCBjb25zdHJ1Y3Qga2V5IHNlcXVlbmNlIHdpdGggdGhlc2Uga2V5IHN0cm9rZXM6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsga2V5U3Ryb2tlcyk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLQkJCQkJIkNvdWxkIG5vdCBjb25zdHJ1Y3Qga2V5IHNlcXVlbmNlIHdpdGggdGhlc2Uga2V5IHN0cm9rZXM6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsga2V5U3Ryb2tlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIDxjb2RlPktleVNlcXVlbmNlPC9jb2RlPiBnaXZlbiBhIGxpc3Qgb2Yga2V5Ci0JICogc3Ryb2tlcy4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5U3Ryb2tlcwotCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2Yga2V5IHN0cm9rZXMuIFRoaXMgbGlzdCBtYXkgYmUgZW1wdHksIGJ1dCBpdCBtdXN0Ci0JICogICAgICAgICAgICBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgbGlzdCBpcyBub3QgZW1wdHksIGl0Ci0JICogICAgICAgICAgICBtdXN0IG9ubHkgY29udGFpbiBpbnN0YW5jZXMgb2YgPGNvZGU+S2V5U3Ryb2tlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgS2V5U2VxdWVuY2UoZmluYWwgS2V5U3Ryb2tlW10ga2V5U3Ryb2tlcykgewotCQlzdXBlcihrZXlTdHJva2VzKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRyaWdnZXJzLmxlbmd0aCAtIDE7IGkrKykgewotCQkJS2V5U3Ryb2tlIGtleVN0cm9rZSA9IChLZXlTdHJva2UpIHRyaWdnZXJzW2ldOwotCi0JCQlpZiAoIWtleVN0cm9rZS5pc0NvbXBsZXRlKCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKLQkJZmluYWwgS2V5U2VxdWVuY2UgY2FzdGVkT2JqZWN0ID0gKEtleVNlcXVlbmNlKSBvYmplY3Q7Ci0JCXJldHVybiBVdGlsLmNvbXBhcmUodHJpZ2dlcnMsIGNhc3RlZE9iamVjdC50cmlnZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyB0aGlzIGtleSBzZXF1ZW5jZSBpbnRvIHRoZSBjdXJyZW50IGRlZmF1bHQgbG9vay4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIGtleSBzZXF1ZW5jZSB1c2luZyB0aGUgZGVmYXVsdAotCSAqICAgICAgICAgbG9vazsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBmb3JtYXQoKSB7Ci0JCXJldHVybiBLZXlGb3JtYXR0ZXJGYWN0b3J5LmdldERlZmF1bHQoKS5mb3JtYXQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBrZXkgc3Ryb2tlcyBmb3IgdGhpcyBrZXkgc2VxdWVuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBrZXkgc3Ryb2tlcyBrZXlzLiBUaGlzIGxpc3QgbWF5IGJlIGVtcHR5LCBidXQgaXMKLQkgKiAgICAgICAgIGd1YXJhbnRlZWQgbm90IHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzIGxpc3QgaXMgbm90Ci0JICogICAgICAgICBlbXB0eSwgaXQgaXMgZ3VhcmFudGVlZCB0byBvbmx5IGNvbnRhaW4gaW5zdGFuY2VzIG9mCi0JICogICAgICAgICA8Y29kZT5LZXlTdHJva2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCBLZXlTdHJva2VbXSBnZXRLZXlTdHJva2VzKCkgewotCQlmaW5hbCBpbnQgdHJpZ2dlckxlbmd0aCA9IHRyaWdnZXJzLmxlbmd0aDsKLQkJZmluYWwgS2V5U3Ryb2tlW10ga2V5U3Ryb2tlcyA9IG5ldyBLZXlTdHJva2VbdHJpZ2dlckxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodHJpZ2dlcnMsIDAsIGtleVN0cm9rZXMsIDAsIHRyaWdnZXJMZW5ndGgpOwotCQlyZXR1cm4ga2V5U3Ryb2tlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZSNnZXRQcmVmaXhlcygpCi0JICovCi0JcHVibGljIGZpbmFsIFRyaWdnZXJTZXF1ZW5jZVtdIGdldFByZWZpeGVzKCkgewotCQlmaW5hbCBpbnQgbnVtYmVyT2ZQcmVmaXhlcyA9IHRyaWdnZXJzLmxlbmd0aDsKLQkJZmluYWwgVHJpZ2dlclNlcXVlbmNlW10gcHJlZml4ZXMgPSBuZXcgVHJpZ2dlclNlcXVlbmNlW251bWJlck9mUHJlZml4ZXNdOwotCQlwcmVmaXhlc1swXSA9IEtleVNlcXVlbmNlLmdldEluc3RhbmNlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZQcmVmaXhlcyAtIDE7IGkrKykgewotCQkJZmluYWwgS2V5U3Ryb2tlW10gcHJlZml4S2V5U3Ryb2tlcyA9IG5ldyBLZXlTdHJva2VbaSArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weSh0cmlnZ2VycywgMCwgcHJlZml4S2V5U3Ryb2tlcywgMCwgaSArIDEpOwotCQkJcHJlZml4ZXNbaSArIDFdID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2UocHJlZml4S2V5U3Ryb2tlcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJlZml4ZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIGtleSBzZXF1ZW5jZSBpcyBjb21wbGV0ZS4gS2V5IHNlcXVlbmNlcyBhcmUKLQkgKiBjb21wbGV0ZSBpZmYgYWxsIG9mIHRoZWlyIGtleSBzdHJva2VzIGFyZSBjb21wbGV0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LCBpZmYgdGhlIGtleSBzZXF1ZW5jZSBpcyBjb21wbGV0ZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlmaW5hbCBpbnQgdHJpZ2dlcnNMZW5ndGggPSB0cmlnZ2Vycy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJpZ2dlcnNMZW5ndGg7IGkrKykgewotCQkJaWYgKCEoKEtleVN0cm9rZSkgdHJpZ2dlcnNbaV0pLmlzQ29tcGxldGUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZvcm1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMga2V5IHNlcXVlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGZvcm1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMga2V5IHNlcXVlbmNlLgotCSAqICAgICAgICAgR3VhcmFudGVlZCBub3QgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gS2V5Rm9ybWF0dGVyRmFjdG9yeS5nZXRGb3JtYWxLZXlGb3JtYXR0ZXIoKS5mb3JtYXQodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9LZXlTZXF1ZW5jZVRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvS2V5U2VxdWVuY2VUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MWI3YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9LZXlTZXF1ZW5jZVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIDxwPgotICogQSB3cmFwcGVyIGFyb3VuZCB0aGUgU1dUIHRleHQgd2lkZ2V0IHRoYXQgdHJhcHMgbGl0ZXJhbCBrZXkgcHJlc3NlcyBhbmQKLSAqIGNvbnZlcnRzIHRoZW0gaW50byBrZXkgc2VxdWVuY2VzIGZvciBkaXNwbGF5LiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGtleQotICogc3Ryb2tlcyB0aGF0IGFyZSBkaXNwbGF5ZWQ6IGNvbXBsZXRlIGFuZCBpbmNvbXBsZXRlLiBBIGNvbXBsZXRlIGtleSBzdHJva2UgaXMKLSAqIG9uZSB3aXRoIGEgbmF0dXJhbCBrZXksIHdoaWxlIGFuIGluY29tcGxldGUgb25lIGhhcyBubyBuYXR1cmFsIGtleS4KLSAqIEluY29tcGxldGUga2V5IHN0cm9rZXMgYXJlIG9ubHkgZGlzcGxheWVkIHVudGlsIHRoZXkgYXJlIG1hZGUgY29tcGxldGUgb3IKLSAqIHRoZWlyIGNvbXBvbmVudCBrZXkgcHJlc3NlcyBhcmUgcmVsZWFzZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEtleVNlcXVlbmNlVGV4dCB7Ci0KLQkvKioKLQkgKiBBIGtleSBsaXN0ZW5lciB0aGF0IHRyYXBzIGluY29taW5nIGV2ZW50cyBhbmQgZGlzcGxheXMgdGhlbSBpbiB0aGUKLQkgKiB3cmFwcGVkIHRleHQgZmllbGQuIEl0IGhhcyBubyBlZmZlY3Qgb24gdHJhdmVyc2FsIG9wZXJhdGlvbnMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBLZXlUcmFwTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBUaGUgaW5kZXggYXQgd2hpY2ggaW5zZXJ0aW9uIHNob3VsZCBvY2N1ci4gVGhpcyBpcyB1c2VkIGlmIHRoZXJlIGlzIGEKLQkJICogcmVwbGFjZW1lbnQgb2NjdXJyaW5nIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cm9rZSwgYW5kIHRoZSBmaXJzdCBrZXkKLQkJICogc3Ryb2tlIHdhcyBpbmNvbXBsZXRlLgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgaW5zZXJ0aW9uSW5kZXggPSAtMTsKLQotCQkvKioKLQkJICogUmVzZXRzIHRoZSBpbnNlcnRpb24gaW5kZXggdG8gcG9pbnQgbm93aGVyZS4gSW4gb3RoZXIgd29yZHMsIGl0IGlzCi0JCSAqIHNldCB0byA8Y29kZT4tMTwvY29kZT4uCi0JCSAqLwotCQl2b2lkIGNsZWFySW5zZXJ0aW9uSW5kZXgoKSB7Ci0JCQlpbnNlcnRpb25JbmRleCA9IC0xOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERlbGV0ZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBJZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24sIHRoZW4gaXQKLQkJICogZGVsZXRlcyB0aGUgbGFzdCBrZXkgc3Ryb2tlLgotCQkgKiAKLQkJICogQHBhcmFtIGtleVN0cm9rZXMKLQkJICogICAgICAgICAgICBUaGUga2V5IHN0cm9rZXMgZnJvbSB3aGljaCB0byBkZWxldGUuIFRoaXMgbGlzdCBtdXN0IG5vdAotCQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+LCBhbmQgbXVzdCByZXByZXNlbnQgYSB2YWxpZCBrZXkKLQkJICogICAgICAgICAgICBzZXF1ZW5jZS4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgS2V5U3Ryb2tlW10gZGVsZXRlS2V5U3Ryb2tlKGZpbmFsIEtleVN0cm9rZVtdIGtleVN0cm9rZXMpIHsKLQkJCWNsZWFySW5zZXJ0aW9uSW5kZXgoKTsKLQotCQkJaWYgKGhhc1NlbGVjdGlvbigpKSB7Ci0JCQkJLyoKLQkJCQkgKiBEZWxldGUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIC0tIGRpc2FsbG93aW5nIGluY29tcGxldGUKLQkJCQkgKiBzdHJva2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHNlcXVlbmNlLgotCQkJCSAqLwotCQkJCWZpbmFsIEtleVN0cm9rZVtdW10gZGVsZXRlZEtleVN0cm9rZXMgPSBuZXcgS2V5U3Ryb2tlWzFdW107Ci0JCQkJZGVsZXRlU2VsZWN0aW9uKGtleVN0cm9rZXMsIGZhbHNlLCBkZWxldGVkS2V5U3Ryb2tlcyk7Ci0JCQkJcmV0dXJuIGRlbGV0ZWRLZXlTdHJva2VzWzBdOwotCQkJfQotCi0JCQkvLyBSZW1vdmUgdGhlIGxhc3Qga2V5IHN0cm9rZS4KLQkJCWlmIChrZXlTdHJva2VzLmxlbmd0aCA+IDApIHsKLQkJCQlmaW5hbCBpbnQgbmV3S2V5U3Ryb2tlc0xlbmd0aCA9IGtleVN0cm9rZXMubGVuZ3RoIC0gMTsKLQkJCQlmaW5hbCBLZXlTdHJva2VbXSBuZXdLZXlTdHJva2VzID0gbmV3IEtleVN0cm9rZVtuZXdLZXlTdHJva2VzTGVuZ3RoXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGtleVN0cm9rZXMsIDAsIG5ld0tleVN0cm9rZXMsIDAsCi0JCQkJCQluZXdLZXlTdHJva2VzTGVuZ3RoKTsKLQkJCQlyZXR1cm4gbmV3S2V5U3Ryb2tlczsKLQkJCX0KLQotCQkJcmV0dXJuIGtleVN0cm9rZXM7Ci0JCX0KLQotCQkvKioKLQkJICogSGFuZGxlcyB0aGUga2V5IHByZXNzZWQgYW5kIHJlbGVhc2VkIGV2ZW50cyBvbiB0aGUgd3JhcHBlZCB0ZXh0Ci0JCSAqIHdpZGdldC4gVGhpcyBtYWtlcyBzdXJlIHRvIGVpdGhlciBhZGQgdGhlIHByZXNzZWQga2V5IHRvIHRoZQotCQkgKiB0ZW1wb3Jhcnkga2V5IHN0cm9rZSwgb3IgY29tcGxldGUgdGhlIGN1cnJlbnQgdGVtcG9yYXJ5IGtleSBzdHJva2UKLQkJICogYW5kIHByb21wdCBmb3IgdGhlIG5leHQuIEluIHRoZSBjYXNlIG9mIGEga2V5IHJlbGVhc2UsIHRoaXMgbWFrZXMKLQkJICogc3VyZSB0aGF0IHRoZSB0ZW1wb3Jhcnkgc3Ryb2tlIGlzIGNvcnJlY3RseSBkaXNwbGF5ZWQgLS0KLQkJICogY29ycmVzcG9uZGluZyB3aXRoIG1vZGlmaWVyIGtleXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHJlbGVhc2VkLgotCQkgKiAKLQkJICogQHBhcmFtIGV2ZW50Ci0JCSAqICAgICAgICAgICAgVGhlIHRyaWdnZXJpbmcgZXZlbnQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCUtleVN0cm9rZVtdIGtleVN0cm9rZXMgPSBnZXRLZXlTZXF1ZW5jZSgpLmdldEtleVN0cm9rZXMoKTsKLQotCQkJLy8gRGlzcGF0Y2ggdGhlIGV2ZW50IHRvIHRoZSBjb3JyZWN0IGhhbmRsZXIuCi0JCQlpZiAoZXZlbnQudHlwZSA9PSBTV1QuS2V5RG93bikgewotCQkJCWtleVN0cm9rZXMgPSBoYW5kbGVLZXlEb3duKGV2ZW50LCBrZXlTdHJva2VzKTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PSBTV1QuS2V5VXApIHsKLQkJCQlrZXlTdHJva2VzID0gaGFuZGxlS2V5VXAoZXZlbnQsIGtleVN0cm9rZXMpOwotCQkJfQotCi0JCQkvLyBVcGRhdGUgdGhlIHVuZGVybHlpbmcgd2lkZ2V0LgotCQkJc2V0S2V5U2VxdWVuY2UoS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2Uoa2V5U3Ryb2tlcykpOwotCi0JCQkvLyBQcmV2ZW50IHRoZSBldmVudCBmcm9tIHJlYWNoaW5nIHRoZSB3aWRnZXQuCi0JCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCX0KLQotCQkvKioKLQkJICogSGFuZGxlcyB0aGUgY2FzZSB3aGVyZSB0aGUga2V5IGV2ZW50IGlzIGFuIDxjb2RlPlNXVC5LZXlEb3duPC9jb2RlPgotCQkgKiBldmVudC4gVGhpcyBlaXRoZXIgY2F1c2VzIGEgZGVsZXRpb24gKGlmIGl0IGlzIGFuIHVubW9kaWZpZWQKLQkJICogYmFja3NwYWNlIGtleSBzdHJva2UpLCBvciBhbiBpbnNlcnRpb24gKGlmIGl0IGlzIGFueSBvdGhlciBrZXkpLgotCQkgKiAKLQkJICogQHBhcmFtIGV2ZW50Ci0JCSAqICAgICAgICAgICAgVGhlIHRyaWdnZXIga2V5IGRvd24gZXZlbnQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCQkgKiBAcGFyYW0ga2V5U3Ryb2tlcwotCQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGxpc3Qgb2Yga2V5IHN0cm9rZXMuIFRoaXMgdmFsdWQgbXVzdCBub3QgYmUKLQkJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgYW5kIGl0IG11c3QgcmVwcmVzZW50IGEgdmFsaWQga2V5Ci0JCSAqICAgICAgICAgICAgc2VxdWVuY2UuCi0JCSAqLwotCQlwcml2YXRlIEtleVN0cm9rZVtdIGhhbmRsZUtleURvd24oRXZlbnQgZXZlbnQsIEtleVN0cm9rZVtdIGtleVN0cm9rZXMpIHsKLQkJCS8vIElzIGl0IGFuIHVubW9kaWZpZWQgYmFja3NwYWNlIGNoYXJhY3Rlcj8KLQkJCWlmICgoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5CUykgJiYgKGV2ZW50LnN0YXRlTWFzayA9PSAwKSkgewotCQkJCXJldHVybiBkZWxldGVLZXlTdHJva2Uoa2V5U3Ryb2tlcyk7Ci0JCQl9Ci0KLQkJCXJldHVybiBpbnNlcnRLZXlTdHJva2UoZXZlbnQsIGtleVN0cm9rZXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIGtleSBldmVudCBpcyBhbiA8Y29kZT5TV1QuS2V5VXA8L2NvZGU+Ci0JCSAqIGV2ZW50LiBUaGlzIHJlc2V0cyB0aGUgaW5zZXJ0aW9uIGluZGV4LiBJZiB0aGVyZSBpcyBhbiBpbmNvbXBsZXRlCi0JCSAqIHN0cm9rZSwgdGhlbiB0aGF0IGluY29tcGxldGUgc3Ryb2tlIGlzIG1vZGlmaWVkIHRvIG1hdGNoIHRoZSBrZXlzCi0JCSAqIHRoYXQgYXJlIHN0aWxsIGhlbGQuIElmIG5vIGtleXMgYXJlIGhlbGQsIHRoZW4gdGhlIGluY29tcGxldGUgc3Ryb2tlCi0JCSAqIGlzIHJlbW92ZWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZXZlbnQKLQkJICogICAgICAgICAgICBUaGUgdHJpZ2dlcmluZyBldmVudDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkJICogQHBhcmFtIGtleVN0cm9rZXMKLQkJICogICAgICAgICAgICBUaGUga2V5IHN0cm9rZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgY3VycmVudCBrZXkgc2VxdWVuY2U7Ci0JCSAqICAgICAgICAgICAgdGhlc2Uga2V5IHN0cm9rZXMgYXJlIGd1YXJhbnRlZWQgdG8gcmVwcmVzZW50IGEgdmFsaWQga2V5Ci0JCSAqICAgICAgICAgICAgc2VxdWVuY2UuIFRoaXMgdmFsdWUgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIEtleVN0cm9rZVtdIGhhbmRsZUtleVVwKGZpbmFsIEV2ZW50IGV2ZW50LAotCQkJCWZpbmFsIEtleVN0cm9rZVtdIGtleVN0cm9rZXMpIHsKLQkJCWlmIChoYXNJbmNvbXBsZXRlU3Ryb2tlKCkpIHsKLQkJCQkvKgotCQkJCSAqIEZpZ3VyZSBvdXQgdGhlIFNXVCBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZW1haW5pbmcKLQkJCQkgKiB2YWx1ZXMuCi0JCQkJICovCi0JCQkJRXZlbnQgbW9ja0V2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQkJaWYgKChldmVudC5rZXlDb2RlICYgU1dULk1PRElGSUVSX01BU0spICE9IDApIHsKLQkJCQkJLy8gVGhpcyBrZXkgdXAgaXMgYSBtb2RpZmllciBrZXkgYmVpbmcgcmVsZWFzZWQuCi0JCQkJCW1vY2tFdmVudC5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2sgLSBldmVudC5rZXlDb2RlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFRoaXMga2V5IHVwIGlzIHRoZSBvdGhlciBlbmQgb2YgYSBrZXkgZG93biB0aGF0IHdhcwotCQkJCQkgKiB0cmFwcGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9yIHdpbmRvdyBtYW5hZ2VyLgotCQkJCQkgKi8KLQkJCQkJbW9ja0V2ZW50LnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEdldCBhIHJlYXNvbmFibGUgZmFjc2ltaWxlIG9mIHRoZSBzdHJva2UgdGhhdCBpcyBzdGlsbAotCQkJCSAqIHByZXNzZWQuCi0JCQkJICovCi0JCQkJaW50IGtleSA9IFNXVEtleVN1cHBvcnQKLQkJCQkJCS5jb252ZXJ0RXZlbnRUb1VubW9kaWZpZWRBY2NlbGVyYXRvcihtb2NrRXZlbnQpOwotCQkJCUtleVN0cm9rZSByZW1haW5pbmdTdHJva2UgPSBTV1RLZXlTdXBwb3J0Ci0JCQkJCQkuY29udmVydEFjY2VsZXJhdG9yVG9LZXlTdHJva2Uoa2V5KTsKLQkJCQlmaW5hbCBpbnQga2V5U3Ryb2tlc0xlbmd0aCA9IGtleVN0cm9rZXMubGVuZ3RoOwotCQkJCWZpbmFsIEtleVN0cm9rZVtdIG5ld0tleVN0cm9rZXM7Ci0JCQkJaWYgKChrZXlTdHJva2VzTGVuZ3RoID4gMCkKLQkJCQkJCSYmIChyZW1haW5pbmdTdHJva2UuZ2V0TW9kaWZpZXJLZXlzKCkgIT0gMCkpIHsKLQkJCQkJbmV3S2V5U3Ryb2tlcyA9IG5ldyBLZXlTdHJva2Vba2V5U3Ryb2tlc0xlbmd0aF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoa2V5U3Ryb2tlcywgMCwgbmV3S2V5U3Ryb2tlcywgMCwKLQkJCQkJCQlrZXlTdHJva2VzTGVuZ3RoIC0gMSk7Ci0JCQkJCW5ld0tleVN0cm9rZXNba2V5U3Ryb2tlc0xlbmd0aCAtIDFdID0gcmVtYWluaW5nU3Ryb2tlOwotCi0JCQkJfSBlbHNlIGlmIChrZXlTdHJva2VzTGVuZ3RoID4gMCkgewotCQkJCQluZXdLZXlTdHJva2VzID0gbmV3IEtleVN0cm9rZVtrZXlTdHJva2VzTGVuZ3RoIC0gMV07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoa2V5U3Ryb2tlcywgMCwgbmV3S2V5U3Ryb2tlcywgMCwKLQkJCQkJCQlrZXlTdHJva2VzTGVuZ3RoIC0gMSk7Ci0KLQkJCQl9IGVsc2UgaWYgKHJlbWFpbmluZ1N0cm9rZS5nZXRNb2RpZmllcktleXMoKSAhPSAwKSB7Ci0JCQkJCW5ld0tleVN0cm9rZXMgPSBuZXcgS2V5U3Ryb2tlW2tleVN0cm9rZXNMZW5ndGggKyAxXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShrZXlTdHJva2VzLCAwLCBuZXdLZXlTdHJva2VzLCAwLAotCQkJCQkJCWtleVN0cm9rZXNMZW5ndGgpOwotCQkJCQluZXdLZXlTdHJva2VzW2tleVN0cm9rZXNMZW5ndGhdID0gcmVtYWluaW5nU3Ryb2tlOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJbmV3S2V5U3Ryb2tlcyA9IGtleVN0cm9rZXM7Ci0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmV3S2V5U3Ryb2tlczsKLQkJCX0KLQotCQkJcmV0dXJuIGtleVN0cm9rZXM7Ci0JCX0KLQotCQkvKioKLQkJICogPHA+Ci0JCSAqIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgYSBrZXkgZG93biBldmVudCBpcyBsZWFkaW5nIHRvIGEga2V5IHN0cm9rZQotCQkgKiBiZWluZyBpbnNlcnRlZC4gVGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGRlbGV0ZWQsIGFuZCBhbiBpbnZhbGlkCi0JCSAqIHJlbWFuZW50cyBvZiB0aGUgc3Ryb2tlIGFyZSBhbHNvIHJlbW92ZWQuIFRoZSBpbnNlcnRpb24gaXMgY2FycmllZAotCQkgKiBvdXQgYXQgdGhlIGN1cnNvciBwb3NpdGlvbi4KLQkJICogPC9wPgotCQkgKiA8cD4KLQkJICogSWYgb25seSBhIG5hdHVyYWwga2V5IGlzIHNlbGVjdGVkIChhcyBwYXJ0IG9mIGEgbGFyZ2VyIGtleSBzdHJva2UpLAotCQkgKiB0aGVuIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgdXNlciB0byBwcmVzcyBhIG5hdHVyYWwga2V5IHRvIHJlcGxhY2UKLQkJICogdGhlIG9sZCBuYXR1cmFsIGtleS4gSW4gdGhpcyBzaXR1YXRpb24sIHByZXNzaW5nIGFueSBtb2RpZmllciBrZXlzCi0JCSAqIHdpbGwgcmVwbGFjZSB0aGUgd2hvbGUgdGhpbmcuCi0JCSAqIDwvcD4KLQkJICogPHA+Ci0JCSAqIElmIHRoZSBpbnNlcnRpb24gcG9pbnQgaXMgbm90IGF0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLCB0aGVuCi0JCSAqIGluY29tcGxldGUgc3Ryb2tlcyB3aWxsIG5vdCBiZSBpbW1lZGlhdGVseSBpbnNlcnRlZC4gT25seSB3aGVuIHRoZQotCQkgKiBzZXF1ZW5jZSBpcyBjb21wbGV0ZWQgaXMgdGhlIHN0cm9rZSBpbnNlcnRlZC4gVGhpcyBpcyBhIHJlcXVpcmVtZW50Ci0JCSAqIGFzIHRoZSB3aWRnZXQgbXVzdCBhbHdheXMgcmVwcmVzZW50IGEgdmFsaWQga2V5IHNlcXVlbmNlLiBUaGUKLQkJICogaW5zZXJ0aW9uIHBvaW50IGlzIHRyYWNrZWQgdXNpbmcgPGNvZGU+aW5zZXJ0aW9uSW5kZXg8L2NvZGU+LAotCQkgKiB3aGljaCBpcyBhbiBpbmRleCBpbnRvIHRoZSBrZXkgc3Ryb2tlIGFycmF5LgotCQkgKiA8L3A+Ci0JCSAqIAotCQkgKiBAcGFyYW0gZXZlbnQKLQkJICogICAgICAgICAgICBUaGUgdHJpZ2dlcmluZyBrZXkgZG93biBldmVudDsgbXVzdCBub3QgYmUKLQkJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICogQHBhcmFtIGtleVN0cm9rZXMKLQkJICogICAgICAgICAgICBUaGUga2V5IHN0cm9rZXMgaW50byB3aGljaCB0aGUgY3VycmVudCBzdHJva2Ugc2hvdWxkIGJlCi0JCSAqICAgICAgICAgICAgaW5zZXJ0ZWQuIFRoaXMgdmFsdWUgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGFuZAotCQkgKiAgICAgICAgICAgIG11c3QgcmVwcmVzZW50IGEgdmFsaWQga2V5IHNlcXVlbmNlLgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBLZXlTdHJva2VbXSBpbnNlcnRLZXlTdHJva2UoZmluYWwgRXZlbnQgZXZlbnQsCi0JCQkJS2V5U3Ryb2tlW10ga2V5U3Ryb2tlcykgewotCQkJLy8gQ29tcHV0ZSB0aGUga2V5IHN0cm9rZSB0byBpbnNlcnQuCi0JCQlpbnQga2V5ID0gU1dUS2V5U3VwcG9ydC5jb252ZXJ0RXZlbnRUb1VubW9kaWZpZWRBY2NlbGVyYXRvcihldmVudCk7Ci0JCQlLZXlTdHJva2Ugc3Ryb2tlID0gU1dUS2V5U3VwcG9ydC5jb252ZXJ0QWNjZWxlcmF0b3JUb0tleVN0cm9rZShrZXkpOwotCi0JCQkvKgotCQkJICogT25seSBpbnNlcnQgdGhlIHN0cm9rZSBpZiBpdCBpcyAqbm90IFNjcm9sbExvY2suIExldCdzIG5vdCBnZXQKLQkJCSAqIHNpbGx5Ci0JCQkgKi8KLQkJCWlmICgoU1dULk5VTV9MT0NLID09IHN0cm9rZS5nZXROYXR1cmFsS2V5KCkpCi0JCQkJCXx8IChTV1QuQ0FQU19MT0NLID09IHN0cm9rZS5nZXROYXR1cmFsS2V5KCkpCi0JCQkJCXx8IChTV1QuU0NST0xMX0xPQ0sgPT0gc3Ryb2tlLmdldE5hdHVyYWxLZXkoKSkpIHsKLQkJCQlyZXR1cm4ga2V5U3Ryb2tlczsKLQkJCX0KLQotCQkJaWYgKGluc2VydGlvbkluZGV4ICE9IC0xKSB7Ci0JCQkJLy8gVGhlcmUgaXMgYSBwcmV2aW91cyByZXBsYWNlbWVudCBzdGlsbCBnb2luZyBvbi4KLQkJCQlpZiAoc3Ryb2tlLmlzQ29tcGxldGUoKSkgewotCQkJCQlrZXlTdHJva2VzID0gaW5zZXJ0U3Ryb2tlQXQoa2V5U3Ryb2tlcywgc3Ryb2tlLAotCQkJCQkJCWluc2VydGlvbkluZGV4KTsKLQkJCQkJY2xlYXJJbnNlcnRpb25JbmRleCgpOwotCQkJCX0KLQotCQkJfSBlbHNlIGlmIChoYXNTZWxlY3Rpb24oKSkgewotCQkJCS8vIFRoZXJlIGlzIGEgc2VsZWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgcmVwbGFjZWQuCi0JCQkJZmluYWwgS2V5U3Ryb2tlW11bXSBkZWxldGVkS2V5U3Ryb2tlcyA9IG5ldyBLZXlTdHJva2VbMV1bXTsKLQkJCQlpbnNlcnRpb25JbmRleCA9IGRlbGV0ZVNlbGVjdGlvbihrZXlTdHJva2VzLCBzdHJva2UKLQkJCQkJCS5pc0NvbXBsZXRlKCksIGRlbGV0ZWRLZXlTdHJva2VzKTsKLQkJCQlrZXlTdHJva2VzID0gZGVsZXRlZEtleVN0cm9rZXNbMF07Ci0JCQkJaWYgKChzdHJva2UuaXNDb21wbGV0ZSgpKQotCQkJCQkJfHwgKGluc2VydGlvbkluZGV4ID49IGtleVN0cm9rZXMubGVuZ3RoKSkgewotCQkJCQlrZXlTdHJva2VzID0gaW5zZXJ0U3Ryb2tlQXQoa2V5U3Ryb2tlcywgc3Ryb2tlLAotCQkJCQkJCWluc2VydGlvbkluZGV4KTsKLQkJCQkJY2xlYXJJbnNlcnRpb25JbmRleCgpOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQkvLyBObyBzZWxlY3Rpb24sIHNvIHJlbW92ZSB0aGUgaW5jb21wbGV0ZSBzdHJva2UsIGlmIGFueQotCQkJCWlmICgoaGFzSW5jb21wbGV0ZVN0cm9rZSgpKSAmJiAoa2V5U3Ryb2tlcy5sZW5ndGggPiAwKSkgewotCQkJCQlmaW5hbCBLZXlTdHJva2VbXSBuZXdLZXlTdHJva2VzID0gbmV3IEtleVN0cm9rZVtrZXlTdHJva2VzLmxlbmd0aCAtIDFdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGtleVN0cm9rZXMsIDAsIG5ld0tleVN0cm9rZXMsIDAsCi0JCQkJCQkJa2V5U3Ryb2tlcy5sZW5ndGggLSAxKTsKLQkJCQkJa2V5U3Ryb2tlcyA9IG5ld0tleVN0cm9rZXM7Ci0JCQkJfQotCi0JCQkJLy8gQW5kIHRoZW4gYWRkIHRoZSBuZXcgc3Ryb2tlLgotCQkJCWlmICgoa2V5U3Ryb2tlcy5sZW5ndGggPT0gMCkKLQkJCQkJCXx8IChpbnNlcnRpb25JbmRleCA+PSBrZXlTdHJva2VzLmxlbmd0aCkKLQkJCQkJCXx8IChpc0N1cnNvckluTGFzdFBvc2l0aW9uKCkpKSB7Ci0JCQkJCWtleVN0cm9rZXMgPSBpbnNlcnRTdHJva2VBdChrZXlTdHJva2VzLCBzdHJva2UsCi0JCQkJCQkJa2V5U3Ryb2tlcy5sZW5ndGgpOwotCQkJCQljbGVhckluc2VydGlvbkluZGV4KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogSSdtIGp1c3QgZ2V0dGluZyB0aGUgaW5zZXJ0aW9uSW5kZXggaGVyZS4gTm8gYWN0dWFsCi0JCQkJCSAqIGRlbGV0aW9uIHNob3VsZCBvY2N1ci4KLQkJCQkJICovCi0JCQkJCWZpbmFsIEtleVN0cm9rZVtdW10gZGVsZXRlZEtleVN0cm9rZXMgPSBuZXcgS2V5U3Ryb2tlWzFdW107Ci0JCQkJCWluc2VydGlvbkluZGV4ID0gZGVsZXRlU2VsZWN0aW9uKGtleVN0cm9rZXMsIHN0cm9rZQotCQkJCQkJCS5pc0NvbXBsZXRlKCksIGRlbGV0ZWRLZXlTdHJva2VzKTsKLQkJCQkJa2V5U3Ryb2tlcyA9IGRlbGV0ZWRLZXlTdHJva2VzWzBdOwotCQkJCQlpZiAoc3Ryb2tlLmlzQ29tcGxldGUoKSkgewotCQkJCQkJa2V5U3Ryb2tlcyA9IGluc2VydFN0cm9rZUF0KGtleVN0cm9rZXMsIHN0cm9rZSwKLQkJCQkJCQkJaW5zZXJ0aW9uSW5kZXgpOwotCQkJCQkJY2xlYXJJbnNlcnRpb25JbmRleCgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0KLQkJCXJldHVybiBrZXlTdHJva2VzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSB0cmF2ZXJzYWwgbGlzdGVuZXIgdGhhdCBibG9ja3MgYWxsIHRyYXZlcnNhbCBleGNlcHQgZm9yIHRhYnMgYW5kIGFycm93Ci0JICoga2V5cy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRyYXZlcnNhbEZpbHRlciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIEhhbmRsZXMgdGhlIHRyYXZlcnNlIGV2ZW50IG9uIHRoZSB0ZXh0IGZpZWxkIHdyYXBwZWQgYnkgdGhpcyBjbGFzcy4KLQkJICogSXQgc3dhbGxvd3MgYWxsIHRyYXZlcnNlIGV2ZW50cyBleGFtcGxlIGZvciB0YWIgYW5kIGFycm93IGtleQotCQkgKiBuYXZpZ2F0aW9uLiBUaGUgb3RoZXIgZm9ybXMgb2YgbmF2aWdhdGlvbiBjYW4gYmUgcmVhY2hlZCBieSB0YWJiaW5nCi0JCSAqIG9mZiBvZiB0aGUgY29udHJvbC4KLQkJICogCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiAgICAgICAgICAgIFRoZSB0cmlnZ2VyIGV2ZW50OyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotCQkJY2FzZSBTV1QuVFJBVkVSU0VfTU5FTU9OSUM6Ci0JCQljYXNlIFNXVC5UUkFWRVJTRV9OT05FOgotCQkJY2FzZSBTV1QuVFJBVkVSU0VfUEFHRV9ORVhUOgotCQkJY2FzZSBTV1QuVFJBVkVSU0VfUEFHRV9QUkVWSU9VUzoKLQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQlldmVudC50eXBlID0gU1dULk5vbmU7Ci0JCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNXVC5UUkFWRVJTRV9UQUJfTkVYVDoKLQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUzoKLQkJCQkvLyBDaGVjayBpZiBtb2RpZmllcnMgb3RoZXIgdGhhbiBqdXN0ICdTaGlmdCcgd2VyZQotCQkJCS8vIGRvd24uCi0JCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgJiAoU1dULk1PRElGSUVSX01BU0sgXiBTV1QuU0hJRlQpKSAhPSAwKSB7Ci0JCQkJCS8vIE1vZGlmaWVycyBvdGhlciB0aGFuIHNoaWZ0IHdlcmUgZG93bi4KLQkJCQkJZXZlbnQudHlwZSA9IFNXVC5Ob25lOwotCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJLy8gZmFsbCB0aHJvdWdoIC0tIGVpdGhlciBubyBtb2RpZmllcnMsIG9yIGp1c3Qgc2hpZnQuCi0KLQkJCWNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX05FWFQ6Ci0JCQljYXNlIFNXVC5UUkFWRVJTRV9BUlJPV19QUkVWSU9VUzoKLQkJCWRlZmF1bHQ6Ci0JCQkJLy8gTGV0IHRoZSB0cmF2ZXJzYWwgaGFwcGVuLCBidXQgY2xlYXIgdGhlIGluY29tcGxldGUKLQkJCQkvLyBzdHJva2UKLQkJCQlpZiAoaGFzSW5jb21wbGV0ZVN0cm9rZSgpKSB7Ci0JCQkJCWZpbmFsIEtleVN0cm9rZVtdIG9sZEtleVN0cm9rZXMgPSBnZXRLZXlTZXF1ZW5jZSgpCi0JCQkJCQkJLmdldEtleVN0cm9rZXMoKTsKLQkJCQkJZmluYWwgaW50IG5ld0tleVN0cm9rZXNMZW5ndGggPSBvbGRLZXlTdHJva2VzLmxlbmd0aCAtIDE7Ci0JCQkJCWlmIChuZXdLZXlTdHJva2VzTGVuZ3RoID49IDEpIHsKLQkJCQkJCWZpbmFsIEtleVN0cm9rZVtdIG5ld0tleVN0cm9rZXMgPSBuZXcgS2V5U3Ryb2tlW25ld0tleVN0cm9rZXNMZW5ndGhdOwotCQkJCQkJU3lzdGVtLmFycmF5Y29weShvbGRLZXlTdHJva2VzLCAwLCBuZXdLZXlTdHJva2VzLCAwLAotCQkJCQkJCQluZXdLZXlTdHJva2VzTGVuZ3RoKTsKLQkJCQkJCXNldEtleVNlcXVlbmNlKEtleVNlcXVlbmNlLmdldEluc3RhbmNlKG5ld0tleVN0cm9rZXMpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXNldEtleVNlcXVlbmNlKEtleVNlcXVlbmNlLmdldEluc3RhbmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWFuYWdlciByZXNwb3NpYmxlIGZvciBpbnN0YWxsaW5nIGFuZCByZW1vdmluZyB0aGUgdHJhdmVyc2FsIGZpbHRlcgotCSAqIHdoZW4gdGhlIGtleSBzZXF1ZW5jZSBlbnRyeSB3aWRnZXQgZ2FpbnMgYW5kIGxvc2VzIGZvY3VzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVHJhdmVyc2FsRmlsdGVyTWFuYWdlciBpbXBsZW1lbnRzIEZvY3VzTGlzdGVuZXIgewotCQkvKiogVGhlIG1hbmFnZWQgZmlsdGVyLiBXZSBvbmx5IG5lZWQgb25lIGluc3RhbmNlLiAqLwotCQlwcml2YXRlIFRyYXZlcnNhbEZpbHRlciBmaWx0ZXIgPSBuZXcgVHJhdmVyc2FsRmlsdGVyKCk7Ci0KLQkJLyoqCi0JCSAqIEF0dGFjaGVzIHRoZSBnbG9iYWwgdHJhdmVyc2FsIGZpbHRlci4KLQkJICogCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiAgICAgICAgICAgIElnbm9yZWQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGV2ZW50KSB7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hZGRGaWx0ZXIoU1dULlRyYXZlcnNlLCBmaWx0ZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERldGFjaGVzIHRoZSBnbG9iYWwgdHJhdmVyc2FsIGZpbHRlci4KLQkJICogCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiAgICAgICAgICAgIElnbm9yZWQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBldmVudCkgewotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkucmVtb3ZlRmlsdGVyKFNXVC5UcmF2ZXJzZSwgZmlsdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgbW9kaWZpY2F0aW9uIGxpc3RlbmVyIHRoYXQgbWFrZXMgc3VyZSB0aGF0IGV4dGVybmFsIGV2ZW50cyB0byB0aGlzCi0JICogY2xhc3MgKGkuZS4sIGRpcmVjdCBtb2RpZmljYXRpb24gb2YgdGhlIHVuZGVybHlpbmcgdGV4dCkgZG8gbm90IGJyZWFrCi0JICogdGhpcyBjbGFzcycgdmlldyBvZiB0aGUgd29ybGQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBVcGRhdGVTZXF1ZW5jZUxpc3RlbmVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCQkvKioKLQkJICogSGFuZGxlcyB0aGUgbW9kaWZ5IGV2ZW50IG9uIHRoZSB1bmRlcmx5aW5nIHRleHQgd2lkZ2V0LgotCQkgKiAKLQkJICogQHBhcmFtIGV2ZW50Ci0JCSAqICAgICAgICAgICAgVGhlIHRyaWdnZXJpbmcgZXZlbnQ7IGlnbm9yZWQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQl0cnkgewotCQkJCS8vIFRoZSBvcmlnaW5hbCBzZXF1ZW5jZS4KLQkJCQlLZXlTZXF1ZW5jZSBvcmlnaW5hbFNlcXVlbmNlID0gZ2V0S2V5U2VxdWVuY2UoKTsKLQotCQkJCS8vIFRoZSBuZXcgc2VxdWVuY2UgZHJhd24gZnJvbSB0aGUgdGV4dC4KLQkJCQlTdHJpbmcgY29udGVudHMgPSBnZXRUZXh0KCk7Ci0JCQkJS2V5U2VxdWVuY2UgbmV3U2VxdWVuY2UgPSBLZXlTZXF1ZW5jZS5nZXRJbnN0YW5jZShjb250ZW50cyk7Ci0KLQkJCQkvLyBDaGVjayB0byBzZWUgaWYgdGhleSdyZSB0aGUgc2FtZS4KLQkJCQlpZiAoIW9yaWdpbmFsU2VxdWVuY2UuZXF1YWxzKG5ld1NlcXVlbmNlKSkgewotCQkJCQlzZXRLZXlTZXF1ZW5jZShuZXdTZXF1ZW5jZSk7Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gQWJvcnQgYW55IGN1dC9wYXN0ZS1kcml2ZW4gbW9kaWZpY2F0aW9ucwotCQkJCXNldEtleVNlcXVlbmNlKGdldEtleVNlcXVlbmNlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIHsKLQkJVHJlZVNldCB0cmFwcGVkS2V5cyA9IG5ldyBUcmVlU2V0KCk7Ci0JCXRyYXBwZWRLZXlzLmFkZChTV1RLZXlTdXBwb3J0LmNvbnZlcnRBY2NlbGVyYXRvclRvS2V5U3Ryb2tlKFNXVC5UQUIpKTsKLQkJdHJhcHBlZEtleXMuYWRkKFNXVEtleVN1cHBvcnQuY29udmVydEFjY2VsZXJhdG9yVG9LZXlTdHJva2UoU1dULlRBQgotCQkJCXwgU1dULlNISUZUKSk7Ci0JCXRyYXBwZWRLZXlzLmFkZChTV1RLZXlTdXBwb3J0LmNvbnZlcnRBY2NlbGVyYXRvclRvS2V5U3Ryb2tlKFNXVC5CUykpOwotCQlMaXN0IHRyYXBwZWRLZXlMaXN0ID0gbmV3IEFycmF5TGlzdCh0cmFwcGVkS2V5cyk7Ci0JCVRSQVBQRURfS0VZUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodHJhcHBlZEtleUxpc3QpOwotCX0KLQotCS8qKiBBbiBlbXB0eSBzdHJpbmcgaW5zdGFuY2UgZm9yIHVzZSBpbiBjbGVhcmluZyB0ZXh0IHZhbHVlcy4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzcGVjaWFsIGludGVnZXIgdmFsdWUgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdHJva2VzIGluZGljYXRpbmcKLQkgKiB0aGF0IGFuIGluZmluaXRlIG51bWJlciBzaG91bGQgYmUgYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZJTklURSA9IC0xOwotCQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQga2V5IHNlcXVlbmNlIGluIHRoaXMKLQkgKiBrZXkgc2VxdWVuY2Ugd2lkZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfS0VZX1NFUVVFTkNFID0gIm9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2VUZXh0LktleVNlcXVlbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGtleXMgdHJhcHBlZCBieSB0aGlzIHdpZGdldC4gVGhpcyBsaXN0IGlzIGd1YXJhbnRlZWQgdG8gYmUgcm91Z2hseQotCSAqIGFjY3VyYXRlLiBQZXJmZWN0aW9uIGlzIG5vdCBwb3NzaWJsZSwgYXMgU1dUIGRvZXMgbm90IGV4cG9ydCB0cmF2ZXJzYWwKLQkgKiBrZXlzIGFzIGNvbnN0YW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVFJBUFBFRF9LRVlTOwotCi0JLyoqCi0JICogVGhlIGtleSBmaWx0ZXIgYXR0YWNoZWQgdG8gdGhlIHVuZGVybHlpbmcgd2lkZ2V0IHRoYXQgdHJhcHMga2V5IGV2ZW50cy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEtleVRyYXBMaXN0ZW5lciBrZXlGaWx0ZXIgPSBuZXcgS2V5VHJhcExpc3RlbmVyKCk7Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBvZiB0aGUga2V5IHNlcXVlbmNlIC0tIGNvbnRhaW5pbmcgb25seSB0aGUgY29tcGxldGUga2V5IHN0cm9rZXMuCi0JICovCi0JcHJpdmF0ZSBLZXlTZXF1ZW5jZSBrZXlTZXF1ZW5jZSA9IEtleVNlcXVlbmNlLmdldEluc3RhbmNlKCk7Ci0JCi0JLyoqCi0JICogVGhvc2UgbGlzdGVuaW5nIHRvIGNoYW5nZXMgdG8gdGhlIGtleSBzZXF1ZW5jZSBpbiB0aGlzIHdpZGdldC4gVGhpcyB2YWx1ZQotCSAqIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBsaXN0ZW5lcnMgPSBudWxsOwotCi0JLyoqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBrZXkgc3Ryb2tlcyBwZXJtaXR0ZWQgaW4gdGhlIHNlcXVlbmNlLiAqLwotCXByaXZhdGUgaW50IG1heFN0cm9rZXMgPSBJTkZJTklURTsKLQotCS8qKiBUaGUgdGV4dCB3aWRnZXQgdGhhdCBpcyB3cmFwcGVkIGZvciB0aGlzIGNsYXNzLiAqLwotCXByaXZhdGUgZmluYWwgVGV4dCB0ZXh0OwotCi0JLyoqCi0JICogVGhlIGxpc3RlbmVyIHRoYXQgbWFrZXMgc3VyZSB0aGF0IHRoZSB0ZXh0IHdpZGdldCByZW1haW5zIHVwLXRvLWRhdGUgd2l0aAotCSAqIHJlZ2FyZHMgdG8gZXh0ZXJuYWwgbW9kaWZpY2F0aW9uIG9mIHRoZSB0ZXh0IChlLmcuLCBjdXQgJiBwYXN0aW5nKS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFVwZGF0ZVNlcXVlbmNlTGlzdGVuZXIgdXBkYXRlU2VxdWVuY2VMaXN0ZW5lciA9IG5ldyBVcGRhdGVTZXF1ZW5jZUxpc3RlbmVyKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIDxjb2RlPktleVNlcXVlbmNlVGV4dEZpZWxkPC9jb2RlPiB3aXRoIHRoZQotCSAqIHRleHQgZmllbGQgdG8gdXNlLiBJZiB0aGUgcGxhdGZvcm0gaXMgY2FyYm9uIChNYWNPUyBYKSwgdGhlbiB0aGUgZm9udCBpcwotCSAqIHNldCB0byBiZSB0aGUgc2FtZSBmb250IHVzZWQgdG8gZGlzcGxheSBhY2NlbGVyYXRvcnMgaW4gdGhlIG1lbnVzLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVkVGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgd2lkZ2V0IHRvIHdyYXA7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBLZXlTZXF1ZW5jZVRleHQoVGV4dCB3cmFwcGVkVGV4dCkgewotCQl0ZXh0ID0gd3JhcHBlZFRleHQ7Ci0KLQkJLy8gU2V0IHRoZSBmb250IGlmIHRoZSBwbGF0Zm9ybSBpcyBjYXJib24uCi0JCWlmICgiY2FyYm9uIi5lcXVhbHMoU1dULmdldFBsYXRmb3JtKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIERvbid0IHdvcnJ5IGFib3V0IHRoaXMgZm9udCBuYW1lIGhlcmU7IGl0IGlzIHRoZSBvZmZpY2lhbCBtZW51Ci0JCQkvLyBmb250IGFuZCBwb2ludCBzaXplIG9uIHRoZSBNYWMuCi0JCQlmaW5hbCBGb250IGZvbnQgPSBuZXcgRm9udCh0ZXh0LmdldERpc3BsYXkoKSwKLQkJCQkJIkx1Y2lkYSBHcmFuZGUiLCAxMywgU1dULk5PUk1BTCk7IC8vJE5PTi1OTFMtMSQKLQkJCXRleHQuc2V0Rm9udChmb250KTsKLQkJCXRleHQuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQkJZm9udC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQkvLyBBZGQgdGhlIGtleSBsaXN0ZW5lci4KLQkJdGV4dC5hZGRMaXN0ZW5lcihTV1QuS2V5VXAsIGtleUZpbHRlcik7Ci0JCXRleHQuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGtleUZpbHRlcik7Ci0KLQkJLy8gQWRkIHRoZSBmb2N1cyBsaXN0ZW5lciB0aGF0IGF0dGFjaGVzIHRoZSBnbG9iYWwgdHJhdmVyc2FsIGZpbHRlci4KLQkJdGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBUcmF2ZXJzYWxGaWx0ZXJNYW5hZ2VyKCkpOwotCi0JCS8vIEFkZCBhbiBpbnRlcm5hbCBtb2RpZnkgbGlzdGVuZXIuCi0JCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodXBkYXRlU2VxdWVuY2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIGtleSBzZXF1ZW5jZSB3aWRnZXQuIEl0IHdpbGwgYmUKLQkgKiBub3RpZmllZCB3aGVuIHRoZSBrZXkgc2VxdWVuY2UgY2hhbmdlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB0byBiZSBub3RpZmllZCB3aGVuIGNoYW5nZXMgb2NjdXI7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJZmluYWwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJfQotCi0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgdGV4dCBmaWVsZCBhbmQgcmVzZXRzIGFsbCB0aGUgaW50ZXJuYWwgdmFsdWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlmaW5hbCBLZXlTZXF1ZW5jZSBvbGRLZXlTZXF1ZW5jZSA9IGtleVNlcXVlbmNlOwotCQlrZXlTZXF1ZW5jZSA9IEtleVNlcXVlbmNlLmdldEluc3RhbmNlKCk7Ci0JCXRleHQuc2V0VGV4dChFTVBUWV9TVFJJTkcpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChvbGRLZXlTZXF1ZW5jZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUga2V5IHN0cm9rZXMgZnJvbSB0aGUgbGlzdCBjb3JyZXNwb25kaW5nIHRoZSBzZWxlY3Rpb24uIElmCi0JICogPGNvZGU+YWxsb3dJbmNvbXBsZXRlPC9jb2RlPiwgdGhlbiBpbnZhbGlkIGtleSBzZXF1ZW5jZXMgd2lsbCBiZQotCSAqIGFsbG93ZWQgKGkuZS4sIHRob3NlIHdpdGggaW5jb21wbGV0ZSBzdHJva2VzIGluIHRoZSBub24tdGVybWluYWwKLQkgKiBwb3NpdGlvbikuIE90aGVyd2lzZSwgaW5jb21wbGV0ZSBzdHJva2VzIHdpbGwgYmUgcmVtb3ZlZC4gVGhpcyBtb2RpZmllcwotCSAqIDxjb2RlPmtleVN0cm9rZXM8L2NvZGU+IGluIHBsYWNlLCBhbmQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgdGV4dCB3aWRnZXQKLQkgKiB0aGlzIGNsYXNzIHdyYXBzLgotCSAqIAotCSAqIEBwYXJhbSBrZXlTdHJva2VzCi0JICogICAgICAgICAgICBUaGUgbGlzdCBvZiBrZXkgc3Ryb2tlcyBmcm9tIHdoaWNoIHRoZSBzZWxlY3Rpb24gc2hvdWxkIGJlCi0JICogICAgICAgICAgICByZW1vdmVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gYWxsb3dJbmNvbXBsZXRlCi0JICogICAgICAgICAgICBXaGV0aGVyIGluY29tcGxldGUgc3Ryb2tlcyBzaG91bGQgYmUgYWxsb3dlZCB0byBleGlzdCBpbiB0aGUKLQkgKiAgICAgICAgICAgIGxpc3QgYWZ0ZXIgdGhlIGRlbGV0aW9uLgotCSAqIEByZXR1cm4gVGhlIGluZGV4IGF0IHdoaWNoIGEgc3Vic2VxdWVudCBpbnNlcnQgc2hvdWxkIG9jY3VyLiBUaGlzIGluZGV4Ci0JICogICAgICAgICBvbmx5IGhhcyBtZWFuaW5nIHRvIHRoZSA8Y29kZT5pbnNlcnRTdHJva2VBdDwvY29kZT4gbWV0aG9kLgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IGRlbGV0ZVNlbGVjdGlvbihmaW5hbCBLZXlTdHJva2VbXSBrZXlTdHJva2VzLAotCQkJZmluYWwgYm9vbGVhbiBhbGxvd0luY29tcGxldGUsIGZpbmFsIEtleVN0cm9rZVtdW10gZGVsZXRlZEtleVN0cm9rZXMpIHsKLQkJLy8gR2V0IHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkJUG9pbnQgc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJaW50IHN0YXJ0ID0gc2VsZWN0aW9uLng7Ci0JCWludCBlbmQgPSBzZWxlY3Rpb24ueTsKLQotCQkvKgotCQkgKiBVc2luZyB0aGUga2V5IHNlcXVlbmNlIGZvcm1hdCBtZXRob2QsIGRpc2NvdmVyIHRoZSBwb2ludCBhdCB3aGljaAotCQkgKiBhZGRpbmcga2V5IHN0cm9rZXMgcGFzc2VzIG9yIGVxdWFscyB0aGUgc3RhcnQgb2YgdGhlIHNlbGVjdGlvbi4gSW4KLQkJICogb3RoZXIgd29yZHMsIGZpbmQgdGhlIGZpcnN0IHN0cm9rZSB0aGF0IGlzIHBhcnQgb2YgdGhlIHNlbGVjdGlvbi4KLQkJICogS2VlcCB0cmFjayBvZiB0aGUgdGV4dCByYW5nZSB1bmRlciB3aGljaCB0aGUgc3Ryb2tlIGFwcGVhcnMgKGkuZS4sCi0JCSAqIHN0YXJ0VGV4dEluZGV4LT5zdHJpbmcubGVuZ3RoKCkgaXMgdGhlIGZpcnN0IHNlbGVjdGVkIHN0cm9rZSkuCi0JCSAqLwotCQlTdHJpbmcgc3RyaW5nID0gbmV3IFN0cmluZygpOwotCQlMaXN0IGN1cnJlbnRTdHJva2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgc3RhcnRUZXh0SW5kZXggPSAwOyAvLyBrZWVwcyB0cmFjayBvZiB0aGUgc3RhcnQgb2YgdGhlIHN0cm9rZQotCQlmaW5hbCBpbnQga2V5U3Ryb2tlc0xlbmd0aCA9IGtleVN0cm9rZXMubGVuZ3RoOwotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgKGkgPCBrZXlTdHJva2VzTGVuZ3RoKSAmJiAoc3RyaW5nLmxlbmd0aCgpIDwgc3RhcnQpOyBpKyspIHsKLQkJCXN0YXJ0VGV4dEluZGV4ID0gc3RyaW5nLmxlbmd0aCgpOwotCQkJY3VycmVudFN0cm9rZXMuYWRkKGtleVN0cm9rZXNbaV0pOwotCQkJc3RyaW5nID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2UoY3VycmVudFN0cm9rZXMpLmZvcm1hdCgpOwotCQl9Ci0KLQkJLyoKLQkJICogSWYgc3RyaW5nLmxlbmd0aCgpID09IHN0YXJ0LCB0aGVuIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBiZXR3ZWVuCi0JCSAqIHN0cm9rZXMgKGkuZS4sIHNlbGVjdGlvbiBpcyBvdXRzaWRlIG9mIGEgc3Ryb2tlKS4KLQkJICovCi0JCWludCBzdGFydFN0cm9rZUluZGV4OwotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IHN0YXJ0KSB7Ci0JCQlzdGFydFN0cm9rZUluZGV4ID0gY3VycmVudFN0cm9rZXMuc2l6ZSgpOwotCQl9IGVsc2UgewotCQkJc3RhcnRTdHJva2VJbmRleCA9IGN1cnJlbnRTdHJva2VzLnNpemUoKSAtIDE7Ci0JCX0KLQotCQkvKgotCQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIGN1cnNvciBpcyBvbmx5IHBvc2l0aW9uZWQsIHJhdGhlciB0aGFuIGFjdHVhbGx5Ci0JCSAqIHNlbGVjdGluZyBzb21ldGhpbmcuIFdlIG9ubHkgbmVlZCB0byBjb21wdXRlIHRoZSBlbmQgaWYgdGhlcmUgaXMgYQotCQkgKiBzZWxlY3Rpb24uCi0JCSAqLwotCQlpbnQgZW5kU3Ryb2tlSW5kZXg7Ci0JCWlmIChzdGFydCA9PSBlbmQpIHsKLQkJCXJldHVybiBzdGFydFN0cm9rZUluZGV4OwotCQl9Ci0KLQkJZm9yICg7IChpIDwga2V5U3Ryb2tlc0xlbmd0aCkgJiYgKHN0cmluZy5sZW5ndGgoKSA8IGVuZCk7IGkrKykgewotCQkJY3VycmVudFN0cm9rZXMuYWRkKGtleVN0cm9rZXNbaV0pOwotCQkJc3RyaW5nID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2UoY3VycmVudFN0cm9rZXMpLmZvcm1hdCgpOwotCQl9Ci0JCWVuZFN0cm9rZUluZGV4ID0gY3VycmVudFN0cm9rZXMuc2l6ZSgpIC0gMTsKLQkJaWYgKGVuZFN0cm9rZUluZGV4IDwgMCkgewotCQkJZW5kU3Ryb2tlSW5kZXggPSAwOwotCQl9Ci0KLQkJLyoKLQkJICogUmVtb3ZlIHRoZSBzdHJva2VzIHRoYXQgYXJlIHRvdWNoZWQgYnkgdGhlIHNlbGVjdGlvbi4gS2VlcCB0cmFjayBvZgotCQkgKiB0aGUgZmlyc3Qgc3Ryb2tlIHJlbW92ZWQuCi0JCSAqLwotCQlmaW5hbCBpbnQgbmV3TGVuZ3RoID0gZW5kU3Ryb2tlSW5kZXggLSBzdGFydFN0cm9rZUluZGV4ICsgMTsKLQkJZGVsZXRlZEtleVN0cm9rZXNbMF0gPSBuZXcgS2V5U3Ryb2tlW25ld0xlbmd0aF07Ci0JCWZpbmFsIEtleVN0cm9rZSBzdGFydFN0cm9rZSA9IGtleVN0cm9rZXNbc3RhcnRTdHJva2VJbmRleF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoa2V5U3Ryb2tlcywgMCwga2V5U3Ryb2tlcywgMCwgbmV3TGVuZ3RoKTsKLQotCQkvKgotCQkgKiBBbGxvdyB0aGUgZmlyc3Qgc3Ryb2tlIHJlbW92ZWQgdG8gYmUgcmVwbGFjZWQgYnkgYW4gaW5jb21wbGV0ZQotCQkgKiBzdHJva2UuCi0JCSAqLwotCQlpZiAoYWxsb3dJbmNvbXBsZXRlKSB7Ci0JCQlmaW5hbCBpbnQgbW9kaWZpZXJLZXlzID0gc3RhcnRTdHJva2UuZ2V0TW9kaWZpZXJLZXlzKCk7Ci0JCQlLZXlTdHJva2UgaW5jb21wbGV0ZVN0cm9rZSA9IEtleVN0cm9rZS5nZXRJbnN0YW5jZShtb2RpZmllcktleXMsCi0JCQkJCUtleVN0cm9rZS5OT19LRVkpOwotCQkJaW50IGluY29tcGxldGVTdHJva2VMZW5ndGggPSBpbmNvbXBsZXRlU3Ryb2tlLmZvcm1hdCgpLmxlbmd0aCgpOwotCQkJaWYgKChzdGFydFRleHRJbmRleCArIGluY29tcGxldGVTdHJva2VMZW5ndGgpIDw9IHN0YXJ0KSB7Ci0JCQkJZmluYWwgS2V5U3Ryb2tlW10gYWRkZWQgPSBuZXcgS2V5U3Ryb2tlW25ld0xlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZGVsZXRlZEtleVN0cm9rZXNbMF0sIDAsIGFkZGVkLCAwLAotCQkJCQkJc3RhcnRTdHJva2VJbmRleCk7Ci0JCQkJYWRkZWRbc3RhcnRTdHJva2VJbmRleF0gPSBpbmNvbXBsZXRlU3Ryb2tlOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZGVsZXRlZEtleVN0cm9rZXNbMF0sIHN0YXJ0U3Ryb2tlSW5kZXgsIGFkZGVkLAotCQkJCQkJc3RhcnRTdHJva2VJbmRleCArIDEsIG5ld0xlbmd0aCk7Ci0JCQkJZGVsZXRlZEtleVN0cm9rZXNbMF0gPSBhZGRlZDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdGFydFN0cm9rZUluZGV4OwotCX0KLQkKLQkvKioKLQkgKiBGaXJlcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudCB0byBhbGwgb2YgdGhlIGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkS2V5U2VxdWVuY2UKLQkgKiAgICAgICAgICAgIFRoZSBvbGQga2V5IHNlcXVlbmNlOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudCgKLQkJCWZpbmFsIEtleVNlcXVlbmNlIG9sZEtleVNlcXVlbmNlKSB7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZmluYWwgSXRlcmF0b3IgbGlzdGVuZXJJdHIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJCWZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLAotCQkJCQlQX0tFWV9TRVFVRU5DRSwgb2xkS2V5U2VxdWVuY2UsIGdldEtleVNlcXVlbmNlKCkpOwotCQkJd2hpbGUgKGxpc3RlbmVySXRyLmhhc05leHQoKSkgewotCQkJCWZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lckl0cgotCQkJCQkJLm5leHQoKTsKLQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbiBhY2Nlc3NvciBmb3IgdGhlIDxjb2RlPktleVNlcXVlbmNlPC9jb2RlPiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQotCSAqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRleHQgZmllbGQuIFRoaXMgaW5jbHVkZXMgaW5jb21wbGV0ZSBzdHJva2VzLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGtleSBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEtleVNlcXVlbmNlIGdldEtleVNlcXVlbmNlKCkgewotCQlyZXR1cm4ga2V5U2VxdWVuY2U7Ci0JfQotCi0JLyoqCi0JICogQW4gYWNjZXNzb3IgZm9yIHRoZSB1bmRlcmx5aW5nIHRleHQgd2lkZ2V0J3MgY29udGVudHMuCi0JICogCi0JICogQHJldHVybiBUaGUgdGV4dCBjb250ZW50cyBvZiB0aGlzIGVudHJ5OyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgY3VycmVudCBrZXkgc2VxdWVuY2UgaGFzIGEgc3Ryb2tlIHdpdGggbm8gbmF0dXJhbCBrZXkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpcyB0aGVyZSBpcyBhbiBpbmNvbXBsZXRlIHN0cm9rZTsKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc0luY29tcGxldGVTdHJva2UoKSB7Ci0JCXJldHVybiAha2V5U2VxdWVuY2UuaXNDb21wbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdGV4dCB3aWRnZXQgaGFzIHNvbWUgdGV4dCBzZWxlY3Rpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgaXQKLQkgKiAgICAgICAgIGdyZWF0ZXIgdGhhbiB6ZXJvOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAodGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyB0aGUga2V5IHN0cm9rZSBhdCB0aGUgY3VycmVudCBpbnNlcnRpb24gcG9pbnQuIFRoaXMgZG9lcyBhCi0JICogcmVndWxhciBkZWxldGUgYW5kIGluc2VydCwgYXMgaWYgdGhlIGtleSBoYWQgYmVlbiBwcmVzc2VkLgotCSAqIAotCSAqIEBwYXJhbSBzdHJva2UKLQkgKiAgICAgICAgICAgIFRoZSBrZXkgc3Ryb2tlIHRvIGluc2VydDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0KEtleVN0cm9rZSBzdHJva2UpIHsKLQkJaWYgKCFzdHJva2UuaXNDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDb3B5IHRoZSBrZXkgc3Ryb2tlcyBpbiB0aGUgY3VycmVudCBrZXkgc2VxdWVuY2UuCi0JCWZpbmFsIEtleVNlcXVlbmNlIGtleVNlcXVlbmNlID0gZ2V0S2V5U2VxdWVuY2UoKTsKLQkJZmluYWwgS2V5U3Ryb2tlW10gb2xkS2V5U3Ryb2tlcyA9IGtleVNlcXVlbmNlLmdldEtleVN0cm9rZXMoKTsKLQkJZmluYWwgS2V5U3Ryb2tlW10gbmV3S2V5U3Ryb2tlczsKLQkJaWYgKChoYXNJbmNvbXBsZXRlU3Ryb2tlKCkpICYmICgha2V5U2VxdWVuY2UuaXNFbXB0eSgpKSkgewotCQkJZmluYWwgaW50IG5ld0tleVN0cm9rZXNMZW5ndGggPSBvbGRLZXlTdHJva2VzLmxlbmd0aCAtIDE7Ci0JCQluZXdLZXlTdHJva2VzID0gbmV3IEtleVN0cm9rZVtuZXdLZXlTdHJva2VzTGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkS2V5U3Ryb2tlcywgMCwgbmV3S2V5U3Ryb2tlcywgMCwKLQkJCQkJbmV3S2V5U3Ryb2tlc0xlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQluZXdLZXlTdHJva2VzID0gb2xkS2V5U3Ryb2tlczsKLQkJfQotCi0JCUtleVN0cm9rZVtdW10gZGVsZXRlZEtleVN0cm9rZXMgPSBuZXcgS2V5U3Ryb2tlWzFdW107Ci0JCWludCBpbmRleCA9IGRlbGV0ZVNlbGVjdGlvbihuZXdLZXlTdHJva2VzLCBmYWxzZSwKLQkJCQlkZWxldGVkS2V5U3Ryb2tlcyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJaW5kZXggPSAwOwotCQl9Ci0JCWZpbmFsIEtleVN0cm9rZVtdIHN0cm9rZXMgPSAoZGVsZXRlZEtleVN0cm9rZXNbMF0gPT0gbnVsbCkgPyBuZXcgS2V5U3Ryb2tlWzBdCi0JCQkJOiBkZWxldGVkS2V5U3Ryb2tlc1swXTsKLQkJZmluYWwgS2V5U3Ryb2tlW10ga2V5U3Ryb2tlcyA9IGluc2VydFN0cm9rZUF0KHN0cm9rZXMsIHN0cm9rZSwgaW5kZXgpOwotCQlrZXlGaWx0ZXIuY2xlYXJJbnNlcnRpb25JbmRleCgpOwotCQlzZXRLZXlTZXF1ZW5jZShLZXlTZXF1ZW5jZS5nZXRJbnN0YW5jZShrZXlTdHJva2VzKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyB0aGUgc3Ryb2tlIGF0IHRoZSBnaXZlbiBpbmRleCBpbiB0aGUgbGlzdCBvZiBzdHJva2VzLiBJZiB0aGUKLQkgKiBzdHJva2UgY3VycmVudGx5IGF0IHRoYXQgaW5kZXggaXMgaW5jb21wbGV0ZSwgdGhlbiBpdCB0cmllcyB0byBtZXJnZSB0aGUKLQkgKiB0d28gc3Ryb2tlcy4gSWYgbWVyZ2luZyBpcyBhIGNvbXBsZXRlIGZhaWx1cmUgKHVubGlrZWx5KSwgdGhlbiBpdCB3aWxsCi0JICogc2ltcGx5IG92ZXJ3cml0ZSB0aGUgaW5jb21wbGV0ZSBzdHJva2UuIElmIHRoZSBzdHJva2UgYXQgdGhlIGluZGV4IGlzCi0JICogY29tcGxldGUsIHRoZW4gaXQgc2ltcGx5IGluc2VydHMgdGhlIHN0cm9rZSBpbmRlcGVuZGVudGx5LgotCSAqIAotCSAqIEBwYXJhbSBrZXlTdHJva2VzCi0JICogICAgICAgICAgICBUaGUgbGlzdCBvZiBrZXkgc3Ryb2tlcyBpbiB3aGljaCB0aGUga2V5IHN0cm9rZSBzaG91bGQgYmUKLQkgKiAgICAgICAgICAgIGFwcGVuZGVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gc3Ryb2tlCi0JICogICAgICAgICAgICBUaGUgc3Ryb2tlIHRvIGluc2VydDsgc2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIFRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQ7IG11c3QgYmUgYSB2YWxpZCBpbmRleCBpbnRvIHRoZQotCSAqICAgICAgICAgICAgbGlzdCBvZiBrZXkgc3Ryb2tlcy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEtleVN0cm9rZVtdIGluc2VydFN0cm9rZUF0KGZpbmFsIEtleVN0cm9rZVtdIGtleVN0cm9rZXMsCi0JCQlLZXlTdHJva2Ugc3Ryb2tlLCBpbnQgaW5kZXgpIHsKLQkJZmluYWwgaW50IGtleVN0cm9rZXNMZW5ndGggPSBrZXlTdHJva2VzLmxlbmd0aDsKLQkJZmluYWwgS2V5U3Ryb2tlIGN1cnJlbnRTdHJva2UgPSAoaW5kZXggPj0ga2V5U3Ryb2tlc0xlbmd0aCkgPyBudWxsCi0JCQkJOiBrZXlTdHJva2VzW2luZGV4XTsKLQkJaWYgKChjdXJyZW50U3Ryb2tlICE9IG51bGwpICYmICghY3VycmVudFN0cm9rZS5pc0NvbXBsZXRlKCkpKSB7Ci0JCQlpbnQgbW9kaWZpZXJLZXlzID0gY3VycmVudFN0cm9rZS5nZXRNb2RpZmllcktleXMoKTsKLQkJCWZpbmFsIGludCBuYXR1cmFsS2V5ID0gc3Ryb2tlLmdldE5hdHVyYWxLZXkoKTsKLQkJCW1vZGlmaWVyS2V5cyB8PSBzdHJva2UuZ2V0TW9kaWZpZXJLZXlzKCk7Ci0JCQlrZXlTdHJva2VzW2luZGV4XSA9IEtleVN0cm9rZS5nZXRJbnN0YW5jZShtb2RpZmllcktleXMsIG5hdHVyYWxLZXkpOwotCQkJcmV0dXJuIGtleVN0cm9rZXM7Ci0JCX0KLQotCQlmaW5hbCBLZXlTdHJva2VbXSBuZXdLZXlTdHJva2VzID0gbmV3IEtleVN0cm9rZVtrZXlTdHJva2VzTGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoa2V5U3Ryb2tlcywgMCwgbmV3S2V5U3Ryb2tlcywgMCwgaW5kZXgpOwotCQluZXdLZXlTdHJva2VzW2luZGV4XSA9IHN0cm9rZTsKLQkJaWYgKGluZGV4IDwga2V5U3Ryb2tlc0xlbmd0aCkgewotCQkJU3lzdGVtLmFycmF5Y29weShrZXlTdHJva2VzLCBpbmRleCwgbmV3S2V5U3Ryb2tlcywgaW5kZXggKyAxLAotCQkJCQlrZXlTdHJva2VzTGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gbmV3S2V5U3Ryb2tlczsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHRoZSBjdXJzb3IgaXMgaW4gdGhlIGxhc3QgcG9zaXRpb24uIFRoaXMgbWVhbnMgdGhhdCB0aGUKLQkgKiBzZWxlY3Rpb24gZXh0ZW5kcyB0byB0aGUgbGFzdCBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWxlY3Rpb24gZXh0ZW5kcyB0byB0aGUgbGFzdAotCSAqICAgICAgICAgcG9zaXRpb247IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3Vyc29ySW5MYXN0UG9zaXRpb24oKSB7Ci0JCXJldHVybiAodGV4dC5nZXRTZWxlY3Rpb24oKS55ID49IGdldFRleHQoKS5sZW5ndGgoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhpcyBrZXkgc2VxdWVuY2Ugd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgVGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlmaW5hbCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoKGxpc3RlbmVyID09IG51bGwpIHx8IChsaXN0ZW5lcnMgPT0gbnVsbCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgbXV0YXRvciBmb3IgdGhlIGtleSBzZXF1ZW5jZSBzdG9yZWQgd2l0aGluIHRoaXMgd2lkZ2V0LiBUaGUgdGV4dCBhbmQKLQkgKiBjYXJldCBwb3NpdGlvbiBhcmUgdXBkYXRlZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQWxsIHNlcXVlbmNlcyBhcmUgbGltaXRlZCB0byBtYXhTdHJva2VzIG51bWJlciBvZiBzdHJva2VzIGluIGxlbmd0aC4gSWYKLQkgKiB0aGVyZSBhcmUgYWxyZWFkeSB0aGF0IG51bWJlciBvZiBzdHJva2VzLCB0aGVuIGl0IGRvZXMgbm90IHNob3cKLQkgKiBpbmNvbXBsZXRlIHN0cm9rZXMsIGFuZCBkb2VzIG5vdCBrZWVwIHRyYWNrIG9mIHRoZW0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdLZXlTZXF1ZW5jZQotCSAqICAgICAgICAgICAgVGhlIG5ldyBrZXkgc2VxdWVuY2UgZm9yIHRoaXMgd2lkZ2V0OyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIGlmIG5vbmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5U2VxdWVuY2UoS2V5U2VxdWVuY2UgbmV3S2V5U2VxdWVuY2UpIHsKLQkJZmluYWwgS2V5U2VxdWVuY2Ugb2xkS2V5U2VxdWVuY2UgPSBrZXlTZXF1ZW5jZTsKLQkJa2V5U2VxdWVuY2UgPSBuZXdLZXlTZXF1ZW5jZTsKLQotCQkvLyBUcmltIGFueSBleHRyYSBzdHJva2VzLgotCQlpZiAobWF4U3Ryb2tlcyAhPSBJTkZJTklURSkgewotCQkJZmluYWwgS2V5U3Ryb2tlW10gb2xkS2V5U3Ryb2tlcyA9IGtleVNlcXVlbmNlLmdldEtleVN0cm9rZXMoKTsKLQkJCWlmIChtYXhTdHJva2VzIDwgb2xkS2V5U3Ryb2tlcy5sZW5ndGgpIHsKLQkJCQlmaW5hbCBLZXlTdHJva2VbXSBuZXdLZXlTdHJva2VzID0gbmV3IEtleVN0cm9rZVttYXhTdHJva2VzXTsKLQkJCQlTeXN0ZW0KLQkJCQkJCS5hcnJheWNvcHkob2xkS2V5U3Ryb2tlcywgMCwgbmV3S2V5U3Ryb2tlcywgMCwKLQkJCQkJCQkJbWF4U3Ryb2tlcyk7Ci0JCQkJa2V5U2VxdWVuY2UgPSBLZXlTZXF1ZW5jZS5nZXRJbnN0YW5jZShuZXdLZXlTdHJva2VzKTsKLQkJCX0KLQkJfQotCi0JCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdGV4dCBoYXMgY2hhbmdlZC4KLQkJU3RyaW5nIGN1cnJlbnRTdHJpbmcgPSBnZXRUZXh0KCk7Ci0JCVN0cmluZyBuZXdTdHJpbmcgPSBrZXlTZXF1ZW5jZS5mb3JtYXQoKTsKLQkJaWYgKCFjdXJyZW50U3RyaW5nLmVxdWFscyhuZXdTdHJpbmcpKSB7Ci0JCQkvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdGV4dAotCQkJdGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcih1cGRhdGVTZXF1ZW5jZUxpc3RlbmVyKTsKLQkJCXRleHQuc2V0VGV4dChrZXlTZXF1ZW5jZS5mb3JtYXQoKSk7Ci0JCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHVwZGF0ZVNlcXVlbmNlTGlzdGVuZXIpOwotCQkJdGV4dC5zZXRTZWxlY3Rpb24oZ2V0VGV4dCgpLmxlbmd0aCgpKTsKLQkJfQotCQkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQob2xkS2V5U2VxdWVuY2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0cm9rZXMgdGhhdCBhcmUgcGVybWl0dGVkIGluIHRoaXMgd2lkZ2V0Ci0JICogYXQgb25lIHRpbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3Ryb2tlczsgd2lsbCBiZSBhIHBvc2l0aXZlIGludGVnZXIgb3IKLQkgKiAgICAgICAgIDxjb2RlPklORklOSVRFPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEtleVN0cm9rZUxpbWl0KCkgewotCQlyZXR1cm4gbWF4U3Ryb2tlczsKLQl9Ci0KLQkvKioKLQkgKiBBIG11dGF0b3IgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdHJva2VzIHRoYXQgYXJlIHBlcm1pdHRlZCBpbiB0aGlzCi0JICogd2lkZ2V0IGF0IG9uZSB0aW1lLgotCSAqIAotCSAqIEBwYXJhbSBrZXlTdHJva2VMaW1pdAotCSAqICAgICAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0cm9rZXM7IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yCi0JICogICAgICAgICAgICA8Y29kZT5JTkZJTklURTwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5U3Ryb2tlTGltaXQoaW50IGtleVN0cm9rZUxpbWl0KSB7Ci0JCWlmIChrZXlTdHJva2VMaW1pdCA+IDAgfHwga2V5U3Ryb2tlTGltaXQgPT0gSU5GSU5JVEUpCi0JCQl0aGlzLm1heFN0cm9rZXMgPSBrZXlTdHJva2VMaW1pdDsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0JCS8vIE1ha2Ugc3VyZSB3ZSBhcmUgb2JleWluZyB0aGUgbmV3IGxpbWl0LgotCQlzZXRLZXlTZXF1ZW5jZShnZXRLZXlTZXF1ZW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL0tleVN0cm9rZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9LZXlTdHJva2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiZjZkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL0tleVN0cm9rZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuVHJpZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLmZvcm1hdHRpbmcuS2V5Rm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlV0aWw7Ci0KLS8qKgotICogPHA+Ci0gKiBBIDxjb2RlPktleVN0cm9rZTwvY29kZT4gaXMgZGVmaW5lZCBhcyBhbiBvcHRpb25hbCBzZXQgb2YgbW9kaWZpZXIga2V5cwotICogZm9sbG93ZWQgb3B0aW9uYWxseSBieSBhIG5hdHVyYWwga2V5LiBBIDxjb2RlPktleVN0cm9rZTwvY29kZT4gaXMgc2FpZCB0bwotICogYmUgY29tcGxldGUgaWYgaXQgY29udGFpbnMgYSBuYXR1cmFsIGtleS4gQSBuYXR1cmFsIGtleSBpcyBhbnkgVW5pY29kZQotICogY2hhcmFjdGVyIChlLmcuLCAiYmFja3NwYWNlIiwgZXRjLiksIGFueSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIGEgbmF0dXJhbAotICogbGFuZ3VhZ2UgKGUuZy4sICJBIiwgIjEiLCAiWyIsIGV0Yy4pLCBvciBhbnkgc3BlY2lhbCBjb250cm9sIGNoYXJhY3RlcgotICogc3BlY2lmaWMgdG8gY29tcHV0ZXJzIChlLmcuLCAiRjEwIiwgIlBhZ2VVcCIsIGV0Yy4pLgotICogPC9wPgotICogPHA+Ci0gKiBBbGwgPGNvZGU+S2V5U3Ryb2tlPC9jb2RlPiBvYmplY3RzIGhhdmUgYSBmb3JtYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0gKiBhdmFpbGFibGUgdmlhIHRoZSA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBtZXRob2QuIFRoZXJlIGFyZSBhIG51bWJlciBvZgotICogbWV0aG9kcyB0byBnZXQgaW5zdGFuY2VzIG9mIDxjb2RlPktleVN0cm9rZTwvY29kZT4gb2JqZWN0cywgaW5jbHVkaW5nIG9uZQotICogd2hpY2ggY2FuIHBhcnNlIHRoaXMgZm9ybWFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogQWxsIDxjb2RlPktleVN0cm9rZTwvY29kZT4gb2JqZWN0cywgdmlhIHRoZSA8Y29kZT5mb3JtYXQoKTwvY29kZT4gbWV0aG9kLAotICogcHJvdmlkZSBhIHZlcnNpb24gb2YgdGhlaXIgZm9ybWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiB0cmFuc2xhdGVkIGJ5Ci0gKiBwbGF0Zm9ybSBhbmQgbG9jYWxlLCBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byBhIHVzZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxjb2RlPktleVN0cm9rZTwvY29kZT4gb2JqZWN0cyBhcmUgaW1tdXRhYmxlLiBDbGllbnRzIGFyZSBub3QgcGVybWl0dGVkIHRvCi0gKiBleHRlbmQgdGhpcyBjbGFzcy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgS2V5U3Ryb2tlIGV4dGVuZHMgVHJpZ2dlciBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCi0JLyoqCi0JICogVGhlIGRlbGltaXRlciBiZXR3ZWVuIG11bHRpcGxlIGtleXMgaW4gYSBzaW5nbGUga2V5IHN0cm9rZXMgLS0gZXhwcmVzc2VkCi0JICogaW4gdGhlIGZvcm1hbCBrZXkgc3Ryb2tlIGdyYW1tYXIuIFRoaXMgaXMgbm90IHRvIGJlIGRpc3BsYXllZCB0byB0aGUKLQkgKiB1c2VyLiBJdCBpcyBvbmx5IGludGVuZGVkIGFzIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERUxJTUlURVIgPSAiXHUwMDJCIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNldCBvZiBkZWxpbWl0ZXJzIGZvciA8Y29kZT5LZXk8L2NvZGU+IG9iamVjdHMgYWxsb3dlZCBkdXJpbmcKLQkgKiBwYXJzaW5nIG9mIHRoZSBmb3JtYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERUxJTUlURVJTID0gS0VZX0RFTElNSVRFUjsKLQotCS8qKgotCSAqIFRoZSByZXByZXNlbnRhdGlvbiBmb3Igbm8ga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0tFWSA9IDA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPktleVN0cm9rZTwvY29kZT4gZ2l2ZW4gYSBuYXR1cmFsIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0gbmF0dXJhbEtleQotCSAqICAgICAgICAgICAgdGhlIG5hdHVyYWwga2V5LiBUaGUgZm9ybWF0IG9mIHRoaXMgaW50ZWdlciBpcyBkZWZpbmVkIGJ5Ci0JICogICAgICAgICAgICB3aGljaGV2ZXIgd2lkZ2V0IHRvb2xraXQgeW91IGFyZSB1c2luZzsgPGNvZGU+Tk9fS0VZPC9jb2RlPgotCSAqICAgICAgICAgICAgYWx3YXlzIG1lYW5zIG5vIG5hdHVyYWwga2V5LgotCSAqIEByZXR1cm4gYSBrZXkgc3Ryb2tlLiBUaGlzIGtleSBzdHJva2Ugd2lsbCBoYXZlIG5vIG1vZGlmaWVyIGtleXMuCi0JICogICAgICAgICBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2VlIFNXVEtleVN1cHBvcnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEtleVN0cm9rZSBnZXRJbnN0YW5jZShmaW5hbCBpbnQgbmF0dXJhbEtleSkgewotCQlyZXR1cm4gbmV3IEtleVN0cm9rZShOT19LRVksIG5hdHVyYWxLZXkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+S2V5U3Ryb2tlPC9jb2RlPiBnaXZlbiBhIHNldCBvZiBtb2RpZmllciBrZXlzCi0JICogYW5kIGEgbmF0dXJhbCBrZXkuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVyS2V5cwotCSAqICAgICAgICAgICAgdGhlIG1vZGlmaWVyIGtleXMuIFRoZSBmb3JtYXQgb2YgdGhpcyBpbnRlZ2VyIGlzIGRlZmluZWQgYnkKLQkgKiAgICAgICAgICAgIHdoaWNoZXZlciB3aWRnZXQgdG9vbGtpdCB5b3UgYXJlIHVzaW5nOyA8Y29kZT5OT19LRVk8L2NvZGU+Ci0JICogICAgICAgICAgICBhbHdheXMgbWVhbnMgbm8gbW9kaWZpZXIga2V5cy4KLQkgKiBAcGFyYW0gbmF0dXJhbEtleQotCSAqICAgICAgICAgICAgdGhlIG5hdHVyYWwga2V5LiBUaGUgZm9ybWF0IG9mIHRoaXMgaW50ZWdlciBpcyBkZWZpbmVkIGJ5Ci0JICogICAgICAgICAgICB3aGljaGV2ZXIgd2lkZ2V0IHRvb2xraXQgeW91IGFyZSB1c2luZzsgPGNvZGU+Tk9fS0VZPC9jb2RlPgotCSAqICAgICAgICAgICAgYWx3YXlzIG1lYW5zIG5vIG5hdHVyYWwga2V5LgotCSAqIEByZXR1cm4gYSBrZXkgc3Ryb2tlLiBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2VlIFNXVEtleVN1cHBvcnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEtleVN0cm9rZSBnZXRJbnN0YW5jZShmaW5hbCBpbnQgbW9kaWZpZXJLZXlzLAotCQkJZmluYWwgaW50IG5hdHVyYWxLZXkpIHsKLQkJcmV0dXJuIG5ldyBLZXlTdHJva2UobW9kaWZpZXJLZXlzLCBuYXR1cmFsS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPktleVN0cm9rZTwvY29kZT4gYnkgcGFyc2luZyBhIGdpdmVuIGEgZm9ybWFsCi0JICogc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiAgICAgICAgICAgIHRoZSBmb3JtYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHRvIHBhcnNlLgotCSAqIEByZXR1cm4gYSBrZXkgc3Ryb2tlLiBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGZvcm1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gY291bGQgbm90IGJlIHBhcnNlZAotCSAqICAgICAgICAgICAgIHRvIGEgdmFsaWQga2V5IHN0cm9rZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEtleVN0cm9rZSBnZXRJbnN0YW5jZShmaW5hbCBTdHJpbmcgc3RyaW5nKQotCQkJdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNhbm5vdCBwYXJzZSBhIG51bGwgc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZpbmFsIElLZXlMb29rdXAgbG9va3VwID0gS2V5TG9va3VwRmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0JCWludCBtb2RpZmllcktleXMgPSBOT19LRVk7Ci0JCWludCBuYXR1cmFsS2V5ID0gTk9fS0VZOwotCQlmaW5hbCBTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmcsCi0JCQkJS0VZX0RFTElNSVRFUlMsIHRydWUpOwotCQlpbnQgaSA9IDA7Ci0KLQkJd2hpbGUgKHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsKLQotCQkJaWYgKGkgJSAyID09IDApIHsKLQkJCQlpZiAoc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQl0b2tlbiA9IHRva2VuLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCWZpbmFsIGludCBtb2RpZmllcktleSA9IGxvb2t1cC5mb3JtYWxNb2RpZmllckxvb2t1cCh0b2tlbik7Ci0JCQkJCWlmIChtb2RpZmllcktleSA9PSBOT19LRVkpIHsKLQkJCQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLQkJCQkJCQkJIkNhbm5vdCBjcmVhdGUga2V5IHN0cm9rZSB3aXRoIGR1cGxpY2F0ZSBvciBub24tZXhpc3RlbnQgbW9kaWZpZXIga2V5OiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkrIHRva2VuKTsKLQkJCQkJfQotCi0JCQkJCW1vZGlmaWVyS2V5cyB8PSBtb2RpZmllcktleTsKLQotCQkJCX0gZWxzZSBpZiAodG9rZW4ubGVuZ3RoKCkgPT0gMSkgewotCQkJCQluYXR1cmFsS2V5ID0gdG9rZW4uY2hhckF0KDApOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJdG9rZW4gPSB0b2tlbi50b1VwcGVyQ2FzZSgpOwotCQkJCQluYXR1cmFsS2V5ID0gbG9va3VwLmZvcm1hbEtleUxvb2t1cCh0b2tlbik7Ci0JCQkJfQotCQkJfQotCi0JCQlpKys7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEtleVN0cm9rZShtb2RpZmllcktleXMsIG5hdHVyYWxLZXkpOwotCX0KLQotCS8qKgotCSAqIEFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGlmaWVyIGtleXM7IDxjb2RlPk5PX0tFWTwvY29kZT4KLQkgKiBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIG1vZGlmaWVyIGtleS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBtb2RpZmllcktleXM7Ci0KLQkvKioKLQkgKiBUaGUgbmF0dXJhbCBrZXkgZm9yIHRoaXMga2V5IHN0cm9rZS4gVGhpcyB2YWx1ZSBpcyA8Y29kZT5OT19LRVk8L2NvZGU+Ci0JICogaWYgdGhlIGtleSBzdHJva2UgaXMgaW5jb21wbGV0ZSAoaS5lLiwgaGFzIG5vIG5hdHVyYWwga2V5KS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBuYXR1cmFsS2V5OwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5LZXlTdHJva2U8L2NvZGU+IGdpdmVuIGEgc2V0IG9mCi0JICogbW9kaWZpZXIga2V5cyBhbmQgYSBuYXR1cmFsIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZXJLZXlzCi0JICogICAgICAgICAgICB0aGUgbW9kaWZpZXIga2V5cy4gVGhlIGZvcm1hdCBvZiB0aGlzIGludGVnZXIgaXMgZGVmaW5lZCBieQotCSAqICAgICAgICAgICAgd2hpY2hldmVyIHdpZGdldCB0b29sa2l0IHlvdSBhcmUgdXNpbmc7IDxjb2RlPk5PX0tFWTwvY29kZT4KLQkgKiAgICAgICAgICAgIGFsd2F5cyBtZWFucyBubyBtb2RpZmllciBrZXlzLgotCSAqIEBwYXJhbSBuYXR1cmFsS2V5Ci0JICogICAgICAgICAgICB0aGUgbmF0dXJhbCBrZXkuIFRoZSBmb3JtYXQgb2YgdGhpcyBpbnRlZ2VyIGlzIGRlZmluZWQgYnkKLQkgKiAgICAgICAgICAgIHdoaWNoZXZlciB3aWRnZXQgdG9vbGtpdCB5b3UgYXJlIHVzaW5nOyA8Y29kZT5OT19LRVk8L2NvZGU+Ci0JICogICAgICAgICAgICBhbHdheXMgbWVhbnMgbm8gbmF0dXJhbCBrZXkuCi0JICogQHNlZSBTV1RLZXlTdXBwb3J0Ci0JICovCi0JcHJpdmF0ZSBLZXlTdHJva2UoZmluYWwgaW50IG1vZGlmaWVyS2V5cywgZmluYWwgaW50IG5hdHVyYWxLZXkpIHsKLQkJdGhpcy5tb2RpZmllcktleXMgPSBtb2RpZmllcktleXM7Ci0JCXRoaXMubmF0dXJhbEtleSA9IG5hdHVyYWxLZXk7Ci0JfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZpbmFsIEtleVN0cm9rZSBrZXlTdHJva2UgPSAoS2V5U3Ryb2tlKSBvYmplY3Q7Ci0JCWludCBjb21wYXJlVG8gPSBVdGlsLmNvbXBhcmUobW9kaWZpZXJLZXlzLCBrZXlTdHJva2UubW9kaWZpZXJLZXlzKTsKLQotCQlpZiAoY29tcGFyZVRvID09IDApIHsKLQkJCWNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZShuYXR1cmFsS2V5LCBrZXlTdHJva2UubmF0dXJhbEtleSk7Ci0JCX0KLQotCQlyZXR1cm4gY29tcGFyZVRvOwotCX0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBLZXlTdHJva2UpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmaW5hbCBLZXlTdHJva2Uga2V5U3Ryb2tlID0gKEtleVN0cm9rZSkgb2JqZWN0OwotCQlpZiAobW9kaWZpZXJLZXlzICE9IGtleVN0cm9rZS5tb2RpZmllcktleXMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiAobmF0dXJhbEtleSA9PSBrZXlTdHJva2UubmF0dXJhbEtleSk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyB0aGlzIGtleSBzdHJva2UgaW50byB0aGUgY3VycmVudCBkZWZhdWx0IGxvb2suCi0JICogCi0JICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBrZXkgc3Ryb2tlIHVzaW5nIHRoZSBkZWZhdWx0Ci0JICogICAgICAgICBsb29rOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGZvcm1hdCgpIHsKLQkJcmV0dXJuIEtleUZvcm1hdHRlckZhY3RvcnkuZ2V0RGVmYXVsdCgpLmZvcm1hdCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RpZmllciBrZXlzIGZvciB0aGlzIGtleSBzdHJva2UuCi0JICogCi0JICogQHJldHVybiB0aGUgYml0IG1hc2sgb2YgbW9kaWZpZXIga2V5czsgPGNvZGU+Tk9fS0VZPC9jb2RlPiBtZWFucyB0aGF0Ci0JICogICAgICAgICB0aGVyZSBpcyBubyBtb2RpZmllciBrZXkuCi0JICovCi0JcHVibGljIGZpbmFsIGludCBnZXRNb2RpZmllcktleXMoKSB7Ci0JCXJldHVybiBtb2RpZmllcktleXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmF0dXJhbCBrZXkgZm9yIHRoaXMga2V5IHN0cm9rZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuYXR1cmFsIGtleSBmb3IgdGhpcyBrZXkgc3Ryb2tlLiBUaGlzIHZhbHVlIGlzCi0JICogICAgICAgICA8Y29kZT5OT19LRVk8L2NvZGU+IGlmIHRoZSBrZXkgc3Ryb2tlIGlzIGluY29tcGxldGUgKGkuZS4sIGhhcwotCSAqICAgICAgICAgbm8gbmF0dXJhbCBrZXkpLgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TmF0dXJhbEtleSgpIHsKLQkJcmV0dXJuIG5hdHVyYWxLZXk7Ci0JfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gbW9kaWZpZXJLZXlzIDw8IDQgKyBuYXR1cmFsS2V5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhpcyBrZXkgc3Ryb2tlIGlzIGNvbXBsZXRlLiBLZXkgc3Ryb2tlcyBhcmUKLQkgKiBjb21wbGV0ZSBpZmYgdGhleSBoYXZlIGEgbmF0dXJhbCBrZXkgd2hpY2ggaXMgbm90IDxjb2RlPk5PX0tFWTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiwgaWZmIHRoZSBrZXkgc3Ryb2tlIGlzIGNvbXBsZXRlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiAobmF0dXJhbEtleSAhPSBOT19LRVkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZvcm1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMga2V5IHN0cm9rZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBmb3JtYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIGtleSBzdHJva2UuIEd1YXJhbnRlZWQKLQkgKiAgICAgICAgIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBLZXlGb3JtYXR0ZXJGYWN0b3J5LmdldEZvcm1hbEtleUZvcm1hdHRlcigpLmZvcm1hdCh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL1BhcnNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMGVkMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9QYXJzZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5czsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHByb2JsZW1zIHdoaWxlIHBhcnNpbmcgZm9ybWFsIHN0cmluZyByZXByZXNlbnRhdGlvbnMKLSAqIG9mIGVpdGhlciA8Y29kZT5LZXlTdHJva2U8L2NvZGU+IG9yIDxjb2RlPktleVNlcXVlbmNlPC9jb2RlPiBvYmplY3RzLgotICogPC9wPgotICogPHA+Ci0gKiA8Y29kZT5QYXJzZUV4Y2VwdGlvbjwvY29kZT4gb2JqZWN0cyBhcmUgaW1tdXRhYmxlLiBDbGllbnRzIGFyZSBub3QKLSAqIHBlcm1pdHRlZCB0byBleHRlbmQgdGhpcyBjbGFzcy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcmlhbCB2ZXJzaW9uIFVJRCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzAwOTg2NDgxNDM3NjI0MUw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+UGFyc2VFeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwKLSAgICAgKiBtZXNzYWdlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7Ci0gICAgICAgIHN1cGVyKHMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvU1dUS2V5TG9va3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL1NXVEtleUxvb2t1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjUwMWMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvU1dUS2V5TG9va3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogPHA+Ci0gKiBBIGxvb2stdXAgdGFibGUgZm9yIHRoZSBmb3JtYWwgZ3JhbW1hciBmb3Iga2V5cywgYW5kIHRoZSBpbnRlZ2VyIHZhbHVlcyB0aGV5Ci0gKiByZXByZXNlbnQuIFRoaXMgbG9vay11cCB0YWJsZSBpcyBoYXJkLWNvZGVkIHRvIHVzZSBTV1QgcmVwcmVzZW50YXRpb25zLiBCeQotICogcmVwbGFjaW5nIHRoaXMgY2xhc3MgKGFuZAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuU1dUS2V5U3VwcG9ydH0pLCB5b3UgY2FuIHJlbW92ZSB0aGUKLSAqIGRlcGVuZGVuY3kgb24gU1dULgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5TG9va3VwRmFjdG9yeQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU1dUS2V5TG9va3VwIGltcGxlbWVudHMgSUtleUxvb2t1cCB7Ci0KLQkvKioKLQkgKiBUaGUgbG9vay11cCB0YWJsZSBmb3IgbW9kaWZpZXIga2V5cy4gVGhpcyBpcyBhIG1hcCBvZiBmb3JtYWwgbmFtZSAoPGNvZGU+U3RyaW5nPC9jb2RlPikKLQkgKiB0byBpbnRlZ2VyIHZhbHVlICg8Y29kZT5JbnRlZ2VyPC9jb2RlPikuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAgbW9kaWZpZXJLZXlUYWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBUaGUgbG9vay11cCB0YWJsZSBmb3IgZm9ybWFsIG5hbWVzLiBUaGlzIGlzIGEgbWFwIG9mIGludGVnZXIgdmFsdWUgKDxjb2RlPkludGVnZXI8L2NvZGU+KQotCSAqIHRvIGZvcm1hbCBuYW1lICg8Y29kZT5TdHJpbmc8L2NvZGU+KS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCBuYW1lVGFibGUgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogVGhlIGxvb2stdXAgdGFibGUgZm9yIG5hdHVyYWwga2V5cy4gVGhpcyBpcyBhIG1hcCBvZiBmb3JtYWwgbmFtZSAoPGNvZGU+U3RyaW5nPC9jb2RlPikKLQkgKiB0byBpbnRlZ2VyIHZhbHVlICg8Y29kZT5JbnRlZ2VyPC9jb2RlPikuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAgbmF0dXJhbEtleVRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgbG9vay11cCBjbGFzcy4gVGhpcyBzaG91bGQgb25seSBiZSBkb25lIGJ5IHRoZSBsb29rLXVwCi0JICogZmFjdG9yeS4KLQkgKiAKLQkgKiBAc2VlIEtleUxvb2t1cEZhY3RvcnkKLQkgKi8KLQlTV1RLZXlMb29rdXAoKSB7Ci0JCWZpbmFsIEludGVnZXIgYWx0ID0gbmV3IEludGVnZXIoU1dULkFMVCk7Ci0JCWZpbmFsIEludGVnZXIgY29tbWFuZCA9IG5ldyBJbnRlZ2VyKFNXVC5DT01NQU5EKTsKLQkJZmluYWwgSW50ZWdlciBjdHJsID0gbmV3IEludGVnZXIoU1dULkNUUkwpOwotCQlmaW5hbCBJbnRlZ2VyIHNoaWZ0ID0gbmV3IEludGVnZXIoU1dULlNISUZUKTsKLQkJbW9kaWZpZXJLZXlUYWJsZS5wdXQoQUxUX05BTUUsIGFsdCk7Ci0JCW5hbWVUYWJsZS5wdXQoYWx0LCBBTFRfTkFNRSk7Ci0JCW1vZGlmaWVyS2V5VGFibGUucHV0KENPTU1BTkRfTkFNRSwgY29tbWFuZCk7Ci0JCW5hbWVUYWJsZS5wdXQoY29tbWFuZCwgQ09NTUFORF9OQU1FKTsKLQkJbW9kaWZpZXJLZXlUYWJsZS5wdXQoQ1RSTF9OQU1FLCBjdHJsKTsKLQkJbmFtZVRhYmxlLnB1dChjdHJsLCBDVFJMX05BTUUpOwotCQltb2RpZmllcktleVRhYmxlLnB1dChTSElGVF9OQU1FLCBzaGlmdCk7Ci0JCW5hbWVUYWJsZS5wdXQoc2hpZnQsIFNISUZUX05BTUUpOwotCQltb2RpZmllcktleVRhYmxlLnB1dChNMV9OQU1FLAotCQkJCSJjYXJib24iLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSkgPyBjb21tYW5kIDogY3RybCk7IC8vJE5PTi1OTFMtMSQKLQkJbW9kaWZpZXJLZXlUYWJsZS5wdXQoTTJfTkFNRSwgc2hpZnQpOwotCQltb2RpZmllcktleVRhYmxlLnB1dChNM19OQU1FLCBhbHQpOwotCQltb2RpZmllcktleVRhYmxlLnB1dChNNF9OQU1FLCAiY2FyYm9uIi5lcXVhbHMoU1dULmdldFBsYXRmb3JtKCkpID8gY3RybCAvLyROT04tTkxTLTEkCi0JCQkJOiBjb21tYW5kKTsKLQotCQlmaW5hbCBJbnRlZ2VyIGFycm93RG93biA9IG5ldyBJbnRlZ2VyKFNXVC5BUlJPV19ET1dOKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChBUlJPV19ET1dOX05BTUUsIGFycm93RG93bik7Ci0JCW5hbWVUYWJsZS5wdXQoYXJyb3dEb3duLCBBUlJPV19ET1dOX05BTUUpOwotCQlmaW5hbCBJbnRlZ2VyIGFycm93TGVmdCA9IG5ldyBJbnRlZ2VyKFNXVC5BUlJPV19MRUZUKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChBUlJPV19MRUZUX05BTUUsIGFycm93TGVmdCk7Ci0JCW5hbWVUYWJsZS5wdXQoYXJyb3dMZWZ0LCBBUlJPV19MRUZUX05BTUUpOwotCQlmaW5hbCBJbnRlZ2VyIGFycm93UmlnaHQgPSBuZXcgSW50ZWdlcihTV1QuQVJST1dfUklHSFQpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KEFSUk9XX1JJR0hUX05BTUUsIGFycm93UmlnaHQpOwotCQluYW1lVGFibGUucHV0KGFycm93UmlnaHQsIEFSUk9XX1JJR0hUX05BTUUpOwotCQlmaW5hbCBJbnRlZ2VyIGFycm93VXAgPSBuZXcgSW50ZWdlcihTV1QuQVJST1dfVVApOwotCQluYXR1cmFsS2V5VGFibGUucHV0KEFSUk9XX1VQX05BTUUsIGFycm93VXApOwotCQluYW1lVGFibGUucHV0KGFycm93VXAsIEFSUk9XX1VQX05BTUUpOwotCQlmaW5hbCBJbnRlZ2VyIGJyZWFrS2V5ID0gbmV3IEludGVnZXIoU1dULkJSRUFLKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChCUkVBS19OQU1FLCBicmVha0tleSk7Ci0JCW5hbWVUYWJsZS5wdXQoYnJlYWtLZXksIEJSRUFLX05BTUUpOwotCQlmaW5hbCBJbnRlZ2VyIGJzID0gbmV3IEludGVnZXIoU1dULkJTKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChCU19OQU1FLCBicyk7Ci0JCW5hbWVUYWJsZS5wdXQoYnMsIEJTX05BTUUpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KEJBQ0tTUEFDRV9OQU1FLCBicyk7Ci0JCWZpbmFsIEludGVnZXIgY2Fwc0xvY2sgPSBuZXcgSW50ZWdlcihTV1QuQ0FQU19MT0NLKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChDQVBTX0xPQ0tfTkFNRSwgY2Fwc0xvY2spOwotCQluYW1lVGFibGUucHV0KGNhcHNMb2NrLCBDQVBTX0xPQ0tfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgY3IgPSBuZXcgSW50ZWdlcihTV1QuQ1IpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KENSX05BTUUsIGNyKTsKLQkJbmFtZVRhYmxlLnB1dChjciwgQ1JfTkFNRSk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoRU5URVJfTkFNRSwgY3IpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KFJFVFVSTl9OQU1FLCBjcik7Ci0JCWZpbmFsIEludGVnZXIgZGVsID0gbmV3IEludGVnZXIoU1dULkRFTCk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoREVMX05BTUUsIGRlbCk7Ci0JCW5hbWVUYWJsZS5wdXQoZGVsLCBERUxfTkFNRSk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoREVMRVRFX05BTUUsIGRlbCk7Ci0JCWZpbmFsIEludGVnZXIgZW5kID0gbmV3IEludGVnZXIoU1dULkVORCk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoRU5EX05BTUUsIGVuZCk7Ci0JCW5hbWVUYWJsZS5wdXQoZW5kLCBFTkRfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgZXNjID0gbmV3IEludGVnZXIoU1dULkVTQyk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoRVNDX05BTUUsIGVzYyk7Ci0JCW5hbWVUYWJsZS5wdXQoZXNjLCBFU0NfTkFNRSk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoRVNDQVBFX05BTUUsIGVzYyk7Ci0JCWZpbmFsIEludGVnZXIgZjEgPSBuZXcgSW50ZWdlcihTV1QuRjEpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KEYxX05BTUUsIGYxKTsKLQkJbmFtZVRhYmxlLnB1dChmMSwgRjFfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgZjIgPSBuZXcgSW50ZWdlcihTV1QuRjIpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KEYyX05BTUUsIG5ldyBJbnRlZ2VyKFNXVC5GMikpOwotCQluYW1lVGFibGUucHV0KGYyLCBGMl9OQU1FKTsKLQkJZmluYWwgSW50ZWdlciBmMyA9IG5ldyBJbnRlZ2VyKFNXVC5GMyk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoRjNfTkFNRSwgbmV3IEludGVnZXIoU1dULkYzKSk7Ci0JCW5hbWVUYWJsZS5wdXQoZjMsIEYzX05BTUUpOwotCQlmaW5hbCBJbnRlZ2VyIGY0ID0gbmV3IEludGVnZXIoU1dULkY0KTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChGNF9OQU1FLCBuZXcgSW50ZWdlcihTV1QuRjQpKTsKLQkJbmFtZVRhYmxlLnB1dChmNCwgRjRfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgZjUgPSBuZXcgSW50ZWdlcihTV1QuRjUpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KEY1X05BTUUsIG5ldyBJbnRlZ2VyKFNXVC5GNSkpOwotCQluYW1lVGFibGUucHV0KGY1LCBGNV9OQU1FKTsKLQkJZmluYWwgSW50ZWdlciBmNiA9IG5ldyBJbnRlZ2VyKFNXVC5GNik7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoRjZfTkFNRSwgbmV3IEludGVnZXIoU1dULkY2KSk7Ci0JCW5hbWVUYWJsZS5wdXQoZjYsIEY2X05BTUUpOwotCQlmaW5hbCBJbnRlZ2VyIGY3ID0gbmV3IEludGVnZXIoU1dULkY3KTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChGN19OQU1FLCBuZXcgSW50ZWdlcihTV1QuRjcpKTsKLQkJbmFtZVRhYmxlLnB1dChmNywgRjdfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgZjggPSBuZXcgSW50ZWdlcihTV1QuRjgpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KEY4X05BTUUsIG5ldyBJbnRlZ2VyKFNXVC5GOCkpOwotCQluYW1lVGFibGUucHV0KGY4LCBGOF9OQU1FKTsKLQkJZmluYWwgSW50ZWdlciBmOSA9IG5ldyBJbnRlZ2VyKFNXVC5GOSk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoRjlfTkFNRSwgbmV3IEludGVnZXIoU1dULkY5KSk7Ci0JCW5hbWVUYWJsZS5wdXQoZjksIEY5X05BTUUpOwotCQlmaW5hbCBJbnRlZ2VyIGYxMCA9IG5ldyBJbnRlZ2VyKFNXVC5GMTApOwotCQluYXR1cmFsS2V5VGFibGUucHV0KEYxMF9OQU1FLCBuZXcgSW50ZWdlcihTV1QuRjEwKSk7Ci0JCW5hbWVUYWJsZS5wdXQoZjEwLCBGMTBfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgZjExID0gbmV3IEludGVnZXIoU1dULkYxMSk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoRjExX05BTUUsIG5ldyBJbnRlZ2VyKFNXVC5GMTEpKTsKLQkJbmFtZVRhYmxlLnB1dChmMTEsIEYxMV9OQU1FKTsKLQkJZmluYWwgSW50ZWdlciBmMTIgPSBuZXcgSW50ZWdlcihTV1QuRjEyKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChGMTJfTkFNRSwgbmV3IEludGVnZXIoU1dULkYxMikpOwotCQluYW1lVGFibGUucHV0KGYxMiwgRjEyX05BTUUpOwotCQlmaW5hbCBJbnRlZ2VyIGYxMyA9IG5ldyBJbnRlZ2VyKFNXVC5GMTMpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KEYxM19OQU1FLCBuZXcgSW50ZWdlcihTV1QuRjEzKSk7Ci0JCW5hbWVUYWJsZS5wdXQoZjEzLCBGMTNfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgZjE0ID0gbmV3IEludGVnZXIoU1dULkYxNCk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoRjE0X05BTUUsIG5ldyBJbnRlZ2VyKFNXVC5GMTQpKTsKLQkJbmFtZVRhYmxlLnB1dChmMTQsIEYxNF9OQU1FKTsKLQkJZmluYWwgSW50ZWdlciBmMTUgPSBuZXcgSW50ZWdlcihTV1QuRjE1KTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChGMTVfTkFNRSwgbmV3IEludGVnZXIoU1dULkYxNSkpOwotCQluYW1lVGFibGUucHV0KGYxNSwgRjE1X05BTUUpOwotCQlmaW5hbCBJbnRlZ2VyIGZmID0gbmV3IEludGVnZXIoMTIpOyAvLyBBU0NJSSAweDBDCi0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoRkZfTkFNRSwgZmYpOwotCQluYW1lVGFibGUucHV0KGZmLCBGRl9OQU1FKTsKLQkJZmluYWwgSW50ZWdlciBob21lID0gbmV3IEludGVnZXIoU1dULkhPTUUpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KEhPTUVfTkFNRSwgaG9tZSk7Ci0JCW5hbWVUYWJsZS5wdXQoaG9tZSwgSE9NRV9OQU1FKTsKLQkJZmluYWwgSW50ZWdlciBpbnNlcnQgPSBuZXcgSW50ZWdlcihTV1QuSU5TRVJUKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChJTlNFUlRfTkFNRSwgaW5zZXJ0KTsKLQkJbmFtZVRhYmxlLnB1dChpbnNlcnQsIElOU0VSVF9OQU1FKTsKLQkJZmluYWwgSW50ZWdlciBsZiA9IG5ldyBJbnRlZ2VyKFNXVC5MRik7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTEZfTkFNRSwgbGYpOwotCQluYW1lVGFibGUucHV0KGxmLCBMRl9OQU1FKTsKLQkJZmluYWwgSW50ZWdlciBudWwgPSBuZXcgSW50ZWdlcihTV1QuTlVMTCk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVMX05BTUUsIG51bCk7Ci0JCW5hbWVUYWJsZS5wdXQobnVsLCBOVUxfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgbnVtTG9jayA9IG5ldyBJbnRlZ2VyKFNXVC5OVU1fTE9DSyk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVNX0xPQ0tfTkFNRSwgbnVtTG9jayk7Ci0JCW5hbWVUYWJsZS5wdXQobnVtTG9jaywgTlVNX0xPQ0tfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkMCA9IG5ldyBJbnRlZ2VyKFNXVC5LRVlQQURfMCk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVNUEFEXzBfTkFNRSwga2V5cGFkMCk7Ci0JCW5hbWVUYWJsZS5wdXQoa2V5cGFkMCwgTlVNUEFEXzBfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkMSA9IG5ldyBJbnRlZ2VyKFNXVC5LRVlQQURfMSk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVNUEFEXzFfTkFNRSwga2V5cGFkMSk7Ci0JCW5hbWVUYWJsZS5wdXQoa2V5cGFkMSwgTlVNUEFEXzFfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkMiA9IG5ldyBJbnRlZ2VyKFNXVC5LRVlQQURfMik7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVNUEFEXzJfTkFNRSwga2V5cGFkMik7Ci0JCW5hbWVUYWJsZS5wdXQoa2V5cGFkMiwgTlVNUEFEXzJfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkMyA9IG5ldyBJbnRlZ2VyKFNXVC5LRVlQQURfMyk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVNUEFEXzNfTkFNRSwga2V5cGFkMyk7Ci0JCW5hbWVUYWJsZS5wdXQoa2V5cGFkMywgTlVNUEFEXzNfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkNCA9IG5ldyBJbnRlZ2VyKFNXVC5LRVlQQURfNCk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVNUEFEXzRfTkFNRSwga2V5cGFkNCk7Ci0JCW5hbWVUYWJsZS5wdXQoa2V5cGFkNCwgTlVNUEFEXzRfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkNSA9IG5ldyBJbnRlZ2VyKFNXVC5LRVlQQURfNSk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVNUEFEXzVfTkFNRSwga2V5cGFkNSk7Ci0JCW5hbWVUYWJsZS5wdXQoa2V5cGFkNSwgTlVNUEFEXzVfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkNiA9IG5ldyBJbnRlZ2VyKFNXVC5LRVlQQURfNik7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVNUEFEXzZfTkFNRSwga2V5cGFkNik7Ci0JCW5hbWVUYWJsZS5wdXQoa2V5cGFkNiwgTlVNUEFEXzZfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkNyA9IG5ldyBJbnRlZ2VyKFNXVC5LRVlQQURfNyk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVNUEFEXzdfTkFNRSwga2V5cGFkNyk7Ci0JCW5hbWVUYWJsZS5wdXQoa2V5cGFkNywgTlVNUEFEXzdfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkOCA9IG5ldyBJbnRlZ2VyKFNXVC5LRVlQQURfOCk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVNUEFEXzhfTkFNRSwga2V5cGFkOCk7Ci0JCW5hbWVUYWJsZS5wdXQoa2V5cGFkOCwgTlVNUEFEXzhfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkOSA9IG5ldyBJbnRlZ2VyKFNXVC5LRVlQQURfOSk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVNUEFEXzlfTkFNRSwga2V5cGFkOSk7Ci0JCW5hbWVUYWJsZS5wdXQoa2V5cGFkOSwgTlVNUEFEXzlfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkQWRkID0gbmV3IEludGVnZXIoU1dULktFWVBBRF9BREQpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KE5VTVBBRF9BRERfTkFNRSwga2V5cGFkQWRkKTsKLQkJbmFtZVRhYmxlLnB1dChrZXlwYWRBZGQsIE5VTVBBRF9BRERfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkRGVjaW1hbCA9IG5ldyBJbnRlZ2VyKFNXVC5LRVlQQURfREVDSU1BTCk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoTlVNUEFEX0RFQ0lNQUxfTkFNRSwga2V5cGFkRGVjaW1hbCk7Ci0JCW5hbWVUYWJsZS5wdXQoa2V5cGFkRGVjaW1hbCwgTlVNUEFEX0RFQ0lNQUxfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkRGl2aWRlID0gbmV3IEludGVnZXIoU1dULktFWVBBRF9ESVZJREUpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KE5VTVBBRF9ESVZJREVfTkFNRSwga2V5cGFkRGl2aWRlKTsKLQkJbmFtZVRhYmxlLnB1dChrZXlwYWREaXZpZGUsIE5VTVBBRF9ESVZJREVfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkQ3IgPSBuZXcgSW50ZWdlcihTV1QuS0VZUEFEX0NSKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChOVU1QQURfRU5URVJfTkFNRSwga2V5cGFkQ3IpOwotCQluYW1lVGFibGUucHV0KGtleXBhZENyLCBOVU1QQURfRU5URVJfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkRXF1YWwgPSBuZXcgSW50ZWdlcihTV1QuS0VZUEFEX0VRVUFMKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChOVU1QQURfRVFVQUxfTkFNRSwga2V5cGFkRXF1YWwpOwotCQluYW1lVGFibGUucHV0KGtleXBhZEVxdWFsLCBOVU1QQURfRVFVQUxfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkTXVsdGlwbHkgPSBuZXcgSW50ZWdlcihTV1QuS0VZUEFEX01VTFRJUExZKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChOVU1QQURfTVVMVElQTFlfTkFNRSwga2V5cGFkTXVsdGlwbHkpOwotCQluYW1lVGFibGUucHV0KGtleXBhZE11bHRpcGx5LCBOVU1QQURfTVVMVElQTFlfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIga2V5cGFkU3VidHJhY3QgPSBuZXcgSW50ZWdlcihTV1QuS0VZUEFEX1NVQlRSQUNUKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChOVU1QQURfU1VCVFJBQ1RfTkFNRSwga2V5cGFkU3VidHJhY3QpOwotCQluYW1lVGFibGUucHV0KGtleXBhZFN1YnRyYWN0LCBOVU1QQURfU1VCVFJBQ1RfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgcGFnZURvd24gPSBuZXcgSW50ZWdlcihTV1QuUEFHRV9ET1dOKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChQQUdFX0RPV05fTkFNRSwgcGFnZURvd24pOwotCQluYW1lVGFibGUucHV0KHBhZ2VEb3duLCBQQUdFX0RPV05fTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgcGFnZVVwID0gbmV3IEludGVnZXIoU1dULlBBR0VfVVApOwotCQluYXR1cmFsS2V5VGFibGUucHV0KFBBR0VfVVBfTkFNRSwgcGFnZVVwKTsKLQkJbmFtZVRhYmxlLnB1dChwYWdlVXAsIFBBR0VfVVBfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgcGF1c2UgPSBuZXcgSW50ZWdlcihTV1QuUEFVU0UpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KFBBVVNFX05BTUUsIHBhdXNlKTsKLQkJbmFtZVRhYmxlLnB1dChwYXVzZSwgUEFVU0VfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgcHJpbnRTY3JlZW4gPSBuZXcgSW50ZWdlcihTV1QuUFJJTlRfU0NSRUVOKTsKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChQUklOVF9TQ1JFRU5fTkFNRSwgcHJpbnRTY3JlZW4pOwotCQluYW1lVGFibGUucHV0KHByaW50U2NyZWVuLCBQUklOVF9TQ1JFRU5fTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgc2Nyb2xsTG9jayA9IG5ldyBJbnRlZ2VyKFNXVC5TQ1JPTExfTE9DSyk7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoU0NST0xMX0xPQ0tfTkFNRSwgc2Nyb2xsTG9jayk7Ci0JCW5hbWVUYWJsZS5wdXQoc2Nyb2xsTG9jaywgU0NST0xMX0xPQ0tfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgc3BhY2UgPSBuZXcgSW50ZWdlcignICcpOwotCQluYXR1cmFsS2V5VGFibGUucHV0KFNQQUNFX05BTUUsIHNwYWNlKTsKLQkJbmFtZVRhYmxlLnB1dChzcGFjZSwgU1BBQ0VfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgdGFiID0gbmV3IEludGVnZXIoU1dULlRBQik7Ci0JCW5hdHVyYWxLZXlUYWJsZS5wdXQoVEFCX05BTUUsIHRhYik7Ci0JCW5hbWVUYWJsZS5wdXQodGFiLCBUQUJfTkFNRSk7Ci0JCWZpbmFsIEludGVnZXIgdnQgPSBuZXcgSW50ZWdlcigxMSk7IC8vIEFTQ0lJIDB4MEIKLQkJbmF0dXJhbEtleVRhYmxlLnB1dChWVF9OQU1FLCB2dCk7Ci0JCW5hbWVUYWJsZS5wdXQodnQsIFZUX05BTUUpOwotCX0KLQotCS8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuSUtleUxvb2t1cCNmb3JtYWxLZXlMb29rdXAoamF2YS5sYW5nLlN0cmluZykKLSAJICogCi0JICovCQotCXB1YmxpYyBmaW5hbCBpbnQgZm9ybWFsS2V5TG9va3VwKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0JCWZpbmFsIE9iamVjdCB2YWx1ZSA9IG5hdHVyYWxLZXlUYWJsZS5nZXQobmFtZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCXJldHVybiAoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCQotCQlpZiAobmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVucmVjb2duaXplZCBmb3JtYWwga2V5IG5hbWU6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIG5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIG5hbWUuY2hhckF0KDApOwotCX0KLQotCS8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuSUtleUxvb2t1cCNmb3JtYWxLZXlMb29rdXBJbnRlZ2VyKGphdmEubGFuZy5TdHJpbmcpCi0gCSAqIAotCSAqLwkKLQlwdWJsaWMgZmluYWwgSW50ZWdlciBmb3JtYWxLZXlMb29rdXBJbnRlZ2VyKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0JCWZpbmFsIE9iamVjdCB2YWx1ZSA9IG5hdHVyYWxLZXlUYWJsZS5nZXQobmFtZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCXJldHVybiAoSW50ZWdlcikgdmFsdWU7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEludGVnZXIobmFtZS5jaGFyQXQoMCkpOwotCX0KLQotCS8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuSUtleUxvb2t1cCNmb3JtYWxNb2RpZmllckxvb2t1cChqYXZhLmxhbmcuU3RyaW5nKQotIAkgKiAKLQkgKi8JCi0JcHVibGljIGZpbmFsIGludCBmb3JtYWxNb2RpZmllckxvb2t1cChmaW5hbCBTdHJpbmcgbmFtZSkgewotCQlmaW5hbCBPYmplY3QgdmFsdWUgPSBtb2RpZmllcktleVRhYmxlLmdldChuYW1lKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJcmV0dXJuICgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCk7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLklLZXlMb29rdXAjZm9ybWFsTmFtZUxvb2t1cChpbnQpCi0gCSAqIAotCSAqLwkKLQlwdWJsaWMgZmluYWwgU3RyaW5nIGZvcm1hbE5hbWVMb29rdXAoZmluYWwgaW50IGtleSkgewotCQlmaW5hbCBJbnRlZ2VyIGtleU9iamVjdCA9IG5ldyBJbnRlZ2VyKGtleSk7Ci0JCWZpbmFsIE9iamVjdCB2YWx1ZSA9IG5hbWVUYWJsZS5nZXQoa2V5T2JqZWN0KTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgdmFsdWU7Ci0JCX0KLQotCQlyZXR1cm4gVXRpbC5aRVJPX0xFTkdUSF9TVFJJTkcgKyAoKGNoYXIpIGtleSk7Ci0JfQotCi0JLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5JS2V5TG9va3VwI2dldEFsdCgpCi0gCSAqIAotCSAqLwkKLQlwdWJsaWMgZmluYWwgaW50IGdldEFsdCgpIHsKLQkJcmV0dXJuIFNXVC5BTFQ7Ci0JfQotCi0JLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5JS2V5TG9va3VwI2dldENvbW1hbmQoKQotIAkgKiAKLQkgKi8JCi0JcHVibGljIGZpbmFsIGludCBnZXRDb21tYW5kKCkgewotCQlyZXR1cm4gU1dULkNPTU1BTkQ7Ci0JfQotCi0JLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5JS2V5TG9va3VwI2dldEN0cmwoKQotIAkgKiAKLQkgKi8JCi0JcHVibGljIGZpbmFsIGludCBnZXRDdHJsKCkgewotCQlyZXR1cm4gU1dULkNUUkw7Ci0JfQotCi0JLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5JS2V5TG9va3VwI2dldFNoaWZ0KCkKLSAJICogCi0JICovCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0U2hpZnQoKSB7Ci0JCXJldHVybiBTV1QuU0hJRlQ7Ci0JfQotCi0JLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5JS2V5TG9va3VwI2lzTW9kaWZpZXJLZXkoaW50KQotIAkgKiAKLQkgKi8JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNNb2RpZmllcktleShmaW5hbCBpbnQga2V5KSB7Ci0JCXJldHVybiAoKGtleSAmIFNXVC5NT0RJRklFUl9NQVNLKSAhPSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL1NXVEtleVN1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvU1dUS2V5U3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2M2NTAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvU1dUS2V5U3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLmZvcm1hdHRpbmcuSUtleUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLmZvcm1hdHRpbmcuTmF0aXZlS2V5Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLQotLyoqCi0gKiA8cD4KLSAqIEEgdXRpbGl0eSBjbGFzcyBmb3IgY29udmVydGluZyBTV1QgZXZlbnRzIGludG8ga2V5IHN0cm9rZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNXVEtleVN1cHBvcnQgewotCi0JLyoqCi0JICogQSBmb3JtYXR0ZXIgdGhhdCBkaXNwbGF5cyBrZXkgc2VxdWVuY2VzIGluIGEgc3R5bGUgbmF0aXZlIHRvIHRoZQotCSAqIHBsYXRmb3JtLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElLZXlGb3JtYXR0ZXIgTkFUSVZFX0ZPUk1BVFRFUiA9IG5ldyBOYXRpdmVLZXlGb3JtYXR0ZXIoKTsKLQotCS8qKgotCSAqIEdpdmVuIGFuIFNXVCBhY2NlbGVyYXRvciB2YWx1ZSwgcHJvdmlkZSB0aGUgY29ycmVzcG9uZGluZyBrZXkgc3Ryb2tlLgotCSAqIAotCSAqIEBwYXJhbSBhY2NlbGVyYXRvcgotCSAqICAgICAgICAgICAgVGhlIGFjY2VsZXJhdG9yIHRvIGNvbnZlcnQ7IHNob3VsZCBiZSBhIHZhbGlkIFNXVCBhY2NlbGVyYXRvcgotCSAqICAgICAgICAgICAgdmFsdWUuCi0JICogQHJldHVybiBUaGUgZXF1aXZhbGVudCBrZXkgc3Ryb2tlOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEtleVN0cm9rZSBjb252ZXJ0QWNjZWxlcmF0b3JUb0tleVN0cm9rZShpbnQgYWNjZWxlcmF0b3IpIHsKLQkJZmluYWwgaW50IG1vZGlmaWVyS2V5cyA9IGFjY2VsZXJhdG9yICYgU1dULk1PRElGSUVSX01BU0s7Ci0JCWZpbmFsIGludCBuYXR1cmFsS2V5OwotCQlpZiAoYWNjZWxlcmF0b3IgPT0gbW9kaWZpZXJLZXlzKSB7Ci0JCQluYXR1cmFsS2V5ID0gS2V5U3Ryb2tlLk5PX0tFWTsKLQkJfSBlbHNlIHsKLQkJCW5hdHVyYWxLZXkgPSBhY2NlbGVyYXRvciAtIG1vZGlmaWVyS2V5czsKLQkJfQotCQkKLQkJcmV0dXJuIEtleVN0cm9rZS5nZXRJbnN0YW5jZShtb2RpZmllcktleXMsIG5hdHVyYWxLZXkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlcnRzIHRoZSBnaXZlbiBldmVudCBpbnRvIGFuIFNXVCBhY2NlbGVyYXRvciB2YWx1ZSAtLSBjb25zaWRlcmluZyB0aGUKLQkgKiBtb2RpZmllZCBjaGFyYWN0ZXIgd2l0aCB0aGUgc2hpZnQgbW9kaWZpZXIuIFRoaXMgaXMgdGhlIHRoaXJkIGFjY2VsZXJhdG9yCi0JICogdmFsdWUgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCB3aGVuIHByb2Nlc3NpbmcgaW5jb21pbmcga2V5IGV2ZW50cy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIG9uIGEgc3RhbmRhcmQgVVMga2V5Ym9hcmQsICJDdHJsK1NoaWZ0KzUiIHdvdWxkIGJlIHZpZXdlZCBhcwotCSAqICJDdHJsK1NoaWZ0KyUiLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBldmVudCB0byBiZSBjb252ZXJ0ZWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gVGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBzdGF0ZSBtYXNrIGFuZCB0aGUgdW5tb2RpZmllZCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29udmVydEV2ZW50VG9Nb2RpZmllZEFjY2VsZXJhdG9yKGZpbmFsIEV2ZW50IGV2ZW50KSB7Ci0JCWludCBtb2RpZmllcnMgPSBldmVudC5zdGF0ZU1hc2sgJiBTV1QuTU9ESUZJRVJfTUFTSzsKLQkJY2hhciBjaGFyYWN0ZXIgPSB0b3BLZXkoZXZlbnQpOwotCQlyZXR1cm4gbW9kaWZpZXJzICsgdG9VcHBlckNhc2UoY2hhcmFjdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gZXZlbnQgaW50byBhbiBTV1QgYWNjZWxlcmF0b3IgdmFsdWUgLS0gY29uc2lkZXJpbmcgdGhlCi0JICogdW5tb2RpZmllZCBjaGFyYWN0ZXIgd2l0aCBhbGwgbW9kaWZpZXIga2V5cy4gVGhpcyBpcyB0aGUgZmlyc3QKLQkgKiBhY2NlbGVyYXRvciB2YWx1ZSB0aGF0IHNob3VsZCBiZSBjaGVja2VkIHdoZW4gcHJvY2Vzc2luZyBpbmNvbWluZyBrZXkKLQkgKiBldmVudHMuIEhvd2V2ZXIsIGFsbCBhbHBoYWJldGljIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQgYXMgdGhlaXIKLQkgKiB1cHBlcmNhc2UgZXF1aXZhbGVudHMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBvbiBhIHN0YW5kYXJkIFVTIGtleWJvYXJkLCAiQ3RybCtTaGlmdCs1IiB3b3VsZCBiZSB2aWV3ZWQgYXMKLQkgKiAiQ3RybCtTaGlmdCs1Ii4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgZXZlbnQgdG8gYmUgY29udmVydGVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIFRoZSBjb21iaW5hdGlvbiBvZiB0aGUgc3RhdGUgbWFzayBhbmQgdGhlIHVubW9kaWZpZWQgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbnZlcnRFdmVudFRvVW5tb2RpZmllZEFjY2VsZXJhdG9yKAotCQkJZmluYWwgRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIGNvbnZlcnRFdmVudFRvVW5tb2RpZmllZEFjY2VsZXJhdG9yKGV2ZW50LnN0YXRlTWFzaywKLQkJCQlldmVudC5rZXlDb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gc3RhdGUgbWFzayBhbmQga2V5IGNvZGUgaW50byBhbiBTV1QgYWNjZWxlcmF0b3IgdmFsdWUgLS0KLQkgKiBjb25zaWRlcmluZyB0aGUgdW5tb2RpZmllZCBjaGFyYWN0ZXIgd2l0aCBhbGwgbW9kaWZpZXIga2V5cy4gQWxsCi0JICogYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGFyZSBjb25zaWRlcmVkIGFzIHRoZWlyIHVwcGVyY2FzZSBlcXVpdmFsZW50cy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIG9uIGEgc3RhbmRhcmQgVVMga2V5Ym9hcmQsICJDdHJsK1NoaWZ0KzUiIHdvdWxkIGJlIHZpZXdlZCBhcwotCSAqICJDdHJsK1NoaWZ0KzUiLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdGVNYXNrCi0JICogICAgICAgICAgICBUaGUgaW50ZWdlciBtYXNrIG9mIG1vZGlmaWVycyBrZXlzIGRlcHJlc3NlZCB3aGVuIHRoaXMgd2FzCi0JICogICAgICAgICAgICBwcmVzc2VkLgotCSAqIEBwYXJhbSBrZXlDb2RlCi0JICogICAgICAgICAgICBUaGUga2V5IHRoYXQgd2FzIHByZXNzZWQsIGJlZm9yZSBiZWluZyBtb2RpZmllZC4KLQkgKiBAcmV0dXJuIFRoZSBjb21iaW5hdGlvbiBvZiB0aGUgc3RhdGUgbWFzayBhbmQgdGhlIHVubW9kaWZpZWQgY2hhcmFjdGVyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBjb252ZXJ0RXZlbnRUb1VubW9kaWZpZWRBY2NlbGVyYXRvcigKLQkJCWZpbmFsIGludCBzdGF0ZU1hc2ssIGZpbmFsIGludCBrZXlDb2RlKSB7Ci0JCWludCBtb2RpZmllcnMgPSBzdGF0ZU1hc2sgJiBTV1QuTU9ESUZJRVJfTUFTSzsKLQkJaW50IGNoYXJhY3RlciA9IGtleUNvZGU7Ci0JCXJldHVybiBtb2RpZmllcnMgKyB0b1VwcGVyQ2FzZShjaGFyYWN0ZXIpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlcnRzIHRoZSBnaXZlbiBldmVudCBpbnRvIGFuIFNXVCBhY2NlbGVyYXRvciB2YWx1ZSAtLSBjb25zaWRlcmluZyB0aGUKLQkgKiB1bm1vZGlmaWVkIGNoYXJhY3RlciB3aXRoIGFsbCBtb2RpZmllciBrZXlzLiBUaGlzIGlzIHRoZSBmaXJzdAotCSAqIGFjY2VsZXJhdG9yIHZhbHVlIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQuIEhvd2V2ZXIsIGFsbCBhbHBoYWJldGljCi0JICogY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZCBhcyB0aGVpciB1cHBlcmNhc2UgZXF1aXZhbGVudHMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBvbiBhIHN0YW5kYXJkIFVTIGtleWJvYXJkLCAiQ3RybCtTaGlmdCs1IiB3b3VsZCBiZSB2aWV3ZWQgYXMKLQkgKiAiQ3RybCslIi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgZXZlbnQgdG8gYmUgY29udmVydGVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIFRoZSBjb21iaW5hdGlvbiBvZiB0aGUgc3RhdGUgbWFzayBhbmQgdGhlIHVubW9kaWZpZWQgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbnZlcnRFdmVudFRvVW5tb2RpZmllZEFjY2VsZXJhdG9yKAotCQkJZmluYWwgS2V5RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIGNvbnZlcnRFdmVudFRvVW5tb2RpZmllZEFjY2VsZXJhdG9yKGV2ZW50LnN0YXRlTWFzaywKLQkJCQlldmVudC5rZXlDb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gZXZlbnQgaW50byBhbiBTV1QgYWNjZWxlcmF0b3IgdmFsdWUgLS0gY29uc2lkZXJpbmcgdGhlCi0JICogbW9kaWZpZWQgY2hhcmFjdGVyIHdpdGhvdXQgdGhlIHNoaWZ0IG1vZGlmaWVyLiBUaGlzIGlzIHRoZSBzZWNvbmQKLQkgKiBhY2NlbGVyYXRvciB2YWx1ZSB0aGF0IHNob3VsZCBiZSBjaGVja2VkIHdoZW4gcHJvY2Vzc2luZyBpbmNvbWluZyBrZXkKLQkgKiBldmVudHMuIEtleSBzdHJva2VzIHdpdGggYWxwaGFiZXRpYyBuYXR1cmFsIGtleXMgYXJlIHJ1biB0aHJvdWdoCi0JICogPGNvZGU+Y29udmVydEV2ZW50VG9Vbm1vZGlmaWVkQWNjZWxlcmF0b3I8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgVGhlIGV2ZW50IHRvIGJlIGNvbnZlcnRlZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgY29tYmluYXRpb24gb2YgdGhlIHN0YXRlIG1hc2sgd2l0aG91dCBzaGlmdCwgYW5kIHRoZSBtb2RpZmllZAotCSAqICAgICAgICAgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbnZlcnRFdmVudFRvVW5zaGlmdGVkTW9kaWZpZWRBY2NlbGVyYXRvcigKLQkJCWZpbmFsIEV2ZW50IGV2ZW50KSB7Ci0JCS8vIERpc3JlZ2FyZCBhbHBoYWJldGljIGtleSBzdHJva2VzLgotCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKChjaGFyKSBldmVudC5rZXlDb2RlKSkgewotCQkJcmV0dXJuIGNvbnZlcnRFdmVudFRvVW5tb2RpZmllZEFjY2VsZXJhdG9yKGV2ZW50KTsKLQkJfQotCi0JCWludCBtb2RpZmllcnMgPSBldmVudC5zdGF0ZU1hc2sgJiAoU1dULk1PRElGSUVSX01BU0sgXiBTV1QuU0hJRlQpOwotCQljaGFyIGNoYXJhY3RlciA9IHRvcEtleShldmVudCk7Ci0JCXJldHVybiBtb2RpZmllcnMgKyB0b1VwcGVyQ2FzZShjaGFyYWN0ZXIpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEga2V5IHN0cm9rZSwgdGhpcyBtZXRob2QgcHJvdmlkZXMgdGhlIGVxdWl2YWxlbnQgU1dUIGFjY2VsZXJhdG9yCi0JICogdmFsdWUuIFRoZSBmdW5jdGlvbmFsIGludmVyc2Ugb2YKLQkgKiA8Y29kZT5jb252ZXJ0QWNjZWxlcmF0b3JUb0tleVN0cm9rZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGtleVN0cm9rZQotCSAqICAgICAgICAgICAgVGhlIGtleSBzdHJva2UgdG8gY29udmVydDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBUaGUgU1dUIGFjY2VsZXJhdG9yIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29udmVydEtleVN0cm9rZVRvQWNjZWxlcmF0b3IoCi0JCQlmaW5hbCBLZXlTdHJva2Uga2V5U3Ryb2tlKSB7Ci0JCXJldHVybiBrZXlTdHJva2UuZ2V0TW9kaWZpZXJLZXlzKCkgKyBrZXlTdHJva2UuZ2V0TmF0dXJhbEtleSgpOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPklLZXlGb3JtYXR0ZXI8L2NvZGU+IGFwcHJvcHJpYXRlIGZvciB0aGUKLQkgKiBjdXJyZW50IGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+SUtleUZvcm1hdHRlcjwvY29kZT4gYXBwcm9wcmlhdGUgZm9yIHRoZQotCSAqICAgICAgICAgY3VycmVudCBpbnN0YW5jZTsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBJS2V5Rm9ybWF0dGVyIGdldEtleUZvcm1hdHRlckZvclBsYXRmb3JtKCkgewotCQlyZXR1cm4gTkFUSVZFX0ZPUk1BVFRFUjsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlcyBzdXJlIHRoYXQgYSBmdWxseS1tb2RpZmllZCBjaGFyYWN0ZXIgaXMgY29udmVydGVkIHRvIHRoZSBub3JtYWwKLQkgKiBmb3JtLiBUaGlzIG1lYW5zIHRoYXQgIkN0cmwrIiBrZXkgc3Ryb2tlcyBtdXN0IHJldmVyc2UgdGhlIG1vZGlmaWNhdGlvbgotCSAqIGNhdXNlZCBieSBjb250cm9sLWVzY2FwaW5nLiBBbHNvLCBhbGwgbG93ZXIgY2FzZSBsZXR0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8KLQkgKiB1cHBlcmNhc2UuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgZXZlbnQgZnJvbSB3aGljaCB0aGUgZnVsbHktbW9kaWZpZWQgY2hhcmFjdGVyIHNob3VsZCBiZQotCSAqICAgICAgICAgICAgcHVsbGVkLgotCSAqIEByZXR1cm4gVGhlIG1vZGlmaWVkIGNoYXJhY3RlciwgdXBwZXJjYXNlIGFuZCB3aXRob3V0IGNvbnRyb2wtZXNjYXBpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciB0b3BLZXkoZmluYWwgRXZlbnQgZXZlbnQpIHsKLQkJY2hhciBjaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0JCWJvb2xlYW4gY3RybERvd24gPSAoZXZlbnQuc3RhdGVNYXNrICYgU1dULkNUUkwpICE9IDA7Ci0KLQkJaWYgKGN0cmxEb3duICYmIGV2ZW50LmNoYXJhY3RlciAhPSBldmVudC5rZXlDb2RlCi0JCQkJJiYgZXZlbnQuY2hhcmFjdGVyIDwgMHgyMCkKLQkJCWNoYXJhY3RlciArPSAweDQwOwotCi0JCXJldHVybiBjaGFyYWN0ZXI7Ci0JfQotCi0JLyoqCi0JICogTWFrZXMgdGhlIGdpdmVuIGNoYXJhY3RlciB1cHBlcmNhc2UgaWYgaXQgaXMgYSBsZXR0ZXIuCi0JICogCi0JICogQHBhcmFtIGtleUNvZGUKLQkgKiAgICAgICAgICAgIFRoZSBjaGFyYWN0ZXIgdG8gY29udmVydC4KLQkgKiBAcmV0dXJuIFRoZSB1cHBlcmNhc2UgZXF1aXZhbGVudCwgaWYgYW55OyBvdGhlcndpc2UsIHRoZSBjaGFyYWN0ZXIKLQkgKiAgICAgICAgIGl0c2VsZi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgdG9VcHBlckNhc2UoaW50IGtleUNvZGUpIHsKLQkJLy8gV2lsbCB0aGlzIGtleSBjb2RlIGJlIHRydW5jYXRlZD8KLQkJaWYgKGtleUNvZGUgPiAweEZGRkYpIHsKLQkJCXJldHVybiBrZXlDb2RlOwotCQl9Ci0KLQkJLy8gRG93bmNhc3QgaW4gc2FmZXR5LiBPbmx5IG1ha2UgY2hhcmFjdGVycyB1cHBlcmNhc2UuCi0JCWZpbmFsIGNoYXIgY2hhcmFjdGVyID0gKGNoYXIpIGtleUNvZGU7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNMZXR0ZXIoY2hhcmFjdGVyKSA/IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaGFyYWN0ZXIpCi0JCQkJOiBrZXlDb2RlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5ldmVyIGJlIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU1dUS2V5U3VwcG9ydCgpIHsKLQkJLy8gVGhpcyBjbGFzcyBzaG91bGQgbmV2ZXIgYmUgaW5zdGFudGlhdGVkLgotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvZm9ybWF0dGluZy9BYnN0cmFjdEtleUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL0Fic3RyYWN0S2V5Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZmUwMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL0Fic3RyYWN0S2V5Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5mb3JtYXR0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5JS2V5TG9va3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5TG9va3VwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVXRpbDsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEga2V5IGZvcm1hdHRlciB0aGF0IHByb3ZpZGVzIGEgbG90IG9mIGNvbW1vbgotICoga2V5IGZvcm1hdHRpbmcgZnVuY3Rpb25hbGl0eS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKLSAqIDxjb2RlPklLZXlGb3JtYXR0ZXI8L2NvZGU+IHN1YmNsYXNzIGZyb20gaGVyZSwgcmF0aGVyIHRoYW4gaW1wbGVtZW50aW5nCi0gKiA8Y29kZT5JS2V5Rm9ybWF0dGVyPC9jb2RlPiBkaXJlY3RseS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RLZXlGb3JtYXR0ZXIgaW1wbGVtZW50cyBJS2V5Rm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIHRoZSBkZWxpbWl0ZXIgYmV0d2VlbiBrZXlzLiBUaGlzIGlzIHVzZWQgaW4gdGhlCi0JICogaW50ZXJuYXRpb25hbGl6YXRpb24gYnVuZGxlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVMSU1JVEVSX0tFWSA9ICJLRVlfREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGtleSBmb3IgdGhlIGRlbGltaXRlciBiZXR3ZWVuIGtleSBzdHJva2VzLiBUaGlzIGlzIHVzZWQgaW4gdGhlCi0JICogaW50ZXJuYXRpb25hbGl6YXRpb24gYnVuZGxlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RST0tFX0RFTElNSVRFUl9LRVkgPSAiS0VZX1NUUk9LRV9ERUxJTUlURVIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBlbXB0eSBpbnRlZ2VyIGFycmF5IHRoYXQgY2FuIGJlIHVzZWQgaW4KLQkgKiA8Y29kZT5zb3J0TW9kaWZpZXJLZXlzKGludCk8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gTk9fTU9ESUZJRVJfS0VZUyA9IG5ldyBpbnRbMF07Ci0KLQkvKioKLQkgKiBUaGUgYnVuZGxlIGluIHdoaWNoIHRvIGxvb2sgdXAgdGhlIGludGVybmF0aW9uYWxpemVkIHRleHQgZm9yIGFsbCBvZiB0aGUKLQkgKiBpbmRpdmlkdWFsIGtleXMgaW4gdGhlIHN5c3RlbS4gVGhpcyBpcyB0aGUgcGxhdGZvcm0tYWdub3N0aWMgdmVyc2lvbiBvZgotCSAqIHRoZSBpbnRlcm5hdGlvbmFsaXplZCBzdHJpbmdzLiBTb21lIHBsYXRmb3JtcyAobmFtZWx5IENhcmJvbikgcHJvdmlkZQotCSAqIHNwZWNpYWwgVW5pY29kZSBjaGFyYWN0ZXJzIGFuZCBnbHlwaHMgZm9yIHNvbWUga2V5cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShBYnN0cmFjdEtleUZvcm1hdHRlci5jbGFzcy5nZXROYW1lKCkpOwotCi0JLyoqCi0JICogVGhlIGtleXMgaW4gdGhlIHJlc291cmNlIGJ1bmRsZS4gVGhpcyBpcyB1c2VkIHRvIGF2b2lkIG1pc3NpbmcgcmVzb3VyY2UKLQkgKiBleGNlcHRpb25zIHdoZW4gdGhleSBhcmVuJ3QgbmVjZXNzYXJ5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNldCByZXNvdXJjZUJ1bmRsZUtleXMgPSBuZXcgSGFzaFNldCgpOwotCi0Jc3RhdGljIHsKLQkJZmluYWwgRW51bWVyYXRpb24ga2V5RW51bWVyYXRpb24gPSBSRVNPVVJDRV9CVU5ETEUuZ2V0S2V5cygpOwotCQl3aGlsZSAoa2V5RW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWZpbmFsIE9iamVjdCBlbGVtZW50ID0ga2V5RW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQkJCXJlc291cmNlQnVuZGxlS2V5cy5hZGQoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXNLZXlGb3JtYXR0ZXIjZm9ybWF0KG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2UpCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXQoZmluYWwgaW50IGtleSkgewotCQlmaW5hbCBJS2V5TG9va3VwIGxvb2t1cCA9IEtleUxvb2t1cEZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGxvb2t1cC5mb3JtYWxOYW1lTG9va3VwKGtleSk7Ci0KLQkJaWYgKHJlc291cmNlQnVuZGxlS2V5cy5jb250YWlucyhuYW1lKSkgewotCQkJcmV0dXJuIFV0aWwudHJhbnNsYXRlU3RyaW5nKFJFU09VUkNFX0JVTkRMRSwgbmFtZSwgbmFtZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlGb3JtYXR0ZXIjZm9ybWF0KG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2UpCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXQoS2V5U2VxdWVuY2Uga2V5U2VxdWVuY2UpIHsKLQkJU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmaW5hbCBLZXlTdHJva2VbXSBrZXlTdHJva2VzID0ga2V5U2VxdWVuY2UuZ2V0S2V5U3Ryb2tlcygpOwotCQlmaW5hbCBpbnQga2V5U3Ryb2tlc0xlbmd0aCA9IGtleVN0cm9rZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleVN0cm9rZXNMZW5ndGg7IGkrKykgewotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmb3JtYXQoa2V5U3Ryb2tlc1tpXSkpOwotCi0JCQlpZiAoaSArIDEgPCBrZXlTdHJva2VzTGVuZ3RoKSB7Ci0JCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChnZXRLZXlTdHJva2VEZWxpbWl0ZXIoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleUZvcm1hdHRlciNmb3JtYXRLZXlTdHJva2Uob3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTdHJva2UpCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXQoZmluYWwgS2V5U3Ryb2tlIGtleVN0cm9rZSkgewotCQlmaW5hbCBTdHJpbmcga2V5RGVsaW1pdGVyID0gZ2V0S2V5RGVsaW1pdGVyKCk7Ci0KLQkJLy8gRm9ybWF0IHRoZSBtb2RpZmllciBrZXlzLCBpbiBzb3J0ZWQgb3JkZXIuCi0JCWZpbmFsIGludCBtb2RpZmllcktleXMgPSBrZXlTdHJva2UuZ2V0TW9kaWZpZXJLZXlzKCk7Ci0JCWZpbmFsIGludFtdIHNvcnRlZE1vZGlmaWVyS2V5cyA9IHNvcnRNb2RpZmllcktleXMobW9kaWZpZXJLZXlzKTsKLQkJZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHNvcnRlZE1vZGlmaWVyS2V5cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvcnRlZE1vZGlmaWVyS2V5cy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIGludCBtb2RpZmllcktleSA9IHNvcnRlZE1vZGlmaWVyS2V5c1tpXTsKLQkJCQlpZiAobW9kaWZpZXJLZXkgIT0gS2V5U3Ryb2tlLk5PX0tFWSkgewotCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZvcm1hdChtb2RpZmllcktleSkpOwotCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGtleURlbGltaXRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gRm9ybWF0IHRoZSBuYXR1cmFsIGtleSwgaWYgYW55LgotCQlmaW5hbCBpbnQgbmF0dXJhbEtleSA9IGtleVN0cm9rZS5nZXROYXR1cmFsS2V5KCk7Ci0JCWlmIChuYXR1cmFsS2V5ICE9IDApIHsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZm9ybWF0KG5hdHVyYWxLZXkpKTsKLQkJfQotCi0JCXJldHVybiBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKLQotCX0KLQotCS8qKgotCSAqIEFuIGFjY2Vzc29yIGZvciB0aGUgZGVsaW1pdGVyIHlvdSB3aXNoIHRvIHVzZSBiZXR3ZWVuIGtleXMuIFRoaXMgaXMgdXNlZAotCSAqIGJ5IHRoZSBkZWZhdWx0IGZvcm1hdCBpbXBsZW1lbnRhdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBrZXkgZGVsaW1pdGVyLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGRlbGltaXRlciB0byB1c2UgYmV0d2VlbiBrZXlzOyBzaG91bGQgbm90IGJlCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEtleURlbGltaXRlcigpOwotCi0JLyoqCi0JICogQW4gYWNjZXNzb3IgZm9yIHRoZSBkZWxpbWl0ZXIgeW91IHdpc2ggdG8gdXNlIGJldHdlZW4ga2V5IHN0cm9rZXMuIFRoaXMKLQkgKiB1c2VkIGJ5IHRoZSBkZWZhdWx0IGZvcm1hdCBpbXBsZW1lbnRhdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBrZXkgc3Ryb2tlCi0JICogZGVsaW1pdGVyLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGRlbGltaXRlciB0byB1c2UgYmV0d2VlbiBrZXkgc3Ryb2tlczsgc2hvdWxkIG5vdCBiZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRLZXlTdHJva2VEZWxpbWl0ZXIoKTsKLQotCS8qKgotCSAqIFNlcGFyYXRlcyB0aGUgbW9kaWZpZXIga2V5cyBmcm9tIGVhY2ggb3RoZXIsIGFuZCB0aGVuIHBsYWNlcyB0aGVtIGluIGFuCi0JICogYXJyYXkgaW4gc29tZSBzb3J0ZWQgb3JkZXIuIFRoZSBzb3J0IG9yZGVyIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSBvZgotCSAqIGZvcm1hdHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZXJLZXlzCi0JICogICAgICAgICAgICBUaGUgbW9kaWZpZXIga2V5cyBmcm9tIHRoZSBrZXkgc3Ryb2tlLgotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgbW9kaWZpZXIga2V5IHZhbHVlcyAtLSBzZXBhcmF0ZWQgYW5kIHNvcnRlZCBpbiBzb21lCi0JICogICAgICAgICBvcmRlci4gQW55IHZhbHVlcyBpbiB0aGlzIGFycmF5IHRoYXQgYXJlCi0JICogICAgICAgICA8Y29kZT5LZXlTdHJva2UuTk9fS0VZPC9jb2RlPiBzaG91bGQgYmUgaWdub3JlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50W10gc29ydE1vZGlmaWVyS2V5cyhmaW5hbCBpbnQgbW9kaWZpZXJLZXlzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvZm9ybWF0dGluZy9BYnN0cmFjdEtleUZvcm1hdHRlci5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL0Fic3RyYWN0S2V5Rm9ybWF0dGVyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDljOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL0Fic3RyYWN0S2V5Rm9ybWF0dGVyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTW9kaWZpZXIga2V5cwotQUxUPUFsdAotQ09NTUFORD1Db21tYW5kCi1DVFJMPUN0cmwKLVNISUZUPVNoaWZ0Ci0KLSMgU3BlY2lhbCBrZXlzCi1BUlJPV19ET1dOPURvd24KLUFSUk9XX0xFRlQ9TGVmdAotQVJST1dfUklHSFQ9UmlnaHQKLUFSUk9XX1VQPVVwCi1CUkVBSz1CcmVhawotQ0FQU19MT0NLPUNhcHNMb2NrCi1FTkQ9RW5kCi1GMT1GMQotRjEwPUYxMAotRjExPUYxMQotRjEyPUYxMgotRjI9RjIKLUYzPUYzCi1GND1GNAotRjU9RjUKLUY2PUY2Ci1GNz1GNwotRjg9RjgKLUY5PUY5Ci1IT01FPUhvbWUKLUlOU0VSVD1JbnNlcnQKLU5VTV9MT0NLPU51bUxvY2sKLU5VTVBBRF8wPU51bXBhZF8wCi1OVU1QQURfMT1OdW1wYWRfMQotTlVNUEFEXzI9TnVtcGFkXzIKLU5VTVBBRF8zPU51bXBhZF8zCi1OVU1QQURfND1OdW1wYWRfNAotTlVNUEFEXzU9TnVtcGFkXzUKLU5VTVBBRF82PU51bXBhZF82Ci1OVU1QQURfNz1OdW1wYWRfNwotTlVNUEFEXzg9TnVtcGFkXzgKLU5VTVBBRF85PU51bXBhZF85Ci1OVU1QQURfQUREPU51bXBhZF9BZGQKLU5VTVBBRF9ERUNJTUFMPU51bXBhZF9EZWNpbWFsCi1OVU1QQURfRElWSURFPU51bXBhZF9EaXZpZGUKLU5VTVBBRF9FTlRFUj1OdW1wYWRfRW50ZXIKLU5VTVBBRF9FUVVBTD1OdW1wYWRfRXF1YWwKLU5VTVBBRF9NVUxUSVBMWT1OdW1wYWRfTXVsdGlwbHkKLU5VTVBBRF9TVUJUUkFDVD1OdW1wYWRfU3VidHJhY3QKLVBBR0VfRE9XTj1QYWdlRG93bgotUEFHRV9VUD1QYWdlVXAKLVBBVVNFPVBhdXNlCi1QUklOVF9TQ1JFRU49UHJpbnRTY3JlZW4KLVNDUk9MTF9MT0NLPVNjcm9sbExvY2sKLQotIyBDaGFyYWN0ZXIga2V5cwotQlM9QmFja3NwYWNlCi1DUj1FbnRlcgotREVMPURlbGV0ZQotRVNDPUVzYwotRkY9Rm9ybUZlZWQKLUxGPUxpbmVGZWVkCi1OVUw9TnVsbAotU1BBQ0U9U3BhY2UKLVRBQj1UYWIKLVZUPVZlcnRpY2FsVGFiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL2Zvcm1hdHRpbmcvRW1hY3NLZXlGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvZm9ybWF0dGluZy9FbWFjc0tleUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjIyZDNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvZm9ybWF0dGluZy9FbWFjc0tleUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuZm9ybWF0dGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuSUtleUxvb2t1cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleUxvb2t1cEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlV0aWw7Ci0KLS8qKgotICogPHA+Ci0gKiBBIGtleSBmb3JtYXR0ZXIgcHJvdmlkaW5nIHRoZSBFbWFjcy1zdHlsZSBhY2NlbGVyYXRvcnMgdXNpbmcgc2luZ2xlIGxldHRlcnMKLSAqIHRvIHJlcHJlc2VudCB0aGUgbW9kaWZpZXIga2V5cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1hY3NLZXlGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdEtleUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgPGNvZGU+Zm9ybWF0KCk8L2NvZGU+IHRvIHRyYW5zbGF0ZSBmb3JtYWwKLQkgKiBzdHJpbmcgcmVwcmVzZW50YXRpb25zIGJ5IGxvY2FsZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShFbWFjc0tleUZvcm1hdHRlci5jbGFzcy5nZXROYW1lKCkpOwotCi0JLyoqCi0JICogRm9ybWF0cyBhbiBpbmRpdmlkdWFsIGtleSBpbnRvIGEgaHVtYW4gcmVhZGFibGUgZm9ybWF0LiBUaGlzIGNvbnZlcnRzIHRoZQotCSAqIGtleSBpbnRvIGEgZm9ybWF0IHNpbWlsYXIgdG8gWGVtYWNzLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBrZXkgdG8gZm9ybWF0OyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIFRoZSBrZXkgZm9ybWF0dGVkIGFzIGEgc3RyaW5nOyBzaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZm9ybWF0KGZpbmFsIGludCBrZXkpIHsKLQkJZmluYWwgSUtleUxvb2t1cCBsb29rdXAgPSBLZXlMb29rdXBGYWN0b3J5LmdldERlZmF1bHQoKTsKLQkJaWYgKGxvb2t1cC5pc01vZGlmaWVyS2V5KGtleSkpIHsKLQkJCVN0cmluZyBmb3JtYXR0ZWROYW1lID0gVXRpbC50cmFuc2xhdGVTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBsb29rdXAKLQkJCQkJLmZvcm1hbE5hbWVMb29rdXAoa2V5KSwgbnVsbCk7Ci0JCQlpZiAoZm9ybWF0dGVkTmFtZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZvcm1hdHRlZE5hbWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZm9ybWF0KGtleSkudG9Mb3dlckNhc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuQWJzdHJhY3RLZXlGb3JtYXR0ZXIjZ2V0S2V5RGVsaW1pdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEtleURlbGltaXRlcigpIHsKLQkJcmV0dXJuIFV0aWwudHJhbnNsYXRlU3RyaW5nKFJFU09VUkNFX0JVTkRMRSwgS0VZX0RFTElNSVRFUl9LRVksCi0JCQkJS2V5U3Ryb2tlLktFWV9ERUxJTUlURVIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5BYnN0cmFjdEtleUZvcm1hdHRlciNnZXRLZXlTdHJva2VEZWxpbWl0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5U3Ryb2tlRGVsaW1pdGVyKCkgewotCQlyZXR1cm4gVXRpbC50cmFuc2xhdGVTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBLRVlfU1RST0tFX0RFTElNSVRFUl9LRVksCi0JCQkJS2V5U2VxdWVuY2UuS0VZX1NUUk9LRV9ERUxJTUlURVIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5BYnN0cmFjdEtleUZvcm1hdHRlciNzb3J0TW9kaWZpZXJLZXlzKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50W10gc29ydE1vZGlmaWVyS2V5cyhpbnQgbW9kaWZpZXJLZXlzKSB7Ci0JCWZpbmFsIElLZXlMb29rdXAgbG9va3VwID0gS2V5TG9va3VwRmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0JCWZpbmFsIGludFtdIHNvcnRlZEtleXMgPSBuZXcgaW50WzRdOwotCQlpbnQgaW5kZXggPSAwOwotCi0JCWlmICgobW9kaWZpZXJLZXlzICYgbG9va3VwLmdldEFsdCgpKSAhPSAwKSB7Ci0JCQlzb3J0ZWRLZXlzW2luZGV4KytdID0gbG9va3VwLmdldEFsdCgpOwotCQl9Ci0JCWlmICgobW9kaWZpZXJLZXlzICYgbG9va3VwLmdldENvbW1hbmQoKSkgIT0gMCkgewotCQkJc29ydGVkS2V5c1tpbmRleCsrXSA9IGxvb2t1cC5nZXRDb21tYW5kKCk7Ci0JCX0KLQkJaWYgKChtb2RpZmllcktleXMgJiBsb29rdXAuZ2V0Q3RybCgpKSAhPSAwKSB7Ci0JCQlzb3J0ZWRLZXlzW2luZGV4KytdID0gbG9va3VwLmdldEN0cmwoKTsKLQkJfQotCQlpZiAoKG1vZGlmaWVyS2V5cyAmIGxvb2t1cC5nZXRTaGlmdCgpKSAhPSAwKSB7Ci0JCQlzb3J0ZWRLZXlzW2luZGV4KytdID0gbG9va3VwLmdldFNoaWZ0KCk7Ci0JCX0KLQotCQlyZXR1cm4gc29ydGVkS2V5czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL2Zvcm1hdHRpbmcvRW1hY3NLZXlGb3JtYXR0ZXIucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvZm9ybWF0dGluZy9FbWFjc0tleUZvcm1hdHRlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTUyOWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvZm9ybWF0dGluZy9FbWFjc0tleUZvcm1hdHRlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIE1vZGlmaWVyIGtleXMKLUFMVD1NCi1DT01NQU5EPUQKLUNUUkw9QwotU0hJRlQ9UwotCi0jIERlbGltaXRlcnMKLUtFWV9ERUxJTUlURVI9LQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL0Zvcm1hbEtleUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL0Zvcm1hbEtleUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2Y4NWU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvZm9ybWF0dGluZy9Gb3JtYWxLZXlGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuZm9ybWF0dGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuSUtleUxvb2t1cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleUxvb2t1cEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVN0cm9rZTsKLQotLyoqCi0gKiA8cD4KLSAqIEZvcm1hdHMgdGhlIGtleXMgaW4gdGhlIGludGVybmFsIGtleSBzZXF1ZW5jZSBncmFtbWFyLiBUaGlzIGlzIHVzZWQgZm9yCi0gKiBwZXJzaXN0ZW5jZSwgYW5kIGlzIG5vdCByZWFsbHkgaW50ZW5kZWQgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZvcm1hbEtleUZvcm1hdHRlciBleHRlbmRzIEFic3RyYWN0S2V5Rm9ybWF0dGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlGb3JtYXR0ZXIjZm9ybWF0KG9yZy5lY2xpcHNlLnVpLmtleXMuS2V5U2VxdWVuY2UpCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXQoZmluYWwgaW50IGtleSkgewotCQlmaW5hbCBJS2V5TG9va3VwIGxvb2t1cCA9IEtleUxvb2t1cEZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gbG9va3VwLmZvcm1hbE5hbWVMb29rdXAoa2V5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuQWJzdHJhY3RLZXlGb3JtYXR0ZXIjZ2V0S2V5RGVsaW1pdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEtleURlbGltaXRlcigpIHsKLQkJcmV0dXJuIEtleVN0cm9rZS5LRVlfREVMSU1JVEVSOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5BYnN0cmFjdEtleUZvcm1hdHRlciNnZXRLZXlTdHJva2VEZWxpbWl0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5U3Ryb2tlRGVsaW1pdGVyKCkgewotCQlyZXR1cm4gS2V5U2VxdWVuY2UuS0VZX1NUUk9LRV9ERUxJTUlURVI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLkFic3RyYWN0S2V5Rm9ybWF0dGVyI3NvcnRNb2RpZmllcktleXMoaW50KQotCSAqLwotCXByb3RlY3RlZCBpbnRbXSBzb3J0TW9kaWZpZXJLZXlzKGZpbmFsIGludCBtb2RpZmllcktleXMpIHsKLQkJZmluYWwgSUtleUxvb2t1cCBsb29rdXAgPSBLZXlMb29rdXBGYWN0b3J5LmdldERlZmF1bHQoKTsKLQkJZmluYWwgaW50W10gc29ydGVkS2V5cyA9IG5ldyBpbnRbNF07Ci0JCWludCBpbmRleCA9IDA7Ci0KLQkJaWYgKChtb2RpZmllcktleXMgJiBsb29rdXAuZ2V0QWx0KCkpICE9IDApIHsKLQkJCXNvcnRlZEtleXNbaW5kZXgrK10gPSBsb29rdXAuZ2V0QWx0KCk7Ci0JCX0KLQkJaWYgKChtb2RpZmllcktleXMgJiBsb29rdXAuZ2V0Q29tbWFuZCgpKSAhPSAwKSB7Ci0JCQlzb3J0ZWRLZXlzW2luZGV4KytdID0gbG9va3VwLmdldENvbW1hbmQoKTsKLQkJfQotCQlpZiAoKG1vZGlmaWVyS2V5cyAmIGxvb2t1cC5nZXRDdHJsKCkpICE9IDApIHsKLQkJCXNvcnRlZEtleXNbaW5kZXgrK10gPSBsb29rdXAuZ2V0Q3RybCgpOwotCQl9Ci0JCWlmICgobW9kaWZpZXJLZXlzICYgbG9va3VwLmdldFNoaWZ0KCkpICE9IDApIHsKLQkJCXNvcnRlZEtleXNbaW5kZXgrK10gPSBsb29rdXAuZ2V0U2hpZnQoKTsKLQkJfQotCi0JCXJldHVybiBzb3J0ZWRLZXlzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvZm9ybWF0dGluZy9JS2V5Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL2Zvcm1hdHRpbmcvSUtleUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmM4NzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvZm9ybWF0dGluZy9JS2V5Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLmZvcm1hdHRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U3Ryb2tlOwotCi0vKioKLSAqIDxwPgotICogQW55IGZvcm1hdHRlciBjYXBhYmxlIG9mIHRha2luZyBhIGtleSBzZXF1ZW5jZSBvciBhIGtleSBzdHJva2UgYW5kIGNvbnZlcnRpbmcKLSAqIGl0IGludG8gYSBzdHJpbmcuIFRoZXNlIGZvcm1hdHRlcnMgYXJlIHVzZWQgdG8gcHJvZHVjZSB0aGUgc3RyaW5ncyB0aGF0IHRoZQotICogdXNlciBzZWVzIGluIHRoZSBrZXlzIHByZWZlcmVuY2UgcGFnZSBhbmQgdGhlIG1lbnVzLCBhcyB3ZWxsIGFzIHRoZSBzdHJpbmdzCi0gKiB0aGF0IGFyZSB1c2VkIGZvciBwZXJzaXN0ZW50IHN0b3JhZ2UuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJS2V5Rm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIEZvcm1hdHMgYW4gaW5kaXZpZHVhbCBrZXkgaW50byBhIGh1bWFuIHJlYWRhYmxlIGZvcm1hdC4gVGhpcyB1c2VzIGFuCi0JICogaW50ZXJuYXRpb25hbGl6YXRpb24gcmVzb3VyY2UgYnVuZGxlIHRvIGxvb2sgdXAgdGhlIGtleS4gVGhpcyBkb2VzIG5vdCBkbwotCSAqIGFueSBwbGF0Zm9ybS1zcGVjaWZpYyBmb3JtYXR0aW5nIChlLmcuLCBDYXJib24ncyBjb21tYW5kIGNoYXJhY3RlcikuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIGtleSB0byBmb3JtYXQuCi0JICogQHJldHVybiBUaGUga2V5IGZvcm1hdHRlZCBhcyBhIHN0cmluZzsgc2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlTdHJpbmcgZm9ybWF0KGludCBrZXkpOwotCi0JLyoqCi0JICogRm9ybWF0IHRoZSBnaXZlbiBrZXkgc2VxdWVuY2UgaW50byBhIHN0cmluZy4gVGhlIG1hbm5lciBvZiB0aGUgY29udmVyc2lvbgotCSAqIGlzIGRlcGVuZGVudCBvbiB0aGUgZm9ybWF0dGVyLiBJdCBpcyByZXF1aXJlZCB0aGF0IHVuZXF1YWwga2V5IHNlcXVlbmNlcwotCSAqIHJldHVybiB1bmVxdWFsIHN0cmluZ3MuCi0JICogCi0JICogQHBhcmFtIGtleVNlcXVlbmNlCi0JICogICAgICAgICAgICBUaGUga2V5IHNlcXVlbmNlIHRvIGNvbnZlcnQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtleSBzZXF1ZW5jZTsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCVN0cmluZyBmb3JtYXQoS2V5U2VxdWVuY2Uga2V5U2VxdWVuY2UpOwotCi0JLyoqCi0JICogRm9ybWF0IHRoZSBnaXZlbiBrZXkgc3Ryb2tlcyBpbnRvIGEgc3RyaW5nLiBUaGUgbWFubmVyIG9mIHRoZSBjb252ZXJzaW9uCi0JICogaXMgZGVwZW5kZW50IG9uIHRoZSBmb3JtYXR0ZXIuIEl0IGlzIHJlcXVpcmVkIHRoYXQgdW5lcXVhbCBrZXkgc3Ryb2tlcwotCSAqIHJldHVybiB1bmVxdWFsIHN0cmluZ3MuCi0JICogCi0JICogQHBhcmFtIGtleVN0cm9rZQotCSAqICAgICAgICAgICAgVGhlIGtleSBzdHJva2UgdG8gY29udmVydDsgbXVzdCBub3QgYmUgPENvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUga2V5IHN0cm9rZTsgbXVzdCBub3QgYmUgPGNvZGU+Ci0JICogICAgICAgICBudWxsPC9jb2RlPgotCSAqLwotCVN0cmluZyBmb3JtYXQoS2V5U3Ryb2tlIGtleVN0cm9rZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL2Zvcm1hdHRpbmcvS2V5Rm9ybWF0dGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL0tleUZvcm1hdHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY5NjljZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL2Zvcm1hdHRpbmcvS2V5Rm9ybWF0dGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5mb3JtYXR0aW5nOwotCi0KLQotLyoqCi0gKiA8cD4KLSAqIEEgY2FjaGUgZm9yIGZvcm1hdHRlcnMuIEl0IGtlZXBzIGEgZmV3IGluc3RhbmNlcyBvZiBwcmUtZGVmaW5lZCBpbnN0YW5jZXMgb2YKLSAqIDxjb2RlPklLZXlGb3JtYXR0ZXI8L2NvZGU+IGF2YWlsYWJsZSBmb3IgdXNlLiBJdCBhbHNvIGFsbG93cyB0aGUgZGVmYXVsdAotICogZm9ybWF0dGVyIHRvIGJlIGNoYW5nZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5mb3JtYXR0aW5nLklLZXlGb3JtYXR0ZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEtleUZvcm1hdHRlckZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICogVGhlIGZvcm1hdHRlciB0aGF0IHJlbmRlcnMga2V5IGJpbmRpbmdzIGluIGEgcGxhdGZvcm0tZGVwZW5kZW50IG1hbm5lci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJS2V5Rm9ybWF0dGVyIEZPUk1BTF9LRVlfRk9STUFUVEVSID0gbmV3IEZvcm1hbEtleUZvcm1hdHRlcigpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZvcm1hdHRlciB0aGF0IHJlbmRlcnMga2V5IGJpbmRpbmdzIGluIGEgZm9ybSBzaW1pbGFyIHRvIFhFbWFjcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElLZXlGb3JtYXR0ZXIgRU1BQ1NfS0VZX0ZPUk1BVFRFUiA9IG5ldyBFbWFjc0tleUZvcm1hdHRlcigpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgZm9ybWF0dGVyLiBUaGlzIGlzIG5vcm1hbGx5IHRoZSBmb3JtYWwga2V5IGZvcm1hdHRlciwgYnV0IGNhbgotICAgICAqIGJlIGNoYW5nZWQgYnkgdXNlcnMgb2YgdGhpcyBBUEkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUtleUZvcm1hdHRlciBkZWZhdWx0S2V5Rm9ybWF0dGVyID0gRk9STUFMX0tFWV9GT1JNQVRURVI7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBhY2Nlc3NvciBmb3IgdGhlIGN1cnJlbnQgZGVmYXVsdCBrZXkgZm9ybWF0dGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgZm9ybWF0dGVyOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElLZXlGb3JtYXR0ZXIgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRLZXlGb3JtYXR0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvdmlkZXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+RW1hY3NLZXlGb3JtYXR0ZXI8L2NvZGU+LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIFhlbWFjcyBmb3JtYXR0ZXI7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSUtleUZvcm1hdHRlciBnZXRFbWFjc0tleUZvcm1hdHRlcigpIHsKLSAgICAgICAgcmV0dXJuIEVNQUNTX0tFWV9GT1JNQVRURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvdmlkZXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+Rm9ybWFsS2V5Rm9ybWF0dGVyPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYWwgZm9ybWF0dGVyOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElLZXlGb3JtYXR0ZXIgZ2V0Rm9ybWFsS2V5Rm9ybWF0dGVyKCkgewotICAgICAgICByZXR1cm4gRk9STUFMX0tFWV9GT1JNQVRURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCBrZXkgZm9ybWF0dGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkZWZhdWx0S2V5Rm9ybWF0dGVyCi0gICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCBrZXkgZm9ybWF0dGVyLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0RGVmYXVsdChmaW5hbCBJS2V5Rm9ybWF0dGVyIGRlZmF1bHRLZXlGb3JtYXR0ZXIpIHsKLSAgICAgICAgaWYgKGRlZmF1bHRLZXlGb3JtYXR0ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0gICAgICAgIEtleUZvcm1hdHRlckZhY3RvcnkuZGVmYXVsdEtleUZvcm1hdHRlciA9IGRlZmF1bHRLZXlGb3JtYXR0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEtleUZvcm1hdHRlckZhY3RvcnkoKSB7Ci0gICAgICAgIC8vIE5vdCB0byBiZSBjb25zdHJ1Y3RyZWQuCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL05hdGl2ZUtleUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL05hdGl2ZUtleUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzg4ZGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvZm9ybWF0dGluZy9OYXRpdmVLZXlGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLmZvcm1hdHRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLklLZXlMb29rdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlMb29rdXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTdHJva2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogPHA+Ci0gKiBGb3JtYXRzIHRoZSBrZXkgc2VxdWVuY2VzIGFuZCBrZXkgc3Ryb2tlcyBpbnRvIHRoZSBuYXRpdmUgaHVtYW4tcmVhZGFibGUKLSAqIGZvcm1hdC4gVGhpcyBpcyB0eXBpY2FsbHkgd2hhdCB5b3Ugd291bGQgc2VlIG9uIHRoZSBtZW51cyBmb3IgdGhlIGdpdmVuCi0gKiBwbGF0Zm9ybSBhbmQgbG9jYWxlLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOYXRpdmVLZXlGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdEtleUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiBUaGUga2V5IGludG8gdGhlIGludGVybmF0aW9uYWxpemF0aW9uIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIGRlbGltaXRlcgotCSAqIHRvIHVzZSBiZXR3ZWVuIGtleXMgKG9uIHRoZSBDYXJib24gcGxhdGZvcm0pLgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDQVJCT05fS0VZX0RFTElNSVRFUl9LRVkgPSAiQ0FSQk9OX0tFWV9ERUxJTUlURVIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGxvb2stdXAgdGFibGUgZm9yIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHZhcmlvdXMgY2FyYm9uIGtleXMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFzaE1hcCBDQVJCT05fS0VZX0xPT0tfVVAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogVGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IDxjb2RlPmZvcm1hdCgpPC9jb2RlPiB0byB0cmFuc2xhdGUgZm9ybWFsCi0JICogc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBieSBsb2NhbGUuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFOwotCi0JLyoqCi0JICogVGhlIGtleSBpbnRvIHRoZSBpbnRlcm5hdGlvbmFsaXphdGlvbiByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBkZWxpbWl0ZXIKLQkgKiB0byB1c2UgYmV0d2VlbiBrZXkgc3Ryb2tlcyAob24gdGhlIFdpbjMyIHBsYXRmb3JtKS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgV0lOMzJfS0VZX1NUUk9LRV9ERUxJTUlURVJfS0VZID0gIldJTjMyX0tFWV9TVFJPS0VfREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKE5hdGl2ZUtleUZvcm1hdHRlci5jbGFzcwotCQkJCS5nZXROYW1lKCkpOwotCi0JCWZpbmFsIFN0cmluZyBjYXJib25CYWNrc3BhY2UgPSAiXHUyMzJCIjsgLy8kTk9OLU5MUy0xJAotCQlDQVJCT05fS0VZX0xPT0tfVVAucHV0KElLZXlMb29rdXAuQlNfTkFNRSwgY2FyYm9uQmFja3NwYWNlKTsKLQkJQ0FSQk9OX0tFWV9MT09LX1VQLnB1dChJS2V5TG9va3VwLkJBQ0tTUEFDRV9OQU1FLCBjYXJib25CYWNrc3BhY2UpOwotCQlDQVJCT05fS0VZX0xPT0tfVVAKLQkJCQkucHV0KElLZXlMb29rdXAuQ1JfTkFNRSwgIlx1MjFBOSIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBjYXJib25EZWxldGUgPSAiXHUyMzI2IjsgLy8kTk9OLU5MUy0xJAotCQlDQVJCT05fS0VZX0xPT0tfVVAucHV0KElLZXlMb29rdXAuREVMX05BTUUsIGNhcmJvbkRlbGV0ZSk7Ci0JCUNBUkJPTl9LRVlfTE9PS19VUC5wdXQoSUtleUxvb2t1cC5ERUxFVEVfTkFNRSwgY2FyYm9uRGVsZXRlKTsKLQkJQ0FSQk9OX0tFWV9MT09LX1VQLnB1dChJS2V5TG9va3VwLlNQQUNFX05BTUUsICJcdTI0MjMiKTsgLy8kTk9OLU5MUy0xJAotCQlDQVJCT05fS0VZX0xPT0tfVVAucHV0KElLZXlMb29rdXAuQUxUX05BTUUsICJcdTIzMjUiKTsgLy8kTk9OLU5MUy0xJAotCQlDQVJCT05fS0VZX0xPT0tfVVAucHV0KElLZXlMb29rdXAuQ09NTUFORF9OQU1FLCAiXHUyMzE4Iik7IC8vJE5PTi1OTFMtMSQKLQkJQ0FSQk9OX0tFWV9MT09LX1VQLnB1dChJS2V5TG9va3VwLkNUUkxfTkFNRSwgIlx1MjMwMyIpOyAvLyROT04tTkxTLTEkCi0JCUNBUkJPTl9LRVlfTE9PS19VUC5wdXQoSUtleUxvb2t1cC5TSElGVF9OQU1FLCAiXHUyMUU3Iik7IC8vJE5PTi1OTFMtMSQKLQkJQ0FSQk9OX0tFWV9MT09LX1VQLnB1dChJS2V5TG9va3VwLkFSUk9XX0RPV05fTkFNRSwgIlx1MjE5MyIpOyAvLyROT04tTkxTLTEkCi0JCUNBUkJPTl9LRVlfTE9PS19VUC5wdXQoSUtleUxvb2t1cC5BUlJPV19MRUZUX05BTUUsICJcdTIxOTAiKTsgLy8kTk9OLU5MUy0xJAotCQlDQVJCT05fS0VZX0xPT0tfVVAucHV0KElLZXlMb29rdXAuQVJST1dfUklHSFRfTkFNRSwgIlx1MjE5MiIpOyAvLyROT04tTkxTLTEkCi0JCUNBUkJPTl9LRVlfTE9PS19VUC5wdXQoSUtleUxvb2t1cC5BUlJPV19VUF9OQU1FLCAiXHUyMTkxIik7IC8vJE5PTi1OTFMtMSQKLQkJQ0FSQk9OX0tFWV9MT09LX1VQLnB1dChJS2V5TG9va3VwLkVORF9OQU1FLCAiXHUyMTk4Iik7IC8vJE5PTi1OTFMtMSQKLQkJQ0FSQk9OX0tFWV9MT09LX1VQLnB1dChJS2V5TG9va3VwLk5VTVBBRF9FTlRFUl9OQU1FLCAiXHUyMzI0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQ0FSQk9OX0tFWV9MT09LX1VQLnB1dChJS2V5TG9va3VwLkhPTUVfTkFNRSwgIlx1MjE5NiIpOyAvLyROT04tTkxTLTEkCi0JCUNBUkJPTl9LRVlfTE9PS19VUC5wdXQoSUtleUxvb2t1cC5QQUdFX0RPV05fTkFNRSwgIlx1MjFERiIpOyAvLyROT04tTkxTLTEkCi0JCUNBUkJPTl9LRVlfTE9PS19VUC5wdXQoSUtleUxvb2t1cC5QQUdFX1VQX05BTUUsICJcdTIxREUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgYW4gaW5kaXZpZHVhbCBrZXkgaW50byBhIGh1bWFuIHJlYWRhYmxlIGZvcm1hdC4gVGhpcyB1c2VzIGFuCi0JICogaW50ZXJuYXRpb25hbGl6YXRpb24gcmVzb3VyY2UgYnVuZGxlIHRvIGxvb2sgdXAgdGhlIGtleS4gVGhpcyBkb2VzIHRoZQotCSAqIHBsYXRmb3JtLXNwZWNpZmljIGZvcm1hdHRpbmcgZm9yIENhcmJvbi4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUga2V5IHRvIGZvcm1hdC4KLQkgKiBAcmV0dXJuIFRoZSBrZXkgZm9ybWF0dGVkIGFzIGEgc3RyaW5nOyBzaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZm9ybWF0KGZpbmFsIGludCBrZXkpIHsKLQkJZmluYWwgSUtleUxvb2t1cCBsb29rdXAgPSBLZXlMb29rdXBGYWN0b3J5LmdldERlZmF1bHQoKTsKLQkJZmluYWwgU3RyaW5nIG5hbWUgPSBsb29rdXAuZm9ybWFsTmFtZUxvb2t1cChrZXkpOwotCi0JCS8vIFRPRE8gY29uc2lkZXIgcGxhdGZvcm0tc3BlY2lmaWMgcmVzb3VyY2UgYnVuZGxlcwotCQlpZiAoImNhcmJvbiIuZXF1YWxzKFNXVC5nZXRQbGF0Zm9ybSgpKSkgeyAvLyROT04tTkxTLTEkICAgIAkKLQkJCVN0cmluZyBmb3JtYXR0ZWROYW1lID0gKFN0cmluZykgQ0FSQk9OX0tFWV9MT09LX1VQLmdldChuYW1lKTsKLQkJCWlmIChmb3JtYXR0ZWROYW1lICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZm9ybWF0dGVkTmFtZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5mb3JtYXQoa2V5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuQWJzdHJhY3RLZXlGb3JtYXR0ZXIjZ2V0S2V5RGVsaW1pdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEtleURlbGltaXRlcigpIHsKLQkJLy8gV2UgbXVzdCBkbyB0aGUgbG9vayB1cCBldmVyeSB0aW1lLCBhcyBvdXIgbG9jYWxlIG1pZ2h0IGNoYW5nZS4KLQkJaWYgKCJjYXJib24iLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFV0aWwudHJhbnNsYXRlU3RyaW5nKFJFU09VUkNFX0JVTkRMRSwKLQkJCQkJQ0FSQk9OX0tFWV9ERUxJTUlURVJfS0VZLCBVdGlsLlpFUk9fTEVOR1RIX1NUUklORyk7Ci0JCX0KLQotCQlyZXR1cm4gVXRpbC50cmFuc2xhdGVTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBLRVlfREVMSU1JVEVSX0tFWSwKLQkJCQlLZXlTdHJva2UuS0VZX0RFTElNSVRFUik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLkFic3RyYWN0S2V5Rm9ybWF0dGVyI2dldEtleVN0cm9rZURlbGltaXRlcigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRLZXlTdHJva2VEZWxpbWl0ZXIoKSB7Ci0JCS8vIFdlIG11c3QgZG8gdGhlIGxvb2sgdXAgZXZlcnkgdGltZSwgYXMgb3VyIGxvY2FsZSBtaWdodCBjaGFuZ2UuCi0JCWlmICgid2luMzIiLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFV0aWwudHJhbnNsYXRlU3RyaW5nKFJFU09VUkNFX0JVTkRMRSwKLQkJCQkJV0lOMzJfS0VZX1NUUk9LRV9ERUxJTUlURVJfS0VZLAotCQkJCQlLZXlTZXF1ZW5jZS5LRVlfU1RST0tFX0RFTElNSVRFUik7Ci0JCX0KLQotCQlyZXR1cm4gVXRpbC50cmFuc2xhdGVTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBLRVlfU1RST0tFX0RFTElNSVRFUl9LRVksCi0JCQkJS2V5U2VxdWVuY2UuS0VZX1NUUk9LRV9ERUxJTUlURVIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5BYnN0cmFjdEtleUZvcm1hdHRlciNzb3J0TW9kaWZpZXJLZXlzKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50W10gc29ydE1vZGlmaWVyS2V5cyhmaW5hbCBpbnQgbW9kaWZpZXJLZXlzKSB7Ci0JCWZpbmFsIElLZXlMb29rdXAgbG9va3VwID0gS2V5TG9va3VwRmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0JCWZpbmFsIFN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotCQlmaW5hbCBpbnRbXSBzb3J0ZWRLZXlzID0gbmV3IGludFs0XTsKLQkJaW50IGluZGV4ID0gMDsKLQotCQlpZiAoIndpbjMyIi5lcXVhbHMocGxhdGZvcm0pKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICgobW9kaWZpZXJLZXlzICYgbG9va3VwLmdldEN0cmwoKSkgIT0gMCkgewotCQkJCXNvcnRlZEtleXNbaW5kZXgrK10gPSBsb29rdXAuZ2V0Q3RybCgpOwotCQkJfQotCQkJaWYgKChtb2RpZmllcktleXMgJiBsb29rdXAuZ2V0QWx0KCkpICE9IDApIHsKLQkJCQlzb3J0ZWRLZXlzW2luZGV4KytdID0gbG9va3VwLmdldEFsdCgpOwotCQkJfQotCQkJaWYgKChtb2RpZmllcktleXMgJiBsb29rdXAuZ2V0U2hpZnQoKSkgIT0gMCkgewotCQkJCXNvcnRlZEtleXNbaW5kZXgrK10gPSBsb29rdXAuZ2V0U2hpZnQoKTsKLQkJCX0KLQotCQl9IGVsc2UgaWYgKCJndGsiLmVxdWFscyhwbGF0Zm9ybSkgfHwgIm1vdGlmIi5lcXVhbHMocGxhdGZvcm0pKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKChtb2RpZmllcktleXMgJiBsb29rdXAuZ2V0U2hpZnQoKSkgIT0gMCkgewotCQkJCXNvcnRlZEtleXNbaW5kZXgrK10gPSBsb29rdXAuZ2V0U2hpZnQoKTsKLQkJCX0KLQkJCWlmICgobW9kaWZpZXJLZXlzICYgbG9va3VwLmdldEN0cmwoKSkgIT0gMCkgewotCQkJCXNvcnRlZEtleXNbaW5kZXgrK10gPSBsb29rdXAuZ2V0Q3RybCgpOwotCQkJfQotCQkJaWYgKChtb2RpZmllcktleXMgJiBsb29rdXAuZ2V0QWx0KCkpICE9IDApIHsKLQkJCQlzb3J0ZWRLZXlzW2luZGV4KytdID0gbG9va3VwLmdldEFsdCgpOwotCQkJfQotCi0JCX0gZWxzZSBpZiAoImNhcmJvbiIuZXF1YWxzKHBsYXRmb3JtKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoKG1vZGlmaWVyS2V5cyAmIGxvb2t1cC5nZXRTaGlmdCgpKSAhPSAwKSB7Ci0JCQkJc29ydGVkS2V5c1tpbmRleCsrXSA9IGxvb2t1cC5nZXRTaGlmdCgpOwotCQkJfQotCQkJaWYgKChtb2RpZmllcktleXMgJiBsb29rdXAuZ2V0Q3RybCgpKSAhPSAwKSB7Ci0JCQkJc29ydGVkS2V5c1tpbmRleCsrXSA9IGxvb2t1cC5nZXRDdHJsKCk7Ci0JCQl9Ci0JCQlpZiAoKG1vZGlmaWVyS2V5cyAmIGxvb2t1cC5nZXRBbHQoKSkgIT0gMCkgewotCQkJCXNvcnRlZEtleXNbaW5kZXgrK10gPSBsb29rdXAuZ2V0QWx0KCk7Ci0JCQl9Ci0JCQlpZiAoKG1vZGlmaWVyS2V5cyAmIGxvb2t1cC5nZXRDb21tYW5kKCkpICE9IDApIHsKLQkJCQlzb3J0ZWRLZXlzW2luZGV4KytdID0gbG9va3VwLmdldENvbW1hbmQoKTsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIHNvcnRlZEtleXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL05hdGl2ZUtleUZvcm1hdHRlci5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL05hdGl2ZUtleUZvcm1hdHRlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWQ5N2IxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvZm9ybWF0dGluZy9OYXRpdmVLZXlGb3JtYXR0ZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotS0VZX0RFTElNSVRFUj0rCi1XSU4zMl9LRVlfU1RST0tFX0RFTElNSVRFUj0sIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvZm9ybWF0dGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MzJhYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3Mva2V5cy9mb3JtYXR0aW5nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5Qcm92aWRlcyBzdXBwb3J0IGZvciBmb3JtYXR0aW5nIGtleSBzZXF1ZW5jZXMuPC9wPgotCi08aDI+UGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLTxwPgotVGhpcyBpcyBhIGNvbGxlY3Rpb24gZm8gdmFyaW91cyBmb3JtYXR0ZXJzIGZvciBrZXkgc2VxdWVuY2VzLiAgVGhlIGZvcm1hdHRlcnMKLWFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIDxjb2RlPktleUZvcm1hdHRlckZhY3Rvcnk8L2NvZGU+LiAgVG8gY2hhbmdlIGhvdwota2V5cyBhcmUgZm9ybWF0dGVkIGluIHRoZSB1c2VyIGludGVyZmFjZSwgY2FsbAotPGNvZGU+S2V5Rm9ybWF0dGVyRmFjdG9yeS5zZXREZWZhdWx0KElLZXlGb3JtYXR0ZXIpPC9jb2RlPi4gIFRoZXkgcHJvdmlkZWQKLWZvcm1hdHRlcnMgYXJlOgotPC9wPgotPGRsPgotPGR0PkZvcm1hbEtleUZvcm1hdHRlcjwvZHQ+Ci08ZGQ+UHJvdmlkZXMgYSBmb3JtYWwgZ3JhbW1hciBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBrZXkgc2VxdWVuY2VzLjwvZGQ+Ci08ZHQ+TmF0aXZlS2V5Rm9ybWF0dGVyPC9kdD4KLTxkZD5Qcm92aWRlIGEgbmF0aXZlLWxvb2tpbmcsIGh1bWFuLXJlYWRhYmxlIGZvcm1hdCBmb3Iga2V5cy48L2RkPgotPGR0PkNvbXBhY3RLZXlGb3JtYXR0ZXI8L2R0PgotPGRkPkEgdmFyaWF0aW9uIG9mIHRoZSBuYXRpdmUgZm9ybWF0dGVyIHRoYXQgcHJvdmlkZXMgYSBtb3JlIGNvbXBhY3QgcmVwcmVzZW50YXRpb24uPC9kZD4KLTxkdD5FbWFjc0tleUZvcm1hdHRlcjwvZHQ+Ci08ZGQ+QW4gWGVtYWNzLXN0eWxlIGZvcm1hdHRlciAoZS5nLiwgQ154IENeeCkuPC9kZD4KLTwvZGw+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9rZXlzL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGM4ZmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2JpbmRpbmdzL2tleXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlByb3ZpZGVzIHN1cHBvcnQgZm9yIGJpbmRpbmdzIGJldHdlZW4gY29tbWFuZHMgYW5kIGtleXMuPC9wPgotCi08aDI+UGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLTxwPgotVGhpcyBqdXN0IGEga2V5LXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBnZW5lcmljIGJpbmRpbmdzIGFuZCB0cmlnZ2VyCi1zdXBwb3J0LiAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIGxheWVyIGJldHdlZW4gdGhlIFNXVCBrZXkgZXZlbnRzCi1hbmQga2V5IGJpbmRpbmdzIHdpdGhpbiBKRmFjZS4KLTwvcD4KLTxwPgotPGNvZGU+S2V5U2VxdWVuY2U8L2NvZGU+IGlzIGEgPGNvZGU+VHJpZ2dlclNlcXVlbmNlPC9jb2RlPiB0aGF0IGhhcwotPGNvZGU+S2V5U3Ryb2tlPC9jb2RlPiBpbnN0YW5jZXMgYXMgdHJpZ2dlcnMuICBBIDxjb2RlPktleVN0cm9rZTwvY29kZT4gaXMKLWNvbXBvc2VkIG9mIG9uZSBvciBtb3JlIGtleXMgaGVsZCBkb3duIGF0IHRoZSBzYW1lIHRpbWUuICBBIGtleSBzdHJva2UgZW5kcwotd2hlbiB0aGUga2V5cyBhcmUgcmVsZWFzZWQuICBBIGtleSBzdHJva2UgY2FuIGNvbnRhaW4gemVybyBvciBtb3JlIG1vZGlmaWVycwota2V5cywgYnV0IGl0IGFsd2F5cyBjb250YWlucyBleGFjdGx5IG9uZSBuYXR1cmFsIGtleS4gIEEgbW9kaWZpZXIga2V5IGlzIG9uZSBvZgotQ3RybCwgU2hpZnQsIEFsdCwgb3IgQ29tbWFuZC4gIEEgbmF0dXJhbCBrZXkgaXMgYW55dGhpbmcgZWxzZS48L3A+Ci08cD4KLU5hdHVyYWwga2V5cyBhcmUgZnVydGhlciBzdWJkaXZpZGVkIGludG8gc3BlY2lhbCBrZXlzIGFuZCBjaGFyYWN0ZXIga2V5cy4KLUNoYXJhY3RlciBrZXlzIGFyZSBrZXlzIHRoYXQgaGF2ZSBhbiBBU0NJSSByZXByZXNlbnRhdGlvbiAoZS5nLiwgU3BhY2UsICdBJyBhbmQKLUJhY2tzcGFjZSkuICBTcGVjaWFsIGtleXMgYXJlIG9uZXMgdGhhdCBkbyBub3QgKGUuZy4sIEFycm93IFVwLCBGMTEsIGFuZAotTnVtTG9jaykuCi08L3A+Ci08cD4KLTxjb2RlPlNXVEtleVN1cHBvcnQ8L2NvZGU+IGlzIGEgc3RhdGljIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGxpbmsgYmV0d2VlbiBTV1QKLWFuZCB0aGVzZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbnMuICBJdCBoYXMgbWV0aG9kcyBmb3IgY29udmVydGluZyBiZXR3ZWVuIFNXVAota2V5IGV2ZW50cyBhbmQgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLCBhbmQgdmljZSB2ZXJzYS4gIEl0IGFsc28gcHJvdmlkZXMKLWFjY2VzcyB0byB0aGUgbmF0aXZlLXN0eWxlIGtleSBmb3JtYXR0aW5nIGZhY2lsaXRpZXMuCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9iaW5kaW5ncy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZjNjMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvYmluZGluZ3MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlByb3ZpZGVzIHN1cHBvcnQgZm9yIGJpbmRpbmdzIGJldHdlZW4gY29tbWFuZHMgYW5kIHZhcmlvdXMgdXNlciBpbnB1dCBldmVudHMKLShlLmcuLCBrZXlib2FyZCBzaG9ydGN1dHMpLjwvcD4KLQotPGgyPlBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci08cD4KLVRoaXMgcGFja2FnZSBwcm92aWRlcyB0aGUgY29tbW9uIGNsYXNzZXMgYW5kIGFic3RyYWN0IGNsYXNzZXMgcmVxdWlyZWQgdG8KLXByb3ZpZGUgYmluZGluZyBzdXBwb3J0LgotPC9wPgotPHA+Ci1BbGwgdGhlIHJlYWwgd29yayBpbiB0aGlzIHBhY2thZ2UgaXMgY2FycmllZCBvdXQgYnkgdGhlCi08Y29kZT5CaW5kaW5nTWFuYWdlcjwvY29kZT4sIGFuZCBtb3N0IHdvcmsgd2l0aCBiaW5kaW5ncyBjYW4gYmUgY2FycmllZCBvdXQKLWRpcmVjdGx5IHdpdGggaXQuICBUaGUgYmluZGluZyBtYW5hZ2VyIG1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIGJpbmRpbmdzLCBhbmQKLWRlY2lkZXMgd2hpY2ggYmluZGluZ3MgYXJlIGFjdGl2ZSBhdCBhbnkgcG9pbnQgaW4gdGltZS4gIEJ5IGNoYW5nZXMgdGhlIHZhcmlvdXMKLXByb3BlcnRpZXMgb2YgdGhlIG1hbmFnZXIsIHRoZSBhY3RpdmUgYmluZGluZ3Mgd2lsbCBjaGFuZ2UuICBUaGUgYmluZGluZwotbWFuYWdlciBpbXBsZW1lbnRzIGEgY2FjaGluZyBzY2hlbWUgdGhhdCBpcyBvcHRpbWl6ZWQgZm9yIGFuIGluZnJlcWV1bnRseQotY2hhbmdpbmcgc2V0IG9mIGJpbmRpbmdzLCBidXQgZnJlcXVlbnRseSBjaGFuZ2luZyBwcm9wZXJ0aWVzLgotPC9wPgotPHA+Ci1UaGUgYmluZGluZyBtYW5hZ2VyIGFsc28gbWFuYWdlcyBzY2hlbWVzLiAgQSBzY2hlbWUgaXMgYSBncm91cGluZyBvZiBiaW5kaW5ncy4KLVRvIGNyZWF0ZSBhIHNjaGVtZSwgdXNlIDxjb2RlPkJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZShTdHJpbmcpPC9jb2RlPi4gIFRoZQotc2NoZW1lIG11c3QgdGhlbiBiZSBkZWZpbmVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4KLTwvcD4KLTxwPgotSWYgeW91IHdpc2ggdG8gaW1wbGVtZW50IHlvdXIgb3duIHR5cGUgb2YgYmluZGluZywgdGhlbiB5b3UgbXVzdCBzdWJjbGFzcwotPGNvZGU+VHJpZ2dlcjwvY29kZT4gYW5kIDxjb2RlPlRyaWdnZXJTZXF1ZW5jZTwvY29kZT4uICBUaGVuLCBzaW1wbHkgdXNlIHRoZXNlCi1zdWJjbGFzc2VzIHdpdGggdGhlIDxjb2RlPkJpbmRpbmdNYW5hZ2VyPC9jb2RlPi4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2NvbW1hbmRzL0Fic3RyYWN0UGVyc2lzdGVudFN0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9jb21tYW5kcy9BYnN0cmFjdFBlcnNpc3RlbnRTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkMzE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2NvbW1hbmRzL0Fic3RyYWN0UGVyc2lzdGVudFN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdFN0YXRlOwotCi0vKioKLSAqIDxwPgotICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElQZXJzaXN0YWJsZVN0YXRlfS4gVGhpcyBpcyBhIHN0YXRlCi0gKiB0aGF0IG1pZ2h0IChvciBtaWdodCBub3QpIGJlIHBlcnNpc3RlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50LCBidXQgbXVzdCBub3QgZXh0ZW5kIHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBlcnNpc3RlbnRTdGF0ZSBleHRlbmRzIEFic3RyYWN0U3RhdGUgaW1wbGVtZW50cwotCQlJUGVyc2lzdGFibGVTdGF0ZSB7Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoaXMgc3RhdGUgc2hvdWxkIGJlIHBlcnNpc3RlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcGVyc2lzdGVkOwotCi0JLyoqCi0JICogV2hldGhlciB0aGlzIHN0YXRlIHNob3VsZCBiZSBwZXJzaXN0ZWQuIFN1YmNsYXNzZXMgc2hvdWxkIGNoZWNrIHRoaXMKLQkgKiBtZXRob2QgYmVmb3JlIGxvYWRpbmcgb3Igc2F2aW5nLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzdGF0ZSBzaG91bGQgYmUgcGVyc2lzdGVkOwotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1BlcnNpc3RlZCgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhpcyBzdGF0ZSBzaG91bGQgYmUgcGVyc2lzdGVkLgotCSAqIAotCSAqIEBwYXJhbSBwZXJzaXN0ZWQKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgdGhpcyBzdGF0ZSBzaG91bGQgYmUgcGVyc2lzdGVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFBlcnNpc3RlZChmaW5hbCBib29sZWFuIHBlcnNpc3RlZCkgewotCQl0aGlzLnBlcnNpc3RlZCA9IHBlcnNpc3RlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9jb21tYW5kcy9BY3Rpb25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9jb21tYW5kcy9BY3Rpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZjVlNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvY29tbWFuZHMvQWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5IYW5kbGVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotCi0vKioKLSAqIDxwPgotICogVGhpcyBjbGFzcyBhZGFwdHMgaW5zdGFuY2VzIG9mIDxjb2RlPklBY3Rpb248L2NvZGU+IHRvCi0gKiA8Y29kZT5JSGFuZGxlcjwvY29kZT4uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFjdGlvbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgYWN0aW9uLiBUaGlzIHZhbHVlIGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgSUFjdGlvbiBhY3Rpb247Ci0KLQkvKioKLQkgKiBUaGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGhvb2tlZCBvbiB0byB0aGUgYWN0aW9uLiBUaGlzIGlzIGluaXRpYWxpemVkCi0JICogd2hlbiB0aGUgZmlyc3QgbGlzdGVuZXIgaXMgYXR0YWNoZWQgdG8gdGhpcyBoYW5kbGVyLCBhbmQgaXMgcmVtb3ZlZCB3aGVuCi0JICogdGhlIGhhbmRsZXIgaXMgZGlzcG9zZWQgb3IgdGhlIGxhc3QgbGlzdGVuZXIgaXMgcmVtb3ZlZC4KLQkgKi8KLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gYW4gaW5zdGFuY2Ugb2YKLQkgKiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQWN0aW9uSGFuZGxlcihmaW5hbCBJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRIYW5kbGVyTGlzdGVuZXIoZmluYWwgSUhhbmRsZXJMaXN0ZW5lciBoYW5kbGVyTGlzdGVuZXIpIHsKLQkJaWYgKCFoYXNMaXN0ZW5lcnMoKSkgewotCQkJYXR0YWNoTGlzdGVuZXIoKTsKLQkJfQotCi0JCXN1cGVyLmFkZEhhbmRsZXJMaXN0ZW5lcihoYW5kbGVyTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFdoZW4gYSBsaXN0ZW5lciBpcyBhdHRhY2hlZCB0byB0aGlzIGhhbmRsZXIsIHRoZW4gdGhpcyByZWdpc3RlcnMgYQotCSAqIGxpc3RlbmVyIHdpdGggdGhlIHVuZGVybHlpbmcgYWN0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXR0YWNoTGlzdGVuZXIoKSB7Ci0JCWlmIChwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCXByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIGZpbmFsIHZvaWQgcHJvcGVydHlDaGFuZ2UoCi0JCQkJCQlmaW5hbCBQcm9wZXJ0eUNoYW5nZUV2ZW50IHByb3BlcnR5Q2hhbmdlRXZlbnQpIHsKLQkJCQkJZmluYWwgU3RyaW5nIHByb3BlcnR5ID0gcHJvcGVydHlDaGFuZ2VFdmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJCQlmaXJlSGFuZGxlckNoYW5nZWQobmV3IEhhbmRsZXJFdmVudChBY3Rpb25IYW5kbGVyLnRoaXMsCi0JCQkJCQkJSUFjdGlvbi5FTkFCTEVELmVxdWFscyhwcm9wZXJ0eSksIElBY3Rpb24uSEFORExFRAotCQkJCQkJCQkJLmVxdWFscyhwcm9wZXJ0eSkpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdGhpcy5hY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIG5vIG1vcmUgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkLCB0aGVuIHRoaXMgaXMgdXNlZCB0byByZW1vdmVkIHRoZQotCSAqIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoZSB1bmRlcmx5aW5nIGFjdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZGV0YWNoTGlzdGVuZXIoKSB7Ci0JCXRoaXMuYWN0aW9uLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChoYXNMaXN0ZW5lcnMoKSkgewotCQkJYWN0aW9uLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBleGVjdXRlKGZpbmFsIEV4ZWN1dGlvbkV2ZW50IGV2ZW50KQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICgoYWN0aW9uLmdldFN0eWxlKCkgPT0gSUFjdGlvbi5BU19DSEVDS19CT1gpCi0JCQkJfHwgKGFjdGlvbi5nZXRTdHlsZSgpID09IElBY3Rpb24uQVNfUkFESU9fQlVUVE9OKSkKLQkJCWFjdGlvbi5zZXRDaGVja2VkKCFhY3Rpb24uaXNDaGVja2VkKCkpOwotCQlmaW5hbCBPYmplY3QgdHJpZ2dlciA9IGV2ZW50LmdldFRyaWdnZXIoKTsKLQkJdHJ5IHsKLQkJCWlmICh0cmlnZ2VyIGluc3RhbmNlb2YgRXZlbnQpIHsKLQkJCQlhY3Rpb24ucnVuV2l0aEV2ZW50KChFdmVudCkgdHJpZ2dlcik7Ci0JCQl9IGVsc2UgewotCQkJCWFjdGlvbi5ydW5XaXRoRXZlbnQobmV3IEV2ZW50KCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigKLQkJCQkJIldoaWxlIGV4ZWN1dGluZyB0aGUgYWN0aW9uLCBhbiBleGNlcHRpb24gb2NjdXJyZWQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBoYW5kbGVyCi0JICogCi0JICogQHJldHVybiB0aGUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGhhbmRsZXIgKG5vdCBudWxsKQotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgZmluYWwgSUFjdGlvbiBnZXRBY3Rpb24oKSB7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGFjdGlvbi5pc0VuYWJsZWQoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNIYW5kbGVkKCkgewotCQlyZXR1cm4gYWN0aW9uLmlzSGFuZGxlZCgpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVIYW5kbGVyTGlzdGVuZXIoCi0JCQlmaW5hbCBJSGFuZGxlckxpc3RlbmVyIGhhbmRsZXJMaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVIYW5kbGVyTGlzdGVuZXIoaGFuZGxlckxpc3RlbmVyKTsKLQotCQlpZiAoIWhhc0xpc3RlbmVycygpKSB7Ci0JCQlkZXRhY2hMaXN0ZW5lcigpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJYnVmZmVyLmFwcGVuZCgiQWN0aW9uSGFuZGxlcigiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGFjdGlvbik7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvY29tbWFuZHMvQ29tbWFuZEltYWdlTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvY29tbWFuZHMvQ29tbWFuZEltYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjlhYmNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2NvbW1hbmRzL0NvbW1hbmRJbWFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uRXZlbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8cD4KLSAqIEEgY2VudHJhbCBsb29rdXAgZmFjaWxpdHkgZm9yIGltYWdlcyBmb3IgY29tbWFuZHMuIEltYWdlcyBjYW4gYmUgYXNzb2NpYXRlZAotICogd2l0aCBjb21tYW5kcyB1c2luZyB0aGlzIG1hbmFnZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGluc3RhbnRpYXRlLCBidXQgbXVzdCBub3QgZXh0ZW5kLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tYW5kSW1hZ2VNYW5hZ2VyIGV4dGVuZHMgRXZlbnRNYW5hZ2VyIHsKLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIGltYWdlIHRvIGRpc3BsYXkgaW4gdGhlIGRlZmF1bHQgY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgaW1hZ2UgdG8gZGlzcGxheSBpZiB0aGUgY29ycmVzcG9uZGluZyBjb21tYW5kIGlzIGRpc2FibGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRElTQUJMRUQgPSAxOwotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgaW1hZ2UgdG8gZGlzcGxheSBpZiB0aGUgbW91c2UgaXMgaG92ZXJpbmcgb3ZlciB0aGUgY29tbWFuZAotCSAqIGFuZCB0aGUgY29tbWFuZCBpcyBlbmFibGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSE9WRVIgPSAyOwotCi0JLyoqCi0JICogVGhlIG1hcCBvZiBjb21tYW5kIGlkZW50aWZpZXJzICg8Y29kZT5TdHJpbmc8L2NvZGU+KSB0byBpbWFnZXMuIFRoZQotCSAqIGltYWdlcyBhcmUgYW4gYXJyYXkgaW5kZXhlZCBieSB0eXBlLiBUaGUgdmFsdWVzIGluIHRoZSBhcnJheSBhcmUgZWl0aGVyCi0JICogYW4gPGNvZGU+SW1hZ2VEZXNjcmlwdG9yPC9jb2RlPiBvciBhIDxjb2RlPk1hcDwvY29kZT4gb2Ygc3R5bGUgKDxjb2RlPlN0cmluZzwvY29kZT4pCi0JICogdG8gPGNvZGU+SW1hZ2VEZXNjcmlwdG9yPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCBpbWFnZXNCeUlkID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGlzIGNvbW1hbmQgaW1hZ2UgbWFuYWdlci4gVGhlIGxpc3RlbmVyIHdpbGwgYmUKLQkgKiBub3RpZmllZCB3aGVuIHRoZSBzZXQgb2YgaW1hZ2UgYmluZGluZ3MgY2hhbmdlcy4gVGhpcyBjYW4gYmUgdXNlZCB0bwotCSAqIHRyYWNrIHRoZSBnbG9iYWwgYXBwZWFyYW5jZSBhbmQgZGlzYXBwZWFyYW5jZSBvZiBpbWFnZSBiaW5kaW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB0byBhdHRhY2g7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZENvbW1hbmRJbWFnZU1hbmFnZXJMaXN0ZW5lcigKLQkJCWZpbmFsIElDb21tYW5kSW1hZ2VNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJYWRkTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEJpbmRzIGEgcGFydGljdWxhciBpbWFnZSBwYXRoIHRvIGEgY29tbWFuZCBpZCwgdHlwZSBhbmQgc3R5bGUgdHJpcGxlCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbW1hbmQgdG8gd2hpY2ggdGhlIGltYWdlIHNob3VsZCBiZQotCSAqICAgICAgICAgICAgYm91bmQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBUaGUgdHlwZSBvZiBpbWFnZSB0byByZXRyaWV2ZS4gVGhpcyB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUKLQkgKiAgICAgICAgICAgIDxjb2RlPlRZUEU8L2NvZGU+IGNvbnN0YW50cyBkZWZpbmVkIGluIHRoaXMgY2xhc3MuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgc3R5bGUgb2YgdGhlIGltYWdlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgVGhlIFVSTCB0byB0aGUgaW1hZ2UuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYmluZChmaW5hbCBTdHJpbmcgY29tbWFuZElkLCBmaW5hbCBpbnQgdHlwZSwKLQkJCWZpbmFsIFN0cmluZyBzdHlsZSwgZmluYWwgVVJMIHVybCkgewotCQlmaW5hbCBJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCWJpbmQoY29tbWFuZElkLCB0eXBlLCBzdHlsZSwgZGVzY3JpcHRvcik7Ci0JfQotCi0JLyoqCi0JICogQmluZHMgYSBwYXJ0aWN1bGFyIGltYWdlIHBhdGggdG8gYSBjb21tYW5kIGlkLCB0eXBlIGFuZCBzdHlsZSB0cmlwbGUKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZElkCi0JICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29tbWFuZCB0byB3aGljaCB0aGUgaW1hZ2Ugc2hvdWxkIGJlCi0JICogICAgICAgICAgICBib3VuZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIG9mIGltYWdlIHRvIHJldHJpZXZlLiBUaGlzIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZQotCSAqICAgICAgICAgICAgPGNvZGU+VFlQRTwvY29kZT4gY29uc3RhbnRzIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBzdHlsZSBvZiB0aGUgaW1hZ2U7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqICAgICAgICAgICAgVGhlIGltYWdlIGRlc2NyaXB0b3IuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYmluZChmaW5hbCBTdHJpbmcgY29tbWFuZElkLCBmaW5hbCBpbnQgdHlwZSwKLQkJCWZpbmFsIFN0cmluZyBzdHlsZSwgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJT2JqZWN0W10gaW1hZ2VzID0gKE9iamVjdFtdKSBpbWFnZXNCeUlkLmdldChjb21tYW5kSWQpOwotCQlpZiAoaW1hZ2VzID09IG51bGwpIHsKLQkJCWltYWdlcyA9IG5ldyBPYmplY3RbM107Ci0JCQlpbWFnZXNCeUlkLnB1dChjb21tYW5kSWQsIGltYWdlcyk7Ci0JCX0KLQotCQlpZiAoKHR5cGUgPCAwKSB8fCAodHlwZSA+PSBpbWFnZXMubGVuZ3RoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSB0eXBlIG11c3QgYmUgb25lIG9mIFRZUEVfREVGQVVMVCwgVFlQRV9ESVNBQkxFRCBhbmQgVFlQRV9IT1ZFUi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZmluYWwgT2JqZWN0IHR5cGVkSW1hZ2UgPSBpbWFnZXNbdHlwZV07Ci0JCWlmIChzdHlsZSA9PSBudWxsKSB7Ci0JCQlpZiAoKHR5cGVkSW1hZ2UgPT0gbnVsbCkgfHwgKHR5cGVkSW1hZ2UgaW5zdGFuY2VvZiBJbWFnZURlc2NyaXB0b3IpKSB7Ci0JCQkJaW1hZ2VzW3R5cGVdID0gZGVzY3JpcHRvcjsKLQkJCX0gZWxzZSBpZiAodHlwZWRJbWFnZSBpbnN0YW5jZW9mIE1hcCkgewotCQkJCWZpbmFsIE1hcCBzdHlsZU1hcCA9IChNYXApIHR5cGVkSW1hZ2U7Ci0JCQkJc3R5bGVNYXAucHV0KHN0eWxlLCBkZXNjcmlwdG9yKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0eXBlZEltYWdlIGluc3RhbmNlb2YgTWFwKSB7Ci0JCQkJZmluYWwgTWFwIHN0eWxlTWFwID0gKE1hcCkgdHlwZWRJbWFnZTsKLQkJCQlzdHlsZU1hcC5wdXQoc3R5bGUsIGRlc2NyaXB0b3IpOwotCQkJfSBlbHNlIGlmICh0eXBlZEltYWdlIGluc3RhbmNlb2YgSW1hZ2VEZXNjcmlwdG9yKSB7Ci0JCQkJZmluYWwgTWFwIHN0eWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlzdHlsZU1hcC5wdXQobnVsbCwgdHlwZWRJbWFnZSk7Ci0JCQkJc3R5bGVNYXAucHV0KHN0eWxlLCBkZXNjcmlwdG9yKTsKLQkJCQlpbWFnZXNbdHlwZV0gPSBkZXNjcmlwdG9yOwotCQkJfQotCQl9Ci0KLQkJZmlyZU1hbmFnZXJDaGFuZ2VkKG5ldyBDb21tYW5kSW1hZ2VNYW5hZ2VyRXZlbnQodGhpcywKLQkJCQluZXcgU3RyaW5nW10geyBjb21tYW5kSWQgfSwgdHlwZSwgc3R5bGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBvZiB0aGUgaW1hZ2VzIGZyb20gdGhpcyBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyKCkgewotCQlpbWFnZXNCeUlkLmNsZWFyKCk7Ci0JCWlmIChpc0xpc3RlbmVyQXR0YWNoZWQoKSkgewotCQkJZmluYWwgU3RyaW5nW10gY29tbWFuZElkcyA9IChTdHJpbmdbXSkgaW1hZ2VzQnlJZC5rZXlTZXQoKS50b0FycmF5KAotCQkJCQluZXcgU3RyaW5nW2ltYWdlc0J5SWQuc2l6ZSgpXSk7Ci0JCQlmaXJlTWFuYWdlckNoYW5nZWQobmV3IENvbW1hbmRJbWFnZU1hbmFnZXJFdmVudCh0aGlzLCBjb21tYW5kSWRzLAotCQkJCQlUWVBFX0RFRkFVTFQsIG51bGwpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIGFsbCBvZiB0aGUgbGlzdGVuZXJzIHRvIHRoaXMgbWFuYWdlciB0aGF0IHRoZSBpbWFnZSBiaW5kaW5ncwotCSAqIGhhdmUgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBldmVudCB0byBzZW5kIHRvIGFsbCBvZiB0aGUgbGlzdGVuZXJzOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGZpcmVNYW5hZ2VyQ2hhbmdlZChmaW5hbCBDb21tYW5kSW1hZ2VNYW5hZ2VyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlmaW5hbCBPYmplY3RbXSBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIElDb21tYW5kSW1hZ2VNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUNvbW1hbmRJbWFnZU1hbmFnZXJMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJbGlzdGVuZXIuY29tbWFuZEltYWdlTWFuYWdlckNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIGEgc3R5bGUgdGFnIHRoYXQgaXMgbm90IGN1cnJlbnRseSB1c2VkIGZvciB0aGUgZ2l2ZW4gY29tbWFuZC4KLQkgKiBUaGlzIGNhbiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB0cnlpbmcgdG8gY3JlYXRlIGEgdW5pcXVlIHN0eWxlIGZvciBhCi0JICogbmV3IHNldCBvZiBpbWFnZXMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbW1hbmQgZm9yIHdoaWNoIGEgdW5pcXVlIHN0eWxlIGlzCi0JICogICAgICAgICAgICByZXF1aXJlZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBBIHN0eWxlIHRhZyB0aGF0IGlzIG5vdCBjdXJyZW50bHkgdXNlZDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2VuZXJhdGVVbnVzZWRTdHlsZShmaW5hbCBTdHJpbmcgY29tbWFuZElkKSB7Ci0JCWZpbmFsIE9iamVjdFtdIGV4aXN0aW5nSW1hZ2VzID0gKE9iamVjdFtdKSBpbWFnZXNCeUlkLmdldChjb21tYW5kSWQpOwotCQlpZiAoZXhpc3RpbmdJbWFnZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmaW5hbCBTZXQgZXhpc3RpbmdTdHlsZXMgPSBuZXcgSGFzaFNldCgzKTsKLQkJZm9yIChpbnQgdHlwZSA9IDA7IHR5cGUgPCBleGlzdGluZ0ltYWdlcy5sZW5ndGg7IHR5cGUrKykgewotCQkJZmluYWwgT2JqZWN0IHN0eWxlZEltYWdlcyA9IGV4aXN0aW5nSW1hZ2VzW3R5cGVdOwotCQkJaWYgKHN0eWxlZEltYWdlcyBpbnN0YW5jZW9mIEltYWdlRGVzY3JpcHRvcikgewotCQkJCWV4aXN0aW5nU3R5bGVzLmFkZChudWxsKTsKLQkJCX0gZWxzZSBpZiAoc3R5bGVkSW1hZ2VzIGluc3RhbmNlb2YgTWFwKSB7Ci0JCQkJZmluYWwgTWFwIHN0eWxlTWFwID0gKE1hcCkgc3R5bGVkSW1hZ2VzOwotCQkJCWV4aXN0aW5nU3R5bGVzLmFkZEFsbChzdHlsZU1hcC5rZXlTZXQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWV4aXN0aW5nU3R5bGVzLmNvbnRhaW5zKG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBnZW5lcmF0ZWRTdHlsZSA9ICJBVVRPR0VOOjo6IjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaW5kZXggPSAwOwotCQl3aGlsZSAoZXhpc3RpbmdTdHlsZXMuY29udGFpbnMoZ2VuZXJhdGVkU3R5bGUpKSB7Ci0JCQlnZW5lcmF0ZWRTdHlsZSArPSAoaW5kZXgrKyAlIDEwKTsKLQkJfQotCi0JCXJldHVybiBnZW5lcmF0ZWRTdHlsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlZmF1bHQgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kIGluIHRoZQotCSAqIGRlZmF1bHQgc3R5bGUuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgdG8gZmluZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBBbiBpbWFnZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIGNvbW1hbmQ7IG5ldmVyCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihmaW5hbCBTdHJpbmcgY29tbWFuZElkKSB7Ci0JCXJldHVybiBnZXRJbWFnZURlc2NyaXB0b3IoY29tbWFuZElkLCBUWVBFX0RFRkFVTFQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kCi0JICogaW4gdGhlIGRlZmF1bHQgc3R5bGUuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgdG8gZmluZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIG9mIGltYWdlIHRvIHJldHJpZXZlLiBUaGlzIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZQotCSAqICAgICAgICAgICAgPGNvZGU+VFlQRTwvY29kZT4gY29uc3RhbnRzIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4KLQkgKiBAcmV0dXJuIEFuIGltYWdlIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gY29tbWFuZDsgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgIGlmIHRoZSBnaXZlbiBpbWFnZSB0eXBlIGNhbm5vdCBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihmaW5hbCBTdHJpbmcgY29tbWFuZElkLAotCQkJZmluYWwgaW50IHR5cGUpIHsKLQkJcmV0dXJuIGdldEltYWdlRGVzY3JpcHRvcihjb21tYW5kSWQsIHR5cGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kCi0JICogaW4gdGhlIGdpdmVuIHN0eWxlLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIHRvIGZpbmQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBUaGUgdHlwZSBvZiBpbWFnZSB0byByZXRyaWV2ZS4gVGhpcyB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUKLQkgKiAgICAgICAgICAgIDxjb2RlPlRZUEU8L2NvZGU+IGNvbnN0YW50cyBkZWZpbmVkIGluIHRoaXMgY2xhc3MuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgc3R5bGUgb2YgdGhlIGltYWdlIHRvIHJldHJpZXZlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBBbiBpbWFnZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIGNvbW1hbmQ7IDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiB0aGUgZ2l2ZW4gaW1hZ2Ugc3R5bGUgYW5kIHR5cGUgY2Fubm90IGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKGZpbmFsIFN0cmluZyBjb21tYW5kSWQsCi0JCQlmaW5hbCBpbnQgdHlwZSwgZmluYWwgU3RyaW5nIHN0eWxlKSB7Ci0JCWlmIChjb21tYW5kSWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCWZpbmFsIE9iamVjdFtdIGltYWdlcyA9IChPYmplY3RbXSkgaW1hZ2VzQnlJZC5nZXQoY29tbWFuZElkKTsKLQkJaWYgKGltYWdlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICgodHlwZSA8IDApIHx8ICh0eXBlID49IGltYWdlcy5sZW5ndGgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhlIHR5cGUgbXVzdCBiZSBvbmUgb2YgVFlQRV9ERUZBVUxULCBUWVBFX0RJU0FCTEVEIGFuZCBUWVBFX0hPVkVSLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlPYmplY3QgdHlwZWRJbWFnZSA9IGltYWdlc1t0eXBlXTsKLQotCQlpZiAodHlwZWRJbWFnZSA9PSBudWxsKSB7Ci0JCQl0eXBlZEltYWdlID0gaW1hZ2VzW1RZUEVfREVGQVVMVF07Ci0JCX0KLQotCQlpZiAodHlwZWRJbWFnZSBpbnN0YW5jZW9mIEltYWdlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIChJbWFnZURlc2NyaXB0b3IpIHR5cGVkSW1hZ2U7Ci0JCX0KLQotCQlpZiAodHlwZWRJbWFnZSBpbnN0YW5jZW9mIE1hcCkgewotCQkJZmluYWwgTWFwIHN0eWxlTWFwID0gKE1hcCkgdHlwZWRJbWFnZTsKLQkJCU9iamVjdCBzdHlsZWRJbWFnZSA9IHN0eWxlTWFwLmdldChzdHlsZSk7Ci0JCQlpZiAoc3R5bGVkSW1hZ2UgaW5zdGFuY2VvZiBJbWFnZURlc2NyaXB0b3IpIHsKLQkJCQlyZXR1cm4gKEltYWdlRGVzY3JpcHRvcikgc3R5bGVkSW1hZ2U7Ci0JCQl9Ci0KLQkJCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQkJc3R5bGVkSW1hZ2UgPSBzdHlsZU1hcC5nZXQobnVsbCk7Ci0JCQkJaWYgKHN0eWxlZEltYWdlIGluc3RhbmNlb2YgSW1hZ2VEZXNjcmlwdG9yKSB7Ci0JCQkJCXJldHVybiAoSW1hZ2VEZXNjcmlwdG9yKSBzdHlsZWRJbWFnZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlZmF1bHQgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kIGluIHRoZQotCSAqIGdpdmVuIHN0eWxlLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIHRvIGZpbmQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIHN0eWxlIG9mIHRoZSBpbWFnZSB0byByZXRyaWV2ZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gQW4gaW1hZ2UgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBjb21tYW5kOyA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgdGhlIGdpdmVuIGltYWdlIHN0eWxlIGNhbm5vdCBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihmaW5hbCBTdHJpbmcgY29tbWFuZElkLAotCQkJZmluYWwgU3RyaW5nIHN0eWxlKSB7Ci0JCXJldHVybiBnZXRJbWFnZURlc2NyaXB0b3IoY29tbWFuZElkLCBUWVBFX0RFRkFVTFQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbW1hbmQgaW1hZ2UgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVDb21tYW5kSW1hZ2VNYW5hZ2VyTGlzdGVuZXIoCi0JCQlmaW5hbCBJQ29tbWFuZEltYWdlTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJlbW92ZUxpc3RlbmVyT2JqZWN0KGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9jb21tYW5kcy9Db21tYW5kSW1hZ2VNYW5hZ2VyRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2NvbW1hbmRzL0NvbW1hbmRJbWFnZU1hbmFnZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2RmZWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2NvbW1hbmRzL0NvbW1hbmRJbWFnZU1hbmFnZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5jb21tYW5kczsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIGV2ZW50IGluZGljYXRpbmcgdGhhdCB0aGUgaW1hZ2UgYmluZGluZ3MgaGF2ZSBjaGFuZ2VkLgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIG11c3QgbmVpdGhlciBpbnN0YW50aWF0ZSBub3IgZXh0ZW5kLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiBAc2VlIElDb21tYW5kSW1hZ2VNYW5hZ2VyTGlzdGVuZXIjY29tbWFuZEltYWdlTWFuYWdlckNoYW5nZWQoQ29tbWFuZEltYWdlTWFuYWdlckV2ZW50KQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tbWFuZEltYWdlTWFuYWdlckV2ZW50IHsKLQotCS8qKgotCSAqIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgY29tbWFuZHMgd2hvc2UgaW1hZ2UgYmluZGluZ3MgaGF2ZSBjaGFuZ2VkLiBUaGlzCi0JICogdmFsdWUgaXMgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4gYW5kIG5ldmVyIGVtcHR5LgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gY2hhbmdlZENvbW1hbmRJZHM7Ci0KLQkvKioKLQkgKiBUaGUgY29tbWFuZCBpbWFnZSBtYW5hZ2VyIHRoYXQgaGFzIGNoYW5nZWQuIFRoaXMgdmFsdWUgaXMgbmV2ZXIKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbW1hbmRJbWFnZU1hbmFnZXIgY29tbWFuZEltYWdlTWFuYWdlcjsKLQotCS8qKgotCSAqIFRoZSBzdHlsZSBvZiBpbWFnZSB0aGF0IGNoYW5nZWQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3R5bGU7Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiBpbWFnZSB0aGF0IGNoYW5nZWQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZEltYWdlTWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIGluc3RhbmNlIG9mIHRoZSBtYW5hZ2VyIHRoYXQgY2hhbmdlZDsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBjaGFuZ2VkQ29tbWFuZElkcwotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXJzIG9mIHRoZSBjb21tYW5kcyB3aG9zZSBpbWFnZSBiaW5kaW5ncyBoYXZlCi0JICogICAgICAgICAgICBjaGFuZ2VkOyB0aGlzIHZhbHVlIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBtdXN0Ci0JICogICAgICAgICAgICBub3QgYmUgZW1wdHkuIFRoaXMgdmFsdWUgaXMgbm90IGNvcGllZC4KLQkgKi8KLQlDb21tYW5kSW1hZ2VNYW5hZ2VyRXZlbnQoZmluYWwgQ29tbWFuZEltYWdlTWFuYWdlciBjb21tYW5kSW1hZ2VNYW5hZ2VyLAotCQkJZmluYWwgU3RyaW5nW10gY2hhbmdlZENvbW1hbmRJZHMsIGZpbmFsIGludCB0eXBlLCBmaW5hbCBTdHJpbmcgc3R5bGUpIHsKLQkJaWYgKGNvbW1hbmRJbWFnZU1hbmFnZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJBbiBldmVudCBtdXN0IHJlZmVyIHRvIGl0cyBtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmICgoY2hhbmdlZENvbW1hbmRJZHMgPT0gbnVsbCkgfHwgKGNoYW5nZWRDb21tYW5kSWRzLmxlbmd0aCA8IDEpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgY2hhbmdlIGNvbW1hbmQgaWRlbnRpZmllciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0aGlzLmNvbW1hbmRJbWFnZU1hbmFnZXIgPSBjb21tYW5kSW1hZ2VNYW5hZ2VyOwotCQl0aGlzLmNoYW5nZWRDb21tYW5kSWRzID0gY2hhbmdlZENvbW1hbmRJZHM7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuc3R5bGUgPSBzdHlsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVycyBvZiB0aGUgY29tbWFuZHMgd2hvc2UgYmluZGluZ3MgaGF2ZSBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGlkZW50aWZpZXJzIG9mIHRoZSBjb21tYW5kcyB3aG9zZSBiaW5kaW5ncyBoYXZlIGNoYW5nZWQ7Ci0JICogICAgICAgICBuZWl0aGVyIDxjb2RlPm51bGw8L2NvZGU+IG5vciBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nW10gZ2V0Q2hhbmdlZENvbW1hbmRJZHMoKSB7Ci0JCWZpbmFsIFN0cmluZ1tdIGNvcHkgPSBuZXcgU3RyaW5nW2NoYW5nZWRDb21tYW5kSWRzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY2hhbmdlZENvbW1hbmRJZHMsIDAsIGNvcHksIDAsCi0JCQkJY2hhbmdlZENvbW1hbmRJZHMubGVuZ3RoKTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0aGF0IGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0aGF0IGNoYW5nZWQuIEd1YXJhbnRlZWQgbm90IHRvIGJlCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgQ29tbWFuZEltYWdlTWFuYWdlciBnZXRDb21tYW5kSW1hZ2VNYW5hZ2VyKCkgewotCQlyZXR1cm4gY29tbWFuZEltYWdlTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb25lIG9mIHRoZSBpbWFnZXMgb2YgdGhlIGdpdmVuIGNvbW1hbmQgaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbW1hbmQgdG8gY2hlY2s7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG9uZSBvZiB0aGUgY29tbWFuZCdzIGltYWdlcyBoYXMgY2hhbmdlZDsKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb21tYW5kSWRDaGFuZ2VkKGZpbmFsIFN0cmluZyBjb21tYW5kSWQpIHsKLQkJLy8gUEVSRk9STUFOQ0UKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VkQ29tbWFuZElkcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbW1hbmRJZC5lcXVhbHMoY2hhbmdlZENvbW1hbmRJZHNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbWFnZSBmb3IgdGhlIGNvbW1hbmQgaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbW1hbmQgdG8gY2hlY2s7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb21tYW5kJ3MgaW1hZ2UgaGFzIGNoYW5nZWQKLQkgKiBAc2VlIENvbW1hbmRJbWFnZU1hbmFnZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NvbW1hbmRJbWFnZUNoYW5nZWQoZmluYWwgU3RyaW5nIGNvbW1hbmRJZCkgewotCQlyZXR1cm4gaXNDb21tYW5kSWRDaGFuZ2VkKGNvbW1hbmRJZCkKLQkJCQkmJiAodHlwZSA9PSBDb21tYW5kSW1hZ2VNYW5hZ2VyLlRZUEVfREVGQVVMVCkKLQkJCQkmJiAoc3R5bGUgPT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbWFnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBmb3IgdGhlIGNvbW1hbmQgaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbW1hbmQgdG8gY2hlY2s7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgVGhlIHR5cGUgb2YgaW1hZ2UsIG9uZSBvZgotCSAqICAgICAgICAgICAge0BsaW5rIENvbW1hbmRJbWFnZU1hbmFnZXIjVFlQRV9ERUZBVUxUfSwKLQkgKiAgICAgICAgICAgIHtAbGluayBDb21tYW5kSW1hZ2VNYW5hZ2VyI1RZUEVfRElTQUJMRUR9IG9yCi0JICogICAgICAgICAgICB7QGxpbmsgQ29tbWFuZEltYWdlTWFuYWdlciNUWVBFX0hPVkVSfS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb21tYW5kJ3MgaW1hZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgaGFzCi0JICogICAgICAgICBjaGFuZ2VkLgotCSAqIEBzZWUgQ29tbWFuZEltYWdlTWFuYWdlciNnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb21tYW5kSW1hZ2VDaGFuZ2VkKGZpbmFsIFN0cmluZyBjb21tYW5kSWQsCi0JCQlmaW5hbCBpbnQgdHlwZSkgewotCQlyZXR1cm4gaXNDb21tYW5kSWRDaGFuZ2VkKGNvbW1hbmRJZCkKLQkJCQkmJiAoKHR5cGUgPT0gQ29tbWFuZEltYWdlTWFuYWdlci5UWVBFX0RFRkFVTFQpIHx8ICh0eXBlID09IHRoaXMudHlwZSkpCi0JCQkJJiYgKHN0eWxlID09IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgaW1hZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgYW5kIHN0eWxlIGZvciB0aGUgY29tbWFuZCBoYXMKLQkgKiBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb21tYW5kIHRvIGNoZWNrOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIG9mIGltYWdlLCBvbmUgb2YKLQkgKiAgICAgICAgICAgIHtAbGluayBDb21tYW5kSW1hZ2VNYW5hZ2VyI1RZUEVfREVGQVVMVH0sCi0JICogICAgICAgICAgICB7QGxpbmsgQ29tbWFuZEltYWdlTWFuYWdlciNUWVBFX0RJU0FCTEVEfSBvcgotCSAqICAgICAgICAgICAge0BsaW5rIENvbW1hbmRJbWFnZU1hbmFnZXIjVFlQRV9IT1ZFUn0uCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgc3R5bGUgb2YgdGhlIGltYWdlOyBtYXkgYmUgYW55dGhpbmcuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29tbWFuZCdzIGltYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZAotCSAqICAgICAgICAgc3R5bGUgaGFzIGNoYW5nZWQuCi0JICogQHNlZSBDb21tYW5kSW1hZ2VNYW5hZ2VyI2dldEltYWdlRGVzY3JpcHRvcihTdHJpbmcsIGludCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ29tbWFuZEltYWdlQ2hhbmdlZChmaW5hbCBTdHJpbmcgY29tbWFuZElkLAotCQkJZmluYWwgaW50IHR5cGUsIGZpbmFsIFN0cmluZyBzdHlsZSkgewotCQlyZXR1cm4gaXNDb21tYW5kSWRDaGFuZ2VkKGNvbW1hbmRJZCkKLQkJCQkmJiAoKHR5cGUgPT0gQ29tbWFuZEltYWdlTWFuYWdlci5UWVBFX0RFRkFVTFQpIHx8ICh0eXBlID09IHRoaXMudHlwZSkpCi0JCQkJJiYgKChzdHlsZSA9PSBudWxsKSB8fCAoc3R5bGUuZXF1YWxzKHRoaXMuc3R5bGUpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbWFnZSBvZiB0aGUgZ2l2ZW4gc3R5bGUgZm9yIHRoZSBjb21tYW5kIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb21tYW5kIHRvIGNoZWNrOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgc3R5bGUgb2YgdGhlIGltYWdlOyBtYXkgYmUgYW55dGhpbmcuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29tbWFuZCdzIGltYWdlIG9mIHRoZSBnaXZlbiBzdHlsZSBoYXMKLQkgKiAgICAgICAgIGNoYW5nZWQuCi0JICogQHNlZSBDb21tYW5kSW1hZ2VNYW5hZ2VyI2dldEltYWdlRGVzY3JpcHRvcihTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NvbW1hbmRJbWFnZUNoYW5nZWQoZmluYWwgU3RyaW5nIGNvbW1hbmRJZCwKLQkJCWZpbmFsIFN0cmluZyBzdHlsZSkgewotCQlyZXR1cm4gaXNDb21tYW5kSWRDaGFuZ2VkKGNvbW1hbmRJZCkKLQkJCQkmJiAodHlwZSA9PSBDb21tYW5kSW1hZ2VNYW5hZ2VyLlRZUEVfREVGQVVMVCkKLQkJCQkmJiAoKHN0eWxlID09IG51bGwpIHx8IChzdHlsZS5lcXVhbHModGhpcy5zdHlsZSkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9jb21tYW5kcy9JQ29tbWFuZEltYWdlTWFuYWdlckxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9jb21tYW5kcy9JQ29tbWFuZEltYWdlTWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMzgxZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvY29tbWFuZHMvSUNvbW1hbmRJbWFnZU1hbmFnZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvY29tbWFuZHMvSVBlcnNpc3RhYmxlU3RhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2NvbW1hbmRzL0lQZXJzaXN0YWJsZVN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYzYyNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvY29tbWFuZHMvSVBlcnNpc3RhYmxlU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogPHA+Ci0gKiBBIHBpZWNlIG9mIHN0YXRlIHRoYXQgY2FuIGJlIHBlcnNpc3RlZCB1c2luZyB7QGxpbmsgSVByZWZlcmVuY2VTdG9yZX0uIEEKLSAqIHBpZWNlIG9mIHBlcnNpc3RlbnQgc3RhdGUgc3RvcmVzIGEgZmxhZyAoPGNvZGU+cGVyc2lzdGVkPC9jb2RlPikgYXMgdG8KLSAqIHdoZXRoZXIgaXQgc2hvdWxkIGRvIGFueXRoaW5nIGZvcgotICoge0BsaW5rIElQZXJzaXN0YWJsZVN0YXRlI2xvYWQoSVByZWZlcmVuY2VTdG9yZSwgU3RyaW5nKX0gb3IKLSAqIHtAbGluayBJUGVyc2lzdGFibGVTdGF0ZSNzYXZlKElQcmVmZXJlbmNlU3RvcmUsIFN0cmluZyl9IGNhbGxzLgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgb3IgZXh0ZW5kIHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBlcnNpc3RhYmxlU3RhdGUgZXh0ZW5kcyBJU3RhdGUgewotCi0JLyoqCi0JICogV2hldGhlciB0aGlzIHN0YXRlIHNob3VsZCBiZSBwZXJzaXN0ZWQgd2hlbiBhIGNhbGwgdG8KLQkgKiB7QGxpbmsgSVBlcnNpc3RhYmxlU3RhdGUjc2F2ZShJUHJlZmVyZW5jZVN0b3JlLCBTdHJpbmcpfSBvciByZWFkIHdoZW4gYQotCSAqIGNhbGwgdG8ge0BsaW5rIElQZXJzaXN0YWJsZVN0YXRlI2xvYWQoSVByZWZlcmVuY2VTdG9yZSwgU3RyaW5nKX0gaXMgbWFkZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc3RhdGUgc2hvdWxkIHJlYWxseSBiZSBwZXJzaXN0ZWQ7Ci0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGVkKCk7Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGlzIHN0YXRlIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUsIGdpdmVuIHRoZSBsb2NhdGlvbiBhdCB3aGljaAotCSAqIHRvIGxvb2suIFRoaXMgbWV0aG9kIG11c3QgYmUgc3ltbWV0cmljIHdpdGggYSBjYWxsIHRvCi0JICoge0BsaW5rIElQZXJzaXN0YWJsZVN0YXRlI3NhdmUoSVByZWZlcmVuY2VTdG9yZSwgU3RyaW5nKX0uCi0JICogCi0JICogQHBhcmFtIHN0b3JlCi0JICogICAgICAgICAgICBUaGUgc3RvcmUgZnJvbSB3aGljaCB0byByZWFkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcHJlZmVyZW5jZUtleQotCSAqICAgICAgICAgICAgVGhlIGtleSBhdCB3aGljaCB0aGUgc3RhdGUgaXMgc3RvcmVkOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgcHJlZmVyZW5jZUtleSk7Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGlzIHN0YXRlIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLCBnaXZlbiB0aGUgbG9jYXRpb24gYXQgd2hpY2ggdG8KLQkgKiB3cml0ZS4gVGhpcyBtZXRob2QgbXVzdCBiZSBzeW1tZXRyaWMgd2l0aCBhIGNhbGwgdG8KLQkgKiB7QGxpbmsgSVBlcnNpc3RhYmxlU3RhdGUjbG9hZChJUHJlZmVyZW5jZVN0b3JlLCBTdHJpbmcpfS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RvcmUKLQkgKiAgICAgICAgICAgIFRoZSBzdG9yZSB0byB3aGljaCB0aGUgc3RhdGUgc2hvdWxkIGJlIHdyaXR0ZW47IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcHJlZmVyZW5jZUtleQotCSAqICAgICAgICAgICAgVGhlIGtleSBhdCB3aGljaCB0aGUgc3RhdGUgc2hvdWxkIGJlIHN0b3JlZDsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2VLZXkpOwotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIHRoaXMgc3RhdGUgc2hvdWxkIGJlIHBlcnNpc3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGVyc2lzdGVkCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RhdGUgc2hvdWxkIGJlIHBlcnNpc3RlZDsKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdGVkKGJvb2xlYW4gcGVyc2lzdGVkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2NvbW1hbmRzL1JhZGlvU3RhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2NvbW1hbmRzL1JhZGlvU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzOWJiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9jb21tYW5kcy9SYWRpb1N0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSVN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSVN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubWVudXMuSU1lbnVTdGF0ZUlkczsKLQotLyoqCi0gKiA8cD4KLSAqIEEgcGllY2Ugb2YgYm9vbGVhbiBzdGF0ZSBncm91cGVkIHdpdGggb3RoZXIgYm9vbGVhbiBzdGF0ZXMuIE9mIHRoZXNlIHN0YXRlcywKLSAqIG9ubHkgb25lIG1heSBoYXZlIGEgdmFsdWUgb2Yge0BsaW5rIEJvb2xlYW4jVFJVRX0gYXQgYW55IGdpdmVuIHBvaW50IGluIHRpbWUuCi0gKiBUaGUgdmFsdWVzIG9mIGFsbCBvdGhlciBzdGF0ZXMgbXVzdCBiZSB7QGxpbmsgQm9vbGVhbiNGQUxTRX0uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIElmIHRoaXMgc3RhdGUgaXMgcmVnaXN0ZXJlZCB1c2luZyB7QGxpbmsgSU1lbnVTdGF0ZUlkcyNTVFlMRX0sIHRoZW4gaXQgd2lsbAotICogY29udHJvbCB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBjb21tYW5kIGlmIGRpc3BsYXllZCBpbiB0aGUgbWVudXMsIHRvb2wgYmFycwotICogb3Igc3RhdHVzIGxpbmUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGluc3RhbnRpYXRlIG9yIGV4dGVuZCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgUmFkaW9TdGF0ZSBleHRlbmRzIFRvZ2dsZVN0YXRlIHsKLQotCS8qKgotCSAqIFRoZSBtYW5hZ2VyIG9mIHJhZGlvIGdyb3VwcyB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLiBUaGlzIGVuc3VyZXMgdGhhdAotCSAqIG9ubHkgb25lIG1lbWJlciBvZiBhIHJhZGlvIGdyb3VwIGlzIGFjdGl2ZSBhdCBhbnkgb25lIHRpbWUsIGFuZCB0cmFja3MKLQkgKiBncm91cCBtZW1iZXJzaGlwcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSYWRpb1N0YXRlTWFuYWdlciB7Ci0KLQkJLyoqCi0JCSAqIEEgZ3JvdXAgb2YgcmFkaW8gc3RhdGVzIHdpdGggdGhlIHNhbWUgaWRlbnRpZmllci4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJhZGlvR3JvdXAgaW1wbGVtZW50cyBJU3RhdGVMaXN0ZW5lciB7Ci0KLQkJCS8qKgotCQkJICogVGhlIGFjdGl2ZSBzdGF0ZS4gSWYgdGhlcmUgaXMgbm8gYWN0aXZlIHN0YXRlLCB0aGVuIHRoaXMgdmFsdWUgaXMKLQkJCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCQkJICovCi0JCQlwcml2YXRlIFJhZGlvU3RhdGUgYWN0aXZlID0gbnVsbDsKLQotCQkJLyoqCi0JCQkgKiBUaGUgY3VycmVudCBtZW1iZXJzIGluIHRoaXMgZ3JvdXAuIElmIHRoZXJlIGFyZSBubyBtZW1iZXJzLCB0aGVuCi0JCQkgKiB0aGlzIHZhbHVlIGlzIDxjb2RlPm5saXN0ZW5lcnVsbDwvY29kZT4uCi0JCQkgKi8KLQkJCXByaXZhdGUgU2V0IG1lbWJlcnMgPSBudWxsOwotCi0JCQkvKioKLQkJCSAqIEFjdGl2YXRlcyBhIG1lbWViZXIuIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IG90aGVyCi0JCQkgKiBhY3RpdmUgbWVtYmVycy4gSWYgdGhlcmUgYXJlLCB0aGV5IGFyZSBkZWFjdGl2YXRlZC4KLQkJCSAqIAotCQkJICogQHBhcmFtIHN0YXRlCi0JCQkgKiAgICAgICAgICAgIFRoZSBzdGF0ZSB0aGF0IHNob3VsZCBiZWNvbWUgYWN0aXZlOyBtdXN0IG5vdCBiZQotCQkJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkJCSAqLwotCQkJcHJpdmF0ZSBmaW5hbCB2b2lkIGFjdGl2YXRlTWVtYmVyKGZpbmFsIFJhZGlvU3RhdGUgc3RhdGUpIHsKLQkJCQlpZiAoYWN0aXZlICE9IHN0YXRlKSB7Ci0JCQkJCWFjdGl2ZS5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJCQl9Ci0JCQkJYWN0aXZlID0gc3RhdGU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQWRkcyBhIG1lbWJlciB0byB0aGlzIHJhZGlvIGdyb3VwLiBJZiB0aGUgc3RhdGUgYmVpbmcgYWRkZWQgaXMKLQkJCSAqIGFjdGl2ZSwgdGhlbiBpdCByZXBsYWNlcyB0aGUgY3VycmVudGx5IGFjdGl2ZSBncm91cCBtZW1lYmVyIGFzCi0JCQkgKiB0aGUgYWN0aXZlIHN0YXRlLgotCQkJICogCi0JCQkgKiBAcGFyYW0gc3RhdGUKLQkJCSAqICAgICAgICAgICAgVGhlIHN0YXRlIHRvIGFkZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JCQkgKi8KLQkJCXByaXZhdGUgZmluYWwgdm9pZCBhZGRNZW1iZXIoZmluYWwgUmFkaW9TdGF0ZSBzdGF0ZSkgewotCQkJCWlmIChtZW1iZXJzID09IG51bGwpIHsKLQkJCQkJbWVtYmVycyA9IG5ldyBIYXNoU2V0KDUpOwotCQkJCX0KLQotCQkJCW1lbWJlcnMuYWRkKHN0YXRlKTsKLQkJCQlzdGF0ZS5hZGRMaXN0ZW5lcih0aGlzKTsKLQotCQkJCWZpbmFsIE9iamVjdCB2YWx1ZSA9IHN0YXRlLmdldFZhbHVlKCk7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCQlpZiAoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWFjdGl2YXRlTWVtYmVyKHN0YXRlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGZpbmFsIHZvaWQgaGFuZGxlU3RhdGVDaGFuZ2UoZmluYWwgSVN0YXRlIHN0YXRlLAotCQkJCQlmaW5hbCBPYmplY3Qgb2xkVmFsdWUpIHsKLQkJCQlmaW5hbCBPYmplY3QgbmV3VmFsdWUgPSBzdGF0ZS5nZXRWYWx1ZSgpOwotCQkJCWlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCQkJaWYgKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlhY3RpdmF0ZU1lbWJlcigoUmFkaW9TdGF0ZSkgc3RhdGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvKioKLQkJCSAqIFJlbW92ZXMgYSBtZW1iZXIgZnJvbSB0aGlzIHJhZGlvIGdyb3VwLiBJZiB0aGUgc3RhdGUgd2FzIHRoZQotCQkJICogYWN0aXZlIHN0YXRlLCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gYWN0aXZlIHN0YXRlLgotCQkJICogCi0JCQkgKiBAcGFyYW0gc3RhdGUKLQkJCSAqICAgICAgICAgICAgVGhlIHN0YXRlIHRvIHJlbW92ZTsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JCQkgKi8KLQkJCXByaXZhdGUgZmluYWwgdm9pZCByZW1vdmVNZW1iZXIoZmluYWwgUmFkaW9TdGF0ZSBzdGF0ZSkgewotCQkJCXN0YXRlLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCWlmIChhY3RpdmUgPT0gc3RhdGUpIHsKLQkJCQkJYWN0aXZlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAobWVtYmVycyA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJbWVtYmVycy5yZW1vdmUoc3RhdGUpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBtYXAgb2YgcmFkaW8gc3RhdGVzIGluZGV4ZWQgYnkgaWRlbnRpZmllciAoPGNvZGU+U3RyaW5nPC9jb2RlPikuCi0JCSAqIFRoZSByYWRpbyBzdGF0ZXMgaXMgZWl0aGVyIGEgc2luZ2xlIDxjb2RlPlJhZGlvU3RhdGU8L2NvZGU+Ci0JCSAqIGluc3RhbmNlIG9yIGEgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4gb2YgPGNvZGU+UmFkaW9TdGF0ZTwvY29kZT4KLQkJICogaW5zdGFuY2VzLgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgTWFwIHJhZGlvU3RhdGVzQnlJZCA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIEFjdGl2YXRlcyBhIHBhcnRpY3VsYXIgc3RhdGUgd2l0aGluIGEgZ2l2ZW4gZ3JvdXAuCi0JCSAqIAotCQkgKiBAcGFyYW0gaWRlbnRpZmllcgotCQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBncm91cCB0byB3aGljaCB0aGUgc3RhdGUgYmVsb25nczsKLQkJICogICAgICAgICAgICBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICogQHBhcmFtIHN0YXRlCi0JCSAqICAgICAgICAgICAgVGhlIHN0YXRlIHRvIGFjdGl2YXRlOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgYWN0aXZhdGVHcm91cChmaW5hbCBTdHJpbmcgaWRlbnRpZmllciwKLQkJCQlmaW5hbCBSYWRpb1N0YXRlIHN0YXRlKSB7Ci0JCQlpZiAocmFkaW9TdGF0ZXNCeUlkID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWZpbmFsIE9iamVjdCBjdXJyZW50VmFsdWUgPSByYWRpb1N0YXRlc0J5SWQuZ2V0KGlkZW50aWZpZXIpOwotCQkJaWYgKGN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFJhZGlvR3JvdXApIHsKLQkJCQlmaW5hbCBSYWRpb0dyb3VwIHJhZGlvR3JvdXAgPSAoUmFkaW9Hcm91cCkgY3VycmVudFZhbHVlOwotCQkJCXJhZGlvR3JvdXAuYWN0aXZhdGVNZW1iZXIoc3RhdGUpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlZ2lzdGVycyBhIHBpZWNlIG9mIHN0YXRlIHdpdGggdGhlIHJhZGlvIG1hbmFnZXIuCi0JCSAqIAotCQkgKiBAcGFyYW0gaWRlbnRpZmllcgotCQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByYWRpbyBncm91cDsgbXVzdCBub3QgYmUKLQkJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICogQHBhcmFtIHN0YXRlCi0JCSAqICAgICAgICAgICAgVGhlIHN0YXRlIHRvIHJlZ2lzdGVyOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgcmVnaXN0ZXJTdGF0ZShmaW5hbCBTdHJpbmcgaWRlbnRpZmllciwKLQkJCQlmaW5hbCBSYWRpb1N0YXRlIHN0YXRlKSB7Ci0JCQlpZiAocmFkaW9TdGF0ZXNCeUlkID09IG51bGwpIHsKLQkJCQlyYWRpb1N0YXRlc0J5SWQgPSBuZXcgSGFzaE1hcCgpOwotCQkJfQotCi0JCQlmaW5hbCBPYmplY3QgY3VycmVudFZhbHVlID0gcmFkaW9TdGF0ZXNCeUlkLmdldChpZGVudGlmaWVyKTsKLQkJCWZpbmFsIFJhZGlvR3JvdXAgcmFkaW9Hcm91cDsKLQkJCWlmIChjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBSYWRpb0dyb3VwKSB7Ci0JCQkJcmFkaW9Hcm91cCA9IChSYWRpb0dyb3VwKSBjdXJyZW50VmFsdWU7Ci0JCQl9IGVsc2UgewotCQkJCXJhZGlvR3JvdXAgPSBuZXcgUmFkaW9Hcm91cCgpOwotCQkJfQotCQkJcmFkaW9Hcm91cC5hZGRNZW1iZXIoc3RhdGUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFVucmVnaXN0ZXJzIGEgcGllY2Ugb2Ygc3RhdGUgZnJvbSB0aGUgcmFkaW8gbWFuYWdlci4KLQkJICogCi0JCSAqIEBwYXJhbSBpZGVudGlmaWVyCi0JCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJhZGlvIGdyb3VwOyBtdXN0IG5vdCBiZQotCQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCQkgKiBAcGFyYW0gc3RhdGUKLQkJICogICAgICAgICAgICBUaGUgc3RhdGUgdG8gdW5yZWdpc3RlcjsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHVucmVnaXN0ZXJTdGF0ZShmaW5hbCBTdHJpbmcgaWRlbnRpZmllciwKLQkJCQlmaW5hbCBSYWRpb1N0YXRlIHN0YXRlKSB7Ci0JCQlpZiAocmFkaW9TdGF0ZXNCeUlkID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWZpbmFsIE9iamVjdCBjdXJyZW50VmFsdWUgPSByYWRpb1N0YXRlc0J5SWQuZ2V0KGlkZW50aWZpZXIpOwotCQkJaWYgKGN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFJhZGlvR3JvdXApIHsKLQkJCQlmaW5hbCBSYWRpb0dyb3VwIHJhZGlvR3JvdXAgPSAoUmFkaW9Hcm91cCkgY3VycmVudFZhbHVlOwotCQkJCXJhZGlvR3JvdXAucmVtb3ZlTWVtYmVyKHN0YXRlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByYWRpbyBncm91cCB0byB3aGljaCB0aGlzIHN0YXRlIGJlbG9uZ3MuIFRoaXMgdmFsdWUKLQkgKiBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBzdGF0ZSBkb2Vzbid0IHJlYWxseSBiZWxvbmcgdG8gYSBncm91cAotCSAqICh5ZXQpLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJhZGlvR3JvdXBJZGVudGlmaWVyID0gbnVsbDsKLQotCS8qKgotCSAqIFVucmVnaXN0ZXJzIHRoaXMgc3RhdGUgZnJvbSB0aGUgbWFuYWdlciwgd2hpY2ggZGV0YWNoZXMgdGhlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzZXRSYWRpb0dyb3VwSWRlbnRpZmllcihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSByYWRpbyBncm91cCBmb3IgdGhpcyBwaWVjZSBvZiBzdGF0ZS4gSWYgdGhlCi0JICogaWRlbnRpZmllciBpcyBjbGVhcmVkLCB0aGVuIHRoZSBzdGF0ZSBpcyB1bnJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGlkZW50aWZpZXIKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByYWRpbyBncm91cCBmb3IgdGhpcyBzdGF0ZTsgbWF5IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaWRlbnRpZmllciBpcyBiZWluZyBjbGVhcmVkLgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFJhZGlvR3JvdXBJZGVudGlmaWVyKGZpbmFsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCWlmIChpZGVudGlmaWVyID09IG51bGwpIHsKLQkJCVJhZGlvU3RhdGVNYW5hZ2VyLnVucmVnaXN0ZXJTdGF0ZShyYWRpb0dyb3VwSWRlbnRpZmllciwgdGhpcyk7Ci0JCQlyYWRpb0dyb3VwSWRlbnRpZmllciA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyYWRpb0dyb3VwSWRlbnRpZmllciA9IGlkZW50aWZpZXI7Ci0JCQlSYWRpb1N0YXRlTWFuYWdlci5yZWdpc3RlclN0YXRlKGlkZW50aWZpZXIsIHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoaXMgb2JqZWN0LiBUaGlzIG5vdGlmaWVzIHRoZSByYWRpbyBzdGF0ZSBtYW5hZ2VyIG9mCi0JICogdGhlIGNoYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWU7IHNob3VsZCBiZSBhIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiUmFkaW9TdGF0ZSB0YWtlcyBhIEJvb2xlYW4gYXMgYSB2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkgJiYgKHJhZGlvR3JvdXBJZGVudGlmaWVyICE9IG51bGwpKSB7Ci0JCQlSYWRpb1N0YXRlTWFuYWdlci5hY3RpdmF0ZUdyb3VwKHJhZGlvR3JvdXBJZGVudGlmaWVyLCB0aGlzKTsKLQkJfQotCi0JCXN1cGVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9jb21tYW5kcy9Ub2dnbGVTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvY29tbWFuZHMvVG9nZ2xlU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4NmNmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9jb21tYW5kcy9Ub2dnbGVTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm1lbnVzLklNZW51U3RhdGVJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIDxwPgotICogQSBwaWVjZSBvZiBzdGF0ZSBzdG9yaW5nIGEge0BsaW5rIEJvb2xlYW59LgotICogPC9wPgotICogPHA+Ci0gKiBJZiB0aGlzIHN0YXRlIGlzIHJlZ2lzdGVyZWQgdXNpbmcge0BsaW5rIElNZW51U3RhdGVJZHMjU1RZTEV9LCB0aGVuIGl0IHdpbGwKLSAqIGNvbnRyb2wgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBpZiBkaXNwbGF5ZWQgaW4gdGhlIG1lbnVzLCB0b29sIGJhcnMKLSAqIG9yIHN0YXR1cyBsaW5lLgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzLCBidXQgbXVzdCBub3QgZXh0ZW5kLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2dnbGVTdGF0ZSBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVudFN0YXRlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+VG9nZ2xlU3RhdGU8L2NvZGU+LiBCeSBkZWZhdWx0LCB0aGUgdG9nZ2xlIGlzCi0JICogb2ZmIChlLmcuLCA8Y29kZT5mYWxzZTwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBUb2dnbGVTdGF0ZSgpIHsKLQkJc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgbG9hZChmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLAotCQkJZmluYWwgU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJaWYgKGlzUGVyc2lzdGVkKCkpIHsKLQkJCWZpbmFsIGJvb2xlYW4gdmFsdWUgPSBzdG9yZS5nZXRCb29sZWFuKHByZWZlcmVuY2VLZXkpOwotCQkJc2V0VmFsdWUodmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNhdmUoZmluYWwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwKLQkJCWZpbmFsIFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7Ci0JCWlmIChpc1BlcnNpc3RlZCgpKSB7Ci0JCQlmaW5hbCBPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZSgpOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCXN0b3JlLnNldFZhbHVlKHByZWZlcmVuY2VLZXksICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVG9nZ2xlU3RhdGUgdGFrZXMgYSBCb29sZWFuIGFzIGEgdmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2NvbW1hbmRzL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2NvbW1hbmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyYTUzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9jb21tYW5kcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+UHJvdmlkZXMgSkZhY2Utc3BlY2lmaWMgc3VwcG9ydCBmb3IgY29tbWFuZHMuPC9wPgotCi08aDI+UGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLTxwPgotVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgaGFuZGxlciB0aGF0IHdyYXBzIGEgbGVnYWN5IGluc3RhbmNlIG9mCi08Y29kZT5JQWN0aW9uPC9jb2RlPiwgYXMgd2VsbCBhcyBhIG1hbmFnZXIgZm9yIGFzc29jaWF0aW5nIGltYWdlcyB3aXRoIGNvbW1hbmRzLgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvY29udGV4dHMvSUNvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2NvbnRleHRzL0lDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMTEyMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvY29udGV4dHMvSUNvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5jb250ZXh0czsKLQotLyoqCi0gKiA8cD4KLSAqIEEgbGlzdCBvZiB3ZWxsLWtub3duIGNvbnRleHQgaWRlbnRpZmllcnMuIFRoZSBjb250ZXh0IGlkZW50aWZpZXJzIHVzZSB0aGUKLSAqIHByZWZpeCAib3JnLmVjbGlwc2UudWkiIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuIFRoZXNlIGNvbnRleHRzIGV4aXN0IGFzIHBhcnQgCi0gKiBvZiBKRmFjZS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIG5vdCBiZSBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRleHRJZHMgewotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgYWN0aXZlIHdoZW4gYSBzaGVsbCByZWdpc3RlcmVkIGFzCi0JICogYSBkaWFsb2cuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9JRF9ESUFMT0cgPSAib3JnLmVjbGlwc2UudWkuY29udGV4dHMuZGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgYWN0aXZlIHdoZW4gYSBzaGVsbCBpcyByZWdpc3RlcmVkCi0JICogYXMgZWl0aGVyIGEgd2luZG93IG9yIGEgZGlhbG9nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfSURfRElBTE9HX0FORF9XSU5ET1cgPSAib3JnLmVjbGlwc2UudWkuY29udGV4dHMuZGlhbG9nQW5kV2luZG93IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgYWN0aXZlIHdoZW4gYSBzaGVsbCBpcyByZWdpc3RlcmVkCi0JICogYXMgYSB3aW5kb3cuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9JRF9XSU5ET1cgPSAib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvY29udGV4dHMvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvY29udGV4dHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDVkNmY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2NvbnRleHRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5Qcm92aWRlcyBKRmFjZS1zcGVjaWZpYyBzdXBwb3J0IGZvciBjb250ZXh0cy48L3A+Ci0KLTxoMj5QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotPHA+Ci1UaGlzIHBhY2thZ2UgcHJvdmlkZXMgc29tZSBjb250ZXh0IGlkZW50aWZpZXJzIHRoYXQgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgaW4gdGhlCi1jb250ZXh0IG9mIEpGYWNlLgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9Db250cm9sRW5hYmxlU3RhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvQ29udHJvbEVuYWJsZVN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNmNjYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9Db250cm9sRW5hYmxlU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gc2F2ZSB0aGUgZW5hYmxlL2Rpc2FibGUgc3RhdGUgb2YgYSBjb250cm9sIGluY2x1ZGluZyBhbGwgaXRzCi0gKiBkZXNjZW5kZW50IGNvbnRyb2xzLgotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEVuYWJsZVN0YXRlIHsKLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIGV4Y2VwdGlvbiBjb250cm9scyAoZWxlbWVudCB0eXBlOiA8Y29kZT5Db250cm9sPC9jb2RlPik7Ci0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgZXhjZXB0aW9ucyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIHNhdmVkIHN0YXRlcyAoZWxlbWVudCB0eXBlOiA8Y29kZT5JdGVtU3RhdGU8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Qgc3RhdGVzOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgY2xhc3MgZm9yIHJlY29yZGluZyB0aGUgZW5hYmxlL2Rpc2FibGUgc3RhdGUgb2YgYSBzaW5nbGUKLSAgICAgKiBjb250cm9sLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgSXRlbVN0YXRlIHsKLSAgICAgICAgcHJvdGVjdGVkIENvbnRyb2wgaXRlbTsKLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBpdGVtCi0gICAgICAgICAqIEBwYXJhbSBzdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEl0ZW1TdGF0ZShDb250cm9sIGl0ZW0sIGJvb2xlYW4gc3RhdGUpIHsKLSAgICAgICAgICAgIHRoaXMuaXRlbSA9IGl0ZW07Ci0gICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVzdG9yZSB0aGUgZW5hYmxlZCBzdGF0ZSB0byB0aGUgb3JpZ2luYWwgdmFsdWUuCi0gICAgICAgICAqICAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc3RvcmUoKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsIHx8IGl0ZW0uaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGl0ZW0uc2V0RW5hYmxlZChzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG9iamVjdCBhbmQgc2F2ZXMgaW4gaXQgdGhlIGN1cnJlbnQgZW5hYmxlL2Rpc2FibGUgc3RhdGUgb2YKLSAgICAgKiB0aGUgZ2l2ZW4gY29udHJvbCBhbmQgaXRzIGRlc2NlbmRlbnRzOyB0aGUgY29udHJvbHMgdGhhdCBhcmUgc2F2ZWQgYXJlCi0gICAgICogYWxzbyBkaXNhYmxlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdwotICAgICAqICAgICAgICAgICAgdGhlIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbEVuYWJsZVN0YXRlKENvbnRyb2wgdykgewotICAgICAgICB0aGlzKHcsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IGFuZCBzYXZlcyBpbiBpdCB0aGUgY3VycmVudCBlbmFibGUvZGlzYWJsZSBzdGF0ZSBvZgotICAgICAqIHRoZSBnaXZlbiBjb250cm9sIGFuZCBpdHMgZGVzY2VuZGVudHMgZXhjZXB0IGZvciB0aGUgZ2l2ZW4gbGlzdCBvZgotICAgICAqIGV4Y2VwdGlvbiBjYXNlczsgdGhlIGNvbnRyb2xzIHRoYXQgYXJlIHNhdmVkIGFyZSBhbHNvIGRpc2FibGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3Ci0gICAgICogICAgICAgICAgICB0aGUgY29udHJvbAotICAgICAqIEBwYXJhbSBleGNlcHRpb25zCi0gICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBjb250cm9scyB0byBub3QgZGlzYWJsZSAoZWxlbWVudCB0eXBlOgotICAgICAqICAgICAgICAgICAgPGNvZGU+Q29udHJvbDwvY29kZT4pLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2xFbmFibGVTdGF0ZShDb250cm9sIHcsIExpc3QgZXhjZXB0aW9ucykgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzdGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9ucyA9IGV4Y2VwdGlvbnM7Ci0gICAgICAgIHJlYWRTdGF0ZUZvckFuZERpc2FibGUodyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgZW5hYmxlL2Rpc2FibGUgc3RhdGUgb2YgdGhlIGdpdmVuIGNvbnRyb2wgYW5kIGl0cwotICAgICAqIGRlc2NlbmRlbnRzIGluIHRoZSByZXR1cm5lZCBvYmplY3Q7IHRoZSBjb250cm9scyBhcmUgYWxsIGRpc2FibGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3Ci0gICAgICogICAgICAgICAgICB0aGUgY29udHJvbAotICAgICAqIEByZXR1cm4gYW4gb2JqZWN0IGNhcHR1cmluZyB0aGUgZW5hYmxlL2Rpc2FibGUgc3RhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbnRyb2xFbmFibGVTdGF0ZSBkaXNhYmxlKENvbnRyb2wgdykgewotICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xFbmFibGVTdGF0ZSh3KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgY3VycmVudCBlbmFibGUvZGlzYWJsZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gY29udHJvbCBhbmQgaXRzCi0gICAgICogZGVzY2VuZGVudHMgaW4gdGhlIHJldHVybmVkIG9iamVjdCBleGNlcHQgZm9yIHRoZSBnaXZlbiBsaXN0IG9mIGV4Y2VwdGlvbgotICAgICAqIGNhc2VzOyB0aGUgY29udHJvbHMgdGhhdCBhcmUgc2F2ZWQgYXJlIGFsc28gZGlzYWJsZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHcKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb250cm9sCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGNvbnRyb2xzIHRvIG5vdCBkaXNhYmxlIChlbGVtZW50IHR5cGU6Ci0gICAgICogICAgICAgICAgICA8Y29kZT5Db250cm9sPC9jb2RlPikKLSAgICAgKiBAcmV0dXJuIGFuIG9iamVjdCBjYXB0dXJpbmcgdGhlIGVuYWJsZS9kaXNhYmxlIHN0YXRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb250cm9sRW5hYmxlU3RhdGUgZGlzYWJsZShDb250cm9sIHcsIExpc3QgZXhjZXB0aW9ucykgewotICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xFbmFibGVTdGF0ZSh3LCBleGNlcHRpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWN1cnNpdmVseSByZWFkcyB0aGUgZW5hYmxlL2Rpc2FibGUgc3RhdGUgZm9yIHRoZSBnaXZlbiB3aW5kb3cgYW5kCi0gICAgICogZGlzYWJsZXMgYWxsIGNvbnRyb2xzLgotICAgICAqIEBwYXJhbSBjb250cm9sIENvbnRyb2wKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZFN0YXRlRm9yQW5kRGlzYWJsZShDb250cm9sIGNvbnRyb2wpIHsKLSAgICAgICAgaWYgKChleGNlcHRpb25zICE9IG51bGwgJiYgZXhjZXB0aW9ucy5jb250YWlucyhjb250cm9sKSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0gICAgICAgICAgICBDb21wb3NpdGUgYyA9IChDb21wb3NpdGUpIGNvbnRyb2w7Ci0gICAgICAgICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBjLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmVhZFN0YXRlRm9yQW5kRGlzYWJsZShjaGlsZHJlbltpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gWFhYOiBXb3JrYXJvdW5kIGZvciAxRzJROFNTOiBJVFBVSTpMaW51eCAtIENvbWJvIGJveCBpcyBub3QgZW5hYmxlZAotICAgICAgICAvLyBpbiAiRmlsZS0+TmV3LT5Tb2x1dGlvbiIKLSAgICAgICAgc3RhdGVzLmFkZChuZXcgSXRlbVN0YXRlKGNvbnRyb2wsIGNvbnRyb2wuZ2V0RW5hYmxlZCgpKSk7Ci0gICAgICAgIGNvbnRyb2wuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZXMgdGhlIHdpbmRvdyBlbmFibGUgc3RhdGUgc2F2ZWQgaW4gdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzdG9yZSgpIHsKLSAgICAgICAgaW50IHNpemUgPSBzdGF0ZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgKChJdGVtU3RhdGUpIHN0YXRlcy5nZXQoaSkpLnJlc3RvcmUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmI5MjBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LklTaGVsbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5TYW1lU2hlbGxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSBkaWFsb2cgaXMgYSBzcGVjaWFsaXplZCB3aW5kb3cgdXNlZCBmb3IgbmFycm93LWZvY3VzZWQgY29tbXVuaWNhdGlvbiB3aXRoCi0gKiB0aGUgdXNlci4KLSAqIDxwPgotICogRGlhbG9ncyBhcmUgdXN1YWxseSBtb2RhbC4gQ29uc2VxdWVudGx5LCBpdCBpcyBnZW5lcmFsbHkgYmFkIHByYWN0aWNlIHRvIG9wZW4KLSAqIGEgZGlhbG9nIHdpdGhvdXQgYSBwYXJlbnQuIEEgbW9kYWwgZGlhbG9nIHdpdGhvdXQgYSBwYXJlbnQgaXMgbm90IHByZXZlbnRlZAotICogZnJvbSBkaXNhcHBlYXJpbmcgYmVoaW5kIHRoZSBhcHBsaWNhdGlvbidzIG90aGVyIHdpbmRvd3MsIG1ha2luZyBpdCB2ZXJ5Ci0gKiBjb25mdXNpbmcgZm9yIHRoZSB1c2VyLgotICogPC9wPgotICogPHA+Ci0gKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIG1vZGFsIGRpYWxvZyBpcyBvcGVuIHRoZSBzZWNvbmQgb25lIHNob3VsZCBiZQotICogcGFyZW50ZWQgb2ZmIG9mIHRoZSBzaGVsbCBvZiB0aGUgZmlyc3Qgb25lIG90aGVyd2lzZSBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZQotICogT1Mgd2lsbCBnaXZlIGZvY3VzIHRvIHRoZSBmaXJzdCBkaWFsb2cgcG90ZW50aWFsbHkgYmxvY2tpbmcgdGhlIFVJLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhbG9nIGV4dGVuZHMgV2luZG93IHsKLQkvKioKLQkgKiBJbWFnZSByZWdpc3RyeSBrZXkgZm9yIGVycm9yIGltYWdlICh2YWx1ZQotCSAqIDxjb2RlPiJkaWFsb2dfZXJyb3JfaW1hZ2UiPC9jb2RlPikuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlCi0JICogICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETEdfSU1HX0VSUk9SID0gImRpYWxvZ19lcnJvcl9pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEltYWdlIHJlZ2lzdHJ5IGtleSBmb3IgaW5mbyBpbWFnZSAodmFsdWUgPGNvZGU+ImRpYWxvZ19pbmZvX2ltYWdlIjwvY29kZT4pLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZQotCSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRExHX0lNR19JTkZPID0gImRpYWxvZ19pbmZvX2ltYWdlZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEltYWdlIHJlZ2lzdHJ5IGtleSBmb3IgcXVlc3Rpb24gaW1hZ2UgKHZhbHVlCi0JICogPGNvZGU+ImRpYWxvZ19xdWVzdGlvbl9pbWFnZSI8L2NvZGU+KS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1FVRVNUSU9OKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERMR19JTUdfUVVFU1RJT04gPSAiZGlhbG9nX3F1ZXN0aW9uX2ltYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW1hZ2UgcmVnaXN0cnkga2V5IGZvciB3YXJuaW5nIGltYWdlICh2YWx1ZQotCSAqIDxjb2RlPiJkaWFsb2dfd2FybmluZ19pbWFnZSI8L2NvZGU+KS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2UKLQkgKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRExHX0lNR19XQVJOSU5HID0gImRpYWxvZ193YXJuaW5nX2ltYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW1hZ2UgcmVnaXN0cnkga2V5IGZvciBpbmZvIG1lc3NhZ2UgaW1hZ2UgKHZhbHVlCi0JICogPGNvZGU+ImRpYWxvZ19tZXNzYXNnZV9pbmZvX2ltYWdlIjwvY29kZT4pLgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETEdfSU1HX01FU1NBR0VfSU5GTyA9ICJkaWFsb2dfbWVzc2FzZ2VfaW5mb19pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEltYWdlIHJlZ2lzdHJ5IGtleSBmb3IgaW5mbyBtZXNzYWdlIGltYWdlICh2YWx1ZQotCSAqIDxjb2RlPiJkaWFsb2dfbWVzc2FzZ2Vfd2FybmluZ19pbWFnZSI8L2NvZGU+KS4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRExHX0lNR19NRVNTQUdFX1dBUk5JTkcgPSAiZGlhbG9nX21lc3Nhc2dlX3dhcm5pbmdfaW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbWFnZSByZWdpc3RyeSBrZXkgZm9yIGluZm8gbWVzc2FnZSBpbWFnZSAodmFsdWUKLQkgKiA8Y29kZT4iZGlhbG9nX21lc3NhZ2VfZXJyb3JfaW1hZ2UiPC9jb2RlPikuCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERMR19JTUdfTUVTU0FHRV9FUlJPUiA9ICJkaWFsb2dfbWVzc2FnZV9lcnJvcl9pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBlbGxpcHNpcyBpcyB0aGUgc3RyaW5nIHRoYXQgaXMgdXNlZCB0byByZXByZXNlbnQgc2hvcnRlbmVkIHRleHQuCi0JICogCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMTElQU0lTID0gIi4uLiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBkaWFsb2cgc2V0dGluZ3Mga2V5IG5hbWUgZm9yIHN0b3JlZCBkaWFsb2cgeCBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19PUklHSU5fWCA9ICJESUFMT0dfWF9PUklHSU4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGlhbG9nIHNldHRpbmdzIGtleSBuYW1lIGZvciBzdG9yZWQgZGlhbG9nIHkgbG9jYXRpb24uCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfT1JJR0lOX1kgPSAiRElBTE9HX1lfT1JJR0lOIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGRpYWxvZyBzZXR0aW5ncyBrZXkgbmFtZSBmb3Igc3RvcmVkIGRpYWxvZyB3aWR0aC4KLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19XSURUSCA9ICJESUFMT0dfV0lEVEgiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGlhbG9nIHNldHRpbmdzIGtleSBuYW1lIGZvciBzdG9yZWQgZGlhbG9nIGhlaWdodC4KLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19IRUlHSFQgPSAiRElBTE9HX0hFSUdIVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHN0b3JlZCBkaWFsb2cgd2lkdGggb3IgaGVpZ2h0IHRoYXQKLQkgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCBib3VuZHMgc2hvdWxkIGJlIHVzZWQuCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJQUxPR19ERUZBVUxUX0JPVU5EUyA9IC0xOwotCi0JLyoqCi0JICogQ29uc3RhbnRzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlIHN0cmF0ZWd5IGZvciBwZXJzaXN0aW5nCi0JICogZGlhbG9nIGJvdW5kcy4gIFRoZXNlIGNvbnN0YW50cyByZXByZXNlbnQgYml0IG1hc2tzIHRoYXQgY2FuIGJlIHVzZWQKLQkgKiB0b2dldGhlci4KLQkgKgotCSAqQHNpbmNlIDMuMgotCSAqLwotCQotCS8qKgotCSAqIFBlcnNpc3QgdGhlIGxhc3QgbG9jYXRpb24gb2YgdGhlIGRpYWxvZy4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElBTE9HX1BFUlNJU1RMT0NBVElPTiA9IDB4MDAwMTsKLQkvKioKLQkgKiBQZXJzaXN0IHRoZSBsYXN0IGtub3duIHNpemUgb2YgdGhlIGRpYWxvZy4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElBTE9HX1BFUlNJU1RTSVpFID0gMHgwMDAyOwotCQotCi0JLyoqCi0JICogTk9URTogRGlhbG9nIGRvZXMgbm90IHRoZSBmb2xsb3dpbmcgaW1hZ2VzIGluIHRoZSByZWdpc3RyeSBETEdfSU1HX0VSUk9SCi0JICogRExHX0lNR19JTkZPIERMR19JTUdfUVVFU1RJT04gRExHX0lNR19XQVJOSU5HCi0JICogCi0JICogVGhleSBhcmUgbm93IGNvbWluZyBkaXJlY3RseSBmcm9tIFNXVCBzZWUgSW1hZ2VSZWdpc3RyeS4gRm9yIGJhY2t3YXJkcwotCSAqIGNvbXBhdGliaWxpdHkgdGhleSBhcmUgc3RpbGwgc3VwcG9ydGVkLCBob3dldmVyIG5ldyBjb2RlIHNob3VsZCB1c2UgU1dUCi0JICogZm9yIHRoZXNlLgotCSAqIAotCSAqIEBzZWUgRGlzcGxheSNnZXRTeXN0ZW1JY29uKGludCBJRCkKLQkgKi8KLQlzdGF0aWMgewotCQlJbWFnZVJlZ2lzdHJ5IHJlZyA9IEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQkJcmVnLnB1dChETEdfSU1HX01FU1NBR0VfSU5GTywgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKAotCQkJCURpYWxvZy5jbGFzcywgImltYWdlcy9tZXNzYWdlX2luZm8uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXJlZy5wdXQoRExHX0lNR19NRVNTQUdFX1dBUk5JTkcsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZSgKLQkJCQlEaWFsb2cuY2xhc3MsICJpbWFnZXMvbWVzc2FnZV93YXJuaW5nLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZWcucHV0KERMR19JTUdfTUVTU0FHRV9FUlJPUiwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKAotCQkJCURpYWxvZy5jbGFzcywgImltYWdlcy9tZXNzYWdlX2Vycm9yLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBkaWFsb2cgYXJlYTsgPGNvZGU+bnVsbDwvY29kZT4gdW50aWwgZGlhbG9nIGlzIGxheWVkIG91dC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBkaWFsb2dBcmVhOwotCi0JLyoqCi0JICogVGhlIGJ1dHRvbiBiYXI7IDxjb2RlPm51bGw8L2NvZGU+IHVudGlsIGRpYWxvZyBpcyBsYXllZCBvdXQuCi0JICovCi0JcHVibGljIENvbnRyb2wgYnV0dG9uQmFyOwotCQotCS8qKgotCSAqIEEgbW91c2UgbGlzdGVuZXIgdGhhdCBjYW4gYmUgdXNlZCB0byByZXN0b3JlIHRoZSBkZWZhdWx0IHNpemUKLQkgKiBvZiBhIGRpYWxvZy4gIAotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwcml2YXRlIE1vdXNlTGlzdGVuZXIgcmVzdG9yZVNpemVNb3VzZUxpc3RlbmVyID0gbmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQlyZXN0b3JlRGlhbG9nVG9Db21wdXRlZFNpemUoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDb2xsZWN0aW9uIG9mIGJ1dHRvbnMgY3JlYXRlZCBieSB0aGUgPGNvZGU+Y3JlYXRlQnV0dG9uPC9jb2RlPiBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGJ1dHRvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogRm9udCBtZXRyaWNzIHRvIHVzZSBmb3IgZGV0ZXJtaW5pbmcgcGl4ZWwgc2l6ZXMuCi0JICovCi0JcHJpdmF0ZSBGb250TWV0cmljcyBmb250TWV0cmljczsKLQkKLQkvKioKLQkgKiBQb2ludCB1c2VkIGZvciBzdG9yaW5nIGluaXRpYWwgY29tcHV0ZWQgc2l6ZSBvZiB0aGUgZGlhbG9nIHNvCi0JICogdGhhdCBpdCBtYXkgYmUgcmVzdG9yZWQuCi0JICovCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlZFNpemU7Ci0KLQkvKioKLQkgKiBOdW1iZXIgb2YgaG9yaXpvbnRhbCBkaWFsb2cgdW5pdHMgcGVyIGNoYXJhY3RlciwgdmFsdWUgPGNvZGU+NDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhPUklaT05UQUxfRElBTE9HX1VOSVRfUEVSX0NIQVIgPSA0OwotCi0JLyoqCi0JICogTnVtYmVyIG9mIHZlcnRpY2FsIGRpYWxvZyB1bml0cyBwZXIgY2hhcmFjdGVyLCB2YWx1ZSA8Y29kZT44PC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkVSVElDQUxfRElBTE9HX1VOSVRTX1BFUl9DSEFSID0gODsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwaXhlbHMgY29ycmVzcG9uZGluZyB0byB0aGUgaGVpZ2h0IG9mIHRoZSBnaXZlbgotCSAqIG51bWJlciBvZiBjaGFyYWN0ZXJzLgotCSAqIDxwPgotCSAqIFRoZSByZXF1aXJlZCA8Y29kZT5Gb250TWV0cmljczwvY29kZT4gcGFyYW1ldGVyIG1heSBiZSBjcmVhdGVkIGluIHRoZQotCSAqIGZvbGxvd2luZyB3YXk6IDxjb2RlPgotCSAqIAlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkgKglnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkgKglmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JICoJZ2MuZGlzcG9zZSgpOwotCSAqIDwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGZvbnRNZXRyaWNzCi0JICogICAgICAgICAgICB1c2VkIGluIHBlcmZvcm1pbmcgdGhlIGNvbnZlcnNpb24KLQkgKiBAcGFyYW0gY2hhcnMKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycwotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyhGb250TWV0cmljcyBmb250TWV0cmljcywKLQkJCWludCBjaGFycykgewotCQlyZXR1cm4gZm9udE1ldHJpY3MuZ2V0SGVpZ2h0KCkgKiBjaGFyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG51bWJlciBvZgotCSAqIGhvcml6b250YWwgZGlhbG9nIHVuaXRzLgotCSAqIDxwPgotCSAqIFRoZSByZXF1aXJlZCA8Y29kZT5Gb250TWV0cmljczwvY29kZT4gcGFyYW1ldGVyIG1heSBiZSBjcmVhdGVkIGluIHRoZQotCSAqIGZvbGxvd2luZyB3YXk6IDxjb2RlPgotCSAqIAlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkgKglnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkgKglmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JICoJZ2MuZGlzcG9zZSgpOwotCSAqIDwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGZvbnRNZXRyaWNzCi0JICogICAgICAgICAgICB1c2VkIGluIHBlcmZvcm1pbmcgdGhlIGNvbnZlcnNpb24KLQkgKiBAcGFyYW0gZGx1cwotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBob3Jpem9udGFsIGRpYWxvZyB1bml0cwotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoRm9udE1ldHJpY3MgZm9udE1ldHJpY3MsCi0JCQlpbnQgZGx1cykgewotCQkvLyByb3VuZCB0byB0aGUgbmVhcmVzdCBwaXhlbAotCQlyZXR1cm4gKGZvbnRNZXRyaWNzLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKSAqIGRsdXMgKyBIT1JJWk9OVEFMX0RJQUxPR19VTklUX1BFUl9DSEFSIC8gMikKLQkJCQkvIEhPUklaT05UQUxfRElBTE9HX1VOSVRfUEVSX0NIQVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBudW1iZXIgb2YKLQkgKiB2ZXJ0aWNhbCBkaWFsb2cgdW5pdHMuCi0JICogPHA+Ci0JICogVGhlIHJlcXVpcmVkIDxjb2RlPkZvbnRNZXRyaWNzPC9jb2RlPiBwYXJhbWV0ZXIgbWF5IGJlIGNyZWF0ZWQgaW4gdGhlCi0JICogZm9sbG93aW5nIHdheTogPGNvZGU+Ci0JICogCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCSAqCWdjLnNldEZvbnQoY29udHJvbC5nZXRGb250KCkpOwotCSAqCWZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkgKglnYy5kaXNwb3NlKCk7Ci0JICogPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZm9udE1ldHJpY3MKLQkgKiAgICAgICAgICAgIHVzZWQgaW4gcGVyZm9ybWluZyB0aGUgY29udmVyc2lvbgotCSAqIEBwYXJhbSBkbHVzCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHZlcnRpY2FsIGRpYWxvZyB1bml0cwotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzLAotCQkJaW50IGRsdXMpIHsKLQkJLy8gcm91bmQgdG8gdGhlIG5lYXJlc3QgcGl4ZWwKLQkJcmV0dXJuIChmb250TWV0cmljcy5nZXRIZWlnaHQoKSAqIGRsdXMgKyBWRVJUSUNBTF9ESUFMT0dfVU5JVFNfUEVSX0NIQVIgLyAyKQotCQkJCS8gVkVSVElDQUxfRElBTE9HX1VOSVRTX1BFUl9DSEFSOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwaXhlbHMgY29ycmVzcG9uZGluZyB0byB0aGUgd2lkdGggb2YgdGhlIGdpdmVuCi0JICogbnVtYmVyIG9mIGNoYXJhY3RlcnMuCi0JICogPHA+Ci0JICogVGhlIHJlcXVpcmVkIDxjb2RlPkZvbnRNZXRyaWNzPC9jb2RlPiBwYXJhbWV0ZXIgbWF5IGJlIGNyZWF0ZWQgaW4gdGhlCi0JICogZm9sbG93aW5nIHdheTogPGNvZGU+Ci0JICogCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCSAqCWdjLnNldEZvbnQoY29udHJvbC5nZXRGb250KCkpOwotCSAqCWZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkgKglnYy5kaXNwb3NlKCk7Ci0JICogPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZm9udE1ldHJpY3MKLQkgKiAgICAgICAgICAgIHVzZWQgaW4gcGVyZm9ybWluZyB0aGUgY29udmVyc2lvbgotCSAqIEBwYXJhbSBjaGFycwotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBpeGVscwotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoRm9udE1ldHJpY3MgZm9udE1ldHJpY3MsCi0JCQlpbnQgY2hhcnMpIHsKLQkJcmV0dXJuIGZvbnRNZXRyaWNzLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKSAqIGNoYXJzOwotCX0KLQotCS8qKgotCSAqIFNob3J0ZW5zIHRoZSBnaXZlbiB0ZXh0IDxjb2RlPnRleHRWYWx1ZTwvY29kZT4gc28gdGhhdCBpdHMgd2lkdGggaW4KLQkgKiBwaXhlbHMgZG9lcyBub3QgZXhjZWVkIHRoZSB3aWR0aCBvZiB0aGUgZ2l2ZW4gY29udHJvbC4gT3ZlcnJpZGVzCi0JICogY2hhcmFjdGVycyBpbiB0aGUgY2VudGVyIG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcgd2l0aCBhbiBlbGxpcHNpcyAoIi4uLiIpCi0JICogaWYgbmVjZXNzYXJ5LiBJZiBhIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIGlzIGdpdmVuLCA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBzdHJpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgdGhlIGNvbnRyb2wgdGhlIHN0cmluZyB3aWxsIGJlIGRpc3BsYXllZCBvbgotCSAqIEByZXR1cm4gdGhlIHN0cmluZyB0byBkaXNwbGF5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBudWxsIHdhcyBwYXNzZWQKLQkgKiAgICAgICAgIGluCi0JICogCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5UZXh0KFN0cmluZyB0ZXh0VmFsdWUsIENvbnRyb2wgY29udHJvbCkgewotCQlpZiAodGV4dFZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7Ci0JCWludCBtYXhXaWR0aCA9IGNvbnRyb2wuZ2V0Qm91bmRzKCkud2lkdGggLSA1OwotCQlpZiAoZ2MudGV4dEV4dGVudCh0ZXh0VmFsdWUpLnggPCBtYXhXaWR0aCkgewotCQkJZ2MuZGlzcG9zZSgpOwotCQkJcmV0dXJuIHRleHRWYWx1ZTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gdGV4dFZhbHVlLmxlbmd0aCgpOwotCQlpbnQgcGl2b3QgPSBsZW5ndGggLyAyOwotCQlpbnQgc3RhcnQgPSBwaXZvdDsKLQkJaW50IGVuZCA9IHBpdm90ICsgMTsKLQkJd2hpbGUgKHN0YXJ0ID49IDAgJiYgZW5kIDwgbGVuZ3RoKSB7Ci0JCQlTdHJpbmcgczEgPSB0ZXh0VmFsdWUuc3Vic3RyaW5nKDAsIHN0YXJ0KTsKLQkJCVN0cmluZyBzMiA9IHRleHRWYWx1ZS5zdWJzdHJpbmcoZW5kLCBsZW5ndGgpOwotCQkJU3RyaW5nIHMgPSBzMSArIEVMTElQU0lTICsgczI7Ci0JCQlpbnQgbCA9IGdjLnRleHRFeHRlbnQocykueDsKLQkJCWlmIChsIDwgbWF4V2lkdGgpIHsKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJcmV0dXJuIHM7Ci0JCQl9Ci0JCQlzdGFydC0tOwotCQkJZW5kKys7Ci0JCX0KLQkJZ2MuZGlzcG9zZSgpOwotCQlyZXR1cm4gdGV4dFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIGJsb2NrZWQgaGFuZGxlciB3aGljaCBkb2VzIG5vdCBkbwotCSAqIGFueXRoaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURpYWxvZ0Jsb2NrZWRIYW5kbGVyIGJsb2NrZWRIYW5kbGVyID0gbmV3IElEaWFsb2dCbG9ja2VkSGFuZGxlcigpIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dCbG9ja2VkSGFuZGxlciNjbGVhckJsb2NrZWQoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgY2xlYXJCbG9ja2VkKCkgewotCQkJLy8gTm8gZGVmYXVsdCBiZWhhdmlvdXIKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQmxvY2tlZEhhbmRsZXIjc2hvd0Jsb2NrZWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93QmxvY2tlZChJUHJvZ3Jlc3NNb25pdG9yIGJsb2NraW5nLAotCQkJCUlTdGF0dXMgYmxvY2tpbmdTdGF0dXMsIFN0cmluZyBibG9ja2VkTmFtZSkgewotCQkJLy8gTm8gZGVmYXVsdCBiZWhhdmlvdXIKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQmxvY2tlZEhhbmRsZXIjc2hvd0Jsb2NrZWQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93QmxvY2tlZChTaGVsbCBwYXJlbnRTaGVsbCwgSVByb2dyZXNzTW9uaXRvciBibG9ja2luZywKLQkJCQlJU3RhdHVzIGJsb2NraW5nU3RhdHVzLCBTdHJpbmcgYmxvY2tlZE5hbWUpIHsKLQkJCS8vIE5vIGRlZmF1bHQgYmVoYXZpb3VyCi0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRpYWxvZyBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoZSB3aW5kb3cgd2lsbCBoYXZlIG5vIHZpc3VhbAotCSAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uIEJ5IGRlZmF1bHQsCi0JICogPGNvZGU+b3BlbjwvY29kZT4gYmxvY2tzIGZvciBkaWFsb2dzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gY3JlYXRlIGEgdG9wLWxldmVsCi0JICogICAgICAgICAgICBzaGVsbAotCSAqLwotCXByb3RlY3RlZCBEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJdGhpcyhuZXcgU2FtZVNoZWxsUHJvdmlkZXIocGFyZW50U2hlbGwpKTsKLQkJaWYgKHBhcmVudFNoZWxsID09IG51bGwgJiYgUG9saWN5LkRFQlVHX0RJQUxPR19OT19QQVJFTlQpCi0JCQlQb2xpY3kuZ2V0TG9nKCkubG9nKAotCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgUG9saWN5LkpGQUNFLCBJU3RhdHVzLklORk8sIHRoaXMKLQkJCQkJCQkuZ2V0Q2xhc3MoKQotCQkJCQkJCSsgIiBjcmVhdGVkIHdpdGggbm8gc2hlbGwiLC8vJE5PTi1OTFMtMSQKLQkJCQkJCQluZXcgRXhjZXB0aW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZGlhbG9nIHdpdGggdGhlIGdpdmVuIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIG9iamVjdCB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgcGFyZW50IHNoZWxsCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBEaWFsb2coSVNoZWxsUHJvdmlkZXIgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTAotCQkJCXwgZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCkpOwotCQlzZXRCbG9ja09uT3Blbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoaXMgZGlhbG9nJ3MgYnV0dG9uIHdpdGggdGhlIGdpdmVuIGlkIGhhcyBiZWVuIHByZXNzZWQuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPkRpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIGNhbGxzCi0JICogPGNvZGU+b2tQcmVzc2VkPC9jb2RlPiBpZiB0aGUgb2sgYnV0dG9uIGlzIHRoZSBwcmVzc2VkLCBhbmQKLQkgKiA8Y29kZT5jYW5jZWxQcmVzc2VkPC9jb2RlPiBpZiB0aGUgY2FuY2VsIGJ1dHRvbiBpcyB0aGUgcHJlc3NlZC4gQWxsCi0JICogb3RoZXIgYnV0dG9uIHByZXNzZXMgYXJlIGlnbm9yZWQuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIGhhbmRsZSBvdGhlcgotCSAqIGJ1dHRvbnMsIGJ1dCBzaG91bGQgY2FsbCA8Y29kZT5zdXBlci5idXR0b25QcmVzc2VkPC9jb2RlPiBpZiB0aGUKLQkgKiBkZWZhdWx0IGhhbmRsaW5nIG9mIHRoZSBvayBhbmQgY2FuY2VsIGJ1dHRvbnMgaXMgZGVzaXJlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGJ1dHRvbklkCi0JICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIChzZWUKLQkgKiAgICAgICAgICAgIDxjb2RlPklEaWFsb2dDb25zdGFudHMuKl9JRDwvY29kZT4gY29uc3RhbnRzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChJRGlhbG9nQ29uc3RhbnRzLk9LX0lEID09IGJ1dHRvbklkKQotCQkJb2tQcmVzc2VkKCk7Ci0JCWVsc2UgaWYgKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEID09IGJ1dHRvbklkKQotCQkJY2FuY2VsUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIGNhbmNlbCBidXR0b24gb2YgdGhpcyBkaWFsb2cgaGFzIGJlZW4gcHJlc3NlZC4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2Qgc2V0cwotCSAqIHRoaXMgZGlhbG9nJ3MgcmV0dXJuIGNvZGUgdG8gPGNvZGU+V2luZG93LkNBTkNFTDwvY29kZT4gYW5kIGNsb3NlcyB0aGUKLQkgKiBkaWFsb2cuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIGlmIGRlc2lyZWQuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCXNldFJldHVybkNvZGUoQ0FOQ0VMKTsKLQkJY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhlaWdodCBvZiB0aGUgZ2l2ZW4KLQkgKiBudW1iZXIgb2YgY2hhcmFjdGVycy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+aW5pdGlhbGl6ZURpYWxvZ1VuaXRzPC9jb2RlPgotCSAqIGhhcyBiZWVuIGNhbGxlZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQ2xpZW50cyBtYXkgY2FsbCB0aGlzIGZyYW1ld29yayBtZXRob2QsIGJ1dCBzaG91bGQgbm90IG92ZXJyaWRlIGl0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY2hhcnMKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycwotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoaW50IGNoYXJzKSB7Ci0JCS8vIHRlc3QgZm9yIGZhaWx1cmUgdG8gaW5pdGlhbGl6ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyhmb250TWV0cmljcywgY2hhcnMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwaXhlbHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbnVtYmVyIG9mCi0JICogaG9yaXpvbnRhbCBkaWFsb2cgdW5pdHMuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmluaXRpYWxpemVEaWFsb2dVbml0czwvY29kZT4KLQkgKiBoYXMgYmVlbiBjYWxsZWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIENsaWVudHMgbWF5IGNhbGwgdGhpcyBmcmFtZXdvcmsgbWV0aG9kLCBidXQgc2hvdWxkIG5vdCBvdmVycmlkZSBpdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRsdXMKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBkaWFsb2cgdW5pdHMKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGl4ZWxzCi0JICovCi0JcHJvdGVjdGVkIGludCBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhpbnQgZGx1cykgewotCQkvLyB0ZXN0IGZvciBmYWlsdXJlIHRvIGluaXRpYWxpemUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLQkJaWYgKGZvbnRNZXRyaWNzID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBkbHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG51bWJlciBvZgotCSAqIHZlcnRpY2FsIGRpYWxvZyB1bml0cy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+aW5pdGlhbGl6ZURpYWxvZ1VuaXRzPC9jb2RlPgotCSAqIGhhcyBiZWVuIGNhbGxlZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQ2xpZW50cyBtYXkgY2FsbCB0aGlzIGZyYW1ld29yayBtZXRob2QsIGJ1dCBzaG91bGQgbm90IG92ZXJyaWRlIGl0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZGx1cwotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiB2ZXJ0aWNhbCBkaWFsb2cgdW5pdHMKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGl4ZWxzCi0JICovCi0JcHJvdGVjdGVkIGludCBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoaW50IGRsdXMpIHsKLQkJLy8gdGVzdCBmb3IgZmFpbHVyZSB0byBpbml0aWFsaXplIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsIGRsdXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwaXhlbHMgY29ycmVzcG9uZGluZyB0byB0aGUgd2lkdGggb2YgdGhlIGdpdmVuCi0JICogbnVtYmVyIG9mIGNoYXJhY3RlcnMuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmluaXRpYWxpemVEaWFsb2dVbml0czwvY29kZT4KLQkgKiBoYXMgYmVlbiBjYWxsZWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIENsaWVudHMgbWF5IGNhbGwgdGhpcyBmcmFtZXdvcmsgbWV0aG9kLCBidXQgc2hvdWxkIG5vdCBvdmVycmlkZSBpdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGNoYXJzCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGl4ZWxzCi0JICovCi0JcHJvdGVjdGVkIGludCBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoaW50IGNoYXJzKSB7Ci0JCS8vIHRlc3QgZm9yIGZhaWx1cmUgdG8gaW5pdGlhbGl6ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBjaGFycyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBidXR0b24gd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPkRpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIGNyZWF0ZXMKLQkgKiBhIHN0YW5kYXJkIHB1c2ggYnV0dG9uLCByZWdpc3RlcnMgaXQgZm9yIHNlbGVjdGlvbiBldmVudHMgaW5jbHVkaW5nCi0JICogYnV0dG9uIHByZXNzZXMsIGFuZCByZWdpc3RlcnMgZGVmYXVsdCBidXR0b25zIHdpdGggaXRzIHNoZWxsLiBUaGUgYnV0dG9uCi0JICogaWQgaXMgc3RvcmVkIGFzIHRoZSBidXR0b24ncyBjbGllbnQgZGF0YS4gSWYgdGhlIGJ1dHRvbiBpZCBpcwotCSAqIDxjb2RlPklEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEPC9jb2RlPiwgdGhlIG5ldyBidXR0b24gd2lsbCBiZQotCSAqIGFjY2Vzc2libGUgZnJvbSA8Y29kZT5nZXRDYW5jZWxCdXR0b24oKTwvY29kZT4uIElmIHRoZSBidXR0b24gaWQgaXMKLQkgKiA8Y29kZT5JRGlhbG9nQ29uc3RhbnRzLk9LX0lEPC9jb2RlPiwgdGhlIG5ldyBidXR0b24gd2lsbCBiZSBhY2Nlc2libGUKLQkgKiBmcm9tIDxjb2RlPmdldE9LQnV0dG9uKCk8L2NvZGU+LiBOb3RlIHRoYXQgdGhlIHBhcmVudCdzIGxheW91dCBpcwotCSAqIGFzc3VtZWQgdG8gYmUgYSA8Y29kZT5HcmlkTGF5b3V0PC9jb2RlPiBhbmQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluCi0JICogdGhpcyBsYXlvdXQgaXMgaW5jcmVtZW50ZWQuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBidXR0b24gKHNlZSA8Y29kZT5JRGlhbG9nQ29uc3RhbnRzLipfSUQ8L2NvZGU+Ci0JICogICAgICAgICAgICBjb25zdGFudHMgZm9yIHN0YW5kYXJkIGRpYWxvZyBidXR0b24gaWRzKQotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIGZyb20gdGhlIGJ1dHRvbgotCSAqIEBwYXJhbSBkZWZhdWx0QnV0dG9uCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYnV0dG9uIGlzIHRvIGJlIHRoZSBkZWZhdWx0IGJ1dHRvbiwKLQkgKiAgICAgICAgICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiB0aGUgbmV3IGJ1dHRvbgotCSAqIAotCSAqIEBzZWUgI2dldENhbmNlbEJ1dHRvbgotCSAqIEBzZWUgI2dldE9LQnV0dG9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBpbnQgaWQsIFN0cmluZyBsYWJlbCwKLQkJCWJvb2xlYW4gZGVmYXVsdEJ1dHRvbikgewotCQkvLyBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBidXR0b24gYmFyCi0JCSgoR3JpZExheW91dCkgcGFyZW50LmdldExheW91dCgpKS5udW1Db2x1bW5zKys7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCWJ1dHRvbi5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWJ1dHRvbi5zZXREYXRhKG5ldyBJbnRlZ2VyKGlkKSk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJYnV0dG9uUHJlc3NlZCgoKEludGVnZXIpIGV2ZW50LndpZGdldC5nZXREYXRhKCkpLmludFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJaWYgKGRlZmF1bHRCdXR0b24pIHsKLQkJCVNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0JCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQkJCX0KLQkJfQotCQlidXR0b25zLnB1dChuZXcgSW50ZWdlcihpZCksIGJ1dHRvbik7Ci0JCXNldEJ1dHRvbkxheW91dERhdGEoYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIGRpYWxvZydzIGJ1dHRvbiBiYXIuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPkRpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIGxheXMKLQkgKiBvdXQgYSBidXR0b24gYmFyIGFuZCBjYWxscyB0aGUgPGNvZGU+Y3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcjwvY29kZT4KLQkgKiBmcmFtZXdvcmsgbWV0aG9kIHRvIHBvcHVsYXRlIGl0LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIHJldHVybmVkIGNvbnRyb2wncyBsYXlvdXQgZGF0YSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mCi0JICogPGNvZGU+R3JpZERhdGE8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBidXR0b24gYmFyCi0JICogQHJldHVybiB0aGUgYnV0dG9uIGJhciBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCS8vIGNyZWF0ZSBhIGxheW91dCB3aXRoIHNwYWNpbmcgYW5kIG1hcmdpbnMgYXBwcm9wcmlhdGUgZm9yIHRoZSBmb250Ci0JCS8vIHNpemUuCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAwOyAvLyB0aGlzIGlzIGluY3JlbWVudGVkIGJ5IGNyZWF0ZUJ1dHRvbgotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5ECi0JCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCQotCQkvLyBBZGQgdGhlIGJ1dHRvbnMgdG8gdGhlIGJ1dHRvbiBiYXIuCi0JCWNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGJ1dHRvbnMgdG8gdGhpcyBkaWFsb2cncyBidXR0b24gYmFyLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBhZGRzCi0JICogc3RhbmRhcmQgb2sgYW5kIGNhbmNlbCBidXR0b25zIHVzaW5nIHRoZSA8Y29kZT5jcmVhdGVCdXR0b248L2NvZGU+Ci0JICogZnJhbWV3b3JrIG1ldGhvZC4gVGhlc2Ugc3RhbmRhcmQgYnV0dG9ucyB3aWxsIGJlIGFjY2Vzc2libGUgZnJvbQotCSAqIDxjb2RlPmdldENhbmNlbEJ1dHRvbjwvY29kZT4sIGFuZCA8Y29kZT5nZXRPS0J1dHRvbjwvY29kZT4uCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b24gYmFyIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgT0sgYW5kIENhbmNlbCBidXR0b25zIGJ5IGRlZmF1bHQKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgV2luZG93LmluaXRpYWxpemVCb3VuZHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCb3VuZHMoKSB7Ci0JCVN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotCQlpZiAoImNhcmJvbiIuZXF1YWxzKHBsYXRmb3JtKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBPbiBNYWMgT1MgWCB0aGUgZGVmYXVsdCBidXR0b24gbXVzdCBiZSB0aGUgcmlnaHQtbW9zdCBidXR0b24KLQkJCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJCWlmIChzaGVsbCAhPSBudWxsKSB7Ci0JCQkJQnV0dG9uIGRlZmF1bHRCdXR0b24gPSBzaGVsbC5nZXREZWZhdWx0QnV0dG9uKCk7Ci0JCQkJaWYgKGRlZmF1bHRCdXR0b24gIT0gbnVsbAotCQkJCQkJJiYgaXNDb250YWluZWQoYnV0dG9uQmFyLCBkZWZhdWx0QnV0dG9uKSkKLQkJCQkJZGVmYXVsdEJ1dHRvbi5tb3ZlQmVsb3cobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIFN0b3JlIHRoZSBjb21wdXRlZCBzaXplIGZvciB0aGUgZGlhbG9nLiAgTXVzdCBiZSBkb25lIGhlcmUgYmVmb3JlCi0JCS8vIGFueSBkaWFsb2cgc2V0dGluZ3MgYXJlIGFwcGxpZWQuICBXZSBkb24ndCBkbyB0aGlzIGluIHRoZSBjcmVhdGUgbWV0aG9kcwotCQkvLyBiZWNhdXNlIHRoZSBkaWFsb2cgZm9udCBpcyBhcHBsaWVkIGFmdGVyIGNyZWF0aW9uIGFuZCBiZWZvcmUgdGhlIGJvdW5kcwotCQkvLyBhcmUgaW5pdGlhbGl6ZWQuCi0JCWNvbXB1dGVkU2l6ZSA9IGdldFNoZWxsKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsJCi0JCQotCQlzdXBlci5pbml0aWFsaXplQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBDb250cm9sIGlzIGEgZGlyZWN0IG9yIGluZGlyZWN0IGNoaWxkIG9mCi0JICogY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHRoZSBwb3RlbnRpYWwgcGFyZW50Ci0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29udHJvbCBpcyBhIGNoaWxkIG9mIGNvbnRhaW5lcgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbnRhaW5lZChDb250cm9sIGNvbnRhaW5lciwgQ29udHJvbCBjb250cm9sKSB7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQ7Ci0JCXdoaWxlICgocGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKSkgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudCA9PSBjb250YWluZXIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQljb250cm9sID0gcGFyZW50OwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPldpbmRvdzwvY29kZT4KLQkgKiBtZXRob2QgY3JlYXRlcyBhbmQgbGF5cyBvdXQgdGhlIHRvcCBsZXZlbCBjb21wb3NpdGUgZm9yIHRoZSBkaWFsb2csIGFuZAotCSAqIGRldGVybWluZXMgdGhlIGFwcHJvcHJpYXRlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpYWxvZyB1bml0cyBiYXNlZCBvbgotCSAqIHRoZSBmb250IHNpemUuIEl0IHRoZW4gY2FsbHMgdGhlIDxjb2RlPmNyZWF0ZURpYWxvZ0FyZWE8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmNyZWF0ZUJ1dHRvbkJhcjwvY29kZT4gbWV0aG9kcyB0byBjcmVhdGUgdGhlIGRpYWxvZyBhcmVhIGFuZAotCSAqIGJ1dHRvbiBiYXIsIHJlc3BlY3RpdmVseS4gT3ZlcnJpZGluZyA8Y29kZT5jcmVhdGVEaWFsb2dBcmVhPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5jcmVhdGVCdXR0b25CYXI8L2NvZGU+IGFyZSByZWNvbW1lbmRlZCByYXRoZXIgdGhhbiBvdmVycmlkaW5nCi0JICogdGhpcyBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgdGhlIHRvcCBsZXZlbCBjb21wb3NpdGUgZm9yIHRoZSBkaWFsb2cKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCAwKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgZGlhbG9nIHVuaXRzCi0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wb3NpdGUpOwotCQkvLyBjcmVhdGUgdGhlIGRpYWxvZyBhcmVhIGFuZCBidXR0b24gYmFyCi0JCWRpYWxvZ0FyZWEgPSBjcmVhdGVEaWFsb2dBcmVhKGNvbXBvc2l0ZSk7Ci0JCWJ1dHRvbkJhciA9IGNyZWF0ZUJ1dHRvbkJhcihjb21wb3NpdGUpOwotCQkJCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSB1cHBlciBwYXJ0IG9mIHRoaXMgZGlhbG9nIChhYm92ZQotCSAqIHRoZSBidXR0b24gYmFyKS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgY3JlYXRlcwotCSAqIGFuZCByZXR1cm5zIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZAotCSAqIHNwYWNpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSByZXR1cm5lZCBjb250cm9sJ3MgbGF5b3V0IGRhdGEgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZgotCSAqIDxjb2RlPkdyaWREYXRhPC9jb2RlPi4gVGhpcyBtZXRob2QgbXVzdCBub3QgbW9kaWZ5IHRoZSBwYXJlbnQncwotCSAqIGxheW91dC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGJ1dCBtYXkgY2FsbCA8Y29kZT5zdXBlcjwvY29kZT4gYXMKLQkgKiBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6Ci0JICogPC9wPgotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkgKiAvL2FkZCBjb250cm9scyB0byBjb21wb3NpdGUgYXMgbmVjZXNzYXJ5Ci0JICogcmV0dXJuIGNvbXBvc2l0ZTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBkaWFsb2cgYXJlYQotCSAqIEByZXR1cm4gdGhlIGRpYWxvZyBhcmVhIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnV0dG9uIGNyZWF0ZWQgYnkgdGhlIG1ldGhvZCA8Y29kZT5jcmVhdGVCdXR0b248L2NvZGU+IGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgSUQgYXMgZGVmaW5lZCBvbiA8Y29kZT5JRGlhbG9nQ29uc3RhbnRzPC9jb2RlPi4gSWYKLQkgKiA8Y29kZT5jcmVhdGVCdXR0b248L2NvZGU+IHdhcyBuZXZlciBjYWxsZWQgd2l0aCB0aGlzIElELCBvciBpZgotCSAqIDxjb2RlPmNyZWF0ZUJ1dHRvbjwvY29kZT4gaXMgb3ZlcnJpZGRlbiwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgYnV0dG9uIHRvIGxvb2sgZm9yCi0JICogCi0JICogQHJldHVybiB0aGUgYnV0dG9uIGZvciB0aGUgSUQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAKLQkgKiBAc2VlICNjcmVhdGVCdXR0b24oQ29tcG9zaXRlLCBpbnQsIFN0cmluZywgYm9vbGVhbikKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBnZXRCdXR0b24oaW50IGlkKSB7Ci0JCXJldHVybiAoQnV0dG9uKSBidXR0b25zLmdldChuZXcgSW50ZWdlcihpZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJ1dHRvbiBiYXIgY29udHJvbC4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIG1heSBjYWxsIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCwgYnV0IHNob3VsZCBub3Qgb3ZlcnJpZGUgaXQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJ1dHRvbiBiYXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBidXR0b24gYmFyIGhhcyBub3QKLQkgKiAgICAgICAgIGJlZW4gY3JlYXRlZCB5ZXQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXRCdXR0b25CYXIoKSB7Ci0JCXJldHVybiBidXR0b25CYXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnV0dG9uIGNyZWF0ZWQgd2hlbiA8Y29kZT5jcmVhdGVCdXR0b248L2NvZGU+IGlzIGNhbGxlZAotCSAqIHdpdGggYW4gSUQgb2YgPGNvZGU+SURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQ8L2NvZGU+LiBJZgotCSAqIDxjb2RlPmNyZWF0ZUJ1dHRvbjwvY29kZT4gd2FzIG5ldmVyIGNhbGxlZCB3aXRoIHRoaXMgcGFyYW1ldGVyLCBvciBpZgotCSAqIDxjb2RlPmNyZWF0ZUJ1dHRvbjwvY29kZT4gaXMgb3ZlcnJpZGRlbiwgPGNvZGU+Z2V0Q2FuY2VsQnV0dG9uPC9jb2RlPgotCSAqIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNhbmNlbCBidXR0b24gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAKLQkgKiBAc2VlICNjcmVhdGVCdXR0b24oQ29tcG9zaXRlLCBpbnQsIFN0cmluZywgYm9vbGVhbikKLQkgKiBAc2luY2UgMi4wCi0JICogQGRlcHJlY2F0ZWQgVXNlIDxjb2RlPmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCk8L2NvZGU+Ci0JICogICAgICAgICAgICAgaW5zdGVhZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIHNvb24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBnZXRDYW5jZWxCdXR0b24oKSB7Ci0JCXJldHVybiBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpYWxvZyBhcmVhIGNvbnRyb2wuCi0JICogPHA+Ci0JICogQ2xpZW50cyBtYXkgY2FsbCB0aGlzIGZyYW1ld29yayBtZXRob2QsIGJ1dCBzaG91bGQgbm90IG92ZXJyaWRlIGl0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgYXJlYSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRpYWxvZyBhcmVhIGhhcwotCSAqICAgICAgICAgbm90IGJlZW4gY3JlYXRlZCB5ZXQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXREaWFsb2dBcmVhKCkgewotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaWFsb2cgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5LiBOb3RlIHRoYXQgdGhlc2UKLQkgKiBpbWFnZXMgYXJlIG1hbmFnZWQgYnkgdGhlIGRpYWxvZyBmcmFtZXdvcmssIGFuZCBtdXN0IG5vdCBiZSBkaXNwb3NlZCBieQotCSAqIGFub3RoZXIgcGFydHkuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSA8Y29kZT5EaWFsb2cuRExHX0lNR18qIDwvY29kZT4gY29uc3RhbnRzCi0JICogQHJldHVybiB0aGUgc3RhbmRhcmQgZGlhbG9nIGltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnV0dG9uIGNyZWF0ZWQgd2hlbiA8Y29kZT5jcmVhdGVCdXR0b248L2NvZGU+IGlzIGNhbGxlZAotCSAqIHdpdGggYW4gSUQgb2YgPGNvZGU+SURpYWxvZ0NvbnN0YW50cy5PS19JRDwvY29kZT4uIElmCi0JICogPGNvZGU+Y3JlYXRlQnV0dG9uPC9jb2RlPiB3YXMgbmV2ZXIgY2FsbGVkIHdpdGggdGhpcyBwYXJhbWV0ZXIsIG9yIGlmCi0JICogPGNvZGU+Y3JlYXRlQnV0dG9uPC9jb2RlPiBpcyBvdmVycmlkZGVuLCA8Y29kZT5nZXRPS0J1dHRvbjwvY29kZT4KLQkgKiB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBPSyBidXR0b24gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAKLQkgKiBAc2VlICNjcmVhdGVCdXR0b24oQ29tcG9zaXRlLCBpbnQsIFN0cmluZywgYm9vbGVhbikKLQkgKiBAc2luY2UgMi4wCi0JICogQGRlcHJlY2F0ZWQgVXNlIDxjb2RlPmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTwvY29kZT4gaW5zdGVhZC4KLQkgKiAgICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgc29vbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGdldE9LQnV0dG9uKCkgewotCQlyZXR1cm4gZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb21wdXRhdGlvbiBvZiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkaWFsb2cgdW5pdHMgYmFzZWQKLQkgKiBvbiB0aGUgc2l6ZSBvZiBjdXJyZW50IGZvbnQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvZiB0aGUgZGlhbG9nIHVuaXQgYmFzZWQgY29udmVyc2lvbgotCSAqIG1ldGhvZHMgYXJlIGNhbGxlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiAgICAgICAgICAgIGEgY29udHJvbCBmcm9tIHdoaWNoIHRvIG9idGFpbiB0aGUgY3VycmVudCBmb250Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKENvbnRyb2wgY29udHJvbCkgewotCQkvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIG9rIGJ1dHRvbiBvZiB0aGlzIGRpYWxvZyBoYXMgYmVlbiBwcmVzc2VkLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBzZXRzCi0JICogdGhpcyBkaWFsb2cncyByZXR1cm4gY29kZSB0byA8Y29kZT5XaW5kb3cuT0s8L2NvZGU+IGFuZCBjbG9zZXMgdGhlCi0JICogZGlhbG9nLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlzZXRSZXR1cm5Db2RlKE9LKTsKLQkJY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxheW91dCBkYXRhIG9mIHRoZSBidXR0b24gdG8gYSBHcmlkRGF0YSB3aXRoIGFwcHJvcHJpYXRlIGhlaWdodHMKLQkgKiBhbmQgd2lkdGhzLgotCSAqIAotCSAqIEBwYXJhbSBidXR0b24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCdXR0b25MYXlvdXREYXRhKEJ1dHRvbiBidXR0b24pIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlpbnQgd2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlQb2ludCBtaW5TaXplID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7Ci0JCWRhdGEud2lkdGhIaW50ID0gTWF0aC5tYXgod2lkdGhIaW50LCBtaW5TaXplLngpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxheW91dCBkYXRhIG9mIHRoZSBidXR0b24gdG8gYSBGb3JtRGF0YSB3aXRoIGFwcHJvcHJpYXRlIGhlaWdodHMKLQkgKiBhbmQgd2lkdGhzLgotCSAqIAotCSAqIEBwYXJhbSBidXR0b24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCdXR0b25MYXlvdXRGb3JtRGF0YShCdXR0b24gYnV0dG9uKSB7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJaW50IHdpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLQkJUG9pbnQgbWluU2l6ZSA9IGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotCQlkYXRhLndpZHRoID0gTWF0aC5tYXgod2lkdGhIaW50LCBtaW5TaXplLngpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY2xvc2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlpZiAoZ2V0U2hlbGwoKSAhPSBudWxsICYmICFnZXRTaGVsbCgpLmlzRGlzcG9zZWQoKSkKLQkJCXNhdmVEaWFsb2dCb3VuZHMoZ2V0U2hlbGwoKSk7Ci0JCQotCQlyZW1vdmVSZXN0b3JlU2l6ZU1vdXNlTGlzdGVuZXJzKCk7Ci0KLQkJYm9vbGVhbiByZXR1cm5WYWx1ZSA9IHN1cGVyLmNsb3NlKCk7Ci0JCWlmIChyZXR1cm5WYWx1ZSkgewotCQkJYnV0dG9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlidXR0b25CYXIgPSBudWxsOwotCQkJZGlhbG9nQXJlYSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgdGhlIGRpYWxvZyBmb250IHRvIGFsbCBjb250cm9scyB0aGF0IGN1cnJlbnRseSBoYXZlIHRoZSBkZWZhdWx0Ci0JICogZm9udC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgdGhlIGNvbnRyb2wgdG8gYXBwbHkgdGhlIGZvbnQgdG8uIEZvbnQgd2lsbCBhbHNvIGJlIGFwcGxpZWQgdG8KLQkgKiAgICAgICAgICAgIGl0cyBjaGlsZHJlbi4gSWYgdGhlIGNvbnRyb2wgaXMgPGNvZGU+bnVsbDwvY29kZT4gbm90aGluZwotCSAqICAgICAgICAgICAgaGFwcGVucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlEaWFsb2dGb250KENvbnRyb2wgY29udHJvbCkgewotCQlpZiAoY29udHJvbCA9PSBudWxsIHx8IGRpYWxvZ0ZvbnRJc0RlZmF1bHQoKSkKLQkJCXJldHVybjsKLQkJRm9udCBkaWFsb2dGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpOwotCQlhcHBseURpYWxvZ0ZvbnQoY29udHJvbCwgZGlhbG9nRm9udCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlhbG9nIGZvbnQgb24gdGhlIGNvbnRyb2wgYW5kIGFueSBvZiBpdHMgY2hpbGRyZW4gaWYgdGhpZXIgZm9udAotCSAqIGlzIG5vdCBvdGhlcndpc2Ugc2V0LgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgY29udHJvbCB0byBhcHBseSB0aGUgZm9udCB0by4gRm9udCB3aWxsIGFsc28gYmUgYXBwbGllZCB0bwotCSAqICAgICAgICAgICAgaXRzIGNoaWxkcmVuLgotCSAqIEBwYXJhbSBkaWFsb2dGb250Ci0JICogICAgICAgICAgICB0aGUgZGlhbG9nIGZvbnQgdG8gc2V0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseURpYWxvZ0ZvbnQoQ29udHJvbCBjb250cm9sLCBGb250IGRpYWxvZ0ZvbnQpIHsKLQkJaWYgKGhhc0RlZmF1bHRGb250KGNvbnRyb2wpKQotCQkJY29udHJvbC5zZXRGb250KGRpYWxvZ0ZvbnQpOwotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJQ29udHJvbFtdIGNoaWxkcmVuID0gKChDb21wb3NpdGUpIGNvbnRyb2wpLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJCWFwcGx5RGlhbG9nRm9udChjaGlsZHJlbltpXSwgZGlhbG9nRm9udCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhpcyBjb250cm9sIGhhcyB0aGUgc2FtZSBmb250IGFzIGl0J3MgZGVmYXVsdC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgQ29udHJvbAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzRGVmYXVsdEZvbnQoQ29udHJvbCBjb250cm9sKSB7Ci0JCUZvbnREYXRhW10gY29udHJvbEZvbnREYXRhID0gY29udHJvbC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJRm9udERhdGFbXSBkZWZhdWx0Rm9udERhdGEgPSBnZXREZWZhdWx0Rm9udChjb250cm9sKS5nZXRGb250RGF0YSgpOwotCQlpZiAoY29udHJvbEZvbnREYXRhLmxlbmd0aCA9PSBkZWZhdWx0Rm9udERhdGEubGVuZ3RoKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xGb250RGF0YS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChjb250cm9sRm9udERhdGFbaV0uZXF1YWxzKGRlZmF1bHRGb250RGF0YVtpXSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGRlZmF1bHQgZm9udCBmb3IgdGhpcyB0eXBlIG9mIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGZvbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBGb250IGdldERlZmF1bHRGb250KENvbnRyb2wgY29udHJvbCkgewotCQlTdHJpbmcgZm9udE5hbWUgPSAiREVGQVVMVF9GT05UXyIgKyBjb250cm9sLmdldENsYXNzKCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCWlmIChKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5oYXNWYWx1ZUZvcihmb250TmFtZSkpCi0JCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0KGZvbnROYW1lKTsKLQkJRm9udCBjYWNoZWQgPSBjb250cm9sLmdldEZvbnQoKTsKLQkJY29udHJvbC5zZXRGb250KG51bGwpOwotCQlGb250IGRlZmF1bHRGb250ID0gY29udHJvbC5nZXRGb250KCk7Ci0JCWNvbnRyb2wuc2V0Rm9udChjYWNoZWQpOwotCQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5wdXQoZm9udE5hbWUsCi0JCQkJZGVmYXVsdEZvbnQuZ2V0Rm9udERhdGEoKSk7Ci0JCXJldHVybiBkZWZhdWx0Rm9udDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIGRpYWxvZyBmb250IGlzIGN1cnJlbnRseSB0aGUgc2FtZSBhcyB0aGUKLQkgKiBkZWZhdWx0IGZvbnQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIGlmIHRoZSB0d28gYXJlIHRoZSBzYW1lCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRpYWxvZ0ZvbnRJc0RlZmF1bHQoKSB7Ci0JCUZvbnREYXRhW10gZGlhbG9nRm9udERhdGEgPSBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKQotCQkJCS5nZXRGb250RGF0YShKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVCk7Ci0JCUZvbnREYXRhW10gZGVmYXVsdEZvbnREYXRhID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkKLQkJCQkuZ2V0Rm9udERhdGEoSkZhY2VSZXNvdXJjZXMuREVGQVVMVF9GT05UKTsKLQkJcmV0dXJuIEFycmF5cy5lcXVhbHMoZGlhbG9nRm9udERhdGEsIGRlZmF1bHRGb250RGF0YSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NyZWF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQkJYXBwbHlEaWFsb2dGb250KGJ1dHRvbkJhcik7Ci0JCQotCQkvLyBSZWdpc3RlciBhIG1vdXNlIGxpc3RlbmVyIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHJlc3RvcmUgdGhpcyAKLQkJLy8gc2l6ZSB3aXRoIGEgZG91YmxlLWNsaWNrLgotCQkvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjkwNgotCQlhZGRSZXN0b3JlU2l6ZU1vdXNlTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBJRGlhbG9nQmxvY2tlZEhhbmRsZXIgdG8gYmUgdXNlZCBieSBXaXphcmREaWFsb2dzIGFuZAotCSAqIE1vZGFsQ29udGV4dHMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBibG9ja2VkSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElEaWFsb2dCbG9ja2VkSGFuZGxlciBnZXRCbG9ja2VkSGFuZGxlcigpIHsKLQkJcmV0dXJuIGJsb2NrZWRIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgSURpYWxvZ0Jsb2NrZWRIYW5kbGVyIHRvIGJlIHVzZWQgYnkgV2l6YXJkRGlhbG9ncyBhbmQKLQkgKiBNb2RhbENvbnRleHRzLgotCSAqIAotCSAqIEBwYXJhbSBibG9ja2VkSGFuZGxlcgotCSAqICAgICAgICAgICAgVGhlIGJsb2NrZWRIYW5kbGVyIGZvciB0aGUgZGlhbG9ncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QmxvY2tlZEhhbmRsZXIoSURpYWxvZ0Jsb2NrZWRIYW5kbGVyIGJsb2NrZWRIYW5kbGVyKSB7Ci0JCURpYWxvZy5ibG9ja2VkSGFuZGxlciA9IGJsb2NrZWRIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpYWxvZyBzZXR0aW5ncyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZW1lbWJlcmluZyB0aGUgYm91bmRzIG9mCi0JICogb2YgdGhlIGRpYWxvZywgYWNjb3JkaW5nIHRvIHRoZSBkaWFsb2cgYm91bmRzIHN0cmF0ZWd5LgotCSAqIAotCSAqIEByZXR1cm4gc2V0dGluZ3MgdGhlIGRpYWxvZyBzZXR0aW5ncyB1c2VkIHRvIHN0b3JlIHRoZSBkaWFsb2cncyBsb2NhdGlvbgotCSAqICAgICAgICAgYW5kL29yIHNpemUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkaWFsb2cncyBib3VuZHMgc2hvdWxkCi0JICogICAgICAgICBuZXZlciBiZSBzdG9yZWQuCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqIEBzZWUgRGlhbG9nI2dldERpYWxvZ0JvdW5kc1N0cmF0ZWd5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ0JvdW5kc1NldHRpbmdzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGludGVnZXIgY29uc3RhbnQgdGhhdCBkZXNjcmliZXMgdGhlIHN0cmF0ZWd5IGZvciBwZXJzaXN0aW5nIHRoZQotCSAqIGRpYWxvZyBib3VuZHMuIFRoaXMgc3RyYXRlZ3kgaXMgaWdub3JlZCBpZiB0aGUgaW1wbGVtZW50ZXIgZG9lcyBub3QgYWxzbwotCSAqIHNwZWNpZnkgdGhlIGRpYWxvZyBzZXR0aW5ncyBmb3Igc3RvcmluZyB0aGUgYm91bmRzIGluCi0JICogRGlhbG9nLmdldERpYWxvZ0JvdW5kc1NldHRpbmdzKCkuCi0JICogCi0JICogQHJldHVybiB0aGUgY29uc3RhbnQgZGVzY3JpYmluZyB0aGUgc3RyYXRlZ3kgZm9yIHBlcnNpc3RpbmcgdGhlIGRpYWxvZwotCSAqICAgICAgICAgYm91bmRzLgotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKiBAc2VlIERpYWxvZyNESUFMT0dfUEVSU0lTVExPQ0FUSU9OCi0JICogQHNlZSBEaWFsb2cjRElBTE9HX1BFUlNJU1RTSVpFCi0JICogQHNlZSBEaWFsb2cjZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGlhbG9nQm91bmRzU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBESUFMT0dfUEVSU0lTVExPQ0FUSU9OIHwgRElBTE9HX1BFUlNJU1RTSVpFOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBib3VuZHMgb2YgdGhlIHNoZWxsIGluIHRoZSBhcHByb3ByaWF0ZSBkaWFsb2cgc2V0dGluZ3MuIFRoZQotCSAqIGJvdW5kcyBhcmUgcmVjb3JkZWQgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBzaGVsbCwgaWYgdGhlcmUgaXMgb25lLCBvcgotCSAqIGRpc3BsYXkgY29vcmRpbmF0ZXMgaWYgdGhlcmUgaXMgbm8gcGFyZW50IHNoZWxsLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqICAgICAgICAgICAgVGhlIHNoZWxsIHdob3NlIGJvdW5kcyBhcmUgdG8gYmUgc3RvcmVkCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByaXZhdGUgdm9pZCBzYXZlRGlhbG9nQm91bmRzKFNoZWxsIHNoZWxsKSB7CQkKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCVBvaW50IHNoZWxsTG9jYXRpb24gPSBzaGVsbC5nZXRMb2NhdGlvbigpOwotCQkJUG9pbnQgc2hlbGxTaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotCQkJU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50U2hlbGwoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCVBvaW50IHBhcmVudExvY2F0aW9uID0gcGFyZW50LmdldExvY2F0aW9uKCk7Ci0JCQkJc2hlbGxMb2NhdGlvbi54IC09IHBhcmVudExvY2F0aW9uLng7Ci0JCQkJc2hlbGxMb2NhdGlvbi55IC09IHBhcmVudExvY2F0aW9uLnk7Ci0JCQl9Ci0JCQlpbnQgc3RyYXRlZ3kgPSBnZXREaWFsb2dCb3VuZHNTdHJhdGVneSgpOwotCQkJaWYgKChzdHJhdGVneSAmIERJQUxPR19QRVJTSVNUTE9DQVRJT04pICE9IDApIHsKLQkJCQlzZXR0aW5ncy5wdXQoRElBTE9HX09SSUdJTl9YLCBzaGVsbExvY2F0aW9uLngpOwotCQkJCXNldHRpbmdzLnB1dChESUFMT0dfT1JJR0lOX1ksIHNoZWxsTG9jYXRpb24ueSk7Ci0JCQl9Ci0JCQlpZiAoKHN0cmF0ZWd5ICYgRElBTE9HX1BFUlNJU1RTSVpFKSAhPSAwKSB7Ci0JCQkJc2V0dGluZ3MucHV0KERJQUxPR19XSURUSCwgc2hlbGxTaXplLngpOwotCQkJCXNldHRpbmdzLnB1dChESUFMT0dfSEVJR0hULCBzaGVsbFNpemUueSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjZ2V0SW5pdGlhbFNpemUoKQotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCVBvaW50IHJlc3VsdCA9IHN1cGVyLmdldEluaXRpYWxTaXplKCk7Ci0JCQotCQkvLyBDaGVjayB0aGUgZGlhbG9nIHNldHRpbmdzIGZvciBhIHN0b3JlZCBzaXplLgotCQlpZiAoKGdldERpYWxvZ0JvdW5kc1N0cmF0ZWd5KCkgJiBESUFMT0dfUEVSU0lTVFNJWkUpIT0gMCkgewotCQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKTsKLQkJCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gR2V0IHRoZSBzdG9yZWQgd2lkdGggYW5kIGhlaWdodC4KLQkJCQkJaW50IHdpZHRoID0gc2V0dGluZ3MuZ2V0SW50KERJQUxPR19XSURUSCk7Ci0JCQkJCWlmICh3aWR0aCAhPSBESUFMT0dfREVGQVVMVF9CT1VORFMpCi0JCQkJCQlyZXN1bHQueCA9IHdpZHRoOwotCQkJCQlpbnQgaGVpZ2h0ID0gc2V0dGluZ3MuZ2V0SW50KERJQUxPR19IRUlHSFQpOwotCQkJCQlpZiAoaGVpZ2h0ICE9IERJQUxPR19ERUZBVUxUX0JPVU5EUykKLQkJCQkJCXJlc3VsdC55ID0gaGVpZ2h0OwotCQotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBjb25zdHJhaW4gdGhlIGJvdW5kcy4gVGhlIGRlZmF1bHQKLQkJLy8gY29uc3RyYWluaW5nIGJlaGF2aW9yIGluIFdpbmRvdyB3aWxsIGJlIHVzZWQuCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2dldEluaXRpYWxMb2NhdGlvbihvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQpCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsTG9jYXRpb24oUG9pbnQgaW5pdGlhbFNpemUpIHsKLQkJUG9pbnQgcmVzdWx0ID0gc3VwZXIuZ2V0SW5pdGlhbExvY2F0aW9uKGluaXRpYWxTaXplKTsKLQkJaWYgKChnZXREaWFsb2dCb3VuZHNTdHJhdGVneSgpICYgRElBTE9HX1BFUlNJU1RMT0NBVElPTikhPSAwKSB7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dCb3VuZHNTZXR0aW5ncygpOwotCQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgeCA9IHNldHRpbmdzLmdldEludChESUFMT0dfT1JJR0lOX1gpOwotCQkJCQlpbnQgeSA9IHNldHRpbmdzLmdldEludChESUFMT0dfT1JJR0lOX1kpOwotCQkJCQlyZXN1bHQgPSBuZXcgUG9pbnQoeCwgeSk7Ci0JCQkJCS8vIFRoZSBjb29yZGluYXRlcyB3ZXJlIHN0b3JlZCByZWxhdGl2ZSB0byB0aGUgcGFyZW50IHNoZWxsLgotCQkJCQkvLyBDb252ZXJ0IHRvIGRpc3BsYXkgY29vcmRpbmF0ZXMuCi0JCQkJCVNoZWxsIHBhcmVudCA9IGdldFBhcmVudFNoZWxsKCk7Ci0JCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQkJUG9pbnQgcGFyZW50TG9jYXRpb24gPSBwYXJlbnQuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCXJlc3VsdC54ICs9IHBhcmVudExvY2F0aW9uLng7Ci0JCQkJCQlyZXN1bHQueSArPSBwYXJlbnRMb2NhdGlvbi55OwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gTm8gYXR0ZW1wdCBpcyBtYWRlIHRvIGNvbnN0cmFpbiB0aGUgYm91bmRzLiBUaGUgZGVmYXVsdAotCQkvLyBjb25zdHJhaW5pbmcgYmVoYXZpb3IgaW4gV2luZG93IHdpbGwgYmUgdXNlZC4KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIG1vdXNlIGxpc3RlbmVycyBhcyBuZWVkZWQgdG8gcHJvdmlkZSBkaWFsb2cgc2l6ZSByZXN0b3JlIAotCSAqIGJlaGF2aW9yLiAgRG91YmxlLWNsaWNraW5nIGluIHVudXNlZCBhcmVhcyB3aWxsIHJlc3RvcmUKLQkgKiB0aGUgZGlhbG9nIHNpemUuCi0JICogCi0JICogIEBzaW5jZSAzLjIKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUmVzdG9yZVNpemVNb3VzZUxpc3RlbmVycygpIHsKLQkJLy8gSG9vayBhIGRvdWJsZSBjbGljayBldmVudCBmb3IgcmVzdG9yaW5nIHRoZSBkaWFsb2cncyBjb21wdXRlZAotCQkvLyBzaXplLiAgV2UgaG9vayBvbnRvIHRoZSBidXR0b24gYmFyIGFuZCB0aGUgY29udGVudHMsIGFuZCBhbnkKLQkJLy8gbmVzdGVkIGNvbXBvc2l0ZXMgaW4gYmV0d2VlbiwgaW4gb3JkZXIgdG8gYWNjb21vZGF0ZSBkaWZmZXJlbnQKLQkJLy8gbGF5b3V0IGFuZCBjb25zdHJ1Y3Rpb24gc3R5bGVzLgotCQlDb250cm9sIGRpYWxvZ0NvbnRlbnRzID0gZ2V0Q29udGVudHMoKTsKLQkJaWYgKGJ1dHRvbkJhciAhPSBudWxsKSB7Ci0JCQlidXR0b25CYXIuYWRkTW91c2VMaXN0ZW5lcihyZXN0b3JlU2l6ZU1vdXNlTGlzdGVuZXIpOwotCQkJQ29udHJvbCBjb250cm9sID0gYnV0dG9uQmFyLmdldFBhcmVudCgpOwotCQkJd2hpbGUgKGNvbnRyb2wgIT0gZGlhbG9nQ29udGVudHMgJiYgY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKHJlc3RvcmVTaXplTW91c2VMaXN0ZW5lcik7Ci0JCQkJY29udHJvbCA9IGNvbnRyb2wuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRpYWxvZ0NvbnRlbnRzICE9IG51bGwpCi0JCQlkaWFsb2dDb250ZW50cy5hZGRNb3VzZUxpc3RlbmVyKHJlc3RvcmVTaXplTW91c2VMaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhbnkgbW91c2UgbGlzdGVuZXJzIHRoYXQgd2VyZSByZWdpc3RlcmVkLgotCSAqIAotCSAqICBAc2luY2UgMy4yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVJlc3RvcmVTaXplTW91c2VMaXN0ZW5lcnMoKSB7Ci0JCUNvbnRyb2wgZGlhbG9nQ29udGVudHMgPSBnZXRDb250ZW50cygpOwotCQlpZiAoYnV0dG9uQmFyICE9IG51bGwgJiYgIWJ1dHRvbkJhci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWJ1dHRvbkJhci5yZW1vdmVNb3VzZUxpc3RlbmVyKHJlc3RvcmVTaXplTW91c2VMaXN0ZW5lcik7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBidXR0b25CYXIuZ2V0UGFyZW50KCk7Ci0JCQl3aGlsZSAoY29udHJvbCAhPSBkaWFsb2dDb250ZW50cyAmJiBjb250cm9sICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJY29udHJvbC5yZW1vdmVNb3VzZUxpc3RlbmVyKHJlc3RvcmVTaXplTW91c2VMaXN0ZW5lcik7Ci0JCQkJY29udHJvbCA9IGNvbnRyb2wuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRpYWxvZ0NvbnRlbnRzICE9IG51bGwgJiYgIWRpYWxvZ0NvbnRlbnRzLmlzRGlzcG9zZWQoKSkKLQkJCWRpYWxvZ0NvbnRlbnRzLnJlbW92ZU1vdXNlTGlzdGVuZXIocmVzdG9yZVNpemVNb3VzZUxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVzdG9yZSB0aGUgZGlhbG9nIHRvIGl0cyBpbml0aWFsbHkgY29tcHV0ZWQgc2l6ZSwgcmVzZXR0aW5nCi0JICogYW55IGJvdW5kcyB0aGF0IG1heSBoYXZlIGJlZW4gc3RvcmVkIGluIGRpYWxvZyBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVEaWFsb2dUb0NvbXB1dGVkU2l6ZSgpIHsKLQkJLy8gVGhlIGNvbXB1dGVkIHNpemUgd2FzIG5ldmVyIHN0b3JlZC4gIFRoaXMgc2hvdWxkIG5vdCB0eXBpY2FsbHkKLQkJLy8gaGFwcGVuLCBidXQgY291bGQgaWYgYSBjbGllbnQgY29tcGxldGVseSBvdmVycmlkZSB0aGUgYm91bmRzIGluaXRpYWxpemF0aW9uLgotCQlpZiAoY29tcHV0ZWRTaXplID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCVBvaW50IHNoZWxsU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLQkJUG9pbnQgc2hlbGxMb2NhdGlvbiA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0KLQkJLy8gSWYgdGhlIHNpemUgaGFzIG5vdCBjaGFuZ2VkLCBkbyBub3RoaW5nCi0JCWlmIChzaGVsbFNpemUuZXF1YWxzKGNvbXB1dGVkU2l6ZSkpCi0JCQlyZXR1cm47Ci0JCQkKLQkJLy8gTm93IHJlc2V0IHRoZSBib3VuZHMKLQkJc2hlbGwuc2V0Qm91bmRzKGdldENvbnN0cmFpbmVkU2hlbGxCb3VuZHMobmV3IFJlY3RhbmdsZShzaGVsbExvY2F0aW9uLngsCi0JCQkJc2hlbGxMb2NhdGlvbi55LCBjb21wdXRlZFNpemUueCwgY29tcHV0ZWRTaXplLnkpKSk7Ci0JCQotCQkvLyBJZiB3ZSBkbyBzdG9yZSB0aGUgYm91bmRzLCB1cGRhdGUgdGhlIHZhbHVlIHNvIGRlZmF1bHQgYm91bmRzCi0JCS8vIHdpbGwgYmUgdXNlZC4KLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCWludCBzdHJhdGVneSA9IGdldERpYWxvZ0JvdW5kc1N0cmF0ZWd5KCk7Ci0JCQlpZiAoKHN0cmF0ZWd5ICYgRElBTE9HX1BFUlNJU1RTSVpFKSAhPSAwKSB7Ci0JCQkJc2V0dGluZ3MucHV0KERJQUxPR19XSURUSCwgRElBTE9HX0RFRkFVTFRfQk9VTkRTKTsKLQkJCQlzZXR0aW5ncy5wdXQoRElBTE9HX0hFSUdIVCwgRElBTE9HX0RFRkFVTFRfQk9VTkRTKTsKLQkJCX0KLQkJfQotCi0JCQotCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvRGlhbG9nTWVzc2FnZUFyZWEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvRGlhbG9nTWVzc2FnZUFyZWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiZTcwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0RpYWxvZ01lc3NhZ2VBcmVhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGUgRGlhbG9nTWVzc2FnZUFyZWEgaXMgYSByZXN1c2FibGUgY29tcG9uZW50IGZvciBhZGRpbmcgYW4gYWNjZXNzaWJsZQotICogbWVzc2FnZSBhcmVhIHRvIGEgZGlhbG9nLgotICogCi0gKiBXaGVuIHRoZSBtZXNzYWdlIGlzIG5vcm1hbCBhIENMYWJlbCBpcyB1c2VkIGJ1dCBhbiBlcnJvcnMgcmVwbGFjZXMgdGhlCi0gKiBtZXNzYWdlIGFyZWEgd2l0aCBhIG5vbiBlZGl0YWJsZSB0ZXh0IHRoYXQgY2FuIHRha2UgZm9jdXMgZm9yIHVzZSBieSBzY3JlZW4KLSAqIHJlYWRlcnMuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWxvZ01lc3NhZ2VBcmVhIGV4dGVuZHMgT2JqZWN0IHsKLSAgICBwcml2YXRlIFRleHQgbWVzc2FnZVRleHQ7Ci0KLSAgICBwcml2YXRlIExhYmVsIG1lc3NhZ2VJbWFnZUxhYmVsOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbWVzc2FnZUNvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3RNZXNzYWdlVGV4dDsKLQotICAgIHByaXZhdGUgaW50IGxhc3RNZXNzYWdlVHlwZTsKLQotICAgIHByaXZhdGUgQ0xhYmVsIHRpdGxlTGFiZWw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBEaWFsb2dNZXNzYWdlQXJlYSgpIHsKLSAgICAgICAgLy9ObyBpbml0aWFsIGJlaGF2aW91cgotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgY29udGVudHMgZm9yIHRoZSByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgQ29tcG9zaXRlIHRoYXQgdGhlIGNoaWxkcmVuIHdpbGwgYmUgY3JlYXRlZCBpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAKLSAgICAgICAgLy8gTWVzc2FnZSBsYWJlbAotICAgICAgICB0aXRsZUxhYmVsID0gbmV3IENMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEJhbm5lckZvbnQoKSk7Ci0gICAgICAgIG1lc3NhZ2VDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IG1lc3NhZ2VMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBtZXNzYWdlTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBtZXNzYWdlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbWVzc2FnZUxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBtZXNzYWdlTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotICAgICAgICBtZXNzYWdlQ29tcG9zaXRlLnNldExheW91dChtZXNzYWdlTGF5b3V0KTsKLSAgICAgICAgbWVzc2FnZUltYWdlTGFiZWwgPSBuZXcgTGFiZWwobWVzc2FnZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBtZXNzYWdlSW1hZ2VMYWJlbC5zZXRJbWFnZShKRmFjZVJlc291cmNlcwotICAgICAgICAgICAgICAgIC5nZXRJbWFnZShEaWFsb2cuRExHX0lNR19NRVNTQUdFX0lORk8pKTsKLSAgICAgICAgbWVzc2FnZUltYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKSk7Ci0gIAotICAgICAgICBtZXNzYWdlVGV4dCA9IG5ldyBUZXh0KG1lc3NhZ2VDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbWVzc2FnZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAKLSAgICAgICAgR3JpZERhdGEgdGV4dERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotICAgICAgICBtZXNzYWdlVGV4dC5zZXRMYXlvdXREYXRhKHRleHREYXRhKTsKLSAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBsYXlvdXREYXRhIGZvciB0aGUgdGl0bGUgYXJlYS4gSW4gbW9zdCBjYXNlcyB0aGlzIHdpbGwgYmUgYSBjb3B5Ci0gICAgICogb2YgdGhlIGxheW91dERhdGEgdXNlZCBpbiBzZXRNZXNzYWdlTGF5b3V0RGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGF5b3V0RGF0YQotICAgICAqICAgICAgICAgICAgdGhlIGxheW91dERhdGEgZm9yIHRoZSB0aXRsZQotICAgICAqIEBzZWUgI3NldE1lc3NhZ2VMYXlvdXREYXRhKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZUxheW91dERhdGEoT2JqZWN0IGxheW91dERhdGEpIHsKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbGF5b3V0RGF0YSBmb3IgdGhlIG1lc3NhZ2VBcmVhLiBJbiBtb3N0IGNhc2VzIHRoaXMgd2lsbCBiZSBhIGNvcHkKLSAgICAgKiBvZiB0aGUgbGF5b3V0RGF0YSB1c2VkIGluIHNldFRpdGxlTGF5b3V0RGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGF5b3V0RGF0YQotICAgICAqICAgICAgICAgICAgdGhlIGxheW91dERhdGEgZm9yIHRoZSBtZXNzYWdlIGFyZWEgY29tcG9zaXRlLgotICAgICAqIEBzZWUgI3NldFRpdGxlTGF5b3V0RGF0YShPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUxheW91dERhdGEoT2JqZWN0IGxheW91dERhdGEpIHsKLSAgICAgICAgbWVzc2FnZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3cgdGhlIHRpdGxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0aXRsZU1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBmb3IgdGhlIHRpdGtlCi0gICAgICogQHBhcmFtIHRpdGxlSW1hZ2UKLSAgICAgKiAgICAgICAgICAgIEltYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd1RpdGxlKFN0cmluZyB0aXRsZU1lc3NhZ2UsIEltYWdlIHRpdGxlSW1hZ2UpIHsKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRJbWFnZSh0aXRsZUltYWdlKTsKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRUZXh0KHRpdGxlTWVzc2FnZSk7Ci0gICAgICAgIHJlc3RvcmVUaXRsZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIHRoZSB0aXRsZSBhbmQgZGlzYWJsZSB0aGUgbWVzc2FnZSB0ZXh0IGFuZCBpbWFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlVGl0bGUoKSB7Ci0gICAgICAgIHRpdGxlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbWVzc2FnZUNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgbGFzdE1lc3NhZ2VUZXh0ID0gbnVsbDsKLSAgICAgICAgbGFzdE1lc3NhZ2VUeXBlID0gSU1lc3NhZ2VQcm92aWRlci5OT05FOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3cgdGhlIG5ldyBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIHRleHQgYW5kIHVwZGF0ZSB0aGUgaW1hZ2UuIEJhc2UgdGhlCi0gICAgICogYmFja2dyb3VuZCBjb2xvciBvbiB3aGV0aGVyIG9yIG5vdCB0aGVyZSBhcmUgZXJyb3JzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdNZXNzYWdlCi0gICAgICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIGZvciB0aGUgbWVzc2FnZQotICAgICAqIEBwYXJhbSBuZXdUeXBlCi0gICAgICogICAgICAgICAgICBPbmUgb2YgdGhlIElNZXNzYWdlUHJvdmlkZXIgY29uc3RhbnRzLiBJZiBuZXdUeXBlIGlzCi0gICAgICogICAgICAgICAgICBJTWVzc2FnZVByb3ZpZGVyLk5PTkUgc2hvdyB0aGUgdGl0bGUuCi0gICAgICogQHNlZSBJTWVzc2FnZVByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlVGV4dChTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpIHsKLSAgICAgICAgSW1hZ2UgbmV3SW1hZ2UgPSBudWxsOwotICAgICAgICBzd2l0Y2ggKG5ld1R5cGUpIHsKLSAgICAgICAgY2FzZSBJTWVzc2FnZVByb3ZpZGVyLk5PTkU6Ci0gICAgICAgICAgICBpZiAobmV3TWVzc2FnZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJlc3RvcmVUaXRsZSgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNob3dUaXRsZShuZXdNZXNzYWdlLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OOgotICAgICAgICAgICAgbmV3SW1hZ2UgPSBKRmFjZVJlc291cmNlcy5nZXRJbWFnZShEaWFsb2cuRExHX0lNR19NRVNTQUdFX0lORk8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HOgotICAgICAgICAgICAgbmV3SW1hZ2UgPSBKRmFjZVJlc291cmNlcy5nZXRJbWFnZShEaWFsb2cuRExHX0lNR19NRVNTQUdFX1dBUk5JTkcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU1lc3NhZ2VQcm92aWRlci5FUlJPUjoKLSAgICAgICAgICAgIG5ld0ltYWdlID0gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2UoRGlhbG9nLkRMR19JTUdfTUVTU0FHRV9FUlJPUik7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1lc3NhZ2VDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgLy8gQW55IG1vcmUgdXBkYXRlcyByZXF1aXJlZD8KLSAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgdGV4dCBlcXVhbHMgdGhlIHRvb2x0aXAgKGkuZS4gbm9uLXNob3J0ZW5lZCB0ZXh0IGlzIHRoZSBzYW1lKQotICAgICAgICAvLyBhbmQgc2hvcnRlbmVkIHRleHQgaXMgdGhlIHNhbWUgKGkuZS4gbm90IGEgcmVzaXplKQotICAgICAgICAvLyBhbmQgdGhlIGltYWdlIGlzIHRoZSBzYW1lIHRoZW4gbm90aGluZyB0byBkbwotICAgICAgICBTdHJpbmcgc2hvcnRUZXh0ID0gRGlhbG9nLnNob3J0ZW5UZXh0KG5ld01lc3NhZ2UsbWVzc2FnZVRleHQpOwotICAgICAgICBpZiAobmV3TWVzc2FnZS5lcXVhbHMobWVzc2FnZVRleHQuZ2V0VG9vbFRpcFRleHQoKSkKLSAgICAgICAgICAgICAgICAmJiBuZXdJbWFnZSA9PSBtZXNzYWdlSW1hZ2VMYWJlbC5nZXRJbWFnZSgpCi0gICAgICAgICAgICAgICAgCSYmIHNob3J0VGV4dC5lcXVhbHMobWVzc2FnZVRleHQuZ2V0VGV4dCgpKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgbWVzc2FnZUltYWdlTGFiZWwuc2V0SW1hZ2UobmV3SW1hZ2UpOwotICAgICAgICBtZXNzYWdlVGV4dC5zZXRUZXh0KERpYWxvZy5zaG9ydGVuVGV4dChuZXdNZXNzYWdlLG1lc3NhZ2VUZXh0KSk7Ci0gICAgICAgIG1lc3NhZ2VUZXh0LnNldFRvb2xUaXBUZXh0KG5ld01lc3NhZ2UpOwotICAgICAgICBsYXN0TWVzc2FnZVRleHQgPSBuZXdNZXNzYWdlOwotIAotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGVycm9yIG1lc3NhZ2UuIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgZGlzcGxheWVkIG1lc3NhZ2UgaWYKLSAgICAgKiB0aGVyZSBpcyBvbmUsIGlmIG5vdCByZXN0b3JlIHRoZSB0aXRsZSBsYWJlbC4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIGlmIChsYXN0TWVzc2FnZVRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3RvcmVUaXRsZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1cGRhdGVUZXh0KGxhc3RNZXNzYWdlVGV4dCwgbGFzdE1lc3NhZ2VUeXBlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0RpYWxvZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvRGlhbG9nUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTczYjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvRGlhbG9nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGRpYWxvZyBwYWdlLiBBbGwgZGlhbG9nIHBhZ2VzIGFyZQotICogc3ViY2xhc3NlcyBvZiB0aGlzIG9uZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpYWxvZ1BhZ2UgaW1wbGVtZW50cyBJRGlhbG9nUGFnZSwgSU1lc3NhZ2VQcm92aWRlciB7Ci0gICAgLyoqCi0gICAgICogVGhlIGNvbnRyb2wgZm9yIHRoaXMgZGlhbG9nIHBhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb250cm9sIGNvbnRyb2w7Ci0KLSAgICAvKioKLSAgICAgKiBPcHRpb25hbCB0aXRsZTsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNzZXRUaXRsZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uOyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqIAotICAgICAqIEBzZWUgI3NldERlc2NyaXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ2FjaGVkIGltYWdlOyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqIAotICAgICAqIEBzZWUgI3NldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IpCi0gICAgICovCi0gICAgcHJpdmF0ZSBJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBPcHRpb25hbCBpbWFnZTsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yKQotICAgICAqLwotICAgIHByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBtZXNzYWdlOyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgbWVzc2FnZSB0eXBlOyBkZWZhdWx0IHZhbHVlIDxjb2RlPk5PTkU8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1lc3NhZ2VUeXBlID0gTk9ORTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IGVycm9yIG1lc3NhZ2U7IDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEZvbnQgbWV0cmljcyB0byB1c2UgZm9yIGRldGVybWluaW5nIHBpeGVsIHNpemVzLgotICAgICAqLwotICAgIHByaXZhdGUgRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGVtcHR5IGRpYWxvZyBwYWdlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBEaWFsb2dQYWdlKCkgewotICAgICAgICAvL05vIGluaXRpYWwgYmVoYXZpb3VyCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBkaWFsb2cgcGFnZSB3aXRoIHRoZSBnaXZlbiB0aXRsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGl0bGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSBvZiB0aGlzIGRpYWxvZyBwYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERpYWxvZ1BhZ2UoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGRpYWxvZyBwYWdlIHdpdGggdGhlIGdpdmVuIHRpdGxlIGFuZCBpbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGl0bGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSBvZiB0aGlzIGRpYWxvZyBwYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIGltYWdlCi0gICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZm9yIHRoaXMgZGlhbG9nIHBhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGlhbG9nUGFnZShTdHJpbmcgdGl0bGUsIEltYWdlRGVzY3JpcHRvciBpbWFnZSkgewotICAgICAgICB0aGlzKHRpdGxlKTsKLSAgICAgICAgaW1hZ2VEZXNjcmlwdG9yID0gaW1hZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGdpdmVuCi0gICAgICogbnVtYmVyIG9mIGNoYXJhY3RlcnMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmluaXRpYWxpemVEaWFsb2dVbml0czwvY29kZT4KLSAgICAgKiBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIENsaWVudHMgbWF5IGNhbGwgdGhpcyBmcmFtZXdvcmsgbWV0aG9kLCBidXQgc2hvdWxkIG5vdCBvdmVycmlkZSBpdC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGNoYXJzCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGl4ZWxzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKGludCBjaGFycykgewotICAgICAgICAvLyB0ZXN0IGZvciBmYWlsdXJlIHRvIGluaXRpYWxpemUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgICAgaWYgKGZvbnRNZXRyaWNzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIERpYWxvZy5jb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBjaGFycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBudW1iZXIgb2YKLSAgICAgKiBob3Jpem9udGFsIGRpYWxvZyB1bml0cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+aW5pdGlhbGl6ZURpYWxvZ1VuaXRzPC9jb2RlPgotICAgICAqIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogQ2xpZW50cyBtYXkgY2FsbCB0aGlzIGZyYW1ld29yayBtZXRob2QsIGJ1dCBzaG91bGQgbm90IG92ZXJyaWRlIGl0LgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGx1cwotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBob3Jpem9udGFsIGRpYWxvZyB1bml0cwotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGludCBkbHVzKSB7Ci0gICAgICAgIC8vIHRlc3QgZm9yIGZhaWx1cmUgdG8gaW5pdGlhbGl6ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAgICBpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBkbHVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG51bWJlciBvZgotICAgICAqIHZlcnRpY2FsIGRpYWxvZyB1bml0cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+aW5pdGlhbGl6ZURpYWxvZ1VuaXRzPC9jb2RlPgotICAgICAqIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogQ2xpZW50cyBtYXkgY2FsbCB0aGlzIGZyYW1ld29yayBtZXRob2QsIGJ1dCBzaG91bGQgbm90IG92ZXJyaWRlIGl0LgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGx1cwotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiB2ZXJ0aWNhbCBkaWFsb2cgdW5pdHMKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGl4ZWxzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoaW50IGRsdXMpIHsKLSAgICAgICAgLy8gdGVzdCBmb3IgZmFpbHVyZSB0byBpbml0aWFsaXplIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIGlmIChmb250TWV0cmljcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiBEaWFsb2cuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBkbHVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdpZHRoIG9mIHRoZSBnaXZlbgotICAgICAqIG51bWJlciBvZiBjaGFyYWN0ZXJzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBvbmx5IGJlIGNhbGxlZCBhZnRlciA8Y29kZT5pbml0aWFsaXplRGlhbG9nVW5pdHM8L2NvZGU+Ci0gICAgICogaGFzIGJlZW4gY2FsbGVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBDbGllbnRzIG1heSBjYWxsIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCwgYnV0IHNob3VsZCBub3Qgb3ZlcnJpZGUgaXQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBjaGFycwotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBpeGVscwotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGludCBjaGFycykgewotICAgICAgICAvLyB0ZXN0IGZvciBmYWlsdXJlIHRvIGluaXRpYWxpemUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgICAgaWYgKGZvbnRNZXRyaWNzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZm9udE1ldHJpY3MsIGNoYXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+RGlhbG9nUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgYW4KLSAgICAgKiA8Y29kZT5JRGlhbG9nUGFnZTwvY29kZT4gbWV0aG9kIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIGRlYWxsb2NhdGUgU1dUIHJlc291cmNlcwotICAgICAgICBpZiAoaW1hZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgaW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICAgICAgaW1hZ2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdG9wIGxldmVsIGNvbnRyb2wgZm9yIHRoaXMgZGlhbG9nIHBhZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdG9wIGxldmVsIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotICAgICAgICByZXR1cm4gY29udHJvbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzeW1ib2xpYyBmb250IG5hbWUgdXNlZCBieSBkaWFsb2cgcGFnZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3ltYm9saWMgZm9udCBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dGb250TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEpGYWNlUmVzb3VyY2VzLkRJQUxPR19GT05UOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBmb250IHRvIHVzZSBmb3IgdGhpcyBkaWFsb2cgcGFnZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmb250Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEZvbnQgZ2V0Rm9udCgpIHsKLSAgICAgICAgcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChnZXREaWFsb2dGb250TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgaWYgKGltYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGltYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElNZXNzYWdlUHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNZXNzYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBkaWFsb2cgcGFnZSdzIHNoZWxsLiBDb252ZW5pZW5jZSBtZXRob2QgZm9yCi0gICAgICogPGNvZGU+Z2V0Q29udHJvbCgpLmdldFNoZWxsKCk8L2NvZGU+LiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQKLSAgICAgKiBhZnRlciB0aGUgcGFnZSdzIGNvbnRyb2wgaGFzIGJlZW4gY3JlYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGVsbAotICAgICAqLwotICAgIHB1YmxpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRpdGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvb2wgdGlwIHRleHQgZm9yIHRoZSB3aWRnZXQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIGRvZXMgbm90aGluZyBhbmQKLSAgICAgKiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHdpZGdldElkCi0gICAgICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIHdpZGdldCBmb3Igd2hpY2ggaG92ZXIgaGVscCBpcyByZXF1ZXN0ZWQKLSAgICAgKiBAcmV0dXJuIHRoZSB0b29sIHRpcCB0ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQGRlcHJlY2F0ZWQgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRUb29sVGlwVGV4dChpbnQgd2lkZ2V0SWQpIHsKLSAgICAgICAgLy8gcmV0dXJuIG5vdGhpbmcgYnkgZGVmYXVsdAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgY29tcHV0YXRpb24gb2YgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGlhbG9nIHVuaXRzIGJhc2VkCi0gICAgICogb24gdGhlIHNpemUgb2YgY3VycmVudCBmb250LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb2YgdGhlIGRpYWxvZyB1bml0IGJhc2VkIGNvbnZlcnNpb24KLSAgICAgKiBtZXRob2RzIGFyZSBjYWxsZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXN0Q29udHJvbAotICAgICAqICAgICAgICAgICAgYSBjb250cm9sIGZyb20gd2hpY2ggdG8gb2J0YWluIHRoZSBjdXJyZW50IGZvbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCB0ZXN0Q29udHJvbCkgewotICAgICAgICAvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0gICAgICAgIEdDIGdjID0gbmV3IEdDKHRlc3RDb250cm9sKTsKLSAgICAgICAgZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotICAgICAgICBmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0gICAgICAgIGdjLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSA8Y29kZT5HcmlkRGF0YTwvY29kZT4gb24gdGhlIHNwZWNpZmllZCBidXR0b24gdG8gYmUgb25lIHRoYXQKLSAgICAgKiBpcyBzcGFjZWQgZm9yIHRoZSBjdXJyZW50IGRpYWxvZyBwYWdlIHVuaXRzLiBUaGUgbWV0aG9kCi0gICAgICogPGNvZGU+aW5pdGlhbGl6ZURpYWxvZ1VuaXRzPC9jb2RlPiBtdXN0IGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBjYWxsaW5nCi0gICAgICogdGhpcyBtZXRob2QgZm9yIHRoZSBmaXJzdCB0aW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBidXR0b24KLSAgICAgKiAgICAgICAgICAgIHRoZSBidXR0b24gdG8gc2V0IHRoZSA8Y29kZT5HcmlkRGF0YTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5HcmlkRGF0YTwvY29kZT4gc2V0IG9uIHRoZSBzcGVjaWZpZWQgYnV0dG9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEdyaWREYXRhIHNldEJ1dHRvbkxheW91dERhdGEoQnV0dG9uIGJ1dHRvbikgewotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgICAgIGludCB3aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0gICAgICAgIFBvaW50IG1pblNpemUgPSBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heCh3aWR0aEhpbnQsIG1pblNpemUueCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMgcGFnZSdzIFVJIGNvbnRlbnQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRyb2wgaGFzIGJlZW4gY3JlYXRlZCwgYW5kCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb250cm9sQ3JlYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2wgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYW4gPGNvZGU+SURpYWxvZ1BhZ2U8L2NvZGU+IG1ldGhvZCBkb2VzCi0gICAgICogbm90aGluZy4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gdGFrZSBzb21lIGFjdGlvbiBpbiByZXNwb25zZSB0byBhCi0gICAgICogaGVscCByZXF1ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1IZWxwKCkgewotICAgICAgICAvL05vIGRlZmF1bHQgaGVscAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY29udHJvbCBmb3IgdGhlIHJlY2VpdmVyLgotICAgICAqIEBwYXJhbSBuZXdDb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Q29udHJvbChDb250cm9sIG5ld0NvbnRyb2wpIHsKLSAgICAgICAgY29udHJvbCA9IG5ld0NvbnRyb2w7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgb3IgY2xlYXJzIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHBhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5ld01lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSkgewotICAgICAgICBlcnJvck1lc3NhZ2UgPSBuZXdNZXNzYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBkZXNjKSB7Ci0gICAgICAgIGltYWdlRGVzY3JpcHRvciA9IGRlc2M7Ci0gICAgICAgIGlmIChpbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBpbWFnZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWVzc2FnZSBmb3IgdGhpcyBwYWdlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3IgPGNvZGU+c2V0TWVzc2FnZShuZXdNZXNhc2dlLCBOT05FKTwvY29kZT4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG5ld01lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciB0aGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UpIHsKLSAgICAgICAgc2V0TWVzc2FnZShuZXdNZXNzYWdlLCBOT05FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZXNzYWdlIGZvciB0aGlzIHBhZ2Ugd2l0aCBhbiBpbmRpY2F0aW9uIG9mIHdoYXQgdHlwZSBvZiBtZXNzYWdlCi0gICAgICogaXQgaXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbGlkIG1lc3NhZ2UgdHlwZXMgYXJlIG9uZSBvZiA8Y29kZT5OT05FPC9jb2RlPiwKLSAgICAgKiA8Y29kZT5JTkZPUk1BVElPTjwvY29kZT4sPGNvZGU+V0FSTklORzwvY29kZT4sIG9yCi0gICAgICogPGNvZGU+RVJST1I8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGEgbWVzc2FnZSBvZiB0eXBlCi0gICAgICogPGNvZGU+RVJST1I8L2NvZGU+IGlzIGRpZmZlcmVudCB0aGFuIGFuIGVycm9yIG1lc3NhZ2UgKHNldCB1c2luZwotICAgICAqIDxjb2RlPnNldEVycm9yTWVzc2FnZTwvY29kZT4pLiBBbiBlcnJvciBtZXNzYWdlIG92ZXJyaWRlcyB0aGUgY3VycmVudAotICAgICAqIG1lc3NhZ2UgdW50aWwgdGhlIGVycm9yIG1lc3NhZ2UgaXMgY2xlYXJlZC4gVGhpcyBtZXRob2QgcmVwbGFjZXMgdGhlCi0gICAgICogY3VycmVudCBtZXNzYWdlIGFuZCBkb2VzIG5vdCBhZmZlY3QgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdNZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gY2xlYXIgdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gbmV3VHlwZQotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdHlwZQotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlLCBpbnQgbmV3VHlwZSkgewotICAgICAgICBtZXNzYWdlID0gbmV3TWVzc2FnZTsKLSAgICAgICAgbWVzc2FnZVR5cGUgPSBuZXdUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5EaWFsb2dQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+SURpYWxvZ1BhZ2U8L2NvZGU+IG1ldGhvZCByZW1lbWJlcnMgdGhlIHRpdGxlIGluIGFuIGludGVybmFsCi0gICAgICogc3RhdGUgdmFyaWFibGUuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5EaWFsb2dQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+SURpYWxvZ1BhZ2U8L2NvZGU+IG1ldGhvZCBzZXRzIHRoZSBjb250cm9sIHRvIHRoZSBnaXZlbgotICAgICAqIHZpc2liaWxpdHkgc3RhdGUuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBjb250cm9sLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9EaWFsb2dTZXR0aW5ncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9EaWFsb2dTZXR0aW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTlhYTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvRGlhbG9nU2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGRpYWxvZyBzZXR0aW5ncyAoPGNvZGU+SURpYWxvZ1NldHRpbmdzPC9jb2RlPikKLSAqIHVzaW5nIGEgaGFzaCB0YWJsZSBhbmQgWE1MLiBUaGUgZGlhbG9nIHN0b3JlIGNhbiBiZSByZWFkCi0gKiBmcm9tIGFuZCBzYXZlZCB0byBhIHN0cmVhbS4gQWxsIGtleXMgYW5kIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3Mgb3IgYXJyYXkgb2YKLSAqIHN0cmluZ3MuIFByaW1pdGl2ZSB0eXBlcyBhcmUgY29udmVydGVkIHRvIHN0cmluZ3MuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2FzIG5vdCBkZXNpZ25lZCB0byBiZSBzdWJjbGFzc2VkLgotICoKLSAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyBhIERpYWxvZ1NldHRpbmdzOgotICogPC9wPgotICogPHByZT4KLSAqIDxjb2RlPgotICogRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgRGlhbG9nU2V0dGluZ3MoInJvb3QiKTsKLSAqIHNldHRpbmdzLnB1dCgiQm9vbGVhbjEiLHRydWUpOwotICogc2V0dGluZ3MucHV0KCJMb25nMSIsMTAwKTsKLSAqIHNldHRpbmdzLnB1dCgiQXJyYXkxIixuZXcgU3RyaW5nW117ImFhYWExIiwiYmJiYjEiLCJjY2NjMSJ9KTsKLSAqIERpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBuZXcgRGlhbG9nU2V0dGluZ3MoInNlY3Rpb25OYW1lIik7Ci0gKiBzZXR0aW5ncy5hZGRTZWN0aW9uKHNlY3Rpb24pOwotICogc2VjdGlvbi5wdXQoIkludDIiLDIwMCk7Ci0gKiBzZWN0aW9uLnB1dCgiRmxvYXQyIiwxLjEpOwotICogc2VjdGlvbi5wdXQoIkFycmF5MiIsbmV3IFN0cmluZ1tdeyJhYWFhMiIsImJiYmIyIiwiY2NjYzIifSk7Ci0gKiBzZXR0aW5ncy5zYXZlKCJjOlxcdGVtcFxcdGVzdFxcZGlhbG9nLnhtbCIpOwotICogPC9jb2RlPgotICogPC9wcmU+Ci0gKi8KLQotcHVibGljIGNsYXNzIERpYWxvZ1NldHRpbmdzIGltcGxlbWVudHMgSURpYWxvZ1NldHRpbmdzIHsKLSAgICAvLyBUaGUgbmFtZSBvZiB0aGUgRGlhbG9nU2V0dGluZ3MuCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qIEEgTWFwIG9mIERpYWxvZ1NldHRpbmdzIHJlcHJlc2VudGluZyBlYWNoIHNlY3Rpb25zIGluIGEgRGlhbG9nU2V0dGluZ3MuCi0gICAgIEl0IG1hcHMgdGhlIERpYWxvZ1NldHRpbmdzJyBuYW1lIHRvIHRoZSBEaWFsb2dTZXR0aW5ncyAqLwotICAgIHByaXZhdGUgTWFwIHNlY3Rpb25zOwotCi0gICAgLyogQSBNYXAgd2l0aCBhbGwgdGhlIGtleXMgYW5kIHZhbHVlcyBvZiB0aGlzIHNlY3Rpb25zLgotICAgICBFaXRoZXIgdGhlIGtleXMgYW4gdmFsdWVzIGFyZSByZXN0cmljdGVkIHRvIHN0cmluZ3MuICovCi0gICAgcHJpdmF0ZSBNYXAgaXRlbXM7Ci0KLSAgICAvLyBBIE1hcCB3aXRoIGFsbCB0aGUga2V5cyBtYXBwZWQgdG8gYXJyYXkgb2Ygc3RyaW5ncy4KLSAgICBwcml2YXRlIE1hcCBhcnJheUl0ZW1zOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TRUNUSU9OID0gInNlY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJuYW1lIjsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0tFWSA9ICJrZXkiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVkFMVUUgPSAidmFsdWUiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTElTVCA9ICJsaXN0IjsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lURU0gPSAiaXRlbSI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGVtcHR5IGRpYWxvZyBzZXR0aW5ncyB3aGljaCBsb2FkcyBhbmQgc2F2ZXMgaXRzCi0gICAgICogY29udGVudCB0byBhIGZpbGUuCi0gICAgICogVXNlIHRoZSBtZXRob2RzIDxjb2RlPmxvYWQoU3RyaW5nKTwvY29kZT4gYW5kIDxjb2RlPnN0b3JlKFN0cmluZyk8L2NvZGU+Ci0gICAgICogdG8gbG9hZCBhbmQgc3RvcmUgdGhpcyBkaWFsb2cgc2V0dGluZ3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VjdGlvbk5hbWUgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gaW4gdGhlIHNldHRpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBEaWFsb2dTZXR0aW5ncyhTdHJpbmcgc2VjdGlvbk5hbWUpIHsKLSAgICAgICAgbmFtZSA9IHNlY3Rpb25OYW1lOwotICAgICAgICBpdGVtcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGFycmF5SXRlbXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBzZWN0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nU2V0dGluZ3MuCi0gICAgICovCi0gICAgcHVibGljIElEaWFsb2dTZXR0aW5ncyBhZGROZXdTZWN0aW9uKFN0cmluZyBzZWN0aW9uTmFtZSkgewotICAgICAgICBEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gbmV3IERpYWxvZ1NldHRpbmdzKHNlY3Rpb25OYW1lKTsKLSAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9uKTsKLSAgICAgICAgcmV0dXJuIHNlY3Rpb247Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nU2V0dGluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU2VjdGlvbihJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbikgewotICAgICAgICBzZWN0aW9ucy5wdXQoc2VjdGlvbi5nZXROYW1lKCksIHNlY3Rpb24pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1NldHRpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0KFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGl0ZW1zLmdldChrZXkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1NldHRpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBcnJheShTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIGFycmF5SXRlbXMuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nU2V0dGluZ3MuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKFN0cmluZykgaXRlbXMuZ2V0KGtleSkpLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1NldHRpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBrZXkpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc2V0dGluZyA9IChTdHJpbmcpIGl0ZW1zLmdldChrZXkpOwotICAgICAgICBpZiAoc2V0dGluZyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoZXJlIGlzIG5vIHNldHRpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgXCIiICsga2V5ICsgIlwiIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoc2V0dGluZykuZG91YmxlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dTZXR0aW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIGtleSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzZXR0aW5nID0gKFN0cmluZykgaXRlbXMuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChzZXR0aW5nID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlcmUgaXMgbm8gc2V0dGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBcIiIgKyBrZXkgKyAiXCIiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICByZXR1cm4gbmV3IEZsb2F0KHNldHRpbmcpLmZsb2F0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dTZXR0aW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEludChTdHJpbmcga2V5KSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNldHRpbmcgPSAoU3RyaW5nKSBpdGVtcy5nZXQoa2V5KTsKLSAgICAgICAgaWYgKHNldHRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgLy9uZXcgSW50ZWdlcihudWxsKSB3aWxsIHRocm93IGEgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGFuZCBtZWV0IG91ciBzcGVjLCBidXQgdGhpcyBtZXNzYWdlCi0gICAgICAgICAgICAvL2lzIGNsZWFyZXIuCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlcmUgaXMgbm8gc2V0dGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBcIiIgKyBrZXkgKyAiXCIiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihzZXR0aW5nKS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1NldHRpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIGtleSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzZXR0aW5nID0gKFN0cmluZykgaXRlbXMuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChzZXR0aW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vbmV3IExvbmcobnVsbCkgd2lsbCB0aHJvdyBhIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBhbmQgbWVldCBvdXIgc3BlYywgYnV0IHRoaXMgbWVzc2FnZQotICAgICAgICAgICAgLy9pcyBjbGVhcmVyLgotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoZXJlIGlzIG5vIHNldHRpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgXCIiICsga2V5ICsgIlwiIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IExvbmcoc2V0dGluZykubG9uZ1ZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nU2V0dGluZ3MuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dTZXR0aW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSURpYWxvZ1NldHRpbmdzIGdldFNlY3Rpb24oU3RyaW5nIHNlY3Rpb25OYW1lKSB7Ci0gICAgICAgIHJldHVybiAoSURpYWxvZ1NldHRpbmdzKSBzZWN0aW9ucy5nZXQoc2VjdGlvbk5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1NldHRpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBJRGlhbG9nU2V0dGluZ3NbXSBnZXRTZWN0aW9ucygpIHsKLSAgICAgICAgQ29sbGVjdGlvbiB2YWx1ZXMgPSBzZWN0aW9ucy52YWx1ZXMoKTsKLSAgICAgICAgRGlhbG9nU2V0dGluZ3NbXSByZXN1bHQgPSBuZXcgRGlhbG9nU2V0dGluZ3NbdmFsdWVzLnNpemUoKV07Ci0gICAgICAgIHZhbHVlcy50b0FycmF5KHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nU2V0dGluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9hZChSZWFkZXIgcikgewotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIC8vCQlwYXJzZXIuc2V0UHJvY2Vzc05hbWVzcGFjZSh0cnVlKTsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShyKSk7Ci0KLSAgICAgICAgICAgIC8vU3RyaXAgb3V0IGFueSBjb21tZW50cyBmaXJzdAotICAgICAgICAgICAgTm9kZSByb290ID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgd2hpbGUgKHJvb3QuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgewotICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUNoaWxkKHJvb3QpOwotICAgICAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2FkKGRvY3VtZW50LCAoRWxlbWVudCkgcm9vdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dTZXR0aW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2FkKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIHN0cmVhbSwgInV0Zi04IikpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgbG9hZChyZWFkZXIpOwotICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTG9hZCB0aGUgc2V0dGluZyBmcm9tIHRoZSA8Y29kZT5kb2N1bWVudDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZChEb2N1bWVudCBkb2N1bWVudCwgRWxlbWVudCByb290KSB7Ci0gICAgICAgIG5hbWUgPSByb290LmdldEF0dHJpYnV0ZShUQUdfTkFNRSk7Ci0gICAgICAgIE5vZGVMaXN0IGwgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKFRBR19JVEVNKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgbiA9IGwuaXRlbShpKTsKLSAgICAgICAgICAgIGlmIChyb290ID09IG4uZ2V0UGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9ICgoRWxlbWVudCkgbC5pdGVtKGkpKS5nZXRBdHRyaWJ1dGUoVEFHX0tFWSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKChFbGVtZW50KSBsLml0ZW0oaSkpLmdldEF0dHJpYnV0ZShUQUdfVkFMVUUpOwotICAgICAgICAgICAgICAgIGl0ZW1zLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfTElTVCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG4gPSBsLml0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAocm9vdCA9PSBuLmdldFBhcmVudE5vZGUoKSkgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCkgbC5pdGVtKGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoVEFHX0tFWSk7Ci0gICAgICAgICAgICAgICAgTm9kZUxpc3QgbGlzdCA9IGNoaWxkLmdldEVsZW1lbnRzQnlUYWdOYW1lKFRBR19JVEVNKTsKLSAgICAgICAgICAgICAgICBMaXN0IHZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbGlzdC5pdGVtKGopOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlTGlzdC5hZGQobm9kZS5nZXRBdHRyaWJ1dGUoVEFHX1ZBTFVFKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gdmFsdWUgPSBuZXcgU3RyaW5nW3ZhbHVlTGlzdC5zaXplKCldOwotICAgICAgICAgICAgICAgIHZhbHVlTGlzdC50b0FycmF5KHZhbHVlKTsKLSAgICAgICAgICAgICAgICBhcnJheUl0ZW1zLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfU0VDVElPTik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG4gPSBsLml0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAocm9vdCA9PSBuLmdldFBhcmVudE5vZGUoKSkgewotICAgICAgICAgICAgICAgIERpYWxvZ1NldHRpbmdzIHMgPSBuZXcgRGlhbG9nU2V0dGluZ3MoIk5vTmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBzLmxvYWQoZG9jdW1lbnQsIChFbGVtZW50KSBuKTsKLSAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nU2V0dGluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0KFN0cmluZyBrZXksIFN0cmluZ1tdIHZhbHVlKSB7Ci0gICAgICAgIGFycmF5SXRlbXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1NldHRpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcga2V5LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgcHV0KGtleSwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dTZXR0aW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgcHV0KGtleSwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dTZXR0aW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgaW50IHZhbHVlKSB7Ci0gICAgICAgIHB1dChrZXksIFN0cmluZy52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nU2V0dGluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0KFN0cmluZyBrZXksIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgcHV0KGtleSwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dTZXR0aW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGl0ZW1zLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dTZXR0aW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBwdXQoa2V5LCBTdHJpbmcudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1NldHRpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmUoV3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAJc2F2ZShuZXcgWE1MV3JpdGVyKHdyaXRlcikpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1NldHRpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLSAgICAgICAgWE1MV3JpdGVyIHdyaXRlciA9IG5ldyBYTUxXcml0ZXIoc3RyZWFtKTsKLSAgICAgICAgc2F2ZSh3cml0ZXIpOwotICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogU2F2ZSB0aGUgc2V0dGluZ3MgaW4gdGhlIDxjb2RlPmRvY3VtZW50PC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2F2ZShYTUxXcml0ZXIgb3V0KSB7Ci0gICAgCUhhc2hNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKDIpOwotICAgIAlhdHRyaWJ1dGVzLnB1dChUQUdfTkFNRSwgbmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBvdXQuc3RhcnRUYWcoVEFHX1NFQ1RJT04sIGF0dHJpYnV0ZXMpOwotICAgICAgICBhdHRyaWJ1dGVzLmNsZWFyKCk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaXRlbXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChUQUdfS0VZLCBrZXkgPT0gbnVsbCA/ICIiIDoga2V5KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpIGl0ZW1zLmdldChrZXkpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoVEFHX1ZBTFVFLCBzdHJpbmcgPT0gbnVsbCA/ICIiIDogc3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgCi0gICAgICAgICAgICBvdXQucHJpbnRUYWcoVEFHX0lURU0sIGF0dHJpYnV0ZXMsIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXR0cmlidXRlcy5jbGVhcigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhcnJheUl0ZW1zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoVEFHX0tFWSwga2V5ID09IG51bGwgPyAiIiA6IGtleSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG91dC5zdGFydFRhZyhUQUdfTElTVCwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZSA9IChTdHJpbmdbXSkgYXJyYXlJdGVtcy5nZXQoa2V5KTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuY2xlYXIoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHZhbHVlLmxlbmd0aDsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nID0gdmFsdWVbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChUQUdfVkFMVUUsIHN0cmluZyA9PSBudWxsID8gIiIgOiBzdHJpbmcpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludFRhZyhUQUdfSVRFTSwgYXR0cmlidXRlcywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LmVuZFRhZyhUQUdfTElTVCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2VjdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAoKERpYWxvZ1NldHRpbmdzKSBpLm5leHQoKSkuc2F2ZShvdXQpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5lbmRUYWcoVEFHX1NFQ1RJT04pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBIHNpbXBsZSBYTUwgd3JpdGVyLiAgVXNpbmcgdGhpcyBpbnN0ZWFkIG9mIHRoZSBqYXZheC54bWwudHJhbnNmb3JtIGNsYXNzZXMgYWxsb3dzCi0gICAgICogY29tcGlsYXRpb24gYWdhaW5zdCBKQ0wgRm91bmRhdGlvbiAoYnVnIDgwMDU5KS4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWE1MV3JpdGVyIGV4dGVuZHMgUHJpbnRXcml0ZXIgewotICAgIAlwcm90ZWN0ZWQgaW50IHRhYjsKLQotICAgIAkvKiBjb25zdGFudHMgKi8KLSAgICAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1ZFUlNJT04gPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgCXB1YmxpYyBYTUxXcml0ZXIoT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgIAkJc3VwZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXQsICJVVEY4IikpOyAvLyROT04tTkxTLTEkCi0gICAgCQl0YWIgPSAwOwotICAgIAkJcHJpbnRsbihYTUxfVkVSU0lPTik7Ci0gICAgCX0KLQotICAgIAlwdWJsaWMgWE1MV3JpdGVyKFdyaXRlciBvdXRwdXQpIHsKLSAgICAJCXN1cGVyKG91dHB1dCk7Ci0gICAgCQl0YWIgPSAwOwotICAgIAkJcHJpbnRsbihYTUxfVkVSU0lPTik7Ci0gICAgCX0KLQotICAgIAlwdWJsaWMgdm9pZCBlbmRUYWcoU3RyaW5nIG5hbWUpIHsKLSAgICAJCXRhYi0tOwotICAgIAkJcHJpbnRUYWcoIi8iICsgbmFtZSwgbnVsbCwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgCX0KLQotICAgIAlwcml2YXRlIHZvaWQgcHJpbnRUYWJ1bGF0aW9uKCkgewotICAgIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWI7IGkrKykKLSAgICAJCQlzdXBlci5wcmludCgnXHQnKTsKLSAgICAJfQotCi0gICAgCXB1YmxpYyB2b2lkIHByaW50VGFnKFN0cmluZyBuYW1lLCBIYXNoTWFwIHBhcmFtZXRlcnMsIGJvb2xlYW4gY2xvc2UpIHsKLSAgICAJCXByaW50VGFnKG5hbWUsIHBhcmFtZXRlcnMsIHRydWUsIHRydWUsIGNsb3NlKTsKLSAgICAJfQotCi0gICAgCXByaXZhdGUgdm9pZCBwcmludFRhZyhTdHJpbmcgbmFtZSwgSGFzaE1hcCBwYXJhbWV0ZXJzLCBib29sZWFuIHNob3VsZFRhYiwgYm9vbGVhbiBuZXdMaW5lLCBib29sZWFuIGNsb3NlKSB7Ci0gICAgCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgCQlzYi5hcHBlbmQoJzwnKTsKLSAgICAJCXNiLmFwcGVuZChuYW1lKTsKLSAgICAJCWlmIChwYXJhbWV0ZXJzICE9IG51bGwpCi0gICAgCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24ocGFyYW1ldGVycy5rZXlTZXQoKSk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgCQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0gICAgCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgCQkJCXNiLmFwcGVuZChrZXkpOwotICAgIAkJCQlzYi5hcHBlbmQoIj1cIiIpOyAvLyROT04tTkxTLTEkCi0gICAgCQkJCXNiLmFwcGVuZChnZXRFc2NhcGVkKFN0cmluZy52YWx1ZU9mKHBhcmFtZXRlcnMuZ2V0KGtleSkpKSk7Ci0gICAgCQkJCXNiLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCX0KLSAgICAJCWlmIChjbG9zZSkKLSAgICAJCQlzYi5hcHBlbmQoJy8nKTsKLSAgICAJCXNiLmFwcGVuZCgnPicpOwotICAgIAkJaWYgKHNob3VsZFRhYikKLSAgICAJCQlwcmludFRhYnVsYXRpb24oKTsKLSAgICAJCWlmIChuZXdMaW5lKQotICAgIAkJCXByaW50bG4oc2IudG9TdHJpbmcoKSk7Ci0gICAgCQllbHNlCi0gICAgCQkJcHJpbnQoc2IudG9TdHJpbmcoKSk7Ci0gICAgCX0KLQotICAgIAlwdWJsaWMgdm9pZCBzdGFydFRhZyhTdHJpbmcgbmFtZSwgSGFzaE1hcCBwYXJhbWV0ZXJzKSB7Ci0gICAgCQlzdGFydFRhZyhuYW1lLCBwYXJhbWV0ZXJzLCB0cnVlKTsKLSAgICAJCXRhYisrOwotICAgIAl9Ci0KLSAgICAJcHJpdmF0ZSB2b2lkIHN0YXJ0VGFnKFN0cmluZyBuYW1lLCBIYXNoTWFwIHBhcmFtZXRlcnMsIGJvb2xlYW4gbmV3TGluZSkgewotICAgIAkJcHJpbnRUYWcobmFtZSwgcGFyYW1ldGVycywgdHJ1ZSwgbmV3TGluZSwgZmFsc2UpOwotICAgIAl9Ci0KLSAgICAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRFc2NhcGVkQ2hhcihTdHJpbmdCdWZmZXIgYnVmZmVyLCBjaGFyIGMpIHsKLSAgICAJCVN0cmluZyByZXBsYWNlbWVudCA9IGdldFJlcGxhY2VtZW50KGMpOwotICAgIAkJaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKLSAgICAJCQlidWZmZXIuYXBwZW5kKCcmJyk7Ci0gICAgCQkJYnVmZmVyLmFwcGVuZChyZXBsYWNlbWVudCk7Ci0gICAgCQkJYnVmZmVyLmFwcGVuZCgnOycpOwotICAgIAkJfSBlbHNlIHsKLSAgICAJCQlidWZmZXIuYXBwZW5kKGMpOwotICAgIAkJfQotICAgIAl9Ci0KLSAgICAJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVzY2FwZWQoU3RyaW5nIHMpIHsKLSAgICAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkgKyAxMCk7Ci0gICAgCQlmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7ICsraSkKLSAgICAJCQlhcHBlbmRFc2NhcGVkQ2hhcihyZXN1bHQsIHMuY2hhckF0KGkpKTsKLSAgICAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICAJfQotCi0gICAgCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZXBsYWNlbWVudChjaGFyIGMpIHsKLSAgICAJCS8vIEVuY29kZSBzcGVjaWFsIFhNTCBjaGFyYWN0ZXJzIGludG8gdGhlIGVxdWl2YWxlbnQgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0gICAgCQkvLyBUaGUgZmlyc3QgZml2ZSBhcmUgZGVmaW5lZCBieSBkZWZhdWx0IGZvciBhbGwgWE1MIGRvY3VtZW50cy4KLSAgICAJCS8vIFRoZSBuZXh0IHRocmVlICgjeEQsICN4QSwgI3g5KSBhcmUgZW5jb2RlZCB0byBhdm9pZCB0aGVtCi0JCQkvLyBiZWluZyBjb252ZXJ0ZWQgdG8gc3BhY2VzIG9uIGRlc2VyaWFsaXphdGlvbgotICAgIAkJc3dpdGNoIChjKSB7Ci0gICAgCQkJY2FzZSAnPCcgOgotICAgIAkJCQlyZXR1cm4gImx0IjsgLy8kTk9OLU5MUy0xJAotICAgIAkJCWNhc2UgJz4nIDoKLSAgICAJCQkJcmV0dXJuICJndCI7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQljYXNlICciJyA6Ci0gICAgCQkJCXJldHVybiAicXVvdCI7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQljYXNlICdcJycgOgotICAgIAkJCQlyZXR1cm4gImFwb3MiOyAvLyROT04tTkxTLTEkCi0gICAgCQkJY2FzZSAnJicgOgotICAgIAkJCQlyZXR1cm4gImFtcCI7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQljYXNlICdccic6Ci0JCQkJCXJldHVybiAiI3gwRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlICdcbic6Ci0JCQkJCXJldHVybiAiI3gwQSI7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlICdcdTAwMDknOgotCQkJCQlyZXR1cm4gIiN4MDkiOyAvLyROT04tTkxTLTEkCi0gICAgCQl9Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvRGlhbG9nVHJheS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9EaWFsb2dUcmF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NGFlMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9EaWFsb2dUcmF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgYWxsIGRpYWxvZyB0cmF5cy4gQSB0cmF5IGNhbiBiZSBvcGVuZWQKLSAqIGluIGFueSA8Y29kZT5UcmF5RGlhbG9nPC9jb2RlPi4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRyYXlEaWFsb2cKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpYWxvZ1RyYXkgewotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udGVudHMgKHdpZGdldHMpIHRoYXQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhlIHRyYXkuCi0JICogPHA+Ci0JICogVHJheSBpbXBsZW1lbnRpb25zIG11c3Qgbm90IHNldCBhIGxheW91dCBvbiB0aGUgcGFyZW50IGNvbXBvc2l0ZSwgb3IgYXNzdW1lCi0JICogYSBwYXJ0aWN1bGFyIGxheW91dCBvbiB0aGUgcGFyZW50LiBUaGUgdHJheSBkaWFsb2cgd2lsbCBhbGxvY2F0ZSBzcGFjZQotCSAqIGFjY29yZGluZyB0byB0aGUgbmF0dXJhbCBzaXplIG9mIHRoZSB0cmF5LCBhbmQgd2lsbCBmaWxsIHRoZSB0cmF5IGFyZWEgd2l0aCB0aGUKLQkgKiB0cmF5J3MgY29udGVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbXBvc2l0ZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgdHJheQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSB0cmF5LCBhcyBhIDxjb2RlPkNvbnRyb2w8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0Vycm9yRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0Vycm9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MDMyMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9FcnJvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAkJSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotICogCQlTZWJhc3RpYW4gRGF2aWRzIDxzZGF2aWRzQGdteC5kZT4gLSBGaXggZm9yIGJ1ZyAxOTM0NiAtIERpYWxvZyBmb250IHNob3VsZAotICogCQkJYmUgYWN0aXZhdGVkIGFuZCB1c2VkIGJ5IG90aGVyIGNvbXBvbmVudHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+SVN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cwotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JEaWFsb2cgZXh0ZW5kcyBJY29uQW5kTWVzc2FnZURpYWxvZyB7Ci0gICAgLyoqCi0gICAgICogU3RhdGljIHRvIHByZXZlbnQgb3BlbmluZyBvZiBlcnJvciBkaWFsb2dzIGZvciBhdXRvbWF0ZWQgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gQVVUT01BVEVEX01PREUgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFJlc2VydmUgcm9vbSBmb3IgdGhpcyBtYW55IGxpc3QgaXRlbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJU1RfSVRFTV9DT1VOVCA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmVzdGluZyBpbmRlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FU1RJTkdfSU5ERU5UID0gIiAgIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIERldGFpbHMgYnV0dG9uLgotICAgICAqLwotICAgIHByaXZhdGUgQnV0dG9uIGRldGFpbHNCdXR0b247Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBTV1QgbGlzdCBjb250cm9sIHRoYXQgZGlzcGxheXMgdGhlIGVycm9yIGRldGFpbHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGxpc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXJyb3IgZGV0YWlscyB2aWV3ZXIgaXMgY3VycmVudGx5IGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGxpc3RDcmVhdGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBGaWx0ZXIgbWFzayBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggc3RhdHVzIGl0ZW1zIHRvIGRpc3BsYXkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZGlzcGxheU1hc2sgPSAweEZGRkY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWFpbiBzdGF0dXMgb2JqZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBjbGlwYm9hcmQuIFRvIGJlIGRpc3Bvc2VkIHdoZW4gY2xvc2luZyB0aGUgZGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgQ2xpcGJvYXJkIGNsaXBib2FyZDsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRJbmNsdWRlVG9wTGV2ZWxFcnJvckluRGV0YWlscyA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLSAgICAgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICAgICAqIDxwPgotICAgICAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZQotICAgICAqIG9mIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcKLSAgICAgKiBkaXNwbGF5ZWQgY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZCA8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzawotICAgICAqIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgICAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotICAgICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHN0YXR1cwotICAgICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzCi0gICAgICogICAgICAgICAgICBwZXIgPGNvZGU+SVN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjbWF0Y2hlcyhpbnQpCi0gICAgICovCi0gICAgcHVibGljIEVycm9yRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIFN0cmluZyBtZXNzYWdlLAotICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMsIGludCBkaXNwbGF5TWFzaykgewotICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgICAgIHRoaXMudGl0bGUgPSBkaWFsb2dUaXRsZSA9PSBudWxsID8gSkZhY2VSZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJQcm9ibGVtX09jY3VycmVkIikgOiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgZGlhbG9nVGl0bGU7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgPT0gbnVsbCA/IHN0YXR1cy5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICA6IEpGYWNlUmVzb3VyY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVhc29uIiwgbmV3IE9iamVjdFtdIHsgbWVzc2FnZSwgc3RhdHVzLmdldE1lc3NhZ2UoKSB9KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKLSAgICAgICAgdGhpcy5kaXNwbGF5TWFzayA9IGRpc3BsYXlNYXNrOwotICAgICAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLiBIYW5kbGVzIHRoZSBwcmVzc2luZyBvZiB0aGUgT2sKLSAgICAgKiBvciBEZXRhaWxzIGJ1dHRvbiBpbiB0aGlzIGRpYWxvZy4gSWYgdGhlIE9rIGJ1dHRvbiB3YXMgcHJlc3NlZCB0aGVuIGNsb3NlCi0gICAgICogdGhpcyBkaWFsb2cuIElmIHRoZSBEZXRhaWxzIGJ1dHRvbiB3YXMgcHJlc3NlZCB0aGVuIHRvZ2dsZSB0aGUgZGlzcGxheWluZwotICAgICAqIG9mIHRoZSBlcnJvciBkZXRhaWxzIGFyZWEuIE5vdGUgdGhhdCB0aGUgRGV0YWlscyBidXR0b24gd2lsbCBvbmx5IGJlCi0gICAgICogdmlzaWJsZSBpZiB0aGUgZXJyb3IgYmVpbmcgZGlzcGxheWVkIHNwZWNpZmllcyBjaGlsZCBkZXRhaWxzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKSB7Ci0gICAgICAgIGlmIChpZCA9PSBJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQpIHsKLSAgICAgICAgICAgIC8vIHdhcyB0aGUgZGV0YWlscyBidXR0b24gcHJlc3NlZD8KLSAgICAgICAgICAgIHRvZ2dsZURldGFpbHNBcmVhKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICAgICAgc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBPSyBhbmQgRGV0YWlscyBidXR0b25zCi0gICAgICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgIGlmIChzaG91bGRTaG93RGV0YWlsc0J1dHRvbigpKSB7Ci0gICAgICAgICAgICBkZXRhaWxzQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBmcmFtZXdvcmsgbWV0aG9kIGNyZWF0ZXMKLSAgICAgKiBhbmQgbGF5cyBvdXQgYSBjb21wb3NpdGUgYW5kIGNhbGxzIDxjb2RlPmNyZWF0ZU1lc3NhZ2VBcmVhPC9jb2RlPiBhbmQKLSAgICAgKiA8Y29kZT5jcmVhdGVDdXN0b21BcmVhPC9jb2RlPiB0byBwb3B1bGF0ZSBpdC4gU3ViY2xhc3NlcyBzaG91bGQKLSAgICAgKiBvdmVycmlkZSA8Y29kZT5jcmVhdGVDdXN0b21BcmVhPC9jb2RlPiB0byBhZGQgY29udGVudHMgYmVsb3cgdGhlCi0gICAgICogbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY3JlYXRlTWVzc2FnZUFyZWEocGFyZW50KTsKLSAgICAgICAgLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLSAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgY2hpbGREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGNoaWxkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGNoaWxkRGF0YSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJY29uQW5kTWVzc2FnZURpYWxvZyNjcmVhdGVEaWFsb2dBbmRCdXR0b25BcmVhKENvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEaWFsb2dBbmRCdXR0b25BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlRGlhbG9nQW5kQnV0dG9uQXJlYShwYXJlbnQpOwotICAgICAgICBpZiAodGhpcy5kaWFsb2dBcmVhIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0gICAgICAgICAgICAvL0NyZWF0ZSBhIGxhYmVsIGlmIHRoZXJlIGFyZSBubyBjaGlsZHJlbiB0byBmb3JjZSBhIHNtYWxsZXIgbGF5b3V0Ci0gICAgICAgICAgICBDb21wb3NpdGUgZGlhbG9nQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgZGlhbG9nQXJlYTsKLSAgICAgICAgICAgIGlmIChkaWFsb2dDb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICBuZXcgTGFiZWwoZGlhbG9nQ29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkljb25BbmRNZXNzYWdlRGlhbG9nI2dldEltYWdlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V2FybmluZ0ltYWdlKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbmZvSW1hZ2UoKTsKLSAgICAgICAgfQotICAgICAgICAvL0lmIGl0IHdhcyBub3QgYSB3YXJuaW5nIG9yIGFuIGVycm9yIHRoZW4gcmV0dXJuIHRoZSBlcnJvciBpbWFnZQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JJbWFnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGlzIGRpYWxvZydzIGRyb3AtZG93biBsaXN0IGNvbXBvbmVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqIEByZXR1cm4gdGhlIGRyb3AtZG93biBsaXN0IGNvbXBvbmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGNyZWF0ZURyb3BEb3duTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIGNyZWF0ZSB0aGUgbGlzdAotICAgICAgICBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMCi0gICAgICAgICAgICAgICAgfCBTV1QuTVVMVEkpOwotICAgICAgICAvLyBmaWxsIHRoZSBsaXN0Ci0gICAgICAgIHBvcHVsYXRlTGlzdChsaXN0KTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSBsaXN0LmdldEl0ZW1IZWlnaHQoKSAqIExJU1RfSVRFTV9DT1VOVDsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgbGlzdC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBNZW51IGNvcHlNZW51ID0gbmV3IE1lbnUobGlzdCk7Ci0gICAgICAgIE1lbnVJdGVtIGNvcHlJdGVtID0gbmV3IE1lbnVJdGVtKGNvcHlNZW51LCBTV1QuTk9ORSk7Ci0gICAgICAgIGNvcHlJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBAc2VlIFNlbGVjdGlvbkxpc3RlbmVyLndpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvcHlUb0NsaXBib2FyZCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQHNlZSBTZWxlY3Rpb25MaXN0ZW5lci53aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY29weVRvQ2xpcGJvYXJkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBjb3B5SXRlbS5zZXRUZXh0KEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiY29weSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBsaXN0LnNldE1lbnUoY29weU1lbnUpOwotICAgICAgICBsaXN0Q3JlYXRlZCA9IHRydWU7Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotICAgICAqLwotICAgIC8qKgotICAgICAqIEV4dGVuZHMgPGNvZGU+V2luZG93Lm9wZW4oKTwvY29kZT4uIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5Ci0gICAgICogdGhlIGVycm9yLiBJZiB5b3Ugc3BlY2lmaWVkIGEgbWFzayB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UKLSAgICAgKiBjaGlsZHJlbiwgdGhlIGVycm9yIGRpYWxvZyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGF0IGxlYXN0Ci0gICAgICogb25lIGNoaWxkIHN0YXR1cyBtYXRjaGluZyB0aGUgbWFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG9wZW4oKSB7Ci0gICAgICAgIGlmICghQVVUT01BVEVEX01PREUgJiYgc2hvdWxkRGlzcGxheShzdGF0dXMsIGRpc3BsYXlNYXNrKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW4oKTsKLSAgICAgICAgfQotICAgICAgICBzZXRSZXR1cm5Db2RlKE9LKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5IHRoZSBnaXZlbiBlcnJvci4gVXNlIHRoaXMgbWV0aG9kIGlmIHRoZQotICAgICAqIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQgZG9lcyBub3QgY29udGFpbiBjaGlsZCBpdGVtcywgb3IgaWYgeW91IHdpc2gKLSAgICAgKiB0byBkaXNwbGF5IGFsbCBzdWNoIGl0ZW1zIHdpdGhvdXQgZmlsdGVyaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHN0YXR1cwotICAgICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICAgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLSAgICAgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLSAgICAgKiAgICAgICAgIGJ1dHRvbiB3YXMgcHJlc3NlZCwgb3IgPGNvZGU+RGlhbG9nLkNBTkNFTDwvY29kZT4gaWYgdGhpcwotICAgICAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgb3BlbkVycm9yKFNoZWxsIHBhcmVudCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UsIElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIHJldHVybiBvcGVuRXJyb3IocGFyZW50LCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBJU3RhdHVzLk9LCi0gICAgICAgICAgICAgICAgfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gZXJyb3IuIFVzZSB0aGlzIG1ldGhvZCBpZiB0aGUKLSAgICAgKiBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQgPC9pdD4geW91IHdpc2gKLSAgICAgKiB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlCi0gICAgICogY2hpbGRyZW4uIFRoZSBlcnJvciBkaWFsb2cgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpZiB0aGVyZSBpcyBhdCBsZWFzdAotICAgICAqIG9uZSBjaGlsZCBzdGF0dXMgbWF0Y2hpbmcgdGhlIG1hc2suCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAcGFyYW0gdGl0bGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzdGF0dXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcwotICAgICAqICAgICAgICAgICAgcGVyIDxjb2RlPklTdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLSAgICAgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLSAgICAgKiAgICAgICAgIGJ1dHRvbiB3YXMgcHJlc3NlZCwgb3IgPGNvZGU+RGlhbG9nLkNBTkNFTDwvY29kZT4gaWYgdGhpcwotICAgICAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNtYXRjaGVzKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBvcGVuRXJyb3IoU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlLCBJU3RhdHVzIHN0YXR1cywgaW50IGRpc3BsYXlNYXNrKSB7Ci0gICAgICAgIEVycm9yRGlhbG9nIGRpYWxvZyA9IG5ldyBFcnJvckRpYWxvZyhwYXJlbnRTaGVsbCwgdGl0bGUsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gICAgICAgIHJldHVybiBkaWFsb2cub3BlbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvcHVsYXRlcyB0aGUgbGlzdCB1c2luZyB0aGlzIGVycm9yIGRpYWxvZydzIHN0YXR1cyBvYmplY3QuIFRoaXMgd2Fsa3MKLSAgICAgKiB0aGUgY2hpbGQgc3RhdGljIG9mIHRoZSBzdGF0dXMgb2JqZWN0IGFuZCBkaXNwbGF5cyB0aGVtIGluIGEgbGlzdC4gVGhlCi0gICAgICogZm9ybWF0IGZvciBlYWNoIGVudHJ5IGlzIHN0YXR1c19wYXRoIDogc3RhdHVzX21lc3NhZ2UgSWYgdGhlIHN0YXR1cydzCi0gICAgICogcGF0aCB3YXMgbnVsbCB0aGVuIGl0IChhbmQgdGhlIGNvbG9uKSBhcmUgb21pdHRlZC4KLSAgICAgKiBAcGFyYW0gbGlzdFRvUG9wdWxhdGUgVGhlIGxpc3QgdG8gZmlsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3QgbGlzdFRvUG9wdWxhdGUpIHsKLSAgICAgICAgcG9wdWxhdGVMaXN0KGxpc3RUb1BvcHVsYXRlLCBzdGF0dXMsIDAsIHNob3VsZEluY2x1ZGVUb3BMZXZlbEVycm9ySW5EZXRhaWxzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSB0aGUgbGlzdCB3aXRoIHRoZSBtZXNzYWdlcyBmcm9tIHRoZSBnaXZlbiBzdGF0dXMuIFRyYXZlcnNlIHRoZQotICAgICAqIGNoaWxkcmVuIG9mIHRoZSBzdGF0dXMgZGVlcGx5IGFuZCBhbHNvIHRyYXZlcnNlIENvcmVFeGNlcHRpb25zIHRoYXQgYXBwZWFyCi0gICAgICogaW4gdGhlIHN0YXR1cy4KLSAgICAgKiBAcGFyYW0gbGlzdFRvUG9wdWxhdGUgdGhlIGxpc3QgdG8gcG9wdWxhdGUKLSAgICAgKiBAcGFyYW0gYnVpbGRpbmdTdGF0dXMgdGhlIHN0YXR1cyBiZWluZyBkaXNwbGF5ZWQKLSAgICAgKiBAcGFyYW0gbmVzdGluZyB0aGUgbmVzdGluZyBsZXZlbCAoaW5jcmVhc2VzIG9uZSBsZXZlbCBmb3IgZWFjaCBsZXZlbCBvZiBjaGlsZHJlbikKLSAgICAgKiBAcGFyYW0gaW5jbHVkZVN0YXR1cyB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIGJ1aWxkaW5nU3RhdHVzIGluIHRoZSBkaXNwbGF5IG9yCi0gICAgICoganVzdCBpdHMgY2hpbGRyZW4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3QgbGlzdFRvUG9wdWxhdGUsIElTdGF0dXMgYnVpbGRpbmdTdGF0dXMsCi0gICAgICAgICAgICBpbnQgbmVzdGluZywgYm9vbGVhbiBpbmNsdWRlU3RhdHVzKSB7Ci0gICAgICAgIAotICAgICAgICBpZiAoIWJ1aWxkaW5nU3RhdHVzLm1hdGNoZXMoZGlzcGxheU1hc2spKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBUaHJvd2FibGUgdCA9IGJ1aWxkaW5nU3RhdHVzLmdldEV4Y2VwdGlvbigpOwotICAgICAgICBib29sZWFuIGlzQ29yZUV4Y2VwdGlvbj0gdCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb247Ci0gICAgICAgIGJvb2xlYW4gaW5jcmVtZW50TmVzdGluZz0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgIAlpZiAoaW5jbHVkZVN0YXR1cykgewotCSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspIHsKLQkgICAgICAgICAgICBzYi5hcHBlbmQoTkVTVElOR19JTkRFTlQpOwotCSAgICAgICAgfQotCSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBidWlsZGluZ1N0YXR1cy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobWVzc2FnZSk7Ci0JICAgICAgICBsaXN0VG9Qb3B1bGF0ZS5hZGQoc2IudG9TdHJpbmcoKSk7Ci0JICAgICAgICBpbmNyZW1lbnROZXN0aW5nPSB0cnVlOwotICAgICAgIAl9Ci0gICAgICAgIAkKLSAgICAgICAgaWYgKCFpc0NvcmVFeGNlcHRpb24gJiYgdCAhPSBudWxsKSB7Ci0gICAgICAgIAkvLyBJbmNsdWRlIGxvdy1sZXZlbCBleGNlcHRpb24gbWVzc2FnZQotCSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspIHsKLQkgICAgICAgICAgICBzYi5hcHBlbmQoTkVTVElOR19JTkRFTlQpOwotCSAgICAgICAgfQotCSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSB0LmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0JICAgICAgICAJbWVzc2FnZSA9IHQudG9TdHJpbmcoKTsKLQkgICAgICAgIAkKLQkgICAgICAgIHNiLmFwcGVuZChtZXNzYWdlKTsKLQkgICAgICAgIGxpc3RUb1BvcHVsYXRlLmFkZChzYi50b1N0cmluZygpKTsKLQkgICAgICAgIGluY3JlbWVudE5lc3Rpbmc9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChpbmNyZW1lbnROZXN0aW5nKSAKLQkgICAgICAgIG5lc3RpbmcrKzsKLSAgICAgICAgCi0gICAgICAgIC8vIExvb2sgZm9yIGEgbmVzdGVkIGNvcmUgZXhjZXB0aW9uCi0gICAgICAgIGlmIChpc0NvcmVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIENvcmVFeGNlcHRpb24gY2UgPSAoQ29yZUV4Y2VwdGlvbil0OwotICAgICAgICAgICAgSVN0YXR1cyBlU3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAvLyBPbmx5IHByaW50IHRoZSBleGNlcHRpb24gbWVzc2FnZSBpZiBpdCBpcyBub3QgY29udGFpbmVkIGluIHRoZSBwYXJlbnQgbWVzc2FnZQotICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLmluZGV4T2YoZVN0YXR1cy5nZXRNZXNzYWdlKCkpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgcG9wdWxhdGVMaXN0KGxpc3RUb1BvcHVsYXRlLCBlU3RhdHVzLCBuZXN0aW5nLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIAotICAgICAgICAvLyBMb29rIGZvciBjaGlsZCBzdGF0dXMKLSAgICAgICAgSVN0YXR1c1tdIGNoaWxkcmVuID0gYnVpbGRpbmdTdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcG9wdWxhdGVMaXN0KGxpc3RUb1BvcHVsYXRlLCBjaGlsZHJlbltpXSwgbmVzdGluZywgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHN0YXR1cyBvYmplY3Qgc2hvdWxkIGJlIGRpc3BsYXllZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhdHVzCi0gICAgICogICAgICAgICAgICBhIHN0YXR1cyBvYmplY3QKLSAgICAgKiBAcGFyYW0gbWFzawotICAgICAqICAgICAgICAgICAgYSBtYXNrIGFzIHBlciA8Y29kZT5JU3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gc3RhdHVzIHNob3VsZCBiZSBkaXNwbGF5ZWQsIGFuZAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjbWF0Y2hlcyhpbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHNob3VsZERpc3BsYXkoSVN0YXR1cyBzdGF0dXMsIGludCBtYXNrKSB7Ci0gICAgICAgIElTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCBjaGlsZHJlbi5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1cy5tYXRjaGVzKG1hc2spOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5tYXRjaGVzKG1hc2spKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIKLSAgICAgKiBwcmVzc2luZyB0aGUgZGV0YWlscyBidXR0b24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotICAgICAgICBQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0gICAgICAgIFBvaW50IG9sZFNpemUgPSBnZXRTaGVsbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgICAgIGlmIChsaXN0Q3JlYXRlZCkgewotICAgICAgICAgICAgbGlzdC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBsaXN0Q3JlYXRlZCA9IGZhbHNlOwotICAgICAgICAgICAgZGV0YWlsc0J1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpc3QgPSBjcmVhdGVEcm9wRG93bkxpc3QoKENvbXBvc2l0ZSkgZ2V0Q29udGVudHMoKSk7Ci0gICAgICAgICAgICBkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5ISURFX0RFVEFJTFNfTEFCRUwpOwotICAgICAgICB9Ci0gICAgICAgIFBvaW50IG5ld1NpemUgPSBnZXRTaGVsbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgICAgIGdldFNoZWxsKCkKLSAgICAgICAgICAgICAgICAuc2V0U2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludCh3aW5kb3dTaXplLngsIHdpbmRvd1NpemUueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChuZXdTaXplLnkgLSBvbGRTaXplLnkpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHV0IHRoZSBkZXRhaWxzIG9mIHRoZSBzdGF0dXMgb2YgdGhlIGVycm9yIG9udG8gdGhlIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVpbGRpbmdTdGF0dXMKLSAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogQHBhcmFtIG5lc3RpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVDb3B5QnVmZmVyKElTdGF0dXMgYnVpbGRpbmdTdGF0dXMsCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgbmVzdGluZykgewotICAgICAgICBpZiAoIWJ1aWxkaW5nU3RhdHVzLm1hdGNoZXMoZGlzcGxheU1hc2spKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoTkVTVElOR19JTkRFTlQpOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoYnVpbGRpbmdTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgLy8gTG9vayBmb3IgYSBuZXN0ZWQgY29yZSBleGNlcHRpb24KLSAgICAgICAgVGhyb3dhYmxlIHQgPSBidWlsZGluZ1N0YXR1cy5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBDb3JlRXhjZXB0aW9uIGNlID0gKENvcmVFeGNlcHRpb24pdDsKLSAgICAgICAgICAgIHBvcHVsYXRlQ29weUJ1ZmZlcihjZS5nZXRTdGF0dXMoKSwgYnVmZmVyLCBuZXN0aW5nICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElTdGF0dXNbXSBjaGlsZHJlbiA9IGJ1aWxkaW5nU3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHBvcHVsYXRlQ29weUJ1ZmZlcihjaGlsZHJlbltpXSwgYnVmZmVyLCBuZXN0aW5nICsgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgc3RhdHVzZXMgdG8gdGhlIGNsaXBib2FyZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29weVRvQ2xpcGJvYXJkKCkgewotICAgICAgICBpZiAoY2xpcGJvYXJkICE9IG51bGwpCi0gICAgICAgICAgICBjbGlwYm9hcmQuZGlzcG9zZSgpOwotICAgICAgICBTdHJpbmdCdWZmZXIgc3RhdHVzQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBwb3B1bGF0ZUNvcHlCdWZmZXIoc3RhdHVzLCBzdGF0dXNCdWZmZXIsIDApOwotICAgICAgICBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKGxpc3QuZ2V0RGlzcGxheSgpKTsKLSAgICAgICAgY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXSB7IHN0YXR1c0J1ZmZlci50b1N0cmluZygpIH0sCi0gICAgICAgICAgICAgICAgbmV3IFRyYW5zZmVyW10geyBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY2xvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotICAgICAgICBpZiAoY2xpcGJvYXJkICE9IG51bGwpCi0gICAgICAgICAgICBjbGlwYm9hcmQuZGlzcG9zZSgpOwotICAgICAgICByZXR1cm4gc3VwZXIuY2xvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2hvdyB0aGUgZGV0YWlscyBwb3J0aW9uIG9mIHRoZSBkaWFsb2cgaWYgaXQgaXMgbm90IGFscmVhZHkgdmlzaWJsZS4KLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgd29yayB3aGVuIGl0IGlzIGludm9rZWQgYWZ0ZXIgdGhlIGNvbnRyb2wgb2YgdGhlIGRpYWxvZwotICAgICAqIGhhcyBiZWVuIHNldC4gSW4gb3RoZXIgd29yZHMsIGFmdGVyIHRoZSA8Y29kZT5jcmVhdGVDb250ZW50czwvY29kZT4gbWV0aG9kCi0gICAgICogaGFzIGJlZW4gaW52b2tlZCBhbmQgaGFzIHJldHVybmVkIHRoZSBjb250cm9sIGZvciB0aGUgY29udGVudCBhcmVhIG9mIHRoZSBkaWFsb2cuCi0gICAgICogSW52b2tpbmcgdGhlIG1ldGhvZCBiZWZvcmUgdGhlIGNvbnRlbnQgYXJlYSBoYXMgYmVlbiBzZXQgb3IgYWZ0ZXIgdGhlIGRpYWxvZyBoYXMgYmVlbgotICAgICAqIGRpc3Bvc2VkIHdpbGwgaGF2ZSBubyBlZmZlY3QuCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNob3dEZXRhaWxzQXJlYSgpIHsKLSAgICAgICAgaWYgKCFsaXN0Q3JlYXRlZCkgewotICAgICAgICAgICAgQ29udHJvbCBjb250cm9sID0gZ2V0Q29udGVudHMoKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgISBjb250cm9sLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICB0b2dnbGVEZXRhaWxzQXJlYSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBEZXRhaWxzIGJ1dHRvbiBzaG91bGQgYmUgaW5jbHVkZWQuCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBvbmNlIHdoZW4gdGhlIGRpYWxvZyBpcyBidWlsdC4KLSAgICAgKiBCeSBkZWZhdWx0LCB0aGUgRGV0YWlscyBidXR0b24gaXMgb25seSBpbmNsdWRlZCBpZgotICAgICAqIHRoZSBzdGF0dXMgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBkaWFsb2cgd2FzIGEgbXVsdGktc3RhdHVzCi0gICAgICogb3IgaWYgdGhlIHN0YXR1cyBjb250YWlucyBhbiBleGNlcHRpb24uCi0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBEZXRhaWxzIGJ1dHRvbiBzaG91bGQgYmUgaW5jbHVkZWQKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2hvd0RldGFpbHNCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXMuaXNNdWx0aVN0YXR1cygpIHx8IHN0YXR1cy5nZXRFeGNlcHRpb24oKSAhPSBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHN0YXR1cyBkaXNwbGF5ZWQgYnkgdGhpcyBlcnJvciBkaWFsb2cgdG8gdGhlIGdpdmVuIHN0YXR1cy4KLSAgICAgKiBUaGlzIG9ubHkgYWZmZWN0cyB0aGUgc3RhdHVzIGRpc3BsYXllZCBieSB0aGUgRGV0YWlscyBsaXN0LgotICAgICAqIFRoZSBtZXNzYWdlLCBpbWFnZSBhbmQgdGl0bGUgc2hvdWxkIGJlIHVwZGF0ZWQgYnkgdGhlIHN1YmNsYXNzLAotICAgICAqIGlmIGRlc2lyZWQuCi0gICAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZGV0YWlscyBsaXN0Ci0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBpZiAodGhpcy5zdGF0dXMgIT0gc3RhdHVzKSB7Ci0JICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzaG91bGRJbmNsdWRlVG9wTGV2ZWxFcnJvckluRGV0YWlscyA9IHRydWU7Ci0gICAgICAgIGlmIChsaXN0Q3JlYXRlZCkgewotICAgICAgICAgICAgcmVwb3B1bGF0ZUxpc3QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXBvcHVsYXRlIHRoZSBzdXBwbGllZCBsaXN0IHdpZGdldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVwb3B1bGF0ZUxpc3QoKSB7Ci0gICAgICAgIGlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNEaXNwb3NlZCgpKSB7Ci0JICAgICAgICBsaXN0LnJlbW92ZUFsbCgpOwotCSAgICAgICAgcG9wdWxhdGVMaXN0KGxpc3QpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9JRGlhbG9nQmxvY2tlZEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvSURpYWxvZ0Jsb2NrZWRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Njg2YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9JRGlhbG9nQmxvY2tlZEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGUgSURpYWxvZ0Jsb2NrZWRIYW5kbGVyIGlzIHRoZSBoYW5kbGVyIHVzZWQgYnkKLSAqIEpGYWNlIHRvIHByb3ZpZGUgZXh0cmEgaW5mb3JtYXRpb24gd2hlbiBhCi0gKiBibG9ja2luZyBoYXMgb2NjdXJlZC4gVGhlcmUgaXMgb25lIHN0YXRpYyBpbnN0YW5jZQotICogb2YgdGhpcyBjbGFzcyB1c2VkIGJ5IFdpemFyZERpYWxvZyBhbmQgTW9kYWxDb250ZXh0LgotICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcldpdGhCbG9ja2luZyNjbGVhckJsb2NrZWQoKQotICogQHNlZSAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3JXaXRoQmxvY2tpbmcjc2V0QmxvY2tlZChJU3RhdHVzKQotICogQHNlZSBXaXphcmREaWFsb2cKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhbG9nQmxvY2tlZEhhbmRsZXIgewotICAgIC8qKgotICAgICAqIFRoZSBibG9ja2FnZSBoYXMgYmVlbiBjbGVhcmVkLiBDbGVhciB0aGUKLSAgICAgKiBleHRyYSBpbmZvcm1hdGlvbiBhbmQgcmVzdW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyQmxvY2tlZCgpOwotCi0gICAgLyoqCi0gICAgICogQSBibG9ja2FnZSBoYXMgb2NjdXJlZC4gU2hvdyB0aGUgYmxvY2thZ2UgYW5kIAotICAgICAqIGZvcndhcmQgYW55IGFjdGlvbnMgdG8gYmxvY2tpbmdNb25pdG9yLiAKLSAgICAgKiA8Yj5OT1RFOjwvYj4gVGhpcyB3aWxsIG9wZW4gYW55IGJsb2NrZWQgbm90aWZpY2F0aW9uIGltbWVkaWF0ZWx5Ci0gICAgICogZXZlbiBpZiB0aGVyZSBpcyBhIG1vZGFsIHNoZWxsIG9wZW4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsIFRoZSBzaGVsbCB0aGlzIGlzIGJlaW5nIHNlbnQgZnJvbS4gSWYgdGhlIHBhcmVudAotICAgICAqIHNoZWxsIGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBiZWhhdmlvciB3aWxsIGJlIHRoZSBzYW1lIGFzCi0gICAgICogSURpYWxvZ0Jsb2NrZWRIYW5kbGVyI3Nob3dCbG9ja2VkKElQcm9ncmVzc01vbml0b3IsIElTdGF0dXMsIFN0cmluZykKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmxvY2tpbmcgVGhlIG1vbml0b3IgdG8gZm9yd2FyZCB0by4gVGhpcyBpcyBtb3N0Ci0gICAgICogaW1wb3J0YW50IGZvciBjYWxscyB0byA8Y29kZT5jYW5jZWwoKTwvY29kZT4uCi0gICAgICogQHBhcmFtIGJsb2NraW5nU3RhdHVzIFRoZSBzdGF0dXMgdGhhdCBkZXNjcmliZXMgdGhlIGJsb2NrYWdlCi0gICAgICogQHBhcmFtIGJsb2NrZWROYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NrZWQgb3BlcmF0aW9uLgotICAgICAqIEBzZWUgSURpYWxvZ0Jsb2NrZWRIYW5kbGVyI3Nob3dCbG9ja2VkKElQcm9ncmVzc01vbml0b3IsIElTdGF0dXMsIFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaG93QmxvY2tlZChTaGVsbCBwYXJlbnRTaGVsbCwgSVByb2dyZXNzTW9uaXRvciBibG9ja2luZywKLSAgICAgICAgICAgIElTdGF0dXMgYmxvY2tpbmdTdGF0dXMsIFN0cmluZyBibG9ja2VkTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGJsb2NrYWdlIGhhcyBvY2N1cmVkLiBTaG93IHRoZSBibG9ja2FnZSB3aGVuIHRoZXJlIGlzIAotICAgICAqIG5vIGxvbmdlciBhbnkgbW9kYWwgc2hlbGxzIGluIHRoZSBVSSBhbmQgZm9yd2FyZCBhbnkgYWN0aW9ucyAKLSAgICAgKiB0byBibG9ja2luZ01vbml0b3IuIAotICAgICAqIAotICAgICAqIDxiPk5PVEU6PC9iPiBBcyBubyBzaGVsbCBoYXMgYmVlbiBzcGVjaWZpZWQgdGhpcyBtZXRob2Qgd2lsbAotICAgICAqIG5vdCBvcGVuIGFueSBibG9ja2VkIG5vdGlmaWNhdGlvbiB1bnRpbCBhbGwgb3RoZXIgbW9kYWwgc2hlbGxzCi0gICAgICogaGF2ZSBiZWVuIGNsb3NlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmxvY2tpbmcgVGhlIG1vbml0b3IgdG8gZm9yd2FyZCB0by4gVGhpcyBpcyBtb3N0Ci0gICAgICogaW1wb3J0YW50IGZvciBjYWxscyB0byA8Y29kZT5jYW5jZWwoKTwvY29kZT4uCi0gICAgICogQHBhcmFtIGJsb2NraW5nU3RhdHVzIFRoZSBzdGF0dXMgdGhhdCBkZXNjcmliZXMgdGhlIGJsb2NrYWdlCi0gICAgICogQHBhcmFtIGJsb2NrZWROYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NrZWQgb3BlcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dCbG9ja2VkKElQcm9ncmVzc01vbml0b3IgYmxvY2tpbmcsIElTdGF0dXMgYmxvY2tpbmdTdGF0dXMsCi0gICAgICAgICAgICBTdHJpbmcgYmxvY2tlZE5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9JRGlhbG9nQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0lEaWFsb2dDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2MjkzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0lEaWFsb2dDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9nczsKLQotLyoqCi0gKiBWYXJpb3VzIGRpYWxvZy1yZWxhdGVkIGNvbnN0YW50cy4KLSAqIDxwPgotICogV2l0aGluIHRoZSBkaWFsb2cgZnJhbWV3b3JrLCBhbGwgYnV0dG9ucyBhcmUgcmVmZXJyZWQgdG8gYnkgYSBidXR0b24gaWQuCi0gKiBWYXJpb3VzIGNvbW1vbiBidXR0b25zLCBsaWtlICJPSyIsICJDYW5jZWwiLCBhbmQgIkZpbmlzaCIsIGhhdmUgcHJlLWFzc2lnbmVkCi0gKiBidXR0b24gaWRzIGZvciBjb252ZW5pZW5jZS4gSWYgYW4gYXBwbGljYXRpb24gcmVxdWlyZXMgb3RoZXIgZGlhbG9nIGJ1dHRvbnMsCi0gKiB0aGV5IHNob3VsZCBiZSBhc3NpZ25lZCBhcHBsaWNhdGlvbi1zcGVjaWZpYyBidXR0b24gaWRzIGNvdW50aW5nIHVwIGZyb20KLSAqIDxjb2RlPkNMSUVOVF9JRDwvY29kZT4uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEJ1dHRvbiBsYWJlbCBjb25zdGFudHMgYXJlIGFsc28gcHJvdmlkZWQgZm9yIHRoZSBjb21tb24gYnV0dG9ucy4gSkZhY2UKLSAqIGF1dG9tYXRpY2FsbHkgbG9jYWxpemVzIHRoZXNlIHN0cmluZ3MgdG8gdGhlIGN1cnJlbnQgbG9jYWxlOyB0aGF0IGlzLAotICogPGNvZGU+WUVTX0xBQkVMPC9jb2RlPiB3b3VsZCBiZSBib3VuZCB0byB0aGUgc3RyaW5nIDxjb2RlPiJTaSI8L2NvZGU+IGluCi0gKiBhIFNwYW5pc2ggbG9jYWxlLCBidXQgdG8gPGNvZGU+Ik91aSI8L2NvZGU+IGluIGEgRnJlbmNoIG9uZS4KLSAqIDwvcD4KLSAqIDxwPgotICogQWxsIG1hcmdpbnMsIHNwYWNpbmdzLCBhbmQgc2l6ZXMgYXJlIGdpdmVuIGluICJkaWFsb2cgdW5pdHMiIChETFVzKSwgd2hlcmUKLSAqIDx1bD4KLSAqIDxsaT4xIGhvcml6b250YWwgRExVID0gMS80IGF2ZXJhZ2UgY2hhcmFjdGVyIHdpZHRoPC9saT4KLSAqIDxsaT4xIHZlcnRpY2FsIERMVSA9IDEvOCBhdmVyYWdlIGNoYXJhY3RlciBoZWlnaHQ8L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotCi0vKioKLSAqIElEaWFsb2dDb25zdGFudHMgaXMgdGhlIGludGVyZmFjZSBmb3IgY29tbW9uIGRpYWxvZyBzdHJpbmdzIGFuZCBpZHMKLSAqIHVzZWQgdGhyb3VnaG91dCBKRmFjZS4KLSAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZSB0aGVzZSBsYWJlbHMgYW5kIGlkcyB3aGVyZWV2ZXIgCi0gKiBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgSkZhY2UgZGlhbG9ncy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhbG9nQ29uc3RhbnRzIHsKLSAgICAvLyBidXR0b24gaWRzCi0JCi0JLy8gTm90ZTogIGlmIG5ldyBidXR0b24gaWRzIGFyZSBhZGRlZCwgc2VlIAotCS8vIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLm1hcEJ1dHRvbkxhYmVsVG9CdXR0b25JRChTdHJpbmcsIGludCkKLSAgICAvKioKLSAgICAgKiBCdXR0b24gaWQgZm9yIGFuICJPayIgYnV0dG9uICh2YWx1ZSAwKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IE9LX0lEID0gMDsKLQotICAgIC8qKgotICAgICAqIEJ1dHRvbiBpZCBmb3IgYSAiQ2FuY2VsIiBidXR0b24gKHZhbHVlIDEpLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgQ0FOQ0VMX0lEID0gMTsKLQotICAgIC8qKgotICAgICAqIEJ1dHRvbiBpZCBmb3IgYSAiWWVzIiBidXR0b24gKHZhbHVlIDIpLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgWUVTX0lEID0gMjsKLQotICAgIC8qKgotICAgICAqIEJ1dHRvbiBpZCBmb3IgYSAiTm8iIGJ1dHRvbiAodmFsdWUgMykuCi0gICAgICovCi0gICAgcHVibGljIGludCBOT19JRCA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBCdXR0b24gaWQgZm9yIGEgIlllcyB0byBBbGwiIGJ1dHRvbiAodmFsdWUgNCkuCi0gICAgICovCi0gICAgcHVibGljIGludCBZRVNfVE9fQUxMX0lEID0gNDsKLQotICAgIC8qKgotICAgICAqIEJ1dHRvbiBpZCBmb3IgYSAiU2tpcCIgYnV0dG9uICh2YWx1ZSA1KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IFNLSVBfSUQgPSA1OwotCi0gICAgLyoqCi0gICAgICogQnV0dG9uIGlkIGZvciBhICJTdG9wIiBidXR0b24gKHZhbHVlIDYpLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgU1RPUF9JRCA9IDY7Ci0KLSAgICAvKioKLSAgICAgKiBCdXR0b24gaWQgZm9yIGFuICJBYm9ydCIgYnV0dG9uICh2YWx1ZSA3KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IEFCT1JUX0lEID0gNzsKLQotICAgIC8qKgotICAgICAqIEJ1dHRvbiBpZCBmb3IgYSAiUmV0cnkiIGJ1dHRvbiAodmFsdWUgOCkuCi0gICAgICovCi0gICAgcHVibGljIGludCBSRVRSWV9JRCA9IDg7Ci0KLSAgICAvKioKLSAgICAgKiBCdXR0b24gaWQgZm9yIGFuICJJZ25vcmUiIGJ1dHRvbiAodmFsdWUgOSkuCi0gICAgICovCi0gICAgcHVibGljIGludCBJR05PUkVfSUQgPSA5OwotCi0gICAgLyoqCi0gICAgICogQnV0dG9uIGlkIGZvciBhICJQcm9jZWVkIiBidXR0b24gKHZhbHVlIDEwKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IFBST0NFRURfSUQgPSAxMDsKLQotICAgIC8qKgotICAgICAqIEJ1dHRvbiBpZCBmb3IgYW4gIk9wZW4iIGJ1dHRvbiAodmFsdWUgMTEpLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgT1BFTl9JRCA9IDExOwotCi0gICAgLyoqCi0gICAgICogQnV0dG9uIGlkIGZvciBhICJDbG9zZSIgYnV0dG9uICh2YWx1ZSAxMikuCi0gICAgICovCi0gICAgcHVibGljIGludCBDTE9TRV9JRCA9IDEyOwotCi0gICAgLyoqCi0gICAgICogQnV0dG9uIGlkIGZvciBhICJEZXRhaWxzIiBidXR0b24gKHZhbHVlIDEzKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IERFVEFJTFNfSUQgPSAxMzsKLQotICAgIC8qKgotICAgICAqIEJ1dHRvbiBpZCBmb3IgYSAiQmFjayIgYnV0dG9uICh2YWx1ZSAxNCkuCi0gICAgICovCi0gICAgcHVibGljIGludCBCQUNLX0lEID0gMTQ7Ci0KLSAgICAvKioKLSAgICAgKiBCdXR0b24gaWQgZm9yIGEgIk5leHQiIGJ1dHRvbiAodmFsdWUgMTUpLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgTkVYVF9JRCA9IDE1OwotCi0gICAgLyoqCi0gICAgICogQnV0dG9uIGlkIGZvciBhICJGaW5pc2giIGJ1dHRvbiAodmFsdWUgMTYpLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgRklOSVNIX0lEID0gMTY7Ci0KLSAgICAvKioKLSAgICAgKiBCdXR0b24gaWQgZm9yIGEgIkhlbHAiIGJ1dHRvbiAodmFsdWUgMTcpLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgSEVMUF9JRCA9IDE3OwotCi0gICAgLyoqCi0gICAgICogQnV0dG9uIGlkIGZvciBhICJTZWxlY3QgQWxsIiBidXR0b24gKHZhbHVlIDE4KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IFNFTEVDVF9BTExfSUQgPSAxODsKLQotICAgIC8qKgotICAgICAqIEJ1dHRvbiBpZCBmb3IgYSAiRGVzZWxlY3QgQWxsIiBidXR0b24gKHZhbHVlIDE5KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IERFU0VMRUNUX0FMTF9JRCA9IDE5OwotCi0gICAgLyoqCi0gICAgICogQnV0dG9uIGlkIGZvciBhICJTZWxlY3QgdHlwZXMiIGJ1dHRvbiAodmFsdWUgMjApLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgU0VMRUNUX1RZUEVTX0lEID0gMjA7Ci0KLSAgICAvKioKLSAgICAgKiBCdXR0b24gaWQgZm9yIGEgIk5vIHRvIEFsbCIgYnV0dG9uICh2YWx1ZSAyMSkuCi0gICAgICovCi0gICAgcHVibGljIGludCBOT19UT19BTExfSUQgPSAyMTsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0aW5nIGJ1dHRvbiBpZCByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlIGJ5IEpGYWNlICh2YWx1ZSAyNTYpLiBKRmFjZQotICAgICAqIGNsYXNzZXMgbWFrZSBpZHMgYnkgYWRkaW5nIHRvIHRoaXMgbnVtYmVyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgSU5URVJOQUxfSUQgPSAyNTY7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydGluZyBidXR0b24gaWQgcmVzZXJ2ZWQgZm9yIHVzZSBieSBjbGllbnRzIG9mIEpGYWNlICh2YWx1ZSAxMDI0KS4KLSAgICAgKiBDbGllbnRzIG9mIEpGYWNlIHNob3VsZCBtYWtlIGlkcyBieSBhZGRpbmcgdG8gdGhpcyBudW1iZXIuCi0gICAgICovCi0gICAgcHVibGljIGludCBDTElFTlRfSUQgPSAxMDI0OwotCi0gICAgLy8gYnV0dG9uIGxhYmVscwotICAgIC8qKgotICAgICAqIFRoZSBsYWJlbCBmb3IgT0sgYnV0dG9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIE9LX0xBQkVMID0gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJvayIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbGFiZWwgZm9yIGNhbmNlbCBidXR0b25zLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgQ0FOQ0VMX0xBQkVMID0gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJjYW5jZWwiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIGxhYmVsIGZvciB5ZXMgYnV0dG9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIFlFU19MQUJFTCA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygieWVzIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBsYWJlbCBmb3Igbm8gYnV0dG9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIE5PX0xBQkVMID0gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJubyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbGFiZWwgZm9yIG5vdCB0byBhbGwgYnV0dG9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIE5PX1RPX0FMTF9MQUJFTCA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygibm90b2FsbCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbGFiZWwgZm9yIHllcyB0byBhbGwgYnV0dG9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIFlFU19UT19BTExfTEFCRUwgPSBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoInllc3RvYWxsIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBsYWJlbCBmb3Igc2tpcCBidXR0b25zLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgU0tJUF9MQUJFTCA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygic2tpcCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbGFiZWwgZm9yIHN0b3AgYnV0dG9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIFNUT1BfTEFCRUwgPSBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoInN0b3AiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIGxhYmVsIGZvciBhYm9ydCBidXR0b25zLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgQUJPUlRfTEFCRUwgPSBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoImFib3J0Iik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBsYWJlbCBmb3IgcmV0cnkgYnV0dG9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIFJFVFJZX0xBQkVMID0gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJyZXRyeSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbGFiZWwgZm9yIGlnbm9yZSBidXR0b25zLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgSUdOT1JFX0xBQkVMID0gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJpZ25vcmUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIGxhYmVsIGZvciBwcm9jZWVkIGJ1dHRvbnMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBQUk9DRUVEX0xBQkVMID0gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJwcm9jZWVkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBsYWJlbCBmb3Igb3BlbiBidXR0b25zLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgT1BFTl9MQUJFTCA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygib3BlbiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbGFiZWwgZm9yIGNsb3NlIGJ1dHRvbnMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBDTE9TRV9MQUJFTCA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiY2xvc2UiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIGxhYmVsIGZvciBzaG93IGRldGFpbHMgYnV0dG9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIFNIT1dfREVUQUlMU19MQUJFTCA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygic2hvd0RldGFpbHMiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIGxhYmVsIGZvciBoaWRlIGRldGFpbHMgYnV0dG9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIEhJREVfREVUQUlMU19MQUJFTCA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiaGlkZURldGFpbHMiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIGxhYmVsIGZvciBiYWNrIGJ1dHRvbnMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBCQUNLX0xBQkVMID0gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJiYWNrQnV0dG9uIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBsYWJlbCBmb3IgbmV4dCBidXR0b25zLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgTkVYVF9MQUJFTCA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygibmV4dEJ1dHRvbiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbGFiZWwgZm9yIGZpbmlzaCBidXR0b25zLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgRklOSVNIX0xBQkVMID0gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJmaW5pc2giKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIGxhYmVsIGZvciBoZWxwIGJ1dHRvbnMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBIRUxQX0xBQkVMID0gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJoZWxwIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIE1hcmdpbnMsIHNwYWNpbmdzLCBhbmQgc2l6ZXMKLSAgICAvKioKLSAgICAgKiBWZXJ0aWNhbCBtYXJnaW4gaW4gZGlhbG9nIHVuaXRzICh2YWx1ZSA3KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IFZFUlRJQ0FMX01BUkdJTiA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBWZXJ0aWNhbCBzcGFjaW5nIGluIGRpYWxvZyB1bml0cyAodmFsdWUgNCkuCi0gICAgICovCi0gICAgcHVibGljIGludCBWRVJUSUNBTF9TUEFDSU5HID0gNDsKLQotICAgIC8qKgotICAgICAqIEhvcml6b250YWwgbWFyZ2luIGluIGRpYWxvZyB1bml0cyAodmFsdWUgNykuCi0gICAgICovCi0gICAgcHVibGljIGludCBIT1JJWk9OVEFMX01BUkdJTiA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBIb3Jpem9udGFsIHNwYWNpbmcgaW4gZGlhbG9nIHVuaXRzICh2YWx1ZSA0KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IEhPUklaT05UQUxfU1BBQ0lORyA9IDQ7Ci0KLSAgICAvKioKLSAgICAgKiBIZWlnaHQgb2YgYnV0dG9uIGJhciBpbiBkaWFsb2cgdW5pdHMgKHZhbHVlIDI1KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IEJVVFRPTl9CQVJfSEVJR0hUID0gMjU7Ci0KLSAgICAvKioKLSAgICAgKiBMZWZ0IG1hcmdpbiBpbiBkaWFsb2cgdW5pdHMgKHZhbHVlIDIwKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IExFRlRfTUFSR0lOID0gMjA7Ci0KLSAgICAvKioKLSAgICAgKiBCdXR0b24gbWFyZ2luIGluIGRpYWxvZyB1bml0cyAodmFsdWUgNCkuCi0gICAgICovCi0gICAgcHVibGljIGludCBCVVRUT05fTUFSR0lOID0gNDsKLQotICAgIC8qKgotICAgICAqIEJ1dHRvbiBoZWlnaHQgaW4gZGlhbG9nIHVuaXRzICh2YWx1ZSAxNCkuCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdGFudCBpcyBubyBsb25nZXIgaW4gdXNlLgotICAgICAqIFRoZSBidXR0b24gaGVpZ2h0cyBhcmUgbm93IGRldGVybWluZWQgYnkgdGhlIGxheW91dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IEJVVFRPTl9IRUlHSFQgPSAxNDsKLQotICAgIC8qKgotICAgICAqIEJ1dHRvbiB3aWR0aCBpbiBkaWFsb2cgdW5pdHMgKHZhbHVlIDYxKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IEJVVFRPTl9XSURUSCA9IDYxOwotCi0gICAgLyoqCi0gICAgICogSW5kZW50IGluIGRpYWxvZyB1bml0cyAodmFsdWUgMjEpLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgSU5ERU5UID0gMjE7Ci0KLSAgICAvKioKLSAgICAgKiBTbWFsbCBpbmRlbnQgaW4gZGlhbG9nIHVuaXRzICh2YWx1ZSA3KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IFNNQUxMX0lOREVOVCA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBFbnRyeSBmaWVsZCB3aWR0aCBpbiBkaWFsb2cgdW5pdHMgKHZhbHVlIDIwMCkuCi0gICAgICovCi0gICAgcHVibGljIGludCBFTlRSWV9GSUVMRF9XSURUSCA9IDIwMDsKLQotICAgIC8qKgotICAgICAqIE1pbmltdW0gd2lkdGggb2YgbWVzc2FnZSBhcmVhIGluIGRpYWxvZyB1bml0cyAodmFsdWUgMzAwKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IE1JTklNVU1fTUVTU0FHRV9BUkVBX1dJRFRIID0gMzAwOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9JRGlhbG9nUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9JRGlhbG9nUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2Q5MTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvSURpYWxvZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIHBhZ2UgaW4gYSBtdWx0aS1wYWdlIGRpYWxvZy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhbG9nUGFnZSB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgdG9wIGxldmVsIGNvbnRyb2wgZm9yIHRoaXMgZGlhbG9nCi0gICAgICogcGFnZSB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbXBsZW1lbnRvcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0Ci0gICAgICogdGhlIGNyZWF0ZWQgY29udHJvbCBjYW4gYmUgYWNjZXNzZWQgdmlhIDxjb2RlPmdldENvbnRyb2w8L2NvZGU+Ci0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlcyB0aGUgU1dUIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcwotICAgICAqIGRpYWxvZyBwYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvcCBsZXZlbCBjb250cm9sIGZvciB0aGlzIGRpYWxvZyBwYWdlLgotICAgICAqIDxwPgotICAgICAqIE1heSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNvbnRyb2wKLSAgICAgKiBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdG9wIGxldmVsIGNvbnRyb2wgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgZGlhbG9nIHBhZ2UncyBkZXNjcmlwdGlvbiB0ZXh0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgdGhpcyBkaWFsb2cgcGFnZSwgCi0gICAgICogIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgZGlhbG9nIHBhZ2UuCi0gICAgICogTWF5IGJlIDxjb2RlPm51bGw8L251bGw+IHRvIGluZGljYXRlIG5vIGVycm9yIG1lc3NhZ2UuCi0gICAgICogPHA+Ci0gICAgICogQW4gZXJyb3IgbWVzc2FnZSBzaG91bGQgZGVzY3JpYmUgc29tZSBlcnJvciBzdGF0ZSwKLSAgICAgKiBhcyBvcHBvc2VkIHRvIGEgbWVzc2FnZSB3aGljaCBtYXkgc2ltcGx5IHByb3ZpZGUgaW5zdHJ1Y3Rpb24KLSAgICAgKiBvciBpbmZvcm1hdGlvbiB0byB0aGUgdXNlci4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgZGlhbG9nIHBhZ2UncyBpbWFnZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGltYWdlIGZvciB0aGlzIGRpYWxvZyBwYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG1lc3NhZ2UgZm9yIHRoaXMgd2l6YXJkIHBhZ2UuCi0gICAgICogPHA+Ci0gICAgICogQSBtZXNzYWdlIHByb3ZpZGVzIGluc3RydWN0aW9uIG9yIGluZm9ybWF0aW9uIHRvIHRoZSAKLSAgICAgKiB1c2VyLCBhcyBvcHBvc2VkIHRvIGFuIGVycm9yIG1lc3NhZ2Ugd2hpY2ggc2hvdWxkIAotICAgICAqIGRlc2NyaWJlIHNvbWUgZXJyb3Igc3RhdGUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBkaWFsb2cgcGFnZSdzIHRpdGxlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdGl0bGUgb2YgdGhpcyBkaWFsb2cgcGFnZSwgCi0gICAgICogIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGF0IGhlbHAgaGFzIGJlZW4gcmVxdWVzdGVkIGZvciB0aGlzIGRpYWxvZyBwYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1IZWxwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgZGlhbG9nIHBhZ2UncyBkZXNjcmlwdGlvbiB0ZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgdGhpcyBkaWFsb2cKLSAgICAgKiAgcGFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgZGlhbG9nIHBhZ2UncyBpbWFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgaW1hZ2UgZm9yIHRoaXMgZGlhbG9nIHBhZ2UsIAotICAgICAqICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBpbWFnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBkaWFsb2cgcGFnZSdzIHRpdGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpdGxlIHRoZSB0aXRsZSBvZiB0aGlzIGRpYWxvZyBwYWdlLCAKLSAgICAgKiAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoaXMgZGlhbG9nIHBhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmlzaWJsZSA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoaXMgcGFnZSB2aXNpYmxlLAotICAgICAqICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGhpZGUgaXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0lEaWFsb2dTZXR0aW5ncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9JRGlhbG9nU2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiMmU1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0lEaWFsb2dTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdG8gYSBzdG9yYWdlIG1lY2hhbmlzbSBmb3IgbWFraW5nIGRpYWxvZyBzZXR0aW5ncyBwZXJzaXN0ZW50LgotICogVGhlIHN0b3JlIG1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIGtleS92YWx1ZSBwYWlycy4gVGhlIGtleXMgbXVzdCBiZSBzdHJpbmdzCi0gKiBhbmQgdGhlIHZhbHVlcyBjYW4gYmUgZWl0aGVyLCBzdHJpbmdzIG9yIGFycmF5IG9mIHN0cmluZ3MuIENvbnZlbmllbmNlIEFQSSB0bwotICogY29udmVydCBwcmltaXRpdmUgdHlwZXMgdG8gc3RyaW5ncyBpcyBwcm92aWRlZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhbG9nU2V0dGluZ3MgewotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBzZWN0aW9uIGluIHRoZSByZWNlaXZlciBhbmQgcmV0dXJuIGl0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmV3IHNlY3Rpb24KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgc2VjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBJRGlhbG9nU2V0dGluZ3MgYWRkTmV3U2VjdGlvbihTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBzZWN0aW9uIGluIHRoZSByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIHNlY3Rpb24gdG8gYmUgYWRkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTZWN0aW9uKElEaWFsb2dTZXR0aW5ncyBzZWN0aW9uKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgaW4gdGhpcyBkaWFsb2cgc2V0dGluZ3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXQoU3RyaW5nIGtleSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSwgYW4gYXJyYXkgb2Ygc3RyaW5ncywgb2YgdGhlIGdpdmVuIGtleSBpbiB0aGlzIGRpYWxvZwotICAgICAqIHNldHRpbmdzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXJyYXkoU3RyaW5nIGtleSk7Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBBUEkuIENvbnZlcnQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgaW4gdGhpcyBkaWFsb2cKLSAgICAgKiBzZXR0aW5ncyB0byBhIGJvb2xlYW4gYW5kIHJldHVybiBpdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5Ci0gICAgICogQHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXkpOwotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgQVBJLiBDb252ZXJ0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IGluIHRoaXMgZGlhbG9nCi0gICAgICogc2V0dGluZ3MgdG8gYSBkb3VibGUgYW5kIHJldHVybiBpdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgY292ZXJ0ZWQgdG8gZG91YmxlLCBvciB0aHJvd3MKLSAgICAgKiAgICAgICAgIDxjb2RlPk51bWJlckZvcm1hdEV4Y2VwdGlvbjwvY29kZT4gaWYgbm9uZQotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb250YWluIGEgcGFyc2FibGUgbnVtYmVyLgotICAgICAqIEBzZWUgamF2YS5sYW5nLkRvdWJsZSN2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoU3RyaW5nIGtleSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIEFQSS4gQ29udmVydCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGtleSBpbiB0aGlzIGRpYWxvZwotICAgICAqIHNldHRpbmdzIHRvIGEgZmxvYXQgYW5kIHJldHVybiBpdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgY292ZXJ0ZWQgdG8gZmxvYXQsIG9yIHRocm93cwotICAgICAqICAgICAgICAgPGNvZGU+TnVtYmVyRm9ybWF0RXhjZXB0aW9uPC9jb2RlPiBpZiBub25lCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgc3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnRhaW4gYSBwYXJzYWJsZSBudW1iZXIuCi0gICAgICogQHNlZSBqYXZhLmxhbmcuRmxvYXQjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChTdHJpbmcga2V5KSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgQVBJLiBDb252ZXJ0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IGluIHRoaXMgZGlhbG9nCi0gICAgICogc2V0dGluZ3MgdG8gYSBpbnQgYW5kIHJldHVybiBpdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgY292ZXJ0ZWQgdG8gaW50LCBvciB0aHJvd3MKLSAgICAgKiAgICAgICAgIDxjb2RlPk51bWJlckZvcm1hdEV4Y2VwdGlvbjwvY29kZT4gaWYgbm9uZQotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb250YWluIGEgcGFyc2FibGUgbnVtYmVyLgotICAgICAqIEBzZWUgamF2YS5sYW5nLkludGVnZXIjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBrZXkpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBBUEkuIENvbnZlcnQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgaW4gdGhpcyBkaWFsb2cKLSAgICAgKiBzZXR0aW5ncyB0byBhIGxvbmcgYW5kIHJldHVybiBpdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgY292ZXJ0ZWQgdG8gbG9uZywgb3IgdGhyb3dzCi0gICAgICogICAgICAgICA8Y29kZT5OdW1iZXJGb3JtYXRFeGNlcHRpb248L2NvZGU+IGlmIG5vbmUKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBzdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udGFpbiBhIHBhcnNhYmxlIG51bWJlci4KLSAgICAgKiBAc2VlIGphdmEubGFuZy5Mb25nI3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBrZXkpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJRGlhbG9nU2V0dGluZ3MgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhpcyBkaWFsb2cgc2V0dGluZ3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlY3Rpb25OYW1lCi0gICAgICogICAgICAgICAgICB0aGUga2V5Ci0gICAgICogQHJldHVybiBJRGlhbG9nU2V0dGluZ3MgKHRoZSBzZWN0aW9uKSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBJRGlhbG9nU2V0dGluZ3MgZ2V0U2VjdGlvbihTdHJpbmcgc2VjdGlvbk5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgdGhlIHNlY3Rpb25zIGluIHRoaXMgZGlhbG9nIHNldHRpbmdzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNlY3Rpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgSURpYWxvZ1NldHRpbmdzW10gZ2V0U2VjdGlvbnMoKTsKLQotICAgIC8qKgotICAgICAqIExvYWQgYSBkaWFsb2cgc2V0dGluZ3MgZnJvbSBhIHN0cmVhbSBhbmQgZmlsbCB0aGUgcmVjZWl2ZXIgd2l0aCBpdHMKLSAgICAgKiBjb250ZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZWFkZXIKLSAgICAgKiAgICAgICAgICAgIGEgUmVhZGVyIHNwZWNpZnlpbmcgdGhlIHN0cmVhbSB3aGVyZSB0aGUgc2V0dGluZ3MgYXJlIHJlYWQKLSAgICAgKiAgICAgICAgICAgIGZyb20uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxvYWQoUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogTG9hZCBhIGRpYWxvZyBzZXR0aW5ncyBmcm9tIGEgZmlsZSBhbmQgZmlsbCB0aGUgcmVjZWl2ZXIgd2l0aCBpdHMKLSAgICAgKiBjb250ZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlIHNldHRpbmdzIGFyZSByZWFkIGZyb20uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxvYWQoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBwYWlyIDxjb2RlPmtleS92YWx1ZTwvY29kZT4gdG8gdGhpcyBkaWFsb2cgc2V0dGluZ3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleS4KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIDxjb2RlPmtleTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgU3RyaW5nW10gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgQVBJLiBDb252ZXJ0cyB0aGUgZG91YmxlIDxjb2RlPnZhbHVlPC9jb2RlPiB0byBhIHN0cmluZyBhbmQKLSAgICAgKiBhZGRzIHRoZSBwYWlyIDxjb2RlPmtleS92YWx1ZTwvY29kZT4gdG8gdGhpcyBkaWFsb2cgc2V0dGluZ3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleS4KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIDxjb2RlPmtleTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgZG91YmxlIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIEFQSS4gQ29udmVydHMgdGhlIGZsb2F0IDxjb2RlPnZhbHVlPC9jb2RlPiB0byBhIHN0cmluZyBhbmQKLSAgICAgKiBhZGRzIHRoZSBwYWlyIDxjb2RlPmtleS92YWx1ZTwvY29kZT4gdG8gdGhpcyBkaWFsb2cgc2V0dGluZ3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleS4KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIDxjb2RlPmtleTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgQVBJLiBDb252ZXJ0cyB0aGUgaW50IDxjb2RlPnZhbHVlPC9jb2RlPiB0byBhIHN0cmluZyBhbmQKLSAgICAgKiBhZGRzIHRoZSBwYWlyIDxjb2RlPmtleS92YWx1ZTwvY29kZT4gdG8gdGhpcyBkaWFsb2cgc2V0dGluZ3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleS4KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIDxjb2RlPmtleTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgaW50IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIEFQSS4gQ29udmVydHMgdGhlIGxvbmcgPGNvZGU+dmFsdWU8L2NvZGU+IHRvIGEgc3RyaW5nIGFuZAotICAgICAqIGFkZHMgdGhlIHBhaXIgPGNvZGU+a2V5L3ZhbHVlPC9jb2RlPiB0byB0aGlzIGRpYWxvZyBzZXR0aW5ncy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5LgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgPGNvZGU+a2V5PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcga2V5LCBsb25nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHBhaXIgPGNvZGU+a2V5L3ZhbHVlPC9jb2RlPiB0byB0aGlzIGRpYWxvZyBzZXR0aW5ncy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5LgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgPGNvZGU+a2V5PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgQVBJLiBDb252ZXJ0cyB0aGUgYm9vbGVhbiA8Y29kZT52YWx1ZTwvY29kZT4gdG8gYSBzdHJpbmcKLSAgICAgKiBhbmQgYWRkcyB0aGUgcGFpciA8Y29kZT5rZXkvdmFsdWU8L2NvZGU+IHRvIHRoaXMgZGlhbG9nIHNldHRpbmdzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkuCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSA8Y29kZT5rZXk8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0KFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2F2ZSBhIGRpYWxvZyBzZXR0aW5ncyB0byBhIHN0cmVhbQotICAgICAqIAotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiAgICAgICAgICAgIGEgV3JpdGVyIHNwZWNpZnlpbmcgdGhlIHN0cmVhbSB0aGUgc2V0dGluZ3MgYXJlIHdyaXR0ZW4gaW4uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmUoV3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2F2ZSBhIGRpYWxvZyBzZXR0aW5ncyB0byBhIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGVOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgc2V0dGluZ3MgYXJlIHdyaXR0ZW4gaW4uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0lJbnB1dFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9JSW5wdXRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0NTRlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0lJbnB1dFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3M7Ci0KLS8qKgotICogVGhlIElJbnB1dFZhbGlkYXRvciBpcyB0aGUgaW50ZXJmYWNlIGZvciBzaW1wbGUgdmFsaWRhdG9ycy4gCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSW5wdXREaWFsb2cKLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5wdXRWYWxpZGF0b3IgewotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gc3RyaW5nLiAgUmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICAgKiBpZiB0aGUgbmV3IHRleHQgaXMgaW52YWxpZC4gIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUKLSAgICAgKiBpcyBubyBlcnJvci4gIE5vdGUgdGhhdCB0aGUgZW1wdHkgc3RyaW5nIGlzIG5vdCB0cmVhdGVkIHRoZSBzYW1lCi0gICAgICogYXMgPGNvZGU+bnVsbDwvY29kZT47IGl0IGluZGljYXRlcyBhbiBlcnJvciBzdGF0ZSBidXQgd2l0aCBubyBtZXNzYWdlCi0gICAgICogdG8gZGlzcGxheS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3VGV4dCB0aGUgdGV4dCB0byBjaGVjayBmb3IgdmFsaWRpdHkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9JTWVzc2FnZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0lNZXNzYWdlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmZTIzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0lNZXNzYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzOwotCi0vKioKLSAqIE1pbmltYWwgaW50ZXJmYWNlIHRvIGEgbWVzc2FnZSBwcm92aWRlci4gVXNlZCBmb3IgZGlhbG9nIHBhZ2VzIHdoaWNoIGNhbgotICogcHJvdmlkZSBhIG1lc3NhZ2Ugd2l0aCBhbiBpY29uLgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2VQcm92aWRlciB7Ci0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgZm9yIGEgcmVndWxhciBtZXNzYWdlICh2YWx1ZSAwKS4KLSAgICAgKiA8cD4KLSAgICAgKiBUeXBpY2FsbHkgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gd2l0aG91dCBhbgotICAgICAqIGljb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5PTkUgPSAwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgZm9yIGFuIGluZm8gbWVzc2FnZSAodmFsdWUgMSkuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5GT1JNQVRJT04gPSAxOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgZm9yIGEgd2FybmluZyBtZXNzYWdlICh2YWx1ZSAyKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBXQVJOSU5HID0gMjsKLQotICAgIC8qKgotICAgICAqIENvbnN0YW50IGZvciBhbiBlcnJvciBtZXNzYWdlICh2YWx1ZSAzKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJPUiA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG1lc3NhZ2UgZm9yIHRoaXMgbWVzc2FnZSBwcm92aWRlci4KLSAgICAgKiA8cD4KLSAgICAgKiBBIG1lc3NhZ2UgcHJvdmlkZXMgaW5zdHJ1Y3Rpb24gb3IgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZSBtZXNzYWdlIGlzIGEgYW4gaW5mb3JtYXRpb24gbWVzc2FnZSwgYQotICAgICAqIHdhcm5pbmcgbWVzc2FnZSwgb3IgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIG9uZSBvZiA8Y29kZT5OT05FPC9jb2RlPiw8Y29kZT5JTkZPUk1BVElPTjwvY29kZT4sCi0gICAgICogPGNvZGU+V0FSTklORzwvY29kZT4sIG9yIDxjb2RlPkVSUk9SPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWVzc2FnZSB0eXBlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNZXNzYWdlVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9JUGFnZUNoYW5nZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0lQYWdlQ2hhbmdlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2M2RlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0lQYWdlQ2hhbmdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzOwotCi0vKioKLSAqIE1pbmltYWwgaW50ZXJmYWNlIHRvIGEgcGFnZSBjaGFuZ2UgcHJvdmlkZXIuIFVzZWQgZm9yIGRpYWxvZ3Mgd2hpY2ggY2FuCi0gKiBzd2l0Y2ggYmV0d2VlbiBtdWx0aXBsZSBwYWdlcy4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQYWdlQ2hhbmdlUHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYWdlIGluIHRoZSBkaWFsb2cuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VsZWN0ZWQgcGFnZSBpbiB0aGUgZGlhbG9nIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMKLQkgKiAgICAgICAgIHNlbGVjdGVkLiBUaGUgdHlwZSBtYXkgYmUgZG9tYWluIHNwZWNpZmljLiBJbiAKLQkgKiAgICAgICAgIHRoZSBKRmFjZSBwcm92aWRlZCBkaWFsb2dzIHRoaXMgd2lsbCBiZSBhbiBpbnN0YW5jZSBvZiAKLQkgKiAgICAgICAgIDxjb2RlPklEaWFsb2dQYWdlPC9jb2RlPi4gCi0JICovCi0JT2JqZWN0IGdldFNlbGVjdGVkUGFnZSgpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIGZvciBwYWdlIGNoYW5nZXMgaW4gdGhpcyBwYWdlIGNoYW5nZSBwcm92aWRlci4gSGFzIG5vCi0JICogZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIHBhZ2UgY2hhbmdlZCBsaXN0ZW5lcgotCSAqLwotCXZvaWQgYWRkUGFnZUNoYW5nZWRMaXN0ZW5lcihJUGFnZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBwYWdlIGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgcGFnZSBjaGFuZ2UgcHJvdmlkZXIuCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIHBhZ2UgY2hhbmdlZCBsaXN0ZW5lcgotCSAqLwotCXZvaWQgcmVtb3ZlUGFnZUNoYW5nZWRMaXN0ZW5lcihJUGFnZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvSVBhZ2VDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvSVBhZ2VDaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjYjE0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0lQYWdlQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9nczsKLQotLyoqCi0gKiBBIGxpc3RlbmVyIHdoaWNoIGlzIG5vdGlmaWVkIHdoZW4gdGhlIGN1cnJlbnQgcGFnZSBvZiB0aGUgbXVsdGktcGFnZSBkaWFsb2cKLSAqIGlzIGNoYW5nZWQuCi0gKiAKLSAqIEBzZWUgSVBhZ2VDaGFuZ2VQcm92aWRlcgotICogQHNlZSBQYWdlQ2hhbmdlZEV2ZW50Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJUGFnZUNoYW5nZWRMaXN0ZW5lciB7Ci0JLyoqCi0JICogTm90aWZpZXMgdGhhdCB0aGUgc2VsZWN0ZWQgcGFnZSBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIGV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYWdlQ2hhbmdlZChQYWdlQ2hhbmdlZEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvSWNvbkFuZE1lc3NhZ2VEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvSWNvbkFuZE1lc3NhZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwNWRiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0ljb25BbmRNZXNzYWdlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGUgSWNvbkFuZE1lc3NhZ2VEaWFsb2cgaXMgdGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgZGlhbG9ncyB0aGF0IGhhdmUgYW4KLSAqIGljb24gYW5kIGEgbWVzc2FnZSBhcyB0aGUgZmlyc3QgdHdvIHdpZGdldHMuIEluIHRoaXMgZGlhbG9nIHRoZSBpY29uIGFuZAotICogbWVzc2FnZSBhcmUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoZSBzaGVsbCBpbiBvcmRlciB0aGF0IHRoZXkgY2FuIGJlIHJlYWQgYnkKLSAqIGFjY2Vzc2liaWxpdHkgdG9vbHMgbW9yZSBlYXNpbHkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJY29uQW5kTWVzc2FnZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0gICAgLyoqCi0gICAgICogTWVzc2FnZSAoYSBsb2NhbGl6ZWQgc3RyaW5nKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBNZXNzYWdlIGxhYmVsIGlzIHRoZSBsYWJlbCB0aGUgbWVzc2FnZSBpcyBzaG93biBvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGFiZWwgbWVzc2FnZUxhYmVsOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBsYWJlbCBmb3IgdGhlIGltYWdlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMYWJlbCBpbWFnZUxhYmVsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEljb25BbmRNZXNzYWdlRGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gY3JlYXRlIGEgdG9wLWxldmVsCi0gICAgICogICAgICAgICAgICBzaGVsbAotICAgICAqLwotICAgIHB1YmxpYyBJY29uQW5kTWVzc2FnZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBhcmVhIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2hvd24gaW4uCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSBUaGUgY29tcG9zaXRlIHRvIHBhcmVudCBmcm9tLgotICAgICAqIEByZXR1cm4gQ29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZU1lc3NhZ2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgLy8gY3JlYXRlIGNvbXBvc2l0ZQotICAgICAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZSgpOwotICAgICAgICBpZiAoaW1hZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgaW1hZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLSAgICAgICAgICAgIGltYWdlLnNldEJhY2tncm91bmQoaW1hZ2VMYWJlbC5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICAgICAgaW1hZ2VMYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0gICAgICAgICAgICBhZGRBY2Nlc3NpYmxlTGlzdGVuZXJzKGltYWdlTGFiZWwsaW1hZ2UpOwotICAgICAgICAgICAgaW1hZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNyZWF0ZSBtZXNzYWdlCi0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIGdldE1lc3NhZ2VMYWJlbFN0eWxlKCkpOwotICAgICAgICAgICAgbWVzc2FnZUxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0gICAgICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgICAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICAgICAgICBkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuTUlOSU1VTV9NRVNTQUdFX0FSRUFfV0lEVEgpOwotICAgICAgICAgICAgbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEFjY2Vzc2libGVNZXNzYWdlRm9yKEltYWdlIGltYWdlKXsKLSAgICAJaWYoaW1hZ2UuZXF1YWxzKGdldEVycm9ySW1hZ2UoKSkpCi0JCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJlcnJvciIpOy8vJE5PTi1OTFMtMSQKLSAgICAJCi0gICAgCWlmKGltYWdlLmVxdWFscyhnZXRXYXJuaW5nSW1hZ2UoKSkpCi0JCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJ3YXJuaW5nIik7Ly8kTk9OLU5MUy0xJAotICAgIAkKLSAgICAJaWYoaW1hZ2UuZXF1YWxzKGdldEluZm9JbWFnZSgpKSkKLQkJCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoImluZm8iKTsvLyROT04tTkxTLTEkCi0gICAgCQotICAgIAlpZihpbWFnZS5lcXVhbHMoZ2V0UXVlc3Rpb25JbWFnZSgpKSkKLQkJCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoInF1ZXN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJCi0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgYW4gYWNjZXNzaWJsZSBsaXN0ZW5lciB0byB0aGUgbGFiZWwgaWYgaXQgY2FuIGJlIAotICAgICAqIGluZmVycmVkIGZyb20gdGhlIGltYWdlLgotICAgICAqIEBwYXJhbSBsYWJlbAotICAgICAqIEBwYXJhbSBpbWFnZQotICAgICAqLwotCXByaXZhdGUgdm9pZCBhZGRBY2Nlc3NpYmxlTGlzdGVuZXJzKExhYmVsIGxhYmVsLCBmaW5hbCBJbWFnZSBpbWFnZSkgewotCQlsYWJlbC5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCW5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpewotICAgIAkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBldmVudCkgewotICAgIAkJCQkJZmluYWwgU3RyaW5nIGFjY2Vzc2libGVNZXNzYWdlID0gZ2V0QWNjZXNzaWJsZU1lc3NhZ2VGb3IoaW1hZ2UpOwotICAgIAkJCQkJaWYoYWNjZXNzaWJsZU1lc3NhZ2UgPT0gbnVsbCkKLSAgICAJCQkJCQlyZXR1cm47ICAgIAkJCQkJCi0gICAgCQkJCQlldmVudC5yZXN1bHQgPSBhY2Nlc3NpYmxlTWVzc2FnZTsKLSAgICAJCQkJfQotICAgIAkJCX0KLQkJKTsKLQl9Ci0KLQkvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBmb3IgdGhlIG1lc3NhZ2UgbGFiZWwuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3R5bGUgZm9yIHRoZSBtZXNzYWdlIGxhYmVsCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0TWVzc2FnZUxhYmVsU3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBTV1QuV1JBUDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgRGlhbG9nLmNyZWF0ZUJ1dHRvbkJhcigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIGxheW91dCB3aXRoIHNwYWNpbmcgYW5kIG1hcmdpbnMgYXBwcm9wcmlhdGUgZm9yIHRoZSBmb250Ci0gICAgICAgIC8vIHNpemUuCi0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAwOyAvLyB0aGlzIGlzIGluY3JlbWVudGVkIGJ5IGNyZWF0ZUJ1dHRvbgotICAgICAgICBsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLSAgICAgICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIC8vIEFkZCB0aGUgYnV0dG9ucyB0byB0aGUgYnV0dG9uIGJhci4KLSAgICAgICAgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihjb21wb3NpdGUpOwotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGltYWdlIHRvIGRpc3BsYXkgYmVzaWRlIHRoZSBtZXNzYWdlIGluIHRoaXMgZGlhbG9nLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSB0byBkaXNwbGF5IGJlc2lkZSB0aGUgbWVzc2FnZQotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSW1hZ2UgZ2V0SW1hZ2UoKTsKLQotICAgIC8qCi0gICAgICogQHNlZSBEaWFsb2cuY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlKQotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgZGlhbG9nIHVuaXRzCi0gICAgICAgIGluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTikgKiAzIC8gMjsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLSAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpICogMjsKLSAgICAgICAgbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotICAgICAgICBwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgY3JlYXRlRGlhbG9nQW5kQnV0dG9uQXJlYShwYXJlbnQpOwotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgZGlhbG9nIGFyZWEgYW5kIHRoZSBidXR0b24gYmFyIGZvciB0aGUgcmVjZWl2ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZURpYWxvZ0FuZEJ1dHRvbkFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBjcmVhdGUgdGhlIGRpYWxvZyBhcmVhIGFuZCBidXR0b24gYmFyCi0gICAgICAgIGRpYWxvZ0FyZWEgPSBjcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICAgIGJ1dHRvbkJhciA9IGNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOwotICAgICAgICAvL0FwcGx5IHRvIHRoZSBwYXJlbnQgc28gdGhhdCB0aGUgbWVzc2FnZSBnZXRzIGl0IHRvby4KLSAgICAgICAgYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSA8Y29kZT5JbWFnZTwvY29kZT4gdG8gYmUgdXNlZCB3aGVuIAotICAgICAqIGRpc3BsYXlpbmcgYW4gZXJyb3IuIAotICAgICAqIAotICAgICAqIEByZXR1cm4gaW1hZ2UgIHRoZSBlcnJvciBpbWFnZQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRFcnJvckltYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0U1dUSW1hZ2UoU1dULklDT05fRVJST1IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgPGNvZGU+SW1hZ2U8L2NvZGU+IHRvIGJlIHVzZWQgd2hlbiAKLSAgICAgKiBkaXNwbGF5aW5nIGEgd2FybmluZy4gCi0gICAgICogCi0gICAgICogQHJldHVybiBpbWFnZSAgdGhlIHdhcm5pbmcgaW1hZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0V2FybmluZ0ltYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0U1dUSW1hZ2UoU1dULklDT05fV0FSTklORyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSA8Y29kZT5JbWFnZTwvY29kZT4gdG8gYmUgdXNlZCB3aGVuIAotICAgICAqIGRpc3BsYXlpbmcgaW5mb3JtYXRpb24uIAotICAgICAqIAotICAgICAqIEByZXR1cm4gaW1hZ2UgIHRoZSBpbmZvcm1hdGlvbiBpbWFnZQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbmZvSW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTV1RJbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSA8Y29kZT5JbWFnZTwvY29kZT4gdG8gYmUgdXNlZCB3aGVuIAotICAgICAqIGRpc3BsYXlpbmcgYSBxdWVzdGlvbi4gCi0gICAgICogCi0gICAgICogQHJldHVybiBpbWFnZSAgdGhlIHF1ZXN0aW9uIGltYWdlCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldFF1ZXN0aW9uSW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTV1RJbWFnZShTV1QuSUNPTl9RVUVTVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFuIDxjb2RlPkltYWdlPC9jb2RlPiBmcm9tIHRoZSBwcm92aWRlIFNXVCBpbWFnZQotICAgICAqIGNvbnN0YW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUlEIHRoZSBTV1QgaW1hZ2UgY29uc3RhbnQKLSAgICAgKiBAcmV0dXJuIGltYWdlICB0aGUgaW1hZ2UKLSAgICAgKi8KLSAgICBwcml2YXRlIEltYWdlIGdldFNXVEltYWdlKGZpbmFsIGludCBpbWFnZUlEKSB7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLSAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5OwotICAgICAgICBpZiAoc2hlbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgc2hlbGwgPSBnZXRQYXJlbnRTaGVsbCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzaGVsbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSW1hZ2VbXSBpbWFnZSA9IG5ldyBJbWFnZVsxXTsKLSAgICAgICAgZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2VbMF0gPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKGltYWdlSUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gaW1hZ2VbMF07Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvSW5wdXREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvSW5wdXREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1YTJlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL0lucHV0RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgc2ltcGxlIGlucHV0IGRpYWxvZyBmb3Igc29saWNpdGluZyBhbiBpbnB1dCBzdHJpbmcgZnJvbSB0aGUgdXNlci4KLSAqIDxwPgotICogVGhpcyBjb25jcmV0ZSBkaWFsb2cgY2xhc3MgY2FuIGJlIGluc3RhbnRpYXRlZCBhcyBpcywgb3IgZnVydGhlciBzdWJjbGFzc2VkIGFzCi0gKiByZXF1aXJlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIElucHV0RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLSAgICAvKioKLSAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBpbnB1dCB2YWx1ZTsgdGhlIGVtcHR5IHN0cmluZyBieSBkZWZhdWx0LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlID0gIiI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIGlucHV0IHZhbGlkYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElJbnB1dFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBPayBidXR0b24gd2lkZ2V0LgotICAgICAqLwotICAgIHByaXZhdGUgQnV0dG9uIG9rQnV0dG9uOwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgdGV4dCB3aWRnZXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUZXh0IHRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBtZXNzYWdlIGxhYmVsIHdpZGdldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRleHQgZXJyb3JNZXNzYWdlVGV4dDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5wdXQgZGlhbG9nIHdpdGggT0sgYW5kIENhbmNlbCBidXR0b25zLiBOb3RlIHRoYXQgdGhlIGRpYWxvZwotICAgICAqIHdpbGwgaGF2ZSBubyB2aXN1YWwgcmVwcmVzZW50YXRpb24gKG5vIHdpZGdldHMpIHVudGlsIGl0IGlzIHRvbGQgdG8gb3Blbi4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIDxjb2RlPm9wZW48L2NvZGU+IG1ldGhvZCBibG9ja3MgZm9yIGlucHV0IGRpYWxvZ3MuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gY3JlYXRlIGEgdG9wLWxldmVsCi0gICAgICogICAgICAgICAgICBzaGVsbAotICAgICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgICAqICAgICAgICAgICAgdGhlIGRpYWxvZyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSBkaWFsb2dNZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgZGlhbG9nIG1lc3NhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAcGFyYW0gaW5pdGlhbFZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBpbnB1dCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqICAgICAgICAgICAgKGVxdWl2YWxlbnQgdG8gdGhlIGVtcHR5IHN0cmluZykKLSAgICAgKiBAcGFyYW0gdmFsaWRhdG9yCi0gICAgICogICAgICAgICAgICBhbiBpbnB1dCB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICAgICAgICAgIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBTdHJpbmcgaW5pdGlhbFZhbHVlLCBJSW5wdXRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICAgICAgdGhpcy50aXRsZSA9IGRpYWxvZ1RpdGxlOwotICAgICAgICBtZXNzYWdlID0gZGlhbG9nTWVzc2FnZTsKLSAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgdmFsdWUgPSAiIjsvLyROT04tTkxTLTEkCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZhbHVlID0gaW5pdGlhbFZhbHVlOwotICAgICAgICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotICAgICAgICBpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotICAgICAgICAgICAgdmFsdWUgPSB0ZXh0LmdldFRleHQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbHVlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHNoZWxsLnNldFRleHQodGl0bGUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMgYnkgZGVmYXVsdAotICAgICAgICBva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0gICAgICAgIC8vZG8gdGhpcyBoZXJlIGJlY2F1c2Ugc2V0dGluZyB0aGUgdGV4dCB3aWxsIHNldCBlbmFibGVtZW50IG9uIHRoZSBvawotICAgICAgICAvLyBidXR0b24KLSAgICAgICAgdGV4dC5zZXRGb2N1cygpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGV4dC5zZXRUZXh0KHZhbHVlKTsKLSAgICAgICAgICAgIHRleHQuc2VsZWN0QWxsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gY3JlYXRlIGNvbXBvc2l0ZQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgICAgICAvLyBjcmVhdGUgbWVzc2FnZQotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICAgICAgICAgIGxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0gICAgICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotICAgICAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLk1JTklNVU1fTUVTU0FHRV9BUkVBX1dJRFRIKTsKLSAgICAgICAgICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgICAgICBsYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICB9Ci0gICAgICAgIHRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgICAgICB0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlSW5wdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGVycm9yTWVzc2FnZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBlcnJvck1lc3NhZ2VUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgICAgIGVycm9yTWVzc2FnZVRleHQuc2V0QmFja2dyb3VuZChlcnJvck1lc3NhZ2VUZXh0LmdldERpc3BsYXkoKQotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLQotICAgICAgICBhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGxhYmVsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgbGFiZWwKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0RXJyb3JNZXNzYWdlKFN0cmluZykgaW5zdGVhZAotICAgICAqLwotICAgIHByb3RlY3RlZCBMYWJlbCBnZXRFcnJvck1lc3NhZ2VMYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2sgYnV0dG9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9rIGJ1dHRvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBCdXR0b24gZ2V0T2tCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBva0J1dHRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGFyZWEuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGV4dCBhcmVhCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRleHQgZ2V0VGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsaWRhdG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbGlkYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBJSW5wdXRWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB0eXBlZCBpbnRvIHRoaXMgaW5wdXQgZGlhbG9nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGlucHV0IHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGlucHV0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBkZWxlZ2F0ZXMgdGhlIHJlcXVlc3QKLSAgICAgKiB0byB0aGUgc3VwcGxpZWQgaW5wdXQgdmFsaWRhdG9yIG9iamVjdDsgaWYgaXQgZmluZHMgdGhlIGlucHV0IGludmFsaWQsCi0gICAgICogdGhlIGVycm9yIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGluIHRoZSBkaWFsb2cncyBtZXNzYWdlIGxpbmUuIFRoaXMgaG9vawotICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHRleHQgY2hhbmdlcyBpbiB0aGUgaW5wdXQgZmllbGQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSW5wdXQoKSB7Ci0gICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgICAgICBpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHZhbGlkYXRvci5pc1ZhbGlkKHRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBCdWcgMTYyNTY6IGltcG9ydGFudCBub3QgdG8gdHJlYXQgIiIgKGJsYW5rIGVycm9yKSB0aGUgc2FtZSBhcyBudWxsCi0gICAgICAgIC8vIChubyBlcnJvcikKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgICogSWYgbm90IDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgT0sgYnV0dG9uIGlzIGRpc2FibGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhcgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotICAgICAgICBlcnJvck1lc3NhZ2VUZXh0LnNldFRleHQoZXJyb3JNZXNzYWdlID09IG51bGwgPyAiIiA6IGVycm9yTWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZXJyb3JNZXNzYWdlVGV4dC5nZXRQYXJlbnQoKS51cGRhdGUoKTsKLSAgICAgICAgLy8gQWNjZXNzIHRoZSBvayBidXR0b24gYnkgaWQsIGluIGNhc2UgY2xpZW50cyBoYXZlIG92ZXJyaWRkZW4gYnV0dG9uIGNyZWF0aW9uLgotICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzY0MwotICAgICAgICBDb250cm9sIGJ1dHRvbiA9IGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLSAgICAgICAgaWYgKGJ1dHRvbiAhPSBudWxsKQotICAgICAgICAJYnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9NZXNzYWdlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL01lc3NhZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5YWZiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL01lc3NhZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIGRpYWxvZyBmb3Igc2hvd2luZyBtZXNzYWdlcyB0byB0aGUgdXNlci4KLSAqIDxwPgotICogVGhpcyBjb25jcmV0ZSBkaWFsb2cgY2xhc3MgY2FuIGJlIGluc3RhbnRpYXRlZCBhcyBpcywgb3IgZnVydGhlciBzdWJjbGFzc2VkCi0gKiBhcyByZXF1aXJlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEaWFsb2cgZXh0ZW5kcyBJY29uQW5kTWVzc2FnZURpYWxvZyB7Ci0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgZm9yIGEgZGlhbG9nIHdpdGggbm8gaW1hZ2UgKHZhbHVlIDApLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5PTkUgPSAwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgZm9yIGEgZGlhbG9nIHdpdGggYW4gZXJyb3IgaW1hZ2UgKHZhbHVlIDEpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SID0gMTsKLQotICAgIC8qKgotICAgICAqIENvbnN0YW50IGZvciBhIGRpYWxvZyB3aXRoIGFuIGluZm8gaW1hZ2UgKHZhbHVlIDIpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElORk9STUFUSU9OID0gMjsKLQotICAgIC8qKgotICAgICAqIENvbnN0YW50IGZvciBhIGRpYWxvZyB3aXRoIGEgcXVlc3Rpb24gaW1hZ2UgKHZhbHVlIDMpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFFVRVNUSU9OID0gMzsKLQotICAgIC8qKgotICAgICAqIENvbnN0YW50IGZvciBhIGRpYWxvZyB3aXRoIGEgd2FybmluZyBpbWFnZSAodmFsdWUgNCkuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV0FSTklORyA9IDQ7Ci0KLSAgICAvKioKLSAgICAgKiBMYWJlbHMgZm9yIGJ1dHRvbnMgaW4gdGhlIGJ1dHRvbiBiYXIgKGxvY2FsaXplZCBzdHJpbmdzKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGJ1dHRvbkxhYmVsczsKLQotICAgIC8qKgotICAgICAqIFRoZSBidXR0b25zLiBQYXJhbGxlbHMgPGNvZGU+YnV0dG9uTGFiZWxzPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIEJ1dHRvbltdIGJ1dHRvbnM7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRleCBpbnRvIDxjb2RlPmJ1dHRvbkxhYmVsczwvY29kZT4gb2YgdGhlIGRlZmF1bHQgYnV0dG9uLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGRlZmF1bHRCdXR0b25JbmRleDsKLQotICAgIC8qKgotICAgICAqIERpYWxvZyB0aXRsZSAoYSBsb2NhbGl6ZWQgc3RyaW5nKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotICAgIC8qKgotICAgICAqIERpYWxvZyB0aXRsZSBpbWFnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEltYWdlIHRpdGxlSW1hZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBJbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEltYWdlIGltYWdlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXN0b20gZGlhbG9nIGFyZWEuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb250cm9sIGN1c3RvbUFyZWE7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBtZXNzYWdlIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotICAgICAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0gICAgICogPHA+Ci0gICAgICogVGhlIGxhYmVscyBvZiB0aGUgYnV0dG9ucyB0byBhcHBlYXIgaW4gdGhlIGJ1dHRvbiBiYXIgYXJlIHN1cHBsaWVkIGluCi0gICAgICogdGhpcyBjb25zdHJ1Y3RvciBhcyBhbiBhcnJheS4gVGhlIDxjb2RlPm9wZW48L2NvZGU+IG1ldGhvZCB3aWxsIHJldHVybgotICAgICAqIHRoZSBpbmRleCBvZiB0aGUgbGFiZWwgaW4gdGhpcyBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBidXR0b24gdGhhdCB3YXMKLSAgICAgKiBwcmVzc2VkIHRvIGNsb3NlIHRoZSBkaWFsb2cuIElmIHRoZSBkaWFsb2cgd2FzIGRpc21pc3NlZCB3aXRob3V0IHByZXNzaW5nCi0gICAgICogYSBidXR0b24gKEVTQywgZXRjLikgdGhlbiAtMSBpcyByZXR1cm5lZC4gTm90ZSB0aGF0IHRoZSA8Y29kZT5vcGVuPC9jb2RlPgotICAgICAqIG1ldGhvZCBibG9ja3MuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbAotICAgICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgICAqICAgICAgICAgICAgdGhlIGRpYWxvZyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSBkaWFsb2dUaXRsZUltYWdlCi0gICAgICogICAgICAgICAgICB0aGUgZGlhbG9nIHRpdGxlIGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIGRpYWxvZ01lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBkaWFsb2cgbWVzc2FnZQotICAgICAqIEBwYXJhbSBkaWFsb2dJbWFnZVR5cGUKLSAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAgICAgKiAgICAgICAgICAgIDx1bD4KLSAgICAgKiAgICAgICAgICAgIDxsaT48Y29kZT5NZXNzYWdlRGlhbG9nLk5PTkU8L2NvZGU+IGZvciBhIGRpYWxvZyB3aXRoIG5vCi0gICAgICogICAgICAgICAgICBpbWFnZTwvbGk+Ci0gICAgICogICAgICAgICAgICA8bGk+PGNvZGU+TWVzc2FnZURpYWxvZy5FUlJPUjwvY29kZT4gZm9yIGEgZGlhbG9nIHdpdGggYW4KLSAgICAgKiAgICAgICAgICAgIGVycm9yIGltYWdlPC9saT4KLSAgICAgKiAgICAgICAgICAgIDxsaT48Y29kZT5NZXNzYWdlRGlhbG9nLklORk9STUFUSU9OPC9jb2RlPiBmb3IgYSBkaWFsb2cKLSAgICAgKiAgICAgICAgICAgIHdpdGggYW4gaW5mb3JtYXRpb24gaW1hZ2U8L2xpPgotICAgICAqICAgICAgICAgICAgPGxpPjxjb2RlPk1lc3NhZ2VEaWFsb2cuUVVFU1RJT04gPC9jb2RlPiBmb3IgYSBkaWFsb2cgd2l0aCBhCi0gICAgICogICAgICAgICAgICBxdWVzdGlvbiBpbWFnZTwvbGk+Ci0gICAgICogICAgICAgICAgICA8bGk+PGNvZGU+TWVzc2FnZURpYWxvZy5XQVJOSU5HPC9jb2RlPiBmb3IgYSBkaWFsb2cgd2l0aCBhCi0gICAgICogICAgICAgICAgICB3YXJuaW5nIGltYWdlPC9saT4KLSAgICAgKiAgICAgICAgICAgIDwvdWw+Ci0gICAgICogQHBhcmFtIGRpYWxvZ0J1dHRvbkxhYmVscwotICAgICAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgbGFiZWxzIGZvciB0aGUgYnV0dG9ucyBpbiB0aGUgYnV0dG9uIGJhcgotICAgICAqIEBwYXJhbSBkZWZhdWx0SW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBpbiB0aGUgYnV0dG9uIGxhYmVsIGFycmF5IG9mIHRoZSBkZWZhdWx0IGJ1dHRvbgotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgICAgICAgICBJbWFnZSBkaWFsb2dUaXRsZUltYWdlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgaW50IGRpYWxvZ0ltYWdlVHlwZSwKLSAgICAgICAgICAgIFN0cmluZ1tdIGRpYWxvZ0J1dHRvbkxhYmVscywgaW50IGRlZmF1bHRJbmRleCkgewotICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgICAgIHRoaXMudGl0bGUgPSBkaWFsb2dUaXRsZTsKLSAgICAgICAgdGhpcy50aXRsZUltYWdlID0gZGlhbG9nVGl0bGVJbWFnZTsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gZGlhbG9nTWVzc2FnZTsKLQotICAgICAgICBzd2l0Y2ggKGRpYWxvZ0ltYWdlVHlwZSkgewotICAgICAgICBjYXNlIEVSUk9SOiB7Ci0gICAgICAgICAgICB0aGlzLmltYWdlID0gZ2V0RXJyb3JJbWFnZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBJTkZPUk1BVElPTjogewotICAgICAgICAgICAgdGhpcy5pbWFnZSA9IGdldEluZm9JbWFnZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBRVUVTVElPTjogewotICAgICAgICAgICAgdGhpcy5pbWFnZSA9IGdldFF1ZXN0aW9uSW1hZ2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV0FSTklORzogewotICAgICAgICAgICAgdGhpcy5pbWFnZSA9IGdldFdhcm5pbmdJbWFnZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aGlzLmJ1dHRvbkxhYmVscyA9IGRpYWxvZ0J1dHRvbkxhYmVsczsKLSAgICAgICAgdGhpcy5kZWZhdWx0QnV0dG9uSW5kZXggPSBkZWZhdWx0SW5kZXg7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjYnV0dG9uUHJlc3NlZChpbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLSAgICAgICAgc2V0UmV0dXJuQ29kZShidXR0b25JZCk7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgICAgIGlmICh0aXRsZSAhPSBudWxsKQotICAgICAgICAgICAgc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci0gICAgICAgIGlmICh0aXRsZUltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBzaGVsbC5zZXRJbWFnZSh0aXRsZUltYWdlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgYnV0dG9ucyA9IG5ldyBCdXR0b25bYnV0dG9uTGFiZWxzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnV0dG9uTGFiZWxzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBidXR0b25MYWJlbHNbaV07Ci0gICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgaSwgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdXR0b25JbmRleCA9PSBpKTsKLSAgICAgICAgICAgIGJ1dHRvbnNbaV0gPSBidXR0b247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiBhbiBhcmVhIG9mIHRoZSBkaWFsb2cgd2hpY2ggYXBwZWFycwotICAgICAqIGJlbG93IHRoZSBtZXNzYWdlIGFuZCBhYm92ZSB0aGUgYnV0dG9uIGJhci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgcmV0dXJucwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICAgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBjdXN0b20gYXJlYQotICAgICAqIEByZXR1cm4gdGhlIGN1c3RvbSBhcmVhIGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPkRpYWxvZzwvY29kZT4gZnJhbWV3b3JrIG1ldGhvZCBjcmVhdGVzCi0gICAgICogYW5kIGxheXMgb3V0IGEgY29tcG9zaXRlIGFuZCBjYWxscyA8Y29kZT5jcmVhdGVNZXNzYWdlQXJlYTwvY29kZT4gYW5kCi0gICAgICogPGNvZGU+Y3JlYXRlQ3VzdG9tQXJlYTwvY29kZT4gdG8gcG9wdWxhdGUgaXQuIFN1YmNsYXNzZXMgc2hvdWxkCi0gICAgICogb3ZlcnJpZGUgPGNvZGU+Y3JlYXRlQ3VzdG9tQXJlYTwvY29kZT4gdG8gYWRkIGNvbnRlbnRzIGJlbG93IHRoZQotICAgICAqIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBtZXNzYWdlIGFyZWEKLSAgICAgICAgY3JlYXRlTWVzc2FnZUFyZWEocGFyZW50KTsKLSAgICAgICAgLy8gY3JlYXRlIHRoZSB0b3AgbGV2ZWwgY29tcG9zaXRlIGZvciB0aGUgZGlhbG9nIGFyZWEKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIC8vIGFsbG93IHN1YmNsYXNzZXMgdG8gYWRkIGN1c3RvbSBjb250cm9scwotICAgICAgICBjdXN0b21BcmVhID0gY3JlYXRlQ3VzdG9tQXJlYShjb21wb3NpdGUpOwotICAgICAgICAvL0lmIGl0IGlzIG51bGwgY3JlYXRlIGEgZHVtbXkgbGFiZWwgZm9yIHNwYWNpbmcgcHVycG9zZXMKLSAgICAgICAgaWYgKGN1c3RvbUFyZWEgPT0gbnVsbCkKLSAgICAgICAgICAgIGN1c3RvbUFyZWEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJ1dHRvbiBpbiB0aGlzIGRpYWxvZydzIGJ1dHRvbiBiYXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGJ1dHRvbiBpbiB0aGUgZGlhbG9nJ3MgYnV0dG9uIGJhcgotICAgICAqIEByZXR1cm4gYSBidXR0b24gaW4gdGhlIGRpYWxvZydzIGJ1dHRvbiBiYXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQnV0dG9uIGdldEJ1dHRvbihpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGJ1dHRvbnNbaW5kZXhdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1pbmltdW0gbWVzc2FnZSBhcmVhIHdpZHRoIGluIHBpeGVscyBUaGlzIGRldGVybWluZXMgdGhlCi0gICAgICogbWluaW11bSB3aWR0aCBvZiB0aGUgZGlhbG9nLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIG1lc3NhZ2UgYXJlYSB3aWR0aCAoaW4gcGl4ZWxzKQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0TWluaW11bU1lc3NhZ2VXaWR0aCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuTUlOSU1VTV9NRVNTQUdFX0FSRUFfV0lEVEgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZSB0aGUgc2hlbGwgY2xvc2UuIFNldCB0aGUgcmV0dXJuIGNvZGUgdG8gPGNvZGU+U1dULkRFRkFVTFQ8L2NvZGU+Ci0gICAgICogYXMgdGhlcmUgaGFzIGJlZW4gbm8gZXhwbGljaXQgY2xvc2UgYnkgdGhlIHVzZXIuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2hhbmRsZVNoZWxsQ2xvc2VFdmVudCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2hlbGxDbG9zZUV2ZW50KCkgewotICAgICAgICAvL1NldHMgYSByZXR1cm4gY29kZSBvZiBTV1QuREVGQVVMVCBzaW5jZSBub25lIG9mIHRoZSBkaWFsb2cgYnV0dG9ucwotICAgICAgICAvLyB3ZXJlIHByZXNzZWQgdG8gY2xvc2UgdGhlIGRpYWxvZy4KLSAgICAgICAgc3VwZXIuaGFuZGxlU2hlbGxDbG9zZUV2ZW50KCk7Ci0gICAgICAgIHNldFJldHVybkNvZGUoU1dULkRFRkFVTFQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc2ltcGxlIGNvbmZpcm0gKE9LL0NhbmNlbCkgZGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSB0aXRsZQotICAgICAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBwcmVzc2VzIHRoZSBPSyBidXR0b24sCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5Db25maXJtKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdAotICAgICAgICAgICAgICAgIC8vIHRoZQotICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAvLyB3aW5kb3cKLSAgICAgICAgICAgICAgICAvLyBpY29uCi0gICAgICAgICAgICAgICAgbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsgLy8gT0sgaXMgdGhlCi0gICAgICAgIC8vIGRlZmF1bHQKLSAgICAgICAgcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHN0YW5kYXJkIGVycm9yIGRpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAcGFyYW0gdGl0bGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0Ci0gICAgICAgICAgICAgICAgLy8gdGhlCi0gICAgICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgICAgIC8vIHdpbmRvdwotICAgICAgICAgICAgICAgIC8vIGljb24KLSAgICAgICAgICAgICAgICBtZXNzYWdlLCBFUlJPUiwgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCB9LCAwKTsgLy8gb2sKLSAgICAgICAgLy8gaXMKLSAgICAgICAgLy8gdGhlCi0gICAgICAgIC8vIGRlZmF1bHQKLSAgICAgICAgZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc3RhbmRhcmQgaW5mb3JtYXRpb24gZGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSB0aXRsZQotICAgICAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5JbmZvcm1hdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0Ci0gICAgICAgICAgICAgICAgLy8gdGhlCi0gICAgICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgICAgIC8vIHdpbmRvdwotICAgICAgICAgICAgICAgIC8vIGljb24KLSAgICAgICAgICAgICAgICBtZXNzYWdlLCBJTkZPUk1BVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMIH0sIDApOwotICAgICAgICAvLyBvayBpcyB0aGUgZGVmYXVsdAotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzaW1wbGUgWWVzL05vIHF1ZXN0aW9uIGRpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAcGFyYW0gdGl0bGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgT0sgYnV0dG9uLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuUXVlc3Rpb24oU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdAotICAgICAgICAgICAgICAgIC8vIHRoZQotICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAvLyB3aW5kb3cKLSAgICAgICAgICAgICAgICAvLyBpY29uCi0gICAgICAgICAgICAgICAgbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCB9LCAwKTsgLy8geWVzIGlzIHRoZSBkZWZhdWx0Ci0gICAgICAgIHJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzdGFuZGFyZCB3YXJuaW5nIGRpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAcGFyYW0gdGl0bGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuV2FybmluZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQKLSAgICAgICAgICAgICAgICAvLyB0aGUKLSAgICAgICAgICAgICAgICAvLyBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgLy8gd2luZG93Ci0gICAgICAgICAgICAgICAgLy8gaWNvbgotICAgICAgICAgICAgICAgIG1lc3NhZ2UsIFdBUk5JTkcsIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwgfSwgMCk7IC8vIG9rCi0gICAgICAgIC8vIGlzCi0gICAgICAgIC8vIHRoZQotICAgICAgICAvLyBkZWZhdWx0Ci0gICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLSAgICAgKiAgICAgIGludCwgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBpbnQgaWQsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdEJ1dHRvbikgewotICAgICAgICBCdXR0b24gYnV0dG9uID0gc3VwZXIuY3JlYXRlQnV0dG9uKHBhcmVudCwgaWQsIGxhYmVsLCBkZWZhdWx0QnV0dG9uKTsKLSAgICAgICAgLy9CZSBzdXJlIHRvIHNldCB0aGUgZm9jdXMgaWYgdGhlIGN1c3RvbSBhcmVhIGNhbm5vdCBzbyBhcyBub3QKLSAgICAgICAgLy90byBsb3NlIHRoZSBkZWZhdWx0QnV0dG9uLgotICAgICAgICBpZiAoZGVmYXVsdEJ1dHRvbiAmJiAhY3VzdG9tU2hvdWxkVGFrZUZvY3VzKCkpCi0gICAgICAgICAgICBidXR0b24uc2V0Rm9jdXMoKTsKLSAgICAgICAgcmV0dXJuIGJ1dHRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGFwcGx5IHRoZSB3b3JrYXJvdW5kIHdoZXJlIHdlIHRha2UgZm9jdXMKLSAgICAgKiBmb3IgdGhlIGRlZmF1bHQgYnV0dG9uIG9yIGlmIHRoYXQgc2hvdWxkIGJlIGRldGVybWluZWQgYnkgdGhlIGRpYWxvZy4gQnkKLSAgICAgKiBkZWZhdWx0IG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlIGN1c3RvbSBhcmVhIGlzIGEgbGFiZWwgb3IgQ0xhYmVsIHRoYXQKLSAgICAgKiBjYW5ub3QgdGFrZSBmb2N1cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjdXN0b21TaG91bGRUYWtlRm9jdXMoKSB7Ci0gICAgICAgIGlmIChjdXN0b21BcmVhIGluc3RhbmNlb2YgTGFiZWwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChjdXN0b21BcmVhIGluc3RhbmNlb2YgQ0xhYmVsKQotICAgICAgICAgICAgcmV0dXJuIChjdXN0b21BcmVhLmdldFN0eWxlKCkgJiBTV1QuTk9fRk9DVVMpID4gMDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZyNnZXRJbWFnZSgpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKCkgewotICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gYWNjZXNzb3IgZm9yIHRoZSBsYWJlbHMgdG8gdXNlIG9uIHRoZSBidXR0b25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGJ1dHRvbiBsYWJlbHMgdG8gdXNlZDsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEJ1dHRvbkxhYmVscygpIHsKLSAgICAgICAgcmV0dXJuIGJ1dHRvbkxhYmVsczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBhY2Nlc3NvciBmb3IgdGhlIGluZGV4IG9mIHRoZSBkZWZhdWx0IGJ1dHRvbiBpbiB0aGUgYnV0dG9uIGFycmF5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgYnV0dG9uIGluZGV4LgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdEJ1dHRvbkluZGV4KCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdEJ1dHRvbkluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgbXV0YXRvciBmb3IgdGhlIGFycmF5IG9mIGJ1dHRvbnMgaW4gdGhlIGJ1dHRvbiBiYXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1dHRvbnMKLSAgICAgKiAgICAgICAgICAgIFRoZSBidXR0b25zIGluIHRoZSBidXR0b24gYmFyOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCdXR0b25zKEJ1dHRvbltdIGJ1dHRvbnMpIHsKLSAgICAgICAgaWYgKGJ1dHRvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlIGFycmF5IG9mIGJ1dHRvbnMgY2Fubm90IGJlIG51bGwuIik7fSAvLyROT04tTkxTLTEkCi0gICAgICAgIHRoaXMuYnV0dG9ucyA9IGJ1dHRvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBtdXRhdG9yIGZvciB0aGUgYnV0dG9uIGxhYmVscy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnV0dG9uTGFiZWxzCi0gICAgICogICAgICAgICAgICBUaGUgYnV0dG9uIGxhYmVscyB0byB1c2U7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEJ1dHRvbkxhYmVscyhTdHJpbmdbXSBidXR0b25MYWJlbHMpIHsKLSAgICAgICAgaWYgKGJ1dHRvbkxhYmVscyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUaGUgYXJyYXkgb2YgYnV0dG9uIGxhYmVscyBjYW5ub3QgYmUgbnVsbC4iKTt9IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGhpcy5idXR0b25MYWJlbHMgPSBidXR0b25MYWJlbHM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWZjMWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIDxwPgotICogQSBtZXNzYWdlIGRpYWxvZyB3aGljaCBhbHNvIGFsbG93cyB0aGUgdXNlciB0byBhZGp1c3QgYSB0b2dnbGUgc2V0dGluZy4gSWYgYQotICogcHJlZmVyZW5jZSBzdG9yZSBpcyBwcm92aWRlZCBhbmQgdGhlIHVzZXIgc2VsZWN0cyB0aGUgdG9nZ2xlLCB0aGVuIHRoZSB1c2VyJ3MKLSAqIGFuc3dlciAoeWVzL29rIG9yIG5vKSB3aWxsIGJlIHBlcnNpc3RlZCBpbiB0aGUgc3RvcmUuIElmIG5vIHN0b3JlIGlzCi0gKiBwcm92aWRlZCwgdGhlbiB0aGlzIGluZm9ybWF0aW9uIGNhbiBiZSBxdWVyaWVkIGFmdGVyIHRoZSBkaWFsb2cgY2xvc2VzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIHR5cGUgb2YgZGlhbG9nIHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIHlvdSB3YW50IHRvIHVzZXIgdG8gYmUgYWJsZSB0bwotICogYXZvaWQgYmVpbmcgcHJvbXB0ZWQgaW4gdGhlIGZ1dHVyZS4gSXQgaXMgPHN0cm9uZz5zdHJvbmdseSA8L3N0cm9uZz4KLSAqIHJlY29tbWVuZGVkIHRoYXQgYSBjYW5jZWwgb3B0aW9uIGJlIHByb3ZpZGVkLCBzbyB0aGF0IHRoZSB1c2VyIGhhcyB0aGUgb3B0aW9uCi0gKiBvZiBtYWtpbmcgdGhlIGRlY2lzaW9uIGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZS4gVGhlIHNlbWFudGljIGZvciBhIGNhbmNlbAotICogYnV0dG9uIHNob3VsZCBiZSB0byBjYW5jZWwgdGhlIG9wZXJhdGlvbiAoaWYgaXQgaGFzIG5vdCB5ZXQgc3RhcnRlZCksIG9yIHN0b3AKLSAqIHRoZSBvcGVyYXRpb24gKGlmIGl0IGhhcyBhbHJlYWR5IHN0YXJ0ZWQpLgotICogPC9wPgotICogPHA+Ci0gKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGRldmVsb3BlciB0byBwcm92aWRlIGEgbWVjaGFuaXNtIGZvciB0aGUgdXNlcgotICogdG8gY2hhbmdlIHRoaXMgcHJlZmVyZW5jZSBhdCBzb21lIGxhdGVyIHBvaW50IGluIHRpbWUgKGUuZy4sIHRocm91Z2ggYQotICogcHJlZmVyZW5jZSBwYWdlKS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIHsKLQotICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aGVuIHRoZSB1c2VyIGhhcyBhc2tlZCB0aGF0IHRoZSBhbnN3ZXIgdG8KLSAgICAgKiB0aGUgcXVlc3Rpb24gYWx3YXlzIGJlICJva2F5IiBvciAieWVzIi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFdBWVMgPSAiYWx3YXlzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdoZW4gdGhlIHVzZXIgaGFzIGFza2VkIHRoYXQgdGhlIGFuc3dlciB0bwotICAgICAqIHRoZSBxdWVzdGlvbiBhbHdheXMgYmUgIm5vIi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVZFUiA9ICJuZXZlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aGVuIHRoZSB1c2VyIHdpc2hlcyB0byBwcm9tcHRlZCBmb3IgYW4KLSAgICAgKiBhbnN3ZXIgZXZlcnkgdGltZSB0aGUgcXVlc3Rpb24gaXMgdG8gYmUgYXNrZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPTVBUID0gInByb21wdCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc3RhbmRhcmQgZXJyb3IgZGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSB0aXRsZQotICAgICAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHRvZ2dsZU1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIGZvciB0aGUgdG9nZ2xlIGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvcgotICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgbWVzc2FnZQotICAgICAqIEBwYXJhbSB0b2dnbGVTdGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoZSB0b2dnbGUKLSAgICAgKiBAcGFyYW0gc3RvcmUKLSAgICAgKiAgICAgICAgICAgIHRoZSBJUHJlZmVyZW5jZSBzdG9yZSBpbiB3aGljaCB0aGUgdXNlcidzIHByZWZlcmVuY2Ugc2hvdWxkIGJlCi0gICAgICogICAgICAgICAgICBwZXJzaXN0ZWQ7IDxjb2RlPm51bGw8L2NvZGU+IGlmIHlvdSBkb24ndCB3YW50IGl0IHBlcnNpc3RlZAotICAgICAqICAgICAgICAgICAgYXV0b21hdGljYWxseS4KLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5IHRvIHVzZSB3aGVuIHBlcnNpc3RpbmcgdGhlIHVzZXIncyBwcmVmZXJlbmNlOwotICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgeW91IGRvbid0IHdhbnQgaXQgcGVyc2lzdGVkLgotICAgICAqIEByZXR1cm4gdGhlIGRpYWxvZywgYWZ0ZXIgYmVpbmcgY2xvc2VkIGJ5IHRoZSB1c2VyLCB3aGljaCB0aGUgY2xpZW50IGNhbgotICAgICAqICAgICAgICAgb25seSBjYWxsIDxjb2RlPmdldFJldHVybkNvZGUoKTwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPmdldFRvZ2dsZVN0YXRlKCk8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHRvZ2dsZU1lc3NhZ2UsIGJvb2xlYW4gdG9nZ2xlU3RhdGUsCi0gICAgICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZShwYXJlbnQsCi0gICAgICAgICAgICAgICAgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdCB3aW5kb3cgaWNvbgotICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEVSUk9SLCBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMIH0sIDAsIC8vIG9rCi0gICAgICAgICAgICAgICAgLy8gaXMKLSAgICAgICAgICAgICAgICAvLyB0aGUKLSAgICAgICAgICAgICAgICAvLyBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgdG9nZ2xlTWVzc2FnZSwgdG9nZ2xlU3RhdGUpOwotICAgICAgICBkaWFsb2cucHJlZlN0b3JlID0gc3RvcmU7Ci0gICAgICAgIGRpYWxvZy5wcmVmS2V5ID0ga2V5OwotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICByZXR1cm4gZGlhbG9nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc3RhbmRhcmQgaW5mb3JtYXRpb24gZGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSB0aXRsZQotICAgICAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHRvZ2dsZU1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIGZvciB0aGUgdG9nZ2xlIGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvcgotICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgbWVzc2FnZQotICAgICAqIEBwYXJhbSB0b2dnbGVTdGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoZSB0b2dnbGUKLSAgICAgKiBAcGFyYW0gc3RvcmUKLSAgICAgKiAgICAgICAgICAgIHRoZSBJUHJlZmVyZW5jZSBzdG9yZSBpbiB3aGljaCB0aGUgdXNlcidzIHByZWZlcmVuY2Ugc2hvdWxkIGJlCi0gICAgICogICAgICAgICAgICBwZXJzaXN0ZWQ7IDxjb2RlPm51bGw8L2NvZGU+IGlmIHlvdSBkb24ndCB3YW50IGl0IHBlcnNpc3RlZAotICAgICAqICAgICAgICAgICAgYXV0b21hdGljYWxseS4KLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5IHRvIHVzZSB3aGVuIHBlcnNpc3RpbmcgdGhlIHVzZXIncyBwcmVmZXJlbmNlOwotICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgeW91IGRvbid0IHdhbnQgaXQgcGVyc2lzdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRpYWxvZywgYWZ0ZXIgYmVpbmcgY2xvc2VkIGJ5IHRoZSB1c2VyLCB3aGljaCB0aGUgY2xpZW50IGNhbgotICAgICAqICAgICAgICAgb25seSBjYWxsIDxjb2RlPmdldFJldHVybkNvZGUoKTwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPmdldFRvZ2dsZVN0YXRlKCk8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBvcGVuSW5mb3JtYXRpb24oU2hlbGwgcGFyZW50LAotICAgICAgICAgICAgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHRvZ2dsZU1lc3NhZ2UsCi0gICAgICAgICAgICBib29sZWFuIHRvZ2dsZVN0YXRlLCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZShwYXJlbnQsCi0gICAgICAgICAgICAgICAgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdCB3aW5kb3cgaWNvbgotICAgICAgICAgICAgICAgIG1lc3NhZ2UsIElORk9STUFUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwgfSwgMCwgLy8gb2sgaXMgdGhlCi0gICAgICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgICAgIHRvZ2dsZU1lc3NhZ2UsIHRvZ2dsZVN0YXRlKTsKLSAgICAgICAgZGlhbG9nLnByZWZTdG9yZSA9IHN0b3JlOwotICAgICAgICBkaWFsb2cucHJlZktleSA9IGtleTsKLSAgICAgICAgZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgcmV0dXJuIGRpYWxvZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHNpbXBsZSBjb25maXJtIChPSy9DYW5jZWwpIGRpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAcGFyYW0gdGl0bGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZQotICAgICAqIEBwYXJhbSB0b2dnbGVNZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSBmb3IgdGhlIHRvZ2dsZSBjb250cm9sLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IKLSAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdG9nZ2xlU3RhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHN0YXRlIGZvciB0aGUgdG9nZ2xlCi0gICAgICogQHBhcmFtIHN0b3JlCi0gICAgICogICAgICAgICAgICB0aGUgSVByZWZlcmVuY2Ugc3RvcmUgaW4gd2hpY2ggdGhlIHVzZXIncyBwcmVmZXJlbmNlIHNob3VsZCBiZQotICAgICAqICAgICAgICAgICAgcGVyc2lzdGVkOyA8Y29kZT5udWxsPC9jb2RlPiBpZiB5b3UgZG9uJ3Qgd2FudCBpdCBwZXJzaXN0ZWQKLSAgICAgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkuCi0gICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byB1c2Ugd2hlbiBwZXJzaXN0aW5nIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZTsKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHlvdSBkb24ndCB3YW50IGl0IHBlcnNpc3RlZC4KLSAgICAgKiBAcmV0dXJuIHRoZSBkaWFsb2csIGFmdGVyIGJlaW5nIGNsb3NlZCBieSB0aGUgdXNlciwgd2hpY2ggdGhlIGNsaWVudCBjYW4KLSAgICAgKiAgICAgICAgIG9ubHkgY2FsbCA8Y29kZT5nZXRSZXR1cm5Db2RlKCk8L2NvZGU+IG9yCi0gICAgICogICAgICAgICA8Y29kZT5nZXRUb2dnbGVTdGF0ZSgpPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgb3Blbk9rQ2FuY2VsQ29uZmlybShTaGVsbCBwYXJlbnQsCi0gICAgICAgICAgICBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgdG9nZ2xlTWVzc2FnZSwKLSAgICAgICAgICAgIGJvb2xlYW4gdG9nZ2xlU3RhdGUsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlKHBhcmVudCwKLSAgICAgICAgICAgICAgICB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0IHdpbmRvdyBpY29uCi0gICAgICAgICAgICAgICAgbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwLCAvLyBPSyBpcyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgIHRvZ2dsZU1lc3NhZ2UsIHRvZ2dsZVN0YXRlKTsKLSAgICAgICAgZGlhbG9nLnByZWZTdG9yZSA9IHN0b3JlOwotICAgICAgICBkaWFsb2cucHJlZktleSA9IGtleTsKLSAgICAgICAgZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgcmV0dXJuIGRpYWxvZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHN0YW5kYXJkIHdhcm5pbmcgZGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSB0aXRsZQotICAgICAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHRvZ2dsZU1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIGZvciB0aGUgdG9nZ2xlIGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvcgotICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgbWVzc2FnZQotICAgICAqIEBwYXJhbSB0b2dnbGVTdGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoZSB0b2dnbGUKLSAgICAgKiBAcGFyYW0gc3RvcmUKLSAgICAgKiAgICAgICAgICAgIHRoZSBJUHJlZmVyZW5jZSBzdG9yZSBpbiB3aGljaCB0aGUgdXNlcidzIHByZWZlcmVuY2Ugc2hvdWxkIGJlCi0gICAgICogICAgICAgICAgICBwZXJzaXN0ZWQ7IDxjb2RlPm51bGw8L2NvZGU+IGlmIHlvdSBkb24ndCB3YW50IGl0IHBlcnNpc3RlZAotICAgICAqICAgICAgICAgICAgYXV0b21hdGljYWxseS4KLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5IHRvIHVzZSB3aGVuIHBlcnNpc3RpbmcgdGhlIHVzZXIncyBwcmVmZXJlbmNlOwotICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgeW91IGRvbid0IHdhbnQgaXQgcGVyc2lzdGVkLgotICAgICAqIEByZXR1cm4gdGhlIGRpYWxvZywgYWZ0ZXIgYmVpbmcgY2xvc2VkIGJ5IHRoZSB1c2VyLCB3aGljaCB0aGUgY2xpZW50IGNhbgotICAgICAqICAgICAgICAgb25seSBjYWxsIDxjb2RlPmdldFJldHVybkNvZGUoKTwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPmdldFRvZ2dsZVN0YXRlKCk8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBvcGVuV2FybmluZyhTaGVsbCBwYXJlbnQsCi0gICAgICAgICAgICBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgdG9nZ2xlTWVzc2FnZSwKLSAgICAgICAgICAgIGJvb2xlYW4gdG9nZ2xlU3RhdGUsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlKHBhcmVudCwKLSAgICAgICAgICAgICAgICB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0IHdpbmRvdyBpY29uCi0gICAgICAgICAgICAgICAgbWVzc2FnZSwgV0FSTklORywgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCB9LAotICAgICAgICAgICAgICAgIDAsIC8vIG9rIGlzIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgdG9nZ2xlTWVzc2FnZSwgdG9nZ2xlU3RhdGUpOwotICAgICAgICBkaWFsb2cucHJlZlN0b3JlID0gc3RvcmU7Ci0gICAgICAgIGRpYWxvZy5wcmVmS2V5ID0ga2V5OwotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICByZXR1cm4gZGlhbG9nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc2ltcGxlIHF1ZXN0aW9uIFllcy9Oby9DYW5jZWwgZGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSB0aXRsZQotICAgICAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHRvZ2dsZU1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIGZvciB0aGUgdG9nZ2xlIGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvcgotICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgbWVzc2FnZQotICAgICAqIEBwYXJhbSB0b2dnbGVTdGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoZSB0b2dnbGUKLSAgICAgKiBAcGFyYW0gc3RvcmUKLSAgICAgKiAgICAgICAgICAgIHRoZSBJUHJlZmVyZW5jZSBzdG9yZSBpbiB3aGljaCB0aGUgdXNlcidzIHByZWZlcmVuY2Ugc2hvdWxkIGJlCi0gICAgICogICAgICAgICAgICBwZXJzaXN0ZWQ7IDxjb2RlPm51bGw8L2NvZGU+IGlmIHlvdSBkb24ndCB3YW50IGl0IHBlcnNpc3RlZAotICAgICAqICAgICAgICAgICAgYXV0b21hdGljYWxseS4KLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5IHRvIHVzZSB3aGVuIHBlcnNpc3RpbmcgdGhlIHVzZXIncyBwcmVmZXJlbmNlOwotICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgeW91IGRvbid0IHdhbnQgaXQgcGVyc2lzdGVkLgotICAgICAqIEByZXR1cm4gdGhlIGRpYWxvZywgYWZ0ZXIgYmVpbmcgY2xvc2VkIGJ5IHRoZSB1c2VyLCB3aGljaCB0aGUgY2xpZW50IGNhbgotICAgICAqICAgICAgICAgb25seSBjYWxsIDxjb2RlPmdldFJldHVybkNvZGUoKTwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPmdldFRvZ2dsZVN0YXRlKCk8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBvcGVuWWVzTm9DYW5jZWxRdWVzdGlvbihTaGVsbCBwYXJlbnQsCi0gICAgICAgICAgICBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgdG9nZ2xlTWVzc2FnZSwKLSAgICAgICAgICAgIGJvb2xlYW4gdG9nZ2xlU3RhdGUsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlKHBhcmVudCwKLSAgICAgICAgICAgICAgICB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0IHdpbmRvdyBpY29uCi0gICAgICAgICAgICAgICAgbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDAsIC8vIFlFUyBpcyB0aGUKLSAgICAgICAgICAgICAgICAvLyBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgdG9nZ2xlTWVzc2FnZSwgdG9nZ2xlU3RhdGUpOwotICAgICAgICBkaWFsb2cucHJlZlN0b3JlID0gc3RvcmU7Ci0gICAgICAgIGRpYWxvZy5wcmVmS2V5ID0ga2V5OwotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICByZXR1cm4gZGlhbG9nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc2ltcGxlIFllcy9ObyBxdWVzdGlvbiBkaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIHRpdGxlCi0gICAgICogICAgICAgICAgICB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdG9nZ2xlTWVzc2FnZQotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgZm9yIHRoZSB0b2dnbGUgY29udHJvbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yCi0gICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCBtZXNzYWdlCi0gICAgICogQHBhcmFtIHRvZ2dsZVN0YXRlCi0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhlIHRvZ2dsZQotICAgICAqIEBwYXJhbSBzdG9yZQotICAgICAqICAgICAgICAgICAgdGhlIElQcmVmZXJlbmNlIHN0b3JlIGluIHdoaWNoIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZSBzaG91bGQgYmUKLSAgICAgKiAgICAgICAgICAgIHBlcnNpc3RlZDsgPGNvZGU+bnVsbDwvY29kZT4gaWYgeW91IGRvbid0IHdhbnQgaXQgcGVyc2lzdGVkCi0gICAgICogICAgICAgICAgICBhdXRvbWF0aWNhbGx5LgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gdXNlIHdoZW4gcGVyc2lzdGluZyB0aGUgdXNlcidzIHByZWZlcmVuY2U7Ci0gICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB5b3UgZG9uJ3Qgd2FudCBpdCBwZXJzaXN0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGlhbG9nLCBhZnRlciBiZWluZyBjbG9zZWQgYnkgdGhlIHVzZXIsIHdoaWNoIHRoZSBjbGllbnQgY2FuCi0gICAgICogICAgICAgICBvbmx5IGNhbGwgPGNvZGU+Z2V0UmV0dXJuQ29kZSgpPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgPGNvZGU+Z2V0VG9nZ2xlU3RhdGUoKTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlIG9wZW5ZZXNOb1F1ZXN0aW9uKFNoZWxsIHBhcmVudCwKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyB0b2dnbGVNZXNzYWdlLAotICAgICAgICAgICAgYm9vbGVhbiB0b2dnbGVTdGF0ZSwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIGtleSkgewotICAgICAgICBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUocGFyZW50LAotICAgICAgICAgICAgICAgIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQgd2luZG93IGljb24KLSAgICAgICAgICAgICAgICBtZXNzYWdlLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMIH0sIDAsIC8vIHllcyBpcyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgIHRvZ2dsZU1lc3NhZ2UsIHRvZ2dsZVN0YXRlKTsKLSAgICAgICAgZGlhbG9nLnByZWZTdG9yZSA9IHN0b3JlOwotICAgICAgICBkaWFsb2cucHJlZktleSA9IGtleTsKLSAgICAgICAgZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgcmV0dXJuIGRpYWxvZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUga2V5IGF0IHdoaWNoIHRoZSB0b2dnbGUgc3RhdGUgc2hvdWxkIGJlIHN0b3JlZCB3aXRoaW4gdGhlCi0gICAgICogcHJlZmVyZW5jZXMuIFRoaXMgdmFsdWUgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCB3aGljaCBpbmRpY2F0ZXMgdGhhdAotICAgICAqIG5vIHByZWZlcmVuY2Ugc2hvdWxkIGJlIHVwZGF0ZWQgYXV0b21hdGljYWxseS4gSXQgaXMgdGhlbiB0aGUKLSAgICAgKiByZXNwb25zaWJpbGl0eSBvZiB0aGUgdXNlciBvZiB0aGlzIEFQSSB0byB1c2UgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlCi0gICAgICogdG9nZ2xlLiBOb3RlOiBhIDxjb2RlPnByZWZTdG9yZTwvY29kZT4gaXMgYWxzbyBuZWVkZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJlZktleSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcHJlZmVyZW5jZSBzdG9yZSB3aGljaCB3aWxsIGJlIGFmZmVjdGVkIGJ5IHRoZSB0b2dnbGUgYnV0dG9uLiBUaGlzCi0gICAgICogdmFsdWUgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCBubyBwcmVmZXJlbmNlCi0gICAgICogc2hvdWxkIGJlIHVwZGF0ZWQgYXV0b21hdGljYWxseS4gSXQgaXMgdGhlbiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCi0gICAgICogdXNlciBvZiB0aGlzIEFQSSB0byB1c2UgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRvZ2dsZS4gTm90ZTogYQotICAgICAqIDxjb2RlPnByZWZLZXk8L2NvZGU+IGlzIGFsc28gbmVlZGVkLgotICAgICAqLwotICAgIHByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIHRvZ2dsZSBidXR0b24gKHdpZGdldCkuIFRoaXMgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gdW50aWwgdGhlCi0gICAgICogZGlhbG9nIGlzIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBCdXR0b24gdG9nZ2xlQnV0dG9uID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlciwgd2l0aCB0aGUgdG9nZ2xlIGJ1dHRvbi4gVGhpcyBpcyB0aGUKLSAgICAgKiB0ZXh0IGJlc2lkZXMgdGhlIHRvZ2dsZS4gSWYgaXQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoaXMgbWVhbnMgdGhhdAotICAgICAqIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSB0b2dnbGUgc2hvdWxkIGJlIHVzZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9nZ2xlTWVzc2FnZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBpbml0aWFsIHNlbGVjdGVkIHN0YXRlIG9mIHRoZSB0b2dnbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHRvZ2dsZVN0YXRlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1lc3NhZ2UgZGlhbG9nIHdpdGggYSB0b2dnbGUuIFNlZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvcgotICAgICAqIGZvciBpbmZvIG9uIHRoZSBvdGhlciBwYXJhbWV0ZXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbAotICAgICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgICAqICAgICAgICAgICAgdGhlIGRpYWxvZyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSBpbWFnZQotICAgICAqICAgICAgICAgICAgdGhlIGRpYWxvZyB0aXRsZSBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgZGlhbG9nIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZGlhbG9nSW1hZ2VUeXBlCi0gICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gICAgICogICAgICAgICAgICA8dWw+Ci0gICAgICogICAgICAgICAgICA8bGk+PGNvZGU+TWVzc2FnZURpYWxvZy5OT05FPC9jb2RlPiBmb3IgYSBkaWFsb2cgd2l0aCBubwotICAgICAqICAgICAgICAgICAgaW1hZ2U8L2xpPgotICAgICAqICAgICAgICAgICAgPGxpPjxjb2RlPk1lc3NhZ2VEaWFsb2cuRVJST1I8L2NvZGU+IGZvciBhIGRpYWxvZyB3aXRoIGFuCi0gICAgICogICAgICAgICAgICBlcnJvciBpbWFnZTwvbGk+Ci0gICAgICogICAgICAgICAgICA8bGk+PGNvZGU+TWVzc2FnZURpYWxvZy5JTkZPUk1BVElPTjwvY29kZT4gZm9yIGEgZGlhbG9nCi0gICAgICogICAgICAgICAgICB3aXRoIGFuIGluZm9ybWF0aW9uIGltYWdlPC9saT4KLSAgICAgKiAgICAgICAgICAgIDxsaT48Y29kZT5NZXNzYWdlRGlhbG9nLlFVRVNUSU9OIDwvY29kZT4gZm9yIGEgZGlhbG9nIHdpdGggYQotICAgICAqICAgICAgICAgICAgcXVlc3Rpb24gaW1hZ2U8L2xpPgotICAgICAqICAgICAgICAgICAgPGxpPjxjb2RlPk1lc3NhZ2VEaWFsb2cuV0FSTklORzwvY29kZT4gZm9yIGEgZGlhbG9nIHdpdGggYQotICAgICAqICAgICAgICAgICAgd2FybmluZyBpbWFnZTwvbGk+Ci0gICAgICogICAgICAgICAgICA8L3VsPgotICAgICAqIEBwYXJhbSBkaWFsb2dCdXR0b25MYWJlbHMKLSAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIGxhYmVscyBmb3IgdGhlIGJ1dHRvbnMgaW4gdGhlIGJ1dHRvbiBiYXIKLSAgICAgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggaW4gdGhlIGJ1dHRvbiBsYWJlbCBhcnJheSBvZiB0aGUgZGVmYXVsdCBidXR0b24KLSAgICAgKiBAcGFyYW0gdG9nZ2xlTWVzc2FnZQotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgZm9yIHRoZSB0b2dnbGUgY29udHJvbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yCi0gICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCBtZXNzYWdlCi0gICAgICogQHBhcmFtIHRvZ2dsZVN0YXRlCi0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhlIHRvZ2dsZQotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUoU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICAgICAgICAgIEltYWdlIGltYWdlLCBTdHJpbmcgbWVzc2FnZSwgaW50IGRpYWxvZ0ltYWdlVHlwZSwKLSAgICAgICAgICAgIFN0cmluZ1tdIGRpYWxvZ0J1dHRvbkxhYmVscywgaW50IGRlZmF1bHRJbmRleCwKLSAgICAgICAgICAgIFN0cmluZyB0b2dnbGVNZXNzYWdlLCBib29sZWFuIHRvZ2dsZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgaW1hZ2UsIG1lc3NhZ2UsIGRpYWxvZ0ltYWdlVHlwZSwKLSAgICAgICAgICAgICAgICBkaWFsb2dCdXR0b25MYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0gICAgICAgIHRoaXMudG9nZ2xlTWVzc2FnZSA9IHRvZ2dsZU1lc3NhZ2U7Ci0gICAgICAgIHRoaXMudG9nZ2xlU3RhdGUgPSB0b2dnbGVTdGF0ZTsKLSAgICAgICAgc2V0QnV0dG9uTGFiZWxzKGRpYWxvZ0J1dHRvbkxhYmVscyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNidXR0b25QcmVzc2VkKGludCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotICAgICAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQotICAgICAgICBpZiAoYnV0dG9uSWQgIT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQgJiYgdG9nZ2xlU3RhdGUKLSAgICAgICAgICAgICAgICAmJiBwcmVmU3RvcmUgIT0gbnVsbCAmJiBwcmVmS2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoYnV0dG9uSWQpIHsKLSAgICAgICAgICAgIGNhc2UgSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQ6Ci0gICAgICAgICAgICBjYXNlIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRDoKLSAgICAgICAgICAgIGNhc2UgSURpYWxvZ0NvbnN0YW50cy5QUk9DRUVEX0lEOgotICAgICAgICAgICAgY2FzZSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEOgotICAgICAgICAgICAgICAgIHByZWZTdG9yZS5zZXRWYWx1ZShwcmVmS2V5LCBBTFdBWVMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRGlhbG9nQ29uc3RhbnRzLk5PX0lEOgotICAgICAgICAgICAgY2FzZSBJRGlhbG9nQ29uc3RhbnRzLk5PX1RPX0FMTF9JRDoKLSAgICAgICAgICAgICAgICBwcmVmU3RvcmUuc2V0VmFsdWUocHJlZktleSwgTkVWRVIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBEaWFsb2cjY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gYnV0dG9uTGFiZWxzID0gZ2V0QnV0dG9uTGFiZWxzKCk7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbltdIGJ1dHRvbnMgPSBuZXcgQnV0dG9uW2J1dHRvbkxhYmVscy5sZW5ndGhdOwotICAgICAgICBmaW5hbCBpbnQgZGVmYXVsdEJ1dHRvbkluZGV4ID0gZ2V0RGVmYXVsdEJ1dHRvbkluZGV4KCk7Ci0KLSAgICAgICAgaW50IHN1Z2dlc3RlZElkID0gSURpYWxvZ0NvbnN0YW50cy5JTlRFUk5BTF9JRDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidXR0b25MYWJlbHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGJ1dHRvbkxhYmVsc1tpXTsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgSkZhY2UgYnV0dG9uIElEIHRoYXQgbWF0Y2hlcyB0aGUgbGFiZWwsIG9yIHVzZSB0aGUgc3BlY2lmaWVkCi0gICAgICAgICAgICAvLyBpZCBpZiB0aGVyZSBpcyBubyBtYXRjaC4KLSAgICAgICAgICAgIGludCBpZCA9IG1hcEJ1dHRvbkxhYmVsVG9CdXR0b25JRChsYWJlbCwgc3VnZ2VzdGVkSWQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBpZiB0aGUgc3VnZ2VzdGVkIGlkIHdhcyB1c2VkLCBpbmNyZW1lbnQgdGhlIGRlZmF1bHQgZm9yIG5leHQgdXNlCi0gICAgICAgICAgICBpZiAoaWQgPT0gc3VnZ2VzdGVkSWQpCi0gICAgICAgICAgICAJc3VnZ2VzdGVkSWQrKzsKLSAKLSAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBpZCwgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdXR0b25JbmRleCA9PSBpKTsKLSAgICAgICAgICAgIGJ1dHRvbnNbaV0gPSBidXR0b247Ci0gCi0gICAgICAgIH0KLSAgICAgICAgc2V0QnV0dG9ucyhidXR0b25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGRpYWxvZ0FyZWFDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlcgotICAgICAgICAgICAgICAgIC5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICAgIHNldFRvZ2dsZUJ1dHRvbihjcmVhdGVUb2dnbGVCdXR0b24oZGlhbG9nQXJlYUNvbXBvc2l0ZSkpOwotICAgICAgICByZXR1cm4gZGlhbG9nQXJlYUNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgdG9nZ2xlIGJ1dHRvbiB3aXRob3V0IGFueSB0ZXh0IG9yIHN0YXRlLiAgVGhlIHRleHQgYW5kIHN0YXRlCi0gICAgICogd2lsbCBiZSBjcmVhdGVkIGJ5IDxjb2RlPmNyZWF0ZURpYWxvZ0FyZWE8L2NvZGU+LiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICBUaGUgY29tcG9zaXRlIGluIHdoaWNoIHRoZSB0b2dnbGUgYnV0dG9uIHNob3VsZCBiZSBwbGFjZWQ7Ci0gICAgICogICAgICAgICAgICBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIFRoZSBhZGRlZCB0b2dnbGUgYnV0dG9uOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVRvZ2dsZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCi0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULk5PTkUpOwotICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGJ1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRvZ2dsZVN0YXRlID0gYnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiBidXR0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdG9nZ2xlIGJ1dHRvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0b2dnbGUgYnV0dG9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJ1dHRvbiBnZXRUb2dnbGVCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiB0b2dnbGVCdXR0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gYWNjZXNzb3IgZm9yIHRoZSBjdXJyZW50IHByZWZlcmVuY2Ugc3RvcmUgZm9yIHRoaXMgZGlhbG9nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHByZWZlcmVuY2Ugc3RvcmU7IHRoaXMgdmFsdWUgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0gICAgICogICAgICAgICBwcmVmZXJlbmNlIGlzIGJlaW5nIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZlN0b3JlKCkgewotICAgICAgICByZXR1cm4gcHJlZlN0b3JlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGFjY2Vzc29yIGZvciB0aGUgY3VycmVudCBrZXkgb2YgdGhlIHRvZ2dsZSBwcmVmZXJlbmNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHByZWZlcmVuY2Uga2V5OyB0aGlzIHZhbHVlIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotICAgICAqICAgICAgICAgcHJlZmVyZW5jZSBpcyBiZWluZyB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZktleSgpIHsKLSAgICAgICAgcmV0dXJuIHByZWZLZXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdG9nZ2xlIHN0YXRlLiBUaGlzIGNhbiBiZSBjYWxsZWQgZXZlbiBhZnRlciB0aGUgZGlhbG9nIGlzCi0gICAgICogY2xvc2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRvZ2dsZSBidXR0b24gaXMgY2hlY2tlZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRUb2dnbGVTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRvZ2dsZVN0YXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgbXV0YXRvciBmb3IgdGhlIGtleSBvZiB0aGUgcHJlZmVyZW5jZSB0byBiZSBtb2RpZmllZCBieSB0aGUgdG9nZ2xlCi0gICAgICogYnV0dG9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVmS2V5Ci0gICAgICogICAgICAgICAgICBUaGUgcHJlZktleSB0byBzZXQuIElmIHRoaXMgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4sCi0gICAgICogICAgICAgICAgICB0aGVuIG5vIHByZWZlcmVuY2Ugd2lsbCBiZSBtb2RpZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVmS2V5KFN0cmluZyBwcmVmS2V5KSB7Ci0gICAgICAgIHRoaXMucHJlZktleSA9IHByZWZLZXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBtdXRhdG9yIGZvciB0aGUgcHJlZmVyZW5jZSBzdG9yZSB0byBiZSBtb2RpZmllZCBieSB0aGUgdG9nZ2xlIGJ1dHRvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZlN0b3JlCi0gICAgICogICAgICAgICAgICBUaGUgcHJlZlN0b3JlIHRvIHNldC4gSWYgdGhpcyB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiwKLSAgICAgKiAgICAgICAgICAgIHRoZW4gbm8gcHJlZmVyZW5jZSB3aWxsIGJlIG1vZGlmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByZWZTdG9yZShJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSkgewotICAgICAgICB0aGlzLnByZWZTdG9yZSA9IHByZWZTdG9yZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIG11dGF0b3IgZm9yIHRoZSBidXR0b24gcHJvdmlkaW5nIHRoZSB0b2dnbGUgb3B0aW9uLiBJZiB0aGUgYnV0dG9uCi0gICAgICogZXhpc3RzLCB0aGVuIGl0IHdpbGwgYXV0b21hdGljYWxseSBnZXQgdGhlIHRleHQgc2V0IHRvIHRoZSBjdXJyZW50IHRvZ2dsZQotICAgICAqIG1lc3NhZ2UsIGFuZCBpdHMgc2VsZWN0aW9uIHN0YXRlIHNldCB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24gc3RhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1dHRvbgotICAgICAqICAgICAgICAgICAgVGhlIGJ1dHRvbiB0byB1c2U7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFRvZ2dsZUJ1dHRvbihCdXR0b24gYnV0dG9uKSB7Ci0gICAgICAgIGlmIChidXR0b24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQSBtZXNzYWdlIGRpYWxvZyB3aXRoIHRvZ2dsZSBtYXkgbm90IGhhdmUgYSBudWxsIHRvZ2dsZSBidXR0b24uIik7fSAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgaWYgKCFidXR0b24uaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dDsKLSAgICAgICAgICAgIGlmICh0b2dnbGVNZXNzYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0ZXh0ID0gSkZhY2VSZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLmRlZmF1bHRUb2dnbGVNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGV4dCA9IHRvZ2dsZU1lc3NhZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidXR0b24uc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgICAgIGJ1dHRvbi5zZXRTZWxlY3Rpb24odG9nZ2xlU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy50b2dnbGVCdXR0b24gPSBidXR0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBtdXRhdG9yIGZvciB0aGUgdGV4dCBvbiB0aGUgdG9nZ2xlIGJ1dHRvbi4gVGhlIGJ1dHRvbiB3aWxsCi0gICAgICogYXV0b21hdGljYWxseSBnZXQgdXBkYXRlZCB3aXRoIHRoZSBuZXcgdGV4dCwgaWYgaXQgZXhpc3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBUaGUgbmV3IHRleHQgb2YgdGhlIHRvZ2dsZSBidXR0b247IGlmIGl0IGlzIDxjb2RlPm51bGw8L2NvZGU+LAotICAgICAqICAgICAgICAgICAgdGhlbiB1c2VkIHRoZSBkZWZhdWx0IHRvZ2dsZSBtZXNzYWdlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFRvZ2dsZU1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy50b2dnbGVNZXNzYWdlID0gbWVzc2FnZTsKLQotICAgICAgICBpZiAoKHRvZ2dsZUJ1dHRvbiAhPSBudWxsKSAmJiAoIXRvZ2dsZUJ1dHRvbi5pc0Rpc3Bvc2VkKCkpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dDsKLSAgICAgICAgICAgIGlmICh0b2dnbGVNZXNzYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0ZXh0ID0gSkZhY2VSZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLmRlZmF1bHRUb2dnbGVNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGV4dCA9IHRvZ2dsZU1lc3NhZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0b2dnbGVCdXR0b24uc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgbXV0YXRvciBmb3IgdGhlIHN0YXRlIG9mIHRoZSB0b2dnbGUgYnV0dG9uLiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUKLSAgICAgKiBidXR0b24sIGlmIGl0IGV4aXN0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9nZ2xlU3RhdGUKLSAgICAgKiAgICAgICAgICAgIFRoZSBkZXNpcmVkIHN0YXRlIG9mIHRoZSB0b2dnbGUgYnV0dG9uICg8Y29kZT50cnVlPC9jb2RlPgotICAgICAqICAgICAgICAgICAgbWVhbnMgdGhlIHRvZ2dsZSBzaG91bGQgYmUgc2VsZWN0ZWQpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvZ2dsZVN0YXRlKGJvb2xlYW4gdG9nZ2xlU3RhdGUpIHsKLSAgICAgICAgdGhpcy50b2dnbGVTdGF0ZSA9IHRvZ2dsZVN0YXRlOwotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgYnV0dG9uLCBpZiBpdCBleGlzdHMuCi0gICAgICAgIGlmICgodG9nZ2xlQnV0dG9uICE9IG51bGwpICYmICghdG9nZ2xlQnV0dG9uLmlzRGlzcG9zZWQoKSkpIHsKLSAgICAgICAgICAgIHRvZ2dsZUJ1dHRvbi5zZXRTZWxlY3Rpb24odG9nZ2xlU3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEF0dGVtcHQgdG8gZmluZCBhIHN0YW5kYXJkIEpGYWNlIGJ1dHRvbiBpZCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBidXR0b24KLSAgICAgKiBsYWJlbC4gIElmIG5vIG1hdGNoIGNhbiBiZSBmb3VuZCwgdXNlIHRoZSBkZWZhdWx0IGlkIHByb3ZpZGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBidXR0b25MYWJlbCB0aGUgYnV0dG9uIGxhYmVsIHdob3NlIGlkIGlzIHNvdWdodAotICAgICAqIEBwYXJhbSBkZWZhdWx0SWQgdGhlIGlkIHRvIHVzZSBmb3IgdGhlIGJ1dHRvbiBpZiB0aGVyZSBpcyBubyBzdGFuZGFyZCBpZAotICAgICAqIEByZXR1cm4gdGhlIGlkIGZvciB0aGUgc3BlY2lmaWVkIGJ1dHRvbiBsYWJlbAotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1hcEJ1dHRvbkxhYmVsVG9CdXR0b25JRChTdHJpbmcgYnV0dG9uTGFiZWwsIGludCBkZWZhdWx0SWQpIHsKLSAgICAJLy8gTm90IHByZXR0eSBidXQgZG9lcyB0aGUgam9iLi4uCi0gICAgCWlmIChJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLmVxdWFscyhidXR0b25MYWJlbCkpIAotICAgIAkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuT0tfSUQ7Ci0gICAgCQotCSAgICBpZiAoSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwuZXF1YWxzKGJ1dHRvbkxhYmVsKSkKLQkgICAgICAgIHJldHVybiBJRGlhbG9nQ29uc3RhbnRzLllFU19JRDsKLQkgICAgCi0JICAgIGlmIChJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLmVxdWFscyhidXR0b25MYWJlbCkpIAotCSAgICAgICAgcmV0dXJuIElEaWFsb2dDb25zdGFudHMuTk9fSUQ7Ci0JICAgIAotCSAgICBpZiAoSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwuZXF1YWxzKGJ1dHRvbkxhYmVsKSkKLQkgICAgICAgICByZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQ7Ci0JICAgIAotCSAgICBpZiAoSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLmVxdWFscyhidXR0b25MYWJlbCkpCi0JICAgIAlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lEOwotCSAgICAKLQkgICAgaWYgKElEaWFsb2dDb25zdGFudHMuU0tJUF9MQUJFTC5lcXVhbHMoYnV0dG9uTGFiZWwpKQotCSAgICAJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuU0tJUF9JRDsKLQkgICAgCi0JICAgIGlmIChJRGlhbG9nQ29uc3RhbnRzLlNUT1BfTEFCRUwuZXF1YWxzKGJ1dHRvbkxhYmVsKSkKLQkgICAgCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLlNUT1BfSUQ7Ci0JICAgIAotCSAgICBpZiAoSURpYWxvZ0NvbnN0YW50cy5BQk9SVF9MQUJFTC5lcXVhbHMoYnV0dG9uTGFiZWwpKQotCSAgICAJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuQUJPUlRfSUQ7Ci0JICAgIAotCSAgICBpZiAoSURpYWxvZ0NvbnN0YW50cy5SRVRSWV9MQUJFTC5lcXVhbHMoYnV0dG9uTGFiZWwpKQotCSAgICAJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuUkVUUllfSUQ7Ci0JICAgIAotCSAgICBpZiAoSURpYWxvZ0NvbnN0YW50cy5JR05PUkVfTEFCRUwuZXF1YWxzKGJ1dHRvbkxhYmVsKSkKLQkgICAgCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLklHTk9SRV9JRDsKLQkgICAgCi0JICAgIGlmIChJRGlhbG9nQ29uc3RhbnRzLlBST0NFRURfTEFCRUwuZXF1YWxzKGJ1dHRvbkxhYmVsKSkKLQkgICAgCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLlBST0NFRURfSUQ7Ci0JICAgIAotCSAgICBpZiAoSURpYWxvZ0NvbnN0YW50cy5PUEVOX0xBQkVMLmVxdWFscyhidXR0b25MYWJlbCkpCi0JICAgIAlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5PUEVOX0lEOwotCSAgICAKLQkgICAgaWYgKElEaWFsb2dDb25zdGFudHMuQ0xPU0VfTEFCRUwuZXF1YWxzKGJ1dHRvbkxhYmVsKSkKLQkgICAgCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLkNMT1NFX0lEOwotCSAgICAKLQkgICAgaWYgKElEaWFsb2dDb25zdGFudHMuQkFDS19MQUJFTC5lcXVhbHMoYnV0dG9uTGFiZWwpKQotCSAgICAJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuQkFDS19JRDsKLQkgICAgCi0JICAgIGlmIChJRGlhbG9nQ29uc3RhbnRzLk5FWFRfTEFCRUwuZXF1YWxzKGJ1dHRvbkxhYmVsKSkKLQkgICAgCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLk5FWFRfSUQ7Ci0JICAgIAotCSAgICBpZiAoSURpYWxvZ0NvbnN0YW50cy5GSU5JU0hfTEFCRUwuZXF1YWxzKGJ1dHRvbkxhYmVsKSkKLQkgICAgCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLkZJTklTSF9JRDsKLQkgICAgCi0JICAgIGlmIChJRGlhbG9nQ29uc3RhbnRzLkhFTFBfTEFCRUwuZXF1YWxzKGJ1dHRvbkxhYmVsKSkKLQkgICAgCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLkhFTFBfSUQ7Ci0JICAgIAotCSAgICBpZiAoSURpYWxvZ0NvbnN0YW50cy5OT19UT19BTExfTEFCRUwuZXF1YWxzKGJ1dHRvbkxhYmVsKSkKLQkgICAgICAgIHJldHVybiBJRGlhbG9nQ29uc3RhbnRzLk5PX1RPX0FMTF9JRDsKLSAgICAgICAgCi0gICAgICAgIC8vICAgICAgICAgIE5vIFhYWF9MQUJFTCBpbiBJRGlhbG9nQ29uc3RhbnRzIGZvciB0aGVzZS4gVW5saWtlbHkKLSAgICAgICAgLy8gICAgICAgICAgICB0aGV5IHdvdWxkIGJlIHVzZWQgaW4gYSBtZXNzYWdlIGRpYWxvZyB0aG91Z2guCi0gICAgICAgIC8vICAgICAgICAJcHVibGljIGludCBERVRBSUxTX0lEID0gMTM7Ci0gICAgICAgIC8vICAgICAgICAJcHVibGljIGludCBTRUxFQ1RfQUxMX0lEID0gMTg7Ci0gICAgICAgIC8vICAgICAgICAJcHVibGljIGludCBERVNFTEVDVF9BTExfSUQgPSAxOTsKLSAgICAgICAgLy8gICAgICAgIAlwdWJsaWMgaW50IFNFTEVDVF9UWVBFU19JRCA9IDIwOwotCi0JICAgIHJldHVybiBkZWZhdWx0SWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9QYWdlQ2hhbmdlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL1BhZ2VDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyYjJiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL1BhZ2VDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogRXZlbnQgb2JqZWN0IGRlc2NyaWJpbmcgYSBwYWdlIHNlbGVjdGlvbiBjaGFuZ2UuIFRoZSBzb3VyY2Ugb2YgdGhlc2UgZXZlbnRzCi0gKiBpcyBhIHBhZ2UgY2hhbmdlIHByb3ZpZGVyLgotICogCi0gKiBAc2VlIElQYWdlQ2hhbmdlUHJvdmlkZXIKLSAqIEBzZWUgSVBhZ2VDaGFuZ2VkTGlzdGVuZXIKLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUGFnZUNoYW5nZWRFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQotCS8qKgotCSAqIEdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQgZm9yIHRoaXMgY2xhc3MuCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM4MzUxNDk1NDU1MTk3MjM1NzRMOwotCi0JLyoqCi0JICogVGhlIHNlbGVjdGVkIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzZWxlY3RlZFBhZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGV2ZW50IGZvciB0aGUgZ2l2ZW4gc291cmNlIGFuZCBzZWxlY3RlZCBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIGNoYW5nZSBwcm92aWRlcgotCSAqIEBwYXJhbSBzZWxlY3RlZFBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBzZWxlY3RlZCBwYWdlLiBJbiB0aGUgSkZhY2UgcHJvdmlkZWQgZGlhbG9ncyB0aGlzCi0JICogICAgICAgICAgICB3aWxsIGJlIGFuIDxjb2RlPklEaWFsb2dQYWdlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUGFnZUNoYW5nZWRFdmVudChJUGFnZUNoYW5nZVByb3ZpZGVyIHNvdXJjZSwKLQkJCU9iamVjdCBzZWxlY3RlZFBhZ2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChzZWxlY3RlZFBhZ2UpOwotCQl0aGlzLnNlbGVjdGVkUGFnZSA9IHNlbGVjdGVkUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIHBhZ2UuIEluIGRpYWxvZ3MgaW1wbGVtZW50ZWQgYnkgSkZhY2UsIAotCSAqIAkJdGhpcyB3aWxsIGJlIGFuIDxjb2RlPklEaWFsb2dQYWdlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkUGFnZSgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWdlIGNoYW5nZSBwcm92aWRlciB0aGF0IGlzIHRoZSBzb3VyY2Ugb2YgdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcmlnaW5hdGluZyBwYWdlIGNoYW5nZSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBJUGFnZUNoYW5nZVByb3ZpZGVyIGdldFBhZ2VDaGFuZ2VQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJUGFnZUNoYW5nZVByb3ZpZGVyKSBnZXRTb3VyY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL1BvcHVwRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL1BvcHVwRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NzAzYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9Qb3B1cERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmFja2VyOwotCi0vKioKLSAqIEEgbGlnaHR3ZWlnaHQsIHRyYW5zaWVudCBkaWFsb2cgdGhhdCBpcyBwb3BwZWQgdXAgdG8gc2hvdyBjb250ZXh0dWFsIG9yCi0gKiB0ZW1wb3JhbCBpbmZvcm1hdGlvbiBhbmQgaXMgZWFzaWx5IGRpc21pc3NlZC4gQ2xpZW50cyBjb250cm9sIHdoZXRoZXIgdGhlCi0gKiBkaWFsb2cgc2hvdWxkIGJlIGFibGUgdG8gcmVjZWl2ZSBpbnB1dCBmb2N1cy4gQW4gb3B0aW9uYWwgdGl0bGUgYXJlYSBhdCB0aGUKLSAqIHRvcCBhbmQgYW4gb3B0aW9uYWwgaW5mbyBhcmVhIGF0IHRoZSBib3R0b20gY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsCi0gKiBpbmZvcm1hdGlvbi4KLSAqIDxwPgotICogQmVjYXVzZSB0aGUgZGlhbG9nIGlzIHNob3J0LWxpdmVkLCBtb3N0IG9mIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBkaWFsb2cgaXMKLSAqIGRvbmUgaW4gdGhlIGNvbnN0cnVjdG9yLiBTZXQgbWV0aG9kcyBhcmUgb25seSBwcm92aWRlZCBmb3IgdGhvc2UgdmFsdWVzIHRoYXQKLSAqIGFyZSBleHBlY3RlZCB0byBiZSBkeW5hbWljYWxseSBjb21wdXRlZCBiYXNlZCBvbiBhIHBhcnRpY3VsYXIgaW5zdGFuY2UncwotICogaW50ZXJuYWwgc3RhdGUuCi0gKiA8cD4KLSAqIENsaWVudHMgYXJlIGV4cGVjdGVkIHRvIG92ZXJyaWRlIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWFpbiBkaWFsb2cgYXJlYSwgYW5kCi0gKiBtYXkgb3B0aW9uYWxseSBvdmVycmlkZSB0aGUgY3JlYXRpb24gb2YgdGhlIHRpdGxlIGFyZWEgYW5kIGluZm8gYXJlYSBpbiBvcmRlcgotICogdG8gYWRkIGNvbnRlbnQuIEluIGdlbmVyYWwsIGhvd2V2ZXIsIHRoZSBjcmVhdGlvbiBvZiBzdHlsaXN0aWMgZmVhdHVyZXMsIHN1Y2gKLSAqIGFzIHRoZSBkaWFsb2cgbWVudSwgc2VwYXJhdG9yIHN0eWxlcywgYW5kIGZvbnRzLCBpcyBrZXB0IHByaXZhdGUgc28gdGhhdCBhbGwKLSAqIHBvcHVwIGRpYWxvZ3Mgd2lsbCBoYXZlIGEgc2ltaWxhciBhcHBlYXJhbmNlLgotICogCi0gKiBOb3RlOiBUaGlzIEFQSSBpcyBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbC4gSXQgaXMgc3RpbGwgZXZvbHZpbmcgZHVyaW5nIDMuMgotICogYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlLiBJdCBpcyBiZWluZyByZWxlYXNlZCB0byBvYnRhaW4gZmVlZGJhY2sgZnJvbSBlYXJseQotICogYWRvcHRlcnMuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFBvcHVwRGlhbG9nIGV4dGVuZHMgV2luZG93IHsKLQotCS8qKgotCSAqIFRoZSBkaWFsb2cgc2V0dGluZ3Mga2V5IG5hbWUgZm9yIHN0b3JlZCBkaWFsb2cgeCBsb2NhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX09SSUdJTl9YID0gIkRJQUxPR19YX09SSUdJTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBkaWFsb2cgc2V0dGluZ3Mga2V5IG5hbWUgZm9yIHN0b3JlZCBkaWFsb2cgeSBsb2NhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX09SSUdJTl9ZID0gIkRJQUxPR19ZX09SSUdJTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBkaWFsb2cgc2V0dGluZ3Mga2V5IG5hbWUgZm9yIHN0b3JlZCBkaWFsb2cgd2lkdGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19XSURUSCA9ICJESUFMT0dfV0lEVEgiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGlhbG9nIHNldHRpbmdzIGtleSBuYW1lIGZvciBzdG9yZWQgZGlhbG9nIGhlaWdodC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0hFSUdIVCA9ICJESUFMT0dfSEVJR0hUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGRpYWxvZyBzZXR0aW5ncyBrZXkgbmFtZSBmb3IgcmVtZW1iZXJpbmcgaWYgdGhlIHBlcnNpc3RlZCBib3VuZHMKLQkgKiBzaG91bGQgYmUgYWNjZXNzZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19VU0VfUEVSU0lTVEVEX0JPVU5EUyA9ICJESUFMT0dfVVNFX1BFUlNJU1RFRF9CT1VORFMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBNb3ZlIGFjdGlvbiBmb3IgdGhlIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIE1vdmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JCU1vdmVBY3Rpb24oKSB7Ci0JCQlzdXBlcihKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIlBvcHVwRGlhbG9nLm1vdmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXBlcmZvcm1UcmFja2VyQWN0aW9uKFNXVC5OT05FKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmVzaXplIGFjdGlvbiBmb3IgdGhlIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlc2l6ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQkJUmVzaXplQWN0aW9uKCkgewotCQkJc3VwZXIoSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQb3B1cERpYWxvZy5yZXNpemUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJcGVyZm9ybVRyYWNrZXJBY3Rpb24oU1dULlJFU0laRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZW1lbWJlciBib3VuZHMgYWN0aW9uIGZvciB0aGUgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgY2xhc3MgUGVyc2lzdEJvdW5kc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQkJUGVyc2lzdEJvdW5kc0FjdGlvbigpIHsKLQkJCXN1cGVyKEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiUG9wdXBEaWFsb2cucGVyc2lzdEJvdW5kcyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUlBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKLQkJCXNldENoZWNrZWQocGVyc2lzdEJvdW5kcyk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlwZXJzaXN0Qm91bmRzID0gaXNDaGVja2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaGVsbCBzdHlsZSBhcHByb3ByaWF0ZSBmb3IgYSBzaW1wbGUgaG92ZXIgcG9wdXAgdGhhdCBjYW5ub3QgZ2V0IGZvY3VzLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhPVkVSX1NIRUxMU1RZTEUgPSBTV1QuTk9fRk9DVVMgfCBTV1QuT05fVE9QCi0JCQl8IFNXVC5OT19UUklNOwotCi0JLyoqCi0JICogU2hlbGwgc3R5bGUgYXBwcm9wcmlhdGUgZm9yIGFuIGluZm8gcG9wdXAgdGhhdCBjYW4gZ2V0IGZvY3VzLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElORk9QT1BVUF9TSEVMTFNUWUxFID0gU1dULk5PX1RSSU07Ci0KLQkvKioKLQkgKiBTaGVsbCBzdHlsZSBhcHByb3ByaWF0ZSBmb3IgYSByZXNpemFibGUgaW5mbyBwb3B1cCB0aGF0IGNhbiBnZXQgZm9jdXMuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5GT1BPUFVQUkVTSVpFX1NIRUxMU1RZTEUgPSBTV1QuUkVTSVpFOwotCi0JLyoqCi0JICogTWFyZ2luIHdpZHRoIChpbiBwaXhlbHMpIHRvIGJlIHVzZWQgaW4gbGF5b3V0cyBpbnNpZGUgcG9wdXAgZGlhbG9ncwotCSAqICh2YWx1ZSBpcyAwKS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQT1BVUF9NQVJHSU5XSURUSCA9IDA7Ci0KLQkvKioKLQkgKiBNYXJnaW4gaGVpZ2h0IChpbiBwaXhlbHMpIHRvIGJlIHVzZWQgaW4gbGF5b3V0cyBpbnNpZGUgcG9wdXAgZGlhbG9ncwotCSAqICh2YWx1ZSBpcyAwKS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQT1BVUF9NQVJHSU5IRUlHSFQgPSAwOwotCi0JLyoqCi0JICogVmVydGljYWwgc3BhY2luZyAoaW4gcGl4ZWxzKSBiZXR3ZWVuIGNlbGxzIGluIHRoZSBsYXlvdXRzIGluc2lkZSBwb3B1cAotCSAqIGRpYWxvZ3MgKHZhbHVlIGlzIDEpLiAgCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUE9QVVBfVkVSVElDQUxTUEFDSU5HID0gMTsKLQotCS8qKgotCSAqIFZlcnRpY2FsIHNwYWNpbmcgKGluIHBpeGVscykgYmV0d2VlbiBjZWxscyBpbiB0aGUgbGF5b3V0cyBpbnNpZGUgcG9wdXAKLQkgKiBkaWFsb2dzICh2YWx1ZSBpcyAxKS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQT1BVUF9IT1JJWk9OVEFMU1BBQ0lORyA9IDE7Ci0KLQkvKioKLQkgKiBCb3JkZXIgdGhpY2tuZXNzIGluIHBpeGVscy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQk9SREVSX1RISUNLTkVTUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZGlhbG9nJ3MgdG9vbGJhciBmb3IgdGhlIG1vdmUgYW5kIHJlc2l6ZSBjYXBhYmlsaXRpZXMuCi0JICovCi0JcHJpdmF0ZSBUb29sQmFyIHRvb2xCYXIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRpYWxvZydzIG1lbnUgbWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjb250cm9sIHJlcHJlc2VudGluZyB0aGUgbWFpbiBkaWFsb2cgYXJlYS4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2wgZGlhbG9nQXJlYTsKLQotCS8qKgotCSAqIExhYmVscyB0aGF0IGNvbnRhaW4gdGl0bGUgYW5kIGluZm8gdGV4dC4gQ2FjaGVkIHNvIHRoZXkgY2FuIGJlIHVwZGF0ZWQKLQkgKiBkeW5hbWljYWxseSBpZiBwb3NzaWJsZS4KLQkgKi8KLQlwcml2YXRlIExhYmVsIHRpdGxlTGFiZWwsIGluZm9MYWJlbDsKLQotCS8qKgotCSAqIFNlcGFyYXRvciBjb250cm9scy4gQ2FjaGVkIHNvIHRoZXkgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gY29sb3IgY2hhbmdlcy4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2wgdGl0bGVTZXBhcmF0b3IsIGluZm9TZXBhcmF0b3I7Ci0KLQkvKioKLQkgKiBUaGUgaW1hZ2VzIGZvciB0aGUgZGlhbG9nIG1lbnUuCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBtZW51SW1hZ2UsIGRpc2FibGVkTWVudUltYWdlID0gbnVsbDsKLQotCS8qKgotCSAqIEZvbnQgdG8gYmUgdXNlZCBmb3IgdGhlIGluZm8gYXJlYSB0ZXh0LiBDb21wdXRlZCBiYXNlZCBvbiB0aGUgZGlhbG9nJ3MKLQkgKiBmb250LgotCSAqLwotCXByaXZhdGUgRm9udCBpbmZvRm9udDsKLQkKLQkvKioKLQkgKiBGb250IHRvIGJlIHVzZWQgZm9yIHRoZSB0aXRsZSBhcmVhIHRleHQuIENvbXB1dGVkIGJhc2VkIG9uIHRoZSBkaWFsb2cncwotCSAqIGZvbnQuCi0JICovCi0JcHJpdmF0ZSBGb250IHRpdGxlRm9udDsKLQotCS8qKgotCSAqIEZsYWdzIGluZGljYXRpbmcgd2hldGhlciB3ZSBhcmUgbGlzdGVuaW5nIGZvciBzaGVsbCBkZWFjdGl2YXRlIGV2ZW50cywKLQkgKiBlaXRoZXIgdGhvc2Ugb3Igb3VyIHBhcmVudCdzLiBVc2VkIHRvIHByZXZlbnQgY2xvc3VyZSB3aGVuIGEgbWVudSBjb21tYW5kCi0JICogaXMgY2hvc2VuIG9yIGEgc2Vjb25kYXJ5IHBvcHVwIGlzIGxhdW5jaGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5Ub0RlYWN0aXZhdGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuVG9QYXJlbnREZWFjdGl2YXRlOwotCQotCXByaXZhdGUgTGlzdGVuZXIgcGFyZW50RGVhY3RpdmF0ZUxpc3RlbmVyOwkKLQotCS8qKgotCSAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGZvY3VzIHNob3VsZCBiZSB0YWtlbiB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbmVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB0YWtlRm9jdXNPbk9wZW4gPSBmYWxzZTsKLQotCS8qKgotCSAqIEZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIGEgbWVudSBzaG91bGQgYmUgc2hvd24gdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8KLQkgKiBtb3ZlIGFuZCByZXNpemUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3dEaWFsb2dNZW51ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBGbGFnIHNwZWNpZnlpbmcgd2hldGhlciBhIG1lbnUgYWN0aW9uIGFsbG93aW5nIHRoZSB1c2VyIHRvIGNob29zZSB3aGV0aGVyCi0JICogdGhlIGRpYWxvZyBib3VuZHMgc2hvdWxkIGJlIHBlcnNpc3RlZCBpcyB0byBiZSBzaG93bi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1BlcnNpc3RBY3Rpb24gPSBmYWxzZTsKLQotCS8qKgotCSAqIEZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBib3VuZHMgb2YgdGhlIHBvcHVwIHNob3VsZCBiZSBwZXJzaXN0ZWQuIFRoaXMKLQkgKiBmbGFnIGlzIHVwZGF0ZWQgYnkgYSBtZW51IGlmIHRoZSBtZW51IGlzIHNob3duLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBwZXJzaXN0Qm91bmRzID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUZXh0IHRvIGJlIHNob3duIGluIGFuIG9wdGlvbmFsIHRpdGxlIGFyZWEgKG9uIHRvcCkuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGVUZXh0OwotCi0JLyoqCi0JICogVGV4dCB0byBiZSBzaG93biBpbiBhbiBvcHRpb25hbCBpbmZvIGFyZWEgKGF0IHRoZSBib3R0b20pLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGluZm9UZXh0OwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5Qb3B1cERpYWxvZzwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzaGVsbC4KLQkgKiBAcGFyYW0gc2hlbGxTdHlsZQotCSAqICAgICAgICAgICAgVGhlIHNoZWxsIHN0eWxlLgotCSAqIEBwYXJhbSB0YWtlRm9jdXNPbk9wZW4KLQkgKiAgICAgICAgICAgIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgZm9jdXMgc2hvdWxkIGJlIHRha2VuIGJ5IHRoaXMKLQkgKiAgICAgICAgICAgIHBvcHVwIHdoZW4gaXQgb3BlbnMuCi0JICogQHBhcmFtIHBlcnNpc3RCb3VuZHMKLQkgKiAgICAgICAgICAgIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGJvdW5kcyBzaG91bGQgYmUgcGVyc2lzdGVkCi0JICogICAgICAgICAgICB1cG9uIGNsb3NlIG9mIHRoZSBkaWFsb2cuIFRoZSBib3VuZHMgY2FuIG9ubHkgYmUgcGVyc2lzdGVkIGlmCi0JICogICAgICAgICAgICB0aGUgZGlhbG9nIHNldHRpbmdzIGZvciBwZXJzaXN0aW5nIHRoZSBib3VuZHMgYXJlIGFsc28KLQkgKiAgICAgICAgICAgIHNwZWNpZmllZC4gSWYgYSBtZW51IGFjdGlvbiB3aWxsIGJlIHByb3ZpZGVkIHRoYXQgYWxsb3dzIHRoZQotCSAqICAgICAgICAgICAgdXNlciB0byBjb250cm9sIHRoaXMgZmVhdHVyZSwgdGhlbiB0aGUgbGFzdCBrbm93biB2YWx1ZSBvZiB0aGUKLQkgKiAgICAgICAgICAgIHVzZXIncyBzZXR0aW5nIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoaXMgZmxhZy4KLQkgKiBAcGFyYW0gc2hvd0RpYWxvZ01lbnUKLQkgKiAgICAgICAgICAgIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBtZW51IGZvciBtb3ZpbmcgYW5kIHJlc2l6aW5nCi0JICogICAgICAgICAgICB0aGUgcG9wdXAgc2hvdWxkIGJlIHByb3ZpZGVkLgotCSAqIEBwYXJhbSBzaG93UGVyc2lzdEFjdGlvbgotCSAqICAgICAgICAgICAgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbiBhY3Rpb24gYWxsb3dpbmcgdGhlIHVzZXIgdG8KLQkgKiAgICAgICAgICAgIGNvbnRyb2wgdGhlIHBlcnNpc3Rpbmcgb2YgdGhlIGRpYWxvZyBib3VuZHMgc2hvdWxkIGJlIHNob3duIGluCi0JICogICAgICAgICAgICB0aGUgZGlhbG9nIG1lbnUuIFRoaXMgcGFyYW1ldGVyIGhhcyBubyBlZmZlY3QgaWYKLQkgKiAgICAgICAgICAgIDxjb2RlPnNob3dEaWFsb2dNZW51PC9jb2RlPiBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogQHBhcmFtIHRpdGxlVGV4dAotCSAqICAgICAgICAgICAgVGV4dCB0byBiZSBzaG93biBpbiBhbiB1cHBlciB0aXRsZSBhcmVhLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gdGl0bGUuCi0JICogQHBhcmFtIGluZm9UZXh0Ci0JICogICAgICAgICAgICBUZXh0IHRvIGJlIHNob3duIGluIGEgbG93ZXIgaW5mbyBhcmVhLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gaW5mbyBhcmVhLgotCSAqIAotCSAqIEBzZWUgUG9wdXBEaWFsb2cjZ2V0RGlhbG9nU2V0dGluZ3MoKQotCSAqLwotCXB1YmxpYyBQb3B1cERpYWxvZyhTaGVsbCBwYXJlbnQsIGludCBzaGVsbFN0eWxlLCBib29sZWFuIHRha2VGb2N1c09uT3BlbiwKLQkJCWJvb2xlYW4gcGVyc2lzdEJvdW5kcywgYm9vbGVhbiBzaG93RGlhbG9nTWVudSwKLQkJCWJvb2xlYW4gc2hvd1BlcnNpc3RBY3Rpb24sIFN0cmluZyB0aXRsZVRleHQsIFN0cmluZyBpbmZvVGV4dCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlzZXRTaGVsbFN0eWxlKHNoZWxsU3R5bGUpOwotCQl0aGlzLnRha2VGb2N1c09uT3BlbiA9IHRha2VGb2N1c09uT3BlbjsKLQkJdGhpcy5zaG93RGlhbG9nTWVudSA9IHNob3dEaWFsb2dNZW51OwotCQl0aGlzLnNob3dQZXJzaXN0QWN0aW9uID0gc2hvd1BlcnNpc3RBY3Rpb247Ci0JCXRoaXMudGl0bGVUZXh0ID0gdGl0bGVUZXh0OwotCQl0aGlzLmluZm9UZXh0ID0gaW5mb1RleHQ7Ci0KLQkJc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotCi0JCXRoaXMucGVyc2lzdEJvdW5kcyA9IHBlcnNpc3RCb3VuZHM7Ci0JCWluaXRpYWxpemVXaWRnZXRTdGF0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChTaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlHcmlkTGF5b3V0IGxheW91dDsKLQkJRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotCQlzaGVsbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0KLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlpbnQgYm9yZGVyID0gKChnZXRTaGVsbFN0eWxlKCkgJiBTV1QuTk9fVFJJTSkgPT0gMCkgPyAwCi0JCQkJOiBCT1JERVJfVEhJQ0tORVNTOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gYm9yZGVyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBib3JkZXI7Ci0JCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCi0JCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCS8qCi0JCQkJICogQ2xvc2UgaWYgd2UgYXJlIGRlYWN0aXZhdGluZyBhbmQgaGF2ZSBubyBjaGlsZCBzaGVsbHMuIElmIHdlCi0JCQkJICogaGF2ZSBjaGlsZCBzaGVsbHMsIHdlIGFyZSBkZWFjdGl2YXRpbmcgZHVlIHRvIHRoZWlyIG9wZW5pbmcuCi0JCQkJICogT24gWCwgd2UgcmVjZWl2ZSB0aGlzIHdoZW4gYSBtZW51IGNoaWxkIChzdWNoIGFzIHRoZSBzeXN0ZW0KLQkJCQkgKiBtZW51KSBvZiB0aGUgc2hlbGwgb3BlbnMsIGJ1dCBJIGhhdmUgbm90IGZvdW5kIGEgd2F5IHRvCi0JCQkJICogZGlzdGluZ3Vpc2ggdGhhdCBjYXNlIGhlcmUuIEhlbmNlIGJ1ZyAjMTEzNTc3IHN0aWxsIGV4aXN0cy4KLQkJCQkgKi8KLQkJCQlpZiAobGlzdGVuVG9EZWFjdGl2YXRlICYmIGV2ZW50LndpZGdldCA9PSBnZXRTaGVsbCgpCi0JCQkJCQkmJiBnZXRTaGVsbCgpLmdldFNoZWxscygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCWNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJLy8gU2V0IHRoaXMgdHJ1ZSB3aGVuZXZlciB3ZSBhY3RpdmF0ZS4gSXQgbWF5IGhhdmUgYmVlbiB0dXJuZWQKLQkJLy8gb2ZmIGJ5IGEgbWVudSBvciBzZWNvbmRhcnkgcG9wdXAgc2hvd2luZy4KLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCS8vIGlnbm9yZSB0aGlzIGV2ZW50IGlmIHdlIGhhdmUgbGF1bmNoZWQgYSBjaGlsZAotCQkJCWlmIChldmVudC53aWRnZXQgPT0gZ2V0U2hlbGwoKQotCQkJCQkJJiYgZ2V0U2hlbGwoKS5nZXRTaGVsbHMoKS5sZW5ndGggPT0gMCkgewotCQkJCQlsaXN0ZW5Ub0RlYWN0aXZhdGUgPSB0cnVlOwotCQkJCQkvLyBUeXBpY2FsbHkgd2Ugc3RhcnQgbGlzdGVuaW5nIGZvciBwYXJlbnQgZGVhY3RpdmF0ZSBhZnRlcgotCQkJCQkvLyB3ZSBhcmUgYWN0aXZhdGVkLCBleGNlcHQgb24gdGhlIE1hYywgd2hlcmUgdGhlIGRlYWN0aXZhdGUKLQkJCQkJLy8gaXMgcmVjZWl2ZWQgYWZ0ZXIgYWN0aXZhdGUuCi0JCQkJCS8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAwNjY4Ci0JCQkJCWxpc3RlblRvUGFyZW50RGVhY3RpdmF0ZSA9ICEiY2FyYm9uIi5lcXVhbHMoU1dULmdldFBsYXRmb3JtKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlpZiAoKGdldFNoZWxsU3R5bGUoKSAmIFNXVC5PTl9UT1ApICE9IDAgJiYgc2hlbGwuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQkJcGFyZW50RGVhY3RpdmF0ZUxpc3RlbmVyPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGxpc3RlblRvUGFyZW50RGVhY3RpdmF0ZSkgewotCQkJCQkJY2xvc2UoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIE91ciBmaXJzdCBkZWFjdGl2YXRlLCBub3cgc3RhcnQgbGlzdGVuaW5nIG9uIHRoZSBNYWMuCi0JCQkJCQlsaXN0ZW5Ub1BhcmVudERlYWN0aXZhdGUgPSBsaXN0ZW5Ub0RlYWN0aXZhdGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJc2hlbGwuZ2V0UGFyZW50KCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHBhcmVudERlYWN0aXZhdGVMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlRGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+UG9wdXBEaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+V2luZG93PC9jb2RlPgotCSAqIG1ldGhvZCBjcmVhdGVzIGFuZCBsYXlzIG91dCB0aGUgdG9wIGxldmVsIGNvbXBvc2l0ZSBmb3IgdGhlIGRpYWxvZy4gSXQKLQkgKiB0aGVuIGNhbGxzIHRoZSA8Y29kZT5jcmVhdGVUaXRsZU1lbnVBcmVhPC9jb2RlPiwKLQkgKiA8Y29kZT5jcmVhdGVEaWFsb2dBcmVhPC9jb2RlPiwgYW5kIDxjb2RlPmNyZWF0ZUluZm9UZXh0QXJlYTwvY29kZT4KLQkgKiBtZXRob2RzIHRvIGNyZWF0ZSBhbiBvcHRpb25hbCB0aXRsZSBhbmQgbWVudSBhcmVhIG9uIHRoZSB0b3AsIGEgZGlhbG9nCi0JICogYXJlYSBpbiB0aGUgY2VudGVyLCBhbmQgYW4gb3B0aW9uYWwgaW5mbyB0ZXh0IGFyZWEgYXQgdGhlIGJvdHRvbS4KLQkgKiBPdmVycmlkaW5nIDxjb2RlPmNyZWF0ZURpYWxvZ0FyZWE8L2NvZGU+IGFuZCAob3B0aW9uYWxseSkKLQkgKiA8Y29kZT5jcmVhdGVUaXRsZU1lbnVBcmVhPC9jb2RlPiBhbmQgPGNvZGU+Y3JlYXRlVGl0bGVNZW51QXJlYTwvY29kZT4KLQkgKiBhcmUgcmVjb21tZW5kZWQgcmF0aGVyIHRoYW4gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgY29tcG9zaXRlIHVzZWQgdG8gcGFyZW50IHRoZSBjb250ZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250cm9sIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBQT1BVUF9NQVJHSU5IRUlHSFQ7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IFBPUFVQX01BUkdJTldJRFRIOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gUE9QVVBfVkVSVElDQUxTUEFDSU5HOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBQT1BVUF9IT1JJWk9OVEFMU1BBQ0lORzsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLy8gVGl0bGUgYXJlYQotCQlpZiAoaGFzVGl0bGVBcmVhKCkpIHsKLQkJCWNyZWF0ZVRpdGxlTWVudUFyZWEoY29tcG9zaXRlKTsKLQkJCXRpdGxlU2VwYXJhdG9yID0gY3JlYXRlSG9yaXpvbnRhbFNlcGFyYXRvcihjb21wb3NpdGUpOwotCQl9Ci0JCS8vIENvbnRlbnQKLQkJZGlhbG9nQXJlYSA9IGNyZWF0ZURpYWxvZ0FyZWEoY29tcG9zaXRlKTsKLQkJLy8gQ3JlYXRlIGEgZ3JpZCBkYXRhIGxheW91dCBkYXRhIGlmIG9uZSB3YXMgbm90IHByb3ZpZGVkLgotCQkvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODAyNQotCQlpZiAoZGlhbG9nQXJlYS5nZXRMYXlvdXREYXRhKCkgPT0gbnVsbCkgewotCQkJZGlhbG9nQXJlYS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJfQotCQkKLQkJLy8gSW5mbyBmaWVsZAotCQlpZiAoaGFzSW5mb0FyZWEoKSkgewotCQkJaW5mb1NlcGFyYXRvciA9IGNyZWF0ZUhvcml6b250YWxTZXBhcmF0b3IoY29tcG9zaXRlKTsKLQkJCWNyZWF0ZUluZm9UZXh0QXJlYShjb21wb3NpdGUpOwotCQl9Ci0KLQkJYXBwbHlDb2xvcnMoY29tcG9zaXRlKTsKLQkJYXBwbHlGb250cyhjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaWFsb2cgKHRoZSBhcmVhIGJlbG93IHRoZSB0aXRsZQotCSAqIGFyZWEgYW5kIGFib3ZlIHRoZSBpbmZvIHRleHQgYXJlYS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+UG9wdXBEaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZAotCSAqIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoIHN0YW5kYXJkIG1hcmdpbnMKLQkgKiBhbmQgc3BhY2luZy4KLQkgKiA8cD4KLQkgKiBUaGUgcmV0dXJuZWQgY29udHJvbCdzIGxheW91dCBkYXRhIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YKLQkgKiA8Y29kZT5HcmlkRGF0YTwvY29kZT4uIFRoaXMgbWV0aG9kIG11c3Qgbm90IG1vZGlmeSB0aGUgcGFyZW50J3MKLQkgKiBsYXlvdXQuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGJ1dCBtYXkgY2FsbCA8Y29kZT5zdXBlcjwvY29kZT4gYXMKLQkgKiBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCSAqIC8vYWRkIGNvbnRyb2xzIHRvIGNvbXBvc2l0ZSBhcyBuZWNlc3NhcnkKLQkgKiByZXR1cm4gY29tcG9zaXRlOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGRpYWxvZyBhcmVhCi0JICogQHJldHVybiB0aGUgZGlhbG9nIGFyZWEgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gUE9QVVBfTUFSR0lOSEVJR0hUOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBQT1BVUF9NQVJHSU5XSURUSDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFBPUFVQX1ZFUlRJQ0FMU1BBQ0lORzsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gUE9QVVBfSE9SSVpPTlRBTFNQQUNJTkc7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRyb2wgdGhhdCBzaG91bGQgZ2V0IGluaXRpYWwgZm9jdXMuIFN1YmNsYXNzZXMgbWF5Ci0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHJldHVybiB0aGUgQ29udHJvbCB0aGF0IHNob3VsZCByZWNlaXZlIGZvY3VzIHdoZW4gdGhlIHBvcHVwIG9wZW5zLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGdldEZvY3VzQ29udHJvbCgpIHsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGFiIG9yZGVyIGZvciB0aGUgcG9wdXAuIENsaWVudHMgc2hvdWxkIG92ZXJyaWRlIHRvIGludHJvZHVjZQotCSAqIHNwZWNpZmljIHRhYiBvcmRlcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgY29tcG9zaXRlIGluIHdoaWNoIGFsbCBjb250ZW50LCBpbmNsdWRpbmcgdGhlIHRpdGxlIGFyZWEKLQkgKiAgICAgICAgICAgIGFuZCBpbmZvIGFyZWEsIHdhcyBjcmVhdGVkLiBUaGlzIGNvbXBvc2l0ZSdzIHBhcmVudCBpcyB0aGUKLQkgKiAgICAgICAgICAgIHNoZWxsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFRhYk9yZGVyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwb3B1cCBzaG91bGQgaGF2ZSBhIHRpdGxlIGFyZWEKLQkgKiBhdCB0aGUgdG9wIG9mIHRoZSBkaWFsb2cuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvCi0JICogaGF2ZSBhIHRpdGxlIGFyZWEgaWYgdGhlcmUgaXMgdG8gYmUgYSBtZW51IG9yIHRpdGxlIHRleHQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHRpdGxlIGFyZWEgc2hvdWxkIGJlIGNyZWF0ZWQsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgc2hvdWxkIG5vdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNUaXRsZUFyZWEoKSB7Ci0JCXJldHVybiB0aXRsZVRleHQgIT0gbnVsbCB8fCBzaG93RGlhbG9nTWVudTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBvcHVwIHNob3VsZCBoYXZlIGFuIGluZm8gYXJlYQotCSAqIGF0IHRoZSBib3R0b20gb2YgdGhlIGRpYWxvZy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuIERlZmF1bHQgYmVoYXZpb3IgaXMKLQkgKiB0byBoYXZlIGFuIGluZm8gYXJlYSBpZiBpbmZvIHRleHQgd2FzIHByb3ZpZGVkIGF0IHRoZSB0aW1lIG9mIGNyZWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSB0aXRsZSBhcmVhIHNob3VsZCBiZSBjcmVhdGVkLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHNob3VsZCBub3QuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzSW5mb0FyZWEoKSB7Ci0JCXJldHVybiBpbmZvVGV4dCAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRpdGxlIGFuZCBtZW51IGFyZWEuIFN1YmNsYXNzZXMgdHlwaWNhbGx5IG5lZWQgbm90IG92ZXJyaWRlCi0JICogdGhpcyBtZXRob2QsIGJ1dCBpbnN0ZWFkIHNob3VsZCB1c2UgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMKLQkgKiA8Y29kZT5zaG93RGlhbG9nTWVudTwvY29kZT4gYW5kIDxjb2RlPnNob3dQZXJzaXN0QWN0aW9uPC9jb2RlPiB0bwotCSAqIGluZGljYXRlIHdoZXRoZXIgYSBtZW51IHNob3VsZCBiZSBzaG93biwgYW5kCi0JICogPGNvZGU+Y3JlYXRlVGl0bGVDb250cm9sPC9jb2RlPiB0byB0byBjdXN0b21pemUgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUKLQkgKiB0aXRsZS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBJZiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuLCB0aGUgcmV0dXJuZWQgY29udHJvbCdzIGxheW91dCBkYXRhIG11c3QgYmUKLQkgKiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5HcmlkRGF0YTwvY29kZT4uIFRoaXMgbWV0aG9kIG11c3Qgbm90IG1vZGlmeSB0aGUKLQkgKiBwYXJlbnQncyBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHJldHVybiBUaGUgQ29udHJvbCByZXByZXNlbnRpbmcgdGhlIHRpdGxlIGFuZCBtZW51IGFyZWEuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlVGl0bGVNZW51QXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIHRpdGxlQXJlYUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gUE9QVVBfTUFSR0lOSEVJR0hUOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBQT1BVUF9NQVJHSU5XSURUSDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFBPUFVQX1ZFUlRJQ0FMU1BBQ0lORzsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gUE9QVVBfSE9SSVpPTlRBTFNQQUNJTkc7Ci0JCXRpdGxlQXJlYUNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGl0bGVBcmVhQ29tcG9zaXRlCi0JCQkJLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWNyZWF0ZVRpdGxlQ29udHJvbCh0aXRsZUFyZWFDb21wb3NpdGUpOwotCi0JCWlmIChzaG93RGlhbG9nTWVudSkgewotCQkJY3JlYXRlRGlhbG9nTWVudSh0aXRsZUFyZWFDb21wb3NpdGUpOwotCQl9Ci0JCXJldHVybiB0aXRsZUFyZWFDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbCB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGlhbG9nJ3MgdGl0bGUgdGV4dC4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBpZiBhIGRpZmZlcmVudCBjb250cm9sIGlzIGRlc2lyZWQgZm9yCi0JICogcmVwcmVzZW50aW5nIHRoZSB0aXRsZSB0ZXh0LCBvciBpZiBzb21ldGhpbmcgZGlmZmVyZW50IHRoYW4gdGhlIHRpdGxlCi0JICogc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBsb2NhdGlvbiB3aGVyZSB0aGUgdGl0bGUgdGV4dCB0eXBpY2FsbHkgaXMgc2hvd24uCi0JICogCi0JICogPHA+Ci0JICogSWYgdGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiwgdGhlIHJldHVybmVkIGNvbnRyb2wncyBsYXlvdXQgZGF0YSBtdXN0IGJlCi0JICogYW4gaW5zdGFuY2Ugb2YgPGNvZGU+R3JpZERhdGE8L2NvZGU+LiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBtb2RpZnkgdGhlCi0JICogcGFyZW50J3MgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEByZXR1cm4gVGhlIENvbnRyb2wgcmVwcmVzZW50aW5nIHRoZSB0aXRsZSBhcmVhLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZVRpdGxlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRpdGxlTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJaWYgKCFzaG93RGlhbG9nTWVudSkKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGl0bGVMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCUZvbnQgZm9udCA9IHRpdGxlTGFiZWwuZ2V0Rm9udCgpOwotCQlGb250RGF0YVtdIGZvbnREYXRhcyA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb250RGF0YXMubGVuZ3RoOyBpKyspCi0JCQlmb250RGF0YXNbaV0uc2V0U3R5bGUoU1dULkJPTEQpOwotCQl0aXRsZUZvbnQgPSBuZXcgRm9udCh0aXRsZUxhYmVsLmdldERpc3BsYXkoKSwgZm9udERhdGFzKTsKLQkJdGl0bGVMYWJlbC5zZXRGb250KHRpdGxlRm9udCk7Ci0JCQotCQlpZiAodGl0bGVUZXh0ICE9IG51bGwpIHsKLQkJCXRpdGxlTGFiZWwuc2V0VGV4dCh0aXRsZVRleHQpOwotCQl9Ci0JCXJldHVybiB0aXRsZUxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG9wdGlvbmFsIGluZm8gdGV4dCBhcmVhLiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBpZiB0aGUKLQkgKiA8Y29kZT5oYXNJbmZvQXJlYSgpPC9jb2RlPiBtZXRob2QgcmV0dXJucyB0cnVlLiBTdWJjbGFzc2VzIHR5cGljYWxseQotCSAqIG5lZWQgbm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBidXQgbWF5IGRvIHNvLgotCSAqIAotCSAqIDxwPgotCSAqIElmIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIHRoZSByZXR1cm5lZCBjb250cm9sJ3MgbGF5b3V0IGRhdGEgbXVzdCBiZQotCSAqIGFuIGluc3RhbmNlIG9mIDxjb2RlPkdyaWREYXRhPC9jb2RlPi4gVGhpcyBtZXRob2QgbXVzdCBub3QgbW9kaWZ5IHRoZQotCSAqIHBhcmVudCdzIGxheW91dC4KLQkgKiAKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIFRoZSBjb250cm9sIHJlcHJlc2VudGluZyB0aGUgaW5mbyB0ZXh0IGFyZWEuCi0JICogCi0JICogQHNlZSBQb3B1cERpYWxvZyNoYXNJbmZvQXJlYSgpCi0JICogQHNlZSBQb3B1cERpYWxvZyNjcmVhdGVUaXRsZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUluZm9UZXh0QXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIFN0YXR1cyBsYWJlbAotCQlpbmZvTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuUklHSFQpOwotCQlpbmZvTGFiZWwuc2V0VGV4dChpbmZvVGV4dCk7Ci0JCUZvbnQgZm9udCA9IGluZm9MYWJlbC5nZXRGb250KCk7Ci0JCUZvbnREYXRhW10gZm9udERhdGFzID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZvbnREYXRhcy5sZW5ndGg7IGkrKykKLQkJCWZvbnREYXRhc1tpXS5zZXRIZWlnaHQoZm9udERhdGFzW2ldLmdldEhlaWdodCgpICogOSAvIDEwKTsKLQkJaW5mb0ZvbnQgPSBuZXcgRm9udChpbmZvTGFiZWwuZ2V0RGlzcGxheSgpLCBmb250RGF0YXMpOwotCQlpbmZvTGFiZWwuc2V0Rm9udChpbmZvRm9udCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcKLQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWluZm9MYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJaW5mb0xhYmVsLnNldEZvcmVncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcigKLQkJCQlTV1QuQ09MT1JfV0lER0VUX0RBUktfU0hBRE9XKSk7Ci0JCXJldHVybiBpbmZvTGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgaG9yaXpvbnRhbCBzZXBhcmF0b3IgZm9yIHRoZSBnaXZlbiBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHJldHVybiBUaGUgQ29udHJvbCByZXByZXNlbnRpbmcgdGhlIGhvcml6b250YWwgc2VwYXJhdG9yLgotCSAqLwotCXByaXZhdGUgQ29udHJvbCBjcmVhdGVIb3Jpem9udGFsU2VwYXJhdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuTElORV9ET1QpOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBzZXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBkaWFsb2cncyBtZW51IGZvciB0aGUgbW92ZSBhbmQgcmVzaXplIGFjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURpYWxvZ01lbnUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihwYXJlbnQsIFNXVC5GTEFUKTsKLQkJVG9vbEl0ZW0gdmlld01lbnVCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gsIDApOwotCi0JCXRvb2xCYXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQotCQltZW51SW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoUG9wdXBEaWFsb2cuY2xhc3MsCi0JCQkJImltYWdlcy9wb3B1cF9tZW51LmdpZiIpLmNyZWF0ZUltYWdlKCk7Ly8kTk9OLU5MUy0xJAotCQlkaXNhYmxlZE1lbnVJbWFnZSA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShQb3B1cERpYWxvZy5jbGFzcywKLQkJCQkiaW1hZ2VzL3BvcHVwX21lbnVfZGlzYWJsZWQuZ2lmIikuY3JlYXRlSW1hZ2UoKTsvLyROT04tTkxTLTEkCi0JCXZpZXdNZW51QnV0dG9uLnNldEltYWdlKG1lbnVJbWFnZSk7Ci0JCXZpZXdNZW51QnV0dG9uLnNldERpc2FibGVkSW1hZ2UoZGlzYWJsZWRNZW51SW1hZ2UpOwotCQl2aWV3TWVudUJ1dHRvbi5zZXRUb29sVGlwVGV4dChKRmFjZVJlc291cmNlcwotCQkJCS5nZXRTdHJpbmcoIlBvcHVwRGlhbG9nLm1lbnVUb29sdGlwIikpOyAvLyROT04tTkxTLTEkCi0JCXZpZXdNZW51QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNob3dEaWFsb2dNZW51KCk7Ci0JCQl9Ci0JCX0pOwotCQl2aWV3TWVudUJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJbWVudUltYWdlLmRpc3Bvc2UoKTsKLQkJCQltZW51SW1hZ2UgPSBudWxsOwotCQkJCWRpc2FibGVkTWVudUltYWdlLmRpc3Bvc2UoKTsKLQkJCQlkaXNhYmxlZE1lbnVJbWFnZSA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEZpbGwgdGhlIGRpYWxvZydzIG1lbnUuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCBvciBvdmVycmlkZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlhbG9nTWVudQotCSAqICAgICAgICAgICAgVGhlIGRpYWxvZydzIG1lbnUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbERpYWxvZ01lbnUoSU1lbnVNYW5hZ2VyIGRpYWxvZ01lbnUpIHsKLQkJZGlhbG9nTWVudS5hZGQobmV3IEdyb3VwTWFya2VyKCJTeXN0ZW1NZW51U3RhcnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nTWVudS5hZGQobmV3IE1vdmVBY3Rpb24oKSk7Ci0JCWRpYWxvZ01lbnUuYWRkKG5ldyBSZXNpemVBY3Rpb24oKSk7Ci0JCWlmIChzaG93UGVyc2lzdEFjdGlvbikgewotCQkJZGlhbG9nTWVudS5hZGQobmV3IFBlcnNpc3RCb3VuZHNBY3Rpb24oKSk7Ci0JCX0KLQkJZGlhbG9nTWVudS5hZGQobmV3IFNlcGFyYXRvcigiU3lzdGVtTWVudUVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gdGhlIHJlcXVlc3RlZCB0cmFja2VyIGFjdGlvbiAocmVzaXplIG9yIG1vdmUpLgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIHRyYWNrIHN0eWxlIChyZXNpemUgb3IgbW92ZSkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1UcmFja2VyQWN0aW9uKGludCBzdHlsZSkgewotCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCWlmIChzaGVsbCA9PSBudWxsIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCQlUcmFja2VyIHRyYWNrZXIgPSBuZXcgVHJhY2tlcihzaGVsbC5nZXREaXNwbGF5KCksIHN0eWxlKTsKLQkJdHJhY2tlci5zZXRTdGlwcGxlZCh0cnVlKTsKLQkJUmVjdGFuZ2xlW10gciA9IG5ldyBSZWN0YW5nbGVbXSB7IHNoZWxsLmdldEJvdW5kcygpIH07Ci0JCXRyYWNrZXIuc2V0UmVjdGFuZ2xlcyhyKTsKLQotCQkvLyBJZ25vcmUgYW55IGRlYWN0aXZhdGUgZXZlbnRzIGNhdXNlZCBieSBvcGVuaW5nIHRoZSB0cmFja2VyLgotCQkvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDY1NgotCQlib29sZWFuIG9sZExpc3RlblRvRGVhY3RpdmF0ZSA9IGxpc3RlblRvRGVhY3RpdmF0ZTsKLQkJbGlzdGVuVG9EZWFjdGl2YXRlID0gZmFsc2U7Ci0JCWlmICh0cmFja2VyLm9wZW4oKSkgewotCQkJaWYgKHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCXNoZWxsLnNldEJvdW5kcyh0cmFja2VyLmdldFJlY3RhbmdsZXMoKVswXSk7Ci0JCQl9Ci0JCX0KLQkJbGlzdGVuVG9EZWFjdGl2YXRlID0gb2xkTGlzdGVuVG9EZWFjdGl2YXRlOwotCi0JfQotCi0JLyoqCi0JICogU2hvdyB0aGUgZGlhbG9nJ3MgbWVudS4gVGhpcyBtZXNzYWdlIGhhcyBubyBlZmZlY3QgaWYgdGhlIHJlY2VpdmVyIHdhcwotCSAqIG5vdCBjb25maWd1cmVkIHRvIHNob3cgYSBtZW51LiBDbGllbnRzIG1heSBjYWxsIHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvCi0JICogdHJpZ2dlciB0aGUgbWVudSB2aWEga2V5c3Ryb2tlcyBvciBvdGhlciBnZXN0dXJlcy4gU3ViY2xhc3NlcyB0eXBpY2FsbHkKLQkgKiBkbyBub3Qgb3ZlcnJpZGUgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dEaWFsb2dNZW51KCkgewotCQlpZiAoIXNob3dEaWFsb2dNZW51KQotCQkJcmV0dXJuOwotCi0JCWlmIChtZW51TWFuYWdlciA9PSBudWxsKSB7Ci0JCQltZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOwotCQkJZmlsbERpYWxvZ01lbnUobWVudU1hbmFnZXIpOwotCQl9Ci0JCS8vIFNldHRpbmcgdGhpcyBmbGFnIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gdGhhdCByZW1haW5zIG9uIFggb25seSwKLQkJLy8gd2hlcmVieSBhY3RpdmF0aW5nIHRoZSBtZW51IGRlYWN0aXZhdGVzIG91ciBzaGVsbC4KLQkJbGlzdGVuVG9EZWFjdGl2YXRlID0gISJndGsiLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlNZW51IG1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShnZXRTaGVsbCgpKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHRvb2xCYXIuZ2V0Qm91bmRzKCk7Ci0JCVBvaW50IHRvcExlZnQgPSBuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCk7Ci0JCXRvcExlZnQgPSBnZXRTaGVsbCgpLnRvRGlzcGxheSh0b3BMZWZ0KTsKLQkJbWVudS5zZXRMb2NhdGlvbih0b3BMZWZ0LngsIHRvcExlZnQueSk7Ci0JCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRleHQgdG8gYmUgc2hvd24gaW4gdGhlIHBvcHVwJ3MgaW5mbyBhcmVhLiBUaGlzIG1lc3NhZ2UgaGFzIG5vCi0JICogZWZmZWN0IGlmIHRoZXJlIHdhcyBubyBpbmZvIHRleHQgc3VwcGxpZWQgd2hlbiB0aGUgZGlhbG9nIGZpcnN0IG9wZW5lZC4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gYmUgc2hvd24gd2hlbiB0aGUgaW5mbyBhcmVhIGlzIGRpc3BsYXllZC4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbmZvVGV4dChTdHJpbmcgdGV4dCkgewotCQlpbmZvVGV4dCA9IHRleHQ7Ci0JCWlmIChpbmZvTGFiZWwgIT0gbnVsbCkKLQkJCWluZm9MYWJlbC5zZXRUZXh0KHRleHQpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGV4dCB0byBiZSBzaG93biBpbiB0aGUgcG9wdXAncyB0aXRsZSBhcmVhLiBUaGlzIG1lc3NhZ2UgaGFzIG5vCi0JICogZWZmZWN0IGlmIHRoZXJlIHdhcyBubyB0aXRsZSBsYWJlbCBzcGVjaWZpZWQgd2hlbiB0aGUgZGlhbG9nIHdhcwotCSAqIG9yaWdpbmFsbHkgb3BlbmVkLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gYmUgc2hvd24gd2hlbiB0aGUgdGl0bGUgYXJlYSBpcyBkaXNwbGF5ZWQuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGl0bGVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXRpdGxlVGV4dCA9IHRleHQ7Ci0JCWlmICh0aXRsZUxhYmVsICE9IG51bGwpCi0JCQl0aXRsZUxhYmVsLnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBkaWFsb2cgd2lsbCBwZXJzaXN0IGl0cyBib3VuZHMuCi0JICogVGhpcyB2YWx1ZSBpcyBpbml0aWFsbHkgc2V0IGluIHRoZSBkaWFsb2cncyBjb25zdHJ1Y3RvciwgYnV0IGNhbiBiZQotCSAqIG1vZGlmaWVkIGlmIHRoZSBwZXJzaXN0IGJvdW5kcyBhY3Rpb24gaXMgc2hvd24gb24gdGhlIG1lbnUgYW5kIHRoZSB1c2VyCi0JICogaGFzIGNoYW5nZWQgaXRzIHZhbHVlLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDx0cnVlPiBpZiB0aGUgZGlhbG9ncyBib3VuZHMgd2lsbCBiZSBwZXJzaXN0ZWQsIGZhbHNlIGlmIGl0IHdpbGwKLQkgKiAgICAgICAgIG5vdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQZXJzaXN0Qm91bmRzKCkgewotCQlyZXR1cm4gcGVyc2lzdEJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGlzIHdpbmRvdywgY3JlYXRpbmcgaXQgZmlyc3QgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIHJlaW1wbGVtZW50ZWQgZm9yIHNwZWNpYWwgY29uZmlndXJhdGlvbiBvZiBQb3B1cERpYWxvZ3MuCi0JICogSXQgbmV2ZXIgYmxvY2tzIG9uIG9wZW4sIGltbWVkaWF0ZWx5IHJldHVybmluZyA8Y29kZT5PSzwvY29kZT4gaWYgdGhlCi0JICogb3BlbiBpcyBzdWNjZXNzZnVsLCBvciA8Y29kZT5DQU5DRUw8L2NvZGU+IGlmIGl0IGlzIG5vdC4gSXQgcHJvdmlkZXMKLQkgKiBmcmFtZXdvcmsgaG9va3MgdGhhdCBhbGxvdyBzdWJjbGFzc2VzIHRvIHNldCB0aGUgZm9jdXMgYW5kIHRhYiBvcmRlciwgYW5kCi0JICogYXZvaWRzIHRoZSB1c2Ugb2YgPGNvZGU+c2hlbGwub3BlbigpPC9jb2RlPiBpbiBjYXNlcyB3aGVyZSB0aGUgZm9jdXMKLQkgKiBzaG91bGQgbm90IGJlIGdpdmVuIHRvIHRoZSBzaGVsbCBpbml0aWFsbHkuCi0JICogCi0JICogQHJldHVybiB0aGUgcmV0dXJuIGNvZGUKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjb3BlbigpCi0JICovCi0JcHVibGljIGludCBvcGVuKCkgewotCi0JCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJaWYgKHNoZWxsID09IG51bGwgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzaGVsbCA9IG51bGw7Ci0JCQkvLyBjcmVhdGUgdGhlIHdpbmRvdwotCQkJY3JlYXRlKCk7Ci0JCQlzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCX0KLQotCQkvLyBwcm92aWRlIGEgaG9vayBmb3IgYWRqdXN0aW5nIHRoZSBib3VuZHMuIFRoaXMgaXMgb25seQotCQkvLyBuZWNlc3Nhcnkgd2hlbiB0aGVyZSBpcyBjb250ZW50IGRyaXZlbiBzaXppbmcgdGhhdCBtdXN0IGJlCi0JCS8vIGFkanVzdGVkIGVhY2ggdGltZSB0aGUgZGlhbG9nIGlzIG9wZW5lZC4KLQkJYWRqdXN0Qm91bmRzKCk7Ci0KLQkJLy8gbGltaXQgdGhlIHNoZWxsIHNpemUgdG8gdGhlIGRpc3BsYXkgc2l6ZQotCQljb25zdHJhaW5TaGVsbFNpemUoKTsKLQotCQkvLyBzZXQgdXAgdGhlIHRhYiBvcmRlciBmb3IgdGhlIGRpYWxvZwotCQlzZXRUYWJPcmRlcigoQ29tcG9zaXRlKSBnZXRDb250ZW50cygpKTsKLQotCQkvLyBpbml0aWFsaXplIGZsYWdzIGZvciBsaXN0ZW5pbmcgdG8gZGVhY3RpdmF0ZQotCQlsaXN0ZW5Ub0RlYWN0aXZhdGUgPSBmYWxzZTsKLQkJbGlzdGVuVG9QYXJlbnREZWFjdGl2YXRlID0gZmFsc2U7Ci0KLQkJLy8gb3BlbiB0aGUgd2luZG93Ci0JCWlmICh0YWtlRm9jdXNPbk9wZW4pIHsKLQkJCXNoZWxsLm9wZW4oKTsKLQkJCWdldEZvY3VzQ29udHJvbCgpLnNldEZvY3VzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0KLQkJcmV0dXJuIE9LOwotCi0JfQotCi0JLyoqCi0JICogQ2xvc2VzIHRoaXMgd2luZG93LCBkaXNwb3NlcyBpdHMgc2hlbGwsIGFuZCByZW1vdmVzIHRoaXMgd2luZG93IGZyb20gaXRzCi0JICogd2luZG93IG1hbmFnZXIgKGlmIGl0IGhhcyBvbmUpLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGV4dGVuZGVkIHRvIHNhdmUgdGhlIGRpYWxvZyBib3VuZHMgYW5kIGluaXRpYWxpemUgd2lkZ2V0Ci0JICogc3RhdGUgc28gdGhhdCB0aGUgd2lkZ2V0cyBjYW4gYmUgcmVjcmVhdGVkIGlmIHRoZSBkaWFsb2cgaXMgcmVvcGVuZWQuCi0JICogVGhpcyBtZXRob2QgbWF5IGJlIGV4dGVuZGVkICg8Y29kZT5zdXBlci5jbG9zZTwvY29kZT4gbXVzdCBiZSBjYWxsZWQpLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB3aW5kb3cgaXMgKG9yIHdhcyBhbHJlYWR5KSBjbG9zZWQsIGFuZAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIHN0aWxsIG9wZW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJc2F2ZURpYWxvZ0JvdW5kcyhnZXRTaGVsbCgpKTsKLQkJLy8gV2lkZ2V0cyBhcmUgYWJvdXQgdG8gYmUgZGlzcG9zZWQsIHNvIG51bGwgb3V0IGFueSBzdGF0ZQotCQkvLyByZWxhdGVkIHRvIHRoZW0gdGhhdCB3YXMgbm90IGhhbmRsZWQgaW4gZGlzcG9zZSBsaXN0ZW5lcnMuCi0JCS8vIFdlIGRvIHRoaXMgYmVmb3JlIGRpc3Bvc2FsIHNvIHRoYXQgYW55IHJlY2VpdmVkIGFjdGl2YXRlIG9yCi0JCS8vIGRlYWN0aXZhdGUgZXZlbnRzIGFyZSBkdWx5IGlnbm9yZWQuCi0JCWluaXRpYWxpemVXaWRnZXRTdGF0ZSgpOwotCQkKLQkJaWYgKHBhcmVudERlYWN0aXZhdGVMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlnZXRTaGVsbCgpLmdldFBhcmVudCgpLnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBwYXJlbnREZWFjdGl2YXRlTGlzdGVuZXIpOwotCQkJcGFyZW50RGVhY3RpdmF0ZUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCi0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpYWxvZyBzZXR0aW5ncyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZW1lbWJlcmluZyB0aGUgYm91bmRzCi0JICogb2YgdGhlIGRpYWxvZy4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2hlbiB0aGV5IHdpc2ggdG8KLQkgKiBwZXJzaXN0IHRoZSBib3VuZHMgb2YgdGhlIGRpYWxvZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHNldHRpbmdzIHRoZSBkaWFsb2cgc2V0dGluZ3MgdXNlZCB0byBzdG9yZSB0aGUgZGlhbG9nJ3MgbG9jYXRpb24KLQkgKiAgICAgICAgIGFuZC9vciBzaXplLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGlhbG9nJ3MgYm91bmRzIHNob3VsZAotCSAqICAgICAgICAgbmV2ZXIgYmUgc3RvcmVkLgotCSAqLwotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBib3VuZHMgb2YgdGhlIHNoZWxsIGluIHRoZSBhcHByb3ByaWF0ZSBkaWFsb2cgc2V0dGluZ3MuIFRoZQotCSAqIGJvdW5kcyBhcmUgcmVjb3JkZWQgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBzaGVsbCwgaWYgdGhlcmUgaXMgb25lLCBvcgotCSAqIGRpc3BsYXkgY29vcmRpbmF0ZXMgaWYgdGhlcmUgaXMgbm8gcGFyZW50IHNoZWxsLiBTdWJjbGFzc2VzIHR5cGljYWxseQotCSAqIG5lZWQgbm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBidXQgbWF5IGV4dGVuZCBpdCAoY2FsbGluZwotCSAqIDxjb2RlPnN1cGVyLnNhdmVEaWFsb2dCb3VuZHM8L2NvZGU+IGlmIGFkZGl0aW9uYWwgYm91bmRzIGluZm9ybWF0aW9uCi0JICogc2hvdWxkIGJlIHN0b3JlZC4gQ2xpZW50cyBtYXkgYWxzbyBjYWxsIHRoaXMgbWV0aG9kIHRvIHBlcnNpc3QgdGhlIGJvdW5kcwotCSAqIGF0IHRpbWVzIG90aGVyIHRoYW4gY2xvc2luZyB0aGUgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqICAgICAgICAgICAgVGhlIHNoZWxsIHdob3NlIGJvdW5kcyBhcmUgdG8gYmUgc3RvcmVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURpYWxvZ0JvdW5kcyhTaGVsbCBzaGVsbCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJUG9pbnQgc2hlbGxMb2NhdGlvbiA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0JCQlQb2ludCBzaGVsbFNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0JCQlTaGVsbCBwYXJlbnQgPSBnZXRQYXJlbnRTaGVsbCgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJUG9pbnQgcGFyZW50TG9jYXRpb24gPSBwYXJlbnQuZ2V0TG9jYXRpb24oKTsKLQkJCQlzaGVsbExvY2F0aW9uLnggLT0gcGFyZW50TG9jYXRpb24ueDsKLQkJCQlzaGVsbExvY2F0aW9uLnkgLT0gcGFyZW50TG9jYXRpb24ueTsKLQkJCX0KLQkJCWlmIChwZXJzaXN0Qm91bmRzKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCXNldHRpbmdzLnB1dChwcmVmaXggKyBESUFMT0dfT1JJR0lOX1gsIHNoZWxsTG9jYXRpb24ueCk7Ci0JCQkJc2V0dGluZ3MucHV0KHByZWZpeCArIERJQUxPR19PUklHSU5fWSwgc2hlbGxMb2NhdGlvbi55KTsKLQkJCQlzZXR0aW5ncy5wdXQocHJlZml4ICsgRElBTE9HX1dJRFRILCBzaGVsbFNpemUueCk7Ci0JCQkJc2V0dGluZ3MucHV0KHByZWZpeCArIERJQUxPR19IRUlHSFQsIHNoZWxsU2l6ZS55KTsKLQkJCX0KLQkJCWlmIChzaG93UGVyc2lzdEFjdGlvbiAmJiBzaG93RGlhbG9nTWVudSkKLQkJCQlzZXR0aW5ncy5wdXQoCi0JCQkJCQlnZXRDbGFzcygpLmdldE5hbWUoKSArIERJQUxPR19VU0VfUEVSU0lTVEVEX0JPVU5EUywKLQkJCQkJCXBlcnNpc3RCb3VuZHMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2dldEluaXRpYWxTaXplKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCVBvaW50IHJlc3VsdCA9IHN1cGVyLmdldEluaXRpYWxTaXplKCk7Ci0JCWlmIChwZXJzaXN0Qm91bmRzKSB7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgd2lkdGggPSBzZXR0aW5ncy5nZXRJbnQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJCQkrIERJQUxPR19XSURUSCk7Ci0JCQkJCWludCBoZWlnaHQgPSBzZXR0aW5ncy5nZXRJbnQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJCQkrIERJQUxPR19IRUlHSFQpOwotCQkJCQlyZXN1bHQgPSBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7Ci0KLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBObyBhdHRlbXB0IGlzIG1hZGUgdG8gY29uc3RyYWluIHRoZSBib3VuZHMuIFRoZSBkZWZhdWx0Ci0JCS8vIGNvbnN0cmFpbmluZyBiZWhhdmlvciBpbiBXaW5kb3cgd2lsbCBiZSB1c2VkLgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFkanVzdCB0aGUgYm91bmRzIG9mIHRoZSBwb3B1cCBhcyBuZWNlc3NhcnkgcHJpb3IgdG8gb3BlbmluZyB0aGUgZGlhbG9nLgotCSAqIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZywgd2hpY2ggaG9ub3JzIGFueSBib3VuZHMgc2V0IGRpcmVjdGx5IGJ5IGNsaWVudHMKLQkgKiBvciB0aG9zZSB0aGF0IGhhdmUgYmVlbiBzYXZlZCBpbiB0aGUgZGlhbG9nIHNldHRpbmdzLiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHdoZW4gdGhlcmUgYXJlIGJvdW5kcyBjb21wdXRhdGlvbnMgdGhhdCBtdXN0IGJlCi0JICogY2hlY2tlZCBlYWNoIHRpbWUgdGhlIGRpYWxvZyBpcyBvcGVuZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRqdXN0Qm91bmRzKCkgewotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjZ2V0SW5pdGlhbExvY2F0aW9uKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCkKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbExvY2F0aW9uKFBvaW50IGluaXRpYWxTaXplKSB7Ci0JCVBvaW50IHJlc3VsdCA9IHN1cGVyLmdldEluaXRpYWxMb2NhdGlvbihpbml0aWFsU2l6ZSk7Ci0JCWlmIChwZXJzaXN0Qm91bmRzKSB7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgeCA9IHNldHRpbmdzLmdldEludChnZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkJCSsgRElBTE9HX09SSUdJTl9YKTsKLQkJCQkJaW50IHkgPSBzZXR0aW5ncy5nZXRJbnQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJCQkrIERJQUxPR19PUklHSU5fWSk7Ci0JCQkJCXJlc3VsdCA9IG5ldyBQb2ludCh4LCB5KTsKLQkJCQkJLy8gVGhlIGNvb3JkaW5hdGVzIHdlcmUgc3RvcmVkIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQgc2hlbGwuCi0JCQkJCS8vIENvbnZlcnQgdG8gZGlzcGxheSBjb29yZGluYXRlcy4KLQkJCQkJU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50U2hlbGwoKTsKLQkJCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQlQb2ludCBwYXJlbnRMb2NhdGlvbiA9IHBhcmVudC5nZXRMb2NhdGlvbigpOwotCQkJCQkJcmVzdWx0LnggKz0gcGFyZW50TG9jYXRpb24ueDsKLQkJCQkJCXJlc3VsdC55ICs9IHBhcmVudExvY2F0aW9uLnk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBObyBhdHRlbXB0IGlzIG1hZGUgdG8gY29uc3RyYWluIHRoZSBib3VuZHMuIFRoZSBkZWZhdWx0Ci0JCS8vIGNvbnN0cmFpbmluZyBiZWhhdmlvciBpbiBXaW5kb3cgd2lsbCBiZSB1c2VkLgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFwcGx5IGFueSBkZXNpcmVkIGNvbG9yIHRvIHRoZSBzcGVjaWZpZWQgY29tcG9zaXRlIGFuZCBpdHMgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnRzIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBseUNvbG9ycyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWFwcGx5Rm9yZWdyb3VuZENvbG9yKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKAotCQkJCVNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpLCBjb21wb3NpdGUsCi0JCQkJZ2V0Rm9yZWdyb3VuZENvbG9yRXhjbHVzaW9ucygpKTsKLQkJYXBwbHlCYWNrZ3JvdW5kQ29sb3IoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoCi0JCQkJU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCksIGNvbXBvc2l0ZSwKLQkJCQlnZXRCYWNrZ3JvdW5kQ29sb3JFeGNsdXNpb25zKCkpOwotCX0KLQotCS8qKgotCSAqIEFwcGx5IGFueSBkZXNpcmVkIGZvbnRzIHRvIHRoZSBzcGVjaWZpZWQgY29tcG9zaXRlIGFuZCBpdHMgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnRzIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBseUZvbnRzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgZm9yZWdyb3VuZCBjb2xvciBmb3IgdGhlIHNwZWNpZmllZCBjb250cm9sIGFuZCBhbGwgb2YKLQkgKiBpdHMgY2hpbGRyZW4sIGV4Y2VwdCBmb3IgdGhvc2Ugc3BlY2lmaWVkIGluIHRoZSBsaXN0IG9mIGV4Y2x1c2lvbnMuCi0JICogCi0JICogQHBhcmFtIGNvbG9yCi0JICogICAgICAgICAgICB0aGUgY29sb3IgdG8gdXNlIGFzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiAgICAgICAgICAgIHRoZSBjb250cm9sIHdob3NlIGNvbG9yIGlzIHRvIGJlIGNoYW5nZWQKLQkgKiBAcGFyYW0gZXhjbHVzaW9ucwotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIGNvbnRyb2xzIHdobyBhcmUgdG8gYmUgZXhjbHVkZWQgZnJvbSBnZXR0aW5nIHRoZWlyCi0JICogICAgICAgICAgICBjb2xvciBhc3NpZ25lZAotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBseUZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvciwgQ29udHJvbCBjb250cm9sLAotCQkJTGlzdCBleGNsdXNpb25zKSB7Ci0JCWlmICghZXhjbHVzaW9ucy5jb250YWlucyhjb250cm9sKSkgewotCQkJY29udHJvbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJfQotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJQ29udHJvbFtdIGNoaWxkcmVuID0gKChDb21wb3NpdGUpIGNvbnRyb2wpLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJCWFwcGx5Rm9yZWdyb3VuZENvbG9yKGNvbG9yLCBjaGlsZHJlbltpXSwgZXhjbHVzaW9ucyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRyb2wgYW5kIGFsbCBvZgotCSAqIGl0cyBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IKLQkgKiAgICAgICAgICAgIHRoZSBjb2xvciB0byB1c2UgYXMgdGhlIGJhY2tncm91bmQgY29sb3IKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgdGhlIGNvbnRyb2wgd2hvc2UgY29sb3IgaXMgdG8gYmUgY2hhbmdlZAotCSAqIEBwYXJhbSBleGNsdXNpb25zCi0JICogICAgICAgICAgICBhIGxpc3Qgb2YgY29udHJvbHMgd2hvIGFyZSB0byBiZSBleGNsdWRlZCBmcm9tIGdldHRpbmcgdGhlaXIKLQkgKiAgICAgICAgICAgIGNvbG9yIGFzc2lnbmVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGx5QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yLCBDb250cm9sIGNvbnRyb2wsCi0JCQlMaXN0IGV4Y2x1c2lvbnMpIHsKLQkJaWYgKCFleGNsdXNpb25zLmNvbnRhaW5zKGNvbnRyb2wpKSB7Ci0JCQljb250cm9sLnNldEJhY2tncm91bmQoY29sb3IpOwotCQl9Ci0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0JCQlDb250cm9sW10gY2hpbGRyZW4gPSAoKENvbXBvc2l0ZSkgY29udHJvbCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJYXBwbHlCYWNrZ3JvdW5kQ29sb3IoY29sb3IsIGNoaWxkcmVuW2ldLCBleGNsdXNpb25zKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGZvcmVncm91bmQgY29sb3IgZm9yIHRoZSBzcGVjaWZpZWQgY29udHJvbCBhbmQgYWxsIG9mCi0JICogaXRzIGNoaWxkcmVuLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgYnV0IHR5cGljYWxseSBkbyBub3QuCi0JICogSWYgYSBzdWJjbGFzcyB3aXNoZXMgdG8gZXhjbHVkZSBhIHBhcnRpY3VsYXIgY29udHJvbCBpbiBpdHMgY29udGVudHMgZnJvbQotCSAqIGdldHRpbmcgdGhlIHNwZWNpZmllZCBmb3JlZ3JvdW5kIGNvbG9yLCBpdCBtYXkgaW5zdGVhZCBvdmVycmlkZQotCSAqIDxjb2RlPlBvcHVwRGlhbG9nLmdldEZvcmVncm91bmRDb2xvckV4Y2x1c2lvbnM8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBjb2xvcgotCSAqICAgICAgICAgICAgdGhlIGNvbG9yIHRvIHVzZSBhcyB0aGUgYmFja2dyb3VuZCBjb2xvcgotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgY29udHJvbCB3aG9zZSBjb2xvciBpcyB0byBiZSBjaGFuZ2VkCi0JICogQHNlZSBQb3B1cERpYWxvZyNnZXRCYWNrZ3JvdW5kQ29sb3JFeGNsdXNpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBseUZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvciwgQ29udHJvbCBjb250cm9sKSB7Ci0JCWFwcGx5Rm9yZWdyb3VuZENvbG9yKGNvbG9yLCBjb250cm9sLCBnZXRGb3JlZ3JvdW5kQ29sb3JFeGNsdXNpb25zKCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3IgZm9yIHRoZSBzcGVjaWZpZWQgY29udHJvbCBhbmQgYWxsIG9mCi0JICogaXRzIGNoaWxkcmVuLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgYnV0IHR5cGljYWxseSBkbyBub3QuCi0JICogSWYgYSBzdWJjbGFzcyB3aXNoZXMgdG8gZXhjbHVkZSBhIHBhcnRpY3VsYXIgY29udHJvbCBpbiBpdHMgY29udGVudHMgZnJvbQotCSAqIGdldHRpbmcgdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yLCBpdCBtYXkgaW5zdGVhZCBvdmVycmlkZQotCSAqIDxjb2RlPlBvcHVwRGlhbG9nLmdldEJhY2tncm91bmRDb2xvckV4Y2x1c2lvbnM8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBjb2xvcgotCSAqICAgICAgICAgICAgdGhlIGNvbG9yIHRvIHVzZSBhcyB0aGUgYmFja2dyb3VuZCBjb2xvcgotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgY29udHJvbCB3aG9zZSBjb2xvciBpcyB0byBiZSBjaGFuZ2VkCi0JICogQHNlZSBQb3B1cERpYWxvZyNnZXRCYWNrZ3JvdW5kQ29sb3JFeGNsdXNpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBseUJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvciwgQ29udHJvbCBjb250cm9sKSB7Ci0JCWFwcGx5QmFja2dyb3VuZENvbG9yKGNvbG9yLCBjb250cm9sLCBnZXRCYWNrZ3JvdW5kQ29sb3JFeGNsdXNpb25zKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgY29udHJvbHMgd2hpY2ggc2hvdWxkIG5ldmVyIGhhdmUgdGhlaXIgZm9yZWdyb3VuZCBjb2xvcgotCSAqIHJlc2V0LiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgKHNob3VsZCBhbHdheXMgY2FsbAotCSAqIDxjb2RlPnN1cGVyLmdldEZvcmVncm91bmRDb2xvckV4Y2x1c2lvbnM8L2NvZGU+IHRvIGFnZ3JlZ2F0ZSB0aGUgbGlzdC4KLQkgKiAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBMaXN0IG9mIGNvbnRyb2xzCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0Rm9yZWdyb3VuZENvbG9yRXhjbHVzaW9ucygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJaWYgKGluZm9MYWJlbCAhPSBudWxsKQotCQkJbGlzdC5hZGQoaW5mb0xhYmVsKTsKLQkJaWYgKHRpdGxlU2VwYXJhdG9yICE9IG51bGwpCi0JCQlsaXN0LmFkZCh0aXRsZVNlcGFyYXRvcik7Ci0JCWlmIChpbmZvU2VwYXJhdG9yICE9IG51bGwpCi0JCQlsaXN0LmFkZChpbmZvU2VwYXJhdG9yKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBjb250cm9scyB3aGljaCBzaG91bGQgbmV2ZXIgaGF2ZSB0aGVpciBiYWNrZ3JvdW5kIGNvbG9yCi0JICogcmVzZXQuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCAoc2hvdWxkIGFsd2F5cyBjYWxsCi0JICogPGNvZGU+c3VwZXIuZ2V0QmFja2dyb3VuZENvbG9yRXhjbHVzaW9uczwvY29kZT4gdG8gYWdncmVnYXRlIHRoZSBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIExpc3Qgb2YgY29udHJvbHMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRCYWNrZ3JvdW5kQ29sb3JFeGNsdXNpb25zKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQlpZiAodGl0bGVTZXBhcmF0b3IgIT0gbnVsbCkKLQkJCWxpc3QuYWRkKHRpdGxlU2VwYXJhdG9yKTsKLQkJaWYgKGluZm9TZXBhcmF0b3IgIT0gbnVsbCkKLQkJCWxpc3QuYWRkKGluZm9TZXBhcmF0b3IpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGFueSBzdGF0ZSByZWxhdGVkIHRvIHRoZSB3aWRnZXRyeSB0aGF0IHNob3VsZCBiZSBzZXQgdXAgZWFjaAotCSAqIHRpbWUgd2lkZ2V0cyBhcmUgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpZGdldFN0YXRlKCkgewotCQltZW51TWFuYWdlciA9IG51bGw7Ci0JCWRpYWxvZ0FyZWEgPSBudWxsOwotCQl0aXRsZUxhYmVsID0gbnVsbDsKLQkJdGl0bGVTZXBhcmF0b3IgPSBudWxsOwotCQlpbmZvU2VwYXJhdG9yID0gbnVsbDsKLQkJaW5mb0xhYmVsID0gbnVsbDsKLQkJdG9vbEJhciA9IG51bGw7Ci0KLQkJLy8gSWYgdGhlIG1lbnUgaXRlbSBmb3IgcGVyc2lzdGluZyBib3VuZHMgaXMgZGlzcGxheWVkLCB1c2UgdGhlIHN0b3JlZAotCQkvLyB2YWx1ZSB0byBkZXRlcm1pbmUgd2hldGhlciBhbnkgcGVyc2lzdGVkIGJvdW5kcyBzaG91bGQgYmUgaG9ub3JlZCBhdAotCQkvLyBhbGwuCi0JCWlmIChzaG93RGlhbG9nTWVudSAmJiBzaG93UGVyc2lzdEFjdGlvbikgewotCQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQkJcGVyc2lzdEJvdW5kcyA9IHNldHRpbmdzLmdldEJvb2xlYW4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJCSsgRElBTE9HX1VTRV9QRVJTSVNURURfQk9VTkRTKTsKLQkJCX0KLQkJfQotCi0JfQotCQotCS8qKgotCSAqIFRoZSBkaWFsb2cgaXMgYmVpbmcgZGlzcG9zZWQuICBEaXNwb3NlIG9mIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkLgotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURpc3Bvc2UoKSB7Ci0JCWlmIChpbmZvRm9udCAhPSBudWxsICYmICFpbmZvRm9udC5pc0Rpc3Bvc2VkKCkpCi0JCQlpbmZvRm9udC5kaXNwb3NlKCk7Ci0JCWluZm9Gb250ID0gbnVsbDsKLQkJaWYgKHRpdGxlRm9udCAhPSBudWxsICYmICF0aXRsZUZvbnQuaXNEaXNwb3NlZCgpKQotCQkJdGl0bGVGb250LmRpc3Bvc2UoKTsKLQkJdGl0bGVGb250ID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL1Byb2dyZXNzSW5kaWNhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL1Byb2dyZXNzSW5kaWNhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOWI5YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9Qcm9ncmVzc0luZGljYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Qcm9ncmVzc0JhcjsKLQotLyoqCi0gKiBBIGNvbnRyb2wgZm9yIHNob3dpbmcgcHJvZ3Jlc3MgZmVlZGJhY2sgZm9yIGEgbG9uZyBydW5uaW5nIG9wZXJhdGlvbi4gVGhpcwotICogY29udHJvbCBzdXBwb3J0cyBib3RoIGRldGVybWluYXRlIGFuZCBpbmRldGVybWluYXRlIFNXVCBwcm9ncmVzcyBiYXJzLiBGb3IKLSAqIGluZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MsIHdlIGRvbid0IGhhdmUgdG8ga25vdyB0aGUgdG90YWwgYW1vdW50IG9mIHdvcmsgaW4KLSAqIGFkdmFuY2UgYW5kIG5vIDxjb2RlPndvcmtlZDwvY29kZT4gbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZC4KLSAqLwotcHVibGljIGNsYXNzIFByb2dyZXNzSW5kaWNhdG9yIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUFJPR1JFU1NfTUFYID0gMTAwMDsgLy8gdmFsdWUgdG8gdXNlIGZvciBtYXggaW4KLQotICAgIC8vIHByb2dyZXNzIGJhcgotICAgIHByaXZhdGUgYm9vbGVhbiBhbmltYXRlZCA9IHRydWU7Ci0KLSAgICBwcml2YXRlIFN0YWNrTGF5b3V0IGxheW91dDsKLQotICAgIHByaXZhdGUgUHJvZ3Jlc3NCYXIgZGV0ZXJtaW5hdGVQcm9ncmVzc0JhcjsKLQotICAgIHByaXZhdGUgUHJvZ3Jlc3NCYXIgaW5kZXRlcm1pbmF0ZVByb2dyZXNzQmFyOwotCi0gICAgcHJpdmF0ZSBkb3VibGUgdG90YWxXb3JrOwotCi0gICAgcHJpdmF0ZSBkb3VibGUgc3VtV29ya2VkOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgUHJvZ3Jlc3NJbmRpY2F0b3IgYXMgYSBjaGlsZCB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIFRoZSB3aWRnZXRzIHBhcmVudAotICAgICAqLwotICAgIHB1YmxpYyBQcm9ncmVzc0luZGljYXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBkZXRlcm1pbmF0ZVByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKHRoaXMsIFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgaW5kZXRlcm1pbmF0ZVByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKHRoaXMsIFNXVC5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgfCBTV1QuSU5ERVRFUk1JTkFURSk7Ci0gICAgICAgIGxheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotICAgICAgICBzZXRMYXlvdXQobGF5b3V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBwcm9ncmVzcyBiYXIgdG8gYmUgYW5pbWF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYmVnaW5BbmltYXRlZFRhc2soKSB7Ci0gICAgICAgIGRvbmUoKTsKLSAgICAgICAgbGF5b3V0LnRvcENvbnRyb2wgPSBpbmRldGVybWluYXRlUHJvZ3Jlc3NCYXI7Ci0gICAgICAgIGxheW91dCgpOwotICAgICAgICBhbmltYXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgcHJvZ3Jlc3MgYmFyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZ2luVGFzayhpbnQgbWF4KSB7Ci0gICAgICAgIGRvbmUoKTsKLSAgICAgICAgdGhpcy50b3RhbFdvcmsgPSBtYXg7Ci0gICAgICAgIHRoaXMuc3VtV29ya2VkID0gMDsKLSAgICAgICAgZGV0ZXJtaW5hdGVQcm9ncmVzc0Jhci5zZXRNaW5pbXVtKDApOwotICAgICAgICBkZXRlcm1pbmF0ZVByb2dyZXNzQmFyLnNldE1heGltdW0oUFJPR1JFU1NfTUFYKTsKLSAgICAgICAgZGV0ZXJtaW5hdGVQcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oMCk7Ci0gICAgICAgIGxheW91dC50b3BDb250cm9sID0gZGV0ZXJtaW5hdGVQcm9ncmVzc0JhcjsKLSAgICAgICAgbGF5b3V0KCk7Ci0gICAgICAgIGFuaW1hdGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvZ3Jlc3MgaXMgZG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb25lKCkgewotICAgICAgICBpZiAoIWFuaW1hdGVkKSB7Ci0gICAgICAgICAgICBkZXRlcm1pbmF0ZVByb2dyZXNzQmFyLnNldE1pbmltdW0oMCk7Ci0gICAgICAgICAgICBkZXRlcm1pbmF0ZVByb2dyZXNzQmFyLnNldE1heGltdW0oMCk7Ci0gICAgICAgICAgICBkZXRlcm1pbmF0ZVByb2dyZXNzQmFyLnNldFNlbGVjdGlvbigwKTsKLSAgICAgICAgfQotICAgICAgICBsYXlvdXQudG9wQ29udHJvbCA9IG51bGw7Ci0gICAgICAgIGxheW91dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBwcm9ncmVzcyBpbmRpY2F0b3IgdG8gdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUmVtYWluaW5nV29yaygpIHsKLSAgICAgICAgd29ya2VkKHRvdGFsV29yayAtIHN1bVdvcmtlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIHByb2dyZXNzIGluZGljYXRvciBieSB0aGUgZ2l2ZW4gYW1vdW50IG9mIHdvcmsgdW5pdHMKLSAgICAgKiBAcGFyYW0gd29yayB0aGUgYW1vdW50IG9mIHdvcmsgdG8gaW5jcmVtZW50IGJ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdvcmtlZChkb3VibGUgd29yaykgewotICAgICAgICBpZiAod29yayA9PSAwIHx8IGFuaW1hdGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VtV29ya2VkICs9IHdvcms7Ci0gICAgICAgIGlmIChzdW1Xb3JrZWQgPiB0b3RhbFdvcmspIHsKLSAgICAgICAgICAgIHN1bVdvcmtlZCA9IHRvdGFsV29yazsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3VtV29ya2VkIDwgMCkgewotICAgICAgICAgICAgc3VtV29ya2VkID0gMDsKLSAgICAgICAgfQotICAgICAgICBpbnQgdmFsdWUgPSAoaW50KSAoc3VtV29ya2VkIC8gdG90YWxXb3JrICogUFJPR1JFU1NfTUFYKTsKLSAgICAgICAgaWYgKGRldGVybWluYXRlUHJvZ3Jlc3NCYXIuZ2V0U2VsZWN0aW9uKCkgPCB2YWx1ZSkgewotICAgICAgICAgICAgZGV0ZXJtaW5hdGVQcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9Qcm9ncmVzc01vbml0b3JEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNjNkODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9Qcm9ncmVzc01vbml0b3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9nczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcldpdGhCbG9ja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5Nb2RhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSBtb2RhbCBkaWFsb2cgdGhhdCBkaXNwbGF5cyBwcm9ncmVzcyBkdXJpbmcgYSBsb25nIHJ1bm5pbmcgb3BlcmF0aW9uLgotICogPHA+Ci0gKiBUaGlzIGNvbmNyZXRlIGRpYWxvZyBjbGFzcyBjYW4gYmUgaW5zdGFudGlhdGVkIGFzIGlzLCBvciBmdXJ0aGVyIHN1YmNsYXNzZWQKLSAqIGFzIHJlcXVpcmVkLgotICogPC9wPgotICogPHA+Ci0gKiBUeXBpY2FsIHVzYWdlIGlzOgotICogCi0gKiA8cHJlPgotICogCi0gKiAgCi0gKiAgIHRyeSB7Ci0gKiAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IC4uLjsKLSAqICAgICAgbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhhY3RpdmVTaGVsbCkucnVuKHRydWUsIHRydWUsIG9wKTsKLSAqICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gKiAgICAgIC8vIGhhbmRsZSBleGNlcHRpb24KLSAqICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICogICAgICAvLyBoYW5kbGUgY2FuY2VsYXRpb24KLSAqICAgfQotICogICAKLSAqICAKLSAqIDwvcHJlPgotICogCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGUgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUKLSAqIHJ1bm5hYmxlcyAtIHRoaXMgZGlhbG9nIHNob3VsZCBiZSBkaXNjYXJkZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiBvbmUKLSAqIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBhbmQgYSBuZXcgb25lIGluc3RhbnRpYXRlZCBmb3IgdXNlIGJ5IGEgc2Vjb25kIG9yCi0gKiBzZWJzZXF1ZW50IElSdW5uYWJsZVdpdGhQcm9ncmVzcyB0byBlbnN1cmUgcHJvcGVyIGluaXRpYWxpemF0aW9uLgotICogPC9wPgotICogPHA+Ci0gKiBOb3RlIHRoYXQgbm90IGZvcmtpbmcgdGhlIHByb2Nlc3Mgd2lsbCByZXN1bHQgaW4gaXQgcnVubmluZyBpbiB0aGUgVUkgd2hpY2gKLSAqIG1heSBzdGFydmUgdGhlIFVJLiBUaGUgbW9zdCBvYnZpb3VzIHN5bXB0b20gb2YgdGhpcyBwcm9ibGVtIGlzIG5vbgotICogcmVzcG9uc2l2ZW5lc3Mgb2YgdGhlIGNhbmNlbCBidXR0b24uIElmIHlvdSBhcmUgcnVubmluZyB3aXRoaW4gdGhlIFVJIFRocmVhZAotICogeW91IHNob3VsZCBkbyB0aGUgYnVsayBvZiB5b3VyIHdvcmsgaW4gYW5vdGhlciBUaHJlYWQgdG8gcHJldmVudCBzdGFydmF0aW9uLgotICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBmb3JrIGlzIHNldCB0byB0cnVlIGluIG1vc3QgY2FzZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ncmVzc01vbml0b3JEaWFsb2cgZXh0ZW5kcyBJY29uQW5kTWVzc2FnZURpYWxvZyBpbXBsZW1lbnRzCi0gICAgICAgIElSdW5uYWJsZUNvbnRleHQgewotICAgIC8qKgotICAgICAqIE5hbWUgdG8gdXNlIGZvciB0YXNrIHdoZW4gbm9ybWFsIHRhc2sgbmFtZSBpcyBlbXB0eSBzdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFRkFVTFRfVEFTS05BTUUgPSBKRmFjZVJlc291cmNlcwotICAgICAgICAgICAgLmdldFN0cmluZygiUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLm1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQ29uc3RhbnRzIGZvciBsYWJlbCBhbmQgbW9uaXRvciBzaXplCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IExBQkVMX0RMVVMgPSAyMTsKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBCQVJfRExVUyA9IDk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcHJvZ3Jlc3MgaW5kaWNhdG9yIGNvbnRyb2wuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb2dyZXNzSW5kaWNhdG9yIHByb2dyZXNzSW5kaWNhdG9yOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxhYmVsIGNvbnRyb2wgZm9yIHRoZSB0YXNrLiBLZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGFiZWwgdGFza0xhYmVsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxhYmVsIGNvbnRyb2wgZm9yIHRoZSBzdWJ0YXNrLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMYWJlbCBzdWJUYXNrTGFiZWw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQ2FuY2VsIGJ1dHRvbiBjb250cm9sLgotICAgICAqLwotICAgIHByb3RlY3RlZCBCdXR0b24gY2FuY2VsOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIENhbmNlbCBidXR0b24gaXMgdG8gYmUgc2hvd24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gb3BlcmF0aW9uQ2FuY2VsYWJsZVN0YXRlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgQ2FuY2VsIGJ1dHRvbiBpcyB0byBiZSBlbmFibGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGVuYWJsZUNhbmNlbEJ1dHRvbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBwcm9ncmVzcyBtb25pdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9IG5ldyBQcm9ncmVzc01vbml0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhc2sgKHVzZWQgYnkgUHJvZ3Jlc3NNb25pdG9yKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0YXNrOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5lc3RpbmcgZGVwdGggb2YgY3VycmVudGx5IHJ1bm5pbmcgcnVubmFibGVzLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG5lc3RpbmdEZXB0aDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJzb3IgdXNlZCBpbiB0aGUgY2FuY2VsIGJ1dHRvbjsKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ3Vyc29yIGFycm93Q3Vyc29yOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnNvciB1c2VkIGluIHRoZSBzaGVsbDsKLSAgICAgKi8KLSAgICBwcml2YXRlIEN1cnNvciB3YWl0Q3Vyc29yOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gb3BlbiBvciBtZXJlbHkgY3JlYXRlIHRoZSBkaWFsb2cgYmVmb3JlIHJ1bi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gb3Blbk9uUnVuID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIEludGVybmFsIHByb2dyZXNzIG1vbml0b3IgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBQcm9ncmVzc01vbml0b3IgaW1wbGVtZW50cyBJUHJvZ3Jlc3NNb25pdG9yV2l0aEJsb2NraW5nIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZlN1YlRhc2sgPSAiIjsvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGZJc0NhbmNlbGVkOwotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGZvcmtlZCA9IGZhbHNlOwotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGxvY2tlZCA9IGZhbHNlOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgewotICAgICAgICAgICAgaWYgKHByb2dyZXNzSW5kaWNhdG9yLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRhc2sgPSAiIjsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGFzayA9IG5hbWU7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IHRhc2s7Ci0gICAgICAgICAgICBpZiAocy5sZW5ndGgoKSA8PSAwKQotICAgICAgICAgICAgICAgIHMgPSBERUZBVUxUX1RBU0tOQU1FOwotICAgICAgICAgICAgc2V0TWVzc2FnZShzKTsKLSAgICAgICAgICAgIGlmICghZm9ya2VkKQotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgaWYgKHRvdGFsV29yayA9PSBVTktOT1dOKSB7Ci0gICAgICAgICAgICAgICAgcHJvZ3Jlc3NJbmRpY2F0b3IuYmVnaW5BbmltYXRlZFRhc2soKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJvZ3Jlc3NJbmRpY2F0b3IuYmVnaW5UYXNrKHRvdGFsV29yayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkb25lKCkgewotICAgICAgICAgICAgaWYgKCFwcm9ncmVzc0luZGljYXRvci5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBwcm9ncmVzc0luZGljYXRvci5zZW5kUmVtYWluaW5nV29yaygpOwotICAgICAgICAgICAgICAgIHByb2dyZXNzSW5kaWNhdG9yLmRvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRhc2sgPSAiIjsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGFzayA9IG5hbWU7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IHRhc2s7Ci0gICAgICAgICAgICBpZiAocy5sZW5ndGgoKSA8PSAwKQotICAgICAgICAgICAgICAgIHMgPSBERUZBVUxUX1RBU0tOQU1FOwotICAgICAgICAgICAgc2V0TWVzc2FnZShzKTsKLSAgICAgICAgICAgIGlmICghZm9ya2VkKQotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmSXNDYW5jZWxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gYikgewotICAgICAgICAgICAgZklzQ2FuY2VsZWQgPSBiOwotICAgICAgICAgICAgaWYgKGxvY2tlZCkKLSAgICAgICAgICAgICAgICBjbGVhckJsb2NrZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN1YlRhc2soU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIGlmIChzdWJUYXNrTGFiZWwuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgZlN1YlRhc2sgPSAiIjsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZlN1YlRhc2sgPSBuYW1lOwotICAgICAgICAgICAgc3ViVGFza0xhYmVsLnNldFRleHQoc2hvcnRlblRleHQoZlN1YlRhc2ssc3ViVGFza0xhYmVsKSk7Ci0gICAgICAgICAgICBpZiAoIWZvcmtlZCkKLSAgICAgICAgICAgICAgICBzdWJUYXNrTGFiZWwudXBkYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKLSAgICAgICAgICAgIGludGVybmFsV29ya2VkKHdvcmspOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHsKLSAgICAgICAgICAgIGlmICghcHJvZ3Jlc3NJbmRpY2F0b3IuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgICAgIHByb2dyZXNzSW5kaWNhdG9yLndvcmtlZCh3b3JrKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIChub24tSmF2YWRvYykKLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3JXaXRoQmxvY2tpbmcjY2xlYXJCbG9ja2VkKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyQmxvY2tlZCgpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgdXBkYXRlRm9yQ2xlYXJCbG9ja2VkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yV2l0aEJsb2NraW5nI3NldEJsb2NrZWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCbG9ja2VkKElTdGF0dXMgcmVhc29uKSB7Ci0gICAgICAgICAgICBsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgdXBkYXRlRm9yU2V0QmxvY2tlZChyZWFzb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgYmxvY2tlZCBzdGF0ZSBmcm9tIHRoZSByZWNlaXZlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVGb3JDbGVhckJsb2NrZWQoKSB7Ci0gICAgICAgIHNldE1lc3NhZ2UodGFzayk7Ci0gICAgICAgIGltYWdlTGFiZWwuc2V0SW1hZ2UoZ2V0SW1hZ2UoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGJsb2NrZWQgc3RhdGUgZnJvbSB0aGUgcmVjZWl2ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlYXNvbgotICAgICAqICAgICAgICAgICAgSVN0YXR1cyB0aGF0IGdpdmVzIHRoZSBkZXRhaWxzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRm9yU2V0QmxvY2tlZChJU3RhdHVzIHJlYXNvbikgewotICAgICAgICBzZXRNZXNzYWdlKHJlYXNvbi5nZXRNZXNzYWdlKCkpOwotICAgICAgICBpbWFnZUxhYmVsLnNldEltYWdlKGdldEltYWdlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwcm9ncmVzcyBtb25pdG9yIGRpYWxvZyB1bmRlciB0aGUgZ2l2ZW4gc2hlbGwuIFRoZSBkaWFsb2cgaGFzIGEKLSAgICAgKiBzdGFuZGFyZCB0aXRsZSBhbmQgbm8gaW1hZ2UuIDxjb2RlPm9wZW48L2NvZGU+IGlzIG5vbi1ibG9ja2luZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBjcmVhdGUgYSB0b3AtbGV2ZWwKLSAgICAgKiAgICAgICAgICAgIHNoZWxsCi0gICAgICovCi0gICAgcHVibGljIFByb2dyZXNzTW9uaXRvckRpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgc2V0U2hlbGxTdHlsZShnZXREZWZhdWx0T3JpZW50YXRpb24oKSB8IFNXVC5CT1JERVIgfCBTV1QuVElUTEUgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOyAvLyBubwotICAgICAgICAvLyBjbG9zZQotICAgICAgICAvLyBidXR0b24KLSAgICAgICAgc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZXMgdGhlIGNhbmNlbCBidXR0b24gKGFzeW5jaHJvbm91c2x5KS4KLSAgICAgKiBAcGFyYW0gYiBUaGUgc3RhdGUgdG8gc2V0IHRoZSBidXR0b24gdG8uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzeW5jU2V0T3BlcmF0aW9uQ2FuY2VsQnV0dG9uRW5hYmxlZChmaW5hbCBib29sZWFuIGIpIHsKLSAgICAgICAgaWYgKGdldFNoZWxsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE9wZXJhdGlvbkNhbmNlbEJ1dHRvbkVuYWJsZWQoYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FuY2VsIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotICAgICAgICAvLyBOT1RFOiB0aGlzIHdhcyBwcmV2aW91c2x5IGRvbmUgZnJvbSBhIGxpc3RlbmVyIGluc3RhbGxlZCBvbiB0aGUKLSAgICAgICAgLy8gY2FuY2VsIGJ1dHRvbi4gT24gR1RLLCB0aGUgbGlzdGVuZXIgaW5zdGFsbGVkIGJ5Ci0gICAgICAgIC8vIERpYWxvZy5jcmVhdGVCdXR0b24gaXMgY2FsbGVkIGZpcnN0IGFuZCB0aGlzIHdhcyB0aHJvd2luZyBhbgotICAgICAgICAvLyBleGNlcHRpb24gYmVjYXVzZSB0aGUgY2FuY2VsIGJ1dHRvbiB3YXMgYWxyZWFkeSBkaXNwb3NlZAotICAgICAgICBjYW5jZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLSAgICAgICAgc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotICAgICAqLwotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Qcm9ncmVzc01vbml0b3JEaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kCi0gICAgICogb25seSBjbG9zZXMgdGhlIGRpYWxvZyBpZiB0aGVyZSBhcmUgbm8gY3VycmVudGx5IHJ1bm5pbmcgcnVubmFibGVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotICAgICAgICBpZiAoZ2V0TmVzdGluZ0RlcHRoKCkgPD0gMCkgewotICAgICAgICAgICAgY2xlYXJDdXJzb3JzKCk7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGN1cnNvcnMgaW4gdGhlIGRpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJDdXJzb3JzKCkgewotICAgICAgICBpZiAoY2FuY2VsICE9IG51bGwgJiYgIWNhbmNlbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIGNhbmNlbC5zZXRDdXJzb3IobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotICAgICAgICBpZiAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFycm93Q3Vyc29yICE9IG51bGwpCi0gICAgICAgICAgICBhcnJvd0N1cnNvci5kaXNwb3NlKCk7Ci0gICAgICAgIGlmICh3YWl0Q3Vyc29yICE9IG51bGwpCi0gICAgICAgICAgICB3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLSAgICAgICAgYXJyb3dDdXJzb3IgPSBudWxsOwotICAgICAgICB3YWl0Q3Vyc29yID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIFdpbmRvdy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgICAgIHNoZWxsLnNldFRleHQoSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcm9ncmVzc01vbml0b3JEaWFsb2cudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHdhaXRDdXJzb3IgPT0gbnVsbCkKLSAgICAgICAgICAgIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKHNoZWxsLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKTsKLSAgICAgICAgc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBjYW5jZWwgYnV0dG9uCi0gICAgICAgIGNyZWF0ZUNhbmNlbEJ1dHRvbihwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGNhbmNlbCBidXR0b24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2FuY2VsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY2FuY2VsID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0gICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIHRydWUpOwotICAgICAgICBpZiAoYXJyb3dDdXJzb3IgPT0gbnVsbCkKLSAgICAgICAgICAgIGFycm93Q3Vyc29yID0gbmV3IEN1cnNvcihjYW5jZWwuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX0FSUk9XKTsKLSAgICAgICAgY2FuY2VsLnNldEN1cnNvcihhcnJvd0N1cnNvcik7Ci0gICAgICAgIHNldE9wZXJhdGlvbkNhbmNlbEJ1dHRvbkVuYWJsZWQoZW5hYmxlQ2FuY2VsQnV0dG9uKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgc2V0TWVzc2FnZShERUZBVUxUX1RBU0tOQU1FKTsKLSAgICAgICAgY3JlYXRlTWVzc2FnZUFyZWEocGFyZW50KTsKLSAgICAgICAgLy9Pbmx5IHNldCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKLSAgICAgICAgdGFza0xhYmVsID0gbWVzc2FnZUxhYmVsOwotICAgICAgICAvLyBwcm9ncmVzcyBpbmRpY2F0b3IKLSAgICAgICAgcHJvZ3Jlc3NJbmRpY2F0b3IgPSBuZXcgUHJvZ3Jlc3NJbmRpY2F0b3IocGFyZW50KTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZ2QuaGVpZ2h0SGludCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhCQVJfRExVUyk7Ci0gICAgICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBwcm9ncmVzc0luZGljYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgLy8gbGFiZWwgc2hvd2luZyBjdXJyZW50IHRhc2sKLSAgICAgICAgc3ViVGFza0xhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQgfCBTV1QuV1JBUCk7Ci0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhlaWdodEhpbnQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoTEFCRUxfRExVUyk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgc3ViVGFza0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBzdWJUYXNrTGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2dldEluaXRpYWxTaXplKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0gICAgICAgIFBvaW50IGNhbGN1bGF0ZWRTaXplID0gc3VwZXIuZ2V0SW5pdGlhbFNpemUoKTsKLSAgICAgICAgaWYgKGNhbGN1bGF0ZWRTaXplLnggPCA0NTApCi0gICAgICAgICAgICBjYWxjdWxhdGVkU2l6ZS54ID0gNDUwOwotICAgICAgICByZXR1cm4gY2FsY3VsYXRlZFNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byB1c2UgZm9yIG9wZXJhdGlvbnMgcnVuIGluIHRoaXMgcHJvZ3Jlc3MKLSAgICAgKiBkaWFsb2cuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvZ3Jlc3MgbW9uaXRvcgotICAgICAqLwotICAgIHB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHByb2dyZXNzTW9uaXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIElSdW5uYWJsZUNvbnRleHQjcnVuKGJvb2xlYW4sIGJvb2xlYW4sCi0gICAgICogSVJ1bm5hYmxlV2l0aFByb2dyZXNzKSBydW5zIHRoZSBnaXZlbiA8Y29kZT5JUnVubmFibGVXaXRoUHJvZ3Jlc3M8L2NvZGU+Ci0gICAgICogdXNpbmcgdGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoaXMgcHJvZ3Jlc3MgZGlhbG9nIGFuZCBibG9ja3MgdW50aWwKLSAgICAgKiB0aGUgcnVubmFibGUgaGFzIGJlZW4gcnVuLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiA8Y29kZT5mb3JrPC9jb2RlPi4KLSAgICAgKiBUaGUgZGlhbG9nIGlzIG9wZW5lZCBiZWZvcmUgdGhlIHJ1bm5hYmxlIGlzIHJ1biwgYW5kIGNsb3NlZCBhZnRlcgotICAgICAqIGl0IGNvbXBsZXRlcy4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCA8Y29kZT5mb3JrPC9jb2RlPiBpcyBzZXQgdG8KLSAgICAgKiB0cnVlIGluIG1vc3QgY2FzZXMuIElmIDxjb2RlPmZvcms8L2NvZGU+IGlzIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sCi0gICAgICogdGhlIHJ1bm5hYmxlIHdpbGwgcnVuIGluIHRoZSBVSSB0aHJlYWQgYW5kIGl0IGlzIHRoZSBydW5uYWJsZSdzCi0gICAgICogcmVzcG9uc2liaWxpdHkgdG8gY2FsbCA8Y29kZT5EaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpPC9jb2RlPgotICAgICAqIHRvIGVuc3VyZSBVSSByZXNwb25zaXZlbmVzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsCi0gICAgICAgICAgICBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBzZXRDYW5jZWxhYmxlKGNhbmNlbGFibGUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWJvdXRUb1J1bigpOwotICAgICAgICAgICAgLy9MZXQgdGhlIHByb2dyZXNzIG1vbml0b3Iga25vdyBpZiB0aGV5IG5lZWQgdG8gdXBkYXRlIGluIFVJIFRocmVhZAotICAgICAgICAgICAgcHJvZ3Jlc3NNb25pdG9yLmZvcmtlZCA9IGZvcms7Ci0gICAgICAgICAgICBNb2RhbENvbnRleHQucnVuKHJ1bm5hYmxlLCBmb3JrLCBnZXRQcm9ncmVzc01vbml0b3IoKSwgZ2V0U2hlbGwoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0RGlzcGxheSgpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGZpbmlzaGVkUnVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgYmUgb3BlbmVkIGJlZm9yZSB0aGUgb3BlcmF0aW9uIGlzIHJ1bi4KLSAgICAgKiBEZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gb3BlbiB0aGUgZGlhbG9nIGJlZm9yZSBydW4sCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gb25seSBjcmVhdGUgdGhlIGRpYWxvZywgYnV0IG5vdCBvcGVuIGl0Ci0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldE9wZW5PblJ1bigpIHsKLSAgICAgICAgcmV0dXJuIG9wZW5PblJ1bjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgYmUgb3BlbmVkIGJlZm9yZSB0aGUgb3BlcmF0aW9uIGlzIHJ1bi4KLSAgICAgKiBOT1RFOiBTZXR0aW5nIHRoaXMgdG8gZmFsc2UgYW5kIG5vdCBmb3JraW5nIGEgcHJvY2VzcyBtYXkgc3RhcnZlIGFueQotICAgICAqIGFzeW5jRXhlYyB0aGF0IHRyaWVzIHRvIG9wZW4gdGhlIGRpYWxvZyBsYXRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3Blbk9uUnVuCi0gICAgICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byBvcGVuIHRoZSBkaWFsb2cgYmVmb3JlIHJ1biwKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBvbmx5IGNyZWF0ZSB0aGUgZGlhbG9nLCBidXQgbm90IG9wZW4KLSAgICAgKiAgICAgICAgICAgIGl0Ci0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9wZW5PblJ1bihib29sZWFuIG9wZW5PblJ1bikgewotICAgICAgICB0aGlzLm9wZW5PblJ1biA9IG9wZW5PblJ1bjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXN0aW5nIGRlcHRoIG9mIHJ1bm5pbmcgb3BlcmF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXN0aW5nIGRlcHRoIG9mIHJ1bm5pbmcgb3BlcmF0aW9ucwotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGdldE5lc3RpbmdEZXB0aCgpIHsKLSAgICAgICAgcmV0dXJuIG5lc3RpbmdEZXB0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnRzIHRoZSBuZXN0aW5nIGRlcHRoIG9mIHJ1bm5pbmcgb3BlcmF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50TmVzdGluZ0RlcHRoKCkgewotICAgICAgICBuZXN0aW5nRGVwdGgrKzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWNyZW1lbnRzIHRoZSBuZXN0aW5nIGRlcHRoIG9mIHJ1bm5pbmcgb3BlcmF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICogIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRlY3JlbWVudE5lc3RpbmdEZXB0aCgpIHsKLSAgICAgICAgbmVzdGluZ0RlcHRoLS07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBvcGVyYXRpb24gaXMgcnVuLiBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byBvcGVuIG9yCi0gICAgICogY3JlYXRlIHRoZSBkaWFsb2csIGJhc2VkIG9uIHRoZSBzZXR0aW5nIG9mIDxjb2RlPmdldE9wZW5PblJ1bjwvY29kZT4sCi0gICAgICogYW5kIGluY3JlbWVudCB0aGUgbmVzdGluZyBkZXB0aC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWJvdXRUb1J1bigpIHsKLSAgICAgICAgaWYgKGdldE9wZW5PblJ1bigpKSB7Ci0gICAgICAgICAgICBvcGVuKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjcmVhdGUoKTsKLSAgICAgICAgfQotICAgICAgICBpbmNyZW1lbnROZXN0aW5nRGVwdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQganVzdCBhZnRlciB0aGUgb3BlcmF0aW9uIGlzIHJ1bi4gRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZGVjcmVtZW50Ci0gICAgICogdGhlIG5lc3RpbmcgZGVwdGgsIGFuZCBjbG9zZSB0aGUgZGlhbG9nLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZFJ1bigpIHsKLSAgICAgICAgZGVjcmVtZW50TmVzdGluZ0RlcHRoKCk7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRoZSBwcm9ncmVzcyBkaWFsb2cgaXMgY2FuY2VsYWJsZSBvciBub3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhbmNlbGFibGUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbmQgdXNlciBjYW4gY2FuY2VsIHRoaXMgcHJvZ3Jlc3MKLSAgICAgKiAgICAgICAgICAgIGRpYWxvZywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBjYW5ub3QgYmUgY2FuY2VsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWxhYmxlKGJvb2xlYW4gY2FuY2VsYWJsZSkgewotICAgICAgICBpZiAoY2FuY2VsID09IG51bGwpCi0gICAgICAgICAgICBlbmFibGVDYW5jZWxCdXR0b24gPSBjYW5jZWxhYmxlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc3luY1NldE9wZXJhdGlvbkNhbmNlbEJ1dHRvbkVuYWJsZWQoY2FuY2VsYWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIHRvIGVuYWJsZS9kaXNhYmxlIENhbmNlbCBidXR0b24gZm9yIHRoaXMgZGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiCi0gICAgICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byBlbmFibGUgdGhlIGNhbmNlbCBidXR0b24sIGFuZAotICAgICAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGRpc2FibGUgaXQKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0T3BlcmF0aW9uQ2FuY2VsQnV0dG9uRW5hYmxlZChib29sZWFuIGIpIHsKLSAgICAgICAgb3BlcmF0aW9uQ2FuY2VsYWJsZVN0YXRlID0gYjsKLSAgICAgICAgY2FuY2VsLnNldEVuYWJsZWQoYik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZyNnZXRJbWFnZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0SW5mb0ltYWdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIGxhYmVsLgotICAgICAqIEBwYXJhbSBtZXNzYWdlU3RyaW5nIFRoZSBzdHJpbmcgZm9yIHRoZSBuZXcgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZVN0cmluZykgewotICAgICAgICAvL211c3Qgbm90IHNldCBudWxsIHRleHQgaW4gYSBsYWJlbAotICAgICAgICBtZXNzYWdlID0gbWVzc2FnZVN0cmluZyA9PSBudWxsID8gIiIgOiBtZXNzYWdlU3RyaW5nOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChtZXNzYWdlTGFiZWwgPT0gbnVsbCB8fCBtZXNzYWdlTGFiZWwuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0VG9vbFRpcFRleHQobWVzc2FnZVN0cmluZyk7Ci0gICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KHNob3J0ZW5UZXh0KG1lc3NhZ2UsbWVzc2FnZUxhYmVsKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBtZXNzYWdlIGxhYmVsLiBSZXF1aXJlZCBpZiB0aGUgbW9uaXRvciBpcyBmb3JrZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgaWYgKG1lc3NhZ2VMYWJlbCA9PSBudWxsIHx8IG1lc3NhZ2VMYWJlbC5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIG1lc3NhZ2VMYWJlbC51cGRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I29wZW4oKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgb3BlbigpIHsKLSAgICAgICAgLy9DaGVjayB0byBiZSBzdXJlIGl0IGlzIG5vdCBhbHJlYWR5IGRvbmUuIElmIGl0IGlzIGp1c3QgcmV0dXJuIE9LLgotICAgICAgICBpZiAoIWdldE9wZW5PblJ1bigpKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TmVzdGluZ0RlcHRoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL1N0YXR1c0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9TdGF0dXNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkYjViYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL1N0YXR1c0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBkaWFsb2dzIHdpdGggYSBzdGF0dXMgYmFyIGFuZCBPSy9DQU5DRUwgYnV0dG9ucy4KLSAqIFRoZSBzdGF0dXMgbWVzc2FnZSBpcyBzcGVjaWZpZWQgaW4gYW4gSVN0YXR1cyB3aGljaCBjYW4gYmUgb2Ygc2V2ZXJpdHkKLSAqIEVSUk9SLCBXQVJOSU5HLCBJTkZPIG9yIE9LLiBUaGUgT0sgYnV0dG9uIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgZGVwZW5kaW5nIG9uCi0gKiB0aGUgc3RhdHVzLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0dXNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBCdXR0b24gZk9rQnV0dG9uOwotCi0JcHJpdmF0ZSBNZXNzYWdlTGluZSBmU3RhdHVzTGluZTsKLQotCXByaXZhdGUgSVN0YXR1cyBmTGFzdFN0YXR1czsKLQotCXByaXZhdGUgU3RyaW5nIGZUaXRsZTsKLQotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCi0JcHJpdmF0ZSBib29sZWFuIGZTdGF0dXNMaW5lQWJvdmVCdXR0b25zID0gdHJ1ZTsKLQotCS8qKgotCSAqIEEgbWVzc2FnZSBsaW5lIGRpc3BsYXlpbmcgYSBzdGF0dXMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBNZXNzYWdlTGluZSBleHRlbmRzIENMYWJlbCB7Ci0KLQkJcHJpdmF0ZSBDb2xvciBmTm9ybWFsTXNnQXJlYUJhY2tncm91bmQ7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSBsaW5lIGFzIGEgY2hpbGQgb2YgdGhlIGdpdmVuIHBhcmVudC4KLQkJICogQHBhcmFtIHBhcmVudAotCQkgKi8KLQkJcHVibGljIE1lc3NhZ2VMaW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXRoaXMocGFyZW50LCBTV1QuTEVGVCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBtZXNzYWdlIGxpbmUgYXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50IGFuZCB3aXRoIHRoZQotCQkgKiBnaXZlbiBTV1Qgc3R5bGViaXRzLgotCQkgKiBAcGFyYW0gcGFyZW50Ci0JCSAqIEBwYXJhbSBzdHlsZQotCQkgKi8KLQkJcHVibGljIE1lc3NhZ2VMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCQlmTm9ybWFsTXNnQXJlYUJhY2tncm91bmQgPSBnZXRCYWNrZ3JvdW5kKCk7Ci0JCX0KLQotCQkvKioKLQkJICogRmluZCBhbiBpbWFnZSBhc3NvY2F0ZWQgd2l0aCB0aGUgc3RhdHVzLgotCQkgKiBAcGFyYW0gc3RhdHVzCi0JCSAqIEByZXR1cm4gSW1hZ2UKLQkJICovCi0JCXByaXZhdGUgSW1hZ2UgZmluZEltYWdlKElTdGF0dXMgc3RhdHVzKSB7Ci0JCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIGlmIChzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotCQkJCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZShEaWFsb2cuRExHX0lNR19NRVNTQUdFX0VSUk9SKTsKLQkJCX0gZWxzZSBpZiAoc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5XQVJOSU5HKSkgewotCQkJCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZShEaWFsb2cuRExHX0lNR19NRVNTQUdFX1dBUk5JTkcpOwotCQkJfSBlbHNlIGlmIChzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLklORk8pKSB7Ci0JCQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlKERpYWxvZy5ETEdfSU1HX01FU1NBR0VfSU5GTyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBtZXNzYWdlIGFuZCBpbWFnZSB0byB0aGUgZ2l2ZW4gc3RhdHVzLiAKLQkJICogQHBhcmFtIHN0YXR1cyBJU3RhdHVzIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIHNldCB0aGUgZW1wdHkgdGV4dCBhbmQgbm8gaW1hZ2UuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRFcnJvclN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJc2V0VGV4dChtZXNzYWdlKTsKLQkJCQkJc2V0SW1hZ2UoZmluZEltYWdlKHN0YXR1cykpOwotCQkJCQlzZXRCYWNrZ3JvdW5kKEpGYWNlQ29sb3JzLmdldEVycm9yQmFja2dyb3VuZChnZXREaXNwbGF5KCkpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCQotCQkJc2V0SW1hZ2UobnVsbCk7Ci0JCQlzZXRCYWNrZ3JvdW5kKGZOb3JtYWxNc2dBcmVhQmFja2dyb3VuZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgc3RhdHVzIGRpYWxvZy4KLQkgKiBAcGFyYW0gcGFyZW50IAotCSAqIAkJCXRoZSBwYXJlbnQgU2hlbGwgb2YgdGhlIGRpYWxvZwotCSAqLwotCXB1YmxpYyBTdGF0dXNEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWZMYXN0U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLFBvbGljeS5KRkFDRSxJU3RhdHVzLk9LLFV0aWwuWkVST19MRU5HVEhfU1RSSU5HLG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNwZWNpZmllcyB3aGV0aGVyIHN0YXR1cyBsaW5lIGFwcGVhcnMgdG8gdGhlIGxlZnQgb2YgdGhlIGJ1dHRvbnMKLQkgKiAoZGVmYXVsdCkgb3IgYWJvdmUgdGhlbS4KLQkgKiAKLQkgKiBAcGFyYW0gYWJvdmVCdXR0b25zCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiBzdGF0dXMgbGluZSBpcyBwbGFjZWQgYWJvdmUgYnV0dG9uczsgaWYKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiB0byB0aGUgcmlnaHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lQWJvdmVCdXR0b25zKGJvb2xlYW4gYWJvdmVCdXR0b25zKSB7Ci0JCWZTdGF0dXNMaW5lQWJvdmVCdXR0b25zID0gYWJvdmVCdXR0b25zOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgZGlhbG9nJ3Mgc3RhdHVzIGxpbmUgdG8gcmVmbGVjdCB0aGUgZ2l2ZW4gc3RhdHVzLiBJdCBpcyBzYWZlCi0JICogdG8gY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgdGhlIGRpYWxvZyBoYXMgYmVlbiBvcGVuZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWZMYXN0U3RhdHVzID0gc3RhdHVzOwotCQlpZiAoZlN0YXR1c0xpbmUgIT0gbnVsbCAmJiAhZlN0YXR1c0xpbmUuaXNEaXNwb3NlZCgpKSB7Ci0JCQl1cGRhdGVCdXR0b25zRW5hYmxlU3RhdGUoc3RhdHVzKTsKLQkJCWZTdGF0dXNMaW5lLnNldEVycm9yU3RhdHVzKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXN0IHN0YXR1cy4KLQkgKiBAcmV0dXJuIElTdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBmTGFzdFN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgdGhlIG9rIGJ1dHRvbiB0byByZWZsZWN0IHRoZSBnaXZlbiBzdGF0dXMuCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gdXBkYXRlIGFkZGl0aW9uYWwgYnV0dG9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICB0aGUgc3RhdHVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnNFbmFibGVTdGF0ZShJU3RhdHVzIHN0YXR1cykgewotCQlpZiAoZk9rQnV0dG9uICE9IG51bGwgJiYgIWZPa0J1dHRvbi5pc0Rpc3Bvc2VkKCkpCi0JCQlmT2tCdXR0b24uc2V0RW5hYmxlZCghc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpOwotCX0KLQotCS8qCi0JICogQHNlZSBXaW5kb3cjY3JlYXRlKFNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJaWYgKGZUaXRsZSAhPSBudWxsKQotCQkJc2hlbGwuc2V0VGV4dChmVGl0bGUpOwotCX0KLQotCS8qCi0JICogQHNlZSBXaW5kb3cjY3JlYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQlpZiAoZkxhc3RTdGF0dXMgIT0gbnVsbCkgewotCQkJLy8gcG9saWN5OiBkaWFsb2dzIGFyZSBub3QgYWxsb3dlZCB0byBjb21lIHVwIHdpdGggYW4gZXJyb3IgbWVzc2FnZQotCQkJaWYgKGZMYXN0U3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLQkJCQkvLyByZW1vdmUgdGhlIG1lc3NhZ2UKLQkJCQlmTGFzdFN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCWZMYXN0U3RhdHVzLmdldFBsdWdpbigpLCBmTGFzdFN0YXR1cy5nZXRDb2RlKCksCi0JCQkJCQkiIiwgZkxhc3RTdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl1cGRhdGVTdGF0dXMoZkxhc3RTdGF0dXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIERpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZk9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQotCQlpZiAoZlN0YXR1c0xpbmVBYm92ZUJ1dHRvbnMpIHsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJfSBlbHNlIHsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJfQotCi0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJZlN0YXR1c0xpbmUgPSBuZXcgTWVzc2FnZUxpbmUoY29tcG9zaXRlKTsKLQkJZlN0YXR1c0xpbmUuc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJZlN0YXR1c0xpbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZTdGF0dXNMaW5lLnNldEVycm9yU3RhdHVzKG51bGwpOwotCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJc3VwZXIuY3JlYXRlQnV0dG9uQmFyKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGl0bGUgZm9yIHRoaXMgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIHRpdGxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotCQlmVGl0bGUgPSB0aXRsZSAhPSBudWxsID8gdGl0bGUgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCWlmICgoc2hlbGwgIT0gbnVsbCkgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkKLQkJCXNoZWxsLnNldFRleHQoZlRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSBmb3IgdGhpcyBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJZkltYWdlID0gaW1hZ2U7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJaWYgKChzaGVsbCAhPSBudWxsKSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJc2hlbGwuc2V0SW1hZ2UoZkltYWdlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvVGl0bGVBcmVhRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL1RpdGxlQXJlYURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWRkYTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvVGl0bGVBcmVhRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEtvbnN0YW50aW4gU2NoZWdsb3YgPHNjaGVnbG92X2tlQG5sbWsucnUgPiAtIEZpeCBmb3IgYnVnIDQxMTcyCi0gKiAgICAgW0RpYWxvZ3NdIEJ1ZyB3aXRoIEltYWdlIGluIFRpdGxlQXJlYURpYWxvZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSBkaWFsb2cgdGhhdCBoYXMgYSB0aXRsZSBhcmVhIGZvciBkaXNwbGF5aW5nIGEgdGl0bGUgYW5kIGFuIGltYWdlIGFzIHdlbGwgYXMKLSAqIGEgY29tbW9uIGFyZWEgZm9yIGRpc3BsYXlpbmcgYSBkZXNjcmlwdGlvbiwgYSBtZXNzYWdlLCBvciBhbiBlcnJvciBtZXNzYWdlLgotICogPHA+Ci0gKiBUaGlzIGRpYWxvZyBjbGFzcyBtYXkgYmUgc3ViY2xhc3NlZC4KLSAqLwotcHVibGljIGNsYXNzIFRpdGxlQXJlYURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0gICAgLyoqCi0gICAgICogSW1hZ2UgcmVnaXN0cnkga2V5IGZvciBlcnJvciBtZXNzYWdlIGltYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERMR19JTUdfVElUTEVfRVJST1IgPSBETEdfSU1HX01FU1NBR0VfRVJST1I7Ci0KLSAgICAvKioKLSAgICAgKiBJbWFnZSByZWdpc3RyeSBrZXkgZm9yIGJhbm5lciBpbWFnZSAodmFsdWUKLSAgICAgKiA8Y29kZT4iZGlhbG9nX3RpdGxlX2Jhbm5lcl9pbWFnZSI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETEdfSU1HX1RJVExFX0JBTk5FUiA9ICJkaWFsb2dfdGl0bGVfYmFubmVyX2ltYWdlIjsvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBNZXNzYWdlIHR5cGUgY29uc3RhbnQgdXNlZCB0byBkaXNwbGF5IGFuIGluZm8gaWNvbiB3aXRoIHRoZSBtZXNzYWdlLgotICAgICAqIAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElORk9fTUVTU0FHRSA9ICJJTkZPX01FU1NBR0UiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBNZXNzYWdlIHR5cGUgY29uc3RhbnQgdXNlZCB0byBkaXNwbGF5IGEgd2FybmluZyBpY29uIHdpdGggdGhlIG1lc3NhZ2UuCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV0FSTklOR19NRVNTQUdFID0gIldBUk5JTkdfTUVTU0FHRSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFNwYWNlIGJldHdlZW4gYW4gaW1hZ2UgYW5kIGEgbGFiZWwKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSF9HQVBfSU1BR0UgPSA1OwotCi0gICAgLy9NaW5pbXVtIGRpYWxvZyB3aWR0aCAoaW4gZGlhbG9nIHVuaXRzKQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fRElBTE9HX1dJRFRIID0gMzUwOwotCi0gICAgLy9NaW5pbXVtIGRpYWxvZyBoZWlnaHQgKGluIGRpYWxvZyB1bml0cykKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0RJQUxPR19IRUlHSFQgPSAxNTA7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgSW1hZ2VSZWdpc3RyeSByZWcgPSBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0gICAgICAgIHJlZy5wdXQoRExHX0lNR19USVRMRV9CQU5ORVIsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZSgKLSAgICAgICAgICAgICAgICBUaXRsZUFyZWFEaWFsb2cuY2xhc3MsICJpbWFnZXMvdGl0bGVfYmFubmVyLmdpZiIpKTsvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBMYWJlbCB0aXRsZUxhYmVsOwotCi0gICAgcHJpdmF0ZSBMYWJlbCB0aXRsZUltYWdlOwotCi0gICAgcHJpdmF0ZSBMYWJlbCBib3R0b21GaWxsZXJMYWJlbDsKLQotICAgIHByaXZhdGUgTGFiZWwgbGVmdEZpbGxlckxhYmVsOwotCi0gICAgcHJpdmF0ZSBSR0IgdGl0bGVBcmVhUkdCOwotCi0gICAgQ29sb3IgdGl0bGVBcmVhQ29sb3I7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQotICAgIHByaXZhdGUgVGV4dCBtZXNzYWdlTGFiZWw7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSB3b3JrQXJlYTsKLQotICAgIHByaXZhdGUgTGFiZWwgbWVzc2FnZUltYWdlTGFiZWw7Ci0KLSAgICBwcml2YXRlIEltYWdlIG1lc3NhZ2VJbWFnZTsKLQotICAgIHByaXZhdGUgQ29sb3Igbm9ybWFsTXNnQXJlYUJhY2tncm91bmQ7Ci0KLSAgICBwcml2YXRlIENvbG9yIGVycm9yTXNnQXJlYUJhY2tncm91bmQ7Ci0KLSAgICBwcml2YXRlIEltYWdlIGVycm9yTXNnSW1hZ2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvd2luZ0Vycm9yID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdGl0bGVJbWFnZUxhcmdlc3QgPSB0cnVlOwotICAgIAotICAgIHByaXZhdGUgaW50IG1lc3NhZ2VMYWJlbEhlaWdodDsKLQotICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlIGEgbmV3IHRpdGxlIGFyZWEgZGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBTV1Qgc2hlbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgVGl0bGVBcmVhRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgRGlhbG9nLmNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGRpYWxvZyB1bml0cwotICAgICAgICBpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLSAgICAgICAgRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOwotICAgICAgICBwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIEZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICAgIHBhcmVudC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAvL05vdyBjcmVhdGUgYSB3b3JrIGFyZWEgZm9yIHRoZSByZXN0IG9mIHRoZSBkaWFsb2cKLSAgICAgICAgd29ya0FyZWEgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGNoaWxkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgY2hpbGRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgY2hpbGRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBjaGlsZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgICAgICB3b3JrQXJlYS5zZXRMYXlvdXQoY2hpbGRMYXlvdXQpOwotICAgICAgICBDb250cm9sIHRvcCA9IGNyZWF0ZVRpdGxlQXJlYShwYXJlbnQpOwotICAgICAgICByZXNldFdvcmtBcmVhQXR0YWNobWVudHModG9wKTsKLSAgICAgICAgd29ya0FyZWEuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBkaWFsb2cgdW5pdHMKLSAgICAgICAgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHdvcmtBcmVhKTsKLSAgICAgICAgLy8gY3JlYXRlIHRoZSBkaWFsb2cgYXJlYSBhbmQgYnV0dG9uIGJhcgotICAgICAgICBkaWFsb2dBcmVhID0gY3JlYXRlRGlhbG9nQXJlYSh3b3JrQXJlYSk7Ci0gICAgICAgIGJ1dHRvbkJhciA9IGNyZWF0ZUJ1dHRvbkJhcih3b3JrQXJlYSk7Ci0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIHVwcGVyIHBhcnQgb2YgdGhpcyBkaWFsb2cgKGFib3ZlCi0gICAgICogdGhlIGJ1dHRvbiBiYXIpLgotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBjcmVhdGVzCi0gICAgICogYW5kIHJldHVybnMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoIG5vIG1hcmdpbnMgYW5kIHNwYWNpbmcuCi0gICAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGRpYWxvZyBhcmVhCi0gICAgICogQHJldHVybiB0aGUgZGlhbG9nIGFyZWEgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBjcmVhdGUgdGhlIHRvcCBsZXZlbCBjb21wb3NpdGUgZm9yIHRoZSBkaWFsb2cgYXJlYQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgLy8gQnVpbGQgdGhlIHNlcGFyYXRvciBsaW5lCi0gICAgICAgIExhYmVsIHRpdGxlQmFyU2VwYXJhdG9yID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICB8IFNXVC5TRVBBUkFUT1IpOwotICAgICAgICB0aXRsZUJhclNlcGFyYXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkaWFsb2cncyB0aXRsZSBhcmVhLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBTV1QgcGFyZW50IGZvciB0aGUgdGl0bGUgYXJlYSB3aWRnZXRzCi0gICAgICogQHJldHVybiBDb250cm9sIHdpdGggdGhlIGhpZ2hlc3QgeCBheGlzIHZhbHVlLgotICAgICAqLwotICAgIHByaXZhdGUgQ29udHJvbCBjcmVhdGVUaXRsZUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBhZGQgYSBkaXNwb3NlIGxpc3RlbmVyCi0gICAgICAgIHBhcmVudC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRpdGxlQXJlYUNvbG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRpdGxlQXJlYUNvbG9yLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIC8vIERldGVybWluZSB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgdGl0bGUgYmFyCi0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0gICAgICAgIENvbG9yIGJhY2tncm91bmQ7Ci0gICAgICAgIENvbG9yIGZvcmVncm91bmQ7Ci0gICAgICAgIGlmICh0aXRsZUFyZWFSR0IgIT0gbnVsbCkgewotICAgICAgICAgICAgdGl0bGVBcmVhQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgdGl0bGVBcmVhUkdCKTsKLSAgICAgICAgICAgIGJhY2tncm91bmQgPSB0aXRsZUFyZWFDb2xvcjsKLSAgICAgICAgICAgIGZvcmVncm91bmQgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYmFja2dyb3VuZCA9IEpGYWNlQ29sb3JzLmdldEJhbm5lckJhY2tncm91bmQoZGlzcGxheSk7Ci0gICAgICAgICAgICBmb3JlZ3JvdW5kID0gSkZhY2VDb2xvcnMuZ2V0QmFubmVyRm9yZWdyb3VuZChkaXNwbGF5KTsKLSAgICAgICAgfQotICAgICAgICBpbnQgdmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0gICAgICAgIGludCBob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLSAgICAgICAgcGFyZW50LnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0gICAgICAgIC8vIERpYWxvZyBpbWFnZSBAIHJpZ2h0Ci0gICAgICAgIHRpdGxlSW1hZ2UgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgdGl0bGVJbWFnZS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotICAgICAgICB0aXRsZUltYWdlLnNldEltYWdlKEpGYWNlUmVzb3VyY2VzLmdldEltYWdlKERMR19JTUdfVElUTEVfQkFOTkVSKSk7Ci0gICAgICAgIEZvcm1EYXRhIGltYWdlRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICBpbWFnZURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgICAgICAvLyBOb3RlOiBkbyBub3QgdXNlIGhvcml6b250YWxTcGFjaW5nIG9uIHRoZSByaWdodCBhcyB0aGF0IHdvdWxkIGJlIGEKLSAgICAgICAgLy8gcmVncmVzc2lvbiBmcm9tCi0gICAgICAgIC8vIHRoZSBSMi54IHN0eWxlIHdoZXJlIHRoZXJlIHdhcyBubyBtYXJnaW4gb24gdGhlIHJpZ2h0IGFuZCBpbWFnZXMgYXJlCi0gICAgICAgIC8vIGZsdXNoIHRvIHRoZSByaWdodAotICAgICAgICAvLyBoYW5kIHNpZGUuIHNlZSByZW9wZW5lZCBjb21tZW50cyBpbiA0MTE3MgotICAgICAgICBpbWFnZURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsgLy8gaG9yaXpvbnRhbFNwYWNpbmcKLSAgICAgICAgdGl0bGVJbWFnZS5zZXRMYXlvdXREYXRhKGltYWdlRGF0YSk7Ci0gICAgICAgIC8vIFRpdGxlIGxhYmVsIEAgdG9wLCBsZWZ0Ci0gICAgICAgIHRpdGxlTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0gICAgICAgIEpGYWNlQ29sb3JzLnNldENvbG9ycyh0aXRsZUxhYmVsLCBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kKTsKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEJhbm5lckZvbnQoKSk7Ci0gICAgICAgIHRpdGxlTGFiZWwuc2V0VGV4dCgiICIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgRm9ybURhdGEgdGl0bGVEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICAgIHRpdGxlRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgdmVydGljYWxTcGFjaW5nKTsKLSAgICAgICAgdGl0bGVEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHRpdGxlSW1hZ2UpOwotICAgICAgICB0aXRsZURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBob3Jpem9udGFsU3BhY2luZyk7Ci0gICAgICAgIHRpdGxlTGFiZWwuc2V0TGF5b3V0RGF0YSh0aXRsZURhdGEpOwotICAgICAgICAvLyBNZXNzYWdlIGltYWdlIEAgYm90dG9tLCBsZWZ0Ci0gICAgICAgIG1lc3NhZ2VJbWFnZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkNFTlRFUik7Ci0gICAgICAgIG1lc3NhZ2VJbWFnZUxhYmVsLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0gICAgICAgIC8vIE1lc3NhZ2UgbGFiZWwgQCBib3R0b20sIGNlbnRlcgotICAgICAgICBtZXNzYWdlTGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5XUkFQIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIEpGYWNlQ29sb3JzLnNldENvbG9ycyhtZXNzYWdlTGFiZWwsIGZvcmVncm91bmQsIGJhY2tncm91bmQpOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0VGV4dCgiIFxuICIpOyAvLyB0d28gbGluZXMvLyROT04tTkxTLTEkCi0gICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0gICAgICAgIG1lc3NhZ2VMYWJlbEhlaWdodCA9IG1lc3NhZ2VMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnk7Ci0gICAgICAgIC8vIEZpbGxlciBsYWJlbHMKLSAgICAgICAgbGVmdEZpbGxlckxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkNFTlRFUik7Ci0gICAgICAgIGxlZnRGaWxsZXJMYWJlbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotICAgICAgICBib3R0b21GaWxsZXJMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5DRU5URVIpOwotICAgICAgICBib3R0b21GaWxsZXJMYWJlbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotICAgICAgICBzZXRMYXlvdXRzRm9yTm9ybWFsTWVzc2FnZSh2ZXJ0aWNhbFNwYWNpbmcsIGhvcml6b250YWxTcGFjaW5nKTsKLSAgICAgICAgZGV0ZXJtaW5lVGl0bGVJbWFnZUxhcmdlc3QoKTsKLSAgICAgICAgaWYgKHRpdGxlSW1hZ2VMYXJnZXN0KQotICAgICAgICAgICAgcmV0dXJuIHRpdGxlSW1hZ2U7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlTGFiZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSB0aXRsZSBpbWFnZSBpcyBsYXJnZXIgdGhhbiB0aGUgdGl0bGUgbWVzc2FnZSBhbmQgbWVzc2FnZQotICAgICAqIGFyZWEuIFRoaXMgaXMgdXNlZCBmb3IgbGF5b3V0IGRlY2lzaW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGV0ZXJtaW5lVGl0bGVJbWFnZUxhcmdlc3QoKSB7Ci0gICAgICAgIGludCB0aXRsZVkgPSB0aXRsZUltYWdlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLSAgICAgICAgaW50IHZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotICAgICAgICBpbnQgbGFiZWxZID0gdGl0bGVMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnk7Ci0gICAgICAgIGxhYmVsWSArPSB2ZXJ0aWNhbFNwYWNpbmc7Ci0gICAgICAgIGxhYmVsWSArPSBtZXNzYWdlTGFiZWxIZWlnaHQ7Ci0gICAgICAgIGxhYmVsWSArPSB2ZXJ0aWNhbFNwYWNpbmc7Ci0gICAgICAgIHRpdGxlSW1hZ2VMYXJnZXN0ID0gdGl0bGVZID4gbGFiZWxZOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbGF5b3V0IHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2VMYWJlbCwgbWVzc2FnZUltYWdlTGFiZWwgYW5kCi0gICAgICogZmlsbGVyTGFiZWwgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIGEgbm9ybWFsIG1lc3NhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZlcnRpY2FsU3BhY2luZwotICAgICAqICAgICAgICAgICAgaW50IFRoZSBzcGFjaW5nIGJldHdlZW4gd2lkZ2V0cyBvbiB0aGUgdmVydGljYWwgYXhpcy4KLSAgICAgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYWNpbmcKLSAgICAgKiAgICAgICAgICAgIGludCBUaGUgc3BhY2luZyBiZXR3ZWVuIHdpZGdldHMgb24gdGhlIGhvcml6b250YWwgYXhpcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TGF5b3V0c0Zvck5vcm1hbE1lc3NhZ2UoaW50IHZlcnRpY2FsU3BhY2luZywKLSAgICAgICAgICAgIGludCBob3Jpem9udGFsU3BhY2luZykgewotICAgICAgICBGb3JtRGF0YSBtZXNzYWdlSW1hZ2VEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICAgIG1lc3NhZ2VJbWFnZURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRpdGxlTGFiZWwsIHZlcnRpY2FsU3BhY2luZyk7Ci0gICAgICAgIG1lc3NhZ2VJbWFnZURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBIX0dBUF9JTUFHRSk7Ci0gICAgICAgIG1lc3NhZ2VJbWFnZUxhYmVsLnNldExheW91dERhdGEobWVzc2FnZUltYWdlRGF0YSk7Ci0gICAgICAgIEZvcm1EYXRhIG1lc3NhZ2VMYWJlbERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGl0bGVMYWJlbCwgdmVydGljYWxTcGFjaW5nKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCh0aXRsZUltYWdlKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1lc3NhZ2VJbWFnZUxhYmVsLAotICAgICAgICAgICAgICAgIGhvcml6b250YWxTcGFjaW5nKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsRGF0YS5oZWlnaHQgPSBtZXNzYWdlTGFiZWxIZWlnaHQ7Ci0gICAgICAgIGlmICh0aXRsZUltYWdlTGFyZ2VzdCkKLSAgICAgICAgICAgIG1lc3NhZ2VMYWJlbERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KHRpdGxlSW1hZ2UsIDAsCi0gICAgICAgICAgICAgICAgICAgIFNXVC5CT1RUT00pOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShtZXNzYWdlTGFiZWxEYXRhKTsKLSAgICAgICAgRm9ybURhdGEgZmlsbGVyRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICBmaWxsZXJEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgaG9yaXpvbnRhbFNwYWNpbmcpOwotICAgICAgICBmaWxsZXJEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChtZXNzYWdlSW1hZ2VMYWJlbCwgMCk7Ci0gICAgICAgIGZpbGxlckRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KG1lc3NhZ2VMYWJlbCwgMCwgU1dULkJPVFRPTSk7Ci0gICAgICAgIGJvdHRvbUZpbGxlckxhYmVsLnNldExheW91dERhdGEoZmlsbGVyRGF0YSk7Ci0gICAgICAgIEZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWVzc2FnZUltYWdlTGFiZWwsIDAsIFNXVC5UT1ApOwotICAgICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KG1lc3NhZ2VJbWFnZUxhYmVsLCAwLCBTV1QuQk9UVE9NKTsKLSAgICAgICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChtZXNzYWdlSW1hZ2VMYWJlbCwgMCk7Ci0gICAgICAgIGxlZnRGaWxsZXJMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5UaXRsZUFyZWFEaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5XaW5kb3c8L2NvZGU+IG1ldGhvZHMgcmV0dXJucyBhbiBpbml0aWFsIHNpemUgd2hpY2ggaXMgYXQgbGVhc3QKLSAgICAgKiBzb21lIHJlYXNvbmFibGUgbWluaW11bS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGRpYWxvZwotICAgICAqLwotICAgIHByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpIHsKLSAgICAgICAgUG9pbnQgc2hlbGxTaXplID0gc3VwZXIuZ2V0SW5pdGlhbFNpemUoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBQb2ludChNYXRoLm1heCgKLSAgICAgICAgICAgICAgICBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhNSU5fRElBTE9HX1dJRFRIKSwgc2hlbGxTaXplLngpLAotICAgICAgICAgICAgICAgIE1hdGgubWF4KGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhNSU5fRElBTE9HX0hFSUdIVCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGVsbFNpemUueSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldGFpbmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotICAgICAqIAotICAgICAqIFJldHVybnMgdGhlIHRpdGxlIGFyZWEgY29tcG9zaXRlLiBUaGVyZSBpcyBubyBjb21wb3NpdGUgaW4gdGhpcwotICAgICAqIGltcGxlbWVudGF0aW9uIHNvIHRoZSBzaGVsbCBpcyByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIENvbXBvc2l0ZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZSBnZXRUaXRsZUFyZWEoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTaGVsbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRpdGxlIGltYWdlIGxhYmVsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRpdGxlIGltYWdlIGxhYmVsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExhYmVsIGdldFRpdGxlSW1hZ2VMYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIHRpdGxlSW1hZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGxheSB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS4gVGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgbWVzc2FnZSBpcyBzYXZlZAotICAgICAqIGFuZCB3aWxsIGJlIHJlZGlzcGxheWVkIHdoZW4gdGhlIGVycm9yIG1lc3NhZ2UgaXMgc2V0IHRvCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5ld0Vycm9yTWVzc2FnZQotICAgICAqICAgICAgICAgICAgdGhlIG5ld0Vycm9yTWVzc2FnZSB0byBkaXNwbGF5IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBuZXdFcnJvck1lc3NhZ2UpIHsKLSAgICAgICAgLy8gQW55IGNoYW5nZT8KLSAgICAgICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsID8gbmV3RXJyb3JNZXNzYWdlID09IG51bGwgOiBlcnJvck1lc3NhZ2UKLSAgICAgICAgICAgICAgICAuZXF1YWxzKG5ld0Vycm9yTWVzc2FnZSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGVycm9yTWVzc2FnZSA9IG5ld0Vycm9yTWVzc2FnZTsKLSAgICAgICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc2hvd2luZ0Vycm9yKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2Ugd2VyZSBwcmV2aW91c2x5IHNob3dpbmcgYW4gZXJyb3IKLSAgICAgICAgICAgICAgICBzaG93aW5nRXJyb3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzZXRNZXNzYWdlQmFja2dyb3VuZHMoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gc2hvdyB0aGUgbWVzc2FnZQotICAgICAgICAgICAgLy8gYXZvaWQgY2FsbGluZyBzZXRNZXNzYWdlIGluIGNhc2UgaXQgaXMgb3ZlcnJpZGRlbiB0byBjYWxsCi0gICAgICAgICAgICAvLyBzZXRFcnJvck1lc3NhZ2UsCi0gICAgICAgICAgICAvLyB3aGljaCB3b3VsZCByZXN1bHQgaW4gYSByZWN1cnNpdmUgaW5maW5pdGUgbG9vcAotICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgLy90aGlzIHNob3VsZCBwcm9iYWJseSBuZXZlciBoYXBwZW4gc2luY2UKLSAgICAgICAgICAgICAgICAvLyBzZXRNZXNzYWdlIGRvZXMgdGhpcyBjb252ZXJzaW9uLi4uLgotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdXBkYXRlTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgIG1lc3NhZ2VJbWFnZUxhYmVsLnNldEltYWdlKG1lc3NhZ2VJbWFnZSk7Ci0gICAgICAgICAgICBzZXRJbWFnZUxhYmVsVmlzaWJsZShtZXNzYWdlSW1hZ2UgIT0gbnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL0FkZCBpbiBhIHNwYWNlIGZvciBsYXlvdXQgcHVycG9zZXMgYnV0IGRvIG5vdAotICAgICAgICAgICAgLy9jaGFuZ2UgdGhlIGluc3RhbmNlIHZhcmlhYmxlCi0gICAgICAgICAgICBTdHJpbmcgZGlzcGxheWVkRXJyb3JNZXNzYWdlID0gIiAiICsgZXJyb3JNZXNzYWdlOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB1cGRhdGVNZXNzYWdlKGRpc3BsYXllZEVycm9yTWVzc2FnZSk7Ci0gICAgICAgICAgICBpZiAoIXNob3dpbmdFcnJvcikgewotICAgICAgICAgICAgICAgIC8vIHdlIHdlcmUgbm90IHByZXZpb3VzbHkgc2hvd2luZyBhbiBlcnJvcgotICAgICAgICAgICAgICAgIHNob3dpbmdFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gbGF6eSBpbml0aWFsaXplIHRoZSBlcnJvciBiYWNrZ3JvdW5kIGNvbG9yIGFuZCBpbWFnZQotICAgICAgICAgICAgICAgIGlmIChlcnJvck1zZ0FyZWFCYWNrZ3JvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2dBcmVhQmFja2dyb3VuZCA9IEpGYWNlQ29sb3JzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVycm9yQmFja2dyb3VuZChtZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2dJbWFnZSA9IEpGYWNlUmVzb3VyY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEltYWdlKERMR19JTUdfVElUTEVfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBzaG93IHRoZSBlcnJvcgotICAgICAgICAgICAgICAgIG5vcm1hbE1zZ0FyZWFCYWNrZ3JvdW5kID0gbWVzc2FnZUxhYmVsLmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgICAgICAgICBzZXRNZXNzYWdlQmFja2dyb3VuZHModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUltYWdlTGFiZWwuc2V0SW1hZ2UoZXJyb3JNc2dJbWFnZSk7Ci0gICAgICAgICAgICAgICAgc2V0SW1hZ2VMYWJlbFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGF5b3V0Rm9yTmV3TWVzc2FnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlLWxheW91dCB0aGUgbGFiZWxzIGZvciB0aGUgbmV3IG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxheW91dEZvck5ld01lc3NhZ2UoKSB7Ci0gICAgICAgIGludCB2ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLSAgICAgICAgaW50IGhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotICAgICAgICAvL0lmIHRoZXJlIGFyZSBubyBpbWFnZXMgdGhlbiBsYXlvdXQgYXMgbm9ybWFsCi0gICAgICAgIGlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCAmJiBtZXNzYWdlSW1hZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0SW1hZ2VMYWJlbFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgc2V0TGF5b3V0c0Zvck5vcm1hbE1lc3NhZ2UodmVydGljYWxTcGFjaW5nLCBob3Jpem9udGFsU3BhY2luZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXNzYWdlSW1hZ2VMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgYm90dG9tRmlsbGVyTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIGxlZnRGaWxsZXJMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBOb3RlIHRoYXQgd2UgZG8gbm90IHVzZSBob3Jpem9udGFsU3BhY2luZyBoZXJlIGFzIHdoZW4gdGhlCi0gICAgICAgICAgICAgKiBiYWNrZ3JvdW5kIG9mIHRoZSBtZXNzYWdlcyBjaGFuZ2VzIHRoZXJlIHdpbGwgYmUgZ2FwcyBiZXR3ZWVuIHRoZQotICAgICAgICAgICAgICogaWNvbiBsYWJlbCBhbmQgdGhlIG1lc3NhZ2UgdGhhdCBhcmUgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlCi0gICAgICAgICAgICAgKiBzaGVsbC4gV2UgYWRkIGEgbGVhZGluZyBzcGFjZSBlbHNld2hlcmUgdG8gY29tcGVuZGF0ZSBmb3IgdGhpcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIEhfR0FQX0lNQUdFKTsKLSAgICAgICAgICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRpdGxlTGFiZWwsIHZlcnRpY2FsU3BhY2luZyk7Ci0gICAgICAgICAgICBtZXNzYWdlSW1hZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWVzc2FnZUltYWdlTGFiZWwsIDApOwotICAgICAgICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgICAgICAgICAgZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQobWVzc2FnZUxhYmVsLCAwLCBTV1QuQk9UVE9NKTsKLSAgICAgICAgICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWVzc2FnZUltYWdlTGFiZWwsIDAsIFNXVC5SSUdIVCk7Ci0gICAgICAgICAgICBib3R0b21GaWxsZXJMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWVzc2FnZUltYWdlTGFiZWwsIDAsIFNXVC5UT1ApOwotICAgICAgICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgICAgICAgICAgZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQobWVzc2FnZUltYWdlTGFiZWwsIDAsIFNXVC5CT1RUT00pOwotICAgICAgICAgICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChtZXNzYWdlSW1hZ2VMYWJlbCwgMCk7Ci0gICAgICAgICAgICBsZWZ0RmlsbGVyTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgICAgIEZvcm1EYXRhIG1lc3NhZ2VMYWJlbERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VMYWJlbERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRpdGxlTGFiZWwsCi0gICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsU3BhY2luZyk7Ci0gICAgICAgICAgICBtZXNzYWdlTGFiZWxEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHRpdGxlSW1hZ2UpOwotICAgICAgICAgICAgbWVzc2FnZUxhYmVsRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1lc3NhZ2VJbWFnZUxhYmVsLCAwKTsKLSAgICAgICAgICAgIG1lc3NhZ2VMYWJlbERhdGEuaGVpZ2h0ID0gbWVzc2FnZUxhYmVsSGVpZ2h0OwotICAgICAgICAgICAgaWYgKHRpdGxlSW1hZ2VMYXJnZXN0KQotICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KHRpdGxlSW1hZ2UsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBTV1QuQk9UVE9NKTsKLSAgICAgICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG1lc3NhZ2VMYWJlbERhdGEpOwotICAgICAgICB9Ci0gICAgICAgIC8vRG8gbm90IGxheW91dCBiZWZvcmUgdGhlIGRpYWxvZyBhcmVhIGhhcyBiZWVuIGNyZWF0ZWQKLSAgICAgICAgLy90byBhdm9pZCBpbmNvbXBsZXRlIGNhbGN1bGF0aW9ucy4KLSAgICAgICAgaWYgKGRpYWxvZ0FyZWEgIT0gbnVsbCkKLSAgICAgICAgICAgIGdldFNoZWxsKCkubGF5b3V0KHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbWVzc2FnZSB0ZXh0LiBJZiB0aGUgbWVzc2FnZSBsaW5lIGN1cnJlbnRseSBkaXNwbGF5cyBhbiBlcnJvciwKLSAgICAgKiB0aGUgbWVzc2FnZSBpcyBzYXZlZCBhbmQgd2lsbCBiZSByZWRpc3BsYXllZCB3aGVuIHRoZSBlcnJvciBtZXNzYWdlIGlzCi0gICAgICogc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIFNob3J0Y3V0IGZvciA8Y29kZT5zZXRNZXNzYWdlKG5ld01lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk8L2NvZGU+Ci0gICAgICogPC9wPgotICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRpYWxvZyBoYXMgYmVlbiBvcGVuZWQgYXMgaXQKLSAgICAgKiB1cGRhdGVzIHRoZSBtZXNzYWdlIGxhYmVsIGltbWVkaWF0ZWx5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdNZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gY2xlYXIgdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlKSB7Ci0gICAgICAgIHNldE1lc3NhZ2UobmV3TWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZXNzYWdlIGZvciB0aGlzIGRpYWxvZyB3aXRoIGFuIGluZGljYXRpb24gb2Ygd2hhdCB0eXBlIG9mCi0gICAgICogbWVzc2FnZSBpdCBpcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsaWQgbWVzc2FnZSB0eXBlcyBhcmUgb25lIG9mIDxjb2RlPk5PTkU8L2NvZGU+LAotICAgICAqIDxjb2RlPklORk9STUFUSU9OPC9jb2RlPiw8Y29kZT5XQVJOSU5HPC9jb2RlPiwgb3IKLSAgICAgKiA8Y29kZT5FUlJPUjwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYSBtZXNzYWdlIG9mIHR5cGUKLSAgICAgKiA8Y29kZT5FUlJPUjwvY29kZT4gaXMgZGlmZmVyZW50IHRoYW4gYW4gZXJyb3IgbWVzc2FnZSAoc2V0IHVzaW5nCi0gICAgICogPGNvZGU+c2V0RXJyb3JNZXNzYWdlPC9jb2RlPikuIEFuIGVycm9yIG1lc3NhZ2Ugb3ZlcnJpZGVzIHRoZSBjdXJyZW50Ci0gICAgICogbWVzc2FnZSB1bnRpbCB0aGUgZXJyb3IgbWVzc2FnZSBpcyBjbGVhcmVkLiBUaGlzIG1ldGhvZCByZXBsYWNlcyB0aGUKLSAgICAgKiBjdXJyZW50IG1lc3NhZ2UgYW5kIGRvZXMgbm90IGFmZmVjdCB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG5ld01lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciB0aGUgbWVzc2FnZQotICAgICAqIEBwYXJhbSBuZXdUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0eXBlCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UsIGludCBuZXdUeXBlKSB7Ci0gICAgICAgIEltYWdlIG5ld0ltYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKG5ld01lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgc3dpdGNoIChuZXdUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIElNZXNzYWdlUHJvdmlkZXIuTk9ORToKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTjoKLSAgICAgICAgICAgICAgICBuZXdJbWFnZSA9IEpGYWNlUmVzb3VyY2VzLmdldEltYWdlKERMR19JTUdfTUVTU0FHRV9JTkZPKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HOgotICAgICAgICAgICAgICAgIG5ld0ltYWdlID0gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2UoRExHX0lNR19NRVNTQUdFX1dBUk5JTkcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SOgotICAgICAgICAgICAgICAgIG5ld0ltYWdlID0gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2UoRExHX0lNR19NRVNTQUdFX0VSUk9SKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzaG93TWVzc2FnZShuZXdNZXNzYWdlLCBuZXdJbWFnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyB0aGUgbmV3IG1lc3NhZ2UgYW5kIGltYWdlLgotICAgICAqIEBwYXJhbSBuZXdNZXNzYWdlIAotICAgICAqIEBwYXJhbSBuZXdJbWFnZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzaG93TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgSW1hZ2UgbmV3SW1hZ2UpIHsKLSAgICAgICAgLy8gQW55IGNoYW5nZT8KLSAgICAgICAgaWYgKG1lc3NhZ2UuZXF1YWxzKG5ld01lc3NhZ2UpICYmIG1lc3NhZ2VJbWFnZSA9PSBuZXdJbWFnZSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgbWVzc2FnZSA9IG5ld01lc3NhZ2U7Ci0gICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgICAgICAgICBtZXNzYWdlID0gIiI7Ly8kTk9OLU5MUy0xJAotICAgICAgICAvLyBNZXNzYWdlIHN0cmluZyB0byBiZSBzaG93biAtIGlmIHRoZXJlIGlzIGFuIGltYWdlIHRoZW4gYWRkIGluCi0gICAgICAgIC8vIGEgc3BhY2UgdG8gdGhlIG1lc3NhZ2UgZm9yIGxheW91dCBwdXJwb3NlcwotICAgICAgICBTdHJpbmcgc2hvd25NZXNzYWdlID0gKG5ld0ltYWdlID09IG51bGwpID8gbWVzc2FnZSA6ICIgIiArIG1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQgIAotICAgICAgICBtZXNzYWdlSW1hZ2UgPSBuZXdJbWFnZTsKLSAgICAgICAgaWYgKCFzaG93aW5nRXJyb3IpIHsKLSAgICAgICAgICAgIC8vIHdlIGFyZSBub3Qgc2hvd2luZyBhbiBlcnJvcgotICAgICAgICAgICAgdXBkYXRlTWVzc2FnZShzaG93bk1lc3NhZ2UpOwotICAgICAgICAgICAgbWVzc2FnZUltYWdlTGFiZWwuc2V0SW1hZ2UobWVzc2FnZUltYWdlKTsKLSAgICAgICAgICAgIHNldEltYWdlTGFiZWxWaXNpYmxlKG1lc3NhZ2VJbWFnZSAhPSBudWxsKTsKLSAgICAgICAgICAgIGxheW91dEZvck5ld01lc3NhZ2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2VMYWJlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3TWVzc2FnZQotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gdXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UpIHsKLSAgICAgICAgbWVzc2FnZUxhYmVsLnNldFRleHQobmV3TWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGl0bGUgdG8gYmUgc2hvd24gaW4gdGhlIHRpdGxlIGFyZWEgb2YgdGhpcyBkaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5ld1RpdGxlCi0gICAgICogICAgICAgICAgICB0aGUgdGl0bGUgc2hvdwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyBuZXdUaXRsZSkgewotICAgICAgICBpZiAodGl0bGVMYWJlbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBTdHJpbmcgdGl0bGUgPSBuZXdUaXRsZTsKLSAgICAgICAgaWYgKHRpdGxlID09IG51bGwpCi0gICAgICAgICAgICB0aXRsZSA9ICIiOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRUZXh0KHRpdGxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aXRsZSBiYXIgY29sb3IgZm9yIHRoaXMgZGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcgotICAgICAqICAgICAgICAgICAgdGhlIHRpdGxlIGJhciBjb2xvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlQXJlYUNvbG9yKFJHQiBjb2xvcikgewotICAgICAgICB0aXRsZUFyZWFSR0IgPSBjb2xvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aXRsZSBpbWFnZSB0byBiZSBzaG93biBpbiB0aGUgdGl0bGUgYXJlYSBvZiB0aGlzIGRpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3VGl0bGVJbWFnZQotICAgICAqICAgICAgICAgICAgdGhlIHRpdGxlIGltYWdlIHNob3cKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZUltYWdlKEltYWdlIG5ld1RpdGxlSW1hZ2UpIHsKLSAgICAgICAgdGl0bGVJbWFnZS5zZXRJbWFnZShuZXdUaXRsZUltYWdlKTsKLSAgICAgICAgdGl0bGVJbWFnZS5zZXRWaXNpYmxlKG5ld1RpdGxlSW1hZ2UgIT0gbnVsbCk7Ci0gICAgICAgIGlmIChuZXdUaXRsZUltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRldGVybWluZVRpdGxlSW1hZ2VMYXJnZXN0KCk7Ci0gICAgICAgICAgICBDb250cm9sIHRvcDsKLSAgICAgICAgICAgIGlmICh0aXRsZUltYWdlTGFyZ2VzdCkKLSAgICAgICAgICAgICAgICB0b3AgPSB0aXRsZUltYWdlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRvcCA9IG1lc3NhZ2VMYWJlbDsKLSAgICAgICAgICAgIHJlc2V0V29ya0FyZWFBdHRhY2htZW50cyh0b3ApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZSB0aGUgbGFiZWwgdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvciBpbWFnZXMgdmlzaWJsZSBkZXBlbmRpbmcgb24KLSAgICAgKiBib29sZWFuLgotICAgICAqIEBwYXJhbSB2aXNpYmxlIElmIDxjb2RlPnRydWU8L2NvZGU+IG1ha2UgdGhlIGltYWdlIHZpc2libGUsIGlmCi0gICAgICogbm90IHRoZW4gbWFrZSBpdCBub3QgdmlzaWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SW1hZ2VMYWJlbFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIG1lc3NhZ2VJbWFnZUxhYmVsLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgIGJvdHRvbUZpbGxlckxhYmVsLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgIGxlZnRGaWxsZXJMYWJlbC5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbWVzc2FnZSBiYWNrZ3JvdW5kcyB0byBiZSB0aGUgZXJyb3Igb3Igbm9ybWFsIGNvbG9yIGRlcGVuZGluZyBvbgotICAgICAqIHdoZXRoZXIgb3Igbm90IHNob3dpbmdFcnJvciBpcyB0cnVlLgotICAgICAqIEBwYXJhbSBzaG93aW5nRXJyb3IgSWYgPGNvZGU+dHJ1ZTwvY29kZT4gdXNlIGEgZGlmZmVyZW50IENvbG9yCi0gICAgICogdG8gaW5kaWNhdGUgdGhlIGVycm9yLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRNZXNzYWdlQmFja2dyb3VuZHMoYm9vbGVhbiBzaG93aW5nRXJyb3IpIHsKLSAgICAgICAgQ29sb3IgY29sb3I7Ci0gICAgICAgIGlmIChzaG93aW5nRXJyb3IpCi0gICAgICAgICAgICBjb2xvciA9IGVycm9yTXNnQXJlYUJhY2tncm91bmQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbG9yID0gbm9ybWFsTXNnQXJlYUJhY2tncm91bmQ7Ci0gICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLSAgICAgICAgbWVzc2FnZUltYWdlTGFiZWwuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gICAgICAgIGJvdHRvbUZpbGxlckxhYmVsLnNldEJhY2tncm91bmQoY29sb3IpOwotICAgICAgICBsZWZ0RmlsbGVyTGFiZWwuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXQgdGhlIGF0dGFjaG1lbnQgb2YgdGhlIHdvcmtBcmVhIHRvIG5vdyBhdHRhY2ggdG8gdG9wIGFzIHRoZSB0b3AKLSAgICAgKiBjb250cm9sLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b3AKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRXb3JrQXJlYUF0dGFjaG1lbnRzKENvbnRyb2wgdG9wKSB7Ci0gICAgICAgIEZvcm1EYXRhIGNoaWxkRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICBjaGlsZERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRvcCk7Ci0gICAgICAgIGNoaWxkRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgICBjaGlsZERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICAgICAgY2hpbGREYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgICB3b3JrQXJlYS5zZXRMYXlvdXREYXRhKGNoaWxkRGF0YSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9UcmF5RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL1RyYXlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyNTUyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL1RyYXlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuSVNoZWxsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNhc2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSA8Y29kZT5UcmF5RGlhbG9nPC9jb2RlPiBpcyBhIHNwZWNpYWxpemVkIDxjb2RlPkRpYWxvZzwvY29kZT4gdGhhdCBjYW4gY29udGFpbgotICogYSB0cmF5IG9uIGl0cyBzaWRlLiBUaGUgdHJheSdzIGNvbnRlbnQgaXMgcHJvdmlkZWQgYXMgYSA8Y29kZT5EaWFsb2dUcmF5PC9jb2RlPi4KLSAqIDxwPgotICogSXQgaXMgcmVjb21tZW5kZWQgdG8gc3ViY2xhc3MgdGhpcyBjbGFzcyBpbnN0ZWFkIG9mIDxjb2RlPkRpYWxvZzwvY29kZT4gaW4gYWxsCi0gKiBjYXNlcyBleGNlcHQgd2hlcmUgdGhlIGRpYWxvZyBzaG91bGQgbmV2ZXIgc2hvdyBhIHRyYXkuIEZvciBleGFtcGxlLCBkaWFsb2dzCi0gKiB3aGljaCBhcmUgdmVyeSBzaG9ydCwgc2ltcGxlLCBhbmQgcXVpY2sgdG8gZGlzbWlzcyAoZS5nLiBhIG1lc3NhZ2UgZGlhbG9nIHdpdGgKLSAqIGFuIE9LIGJ1dHRvbikgc2hvdWxkIHN1YmNsYXNzIDxjb2RlPkRpYWxvZzwvY29kZT4uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIE5vdGU6IFRyYXlzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIGRpYWxvZ3MgdGhhdCB1c2UgYSBjdXN0b20gbGF5b3V0IG9uIHRoZSA8Y29kZT4KLSAqIFNoZWxsPC9jb2RlPiBieSBvdmVycmlkaW5nIDxjb2RlPldpbmRvdyNnZXRMYXlvdXQoKTwvY29kZT4uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dUcmF5Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjZ2V0TGF5b3V0KCkKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYXlEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLyoKLQkgKiBUaGUgZGlhbG9nJ3MgdHJheSAobnVsbCBpZiBub25lKS4KLQkgKi8KLQlwcml2YXRlIERpYWxvZ1RyYXkgdHJheTsKLQotCS8qCi0JICogVGhlIHRyYXkncyBjb250cm9sLgotCSAqLwotCXByaXZhdGUgQ29udHJvbCB0cmF5Q29udHJvbDsKLQkKLQkvKgotCSAqIFRoZSBzZXBhcmF0b3IgdG8gdGhlIGxlZnQgb2YgdGhlIHNhc2guCi0JICovCi0JcHJpdmF0ZSBMYWJlbCBsZWZ0U2VwYXJhdG9yOwotCQotCS8qCi0JICogVGhlIHNlcGFyYXRvciB0byB0aGUgcmlnaHQgb2YgdGhlIHNhc2guCi0JICovCi0JcHJpdmF0ZSBMYWJlbCByaWdodFNlcGFyYXRvcjsKLQkKLQkvKgotCSAqIFRoZSBzYXNoIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHJlc2l6ZSB0aGUgdHJheS4KLQkgKi8KLQlwcml2YXRlIFNhc2ggc2FzaDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0cmF5IGRpYWxvZyBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoZSB3aW5kb3cgd2lsbCBoYXZlIG5vIHZpc3VhbAotCSAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0JICogCi0JICogQHBhcmFtIHNoZWxsIHRoZSBwYXJlbnQgc2hlbGwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNyZWF0ZSBhIHRvcC1sZXZlbCBzaGVsbAotCSAqLwotCXByb3RlY3RlZCBUcmF5RGlhbG9nKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyKHNoZWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRyYXkgZGlhbG9nIHdpdGggdGhlIGdpdmVuIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhlIG9iamVjdCB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgcGFyZW50IHNoZWxsCi0JICovCi0JcHJvdGVjdGVkIFRyYXlEaWFsb2coSVNoZWxsUHJvdmlkZXIgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCX0KLQotCS8qKgotCSAqIENsb3NlcyB0aGlzIGRpYWxvZydzIHRyYXksIGRpc3Bvc2luZyBpdHMgd2lkZ2V0cy4KLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgdHJheSB3YXMgbm90IG9wZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZVRyYXkoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJaWYgKGdldFRyYXkoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUcmF5IHdhcyBub3Qgb3BlbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaW50IHRyYXlXaWR0aCA9IHRyYXlDb250cm9sLmdldFNpemUoKS54ICsgbGVmdFNlcGFyYXRvci5nZXRTaXplKCkueCArIHNhc2guZ2V0U2l6ZSgpLnggKyByaWdodFNlcGFyYXRvci5nZXRTaXplKCkueDsKLQkJdHJheUNvbnRyb2wuZGlzcG9zZSgpOwotCQl0cmF5Q29udHJvbCA9IG51bGw7Ci0JCXRyYXkgPSBudWxsOwotCQlsZWZ0U2VwYXJhdG9yLmRpc3Bvc2UoKTsKLQkJbGVmdFNlcGFyYXRvciA9IG51bGw7Ci0JCXJpZ2h0U2VwYXJhdG9yLmRpc3Bvc2UoKTsKLQkJcmlnaHRTZXBhcmF0b3IgPSBudWxsOwotCQlzYXNoLmRpc3Bvc2UoKTsKLQkJc2FzaCA9IG51bGw7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHNoZWxsLmdldEJvdW5kcygpOwotCQlzaGVsbC5zZXRCb3VuZHMoYm91bmRzLnggKyAoKGdldERlZmF1bHRPcmllbnRhdGlvbigpID09IFNXVC5SSUdIVF9UT19MRUZUKSA/IHRyYXlXaWR0aCA6IDApLCBib3VuZHMueSwgYm91bmRzLndpZHRoIC0gdHJheVdpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHRyYXkgZGlhbG9nJ3MgZGVmYXVsdCBsYXlvdXQgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBkZWZhdWx0Ci0JICogPGNvZGU+V2luZG93PC9jb2RlPiBsYXlvdXQgdGhhdCBjYW4gYWNjb21vZGF0ZSBhIHRyYXksIGhvd2V2ZXIgaXQgc3RpbGwKLQkgKiBjb25mb3JtcyB0byB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIDxjb2RlPldpbmRvdzwvY29kZT4gZGVmYXVsdCBsYXlvdXQuCi0JICogPHA+Ci0JICogTm90ZTogVHJheXMgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgd2l0aCBhbGwgY3VzdG9tIGxheW91dHMgb24gdGhlIGRpYWxvZydzCi0JICogU2hlbGwuIFRvIGF2b2lkIHByb2JsZW1zLCB1c2UgYSBzaW5nbGUgb3V0ZXIgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBmb3IKLQkgKiB5b3VyIGRpYWxvZyBhcmVhLCBhbmQgc2V0IHlvdXIgY3VzdG9tIGxheW91dCBvbiB0aGF0IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNnZXRMYXlvdXQoKQotCSAqIEByZXR1cm4gYSBuZXdseSBjcmVhdGVkIGxheW91dCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gbGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIExheW91dCBnZXRMYXlvdXQoKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpc3VwZXIuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJcmV0dXJuIGxheW91dDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHJheSBjdXJyZW50bHkgc2hvd24gaW4gdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB0aGVyZSBpcyBubyB0cmF5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRpYWxvZydzIGN1cnJlbnQgdHJheSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZQotCSAqLwotCXB1YmxpYyBEaWFsb2dUcmF5IGdldFRyYXkoKSB7Ci0JCXJldHVybiB0cmF5OwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIHRoZSB0cmF5J3Mgd2lkZ2V0cyBhbmQgZGlzcGxheXMgdGhlIHRyYXkgaW4gdGhpcyBkaWFsb2cuIFRoZQotCSAqIGRpYWxvZydzIHNpemUgd2lsbCBiZSBhZGp1c3RlZCB0byBhY2NvbW9kYXRlIHRoZSB0cmF5LgotCSAqIAotCSAqIEBwYXJhbSB0cmF5IHRoZSB0cmF5IHRvIHNob3cgaW4gdGhpcyBkaWFsb2cKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZGlhbG9nIGFscmVhZHkgaGFzIGEgdHJheSBvcGVuCi0JICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgZGlhbG9nIGRvZXMgbm90IHN1cHBvcnQgdHJheXMsCi0JICogICAgICAgICAgICBmb3IgZXhhbXBsZSBpZiBpdCB1c2VzIGEgY3VzdG9tIGxheW91dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuVHJheShEaWFsb2dUcmF5IHRyYXkpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKHRyYXkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUcmF5IHdhcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZ2V0VHJheSgpICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRyYXkgd2FzIGFscmVhZHkgb3BlbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKCFpc0NvbXBhdGlibGVMYXlvdXQoZ2V0U2hlbGwoKS5nZXRMYXlvdXQoKSkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVHJheXMgbm90IHN1cHBvcnRlZCB3aXRoIGN1c3RvbSBsYXlvdXRzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnRyYXkgPSB0cmF5OwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCWxlZnRTZXBhcmF0b3IgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuVkVSVElDQUwpOwotCQlsZWZ0U2VwYXJhdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJc2FzaCA9IG5ldyBTYXNoKHNoZWxsLCBTV1QuVkVSVElDQUwpOwotCQlzYXNoLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJcmlnaHRTZXBhcmF0b3IgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuVkVSVElDQUwpOwotCQlyaWdodFNlcGFyYXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0JCXRyYXlDb250cm9sID0gdHJheS5jcmVhdGVDb250ZW50cyhzaGVsbCk7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSgpOwotCQlmaW5hbCBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlkYXRhLndpZHRoSGludCA9IHRyYXlDb250cm9sLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBjbGllbnRBcmVhLmhlaWdodCkueDsKLQkJdHJheUNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJaW50IHRyYXlXaWR0aCA9IGxlZnRTZXBhcmF0b3IuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIGNsaWVudEFyZWEuaGVpZ2h0KS54ICsgc2FzaC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgY2xpZW50QXJlYS5oZWlnaHQpLnggKyByaWdodFNlcGFyYXRvci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgY2xpZW50QXJlYS5oZWlnaHQpLnggKyBkYXRhLndpZHRoSGludDsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHNoZWxsLmdldEJvdW5kcygpOwotCQlzaGVsbC5zZXRCb3VuZHMoYm91bmRzLnggLSAoKGdldERlZmF1bHRPcmllbnRhdGlvbigpID09IFNXVC5SSUdIVF9UT19MRUZUKSA/IHRyYXlXaWR0aCA6IDApLCBib3VuZHMueSwgYm91bmRzLndpZHRoICsgdHJheVdpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJc2FzaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5kZXRhaWwgIT0gU1dULkRSQUcpIHsKLQkJCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBzaGVsbC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJCWludCBuZXdXaWR0aCA9IGNsaWVudEFyZWEud2lkdGggLSBldmVudC54IC0gKHNhc2guZ2V0U2l6ZSgpLnggKyByaWdodFNlcGFyYXRvci5nZXRTaXplKCkueCk7Ci0JCQkJCWlmIChuZXdXaWR0aCAhPSBkYXRhLndpZHRoSGludCkgewotCQkJCQkJZGF0YS53aWR0aEhpbnQgPSBuZXdXaWR0aDsKLQkJCQkJCXNoZWxsLmxheW91dCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBsYXlvdXQgY2FuIHN1cHBvcnQgdGhlIGFkZGl0aW9uIG9mIGEgdHJheS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21wYXRpYmxlTGF5b3V0KExheW91dCBsYXlvdXQpIHsKLQkJaWYgKGxheW91dCAhPSBudWxsICYmIGxheW91dCBpbnN0YW5jZW9mIEdyaWRMYXlvdXQpIHsKLQkJCUdyaWRMYXlvdXQgZ3JpZCA9IChHcmlkTGF5b3V0KWxheW91dDsKLQkJCXJldHVybiAhZ3JpZC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggJiYgKGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcgPT0gMCkgJiYKLQkJCQkJKGdyaWQubWFyZ2luV2lkdGggPT0gMCkgJiYgKGdyaWQubWFyZ2luSGVpZ2h0ID09IDApICYmCi0JCQkJCShncmlkLmhvcml6b250YWxTcGFjaW5nID09IDApICYmIChncmlkLm51bUNvbHVtbnMgPT0gNSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvaW1hZ2VzL21lc3NhZ2VfZXJyb3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9pbWFnZXMvbWVzc2FnZV9lcnJvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZjY2NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9pbWFnZXMvbWVzc2FnZV9lcnJvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL2ltYWdlcy9tZXNzYWdlX2luZm8uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9pbWFnZXMvbWVzc2FnZV9pbmZvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4NGQ5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL2ltYWdlcy9tZXNzYWdlX2luZm8uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9pbWFnZXMvbWVzc2FnZV93YXJuaW5nLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvaW1hZ2VzL21lc3NhZ2Vfd2FybmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDU0ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9pbWFnZXMvbWVzc2FnZV93YXJuaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvaW1hZ2VzL3BvcHVwX21lbnUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9pbWFnZXMvcG9wdXBfbWVudS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzdlYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9pbWFnZXMvcG9wdXBfbWVudS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9kaWFsb2dzL2ltYWdlcy9wb3B1cF9tZW51X2Rpc2FibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvaW1hZ2VzL3BvcHVwX21lbnVfZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDEzNDg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvaW1hZ2VzL3BvcHVwX21lbnVfZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9pbWFnZXMvdGl0bGVfYmFubmVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvaW1hZ2VzL3RpdGxlX2Jhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZDkwZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9pbWFnZXMvdGl0bGVfYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2RpYWxvZ3MvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjN2RmY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZGlhbG9ncy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotUHJvdmlkZXMgc3VwcG9ydCBmb3IgZGlhbG9ncy4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci1BIGRpYWxvZyBpcyBhIHNwZWNpYWxpemVkIHdpbmRvdywgdHlwaWNhbGx5IGNvbnNpc3Rpbmcgb2YgYSBkaWFsb2cgYXJlYQotYW5kIGEgYnV0dG9uIGJhciwgZGVzaWduZWQgZm9yIG5hcnJvdy1mb2N1c3NlZCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIuCi08cD5UaGUgZGlhbG9nIGZyYW1ld29yayBjb25zaXN0cyBvZiBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzICg8dHQ+RGlhbG9nPC90dD4pLAotYWxvbmcgd2l0aCBtb3JlIGNvbmNyZXRlIGRpYWxvZyBzdWJjbGFzc2VzIGZvciBkaXNwbGF5aW5nIG1lc3NhZ2VzICg8dHQ+TWVzc2FnZURpYWxvZzwvdHQ+KSwKLXNvbGljaXRpbmcgdGV4dCBpbnB1dCAoPHR0PklucHV0RGlhbG9nPC90dD4pLCBhbmQgZGlzcGxheWluZyBwcm9ncmVzcyBkdXJpbmcKLWEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiAoPHR0PlByb2dyZXNzTW9uaXRvckRpYWxvZzwvdHQ+KS4KLTxwPkRpYWxvZyBzdG9yZXMgKDx0dD5JRGlhbG9nU3RvcmU8L3R0PiwgPHR0PkRpYWxvZ1N0b3JlPC90dD4pIHByb3ZpZGUKLWEgZ2VuZXJhbCBmcmFtZXdvcmsgZm9yIG9yZ2FuaXppbmcgYSBkaWFsb2cncyBzZXR0aW5ncyBpbnRvIGtleS92YWx1ZSBwYWlycy4KLU11bHRpLXBhZ2UgZGlhbG9ncyBhcmUgbWFkZSBlYXNpZXIgdGhyb3VnaCB0aGUgdXNlIG9mIGRpYWxvZyBwYWdlcyAoPHR0PklEaWFsb2dQYWdlPC90dD4sCi08dHQ+RGlhbG9nUGFnZTwvdHQ+KS4KLTxwPk5vdGU6IE5vbmUgb2YgdGhlIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIG1haW50YWluIGdsb2JhbCBzdGF0ZS4KLTxicj4mbmJzcDsKLTxicj4mbmJzcDsKLTxicj4mbmJzcDsKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L0NvbWJvQ29udGVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L0NvbWJvQ29udGVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4Mzc0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9Db21ib0NvbnRlbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIEFuIHtAbGluayBJQ29udHJvbENvbnRlbnRBZGFwdGVyfSBmb3IgU1dUIENvbWJvIGNvbnRyb2xzLiBUaGlzIGlzIGEKLSAqIGNvbnZlbmllbmNlIGNsYXNzIGZvciBlYXNpbHkgY3JlYXRpbmcgYSB7QGxpbmsgQ29udGVudFByb3Bvc2FsQWRhcHRlcn0gZm9yCi0gKiBjb21ibyBmaWVsZHMuCi0gKiAKLSAqIDxwPgotICogVGhpcyBBUEkgaXMgY29uc2lkZXJlZCBleHBlcmltZW50YWwuIEl0IGlzIHN0aWxsIGV2b2x2aW5nIGR1cmluZyAzLjIgYW5kIGlzCi0gKiBzdWJqZWN0IHRvIGNoYW5nZS4gSXQgaXMgYmVpbmcgcmVsZWFzZWQgdG8gb2J0YWluIGZlZWRiYWNrIGZyb20gZWFybHkKLSAqIGFkb3B0ZXJzLgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21ib0NvbnRlbnRBZGFwdGVyIGltcGxlbWVudHMgSUNvbnRyb2xDb250ZW50QWRhcHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MudGFza2Fzc2lzdGFuY2UuSUNvbnRyb2xDb250ZW50QWRhcHRlciNnZXRDb250cm9sQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRyb2xDb250ZW50cyhDb250cm9sIGNvbnRyb2wpIHsKLQkJcmV0dXJuICgoQ29tYm8pIGNvbnRyb2wpLmdldFRleHQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LklDb250cm9sQ29udGVudEFkYXB0ZXIjc2V0Q29udHJvbENvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJvbENvbnRlbnRzKENvbnRyb2wgY29udHJvbCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJKChDb21ibykgY29udHJvbCkuc2V0VGV4dCh0ZXh0KTsKLQkJKChDb21ibykgY29udHJvbCkuc2V0U2VsZWN0aW9uKG5ldyBQb2ludChjdXJzb3JQb3NpdGlvbiwgY3Vyc29yUG9zaXRpb24pKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LklDb250cm9sQ29udGVudEFkYXB0ZXIjaW5zZXJ0Q29udHJvbENvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0Q29udHJvbENvbnRlbnRzKENvbnRyb2wgY29udHJvbCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGNvbnRyb2w7Ci0JCVN0cmluZyBjb250ZW50cyA9IGNvbWJvLmdldFRleHQoKTsKLQkJUG9pbnQgc2VsZWN0aW9uID0gY29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKGNvbnRlbnRzLnN1YnN0cmluZygwLCBzZWxlY3Rpb24ueCkpOwotCQlzYi5hcHBlbmQodGV4dCk7Ci0JCWlmIChzZWxlY3Rpb24ueSA+IGNvbnRlbnRzLmxlbmd0aCgpKQotCQkJc2IuYXBwZW5kKGNvbnRlbnRzLnN1YnN0cmluZyhzZWxlY3Rpb24ueSwgY29udGVudHMubGVuZ3RoKCkpKTsKLQkJY29tYm8uc2V0VGV4dChzYi50b1N0cmluZygpKTsKLQkJc2VsZWN0aW9uLnggPSBzZWxlY3Rpb24ueCArIGN1cnNvclBvc2l0aW9uOwotCQlzZWxlY3Rpb24ueSA9IHNlbGVjdGlvbi54OwotCQljb21iby5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEN1cnNvclBvc2l0aW9uKENvbnRyb2wgY29udHJvbCkgewotCQlyZXR1cm4gKChDb21ibykgY29udHJvbCkuZ2V0U2VsZWN0aW9uKCkueDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9Db250ZW50UHJvcG9zYWxBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9Db250ZW50UHJvcG9zYWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDA5Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZmllbGRhc3Npc3QvQ29udGVudFByb3Bvc2FsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogQ29udGVudFByb3Bvc2FsQWRhcHRlciBjYW4gYmUgdXNlZCB0byBhdHRhY2ggY29udGVudCBwcm9wb3NhbCBiZWhhdmlvciB0byBhCi0gKiBjb250cm9sLiBUaGlzIGJlaGF2aW9yIGluY2x1ZGVzIG9idGFpbmluZyBwcm9wb3NhbHMsIG9wZW5pbmcgYSBwb3B1cCBkaWFsb2csCi0gKiBtYW5hZ2luZyB0aGUgY29udGVudCBvZiB0aGUgY29udHJvbCByZWxhdGl2ZSB0byB0aGUgc2VsZWN0aW9ucyBpbiB0aGUgcG9wdXAsCi0gKiBhbmQgb3B0aW9uYWxseSBvcGVuaW5nIHVwIGEgc2Vjb25kYXJ5IHBvcHVwIHRvIGZ1cnRoZXIgZGVzY3JpYmUgcHJvcG9zYWxzLgotICogCi0gKiA8cD4KLSAqIFRoaXMgQVBJIGlzIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiBJdCBpcyBzdGlsbCBldm9sdmluZyBkdXJpbmcgMy4yIGFuZCBpcwotICogc3ViamVjdCB0byBjaGFuZ2UuIEl0IGlzIGJlaW5nIHJlbGVhc2VkIHRvIG9idGFpbiBmZWVkYmFjayBmcm9tIGVhcmx5Ci0gKiBhZG9wdGVycy4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFByb3Bvc2FsQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBGbGFnIHRoYXQgY29udHJvbHMgdGhlIHByaW50aW5nIG9mIGRlYnVnIGluZm8uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCBhIGNob3NlbiBwcm9wb3NhbCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgZmllbGQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUE9TQUxfSU5TRVJUID0gMTsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IGEgY2hvc2VuIHByb3Bvc2FsIHNob3VsZCByZXBsYWNlIHRoZSBlbnRpcmUgY29udGVudHMgb2YKLQkgKiB0aGUgZmllbGQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUE9TQUxfUkVQTEFDRSA9IDI7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRyb2wgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCB3aGVuIGEKLQkgKiBwcm9wb3NhbCBpcyBjaG9zZW4uIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiBhIGNsaWVudCBuZWVkcyBtb3JlCi0JICogc3BlY2lhbGl6ZWQgYmVoYXZpb3Igd2hlbiBhIHByb3Bvc2FsIGlzIGNob3Nlbi4gSW4gdGhpcyBjYXNlLCBjbGllbnRzCi0JICogdHlwaWNhbGx5IHJlZ2lzdGVyIGFuIElDb250ZW50UHJvcG9zYWxMaXN0ZW5lciBzbyB0aGF0IHRoZXkgYXJlIG5vdGlmaWVkCi0JICogd2hlbiBhIHByb3Bvc2FsIGlzIGNob3Nlbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QT1NBTF9JR05PUkUgPSAzOwotCi0JLyoKLQkgKiBUaGUgb2JqZWN0IHRoYXQgcHJvdmlkZXMgY29udGVudCBwcm9wb3NhbHMuCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFByb3Bvc2FsUHJvdmlkZXIgcHJvcG9zYWxQcm92aWRlcjsKLQotCS8qCi0JICogQSBsYWJlbCBwcm92aWRlciB1c2VkIHRvIGRpc3BsYXkgcHJvcG9zYWxzIGluIHRoZSBwb3B1cCwgYW5kIHRvIGV4dHJhY3QKLQkgKiBTdHJpbmdzIGZyb20gbm9uLVN0cmluZyBwcm9wb3NhbHMuCi0JICovCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JLyoKLQkgKiBUaGUgY29udHJvbCBmb3Igd2hpY2ggY29udGVudCBwcm9wb3NhbHMgYXJlIHByb3ZpZGVkLgotCSAqLwotCXByaXZhdGUgQ29udHJvbCBjb250cm9sOwotCi0JLyoKLQkgKiBUaGUgYWRhcHRlciB1c2VkIHRvIGV4dHJhY3QgdGhlIFN0cmluZyBjb250ZW50cyBmcm9tIGFuIGFyYml0cmFyeQotCSAqIGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBJQ29udHJvbENvbnRlbnRBZGFwdGVyIGNvbnRyb2xDb250ZW50QWRhcHRlcjsKLQotCS8qCi0JICogVGhlIHBvcHVwIHVzZWQgdG8gc2hvdyBwcm9wb3NhbHMuCi0JICovCi0JcHJpdmF0ZSBDb250ZW50UHJvcG9zYWxQb3B1cCBwb3B1cDsKLQotCS8qCi0JICogVGhlIGtleXN0cm9rZSB0aGF0IHNpZ25pZmllcyBjb250ZW50IHByb3Bvc2FscyBzaG91bGQgYmUgc2hvd24uCi0JICovCi0JcHJpdmF0ZSBLZXlTdHJva2UgdHJpZ2dlcktleVN0cm9rZTsKLQotCS8qCi0JICogVGhlIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdGhhdCBhdXRvLWFjdGl2YXRlIHRoZSBwb3B1cC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBhdXRvQWN0aXZhdGVTdHJpbmc7Ci0KLQkvKgotCSAqIEEgZmxhZyBpbmRpY2F0aW5nIGhvdyBhbiBhY2NlcHRlZCBwcm9wb3NhbCBzaG91bGQgYWZmZWN0IHRoZSBjb250cm9sLiBPbmUKLQkgKiBvZiBQUk9QT1NBTF9JR05PUkUsIFBST1BPU0FMX0lOU0VSVCwgb3IgUFJPUE9TQUxfUkVQTEFDRS4KLQkgKi8KLQlwcml2YXRlIGludCBhY2NlcHRhbmNlOwotCi0JLyoKLQkgKiBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBrZXlzIGV2ZW50cyByZWNlaXZlZCB3aGlsZSB0aGUgcHJvcG9zYWwKLQkgKiBwb3B1cCBpcyBvcGVuIHNob3VsZCBhbHNvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHByb3BhZ2F0ZUtleXM7Ci0KLQkvKgotCSAqIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHByb3Bvc2FscyBzaG91bGQgYmUgZmlsdGVyZWQgYXMga2V5cyBhcmUKLQkgKiB0eXBlZCB3aGVuIHRoZSBwb3B1cCBpcyBvcGVuLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmaWx0ZXJQcm9wb3NhbHM7Ci0KLQkvKgotCSAqIFRoZSBsaXN0ZW5lciB3ZSBpbnN0YWxsIG9uIHRoZSBjb250cm9sLgotCSAqLwotCXByaXZhdGUgTGlzdGVuZXIgY29udHJvbExpc3RlbmVyOwotCi0JLyoKLQkgKiBUaGUgbGlzdCBvZiBsaXN0ZW5lcnMgd2hvIHdpc2ggdG8gYmUgbm90aWZpZWQgd2hlbiBzb21ldGhpbmcgc2lnbmlmaWNhbnQKLQkgKiBoYXBwZW5zIHdpdGggdGhlIHByb3Bvc2Fscy4KLQkgKi8KLQlwcml2YXRlIExpc3RlbmVyTGlzdCBwcm9wb3NhbExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotCS8qCi0JICogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBhZGFwdGVyIGlzIGVuYWJsZWQuIEluIHNvbWUgY2FzZXMsCi0JICogYWRhcHRlcnMgbWF5IGJlIGluc3RhbGxlZCBidXQgZGVwZW5kIHVwb24gb3V0c2lkZSBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkID0gdHJ1ZTsKLQotCS8qCi0JICogVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyB1c2VkIHdoZW4gYXV0b2FjdGl2YXRpbmcgdGhlIHBvcHVwLgotCSAqLwotCXByaXZhdGUgaW50IGF1dG9BY3RpdmF0aW9uRGVsYXkgPSAwOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29udGVudCBwcm9wb3NhbCBhZGFwdGVyIHRoYXQgY2FuIGFzc2lzdCB0aGUgdXNlciB3aXRoCi0JICogY2hvb3NpbmcgY29udGVudCBmb3IgdGhlIGZpZWxkLgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgY29udHJvbCBmb3Igd2hpY2ggdGhlIGFkYXB0ZXIgaXMgcHJvdmlkaW5nIGNvbnRlbnQgYXNzaXN0LgotCSAqICAgICAgICAgICAgTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gY29udHJvbENvbnRlbnRBZGFwdGVyCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+SUNvbnRyb2xDb250ZW50QWRhcHRlcjwvY29kZT4gdXNlZCB0byBvYnRhaW4gYW5kCi0JICogICAgICAgICAgICB1cGRhdGUgdGhlIGNvbnRyb2wncyBjb250ZW50cyBhcyBwcm9wb3NhbHMgYXJlIGFjY2VwdGVkLiBNYXkKLQkgKiAgICAgICAgICAgIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcHJvcG9zYWxQcm92aWRlcgotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPklDb250ZW50UHJvcG9zYWxQcm92aWRlcjwvY29kZT4gdXNlZCB0byBvYnRhaW4KLQkgKiAgICAgICAgICAgIGNvbnRlbnQgcHJvcG9zYWxzIGZvciB0aGlzIGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICAgICBubyBjb250ZW50IHByb3Bvc2FsIGlzIGF2YWlsYWJsZS4KLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlcgotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHByb3ZpZGVyIHdoaWNoIHByb3ZpZGVzIHRleHQgYW5kIGltYWdlIGluZm9ybWF0aW9uCi0JICogICAgICAgICAgICBmb3IgY29udGVudCBwcm9wb3NhbHMuIEEgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgaW5kaWNhdGVzCi0JICogICAgICAgICAgICB0aGF0IGEgZGVmYXVsdCBsYWJlbCBwcm92aWRlciBpcyBzdWZmaWNpZW50IGZvciBhbnkgY29udGVudAotCSAqICAgICAgICAgICAgcHJvcG9zYWxzIHRoYXQgbWF5IG9jY3VyLgotCSAqIEBwYXJhbSBrZXlTdHJva2UKLQkgKiAgICAgICAgICAgIHRoZSBrZXlzdHJva2UgdGhhdCB3aWxsIGludm9rZSB0aGUgY29udGVudCBwcm9wb3NhbCBwb3B1cC4gSWYKLQkgKiAgICAgICAgICAgIHRoaXMgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gcHJvcG9zYWxzIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW55IG9mIHRoZSBhdXRvIGFjdGl2YXRpb24KLQkgKiAgICAgICAgICAgIGNoYXJhY3RlcnMgYXJlIHR5cGVkLgotCSAqIEBwYXJhbSBhdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IG9mIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VyIGF1dG8tYWN0aXZhdGlvbiBvZiBjb250ZW50Ci0JICogICAgICAgICAgICBwcm9wb3NhbC4gSWYgc3BlY2lmaWVkLCB0aGVzZSBjaGFyYWN0ZXJzIHdpbGwgdHJpZ2dlcgotCSAqICAgICAgICAgICAgYXV0by1hY3RpdmF0aW9uIG9mIHRoZSBwcm9wb3NhbCBwb3B1cCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCi0JICogICAgICAgICAgICBhbiBleHBsaWNpdCBpbnZvY2F0aW9uIGtleVN0cm9rZSB3YXMgc3BlY2lmaWVkLiBJZiB0aGlzCi0JICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gb25seSBhIHNwZWNpZmllZAotCSAqICAgICAgICAgICAga2V5U3Ryb2tlIHdpbGwgaW52b2tlIGNvbnRlbnQgcHJvcG9zYWwuIElmIHRoaXMgcGFyYW1ldGVyIGlzCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBhbmQgdGhlIGtleVN0cm9rZSBwYXJhbWV0ZXIgaXMKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGFsbCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aWxsCi0JICogICAgICAgICAgICBhdXRvLWFjdGl2YXRlIGNvbnRlbnQgcHJvcG9zYWwuCi0JICogQHBhcmFtIHByb3BhZ2F0ZUtleXMKLQkgKiAgICAgICAgICAgIGEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGtleSBldmVudHMgKGluY2x1ZGluZwotCSAqICAgICAgICAgICAgYXV0by1hY3RpdmF0aW9uIGNoYXJhY3RlcnMpIHNob3VsZCBiZSBwcm9wYWdhdGVkIHRvIHRoZQotCSAqICAgICAgICAgICAgYWRhcHRlZCBjb250cm9sIHdoZW4gdGhlIHByb3Bvc2FsIHBvcHVwIGlzIG9wZW4uCi0JICogQHBhcmFtIGZpbHRlclByb3Bvc2FscwotCSAqICAgICAgICAgICAgYSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByb3Bvc2FsIHBvcHVwIHNob3VsZAotCSAqICAgICAgICAgICAgZmlsdGVyIGl0cyBjb250ZW50cyBiYXNlZCBvbiBrZXlzIHR5cGVkIHdoZW4gaXQgaXMgb3BlbgotCSAqIEBwYXJhbSBhY2NlcHRhbmNlCi0JICogICAgICAgICAgICBhIGNvbnN0YW50IGluZGljYXRpbmcgaG93IGFuIGFjY2VwdGVkIHByb3Bvc2FsIHNob3VsZCBhZmZlY3QKLQkgKiAgICAgICAgICAgIHRoZSBjb250cm9sJ3MgY29udGVudC4gU2hvdWxkIGJlIG9uZSBvZgotCSAqICAgICAgICAgICAgPGNvZGU+UFJPUE9TQUxfSU5TRVJUPC9jb2RlPiwgPGNvZGU+UFJPUE9TQUxfUkVQTEFDRTwvY29kZT4sCi0JICogICAgICAgICAgICBvciA8Y29kZT5QUk9QT1NBTF9JR05PUkU8L2NvZGU+Ci0JICogCi0JICovCi0JcHVibGljIENvbnRlbnRQcm9wb3NhbEFkYXB0ZXIoQ29udHJvbCBjb250cm9sLAotCQkJSUNvbnRyb2xDb250ZW50QWRhcHRlciBjb250cm9sQ29udGVudEFkYXB0ZXIsCi0JCQlJQ29udGVudFByb3Bvc2FsUHJvdmlkZXIgcHJvcG9zYWxQcm92aWRlciwKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIEtleVN0cm9rZSBrZXlTdHJva2UsCi0JCQljaGFyW10gYXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzLCBib29sZWFuIHByb3BhZ2F0ZUtleXMsCi0JCQlib29sZWFuIGZpbHRlclByb3Bvc2FscywgaW50IGFjY2VwdGFuY2UpIHsKLQkJc3VwZXIoKTsKLQkJLy8gV2UgYWx3YXlzIGFzc3VtZSB0aGUgY29udHJvbCBhbmQgY29udGVudCBhZGFwdGVyIGFyZSB2YWxpZC4KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sQ29udGVudEFkYXB0ZXIpOwotCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sOwotCQl0aGlzLmNvbnRyb2xDb250ZW50QWRhcHRlciA9IGNvbnRyb2xDb250ZW50QWRhcHRlcjsKLQotCQkvLyBUaGUgcmVzdCBvZiB0aGVzZSBtYXkgYmUgbnVsbAotCQl0aGlzLnByb3Bvc2FsUHJvdmlkZXIgPSBwcm9wb3NhbFByb3ZpZGVyOwotCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotCQl0aGlzLnRyaWdnZXJLZXlTdHJva2UgPSBrZXlTdHJva2U7Ci0JCWlmIChhdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMgIT0gbnVsbCkKLQkJCXRoaXMuYXV0b0FjdGl2YXRlU3RyaW5nID0gbmV3IFN0cmluZyhhdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMpOwotCQl0aGlzLnByb3BhZ2F0ZUtleXMgPSBwcm9wYWdhdGVLZXlzOwotCQl0aGlzLmZpbHRlclByb3Bvc2FscyA9IGZpbHRlclByb3Bvc2FsczsKLQkJdGhpcy5hY2NlcHRhbmNlID0gYWNjZXB0YW5jZTsKLQkJYWRkQ29udHJvbExpc3RlbmVyKGNvbnRyb2wpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY29udHJvbCBvbiB3aGljaCB0aGUgY29udGVudCBwcm9wb3NhbCBhZGFwdGVyIGlzIGluc3RhbGxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250cm9sIG9uIHdoaWNoIHRoZSBwcm9wb3NhbCBhZGFwdGVyIGlzIGluc3RhbGxlZC4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxhYmVsIHByb3ZpZGVyIHRoYXQgaXMgdXNlZCB0byBzaG93IHByb3Bvc2Fscy4gQSBkZWZhdWx0IGxhYmVsCi0JICogcHJvdmlkZXIgd2lsbCBiZSB1c2VkIGlmIG9uZSBoYXMgbm90IGJlZW4gc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHtAbGluayBJTGFiZWxQcm92aWRlcn0gdXNlZCB0byBzaG93IHByb3Bvc2FscwotCSAqLwotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlpZiAobGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxhYmVsIHByb3ZpZGVyIHRoYXQgaXMgdXNlZCB0byBzaG93IHByb3Bvc2Fscy4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlcgotCSAqICAgICAgICAgICAgdGhlIChAbGluayBJTGFiZWxQcm92aWRlcn0gdXNlZCB0byBzaG93IHByb3Bvc2Fscy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb3Bvc2FsIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgY29udGVudCBwcm9wb3NhbHMgZ2l2ZW4gdGhlCi0JICogY3VycmVudCBjb250ZW50IG9mIHRoZSBmaWVsZC4gQSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMKLQkgKiB0aGF0IHRoZXJlIGFyZSBubyBjb250ZW50IHByb3Bvc2FscyBhdmFpbGFibGUgZm9yIHRoZSBmaWVsZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyfSB1c2VkIHRvIHNob3cgcHJvcG9zYWxzLiBNYXkKLQkgKiAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBJQ29udGVudFByb3Bvc2FsUHJvdmlkZXIgZ2V0Q29udGVudFByb3Bvc2FsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBwcm9wb3NhbFByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY29udGVudCBwcm9wb3NhbCBwcm92aWRlciB0aGF0IGlzIHVzZWQgdG8gc2hvdyBwcm9wb3NhbHMuCi0JICogCi0JICogQHBhcmFtIHByb3Bvc2FsUHJvdmlkZXIKLQkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyfSB1c2VkIHRvIHNob3cgcHJvcG9zYWxzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFByb3Bvc2FsUHJvdmlkZXIoCi0JCQlJQ29udGVudFByb3Bvc2FsUHJvdmlkZXIgcHJvcG9zYWxQcm92aWRlcikgewotCQl0aGlzLnByb3Bvc2FsUHJvdmlkZXIgPSBwcm9wb3NhbFByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgb2YgY2hhcmFjdGVycyBvbiB3aGljaCB0aGUgcG9wdXAgaXMgYXV0b2FjdGl2YXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VyIGF1dG8tYWN0aXZhdGlvbiBvZiBjb250ZW50Ci0JICogICAgICAgICBwcm9wb3NhbC4gSWYgc3BlY2lmaWVkLCB0aGVzZSBjaGFyYWN0ZXJzIHdpbGwgdHJpZ2dlcgotCSAqICAgICAgICAgYXV0by1hY3RpdmF0aW9uIG9mIHRoZSBwcm9wb3NhbCBwb3B1cCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFuCi0JICogICAgICAgICBleHBsaWNpdCBpbnZvY2F0aW9uIGtleVN0cm9rZSB3YXMgc3BlY2lmaWVkLiBJZiB0aGlzIHBhcmFtZXRlciBpcwotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gb25seSBhIHNwZWNpZmllZCBrZXlTdHJva2Ugd2lsbCBpbnZva2UKLQkgKiAgICAgICAgIGNvbnRlbnQgcHJvcG9zYWwuIElmIHRoaXMgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gYW5kIHRoZQotCSAqICAgICAgICAga2V5U3Ryb2tlIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGFsbCBhbHBoYW51bWVyaWMKLQkgKiAgICAgICAgIGNoYXJhY3RlcnMgd2lsbCBhdXRvLWFjdGl2YXRlIGNvbnRlbnQgcHJvcG9zYWwuCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCWlmIChhdXRvQWN0aXZhdGVTdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYXV0b0FjdGl2YXRlU3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzIHRoYXQgd2lsbCB0cmlnZ2VyIGF1dG9hY3RpdmF0aW9uIG9mIHRoZQotCSAqIHBvcHVwLgotCSAqIAotCSAqIEBwYXJhbSBhdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IG9mIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VyIGF1dG8tYWN0aXZhdGlvbiBvZiBjb250ZW50Ci0JICogICAgICAgICAgICBwcm9wb3NhbC4gSWYgc3BlY2lmaWVkLCB0aGVzZSBjaGFyYWN0ZXJzIHdpbGwgdHJpZ2dlcgotCSAqICAgICAgICAgICAgYXV0by1hY3RpdmF0aW9uIG9mIHRoZSBwcm9wb3NhbCBwb3B1cCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCi0JICogICAgICAgICAgICBhbiBleHBsaWNpdCBpbnZvY2F0aW9uIGtleVN0cm9rZSB3YXMgc3BlY2lmaWVkLiBJZiB0aGlzCi0JICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gb25seSBhIHNwZWNpZmllZAotCSAqICAgICAgICAgICAga2V5U3Ryb2tlIHdpbGwgaW52b2tlIGNvbnRlbnQgcHJvcG9zYWwuIElmIHRoaXMgcGFyYW1ldGVyIGlzCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBhbmQgdGhlIGtleVN0cm9rZSB2YWx1ZSBpcwotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYWxsIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHdpbGwKLQkgKiAgICAgICAgICAgIGF1dG8tYWN0aXZhdGUgY29udGVudCBwcm9wb3NhbC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoY2hhcltdIGF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycykgewotCQl0aGlzLmF1dG9BY3RpdmF0ZVN0cmluZyA9IG5ldyBTdHJpbmcoYXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRlbGF5LCBpbiBtaWxsaXNlY29uZHMsIHVzZWQgYmVmb3JlIGFueSBhdXRvYWN0aXZhdGlvbiBpcwotCSAqIHRyaWdnZXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGF0IHdpbGwgcGFzcyBiZWZvcmUgYSBwb3B1cCBpcwotCSAqICAgICAgICAgYXV0b21hdGljYWxseSBvcGVuZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF1dG9BY3RpdmF0aW9uRGVsYXkoKSB7Ci0JCXJldHVybiBhdXRvQWN0aXZhdGlvbkRlbGF5OwotCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkZWxheSwgaW4gbWlsbGlzZWNvbmRzLCB1c2VkIGJlZm9yZSBhdXRvYWN0aXZhdGlvbiBpcyB0cmlnZ2VyZWQuCi0JICogCi0JICogQHBhcmFtIGRlbGF5Ci0JICogICAgICAgICAgICB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdGhhdCB3aWxsIHBhc3MgYmVmb3JlIGEgcG9wdXAgaXMKLQkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgb3BlbmVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b0FjdGl2YXRpb25EZWxheShpbnQgZGVsYXkpIHsKLQkJYXV0b0FjdGl2YXRpb25EZWxheSA9IGRlbGF5OwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250ZW50IGFkYXB0ZXIgdGhhdCBjYW4gZ2V0IG9yIHJldHJpZXZlIHRoZSB0ZXh0IGNvbnRlbnRzCi0JICogZnJvbSB0aGUgYWRhcHRlcidzIGNvbnRyb2wuIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiBhIGNsaWVudCwgc3VjaCBhcyBhCi0JICogY29udGVudCBwcm9wb3NhbCBsaXN0ZW5lciwgbmVlZHMgdG8gdXBkYXRlIHRoZSBjb250cm9sJ3MgY29udGVudHMKLQkgKiBtYW51YWxseS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSUNvbnRyb2xDb250ZW50QWRhcHRlcn0gd2hpY2ggY2FuIHVwZGF0ZSB0aGUgY29udHJvbAotCSAqICAgICAgICAgdGV4dC4KLQkgKi8KLQlwdWJsaWMgSUNvbnRyb2xDb250ZW50QWRhcHRlciBnZXRDb250cm9sQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjb250cm9sQ29udGVudEFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBib29sZWFuIGZsYWcgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFkYXB0ZXIgaXMgZW5hYmxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFkYXB0ZXIgaXMgZW5hYmxlZCBhbmQgcmVzcG9uZGluZwotCSAqICAgICAgICAgICAgdG8gdXNlciBpbnB1dCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGlnbm9yaW5nIHVzZXIKLQkgKiAgICAgICAgICAgIGlucHV0LgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCS8vIElmIHdlIGFyZSBkaXNhYmxpbmcgaXQgd2hpbGUgaXQncyBwcm9wb3NpbmcgY29udGVudCwgY2xvc2UgdGhlCi0JCS8vIGNvbnRlbnQgcHJvcG9zYWwgcG9wdXAuCi0JCWlmIChpc0VuYWJsZWQgJiYgIWVuYWJsZWQpIHsKLQkJCWlmIChwb3B1cCAhPSBudWxsKQotCQkJCXBvcHVwLmNsb3NlKCk7Ci0JCX0KLQkJaXNFbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciB0byB0aGUgbGlzdCBvZiBjb250ZW50IHByb3Bvc2FsIGxpc3RlbmVycyB0aGF0Ci0JICogYXJlIG5vdGlmaWVkIHdoZW4gY29udGVudCBwcm9wb3NhbHMgYXJlIGNob3Nlbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgSUNvbnRlbnRQcm9wb3NhbExpc3RlbmVyIHRvIGJlIGFkZGVkIGFzIGEgbGlzdGVuZXIuIE11c3QKLQkgKiAgICAgICAgICAgIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHJlZ2lzdGVyCi0JICogICAgICAgICAgICBhbiBpbnN0YW5jZSB3aGljaCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGluc3RhbmNlLAotCSAqICAgICAgICAgICAgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LklDb250ZW50UHJvcG9zYWxMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbnRlbnRQcm9wb3NhbExpc3RlbmVyKElDb250ZW50UHJvcG9zYWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlwcm9wb3NhbExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogQWRkIG91ciBsaXN0ZW5lciB0byB0aGUgY29udHJvbC4gRGVidWcgaW5mb3JtYXRpb24gdG8gYmUgbGVmdCBpbiB1bnRpbAotCSAqIHRoaXMgc3VwcG9ydCBpcyBzdGFibGUgb24gYWxsIHBsYXRmb3Jtcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQ29udHJvbExpc3RlbmVyKENvbnRyb2wgY29udHJvbCkgewotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJDb250ZW50UHJvcG9zYWxMaXN0ZW5lciNpbnN0YWxsQ29udHJvbExpc3RlbmVyKCkiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChjb250cm9sTGlzdGVuZXIgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udHJvbExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICghaXNFbmFibGVkKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlzd2l0Y2ggKGUudHlwZSkgewotCQkJCWNhc2UgU1dULktleURvd246Ci0JCQkJCWlmIChERUJVRykKLQkJCQkJCWR1bXAoImtleURvd24gT0siLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAodHJpZ2dlcktleVN0cm9rZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBFaXRoZXIgdGhlcmUgYXJlIG5vIG1vZGlmaWVycyBmb3IgdGhlIHRyaWdnZXIgYW5kIHdlCi0JCQkJCQkvLyBjaGVjayB0aGUgY2hhcmFjdGVyIGZpZWxkLi4uCi0JCQkJCQlpZiAoKHRyaWdnZXJLZXlTdHJva2UuZ2V0TW9kaWZpZXJLZXlzKCkgPT0gS2V5U3Ryb2tlLk5PX0tFWSAmJiB0cmlnZ2VyS2V5U3Ryb2tlCi0JCQkJCQkJCS5nZXROYXR1cmFsS2V5KCkgPT0gZS5jaGFyYWN0ZXIpCi0JCQkJCQkJCXx8Ci0JCQkJCQkJCS8vIC4uLm9yIHRoZXJlIGFyZSBtb2RpZmllcnMsIGluIHdoaWNoIGNhc2UgdGhlCi0JCQkJCQkJCS8vIGtleWNvZGUgYW5kIHN0YXRlIG11c3QgbWF0Y2gKLQkJCQkJCQkJKHRyaWdnZXJLZXlTdHJva2UuZ2V0TmF0dXJhbEtleSgpID09IGUua2V5Q29kZSAmJiAoKHRyaWdnZXJLZXlTdHJva2UKLQkJCQkJCQkJCQkuZ2V0TW9kaWZpZXJLZXlzKCkgJiBlLnN0YXRlTWFzaykgPT0gdHJpZ2dlcktleVN0cm9rZQotCQkJCQkJCQkJCS5nZXRNb2RpZmllcktleXMoKSkpKSB7Ci0JCQkJCQkJLy8gV2UgbmV2ZXIgcHJvcGFnYXRlIGFuIGV4cGxpY2l0IGtleXN0cm9rZQotCQkJCQkJCS8vIGludm9jYXRpb24KLQkJCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIE9wZW4gdGhlIHBvcHVwIGluIGFuIGFzeW5jIHNvIHRoYXQgdGhpcyBrZXlzdHJva2UKLQkJCQkJCQkgKiBmaW5pc2hlcyBwcm9jZXNzaW5nIGJlZm9yZSB0aGUgcG9wdXAgcmVnaXN0ZXJzCi0JCQkJCQkJICogaXRzIG93biBsaXN0ZW5lcnMuCi0JCQkJCQkJICovCi0JCQkJCQkJaWYgKHBvcHVwID09IG51bGwpIHsKLQkJCQkJCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoCi0JCQkJCQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJCQlvcGVuUHJvcG9zYWxQb3B1cCgpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvKgotCQkJCQkgKiBUaGUgdHJpZ2dlcmluZyBrZXlzdHJva2Ugd2FzIG5vdCBpbnZva2VkLiBDaGVjayBmb3IKLQkJCQkJICogYXV0b2FjdGl2YXRpb24gY2hhcmFjdGVycy4KLQkJCQkJICovCi0JCQkJCWlmIChlLmNoYXJhY3RlciAhPSAwKSB7Ci0JCQkJCQlib29sZWFuIGF1dG9BY3RpdmF0ZWQgPSBmYWxzZTsKLQkJCQkJCS8vIEF1dG8tYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIHdlcmUgc3BlY2lmaWVkLiBDaGVjawotCQkJCQkJLy8gdGhlbS4KLQkJCQkJCWlmIChhdXRvQWN0aXZhdGVTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJCWlmIChhdXRvQWN0aXZhdGVTdHJpbmcuaW5kZXhPZihlLmNoYXJhY3RlcikgPj0gMCkgewotCQkJCQkJCQlhdXRvQWN0aXZhdGVkID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gQXV0by1hY3RpdmF0aW9uIGNoYXJhY3RlcnMgd2VyZSBub3Qgc3BlY2lmaWVkLiBJZgotCQkJCQkJCS8vIHRoZXJlIHdhcyBubyBrZXkgc3Ryb2tlIHNwZWNpZmllZCwgYXNzdW1lCi0JCQkJCQkJLy8gYWN0aXZhdGlvbiBmb3IgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuCi0JCQkJCQl9IGVsc2UgaWYgKHRyaWdnZXJLZXlTdHJva2UgPT0gbnVsbAotCQkJCQkJCQkmJiBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGUuY2hhcmFjdGVyKSkgewotCQkJCQkJCWF1dG9BY3RpdmF0ZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJLyoKLQkJCQkJCSAqIFdoZW4gYXV0b2FjdGl2YXRpbmcsIHdlIGNoZWNrIHRoZSBhdXRvYWN0aXZhdGlvbgotCQkJCQkJICogZGVsYXkuCi0JCQkJCQkgKi8KLQkJCQkJCWlmIChhdXRvQWN0aXZhdGVkKSB7Ci0JCQkJCQkJZS5kb2l0ID0gcHJvcGFnYXRlS2V5czsKLQkJCQkJCQlpZiAocG9wdXAgPT0gbnVsbCkgewotCQkJCQkJCQlpZiAoYXV0b0FjdGl2YXRpb25EZWxheSA+IDApIHsKLQkJCQkJCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCVRocmVhZAotCQkJCQkJCQkJCQkJCQkuc2xlZXAoYXV0b0FjdGl2YXRpb25EZWxheSk7Ci0JCQkJCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQlpZiAoIWlzVmFsaWQoKSkKLQkJCQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYygKLQkJCQkJCQkJCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQkJCQkJCW9wZW5Qcm9wb3NhbFBvcHVwKCk7Ci0JCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQl9KTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9OwotCQkJCQkJCQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlKTsKLQkJCQkJCQkJCXQuc3RhcnQoKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCW9wZW5Qcm9wb3NhbFBvcHVwKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBJZiB0aGUgcG9wdXAgaXMgbm90IG9wZW4sIHdlIGFsd2F5cyBwcm9wYWdhdGUga2V5cy4KLQkJCQkJLy8gSWYgdGhlIHBvcHVwIGlzIG9wZW4sIGNvbnN1bHQgdGhlIGZsYWcuCi0JCQkJCWUuZG9pdCA9IHBvcHVwID09IG51bGwgfHwgcHJvcGFnYXRlS2V5czsKLQkJCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogRHVtcCB0aGUgZ2l2ZW4gZXZlbnRzIHRvICJzdGFuZGFyZCIgb3V0cHV0LgotCQkJICogCi0JCQkgKiBAcGFyYW0gd2hvCi0JCQkgKiAgICAgICAgICAgIHdobyBpcyBkdW1waW5nIHRoZSBldmVudAotCQkJICogQHBhcmFtIGUKLQkJCSAqICAgICAgICAgICAgdGhlIGV2ZW50Ci0JCQkgKi8KLQkJCXByaXZhdGUgdm9pZCBkdW1wKFN0cmluZyB3aG8sIEV2ZW50IGUpIHsKLQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKAotCQkJCQkJIi0tLSBbQ29udGVudFByb3Bvc2FsQWRhcHRlcl1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKHdobyk7Ci0JCQkJc2IuYXBwZW5kKCIgLSBlOiBrZXlDb2RlPSIgKyBlLmtleUNvZGUgKyBoZXgoZS5rZXlDb2RlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzYi5hcHBlbmQoIjsgY2hhcmFjdGVyPSIgKyBlLmNoYXJhY3RlciArIGhleChlLmNoYXJhY3RlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKCI7IHN0YXRlTWFzaz0iICsgZS5zdGF0ZU1hc2sgKyBoZXgoZS5zdGF0ZU1hc2spKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZCgiOyBkb2l0PSIgKyBlLmRvaXQpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKCI7IGRldGFpbD0iICsgZS5kZXRhaWwgKyBoZXgoZS5kZXRhaWwpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZCgiOyB3aWRnZXQ9IiArIGUud2lkZ2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzYik7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgU3RyaW5nIGhleChpbnQgaSkgewotCQkJCXJldHVybiAiWzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoaSkgKyAnXSc7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQkJY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgY29udHJvbExpc3RlbmVyKTsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJDb250ZW50UHJvcG9zYWxBZGFwdGVyI2luc3RhbGxDb250cm9sTGlzdGVuZXIoKSAtIGluc3RhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBPcGVuIHRoZSBwcm9wb3NhbCBwb3B1cC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlblByb3Bvc2FsUG9wdXAoKSB7Ci0JCWlmIChwb3B1cCA9PSBudWxsKSB7Ci0JCQlwb3B1cCA9IG5ldyBDb250ZW50UHJvcG9zYWxQb3B1cCh0aGlzLCBjb250cm9sLCBwcm9wb3NhbFByb3ZpZGVyLAotCQkJCQludWxsLCBsYWJlbFByb3ZpZGVyLCBmaWx0ZXJQcm9wb3NhbHMpOwotCQkJcG9wdXAub3BlbigpOwotCQkJcG9wdXAuZ2V0U2hlbGwoKS5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQkJcG9wdXAgPSBudWxsOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBjb250ZW50IHByb3Bvc2FsIGhhcyBiZWVuIGFjY2VwdGVkLiBVcGRhdGUgdGhlIGNvbnRyb2wgY29udGVudHMKLQkgKiBhY2NvcmRpbmdseSBhbmQgbm90aWZ5IGFueSBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIHByb3Bvc2FsCi0JICogICAgICAgICAgICB0aGUgYWNjZXB0ZWQgcHJvcG9zYWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wb3NhbEFjY2VwdGVkKElDb250ZW50UHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJc3dpdGNoIChhY2NlcHRhbmNlKSB7Ci0JCWNhc2UgKFBST1BPU0FMX1JFUExBQ0UpOgotCQkJc2V0Q29udHJvbENvbnRlbnQocHJvcG9zYWwuZ2V0Q29udGVudCgpLCBwcm9wb3NhbAotCQkJCQkuZ2V0Q3Vyc29yUG9zaXRpb24oKSk7Ci0JCQlicmVhazsKLQkJY2FzZSAoUFJPUE9TQUxfSU5TRVJUKToKLQkJCWluc2VydENvbnRyb2xDb250ZW50KHByb3Bvc2FsLmdldENvbnRlbnQoKSwgcHJvcG9zYWwKLQkJCQkJLmdldEN1cnNvclBvc2l0aW9uKCkpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvLyBkbyBub3RoaW5nLiBUeXBpY2FsbHkgYSBsaXN0ZW5lciBpcyBpbnN0YWxsZWQgdG8gaGFuZGxlIHRoaXMgaW4KLQkJCS8vIGEgY3VzdG9tIHdheS4KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gSW4gYWxsIGNhc2VzLCBub3RpZnkgbGlzdGVuZXJzIG9mIGFuIGFjY2VwdGVkIHByb3Bvc2FsLgotCQlmaW5hbCBPYmplY3RbXSBsaXN0ZW5lckFycmF5ID0gcHJvcG9zYWxMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJBcnJheS5sZW5ndGg7IGkrKykKLQkJCSgoSUNvbnRlbnRQcm9wb3NhbExpc3RlbmVyKSBsaXN0ZW5lckFycmF5W2ldKQotCQkJCQkucHJvcG9zYWxBY2NlcHRlZChwcm9wb3NhbCk7Ci0JfQotCi0JLyoKLQkgKiBTZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgY29udHJvbCB0byB0aGUgc3BlY2lmaWVkIHRleHQsIHNldHRpbmcgdGhlCi0JICogY3Vyc29yUG9zaXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gd2l0aGluIHRoZSBuZXcgY29udGVudHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldENvbnRyb2xDb250ZW50KFN0cmluZyB0ZXh0LCBpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJaWYgKGlzVmFsaWQoKSkKLQkJCWNvbnRyb2xDb250ZW50QWRhcHRlci5zZXRDb250cm9sQ29udGVudHMoY29udHJvbCwgdGV4dCwKLQkJCQkJY3Vyc29yUG9zaXRpb24pOwotCX0KLQotCS8qCi0JICogSW5zZXJ0IHRoZSBzcGVjaWZpZWQgdGV4dCBpbnRvIHRoZSBjb250cm9sIGNvbnRlbnQsIHNldHRpbmcgdGhlCi0JICogY3Vyc29yUG9zaXRpb24gYXQgaHRlIGRlc2lyZWQgbG9jYXRpb24gd2l0aGluIHRoZSBuZXcgY29udGVudHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydENvbnRyb2xDb250ZW50KFN0cmluZyB0ZXh0LCBpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJaWYgKGlzVmFsaWQoKSkKLQkJCWNvbnRyb2xDb250ZW50QWRhcHRlci5pbnNlcnRDb250cm9sQ29udGVudHMoY29udHJvbCwgdGV4dCwKLQkJCQkJY3Vyc29yUG9zaXRpb24pOwotCX0KLQotCS8qCi0JICogQ2hlY2sgdGhhdCB0aGUgY29udHJvbCBhbmQgY29udGVudCBhZGFwdGVyIGFyZSB2YWxpZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIGNvbnRyb2wgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkKLQkJCQkmJiBjb250cm9sQ29udGVudEFkYXB0ZXIgIT0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9Db250ZW50UHJvcG9zYWxQb3B1cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZmllbGRhc3Npc3QvQ29udGVudFByb3Bvc2FsUG9wdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1Mzk5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9Db250ZW50UHJvcG9zYWxQb3B1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qb3B1cERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgbGlnaHR3ZWlnaHQgcG9wdXAgdXNlZCB0byBzaG93IGNvbnRlbnQgcHJvcG9zYWxzIGZvciBhIHRleHQgZmllbGQuIElmCi0gKiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGV4aXN0cyBmb3IgYSBwcm9wb3NhbCwgdGhlbiBzZWxlY3RpbmcgdGhhdCBwcm9wb3NhbAotICogd2lsbCByZXN1bHQgaW4gdGhlIGluZm9ybWF0aW9uIGJlaW5nIGRpc3BsYXllZCBpbiBhIHNlY29uZGFyeSBwb3B1cC4KLSAqIAotICogPHA+Ci0gKiBUaGlzIEFQSSBpcyBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbC4gSXQgaXMgc3RpbGwgZXZvbHZpbmcgZHVyaW5nIDMuMiBhbmQgaXMKLSAqIHN1YmplY3QgdG8gY2hhbmdlLiBJdCBpcyBiZWluZyByZWxlYXNlZCB0byBvYnRhaW4gZmVlZGJhY2sgZnJvbSBlYXJseQotICogYWRvcHRlcnMuIEZvciBub3csIHRoZXJlIGlzIGxpbWl0ZWQgQVBJIHRvIGNvbnRyb2wgaG93IHRoZSBwb3B1cCBpcyBzaXplZCBvcgotICogcGxhY2VkIHJlbGF0aXZlIHRvIHRoZSBjb250cm9sLCBvciB3aGV0aGVyIGl0IGlzIHJlc2l6YWJsZS4gVGhlIGludGVudGlvbiBpcwotICogdGhhdCBzdGFuZGFyZCB0ZWNobmlxdWVzIHdpbGwgYmUgaW1wbGVtZW50ZWQgdG8gImRvIHRoZSByaWdodCB0aGluZyIKLSAqIGRlcGVuZGluZyBvbiB0aGUgYXNzb2NpYXRlZCBjb250cm9sJ3Mgc2l6ZS9sb2NhdGlvbiBhbmQgdGhlIGNvbnRlbnQgc2l6ZSwgYW5kCi0gKiBBUEkgYWRkZWQgaWYgd2UgZGlzY292ZXIgdGhlcmUgYXJlIGFkZGl0aW9uYWwgY2hvaWNlcyB0byBiZSBtYWRlLgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UHJvcG9zYWxQb3B1cCBleHRlbmRzIFBvcHVwRGlhbG9nIHsKLQotCS8qCi0JICogU2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IHRvIHVzZSBhIFRhYmxlIHdpdGggU1dULlZJUlRVQUwuIFRoaXMgaXMgYQotCSAqIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODU4NSNjNDAKLQkgKiBUaGUgY29ycmVzcG9uZGluZyBTV1QgYnVnIGlzCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwMzIxCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfVklSVFVBTCA9ICEibW90aWYiLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogVGhlIGRlbGF5IGJlZm9yZSBzaG93aW5nIGEgc2Vjb25kYXJ5IHBvcHVwLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1BVUF9ERUxBWSA9IDUwMDsKLQotCS8qCi0JICogVGhlIGNoYXJhY3RlciBoZWlnaHQgaGludCBmb3IgdGhlIHBvcHVwLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1BVUF9DSEFSSEVJR0hUID0gMTA7Ci0KLQkvKgotCSAqIEVtcHR5IHN0cmluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBUaGUgbGlzdGVuZXIgd2Ugd2lsbCBpbnN0YWxsIG9uIHRoZSB0YXJnZXQgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFRhcmdldENvbnRyb2xMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQkJLy8gS2V5IGV2ZW50cyBmcm9tIHRoZSBjb250cm9sCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmICghaXNWYWxpZCgpKQotCQkJCXJldHVybjsKLQotCQkJaWYgKCEoZS50eXBlID09IFNXVC5LZXlEb3duIHx8IGUudHlwZSA9PSBTV1QuVHJhdmVyc2UpKQotCQkJCXJldHVybjsKLQotCQkJLy8gVHJhdmVyc2UgZXZlbnRzIHdpbGwgYmUgYmxvY2tlZCB3aGVuIHRoZSBwb3B1cCBpcyBvcGVuLCBidXQKLQkJCS8vIHdlIHdpbGwgaW50ZXJwcmV0IHRoZWlyIGNoYXJhY3RlcnMgYXMgbmF2aWdhdGlvbiB3aXRoaW4gdGhlCi0JCQkvLyBwb3B1cC4KLQkJCWlmIChlLnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0JCQkJZS5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLQkJCQllLmRvaXQgPSB0cnVlOwotCQkJfQotCi0JCQljaGFyIGtleSA9IGUuY2hhcmFjdGVyOwotCi0JCQkvLyBObyBjaGFyYWN0ZXIuIENoZWNrIGZvciBuYXZpZ2F0aW9uIGtleXMuCi0KLQkJCWlmIChrZXkgPT0gMCkgewotCQkJCWludCBuZXdTZWxlY3Rpb24gPSBwcm9wb3NhbFRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJaW50IHZpc2libGVSb3dzID0gKHByb3Bvc2FsVGFibGUuZ2V0U2l6ZSgpLnkgLyBwcm9wb3NhbFRhYmxlCi0JCQkJCQkuZ2V0SXRlbUhlaWdodCgpKSAtIDE7Ci0JCQkJc3dpdGNoIChlLmtleUNvZGUpIHsKLQkJCQljYXNlIFNXVC5BUlJPV19VUDoKLQkJCQkJbmV3U2VsZWN0aW9uIC09IDE7Ci0JCQkJCWlmIChuZXdTZWxlY3Rpb24gPCAwKQotCQkJCQkJbmV3U2VsZWN0aW9uID0gcHJvcG9zYWxUYWJsZS5nZXRJdGVtQ291bnQoKSAtIDE7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBTV1QuQVJST1dfRE9XTjoKLQkJCQkJbmV3U2VsZWN0aW9uICs9IDE7Ci0JCQkJCWlmIChuZXdTZWxlY3Rpb24gPiBwcm9wb3NhbFRhYmxlLmdldEl0ZW1Db3VudCgpIC0gMSkKLQkJCQkJCW5ld1NlbGVjdGlvbiA9IDA7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBTV1QuUEFHRV9ET1dOOgotCQkJCQluZXdTZWxlY3Rpb24gKz0gdmlzaWJsZVJvd3M7Ci0JCQkJCWlmIChuZXdTZWxlY3Rpb24gPj0gcHJvcG9zYWxUYWJsZS5nZXRJdGVtQ291bnQoKSkKLQkJCQkJCW5ld1NlbGVjdGlvbiA9IHByb3Bvc2FsVGFibGUuZ2V0SXRlbUNvdW50KCkgLSAxOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgU1dULlBBR0VfVVA6Ci0JCQkJCW5ld1NlbGVjdGlvbiAtPSB2aXNpYmxlUm93czsKLQkJCQkJaWYgKG5ld1NlbGVjdGlvbiA8IDApCi0JCQkJCQluZXdTZWxlY3Rpb24gPSAwOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgU1dULkhPTUU6Ci0JCQkJCW5ld1NlbGVjdGlvbiA9IDA7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBTV1QuRU5EOgotCQkJCQluZXdTZWxlY3Rpb24gPSBwcm9wb3NhbFRhYmxlLmdldEl0ZW1Db3VudCgpIC0gMTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQkvLyBBbnkgdW5rbm93biBrZXljb2RlcyB3aWxsIGNhdXNlIHRoZSBwb3B1cCB0byBjbG9zZS4KLQkJCQkvLyBNb2RpZmllciBrZXlzIGFyZSBleHBsaWNpdGx5IGNoZWNrZWQgYW5kIGlnbm9yZWQgYmVjYXVzZQotCQkJCS8vIHRoZXkgYXJlIG5vdCBjb21wbGV0ZSB5ZXQgKG5vIGNoYXJhY3RlcikuCi0JCQkJZGVmYXVsdDoKLQkJCQkJaWYgKGUua2V5Q29kZSAhPSBTV1QuQ0FQU19MT0NLICYmIGUua2V5Q29kZSAhPSBTV1QuTU9EMQotCQkJCQkJCSYmIGUua2V5Q29kZSAhPSBTV1QuTU9EMiAmJiBlLmtleUNvZGUgIT0gU1dULk1PRDMKLQkJCQkJCQkmJiBlLmtleUNvZGUgIT0gU1dULk1PRDQpCi0JCQkJCQljbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gSWYgYW55IG9mIHRoZXNlIG5hdmlnYXRpb24gZXZlbnRzIGNhdXNlZCBhIG5ldyBzZWxlY3Rpb24sCi0JCQkJLy8gdGhlbiBoYW5kbGUgdGhhdCBub3cgYW5kIHJldHVybi4KLQkJCQlpZiAobmV3U2VsZWN0aW9uID49IDApCi0JCQkJCXNlbGVjdFByb3Bvc2FsKG5ld1NlbGVjdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBrZXkgIT0gMAotCQkJLy8gQ2hlY2sgZm9yIHNwZWNpYWwga2V5cyBpbnZvbHZlZCBpbiBjYW5jZWxsaW5nLCBhY2NlcHRpbmcsIG9yCi0JCQkvLyBmaWx0ZXJpbmcgdGhlIHByb3Bvc2Fscy4KLQkJCXN3aXRjaCAoa2V5KSB7Ci0JCQljYXNlIFNXVC5FU0M6IC8vIEVzYwotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCWNsb3NlKCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1dULkxGOgotCQkJY2FzZSBTV1QuQ1I6Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJT2JqZWN0IHAgPSBnZXRTZWxlY3RlZFByb3Bvc2FsKCk7Ci0JCQkJaWYgKHAgIT0gbnVsbCkKLQkJCQkJYWNjZXB0Q3VycmVudFByb3Bvc2FsKCk7Ci0JCQkJY2xvc2UoKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTV1QuVEFCOgotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCWdldFNoZWxsKCkuc2V0Rm9jdXMoKTsKLQkJCQlyZXR1cm47Ci0KLQkJCWNhc2UgU1dULkJTOgotCQkJCS8vIEJhY2tzcGFjZSBzaG91bGQgYmFjayBvdXQgb2YgYW55IHN0b3JlZCBmaWx0ZXIgdGV4dAotCQkJCWlmIChmaWx0ZXIpIHsKLQkJCQkJZmlsdGVyVGV4dCA9IGZpbHRlclRleHQuc3Vic3RyaW5nKDAsCi0JCQkJCQkJZmlsdGVyVGV4dC5sZW5ndGgoKSAtIDEpOwotCQkJCQlyZWNvbXB1dGVQcm9wb3NhbHMoZmlsdGVyVGV4dCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJLy8gSWYgdGhlIGtleSBpcyBhIGRlZmluZWQgdW5pY29kZSBjaGFyYWN0ZXIsIGFuZCBub3Qgb25lIG9mIHRoZQotCQkJCS8vIHNwZWNpYWwgY2FzZXMgcHJvY2Vzc2VkIGFib3ZlLCB1cGRhdGUgdGhlIGZpbHRlciB0ZXh0IGFuZAotCQkJCS8vIGZpbHRlciB0aGUgcHJvcG9zYWxzLgotCQkJCWlmIChmaWx0ZXIgJiYgQ2hhcmFjdGVyLmlzRGVmaW5lZChrZXkpKSB7Ci0JCQkJCWZpbHRlclRleHQgPSBmaWx0ZXJUZXh0ICsgU3RyaW5nLnZhbHVlT2Yoa2V5KTsKLQkJCQkJcmVjb21wdXRlUHJvcG9zYWxzKGZpbHRlclRleHQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogSW50ZXJuYWwgY2xhc3MgdXNlZCB0byBpbXBsZW1lbnQgdGhlIHNlY29uZGFyeSBwb3B1cC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEluZm9Qb3B1cERpYWxvZyBleHRlbmRzIFBvcHVwRGlhbG9nIHsKLQotCQkvKgotCQkgKiBUaGUgdGV4dCBjb250cm9sIHRoYXQgZGlzcGxheXMgdGhlIHRleHQuCi0JCSAqLwotCQlwcml2YXRlIFRleHQgdGV4dDsKLQotCQkvKgotCQkgKiBUaGUgU3RyaW5nIHNob3duIGluIHRoZSBwb3B1cC4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRzID0gRU1QVFk7Ci0KLQkJLyoKLQkJICogQ29uc3RydWN0IGFuIGluZm8tcG9wdXAgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmVudC4KLQkJICovCi0JCUluZm9Qb3B1cERpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgUG9wdXBEaWFsb2cuSE9WRVJfU0hFTExTVFlMRSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKLQkJCQkJZmFsc2UsIG51bGwsIG51bGwpOwotCQl9Ci0KLQkJLyoKLQkJICogQ3JlYXRlIGEgdGV4dCBjb250cm9sIGZvciBzaG93aW5nIHRoZSBpbmZvIGFib3V0IGEgcHJvcG9zYWwuCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkgfCBTV1QuV1JBUAotCQkJCQl8IFNXVC5OT19GT0NVUyk7Ci0KLQkJCS8vIFVzZSB0aGUgY29tcGFjdCBtYXJnaW5zIGVtcGxveWVkIGJ5IFBvcHVwRGlhbG9nLgotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdkLmhvcml6b250YWxJbmRlbnQgPSBQb3B1cERpYWxvZy5QT1BVUF9IT1JJWk9OVEFMU1BBQ0lORzsKLQkJCWdkLnZlcnRpY2FsSW5kZW50ID0gUG9wdXBEaWFsb2cuUE9QVVBfVkVSVElDQUxTUEFDSU5HOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCXRleHQuc2V0VGV4dChjb250ZW50cyk7Ci0KLQkJCS8vIHNpbmNlIFNXVC5OT19GT0NVUyBpcyBvbmx5IGEgaGludC4uLgotCQkJdGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBldmVudCkgewotCQkJCQlDb250ZW50UHJvcG9zYWxQb3B1cC50aGlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCi0JCS8qCi0JCSAqIEFkanVzdCB0aGUgYm91bmRzIHNvIHRoYXQgd2UgYXBwZWFyIGFkamFjZW50IHRvIG91ciBwYXJlbnQgc2hlbGwKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGFkanVzdEJvdW5kcygpIHsKLQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBnZXRQYXJlbnRTaGVsbCgpLmdldEJvdW5kcygpOwotCQkJZ2V0U2hlbGwoKS5zZXRCb3VuZHMoCi0JCQkJCW5ldyBSZWN0YW5nbGUocGFyZW50Qm91bmRzLnggKyBwYXJlbnRCb3VuZHMud2lkdGgKLQkJCQkJCQkrIFBvcHVwRGlhbG9nLlBPUFVQX0hPUklaT05UQUxTUEFDSU5HLAotCQkJCQkJCXBhcmVudEJvdW5kcy55ICsgUG9wdXBEaWFsb2cuUE9QVVBfVkVSVElDQUxTUEFDSU5HLAotCQkJCQkJCXBhcmVudEJvdW5kcy53aWR0aCwgcGFyZW50Qm91bmRzLmhlaWdodCkpOwotCi0JCX0KLQotCQkvKgotCQkgKiBTZXQgdGhlIHRleHQgY29udGVudHMgb2YgdGhlIHBvcHVwLgotCQkgKi8KLQkJdm9pZCBzZXRDb250ZW50cyhTdHJpbmcgbmV3Q29udGVudHMpIHsKLQkJCWlmIChuZXdDb250ZW50cyA9PSBudWxsKQotCQkJCW5ld0NvbnRlbnRzID0gRU1QVFk7Ci0JCQl0aGlzLmNvbnRlbnRzID0gbmV3Q29udGVudHM7Ci0JCQlpZiAodGV4dCAhPSBudWxsICYmICF0ZXh0LmlzRGlzcG9zZWQoKSkgewotCQkJCXRleHQuc2V0VGV4dChjb250ZW50cyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBhZGFwdGVyIG9uIHRoZSB0YXJnZXQgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRQcm9wb3NhbEFkYXB0ZXIgYWRhcHRlcjsKLQotCS8qCi0JICogVGhlIGxpc3RlbmVyIGluc3RhbGxlZCBvbiB0aGUgdGFyZ2V0IGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBMaXN0ZW5lciBjb250cm9sTGlzdGVuZXI7Ci0KLQkvKgotCSAqIFRoZSBjb250cm9sIG9uIHdoaWNoIHdlIGFyZSBwcm9wb3NpbmcgY29udGVudC4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2wgY29udHJvbDsKLQotCS8qCi0JICogVGhlIHRhYmxlIHVzZWQgdG8gc2hvdyB0aGUgbGlzdCBvZiBwcm9wb3NhbHMuCi0JICovCi0JcHJpdmF0ZSBUYWJsZSBwcm9wb3NhbFRhYmxlOwotCi0JLyoKLQkgKiBUaGUgcHJvdmlkZXIgb2YgcHJvcG9zYWxzIGFuZCBwcm9wb3NhbCBkZXNjcmlwdGlvbnMKLQkgKi8KLQlwcml2YXRlIElDb250ZW50UHJvcG9zYWxQcm92aWRlciBwcm9wb3NhbFByb3ZpZGVyOwotCi0JLyoKLQkgKiBUaGUgcHJvcG9zYWxzIHRvIGJlIHNob3duIChjYWNoZWQgdG8gYXZvaWQgcmVwZWF0ZWQgcmVxdWVzdHMpLgotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRQcm9wb3NhbFtdIHByb3Bvc2FsczsKLQotCS8qCi0JICogQSBsYWJlbCBwcm92aWRlciB1c2VkIHRvIHNob3cgdGhlIHByb3Bvc2FscyBpbiB0aGUgdGFibGUuCi0JICovCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JLyoKLQkgKiBTZWNvbmRhcnkgcG9wdXAgdXNlZCB0byBzaG93IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWxlY3RlZAotCSAqIHByb3Bvc2FsLi4KLQkgKi8KLQlwcml2YXRlIEluZm9Qb3B1cERpYWxvZyBpbmZvUG9wdXA7Ci0KLQkvKgotCSAqIEZpbHRlciB0ZXh0IC0gdHJhY2tlZCB3aGlsZSBwb3B1cCBpcyBvcGVuLCBvbmx5IGlmIHdlIGFyZSB0b2xkIHRvIGZpbHRlcgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZpbHRlclRleHQgPSBFTVBUWTsKLQotCS8qCi0JICogQm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSBmaWx0ZXJpbmcuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZpbHRlciA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHBvcHVwLCBzcGVjaWZ5aW5nIHRoZSBjb250cm9sIGZvciB3aGljaAotCSAqIHRoaXMgcG9wdXAgaXMgc2hvd2luZyBjb250ZW50LCBhbmQgaG93IHRoZSBwcm9wb3NhbHMgc2hvdWxkIGJlIG9idGFpbmVkCi0JICogYW5kIGRpc3BsYXllZC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgcHJvcG9zYWwgYWRhcHRlciB0aGF0IG9wZW5lZCB0aGlzIGRpYWxvZy4KLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgdGhlIGNvbnRyb2wgd2hvc2UgY29udGVudCBpcyBiZWluZyBwcm9wb3NlZC4KLQkgKiBAcGFyYW0gcHJvcG9zYWxQcm92aWRlcgotCSAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyIG9mIGNvbnRlbnQgcHJvcG9zYWxzCi0JICogQHBhcmFtIGluZm9UZXh0Ci0JICogICAgICAgICAgICBUZXh0IHRvIGJlIHNob3duIGluIGEgbG93ZXIgaW5mbyBhcmVhLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gaW5mbyBhcmVhLgotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyCi0JICogICAgICAgICAgICB0aGUge0BsaW5rIElMYWJlbFByb3ZpZGVyfSB1c2VkIHRvIG9idGFpbiB2aXN1YWwgY29udGVudCBmb3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wb3NhbHMuIE11c3QgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBwcm9wb3NhbHMgc2hvdWxkIGJlIGZpbHRlcmVkIGFzCi0JICogICAgICAgICAgICBrZXlzIGFyZSB0eXBlZCBpbiB0aGUgcG9wdXAuCi0JICovCi0JcHVibGljIENvbnRlbnRQcm9wb3NhbFBvcHVwKENvbnRlbnRQcm9wb3NhbEFkYXB0ZXIgYWRhcHRlciwKLQkJCUNvbnRyb2wgY29udHJvbCwgSUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyIHByb3Bvc2FsUHJvdmlkZXIsCi0JCQlTdHJpbmcgaW5mb1RleHQsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIGJvb2xlYW4gZmlsdGVyKSB7Ci0JCXN1cGVyKGNvbnRyb2wuZ2V0U2hlbGwoKSwgUG9wdXBEaWFsb2cuSU5GT1BPUFVQUkVTSVpFX1NIRUxMU1RZTEUsCi0JCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIG51bGwsIGluZm9UZXh0KTsKLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQkJdGhpcy5jb250cm9sID0gY29udHJvbDsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLQkJdGhpcy5wcm9wb3NhbFByb3ZpZGVyID0gcHJvcG9zYWxQcm92aWRlcjsKLQkJdGhpcy5wcm9wb3NhbHMgPSBnZXRQcm9wb3NhbHMoZmlsdGVyVGV4dCk7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogQ3JlYXRlcyB0aGUgY29udGVudCBhcmVhIGZvciB0aGUgcHJvcG9zYWwgcG9wdXAuIFRoaXMgY3JlYXRlcyBhIHRhYmxlIGFuZAotCSAqIHBsYWNlcyBpdCBpbnNpZGUgdGhlIGNvbXBvc2l0ZS4gVGhlIHRhYmxlIHdpbGwgY29udGFpbiBhIGxpc3Qgb2YgYWxsIHRoZQotCSAqIHByb3Bvc2Fscy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGRpYWxvZyBhcmVhOyBtdXN0IG5vdAotCSAqIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBVc2UgdmlydHVhbCB3aGVyZSBhcHByb3ByaWF0ZSAoc2VlIGZsYWcgZGVmaW5pdGlvbikuCi0JCWlmIChVU0VfVklSVFVBTCkgewotCQkJcHJvcG9zYWxUYWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTAotCQkJCQl8IFNXVC5WSVJUVUFMKTsKLQotCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaGFuZGxlU2V0RGF0YShldmVudCk7Ci0JCQkJfQotCQkJfTsKLQkJCXByb3Bvc2FsVGFibGUuYWRkTGlzdGVuZXIoU1dULlNldERhdGEsIGxpc3RlbmVyKTsKLQkJfSBlbHNlIHsKLQkJCXByb3Bvc2FsVGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl9Ci0KLQkJLy8gY29tcHV0ZSB0aGUgcHJvcG9zYWxzIHRvIGZvcmNlIHBvcHVsYXRpb24gb2YgdGhlIHRhYmxlLgotCQlyZWNvbXB1dGVQcm9wb3NhbHMoZmlsdGVyVGV4dCk7Ci0KLQkJcHJvcG9zYWxUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQkJcHJvcG9zYWxUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBJZiBhIHByb3Bvc2FsIGhhcyBiZWVuIHNlbGVjdGVkLCBzaG93IGl0IGluIHRoZSBwb3B1cC4KLQkJCQkvLyBPdGhlcndpc2UgY2xvc2UgdGhlIHBvcHVwLgotCQkJCWlmIChlLml0ZW0gPT0gbnVsbCkgewotCQkJCQlpZiAoaW5mb1BvcHVwICE9IG51bGwpCi0JCQkJCQlpbmZvUG9wdXAuY2xvc2UoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGUuaXRlbTsKLQkJCQkJSUNvbnRlbnRQcm9wb3NhbCBwcm9wb3NhbCA9IChJQ29udGVudFByb3Bvc2FsKSBpdGVtCi0JCQkJCQkJLmdldERhdGEoKTsKLQkJCQkJc2hvd1Byb3Bvc2FsRGVzY3JpcHRpb24ocHJvcG9zYWwuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBEZWZhdWx0IHNlbGVjdGlvbiB3YXMgbWFkZS4gQWNjZXB0IHRoZSBjdXJyZW50IHByb3Bvc2FsLgotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhY2NlcHRDdXJyZW50UHJvcG9zYWwoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQ29tcHV0ZSBhIGhlaWdodCBhbmQgd2lkdGggZm9yIHRoZSB0YWJsZS4KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlHQyBnYyA9IG5ldyBHQyhwcm9wb3NhbFRhYmxlKTsKLQkJZ2Muc2V0Rm9udChwcm9wb3NhbFRhYmxlLmdldEZvbnQoKSk7Ci0JCUZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnRyb2wuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IERpYWxvZy5jb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLAotCQkJCVBPUFVQX0NIQVJIRUlHSFQpOwotCQlwcm9wb3NhbFRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBwcm9wb3NhbFRhYmxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qb3B1cERpYWxvZy5hZGp1c3RCb3VuZHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkanVzdEJvdW5kcygpIHsKLQkJLy8gR2V0IG91ciBjb250cm9sJ3MgbG9jYXRpb24gaW4gZGlzcGxheSBjb29yZGluYXRlcy4KLQkJUG9pbnQgbG9jYXRpb24gPSBjb250cm9sLmdldERpc3BsYXkoKS5tYXAoY29udHJvbC5nZXRQYXJlbnQoKSwgbnVsbCwKLQkJCQljb250cm9sLmdldExvY2F0aW9uKCkpOwotCQlnZXRTaGVsbCgpLnNldExvY2F0aW9uKGxvY2F0aW9uLnggKyAzLAotCQkJCWxvY2F0aW9uLnkgKyBjb250cm9sLmdldFNpemUoKS55ICsgMyk7Ci0JfQotCi0JLyoKLQkgKiBIYW5kbGUgdGhlIHNldCBkYXRhIGV2ZW50LiBTZXQgdGhlIGl0ZW0gZGF0YSBvZiB0aGUgcmVxdWVzdGVkIGl0ZW0gdG8gdGhlCi0JICogY29ycmVzcG9uZGluZyBwcm9wb3NhbCBpbiB0aGUgcHJvcG9zYWwgY2FjaGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNldERhdGEoRXZlbnQgZXZlbnQpIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotCQlpbnQgaW5kZXggPSBwcm9wb3NhbFRhYmxlLmluZGV4T2YoaXRlbSk7Ci0KLQkJaWYgKDAgPD0gaW5kZXggJiYgaW5kZXggPCBwcm9wb3NhbHMubGVuZ3RoKSB7Ci0JCQlJQ29udGVudFByb3Bvc2FsIGN1cnJlbnQgPSBwcm9wb3NhbHNbaW5kZXhdOwotCQkJaXRlbS5zZXRUZXh0KGdldFN0cmluZyhjdXJyZW50KSk7Ci0JCQlpdGVtLnNldEltYWdlKGdldEltYWdlKGN1cnJlbnQpKTsKLQkJCWl0ZW0uc2V0RGF0YShjdXJyZW50KTsKLQkJfSBlbHNlIHsKLQkJCS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBkb2VzIG9uIHdpbjMyCi0JCX0KLQl9Ci0KLQkvKgotCSAqIENhY2hlcyB0aGUgc3BlY2lmaWVkIHByb3Bvc2FscyBhbmQgcmVwb3B1bGF0ZXMgdGhlIHRhYmxlIGlmIGl0IGhhcyBiZWVuCi0JICogY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0UHJvcG9zYWxzKElDb250ZW50UHJvcG9zYWxbXSBuZXdQcm9wb3NhbHMpIHsKLQkJaWYgKG5ld1Byb3Bvc2FscyA9PSBudWxsIHx8IG5ld1Byb3Bvc2Fscy5sZW5ndGggPT0gMCkgewotCQkJbmV3UHJvcG9zYWxzID0gZ2V0RW1wdHlQcm9wb3NhbEFycmF5KCk7Ci0JCX0KLQkJdGhpcy5wcm9wb3NhbHMgPSBuZXdQcm9wb3NhbHM7Ci0KLQkJLy8gSWYgdGhlcmUgaXMgYSB0YWJsZQotCQlpZiAoaXNWYWxpZCgpKSB7Ci0JCQlmaW5hbCBpbnQgbmV3U2l6ZSA9IG5ld1Byb3Bvc2Fscy5sZW5ndGg7Ci0JCQlpZiAoVVNFX1ZJUlRVQUwpIHsKLQkJCQkvLyBTZXQgYW5kIGNsZWFyIHRoZSB2aXJ0dWFsIHRhYmxlLiBEYXRhIHdpbGwgYmUKLQkJCQkvLyBwcm92aWRlZCBpbiB0aGUgU1dULlNldERhdGEgZXZlbnQgaGFuZGxlci4KLQkJCQlwcm9wb3NhbFRhYmxlLnNldEl0ZW1Db3VudChuZXdTaXplKTsKLQkJCQlwcm9wb3NhbFRhYmxlLmNsZWFyQWxsKCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFBvcHVsYXRlIHRoZSB0YWJsZSBtYW51YWxseQotCQkJCXByb3Bvc2FsVGFibGUuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQlwcm9wb3NhbFRhYmxlLnNldEl0ZW1Db3VudChuZXdTaXplKTsKLQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHByb3Bvc2FsVGFibGUuZ2V0SXRlbXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQkJCUlDb250ZW50UHJvcG9zYWwgcHJvcG9zYWwgPSBuZXdQcm9wb3NhbHNbaV07Ci0JCQkJCWl0ZW0uc2V0VGV4dChnZXRTdHJpbmcocHJvcG9zYWwpKTsKLQkJCQkJaXRlbS5zZXRJbWFnZShnZXRJbWFnZShwcm9wb3NhbCkpOwotCQkJCQlpdGVtLnNldERhdGEocHJvcG9zYWwpOwotCQkJCX0KLQkJCQlwcm9wb3NhbFRhYmxlLnNldFJlZHJhdyh0cnVlKTsKLQkJCX0KLQkJCS8vIERlZmF1bHQgdG8gdGhlIGZpcnN0IHNlbGVjdGlvbiBpZiB0aGVyZSBpcyBjb250ZW50LgotCQkJaWYgKG5ld1Byb3Bvc2Fscy5sZW5ndGggPiAwKSB7Ci0JCQkJc2VsZWN0UHJvcG9zYWwoMCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIE5vIHNlbGVjdGlvbiwgY2xvc2UgdGhlIHNlY29uZGFyeSBwb3B1cCBpZiBpdCB3YXMgb3BlbgotCQkJCWlmIChpbmZvUG9wdXAgIT0gbnVsbCkKLQkJCQkJaW5mb1BvcHVwLmNsb3NlKCk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogR2V0IHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcG9zYWwuIEFsd2F5cyByZXR1cm4gYSBTdHJpbmcgb2Ygc29tZQotCSAqIGtpbmQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKElDb250ZW50UHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJaWYgKHByb3Bvc2FsID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyID09IG51bGwpCi0JCQlyZXR1cm4gcHJvcG9zYWwuZ2V0TGFiZWwoKSA9PSBudWxsID8gcHJvcG9zYWwuZ2V0Q29udGVudCgpCi0JCQkJCTogcHJvcG9zYWwuZ2V0TGFiZWwoKTsKLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChwcm9wb3NhbCk7Ci0JfQotCi0JLyoKLQkgKiBHZXQgdGhlIGltYWdlIGZvciB0aGUgc3BlY2lmaWVkIHByb3Bvc2FsLiBJZiB0aGVyZSBpcyBubyBpbWFnZSBhdmFpbGFibGUsCi0JICogcmV0dXJuIG51bGwuCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBnZXRJbWFnZShJQ29udGVudFByb3Bvc2FsIHByb3Bvc2FsKSB7Ci0JCWlmIChwcm9wb3NhbCA9PSBudWxsIHx8IGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRJbWFnZShwcm9wb3NhbCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYW4gZW1wdHkgYXJyYXkuIFVzZWQgc28gdGhhdCBzb21ldGhpbmcgYWx3YXlzIHNob3dzIGluIHRoZQotCSAqIHByb3Bvc2FsIHBvcHVwLCBldmVuIGlmIG5vIHByb3Bvc2FsIHByb3ZpZGVyIHdhcyBzcGVjaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFByb3Bvc2FsW10gZ2V0RW1wdHlQcm9wb3NhbEFycmF5KCkgewotCQlyZXR1cm4gbmV3IElDb250ZW50UHJvcG9zYWxbMF07Ci0JfQotCi0JLyoKLQkgKiBBZGQgYSBsaXN0ZW5lciB0byB0aGUgdGFyZ2V0IGNvbnRyb2wuIFdlIG1vbml0b3Iga2V5IGFuZCB0cmF2ZXJzZSBldmVudHMKLQkgKiBpbiB0aGUgdGFyZ2V0IGNvbnRyb2wgd2hpbGUgd2UgYXJlIG9wZW4sIGluIG9yZGVyIHRvIGhhbmRsZSB0cmF2ZXJzYWwgYW5kCi0JICogbmF2aWdhdGlvbiByZXF1ZXN0cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQ29udHJvbExpc3RlbmVyKCkgewotCQljb250cm9sTGlzdGVuZXIgPSBuZXcgVGFyZ2V0Q29udHJvbExpc3RlbmVyKCk7Ci0JCWNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGNvbnRyb2xMaXN0ZW5lcik7Ci0JCWNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBjb250cm9sTGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogUmVtb3ZlIGFueSBsaXN0ZW5lcnMgaW5zdGFsbGVkIG9uIHRoZSBjb250cm9sLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVDb250cm9sTGlzdGVuZXIoKSB7Ci0JCWNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULktleURvd24sIGNvbnRyb2xMaXN0ZW5lcik7Ci0JCWNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBjb250cm9sTGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogQW5zd2VyIHRydWUgaWYgdGhlIHBvcHVwIGlzIHZhbGlkLCB3aGljaCBtZWFucyB0aGUgdGFibGUgaGFzIGJlZW4gY3JlYXRlZAotCSAqIGFuZCBub3QgZGlzcG9zZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBwcm9wb3NhbFRhYmxlICE9IG51bGwgJiYgIXByb3Bvc2FsVGFibGUuaXNEaXNwb3NlZCgpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IHNlbGVjdGVkIHByb3Bvc2FsLgotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRQcm9wb3NhbCBnZXRTZWxlY3RlZFByb3Bvc2FsKCkgewotCQlpZiAoaXNWYWxpZCgpKSB7Ci0JCQlpbnQgaSA9IHByb3Bvc2FsVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCWlmIChwcm9wb3NhbHMgPT0gbnVsbCB8fCBpIDwgMCB8fCBpID49IHByb3Bvc2Fscy5sZW5ndGgpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gcHJvcG9zYWxzW2ldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogU2VsZWN0IHRoZSBwcm9wb3NhbCBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdFByb3Bvc2FsKGludCBpbmRleCkgewotCQlBc3NlcnQuaXNUcnVlKGluZGV4ID49IDAsICJQcm9wb3NhbCBpbmRleCBzaG91bGQgbmV2ZXIgYmUgbmVnYXRpdmUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWlzVmFsaWQoKSB8fCBwcm9wb3NhbHMgPT0gbnVsbCB8fCBpbmRleCA+PSBwcm9wb3NhbHMubGVuZ3RoKQotCQkJcmV0dXJuOwotCQlwcm9wb3NhbFRhYmxlLnNldFNlbGVjdGlvbihpbmRleCk7Ci0JCXByb3Bvc2FsVGFibGUuc2hvd1NlbGVjdGlvbigpOwotCi0JCXNob3dQcm9wb3NhbERlc2NyaXB0aW9uKHByb3Bvc2Fsc1tpbmRleF0uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhpcyBDb250ZW50UHJvcG9zYWxQb3B1cC4gVGhpcyBtZXRob2QgaXMgZXh0ZW5kZWQgaW4gb3JkZXIgdG8gYWRkCi0JICogdGhlIGNvbnRyb2wgbGlzdGVuZXIgd2hlbiB0aGUgcG9wdXAgaXMgb3BlbmVkIGFuZCB0byBpbnZva2UgdGhlIHNlY29uZGFyeQotCSAqIHBvcHVwIGlmIGFwcGxpY2FibGUuCi0JICogCi0JICogQHJldHVybiB0aGUgcmV0dXJuIGNvZGUKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjb3BlbigpCi0JICovCi0JcHVibGljIGludCBvcGVuKCkgewotCQlhZGRDb250cm9sTGlzdGVuZXIoKTsKLQkJaW50IHZhbHVlID0gc3VwZXIub3BlbigpOwotCQlzaG93UHJvcG9zYWxEZXNjcmlwdGlvbihnZXRTZWxlY3RlZFByb3Bvc2FsKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhpcyBwb3B1cC4gVGhpcyBtZXRob2QgaXMgZXh0ZW5kZWQgdG8gcmVtb3ZlIHRoZSBjb250cm9sCi0JICogbGlzdGVuZXIuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgd2luZG93IGlzIChvciB3YXMgYWxyZWFkeSkgY2xvc2VkLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBzdGlsbCBvcGVuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCXJlbW92ZUNvbnRyb2xMaXN0ZW5lcigpOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIEdldCB0aGUgcHJvcG9zYWxzIGZyb20gdGhlIHByb3Bvc2FsIHByb3ZpZGVyLiBUaGUgcHJvdmlkZXIgbWF5IG9yIG1heSBub3QKLQkgKiBmaWx0ZXIgdGhlIHByb3Bvc2FscyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGZpbHRlciB0ZXh0LgotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRQcm9wb3NhbFtdIGdldFByb3Bvc2FscyhTdHJpbmcgZmlsdGVyU3RyaW5nKSB7Ci0JCWlmIChwcm9wb3NhbFByb3ZpZGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IHBvc2l0aW9uID0gYWRhcHRlci5nZXRDb250cm9sQ29udGVudEFkYXB0ZXIoKS5nZXRDdXJzb3JQb3NpdGlvbigKLQkJCQlhZGFwdGVyLmdldENvbnRyb2woKSk7Ci0JCVN0cmluZyBjb250ZW50cyA9IGFkYXB0ZXIuZ2V0Q29udHJvbENvbnRlbnRBZGFwdGVyKCkKLQkJCQkuZ2V0Q29udHJvbENvbnRlbnRzKGFkYXB0ZXIuZ2V0Q29udHJvbCgpKTsKLQkJSUNvbnRlbnRQcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb3Bvc2FsUHJvdmlkZXIuZ2V0UHJvcG9zYWxzKGNvbnRlbnRzLAotCQkJCXBvc2l0aW9uKTsKLQkJaWYgKGZpbHRlcikgewotCQkJcmV0dXJuIGZpbHRlclByb3Bvc2Fscyhwcm9wb3NhbHMsIGZpbHRlclN0cmluZyk7Ci0JCX0KLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQkvKgotCSAqIFNob3cgdGhlIHByb3Bvc2FsIGRlc2NyaXB0aW9uIGluIGEgc2Vjb25kYXJ5IHBvcHVwLgotCSAqLwotCXByaXZhdGUgdm9pZCBzaG93UHJvcG9zYWxEZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJLy8gSWYgd2UgaGF2ZSBub3QgY3JlYXRlZCBhbiBpbmZvIHBvcHVwIHlldCwgZG8gc28gbm93LgotCQlpZiAoaW5mb1BvcHVwID09IG51bGwgJiYgZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIGEgdGhyZWFkIHRoYXQgd2lsbCBzbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBkZWxheQotCQkJLy8gYmVmb3JlIGNyZWF0aW5nIHRoZSBwb3B1cC4gV2UgZG8gbm90IHVzZSBKb2JzIHNpbmNlIHRoaXMKLQkJCS8vIGNvZGUgbXVzdCBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5IG9mIHRoZSBFY2xpcHNlIHJ1bnRpbWUuCi0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoUE9QVVBfREVMQVkpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQkJaWYgKCFpc1ZhbGlkKCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkvLyBUaGUgc2VsZWN0aW9uIG1heSBoYXZlIGNoYW5nZWQgYnkgdGhlIHRpbWUgd2UKLQkJCQkJCQkvLyBvcGVuLCBzbyBkb3VibGUgY2hlY2sgaXQuCi0JCQkJCQkJSUNvbnRlbnRQcm9wb3NhbCBwID0gZ2V0U2VsZWN0ZWRQcm9wb3NhbCgpOwotCQkJCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKGluZm9Qb3B1cCA9PSBudWxsKSB7Ci0JCQkJCQkJCQlpbmZvUG9wdXAgPSBuZXcgSW5mb1BvcHVwRGlhbG9nKGdldFNoZWxsKCkpOwotCQkJCQkJCQkJaW5mb1BvcHVwLm9wZW4oKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpbmZvUG9wdXAuc2V0Q29udGVudHMocC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQkJCQkJaW5mb1BvcHVwLmdldFNoZWxsKCkuYWRkRGlzcG9zZUxpc3RlbmVyKAotCQkJCQkJCQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKAotCQkJCQkJCQkJCQkJCURpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCQkJCQkJCQkJaW5mb1BvcHVwID0gbnVsbDsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfTsKLQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZChydW5uYWJsZSk7Ci0JCQl0LnN0YXJ0KCk7Ci0JCX0gZWxzZSBpZiAoaW5mb1BvcHVwICE9IG51bGwpIHsKLQkJCS8vIFdlIGFscmVhZHkgaGF2ZSBhIHBvcHVwLCBzbyBqdXN0IHJlc2V0IHRoZSBjb250ZW50cy4KLQkJCWluZm9Qb3B1cC5zZXRDb250ZW50cyhkZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEFjY2VwdCB0aGUgY3VycmVudCBwcm9wb3NhbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWNjZXB0Q3VycmVudFByb3Bvc2FsKCkgewotCQlhZGFwdGVyLnByb3Bvc2FsQWNjZXB0ZWQoZ2V0U2VsZWN0ZWRQcm9wb3NhbCgpKTsKLQkJY2xvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIFJlcXVlc3QgdGhlIHByb3Bvc2FscyBmcm9tIHRoZSBwcm9wb3NhbCBwcm92aWRlciwgYW5kIHJlY29tcHV0ZSBhbnkKLQkgKiBjYWNoZXMuIFJlcG9wdWxhdGUgdGhlIHBvcHVwIGlmIGl0IGlzIG9wZW4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlY29tcHV0ZVByb3Bvc2FscyhTdHJpbmcgZmlsdGVyVGV4dCkgewotCQlzZXRQcm9wb3NhbHMoZ2V0UHJvcG9zYWxzKGZpbHRlclRleHQpKTsKLQl9Ci0KLQkvKgotCSAqIEZpbHRlciB0aGUgcHJvdmlkZWQgbGlzdCBvZiBjb250ZW50IHByb3Bvc2FscyBhY2NvcmRpbmcgdG8gdGhlIGZpbHRlcgotCSAqIHRleHQuCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFByb3Bvc2FsW10gZmlsdGVyUHJvcG9zYWxzKElDb250ZW50UHJvcG9zYWxbXSBwcm9wb3NhbHMsCi0JCQlTdHJpbmcgZmlsdGVyU3RyaW5nKSB7Ci0JCWlmIChmaWx0ZXJTdHJpbmcubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBwcm9wb3NhbHM7Ci0KLQkJLy8gQ2hlY2sgZWFjaCBzdHJpbmcgZm9yIGEgbWF0Y2guIFVzZSB0aGUgc3RyaW5nIGRpc3BsYXllZCB0byB0aGUgdXNlciwKLQkJLy8gbm90IHRoZSBwcm9wb3NhbCBjb250ZW50LgotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wb3NhbHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBnZXRTdHJpbmcocHJvcG9zYWxzW2ldKTsKLQkJCWlmIChzdHJpbmcubGVuZ3RoKCkgPj0gZmlsdGVyU3RyaW5nLmxlbmd0aCgpCi0JCQkJCSYmIHN0cmluZy5zdWJzdHJpbmcoMCwgZmlsdGVyU3RyaW5nLmxlbmd0aCgpKQotCQkJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKGZpbHRlclN0cmluZykpCi0JCQkJbGlzdC5hZGQocHJvcG9zYWxzW2ldKTsKLQotCQl9Ci0JCXJldHVybiAoSUNvbnRlbnRQcm9wb3NhbFtdKSBsaXN0LnRvQXJyYXkobmV3IElDb250ZW50UHJvcG9zYWxbbGlzdAotCQkJCS5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9EZWNvcmF0ZWRGaWVsZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZmllbGRhc3Npc3QvRGVjb3JhdGVkRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiMzkyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9EZWNvcmF0ZWRGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIERlY29yYXRlZEZpZWxkIG1hbmFnZXMgaW1hZ2UgZGVjb3JhdGlvbnMgYXJvdW5kIGEgY29udHJvbC4gSXQgYWxsb3dzIGNsaWVudHMKLSAqIHRvIHNwZWNpZnkgYW4gaW1hZ2UgZGVjb3JhdGlvbiBhbmQgYSBwb3NpdGlvbiBmb3IgdGhlIGRlY29yYXRpb24gcmVsYXRpdmUgdG8KLSAqIHRoZSBmaWVsZC4gRGVjb3JhdGlvbnMgbWF5IGJlIGFzc2lnbmVkIGRlc2NyaXB0aW9ucywgd2hpY2ggYXJlIHNob3duIHdoZW4gdGhlCi0gKiB1c2VyIGhvdmVycyBvdmVyIHRoZSBkZWNvcmF0aW9uLiBDbGllbnRzIGNhbiBkZWNvcmF0ZSBhbnkga2luZCBvZiBjb250cm9sIGJ5Ci0gKiBzdXBwbHlpbmcgYSB7QGxpbmsgSUNvbnRyb2xDcmVhdG9yfSB0byBjcmVhdGUgdGhlIGNvbnRyb2wgdGhhdCBpcyBkZWNvcmF0ZWQuCi0gKiAKLSAqIDxwPgotICogVGhpcyBBUEkgaXMgY29uc2lkZXJlZCBleHBlcmltZW50YWwuIEl0IGlzIHN0aWxsIGV2b2x2aW5nIGR1cmluZyAzLjIgYW5kIGlzCi0gKiBzdWJqZWN0IHRvIGNoYW5nZS4gSXQgaXMgYmVpbmcgcmVsZWFzZWQgdG8gb2J0YWluIGZlZWRiYWNrIGZyb20gZWFybHkKLSAqIGFkb3B0ZXJzLgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNvcmF0ZWRGaWVsZCB7Ci0KLQkvKioKLQkgKiBOdW1iZXIgb2YgcGl4ZWxzIHRvIHJlc2VydmUgZm9yIGRlY29yYXRpb25zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBSRVNFUlZFRF9XSURUSCA9IDg7Ci0KLQkvKioKLQkgKiBDYWNoZWQgcGxhdGZvcm0gZmxhZ3MgZm9yIGRlYWxpbmcgd2l0aCBwbGF0Zm9ybS1zcGVjaWZpYyBpc3N1ZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBDQVJCT04gPSAiY2FyYm9uIi5lcXVhbHMoU1dULmdldFBsYXRmb3JtKCkpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdGFudHMgZGVzY3JpYmluZyB0aGUgYXJyYXkgaW5kaWNlcyB1c2VkIHRvIGhvbGQgdGhlIGRlY29yYXRpb25zIGluCi0JICogYXJyYXkgc2xvdHMuCi0JICovCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9UT1AgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExFRlRfQk9UVE9NID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSSUdIVF9UT1AgPSAyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJJR0hUX0JPVFRPTSA9IDM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVDT1JBVElPTl9TTE9UUyA9IDQ7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHdpZHRoIChpbiBwaXhlbHMpIHRoYXQgc2hvdWxkIGFsd2F5cyBiZSByZXNlcnZlZCBmb3IgZmllbGQKLQkgKiBkZWNvcmF0aW9ucywgcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsIHdpZHRoIG9mIGFueSBzdXBwbGllZCBkZWNvcmF0aW9ucy4KLQkgKiBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgdGhlIG1pbmltdW0gd2lkdGggZm9yIGFueSBkZWNvcmF0aW9ucyB0aGF0IGhhdmUKLQkgKiBiZWVuIGFkZGVkIHRvIHRoZSBmaWVsZCwgYW5kIGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gY29tcHV0ZSBtYXJnaW5zIGluCi0JICogb3JkZXIgdG8gYWxpZ24gbm9uLWRlY29yYXRlZCBmaWVsZHMgd2l0aCBkZWNvcmF0ZWQgZmllbGRzLgotCSAqIAotCSAqIEByZXR1cm4gZGVjb3JhdGlvbldpZHRoIHRoZSB3aWR0aCBpbiBwaXhlbHMgcmVzZXJ2ZWQgZm9yIGRlY29yYXRpb25zCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0UmVzZXJ2ZWREZWNvcmF0aW9uV2lkdGgoKSB7Ci0JCXJldHVybiBSRVNFUlZFRF9XSURUSDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHdpZHRoIChpbiBwaXhlbHMpIHRoYXQgc2hvdWxkIGFsd2F5cyBiZSByZXNlcnZlZCBmb3IgZmllbGQKLQkgKiBkZWNvcmF0aW9ucywgcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsIHdpZHRoIG9mIGFueSBzdXBwbGllZCBkZWNvcmF0aW9ucy4KLQkgKiBGaWVsZCBhbGlnbm1lbnQgd2l0aGluIGRpYWxvZ3Mgd2lsbCBsb29rIGJlc3Qgd2hlbiBhbGwgZGVjb3JhdGlvbnMKLQkgKiBzdXBwbGllZCBjb25mb3JtIHRvIHRoZSByZXNlcnZlZCB3aWR0aC4gSG93ZXZlciwgdGhlIGZpZWxkIGRlY29yYXRpb24KLQkgKiBhcmVhIGZvciBhIHBhcnRpY3VsYXIgZmllbGQgd2lsbCBiZSBleHBhbmRlZCBpZiBkZWNvcmF0aW9ucyBsYXJnZXIgdGhhbgotCSAqIHRoZSByZXNlcnZlZCB3aWR0aCBhcmUgc3VwcGxpZWQuCi0JICogCi0JICogQHBhcmFtIGRlY29yYXRpb25XaWR0aAotCSAqICAgICAgICAgICAgdGhlIHdpZHRoIGluIHBpeGVscyByZXNlcnZlZCBmb3IgZGVjb3JhdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVzZXJ2ZWREZWNvcmF0aW9uV2lkdGgoaW50IGRlY29yYXRpb25XaWR0aCkgewotCQlSRVNFUlZFRF9XSURUSCA9IGRlY29yYXRpb25XaWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgZGF0YSBzdHJ1Y3R1cmUgY2xhc3MgZm9yIHNwZWNpZnlpbmcgdGhlIGludGVybmFscyBmb3IgYSBmaWVsZAotCSAqIGRlY29yYXRpb24uIFRoaXMgY2xhc3MgY29udGFpbnMgZGF0YSBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YKLQkgKiBmaWVsZCBkZWNvcmF0aW9ucyBhcyBsYWJlbHMgYXR0YWNoZWQgdG8gdGhlIGZpZWxkLiBDbGllbnRzIHNob3VsZCB1c2UKLQkgKiA8Y29kZT5GaWVsZERlY29yYXRpb248L2NvZGU+IGZvciBzcGVjaWZ5aW5nIGEgZGVjb3JhdGlvbi4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEZpZWxkRGVjb3JhdGlvbkRhdGEgewotCi0JCS8qIFBhY2thZ2UgKi9GaWVsZERlY29yYXRpb24gZGVjb3JhdGlvbjsKLQotCQkvKiBQYWNrYWdlICovTGFiZWwgbGFiZWw7Ci0KLQkJLyogUGFja2FnZSAqL0Zvcm1EYXRhIGRhdGE7Ci0KLQkJLyogUGFja2FnZSAqL2Jvb2xlYW4gc2hvd09uRm9jdXM7Ci0KLQkJLyogUGFja2FnZSAqL2Jvb2xlYW4gdmlzaWJsZSA9IHRydWU7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhIGRlY29yYXRpb24gZGF0YSByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZCBkZWNvcmF0aW9uLCB1c2luZwotCQkgKiB0aGUgc3BlY2lmaWVkIGxhYmVsIGFuZCBmb3JtIGRhdGEgZm9yIGl0cyByZXByZXNlbnRhdGlvbi4KLQkJICogCi0JCSAqIEBwYXJhbSBkZWNvcmF0aW9uCi0JCSAqICAgICAgICAgICAgdGhlIGRlY29yYXRpb24gd2hvc2UgZGF0YSBpcyBrZXB0LgotCQkgKiBAcGFyYW0gbGFiZWwKLQkJICogICAgICAgICAgICB0aGUgbGFiZWwgdXNlZCB0byByZXByZXNlbnQgdGhlIGRlY29yYXRpb24uCi0JCSAqIEBwYXJhbSBmb3JtRGF0YQotCQkgKiAgICAgICAgICAgIHRoZSBmb3JtIGRhdGEgdXNlZCB0byBhdHRhY2ggdGhlIGRlY29yYXRpb24gdG8gaXRzIGZpZWxkLgotCQkgKiBAcGFyYW0gc2hvd09uRm9jdXMKLQkJICogICAgICAgICAgICBhIGJvb2xlYW4gc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBkZWNvcmF0aW9uIHNob3VsZCBvbmx5IGJlCi0JCSAqICAgICAgICAgICAgc2hvd24gd2hlbiB0aGUgZmllbGQgaGFzIGZvY3VzLgotCQkgKi8KLQkJRmllbGREZWNvcmF0aW9uRGF0YShGaWVsZERlY29yYXRpb24gZGVjb3JhdGlvbiwgTGFiZWwgbGFiZWwsCi0JCQkJRm9ybURhdGEgZm9ybURhdGEsIGJvb2xlYW4gc2hvd09uRm9jdXMpIHsKLQkJCXRoaXMuZGVjb3JhdGlvbiA9IGRlY29yYXRpb247Ci0JCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCQl0aGlzLmRhdGEgPSBmb3JtRGF0YTsKLQkJCXRoaXMuc2hvd09uRm9jdXMgPSBzaG93T25Gb2N1czsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlY29yYXRpb25zIGtleWVkIGJ5IHBvc2l0aW9uLgotCSAqLwotCXByaXZhdGUgRmllbGREZWNvcmF0aW9uRGF0YVtdIGRlY0RhdGFzID0gbmV3IEZpZWxkRGVjb3JhdGlvbkRhdGFbREVDT1JBVElPTl9TTE9UU107Ci0KLQkvKioKLQkgKiBUaGUgYXNzb2NpYXRlZCBjb250cm9sCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIGNvbnRyb2w7Ci0KLQkvKioKLQkgKiBUaGUgY29tcG9zaXRlIHdpdGggZm9ybSBsYXlvdXQgdXNlZCB0byBtYW5hZ2UgZGVjb3JhdGlvbnMuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgZm9ybTsKLQotCS8qKgotCSAqIFRoZSBob3ZlciB1c2VkIGZvciBzaG93aW5nIGRlc2NyaXB0aW9uIHRleHQKLQkgKi8KLQlwcml2YXRlIEhvdmVyIGhvdmVyOwotCi0JLyoqCi0JICogVGhlIGhvdmVyIHVzZWQgdG8gc2hvdyBhIGRlY29yYXRpb24gaW1hZ2UncyBkZXNjcmlwdGlvbi4KLQkgKi8KLQljbGFzcyBIb3ZlciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJLyoqCi0JCSAqIE9mZnNldCBvZiBpbmZvIGhvdmVyIGFycm93IGZyb20gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZS4KLQkJICovCi0JCXByaXZhdGUgaW50IGhhbyA9IDEwOwotCi0JCS8qKgotCQkgKiBXaWR0aCBvZiBpbmZvIGhvdmVyIGFycm93LgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgaGF3ID0gODsKLQotCQkvKioKLQkJICogSGVpZ2h0IG9mIGluZm8gaG92ZXIgYXJyb3cuCi0JCSAqLwotCQlwcml2YXRlIGludCBoYWggPSAxMDsKLQotCQkvKioKLQkJICogTWFyZ2luIGFyb3VuZCBpbmZvIGhvdmVyIHRleHQuCi0JCSAqLwotCQlwcml2YXRlIGludCBobSA9IDI7Ci0KLQkJLyoqCi0JCSAqIFRoaXMgaW5mbyBob3ZlcidzIHNoZWxsLgotCQkgKi8KLQkJU2hlbGwgaG92ZXJTaGVsbDsKLQotCQkvKioKLQkJICogVGhlIGluZm8gaG92ZXIgdGV4dC4KLQkJICovCi0JCVN0cmluZyB0ZXh0ID0gRU1QVFk7Ci0KLQkJLyoqCi0JCSAqIFRoZSByZWdpb24gdXNlZCB0byBtYW5hZ2UgdGhlIHNoZWxsIHNoYXBlCi0JCSAqLwotCQlSZWdpb24gcmVnaW9uOwotCi0JCS8qKgotCQkgKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbGFzdCBjb21wdXRlZCBwb2x5Z29uIGxvY2F0aW9uIGhhZCBhbgotCQkgKiBhcnJvdyBvbiBsZWZ0LiAodHJ1ZSBpZiBsZWZ0LCBmYWxzZSBpZiByaWdodCkuCi0JCSAqLwotCQlib29sZWFuIGFycm93T25MZWZ0ID0gdHJ1ZTsKLQotCQkvKgotCQkgKiBDcmVhdGUgYSBob3ZlciBwYXJlbnRlZCBieSB0aGUgc3BlY2lmaWVkIHNoZWxsLgotCQkgKi8KLQkJSG92ZXIoU2hlbGwgcGFyZW50KSB7Ci0JCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQkJaG92ZXJTaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5OT19UUklNIHwgU1dULk9OX1RPUAotCQkJCQl8IFNXVC5OT19GT0NVUyk7Ci0JCQlob3ZlclNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheQotCQkJCQkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJaG92ZXJTaGVsbC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkKLQkJCQkJLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKLQkJCWhvdmVyU2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBwZSkgewotCQkJCQlwZS5nYy5kcmF3U3RyaW5nKHRleHQsIGhtLCBobSk7Ci0JCQkJCWlmICghQ0FSQk9OKQotCQkJCQkJcGUuZ2MuZHJhd1BvbHlnb24oZ2V0UG9seWdvbih0cnVlKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlob3ZlclNoZWxsLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJCWhpZGVIb3ZlcigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJLyoKLQkJICogQ29tcHV0ZSBhIHBvbHlnb24gdGhhdCByZXByZXNlbnRzIGEgaG92ZXIgd2l0aCBhbiBhcnJvdyBwb2ludGVyLiBJZgotCQkgKiBib3JkZXIgaXMgdHJ1ZSwgY29tcHV0ZSB0aGUgcG9seWdvbiBpbnNldCBieSAxLXBpeGVsIGJvcmRlci4gQ29uc3VsdAotCQkgKiB0aGUgYXJyb3dPbkxlZnQgZmxhZyB0byBkZXRlcm1pbmUgd2hpY2ggc2lkZSB0aGUgYXJyb3cgaXMgb24uCi0JCSAqLwotCQlpbnRbXSBnZXRQb2x5Z29uKGJvb2xlYW4gYm9yZGVyKSB7Ci0JCQlQb2ludCBlID0gZ2V0RXh0ZW50KCk7Ci0JCQlpbnQgYiA9IGJvcmRlciA/IDEgOiAwOwotCQkJaWYgKGFycm93T25MZWZ0KQotCQkJCXJldHVybiBuZXcgaW50W10geyAwLCAwLCBlLnggLSBiLCAwLCBlLnggLSBiLCBlLnkgLSBiLAotCQkJCQkJaGFvICsgaGF3LCBlLnkgLSBiLCBoYW8gKyBoYXcgLyAyLCBlLnkgKyBoYWggLSBiLCBoYW8sCi0JCQkJCQllLnkgLSBiLCAwLCBlLnkgLSBiLCAwLCAwIH07Ci0JCQlyZXR1cm4gbmV3IGludFtdIHsgMCwgMCwgZS54IC0gYiwgMCwgZS54IC0gYiwgZS55IC0gYiwKLQkJCQkJZS54IC0gaGFvIC0gYiwgZS55IC0gYiwgZS54IC0gaGFvIC0gaGF3IC8gMiwgZS55ICsgaGFoIC0gYiwKLQkJCQkJZS54IC0gaGFvIC0gaGF3LCBlLnkgLSBiLCAwLCBlLnkgLSBiLCAwLCAwIH07Ci0JCX0KLQotCQkvKgotCQkgKiBEaXNwb3NlIHRoZSBob3ZlciwgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gRGlzcG9zZSBhbnkgcmVzb3VyY2VzCi0JCSAqIGFsbG9jYXRlZCBieSB0aGUgaG92ZXIuCi0JCSAqLwotCQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAoIWhvdmVyU2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJCWhvdmVyU2hlbGwuZGlzcG9zZSgpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFNldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaG92ZXIuCi0JCSAqLwotCQl2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCQlpZiAodmlzaWJsZSkgewotCQkJCWlmICghaG92ZXJTaGVsbC5pc1Zpc2libGUoKSkKLQkJCQkJaG92ZXJTaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaG92ZXJTaGVsbC5pc1Zpc2libGUoKSkKLQkJCQkJaG92ZXJTaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFNldCB0aGUgdGV4dCBvZiB0aGUgaG92ZXIgdG8gdGhlIHNwZWNpZmllZCB0ZXh0LiBSZWNvbXB1dGUgdGhlIHNpemUKLQkJICogYW5kIGxvY2F0aW9uIG9mIHRoZSBob3ZlciB0byBob3ZlciBuZWFyIHRoZSBzcGVjaWZpZWQgY29udHJvbCwKLQkJICogcG9pbnRpbmcgdGhlIGFycm93IHRvd2FyZCB0aGUgdGFyZ2V0IGNvbnRyb2wuCi0JCSAqLwotCQl2b2lkIHNldFRleHQoU3RyaW5nIHQsIENvbnRyb2wgaG92ZXJOZWFyLCBDb250cm9sIHRhcmdldENvbnRyb2wpIHsKLQkJCWlmICh0ID09IG51bGwpCi0JCQkJdCA9IEVNUFRZOwotCQkJaWYgKCF0LmVxdWFscyh0ZXh0KSkgewotCQkJCVBvaW50IG9sZFNpemUgPSBnZXRFeHRlbnQoKTsKLQkJCQl0ZXh0ID0gdDsKLQkJCQlob3ZlclNoZWxsLnJlZHJhdygpOwotCQkJCVBvaW50IG5ld1NpemUgPSBnZXRFeHRlbnQoKTsKLQkJCQlpZiAoIW9sZFNpemUuZXF1YWxzKG5ld1NpemUpKSB7Ci0JCQkJCS8vIHNldCBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbiBvZiBhcnJvdwotCQkJCQlhcnJvd09uTGVmdCA9IGhvdmVyTmVhci5nZXRMb2NhdGlvbigpLnggPD0gdGFyZ2V0Q29udHJvbAotCQkJCQkJCS5nZXRMb2NhdGlvbigpLng7Ci0JCQkJCXNldE5ld1NoYXBlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaG92ZXJOZWFyICE9IG51bGwpIHsKLQkJCQlQb2ludCBleHRlbnQgPSBnZXRFeHRlbnQoKTsKLQkJCQlpbnQgeSA9IC1leHRlbnQueSAtIGhhaCArIDE7Ci0JCQkJaW50IHggPSBhcnJvd09uTGVmdCA/IC1oYW8gKyBoYXcgLyAyIDogLWV4dGVudC54ICsgaGFvICsgaGF3Ci0JCQkJCQkvIDI7Ci0KLQkJCQlob3ZlclNoZWxsLnNldExvY2F0aW9uKGhvdmVyTmVhci50b0Rpc3BsYXkoeCwgeSkpOwotCQkJfQotCi0JCX0KLQotCQkvKgotCQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIGhvdmVyIChzaGVsbCkgaXMgdmlzaWJsZS4KLQkJICovCi0JCWJvb2xlYW4gaXNWaXNpYmxlKCkgewotCQkJcmV0dXJuIGhvdmVyU2hlbGwuaXNWaXNpYmxlKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBDb21wdXRlIHRoZSBleHRlbnQgb2YgdGhlIGhvdmVyIGZvciB0aGUgY3VycmVudCB0ZXh0LgotCQkgKi8KLQkJUG9pbnQgZ2V0RXh0ZW50KCkgewotCQkJR0MgZ2MgPSBuZXcgR0MoaG92ZXJTaGVsbCk7Ci0JCQlQb2ludCBlID0gZ2MudGV4dEV4dGVudCh0ZXh0KTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCWUueCArPSBobSAqIDI7Ci0JCQllLnkgKz0gaG0gKiAyOwotCQkJcmV0dXJuIGU7Ci0JCX0KLQotCQkvKgotCQkgKiBDb21wdXRlIGEgbmV3IHNoYXBlIGZvciB0aGUgaG92ZXIgc2hlbGwuCi0JCSAqLwotCQl2b2lkIHNldE5ld1NoYXBlKCkgewotCQkJUmVnaW9uIG9sZFJlZ2lvbiA9IHJlZ2lvbjsKLQkJCXJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQkJCXJlZ2lvbi5hZGQoZ2V0UG9seWdvbihmYWxzZSkpOwotCQkJaG92ZXJTaGVsbC5zZXRSZWdpb24ocmVnaW9uKTsKLQkJCWlmIChvbGRSZWdpb24gIT0gbnVsbCkgewotCQkJCW9sZFJlZ2lvbi5kaXNwb3NlKCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGRlY29yYXRlZCBmaWVsZCB3aGljaCBpcyBwYXJlbnRlZCBieSB0aGUgc3BlY2lmaWVkIGNvbXBvc2l0ZQotCSAqIGFuZCBoYXMgdGhlIGdpdmVuIHN0eWxlIGJpdHMuIFVzZSB0aGUgY29udHJvbENyZWF0b3IgdG8gY3JlYXRlIHRoZQotCSAqIHNwZWNpZmljIGtpbmQgb2YgY29udHJvbCB0aGF0IGlzIGRlY29yYXRlZCBpbnNpZGUgdGhlIGZpZWxkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2YgdGhlIGRlY29yYXRlZCBmaWVsZC4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIHN0eWxlIGJpdHMgZm9yIHRoZSBmaWVsZC4KLQkgKiBAcGFyYW0gY29udHJvbENyZWF0b3IKLQkgKiAgICAgICAgICAgIHRoZSBJQ29udHJvbENyZWF0b3IgdXNlZCB0byBzcGVjaWZ5IHRoZSBzcGVjaWZpYyBraW5kIG9mCi0JICogICAgICAgICAgICBjb250cm9sIHRoYXQgaXMgdG8gYmUgZGVjb3JhdGVkLgotCSAqIAotCSAqIEBzZWUgSUNvbnRyb2xDcmVhdG9yCi0JICovCi0JcHVibGljIERlY29yYXRlZEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwKLQkJCUlDb250cm9sQ3JlYXRvciBjb250cm9sQ3JlYXRvcikgewotCQl0aGlzLmZvcm0gPSBjcmVhdGVGb3JtKHBhcmVudCk7Ci0JCXRoaXMuY29udHJvbCA9IGNvbnRyb2xDcmVhdG9yLmNyZWF0ZUNvbnRyb2woZm9ybSwgc3R5bGUpOwotCi0JCWFkZENvbnRyb2xMaXN0ZW5lcnMoKTsKLQkJLy8gQWRkIGEgZHVtbXkgZGVjb3JhdGlvbiBvbiBlYWNoIHNpZGUgdG8gcmVzZXJ2ZSB0aGUgd2lkdGggbmVlZGVkLgotCQlhZGRGaWVsZERlY29yYXRpb24obmV3IEZpZWxkRGVjb3JhdGlvbihudWxsLCBudWxsKSwgU1dULkxFRlQgfCBTV1QuVE9QLAotCQkJCXRydWUpOwotCQlhZGRGaWVsZERlY29yYXRpb24obmV3IEZpZWxkRGVjb3JhdGlvbihudWxsLCBudWxsKSwKLQkJCQlTV1QuUklHSFQgfCBTV1QuVE9QLCB0cnVlKTsKLQkJZm9ybS5zZXRUYWJMaXN0KG5ldyBDb250cm9sW10geyBjb250cm9sIH0pOwotCi0JCS8vIFNldCB1cCB0aGUgcHJlZmVycmVkIHdpZHRoIG9mIHRoZSBjb250cm9sIGFuZCBhdHRhY2htZW50cyB0byB0aGUKLQkJLy8gZGVjb3JhdGlvbnMuCi0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7Ci0JCWdjLnNldEZvbnQoY29udHJvbC5nZXRGb250KCkpOwotCQlGb250TWV0cmljcyBmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJZGF0YS53aWR0aCA9IERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIKQotCQkJCSsgMiAqIFJFU0VSVkVEX1dJRFRIOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZGVjRGF0YXNbTEVGVF9UT1BdLmxhYmVsKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChkZWNEYXRhc1tSSUdIVF9UT1BdLmxhYmVsKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCX0KLQotCS8qKgotCSAqIEFkZHMgYW4gaW1hZ2UgZGVjb3JhdGlvbiB0byB0aGUgZmllbGQuCi0JICogCi0JICogQHBhcmFtIGRlY29yYXRpb24KLQkgKiAgICAgICAgICAgIEEgRmllbGREZWNvcmF0aW9uIGRlc2NyaWJpbmcgdGhlIGltYWdlIGFuZCBkZXNjcmlwdGlvbiBmb3IgdGhlCi0JICogICAgICAgICAgICBkZWNvcmF0aW9uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICBUaGUgU1dUIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZWNvcmF0aW9uCi0JICogICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgZmllbGQncyBjb250cm9sLiBUaGUgcG9zaXRpb24gc2hvdWxkIGluY2x1ZGUKLQkgKiAgICAgICAgICAgIHN0eWxlIGJpdHMgZGVzY3JpYmluZyBib3RoIHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbAotCSAqICAgICAgICAgICAgb3JpZW50YXRpb24uIDxjb2RlPlNXVC5MRUZUPC9jb2RlPiBhbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPlNXVC5SSUdIVDwvY29kZT4gZGVzY3JpYmUgdGhlIGhvcml6b250YWwgcGxhY2VtZW50IG9mCi0JICogICAgICAgICAgICB0aGUgZGVjb3JhdGlvbiByZWxhdGl2ZSB0byB0aGUgZmllbGQsIGFuZCB0aGUgY29uc3RhbnRzCi0JICogICAgICAgICAgICA8Y29kZT5TV1QuVE9QPC9jb2RlPiBhbmQgPGNvZGU+U1dULkJPVFRPTTwvY29kZT4gZGVzY3JpYmUKLQkgKiAgICAgICAgICAgIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgdGhlIGRlY29yYXRpb24gcmVsYXRpdmUgdG8gdGhlCi0JICogICAgICAgICAgICBmaWVsZC4gRGVjb3JhdGlvbnMgYWx3YXlzIGFwcGVhciBvbiBlaXRoZXIgaG9yaXpvbnRhbCBzaWRlIG9mCi0JICogICAgICAgICAgICB0aGUgZmllbGQsIG5ldmVyIGFib3ZlIG9yIGJlbG93IGl0LiBGb3IgZXhhbXBsZSwgYSBkZWNvcmF0aW9uCi0JICogICAgICAgICAgICBhcHBlYXJpbmcgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZmllbGQsIGF0IHRoZSB0b3AsIGlzCi0JICogICAgICAgICAgICBzcGVjaWZpZWQgYXMgU1dULkxFRlQgfCBTV1QuVE9QLiBJZiBhbiBpbWFnZSBkZWNvcmF0aW9uCi0JICogICAgICAgICAgICBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLCBpdCB3aWxsIGJlIHJlcGxhY2VkCi0JICogICAgICAgICAgICBieSB0aGUgb25lIHNwZWNpZmllZC4KLQkgKiBAcGFyYW0gc2hvd09uRm9jdXMKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZWNvcmF0aW9uIHNob3VsZCBvbmx5IGJlIHNob3duCi0JICogICAgICAgICAgICB3aGVuIHRoZSBhc3NvY2lhdGVkIGNvbnRyb2wgaGFzIGZvY3VzLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYKLQkgKiAgICAgICAgICAgIGl0IHNob3VsZCBhbHdheXMgYmUgc2hvd24uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkRmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvbiBkZWNvcmF0aW9uLCBpbnQgcG9zaXRpb24sCi0JCQlib29sZWFuIHNob3dPbkZvY3VzKSB7Ci0JCWZpbmFsIExhYmVsIGxhYmVsOwotCQlGb3JtRGF0YSBmb3JtRGF0YTsKLQkJaW50IGkgPSBpbmRleEZvclBvc2l0aW9uKHBvc2l0aW9uKTsKLQkJaWYgKGRlY0RhdGFzW2ldID09IG51bGwpIHsKLQkJCWZvcm1EYXRhID0gY3JlYXRlRm9ybURhdGFGb3JJbmRleChpKTsKLQkJCWxhYmVsID0gbmV3IExhYmVsKGZvcm0sIFNXVC5IT1JJWk9OVEFMIHwgU1dULlZFUlRJQ0FMIHwgU1dULkNFTlRFUik7Ci0JCQlsYWJlbC5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE1vdXNlVHJhY2tMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJRmllbGREZWNvcmF0aW9uRGF0YSBkZWNEYXRhID0gKEZpZWxkRGVjb3JhdGlvbkRhdGEpIGV2ZW50LndpZGdldAotCQkJCQkJCS5nZXREYXRhKCk7Ci0JCQkJCVN0cmluZyBkZXNjID0gZGVjRGF0YS5kZWNvcmF0aW9uLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJCXNob3dIb3ZlclRleHQoZGVzYywgbGFiZWwpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJaGlkZUhvdmVyKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlkZWNEYXRhc1tpXSA9IG5ldyBGaWVsZERlY29yYXRpb25EYXRhKGRlY29yYXRpb24sIGxhYmVsLCBmb3JtRGF0YSwKLQkJCQkJc2hvd09uRm9jdXMpOwotCQl9IGVsc2UgewotCQkJbGFiZWwgPSBkZWNEYXRhc1tpXS5sYWJlbDsKLQkJCWZvcm1EYXRhID0gZGVjRGF0YXNbaV0uZGF0YTsKLQkJCWRlY0RhdGFzW2ldLmRlY29yYXRpb24gPSBkZWNvcmF0aW9uOwotCQkJZGVjRGF0YXNbaV0uc2hvd09uRm9jdXMgPSBzaG93T25Gb2N1czsKLQkJfQotCQkvKgotCQkgKiBMYXlvdXQgZGF0YSByZXNlcnZlZCB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZCBvbiB3aGV0aGVyCi0JCSAqIHRoZXJlIGlzIGFuIGltYWdlIG9yIHRoaXMgaXMgYSBibGFuayBkZWNvcmF0aW9uLiAgQWx3YXlzCi0JCSAqIHNldCBib3RoIHZhbHVlcyBzaW5jZSB3ZSBtYXkgYmUgcmV1c2luZyBhIGZvcm0gZGF0YS4KLQkJICovCi0JCWlmIChkZWNvcmF0aW9uLmdldEltYWdlKCkgPT0gbnVsbCkgewotCQkJZm9ybURhdGEud2lkdGggPSBSRVNFUlZFRF9XSURUSDsKLQkJCWZvcm1EYXRhLmhlaWdodCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlmb3JtRGF0YS53aWR0aCA9IFNXVC5ERUZBVUxUOwotCQkJZm9ybURhdGEuaGVpZ2h0ID0gU1dULkRFRkFVTFQ7Ci0JCX0KLQkJbGFiZWwuc2V0SW1hZ2UoZGVjRGF0YXNbaV0uZGVjb3JhdGlvbi5nZXRJbWFnZSgpKTsKLQkJbGFiZWwuc2V0RGF0YShkZWNEYXRhc1tpXSk7Ci0JCWxhYmVsLnNldFZpc2libGUoIXNob3dPbkZvY3VzKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShmb3JtRGF0YSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjb250cm9sIHRoYXQgaXMgZGVjb3JhdGVkIGJ5IHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBDb250cm9sIGRlY29yYXRlZCBieSB0aGUgcmVjZWl2ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICBub25lIGhhcyBiZWVuIGNyZWF0ZWQgeWV0LgotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY29udHJvbCB0aGF0IHJlcHJlc2VudHMgdGhlIGRlY29yYXRlZCBmaWVsZC4gVGhpcyBjb21wb3NpdGUKLQkgKiBzaG91bGQgYmUgdXNlZCB0byBsYXkgb3V0IHRoZSBmaWVsZCB3aXRoaW4gaXRzIHBhcmVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBDb250cm9sIHRoYXQgc2hvdWxkIGJlIGxheWVkIG91dCBpbiB0aGUgZmllbGQncyBwYXJlbnQncwotCSAqICAgICAgICAgbGF5b3V0LiBUaGlzIGlzIHR5cGljYWxseSBub3QgdGhlIGNvbnRyb2wgaXRzZWxmLCBzaW5jZQotCSAqICAgICAgICAgYWRkaXRpb25hbCBjb250cm9scyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlIGRlY29yYXRpb25zLgotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldExheW91dENvbnRyb2woKSB7Ci0JCXJldHVybiBmb3JtOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgcGFyZW50IGNvbXBvc2l0ZSBhbmQgYSBmb3JtIGxheW91dCB0aGF0IHdpbGwgYmUgdXNlZCB0byBtYW5hZ2UKLQkgKiBkZWNvcmF0aW9ucy4KLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVGb3JtKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9fRk9DVVMpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbnkgbGlzdGVuZXJzIG5lZWRlZCBvbiB0aGUgdGFyZ2V0IGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENvbnRyb2xMaXN0ZW5lcnMoKSB7Ci0JCWNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaG92ZXIgIT0gbnVsbCkKLQkJCQkJaG92ZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJY29udHJvbC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBldmVudCkgewotCQkJCWNvbnRyb2xGb2N1c0dhaW5lZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBldmVudCkgewotCQkJCWNvbnRyb2xGb2N1c0xvc3QoKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgaW5kZXggaW4gdGhlIGFycmF5IG9mIGRlY29yYXRpb24gZGF0YXMgdGhhdCByZXByZXNlbnRzIHRoZQotCSAqIHNwZWNpZmllZCBTV1QgcG9zaXRpb24uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uIFRoZSBTV1QgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgcG9zaXRpb24gb2YgdGhlCi0JICogZGVjb3JhdGlvbiByZWxhdGl2ZSB0byB0aGUgZmllbGQncyBjb250cm9sLiBUaGUgcG9zaXRpb24gc2hvdWxkIGluY2x1ZGUKLQkgKiBzdHlsZSBiaXRzIGRlc2NyaWJpbmcgYm90aCB0aGUgdmVydGljYWwgYW5kIGhvcml6b250YWwgb3JpZW50YXRpb24uCi0JICogPGNvZGU+U1dULkxFRlQ8L2NvZGU+IGFuZCA8Y29kZT5TV1QuUklHSFQ8L2NvZGU+IGRlc2NyaWJlIHRoZQotCSAqIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRoZSBkZWNvcmF0aW9uIHJlbGF0aXZlIHRvIHRoZSBmaWVsZCwgYW5kIHRoZQotCSAqIGNvbnN0YW50cyA8Y29kZT5TV1QuVE9QPC9jb2RlPiBhbmQgPGNvZGU+U1dULkJPVFRPTTwvY29kZT4gZGVzY3JpYmUKLQkgKiB0aGUgdmVydGljYWwgYWxpZ25tZW50IG9mIHRoZSBkZWNvcmF0aW9uIHJlbGF0aXZlIHRvIHRoZSBmaWVsZC4KLQkgKiBEZWNvcmF0aW9ucyBhbHdheXMgYXBwZWFyIG9uIGVpdGhlciBob3Jpem9udGFsIHNpZGUgb2YgdGhlIGZpZWxkLCBuZXZlcgotCSAqIGFib3ZlIG9yIGJlbG93IGl0LiBGb3IgZXhhbXBsZSwgYSBkZWNvcmF0aW9uIGFwcGVhcmluZyBvbiB0aGUgbGVmdCBzaWRlCi0JICogb2YgdGhlIGZpZWxkLCBhdCB0aGUgdG9wLCBpcyBzcGVjaWZpZWQgYXMgU1dULkxFRlQgfCBTV1QuVE9QLiBJZiBhbiBpbWFnZQotCSAqIGRlY29yYXRpb24gYWxyZWFkeSBleGlzdHMgaW4gdGhlIHNwZWNpZmllZCBwb3NpdGlvbiwgaXQgd2lsbCBiZSByZXBsYWNlZAotCSAqIGJ5IHRoZSBvbmUgc3BlY2lmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gaW5kZXggdGhlIGluZGV4IGluIHRoZSBhcnJheSBvZiBkZWNvcmF0aW9ucyB0aGF0IHJlcHJlc2VudHMgdGhlCi0JICogc3BlY2lmaWVkIFNXVCBwb3NpdGlvbi4gSWYgdGhlIHBvc2l0aW9uIGlzIG5vdCBhbiBleHBlY3RlZCBwb3NpdGlvbiwgdGhlCi0JICogaW5kZXggcmVwcmVzZW50aW5nIHRoZSB0b3AgbGVmdCBwb3NpdGlvbiB3aWxsIGJlIHJldHVybmVkLgotCSAqIAotCSAqLwotCWludCBpbmRleEZvclBvc2l0aW9uKGludCBwb3NpdGlvbikgewotCQlzd2l0Y2ggKHBvc2l0aW9uKSB7Ci0JCWNhc2UgU1dULkxFRlQgfCBTV1QuQk9UVE9NOgotCQkJcmV0dXJuIExFRlRfQk9UVE9NOwotCQljYXNlIFNXVC5SSUdIVCB8IFNXVC5UT1A6Ci0JCQlyZXR1cm4gUklHSFRfVE9QOwotCQljYXNlIFNXVC5SSUdIVCB8IFNXVC5CT1RUT006Ci0JCQlyZXR1cm4gUklHSFRfQk9UVE9NOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIExFRlRfVE9QOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgZm9ybSBkYXRhIHRoYXQgd2lsbCBwbGFjZSB0aGUgZGVjb3JhdGlvbiBhdCB0aGUgc3BlY2lmaWVkCi0JICogcG9zaXRpb24uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICBUaGUgU1dUIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZWNvcmF0aW9uCi0JICogICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgZmllbGQncyBjb250cm9sLiBUaGUgcG9zaXRpb24gc2hvdWxkIGluY2x1ZGUKLQkgKiAgICAgICAgICAgIHN0eWxlIGJpdHMgZGVzY3JpYmluZyBib3RoIHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbAotCSAqICAgICAgICAgICAgb3JpZW50YXRpb24uIDxjb2RlPlNXVC5MRUZUPC9jb2RlPiBhbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPlNXVC5SSUdIVDwvY29kZT4gZGVzY3JpYmUgdGhlIGhvcml6b250YWwgcGxhY2VtZW50IG9mCi0JICogICAgICAgICAgICB0aGUgZGVjb3JhdGlvbiByZWxhdGl2ZSB0byB0aGUgZmllbGQsIGFuZCB0aGUgY29uc3RhbnRzCi0JICogICAgICAgICAgICA8Y29kZT5TV1QuVE9QPC9jb2RlPiBhbmQgPGNvZGU+U1dULkJPVFRPTTwvY29kZT4gZGVzY3JpYmUKLQkgKiAgICAgICAgICAgIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgdGhlIGRlY29yYXRpb24gcmVsYXRpdmUgdG8gdGhlCi0JICogICAgICAgICAgICBmaWVsZC4gRGVjb3JhdGlvbnMgYWx3YXlzIGFwcGVhciBvbiBlaXRoZXIgaG9yaXpvbnRhbCBzaWRlIG9mCi0JICogICAgICAgICAgICB0aGUgZmllbGQsIG5ldmVyIGFib3ZlIG9yIGJlbG93IGl0LiBGb3IgZXhhbXBsZSwgYSBkZWNvcmF0aW9uCi0JICogICAgICAgICAgICBhcHBlYXJpbmcgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZmllbGQsIGF0IHRoZSB0b3AsIGlzCi0JICogICAgICAgICAgICBzcGVjaWZpZWQgYXMgU1dULkxFRlQgfCBTV1QuVE9QLiBJZiBhbiBpbWFnZSBkZWNvcmF0aW9uCi0JICogICAgICAgICAgICBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLCBpdCB3aWxsIGJlIHJlcGxhY2VkCi0JICogICAgICAgICAgICBieSB0aGUgb25lIHNwZWNpZmllZC4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIEZvcm1EYXRhIGNyZWF0ZUZvcm1EYXRhRm9ySW5kZXgoaW50IGluZGV4KSB7Ci0JCUFzc2VydC5pc1RydWUoaW5kZXggPj0gMCAmJiBpbmRleCA8IERFQ09SQVRJT05fU0xPVFMsCi0JCQkJIkluZGV4IG91dCBvZiByYW5nZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCWNhc2UgTEVGVF9UT1A6Ci0JCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCXJldHVybiBkYXRhOwotCQljYXNlIExFRlRfQk9UVE9NOgotCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJCXJldHVybiBkYXRhOwotCQljYXNlIFJJR0hUX1RPUDoKLQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJcmV0dXJuIGRhdGE7Ci0JCWNhc2UgUklHSFRfQk9UVE9NOgotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJCXJldHVybiBkYXRhOwotCQl9Ci0JCS8vIHNob3VsZCBuZXZlciBnZXQgaGVyZSwgbWFraW5nIGNvbXBpbGVyIGhhcHB5Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqIFNob3cgdGhlIHNwZWNpZmllZCB0ZXh0IHVzaW5nIHRoZSBzYW1lIGhvdmVyIGRpYWxvZyBhcyBpcyB1c2VkIHRvIHNob3cKLQkgKiBkZWNvcmF0b3IgZGVzY3JpcHRpb25zLiBOb3JtYWxseSwgYSBkZWNvcmF0aW9uJ3MgZGVzY3JpcHRpb24gdGV4dCB3aWxsIGJlCi0JICogc2hvd24gaW4gYW4gaW5mbyBob3ZlciBvdmVyIHRoZSBmaWVsZCdzIGNvbnRyb2wgd2hlbmV2ZXIgdGhlIG1vdXNlIGhvdmVycwotCSAqIG92ZXIgdGhlIGRlY29yYXRpb24uIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNob3cgYSBkZWNvcmF0aW9uJ3MKLQkgKiBkZXNjcmlwdGlvbiB0ZXh0IGF0IG90aGVyIHRpbWVzIChzdWNoIGFzIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMKLQkgKiBmb2N1cyksIG9yIHRvIHNob3cgb3RoZXIgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpZWxkLgotCSAqIAotCSAqIDxwPgotCSAqIElmIHRoZXJlIGlzIGN1cnJlbnRseSBhIGhvdmVyIHZpc2libGUsIHRoZSBob3ZlcidzIHRleHQgd2lsbCBiZSByZXBsYWNlZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB0byBiZSBzaG93biBpbiB0aGUgaW5mbyBob3Zlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIGlmIG5vIHRleHQgc2hvdWxkIGJlIHNob3duLgotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dIb3ZlclRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2hvd0hvdmVyVGV4dCh0ZXh0LCBjb250cm9sKTsKLQl9Ci0KLQkvKioKLQkgKiBIaWRlIGFueSBob3ZlciBwb3B1cHMgdGhhdCBhcmUgY3VycmVudGx5IHNob3dpbmcgb24gdGhlIGNvbnRyb2wuCi0JICogTm9ybWFsbHksIGEgZGVjb3JhdGlvbidzIGRlc2NyaXB0aW9uIHRleHQgd2lsbCBiZSBzaG93biBpbiBhbiBpbmZvIGhvdmVyCi0JICogb3ZlciB0aGUgZmllbGQncyBjb250cm9sIGFzIGxvbmcgYXMgdGhlIG1vdXNlIGhvdmVycyBvdmVyIHRoZSBkZWNvcmF0aW9uLAotCSAqIGFuZCB3aWxsIGJlIGhpZGRlbiB3aGVuIHRoZSBtb3VzZSBleGl0cyB0aGUgY29udHJvbC4gVGhpcyBtZXRob2QgY2FuIGJlCi0JICogdXNlZCB0byBoaWRlIGEgaG92ZXIgdGhhdCB3YXMgc2hvd24gdXNpbmcgPGNvZGU+c2hvd0hvdmVyVGV4dDwvY29kZT4sCi0JICogb3IgdG8gcHJvZ3JhbWF0aWNhbGx5IGhpZGUgdGhlIGN1cnJlbnQgZGVjb3JhdGlvbiBob3Zlci4KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGlzIG1lc3NhZ2UgaGFzIG5vIGVmZmVjdCBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGhvdmVyLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGhpZGVIb3ZlcigpIHsKLQkJaWYgKGhvdmVyICE9IG51bGwpIHsKLQkJCWhvdmVyLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgdGFyZ2V0IGNvbnRyb2wgZ2FpbmVkIGZvY3VzLiBBbnkgZGVjb3JhdGlvbnMgdGhhdCBzaG91bGQgc2hvdyBvbmx5Ci0JICogd2hlbiB0aGV5IGhhdmUgdGhlIGZvY3VzIHNob3VsZCBiZSBzaG93biBoZXJlLgotCSAqLwotCXByaXZhdGUgdm9pZCBjb250cm9sRm9jdXNHYWluZWQoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgREVDT1JBVElPTl9TTE9UUzsgaSsrKSB7Ci0JCQlpZiAoZGVjRGF0YXNbaV0gIT0gbnVsbCAmJiBkZWNEYXRhc1tpXS5zaG93T25Gb2N1cykKLQkJCQlzZXRWaXNpYmxlKGRlY0RhdGFzW2ldLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIHRhcmdldCBjb250cm9sIGxvc3QgZm9jdXMuIEFueSBkZWNvcmF0aW9ucyB0aGF0IHNob3VsZCBzaG93IG9ubHkgd2hlbgotCSAqIHRoZXkgaGF2ZSB0aGUgZm9jdXMgc2hvdWxkIGJlIGhpZGRlbiBoZXJlLgotCSAqLwotCXByaXZhdGUgdm9pZCBjb250cm9sRm9jdXNMb3N0KCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IERFQ09SQVRJT05fU0xPVFM7IGkrKykgewotCQkJaWYgKGRlY0RhdGFzW2ldICE9IG51bGwgJiYgZGVjRGF0YXNbaV0uc2hvd09uRm9jdXMpCi0JCQkJc2V0VmlzaWJsZShkZWNEYXRhc1tpXSwgZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2hvdyB0aGUgc3BlY2lmaWVkIGRlY29yYXRpb24uIFRoaXMgbWVzc2FnZSBoYXMgbm8gZWZmZWN0IGlmIHRoZQotCSAqIGRlY29yYXRpb24gaXMgYWxyZWFkeSBzaG93aW5nLCBvciB3YXMgbm90IGFscmVhZHkgYWRkZWQgdG8gdGhlIGZpZWxkCi0JICogdXNpbmcgPGNvZGU+YWRkRmllbGREZWNvcmF0aW9uPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjb3JhdGlvbgotCSAqICAgICAgICAgICAgdGhlIGRlY29yYXRpb24gdG8gYmUgc2hvd24uCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0RlY29yYXRpb24oRmllbGREZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLQkJRmllbGREZWNvcmF0aW9uRGF0YSBkYXRhID0gZ2V0RGVjb3JhdGlvbkRhdGEoZGVjb3JhdGlvbik7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIHJlY29yZCB0aGUgZmFjdCB0aGF0IGNsaWVudCB3b3VsZCBsaWtlIGl0IHRvIGJlIHZpc2libGUKLQkJZGF0YS52aXNpYmxlID0gdHJ1ZTsKLQkJLy8gZXZlbiBpZiBpdCBpcyBzdXBwb3NlZCB0byBiZSBzaG93biwgaWYgdGhlIGZpZWxkIGRvZXMgbm90IGhhdmUgZm9jdXMsCi0JCS8vIGRvIG5vdCBzaG93IGl0ICh5ZXQpCi0JCWlmICghZGF0YS5zaG93T25Gb2N1cyB8fCBjb250cm9sLmlzRm9jdXNDb250cm9sKCkpCi0JCQlzZXRWaXNpYmxlKGRhdGEsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEhpZGUgdGhlIHNwZWNpZmllZCBkZWNvcmF0aW9uLiBUaGlzIG1lc3NhZ2UgaGFzIG5vIGVmZmVjdCBpZiB0aGUKLQkgKiBkZWNvcmF0aW9uIGlzIGFscmVhZHkgaGlkZGVuLCBvciB3YXMgbm90IGFscmVhZHkgYWRkZWQgdG8gdGhlIGZpZWxkIHVzaW5nCi0JICogPGNvZGU+YWRkRmllbGREZWNvcmF0aW9uPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjb3JhdGlvbgotCSAqICAgICAgICAgICAgdGhlIGRlY29yYXRpb24gdG8gYmUgaGlkZGVuLgotCSAqLwotCXB1YmxpYyB2b2lkIGhpZGVEZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7Ci0JCUZpZWxkRGVjb3JhdGlvbkRhdGEgZGF0YSA9IGdldERlY29yYXRpb25EYXRhKGRlY29yYXRpb24pOwotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBTdG9yZSB0aGUgZGVzaXJlZCB2aXNpYmlsaXR5IGluIHRoZSBkZWNEYXRhLiBXZSByZW1lbWJlciB0aGUKLQkJLy8gY2xpZW50J3MgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgY2hhbmdlcyBpbiB2aXNpYmlsaXR5IGNhdXNlZCBieQotCQkvLyBmaWVsZCBmb2N1cyBjaGFuZ2VzIHdvbid0IHZpb2xhdGUgdGhlIGNsaWVudCdzIHZpc2liaWxpdHkgc2V0dGluZy4KLQkJZGF0YS52aXNpYmxlID0gZmFsc2U7Ci0JCXNldFZpc2libGUoZGF0YSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc3BlY2lmaWVkIGRlY29yYXRpb24uIFRoaXMgbWVzc2FnZSBzaG91bGQgYmUgdXNlZCBpZiB0aGUgaW1hZ2UKLQkgKiBvciBkZXNjcmlwdGlvbiBpbiB0aGUgZGVjb3JhdGlvbiBoYXZlIGNoYW5nZWQuIFRoaXMgbWVzc2FnZSBoYXMgbm8KLQkgKiBpbW1lZGlhdGUgZWZmZWN0IGlmIHRoZSBkZWNvcmF0aW9uIGlzIG5vdCB2aXNpYmxlLCBhbmQgbm8gZWZmZWN0IGF0IGFsbAotCSAqIGlmIHRoZSBkZWNvcmF0aW9uIHdhcyBub3QgcHJldmlvdXNseSBhZGRlZCB0byB0aGUgZmllbGQuCi0JICogCi0JICogQHBhcmFtIGRlY29yYXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBkZWNvcmF0aW9uIHRvIGJlIGhpZGRlbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVEZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7Ci0JCUZpZWxkRGVjb3JhdGlvbkRhdGEgZGF0YSA9IGdldERlY29yYXRpb25EYXRhKGRlY29yYXRpb24pOwotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZGF0YS5sYWJlbCAhPSBudWxsKSB7Ci0JCQlkYXRhLmxhYmVsLnNldEltYWdlKGRlY29yYXRpb24uZ2V0SW1hZ2UoKSk7Ci0JCQkvLyBJZiB0aGUgZGVjb3JhdGlvbiBpcyBiZWluZyBzaG93biwgYW5kIGEgaG92ZXIgaXMgYWN0aXZlLAotCQkJLy8gdXBkYXRlIHRoZSBob3ZlciB0ZXh0IHRvIGRpc3BsYXkgdGhlIG5ldyBkZXNjcmlwdGlvbi4KLQkJCWlmIChkYXRhLmxhYmVsLmdldFZpc2libGUoKSA9PSB0cnVlICYmIGhvdmVyICE9IG51bGwpIHsKLQkJCQlzaG93SG92ZXJUZXh0KGRlY29yYXRpb24uZ2V0RGVzY3JpcHRpb24oKSwgZGF0YS5sYWJlbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFNldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgc3BlY2lmaWVkIGRlY29yYXRpb24gZGF0YS4gVGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBjaGFuZ2UgdGhlIHZpc2liaWxpdHkgdmFsdWUgc3RvcmVkIGluIHRoZSBkZWNEYXRhLCBidXQgaW5zdGVhZCBjb25zdWx0cwotCSAqIGl0IHRvIGRldGVybWluZSBob3cgdGhlIHZpc2liaWxpdHkgc2hvdWxkIGJlIGNoYW5nZWQuIFRoaXMgbWV0aG9kIGlzCi0JICogY2FsbGVkIGFueSB0aW1lIHZpc2liaWxpdHkgb2YgYSBkZWNvcmF0aW9uIG1pZ2h0IGNoYW5nZSwgd2hldGhlciBieQotCSAqIGNsaWVudCBBUEkgb3IgZm9jdXMgY2hhbmdlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VmlzaWJsZShGaWVsZERlY29yYXRpb25EYXRhIGRlY0RhdGEsIGJvb2xlYW4gdmlzaWJsZSkgewotCQkvLyBDaGVjayB0aGUgZGVjRGF0YSB2aXNpYmlsaXR5IGZsYWcsIHNpbmNlIGl0IGNvbnRhaW5zIHRoZSBjbGllbnQncwotCQkvLyBpbnN0cnVjdGlvbnMgZm9yIHZpc2liaWxpdHkuCi0JCWlmICh2aXNpYmxlICYmIGRlY0RhdGEudmlzaWJsZSkKLQkJCWRlY0RhdGEubGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJZWxzZQotCQkJZGVjRGF0YS5sYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIEdldCB0aGUgRmllbGREZWNvcmF0aW9uRGF0YSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBkZWNvcmF0aW9uLgotCSAqLwotCXByaXZhdGUgRmllbGREZWNvcmF0aW9uRGF0YSBnZXREZWNvcmF0aW9uRGF0YShGaWVsZERlY29yYXRpb24gZGVjKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgREVDT1JBVElPTl9TTE9UUzsgaSsrKSB7Ci0JCQlpZiAoZGVjRGF0YXNbaV0gIT0gbnVsbCAmJiBkZWMgPT0gZGVjRGF0YXNbaV0uZGVjb3JhdGlvbgotCQkJCQkmJiBkZWNEYXRhc1tpXS5sYWJlbCAhPSBudWxsCi0JCQkJCSYmICFkZWNEYXRhc1tpXS5sYWJlbC5pc0Rpc3Bvc2VkKCkpCi0JCQkJcmV0dXJuIGRlY0RhdGFzW2ldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogU2hvdyB0aGUgc3BlY2lmaWVkIHRleHQgaW4gdGhlIGhvdmVyLCBwb3NpdGlvbmluZyB0aGUgaG92ZXIgbmVhciB0aGUKLQkgKiBzcGVjaWZpZWQgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2hvd0hvdmVyVGV4dChTdHJpbmcgdGV4dCwgQ29udHJvbCBob3Zlck5lYXIpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJaGlkZUhvdmVyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoaG92ZXIgPT0gbnVsbCkgewotCQkJaG92ZXIgPSBuZXcgSG92ZXIoaG92ZXJOZWFyLmdldFNoZWxsKCkpOwotCQl9Ci0JCWhvdmVyLnNldFRleHQodGV4dCwgaG92ZXJOZWFyLCBjb250cm9sKTsKLQkJaG92ZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9GaWVsZERlY29yYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L0ZpZWxkRGVjb3JhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjk2OGIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L0ZpZWxkRGVjb3JhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFNpbXBsZSBkYXRhIHN0cnVjdHVyZSBjbGFzcyBmb3Igc3BlY2lmeWluZyBhIGRlY29yYXRpb24gZm9yIGEgZmllbGQuCi0gKiAKLSAqIDxwPgotICogVGhpcyBBUEkgaXMgY29uc2lkZXJlZCBleHBlcmltZW50YWwuIEl0IGlzIHN0aWxsIGV2b2x2aW5nIGR1cmluZyAzLjIgYW5kIGlzCi0gKiBzdWJqZWN0IHRvIGNoYW5nZS4gSXQgaXMgYmVpbmcgcmVsZWFzZWQgdG8gb2J0YWluIGZlZWRiYWNrIGZyb20gZWFybHkKLSAqIGFkb3B0ZXJzLgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWVsZERlY29yYXRpb24gewotCi0JLyoKLQkgKiBUaGUgaW1hZ2UgdG8gYmUgc2hvd24gaW4gdGhlIGRlY29yYXRpb24uCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQotCS8qCi0JICogVGhlIGRlc2NyaXB0aW9uIHRvIHNob3cgaW4gdGhlIGRlY29yYXRpb24ncyBob3Zlci4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIGRlY29yYXRpb24gZm9yIGEgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIGltYWdlIGFuZCBkZXNjcmlwdGlvbgotCSAqIHRleHQuCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2Ugc2hvd24gaW4gdGhlIGRlY29yYXRpb24uIEEgPGNvZGU+bnVsbDwvY29kZT4gaW1hZ2UKLQkgKiAgICAgICAgICAgIHdpbGwgcmVzdWx0IGluIGEgYmxhbmsgZGVjb3JhdGlvbiwgd2hpY2ggbWF5IGJlIHVzZWQgdG8KLQkgKiAgICAgICAgICAgIHJlc2VydmUgc3BhY2UgbmVhciB0aGUgZmllbGQuCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICB0aGUgZGVzY3JpcHRpb24gc2hvd24gd2hlbiB0aGUgdXNlciBob3ZlcnMgb3ZlciB0aGUKLQkgKiAgICAgICAgICAgIGRlY29yYXRpb24uIEEgPGNvZGU+bnVsbDwvY29kZT4gZGVzY3JpcHRpb24gaW5kaWNhdGVzIHRoYXQKLQkgKiAgICAgICAgICAgIHRoZXJlIHdpbGwgYmUgbm8gaG92ZXIgZm9yIHRoZSBkZWNvcmF0aW9uLgotCSAqLwotCXB1YmxpYyBGaWVsZERlY29yYXRpb24oSW1hZ2UgaW1hZ2UsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIHNob3duIGluIHRoZSBkZWNvcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqIGltYWdlIGlzIHNwZWNpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBzaG93biBpbiB0aGUgZGVjb3JhdGlvbi4gQSByZXR1cm4gdmFsdWUgb2YKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHNpZ25pZmllcyBhIGJsYW5rIGRlY29yYXRpb24uCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBpbWFnZSBzaG93biBpbiB0aGUgZGVjb3JhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW1hZ2UKLQkgKiBpcyBzcGVjaWZpZWQuIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gdXBkYXRlIGFueSBkZWNvcmF0ZWQgZmllbGRzIHRoYXQKLQkgKiBhcmUgc2hvd2luZyB0aGUgZGVzY3JpcHRpb24gaW4gb3JkZXIgdG8gZGlzcGxheSB0aGUgbmV3IGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIHNob3duIGluIHRoZSBkZWNvcmF0aW9uLiBBIHZhbHVlIG9mCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBzaWduaWZpZXMgYSBibGFuayBkZWNvcmF0aW9uLgotCSAqIAotCSAqIEBzZWUgRGVjb3JhdGVkRmllbGQjdXBkYXRlRGVjb3JhdGlvbihGaWVsZERlY29yYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBkZWNvcmF0aW9uIHNob3duIHdoZW4gdGhlIHVzZXIgaG92ZXJzIG92ZXIKLQkgKiB0aGUgZGVjb3JhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBTdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIGRlY29yYXRpb24uIEEgcmV0dXJuIHZhbHVlIG9mCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCBubyBkZXNjcmlwdGlvbiB3aWxsIGJlIHNob3duLgotCSAqIAotCSAqIEBzZWUgRGVjb3JhdGVkRmllbGQjdXBkYXRlRGVjb3JhdGlvbihGaWVsZERlY29yYXRpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBkZWNvcmF0aW9uIHNob3duIHdoZW4gdGhlIHVzZXIgaG92ZXJzIG92ZXIKLQkgKiB0aGUgZGVjb3JhdGlvbi4gSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byB1cGRhdGUgYW55IGRlY29yYXRlZCBmaWVsZHMKLQkgKiBzaG93aW5nIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIGRlY29yYXRpb24uIEEgdmFsdWUgb2YKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcyB0aGF0IG5vIGRlc2NyaXB0aW9uIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIHNob3duLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L0lDb250ZW50UHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L0lDb250ZW50UHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyOWU0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9JQ29udGVudFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdDsKLQotLyoqCi0gKiBJQ29udGVudFByb3Bvc2FsIGRlc2NyaWJlcyBhIGNvbnRlbnQgcHJvcG9zYWwgdG8gYmUgc2hvd24uIEl0IGNvbnNpc3RzIG9mIHRoZQotICogY29udGVudCB0aGF0IHdpbGwgYmUgcHJvdmlkZWQgaWYgdGhlIHByb3Bvc2FsIGlzIGFjY2VwdGVkLCBhbiBvcHRpb25hbCBsYWJlbAotICogdXNlZCB0byBkZXNjcmliZSB0aGUgY29udGVudCB0byB0aGUgdXNlciwgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIHRoYXQKLSAqIGZ1cnRoZXIgZWxhYm9yYXRlcyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvcG9zYWwuCi0gKiAKLSAqIDxwPgotICogVGhpcyBBUEkgaXMgY29uc2lkZXJlZCBleHBlcmltZW50YWwuIEl0IGlzIHN0aWxsIGV2b2x2aW5nIGR1cmluZyAzLjIgYW5kIGlzCi0gKiBzdWJqZWN0IHRvIGNoYW5nZS4gSXQgaXMgYmVpbmcgcmVsZWFzZWQgdG8gb2J0YWluIGZlZWRiYWNrIGZyb20gZWFybHkKLSAqIGFkb3B0ZXJzLgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRQcm9wb3NhbCB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250ZW50IHJlcHJlc2VudGVkIGJ5IHRoaXMgcHJvcG9zYWwuCi0JICogCi0JICogQHJldHVybiB0aGUgU3RyaW5nIGNvbnRlbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBwcm9wb3NhbC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW50ZWdlciBwb3NpdGlvbiB3aXRoaW4gdGhlIGNvbnRlbnRzIHRoYXQgdGhlIGN1cnNvciBzaG91bGQgYmUKLQkgKiBwbGFjZWQgYWZ0ZXIgdGhlIHByb3Bvc2FsIGlzIGFjY2VwdGVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHplcm8tYmFzZWQgaW5kZXggcG9zaXRpb24gd2l0aGluIHRoZSBjb250ZW50cyB3aGVyZSB0aGUKLQkgKiAgICAgICAgIGN1cnNvciBzaG91bGQgYmUgcGxhY2VkIGFmdGVyIHRoZSBwcm9wb3NhbCBpcyBhY2NlcHRlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEN1cnNvclBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxhYmVsIHVzZWQgdG8gZGVzY3JpYmUgdGhpcyBwcm9wb3NhbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBTdHJpbmcgbGFiZWwgdXNlZCB0byBkaXNwbGF5IHRoZSBwcm9wb3NhbC4gSWYKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoZSBjb250ZW50IHdpbGwgYmUgZGlzcGxheWVkIGFzIHRoZQotCSAqICAgICAgICAgbGFiZWwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgZGVzY3JpcHRpb24gdGhhdCBkZXNjcmliZXMgdGhpcyBwcm9wb3NhbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBTdHJpbmcgbGFiZWwgdXNlZCB0byBmdXJ0aGVyIHRoZSBwcm9wb3NhbC4gSWYKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIG5vIGRlc2NyaXB0aW9uIHdpbGwgYmUgZGlzcGxheWVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZmllbGRhc3Npc3QvSUNvbnRlbnRQcm9wb3NhbExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9JQ29udGVudFByb3Bvc2FsTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFhMjMxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9JQ29udGVudFByb3Bvc2FsTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGxpc3RlbiB0byBub3RpZmljYXRpb25zIGZyb20gYQotICoge0BsaW5rIENvbnRlbnRQcm9wb3NhbEFkYXB0ZXJ9LgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRQcm9wb3NhbExpc3RlbmVyIHsKLQkvKioKLQkgKiBBIGNvbnRlbnQgcHJvcG9zYWwgaGFzIGJlZW4gYWNjZXB0ZWQuCi0JICogCi0JICogQHBhcmFtIHByb3Bvc2FsCi0JICogICAgICAgICAgICB0aGUgYWNjZXB0ZWQgY29udGVudCBwcm9wb3NhbAotCSAqLwotCXB1YmxpYyB2b2lkIHByb3Bvc2FsQWNjZXB0ZWQoSUNvbnRlbnRQcm9wb3NhbCBwcm9wb3NhbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9JQ29udGVudFByb3Bvc2FsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L0lDb250ZW50UHJvcG9zYWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTZiMTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L0lDb250ZW50UHJvcG9zYWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3Q7Ci0KLS8qKgotICogSUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyIHByb3ZpZGVzIGFuIGFycmF5IG9mIElDb250ZW50UHJvcG9zYWxzIHRoYXQgYXJlCi0gKiBhcHByb3ByaWF0ZSBmb3IgYSB0ZXh0dWFsIGRpYWxvZyBmaWVsZCwgZ2l2ZW4gdGhlIGZpZWxkJ3MgY3VycmVudCBjb250ZW50IGFuZAotICogdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLiAKLSAqIAotICogPHA+Ci0gKiBUaGlzIEFQSSBpcyBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbC4gSXQgaXMgc3RpbGwgZXZvbHZpbmcgZHVyaW5nIDMuMiBhbmQgaXMKLSAqIHN1YmplY3QgdG8gY2hhbmdlLiBJdCBpcyBiZWluZyByZWxlYXNlZCB0byBvYnRhaW4gZmVlZGJhY2sgZnJvbSBlYXJseQotICogYWRvcHRlcnMuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudFByb3Bvc2FsUHJvdmlkZXIgewotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIE9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSB2YWxpZCBjb250ZW50IHByb3Bvc2FscyBmb3IgYQotCSAqIGZpZWxkLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIHRleHQgZmllbGQKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IgaW4gdGhlIGNvbnRlbnRzCi0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2Yge0BsaW5rIElDb250ZW50UHJvcG9zYWx9IHRoYXQgcmVwcmVzZW50IHZhbGlkCi0JICogICAgICAgICBwcm9wb3NhbHMgZm9yIHRoZSBmaWVsZC4KLQkgKi8KLQlJQ29udGVudFByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzKFN0cmluZyBjb250ZW50cywgaW50IHBvc2l0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L0lDb250cm9sQ29udGVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L0lDb250cm9sQ29udGVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyNzZlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9JQ29udHJvbENvbnRlbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gc2V0IGFuZCByZXRyaWV2ZSB0ZXh0IGNvbnRlbnQgZnJvbSBhbiBhcmJpdHJhcnkKLSAqIGNvbnRyb2wuIENsaWVudHMgYXJlIGV4cGVjdGVkIHRvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB3aGVuIGRlZmluaW5nIGEKLSAqIHtAbGluayBDb250ZW50UHJvcG9zYWxBZGFwdGVyfSwgaW4gb3JkZXIgdG8gc3BlY2lmeSBob3cgdG8gcmV0cmlldmUgYW5kIHNldAotICogdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250cm9sIGJlaW5nIGFkYXB0ZWQuCi0gKiAKLSAqIDxwPgotICogVGhpcyBBUEkgaXMgY29uc2lkZXJlZCBleHBlcmltZW50YWwuIEl0IGlzIHN0aWxsIGV2b2x2aW5nIGR1cmluZyAzLjIgYW5kIGlzCi0gKiBzdWJqZWN0IHRvIGNoYW5nZS4gSXQgaXMgYmVpbmcgcmVsZWFzZWQgdG8gb2J0YWluIGZlZWRiYWNrIGZyb20gZWFybHkKLSAqIGFkb3B0ZXJzLgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRyb2xDb250ZW50QWRhcHRlciB7Ci0JLyoqCi0JICogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2wgdG8gdGhlIHNwZWNpZmllZCB0ZXh0LiBNdXN0IG5vdAotCSAqIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgY29udHJvbCB3aG9zZSBjb250ZW50cyBhcmUgdG8gYmUgc2V0IChyZXBsYWNlZCkuCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHNwZWNpZnlpbmcgdGhlIG5ldyBjb250cm9sIGNvbnRlbnQuCi0JICogQHBhcmFtIGN1cnNvclBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgemVyby1iYXNlZCBpbmRleCByZXByZXNlbnRpbmcgdGhlIGRlc2lyZWQgY3Vyc29yIHBvc2l0aW9uCi0JICogICAgICAgICAgICBpbiB0aGUgY29udHJvbCdzIGNvbnRlbnRzIGFmdGVyIHRoZSBjb250ZW50cyBhcmUgc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRyb2xDb250ZW50cyhDb250cm9sIGNvbnRyb2wsIFN0cmluZyBjb250ZW50cywgaW50IGN1cnNvclBvc2l0aW9uKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgc3BlY2lmaWVkIGNvbnRlbnRzIGludG8gdGhlIGNvbnRyb2wncyBjdXJyZW50IGNvbnRlbnRzLiBNdXN0Ci0JICogbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgY29udHJvbCB3aG9zZSBjb250ZW50cyBhcmUgdG8gYmUgYWx0ZXJlZC4KLQkgKiBAcGFyYW0gY29udGVudHMKLQkgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udHJvbCBjb250ZW50cy4KLQkgKiBAcGFyYW0gY3Vyc29yUG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSB6ZXJvLWJhc2VkIGluZGV4IHJlcHJlc2VudGluZyB0aGUgZGVzaXJlZCBjdXJzb3IgcG9zaXRpb24KLQkgKiAgICAgICAgICAgIGluIHRoZSBjb250cm9sJ3MgY29udGVudHMgYWZ0ZXIgdGhlIGluc2VydGlvbiBpcyBtYWRlLgotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydENvbnRyb2xDb250ZW50cyhDb250cm9sIGNvbnRyb2wsIFN0cmluZyBjb250ZW50cywgaW50IGN1cnNvclBvc2l0aW9uKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdGV4dCBjb250ZW50cyBvZiB0aGUgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgdGhlIGNvbnRyb2wgd2hvc2UgY29udGVudHMgYXJlIHRvIGJlIHJldHJpZXZlZC4KLQkgKiBAcmV0dXJuIHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIGNvbnRyb2wuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250cm9sQ29udGVudHMoQ29udHJvbCBjb250cm9sKTsKLQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIGNvbnRyb2wuIFRoZSBwb3NpdGlvbiBpcyBzcGVjaWZpZWQKLQkgKiBhcyBhIHplcm8tYmFzZWQgaW5kZXggaW50byB0aGUgc3RyaW5nLiBWYWxpZCByYW5nZXMgYXJlIGZyb20gMCB0byBOLAotCSAqIHdoZXJlIE4gaXMgdGhlIHNpemUgb2YgdGhlIGNvbnRlbnRzIHN0cmluZy4gQSB2YWx1ZSBvZiBOIGluZGljYXRlcyB0aGF0Ci0JICogdGhlIGN1cnNvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgdGhlIGNvbnRyb2wgd2hvc2UgcG9zaXRpb24gaXMgdG8gYmUgcmV0cmlldmVkLgotCSAqIEByZXR1cm4gdGhlIHplcm8tYmFzZWQgaW5kZXggcmVwcmVzZW50aW5nIHRoZSBjdXJzb3IgcG9zaXRpb24gaW4gdGhlCi0JICogICAgICAgICBjb250cm9sJ3MgY29udGVudHMuCi0JICovCi0JcHVibGljIGludCBnZXRDdXJzb3JQb3NpdGlvbihDb250cm9sIGNvbnRyb2wpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZmllbGRhc3Npc3QvSUNvbnRyb2xDcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9JQ29udHJvbENyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3M2M1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9JQ29udHJvbENyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gY3JlYXRlIGEgY29udHJvbCB3aXRoIGEgc3BlY2lmaWMgcGFyZW50IGFuZCBzdHlsZQotICogYml0cy4gSXQgaXMgdXNlZCBieSB7QGxpbmsgRGVjb3JhdGVkRmllbGR9IHRvIGNyZWF0ZSB0aGUgY29udHJvbCB0byBiZQotICogZGVjb3JhdGVkLiBDbGllbnRzIGFyZSBleHBlY3RlZCB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaW4gb3JkZXIgdG8KLSAqIGNyZWF0ZSBhIHBhcnRpY3VsYXIga2luZCBvZiBjb250cm9sIGZvciBkZWNvcmF0aW9uLgotICogCi0gKiA8cD4KLSAqIFRoaXMgQVBJIGlzIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiBJdCBpcyBzdGlsbCBldm9sdmluZyBkdXJpbmcgMy4yIGFuZCBpcwotICogc3ViamVjdCB0byBjaGFuZ2UuIEl0IGlzIGJlaW5nIHJlbGVhc2VkIHRvIG9idGFpbiBmZWVkYmFjayBmcm9tIGVhcmx5Ci0gKiBhZG9wdGVycy4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250cm9sQ3JlYXRvciB7Ci0JLyoqCi0JICogQ3JlYXRlIGEgY29udHJvbCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyZW50IGFuZCBzdHlsZSBiaXRzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2YgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZSBvZiB0aGUgY29udHJvbAotCSAqIAotCSAqIEByZXR1cm4gdGhlIENvbnRyb2wgdGhhdCB3YXMgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9TaW1wbGVDb250ZW50UHJvcG9zYWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZmllbGRhc3Npc3QvU2ltcGxlQ29udGVudFByb3Bvc2FsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExYzA1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9TaW1wbGVDb250ZW50UHJvcG9zYWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0OwotCi0vKioKLSAqIFNpbXBsZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyIGlzIGEgY2xhc3MgZGVzaWduZWQgdG8gbWFwIGEgc3RhdGljIGxpc3Qgb2YKLSAqIFN0cmluZ3MgdG8gY29udGVudCBwcm9wb3NhbHMuCi0gKiA8cD4KLSAqIFRoaXMgQVBJIGlzIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiBJdCBpcyBzdGlsbCBldm9sdmluZyBkdXJpbmcgMy4yIGFuZCBpcwotICogc3ViamVjdCB0byBjaGFuZ2UuIEl0IGlzIGJlaW5nIHJlbGVhc2VkIHRvIG9idGFpbiBmZWVkYmFjayBmcm9tIGVhcmx5Ci0gKiBhZG9wdGVycy4KLSAqIAotICogQHNlZSBJQ29udGVudFByb3Bvc2FsUHJvdmlkZXIKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29udGVudFByb3Bvc2FsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29udGVudFByb3Bvc2FsUHJvdmlkZXIgewotCi0JLyoKLQkgKiBUaGUgcHJvcG9zYWxzIHByb3ZpZGVkLgotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gcHJvcG9zYWxzOwotCi0JLyoKLQkgKiBUaGUgcHJvcG9zYWxzIG1hcHBlZCB0byBJQ29udGVudFByb3Bvc2FsLgotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRQcm9wb3NhbFtdIGNvbnRlbnRQcm9wb3NhbHM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBTaW1wbGVDb250ZW50UHJvcG9zYWxQcm92aWRlciB3aG9zZSBjb250ZW50IHByb3Bvc2FscyBhcmUKLQkgKiBhbHdheXMgdGhlIHNwZWNpZmllZCBhcnJheSBvZiBPYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wb3NhbHMKLQkgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBTdHJpbmdzIHRvIGJlIHJldHVybmVkIHdoZW5ldmVyIHByb3Bvc2FscyBhcmUKLQkgKiAgICAgICAgICAgIHJlcXVlc3RlZC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlQ29udGVudFByb3Bvc2FsUHJvdmlkZXIoU3RyaW5nW10gcHJvcG9zYWxzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvcG9zYWxzID0gcHJvcG9zYWxzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBPYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdmFsaWQgY29udGVudCBwcm9wb3NhbHMgZm9yIGEKLQkgKiBmaWVsZC4gSWdub3JlIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBmaWVsZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudHMKLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBmaWVsZCAoaWdub3JlZCkKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gdGhlIGZpZWxkIChpZ25vcmVkKQotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIE9iamVjdHMgdGhhdCByZXByZXNlbnQgdmFsaWQgcHJvcG9zYWxzIGZvciB0aGUgZmllbGQKLQkgKiAgICAgICAgIGdpdmVuIGl0cyBjdXJyZW50IGNvbnRlbnQuCi0JICovCi1wdWJsaWMgSUNvbnRlbnRQcm9wb3NhbCBbXSBnZXRQcm9wb3NhbHMoU3RyaW5nIGNvbnRlbnRzLCBpbnQgcG9zaXRpb24pIHsKLQkJaWYgKGNvbnRlbnRQcm9wb3NhbHMgPT0gbnVsbCkgewotCQkJY29udGVudFByb3Bvc2FscyA9IG5ldyBJQ29udGVudFByb3Bvc2FsW3Byb3Bvc2Fscy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaT0wOyBpPHByb3Bvc2Fscy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIFN0cmluZyBwcm9wb3NhbCA9IHByb3Bvc2Fsc1tpXTsKLQkJCQljb250ZW50UHJvcG9zYWxzW2ldID0gbmV3IElDb250ZW50UHJvcG9zYWwoKSB7Ci0JCQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudCgpIHsKLQkJCQkJCXJldHVybiBwcm9wb3NhbDsKLQkJCQkJfQotCQkJCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCXB1YmxpYyBpbnQgZ2V0Q3Vyc29yUG9zaXRpb24oKSB7Ci0JCQkJCQlyZXR1cm4gcHJvcG9zYWwubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50UHJvcG9zYWxzOwotCX0KLQkvKioKLQkgKiBTZXQgdGhlIFN0cmluZ3MgdG8gYmUgdXNlZCBhcyBjb250ZW50IHByb3Bvc2Fscy4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBTdHJpbmdzIHRvIGJlIHVzZWQgYXMgcHJvcG9zYWxzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3Bvc2FscyhTdHJpbmdbXSBpdGVtcykgewotCQl0aGlzLnByb3Bvc2FscyA9IGl0ZW1zOwotCQljb250ZW50UHJvcG9zYWxzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9UZXh0Q29udGVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L1RleHRDb250ZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2E4MmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L1RleHRDb250ZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEFuIHtAbGluayBJQ29udHJvbENvbnRlbnRBZGFwdGVyfSBmb3IgU1dUIFRleHQgY29udHJvbHMuIFRoaXMgaXMgYQotICogY29udmVuaWVuY2UgY2xhc3MgZm9yIGVhc2lseSBjcmVhdGluZyBhIHtAbGluayBDb250ZW50UHJvcG9zYWxBZGFwdGVyfSBmb3IKLSAqIHRleHQgZmllbGRzLgotICogCi0gKiA8cD4KLSAqIFRoaXMgQVBJIGlzIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiBJdCBpcyBzdGlsbCBldm9sdmluZyBkdXJpbmcgMy4yIGFuZCBpcwotICogc3ViamVjdCB0byBjaGFuZ2UuIEl0IGlzIGJlaW5nIHJlbGVhc2VkIHRvIG9idGFpbiBmZWVkYmFjayBmcm9tIGVhcmx5Ci0gKiBhZG9wdGVycy4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgVGV4dENvbnRlbnRBZGFwdGVyIGltcGxlbWVudHMgSUNvbnRyb2xDb250ZW50QWRhcHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MudGFza2Fzc2lzdGFuY2UuSUNvbnRyb2xDb250ZW50QWRhcHRlciNnZXRDb250cm9sQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRyb2xDb250ZW50cyhDb250cm9sIGNvbnRyb2wpIHsKLQkJcmV0dXJuICgoVGV4dCkgY29udHJvbCkuZ2V0VGV4dCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuSUNvbnRyb2xDb250ZW50QWRhcHRlciNzZXRDb250cm9sQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250cm9sQ29udGVudHMoQ29udHJvbCBjb250cm9sLCBTdHJpbmcgdGV4dCwKLQkJCWludCBjdXJzb3JQb3NpdGlvbikgewotCQkoKFRleHQpIGNvbnRyb2wpLnNldFRleHQodGV4dCk7Ci0JCSgoVGV4dCkgY29udHJvbCkuc2V0U2VsZWN0aW9uKGN1cnNvclBvc2l0aW9uLCBjdXJzb3JQb3NpdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5JQ29udHJvbENvbnRlbnRBZGFwdGVyI2luc2VydENvbnRyb2xDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydENvbnRyb2xDb250ZW50cyhDb250cm9sIGNvbnRyb2wsIFN0cmluZyB0ZXh0LAotCQkJaW50IGN1cnNvclBvc2l0aW9uKSB7Ci0JCVBvaW50IHNlbGVjdGlvbiA9ICgoVGV4dCkgY29udHJvbCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCSgoVGV4dCkgY29udHJvbCkuaW5zZXJ0KHRleHQpOwotCQkvLyBJbnNlcnQgd2lsbCBsZWF2ZSB0aGUgY3Vyc29yIGF0IHRoZSBlbmQgb2YgdGhlIGluc2VydGVkIHRleHQuIElmIHRoaXMKLQkJLy8gaXMgbm90IHdoYXQgd2Ugd2FudGVkLCByZXNldCB0aGUgc2VsZWN0aW9uLgotCQlpZiAoY3Vyc29yUG9zaXRpb24gPCB0ZXh0Lmxlbmd0aCgpKQotCQkJKChUZXh0KSBjb250cm9sKS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLnggKyBjdXJzb3JQb3NpdGlvbiwKLQkJCQkJc2VsZWN0aW9uLnggKyBjdXJzb3JQb3NpdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5JQ29udHJvbENvbnRlbnRBZGFwdGVyI2dldEN1cnNvclBvc2l0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wpCi0JICovCi0JcHVibGljIGludCBnZXRDdXJzb3JQb3NpdGlvbihDb250cm9sIGNvbnRyb2wpIHsKLQkJcmV0dXJuICgoVGV4dCkgY29udHJvbCkuZ2V0Q2FyZXRQb3NpdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2ZpZWxkYXNzaXN0L1RleHRDb250cm9sQ3JlYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZmllbGRhc3Npc3QvVGV4dENvbnRyb2xDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhY2RkZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZmllbGRhc3Npc3QvVGV4dENvbnRyb2xDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQW4ge0BsaW5rIElDb250cm9sQ3JlYXRvcn0gZm9yIFNXVCBUZXh0IGNvbnRyb2xzLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgY2xhc3MKLSAqIGZvciBjcmVhdGluZyB0ZXh0IGNvbnRyb2xzIHRvIGJlIHN1cHBsaWVkIHRvIGEgZGVjb3JhdGVkIGZpZWxkLgotICogCi0gKiA8cD4KLSAqIFRoaXMgQVBJIGlzIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiBJdCBpcyBzdGlsbCBldm9sdmluZyBkdXJpbmcgMy4yIGFuZCBpcwotICogc3ViamVjdCB0byBjaGFuZ2UuIEl0IGlzIGJlaW5nIHJlbGVhc2VkIHRvIG9idGFpbiBmZWVkYmFjayBmcm9tIGVhcmx5Ci0gKiBhZG9wdGVycy4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgVGV4dENvbnRyb2xDcmVhdG9yIGltcGxlbWVudHMgSUNvbnRyb2xDcmVhdG9yIHsKLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiBuZXcgVGV4dChwYXJlbnQsIHN0eWxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9maWVsZGFzc2lzdC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTJlMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZmllbGRhc3Npc3QvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIHN1cHBvcnQgZm9yIGNsYXNzZXMgdGhhdCBoZWxwIGNvbW11bmljYXRlIHByb3BlciBjb250ZW50IGZvciBkaWFsb2dzIGFuZCB3aXphcmRzLgotPGgyPgotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLTxwPgotVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGNsYXNzZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBndWlkZSBhIGRpYWxvZyB1c2VyIHRocm91Z2ggY2hvb3NpbmcKLWFwcHJvcHJpYXRlIGNvbnRlbnQgZm9yIGZpZWxkcyBpbiBhIGRpYWxvZyBvciB3aXphcmQuCi08cD4KLUEgPHR0PkNvbnRlbnRQcm9wb3NhbEFkYXB0ZXI8L3R0PiBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gYXJiaXRyYXJ5IGNvbnRyb2wgdG8gcHJvdmlkZSAKLWEgcG9wdXAgc2hvd2luZyBjb250ZW50IHByb3Bvc2Fscy4gIFRoZXNlIHByb3Bvc2FscyBhcHBlYXIgd2hlbiB0aGUgZGVmaW5lZAotYXNzaXN0IGtleXN0cm9rZSBpcyBpbnZva2VkLiAgVGhlIDx0dD5Db250ZW50UHJvcG9zYWxBZGFwdGVyPC90dD4gbWFuYWdlcyB0aGUgY3JlYXRpb24sIAotaGlkaW5nLCBhbmQgc2hvd2luZyBvZiB0aGUgcHJvcG9zYWwgcG9wdXAsIGFzIHdlbGwgYXMgdGhlIHByb3BlciBoYW5kbGluZyBvZiBrZXkgZXZlbnRzCi1iZXR3ZWVuIHRoZSBhZGFwdGVkIGNvbnRyb2wgYW5kIGl0cyBwb3B1cC4KLTwvcD4KLTx0dD5EZWNvcmF0ZWRGaWVsZDwvdHQ+IGNhbiBiZSB1c2VkIHRvIGRlY29yYXRlIGNvbnRyb2xzIHdpdGggaW1hZ2VzIHRoYXQKLWNvbW11bmljYXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cm9sJ3MgY29udGVudC4gIERlY29yYXRpb25zIGNhbiBiZQotdXNlZCB0byBzaG93IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBmaWVsZCwgc3VjaCBhcyBpdHMgc3RhdHVzLCBvciBhIGN1ZQotdGhhdCBzaG93cyBhdmFpbGFiaWxpdHkgb2YgY29udGVudCBwcm9wb3NhbHMuICBEZWNvcmF0aW9ucyBhcmUgZGVmaW5lZCBpbiBwcmUtZGVmaW5lZAotbG9jYXRpb25zIHJlbGF0aXZlIHRvIHRoZSBjb250cm9sLCBhbmQgY2FuIGJlIHNldCB1cCB0byBzaG93IGF0IGFsbCB0aW1lcywgb3Igb25seQotd2hlbiB0aGUgY29udHJvbCBoYXMgZm9jdXMuICBEZWNvcmF0ZWQgZmllbGRzIG1hbmFnZSB0aGUgY3JlYXRpb24gb2YgdGhlIGZpZWxkJ3MgY29udHJvbCwKLXNpbmNlIGEgc3BlY2lhbGl6ZWQgbGF5b3V0IGlzIHVzZWQgdG8gbWFuYWdlIHRoZSBkZWNvcmF0aW9ucyBhcm91bmQgdGhlIGNvbnRyb2wuICBIb3dldmVyLAotY2xpZW50cyBzdXBwbHkgYW4gb2JqZWN0IHRoYXQgd2lsbCBjcmVhdGUgdGhlIGNvcnJlY3QgY2xhc3Mgb2YgY29udHJvbC4gIE90aGVyIHRoYW4KLXVzaW5nIHRoZSBmaWVsZCB0byBtYW5hZ2UgdGhlIGRlY29yYXRpb25zIHRoZW1zZWx2ZXMsIGNsaWVudHMgYXJlIGV4cGVjdGVkIHRvIGludGVyYWN0IAotZGlyZWN0bHkgd2l0aCB0aGUgY29udHJvbC4gIERlY29yYXRpb25zIGNhbiBvcHRpb25hbGx5IHNob3cgZGVzY3JpcHRpdmUgdGV4dCB3aGVuIAotdGhlIHVzZXIgaG92ZXJzIG92ZXIgdGhlbS4gIAotPC9wPgotCi08cD5Ob3RlOiBOb25lIG9mIHRoZSBjbGFzc2VzIGluIHRoaXMgcGFja2FnZSBtYWludGFpbiBnbG9iYWwgc3RhdGUuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbWFnZXMvZG90c19idXR0b24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvaW1hZ2VzL2RvdHNfYnV0dG9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1MjIxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9pbWFnZXMvZG90c19idXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbGF5b3V0L0dyaWREYXRhRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbGF5b3V0L0dyaWREYXRhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjM5OWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2xheW91dC9HcmlkRGF0YUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgY29udmllbmllbnQgc2hvcnRoYW5kIGZvciBjcmVhdGluZyBhbmQgaW5pdGlhbGl6aW5nCi0gKiBHcmlkRGF0YS4gVGhpcyBvZmZlcnMgc2V2ZXJhbCBiZW5lZml0cyBvdmVyIGNyZWF0aW5nIEdyaWREYXRhIG5vcm1hbCB3YXk6Ci0gKiAKLSAqIDx1bD4KLSAqIDxsaT5UaGUgc2FtZSBmYWN0b3J5IGNhbiBiZSB1c2VkIG1hbnkgdGltZXMgdG8gY3JlYXRlIHNldmVyYWwgR3JpZERhdGEgaW5zdGFuY2VzPC9saT4KLSAqIDxsaT5UaGUgc2V0dGVycyBvbiBHcmlkRGF0YUZhY3RvcnkgYWxsIHJldHVybiAidGhpcyIsIGFsbG93aW5nIHRoZW0gdG8gYmUgY2hhaW5lZDwvbGk+IAotICogPGxpPkdyaWREYXRhRmFjdG9yeSB1c2VzIHZlY3RvciBzZXR0ZXJzIChpdCBhY2NlcHRzIFBvaW50cyksIG1ha2luZyBpdCBlYXN5IHRvCi0gKiAgICAgc2V0IFggYW5kIFkgdmFsdWVzIHRvZ2V0aGVyPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIDxwPgotICogR3JpZERhdGFGYWN0b3J5IGluc3RhbmNlcyBhcmUgY3JlYXRlZCB1c2luZyBvbmUgb2YgdGhlIHN0YXRpYyBtZXRob2RzIG9uIHRoaXMgY2xhc3MuIAotICogPC9wPgotICogCi0gKiA8cD4KLSAqIEV4YW1wbGUgdXNhZ2U6Ci0gKiA8L3A+Ci0gKiA8Y29kZT4KLSAqIAotICogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gKiAvLyBFeGFtcGxlIDE6IFR5cGljYWwgZ3JpZCBkYXRhIGZvciBhIG5vbi13cmFwcGluZyBsYWJlbAotICogCi0gKiAgICAgLy8gR3JpZERhdGFGYWN0b3J5IHZlcnNpb24KLSAqICAgICBHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuYXBwbHlUbyhteUxhYmVsKTsKLSAqIAotICogICAgIC8vIEVxdWl2YWxlbnQgU1dUIHZlcnNpb24KLSAqICAgICBHcmlkRGF0YSBsYWJlbERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0gKiAgICAgbXlMYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsRGF0YSk7Ci0gKiAKLSAqIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gKiAvLyBFeGFtcGxlIDI6IFR5cGljYWwgZ3JpZCBkYXRhIGZvciBhIHdyYXBwaW5nIGxhYmVsCi0gKiAKLSAqICAgICAvLyBHcmlkRGF0YUZhY3RvcnkgdmVyc2lvbgotICogICAgIEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKQotICogICAgICAgICAgLmFsaWduKFNXVC5GSUxMLCBTV1QuQ0VOVEVSKQotICogICAgCSAgICAuaGludCgxNTAsIFNXVC5ERUZBVUxUKQotICogICAgCSAgICAuZ3JhYih0cnVlLCBmYWxzZSkKLSAqICAgICAgICAgIC5hcHBseVRvKHdyYXBwaW5nTGFiZWwpOwotICogICAgICAKLSAqICAgICAvLyBFcXVpdmFsZW50IFNXVCB2ZXJzaW9uCi0gKiAgICAgR3JpZERhdGEgd3JhcHBpbmdMYWJlbERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLSAqICAgICB3cmFwcGluZ0xhYmVsRGF0YS5taW5pbXVtV2lkdGggPSAxOwotICogICAgIHdyYXBwaW5nTGFiZWxEYXRhLndpZHRoSGludCA9IDE1MDsKLSAqICAgICB3cmFwcGluZ0xhYmVsLnNldExheW91dERhdGEod3JhcHBpbmdMYWJlbERhdGEpOwotICogCi0gKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICogLy8gRXhhbXBsZSAzOiBUeXBpY2FsIGdyaWQgZGF0YSBmb3IgYSBzY3JvbGxhYmxlIGNvbnRyb2wgKGEgbGlzdCBib3gsIHRyZWUsIHRhYmxlLCBldGMuKQotICogCi0gKiAgICAgLy8gR3JpZERhdGFGYWN0b3J5IHZlcnNpb24KLSAqICAgICBHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuZ3JhYih0cnVlLCB0cnVlKS5oaW50KDE1MCwgMTUwKS5hcHBseVRvKGxpc3RCb3gpOwotICogCi0gKiAgICAgLy8gRXF1aXZhbGVudCBTV1QgdmVyc2lvbgotICogICAgIEdyaWREYXRhIGxpc3RCb3hEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gKiAgICAgbGlzdEJveERhdGEud2lkdGhIaW50ID0gMTUwOwotICogICAgIGxpc3RCb3hEYXRhLmhlaWdodEhpbnQgPSAxNTA7Ci0gKiAgICAgbGlzdEJveERhdGEubWluaW11bVdpZHRoID0gMTsKLSAqICAgICBsaXN0Qm94RGF0YS5taW5pbXVtSGVpZ2h0ID0gMTsKLSAqICAgICBsaXN0Qm94LnNldExheW91dERhdGEobGlzdEJveERhdGEpOwotICogCi0gKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gKiAvLyBFeGFtcGxlIDQ6IFR5cGljYWwgZ3JpZCBkYXRhIGZvciBhIGJ1dHRvbgotICoKLSAqICAgICAvLyBHcmlkRGF0YUZhY3RvcnkgdmVyc2lvbgotICogICAgIFBvaW50IHByZWZlcnJlZFNpemUgPSBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0gKiAgICAgUG9pbnQgaGludCA9IEdlb21ldHJ5Lm1heChMYXlvdXRDb25zdGFudHMuZ2V0TWluQnV0dG9uU2l6ZSgpLCBwcmVmZXJyZWRTaXplKTsKLSAqICAgICBHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuYWxpZ24oU1dULkZJTEwsIFNXVC5DRU5URVIpLmhpbnQoaGludCkuYXBwbHlUbyhidXR0b24pOwotICoKLSAqICAgICAvLyBFcXVpdmFsZW50IFNXVCB2ZXJzaW9uCi0gKiAgICAgUG9pbnQgcHJlZmVycmVkU2l6ZSA9IGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLSAqICAgICBQb2ludCBoaW50ID0gR2VvbWV0cnkubWF4KExheW91dENvbnN0YW50cy5nZXRNaW5CdXR0b25TaXplKCksIHByZWZlcnJlZFNpemUpOwotICogICAgIEdyaWREYXRhIGJ1dHRvbkRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLSAqICAgICBidXR0b25EYXRhLndpZHRoSGludCA9IGhpbnQueDsKLSAqICAgICBidXR0b25EYXRhLmhlaWdodEhpbnQgPSBoaW50Lnk7Ci0gKiAgICAgYnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uRGF0YSk7IAotICogPC9jb2RlPgotICogCi0gKiA8cD4KLSAqIElNUE9SVEFOVDogV0hFTiBBU1NJR05JTkcgTEFZT1VUIERBVEEgVE8gQSBDT05UUk9MLCBCRSBTVVJFIFRPIFVTRQotICogZ3JpZERhdGFGYWN0b3J5LmFwcGx5VG8oY29udHJvbCkgQU5EIE5FVkVSCi0gKiBjb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGFGYWN0b3J5KS4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR3JpZERhdGFGYWN0b3J5IHsKLSAgICBwcml2YXRlIEdyaWREYXRhIGRhdGE7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEdyaWREYXRhRmFjdG9yeSB0aGF0IGNyZWF0ZXMgY29wZXMgb2YgdGhlIGdpdmVuIEdyaWREYXRhLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZCB0ZW1wbGF0ZSBHcmlkRGF0YSB0byBjb3B5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBHcmlkRGF0YUZhY3RvcnkoR3JpZERhdGEgZCkgewotICAgICAgICB0aGlzLmRhdGEgPSBkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEdyaWREYXRhRmFjdG9yeSBpbml0aWFsaXplZCB3aXRoIHRoZSBTV1QgZGVmYXVsdHMuCi0gICAgICogVGhpcyBmYWN0b3J5IHdpbGwgZ2VuZXJhdGUgR3JpZERhdGEgdGhhdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAqICJuZXcgR3JpZERhdGEoKSIuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogSW5pdGlhbCB2YWx1ZXMgYXJlOgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmFsaWduKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIpPC9saT4KLSAgICAgKiA8bGk+ZXhjbHVkZShmYWxzZSk8L2xpPgotICAgICAqIDxsaT5ncmFiKGZhbHNlLCBmYWxzZSk8L2xpPgotICAgICAqIDxsaT5oaW50KFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk8L2xpPgotICAgICAqIDxsaT5pbmRlbnQoMCwwKTwvbGk+Ci0gICAgICogPGxpPm1pblNpemUoMCwwKTwvbGk+Ci0gICAgICogPGxpPnNwYW4oMSwxKTwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IEdyaWREYXRhRmFjdG9yeSBpbnN0YW5jZQotICAgICAqIEBzZWUgZmlsbERlZmF1bHRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBHcmlkRGF0YUZhY3Rvcnkgc3d0RGVmYXVsdHMoKSB7Ci0gICAgCXJldHVybiBuZXcgR3JpZERhdGFGYWN0b3J5KG5ldyBHcmlkRGF0YSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBHcmlkRGF0YUZhY3RvcnkgdGhhdCBjcmVhdGVzIGNvcGllcyBvZiB0aGUgZ2l2ZW4gR3JpZERhdGEKLSAgICAgKiBieSBkZWZhdWx0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhIEdyaWREYXRhIHRvIGNvcHkKLSAgICAgKiBAcmV0dXJuIGEgbmV3IEdyaWREYXRhRmFjdG9yeSB0aGF0IGNyZWF0ZXMgY29waWVzIG9mIHRoZSBhcmd1bWVudCBieSBkZWZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBHcmlkRGF0YUZhY3RvcnkgY3JlYXRlRnJvbShHcmlkRGF0YSBkYXRhKSB7Ci0gICAgCXJldHVybiBuZXcgR3JpZERhdGFGYWN0b3J5KGNvcHlEYXRhKGRhdGEpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEdyaWREYXRhRmFjdG9yeSBpbml0aWFsaXplZCB3aXRoIGRlZmF1bHRzIHRoYXQgd2lsbCBjYXVzZQotICAgICAqIHRoZSBjb250cm9sIHRvIGZpbGwgaXRzIGNlbGwuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogSW5pdGlhbCB2YWx1ZXMgYXJlOgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmFsaWduKFNXVC5GSUxMLCBTV1QuRklMTCk8L2xpPgotICAgICAqIDxsaT5leGNsdWRlKGZhbHNlKTwvbGk+Ci0gICAgICogPGxpPmdyYWIoZmFsc2UsIGZhbHNlKTwvbGk+Ci0gICAgICogPGxpPmhpbnQoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTwvbGk+Ci0gICAgICogPGxpPmluZGVudCgwLDApPC9saT4KLSAgICAgKiA8bGk+bWluU2l6ZSgxLDEpPC9saT4KLSAgICAgKiA8bGk+c3BhbigxLDEpPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIGEgR3JpZERhdGFGYWN0b3J5IHRoYXQgbWFrZXMgY29udHJvbHMgZmlsbCB0aGVpciBncmlkIGJ5IGRlZmF1bHQKLSAgICAgKiAKLSAgICAgKiBAc2VlIHN3dERlZmF1bHRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBHcmlkRGF0YUZhY3RvcnkgZmlsbERlZmF1bHRzKCkgewotICAgIAlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEubWluaW11bVdpZHRoID0gMTsKLSAgICAgICAgZGF0YS5taW5pbXVtSGVpZ2h0ID0gMTsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0gICAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLSAgICAgICAgCi0gICAgCXJldHVybiBuZXcgR3JpZERhdGFGYWN0b3J5KGRhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEdyaWREYXRhIHNwYW4uIFRoZSBzcGFuIGNvbnRyb2xzIGhvdyBtYW55IGNlbGxzCi0gICAgICogYXJlIGZpbGxlZCBieSB0aGUgY29udHJvbC4gCi0gICAgICogCi0gICAgICogQHBhcmFtIGhTcGFuIG51bWJlciBvZiBjb2x1bW5zIHNwYW5uZWQgYnkgdGhlIGNvbnRyb2wKLSAgICAgKiBAcGFyYW0gdlNwYW4gbnVtYmVyIG9mIHJvd3Mgc3Bhbm5lZCBieSB0aGUgY29udHJvbAotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBHcmlkRGF0YUZhY3Rvcnkgc3BhbihpbnQgaFNwYW4sIGludCB2U3BhbikgewotICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gaFNwYW47Ci0gICAgICAgIGRhdGEudmVydGljYWxTcGFuID0gdlNwYW47Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEdyaWREYXRhIHNwYW4uIFRoZSBzcGFuIGNvbnRyb2xzIGhvdyBtYW55IGNlbGxzCi0gICAgICogYXJlIGZpbGxlZCBieSB0aGUgY29udHJvbC4gCi0gICAgICogCi0gICAgICogQHBhcmFtIHNwYW4gdGhlIG5ldyBzcGFuLiBUaGUgeCBjb29yZGluYXRlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mCi0gICAgICogY29sdW1ucyBzcGFubmVkLCBhbmQgdGhlIHkgY29vcmRpbmF0ZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiByb3dzLgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBHcmlkRGF0YUZhY3Rvcnkgc3BhbihQb2ludCBzcGFuKSB7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSBzcGFuLng7Ci0gICAgICAgIGRhdGEudmVydGljYWxTcGFuID0gc3Bhbi55OwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGhpbnRzLiBUaGUgd2lkdGggYW5kIGhlaWdodCBoaW50cyBvdmVycmlkZQotICAgICAqIHRoZSBjb250cm9sJ3MgcHJlZmVycmVkIHNpemUuIElmIGVpdGhlciBoaW50IGlzIHNldCB0byBTV1QuREVGQVVMVCwKLSAgICAgKiB0aGUgY29udHJvbCdzIHByZWZlcnJlZCBzaXplIGlzIHVzZWQuIAotICAgICAqIAotICAgICAqIEBwYXJhbSB4SGludCBob3Jpem9udGFsIGhpbnQgKHBpeGVscyksIG9yIFNXVC5ERUZBVUxUIHRvIHVzZSB0aGUgY29udHJvbCdzIHByZWZlcnJlZCBzaXplCi0gICAgICogQHBhcmFtIHlIaW50IHZlcnRpY2FsIGhpbnQgKHBpeGVscyksIG9yIFNXVC5ERUZBVUxUIHRvIHVzZSB0aGUgY29udHJvbCdzIHByZWZlcnJlZCBzaXplCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIEdyaWREYXRhRmFjdG9yeSBoaW50KGludCB4SGludCwgaW50IHlIaW50KSB7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0geEhpbnQ7Ci0gICAgICAgIGRhdGEuaGVpZ2h0SGludCA9IHlIaW50OwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGhpbnRzLiBUaGUgd2lkdGggYW5kIGhlaWdodCBoaW50cyBvdmVycmlkZQotICAgICAqIHRoZSBjb250cm9sJ3MgcHJlZmVycmVkIHNpemUuIElmIGVpdGhlciBoaW50IGlzIHNldCB0byBTV1QuREVGQVVMVCwKLSAgICAgKiB0aGUgY29udHJvbCdzIHByZWZlcnJlZCBzaXplIGlzIHVzZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGhpbnQgc2l6ZSAocGl4ZWxzKSB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGNvbnRyb2wncyBwcmVmZXJyZWQgc2l6ZS4gSWYKLSAgICAgKiB0aGUgeCBvciB5IHZhbHVlcyBhcmUgc2V0IHRvIFNXVC5ERUZBVUxULCB0aGUgY29udHJvbCdzIGNvbXB1dGVTaXplKCkgbWV0aG9kIHdpbGwKLSAgICAgKiBiZSB1c2VkIHRvIG9idGFpbiB0aGF0IGRpbWVuc2lvbiBvZiB0aGUgcHJlZmVycmVkIHNpemUuCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIEdyaWREYXRhRmFjdG9yeSBoaW50KFBvaW50IGhpbnQpIHsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBoaW50Lng7Ci0gICAgICAgIGRhdGEuaGVpZ2h0SGludCA9IGhpbnQueTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSBjb250cm9sIHdpdGhpbiBpdHMgY2VsbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaEFsaWduIGhvcml6b250YWwgYWxpZ25tZW50LiBPbmUgb2YgU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgU1dULkVORCwgb3IgU1dULkZJTEwuCi0gICAgICogQHBhcmFtIHZBbGlnbiB2ZXJ0aWNhbCBhbGlnbm1lbnQuIE9uZSBvZiBTV1QuQkVHSU5OSU5HLCBTV1QuQ0VOVEVSLCBTV1QuRU5ELCBvciBTV1QuRklMTC4KLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JpZERhdGFGYWN0b3J5IGFsaWduKGludCBoQWxpZ24sIGludCB2QWxpZ24pIHsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gaEFsaWduOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gdkFsaWduOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbmRlbnQgb2YgdGhlIGNvbnRyb2wgd2l0aGluIHRoZSBjZWxsLiBNb3ZlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbnRyb2wKLSAgICAgKiBieSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHBpeGVscy4gUG9zaXRpdmUgdmFsdWVzIG1vdmUgdG93YXJkIHRoZSBsb3dlci1yaWdodCwgbmVnYXRpdmUKLSAgICAgKiB2YWx1ZXMgbW92ZSB0b3dhcmQgdGhlIHVwcGVyLWxlZnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGhJbmRlbnQgZGlzdGFuY2UgdG8gbW92ZSB0byB0aGUgcmlnaHQgKG5lZ2F0aXZlIHZhbHVlcyBtb3ZlIGxlZnQpCi0gICAgICogQHBhcmFtIHZJbmRlbnQgZGlzdGFuY2UgdG8gbW92ZSBkb3duIChuZWdhdGl2ZSB2YWx1ZXMgbW92ZSB1cCkKLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JpZERhdGFGYWN0b3J5IGluZGVudChpbnQgaEluZGVudCwgaW50IHZJbmRlbnQpIHsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gaEluZGVudDsKLSAgICAgICAgZGF0YS52ZXJ0aWNhbEluZGVudCA9IHZJbmRlbnQ7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGluZGVudCBvZiB0aGUgY29udHJvbCB3aXRoaW4gdGhlIGNlbGwuIE1vdmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29udHJvbAotICAgICAqIGJ5IHRoZSBnaXZlbiBudW1iZXIgb2YgcGl4ZWxzLiBQb3NpdGl2ZSB2YWx1ZXMgbW92ZSB0b3dhcmQgdGhlIGxvd2VyLXJpZ2h0LCBuZWdhdGl2ZQotICAgICAqIHZhbHVlcyBtb3ZlIHRvd2FyZCB0aGUgdXBwZXItbGVmdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZW50IG9mZnNldCB0byBtb3ZlIHRoZSBjb250cm9sCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIEdyaWREYXRhRmFjdG9yeSBpbmRlbnQoUG9pbnQgaW5kZW50KSB7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbEluZGVudCA9IGluZGVudC54OwotICAgICAgICBkYXRhLnZlcnRpY2FsSW5kZW50ID0gaW5kZW50Lnk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBleHRyYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHNwYWNlIHNob3VsZCBiZSBhbGxvY2F0ZWQgdG8KLSAgICAgKiB0aGlzIGNvbnRyb2wncyBjb2x1bW4gd2hlbiB0aGUgbGF5b3V0IHJlc2l6ZXMuIElmIGFueSBjb250cm9sIGluIHRoZSBjb2x1bW4KLSAgICAgKiBpcyBzZXQgdG8gZ3JhYiBob3Jpem9udGFsIHRoZW4gdGhlIHdob2xlIGNvbHVtbiB3aWxsIGdyYWIgaG9yaXpvbnRhbCBzcGFjZS4KLSAgICAgKiBJZiBhbnkgY29udHJvbCBpbiB0aGUgcm93IGlzIHNldCB0byBncmFiIHZlcnRpY2FsIHRoZW4gdGhlIHdob2xlIHJvdyB3aWxsIGdyYWIKLSAgICAgKiB2ZXJ0aWNhbCBzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaG9yaXpvbnRhbCB0cnVlIGlmIHRoZSBjb250cm9sJ3MgY29sdW1uIHNob3VsZCBncm93IGhvcml6b250YWxseQotICAgICAqIEBwYXJhbSB2ZXJ0aWNhbCB0cnVlIGlmIHRoZSBjb250cm9sJ3Mgcm93IHNob3VsZCBncm93IHZlcnRpY2FsbHkKLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JpZERhdGFGYWN0b3J5IGdyYWIoYm9vbGVhbiBob3Jpem9udGFsLCBib29sZWFuIHZlcnRpY2FsKSB7Ci0gICAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGhvcml6b250YWw7Ci0gICAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB2ZXJ0aWNhbDsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWluaW11bSBzaXplIGZvciB0aGUgY29udHJvbC4gVGhlIGNvbnRyb2wgd2lsbCBub3QgYmUgcGVybWl0dGVkCi0gICAgICogdG8gc2hyaW5rIGJlbG93IHRoaXMgc2l6ZS4gTm90ZTogR3JpZExheW91dCB0cmVhdHMgYSBtaW5pbXVtIHNpemUgb2YgMAotICAgICAqIGFzIGFuIHVuZG9jdW1lbnRlZCBzcGVjaWFsIHZhbHVlLCBzbyB0aGUgc21hbGxlc3QgcG9zc2libGUgbWluaW11bSBzaXplIAotICAgICAqIGlzIGEgc2l6ZSBvZiAxLiBBIG1pbmltdW0gc2l6ZSBvZiBTV1QuREVGQVVMVCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzdWx0Ci0gICAgICogb2YgY29tcHV0ZVNpemUoaW50LCBpbnQsIGJvb2xlYW4pIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBjb250cm9sJ3MgbWluaW11bQotICAgICAqIHNpemUuCi0gICAgICogCi0gICAgICogCi0gICAgICogQHBhcmFtIG1pblggbWluaW11bSBhIHZhbHVlIG9mIDEgb3IgbW9yZSBpcyBhIGhvcml6b250YWwgc2l6ZSBvZiB0aGUgY29udHJvbCAocGl4ZWxzKS4gCi0gICAgICogICAgICAgIFNXVC5ERUZBVUxUIGluZGljYXRlcyB0aGF0IHRoZSBjb250cm9sJ3MgcHJlZmVycmVkIHNpemUgc2hvdWxkIGJlIHVzZWQuIEEgc2l6ZQotICAgICAqICAgICAgICBvZiAwIGhhcyBzcGVjaWFsIHNlbWFudGljcyBkZWZpbmVkIGJ5IEdyaWRMYXlvdXQuIAotICAgICAqIEBwYXJhbSBtaW5ZIG1pbmltdW0gYSB2YWx1ZSBvZiAxIG9yIG1vcmUgaXMgYSB2ZXJ0aWNhbCBzaXplIG9mIHRoZSBjb250cm9sIChwaXhlbHMpLiBTV1QuREVGQVVMVAotICAgICAqICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgY29udHJvbCdzIHByZWZlcnJlZCBzaXplIHNob3VsZCBiZSB1c2VkLiBBIHNpemUKLSAgICAgKiAgICAgICAgb2YgMCBoYXMgc3BlY2lhbCBzZW1hbnRpY3MgZGVmaW5lZCBieSBHcmlkTGF5b3V0LgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBHcmlkRGF0YUZhY3RvcnkgbWluU2l6ZShpbnQgbWluWCwgaW50IG1pblkpIHsKLSAgICAgICAgZGF0YS5taW5pbXVtV2lkdGggPSBtaW5YOwotICAgICAgICBkYXRhLm1pbmltdW1IZWlnaHQgPSBtaW5ZOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtaW5pbXVtIHNpemUgZm9yIHRoZSBjb250cm9sLiBUaGUgY29udHJvbCB3aWxsIG5vdCBiZSBwZXJtaXR0ZWQKLSAgICAgKiB0byBzaHJpbmsgYmVsb3cgdGhpcyBzaXplLiBOb3RlOiBHcmlkTGF5b3V0IHRyZWF0cyBhIG1pbmltdW0gc2l6ZSBvZiAwCi0gICAgICogYXMgYW4gdW5kb2N1bWVudGVkIHNwZWNpYWwgdmFsdWUsIHNvIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBtaW5pbXVtIHNpemUgCi0gICAgICogaXMgYSBzaXplIG9mIDEuIEEgbWluaW11bSBzaXplIG9mIFNXVC5ERUZBVUxUIGluZGljYXRlcyB0aGF0IHRoZSByZXN1bHQKLSAgICAgKiBvZiBjb21wdXRlU2l6ZShpbnQsIGludCwgYm9vbGVhbikgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGNvbnRyb2wncyBtaW5pbXVtCi0gICAgICogc2l6ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWluIG1pbmltdW0gc2l6ZSBvZiB0aGUgY29udHJvbAotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBHcmlkRGF0YUZhY3RvcnkgbWluU2l6ZShQb2ludCBtaW4pIHsKLSAgICAgICAgZGF0YS5taW5pbXVtV2lkdGggPSBtaW4ueDsKLSAgICAgICAgZGF0YS5taW5pbXVtSGVpZ2h0ID0gbWluLnk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc3RydWN0cyB0aGUgR3JpZExheW91dCB0byBpZ25vcmUgdGhpcyBjb250cm9sIHdoZW4gcGVyZm9ybWluZyBsYXlvdXRzLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2hvdWxkRXhjbHVkZSB0cnVlIGlmZiB0aGUgY29udHJvbCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBsYXlvdXRzCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIEdyaWREYXRhRmFjdG9yeSBleGNsdWRlKGJvb2xlYW4gc2hvdWxkRXhjbHVkZSkgewotICAgICAgICBkYXRhLmV4Y2x1ZGUgPSBzaG91bGRFeGNsdWRlOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEdyaWREYXRhIGluc3RhbmNlLiBBbGwgYXR0cmlidXRlcyBvZiB0aGUgR3JpZERhdGEgaW5zdGFuY2UKLSAgICAgKiB3aWxsIGJlIGluaXRpYWxpemVkIGJ5IHRoZSBmYWN0b3J5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgR3JpZERhdGEgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JpZERhdGEgY3JlYXRlKCkgewotICAgICAgICByZXR1cm4gY29weURhdGEoZGF0YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhlIHJlY2lldmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSByZWNpZXZlcgotICAgICAqLwotICAgIHB1YmxpYyBHcmlkRGF0YUZhY3RvcnkgY29weSgpIHsKLSAgICAJcmV0dXJuIG5ldyBHcmlkRGF0YUZhY3RvcnkoY3JlYXRlKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgZ2l2ZW4gR3JpZERhdGEgCi0gICAgICogCi0gICAgICogQHBhcmFtIGRhdGEgR3JpZERhdGEgdG8gY29weQotICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBhcmd1bWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgR3JpZERhdGEgY29weURhdGEoR3JpZERhdGEgZGF0YSkgewotICAgICAgICBHcmlkRGF0YSBuZXdEYXRhID0gbmV3IEdyaWREYXRhKGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCwgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCwgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlLCBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlLCBkYXRhLmhvcml6b250YWxTcGFuLAotICAgICAgICAgICAgICAgIGRhdGEudmVydGljYWxTcGFuKTsKLSAgICAgICAgbmV3RGF0YS5leGNsdWRlID0gZGF0YS5leGNsdWRlOwotICAgICAgICBuZXdEYXRhLmhlaWdodEhpbnQgPSBkYXRhLmhlaWdodEhpbnQ7Ci0gICAgICAgIG5ld0RhdGEuaG9yaXpvbnRhbEluZGVudCA9IGRhdGEuaG9yaXpvbnRhbEluZGVudDsKLSAgICAgICAgbmV3RGF0YS5taW5pbXVtSGVpZ2h0ID0gZGF0YS5taW5pbXVtSGVpZ2h0OwotICAgICAgICBuZXdEYXRhLm1pbmltdW1XaWR0aCA9IGRhdGEubWluaW11bVdpZHRoOwotICAgICAgICBuZXdEYXRhLnZlcnRpY2FsSW5kZW50ID0gZGF0YS52ZXJ0aWNhbEluZGVudDsKLSAgICAgICAgbmV3RGF0YS53aWR0aEhpbnQgPSBkYXRhLndpZHRoSGludDsKLQotICAgICAgICByZXR1cm4gbmV3RGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsYXlvdXQgZGF0YSBvbiB0aGUgZ2l2ZW4gY29udHJvbC4gQ3JlYXRlcyBhIG5ldyBHcmlkRGF0YSBpbnN0YW5jZSBhbmQKLSAgICAgKiBhc3NpZ25zIGl0IHRvIHRoZSBjb250cm9sIGJ5IGNhbGxpbmcgY29udHJvbC5zZXRMYXlvdXREYXRhLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIHdob3NlIGxheW91dCBkYXRhIHdpbGwgYmUgaW5pdGlhbGl6ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBseVRvKENvbnRyb2wgY29udHJvbCkgewotICAgICAgICBjb250cm9sLnNldExheW91dERhdGEoY3JlYXRlKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbGF5b3V0L0dyaWRMYXlvdXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9sYXlvdXQvR3JpZExheW91dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzMzZhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9sYXlvdXQvR3JpZExheW91dEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEdyaWRMYXlvdXRGYWN0b3J5IGNyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGdyaWQgbGF5b3V0cy4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSBHcmlkTGF5b3V0RmFjdG9yeS4KLSAqIE5vcm1hbGx5LCBpdCBpcyB1c2VkIGFzIGEgc2hvcnRoYW5kIGZvciB3cml0aW5nICJuZXcgR3JpZExheW91dCgpIiBhbmQgaW5pdGlhbGl6aW5nIGEgYnVuY2ggCi0gKiBvZiBmaWVsZHMuIEluIHRoaXMgY2FzZSB0aGUgbWFpbiBiZW5lZml0IGlzIGEgbW9yZSBjb25jaXNlIHN5bnRheCBhbmQgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIG1vcmUKLSAqIHRoYW4gb25lIGlkZW50aWNhbCBHcmlkTGF5b3V0IGZyb20gdGhlIHNhbWUgZmFjdG9yeS4gQ2hhbmdpbmcgYSBwcm9wZXJ0eSBvZiB0aGUgZmFjdG9yeSB3aWxsIGFmZmVjdAotICogZnV0dXJlIGxheW91dHMgY3JlYXRlZCBieSB0aGUgZmFjdG9yeSwgYnV0IGhhcyBubyBlZmZlY3Qgb24gbGF5b3V0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuCi0gKiAKLSAqIDxwPgotICogR3JpZExheW91dEZhY3RvcnkgY2FuIGFsc28gZ2VuZXJhdGUgZ3JpZCBkYXRhIGZvciBhbGwgdGhlIGNvbnRyb2xzIGluIGEgbGF5b3V0LiBUaGlzIGlzIGRvbmUgd2l0aAotICogdGhlIGdlbmVyYXRlTGF5b3V0IG1ldGhvZC4gVG8gdXNlIHRoaXMgZmVhdHVyZToKLSAqIDwvcD4KLSAqIAotICogPG9sPgotICogPGxpPkNyZWF0ZSB0aGUgY29tcG9zaXRlPC9saT4KLSAqIDxsaT5DcmVhdGUgYWxsIHRoZSBjb250cm9scyBpbiB0aGUgY29tcG9zaXRlPC9saT4KLSAqIDxsaT5DYWxsIGdlbmVyYXRlTGF5b3V0PC9saT4KLSAqIDwvb2w+Ci0gKiAKLSAqIDxwPgotICogVGhlIG9yZGVyIGhlcmUgaXMgaW1wb3J0YW50LiBnZW5lcmF0ZUxheW91dCBtdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgdGhlIGNoaWxkIGNvbnRyb2xzIGhhdmUKLSAqIGJlZW4gY3JlYXRlZC4gZ2VuZXJhdGVMYXlvdXQgd2lsbCBub3QgY2hhbmdlIGFueSBsYXlvdXQgZGF0YSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYXR0YWNoZWQKLSAqIHRvIGEgY2hpbGQgY29udHJvbCBhbmQgaXQgd2lsbCBub3QgcmVjdXJzZSBpbnRvIG5lc3RlZCBjb21wb3NpdGVzLiAKLSAqIDwvcD4KLSAqCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBHcmlkTGF5b3V0RmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogVGVtcGxhdGUgbGF5b3V0LiBUaGUgZmFjdG9yeSB3aWxsIGNyZWF0ZSBjb3BpZXMgb2YgdGhpcyBsYXlvdXQuIAotCSAqLwotICAgIHByaXZhdGUgR3JpZExheW91dCBsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBHcmlkTGF5b3V0RmFjdG9yeSB0aGF0IHdpbGwgY3JlYXRlIGNvcGllcyBvZiB0aGUgZ2l2ZW4gbGF5b3V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBsIGxheW91dCB0byBjb3B5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBHcmlkTGF5b3V0RmFjdG9yeShHcmlkTGF5b3V0IGwpIHsKLSAgICAgICAgdGhpcy5sID0gbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgY29waWVzIG9mIHRoZSBnaXZlbiBsYXlvdXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGwgbGF5b3V0IHRvIGNvcHkKLSAgICAgKiBAcmV0dXJuIGEgbmV3IEdyaWRMYXlvdXRGYWN0b3J5IGluc3RhbmNlIHRoYXQgY3JlYXRlcyBjb3BpZXMgb2YgdGhlIGdpdmVuIGxheW91dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgR3JpZExheW91dEZhY3RvcnkgY3JlYXRlRnJvbShHcmlkTGF5b3V0IGwpIHsKLSAgICAJcmV0dXJuIG5ldyBHcmlkTGF5b3V0RmFjdG9yeShjb3B5TGF5b3V0KGwpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhlIHJlY2lldmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSByZWNpZXZlcgotICAgICAqLwotICAgIHB1YmxpYyBHcmlkTGF5b3V0RmFjdG9yeSBjb3B5KCkgewotICAgIAlyZXR1cm4gbmV3IEdyaWRMYXlvdXRGYWN0b3J5KGNyZWF0ZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEdyaWRMYXlvdXRGYWN0b3J5IHRoYXQgY3JlYXRlcyBHcmlkTGF5b3V0cyB3aXRoIHRoZSBkZWZhdWx0IFNXVAotICAgICAqIHZhbHVlcy4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBJbml0aWFsIHZhbHVlcyBhcmU6Ci0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+bnVtQ29sdW1ucygxKTwvbGk+Ci0gICAgICogPGxpPm1hcmdpbnMoNSw1KTwvbGk+Ci0gICAgICogPGxpPnNwYWNpbmcoNSw1KTwvbGk+Ci0gICAgICogPGxpPmVxdWFsV2lkdGgoZmFsc2UpPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBHcmlkTGF5b3V0RmFjdG9yeSB0aGF0IGNyZWF0ZXMgR3JpZExheW91dHMgYXMgdGhvdWdoIGNyZWF0ZWQgd2l0aAotICAgICAqIHRoZWlyIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgKiBAc2VlICNmaWxsRGVmYXVsdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEdyaWRMYXlvdXRGYWN0b3J5IHN3dERlZmF1bHRzKCkgewotICAgIAlyZXR1cm4gbmV3IEdyaWRMYXlvdXRGYWN0b3J5KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBHcmlkTGF5b3V0RmFjdG9yeSB0aGF0IGNyZWF0ZXMgR3JpZExheW91dHMgd2l0aCBubyBtYXJnaW5zIGFuZCAKLSAgICAgKiBkZWZhdWx0IGRpYWxvZyBzcGFjaW5nLgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIEluaXRpYWwgdmFsdWVzIGFyZToKLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHVsPgotICAgICAqIDxsaT5udW1Db2x1bW5zKDEpPC9saT4KLSAgICAgKiA8bGk+bWFyZ2lucygwLDApPC9saT4KLSAgICAgKiA8bGk+c3BhY2luZyhMYXlvdXRDb25zdGFudHMuZ2V0U3BhY2luZygpKTwvbGk+Ci0gICAgICogPGxpPmVxdWFsV2lkdGgoZmFsc2UpPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBHcmlkTGF5b3V0RmFjdG9yeSB0aGF0IGNyZWF0ZXMgR3JpZExheW91dHMgYXMgdGhvdWdoIGNyZWF0ZWQgd2l0aAotICAgICAqIHRoZWlyIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgKiBAc2VlICNzd3REZWZhdWx0cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgR3JpZExheW91dEZhY3RvcnkgZmlsbERlZmF1bHRzKCkgewotICAgIAlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBQb2ludCBkZWZhdWx0U3BhY2luZyA9IExheW91dENvbnN0YW50cy5nZXRTcGFjaW5nKCk7Ci0gICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGRlZmF1bHRTcGFjaW5nLng7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBkZWZhdWx0U3BhY2luZy55OwotICAgICAgICByZXR1cm4gbmV3IEdyaWRMYXlvdXRGYWN0b3J5KGxheW91dCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGUgY29sdW1ucyBzaG91bGQgYmUgZm9yY2VkIHRvIGJlIGVxdWFsIHdpZHRoCi0gICAgICogCi0gICAgICogQHBhcmFtIGVxdWFsIHRydWUgaWZmIHRoZSBjb2x1bW5zIHNob3VsZCBiZSBmb3JjZWQgdG8gYmUgZXF1YWwgd2lkdGgKLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JpZExheW91dEZhY3RvcnkgZXF1YWxXaWR0aChib29sZWFuIGVxdWFsKSB7Ci0gICAgICAgIGwubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZXF1YWw7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNwYWNpbmcgZm9yIGxheW91dHMgY3JlYXRlZCB3aXRoIHRoaXMgZmFjdG9yeS4gVGhlIHNwYWNpbmcKLSAgICAgKiBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBjZWxscyB3aXRoaW4gdGhlIGxheW91dC4gCi0gICAgICogCi0gICAgICogQHBhcmFtIGhTcGFjaW5nIGhvcml6b250YWwgc3BhY2luZyAocGl4ZWxzKQotICAgICAqIEBwYXJhbSB2U3BhY2luZyB2ZXJ0aWNhbCBzcGFjaW5nIChwaXhlbHMpCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICogQHNlZSAjbWFyZ2lucwotICAgICAqLwotICAgIHB1YmxpYyBHcmlkTGF5b3V0RmFjdG9yeSBzcGFjaW5nKGludCBoU3BhY2luZywgaW50IHZTcGFjaW5nKSB7Ci0gICAgICAgIGwuaG9yaXpvbnRhbFNwYWNpbmcgPSBoU3BhY2luZzsKLSAgICAgICAgbC52ZXJ0aWNhbFNwYWNpbmcgPSB2U3BhY2luZzsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3BhY2luZyBmb3IgbGF5b3V0cyBjcmVhdGVkIHdpdGggdGhpcyBmYWN0b3J5LiBUaGUgc3BhY2luZwotICAgICAqIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGNlbGxzIHdpdGhpbiB0aGUgbGF5b3V0LiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3BhY2luZyBzcGFjZSBiZXR3ZWVuIGNvbnRyb2xzIGluIHRoZSBsYXlvdXQgKHBpeGVscykKLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKiBAc2VlICNtYXJnaW5zCi0gICAgICovCi0gICAgcHVibGljIEdyaWRMYXlvdXRGYWN0b3J5IHNwYWNpbmcoUG9pbnQgc3BhY2luZykgewotICAgICAgICBsLmhvcml6b250YWxTcGFjaW5nID0gc3BhY2luZy54OwotICAgICAgICBsLnZlcnRpY2FsU3BhY2luZyA9IHNwYWNpbmcueTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWFyZ2lucyBmb3IgbGF5b3V0cyBjcmVhdGVkIHdpdGggdGhpcyBmYWN0b3J5LiBUaGUgbWFyZ2lucwotICAgICAqIGFyZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgb3V0ZXIgY2VsbHMgYW5kIHRoZSBlZGdlIG9mIHRoZSBsYXlvdXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcmdpbnMgbWFyZ2luIHNpemUgKHBpeGVscykKLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKiBAc2VlICNzcGFjaW5nCi0gICAgICovCi0gICAgcHVibGljIEdyaWRMYXlvdXRGYWN0b3J5IG1hcmdpbnMoUG9pbnQgbWFyZ2lucykgewotICAgICAgICBsLm1hcmdpbldpZHRoID0gbWFyZ2lucy54OwotICAgICAgICBsLm1hcmdpbkhlaWdodCA9IG1hcmdpbnMueTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWFyZ2lucyBmb3IgbGF5b3V0cyBjcmVhdGVkIHdpdGggdGhpcyBmYWN0b3J5LiBUaGUgbWFyZ2lucwotICAgICAqIGFyZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgb3V0ZXIgY2VsbHMgYW5kIHRoZSBlZGdlIG9mIHRoZSBsYXlvdXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHggaG9yaXpvbnRhbCBtYXJnaW4gc2l6ZSAocGl4ZWxzKQotICAgICAqIEBwYXJhbSB5IHZlcnRpY2FsIG1hcmdpbiBzaXplIChwaXhlbHMpCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICogQHNlZSAjc3BhY2luZwotICAgICAqLwotICAgIHB1YmxpYyBHcmlkTGF5b3V0RmFjdG9yeSBtYXJnaW5zKGludCB4LCBpbnQgeSkgewotICAgICAgICBsLm1hcmdpbldpZHRoID0geDsKLSAgICAgICAgbC5tYXJnaW5IZWlnaHQgPSB5OwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbGF5b3V0Ci0gICAgICogCi0gICAgICogQHBhcmFtIG51bUNvbHVtbnMgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGxheW91dAotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBHcmlkTGF5b3V0RmFjdG9yeSBudW1Db2x1bW5zKGludCBudW1Db2x1bW5zKSB7Ci0gICAgICAgIGwubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgR3JpZExheW91dCwgYW5kIGluaXRpYWxpemVzIGl0IHdpdGggdmFsdWVzIGZyb20gdGhlIGZhY3RvcnkuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBpbml0aWFsaXplZCBHcmlkTGF5b3V0LgotICAgICAqIEBzZWUgI2FwcGx5VG8KLSAgICAgKi8KLSAgICBwdWJsaWMgR3JpZExheW91dCBjcmVhdGUoKSB7Ci0gICAgICAgIHJldHVybiBjb3B5TGF5b3V0KGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgR3JpZExheW91dCBhbmQgYXR0YWNoZXMgaXQgdG8gdGhlIGdpdmVuIGNvbXBvc2l0ZS4KLSAgICAgKiBEb2VzIG5vdCBjcmVhdGUgdGhlIEdyaWREYXRhIG9mIGFueSBvZiB0aGUgY29udHJvbHMgaW4gdGhlIGNvbXBvc2l0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyBjb21wb3NpdGUgd2hvc2UgbGF5b3V0IHdpbGwgYmUgc2V0Ci0gICAgICogQHNlZSAjZ2VuZXJhdGVMYXlvdXQKLSAgICAgKiBAc2VlICNjcmVhdGUKLSAgICAgKiBAc2VlIEdyaWRMYXlvdXRGYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwbHlUbyhDb21wb3NpdGUgYykgewotICAgICAgICBjLnNldExheW91dChjb3B5TGF5b3V0KGwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGdpdmVuIEdyaWRMYXlvdXQgaW5zdGFuY2UKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCBsYXlvdXQgdG8gY29weQotICAgICAqIEByZXR1cm4gYSBuZXcgR3JpZExheW91dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgR3JpZExheW91dCBjb3B5TGF5b3V0KEdyaWRMYXlvdXQgbCkgewotICAgICAgICBHcmlkTGF5b3V0IHJlc3VsdCA9IG5ldyBHcmlkTGF5b3V0KGwubnVtQ29sdW1ucywgbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGgpOwotICAgICAgICByZXN1bHQuaG9yaXpvbnRhbFNwYWNpbmcgPSBsLmhvcml6b250YWxTcGFjaW5nOwotICAgICAgICByZXN1bHQubWFyZ2luQm90dG9tID0gbC5tYXJnaW5Cb3R0b207Ci0gICAgICAgIHJlc3VsdC5tYXJnaW5IZWlnaHQgPSBsLm1hcmdpbkhlaWdodDsKLSAgICAgICAgcmVzdWx0Lm1hcmdpbkxlZnQgPSBsLm1hcmdpbkxlZnQ7Ci0gICAgICAgIHJlc3VsdC5tYXJnaW5SaWdodCA9IGwubWFyZ2luUmlnaHQ7Ci0gICAgICAgIHJlc3VsdC5tYXJnaW5Ub3AgPSBsLm1hcmdpblRvcDsKLSAgICAgICAgcmVzdWx0Lm1hcmdpbldpZHRoID0gbC5tYXJnaW5XaWR0aDsKLSAgICAgICAgcmVzdWx0LnZlcnRpY2FsU3BhY2luZyA9IGwudmVydGljYWxTcGFjaW5nOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwbGllcyB0aGlzIGxheW91dCB0byB0aGUgZ2l2ZW4gY29tcG9zaXRlLCBhbmQgYXR0YWNoZXMgZGVmYXVsdCBHcmlkRGF0YQotICAgICAqIHRvIGFsbCBpbW1lZGlhdGUgY2hpbGRyZW4gdGhhdCBkb24ndCBoYXZlIG9uZS4gVGhlIGxheW91dCBpcyBnZW5lcmF0ZWQgdXNpbmcgCi0gICAgICogaGV1cmlzdGljcyBiYXNlZCBvbiB0aGUgd2lkZ2V0IHR5cGVzLiBJbiBtb3N0IGNhc2VzLCBpdCB3aWxsIGNyZWF0ZSBleGFjdGx5IHRoZSBzYW1lCi0gICAgICogbGF5b3V0IHRoYXQgd291bGQgaGF2ZSBiZWVuIGhhcmRjb2RlZCBieSB0aGUgcHJvZ3JhbW1lci4gSW4gYW55IHNpdHVhdGlvbgotICAgICAqIHdoZXJlIGl0IGRvZXMgbm90IHByb2R1Y2UgdGhlIGRlc2lyZWQgbGF5b3V0LCB0aGUgR3JpZERhdGEgZm9yIGFueSBjaGlsZCBjYW4gYmUgCi0gICAgICogb3ZlcnJpZGRlbiBieSBhdHRhY2hpbmcgdGhlIGxheW91dCBkYXRhIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLiBJbiB0aGVzZSBjYXNlcywKLSAgICAgKiB0aGUgc3BlY2lhbC1jYXNlIGxheW91dCBkYXRhIGNhbiBiZSBoYXJkY29kZWQgYW5kIHRoZSBhbGdvcml0aG0gY2FuIHN1cHBseSBkZWZhdWx0cwotICAgICAqIHRvIHRoZSByZXN0LgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgPGI+QUZURVI8L2I+IGFsbCBvZiB0aGUgY2hpbGQgY29udHJvbHMgaGF2ZSBiZWVuIGNyZWF0ZWQgYW5kIHRoZWlyCi0gICAgICogbGF5b3V0cyBhdHRhY2hlZC4gVGhpcyBtZXRob2Qgd2lsbCBhdHRhY2ggYSBsYXlvdXQgdG8gdGhlIGdpdmVuIGNvbXBvc2l0ZS4gSWYgYW55IG5ldyAKLSAgICAgKiBjaGlsZHJlbiBhcmUgY3JlYXRlZCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0aGVpciBHcmlkRGF0YSBtdXN0IGJlIGNyZWF0ZWQgbWFudWFsbHkuIAotICAgICAqIFRoZSBhbGdvcml0aG0gZG9lcyBub3QgcmVjdXJzZSBpbnRvIGNoaWxkIGNvbXBvc2l0ZXMuIFRvIGdlbmVyYXRlIGFsbCB0aGUgbGF5b3V0cyBpbgotICAgICAqIGEgd2lkZ2V0IGhpZXJhcmNoeSwgdGhlIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBib3R0b20tdXAgZm9yIGVhY2ggQ29tcG9zaXRlLiAgIAotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgY29udHJvbHMgYXJlIG1hZGUgdG8gc3BhbiBhIHNpbmdsZSBjZWxsLiBUaGUgYWxnb3JpdGhtIHRyaWVzIHRvIGNsYXNzaWZ5IGNvbnRyb2xzIGludG8gb25lIAotICAgICAqIG9mIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcmllczoKLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHVsPgotICAgICAqIDxsaT5QdXNoYnV0dG9uczogU2V0IHRvIGEgY29uc3RhbnQgc2l6ZSBsYXJnZSBlbm91Z2ggdG8gZml0IHRoZWlyIHRleHQgYW5kIG5vIHNtYWxsZXIKLSAgICAgKiB0aGFuIHRoZSBkZWZhdWx0IGJ1dHRvbiBzaXplLjwvbGk+Ci0gICAgICogPGxpPldyYXBwaW5nIHdpdGggdGV4dCAobGFiZWxzLCByZWFkLW9ubHkgdGV4dCBib3hlcywgZXRjLik6IG92ZXJyaWRlIHRoZSBwcmVmZXJyZWQgaG9yaXpvbnRhbCAKLSAgICAgKiAgICAgc2l6ZSB3aXRoIHRoZSBkZWZhdWx0IHdyYXBwaW5nIHBvaW50LCBmaWxsIGhvcml6b250YWxseSwgZ3JhYiBob3Jpem9udGFsIHNwYWNlLCBrZWVwIHRoZQotICAgICAqICAgICBwcmVmZXJyZWQgdmVydGljYWwgc2l6ZTwvbGk+Ci0gICAgICogPGxpPldyYXBwaW5nIHdpdGhvdXQgdGV4dCAodG9vbGJhcnMsIGNvb2xiYXJzLCBldGMuKTogZmlsbCBhbGlnbiwgZG9uJ3QgZ3JhYiwgdXNlIHRoZSBwcmVmZXJyZWQgc2l6ZTwvbGk+Ci0gICAgICogPGxpPkhvcml6b250YWxseSBzY3JvbGxpbmcgY29udHJvbHMgKGFueXRoaW5nIHdpdGggaG9yaXpvbnRhbCBzY3JvbGxiYXJzIG9yIHdoZXJlIHRoZSB1c2VyIGVkaXRzCi0gICAgICogICAgIHRleHQgYW5kIGNhbiBjdXJzb3IgdGhyb3VnaCBpdCBmcm9tIGxlZnQtdG8tcmlnaHQpOiBvdmVycmlkZSB0aGUgcHJlZmVycmVkIGhvcml6b250YWwgc2l6ZSB3aXRoCi0gICAgICogICAgIGEgY29uc3RhbnQsIGdyYWIgaG9yaXpvbnRhbCwgZmlsbCBob3Jpem9udGFsLjwvbGk+Ci0gICAgICogPGxpPlZlcnRpY2FsbHkgc2Nyb2xsaW5nIGNvbnRyb2xzIChhbnl0aGluZyB3aXRoIHZlcnRpY2FsIHNjcm9sbGJhcnMgb3Igd2hlcmUgdGhlIHVzZXIgZWRpdHMKLSAgICAgKiAgICAgdGV4dCBhbmQgY2FuIGN1cnNvciB0aHJvdWdoIGl0IHVwIGFuZCBkb3duKTogb3ZlcnJpZGUgdGhlIHByZWZlcnJlZCB2ZXJ0aWNhbCBzaXplIHdpdGggYSBjb25zdGFudCwKLSAgICAgKiAgICAgZ3JhYiB2ZXJ0aWNhbCwgZmlsbCB2ZXJ0aWNhbDwvbGk+Ci0gICAgICogPGxpPk5lc3RlZCBsYXlvdXRzOiBmaWxsIGFsaWduIGJvdGggZGlyZWN0aW9ucywgZ3JhYiBhbG9uZyBhbnkgZGltZW5zaW9uIGlmIHRoZSBsYXlvdXQgd291bGQKLSAgICAgKiAgICAgYmUgYWJsZSB0byBleHBhbmQgYWxvbmcgdGhhdCBkaW1lbnNpb24uPC9saT4KLSAgICAgKiA8bGk+Tm9uLXdyYXBwaW5nIG5vbi1zY3JvbGxhYmxlIHJlYWQtb25seSB0ZXh0OiBmaWxsIGhvcml6b250YWxseSwgY2VudGVyIHZlcnRpY2FsbHksIGRlZmF1bHQgc2l6ZSwgZG9uJ3QgZ3JhYiA8L2xpPgotICAgICAqIDxsaT5Ob24td3JhcHBpbmcgbm9uLXNjcm9sbGFibGUgbm9uLXRleHQ6IGZpbGwgYm90aCwgZGVmYXVsdCBzaXplLCBkb24ndCBncmFiPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBwYXJhbSBjIGNvbXBvc2l0ZSB3aG9zZSBsYXlvdXQgd2lsbCBiZSBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUxheW91dChDb21wb3NpdGUgYykgewotICAgICAgICBhcHBseVRvKGMpOwotICAgICAgICBMYXlvdXRHZW5lcmF0b3IuZ2VuZXJhdGVMYXlvdXQoYyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbGF5b3V0L0xheW91dENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbGF5b3V0L0xheW91dENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBmNTBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2xheW91dC9MYXlvdXRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBDb250YWlucyB2YXJpb3VzIGxheW91dCBjb25zdGFudHMKLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGF5b3V0Q29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBQb2ludCBkaWFsb2dNYXJnaW5zID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBQb2ludCBkaWFsb2dTcGFjaW5nID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBQb2ludCBtaW5CdXR0b25TaXplID0gbnVsbDsKLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYWxpemVDb25zdGFudHMoKSB7Ci0JCWlmIChkaWFsb2dNYXJnaW5zICE9IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJR0MgZ2MgPSBuZXcgR0MoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQlnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCUZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQotCQlkaWFsb2dNYXJnaW5zID0gbmV3IFBvaW50KERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTiksCi0JCQkJRGlhbG9nLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pKTsKLQotCQlkaWFsb2dTcGFjaW5nID0gbmV3IFBvaW50KERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpLAotCQkJCURpYWxvZy5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsIElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORykpOwotCi0JCW1pbkJ1dHRvblNpemUgID0gbmV3IFBvaW50KERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpLCAwKTsKLQkJCi0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBkaWFsb2cgbWFyZ2lucywgaW4gcGl4ZWxzCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBkaWFsb2cgbWFyZ2lucywgaW4gcGl4ZWxzCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBQb2ludCBnZXRNYXJnaW5zKCkgewotICAgIAlpbml0aWFsaXplQ29uc3RhbnRzKCk7Ci0gICAgCXJldHVybiBkaWFsb2dNYXJnaW5zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgZGlhbG9nIHNwYWNpbmcsIGluIHBpeGVscwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZGlhbG9nIHNwYWNpbmcsIGluIHBpeGVscwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUG9pbnQgZ2V0U3BhY2luZygpIHsKLSAgICAJaW5pdGlhbGl6ZUNvbnN0YW50cygpOwotICAgIAlyZXR1cm4gZGlhbG9nU3BhY2luZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG1pbmltdW0gYnV0dG9uIHNpemUsIGluIHBpeGVscwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgbWluaW11bSBidXR0b24gc2l6ZSwgaW4gcGl4ZWxzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBQb2ludCBnZXRNaW5CdXR0b25TaXplKCkgewotICAgIAlpbml0aWFsaXplQ29uc3RhbnRzKCk7Ci0gICAgCXJldHVybiBtaW5CdXR0b25TaXplOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2xheW91dC9MYXlvdXRHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2xheW91dC9MYXlvdXRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkZGJjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9sYXlvdXQvTGF5b3V0R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkdlb21ldHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxhYmxlOwotCi0vKiBwYWNrYWdlICovY2xhc3MgTGF5b3V0R2VuZXJhdG9yIHsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgc2l6ZSBmb3IgY29udHJvbHMgd2l0aCB2YXJ5aW5nIGNvbnRlbnRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUG9pbnQgZGVmYXVsdFNpemUgPSBuZXcgUG9pbnQoMTUwLCAxNTApOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCB3cmFwcGluZyBzaXplIGZvciB3cmFwcGVkIGxhYmVscwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCB3cmFwU2l6ZSA9IDM1MDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEdyaWREYXRhRmFjdG9yeSBub25XcmFwcGluZ0xhYmVsRGF0YSA9IEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5hbGlnbihTV1QuQkVHSU5OSU5HLCBTV1QuQ0VOVEVSKS5ncmFiKGZhbHNlLCBmYWxzZSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1N0eWxlKENvbnRyb2wgYywgaW50IHN0eWxlKSB7Ci0gICAgICAgIHJldHVybiAoYy5nZXRTdHlsZSgpICYgc3R5bGUpICE9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgR3JpZExheW91dCBmb3IgdGhlIGdpdmVuIGNvbXBvc2l0ZSBieSBleGFtaW5pbmcgaXRzIGNoaWxkCi0gICAgICogY29udHJvbHMgYW5kIGF0dGFjaGluZyBsYXlvdXQgZGF0YSB0byBhbnkgaW1tZWRpYXRlIGNoaWxkcmVuIHRoYXQgZG8gbm90Ci0gICAgICogYWxyZWFkeSBoYXZlIGxheW91dCBkYXRhLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b0dlbmVyYXRlCi0gICAgICogICAgICAgICAgICBjb21wb3NpdGUgdG8gZ2VuZXJhdGUgYSBsYXlvdXQgZm9yCi0gICAgICogQHBhcmFtIGNvbHVtbnMKLSAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBjb2x1bW5zIGZvciB0aGUgbGF5b3V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlTGF5b3V0KENvbXBvc2l0ZSB0b0dlbmVyYXRlKSB7Ci0gICAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IHRvR2VuZXJhdGUuZ2V0Q2hpbGRyZW4oKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBjaGlsZHJlbltpXTsKLQotICAgICAgICAgICAgLy8gU2tpcCBhbnkgY2hpbGRyZW4gdGhhdCBhbHJlYWR5IGhhdmUgbGF5b3V0IGRhdGEKLSAgICAgICAgICAgIGlmIChjb250cm9sLmdldExheW91dERhdGEoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFwcGx5TGF5b3V0RGF0YVRvKGNvbnRyb2wpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseUxheW91dERhdGFUbyhDb250cm9sIGNvbnRyb2wpIHsKLSAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBCdXR0b24pIHsKLSAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBjb250cm9sOwotCi0gICAgICAgICAgICBpZiAoaGFzU3R5bGUoYnV0dG9uLCBTV1QuQ0hFQ0spKSB7Ci0gICAgICAgICAgICAgICAgbm9uV3JhcHBpbmdMYWJlbERhdGEuYXBwbHlUbyhidXR0b24pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuYWxpZ24oU1dULkZJTEwsIFNXVC5DRU5URVIpLmhpbnQoR2VvbWV0cnkubWF4KGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLCBMYXlvdXRDb25zdGFudHMuZ2V0TWluQnV0dG9uU2l6ZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBseVRvKGJ1dHRvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiAoY29udHJvbCBpbnN0YW5jZW9mIExhYmVsKSB7Ci0gICAgICAgIC8vIExhYmVsIGxhYmVsID0gKExhYmVsKSBjb250cm9sOwotICAgICAgICAvLwkJCQotICAgICAgICAvLyBpZiAoaGFzU3R5bGUobGFiZWwsIFNXVC5XUkFQKSkgewotICAgICAgICAvLyB3cmFwcGluZ0xhYmVsRGF0YS5hcHBseVRvKGxhYmVsKTsKLSAgICAgICAgLy8gfSBlbHNlIHsKLSAgICAgICAgLy8gbm9uV3JhcHBpbmdMYWJlbERhdGEuYXBwbHlUbyhsYWJlbCk7Ci0gICAgICAgIC8vIH0KLSAgICAgICAgLy8gcmV0dXJuOwotICAgICAgICAvLyB9Ci0KLSAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBTY3JvbGxhYmxlKSB7Ci0gICAgICAgICAgICBTY3JvbGxhYmxlIHNjcm9sbGFibGUgPSAoU2Nyb2xsYWJsZSkgY29udHJvbDsKLQotICAgICAgICAgICAgaWYgKHNjcm9sbGFibGUgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLSAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc2Nyb2xsYWJsZTsKLQotICAgICAgICAgICAgICAgIExheW91dCB0aGVMYXlvdXQgPSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoZUxheW91dCBpbnN0YW5jZW9mIEdyaWRMYXlvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBncm93c0hvcml6b250YWxseSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGdyb3dzVmVydGljYWxseSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGNoaWxkLmdldExheW91dERhdGEoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvd3NIb3Jpem9udGFsbHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93c1ZlcnRpY2FsbHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5ncmFiKGdyb3dzSG9yaXpvbnRhbGx5LCBncm93c1ZlcnRpY2FsbHkpLmFwcGx5VG8oY29udHJvbCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHdyYXBwaW5nID0gaGFzU3R5bGUoY29udHJvbCwgU1dULldSQVApOwotCi0gICAgICAgIC8vIEFzc3VtZSBhbnkgY29udHJvbCB3aXRoIHRoZSBIX1NDUk9MTCBvciBWX1NDUk9MTCBmbGFncyBhcmUKLSAgICAgICAgLy8gaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkKLSAgICAgICAgLy8gc2Nyb2xsYWJsZSwgcmVzcGVjdGl2ZWx5LgotICAgICAgICBib29sZWFuIGhTY3JvbGwgPSBoYXNTdHlsZShjb250cm9sLCBTV1QuSF9TQ1JPTEwpOwotICAgICAgICBib29sZWFuIHZTY3JvbGwgPSBoYXNTdHlsZShjb250cm9sLCBTV1QuVl9TQ1JPTEwpOwotCi0gICAgICAgIGJvb2xlYW4gY29udGFpbnNUZXh0ID0gaGFzTWV0aG9kKGNvbnRyb2wsICJzZXRUZXh0IiwgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MgfSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyBJZiB0aGUgY29udHJvbCBoYXMgYSBzZXRUZXh0IG1ldGhvZCwgYW4gYWRkTW9kaWZ5TGlzdGVuZXIgbWV0aG9kLCBhbmQKLSAgICAgICAgLy8gZG9lcyBub3QgaGF2ZQotICAgICAgICAvLyB0aGUgU1dULlJFQURfT05MWSBmbGFnLCBhc3N1bWUgaXQgY29udGFpbnMgdXNlci1lZGl0YWJsZSB0ZXh0LgotICAgICAgICBib29sZWFuIHVzZXJFZGl0YWJsZSA9ICFoYXNTdHlsZShjb250cm9sLCBTV1QuUkVBRF9PTkxZKSAmJiBjb250YWluc1RleHQgJiYgaGFzTWV0aG9kKGNvbnRyb2wsICJhZGRNb2RpZnlMaXN0ZW5lciIsIG5ldyBDbGFzc1tdIHsgTW9kaWZ5TGlzdGVuZXIuY2xhc3MgfSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyBGb3IgY29udHJvbHMgY29udGFpbmluZyB1c2VyLWVkaXRhYmxlIHRleHQuLi4KLSAgICAgICAgaWYgKHVzZXJFZGl0YWJsZSkgewotICAgICAgICAgICAgaWYgKGhhc1N0eWxlKGNvbnRyb2wsIFNXVC5NVUxUSSkpIHsKLSAgICAgICAgICAgICAgICB2U2Nyb2xsID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCF3cmFwcGluZykgewotICAgICAgICAgICAgICAgIGhTY3JvbGwgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29tcHV0ZSB0aGUgaG9yaXpvbnRhbCBoaW50Ci0gICAgICAgIGludCBoSGludCA9IFNXVC5ERUZBVUxUOwotICAgICAgICBib29sZWFuIGdyYWJIb3Jpem9udGFsID0gaFNjcm9sbDsKLQotICAgICAgICAvLyBGb3IgaG9yaXpvbnRhbGx5LXNjcm9sbGFibGUgY29udHJvbHMsIG92ZXJyaWRlIHRoZWlyIGhvcml6b250YWwKLSAgICAgICAgLy8gcHJlZmVycmVkIHNpemUKLSAgICAgICAgLy8gd2l0aCBhIGNvbnN0YW50Ci0gICAgICAgIGlmIChoU2Nyb2xsKSB7Ci0gICAgICAgICAgICBoSGludCA9IGRlZmF1bHRTaXplLng7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBGb3Igd3JhcHBpbmcgY29udHJvbHMsIHRoZXJlIGFyZSB0d28gY2FzZXMuCi0gICAgICAgICAgICAvLyAxLiBGb3IgY29udHJvbHMgdGhhdCBjb250YWluIHRleHQgKGxpa2Ugd3JhcHBpbmcgbGFiZWxzLAotICAgICAgICAgICAgLy8gcmVhZC1vbmx5IHRleHQgYm94ZXMsCi0gICAgICAgICAgICAvLyBldGMuKSBvdmVycmlkZSB0aGVpciBwcmVmZXJyZWQgc2l6ZSB3aXRoIHRoZSBwcmVmZXJyZWQgd3JhcHBpbmcKLSAgICAgICAgICAgIC8vIHBvaW50IGFuZAotICAgICAgICAgICAgLy8gbWFrZSB0aGVtIGdyYWIgaG9yaXpvbnRhbCBzcGFjZS4KLSAgICAgICAgICAgIC8vIDIuIEZvciBub24tdGV4dCBjb250cm9scyAobGlrZSB3cmFwcGluZyB0b29sYmFycyksIGFzc3VtZSB0aGF0Ci0gICAgICAgICAgICAvLyB0aGVpciBub24td3JhcHBlZAotICAgICAgICAgICAgLy8gc2l6ZSBpcyBiZXN0LgotCi0gICAgICAgICAgICBpZiAod3JhcHBpbmcpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNUZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGhIaW50ID0gd3JhcFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgdkFsaWduID0gU1dULkZJTEw7Ci0KLSAgICAgICAgLy8gSGV1cmlzdGljIGZvciBsYWJlbHM6IENvbnRyb2xzIHRoYXQgY29udGFpbiBub24td3JhcHBpbmcgcmVhZC1vbmx5Ci0gICAgICAgIC8vIHRleHQgc2hvdWxkIGJlCi0gICAgICAgIC8vIGNlbnRlci1hbGlnbmVkIHJhdGhlciB0aGFuIGZpbGwtYWxpZ25lZAotICAgICAgICBpZiAoIXZTY3JvbGwgJiYgIXdyYXBwaW5nICYmICF1c2VyRWRpdGFibGUgJiYgY29udGFpbnNUZXh0KSB7Ci0gICAgICAgICAgICB2QWxpZ24gPSBTV1QuQ0VOVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmdyYWIoZ3JhYkhvcml6b250YWwsIHZTY3JvbGwpLmFsaWduKFNXVC5GSUxMLCB2QWxpZ24pLmhpbnQoaEhpbnQsIHZTY3JvbGwgPyBkZWZhdWx0U2l6ZS55IDogU1dULkRFRkFVTFQpLmFwcGx5VG8oY29udHJvbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc01ldGhvZChDb250cm9sIGNvbnRyb2wsIFN0cmluZyBuYW1lLCBDbGFzc1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0gICAgICAgIENsYXNzIGMgPSBjb250cm9sLmdldENsYXNzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gYy5nZXRNZXRob2QobmFtZSwgcGFyYW1ldGVyVHlwZXMpICE9IG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL0FjdGlvblNldEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9BY3Rpb25TZXRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjcxNmMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL0FjdGlvblNldEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9Hcm91cEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9Hcm91cEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YjczN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvR3JvdXBFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSUFjdGlvblNldExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9JQWN0aW9uU2V0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJhOTY1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9JQWN0aW9uU2V0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5tZW51czsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCBieSBjbGllbnRzIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uCi0gKiBvZiBjaGFuZ2VzIHRvIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiA8Y29kZT5TQWN0aW9uU2V0PC9jb2RlPi4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBidXQgbXVzdCBub3QgYmUgZXh0ZW5kLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiBAc2VlIFNBY3Rpb25TZXQjYWRkTGlzdGVuZXIoSUFjdGlvblNldExpc3RlbmVyKQotICogQHNlZSBTQWN0aW9uU2V0I3JlbW92ZUxpc3RlbmVyKElBY3Rpb25TZXRMaXN0ZW5lcikKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uU2V0TGlzdGVuZXIgewotCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIG9mIGFuIGluc3RhbmNlIG9mCi0JICogPGNvZGU+U0FjdGlvblNldDwvY29kZT4gaGF2ZSBjaGFuZ2VkLiBTcGVjaWZpYyBkZXRhaWxzIGFyZSBkZXNjcmliZWQgaW4KLQkgKiB0aGUgPGNvZGU+QWN0aW9uU2V0RXZlbnQ8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgVGhlIGV2ZW50OyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQl2b2lkIGFjdGlvblNldENoYW5nZWQoQWN0aW9uU2V0RXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSUR5bmFtaWNNZW51LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9JRHluYW1pY01lbnUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhODcyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9JRHluYW1pY01lbnUuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL0lHcm91cExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9JR3JvdXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTExMWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL0lHcm91cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UubWVudXM7Ci0KLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgYnkgY2xpZW50cyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbgotICogb2YgY2hhbmdlcyB0byBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2YgPGNvZGU+U0dyb3VwPC9jb2RlPi4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBidXQgbXVzdCBub3QgYmUgZXh0ZW5kLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiBAc2VlIFNHcm91cCNhZGRMaXN0ZW5lcihJR3JvdXBMaXN0ZW5lcikKLSAqIEBzZWUgU0dyb3VwI3JlbW92ZUxpc3RlbmVyKElHcm91cExpc3RlbmVyKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElHcm91cExpc3RlbmVyIHsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgb25lIG9yIG1vcmUgcHJvcGVydGllcyBvZiBhbiBpbnN0YW5jZSBvZgotCSAqIDxjb2RlPlNHcm91cDwvY29kZT4gaGF2ZSBjaGFuZ2VkLiBTcGVjaWZpYyBkZXRhaWxzIGFyZSBkZXNjcmliZWQgaW4KLQkgKiB0aGUgPGNvZGU+R3JvdXBFdmVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgZXZlbnQ7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXZvaWQgZ3JvdXBDaGFuZ2VkKEdyb3VwRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSUl0ZW1MaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSUl0ZW1MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjY5NDE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL0lJdGVtTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5tZW51czsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCBieSBjbGllbnRzIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uCi0gKiBvZiBjaGFuZ2VzIHRvIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiA8Y29kZT5TSXRlbTwvY29kZT4uCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgYnV0IG11c3Qgbm90IGJlIGV4dGVuZC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogQHNlZSBTSXRlbSNhZGRMaXN0ZW5lcihJSXRlbUxpc3RlbmVyKQotICogQHNlZSBTSXRlbSNyZW1vdmVMaXN0ZW5lcihJSXRlbUxpc3RlbmVyKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJdGVtTGlzdGVuZXIgewotCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIG9mIGFuIGluc3RhbmNlIG9mIDxjb2RlPlNJdGVtPC9jb2RlPgotCSAqIGhhdmUgY2hhbmdlZC4gU3BlY2lmaWMgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGluIHRoZQotCSAqIDxjb2RlPkl0ZW1FdmVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgZXZlbnQ7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXZvaWQgaXRlbUNoYW5nZWQoSXRlbUV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL0lNZW51Q29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSU1lbnVDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjODRmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSU1lbnVDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9JTWVudUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9JTWVudUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZDg3MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSU1lbnVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLm1lbnVzOwotCi0vKioKLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24KLSAqIG9mIGNoYW5nZXMgdG8gb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mIDxjb2RlPlNNZW51PC9jb2RlPi4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBidXQgbXVzdCBub3QgYmUgZXh0ZW5kLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiBAc2VlIFNNZW51I2FkZExpc3RlbmVyKElNZW51TGlzdGVuZXIpCi0gKiBAc2VlIFNNZW51I3JlbW92ZUxpc3RlbmVyKElNZW51TGlzdGVuZXIpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lbnVMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IG9uZSBvciBtb3JlIHByb3BlcnRpZXMgb2YgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+U01lbnU8L2NvZGU+Ci0JICogaGF2ZSBjaGFuZ2VkLiBTcGVjaWZpYyBkZXRhaWxzIGFyZSBkZXNjcmliZWQgaW4gdGhlCi0JICogPGNvZGU+TWVudUV2ZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBldmVudDsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0Jdm9pZCBtZW51Q2hhbmdlZChNZW51RXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSU1lbnVNYW5hZ2VyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL0lNZW51TWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjODYxZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSU1lbnVNYW5hZ2VyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5tZW51czsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCBieSBjbGllbnRzIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uCi0gKiBvZiBjaGFuZ2VzIHRvIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiA8Y29kZT5TTWVudU1hbmFnZXI8L2NvZGU+LgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGJ1dCBtdXN0IG5vdCBiZSBleHRlbmQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIEBzZWUgU01lbnVNYW5hZ2VyI2FkZExpc3RlbmVyKElNZW51TWFuYWdlckxpc3RlbmVyKQotICogQHNlZSBTTWVudU1hbmFnZXIjcmVtb3ZlTGlzdGVuZXIoSU1lbnVNYW5hZ2VyTGlzdGVuZXIpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lbnVNYW5hZ2VyTGlzdGVuZXIgewotCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIG9mIGFuIGluc3RhbmNlIG9mCi0JICogPGNvZGU+U01lbnVNYW5hZ2VyPC9jb2RlPiBoYXZlIGNoYW5nZWQuIFNwZWNpZmljIGRldGFpbHMgYXJlIGRlc2NyaWJlZAotCSAqIGluIHRoZSA8Y29kZT5NZW51TWFuYWdlckV2ZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBldmVudDsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0Jdm9pZCBtZW51TWFuYWdlckNoYW5nZWQoTWVudU1hbmFnZXJFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9JTWVudVN0YXRlSWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9JTWVudVN0YXRlSWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MmJiMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSU1lbnVTdGF0ZUlkcy5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSVdpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSVdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWNjNzg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL0lXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL0lXaWRnZXRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSVdpZGdldExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTA4N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSVdpZGdldExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UubWVudXM7Ci0KLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgYnkgY2xpZW50cyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbgotICogb2YgY2hhbmdlcyB0byBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2YgPGNvZGU+U1dpZGdldDwvY29kZT4uCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgYnV0IG11c3Qgbm90IGJlIGV4dGVuZC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogQHNlZSBTV2lkZ2V0I2FkZExpc3RlbmVyKElXaWRnZXRMaXN0ZW5lcikKLSAqIEBzZWUgU1dpZGdldCNyZW1vdmVMaXN0ZW5lcihJV2lkZ2V0TGlzdGVuZXIpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdpZGdldExpc3RlbmVyIHsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgb25lIG9yIG1vcmUgcHJvcGVydGllcyBvZiBhbiBpbnN0YW5jZSBvZgotCSAqIDxjb2RlPlNXaWRnZXQ8L2NvZGU+IGhhdmUgY2hhbmdlZC4gU3BlY2lmaWMgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGluCi0JICogdGhlIDxjb2RlPldpZGdldEV2ZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBldmVudDsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0Jdm9pZCB3aWRnZXRDaGFuZ2VkKFdpZGdldEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL0l0ZW1FdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSXRlbUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NjE2OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvSXRlbUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9MZWFmTG9jYXRpb25FbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9MZWFmTG9jYXRpb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMWQxNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvTGVhZkxvY2F0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvTG9jYXRpb25FbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9Mb2NhdGlvbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwZmY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9Mb2NhdGlvbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL01lbnVDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9NZW51Q29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzUxZTA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL01lbnVDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9NZW51Q29sbGVjdGlvbkV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9NZW51Q29sbGVjdGlvbkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTY1NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvTWVudUNvbGxlY3Rpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvTWVudUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL01lbnVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzBmZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvTWVudUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL01lbnVFbGVtZW50RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL01lbnVFbGVtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3YzI2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9NZW51RWxlbWVudEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9NZW51RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL01lbnVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmVkNGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL01lbnVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvTWVudU1hbmFnZXJFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvTWVudU1hbmFnZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTVjNmYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL01lbnVNYW5hZ2VyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UubWVudXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5BYnN0cmFjdEJpdFNldEV2ZW50OwotCi0vKioKLSAqIDxwPgotICogQW4gZXZlbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBzZXQgb2YgZGVmaW5lZCBtZW51IGVsZW1lbnQgaWRlbnRpZmllcnMgaGFzCi0gKiBjaGFuZ2VkLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiBAc2VlIElNZW51TWFuYWdlckxpc3RlbmVyI21lbnVNYW5hZ2VyQ2hhbmdlZChNZW51TWFuYWdlckV2ZW50KQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVudU1hbmFnZXJFdmVudCBleHRlbmRzIEFic3RyYWN0Qml0U2V0RXZlbnQgewotCi0JLyoqCi0JICogVGhlIGJpdCB1c2VkIHRvIHJlcHJlc2VudCB3aGV0aGVyIHRoZSBnaXZlbiBhY3Rpb24gc2V0IGhhcyBiZWNvbWUKLQkgKiBkZWZpbmVkLiBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0IGFuZCB0aGVyZSBpcyBubyBhY3Rpb24gc2V0IGlkLCB0aGVuIG5vCi0JICogYWN0aW9uIHNldCBoYXMgYmVjb21lIGRlZmluZWQgbm9yIHVuZGVmaW5lZC4gSWYgdGhpcyBiaXQgaXMgbm90IHNldCBhbmQKLQkgKiB0aGVyZSBpcyBhIGFjdGlvbiBzZXQgaWQsIHRoZW4gdGhlIGFjdGlvbiBzZXQgaGFzIGJlY29tZSB1bmRlZmluZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIQU5HRURfQUNUSU9OX1NFVF9ERUZJTkVEID0gMTsKLQotCS8qKgotCSAqIFRoZSBiaXQgdXNlZCB0byByZXByZXNlbnQgd2hldGhlciB0aGUgZ2l2ZW4gZ3JvdXAgaGFzIGJlY29tZSBkZWZpbmVkLiBJZgotCSAqIHRoaXMgYml0IGlzIG5vdCBzZXQgYW5kIHRoZXJlIGlzIG5vIGdyb3VwIGlkLCB0aGVuIG5vIGdyb3VwIGhhcyBiZWNvbWUKLQkgKiBkZWZpbmVkIG5vciB1bmRlZmluZWQuIElmIHRoaXMgYml0IGlzIG5vdCBzZXQgYW5kIHRoZXJlIGlzIGEgZ3JvdXAgaWQsCi0JICogdGhlbiB0aGUgZ3JvdXAgaGFzIGJlY29tZSB1bmRlZmluZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIQU5HRURfR1JPVVBfREVGSU5FRCA9IDEgPDwgMTsKLQotCS8qKgotCSAqIFRoZSBiaXQgdXNlZCB0byByZXByZXNlbnQgd2hldGhlciB0aGUgZ2l2ZW4gaXRlbSBoYXMgYmVjb21lIGRlZmluZWQuIElmCi0JICogdGhpcyBiaXQgaXMgbm90IHNldCBhbmQgdGhlcmUgaXMgbm8gaXRlbSBpZCwgdGhlbiBubyBpdGVtIGhhcyBiZWNvbWUKLQkgKiBkZWZpbmVkIG5vciB1bmRlZmluZWQuIElmIHRoaXMgYml0IGlzIG5vdCBzZXQgYW5kIHRoZXJlIGlzIGEgaXRlbSBpZCwKLQkgKiB0aGVuIHRoZSBpdGVtIGhhcyBiZWNvbWUgdW5kZWZpbmVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEX0lURU1fREVGSU5FRCA9IDEgPDwgMjsKLQotCS8qKgotCSAqIFRoZSBiaXQgdXNlZCB0byByZXByZXNlbnQgd2hldGhlciB0aGUgZ2l2ZW4gbWVudSBoYXMgYmVjb21lIGRlZmluZWQuIElmCi0JICogdGhpcyBiaXQgaXMgbm90IHNldCBhbmQgdGhlcmUgaXMgbm8gbWVudSBpZCwgdGhlbiBubyBtZW51IGhhcyBiZWNvbWUKLQkgKiBkZWZpbmVkIG5vciB1bmRlZmluZWQuIElmIHRoaXMgYml0IGlzIG5vdCBzZXQgYW5kIHRoZXJlIGlzIGEgbWVudSBpZCwKLQkgKiB0aGVuIHRoZSBtZW51IGhhcyBiZWNvbWUgdW5kZWZpbmVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEX01FTlVfREVGSU5FRCA9IDEgPDwgMzsKLQotCS8qKgotCSAqIFRoZSBiaXQgdXNlZCB0byByZXByZXNlbnQgd2hldGhlciB0aGUgZ2l2ZW4gd2lkZ2V0IGhhcyBiZWNvbWUgZGVmaW5lZC4gSWYKLQkgKiB0aGlzIGJpdCBpcyBub3Qgc2V0IGFuZCB0aGVyZSBpcyBubyB3aWRnZXQgaWQsIHRoZW4gbm8gd2lkZ2V0IGhhcyBiZWNvbWUKLQkgKiBkZWZpbmVkIG5vciB1bmRlZmluZWQuIElmIHRoaXMgYml0IGlzIG5vdCBzZXQgYW5kIHRoZXJlIGlzIGEgd2lkZ2V0IGlkLAotCSAqIHRoZW4gdGhlIHdpZGdldCBoYXMgYmVjb21lIHVuZGVmaW5lZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRF9XSURHRVRfREVGSU5FRCA9IDEgPDwgNDsKLQotCS8qKgotCSAqIFRoZSBhY3Rpb24gc2V0IGlkZW50aWZpZXIgdGhhdCB3YXMgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mCi0JICogZGVmaW5lZCBhY3Rpb24gc2V0IGlkZW50aWZpZXJzLiBUaGlzIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqIGxpc3Qgb2YgZGVmaW5lZCBhY3Rpb24gc2V0IGlkZW50aWZpZXJzIGRpZCBub3QgY2hhbmdlLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGFjdGlvblNldElkOwotCi0JLyoqCi0JICogVGhlIGdyb3VwIGlkZW50aWZpZXIgdGhhdCB3YXMgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIGRlZmluZWQKLQkgKiBncm91cCBpZGVudGlmaWVycy4gVGhpcyB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdCBvZgotCSAqIGRlZmluZWQgZ3JvdXAgaWRlbnRpZmllcnMgZGlkIG5vdCBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZ3JvdXBJZDsKLQotCS8qKgotCSAqIFRoZSBpdGVtIGlkZW50aWZpZXIgdGhhdCB3YXMgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIGRlZmluZWQKLQkgKiBpdGVtIGlkZW50aWZpZXJzLiBUaGlzIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBsaXN0IG9mCi0JICogZGVmaW5lZCBpdGVtIGlkZW50aWZpZXJzIGRpZCBub3QgY2hhbmdlLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGl0ZW1JZDsKLQotCS8qKgotCSAqIFRoZSBtZW51IGlkZW50aWZpZXIgdGhhdCB3YXMgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIGRlZmluZWQKLQkgKiBtZW51IGlkZW50aWZpZXJzLiBUaGlzIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBsaXN0IG9mCi0JICogZGVmaW5lZCBtZW51IGlkZW50aWZpZXJzIGRpZCBub3QgY2hhbmdlLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG1lbnVJZDsKLQotCS8qKgotCSAqIFRoZSBtZW51IG1hbmFnZXIgdGhhdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNNZW51TWFuYWdlciBtZW51TWFuYWdlcjsKLQotCS8qKgotCSAqIFRoZSB3aWRnZXQgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgZGVmaW5lZAotCSAqIHdpZGdldCBpZGVudGlmaWVycy4gVGhpcyB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdCBvZgotCSAqIGRlZmluZWQgd2lkZ2V0IGlkZW50aWZpZXJzIGRpZCBub3QgY2hhbmdlLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHdpZGdldElkOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBtZW51TWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIGluc3RhbmNlIG9mIHRoZSBtYW5hZ2VyIHRoYXQgY2hhbmdlZDsgbXVzdCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBncm91cElkCi0JICogICAgICAgICAgICBUaGUgZ3JvdXAgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkOwotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgYSBncm91cCBkaWQgbm90IGNoYW5nZS4KLQkgKiBAcGFyYW0gZ3JvdXBJZEFkZGVkCi0JICogICAgICAgICAgICBXaGV0aGVyIHRoZSBncm91cCBpZGVudGlmaWVyIGJlY2FtZSBkZWZpbmVkIChvdGhlcndpc2UsIGl0Ci0JICogICAgICAgICAgICBiZWNhbWUgdW5kZWZpbmVkKS4KLQkgKiBAcGFyYW0gaXRlbUlkCi0JICogICAgICAgICAgICBUaGUgaXRlbSBpZGVudGlmaWVyIHRoYXQgd2FzIGFkZGVkIG9yIHJlbW92ZWQ7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBhIGl0ZW0gZGlkIG5vdCBjaGFuZ2UuCi0JICogQHBhcmFtIGl0ZW1JZEFkZGVkCi0JICogICAgICAgICAgICBXaGV0aGVyIHRoZSBpdGVtIGlkZW50aWZpZXIgYmVjYW1lIGRlZmluZWQgKG90aGVyd2lzZSwgaXQKLQkgKiAgICAgICAgICAgIGJlY2FtZSB1bmRlZmluZWQpLgotCSAqIEBwYXJhbSBtZW51SWQKLQkgKiAgICAgICAgICAgIFRoZSBtZW51IGlkZW50aWZpZXIgdGhhdCB3YXMgYWRkZWQgb3IgcmVtb3ZlZDsKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEgbWVudSBkaWQgbm90IGNoYW5nZS4KLQkgKiBAcGFyYW0gbWVudUlkQWRkZWQKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgdGhlIG1lbnUgaWRlbnRpZmllciBiZWNhbWUgZGVmaW5lZCAob3RoZXJ3aXNlLCBpdAotCSAqICAgICAgICAgICAgYmVjYW1lIHVuZGVmaW5lZCkuCi0JICogQHBhcmFtIHdpZGdldElkCi0JICogICAgICAgICAgICBUaGUgd2lkZ2V0IGlkZW50aWZpZXIgdGhhdCB3YXMgYWRkZWQgb3IgcmVtb3ZlZDsKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEgd2lkZ2V0IGRpZCBub3QgY2hhbmdlLgotCSAqIEBwYXJhbSB3aWRnZXRJZEFkZGVkCi0JICogICAgICAgICAgICBXaGV0aGVyIHRoZSB3aWRnZXQgaWRlbnRpZmllciBiZWNhbWUgZGVmaW5lZCAob3RoZXJ3aXNlLCBpdAotCSAqICAgICAgICAgICAgYmVjYW1lIHVuZGVmaW5lZCkuCi0JICogQHBhcmFtIGFjdGlvblNldElkCi0JICogICAgICAgICAgICBUaGUgYWN0aW9uIHNldCBpZGVudGlmaWVyIHRoYXQgd2FzIGFkZGVkIG9yIHJlbW92ZWQ7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbiBhY3Rpb24gc2V0IGRpZCBub3QgY2hhbmdlLgotCSAqIEBwYXJhbSBhY3Rpb25TZXRJZEFkZGVkCi0JICogICAgICAgICAgICBXaGV0aGVyIHRoZSBhY3Rpb24gc2V0IGlkZW50aWZpZXIgYmVjYW1lIGRlZmluZWQgKG90aGVyd2lzZSwKLQkgKiAgICAgICAgICAgIGl0IGJlY2FtZSB1bmRlZmluZWQpLgotCSAqLwotCU1lbnVNYW5hZ2VyRXZlbnQoZmluYWwgU01lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBmaW5hbCBTdHJpbmcgZ3JvdXBJZCwKLQkJCWZpbmFsIGJvb2xlYW4gZ3JvdXBJZEFkZGVkLCBmaW5hbCBTdHJpbmcgaXRlbUlkLAotCQkJZmluYWwgYm9vbGVhbiBpdGVtSWRBZGRlZCwgZmluYWwgU3RyaW5nIG1lbnVJZCwKLQkJCWZpbmFsIGJvb2xlYW4gbWVudUlkQWRkZWQsIGZpbmFsIFN0cmluZyB3aWRnZXRJZCwKLQkJCWZpbmFsIGJvb2xlYW4gd2lkZ2V0SWRBZGRlZCwgZmluYWwgU3RyaW5nIGFjdGlvblNldElkLAotCQkJZmluYWwgYm9vbGVhbiBhY3Rpb25TZXRJZEFkZGVkKSB7Ci0JCWlmIChtZW51TWFuYWdlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0JCQkJCSJBbiBldmVudCBtdXN0IHJlZmVyIHRvIGl0cyBtZW51IG1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdGhpcy5tZW51TWFuYWdlciA9IG1lbnVNYW5hZ2VyOwotCQl0aGlzLmdyb3VwSWQgPSBncm91cElkOwotCQl0aGlzLml0ZW1JZCA9IGl0ZW1JZDsKLQkJdGhpcy5tZW51SWQgPSBtZW51SWQ7Ci0JCXRoaXMud2lkZ2V0SWQgPSB3aWRnZXRJZDsKLQkJdGhpcy5hY3Rpb25TZXRJZCA9IGFjdGlvblNldElkOwotCi0JCWlmIChncm91cElkQWRkZWQpIHsKLQkJCWNoYW5nZWRWYWx1ZXMgfD0gQ0hBTkdFRF9HUk9VUF9ERUZJTkVEOwotCQl9Ci0JCWlmIChpdGVtSWRBZGRlZCkgewotCQkJY2hhbmdlZFZhbHVlcyB8PSBDSEFOR0VEX0lURU1fREVGSU5FRDsKLQkJfQotCQlpZiAobWVudUlkQWRkZWQpIHsKLQkJCWNoYW5nZWRWYWx1ZXMgfD0gQ0hBTkdFRF9NRU5VX0RFRklORUQ7Ci0JCX0KLQkJaWYgKHdpZGdldElkQWRkZWQpIHsKLQkJCWNoYW5nZWRWYWx1ZXMgfD0gQ0hBTkdFRF9XSURHRVRfREVGSU5FRDsKLQkJfQotCQlpZiAoYWN0aW9uU2V0SWRBZGRlZCkgewotCQkJY2hhbmdlZFZhbHVlcyB8PSBDSEFOR0VEX0FDVElPTl9TRVRfREVGSU5FRDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGlvbiBzZXQgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGFjdGlvbiBzZXQgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkOyBtYXkgYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGFjdGlvbiBzZXQgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvblNldElkKCkgewotCQlyZXR1cm4gZ3JvdXBJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBncm91cCBpZGVudGlmaWVyIHRoYXQgd2FzIGFkZGVkIG9yIHJlbW92ZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgZ3JvdXAgaWRlbnRpZmllciB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkOyBtYXkgYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGdyb3VwIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRHcm91cElkKCkgewotCQlyZXR1cm4gZ3JvdXBJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpdGVtIGlkZW50aWZpZXIgdGhhdCB3YXMgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBpdGVtIGlkZW50aWZpZXIgdGhhdCB3YXMgYWRkZWQgb3IgcmVtb3ZlZDsgbWF5IGJlCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpdGVtIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRJdGVtSWQoKSB7Ci0JCXJldHVybiBpdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVudSBpZGVudGlmaWVyIHRoYXQgd2FzIGFkZGVkIG9yIHJlbW92ZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgbWVudSBpZGVudGlmaWVyIHRoYXQgd2FzIGFkZGVkIG9yIHJlbW92ZWQ7IG1heSBiZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbWVudSBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TWVudUlkKCkgewotCQlyZXR1cm4gbWVudUlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBjaGFuZ2VkLiBHdWFyYW50ZWVkIG5vdCB0byBiZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGZpbmFsIFNNZW51TWFuYWdlciBnZXRNZW51TWFuYWdlcigpIHsKLQkJcmV0dXJuIG1lbnVNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpZGdldCBpZGVudGlmaWVyIHRoYXQgd2FzIGFkZGVkIG9yIHJlbW92ZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgd2lkZ2V0IGlkZW50aWZpZXIgdGhhdCB3YXMgYWRkZWQgb3IgcmVtb3ZlZDsgbWF5IGJlCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyB3aWRnZXQgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFdpZGdldElkKCkgewotCQlyZXR1cm4gd2lkZ2V0SWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsaXN0IG9mIGRlZmluZWQgYWN0aW9uIHNldCBpZGVudGlmaWVycyBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsaXN0IG9mIGFjdGlvbiBzZXQgaWRlbnRpZmllcnMgaGFzCi0JICogICAgICAgICBjaGFuZ2VkOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQWN0aW9uU2V0Q2hhbmdlZCgpIHsKLQkJcmV0dXJuIChhY3Rpb25TZXRJZCAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFjdGlvbiBzZXQgaWRlbnRpZmllciBiZWNhbWUgZGVmaW5lZC4gT3RoZXJ3aXNlLCB0aGUKLQkgKiBhY3Rpb24gc2V0IGlkZW50aWZpZXIgYmVjYW1lIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhY3Rpb24gc2V0IGlkZW50aWZpZXIgYmVjYW1lIGRlZmluZWQ7Ci0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGFjdGlvbiBzZXQgaWRlbnRpZmllciBiZWNhbWUKLQkgKiAgICAgICAgIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FjdGlvblNldERlZmluZWQoKSB7Ci0JCXJldHVybiAoKChjaGFuZ2VkVmFsdWVzICYgQ0hBTkdFRF9BQ1RJT05fU0VUX0RFRklORUQpICE9IDApICYmIChhY3Rpb25TZXRJZCAhPSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsaXN0IG9mIGRlZmluZWQgZ3JvdXAgaWRlbnRpZmllcnMgaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGlzdCBvZiBncm91cCBpZGVudGlmaWVycyBoYXMgY2hhbmdlZDsKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNHcm91cENoYW5nZWQoKSB7Ci0JCXJldHVybiAoZ3JvdXBJZCAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdyb3VwIGlkZW50aWZpZXIgYmVjYW1lIGRlZmluZWQuIE90aGVyd2lzZSwgdGhlIGdyb3VwCi0JICogaWRlbnRpZmllciBiZWNhbWUgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdyb3VwIGlkZW50aWZpZXIgYmVjYW1lIGRlZmluZWQ7Ci0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGdyb3VwIGlkZW50aWZpZXIgYmVjYW1lIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0dyb3VwRGVmaW5lZCgpIHsKLQkJcmV0dXJuICgoKGNoYW5nZWRWYWx1ZXMgJiBDSEFOR0VEX0dST1VQX0RFRklORUQpICE9IDApICYmIChncm91cElkICE9IG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxpc3Qgb2YgZGVmaW5lZCBpdGVtIGlkZW50aWZpZXJzIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpc3Qgb2YgaXRlbSBpZGVudGlmaWVycyBoYXMgY2hhbmdlZDsKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJdGVtQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIChpdGVtSWQgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVtIGlkZW50aWZpZXIgYmVjYW1lIGRlZmluZWQuIE90aGVyd2lzZSwgdGhlIGl0ZW0KLQkgKiBpZGVudGlmaWVyIGJlY2FtZSB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaXRlbSBpZGVudGlmaWVyIGJlY2FtZSBkZWZpbmVkOwotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBpdGVtIGlkZW50aWZpZXIgYmVjYW1lIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0l0ZW1EZWZpbmVkKCkgewotCQlyZXR1cm4gKCgoY2hhbmdlZFZhbHVlcyAmIENIQU5HRURfSVRFTV9ERUZJTkVEKSAhPSAwKSAmJiAoaXRlbUlkICE9IG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxpc3Qgb2YgZGVmaW5lZCBtZW51IGlkZW50aWZpZXJzIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpc3Qgb2YgbWVudSBpZGVudGlmaWVycyBoYXMgY2hhbmdlZDsKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNNZW51Q2hhbmdlZCgpIHsKLQkJcmV0dXJuIChtZW51SWQgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBtZW51IGlkZW50aWZpZXIgYmVjYW1lIGRlZmluZWQuIE90aGVyd2lzZSwgdGhlIG1lbnUKLQkgKiBpZGVudGlmaWVyIGJlY2FtZSB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWVudSBpZGVudGlmaWVyIGJlY2FtZSBkZWZpbmVkOwotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBtZW51IGlkZW50aWZpZXIgYmVjYW1lIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc01lbnVEZWZpbmVkKCkgewotCQlyZXR1cm4gKCgoY2hhbmdlZFZhbHVlcyAmIENIQU5HRURfTUVOVV9ERUZJTkVEKSAhPSAwKSAmJiAobWVudUlkICE9IG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxpc3Qgb2YgZGVmaW5lZCB3aWRnZXQgaWRlbnRpZmllcnMgaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGlzdCBvZiB3aWRnZXQgaWRlbnRpZmllcnMgaGFzCi0JICogICAgICAgICBjaGFuZ2VkOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzV2lkZ2V0Q2hhbmdlZCgpIHsKLQkJcmV0dXJuICh3aWRnZXRJZCAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHdpZGdldCBpZGVudGlmaWVyIGJlY2FtZSBkZWZpbmVkLiBPdGhlcndpc2UsIHRoZQotCSAqIHdpZGdldCBpZGVudGlmaWVyIGJlY2FtZSB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgd2lkZ2V0IGlkZW50aWZpZXIgYmVjYW1lIGRlZmluZWQ7Ci0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHdpZGdldCBpZGVudGlmaWVyIGJlY2FtZSB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNXaWRnZXREZWZpbmVkKCkgewotCQlyZXR1cm4gKCgoY2hhbmdlZFZhbHVlcyAmIENIQU5HRURfV0lER0VUX0RFRklORUQpICE9IDApICYmICh3aWRnZXRJZCAhPSBudWxsKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU0FjdGlvblNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU0FjdGlvblNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTViNDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL1NBY3Rpb25TZXQuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL1NCYXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL1NCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0MDZjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TQmFyLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL1NHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTVhNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL1NHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU0l0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL1NJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOGY3NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU0l0ZW0uamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL1NMb2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU0xvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTZiNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU0xvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TTWVudS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU01lbnUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlZDYyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TTWVudS5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU01lbnVNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TTWVudU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3YmY0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TTWVudU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL1NPcmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU09yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNWQ0N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU09yZGVyLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TUGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU1BhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkZjQ0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TUGFydC5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU1BvcHVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TUG9wdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU2OGY0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TUG9wdXAuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL1NSZWZlcmVuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL1NSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5ZmI2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9TV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNTVhNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvU1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVudXMvVGV4dFN0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9UZXh0U3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyMzY0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9UZXh0U3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UubWVudXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklOYW1lZEhhbmRsZVN0YXRlSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmNvbW1hbmRzLkFic3RyYWN0UGVyc2lzdGVudFN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiA8cD4KLSAqIEEgcGllY2Ugb2Ygc3RhdGUgY2FycnlpbmcgYSBzaW5nbGUge0BsaW5rIFN0cmluZ30uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIElmIHRoaXMgc3RhdGUgaXMgcmVnaXN0ZXJlZCB1c2luZyB7QGxpbmsgSU5hbWVkSGFuZGxlU3RhdGVJZHMjTkFNRX0gb3IKLSAqIHtAbGluayBJTmFtZWRIYW5kbGVTdGF0ZUlkcyNERVNDUklQVElPTn0sIHRoZW4gdGhpcyBhbGxvd3MgdGhlIGhhbmRsZXIgdG8KLSAqIGNvbW11bmljYXRlIGEgdGV4dHVhbCBjaGFuZ2UgZm9yIGEgZ2l2ZW4gY29tbWFuZC4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBieQotICogZ3JhcGhpY2FsIGFwcGxpY2F0aW9ucyB0byBhbGxvdyBtb3JlIHNwZWNpZmljIHRleHQgdG8gYmUgZGlzcGxheWVkIGluIHRoZQotICogbWVudXMuIEZvciBleGFtcGxlLCAiVW5kbyIgbWlnaHQgYmVjb21lICJVbmRvIFR5cGluZyIgdGhyb3VnaCB0aGUgdXNlIG9mIGEKLSAqIHtAbGluayBUZXh0U3RhdGV9LgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzLCBidXQgbXVzdCBub3QgZXh0ZW5kLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiBAc2VlIElOYW1lZEhhbmRsZVN0YXRlSWRzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0U3RhdGUgZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbnRTdGF0ZSB7Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBsb2FkKGZpbmFsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsCi0JCQlmaW5hbCBTdHJpbmcgcHJlZmVyZW5jZUtleSkgewotCQlmaW5hbCBTdHJpbmcgdmFsdWUgPSBzdG9yZS5nZXRTdHJpbmcocHJlZmVyZW5jZUtleSk7Ci0JCXNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBzYXZlKGZpbmFsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsCi0JCQlmaW5hbCBTdHJpbmcgcHJlZmVyZW5jZUtleSkgewotCQlmaW5hbCBPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZSgpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXN0b3JlLnNldFZhbHVlKHByZWZlcmVuY2VLZXksICgoU3RyaW5nKSB2YWx1ZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICghKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRleHRTdGF0ZSB0YWtlcyBhIFN0cmluZyBhcyBhIHZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXN1cGVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL1dpZGdldEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZW51cy9XaWRnZXRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2JiNDZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL21lbnVzL1dpZGdldEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmYWE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTIGZpbGUgZm9yIEpGYWNlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2xvYmFsIGxhYmVsIGRlZmluaXRpb25zCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vaz1PSwotY2FuY2VsPUNhbmNlbAoteWVzPSZZZXMKLXllc3RvYWxsPVllcyBUbyAmQWxsCi1za2lwPVMma2lwCi1zdG9wPSZTdG9wCi1hYm9ydD0mQWJvcnQKLXJldHJ5PSZSZXRyeQotaWdub3JlPSZJZ25vcmUKLXByb2NlZWQ9JlByb2NlZWQKLW9wZW49Jk9wZW4KLWNsb3NlPSZDbG9zZQotc2hvd0RldGFpbHM9JkRldGFpbHMgPj4KLWhpZGVEZXRhaWxzPTw8ICZEZXRhaWxzCi1iYWNrQnV0dG9uPTwgJkJhY2sKLW5leHRCdXR0b249Jk5leHQgPgotZmluaXNoPSZGaW5pc2gKLWhlbHA9JkhlbHAKLW5vPSZObwotbm90b2FsbD1ObyAmVG8gQWxsCi1maW5pc2g9JkZpbmlzaAotaGVscD0mSGVscAotZGVmYXVsdHM9UmVzdG9yZSAmRGVmYXVsdHMKLWFwcGx5PSZBcHBseQotb3BlbkJyb3dzZT0mQnJvd3NlLi4uCi0KLW9wZW5DaGFuZ2U9JkNoYW5nZS4uLgotaGVscD0mSGVscAotY2xvc2U9JkNsb3NlCi1jb3B5ID0gJkNvcHkKLQotZXJyb3I9RXJyb3IKLXdhcm5pbmc9V2FybmluZwotaW5mbz1JbmZvCi1xdWVzdGlvbj1RdWVzdGlvbgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBXaXphcmQgQ2xvc2luZyBEaWFsb2cKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1XaXphcmRDbG9zaW5nRGlhbG9nLnRpdGxlPVdpemFyZCBDbG9zaW5nCi1XaXphcmRDbG9zaW5nRGlhbG9nLm1lc3NhZ2U9V2l6YXJkIGNhbiBub3QgYmUgY2xvc2VkIGR1ZSB0byBhbiBhY3RpdmUgb3BlcmF0aW9uLiBZb3UgbXVzdCBjYW5jZWwgdGhlIG9wZXJhdGlvbiBiZWZvcmUgeW91IGNhbiBjbG9zZSB0aGUgd2l6YXJkLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGUgUHJvZ3Jlc3MgTW9uaXRvciBEaWFsb2cKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Qcm9ncmVzc01vbml0b3JEaWFsb2cudGl0bGU9UHJvZ3Jlc3MgSW5mb3JtYXRpb24KLVByb2dyZXNzTW9uaXRvckRpYWxvZy5tZXNzYWdlPU9wZXJhdGlvbiBpbiBwcm9ncmVzcy4uLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQcmVmZXJlbmNlIERpYWxvZwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVByZWZlcmVuY2VEaWFsb2cudGl0bGU9UHJlZmVyZW5jZXMKLVByZWZlcmVuY2VEaWFsb2cuc2F2ZUVycm9yVGl0bGU9UHJvYmxlbSBTYXZpbmcgUHJlZmVyZW5jZXMKLVByZWZlcmVuY2VEaWFsb2cuc2F2ZUVycm9yTWVzc2FnZT1BIHByb2JsZW0gd2FzIGVuY291bnRlcmVkIHNhdmluZyB0aGUgcGFnZSB7MH0uXG57MX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ2hhbmdlIEVycm9ycwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVByZWZlcmVuY2VTdG9yZS5jaGFuZ2VFcnJvcj1FcnJvciBub3RpZnlpbmcgYSBwcmVmZXJlbmNlIGNoYW5nZSBsaXN0ZW5lci4gQ2hlY2sgdGhlIGxvZyBmb3IgZGV0YWlscy4KLUZvbnRSZWdpc3RyeS5jaGFuZ2VFcnJvcj1FcnJvciBub3RpZnlpbmcgYSBmb250IHJlZ2lzdHJ5IGNoYW5nZSBsaXN0ZW5lci4gQ2hlY2sgdGhlIGxvZyBmb3IgZGV0YWlscy4KLQkJCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBBYm9ydCBQYWdlIEZsaXBwaW5nIERpYWxvZwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFib3J0UGFnZUZsaXBwaW5nRGlhbG9nLnRpdGxlPUNvdWxkIE5vdCBBY2NlcHQgQ2hhbmdlcyAKLUFib3J0UGFnZUZsaXBwaW5nRGlhbG9nLm1lc3NhZ2U9VGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZSBjb250YWlucyBpbnZhbGlkIHZhbHVlcy4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRmllbGQgZWRpdG9ycwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVN0cmluZ0ZpZWxkRWRpdG9yLmVycm9yTWVzc2FnZT1GaWVsZCBjb250YWlucyBhbiBpbnZhbGlkIHZhbHVlCi1JbnRlZ2VyRmllbGRFZGl0b3IuZXJyb3JNZXNzYWdlPVZhbHVlIG11c3QgYmUgYW4gSW50ZWdlcgotRmlsZUZpZWxkRWRpdG9yLmVycm9yTWVzc2FnZT1WYWx1ZSBtdXN0IGJlIGFuIGV4aXN0aW5nIGZpbGUKLUZpbGVGaWVsZEVkaXRvci5lcnJvck1lc3NhZ2UyPVZhbHVlIG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aAotRGlyZWN0b3J5RmllbGRFZGl0b3IuZXJyb3JNZXNzYWdlPVZhbHVlIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5Ci1MaXN0RWRpdG9yLmFkZCA9IE5lJncuLi4KLUxpc3RFZGl0b3IucmVtb3ZlID0gJlJlbW92ZQotTGlzdEVkaXRvci51cCA9ICZVcAotTGlzdEVkaXRvci5kb3duID0gRG93Jm4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRXJyb3IgbWVzc2FnZXMgZm9yIFRleHRWaWV3ZXIKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UZXh0Vmlld2VyLmludmFsaWRSYW5nZUFyZz1JbnZhbGlkIHJhbmdlIGFyZ3VtZW50Ci1UZXh0Vmlld2VyLmludmFsaWRWaXNpYmxlUmVnaW9uQXJnPUludmFsaWQgdmlzaWJsZSByZWdpb24gYXJndW1lbnQKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24gCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DYW5jZWxfQ3VycmVudF9PcGVyYXRpb24gPSBDYW5jZWwgQ3VycmVudCBPcGVyYXRpb24KLVNldF9TdWJUYXNrID0gezB9IHsxfQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Qcm9ibGVtX09jY3VycmVkID0gUHJvYmxlbSBPY2N1cnJlZAotUmVhc29uID0gezB9XG5cblJlYXNvbjpcbiB7MX0KLU1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLmRlZmF1bHRUb2dnbGVNZXNzYWdlID0gJlJlbWVtYmVyIG15IGRlY2lzaW9uCi1Qb3B1cERpYWxvZy5yZXNpemUgPSAmUmVzaXplCi1Qb3B1cERpYWxvZy5tb3ZlID0gJk1vdmUKLVBvcHVwRGlhbG9nLnBlcnNpc3RCb3VuZHMgPSBSJmVtZW1iZXIgU2l6ZSBhbmQgTG9jYXRpb24KLVBvcHVwRGlhbG9nLm1lbnVUb29sdGlwID0gTWVudQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotSW1hZ2Vfbm90X2ZvdW5kID0gSW1hZ2Ugbm90IGZvdW5kCi08ZW1wdHlfc2VsZWN0aW9uPiA9IDxlbXB0eSBzZWxlY3Rpb24+Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEZvbnQgcHJvcGVydGllcyBsYWJlbHMgZm9yIGRpc3BsYXlpbmcgYSBmb250Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Cb2xkSXRhbGljRm9udCA9IGJvbGQgaXRhbGljCi1Cb2xkRm9udCA9IGJvbGQKLUl0YWxpY0ZvbnQgPSBpdGFsaWMKLVJlZ3VsYXJGb250ID0gcmVndWxhcgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFN0cmluZyByZXByZXNlbnRhdGlvbnMgb2Yga2V5cyBmb3IgU3RhdHVzIGxpbmUgbWVzc2FnZXMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQ3RybCA9IEN0cmwKLUNvbW1hbmQgPSBDb21tYW5kCi1BbHQgPSBBbHQKLVNoaWZ0ID0gU2hpZnQKLUJhY2tzcGFjZSA9IEJhY2tzcGFjZQotVGFiID0gVGFiCi1SZXR1cm4gPSBSZXR1cm4KLUVudGVyID0gRW50ZXIKLUVzY2FwZSA9IEVzY2FwZQotRXNjID0gRXNjCi1EZWxldGUgPSBEZWxldGUKLVNwYWNlID0gU3BhY2UKLUFycm93X1VwID0gQXJyb3cgVXAKLUFycm93X0Rvd24gPSBBcnJvdyBEb3duCi1BcnJvd19MZWZ0ID0gQXJyb3cgTGVmdAotQXJyb3dfUmlnaHQgPSBBcnJvdyBSaWdodAotUGFnZV9VcCA9IFBhZ2UgVXAKLVBhZ2VfRG93biA9IFBhZ2UgRG93bgotSG9tZSA9IEhvbWUKLUVuZCA9IEVuZAotSW5zZXJ0ID0gSW5zZXJ0Ci1GMSA9IEYxCi1GMiA9IEYyCi1GMyA9IEYzCi1GNCA9IEY0Ci1GNSA9IEY1Ci1GNiA9IEY2Ci1GNyA9IEY3Ci1GOCA9IEY4Ci1GOSA9IEY5Ci1GMTAgPSBGMTAKLUYxMSA9IEYxMQotRjEyID0gRjEyCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU2FmZSBSdW5uYWJsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotU2FmZVJ1bm5hYmxlLmVycm9yTWVzc2FnZSA9IEFuIGVycm9yIGhhcyBvY2N1cnJlZC4gU2VlIGVycm9yIGxvZyBmb3IgbW9yZSBkZXRhaWxzLgotQ29sb3JTZWxlY3Rvci5OYW1lPUNvbG9yIFNlbGVjdG9yCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZCAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVNvcnRpbmcgPSBzb3J0aW5nCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL29wZXJhdGlvbi9BY2N1bXVsYXRpbmdQcm9ncmVzc01vbml0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL29wZXJhdGlvbi9BY2N1bXVsYXRpbmdQcm9ncmVzc01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzODhkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9vcGVyYXRpb24vQWNjdW11bGF0aW5nUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yV2l0aEJsb2NraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Qcm9ncmVzc01vbml0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQSBwcm9ncmVzcyBtb25pdG9yIHRoYXQgYWNjdW11bGF0ZXMgPGNvZGU+d29ya2VkPC9jb2RlPiBhbmQgPGNvZGU+c3VidGFzazwvY29kZT4gCi0gKiBjYWxscyBpbiB0aGUgZm9sbG93aW5nIHdheSBieSB3cmFwcGluZyBhIHN0YW5kYXJkIHByb2dyZXNzIG1vbml0b3I6Ci0gKiA8dWw+Ci0gKiA8bGk+IFdoZW4gYSA8Y29kZT53b3JrZWQ8L2NvZGU+IG9yIDxjb2RlPnN1YnRhc2s8L2NvZGU+IGNhbGwgb2NjdXJzIHRoZSBmaXJzdCB0aW1lLAotICoJCXRoZSBwcm9ncmVzcyBtb25pdG9yIHBvc3RzIGEgcnVubmFibGUgaW50byB0aGUgYXN5bmNocm9ub3VzIFNXVCBldmVudCBxdWV1ZS4KLSAqIDwvbGk+Ci0gKiA8bGk+IFN1YnNlcXVlbnQgY2FsbHMgdG8gPGNvZGU+d29ya2VkPC9jb2RlPiBvciA8Y29kZT5zdWJ0YXNrPC9jb2RlPiBkbyBub3QgcG9zdAotICoJCWEgbmV3IHJ1bm5hYmxlIGFzIGxvbmcgYXMgYSBwcmV2aW91cyBydW5uYWJsZSBzdGlsbCBleGlzdHMgaW4gdGhlIFNXVCBldmVudAotICoJCXF1ZXVlLiBJbiB0aGlzIGNhc2UsIHRoZSBwcm9ncmVzcyBtb25pdG9yIGp1c3QgdXBkYXRlcyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YKLSAqCQl0aGUgcnVubmFibGUgdGhhdCB3YWl0cyBpbiB0aGUgU1dUIGV2ZW50IHF1ZXVlIGZvciBpdHMgZXhlY3V0aW9uLiBJZiBubyBydW5uYWJsZQotICoJCWV4aXN0cywgYSBuZXcgb25lIGlzIGNyZWF0ZWQgYW5kIHBvc3RlZCBpbnRvIHRoZSBldmVudCBxdWV1ZS4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZXJuYWwgdG8gdGhlIGZyYW1ld29yazsgY2xpZW50cyBvdXRzaWRlIEpGYWNlIHNob3VsZCBub3QKLSAqIHVzZSB0aGlzIGNsYXNzLgotICogPC9wPgotICovCi0vKiBwYWNrYWdlICovY2xhc3MgQWNjdW11bGF0aW5nUHJvZ3Jlc3NNb25pdG9yIGV4dGVuZHMgUHJvZ3Jlc3NNb25pdG9yV3JhcHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb2xsZWN0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb2xsZWN0b3IgY29sbGVjdG9yOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudFRhc2sgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBjbGFzcyBDb2xsZWN0b3IgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHN1YlRhc2s7Ci0KLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgd29ya2VkOwotCi0gICAgICAgIHByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGUgYSBuZXcgY29sbGVjdG9yLgotICAgICAgICAgKiBAcGFyYW0gc3ViVGFzawotICAgICAgICAgKiBAcGFyYW0gd29yawotICAgICAgICAgKiBAcGFyYW0gbW9uaXRvcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIENvbGxlY3RvcihTdHJpbmcgc3ViVGFzaywgZG91YmxlIHdvcmssIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAgICAgdGhpcy5zdWJUYXNrID0gc3ViVGFzazsKLSAgICAgICAgICAgIHRoaXMud29ya2VkID0gd29yazsKLSAgICAgICAgICAgIHRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkIHdvcmtlZCB0byB0aGUgd29yay4KLSAgICAgICAgICogQHBhcmFtIHdvcmtlZEluY3JlbWVudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgd29ya2VkKGRvdWJsZSB3b3JrZWRJbmNyZW1lbnQpIHsKLSAgICAgICAgICAgIHRoaXMud29ya2VkID0gdGhpcy53b3JrZWQgKyB3b3JrZWRJbmNyZW1lbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBzdWJUYXNrIG5hbWUuCi0gICAgICAgICAqIEBwYXJhbSBzdWJUYXNrTmFtZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgc3ViVGFza05hbWUpIHsKLSAgICAgICAgICAgIHRoaXMuc3ViVGFzayA9IHN1YlRhc2tOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJ1biB0aGUgY29sbGVjdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgY2xlYXJDb2xsZWN0b3IodGhpcyk7Ci0gICAgICAgICAgICBpZiAoc3ViVGFzayAhPSBudWxsKQotICAgICAgICAgICAgICAgIG1vbml0b3Iuc3ViVGFzayhzdWJUYXNrKTsKLSAgICAgICAgICAgIGlmICh3b3JrZWQgPiAwKQotICAgICAgICAgICAgICAgIG1vbml0b3IuaW50ZXJuYWxXb3JrZWQod29ya2VkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gYWNjdW11bGF0aW5nIHByb2dyZXNzIG1vbml0b3Igd3JhcHBpbmcgdGhlIGdpdmVuIG9uZQotICAgICAqIHRoYXQgdXNlcyB0aGUgZ2l2ZW4gZGlzcGxheS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9uaXRvciB0aGUgYWN0dWFsIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgd3JhcHBlZAotICAgICAqIEBwYXJhbSBkaXNwbGF5IHRoZSBTV1QgZGlzcGxheSB1c2VkIHRvIGZvcndhcmQgdGhlIGNhbGxzIAotICAgICAqICB0byB0aGUgd3JhcHBlZCBwcm9ncmVzcyBtb25pdG9yCi0gICAgICovCi0gICAgcHVibGljIEFjY3VtdWxhdGluZ1Byb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIERpc3BsYXkgZGlzcGxheSkgewotICAgICAgICBzdXBlcihtb25pdG9yKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChkaXNwbGF5KTsKLSAgICAgICAgdGhpcy5kaXNwbGF5ID0gZGlzcGxheTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9ncmVzc01vbml0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYmVnaW5UYXNrKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBpbnQgdG90YWxXb3JrKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgY29sbGVjdG9yID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50VGFzayA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgZ2V0V3JhcHBlZFByb2dyZXNzTW9uaXRvcigpLmJlZ2luVGFzayhuYW1lLCB0b3RhbFdvcmspOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGNvbGxlY3RvciBvYmplY3QgdXNlZCB0byBhY2N1bXVsYXRlIHdvcmsgYW5kIHN1YnRhc2sgY2FsbHMKLSAgICAgKiBpZiBpdCBtYXRjaGVzIHRoZSBnaXZlbiBvbmUuCi0gICAgICogQHBhcmFtIGNvbGxlY3RvclRvQ2xlYXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyQ29sbGVjdG9yKENvbGxlY3RvciBjb2xsZWN0b3JUb0NsZWFyKSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY2N1bXVsYXRvciBpcyBzdGlsbCB1c2luZyB0aGUgZ2l2ZW4gY29sbGVjdG9yLgotICAgICAgICAvLyBJZiBub3QsIGRvbid0IGNsZWFyIGl0LgotICAgICAgICBpZiAodGhpcy5jb2xsZWN0b3IgPT0gY29sbGVjdG9yVG9DbGVhcikKLSAgICAgICAgICAgIHRoaXMuY29sbGVjdG9yID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhIGNvbGxlY3RvciBvYmplY3QgdG8gYWNjdW11bGF0ZSB3b3JrIGFuZCBzdWJ0YXNrIGNhbGxzLgotICAgICAqIEBwYXJhbSBzdWJUYXNrCi0gICAgICogQHBhcmFtIHdvcmsKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ29sbGVjdG9yKFN0cmluZyBzdWJUYXNrLCBkb3VibGUgd29yaykgewotICAgICAgICBjb2xsZWN0b3IgPSBuZXcgQ29sbGVjdG9yKHN1YlRhc2ssIHdvcmssIGdldFdyYXBwZWRQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKGNvbGxlY3Rvcik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvZ3Jlc3NNb25pdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvbmUoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgY29sbGVjdG9yID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBnZXRXcmFwcGVkUHJvZ3Jlc3NNb25pdG9yKCkuZG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9ncmVzc01vbml0b3IuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGludGVybmFsV29ya2VkKGZpbmFsIGRvdWJsZSB3b3JrKSB7Ci0gICAgICAgIGlmIChjb2xsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgY3JlYXRlQ29sbGVjdG9yKG51bGwsIHdvcmspOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29sbGVjdG9yLndvcmtlZCh3b3JrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb2dyZXNzTW9uaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGNvbGxlY3RvciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudFRhc2sgPSBuYW1lOwotICAgICAgICAgICAgICAgIGdldFdyYXBwZWRQcm9ncmVzc01vbml0b3IoKS5zZXRUYXNrTmFtZShuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvZ3Jlc3NNb25pdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdWJUYXNrKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChjb2xsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgY3JlYXRlQ29sbGVjdG9yKG5hbWUsIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29sbGVjdG9yLnN1YlRhc2sobmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9ncmVzc01vbml0b3IuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdvcmtlZChpbnQgd29yaykgewotICAgICAgICBpbnRlcm5hbFdvcmtlZCh3b3JrKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJvZ3Jlc3NNb25pdG9yV3JhcHBlciNjbGVhckJsb2NrZWQoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyQmxvY2tlZCgpIHsKLQotICAgICAgICAvL0lmIHRoaXMgaXMgYSBtb25pdG9yIHRoYXQgY2FuIHJlcG9ydCBibG9ja2luZyBkbyBzby4KLSAgICAgICAgLy9Eb24ndCBib3RoZXIgd2l0aCBhIGNvbGxlY3RvciBhcyB0aGlzIHNob3VsZCBvbmx5IGV2ZXIKLSAgICAgICAgLy9oYXBwZW4gb25jZSBhbmQgcHJldmVudCBhbnkgbW9yZSBwcm9ncmVzcy4KLSAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBwbSA9IGdldFdyYXBwZWRQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgaWYgKCEocG0gaW5zdGFuY2VvZiBJUHJvZ3Jlc3NNb25pdG9yV2l0aEJsb2NraW5nKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgKChJUHJvZ3Jlc3NNb25pdG9yV2l0aEJsb2NraW5nKSBwbSkuY2xlYXJCbG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgRGlhbG9nLmdldEJsb2NrZWRIYW5kbGVyKCkuY2xlYXJCbG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Qcm9ncmVzc01vbml0b3JXcmFwcGVyI3NldEJsb2NrZWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmxvY2tlZChmaW5hbCBJU3RhdHVzIHJlYXNvbikgewotICAgICAgICAvL0lmIHRoaXMgaXMgYSBtb25pdG9yIHRoYXQgY2FuIHJlcG9ydCBibG9ja2luZyBkbyBzby4KLSAgICAgICAgLy9Eb24ndCBib3RoZXIgd2l0aCBhIGNvbGxlY3RvciBhcyB0aGlzIHNob3VsZCBvbmx5IGV2ZXIKLSAgICAgICAgLy9oYXBwZW4gb25jZSBhbmQgcHJldmVudCBhbnkgbW9yZSBwcm9ncmVzcy4KLSAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBwbSA9IGdldFdyYXBwZWRQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgaWYgKCEocG0gaW5zdGFuY2VvZiBJUHJvZ3Jlc3NNb25pdG9yV2l0aEJsb2NraW5nKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgKChJUHJvZ3Jlc3NNb25pdG9yV2l0aEJsb2NraW5nKSBwbSkuc2V0QmxvY2tlZChyZWFzb24pOwotICAgICAgICAgICAgICAgIC8vRG8gbm90IGdpdmUgYSBzaGVsbCBhcyB3ZSB3YW50IGl0IHRvIGJsb2NrIHVudGlsIGl0IG9wZW5zLgotICAgICAgICAgICAgICAgIERpYWxvZy5nZXRCbG9ja2VkSGFuZGxlcigpLnNob3dCbG9ja2VkKHBtLCByZWFzb24sIGN1cnJlbnRUYXNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvb3BlcmF0aW9uL0lSdW5uYWJsZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL29wZXJhdGlvbi9JUnVubmFibGVDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YmM3OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvb3BlcmF0aW9uL0lSdW5uYWJsZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgVUkgY29tcG9uZW50cyB3aGljaCBjYW4gZXhlY3V0ZSBhIGxvbmctcnVubmluZyBvcGVyYXRpb24KLSAqIGluIHRoZSBmb3JtIG9mIGFuIDxjb2RlPklSdW5uYWJsZVdpdGhQcm9ncmVzczwvY29kZT4uCi0gKiBUaGUgY29udGV4dCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcGxheWluZyBhIHByb2dyZXNzIGluZGljYXRvciBhbmQgQ2FuY2VsCi0gKiBidXR0b24gdG8gdGhlIGVuZCB1c2VyIHdoaWxlIHRoZSBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3M7IHRoZSBjb250ZXh0Ci0gKiBzdXBwbGllcyBhIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZCBmcm9tIGNvZGUgcnVubmluZyBpbnNpZGUgdGhlIG9wZXJhdGlvbi4KLSAqIE5vdGUgdGhhdCBhbiA8Y29kZT5JUnVubmFibGVDb250ZXh0PC9jb2RlPiBpcyBub3QgYSBydW5uYWJsZSBpdHNlbGYuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlcyBvZiBVSSBjb21wb25lbnRzIHdoaWNoIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwKLSAqIHNlZSA8Y29kZT5BcHBsaWNhdGlvbldpbmRvdzwvY29kZT4sIDxjb2RlPlByb2dyZXNzTW9uaXRvckRpYWxvZzwvY29kZT4sCi0gKiBhbmQgPGNvZGU+V2l6YXJkRGlhbG9nPC9jb2RlPi4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIElSdW5uYWJsZVdpdGhQcm9ncmVzcwotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3cKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2cKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW5uYWJsZUNvbnRleHQgewotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJ1bnMgdGhlIGdpdmVuIDxjb2RlPklSdW5uYWJsZVdpdGhQcm9ncmVzczwvY29kZT4gaW4gdGhpcyBjb250ZXh0LgotICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGlzIGlzIGEgPGNvZGU+UHJvZ3Jlc3NNb25pdG9yRGlhbG9nPC9jb2RlPiB0aGVuIHRoZSBydW5uYWJsZQotICAgICAqIGlzIHJ1biB1c2luZyB0aGlzIGRpYWxvZydzIHByb2dyZXNzIG1vbml0b3IuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIElmIDxjb2RlPmZvcms8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHVzZWQKLSAgICAgKiB0byBydW4gdGhlIHJ1bm5hYmxlLiBOb3RlIHRoYXQgaWYgPGNvZGU+Zm9yazwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sCi0gICAgICogaXQgaXMgdW5zcGVjaWZpZWQgd2hldGhlciBvciBub3QgdGhpcyBtZXRob2QgYmxvY2tzIHVudGlsIHRoZSBydW5uYWJsZQotICAgICAqIGhhcyBiZWVuIHJ1bi4gSW1wbGVtZW50ZXJzIHNob3VsZCBkb2N1bWVudCB3aGV0aGVyIHRoZSBydW5uYWJsZSBpcyBydW4KLSAgICAgKiBzeW5jaHJvbm91c2x5IChibG9ja2luZykgb3IgYXN5bmNocm9ub3VzbHkgKG5vbi1ibG9ja2luZyksIG9yIGlmIG5vCi0gICAgICogYXNzdW1wdGlvbiBjYW4gYmUgbWFkZSBhYm91dCB0aGUgYmxvY2tpbmcgYmVoYXZpb3VyLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmb3JrIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBydW5uYWJsZSBzaG91bGQgYmUgcnVuIGluIGEgc2VwYXJhdGUgdGhyZWFkLAotICAgICAqICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHJ1biBpbiB0aGUgc2FtZSB0aHJlYWQKLSAgICAgKiBAcGFyYW0gY2FuY2VsYWJsZSA8Y29kZT50cnVlPC9jb2RlPiB0byBlbmFibGUgdGhlIGNhbmNlbGF0aW9uLCBhbmQKLSAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG1ha2UgdGhlIG9wZXJhdGlvbiB1bmNhbmNlbGxhYmxlCi0gICAgICogQHBhcmFtIHJ1bm5hYmxlIHRoZSBydW5uYWJsZSB0byBydW4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB3cmFwcyBhbnkgZXhjZXB0aW9uIG9yIGVycm9yIHdoaWNoIG9jY3VycyAKLSAgICAgKiAgd2hpbGUgcnVubmluZyB0aGUgcnVubmFibGUKLSAgICAgKiBAZXhjZXB0aW9uIEludGVycnVwdGVkRXhjZXB0aW9uIHByb3BhZ2F0ZWQgYnkgdGhlIGNvbnRleHQgaWYgdGhlIHJ1bm5hYmxlIAotICAgICAqICBhY2tub3dsZWRnZXMgY2FuY2VsYXRpb24gYnkgdGhyb3dpbmcgdGhpcyBleGNlcHRpb24uICBUaGlzIHNob3VsZCBub3QgYmUgdGhyb3duCi0gICAgICogIGlmIGNhbmNlbGFibGUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihib29sZWFuIGZvcmssIGJvb2xlYW4gY2FuY2VsYWJsZSwKLSAgICAgICAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL29wZXJhdGlvbi9JUnVubmFibGVXaXRoUHJvZ3Jlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL29wZXJhdGlvbi9JUnVubmFibGVXaXRoUHJvZ3Jlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyMzBhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9vcGVyYXRpb24vSVJ1bm5hYmxlV2l0aFByb2dyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIFRoZSA8Y29kZT5JUnVubmFibGVXaXRoUHJvZ3Jlc3M8L2NvZGU+IGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgYW55Ci0gKiBjbGFzcyB3aG9zZSBpbnN0YW5jZXMgYXJlIGludGVuZGVkIHRvIGJlIGV4ZWN1dGVkIGFzIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbi4KLSAqIExvbmctcnVubmluZyBvcGVyYXRpb25zIGFyZSB0eXBpY2FsbHkgcHJlc2VudGVkIGF0IHRoZSBVSSB2aWEgYSBtb2RhbCBkaWFsb2cKLSAqIHNob3dpbmcgYSBwcm9ncmVzcyBpbmRpY2F0b3IgYW5kIGEgQ2FuY2VsIGJ1dHRvbi4KLSAqIFRoZSBjbGFzcyBtdXN0IGRlZmluZSBhIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kIHRoYXQgdGFrZXMgYSBwcm9ncmVzcyBtb25pdG9yLgotICogVGhlIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kIGlzIHVzdWFsbHkgbm90IGludm9rZWQgZGlyZWN0bHksIGJ1dCByYXRoZXIgYnkKLSAqIHBhc3NpbmcgdGhlIDxjb2RlPklSdW5uYWJsZVdpdGhQcm9ncmVzczwvY29kZT4gdG8gdGhlIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kIG9mCi0gKiBhbiA8Y29kZT5JUnVubmFibGVDb250ZXh0PC9jb2RlPiwgd2hpY2ggcHJvdmlkZXMgdGhlIFVJIGZvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcgotICogYW5kIENhbmNlbCBidXR0b24uCi0gKgotICogQHNlZSBJUnVubmFibGVDb250ZXh0Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLSAgICAvKioKLSAgICAgKiBSdW5zIHRoaXMgb3BlcmF0aW9uLiAgUHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yLgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgaW52b2tlZCBieSBhbiA8Y29kZT5JUnVubmFibGVDb250ZXh0PC9jb2RlPidzIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kLAotICAgICAqIHdoaWNoIHN1cHBsaWVzIHRoZSBwcm9ncmVzcyBtb25pdG9yLgotICAgICAqIEEgcmVxdWVzdCB0byBjYW5jZWwgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgaG9ub3JlZCBhbmQgYWNrbm93bGVkZ2VkIAotICAgICAqIGJ5IHRocm93aW5nIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzIGFuZCByZWNlaXZlCi0gICAgICogICByZXF1ZXN0cyBmb3IgY2FuY2VsYXRpb24KLSAgICAgKiBAZXhjZXB0aW9uIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWYgdGhlIHJ1biBtZXRob2QgbXVzdCBwcm9wYWdhdGUgYSBjaGVja2VkIGV4Y2VwdGlvbiwKLSAgICAgKiAJaXQgc2hvdWxkIHdyYXAgaXQgaW5zaWRlIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+OyBydW50aW1lIGV4Y2VwdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkKLSAgICAgKiAgd3JhcHBlZCBpbiBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiBieSB0aGUgY2FsbGluZyBjb250ZXh0Ci0gICAgICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGRldGVjdHMgYSByZXF1ZXN0IHRvIGNhbmNlbCwgCi0gICAgICogIHVzaW5nIDxjb2RlPklQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpPC9jb2RlPiwgaXQgc2hvdWxkIGV4aXQgYnkgdGhyb3dpbmcgCi0gICAgICogIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPgotICAgICAqCi0gICAgICogQHNlZSBJUnVubmFibGVDb250ZXh0I3J1bgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9vcGVyYXRpb24vSVRocmVhZExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9vcGVyYXRpb24vSVRocmVhZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOWJhNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvb3BlcmF0aW9uL0lUaHJlYWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbjsKLQotLyoqCi0gKiBBIHRocmVhZCBsaXN0ZW5lciBpcyBhbiBvYmplY3QgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHJlY2VpdmluZyBub3RpZmljYXRpb25zCi0gKiBvZiB0aHJlYWQgY2hhbmdlcy4gIEZvciBleGFtcGxlLCBhIHRocmVhZCBsaXN0ZW5lciBjYW4gYmUgdXNlZCB0byBub3RpZnkgYSAKLSAqIHJ1bm5hYmxlIG9mIHRoZSB0aHJlYWQgdGhhdCB3aWxsIGV4ZWN1dGUgaXQsIGFsbG93aW5nIHRoZSBydW5uYWJsZSB0byB0cmFuc2ZlcgotICogdGhyZWFkLWxvY2FsIHN0YXRlIGZyb20gdGhlIGNhbGxpbmcgdGhyZWFkIGJlZm9yZSBjb250cm9sIHBhc3NlcyB0byB0aGUgbmV3IHRocmVhZC4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUaHJlYWRMaXN0ZW5lciB7Ci0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgYSB0aHJlYWQgY2hhbmdlIGlzIG9jY3VycmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGhyZWFkIFRoZSBuZXcgdGhyZWFkCi0JICovCi0JcHVibGljIHZvaWQgdGhyZWFkQ2hhbmdlKFRocmVhZCB0aHJlYWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvb3BlcmF0aW9uL01vZGFsQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvb3BlcmF0aW9uL01vZGFsQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk2ZGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL29wZXJhdGlvbi9Nb2RhbENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJvZ3Jlc3NNb25pdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHN1cHBvcnRpbmcgbW9kYWwgb3BlcmF0aW9ucy4KLSAqIFRoZSBydW5uYWJsZSBwYXNzZWQgdG8gdGhlIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kIGlzIGV4ZWN1dGVkIGluIGEKLSAqIHNlcGFyYXRlIHRocmVhZCwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgcGFzc2VkIGZvcmsgYXJndW1lbnQuIAotICogSWYgdGhlIHJ1bm5hYmxlIGlzIGV4ZWN1dGVkIGluIGEgc2VwYXJhdGUgdGhyZWFkIHRoZW4gdGhlIGN1cnJlbnQgdGhyZWFkCi0gKiBlaXRoZXIgd2FpdHMgdW50aWwgdGhlIG5ldyB0aHJlYWQgZW5kcyBvciwgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSAKLSAqIFVJIHRocmVhZCwgaXQgcG9sbHMgdGhlIFNXVCBldmVudCBxdWV1ZSBhbmQgZGlzcGF0Y2hlcyBlYWNoIGV2ZW50LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTW9kYWxDb250ZXh0IHsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlZCB3aGV0aGVyIE1vZGFsQ29udGV4dCBpcyBpbiBkZWJ1ZyBtb2RlOwotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBieSBkZWZhdWx0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG5lc3RlZCBtb2RhbCBydW5zLCBvciAwIGlmIG5vdCBpbnNpZGUgYSBtb2RhbCBydW4uCi0gICAgICogVGhpcyBpcyBnbG9iYWwgc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1vZGFsTGV2ZWwgPSAwOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3BlcmF0aW9ucyBzaG91bGQgYmUgcnVuIGluIGEgc2VwYXJhdGUgdGhyZWFkLgotICAgICAqIERlZmF1bHRzIHRvIHRydWUuCi0gICAgICogRm9yIGludGVybmFsIGRlYnVnZ2luZyB1c2UsIHNldCB0byBmYWxzZSB0byBydW4gb3BlcmF0aW9ucyBpbiB0aGUgY2FsbGluZyB0aHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBydW5JblNlcGFyYXRlVGhyZWFkID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRocmVhZCB3aGljaCBydW5zIHRoZSBtb2RhbCBjb250ZXh0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1vZGFsQ29udGV4dFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgb3BlcmF0aW9uIHRvIGJlIHJ1bi4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlOwotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIG9wZXJhdGlvbiBzdGFydGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBUaHJvd2FibGUgdGhyb3dhYmxlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIGZvciBwcm9ncmVzcyBhbmQgY2FuY2VsYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGlzcGxheSB1c2VkIGZvciBldmVudCBkaXNwYXRjaGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgRGlzcGxheSBkaXNwbGF5OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBjb250aW51ZSBldmVudCBxdWV1ZSBkaXNwYXRjaGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBjb250aW51ZUV2ZW50RGlzcGF0Y2hpbmcgPSB0cnVlOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aHJlYWQgdGhhdCBmb3JrZWQgdGhpcyBtb2RhbCBjb250ZXh0IHRocmVhZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzaW5jZSAzLjEKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgVGhyZWFkIGNhbGxpbmdUaHJlYWQ7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBtb2RhbCBjb250ZXh0LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG9wZXJhdGlvbiB0aGUgcnVubmFibGUgdG8gcnVuCi0gICAgICAgICAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzIGFuZCByZWNlaXZlCi0gICAgICAgICAqICAgcmVxdWVzdHMgZm9yIGNhbmNlbGF0aW9uCi0gICAgICAgICAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5IHRvIGJlIHVzZWQgdG8gcmVhZCBhbmQgZGlzcGF0Y2ggZXZlbnRzCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIE1vZGFsQ29udGV4dFRocmVhZChJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uLAotICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgRGlzcGxheSBkaXNwbGF5KSB7Ci0gICAgICAgICAgICBzdXBlcigiTW9kYWxDb250ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUobW9uaXRvciAhPSBudWxsICYmIGRpc3BsYXkgIT0gbnVsbCk7Ci0gICAgICAgICAgICBydW5uYWJsZSA9IG9wZXJhdGlvbjsKLSAgICAgICAgICAgIHByb2dyZXNzTW9uaXRvciA9IG5ldyBBY2N1bXVsYXRpbmdQcm9ncmVzc01vbml0b3IobW9uaXRvciwgZGlzcGxheSk7Ci0gICAgICAgICAgICB0aGlzLmRpc3BsYXkgPSBkaXNwbGF5OwotICAgICAgICAgICAgdGhpcy5jYWxsaW5nVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFRocmVhZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJ1bm5hYmxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bihwcm9ncmVzc01vbml0b3IpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvd2FibGUgPSBlOwotICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocmVhZERlYXRoIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gcHJvcGFnYXRlIFRocmVhZERlYXRoLCBvciB0aHJlYWRzIHdpbGwgbmV2ZXIgZnVsbHkgdGVybWluYXRlCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvd2FibGUgPSBlOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAvL25vdGlmeSB0aGUgb3BlcmF0aW9uIG9mIGNoYW5nZSBvZiB0aHJlYWQgb2YgY29udHJvbAotICAgICAgICAgICAgCWlmIChydW5uYWJsZSBpbnN0YW5jZW9mIElUaHJlYWRMaXN0ZW5lcikKLSAgICAgICAgICAgIAkJKChJVGhyZWFkTGlzdGVuZXIpcnVubmFibGUpLnRocmVhZENoYW5nZShjYWxsaW5nVGhyZWFkKTsKLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhbGwgZXZlbnRzIGluIHRoZSBhc3luY2hyb25vdXMgZXZlbnQgcXVldWUKLSAgICAgICAgICAgICAgICAvLyBhcmUgZGlzcGF0Y2hlZC4KLSAgICAgICAgICAgICAgICBkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTdG9wIGV2ZW50IGRpc3BhdGNoaW5nCi0gICAgICAgICAgICAgICAgY29udGludWVFdmVudERpc3BhdGNoaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgZXZlbnQgbG9vcCB0byByZXR1cm4gZnJvbSBzbGVlcCAoKSBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgLy8gaXQgc3RvcHMgZXZlbnQgZGlzcGF0Y2hpbmcuCi0gICAgICAgICAgICAgICAgZGlzcGxheS5hc3luY0V4ZWMobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUHJvY2Vzc2VzIGV2ZW50cyBvciB3YWl0cyB1bnRpbCB0aGlzIG1vZGFsIGNvbnRleHQgdGhyZWFkIHRlcm1pbmF0ZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBibG9jaygpIHsKLSAgICAgICAgICAgIGlmIChkaXNwbGF5ID09IERpc3BsYXkuZ2V0Q3VycmVudCgpKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRpbnVlRXZlbnREaXNwYXRjaGluZykgewotICAgICAgICAgICAgICAgIAkvLyBSdW4gdGhlIGV2ZW50IGxvb3AuICBIYW5kbGUgYW55IHVuY2F1Z2h0IGV4Y2VwdGlvbnMgY2F1c2VkCi0gICAgICAgICAgICAgICAgCS8vIGJ5IFVJIGV2ZW50cy4KLSAgICAgICAgICAgICAgICAgICAJdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIAlkaXNwbGF5LnNsZWVwKCk7Ci0gICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgICAJLy8gVGhyZWFkRGVhdGggaXMgYSBub3JtYWwgZXJyb3Igd2hlbiB0aGUgdGhyZWFkIGlzIGR5aW5nLiAgV2UgbXVzdAotICAgICAgICAgICAgICAgICAgIAkvLyBwcm9wYWdhdGUgaXQgaW4gb3JkZXIgZm9yIGl0IHRvIHByb3Blcmx5IHRlcm1pbmF0ZS4KLSAgICAgICAgICAgICAgICAJY2F0Y2ggKFRocmVhZERlYXRoIGUpIHsKLSAgICAgICAgICAgICAgICAgICAJCXRocm93IChlKTsKLSAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIAkvLyBGb3IgYWxsIG90aGVyIGV4Y2VwdGlvbnMsIGxvZyB0aGUgcHJvYmxlbS4KLSAgICAgICAgICAgICAgICAJY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVuaGFuZGxlZCBldmVudCBsb29wIGV4Y2VwdGlvbiBkdXJpbmcgYmxvY2tlZCBtb2RhbCBjb250ZXh0LiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgam9pbigpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZpcnN0IHByb2dyZXNzIG1vbml0b3IgaXMgdGhlIHNhbWUgYXMsIG9yCi0gICAgICogYSB3cmFwcGVyIGFyb3VuZCwgdGhlIHNlY29uZCBwcm9ncmVzcyBtb25pdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIG1vbml0b3IxIHRoZSBmaXJzdCBwcm9ncmVzcyBtb25pdG9yCi0gICAgICogQHBhcmFtIG1vbml0b3IyIHRoZSBzZWNvbmQgcHJvZ3Jlc3MgbW9uaXRvcgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpcnN0IGlzIHRoZSBzYW1lIGFzLCBvcgotICAgICAqICAgYSB3cmFwcGVyIGFyb3VuZCwgdGhlIHNlY29uZAotICAgICAqIEBzZWUgUHJvZ3Jlc3NNb25pdG9yV3JhcHBlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5Qcm9ncmVzc01vbml0b3JCZVVzZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMSwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjIpIHsKLSAgICAgICAgaWYgKG1vbml0b3IxID09IG1vbml0b3IyKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgd2hpbGUgKG1vbml0b3IxIGluc3RhbmNlb2YgUHJvZ3Jlc3NNb25pdG9yV3JhcHBlcikgewotICAgICAgICAgICAgbW9uaXRvcjEgPSAoKFByb2dyZXNzTW9uaXRvcldyYXBwZXIpIG1vbml0b3IxKQotICAgICAgICAgICAgICAgICAgICAuZ2V0V3JhcHBlZFByb2dyZXNzTW9uaXRvcigpOwotICAgICAgICAgICAgaWYgKG1vbml0b3IxID09IG1vbml0b3IyKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2l0aCB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvciBhbmQgdGhyb3dzIAotICAgICAqIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPiBpZiBpdCBoYXMgYmVlbiBjYW5jZWxlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBDb2RlIGluIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZAotICAgICAqIHJlZ3VsYXJseSBzbyB0aGF0IGEgcmVxdWVzdCB0byBjYW5jZWwgd2lsbCBiZSBob25vcmVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBDb252ZW5pZW5jZSBmb3I6Ci0gICAgICogPHByZT4KLSAgICAgKiBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICogICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IKLSAgICAgKiBAZXhjZXB0aW9uIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIGNhbmNlbGxpbmcgdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQKLSAgICAgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZCgpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQ2FuY2VsZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IGFjdGl2ZSBtb2RhbCBjb250ZXh0IHRocmVhZCwgb3IgbnVsbCBpZiBubyBtb2RhbCBjb250ZXh0IGlzIGFjdGl2ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBNb2RhbENvbnRleHRUaHJlYWQgZ2V0Q3VycmVudE1vZGFsQ29udGV4dFRocmVhZCgpIHsKLSAgICAgICAgVGhyZWFkIHQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotICAgICAgICBpZiAodCBpbnN0YW5jZW9mIE1vZGFsQ29udGV4dFRocmVhZCkKLSAgICAgICAgICAgIHJldHVybiAoTW9kYWxDb250ZXh0VGhyZWFkKSB0OwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb2RhbCBuZXN0aW5nIGxldmVsLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtb2RhbCBuZXN0aW5nIGxldmVsIGluY3JlYXNlcyBieSBvbmUgZWFjaCB0aW1lIHRoZQotICAgICAqIDxjb2RlPk1vZGFsQ29udGV4dC5ydW48L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQgd2l0aGluIHRoZQotICAgICAqIGR5bmFtaWMgc2NvcGUgb2YgYW5vdGhlciBjYWxsIHRvIDxjb2RlPk1vZGFsQ29udGV4dC5ydW48L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG1vZGFsIG5lc3RpbmcgbGV2ZWwsIG9yIDxjb2RlPjA8L2NvZGU+IGlmIAotICAgICAqICB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb3V0c2lkZSB0aGUgZHluYW1pYyBzY29wZSBvZiBhbnkKLSAgICAgKiAgaW52b2NhdGlvbiBvZiA8Y29kZT5Nb2RhbENvbnRleHQucnVuPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE1vZGFsTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiBtb2RhbExldmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gdGhyZWFkIGlzIHJ1bm5pbmcgYSBtb2RhbCBjb250ZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSB0aHJlYWQgVGhlIHRocmVhZCB0byBiZSBjaGVja2VkCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gdGhyZWFkIGlzIHJ1bm5pbmcgYSBtb2RhbCBjb250ZXh0LCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTW9kYWxDb250ZXh0VGhyZWFkKFRocmVhZCB0aHJlYWQpIHsKLSAgICAgICAgcmV0dXJuIHRocmVhZCBpbnN0YW5jZW9mIE1vZGFsQ29udGV4dFRocmVhZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIHRoZSBnaXZlbiBydW5uYWJsZSBpbiBhIG1vZGFsIGNvbnRleHQsIHBhc3NpbmcgaXQgYSBwcm9ncmVzcyBtb25pdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtb2RhbCBuZXN0aW5nIGxldmVsIGlzIGluY3JlYXNlZCBieSBvbmUgZnJvbSB0aGUgcGVyc3BlY3RpdmUKLSAgICAgKiBvZiB0aGUgZ2l2ZW4gcnVubmFibGUuCi0gICAgICogPC9wPgotICAgICAqPHA+Ci0gICAgICogSWYgdGhlIHN1cHBsaWVkIG9wZXJhdGlvbiBpbXBsZW1lbnRzIDxjb2RlPklUaHJlYWRMaXN0ZW5lcjwvY29kZT4sIGl0Ci0gICAgICogd2lsbCBiZSBub3RpZmllZCBvZiBhbnkgdGhyZWFkIGNoYW5nZXMgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9uLgotICAgICAqIFNwZWNpZmljYWxseSwgdGhlIG9wZXJhdGlvbiB3aWxsIGJlIG5vdGlmaWVkIG9mIHRoZSB0aHJlYWQgdGhhdCB3aWxsIGNhbGwgaXRzIAotICAgICAqIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kIGJlZm9yZSBpdCBpcyBjYWxsZWQsIGFuZCB3aWxsIGJlIG5vdGlmaWVkIG9mIHRoZQotICAgICAqIGNoYW5nZSBvZiBjb250cm9sIGJhY2sgdG8gdGhlIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIHdoZW4gdGhlIG9wZXJhdGlvbgotICAgICAqIGNvbXBsZXRlcy4gIFRoZXNlIHRocmVhZCBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBnaXZlIHRoZSBvcGVyYXRpb24gYW4gCi0gICAgICogb3Bwb3J0dW5pdHkgdG8gdHJhbnNmZXIgYW55IHRocmVhZC1sb2NhbCBzdGF0ZSB0byB0aGUgZXhlY3V0aW9uIHRocmVhZCBiZWZvcmUgCi0gICAgICogY29udHJvbCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3IHRocmVhZC4KLSAgICAgKjwvcD4KLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIHRoZSBydW5uYWJsZSB0byBydW4KLSAgICAgKiBAcGFyYW0gZm9yayA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcnVubmFibGUgc2hvdWxkIHJ1biBpbiBhIHNlcGFyYXRlIHRocmVhZCwKLSAgICAgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaW4gdGhlIHNhbWUgdGhyZWFkCi0gICAgICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgYW5kIHJlY2VpdmUKLSAgICAgKiAgIHJlcXVlc3RzIGZvciBjYW5jZWxhdGlvbgotICAgICAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5IHRvIGJlIHVzZWQgdG8gcmVhZCBhbmQgZGlzcGF0Y2ggZXZlbnRzCi0gICAgICogQGV4Y2VwdGlvbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGlmIHRoZSBydW4gbWV0aG9kIG11c3QgcHJvcGFnYXRlIGEgY2hlY2tlZCBleGNlcHRpb24sCi0gICAgICogCWl0IHNob3VsZCB3cmFwIGl0IGluc2lkZSBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPjsgcnVudGltZSBleGNlcHRpb25zIGFuZCBlcnJvcnMgYXJlIGF1dG9tYXRpY2FsbHkKLSAgICAgKiAgd3JhcHBlZCBpbiBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiBieSB0aGlzIG1ldGhvZAotICAgICAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBkZXRlY3RzIGEgcmVxdWVzdCB0byBjYW5jZWwsIAotICAgICAqICB1c2luZyA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTwvY29kZT4sIGl0IHNob3VsZCBleGl0IGJ5IHRocm93aW5nIAotICAgICAqICA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT47IHRoaXMgbWV0aG9kIHByb3BhZ2F0ZXMgdGhlIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW4oSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiwgYm9vbGVhbiBmb3JrLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBEaXNwbGF5IGRpc3BsYXkpCi0gICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBBc3NlcnQuaXNUcnVlKG9wZXJhdGlvbiAhPSBudWxsICYmIG1vbml0b3IgIT0gbnVsbCk7Ci0KLSAgICAgICAgbW9kYWxMZXZlbCsrOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBtb25pdG9yLnNldENhbmNlbGVkKGZhbHNlKTsKLSAgICAgICAgICAgIC8vIElzIHRoZSBydW5uYWJsZSBzdXBwb3NlZCB0byBiZSBleGVjdXRlIGluIHRoZSBzYW1lIHRocmVhZC4KLSAgICAgICAgICAgIGlmICghZm9yayB8fCAhcnVuSW5TZXBhcmF0ZVRocmVhZCkgewotICAgICAgICAgICAgICAgIHJ1bkluQ3VycmVudFRocmVhZChvcGVyYXRpb24sIG1vbml0b3IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBNb2RhbENvbnRleHRUaHJlYWQgdCA9IGdldEN1cnJlbnRNb2RhbENvbnRleHRUaHJlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5pc1RydWUoY2FuUHJvZ3Jlc3NNb25pdG9yQmVVc2VkKG1vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcm9ncmVzc01vbml0b3IpKTsKLSAgICAgICAgICAgICAgICAgICAgcnVuSW5DdXJyZW50VGhyZWFkKG9wZXJhdGlvbiwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdCA9IG5ldyBNb2RhbENvbnRleHRUaHJlYWQob3BlcmF0aW9uLCBtb25pdG9yLCBkaXNwbGF5KTsKLSAgICAgICAgICAgICAgICAJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIElUaHJlYWRMaXN0ZW5lcikKLSAgICAgICAgICAgICAgICAJCSgoSVRocmVhZExpc3RlbmVyKW9wZXJhdGlvbikudGhyZWFkQ2hhbmdlKHQpOwotICAgICAgICAgICAgICAgICAgICB0LnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHQuYmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSA9IHQudGhyb3dhYmxlOwotICAgICAgICAgICAgICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKHRocm93YWJsZSBpbnN0YW5jZW9mIEludGVycnVwdGVkRXhjZXB0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKHRocm93YWJsZSBpbnN0YW5jZW9mIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJFeGNlcHRpb24gaW4gbW9kYWwgY29udGV4dCBvcGVyYXRpb246Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYWxsZWQgZnJvbToiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGNyZWF0ZSB0aGUgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBvbiB0aGUgdGhyb3dhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBpdCB3aWxsIHByaW50IGl0cyBzdGFjayB0cmFjZSAoZnJvbSB0aGUgb3RoZXIgdGhyZWFkKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgdGhyb3dhYmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aHJvd2FibGUgaW5zdGFuY2VvZiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChJbnRlcnJ1cHRlZEV4Y2VwdGlvbikgdGhyb3dhYmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aHJvd2FibGUgaW5zdGFuY2VvZiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSAxR0FOM0w1OiBJVFBVSTpXSU4yMDAwIC0gTW9kYWxDb250ZXh0IGNvbnZlcnRzIE9wZXJhdGlvbkNhbmNlbEV4Y2VwdGlvbiBpbnRvIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24odGhyb3dhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24odGhyb3dhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1vZGFsTGV2ZWwtLTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1biBhIHJ1bm5hYmxlLiAgQ29udmVydCBhbGwgdGhyb3duIGV4Y2VwdGlvbnMgdG8gCi0gICAgICogZWl0aGVyIEludGVycnVwdGVkRXhjZXB0aW9uIG9yIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJ1bkluQ3VycmVudFRocmVhZChJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLAotICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocnVubmFibGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBydW5uYWJsZS5ydW4ocHJvZ3Jlc3NNb25pdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyZWFkRGVhdGggZSkgewotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHByb3BhZ2F0ZSBUaHJlYWREZWF0aCwgb3IgdGhyZWFkcyB3aWxsIG5ldmVyIGZ1bGx5IHRlcm1pbmF0ZQotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXJyb3IgZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgTW9kYWxDb250ZXh0IGlzIHJ1bm5pbmcgaW4gZGVidWcgbW9kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWJ1Z01vZGUgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGRlYnVnIG1vZGUsIAotICAgICAqICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBub3JtYWwgbW9kZSAodGhlIGRlZmF1bHQpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlYnVnTW9kZShib29sZWFuIGRlYnVnTW9kZSkgewotICAgICAgICBkZWJ1ZyA9IGRlYnVnTW9kZTsKLSAgICB9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgTW9kYWxDb250ZXh0IG1heSBwcm9jZXNzIGV2ZW50cyAoYnkgY2FsbGluZyA8Y29kZT5EaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpPC9jb2RlPikKLQkgKiB3aGlsZSBydW5uaW5nIG9wZXJhdGlvbnMuIEJ5IGRlZmF1bHQsIE1vZGFsQ29udGV4dCB3aWxsIHByb2Nlc3MgZXZlbnRzIHdoaWxlIHJ1bm5pbmcgb3BlcmF0aW9ucy4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gZGlzYWxsb3cgZXZlbnQgcHJvY2Vzc2luZyB0ZW1wb3JhcmlseS4KLQkgKiBAcGFyYW0gYWxsb3dSZWFkQW5kRGlzcGF0Y2ggPGNvZGU+dHJ1ZTwvY29kZT4gKHRoZSBkZWZhdWx0KSBpZiBldmVudHMgbWF5IGJlIHByb2Nlc3NlZCB3aGlsZQotCSAqIHJ1bm5pbmcgYW4gb3BlcmF0aW9uLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgRGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSBzaG91bGQgbm90IGJlIGNhbGxlZAotCSAqIGZyb20gTW9kYWxDb250ZXh0LgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWxsb3dSZWFkQW5kRGlzcGF0Y2goYm9vbGVhbiBhbGxvd1JlYWRBbmREaXNwYXRjaCkgewotCQkvLyB1c2UgYSBzZXBhcmF0ZSB0aHJlYWQgaWYgYW5kIG9ubHkgaWYgaXQgaXMgT0sgdG8gc3BpbiB0aGUgZXZlbnQgbG9vcAotCQlydW5JblNlcGFyYXRlVGhyZWFkID0gYWxsb3dSZWFkQW5kRGlzcGF0Y2g7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvb3BlcmF0aW9uL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL29wZXJhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODI4YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvb3BlcmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyBKRmFjZSBzdXBwb3J0IGZvciBsb25nLXJ1bm5pbmcgb3BlcmF0aW9ucy4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci1Mb25nLXJ1bm5pbmcgb3BlcmF0aW9ucyBtdXN0IGJlIGRlYWx0IHdpdGggc3BlY2lhbGx5IGluIG9yZGVyIHRvIGtlZXAgdGhlCi1VSSBoZWxwZnVsIGFuZCByZXNwb25zaXZlLiBUeXBpY2FsbHkgdGhpcyBpbnZvbHZlcyB0ZW1wb3JhcmlseSBkaXNhYmxpbmcKLW1vc3QgY29udHJvbHMgYW5kIGRpc3BsYXlpbmcgYSBidXN5IGN1cnNvciBhbmQgcHJvZ3Jlc3MgaW5kaWNhdG9yOyB3aGlsZQotdGhlIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcywgdGhlIG9ubHkgcmVxdWVzdHMgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIHdpbGwKLWJlIG9uZXMgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24uCi08cD5UaGUgPHR0PklSdW5uYWJsZVdpdGhQcm9ncmVzczwvdHQ+IGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkKLWFueSBjbGFzcyB3aG9zZSBpbnN0YW5jZXMgYXJlIGludGVuZGVkIHRvIGJlIGV4ZWN1dGVkIGFzIGxvbmctcnVubmluZyBvcGVyYXRpb25zLgotVGhlc2Ugb2JqZWN0cyBjYW4gdGhlbiBiZSBydW4gaW4gYW55IHJ1bm5hYmxlIGNvbnRleHQgKDx0dD5JUnVubmFibGVDb250ZXh0PC90dD4pLAotaW5jbHVkaW5nIHN1Y2ggc3RhbmRhcmQgSkZhY2UgVUkgY29tcG9uZW50cyBhcyBhcHBsaWNhdGlvbiB3aW5kb3dzICg8dHQ+QXBwbGljYXRpb25XaW5kb3c8L3R0PiksCi13aXphcmQgZGlhbG9ncyAoPHR0PldpemFyZERpYWxvZzwvdHQ+KSwgYW5kIHByb2dyZXNzIG1vbml0b3IgZGlhbG9ncyAoPHR0PlByb2dyZXNzTW9uaXRvckRpYWxvZzwvdHQ+KS4KLVRoZSB1dGlsaXR5IGNsYXNzIDx0dD5Nb2RhbENvbnRleHQ8L3R0PiBkZWZpbmVzIHRoZSBiYXNpYyBtZWNoYW5pc20gYW5kCi1VSSBldmVudCBsb29wIGZvciBtb2RhbCBvcGVyYXRpb25zLgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9Cb29sZWFuRmllbGRFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvQm9vbGVhbkZpZWxkRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZGUyN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9Cb29sZWFuRmllbGRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0vKioKLSAqIEEgZmllbGQgZWRpdG9yIGZvciBhIGJvb2xlYW4gdHlwZSBwcmVmZXJlbmNlLgotICovCi1wdWJsaWMgY2xhc3MgQm9vbGVhbkZpZWxkRWRpdG9yIGV4dGVuZHMgRmllbGRFZGl0b3IgewotCi0gICAgLyoqCi0gICAgICogU3R5bGUgY29uc3RhbnQgKHZhbHVlIDxjb2RlPjA8L2NvZGU+KSBpbmRpY2F0aW5nIHRoZSBkZWZhdWx0Ci0gICAgICogbGF5b3V0IHdoZXJlIHRoZSBmaWVsZCBlZGl0b3IncyBjaGVjayBib3ggYXBwZWFycyB0byB0aGUgbGVmdAotICAgICAqIG9mIHRoZSBsYWJlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUID0gMDsKLQotICAgIC8qKgotICAgICAqIFN0eWxlIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4xPC9jb2RlPikgaW5kaWNhdGluZyBhIGxheW91dCAKLSAgICAgKiB3aGVyZSB0aGUgZmllbGQgZWRpdG9yJ3MgbGFiZWwgYXBwZWFycyBvbiB0aGUgbGVmdAotICAgICAqIHdpdGggYSBjaGVjayBib3ggb24gdGhlIHJpZ2h0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUEFSQVRFX0xBQkVMID0gMTsKLQotICAgIC8qKgotICAgICAqIFN0eWxlIGJpdHMuIEVpdGhlciA8Y29kZT5ERUZBVUxUPC9jb2RlPiBvcgotICAgICAqIDxjb2RlPlNFUEFSQVRFX0xBQkVMPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBzdHlsZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBwcmV2aW91c2x5IHNlbGVjdGVkLCBvciAiYmVmb3JlIiwgdmFsdWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHdhc1NlbGVjdGVkOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNoZWNrYm94IGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBCdXR0b24gY2hlY2tCb3ggPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBib29sZWFuIGZpZWxkIGVkaXRvciAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbkZpZWxkRWRpdG9yKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBib29sZWFuIGZpZWxkIGVkaXRvciBpbiB0aGUgZ2l2ZW4gc3R5bGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdGhpcyBmaWVsZCBlZGl0b3Igd29ya3Mgb24KLSAgICAgKiBAcGFyYW0gbGFiZWxUZXh0IHRoZSBsYWJlbCB0ZXh0IG9mIHRoZSBmaWVsZCBlZGl0b3IKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlLCBlaXRoZXIgPGNvZGU+REVGQVVMVDwvY29kZT4gb3IKLSAgICAgKiAgIDxjb2RlPlNFUEFSQVRFX0xBQkVMPC9jb2RlPgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGUgZmllbGQgZWRpdG9yJ3MgY29udHJvbAotICAgICAqIEBzZWUgI0RFRkFVTFQKLSAgICAgKiBAc2VlICNTRVBBUkFURV9MQUJFTAotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuRmllbGRFZGl0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBsYWJlbFRleHQsIGludCBzdHlsZSwKLSAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaW5pdChuYW1lLCBsYWJlbFRleHQpOwotICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7Ci0gICAgICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgYm9vbGVhbiBmaWVsZCBlZGl0b3IgaW4gdGhlIGRlZmF1bHQgc3R5bGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdGhpcyBmaWVsZCBlZGl0b3Igd29ya3Mgb24KLSAgICAgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsIHRleHQgb2YgdGhlIGZpZWxkIGVkaXRvcgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGUgZmllbGQgZWRpdG9yJ3MgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuRmllbGRFZGl0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBsYWJlbCwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICB0aGlzKG5hbWUsIGxhYmVsLCBERUZBVUxULCBwYXJlbnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRqdXN0Rm9yTnVtQ29sdW1ucyhpbnQgbnVtQ29sdW1ucykgewotICAgICAgICBpZiAoc3R5bGUgPT0gU0VQQVJBVEVfTEFCRUwpCi0gICAgICAgICAgICBudW1Db2x1bW5zLS07Ci0gICAgICAgICgoR3JpZERhdGEpIGNoZWNrQm94LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9GaWxsSW50b0dyaWQoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBnZXRMYWJlbFRleHQoKTsKLSAgICAgICAgc3dpdGNoIChzdHlsZSkgewotICAgICAgICBjYXNlIFNFUEFSQVRFX0xBQkVMOgotICAgICAgICAgICAgZ2V0TGFiZWxDb250cm9sKHBhcmVudCk7Ci0gICAgICAgICAgICBudW1Db2x1bW5zLS07Ci0gICAgICAgICAgICB0ZXh0ID0gbnVsbDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNoZWNrQm94ID0gZ2V0Q2hhbmdlQ29udHJvbChwYXJlbnQpOwotICAgICAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gbnVtQ29sdW1uczsKLSAgICAgICAgICAgIGNoZWNrQm94LnNldExheW91dERhdGEoZ2QpOwotICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjaGVja0JveC5zZXRUZXh0KHRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKiBMb2FkcyB0aGUgdmFsdWUgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhbmQgc2V0cyBpdCB0bwotICAgICAqIHRoZSBjaGVjayBib3guCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKCkgewotICAgICAgICBpZiAoY2hlY2tCb3ggIT0gbnVsbCkgewotICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRCb29sZWFuKGdldFByZWZlcmVuY2VOYW1lKCkpOwotICAgICAgICAgICAgY2hlY2tCb3guc2V0U2VsZWN0aW9uKHZhbHVlKTsKLSAgICAgICAgICAgIHdhc1NlbGVjdGVkID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqIExvYWRzIHRoZSBkZWZhdWx0IHZhbHVlIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUgYW5kIHNldHMgaXQgdG8KLSAgICAgKiB0aGUgY2hlY2sgYm94LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvTG9hZERlZmF1bHQoKSB7Ci0gICAgICAgIGlmIChjaGVja0JveCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sZWFuIHZhbHVlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdEJvb2xlYW4oCi0gICAgICAgICAgICAgICAgICAgIGdldFByZWZlcmVuY2VOYW1lKCkpOwotICAgICAgICAgICAgY2hlY2tCb3guc2V0U2VsZWN0aW9uKHZhbHVlKTsKLSAgICAgICAgICAgIHdhc1NlbGVjdGVkID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvU3RvcmUoKSB7Ci0gICAgICAgIGdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKGdldFByZWZlcmVuY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgY2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCBlZGl0b3IncyBjdXJyZW50IHZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBjaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGFuZ2UgYnV0dG9uIGZvciB0aGlzIGZpZWxkIGVkaXRvci4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBDb21wb3NpdGUgdG8gY3JlYXRlIHRoZSByZWNlaXZlciBpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNoYW5nZSBidXR0b24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQnV0dG9uIGdldENoYW5nZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpZiAoY2hlY2tCb3ggPT0gbnVsbCkgewotICAgICAgICAgICAgY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotICAgICAgICAgICAgY2hlY2tCb3guc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgICAgIGNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NlbGVjdGVkID0gY2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlQ2hhbmdlZCh3YXNTZWxlY3RlZCwgaXNTZWxlY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgIHdhc1NlbGVjdGVkID0gaXNTZWxlY3RlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGNoZWNrQm94LmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICBjaGVja0JveCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGVja1BhcmVudChjaGVja0JveCwgcGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hlY2tCb3g7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mQ29udHJvbHMoKSB7Ci0gICAgICAgIHN3aXRjaCAoc3R5bGUpIHsKLSAgICAgICAgY2FzZSBTRVBBUkFURV9MQUJFTDoKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBpZiAoY2hlY2tCb3ggIT0gbnVsbCkgewotICAgICAgICAgICAgY2hlY2tCb3guc2V0Rm9jdXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHN1cGVyLnNldExhYmVsVGV4dCh0ZXh0KTsKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBnZXRMYWJlbENvbnRyb2woKTsKLSAgICAgICAgaWYgKGxhYmVsID09IG51bGwgJiYgY2hlY2tCb3ggIT0gbnVsbCkgewotICAgICAgICAgICAgY2hlY2tCb3guc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZm9ybXMgdGhpcyBmaWVsZCBlZGl0b3IncyBsaXN0ZW5lciwgaWYgaXQgaGFzIG9uZSwgYWJvdXQgYSBjaGFuZ2UKLSAgICAgKiB0byB0aGUgdmFsdWUgKDxjb2RlPlZBTFVFPC9jb2RlPiBwcm9wZXJ0eSkgcHJvdmlkZWQgdGhhdCB0aGUgb2xkIGFuZAotICAgICAqIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotICAgICAgICBzZXRQcmVzZW50c0RlZmF1bHRWYWx1ZShmYWxzZSk7Ci0gICAgICAgIGlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkKLSAgICAgICAgICAgIGZpcmVTdGF0ZUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIEZpZWxkRWRpdG9yLnNldEVuYWJsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvL09ubHkgY2FsbCBzdXBlciBpZiB0aGVyZSBpcyBhIGxhYmVsIGFscmVhZHkKLSAgICAgICAgaWYgKHN0eWxlID09IFNFUEFSQVRFX0xBQkVMKQotICAgICAgICAgICAgc3VwZXIuc2V0RW5hYmxlZChlbmFibGVkLCBwYXJlbnQpOwotICAgICAgICBnZXRDaGFuZ2VDb250cm9sKHBhcmVudCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvQm9vbGVhblByb3BlcnR5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0Jvb2xlYW5Qcm9wZXJ0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTE1NzMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvQm9vbGVhblByb3BlcnR5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBUaGUgQm9vbGVhblByb3BlcnR5QWN0aW9uIGlzIGFuIGFjdGlvbiB0aGF0IHNldCB0aGUgdmFsdWVzIG9mIGEgCi0gKiBib29sZWFuIHByb3BlcnR5IGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCb29sZWFuUHJvcGVydHlBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0gICAgcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIGRpc3BsYXlhYmxlIG5hbWUgb2YgdGhlIGFjdGlvbi4KLSAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZVN0b3JlIFRoZSBwcmVmZXJlbmNlIHN0b3JlIHRvIHByb3BvZ2F0ZSBjaGFuZ2VzIHRvCi0gICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0aGF0IGlzIGJlaW5nIHVwZGF0ZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgcHJlZmVyZW5jZVN0b3JlIG9yCi0gICAgICogcHJvcGVydHkgYXJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuUHJvcGVydHlBY3Rpb24oU3RyaW5nIHRpdGxlLAotICAgICAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBzdXBlcih0aXRsZSwgQVNfQ0hFQ0tfQk9YKTsKLQotICAgICAgICBpZiAocHJlZmVyZW5jZVN0b3JlID09IG51bGwgfHwgcHJvcGVydHkgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICB0aGlzLnByZWZlcmVuY2VTdG9yZSA9IHByZWZlcmVuY2VTdG9yZTsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgICAgICBmaW5hbCBTdHJpbmcgZmluYWxQcm9wcmV0eSA9IHByb3BlcnR5OwotCi0gICAgICAgIHByZWZlcmVuY2VTdG9yZQotICAgICAgICAgICAgICAgIC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsUHJvcHJldHkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENoZWNrZWQoQm9vbGVhbi5UUlVFLmVxdWFscyhldmVudC5nZXROZXdWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICBzZXRDaGVja2VkKHByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKHByb3BlcnR5KSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIHByZWZlcmVuY2VTdG9yZS5zZXRWYWx1ZShwcm9wZXJ0eSwgaXNDaGVja2VkKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvQ29sb3JGaWVsZEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9Db2xvckZpZWxkRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MmZmZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9Db2xvckZpZWxkRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIEEgZmllbGQgZWRpdG9yIGZvciBhIGNvbG9yIHR5cGUgcHJlZmVyZW5jZS4KLSAqLwotcHVibGljIGNsYXNzIENvbG9yRmllbGRFZGl0b3IgZXh0ZW5kcyBGaWVsZEVkaXRvciB7Ci0KLQkvKioKLQkgKiBUaGUgY29sb3Igc2VsZWN0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGNvbG9yU2VsZWN0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbG9yIGZpZWxkIGVkaXRvcgotCSAqLwotCXByb3RlY3RlZCBDb2xvckZpZWxkRWRpdG9yKCkgewotCQkvL05vIGRlZmF1bHQgYmVoYXZpb3IKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29sb3IgZmllbGQgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0aGlzIGZpZWxkIGVkaXRvciB3b3JrcyBvbgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBsYWJlbCB0ZXh0IG9mIHRoZSBmaWVsZCBlZGl0b3IKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9mIHRoZSBmaWVsZCBlZGl0b3IncyBjb250cm9sCi0JICovCi0JcHVibGljIENvbG9yRmllbGRFZGl0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBsYWJlbFRleHQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIobmFtZSwgbGFiZWxUZXh0LCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRqdXN0Rm9yTnVtQ29sdW1ucyhpbnQgbnVtQ29sdW1ucykgewotCQkoKEdyaWREYXRhKSBjb2xvclNlbGVjdG9yLmdldEJ1dHRvbigpLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zIC0gMTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgaW1hZ2UgZGlzcGxheWVkIG9uIHRoZSBidXR0b24uCi0JICogPHA+Ci0JICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKiAgICAgICAgICAgIHRoZSB3aW5kb3cgdG8gY3JlYXRlIGEgR0Mgb24gZm9yIGNhbGN1bGF0aW9uLgotCSAqIEByZXR1cm4gUG9pbnQgVGhlIGltYWdlIHNpemUKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVJbWFnZVNpemUoQ29udHJvbCB3aW5kb3cpIHsKLQkJLy8gTWFrZSB0aGUgaW1hZ2UgaGVpZ2h0IGFzIGhpZ2ggYXMgYSBjb3JyZXNwb25kaW5nIGNoYXJhY3Rlci4gVGhpcwotCQkvLyBtYWtlcyBzdXJlIHRoYXQgdGhlIGJ1dHRvbiBoYXMgdGhlIHNhbWUgc2l6ZSBhcyBhICJub3JtYWwiIHRleHQKLQkJLy8gYnV0dG9uLgotCQlHQyBnYyA9IG5ldyBHQyh3aW5kb3cpOwotCQlGb250IGYgPSBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoCi0JCQkJSkZhY2VSZXNvdXJjZXMuREVGQVVMVF9GT05UKTsKLQkJZ2Muc2V0Rm9udChmKTsKLQkJaW50IGhlaWdodCA9IGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJUG9pbnQgcCA9IG5ldyBQb2ludChoZWlnaHQgKiAzIC0gNiwgaGVpZ2h0KTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0ZpbGxJbnRvR3JpZChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRMYWJlbENvbnRyb2wocGFyZW50KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zIC0gMTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlCdXR0b24gY29sb3JCdXR0b24gPSBnZXRDaGFuZ2VDb250cm9sKHBhcmVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWludCB3aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhjb2xvckJ1dHRvbiwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCWdkLndpZHRoSGludCA9IE1hdGgubWF4KHdpZHRoSGludCwgY29sb3JCdXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJU1dULkRFRkFVTFQsIHRydWUpLngpOwotCQljb2xvckJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvTG9hZCgpIHsKLQkJaWYgKGNvbG9yU2VsZWN0b3IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29sb3JTZWxlY3Rvci5zZXRDb2xvclZhbHVlKFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoCi0JCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCksIGdldFByZWZlcmVuY2VOYW1lKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvTG9hZERlZmF1bHQoKSB7Ci0JCWlmIChjb2xvclNlbGVjdG9yID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbG9yU2VsZWN0b3Iuc2V0Q29sb3JWYWx1ZShQcmVmZXJlbmNlQ29udmVydGVyLmdldERlZmF1bHRDb2xvcigKLQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKSwgZ2V0UHJlZmVyZW5jZU5hbWUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TdG9yZSgpIHsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXRWYWx1ZShnZXRQcmVmZXJlbmNlU3RvcmUoKSwgZ2V0UHJlZmVyZW5jZU5hbWUoKSwKLQkJCQljb2xvclNlbGVjdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjb2xvciBzZWxlY3RvciB1c2VkIGJ5IHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIENvbG9yU2VsZWN0b3IvCi0JICovCi0JcHVibGljIENvbG9yU2VsZWN0b3IgZ2V0Q29sb3JTZWxlY3RvcigpIHsKLQkJcmV0dXJuIGNvbG9yU2VsZWN0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhbmdlIGJ1dHRvbiBmb3IgdGhpcyBmaWVsZCBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIGNvbnRyb2wgdG8gY3JlYXRlIHRoZSBidXR0b24gaW4gaWYgcmVxdWlyZWQuCi0JICogQHJldHVybiB0aGUgY2hhbmdlIGJ1dHRvbgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gZ2V0Q2hhbmdlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChjb2xvclNlbGVjdG9yID09IG51bGwpIHsKLQkJCWNvbG9yU2VsZWN0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihwYXJlbnQpOwotCQkJY29sb3JTZWxlY3Rvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJLy8gZm9yd2FyZCB0aGUgcHJvcGVydHkgY2hhbmdlIG9mIHRoZSBjb2xvciBzZWxlY3RvcgotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJQ29sb3JGaWVsZEVkaXRvci50aGlzLmZpcmVWYWx1ZUNoYW5nZWQoZXZlbnQuZ2V0UHJvcGVydHkoKSwKLQkJCQkJCQlldmVudC5nZXRPbGRWYWx1ZSgpLCBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJc2V0UHJlc2VudHNEZWZhdWx0VmFsdWUoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCi0JCX0gZWxzZSB7Ci0JCQljaGVja1BhcmVudChjb2xvclNlbGVjdG9yLmdldEJ1dHRvbigpLCBwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBjb2xvclNlbGVjdG9yLmdldEJ1dHRvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkNvbnRyb2xzKCkgewotCQlyZXR1cm4gMjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3Ijc2V0RW5hYmxlZChib29sZWFuLAotCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCwgcGFyZW50KTsKLQkJZ2V0Q2hhbmdlQ29udHJvbChwYXJlbnQpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0NvbG9yU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvQ29sb3JTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJlOTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvQ29sb3JTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uRXZlbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db2xvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFRoZSA8Y29kZT5Db2xvclNlbGVjdG9yPC9jb2RlPiBpcyBhIHdyYXBwZXIgZm9yIGEgYnV0dG9uIHRoYXQgZGlzcGxheXMgYQotICogc2VsZWN0ZWQgPGNvZGU+Q29sb3I8L2NvZGU+IGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBzZWxlY3Rpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xvclNlbGVjdG9yIGV4dGVuZHMgRXZlbnRNYW5hZ2VyIHsKLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIHRoYXQgc2lnbmlmaWVzIHRoZSBzZWxlY3RlZCBjb2xvciBvZiB0aGlzCi0gICAgICogPGNvZGU+Q29sb3JTZWxlY3RvcjwvY29kZT4gaGFzIGNoYW5nZWQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQ09MT1JDSEFOR0UgPSAiY29sb3JWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgQnV0dG9uIGZCdXR0b247Ci0KLSAgICBwcml2YXRlIENvbG9yIGZDb2xvcjsKLQotICAgIHByaXZhdGUgUkdCIGZDb2xvclZhbHVlOwotCi0gICAgcHJpdmF0ZSBQb2ludCBmRXh0ZW50OwotCi0gICAgcHJpdmF0ZSBJbWFnZSBmSW1hZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2lldmVyIGFuZCB0aGUgYnV0dG9uIHRoYXQgaXQgd3JhcHBlcnMgaW4KLSAgICAgKiB0aGUgc3VwcGxpZWQgcGFyZW50IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICAgVGhlIHBhcmVudCBvZiB0aGUgYnV0dG9uLgotICAgICAqLwotICAgIHB1YmxpYyBDb2xvclNlbGVjdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZkJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGZFeHRlbnQgPSBjb21wdXRlSW1hZ2VTaXplKHBhcmVudCk7Ci0gICAgICAgIGZJbWFnZSA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCBmRXh0ZW50LngsIGZFeHRlbnQueSk7Ci0gICAgICAgIEdDIGdjID0gbmV3IEdDKGZJbWFnZSk7Ci0gICAgICAgIGdjLnNldEJhY2tncm91bmQoZkJ1dHRvbi5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICBnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGZFeHRlbnQueCwgZkV4dGVudC55KTsKLSAgICAgICAgZ2MuZGlzcG9zZSgpOwotICAgICAgICBmQnV0dG9uLnNldEltYWdlKGZJbWFnZSk7Ci0gICAgICAgIGZCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIG9wZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZCdXR0b24uYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZkltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZkltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZkltYWdlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZDb2xvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZDb2xvci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZDb2xvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZkJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXIjZ2V0TmFtZShvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBlLnJlc3VsdCA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiQ29sb3JTZWxlY3Rvci5OYW1lIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIDxjb2RlPkNvbG9yU2VsZWN0b3I8L2NvZGU+LgotICAgICAqIEV2ZW50cyBhcmUgZmlyZWQgd2hlbiB0aGUgY29sb3IgaW4gdGhlIGNvbnRyb2wgY2hhbmdlcyB2aWEgdGhlIHVzZXIKLSAgICAgKiBjbGlja2luZyBhbiBzZWxlY3RpbmcgYSBuZXcgb25lIGluIHRoZSBjb2xvciBkaWFsb2cuIE5vIGV2ZW50IGlzIGZpcmVkIGluCi0gICAgICogdGhlIGNhc2Ugd2hlcmUgPGNvZGU+c2V0Q29sb3JWYWx1ZShSR0IpPC9jb2RlPiBpcyBpbnZva2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lcgotICAgICAqICAgICAgICAgICAgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgYWRkTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGltYWdlIHRvIGJlIGRpc3BsYXllZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2luZG93IC0KLSAgICAgKiAgICAgICAgICAgIHRoZSB3aW5kb3cgdXNlZCB0byBjYWxjdWxhdGUKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlBvaW50PC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgUG9pbnQgY29tcHV0ZUltYWdlU2l6ZShDb250cm9sIHdpbmRvdykgewotICAgICAgICBHQyBnYyA9IG5ldyBHQyh3aW5kb3cpOwotICAgICAgICBGb250IGYgPSBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoCi0gICAgICAgICAgICAgICAgSkZhY2VSZXNvdXJjZXMuREVGQVVMVF9GT05UKTsKLSAgICAgICAgZ2Muc2V0Rm9udChmKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGdjLmRpc3Bvc2UoKTsKLSAgICAgICAgUG9pbnQgcCA9IG5ldyBQb2ludChoZWlnaHQgKiAzIC0gNiwgaGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBidXR0b24gY29udHJvbCBiZWluZyB3cmFwcGVyZWQgYnkgdGhlIHNlbGVjdG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+QnV0dG9uPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBCdXR0b24gZ2V0QnV0dG9uKCkgewotICAgICAgICByZXR1cm4gZkJ1dHRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY29sb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT5SR0I8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFJHQiBnZXRDb2xvclZhbHVlKCkgewotICAgICAgICByZXR1cm4gZkNvbG9yVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZnJvbSB0aGlzIDxjb2RlPkNvbG9yU2VsZWN0b3I8L2NvZGU+LiBIYXMKLSAgICAgKiBubyBhZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lcgotICAgICAqICAgICAgICAgICAgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcmVtb3ZlTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY3VycmVudCBjb2xvciB2YWx1ZSBhbmQgdXBkYXRlIHRoZSBjb250cm9sLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZ2IKLSAgICAgKiAgICAgICAgICAgIFRoZSBuZXcgY29sb3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3JWYWx1ZShSR0IgcmdiKSB7Ci0gICAgICAgIGZDb2xvclZhbHVlID0gcmdiOwotICAgICAgICB1cGRhdGVDb2xvckltYWdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgb3Igbm90IHRoZSBidXR0b24gaXMgZW5hYmxlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbmFibGVkIHN0YXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBzdGF0ZSkgewotICAgICAgICBnZXRCdXR0b24oKS5zZXRFbmFibGVkKHN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIGltYWdlIGJlaW5nIGRpc3BsYXllZCBvbiB0aGUgYnV0dG9uIHVzaW5nIHRoZSBjdXJyZW50IGNvbG9yCi0gICAgICogc2V0dGluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb2xvckltYWdlKCkgewotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBmQnV0dG9uLmdldERpc3BsYXkoKTsKLSAgICAgICAgR0MgZ2MgPSBuZXcgR0MoZkltYWdlKTsKLSAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKDAsIDIsIGZFeHRlbnQueCAtIDEsIGZFeHRlbnQueSAtIDQpOwotICAgICAgICBpZiAoZkNvbG9yICE9IG51bGwpCi0gICAgICAgICAgICBmQ29sb3IuZGlzcG9zZSgpOwotICAgICAgICBmQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgZkNvbG9yVmFsdWUpOwotICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKGZDb2xvcik7Ci0gICAgICAgIGdjLmZpbGxSZWN0YW5nbGUoMSwgMywgZkV4dGVudC54IC0gMiwgZkV4dGVudC55IC0gNSk7Ci0gICAgICAgIGdjLmRpc3Bvc2UoKTsKLSAgICAgICAgZkJ1dHRvbi5zZXRJbWFnZShmSW1hZ2UpOwotICAgIH0KLQotICAgIC8qKgotCSAqIEFjdGl2YXRlIHRoZSBlZGl0b3IgZm9yIHRoaXMgc2VsZWN0b3IuIFRoaXMgY2F1c2VzIHRoZSBjb2xvciBzZWxlY3Rpb24KLQkgKiBkaWFsb2cgdG8gYXBwZWFyIGFuZCB3YWl0IGZvciB1c2VyIGlucHV0LgotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlDb2xvckRpYWxvZyBjb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhmQnV0dG9uLmdldFNoZWxsKCkpOwotCQljb2xvckRpYWxvZy5zZXRSR0IoZkNvbG9yVmFsdWUpOwotCQlSR0IgbmV3Q29sb3IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCWlmIChuZXdDb2xvciAhPSBudWxsKSB7Ci0JCSAgICBSR0Igb2xkVmFsdWUgPSBmQ29sb3JWYWx1ZTsKLQkJICAgIGZDb2xvclZhbHVlID0gbmV3Q29sb3I7Ci0JCSAgICBmaW5hbCBPYmplY3RbXSBmaW5hbExpc3RlbmVycyA9IGdldExpc3RlbmVycygpOwotCQkgICAgaWYgKGZpbmFsTGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKLQkJICAgICAgICBQcm9wZXJ0eUNoYW5nZUV2ZW50IHBFdmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KAotCQkgICAgICAgICAgICAgICAgdGhpcywgUFJPUF9DT0xPUkNIQU5HRSwgb2xkVmFsdWUsIG5ld0NvbG9yKTsKLQkJICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbmFsTGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0JCSAgICAgICAgICAgIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBmaW5hbExpc3RlbmVyc1tpXTsKLQkJICAgICAgICAgICAgbGlzdGVuZXIucHJvcGVydHlDaGFuZ2UocEV2ZW50KTsKLQkJICAgICAgICB9Ci0JCSAgICB9Ci0JCSAgICB1cGRhdGVDb2xvckltYWdlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0RpcmVjdG9yeUZpZWxkRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0RpcmVjdG9yeUZpZWxkRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MWRkOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9EaXJlY3RvcnlGaWVsZEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci0KLS8qKgotICogQSBmaWVsZCBlZGl0b3IgZm9yIGEgZGlyZWN0b3J5IHBhdGggdHlwZSBwcmVmZXJlbmNlLiBBIHN0YW5kYXJkIGRpcmVjdG9yeQotICogZGlhbG9nIGFwcGVhcnMgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBjaGFuZ2UgYnV0dG9uLgotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5RmllbGRFZGl0b3IgZXh0ZW5kcyBTdHJpbmdCdXR0b25GaWVsZEVkaXRvciB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkgZmllbGQgZWRpdG9yIAotICAgICAqLwotICAgIHByb3RlY3RlZCBEaXJlY3RvcnlGaWVsZEVkaXRvcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGlyZWN0b3J5IGZpZWxkIGVkaXRvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0aGlzIGZpZWxkIGVkaXRvciB3b3JrcyBvbgotICAgICAqIEBwYXJhbSBsYWJlbFRleHQgdGhlIGxhYmVsIHRleHQgb2YgdGhlIGZpZWxkIGVkaXRvcgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGUgZmllbGQgZWRpdG9yJ3MgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBEaXJlY3RvcnlGaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsVGV4dCwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpbml0KG5hbWUsIGxhYmVsVGV4dCk7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShKRmFjZVJlc291cmNlcwotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkRpcmVjdG9yeUZpZWxkRWRpdG9yLmVycm9yTWVzc2FnZSIpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHNldENoYW5nZUJ1dHRvblRleHQoSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJvcGVuQnJvd3NlIikpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0VmFsaWRhdGVTdHJhdGVneShWQUxJREFURV9PTl9GT0NVU19MT1NUKTsKLSAgICAgICAgY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gU3RyaW5nQnV0dG9uRmllbGRFZGl0b3IuCi0gICAgICogT3BlbnMgdGhlIGRpcmVjdG9yeSBjaG9vc2VyIGRpYWxvZyBhbmQgcmV0dXJucyB0aGUgc2VsZWN0ZWQgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY2hhbmdlUHJlc3NlZCgpIHsKLSAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZ2V0VGV4dENvbnRyb2woKS5nZXRUZXh0KCkpOwotICAgICAgICBpZiAoIWYuZXhpc3RzKCkpCi0gICAgICAgICAgICBmID0gbnVsbDsKLSAgICAgICAgRmlsZSBkID0gZ2V0RGlyZWN0b3J5KGYpOwotICAgICAgICBpZiAoZCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIGQuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBTdHJpbmdGaWVsZEVkaXRvci4KLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgdGV4dCBpbnB1dCBmaWVsZCBjb250YWlucyBhIHZhbGlkIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb0NoZWNrU3RhdGUoKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGdldFRleHRDb250cm9sKCkuZ2V0VGV4dCgpOwotICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnRyaW0oKTsKLSAgICAgICAgaWYgKGZpbGVOYW1lLmxlbmd0aCgpID09IDAgJiYgaXNFbXB0eVN0cmluZ0FsbG93ZWQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0gICAgICAgIHJldHVybiBmaWxlLmlzRGlyZWN0b3J5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIHRoYXQgb3BlbnMgdGhlIGRpcmVjdG9yeSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKiBAcGFyYW0gc3RhcnRpbmdEaXJlY3RvcnkgVGhlIGRpcmVjdG9yeSB0aGUgZGlhbG9nIHdpbGwgb3BlbiBpbi4KLSAgICAgKiBAcmV0dXJuIEZpbGUgRmlsZSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZ2V0RGlyZWN0b3J5KEZpbGUgc3RhcnRpbmdEaXJlY3RvcnkpIHsKLQotICAgICAgICBEaXJlY3RvcnlEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotICAgICAgICBpZiAoc3RhcnRpbmdEaXJlY3RvcnkgIT0gbnVsbCkKLSAgICAgICAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyUGF0aChzdGFydGluZ0RpcmVjdG9yeS5nZXRQYXRoKCkpOwotICAgICAgICBTdHJpbmcgZGlyID0gZmlsZURpYWxvZy5vcGVuKCk7Ci0gICAgICAgIGlmIChkaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZGlyID0gZGlyLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChkaXIubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShkaXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9GaWVsZEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9GaWVsZEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzYwYzE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvRmllbGRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgZmllbGQgZWRpdG9ycy4KLSAqIDxwPgotICogQSBmaWVsZCBlZGl0b3IgcHJlc2VudHMgdGhlIHZhbHVlIG9mIGEgcHJlZmVyZW5jZSB0byB0aGUgZW5kIAotICogdXNlci4gVGhlIHZhbHVlIGlzIGxvYWRlZCBmcm9tIGEgcHJlZmVyZW5jZSBzdG9yZTsgaWYKLSAqIG1vZGlmaWVkIGJ5IHRoZSBlbmQgdXNlciwgdGhlIHZhbHVlIGlzIHZhbGlkYXRlZCBhbmQgZXZlbnR1YWxseQotICogc3RvcmVkIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuIEEgZmllbGQgZWRpdG9yIHJlcG9ydHMKLSAqIGFuIGV2ZW50IHdoZW4gdGhlIHZhbHVlLCBvciB0aGUgdmFsaWRpdHkgb2YgdGhlIHZhbHVlLCBjaGFuZ2VzLgotICogPC9wPgotICogPHA+Ci0gKiBGaWVsZCBlZGl0b3JzIHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBmaWVsZCAKLSAqIGVkaXRvciBwcmVmZXJlbmNlIHBhZ2UgKDxjb2RlPkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U8L2NvZGU+KQotICogd2hpY2ggY29vcmRpbmF0ZXMgZXZlcnl0aGluZyBhbmQgcHJvdmlkZXMgdGhlIG1lc3NhZ2UgbGluZQotICogd2hpY2ggZGlzcGxheSBtZXNzYWdlcyBlbWFuYXRpbmcgZnJvbSB0aGUgZWRpdG9yLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIHBhY2thZ2UgY29udGFpbnMgcmVhZHktdG8tdXNlIGZpZWxkIGVkaXRvcnMgZm9yIHZhcmlvdXMKLSAqIHR5cGVzIG9mIHByZWZlcmVuY2VzOgotICogPHVsPgotICogICA8bGk+PGNvZGU+Qm9vbGVhbkZpZWxkRWRpdG9yPC9jb2RlPiAtIGJvb2xlYW5zPC9saT4KLSAqICAgPGxpPjxjb2RlPkludGVnZXJGaWVsZEVkaXRvcjwvY29kZT4gLSBpbnRlZ2VyczwvbGk+Ci0gKiAgIDxsaT48Y29kZT5TdHJpbmdGaWVsZEVkaXRvcjwvY29kZT4gLSB0ZXh0IHN0cmluZ3M8L2xpPgotICogICA8bGk+PGNvZGU+UmFkaW9Hcm91cEZpZWxkRWRpdG9yPC9jb2RlPiAtIGVudW1lcmF0aW9uczwvbGk+Ci0gKiAgIDxsaT48Y29kZT5Db2xvckZpZWxkRWRpdG9yPC9jb2RlPiAtIFJHQiBjb2xvcnM8L2xpPgotICogICA8bGk+PGNvZGU+Rm9udEZpZWxkRWRpdG9yPC9jb2RlPiAtIGZvbnRzPC9saT4KLSAqICAgPGxpPjxjb2RlPkRpcmVjdG9yeUZpZWxkRWRpdG9yPC9jb2RlPiAtIGRpcmVjdG9yaWVzPC9saT4KLSAqICAgPGxpPjxjb2RlPkZpbGVGaWVsZEVkaXRvcjwvY29kZT4gLSBmaWxlczwvbGk+Ci0gKiAgIDxsaT48Y29kZT5QYXRoRWRpdG9yPC9jb2RlPiAtIHBhdGhzPC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWVsZEVkaXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4iZmllbGRfZWRpdG9yX2lzX3ZhbGlkIjwvY29kZT4pCi0gICAgICogdG8gc2lnbmFsIGEgY2hhbmdlIGluIHRoZSB2YWxpZGl0eSBvZiB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBlZGl0b3IuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfVkFMSUQgPSAiZmllbGRfZWRpdG9yX2lzX3ZhbGlkIjsvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4iZmllbGRfZWRpdG9yX3ZhbHVlIjwvY29kZT4pCi0gICAgICogdG8gc2lnbmFsIGEgY2hhbmdlIGluIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGVkaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJmaWVsZF9lZGl0b3JfdmFsdWUiOy8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiAKLSAgICAgKiBHYXAgYmV0d2VlbiBsYWJlbCBhbmQgY29udHJvbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBIT1JJWk9OVEFMX0dBUCA9IDg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcHJlZmVyZW5jZSBzdG9yZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlIGRpc3BsYXllZCBpbiB0aGlzIGZpZWxkIGVkaXRvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBwcmVmZXJlbmNlTmFtZTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQsCi0gICAgICogaW5pdGlhbGx5IDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0UHJlc2VudGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGFiZWwncyB0ZXh0LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsVGV4dDsKLQotICAgIC8qKgotICAgICAqIFRoZSBsYWJlbCBjb250cm9sLgotICAgICAqLwotICAgIHByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0ZW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotICAgIC8qKiAKLSAgICAgKiBUaGUgcGFnZSBjb250YWluaW5nIHRoaXMgZmllbGQgZWRpdG9yCi0gICAgICovCi0gICAgcHJpdmF0ZSBEaWFsb2dQYWdlIHBhZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGZpZWxkIGVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmllbGRFZGl0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmaWVsZCBlZGl0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdGhpcyBmaWVsZCBlZGl0b3Igd29ya3Mgb24KLSAgICAgKiBAcGFyYW0gbGFiZWxUZXh0IHRoZSBsYWJlbCB0ZXh0IG9mIHRoZSBmaWVsZCBlZGl0b3IKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhlIGZpZWxkIGVkaXRvcidzIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmllbGRFZGl0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBsYWJlbFRleHQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaW5pdChuYW1lLCBsYWJlbFRleHQpOwotICAgICAgICBjcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRqdXN0cyB0aGUgaG9yaXpvbnRhbCBzcGFuIG9mIHRoaXMgZmllbGQgZWRpdG9yJ3MgYmFzaWMgY29udHJvbHMuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhZGp1c3QgdGhlIGhvcml6b250YWwgc3BhbiAKLSAgICAgKiBvZiBjb250cm9scyBzbyB0aGV5IGFwcGVhciBjb3JyZWN0IGluIHRoZSBnaXZlbiBudW1iZXIgb2YgY29sdW1ucy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIHdpbGwgYWx3YXlzIGJlIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB0aGUgCi0gICAgICogdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBlZGl0b3IncyA8Y29kZT5nZXROdW1iZXJPZkNvbnRyb2xzPC9jb2RlPiBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnVtQ29sdW1ucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGp1c3RGb3JOdW1Db2x1bW5zKGludCBudW1Db2x1bW5zKTsKLQotICAgIC8qKgotICAgICAqIEFwcGxpZXMgYSBmb250LgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZAotICAgICAqIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLSAgICAgKiBpZiB0aGV5IHdhbnQgdG8gY2hhbmdlIHRoZSBmb250IG9mIHRoZSBTV1QgY29udHJvbCB0bwotICAgICAqIGEgdmFsdWUgZGlmZmVyZW50IHRoYW4gdGhlIHN0YW5kYXJkIGRpYWxvZyBmb250LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseUZvbnQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXJlbnQgaXMgdGhlIGN1cnJlbnQgcGFyZW50IG9mIHRoZQotICAgICAqIHN1cHBsaWVkIGNvbnRyb2w7IHRocm93cyBhbiAodW5jaGVja2VkKSBleGNlcHRpb24gaWYgdGhleQotICAgICAqIGFyZSBub3QgY29ycmVjdGx5IHJlbGF0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udHJvbCB0aGUgY29udHJvbAotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoQ29udHJvbCBjb250cm9sLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoY29udHJvbC5nZXRQYXJlbnQoKSA9PSBwYXJlbnQsICJEaWZmZXJlbnQgcGFyZW50cyIpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgbWVzc2FnZSBsaW5lLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyRXJyb3JNZXNzYWdlKCkgewotICAgICAgICBpZiAocGFnZSAhPSBudWxsKQotICAgICAgICAgICAgcGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBub3JtYWwgbWVzc2FnZSBmcm9tIHRoZSBtZXNzYWdlIGxpbmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJNZXNzYWdlKCkgewotICAgICAgICBpZiAocGFnZSAhPSBudWxsKQotICAgICAgICAgICAgcGFnZS5zZXRNZXNzYWdlKG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwaXhlbHMgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICAgKiBnaXZlbiBudW1iZXIgb2YgaG9yaXpvbnRhbCBkaWFsb2cgdW5pdHMuCi0gICAgICogPHA+Ci0gICAgICogQ2xpZW50cyBtYXkgY2FsbCB0aGlzIGZyYW1ld29yayBtZXRob2QsIGJ1dCBzaG91bGQgbm90IG92ZXJyaWRlIGl0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250cm9sIHRoZSBjb250cm9sIGJlaW5nIHNpemVkCi0gICAgICogQHBhcmFtIGRsdXMgdGhlIG51bWJlciBvZiBob3Jpem9udGFsIGRpYWxvZyB1bml0cwotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKENvbnRyb2wgY29udHJvbCwgaW50IGRsdXMpIHsKLSAgICAgICAgR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7Ci0gICAgICAgIGdjLnNldEZvbnQoY29udHJvbC5nZXRGb250KCkpOwotICAgICAgICBpbnQgYXZlcmFnZVdpZHRoID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0gICAgICAgIGdjLmRpc3Bvc2UoKTsKLQotICAgICAgICBkb3VibGUgaG9yaXpvbnRhbERpYWxvZ1VuaXRTaXplID0gYXZlcmFnZVdpZHRoICogMC4yNTsKLQotICAgICAgICByZXR1cm4gKGludCkgTWF0aC5yb3VuZChkbHVzICogaG9yaXpvbnRhbERpYWxvZ1VuaXRTaXplKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgICogZ2l2ZW4gbnVtYmVyIG9mIHZlcnRpY2FsIGRpYWxvZyB1bml0cy4KLSAgICAgKiA8cD4KLSAgICAgKiBDbGllbnRzIG1heSBjYWxsIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCwgYnV0IHNob3VsZCBub3Qgb3ZlcnJpZGUgaXQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRyb2wgdGhlIGNvbnRyb2wgYmVpbmcgc2l6ZWQKLSAgICAgKiBAcGFyYW0gZGx1cyB0aGUgbnVtYmVyIG9mIHZlcnRpY2FsIGRpYWxvZyB1bml0cwotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhDb250cm9sIGNvbnRyb2wsIGludCBkbHVzKSB7Ci0gICAgICAgIEdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotICAgICAgICBnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGdjLmRpc3Bvc2UoKTsKLQotICAgICAgICBkb3VibGUgdmVydGljYWxEaWFsb2dVbml0U2l6ZSA9IGhlaWdodCAqIDAuMTI1OwotCi0gICAgICAgIHJldHVybiAoaW50KSBNYXRoLnJvdW5kKGRsdXMgKiB2ZXJ0aWNhbERpYWxvZ1VuaXRTaXplKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoaXMgZmllbGQgZWRpdG9yJ3MgbWFpbiBjb250cm9sIGNvbnRhaW5pbmcgYWxsIG9mIGl0cwotICAgICAqIGJhc2ljIGNvbnRyb2xzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IGdldE51bWJlck9mQ29udHJvbHMoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IEhPUklaT05UQUxfR0FQOwotICAgICAgICBwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGRvRmlsbEludG9HcmlkKHBhcmVudCwgbGF5b3V0Lm51bUNvbHVtbnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3Bvc2VzIHRoZSBTV1QgcmVzb3VyY2VzIHVzZWQgYnkgdGhpcyBmaWVsZCBlZGl0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkaXNwb3NlCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbHMgdGhpcyBmaWVsZCBlZGl0b3IncyBiYXNpYyBjb250cm9scyBpbnRvIHRoZSBnaXZlbiBwYXJlbnQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBjcmVhdGUgdGhlIGNvbnRyb2xzCi0gICAgICogZm9yIHRoaXMgZmllbGQgZWRpdG9yLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbXBvc2l0ZSB1c2VkIGFzIGEgcGFyZW50IGZvciB0aGUgYmFzaWMgY29udHJvbHM7Ci0gICAgICoJdGhlIHBhcmVudCdzIGxheW91dCBtdXN0IGJlIGEgPGNvZGU+R3JpZExheW91dDwvY29kZT4KLSAgICAgKiBAcGFyYW0gbnVtQ29sdW1ucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0ZpbGxJbnRvR3JpZChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucyk7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGlzIGZpZWxkIGVkaXRvciB3aXRoIHRoZSBwcmVmZXJlbmNlIHZhbHVlIGZyb20KLSAgICAgKiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHByb3Blcmx5IGluaXRpYWxpemUgCi0gICAgICogdGhlIGZpZWxkIGVkaXRvci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9Mb2FkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGlzIGZpZWxkIGVkaXRvciB3aXRoIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWUgZnJvbQotICAgICAqIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcHJvcGVybHkgaW5pdGlhbGl6ZSAKLSAgICAgKiB0aGUgZmllbGQgZWRpdG9yLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0xvYWREZWZhdWx0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTdG9yZXMgdGhlIHByZWZlcmVuY2UgdmFsdWUgZnJvbSB0aGlzIGZpZWxkIGVkaXRvciBpbnRvCi0gICAgICogdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzYXZlIHRoZSBlbnRlcmVkIHZhbHVlCi0gICAgICogaW50byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TdG9yZSgpOwotCi0gICAgLyoqCi0gICAgICogRmlsbHMgdGhpcyBmaWVsZCBlZGl0b3IncyBiYXNpYyBjb250cm9scyBpbnRvIHRoZSBnaXZlbiBwYXJlbnQuIAotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgY29tcG9zaXRlIHVzZWQgYXMgYSBwYXJlbnQgZm9yIHRoZSBiYXNpYyBjb250cm9sczsKLSAgICAgKgl0aGUgcGFyZW50J3MgbGF5b3V0IG11c3QgYmUgYSA8Y29kZT5HcmlkTGF5b3V0PC9jb2RlPgotICAgICAqIEBwYXJhbSBudW1Db2x1bW5zIHRoZSBudW1iZXIgb2YgY29sdW1ucwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxJbnRvR3JpZChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotICAgICAgICBBc3NlcnQuaXNUcnVlKG51bUNvbHVtbnMgPj0gZ2V0TnVtYmVyT2ZDb250cm9scygpKTsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZShwYXJlbnQuZ2V0TGF5b3V0KCkgaW5zdGFuY2VvZiBHcmlkTGF5b3V0KTsKLSAgICAgICAgZG9GaWxsSW50b0dyaWQocGFyZW50LCBudW1Db2x1bW5zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm1zIHRoaXMgZmllbGQgZWRpdG9yJ3MgbGlzdGVuZXIsIGlmIGl0IGhhcyBvbmUsIGFib3V0IGEgY2hhbmdlIHRvCi0gICAgICogb25lIG9mIHRoaXMgZmllbGQgZWRpdG9yJ3MgYm9vbGVhbi12YWx1ZWQgcHJvcGVydGllcy4gRG9lcyBub3RoaW5nCi0gICAgICogaWYgdGhlIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgdGhlIHNhbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIGZpZWxkIGVkaXRvciBwcm9wZXJ0eSBuYW1lLCAKLSAgICAgKiAgIHN1Y2ggYXMgPGNvZGU+VkFMVUU8L2NvZGU+IG9yIDxjb2RlPklTX1ZBTElEPC9jb2RlPgotICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eSwgYm9vbGVhbiBvbGRWYWx1ZSwKLSAgICAgICAgICAgIGJvb2xlYW4gbmV3VmFsdWUpIHsKLSAgICAgICAgaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBmaXJlVmFsdWVDaGFuZ2VkKHByb3BlcnR5LCBuZXcgQm9vbGVhbihvbGRWYWx1ZSksIG5ldyBCb29sZWFuKG5ld1ZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtcyB0aGlzIGZpZWxkIGVkaXRvcidzIGxpc3RlbmVyLCBpZiBpdCBoYXMgb25lLCBhYm91dCBhIGNoYW5nZSB0bwotICAgICAqIG9uZSBvZiB0aGlzIGZpZWxkIGVkaXRvcidzIHByb3BlcnRpZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIGZpZWxkIGVkaXRvciBwcm9wZXJ0eSBuYW1lLCAKLSAgICAgKiAgIHN1Y2ggYXMgPGNvZGU+VkFMVUU8L2NvZGU+IG9yIDxjb2RlPklTX1ZBTElEPC9jb2RlPgotICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlVmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG9sZFZhbHVlLAotICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIucHJvcGVydHlDaGFuZ2UobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3ltYm9saWMgZm9udCBuYW1lIHVzZWQgYnkgdGhpcyBmaWVsZCBlZGl0b3IuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzeW1ib2xpYyBmb250IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkRWRpdG9yRm9udE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYWJlbCBjb250cm9sLiAKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxhYmVsIGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogIGlmIG5vIGxhYmVsIGNvbnRyb2wgaGFzIGJlZW4gY3JlYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBMYWJlbCBnZXRMYWJlbENvbnRyb2woKSB7Ci0gICAgICAgIHJldHVybiBsYWJlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgZmllbGQgZWRpdG9yJ3MgbGFiZWwgY29tcG9uZW50LgotICAgICAqIDxwPgotICAgICAqIFRoZSBsYWJlbCBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QKLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBsYWJlbCBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIExhYmVsIGdldExhYmVsQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGlmIChsYWJlbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLSAgICAgICAgICAgIGxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGdldExhYmVsVGV4dCgpOwotICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBsYWJlbC5zZXRUZXh0KHRleHQpOwotICAgICAgICAgICAgbGFiZWwuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoZWNrUGFyZW50KGxhYmVsLCBwYXJlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsYWJlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgZmllbGQgZWRpdG9yJ3MgbGFiZWwgdGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxhYmVsIHRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGxhYmVsVGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYmFzaWMgY29udHJvbHMgdGhpcyBmaWVsZCBlZGl0b3IgY29uc2lzdHMgb2YuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY29udHJvbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE51bWJlck9mQ29udHJvbHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdGhpcyBmaWVsZCBlZGl0b3Igb3BlcmF0ZXMgb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmZXJlbmNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZWZlcmVuY2UgcGFnZSBpbiB3aGljaCB0aGlzIGZpZWxkIGVkaXRvcgotICAgICAqIGFwcGVhcnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHBhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgI2dldFBhZ2UoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBQcmVmZXJlbmNlUGFnZSBnZXRQcmVmZXJlbmNlUGFnZSgpIHsKLSAgICAJaWYocGFnZSAhPSBudWxsICYmIHBhZ2UgaW5zdGFuY2VvZiBQcmVmZXJlbmNlUGFnZSkKLSAgICAgICAgCXJldHVybiAoUHJlZmVyZW5jZVBhZ2UpIHBhZ2U7Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIERpYWxvZ1BhZ2UgdGhhdCB0aGUgcmVjZWl2ZXIgaXMgc2VuZGluZwotICAgICAqIHVwZGF0ZXMgdG8uCi0gICAgICogCi0gICAgICogQHJldHVybiBEaWFsb2dQYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IAotICAgICAqIGhhcyBub3QgYmVlbiBzZXQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBEaWFsb2dQYWdlIGdldFBhZ2UoKXsKLSAgICAJcmV0dXJuIHBhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBzdG9yZSB1c2VkIGJ5IHRoaXMgZmllbGQgZWRpdG9yLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSBzdG9yZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBzZWUgI3NldFByZWZlcmVuY2VTdG9yZQotICAgICAqLwotICAgIHB1YmxpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLSAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VTdG9yZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBmaWVsZCBlZGl0b3Igd2l0aCB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSBuYW1lIGFuZCBsYWJlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0aGlzIGZpZWxkIGVkaXRvciB3b3JrcyBvbgotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBsYWJlbCB0ZXh0IG9mIHRoZSBmaWVsZCBlZGl0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KFN0cmluZyBuYW1lLCBTdHJpbmcgdGV4dCkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKG5hbWUpOwotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHRleHQpOwotICAgICAgICBwcmVmZXJlbmNlTmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMubGFiZWxUZXh0ID0gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBlZGl0b3IgY29udGFpbnMgYSB2YWxpZCB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QKLSAgICAgKiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LiBTdWJjbGFzc2VzIHdpc2hpbmcgdG8gcGVyZm9ybQotICAgICAqIHZhbGlkYXRpb24gc2hvdWxkIG92ZXJyaWRlIGJvdGggdGhpcyBtZXRob2QgYW5kCi0gICAgICogPGNvZGU+cmVmcmVzaFZhbGlkU3RhdGU8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyB2YWxpZCwKLSAgICAgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaW52YWxpZAotICAgICAqIEBzZWUgI3JlZnJlc2hWYWxpZFN0YXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGlzIGZpZWxkIGVkaXRvciB3aXRoIHRoZSBwcmVmZXJlbmNlIHZhbHVlIGZyb20KLSAgICAgKiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2FkKCkgewotICAgICAgICBpZiAocHJlZmVyZW5jZVN0b3JlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzRGVmYXVsdFByZXNlbnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgZG9Mb2FkKCk7Ci0gICAgICAgICAgICByZWZyZXNoVmFsaWRTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhpcyBmaWVsZCBlZGl0b3Igd2l0aCB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlCi0gICAgICogZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2FkRGVmYXVsdCgpIHsKLSAgICAgICAgaWYgKHByZWZlcmVuY2VTdG9yZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpc0RlZmF1bHRQcmVzZW50ZWQgPSB0cnVlOwotICAgICAgICAgICAgZG9Mb2FkRGVmYXVsdCgpOwotICAgICAgICAgICAgcmVmcmVzaFZhbGlkU3RhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIGVkaXRvciBjdXJyZW50bHkgcHJlc2VudHMgdGhlCi0gICAgICogZGVmYXVsdCB2YWx1ZSBmb3IgaXRzIHByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBwcmVzZW50ZWQsCi0gICAgICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHByZXNlbnRzRGVmYXVsdFZhbHVlKCkgewotICAgICAgICByZXR1cm4gaXNEZWZhdWx0UHJlc2VudGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZnJlc2hlcyB0aGlzIGZpZWxkIGVkaXRvcidzIHZhbGlkIHN0YXRlIGFmdGVyIGEgdmFsdWUgY2hhbmdlCi0gICAgICogYW5kIGZpcmVzIGFuIDxjb2RlPklTX1ZBTElEPC9jb2RlPiBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaWYKLSAgICAgKiB3YXJyYW50ZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIGRvZXMKLSAgICAgKiBub3RoaW5nLiBTdWJjbGFzc2VzIHdpc2hpbmcgdG8gcGVyZm9ybSB2YWxpZGF0aW9uIHNob3VsZCBvdmVycmlkZQotICAgICAqIGJvdGggdGhpcyBtZXRob2QgYW5kIDxjb2RlPmlzVmFsaWQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI2lzVmFsaWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmFsaWRTdGF0ZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmb2N1cyB0byB0aGlzIGZpZWxkIGVkaXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QKLSAgICAgKiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgZmllbGQgZWRpdG9yJ3MgbGFiZWwgdGV4dC4KLSAgICAgKiBUaGUgbGFiZWwgaXMgdHlwaWNhbGx5IHByZXNlbnRlZCB0byB0aGUgbGVmdCBvZiB0aGUgZW50cnkgZmllbGQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dCB0aGUgbGFiZWwgdGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHRleHQpOwotICAgICAgICBsYWJlbFRleHQgPSB0ZXh0OwotICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkKLSAgICAgICAgICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0aGlzIGZpZWxkIGVkaXRvciBvcGVyYXRlcyBvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgYWJpbGl0eSB0byBjaGFuZ2UgdGhpcyBhbGxvd3MgdGhlIHNhbWUgZmllbGQgZWRpdG9yIG9iamVjdAotICAgICAqIHRvIGJlIHJldXNlZCBmb3IgZGlmZmVyZW50IHByZWZlcmVuY2VzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgZXhhbXBsZTogPHA+Ci0gICAgICogPHByZT4KLSAgICAgKiAJLi4uCi0gICAgICogIGVkaXRvci5zZXRQcmVmZXJlbmNlTmFtZSgiZm9udCIpOwotICAgICAqIAllZGl0b3IubG9hZCgpOwotICAgICAqIDwvcHJlPgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcHJlZmVyZW5jZU5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHByZWZlcmVuY2UgcGFnZSBpbiB3aGljaCB0aGlzIGZpZWxkIGVkaXRvcgotICAgICAqIGFwcGVhcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZVBhZ2UgdGhlIHByZWZlcmVuY2UgcGFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSAjc2V0UGFnZShEaWFsb2dQYWdlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VQYWdlKFByZWZlcmVuY2VQYWdlIHByZWZlcmVuY2VQYWdlKSB7Ci0gICAgICAgIHNldFBhZ2UocHJlZmVyZW5jZVBhZ2UpOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGFnZSB0byBiZSB0aGUgcmVjZWl2ZXIuCi0JICogQHBhcmFtIGRpYWxvZ1BhZ2UKLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZShEaWFsb2dQYWdlIGRpYWxvZ1BhZ2UpIHsKLQkJcGFnZSA9IGRpYWxvZ1BhZ2U7Ci0JCQotCX0KLQotCS8qKgotICAgICAqIFNldHMgdGhlIHByZWZlcmVuY2Ugc3RvcmUgdXNlZCBieSB0aGlzIGZpZWxkIGVkaXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgcHJlZmVyZW5jZSBzdG9yZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBzZWUgI2dldFByZWZlcmVuY2VTdG9yZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VTdG9yZShJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0gICAgICAgIHByZWZlcmVuY2VTdG9yZSA9IHN0b3JlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGlzIGZpZWxkIGVkaXRvciBpcyBwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJvb2xlYW5WYWx1ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBiZWluZyBwcmVzZW50ZWQsCi0gICAgICogIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UHJlc2VudHNEZWZhdWx0VmFsdWUoYm9vbGVhbiBib29sZWFuVmFsdWUpIHsKLSAgICAgICAgaXNEZWZhdWx0UHJlc2VudGVkID0gYm9vbGVhblZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgb3IgcmVtb3ZlcyB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZvciB0aGlzIGZpZWxkIGVkaXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgZmllbGQgZWRpdG9ycyBjYW4gc3VwcG9ydCBvbmx5IGEgc2luZ2xlIGxpc3RlbmVyLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAgdG8gcmVtb3ZlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvd3MgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIHBhZ2UgZm9yIHRoaXMKLSAgICAgKiBmaWVsZCBlZGl0b3IgaWYgaXQgaGFzIG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzaG93RXJyb3JNZXNzYWdlKFN0cmluZyBtc2cpIHsKLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG1zZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvd3MgdGhlIGdpdmVuIG1lc3NhZ2UgaW4gdGhlIHBhZ2UgZm9yIHRoaXMKLSAgICAgKiBmaWVsZCBlZGl0b3IgaWYgaXQgaGFzIG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzaG93TWVzc2FnZShTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgICAgICBwYWdlLnNldEVycm9yTWVzc2FnZShtc2cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3JlcyB0aGlzIGZpZWxkIGVkaXRvcidzIHZhbHVlIGJhY2sgaW50byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9yZSgpIHsKLSAgICAgICAgaWYgKHByZWZlcmVuY2VTdG9yZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChpc0RlZmF1bHRQcmVzZW50ZWQpIHsKLSAgICAgICAgICAgIHByZWZlcmVuY2VTdG9yZS5zZXRUb0RlZmF1bHQocHJlZmVyZW5jZU5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG9TdG9yZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBHcmlkRGF0YSBvbiBidXR0b24gdG8gYmUgb25lIHRoYXQgaXMgc3BhY2VkIGZvciB0aGUKLSAgICAgKiBjdXJyZW50IGZvbnQuCi0gICAgICogQHBhcmFtIGJ1dHRvbiB0aGUgYnV0dG9uIHRoZSBkYXRhIGlzIGJlaW5nIHNldCBvbi4KLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldEJ1dHRvbkxheW91dERhdGEoQnV0dG9uIGJ1dHRvbikgewotCi0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQotICAgICAgICAvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0gICAgICAgIEdDIGdjID0gbmV3IEdDKGJ1dHRvbik7Ci0gICAgICAgIGdjLnNldEZvbnQoYnV0dG9uLmdldEZvbnQoKSk7Ci0gICAgICAgIEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLSAgICAgICAgZ2MuZGlzcG9zZSgpOwotCi0gICAgICAgIGludCB3aWR0aEhpbnQgPSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZwotICAgICAgICAgICAgICAgIC5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0gICAgICAgICAgICAgICAgU1dULkRFRkFVTFQsIHRydWUpLngpOwotICAgICAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciBvciBub3QgdGhlIGNvbnRyb2xzIGluIHRoZSBmaWVsZCBlZGl0b3IKLSAgICAgKiBhcmUgZW5hYmxlZC4KLSAgICAgKiBAcGFyYW0gZW5hYmxlZCBUaGUgZW5hYmxlZCBzdGF0ZS4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhlIGNvbnRyb2xzIGluIHRoZSBncm91cC4KLSAgICAgKiAgVXNlZCB0byBjcmVhdGUgdGhlIGNvbnRyb2xzIGlmIHJlcXVpcmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGdldExhYmVsQ29udHJvbChwYXJlbnQpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0ZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzAzNGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAkgICBDaHJpcyBUaWx0IChjaHJpc0B0aWx0cy5uZXQpIC0gQnVnIDM4NTQ3IC0gW1ByZWZlcmVuY2VzXSBDaGFuZ2luZyBwcmVmZXJlbmNlcyAKLSAqIAkJCWlnbm9yZWQgYWZ0ZXIgIlJlc3RvcmUgZGVmYXVsdHMiIHByZXNzZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQSBzcGVjaWFsIGFic3RyYWN0IHByZWZlcmVuY2UgcGFnZSB0byBob3N0IGZpZWxkIGVkaXRvcnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIDxjb2RlPmNyZWF0ZUZpZWxkRWRpdG9yczwvY29kZT4gbWV0aG9kCi0gKiBhbmQgc2hvdWxkIG92ZXJyaWRlIDxjb2RlPmNyZWF0ZUxheW91dDwvY29kZT4gaWYgYSBzcGVjaWFsIGxheW91dCBvZiB0aGUgZmllbGQKLSAqIGVkaXRvcnMgaXMgbmVlZGVkLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlCi0gICAgICAgIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogTGF5b3V0IGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4wPC9jb2RlPikgaW5kaWNhdGluZyB0aGF0Ci0gICAgICogZWFjaCBmaWVsZCBlZGl0b3IgaXMgaGFuZGxlZCBhcyBhIHNpbmdsZSBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBVCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBMYXlvdXQgY29uc3RhbnQgKHZhbHVlIDxjb2RlPjE8L2NvZGU+KSBpbmRpY2F0aW5nIHRoYXQKLSAgICAgKiB0aGUgZmllbGQgZWRpdG9ycycgYmFzaWMgY29udHJvbHMgYXJlIHB1dCBpbnRvIGEgZ3JpZCBsYXlvdXQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JJRCA9IDE7Ci0KLSAgICAvKiogCi0gICAgICogVGhlIHZlcnRpY2FsIHNwYWNpbmcgdXNlZCBieSBsYXlvdXQgc3R5bGVzIDxjb2RlPkZMQVQ8L2NvZGU+IAotICAgICAqIGFuZCA8Y29kZT5HUklEPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBWRVJUSUNBTF9TUEFDSU5HID0gMTA7Ci0KLSAgICAvKiogCi0gICAgICogVGhlIG1hcmdpbiB3aWR0aCB1c2VkIGJ5IGxheW91dCBzdHlsZXMgPGNvZGU+RkxBVDwvY29kZT4gCi0gICAgICogYW5kIDxjb2RlPkdSSUQ8L2NvZGU+LgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BUkdJTl9XSURUSCA9IDA7Ci0KLSAgICAvKiogCi0gICAgICogVGhlIG1hcmdpbiBoZWlnaHQgdXNlZCBieSBsYXlvdXQgc3R5bGVzIDxjb2RlPkZMQVQ8L2NvZGU+IAotICAgICAqIGFuZCA8Y29kZT5HUklEPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVJHSU5fSEVJR0hUID0gMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmaWVsZCBlZGl0b3JzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgY3JlYXRlZCB5ZXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGZpZWxkcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGF5b3V0IHN0eWxlOyBlaXRoZXIgPGNvZGU+RkxBVDwvY29kZT4gb3IgPGNvZGU+R1JJRDwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgc3R5bGU7Ci0KLSAgICAvKiogCi0gICAgICogVGhlIGZpcnN0IGludmFsaWQgZmllbGQgZWRpdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIGlmIGFsbCBmaWVsZCBlZGl0b3JzIGFyZSB2YWxpZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpZWxkRWRpdG9yIGludmFsaWRGaWVsZEVkaXRvciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGFyZW50IGNvbXBvc2l0ZSBmb3IgZmllbGQgZWRpdG9ycwotICAgICAqLwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGZpZWxkRWRpdG9yUGFyZW50OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmaWVsZCBlZGl0b3IgcHJlZmVyZW5jZSBwYWdlIHdpdGggdGhlIGdpdmVuIHN0eWxlLAotICAgICAqIGFuIGVtcHR5IHRpdGxlLCBhbmQgbm8gaW1hZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3R5bGUgZWl0aGVyIDxjb2RlPkdSSUQ8L2NvZGU+IG9yIDxjb2RlPkZMQVQ8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UoaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGZpZWxkIGVkaXRvciBwcmVmZXJlbmNlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gdGl0bGUgCi0gICAgICogYW5kIHN0eWxlLCBidXQgbm8gaW1hZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGl0bGUgdGhlIHRpdGxlIG9mIHRoaXMgcHJlZmVyZW5jZSBwYWdlCi0gICAgICogQHBhcmFtIHN0eWxlIGVpdGhlciA8Y29kZT5HUklEPC9jb2RlPiBvciA8Y29kZT5GTEFUPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlKFN0cmluZyB0aXRsZSwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHRpdGxlKTsKLSAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZmllbGQgZWRpdG9yIHByZWZlcmVuY2UgcGFnZSB3aXRoIHRoZSBnaXZlbiB0aXRsZSwKLSAgICAgKiBpbWFnZSwgYW5kIHN0eWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpdGxlIHRoZSB0aXRsZSBvZiB0aGlzIHByZWZlcmVuY2UgcGFnZQotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgaW1hZ2UgZm9yIHRoaXMgcHJlZmVyZW5jZSBwYWdlLCBvciAKLSAgICAgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAcGFyYW0gc3R5bGUgZWl0aGVyIDxjb2RlPkdSSUQ8L2NvZGU+IG9yIDxjb2RlPkZMQVQ8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UoU3RyaW5nIHRpdGxlLCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UsCi0gICAgICAgICAgICBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIodGl0bGUsIGltYWdlKTsKLSAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGZpZWxkIGVkaXRvciB0byB0aGlzIHBhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWRpdG9yIHRoZSBmaWVsZCBlZGl0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRGaWVsZChGaWVsZEVkaXRvciBlZGl0b3IpIHsKLSAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKQotICAgICAgICAgICAgZmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaWVsZHMuYWRkKGVkaXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRqdXN0IHRoZSBsYXlvdXQgb2YgdGhlIGZpZWxkIGVkaXRvcnMgc28gdGhhdAotICAgICAqIHRoZXkgYXJlIHByb3Blcmx5IGFsaWduZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRqdXN0R3JpZExheW91dCgpIHsKLSAgICAgICAgaW50IG51bUNvbHVtbnMgPSBjYWxjTnVtYmVyT2ZDb2x1bW5zKCk7Ci0gICAgICAgICgoR3JpZExheW91dCkgZmllbGRFZGl0b3JQYXJlbnQuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgICAgICBpZiAoZmllbGRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmllbGRFZGl0b3IgZmllbGRFZGl0b3IgPSAoRmllbGRFZGl0b3IpIGZpZWxkcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgZmllbGRFZGl0b3IuYWRqdXN0Rm9yTnVtQ29sdW1ucyhudW1Db2x1bW5zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGx5cyB0aGUgZm9udCB0byB0aGUgZmllbGQgZWRpdG9ycyBtYW5hZ2VkIGJ5IHRoaXMgcGFnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseUZvbnQoKSB7Ci0gICAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3IgZSA9IGZpZWxkcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRmllbGRFZGl0b3IgcGUgPSAoRmllbGRFZGl0b3IpIGUubmV4dCgpOwotICAgICAgICAgICAgICAgIHBlLmFwcGx5Rm9udCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgbmVlZGVkIHRvIGhvc3QgYWxsIGZpZWxkIGVkaXRvcnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY29sdW1ucwotICAgICAqLwotICAgIHByaXZhdGUgaW50IGNhbGNOdW1iZXJPZkNvbHVtbnMoKSB7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICBpZiAoZmllbGRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGUgPSBmaWVsZHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEZpZWxkRWRpdG9yIHBlID0gKEZpZWxkRWRpdG9yKSBlLm5leHQoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBNYXRoLm1heChyZXN1bHQsIHBlLmdldE51bWJlck9mQ29udHJvbHMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvbXB1dGVzIHRoZSBwYWdlJ3MgZXJyb3Igc3RhdGUgYnkgY2FsbGluZyA8Y29kZT5pc1ZhbGlkPC9jb2RlPiBmb3IKLSAgICAgKiBldmVyeSBmaWVsZCBlZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tTdGF0ZSgpIHsKLSAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0gICAgICAgIGludmFsaWRGaWVsZEVkaXRvciA9IG51bGw7Ci0gICAgICAgIC8vIFRoZSBzdGF0ZSBjYW4gb25seSBiZSBzZXQgdG8gdHJ1ZSBpZiBhbGwKLSAgICAgICAgLy8gZmllbGQgZWRpdG9ycyBjb250YWluIGEgdmFsaWQgdmFsdWUuIFNvIHdlIG11c3QgY2hlY2sgdGhlbSBhbGwKLSAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IGZpZWxkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIEZpZWxkRWRpdG9yIGVkaXRvciA9IChGaWVsZEVkaXRvcikgZmllbGRzLmdldChpKTsKLSAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIGVkaXRvci5pc1ZhbGlkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCF2YWxpZCkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkRmllbGRFZGl0b3IgPSBlZGl0b3I7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXRWYWxpZCh2YWxpZCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpZWxkRWRpdG9yUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBmaWVsZEVkaXRvclBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgZmllbGRFZGl0b3JQYXJlbnQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotICAgICAgICBjcmVhdGVGaWVsZEVkaXRvcnMoKTsKLQotICAgICAgICBpZiAoc3R5bGUgPT0gR1JJRCkKLSAgICAgICAgICAgIGFkanVzdEdyaWRMYXlvdXQoKTsKLQotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgICAgIGNoZWNrU3RhdGUoKTsKLSAgICAgICAgcmV0dXJuIGZpZWxkRWRpdG9yUGFyZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHBhZ2UncyBmaWVsZCBlZGl0b3JzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZAotICAgICAqIGRvZXMgbm90aGluZy4gU3ViY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8KLSAgICAgKiBjcmVhdGUgdGhlIGZpZWxkIGVkaXRvcnMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIGNhbGwgPGNvZGU+Z2V0RmllbGRFZGl0b3JQYXJlbnQ8L2NvZGU+Ci0gICAgICogdG8gb2J0YWluIHRoZSBwYXJlbnQgY29udHJvbCBmb3IgZWFjaCBmaWVsZCBlZGl0b3IuCi0gICAgICogVGhpcyBzYW1lIHBhcmVudCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG1vcmUgdGhhbgotICAgICAqIG9uZSBlZGl0b3IgYXMgdGhlIHBhcmVudCBtYXkgY2hhbmdlIGZvciBlYWNoIGZpZWxkCi0gICAgICogZWRpdG9yIGRlcGVuZGluZyBvbiB0aGUgbGF5b3V0IHN0eWxlIG9mIHRoZSBwYWdlCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpOwotCi0gICAgLyoqCQotICAgICAqIFRoZSBmaWVsZCBlZGl0b3IgcHJlZmVyZW5jZSBwYWdlIGltcGxlbWVudGF0aW9uIG9mIGFuIDxjb2RlPklEaWFsb2dQYWdlPC9jb2RlPgotICAgICAqIG1ldGhvZCBkaXNwb3NlcyBvZiB0aGlzIHBhZ2UncyBjb250cm9scyBhbmQgaW1hZ2VzLgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHJlbGVhc2UgdGhlaXIgb3duIGFsbG9jYXRlZCBTV1QKLSAgICAgKiByZXNvdXJjZXMsIGJ1dCBtdXN0IGNhbGwgPGNvZGU+c3VwZXIuZGlzcG9zZTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICBpZiAoZmllbGRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGUgPSBmaWVsZHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEZpZWxkRWRpdG9yIHBlID0gKEZpZWxkRWRpdG9yKSBlLm5leHQoKTsKLSAgICAgICAgICAgICAgICBwZS5zZXRQYWdlKG51bGwpOwotICAgICAgICAgICAgICAgIHBlLnNldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0gICAgICAgICAgICAgICAgcGUuc2V0UHJlZmVyZW5jZVN0b3JlKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHBhcmVudCBjb21wb3NpdGUgZm9yIGEgZmllbGQgZWRpdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgdmFsdWUgbXVzdCBub3QgYmUgY2FjaGVkIHNpbmNlIGEgbmV3IHBhcmVudAotICAgICAqIG1heSBiZSBjcmVhdGVkIGVhY2ggdGltZSB0aGlzIG1ldGhvZCBjYWxsZWQuIFRodXMKLSAgICAgKiB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBlYWNoIHRpbWUgYSBmaWVsZCBlZGl0b3IKLSAgICAgKiBpcyBjb25zdHJ1Y3RlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgcGFyZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZSBnZXRGaWVsZEVkaXRvclBhcmVudCgpIHsKLSAgICAgICAgaWYgKHN0eWxlID09IEZMQVQpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJlbnQgZm9yIGVhY2ggZmllbGQgZWRpdG9yCi0gICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShmaWVsZEVkaXRvclBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICAgICAgcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICAgICAgfQotICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgcGFyZW50Ci0gICAgICAgIHJldHVybiBmaWVsZEVkaXRvclBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyBhbGwgZmllbGQgZWRpdG9ycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotICAgICAgICBpZiAoZmllbGRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGUgPSBmaWVsZHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEZpZWxkRWRpdG9yIHBlID0gKEZpZWxkRWRpdG9yKSBlLm5leHQoKTsKLSAgICAgICAgICAgICAgICBwZS5zZXRQYWdlKHRoaXMpOwotICAgICAgICAgICAgICAgIHBlLnNldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgcGUuc2V0UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLSAgICAgICAgICAgICAgICBwZS5sb2FkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioJCi0gICAgICogVGhlIGZpZWxkIGVkaXRvciBwcmVmZXJlbmNlIHBhZ2UgaW1wbGVtZW50YXRpb24gb2YgYSA8Y29kZT5QcmVmZXJlbmNlUGFnZTwvY29kZT4KLSAgICAgKiBtZXRob2QgbG9hZHMgYWxsIHRoZSBmaWVsZCBlZGl0b3JzIHdpdGggdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotICAgICAgICBpZiAoZmllbGRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGUgPSBmaWVsZHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEZpZWxkRWRpdG9yIHBlID0gKEZpZWxkRWRpdG9yKSBlLm5leHQoKTsKLSAgICAgICAgICAgICAgICBwZS5sb2FkRGVmYXVsdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEZvcmNlIGEgcmVjYWxjdWxhdGlvbiBvZiBteSBlcnJvciBzdGF0ZS4KLSAgICAgICAgY2hlY2tTdGF0ZSgpOwotICAgICAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogVGhlIGZpZWxkIGVkaXRvciBwcmVmZXJlbmNlIHBhZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5QcmVmZXJlbmNlUGFnZTwvY29kZT4gbWV0aG9kIHNhdmVzIGFsbCBmaWVsZCBlZGl0b3JzIGJ5Ci0gICAgICogY2FsbGluZyA8Y29kZT5GaWVsZEVkaXRvci5zdG9yZTwvY29kZT4uIE5vdGUgdGhhdCB0aGlzIG1ldGhvZAotICAgICAqIGRvZXMgbm90IHNhdmUgdGhlIHByZWZlcmVuY2Ugc3RvcmUgaXRzZWxmOyBpdCBqdXN0IHN0b3JlcyB0aGUKLSAgICAgKiB2YWx1ZXMgYmFjayBpbnRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqCi0gICAgICogQHNlZSBGaWVsZEVkaXRvciNzdG9yZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAgICAgICBpZiAoZmllbGRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGUgPSBmaWVsZHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEZpZWxkRWRpdG9yIHBlID0gKEZpZWxkRWRpdG9yKSBlLm5leHQoKTsKLSAgICAgICAgICAgICAgICBwZS5zdG9yZSgpOwotICAgICAgICAgICAgICAgIHBlLnNldFByZXNlbnRzRGVmYXVsdFZhbHVlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmllbGQgZWRpdG9yIHByZWZlcmVuY2UgcGFnZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklQcmVmZXJlbmNlUGFnZTwvY29kZT4KLSAgICAgKiAoYW5kIDxjb2RlPklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPC9jb2RlPikgbWV0aG9kIGludGVyY2VwdHMgPGNvZGU+SVNfVkFMSUQ8L2NvZGU+IAotICAgICAqIGV2ZW50cyBidXQgcGFzc2VzIG90aGVyIGV2ZW50cyBvbiB0byBpdHMgc3VwZXJjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLSAgICAgICAgaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEZpZWxkRWRpdG9yLklTX1ZBTElEKSkgewotICAgICAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9ICgoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgbmV3IHZhbHVlIGlzIHRydWUgdGhlbiB3ZSBtdXN0IGNoZWNrIGFsbCBmaWVsZCBlZGl0b3JzLgotICAgICAgICAgICAgLy8gSWYgaXQgaXMgZmFsc2UsIHRoZW4gdGhlIHBhZ2UgaXMgaW52YWxpZCBpbiBhbnkgY2FzZS4KLSAgICAgICAgICAgIGlmIChuZXdWYWx1ZSkgewotICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW52YWxpZEZpZWxkRWRpdG9yID0gKEZpZWxkRWRpdG9yKSBldmVudC5nZXRTb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBzZXRWYWxpZChuZXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgaWYgKHZpc2libGUgJiYgaW52YWxpZEZpZWxkRWRpdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludmFsaWRGaWVsZEVkaXRvci5zZXRGb2N1cygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9GaWxlRmllbGRFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvRmlsZUZpZWxkRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNzU4OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9GaWxlRmllbGRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci0KLS8qKgotICogQSBmaWVsZCBlZGl0b3IgZm9yIGEgZmlsZSBwYXRoIHR5cGUgcHJlZmVyZW5jZS4gQSBzdGFuZGFyZCBmaWxlIAotICogZGlhbG9nIGFwcGVhcnMgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBjaGFuZ2UgYnV0dG9uLgotICovCi1wdWJsaWMgY2xhc3MgRmlsZUZpZWxkRWRpdG9yIGV4dGVuZHMgU3RyaW5nQnV0dG9uRmllbGRFZGl0b3IgewotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiBsZWdhbCBmaWxlIGV4dGVuc2lvbiBzdWZmaXhlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBmb3Igc3lzdGVtIGRlZmF1bHRzLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZXh0ZW5zaW9ucyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcGF0aCBtdXN0IGJlIGFic29sdXRlOwotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBieSBkZWZhdWx0LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmZvcmNlQWJzb2x1dGUgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZmlsZSBmaWVsZCBlZGl0b3IgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGVGaWVsZEVkaXRvcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZmlsZSBmaWVsZCBlZGl0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdGhpcyBmaWVsZCBlZGl0b3Igd29ya3Mgb24KLSAgICAgKiBAcGFyYW0gbGFiZWxUZXh0IHRoZSBsYWJlbCB0ZXh0IG9mIHRoZSBmaWVsZCBlZGl0b3IKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhlIGZpZWxkIGVkaXRvcidzIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZUZpZWxkRWRpdG9yKFN0cmluZyBuYW1lLCBTdHJpbmcgbGFiZWxUZXh0LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMobmFtZSwgbGFiZWxUZXh0LCBmYWxzZSwgcGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZmlsZSBmaWVsZCBlZGl0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdGhpcyBmaWVsZCBlZGl0b3Igd29ya3Mgb24KLSAgICAgKiBAcGFyYW0gbGFiZWxUZXh0IHRoZSBsYWJlbCB0ZXh0IG9mIHRoZSBmaWVsZCBlZGl0b3IKLSAgICAgKiBAcGFyYW0gZW5mb3JjZUFic29sdXRlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlIHBhdGgKLSAgICAgKiAgbXVzdCBiZSBhYnNvbHV0ZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhlIGZpZWxkIGVkaXRvcidzIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZUZpZWxkRWRpdG9yKFN0cmluZyBuYW1lLCBTdHJpbmcgbGFiZWxUZXh0LAotICAgICAgICAgICAgYm9vbGVhbiBlbmZvcmNlQWJzb2x1dGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaW5pdChuYW1lLCBsYWJlbFRleHQpOwotICAgICAgICB0aGlzLmVuZm9yY2VBYnNvbHV0ZSA9IGVuZm9yY2VBYnNvbHV0ZTsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKEpGYWNlUmVzb3VyY2VzCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiRmlsZUZpZWxkRWRpdG9yLmVycm9yTWVzc2FnZSIpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHNldENoYW5nZUJ1dHRvblRleHQoSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJvcGVuQnJvd3NlIikpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0VmFsaWRhdGVTdHJhdGVneShWQUxJREFURV9PTl9GT0NVU19MT1NUKTsKLSAgICAgICAgY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gU3RyaW5nQnV0dG9uRmllbGRFZGl0b3IuCi0gICAgICogT3BlbnMgdGhlIGZpbGUgY2hvb3NlciBkaWFsb2cgYW5kIHJldHVybnMgdGhlIHNlbGVjdGVkIGZpbGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjaGFuZ2VQcmVzc2VkKCkgewotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShnZXRUZXh0Q29udHJvbCgpLmdldFRleHQoKSk7Ci0gICAgICAgIGlmICghZi5leGlzdHMoKSkKLSAgICAgICAgICAgIGYgPSBudWxsOwotICAgICAgICBGaWxlIGQgPSBnZXRGaWxlKGYpOwotICAgICAgICBpZiAoZCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIGQuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBTdHJpbmdGaWVsZEVkaXRvci4KLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgdGV4dCBpbnB1dCBmaWVsZCBzcGVjaWZpZXMgYW4gZXhpc3RpbmcgZmlsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1N0YXRlKCkgewotCi0gICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBwYXRoID0gZ2V0VGV4dENvbnRyb2woKS5nZXRUZXh0KCk7Ci0gICAgICAgIGlmIChwYXRoICE9IG51bGwpCi0gICAgICAgICAgICBwYXRoID0gcGF0aC50cmltKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBhdGggPSAiIjsvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChwYXRoLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGlmICghaXNFbXB0eVN0cmluZ0FsbG93ZWQoKSkKLSAgICAgICAgICAgICAgICBtc2cgPSBnZXRFcnJvck1lc3NhZ2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotICAgICAgICAgICAgaWYgKGZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZW5mb3JjZUFic29sdXRlICYmICFmaWxlLmlzQWJzb2x1dGUoKSkKLSAgICAgICAgICAgICAgICAgICAgbXNnID0gSkZhY2VSZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJGaWxlRmllbGRFZGl0b3IuZXJyb3JNZXNzYWdlMiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbXNnID0gZ2V0RXJyb3JNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobXNnICE9IG51bGwpIHsgLy8gZXJyb3IKLSAgICAgICAgICAgIHNob3dFcnJvck1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE9LIQotICAgICAgICBjbGVhckVycm9yTWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgdG8gb3BlbiB0aGUgZmlsZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKiBAcGFyYW0gc3RhcnRpbmdEaXJlY3RvcnkgdGhlIGRpcmVjdG9yeSB0byBvcGVuIHRoZSBkaWFsb2cgb24uCi0gICAgICogQHJldHVybiBGaWxlIFRoZSBGaWxlIHRoZSB1c2VyIHNlbGVjdGVkIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXkKLSAgICAgKiBkbyBub3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGdldEZpbGUoRmlsZSBzdGFydGluZ0RpcmVjdG9yeSkgewotCi0gICAgICAgIEZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotICAgICAgICBpZiAoc3RhcnRpbmdEaXJlY3RvcnkgIT0gbnVsbCkKLSAgICAgICAgICAgIGRpYWxvZy5zZXRGaWxlTmFtZShzdGFydGluZ0RpcmVjdG9yeS5nZXRQYXRoKCkpOwotICAgICAgICBpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKQotICAgICAgICAgICAgZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0gICAgICAgIFN0cmluZyBmaWxlID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmlsZSA9IGZpbGUudHJpbSgpOwotICAgICAgICAgICAgaWYgKGZpbGUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShmaWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyBmaWxlIGZpZWxkIGVkaXRvcidzIGZpbGUgZXh0ZW5zaW9uIGZpbHRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRlbnNpb25zIGEgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gCi0gICAgICogdG8gc2V0IHRoZSBmaWx0ZXIgdG8gdGhlIHN5c3RlbSdzIGRlZmF1bHQgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlRXh0ZW5zaW9ucyhTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9Gb250RmllbGRFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvRm9udEZpZWxkRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTI5YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9Gb250RmllbGRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRm9udERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgZmllbGQgZWRpdG9yIGZvciBhIGZvbnQgdHlwZSBwcmVmZXJlbmNlLgotICovCi1wdWJsaWMgY2xhc3MgRm9udEZpZWxkRWRpdG9yIGV4dGVuZHMgRmllbGRFZGl0b3IgewotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYW5nZSBmb250IGJ1dHRvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIChiZWZvcmUgY3JlYXRpb24gYW5kIGFmdGVyIGRpc3Bvc2FsKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEJ1dHRvbiBjaGFuZ2VGb250QnV0dG9uID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgY2hhbmdlIGZvbnQgYnV0dG9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIGlmIG1pc3NpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2hhbmdlQnV0dG9uVGV4dDsKLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcHJldmlldywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJldmlldyBpcyBkZXNpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJldmlld1RleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBGb250IGRhdGEgZm9yIHRoZSBjaG9zZW4gZm9udCBidXR0b24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGb250RGF0YVtdIGNob3NlbkZvbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGFiZWwgdGhhdCBkaXNwbGF5cyB0aGUgc2VsZWN0ZWQgZm9udCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIExhYmVsIHZhbHVlQ29udHJvbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBwcmV2aWV3ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBEZWZhdWx0UHJldmlld2VyIHByZXZpZXdlcjsKLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGZvbnQgcHJldmlld2VyIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlZmF1bHRQcmV2aWV3ZXIgewotICAgICAgICBwcml2YXRlIFRleHQgdGV4dDsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBzdHJpbmc7Ci0KLSAgICAgICAgcHJpdmF0ZSBGb250IGZvbnQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgcHJldmlld2VyLgotICAgICAgICAgKiBAcGFyYW0gcwotICAgICAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRGVmYXVsdFByZXZpZXdlcihTdHJpbmcgcywgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgc3RyaW5nID0gczsKLSAgICAgICAgICAgIHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgICAgIHRleHQuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaWYgKHN0cmluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRleHQuc2V0VGV4dChzdHJpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGNvbnRyb2wgdGhlIHByZXZpZXdlciBpcyB1c2luZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgZm9udCB0byBkaXNwbGF5IHdpdGgKLSAgICAgICAgICogQHBhcmFtIGZvbnREYXRhCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb250KEZvbnREYXRhW10gZm9udERhdGEpIHsKLSAgICAgICAgICAgIGlmIChmb250ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZm9udC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBmb250ID0gbmV3IEZvbnQodGV4dC5nZXREaXNwbGF5KCksIGZvbnREYXRhKTsKLSAgICAgICAgICAgIHRleHQuc2V0Rm9udChmb250KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgcHJldmlld2VyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRQcmVmZXJyZWRFeHRlbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gNDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGZvbnQgZmllbGQgZWRpdG9yIAotICAgICAqLwotICAgIHByb3RlY3RlZCBGb250RmllbGRFZGl0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGZvbnQgZmllbGQgZWRpdG9yIHdpdGggYW4gb3B0aW9uYWwgcHJldmlldyBhcmVhLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHRoaXMgZmllbGQgZWRpdG9yIHdvcmtzIG9uCi0gICAgICogQHBhcmFtIGxhYmVsVGV4dCB0aGUgbGFiZWwgdGV4dCBvZiB0aGUgZmllbGQgZWRpdG9yCi0gICAgICogQHBhcmFtIHByZXZpZXdBcmVhVGV4dCB0aGUgdGV4dCB1c2VkIGZvciB0aGUgcHJldmlldyB3aW5kb3cuIElmIGl0IGlzCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gdGhlcmUgd2lsbCBiZSBubyBwcmV2aWV3IGFyZWEsCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG9mIHRoZSBmaWVsZCBlZGl0b3IncyBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIEZvbnRGaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsVGV4dCwKLSAgICAgICAgICAgIFN0cmluZyBwcmV2aWV3QXJlYVRleHQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaW5pdChuYW1lLCBsYWJlbFRleHQpOwotICAgICAgICBwcmV2aWV3VGV4dCA9IHByZXZpZXdBcmVhVGV4dDsKLSAgICAgICAgY2hhbmdlQnV0dG9uVGV4dCA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygib3BlbkNoYW5nZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBmb250IGZpZWxkIGVkaXRvciB3aXRob3V0IGEgcHJldmlldy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0aGlzIGZpZWxkIGVkaXRvciB3b3JrcyBvbgotICAgICAqIEBwYXJhbSBsYWJlbFRleHQgdGhlIGxhYmVsIHRleHQgb2YgdGhlIGZpZWxkIGVkaXRvcgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGUgZmllbGQgZWRpdG9yJ3MgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBGb250RmllbGRFZGl0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBsYWJlbFRleHQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyhuYW1lLCBsYWJlbFRleHQsIG51bGwsIHBhcmVudCk7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkanVzdEZvck51bUNvbHVtbnMoaW50IG51bUNvbHVtbnMpIHsKLQotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGlmICh2YWx1ZUNvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0gICAgICAgICAgICBkYXRhID0gKEdyaWREYXRhKSB2YWx1ZUNvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpOwotCi0gICAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zIC0gZ2V0TnVtYmVyT2ZDb250cm9scygpICsgMTsKLSAgICAgICAgdmFsdWVDb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseUZvbnQoKSB7Ci0gICAgICAgIGlmIChjaG9zZW5Gb250ICE9IG51bGwgJiYgcHJldmlld2VyICE9IG51bGwpCi0gICAgICAgICAgICBwcmV2aWV3ZXIuc2V0Rm9udChjaG9zZW5Gb250KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRmlsbEludG9HcmlkKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0gICAgICAgIGdldExhYmVsQ29udHJvbChwYXJlbnQpOwotCi0gICAgICAgIHZhbHVlQ29udHJvbCA9IGdldFZhbHVlQ29udHJvbChwYXJlbnQpOwotCi0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zIC0gZ2V0TnVtYmVyT2ZDb250cm9scygpICsgMTsKLSAgICAgICAgdmFsdWVDb250cm9sLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBpZiAocHJldmlld1RleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJldmlld2VyID0gbmV3IERlZmF1bHRQcmV2aWV3ZXIocHJldmlld1RleHQsIHBhcmVudCk7Ci0gICAgICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICAgICAgZ2QuaGVpZ2h0SGludCA9IHByZXZpZXdlci5nZXRQcmVmZXJyZWRFeHRlbnQoKTsKLSAgICAgICAgICAgIGdkLndpZHRoSGludCA9IHByZXZpZXdlci5nZXRQcmVmZXJyZWRFeHRlbnQoKTsKLSAgICAgICAgICAgIHByZXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFuZ2VGb250QnV0dG9uID0gZ2V0Q2hhbmdlQ29udHJvbChwYXJlbnQpOwotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBpbnQgd2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoY2hhbmdlRm9udEJ1dHRvbiwKLSAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0gICAgICAgIGdkLndpZHRoSGludCA9IE1hdGgubWF4KHdpZHRoSGludCwgY2hhbmdlRm9udEJ1dHRvbi5jb21wdXRlU2l6ZSgKLSAgICAgICAgICAgICAgICBTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotICAgICAgICBjaGFuZ2VGb250QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0xvYWQoKSB7Ci0gICAgICAgIGlmIChjaGFuZ2VGb250QnV0dG9uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHVwZGF0ZUZvbnQoUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YUFycmF5KGdldFByZWZlcmVuY2VTdG9yZSgpLAotICAgICAgICAgICAgICAgIGdldFByZWZlcmVuY2VOYW1lKCkpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvTG9hZERlZmF1bHQoKSB7Ci0gICAgICAgIGlmIChjaGFuZ2VGb250QnV0dG9uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHVwZGF0ZUZvbnQoUHJlZmVyZW5jZUNvbnZlcnRlci5nZXREZWZhdWx0Rm9udERhdGFBcnJheSgKLSAgICAgICAgICAgICAgICBnZXRQcmVmZXJlbmNlU3RvcmUoKSwgZ2V0UHJlZmVyZW5jZU5hbWUoKSkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TdG9yZSgpIHsKLSAgICAgICAgaWYgKGNob3NlbkZvbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIFByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0VmFsdWUoZ2V0UHJlZmVyZW5jZVN0b3JlKCksCi0gICAgICAgICAgICAgICAgICAgIGdldFByZWZlcmVuY2VOYW1lKCksIGNob3NlbkZvbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoYW5nZSBidXR0b24gZm9yIHRoaXMgZmllbGQgZWRpdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgQ29tcG9zaXRlIHRvIGNyZWF0ZSB0aGUgYnV0dG9uIGluIGlmIHJlcXVpcmVkLgotICAgICAqIEByZXR1cm4gdGhlIGNoYW5nZSBidXR0b24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQnV0dG9uIGdldENoYW5nZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpZiAoY2hhbmdlRm9udEJ1dHRvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjaGFuZ2VGb250QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgIGlmIChjaGFuZ2VCdXR0b25UZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY2hhbmdlRm9udEJ1dHRvbi5zZXRUZXh0KGNoYW5nZUJ1dHRvblRleHQpOwotICAgICAgICAgICAgY2hhbmdlRm9udEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICBGb250RGlhbG9nIGZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyhjaGFuZ2VGb250QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNoZWxsKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2hvc2VuRm9udCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZm9udERpYWxvZy5zZXRGb250TGlzdChjaG9zZW5Gb250KTsKLSAgICAgICAgICAgICAgICAgICAgRm9udERhdGEgZm9udCA9IGZvbnREaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZm9udCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGb250RGF0YVtdIG9sZEZvbnQgPSBjaG9zZW5Gb250OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEZvbnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0RGVmYXVsdEZvbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZvbnREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmVzZW50c0RlZmF1bHRWYWx1ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGb250RGF0YVtdIG5ld0RhdGEgPSBuZXcgRm9udERhdGFbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhWzBdID0gZm9udDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZvbnQobmV3RGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJlVmFsdWVDaGFuZ2VkKFZBTFVFLCBvbGRGb250WzBdLCBmb250KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBjaGFuZ2VGb250QnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VGb250QnV0dG9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGNoYW5nZUZvbnRCdXR0b24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgICAgIHNldEJ1dHRvbkxheW91dERhdGEoY2hhbmdlRm9udEJ1dHRvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGVja1BhcmVudChjaGFuZ2VGb250QnV0dG9uLCBwYXJlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFuZ2VGb250QnV0dG9uOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZkNvbnRyb2xzKCkgewotICAgICAgICBpZiAocHJldmlld2VyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiA0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZWZlcnJlZCBwcmV2aWV3IGhlaWdodC4gCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQsIG9yIDxjb2RlPi0xPC9jb2RlPiBpZiBubyBwcmV2aWV3ZXIKLSAgICAgKiAgaXMgaW5zdGFsbGVkCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQcmVmZXJyZWRQcmV2aWV3SGVpZ2h0KCkgewotICAgICAgICBpZiAocHJldmlld2VyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJldHVybiBwcmV2aWV3ZXIuZ2V0UHJlZmVycmVkRXh0ZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJldmlldyBjb250cm9sIGZvciB0aGlzIGZpZWxkIGVkaXRvci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByZXZpZXcgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBDb250cm9sIGdldFByZXZpZXdDb250cm9sKCkgewotICAgICAgICBpZiAocHJldmlld2VyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gcHJldmlld2VyLmdldENvbnRyb2woKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBjb250cm9sIGZvciB0aGlzIGZpZWxkIGVkaXRvci4gVGhlIHZhbHVlIGNvbnRyb2wKLSAgICAgKiBkaXNwbGF5cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGZvbnQgbmFtZS4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBDb21wb3NpdGUgdG8gY3JlYXRlIHRoZSB2aWV3ZXIgaW4gaWYgcmVxdWlyZWQKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExhYmVsIGdldFZhbHVlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGlmICh2YWx1ZUNvbnRyb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWVDb250cm9sID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgICAgICAgICAgdmFsdWVDb250cm9sLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgICAgICB2YWx1ZUNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlQ29udHJvbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGVja1BhcmVudCh2YWx1ZUNvbnRyb2wsIHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlQ29udHJvbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0ZXh0IG9mIHRoZSBjaGFuZ2UgYnV0dG9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgdGhlIG5ldyB0ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2hhbmdlQnV0dG9uVGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHRleHQpOwotICAgICAgICBjaGFuZ2VCdXR0b25UZXh0ID0gdGV4dDsKLSAgICAgICAgaWYgKGNoYW5nZUZvbnRCdXR0b24gIT0gbnVsbCkKLSAgICAgICAgICAgIGNoYW5nZUZvbnRCdXR0b24uc2V0VGV4dCh0ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBjaGFuZ2UgZm9udCBidXR0b24gYW5kIHRoZSBwcmV2aWV3ZXIgdG8gcmVmbGVjdCB0aGUKLSAgICAgKiBuZXdseSBzZWxlY3RlZCBmb250LgotICAgICAqIEBwYXJhbSBmb250IFRoZSBGb250RGF0YVtdIHRvIHVwZGF0ZSB3aXRoLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVGb250KEZvbnREYXRhIGZvbnRbXSkgewotICAgICAgICBGb250RGF0YVtdIGJlc3RGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZmlsdGVyRGF0YSgKLSAgICAgICAgICAgICAgICBmb250LCB2YWx1ZUNvbnRyb2wuZ2V0RGlzcGxheSgpKTsKLQotICAgICAgICAvL2lmIHdlIGhhdmUgbm90aGluZyB2YWxpZCBkbyBhcyBiZXN0IHdlIGNhbgotICAgICAgICBpZiAoYmVzdEZvbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIGJlc3RGb250ID0gZ2V0RGVmYXVsdEZvbnREYXRhKCk7Ci0KLSAgICAgICAgLy9Ob3cgY2FjaGUgdGhpcyB2YWx1ZSBpbiB0aGUgcmVjZWl2ZXIKLSAgICAgICAgdGhpcy5jaG9zZW5Gb250ID0gYmVzdEZvbnQ7Ci0KLSAgICAgICAgaWYgKHZhbHVlQ29udHJvbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZUNvbnRyb2wuc2V0VGV4dChTdHJpbmdDb252ZXJ0ZXIuYXNTdHJpbmcoY2hvc2VuRm9udFswXSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmV2aWV3ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJldmlld2VyLnNldEZvbnQoYmVzdEZvbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSBmb3IgdGhlIGZpZWxkCi0gICAgICogYmVpbmcgZWRpdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VG9EZWZhdWx0KCkgewotICAgICAgICBGb250RGF0YVtdIGRlZmF1bHRGb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEZvbnREYXRhQXJyYXkoZ2V0UHJlZmVyZW5jZVN0b3JlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQcmVmZXJlbmNlTmFtZSgpKTsKLSAgICAgICAgUHJlZmVyZW5jZUNvbnZlcnRlci5zZXRWYWx1ZShnZXRQcmVmZXJlbmNlU3RvcmUoKSwgZ2V0UHJlZmVyZW5jZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBkZWZhdWx0Rm9udERhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3lzdGVtIGRlZmF1bHQgZm9udCBkYXRhLgotICAgICAqIEByZXR1cm4gRm9udERhdGFbXQotICAgICAqLwotICAgIHByaXZhdGUgRm9udERhdGFbXSBnZXREZWZhdWx0Rm9udERhdGEoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUNvbnRyb2wuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUZvbnQoKS5nZXRGb250RGF0YSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBGaWVsZEVkaXRvci5zZXRFbmFibGVkKGJvb2xlYW4sQ29tcG9zaXRlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQsIHBhcmVudCk7Ci0gICAgICAgIGdldENoYW5nZUNvbnRyb2wocGFyZW50KS5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICBnZXRWYWx1ZUNvbnRyb2wocGFyZW50KS5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9JUGVyc2lzdGVudFByZWZlcmVuY2VTdG9yZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9JUGVyc2lzdGVudFByZWZlcmVuY2VTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTRmZWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvSVBlcnNpc3RlbnRQcmVmZXJlbmNlU3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBJUGVyc2lzdGVudFByZWZlcmVuY2VTdG9yZSBpcyBhIHByZWZlcmVuY2Ugc3RvcmUgdGhhdCBjYW4gCi0gKiBiZSBzYXZlZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUGVyc2lzdGVudFByZWZlcmVuY2VTdG9yZSBleHRlbmRzIElQcmVmZXJlbmNlU3RvcmUgewotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIG5vbi1kZWZhdWx0LXZhbHVlZCBwcmVmZXJlbmNlcyBrbm93biB0byB0aGlzIHByZWZlcmVuY2UKLSAgICAgKiBzdG9yZSB0byB0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZXkgd2VyZSBvcmlnaW5hbGx5IGxvYWRlZC4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2F2aW5nIHRoaXMgc3RvcmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0lQcmVmZXJlbmNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9JUHJlZmVyZW5jZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5OTcyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0lQcmVmZXJlbmNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBhIG5vZGUgaW4gYSBwcmVmZXJlbmNlIGRpYWxvZy4gCi0gKiBBIHByZWZlcmVuY2Ugbm9kZSBtYWludGFpbnMgYSBsYWJlbCBhbmQgaW1hZ2UgdXNlZCB0byBkaXNwbGF5IHRoZQotICogbm9kZSBpbiBhIHByZWZlcmVuY2UgZGlhbG9nICh1c3VhbGx5IGluIHRoZSBmb3JtIG9mIGEgdHJlZSksIAotICogYXMgd2VsbCBhcyB0aGUgcHJlZmVyZW5jZSBwYWdlIHRoaXMgbm9kZSBzdGFuZHMgZm9yLgotICoKLSAqIFRoZSBub2RlIG1heSB1c2UgbGF6eSBjcmVhdGlvbiBmb3IgaXRzIHBhZ2UKLSAqCi0gKiBOb3RlIHRoYXQgYWxsIHByZWZlcmVuY2Ugbm9kZXMgbXVzdCBiZSBkaXNwb3NlIHRoZWlyIHJlc291cmNlcy4KLSAqIFRoZSBub2RlIG11c3QgZGlzcG9zZSB0aGUgcGFnZSBtYW5hZ2VkIGJ5IHRoaXMgbm9kZSwgYW5kIGFueSBTV1QgcmVzb3VyY2VzCi0gKiBhbGxvY2F0ZWQgYnkgdGhpcyBub2RlIChJbWFnZXMsIEZvbnRzLCBldGMpLgotICogSG93ZXZlciB0aGUgbm9kZSBpdHNlbGYgbWF5IGJlIHJldXNlZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJlZmVyZW5jZU5vZGUgewotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIHByZWZlcmVuY2Ugbm9kZSBhcyBhIHN1Ym5vZGUgb2YgdGhpcwotICAgICAqIHByZWZlcmVuY2Ugbm9kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChJUHJlZmVyZW5jZU5vZGUgbm9kZSk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBwcmVmZXJlbmNlIHBhZ2UgZm9yIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYWdlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIHRoZSBwYWdlIG1hbmFnZWQgYnkgdGhpcyBub2RlLCBhbmQgYW55IFNXVCByZXNvdXJjZXMKLSAgICAgKiBoZWxkIG9udG8gYnkgdGhpcyBub2RlIChJbWFnZXMsIEZvbnRzLCBldGMpLiAgCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgbm9kZXMgYXJlIHJldXNlZCBzbyB0aGlzIGlzIG5vdCBhIGNhbGwgdG8gZGlzcG9zZSB0aGUKLSAgICAgKiBub2RlIGl0c2VsZi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlUmVzb3VyY2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWJub2RlIG9mIHRoaXMgY29udHJpYnV0aW9uIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gbm9kZSBpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpZCB0aGUgcHJlZmVyZW5jZSBub2RlIGlkCi0gICAgICogQHJldHVybiB0aGUgc3Vibm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBJUHJlZmVyZW5jZU5vZGUgZmluZFN1Yk5vZGUoU3RyaW5nIGlkKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgY29udHJpYnV0aW9uIG5vZGUuCi0gICAgICogVGhpcyBpZCBpZGVudGlmaWVzIGEgY29udHJpYnV0aW9uIG5vZGUgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5vZGUgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbWFnZSB1c2VkIHRvIHByZXNlbnQgdGhpcyBub2RlIGluIGEgcHJlZmVyZW5jZSBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICAgaWYgdGhlcmUgaXMgbm8gaW1hZ2UgZm9yIHRoaXMgbm9kZQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRMYWJlbEltYWdlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGxhYmVsIHVzZWQgdG8gcHJlc2VudCB0aGlzIG5vZGUgaW4gYSBwcmVmZXJlbmNlIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHRleHQgbGFiZWwgZm9yIHRoaXMgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAgIGlmIHRoZXJlIGlzIG5vIGxhYmVsIGZvciB0aGlzIG5vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBwYWdlIGZvciB0aGlzIG5vZGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSVByZWZlcmVuY2VQYWdlIGdldFBhZ2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGUgc3Vibm9kZXMgKGltbWVkaWF0ZSBjaGlsZHJlbikKLSAgICAgKiBvZiB0aGlzIGNvbnRyaWJ1dGlvbiBub2RlLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBJUHJlZmVyZW5jZU5vZGUgYXJyYXkgY29udGFpbmluZyB0aGUgY2hpbGQgbm9kZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgSVByZWZlcmVuY2VOb2RlW10gZ2V0U3ViTm9kZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHN1Ym5vZGUgb2YgdGhpcyBwcmVmZXJlbmNlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gbm9kZSBpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpZCB0aGUgc3Vibm9kZSBpZAotICAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgc3Vibm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBJUHJlZmVyZW5jZU5vZGUgcmVtb3ZlKFN0cmluZyBpZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBwcmVmZXJlbmNlIG5vZGUgZnJvbSB0aGUgbGlzdCBvZiBzdWJub2RlcwotICAgICAqIChpbW1lZGlhdGUgY2hpbGRyZW4pIG9mIHRoaXMgbm9kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5vZGUgd2FzIHJlbW92ZWQsCi0gICAgICogIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKElQcmVmZXJlbmNlTm9kZSBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvSVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0lQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzhhYWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvSVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYSBwcmVmZXJlbmNlIHBhZ2UuIFRoaXMgaW50ZXJmYWNlCi0gKiBpcyB1c2VkIHByaW1hcmlseSBieSB0aGUgcGFnZSdzIGNvbnRhaW5lciAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBJRGlhbG9nUGFnZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb21wdXRlcyBhIHNpemUgZm9yIHRoaXMgcGFnZSdzIFVJIGNvbXBvbmVudC4gCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwcmVmZXJlbmNlIHBhZ2UgZW5jb2RlZCBhcwotICAgICAqICAgPGNvZGU+bmV3IFBvaW50KHdpZHRoLGhlaWdodCk8L2NvZGU+LCBvciAKLSAgICAgKiAgIDxjb2RlPigwLDApPC9jb2RlPiBpZiB0aGUgcGFnZSBkb2Vzbid0IGN1cnJlbnRseSBoYXZlIGFueSBVSSBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGRpYWxvZyBwYWdlIGlzIGluIGEgdmFsaWQgc3RhdGUuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFnZSBpcyBpbiBhIHZhbGlkIHN0YXRlLAotICAgICAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpbnZhbGlkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgaXQgaXMgYWxyaWdodCB0byBsZWF2ZSB0aGlzIHBhZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gYWJvcnQgcGFnZSBmbGlwcGluZyBhbmQgdGhlCi0gICAgICogIGhhdmUgdGhlIGN1cnJlbnQgcGFnZSByZW1haW4gdmlzaWJsZSwgYW5kIDxjb2RlPnRydWU8L2NvZGU+Ci0gICAgICogIHRvIGFsbG93IHRoZSBwYWdlIGZsaXAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBva1RvTGVhdmUoKTsKLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoYXQgdGhlIGNvbnRhaW5lciBvZiB0aGlzIHByZWZlcmVuY2UgcGFnZSBoYXMgYmVlbiBjYW5jZWxlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBhYm9ydCB0aGUgY29udGFpbmVyJ3MgY2FuY2VsIAotICAgICAqICBwcm9jZWR1cmUgYW5kIDxjb2RlPnRydWU8L2NvZGU+IHRvIGFsbG93IHRoZSBjYW5jZWwgdG8gaGFwcGVuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpOwotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCB0aGUgT0sgYnV0dG9uIG9mIHRoaXMgcGFnZSdzIGNvbnRhaW5lciBoYXMgYmVlbiBwcmVzc2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGFib3J0IHRoZSBjb250YWluZXIncyBPSwotICAgICAqICBwcm9jZXNzaW5nIGFuZCA8Y29kZT50cnVlPC9jb2RlPiB0byBhbGxvdyB0aGUgT0sgdG8gaGFwcGVuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgY29udGFpbmVyIG9mIHRoaXMgcGFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlUGFnZUNvbnRhaW5lciB0aGUgcHJlZmVyZW5jZSBwYWdlIGNvbnRhaW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKElQcmVmZXJlbmNlUGFnZUNvbnRhaW5lciBwcmVmZXJlbmNlUGFnZUNvbnRhaW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoaXMgcGFnZSdzIFVJIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBwcmVmZXJlbmNlIHBhZ2UgZW5jb2RlZCBhcwotICAgICAqICAgPGNvZGU+bmV3IFBvaW50KHdpZHRoLGhlaWdodCk8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShQb2ludCBzaXplKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvSVByZWZlcmVuY2VQYWdlQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0lQcmVmZXJlbmNlUGFnZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzk0MTY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvSVByZWZlcmVuY2VQYWdlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdXNlZCBieSBhIHByZWZlcmVuY2UgcGFnZSB0byB0YWxrIHRvCi0gKiBpdHMgZGlhbG9nLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcmVmZXJlbmNlUGFnZUNvbnRhaW5lciB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2Ugc3RvcmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotICAgIC8qKgotICAgICAqIEFkanVzdHMgdGhlIGVuYWJsZSBzdGF0ZSBvZiB0aGUgT0sgCi0gICAgICogYnV0dG9uIHRvIHJlZmxlY3QgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIAotICAgICAqIHBhZ2UgaW4gdGhpcyBjb250YWluZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBjb250YWluZXIgaXRzZWxmCi0gICAgICogd2hlbiBpdHMgcHJlZmVyZW5jZSBwYWdlIGNoYW5nZXMgYW5kIG1heSBiZSBjYWxsZWQKLSAgICAgKiBieSB0aGUgcGFnZSBhdCBvdGhlciB0aW1lcyB0byBmb3JjZSBhIGJ1dHRvbiBzdGF0ZQotICAgICAqIHVwZGF0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQnV0dG9ucygpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgbWVzc2FnZSAob3IgZXJyb3IgbWVzc2FnZSkgc2hvd24gaW4gdGhlIG1lc3NhZ2UgbGluZSB0byAKLSAgICAgKiByZWZsZWN0IHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBwYWdlIGluIHRoaXMgY29udGFpbmVyLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgY29udGFpbmVyIGl0c2VsZgotICAgICAqIHdoZW4gaXRzIHByZWZlcmVuY2UgcGFnZSBjaGFuZ2VzIGFuZCBtYXkgYmUgY2FsbGVkCi0gICAgICogYnkgdGhlIHBhZ2UgYXQgb3RoZXIgdGltZXMgdG8gZm9yY2UgYSBtZXNzYWdlIAotICAgICAqIHVwZGF0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlTWVzc2FnZSgpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdGl0bGUgdG8gcmVmbGVjdCB0aGUgc3RhdGUgb2YgdGhlIAotICAgICAqIGN1cnJlbnRseSBhY3RpdmUgcGFnZSBpbiB0aGlzIGNvbnRhaW5lci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGNvbnRhaW5lciBpdHNlbGYKLSAgICAgKiB3aGVuIGl0cyBwYWdlIGNoYW5nZXMgYW5kIG1heSBiZSBjYWxsZWQKLSAgICAgKiBieSB0aGUgcGFnZSBhdCBvdGhlciB0aW1lcyB0byBmb3JjZSBhIHRpdGxlICAKLSAgICAgKiB1cGRhdGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVRpdGxlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0lQcmVmZXJlbmNlU3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvSVByZWZlcmVuY2VTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWQ0ZjM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvSVByZWZlcmVuY2VTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+SVByZWZlcmVuY2VTdG9yZTwvY29kZT4gaW50ZXJmYWNlIHJlcHJlc2VudHMgYSB0YWJsZSBtYXBwaW5nCi0gKiBuYW1lZCBwcmVmZXJlbmNlcyB0byB2YWx1ZXMuIElmIHRoZXJlIGlzIG5vIHZhbHVlIGZvciBhIGdpdmVuIG5hbWUsIAotICogdGhlbiB0aGF0IHByZWZlcmVuY2VzJ3MgZGVmYXVsdCB2YWx1ZSBpcyByZXR1cm5lZDsgYW5kIGlmIHRoZXJlIGlzIG5vCi0gKiBkZWZhdWx0IHZhbHVlIGZvciB0aGF0IHByZWZlcmVuY2UsIHRoZW4gYSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgaXMgcmV0dXJuZWQuCi0gKiBUaGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlcyBhcmUgYXMgZm9sbG93czoKLSAqIDx1bD4KLSAqIAk8bGk+PGNvZGU+Ym9vbGVhbjwvY29kZT4gPSA8Y29kZT5mYWxzZTwvY29kZT48L2xpPgotICogCTxsaT48Y29kZT5kb3VibGU8L2NvZGU+ID0gPGNvZGU+MC4wPC9jb2RlPjwvbGk+Ci0gKiAJPGxpPjxjb2RlPmZsb2F0PC9jb2RlPiA9IDxjb2RlPjAuMGY8L2NvZGU+PC9saT4KLSAqIAk8bGk+PGNvZGU+aW50PC9jb2RlPiA9IDxjb2RlPjA8L2NvZGU+PC9saT4KLSAqICA8bGk+PGNvZGU+bG9uZzwvY29kZT4gPSA8Y29kZT4wPC9jb2RlPjwvbGk+Ci0gKiAJPGxpPjxjb2RlPlN0cmluZzwvY29kZT4gPSA8Y29kZT4iIjwvY29kZT4gKHRoZSBlbXB0eSBzdHJpbmcpPC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFRodXMgYSBwcmVmZXJlbmNlIHN0b3JlIG1haW50YWlucyB0d28gdmFsdWVzIGZvciBlYWNoIG9mIGEgc2V0IG9mCi0gKiBuYW1lczogYSBjdXJyZW50IHZhbHVlIGFuZCBhIGRlZmF1bHQgdmFsdWUuCi0gKiBUaGUgdHlwaWNhbCB1c2FnZSBpcyB0byBlc3RhYmxpc2ggdGhlIGRlZmF1bHRzIGZvciBhbGwga25vd24gcHJlZmVyZW5jZXMKLSAqIGFuZCB0aGVuIHJlc3RvcmUgcHJldmlvdXNseSBzdG9yZWQgdmFsdWVzIGZvciBwcmVmZXJlbmNlcyB3aG9zZSB2YWx1ZXMgCi0gKiB3ZXJlIGRpZmZlcmVudCBmcm9tIHRoZWlyIGRlZmF1bHRzLiBBZnRlciB0aGUgY3VycmVudCB2YWx1ZXMgb2YKLSAqIHRoZSBwcmVmZXJlbmNlcyBoYXZlIGJlZW4gbW9kaWZpZWQsIGl0IGlzIGEgc2ltcGxlIG1hdHRlciB0byB3cml0ZQotICogb3V0IG9ubHkgdGhvc2UgcHJlZmVyZW5jZXMgd2hvc2UgdmFsdWVzIGFyZSBkaWZmZXJlbnQgZnJvbSB0aGVpciBkZWZhdWx0cy4KLSAqIFRoaXMgdHdvLXRpZXJlZCBhcHByb2FjaCB0byBzYXZpbmcgYW5kIHJlc3RvcmluZyBwcmVmZXJlbmNlIHNldHRpbmcKLSAqIG1pbmltaXplZCB0aGUgbnVtYmVyIG9mIHByZWZlcmVuY2VzIHRoYXQgbmVlZCB0byBiZSBwZXJzaXN0ZWQ7IGluZGVlZCwKLSAqIHRoZSBub3JtYWwgc3RhcnRpbmcgc3RhdGUgZG9lcyBub3QgcmVxdWlyZSBzdG9yaW5nIGFueSBwcmVmZXJlbmNlcwotICogYXQgYWxsLgotICogPC9wPgotICogPHA+Ci0gKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCB3aGVuZXZlciBhIHByZWZlcmVuY2VzIGN1cnJlbnQKLSAqIHZhbHVlIGFjdHVhbGx5IGNoYW5nZXMgKHdoZXRoZXIgdGhyb3VnaCA8Y29kZT5zZXRWYWx1ZTwvY29kZT4sCi0gKiA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LCBvciBvdGhlciB1bnNwZWNpZmllZCBtZWFucykuIE5vdGUsIGhvd2V2ZXIsCi0gKiB0aGF0IG1hbmlwdWxhdGluZyBkZWZhdWx0IHZhbHVlcyAod2l0aCA8Y29kZT5zZXREZWZhdWx0PC9jb2RlPikKLSAqIGRvZXMgbm90IGNhdXNlIHN1Y2ggZXZlbnRzIHRvIGJlIHJlcG9ydGVkLgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIHdobyBuZWVkIGEgcHJlZmVyZW5jZSBzdG9yZSBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIG9yIAotICogaW5zdGFudGlhdGUgdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIDxjb2RlPlByZWZlcmVuY2VTdG9yZTwvY29kZT4uCi0gKiA8L3A+Ci0gKgotICogQHNlZSBQcmVmZXJlbmNlU3RvcmUKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJlZmVyZW5jZVN0b3JlIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgZm9yIGJvb2xlYW4gcHJlZmVyZW5jZXMgKDxjb2RlPmZhbHNlPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEJPT0xFQU5fREVGQVVMVF9ERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlIGZvciBkb3VibGUgcHJlZmVyZW5jZXMgKDxjb2RlPjAuMDwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIERPVUJMRV9ERUZBVUxUX0RFRkFVTFQgPSAwLjA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlIGZvciBmbG9hdCBwcmVmZXJlbmNlcyAoPGNvZGU+MC4wZjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgRkxPQVRfREVGQVVMVF9ERUZBVUxUID0gMC4wZjsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgZm9yIGludCBwcmVmZXJlbmNlcyAoPGNvZGU+MDwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9ERUZBVUxUX0RFRkFVTFQgPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSBmb3IgbG9uZyBwcmVmZXJlbmNlcyAoPGNvZGU+MEw8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTE9OR19ERUZBVUxUX0RFRkFVTFQgPSAwTDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgZm9yIFN0cmluZyBwcmVmZXJlbmNlcyAoPGNvZGU+IiI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfREVGQVVMVF9ERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdXNlZCBmb3IgPGNvZGU+dHJ1ZTwvY29kZT4gKDxjb2RlPiJ0cnVlIjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdXNlZCBmb3IgPGNvZGU+ZmFsc2U8L2NvZGU+ICg8Y29kZT4iZmFsc2UiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBZGRzIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogPGI+Tm90ZTwvYj4gVGhlIHR5cGVzIG9mIHRoZSBvbGRWYWx1ZSBhbmQgbmV3VmFsdWUgb2YgdGhlCi0gICAgICogZ2VuZXJhdGVkIFByb3BlcnR5Q2hhbmdlRXZlbnQgYXJlIGRldGVybWluZWQgYnkgd2hldGhlcgotICAgICAqIG9yIG5vdCB0aGUgdHlwZWQgQVBJIGluIElQcmVmZXJlbmNlU3RvcmUgd2FzIGNhbGxlZC4KLSAgICAgKiBJZiB2YWx1ZXMgYXJlIGNoYW5nZWQgdmlhIHNldFZhbHVlKG5hbWUsdHlwZSkgdGhlIAotICAgICAqIHZhbHVlcyBpbiB0aGUgUHJvcGVydHlDaGFuZ2VkRXZlbnQgd2lsbCBiZSBvZiB0aGF0IHR5cGUuCi0gICAgICogSWYgdGhleSBhcmUgc2V0IHVzaW5nIGEgbm9uIHR5cGVkIEFQSSAoaS5lLiAjc2V0VG9EZWZhdWx0Ci0gICAgICogb3IgdXNpbmcgdGhlIE9TR0kgUHJlZmVyZW5jZXMpIHRoZSB2YWx1ZXMgd2lsbCBiZSB1bmNvbnZlcnRlZAotICAgICAqIFN0cmluZ3MuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEEgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIHNhbWUgVGhyZWFkCi0gICAgICogdGhhdCBpdCBpcyBpbnZva2VkIGluLiBBbnkgVGhyZWFkIGRlcGVuZGFudCBsaXN0ZW5lcnMgKHN1Y2ggYXMgCi0gICAgICogdGhvc2Ugd2hvIHVwZGF0ZSBhbiBTV1Qgd2lkZ2V0KSB3aWxsIG5lZWQgdG8gdXBkYXRlIGluIHRoZQotICAgICAqIGNvcnJlY3QgVGhyZWFkLiBJbiB0aGUgY2FzZSBvZiBhbiBTV1QgdXBkYXRlIHlvdSBjYW4gdXBkYXRlCi0gICAgICogdXNpbmcgRGlzcGxheSNzeW5jRXhlYyhSdW5uYWJsZSkgb3IgRGlzcGxheSNhc3luY0V4ZWMoUnVubmFibGUpLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4gIAotICAgICAqIExpa2V3aXNlIGFueSBhcHBsaWNhdGlvbiB0aGF0IHVwZGF0ZXMgYW4gSVByZWZlcmVuY2VTdG9yZSAKLSAgICAgKiBmcm9tIGEgVGhyZWFkIG90aGVyIHRoYW4gdGhlIFVJIFRocmVhZCBzaG91bGQgYmUgYXdhcmUgb2YKLSAgICAgKiBhbnkgbGlzdGVuZXJzIHRoYXQgcmVxdWlyZSBhbiB1cGRhdGUgaW4gdGhlIFVJIFRocmVhZC4gCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQKLSAgICAgKiBAc2VlICNzZXRUb0RlZmF1bHQoU3RyaW5nKQotICAgICAqIEBzZWUgI3NldFZhbHVlKFN0cmluZywgYm9vbGVhbikKLSAgICAgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcsIGRvdWJsZSkKLSAgICAgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcsIGZsb2F0KQotICAgICAqIEBzZWUgI3NldFZhbHVlKFN0cmluZywgaW50KQotICAgICAqIEBzZWUgI3NldFZhbHVlKFN0cmluZywgbG9uZykKLSAgICAgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcsIFN0cmluZykKLSAgICAgKiBAc2VlIG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbmFtZWQgcHJlZmVyZW5jZSBpcyBrbm93biB0byB0aGlzIHByZWZlcmVuY2UKLSAgICAgKiBzdG9yZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlaXRoZXIgYSBjdXJyZW50IHZhbHVlIG9yIGEgZGVmYXVsdAotICAgICAqICB2YWx1ZSBpcyBrbm93biBmb3IgdGhlIG5hbWVkIHByZWZlcmVuY2UsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogRmlyZXMgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgY29ycmVzcG9uZGluZyB0byBhIGNoYW5nZSB0byB0aGUKLSAgICAgKiBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgb24gdGhpcyBpbnRlcmZhY2UgdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uIAotICAgICAqIG9mIGRlY29yYXRvcnMuIFRoZXJlIGlzIG5vcm1hbGx5IG5vIG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBzaW5jZQotICAgICAqIDxjb2RlPnNldFZhbHVlPC9jb2RlPiBhbmQgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPiByZXBvcnQgc3VjaAotICAgICAqIGV2ZW50cyBpbiBkdWUgY291cnNlLiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGZ1bm5lbCBhbGwgcHJlZmVyZW5jZQotICAgICAqIGNoYW5nZXMgdGhyb3VnaCB0aGlzIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgdG8gYmUgdXNlZCBhcyB0aGUgcHJvcGVydHkKLSAgICAgKiAgaW4gdGhlIGV2ZW50IG9iamVjdAotICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgbmFtZSwgT2JqZWN0IG9sZFZhbHVlLAotICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+ZmFsc2U8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBib29sZWFuLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5mYWxzZTwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgYm9vbGVhbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldERlZmF1bHRCb29sZWFuKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBkb3VibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERlZmF1bHREb3VibGUoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjAuMGY8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGZsb2F0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldERlZmF1bHRGbG9hdChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW50ZWdlci12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYW4gaW50ZWdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEludChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wTDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgbG9uZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldERlZmF1bHRMb25nKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAodGhlIGVtcHR5IHN0cmluZyA8Y29kZT4iIjwvY29kZT4pIAotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZG91YmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wLjBmPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZmxvYXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhbiBpbnRlZ3Rlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgaW50LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnQoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wTDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGxvbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICh0aGUgZW1wdHkgc3RyaW5nIDxjb2RlPiIiPC9jb2RlPikKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIGhhcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBoYXMgYSBrbm93biBkZWZhdWx0IHZhbHVlCi0gICAgICogYW5kIGl0cyBjdXJyZW50IHZhbHVlIGlzIHRoZSBzYW1lLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqIChpbmNsdWRpbmcgdGhlIGNhc2Ugd2hlcmUgdGhlIHByZWZlcmVuY2UgaXMgdW5rbm93biB0byB0aGlzIHN0b3JlKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWVzIGluIHRoaXMgcHJvcGVydHkgc3RvcmUKLSAgICAgKiByZXF1aXJlIHNhdmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIG9mIHZhbHVlcyBvZiAKLSAgICAgKiAgdGhlIHByZWZlcmVuY2VzIGtub3duIHRvIHRoaXMgc3RvcmUgaGFzIGNoYW5nZWQgYW5kIAotICAgICAqICByZXF1aXJlcyBzYXZpbmcsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG5lZWRzU2F2aW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUgdG8KLSAgICAgKiB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlIHdpdGhvdXQgc2VuZGluZyBhIHByb3BlcnR5IGNoYW5nZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGFuZCAKLSAgICAgKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBzZXR0aW5nIGludGVybmFsIHByZWZlcmVuY2VzIAotICAgICAqIHRoYXQgYXJlIG5vdCBtZWFudCB0byBiZSBwcm9jZXNzZWQgYnkgbGlzdGVuZXJzLgotICAgICAqIE5vcm1hbCBjbGllbnRzIHNob3VsZCBpbnN0ZWFkIGNhbGwgI3NldFZhbHVlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZnJvbSB0aGlzIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICogSGFzIG5vIGFmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW50ZWdlci12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gZGVmYXVsdE9iamVjdCB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZmF1bHRPYmplY3QpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUgYmFjawotICAgICAqIHRvIGl0cyBkZWZhdWx0IHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIHRoZQotICAgICAqIGFwcHJvcHJpYXRlIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgcmVtb3ZpbmcgdGhlIG5hbWVkIHZhbHVlIGZyb20gdGhlIHN0b3JlLCAKLSAgICAgKiB0aGVyZWJ5IGV4cG9zaW5nIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9EZWZhdWx0KFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnRlZ2VyLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvSW50ZWdlckZpZWxkRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0ludGVnZXJGaWVsZEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFlYmE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvSW50ZWdlckZpZWxkRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIGZpZWxkIGVkaXRvciBmb3IgYW4gaW50ZWdlciB0eXBlIHByZWZlcmVuY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlZ2VyRmllbGRFZGl0b3IgZXh0ZW5kcyBTdHJpbmdGaWVsZEVkaXRvciB7Ci0gICAgcHJpdmF0ZSBpbnQgbWluVmFsaWRWYWx1ZSA9IDA7Ci0KLSAgICBwcml2YXRlIGludCBtYXhWYWxpZFZhbHVlID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9URVhUX0xJTUlUID0gMTA7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGludGVnZXIgZmllbGQgZWRpdG9yIAotICAgICAqLwotICAgIHByb3RlY3RlZCBJbnRlZ2VyRmllbGRFZGl0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnRlZ2VyIGZpZWxkIGVkaXRvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0aGlzIGZpZWxkIGVkaXRvciB3b3JrcyBvbgotICAgICAqIEBwYXJhbSBsYWJlbFRleHQgdGhlIGxhYmVsIHRleHQgb2YgdGhlIGZpZWxkIGVkaXRvcgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGUgZmllbGQgZWRpdG9yJ3MgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBJbnRlZ2VyRmllbGRFZGl0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBsYWJlbFRleHQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyhuYW1lLCBsYWJlbFRleHQsIHBhcmVudCwgREVGQVVMVF9URVhUX0xJTUlUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGludGVnZXIgZmllbGQgZWRpdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHRoaXMgZmllbGQgZWRpdG9yIHdvcmtzIG9uCi0gICAgICogQHBhcmFtIGxhYmVsVGV4dCB0aGUgbGFiZWwgdGV4dCBvZiB0aGUgZmllbGQgZWRpdG9yCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG9mIHRoZSBmaWVsZCBlZGl0b3IncyBjb250cm9sCi0gICAgICogQHBhcmFtIHRleHRMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgdGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZWdlckZpZWxkRWRpdG9yKFN0cmluZyBuYW1lLCBTdHJpbmcgbGFiZWxUZXh0LCBDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAgICAgaW50IHRleHRMaW1pdCkgewotICAgICAgICBpbml0KG5hbWUsIGxhYmVsVGV4dCk7Ci0gICAgICAgIHNldFRleHRMaW1pdCh0ZXh0TGltaXQpOwotICAgICAgICBzZXRFbXB0eVN0cmluZ0FsbG93ZWQoZmFsc2UpOwotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoSkZhY2VSZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJJbnRlZ2VyRmllbGRFZGl0b3IuZXJyb3JNZXNzYWdlIikpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJhbmdlIG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWluIHRoZSBtaW5pbXVtIGFsbG93ZWQgdmFsdWUgKGluY2x1c2l2ZSkKLSAgICAgKiBAcGFyYW0gbWF4IHRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgKGluY2x1c2l2ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZFJhbmdlKGludCBtaW4sIGludCBtYXgpIHsKLSAgICAgICAgbWluVmFsaWRWYWx1ZSA9IG1pbjsKLSAgICAgICAgbWF4VmFsaWRWYWx1ZSA9IG1heDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFN0cmluZ0ZpZWxkRWRpdG9yLgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBlbnRlcmVkIFN0cmluZyBpcyBhIHZhbGlkIGludGVnZXIgb3Igbm90LgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrU3RhdGUoKSB7Ci0KLSAgICAgICAgVGV4dCB0ZXh0ID0gZ2V0VGV4dENvbnRyb2woKTsKLQotICAgICAgICBpZiAodGV4dCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFN0cmluZyBudW1iZXJTdHJpbmcgPSB0ZXh0LmdldFRleHQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBudW1iZXIgPSBJbnRlZ2VyLnZhbHVlT2YobnVtYmVyU3RyaW5nKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKG51bWJlciA+PSBtaW5WYWxpZFZhbHVlICYmIG51bWJlciA8PSBtYXhWYWxpZFZhbHVlKSB7Ci0JCQkJY2xlYXJFcnJvck1lc3NhZ2UoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLSAgICAgICAgICAgIAotCQkJc2hvd0Vycm9yTWVzc2FnZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgc2hvd0Vycm9yTWVzc2FnZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKCkgewotICAgICAgICBUZXh0IHRleHQgPSBnZXRUZXh0Q29udHJvbCgpOwotICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgdmFsdWUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoZ2V0UHJlZmVyZW5jZU5hbWUoKSk7Ci0gICAgICAgICAgICB0ZXh0LnNldFRleHQoIiIgKyB2YWx1ZSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvTG9hZERlZmF1bHQoKSB7Ci0gICAgICAgIFRleHQgdGV4dCA9IGdldFRleHRDb250cm9sKCk7Ci0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCB2YWx1ZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRJbnQoZ2V0UHJlZmVyZW5jZU5hbWUoKSk7Ci0gICAgICAgICAgICB0ZXh0LnNldFRleHQoIiIgKyB2YWx1ZSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHZhbHVlQ2hhbmdlZCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TdG9yZSgpIHsKLSAgICAgICAgVGV4dCB0ZXh0ID0gZ2V0VGV4dENvbnRyb2woKTsKLSAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgSW50ZWdlciBpID0gbmV3IEludGVnZXIodGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoZ2V0UHJlZmVyZW5jZU5hbWUoKSwgaS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCBlZGl0b3IncyBjdXJyZW50IHZhbHVlIGFzIGFuIGludGVnZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQotICAgICAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGRvZXMgbm90Ci0gICAgICogICBjb250YWluIGEgcGFyc2FibGUgaW50ZWdlcgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW50VmFsdWUoKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFN0cmluZ1ZhbHVlKCkpLmludFZhbHVlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9KRmFjZVByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0pGYWNlUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxYjIxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL0pGYWNlUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlOwotCi0vKioKLSAqIAotICogSkZhY2VQcmVmZXJlbmNlcyBpcyBhIGNsYXNzIHVzZWQgdG8gYWRtaW5pc3RlciB0aGUgcHJlZmVyZW5jZXMKLSAqIHVzZWQgYnkgSkZhY2Ugb2JqZWN0cy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpGYWNlUHJlZmVyZW5jZXMgewotCi0gICAgLyoqCi0gICAgICogSWRlbnRpZmllciBmb3IgdGhlIEVycm9yIENvbG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfQ09MT1IgPSAiRVJST1JfQ09MT1IiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBJZGVudGlmaWVyIGZvciB0aGUgSHlwZXJsaW5rIENvbG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFlQRVJMSU5LX0NPTE9SID0gIkhZUEVSTElOS19DT0xPUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIElkZW50aWZpZXIgZm9yIHRoZSBBY3RpdmUgSHlwZXJsaW5rIENvbG91cgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWRV9IWVBFUkxJTktfQ09MT1IgPSAiQUNUSVZFX0hZUEVSTElOS19DT0xPUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIElQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlOwotCi0gICAgLyoqCi0gICAgICogUHJldmVudCBjb25zdHJ1Y3Rpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBKRmFjZVByZWZlcmVuY2VzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBmb3IgdGhlIHJlY2VpdmVyLgotICAgICAqIEByZXR1cm4gSVByZWZlcmVuY2VTdG9yZSBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLSAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VTdG9yZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHRoZSByZWNlaXZlci4KLSAgICAgKiBAcGFyYW0gc3RvcmUgSVByZWZlcmVuY2VTdG9yZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcmVmZXJlbmNlU3RvcmUoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotICAgICAgICBwcmVmZXJlbmNlU3RvcmUgPSBzdG9yZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvTGlzdEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9MaXN0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMDMyMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9MaXN0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBmaWVsZCBlZGl0b3IgdGhhdCBtYW5hZ2VzIGEgbGlzdCBvZiBpbnB1dCB2YWx1ZXMuIAotICogVGhlIGVkaXRvciBkaXNwbGF5cyBhIGxpc3QgY29udGFpbmluZyB0aGUgdmFsdWVzLCBidXR0b25zIGZvcgotICogYWRkaW5nIGFuZCByZW1vdmluZyB2YWx1ZXMsIGFuZCBVcCBhbmQgRG93biBidXR0b25zIHRvIGFkanVzdAotICogdGhlIG9yZGVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSA8Y29kZT5wYXJzZVN0cmluZzwvY29kZT4sCi0gKiA8Y29kZT5jcmVhdGVMaXN0PC9jb2RlPiwgYW5kIDxjb2RlPmdldE5ld0lucHV0T2JqZWN0PC9jb2RlPgotICogZnJhbWV3b3JrIG1ldGhvZHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0RWRpdG9yIGV4dGVuZHMgRmllbGRFZGl0b3IgewotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3Qgd2lkZ2V0OyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogKGJlZm9yZSBjcmVhdGlvbiBvciBhZnRlciBkaXNwb3NhbCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGxpc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYnV0dG9uIGJveCBjb250YWluaW5nIHRoZSBBZGQsIFJlbW92ZSwgVXAsIGFuZCBEb3duIGJ1dHRvbnM7Ci0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSAoYmVmb3JlIGNyZWF0aW9uIG9yIGFmdGVyIGRpc3Bvc2FsKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBidXR0b25Cb3g7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQWRkIGJ1dHRvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgUmVtb3ZlIGJ1dHRvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgVXAgYnV0dG9uLgotICAgICAqLwotICAgIHByaXZhdGUgQnV0dG9uIHVwQnV0dG9uOwotCi0gICAgLyoqCi0gICAgICogVGhlIERvd24gYnV0dG9uLgotICAgICAqLwotICAgIHByaXZhdGUgQnV0dG9uIGRvd25CdXR0b247Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc2VsZWN0aW9uIGxpc3RlbmVyLgotICAgICAqLwotICAgIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGxpc3QgZmllbGQgZWRpdG9yIAotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0RWRpdG9yKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBsaXN0IGZpZWxkIGVkaXRvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0aGlzIGZpZWxkIGVkaXRvciB3b3JrcyBvbgotICAgICAqIEBwYXJhbSBsYWJlbFRleHQgdGhlIGxhYmVsIHRleHQgb2YgdGhlIGZpZWxkIGVkaXRvcgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGUgZmllbGQgZWRpdG9yJ3MgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0RWRpdG9yKFN0cmluZyBuYW1lLCBTdHJpbmcgbGFiZWxUZXh0LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGluaXQobmFtZSwgbGFiZWxUZXh0KTsKLSAgICAgICAgY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoYXQgdGhlIEFkZCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJlc3NlZCgpIHsKLSAgICAgICAgc2V0UHJlc2VudHNEZWZhdWx0VmFsdWUoZmFsc2UpOwotICAgICAgICBTdHJpbmcgaW5wdXQgPSBnZXROZXdJbnB1dE9iamVjdCgpOwotCi0gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChpbnB1dCwgaW5kZXggKyAxKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChpbnB1dCwgMCk7Ci0gICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkanVzdEZvck51bUNvbHVtbnMoaW50IG51bUNvbHVtbnMpIHsKLSAgICAgICAgQ29udHJvbCBjb250cm9sID0gZ2V0TGFiZWxDb250cm9sKCk7Ci0gICAgICAgICgoR3JpZERhdGEpIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHVtbnM7Ci0gICAgICAgICgoR3JpZERhdGEpIGxpc3QuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHVtbnMgLSAxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIEFkZCwgUmVtb3ZlLCBVcCwgYW5kIERvd24gYnV0dG9uIGluIHRoZSBnaXZlbiBidXR0b24gYm94LgotICAgICAqCi0gICAgICogQHBhcmFtIGJveCB0aGUgYm94IGZvciB0aGUgYnV0dG9ucwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBib3gpIHsKLSAgICAgICAgYWRkQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihib3gsICJMaXN0RWRpdG9yLmFkZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVtb3ZlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihib3gsICJMaXN0RWRpdG9yLnJlbW92ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXBCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGJveCwgIkxpc3RFZGl0b3IudXAiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGRvd25CdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGJveCwgIkxpc3RFZGl0b3IuZG93biIpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21iaW5lcyB0aGUgZ2l2ZW4gbGlzdCBvZiBpdGVtcyBpbnRvIGEgc2luZ2xlIHN0cmluZy4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgY29udmVyc2Ugb2YgPGNvZGU+cGFyc2VTdHJpbmc8L2NvZGU+LiAKLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtcyB0aGUgbGlzdCBvZiBpdGVtcwotICAgICAqIEByZXR1cm4gdGhlIGNvbWJpbmVkIHN0cmluZwotICAgICAqIEBzZWUgI3BhcnNlU3RyaW5nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBjcmVhdGVMaXN0KFN0cmluZ1tdIGl0ZW1zKTsKLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gY3JlYXRlIGEgcHVzaCBidXR0b24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSByZXNvdXJjZSBuYW1lIHVzZWQgdG8gc3VwcGx5IHRoZSBidXR0b24ncyBsYWJlbCB0ZXh0Ci0gICAgICogQHJldHVybiBCdXR0b24KLSAgICAgKi8KLSAgICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRUZXh0KEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZyhrZXkpKTsKLSAgICAgICAgYnV0dG9uLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgaW50IHdpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGJ1dHRvbiwKLSAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0gICAgICAgICAgICAgICAgU1dULkRFRkFVTFQsIHRydWUpLngpOwotICAgICAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotICAgICAgICByZXR1cm4gYnV0dG9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzZWxlY3Rpb24gbGlzdGVuZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFdpZGdldCB3aWRnZXQgPSBldmVudC53aWRnZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKHdpZGdldCA9PSBhZGRCdXR0b24pIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUHJlc3NlZCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkZ2V0ID09IHJlbW92ZUJ1dHRvbikgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVQcmVzc2VkKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aWRnZXQgPT0gdXBCdXR0b24pIHsKLSAgICAgICAgICAgICAgICAgICAgdXBQcmVzc2VkKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aWRnZXQgPT0gZG93bkJ1dHRvbikgewotICAgICAgICAgICAgICAgICAgICBkb3duUHJlc3NlZCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkZ2V0ID09IGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRmlsbEludG9HcmlkKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0gICAgICAgIENvbnRyb2wgY29udHJvbCA9IGdldExhYmVsQ29udHJvbChwYXJlbnQpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHVtbnM7Ci0gICAgICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAgICAgbGlzdCA9IGdldExpc3RDb250cm9sKHBhcmVudCk7Ci0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zIC0gMTsKLSAgICAgICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIGxpc3Quc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAgICAgYnV0dG9uQm94ID0gZ2V0QnV0dG9uQm94Q29udHJvbChwYXJlbnQpOwotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLSAgICAgICAgYnV0dG9uQm94LnNldExheW91dERhdGEoZ2QpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKCkgewotICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhnZXRQcmVmZXJlbmNlTmFtZSgpKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGFycmF5ID0gcGFyc2VTdHJpbmcocyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoYXJyYXlbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0xvYWREZWZhdWx0KCkgewotICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaXN0LnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgU3RyaW5nIHMgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBnZXRQcmVmZXJlbmNlTmFtZSgpKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGFycmF5ID0gcGFyc2VTdHJpbmcocyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoYXJyYXlbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1N0b3JlKCkgewotICAgICAgICBTdHJpbmcgcyA9IGNyZWF0ZUxpc3QobGlzdC5nZXRJdGVtcygpKTsKLSAgICAgICAgaWYgKHMgIT0gbnVsbCkKLSAgICAgICAgICAgIGdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKGdldFByZWZlcmVuY2VOYW1lKCksIHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoYXQgdGhlIERvd24gYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRvd25QcmVzc2VkKCkgewotICAgICAgICBzd2FwKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgZmllbGQgZWRpdG9yJ3MgYnV0dG9uIGJveCBjb250YWluaW5nIHRoZSBBZGQsIFJlbW92ZSwKLSAgICAgKiBVcCwgYW5kIERvd24gYnV0dG9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKiBAcmV0dXJuIHRoZSBidXR0b24gYm94Ci0gICAgICovCi0gICAgcHVibGljIENvbXBvc2l0ZSBnZXRCdXR0b25Cb3hDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaWYgKGJ1dHRvbkJveCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBidXR0b25Cb3ggPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgICAgIGJ1dHRvbkJveC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgICAgIGNyZWF0ZUJ1dHRvbnMoYnV0dG9uQm94KTsKLSAgICAgICAgICAgIGJ1dHRvbkJveC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQnV0dG9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQnV0dG9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdXBCdXR0b24gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBkb3duQnV0dG9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uQm94ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hlY2tQYXJlbnQoYnV0dG9uQm94LCBwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCgpOwotICAgICAgICByZXR1cm4gYnV0dG9uQm94OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCBlZGl0b3IncyBsaXN0IGNvbnRyb2wuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqIEByZXR1cm4gdGhlIGxpc3QgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldExpc3RDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwKLSAgICAgICAgICAgICAgICAgICAgfCBTV1QuSF9TQ1JPTEwpOwotICAgICAgICAgICAgbGlzdC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICAgICAgbGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLSAgICAgICAgICAgIGxpc3QuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hlY2tQYXJlbnQobGlzdCwgcGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGl0ZW0gZm9yIHRoZSBsaXN0LgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBhIG5ldyBpdGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXROZXdJbnB1dE9iamVjdCgpOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mQ29udHJvbHMoKSB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCBlZGl0b3IncyBzZWxlY3Rpb24gbGlzdGVuZXIuCi0gICAgICogVGhlIGxpc3RlbmVyIGlzIGNyZWF0ZWQgaWYgbmVzc2Vzc2FyeS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbiBsaXN0ZW5lcgotICAgICAqLwotICAgIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsKQotICAgICAgICAgICAgY3JlYXRlU2VsZWN0aW9uTGlzdGVuZXIoKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGlvbkxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCBlZGl0b3IncyBzaGVsbC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnRlcm5hbCB0byB0aGUgZnJhbWV3b3JrOyBzdWJjbGFzc2VycyBzaG91bGQgbm90IGNhbGwKLSAgICAgKiB0aGlzIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgaWYgKGFkZEJ1dHRvbiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBhZGRCdXR0b24uZ2V0U2hlbGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGxpdHMgdGhlIGdpdmVuIHN0cmluZyBpbnRvIGEgbGlzdCBvZiBzdHJpbmdzLgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBjb252ZXJzZSBvZiA8Y29kZT5jcmVhdGVMaXN0PC9jb2RlPi4gCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nTGlzdCB0aGUgc3RyaW5nCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+Ci0gICAgICogQHNlZSAjY3JlYXRlTGlzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBwYXJzZVN0cmluZyhTdHJpbmcgc3RyaW5nTGlzdCk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGF0IHRoZSBSZW1vdmUgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVByZXNzZWQoKSB7Ci0gICAgICAgIHNldFByZXNlbnRzRGVmYXVsdFZhbHVlKGZhbHNlKTsKLSAgICAgICAgaW50IGluZGV4ID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgbGlzdC5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCB0aGUgbGlzdCBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBpbnQgc2l6ZSA9IGxpc3QuZ2V0SXRlbUNvdW50KCk7Ci0KLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoaW5kZXggPj0gMCk7Ci0gICAgICAgIHVwQnV0dG9uLnNldEVuYWJsZWQoc2l6ZSA+IDEgJiYgaW5kZXggPiAwKTsKLSAgICAgICAgZG93bkJ1dHRvbi5zZXRFbmFibGVkKHNpemUgPiAxICYmIGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplIC0gMSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgbGlzdC5zZXRGb2N1cygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIHVwIG9yIGRvd24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZW0gc2hvdWxkIG1vdmUgdXAsCi0gICAgICogIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgc2hvdWxkIG1vdmUgZG93bgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzd2FwKGJvb2xlYW4gdXApIHsKLSAgICAgICAgc2V0UHJlc2VudHNEZWZhdWx0VmFsdWUoZmFsc2UpOwotICAgICAgICBpbnQgaW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGludCB0YXJnZXQgPSB1cCA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTsKLQotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uID0gbGlzdC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUoc2VsZWN0aW9uLmxlbmd0aCA9PSAxKTsKLSAgICAgICAgICAgIGxpc3QucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIGxpc3QuYWRkKHNlbGVjdGlvblswXSwgdGFyZ2V0KTsKLSAgICAgICAgICAgIGxpc3Quc2V0U2VsZWN0aW9uKHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoYXQgdGhlIFVwIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cFByZXNzZWQoKSB7Ci0gICAgICAgIHN3YXAodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIEZpZWxkRWRpdG9yLnNldEVuYWJsZWQoYm9vbGVhbixDb21wb3NpdGUpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCwgcGFyZW50KTsKLSAgICAgICAgZ2V0TGlzdENvbnRyb2wocGFyZW50KS5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICBhZGRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIHVwQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIGRvd25CdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1BhdGhFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUGF0aEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjA3ZGI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUGF0aEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci0KLS8qKgotICogQSBmaWVsZCBlZGl0b3IgdG8gZWRpdCBkaXJlY3RvcnkgcGF0aHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoRWRpdG9yIGV4dGVuZHMgTGlzdEVkaXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGFzdCBwYXRoLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxhc3RQYXRoOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNwZWNpYWwgbGFiZWwgdGV4dCBmb3IgZGlyZWN0b3J5IGNob29zZXIsIAotICAgICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGlyQ2hvb3NlckxhYmVsVGV4dDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcGF0aCBmaWVsZCBlZGl0b3IgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBhdGhFZGl0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHBhdGggZmllbGQgZWRpdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHRoaXMgZmllbGQgZWRpdG9yIHdvcmtzIG9uCi0gICAgICogQHBhcmFtIGxhYmVsVGV4dCB0aGUgbGFiZWwgdGV4dCBvZiB0aGUgZmllbGQgZWRpdG9yCi0gICAgICogQHBhcmFtIGRpckNob29zZXJMYWJlbFRleHQgdGhlIGxhYmVsIHRleHQgZGlzcGxheWVkIGZvciB0aGUgZGlyZWN0b3J5IGNob29zZXIKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhlIGZpZWxkIGVkaXRvcidzIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsVGV4dCwKLSAgICAgICAgICAgIFN0cmluZyBkaXJDaG9vc2VyTGFiZWxUZXh0LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGluaXQobmFtZSwgbGFiZWxUZXh0KTsKLSAgICAgICAgdGhpcy5kaXJDaG9vc2VyTGFiZWxUZXh0ID0gZGlyQ2hvb3NlckxhYmVsVGV4dDsKLSAgICAgICAgY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gTGlzdEVkaXRvci4KLSAgICAgKiBDcmVhdGVzIGEgc2luZ2xlIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBhcnJheSBieSBzZXBhcmF0aW5nIGVhY2gKLSAgICAgKiBzdHJpbmcgd2l0aCB0aGUgYXBwcm9wcmlhdGUgT1Mtc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVMaXN0KFN0cmluZ1tdIGl0ZW1zKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7Ly8kTk9OLU5MUy0xJAotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHBhdGguYXBwZW5kKGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIHBhdGguYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIExpc3RFZGl0b3IuCi0gICAgICogQ3JlYXRlcyBhIG5ldyBwYXRoIGVsZW1lbnQgYnkgbWVhbnMgb2YgYSBkaXJlY3RvcnkgZGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3SW5wdXRPYmplY3QoKSB7Ci0KLSAgICAgICAgRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGlmIChkaXJDaG9vc2VyTGFiZWxUZXh0ICE9IG51bGwpCi0gICAgICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShkaXJDaG9vc2VyTGFiZWxUZXh0KTsKLSAgICAgICAgaWYgKGxhc3RQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChuZXcgRmlsZShsYXN0UGF0aCkuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgZGlhbG9nLnNldEZpbHRlclBhdGgobGFzdFBhdGgpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBkaXIgPSBkaWFsb2cub3BlbigpOwotICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRpciA9IGRpci50cmltKCk7Ci0gICAgICAgICAgICBpZiAoZGlyLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBsYXN0UGF0aCA9IGRpcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gTGlzdEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gcGFyc2VTdHJpbmcoU3RyaW5nIHN0cmluZ0xpc3QpIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmdMaXN0LCBGaWxlLnBhdGhTZXBhcmF0b3IKLSAgICAgICAgICAgICAgICArICJcblxyIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBBcnJheUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICB2LmFkZChzdC5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSB2LnRvQXJyYXkobmV3IFN0cmluZ1t2LnNpemUoKV0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZGVhOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFByb3ZpZGVzIGEgdHJlZSBtb2RlbCBmb3IgPGNvZGU+UHJlZmVyZW5jZU1hbmFnZXI8L2NvZGU+IGNvbnRlbnQuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIFByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgbWFuYWdlciA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgcGFyZW50IG9mIHRoZSBwcm92aWRlZCBub2RlLiAgV2lsbCBzZWFyY2ggcmVjdXJzaXZseSB0aHJvdWdoIHRoZQotICAgICAqIHByZWZlcmVuY2UgdHJlZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwb3NzaWJsZSBwYXJlbnQgbm9kZS4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgY2hpbGQgbm9kZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgY2hpbGQgbm9kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElQcmVmZXJlbmNlTm9kZSBmaW5kUGFyZW50KElQcmVmZXJlbmNlTm9kZSBwYXJlbnQsCi0gICAgICAgICAgICBJUHJlZmVyZW5jZU5vZGUgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChwYXJlbnQuZ2V0SWQoKS5lcXVhbHModGFyZ2V0LmdldElkKCkpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgSVByZWZlcmVuY2VOb2RlIGZvdW5kID0gcGFyZW50LmZpbmRTdWJOb2RlKHRhcmdldC5nZXRJZCgpKTsKLSAgICAgICAgaWYgKGZvdW5kICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyZW50OwotCi0gICAgICAgIElQcmVmZXJlbmNlTm9kZVtdIGNoaWxkcmVuID0gcGFyZW50LmdldFN1Yk5vZGVzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZm91bmQgPSBmaW5kUGFyZW50KGNoaWxkcmVuW2ldLCB0YXJnZXQpOwotICAgICAgICAgICAgaWYgKGZvdW5kICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgey8vbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JUHJlZmVyZW5jZU5vZGU8L2NvZGU+LgotICAgICAgICByZXR1cm4gKChJUHJlZmVyZW5jZU5vZGUpIHBhcmVudEVsZW1lbnQpLmdldFN1Yk5vZGVzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ly8gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiA8Y29kZT5QcmVmZXJlbmNlTWFuYWdlcjwvY29kZT4uCi0gICAgICAgIHJldHVybiBnZXRDaGlsZHJlbigoKFByZWZlcmVuY2VNYW5hZ2VyKSBpbnB1dEVsZW1lbnQpLmdldFJvb3QoKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgey8vbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JUHJlZmVyZW5jZU5vZGU8L2NvZGU+LgotICAgICAgICBJUHJlZmVyZW5jZU5vZGUgdGFyZ2V0Tm9kZSA9IChJUHJlZmVyZW5jZU5vZGUpIGVsZW1lbnQ7Ci0gICAgICAgIElQcmVmZXJlbmNlTm9kZSByb290ID0gbWFuYWdlci5nZXRSb290KCk7Ci0gICAgICAgIHJldHVybiBmaW5kUGFyZW50KHJvb3QsIHRhcmdldE5vZGUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICBtYW5hZ2VyID0gKFByZWZlcmVuY2VNYW5hZ2VyKSBuZXdJbnB1dDsKLSAgICB9Ci0JLyoqCi0JICogU2V0IHRoZSBtYW5hZ2VyIGZvciB0aGUgcHJlZmVyZW5jZXMuCi0JICogQHBhcmFtIG1hbmFnZXIgVGhlIG1hbmFnZXIgdG8gc2V0LgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKFByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VDb252ZXJ0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQwMmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgZm9yIGRlYWxpbmcgd2l0aCBwcmVmZXJlbmNlcyB3aG9zZSB2YWx1ZXMgYXJlCi0gKiBjb21tb24gU1dUIG9iamVjdHMgKGNvbG9yLCBwb2ludHMsIHJlY3RhbmdsZXMsIGFuZCBmb250IGRhdGEpLgotICogVGhlIHN0YXRpYyBtZXRob2RzIG9uIHRoaXMgY2xhc3MgaGFuZGxlIHRoZSBjb252ZXJzaW9uIGJldHdlZW4KLSAqIHRoZSBTV1Qgb2JqZWN0cyBhbmQgdGhlaXIgc3RyaW5nIHJlcHJlc2VudGF0aW9ucy4KLSAqIDxwPgotICogVXNhZ2U6Ci0gKiA8cHJlPgotICogSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IC4uLjsKLSAqIFByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0VmFsdWUoc3RvcmUsICJiZyIsIG5ldyBSR0IoMTI3LDEyNywxMjcpKTsKLSAqIC4uLgotICogUkJHIGJnQ29sb3IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldFZhbHVlKHN0b3JlLCAiYmciKTsKLSAqIDwvcHJlPgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHN0YXRpYyBtZXRob2RzIGFuZCBmaWVsZHMgb25seSBhbmQgY2Fubm90IAotICogYmUgaW5zdGFudGlhdGVkLgotICogPC9wPgotICogTm90ZTogdG91Y2hpbmcgdGhpcyBjbGFzcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIGEgZGlzcGxheSAoc3RhdGljIGluaXRpYWxpemVyKS4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VDb252ZXJ0ZXIgewotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSBmb3IgcG9pbnQgcHJlZmVyZW5jZXMKLSAgICAgKiAodGhlIG9yaWdpbiwgPGNvZGU+KDAsMCk8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBvaW50IFBPSU5UX0RFRkFVTFRfREVGQVVMVCA9IG5ldyBQb2ludCgwLCAwKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgZm9yIHJlY3RhbmdsZSBwcmVmZXJlbmNlcwotICAgICAqICh0aGUgZW1wdHkgcmVjdGFuZ2xlIDxjb2RlPigwLDAsMCwwKTwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmVjdGFuZ2xlIFJFQ1RBTkdMRV9ERUZBVUxUX0RFRkFVTFQgPSBuZXcgUmVjdGFuZ2xlKDAsCi0gICAgICAgICAgICAwLCAwLCAwKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgZm9yIGNvbG9yIHByZWZlcmVuY2VzIAotICAgICAqIChibGFjaywgPGNvZGU+UkdCKDAsMCwwKTwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUkdCIENPTE9SX0RFRkFVTFRfREVGQVVMVCA9IG5ldyBSR0IoMCwgMCwgMCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5UUllfU0VQQVJBVE9SID0gIjsiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlIGZvciA8Y29kZT5Gb250RGF0YVtdPC9jb2RlPiBwcmVmZXJlbmNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnREYXRhW10gRk9OVERBVEFfQVJSQVlfREVGQVVMVF9ERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSBmb3IgPGNvZGU+Rm9udERhdGE8L2NvZGU+IHByZWZlcmVuY2VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRm9udERhdGEgRk9OVERBVEFfREVGQVVMVF9ERUZBVUxUOwotICAgIHN0YXRpYyB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKSAKLQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQgKCk7Ci0JCQotICAgICAgICBGT05UREFUQV9BUlJBWV9ERUZBVUxUX0RFRkFVTFQgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKS5nZXRGb250RGF0YSgpOwotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSBmb3IgPGNvZGU+Rm9udERhdGE8L2NvZGU+IHByZWZlcmVuY2VzLgotICAgICAgICAgKiBUaGlzIGlzIGxlZnQgaW4gZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQKLSAgICAgICAgICogRk9OVERBVEFfQVJSQVlfREVGQVVMVF9ERUZBVUxUIGlzIGFjdHVhbGx5IHVzZWQuCi0gICAgICAgICAqLwotCi0gICAgICAgIEZPTlREQVRBX0RFRkFVTFRfREVGQVVMVCA9IEZPTlREQVRBX0FSUkFZX0RFRkFVTFRfREVGQVVMVFswXTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogcHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluc3RhbnRpYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcmVmZXJlbmNlQ29udmVydGVyKCkgewotICAgICAgICAvL25vLW9wCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBjb25zdHJ1Y3QgYSBjb2xvciBmcm9tIHRoZSBnaXZlbiBzdHJpbmcuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBpbmRlbnRpZmllciBmb3IgdGhlIGNvbG9yCi0gICAgICogQHJldHVybiBSR0IKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBSR0IgYmFzaWNHZXRDb2xvcihTdHJpbmcgdmFsdWUpIHsKLQotICAgICAgICBpZiAoSVByZWZlcmVuY2VTdG9yZS5TVFJJTkdfREVGQVVMVF9ERUZBVUxULmVxdWFscyh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gQ09MT1JfREVGQVVMVF9ERUZBVUxUOwotCi0gICAgICAgIFJHQiBjb2xvciA9IFN0cmluZ0NvbnZlcnRlci5hc1JHQih2YWx1ZSwgbnVsbCk7Ci0gICAgICAgIGlmIChjb2xvciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIENPTE9SX0RFRkFVTFRfREVGQVVMVDsKLSAgICAgICAgcmV0dXJuIGNvbG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gY29uc3RydWN0IGEgPGNvZGU+Rm9udERhdGE8L2NvZGU+IGZyb20gdGhlIGdpdmVuIHN0cmluZy4KLSAgICAgKiBTdHJpbmcgaXMgaW4gdGhlIGZvcm0gRm9udERhdGE7Rm9udERhdGE7IGluIG9yZGVyIHRoYXQKLSAgICAgKiBtdWx0aXBsZSBGb250RGF0YXMgY2FuIGJlIGRlZmluZWQuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgZm9udAotICAgICAqIEByZXR1cm4gRm9udERhdGFbXQotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZvbnREYXRhW10gYmFzaWNHZXRGb250RGF0YShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKElQcmVmZXJlbmNlU3RvcmUuU1RSSU5HX0RFRkFVTFRfREVGQVVMVC5lcXVhbHModmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIEZPTlREQVRBX0FSUkFZX0RFRkFVTFRfREVGQVVMVDsKLQotICAgICAgICAvL1JlYWQgaW4gYWxsIG9mIHRoZW0gdG8gZ2V0IHRoZSB2YWx1ZQotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgRU5UUllfU0VQQVJBVE9SKTsKLSAgICAgICAgaW50IG51bVRva2VucyA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotICAgICAgICBGb250RGF0YVtdIGZvbnREYXRhID0gbmV3IEZvbnREYXRhW251bVRva2Vuc107Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Ub2tlbnM7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb250RGF0YVtpXSA9IG5ldyBGb250RGF0YSh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1dURXhjZXB0aW9uIGVycm9yKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZPTlREQVRBX0FSUkFZX0RFRkFVTFRfREVGQVVMVDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlcnJvcikgewotICAgICAgICAgICAgICAgIHJldHVybiBGT05UREFUQV9BUlJBWV9ERUZBVUxUX0RFRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZvbnREYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBzdXBwbGllZCBzdHJpbmcgYW5kIHJldHVybnMgaXRzIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBGb250RGF0YS4gSWYgaXQgY2Fubm90IGJlIHJlYWQgdGhlbiB0aGUgZGVmYXVsdCBGb250RGF0YQotICAgICAqIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZvbnREYXRhVmFsdWUgdGhlIHN0cmluZyB2YWx1ZSBmb3IgdGhlIGZvbnQgZGF0YSAgCi0gICAgICogQHJldHVybiB0aGUgZm9udCBkYXRhCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGb250RGF0YVtdIHJlYWRGb250RGF0YShTdHJpbmcgZm9udERhdGFWYWx1ZSkgewotICAgICAgICByZXR1cm4gYmFzaWNHZXRGb250RGF0YShmb250RGF0YVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNvbnN0cnVjdCBhIHBvaW50IGZyb20gdGhlIGdpdmVuIHN0cmluZy4KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIFBvaW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUG9pbnQgYmFzaWNHZXRQb2ludChTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgUG9pbnQgZHAgPSBuZXcgUG9pbnQoUE9JTlRfREVGQVVMVF9ERUZBVUxULngsIFBPSU5UX0RFRkFVTFRfREVGQVVMVC55KTsKLSAgICAgICAgaWYgKElQcmVmZXJlbmNlU3RvcmUuU1RSSU5HX0RFRkFVTFRfREVGQVVMVC5lcXVhbHModmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGRwOwotICAgICAgICByZXR1cm4gU3RyaW5nQ29udmVydGVyLmFzUG9pbnQodmFsdWUsIGRwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSGVscGVyIG1ldGhvZCB0byBjb25zdHJ1Y3QgYSByZWN0YW5nbGUgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gUmVjdGFuZ2xlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVjdGFuZ2xlIGJhc2ljR2V0UmVjdGFuZ2xlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICAvLyBXZSBjYW4ndCBqdXN0IHJldHVybiBSRUNUQU5HTEVfREVGQVVMVF9ERUZBVUxUIGJlY2F1c2UKLSAgICAgICAgLy8gYSByZWN0YW5nbGUgb2JqZWN0IGRvZXNuJ3QgaGF2ZSB2YWx1ZSBzZW1hbnRpay4KLSAgICAgICAgUmVjdGFuZ2xlIGRyID0gbmV3IFJlY3RhbmdsZShSRUNUQU5HTEVfREVGQVVMVF9ERUZBVUxULngsCi0gICAgICAgICAgICAgICAgUkVDVEFOR0xFX0RFRkFVTFRfREVGQVVMVC55LCBSRUNUQU5HTEVfREVGQVVMVF9ERUZBVUxULndpZHRoLAotICAgICAgICAgICAgICAgIFJFQ1RBTkdMRV9ERUZBVUxUX0RFRkFVTFQuaGVpZ2h0KTsKLQotICAgICAgICBpZiAoSVByZWZlcmVuY2VTdG9yZS5TVFJJTkdfREVGQVVMVF9ERUZBVUxULmVxdWFscyh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZHI7Ci0gICAgICAgIHJldHVybiBTdHJpbmdDb252ZXJ0ZXIuYXNSZWN0YW5nbGUodmFsdWUsIGRyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb2xvci12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUgaW4gdGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5DT0xPUl9ERUZBVUxUX0RFRkFVTFQ8L2NvZGU+KSAKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgY29sb3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGNvbG9yLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSR0IgZ2V0Q29sb3IoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0Q29sb3Ioc3RvcmUuZ2V0U3RyaW5nKG5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgY29sb3ItdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+Q09MT1JfREVGQVVMVF9ERUZBVUxUPC9jb2RlPikgCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgY29sb3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJHQiBnZXREZWZhdWx0Q29sb3IoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0Q29sb3Ioc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhuYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBhcnJheSBmb3IgdGhlIGZvbnQtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+Rk9OVERBVEFfQVJSQVlfREVGQVVMVF9ERUZBVUxUPC9jb2RlPikgCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGZvbnQgZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgcHJlZmVyZW5jZSBzdG9yZQotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9udERhdGFbXSBnZXREZWZhdWx0Rm9udERhdGFBcnJheShJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLAotICAgICAgICAgICAgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0Rm9udERhdGEoc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhuYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNpbmdsZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZm9udC12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5GT05UREFUQV9ERUZBVUxUX0RFRkFVTFQ8L2NvZGU+KSAKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgZm9udCBkYXRhLgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaXMKLSAgICAgKiByZWNvbW1lbmRlZCB0aGF0IDxjb2RlPmdldERlZmF1bHRGb250RGF0YUFycmF5PC9jb2RlPiBpcwotICAgICAqIHVzZWQgaW5zdGVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgcHJlZmVyZW5jZSBzdG9yZQotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9udERhdGEgZ2V0RGVmYXVsdEZvbnREYXRhKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEZvbnREYXRhQXJyYXkoc3RvcmUsIG5hbWUpWzBdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwb2ludC12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5QT0lOVF9ERUZBVUxUX0RFRkFVTFQ8L2NvZGU+KSAKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBwb2ludC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgcHJlZmVyZW5jZSBzdG9yZQotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUG9pbnQgZ2V0RGVmYXVsdFBvaW50KElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldFBvaW50KHN0b3JlLmdldERlZmF1bHRTdHJpbmcobmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSByZWN0YW5nbGUtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+UkVDVEFOR0xFX0RFRkFVTFRfREVGQVVMVDwvY29kZT4pIAotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIHJlY3RhbmdsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgcHJlZmVyZW5jZSBzdG9yZQotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVjdGFuZ2xlIGdldERlZmF1bHRSZWN0YW5nbGUoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwKLSAgICAgICAgICAgIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldFJlY3RhbmdsZShzdG9yZS5nZXREZWZhdWx0U3RyaW5nKG5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmb250LXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPkZPTlREQVRBX0FSUkFZX0RFRkFVTFRfREVGQVVMVDwvY29kZT4pIAotICAgICAqIGlmIHRoZXJlIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgZm9udCBkYXRhLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0b3JlIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBmb250LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGb250RGF0YVtdIGdldEZvbnREYXRhQXJyYXkoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwKLSAgICAgICAgICAgIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEZvbnREYXRhKHN0b3JlLmdldFN0cmluZyhuYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmlyc3QgZW50cnkgb2YgdGhlCi0gICAgICogZm9udC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUgaW4gdGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5GT05UREFUQV9BUlJBWV9ERUZBVUxUX0RFRkFVTFQ8L2NvZGU+KSAKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGZvbnQgZGF0YS4KLSAgICAgKiBUaGlzIEFQSSBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGlzCi0gICAgICogcmVjb21tZW5kZWQgdGhhdCA8Y29kZT5nZXRGb250RGF0YUFycmF5PC9jb2RlPiBpcyB1c2VkIGluc3RlYWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGZvbnQtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZvbnREYXRhIGdldEZvbnREYXRhKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRGb250RGF0YUFycmF5KHN0b3JlLCBuYW1lKVswXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwb2ludC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUgaW4gdGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5QT0lOVF9ERUZBVUxUX0RFRkFVTFQ8L2NvZGU+KSAKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgcG9pbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIHBvaW50LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQb2ludCBnZXRQb2ludChJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gYmFzaWNHZXRQb2ludChzdG9yZS5nZXRTdHJpbmcobmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHJlY3RhbmdsZS12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUgaW4gdGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5SRUNUQU5HTEVfREVGQVVMVF9ERUZBVUxUPC9jb2RlPikgCi0gICAgICogaWYgdGhlcmUgaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIHJlY3RhbmdsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgcHJlZmVyZW5jZSBzdG9yZQotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgcmVjdGFuZ2xlLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZWN0YW5nbGUgZ2V0UmVjdGFuZ2xlKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldFJlY3RhbmdsZShzdG9yZS5nZXRTdHJpbmcobmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIGluIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHN0b3JlLiBBcyBGb250RGF0YXMgYXJlIHN0b3JlZCBhcyAKLSAgICAgKiBhcnJheXMgdGhpcyBtZXRob2QgaXMgb25seSBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0gICAgICogVXNlIDxjb2RlPnNldERlZmF1bHQoSVByZWZlcmVuY2VTdG9yZSwgU3RyaW5nLCBGb250RGF0YVtdKTwvY29kZT4KLSAgICAgKiBpbnN0ZWFkLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0b3JlIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBGb250RGF0YSB2YWx1ZSkgewotICAgICAgICBGb250RGF0YVtdIGZvbnREYXRhcyA9IG5ldyBGb250RGF0YVsxXTsKLSAgICAgICAgZm9udERhdGFzWzBdID0gdmFsdWU7Ci0gICAgICAgIHNldERlZmF1bHQoc3RvcmUsIG5hbWUsIGZvbnREYXRhcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICogaW4gdGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdChJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgIEZvbnREYXRhW10gdmFsdWUpIHsKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChuYW1lLCBnZXRTdG9yZWRSZXByZXNlbnRhdGlvbih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIGluIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0b3JlIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBQb2ludCB2YWx1ZSkgewotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KG5hbWUsIFN0cmluZ0NvbnZlcnRlci5hc1N0cmluZyh2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIGluIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0b3JlIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBSZWN0YW5nbGUgdmFsdWUpIHsKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChuYW1lLCBTdHJpbmdDb252ZXJ0ZXIuYXNTdHJpbmcodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgKiBpbiB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgcHJlZmVyZW5jZSBzdG9yZQotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0KElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBuYW1lLCBSR0IgdmFsdWUpIHsKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChuYW1lLCBTdHJpbmdDb252ZXJ0ZXIuYXNTdHJpbmcodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgKiBpbiB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSBzdG9yZS4gCi0gICAgICogPHA+Ci0gICAgICogSW5jbHVkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0bwotICAgICAqIDwvY29kZT5zZXRWYWx1ZShzdG9yZSwgbmFtZSwgbmV3IEZvbnREYXRhW117dmFsdWV9KTwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgcHJlZmVyZW5jZSBzdG9yZQotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgIEZvbnREYXRhIHZhbHVlKSB7Ci0gICAgICAgIHNldFZhbHVlKHN0b3JlLCBuYW1lLCBuZXcgRm9udERhdGFbXSB7IHZhbHVlIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIGluIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHN0b3JlLiBUaGlzIG1ldGhvZCBhbHNvIHNldHMgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBrZXkgaW4gdGhlIEpGYWNlIGZvbnQgcmVnaXN0cnkgdG8gdGhlIHZhbHVlIGFuZCBmaXJlcyBhIAotICAgICAqIHByb3BlcnR5IGNoYW5nZSBldmVudCB0byBsaXN0ZW5lcnMgb24gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoaXMgQVBJIGRvZXMgbm90IHVwZGF0ZSBhbnkgb3RoZXIgc2V0dGluZ3MgdGhhdCBtYXkKLSAgICAgKiBiZSBkZXBlbmRhbnQgdXBvbiBpdC4gT25seSB0aGUgdmFsdWUgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgCi0gICAgICogYW5kIGluIHRoZSBmb250IHJlZ2lzdHJ5IGlzIHVwZGF0ZWQuCi0gICAgICogPC9wPiAKLSAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiAKLSAgICAgKiBAc2VlICNwdXRWYWx1ZShJUHJlZmVyZW5jZVN0b3JlLCBTdHJpbmcsIEZvbnREYXRhW10pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgRm9udERhdGFbXSB2YWx1ZSkgewotICAgICAgICBGb250RGF0YVtdIG9sZFZhbHVlID0gZ2V0Rm9udERhdGFBcnJheShzdG9yZSwgbmFtZSk7Ci0gICAgICAgIC8vIHNlZSBpZiB0aGUgZm9udCBoYXMgY2hhbmdlZAotICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMob2xkVmFsdWUsIHZhbHVlKSkgewotICAgICAgICAgICAgc3RvcmUucHV0VmFsdWUobmFtZSwgZ2V0U3RvcmVkUmVwcmVzZW50YXRpb24odmFsdWUpKTsKLSAgICAgICAgICAgIEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBzdG9yZS5maXJlUHJvcGVydHlDaGFuZ2VFdmVudChuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICogaW4gdGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUuIFRoaXMgbWV0aG9kIGRvZXMgbm90IHVwZGF0ZQotICAgICAqIHRoZSBmb250IHJlZ2lzdHJ5IG9yIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0b3JlIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogCi0gICAgICogQHNlZSBQcmVmZXJlbmNlQ29udmVydGVyI3NldFZhbHVlKElQcmVmZXJlbmNlU3RvcmUsIFN0cmluZywgRm9udERhdGFbXSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0VmFsdWUoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBGb250RGF0YVtdIHZhbHVlKSB7Ci0gICAgICAgIEZvbnREYXRhW10gb2xkVmFsdWUgPSBnZXRGb250RGF0YUFycmF5KHN0b3JlLCBuYW1lKTsKLSAgICAgICAgLy8gc2VlIGlmIHRoZSBmb250IGhhcyBjaGFuZ2VkCi0gICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhvbGRWYWx1ZSwgdmFsdWUpKSB7Ci0gICAgICAgICAgICBzdG9yZS5wdXRWYWx1ZShuYW1lLCBnZXRTdG9yZWRSZXByZXNlbnRhdGlvbih2YWx1ZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RvcmVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBhcnJheSBvZiBGb250RGF0YSBvYmplY3RzLgotICAgICAqIFRoZSBzdG9yZWQgcmVwcmVzZW50YXRpb24gaGFzIHRoZSBmb3JtIEZvbnREYXRhO0ZvbnREYXRhOwotICAgICAqIE9ubHkgaW5jbHVkZXMgdGhlIG5vbi1udWxsIGVudHJpZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZvbnREYXRhIHRoZSBhcnJheSBvZiBGb250RGF0YSBvYmplY3RzCi0gICAgICogQHJldHVybiB0aGUgc3RvcmVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBGb250RGF0YSBvYmplY3RzCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0b3JlZFJlcHJlc2VudGF0aW9uKEZvbnREYXRhW10gZm9udERhdGEpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGZvbnREYXRhW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGZvbnREYXRhW2ldLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoRU5UUllfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICogaW4gdGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VmFsdWUoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIG5hbWUsIFBvaW50IHZhbHVlKSB7Ci0gICAgICAgIFBvaW50IG9sZFZhbHVlID0gZ2V0UG9pbnQoc3RvcmUsIG5hbWUpOwotICAgICAgICBpZiAob2xkVmFsdWUgPT0gbnVsbCB8fCAhb2xkVmFsdWUuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgc3RvcmUucHV0VmFsdWUobmFtZSwgU3RyaW5nQ29udmVydGVyLmFzU3RyaW5nKHZhbHVlKSk7Ci0gICAgICAgICAgICBzdG9yZS5maXJlUHJvcGVydHlDaGFuZ2VFdmVudChuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICogaW4gdGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VmFsdWUoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBSZWN0YW5nbGUgdmFsdWUpIHsKLSAgICAgICAgUmVjdGFuZ2xlIG9sZFZhbHVlID0gZ2V0UmVjdGFuZ2xlKHN0b3JlLCBuYW1lKTsKLSAgICAgICAgaWYgKG9sZFZhbHVlID09IG51bGwgfHwgIW9sZFZhbHVlLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHN0b3JlLnB1dFZhbHVlKG5hbWUsIFN0cmluZ0NvbnZlcnRlci5hc1N0cmluZyh2YWx1ZSkpOwotICAgICAgICAgICAgc3RvcmUuZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmFtZSwgb2xkVmFsdWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIGluIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0b3JlIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBuYW1lLCBSR0IgdmFsdWUpIHsKLSAgICAgICAgUkdCIG9sZFZhbHVlID0gZ2V0Q29sb3Ioc3RvcmUsIG5hbWUpOwotICAgICAgICBpZiAob2xkVmFsdWUgPT0gbnVsbCB8fCAhb2xkVmFsdWUuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgc3RvcmUucHV0VmFsdWUobmFtZSwgU3RyaW5nQ29udmVydGVyLmFzU3RyaW5nKHZhbHVlKSk7Ci0gICAgICAgICAgICBzdG9yZS5maXJlUHJvcGVydHlDaGFuZ2VFdmVudChuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9QcmVmZXJlbmNlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3MGYxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ01lc3NhZ2VBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JUGFnZUNoYW5nZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSVBhZ2VDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUGFnZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRyYXlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNhc2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLQotLyoqCi0gKiBBIHByZWZlcmVuY2UgZGlhbG9nIGlzIGEgaGllcmFyY2hpY2FsIHByZXNlbnRhdGlvbiBvZiBwcmVmZXJlbmNlIHBhZ2VzLiBFYWNoCi0gKiBwYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGEgbm9kZSBpbiB0aGUgdHJlZSBzaG93biBvbiB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlCi0gKiBkaWFsb2c7IHdoZW4gYSBub2RlIGlzIHNlbGVjdGVkLCB0aGUgY29ycmVzcG9uZGluZyBwYWdlIGlzIHNob3duIG9uIHRoZSByaWdodAotICogaGFuZCBzaWRlLgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZURpYWxvZyBleHRlbmRzIFRyYXlEaWFsb2cgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVBhZ2VDb250YWluZXIsIElQYWdlQ2hhbmdlUHJvdmlkZXIgewotCS8qKgotCSAqIExheW91dCBmb3IgdGhlIHBhZ2UgY29udGFpbmVyLgotCSAqICAKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFBhZ2VMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotCQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZm9yY2UpIHsKLQkJCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCAmJiBoSGludCAhPSBTV1QuREVGQVVMVCkKLQkJCQlyZXR1cm4gbmV3IFBvaW50KHdIaW50LCBoSGludCk7Ci0JCQlpbnQgeCA9IG1pbmltdW1QYWdlU2l6ZS54OwotCQkJaW50IHkgPSBtaW5pbXVtUGFnZVNpemUueTsKLQkJCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCVBvaW50IHNpemUgPSBjaGlsZHJlbltpXS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZvcmNlKTsKLQkJCQl4ID0gTWF0aC5tYXgoeCwgc2l6ZS54KTsKLQkJCQl5ID0gTWF0aC5tYXgoeSwgc2l6ZS55KTsKLQkJCX0KLQkJCQotCQkJLy9BcyBwYWdlcyBjYW4gaW1wbGVtZW50IHRoaWVyIG93biBjb21wdXRlU2l6ZQotCQkJLy90YWtlIGl0IGludG8gYWNjb3VudAotCQkJaWYoY3VycmVudFBhZ2UgIT0gbnVsbCl7Ci0JCQkJUG9pbnQgc2l6ZSA9IGN1cnJlbnRQYWdlLmNvbXB1dGVTaXplKCk7Ci0JCQkJeCA9IE1hdGgubWF4KHgsIHNpemUueCk7Ci0JCQkJeSA9IE1hdGgubWF4KHksIHNpemUueSk7Ci0JCQl9Ci0JCQkKLQkJCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkKLQkJCQl4ID0gd0hpbnQ7Ci0JCQlpZiAoaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQkJeSA9IGhIaW50OwotCQkJcmV0dXJuIG5ldyBQb2ludCh4LCB5KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZvcmNlKSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQljaGlsZHJlbltpXS5zZXRTaXplKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8vVGhlIGlkIG9mIHRoZSBsYXN0IHBhZ2UgdGhhdCB3YXMgc2VsZWN0ZWQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbGFzdFByZWZlcmVuY2VJZCA9IG51bGw7Ci0KLQkvL1RoZSBsYXN0IGtub3duIHRyZWUgd2lkdGgKLQlwcml2YXRlIHN0YXRpYyBpbnQgbGFzdFRyZWVXaWR0aCA9IDE1MDsKLQotCS8qKgotCSAqIEluZGVudGlmaWVyIGZvciB0aGUgZXJyb3IgaW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0RMR19JTUdfVElUTEVfRVJST1IgPSBETEdfSU1HX01FU1NBR0VfRVJST1I7Ci0KLQkvKioKLQkgKiBUaXRsZSBhcmVhIGZpZWxkcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRExHX1RJVExFX0lNRyA9ICJwcmVmZXJlbmNlX2RpYWxvZ190aXRsZV9pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgewotCQlJbWFnZVJlZ2lzdHJ5IHJlZyA9IEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQkJcmVnLnB1dChQUkVGX0RMR19USVRMRV9JTUcsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShQcmVmZXJlbmNlRGlhbG9nLmNsYXNzLAotCQkJCSJpbWFnZXMvcHJlZl9kaWFsb2dfdGl0bGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgcHJlZmVyZW5jZSBwYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lLgotCSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VQYWdlIGN1cnJlbnRQYWdlOwotCi0JcHJpdmF0ZSBEaWFsb2dNZXNzYWdlQXJlYSBtZXNzYWdlQXJlYTsKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIGhlbHAgaXMgYXZhaWxhYmxlOyA8Y29kZT5mYWxzZTwvY29kZT4gYnkgZGVmYXVsdC4nCi0JICogCi0JICogQHNlZSAjc2V0SGVscEF2YWlsYWJsZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0hlbHBBdmFpbGFibGUgPSBmYWxzZTsKLQotCXByaXZhdGUgUG9pbnQgbGFzdFNoZWxsU2l6ZTsKLQotCXByaXZhdGUgSVByZWZlcmVuY2VOb2RlIGxhc3RTdWNjZXNzZnVsTm9kZTsKLQotCS8qKgotCSAqIFRoZSBtaW5pbXVtIHBhZ2Ugc2l6ZTsgNDAwIGJ5IDQwMCBieSBkZWZhdWx0LgotCSAqIAotCSAqIEBzZWUgI3NldE1pbmltdW1QYWdlU2l6ZShQb2ludCkKLQkgKi8KLQlwcml2YXRlIFBvaW50IG1pbmltdW1QYWdlU2l6ZSA9IG5ldyBQb2ludCg0MDAsIDQwMCk7Ci0KLQkvKioKLQkgKiBUaGUgT0sgYnV0dG9uLgotCSAqLwotCXByaXZhdGUgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENvbXBvc2l0ZSBpbiB3aGljaCBhIHBhZ2UgaXMgc2hvd24uCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgcGFnZUNvbnRhaW5lcjsKLQotCS8qKgotCSAqIFRoZSBwcmVmZXJlbmNlIG1hbmFnZXIuCi0JICovCi0JcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBwcmVmZXJlbmNlTWFuYWdlcjsKLQotCS8qKgotCSAqIEZsYWcgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvd2luZ0Vycm9yID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIHN0b3JlLCBpbml0aWFsbHkgPGNvZGU+bnVsbDwvY29kZT4gbWVhbmluZyBub25lLgotCSAqIAotCSAqIEBzZWUgI3NldFByZWZlcmVuY2VTdG9yZQotCSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSB0aXRsZUFyZWE7Ci0KLQkvKioKLQkgKiBUaGUgdHJlZSB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0JCi0gICAgcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcGFnZUNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHByZWZlcmVuY2UgZGlhbG9nIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBnaXZlbiBwcmVmZXJlbmNlCi0JICogbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFIHwgU1dULk1BWCk7Ci0JCXByZWZlcmVuY2VNYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2J1dHRvblByZXNzZWQoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCXN3aXRjaCAoYnV0dG9uSWQpIHsKLQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEOiB7Ci0JCQlva1ByZXNzZWQoKTsKLQkJCXJldHVybjsKLQkJfQotCQljYXNlIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEOiB7Ci0JCQljYW5jZWxQcmVzc2VkKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLkhFTFBfSUQ6IHsKLQkJCWhlbHBQcmVzc2VkKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY2FuY2VsUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJLy8gSW5mb3JtIGFsbCBwYWdlcyB0aGF0IHdlIGFyZSBjYW5jZWxsaW5nCi0JCUl0ZXJhdG9yIG5vZGVzID0gcHJlZmVyZW5jZU1hbmFnZXIuZ2V0RWxlbWVudHMoUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKS5pdGVyYXRvcigpOwotCQl3aGlsZSAobm9kZXMuaGFzTmV4dCgpKSB7Ci0JCQlmaW5hbCBJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IChJUHJlZmVyZW5jZU5vZGUpIG5vZGVzLm5leHQoKTsKLQkJCWlmIChnZXRQYWdlKG5vZGUpICE9IG51bGwpIHsKLQkJCQlTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICghZ2V0UGFnZShub2RlKS5wZXJmb3JtQ2FuY2VsKCkpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJc2V0UmV0dXJuQ29kZShDQU5DRUwpOwotCQljbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSBsYXN0IHNlbGVjdGVkIG5vZGUuIFRoaXMgaXMgc28gdGhhdCB3ZSBub3QgY2hhY2hlIHRoZSBsYXN0Ci0JICogc2VsZWN0aW9uIGluIGNhc2Ugb2YgYW4gZXJyb3IuCi0JICovCi0Jdm9pZCBjbGVhclNlbGVjdGVkTm9kZSgpIHsKLQkJc2V0U2VsZWN0ZWROb2RlUHJlZmVyZW5jZShudWxsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY2xvc2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlMaXN0IG5vZGVzID0gcHJlZmVyZW5jZU1hbmFnZXIuZ2V0RWxlbWVudHMoUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkJSVByZWZlcmVuY2VOb2RlIG5vZGUgPSAoSVByZWZlcmVuY2VOb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQlub2RlLmRpc3Bvc2VSZXNvdXJjZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiUHJlZmVyZW5jZURpYWxvZy50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQluZXdTaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzaGVsbEFjdGl2YXRlZChTaGVsbEV2ZW50IGUpIHsKLQkJCQlpZiAobGFzdFNoZWxsU2l6ZSA9PSBudWxsKQotCQkJCQlsYXN0U2hlbGxTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uc3RyYWluU2hlbGxTaXplKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25zdHJhaW5TaGVsbFNpemUoKSB7Ci0JCXN1cGVyLmNvbnN0cmFpblNoZWxsU2l6ZSgpOwotCQkvLyByZWNvcmQgb3BlbmluZyBzaGVsbCBzaXplCi0JCWlmIChsYXN0U2hlbGxTaXplID09IG51bGwpCi0JCQlsYXN0U2hlbGxTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIE9LIGFuZCBDYW5jZWwgYnV0dG9ucyBieSBkZWZhdWx0Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbihva0J1dHRvbik7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCQlpZiAoaXNIZWxwQXZhaWxhYmxlKSB7Ci0JCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkhFTFBfSUQsIElEaWFsb2dDb25zdGFudHMuSEVMUF9MQUJFTCwgZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbnRyb2xbXSBjb250cm9sID0gbmV3IENvbnRyb2xbMV07Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJY29udHJvbFswXSA9IFByZWZlcmVuY2VEaWFsb2cuc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJCQkvLyBBZGQgdGhlIGZpcnN0IHBhZ2UKLQkJCQlzZWxlY3RTYXZlZEl0ZW0oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbnRyb2xbMF07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBwYXJlbnRMYXlvdXQgPSAoKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKSk7Ci0JCXBhcmVudExheW91dC5udW1Db2x1bW5zID0gNDsKLQkJcGFyZW50TGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXBhcmVudExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXBhcmVudExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQlwYXJlbnRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQkKLQkJY29tcG9zaXRlLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCQotCQlDb250cm9sIHRyZWVDb250cm9sID0gY3JlYXRlVHJlZUFyZWFDb250ZW50cyhjb21wb3NpdGUpOwotCQljcmVhdGVTYXNoKGNvbXBvc2l0ZSx0cmVlQ29udHJvbCk7Ci0JCQotCQlMYWJlbCB2ZXJzZXAgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULlZFUlRJQ0FMKTsKLQkJR3JpZERhdGEgdmVyR2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQotCQl2ZXJzZXAuc2V0TGF5b3V0RGF0YSh2ZXJHZCk7Ci0JCXZlcnNlcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkZJTEwsIGZhbHNlLCB0cnVlKSk7Ci0JCQotCQlDb21wb3NpdGUgcGFnZUFyZWFDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwYWdlQXJlYUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXBhZ2VBcmVhQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkKLQkJCi0JCS8vIEJ1aWxkIHRoZSB0aXRsZSBhcmVhIGFuZCBzZXBhcmF0b3IgbGluZQotCQlDb21wb3NpdGUgdGl0bGVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhZ2VBcmVhQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJdGl0bGVDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIHRpdGxlTGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQl0aXRsZUxheW91dERhdGEuaG9yaXpvbnRhbEluZGVudCA9IElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU47Ci0JCXRpdGxlQ29tcG9zaXRlLnNldExheW91dERhdGEodGl0bGVMYXlvdXREYXRhKTsKLQkJY3JlYXRlVGl0bGVBcmVhKHRpdGxlQ29tcG9zaXRlKTsKLQkJCi0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChwYWdlQXJlYUNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCQotCQkKLQkJLy8gQnVpbGQgdGhlIFBhZ2UgY29udGFpbmVyCi0JCXBhZ2VDb250YWluZXIgPSBjcmVhdGVQYWdlQ29udGFpbmVyKHBhZ2VBcmVhQ29tcG9zaXRlKTsKLQkJR3JpZERhdGEgcGFnZUNvbnRhaW5lckRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJcGFnZUNvbnRhaW5lckRhdGEuaG9yaXpvbnRhbEluZGVudCA9IElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU47Ci0JCXBhZ2VDb250YWluZXIuc2V0TGF5b3V0RGF0YShwYWdlQ29udGFpbmVyRGF0YSk7Ci0JCS8vIEJ1aWxkIHRoZSBzZXBhcmF0b3IgbGluZQotCQlMYWJlbCBib3R0b21TZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlib3R0b21TZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBzYXNoIHdpdGggcmlnaHQgY29udHJvbCBvbiB0aGUgcmlnaHQuIE5vdGUgCi0JICogdGhhdCB0aGlzIG1ldGhvZCBhc3N1bWVzIEdyaWREYXRhIGZvciB0aGUgbGF5b3V0IGRhdGEKLQkgKiBvZiB0aGUgcmlnaHRDb250cm9sLgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sCi0JICogQHJldHVybiBTYXNoCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBTYXNoIGNyZWF0ZVNhc2goZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSwgZmluYWwgQ29udHJvbCByaWdodENvbnRyb2wpIHsKLQkJZmluYWwgU2FzaCBzYXNoID0gbmV3IFNhc2goY29tcG9zaXRlLCBTV1QuVkVSVElDQUwpOwotCQlzYXNoLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJc2FzaC5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotCQkvLyB0aGUgZm9sbG93aW5nIGxpc3RlbmVyIHJlc2l6ZXMgdGhlIHRyZWUgY29udHJvbCBiYXNlZCBvbiBzYXNoIGRlbHRhcy4KLQkJLy8gSWYgbmVjZXNzYXJ5LCBpdCB3aWxsIGFsc28gZ3Jvdy9zaHJpbmsgdGhlIGRpYWxvZy4KLQkJc2FzaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkRSQUcpCi0JCQkJCXJldHVybjsKLQkJCQlpbnQgc2hpZnQgPSBldmVudC54IC0gc2FzaC5nZXRCb3VuZHMoKS54OwotCQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIHJpZ2h0Q29udHJvbC5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJaW50IG5ld1dpZHRoSGludCA9IGRhdGEud2lkdGhIaW50ICsgc2hpZnQ7Ci0JCQkJaWYgKG5ld1dpZHRoSGludCA8IDIwKQotCQkJCQlyZXR1cm47Ci0JCQkJUG9pbnQgY29tcHV0ZWRTaXplID0gZ2V0U2hlbGwoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCVBvaW50IGN1cnJlbnRTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCQkJLy8gaWYgdGhlIGRpYWxvZyB3YXNuJ3Qgb2YgYSBjdXN0b20gc2l6ZSB3ZSBrbm93IHdlIGNhbiBzaHJpbmsKLQkJCQkvLyBpdCBpZiBuZWNlc3NhcnkgYmFzZWQgb24gc2FzaCBtb3ZlbWVudC4KLQkJCQlib29sZWFuIGN1c3RvbVNpemUgPSAhY29tcHV0ZWRTaXplLmVxdWFscyhjdXJyZW50U2l6ZSk7Ci0JCQkJZGF0YS53aWR0aEhpbnQgPSBuZXdXaWR0aEhpbnQ7Ci0JCQkJc2V0TGFzdFRyZWVXaWR0aChuZXdXaWR0aEhpbnQpOwotCQkJCWNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSk7Ci0JCQkJLy8gcmVjb21wdXRlIGJhc2VkIG9uIG5ldyB3aWRnZXQgc2l6ZQotCQkJCWNvbXB1dGVkU2l6ZSA9IGdldFNoZWxsKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQkvLyBpZiB0aGUgZGlhbG9nIHdhcyBvZiBhIGN1c3RvbSBzaXplIHRoZW4gaW5jcmVhc2UgaXQgb25seSBpZgotCQkJCS8vIG5lY2Vzc2FyeS4KLQkJCQlpZiAoY3VzdG9tU2l6ZSkKLQkJCQkJY29tcHV0ZWRTaXplLnggPSBNYXRoLm1heChjb21wdXRlZFNpemUueCwgY3VycmVudFNpemUueCk7Ci0JCQkJY29tcHV0ZWRTaXplLnkgPSBNYXRoLm1heChjb21wdXRlZFNpemUueSwgY3VycmVudFNpemUueSk7Ci0JCQkJaWYgKGNvbXB1dGVkU2l6ZS5lcXVhbHMoY3VycmVudFNpemUpKQotCQkJCQlyZXR1cm47Ci0JCQkJc2V0U2hlbGxTaXplKGNvbXB1dGVkU2l6ZS54LCBjb21wdXRlZFNpemUueSk7Ci0JCQkJbGFzdFNoZWxsU2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHNhc2g7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgaW5uZXIgcGFnZSBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4gQ29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVQYWdlQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCS8vQ3JlYXRlIGFuIG91dGVyIGNvbXBvc2l0ZSBmb3Igc3BhY2luZwotCQlDb21wb3NpdGUgb3V0ZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkKLQkJR3JpZERhdGEgb3V0ZXJEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCQkJCi0JCW91dGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJb3V0ZXIuc2V0TGF5b3V0RGF0YShvdXRlckRhdGEpOwotCi0JCUNvbXBvc2l0ZSByZXN1bHQgPSBuZXcgQ29tcG9zaXRlKG91dGVyLCBTV1QuTk9ORSk7Ci0JCQotCQlHcmlkRGF0YSByZXN1bHREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCQkJCi0JCXJlc3VsdC5zZXRMYXlvdXQoZ2V0UGFnZUxheW91dCgpKTsKLQkJcmVzdWx0LnNldExheW91dERhdGEocmVzdWx0RGF0YSk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGF5b3V0IGZvciB0aGUgY29tcG9zaXRlIHRoYXQgY29udGFpbnMKLQkgKiB0aGUgcGFnZXMuCi0JICogQHJldHVybiBQYWdlTGF5b3V0Ci0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBMYXlvdXQgZ2V0UGFnZUxheW91dCgpIHsKLQkJcmV0dXJuIG5ldyBQYWdlTGF5b3V0KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd2l6YXJkJ3MgdGl0bGUgYXJlYS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgU1dUIHBhcmVudCBmb3IgdGhlIHRpdGxlIGFyZWEgY29tcG9zaXRlLgotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgdGl0bGUgYXJlYSBjb21wb3NpdGUuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUaXRsZUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIHRpdGxlIGFyZWEgd2hpY2ggd2lsbCBjb250YWluCi0JCS8vIGEgdGl0bGUsIG1lc3NhZ2UsIGFuZCBpbWFnZS4KLQkJaW50IG1hcmdpbnMgPSAyOwotCQl0aXRsZUFyZWEgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBtYXJnaW5zOwotCQl0aXRsZUFyZWEuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCi0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCXRpdGxlQXJlYS5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCi0JCS8vIE1lc3NhZ2UgbGFiZWwKLQkJbWVzc2FnZUFyZWEgPSBuZXcgRGlhbG9nTWVzc2FnZUFyZWEoKTsKLQkJbWVzc2FnZUFyZWEuY3JlYXRlQ29udGVudHModGl0bGVBcmVhKTsKLQotCQl0aXRsZUFyZWEuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlciNjb250cm9sUmVzaXplZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQl1cGRhdGVNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZvbnRMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoSkZhY2VSZXNvdXJjZXMuQkFOTkVSX0ZPTlQuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKQotCQkJCQl1cGRhdGVNZXNzYWdlKCk7Ci0JCQkJaWYgKEpGYWNlUmVzb3VyY2VzLkRJQUxPR19GT05ULmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkgewotCQkJCQl1cGRhdGVNZXNzYWdlKCk7Ci0JCQkJCUZvbnQgZGlhbG9nRm9udCA9IEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKTsKLQkJCQkJdXBkYXRlVHJlZUZvbnQoZGlhbG9nRm9udCk7Ci0JCQkJCUNvbnRyb2xbXSBjaGlsZHJlbiA9ICgoQ29tcG9zaXRlKSBidXR0b25CYXIpLmdldENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJCQljaGlsZHJlbltpXS5zZXRGb250KGRpYWxvZ0ZvbnQpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0aXRsZUFyZWEuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5yZW1vdmVMaXN0ZW5lcihmb250TGlzdGVuZXIpOwotCQkJfQotCQl9KTsKLQkJSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuYWRkTGlzdGVuZXIoZm9udExpc3RlbmVyKTsKLQkJbWVzc2FnZUFyZWEuc2V0VGl0bGVMYXlvdXREYXRhKGNyZWF0ZU1lc3NhZ2VBcmVhRGF0YSgpKTsKLQkJbWVzc2FnZUFyZWEuc2V0TWVzc2FnZUxheW91dERhdGEoY3JlYXRlTWVzc2FnZUFyZWFEYXRhKCkpOwotCQlyZXR1cm4gdGl0bGVBcmVhOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoZSBtZXNzYWdlIGFyZWEuCi0JICogCi0JICogQHJldHVybiBGb3JtRGF0YSBmb3IgdGhlIG1lc3NhZ2UgYXJlYS4KLQkgKi8KLQlwcml2YXRlIEZvcm1EYXRhIGNyZWF0ZU1lc3NhZ2VBcmVhRGF0YSgpIHsKLQkJRm9ybURhdGEgbWVzc2FnZURhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJbWVzc2FnZURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQltZXNzYWdlRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJbWVzc2FnZURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJbWVzc2FnZURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJcmV0dXJuIG1lc3NhZ2VEYXRhOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBTV1QgcGFyZW50IGZvciB0aGUgdHJlZSBhcmVhIGNvbnRyb2xzLgotCSAqIEByZXR1cm4gdGhlIG5ldyA8Y29kZT5Db250cm9sPC9jb2RlPi4KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlVHJlZUFyZWFDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIEJ1aWxkIHRoZSB0cmVlIGFuIHB1dCBpdCBpbnRvIHRoZSBjb21wb3NpdGUuCi0JCXRyZWVWaWV3ZXIgPSBjcmVhdGVUcmVlVmlld2VyKHBhcmVudCk7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKSk7Ci0JCXVwZGF0ZVRyZWVGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWxheW91dFRyZWVBcmVhQ29udHJvbCh0cmVlVmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXJldHVybiB0cmVlVmlld2VyLmdldENvbnRyb2woKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgPGNvZGU+VHJlZVZpZXdlcjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPlRyZWVWaWV3ZXI8L2NvZGU+LgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciBjcmVhdGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgVHJlZVZpZXdlciB2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJYWRkTGlzdGVuZXJzKHZpZXdlcik7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQcmVmZXJlbmNlTGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUHJlZmVyZW5jZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGxpc3RlbmVycyB0byB0aGUgdHJlZSB2aWV3ZXIuCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoZmluYWwgVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJdmlld2VyLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwcml2YXRlIHZvaWQgaGFuZGxlRXJyb3IoKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gcmVtb3ZlIHRoZSBsaXN0ZW5lciB0ZW1wb3JhcmlseSBzbyB0aGF0IHRoZSBldmVudHMgY2F1c2VkCi0JCQkJCS8vIGJ5IHRoZSBlcnJvciBoYW5kbGluZyBkb250IGZ1cnRoZXIgY2F1c2UgZXJyb3IgaGFuZGxpbmcKLQkJCQkJLy8gdG8gb2NjdXIuCi0JCQkJCXZpZXdlci5yZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkJCQlzaG93UGFnZUZsaXBwaW5nQWJvcnREaWFsb2coKTsKLQkJCQkJc2VsZWN0Q3VycmVudFBhZ2VBZ2FpbigpOwotCQkJCQljbGVhclNlbGVjdGVkTm9kZSgpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXZpZXdlci5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3Qgc2VsZWN0aW9uID0gZ2V0U2luZ2xlU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVByZWZlcmVuY2VOb2RlKSB7Ci0JCQkJCWlmICghaXNDdXJyZW50UGFnZVZhbGlkKCkpIHsKLQkJCQkJCWhhbmRsZUVycm9yKCk7Ci0JCQkJCX0gZWxzZSBpZiAoIXNob3dQYWdlKChJUHJlZmVyZW5jZU5vZGUpIHNlbGVjdGlvbikpIHsKLQkJCQkJCS8vIFBhZ2UgZmxpcHBpbmcgd2Fzbid0IHN1Y2Nlc3NmdWwKLQkJCQkJCWhhbmRsZUVycm9yKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBFdmVyeXRoaW5nIHdlbnQgd2VsbAotCQkJCQkJbGFzdFN1Y2Nlc3NmdWxOb2RlID0gKElQcmVmZXJlbmNlTm9kZSkgc2VsZWN0aW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJKChUcmVlKSB2aWV3ZXIuZ2V0Q29udHJvbCgpKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChmaW5hbCBTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJCQlyZXR1cm47Ci0JCQkJSVByZWZlcmVuY2VOb2RlIHNpbmdsZVNlbGVjdGlvbiA9IGdldFNpbmdsZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCWJvb2xlYW4gZXhwYW5kZWQgPSB2aWV3ZXIuZ2V0RXhwYW5kZWRTdGF0ZShzaW5nbGVTZWxlY3Rpb24pOwotCQkJCXZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKHNpbmdsZVNlbGVjdGlvbiwgIWV4cGFuZGVkKTsKLQkJCX0KLQkJfSk7Ci0JCS8vUmVnaXN0ZXIgaGVscCBsaXN0ZW5lciBvbiB0aGUgdHJlZSB0byB1c2UgY29udGV4dCBzZW5zaXRpdmUgaGVscAotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLmFkZEhlbHBMaXN0ZW5lcihuZXcgSGVscExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGVscFJlcXVlc3RlZChIZWxwRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBjYWxsIHBlcmZvcm0gaGVscCBvbiB0aGUgY3VycmVudCBwYWdlCi0JCQkJaWYgKGN1cnJlbnRQYWdlICE9IG51bGwpIHsKLQkJCQkJY3VycmVudFBhZ2UucGVyZm9ybUhlbHAoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIDxjb2RlPklQcmVmZXJlbmNlTm9kZTwvY29kZT4gdGhhdCBoYXMgZGF0YSB0aGUgc2FtZSBpZCBhcyB0aGUKLQkgKiBzdXBwbGllZCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZUlkCi0JICogICAgICAgICAgICB0aGUgaWQgdG8gc2VhcmNoIGZvci4KLQkgKiBAcmV0dXJuIDxjb2RlPklQcmVmZXJlbmNlTm9kZTwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90Ci0JICogICAgICAgICBmb3VuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VOb2RlIGZpbmROb2RlTWF0Y2hpbmcoU3RyaW5nIG5vZGVJZCkgewotCQlMaXN0IG5vZGVzID0gcHJlZmVyZW5jZU1hbmFnZXIuZ2V0RWxlbWVudHMoUHJlZmVyZW5jZU1hbmFnZXIuUE9TVF9PUkRFUik7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG5vZGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJSVByZWZlcmVuY2VOb2RlIG5vZGUgPSAoSVByZWZlcmVuY2VOb2RlKSBpLm5leHQoKTsKLQkJCWlmIChub2RlLmdldElkKCkuZXF1YWxzKG5vZGVJZCkpCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBsYXN0IGtub3duIHJpZ2h0IHNpZGUgd2lkdGguCi0JICogCi0JICogQHJldHVybiB0aGUgd2lkdGguCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRMYXN0UmlnaHRXaWR0aCgpIHsKLQkJcmV0dXJuIGxhc3RUcmVlV2lkdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBtYW5hbmdlciB1c2VkIGJ5IHRoaXMgcHJlZmVyZW5jZSBkaWFsb2cuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSBtYW5hbmdlcgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlTWFuYWdlciBnZXRQcmVmZXJlbmNlTWFuYWdlcigpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VNYW5hZ2VyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2VDb250YWluZXIjZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuYW1lIG9mIHRoZSBzZWxlY3RlZCBpdGVtIHByZWZlcmVuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWROb2RlUHJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGxhc3RQcmVmZXJlbmNlSWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPklTZWxlY3Rpb248L2NvZGU+IHRvIGV4YW1pbmUuCi0JICogQHJldHVybiB0aGUgZmlyc3QgZWxlbWVudCwgb3IgbnVsbCBpZiBlbXB0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VOb2RlIGdldFNpbmdsZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzdHJ1Y3R1cmVkLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgSVByZWZlcmVuY2VOb2RlKQotCQkJCXJldHVybiAoSVByZWZlcmVuY2VOb2RlKSBzdHJ1Y3R1cmVkLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPlRyZWVWaWV3ZXI8L2NvZGU+IGZvciB0aGlzIGRpYWxvZy4KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpIHsKLQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGUgcGFnZXMuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIHNhdmVzIGFsbCBwYWdlcyBvZgotCSAqIHR5cGUgPGNvZGU+UHJlZmVyZW5jZVBhZ2U8L2NvZGU+IChpZiB0aGVpciBzdG9yZSBuZWVkcyBzYXZpbmcgYW5kIGlzIGEKLQkgKiA8Y29kZT5QcmVmZXJlbmNlU3RvcmU8L2NvZGU+KS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNhdmUoKSB7Ci0JCUl0ZXJhdG9yIG5vZGVzID0gcHJlZmVyZW5jZU1hbmFnZXIuZ2V0RWxlbWVudHMoUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKS5pdGVyYXRvcigpOwotCQl3aGlsZSAobm9kZXMuaGFzTmV4dCgpKSB7Ci0JCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IChJUHJlZmVyZW5jZU5vZGUpIG5vZGVzLm5leHQoKTsKLQkJCUlQcmVmZXJlbmNlUGFnZSBwYWdlID0gbm9kZS5nZXRQYWdlKCk7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIFByZWZlcmVuY2VQYWdlKSB7Ci0JCQkJLy8gU2F2ZSBub3cgaW4gY2FzZSB0YmUgd29ya2JlbmNoIGRvZXMgbm90IHNodXRkb3duIGNsZWFubHkKLQkJCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gKChQcmVmZXJlbmNlUGFnZSkgcGFnZSkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkJaWYgKHN0b3JlICE9IG51bGwgJiYgc3RvcmUubmVlZHNTYXZpbmcoKQotCQkJCQkJJiYgc3RvcmUgaW5zdGFuY2VvZiBJUGVyc2lzdGVudFByZWZlcmVuY2VTdG9yZSkgewotCQkJCQl0cnkgewotCQkJCQkJKChJUGVyc2lzdGVudFByZWZlcmVuY2VTdG9yZSkgc3RvcmUpLnNhdmUoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJTWVzc2FnZURpYWxvZwotCQkJCQkJCQkub3BlbkVycm9yKAotCQkJCQkJCQkJCWdldFNoZWxsKCksCi0JCQkJCQkJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcmVmZXJlbmNlRGlhbG9nLnNhdmVFcnJvclRpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlKRmFjZVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQkJIlByZWZlcmVuY2VEaWFsb2cuc2F2ZUVycm9yTWVzc2FnZSIsIG5ldyBPYmplY3RbXSB7IHBhZ2UuZ2V0VGl0bGUoKSwgZS5nZXRNZXNzYWdlKCkgfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoZSB3aW5kb3cncyBjbG9zZSBidXR0b24gd2FzIHByZXNzZWQsIHRoZSBjbG9zZSBtZW51IHdhcwotCSAqIHNlbGVjdGVkLCBvciB0aGUgRVNDQVBFIGtleSBwcmVzc2VkLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBzZXRzIHRoZSB3aW5kb3cncwotCSAqIHJldHVybiBjb2RlIHRvIDxjb2RlPkNBTkNFTDwvY29kZT4gYW5kIGNsb3NlcyB0aGUgd2luZG93IHVzaW5nCi0JICogPGNvZGU+Y2xvc2U8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSBleHRlbmQgb3IgcmVpbXBsZW1lbnQuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNoZWxsQ2xvc2VFdmVudCgpIHsKLQkJLy8gaGFuZGxlIHRoZSBzYW1lIGFzIHByZXNzaW5nIGNhbmNlbAotCQljYW5jZWxQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgb2YgdGhlIHByZXNzaW5nIG9mIHRoZSBIZWxwIGJ1dHRvbi4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgY2FsbHMKLQkgKiA8Y29kZT5wZXJmb3JtSGVscDwvY29kZT4gb24gdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFnZS4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGVscFByZXNzZWQoKSB7Ci0JCWlmIChjdXJyZW50UGFnZSAhPSBudWxsKSB7Ci0JCQljdXJyZW50UGFnZS5wZXJmb3JtSGVscCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHBhZ2UgaXMgdmFsaWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyBub3QgdmFsaWQsIG9yIG9yCi0JICogICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHZhbGlkIG9yIHRoZXJlIGlzIG5vCi0JICogICAgICAgICBjdXJyZW50IHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnJlbnRQYWdlVmFsaWQoKSB7Ci0JCWlmIChjdXJyZW50UGFnZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBjdXJyZW50UGFnZS5pc1ZhbGlkKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5Db250cm9sPC9jb2RlPiB0byBsYXkgb3V0LgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXRUcmVlQXJlYUNvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlnZC53aWR0aEhpbnQgPSBnZXRMYXN0UmlnaHRXaWR0aCgpOwotCQlnZC52ZXJ0aWNhbFNwYW4gPSAxOwotCQljb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCX0KLQotCS8qKgotCSAqIFRoZSBwcmVmZXJlbmNlIGRpYWxvZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPkRpYWxvZzwvY29kZT4KLQkgKiBmcmFtZXdvcmsgbWV0aG9kIHNlbmRzIDxjb2RlPnBlcmZvcm1PazwvY29kZT4gdG8gYWxsIHBhZ2VzIG9mIHRoZQotCSAqIHByZWZlcmVuY2UgZGlhbG9nLCB0aGVuIGNhbGxzIDxjb2RlPmhhbmRsZVNhdmU8L2NvZGU+IG9uIHRoaXMgZGlhbG9nIHRvCi0JICogc2F2ZSBhbnkgc3RhdGUsIGFuZCB0aGVuIGNhbGxzIDxjb2RlPmNsb3NlPC9jb2RlPiB0byBjbG9zZSB0aGlzIGRpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCVNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCXByaXZhdGUgYm9vbGVhbiBlcnJvck9jY3VycmVkOwotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJZXJyb3JPY2N1cnJlZCA9IGZhbHNlOwotCQkJCWJvb2xlYW4gaGFzRmFpbGVkT0sgPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQkvLyBOb3RpZnkgYWxsIHRoZSBwYWdlcyBhbmQgZ2l2ZSB0aGVtIGEgY2hhbmNlIHRvIGFib3J0Ci0JCQkJCUl0ZXJhdG9yIG5vZGVzID0gcHJlZmVyZW5jZU1hbmFnZXIuZ2V0RWxlbWVudHMoUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKQotCQkJCQkJCS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAobm9kZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IChJUHJlZmVyZW5jZU5vZGUpIG5vZGVzLm5leHQoKTsKLQkJCQkJCUlQcmVmZXJlbmNlUGFnZSBwYWdlID0gbm9kZS5nZXRQYWdlKCk7Ci0JCQkJCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFwYWdlLnBlcmZvcm1PaygpKXsKLQkJCQkJCQkJaGFzRmFpbGVkT0sgPSB0cnVlOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCS8vRG9uJ3QgYm90aGVyIGNsb3NpbmcgaWYgdGhlIE9LIGZhaWxlZAotCQkJCQlpZihoYXNGYWlsZWRPSykKLQkJCQkJCXJldHVybjsKLQkJCQkJCi0JCQkJCWlmICghZXJyb3JPY2N1cnJlZCkKLQkJCQkJCSAvL0dpdmUgc3ViY2xhc3NlcyB0aGUgY2hvaWNlIHRvIHNhdmUgdGhlIHN0YXRlIG9mIHRoZQotCQkJCQkgICAgLy9wcmVmZXJlbmNlIHBhZ2VzLgotCQkJCQkJaGFuZGxlU2F2ZSgpOwotCQkJCQkKLQkJCQkJY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGUjaGFuZGxlRXhjZXB0aW9uKGphdmEubGFuZy5UaHJvd2FibGUpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQkJCWVycm9yT2NjdXJyZWQgPSB0cnVlOwotCQkJCQotCQkJCVBvbGljeS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQb2xpY3kuSkZBQ0UsIDAsIGUudG9TdHJpbmcoKSwgZSkpOwotCi0JCQkJY2xlYXJTZWxlY3RlZE5vZGUoKTsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiU2FmZVJ1bm5hYmxlLmVycm9yTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJFcnJvciIpLCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIHBhZ2UgZGV0ZXJtaW5lZCBieSA8Y29kZT5sYXN0U3VjY2Vzc2Z1bE5vZGU8L2NvZGU+IGluIHRoZQotCSAqIHBhZ2UgaGllcmFyY2h5LgotCSAqLwotCXZvaWQgc2VsZWN0Q3VycmVudFBhZ2VBZ2FpbigpIHsKLQkJaWYgKGxhc3RTdWNjZXNzZnVsTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRUcmVlVmlld2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxhc3RTdWNjZXNzZnVsTm9kZSkpOwotCQljdXJyZW50UGFnZS5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIHNhdmVkIGl0ZW0gaW4gdGhlIHRyZWUgb2YgcHJlZmVyZW5jZSBwYWdlcy4gSWYgaXQgY2Fubm90IGRvCi0JICogdGhpcyBpdCBzYXZlcyB0aGUgZmlyc3Qgb25lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlbGVjdFNhdmVkSXRlbSgpIHsKLQkJSVByZWZlcmVuY2VOb2RlIG5vZGUgPSBmaW5kTm9kZU1hdGNoaW5nKGdldFNlbGVjdGVkTm9kZVByZWZlcmVuY2UoKSk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCUlQcmVmZXJlbmNlTm9kZVtdIG5vZGVzID0gcHJlZmVyZW5jZU1hbmFnZXIuZ2V0Um9vdCgpLmdldFN1Yk5vZGVzKCk7Ci0JCQlpZiAobm9kZXMubGVuZ3RoID4gMCkKLQkJCQlub2RlID0gbm9kZXNbMF07Ci0JCX0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihub2RlKSwgdHJ1ZSk7Ci0JCQkvLyBLZWVwIGZvY3VzIGluIHRyZWUuIFNlZSBidWdzIDI2OTIsIDI2MjEsIGFuZCA2Nzc1LgotCQkJZ2V0VHJlZVZpZXdlcigpLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheSB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS4gVGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgbWVzc2FnZSBpcyBzYXZlZAotCSAqIGFuZCB3aWxsIGJlIHJlZGlzcGxheWVkIHdoZW4gdGhlIGVycm9yIG1lc3NhZ2UgaXMgc2V0IHRvCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG5ld0Vycm9yTWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIGVycm9yTWVzc2FnZSB0byBkaXNwbGF5IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBuZXdFcnJvck1lc3NhZ2UpIHsKLQkJaWYgKG5ld0Vycm9yTWVzc2FnZSA9PSBudWxsKQotCQkJbWVzc2FnZUFyZWEuY2xlYXJFcnJvck1lc3NhZ2UoKTsKLQkJZWxzZQotCQkJbWVzc2FnZUFyZWEudXBkYXRlVGV4dChuZXdFcnJvck1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIGxhc3Qga25vd24gdHJlZSB3aWR0aC4KLQkgKiAKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIHRoZSB3aWR0aC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TGFzdFRyZWVXaWR0aChpbnQgd2lkdGgpIHsKLQkJbGFzdFRyZWVXaWR0aCA9IHdpZHRoOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciBhIEhlbHAgYnV0dG9uIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyBkaWFsb2cuCi0JICogPHA+Ci0JICogQ2xpZW50cyBtdXN0IGNhbGwgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIGJlZm9yZSB0aGUgZGlhbG9nJ3MgY29udHJvbCBoYXMKLQkgKiBiZWVuIGNyZWF0ZWQuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIGluY2x1ZGUgYSBIZWxwIGJ1dHRvbiwgYW5kCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGluY2x1ZGUgb25lICh0aGUgZGVmYXVsdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWxwQXZhaWxhYmxlKGJvb2xlYW4gYikgewotCQlpc0hlbHBBdmFpbGFibGUgPSBiOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbWVzc2FnZSB0ZXh0LiBJZiB0aGUgbWVzc2FnZSBsaW5lIGN1cnJlbnRseSBkaXNwbGF5cyBhbiBlcnJvciwKLQkgKiB0aGUgbWVzc2FnZSBpcyBzdG9yZWQgYW5kIHdpbGwgYmUgc2hvd24gYWZ0ZXIgYSBjYWxsIHRvIGNsZWFyRXJyb3JNZXNzYWdlCi0JICogPHA+Ci0JICogU2hvcnRjdXQgZm9yIDxjb2RlPnNldE1lc3NhZ2UobmV3TWVzc2FnZSwgTk9ORSk8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdNZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gY2xlYXIgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlKSB7Ci0JCXNldE1lc3NhZ2UobmV3TWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXNzYWdlIGZvciB0aGlzIGRpYWxvZyB3aXRoIGFuIGluZGljYXRpb24gb2Ygd2hhdCB0eXBlIG9mCi0JICogbWVzc2FnZSBpdCBpcy4KLQkgKiA8cD4KLQkgKiBUaGUgdmFsaWQgbWVzc2FnZSB0eXBlcyBhcmUgb25lIG9mIDxjb2RlPk5PTkU8L2NvZGU+LAotCSAqIDxjb2RlPklORk9STUFUSU9OPC9jb2RlPiw8Y29kZT5XQVJOSU5HPC9jb2RlPiwgb3IKLQkgKiA8Y29kZT5FUlJPUjwvY29kZT4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYSBtZXNzYWdlIG9mIHR5cGUKLQkgKiA8Y29kZT5FUlJPUjwvY29kZT4gaXMgZGlmZmVyZW50IHRoYW4gYW4gZXJyb3IgbWVzc2FnZSAoc2V0IHVzaW5nCi0JICogPGNvZGU+c2V0RXJyb3JNZXNzYWdlPC9jb2RlPikuIEFuIGVycm9yIG1lc3NhZ2Ugb3ZlcnJpZGVzIHRoZSBjdXJyZW50Ci0JICogbWVzc2FnZSB1bnRpbCB0aGUgZXJyb3IgbWVzc2FnZSBpcyBjbGVhcmVkLiBUaGlzIG1ldGhvZCByZXBsYWNlcyB0aGUKLQkgKiBjdXJyZW50IG1lc3NhZ2UgYW5kIGRvZXMgbm90IGFmZmVjdCB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5ld01lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciB0aGUgbWVzc2FnZQotCSAqIEBwYXJhbSBuZXdUeXBlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0eXBlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UsIGludCBuZXdUeXBlKSB7Ci0JCW1lc3NhZ2VBcmVhLnVwZGF0ZVRleHQobmV3TWVzc2FnZSwgbmV3VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW11bSBwYWdlIHNpemUuCi0JICogCi0JICogQHBhcmFtIG1pbldpZHRoCi0JICogICAgICAgICAgICB0aGUgbWluaW11bSBwYWdlIHdpZHRoCi0JICogQHBhcmFtIG1pbkhlaWdodAotCSAqICAgICAgICAgICAgdGhlIG1pbmltdW0gcGFnZSBoZWlnaHQKLQkgKiBAc2VlICNzZXRNaW5pbXVtUGFnZVNpemUoUG9pbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWluaW11bVBhZ2VTaXplKGludCBtaW5XaWR0aCwgaW50IG1pbkhlaWdodCkgewotCQltaW5pbXVtUGFnZVNpemUueCA9IG1pbldpZHRoOwotCQltaW5pbXVtUGFnZVNpemUueSA9IG1pbkhlaWdodDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbXVtIHBhZ2Ugc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2l6ZQotCSAqICAgICAgICAgICAgdGhlIHBhZ2Ugc2l6ZSBlbmNvZGVkIGFzIDxjb2RlPm5ldyBQb2ludCh3aWR0aCxoZWlnaHQpPC9jb2RlPgotCSAqIEBzZWUgI3NldE1pbmltdW1QYWdlU2l6ZShpbnQsaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbmltdW1QYWdlU2l6ZShQb2ludCBzaXplKSB7Ci0JCW1pbmltdW1QYWdlU2l6ZS54ID0gc2l6ZS54OwotCQltaW5pbXVtUGFnZVNpemUueSA9IHNpemUueTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGZvciB0aGlzIHByZWZlcmVuY2UgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBzdG9yZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAc2VlICNnZXRQcmVmZXJlbmNlU3RvcmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlU3RvcmUoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHN0b3JlKTsKLQkJcHJlZmVyZW5jZVN0b3JlID0gc3RvcmU7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5vZGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkTm9kZSgpIHsKLQkJU3RyaW5nIHN0b3JlVmFsdWUgPSBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJSVByZWZlcmVuY2VOb2RlIG5vZGUgPSAoSVByZWZlcmVuY2VOb2RlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlzdG9yZVZhbHVlID0gbm9kZS5nZXRJZCgpOwotCQl9Ci0JCXNldFNlbGVjdGVkTm9kZVByZWZlcmVuY2Uoc3RvcmVWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgaXRlbSBwcmVmZXJlbmNlLiBQdWJsaWMgZXF1aXZhbGVudCB0bwotCSAqIDxjb2RlPnNldFNlbGVjdGVkTm9kZVByZWZlcmVuY2U8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYWdlSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgcGFnZQotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZE5vZGUoU3RyaW5nIHBhZ2VJZCkgewotCQlzZXRTZWxlY3RlZE5vZGVQcmVmZXJlbmNlKHBhZ2VJZCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgaXRlbSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlSWQKLQkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgcGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNlbGVjdGVkTm9kZVByZWZlcmVuY2UoU3RyaW5nIHBhZ2VJZCkgewotCQlsYXN0UHJlZmVyZW5jZUlkID0gcGFnZUlkOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIHNoZWxsIHNpemUgdG8gdGhlIGdpdmVuIHNpemUsIGVuc3VyaW5nIHRoYXQgaXQgaXMgbm8gbGFyZ2VyCi0JICogdGhhbiB0aGUgZGlzcGxheSBib3VuZHMuCi0JICogCi0JICogQHBhcmFtIHdpZHRoCi0JICogICAgICAgICAgICB0aGUgc2hlbGwgd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogICAgICAgICAgICB0aGUgc2hlbGwgaGVpZ2h0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNoZWxsU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJUmVjdGFuZ2xlIHByZWZlcnJlZCA9IGdldFNoZWxsKCkuZ2V0Qm91bmRzKCk7Ci0JCXByZWZlcnJlZC53aWR0aCA9IHdpZHRoOwotCQlwcmVmZXJyZWQuaGVpZ2h0ID0gaGVpZ2h0OwotCQlnZXRTaGVsbCgpLnNldEJvdW5kcyhnZXRDb25zdHJhaW5lZFNoZWxsQm91bmRzKHByZWZlcnJlZCkpOwotCX0KLQotCS8qKgotCSAqIFNob3dzIHRoZSBwcmVmZXJlbmNlIHBhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSBub2RlLgotCSAqIERvZXMgbm90aGluZyBpZiB0aGF0IHBhZ2UgaXMgYWxyZWFkeSBjdXJyZW50LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFnZSBmbGlwIHdhcyBzdWNjZXNzZnVsLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyB1bnN1Y2Nlc3NmdWwKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93UGFnZShJUHJlZmVyZW5jZU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBDcmVhdGUgdGhlIHBhZ2UgaWYgbmVzc2Vzc2FyeQotCQlpZiAobm9kZS5nZXRQYWdlKCkgPT0gbnVsbCkKLQkJCWNyZWF0ZVBhZ2Uobm9kZSk7Ci0JCWlmIChub2RlLmdldFBhZ2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJUHJlZmVyZW5jZVBhZ2UgbmV3UGFnZSA9IGdldFBhZ2Uobm9kZSk7Ci0JCWlmIChuZXdQYWdlID09IGN1cnJlbnRQYWdlKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChjdXJyZW50UGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAoIWN1cnJlbnRQYWdlLm9rVG9MZWF2ZSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlJUHJlZmVyZW5jZVBhZ2Ugb2xkUGFnZSA9IGN1cnJlbnRQYWdlOwotCQljdXJyZW50UGFnZSA9IG5ld1BhZ2U7Ci0JCS8vIFNldCB0aGUgbmV3IHBhZ2UncyBjb250YWluZXIKLQkJY3VycmVudFBhZ2Uuc2V0Q29udGFpbmVyKHRoaXMpOwotCQkvLyBFbnN1cmUgdGhhdCB0aGUgcGFnZSBjb250cm9sIGhhcyBiZWVuIGNyZWF0ZWQKLQkJLy8gKHRoaXMgYWxsb3dzIGxhenkgcGFnZSBjb250cm9sIGNyZWF0aW9uKQotCQlpZiAoY3VycmVudFBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwpIHsKLQkJCWZpbmFsIGJvb2xlYW5bXSBmYWlsZWQgPSB7IGZhbHNlIH07Ci0JCQlTYWZlUnVubmFibGUucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQkJCQlmYWlsZWRbMF0gPSB0cnVlOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY3JlYXRlUGFnZUNvbnRyb2woY3VycmVudFBhZ2UsIHBhZ2VDb250YWluZXIpOwotCQkJCX0KLQkJCX0pOwotCQkJaWYgKGZhaWxlZFswXSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyB0aGUgcGFnZSBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhlIGNyZWF0ZWQgY29udHJvbCBpcwotCQkJLy8gYWNjZXNzYWJsZQotCQkJLy8gdmlhIGdldENvbnRyb2wuCi0JCQlBc3NlcnQuaXNOb3ROdWxsKGN1cnJlbnRQYWdlLmdldENvbnRyb2woKSk7Ci0JCX0KLQkJLy8gRm9yY2UgY2FsY3VsYXRpb24gb2YgdGhlIHBhZ2UncyBkZXNjcmlwdGlvbiBsYWJlbCBiZWNhdXNlCi0JCS8vIGxhYmVsIGNhbiBiZSB3cmFwcGVkLgotCQlmaW5hbCBQb2ludFtdIHNpemUgPSBuZXcgUG9pbnRbMV07Ci0JCWZpbmFsIFBvaW50IGZhaWxlZCA9IG5ldyBQb2ludCgtMSwgLTEpOwotCQlTYWZlUnVubmFibGUucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCQkJc2l6ZVswXSA9IGZhaWxlZDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNpemVbMF0gPSBjdXJyZW50UGFnZS5jb21wdXRlU2l6ZSgpOwotCQkJfQotCQl9KTsKLQkJaWYgKHNpemVbMF0uZXF1YWxzKGZhaWxlZCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVBvaW50IGNvbnRlbnRTaXplID0gc2l6ZVswXTsKLQkJLy8gRG8gd2UgbmVlZCByZXNpemluZy4gQ29tcHV0YXRpb24gbm90IG5lZWRlZCBpZiB0aGUKLQkJLy8gZmlyc3QgcGFnZSBpcyBpbnNlcnRlZCBzaW5jZSBjb21wdXRpbmcgdGhlIGRpYWxvZydzCi0JCS8vIHNpemUgaXMgZG9uZSBieSBjYWxsaW5nIGRpYWxvZy5vcGVuKCkuCi0JCS8vIEFsc28gcHJldmVudCBhdXRvIHJlc2l6ZSBpZiB0aGUgdXNlciBoYXMgbWFudWFsbHkgcmVzaXplZAotCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCVBvaW50IHNoZWxsU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLQkJaWYgKG9sZFBhZ2UgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBwYWdlQ29udGFpbmVyLmdldENsaWVudEFyZWEoKTsKLQkJCVBvaW50IGNvbnRhaW5lclNpemUgPSBuZXcgUG9pbnQocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJaW50IGhkaWZmID0gY29udGVudFNpemUueCAtIGNvbnRhaW5lclNpemUueDsKLQkJCWludCB2ZGlmZiA9IGNvbnRlbnRTaXplLnkgLSBjb250YWluZXJTaXplLnk7Ci0JCQlpZiAoKGhkaWZmID4gMCB8fCB2ZGlmZiA+IDApICYmIHNoZWxsU2l6ZS5lcXVhbHMobGFzdFNoZWxsU2l6ZSkpIHsKLQkJCQkJaGRpZmYgPSBNYXRoLm1heCgwLCBoZGlmZik7Ci0JCQkJCXZkaWZmID0gTWF0aC5tYXgoMCwgdmRpZmYpOwotCQkJCQlzZXRTaGVsbFNpemUoc2hlbGxTaXplLnggKyBoZGlmZiwgc2hlbGxTaXplLnkgKyB2ZGlmZik7Ci0JCQkJCWxhc3RTaGVsbFNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0JCQkJCWlmIChjdXJyZW50UGFnZS5nZXRDb250cm9sKCkuZ2V0U2l6ZSgpLnggPT0gMCkKLQkJCQkJCWN1cnJlbnRQYWdlLmdldENvbnRyb2woKS5zZXRTaXplKGNvbnRhaW5lclNpemUpOwotCQkJCQotCQkJfSBlbHNlIC8vU2V0IHRoZSBzaXplIHRvIGJlIHN1cmUgd2UgdXNlIHRoZSByZXN1bHQgb2YgY29tcHV0ZVNpemUKLQkJCQljdXJyZW50UGFnZS5zZXRTaXplKGNvbnRhaW5lclNpemUpOwotCQl9Ci0JCS8vIEVuc3VyZSB0aGF0IGFsbCBvdGhlciBwYWdlcyBhcmUgaW52aXNpYmxlCi0JCS8vIChpbmNsdWRpbmcgb25lcyB0aGF0IHRyaWdnZXJlZCBhbiBleGNlcHRpb24gZHVyaW5nCi0JCS8vIHRoZWlyIGNyZWF0aW9uKS4KLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gcGFnZUNvbnRhaW5lci5nZXRDaGlsZHJlbigpOwotCQlDb250cm9sIGN1cnJlbnRDb250cm9sID0gY3VycmVudFBhZ2UuZ2V0Q29udHJvbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW5baV0gIT0gY3VycmVudENvbnRyb2wpCi0JCQkJY2hpbGRyZW5baV0uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQkJLy8gTWFrZSB0aGUgbmV3IHBhZ2UgdmlzaWJsZQotCQljdXJyZW50UGFnZS5zZXRWaXNpYmxlKHRydWUpOwotCQlpZiAob2xkUGFnZSAhPSBudWxsKQotCQkJb2xkUGFnZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJLy8gdXBkYXRlIHRoZSBkaWFsb2cgY29udHJvbHMKLQkJdXBkYXRlKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgcGFnZSBmb3IgdGhlIG5vZGUuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFnZShJUHJlZmVyZW5jZU5vZGUgbm9kZSkgewotCQlub2RlLmNyZWF0ZVBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHBhZ2UgZm9yIHRoZSBub2RlLgotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBJUHJlZmVyZW5jZVBhZ2UKLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlUGFnZSBnZXRQYWdlKElQcmVmZXJlbmNlTm9kZSBub2RlKSB7Ci0JCXJldHVybiBub2RlLmdldFBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG93cyB0aGUgIlBhZ2UgRmxpcHBpbmcgYWJvcnQiIGRpYWxvZy4KLQkgKi8KLQl2b2lkIHNob3dQYWdlRmxpcHBpbmdBYm9ydERpYWxvZygpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgSkZhY2VSZXNvdXJjZXMKLQkJCQkuZ2V0U3RyaW5nKCJBYm9ydFBhZ2VGbGlwcGluZ0RpYWxvZy50aXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJBYm9ydFBhZ2VGbGlwcGluZ0RpYWxvZy5tZXNzYWdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGlzIGRpYWxvZydzIGNvbnRyb2xzIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgdGl0bGUgYmFyCi0JCXVwZGF0ZVRpdGxlKCk7Ci0JCS8vIFVwZGF0ZSB0aGUgbWVzc2FnZSBsaW5lCi0JCXVwZGF0ZU1lc3NhZ2UoKTsKLQkJLy8gVXBkYXRlIHRoZSBidXR0b25zCi0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJLy9TYXZlZCB0aGUgc2VsZWN0ZWQgbm9kZSBpbiB0aGUgcHJlZmVyZW5jZXMKLQkJc2V0U2VsZWN0ZWROb2RlKCk7Ci0JCWZpcmVQYWdlQ2hhbmdlZChuZXcgUGFnZUNoYW5nZWRFdmVudCh0aGlzLCBnZXRDdXJyZW50UGFnZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZUNvbnRhaW5lciN1cGRhdGVCdXR0b25zKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQlva0J1dHRvbi5zZXRFbmFibGVkKGlzQ3VycmVudFBhZ2VWYWxpZCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlQ29udGFpbmVyI3VwZGF0ZU1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU1lc3NhZ2UoKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCWlmKGN1cnJlbnRQYWdlICE9IG51bGwpewotCQkJbWVzc2FnZSA9IGN1cnJlbnRQYWdlLmdldE1lc3NhZ2UoKTsKLQkJCWVycm9yTWVzc2FnZSA9IGN1cnJlbnRQYWdlLmdldEVycm9yTWVzc2FnZSgpOwotCQl9Ci0JCWludCBtZXNzYWdlVHlwZSA9IElNZXNzYWdlUHJvdmlkZXIuTk9ORTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBjdXJyZW50UGFnZSBpbnN0YW5jZW9mIElNZXNzYWdlUHJvdmlkZXIpCi0JCQltZXNzYWdlVHlwZSA9ICgoSU1lc3NhZ2VQcm92aWRlcikgY3VycmVudFBhZ2UpLmdldE1lc3NhZ2VUeXBlKCk7Ci0KLQkJaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsKXsKLQkJCWlmIChzaG93aW5nRXJyb3IpIHsKLQkJCQkvLyB3ZSB3ZXJlIHByZXZpb3VzbHkgc2hvd2luZyBhbiBlcnJvcgotCQkJCXNob3dpbmdFcnJvciA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJbWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQkJCW1lc3NhZ2VUeXBlID0gSU1lc3NhZ2VQcm92aWRlci5FUlJPUjsKLQkJCWlmICghc2hvd2luZ0Vycm9yKSB7Ci0JCQkJLy8gd2Ugd2VyZSBub3QgcHJldmlvdXNseSBzaG93aW5nIGFuIGVycm9yCi0JCQkJc2hvd2luZ0Vycm9yID0gdHJ1ZTsKLQkJCX0KLQkJfSAgCi0JCW1lc3NhZ2VBcmVhLnVwZGF0ZVRleHQobWVzc2FnZSxtZXNzYWdlVHlwZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZUNvbnRhaW5lciN1cGRhdGVUaXRsZSgpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVGl0bGUoKSB7Ci0JCWlmKGN1cnJlbnRQYWdlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1lc3NhZ2VBcmVhLnNob3dUaXRsZShjdXJyZW50UGFnZS5nZXRUaXRsZSgpLCBjdXJyZW50UGFnZS5nZXRJbWFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHRyZWUgdG8gdXNlIHRoZSBzcGVjaWZpZWQgPGNvZGU+Rm9udDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGRpYWxvZ0ZvbnQKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5Gb250PC9jb2RlPiB0byB1c2UuCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRyZWVGb250KEZvbnQgZGlhbG9nRm9udCkgewotCQlnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldEZvbnQoZGlhbG9nRm9udCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudFBhZ2UuCi0JICogQHJldHVybiBJUHJlZmVyZW5jZVBhZ2UKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlUGFnZSBnZXRDdXJyZW50UGFnZSgpIHsKLQkJcmV0dXJuIGN1cnJlbnRQYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgcGFnZS4KLQkgKiBAcGFyYW0gY3VycmVudFBhZ2UKLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VycmVudFBhZ2UoSVByZWZlcmVuY2VQYWdlIGN1cnJlbnRQYWdlKSB7Ci0JCXRoaXMuY3VycmVudFBhZ2UgPSBjdXJyZW50UGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRyZWVWaWV3ZXIuCi0JICogQHBhcmFtIHRyZWVWaWV3ZXIKLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHJlZVZpZXdlcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJdGhpcy50cmVlVmlld2VyID0gdHJlZVZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbXBvc2l0ZSB0aGF0IGlzIHNob3dpbmcgdGhlIHBhZ2UuCi0JICoKLQkgKiBAcmV0dXJuIENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBnZXRQYWdlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5wYWdlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY29tcG9zaXRlIHRoYXQgaXMgc2hvd2luZyB0aGUgcGFnZS4KLQkgKiBAcGFyYW0gcGFnZUNvbnRhaW5lciBDb21wb3NpdGUKLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGFnZUNvbnRhaW5lcihDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQl0aGlzLnBhZ2VDb250YWluZXIgPSBwYWdlQ29udGFpbmVyOwotCX0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHBhZ2UgY29udHJvbCBmb3IgdGhlIHN1cHBsaWVkIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHBhZ2UgLSB0aGUgcHJlZmVyZW5jZSBwYWdlIHRvIGJlIHNob3duCi0JICogQHBhcmFtIHBhcmVudCAtIHRoZSBjb21wb3NpdGUgdG8gcGFyZW50IHRoZSBwYWdlCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhZ2VDb250cm9sKElQcmVmZXJlbmNlUGFnZSBwYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXBhZ2UuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSVBhZ2VDaGFuZ2VQcm92aWRlciNnZXRTZWxlY3RlZFBhZ2UoKQotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkUGFnZSgpIHsKLQkJCXJldHVybiBnZXRDdXJyZW50UGFnZSgpOwotCQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklQYWdlQ2hhbmdlUHJvdmlkZXIjYWRkUGFnZUNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklQYWdlQ2hhbmdlZExpc3RlbmVyKQotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlQ2hhbmdlZExpc3RlbmVyKElQYWdlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXBhZ2VDaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JUGFnZUNoYW5nZVByb3ZpZGVyI3JlbW92ZVBhZ2VDaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JUGFnZUNoYW5nZWRMaXN0ZW5lcikKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGFnZUNoYW5nZWRMaXN0ZW5lcihJUGFnZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlwYWdlQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQkKLQl9Ci0KLQkvKioKLSAgICAgKiBOb3RpZmllcyBhbnkgc2VsZWN0aW9uIGNoYW5nZWQgbGlzdGVuZXJzIHRoYXQgdGhlIHNlbGVjdGVkIHBhZ2UKLSAgICAgKiBoYXMgY2hhbmdlZC4KLSAgICAgKiBPbmx5IGxpc3RlbmVycyByZWdpc3RlcmVkIGF0IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcmUgbm90aWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudAotICAgICAqCi0gICAgICogQHNlZSBJUGFnZUNoYW5nZWRMaXN0ZW5lciNwYWdlQ2hhbmdlZAotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlUGFnZUNoYW5nZWQoZmluYWwgUGFnZUNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnMgPSBwYWdlQ2hhbmdlZExpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIElQYWdlQ2hhbmdlZExpc3RlbmVyIGwgPSAoSVBhZ2VDaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLSAgICAgICAgICAgIFNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGwucGFnZUNoYW5nZWQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1ZmQ1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogUHJvdmlkZXMgbGFiZWxzIGZvciA8Y29kZT5JUHJlZmVyZW5jZU5vZGU8L2NvZGU+IG9iamVjdHMuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZWxlbWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIDxjb2RlPklQcmVmZXJlbmNlTm9kZTwvY29kZT4uCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuICgoSVByZWZlcmVuY2VOb2RlKSBlbGVtZW50KS5nZXRMYWJlbFRleHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZWxlbWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIDxjb2RlPklQcmVmZXJlbmNlTm9kZTwvY29kZT4uCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiAoKElQcmVmZXJlbmNlTm9kZSkgZWxlbWVudCkuZ2V0TGFiZWxJbWFnZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ1MDVmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBBIHByZWZlcmVuY2UgbWFuYWdlciBtYWludGFpbnMgYSBoaWVyYXJjaHkgb2YgcHJlZmVyZW5jZSBub2RlcyBhbmQKLSAqIGFzc29jaWF0ZWQgcHJlZmVyZW5jZSBwYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VNYW5hZ2VyIHsKLSAgICAvKioKLSAgICAgKiBQcmUtb3JkZXIgdHJhdmVyc2FsIG1lYW5zIHZpc2l0IHRoZSByb290IGZpcnN0LAotICAgICAqIHRoZW4gdGhlIGNoaWxkcmVuLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9PUkRFUiA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBQb3N0LW9yZGVyIG1lYW5zIHZpc2l0IHRoZSBjaGlsZHJlbiwgYW5kIHRoZW4gdGhlIHJvb3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9PUkRFUiA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcm9vdCBub2RlLgotICAgICAqIE5vdGUgdGhhdCB0aGUgcm9vdCBub2RlIGlzIGEgc3BlY2lhbCBpbnRlcm5hbCBub2RlCi0gICAgICogdGhhdCBpcyB1c2VkIHRvIGNvbGxlY3QgdG9nZXRoZXIgYWxsIHRoZSBub2RlcyB0aGF0Ci0gICAgICogaGF2ZSBubyBwYXJlbnQ7IGl0IGlzIG5vdCBnaXZlbiBvdXQgdG8gY2xpZW50cy4KLSAgICAgKi8KLSAgICBQcmVmZXJlbmNlTm9kZSByb290ID0gbmV3IFByZWZlcmVuY2VOb2RlKCIiKTsvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVyLgotICAgICAqLwotICAgIFN0cmluZyBzZXBhcmF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHByZWZlcmVuY2UgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJlZmVyZW5jZU1hbmFnZXIoKSB7Ci0gICAgICAgIHRoaXMoJy4nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHByZWZlcmVuY2UgbWFuYWdlciB3aXRoIHRoZSBnaXZlbgotICAgICAqIHRoZSBwYXRoIHNlcGFyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXBhcmF0b3JDaGFyIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyCi0gICAgICovCi0gICAgcHVibGljIFByZWZlcmVuY2VNYW5hZ2VyKGNoYXIgc2VwYXJhdG9yQ2hhcikgewotICAgICAgICBzZXBhcmF0b3IgPSBuZXcgU3RyaW5nKG5ldyBjaGFyW10geyBzZXBhcmF0b3JDaGFyIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIHByZWZlcmVuY2Ugbm9kZSBhcyBhIHN1Ym5vZGUgb2YgdGhlCi0gICAgICogbm9kZSBhdCB0aGUgZ2l2ZW4gcGF0aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gYWRkCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYWRkIHdhcyBzdWNjZXNzZnVsLAotICAgICAqICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGNvbnRyaWJ1dGlvbiBhdAotICAgICAqICB0aGUgZ2l2ZW4gcGF0aAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZFRvKFN0cmluZyBwYXRoLCBJUHJlZmVyZW5jZU5vZGUgbm9kZSkgewotICAgICAgICBJUHJlZmVyZW5jZU5vZGUgdGFyZ2V0ID0gZmluZChwYXRoKTsKLSAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB0YXJnZXQuYWRkKG5vZGUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiBwcmVmZXJlbmNlIG5vZGUgYXMgYSBzdWJub2RlIG9mIHRoZQotICAgICAqIHJvb3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBhZGQsIHdoaWNoIG11c3QgaW1wbGVtZW50IAotICAgICAqICAgPGNvZGU+SVByZWZlcmVuY2VOb2RlPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFRvUm9vdChJUHJlZmVyZW5jZU5vZGUgbm9kZSkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotICAgICAgICByb290LmFkZChub2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWN1cnNpdmVseSBlbnVtZXJhdGVzIGFsbCBub2RlcyBhdCBvciBiZWxvdyB0aGUgZ2l2ZW4gbm9kZQotICAgICAqIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGdpdmVuIGxpc3QgaW4gdGhlIGdpdmVuIG9yZGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBub2RlIHRoZSBzdGFydGluZyBub2RlCi0gICAgICogQHBhcmFtIHNlcXVlbmNlIGEgcmVhZC13cml0ZSBsaXN0IG9mIHByZWZlcmVuY2Ugbm9kZXMKLSAgICAgKiAgKGVsZW1lbnQgdHlwZTogPGNvZGU+SVByZWZlcmVuY2VOb2RlPC9jb2RlPikKLSAgICAgKiAgaW4gdGhlIGdpdmVuIG9yZGVyCi0gICAgICogQHBhcmFtIG9yZGVyIHRoZSB0cmF2ZXJzYWwgb3JkZXIsIG9uZSBvZiAKLSAgICAgKgk8Y29kZT5QUkVfT1JERVI8L2NvZGU+IGFuZCA8Y29kZT5QT1NUX09SREVSPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGJ1aWxkU2VxdWVuY2UoSVByZWZlcmVuY2VOb2RlIG5vZGUsIExpc3Qgc2VxdWVuY2UsIGludCBvcmRlcikgewotICAgICAgICBpZiAob3JkZXIgPT0gUFJFX09SREVSKQotICAgICAgICAgICAgc2VxdWVuY2UuYWRkKG5vZGUpOwotICAgICAgICBJUHJlZmVyZW5jZU5vZGVbXSBzdWJub2RlcyA9IG5vZGUuZ2V0U3ViTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJub2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYnVpbGRTZXF1ZW5jZShzdWJub2Rlc1tpXSwgc2VxdWVuY2UsIG9yZGVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob3JkZXIgPT0gUE9TVF9PUkRFUikKLSAgICAgICAgICAgIHNlcXVlbmNlLmFkZChub2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyBhbmQgcmV0dXJucyB0aGUgY29udHJpYnV0aW9uIG5vZGUgYXQgdGhlIGdpdmVuIHBhdGguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotICAgICAqIEByZXR1cm4gdGhlIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgSVByZWZlcmVuY2VOb2RlIGZpbmQoU3RyaW5nIHBhdGgpIHsKLSAgICAgICByZXR1cm4gZmluZChwYXRoLHJvb3QpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGaW5kcyBhbmQgcmV0dXJucyB0aGUgcHJlZmVyZW5jZSBub2RlIGRpcmVjdGx5Ci0gICAgICogYmVsb3cgdGhlIHRvcCBhdCB0aGUgZ2l2ZW4gcGF0aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0gICAgICogQHJldHVybiB0aGUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVByZWZlcmVuY2VOb2RlIGZpbmQoU3RyaW5nIHBhdGgsSVByZWZlcmVuY2VOb2RlIHRvcCl7Ci0gICAgCSBBc3NlcnQuaXNOb3ROdWxsKHBhdGgpOwotICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgsIHNlcGFyYXRvcik7Ci0gICAgICAgICBJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IHRvcDsKLSAgICAgICAgIHdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgIFN0cmluZyBpZCA9IHN0b2submV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgbm9kZSA9IG5vZGUuZmluZFN1Yk5vZGUoaWQpOwotICAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpCi0gICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgfQotICAgICAgICAgaWYgKG5vZGUgPT0gdG9wKQotICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgcHJlZmVyZW5jZSBub2RlcyBtYW5hZ2VkIGJ5IHRoaXMKLSAgICAgKiBtYW5hZ2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIG9yZGVyIHRoZSB0cmF2ZXJzYWwgb3JkZXIsIG9uZSBvZiAKLSAgICAgKgk8Y29kZT5QUkVfT1JERVI8L2NvZGU+IGFuZCA8Y29kZT5QT1NUX09SREVSPC9jb2RlPgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHByZWZlcmVuY2Ugbm9kZXMKLSAgICAgKiAgKGVsZW1lbnQgdHlwZTogPGNvZGU+SVByZWZlcmVuY2VOb2RlPC9jb2RlPikKLSAgICAgKiAgaW4gdGhlIGdpdmVuIG9yZGVyCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0RWxlbWVudHMoaW50IG9yZGVyKSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUob3JkZXIgPT0gUFJFX09SREVSIHx8IG9yZGVyID09IFBPU1RfT1JERVIsCi0gICAgICAgICAgICAgICAgImludmFsaWQgdHJhdmVyc2FsIG9yZGVyIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBBcnJheUxpc3Qgc2VxdWVuY2UgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIElQcmVmZXJlbmNlTm9kZVtdIHN1Ym5vZGVzID0gZ2V0Um9vdCgpLmdldFN1Yk5vZGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vibm9kZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBidWlsZFNlcXVlbmNlKHN1Ym5vZGVzW2ldLCBzZXF1ZW5jZSwgb3JkZXIpOwotICAgICAgICByZXR1cm4gc2VxdWVuY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcm9vdCBub2RlLgotICAgICAqIE5vdGUgdGhhdCB0aGUgcm9vdCBub2RlIGlzIGEgc3BlY2lhbCBpbnRlcm5hbCBub2RlCi0gICAgICogdGhhdCBpcyB1c2VkIHRvIGNvbGxlY3QgdG9nZXRoZXIgYWxsIHRoZSBub2RlcyB0aGF0Ci0gICAgICogaGF2ZSBubyBwYXJlbnQ7IGl0IGlzIG5vdCBnaXZlbiBvdXQgdG8gY2xpZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJvb3Qgbm9kZQotICAgICAqLwotICAgIHByb3RlY3RlZCBJUHJlZmVyZW5jZU5vZGUgZ2V0Um9vdCgpIHsKLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgcHJlZmVybmVjZSBub2RlIGF0IHRoZSBnaXZlbiBwYXRoLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLSAgICAgKiBAcmV0dXJuIHRoZSBub2RlIHRoYXQgd2FzIHJlbW92ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogIGlmIHRoZXJlIHdhcyBubyBub2RlIGF0IHRoZSBnaXZlbiBwYXRoCi0gICAgICovCi0gICAgcHVibGljIElQcmVmZXJlbmNlTm9kZSByZW1vdmUoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChwYXRoKTsKLSAgICAgICAgaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpOwotICAgICAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gcm9vdC5yZW1vdmUocGF0aCk7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIGlzbid0IHRoZSAiLiIKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZShpbmRleCA8IHBhdGgubGVuZ3RoKCkgLSAxLCAiUGF0aCBjYW4gbm90IGVuZCB3aXRoIGEgZG90Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgcGFyZW50UGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgU3RyaW5nIGlkID0gcGF0aC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgSVByZWZlcmVuY2VOb2RlIHBhcmVudE5vZGUgPSBmaW5kKHBhcmVudFBhdGgpOwotICAgICAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBwYXJlbnROb2RlLnJlbW92ZShpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcHJlZnJlZW5jZSBub2RlIGlmIGl0IGlzIG1hbmFnZWQgYnkKLSAgICAgKiB0aGlzIGNvbnRyaWJ1dGlvbiBtYW5hZ2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbm9kZSB3YXMgcmVtb3ZlZCwKLSAgICAgKiAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoSVByZWZlcmVuY2VOb2RlIG5vZGUpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotICAgICAgICByZXR1cm4gcm9vdC5yZW1vdmUobm9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgY29udHJpYnV0aW9uIG5vZGVzIGtub3duIHRvIHRoaXMgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0gICAgICAgIHJvb3QgPSBuZXcgUHJlZmVyZW5jZU5vZGUoIiIpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTZhYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9QcmVmZXJlbmNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG5vZGUgaW4gYSBwcmVmZXJlbmNlIGRpYWxvZyB0cmVlLiBUaGlzIGNsYXNzCi0gKiBhbHNvIHN1cHBvcnRzIGxhenkgY3JlYXRpb24gb2YgdGhlIG5vZGUncyBwcmVmZXJlbmNlIHBhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlTm9kZSBpbXBsZW1lbnRzIElQcmVmZXJlbmNlTm9kZSB7Ci0gICAgLyoqCi0gICAgICogUHJlZmVyZW5jZSBwYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgeWV0IGxvYWRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElQcmVmZXJlbmNlUGFnZSBwYWdlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3Qgb2Ygc3Vibm9kZXMgKGltbWVkaWF0ZSBjaGlsZHJlbikgb2YgdGhpcyBub2RlIChlbGVtZW50IHR5cGU6Ci0gICAgICogPGNvZGU+SVByZWZlcmVuY2VOb2RlPC9jb2RlPikuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IHN1Yk5vZGVzOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiBjbGFzcyB0aGF0IGltcGxlbWVudHMgPGNvZGU+SVByZWZlcmVuY2VOb2RlPC9jb2RlPiwgb3IKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzbmFtZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBpZCBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBUZXh0IGxhYmVsIGZvciB0aGlzIG5vZGUuIE5vdGUgdGhhdCB0aGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBwcmlvciB0byB0aGUKLSAgICAgKiBjcmVhdGlvbiBvZiB0aGUgcHJlZmVyZW5jZSBwYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsOwotCi0gICAgLyoqCi0gICAgICogSW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqLwotICAgIHByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcjsKLQotICAgIC8qKgotICAgICAqIENhY2hlZCBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEltYWdlIGltYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBwcmVmZXJlbmNlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gaWQuIFRoZSBuZXcgbm9kZSBoYXMgbm8KLSAgICAgKiBzdWJub2Rlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBub2RlIGlkCi0gICAgICovCi0gICAgcHVibGljIFByZWZlcmVuY2VOb2RlKFN0cmluZyBpZCkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGlkKTsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwcmVmZXJlbmNlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gaWQsIGxhYmVsLCBhbmQgaW1hZ2UsIGFuZAotICAgICAqIGxhemlseS1sb2FkZWQgcHJlZmVyZW5jZSBwYWdlLiBUaGUgcHJlZmVyZW5jZSBub2RlIGFzc3VtZXMgKHNvbGUpCi0gICAgICogcmVzcG9uc2liaWxpdHkgZm9yIGRpc3Bvc2luZyBvZiB0aGUgaW1hZ2U7IHRoaXMgd2lsbCBoYXBwZW4gd2hlbiB0aGUgbm9kZQotICAgICAqIGlzIGRpc3Bvc2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZAotICAgICAqICAgICAgICAgICAgdGhlIG5vZGUgaWQKLSAgICAgKiBAcGFyYW0gbGFiZWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBsYWJlbCB1c2VkIHRvIGRpc3BsYXkgdGhlIG5vZGUgaW4gdGhlIHByZWZlcmVuY2UgZGlhbG9nJ3MKLSAgICAgKiAgICAgICAgICAgIHRyZWUKLSAgICAgKiBAcGFyYW0gaW1hZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkaXNwbGF5ZWQgbGVmdCBvZiB0aGUgbGFiZWwgaW4gdGhlIHByZWZlcmVuY2UKLSAgICAgKiAgICAgICAgICAgIGRpYWxvZydzIHRyZWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSBwYWdlOyB0aGlzIGNsYXNzIG11c3QKLSAgICAgKiAgICAgICAgICAgIGltcGxlbWVudCA8Y29kZT5JUHJlZmVyZW5jZVBhZ2U8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFByZWZlcmVuY2VOb2RlKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UsCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMoaWQpOwotICAgICAgICB0aGlzLmltYWdlRGVzY3JpcHRvciA9IGltYWdlOwotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGxhYmVsKTsKLSAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICB0aGlzLmNsYXNzbmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcHJlZmVyZW5jZSBub2RlIHdpdGggdGhlIGdpdmVuIGlkIGFuZCBwcmVmZXJlbmNlIHBhZ2UuIFRoZQotICAgICAqIHRpdGxlIG9mIHRoZSBwcmVmZXJlbmNlIHBhZ2UgaXMgdXNlZCBmb3IgdGhlIG5vZGUgbGFiZWwuIFRoZSBub2RlIHdpbGwKLSAgICAgKiBub3QgaGF2ZSBhbiBpbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBub2RlIGlkCi0gICAgICogQHBhcmFtIHByZWZlcmVuY2VQYWdlCi0gICAgICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAgICovCi0gICAgcHVibGljIFByZWZlcmVuY2VOb2RlKFN0cmluZyBpZCwgSVByZWZlcmVuY2VQYWdlIHByZWZlcmVuY2VQYWdlKSB7Ci0gICAgICAgIHRoaXMoaWQpOwotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHByZWZlcmVuY2VQYWdlKTsKLSAgICAgICAgcGFnZSA9IHByZWZlcmVuY2VQYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VOb2RlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChJUHJlZmVyZW5jZU5vZGUgbm9kZSkgewotICAgICAgICBpZiAoc3ViTm9kZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHN1Yk5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBzdWJOb2Rlcy5hZGQobm9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MgPGNvZGU+Y2xhc3NOYW1lPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHJldHVybiBuZXcgT2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2Ugb2YgZmFpbHVyZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlT2JqZWN0KFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChjbGFzc05hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2wgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAoY2wgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY2wubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZU5vZGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFnZSgpIHsKLSAgICAgICAgcGFnZSA9IChJUHJlZmVyZW5jZVBhZ2UpIGNyZWF0ZU9iamVjdChjbGFzc25hbWUpOwotICAgICAgICBpZiAoZ2V0TGFiZWxJbWFnZSgpICE9IG51bGwpCi0gICAgICAgICAgICBwYWdlLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3IpOwotICAgICAgICBwYWdlLnNldFRpdGxlKGxhYmVsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZU5vZGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZVJlc291cmNlcygpIHsKLSAgICAgICAgaWYgKGltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGltYWdlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHBhZ2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udHJpYnV0aW9uTm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVByZWZlcmVuY2VOb2RlIGZpbmRTdWJOb2RlKFN0cmluZyBpZCkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGlkKTsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZShpZC5sZW5ndGgoKSA+IDApOwotICAgICAgICBpZiAoc3ViTm9kZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpbnQgc2l6ZSA9IHN1Yk5vZGVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIElQcmVmZXJlbmNlTm9kZSBub2RlID0gKElQcmVmZXJlbmNlTm9kZSkgc3ViTm9kZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhub2RlLmdldElkKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VOb2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoaXMgbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZU5vZGUuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldExhYmVsSW1hZ2UoKSB7Ci0gICAgICAgIGlmIChpbWFnZSA9PSBudWxsICYmIGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbWFnZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlTm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYWdlLmdldFRpdGxlKCk7Ci0gICAgICAgIHJldHVybiBsYWJlbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlTm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVByZWZlcmVuY2VQYWdlIGdldFBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBwYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VOb2RlLgotICAgICAqLwotICAgIHB1YmxpYyBJUHJlZmVyZW5jZU5vZGVbXSBnZXRTdWJOb2RlcygpIHsKLSAgICAgICAgaWYgKHN1Yk5vZGVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV3IElQcmVmZXJlbmNlTm9kZVswXTsKLSAgICAgICAgcmV0dXJuIChJUHJlZmVyZW5jZU5vZGVbXSkgc3ViTm9kZXMKLSAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgSVByZWZlcmVuY2VOb2RlW3N1Yk5vZGVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VOb2RlLgotICAgICAqLwotICAgIHB1YmxpYyBJUHJlZmVyZW5jZU5vZGUgcmVtb3ZlKFN0cmluZyBpZCkgewotICAgICAgICBJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IGZpbmRTdWJOb2RlKGlkKTsKLSAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlbW92ZShub2RlKTsKLSAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZU5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKElQcmVmZXJlbmNlTm9kZSBub2RlKSB7Ci0gICAgICAgIGlmIChzdWJOb2RlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gc3ViTm9kZXMucmVtb3ZlKG5vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY3VycmVudCBwYWdlIHRvIGJlIG5ld1BhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5ld1BhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlKElQcmVmZXJlbmNlUGFnZSBuZXdQYWdlKSB7Ci0gICAgICAgIHBhZ2UgPSBuZXdQYWdlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlY2ZmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCSAgIFNlYmFzdGlhbiBEYXZpZHMgPHNkYXZpZHNAZ214LmRlPiAtIEZpeCBmb3IgYnVnIDM4NzI5IC0gW1ByZWZlcmVuY2VzXQotICogCQkJIE5QRSBQcmVmZXJlbmNlUGFnZSBpc1ZhbGlkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIHByZWZlcmVuY2UgcGFnZSBpbXBsZW1lbnRhdGlvbnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIDxjb2RlPmNyZWF0ZUNvbnRyb2w8L2NvZGU+IGZyYW1ld29yawotICogbWV0aG9kIHRvIHN1cHBseSB0aGUgcGFnZSdzIG1haW4gY29udHJvbC4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBzaG91bGQgZXh0ZW5kIHRoZSA8Y29kZT5kb0NvbXB1dGVTaXplPC9jb2RlPiBmcmFtZXdvcmsKLSAqIG1ldGhvZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSBwYWdlJ3MgY29udHJvbC4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhlIDxjb2RlPnBlcmZvcm1PazwvY29kZT4sIDxjb2RlPnBlcmZvcm1BcHBseTwvY29kZT4sIAotICogPGNvZGU+cGVyZm9ybURlZmF1bHRzPC9jb2RlPiwgPGNvZGU+cGVyZm9ybUNhbmNlbDwvY29kZT4sIGFuZCA8Y29kZT5wZXJmb3JtSGVscDwvY29kZT4KLSAqIGZyYW1ld29yayBtZXRob2RzIHRvIHJlYWN0IHRvIHRoZSBzdGFuZGFyZCBidXR0b24gZXZlbnRzLgotICogPC9wPgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG1heSBjYWxsIHRoZSA8Y29kZT5ub0RlZmF1bHRBbmRBcHBseUJ1dHRvbjwvY29kZT4gZnJhbWV3b3JrCi0gKiBtZXRob2QgYmVmb3JlIHRoZSBwYWdlJ3MgY29udHJvbCBoYXMgYmVlbiBjcmVhdGVkIHRvIHN1cHByZXNzCi0gKiB0aGUgc3RhbmRhcmQgQXBwbHkgYW5kIERlZmF1bHRzIGJ1dHRvbnMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcmVmZXJlbmNlUGFnZSBleHRlbmRzIERpYWxvZ1BhZ2UgaW1wbGVtZW50cwotICAgICAgICBJUHJlZmVyZW5jZVBhZ2UgewotCi0gICAgLyoqCi0gICAgICogUHJlZmVyZW5jZSBzdG9yZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZTsKLQotICAgIC8qKgotICAgICAqIFZhbGlkIHN0YXRlIGZvciB0aGlzIHBhZ2U7IDxjb2RlPnRydWU8L2NvZGU+IGJ5IGRlZmF1bHQuCi0gICAgICoKLSAgICAgKiBAc2VlICNpc1ZhbGlkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogQm9keSBvZiBwYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgQ29udHJvbCBib2R5OwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGlzIHBhZ2UgaGFzIHRoZSBzdGFuZGFyZCBBcHBseSBhbmQgRGVmYXVsdHMgYnV0dG9uczsgCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gYnkgZGVmYXVsdC4KLSAgICAgKgotICAgICAqIEBzZWUgI25vRGVmYXVsdEFuZEFwcGx5QnV0dG9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZURlZmF1bHRBbmRBcHBseUJ1dHRvbiA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFuZGFyZCBEZWZhdWx0cyBidXR0b24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICogVGhpcyBidXR0b24gaGFzIGlkIDxjb2RlPkRFRkFVTFRTX0lEPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIEJ1dHRvbiBkZWZhdWx0c0J1dHRvbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29udGFpbmVyIHRoaXMgcHJlZmVyZW5jZSBwYWdlIGJlbG9uZ3MgdG87IDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElQcmVmZXJlbmNlUGFnZUNvbnRhaW5lciBjb250YWluZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogU3RhbmRhcmQgQXBwbHkgYnV0dG9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqIFRoaXMgYnV0dG9uIGhhcyBpZCA8Y29kZT5BUFBMWV9JRDwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBCdXR0b24gYXBwbHlCdXR0b24gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogRGVzY3JpcHRpb24gbGFiZWwuCi0gICAgICogCi0gICAgICogQHNlZSAjY3JlYXRlRGVzY3JpcHRpb25MYWJlbChDb21wb3NpdGUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBMYWJlbCBkZXNjcmlwdGlvbkxhYmVsOwotCi0gICAgLyoqCi0gICAgICogQ2FjaGVzIHNpemUgb2YgcGFnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFBvaW50IHNpemUgPSBudWxsOwotCi0gICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHByZWZlcmVuY2UgcGFnZSB3aXRoIGFuIGVtcHR5IHRpdGxlIGFuZCBubyBpbWFnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHJlZmVyZW5jZVBhZ2UoKSB7Ci0gICAgICAgIHRoaXMoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBwcmVmZXJlbmNlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gdGl0bGUgYW5kIG5vIGltYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpdGxlIHRoZSB0aXRsZSBvZiB0aGlzIHByZWZlcmVuY2UgcGFnZQotICAgICAqLwotICAgIHByb3RlY3RlZCBQcmVmZXJlbmNlUGFnZShTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgc3VwZXIodGl0bGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWJzdHJhY3QgcHJlZmVyZW5jZSBwYWdlIHdpdGggdGhlIGdpdmVuIHRpdGxlIGFuZCBpbWFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUgb2YgdGhpcyBwcmVmZXJlbmNlIHBhZ2UKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlIGZvciB0aGlzIHByZWZlcmVuY2UgcGFnZSwKLSAgICAgKiAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHByb3RlY3RlZCBQcmVmZXJlbmNlUGFnZShTdHJpbmcgdGl0bGUsIEltYWdlRGVzY3JpcHRvciBpbWFnZSkgewotICAgICAgICBzdXBlcih0aXRsZSwgaW1hZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGVzIHRoZSBzaXplIGZvciB0aGlzIHBhZ2UncyBVSSBjb250cm9sLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SVByZWZlcmVuY2VQYWdlPC9jb2RlPgotICAgICAqIG1ldGhvZCByZXR1cm5zIHRoZSBzaXplIHNldCBieSA8Y29kZT5zZXRTaXplPC9jb2RlPjsgaWYgbm8gc2l6ZQotICAgICAqIGhhcyBiZWVuIHNldCwgYnV0IHRoZSBwYWdlIGhhcyBhIFVJIGNvbnRyb2wsIHRoZSBmcmFtZXdvcmsKLSAgICAgKiBtZXRob2QgPGNvZGU+ZG9Db21wdXRlU2l6ZTwvY29kZT4gaXMgY2FsbGVkIHRvIGNvbXB1dGUgdGhlIHNpemUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcHJlZmVyZW5jZSBwYWdlIGVuY29kZWQgYXMKLSAgICAgKiAgIDxjb2RlPm5ldyBQb2ludCh3aWR0aCxoZWlnaHQpPC9jb2RlPiwgb3IgCi0gICAgICogICA8Y29kZT4oMCwwKTwvY29kZT4gaWYgdGhlIHBhZ2UgZG9lc24ndCBjdXJyZW50bHkgaGF2ZSBhbnkgVUkgY29tcG9uZW50Ci0gICAgICovCi0gICAgcHVibGljIFBvaW50IGNvbXB1dGVTaXplKCkgewotICAgICAgICBpZiAoc2l6ZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgICAgIENvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woKTsKLSAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotICAgICAgICAgICAgc2l6ZSA9IGRvQ29tcHV0ZVNpemUoKTsKLSAgICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUG9pbnQoMCwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udHJpYnV0ZXMgYWRkaXRpb25hbCBidXR0b25zIHRvIHRoZSBnaXZlbiBjb21wb3NpdGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgaG9vayBtZXRob2QgZG9lcwotICAgICAqIG5vdGhpbmcuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNvbnRyaWJ1dGUgYnV0dG9ucyAKLSAgICAgKiB0byB0aGlzIHBhZ2UncyBidXR0b24gYmFyLiBGb3IgZWFjaCBidXR0b24gYSBzdWJjbGFzcyBjb250cmlidXRlcywKLSAgICAgKiBpdCBtdXN0IGFsc28gaW5jcmVhc2UgdGhlIHBhcmVudCdzIGdyaWQgbGF5b3V0IG51bWJlciBvZiBjb2x1bW5zCi0gICAgICogYnkgb25lOyB0aGF0IGlzLAotICAgICAqIDxwcmU+Ci0gICAgICogKChHcmlkTGF5b3V0KSBwYXJlbnQuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMrKyk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgYnV0dG9uIGJhcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBTV1QgY29udHJvbCBmb3IgdGhlIGN1c3RvbWl6ZWQgYm9keSAKLSAgICAgKiBvZiB0aGlzIHByZWZlcmVuY2UgcGFnZSB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZyYW1ld29yayBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZSBzdWJjbGFzc2VzLiBBbnkKLSAgICAgKiBzdWJjbGFzcyByZXR1cm5pbmcgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IG9iamVjdCB3aG9zZSA8Y29kZT5MYXlvdXQ8L2NvZGU+Ci0gICAgICogaGFzIGRlZmF1bHQgbWFyZ2lucyAoZm9yIGV4YW1wbGUsIGEgPGNvZGU+R3JpZExheW91dDwvY29kZT4pIGFyZSBleHBlY3RlZCB0bwotICAgICAqIHNldCB0aGUgbWFyZ2lucyBvZiB0aGlzIDxjb2RlPkxheW91dDwvY29kZT4gdG8gMCBwaXhlbHMuIAotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlByZWZlcmVuY2VQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPklEaWFsb2dQYWdlPC9jb2RlPiBtZXRob2QgY3JlYXRlcyBhIGRlc2NyaXB0aW9uIGxhYmVsCi0gICAgICogYW5kIGJ1dHRvbiBiYXIgZm9yIHRoZSBwYWdlLiBJdCBjYWxscyA8Y29kZT5jcmVhdGVDb250ZW50czwvY29kZT4KLSAgICAgKiB0byBjcmVhdGUgdGhlIGN1c3RvbSBjb250ZW50cyBvZiB0aGUgcGFnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiBhIHN1YmNsYXNzIHRoYXQgb3ZlcnJpZGVzIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogdGhhdCBoYXMgYSBsYXlvdXQgd2l0aCBkZWZhdWx0IG1hcmdpbnMgKGZvciBleGFtcGxlLCBhIDxjb2RlPkdyaWRMYXlvdXQ8L2NvZGU+KQotICAgICAqIGl0IGlzIGV4cGVjdGVkIHRvIHNldCB0aGUgbWFyZ2lucyBvZiB0aGlzIDxjb2RlPkxheW91dDwvY29kZT4gdG8gMCBwaXhlbHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KXsKLQotICAgICAgICBHcmlkRGF0YSBnZDsKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzZXRDb250cm9sKGNvbnRlbnQpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBjb250ZW50LnNldExheW91dChsYXlvdXQpOwotICAgICAgICAvL0FwcGx5IHRoZSBmb250IG9uIGNyZWF0aW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIGFwcGx5RGlhbG9nRm9udChjb250ZW50KTsKLQotICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBkaWFsb2cgdW5pdHMKLSAgICAgICAgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbnRlbnQpOwotCi0gICAgICAgIGRlc2NyaXB0aW9uTGFiZWwgPSBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKGNvbnRlbnQpOwotICAgICAgICBpZiAoZGVzY3JpcHRpb25MYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbkxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotICAgICAgICAgICAgICAgICAgICBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvZHkgPSBjcmVhdGVDb250ZW50cyhjb250ZW50KTsKLSAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkKLSAgICAgICAgICAgIC8vIG51bGwgaXMgbm90IGEgdmFsaWQgcmV0dXJuIHZhbHVlIGJ1dCBzdXBwb3J0IGdyYWNlZnVsIGZhaWx1cmUKLSAgICAgICAgICAgIGJvZHkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbkJhciA9IG5ldyBDb21wb3NpdGUoY29udGVudCwgU1dULk5PTkUpOwotICAgICAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0gICAgICAgIGJ1dHRvbkJhci5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLSAgICAgICAgCi0gICAgICAgIGJ1dHRvbkJhci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgICAgICBjb250cmlidXRlQnV0dG9ucyhidXR0b25CYXIpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNyZWF0ZURlZmF1bHRBbmRBcHBseUJ1dHRvbikgewotICAgICAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBsYXlvdXQubnVtQ29sdW1ucyArIDI7Ci0JCQlTdHJpbmdbXSBsYWJlbHMgPSBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmdzKG5ldyBTdHJpbmdbXSB7Ci0JCQkJCSJkZWZhdWx0cyIsICJhcHBseSIgfSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQlpbnQgd2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQkJZGVmYXVsdHNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkJhciwgU1dULlBVU0gpOwotCQkJZGVmYXVsdHNCdXR0b24uc2V0VGV4dChsYWJlbHNbMF0pOwotCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChkZWZhdWx0c0J1dHRvbik7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCQlQb2ludCBtaW5CdXR0b25TaXplID0gZGVmYXVsdHNCdXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCVNXVC5ERUZBVUxULCB0cnVlKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gTWF0aC5tYXgod2lkdGhIaW50LCBtaW5CdXR0b25TaXplLngpOwotCQkJZGVmYXVsdHNCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWRlZmF1bHRzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcGVyZm9ybURlZmF1bHRzKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLSAgICAgICAgICAgIGFwcGx5QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25CYXIsIFNXVC5QVVNIKTsKLQkJCWFwcGx5QnV0dG9uLnNldFRleHQobGFiZWxzWzFdKTsKLQkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoYXBwbHlCdXR0b24pOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQkJbWluQnV0dG9uU2l6ZSA9IGFwcGx5QnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwKLQkJCQkJdHJ1ZSk7Ci0JCQlkYXRhLndpZHRoSGludCA9IE1hdGgubWF4KHdpZHRoSGludCwgbWluQnV0dG9uU2l6ZS54KTsKLQkJCWFwcGx5QnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlhcHBseUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXBlcmZvcm1BcHBseSgpOwotCQkJCX0KLQkJCX0pOwotICAgICAgICAgICAgYXBwbHlCdXR0b24uc2V0RW5hYmxlZChpc1ZhbGlkKCkpOwotICAgICAgICAgICAgYXBwbHlEaWFsb2dGb250KGJ1dHRvbkJhcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IG90aGVyIGJ1dHRvbnMgb24gdGhlIGJ1dHRvbiBiYXIuCi0gICAgICAgICAgICAgKiBJZiBub3QsIHRocm93IGF3YXkgdGhlIGJ1dHRvbiBiYXIgY29tcG9zaXRlLiAgT3RoZXJ3aXNlCi0gICAgICAgICAgICAgKiB0aGVyZSBpcyBhbiB1bnVzdWFsbHkgbGFyZ2UgYnV0dG9uIGJhci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKGJ1dHRvbkJhci5nZXRDaGlsZHJlbigpLmxlbmd0aCA8IDEpCi0gICAgICAgICAgICAgICAgYnV0dG9uQmFyLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotCQotCi0JLyoqCi0gICAgICogQXBwbHkgdGhlIGRpYWxvZyBmb250IHRvIHRoZSBjb21wb3NpdGUgYW5kIGl0J3MgY2hpbGRyZW4KLSAgICAgKiBpZiBpdCBpcyBzZXQuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIGlmIHRoZXkgd2lzaCB0bwotICAgICAqIHNldCB0aGUgZm9udCB0aGVtc2VsdmVzLgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseURpYWxvZ0ZvbnQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBTV1QgbGFiZWwgdW5kZXIgdGhlIGdpdmVuIGNvbXBvc2l0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgbGFiZWwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlRGVzY3JpcHRpb25MYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGVzIHRoZSBzaXplIG5lZWRlZCBieSB0aGlzIHBhZ2UncyBVSSBjb250cm9sLgotICAgICAqIDxwPgotICAgICAqIEFsbCBwYWdlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIHNldCB0aGUgYXBwcm9wcmlhdGUgc2l6ZXMKLSAgICAgKiBvZiB0aGVpciB3aWRnZXRzLCBhbmQgdGhlbiBjYWxsIDxjb2RlPnN1cGVyLmRvQ29tcHV0ZVNpemU8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHByZWZlcmVuY2UgcGFnZSBlbmNvZGVkIGFzCi0gICAgICogICA8Y29kZT5uZXcgUG9pbnQod2lkdGgsaGVpZ2h0KTwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUG9pbnQgZG9Db21wdXRlU2l6ZSgpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uTGFiZWwgIT0gbnVsbCAmJiBib2R5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBvaW50IGJvZHlTaXplID0gYm9keS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotICAgICAgICAgICAgR3JpZERhdGEgZ2QgPSAoR3JpZERhdGEpIGRlc2NyaXB0aW9uTGFiZWwuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICAgICAgZ2Qud2lkdGhIaW50ID0gYm9keVNpemUueDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0Q29udHJvbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBzdG9yZSBvZiB0aGlzIHByZWZlcmVuY2UgcGFnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIGEgZnJhbWV3b3JrIGhvb2sgbWV0aG9kIGZvciBzdWJjbGFzc2VzIHRvIHJldHVybiBhCi0gICAgICogcGFnZS1zcGVjaWZpYyBwcmVmZXJlbmNlIHN0b3JlLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotICAgICAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSBzdG9yZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250YWluZXIgb2YgdGhpcyBwYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSBwYWdlIGNvbnRhaW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcwotICAgICAqICAgcGFnZSBoYXMgeWV0IHRvIGJlIGFkZGVkIHRvIGEgY29udGFpbmVyCi0gICAgICovCi0gICAgcHVibGljIElQcmVmZXJlbmNlUGFnZUNvbnRhaW5lciBnZXRDb250YWluZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb250YWluZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBzdG9yZSBvZiB0aGlzIHByZWZlcmVuY2UgcGFnZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotICAgICAgICBpZiAocHJlZmVyZW5jZVN0b3JlID09IG51bGwpCi0gICAgICAgICAgICBwcmVmZXJlbmNlU3RvcmUgPSBkb0dldFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICBpZiAocHJlZmVyZW5jZVN0b3JlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcHJlZmVyZW5jZVN0b3JlOwotICAgICAgICBlbHNlIGlmIChjb250YWluZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgkKLSAgICAgKiBUaGUgcHJlZmVyZW5jZSBwYWdlIGltcGxlbWVudGF0aW9uIG9mIGFuIDxjb2RlPklQcmVmZXJlbmNlUGFnZTwvY29kZT4KLSAgICAgKiBtZXRob2QgcmV0dXJucyB3aGV0aGVyIHRoaXMgcHJlZmVyZW5jZSBwYWdlIGlzIHZhbGlkLiBQcmVmZXJlbmNlCi0gICAgICogcGFnZXMgYXJlIGNvbnNpZGVyZWQgdmFsaWQgYnkgZGVmYXVsdDsgY2FsbCA8Y29kZT5zZXRWYWxpZChmYWxzZSk8L2NvZGU+Ci0gICAgICogdG8gbWFrZSBhIHBhZ2UgaW52YWxpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gaXNWYWxpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdXBwcmVzc2VzIGNyZWF0aW9uIG9mIHRoZSBzdGFuZGFyZCBEZWZhdWx0IGFuZCBBcHBseSBidXR0b25zCi0gICAgICogZm9yIHRoaXMgcGFnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIHdpc2hpbmcgYSBwcmVmZXJlbmNlIHBhZ2Ugd2lodGhvdXQgdGhlc2UgYnV0dG9ucwotICAgICAqIHNob3VsZCBjYWxsIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBiZWZvcmUgdGhlIHBhZ2UncyBjb250cm9sCi0gICAgICogaGFzIGJlZW4gY3JlYXRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKSB7Ci0gICAgICAgIGNyZWF0ZURlZmF1bHRBbmRBcHBseUJ1dHRvbiA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5QcmVmZXJlbmNlUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5JUHJlZmVyZW5jZVBhZ2U8L2NvZGU+IG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+Ci0gICAgICogaWYgdGhlIHBhZ2UgaXMgdmFsaWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gb2tUb0xlYXZlKCkgewotICAgICAgICByZXR1cm4gaXNWYWxpZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHNwZWNpYWwgcHJvY2Vzc2luZyB3aGVuIHRoaXMgcGFnZSdzIEFwcGx5IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgYSBmcmFtZXdvcmsgaG9vayBtZXRob2QgZm9yIHN1YmxjYXNzZXMgdG8gZG8gc3BlY2lhbCB0aGluZ3Mgd2hlbgotICAgICAqIHRoZSBBcHBseSBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2Qgc2ltcGx5IGNhbGxzCi0gICAgICogPGNvZGU+cGVyZm9ybU9rPC9jb2RlPiB0byBzaW11bGF0ZSB0aGUgcHJlc3Npbmcgb2YgdGhlIHBhZ2UncyBPSyBidXR0b24uCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBzZWUgI3BlcmZvcm1PawotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLSAgICAgICAgcGVyZm9ybU9rKCk7Ci0gICAgfQotCi0gICAgLyoqCQotICAgICAqIFRoZSBwcmVmZXJlbmNlIHBhZ2UgaW1wbGVtZW50YXRpb24gb2YgYW4gPGNvZGU+SVByZWZlcmVuY2VQYWdlPC9jb2RlPgotICAgICAqIG1ldGhvZCBwZXJmb3JtcyBzcGVjaWFsIHByb2Nlc3Npbmcgd2hlbiB0aGlzIHBhZ2UncyBDYW5jZWwgYnV0dG9uIGhhcwotICAgICAqIGJlZW4gcHJlc3NlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIGEgZnJhbWV3b3JrIGhvb2sgbWV0aG9kIGZvciBzdWJsY2Fzc2VzIHRvIGRvIHNwZWNpYWwgdGhpbmdzIHdoZW4KLSAgICAgKiB0aGUgQ2FuY2VsIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogZnJhbWV3b3JrIG1ldGhvZCBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyBhIGZyYW1ld29yayBob29rIG1ldGhvZCBmb3Igc3ViY2xhc3NlcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB3aGVuCi0gICAgICogdGhlIERlZmF1bHRzIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLCBidXQgc2hvdWxkIGNhbGwgPGNvZGU+c3VwZXIucGVyZm9ybURlZmF1bHRzPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotICAgICAgICB1cGRhdGVBcHBseUJ1dHRvbigpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VQYWdlLgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZVBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKElQcmVmZXJlbmNlUGFnZUNvbnRhaW5lciBjb250YWluZXIpIHsKLSAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJlZmVyZW5jZSBzdG9yZSBmb3IgdGhpcyBwcmVmZXJlbmNlIHBhZ2UuCi0gICAgICogPHA+Ci0gICAgICogSWYgcHJlZmVyZW5jZVN0b3JlIGlzIHNldCB0byBudWxsLCBnZXRQcmVmZXJlbmNlU3RvcmUKLSAgICAgKiB3aWxsIGludm9rZSBkb0dldFByZWZlcmVuY2VTdG9yZSB0aGUgbmV4dCB0aW1lIGl0IGlzIGNhbGxlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIHByZWZlcmVuY2Ugc3RvcmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogQHNlZSAjZ2V0UHJlZmVyZW5jZVN0b3JlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZVN0b3JlKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLSAgICAgICAgcHJlZmVyZW5jZVN0b3JlID0gc3RvcmU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZVBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShQb2ludCB1aVNpemUpIHsKLSAgICAgICAgQ29udHJvbCBjb250cm9sID0gZ2V0Q29udHJvbCgpOwotICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250cm9sLnNldFNpemUodWlTaXplKTsKLSAgICAgICAgICAgIHNpemUgPSB1aVNpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+UHJlZmVyZW5jZVBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SURpYWxvZ1BhZ2U8L2NvZGU+Ci0gICAgICogbWV0aG9kIGV4dGVuZHMgdGhlIDxjb2RlPkRpYWxvZ1BhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIHRvIHVwZGF0ZQotICAgICAqIHRoZSBwcmVmZXJlbmNlIHBhZ2UgY29udGFpbmVyIHRpdGxlLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgaWYgKGdldENvbnRhaW5lcigpICE9IG51bGwpCi0gICAgICAgICAgICBnZXRDb250YWluZXIoKS51cGRhdGVUaXRsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGlzIHBhZ2UgaXMgdmFsaWQuCi0gICAgICogVGhlIGVuYWJsZSBzdGF0ZSBvZiB0aGUgY29udGFpbmVyIGJ1dHRvbnMgYW5kIHRoZQotICAgICAqIGFwcGx5IGJ1dHRvbiBpcyB1cGRhdGVkIHdoZW4gYSBwYWdlJ3MgdmFsaWQgc3RhdGUgCi0gICAgICogY2hhbmdlcy4KLSAgICAgKiA8cD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiIHRoZSBuZXcgdmFsaWQgc3RhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZChib29sZWFuIGIpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRWYWx1ZSA9IGlzVmFsaWQ7Ci0gICAgICAgIGlzVmFsaWQgPSBiOwotICAgICAgICBpZiAob2xkVmFsdWUgIT0gaXNWYWxpZCkgewotICAgICAgICAgICAgLy8gdXBkYXRlIGNvbnRhaW5lciBzdGF0ZQotICAgICAgICAgICAgaWYgKGdldENvbnRhaW5lcigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotICAgICAgICAgICAgLy8gdXBkYXRlIHBhZ2Ugc3RhdGUKLSAgICAgICAgICAgIHVwZGF0ZUFwcGx5QnV0dG9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSBvbmx5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUaXRsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIEFwcGx5IGJ1dHRvbiB0byByZWZsZWN0IHdoZXRoZXIgCi0gICAgICogdGhpcyBwYWdlIGlzIHZhbGlkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUFwcGx5QnV0dG9uKCkgewotICAgICAgICBpZiAoYXBwbHlCdXR0b24gIT0gbnVsbCkKLSAgICAgICAgICAgIGFwcGx5QnV0dG9uLnNldEVuYWJsZWQoaXNWYWxpZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29tcG9zaXRlIHdpdGggYSBoaWdobGlnaHRlZCBOb3RlIGVudHJ5IGFuZCBhIG1lc3NhZ2UgdGV4dC4KLSAgICAgKiBUaGlzIGlzIGRlc2lnbmVkIHRvIHRha2UgdXAgdGhlIGZ1bGwgd2lkdGggb2YgdGhlIHBhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gdXNlCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUgb2YgdGhlIG5vdGUKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBmb3IgdGhlIG5vdGUKLSAgICAgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGUgZm9yIHRoZSBub3RlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVOb3RlQ29tcG9zaXRlKEZvbnQgZm9udCwgQ29tcG9zaXRlIGNvbXBvc2l0ZSwKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ29tcG9zaXRlIG1lc3NhZ2VDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IG1lc3NhZ2VMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBtZXNzYWdlTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBtZXNzYWdlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbWVzc2FnZUxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBtZXNzYWdlQ29tcG9zaXRlLnNldExheW91dChtZXNzYWdlTGF5b3V0KTsKLSAgICAgICAgbWVzc2FnZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICAgICAgICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICAgICAgbWVzc2FnZUNvbXBvc2l0ZS5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIGZpbmFsIExhYmVsIG5vdGVMYWJlbCA9IG5ldyBMYWJlbChtZXNzYWdlQ29tcG9zaXRlLCBTV1QuQk9MRCk7Ci0gICAgICAgIG5vdGVMYWJlbC5zZXRUZXh0KHRpdGxlKTsKLSAgICAgICAgbm90ZUxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKLSAgICAgICAgbm90ZUxhYmVsCi0gICAgICAgICAgICAgICAgLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCi0gICAgICAgIGZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZvbnRMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoSkZhY2VSZXNvdXJjZXMuQkFOTkVSX0ZPTlQuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGVMYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZvbnQoSkZhY2VSZXNvdXJjZXMuQkFOTkVSX0ZPTlQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmFkZExpc3RlbmVyKGZvbnRMaXN0ZW5lcik7Ci0gICAgICAgIG5vdGVMYWJlbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLnJlbW92ZUxpc3RlbmVyKGZvbnRMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIExhYmVsIG1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChtZXNzYWdlQ29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0Rm9udChmb250KTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQXBwbHkgYnV0dG9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEFwcGx5IGJ1dHRvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBCdXR0b24gZ2V0QXBwbHlCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBhcHBseUJ1dHRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBSZXN0b3JlIERlZmF1bHRzIGJ1dHRvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBSZXN0b3JlIERlZmF1bHRzIGJ1dHRvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBCdXR0b24gZ2V0RGVmYXVsdHNCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0c0J1dHRvbjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI3BlcmZvcm1IZWxwKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtSGVscCgpIHsKLSAgICAgICAgZ2V0Q29udHJvbCgpLm5vdGlmeUxpc3RlbmVycyhTV1QuSGVscCwgbmV3IEV2ZW50KCkpOwotICAgIH0KLQotCS8qKgotCSAqIEFwcGx5IHRoZSBkYXRhIHRvIHRoZSByZWNlaXZlci4gQnkgZGVmYXVsdCBkbyBub3RoaW5nLgotCSAqIEBwYXJhbSBkYXRhCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5RGF0YShPYmplY3QgZGF0YSkgewotCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI3NldEVycm9yTWVzc2FnZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSkgewotCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UobmV3TWVzc2FnZSk7Ci0JCWlmIChnZXRDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlnZXRDb250YWluZXIoKS51cGRhdGVNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI3NldE1lc3NhZ2UoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UsIGludCBuZXdUeXBlKSB7Ci0JCXN1cGVyLnNldE1lc3NhZ2UobmV3TWVzc2FnZSwgbmV3VHlwZSk7Ci0JCWlmIChnZXRDb250YWluZXIoKSAhPSBudWxsKSAKLQkJCWdldENvbnRhaW5lcigpLnVwZGF0ZU1lc3NhZ2UoKTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VTdG9yZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwZDBjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1ByZWZlcmVuY2VTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5FdmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci0KLS8qKgotICogQSBjb25jcmV0ZSBwcmVmZXJlbmNlIHN0b3JlIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGFuIGludGVybmFsCi0gKiA8Y29kZT5qYXZhLnV0aWwuUHJvcGVydGllczwvY29kZT4gb2JqZWN0LCB3aXRoIHN1cHBvcnQgZm9yIHBlcnNpc3RpbmcgdGhlCi0gKiBub24tZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcyB0byBmaWxlcyBvciBzdHJlYW1zLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdhcyBub3QgZGVzaWduZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlU3RvcmUgZXh0ZW5kcyBFdmVudE1hbmFnZXIgaW1wbGVtZW50cwotCQlJUGVyc2lzdGVudFByZWZlcmVuY2VTdG9yZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWFwcGluZyBmcm9tIHByZWZlcmVuY2UgbmFtZSB0byBwcmVmZXJlbmNlIHZhbHVlIChyZXByZXNlbnRlZCBhcwotICAgICAqIHN0cmluZ3MpLgotICAgICAqLwotICAgIHByaXZhdGUgUHJvcGVydGllcyBwcm9wZXJ0aWVzOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1hcHBpbmcgZnJvbSBwcmVmZXJlbmNlIG5hbWUgdG8gZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlIChyZXByZXNlbnRlZAotICAgICAqIGFzIHN0cmluZ3MpOyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqLwotICAgIHByaXZhdGUgUHJvcGVydGllcyBkZWZhdWx0UHJvcGVydGllczsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGEgdmFsdWUgYXMgYmVlbiBjaGFuZ2VkIGJ5IDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4KLSAgICAgKiBvciA8Y29kZT5zZXRWYWx1ZTwvY29kZT47IGluaXRpYWxseSA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpcnR5ID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmlsZSBuYW1lIHVzZWQgYnkgdGhlIDxjb2RlPmxvYWQ8L2NvZGU+IG1ldGhvZCB0byBsb2FkIGEgcHJvcGVydHkKLSAgICAgKiBmaWxlLiBUaGlzIGZpbGVuYW1lIGlzIHVzZWQgdG8gc2F2ZSB0aGUgcHJvcGVydGllcyBmaWxlIHdoZW4KLSAgICAgKiA8Y29kZT5zYXZlPC9jb2RlPiBpcyBjYWxsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICogPHA+Ci0gICAgICogVXNlIHRoZSBtZXRob2RzIDxjb2RlPmxvYWQoSW5wdXRTdHJlYW0pPC9jb2RlPiBhbmQKLSAgICAgKiA8Y29kZT5zYXZlKElucHV0U3RyZWFtKTwvY29kZT4gdG8gbG9hZCBhbmQgc3RvcmUgdGhpcyBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNsb2FkKElucHV0U3RyZWFtKQotICAgICAqIEBzZWUgI3NhdmUoT3V0cHV0U3RyZWFtLCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFByZWZlcmVuY2VTdG9yZSgpIHsKLSAgICAgICAgZGVmYXVsdFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoZGVmYXVsdFByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGxvYWRzIGZyb20gYW5kIHNhdmVzIHRvIHRoZSBhCi0gICAgICogZmlsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2UgdGhlIG1ldGhvZHMgPGNvZGU+bG9hZCgpPC9jb2RlPiBhbmQgPGNvZGU+c2F2ZSgpPC9jb2RlPiB0byBsb2FkCi0gICAgICogYW5kIHN0b3JlIHRoaXMgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGVuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgZmlsZSBuYW1lCi0gICAgICogQHNlZSAjbG9hZCgpCi0gICAgICogQHNlZSAjc2F2ZSgpCi0gICAgICovCi0gICAgcHVibGljIFByZWZlcmVuY2VTdG9yZShTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGZpbGVuYW1lKTsKLSAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VTdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGFkZExpc3RlbmVyT2JqZWN0KGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KG5hbWUpIHx8IGRlZmF1bHRQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KG5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIG5hbWUsIE9iamVjdCBvbGRWYWx1ZSwKLSAgICAgICAgICAgIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBmaW5hbCBPYmplY3RbXSBmaW5hbExpc3RlbmVycyA9IGdldExpc3RlbmVycygpOwotICAgICAgICAvLyBEbyB3ZSBuZWVkIHRvIGZpcmUgYW4gZXZlbnQuCi0gICAgICAgIGlmIChmaW5hbExpc3RlbmVycy5sZW5ndGggPiAwCi0gICAgICAgICAgICAgICAgJiYgKG9sZFZhbHVlID09IG51bGwgfHwgIW9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpKSB7Ci0gICAgICAgICAgICBmaW5hbCBQcm9wZXJ0eUNoYW5nZUV2ZW50IHBlID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmluYWxMaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsID0gKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBmaW5hbExpc3RlbmVyc1tpXTsKLSAgICAgICAgICAgICAgICBTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcmVmZXJlbmNlU3RvcmUuY2hhbmdlRXJyb3IiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0gIAkJCSAgICAgICAgICAgICAgICBsLnByb3BlcnR5Q2hhbmdlKHBlKTsKLSAgICAgICAgICAgICAgICAJCX0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VTdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRCb29sZWFuKHByb3BlcnRpZXMsIG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBmdW5jdGlvbjogZ2V0cyBib29sZWFuIGZvciBhIGdpdmVuIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuKFByb3BlcnRpZXMgcCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcCAhPSBudWxsID8gcC5nZXRQcm9wZXJ0eShuYW1lKSA6IG51bGw7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIEJPT0xFQU5fREVGQVVMVF9ERUZBVUxUOwotICAgICAgICBpZiAodmFsdWUuZXF1YWxzKElQcmVmZXJlbmNlU3RvcmUuVFJVRSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VTdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhbihkZWZhdWx0UHJvcGVydGllcywgbmFtZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZVN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0RGVmYXVsdERvdWJsZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0RG91YmxlKGRlZmF1bHRQcm9wZXJ0aWVzLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldERlZmF1bHRGbG9hdChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0RmxvYXQoZGVmYXVsdFByb3BlcnRpZXMsIG5hbWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VTdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERlZmF1bHRJbnQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldEludChkZWZhdWx0UHJvcGVydGllcywgbmFtZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZVN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldERlZmF1bHRMb25nKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRMb25nKGRlZmF1bHRQcm9wZXJ0aWVzLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoZGVmYXVsdFByb3BlcnRpZXMsIG5hbWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VTdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0RG91YmxlKHByb3BlcnRpZXMsIG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBmdW5jdGlvbjogZ2V0cyBkb3VibGUgZm9yIGEgZ2l2ZW4gbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiBkb3VibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGRvdWJsZSBnZXREb3VibGUoUHJvcGVydGllcyBwLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwICE9IG51bGwgPyBwLmdldFByb3BlcnR5KG5hbWUpIDogbnVsbDsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gRE9VQkxFX0RFRkFVTFRfREVGQVVMVDsKLSAgICAgICAgZG91YmxlIGl2YWwgPSBET1VCTEVfREVGQVVMVF9ERUZBVUxUOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXZhbCA9IG5ldyBEb3VibGUodmFsdWUpLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl2YWw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZVN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0RmxvYXQocHJvcGVydGllcywgbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIGZ1bmN0aW9uOiBnZXRzIGZsb2F0IGZvciBhIGdpdmVuIG5hbWUuCi0gICAgICogQHBhcmFtIHAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4gZmxvYXQKLSAgICAgKi8KLSAgICBwcml2YXRlIGZsb2F0IGdldEZsb2F0KFByb3BlcnRpZXMgcCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcCAhPSBudWxsID8gcC5nZXRQcm9wZXJ0eShuYW1lKSA6IG51bGw7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIEZMT0FUX0RFRkFVTFRfREVGQVVMVDsKLSAgICAgICAgZmxvYXQgaXZhbCA9IEZMT0FUX0RFRkFVTFRfREVGQVVMVDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGl2YWwgPSBuZXcgRmxvYXQodmFsdWUpLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXZhbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldEludChwcm9wZXJ0aWVzLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgZnVuY3Rpb246IGdldHMgaW50IGZvciBhIGdpdmVuIG5hbWUuCi0gICAgICogQHBhcmFtIHAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4gaW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0SW50KFByb3BlcnRpZXMgcCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcCAhPSBudWxsID8gcC5nZXRQcm9wZXJ0eShuYW1lKSA6IG51bGw7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIElOVF9ERUZBVUxUX0RFRkFVTFQ7Ci0gICAgICAgIGludCBpdmFsID0gMDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGl2YWwgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXZhbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZyhTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0TG9uZyhwcm9wZXJ0aWVzLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgZnVuY3Rpb246IGdldHMgbG9uZyBmb3IgYSBnaXZlbiBuYW1lLgotICAgICAqIEBwYXJhbSBwCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBsb25nIGdldExvbmcoUHJvcGVydGllcyBwLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwICE9IG51bGwgPyBwLmdldFByb3BlcnR5KG5hbWUpIDogbnVsbDsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gTE9OR19ERUZBVUxUX0RFRkFVTFQ7Ci0gICAgICAgIGxvbmcgaXZhbCA9IExPTkdfREVGQVVMVF9ERUZBVUxUOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXZhbCA9IExvbmcucGFyc2VMb25nKHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXZhbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhwcm9wZXJ0aWVzLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgZnVuY3Rpb246IGdldHMgc3RyaW5nIGZvciBhIGdpdmVuIG5hbWUuCi0gICAgICogQHBhcmFtIHAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoUHJvcGVydGllcyBwLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwICE9IG51bGwgPyBwLmdldFByb3BlcnR5KG5hbWUpIDogbnVsbDsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gU1RSSU5HX0RFRkFVTFRfREVGQVVMVDsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VTdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuICghcHJvcGVydGllcy5jb250YWluc0tleShuYW1lKSAmJiBkZWZhdWx0UHJvcGVydGllcwotICAgICAgICAgICAgICAgIC5jb250YWluc0tleShuYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBjb250ZW50cyBvZiB0aGlzIHByZWZlcmVuY2Ugc3RvcmUgdG8gdGhlIGdpdmVuIHByaW50IHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgcHJpbnQgc3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbGlzdChQcmludFN0cmVhbSBvdXQpIHsKLSAgICAgICAgcHJvcGVydGllcy5saXN0KG91dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBjb250ZW50cyBvZiB0aGlzIHByZWZlcmVuY2Ugc3RvcmUgdG8gdGhlIGdpdmVuIHByaW50IHdyaXRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgcHJpbnQgd3JpdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbGlzdChQcmludFdyaXRlciBvdXQpIHsKLSAgICAgICAgcHJvcGVydGllcy5saXN0KG91dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhpcyBwcmVmZXJlbmNlIHN0b3JlIGZyb20gdGhlIGZpbGUgZXN0YWJsaXNoZWQgaW4gdGhlIGNvbnN0cnVjdG9yCi0gICAgICogPGNvZGU+UHJlZmVyZW5jZVN0b3JlKGphdmEubGFuZy5TdHJpbmcpPC9jb2RlPiAob3IgYnkKLSAgICAgKiA8Y29kZT5zZXRGaWxlTmFtZTwvY29kZT4pLiBEZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzIGFyZSBub3QgYWZmZWN0ZWQuCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGxvYWRpbmcgdGhpcyBzdG9yZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoZmlsZW5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmlsZSBuYW1lIG5vdCBzcGVjaWZpZWQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOwotICAgICAgICBsb2FkKGluKTsKLSAgICAgICAgaW4uY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGlzIHByZWZlcmVuY2Ugc3RvcmUgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLiBEZWZhdWx0Ci0gICAgICogcHJlZmVyZW5jZSB2YWx1ZXMgYXJlIG5vdCBhZmZlY3RlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gbG9hZGluZyB0aGlzIHN0b3JlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9hZChJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvcGVydGllcy5sb2FkKGluKTsKLSAgICAgICAgZGlydHkgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbmVlZHNTYXZpbmcoKSB7Ci0gICAgICAgIHJldHVybiBkaXJ0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFsbCBwcmVmZXJlbmNlcyBrbm93biB0byB0aGlzIHN0b3JlIHdoaWNoIGhhdmUKLSAgICAgKiBjdXJyZW50IHZhbHVlcyBvdGhlciB0aGFuIHRoZWlyIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBwcmVmZXJlbmNlIG5hbWVzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIHByZWZlcmVuY2VOYW1lcygpIHsKLSAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGl0ID0gcHJvcGVydGllcy5wcm9wZXJ0eU5hbWVzKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgbGlzdC5hZGQoaXQubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBTdHJpbmcgb2xkVmFsdWUgPSBnZXRTdHJpbmcobmFtZSk7Ci0gICAgICAgIGlmIChvbGRWYWx1ZSA9PSBudWxsIHx8ICFvbGRWYWx1ZS5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICBzZXRWYWx1ZShwcm9wZXJ0aWVzLCBuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICByZW1vdmVMaXN0ZW5lck9iamVjdChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIG5vbi1kZWZhdWx0LXZhbHVlZCBwcmVmZXJlbmNlcyBrbm93biB0byB0aGlzIHByZWZlcmVuY2Ugc3RvcmUKLSAgICAgKiB0byB0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZXkgd2VyZSBvcmlnaW5hbGx5IGxvYWRlZC4KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2F2aW5nIHRoaXMgc3RvcmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZpbGVuYW1lID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZpbGUgbmFtZSBub3Qgc3BlY2lmaWVkIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSk7Ci0gICAgICAgICAgICBzYXZlKG91dCwgbnVsbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGlzIHByZWZlcmVuY2Ugc3RvcmUgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uIFRoZSBnaXZlbiBzdHJpbmcKLSAgICAgKiBpcyBpbnNlcnRlZCBhcyBoZWFkZXIgaW5mb3JtYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKiBAcGFyYW0gaGVhZGVyCi0gICAgICogICAgICAgICAgICB0aGUgaGVhZGVyCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHNhdmluZyB0aGlzIHN0b3JlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgaGVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBwcm9wZXJ0aWVzLnN0b3JlKG91dCwgaGVhZGVyKTsKLSAgICAgICAgZGlydHkgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIHNldFZhbHVlKGRlZmF1bHRQcm9wZXJ0aWVzLCBuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZVN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIHNldFZhbHVlKGRlZmF1bHRQcm9wZXJ0aWVzLCBuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZVN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotICAgICAgICBzZXRWYWx1ZShkZWZhdWx0UHJvcGVydGllcywgbmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VTdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIHNldFZhbHVlKGRlZmF1bHRQcm9wZXJ0aWVzLCBuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZVN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBzZXRWYWx1ZShkZWZhdWx0UHJvcGVydGllcywgbmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VTdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIHNldFZhbHVlKGRlZmF1bHRQcm9wZXJ0aWVzLCBuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB1c2VkIHdoZW4gbG9hZGluZyBhbmQgc3RvcmluZyB0aGlzIHByZWZlcmVuY2UKLSAgICAgKiBzdG9yZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBZnRlcndhcmQsIHRoZSBtZXRob2RzIDxjb2RlPmxvYWQoKTwvY29kZT4gYW5kIDxjb2RlPnNhdmUoKTwvY29kZT4KLSAgICAgKiBjYW4gYmUgdXNlZCB0byBsb2FkIGFuZCBzdG9yZSB0aGlzIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBmaWxlIG5hbWUKLSAgICAgKiBAc2VlICNsb2FkKCkKLSAgICAgKiBAc2VlICNzYXZlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmaWxlbmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZVN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvRGVmYXVsdChTdHJpbmcgbmFtZSkgewotICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBwcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICAgICAgcHJvcGVydGllcy5yZW1vdmUobmFtZSk7Ci0gICAgICAgIGRpcnR5ID0gdHJ1ZTsKLSAgICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYgKGRlZmF1bHRQcm9wZXJ0aWVzICE9IG51bGwpCi0gICAgICAgICAgICBuZXdWYWx1ZSA9IGRlZmF1bHRQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICBkb3VibGUgb2xkVmFsdWUgPSBnZXREb3VibGUobmFtZSk7Ci0gICAgICAgIGlmIChvbGRWYWx1ZSAhPSB2YWx1ZSkgewotICAgICAgICAgICAgc2V0VmFsdWUocHJvcGVydGllcywgbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgZGlydHkgPSB0cnVlOwotICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmFtZSwgbmV3IERvdWJsZShvbGRWYWx1ZSksIG5ldyBEb3VibGUoCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIGZsb2F0IG9sZFZhbHVlID0gZ2V0RmxvYXQobmFtZSk7Ci0gICAgICAgIGlmIChvbGRWYWx1ZSAhPSB2YWx1ZSkgewotICAgICAgICAgICAgc2V0VmFsdWUocHJvcGVydGllcywgbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgZGlydHkgPSB0cnVlOwotICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmFtZSwgbmV3IEZsb2F0KG9sZFZhbHVlKSwgbmV3IEZsb2F0KHZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotICAgICAgICBpbnQgb2xkVmFsdWUgPSBnZXRJbnQobmFtZSk7Ci0gICAgICAgIGlmIChvbGRWYWx1ZSAhPSB2YWx1ZSkgewotICAgICAgICAgICAgc2V0VmFsdWUocHJvcGVydGllcywgbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgZGlydHkgPSB0cnVlOwotICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmFtZSwgbmV3IEludGVnZXIob2xkVmFsdWUpLCBuZXcgSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VTdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgewotICAgICAgICBsb25nIG9sZFZhbHVlID0gZ2V0TG9uZyhuYW1lKTsKLSAgICAgICAgaWYgKG9sZFZhbHVlICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBzZXRWYWx1ZShwcm9wZXJ0aWVzLCBuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChuYW1lLCBuZXcgTG9uZyhvbGRWYWx1ZSksIG5ldyBMb25nKHZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlU3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBTdHJpbmcgb2xkVmFsdWUgPSBnZXRTdHJpbmcobmFtZSk7Ci0gICAgICAgIGlmIChvbGRWYWx1ZSA9PSBudWxsIHx8ICFvbGRWYWx1ZS5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICBzZXRWYWx1ZShwcm9wZXJ0aWVzLCBuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZVN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkVmFsdWUgPSBnZXRCb29sZWFuKG5hbWUpOwotICAgICAgICBpZiAob2xkVmFsdWUgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHNldFZhbHVlKHByb3BlcnRpZXMsIG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIGRpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KG5hbWUsIG5ldyBCb29sZWFuKG9sZFZhbHVlKSwgbmV3IEJvb2xlYW4oCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kOiBzZXRzIHZhbHVlIGZvciBhIGdpdmVuIG5hbWUuCi0gICAgICogQHBhcmFtIHAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZShQcm9wZXJ0aWVzIHAsIFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZShwICE9IG51bGwpOwotICAgICAgICBwLnB1dChuYW1lLCBEb3VibGUudG9TdHJpbmcodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kOiBzZXRzIHZhbHVlIGZvciBhIGdpdmVuIG5hbWUuCi0gICAgICogQHBhcmFtIHAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZShQcm9wZXJ0aWVzIHAsIFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKHAgIT0gbnVsbCk7Ci0gICAgICAgIHAucHV0KG5hbWUsIEZsb2F0LnRvU3RyaW5nKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogc2V0cyB2YWx1ZSBmb3IgYSBnaXZlbiBuYW1lLgotICAgICAqIEBwYXJhbSBwCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWUoUHJvcGVydGllcyBwLCBTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUocCAhPSBudWxsKTsKLSAgICAgICAgcC5wdXQobmFtZSwgSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2Q6IHNldHMgdGhlIHZhbHVlIGZvciBhIGdpdmVuIG5hbWUuCi0gICAgICogQHBhcmFtIHAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZShQcm9wZXJ0aWVzIHAsIFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUocCAhPSBudWxsKTsKLSAgICAgICAgcC5wdXQobmFtZSwgTG9uZy50b1N0cmluZyh2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2Q6IHNldHMgdGhlIHZhbHVlIGZvciBhIGdpdmVuIG5hbWUuCi0gICAgICogQHBhcmFtIHAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZShQcm9wZXJ0aWVzIHAsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZShwICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCk7Ci0gICAgICAgIHAucHV0KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kOiBzZXRzIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBuYW1lLgotICAgICAqIEBwYXJhbSBwCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWUoUHJvcGVydGllcyBwLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKHAgIT0gbnVsbCk7Ci0gICAgICAgIHAucHV0KG5hbWUsIHZhbHVlID09IHRydWUgPyBJUHJlZmVyZW5jZVN0b3JlLlRSVUUKLSAgICAgICAgICAgICAgICA6IElQcmVmZXJlbmNlU3RvcmUuRkFMU0UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUmFkaW9Hcm91cEZpZWxkRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1JhZGlvR3JvdXBGaWVsZEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjEwMWQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvUmFkaW9Hcm91cEZpZWxkRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotLyoqCi0gKiBBIGZpZWxkIGVkaXRvciBmb3IgYW4gZW51bWVyYXRpb24gdHlwZSBwcmVmZXJlbmNlLgotICogVGhlIGNob2ljZXMgYXJlIHByZXNlbnRlZCBhcyBhIGxpc3Qgb2YgcmFkaW8gYnV0dG9ucy4KLSAqLwotcHVibGljIGNsYXNzIFJhZGlvR3JvdXBGaWVsZEVkaXRvciBleHRlbmRzIEZpZWxkRWRpdG9yIHsKLQotICAgIC8qKgotICAgICAqIExpc3Qgb2YgcmFkaW8gYnV0dG9uIGVudHJpZXMgb2YgdGhlIGZvcm0gW2xhYmVsLHZhbHVlXS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdW10gbGFiZWxzQW5kVmFsdWVzOwotCi0gICAgLyoqCi0gICAgICogTnVtYmVyIG9mIGNvbHVtbnMgaW50byB3aGljaCB0byBhcnJhbmdlIHRoZSByYWRpbyBidXR0b25zLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG51bUNvbHVtbnM7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRlbnQgdXNlZCBmb3IgdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgcmFkaW9uIGJ1dHRvbiBtYXRyaXguCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgaW5kZW50ID0gSE9SSVpPTlRBTF9HQVA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBib3ggb2YgcmFkaW8gYnV0dG9ucywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIChiZWZvcmUgY3JlYXRpb24gYW5kIGFmdGVyIGRpc3Bvc2FsKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIENvbXBvc2l0ZSByYWRpb0JveDsKLQotICAgIC8qKgotICAgICAqIFRoZSByYWRpbyBidXR0b25zLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogKGJlZm9yZSBjcmVhdGlvbiBhbmQgYWZ0ZXIgZGlzcG9zYWwpLgotICAgICAqLwotICAgIHByaXZhdGUgQnV0dG9uW10gcmFkaW9CdXR0b25zOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0byB1c2UgYSBHcm91cCBjb250cm9sLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VHcm91cDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcmFkaW8gZ3JvdXAgZmllbGQgZWRpdG9yIAotICAgICAqLwotICAgIHByb3RlY3RlZCBSYWRpb0dyb3VwRmllbGRFZGl0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJhZGlvIGdyb3VwIGZpZWxkIGVkaXRvci4gIAotICAgICAqIFRoaXMgY29uc3RydWN0b3IgZG9lcyBub3QgdXNlIGEgPGNvZGU+R3JvdXA8L2NvZGU+IHRvIGNvbnRhaW4gdGhlIHJhZGlvIGJ1dHRvbnMuCi0gICAgICogSXQgaXMgZXF1aXZhbGVudCB0byB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdG9yIHdpdGggPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogZm9yIHRoZSA8Y29kZT51c2VHcm91cDwvY29kZT4gYXJndW1lbnQuCi0gICAgICogPHA+Ci0gICAgICogRXhhbXBsZSB1c2FnZToKLSAgICAgKiA8cHJlPgotICAgICAqCQlSYWRpb0dyb3VwRmllbGRFZGl0b3IgZWRpdG9yPSBuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKAotICAgICAqCQkJIkdlbmVyYWxQYWdlLkRvdWJsZUNsaWNrIiwgcmVzTmFtZSwgMSwKLSAgICAgKgkJCW5ldyBTdHJpbmdbXVtdIHsKLSAgICAgKgkJCQl7Ik9wZW4gQnJvd3NlciIsICJvcGVuIn0sCi0gICAgICoJCQkJeyJFeHBhbmQgVHJlZSIsICJleHBhbmQifQotICAgICAqCQkJfSwKLSAgICAgKiAgICAgICAgICBwYXJlbnQpOwkKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdGhpcyBmaWVsZCBlZGl0b3Igd29ya3Mgb24KLSAgICAgKiBAcGFyYW0gbGFiZWxUZXh0IHRoZSBsYWJlbCB0ZXh0IG9mIHRoZSBmaWVsZCBlZGl0b3IKLSAgICAgKiBAcGFyYW0gbnVtQ29sdW1ucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIHRoZSByYWRpbyBidXR0b24gcHJlc2VudGF0aW9uCi0gICAgICogQHBhcmFtIGxhYmVsQW5kVmFsdWVzIGxpc3Qgb2YgcmFkaW8gYnV0dG9uIFtsYWJlbCwgdmFsdWVdIGVudHJpZXM7Ci0gICAgICogIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCB3aGVuIHRoZSByYWRpbyBidXR0b24gaXMgc2VsZWN0ZWQKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhlIGZpZWxkIGVkaXRvcidzIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKFN0cmluZyBuYW1lLCBTdHJpbmcgbGFiZWxUZXh0LCBpbnQgbnVtQ29sdW1ucywKLSAgICAgICAgICAgIFN0cmluZ1tdW10gbGFiZWxBbmRWYWx1ZXMsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyhuYW1lLCBsYWJlbFRleHQsIG51bUNvbHVtbnMsIGxhYmVsQW5kVmFsdWVzLCBwYXJlbnQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcmFkaW8gZ3JvdXAgZmllbGQgZWRpdG9yLgotICAgICAqIDxwPgotICAgICAqIEV4YW1wbGUgdXNhZ2U6Ci0gICAgICogPHByZT4KLSAgICAgKgkJUmFkaW9Hcm91cEZpZWxkRWRpdG9yIGVkaXRvcj0gbmV3IFJhZGlvR3JvdXBGaWVsZEVkaXRvcigKLSAgICAgKgkJCSJHZW5lcmFsUGFnZS5Eb3VibGVDbGljayIsIHJlc05hbWUsIDEsCi0gICAgICoJCQluZXcgU3RyaW5nW11bXSB7Ci0gICAgICoJCQkJeyJPcGVuIEJyb3dzZXIiLCAib3BlbiJ9LAotICAgICAqCQkJCXsiRXhwYW5kIFRyZWUiLCAiZXhwYW5kIn0KLSAgICAgKgkJCX0sCi0gICAgICogICAgICAgICAgcGFyZW50LAotICAgICAqICAgICAgICAgIHRydWUpOwkKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdGhpcyBmaWVsZCBlZGl0b3Igd29ya3Mgb24KLSAgICAgKiBAcGFyYW0gbGFiZWxUZXh0IHRoZSBsYWJlbCB0ZXh0IG9mIHRoZSBmaWVsZCBlZGl0b3IKLSAgICAgKiBAcGFyYW0gbnVtQ29sdW1ucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIHRoZSByYWRpbyBidXR0b24gcHJlc2VudGF0aW9uCi0gICAgICogQHBhcmFtIGxhYmVsQW5kVmFsdWVzIGxpc3Qgb2YgcmFkaW8gYnV0dG9uIFtsYWJlbCwgdmFsdWVdIGVudHJpZXM7Ci0gICAgICogIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCB3aGVuIHRoZSByYWRpbyBidXR0b24gaXMgc2VsZWN0ZWQKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhlIGZpZWxkIGVkaXRvcidzIGNvbnRyb2wKLSAgICAgKiBAcGFyYW0gdXNlR3JvdXAgd2hldGhlciB0byB1c2UgYSBHcm91cCBjb250cm9sIHRvIGNvbnRhaW4gdGhlIHJhZGlvIGJ1dHRvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKFN0cmluZyBuYW1lLCBTdHJpbmcgbGFiZWxUZXh0LCBpbnQgbnVtQ29sdW1ucywKLSAgICAgICAgICAgIFN0cmluZ1tdW10gbGFiZWxBbmRWYWx1ZXMsIENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gdXNlR3JvdXApIHsKLSAgICAgICAgaW5pdChuYW1lLCBsYWJlbFRleHQpOwotICAgICAgICBBc3NlcnQuaXNUcnVlKGNoZWNrQXJyYXkobGFiZWxBbmRWYWx1ZXMpKTsKLSAgICAgICAgdGhpcy5sYWJlbHNBbmRWYWx1ZXMgPSBsYWJlbEFuZFZhbHVlczsKLSAgICAgICAgdGhpcy5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICAgICAgdGhpcy51c2VHcm91cCA9IHVzZUdyb3VwOwotICAgICAgICBjcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGp1c3RGb3JOdW1Db2x1bW5zKGludCBudW1Db2x1bW5zKSB7Ci0gICAgICAgIENvbnRyb2wgY29udHJvbCA9IGdldExhYmVsQ29udHJvbCgpOwotICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAoKEdyaWREYXRhKSBjb250cm9sLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zOwotICAgICAgICB9Ci0gICAgICAgICgoR3JpZERhdGEpIHJhZGlvQm94LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIDxjb2RlPlN0cmluZ1tdW108L2NvZGU+IGlzIG9mICJ0eXBlIiAKLSAgICAgKiA8Y29kZT5TdHJpbmdbXVsyXTwvY29kZT4uCi0gICAgICogQHBhcmFtIHRhYmxlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIG9rLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0FycmF5KFN0cmluZ1tdW10gdGFibGUpIHsKLSAgICAgICAgaWYgKHRhYmxlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGFycmF5ID0gdGFibGVbaV07Ci0gICAgICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCB8fCBhcnJheS5sZW5ndGggIT0gMikKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0ZpbGxJbnRvR3JpZChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotICAgICAgICBpZiAodXNlR3JvdXApIHsKLSAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCA9IGdldFJhZGlvQm94Q29udHJvbChwYXJlbnQpOwotICAgICAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBnZXRMYWJlbENvbnRyb2wocGFyZW50KTsKLSAgICAgICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHVtbnM7Ci0gICAgICAgICAgICBjb250cm9sLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICAgICAgY29udHJvbCA9IGdldFJhZGlvQm94Q29udHJvbChwYXJlbnQpOwotICAgICAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gbnVtQ29sdW1uczsKLSAgICAgICAgICAgIGdkLmhvcml6b250YWxJbmRlbnQgPSBpbmRlbnQ7Ci0gICAgICAgICAgICBjb250cm9sLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvTG9hZCgpIHsKLSAgICAgICAgdXBkYXRlVmFsdWUoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGdldFByZWZlcmVuY2VOYW1lKCkpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvTG9hZERlZmF1bHQoKSB7Ci0gICAgICAgIHVwZGF0ZVZhbHVlKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRTdHJpbmcoZ2V0UHJlZmVyZW5jZU5hbWUoKSkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TdG9yZSgpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGdldFByZWZlcmVuY2VTdG9yZSgpLnNldFRvRGVmYXVsdChnZXRQcmVmZXJlbmNlTmFtZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKGdldFByZWZlcmVuY2VOYW1lKCksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZDb250cm9scygpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIGZpZWxkIGVkaXRvcidzIHJhZGlvIGdyb3VwIGNvbnRyb2wuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHRvIGNyZWF0ZSB0aGUgcmFkaW9Cb3ggaW4KLSAgICAgKiBAcmV0dXJuIHRoZSByYWRpbyBncm91cCBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIENvbXBvc2l0ZSBnZXRSYWRpb0JveENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpZiAocmFkaW9Cb3ggPT0gbnVsbCkgewotCi0gICAgICAgICAgICBGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCi0gICAgICAgICAgICBpZiAodXNlR3JvdXApIHsKLSAgICAgICAgICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICBncm91cC5zZXRGb250KGZvbnQpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZ2V0TGFiZWxUZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXAuc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgICAgICAgICByYWRpb0JveCA9IGdyb3VwOwotICAgICAgICAgICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBIT1JJWk9OVEFMX0dBUDsKLSAgICAgICAgICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgcmFkaW9Cb3guc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJhZGlvQm94ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBIT1JJWk9OVEFMX0dBUDsKLSAgICAgICAgICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgcmFkaW9Cb3guc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgICAgICAgICAgcmFkaW9Cb3guc2V0Rm9udChmb250KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmFkaW9CdXR0b25zID0gbmV3IEJ1dHRvbltsYWJlbHNBbmRWYWx1ZXMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzQW5kVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQnV0dG9uIHJhZGlvID0gbmV3IEJ1dHRvbihyYWRpb0JveCwgU1dULlJBRElPIHwgU1dULkxFRlQpOwotICAgICAgICAgICAgICAgIHJhZGlvQnV0dG9uc1tpXSA9IHJhZGlvOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxhYmVsQW5kVmFsdWUgPSBsYWJlbHNBbmRWYWx1ZXNbaV07Ci0gICAgICAgICAgICAgICAgcmFkaW8uc2V0VGV4dChsYWJlbEFuZFZhbHVlWzBdKTsKLSAgICAgICAgICAgICAgICByYWRpby5zZXREYXRhKGxhYmVsQW5kVmFsdWVbMV0pOwotICAgICAgICAgICAgICAgIHJhZGlvLnNldEZvbnQoZm9udCk7Ci0gICAgICAgICAgICAgICAgcmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKFN0cmluZykgZXZlbnQud2lkZ2V0LmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFByZXNlbnRzRGVmYXVsdFZhbHVlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVWYWx1ZUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJhZGlvQm94LmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICByYWRpb0JveCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHJhZGlvQnV0dG9ucyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGVja1BhcmVudChyYWRpb0JveCwgcGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmFkaW9Cb3g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW5kZW50IHVzZWQgZm9yIHRoZSBmaXJzdCBjb2x1bW4gb2YgdGhlIHJhZGlvbiBidXR0b24gbWF0cml4LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGVudCB0aGUgaW5kZW50IChpbiBwaXhlbHMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5kZW50KGludCBpbmRlbnQpIHsKLSAgICAgICAgaWYgKGluZGVudCA8IDApCi0gICAgICAgICAgICB0aGlzLmluZGVudCA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gaW5kZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbGVjdCB0aGUgcmFkaW8gYnV0dG9uIHRoYXQgY29uZm9ybXMgdG8gdGhlIGdpdmVuIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdGVkVmFsdWUgdGhlIHNlbGVjdGVkIHZhbHVlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVZhbHVlKFN0cmluZyBzZWxlY3RlZFZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSBzZWxlY3RlZFZhbHVlOwotICAgICAgICBpZiAocmFkaW9CdXR0b25zID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHRoaXMudmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYWRpb0J1dHRvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBCdXR0b24gcmFkaW8gPSByYWRpb0J1dHRvbnNbaV07Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3Rpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoKChTdHJpbmcpIHJhZGlvLmdldERhdGEoKSkuZXF1YWxzKHRoaXMudmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmFkaW8uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZm91bmQpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2Ugd2VyZW4ndCBhYmxlIHRvIGZpbmQgdGhlIHZhbHVlLiBTbyB3ZSBzZWxlY3QgdGhlIGZpcnN0Ci0gICAgICAgIC8vIHJhZGlvIGJ1dHRvbiBhcyBhIGRlZmF1bHQuCi0gICAgICAgIGlmIChyYWRpb0J1dHRvbnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgcmFkaW9CdXR0b25zWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSAoU3RyaW5nKSByYWRpb0J1dHRvbnNbMF0uZ2V0RGF0YSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgRmllbGRFZGl0b3Iuc2V0RW5hYmxlZChib29sZWFuLENvbXBvc2l0ZSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaWYgKCF1c2VHcm91cCkKLSAgICAgICAgICAgIHN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCwgcGFyZW50KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYWRpb0J1dHRvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHJhZGlvQnV0dG9uc1tpXS5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1NjYWxlRmllbGRFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvU2NhbGVGaWVsZEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGFjM2NhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvU2NhbGVGaWVsZEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjYWxlOwotCi0vKioKLSAqIEEgZmllbGQgZWRpdG9yIGZvciBhbiBpbnRlZ2VyIHR5cGUgcHJlZmVyZW5jZS4gVGhpcyBjbGFzcyBtYXkgYmUgdXNlZCBhcyBpcywKLSAqIG9yIHN1YmNsYXNzZWQgYXMgcmVxdWlyZWQuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFNjYWxlRmllbGRFZGl0b3IgZXh0ZW5kcyBGaWVsZEVkaXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBWYWx1ZSB0aGF0IHdpbGwgZmVlZCBTY2FsZS5zZXRJbmNyZW1lbnQoaW50KS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBpbmNyZW1lbnRWYWx1ZTsKLQotICAgIC8qKgotICAgICAqIFZhbHVlIHRoYXQgd2lsbCBmZWVkIFNjYWxlLnNldE1heGltdW0oaW50KS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtYXhWYWx1ZTsKLQotICAgIC8qKgotICAgICAqIFZhbHVlIHRoYXQgd2lsbCBmZWVkIFNjYWxlLnNldE1pbmltdW0oaW50KS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtaW5WYWx1ZTsKLQotICAgIC8qKgotICAgICAqIE9sZCBpbnRlZ2VyIHZhbHVlLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG9sZFZhbHVlOwotCi0gICAgLyoqCi0gICAgICogVmFsdWUgdGhhdCB3aWxsIGZlZWQgU2NhbGUuc2V0UGFnZUluY3JlbWVudChpbnQpLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHBhZ2VJbmNyZW1lbnRWYWx1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBzY2FsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2NhbGUgc2NhbGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgc2NhbGUgZmllbGQgZWRpdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0aGlzIGZpZWxkIGVkaXRvciB3b3JrcyBvbgotICAgICAqIEBwYXJhbSBsYWJlbFRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSBsYWJlbCB0ZXh0IG9mIHRoZSBmaWVsZCBlZGl0b3IKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IG9mIHRoZSBmaWVsZCBlZGl0b3IncyBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIFNjYWxlRmllbGRFZGl0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBsYWJlbFRleHQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIobmFtZSwgbGFiZWxUZXh0LCBwYXJlbnQpOwotICAgICAgICBzZXREZWZhdWx0VmFsdWVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHNjYWxlIGZpZWxkIGVkaXRvciB3aXRoIHBhcnRpY3VsYXIgc2NhbGUgdmFsdWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0aGlzIGZpZWxkIGVkaXRvciB3b3JrcyBvbgotICAgICAqIEBwYXJhbSBsYWJlbFRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSBsYWJlbCB0ZXh0IG9mIHRoZSBmaWVsZCBlZGl0b3IKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IG9mIHRoZSBmaWVsZCBlZGl0b3IncyBjb250cm9sCi0gICAgICogQHBhcmFtIG1pbgotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHVzZWQgZm9yIFNjYWxlLnNldE1pbmltdW0oaW50KS4KLSAgICAgKiBAcGFyYW0gbWF4Ci0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdXNlZCBmb3IgU2NhbGUuc2V0TWF4aW11bShpbnQpLgotICAgICAqIEBwYXJhbSBpbmNyZW1lbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB1c2VkIGZvciBTY2FsZS5zZXRJbmNyZW1lbnQoaW50KS4KLSAgICAgKiBAcGFyYW0gcGFnZUluY3JlbWVudAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHVzZWQgZm9yIFNjYWxlLnNldFBhZ2VJbmNyZW1lbnQoaW50KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NhbGVGaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsVGV4dCwgQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIGludCBtaW4sIGludCBtYXgsIGludCBpbmNyZW1lbnQsIGludCBwYWdlSW5jcmVtZW50KSB7Ci0gICAgICAgIHN1cGVyKG5hbWUsIGxhYmVsVGV4dCwgcGFyZW50KTsKLSAgICAgICAgc2V0VmFsdWVzKG1pbiwgbWF4LCBpbmNyZW1lbnQsIHBhZ2VJbmNyZW1lbnQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvciNhZGp1c3RGb3JOdW1Db2x1bW5zKGludCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGp1c3RGb3JOdW1Db2x1bW5zKGludCBudW1Db2x1bW5zKSB7Ci0gICAgICAgICgoR3JpZERhdGEpIHNjYWxlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zIC0gMTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3IjZG9GaWxsSW50b0dyaWQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotICAgICAqICAgICAgaW50KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRmlsbEludG9HcmlkKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0gICAgICAgIENvbnRyb2wgY29udHJvbCA9IGdldExhYmVsQ29udHJvbChwYXJlbnQpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBjb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICAgIHNjYWxlID0gZ2V0U2NhbGVDb250cm9sKHBhcmVudCk7Ci0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zIC0gMTsKLSAgICAgICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIHNjYWxlLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICB1cGRhdGVTY2FsZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvciNkb0xvYWQoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvTG9hZCgpIHsKLSAgICAgICAgaWYgKHNjYWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCB2YWx1ZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludChnZXRQcmVmZXJlbmNlTmFtZSgpKTsKLSAgICAgICAgICAgIHNjYWxlLnNldFNlbGVjdGlvbih2YWx1ZSk7Ci0gICAgICAgICAgICBvbGRWYWx1ZSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yI2RvTG9hZERlZmF1bHQoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvTG9hZERlZmF1bHQoKSB7Ci0gICAgICAgIGlmIChzY2FsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgdmFsdWUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0SW50KGdldFByZWZlcmVuY2VOYW1lKCkpOwotICAgICAgICAgICAgc2NhbGUuc2V0U2VsZWN0aW9uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3IjZG9TdG9yZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TdG9yZSgpIHsKLSAgICAgICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLSAgICAgICAgICAgICAgICAuc2V0VmFsdWUoZ2V0UHJlZmVyZW5jZU5hbWUoKSwgc2NhbGUuZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBTY2FsZS5zZXRJbmNyZW1lbnQoaW50KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZS4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjYWxlI3NldEluY3JlbWVudChpbnQpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbmNyZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBpbmNyZW1lbnRWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgU2NhbGUuc2V0TWF4aW11bShpbnQpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2NhbGUjc2V0TWF4aW11bShpbnQpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNYXhpbXVtKCkgewotICAgICAgICByZXR1cm4gbWF4VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIFNjYWxlLnNldE1pbmltdW0oaW50KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZS4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjYWxlI3NldE1pbmltdW0oaW50KQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWluaW11bSgpIHsKLSAgICAgICAgcmV0dXJuIG1pblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvciNnZXROdW1iZXJPZkNvbnRyb2xzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mQ29udHJvbHMoKSB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBTY2FsZS5zZXRQYWdlSW5jcmVtZW50KGludCkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY2FsZSNzZXRQYWdlSW5jcmVtZW50KGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBhZ2VJbmNyZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBwYWdlSW5jcmVtZW50VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIGZpZWxkIGVkaXRvcidzIHNjYWxlIGNvbnRyb2wuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2NhbGUgY29udHJvbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc2NhbGUgZmllbGQgaXMKLSAgICAgKiAgICAgICAgIGNyZWF0ZWQgeWV0Ci0gICAgICovCi0gICAgcHVibGljIFNjYWxlIGdldFNjYWxlQ29udHJvbCgpIHsKLSAgICAgICAgcmV0dXJuIHNjYWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCBlZGl0b3IncyBzY2FsZSBjb250cm9sLiBUaGUgY29udHJvbCBpcyBjcmVhdGVkIGlmIGl0Ci0gICAgICogZG9lcyBub3QgeWV0IGV4aXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBzY2FsZSBjb250cm9sCi0gICAgICovCi0gICAgcHJpdmF0ZSBTY2FsZSBnZXRTY2FsZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpZiAoc2NhbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgc2NhbGUgPSBuZXcgU2NhbGUocGFyZW50LCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICAgICAgICBzY2FsZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICAgICAgc2NhbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBzY2FsZS5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hlY2tQYXJlbnQoc2NhbGUsIHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNjYWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHZhcmlvdXMgc2NhbGUgZmllbGRzLiAgVGhlc2UgZGVmYXVsdHMgYXJlOjxicj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPk1pbmltdW0gID0gMAotICAgICAqIDxsaT5NYXhpbWltID0gMTAKLSAgICAgKiA8bGk+SW5jcmVtZW50ID0gMQotICAgICAqIDxsaT5QYWdlIEluY3JlbWVudCA9IDEKLSAgICAgKiA8L3VsPiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdFZhbHVlcygpIHsKLSAgICAgICAgc2V0VmFsdWVzKDAsIDEwLCAxLCAxKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3Ijc2V0Rm9jdXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBpZiAoc2NhbGUgIT0gbnVsbCAmJiAhc2NhbGUuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBzY2FsZS5zZXRGb2N1cygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSB0byBiZSB1c2VkIGZvciBTY2FsZS5zZXRJbmNyZW1lbnQoaW50KSBhbmQgdXBkYXRlIHRoZQotICAgICAqIHNjYWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmNyZW1lbnQKLSAgICAgKiAgICAgICAgICAgIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDAuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY2FsZSNzZXRJbmNyZW1lbnQoaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluY3JlbWVudChpbnQgaW5jcmVtZW50KSB7Ci0gICAgICAgIHRoaXMuaW5jcmVtZW50VmFsdWUgPSBpbmNyZW1lbnQ7Ci0gICAgICAgIHVwZGF0ZVNjYWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSB0byBiZSB1c2VkIGZvciBTY2FsZS5zZXRNYXhpbXVtKGludCkgYW5kIHVwZGF0ZSB0aGUKLSAgICAgKiBzY2FsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWF4Ci0gICAgICogICAgICAgICAgICBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAwLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2NhbGUjc2V0TWF4aW11bShpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWF4aW11bShpbnQgbWF4KSB7Ci0gICAgICAgIHRoaXMubWF4VmFsdWUgPSBtYXg7Ci0gICAgICAgIHVwZGF0ZVNjYWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSB0byBiZSB1c2VkIGZvciBTY2FsZS5zZXRNaW51bXVtKGludCkgYW5kIHVwZGF0ZSB0aGUKLSAgICAgKiBzY2FsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWluCi0gICAgICogICAgICAgICAgICBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAwLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2NhbGUjc2V0TWluaW11bShpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWluaW11bShpbnQgbWluKSB7Ci0gICAgICAgIHRoaXMubWluVmFsdWUgPSBtaW47Ci0gICAgICAgIHVwZGF0ZVNjYWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSB0byBiZSB1c2VkIGZvciBTY2FsZS5zZXRQYWdlSW5jcmVtZW50KGludCkgYW5kIHVwZGF0ZSB0aGUKLSAgICAgKiBzY2FsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFnZUluY3JlbWVudAotICAgICAqICAgICAgICAgICAgYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjYWxlI3NldFBhZ2VJbmNyZW1lbnQoaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhZ2VJbmNyZW1lbnQoaW50IHBhZ2VJbmNyZW1lbnQpIHsKLSAgICAgICAgdGhpcy5wYWdlSW5jcmVtZW50VmFsdWUgPSBwYWdlSW5jcmVtZW50OwotICAgICAgICB1cGRhdGVTY2FsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBhbGwgU2NhbGUgdmFsdWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB1c2VkIGZvciBTY2FsZS5zZXRNaW5pbXVtKGludCkuCi0gICAgICogQHBhcmFtIG1heAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHVzZWQgZm9yIFNjYWxlLnNldE1heGltdW0oaW50KS4KLSAgICAgKiBAcGFyYW0gaW5jcmVtZW50Ci0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdXNlZCBmb3IgU2NhbGUuc2V0SW5jcmVtZW50KGludCkuCi0gICAgICogQHBhcmFtIHBhZ2VJbmNyZW1lbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB1c2VkIGZvciBTY2FsZS5zZXRQYWdlSW5jcmVtZW50KGludCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFZhbHVlcyhpbnQgbWluLCBpbnQgbWF4LCBpbnQgaW5jcmVtZW50LCBpbnQgcGFnZUluY3JlbWVudCkgewotICAgICAgICB0aGlzLmluY3JlbWVudFZhbHVlID0gaW5jcmVtZW50OwotICAgICAgICB0aGlzLm1heFZhbHVlID0gbWF4OwotICAgICAgICB0aGlzLm1pblZhbHVlID0gbWluOwotICAgICAgICB0aGlzLnBhZ2VJbmNyZW1lbnRWYWx1ZSA9IHBhZ2VJbmNyZW1lbnQ7Ci0gICAgICAgIHVwZGF0ZVNjYWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBzY2FsZSBwYXJ0aWN1bGFycyB3aXRoIHNldCB2YWx1ZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNjYWxlKCkgewotICAgICAgICBpZiAoc2NhbGUgIT0gbnVsbCAmJiAhc2NhbGUuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBzY2FsZS5zZXRNaW5pbXVtKGdldE1pbmltdW0oKSk7Ci0gICAgICAgICAgICBzY2FsZS5zZXRNYXhpbXVtKGdldE1heGltdW0oKSk7Ci0gICAgICAgICAgICBzY2FsZS5zZXRJbmNyZW1lbnQoZ2V0SW5jcmVtZW50KCkpOwotICAgICAgICAgICAgc2NhbGUuc2V0UGFnZUluY3JlbWVudChnZXRQYWdlSW5jcmVtZW50KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtcyB0aGlzIGZpZWxkIGVkaXRvcidzIGxpc3RlbmVyLCBpZiBpdCBoYXMgb25lLCBhYm91dCBhIGNoYW5nZSB0bwotICAgICAqIHRoZSB2YWx1ZSAoPGNvZGU+VkFMVUU8L2NvZGU+IHByb3BlcnR5KSBwcm92aWRlZCB0aGF0IHRoZSBvbGQgYW5kIG5ldwotICAgICAqIHZhbHVlcyBhcmUgZGlmZmVyZW50LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaG9vayBpcyA8ZW0+bm90PC9lbT4gY2FsbGVkIHdoZW4gdGhlIHNjYWxlIGlzIGluaXRpYWxpemVkIChvcgotICAgICAqIHJlc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlKSBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoKSB7Ci0gICAgICAgIHNldFByZXNlbnRzRGVmYXVsdFZhbHVlKGZhbHNlKTsKLQotICAgICAgICBpbnQgbmV3VmFsdWUgPSBzY2FsZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG9sZFZhbHVlKSB7Ci0gICAgICAgICAgICBmaXJlU3RhdGVDaGFuZ2VkKElTX1ZBTElELCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBmaXJlVmFsdWVDaGFuZ2VkKFZBTFVFLCBuZXcgSW50ZWdlcihvbGRWYWx1ZSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKG5ld1ZhbHVlKSk7Ci0gICAgICAgICAgICBvbGRWYWx1ZSA9IG5ld1ZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9TdHJpbmdCdXR0b25GaWVsZEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcHJlZmVyZW5jZS9TdHJpbmdCdXR0b25GaWVsZEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjhmMDAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvU3RyaW5nQnV0dG9uRmllbGRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgVGhpZXJyeSBMYWNoIC0gdGhpZXJyeS5sYWNoQGJiZG9kZXRyb2l0LmNvbSAtIEZpeCBmb3IgQnVnIDM3MTU1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBmaWVsZCBlZGl0b3IgZm9yIGEgc3RyaW5nIHR5cGUgcHJlZmVyZW5jZSB0aGF0IHByZXNlbnRzCi0gKiBhIHN0cmluZyBpbnB1dCBmaWVsZCB3aXRoIGEgY2hhbmdlIGJ1dHRvbiB0byBpdHMgcmlnaHQgdG8gZWRpdCB0aGUKLSAqIGlucHV0IGZpZWxkJ3MgY29udGVudC4gV2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBjaGFuZ2UgYnV0dG9uLCB0aGUKLSAqIGFic3RyYWN0IGZyYW1ld29yayBtZXRob2QgPGNvZGU+Y2hhbmdlUHJlc3NlZCgpPC9jb2RlPiBnZXRzIGNhbGxlZAotICogdG8gY29tcHV0ZSBhIG5ldyBzdHJpbmcuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJpbmdCdXR0b25GaWVsZEVkaXRvciBleHRlbmRzIFN0cmluZ0ZpZWxkRWRpdG9yIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBjaGFuZ2UgYnV0dG9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogKGJlZm9yZSBjcmVhdGlvbiBhbmQgYWZ0ZXIgZGlzcG9zYWwpLgotICAgICAqLwotICAgIHByaXZhdGUgQnV0dG9uIGNoYW5nZUJ1dHRvbjsKLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgY2hhbmdlIGJ1dHRvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbWlzc2luZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjaGFuZ2VCdXR0b25UZXh0OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBzdHJpbmcgYnV0dG9uIGZpZWxkIGVkaXRvciAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nQnV0dG9uRmllbGRFZGl0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHN0cmluZyBidXR0b24gZmllbGQgZWRpdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHRoaXMgZmllbGQgZWRpdG9yIHdvcmtzIG9uCi0gICAgICogQHBhcmFtIGxhYmVsVGV4dCB0aGUgbGFiZWwgdGV4dCBvZiB0aGUgZmllbGQgZWRpdG9yCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG9mIHRoZSBmaWVsZCBlZGl0b3IncyBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ0J1dHRvbkZpZWxkRWRpdG9yKFN0cmluZyBuYW1lLCBTdHJpbmcgbGFiZWxUZXh0LAotICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpbml0KG5hbWUsIGxhYmVsVGV4dCk7Ci0gICAgICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkanVzdEZvck51bUNvbHVtbnMoaW50IG51bUNvbHVtbnMpIHsKLSAgICAgICAgKChHcmlkRGF0YSkgZ2V0VGV4dENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gbnVtQ29sdW1ucyAtIDI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCB0aGlzIGZpZWxkIGVkaXRvcidzIGNoYW5nZSBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgYSBjb3JyZXNwb25kaW5nCi0gICAgICogbmV3IHN0cmluZyBmb3IgdGhlIHRleHQgZmllbGQuIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiwKLSAgICAgKiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCB2YWx1ZSByZW1haW5zLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBzdHJpbmcgdG8gZGlzcGxheSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gbGVhdmUgdGhlCi0gICAgICogIG9sZCBzdHJpbmcgc2hvd2luZwotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgY2hhbmdlUHJlc3NlZCgpOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBTdHJpbmdGaWVsZEVkaXRvciAoYW5kIEZpZWxkRWRpdG9yKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0ZpbGxJbnRvR3JpZChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotICAgICAgICBzdXBlci5kb0ZpbGxJbnRvR3JpZChwYXJlbnQsIG51bUNvbHVtbnMgLSAxKTsKLSAgICAgICAgY2hhbmdlQnV0dG9uID0gZ2V0Q2hhbmdlQ29udHJvbChwYXJlbnQpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgaW50IHdpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGNoYW5nZUJ1dHRvbiwKLSAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0gICAgICAgIGdkLndpZHRoSGludCA9IE1hdGgubWF4KHdpZHRoSGludCwgY2hhbmdlQnV0dG9uLmNvbXB1dGVTaXplKAotICAgICAgICAgICAgICAgIFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSkueCk7Ci0gICAgICAgIGNoYW5nZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNoYW5nZSBjb250cm9sLiBDcmVhdGUgaXQgaW4gcGFyZW50IGlmIHJlcXVpcmVkLgotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiBAcmV0dXJuIEJ1dHRvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBCdXR0b24gZ2V0Q2hhbmdlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGlmIChjaGFuZ2VCdXR0b24gPT0gbnVsbCkgewotICAgICAgICAgICAgY2hhbmdlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgIGlmIChjaGFuZ2VCdXR0b25UZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgY2hhbmdlQnV0dG9uVGV4dCA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygib3BlbkNoYW5nZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBjaGFuZ2VCdXR0b24uc2V0VGV4dChjaGFuZ2VCdXR0b25UZXh0KTsKLSAgICAgICAgICAgIGNoYW5nZUJ1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICAgICAgY2hhbmdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2dCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSBjaGFuZ2VQcmVzc2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJpbmdWYWx1ZShuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGNoYW5nZUJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlQnV0dG9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoZWNrUGFyZW50KGNoYW5nZUJ1dHRvbiwgcGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hhbmdlQnV0dG9uOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZkNvbnRyb2xzKCkgewotICAgICAgICByZXR1cm4gMzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgZmllbGQgZWRpdG9yJ3Mgc2hlbGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgaWYgKGNoYW5nZUJ1dHRvbiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBjaGFuZ2VCdXR0b24uZ2V0U2hlbGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0ZXh0IG9mIHRoZSBjaGFuZ2UgYnV0dG9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgdGhlIG5ldyB0ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2hhbmdlQnV0dG9uVGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHRleHQpOwotICAgICAgICBjaGFuZ2VCdXR0b25UZXh0ID0gdGV4dDsKLSAgICAgICAgaWYgKGNoYW5nZUJ1dHRvbiAhPSBudWxsKQotICAgICAgICAgICAgY2hhbmdlQnV0dG9uLnNldFRleHQodGV4dCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvciNzZXRFbmFibGVkKGJvb2xlYW4sIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQsIHBhcmVudCk7Ci0gICAgICAgIGlmIChjaGFuZ2VCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgY2hhbmdlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvU3RyaW5nRmllbGRFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvU3RyaW5nRmllbGRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyOTJkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL1N0cmluZ0ZpZWxkRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSBmaWVsZCBlZGl0b3IgZm9yIGEgc3RyaW5nIHR5cGUgcHJlZmVyZW5jZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgdXNlZCBhcyBpcywgb3Igc3ViY2xhc3NlZCBhcyByZXF1aXJlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ0ZpZWxkRWRpdG9yIGV4dGVuZHMgRmllbGRFZGl0b3IgewotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGlvbiBzdHJhdGVneSBjb25zdGFudCAodmFsdWUgPGNvZGU+MDwvY29kZT4pIGluZGljYXRpbmcgdGhhdAotICAgICAqIHRoZSBlZGl0b3Igc2hvdWxkIHBlcmZvcm0gdmFsaWRhdGlvbiBhZnRlciBldmVyeSBrZXkgc3Ryb2tlLgotICAgICAqCi0gICAgICogQHNlZSAjc2V0VmFsaWRhdGVTdHJhdGVneQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElEQVRFX09OX0tFWV9TVFJPS0UgPSAwOwotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGlvbiBzdHJhdGVneSBjb25zdGFudCAodmFsdWUgPGNvZGU+MTwvY29kZT4pIGluZGljYXRpbmcgdGhhdAotICAgICAqIHRoZSBlZGl0b3Igc2hvdWxkIHBlcmZvcm0gdmFsaWRhdGlvbiBvbmx5IHdoZW4gdGhlIHRleHQgd2lkZ2V0IAotICAgICAqIGxvc2VzIGZvY3VzLgotICAgICAqCi0gICAgICogQHNlZSAjc2V0VmFsaWRhdGVTdHJhdGVneQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElEQVRFX09OX0ZPQ1VTX0xPU1QgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGV4dCBsaW1pdCBjb25zdGFudCAodmFsdWUgPGNvZGU+LTE8L2NvZGU+KSBpbmRpY2F0aW5nIHVubGltaXRlZAotICAgICAqIHRleHQgbGltaXQgYW5kIHdpZHRoLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IFVOTElNSVRFRCA9IC0xOwotCi0gICAgLyoqCi0gICAgICogQ2FjaGVkIHZhbGlkIHN0YXRlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkOwotCi0gICAgLyoqCi0gICAgICogT2xkIHRleHQgdmFsdWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgb2xkVmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGV4dCBmaWVsZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBUZXh0IHRleHRGaWVsZDsKLQotICAgIC8qKgotICAgICAqIFdpZHRoIG9mIHRleHQgZmllbGQgaW4gY2hhcmFjdGVyczsgaW5pdGlhbGx5IHVubGltaXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB3aWR0aEluQ2hhcnMgPSBVTkxJTUlURUQ7Ci0KLSAgICAvKioKLSAgICAgKiBUZXh0IGxpbWl0IG9mIHRleHQgZmllbGQgaW4gY2hhcmFjdGVyczsgaW5pdGlhbGx5IHVubGltaXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB0ZXh0TGltaXQgPSBVTkxJTUlURUQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZXJyb3IgbWVzc2FnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1wdHkgc3RyaW5nIGlzIGxlZ2FsOwotICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IGJ5IGRlZmF1bHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGVtcHR5U3RyaW5nQWxsb3dlZCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmFsaWRhdGlvbiBzdHJhdGVneTsgCi0gICAgICogPGNvZGU+VkFMSURBVEVfT05fS0VZX1NUUk9LRTwvY29kZT4gYnkgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB2YWxpZGF0ZVN0cmF0ZWd5ID0gVkFMSURBVEVfT05fS0VZX1NUUk9LRTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgc3RyaW5nIGZpZWxkIGVkaXRvciAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nRmllbGRFZGl0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHN0cmluZyBmaWVsZCBlZGl0b3IuCi0gICAgICogVXNlIHRoZSBtZXRob2QgPGNvZGU+c2V0VGV4dExpbWl0PC9jb2RlPiB0byBsaW1pdCB0aGUgdGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0aGlzIGZpZWxkIGVkaXRvciB3b3JrcyBvbgotICAgICAqIEBwYXJhbSBsYWJlbFRleHQgdGhlIGxhYmVsIHRleHQgb2YgdGhlIGZpZWxkIGVkaXRvcgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHRleHQgaW5wdXQgZmllbGQgaW4gY2hhcmFjdGVycywKLSAgICAgKiAgb3IgPGNvZGU+VU5MSU1JVEVEPC9jb2RlPiBmb3Igbm8gbGltaXQKLSAgICAgKiBAcGFyYW0gc3RyYXRlZ3kgZWl0aGVyIDxjb2RlPlZBTElEQVRFX09OX0tFWV9TVFJPS0U8L2NvZGU+IHRvIHBlcmZvcm0KLSAgICAgKiAgb24gdGhlIGZseSBjaGVja2luZyAodGhlIGRlZmF1bHQpLCBvciA8Y29kZT5WQUxJREFURV9PTl9GT0NVU19MT1NUPC9jb2RlPiB0bwotICAgICAqICBwZXJmb3JtIHZhbGlkYXRpb24gb25seSBhZnRlciB0aGUgdGV4dCBoYXMgYmVlbiB0eXBlZCBpbgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGUgZmllbGQgZWRpdG9yJ3MgY29udHJvbAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nRmllbGRFZGl0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBsYWJlbFRleHQsIGludCB3aWR0aCwKLSAgICAgICAgICAgIGludCBzdHJhdGVneSwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpbml0KG5hbWUsIGxhYmVsVGV4dCk7Ci0gICAgICAgIHdpZHRoSW5DaGFycyA9IHdpZHRoOwotICAgICAgICBzZXRWYWxpZGF0ZVN0cmF0ZWd5KHN0cmF0ZWd5KTsKLSAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICBlcnJvck1lc3NhZ2UgPSBKRmFjZVJlc291cmNlcwotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIlN0cmluZ0ZpZWxkRWRpdG9yLmVycm9yTWVzc2FnZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdHJpbmcgZmllbGQgZWRpdG9yLgotICAgICAqIFVzZSB0aGUgbWV0aG9kIDxjb2RlPnNldFRleHRMaW1pdDwvY29kZT4gdG8gbGltaXQgdGhlIHRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdGhpcyBmaWVsZCBlZGl0b3Igd29ya3Mgb24KLSAgICAgKiBAcGFyYW0gbGFiZWxUZXh0IHRoZSBsYWJlbCB0ZXh0IG9mIHRoZSBmaWVsZCBlZGl0b3IKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGlucHV0IGZpZWxkIGluIGNoYXJhY3RlcnMsCi0gICAgICogIG9yIDxjb2RlPlVOTElNSVRFRDwvY29kZT4gZm9yIG5vIGxpbWl0Ci0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG9mIHRoZSBmaWVsZCBlZGl0b3IncyBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ0ZpZWxkRWRpdG9yKFN0cmluZyBuYW1lLCBTdHJpbmcgbGFiZWxUZXh0LCBpbnQgd2lkdGgsCi0gICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMobmFtZSwgbGFiZWxUZXh0LCB3aWR0aCwgVkFMSURBVEVfT05fS0VZX1NUUk9LRSwgcGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgc3RyaW5nIGZpZWxkIGVkaXRvciBvZiB1bmxpbWl0ZWQgd2lkdGguCi0gICAgICogVXNlIHRoZSBtZXRob2QgPGNvZGU+c2V0VGV4dExpbWl0PC9jb2RlPiB0byBsaW1pdCB0aGUgdGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0aGlzIGZpZWxkIGVkaXRvciB3b3JrcyBvbgotICAgICAqIEBwYXJhbSBsYWJlbFRleHQgdGhlIGxhYmVsIHRleHQgb2YgdGhlIGZpZWxkIGVkaXRvcgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGUgZmllbGQgZWRpdG9yJ3MgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdGaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsVGV4dCwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICB0aGlzKG5hbWUsIGxhYmVsVGV4dCwgVU5MSU1JVEVELCBwYXJlbnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRqdXN0Rm9yTnVtQ29sdW1ucyhpbnQgbnVtQ29sdW1ucykgewotICAgICAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgdGV4dEZpZWxkLmdldExheW91dERhdGEoKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zIC0gMTsKLSAgICAgICAgLy8gV2Ugb25seSBncmFiIGV4Y2VzcyBzcGFjZSBpZiB3ZSBoYXZlIHRvCi0gICAgICAgIC8vIElmIGFub3RoZXIgZmllbGQgZWRpdG9yIGhhcyBtb3JlIGNvbHVtbnMgdGhlbgotICAgICAgICAvLyB3ZSBhc3N1bWUgaXQgaXMgc2V0dGluZyB0aGUgd2lkdGguCi0gICAgICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBnZC5ob3Jpem9udGFsU3BhbiA9PSAxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSB0ZXh0IGlucHV0IGZpZWxkIGNvbnRhaW5zIGEgdmFsaWQgdmFsdWUgb3Igbm90LgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmllbGQgdmFsdWUgaXMgdmFsaWQsCi0gICAgICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGludmFsaWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1N0YXRlKCkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBpZiAoZW1wdHlTdHJpbmdBbGxvd2VkKQotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLQotICAgICAgICBpZiAodGV4dEZpZWxkID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLQotICAgICAgICBTdHJpbmcgdHh0ID0gdGV4dEZpZWxkLmdldFRleHQoKTsKLQotICAgICAgICByZXN1bHQgPSAodHh0LnRyaW0oKS5sZW5ndGgoKSA+IDApIHx8IGVtcHR5U3RyaW5nQWxsb3dlZDsKLQotICAgICAgICAvLyBjYWxsIGhvb2sgZm9yIHN1YmNsYXNzZXMKLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIGRvQ2hlY2tTdGF0ZSgpOwotCi0gICAgICAgIGlmIChyZXN1bHQpCi0gICAgICAgICAgICBjbGVhckVycm9yTWVzc2FnZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzaG93RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIb29rIGZvciBzdWJjbGFzc2VzIHRvIGRvIHNwZWNpZmljIHN0YXRlIGNoZWNrcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgZG9lcwotICAgICAqIG5vdGhpbmcgYW5kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uICBTdWJjbGFzc2VzIHNob3VsZCAKLSAgICAgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBzcGVjaWZpYyBzdGF0ZSBjaGVja3MuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmllbGQgdmFsdWUgaXMgdmFsaWQsCi0gICAgICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGludmFsaWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb0NoZWNrU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGxzIHRoaXMgZmllbGQgZWRpdG9yJ3MgYmFzaWMgY29udHJvbHMgaW50byB0aGUgZ2l2ZW4gcGFyZW50LgotICAgICAqIDxwPgotICAgICAqIFRoZSBzdHJpbmcgZmllbGQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5GaWVsZEVkaXRvcjwvY29kZT4KLSAgICAgKiBmcmFtZXdvcmsgbWV0aG9kIGNvbnRyaWJ1dGVzIHRoZSB0ZXh0IGZpZWxkLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZQotICAgICAqIGJ1dCBtdXN0IGNhbGwgPGNvZGU+c3VwZXIuZG9GaWxsSW50b0dyaWQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0ZpbGxJbnRvR3JpZChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotICAgICAgICBnZXRMYWJlbENvbnRyb2wocGFyZW50KTsKLQotICAgICAgICB0ZXh0RmllbGQgPSBnZXRUZXh0Q29udHJvbChwYXJlbnQpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHVtbnMgLSAxOwotICAgICAgICBpZiAod2lkdGhJbkNoYXJzICE9IFVOTElNSVRFRCkgewotICAgICAgICAgICAgR0MgZ2MgPSBuZXcgR0ModGV4dEZpZWxkKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCgiWCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBnZC53aWR0aEhpbnQgPSB3aWR0aEluQ2hhcnMgKiBleHRlbnQueDsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgZ2MuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgICAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICB0ZXh0RmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0xvYWQoKSB7Ci0gICAgICAgIGlmICh0ZXh0RmllbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGdldFByZWZlcmVuY2VOYW1lKCkpOwotICAgICAgICAgICAgdGV4dEZpZWxkLnNldFRleHQodmFsdWUpOwotICAgICAgICAgICAgb2xkVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9Mb2FkRGVmYXVsdCgpIHsKLSAgICAgICAgaWYgKHRleHRGaWVsZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBnZXRQcmVmZXJlbmNlTmFtZSgpKTsKLSAgICAgICAgICAgIHRleHRGaWVsZC5zZXRUZXh0KHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEZpZWxkRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvU3RvcmUoKSB7Ci0gICAgICAgIGdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKGdldFByZWZlcmVuY2VOYW1lKCksIHRleHRGaWVsZC5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIGFuZCBpZiAKLSAgICAgKiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mQ29udHJvbHMoKSB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpZWxkIGVkaXRvcidzIHZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKSB7Ci0gICAgICAgIGlmICh0ZXh0RmllbGQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0ZXh0RmllbGQuZ2V0VGV4dCgpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhnZXRQcmVmZXJlbmNlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgZmllbGQgZWRpdG9yJ3MgdGV4dCBjb250cm9sLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdGV4dCBjb250cm9sLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotICAgICAqIHRleHQgZmllbGQgaXMgY3JlYXRlZCB5ZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGV4dCBnZXRUZXh0Q29udHJvbCgpIHsKLSAgICAgICAgcmV0dXJuIHRleHRGaWVsZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgZmllbGQgZWRpdG9yJ3MgdGV4dCBjb250cm9sLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjb250cm9sIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0Ci0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50Ci0gICAgICogQHJldHVybiB0aGUgdGV4dCBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIFRleHQgZ2V0VGV4dENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpZiAodGV4dEZpZWxkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICAgICAgdGV4dEZpZWxkLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKHZhbGlkYXRlU3RyYXRlZ3kpIHsKLSAgICAgICAgICAgIGNhc2UgVkFMSURBVEVfT05fS0VZX1NUUk9LRToKLSAgICAgICAgICAgICAgICB0ZXh0RmllbGQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlciNrZXlSZWxlYXNlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50KQotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWQUxJREFURV9PTl9GT0NVU19MT1NUOgotICAgICAgICAgICAgICAgIHRleHRGaWVsZC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGVhckVycm9yTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgdGV4dEZpZWxkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoVmFsaWRTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGVhckVycm9yTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIHZhbGlkYXRlIHN0cmF0ZWd5Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGV4dEZpZWxkLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0RmllbGQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaWYgKHRleHRMaW1pdCA+IDApIHsvL09ubHkgc2V0IGxpbWl0cyBhYm92ZSAwIC0gc2VlIFNXVCBzcGVjCi0gICAgICAgICAgICAgICAgdGV4dEZpZWxkLnNldFRleHRMaW1pdCh0ZXh0TGltaXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hlY2tQYXJlbnQodGV4dEZpZWxkLCBwYXJlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXh0RmllbGQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIGFuIGVtcHR5IHN0cmluZyBpcyBhIHZhbGlkIHZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbiBlbXB0eSBzdHJpbmcgaXMgYSB2YWxpZCB2YWx1ZSwgYW5kCi0gICAgICogIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhbiBlbXB0eSBzdHJpbmcgaXMgaW52YWxpZAotICAgICAqIEBzZWUgI3NldEVtcHR5U3RyaW5nQWxsb3dlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHlTdHJpbmdBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gZW1wdHlTdHJpbmdBbGxvd2VkOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRmllbGRFZGl0b3IuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzVmFsaWQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmFsaWRTdGF0ZSgpIHsKLSAgICAgICAgaXNWYWxpZCA9IGNoZWNrU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGVtcHR5IHN0cmluZyBpcyBhIHZhbGlkIHZhbHVlIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbXB0eSBzdHJpbmcgaXMgYWxsb3dlZCwKLSAgICAgKiAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBjb25zaWRlcmVkIGludmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbXB0eVN0cmluZ0FsbG93ZWQoYm9vbGVhbiBiKSB7Ci0gICAgICAgIGVtcHR5U3RyaW5nQWxsb3dlZCA9IGI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZXJyb3IgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHdoZW4gYW5kIGlmIAotICAgICAqIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVycm9yTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBGaWVsZEVkaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgaWYgKHRleHRGaWVsZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXh0RmllbGQuc2V0Rm9jdXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyBmaWVsZCBlZGl0b3IncyB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBtZWFuaW5nIHRoZSBlbXB0eSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmdWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHRleHRGaWVsZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG9sZFZhbHVlID0gdGV4dEZpZWxkLmdldFRleHQoKTsKLSAgICAgICAgICAgIGlmICghb2xkVmFsdWUuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgICAgIHRleHRGaWVsZC5zZXRUZXh0KHZhbHVlKTsKLSAgICAgICAgICAgICAgICB2YWx1ZUNoYW5nZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB0ZXh0IGZpZWxkJ3MgdGV4dCBsaW1pdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgaW4gdGhlIHRleHQKLSAgICAgKiAgaW5wdXQgZmllbGQsIG9yIDxjb2RlPlVOTElNSVRFRDwvY29kZT4gZm9yIG5vIGxpbWl0Ci0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0TGltaXQoaW50IGxpbWl0KSB7Ci0gICAgICAgIHRleHRMaW1pdCA9IGxpbWl0OwotICAgICAgICBpZiAodGV4dEZpZWxkICE9IG51bGwpCi0gICAgICAgICAgICB0ZXh0RmllbGQuc2V0VGV4dExpbWl0KGxpbWl0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzdHJhdGVneSBmb3IgdmFsaWRhdGluZyB0aGUgdGV4dC4KLSAgICAgKiA8cD4KLSAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QgYWZ0ZXIgPGNvZGU+Y3JlYXRlUGFydENvbnRyb2w8L2NvZGU+Ci0gICAgICogaXMgY2FsbGVkLiBUaHVzIHRoaXMgbWV0aG9kIGlzIHJlYWxseSBvbmx5IHVzZWZ1bCBmb3Igc3ViY2xhc3NlcyB0byBjYWxsCi0gICAgICogaW4gdGhlaXIgY29uc3RydWN0b3IuIEhvd2V2ZXIsIGl0IGhhcyBwdWJsaWMgdmlzaWJpbGl0eSBmb3IgYmFja3dhcmQgCi0gICAgICogY29tcGF0aWJpbGl0eS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgZWl0aGVyIDxjb2RlPlZBTElEQVRFX09OX0tFWV9TVFJPS0U8L2NvZGU+IHRvIHBlcmZvcm0KLSAgICAgKiAgb24gdGhlIGZseSBjaGVja2luZyAodGhlIGRlZmF1bHQpLCBvciA8Y29kZT5WQUxJREFURV9PTl9GT0NVU19MT1NUPC9jb2RlPiB0bwotICAgICAqICBwZXJmb3JtIHZhbGlkYXRpb24gb25seSBhZnRlciB0aGUgdGV4dCBoYXMgYmVlbiB0eXBlZCBpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlU3RyYXRlZ3koaW50IHZhbHVlKSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUodmFsdWUgPT0gVkFMSURBVEVfT05fRk9DVVNfTE9TVAotICAgICAgICAgICAgICAgIHx8IHZhbHVlID09IFZBTElEQVRFX09OX0tFWV9TVFJPS0UpOwotICAgICAgICB2YWxpZGF0ZVN0cmF0ZWd5ID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvd3MgdGhlIGVycm9yIG1lc3NhZ2Ugc2V0IHZpYSA8Y29kZT5zZXRFcnJvck1lc3NhZ2U8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHNob3dFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm1zIHRoaXMgZmllbGQgZWRpdG9yJ3MgbGlzdGVuZXIsIGlmIGl0IGhhcyBvbmUsIGFib3V0IGEgY2hhbmdlCi0gICAgICogdG8gdGhlIHZhbHVlICg8Y29kZT5WQUxVRTwvY29kZT4gcHJvcGVydHkpIHByb3ZpZGVkIHRoYXQgdGhlIG9sZCBhbmQKLSAgICAgKiBuZXcgdmFsdWVzIGFyZSBkaWZmZXJlbnQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBob29rIGlzIDxlbT5ub3Q8L2VtPiBjYWxsZWQgd2hlbiB0aGUgdGV4dCBpcyBpbml0aWFsaXplZCAKLSAgICAgKiAob3IgcmVzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUpIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZCgpIHsKLSAgICAgICAgc2V0UHJlc2VudHNEZWZhdWx0VmFsdWUoZmFsc2UpOwotICAgICAgICBib29sZWFuIG9sZFN0YXRlID0gaXNWYWxpZDsKLSAgICAgICAgcmVmcmVzaFZhbGlkU3RhdGUoKTsKLQotICAgICAgICBpZiAoaXNWYWxpZCAhPSBvbGRTdGF0ZSkKLSAgICAgICAgICAgIGZpcmVTdGF0ZUNoYW5nZWQoSVNfVkFMSUQsIG9sZFN0YXRlLCBpc1ZhbGlkKTsKLQotICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSB0ZXh0RmllbGQuZ2V0VGV4dCgpOwotICAgICAgICBpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLSAgICAgICAgICAgIGZpcmVWYWx1ZUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICBvbGRWYWx1ZSA9IG5ld1ZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIEZpZWxkRWRpdG9yLnNldEVuYWJsZWQoYm9vbGVhbixDb21wb3NpdGUpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCwgcGFyZW50KTsKLSAgICAgICAgZ2V0VGV4dENvbnRyb2wocGFyZW50KS5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvaW1hZ2VzL3ByZWZfZGlhbG9nX3RpdGxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvaW1hZ2VzL3ByZWZfZGlhbG9nX3RpdGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyNDQyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL2ltYWdlcy9wcmVmX2RpYWxvZ190aXRsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9wcmVmZXJlbmNlL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTg5ODNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ByZWZlcmVuY2UvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBwcmVmZXJlbmNlcy4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci1BIDxiPnByZWZlcmVuY2UgbWFuYWdlcjwvYj4gKGNsYXNzIDx0dD5QcmVmZXJlbmNlTWFuYWdlcjwvdHQ+KSBtYWludGFpbnMKLWEgdHJlZSBvZiA8Yj5wcmVmZXJlbmNlIG5vZGVzPC9iPi4gUHJlZmVyZW5jZXMgYXJlIHByZXNlbnRlZCB0byB0aGUgZW5kCi11c2VyIGluIGEgPGI+cHJlZmVyZW5jZSBkaWFsb2c8L2I+IGNvbnNpc3Rpbmcgb2YgPGI+cHJlZmVyZW5jZSBwYWdlczwvYj4uCi1BIHByZWZlcmVuY2UgcGFnZSBjb25zaXN0cyBvZiBtdWx0aXBsZSBwcmVmZXJlbmNlIGZpZWxkcywgd2hpY2ggY2FuIGJlCi1kaXNwbGF5ZWQgYW5kIG1vZGlmaWVkIHRob3VnaCA8Yj5maWVsZCBlZGl0b3JzPC9iPi4gVGhlIGZyYW1ld29yayBjb250YWlucwotYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcHJlZmVyZW5jZSBkaWFsb2dzICg8dHQ+UHJlZmVyZW5jZURpYWxvZzwvdHQ+KSwKLWFuZCBhbiBhYnN0cmFjdCBwcmVmZXJlbmNlIHBhZ2UgY2xhc3MgKDx0dD5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlPC90dD4pCi1mb3IgaG9zdGluZyB0aGVzZSBmaWVsZCBlZGl0b3JzLgotPHA+VGhlIGluZGl2aWR1YWwgcHJlZmVyZW5jZSB2YWx1ZXMgYXJlIG1haW50YWluZWQgaW4gYSA8Yj5wcmVmZXJlbmNlIHN0b3JlPC9iPgotKDx0dD5JUHJlZmVyZW5jZVN0b3JlPC90dD4pLiBFYWNoIHByZWZlcmVuY2UgaGFzIGEgY3VycmVudCB2YWx1ZSBhbmQgYQotZGVmYXVsdCB2YWx1ZSB1c2UgdG8gKHJlLSlpbml0aWFsaXplIGl0LiBUaGUgZnJhbWV3b3JrIHByb3ZpZGVzIGEgY29uY3JldGUKLXByZWZlcmVuY2Ugc3RvcmUgaW1wbGVtZW50YXRpb24gKDx0dD5QcmVmZXJlbmNlU3RvcmU8L3R0PikgYmFzZWQgb24gYW4KLWludGVybmFsIDx0dD5qYXZhLnV0aWwuUHJvcGVydGllczwvdHQ+IG9iamVjdCwgd2l0aCBzdXBwb3J0IGZvciBwZXJzaXN0aW5nCi10aGUgbm9uLWRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMgdG8gZmlsZXMgb3Igc3RyZWFtcy4KLTxwPkEgZmllbGQgZWRpdG9yIHByZXNlbnRzIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBwcmVmZXJlbmNlIHRvIHRoZSBlbmQKLXVzZXIuIFRoZSB2YWx1ZSBpcyBsb2FkZWQgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZTsgaWYgbW9kaWZpZWQgYnkgdGhlCi1lbmQgdXNlciwgdGhlIHZhbHVlIGlzIHZhbGlkYXRlZCBhbmQgZXZlbnR1YWxseSBzdG9yZWQgYmFjayB0byB0aGUgcHJlZmVyZW5jZQotc3RvcmUuCi08cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgcmVhZHktdG8tdXNlIGZpZWxkIGVkaXRvcnMgZm9yIHZhcmlvdXMgdHlwZXMgb2YKLXByZWZlcmVuY2VzOgotPHVsPgotPGxpPgotPHR0PkJvb2xlYW5GaWVsZEVkaXRvcjwvdHQ+IC0gYm9vbGVhbnM8L2xpPgotCi08bGk+Ci08dHQ+SW50ZWdlckZpZWxkRWRpdG9yPC90dD4gLSBpbnRlZ2VyczwvbGk+Ci0KLTxsaT4KLTx0dD5TdHJpbmdGaWVsZEVkaXRvcjwvdHQ+IC0gdGV4dCBzdHJpbmdzPC9saT4KLQotPGxpPgotPHR0PlJhZGlvR3JvdXBGaWVsZEVkaXRvcjwvdHQ+IC0gZW51bWVyYXRpb25zPC9saT4KLQotPGxpPgotPHR0PkNvbG9yRmllbGRFZGl0b3I8L3R0PiAtIFJHQiBjb2xvcnM8L2xpPgotCi08bGk+Ci08dHQ+Rm9udEZpZWxkRWRpdG9yPC90dD4gLSBmb250czwvbGk+Ci0KLTxsaT4KLTx0dD5EaXJlY3RvcnlGaWVsZEVkaXRvcjwvdHQ+IC0gZGlyZWN0b3JpZXM8L2xpPgotCi08bGk+Ci08dHQ+RmlsZUZpZWxkRWRpdG9yPC90dD4gLSBmaWxlczwvbGk+Ci0KLTxsaT4KLTx0dD5QYXRoRWRpdG9yPC90dD4gLSBwYXRoczwvbGk+Ci08L3VsPgotQWxsIGZpZWxkIGVkaXRvcnMgYXJlIHN1YmNsYXNzZXMgb2YgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgPHR0PkZpZWxkRWRpdG9yPC90dD47Ci10aGUgZnJhbWV3b3JrIGFsbG93cyBuZXcga2luZHMgb2YgZmllbGQgZWRpdG9ycyB0byBiZSBkZWZpbmVkIGJ5IHN1YmNsYXNzaW5nCi10aGlzIGNsYXNzIG9yIG9uZSBvZiBpdHMgc3ViY2xhc3Nlcy4KLTxwPk5vdGU6IE5vbmUgb2YgdGhlIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIG1haW50YWluIGdsb2JhbCBzdGF0ZS4KLTxicj4mbmJzcDsKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0Fic3RyYWN0UmVzb3VyY2VNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9BYnN0cmFjdFJlc291cmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDk1YWUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0Fic3RyYWN0UmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgUmVzb3VyY2VNYW5hZ2VyLiBNYWludGFpbnMgcmVmZXJlbmNlIGNvdW50cyBmb3IgYWxsIHByZXZpb3VzbHkKLSAqIGFsbG9jYXRlZCBTV1QgcmVzb3VyY2VzLiBEZWxlZ2F0ZXMgdG8gdGhlIGFic3RyYWN0IG1ldGhvZCBhbGxvY2F0ZSguLi4pIHRoZSBmaXJzdCB0aW1lIGEgcmVzb3VyY2UKLSAqIGlzIHJlZmVyZW5jZWQgYW5kIGRlbGVnYXRlcyB0byB0aGUgYWJzdHJhY3QgbWV0aG9kIGRlYWxsb2NhdGUoLi4uKSB0aGUgbGFzdCB0aW1lIGEgcmVmZXJlbmNlIGlzCi0gKiByZW1vdmVkLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyIGV4dGVuZHMgUmVzb3VyY2VNYW5hZ2VyIHsKLQotICAgIC8qKgotICAgICAqIE1hcCBvZiBSZXNvdXJjZURlc2NyaXB0b3Igb250byBSZWZDb3VudC4gKG51bGwgd2hlbiBlbXB0eSkKLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXAgbWFwID0gbnVsbDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBIb2xkcyBhIHJlZmVyZW5jZSBjb3VudCBmb3IgYSBwcmV2aW91c2x5LWFsbG9jYXRlZCByZXNvdXJjZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlZkNvdW50IHsKLSAgICAgICAgT2JqZWN0IHJlc291cmNlOwotICAgICAgICBpbnQgY291bnQgPSAxOwotICAgICAgICAKLSAgICAgICAgUmVmQ291bnQoT2JqZWN0IHJlc291cmNlKSB7Ci0gICAgICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRoZSBmaXJzdCB0aW1lIGEgcmVzb3VyY2UgaXMgcmVxdWVzdGVkLiBTaG91bGQgYWxsb2NhdGUgYW5kIHJldHVybiBhIHJlc291cmNlCi0gICAgICogb2YgdGhlIGNvcnJlY3QgdHlwZS4gCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMSAKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIGlkZW50aWZpZXIgZm9yIHRoZSByZXNvdXJjZSB0byBhbGxvY2F0ZQotICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCByZXNvdXJjZQotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgYWxsb2NhdGUoRGV2aWNlUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0aGUgbGFzdCB0aW1lIGEgcmVzb3VyY2UgaXMgZGVyZWZlcmVuY2VkLiBTaG91bGQgcmVsZWFzZSBhbnkgcmVzb3VyY2VzIHJlc2VydmVkIGJ5Ci0gICAgICogYWxsb2NhdGUoLi4uKS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xIAotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlIHJlc291cmNlIGJlaW5nIGRlYWxsb2NhdGVkCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgaWRlbnRpZmllciBmb3IgdGhlIHJlc291cmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGVhbGxvY2F0ZShPYmplY3QgcmVzb3VyY2UsIERldmljZVJlc291cmNlRGVzY3JpcHRvciBkZXNjcmlwdG9yKTsgCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgUmVzb3VyY2VNYW5hZ2VyI2NyZWF0ZShEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IpCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBjcmVhdGUoRGV2aWNlUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gTGF6aWx5IGFsbG9jYXRlIHRoZSBtYXAKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcmVmZXJlbmNlIGNvdW50Ci0gICAgICAgIFJlZkNvdW50IGNvdW50ID0gKFJlZkNvdW50KW1hcC5nZXQoZGVzY3JpcHRvcik7Ci0gICAgICAgIGlmIChjb3VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGlzIHJlc291cmNlIGFscmVhZHkgZXhpc3RzLCBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBhbmQgcmV0dXJuCi0gICAgICAgICAgICAvLyB0aGUgZXhpc3RpbmcgcmVzb3VyY2UuCi0gICAgICAgICAgICBjb3VudC5jb3VudCsrOwotICAgICAgICAgICAgcmV0dXJuIGNvdW50LnJlc291cmNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBBbGxvY2F0ZSBhbmQgcmV0dXJuIGEgbmV3IHJlc291cmNlICh3aXRoIHJlZiBjb3VudCA9IDEpCi0gICAgICAgIE9iamVjdCByZXNvdXJjZSA9IGFsbG9jYXRlKGRlc2NyaXB0b3IpOwotICAgICAgICAKLSAgICAgICAgY291bnQgPSBuZXcgUmVmQ291bnQocmVzb3VyY2UpOwotICAgICAgICBtYXAucHV0KGRlc2NyaXB0b3IsIGNvdW50KTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBSZXNvdXJjZU1hbmFnZXIjZGVzdHJveShEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IpCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVzdHJveShEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAvLyBJZiB0aGUgbWFwIGlzIGVtcHR5IChudWxsKSB0aGVuIHRoZXJlIGFyZSBubyByZXNvdXJjZXMgdG8gZGlzcG9zZQotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRmluZCB0aGUgZXhpc3RpbmcgcmVzb3VyY2UKLSAgICAgICAgUmVmQ291bnQgY291bnQgPSAoUmVmQ291bnQpbWFwLmdldChkZXNjcmlwdG9yKTsKLSAgICAgICAgaWYgKGNvdW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSByZXNvdXJjZSBleGlzdHMsIGRlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50LgotICAgICAgICAgICAgY291bnQuY291bnQtLTsKLSAgICAgICAgICAgIGlmIChjb3VudC5jb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgdGhlIGxhc3QgcmVmZXJlbmNlLCBkZWFsbG9jYXRlIGl0LgotICAgICAgICAgICAgICAgIGRlYWxsb2NhdGUoY291bnQucmVzb3VyY2UsIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIG1hcC5yZW1vdmUoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE51bGwgb3V0IHRoZSBtYXAgd2hlbiBlbXB0eSB0byBzYXZlIGEgc21hbGwgYW1vdW50IG9mIG1lbW9yeQotICAgICAgICBpZiAobWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbWFwID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlYWxsb2NhdGVzIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgcmVnaXN0cnkgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgotICAgICAqIGRlYWxsb2NhdGVkLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIENvbGxlY3Rpb24gZW50cmllcyA9IG1hcC5lbnRyeVNldCgpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGVudHJpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgbmV4dCA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBPYmplY3Qga2V5ID0gbmV4dC5nZXRLZXkoKTsKLSAgICAgICAgICAgIFJlZkNvdW50IHZhbCA9IChSZWZDb3VudCluZXh0LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRlYWxsb2NhdGUodmFsLnJlc291cmNlLCAoRGV2aWNlUmVzb3VyY2VEZXNjcmlwdG9yKWtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1hcCA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlTWFuYWdlciNmaW5kKG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkRldmljZVJlc291cmNlRGVzY3JpcHRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGZpbmQoRGV2aWNlUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwLmdldChkZXNjcmlwdG9yKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9BcnJheUZvbnREZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9BcnJheUZvbnREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OWE2YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvQXJyYXlGb250RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotCi0vKioKLSAqIERlc2NyaWJlcyBhIEZvbnQgdXNpbmcgYW4gYXJyYXkgb2YgRm9udERhdGEKLSAqIAotICogQHNpbmNlIDMuMQotICovCi1maW5hbCBjbGFzcyBBcnJheUZvbnREZXNjcmlwdG9yIGV4dGVuZHMgRm9udERlc2NyaXB0b3IgewotCi0gICAgcHJpdmF0ZSBGb250RGF0YVtdIGRhdGE7Ci0gICAgcHJpdmF0ZSBGb250IG9yaWdpbmFsRm9udCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBEZXZpY2Ugb3JpZ2luYWxEZXZpY2UgPSBudWxsOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBmb250IGRlc2NyaXB0b3IgZm9yIGEgZm9udCB3aXRoIHRoZSBnaXZlbiBuYW1lLCBoZWlnaHQsCi0gICAgICogYW5kIHN0eWxlLiBUaGVzZSBhcmd1bWVudHMgYXJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgY29uc3RydWN0b3IKLSAgICAgKiBvZiBGb250LgotICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhIEZvbnREYXRhIGRlc2NyaWJpbmcgdGhlIGZvbnQgdG8gY3JlYXRlCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCNGb250KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2UsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YSkKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIEFycmF5Rm9udERlc2NyaXB0b3IoRm9udERhdGFbXSBkYXRhKSB7Ci0gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7Ci0gICAgfQotIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBmb250IGRlc2NyaXB0b3IgdGhhdCBkZXNjcmliZXMgdGhlIGdpdmVuIGZvbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9yaWdpbmFsRm9udCBmb250IHRvIGJlIGRlc2NyaWJlZAotICAgICAqIAotICAgICAqIEBzZWUgRm9udERlc2NyaXB0b3IjY3JlYXRlRnJvbShvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCkKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIEFycmF5Rm9udERlc2NyaXB0b3IoRm9udCBvcmlnaW5hbEZvbnQpIHsKLSAgICAgICAgdGhpcyhvcmlnaW5hbEZvbnQuZ2V0Rm9udERhdGEoKSk7Ci0gICAgICAgIHRoaXMub3JpZ2luYWxGb250ID0gb3JpZ2luYWxGb250OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZm9udCBkZXNjcmlwdG9yIHRoYXQgZGVzY3JpYmVzIHRoZSBnaXZlbiBmb250IG9uIHRoZQotICAgICAqIHNwZWNpZmllZCBkZXZpY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9yaWdpbmFsRm9udCBmb250IHRvIGJlIGRlc2NyaWJlZAotICAgICAqIEBwYXJhbSBvcmlnaW5hbERldmljZSBtdXN0IGJlIHRoZSBzYW1lIERldmljZSB0aGF0IHdhcyBwYXNzZWQgaW50bwotICAgICAqIHRoZSBmb250J3MgY29uc3RydWN0b3Igd2hlbiBpdCB3YXMgZmlyc3QgY3JlYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIEZvbnREZXNjcmlwdG9yI2NyZWF0ZUZyb20ob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2UpCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgICBwdWJsaWMgQXJyYXlGb250RGVzY3JpcHRvcihGb250IG9yaWdpbmFsRm9udCwgRGV2aWNlIG9yaWdpbmFsRGV2aWNlKSB7Ci0gICAgICAgIHRoaXMob3JpZ2luYWxGb250KTsKLSAgICAgICAgdGhpcy5vcmlnaW5hbERldmljZSA9IG9yaWdpbmFsRGV2aWNlOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Gb250RGVzY3JpcHRvciNjcmVhdGVGb250KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2UpCi0gICAgICovCi0gICAgcHVibGljIEZvbnQgY3JlYXRlRm9udChEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGlzIGRlc2NyaXB0b3IgaXMgYW4gZXhpc3RpbmcgZm9udCwgdGhlbiB3ZSBjYW4gcmV0dXJuIHRoZSBvcmlnaW5hbCBmb250Ci0gICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIHNhbWUgZGV2aWNlLgotICAgICAgICBpZiAob3JpZ2luYWxGb250ICE9IG51bGwpIHsKLQotICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3Qga25vdyB3aGF0IGRldmljZSB0aGUgb3JpZ2luYWwgd2FzIGFsbG9jYXRlZCBvbiwgd2UgY2FuJ3QgdGVsbCBpZiB3ZQotICAgICAgICAgICAgLy8gY2FuIHJldXNlIHRoZSBvcmlnaW5hbCB1bnRpbCB3ZSB0cnkgdG8gY3JlYXRlIGEgbmV3IG9uZS4KLSAgICAgICAgICAgIGlmIChvcmlnaW5hbERldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGZvbnQKLSAgICAgICAgICAgICAgICBGb250IHJlc3VsdCA9IG5ldyBGb250KGRldmljZSwgZGF0YSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBuZXcgZm9udCB3YXMgZXF1YWwgdG8gdGhlIG9yaWdpbmFsLCB0aGVuIGl0IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZAotICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBzYW1lIGRldmljZS4gCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lcXVhbHMob3JpZ2luYWxGb250KSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBub3cga25vdyB0aGUgb3JpZ2luYWwgZGV2aWNlLiBXZSBjYW4gcmV1c2UgdGhlIG9yaWdpbmFsIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgdGhlIHRlbXBvcmFyeSBGb250LCBhbmQgcmVtZW1iZXIgdGhlIGRldmljZSBmb3IgdGhlIG5leHQgdGltZQotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGRlc2NyaXB0b3IgaXMgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxEZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZvbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRoZSBuZXdseSBjcmVhdGVkIGZvbnQgZW5kZWQgdXAgYmVpbmcgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsLCBzbwotICAgICAgICAgICAgICAgIC8vIGl0IG1heSBoYXZlIGJlZW4gYWxsb2NhdGVkIG9uIGEgZGlmZmVyZW50IGRldmljZS4gUmV0dXJuIHRoZSBuZXcgdmVyc2lvbi4KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgCi0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBhbGxvY2F0aW5nIG9uIHRoZSBzYW1lIGRldmljZSBhcyB0aGUgb3JpZ2luYWwgZm9udCwgcmV0dXJuIHRoZSBvcmlnaW5hbC4KLSAgICAgICAgICAgIGlmIChvcmlnaW5hbERldmljZSA9PSBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGb250OwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IEZvbnQoZGV2aWNlLCBkYXRhKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICgob2JqLmdldENsYXNzKCkgPT0gQXJyYXlGb250RGVzY3JpcHRvci5jbGFzcykpIHsKLSAgICAgICAgICAgIEFycmF5Rm9udERlc2NyaXB0b3IgZGVzY3IgPSAoQXJyYXlGb250RGVzY3JpcHRvcilvYmo7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChkZXNjci5vcmlnaW5hbEZvbnQgIT0gb3JpZ2luYWxGb250KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAob3JpZ2luYWxGb250ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoICE9IGRlc2NyLmRhdGEubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBGb250RGF0YSBmZCA9IGRhdGFbaV07Ci0gICAgICAgICAgICAgICAgRm9udERhdGEgZmQyID0gZGVzY3IuZGF0YVtpXTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIWZkLmVxdWFscyhmZDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGlmIChvcmlnaW5hbEZvbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRm9udC5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgY29kZSA9IDA7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZvbnREYXRhIGZkID0gZGF0YVtpXTsKLSAgICAgICAgICAgIGNvZGUgKz0gZmQuaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29kZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Gb250RGVzY3JpcHRvciNkZXN0cm95Rm9udChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95Rm9udChGb250IHByZXZpb3VzbHlDcmVhdGVkRm9udCkgewotICAgICAgICBpZiAocHJldmlvdXNseUNyZWF0ZWRGb250ID09IG9yaWdpbmFsRm9udCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHByZXZpb3VzbHlDcmVhdGVkRm9udC5kaXNwb3NlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9Db2xvckRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0NvbG9yRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGY3YjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0NvbG9yRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLS8qKgotICogTGlnaHR3ZWlnaHQgZGVzY3JpcHRvciBmb3IgYW4gU1dUIGNvbG9yLiBFYWNoIENvbG9yRGVzY3JpcHRvciB3aWxsIGNyZWF0ZSBhIHBhcnRpY3VsYXIgU1dUIAotICogQ29sb3Igb24gZGVtYW5kLiBUaGlzIG9iamVjdCB3aWxsIGJlIGNvbXBhcmVkIHNvIGhhc2hDb2RlKC4uLikgYW5kIGVxdWFscyguLi4pIG11c3QgCi0gKiByZXR1cm4gbWVhbmluZ2Z1bCB2YWx1ZXMuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbG9yRGVzY3JpcHRvciBleHRlbmRzIERldmljZVJlc291cmNlRGVzY3JpcHRvciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIENvbG9yRGVzY3JpcHRvciBmcm9tIGFuIGV4aXN0aW5nIENvbG9yLCBnaXZlbiB0aGUgRGV2aWNlIGFzc29jaWF0ZWQKLSAgICAgKiB3aXRoIHRoZSBvcmlnaW5hbCBDb2xvci4gVGhpcyBpcyB0aGUgdXN1YWwgd2F5IHRvIGNvbnZlcnQgYSBDb2xvciBpbnRvCi0gICAgICogYSBDb2xvckRlc2NyaXB0b3IuIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgQ29sb3JEZXNjcmlwdG9yIGRlcGVuZHMgb24gdGhlCi0gICAgICogb3JpZ2luYWwgQ29sb3IsIGFuZCBkaXNwb3NpbmcgdGhlIENvbG9yIHdpbGwgaW52YWxpZGF0ZSB0aGUgQ29sb3JEZXNjcmlwdG9yLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKgotICAgICAqIEBwYXJhbSB0b0NyZWF0ZSBDb2xvciB0byBjb252ZXJ0IGludG8gYSBDb2xvckRlc2NyaXB0b3IuCi0gICAgICogQHBhcmFtIG9yaWdpbmFsRGV2aWNlIHRoaXMgbXVzdCBiZSB0aGUgc2FtZSBEZXZpY2UgdGhhdCB3YXMgcGFzc2VkIGludG8gdGhlCi0gICAgICogb3JpZ2luYWwgQ29sb3IncyBjb25zdHJ1Y3Rvci4KLSAgICAgKiBAcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBDb2xvckRlc2NyaXB0b3IgdGhhdCBkZXNjcmliZXMgdGhlIGdpdmVuIENvbG9yLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sb3JEZXNjcmlwdG9yIGNyZWF0ZUZyb20oQ29sb3IgdG9DcmVhdGUsIERldmljZSBvcmlnaW5hbERldmljZSkgewotICAgICAgICByZXR1cm4gbmV3IFJHQkNvbG9yRGVzY3JpcHRvcih0b0NyZWF0ZSwgb3JpZ2luYWxEZXZpY2UpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgQ29sb3JEZXNjcmlwdG9yIGZyb20gYW4gZXhpc3RpbmcgY29sb3IuIAotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgbGVzcyBlZmZpY2llbnQgdGhhbiA8Y29kZT5jcmVhdGVGcm9tKENvbG9yLCBEZXZpY2UpPC9jb2RlPiwgc28gdGhpcwotICAgICAqIHZlcnNpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZSBkZXZpY2UgYXNzb2NpYXRlZAotICAgICAqIHdpdGggdGhlIGNvbG9yIGlzIHVua25vd24uCi0gICAgICogPC9wPgotICAgICAqIFRoZSByZXR1cm5lZCBDb2xvckRlc2NyaXB0b3IgZGVwZW5kcyBvbiB0aGUgb3JpZ2luYWwgQ29sb3IuIERpc3Bvc2luZwotICAgICAqIHRoZSBvcmlnaW5hbCBjb2xvdXIgd2hpbGUgdGhlIGNvbG9yIGRlc2NyaXB0b3IgaXMgc3RpbGwgaW4gdXNlIG1heSBjYXVzZSAKLSAgICAgKiBTV1QgdG8gdGhyb3cgYSBncmFwaGljIGRpc3Bvc2VkIGV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdG9DcmVhdGUgQ29sb3IgdG8gZ2VuZXJhdGUgYSBDb2xvckRlc2NyaXB0b3IgZnJvbQotICAgICAqIEByZXR1cm4gYSBuZXdseSBjcmVhdGVkIENvbG9yRGVzY3JpcHRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sb3JEZXNjcmlwdG9yIGNyZWF0ZUZyb20oQ29sb3IgdG9DcmVhdGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSR0JDb2xvckRlc2NyaXB0b3IodG9DcmVhdGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29sb3IgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIFJHQiB2YWx1ZXMKLSAgICAgKiBAc2luY2UgMy4xIAotICAgICAqCi0gICAgICogQHBhcmFtIHRvQ3JlYXRlIFJHQiB2YWx1ZXMgdG8gY3JlYXRlCi0gICAgICogQHJldHVybiBhIG5ldyBDb2xvckRlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbG9yRGVzY3JpcHRvciBjcmVhdGVGcm9tKFJHQiB0b0NyZWF0ZSkgewotICAgICAgICByZXR1cm4gbmV3IFJHQkNvbG9yRGVzY3JpcHRvcih0b0NyZWF0ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIENvbG9yIGRlc2NyaWJlZCBieSB0aGlzIGRlc2NyaXB0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRldmljZSBTV1QgZGV2aWNlIG9uIHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBDb2xvcgotICAgICAqIEByZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgU1dUIENvbG9yIG9iamVjdCAobmV2ZXIgbnVsbCkKLSAgICAgKiBAdGhyb3dzIERldmljZVJlc291cmNlRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBhbGxvY2F0ZSB0aGUgQ29sb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ29sb3IgY3JlYXRlQ29sb3IoRGV2aWNlIGRldmljZSkgdGhyb3dzIERldmljZVJlc291cmNlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFVuZG9lcyB3aGF0ZXZlciB3YXMgZG9uZSBieSBjcmVhdGVDb2xvci4gCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMSAKLSAgICAgKgotICAgICAqIEBwYXJhbSB0b0Rlc3Ryb3kgYSBDb2xvciB0aGF0IHdhcyBwcmV2aW91c2x5IGFsbG9jYXRlZCBieSBhbiBlcXVhbCBDb2xvckRlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZXN0cm95Q29sb3IoQ29sb3IgdG9EZXN0cm95KTsKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Td3RSZXNvdXJjZURlc2NyaXB0b3IjY3JlYXRlKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2UpCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBjcmVhdGVSZXNvdXJjZShEZXZpY2UgZGV2aWNlKSB0aHJvd3MgRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlQ29sb3IoZGV2aWNlKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuU3d0UmVzb3VyY2VEZXNjcmlwdG9yI2Rlc3Ryb3koamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBkZXN0cm95UmVzb3VyY2UoT2JqZWN0IHByZXZpb3VzbHlDcmVhdGVkT2JqZWN0KSB7Ci0gICAgICAgIGRlc3Ryb3lDb2xvcigoQ29sb3IpcHJldmlvdXNseUNyZWF0ZWRPYmplY3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0NvbG9yUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0NvbG9yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzYTY2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9Db2xvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQSBjb2xvciByZWdpc3RyeSBtYWludGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gc3ltYm9saWMgY29sb3IgbmFtZXMgYW5kIFNXVCAKLSAqIDxjb2RlPkNvbG9yPC9jb2RlPnMuCi0gKiA8cD4KLSAqIEEgY29sb3IgcmVnaXN0cnkgb3ducyBhbGwgb2YgdGhlIDxjb2RlPkNvbG9yPC9jb2RlPiBvYmplY3RzIHJlZ2lzdGVyZWQgd2l0aCAKLSAqIGl0LCBhbmQgYXV0b21hdGljYWxseSBkaXNwb3NlcyBvZiB0aGVtIHdoZW4gdGhlIFNXVCBEaXNwbGF5IHRoYXQgY3JlYXRlcyB0aGUgCi0gKiA8Y29kZT5Db2xvcjwvY29kZT5zIGlzIGRpc3Bvc2VkLiBCZWNhdXNlIG9mIHRoaXMsIGNsaWVudHMgZG8gbm90IG5lZWQgdG8gCi0gKiAoaW5kZWVkLCBtdXN0IG5vdCBhdHRlbXB0IHRvKSBkaXNwb3NlIG9mIDxjb2RlPkNvbG9yPC9jb2RlPiBvYmplY3RzIAotICogdGhlbXNlbHZlcy4KLSAqIDwvcD4KLSAqIDxwPgotICogTWV0aG9kcyBhcmUgcHJvdmlkZWQgZm9yIHJlZ2lzdGVyaW5nIGxpc3RlbmVycyB0aGF0IHdpbGwgYmUga2VwdAotICogYXBwcmlzZWQgb2YgY2hhbmdlcyB0byBsaXN0IG9mIHJlZ2lzdGVkIGNvbG9ycy4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyAoaXQgd2FzIG5vdCBkZXNpZ25lZCB0byBiZSBzdWJjbGFzc2VkKS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQ29sb3JSZWdpc3RyeSBleHRlbmRzIFJlc291cmNlUmVnaXN0cnkgewotCi0gICAgLyoqCi0gICAgICogVGhpcyByZWdpc3RyaWVzIDxjb2RlPkRpc3BsYXk8L2NvZGU+LiBBbGwgY29sb3JzIHdpbGwgYmUgYWxsb2NhdGVkIHVzaW5nIAotICAgICAqIGl0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBEaXNwbGF5IGRpc3BsYXk7Ci0KLSAgICAvKioKLSAgICAgKiBDb2xsZWN0aW9uIG9mIDxjb2RlPkNvbG9yPC9jb2RlPiB0aGF0IGFyZSBub3cgc3RhbGUgdG8gYmUgZGlzcG9zZWQgd2hlbiAKLSAgICAgKiBpdCBpcyBzYWZlIHRvIGRvIHNvIChpLmUuIG9uIHNodXRkb3duKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Qgc3RhbGVDb2xvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUYWJsZSBvZiBrbm93biBjb2xvcnMsIGtleWVkIGJ5IHN5bWJvbGljIGNvbG9yIG5hbWUgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+LAotICAgICAqIHZhbHVlIHR5cGU6IDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgc3RyaW5nVG9Db2xvciA9IG5ldyBIYXNoTWFwKDcpOwotCi0gICAgLyoqCi0gICAgICogVGFibGUgb2Yga25vd24gY29sb3IgZGF0YSwga2V5ZWQgYnkgc3ltYm9saWMgY29sb3IgbmFtZSAoa2V5IHR5cGU6Ci0gICAgICogPGNvZGU+U3RyaW5nPC9jb2RlPiwgdmFsdWUgdHlwZTogPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjwvY29kZT4pLgotICAgICAqLwotICAgIHByaXZhdGUgTWFwIHN0cmluZ1RvUkdCID0gbmV3IEhhc2hNYXAoNyk7Ci0KLSAgICAvKioKLSAgICAgKiBSdW5uYWJsZSB0aGF0IGNsZWFucyB1cCB0aGUgbWFuYWdlciBvbiBkaXNwb3NhbCBvZiB0aGUgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUnVubmFibGUgZGlzcGxheVJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBjbGVhckNhY2hlcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgdGhhdCBpcyBob29rZWQgdG8gdGhlIGN1cnJlbnQgCi0gICAgICogZGlzcGxheS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkjZ2V0Q3VycmVudCgpCi0gICAgICovCi0gICAgcHVibGljIENvbG9yUmVnaXN0cnkoKSB7Ci0gICAgICAgIHRoaXMoRGlzcGxheS5nZXRDdXJyZW50KCksIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRpc3BsYXkgdGhlIDxjb2RlPkRpc3BsYXk8L2NvZGU+IHRvIGhvb2sgaW50by4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sb3JSZWdpc3RyeShEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAJdGhpcyAoZGlzcGxheSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGlzcGxheSB0aGUgPGNvZGU+RGlzcGxheTwvY29kZT4gdG8gaG9vayBpbnRvCi0gICAgICogQHBhcmFtIGNsZWFuT25EaXNwbGF5RGlzcG9zYWwKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgYWxsIGZvbnRzIGFsbG9jYXRlZCBieSB0aGlzIDxjb2RlPkNvbG9yUmVnaXN0cnk8L2NvZGU+Ci0JICogICAgICAgICAgICBzaG91bGQgYmUgZGlzcG9zZWQgd2hlbiB0aGUgZGlzcGxheSBpcyBkaXNwb3NlZAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sb3JSZWdpc3RyeShEaXNwbGF5IGRpc3BsYXksIGJvb2xlYW4gY2xlYW5PbkRpc3BsYXlEaXNwb3NhbCkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGRpc3BsYXkpOwotICAgICAgICB0aGlzLmRpc3BsYXkgPSBkaXNwbGF5OwotICAgICAgICBpZiAoY2xlYW5PbkRpc3BsYXlEaXNwb3NhbCkKLSAgICAgICAgCWhvb2tEaXNwbGF5RGlzcG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyA8Y29kZT5Db2xvcjwvY29kZT4gb24gdGhlIHJlY2VpdmVycyA8Y29kZT5EaXNwbGF5PC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmdiIHRoZSA8Y29kZT5SR0I8L2NvZGU+IGRhdGEgZm9yIHRoZSBjb2xvci4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgPGNvZGU+Q29sb3I8L2NvZGU+IG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb2xvciBjcmVhdGVDb2xvcihSR0IgcmdiKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sb3IoZGlzcGxheSwgcmdiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlIG9mIGFsbCBvZiB0aGUgPGNvZGU+Q29sb3I8L2NvZGU+cyBpbiB0aGlzIGl0ZXJhdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpdGVyYXRvciBvdmVyIDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+IG9mIDxjb2RlPkNvbG9yPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkaXNwb3NlQ29sb3JzKEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgKChDb2xvcikgbmV4dCkuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgPGNvZGU+Y29sb3I8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gc3ltYm9saWMgY29sb3IgCi0gICAgICogbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBkZWZpbml0aW9uIGV4aXN0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3ltYm9saWNOYW1lIHN5bWJvbGljIGNvbG9yIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5Db2xvcjwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sb3IgZ2V0KFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHN5bWJvbGljTmFtZSk7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSBzdHJpbmdUb0NvbG9yLmdldChzeW1ib2xpY05hbWUpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gKENvbG9yKSByZXN1bHQ7Ci0KLSAgICAgICAgQ29sb3IgY29sb3IgPSBudWxsOwotCi0gICAgICAgIHJlc3VsdCA9IHN0cmluZ1RvUkdCLmdldChzeW1ib2xpY05hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBjb2xvciA9IGNyZWF0ZUNvbG9yKChSR0IpIHJlc3VsdCk7Ci0KLSAgICAgICAgc3RyaW5nVG9Db2xvci5wdXQoc3ltYm9saWNOYW1lLCBjb2xvcik7Ci0KLSAgICAgICAgcmV0dXJuIGNvbG9yOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlUmVnaXN0cnkjZ2V0S2V5U2V0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGdldEtleVNldCgpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChzdHJpbmdUb1JHQi5rZXlTZXQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29sb3IgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHN5bWJvbGljIGNvbG9yIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3ltYm9saWNOYW1lIHN5bWJvbGljIGNvbG9yIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+UkdCPC9jb2RlPiBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBSR0IgZ2V0UkdCKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChzeW1ib2xpY05hbWUpOwotICAgICAgICByZXR1cm4gKFJHQikgc3RyaW5nVG9SR0IuZ2V0KHN5bWJvbGljTmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbG9yIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzeW1ib2xpYyBjb2xvciBuYW1lLgotICAgICAqIEBzaW5jZSAzLjEgCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3ltYm9saWNOYW1lCi0gICAgICogQHJldHVybiB0aGUgY29sb3IgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHN5bWJvbGljIGNvbG9yIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIENvbG9yRGVzY3JpcHRvciBnZXRDb2xvckRlc2NyaXB0b3IoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotICAgICAgICByZXR1cm4gQ29sb3JEZXNjcmlwdG9yLmNyZWF0ZUZyb20oZ2V0UkdCKHN5bWJvbGljTmFtZSkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlUmVnaXN0cnkjY2xlYXJDYWNoZXMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyQ2FjaGVzKCkgewotICAgICAgICBkaXNwb3NlQ29sb3JzKHN0cmluZ1RvQ29sb3IudmFsdWVzKCkuaXRlcmF0b3IoKSk7Ci0gICAgICAgIGRpc3Bvc2VDb2xvcnMoc3RhbGVDb2xvcnMuaXRlcmF0b3IoKSk7Ci0gICAgICAgIHN0cmluZ1RvQ29sb3IuY2xlYXIoKTsKLSAgICAgICAgc3RhbGVDb2xvcnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZVJlZ2lzdHJ5I2hhc1ZhbHVlRm9yKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVmFsdWVGb3IoU3RyaW5nIGNvbG9yS2V5KSB7Ci0gICAgICAgIHJldHVybiBzdHJpbmdUb1JHQi5jb250YWluc0tleShjb2xvcktleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSG9vayBhIGRpc3Bvc2UgbGlzdGVuZXIgb24gdGhlIFNXVCBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBob29rRGlzcGxheURpc3Bvc2UoKSB7Ci0gICAgICAgIGRpc3BsYXkuZGlzcG9zZUV4ZWMoZGlzcGxheVJ1bm5hYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIChvciByZXBsYWNlcykgYSBjb2xvciB0byB0aGlzIGNvbG9yIHJlZ2lzdHJ5IHVuZGVyIHRoZSBnaXZlbiAKLSAgICAgKiBzeW1ib2xpYyBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIHdoZW5ldmVyIHRoZSBtYXBwaW5nIGZyb20gYSBzeW1ib2xpYwotICAgICAqIG5hbWUgdG8gYSBjb2xvciBjaGFuZ2VzLiBUaGUgc291cmNlIG9mIHRoZSBldmVudCBpcyB0aGlzIHJlZ2lzdHJ5OyB0aGUKLSAgICAgKiBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBzeW1ib2xpYyBjb2xvciBuYW1lLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3ltYm9saWNOYW1lIHRoZSBzeW1ib2xpYyBjb2xvciBuYW1lCi0gICAgICogQHBhcmFtIGNvbG9yRGF0YSBhbiA8Y29kZT5SR0I8L2NvZGU+IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcgc3ltYm9saWNOYW1lLCBSR0IgY29sb3JEYXRhKSB7Ci0gICAgICAgIHB1dChzeW1ib2xpY05hbWUsIGNvbG9yRGF0YSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyAob3IgcmVwbGFjZXMpIGEgY29sb3IgdG8gdGhpcyBjb2xvciByZWdpc3RyeSB1bmRlciB0aGUgZ2l2ZW4gCi0gICAgICogc3ltYm9saWMgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCB3aGVuZXZlciB0aGUgbWFwcGluZyBmcm9tIGEgc3ltYm9saWMKLSAgICAgKiBuYW1lIHRvIGEgY29sb3IgY2hhbmdlcy4gVGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQgaXMgdGhpcyByZWdpc3RyeTsgdGhlCi0gICAgICogcHJvcGVydHkgbmFtZSBpcyB0aGUgc3ltYm9saWMgY29sb3IgbmFtZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHN5bWJvbGljTmFtZSB0aGUgc3ltYm9saWMgY29sb3IgbmFtZQotICAgICAqIEBwYXJhbSBjb2xvckRhdGEgYW4gPGNvZGU+UkdCPC9jb2RlPiBvYmplY3QKLSAgICAgKiBAcGFyYW0gdXBkYXRlIC0gZmlyZSBhIGNvbG9yIG1hcHBpbmcgY2hhbmdlZCBpZiB0cnVlLiBGYWxzZSBpZiB0aGlzCi0gICAgICogICAgICAgICAgICBtZXRob2QgaXMgY2FsbGVkIGZyb20gdGhlIGdldCBtZXRob2QgYXMgbm8gc2V0dGluZyBoYXMKLSAgICAgKiAgICAgICAgICAgIGNoYW5nZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHB1dChTdHJpbmcgc3ltYm9saWNOYW1lLCBSR0IgY29sb3JEYXRhLCBib29sZWFuIHVwZGF0ZSkgewotCi0gICAgICAgIEFzc2VydC5pc05vdE51bGwoc3ltYm9saWNOYW1lKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChjb2xvckRhdGEpOwotCi0gICAgICAgIFJHQiBleGlzdGluZyA9IChSR0IpIHN0cmluZ1RvUkdCLmdldChzeW1ib2xpY05hbWUpOwotICAgICAgICBpZiAoY29sb3JEYXRhLmVxdWFscyhleGlzdGluZykpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ29sb3Igb2xkQ29sb3IgPSAoQ29sb3IpIHN0cmluZ1RvQ29sb3IucmVtb3ZlKHN5bWJvbGljTmFtZSk7Ci0gICAgICAgIHN0cmluZ1RvUkdCLnB1dChzeW1ib2xpY05hbWUsIGNvbG9yRGF0YSk7Ci0gICAgICAgIGlmICh1cGRhdGUpCi0gICAgICAgICAgICBmaXJlTWFwcGluZ0NoYW5nZWQoc3ltYm9saWNOYW1lLCBleGlzdGluZywgY29sb3JEYXRhKTsKLQotICAgICAgICBpZiAob2xkQ29sb3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHN0YWxlQ29sb3JzLmFkZChvbGRDb2xvcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9Db21wb3NpdGVJbWFnZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwODg1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9Db21wb3NpdGVJbWFnZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGltYWdlIGRlc2NyaXB0b3JzIHRoYXQgc3ludGhlc2l6ZSAKLSAqIGFuIGltYWdlIGZyb20gb3RoZXIgaW1hZ2VzIGluIG9yZGVyIHRvIHNpbXVsYXRlIHRoZSBlZmZlY3QKLSAqIG9mIGN1c3RvbSBkcmF3aW5nLiBGb3IgZXhhbXBsZSwgdGhpcyBjb3VsZCBiZSB1c2VkIHRvCi0gKiBzdXBlcmltcG9zZSBhIHJlZCBiYXIgZGV4dGVyIHN5bWJvbCBhY3Jvc3MgYW4gaW1hZ2UgdG8gaW5kaWNhdGUKLSAqIHRoYXQgc29tZXRoaW5nIHdhcyBkaXNhbGxvd2VkLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSA8Y29kZT5nZXRTaXplPC9jb2RlPiBhbmQKLSAqIDxjb2RlPmZpbGw8L2NvZGU+IG1ldGhvZHMuIExpdHRsZSBvciBubyB3b3JrIGhhcHBlbnMKLSAqIHVudGlsIHRoZSBpbWFnZSBkZXNjcmlwdG9yJ3MgaW1hZ2UgaXMgYWN0dWFsbHkgcmVxdWVzdGVkCi0gKiBieSBhIGNhbGwgdG8gPGNvZGU+Y3JlYXRlSW1hZ2U8L2NvZGU+IChvciB0bwotICogPGNvZGU+Z2V0SW1hZ2VEYXRhPC9jb2RlPiBkaXJlY3RseSkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IgZXh0ZW5kcyBJbWFnZURlc2NyaXB0b3IgewotCi0gICAgLyoqCi0gICAgICogVGhlIGltYWdlIGRhdGEgZm9yIHRoaXMgY29tcG9zaXRlIGltYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgSW1hZ2VEYXRhIGltYWdlRGF0YTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBjb21wb3NpdGUgaW1hZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBhIFJHQiBlbnRyeSBpbiB0aGUgZ2l2ZW4gbWFwIHdoaWNoIG1hdGNoZXMKLSAgICAgKiB0aGUgc3BlY2lmaWVkIFJHQiBjb2xvci4gSWYgbm8gc3VjaCBlbnRyeSBleGlzdHMsIGEgbmV3IFJHQiBpcwotICAgICAqIGFsbG9jYXRlZC4gSWYgdGhlIGdpdmVuIGFycmF5IGlzIGZ1bGwsIHRoZSB2YWx1ZSAwIGlzIHJldHVybmVkCi0gICAgICogKHdoaWNoIG1hcHMgdG8gdGhlIHRyYW5zcGFyZW5jeSB2YWx1ZSkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGFsbG9jKFJHQltdIG1hcCwgaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSkgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgUkdCIGM7Ci0KLSAgICAgICAgLy8gdGhpcyBsb29wcyBzdGFydHMgYXQgaW5kZXggMSBiZWNhdXNlIGluZGV4IDAgY29ycmVzcG9uZHMgdG8gdGhlIHRyYW5zcGFyZW5jeSB2YWx1ZQotICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbWFwLmxlbmd0aCAmJiAoYyA9IG1hcFtpXSkgIT0gbnVsbDsgaSsrKQotICAgICAgICAgICAgaWYgKGMucmVkID09IHJlZCAmJiBjLmdyZWVuID09IGdyZWVuICYmIGMuYmx1ZSA9PSBibHVlKQotICAgICAgICAgICAgICAgIHJldHVybiBpOwotCi0gICAgICAgIGlmIChpIDwgbWFwLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgIG1hcFtpXSA9IG5ldyBSR0IocmVkLCBncmVlbiwgYmx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEcmF3IHRoZSBjb21wb3NpdGUgaW1hZ2VzLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBmcmFtZXdvcmsgbWV0aG9kCi0gICAgICogdG8gcGFpbnQgaW1hZ2VzIHdpdGhpbiB0aGUgZ2l2ZW4gYm91bmRzIHVzaW5nCi0gICAgICogb25lIG9yIG1vcmUgY2FsbHMgdG8gdGhlIDxjb2RlPmRyYXdJbWFnZTwvY29kZT4KLSAgICAgKiBmcmFtZXdvcmsgbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGgKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkcmF3Q29tcG9zaXRlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBnaXZlbiBzb3VyY2UgaW1hZ2UgZGF0YSBpbnRvIHRoaXMgY29tcG9zaXRlCi0gICAgICogaW1hZ2UgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgotICAgICAqIDxwPgotICAgICAqIENhbGwgdGhpcyBpbnRlcm5hbCBmcmFtZXdvcmsgbWV0aG9kIHRvIHN1cGVyaW1wb3NlIGFub3RoZXIgCi0gICAgICogaW1hZ2UgYXRvcCB0aGlzIGNvbXBvc2l0ZSBpbWFnZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgaW1hZ2UgZGF0YQotICAgICAqIEBwYXJhbSBveCB0aGUgeCBwb3NpdGlvbgotICAgICAqIEBwYXJhbSBveSB0aGUgeSBwb3NpdGlvbgotICAgICAqLwotICAgIGZpbmFsIHByb3RlY3RlZCB2b2lkIGRyYXdJbWFnZShJbWFnZURhdGEgc3JjLCBpbnQgb3gsIGludCBveSkgewotCi0gICAgICAgIFJHQltdIG91dCA9IGltYWdlRGF0YS5nZXRSR0JzKCk7Ci0KLSAgICAgICAgUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IHNyYy5wYWxldHRlOwotICAgICAgICBpZiAocGFsZXR0ZS5pc0RpcmVjdCkgewotCi0gICAgICAgICAgICBJbWFnZURhdGEgbWFzayA9IHNyYy5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgc3JjLmhlaWdodDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBzcmMud2lkdGg7IHgrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWFzay5nZXRQaXhlbCh4LCB5KSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHggPSB4ICsgb3g7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXkgPSB5ICsgb3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeHggPj0gMCAmJiB4eCA8IGltYWdlRGF0YS53aWR0aCAmJiB5eSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHl5IDwgaW1hZ2VEYXRhLmhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbCA9IHNyYy5nZXRQaXhlbCh4LCB5KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByID0gcGl4ZWwgJiBwYWxldHRlLnJlZE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSk06IENoYW5nZWQgb3BlcmF0b3JzIGZyb20gPj4gdG8gPj4+IHRvIHNoaWZ0IHNpZ24gYml0IHJpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IChwYWxldHRlLnJlZFNoaWZ0IDwgMCkgPyByID4+PiAtcGFsZXR0ZS5yZWRTaGlmdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByIDw8IHBhbGV0dGUucmVkU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGcgPSBwaXhlbCAmIHBhbGV0dGUuZ3JlZW5NYXNrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAocGFsZXR0ZS5ncmVlblNoaWZ0IDwgMCkgPyBnID4+PiAtcGFsZXR0ZS5ncmVlblNoaWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGcgPDwgcGFsZXR0ZS5ncmVlblNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiID0gcGl4ZWwgJiBwYWxldHRlLmJsdWVNYXNrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAocGFsZXR0ZS5ibHVlU2hpZnQgPCAwKSA/IGIgPj4+IC1wYWxldHRlLmJsdWVTaGlmdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiIDw8IHBhbGV0dGUuYmx1ZVNoaWZ0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSBhbGxvYyhvdXQsIHIsIGcsIGIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VEYXRhLnNldFBpeGVsKHh4LCB5eSwgcGl4ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYXAgbWFwcyBzcmMgcGl4ZWwgdmFsdWVzIHRvIGRlc3QgcGl4ZWwgdmFsdWVzCi0gICAgICAgIGludCBtYXBbXSA9IG5ldyBpbnRbMjU2XTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBtYXBbaV0gPSAtMTsKLQotICAgICAgICAvKiBKTTogYWRkZWQgY29kZSB0byB0ZXN0IGlmIHRoZSBpbWFnZSBpcyBhbiBpY29uICovCi0gICAgICAgIGlmIChzcmMuZ2V0VHJhbnNwYXJlbmN5VHlwZSgpID09IFNXVC5UUkFOU1BBUkVOQ1lfTUFTSykgewotICAgICAgICAgICAgSW1hZ2VEYXRhIG1hc2sgPSBzcmMuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBzcmMuaGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHNyYy53aWR0aDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXNrLmdldFBpeGVsKHgsIHkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB4eCA9IHggKyBveDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB5eSA9IHkgKyBveTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4eCA+PSAwICYmIHh4IDwgaW1hZ2VEYXRhLndpZHRoICYmIHl5ID49IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeXkgPCBpbWFnZURhdGEuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsID0gc3JjLmdldFBpeGVsKHgsIHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdQaXhlbCA9IG1hcFtwaXhlbF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BpeGVsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0IgYyA9IHBhbGV0dGUuZ2V0UkdCKHBpeGVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwW3BpeGVsXSA9IG5ld1BpeGVsID0gYWxsb2Mob3V0LCBjLnJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmdyZWVuLCBjLmJsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRGF0YS5zZXRQaXhlbCh4eCwgeXksIG5ld1BpeGVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtYXNrUGl4ZWwgPSBzcmMudHJhbnNwYXJlbnRQaXhlbDsKLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBzcmMuaGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgc3JjLndpZHRoOyB4KyspIHsKLSAgICAgICAgICAgICAgICBpbnQgcGl4ZWwgPSBzcmMuZ2V0UGl4ZWwoeCwgeSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hc2tQaXhlbCA8IDAgfHwgcGl4ZWwgIT0gbWFza1BpeGVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB4eCA9IHggKyBveDsKLSAgICAgICAgICAgICAgICAgICAgaW50IHl5ID0geSArIG95OwotICAgICAgICAgICAgICAgICAgICBpZiAoeHggPj0gMCAmJiB4eCA8IGltYWdlRGF0YS53aWR0aCAmJiB5eSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeXkgPCBpbWFnZURhdGEuaGVpZ2h0KSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdQaXhlbCA9IG1hcFtwaXhlbF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3UGl4ZWwgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkdCIGMgPSBwYWxldHRlLmdldFJHQihwaXhlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwW3BpeGVsXSA9IG5ld1BpeGVsID0gYWxsb2Mob3V0LCBjLnJlZCwgYy5ncmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYmx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRGF0YS5zZXRQaXhlbCh4eCwgeXksIG5ld1BpeGVsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSW1hZ2VEZXNjaXB0b3IuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoKSB7Ci0KLSAgICAgICAgUG9pbnQgc2l6ZSA9IGdldFNpemUoKTsKLQotICAgICAgICBSR0IgYmxhY2sgPSBuZXcgUkdCKDAsIDAsIDApOwotICAgICAgICBSR0JbXSByZ2JzID0gbmV3IFJHQlsyNTZdOwotICAgICAgICByZ2JzWzBdID0gYmxhY2s7IC8vIHRyYW5zcGFyZW5jeQotICAgICAgICByZ2JzWzFdID0gYmxhY2s7IC8vIGJsYWNrCi0KLSAgICAgICAgUGFsZXR0ZURhdGEgZGF0YVBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEocmdicyk7Ci0gICAgICAgIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoc2l6ZS54LCBzaXplLnksIDgsIGRhdGFQYWxldHRlKTsKLSAgICAgICAgaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAwOwotCi0gICAgICAgIGRyYXdDb21wb3NpdGVJbWFnZShzaXplLngsIHNpemUueSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZ2JzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgaWYgKHJnYnNbaV0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZ2JzW2ldID0gYmxhY2s7Ci0KLSAgICAgICAgcmV0dXJuIGltYWdlRGF0YTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIGNvbXBvc2l0ZSBpbWFnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgZnJhbWV3b3JrIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB4IGFuZCB5IHNpemUgb2YgdGhlIGltYWdlIGV4cHJlc3NlZCBhcyBhIAotICAgICAqICAgcG9pbnQgb2JqZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFBvaW50IGdldFNpemUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0RhdGFGb3JtYXRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0RhdGFGb3JtYXRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1YmQyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9EYXRhRm9ybWF0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2U7Ci0KLS8qKgotICogQW4gZXhjZXB0aW9uIGluZGljYXRpbmcgdGhhdCBhIHN0cmluZyB2YWx1ZSBjb3VsZCBub3QgYmUKLSAqIGNvbnZlcnRlZCBpbnRvIHRoZSByZXF1ZXN0ZWQgZGF0YSB0eXBlLgotICoKLSAqIEBzZWUgU3RyaW5nQ29udmVydGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhRm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZWQgc2VyaWFsIHZlcnNpb24gVUlEIGZvciB0aGlzIGNsYXNzLgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNTQ0OTU1NDY3NDA0MDMxNTM4TDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBEYXRhRm9ybWF0RXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0YUZvcm1hdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9EZXJpdmVkSW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9EZXJpdmVkSW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMWViZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvRGVyaXZlZEltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEFuIGltYWdlIGRlc2NyaXB0b3Igd2hpY2ggY3JlYXRlcyBpbWFnZXMgYmFzZWQgb24gYW5vdGhlciBJbWFnZURlc2NyaXB0b3IsIGJ1dCB3aXRoCi0gKiBhZGRpdGlvbmFsIFNXVCBmbGFncy4gTm90ZSB0aGF0IHRoaXMgaXMgb25seSBpbnRlbmRlZCBmb3IgY29tcGF0aWJpbGl0eS4gCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotZmluYWwgY2xhc3MgRGVyaXZlZEltYWdlRGVzY3JpcHRvciBleHRlbmRzIEltYWdlRGVzY3JpcHRvciB7Ci0KLSAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBvcmlnaW5hbDsKLSAgICBwcml2YXRlIGludCBmbGFnczsKLSAgICAKLSAgICBwdWJsaWMgRGVyaXZlZEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3Igb3JpZ2luYWwsIGludCBzd3RGbGFncykgewotICAgICAgICB0aGlzLm9yaWdpbmFsID0gb3JpZ2luYWw7Ci0gICAgICAgIGZsYWdzID0gc3d0RmxhZ3M7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlUmVzb3VyY2UoRGV2aWNlIGRldmljZSkgdGhyb3dzIERldmljZVJlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbENyZWF0ZUltYWdlKGRldmljZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24odGhpcywgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEltYWdlIGNyZWF0ZUltYWdlKERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIGludGVybmFsQ3JlYXRlSW1hZ2UoZGV2aWNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmhhc2hDb2RlKCkgKyBmbGFnczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhcmcwKSB7Ci0gICAgICAgIGlmIChhcmcwIGluc3RhbmNlb2YgRGVyaXZlZEltYWdlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgRGVyaXZlZEltYWdlRGVzY3JpcHRvciBkZXNjID0gKERlcml2ZWRJbWFnZURlc2NyaXB0b3IpYXJnMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGRlc2Mub3JpZ2luYWwgPT0gb3JpZ2luYWwgJiYgZmxhZ3MgPT0gZGVzYy5mbGFnczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEltYWdlIG9uIHRoZSBnaXZlbiBkZXZpY2UuIE5vdGUgdGhhdCB3ZSBkZWZpbmVkIGEgbmV3Ci0gICAgICogbWV0aG9kIHJhdGhlciB0aGFuIG92ZXJsb2FkaW5nIGNyZWF0ZUltYWdlIHNpbmNlIHRoaXMgbmVlZHMgdG8gYmUKLSAgICAgKiBjYWxsZWQgYnkgZ2V0SW1hZ2VEYXRhKCksIGFuZCB3ZSB3YW50IHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiBub3QKLSAgICAgKiB0byBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24gaWYgdGhlIGJhc2UgY2xhc3MgZ2V0cyByZWZhY3RvcmVkLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgZGV2aWNlIHRvIGNyZWF0ZSB0aGUgaW1hZ2Ugb24KLSAgICAgKiBAcmV0dXJuIGEgbmV3bHkgYWxsb2NhdGVkIEltYWdlLiBNdXN0IGJlIGRpc3Bvc2VkIGJ5IGNhbGxpbmcgaW1hZ2UuZGlzcG9zZSgpLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgSW1hZ2UgaW50ZXJuYWxDcmVhdGVJbWFnZShEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIEltYWdlIG9yaWdpbmFsSW1hZ2UgPSBvcmlnaW5hbC5jcmVhdGVJbWFnZShkZXZpY2UpOwotICAgICAgICBJbWFnZSByZXN1bHQgPSBuZXcgSW1hZ2UoZGV2aWNlLCBvcmlnaW5hbEltYWdlLCBmbGFncyk7Ci0gICAgICAgIG9yaWdpbmFsLmRlc3Ryb3lSZXNvdXJjZShvcmlnaW5hbEltYWdlKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoKSB7Ci0gICAgICAgIEltYWdlIGltYWdlID0gaW50ZXJuYWxDcmVhdGVJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0gICAgICAgIEltYWdlRGF0YSByZXN1bHQgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgaW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvRGV2aWNlUmVzb3VyY2VEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9EZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlYThjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9EZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2U7Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgY2FuIGFsbG9jYXRlIGFuZCBkaXNwb3NlIFNXVCByZXNvdXJjZXMuIEVhY2gKLSAqIGluc3RhbmNlIGRlc2NyaWJlcyBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgKHN1Y2ggYXMgYSBDb2xvciwgRm9udCwgb3IgSW1hZ2UpCi0gKiBhbmQgY2FuIGNyZWF0ZSBhbmQgZGVzdHJveSB0aGF0IHJlc291cmNlIG9uIGRlbWFuZC4gRGV2aWNlUmVzb3VyY2VEZXNjcmlwdG9ycwotICogYXJlIG1hbmFnZWQgYnkgYSBSZXNvdXJjZVJlZ2lzdHJ5LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlTWFuYWdlcgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IgewotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHJlc291cmNlIGRlc2NyaWJlZCBieSB0aGlzIGRlc2NyaXB0b3IKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xIAotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgRGV2aWNlIG9uIHdoaWNoIHRvIGFsbG9jYXRlIHRoZSByZXNvdXJjZQotICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCByZXNvdXJjZSAobm90IG51bGwpCi0gICAgICogQHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gYWxsb2NhdGUgdGhlIHJlc291cmNlCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBjcmVhdGVSZXNvdXJjZShEZXZpY2UgZGV2aWNlKSB0aHJvd3MgRGV2aWNlUmVzb3VyY2VFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogVW5kb2VzIGV2ZXJ5dGhpbmcgdGhhdCB3YXMgZG9uZSBieSBhIHByZXZpb3VzIGNhbGwgdG8gY3JlYXRlKC4uLiksIGdpdmVuCi0gICAgICogdGhlIG9iamVjdCB0aGF0IHdhcyByZXR1cm5lZCBieSBjcmVhdGUoLi4uKS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xIAotICAgICAqCi0gICAgICogQHBhcmFtIHByZXZpb3VzbHlDcmVhdGVkT2JqZWN0IGFuIG9iamVjdCB0aGF0IHdhcyByZXR1cm5lZCBieSBhbiBlcXVhbCAKLSAgICAgKiBkZXNjcmlwdG9yIGluIGEgcHJldmlvdXMgY2FsbCB0byBjcmVhdGVSZXNvdXJjZSguLi4pLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRlc3Ryb3lSZXNvdXJjZShPYmplY3QgcHJldmlvdXNseUNyZWF0ZWRPYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0RldmljZVJlc291cmNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMDMyZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZTsKLQotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIERldmljZVJlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAKLQlwcml2YXRlIFRocm93YWJsZSBjYXVzZTsKLQotCS8qKgotCSAqIEFsbCBzZXJpYWxpemFibGUgb2JqZWN0cyBzaG91bGQgaGF2ZSBhIHN0YWJsZSBzZXJpYWxWZXJzaW9uVUlECi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTE0NTQ1OTg3NTYxOThMOwotICAgIAotCS8qKgotCSAqIENyZWF0ZXMgYSBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiBpbmRpY2F0aW5nIGFuIGVycm9yIGF0dGVtcHRpbmcgdG8KLQkgKiBjcmVhdGUgYSByZXNvdXJjZSBhbmQgYW4gZW1iZWRkZWQgbG93LWxldmVsIGV4Y2VwdGlvbiBkZXNjcmliaW5nIHRoZSBjYXVzZSAKLQkgKiAKLQkgKiBAcGFyYW0gbWlzc2luZ1Jlc291cmNlCi0gICAgICogQHBhcmFtIGNhdXNlIGNhdXNlIG9mIHRoZSBleGNlcHRpb24gKG9yIG51bGwgaWYgbm9uZSkKLQkgKi8KLSAgICBwdWJsaWMgRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24oRGV2aWNlUmVzb3VyY2VEZXNjcmlwdG9yIG1pc3NpbmdSZXNvdXJjZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKCJVbmFibGUgdG8gY3JlYXRlIHJlc291cmNlICIgKyBtaXNzaW5nUmVzb3VyY2UudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLy8gZG9uJ3QgcGFzcyB0aGUgY2F1c2UgdG8gc3VwZXIsIHRvIGFsbG93IGNvbXBpbGF0aW9uIGFnYWluc3QgSkNMIEZvdW5kYXRpb24gKGJ1ZyA4MDA1OSkKLSAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gaW5kaWNhdGluZyBhbiBlcnJvciBhdHRlbXB0aW5nIHRvCi0gICAgICogY3JlYXRlIGEgcmVzb3VyY2UgCi0gICAgICogCi0gICAgICogQHBhcmFtIG1pc3NpbmdSZXNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbihEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IgbWlzc2luZ1Jlc291cmNlKSB7Ci0gICAgICAgIHRoaXMobWlzc2luZ1Jlc291cmNlLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2F1c2Ugb2YgdGhpcyB0aHJvd2FibGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0gICAgICogY2F1c2UgaXMgbm9uZXhpc3RlbnQgb3IgdW5rbm93bi4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2F1c2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIFRocm93YWJsZSBnZXRDYXVzZSgpIHsKLSAgICAgICAgcmV0dXJuIGNhdXNlOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0RldmljZVJlc291cmNlTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvRGV2aWNlUmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMDcwMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvRGV2aWNlUmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBNYW5hZ2VzIFNXVCByZXNvdXJjZXMgZm9yIGEgcGFydGljdWxhciBkZXZpY2UuCi0gKiAgCi0gKiA8cD4KLSAqIElNUE9SVEFOVDogaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCB1c2UgYSA8Y29kZT5Mb2NhbFJlc291cmNlTWFuYWdlcjwvY29kZT4gaW5zdGVhZCBvZiBhCi0gKiA8Y29kZT5EZXZpY2VSZXNvdXJjZU1hbmFnZXI8L2NvZGU+LiBUbyBjcmVhdGUgYSByZXNvdXJjZSBtYW5hZ2VyIG9uIGEgcGFydGljdWxhciBkaXNwbGF5LCAKLSAqIHVzZSA8Y29kZT5uZXcgTG9jYWxSZXNvdXJjZU1hbmFnZXIoSkZhY2VSZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKG15RGlzcGxheSkpPC9jb2RlPi4KLSAqIDxjb2RlPkRldmljZVJlc291cmNlTWFuYWdlcjwvY29kZT4gc2hvdWxkIG9ubHkgYmUgdXNlZCBkaXJlY3RseSB3aGVuIG1hbmFnaW5nCi0gKiByZXNvdXJjZXMgZm9yIGEgZGV2aWNlIG90aGVyIHRoYW4gYSBEaXNwbGF5IChzdWNoIGFzIGEgcHJpbnRlcikuICAKLSAqIDwvcD4KLSAqIAotICogQHNlZSBMb2NhbFJlc291cmNlTWFuYWdlcgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXZpY2VSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlTWFuYWdlciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBEZXZpY2UgZGV2aWNlOwotICAgIHByaXZhdGUgSW1hZ2UgbWlzc2luZ0ltYWdlOwotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlTWFuYWdlciNnZXREZXZpY2UoKQotICAgICAqLwotICAgIHB1YmxpYyBEZXZpY2UgZ2V0RGV2aWNlKCkgewotICAgICAgICByZXR1cm4gZGV2aWNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHJlZ2lzdHJ5IGZvciB0aGUgZ2l2ZW4gZGV2aWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkZXZpY2UgZGV2aWNlIHRvIG1hbmFnZQotICAgICAqLwotICAgIHB1YmxpYyBEZXZpY2VSZXNvdXJjZU1hbmFnZXIoRGV2aWNlIGRldmljZSkgewotICAgICAgICB0aGlzLmRldmljZSA9IGRldmljZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5BYnN0cmFjdFN3dFJlZ2lzdHJ5I2FsbG9jYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlN3dFJlc291cmNlRGVzY3JpcHRvcikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGFsbG9jYXRlKERldmljZVJlc291cmNlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB0aHJvd3MgRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5jcmVhdGVSZXNvdXJjZShkZXZpY2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkFic3RyYWN0U3d0UmVnaXN0cnkjZGVhbGxvY2F0ZShqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Td3RSZXNvdXJjZURlc2NyaXB0b3IpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVhbGxvY2F0ZShPYmplY3QgcmVzb3VyY2UsIERldmljZVJlc291cmNlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGRlc2NyaXB0b3IuZGVzdHJveVJlc291cmNlKHJlc291cmNlKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyI2dldERlZmF1bHRJbWFnZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldERlZmF1bHRJbWFnZSgpIHsKLSAgICAgICAgaWYgKG1pc3NpbmdJbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtaXNzaW5nSW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1pc3NpbmdJbWFnZTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICBpZiAobWlzc2luZ0ltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1pc3NpbmdJbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBtaXNzaW5nSW1hZ2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvRmlsZUltYWdlRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvRmlsZUltYWdlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGUzZDI1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9GaWxlSW1hZ2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotCi0vKioKLSAqIEFuIGltYWdlIGRlc2NyaXB0b3IgdGhhdCBsb2FkcyBpdHMgaW1hZ2UgaW5mb3JtYXRpb24KLSAqIGZyb20gYSBmaWxlLgotICovCi1jbGFzcyBGaWxlSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBjbGFzcyB3aG9zZSByZXNvdXJjZSBkaXJlY3RvcnkgY29udGFpbiB0aGUgZmlsZSwgCi0gICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIENsYXNzIGxvY2F0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZmlsZSBpbWFnZSBkZXNjcmlwdG9yLgotICAgICAqIFRoZSBmaWxlIGhhcyB0aGUgZ2l2ZW4gZmlsZSBuYW1lIGFuZCBpcyBsb2NhdGVkCi0gICAgICogaW4gdGhlIGdpdmVuIGNsYXNzJ3MgcmVzb3VyY2UgZGlyZWN0b3J5LiBJZiB0aGUgZ2l2ZW4KLSAgICAgKiBjbGFzcyBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIGZpbGUgbmFtZSBtdXN0IGJlIGFic29sdXRlLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgZmlsZSBpcyBub3QgYWNjZXNzZWQgdW50aWwgaXRzCi0gICAgICogPGNvZGU+Z2V0SW1hZ2VEYXRlPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6eiBjbGFzcyBmb3IgcmVzb3VyY2UgZGlyZWN0b3J5LCBvcgotICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUKLSAgICAgKi8KLSAgICBGaWxlSW1hZ2VEZXNjcmlwdG9yKENsYXNzIGNsYXp6LCBTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGNsYXp6OwotICAgICAgICB0aGlzLm5hbWUgPSBmaWxlbmFtZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEZpbGVJbWFnZURlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgRmlsZUltYWdlRGVzY3JpcHRvciBvdGhlciA9IChGaWxlSW1hZ2VEZXNjcmlwdG9yKSBvOwotICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFsb2NhdGlvbi5lcXVhbHMob3RoZXIubG9jYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG90aGVyLmxvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWUuZXF1YWxzKG90aGVyLm5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSW1hZ2VEZXNjaXB0b3IuCi0gICAgICogUmV0dXJucyBudWxsIGlmIHRoZSBpbWFnZSBkYXRhIGNhbm5vdCBiZSByZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURhdGEgZ2V0SW1hZ2VEYXRhKCkgewotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IGdldFN0cmVhbSgpOwotICAgICAgICBJbWFnZURhdGEgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEltYWdlRGF0YShpbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgIT0gU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIG90aGVyd2lzZQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIi5nZXRJbWFnZURhdGEoKTogIisKLSAgICAgICAgICAgICAgICAgICAgLy8gICJFeGNlcHRpb24gd2hpbGUgY2xvc2luZyBJbnB1dFN0cmVhbSA6ICIrZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmVhbSBvbiB0aGUgaW1hZ2UgY29udGVudHMuICBSZXR1cm5zCi0gICAgICogbnVsbCBpZiBhIHN0cmVhbSBjb3VsZCBub3QgYmUgb3BlbmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJ1ZmZlcmVkIHN0cmVhbSBvbiB0aGUgZmlsZSBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIGlmIHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKCkgewotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzID0gbG9jYXRpb24uZ2V0UmVzb3VyY2VBc1N0cmVhbShuYW1lKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpcyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaW50IGNvZGUgPSBuYW1lLmhhc2hDb2RlKCk7Ci0gICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb2RlICs9IGxvY2F0aW9uLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvZGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0gICAgICovCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkZpbGVJbWFnZURlc2NyaXB0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+T2JqZWN0PC9jb2RlPiBtZXRob2QgCi0gICAgICogcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdCB3aGljaCBpcyBzdWl0YWJsZSBvbmx5IGZvciBkZWJ1Z2dpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJGaWxlSW1hZ2VEZXNjcmlwdG9yKGxvY2F0aW9uPSIgKyBsb2NhdGlvbiArICIsIG5hbWU9IiArIG5hbWUgKyAiKSI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvRm9udERlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0ZvbnREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMmMxY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvRm9udERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLQotLyoqCi0gKiBMaWdodHdlaWdodCBkZXNjcmlwdG9yIGZvciBhIGZvbnQuIENyZWF0ZXMgdGhlIGRlc2NyaWJlZCBmb250IG9uIGRlbWFuZC4KLSAqIFN1YmNsYXNzZXMgY2FuIGltcGxlbWVudCBkaWZmZXJlbnQgd2F5cyBvZiBkZXNjcmliaW5nIGEgZm9udC4gVGhlc2Ugb2JqZWN0cwotICogd2lsbCBiZSBjb21wYXJlZCwgc28gaGFzaENvZGUoLi4uKSBhbmQgZXF1YWxzKC4uLikgbXVzdCByZXR1cm4gc29tZXRoaW5nIAotICogbWVhbmluZ2Z1bC4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9udERlc2NyaXB0b3IgZXh0ZW5kcyBEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IgewotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBGb250RGVzY3JpcHRvciB0aGF0IGRlc2NyaWJlcyBhbiBleGlzdGluZyBmb250LiBUaGUgcmVzdWx0aW5nCi0gICAgICogZGVzY3JpcHRvciBkZXBlbmRzIG9uIHRoZSBGb250LiBEaXNwb3NpbmcgdGhlIEZvbnQgd2hpbGUgdGhlIGRlc2NyaXB0b3IKLSAgICAgKiBpcyBzdGlsbCBpbiB1c2UgbWF5IHRocm93IGEgZ3JhcGhpYyBkaXNwb3NlZCBleGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqCi0gICAgICogQHBhcmFtIGZvbnQgYSBmb250IHRvIGRlc2NyaWJlCi0gICAgICogQHBhcmFtIG9yaWdpbmFsRGV2aWNlIG11c3QgYmUgdGhlIHNhbWUgRGV2aWNlIHRoYXQgd2FzIHBhc3NlZCBpbnRvCi0gICAgICogdGhlIGZvbnQncyBjb25zdHJ1Y3RvciB3aGVuIGl0IHdhcyBmaXJzdCBjcmVhdGVkLgotICAgICAqIEByZXR1cm4gYSBuZXdseSBjcmVhdGVkIEZvbnREZXNjcmlwdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9udERlc2NyaXB0b3IgY3JlYXRlRnJvbShGb250IGZvbnQsIERldmljZSBvcmlnaW5hbERldmljZSkgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5Rm9udERlc2NyaXB0b3IoZm9udCwgb3JpZ2luYWxEZXZpY2UpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgRm9udERlc2NyaXB0b3IgdGhhdCBkZXNjcmliZXMgYW4gZXhpc3RpbmcgZm9udC4gVGhlIHJlc3VsdGluZwotICAgICAqIGRlc2NyaXB0b3IgZGVwZW5kcyBvbiB0aGUgb3JpZ2luYWwgRm9udCwgYW5kIGRpc3Bvc2luZyB0aGUgb3JpZ2luYWwgRm9udAotICAgICAqIHdoaWxlIHRoZSBkZXNjcmlwdG9yIGlzIHN0aWxsIGluIHVzZSBtYXkgY2F1c2UgU1dUIHRvIHRocm93IGEgZ3JhcGhpYwotICAgICAqIGRpc3Bvc2VkIGV4Y2VwdGlvbi4gVGhpcyBpcyBsZXNzIGVmZmljaWVudCB0aGFuIDxjb2RlPmNyZWF0ZUZyb20oRm9udCwgRGV2aWNlKQotICAgICAqIDwvY29kZT4sIHNvIHRoZSBvdGhlciB2ZXJzaW9uIHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIHBvc3NpYmxlLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKgotICAgICAqIEBwYXJhbSBmb250IGZvbnQgdG8gY3JlYXRlCi0gICAgICogQHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgRm9udERlc2NyaXB0b3IgdGhhdCBkZXNjcmliZXMgdGhlIGdpdmVuIGZvbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZvbnREZXNjcmlwdG9yIGNyZWF0ZUZyb20oRm9udCBmb250KSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlGb250RGVzY3JpcHRvcihmb250KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBGb250RGVzY3JpcHRvciBnaXZlbiB0aGUgYW4gYXJyYXkgb2YgRm9udERhdGEgdGhhdCBkZXNjcmliZXMgCi0gICAgICogdGhlIGZvbnQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgYW4gYXJyYXkgb2YgRm9udERhdGEgdGhhdCBkZXNjcmliZXMgdGhlIGZvbnQgKHdpbGwgYmUgcGFzc2VkIGludG8KLSAgICAgKiB0aGUgRm9udCdzIGNvbnN0cnVjdG9yKQotICAgICAqIEByZXR1cm4gYSBGb250RGVzY3JpcHRvciB0aGF0IGRlc2NyaWJlcyB0aGUgZ2l2ZW4gZm9udAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9udERlc2NyaXB0b3IgY3JlYXRlRnJvbShGb250RGF0YVtdIGRhdGEpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUZvbnREZXNjcmlwdG9yKGRhdGEpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbnREZXNjcmlwdG9yIGdpdmVuIHRoZSBhc3NvY2lhdGVkIEZvbnREYXRhCi0gICAgICogCi0gICAgICogQHBhcmFtIGRhdGEgRm9udERhdGEgZGVzY3JpYmluZyB0aGUgZm9udCB0byBjcmVhdGUKLSAgICAgKiBAcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBGb250RGVzY3JpcHRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9udERlc2NyaXB0b3IgY3JlYXRlRnJvbShGb250RGF0YSBkYXRhKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTmFtZWRGb250RGVzY3JpcHRvcihkYXRhKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBGb250RGVzY3JpcHRvciBnaXZlbiBhbiBPUy1zcGVjaWZpYyBmb250IG5hbWUsIGhlaWdodCwgYW5kIHN0eWxlLgotICAgICAqIAotICAgICAqIEBzZWUgRm9udCNGb250KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2UsIGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgb3Mtc3BlY2lmaWMgZm9udCBuYW1lCi0gICAgICogQHBhcmFtIGhlaWdodCBoZWlnaHQgKHBpeGVscykKLSAgICAgKiBAcGFyYW0gc3R5bGUgYSBiaXR3aXNlIGNvbWJpbmF0aW9uIG9mIE5PUk1BTCwgQk9MRCwgSVRBTElDIAotICAgICAqIEByZXR1cm4gYSBuZXcgRm9udERlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZvbnREZXNjcmlwdG9yIGNyZWF0ZUZyb20oU3RyaW5nIG5hbWUsIGludCBoZWlnaHQsIGludCBzdHlsZSkgewotICAgICAgICByZXR1cm4gY3JlYXRlRnJvbShuZXcgRm9udERhdGEobmFtZSwgaGVpZ2h0LCBzdHlsZSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBGb250IGRlc2NyaWJlZCBieSB0aGlzIGRlc2NyaXB0b3IuIAotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEgCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIGRldmljZSBvbiB3aGljaCB0byBhbGxvY2F0ZSB0aGUgZm9udAotICAgICAqIEByZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgRm9udCAobmV2ZXIgbnVsbCkKLSAgICAgKiBAdGhyb3dzIERldmljZVJlc291cmNlRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBhbGxvY2F0ZSB0aGUgRm9udAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBGb250IGNyZWF0ZUZvbnQoRGV2aWNlIGRldmljZSkgdGhyb3dzIERldmljZVJlc291cmNlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIERlYWxsb2NhdGVzIGFueXRoaW5nIHRoYXQgd2FzIGFsbG9jYXRlZCBieSBjcmVhdGVGb250LCBnaXZlbiBhIGZvbnQKLSAgICAgKiB0aGF0IHdhcyBhbGxvY2F0ZWQgYnkgYW4gZXF1YWwgRm9udERlc2NyaXB0b3IuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMSAKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmV2aW91c2x5Q3JlYXRlZEZvbnQgcHJldmlvdXNseSBhbGxvY2F0ZWQgZm9udAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRlc3Ryb3lGb250KEZvbnQgcHJldmlvdXNseUNyZWF0ZWRGb250KTsKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5EZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IjY3JlYXRlKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2UpCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBjcmVhdGVSZXNvdXJjZShEZXZpY2UgZGV2aWNlKSB0aHJvd3MgRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlRm9udChkZXZpY2UpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5EZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IjZGVzdHJveShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlc3Ryb3lSZXNvdXJjZShPYmplY3QgcHJldmlvdXNseUNyZWF0ZWRPYmplY3QpIHsKLSAgICAgICAgZGVzdHJveUZvbnQoKEZvbnQpcHJldmlvdXNseUNyZWF0ZWRPYmplY3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0ZvbnRSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvRm9udFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2M2QzNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvRm9udFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSBmb250IHJlZ2lzdHJ5IG1haW50YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2xpYyBmb250IG5hbWVzIAotICogYW5kIFNXVCBmb250cy4KLSAqIDxwPgotICogQSBmb250IHJlZ2lzdHJ5IG93bnMgYWxsIG9mIHRoZSBmb250IG9iamVjdHMgcmVnaXN0ZXJlZAotICogd2l0aCBpdCwgYW5kIGF1dG9tYXRpY2FsbHkgZGlzcG9zZXMgb2YgdGhlbSB3aGVuIHRoZSBTV1QgRGlzcGxheQotICogdGhhdCBjcmVhdGVzIHRoZSBmb250cyBpcyBkaXNwb3NlZC4gQmVjYXVzZSBvZiB0aGlzLCBjbGllbnRzIGRvIAotICogbm90IG5lZWQgdG8gKGluZGVlZCwgbXVzdCBub3QgYXR0ZW1wdCB0bykgZGlzcG9zZSBvZiBmb250IAotICogb2JqZWN0cyB0aGVtc2VsdmVzLgotICogPC9wPgotICogPHA+Ci0gKiBBIHNwZWNpYWwgY29uc3RydWN0b3IgaXMgcHJvdmlkZWQgZm9yIHBvcHVsYXRpbmcgYSBmb250IHJlZ2lzdHJ5Ci0gKiBmcm9tIGEgcHJvcGVydHkgZmlsZXMgdXNpbmcgdGhlIHN0YW5kYXJkIEphdmEgcmVzb3VyY2UgYnVuZGxlIG1lY2hhbmlzbS4KLSAqIDwvcD4KLSAqIDxwPgotICogTWV0aG9kcyBhcmUgcHJvdmlkZWQgZm9yIHJlZ2lzdGVyaW5nIGxpc3RlbmVycyB0aGF0IHdpbGwgYmUga2VwdAotICogYXBwcmlzZWQgb2YgY2hhbmdlcyB0byBsaXN0IG9mIHJlZ2lzdGVkIGZvbnRzLgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIChpdCB3YXMgbm90IGRlc2lnbmVkIHRvIGJlIHN1YmNsYXNzZWQpLgotICogPC9wPgotICogCi0gKiBTaW5jZSAzLjAgdGhpcyBjbGFzcyBleHRlbmRzIFJlc291cmNlUmVnaXN0cnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250UmVnaXN0cnkgZXh0ZW5kcyBSZXNvdXJjZVJlZ2lzdHJ5IHsKLQotICAgIC8qKgotICAgICAqIEZvbnRSZWNvcmQgaXMgYSBwcml2YXRlIGhlbHBlciBjbGFzcyB0aGF0IGhvbGRzIG9udG8gYSBmb250Ci0gICAgICogYW5kIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGl0cyBib2xkIGFuZCBpdGFsaWMgdmVyc2lvbi4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBGb250UmVjb3JkIHsKLQotICAgICAgICBGb250IGJhc2VGb250OwotCi0gICAgICAgIEZvbnQgYm9sZEZvbnQ7Ci0KLSAgICAgICAgRm9udCBpdGFsaWNGb250OwotCi0gICAgICAgIEZvbnREYXRhW10gYmFzZURhdGE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgYmFzZWQgb24gdGhlIAotICAgICAgICAgKiBwbGFpbiBmb250IGFuZCB0aGUgZGF0YSBmb3IgaXQuCi0gICAgICAgICAqIEBwYXJhbSBwbGFpbkZvbnQgVGhlIGJhc2UgbG9va2VkIHVwIGZvbnQuCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHVzZWQgdG8gbG9vayBpdCB1cC4KLSAgICAgICAgICovCi0gICAgICAgIEZvbnRSZWNvcmQoRm9udCBwbGFpbkZvbnQsIEZvbnREYXRhW10gZGF0YSkgewotICAgICAgICAgICAgYmFzZUZvbnQgPSBwbGFpbkZvbnQ7Ci0gICAgICAgICAgICBiYXNlRGF0YSA9IGRhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRGlzcG9zZSBhbnkgb2YgdGhlIGZvbnRzIGNyZWF0ZWQgZm9yIHRoaXMgcmVjb3JkLgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgYmFzZUZvbnQuZGlzcG9zZSgpOwotICAgICAgICAgICAgaWYgKGJvbGRGb250ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgYm9sZEZvbnQuZGlzcG9zZSgpOwotICAgICAgICAgICAgaWYgKGl0YWxpY0ZvbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBpdGFsaWNGb250LmRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm4gdGhlIGJhc2UgRm9udC4KLSAgICAgICAgICogQHJldHVybiBGb250Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRm9udCBnZXRCYXNlRm9udCgpIHsKLSAgICAgICAgICAgIHJldHVybiBiYXNlRm9udDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm4gdGhlIGJvbGQgRm9udC4gQ3JlYXRlIGEgYm9sZCB2ZXJzaW9uCi0gICAgICAgICAqIG9mIHRoZSBiYXNlIGZvbnQgdG8gZ2V0IGl0LgotICAgICAgICAgKiBAcmV0dXJuIEZvbnQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBGb250IGdldEJvbGRGb250KCkgewotICAgICAgICAgICAgaWYgKGJvbGRGb250ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJvbGRGb250OwotCi0gICAgICAgICAgICBGb250RGF0YVtdIGJvbGREYXRhID0gZ2V0TW9kaWZpZWRGb250RGF0YShTV1QuQk9MRCk7Ci0gICAgICAgICAgICBib2xkRm9udCA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCBib2xkRGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gYm9sZEZvbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IGEgdmVyc2lvbiBvZiB0aGUgYmFzZSBmb250IGRhdGEgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAgICAgKiBzdHlsZS4KLSAgICAgICAgICogQHBhcmFtIHN0eWxlCi0gICAgICAgICAqIEByZXR1cm4KLSAgICAgICAgICogQHRvZG8gR2VuZXJhdGVkIGNvbW1lbnQKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgRm9udERhdGFbXSBnZXRNb2RpZmllZEZvbnREYXRhKGludCBzdHlsZSkgewotICAgICAgICAgICAgRm9udERhdGFbXSBzdHlsZURhdGEgPSBuZXcgRm9udERhdGFbYmFzZURhdGEubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3R5bGVEYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRm9udERhdGEgYmFzZSA9IGJhc2VEYXRhW2ldOwotICAgICAgICAgICAgICAgIHN0eWxlRGF0YVtpXSA9IG5ldyBGb250RGF0YShiYXNlLmdldE5hbWUoKSwgYmFzZS5nZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UuZ2V0U3R5bGUoKSB8IHN0eWxlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0eWxlRGF0YTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm4gdGhlIGl0YWxpYyBGb250LiBDcmVhdGUgYW4gaXRhbGljIHZlcnNpb24gb2YgdGhlCi0gICAgICAgICAqIGJhc2UgZm9udCB0byBnZXQgaXQuCi0gICAgICAgICAqIEByZXR1cm4gRm9udAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEZvbnQgZ2V0SXRhbGljRm9udCgpIHsKLSAgICAgICAgICAgIGlmIChpdGFsaWNGb250ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGl0YWxpY0ZvbnQ7Ci0KLSAgICAgICAgICAgIEZvbnREYXRhW10gaXRhbGljRGF0YSA9IGdldE1vZGlmaWVkRm9udERhdGEoU1dULklUQUxJQyk7Ci0gICAgICAgICAgICBpdGFsaWNGb250ID0gbmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksIGl0YWxpY0RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGl0YWxpY0ZvbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkIGFueSBmb250cyB0aGF0IHdlcmUgYWxsb2NhdGVkIGZvciB0aGlzIHJlY29yZCB0byB0aGUKLSAgICAgICAgICogc3RhbGUgZm9udHMuIEFueXRoaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZGVmYXVsdCBmb250IHdpbGwKLSAgICAgICAgICogYmUgc2tpcHBlZC4KLSAgICAgICAgICogQHBhcmFtIGRlZmF1bHRGb250IFRoZSBzeXN0ZW0gZGVmYXVsdC4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgYWRkQWxsb2NhdGVkRm9udHNUb1N0YWxlKEZvbnQgZGVmYXVsdEZvbnQpIHsKLSAgICAgICAgICAgIC8vUmV0dXJuIGFsbCBvZiB0aGUgZm9udHMgYWxsb2NhdGVkIGJ5IHRoZSByZWNlaXZlci4KLSAgICAgICAgICAgIC8vaWYgYW55IG9mIHRoZW0gYXJlIHRoZSBkZWZhdWx0Rm9udCB0aGVuIGRvbid0IGJvdGhlci4KLSAgICAgICAgICAgIGlmIChkZWZhdWx0Rm9udCAhPSBiYXNlRm9udCAmJiBiYXNlRm9udCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0YWxlRm9udHMuYWRkKGJhc2VGb250KTsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0Rm9udCAhPSBib2xkRm9udCAmJiBib2xkRm9udCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0YWxlRm9udHMuYWRkKGJvbGRGb250KTsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0Rm9udCAhPSBpdGFsaWNGb250ICYmIGl0YWxpY0ZvbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdGFsZUZvbnRzLmFkZChpdGFsaWNGb250KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRhYmxlIG9mIGtub3duIGZvbnRzLCBrZXllZCBieSBzeW1ib2xpYyBmb250IG5hbWUKLSAgICAgKiAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT4sIAotICAgICAqICB2YWx1ZSB0eXBlOiA8Y29kZT5Gb250UmVjb3JkPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBzdHJpbmdUb0ZvbnRSZWNvcmQgPSBuZXcgSGFzaE1hcCg3KTsKLQotICAgIC8qKgotICAgICAqIFRhYmxlIG9mIGtub3duIGZvbnQgZGF0YSwga2V5ZWQgYnkgc3ltYm9saWMgZm9udCBuYW1lCi0gICAgICogKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+LCAKLSAgICAgKiAgdmFsdWUgdHlwZTogPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhW108L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBzdHJpbmdUb0ZvbnREYXRhID0gbmV3IEhhc2hNYXAoNyk7Ci0KLSAgICAvKioKLSAgICAgKiBDb2xsZWN0aW9uIG9mIEZvbnRzIHRoYXQgYXJlIG5vdyBzdGFsZSB0byBiZSBkaXNwb3NlZAotICAgICAqIHdoZW4gaXQgaXMgc2FmZSB0byBkbyBzbyAoaS5lLiBvbiBzaHV0ZG93bikuCi0gICAgICogQHNlZSBMaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IHN0YWxlRm9udHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSdW5uYWJsZSB0aGF0IGNsZWFucyB1cCB0aGUgbWFuYWdlciBvbiBkaXNwb3NhbCBvZiB0aGUgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUnVubmFibGUgZGlzcGxheVJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBjbGVhckNhY2hlcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgZm9udCByZWdpc3RyeS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGVyZSBtdXN0IGJlIGFuIFNXVCBEaXNwbGF5IGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQgCi0gICAgICogdGhyZWFkIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgRm9udFJlZ2lzdHJ5KCkgewotICAgIAl0aGlzKERpc3BsYXkuZ2V0Q3VycmVudCgpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZm9udCByZWdpc3RyeSBhbmQgaW5pdGlhbGl6ZXMgaXRzIGNvbnRlbnQgZnJvbQotICAgICAqIGEgcHJvcGVydHkgZmlsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGVyZSBtdXN0IGJlIGFuIFNXVCBEaXNwbGF5IGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQgCi0gICAgICogdGhyZWFkIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgT1MgbmFtZSAocmV0cmlldmVkIHVzaW5nIDxjb2RlPlN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpPC9jb2RlPikKLSAgICAgKiBpcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLCBwdXJnZWQgb2Ygd2hpdGVzcGFjZSwgYW5kIGFwcGVuZGVkIAotICAgICAqIGFzIHN1ZmZpeCAoc2VwYXJhdGVkIGJ5IGFuIHVuZGVyc2NvcmUgPGNvZGU+J18nPC9jb2RlPikgdG8gdGhlIGdpdmVuIAotICAgICAqIGxvY2F0aW9uIHN0cmluZyB0byB5aWVsZCB0aGUgYmFzZSBuYW1lIG9mIGEgcmVzb3VyY2UgYnVuZGxlCi0gICAgICogYWNjZXB0YWJsZSB0byA8Y29kZT5SZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGU8L2NvZGU+LgotICAgICAqIFRoZSBzdGFuZGFyZCBKYXZhIHJlc291cmNlIGJ1bmRsZSBtZWNoYW5pc20gaXMgdGhlbiB1c2VkIHRvIGxvY2F0ZQotICAgICAqIGFuZCBvcGVuIHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzIGZpbGUsIHRha2luZyBpbnRvIGFjY291bnQKLSAgICAgKiBsb2NhbGUgc3BlY2lmaWMgdmFyaWF0aW9ucy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogRm9yIGV4YW1wbGUsIG9uIHRoZSBXaW5kb3dzIDIwMDAgb3BlcmF0aW5nIHN5c3RlbSB0aGUgbG9jYXRpb24gc3RyaW5nCi0gICAgICogPGNvZGU+ImNvbS5leGFtcGxlLm15YXBwLkZvbnRzIjwvY29kZT4geWllbGRzIHRoZSBiYXNlIG5hbWUgCi0gICAgICogPGNvZGU+ImNvbS5leGFtcGxlLm15YXBwLkZvbnRzX3dpbmRvd3MyMDAwIjwvY29kZT4uIEZvciB0aGUgVVMgRW5nbGlzaCBsb2NhbGUsCi0gICAgICogdGhpcyBmdXJ0aGVyIGVsYWJvcmF0ZXMgdG8gdGhlIHJlc291cmNlIGJ1bmRsZSBuYW1lCi0gICAgICogPGNvZGU+ImNvbS5leGFtcGxlLm15YXBwLkZvbnRzX3dpbmRvd3MyMDAwX2VuX3VzIjwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIElmIG5vIGFwcHJvcHJpYXRlIE9TLXNwZWNpZmljIHJlc291cmNlIGJ1bmRsZSBpcyBmb3VuZCwgdGhlCi0gICAgICogcHJvY2VzcyBpcyByZXBlYXRlZCB1c2luZyB0aGUgbG9jYXRpb24gYXMgdGhlIGJhc2UgYnVuZGxlIG5hbWUuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSBwcm9wZXJ0eSBmaWxlIGNvbnRhaW5zIGVudHJpZXMgdGhhdCBsb29rIGxpa2UgdGhpczoKLSAgICAgKiA8cHJlPgotICAgICAqCXRleHRmb250LjA9TVMgU2FucyBTZXJpZi1yZWd1bGFyLTEwCi0gICAgICoJdGV4dGZvbnQuMT1UaW1lcyBOZXcgUm9tYW4tcmVndWxhci0xMAotICAgICAqCQotICAgICAqCXRpdGxlZm9udC4wPU1TIFNhbnMgU2VyaWYtcmVndWxhci0xMgotICAgICAqCXRpdGxlZm9udC4xPVRpbWVzIE5ldyBSb21hbi1yZWd1bGFyLTEyCi0gICAgICogPC9wcmU+Ci0gICAgICogRWFjaCBlbnRyeSBtYXBzIGEgc3ltYm9saWMgZm9udCBuYW1lcyAodGhlIGZvbnQgcmVnaXN0cnkga2V5cykgd2l0aAotICAgICAqIGEgIjxjb2RlPi48aXQ+bjwvaXQ+PC9jb2RlPiBzdWZmaXggdG8gc3RhbmRhcmQgZm9udCBuYW1lcwotICAgICAqIG9uIHRoZSByaWdodC4gVGhlIHN1ZmZpeCBpbmRpY2F0ZWQgb3JkZXIgb2YgcHJlZmVyZW5jZTogCi0gICAgICogIjxjb2RlPi4wPC9jb2RlPiIgaW5kaWNhdGVzIHRoZSBmaXJzdCBjaG9pY2UsCi0gICAgICogIjxjb2RlPi4xPC9jb2RlPiIgaW5kaWNhdGVzIHRoZSBzZWNvbmQgY2hvaWNlLCBhbmQgc28gb24uCi0gICAgICogPC9wPgotICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIHRoZSBmb250IHJlZ2lzdHJ5OgotICAgICAqIDxwcmU+Ci0gICAgICoJRm9udFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IEZvbnRSZWdpc3RyeSgiY29tLmV4YW1wbGUubXlhcHAuZm9udHMiKTsKLSAgICAgKiAgRm9udCBmb250ID0gcmVnaXN0cnkuZ2V0KCJ0ZXh0Zm9udCIpOwotICAgICAqICBjb250cm9sLnNldEZvbnQoZm9udCk7Ci0gICAgICogIC4uLgotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUKLSAgICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBDbGFzc0xvYWRlciB0byB1c2UgdG8gZmluZCB0aGUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICogQGV4Y2VwdGlvbiBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gaWYgdGhlIHJlc291cmNlIGJ1bmRsZSBjYW5ub3QgYmUgZm91bmQKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICovCi0gICAgcHVibGljIEZvbnRSZWdpc3RyeShTdHJpbmcgbG9jYXRpb24sIENsYXNzTG9hZGVyIGxvYWRlcikKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChkaXNwbGF5KTsKLSAgICAgICAgLy8gRklYRTogbmVlZCB0byByZXNwZWN0IGxvYWRlcgotICAgICAgICAvL3JlYWRSZXNvdXJjZUJ1bmRsZShsb2NhdGlvbiwgbG9hZGVyKTsKLSAgICAgICAgcmVhZFJlc291cmNlQnVuZGxlKGxvY2F0aW9uKTsKLQotICAgICAgICBob29rRGlzcGxheURpc3Bvc2UoZGlzcGxheSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgRm9udFJlZ2lzdHJ5IHVzaW5nIHRoZSBDbGFzc0xvYWRlciBmcm9tIHRoZSBQbGF0Zm9ybVVJCi0gICAgICogcGx1Zy1pbgotICAgICAqLwotICAgIHB1YmxpYyBGb250UmVnaXN0cnkoU3RyaW5nIGxvY2F0aW9uKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRklYRToKLSAgICAgICAgLy8JdGhpcyhsb2NhdGlvbiwgV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIHRoaXMobG9jYXRpb24sIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIHJlc291cmNlIGJ1bmRsZSBhdCBsb2NhdGlvbi4gTG9vayBmb3IgYSBmaWxlIHdpdGggdGhlCi0gICAgICogZXh0ZW5zaW9uIF9vc193cyBmaXJzdCwgdGhlbiBfb3MgdGhlbiBqdXN0IHRoZSBuYW1lLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiAtIFN0cmluZyAtIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgdm9pZCByZWFkUmVzb3VyY2VCdW5kbGUoU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBvc25hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50cmltKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIHdzbmFtZSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotICAgICAgICBvc25hbWUgPSBTdHJpbmdDb252ZXJ0ZXIucmVtb3ZlV2hpdGVTcGFjZXMob3NuYW1lKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICB3c25hbWUgPSBTdHJpbmdDb252ZXJ0ZXIucmVtb3ZlV2hpdGVTcGFjZXMod3NuYW1lKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICBTdHJpbmcgT1NMb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgICAgICBTdHJpbmcgV1NMb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotICAgICAgICBpZiAob3NuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9TTG9jYXRpb24gPSBsb2NhdGlvbiArICJfIiArIG9zbmFtZTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKHdzbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIFdTTG9jYXRpb24gPSBPU0xvY2F0aW9uICsgIl8iICsgd3NuYW1lOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFdTTG9jYXRpb24pOwotICAgICAgICAgICAgcmVhZFJlc291cmNlQnVuZGxlKGJ1bmRsZSwgV1NMb2NhdGlvbik7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB3c0V4Y2VwdGlvbikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoT1NMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgcmVhZFJlc291cmNlQnVuZGxlKGJ1bmRsZSwgV1NMb2NhdGlvbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gb3NFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gT1NMb2NhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUobG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICByZWFkUmVzb3VyY2VCdW5kbGUoYnVuZGxlLCBXU0xvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgb3NFeGNlcHRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGZvbnQgcmVnaXN0cnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGlzcGxheSB0aGUgRGlzcGxheQotICAgICAqLwotICAgIHB1YmxpYyBGb250UmVnaXN0cnkoRGlzcGxheSBkaXNwbGF5KSB7Ci0gICAgICAgIHRoaXMoZGlzcGxheSwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkgZm9udCByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheQotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPkRpc3BsYXk8L2NvZGU+Ci0JICogQHBhcmFtIGNsZWFuT25EaXNwbGF5RGlzcG9zYWwKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgYWxsIGZvbnRzIGFsbG9jYXRlZCBieSB0aGlzIDxjb2RlPkZvbnRSZWdpc3RyeTwvY29kZT4KLQkgKiAgICAgICAgICAgIHNob3VsZCBiZSBkaXNwb3NlZCB3aGVuIHRoZSBkaXNwbGF5IGlzIGRpc3Bvc2VkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBGb250UmVnaXN0cnkoRGlzcGxheSBkaXNwbGF5LCBib29sZWFuIGNsZWFuT25EaXNwbGF5RGlzcG9zYWwpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChkaXNwbGF5KTsKLQkJaWYgKGNsZWFuT25EaXNwbGF5RGlzcG9zYWwpCi0JCQlob29rRGlzcGxheURpc3Bvc2UoZGlzcGxheSk7Ci0JfQotCi0gICAgLyoqCi0JICogRmluZCB0aGUgZmlyc3QgdmFsaWQgZm9udERhdGEgaW4gdGhlIHByb3ZpZGVkIGxpc3QuIElmIG5vbmUgYXJlIHZhbGlkCi0JICogcmV0dXJuIHRoZSBmaXJzdCBvbmUgcmVnYXJkbGVzcy4gSWYgdGhlIGxpc3QgaXMgZW1wdHkgcmV0dXJuIG51bGwuIFJldHVybgotCSAqIG51bGwgaWYgb25lIGNhbm5vdCBiZSBmb3VuZC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2UgYmVzdERhdGFBcnJheSBpbiBvcmRlciB0byBzdXBwb3J0IE1vdGlmIG11bHRpcGxlIGVudHJ5Ci0JICogICAgICAgICAgICAgZm9udHMuCi0JICovCi0gICAgcHVibGljIEZvbnREYXRhIGJlc3REYXRhKEZvbnREYXRhW10gZm9udHMsIERpc3BsYXkgZGlzcGxheSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBGb250RGF0YSBmZCA9IGZvbnRzW2ldOwotCi0gICAgICAgICAgICBpZiAoZmQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgRm9udERhdGFbXSBmaXhlZEZvbnRzID0gZGlzcGxheS5nZXRGb250TGlzdChmZC5nZXROYW1lKCksIGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChpc0ZpeGVkRm9udChmaXhlZEZvbnRzLCBmZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZvbnREYXRhW10gc2NhbGFibGVGb250cyA9IGRpc3BsYXkuZ2V0Rm9udExpc3QoZmQuZ2V0TmFtZSgpLCB0cnVlKTsKLSAgICAgICAgICAgIGlmIChzY2FsYWJsZUZvbnRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL05vbmUgb2YgdGhlIHByb3ZpZGVkIGRhdGFzIGFyZSB2YWxpZC4gUmV0dXJuIHRoZQotICAgICAgICAvL2ZpcnN0IG9uZSBhcyBpdCBpcyBhdCBsZWFzdCB0aGUgZmlyc3QgY2hvaWNlLgotICAgICAgICBpZiAoZm9udHMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgIHJldHVybiBmb250c1swXTsKLSAgICAgICAgCi0gICAgICAgIC8vTm90aGluZyBzcGVjaWZpZWQgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIGZpcnN0IHZhbGlkIGZvbnREYXRhIGluIHRoZSBwcm92aWRlZCBsaXN0LiAKLSAgICAgKiBJZiBub25lIGFyZSB2YWxpZCByZXR1cm4gdGhlIGZpcnN0IG9uZSByZWdhcmRsZXNzLgotICAgICAqIElmIHRoZSBsaXN0IGlzIGVtcHR5IHJldHVybiBudWxsLgotICAgICAqIEBkZXByZWNhdGVkIHVzZSBmaWx0ZXJEYXRhIGluIG9yZGVyIHRvIHByZXNlcnZlIAotICAgICAqIG11bHRpcGxlIGVudHJ5IGZvbnRzIG9uIE1vdGlmCi0gICAgICovCi0gICAgcHVibGljIEZvbnREYXRhW10gYmVzdERhdGFBcnJheShGb250RGF0YVtdIGZvbnRzLCBEaXNwbGF5IGRpc3BsYXkpIHsKLQotICAgICAgICBGb250RGF0YSBiZXN0RGF0YSA9IGJlc3REYXRhKGZvbnRzLCBkaXNwbGF5KTsKLSAgICAgICAgaWYgKGJlc3REYXRhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIEZvbnREYXRhW10gZGF0YXMgPSBuZXcgRm9udERhdGFbMV07Ci0gICAgICAgIGRhdGFzWzBdID0gYmVzdERhdGE7Ci0gICAgICAgIHJldHVybiBkYXRhczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBmcm9tIHRoZSBsaXN0IGFsbCBmb250cyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGlzIHN5c3RlbS4gIAotICAgICAqIElmIG5vbmUgYXJlIHZhbGlkLCByZXR1cm4gdGhlIGZpcnN0IGlycmVnYXJkbGVzcy4gIElmIHRoZSBsaXN0IGlzIAotICAgICAqIGVtcHR5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9udHMgdGhlIGZvbnRzIHRvIGNoZWNrCi0gICAgICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkgdG8gY2hlY2sgYWdhaW5zdAotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZm9udHMgdGhhdCBoYXZlIGJlZW4gZm91bmQgb24gdGhpcyBzeXN0ZW0KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIEZvbnREYXRhIFtdIGZpbHRlckRhdGEoRm9udERhdGEgW10gZm9udHMsIERpc3BsYXkgZGlzcGxheSkgewotICAgIAlBcnJheUxpc3QgZ29vZCA9IG5ldyBBcnJheUxpc3QoZm9udHMubGVuZ3RoKTsKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBmb250cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRm9udERhdGEgZmQgPSBmb250c1tpXTsKLQotICAgICAgICAgICAgaWYgKGZkID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIEZvbnREYXRhW10gZml4ZWRGb250cyA9IGRpc3BsYXkuZ2V0Rm9udExpc3QoZmQuZ2V0TmFtZSgpLCBmYWxzZSk7Ci0gICAgICAgICAgICBpZiAoaXNGaXhlZEZvbnQoZml4ZWRGb250cywgZmQpKSB7Ci0gICAgICAgICAgICAgICAgZ29vZC5hZGQoZmQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGb250RGF0YVtdIHNjYWxhYmxlRm9udHMgPSBkaXNwbGF5LmdldEZvbnRMaXN0KGZkLmdldE5hbWUoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAoc2NhbGFibGVGb250cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgZ29vZC5hZGQoZmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAJCi0gICAgICAgIC8vTm9uZSBvZiB0aGUgcHJvdmlkZWQgZGF0YXMgYXJlIHZhbGlkLiBSZXR1cm4gdGhlCi0gICAgICAgIC8vZmlyc3Qgb25lIGFzIGl0IGlzIGF0IGxlYXN0IHRoZSBmaXJzdCBjaG9pY2UuCi0gICAgICAgIGlmIChnb29kLmlzRW1wdHkoKSAmJiBmb250cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgIAlnb29kLmFkZChmb250c1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZm9udHMubGVuZ3RoID09IDApIHsKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gKEZvbnREYXRhW10pIGdvb2QudG9BcnJheShuZXcgRm9udERhdGFbZ29vZC5zaXplKCldKTsgICAgCQotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZm9udCB3aXRoIHRoZSBnaXZlbiBmb250IGRhdGFzIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgdGhlcmUgaXMgbm8gZGF0YS4KLSAgICAgKiBAcmV0dXJuIEZvbnRSZWNvcmQgZm9yIHRoZSBuZXcgRm9udCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZvbnRSZWNvcmQgY3JlYXRlRm9udChTdHJpbmcgc3ltYm9saWNOYW1lLCBGb250RGF0YVtdIGZvbnRzKSB7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgICAgICBpZiAoZGlzcGxheSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgRm9udERhdGFbXSB2YWxpZERhdGEgPSBmaWx0ZXJEYXRhKGZvbnRzLCBkaXNwbGF5KTsKLSAgICAgICAgaWYgKHZhbGlkRGF0YS5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgLy9Ob3RoaW5nIHNwZWNpZmllZCAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IAotCi0gICAgICAgIC8vRG8gbm90IGZpcmUgdGhlIHVwZGF0ZSBmcm9tIGNyZWF0aW9uIGFzIGl0IGlzIG5vdCBhIHByb3BlcnR5IGNoYW5nZQotICAgICAgICBwdXQoc3ltYm9saWNOYW1lLCB2YWxpZERhdGEsIGZhbHNlKTsKLSAgICAgICAgRm9udCBuZXdGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgdmFsaWREYXRhKTsKLSAgICAgICAgcmV0dXJuIG5ldyBGb250UmVjb3JkKG5ld0ZvbnQsIHZhbGlkRGF0YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsY3VsYXRlcyB0aGUgZGVmYXVsdCBmb250IGFuZCByZXR1cm5zIHRoZSByZXN1bHQKLSAgICAgKi8KLSAgICBGb250IGNhbGN1bGF0ZURlZmF1bHRGb250KCkgewotICAgICAgICBEaXNwbGF5IGN1cnJlbnQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLSAgICAgICAgICAgIEZvbnQgZm9udCA9IG5ldyBGb250KG51bGwsIHNoZWxsLmdldEZvbnQoKS5nZXRGb250RGF0YSgpKTsKLSAgICAgICAgICAgIHNoZWxsLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmb250OwotICAgICAgICB9Ci0JCXJldHVybiBuZXcgRm9udChjdXJyZW50LCBjdXJyZW50LmdldFN5c3RlbUZvbnQoKS5nZXRGb250RGF0YSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGZvbnQgZGF0YS4gIENyZWF0ZXMgaXQgaWYgbmVjZXNzYXJ5LgotICAgICAqIEByZXR1cm4gRm9udAotICAgICAqLwotICAgIHB1YmxpYyBGb250IGRlZmF1bHRGb250KCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdEZvbnRSZWNvcmQoKS5nZXRCYXNlRm9udCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgZm9udCByZWNvcmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGb250UmVjb3JkIGRlZmF1bHRGb250UmVjb3JkKCkgewotCi0gICAgICAgIEZvbnRSZWNvcmQgcmVjb3JkID0gKEZvbnRSZWNvcmQpIHN0cmluZ1RvRm9udFJlY29yZAotICAgICAgICAgICAgICAgIC5nZXQoSkZhY2VSZXNvdXJjZXMuREVGQVVMVF9GT05UKTsKLSAgICAgICAgaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBGb250IGRlZmF1bHRGb250ID0gY2FsY3VsYXRlRGVmYXVsdEZvbnQoKTsKLSAgICAgICAgICAgIHJlY29yZCA9IGNyZWF0ZUZvbnQoSkZhY2VSZXNvdXJjZXMuREVGQVVMVF9GT05ULCBkZWZhdWx0Rm9udAotICAgICAgICAgICAgICAgICAgICAuZ2V0Rm9udERhdGEoKSk7Ci0gICAgICAgICAgICBzdHJpbmdUb0ZvbnRSZWNvcmQucHV0KEpGYWNlUmVzb3VyY2VzLkRFRkFVTFRfRk9OVCwgcmVjb3JkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVjb3JkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgZm9udCBkYXRhLiAgQ3JlYXRlcyBpdCBpZiBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGb250RGF0YVtdIGRlZmF1bHRGb250RGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRGb250UmVjb3JkKCkuYmFzZURhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZm9udCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gc3ltYm9saWMgZm9udCBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgZm9udCBkYXRhIGlmIHRoZXJlIGlzIG5vIHNwZWNpYWwgdmFsdWUgYXNzb2NpYXRlZAotICAgICAqIHdpdGggdGhhdCBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHN5bWJvbGljTmFtZSBzeW1ib2xpYyBmb250IG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBmb250Ci0gICAgICovCi0gICAgcHVibGljIEZvbnREYXRhW10gZ2V0Rm9udERhdGEoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCi0gICAgICAgIEFzc2VydC5pc05vdE51bGwoc3ltYm9saWNOYW1lKTsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHN0cmluZ1RvRm9udERhdGEuZ2V0KHN5bWJvbGljTmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Rm9udERhdGEoKTsKLQotICAgICAgICByZXR1cm4gKEZvbnREYXRhW10pIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmb250IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gc3ltYm9saWMgZm9udCBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgZm9udCBpZiB0aGVyZSBpcyBubyBzcGVjaWFsIHZhbHVlIGFzc29jaWF0ZWQKLSAgICAgKiB3aXRoIHRoYXQgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzeW1ib2xpY05hbWUgc3ltYm9saWMgZm9udCBuYW1lCi0gICAgICogQHJldHVybiB0aGUgZm9udAotICAgICAqLwotICAgIHB1YmxpYyBGb250IGdldChTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0KLSAgICAgICAgcmV0dXJuIGdldEZvbnRSZWNvcmQoc3ltYm9saWNOYW1lKS5nZXRCYXNlRm9udCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJvbGQgZm9udCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHN5bWJvbGljIGZvbnQgbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBib2xkZWQgZGVmYXVsdCBmb250IGlmIHRoZXJlIGlzIG5vIHNwZWNpYWwgdmFsdWUgYXNzb2NpYXRlZAotICAgICAqIHdpdGggdGhhdCBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHN5bWJvbGljTmFtZSBzeW1ib2xpYyBmb250IG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBmb250Ci0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBGb250IGdldEJvbGQoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCi0gICAgICAgIHJldHVybiBnZXRGb250UmVjb3JkKHN5bWJvbGljTmFtZSkuZ2V0Qm9sZEZvbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpdGFsaWMgZm9udCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHN5bWJvbGljIGZvbnQgbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBpdGFsaWMgZGVmYXVsdCBmb250IGlmIHRoZXJlIGlzIG5vIHNwZWNpYWwgdmFsdWUgYXNzb2NpYXRlZAotICAgICAqIHdpdGggdGhhdCBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHN5bWJvbGljTmFtZSBzeW1ib2xpYyBmb250IG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBmb250Ci0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBGb250IGdldEl0YWxpYyhTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0KLSAgICAgICAgcmV0dXJuIGdldEZvbnRSZWNvcmQoc3ltYm9saWNOYW1lKS5nZXRJdGFsaWNGb250KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBmb250IHJlY29yZCBmb3IgdGhlIGtleS4KLSAgICAgKiBAcGFyYW0gc3ltYm9saWNOYW1lIFRoZSBrZXkgZm9yIHRoZSByZWNvcmQuCi0gICAgICogQHJldHVybiBGb250UmVjaXJkCi0gICAgICovCi0gICAgcHJpdmF0ZSBGb250UmVjb3JkIGdldEZvbnRSZWNvcmQoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHN5bWJvbGljTmFtZSk7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSBzdHJpbmdUb0ZvbnRSZWNvcmQuZ2V0KHN5bWJvbGljTmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAoRm9udFJlY29yZCkgcmVzdWx0OwotCi0gICAgICAgIHJlc3VsdCA9IHN0cmluZ1RvRm9udERhdGEuZ2V0KHN5bWJvbGljTmFtZSk7Ci0KLSAgICAgICAgRm9udFJlY29yZCBmb250UmVjb3JkOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIGZvbnRSZWNvcmQgPSBkZWZhdWx0Rm9udFJlY29yZCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmb250UmVjb3JkID0gY3JlYXRlRm9udChzeW1ib2xpY05hbWUsIChGb250RGF0YVtdKSByZXN1bHQpOwotCi0gICAgICAgIGlmIChmb250UmVjb3JkID09IG51bGwpIC8vIGNyZWF0ZSBtYXkgaGF2ZSBmYWlsZWQuICBFbnN1cmUgd2UgaGF2ZSBhIHZhbGlkIGZvbnQuCi0gICAgICAgICAgICBmb250UmVjb3JkID0gZGVmYXVsdEZvbnRSZWNvcmQoKTsKLQotICAgICAgICBzdHJpbmdUb0ZvbnRSZWNvcmQucHV0KHN5bWJvbGljTmFtZSwgZm9udFJlY29yZCk7Ci0gICAgICAgIHJldHVybiBmb250UmVjb3JkOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VSZWdpc3RyeSNnZXRLZXlTZXQoKQotICAgICAqLwotICAgIHB1YmxpYyBTZXQgZ2V0S2V5U2V0KCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHN0cmluZ1RvRm9udERhdGEua2V5U2V0KCkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlUmVnaXN0cnkjaGFzVmFsdWVGb3IoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNWYWx1ZUZvcihTdHJpbmcgZm9udEtleSkgewotICAgICAgICByZXR1cm4gc3RyaW5nVG9Gb250RGF0YS5jb250YWluc0tleShmb250S2V5KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZVJlZ2lzdHJ5I2NsZWFyQ2FjaGVzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhckNhY2hlcygpIHsKLQotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHN0cmluZ1RvRm9udFJlY29yZC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICgoRm9udFJlY29yZCkgbmV4dCkuZGlzcG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGlzcG9zZUZvbnRzKHN0YWxlRm9udHMuaXRlcmF0b3IoKSk7Ci0gICAgICAgIHN0cmluZ1RvRm9udFJlY29yZC5jbGVhcigpOwotICAgICAgICBzdGFsZUZvbnRzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcG9zZSBvZiBhbGwgb2YgdGhlIGZvbnRzIGluIHRoaXMgaXRlcmF0b3IuCi0gICAgICogQHBhcmFtIEl0ZXJhdG9yIG92ZXIgQ29sbGVjdGlvbiBvZiBGb250Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3Bvc2VGb250cyhJdGVyYXRvciBpdGVyYXRvcikgewotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICgoRm9udCkgbmV4dCkuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSG9vayBhIGRpc3Bvc2UgbGlzdGVuZXIgb24gdGhlIFNXVCBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBob29rRGlzcGxheURpc3Bvc2UoRGlzcGxheSBkaXNwbGF5KSB7Ci0gICAgICAgIGRpc3BsYXkuZGlzcG9zZUV4ZWMoZGlzcGxheVJ1bm5hYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gZm9udCBpcyBpbiB0aGUgbGlzdCBvZiBmaXhlZCBmb250cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNGaXhlZEZvbnQoRm9udERhdGFbXSBmaXhlZEZvbnRzLCBGb250RGF0YSBmZCkgewotICAgICAgICAvLyBDYW4ndCB1c2UgRm9udERhdGEuZXF1YWxzKCkgc2luY2Ugc29tZSB2YWx1ZXMgYXJlbid0Ci0gICAgICAgIC8vIHNldCBpZiBhIGZvbnRkYXRhIGlzbid0IHVzZWQuCi0gICAgICAgIGludCBoZWlnaHQgPSBmZC5nZXRIZWlnaHQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBmZC5nZXROYW1lKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZml4ZWRGb250cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRm9udERhdGEgZml4ZWQgPSBmaXhlZEZvbnRzW2ldOwotICAgICAgICAgICAgaWYgKGZpeGVkLmdldEhlaWdodCgpID09IGhlaWdodCAmJiBmaXhlZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIFN0cmluZyBpbnRvIGEgRm9udERhdGEgb2JqZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgRm9udERhdGEgbWFrZUZvbnREYXRhKFN0cmluZyB2YWx1ZSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nQ29udmVydGVyLmFzRm9udERhdGEodmFsdWUudHJpbSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRGF0YUZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiV3JvbmcgZm9udCBkYXRhIGZvcm1hdC4gVmFsdWUgaXM6IFwiIiArIHZhbHVlICsgIlwiIiwgZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZhbHVlKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgKG9yIHJlcGxhY2VzKSBhIGZvbnQgdG8gdGhpcyBmb250IHJlZ2lzdHJ5IHVuZGVyIHRoZSBnaXZlbgotICAgICAqIHN5bWJvbGljIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgd2hlbmV2ZXIgdGhlIG1hcHBpbmcgZnJvbQotICAgICAqIGEgc3ltYm9saWMgbmFtZSB0byBhIGZvbnQgY2hhbmdlcy4gVGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQgaXMKLSAgICAgKiB0aGlzIHJlZ2lzdHJ5OyB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgc3ltYm9saWMgZm9udCBuYW1lLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzeW1ib2xpY05hbWUgdGhlIHN5bWJvbGljIGZvbnQgbmFtZQotICAgICAqIEBwYXJhbSBmb250RGF0YSBhbiBBcnJheSBvZiBGb250RGF0YQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcgc3ltYm9saWNOYW1lLCBGb250RGF0YVtdIGZvbnREYXRhKSB7Ci0gICAgICAgIHB1dChzeW1ib2xpY05hbWUsIGZvbnREYXRhLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIChvciByZXBsYWNlcykgYSBmb250IHRvIHRoaXMgZm9udCByZWdpc3RyeSB1bmRlciB0aGUgZ2l2ZW4KLSAgICAgKiBzeW1ib2xpYyBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIHdoZW5ldmVyIHRoZSBtYXBwaW5nIGZyb20KLSAgICAgKiBhIHN5bWJvbGljIG5hbWUgdG8gYSBmb250IGNoYW5nZXMuIFRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50IGlzCi0gICAgICogdGhpcyByZWdpc3RyeTsgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIHN5bWJvbGljIGZvbnQgbmFtZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3ltYm9saWNOYW1lIHRoZSBzeW1ib2xpYyBmb250IG5hbWUKLSAgICAgKiBAcGFyYW0gZm9udERhdGEgYW4gQXJyYXkgb2YgRm9udERhdGEKLSAgICAgKiBAcGFyYW0gdXBkYXRlIC0gZmlyZSBhIGZvbnQgbWFwcGluZyBjaGFuZ2VkIGlmIHRydWUuIEZhbHNlCi0gICAgICogCWlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHRoZSBnZXQgbWV0aG9kIGFzIG5vIHNldHRpbmcKLSAgICAgKiAgaGFzIGNoYW5nZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHB1dChTdHJpbmcgc3ltYm9saWNOYW1lLCBGb250RGF0YVtdIGZvbnREYXRhLCBib29sZWFuIHVwZGF0ZSkgewotCi0gICAgICAgIEFzc2VydC5pc05vdE51bGwoc3ltYm9saWNOYW1lKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChmb250RGF0YSk7Ci0KLSAgICAgICAgRm9udERhdGFbXSBleGlzdGluZyA9IChGb250RGF0YVtdKSBzdHJpbmdUb0ZvbnREYXRhLmdldChzeW1ib2xpY05hbWUpOwotICAgICAgICBpZiAoQXJyYXlzLmVxdWFscyhleGlzdGluZywgZm9udERhdGEpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEZvbnRSZWNvcmQgb2xkRm9udCA9IChGb250UmVjb3JkKSBzdHJpbmdUb0ZvbnRSZWNvcmQKLSAgICAgICAgICAgICAgICAucmVtb3ZlKHN5bWJvbGljTmFtZSk7Ci0gICAgICAgIHN0cmluZ1RvRm9udERhdGEucHV0KHN5bWJvbGljTmFtZSwgZm9udERhdGEpOwotICAgICAgICBpZiAodXBkYXRlKQotICAgICAgICAgICAgZmlyZU1hcHBpbmdDaGFuZ2VkKHN5bWJvbGljTmFtZSwgZXhpc3RpbmcsIGZvbnREYXRhKTsKLQotICAgICAgICBpZiAob2xkRm9udCAhPSBudWxsKQotICAgICAgICAgICAgb2xkRm9udC5hZGRBbGxvY2F0ZWRGb250c1RvU3RhbGUoZGVmYXVsdEZvbnRSZWNvcmQoKS5nZXRCYXNlRm9udCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgcmVzb3VyY2UgYnVuZGxlLiAgVGhpcyBwdXRzIEZvbnREYXRhW10gb2JqZWN0cwotICAgICAqIGluIHRoZSBtYXBwaW5nIHRhYmxlLiAgVGhlc2Ugd2lsbCBsYXppbHkgYmUgdHVybmVkIGludG8KLSAgICAgKiByZWFsIEZvbnQgb2JqZWN0cyB3aGVuIHJlcXVlc3RlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGJ1bmRsZU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IGJ1bmRsZS5nZXRLZXlzKCk7Ci0gICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaW50IHBvcyA9IGtleS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgaWYgKHBvcyA9PSAtMSkgewotICAgICAgICAgICAgICAgIHN0cmluZ1RvRm9udERhdGEucHV0KGtleSwgbmV3IEZvbnREYXRhW10geyBtYWtlRm9udERhdGEoYnVuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKGtleSkpIH0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGtleS5zdWJzdHJpbmcoMCwgcG9zKTsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaSA9IEludGVnZXIucGFyc2VJbnQoa2V5LnN1YnN0cmluZyhwb3MgKyAxKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9QYW5pYyB0aGUgZmlsZSBjYW4gbm90IGJlIHBhcnNlZC4KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV3Jvbmcga2V5IGZvcm1hdCAiLCBidW5kbGVOYW1lLCBrZXkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZvbnREYXRhW10gZWxlbWVudHMgPSAoRm9udERhdGFbXSkgc3RyaW5nVG9Gb250RGF0YS5nZXQobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgPSBuZXcgRm9udERhdGFbOF07Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvRm9udERhdGEucHV0KG5hbWUsIGVsZW1lbnRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGkgPiBlbGVtZW50cy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgRm9udERhdGFbXSBuYSA9IG5ldyBGb250RGF0YVtpICsgOF07Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZWxlbWVudHMsIDAsIG5hLCAwLCBlbGVtZW50cy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyA9IG5hOwotICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZvbnREYXRhLnB1dChuYW1lLCBlbGVtZW50cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsZW1lbnRzW2ldID0gbWFrZUZvbnREYXRhKGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9JbWFnZURhdGFJbWFnZURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0ltYWdlRGF0YUltYWdlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjIyMmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL0ltYWdlRGF0YUltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1jbGFzcyBJbWFnZURhdGFJbWFnZURlc2NyaXB0b3IgZXh0ZW5kcyBJbWFnZURlc2NyaXB0b3IgewotCi0gICAgcHJpdmF0ZSBJbWFnZURhdGEgZGF0YTsKLSAgICBwcml2YXRlIEltYWdlIG9yaWdpbmFsSW1hZ2UgPSBudWxsOwotICAgIHByaXZhdGUgRGV2aWNlIG9yaWdpbmFsRGV2aWNlID0gbnVsbDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGltYWdlIGRlc2NyaXB0b3IsIGdpdmVuIGFuIGltYWdlIGFuZCB0aGUgZGV2aWNlIGl0IHdhcyBjcmVhdGVkIG9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvcmlnaW5hbEltYWdlCi0gICAgICogQHBhcmFtIG9yaWdpbmFsRGV2aWNlCi0gICAgICovCi0gICAgSW1hZ2VEYXRhSW1hZ2VEZXNjcmlwdG9yKEltYWdlIG9yaWdpbmFsSW1hZ2UsIERldmljZSBvcmlnaW5hbERldmljZSkgewotICAgICAgICB0aGlzKG9yaWdpbmFsSW1hZ2UuZ2V0SW1hZ2VEYXRhKCkpOwotICAgICAgICB0aGlzLm9yaWdpbmFsSW1hZ2UgPSBvcmlnaW5hbEltYWdlOwotICAgICAgICB0aGlzLm9yaWdpbmFsRGV2aWNlID0gb3JpZ2luYWxEZXZpY2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciwgZ2l2ZW4gYW4gaW1hZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9yaWdpbmFsSW1hZ2UKLSAgICAgKi8KLSAgICBJbWFnZURhdGFJbWFnZURlc2NyaXB0b3IoSW1hZ2Ugb3JpZ2luYWxJbWFnZSkgewotICAgICAgICB0aGlzKG9yaWdpbmFsSW1hZ2UuZ2V0SW1hZ2VEYXRhKCkpOwotICAgICAgICB0aGlzLm9yaWdpbmFsSW1hZ2UgPSBvcmlnaW5hbEltYWdlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGltYWdlIGRlc2NyaXB0b3IsIGdpdmVuIHNvbWUgaW1hZ2UgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YSBkZXNjcmliaW5nIHRoZSBpbWFnZQotICAgICAqLwotCi0gICAgSW1hZ2VEYXRhSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGF0YSBkYXRhKSB7Ci0gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkRldmljZVJlc291cmNlRGVzY3JpcHRvciNjcmVhdGUob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVJlc291cmNlKERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBkZXNjcmlwdG9yIGlzIGFuIGV4aXN0aW5nIGZvbnQsIHRoZW4gd2UgY2FuIHJldHVybiB0aGUgb3JpZ2luYWwgZm9udAotICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSBzYW1lIGRldmljZS4KLSAgICAgICAgaWYgKG9yaWdpbmFsSW1hZ2UgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IHdoYXQgZGV2aWNlIHRoZSBvcmlnaW5hbCB3YXMgYWxsb2NhdGVkIG9uLCB3ZSBjYW4ndCB0ZWxsIGlmIHdlCi0gICAgICAgICAgICAvLyBjYW4gcmV1c2UgdGhlIG9yaWdpbmFsIHVudGlsIHdlIHRyeSB0byBjcmVhdGUgYSBuZXcgb25lLgotICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbWFnZSByZXN1bHQgPSBjcmVhdGVJbWFnZShmYWxzZSwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERldmljZVJlc291cmNlRXhjZXB0aW9uKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBuZXcgZm9udCB3YXMgZXF1YWwgdG8gdGhlIG9yaWdpbmFsLCB0aGVuIGl0IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZAotICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBzYW1lIGRldmljZS4gCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lcXVhbHMob3JpZ2luYWxJbWFnZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2Ugbm93IGtub3cgdGhlIG9yaWdpbmFsIGRldmljZS4gV2UgY2FuIHJldXNlIHRoZSBvcmlnaW5hbCBpbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgLy8gZGlzY2FyZCB0aGUgdGVtcG9yYXJ5IEltYWdlLCBhbmQgcmVtZW1iZXIgdGhlIGRldmljZSBmb3IgdGhlIG5leHQgdGltZQotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGRlc2NyaXB0b3IgaXMgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxEZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEltYWdlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUaGUgbmV3bHkgY3JlYXRlZCBmb250IGVuZGVkIHVwIGJlaW5nIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCwgc28KLSAgICAgICAgICAgICAgICAvLyBpdCBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZCBvbiBhIGRpZmZlcmVudCBkZXZpY2UuIFJldHVybiB0aGUgbmV3IHZlcnNpb24uCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIAotICAgICAgICAgICAgLy8gSWYgd2UncmUgYWxsb2NhdGluZyBvbiB0aGUgc2FtZSBkZXZpY2UgYXMgdGhlIG9yaWdpbmFsIGZvbnQsIHJldHVybiB0aGUgb3JpZ2luYWwuCi0gICAgICAgICAgICBpZiAob3JpZ2luYWxEZXZpY2UgPT0gZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsSW1hZ2U7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVSZXNvdXJjZShkZXZpY2UpOwotICAgIH0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5EZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IjZGVzdHJveShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lSZXNvdXJjZShPYmplY3QgcHJldmlvdXNseUNyZWF0ZWRPYmplY3QpIHsKLSAgICAgICAgaWYgKHByZXZpb3VzbHlDcmVhdGVkT2JqZWN0ID09IG9yaWdpbmFsSW1hZ2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3VwZXIuZGVzdHJveVJlc291cmNlKHByZXZpb3VzbHlDcmVhdGVkT2JqZWN0KTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yI2dldEltYWdlRGF0YSgpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBPYmplY3QjaGFzaENvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZGF0YS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIE9iamVjdCNlcXVhbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBJbWFnZURhdGFJbWFnZURlc2NyaXB0b3IpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAKLSAgICAgICAgCi0gICAgICAgIEltYWdlRGF0YUltYWdlRGVzY3JpcHRvciBpbWdXcmFwID0gKEltYWdlRGF0YUltYWdlRGVzY3JpcHRvcikgb2JqOwotICAgICAgIAotICAgICAgICBpZiAob3JpZ2luYWxJbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW1nV3JhcC5vcmlnaW5hbEltYWdlID09IG9yaWdpbmFsSW1hZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAoaW1nV3JhcC5vcmlnaW5hbEltYWdlID09IG51bGwgJiYgZGF0YS5lcXVhbHMoaW1nV3JhcC5kYXRhKSk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvSW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9JbWFnZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4NmUwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9JbWFnZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBbiBpbWFnZSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCB0aGF0IGtub3dzIGhvdyB0byBjcmVhdGUKLSAqIGFuIFNXVCBpbWFnZS4gIEl0IGRvZXMgbm90IGhvbGQgb250byBpbWFnZXMgb3IgY2FjaGUgdGhlbSwKLSAqIGJ1dCByYXRoZXIganVzdCBjcmVhdGVzIHRoZW0gb24gZGVtYW5kLiAgQW4gaW1hZ2UgZGVzY3JpcHRvcgotICogaXMgaW50ZW5kZWQgdG8gYmUgYSBsaWdodHdlaWdodCByZXByZXNlbnRhdGlvbiBvZiBhbiBpbWFnZQotICogdGhhdCBjYW4gYmUgbWFuaXB1bGF0ZWQgZXZlbiB3aGVuIG5vIFNXVCBkaXNwbGF5IGV4aXN0cy4KLSAqIDxwPgotICogVGhpcyBwYWNrYWdlIGRlZmluZXMgYSBjb25jcmV0ZSBpbWFnZSBkZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uCi0gKiB3aGljaCByZWFkcyBhbiBpbWFnZSBmcm9tIGEgZmlsZSAoPGNvZGU+RmlsZUltYWdlRGVzY3JpcHRvcjwvY29kZT4pLgotICogSXQgYWxzbyBwcm92aWRlcyBhYnN0cmFjdCBmcmFtZXdvcmsgY2xhc3NlcyAodGhpcyBvbmUgYW5kCi0gKiA8Y29kZT5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I8L2NvZGU+KSB3aGljaCBtYXkgYmUgc3ViY2xhc3NlZCB0byBkZWZpbmUKLSAqIG5ld3Mga2luZHMgb2YgaW1hZ2UgZGVzY3JpcHRvcnMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFVzaW5nIHRoaXMgYWJzdHJhY3QgY2xhc3MgaW52b2x2ZXMgZGVmaW5pbmcgYSBjb25jcmV0ZSBzdWJjbGFzcwotICogYW5kIHByb3ZpZGluZyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIDxjb2RlPmdldEltYWdlRGF0YTwvY29kZT4KLSAqIG1ldGhvZC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGdldCBhbiBJbWFnZSBmcm9tIGFuIEltYWdlRGVzY3JpcHRvci4gVGhlIG1ldGhvZAotICogY3JlYXRlSW1hZ2Ugd2lsbCBhbHdheXMgcmV0dXJuIGEgbmV3IEltYWdlIHdoaWNoIG11c3QgYmUgZGlzcG9zZWQgYnkKLSAqIHRoZSBjYWxsZXIuIEFsdGVybmF0aXZlbHksIGNyZWF0ZVJlc291cmNlKCkgcmV0dXJucyBhIHNoYXJlZAotICogSW1hZ2UuIFdoZW4gdGhlIGNhbGxlciBpcyBkb25lIHdpdGggYW4gaW1hZ2Ugb2J0YWluZWQgZnJvbSBjcmVhdGVSZXNvdXJjZSwKLSAqIHRoZXkgbXVzdCBjYWxsIGRlc3Ryb3lSZXNvdXJjZSgpIHJhdGhlciB0aGFuIGRpc3Bvc2luZyB0aGUgSW1hZ2UgZGlyZWN0bHkuCi0gKiBUaGUgcmVzdWx0IG9mIGNyZWF0ZVJlc291cmNlKCkgY2FuIGJlIHNhZmVseSBjYXN0IHRvIGFuIEltYWdlLiAKLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgRGV2aWNlUmVzb3VyY2VEZXNjcmlwdG9yIHsKLQotICAgIC8qKiAKLSAgICAgKiBBIHNtYWxsIHJlZCBzcXVhcmUgdXNlZCB0byB3YXJuIHRoYXQgYW4gaW1hZ2UgY2Fubm90IGJlIGNyZWF0ZWQuCi0gICAgICogPHA+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbWFnZURhdGEgREVGQVVMVF9JTUFHRV9EQVRBID0gbmV3IEltYWdlRGF0YSg2LCA2LAotICAgICAgICAgICAgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7IG5ldyBSR0IoMjU1LCAwLCAwKSB9KSk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGltYWdlIGRlc2NyaXB0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvcigpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgaW1hZ2UgZGVzY3JpcHRvciBmcm9tIGEgZmlsZS4KLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yCi0gICAgICogPGNvZGU+bmV3IEZpbGVJbWFnZURlc2NyaXB0b3IobG9jYXRpb24sZmlsZW5hbWUpPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgY2xhc3Mgd2hvc2UgcmVzb3VyY2UgZGlyZWN0b3J5IGNvbnRhaW4gdGhlIGZpbGUKLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGUgbmFtZQotICAgICAqIEByZXR1cm4gYSBuZXcgaW1hZ2UgZGVzY3JpcHRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUZyb21GaWxlKENsYXNzIGxvY2F0aW9uLCBTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW1hZ2VEZXNjcmlwdG9yKGxvY2F0aW9uLCBmaWxlbmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgaW1hZ2UgZGVzY3JpcHRvciBnaXZlbiBJbWFnZURhdGEKLSAgICAgKiBkZXNjcmliaW5nIHRoZSBpbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xIAotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgY29udGVudHMgb2YgdGhlIGltYWdlCi0gICAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIGltYWdlIGRlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGVGcm9tSW1hZ2VEYXRhKEltYWdlRGF0YSBkYXRhKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW1hZ2VEYXRhSW1hZ2VEZXNjcmlwdG9yKGRhdGEpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBpbWFnZS4gTm90ZSAKLSAgICAgKiB0aGF0IGRpc3Bvc2luZyB0aGUgb3JpZ2luYWwgSW1hZ2Ugd2lsbCBjYXVzZSB0aGUgZGVzY3JpcHRvciB0byBiZWNvbWUgaW52YWxpZC4gIAotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIFBlcmZvcm1hbmNlIG5vdGU6IElmIHRoZSBkZXZpY2UgdGhhdCBjcmVhdGVkIHRoZSBJbWFnZSBpcyBrbm93biwgaXQgCi0gICAgICogaXMgbW9yZSBlZmZpY2llbnQgdG8gdXNlIGNyZWF0ZUZyb21JbWFnZShJbWFnZSwgRGV2aWNlKS4KLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGluIHRob3NlIHJhcmUgc2l0dWF0aW9ucyB3aGVyZQotICAgICAqIHRoZSBkZXZpY2UgaXMgdW5rbm93bi4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHNpbmNlIDMuMSAKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbWcgaW1hZ2UgdG8gY3JlYXRlCi0gICAgICogQHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgaW1hZ2UgZGVzY3JpcHRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUZyb21JbWFnZShJbWFnZSBpbWcpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbWFnZURhdGFJbWFnZURlc2NyaXB0b3IoaW1nKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBJbWFnZURlc2NyaXB0b3IgYmFzZWQgb24gdGhlIGdpdmVuIG9yaWdpbmFsIGRlc2NyaXB0b3IsIGJ1dCB3aXRoIGFkZGl0aW9uYWwKLSAgICAgKiBTV1QgZmxhZ3MuCi0gICAgICogIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGlzIHNvcnQgb2YgSW1hZ2VEZXNjcmlwdG9yIGlzIHNsb3dlciBhbmQgY29uc3VtZXMgbW9yZSByZXNvdXJjZXMgdGhhbgotICAgICAqIGEgcmVndWxhciBpbWFnZSBkZXNjcmlwdG9yLiBJdCB3aWxsIGFsc28gbmV2ZXIgZ2VuZXJhdGUgcmVzdWx0cyB0aGF0IGxvb2sgYXMgbmljZSBhcwotICAgICAqIGEgaGFuZC1kcmF3biBpbWFnZS4gQ2xpZW50cyBhcmUgZW5jb3VyYWdlZCB0byBzdXBwbHkgdGhlaXIgb3duIGRpc2FibGVkL2dyYXllZC9ldGMuIGltYWdlcwotICAgICAqIHJhdGhlciB0aGFuIHVzaW5nIGEgZGVmYXVsdCBpbWFnZSBhbmQgdHJhbnNmb3JtaW5nIGl0LgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3JpZ2luYWxJbWFnZSBpbWFnZSB0byB0cmFuc2Zvcm0KLSAgICAgKiBAcGFyYW0gc3d0RmxhZ3MgYW55IGZsYWcgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBmbGFncyBhcmd1bWVudCBvZiBJbWFnZSNJbWFnZShEZXZpY2UsIEltYWdlLCBpbnQpCi0gICAgICogQHJldHVybiBhbiBJbWFnZURlc2NyaXB0b3IgdGhhdCBjcmVhdGVzIG5ldyBpbWFnZXMgYnkgdHJhbnNmb3JtaW5nIHRoZSBnaXZlbiBpbWFnZSBkZXNjcmlwdG9yCi0gICAgICogCi0gICAgICogQHNlZSBJbWFnZSNJbWFnZShEZXZpY2UsIEltYWdlLCBpbnQpIAotICAgICAqIEBzaW5jZSAzLjEgCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGVXaXRoRmxhZ3MoSW1hZ2VEZXNjcmlwdG9yIG9yaWdpbmFsSW1hZ2UsIGludCBzd3RGbGFncykgewotICAgICAgICByZXR1cm4gbmV3IERlcml2ZWRJbWFnZURlc2NyaXB0b3Iob3JpZ2luYWxJbWFnZSwgc3d0RmxhZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIGltYWdlLiBUaGlzCi0gICAgICogbWV0aG9kIHRha2VzIHRoZSBEZXZpY2UgdGhhdCBjcmVhdGVkIHRoZSBJbWFnZSBhcyBhbiBhcmd1bWVudCwgYWxsb3dpbmcKLSAgICAgKiB0aGUgb3JpZ2luYWwgSW1hZ2UgdG8gYmUgcmV1c2VkIGlmIHRoZSBkZXNjcmlwdG9yIGlzIGFza2VkIGZvciBhbm90aGVyCi0gICAgICogSW1hZ2Ugb24gdGhlIHNhbWUgZGV2aWNlLiBOb3RlIHRoYXQgZGlzcG9zaW5nIHRoZSBvcmlnaW5hbCBJbWFnZSB3aWxsIAotICAgICAqIGNhdXNlIHRoZSBkZXNjcmlwdG9yIHRvIGJlY29tZSBpbnZhbGlkLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEgCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW1nIGltYWdlIHRvIGNyZWF0ZQotICAgICAqIEBwYXJhbSB0aGVEZXZpY2UgdGhlIGRldmljZSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgSW1hZ2UKLSAgICAgKiBAcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBpbWFnZSBkZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlRnJvbUltYWdlKEltYWdlIGltZywgRGV2aWNlIHRoZURldmljZSkgewotICAgICAgICByZXR1cm4gbmV3IEltYWdlRGF0YUltYWdlRGVzY3JpcHRvcihpbWcsIHRoZURldmljZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgaW1hZ2UgZGVzY3JpcHRvciBmcm9tIGEgVVJMLgotICAgICAqCi0gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBpbWFnZSBmaWxlLgotICAgICAqIEByZXR1cm4gYSBuZXcgaW1hZ2UgZGVzY3JpcHRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUZyb21VUkwoVVJMIHVybCkgewotICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBVUkxJbWFnZURlc2NyaXB0b3IodXJsKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5EZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVJlc291cmNlKERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEltYWdlIHJlc3VsdCA9IGNyZWF0ZUltYWdlKGZhbHNlLCBkZXZpY2UpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbih0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5EZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IjZGVzdHJveVJlc291cmNlKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95UmVzb3VyY2UoT2JqZWN0IHByZXZpb3VzbHlDcmVhdGVkT2JqZWN0KSB7Ci0gICAgICAgICgoSW1hZ2UpcHJldmlvdXNseUNyZWF0ZWRPYmplY3QpLmRpc3Bvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBTV1QgaW1hZ2UgZm9yIHRoaXMgaW1hZ2UgZGVzY3JpcHRvci4gTm90ZSB0aGF0Ci0JICogZWFjaCBjYWxsIHJldHVybnMgYSBuZXcgU1dUIGltYWdlIG9iamVjdC4gVGhlIHJldHVybmVkIGltYWdlIG11c3QgYmUKLQkgKiBleHBsaWNpdGx5IGRpc3Bvc2VkIHVzaW5nIHRoZSBpbWFnZSdzIGRpc3Bvc2UgY2FsbC4gVGhlIGltYWdlIHdpbGwgbm90IGJlCi0JICogYXV0b21hdGljYWxseSBnYXJiYWdlIGNvbGxlY3RlZC4gQSBkZWZhdWx0IGltYWdlIGlzIHJldHVybmVkIGluIHRoZSBldmVudAotCSAqIG9mIGFuIGVycm9yLgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBjcmVhdGVSZXNvdXJjZShEZXZpY2UpIGluIHRoYXQgdGhlIHJldHVybmVkIGltYWdlCi0gICAgICogbXVzdCBiZSBkaXNwb3NlZCBkaXJlY3RseSwgd2hlcmVhcyBhbiBpbWFnZSBvYnRhaW5lZCBmcm9tIGNyZWF0ZVJlc291cmNlKC4uLikKLSAgICAgKiBtdXN0IGJlIGRpc3Bvc2VkIGJ5IGNhbGxpbmcgZGVzdHJveVJlc291cmNlKC4uLikuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byAKLSAgICAgKiBtaXgtYW5kLW1hdGNoLiBJZiB5b3Ugb2J0YWluZWQgdGhlIEltYWdlIGZyb20gdGhpcyBtZXRob2QsIHlvdSBtdXN0IG5vdCBkaXNwb3NlCi0gICAgICogaXQgYnkgY2FsbGluZyBkZXN0cm95UmVzb3VyY2UuIENsaWVudHMgYXJlIGVuY291cmFnZWQgdG8gdXNlIAotICAgICAqIGNyZWF0ZS9kZXN0cm95UmVzb3VyY2UgYW5kIGRvd25jYXN0IHRoZSByZXN1bHQgdG8gSW1hZ2UgcmF0aGVyIHRoYW4gdXNpbmcgCi0gICAgICogY3JlYXRlSW1hZ2UuCi0gICAgICogPC9wPgotICAgICAqIAotCSAqIDxwPgotCSAqIE5vdGU6IGl0IGlzIHN0aWxsIHBvc3NpYmxlIGZvciB0aGlzIG1ldGhvZCB0byByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpbiBleHRyZW1lIGNhc2VzLCBmb3IgZXhhbXBsZSBpZiBTV1QgcnVucyBvdXQgb2YgaW1hZ2UgaGFuZGxlcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBpbWFnZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW1hZ2UgY291bGQgbm90IGJlCi0JICogICAgICAgICBjcmVhdGVkCi0JICovCi0gICAgcHVibGljIEltYWdlIGNyZWF0ZUltYWdlKCkgewotICAgICAgICByZXR1cm4gY3JlYXRlSW1hZ2UodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBTV1QgaW1hZ2UgZm9yIHRoaXMgaW1hZ2UgZGVzY3JpcHRvci4gVGhlCi0JICogcmV0dXJuZWQgaW1hZ2UgbXVzdCBiZSBleHBsaWNpdGx5IGRpc3Bvc2VkIHVzaW5nIHRoZSBpbWFnZSdzIGRpc3Bvc2UKLQkgKiBjYWxsLiBUaGUgaW1hZ2Ugd2lsbCBub3QgYmUgYXV0b21hdGljYWxseSBnYXJiYWdlIGNvbGxlY3RlZC4gSW4gdGhlIGV2ZW50Ci0JICogb2YgYW4gZXJyb3IsIGEgZGVmYXVsdCBpbWFnZSBpcyByZXR1cm5lZCBpZgotCSAqIDxjb2RlPnJldHVybk1pc3NpbmdJbWFnZU9uRXJyb3I8L2NvZGU+IGlzIHRydWUsIG90aGVyd2lzZQotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqIDxwPgotCSAqIE5vdGU6IEV2ZW4gaWYgPGNvZGU+cmV0dXJuTWlzc2luZ0ltYWdlT25FcnJvcjwvY29kZT4gaXMgdHJ1ZSwgaXQgaXMKLQkgKiBzdGlsbCBwb3NzaWJsZSBmb3IgdGhpcyBtZXRob2QgdG8gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGluIGV4dHJlbWUKLQkgKiBjYXNlcywgZm9yIGV4YW1wbGUgaWYgU1dUIHJ1bnMgb3V0IG9mIGltYWdlIGhhbmRsZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSByZXR1cm5NaXNzaW5nSW1hZ2VPbkVycm9yCi0JICogICAgICAgICAgICBmbGFnIHRoYXQgZGV0ZXJtaW5lcyBpZiBhIGRlZmF1bHQgaW1hZ2UgaXMgcmV0dXJuZWQgb24gZXJyb3IKLQkgKiBAcmV0dXJuIGEgbmV3IGltYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbWFnZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGNyZWF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgSW1hZ2UgY3JlYXRlSW1hZ2UoYm9vbGVhbiByZXR1cm5NaXNzaW5nSW1hZ2VPbkVycm9yKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJbWFnZShyZXR1cm5NaXNzaW5nSW1hZ2VPbkVycm9yLCBEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBTV1QgaW1hZ2UgZm9yIHRoaXMgaW1hZ2UgZGVzY3JpcHRvci4gVGhlCi0JICogcmV0dXJuZWQgaW1hZ2UgbXVzdCBiZSBleHBsaWNpdGx5IGRpc3Bvc2VkIHVzaW5nIHRoZSBpbWFnZSdzIGRpc3Bvc2UKLQkgKiBjYWxsLiBUaGUgaW1hZ2Ugd2lsbCBub3QgYmUgYXV0b21hdGljYWxseSBnYXJiYWdlIGNvbGxlY3RlZC4gQSBkZWZhdWx0Ci0JICogaW1hZ2UgaXMgcmV0dXJuZWQgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLgotCSAqIDxwPgotCSAqIE5vdGU6IGl0IGlzIHN0aWxsIHBvc3NpYmxlIGZvciB0aGlzIG1ldGhvZCB0byByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpbiBleHRyZW1lIGNhc2VzLCBmb3IgZXhhbXBsZSBpZiBTV1QgcnVucyBvdXQgb2YgaW1hZ2UgaGFuZGxlcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRldmljZQotCSAqICAgICAgICAgICAgdGhlIGRldmljZSBvbiB3aGljaCB0byBjcmVhdGUgdGhlIGltYWdlCi0JICogQHJldHVybiBhIG5ldyBpbWFnZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW1hZ2UgY291bGQgbm90IGJlCi0JICogICAgICAgICBjcmVhdGVkCi0JICogQHNpbmNlIDIuMAotCSAqLwotICAgIHB1YmxpYyBJbWFnZSBjcmVhdGVJbWFnZShEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJbWFnZSh0cnVlLCBkZXZpY2UpOwotICAgIH0KLQotICAgIC8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgU1dUIGltYWdlIGZvciB0aGlzIGltYWdlIGRlc2NyaXB0b3IuIFRoZQotCSAqIHJldHVybmVkIGltYWdlIG11c3QgYmUgZXhwbGljaXRseSBkaXNwb3NlZCB1c2luZyB0aGUgaW1hZ2UncyBkaXNwb3NlCi0JICogY2FsbC4gVGhlIGltYWdlIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkgZ2FyYmFnZSBjb2xsZWN0ZWQuIEluIHRoZSBldmVuCi0JICogb2YgYW4gZXJyb3IsIGEgZGVmYXVsdCBpbWFnZSBpcyByZXR1cm5lZCBpZgotCSAqIDxjb2RlPnJldHVybk1pc3NpbmdJbWFnZU9uRXJyb3I8L2NvZGU+IGlzIHRydWUsIG90aGVyd2lzZQotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqIDxwPgotCSAqIE5vdGU6IEV2ZW4gaWYgPGNvZGU+cmV0dXJuTWlzc2luZ0ltYWdlT25FcnJvcjwvY29kZT4gaXMgdHJ1ZSwgaXQgaXMKLQkgKiBzdGlsbCBwb3NzaWJsZSBmb3IgdGhpcyBtZXRob2QgdG8gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGluIGV4dHJlbWUKLQkgKiBjYXNlcywgZm9yIGV4YW1wbGUgaWYgU1dUIHJ1bnMgb3V0IG9mIGltYWdlIGhhbmRsZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSByZXR1cm5NaXNzaW5nSW1hZ2VPbkVycm9yCi0JICogICAgICAgICAgICBmbGFnIHRoYXQgZGV0ZXJtaW5lcyBpZiBhIGRlZmF1bHQgaW1hZ2UgaXMgcmV0dXJuZWQgb24gZXJyb3IKLQkgKiBAcGFyYW0gZGV2aWNlCi0JICogICAgICAgICAgICB0aGUgZGV2aWNlIG9uIHdoaWNoIHRvIGNyZWF0ZSB0aGUgaW1hZ2UKLQkgKiBAcmV0dXJuIGEgbmV3IGltYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbWFnZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGNyZWF0ZWQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0gICAgcHVibGljIEltYWdlIGNyZWF0ZUltYWdlKGJvb2xlYW4gcmV0dXJuTWlzc2luZ0ltYWdlT25FcnJvciwgRGV2aWNlIGRldmljZSkgewotCi0gICAgICAgIEltYWdlRGF0YSBkYXRhID0gZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghcmV0dXJuTWlzc2luZ0ltYWdlT25FcnJvcikgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGF0YSA9IERFRkFVTFRfSU1BR0VfREFUQTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRyeSB0byBjcmVhdGUgdGhlIHN1cHBsaWVkIGltYWdlLiBJZiB0aGVyZSBpcyBhbiBTV1QgRXhjZXB0aW9uIHRyeSBhbmQgY3JlYXRlCi0gICAgICAgICAqIHRoZSBkZWZhdWx0IGltYWdlIGlmIHRoYXQgd2FzIHJlcXVlc3RlZC4gUmV0dXJuIG51bGwgaWYgdGhpcyBmYWlscy4KLSAgICAgICAgICovCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChkYXRhLnRyYW5zcGFyZW50UGl4ZWwgPj0gMCkgewotICAgICAgICAgICAgICAgIEltYWdlRGF0YSBtYXNrRGF0YSA9IGRhdGEuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW1hZ2UoZGV2aWNlLCBkYXRhLCBtYXNrRGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEltYWdlKGRldmljZSwgZGF0YSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgIGlmIChyZXR1cm5NaXNzaW5nSW1hZ2VPbkVycm9yKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZShkZXZpY2UsIERFRkFVTFRfSU1BR0VfREFUQSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1dURXhjZXB0aW9uIG5leHRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IFNXVCA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IG9iamVjdAotICAgICAqIGZvciB0aGlzIGltYWdlIGRlc2NyaXB0b3IuCi0gICAgICogTm90ZSB0aGF0IGVhY2ggY2FsbCByZXR1cm5zIGEgbmV3IFNXVCBpbWFnZSBkYXRhIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZyYW1ld29yayBtZXRob2QgaXMgZGVjbGFyZWQgcHVibGljIHNvIHRoYXQgaXQgaXMKLSAgICAgKiBwb3NzaWJsZSB0byByZXF1ZXN0IGFuIGltYWdlIGRlc2NyaXB0b3IncyBpbWFnZSBkYXRhIHdpdGhvdXQKLSAgICAgKiBjcmVhdGluZyBhbiBTV1QgaW1hZ2Ugb2JqZWN0LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbWFnZSBkYXRhIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBuZXcgaW1hZ2UgZGF0YSBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBJbWFnZURhdGEgZ2V0SW1hZ2VEYXRhKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW1hZ2UgZGVzY3JpcHRvciBmb3IgYSBtaXNzaW5nIGltYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIE1pc3NpbmdJbWFnZURlc2NyaXB0b3IuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9JbWFnZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9JbWFnZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNzllMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvSW1hZ2VSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBTdGV2ZW4gS2V0Y2hhbSAoc2tldGNoYW1AZHNpY2RpLmNvbSkgLSBCdWcgNDI0NTEKLSAqICAgICBbRGlhbG9nc10gSW1hZ2VSZWdpc3RyeSB0aHJvd3MgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBpbgotICogICAgIGFwcGxpY2F0aW9uIHdpdGggbXVsdGlwbGUgRGlzcGxheSdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEFuIGltYWdlIHJlZ2lzdHJ5IG1haW50YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2xpYyBpbWFnZSBuYW1lcyAKLSAqIGFuZCBTV1QgaW1hZ2Ugb2JqZWN0cyBvciBzcGVjaWFsIGltYWdlIGRlc2NyaXB0b3Igb2JqZWN0cyB3aGljaAotICogZGVmZXIgdGhlIGNyZWF0aW9uIG9mIFNXVCBpbWFnZSBvYmplY3RzIHVudGlsIHRoZXkgYXJlIG5lZWRlZC4KLSAqIDxwPgotICogQW4gaW1hZ2UgcmVnaXN0cnkgb3ducyBhbGwgb2YgdGhlIGltYWdlIG9iamVjdHMgcmVnaXN0ZXJlZAotICogd2l0aCBpdCwgYW5kIGF1dG9tYXRpY2FsbHkgZGlzcG9zZXMgb2YgdGhlbSB3aGVuIHRoZSBTV1QgRGlzcGxheQotICogdGhhdCBjcmVhdGVzIHRoZSBpbWFnZXMgaXMgZGlzcG9zZWQuIEJlY2F1c2Ugb2YgdGhpcywgY2xpZW50cyBkbyBub3QgCi0gKiBuZWVkIHRvIChpbmRlZWQsIG11c3Qgbm90IGF0dGVtcHQgdG8pIGRpc3Bvc2Ugb2YgdGhlc2UgaW1hZ2VzIHRoZW1zZWx2ZXMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgKGl0IHdhcyBub3QgZGVzaWduZWQgdG8gYmUgc3ViY2xhc3NlZCkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFVubGlrZSB0aGUgRm9udFJlZ2lzdHJ5LCBpdCBpcyBhbiBlcnJvciB0byByZXBsYWNlIGltYWdlcy4gQXMgYSByZXN1bHQKLSAqIHRoZXJlIGFyZSBubyBldmVudHMgdGhhdCBmaXJlIHdoZW4gdmFsdWVzIGFyZSBjaGFuZ2VkIGluIHRoZSByZWdpc3RyeQotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VSZWdpc3RyeSB7Ci0gICAgLyoqCi0gICAgICogZGlzcGxheSB1c2VkIHdoZW4gZ2V0dGluZyBpbWFnZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheTsKLQotICAgIHByaXZhdGUgUmVzb3VyY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIE1hcCB0YWJsZTsKLSAgICAKLSAgICBwcml2YXRlIFJ1bm5hYmxlIGRpc3Bvc2VSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb250YWlucyB0aGUgZGF0YSBmb3IgYW4gZW50cnkgaW4gdGhlIHJlZ2lzdHJ5LiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRyeSB7Ci0gICAgICAgIHByb3RlY3RlZCBJbWFnZSBpbWFnZTsKLQotICAgICAgICBwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE9yaWdpbmFsSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBJbWFnZSBvcmlnaW5hbDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgcmVmQ291bnQgPSAwOwotICAgICAgICBwcml2YXRlIERldmljZSBvcmlnaW5hbERpc3BsYXk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT3JpZ2luYWxJbWFnZURlc2NyaXB0b3IoSW1hZ2Ugb3JpZ2luYWwsIERldmljZSBvcmlnaW5hbERpc3BsYXkpIHsKLSAgICAgICAgICAgIHRoaXMub3JpZ2luYWwgPSBvcmlnaW5hbDsKLSAgICAgICAgICAgIHRoaXMub3JpZ2luYWxEaXNwbGF5ID0gb3JpZ2luYWxEaXNwbGF5OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVJlc291cmNlKERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlID09IG9yaWdpbmFsRGlzcGxheSkgewotICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZVJlc291cmNlKGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lSZXNvdXJjZShPYmplY3QgdG9EaXNwb3NlKSB7Ci0gICAgICAgICAgICBpZiAob3JpZ2luYWwgPT0gdG9EaXNwb3NlKSB7Ci0gICAgICAgICAgICAgICAgcmVmQ291bnQtLTsKLSAgICAgICAgICAgICAgICBpZiAocmVmQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1cGVyLmRlc3Ryb3lSZXNvdXJjZSh0b0Rpc3Bvc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvciNnZXRJbWFnZURhdGEoKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgaW1hZ2UgcmVnaXN0cnkuCi0gICAgICogPHA+Ci0gICAgICogVGhlcmUgbXVzdCBiZSBhbiBTV1QgRGlzcGxheSBjcmVhdGVkIGluIHRoZSBjdXJyZW50IAotICAgICAqIHRocmVhZCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIEltYWdlUmVnaXN0cnkoKSB7Ci0gICAgICAgIHRoaXMoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgaW1hZ2UgcmVnaXN0cnkgdXNpbmcgdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgdG8gYWxsb2NhdGUgaW1hZ2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHVzZWQgdG8gYWxsb2NhdGUgaW1hZ2VzCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZVJlZ2lzdHJ5KFJlc291cmNlTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwobWFuYWdlcik7Ci0gICAgICAgIERldmljZSBkZXYgPSBtYW5hZ2VyLmdldERldmljZSgpOwotICAgICAgICBpZiAoZGV2IGluc3RhbmNlb2YgRGlzcGxheSkgewotICAgICAgICAgICAgdGhpcy5kaXNwbGF5ID0gKERpc3BsYXkpZGV2OwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgIG1hbmFnZXIuZGlzcG9zZUV4ZWMoZGlzcG9zZVJ1bm5hYmxlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBpbWFnZSByZWdpc3RyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGlzcGxheSB0aGlzIDxjb2RlPkRpc3BsYXk8L2NvZGU+IG11c3Qgbm90IGJlIAotICAgICAqICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBhbmQgbXVzdCBub3QgYmUgZGlzcG9zZWQgaW4gb3JkZXIKLSAgICAgKiAgICAgICAgdG8gdXNlIHRoaXMgcmVnaXN0cnkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VSZWdpc3RyeShEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAgICAgdGhpcyhKRmFjZVJlc291cmNlcy5nZXRSZXNvdXJjZXMoZGlzcGxheSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBpbiB0aGlzIHJlZ2lzdHJ5LCAKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgICAqIEByZXR1cm4gdGhlIGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldChTdHJpbmcga2V5KSB7Ci0KLSAgICAgICAgLy8gY2FuIGJlIG51bGwKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGRpc3BsYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBOT1RFLCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdGhlIGZvbGxvd2luZyBpbWFnZXMgYXJlIHN1cHBvcnRlZAotICAgICAgICAgICAgICogaGVyZSwgdGhleSBzaG91bGQgbmV2ZXIgYmUgZGlzcG9zZWQsIGhlbmNlIHdlIGV4cGxpY2l0bHkgcmV0dXJuIHRoZW0gCi0gICAgICAgICAgICAgKiByYXRoZXIgdGhlbiByZWdpc3RlcmluZyBpbWFnZXMgdGhhdCBTV1Qgd2lsbCBkaXNwb3NlLiAgCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEFwcGxpY2F0aW9ucyBzaG91bGQgZ28gZGlyZWNsdHkgdG8gU1dUIGZvciB0aGVzZSBpY29ucy4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogQHNlZSBEaXNwbGF5LmdldFN5c3RlbUljb24oaW50IElEKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpbnQgc3d0S2V5ID0gLTE7Ci0gICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhEaWFsb2cuRExHX0lNR19JTkZPKSkgewotICAgICAgICAgICAgICAgIHN3dEtleSA9IFNXVC5JQ09OX0lORk9STUFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoRGlhbG9nLkRMR19JTUdfUVVFU1RJT04pKSB7Ci0gICAgICAgICAgICAgICAgc3d0S2V5ID0gU1dULklDT05fUVVFU1RJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhEaWFsb2cuRExHX0lNR19XQVJOSU5HKSkgewotICAgICAgICAgICAgICAgIHN3dEtleSA9IFNXVC5JQ09OX1dBUk5JTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhEaWFsb2cuRExHX0lNR19FUlJPUikpIHsKLSAgICAgICAgICAgICAgICBzd3RLZXkgPSBTV1QuSUNPTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIHdlIGFjdHVhbGx5IGp1c3Qgd2FudCB0byByZXR1cm4gYW4gU1dUIGltYWdlIGRvIHNvIHdpdGhvdXQKLSAgICAgICAgICAgIC8vIGxvb2tpbmcgaW4gdGhlIHJlZ2lzdHJ5Ci0gICAgICAgICAgICBpZiAoc3d0S2V5ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSW1hZ2VbXSBpbWFnZSA9IG5ldyBJbWFnZVsxXTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBzd3RLZXk7Ci0gICAgICAgICAgICAgICAgZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlWzBdID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShpZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW1hZ2VbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFbnRyeSBlbnRyeSA9IGdldEVudHJ5KGtleSk7Ci0gICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGVudHJ5LmltYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIGVudHJ5LmltYWdlID0gbWFuYWdlci5jcmVhdGVJbWFnZVdpdGhEZWZhdWx0KGVudHJ5LmRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZW50cnkuaW1hZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBpbiB0aGlzIHJlZ2lzdHJ5LCAKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotICAgICAgICBFbnRyeSBlbnRyeSA9IGdldEVudHJ5KGtleSk7Ci0gICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGVudHJ5LmRlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyAob3IgcmVwbGFjZXMpIGFuIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhpcyByZWdpc3RyeS4gVGhlIGZpcnN0IHRpbWUKLSAgICAgKiB0aGlzIG5ldyBlbnRyeSBpcyByZXRyaWV2ZWQsIHRoZSBpbWFnZSBkZXNjcmlwdG9yJ3MgaW1hZ2Ugd2lsbCBiZSBjb21wdXRlZCAKLSAgICAgKiAodmlhIDwvY29kZT5JbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2U8L2NvZGU+KSBhbmQgcmVtZW1iZXJlZC4gCi0gICAgICogVGhpcyBtZXRob2QgcmVwbGFjZXMgYW4gZXhpc3RpbmcgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlIAotICAgICAqIGdpdmVuIGtleSwgYnV0IGZhaWxzIGlmIHRoZXJlIGlzIGEgcmVhbCBpbWFnZSBhc3NvY2lhdGVkIHdpdGggaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgSW1hZ2VEZXNjcmlwdG9yCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcga2V5LCBJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBFbnRyeSBlbnRyeSA9IGdldEVudHJ5KGtleSk7Ci0gICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlbnRyeSA9IG5ldyBFbnRyeSgpOwotICAgICAgICAgICAgZ2V0VGFibGUoKS5wdXQoa2V5LCBlbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChlbnRyeS5pbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiSW1hZ2VSZWdpc3RyeSBrZXkgYWxyZWFkeSBpbiB1c2U6ICIgKyBrZXkpOyAvLyROT04tTkxTLTEkICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGVudHJ5LmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gaW1hZ2UgdG8gdGhpcyByZWdpc3RyeS4gIFRoaXMgbWV0aG9kIGZhaWxzIGlmIHRoZXJlCi0gICAgICogaXMgYWxyZWFkeSBhbiBpbWFnZSBvciBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4ga2V5LgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCBhbiBpbWFnZSByZWdpc3RyeSBvd25zIGFsbCBvZiB0aGUgaW1hZ2Ugb2JqZWN0cyByZWdpc3RlcmVkCi0gICAgICogd2l0aCBpdCwgYW5kIGF1dG9tYXRpY2FsbHkgZGlzcG9zZXMgb2YgdGhlbSB3aGVuIHRoZSBTV1QgRGlzcGxheSBpcyBkaXNwb3NlZC4gCi0gICAgICogQmVjYXVzZSBvZiB0aGlzLCBjbGllbnRzIG11c3Qgbm90IHJlZ2lzdGVyIGFuIGltYWdlIG9iamVjdAotICAgICAqIHRoYXQgaXMgbWFuYWdlZCBieSBhbm90aGVyIG9iamVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcga2V5LCBJbWFnZSBpbWFnZSkgewotICAgICAgICBFbnRyeSBlbnRyeSA9IGdldEVudHJ5KGtleSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewotICAgICAgICAgICAgZW50cnkgPSBuZXcgRW50cnkoKTsKLSAgICAgICAgICAgIHB1dEVudHJ5KGtleSwgZW50cnkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZW50cnkuaW1hZ2UgIT0gbnVsbCB8fCBlbnRyeS5kZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJJbWFnZVJlZ2lzdHJ5IGtleSBhbHJlYWR5IGluIHVzZTogIiArIGtleSk7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZW50cnkuaW1hZ2UgPSBpbWFnZTsKLSAgICAgICAgZW50cnkuZGVzY3JpcHRvciA9IG5ldyBPcmlnaW5hbEltYWdlRGVzY3JpcHRvcihpbWFnZSwgbWFuYWdlci5nZXREZXZpY2UoKSk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFuYWdlci5jcmVhdGUoZW50cnkuZGVzY3JpcHRvcik7Ci0gICAgICAgIH0gY2F0Y2ggKERldmljZVJlc291cmNlRXhjZXB0aW9uIGUpIHsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW4gaW1hZ2UgZnJvbSB0aGlzIHJlZ2lzdHJ5LiAgCi0gICAgICogSWYgYW4gU1dUIGltYWdlIHdhcyBhbGxvY2F0ZWQsIGl0IGlzIGRpc3Bvc2VkLgotICAgICAqIFRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QgaWYgdGhlcmUgaXMgbm8gaW1hZ2Ugb3IgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIGtleS4KLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGtleSkgewotICAgICAgICBJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3Ioa2V5KTsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbWFuYWdlci5kZXN0cm95KGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgZ2V0VGFibGUoKS5yZW1vdmUoa2V5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRW50cnkgZ2V0RW50cnkoU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4gKEVudHJ5KSBnZXRUYWJsZSgpLmdldChrZXkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwdXRFbnRyeShTdHJpbmcga2V5LCBFbnRyeSBlbnRyeSkgewotICAgICAgICBnZXRUYWJsZSgpLnB1dChrZXksIGVudHJ5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcCBnZXRUYWJsZSgpIHsKLSAgICAgICAgaWYgKHRhYmxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRhYmxlID0gbmV3IEhhc2hNYXAoMTApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0YWJsZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGlzcG9zZXMgdGhpcyBpbWFnZSByZWdpc3RyeSwgZGlzcG9zaW5nIGFueSBpbWFnZXMKLSAgICAgKiB0aGF0IHdlcmUgYWxsb2NhdGVkIGZvciBpdCwgYW5kIGNsZWFyaW5nIGl0cyBlbnRyaWVzLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBtYW5hZ2VyLmNhbmNlbERpc3Bvc2VFeGVjKGRpc3Bvc2VSdW5uYWJsZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAodGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChlbnRyeS5pbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZGVzdHJveUltYWdlKGVudHJ5LmRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhYmxlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBkaXNwbGF5ID0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9KRmFjZUNvbG9ycy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvSkZhY2VDb2xvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxNmFiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9KRmFjZUNvbG9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSkZhY2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogSkZhY2VDb2xvcnMgaXMgdGhlIGNsYXNzIHRoYXQgc3RvcmVzIHJlZmVyZW5jZXMKLSAqIHRvIGFsbCBvZiB0aGUgY29sb3JzIHVzZWQgYnkgSkZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRmFjZUNvbG9ycyB7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIENvbG9yIHVzZWQgZm9yIGJhbm5lciBiYWNrZ3JvdW5kcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sb3IgZ2V0QmFubmVyQmFja2dyb3VuZChEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAgICAgcmV0dXJuIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBDb2xvciB1c2VkIGZvciBiYW5uZXIgZm9yZWdyb3VuZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbG9yIGdldEJhbm5lckZvcmVncm91bmQoRGlzcGxheSBkaXNwbGF5KSB7Ci0gICAgICAgIHJldHVybiBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYmFja2dyb3VuZCBDb2xvciBmb3Igd2lkZ2V0cyB0aGF0Ci0gICAgICogZGlzcGxheSBlcnJvcnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb2xvciBnZXRFcnJvckJhY2tncm91bmQoRGlzcGxheSBkaXNwbGF5KSB7Ci0gICAgICAgIHJldHVybiBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBib3JkZXIgQ29sb3IgZm9yIHdpZGdldHMgdGhhdAotICAgICAqIGRpc3BsYXkgZXJyb3JzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sb3IgZ2V0RXJyb3JCb3JkZXIoRGlzcGxheSBkaXNwbGF5KSB7Ci0gICAgICAgIHJldHVybiBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGVmYXVsdCBjb2xvciB0byB1c2UgZm9yIGRpc3BsYXlpbmcgZXJyb3JzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sb3IgZ2V0RXJyb3JUZXh0KERpc3BsYXkgZGlzcGxheSkgewotICAgICAgICByZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0Q29sb3JSZWdpc3RyeSgpLmdldCgKLSAgICAgICAgICAgICAgICBKRmFjZVByZWZlcmVuY2VzLkVSUk9SX0NPTE9SKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRlZmF1bHQgY29sb3IgdG8gdXNlIGZvciBkaXNwbGF5aW5nIGh5cGVybGlua3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb2xvciBnZXRIeXBlcmxpbmtUZXh0KERpc3BsYXkgZGlzcGxheSkgewotICAgICAgICByZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0Q29sb3JSZWdpc3RyeSgpLmdldCgKLSAgICAgICAgICAgICAgICBKRmFjZVByZWZlcmVuY2VzLkhZUEVSTElOS19DT0xPUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkZWZhdWx0IGNvbG9yIHRvIHVzZSBmb3IgZGlzcGxheWluZyBhY3RpdmUgaHlwZXJsaW5rcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbG9yIGdldEFjdGl2ZUh5cGVybGlua1RleHQoRGlzcGxheSBkaXNwbGF5KSB7Ci0gICAgICAgIHJldHVybiBKRmFjZVJlc291cmNlcy5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0KAotICAgICAgICAgICAgICAgIEpGYWNlUHJlZmVyZW5jZXMuQUNUSVZFX0hZUEVSTElOS19DT0xPUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgb3V0IHRoZSBjYWNoZWQgY29sb3IgZm9yIG5hbWUuIFRoaXMgaXMgZ2VuZXJhbGx5Ci0gICAgICogZG9uZSB3aGVuIHRoZSBjb2xvciBwcmVmZXJlbmNlcyBjaGFuZ2VkIGFuZCBhbnkgY2FjaGVkIGNvbG9ycwotICAgICAqIG1heSBiZSBkaXNwb3NlZC4gVXNlcnMgb2YgdGhlIGNvbG9ycyBpbiB0aGlzIGNsYXNzIHNob3VsZCBhZGQgYSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotICAgICAqIHRvIGRldGVjdCB3aGVuIGFueSBvZiB0aGVzZSBjb2xvcnMgY2hhbmdlLgotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIEpGYWNlQ29sb3JzIG5vIGxvbmdlciBtYWludGFpbnMgYSBjYWNoZSBvZiBjb2xvcnMuICBUaGlzIGpvYiAKLSAgICAgKiBpcyBub3cgaGFuZGxlZCBieSB0aGUgQ29sb3JSZWdpc3RyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJDb2xvcihTdHJpbmcgY29sb3JOYW1lKSB7Ci0gICAgICAgIC8vbm8tb3AKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlIG9mIGFsbCBhbGxvY2F0ZWQgY29sb3JzLiBDYWxsZWQgb24gd29ya2JlbmNoCi0gICAgICogc2h1dGRvd24uCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgSkZhY2VDb2xvcnMgbm8gbG9uZ2VyIG1haW50YWlucyBhIGNhY2hlIG9mIGNvbG9ycy4gIFRoaXMgam9iIAotICAgICAqIGlzIG5vdyBoYW5kbGVkIGJ5IHRoZSBDb2xvclJlZ2lzdHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwb3NlQ29sb3JzKCkgewotICAgICAgICAvL25vLW9wCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycyBvZiB0aGUKLSAgICAgKiBjb250cm9sIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVzLiBJZiB0aGUgdmFsdWVzIGFyZQotICAgICAqIG51bGwgdGhhbiBpZ25vcmUgdGhlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9yZWdyb3VuZCBDb2xvcgotICAgICAqIEBwYXJhbSBiYWNrZ3JvdW5kIENvbG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbG9ycyhDb250cm9sIGNvbnRyb2wsIENvbG9yIGZvcmVncm91bmQsCi0gICAgICAgICAgICBDb2xvciBiYWNrZ3JvdW5kKSB7Ci0gICAgICAgIGlmIChmb3JlZ3JvdW5kICE9IG51bGwpCi0gICAgICAgICAgICBjb250cm9sLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0gICAgICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpCi0gICAgICAgICAgICBjb250cm9sLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9KRmFjZVJlc291cmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvSkZhY2VSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwNGNiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9KRmFjZVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZHMgdG8gYWNjZXNzIEpGYWNlLXNwZWNpZmljIHJlc291cmNlcy4KLSAqIDxwPgotICogQWxsIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhpcyBjbGFzcyBhcmUgc3RhdGljLiBUaGlzCi0gKiBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGdsb2JhbCBzdGF0ZSBpcyBhbHNvIG1haW50YWluZWQgYnkgdGhpcyBjbGFzczoKLSAqIDx1bD4KLSAqICAgPGxpPmEgZm9udCByZWdpc3RyeTwvbGk+Ci0gKgkgPGxpPmEgY29sb3IgcmVnaXN0cnk8L2xpPgotICogICA8bGk+YW4gaW1hZ2UgcmVnaXN0cnk8L2xpPgotICogICA8bGk+YSByZXNvdXJjZSBidW5kbGU8L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlUmVzb3VyY2VzIHsKLQotICAgIC8qKgotICAgICAqIE1hcCBvZiBEaXNwbGF5IG9udG8gRGV2aWNlUmVzb3VyY2VNYW5hZ2VyLiBIb2xkcyBhbGwgdGhlIHJlc291cmNlcyBmb3IgdGhlIGFzc29jaWF0ZWQgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgcmVnaXN0cmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHN5bWJvbGljIGZvbnQgbmFtZSBmb3IgdGhlIGJhbm5lciBmb250IAotICAgICAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuamZhY2UuYmFubmVyZm9udCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQU5ORVJfRk9OVCA9ICJvcmcuZWNsaXBzZS5qZmFjZS5iYW5uZXJmb250IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIEpGYWNlIHJlc291cmNlIGJ1bmRsZTsgZWFnZXJseSBpbml0aWFsaXplZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZQotICAgICAgICAgICAgLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuamZhY2UubWVzc2FnZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIEpGYWNlIGNvbG9yIHJlZ2lzdHJ5OyA8Y29kZT5udWxsPC9jb2RlPiB1bnRpbAotICAgICAqIGxhemlseSBpbml0aWFsaXplZCBvciBleHBsaWNpdGx5IHNldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDb2xvclJlZ2lzdHJ5IGNvbG9yUmVnaXN0cnk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3ltYm9saWMgZm9udCBuYW1lIGZvciB0aGUgc3RhbmRhcmQgZm9udCAKLSAgICAgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpmYWNlLmRlZmF1bHRmb250IjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRk9OVCA9ICJvcmcuZWNsaXBzZS5qZmFjZS5kZWZhdWx0Zm9udCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBzeW1ib2xpYyBmb250IG5hbWUgZm9yIHRoZSBkaWFsb2cgZm9udCAKLSAgICAgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ2ZvbnQiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0ZPTlQgPSAib3JnLmVjbGlwc2UuamZhY2UuZGlhbG9nZm9udCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBKRmFjZSBmb250IHJlZ2lzdHJ5OyA8Y29kZT5udWxsPC9jb2RlPiB1bnRpbAotICAgICAqIGxhemlseSBpbml0aWFsaXplZCBvciBleHBsaWNpdGx5IHNldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBGb250UmVnaXN0cnkgZm9udFJlZ2lzdHJ5ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBzeW1ib2xpYyBmb250IG5hbWUgZm9yIHRoZSBoZWFkZXIgZm9udCAKLSAgICAgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpmYWNlLmhlYWRlcmZvbnQiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0ZPTlQgPSAib3JnLmVjbGlwc2UuamZhY2UuaGVhZGVyZm9udCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBKRmFjZSBpbWFnZSByZWdpc3RyeTsgPGNvZGU+bnVsbDwvY29kZT4gdW50aWwKLSAgICAgKiBsYXppbHkgaW5pdGlhbGl6ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBzeW1ib2xpYyBmb250IG5hbWUgZm9yIHRoZSB0ZXh0IGZvbnQgCi0gICAgICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0ZPTlQgPSAib3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgc3ltYm9saWMgZm9udCBuYW1lIGZvciB0aGUgdmlld2VyIGZvbnQgCi0gICAgICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJmb250IjwvY29kZT4pLgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZm9udCBpcyBub3QgaW4gdXNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV0VSX0ZPTlQgPSAib3JnLmVjbGlwc2UuamZhY2Uudmlld2VyZm9udCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBzeW1ib2xpYyBmb250IG5hbWUgZm9yIHRoZSB3aW5kb3cgZm9udCAKLSAgICAgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpmYWNlLndpbmRvd2ZvbnQiPC9jb2RlPikuCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmb250IGlzIG5vdCBpbiB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5ET1dfRk9OVCA9ICJvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3dmb250IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbiBrZXkgaW4KLSAgICAgKiBKRmFjZSdzIHJlc291cmNlIGJ1bmRsZS4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHBhcmFtIGFyZ3MgdGhlIG1lc3NhZ2UgYXJndW1lbnRzCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKRmFjZSdzIGJhbm5lciBmb250LgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBlcXVpdmFsZW50IHRvCi0gICAgICogPHByZT4KLSAgICAgKiBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoSkZhY2VSZXNvdXJjZXMuQkFOTkVSX0ZPTlQpCi0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBmb250Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGb250IGdldEJhbm5lckZvbnQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRGb250UmVnaXN0cnkoKS5nZXQoQkFOTkVSX0ZPTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgSkZhY2UgaXRzZWxmLgotICAgICAqIFRoZSByZXNvdWJsZSBidW5kbGUgaXMgb2J0YWluZWQgZnJvbQotICAgICAqIDxjb2RlPlJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuamZhY2UuamZhY2VfbmxzIik8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCBzZXZlcmFsIHN0YXRpYyBjb252ZW5pZW5jZSBtZXRob2RzIGFyZSAKLSAgICAgKiBhbHNvIHByb3ZpZGVkIG9uIHRoaXMgY2xhc3MgZm9yIGRpcmVjdGx5IGFjY2Vzc2luZwotICAgICAqIHJlc291cmNlcyBpbiB0aGlzIGJ1bmRsZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2xvciByZWdpc3RyeSBmb3IgSkZhY2UgaXRzZWxmLgotICAgICAqIDxwPgotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkNvbG9yUmVnaXN0cnk8L2NvZGU+LgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbG9yUmVnaXN0cnkgZ2V0Q29sb3JSZWdpc3RyeSgpIHsKLSAgICAgICAgaWYgKGNvbG9yUmVnaXN0cnkgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbG9yUmVnaXN0cnkgPSBuZXcgQ29sb3JSZWdpc3RyeSgpOwotICAgICAgICByZXR1cm4gY29sb3JSZWdpc3RyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgcmVzb3VyY2UgbWFuYWdlciBmb3IgdGhlIGdpdmVuIGRpc3BsYXkKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdG9RdWVyeSBkaXNwbGF5IHRvIHF1ZXJ5Ci0gICAgICogQHJldHVybiB0aGUgZ2xvYmFsIHJlc291cmNlIG1hbmFnZXIgZm9yIHRoZSBnaXZlbiBkaXNwbGF5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VzKGZpbmFsIERpc3BsYXkgdG9RdWVyeSkgewotICAgICAgICBSZXNvdXJjZU1hbmFnZXIgcmVnID0gKFJlc291cmNlTWFuYWdlcilyZWdpc3RyaWVzLmdldCh0b1F1ZXJ5KTsgCi0gICAgICAgIAotICAgICAgICBpZiAocmVnID09IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIERldmljZVJlc291cmNlTWFuYWdlciBtZ3IgPSBuZXcgRGV2aWNlUmVzb3VyY2VNYW5hZ2VyKHRvUXVlcnkpOwotICAgICAgICAgICAgcmVnID0gbWdyOwotICAgICAgICAgICAgcmVnaXN0cmllcy5wdXQodG9RdWVyeSwgcmVnKTsKLSAgICAgICAgICAgIHRvUXVlcnkuZGlzcG9zZUV4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgbWdyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0cmllcy5yZW1vdmUodG9RdWVyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZWc7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFJlc291cmNlTWFuYWdlciBmb3IgdGhlIGN1cnJlbnQgZGlzcGxheS4gTWF5IG9ubHkKLSAgICAgKiBiZSBjYWxsZWQgZnJvbSBhIFVJIHRocmVhZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBnbG9iYWwgUmVzb3VyY2VNYW5hZ2VyIGZvciB0aGUgY3VycmVudCBkaXNwbGF5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VzKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSkZhY2UncyBzdGFuZGFyZCBmb250LgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBlcXVpdmFsZW50IHRvCi0gICAgICogPHByZT4KLSAgICAgKiBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoSkZhY2VSZXNvdXJjZXMuREVGQVVMVF9GT05UKQotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZm9udAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9udCBnZXREZWZhdWx0Rm9udCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEZvbnRSZWdpc3RyeSgpLmRlZmF1bHRGb250KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSkZhY2UncyBkaWFsb2cgZm9udC4KLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZXF1aXZhbGVudCB0bwotICAgICAqIDxwcmU+Ci0gICAgICogSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0KEpGYWNlUmVzb3VyY2VzLkRJQUxPR19GT05UKQotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZm9udAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9udCBnZXREaWFsb2dGb250KCkgewotICAgICAgICByZXR1cm4gZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0KERJQUxPR19GT05UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmb250IGluIEpGYWNlJ3MgZm9udCByZWdpc3RyeSB3aXRoIHRoZSBnaXZlbgotICAgICAqIHN5bWJvbGljIGZvbnQgbmFtZS4KLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZXF1aXZhbGVudCB0bwotICAgICAqIDxwcmU+Ci0gICAgICogSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0KHN5bWJvbGljTmFtZSkKLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIHRoZSBkZWZhdWx0IGZvbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3ltYm9saWNOYW1lIHRoZSBzeW1ib2xpYyBmb250IG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBmb250Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGb250IGdldEZvbnQoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0KHN5bWJvbGljTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZm9udCByZWdpc3RyeSBmb3IgSkZhY2UgaXRzZWxmLgotICAgICAqIElmIHRoZSB2YWx1ZSBoYXMgbm90IGJlZW4gZXN0YWJsaXNoZWQgYnkgYW4gZWFybGllcgotICAgICAqIGNhbGwgdG8gPGNvZGU+c2V0Rm9udFJlZ2lzdHJ5PC9jb2RlPiwgaXMgaXQKLSAgICAgKiBpbml0aWFsaXplZCB0bwotICAgICAqIDxjb2RlPm5ldyBGb250UmVnaXN0cnkoIm9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLmpmYWNlZm9udHMiKTwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHNldmVyYWwgc3RhdGljIGNvbnZlbmllbmNlIG1ldGhvZHMgYXJlIAotICAgICAqIGFsc28gcHJvdmlkZWQgb24gdGhpcyBjbGFzcyBmb3IgZGlyZWN0bHkgYWNjZXNzaW5nCi0gICAgICogSkZhY2UncyBzdGFuZGFyZCBmb250cy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGb250UmVnaXN0cnkgZ2V0Rm9udFJlZ2lzdHJ5KCkgewotICAgICAgICBpZiAoZm9udFJlZ2lzdHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGZvbnRSZWdpc3RyeSA9IG5ldyBGb250UmVnaXN0cnkoCi0gICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5qZmFjZWZvbnRzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZm9udFJlZ2lzdHJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEpGYWNlJ3MgaGVhZGVyIGZvbnQuCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGVxdWl2YWxlbnQgdG8KLSAgICAgKiA8cHJlPgotICAgICAqIEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChKRmFjZVJlc291cmNlcy5IRUFERVJfRk9OVCkKLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGZvbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZvbnQgZ2V0SGVhZGVyRm9udCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEZvbnRSZWdpc3RyeSgpLmdldChIRUFERVJfRk9OVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW1hZ2UgaW4gSkZhY2UncyBpbWFnZSByZWdpc3RyeSB3aXRoIHRoZSBnaXZlbiBrZXksIAotICAgICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGVxdWl2YWxlbnQgdG8KLSAgICAgKiA8cHJlPgotICAgICAqIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KQotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAgICogQHJldHVybiB0aGUgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbWFnZSByZWdpc3RyeSBmb3IgSkZhY2UgaXRzZWxmLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgc3RhdGljIGNvbnZlbmllbmNlIG1ldGhvZCA8Y29kZT5nZXRJbWFnZTwvY29kZT4KLSAgICAgKiBpcyBhbHNvIHByb3ZpZGVkIG9uIHRoaXMgY2xhc3MuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotICAgICAgICBpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKQotICAgICAgICAgICAgaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KGdldFJlc291cmNlcyhEaXNwbGF5LmdldEN1cnJlbnQoKSkpOwotICAgICAgICByZXR1cm4gaW1hZ2VSZWdpc3RyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4ga2V5IGluCi0gICAgICogSkZhY2UncyByZXNvdXJjZSBidW5kbGUuIElmIHRoZXJlIGlzbid0IGFueSB2YWx1ZSB1bmRlcgotICAgICAqIHRoZSBnaXZlbiBrZXksIHRoZSBrZXkgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4ga2V5OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RyaW5nIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgICAqIGdpdmVuIGxpc3Qgb2Yga2V5cy4gVGhlIGxvb2t1cCBpcyBkb25lIHdpdGggPGNvZGU+Z2V0U3RyaW5nPC9jb2RlPi4KLSAgICAgKiBUaGUgdmFsdWVzIGFyZSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUga2V5cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXlzIGEgbGlzdCBvZiBrZXlzCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWVzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTdHJpbmdzKFN0cmluZ1tdIGtleXMpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChrZXlzKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IGtleXMubGVuZ3RoOwotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHRbaV0gPSBnZXRTdHJpbmcoa2V5c1tpXSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSkZhY2UncyB0ZXh0IGZvbnQuCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGVxdWl2YWxlbnQgdG8KLSAgICAgKiA8cHJlPgotICAgICAqIEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChKRmFjZVJlc291cmNlcy5URVhUX0ZPTlQpCi0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBmb250Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGb250IGdldFRleHRGb250KCkgewotICAgICAgICByZXR1cm4gZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0KFRFWFRfRk9OVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSkZhY2UncyB2aWV3ZXIgZm9udC4KLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZXF1aXZhbGVudCB0bwotICAgICAqIDxwcmU+Ci0gICAgICogSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0KEpGYWNlUmVzb3VyY2VzLlZJRVdFUl9GT05UKQotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZm9udAotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZm9udCBpcyBub3QgaW4gdXNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGb250IGdldFZpZXdlckZvbnQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRGb250UmVnaXN0cnkoKS5nZXQoVklFV0VSX0ZPTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgSkZhY2UncyBmb250IHJlZ2lzdHJ5IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgb25jZTsgdGhlIGNhbGwgbXVzdCBvY2N1cgotICAgICAqIGJlZm9yZSA8Y29kZT5KRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnk8L2NvZGU+Ci0gICAgICogaXMgaW52b2tlZCAoZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWdpc3RyeSBhIGZvbnQgcmVnaXN0cnkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9udFJlZ2lzdHJ5KEZvbnRSZWdpc3RyeSByZWdpc3RyeSkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKGZvbnRSZWdpc3RyeSA9PSBudWxsLAotICAgICAgICAgICAgICAgICJGb250IHJlZ2lzdHJ5IGNhbiBvbmx5IGJlIHNldCBvbmNlLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvbnRSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBEZWNsYXJlIGEgcHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBibG9jayBpbnN0YW50aWF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgSkZhY2VSZXNvdXJjZXMoKSB7Ci0gICAgICAgIC8vbm8tb3AKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9Mb2NhbFJlc291cmNlTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvTG9jYWxSZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1NWM2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9Mb2NhbFJlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLQotLyoqCi0gKiBBIGxvY2FsIHJlZ2lzdHJ5IHRoYXQgc2hhcmVzIGl0cyByZXNvdXJjZXMgd2l0aCBzb21lIGdsb2JhbCByZWdpc3RyeS4KLSAqIE5lc3RlZFNXVFJlZ2lzdHJ5IGlzIHR5cGljYWxseSB1c2VkIHRvIHNhZmVndWFyZCBhZ2FpbnN0IGxlYWtzLiBDbGllbnRzCi0gKiBjYW4gdXNlIGEgbmVzdGVkIHJlZ2lzdHJ5IHRvIGFsbG9jYXRlIGFuZCBkZWFsbG9jYXRlIHJlc291cmNlcyBpbiB0aGUKLSAqIGdsb2JhbCByZWdpc3RyeS4gQ2FsbGluZyBkaXNwb3NlKCkgb24gdGhlIG5lc3RlZCByZWdpc3RyeSB3aWxsIGRlYWxsb2NhdGUKLSAqIGV2ZXJ5dGhpbmcgYWxsb2NhdGVkIGZvciB0aGUgbmVzdGVkIHJlZ2lzdHJ5IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSByZXN0Ci0gKiBvZiB0aGUgZ2xvYmFsIHJlZ2lzdHJ5LgotICogPHA+Ci0gKiBBIG5lc3RlZCByZWdpc3RyeSBjYW4gYmUgdXNlZCB0byBtYW5hZ2UgdGhlIHJlc291cmNlcyBmb3IsIHNheSwgYSBkaWFsb2cKLSAqIGJveC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTG9jYWxSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIFJlc291cmNlTWFuYWdlciBwYXJlbnRSZWdpc3RyeTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbG9jYWwgcmVnaXN0cnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIGdpdmVuIGdsb2JhbCByZWdpc3RyeQotICAgICAqIGZvciBhbGwgcmVzb3VyY2UgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50UmVnaXN0cnkgZ2xvYmFsIHJlZ2lzdHJ5IAotICAgICAqLwotICAgIHB1YmxpYyBMb2NhbFJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgcGFyZW50UmVnaXN0cnkpIHsKLSAgICAgICAgdGhpcy5wYXJlbnRSZWdpc3RyeSA9IHBhcmVudFJlZ2lzdHJ5OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbG9jYWwgcmVnaXN0cnkgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gZ2xvYmFsIHJlZ2lzdHJ5LiBBbnl0aGluZwotICAgICAqIGFsbG9jYXRlZCBieSB0aGlzIHJlZ2lzdHJ5IHdpbGwgYmUgYXV0b21hdGljYWxseSBjbGVhbmVkIHVwIHdpdGggdGhlIGdpdmVuCi0gICAgICogY29udHJvbCBpcyBkaXNwb3NlZC4gTm90ZSB0aGF0IHJlZ2lzdHJpZXMgY3JlYXRlZCBpbiB0aGlzIHdheSBzaG91bGQgbm90Ci0gICAgICogYmUgdXNlZCB0byBhbGxvY2F0ZSBhbnkgcmVzb3VyY2UgdGhhdCBtdXN0IG91dGxpdmUgdGhlIGdpdmVuIGNvbnRyb2wuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudFJlZ2lzdHJ5IGdsb2JhbCByZWdpc3RyeSB0aGF0IGhhbmRsZXMgcmVzb3VyY2UgYWxsb2NhdGlvbgotICAgICAqIEBwYXJhbSBvd25lciBjb250cm9sIHdob3NlIGRpc3Bvc2FsIHdpbGwgdHJpZ2dlciBjbGVhbnVwIG9mIGV2ZXJ5dGhpbmcgCi0gICAgICogaW4gdGhlIHJlZ2lzdHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBMb2NhbFJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgcGFyZW50UmVnaXN0cnksIENvbnRyb2wgb3duZXIpIHsKLSAgICAgICAgdGhpcyhwYXJlbnRSZWdpc3RyeSk7Ci0gICAgICAgIAotICAgICAgICBvd25lci5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkgICAgICAgIC8qIChub24tSmF2YWRvYykKLQkgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIjd2lkZ2V0RGlzcG9zZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQpCi0JICAgICAgICAgKi8KLQkgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JICAgICAgICAgICAgTG9jYWxSZXNvdXJjZU1hbmFnZXIudGhpcy5kaXNwb3NlKCk7Ci0JICAgICAgICB9IAotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyI2dldERldmljZSgpCi0gICAgICovCi0gICAgcHVibGljIERldmljZSBnZXREZXZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRSZWdpc3RyeS5nZXREZXZpY2UoKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQWJzdHJhY3RTd3RSZWdpc3RyeSNhbGxvY2F0ZShvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Td3RSZXNvdXJjZURlc2NyaXB0b3IpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBhbGxvY2F0ZShEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IgZGVzY3JpcHRvcikKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRSZWdpc3RyeS5jcmVhdGUoZGVzY3JpcHRvcik7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkFic3RyYWN0U3d0UmVnaXN0cnkjZGVhbGxvY2F0ZShqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Td3RSZXNvdXJjZURlc2NyaXB0b3IpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVhbGxvY2F0ZShPYmplY3QgcmVzb3VyY2UsCi0gICAgICAgICAgICBEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAKLSAgICAgICAgcGFyZW50UmVnaXN0cnkuZGVzdHJveShkZXNjcmlwdG9yKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZU1hbmFnZXIjZ2V0RGVmYXVsdEltYWdlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGVmYXVsdEltYWdlKCkgewotICAgICAgICByZXR1cm4gcGFyZW50UmVnaXN0cnkuZ2V0RGVmYXVsdEltYWdlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvTWlzc2luZ0ltYWdlRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvTWlzc2luZ0ltYWdlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzYwZDU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL01pc3NpbmdJbWFnZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci0KLS8qKgotICogVGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIGEgbWlzc2luZyBpbWFnZS4KLSAqIDxwPgotICogVXNlIDxjb2RlPk1pc3NpbmdJbWFnZURlc2NyaXB0b3IuZ2V0SW5zdGFuY2U8L2NvZGU+IHRvCi0gKiBhY2Nlc3MgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBtYWludGFpbmVkIGluIGFuCi0gKiBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZS4gCi0gKiA8L3A+Ci0gKi8KLWNsYXNzIE1pc3NpbmdJbWFnZURlc2NyaXB0b3IgZXh0ZW5kcyBJbWFnZURlc2NyaXB0b3IgewotICAgIHByaXZhdGUgc3RhdGljIE1pc3NpbmdJbWFnZURlc2NyaXB0b3IgaW5zdGFuY2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG1pc3NpbmcgaW1hZ2UgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJbWFnZURlc2NpcHRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEYXRhIGdldEltYWdlRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIERFRkFVTFRfSU1BR0VfREFUQTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmb3IgYSBtaXNzaW5nIGltYWdlCi0gICAgICovCi0gICAgc3RhdGljIE1pc3NpbmdJbWFnZURlc2NyaXB0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL05hbWVkRm9udERlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL05hbWVkRm9udERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3Zjg3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9OYW1lZEZvbnREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLQotLyoqCi0gKiBJZGVudGlmaWVzIGEgZm9udCBieSBpdHMgbmFtZSwgaGVpZ2h0LCBhbmQgc3R5bGUuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotZmluYWwgY2xhc3MgTmFtZWRGb250RGVzY3JpcHRvciBleHRlbmRzIEZvbnREZXNjcmlwdG9yIHsKLQotICAgIHByaXZhdGUgRm9udERhdGEgZGF0YTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZm9udCBkZXNjcmlwdG9yIGZvciBhIGZvbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgaGVpZ2h0LAotICAgICAqIGFuZCBzdHlsZS4gVGhlc2UgYXJndW1lbnRzIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGNvbnN0cnVjdG9yCi0gICAgICogb2YgRm9udC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YSBGb250RGF0YSBkZXNjcmliaW5nIHRoZSBmb250IHRvIGNyZWF0ZQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQjRm9udChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlLCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGEpCi0gICAgICovCi0gICAgcHVibGljIE5hbWVkRm9udERlc2NyaXB0b3IoRm9udERhdGEgZGF0YSkgewotICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Gb250RGVzY3JpcHRvciNjcmVhdGVGb250KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2UpCi0gICAgICovCi0gICAgcHVibGljIEZvbnQgY3JlYXRlRm9udChEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRm9udChkZXZpY2UsIGRhdGEpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKChvYmouZ2V0Q2xhc3MoKSA9PSBOYW1lZEZvbnREZXNjcmlwdG9yLmNsYXNzKSkgewotICAgICAgICAgICAgTmFtZWRGb250RGVzY3JpcHRvciBkZXNjciA9IChOYW1lZEZvbnREZXNjcmlwdG9yKW9iajsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGRhdGEuZXF1YWxzKGRlc2NyLmRhdGEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuRm9udERlc2NyaXB0b3IjZGVzdHJveUZvbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVzdHJveUZvbnQoRm9udCBwcmV2aW91c2x5Q3JlYXRlZEZvbnQpIHsKLSAgICAgICAgcHJldmlvdXNseUNyZWF0ZWRGb250LmRpc3Bvc2UoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL1JHQkNvbG9yRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvUkdCQ29sb3JEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMjRhN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvUkdCQ29sb3JEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLQotLyoqCi0gKiBEZXNjcmliZXMgYSBjb2xvciBieSBpdHMgUkdCIHZhbHVlcy4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1jbGFzcyBSR0JDb2xvckRlc2NyaXB0b3IgZXh0ZW5kcyBDb2xvckRlc2NyaXB0b3IgewotCi0gICAgcHJpdmF0ZSBSR0IgY29sb3I7Ci0gICAgcHJpdmF0ZSBDb2xvciBvcmlnaW5hbENvbG9yID0gbnVsbDsKLSAgICBwcml2YXRlIERldmljZSBvcmlnaW5hbERldmljZSA9IG51bGw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBSR0JDb2xvckRlc2NyaXB0b3IgZ2l2ZW4gc29tZSBSR0IgdmFsdWVzCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yIFJHQiB2YWx1ZXMgKG5vdCBudWxsKQotICAgICAqLwotICAgIHB1YmxpYyBSR0JDb2xvckRlc2NyaXB0b3IoUkdCIGNvbG9yKSB7Ci0gICAgICAgIHRoaXMuY29sb3IgPSBjb2xvcjsKLSAgICB9Ci0gICAgCi0JLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBSR0JDb2xvckRlc2NyaXB0b3IgdGhhdCBkZXNjcmliZXMgYW4gZXhpc3RpbmcgY29sb3IuIAotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcmlnaW5hbENvbG9yIGEgY29sb3IgdG8gZGVzY3JpYmUKLSAgICAgKiBAcGFyYW0gb3JpZ2luYWxEZXZpY2UgbXVzdCBiZSB0aGUgc2FtZSBEZXZpY2UgdGhhdCB3YXMgcGFzc2VkIGludG8KLSAgICAgKiB0aGUgY29sb3IncyBjb25zdHJ1Y3RvciB3aGVuIGl0IHdhcyBmaXJzdCBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBSR0JDb2xvckRlc2NyaXB0b3IoQ29sb3Igb3JpZ2luYWxDb2xvciwgRGV2aWNlIG9yaWdpbmFsRGV2aWNlKSB7Ci0gICAgICAgIHRoaXMob3JpZ2luYWxDb2xvci5nZXRSR0IoKSk7Ci0gICAgICAgIHRoaXMub3JpZ2luYWxDb2xvciA9IG9yaWdpbmFsQ29sb3I7Ci0gICAgICAgIHRoaXMub3JpZ2luYWxEZXZpY2UgPSBvcmlnaW5hbERldmljZTsKLSAgICB9Ci0gICAgCi0JLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBSR0JDb2xvckRlc2NyaXB0b3IgdGhhdCBkZXNjcmliZXMgYW4gZXhpc3RpbmcgY29sb3IuIAotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcmlnaW5hbENvbG9yIGEgY29sb3IgdG8gZGVzY3JpYmUKLSAgICAgKi8KLSAgICBwdWJsaWMgUkdCQ29sb3JEZXNjcmlwdG9yKENvbG9yIG9yaWdpbmFsQ29sb3IpIHsKLSAgICAgICAgdGhpcyhvcmlnaW5hbENvbG9yLmdldFJHQigpKTsKLSAgICAgICAgdGhpcy5vcmlnaW5hbENvbG9yID0gb3JpZ2luYWxDb2xvcjsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUkdCQ29sb3JEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBSR0JDb2xvckRlc2NyaXB0b3Igb3RoZXIgPSAoUkdCQ29sb3JEZXNjcmlwdG9yKSBvYmo7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBvdGhlci5jb2xvci5lcXVhbHMoY29sb3IpICYmIG90aGVyLm9yaWdpbmFsQ29sb3IgPT0gb3JpZ2luYWxDb2xvcjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gY29sb3IuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2VzLkNvbG9yRGVzY3JpcHRvciNjcmVhdGVDb2xvcigpCi0gICAgICovCi0gICAgcHVibGljIENvbG9yIGNyZWF0ZUNvbG9yKERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgLy8gSWYgdGhpcyBkZXNjcmlwdG9yIGlzIHdyYXBwaW5nIGFuIGV4aXN0aW5nIGNvbG9yLCB0aGVuIHdlIGNhbiByZXR1cm4gdGhlIG9yaWdpbmFsIGNvbG9yCi0gICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIHNhbWUgZGV2aWNlLgotICAgICAgICBpZiAob3JpZ2luYWxDb2xvciAhPSBudWxsKSB7IAotCi0gICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IHdoYXQgZGV2aWNlIHRoZSBvcmlnaW5hbCB3YXMgYWxsb2NhdGVkIG9uLCB3ZSBjYW4ndCB0ZWxsIGlmIHdlCi0gICAgICAgICAgICAvLyBjYW4gcmV1c2UgdGhlIG9yaWdpbmFsIHVudGlsIHdlIHRyeSB0byBjcmVhdGUgYSBuZXcgb25lLgotICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDb2xvciByZXN1bHQgPSBuZXcgQ29sb3IoZGV2aWNlLCBjb2xvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgbmV3IGNvbG9yIHdhcyBlcXVhbCB0byB0aGUgb3JpZ2luYWwsIHRoZW4gaXQgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkCi0gICAgICAgICAgICAgICAgLy8gb24gdGhlIHNhbWUgZGV2aWNlLiAKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmVxdWFscyhvcmlnaW5hbENvbG9yKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBub3cga25vdyB0aGUgb3JpZ2luYWwgZGV2aWNlLiBXZSBjYW4gcmV1c2UgdGhlIG9yaWdpbmFsIGltYWdlLAotICAgICAgICAgICAgICAgICAgICAvLyBkaXNjYXJkIHRoZSB0ZW1wb3JhcnkgSW1hZ2UsIGFuZCByZW1lbWJlciB0aGUgZGV2aWNlIGZvciB0aGUgbmV4dCB0aW1lCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZGVzY3JpcHRvciBpcyB1c2VkLgotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbERldmljZSA9IGRldmljZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsQ29sb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRoZSBuZXdseSBjcmVhdGVkIGNvbG9yIGVuZGVkIHVwIGJlaW5nIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCwgc28KLSAgICAgICAgICAgICAgICAvLyBpdCBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZCBvbiBhIGRpZmZlcmVudCBkZXZpY2UuIFJldHVybiB0aGUgbmV3IHZlcnNpb24uCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIAotICAgICAgICAgICAgLy8gSWYgd2UncmUgYWxsb2NhdGluZyBvbiB0aGUgc2FtZSBkZXZpY2UgYXMgdGhlIG9yaWdpbmFsIGNvbG9yLCByZXR1cm4gdGhlIG9yaWdpbmFsLgotICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGV2aWNlID09IGRldmljZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbENvbG9yOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IENvbG9yKGRldmljZSwgY29sb3IpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbG9yRGVzY3JpcHRvciNkZXN0cm95Q29sb3Iob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lDb2xvcihDb2xvciB0b0Rlc3Ryb3kpIHsKLSAgICAgICAgaWYgKHRvRGVzdHJveSA9PSBvcmlnaW5hbENvbG9yKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRvRGVzdHJveS5kaXNwb3NlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9SZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjOTQ1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9SZXNvdXJjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBTV1QgcmVzb3VyY2VzLiBJdCBtYW5hZ2VzIHJlZmVyZW5jZS1jb3VudGVkIGluc3RhbmNlcyBvZiByZXNvdXJjZXMKLSAqIHN1Y2ggYXMgRm9udHMsIEltYWdlcywgYW5kIENvbG9ycywgYW5kIGFsbG93cyB0aGVtIHRvIGJlIGFjY2Vzc2VkIHVzaW5nIGRlc2NyaXB0b3JzLgotICogRXZlcnl0aGluZyBhbGxvY2F0ZWQgdGhyb3VnaCB0aGUgcmVnaXN0cnkgc2hvdWxkIGFsc28gYmUgZGlzcG9zZWQgdGhyb3VnaCB0aGUgcmVnaXN0cnkuCi0gKiBTaW5jZSB0aGUgcmVzb3VyY2VzIGFyZSBzaGFyZWQgYW5kIHJlZmVyZW5jZSBjb3VudGVkLCB0aGV5IHNob3VsZCBuZXZlciBiZSBkaXNwb3NlZAotICogZGlyZWN0bHkuCi0gKiA8cD4KLSAqIFJlc291cmNlTWFuYWdlciBoYW5kbGVzIGNvcnJlY3QgYWxsb2NhdGlvbiBhbmQgZGlzcG9zYWwgb2YgcmVzb3VyY2VzLiBJdCBkaWZmZXJzIGZyb20gCi0gKiB0aGUgdmFyaW91cyBKRmFjZSAqUmVnaXN0cnkgY2xhc3Nlcywgd2hpY2ggYWxzbyBtYXAgc3ltYm9saWMgSURzIG9udG8gcmVzb3VyY2VzLiBJbiAKLSAqIGdlbmVyYWwsIHlvdSBzaG91bGQgdXNlIGEgKlJlZ2lzdHJ5IGNsYXNzIHRvIG1hcCBJRHMgb250byBkZXNjcmlwdG9ycywgYW5kIHVzZSBhIAotICogUmVzb3VyY2VNYW5hZ2VyIHRvIGNvbnZlcnQgdGhlIGRlc2NyaXB0b3JzIGludG8gcmVhbCBJbWFnZXMvRm9udHMvZXRjLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNvdXJjZU1hbmFnZXIgewotICAgIAotICAgIHByaXZhdGUgTGlzdCBkaXNwb3NlRXhlY3MgPSBudWxsOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIERldmljZSBmb3Igd2hpY2ggdGhpcyBSZXNvdXJjZU1hbmFnZXIgd2lsbCBjcmVhdGUgcmVzb3VyY2VzIAotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIERldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXNvdXJjZU1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgRGV2aWNlIGdldERldmljZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4gSWYgdGhlIHJlc291cmNlIGFscmVhZHkKLSAgICAgKiBleGlzdHMsIHRoZSByZWZlcmVuY2UgY291bnQgaXMgaW5jcmVtZW50ZWQgYW5kIHRoZSBleGl0aW5nIHJlc291cmNlIGlzIHJldHVybmVkLgotICAgICAqIE90aGVyd2lzZSwgYSBuZXcgcmVzb3VyY2UgaXMgYWxsb2NhdGVkLiBFdmVyeSBjYWxsIHRvIGNyZWF0ZSguLi4pIHNob3VsZCBoYXZlCi0gICAgICogYSBjb3JyZXNwb25kaW5nIGNhbGwgdG8gZGlzcG9zZSguLi4pLiAgCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMSAKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIGRlc2NyaXB0b3IgZm9yIHRoZSByZXNvdXJjZSB0byBhbGxvY2F0ZQotICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCByZXNvdXJjZSAobm90IG51bGwpCi0gICAgICogQHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gYWxsb2NhdGUgdGhlIHJlc291cmNlCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBjcmVhdGUoRGV2aWNlUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWFsbG9jYXRlcyBhIHJlc291cmNlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ5IGNyZWF0ZSguLi4pLiBEZXNjcmlwdG9ycyBhcmUgY29tcGFyZWQKLSAgICAgKiBieSBlcXVhbGl0eSwgbm90IGlkZW50aXR5LiBJZiB0aGUgc2FtZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBtdWx0aXBsZSB0aW1lcywgdGhpcyBtYXkKLSAgICAgKiBkZWNyZW1lbnQgYSByZWZlcmVuY2UgY291bnQgcmF0aGVyIHRoYW4gZGlzcG9zaW5nIHRoZSBhY3R1YWwgcmVzb3VyY2UuICAKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xIAotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgaWRlbnRpZmllciBmb3IgdGhlIHJlc291cmNlCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgZGVzdHJveShEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IgZGVzY3JpcHRvcik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbWFnZSwgZ2l2ZW4gYW4gaW1hZ2UgZGVzY3JpcHRvci4gSW1hZ2VzIGFsbG9jYXRlZCBpbiB0aGlzIG1hbm5lciBtdXN0Ci0gICAgICogYmUgZGlzcG9zZWQgYnkgZGlzcG9zZUltYWdlLCBhbmQgbmV2ZXIgYnkgY2FsbGluZyBJbWFnZS5kaXNwb3NlKCkuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMSAKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSB0byBjcmVhdGUKLSAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZSBkZXNjcmliZWQgYnkgdGhpcyBkZXNjcmlwdG9yIChwb3NzaWJseSBzaGFyZWQgYnkgb3RoZXIgZXF1aXZhbGVudAotICAgICAqIEltYWdlRGVzY3JpcHRvcnMpCi0gICAgICogQHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gYWxsb2NhdGUgdGhlIEltYWdlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIEltYWdlIGNyZWF0ZUltYWdlKEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB0aHJvd3MgRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gewotICAgIAkvLyBBc3NlcnRpb24gYWRkZWQgdG8gaGVscCBkaWFnbm9zZSBjbGllbnQgYnVncy4gIFNlZSBidWcgIzgzNzExIGFuZCBidWcgIzkwNDU0LgotICAgIAlBc3NlcnQuaXNOb3ROdWxsKGRlc2NyaXB0b3IpOwotICAgIAkKLSAgICAgICAgcmV0dXJuIChJbWFnZSljcmVhdGUoZGVzY3JpcHRvcik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW1hZ2UsIGdpdmVuIGFuIGltYWdlIGRlc2NyaXB0b3IuIEltYWdlcyBhbGxvY2F0ZWQgaW4gdGhpcyBtYW5uZXIgbXVzdAotICAgICAqIGJlIGRpc3Bvc2VkIGJ5IGRpc3Bvc2VJbWFnZSwgYW5kIG5ldmVyIGJ5IGNhbGxpbmcgSW1hZ2UuZGlzcG9zZSgpLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEgCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgdG8gY3JlYXRlCi0gICAgICogQHJldHVybiB0aGUgSW1hZ2UgZGVzY3JpYmVkIGJ5IHRoaXMgZGVzY3JpcHRvciAocG9zc2libHkgc2hhcmVkIGJ5IG90aGVyIGVxdWl2YWxlbnQKLSAgICAgKiBJbWFnZURlc2NyaXB0b3JzKQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBJbWFnZSBjcmVhdGVJbWFnZVdpdGhEZWZhdWx0KEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgCXJldHVybiBnZXREZWZhdWx0SW1hZ2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLQkJCXJldHVybiAoSW1hZ2UpIGNyZWF0ZShkZXNjcmlwdG9yKTsKLQkJfSBjYXRjaCAoRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJUG9saWN5LmdldExvZygpLmxvZygKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsICJvcmcuZWNsaXBzZS5qZmFjZSIsIDAsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkiVGhlIGltYWdlIGNvdWxkIG5vdCBiZSBsb2FkZWQ6ICIgKyBkZXNjcmlwdG9yLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJZSkpOwotCQkJcmV0dXJuIGdldERlZmF1bHRJbWFnZSgpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJUG9saWN5LmdldExvZygpLmxvZygKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsICJvcmcuZWNsaXBzZS5qZmFjZSIsIDAsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkiVGhlIGltYWdlIGNvdWxkIG5vdCBiZSBsb2FkZWQ6ICIgKyBkZXNjcmlwdG9yLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJZSkpOwotCQkJcmV0dXJuIGdldERlZmF1bHRJbWFnZSgpOwotCQl9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgaW1hZ2UgdGhhdCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBldmVudCB0aGF0IHRoZSBpbnRlbmRlZAotICAgICAqIGltYWdlIGlzIG1pc3NpbmcuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqCi0gICAgICogQHJldHVybiBhIGRlZmF1bHQgaW1hZ2UgdGhhdCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBldmVudCB0aGF0IHRoZSBpbnRlbmRlZAotICAgICAqIGltYWdlIGlzIG1pc3NpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEltYWdlIGdldERlZmF1bHRJbWFnZSgpOwotCi0gICAgLyoqCi0gICAgICogVW5kb2VzIGV2ZXJ5dGhpbmcgdGhhdCB3YXMgZG9uZSBieSBjcmVhdGVJbWFnZSguLi4pLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEgCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBpZGVudGlmaWVyIGZvciB0aGUgaW1hZ2UgdG8gZGlzcG9zZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlc3Ryb3lJbWFnZShJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBkZXN0cm95KGRlc2NyaXB0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG9jYXRlcyBhIGNvbG9yLCBnaXZlbiBhIGNvbG9yIGRlc2NyaXB0b3IuIEFueSBjb2xvciBhbGxvY2F0ZWQgaW4gdGhpcwotICAgICAqIG1hbm5lciBtdXN0IGJlIGRpc3Bvc2VkIGJ5IGNhbGxpbmcgZGlzcG9zZUNvbG9yKC4uLikgYW5kIG5ldmVyIGJ5IGNhbGxpbmcgCi0gICAgICogQ29sb3IuZGlzcG9zZSgpIGRpcmVjdGx5LgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEgCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBkZXNjcmlwdG9yIGZvciB0aGUgY29sb3IgdG8gY3JlYXRlCi0gICAgICogQHJldHVybiB0aGUgQ29sb3IgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBDb2xvckRlc2NyaXB0b3IgKG5vdCBudWxsKQotICAgICAqIEB0aHJvd3MgRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgY29sb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgQ29sb3IgY3JlYXRlQ29sb3IoQ29sb3JEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoQ29sb3IpY3JlYXRlKGRlc2NyaXB0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG9jYXRlcyBhIGNvbG9yLCBnaXZlbiBpdHMgUkdCIHZhbHVlcy4gQW55IGNvbG9yIGFsbG9jYXRlZCBpbiB0aGlzCi0gICAgICogbWFubmVyIG11c3QgYmUgZGlzcG9zZWQgYnkgY2FsbGluZyBkaXNwb3NlQ29sb3IoLi4uKSBhbmQgbmV2ZXIgYnkgY2FsbGluZyAKLSAgICAgKiBDb2xvci5kaXNwb3NlKCkgZGlyZWN0bHkuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMSAKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIGRlc2NyaXB0b3IgZm9yIHRoZSBjb2xvciB0byBjcmVhdGUKLSAgICAgKiBAcmV0dXJuIHRoZSBDb2xvciBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIENvbG9yRGVzY3JpcHRvciAobm90IG51bGwpCi0gICAgICogQHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gY3JlYXRlIHRoZSBjb2xvcgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBDb2xvciBjcmVhdGVDb2xvcihSR0IgZGVzY3JpcHRvcikgdGhyb3dzIERldmljZVJlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbG9yKG5ldyBSR0JDb2xvckRlc2NyaXB0b3IoZGVzY3JpcHRvcikpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBVbmRvZXMgZXZlcnl0aGluZyB0aGF0IHdhcyBkb25lIGJ5IGEgY2FsbCB0byBjcmVhdGVDb2xvciguLi4pLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEgCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBSR0IgdmFsdWUgb2YgdGhlIGNvbG9yIHRvIGRpc3Bvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBkZXN0cm95Q29sb3IoUkdCIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgZGVzdHJveUNvbG9yKG5ldyBSR0JDb2xvckRlc2NyaXB0b3IoZGVzY3JpcHRvcikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVuZG9lcyBldmVyeXRoaW5nIHRoYXQgd2FzIGRvbmUgYnkgYSBjYWxsIHRvIGNyZWF0ZUNvbG9yKC4uLikuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMSAKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIGlkZW50aWZpZXIgZm9yIHRoZSBjb2xvciB0byBkaXNwb3NlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVzdHJveUNvbG9yKENvbG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGRlc3Ryb3koZGVzY3JpcHRvcik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEZvbnQgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBGb250RGVzY3JpcHRvci4gQW55IEZvbnQKLSAgICAgKiBhbGxvY2F0ZWQgaW4gdGhpcyBtYW5uZXIgbXVzdCBiZSBkZWFsbG9jYXRlZCBieSBjYWxsaW5nIGRpc3Bvc2VGb250KC4uLikgYW5kCi0gICAgICogbmV2ZXIgYnkgY2FsbGluZyBGb250LmRpc3Bvc2UoKSBkaXJlY3RseS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xIAotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgZGVzY3JpcHRpb24gb2YgdGhlIGZvbnQgdG8gY3JlYXRlCi0gICAgICogQHJldHVybiB0aGUgRm9udCBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIGRlc2NyaXB0b3IKLSAgICAgKiBAdGhyb3dzIERldmljZVJlc291cmNlRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlIGZvbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgRm9udCBjcmVhdGVGb250KEZvbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoRm9udCljcmVhdGUoZGVzY3JpcHRvcik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVuZG9lcyBldmVyeXRoaW5nIHRoYXQgd2FzIGRvbmUgYnkgYSBwcmV2aW91cyBjYWxsIHRvIGNyZWF0ZUZvbnQoKS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xIAotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgZGVzY3JpcHRpb24gb2YgdGhlIGZvbnQgdG8gZGVzdHJveQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlc3Ryb3lGb250KEZvbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgZGVzdHJveShkZXNjcmlwdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGlzcG9zZXMgYW55IHJlbWFpbmluZyByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgbWFuYWdlci4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgaWYgKGRpc3Bvc2VFeGVjcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIG9uZSBvZiB0aGUgcnVubmFibGVzIHRocm93cyBhbiBleGNlcHRpb24sIHdlIG5lZWQgdG8gcHJvcG9nYXRlIGl0LgotICAgICAgICAvLyBIb3dldmVyLCB0aGlzIHNob3VsZCBub3QgcHJldmVudCB0aGUgcmVtYWluaW5nIHJ1bm5hYmxlcyBmcm9tIGJlaW5nIAotICAgICAgICAvLyBub3RpZmllZC4gSWYgYW55IHJ1bm5hYmxlcyB0aHJvdyBhbiBleGNlcHRpb24sIHdlIHJlbWVtYmVyIG9uZSBvZiB0aGVtCi0gICAgICAgIC8vIGhlcmUgYW5kIHRocm93IGl0IGF0IHRoZSBlbmQgb2YgdGhlIG1ldGhvZC4KLSAgICAgICAgUnVudGltZUV4Y2VwdGlvbiBmb3VuZEV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBSdW5uYWJsZVtdIGV4ZWNzID0gKFJ1bm5hYmxlW10pIGRpc3Bvc2VFeGVjcy50b0FycmF5KG5ldyBSdW5uYWJsZVtkaXNwb3NlRXhlY3Muc2l6ZSgpXSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhlY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFJ1bm5hYmxlIGV4ZWMgPSBleGVjc1tpXTsgICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBleGVjLnJ1bigpOwotICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgcHJvcG9nYXRlIGFuIGV4Y2VwdGlvbiwgYnV0IGRvbid0IHN0b3Agbm90aWZ5aW5nCi0gICAgICAgICAgICAgICAgLy8gdGhlIHJlbWFpbmluZyBydW5uYWJsZXMuCi0gICAgICAgICAgICAgICAgZm91bmRFeGNlcHRpb24gPSBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZm91bmRFeGNlcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gSWYgYW55IHJ1bm5hYmxlcyB0aHJldyBhbiBleGNlcHRpb24sIHByb3BvZ2F0ZSBvbmUgb2YgdGhlbS4KLSAgICAgICAgICAgIHRocm93IGZvdW5kRXhjZXB0aW9uOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0b3IsIG9yCi0gICAgICogbnVsbCBpZiBub25lIGV4aXN0cyB5ZXQuIAotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIGRlc2NyaXB0b3IgdG8gZmluZAotICAgICAqIEByZXR1cm4gYSBwcmV2aW91c2x5IGFsbG9jYXRlZCByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIGRlc2NyaXB0b3Igb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZmluZChEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IgZGVzY3JpcHRvcik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2F1c2VzIHRoZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBydW5uYWJsZSB0bwotICAgICAqIGJlIGludm9rZWQganVzdCBiZWZvcmUgdGhlIHJlY2VpdmVyIGlzIGRpc3Bvc2VkLiBUaGUgcnVubmFibGUKLSAgICAgKiBjYW4gYmUgc3Vic2VxdWVudGx5IGNhbmNlbGxlZCBieSBhIGNhbGwgdG8gPGNvZGU+Y2FuY2VsRGlzcG9zZUV4ZWM8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSByIHJ1bm5hYmxlIHRvIGV4ZWN1dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZUV4ZWMoUnVubmFibGUgcikgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHIpOwotICAgICAgICAKLSAgICAgICAgaWYgKGRpc3Bvc2VFeGVjcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNwb3NlRXhlY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGRpc3Bvc2VFeGVjcy5hZGQocik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENhbmNlbHMgYSBydW5uYWJsZSB0aGF0IHdhcyBwcmV2aW91c2x5IHNjaGVkdWxlZCB3aXRoIDxjb2RlPmRpc3Bvc2VFeGVjPC9jb2RlPi4KLSAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBnaXZlbiBydW5uYWJsZSB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoCi0gICAgICogZGlzcG9zZUV4ZWMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHIgcnVubmFibGUgdG8gY2FuY2VsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2FuY2VsRGlzcG9zZUV4ZWMoUnVubmFibGUgcikgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHIpOwotICAgICAgICAKLSAgICAgICAgaWYgKGRpc3Bvc2VFeGVjcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGRpc3Bvc2VFeGVjcy5yZW1vdmUocik7Ci0gICAgICAgIAotICAgICAgICBpZiAoZGlzcG9zZUV4ZWNzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZGlzcG9zZUV4ZWNzID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL1Jlc291cmNlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL1Jlc291cmNlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxODRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9SZXNvdXJjZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uRXZlbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHZhcmlvdXMgSkZhY2UgcmVnaXN0cmllcy4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzb3VyY2VSZWdpc3RyeSBleHRlbmRzIEV2ZW50TWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgcmVnaXN0cnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgYWRkTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3Bvc2VzIGFsbCBjdXJyZW50bHkgYWxsb2NhdGVkIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjbGVhckNhY2hlcygpOwotCi0gICAgLyoqIAotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBrZXlzIHRoaXMgbWFuYWdlciBrbm93cyBhYm91dC4gIFRoaXMgY29sbGVjdGlvbiAKLSAgICAgKiBzaG91bGQgYmUgaW1tdXRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTZXQgZ2V0S2V5U2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHJlY2VpdmVyIGhhcyBhIHZhbHVlIGZvciB0aGUgc3VwcGxpZWQga2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgYSB2YWx1ZSBmb3IgdGhpcyBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNWYWx1ZUZvcihTdHJpbmcga2V5KTsKLQotICAgIC8qKgotICAgICAqIEZpcmVzIGEgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbGljIHZhbHVlIHRoYXQgaXMgY2hhbmdpbmcuCi0gICAgICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgdmFsdWUuCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZU1hcHBpbmdDaGFuZ2VkKFN0cmluZyBuYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0gICAgICAgICAgICBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgZmluYWwgT2JqZWN0W10gbXlMaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgaWYgKG15TGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBuYW1lLAotICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBteUxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICgoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIG15TGlzdGVuZXJzW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaG93IHRvIGxvZz8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBsaXN0ZW5lciBmcm9tIHRoaXMgcmVnaXN0cnkuIEhhcyBubyBhZmZlY3QgaWYgdGhlCi0gICAgICogbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcmVtb3ZlTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL1N0cmluZ0NvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvU3RyaW5nQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MWMxMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvU3RyaW5nQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIGNvbnZlcnRpbmcgdmFyaW91cyBkYXRhIHR5cGVzIHRvIGFuZCBmcm9tCi0gKiBzdHJpbmdzLiBTdXBwb3J0ZWQgdHlwZXMgaW5jbHVkZToKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPmJvb2xlYW48L2NvZGU+PC9saT4KLSAqICAgPGxpPjxjb2RlPmludDwvY29kZT48L2xpPgotICogICA8bGk+PGNvZGU+bG9uZzwvY29kZT48L2xpPgotICogICA8bGk+PGNvZGU+ZmxvYXQ8L2NvZGU+PC9saT4KLSAqICAgPGxpPjxjb2RlPmRvdWJsZTwvY29kZT48L2xpPgotICogICA8bGk+PGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50PC9jb2RlPjwvbGk+Ci0gKiAgIDxsaT48Y29kZT5vcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlPC9jb2RlPjwvbGk+Ci0gKiAgIDxsaT48Y29kZT5vcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCPC9jb2RlPjwvbGk+Ci0gKiAgIDxsaT48Y29kZT5vcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE8L2NvZGU+PC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIEFsbCBtZXRob2RzIGRlY2xhcmVkIG9uIHRoaXMgY2xhc3MgYXJlIHN0YXRpYy4gVGhpcwotICogY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ0NvbnZlcnRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBmb250IHN0eWxlIGNvbnN0YW50IGZvciByZWd1bGFyIGZvbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdVTEFSID0gInJlZ3VsYXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBmb250IHN0eWxlIGNvbnN0YW50IGZvciBib2xkIGZvbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBmb250IHN0eWxlIGNvbnN0YW50IGZvciBpdGFsaWMgZm9udHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElUQUxJQyA9ICJpdGFsaWMiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBmb250IHN0eWxlIGNvbnN0YW50IGZvciBib2xkIGl0YWxpYyBmb250cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9MRF9JVEFMSUMgPSAiYm9sZCBpdGFsaWMiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBjb25zdGFudCBmb3IgdGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIgdXNlZCBpbgotICAgICAqIGZvbnQgc3BlY2lmaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTRVBBUkFUT1IgPSAnLSc7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBjb25zdGFudCBmb3IgdGhlIHNlcGVyYXRvciBjaGFyYWN0ZXIgdXNlZCBpbiBmb250IGxpc3QKLSAgICAgKiBzcGVjaWZpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9OVF9TRVBBUkFUT1IgPSAiOyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBEZWNsYXJlIGEgcHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBibG9jayBpbnN0YW50aWF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nQ29udmVydGVyKCkgewotICAgICAgICAvL25vLW9wCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnJlYWtzIG91dCBzcGFjZS1zZXBhcmF0ZWQgd29yZHMgaW50byBhbiBhcnJheSBvZiB3b3Jkcy4KLSAgICAgKiBGb3IgZXhhbXBsZTogPGNvZGU+Im5vIGNvbW1lbnQiPC9jb2RlPiBpbnRvIGFuIGFycmF5IAotICAgICAqIDxjb2RlPmFbMF09Im5vIjwvY29kZT4gYW5kIDxjb2RlPmFbMV09ICJjb21tZW50IjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHdvcmRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBhc0FycmF5KFN0cmluZyB2YWx1ZSkgdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlKTsKLSAgICAgICAgd2hpbGUgKHN0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBsaXN0LmFkZChzdG9rLm5leHRUb2tlbigpKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcmVzdWx0W10gPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgIC8qKgotICAgICAqIEJyZWFrcyBvdXQgc3BhY2Utc2VwYXJhdGVkIHdvcmRzIGludG8gYW4gYXJyYXkgb2Ygd29yZHMuCi0gICAgICogRm9yIGV4YW1wbGU6IDxjb2RlPiJubyBjb21tZW50IjwvY29kZT4gaW50byBhbiBhcnJheSAKLSAgICAgKiA8Y29kZT5hWzBdPSJubyI8L2NvZGU+IGFuZCA8Y29kZT5hWzFdPSAiY29tbWVudCI8L2NvZGU+LgotICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBwYXJzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKLSAgICAgKiBAcGFyYW0gZGZsdCB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygd29yZHMsIG9yIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBhc0FycmF5KFN0cmluZyB2YWx1ZSwgU3RyaW5nW10gZGZsdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGFzQXJyYXkodmFsdWUpOwotICAgICAgICB9IGNhdGNoIChEYXRhRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBkZmx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGludG8gYSBib29sZWFuLgotICAgICAqIFRoaXMgbWV0aG9kIGZhaWxzIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQgYSBib29sZWFuLgotICAgICAqIDxwPgotICAgICAqIFZhbGlkIHJlcHJlc2VudGF0aW9ucyBvZiA8Y29kZT50cnVlPC9jb2RlPiBpbmNsdWRlIHRoZSBzdHJpbmdzCi0gICAgICogIjxjb2RlPnQ8L2NvZGU+IiwgIjxjb2RlPnRydWU8L2NvZGU+Iiwgb3IgZXF1aXZhbGVudCBpbiBtaXhlZAotICAgICAqIG9yIHVwcGVyIGNhc2UuCi0gICAgICogU2ltaWxhcmx5LCB2YWxpZCByZXByZXNlbnRhdGlvbnMgb2YgPGNvZGU+ZmFsc2U8L2NvZGU+IGluY2x1ZGUgdGhlIHN0cmluZ3MKLSAgICAgKiAiPGNvZGU+ZjwvY29kZT4iLCAiPGNvZGU+ZmFsc2U8L2NvZGU+Iiwgb3IgZXF1aXZhbGVudCBpbiBtaXhlZAotICAgICAqIG9yIHVwcGVyIGNhc2UuIAotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgYXMgYSBib29sZWFuCi0gICAgICogQGV4Y2VwdGlvbiBEYXRhRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQKLSAgICAgKglhIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXNCb29sZWFuKFN0cmluZyB2YWx1ZSkgdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdiA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIGlmICh2LmVxdWFscygidCIpIHx8IHYuZXF1YWxzKCJ0cnVlIikpIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKHZhbHVlLmVxdWFscygiZiIpIHx8IHYuZXF1YWxzKCJmYWxzZSIpKSAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB0aHJvdyBuZXcgRGF0YUZvcm1hdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVmFsdWUgIiArIHZhbHVlICsgImRvZXNuJ3QgcmVwcmVzZW50IGEgYm9vbGVhbiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGEgYm9vbGVhbi4KLSAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlIGlmIHRoZSAKLSAgICAgKiB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQgYSBib29sZWFuLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAgICAgKiBAcGFyYW0gZGZsdCB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzIGEgYm9vbGVhbiwgb3IgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXNCb29sZWFuKFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBkZmx0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gYXNCb29sZWFuKHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoRGF0YUZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGZsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGEgZG91YmxlLgotICAgICAqIFRoaXMgbWV0aG9kIGZhaWxzIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQgYSBkb3VibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzIGEgZG91YmxlCi0gICAgICogQGV4Y2VwdGlvbiBEYXRhRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQKLSAgICAgKglhIGRvdWJsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGFzRG91YmxlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChEb3VibGUudmFsdWVPZih2YWx1ZSkpLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YUZvcm1hdEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhIGRvdWJsZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlIGlmIHRoZSAKLSAgICAgKiB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQgYSBkb3VibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICAgICAqIEBwYXJhbSBkZmx0IHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgYXMgYSBkb3VibGUsIG9yIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBkb3VibGUgYXNEb3VibGUoU3RyaW5nIHZhbHVlLCBkb3VibGUgZGZsdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGFzRG91YmxlKHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoRGF0YUZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGZsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGEgZmxvYXQuCi0gICAgICogVGhpcyBtZXRob2QgZmFpbHMgaWYgdGhlIHZhbHVlIGRvZXMgbm90IHJlcHJlc2VudCBhIGZsb2F0LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhcyBhIGZsb2F0Ci0gICAgICogQGV4Y2VwdGlvbiBEYXRhRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQKLSAgICAgKglhIGZsb2F0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBhc0Zsb2F0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChGbG9hdC52YWx1ZU9mKHZhbHVlKSkuZmxvYXRWYWx1ZSgpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFGb3JtYXRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGludG8gYSBmbG9hdC4KLSAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlIGlmIHRoZSAKLSAgICAgKiB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQgYSBmbG9hdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gICAgICogQHBhcmFtIGRmbHQgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhcyBhIGZsb2F0LCBvciB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgYXNGbG9hdChTdHJpbmcgdmFsdWUsIGZsb2F0IGRmbHQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBhc0Zsb2F0KHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoRGF0YUZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGZsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGFuIFNXVCBmb250IGRhdGEgb2JqZWN0LgotICAgICAqIFRoaXMgbWV0aG9kIGZhaWxzIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQgZm9udCBkYXRhLgotICAgICAqIDxwPgotICAgICAqIEEgdmFsaWQgZm9udCBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGEgc3RyaW5nIG9mIHRoZSBmb3JtCi0gICAgICogPGNvZGU+PGl0PmZvbnRuYW1lPC9pdD4tPGl0PnN0eWxlPC9pdD4tPGl0PmhlaWdodDwvaXQ+PC9jb2RlPiB3aGVyZQotICAgICAqIDxjb2RlPjxpdD5mb250bmFtZTwvaXQ+PC9jb2RlPiBpcyB0aGUgbmFtZSBvZiBhIGZvbnQsCi0gICAgICogPGNvZGU+PGl0PnN0eWxlPC9pdD48L2NvZGU+IGlzIGEgZm9udCBzdHlsZSAob25lIG9mCi0gICAgICogPGNvZGU+InJlZ3VsYXIiPC9jb2RlPiwgPGNvZGU+ImJvbGQiPC9jb2RlPiwKLSAgICAgKiA8Y29kZT4iaXRhbGljIjwvY29kZT4sIG9yIDxjb2RlPiJib2xkIGl0YWxpYyI8L2NvZGU+KQotICAgICAqIGFuZCA8Y29kZT48aXQ+aGVpZ2h0PC9pdD48L2NvZGU+IGlzIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZQotICAgICAqIGZvbnQgaGVpZ2h0LiBFeGFtcGxlOiA8Y29kZT5UaW1lcyBOZXcgUm9tYW4tYm9sZC0zNjwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhcyBmb250IGRhdGEKLSAgICAgKiBAZXhjZXB0aW9uIERhdGFGb3JtYXRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHZhbHVlIGRvZXMgbm90IHJlcHJlc2VudAotICAgICAqCWZvbnQgZGF0YQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9udERhdGEgYXNGb250RGF0YShTdHJpbmcgdmFsdWUpIHRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YUZvcm1hdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIk51bGwgZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCBmb250IGRhdGEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgIGludCBoZWlnaHQgPSAwOwotICAgICAgICBpbnQgc3R5bGUgPSAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICAgICAgaW50IGhlaWdodEluZGV4ID0gdmFsdWUubGFzdEluZGV4T2YoU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGlmIChoZWlnaHRJbmRleCA9PSAtMSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YUZvcm1hdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJObyBjb3JyZWN0IGZvbnQgZGF0YSBmb3JtYXQgXCIiICsgdmFsdWUgKyAiXCIiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGhlaWdodCA9IFN0cmluZ0NvbnZlcnRlci5hc0ludCh2YWx1ZS5zdWJzdHJpbmcoaGVpZ2h0SW5kZXggKyAxLAotICAgICAgICAgICAgICAgICAgICBsZW5ndGgpKTsKLSAgICAgICAgICAgIGludCBmYWNlSW5kZXggPSB2YWx1ZS5sYXN0SW5kZXhPZihTRVBBUkFUT1IsIGhlaWdodEluZGV4IC0gMSk7Ci0gICAgICAgICAgICBpZiAoZmFjZUluZGV4ID09IC0xKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGNvcnJlY3QgZm9udCBkYXRhIGZvcm1hdCBcIiIgKyB2YWx1ZSArICJcIiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3RyaW5nIHMgPSB2YWx1ZS5zdWJzdHJpbmcoZmFjZUluZGV4ICsgMSwgaGVpZ2h0SW5kZXgpOwotICAgICAgICAgICAgaWYgKEJPTERfSVRBTElDLmVxdWFscyhzKSkgewotICAgICAgICAgICAgICAgIHN0eWxlID0gU1dULkJPTEQgfCBTV1QuSVRBTElDOwotICAgICAgICAgICAgfSBlbHNlIGlmIChCT0xELmVxdWFscyhzKSkgewotICAgICAgICAgICAgICAgIHN0eWxlID0gU1dULkJPTEQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKElUQUxJQy5lcXVhbHMocykpIHsKLSAgICAgICAgICAgICAgICBzdHlsZSA9IFNXVC5JVEFMSUM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFJFR1VMQVIuZXF1YWxzKHMpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgPSBTV1QuTk9STUFMOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YUZvcm1hdEV4Y2VwdGlvbigiVW5rbm93biBmYWNlIG5hbWUgXCIiICsgcyArICJcIiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IHZhbHVlLnN1YnN0cmluZygwLCBmYWNlSW5kZXgpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEYXRhRm9ybWF0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEZvbnREYXRhKG5hbWUsIGhlaWdodCwgc3R5bGUpOwotICAgIH0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIGEgbGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQgdG9rZW5zIGludG8gYW4gYXJyYXkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBzdHJpbmcgdG9rZW5zCi0JICogQHBhcmFtIHByb3AgdGhlIGluaXRpYWwgY29tbWEtc2VwYXJhdGVkIHN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldEFycmF5RnJvbUxpc3QoU3RyaW5nIHByb3AsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJaWYgKHByb3AgPT0gbnVsbCB8fCBwcm9wLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3AsIHNlcGFyYXRvcik7IAotCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWlmICghdG9rZW4uZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWxpc3QuYWRkKHRva2VuKTsKLQkJfQotCQlyZXR1cm4gbGlzdC5pc0VtcHR5KCkgPyBuZXcgU3RyaW5nWzBdIDogKFN0cmluZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOwotCX0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgdGhlIGdpdmVuIHZhbHVlIGludG8gYW4gYXJyYXkgb2YgU1dUIGZvbnQgZGF0YSBvYmplY3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgZm9udCBsaXN0IHN0cmluZyAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhcyBhIGZvbnQgbGlzdAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZvbnREYXRhW10gYXNGb250RGF0YUFycmF5KFN0cmluZyB2YWx1ZSkgewotICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gZ2V0QXJyYXlGcm9tTGlzdCh2YWx1ZSwgRk9OVF9TRVBBUkFUT1IpOwotICAgICAgICBBcnJheUxpc3QgZGF0YSA9IG5ldyBBcnJheUxpc3Qoc3RyaW5ncy5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGF0YS5hZGQoU3RyaW5nQ29udmVydGVyLmFzRm9udERhdGEoc3RyaW5nc1tpXSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRGF0YUZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy9kby1ub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChGb250RGF0YVtdKSBkYXRhLnRvQXJyYXkobmV3IEZvbnREYXRhW2RhdGEuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGludG8gYW4gU1dUIGZvbnQgZGF0YSBvYmplY3QuCi0gICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBpZiB0aGUgCi0gICAgICogdmFsdWUgZG9lcyBub3QgcmVwcmVzZW50IGEgZm9udCBkYXRhIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gICAgICogQHBhcmFtIGRmbHQgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhcyBhIGZvbnQgZGF0YSBvYmplY3QsIG9yIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGb250RGF0YSBhc0ZvbnREYXRhKFN0cmluZyB2YWx1ZSwgRm9udERhdGEgZGZsdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGFzRm9udERhdGEodmFsdWUpOwotICAgICAgICB9IGNhdGNoIChEYXRhRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBkZmx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGludG8gYW4gaW50LgotICAgICAqIFRoaXMgbWV0aG9kIGZhaWxzIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQgYW4gaW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhcyBhbiBpbnQKLSAgICAgKiBAZXhjZXB0aW9uIERhdGFGb3JtYXRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHZhbHVlIGRvZXMgbm90IHJlcHJlc2VudAotICAgICAqCWFuIGludAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGFzSW50KFN0cmluZyB2YWx1ZSkgdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFGb3JtYXRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGludG8gYW4gaW50LgotICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUgaWYgdGhlIAotICAgICAqIHZhbHVlIGRvZXMgbm90IHJlcHJlc2VudCBhbiBpbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICAgICAqIEBwYXJhbSBkZmx0IHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgYXMgYW4gaW50LCBvciB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGFzSW50KFN0cmluZyB2YWx1ZSwgaW50IGRmbHQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBhc0ludCh2YWx1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKERhdGFGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGRmbHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhIGxvbmcuCi0gICAgICogVGhpcyBtZXRob2QgZmFpbHMgaWYgdGhlIHZhbHVlIGRvZXMgbm90IHJlcHJlc2VudCBhIGxvbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzIGEgbG9uZwotICAgICAqIEBleGNlcHRpb24gRGF0YUZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gdmFsdWUgZG9lcyBub3QgcmVwcmVzZW50Ci0gICAgICoJYSBsb25nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGFzTG9uZyhTdHJpbmcgdmFsdWUpIHRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBMb25nLnBhcnNlTG9uZyh2YWx1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YUZvcm1hdEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhIGxvbmcuCi0gICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBpZiB0aGUgCi0gICAgICogdmFsdWUgZG9lcyBub3QgcmVwcmVzZW50IGEgbG9uZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gICAgICogQHBhcmFtIGRmbHQgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhcyBhIGxvbmcsIG9yIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGFzTG9uZyhTdHJpbmcgdmFsdWUsIGxvbmcgZGZsdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGFzTG9uZyh2YWx1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKERhdGFGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGRmbHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhbiBTV1QgcG9pbnQuCi0gICAgICogVGhpcyBtZXRob2QgZmFpbHMgaWYgdGhlIHZhbHVlIGRvZXMgbm90IHJlcHJlc2VudCBhIHBvaW50LgotICAgICAqIDxwPgotICAgICAqIEEgdmFsaWQgcG9pbnQgcmVwcmVzZW50YXRpb24gaXMgYSBzdHJpbmcgb2YgdGhlIGZvcm0KLSAgICAgKiA8Y29kZT48aXQ+eDwvaXQ+LDxpdD55PC9pdD48L2NvZGU+IHdoZXJlCi0gICAgICogPGNvZGU+PGl0Png8L2l0PjwvY29kZT4gYW5kIDxjb2RlPjxpdD55PC9pdD48L2NvZGU+Ci0gICAgICogYXJlIHZhbGlkIGludHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHBvaW50Ci0gICAgICogQGV4Y2VwdGlvbiBEYXRhRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQKLSAgICAgKglhIHBvaW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQb2ludCBhc1BvaW50KFN0cmluZyB2YWx1ZSkgdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBEYXRhRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiTnVsbCBkb2Vzbid0IHJlcHJlc2VudCBhIHZhbGlkIHBvaW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB4ID0gc3Rvay5uZXh0VG9rZW4oKTsKLSAgICAgICAgU3RyaW5nIHkgPSBzdG9rLm5leHRUb2tlbigpOwotICAgICAgICBpbnQgeHZhbCA9IDAsIHl2YWwgPSAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgeHZhbCA9IEludGVnZXIucGFyc2VJbnQoeCk7Ci0gICAgICAgICAgICB5dmFsID0gSW50ZWdlci5wYXJzZUludCh5KTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEYXRhRm9ybWF0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFBvaW50KHh2YWwsIHl2YWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGFuIFNXVCBwb2ludC4KLSAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlIGlmIHRoZSAKLSAgICAgKiB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQgYSBwb2ludC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gICAgICogQHBhcmFtIGRmbHQgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHBvaW50LCBvciB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUG9pbnQgYXNQb2ludChTdHJpbmcgdmFsdWUsIFBvaW50IGRmbHQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBhc1BvaW50KHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoRGF0YUZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGZsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGFuIFNXVCByZWN0YW5nbGUuCi0gICAgICogVGhpcyBtZXRob2QgZmFpbHMgaWYgdGhlIHZhbHVlIGRvZXMgbm90IHJlcHJlc2VudCBhIHJlY3RhbmdsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHZhbGlkIHJlY3RhbmdsZSByZXByZXNlbnRhdGlvbiBpcyBhIHN0cmluZyBvZiB0aGUgZm9ybQotICAgICAqIDxjb2RlPjxpdD54PC9pdD4sPGl0Pnk8L2l0Piw8aXQ+d2lkdGg8L2l0Piw8aXQ+aGVpZ2h0PC9pdD48L2NvZGU+Ci0gICAgICogd2hlcmUgPGNvZGU+PGl0Png8L2l0PjwvY29kZT4sIDxjb2RlPjxpdD55PC9pdD48L2NvZGU+LAotICAgICAqIDxjb2RlPjxpdD53aWR0aDwvaXQ+PC9jb2RlPiwgYW5kIDxjb2RlPjxpdD5oZWlnaHQ8L2l0PjwvY29kZT4KLSAgICAgKiBhcmUgdmFsaWQgaW50cy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzIGEgcmVjdGFuZ2xlCi0gICAgICogQGV4Y2VwdGlvbiBEYXRhRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQKLSAgICAgKglhIHJlY3RhbmdsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVjdGFuZ2xlIGFzUmVjdGFuZ2xlKFN0cmluZyB2YWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YUZvcm1hdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIk51bGwgZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCByZWN0YW5nbGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIHggPSBzdG9rLm5leHRUb2tlbigpOwotICAgICAgICBTdHJpbmcgeSA9IHN0b2submV4dFRva2VuKCk7Ci0gICAgICAgIFN0cmluZyB3aWR0aCA9IHN0b2submV4dFRva2VuKCk7Ci0gICAgICAgIFN0cmluZyBoZWlnaHQgPSBzdG9rLm5leHRUb2tlbigpOwotICAgICAgICBpbnQgeHZhbCA9IDAsIHl2YWwgPSAwLCB3dmFsID0gMCwgaHZhbCA9IDA7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB4dmFsID0gSW50ZWdlci5wYXJzZUludCh4KTsKLSAgICAgICAgICAgIHl2YWwgPSBJbnRlZ2VyLnBhcnNlSW50KHkpOwotICAgICAgICAgICAgd3ZhbCA9IEludGVnZXIucGFyc2VJbnQod2lkdGgpOwotICAgICAgICAgICAgaHZhbCA9IEludGVnZXIucGFyc2VJbnQoaGVpZ2h0KTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEYXRhRm9ybWF0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh4dmFsLCB5dmFsLCB3dmFsLCBodmFsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhbiBTV1QgcmVjdGFuZ2xlLgotICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUgaWYgdGhlIAotICAgICAqIHZhbHVlIGRvZXMgbm90IHJlcHJlc2VudCBhIHJlY3RhbmdsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gICAgICogQHBhcmFtIGRmbHQgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHJlY3RhbmdsZSwgb3IgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlY3RhbmdsZSBhc1JlY3RhbmdsZShTdHJpbmcgdmFsdWUsIFJlY3RhbmdsZSBkZmx0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gYXNSZWN0YW5nbGUodmFsdWUpOwotICAgICAgICB9IGNhdGNoIChEYXRhRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBkZmx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGludG8gYW4gU1dUIFJHQiBjb2xvciB2YWx1ZS4KLSAgICAgKiBUaGlzIG1ldGhvZCBmYWlscyBpZiB0aGUgdmFsdWUgZG9lcyBub3QgcmVwcmVzZW50IGFuIFJHQgotICAgICAqIGNvbG9yIHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIEEgdmFsaWQgUkdCIGNvbG9yIHZhbHVlIHJlcHJlc2VudGF0aW9uIGlzIGEgc3RyaW5nIG9mIHRoZSBmb3JtCi0gICAgICogPGNvZGU+PGl0PnJlZDwvaXQ+LDxpdD5ncmVlbjwvaXQ+PC9jb2RlPiw8aXQ+Ymx1ZTwvaXQ+PC9jb2RlPiB3aGVyZQotICAgICAqIDxjb2RlPjxpdD5yZWQ8L2l0PjwvY29kZT4sIDxpdD5ncmVlbjwvaXQ+PC9jb2RlPiwgYW5kIAotICAgICAqIDxjb2RlPjxpdD5ibHVlPC9pdD48L2NvZGU+IGFyZSB2YWxpZCBpbnRzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgYXMgYW4gUkdCIGNvbG9yIHZhbHVlCi0gICAgICogQGV4Y2VwdGlvbiBEYXRhRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB2YWx1ZSBkb2VzIG5vdCByZXByZXNlbnQKLSAgICAgKglhbiBSR0IgY29sb3IgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJHQiBhc1JHQihTdHJpbmcgdmFsdWUpIHRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YUZvcm1hdEV4Y2VwdGlvbigiTnVsbCBkb2Vzbid0IHJlcHJlc2VudCBhIHZhbGlkIFJHQiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVkID0gc3Rvay5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIFN0cmluZyBncmVlbiA9IHN0b2submV4dFRva2VuKCk7Ci0gICAgICAgICAgICBTdHJpbmcgYmx1ZSA9IHN0b2submV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpbnQgcnZhbCA9IDAsIGd2YWwgPSAwLCBidmFsID0gMDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcnZhbCA9IEludGVnZXIucGFyc2VJbnQocmVkKTsKLSAgICAgICAgICAgICAgICBndmFsID0gSW50ZWdlci5wYXJzZUludChncmVlbik7Ci0gICAgICAgICAgICAgICAgYnZhbCA9IEludGVnZXIucGFyc2VJbnQoYmx1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhRm9ybWF0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUkdCKHJ2YWwsIGd2YWwsIGJ2YWwpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEYXRhRm9ybWF0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGFuIFNXVCBSR0IgY29sb3IgdmFsdWUuCi0gICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBpZiB0aGUgCi0gICAgICogdmFsdWUgZG9lcyBub3QgcmVwcmVzZW50IGFuIFJHQiBjb2xvciB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gICAgICogQHBhcmFtIGRmbHQgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhcyBhIFJHQiBjb2xvciB2YWx1ZSwgb3IgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJHQiBhc1JHQihTdHJpbmcgdmFsdWUsIFJHQiBkZmx0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gYXNSR0IodmFsdWUpOwotICAgICAgICB9IGNhdGNoIChEYXRhRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBkZmx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIGRvdWJsZSB2YWx1ZSB0byBhIHN0cmluZy4KLSAgICAgKiBFcXVpdmFsZW50IHRvIDxjb2RlPlN0cmluZy52YWx1ZU9mKHZhbHVlKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGRvdWJsZSB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGRvdWJsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzU3RyaW5nKGRvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBmbG9hdCB2YWx1ZSB0byBhIHN0cmluZy4KLSAgICAgKiBFcXVpdmFsZW50IHRvIDxjb2RlPlN0cmluZy52YWx1ZU9mKHZhbHVlKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZsb2F0IHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gZmxvYXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhc1N0cmluZyhmbG9hdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBpbnQgdmFsdWUgdG8gYSBzdHJpbmcuCi0gICAgICogRXF1aXZhbGVudCB0byA8Y29kZT5TdHJpbmcudmFsdWVPZih2YWx1ZSk8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBpbnQgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhc1N0cmluZyhpbnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gbG9uZyB2YWx1ZSB0byBhIHN0cmluZy4KLSAgICAgKiBFcXVpdmFsZW50IHRvIDxjb2RlPlN0cmluZy52YWx1ZU9mKHZhbHVlKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGxvbmcgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBsb25nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYXNTdHJpbmcobG9uZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBib29sZWFuIG9iamVjdCB0byBhIHN0cmluZy4KLSAgICAgKiBFcXVpdmFsZW50IHRvIDxjb2RlPlN0cmluZy52YWx1ZU9mKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGJvb2xlYW4gb2JqZWN0Ci0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gYm9vbGVhbiB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzU3RyaW5nKEJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIGRvdWJsZSBvYmplY3QgdG8gYSBzdHJpbmcuCi0gICAgICogRXF1aXZhbGVudCB0byA8Y29kZT5TdHJpbmcudmFsdWVPZih2YWx1ZS5kb3VibGVWYWx1ZSgpKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGRvdWJsZSBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBkb3VibGUgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhc1N0cmluZyhEb3VibGUgdmFsdWUpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih2YWx1ZS5kb3VibGVWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gZmxvYXQgb2JqZWN0IHRvIGEgc3RyaW5nLgotICAgICAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+U3RyaW5nLnZhbHVlT2YodmFsdWUuZmxvYXRWYWx1ZSgpKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZsb2F0IG9iamVjdAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGZsb2F0IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYXNTdHJpbmcoRmxvYXQgdmFsdWUpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih2YWx1ZS5mbG9hdFZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBpbnRlZ2VyIG9iamVjdCB0byBhIHN0cmluZy4KLSAgICAgKiBFcXVpdmFsZW50IHRvIDxjb2RlPlN0cmluZy52YWx1ZU9mKHZhbHVlLmludFZhbHVlKCkpPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50ZWdlciBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBpbnRlZ2VyIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYXNTdHJpbmcoSW50ZWdlciB2YWx1ZSkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHZhbHVlLmludFZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBsb25nIG9iamVjdCB0byBhIHN0cmluZy4KLSAgICAgKiBFcXVpdmFsZW50IHRvIDxjb2RlPlN0cmluZy52YWx1ZU9mKHZhbHVlLmxvbmdWYWx1ZSgpKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGxvbmcgb2JqZWN0Ci0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gbG9uZyB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzU3RyaW5nKExvbmcgdmFsdWUpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih2YWx1ZS5sb25nVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBmb250IGRhdGEgYXJyYXkgIHRvIGEgc3RyaW5nLiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlzCi0gICAgICogdGhhdCBvZiBhc1N0cmluZyhGb250RGF0YSkgc2VwZXJhdGVkIGJ5ICc7JwotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgZm9udCBkYXRhLgotICAgICAqIEByZXR1cm4gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZm9udCBkYXRhIGFycmEuCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzU3RyaW5nKEZvbnREYXRhW10gdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChhc1N0cmluZyh2YWx1ZVtpXSkpOwotICAgICAgICAgICAgaWYgKGkgIT0gdmFsdWUubGVuZ3RoIC0gMSkKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKEZPTlRfU0VQQVJBVE9SKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBmb250IGRhdGEgb2JqZWN0IHRvIGEgc3RyaW5nLiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlzCi0gICAgICogImZvbnQgbmFtZS1zdHlsZS1oZWlnaHQiIChmb3IgZXhhbXBsZSAiVGltZXMgTmV3IFJvbWFuLWJvbGQtMzYiKS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZvbnQgZGF0YS4KLSAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZvbnQgZGF0YSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYXNTdHJpbmcoRm9udERhdGEgdmFsdWUpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQodmFsdWUuZ2V0TmFtZSgpKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChTRVBBUkFUT1IpOwotICAgICAgICBpbnQgc3R5bGUgPSB2YWx1ZS5nZXRTdHlsZSgpOwotICAgICAgICBib29sZWFuIGJvbGQgPSAoc3R5bGUgJiBTV1QuQk9MRCkgPT0gU1dULkJPTEQ7Ci0gICAgICAgIGJvb2xlYW4gaXRhbGljID0gKHN0eWxlICYgU1dULklUQUxJQykgPT0gU1dULklUQUxJQzsKLSAgICAgICAgaWYgKGJvbGQgJiYgaXRhbGljKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKEJPTERfSVRBTElDKTsKLSAgICAgICAgfSBlbHNlIGlmIChib2xkKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKEJPTEQpOwotICAgICAgICB9IGVsc2UgaWYgKGl0YWxpYykgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChJVEFMSUMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChSRUdVTEFSKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoU0VQQVJBVE9SKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCh2YWx1ZS5nZXRIZWlnaHQoKSk7Ci0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gU1dUIHBvaW50IG9iamVjdCB0byBhIHN0cmluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgcG9pbnQgaGFzIHRoZSBmb3JtCi0gICAgICogPGNvZGU+PGl0Png8L2l0Piw8aXQ+eTwvaXQ+PC9jb2RlPiB3aGVyZQotICAgICAqIDxjb2RlPjxpdD54PC9pdD48L2NvZGU+IGFuZCA8Y29kZT48aXQ+eTwvaXQ+PC9jb2RlPgotICAgICAqIGFyZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIGludGVnZXJzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgcG9pbnQgb2JqZWN0Ci0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gcG9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhc1N0cmluZyhQb2ludCB2YWx1ZSkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHZhbHVlKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCh2YWx1ZS54KTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnLCcpOwotICAgICAgICBidWZmZXIuYXBwZW5kKHZhbHVlLnkpOwotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIFNXVCByZWN0YW5nbGUgb2JqZWN0IHRvIGEgc3RyaW5nLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSByZWN0YW5nbGUgaGFzIHRoZSBmb3JtCi0gICAgICogPGNvZGU+PGl0Png8L2l0Piw8aXQ+eTwvaXQ+LDxpdD53aWR0aDwvaXQ+LDxpdD5oZWlnaHQ8L2l0PjwvY29kZT4KLSAgICAgKiB3aGVyZSA8Y29kZT48aXQ+eDwvaXQ+PC9jb2RlPiwgPGNvZGU+PGl0Pnk8L2l0PjwvY29kZT4sCi0gICAgICogPGNvZGU+PGl0PndpZHRoPC9pdD48L2NvZGU+LCBhbmQgPGNvZGU+PGl0PmhlaWdodDwvaXQ+PC9jb2RlPgotICAgICAqIGFyZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIGludGVnZXJzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgcmVjdGFuZ2xlIG9iamVjdAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHJlY3RhbmdsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzU3RyaW5nKFJlY3RhbmdsZSB2YWx1ZSkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHZhbHVlKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCh2YWx1ZS54KTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnLCcpOwotICAgICAgICBidWZmZXIuYXBwZW5kKHZhbHVlLnkpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCcsJyk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQodmFsdWUud2lkdGgpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCcsJyk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQodmFsdWUuaGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBTV1QgUkdCIGNvbG9yIHZhbHVlIG9iamVjdCB0byBhIHN0cmluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIFJHQiBjb2xvciB2YWx1ZSBoYXMgdGhlIGZvcm0KLSAgICAgKiA8Y29kZT48aXQ+cmVkPC9pdD4sPGl0PmdyZWVuPC9pdD48L2NvZGU+LDxpdD5ibHVlPC9pdD48L2NvZGU+IHdoZXJlCi0gICAgICogPGNvZGU+PGl0PnJlZDwvaXQ+PC9jb2RlPiwgPGl0PmdyZWVuPC9pdD48L2NvZGU+LCBhbmQgCi0gICAgICogPGNvZGU+PGl0PmJsdWU8L2l0PjwvY29kZT4gYXJlIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgaW50ZWdlcnMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBSR0IgY29sb3IgdmFsdWUgb2JqZWN0Ci0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gUkdCIGNvbG9yIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYXNTdHJpbmcoUkdCIHZhbHVlKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwodmFsdWUpOwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBidWZmZXIuYXBwZW5kKHZhbHVlLnJlZCk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJywnKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCh2YWx1ZS5ncmVlbik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJywnKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCh2YWx1ZS5ibHVlKTsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBib29sZWFuIHZhbHVlIHRvIGEgc3RyaW5nLgotICAgICAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+U3RyaW5nLnZhbHVlT2YodmFsdWUpPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgYm9vbGVhbiB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhc1N0cmluZyhib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RyaW5nIHdpdGggYWxsIHdoaXRlc3BhY2UgY2hhcmFjdGVycyByZW1vdmVkLgotICAgICAqIDxwPgotICAgICAqIEFsbCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBjb2RlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+JyYjOTI7dTAwMjAnPC9jb2RlPiAKLSAgICAgKiAodGhlIHNwYWNlIGNoYXJhY3RlcikgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYSB3aGl0ZSBzcGFjZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcyB0aGUgc291cmNlIHN0cmluZwotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyB3aXRoIGFsbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcmVtb3ZlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVdoaXRlU3BhY2VzKFN0cmluZyBzKSB7Ci0gICAgICAgIC8vY2hlY2sgZm9yIG5vIHdoaXRlc3BhY2UgKGNvbW1vbiBjYXNlKQotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGludCB3c0luZGV4ID0gLTE7Ci0gICAgICAgIGludCBzaXplID0gcy5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGZvdW5kID0gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzLmNoYXJBdChpKSk7Ci0gICAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgICAgICB3c0luZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWZvdW5kKQotICAgICAgICAgICAgcmV0dXJuIHM7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIocy5zdWJzdHJpbmcoMCwgd3NJbmRleCkpOwotICAgICAgICBmb3IgKGludCBpID0gd3NJbmRleCArIDE7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgZm9udCBkYXRhIG9iamVjdCB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgZGlzcGxheS4gCi0gICAgICogCVRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gaXMKLSAgICAgKiAiZm9udCBuYW1lLXN0eWxlLWhlaWdodCIgKGZvciBleGFtcGxlICJUaW1lcyBOZXcgUm9tYW4tYm9sZC0zNiIpLgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgZm9udCBkYXRhLgotICAgICAqIEByZXR1cm4gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZm9udCBkYXRhIG9iamVjdC4KLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgYXNTdHJpbmcoRm9udERhdGEpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYXNEaXNwbGF5YWJsZVN0cmluZyhGb250RGF0YSB2YWx1ZSkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHZhbHVlKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCh2YWx1ZS5nZXROYW1lKCkpOwotICAgICAgICBidWZmZXIuYXBwZW5kKFNFUEFSQVRPUik7Ci0gICAgICAgIGludCBzdHlsZSA9IHZhbHVlLmdldFN0eWxlKCk7Ci0gICAgICAgIGJvb2xlYW4gYm9sZCA9IChzdHlsZSAmIFNXVC5CT0xEKSA9PSBTV1QuQk9MRDsKLSAgICAgICAgYm9vbGVhbiBpdGFsaWMgPSAoc3R5bGUgJiBTV1QuSVRBTElDKSA9PSBTV1QuSVRBTElDOwotICAgICAgICBpZiAoYm9sZCAmJiBpdGFsaWMpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJCb2xkSXRhbGljRm9udCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgaWYgKGJvbGQpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJCb2xkRm9udCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgaWYgKGl0YWxpYykgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkl0YWxpY0ZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJSZWd1bGFyRm9udCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoU0VQQVJBVE9SKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCh2YWx1ZS5nZXRIZWlnaHQoKSk7Ci0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL1VSTEltYWdlRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvVVJMSW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZjdiOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvVVJMSW1hZ2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLQotLyoqCi0gKiBBbiBJbWFnZURlc2NyaXB0b3IgdGhhdCBnZXRzIGl0cyBpbmZvcm1hdGlvbiBmcm9tIGEgVVJMLgotICogVGhpcyBjbGFzcyBpcyBub3QgcHVibGljIEFQSS4gIFVzZSBJbWFnZURlc2NyaXB0b3IjY3JlYXRlRnJvbVVSTAotICogdG8gY3JlYXRlIGEgZGVzY3JpcHRvciB0aGF0IHVzZXMgYSBVUkwuCi0gKi8KLWNsYXNzIFVSTEltYWdlRGVzY3JpcHRvciBleHRlbmRzIEltYWdlRGVzY3JpcHRvciB7Ci0gICAgcHJpdmF0ZSBVUkwgdXJsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBVUkxJbWFnZURlc2NyaXB0b3IuCi0gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIHRvIGxvYWQgdGhlIGltYWdlIGZyb20uICBNdXN0IGJlIG5vbi1udWxsLgotICAgICAqLwotICAgIFVSTEltYWdlRGVzY3JpcHRvcihVUkwgdXJsKSB7Ci0gICAgICAgIHRoaXMudXJsID0gdXJsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gT2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgVVJMSW1hZ2VEZXNjcmlwdG9yKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoKFVSTEltYWdlRGVzY3JpcHRvcikgbykudXJsLmVxdWFscyh0aGlzLnVybCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJbWFnZURlc2NpcHRvci4KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY2Fubm90IGJlIHJlYWQuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoKSB7Ci0gICAgICAgIEltYWdlRGF0YSByZXN1bHQgPSBudWxsOwotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IGdldFN0cmVhbSgpOwotICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgSW1hZ2VEYXRhKGluKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuY29kZSAhPSBTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggb3RoZXJ3aXNlCi0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSsiLmdldEltYWdlRGF0YSgpOiAiKwotICAgICAgICAgICAgICAgICAgICAvLyAgIkV4Y2VwdGlvbiB3aGlsZSBjbG9zaW5nIElucHV0U3RyZWFtIDogIitlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyZWFtIG9uIHRoZSBpbWFnZSBjb250ZW50cy4gIFJldHVybnMKLSAgICAgKiBudWxsIGlmIGEgc3RyZWFtIGNvdWxkIG5vdCBiZSBvcGVuZWQuCi0gICAgICogQHJldHVybiB0aGUgc3RyZWFtIGZvciBsb2FkaW5nIHRoZSBkYXRhCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSh1cmwub3BlblN0cmVhbSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gdXJsLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0gICAgICovCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlVSTEltYWdlRGVzY3JpcHRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5PYmplY3Q8L2NvZGU+IG1ldGhvZCAKLSAgICAgKiByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0IHdoaWNoIGlzIHN1aXRhYmxlIG9ubHkgZm9yIGRlYnVnZ2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlVSTEltYWdlRGVzY3JpcHRvcigiICsgdXJsICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9qZmFjZWZvbnRzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9qZmFjZWZvbnRzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZjhlNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250cy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmljIE5MUyBmb250IGZpbGUgZm9yIEpGYWNlCi0jICouMCBpcyBXaW5kb3dzIGZvbnQKLSMgKi4xIGlzIFVuaXggZm9udAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnLmVjbGlwc2UuamZhY2UuYmFubmVyZm9udC4wPU1TIFNhbnMgU2VyaWYtYm9sZC0xMAotb3JnLmVjbGlwc2UuamZhY2UuYmFubmVyZm9udC4xPWImaC1sdWNpZGFicmlnaHQtcmVndWxhci0xMAotCi1vcmcuZWNsaXBzZS5qZmFjZS5oZWFkZXJmb250LjA9TVMgU2FucyBTZXJpZi1ib2xkLTEyCi1vcmcuZWNsaXBzZS5qZmFjZS5oZWFkZXJmb250LjE9YiZoLWx1Y2lkYWJyaWdodC1yZWd1bGFyLTEyCi0KLW9yZy5lY2xpcHNlLmpmYWNlLnRleHRmb250LjA9Q291cmllciBOZXctcmVndWxhci0xMAotb3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQuMT1Db3VyaWVyLXJlZ3VsYXItMTAKLW9yZy5lY2xpcHNlLmpmYWNlLnRleHRmb250LjI9YiZoLWx1Y2lkYWJyaWdodC1yZWd1bGFyLTkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL2pmYWNlZm9udHNfYWl4LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9qZmFjZWZvbnRzX2FpeC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTlkODJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL2pmYWNlZm9udHNfYWl4LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEFpeCBmb250IGZpbGUgZm9yIEpGYWNlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmcuZWNsaXBzZS5qZmFjZS5iYW5uZXJmb250LjA9YWRvYmUtY291cmllci1ib2xkLTE0Ci1vcmcuZWNsaXBzZS5qZmFjZS5oZWFkZXJmb250LjA9bWlzYy1maXhlZC1ib2xkLTE0Ci1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udC4wPWFkb2JlLWNvdXJpZXItcmVndWxhci0xMgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c19ocC11eC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c19ocC11eC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjAxODhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL2pmYWNlZm9udHNfaHAtdXgucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgSFAgVVggZm9udCBmaWxlIGZvciBKRmFjZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnLmVjbGlwc2UuamZhY2UuYmFubmVyZm9udC4wPWFkb2JlLWNvdXJpZXItYm9sZC0xNAotb3JnLmVjbGlwc2UuamZhY2UuaGVhZGVyZm9udC4wPWFkb2JlLWNvdXJpZXItcmVndWxhci0xNAotb3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQuMD1hZG9iZS1jb3VyaWVyLXJlZ3VsYXItMTQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL2pmYWNlZm9udHNfbGludXgucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL2pmYWNlZm9udHNfbGludXgucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzNTI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9qZmFjZWZvbnRzX2xpbnV4LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIExpbnV4IGZvbnQgZmlsZSBmb3IgSkZhY2UKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5lY2xpcHNlLmpmYWNlLmJhbm5lcmZvbnQuMD1hZG9iZS1jb3VyaWVyLWJvbGQtMTQKLW9yZy5lY2xpcHNlLmpmYWNlLmhlYWRlcmZvbnQuMD1taXNjLWZpeGVkLWJvbGQtMTQKLW9yZy5lY2xpcHNlLmpmYWNlLnRleHRmb250LjA9YWRvYmUtY291cmllci1yZWd1bGFyLTEyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9qZmFjZWZvbnRzX2xpbnV4X2d0ay5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c19saW51eF9ndGsucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhZDVkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9qZmFjZWZvbnRzX2xpbnV4X2d0ay5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBMaW51eCBHVEsgZm9udCBmaWxlIGZvciBKRmFjZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnLmVjbGlwc2UuamZhY2UuYmFubmVyZm9udC4wPVNhbnMtYm9sZC0xMAotb3JnLmVjbGlwc2UuamZhY2UuaGVhZGVyZm9udC4wPVNhbnMtYm9sZC0xMgotb3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQuMD1Nb25vc3BhY2UtcmVndWxhci0xMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c19tYWNvc3gucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL2pmYWNlZm9udHNfbWFjb3N4LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NDc2NDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c19tYWNvc3gucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ2FyYm9uIGZvbnQgZmlsZSBmb3IgSkZhY2UKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5lY2xpcHNlLmpmYWNlLmJhbm5lcmZvbnQuMD1MdWNpZGEgR3JhbmRlLWJvbGQtMTIKLW9yZy5lY2xpcHNlLmpmYWNlLmhlYWRlcmZvbnQuMD1MdWNpZGEgR3JhbmRlLWJvbGQtMTQKLQotb3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQuMD1Nb25hY28tcmVndWxhci0xMQotb3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQuMT1Db3VyaWVyLXJlZ3VsYXItMTIKLW9yZy5lY2xpcHNlLmpmYWNlLnRleHRmb250LjI9Q291cmllciBOZXctcmVndWxhci0xMgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c19xbngucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL2pmYWNlZm9udHNfcW54LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzdjZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c19xbngucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUU5YIGZvbnQgZmlsZSBmb3IgSkZhY2UKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5lY2xpcHNlLmpmYWNlLmJhbm5lcmZvbnQuMD1UZXh0Rm9udC1ib2xkLTE0Ci1vcmcuZWNsaXBzZS5qZmFjZS5oZWFkZXJmb250LjA9VGV4dEZvbnQtYm9sZC0xOAotb3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQuMD1GaXhlZEZvbnQtcmVndWxhci04Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c19zdW5vcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c19zdW5vcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ5YjkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL2pmYWNlZm9udHNfc3Vub3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU29sYXJpcyBmb250IGZpbGUgZm9yIEpGYWNlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmcuZWNsaXBzZS5qZmFjZS5iYW5uZXJmb250LjA9YWRvYmUtY291cmllci1ib2xkLTE0Ci1vcmcuZWNsaXBzZS5qZmFjZS5oZWFkZXJmb250LjA9bWlzYy1maXhlZC1ib2xkLTE0Ci1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udC4wPWFkb2JlLWNvdXJpZXItcmVndWxhci0xMgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c193aW5kb3dzMjAwMC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c193aW5kb3dzMjAwMC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQwY2UxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL2pmYWNlZm9udHNfd2luZG93czIwMDAucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTIGZvbnQgZmlsZSBmb3IgSkZhY2Ugd2hlbiBydW5uaW5nIHVuZGVyIFdpbmRvd3MgMjAwMAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnLmVjbGlwc2UuamZhY2UuYmFubmVyZm9udC4wPVRhaG9tYS1ib2xkLTEwCi0KLW9yZy5lY2xpcHNlLmpmYWNlLmhlYWRlcmZvbnQuMD1UYWhvbWEtYm9sZC0xMgotCi1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udC4wPUNvdXJpZXIgTmV3LXJlZ3VsYXItMTAKLW9yZy5lY2xpcHNlLmpmYWNlLnRleHRmb250LjE9Q291cmllci1yZWd1bGFyLTEwCi1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udC4yPUx1Y2lkYSBDb25zb2xlLXJlZ3VsYXItOQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c193aW5kb3dzOTgucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL2pmYWNlZm9udHNfd2luZG93czk4LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOWNjMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c193aW5kb3dzOTgucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTIGZvbnQgZmlsZSBmb3IgSkZhY2Ugd2hlbiBydW5uaW5nIHVuZGVyIFdpbmRvd3MgOTgKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5lY2xpcHNlLmpmYWNlLmJhbm5lcmZvbnQuMD1NUyBTYW5zIFNlcmlmLWJvbGQtMTAKLQotb3JnLmVjbGlwc2UuamZhY2UuaGVhZGVyZm9udC4wPU1TIFNhbnMgU2VyaWYtYm9sZC0xMgotCi1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udC4wPUNvdXJpZXIgTmV3LXJlZ3VsYXItMTAKLW9yZy5lY2xpcHNlLmpmYWNlLnRleHRmb250LjE9Q291cmllci1yZWd1bGFyLTEwCi1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udC4yPUx1Y2lkYSBDb25zb2xlLXJlZ3VsYXItOQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c193aW5kb3dzbnQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL2pmYWNlZm9udHNfd2luZG93c250LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNTYxNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c193aW5kb3dzbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTIGZvbnQgZmlsZSBmb3IgSkZhY2Ugd2hlbiBydW5uaW5nIHVuZGVyIFdpbmRvd3MgTlQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5lY2xpcHNlLmpmYWNlLmJhbm5lcmZvbnQuMD1NUyBTYW5zIFNlcmlmLWJvbGQtMTAKLQotb3JnLmVjbGlwc2UuamZhY2UuaGVhZGVyZm9udC4wPU1TIFNhbnMgU2VyaWYtYm9sZC0xMgotCi1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udC4wPUNvdXJpZXIgTmV3LXJlZ3VsYXItMTAKLW9yZy5lY2xpcHNlLmpmYWNlLnRleHRmb250LjE9Q291cmllci1yZWd1bGFyLTEwCi1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udC4yPUx1Y2lkYSBDb25zb2xlLXJlZ3VsYXItOQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c193aW5kb3dzeHAucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL2pmYWNlZm9udHNfd2luZG93c3hwLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYTQ0MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvcmVzb3VyY2UvamZhY2Vmb250c193aW5kb3dzeHAucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTIGZvbnQgZmlsZSBmb3IgSkZhY2Ugd2hlbiBydW5uaW5nIHVuZGVyIFdpbmRvd3MgWFAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5lY2xpcHNlLmpmYWNlLmJhbm5lcmZvbnQuMD1UYWhvbWEtYm9sZC0xMAotCi1vcmcuZWNsaXBzZS5qZmFjZS5oZWFkZXJmb250LjA9VGFob21hLWJvbGQtMTIKLQotb3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQuMD1Db3VyaWVyIE5ldy1yZWd1bGFyLTEwCi1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udC4xPUNvdXJpZXItcmVndWxhci0xMAotb3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQuMj1MdWNpZGEgQ29uc29sZS1yZWd1bGFyLTkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Jlc291cmNlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiNTY4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9yZXNvdXJjZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotUHJvdmlkZXMgc3VwcG9ydCBmb3IgbWFuYWdpbmcgcmVzb3VyY2VzIHN1Y2ggYXMgU1dUCi1mb250cyBhbmQgaW1hZ2VzLgotPGgyPgotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLVRoaXMgcGFja2FnZSBjb250YWlucyBzdXBwb3J0IGZvciBtYW5hZ2luZyByZXNvdXJjZXMsIGluY2x1ZGluZzoKLTx1bD4KLTxsaT4KLWZvbnQgcmVnaXN0cmllcyAoPHR0PkZvbnRSZWdpc3RyeTwvdHQ+KSAtIGZvciBoYW5naW5nIG9uIHRvIHRoZSBTV1QgZm9udAotb2JqZWN0cyBuZWVkZWQgYnkgYW4gYXBwbGljYXRpb248L2xpPgotCi08bGk+Ci1jb2xvciByZWdpc3RyaWVzICg8dHQ+Q29sb3JSZWdpc3RyeTwvdHQ+KSAtIGZvciBoYW5naW5nIG9uIHRvIHRoZSBTV1QgY29sb3IgCi1vYmplY3RzIG5lZWRlZCBieSBhbiBhcHBsaWNhdGlvbjwvbGk+Ci0KLTxsaT4KLWltYWdlIHJlZ2lzdHJpZXMgKDx0dD5JbWFnZVJlZ2lzdHJ5PC90dD4pIC0gZm9yIGhhbmdpbmcgb24gdG8gdGhlIFNXVCBpbWFnZQotb2JqZWN0cyBuZWVkZWQgYnkgYW4gYXBwbGljYXRpb248L2xpPgotCi08bGk+Ci1pbWFnZSBkZXNjcmlwdG9ycyAoPHR0PkltYWdlRGVzY3JpcHRvcjwvdHQ+KSAtIHN1cnJvZ2F0ZSBvYmplY3QgZm9yIGNyZWF0aW5nCi1TV1QgaW1hZ2VzPC9saT4KLQotPGxpPgotc3RyaW5nIGNvbnZlcnNpb24gKDx0dD5TdHJpbmdDb252ZXJ0ZXI8L3R0PikgLSBmb3IgcGFyc2luZyBwcm9wZXJ0eSBmaWxlczwvbGk+Ci08L3VsPgotVGhlIEpGYWNlIHJlc291cmNlcyBtb2R1bGUgaXMgYW4gaW5kZXBlbmRlbnQgSkZhY2UgbW9kdWxlIHJlcXVpcmluZyBhIGJhc2ljCi1rbm93bGVkZ2Ugb2YgU1dUIGFuZCB0aGUgSkZhY2UgcHJvcGVydHkgY2hhbmdlIGV2ZW50IG1lY2hhbmlzbS4gRmFtaWxpYXJpdHkKLXdpdGggb3RoZXIgSkZhY2UgbW9kdWxlcyBpcyBub3QgcmVxdWlyZWQuCi08cD5JbWFnZSBkZXNjcmlwdG9ycyBhcmUgb2JqZWN0cyB0aGF0IGtub3dzIGhvdyB0byBjcmVhdGUgYW4gaW1hZ2Ugb24gZGVtYW5kLgotVGhleSBzZXJ2ZSBhcyBhIGxpZ2h0d2VpZ2h0IHJlcHJlc2VudGF0aW9uIG9mIGltYWdlcyBpbiBzaXR1YXRpb25zIHdoZXJlCi1ubyBTV1QgZGlzcGxheSBleGlzdHMgeWV0LCBhbmQgYXJlIHVzZWQgbWFpbmx5IGluIGNvbmp1bmN0aW9uIHdpdGggaW1hZ2UKLXJlZ2lzdHJpZXMuIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmcmFtZXdvcmssIHdoaWNoCi1pcyBhIHNpbXBsZSBoaWVyYXJjaHkgcm9vdGVkIGF0IHRoZSBhYnN0cmFjdCBjbGFzcyA8dHQ+SW1hZ2VEZXNjcmlwdG9yPC90dD4uCi1UaGUgZnJhbWV3b3JrIGluY2x1ZGVzIGFic3RyYWN0IHN1YmNsYXNzZXMgZm9yIGNvbXBvc2luZyBpbWFnZXMgKDx0dD5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I8L3R0PikKLWFzIHdlbGwgYXMgYSByZWFkeS1tYWRlIGNvbmNyZXRlIHN1YmNsYXNzIGZvciBsb2FkaW5nIGltYWdlcyBmcm9tIGZpbGVzCi0oPHR0PkZpbGVJbWFnZURlc2NyaXB0b3I8L3R0PikuCi08cD5UaGUgY2xhc3MgPHR0PkpGYWNlUmVzb3VyY2VzPC90dD4gbWFpbnRhaW5zIGdsb2JhbCBzdGF0ZSBvbiBiZWhhbGYgb2YKLUpGYWNlIGl0c2VsZiBjb25zaXN0aW5nIG9mIEpGYWNlJ3Mgb3duIGltYWdlIHJlZ2lzdHJ5LCBmb250IHJlZ2lzdHJ5LCByZXNvdXJjZQotYnVuZGxlLCBhbmQgcHJlZmVyZW5jZSBzdG9yZS4KLTxicj4mbmJzcDsKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvQXNzZXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2I2YmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvQXNzZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWw7Ci0KLS8qKgotICogPGNvZGU+QXNzZXJ0PC9jb2RlPiBpcyB1c2VmdWwgZm9yIGZvciBlbWJlZGRpbmcgcnVudGltZSBzYW5pdHkgY2hlY2tzCi0gKiBpbiBjb2RlLiBUaGUgc3RhdGljIHByZWRpY2F0ZSBtZXRob2RzIGFsbCB0ZXN0IGEgY29uZGl0aW9uIGFuZCB0aHJvdyBzb21lCi0gKiB0eXBlIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLgotICogPHA+Ci0gKiBBc3NlcnRpb24gZmFpbHVyZSBleGNlcHRpb25zLCBsaWtlIG1vc3QgcnVudGltZSBleGNlcHRpb25zLCBhcmUKLSAqIHRocm93biB3aGVuIHNvbWV0aGluZyBpcyBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5Ci0gKiB1bnNwZWNpZmllZCBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZCBuZXZlciByZWx5IG9uCi0gKiB0aGVzZSBiZWluZyB0aHJvd24gKG9yIG5vdCB0aHJvd24pLiA8Yj5JZiB5b3UgZmluZCB5b3Vyc2VsZiBpbiB0aGUKLSAqIHBvc2l0aW9uIHdoZXJlIHlvdSBuZWVkIHRvIGNhdGNoIGFuIGFzc2VydGlvbiBmYWlsdXJlLCB5b3UgaGF2ZSBtb3N0IAotICogY2VydGFpbmx5IHdyaXR0ZW4geW91ciBwcm9ncmFtIGluY29ycmVjdGx5LjwvYj4KLSAqIDwvcD4KLSAqIDxwPgotICogTm90ZSB0aGF0IGFuIDxjb2RlPmFzc2VydDwvY29kZT4gc3RhdGVtZW50IGlzIHNsYXRlZCB0byBiZSBhZGRlZCB0byB0aGUKLSAqIEphdmEgbGFuZ3VhZ2UgaW4gSkRLIDEuNCwgcmVuZGluZyB0aGlzIGNsYXNzIG9ic29sZXRlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQotICAgIC8qKgotICAgICAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24KLSAgICAgKiBieSBzb21lIG9mIHRoZSBtZXRob2RzIGluIDxjb2RlPkFzc2VydDwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcyB0aGF0IGNhdGNoIAotICAgICAqIG9yIG90aGVyd2lzZSBkZXBlbmQgb24gYXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBzdXNjZXB0aWJsZSB0byB1bmV4cGVjdGVkCi0gICAgICogYnJlYWthZ2Ugd2hlbiBhc3NlcnRpb25zIGluIHRoZSBjb2RlIGFyZSBhZGRlZCBvciByZW1vdmVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotICAgICAgICAvKioKLSAgICAgICAgICogR2VuZXJhdGVkIHNlcmlhbCB2ZXJzaW9uIFVJRCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgICAgICogQHNpbmNlIDMuMQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1Nzg1MjA3MzUwODAyNDM3Nkw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsKSB7Ci0gICAgICAgICAgICBzdXBlcihkZXRhaWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgQXNzZXJ0KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMKLSAgICAgKiBub3QgPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4KLSAgICAgKiBpcyB0aHJvd24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29tZSBvZiB0aGUgY2hlY2sKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybgotICAgICAqICAgIGlmIHRoZSBjaGVjayBmYWlscykKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24pIHsKLSAgICAgICAgLy8gc3VjY2VlZCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlCi0gICAgICAgIGlmIChleHByZXNzaW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNMZWdhbChleHByZXNzaW9uLCAiIik7Ly8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMKLSAgICAgKiBub3QgPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4KLSAgICAgKiBpcyB0aHJvd24uCi0gICAgICogVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29tZSBvZiB0aGUgY2hlY2sKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybgotICAgICAqICAgIGlmIHRoZSBjaGVjayBmYWlscykKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGlmICghZXhwcmVzc2lvbikKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFzc2VydGlvbiBmYWlsZWQ7ICIgKyBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMKLSAgICAgKiBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKiA8cD4KLSAgICAgKiBBcyBhIGdlbmVyYWwgcnVsZSwgcGFyYW1ldGVycyBwYXNzZWQgdG8gQVBJIG1ldGhvZHMgbXVzdCBub3QgYmUKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiB1bmxlc3MgPGI+ZXhwbGljaXRseTwvYj4gYWxsb3dlZCBpbiB0aGUgbWV0aG9kJ3MKLSAgICAgKiBzcGVjaWZpY2F0aW9uLiBTaW1pbGFybHksIHJlc3VsdHMgcmV0dXJuZWQgZnJvbSBBUEkgbWV0aG9kcyBhcmUgbmV2ZXIKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiB1bmxlc3MgPGI+ZXhwbGljaXRseTwvYj4gYWxsb3dlZCBpbiB0aGUgbWV0aG9kJ3MKLSAgICAgKiBzcGVjaWZpY2F0aW9uLiBJbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gbWFrZSByZWd1bGFyIHVzZSBvZiAKLSAgICAgKiA8Y29kZT5Bc3NlcnQuaXNOb3ROdWxsPC9jb2RlPiB0byBlbnN1cmUgdGhhdCA8Y29kZT5udWxsPC9jb2RlPiAKLSAgICAgKiBwYXJhbWV0ZXJzIGFyZSBkZXRlY3RlZCBhcyBlYXJseSBhcyBwb3NzaWJsZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdmFsdWUgdG8gdGVzdAotICAgICAqIEBleGNlcHRpb24gVGhyb3dhYmxlIGFuIHVuc3BlY2lmaWVkIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIG9iamVjdAotICAgICAqICAgaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgLy8gc3VjY2VlZCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlCi0gICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlzTm90TnVsbChvYmplY3QsICIiKTsvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzCi0gICAgICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgICogVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0gICAgICogPHA+Ci0gICAgICogQXMgYSBnZW5lcmFsIHJ1bGUsIHBhcmFtZXRlcnMgcGFzc2VkIHRvIEFQSSBtZXRob2RzIG11c3Qgbm90IGJlCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gdW5sZXNzIDxiPmV4cGxpY2l0bHk8L2I+IGFsbG93ZWQgaW4gdGhlIG1ldGhvZCdzCi0gICAgICogc3BlY2lmaWNhdGlvbi4gU2ltaWxhcmx5LCByZXN1bHRzIHJldHVybmVkIGZyb20gQVBJIG1ldGhvZHMgYXJlIG5ldmVyCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gdW5sZXNzIDxiPmV4cGxpY2l0bHk8L2I+IGFsbG93ZWQgaW4gdGhlIG1ldGhvZCdzCi0gICAgICogc3BlY2lmaWNhdGlvbi4gSW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIG1ha2UgcmVndWxhciB1c2Ugb2YgCi0gICAgICogPGNvZGU+QXNzZXJ0LmlzTm90TnVsbDwvY29kZT4gdG8gZW5zdXJlIHRoYXQgPGNvZGU+bnVsbDwvY29kZT4gCi0gICAgICogcGFyYW1ldGVycyBhcmUgZGV0ZWN0ZWQgYXMgZWFybHkgYXMgcG9zc2libGUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHZhbHVlIHRvIHRlc3QKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLSAgICAgKiBAZXhjZXB0aW9uIFRocm93YWJsZSBhbiB1bnNwZWNpZmllZCB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBvYmplY3QKLSAgICAgKiAgIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJudWxsIGFyZ3VtZW50OyIgKyBtZXNzYWdlKTsvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzCi0gICAgICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29tZSBvZiB0aGUgY2hlY2sKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybgotICAgICAqICAgIGlmIHRoZSBjaGVjayBmYWlscykKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbikgewotICAgICAgICAvLyBzdWNjZWVkIGFzIHF1aWNrbHkgYXMgcG9zc2libGUKLSAgICAgICAgaWYgKGV4cHJlc3Npb24pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1RydWUoZXhwcmVzc2lvbiwgIiIpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMKLSAgICAgKiBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBvdXRjb21lIG9mIHRoZSBjaGVjawotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuCi0gICAgICogICAgaWYgdGhlIGNoZWNrIGZhaWxzKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBpZiAoIWV4cHJlc3Npb24pCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJBc3NlcnRpb24gZmFpbGVkOiAiICsgbWVzc2FnZSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL0RlbGVnYXRpbmdEcmFnQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9EZWxlZ2F0aW5nRHJhZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxNTQyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL0RlbGVnYXRpbmdEcmFnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLQotLyoqCi0gKiBBIDxjb2RlPkRlbGVnYXRpbmdEcmFnQWRhcHRlcjwvY29kZT4gaXMgYSA8Y29kZT5EcmFnU291cmNlTGlzdGVuZXI8L2NvZGU+IHRoYXQgIAotICogbWFpbnRhaW5zIGFuZCBkZWxlZ2F0ZXMgdG8gYSBzZXQgb2Yge0BsaW5rIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyfXMuIEVhY2ggCi0gKiBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lciBjYW4gdGhlbiBiZSBpbXBsZW1lbnRlZCBhcyBpZiBpdCB3ZXJlIHRoZSAKLSAqIDxjb2RlPkRyYWdTb3VyY2UnczwvY29kZT4gb25seSBEcmFnU291cmNlTGlzdGVuZXIuCi0gKiA8cD4KLSAqIFdoZW4gYSBkcmFnIGlzIHN0YXJ0ZWQsIGEgc3Vic2V0IG9mIGFsbCA8Y29kZT5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnM8L2NvZGU+Ci0gKiBpcyBnZW5lcmF0ZWQgYW5kIHN0b3JlZCBpbiBhIGxpc3Qgb2YgPGk+YWN0aXZlPC9pPiBsaXN0ZW5lcnMuIFRoaXMgc3Vic2V0IGlzCi0gKiBjYWxjdWxhdGVkIGJ5IGZvcndhcmRpbmcge0BsaW5rIERyYWdTb3VyY2VMaXN0ZW5lciNkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50KX0gdG8gCi0gKiBldmVyeSBsaXN0ZW5lciwgYW5kIGNoZWNraW5nIGlmIHRoZSB7QGxpbmsgRHJhZ1NvdXJjZUV2ZW50I2RvaXQgZG9pdH0gZmllbGQgaXMgbGVmdCAKLSAqIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPi4KLSAqIDwvcD4gCi0gKiBUaGUgPGNvZGU+RHJhZ1NvdXJjZTwvY29kZT4ncyBzZXQgb2Ygc3VwcG9ydGVkIFRyYW5zZmVyIHR5cGVzICh7QGxpbmsKLSAqIERyYWdTb3VyY2Ujc2V0VHJhbnNmZXIoVHJhbnNmZXJbXSl9KSBpcyB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIFRyYW5zZmVyIHR5cGVzCi0gKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBhY3RpdmUgbGlzdGVuZXIgc3Vic2V0LgotICogPHA+Ci0gKiBJZiBhbmQgd2hlbiB7QGxpbmsgI2RyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCl9IGlzIGNhbGxlZCwgYSBzaW5nbGUKLSAqIDxjb2RlPlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyPC9jb2RlPiBpcyBjaG9zZW4sIGFuZCBvbmx5IGl0IGlzIGFsbG93ZWQgdG8gc2V0IHRoZQotICogZHJhZyBkYXRhLiBUaGUgY2hvc2VuIGxpc3RlbmVyIGlzIHRoZSBmaXJzdCBsaXN0ZW5lciBpbiB0aGUgc3Vic2V0IG9mIGFjdGl2ZSBsaXN0ZW5lcnMKLSAqIHdob3NlIFRyYW5zZmVyIHN1cHBvcnRzICh7QGxpbmsgVHJhbnNmZXIjaXNTdXBwb3J0ZWRUeXBlKFRyYW5zZmVyRGF0YSl9KSB0aGUgCi0gKiA8Y29kZT5kYXRhVHlwZTwvY29kZT4gaW4gdGhlIDxjb2RlPkRyYWdTb3VyY2VFdmVudDwvY29kZT4uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzbmlwcGV0IHNob3dzIGEgPGNvZGU+RGVsZWdhdGluZ0RyYWdBZGFwdGVyPC9jb2RlPiB3aXRoIHR3bwotICogPGNvZGU+VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzPC9jb2RlPi4gT25lIGltcGxlbWVudHMgZHJhZyBvZiB0ZXh0IHN0cmluZ3MsIAotICogdGhlIG90aGVyIHN1cHBvcnRzIGZpbGUgdHJhbnNmZXIgYW5kIGRlbW9uc3RyYXRlcyBob3cgYSBsaXN0ZW5lciBjYW4gYmUgZGlzYWJsZWQgdXNpbmcKLSAqIHRoZSBkcmFnU3RhcnQgbWV0aG9kLiAKLSAqIDwvcD4KLSAqIDxjb2RlPjxwcmU+Ci0gKgkJZmluYWwgVHJlZVZpZXdlciB2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihzaGVsbCwgU1dULk5PTkUpOwotICoJCQotICoJCURlbGVnYXRpbmdEcmFnQWRhcHRlciBkcmFnQWRhcHRlciA9IG5ldyBEZWxlZ2F0aW5nRHJhZ0FkYXB0ZXIoKTsJCQotICoJCWRyYWdBZGFwdGVyLmFkZERyYWdTb3VyY2VMaXN0ZW5lcihuZXcgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0gKgkJCXB1YmxpYyBUcmFuc2ZlciBnZXRUcmFuc2ZlcigpIHsKLSAqCQkJCXJldHVybiBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLSAqCQkJfQotICoJCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0gKgkJCQkvLyBhbHdheXMgZW5hYmxlZCwgY2FuIGNvbnRyb2wgZW5hYmxlbWVudCBiYXNlZCBvbiBzZWxlY3Rpb24gZXRjLgotICoJCQl9Ci0gKgkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotICoJCQkJZXZlbnQuZGF0YSA9ICJUcmFuc2ZlciBkYXRhIjsKLSAqCQkJfQotICoJCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0gKgkJCQkvLyBubyBjbGVhbi11cCByZXF1aXJlZAotICoJCQl9Ci0gKgkJfSk7Ci0gKgkJZHJhZ0FkYXB0ZXIuYWRkRHJhZ1NvdXJjZUxpc3RlbmVyKG5ldyBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLSAqCQkJcHVibGljIFRyYW5zZmVyIGdldFRyYW5zZmVyKCkgewotICoJCQkJcmV0dXJuIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotICoJCQl9Ci0gKgkJCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLSAqCQkJCS8vIGVuYWJsZSBkcmFnIGxpc3RlbmVyIGlmIHRoZXJlIGlzIGEgdmlld2VyIHNlbGVjdGlvbgotICoJCQkJZXZlbnQuZG9pdCA9ICF2aWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpOwotICoJCQl9Ci0gKgkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotICoJCQkJRmlsZSBmaWxlMSA9IG5ldyBGaWxlKCJDOi90ZW1wL2ZpbGUxIik7Ci0gKgkJCQlGaWxlIGZpbGUyID0gbmV3IEZpbGUoIkM6L3RlbXAvZmlsZTIiKTsKLSAqCQkJCWV2ZW50LmRhdGEgPSBuZXcgU3RyaW5nW10ge2ZpbGUxLmdldEFic29sdXRlUGF0aCgpLCBmaWxlMi5nZXRBYnNvbHV0ZVBhdGgoKX07Ci0gKgkJCX0KLSAqCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotICoJCQkJLy8gbm8gY2xlYW4tdXAgcmVxdWlyZWQKLSAqCQkJfQotICoJCX0pOwotICoJCXZpZXdlci5hZGREcmFnU3VwcG9ydChETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSwgZHJhZ0FkYXB0ZXIuZ2V0VHJhbnNmZXJzKCksIGRyYWdBZGFwdGVyKTsKLSAqIDwvcHJlPjwvY29kZT4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdEcmFnQWRhcHRlciBpbXBsZW1lbnRzIERyYWdTb3VyY2VMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgTGlzdCBhY3RpdmVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwcml2YXRlIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyIGN1cnJlbnRMaXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIDxjb2RlPlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIG5ldyBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZERyYWdTb3VyY2VMaXN0ZW5lcihUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZHJvcCBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4gVGhpcyBldmVudCBpcyBmb3J3YXJkZWQgdG8gdGhlIGN1cnJlbnQgCi0gICAgICogZHJhZyBsaXN0ZW5lci4KLSAgICAgKiBEb2Vzbid0IHVwZGF0ZSB0aGUgY3VycmVudCBsaXN0ZW5lciwgc2luY2UgdGhlIGN1cnJlbnQgbGlzdGVuZXIgIGlzIGFscmVhZHkgdGhlIG9uZQotICAgICAqIHRoYXQgY29tcGxldGVkIHRoZSBkcmFnIG9wZXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGRyYWcgc291cmNlIGV2ZW50Ci0gICAgICogQHNlZSBEcmFnU291cmNlTGlzdGVuZXIjZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoZmluYWwgRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vCQlpZiAoUG9saWN5LkRFQlVHX0RSQUdfRFJPUCkKLSAgICAgICAgLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRyYWcgRmluaXNoZWQ6ICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBsaXN0ZW5lciB0aGF0IGNhbiBoYW5kbGUgdGhlIGRyb3AsIGRlbGVnYXRlIHRoZSBldmVudAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGlzdGVuZXIuZHJhZ0ZpbmlzaGVkKGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZHJhZyB3YXMgY2FuY2VsZWQgYW5kIGN1cnJlbnRMaXN0ZW5lciB3YXMgbmV2ZXIgc2V0LCBzbyBzZW5kIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBkcmFnRmluaXNoZWQgZXZlbnQgdG8gYWxsIHRoZSBhY3RpdmUgbGlzdGVuZXJzLiAKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3RpdmVMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICgoVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIpIGl0ZXJhdG9yLm5leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRyYWdGaW5pc2hlZChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgY3VycmVudExpc3RlbmVyID0gbnVsbDsKLSAgICAgICAgYWN0aXZlTGlzdGVuZXJzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGRyb3AgZGF0YSBpcyByZXF1ZXN0ZWQuCi0gICAgICogVXBkYXRlcyB0aGUgY3VycmVudCBsaXN0ZW5lciBhbmQgdGhlbiBmb3J3YXJkcyB0aGUgZXZlbnQgdG8gaXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBkcmFnIHNvdXJjZSBldmVudAotICAgICAqIEBzZWUgRHJhZ1NvdXJjZUxpc3RlbmVyI2RyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShmaW5hbCBEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgLy8JCWlmIChQb2xpY3kuREVCVUdfRFJBR19EUk9QKQotICAgICAgICAvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRHJhZyBTZXQgRGF0YTogIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgdXBkYXRlQ3VycmVudExpc3RlbmVyKGV2ZW50KTsgLy8gZmluZCBhIGxpc3RlbmVyIHRoYXQgY2FuIHByb3ZpZGUgdGhlIGdpdmVuIGRhdGEgdHlwZQotICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgCVNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudExpc3RlbmVyLmRyYWdTZXREYXRhKGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgZHJhZyBvcGVyYXRpb24gaGFzIHN0YXJ0ZWQuCi0gICAgICogRm9yd2FyZHMgdGhpcyBldmVudCB0byBlYWNoIGxpc3RlbmVyLiBBIGxpc3RlbmVyIG11c3Qgc2V0IDxjb2RlPmV2ZW50LmRvaXQ8L2NvZGU+IAotICAgICAqIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBjYW5ub3QgaGFuZGxlIHRoZSBkcmFnIG9wZXJhdGlvbi4gSWYgYSBsaXN0ZW5lciBjYW4gIAotICAgICAqIGhhbmRsZSB0aGUgZHJhZywgaXQgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgYWN0aXZlIGxpc3RlbmVycy4gIAotICAgICAqIFRoZSBkcmFnIGlzIGFib3J0ZWQgaWYgdGhlcmUgYXJlIG5vIGxpc3RlbmVycyB0aGF0IGNhbiBoYW5kbGUgaXQuICAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGRyYWcgc291cmNlIGV2ZW50Ci0gICAgICogQHNlZSBEcmFnU291cmNlTGlzdGVuZXIjZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkcmFnU3RhcnQoZmluYWwgRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vCQlpZiAoUG9saWN5LkRFQlVHX0RSQUdfRFJPUCkKLSAgICAgICAgLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRyYWcgU3RhcnQ6ICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBib29sZWFuIGRvaXQgPSBmYWxzZTsgLy8gdHJ1ZSBpZiBhbnkgb25lIG9mIHRoZSBsaXN0ZW5lcnMgY2FuIGhhbmRsZSB0aGUgZHJhZwotICAgICAgICBMaXN0IHRyYW5zZmVycyA9IG5ldyBBcnJheUxpc3QobGlzdGVuZXJzLnNpemUoKSk7Ci0KLSAgICAgICAgYWN0aXZlTGlzdGVuZXJzLmNsZWFyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lciBsaXN0ZW5lciA9IChUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcikgbGlzdGVuZXJzCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoaSk7Ci0gICAgICAgICAgICBldmVudC5kb2l0ID0gdHJ1ZTsgLy8gcmVzdG9yZSBldmVudC5kb2l0Ci0gICAgICAgICAgICBTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmRyYWdTdGFydChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBpZiAoZXZlbnQuZG9pdCkgeyAvLyB0aGUgbGlzdGVuZXIgY2FuIGhhbmRsZSB0aGlzIGRyYWcKLSAgICAgICAgICAgICAgICB0cmFuc2ZlcnMuYWRkKGxpc3RlbmVyLmdldFRyYW5zZmVyKCkpOwotICAgICAgICAgICAgICAgIGFjdGl2ZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZG9pdCB8PSBldmVudC5kb2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRvaXQpCi0gICAgICAgICAgICAoKERyYWdTb3VyY2UpIGV2ZW50LndpZGdldCkuc2V0VHJhbnNmZXIoKFRyYW5zZmVyW10pIHRyYW5zZmVycwotICAgICAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgVHJhbnNmZXJbdHJhbnNmZXJzLnNpemUoKV0pKTsKLQotICAgICAgICBldmVudC5kb2l0ID0gZG9pdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5UcmFuc2Zlcjxjb2RlPnMgZnJvbSBldmVyeSA8Y29kZT5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjwvY29kZT4uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29tYmluZWQgPGNvZGU+VHJhbnNmZXI8L2NvZGU+cwotICAgICAqLwotICAgIHB1YmxpYyBUcmFuc2ZlcltdIGdldFRyYW5zZmVycygpIHsKLSAgICAgICAgVHJhbnNmZXJbXSB0eXBlcyA9IG5ldyBUcmFuc2ZlcltsaXN0ZW5lcnMuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyIGxpc3RlbmVyID0gKFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyKSBsaXN0ZW5lcnMKLSAgICAgICAgICAgICAgICAgICAgLmdldChpKTsKLSAgICAgICAgICAgIHR5cGVzW2ldID0gbGlzdGVuZXIuZ2V0VHJhbnNmZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIHRvIGRlbGVnYXRlIGRyYWcgZXZlbnRzIHRvLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIDxjb2RlPlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyczwvY29kZT4KLSAgICAgKiAJPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gbGlzdGVuZXJzLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiA8Y29kZT5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjwvY29kZT4uCi0gICAgICogTGlzdGVuZXJzIHNob3VsZCBub3QgYmUgcmVtb3ZlZCB3aGlsZSBhIGRyYWcgYW5kIGRyb3Agb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIDxjb2RlPlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyPC9jb2RlPiB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVEcmFnU291cmNlTGlzdGVuZXIoVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgICAgIGlmIChjdXJyZW50TGlzdGVuZXIgPT0gbGlzdGVuZXIpCi0gICAgICAgICAgICBjdXJyZW50TGlzdGVuZXIgPSBudWxsOwotICAgICAgICBpZiAoYWN0aXZlTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICAgICAgICAgIGFjdGl2ZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGN1cnJlbnQgbGlzdGVuZXIgdG8gb25lIHRoYXQgY2FuIGhhbmRsZSB0aGUgZHJhZy4gVGhlcmUgY2FuIAotICAgICAqIGJlIG1hbnkgbGlzdGVuZXJzIGFuZCBlYWNoIGxpc3RlbmVyIG1heSBiZSBhYmxlIHRvIGhhbmRsZSBtYW55IDxjb2RlPlRyYW5zZmVyRGF0YTwvY29kZT4gCi0gICAgICogdHlwZXMuICBUaGUgZmlyc3QgbGlzdGVuZXIgZm91bmQgdGhhdCBzdXBwb3J0cyBvbmUgb2YgdGhlIDxjb2RlPlRyYW5zZmVyRGF0YTwvb2RlPiAKLSAgICAgKiB0eXBlcyBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPkRyYWdTb3VyY2VFdmVudDwvY29kZT4gd2lsbCBiZSBzZWxlY3RlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGRyYWcgc291cmNlIGV2ZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUN1cnJlbnRMaXN0ZW5lcihEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgY3VycmVudExpc3RlbmVyID0gbnVsbDsKLSAgICAgICAgaWYgKGV2ZW50LmRhdGFUeXBlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWN0aXZlTGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyIGxpc3RlbmVyID0gKFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyKSBpdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAobGlzdGVuZXIuZ2V0VHJhbnNmZXIoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8JCQkJaWYgKFBvbGljeS5ERUJVR19EUkFHX0RST1ApCi0gICAgICAgICAgICAgICAgLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ3VycmVudCBkcmFnIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCQkJCi0gICAgICAgICAgICAgICAgY3VycmVudExpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL0RlbGVnYXRpbmdEcm9wQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9EZWxlZ2F0aW5nRHJvcEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxNzc4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL0RlbGVnYXRpbmdEcm9wQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotCi0vKioKLSAqIEEgPGNvZGU+RGVsZWdhdGluZ0Ryb3BBZGFwdGVyPC9jb2RlPiBpcyBhIDxjb2RlPkRyb3BUYXJnZXRMaXN0ZW5lcjwvY29kZT4gdGhhdCAKLSAqIG1haW50YWlucyBhbmQgZGVsZWdhdGVzIHRvIGEgc2V0IG9mIHtAbGluayBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcn1zLiBFYWNoIAotICogPGNvZGU+VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXI8L2NvZGU+IGNhbiB0aGVuIGJlIGltcGxlbWVudGVkIGFzIGlmIGl0IHdlcmUgCi0gKiB0aGUgRHJvcFRhcmdldCdzIG9ubHkgPGNvZGU+RHJvcFRhcmdldExpc3RlbmVyPC9jb2RlPi4KLSAqIDxwPgotICogT24gPGNvZGU+ZHJhZ0VudGVyPC9jb2RlPiwgPGNvZGU+ZHJhZ09wZXJhdGlvbkNoYW5nZWQ8L2NvZGU+LCA8Y29kZT5kcmFnT3ZlcjwvY29kZT4KLSAqIGFuZCA8Y29kZT5kcm9wPC9jb2RlPiwgYSA8aT5jdXJyZW50PC9pPiBsaXN0ZW5lciBpcyBvYnRhaW5lZCBmcm9tIHRoZSBzZXQgb2YgYWxsIAotICogPGNvZGU+VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzPC9jb2RlPi4gVGhlIGN1cnJlbnQgbGlzdGVuZXIgaXMgdGhlIGZpcnN0IGxpc3RlbmVyIAotICogdG8gcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGZvciAKLSAqIHtAbGluayBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lciNpc0VuYWJsZWQoRHJvcFRhcmdldEV2ZW50KX0uCi0gKiBUaGUgY3VycmVudCBsaXN0ZW5lciBpcyBmb3J3YXJkZWQgYWxsIDxjb2RlPkRyb3BUYXJnZXRFdmVudHM8L2NvZGU+IHVudGlsIHNvbWUgb3RoZXIKLSAqIGxpc3RlbmVyIGJlY29tZXMgdGhlIGN1cnJlbnQgbGlzdGVuZXIsIG9yIHRoZSBkcm9wIHRlcm1pbmF0ZXMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEFmdGVyIGFkZGluZyBhbGwgPGNvZGU+VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzPC9jb2RlPiB0byB0aGUgCi0gKiA8Y29kZT5EZWxlZ2F0aW5nRHJvcEFkYXB0ZXI8L2NvZGU+IHRoZSBjb21iaW5lZCBzZXQgb2YgPGNvZGU+VHJhbnNmZXJzPC9jb2RlPiBzaG91bGQgCi0gKiBiZSBzZXQgaW4gdGhlIFNXVCA8Y29kZT5Ecm9wVGFyZ2V0PC9jb2RlPi4gPGNvZGU+I2dldFRyYW5zZmVycygpPC9jb2RlPiBwcm92aWRlcyB0aGUgCi0gKiBzZXQgb2YgPGNvZGU+VHJhbnNmZXI8L2NvZGU+IHR5cGVzIG9mIGFsbCA8Y29kZT5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnM8L2NvZGU+LiAKLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNuaXBwZXQgc2hvd3MgYSA8Y29kZT5EZWxlZ2F0aW5nRHJvcEFkYXB0ZXI8L2NvZGU+IHdpdGggdHdvCi0gKiA8Y29kZT5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnM8L2NvZGU+LiBPbmUgc3VwcG9ydHMgZHJvcHBpbmcgcmVzb3VyY2VzIGFuZCAKLSAqIGRlbW9uc3RyYXRlcyBob3cgYSBsaXN0ZW5lciBjYW4gYmUgZGlzYWJsZWQgaW4gdGhlIGlzRW5hYmxlZCBtZXRob2QuIAotICogVGhlIG90aGVyIGxpc3RlbmVyIHN1cHBvcnRzIHRleHQgdHJhbnNmZXIuIAotICogPC9wPgotICogPGNvZGU+PHByZT4KLSAqCQlmaW5hbCBUcmVlVmlld2VyIHZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0gKiAJCURlbGVnYXRpbmdEcm9wQWRhcHRlciBkcm9wQWRhcHRlciA9IG5ldyBEZWxlZ2F0aW5nRHJvcEFkYXB0ZXIoKTsKLSAqCQlkcm9wQWRhcHRlci5hZGREcm9wVGFyZ2V0TGlzdGVuZXIobmV3IFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyKCkgewotICoJCQlwdWJsaWMgVHJhbnNmZXIgZ2V0VHJhbnNmZXIoKSB7Ci0gKgkJCQlyZXR1cm4gUmVzb3VyY2VUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotICoJCQl9Ci0gKgkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLSAqCQkJCS8vIGRpc2FibGUgZHJvcCBsaXN0ZW5lciBpZiB0aGVyZSBpcyBubyB2aWV3ZXIgc2VsZWN0aW9uCi0gKgkJCQlpZiAodmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLSAqCQkJCQlyZXR1cm4gZmFsc2U7Ci0gKgkJCQlyZXR1cm4gdHJ1ZTsKLSAqCQkJfQotICoJCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7fQotICoJCQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7fQotICoJCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHt9Ci0gKgkJCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkge30KLSAqCQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLSAqCQkJCWlmIChldmVudC5kYXRhID09IG51bGwpCi0gKgkJCQkJcmV0dXJuOwotICoJCQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gKElSZXNvdXJjZVtdKSBldmVudC5kYXRhOwotICoJCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9DT1BZKSB7Ci0gKgkJCQkJLy8gY29weSByZXNvdXJjZXMKLSAqCQkJCX0gZWxzZSB7Ci0gKgkJCQkJLy8gbW92ZSByZXNvdXJjZXMKLSAqCQkJCX0KLSAqCQkJCQkKLSAqCQkJfQotICoJCQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkge30KLSAqCQl9KTsKLSAqCQlkcm9wQWRhcHRlci5hZGREcm9wVGFyZ2V0TGlzdGVuZXIobmV3IFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyKCkgewotICoJCQlwdWJsaWMgVHJhbnNmZXIgZ2V0VHJhbnNmZXIoKSB7Ci0gKgkJCQlyZXR1cm4gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0gKgkJCX0KLSAqCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotICoJCQkJcmV0dXJuIHRydWU7Ci0gKgkJCX0KLSAqCQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkge30KLSAqCQkJcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkge30KLSAqCQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7fQotICoJCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHt9Ci0gKgkJCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0gKgkJCQlpZiAoZXZlbnQuZGF0YSA9PSBudWxsKQotICoJCQkJCXJldHVybjsKLSAqCQkJCVN5c3RlbS5vdXQucHJpbnRsbihldmVudC5kYXRhKTsKLSAqCQkJfQotICoJCQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkge30KLSAqCQl9KTsJCQotICoJCXZpZXdlci5hZGREcm9wU3VwcG9ydChETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSwgZHJvcEFkYXB0ZXIuZ2V0VHJhbnNmZXJzKCksIGRyb3BBZGFwdGVyKTsKLSAqIDwvcHJlPjwvY29kZT4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdEcm9wQWRhcHRlciBpbXBsZW1lbnRzIERyb3BUYXJnZXRMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIgY3VycmVudExpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBpbnQgb3JpZ2luYWxEcm9wVHlwZTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIDxjb2RlPlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIG5ldyBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZERyb3BUYXJnZXRMaXN0ZW5lcihUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3Vyc29yIGhhcyBlbnRlcmVkIHRoZSBkcm9wIHRhcmdldCBib3VuZGFyaWVzLiBUaGUgY3VycmVudCBsaXN0ZW5lciBpcyAKLSAgICAgKiB1cGRhdGVkLCBhbmQgPGNvZGU+I2RyYWdFbnRlcigpPC9jb2RlPiBpcyBmb3J3YXJkZWQgdG8gdGhlIGN1cnJlbnQgbGlzdGVuZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBkcm9wIHRhcmdldCBldmVudCAKLSAgICAgKiBAc2VlIERyb3BUYXJnZXRMaXN0ZW5lciNkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgLy8JCWlmIChQb2xpY3kuREVCVUdfRFJBR19EUk9QKQotICAgICAgICAvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRHJhZyBFbnRlcjogIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG9yaWdpbmFsRHJvcFR5cGUgPSBldmVudC5kZXRhaWw7Ci0gICAgICAgIHVwZGF0ZUN1cnJlbnRMaXN0ZW5lcihldmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnNvciBoYXMgbGVmdCB0aGUgZHJvcCB0YXJnZXQgYm91bmRhcmllcy4gVGhlIGV2ZW50IGlzIGZvcndhcmRlZCB0byB0aGUgCi0gICAgICogY3VycmVudCBsaXN0ZW5lci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGRyb3AgdGFyZ2V0IGV2ZW50Ci0gICAgICogQHNlZSBEcm9wVGFyZ2V0TGlzdGVuZXIjZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkcmFnTGVhdmUoZmluYWwgRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vCQlpZiAoUG9saWN5LkRFQlVHX0RSQUdfRFJPUCkKLSAgICAgICAgLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRyYWcgTGVhdmU6ICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRDdXJyZW50TGlzdGVuZXIobnVsbCwgZXZlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIGhhcyBjaGFuZ2VkICh1c3VhbGx5IGR1ZSB0byB0aGUgdXNlciBjaGFuZ2luZyAKLSAgICAgKiBhIGRyYWcgbW9kaWZpZXIga2V5IHdoaWxlIGRyYWdnaW5nKS4gVXBkYXRlcyB0aGUgY3VycmVudCBsaXN0ZW5lciBhbmQgZm9yd2FyZHMgCi0gICAgICogdGhpcyBldmVudCB0byB0aGF0IGxpc3RlbmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgZHJvcCB0YXJnZXQgZXZlbnQKLSAgICAgKiBAc2VlIERyb3BUYXJnZXRMaXN0ZW5lciNkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoZmluYWwgRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vCQlpZiAoUG9saWN5LkRFQlVHX0RSQUdfRFJPUCkKLSAgICAgICAgLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRyYWcgT3BlcmF0aW9uIENoYW5nZWQgdG86ICIgKyBldmVudC5kZXRhaWwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG9yaWdpbmFsRHJvcFR5cGUgPSBldmVudC5kZXRhaWw7Ci0gICAgICAgIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyIG9sZExpc3RlbmVyID0gZ2V0Q3VycmVudExpc3RlbmVyKCk7Ci0gICAgICAgIHVwZGF0ZUN1cnJlbnRMaXN0ZW5lcihldmVudCk7Ci0gICAgICAgIGZpbmFsIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyIG5ld0xpc3RlbmVyID0gZ2V0Q3VycmVudExpc3RlbmVyKCk7Ci0gICAgICAgIC8vIG9ubHkgbm90aWZ5IHRoZSBjdXJyZW50IGxpc3RlbmVyIGlmIGl0IGhhc24ndCBjaGFuZ2VkIGJhc2VkIG9uIHRoZSAKLSAgICAgICAgLy8gb3BlcmF0aW9uIGNoYW5nZS4gb3RoZXJ3aXNlIHRoZSBuZXcgbGlzdGVuZXIgd291bGQgZ2V0IGEgZHJhZ0VudGVyIAotICAgICAgICAvLyBmb2xsb3dlZCBieSBhIGRyYWdPcGVyYXRpb25DaGFuZ2VkIHdpdGggdGhlIGV4YWN0IHNhbWUgZXZlbnQuIAotICAgICAgICBpZiAobmV3TGlzdGVuZXIgIT0gbnVsbCAmJiBuZXdMaXN0ZW5lciA9PSBvbGRMaXN0ZW5lcikgewotICAgICAgICAgICAgU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBuZXdMaXN0ZW5lci5kcmFnT3BlcmF0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3Vyc29yIGlzIG1vdmluZyBvdmVyIHRoZSBkcm9wIHRhcmdldC4gVXBkYXRlcyB0aGUgY3VycmVudCBsaXN0ZW5lciBhbmQgCi0gICAgICogZm9yd2FyZHMgdGhpcyBldmVudCB0byB0aGF0IGxpc3RlbmVyLiBJZiBubyBsaXN0ZW5lciBjYW4gaGFuZGxlIHRoZSBkcmFnIAotICAgICAqIG9wZXJhdGlvbiB0aGUgPGNvZGU+ZXZlbnQuZGV0YWlsPC9jb2RlPiBmaWVsZCBpcyBzZXQgdG8gPGNvZGU+RE5ELkRST1BfTk9ORTwvY29kZT4gCi0gICAgICogdG8gaW5kaWNhdGUgYW4gaW52YWxpZCBkcm9wLgotICAgICAqICAgCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBkcm9wIHRhcmdldCBldmVudAotICAgICAqIEBzZWUgRHJvcFRhcmdldExpc3RlbmVyI2RyYWdPdmVyKERyb3BUYXJnZXRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkcmFnT3ZlcihmaW5hbCBEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIgb2xkTGlzdGVuZXIgPSBnZXRDdXJyZW50TGlzdGVuZXIoKTsKLSAgICAgICAgdXBkYXRlQ3VycmVudExpc3RlbmVyKGV2ZW50KTsKLSAgICAgICAgZmluYWwgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIgbmV3TGlzdGVuZXIgPSBnZXRDdXJyZW50TGlzdGVuZXIoKTsKLQotICAgICAgICAvLyBvbmx5IG5vdGlmeSB0aGUgY3VycmVudCBsaXN0ZW5lciBpZiBpdCBoYXNuJ3QgY2hhbmdlZCBiYXNlZCBvbiB0aGUgCi0gICAgICAgIC8vIGRyYWcgb3Zlci4gb3RoZXJ3aXNlIHRoZSBuZXcgbGlzdGVuZXIgd291bGQgZ2V0IGEgZHJhZ0VudGVyIAotICAgICAgICAvLyBmb2xsb3dlZCBieSBhIGRyYWdPdmVyIHdpdGggdGhlIGV4YWN0IHNhbWUgZXZlbnQuIAotICAgICAgICBpZiAobmV3TGlzdGVuZXIgIT0gbnVsbCAmJiBuZXdMaXN0ZW5lciA9PSBvbGRMaXN0ZW5lcikgewotICAgICAgICAJU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBuZXdMaXN0ZW5lci5kcmFnT3ZlcihldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3J3YXJkcyB0aGlzIGV2ZW50IHRvIHRoZSBjdXJyZW50IGxpc3RlbmVyLCBpZiB0aGVyZSBpcyBvbmUuIFNldHMgdGhlCi0gICAgICogY3VycmVudCBsaXN0ZW5lciB0byA8Y29kZT5udWxsPC9jb2RlPiBhZnRlcndhcmRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgZHJvcCB0YXJnZXQgZXZlbnQKLSAgICAgKiBAc2VlIERyb3BUYXJnZXRMaXN0ZW5lciNkcm9wKERyb3BUYXJnZXRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkcm9wKGZpbmFsIERyb3BUYXJnZXRFdmVudCBldmVudCkgewotICAgICAgICAvLwkJaWYgKFBvbGljeS5ERUJVR19EUkFHX0RST1ApCi0gICAgICAgIC8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJEcm9wOiAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXBkYXRlQ3VycmVudExpc3RlbmVyKGV2ZW50KTsKLSAgICAgICAgaWYgKGdldEN1cnJlbnRMaXN0ZW5lcigpICE9IG51bGwpIHsKLSAgICAgICAgCVNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudExpc3RlbmVyKCkuZHJvcChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0Q3VycmVudExpc3RlbmVyKG51bGwsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3J3YXJkcyB0aGlzIGV2ZW50IHRvIHRoZSBjdXJyZW50IGxpc3RlbmVyIGlmIHRoZXJlIGlzIG9uZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGRyb3AgdGFyZ2V0IGV2ZW50Ci0gICAgICogQHNlZSBEcm9wVGFyZ2V0TGlzdGVuZXIjZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZHJvcEFjY2VwdChmaW5hbCBEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgLy8JCWlmIChQb2xpY3kuREVCVUdfRFJBR19EUk9QKQotICAgICAgICAvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRHJvcCBBY2NlcHQ6ICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoZ2V0Q3VycmVudExpc3RlbmVyKCkgIT0gbnVsbCkgewotICAgICAgICAJU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50TGlzdGVuZXIoKS5kcm9wQWNjZXB0KGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3RlbmVyIHdoaWNoIGN1cnJlbnRseSBoYW5kbGVzIGRyb3AgZXZlbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyPC9jb2RlPiB3aGljaCBjdXJyZW50bHkgCi0gICAgICogCWhhbmRsZXMgZHJvcCBldmVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lciBnZXRDdXJyZW50TGlzdGVuZXIoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50TGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHJhbnNmZXIgZGF0YSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgZ2l2ZW4gbGlzdGVuZXIuCi0gICAgICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdGVuZXIgZG9lcyBub3Qgc3VwcG9ydCBhbnkgb2YgdGhlICAgCi0gICAgICogc3BlY2lmaWVkIGRhdGEgdHlwZXMuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZXMgYXZhaWxhYmxlIGRhdGEgdHlwZXMKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgPGNvZGU+VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXI8L2NvZGU+IHRvIHVzZSBmb3IgdGVzdGluZyAKLSAgICAgKiAJc3VwcG9ydGVkIGRhdGEgdHlwZXMuCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmZXIgZGF0YSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgZ2l2ZW4gbGlzdGVuZXIgb3IgCi0gICAgICogCTxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgVHJhbnNmZXJEYXRhIGdldFN1cHBvcnRlZFRyYW5zZmVyVHlwZShUcmFuc2ZlckRhdGFbXSBkYXRhVHlwZXMsCi0gICAgICAgICAgICBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGxpc3RlbmVyLmdldFRyYW5zZmVyKCkuaXNTdXBwb3J0ZWRUeXBlKGRhdGFUeXBlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVR5cGVzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbWJpbmVkIHNldCBvZiA8Y29kZT5UcmFuc2ZlcjwvY29kZT4gdHlwZXMgb2YgYWxsIAotICAgICAqIDxjb2RlPlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyczwvY29kZT4uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29tYmluZWQgc2V0IG9mIDxjb2RlPlRyYW5zZmVyPC9jb2RlPiB0eXBlcwotICAgICAqLwotICAgIHB1YmxpYyBUcmFuc2ZlcltdIGdldFRyYW5zZmVycygpIHsKLSAgICAgICAgVHJhbnNmZXJbXSB0eXBlcyA9IG5ldyBUcmFuc2ZlcltsaXN0ZW5lcnMuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyIGxpc3RlbmVyID0gKFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyKSBsaXN0ZW5lcnMKLSAgICAgICAgICAgICAgICAgICAgLmdldChpKTsKLSAgICAgICAgICAgIHR5cGVzW2ldID0gbGlzdGVuZXIuZ2V0VHJhbnNmZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIHRvIGRlbGVnYXRlIGV2ZW50cyB0by4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyA8Y29kZT5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnM8L2NvZGU+Ci0gICAgICoJPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0ZW5lcnMuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIDxjb2RlPlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyPC9jb2RlPi4KLSAgICAgKiBMaXN0ZW5lcnMgc2hvdWxkIG5vdCBiZSByZW1vdmVkIHdoaWxlIGEgZHJhZyBhbmQgZHJvcCBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVEcm9wVGFyZ2V0TGlzdGVuZXIoVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRMaXN0ZW5lciA9PSBsaXN0ZW5lcikKLSAgICAgICAgICAgIGN1cnJlbnRMaXN0ZW5lciA9IG51bGw7Ci0gICAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgbGlzdGVuZXIgdG8gPGNvZGU+bGlzdGVuZXI8L2NvZGU+LiBTZW5kcyB0aGUgZ2l2ZW4gCi0gICAgICogPGNvZGU+RHJvcFRhcmdldEV2ZW50PC9jb2RlPiBpZiB0aGUgY3VycmVudCBsaXN0ZW5lciBjaGFuZ2VzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5ldyBsaXN0ZW5lciBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgcHJldmlvdXMKLSAgICAgKgk8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldEN1cnJlbnRMaXN0ZW5lcihUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgIGZpbmFsIERyb3BUYXJnZXRFdmVudCBldmVudCkgewotICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyID09IGxpc3RlbmVyKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgCVNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudExpc3RlbmVyLmRyYWdMZWF2ZShldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgY3VycmVudExpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgIC8vCQlpZiAoUG9saWN5LkRFQlVHX0RSQUdfRFJPUCkKLSAgICAgICAgLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkN1cnJlbnQgZHJvcCBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgCVNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudExpc3RlbmVyLmRyYWdFbnRlcihldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgY3VycmVudCBsaXN0ZW5lciB0byBvbmUgdGhhdCBjYW4gaGFuZGxlIHRoZSBkcm9wLiBUaGVyZSBjYW4gYmUgbWFueQotICAgICAqIGxpc3RlbmVycyBhbmQgZWFjaCBsaXN0ZW5lciBtYXkgYmUgYWJsZSB0byBoYW5kbGUgbWFueSA8Y29kZT5UcmFuc2ZlckRhdGE8L2NvZGU+IAotICAgICAqIHR5cGVzLiBUaGUgZmlyc3QgbGlzdGVuZXIgZm91bmQgdGhhdCBjYW4gaGFuZGxlIGEgZHJvcCBvZiBvbmUgb2YgdGhlIGdpdmVuIAotICAgICAqIDxjb2RlPlRyYW5zZmVyRGF0YTwvY29kZT4gdHlwZXMgd2lsbCBiZSBzZWxlY3RlZC4KLSAgICAgKiBJZiBubyBsaXN0ZW5lciBjYW4gaGFuZGxlIHRoZSBkcmFnIG9wZXJhdGlvbiB0aGUgPGNvZGU+ZXZlbnQuZGV0YWlsPC9jb2RlPiBmaWVsZAotICAgICAqIGlzIHNldCB0byA8Y29kZT5ETkQuRFJPUF9OT05FPC9jb2RlPiB0byBpbmRpY2F0ZSBhbiBpbnZhbGlkIGRyb3AuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGRyb3AgdGFyZ2V0IGV2ZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUN1cnJlbnRMaXN0ZW5lcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaW50IG9yaWdpbmFsRGV0YWlsID0gZXZlbnQuZGV0YWlsOwotICAgICAgICAvLyByZXZlcnQgdGhlIGRldGFpbCB0byB0aGUgIm9yaWdpbmFsIiBkcm9wIHR5cGUgdGhhdCB0aGUgVXNlciBpbmRpY2F0ZWQuCi0gICAgICAgIC8vIHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHByZXZpb3VzIGxpc3RlbmVyIG1heSBoYXZlIGNoYW5nZWQgdGhlIGRldGFpbCAKLSAgICAgICAgLy8gdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gd2hhdCB0aGUgdXNlciBpbmRpY2F0ZWQuCi0gICAgICAgIGV2ZW50LmRldGFpbCA9IG9yaWdpbmFsRHJvcFR5cGU7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyIGxpc3RlbmVyID0gKFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyKSBpdGVyCi0gICAgICAgICAgICAgICAgICAgIC5uZXh0KCk7Ci0gICAgICAgICAgICBUcmFuc2ZlckRhdGEgZGF0YVR5cGUgPSBnZXRTdXBwb3J0ZWRUcmFuc2ZlclR5cGUoZXZlbnQuZGF0YVR5cGVzLAotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAoZGF0YVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRyYW5zZmVyRGF0YSBvcmlnaW5hbERhdGFUeXBlID0gZXZlbnQuY3VycmVudERhdGFUeXBlOwotICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgZGF0YSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgZHJvcCBsaXN0ZW5lcgotICAgICAgICAgICAgICAgIGV2ZW50LmN1cnJlbnREYXRhVHlwZSA9IGRhdGFUeXBlOwotICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5pc0VuYWJsZWQoZXZlbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsaXN0ZW5lciBzdGF5cyB0aGUgc2FtZSwgc2V0IGl0cyBwcmV2aW91c2x5IGRldGVybWluZWQgIAotICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBkZXRhaWwgCi0gICAgICAgICAgICAgICAgICAgIGlmICghc2V0Q3VycmVudExpc3RlbmVyKGxpc3RlbmVyLCBldmVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBvcmlnaW5hbERldGFpbDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQkJCQlldmVudC5jdXJyZW50RGF0YVR5cGUgPSBvcmlnaW5hbERhdGFUeXBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNldEN1cnJlbnRMaXN0ZW5lcihudWxsLCBldmVudCk7Ci0gICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9HZW9tZXRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9HZW9tZXRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTc4NTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvR2VvbWV0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBDb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcGVyZm9ybWluZyBzaW1wbGUgZ2VvbWV0cmljIG9wZXJhdGlvbnMKLSAqIG9uIHRoZSBTV1QgZ2VvbWV0cnkgY2xhc3Nlcy4KLSAqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW9tZXRyeSB7Ci0KLSAgICAvKioKLSAgICAgKiBQcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHByaXZhdGUgR2VvbWV0cnkoKSB7Ci0gICAgCS8vVGhpcyBpcyBub3QgaW5zdGFudGlhdGVkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMuIAotICAgICAqIDxwPlRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdGhlIHJlYWwgZGlzdGFuY2Ugd2hlbiBzZWFyY2hpbmcKLSAgICAgKiBmb3IgdGhlIGNsb3Nlc3QgcG9pbnQsIHNpbmNlIGl0IGF2b2lkcyBzcXVhcmUgcm9vdHMuPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBwMSBmaXJzdCBlbmRwb2ludAotICAgICAqIEBwYXJhbSBwMiBzZWNvbmQgZW5kcG9pbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb2ludHMKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZGlzdGFuY2VTcXVhcmVkKFBvaW50IHAxLCBQb2ludCBwMikgewotICAgICAgICBpbnQgdGVybTEgPSBwMS54IC0gcDIueDsKLSAgICAgICAgaW50IHRlcm0yID0gcDEueSAtIHAyLnk7Ci0gICAgICAgIHJldHVybiB0ZXJtMSAqIHRlcm0xICsgdGVybTIgKiB0ZXJtMjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGdpdmVuIDJkIHZlY3RvciAocmVwcmVzZW50ZWQgYXMgYSBQb2ludCkKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHAgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSAyZCB2ZWN0b3Igd2hvc2UgbWFnbml0dWRlIGlzIGJlaW5nIGNvbXB1dGVkCi0gICAgICogQHJldHVybiB0aGUgbWFnbml0dWRlIG9mIHRoZSBnaXZlbiAyZCB2ZWN0b3IKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBkb3VibGUgbWFnbml0dWRlKFBvaW50IHApIHsKLSAgICAgICAgcmV0dXJuIE1hdGguc3FydChtYWduaXR1ZGVTcXVhcmVkKHApKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzcXVhcmUgb2YgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZ2l2ZW4gMi1zcGFjZSB2ZWN0b3IgKHJlcHJlc2VudGVkCi0gICAgICogdXNpbmcgYSBwb2ludCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgcG9pbnQgd2hvc2UgbWFnbml0dWRlIGlzIGJlaW5nIGNvbXB1dGVkCi0gICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGdpdmVuIHZlY3RvcgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBtYWduaXR1ZGVTcXVhcmVkKFBvaW50IHApIHsKLSAgICAgICAgcmV0dXJuIHAueCAqIHAueCArIHAueSAqIHAueTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBvZiB0aGUgZ2l2ZW4gdmVjdG9ycyAoZXhwcmVzc2VkIGFzIFBvaW50cykKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcDEgdGhlIGZpcnN0IHZlY3RvcgotICAgICAqIEBwYXJhbSBwMiB0aGUgc2Vjb25kIHZlY3RvcgotICAgICAqIEByZXR1cm4gdGhlIGRvdCBwcm9kdWN0IG9mIHRoZSB0d28gdmVjdG9ycwotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBkb3RQcm9kdWN0KFBvaW50IHAxLCBQb2ludCBwMikgewotICAgICAgICByZXR1cm4gcDEueCAqIHAyLnggKyBwMS55ICogcDIueTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IHBvaW50IHdob3NlIGNvb3JkaW5hdGVzIGFyZSB0aGUgbWluaW11bSBvZiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlCi0gICAgICogZ2l2ZW4gcG9pbnRzCi0gICAgICogCi0gICAgICogQHBhcmFtIHAxIGEgUG9pbnQKLSAgICAgKiBAcGFyYW0gcDIgYSBQb2ludAotICAgICAqIEByZXR1cm4gYSBuZXcgcG9pbnQgd2hvc2UgY29vcmRpbmF0ZXMgYXJlIHRoZSBtaW5pbXVtIG9mIHRoZSBjb29yZGluYXRlcyBvZiB0aGUKLSAgICAgKiBnaXZlbiBwb2ludHMKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQb2ludCBtaW4oUG9pbnQgcDEsIFBvaW50IHAyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUG9pbnQoTWF0aC5taW4ocDEueCwgcDIueCksIE1hdGgubWluKHAxLnksIHAyLnkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IHBvaW50IHdob3NlIGNvb3JkaW5hdGVzIGFyZSB0aGUgbWF4aW11bSBvZiB0aGUgY29vcmRpbmF0ZXMKLSAgICAgKiBvZiB0aGUgZ2l2ZW4gcG9pbnRzCi0gICAgICogQHBhcmFtIHAxIGEgUG9pbnQKLSAgICAgKiBAcGFyYW0gcDIgYSBQb2ludAotICAgICAqIEByZXR1cm4gcG9pbnQgYSBuZXcgcG9pbnQgd2hvc2UgY29vcmRpbmF0ZXMgYXJlIHRoZSBtYXhpbXVtIG9mIHRoZSBjb29yZGluYXRlcwotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFBvaW50IG1heChQb2ludCBwMSwgUG9pbnQgcDIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQb2ludChNYXRoLm1heChwMS54LCBwMi54KSwgTWF0aC5tYXgocDEueSwgcDIueSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB2ZWN0b3IgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbiB3aXRoIHRoZSBnaXZlbgotICAgICAqIG1hZ25pdHVkZS4gRGlyZWN0aW9ucyBhcmUgZ2l2ZW4gdXNpbmcgU1dUIGRpcmVjdGlvbiBjb25zdGFudHMsIGFuZAotICAgICAqIHRoZSByZXN1bHRpbmcgdmVjdG9yIGlzIGluIHRoZSBzY3JlZW4ncyBjb29yZGluYXRlIHN5c3RlbS4gVGhhdCBpcywKLSAgICAgKiB0aGUgdmVjdG9yICgwLCAxKSBpcyBkb3duIGFuZCB0aGUgdmVjdG9yICgxLCAwKSBpcyByaWdodC4gCi0gICAgICogCi0gICAgICogQHBhcmFtIGRpc3RhbmNlIG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yCi0gICAgICogQHBhcmFtIGRpcmVjdGlvbiBvbmUgb2YgU1dULlRPUCwgU1dULkJPVFRPTSwgU1dULkxFRlQsIG9yIFNXVC5SSUdIVAotICAgICAqIEByZXR1cm4gYSBwb2ludCByZXByZXNlbnRpbmcgYSB2ZWN0b3IgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbiB3aXRoIHRoZSBnaXZlbiBtYWduaXR1ZGUKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQb2ludCBnZXREaXJlY3Rpb25WZWN0b3IoaW50IGRpc3RhbmNlLCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0gICAgICAgIGNhc2UgU1dULlRPUDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQoMCwgLWRpc3RhbmNlKTsKLSAgICAgICAgY2FzZSBTV1QuQk9UVE9NOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCgwLCBkaXN0YW5jZSk7Ci0gICAgICAgIGNhc2UgU1dULkxFRlQ6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KC1kaXN0YW5jZSwgMCk7Ci0gICAgICAgIGNhc2UgU1dULlJJR0hUOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChkaXN0YW5jZSwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFBvaW50KDAsIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBvaW50IGluIHRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIHJlY3RhbmdsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjdCByZWN0YW5nbGUgYmVpbmcgY29tcHV0ZWQKLSAgICAgKiBAcmV0dXJuIGEgUG9pbnQgYXQgdGhlIGNlbnRlciBvZiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFBvaW50IGNlbnRlclBvaW50KFJlY3RhbmdsZSByZWN0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgUG9pbnQocmVjdC54ICsgcmVjdC53aWR0aCAvIDIsIHJlY3QueSArIHJlY3QuaGVpZ2h0IC8gMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGdpdmVuIHBvaW50Ci0gICAgICogCi0gICAgICogQHBhcmFtIHRvQ29weSBwb2ludCB0byBjb3B5Ci0gICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGdpdmVuIHBvaW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQb2ludCBjb3B5KFBvaW50IHRvQ29weSkgewotICAgICAgICByZXR1cm4gbmV3IFBvaW50KHRvQ29weS54LCB0b0NvcHkueSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgcmVzdWx0IGVxdWFsIHRvIHRvQ29weQotICAgICAqIAotICAgICAqIEBwYXJhbSByZXN1bHQgb2JqZWN0IHRoYXQgd2lsbCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB0b0NvcHkgb2JqZWN0IHRoYXQgd2lsbCBiZSBjb3BpZWQKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChQb2ludCByZXN1bHQsIFBvaW50IHRvQ29weSkgewotICAgIAlyZXN1bHQueCA9IHRvQ29weS54OwotICAgIAlyZXN1bHQueSA9IHRvQ29weS55OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHJlc3VsdCBlcXVhbCB0byB0b0NvcHkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzdWx0IG9iamVjdCB0aGF0IHdpbGwgYmUgbW9kaWZpZWQKLSAgICAgKiBAcGFyYW0gdG9Db3B5IG9iamVjdCB0aGF0IHdpbGwgYmUgY29waWVkCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXQoUmVjdGFuZ2xlIHJlc3VsdCwgUmVjdGFuZ2xlIHRvQ29weSkgewotICAgIAlyZXN1bHQueCA9IHRvQ29weS54OwotICAgIAlyZXN1bHQueSA9IHRvQ29weS55OwotICAgIAlyZXN1bHQud2lkdGggPSB0b0NvcHkud2lkdGg7Ci0gICAgCXJlc3VsdC5oZWlnaHQgPSB0b0NvcHkuaGVpZ2h0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdHdvIHBvaW50cyBhcyAyZCB2ZWN0b3JzLiBSZXR1cm5zIGEgbmV3IHBvaW50IHdob3NlIGNvb3JkaW5hdGVzIGFyZQotICAgICAqIHRoZSBzdW0gb2YgdGhlIG9yaWdpbmFsIHR3byBwb2ludHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBvaW50MSB0aGUgZmlyc3QgcG9pbnQgKG5vdCBudWxsKQotICAgICAqIEBwYXJhbSBwb2ludDIgdGhlIHNlY29uZCBwb2ludCAobm90IG51bGwpCi0gICAgICogQHJldHVybiBhIG5ldyBwb2ludCB3aG9zZSBjb29yZGluYXRlcyBhcmUgdGhlIHN1bSBvZiB0aGUgZ2l2ZW4gcG9pbnRzCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUG9pbnQgYWRkKFBvaW50IHBvaW50MSwgUG9pbnQgcG9pbnQyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUG9pbnQocG9pbnQxLnggKyBwb2ludDIueCwgcG9pbnQxLnkgKyBwb2ludDIueSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERpdmlkZXMgYm90aCBjb29yZGluYXRlcyBvZiB0aGUgZ2l2ZW4gcG9pbnQgYnkgdGhlIGdpdmVuIHNjYWxhci4gCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMSAKLSAgICAgKgotICAgICAqIEBwYXJhbSB0b0RpdmlkZSBwb2ludCB0byBkaXZpZGUKLSAgICAgKiBAcGFyYW0gc2NhbGFyIGRlbm9taW5hdG9yCi0gICAgICogQHJldHVybiBhIG5ldyBQb2ludCB3aG9zZSBjb29yZGluYXRlcyBhcmUgZXF1YWwgdG8gdGhlIG9yaWdpbmFsIHBvaW50IGRpdmlkZWQgYnkgdGhlIHNjYWxhcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUG9pbnQgZGl2aWRlKFBvaW50IHRvRGl2aWRlLCBpbnQgc2NhbGFyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUG9pbnQodG9EaXZpZGUueCAvIHNjYWxhciwgdG9EaXZpZGUueSAvIHNjYWxhcik7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdmVjdG9yIHN1YnRyYWN0aW9uIG9uIHR3byBwb2ludHMuIFJldHVybnMgYSBuZXcgcG9pbnQgZXF1YWwgdG8KLSAgICAgKiAocG9pbnQxIC0gcG9pbnQyKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9pbnQxIGluaXRpYWwgcG9pbnQKLSAgICAgKiBAcGFyYW0gcG9pbnQyIHZlY3RvciB0byBzdWJ0cmFjdAotICAgICAqIEByZXR1cm4gdGhlIGRpZmZlcmVuY2UgKHBvaW50MSAtIHBvaW50MikKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQb2ludCBzdWJ0cmFjdChQb2ludCBwb2ludDEsIFBvaW50IHBvaW50MikgewotICAgICAgICByZXR1cm4gbmV3IFBvaW50KHBvaW50MS54IC0gcG9pbnQyLngsIHBvaW50MS55IC0gcG9pbnQyLnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN3YXBzIHRoZSBYIGFuZCBZIGNvb3JkaW5hdGVzIG9mIHRoZSBnaXZlbiBwb2ludC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9GbGlwIG1vZGlmaWVzIHRoaXMgcG9pbnQKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZsaXBYWShQb2ludCB0b0ZsaXApIHsKLSAgICAJaW50IHRlbXAgPSB0b0ZsaXAueDsKLSAgICAJdG9GbGlwLnggPSB0b0ZsaXAueTsKLSAgICAJdG9GbGlwLnkgPSB0ZW1wOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN3YXBzIHRoZSBYIGFuZCBZIGNvb3JkaW5hdGVzIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUsIGFsb25nIHdpdGggdGhlIGhlaWdodCBhbmQgd2lkdGguCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvRmxpcCBtb2RpZmllcyB0aGlzIHJlY3RhbmdsZQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmxpcFhZKFJlY3RhbmdsZSB0b0ZsaXApIHsKLSAgICAJaW50IHRlbXAgPSB0b0ZsaXAueDsKLSAgICAJdG9GbGlwLnggPSB0b0ZsaXAueTsKLSAgICAJdG9GbGlwLnkgPSB0ZW1wOwotICAgIAkKLSAgICAJdGVtcCA9IHRvRmxpcC53aWR0aDsKLSAgICAJdG9GbGlwLndpZHRoID0gdG9GbGlwLmhlaWdodDsKLSAgICAJdG9GbGlwLmhlaWdodCA9IHRlbXA7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBvciB3aWR0aCBvZiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b01lYXN1cmUgcmVjdGFuZ2xlIHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gd2lkdGggcmV0dXJucyB0aGUgd2lkdGggaWYgdHJ1ZSwgYW5kIHRoZSBoZWlnaHQgaWYgZmFsc2UKLSAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGdpdmVuIHJlY3RhbmdsZQotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXREaW1lbnNpb24oUmVjdGFuZ2xlIHRvTWVhc3VyZSwgYm9vbGVhbiB3aWR0aCkgewotICAgICAgICBpZiAod2lkdGgpIHsKLSAgICAgICAgICAgIHJldHVybiB0b01lYXN1cmUud2lkdGg7Ci0gICAgICAgIH0KLQkJcmV0dXJuIHRvTWVhc3VyZS5oZWlnaHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgeCBvciB5IGNvb3JkaW5hdGVzIG9mIHRoZSBnaXZlbiBwb2ludC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9NZWFzdXJlIHBvaW50IGJlaW5nIG1lYXN1cmVkCi0gICAgICogQHBhcmFtIHdpZHRoIGlmIHRydWUsIHJldHVybnMgeC4gT3RoZXJ3aXNlLCByZXR1cm5zIHkuCi0gICAgICogQHJldHVybiB0aGUgeCBvciB5IGNvb3JkaW5hdGUKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Q29vcmRpbmF0ZShQb2ludCB0b01lYXN1cmUsIGJvb2xlYW4gd2lkdGgpIHsKLSAgICAJcmV0dXJuIHdpZHRoID8gdG9NZWFzdXJlLnggOiB0b01lYXN1cmUueTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgeCBvciB5IGNvb3JkaW5hdGVzIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvTWVhc3VyZSByZWN0YW5nbGUgYmVpbmcgbWVhc3VyZWQKLSAgICAgKiBAcGFyYW0gd2lkdGggaWYgdHJ1ZSwgcmV0dXJucyB4LiBPdGhlcndpc2UsIHJldHVybnMgeS4KLSAgICAgKiBAcmV0dXJuIHRoZSB4IG9yIHkgY29vcmRpbmF0ZQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRDb29yZGluYXRlKFJlY3RhbmdsZSB0b01lYXN1cmUsIGJvb2xlYW4gd2lkdGgpIHsKLSAgICAJcmV0dXJuIHdpZHRoID8gdG9NZWFzdXJlLnggOiB0b01lYXN1cmUueTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyBvbmUgZGltZW5zaW9uIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUuIE1vZGlmaWVzIHRoZSBnaXZlbiByZWN0YW5nbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvU2V0IHJlY3RhbmdsZSB0byBtb2RpZnkKLSAgICAgKiBAcGFyYW0gd2lkdGggaWYgdHJ1ZSwgdGhlIHdpZHRoIGlzIG1vZGlmaWVkLiBJZiBmYWxzZSwgdGhlIGhlaWdodCBpcyBtb2RpZmllZC4KLSAgICAgKiBAcGFyYW0gbmV3Q29vcmRpbmF0ZSBuZXcgdmFsdWUgb2YgdGhlIHdpZHRoIG9yIGhlaWdodAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGltZW5zaW9uKFJlY3RhbmdsZSB0b1NldCwgYm9vbGVhbiB3aWR0aCwgaW50IG5ld0Nvb3JkaW5hdGUpIHsKLSAgICAJaWYgKHdpZHRoKSB7Ci0gICAgCQl0b1NldC53aWR0aCA9IG5ld0Nvb3JkaW5hdGU7Ci0gICAgCX0gZWxzZSB7Ci0gICAgCQl0b1NldC5oZWlnaHQgPSBuZXdDb29yZGluYXRlOwotICAgIAl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBvbmUgY29vcmRpbmF0ZSBvZiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLiBNb2RpZmllcyB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b1NldCByZWN0YW5nbGUgdG8gbW9kaWZ5Ci0gICAgICogQHBhcmFtIHdpZHRoIGlmIHRydWUsIHRoZSB4IGNvb3JkaW5hdGUgaXMgbW9kaWZpZWQuIElmIGZhbHNlLCB0aGUgeSBjb29yZGluYXRlIGlzIG1vZGlmaWVkLgotICAgICAqIEBwYXJhbSBuZXdDb29yZGluYXRlIG5ldyB2YWx1ZSBvZiB0aGUgeCBvciB5IGNvb3JkaW5hdGVzCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb29yZGluYXRlKFJlY3RhbmdsZSB0b1NldCwgYm9vbGVhbiB3aWR0aCwgaW50IG5ld0Nvb3JkaW5hdGUpIHsKLSAgICAJaWYgKHdpZHRoKSB7Ci0gICAgCQl0b1NldC54ID0gbmV3Q29vcmRpbmF0ZTsKLSAgICAJfSBlbHNlIHsKLSAgICAJCXRvU2V0LnkgPSBuZXdDb29yZGluYXRlOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgb25lIGNvb3JkaW5hdGUgb2YgdGhlIGdpdmVuIHBvaW50LiBNb2RpZmllcyB0aGUgZ2l2ZW4gcG9pbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvU2V0IHBvaW50IHRvIG1vZGlmeQotICAgICAqIEBwYXJhbSB3aWR0aCBpZiB0cnVlLCB0aGUgeCBjb29yZGluYXRlIGlzIG1vZGlmaWVkLiBJZiBmYWxzZSwgdGhlIHkgY29vcmRpbmF0ZSBpcyBtb2RpZmllZC4KLSAgICAgKiBAcGFyYW0gbmV3Q29vcmRpbmF0ZSBuZXcgdmFsdWUgb2YgdGhlIHggb3IgeSBjb29yZGluYXRlcwotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29vcmRpbmF0ZShQb2ludCB0b1NldCwgYm9vbGVhbiB3aWR0aCwgaW50IG5ld0Nvb3JkaW5hdGUpIHsKLSAgICAJaWYgKHdpZHRoKSB7Ci0gICAgCQl0b1NldC54ID0gbmV3Q29vcmRpbmF0ZTsKLSAgICAJfSBlbHNlIHsKLSAgICAJCXRvU2V0LnkgPSBuZXdDb29yZGluYXRlOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIG9mIHRoZSBnaXZlbiBwb2ludCBmcm9tIGEgcGFydGljdWxhciBzaWRlIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUuCi0gICAgICogUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZXMgZm9yIHBvaW50cyBvdXRzaWRlIHRoZSByZWN0YW5nbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlY3RhbmdsZSBhIGJvdW5kaW5nIHJlY3RhbmdsZQotICAgICAqIEBwYXJhbSB0ZXN0UG9pbnQgYSBwb2ludCB0byB0ZXN0Ci0gICAgICogQHBhcmFtIGVkZ2VPZkludGVyZXN0IHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byB0ZXN0IGFnYWluc3QKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBvZiB0aGUgZ2l2ZW4gcG9pbnQgZnJvbSB0aGUgZ2l2ZW4gZWRnZSBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERpc3RhbmNlRnJvbUVkZ2UoUmVjdGFuZ2xlIHJlY3RhbmdsZSwgUG9pbnQgdGVzdFBvaW50LAotICAgICAgICAgICAgaW50IGVkZ2VPZkludGVyZXN0KSB7Ci0gICAgICAgIHN3aXRjaCAoZWRnZU9mSW50ZXJlc3QpIHsKLSAgICAgICAgY2FzZSBTV1QuVE9QOgotICAgICAgICAgICAgcmV0dXJuIHRlc3RQb2ludC55IC0gcmVjdGFuZ2xlLnk7Ci0gICAgICAgIGNhc2UgU1dULkJPVFRPTToKLSAgICAgICAgICAgIHJldHVybiByZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQgLSB0ZXN0UG9pbnQueTsKLSAgICAgICAgY2FzZSBTV1QuTEVGVDoKLSAgICAgICAgICAgIHJldHVybiB0ZXN0UG9pbnQueCAtIHJlY3RhbmdsZS54OwotICAgICAgICBjYXNlIFNXVC5SSUdIVDoKLSAgICAgICAgICAgIHJldHVybiByZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCAtIHRlc3RQb2ludC54OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXh0cnVkZXMgdGhlIGdpdmVuIGVkZ2UgaW53YXJkIGJ5IHRoZSBnaXZlbiBkaXN0YW5jZS4gVGhhdCBpcywgaWYgb25lIHNpZGUgb2YgdGhlIHJlY3RhbmdsZQotICAgICAqIHdhcyBzbGljZWQgb2ZmIHdpdGggYSBnaXZlbiB0aGlja25lc3MsIHRoaXMgcmV0dXJucyB0aGUgcmVjdGFuZ2xlIHRoYXQgZm9ybXMgdGhlIHNsaWNlLiBOb3RlCi0gICAgICogdGhhdCB0aGUgcmV0dXJuZWQgcmVjdGFuZ2xlIHdpbGwgYmUgaW5zaWRlIHRoZSBnaXZlbiByZWN0YW5nbGUgaWYgc2l6ZSA+IDAuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvRXh0cnVkZSB0aGUgcmVjdGFuZ2xlIHRvIGV4dHJ1ZGUuIFRoZSByZXN1bHRpbmcgcmVjdGFuZ2xlIHdpbGwgc2hhcmUgdGhyZWUgc2lkZXMKLSAgICAgKiB3aXRoIHRoaXMgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBzaXplIGRpc3RhbmNlIHRvIGV4dHJ1ZGUuIEEgbmVnYXRpdmUgc2l6ZSB3aWxsIGV4dHJ1ZGUgb3V0d2FyZHMgKHRoYXQgaXMsIHRoZSByZXN1bHRpbmcKLSAgICAgKiByZWN0YW5nbGUgd2lsbCBvdmVybGFwIHRoZSBvcmlnaW5hbCBpZmYgdGhpcyBpcyBwb3NpdGl2ZSkuIAotICAgICAqIEBwYXJhbSBvcmllbnRhdGlvbiB0aGUgc2lkZSB0byBleHRydWRlLiAgT25lIG9mIFNXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5UT1AsIG9yIFNXVC5CT1RUT00uIFRoZSAKLSAgICAgKiByZXN1bHRpbmcgcmVjdGFuZ2xlIHdpbGwgYWx3YXlzIHNoYXJlIHRoaXMgc2lkZSB3aXRoIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUuCi0gICAgICogQHJldHVybiBhIHJlY3RhbmdsZSBmb3JtZWQgYnkgZXh0cnVkaW5nIHRoZSBnaXZlbiBzaWRlIG9mIHRoZSByZWN0YW5nbGUgYnkgdGhlIGdpdmVuIGRpc3RhbmNlLgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlY3RhbmdsZSBnZXRFeHRydWRlZEVkZ2UoUmVjdGFuZ2xlIHRvRXh0cnVkZSwgaW50IHNpemUsCi0gICAgICAgICAgICBpbnQgb3JpZW50YXRpb24pIHsKLSAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IG5ldyBSZWN0YW5nbGUodG9FeHRydWRlLngsIHRvRXh0cnVkZS55LAotICAgICAgICAgICAgICAgIHRvRXh0cnVkZS53aWR0aCwgdG9FeHRydWRlLmhlaWdodCk7Ci0KLSAgICAgICAgaWYgKCFpc0hvcml6b250YWwob3JpZW50YXRpb24pKSB7Ci0gICAgICAgICAgICBib3VuZHMud2lkdGggPSBzaXplOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm91bmRzLmhlaWdodCA9IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7Ci0gICAgICAgIGNhc2UgU1dULlJJR0hUOgotICAgICAgICAgICAgYm91bmRzLnggPSB0b0V4dHJ1ZGUueCArIHRvRXh0cnVkZS53aWR0aCAtIGJvdW5kcy53aWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNXVC5CT1RUT006Ci0gICAgICAgICAgICBib3VuZHMueSA9IHRvRXh0cnVkZS55ICsgdG9FeHRydWRlLmhlaWdodCAtIGJvdW5kcy5oZWlnaHQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG5vcm1hbGl6ZShib3VuZHMpOwotCi0gICAgICAgIHJldHVybiBib3VuZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb3Bwb3NpdGUgb2YgdGhlIGdpdmVuIGRpcmVjdGlvbi4gVGhhdCBpcywgcmV0dXJucyBTV1QuTEVGVCBpZgotICAgICAqIGdpdmVuIFNXVC5SSUdIVCBhbmQgdmlzYS12ZXJzYS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3d0RGlyZWN0aW9uQ29uc3RhbnQgb25lIG9mIFNXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5UT1AsIG9yIFNXVC5CT1RUT00KLSAgICAgKiBAcmV0dXJuIG9uZSBvZiBTV1QuTEVGVCwgU1dULlJJR0hULCBTV1QuVE9QLCBvciBTV1QuQk9UVE9NCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE9wcG9zaXRlU2lkZShpbnQgc3d0RGlyZWN0aW9uQ29uc3RhbnQpIHsKLSAgICAgICAgc3dpdGNoIChzd3REaXJlY3Rpb25Db25zdGFudCkgewotICAgICAgICBjYXNlIFNXVC5UT1A6Ci0gICAgICAgICAgICByZXR1cm4gU1dULkJPVFRPTTsKLSAgICAgICAgY2FzZSBTV1QuQk9UVE9NOgotICAgICAgICAgICAgcmV0dXJuIFNXVC5UT1A7Ci0gICAgICAgIGNhc2UgU1dULkxFRlQ6Ci0gICAgICAgICAgICByZXR1cm4gU1dULlJJR0hUOwotICAgICAgICBjYXNlIFNXVC5SSUdIVDoKLSAgICAgICAgICAgIHJldHVybiBTV1QuTEVGVDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzd3REaXJlY3Rpb25Db25zdGFudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gYm9vbGVhbiBpbnRvIGFuIFNXVCBvcmllbnRhdGlvbiBjb25zdGFudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaG9yaXpvbnRhbCBpZiB0cnVlLCByZXR1cm5zIFNXVC5IT1JJWk9OVEFMLiBJZiBmYWxzZSwgcmV0dXJucyBTV1QuVkVSVElDQUwgCi0gICAgICogQHJldHVybiBTV1QuSE9SSVpPTlRBTCBvciBTV1QuVkVSVElDQUwuCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN3dEhvcml6b250YWxPclZlcnRpY2FsQ29uc3RhbnQoYm9vbGVhbiBob3Jpem9udGFsKSB7Ci0gICAgICAgIGlmIChob3Jpem9udGFsKSB7Ci0gICAgICAgICAgICByZXR1cm4gU1dULkhPUklaT05UQUw7Ci0gICAgICAgIH0KLQkJcmV0dXJuIFNXVC5WRVJUSUNBTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWZmIHRoZSBnaXZlbiBTV1Qgc2lkZSBjb25zdGFudCBjb3JyZXNwb25kcyB0byBhIGhvcml6b250YWwgc2lkZQotICAgICAqIG9mIGEgcmVjdGFuZ2xlLiBUaGF0IGlzLCByZXR1cm5zIHRydWUgZm9yIHRoZSB0b3AgYW5kIGJvdHRvbSBidXQgZmFsc2UgZm9yIHRoZQotICAgICAqIGxlZnQgYW5kIHJpZ2h0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzd3RTaWRlQ29uc3RhbnQgb25lIG9mIFNXVC5UT1AsIFNXVC5CT1RUT00sIFNXVC5MRUZULCBvciBTV1QuUklHSFQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBnaXZlbiBzaWRlIGlzIGhvcml6b250YWwuCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hvcml6b250YWwoaW50IHN3dFNpZGVDb25zdGFudCkgewotICAgICAgICByZXR1cm4gIShzd3RTaWRlQ29uc3RhbnQgPT0gU1dULkxFRlQgfHwgc3d0U2lkZUNvbnN0YW50ID09IFNXVC5SSUdIVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGdpdmVuIHJlY3RhbmdsZSBieSB0aGUgZ2l2ZW4gZGVsdGEuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlY3QgcmVjdGFuZ2xlIHRvIG1vdmUgKHdpbGwgYmUgbW9kaWZpZWQpCi0gICAgICogQHBhcmFtIGRlbHRhIGRpcmVjdGlvbiB2ZWN0b3IgdG8gbW92ZSB0aGUgcmVjdGFuZ2xlIGJ5Ci0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtb3ZlUmVjdGFuZ2xlKFJlY3RhbmdsZSByZWN0LCBQb2ludCBkZWx0YSkgewotICAgICAgICByZWN0LnggKz0gZGVsdGEueDsKLSAgICAgICAgcmVjdC55ICs9IGRlbHRhLnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTW92ZXMgZWFjaCBlZGdlIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUgb3V0d2FyZCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBOZWdhdGl2ZSB2YWx1ZXMKLSAgICAgKiBjYXVzZSB0aGUgcmVjdGFuZ2xlIHRvIGNvbnRyYWN0LiBEb2VzIG5vdCBhbGxvdyB0aGUgcmVjdGFuZ2xlJ3Mgd2lkdGggb3IgaGVpZ2h0IHRvIGJlCi0gICAgICogcmVkdWNlZCBiZWxvdyB6ZXJvLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gcmVjdCBub3JtYWxpemVkIHJlY3RhbmdsZSB0byBtb2RpZnkKLSAgICAgKiBAcGFyYW0gbGVmdCBkaXN0YW5jZSB0byBtb3ZlIHRoZSBsZWZ0IGVkZ2Ugb3V0d2FyZCAobmVnYXRpdmUgdmFsdWVzIG1vdmUgdGhlIGVkZ2UgaW53YXJkKQotICAgICAqIEBwYXJhbSByaWdodCBkaXN0YW5jZSB0byBtb3ZlIHRoZSByaWdodCBlZGdlIG91dHdhcmQgKG5lZ2F0aXZlIHZhbHVlcyBtb3ZlIHRoZSBlZGdlIGlud2FyZCkgCi0gICAgICogQHBhcmFtIHRvcCBkaXN0YW5jZSB0byBtb3ZlIHRoZSB0b3AgZWRnZSBvdXR3YXJkIChuZWdhdGl2ZSB2YWx1ZXMgbW92ZSB0aGUgZWRnZSBpbndhcmQpCi0gICAgICogQHBhcmFtIGJvdHRvbSBkaXN0YW5jZSB0byBtb3ZlIHRoZSBib3R0b20gZWRnZSBvdXR3YXJkIChuZWdhdGl2ZSB2YWx1ZXMgbW92ZSB0aGUgZWRnZSBpbndhcmQpCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleHBhbmQoUmVjdGFuZ2xlIHJlY3QsIGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCB0b3AsIGludCBib3R0b20pIHsKLSAgICAgICAgcmVjdC54IC09IGxlZnQ7Ci0gICAgICAgIHJlY3Qud2lkdGggPSBNYXRoLm1heCgwLCByZWN0LndpZHRoICsgbGVmdCArIHJpZ2h0KTsKLSAgICAgICAgcmVjdC55IC09IHRvcDsKLSAgICAgICAgcmVjdC5oZWlnaHQgPSBNYXRoLm1heCgwLCByZWN0LmhlaWdodCArIHRvcCArIGJvdHRvbSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE5vcm1hbGl6ZXMgdGhlIGdpdmVuIHJlY3RhbmdsZS4gVGhhdCBpcywgYW55IHJlY3RhbmdsZSB3aXRoCi0gICAgICogbmVnYXRpdmUgd2lkdGggb3IgaGVpZ2h0IGJlY29tZXMgYSByZWN0YW5nbGUgd2l0aCBwb3NpdGl2ZQotICAgICAqIHdpZHRoIG9yIGhlaWdodCB0aGF0IGV4dGVuZHMgdG8gdGhlIHVwcGVyLWxlZnQgb2YgdGhlIG9yaWdpbmFsCi0gICAgICogcmVjdGFuZ2xlLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjdCByZWN0YW5nbGUgdG8gbW9kaWZ5Ci0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBub3JtYWxpemUoUmVjdGFuZ2xlIHJlY3QpIHsKLSAgICAgICAgaWYgKHJlY3Qud2lkdGggPCAwKSB7Ci0gICAgICAgICAgICByZWN0LndpZHRoID0gLXJlY3Qud2lkdGg7Ci0gICAgICAgICAgICByZWN0LnggLT0gcmVjdC53aWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZWN0LmhlaWdodCA8IDApIHsKLSAgICAgICAgICAgIHJlY3QuaGVpZ2h0ID0gLXJlY3QuaGVpZ2h0OwotICAgICAgICAgICAgcmVjdC55IC09IHJlY3QuaGVpZ2h0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHJlY3RhbmdsZSBmcm9tIGRpc3BsYXkgY29vcmRpbmF0ZXMgdG8gdGhlIGxvY2FsIGNvb3JkaW5hdGUgc3lzdGVtIAotICAgICAqIG9mIHRoZSBnaXZlbiBvYmplY3QgaW50byBkaXNwbGF5IGNvb3JkaW5hdGVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb29yZGluYXRlU3lzdGVtIGxvY2FsIGNvb3JkaW5hdGUgc3lzdGVtIGJlaW5nIGNvbnZlcnRlZCB0bwotICAgICAqIEBwYXJhbSB0b0NvbnZlcnQgcmVjdGFuZ2xlIHRvIGNvbnZlcnQKLSAgICAgKiBAcmV0dXJuIGEgcmVjdGFuZ2xlIGluIGNvbnRyb2wgY29vcmRpbmF0ZXMKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZWN0YW5nbGUgdG9Db250cm9sKENvbnRyb2wgY29vcmRpbmF0ZVN5c3RlbSwKLSAgICAgICAgICAgIFJlY3RhbmdsZSB0b0NvbnZlcnQpIHsKLSAgICAJcmV0dXJuKGNvb3JkaW5hdGVTeXN0ZW0uZ2V0RGlzcGxheSgpLm1hcAotICAgIAkJCShudWxsLGNvb3JkaW5hdGVTeXN0ZW0sdG9Db252ZXJ0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHJlY3RhbmdsZSBmcm9tIHRoZSBsb2NhbCBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgZ2l2ZW4gb2JqZWN0Ci0gICAgICogaW50byBkaXNwbGF5IGNvb3JkaW5hdGVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb29yZGluYXRlU3lzdGVtIGxvY2FsIGNvb3JkaW5hdGUgc3lzdGVtIGJlaW5nIGNvbnZlcnRlZCBmcm9tCi0gICAgICogQHBhcmFtIHRvQ29udmVydCByZWN0YW5nbGUgdG8gY29udmVydAotICAgICAqIEByZXR1cm4gYSByZWN0YW5nbGUgaW4gZGlzcGxheSBjb29yZGluYXRlcwotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlY3RhbmdsZSB0b0Rpc3BsYXkoQ29udHJvbCBjb29yZGluYXRlU3lzdGVtLAotICAgICAgICAgICAgUmVjdGFuZ2xlIHRvQ29udmVydCkgewotICAgIAlyZXR1cm4oY29vcmRpbmF0ZVN5c3RlbS5nZXREaXNwbGF5KCkubWFwCi0gICAgCQkJKGNvb3JkaW5hdGVTeXN0ZW0sbnVsbCx0b0NvbnZlcnQpKTsgICAKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hlcmUgdGhlIGdpdmVuIHBvaW50IGxpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBnaXZlbiByZWN0YW5nbGUuCi0gICAgICogUmV0dXJucyBhIGNvbWJpbmF0aW9uIG9mIFNXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5UT1AsIGFuZCBTV1QuQk9UVE9NLCBjb21iaW5lZAotICAgICAqIHdpdGggYml0d2lzZSBvciAoZm9yIGV4YW1wbGUsIHJldHVybnMgU1dULlRPUCB8IFNXVC5MRUZUIGlmIHRoZSBwb2ludCBpcyB0byB0aGUKLSAgICAgKiB1cHBlci1sZWZ0IG9mIHRoZSByZWN0YW5nbGUpLiBSZXR1cm5zIDAgaWYgdGhlIHBvaW50IGxpZXMgd2l0aGluIHRoZSByZWN0YW5nbGUuCi0gICAgICogUG9zaXRpb25zIGFyZSBpbiBzY3JlZW4gY29vcmRpbmF0ZXMgKGllOiBhIHBvaW50IGlzIHRvIHRoZSB1cHBlci1sZWZ0IG9mIHRoZQotICAgICAqIHJlY3RhbmdsZSBpZiBpdHMgeCBhbmQgeSBjb29yZGluYXRlcyBhcmUgc21hbGxlciB0aGFuIGFueSBwb2ludCBpbiB0aGUgcmVjdGFuZ2xlKQotICAgICAqICAKLSAgICAgKiBAcGFyYW0gYm91bmRhcnkgbm9ybWFsaXplZCBib3VuZGFyeSByZWN0YW5nbGUgCi0gICAgICogQHBhcmFtIHRvVGVzdCBwb2ludCB3aG9zZSByZWxhdGl2ZSBwb3NpdGlvbiB0byB0aGUgcmVjdGFuZ2xlIGlzIGJlaW5nIGNvbXB1dGVkCi0gICAgICogQHJldHVybiBvbmUgb2YgU1dULkxFRlQgfCBTV1QuVE9QLCBTV1QuVE9QLCBTV1QuUklHSFQgfCBTV1QuVE9QLCBTV1QuTEVGVCwgMCwKLSAgICAgKiBTV1QuUklHSFQsIFNXVC5MRUZUIHwgU1dULkJPVFRPTSwgU1dULkJPVFRPTSwgU1dULlJJR0hUIHwgU1dULkJPVFRPTQotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRSZWxhdGl2ZVBvc2l0aW9uKFJlY3RhbmdsZSBib3VuZGFyeSwgUG9pbnQgdG9UZXN0KSB7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwotCi0gICAgICAgIGlmICh0b1Rlc3QueCA8IGJvdW5kYXJ5LngpIHsKLSAgICAgICAgICAgIHJlc3VsdCB8PSBTV1QuTEVGVDsKLSAgICAgICAgfSBlbHNlIGlmICh0b1Rlc3QueCA+PSBib3VuZGFyeS54ICsgYm91bmRhcnkud2lkdGgpIHsKLSAgICAgICAgICAgIHJlc3VsdCB8PSBTV1QuUklHSFQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodG9UZXN0LnkgPCBib3VuZGFyeS55KSB7Ci0gICAgICAgICAgICByZXN1bHQgfD0gU1dULlRPUDsKLSAgICAgICAgfSBlbHNlIGlmICh0b1Rlc3QueSA+PSBib3VuZGFyeS55ICsgYm91bmRhcnkuaGVpZ2h0KSB7Ci0gICAgICAgICAgICByZXN1bHQgfD0gU1dULkJPVFRPTTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgcG9pbnQgdG8gdGhlIG5lYXJlc3QgZWRnZSBvZiB0aGUgZ2l2ZW4KLSAgICAgKiByZWN0YW5nbGUuIFJldHVybnMgbmVnYXRpdmUgdmFsdWVzIGlmIHRoZSBwb2ludCBsaWVzIG91dHNpZGUgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYm91bmRhcnkgcmVjdGFuZ2xlIHRvIHRlc3QKLSAgICAgKiBAcGFyYW0gdG9UZXN0IHBvaW50IHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiBwb2ludCBhbmQgdGhlIG5lYXJlc3QgZWRnZSBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIFJldHVybnMgcG9zaXRpdmUgdmFsdWVzIGZvciBwb2ludHMgaW5zaWRlIHRoZSByZWN0YW5nbGUgYW5kIG5lZ2F0aXZlIHZhbHVlcyBmb3IgcG9pbnRzCi0gICAgICogb3V0c2lkZSB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXREaXN0YW5jZUZyb20oUmVjdGFuZ2xlIGJvdW5kYXJ5LCBQb2ludCB0b1Rlc3QpIHsKLSAgICAgICAgaW50IHNpZGUgPSBnZXRDbG9zZXN0U2lkZShib3VuZGFyeSwgdG9UZXN0KTsKLSAgICAgICAgcmV0dXJuIGdldERpc3RhbmNlRnJvbUVkZ2UoYm91bmRhcnksIHRvVGVzdCwgc2lkZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVkZ2Ugb2YgdGhlIGdpdmVuIHJlY3RhbmdsZSBpcyBjbG9zZXN0IHRvIHRoZSBnaXZlbgotICAgICAqIHBvaW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBib3VuZGFyeSByZWN0YW5nbGUgdG8gdGVzdAotICAgICAqIEBwYXJhbSB0b1Rlc3QgcG9pbnQgdG8gY29tcGFyZQotICAgICAqIEByZXR1cm4gb25lIG9mIFNXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5UT1AsIG9yIFNXVC5CT1RUT00KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Q2xvc2VzdFNpZGUoUmVjdGFuZ2xlIGJvdW5kYXJ5LCBQb2ludCB0b1Rlc3QpIHsKLSAgICAgICAgaW50W10gc2lkZXMgPSBuZXcgaW50W10geyBTV1QuTEVGVCwgU1dULlJJR0hULCBTV1QuVE9QLCBTV1QuQk9UVE9NIH07Ci0KLSAgICAgICAgaW50IGNsb3Nlc3RTaWRlID0gU1dULkxFRlQ7Ci0gICAgICAgIGludCBjbG9zZXN0RGlzdGFuY2UgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQotICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBzaWRlcy5sZW5ndGg7IGlkeCsrKSB7Ci0gICAgICAgICAgICBpbnQgc2lkZSA9IHNpZGVzW2lkeF07Ci0KLSAgICAgICAgICAgIGludCBkaXN0YW5jZSA9IGdldERpc3RhbmNlRnJvbUVkZ2UoYm91bmRhcnksIHRvVGVzdCwgc2lkZSk7Ci0KLSAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IGNsb3Nlc3REaXN0YW5jZSkgewotICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlOwotICAgICAgICAgICAgICAgIGNsb3Nlc3RTaWRlID0gc2lkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbG9zZXN0U2lkZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvQ29weSByZWN0YW5nbGUgdG8gY29weQotICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBnaXZlbiByZWN0YW5nbGUKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZWN0YW5nbGUgY29weShSZWN0YW5nbGUgdG9Db3B5KSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKHRvQ29weS54LCB0b0NvcHkueSwgdG9Db3B5LndpZHRoLCB0b0NvcHkuaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSByZWN0YW5nbGUsIGFzIGEgUG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjdGFuZ2xlIHJlY3RhbmdsZSB3aG9zZSBzaXplIGlzIGJlaW5nIGNvbXB1dGVkCi0gICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUG9pbnQgZ2V0U2l6ZShSZWN0YW5nbGUgcmVjdGFuZ2xlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUG9pbnQocmVjdGFuZ2xlLndpZHRoLCByZWN0YW5nbGUuaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUgdG8gdGhlIGdpdmVuIHNpemUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjdGFuZ2xlIHJlY3RhbmdsZSB0byBtb2RpZnkKLSAgICAgKiBAcGFyYW0gbmV3U2l6ZSBuZXcgc2l6ZSBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaXplKFJlY3RhbmdsZSByZWN0YW5nbGUsIFBvaW50IG5ld1NpemUpIHsKLSAgICAgICAgcmVjdGFuZ2xlLndpZHRoID0gbmV3U2l6ZS54OwotICAgICAgICByZWN0YW5nbGUuaGVpZ2h0ID0gbmV3U2l6ZS55OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHgseSBwb3NpdGlvbiBvZiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLiBGb3IgYSBub3JtYWxpemVkCi0gICAgICogcmVjdGFuZ2xlIChhIHJlY3RhbmdsZSB3aXRoIHBvc2l0aXZlIHdpZHRoIGFuZCBoZWlnaHQpLCB0aGlzIHdpbGwKLSAgICAgKiBiZSB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZS4gCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlY3RhbmdsZSByZWN0YW5nbGUgdG8gbW9kaWZ5Ci0gICAgICogQHBhcmFtIG5ld1NpemUgbmV3IHNpemUgb2YgdGhlIHJlY3RhbmdsZQotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9jYXRpb24oUmVjdGFuZ2xlIHJlY3RhbmdsZSwgUG9pbnQgbmV3U2l6ZSkgewotICAgICAgICByZWN0YW5nbGUud2lkdGggPSBuZXdTaXplLng7Ci0gICAgICAgIHJlY3RhbmdsZS5oZWlnaHQgPSBuZXdTaXplLnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgeCx5IHBvc2l0aW9uIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUuIEZvciBub3JtYWxpemVkIHJlY3RhbmdsZXMKLSAgICAgKiAocmVjdGFuZ2xlcyB3aXRoIHBvc2l0aXZlIHdpZHRoIGFuZCBoZWlnaHQpLCB0aGlzIGlzIHRoZSB1cHBlci1sZWZ0Ci0gICAgICogY29ybmVyIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvUXVlcnkgcmVjdGFuZ2xlIHRvIHF1ZXJ5Ci0gICAgICogQHJldHVybiBhIFBvaW50IGNvbnRhaW5pbmcgdGhlIHgseSBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUG9pbnQgZ2V0TG9jYXRpb24oUmVjdGFuZ2xlIHRvUXVlcnkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0b1F1ZXJ5LngsIHRvUXVlcnkueSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyByZWN0YW5nbGUgd2l0aCB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMsIGV4cHJlc3NlZAotICAgICAqIGFzIHBvaW50cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlICh4LHkpIHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgbmV3IHJlY3RhbmdsZSwgd2hlcmUgKHgseSkgLT4gKHdpZHRoLCBoZWlnaHQpCi0gICAgICogQHJldHVybiBhIG5ldyBSZWN0YW5nbGUgd2l0aCB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHNpemUKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZWN0YW5nbGUgY3JlYXRlUmVjdGFuZ2xlKFBvaW50IHBvc2l0aW9uLCBQb2ludCBzaXplKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHNpemUueCwgc2l6ZS55KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0JICogUmVwb3NpdGlvbnMgdGhlICdpbm5lcicgcmVjdGFuZ2xlIHRvIGxpZSBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSAnb3V0ZXInCi0JICogcmVjdGFuZ2xlIGlmIHBvc3NpYmxlLiBPbmUgdXNlIGZvciB0aGlzIGlzIHRvIGVuc3VyZSB0aGF0LCB3aGVuIHNldHRpbmcgYSBjb250cm9sJ3MgYm91bmRzLAotCSAqIHRoYXQgdGhleSB3aWxsIGFsd2F5cyBsaWUgd2l0aGluIGl0cyBwYXJlbnQncyBjbGllbnQgYXJlYSAodG8gYXZvaWQgY2xpcHBpbmcpLgotCSAqIAotCSAqIEBwYXJhbSBpbm5lciBUaGUgJ2lubmVyJyByZWN0YW5nbGUgdG8gYmUgcmVwb3NpdGlvbmVkIChzaG91bGQgYmUgc21hbGxlciB0aGFuIHRoZSAnb3V0ZXInIHJlY3RhbmdsZSkKLQkgKiBAcGFyYW0gb3V0ZXIgVGhlICdvdXRlcicgcmVjdGFuZ2xlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1vdmVJbnNpZGUoUmVjdGFuZ2xlIGlubmVyLCBSZWN0YW5nbGUgb3V0ZXIpIHsKLQkJLy8gYWRqdXN0IFgKLQkJaWYgKGlubmVyLnggPCBvdXRlci54KQotCQkJaW5uZXIueCA9IG91dGVyLng7Ci0JCWlmICgoaW5uZXIueCArIGlubmVyLndpZHRoKSA+IChvdXRlci54ICsgb3V0ZXIud2lkdGgpKSB7Ci0JCQlpbm5lci54IC09IChpbm5lci54ICsgaW5uZXIud2lkdGgpIC0gKG91dGVyLnggKyBvdXRlci53aWR0aCk7Ci0JCX0KLQotCQkvLyBBZGp1c3QgWQotCQlpZiAoaW5uZXIueSA8IG91dGVyLnkpCi0JCQlpbm5lci55ID0gb3V0ZXIueTsKLQkJaWYgKChpbm5lci55ICsgaW5uZXIuaGVpZ2h0KSA+IChvdXRlci55ICsgb3V0ZXIuaGVpZ2h0KSkgewotCQkJaW5uZXIueSAtPSAoaW5uZXIueSArIGlubmVyLmhlaWdodCkgLSAob3V0ZXIueSArIG91dGVyLmhlaWdodCk7Ci0JCX0KLQl9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL0lMb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvSUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmUzYTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvSUxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIENocmlzIEdyb3NzIChzY2h0b29Ac2NodG9vLmNvbSkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgIChidWcgNDk0OTcgW1JDUF0gSkZhY2UgZGVwZW5kZW5jeSBvbiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUgZW5sYXJnZXMgc3RhbmRhbG9uZSBKRmFjZSBhcHBsaWNhdGlvbnMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogQSBtZWNoYW5pc20gdG8gbG9nIGVycm9ycyB0aHJvdWdob3V0IEpGYWNlLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBwcm92aWRlIHRoZWlyIG93biBpbXBsZW1lbnRhdGlvbiB0byBjaGFuZ2UKLSAqIGhvdyBlcnJvcnMgYXJlIGxvZ2dlZCBmcm9tIHdpdGhpbiBKRmFjZS4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlBvbGljeSNnZXRMb2coKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlBvbGljeSNzZXRMb2coSUxvZ2dlcikKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9nZ2VyIHsKLQkKLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBzdGF0dXMuCi0JICogCi0JICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIHRvIGxvZwotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvSU9wZW5FdmVudExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL0lPcGVuRXZlbnRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2MxM2Q3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvSU9wZW5FdmVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci0KLS8qKgotICogTGlzdGVuZXIgZm9yIG9wZW4gZXZlbnRzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgb24gc2VsZWN0aW9uCi0gKiBvZiBkZWZhdWx0IHNlbGVjdGlvbiBkZXBlbmRpbmcgb24gdGhlIHVzZXIgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIDxwPgotICogVXNhZ2U6Ci0gKiA8cHJlPgotICoJT3BlblN0cmF0ZWd5IGhhbmRsZXIgPSBuZXcgT3BlblN0cmF0ZWd5KGNvbnRyb2wpOwotICoJaGFuZGxlci5hZGRPcGVuTGlzdGVuZXIobmV3IElPcGVuRXZlbnRMaXN0ZW5lcigpIHsKLSAqCQlwdWJsaWMgdm9pZCBoYW5kbGVPcGVuKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAqCQkJLi4uIC8vIGNvZGUgdG8gaGFuZGxlIHRoZSBvcGVuIGV2ZW50LgotICoJCX0KLSAqCX0pOwotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBPcGVuU3RyYXRlZ3kKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3BlbkV2ZW50TGlzdGVuZXIgewotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGEgc2VsZWN0aW9uIG9yIGRlZmF1bHQgc2VsZWN0aW9uIG9jY3VycyAKLSAgICAgKiBkZXBlbmRpbmcgb24gdGhlIHVzZXIgcHJlZmVyZW5jZS4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlT3BlbihTZWxlY3Rpb25FdmVudCBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliZTI5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL0lQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi0vKioKLSAqIExpc3RlbmVyIGZvciBwcm9wZXJ0eSBjaGFuZ2VzLgotICogPHA+Ci0gKiBVc2FnZToKLSAqIDxwcmU+Ci0gKiBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9Ci0gKiAgIG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLSAqICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICogICAgICAgICAuLi4gLy8gY29kZSB0byBkZWFsIHdpdGggb2NjdXJyZW5jZSBvZiBwcm9wZXJ0eSBjaGFuZ2UKLSAqICAgICAgfQotICogICB9OwotICogZW1pdHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAqIC4uLgotICogZW1pdHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAqIDwvcHJlPgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0gICAgLyoqCi0gICAgICogTm90aWZpY2F0aW9uIHRoYXQgYSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIHRoZSBvYnNlcnZlZCBvYmplY3QgZmlyZXMgYSBwcm9wZXJ0eQotICAgICAqIGNoYW5nZSBldmVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIHByb3BlcnR5IGNoYW5nZSBldmVudCBvYmplY3QgZGVzY3JpYmluZyB3aGljaCBwcm9wZXJ0eQotICAgICAqIGNoYW5nZWQgYW5kIGhvdwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9JU2FmZVJ1bm5hYmxlUnVubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL0lTYWZlUnVubmFibGVSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhNzBlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL0lTYWZlUnVubmFibGVSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBDaHJpcyBHcm9zcyAoc2NodG9vQHNjaHRvby5jb20pIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAoYnVnIDQ5NDk3IFtSQ1BdIEpGYWNlIGRlcGVuZGVuY3kgb24gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIGVubGFyZ2VzIHN0YW5kYWxvbmUgSkZhY2UgYXBwbGljYXRpb25zKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotCi0vKioKLSAqIFJ1bnMgYSBzYWZlIHJ1bm5hYmxlcy4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgcHJvdmlkZSB0aGVpciBvd24gaW1wbGVtZW50YXRpb24gdG8gY2hhbmdlCi0gKiBob3cgc2FmZSBydW5uYWJsZXMgYXJlIHJ1biBmcm9tIHdpdGhpbiBKRmFjZS4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBTYWZlUnVubmFibGUjZ2V0UnVubmVyKCkKLSAqIEBzZWUgU2FmZVJ1bm5hYmxlI3NldFJ1bm5lcihJU2FmZVJ1bm5hYmxlUnVubmVyKQotICogQHNlZSBTYWZlUnVubmFibGUjcnVuKElTYWZlUnVubmFibGUpCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNhZmVSdW5uYWJsZVJ1bm5lciB7Ci0JCi0JLyoqCi0JICogUnVucyB0aGUgcnVubmFibGUuICBBbGwgPGNvZGU+SVNhZmVSdW5uYWJsZVJ1bm5lcnM8L2NvZGU+IG11c3QgY2F0Y2ggYW55IGV4Y2VwdGlvbgotCSAqIHRocm93biBieSB0aGUgPGNvZGU+SVNhZmVSdW5uYWJsZTwvY29kZT4gYW5kIHBhc3MgdGhlIGV4Y2VwdGlvbiB0byAKLQkgKiA8Y29kZT5JU2FmZVJ1bm5hYmxlLmhhbmRsZUV4Y2VwdGlvbigpPC9jb2RlPi4KLQkgKgotCSAqIEBzZWUgU2FmZVJ1bm5hYmxlI3J1bihJU2FmZVJ1bm5hYmxlKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJ1bihJU2FmZVJ1bm5hYmxlIGNvZGUpOwotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9MaXN0ZW5lckxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvTGlzdGVuZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYzVkZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9MaXN0ZW5lckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBtYWludGFpbiBhIGxpc3Qgb2YgbGlzdGVuZXJzLCBhbmQgaXMgdXNlZCBpbiB0aGUKLSAqIGltcGxlbWVudGF0aW9ucyBvZiBzZXZlcmFsIGNsYXNzZXMgd2l0aGluIEpGYWNlIHdoaWNoIGFsbG93IHlvdSB0byByZWdpc3RlcgotICogbGlzdGVuZXJzIG9mIHZhcmlvdXMga2luZHMuIEl0IGlzIGEgZmFpcmx5IGxpZ2h0d2VpZ2h0IG9iamVjdCwgb2NjdXB5aW5nCi0gKiBtaW5pbWFsIHNwYWNlIHdoZW4gbm8gbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkLgotICogPHA+Ci0gKiBOb3RlIHRoYXQgdGhlIDxjb2RlPmFkZDwvY29kZT4gbWV0aG9kIGNoZWNrcyBmb3IgYW5kIGVsaW1pbmF0ZXMgZHVwbGljYXRlcwotICogYmFzZWQgb24gaWRlbnRpdHkgKG5vdCBlcXVhbGl0eSkuIExpa2V3aXNlLCB0aGUgPGNvZGU+cmVtb3ZlPC9jb2RlPiBtZXRob2QKLSAqIGNvbXBhcmVzIGJhc2VkIG9uIGlkZW50aXR5LgotICogPC9wPgotICogPHA+Ci0gKiBVc2UgdGhlIDxjb2RlPmdldExpc3RlbmVyczwvY29kZT4gbWV0aG9kIHdoZW4gbm90aWZ5aW5nIGxpc3RlbmVycy4gTm90ZQotICogdGhhdCBubyBnYXJiYWdlIGlzIGNyZWF0ZWQgaWYgbm8gbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkLiBUaGUgcmVjb21tZW5kZWQKLSAqIGNvZGUgc2VxdWVuY2UgZm9yIG5vdGlmeWluZyBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgb2Ygc2F5LAotICogPGNvZGU+Rm9vTGlzdGVuZXIuZXZlbnRIYXBwZW5lZDwvY29kZT4sIGlzOgotICogCi0gKiA8cHJlPgotICogT2JqZWN0W10gbGlzdGVuZXJzID0gbXlMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0gKiBmb3IgKGludCBpID0gMDsgaSAmbHQ7IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotICogCSgoRm9vTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkuZXZlbnRIYXBwZW5lZChldmVudCk7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqIAotICogPC9wPgotICogCi0gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0fSBpbnN0ZWFkLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJMaXN0IGV4dGVuZHMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGlzdGVuZXIgbGlzdCB3aXRoIGFuIGluaXRpYWwgY2FwYWNpdHkgb2YgMS4KLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXJMaXN0KCkgewotCQlzdXBlcihJREVOVElUWSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3RlbmVyIGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gaW5pdGlhbCBjYXBhY2l0eS4KLQkgKiAKLQkgKiBAcGFyYW0gY2FwYWNpdHkKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIHdoaWNoIHRoaXMgbGlzdCBjYW4gaW5pdGlhbGx5IGFjY2VwdAotCSAqICAgICAgICAgICAgd2l0aG91dCBncm93aW5nIGl0cyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbjsgbXVzdCBiZSBhdCBsZWFzdAotCSAqICAgICAgICAgICAgMQotCSAqLwotCXB1YmxpYyBMaXN0ZW5lckxpc3QoaW50IGNhcGFjaXR5KSB7Ci0JCS8vIHRoZSBydW50aW1lIExpc3RlbmVyTGlzdCBkb2VzIG5vdCBzdXBwb3J0IGNhcGFjaXR5Ci0JCXRoaXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL09wZW5TdHJhdGVneS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9PcGVuU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzZjA0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL09wZW5TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Ygc2luZ2xlLWNsaWNrIGFuZCBkb3VibGUtY2xpY2sgc3RyYXRlZ2llcy4KLSAqIDxwPgotICogVXNhZ2U6Ci0gKiA8cHJlPgotICoJT3BlblN0cmF0ZWd5IGhhbmRsZXIgPSBuZXcgT3BlblN0cmF0ZWd5KGNvbnRyb2wpOwotICoJaGFuZGxlci5hZGRPcGVuTGlzdGVuZXIobmV3IElPcGVuRXZlbnRMaXN0ZW5lcigpIHsKLSAqCQlwdWJsaWMgdm9pZCBoYW5kbGVPcGVuKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAqCQkJLi4uIC8vIGNvZGUgdG8gaGFuZGxlIHRoZSBvcGVuIGV2ZW50LgotICoJCX0KLSAqCX0pOwotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuU3RyYXRlZ3kgewotICAgIC8qKiAKLSAgICAgKiBEZWZhdWx0IGJlaGF2aW9yLiBEb3VibGUgY2xpY2sgdG8gb3BlbiB0aGUgaXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1VCTEVfQ0xJQ0sgPSAwOwotCi0gICAgLyoqIAotICAgICAqIFNpbmdsZSBjbGljayB3aWxsIG9wZW4gdGhlIGl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lOR0xFX0NMSUNLID0gMTsKLQotICAgIC8qKiAKLSAgICAgKiBIb3ZlciB3aWxsIHNlbGVjdCB0aGUgaXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RfT05fSE9WRVIgPSAxIDw8IDE7Ci0KLSAgICAvKioKLSAgICAgKiBPcGVuIGl0ZW0gd2hlbiB1c2luZyBhcnJvdyBrZXlzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJST1dfS0VZU19PUEVOID0gMSA8PCAyOwotCi0gICAgLyoqIEEgc2luZ2xlIGNsaWNrIHdpbGwgZ2VuZXJhdGUKLSAgICAgKiBhbiBvcGVuIGV2ZW50IGJ1dCBrZXkgYXJyb3dzIHdpbGwgbm90IGRvIGFueXRoaW5nLgotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fVElNRVIgPSBTSU5HTEVfQ0xJQ0s7Ci0KLSAgICAvKiogQSBzaW5nbGUgY2xpY2sgd2lsbCBnZW5lcmF0ZSBhbiBvcGVuCi0gICAgICogZXZlbnQgYW5kIGtleSBhcnJvd3Mgd2lsbCBnZW5lcmF0ZSBhbiBvcGVuIGV2ZW50IGFmdGVyIGEKLSAgICAgKiBzbWFsbCB0aW1lLgotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9FWFBMT1JFUiA9IFNJTkdMRV9DTElDSyB8IEFSUk9XX0tFWVNfT1BFTjsKLQotICAgIC8qKiBQb2ludGluZyB0byBhbiBpdGVtIHdpbGwgY2hhbmdlIHRoZSBzZWxlY3Rpb24KLSAgICAgKiBhbmQgYSBzaW5nbGUgY2xpY2sgd2lsbCBnZXJlcmF0ZSBhbiBvcGVuIGV2ZW50Ci0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJVkVfREVTS1RPUCA9IFNJTkdMRV9DTElDSyB8IFNFTEVDVF9PTl9IT1ZFUjsKLQotICAgIC8vIFRpbWUgdXNlZCBpbiBGSUxFX0VYUExPUkVSIGFuZCBBQ1RJVkVfREVTS1RPUAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FID0gNTAwOwotCi0gICAgLyogU0lOR0xFX0NMSUNLIG9yIERPVUJMRV9DTElDSzsKLSAgICAgKiBJbiBjYXNlIG9mIFNJTkdMRV9DTElDSywgdGhlIGJpdHMgU0VMRUNUX09OX0hPVkVSIGFuZCBBUlJPV19LRVlTX09QRU4KLSAgICAgKiBteSBiZSBzZXQgYXMgd2VsbC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgQ1VSUkVOVF9NRVRIT0QgPSBET1VCTEVfQ0xJQ0s7Ci0KLSAgICBwcml2YXRlIExpc3RlbmVyIGV2ZW50SGFuZGxlcjsKLQotICAgIHByaXZhdGUgTGlzdGVuZXJMaXN0IG9wZW5FdmVudExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotICAgIHByaXZhdGUgTGlzdGVuZXJMaXN0IHNlbGVjdGlvbkV2ZW50TGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0gICAgcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcG9zdFNlbGVjdGlvbkV2ZW50TGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0gICAgcHVibGljIE9wZW5TdHJhdGVneShDb250cm9sIGNvbnRyb2wpIHsKLSAgICAgICAgaW5pdGlhbGl6ZUhhbmRsZXIoY29udHJvbC5nZXREaXNwbGF5KCkpOwotICAgICAgICBhZGRMaXN0ZW5lcihjb250cm9sKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIElPcGVuRXZlbnRMaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBvcGVuRXZlbnRMaXN0ZW5lcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRPcGVuTGlzdGVuZXIoSU9wZW5FdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG9wZW5FdmVudExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW4gSU9wZW5FdmVudExpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIG9wZW5FdmVudExpc3RlbmVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU9wZW5MaXN0ZW5lcihJT3BlbkV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgb3BlbkV2ZW50TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBTZWxlY3Rpb25MaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBzZWxlY3Rpb25FdmVudExpc3RlbmVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHNlbGVjdGlvbkV2ZW50TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbiBTZWxlY3Rpb25MaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBzZWxlY3Rpb25FdmVudExpc3RlbmVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHNlbGVjdGlvbkV2ZW50TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBTZWxlY3Rpb25MaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBzZWxlY3Rpb25FdmVudExpc3RlbmVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBwb3N0U2VsZWN0aW9uRXZlbnRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFuIFNlbGVjdGlvbkxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGlvbkV2ZW50TGlzdGVuZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUG9zdFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHBvc3RTZWxlY3Rpb25FdmVudExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdXNlZCBzaW5nbGUvZG91YmxlLWNsaWNrIG1ldGhvZAotICAgICAqIAotICAgICAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcms7IGl0IHNob3VsZCBub3QgYmUgaW1wbGVtZW50ZWQgb3V0c2lkZQotICAgICAqIHRoZSBmcmFtZXdvcmsuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0T3Blbk1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIENVUlJFTlRfTUVUSE9EOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY3VycmVudCB1c2VkIHNpbmdsZS9kb3VibGUtY2xpY2sgbWV0aG9kLgotICAgICAqIAotICAgICAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcms7IGl0IHNob3VsZCBub3QgYmUgaW1wbGVtZW50ZWQgb3V0c2lkZQotICAgICAqIHRoZSBmcmFtZXdvcmsuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE9wZW5NZXRob2QoaW50IG1ldGhvZCkgewotICAgICAgICBpZiAobWV0aG9kID09IERPVUJMRV9DTElDSykgewotICAgICAgICAgICAgQ1VSUkVOVF9NRVRIT0QgPSBtZXRob2Q7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChtZXRob2QgJiBTSU5HTEVfQ0xJQ0spID09IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG9wZW4gbW9kZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICgobWV0aG9kICYgKFNJTkdMRV9DTElDSyB8IFNFTEVDVF9PTl9IT1ZFUiB8IEFSUk9XX0tFWVNfT1BFTikpID09IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG9wZW4gbW9kZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIENVUlJFTlRfTUVUSE9EID0gbWV0aG9kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0cnVlIGlmIGVkaXRvcnMgc2hvdWxkIGJlIGFjdGl2YXRlZCB3aGVuIG9wZW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWN0aXZhdGVPbk9wZW4oKSB7Ci0gICAgICAgIHJldHVybiBnZXRPcGVuTWV0aG9kKCkgPT0gRE9VQkxFX0NMSUNLOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQWRkcyBhbGwgbmVlZGVkIGxpc3RlbmVyIHRvIHRoZSBjb250cm9sIGluIG9yZGVyIHRvIGltcGxlbWVudAotICAgICAqIHNpbmdsZS1jbGljay9kb3VibGUtY2xpY2sgc3RyYXRlZ2llcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXIoQ29udHJvbCBjKSB7Ci0gICAgICAgIGMuYWRkTGlzdGVuZXIoU1dULk1vdXNlRW50ZXIsIGV2ZW50SGFuZGxlcik7Ci0gICAgICAgIGMuYWRkTGlzdGVuZXIoU1dULk1vdXNlRXhpdCwgZXZlbnRIYW5kbGVyKTsKLSAgICAgICAgYy5hZGRMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCBldmVudEhhbmRsZXIpOwotICAgICAgICBjLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIGV2ZW50SGFuZGxlcik7Ci0gICAgICAgIGMuYWRkTGlzdGVuZXIoU1dULk1vdXNlVXAsIGV2ZW50SGFuZGxlcik7Ci0gICAgICAgIGMuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGV2ZW50SGFuZGxlcik7Ci0gICAgICAgIGMuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZXZlbnRIYW5kbGVyKTsKLSAgICAgICAgYy5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgZXZlbnRIYW5kbGVyKTsKLSAgICAgICAgYy5hZGRMaXN0ZW5lcihTV1QuQ29sbGFwc2UsIGV2ZW50SGFuZGxlcik7Ci0gICAgICAgIGMuYWRkTGlzdGVuZXIoU1dULkV4cGFuZCwgZXZlbnRIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEZpcmUgdGhlIHNlbGVjdGlvbiBldmVudCB0byBhbGwgc2VsZWN0aW9uRXZlbnRMaXN0ZW5lcnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmlyZVNlbGVjdGlvbkV2ZW50KFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgaWYgKGUuaXRlbSAhPSBudWxsICYmIGUuaXRlbS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIE9iamVjdCBsW10gPSBzZWxlY3Rpb25FdmVudExpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAoKFNlbGVjdGlvbkxpc3RlbmVyKSBsW2ldKS53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogRmlyZSB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gZXZlbnQgdG8gYWxsIHNlbGVjdGlvbkV2ZW50TGlzdGVuZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVEZWZhdWx0U2VsZWN0aW9uRXZlbnQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICBPYmplY3QgbFtdID0gc2VsZWN0aW9uRXZlbnRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgKChTZWxlY3Rpb25MaXN0ZW5lcikgbFtpXSkud2lkZ2V0RGVmYXVsdFNlbGVjdGVkKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGaXJlIHRoZSBwb3N0IHNlbGVjdGlvbiBldmVudCB0byBhbGwgcG9zdFNlbGVjdGlvbkV2ZW50TGlzdGVuZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVQb3N0U2VsZWN0aW9uRXZlbnQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICBpZiAoZS5pdGVtICE9IG51bGwgJiYgZS5pdGVtLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgT2JqZWN0IGxbXSA9IHBvc3RTZWxlY3Rpb25FdmVudExpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAoKFNlbGVjdGlvbkxpc3RlbmVyKSBsW2ldKS53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogRmlyZSB0aGUgb3BlbiBldmVudCB0byBhbGwgb3BlbkV2ZW50TGlzdGVuZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVPcGVuRXZlbnQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICBpZiAoZS5pdGVtICE9IG51bGwgJiYgZS5pdGVtLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgT2JqZWN0IGxbXSA9IG9wZW5FdmVudExpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAoKElPcGVuRXZlbnRMaXN0ZW5lcikgbFtpXSkuaGFuZGxlT3BlbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vSW5pdGlhbGl6ZSBldmVudCBoYW5kbGVyLgotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplSGFuZGxlcihmaW5hbCBEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAgICAgZXZlbnRIYW5kbGVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgYm9vbGVhbiB0aW1lclN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgRXZlbnQgbW91c2VVcEV2ZW50ID0gbnVsbDsKLQotICAgICAgICAgICAgRXZlbnQgbW91c2VNb3ZlRXZlbnQgPSBudWxsOwotCi0gICAgICAgICAgICBTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25QZW5kZW50ID0gbnVsbDsKLQotICAgICAgICAgICAgYm9vbGVhbiBlbnRlcktleURvd24gPSBmYWxzZTsKLQotICAgICAgICAgICAgU2VsZWN0aW9uRXZlbnQgZGVmYXVsdFNlbGVjdGlvblBlbmRlbnQgPSBudWxsOwotCi0gICAgICAgICAgICBib29sZWFuIGFycm93S2V5RG93biA9IGZhbHNlOwotCi0gICAgICAgICAgICBmaW5hbCBpbnRbXSBjb3VudCA9IG5ldyBpbnRbMV07Ci0KLSAgICAgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gY29sbGFwc2VPY2N1cnJlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBib29sZWFuIGV4cGFuZE9jY3VycmVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09IFNXVC5EZWZhdWx0U2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkV2ZW50KGUpOwotICAgICAgICAgICAgICAgICAgICBmaXJlRGVmYXVsdFNlbGVjdGlvbkV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKENVUlJFTlRfTUVUSE9EID09IERPVUJMRV9DTElDSykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyZU9wZW5FdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50ZXJLZXlEb3duKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZU9wZW5FdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXJLZXlEb3duID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFNlbGVjdGlvblBlbmRlbnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2VsZWN0aW9uUGVuZGVudCA9IGV2ZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU1dULk1vdXNlRW50ZXI6Ci0gICAgICAgICAgICAgICAgY2FzZSBTV1QuTW91c2VFeGl0OgotICAgICAgICAgICAgICAgICAgICBtb3VzZVVwRXZlbnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBtb3VzZU1vdmVFdmVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblBlbmRlbnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5Nb3VzZU1vdmU6Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoQ1VSUkVOVF9NRVRIT0QgJiBTRUxFQ1RfT05fSE9WRVIpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlLnN0YXRlTWFzayAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBpZiAoZS53aWRnZXQuZ2V0RGlzcGxheSgpLmdldEZvY3VzQ29udHJvbCgpICE9IGUud2lkZ2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBtb3VzZU1vdmVFdmVudCA9IGU7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlW10gPSBuZXcgUnVubmFibGVbMV07Ci0gICAgICAgICAgICAgICAgICAgIHJ1bm5hYmxlWzBdID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaWZmID0gKGludCkgKHRpbWUgLSBzdGFydFRpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmIDw9IFRJTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS50aW1lckV4ZWMoZGlmZiAqIDIgLyAzLCBydW5uYWJsZVswXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXJTdGFydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGlvbihtb3VzZU1vdmVFdmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0aW1lclN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LnRpbWVyRXhlYyhUSU1FICogMiAvIDMsIHJ1bm5hYmxlWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5Nb3VzZURvd246Ci0gICAgICAgICAgICAgICAgICAgIG1vdXNlVXBFdmVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGFycm93S2V5RG93biA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5FeHBhbmQ6Ci0gICAgICAgICAgICAgICAgICAgIGV4cGFuZE9jY3VycmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTV1QuQ29sbGFwc2U6Ci0gICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlT2NjdXJyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5Nb3VzZVVwOgotICAgICAgICAgICAgICAgICAgICBtb3VzZU1vdmVFdmVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZS5idXR0b24gIT0gMSkgfHwgKChlLnN0YXRlTWFzayAmIH5TV1QuQlVUVE9OMSkgIT0gMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25QZW5kZW50ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKGNvbGxhcHNlT2NjdXJyZWQgfHwgZXhwYW5kT2NjdXJyZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb3VzZVNlbGVjdEl0ZW0oc2VsZWN0aW9uUGVuZGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb3VzZVVwRXZlbnQgPSBlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VPY2N1cnJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kT2NjdXJyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5LZXlEb3duOgotICAgICAgICAgICAgICAgICAgICBtb3VzZU1vdmVFdmVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIG1vdXNlVXBFdmVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGFycm93S2V5RG93biA9ICgoZS5rZXlDb2RlID09IFNXVC5BUlJPV19VUCkgfHwgKGUua2V5Q29kZSA9PSBTV1QuQVJST1dfRE9XTikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZS5zdGF0ZU1hc2sgPT0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUuY2hhcmFjdGVyID09IFNXVC5DUikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRTZWxlY3Rpb25QZW5kZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJlT3BlbkV2ZW50KG5ldyBTZWxlY3Rpb25FdmVudChlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXJLZXlEb3duID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFNlbGVjdGlvblBlbmRlbnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRlcktleURvd24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1dULlNlbGVjdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uRXZlbnQoZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcmVTZWxlY3Rpb25FdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIG1vdXNlTW92ZUV2ZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vdXNlVXBFdmVudCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VTZWxlY3RJdGVtKGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uUGVuZGVudCA9IGV2ZW50OwotICAgICAgICAgICAgICAgICAgICBjb3VudFswXSsrOwotICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiBhcnJvd1VwL2Fycm93RG93biB3aGVuIGluIHRoZSBhcnJvd0tleXNPcGVuIG1vZGUsIHdlCi0gICAgICAgICAgICAgICAgICAgIC8vIHdhbnQgdG8gZGVsYXkgYW55IHNlbGVjdGlvbiB1bnRpbCB0aGUgbGFzdCBhcnJvd0Rvd24vVXAgb2NjdXJzLiAgVGhpcwotICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZSB1c2VyIHByZXNzZXMgYXJyb3dEb3duL1VwIHN1Y2Nlc3NpdmVseS4KLSAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSB3YW50IHRvIG9wZW4gYW4gZWRpdG9yIGZvciB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLgotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFycm93S2V5RG93bikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LnRpbWVyRXhlYyhUSU1FLCBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBjb3VudFswXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCA9PSBjb3VudFswXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJlUG9zdFNlbGVjdGlvbkV2ZW50KG5ldyBTZWxlY3Rpb25FdmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQ1VSUkVOVF9NRVRIT0QgJiBBUlJPV19LRVlTX09QRU4pICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJlT3BlbkV2ZW50KG5ldyBTZWxlY3Rpb25FdmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZVBvc3RTZWxlY3Rpb25FdmVudChuZXcgU2VsZWN0aW9uRXZlbnQoZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9pZCBtb3VzZVNlbGVjdEl0ZW0oU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmICgoQ1VSUkVOVF9NRVRIT0QgJiBTSU5HTEVfQ0xJQ0spICE9IDApCi0gICAgICAgICAgICAgICAgICAgIGZpcmVPcGVuRXZlbnQoZSk7Ci0gICAgICAgICAgICAgICAgbW91c2VVcEV2ZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25QZW5kZW50ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9pZCBzZXRTZWxlY3Rpb24oRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBXaWRnZXQgdyA9IGUud2lkZ2V0OwotICAgICAgICAgICAgICAgIGlmICh3LmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgU2VsZWN0aW9uRXZlbnQgc2VsRXZlbnQgPSBuZXcgU2VsZWN0aW9uRXZlbnQoZSk7Ci0KLSAgICAgICAgICAgICAgICAvKklTU1VFOiBNYXkgaGF2ZSB0byBjcmVhdGUgYSBpbnRlcmZhY2Ugd2l0aCBtZXRob2Q6Ci0gICAgICAgICAgICAgICAgIHNldFNlbGVjdGlvbihQb2ludCBwKSBzbyB0aGF0IHVzZXIncyBjdXN0b20gd2lkZ2V0cyAKLSAgICAgICAgICAgICAgICAgY2FuIHVzZSB0aGlzIGNsYXNzLiBJZiB3ZSBrZWVwIHRoaXMgb3B0aW9uLiAqLwotICAgICAgICAgICAgICAgIGlmICh3IGluc3RhbmNlb2YgVHJlZSkgewotICAgICAgICAgICAgICAgICAgICBUcmVlIHRyZWUgPSAoVHJlZSkgdzsKLSAgICAgICAgICAgICAgICAgICAgVHJlZUl0ZW0gaXRlbSA9IHRyZWUuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHsgaXRlbSB9KTsKLSAgICAgICAgICAgICAgICAgICAgc2VsRXZlbnQuaXRlbSA9IGl0ZW07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3IGluc3RhbmNlb2YgVGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgVGFibGUgdGFibGUgPSAoVGFibGUpIHc7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBpdGVtIH0pOwotICAgICAgICAgICAgICAgICAgICBzZWxFdmVudC5pdGVtID0gaXRlbTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHcgaW5zdGFuY2VvZiBUYWJsZVRyZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgVGFibGVUcmVlIHRhYmxlID0gKFRhYmxlVHJlZSkgdzsKLSAgICAgICAgICAgICAgICAgICAgVGFibGVUcmVlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVUcmVlSXRlbVtdIHsgaXRlbSB9KTsKLSAgICAgICAgICAgICAgICAgICAgc2VsRXZlbnQuaXRlbSA9IGl0ZW07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2VsRXZlbnQuaXRlbSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgZmlyZVNlbGVjdGlvbkV2ZW50KHNlbEV2ZW50KTsKLSAgICAgICAgICAgICAgICBmaXJlUG9zdFNlbGVjdGlvbkV2ZW50KHNlbEV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL1BvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9Qb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxNzYwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL1BvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIENocmlzIEdyb3NzIChzY2h0b29Ac2NodG9vLmNvbSkgLSBzdXBwb3J0IGZvciBJTG9nZ2VyIGFkZGVkCi0gKiAgICAgICAoYnVnIDQ5NDk3IFtSQ1BdIEpGYWNlIGRlcGVuZGVuY3kgb24gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIGVubGFyZ2VzIHN0YW5kYWxvbmUgSkZhY2UgYXBwbGljYXRpb25zKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBUaGUgUG9saWN5IGNsYXNzIGhhbmRsZXMgZGVidWcgZmxhZ3MgYW5kIGxvZ2dpbmcgd2l0aGluIEpGYWNlLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQb2xpY3kgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgZm9yIHRoZSB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciBkZWJ1ZyBvcHRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIEpGYWNlIHBsdWctaW4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkZBQ0UgPSAib3JnLmVjbGlwc2UuamZhY2UiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIElMb2dnZXIgbG9nOwotCi0gICAgLyoqCi0gICAgICogQSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdW5wYXJlbnRlZCBkaWFsb2dzIHNob3VsZAotICAgICAqIGJlIGNoZWNrZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX0RJQUxPR19OT19QQVJFTlQgPSBERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogQSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgYWN0aW9ucyBhcmUgYmVpbmcgdHJhY2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBUUkFDRV9BQ1RJT05TID0gREVGQVVMVDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0b29sYmFycyBhcmUgYmVpbmcgdHJhY2VkLgotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIFRSQUNFX1RPT0xCQVIgPSBERUZBVUxUOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkdW1teSBsb2cgdG8gdXNlIGlmIG5vbmUgaGFzIGJlZW4gc2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUxvZ2dlciBnZXREdW1teUxvZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJTG9nZ2VyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsb2dnZXIgdXNlZCBieSBKRmFjZSB0byBsb2cgZXJyb3JzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsb2dnZXIgdGhlIGxvZ2dlciB0byB1c2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgZGVmYXVsdCBsb2dnZXIKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldExvZyhJTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBsb2cgPSBsb2dnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9nZ2VyIHVzZWQgYnkgSkZhY2UgdG8gbG9nIGVycm9ycy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBsb2dnZXIgcHJpbnRzIHRoZSBzdGF0dXMgdG8gPGNvZGU+U3lzdGVtLmVycjwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvZ2dlcgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElMb2dnZXIgZ2V0TG9nKCkgewotICAgICAgICBpZiAobG9nID09IG51bGwpCi0gICAgICAgICAgICBsb2cgPSBnZXREdW1teUxvZygpOwotICAgICAgICByZXR1cm4gbG9nOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9Qcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRkOGJlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotLyoqCi0gKiBBbiBldmVudCBvYmplY3QgZGVzY3JpYmluZyBhIGNoYW5nZSB0byBhIG5hbWVkIHByb3BlcnR5LgotICogPHA+Ci0gKiBUaGlzIGNvbmNyZXRlIGNsYXNzIHdhcyBkZXNpZ25lZCB0byBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBtYXkKLSAqIGFsc28gYmUgc3ViY2xhc3NlZCBpZiByZXF1aXJlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIEpGYWNlIGZyYW1ld29ya3MgY29udGFpbiBjbGFzc2VzIHRoYXQgcmVwb3J0IHByb3BlcnR5IAotICogY2hhbmdlIGV2ZW50cyBmb3IgaW50ZXJuYWwgc3RhdGUgY2hhbmdlcyB0aGF0IG1heSBiZSBvZiBpbnRlcmVzdAotICogdG8gZXh0ZXJuYWwgcGFydGllcy4gQSBzcGVjaWFsIGxpc3RlbmVyIGludGVyZmFjZQotICogKDxjb2RlPklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPC9jb2RlPikgaXMgZGVmaW5lZCBmb3IgdGhpcyBwdXJwb3NlLAotICogYW5kIGEgdHlwaWNhbCBjbGFzcyBhbGxvdyBsaXN0ZW5lcnMgdG8gYmUgcmVnaXN0ZXJlZCB2aWEKLSAqIGFuIDxjb2RlPmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI8L2NvZGU+IG1ldGhvZC4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcmlhbCB2ZXJzaW9uIFVJRCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NjcyNjE3MzUzMzgxMTI1Nkw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY2hhbmdlZCBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgb2xkIHZhbHVlIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqIG5vdCBrbm93biBvciBub3QgcmVsZXZhbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3Qgb2xkVmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmV3IHZhbHVlIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqIG5vdCBrbm93biBvciBub3QgcmVsZXZhbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgbmV3VmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHByb3BlcnR5IGNoYW5nZSBldmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdGhhdCBoYXMgY2hhbmdlZCAobXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4pCi0gICAgICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnR5Q2hhbmdlRXZlbnQoT2JqZWN0IHNvdXJjZSwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsCi0gICAgICAgICAgICBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3VwZXIoc291cmNlKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChwcm9wZXJ0eSk7Ci0gICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHk7Ci0gICAgICAgIHRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLSAgICAgICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBrbm93bgotICAgICAqICBvciBub3QgcmVsZXZhbnQgKGZvciBpbnN0YW5jZSBpZiB0aGUgcHJvcGVydHkgd2FzIHJlbW92ZWQpLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TmV3VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBuZXdWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgb2xkIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qga25vd24KLSAgICAgKiAgb3Igbm90IHJlbGV2YW50IChmb3IgaW5zdGFuY2UgaWYgdGhlIHByb3BlcnR5IHdhcyBqdXN0Ci0gICAgICogIGFkZGVkIGFuZCB0aGVyZSB3YXMgbm8gb2xkIHZhbHVlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9sZFZhbHVlKCkgewotICAgICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLgotICAgICAqIDxwPgotICAgICAqIFdhcm5pbmc6IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBwcm9wZXJ0eSBuYW1lIHJldHVybmVkCi0gICAgICogaXMgYSBjb25zdGFudCBzdHJpbmcuICBDYWxsZXJzIG11c3QgY29tcGFyZSBwcm9wZXJ0eSBuYW1lcyB1c2luZwotICAgICAqIGVxdWFscywgbm90ID09LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9TYWZlUnVubmFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvU2FmZVJ1bm5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMTQxYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9TYWZlUnVubmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQ2hyaXMgR3Jvc3MgKHNjaHRvb0BzY2h0b28uY29tKSAtIHN1cHBvcnQgZm9yIElTYWZlUnVubmFibGVSdW5uZXIgYWRkZWQKLSAqICAgICAgIChidWcgNDk0OTcgW1JDUF0gSkZhY2UgZGVwZW5kZW5jeSBvbiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUgZW5sYXJnZXMgc3RhbmRhbG9uZSBKRmFjZSBhcHBsaWNhdGlvbnMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci0KLS8qKgotICogSW1wbGVtZW50cyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgSVNhZmVSdW5uYWJsZS4KLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPmhhbmRsZUV4Y2VwdGlvbjwvY29kZT4KLSAqIG9wZW5zIGEgbWVzc2FnZSBkaWFsb2cuCi0gKiA8cD48Yj5Ob3RlOjxiPiBUaGlzIGNsYXNzIGNhbiBvcGVuIGFuIGVycm9yIGRpYWxvZyBhbmQgc2hvdWxkIG5vdCAKLSAqICBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIFVJIFRocmVhZC48L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYWZlUnVubmFibGUgaW1wbGVtZW50cyBJU2FmZVJ1bm5hYmxlIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlnbm9yZUVycm9ycyA9IGZhbHNlOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElTYWZlUnVubmFibGVSdW5uZXIgcnVubmVyOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFNhZmVSdW5uYWJsZSB3aXRoIGEgZGVmYXVsdCBlcnJvciBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFNhZmVSdW5uYWJsZSB3aXRoIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlIHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyBTYWZlUnVubmFibGUoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElTYWZlUnVubmFibGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0gICAgICAgIC8vIFdvcmthcm91bmQgdG8gYXZvaWQgaW50ZXJhY3RpdmUgZXJyb3IgZGlhbG9ncyBkdXJpbmcgYXV0b21hdGVkIHRlc3RpbmcKLSAgICAgICAgaWYgKCFpZ25vcmVFcnJvcnMpIHsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiU2FmZVJ1bm5hYmxlLmVycm9yTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihudWxsLAotICAgICAgICAgICAgICAgICAgICBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIkVycm9yIiksIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIHRvIGF2b2lkIGludGVyYWN0aXZlIGVycm9yIGRpYWxvZ3MgZHVyaW5nIGF1dG9tYXRlZCB0ZXN0aW5nLgotICAgICAqIEBkZXByZWNhdGVkIHVzZSBnZXRJZ25vcmVFcnJvcnMoKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJZ25vcmVFcnJvcnMoYm9vbGVhbiBmbGFnKSB7Ci0gICAgICAgIHJldHVybiBpZ25vcmVFcnJvcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmxhZyB0byBhdm9pZCBpbnRlcmFjdGl2ZSBlcnJvciBkaWFsb2dzIGR1cmluZyBhdXRvbWF0ZWQgdGVzdGluZy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldElnbm9yZUVycm9ycygpIHsKLSAgICAgICAgcmV0dXJuIGlnbm9yZUVycm9yczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIHRvIGF2b2lkIGludGVyYWN0aXZlIGVycm9yIGRpYWxvZ3MgZHVyaW5nIGF1dG9tYXRlZCB0ZXN0aW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJZ25vcmVFcnJvcnMoYm9vbGVhbiBmbGFnKSB7Ci0gICAgICAgIGlnbm9yZUVycm9ycyA9IGZsYWc7Ci0gICAgfQotICAgIAotCS8qKgotICAgICAqIFJldHVybnMgdGhlIHNhZmUgcnVubmFibGUgcnVubmVyLgotICAgICAqIAotCSAqIEByZXR1cm4gdGhlIHNhZmUgcnVubmFibGUgcnVubmVyCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNhZmVSdW5uYWJsZVJ1bm5lciBnZXRSdW5uZXIoKSB7Ci0gICAgICAgIGlmIChydW5uZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcnVubmVyID0gY3JlYXRlRGVmYXVsdFJ1bm5lcigpOwotICAgICAgICB9Ci0JCXJldHVybiBydW5uZXI7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBzYWZlIHJ1bm5hYmxlIHJ1bm5lci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHNhZmUgcnVubmFibGUgcnVubmVyCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIElTYWZlUnVubmFibGVSdW5uZXIgY3JlYXRlRGVmYXVsdFJ1bm5lcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJU2FmZVJ1bm5hYmxlUnVubmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElTYWZlUnVubmFibGUgY29kZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUucnVuKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGNvZGUsIGUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKExpbmthZ2VFcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihjb2RlLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oSVNhZmVSdW5uYWJsZSBjb2RlLCBUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29kZS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIAotCS8qKgotICAgICAqIFNldHMgdGhlIHNhZmUgcnVubmFibGUgcnVubmVyLgotICAgICAqICAKLQkgKiBAcGFyYW0gcnVubmVyIHRoZSBydW5uZXIgdG8gc2V0LCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byByZXNldCB0byB0aGUgZGVmYXVsdCBydW5uZXIKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJ1bm5lcihJU2FmZVJ1bm5hYmxlUnVubmVyIHJ1bm5lcikgewotCQlTYWZlUnVubmFibGUucnVubmVyID0gcnVubmVyOwotCX0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIGdpdmVuIHNhZmUgcnVubmFibGUgdXNpbmcgdGhlIHNhZmUgcnVubmFibGUgcnVubmVyLgotICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QsIGVxdWl2YWxlbnQgdG86Ci0gICAgICogPGNvZGU+U2FmZVJ1bm5hYmxlLmdldFJ1bm5lcigpLnJ1bihydW5uYWJsZSk8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBydW5uYWJsZSB0aGUgcnVubmFibGUgdG8gcnVuCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW4oSVNhZmVSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBnZXRSdW5uZXIoKS5ydW4ocnVubmFibGUpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjMzY4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL1RyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjwvY29kZT4gaXMgYSA8Y29kZT5EcmFnU291cmNlTGlzdGVuZXI8L2NvZGU+IAotICogdGhhdCBjYW4gaGFuZGxlIG9uZSB0eXBlIG9mIFNXVCB7QGxpbmsgVHJhbnNmZXJ9LiAKLSAqIFRoZSBwdXJwb3NlIG9mIGEgPGNvZGU+VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI8L2NvZGU+IGlzIHRvOgotICogPHVsPgotICogICA8bGk+RGV0ZXJtaW5lIGVuYWJsZW1lbnQgZm9yIGEgZHJhZyBvcGVyYXRpb24uIEEgPGNvZGU+VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI8L2NvZGU+Ci0gKiAJd2lsbCBub3QgYmUgdXNlZCBpbiBhIGRyYWcgb3BlcmF0aW9uIGlmIHRoZSA8Y29kZT5EcmFnU291cmNlRXZlbnQjZG9pdDwvY29kZT4gZmllbGQgCi0gKiAJaXMgc2V0IHRvIGZhbHNlIGluIDxjb2RlPkRyYWdTb3VyY2VMaXN0ZW5lciNkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50KTwvY29kZT4uCi0gKiAgIDxsaT5TZXQgZGF0YSBmb3IgYSBzaW5nbGUgdHlwZSBvZiBkcmFnIGFuZCA8Y29kZT5UcmFuc2ZlcjwvY29kZT4gdHlwZS4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIEEgPGNvZGU+RGVsZWdhdGluZ0RyYWdBZGFwdGVyPC9jb2RlPiBhbGxvd3MgdGhlc2UgZnVuY3Rpb25zIHRvIGJlIGltcGxlbWVudGVkIAotICogc2VwYXJhdGVseSBmb3IgdW5yZWxhdGVkIHR5cGVzIG9mIGRyYWdzLiA8Y29kZT5EZWxlZ2F0aW5nRHJhZ0FkYXB0ZXI8L2NvZGU+IHRoZW4gCi0gKiBjb21iaW5lcyB0aGUgZnVuY3Rpb24gb2YgZWFjaCA8Y29kZT5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjwvY29kZT4sIHdoaWxlIAotICogYWxsb3dpbmcgdGhlbSB0byBiZSBpbXBsZW1lbnRlZCBhcyBpZiB0aGV5IHdlcmUgdGhlIG9ubHkgPGNvZGU+RHJhZ1NvdXJjZUxpc3RlbmVyPC9jb2RlPi4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lciBleHRlbmRzIERyYWdTb3VyY2VMaXN0ZW5lciB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgPGNvZGU+VHJhbnNmZXI8L2NvZGU+IHR5cGUgdGhhdCB0aGlzIGxpc3RlbmVyIGNhbiBwcm92aWRlIGRhdGEgZm9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPlRyYW5zZmVyPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaXN0ZW5lcgotICAgICAqLwotICAgIFRyYW5zZmVyIGdldFRyYW5zZmVyKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL1RyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL1RyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzRiOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotCi0vKioKLSAqIEEgPGNvZGU+VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXI8L2NvZGU+IGlzIGEgPGNvZGU+RHJvcFRyYWdldExpc3RlbmVyPC9jb2RlPiAKLSAqIHRoYXQgaGFuZGxlcyBvbmUgdHlwZSBvZiBTV1Qge0BsaW5rIFRyYW5zZmVyfS4gCi0gKiBUaGUgcHVycG9zZSBvZiBhIDxjb2RlPlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyPC9jb2RlPiBpcyB0bzoKLSAqIDx1bD4KLSAqICAgPGxpPkRldGVybWluZSBlbmFibGVtZW50IGZvciBhIGRyb3Agb3BlcmF0aW9uLiBBIDxjb2RlPlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyPC9jb2RlPgotICogCQl3aWxsIG5vdCBiZSB1c2VkIGlmIDxjb2RlPmlzRW5hYmxlZDwvY29kZT4gcmV0dXJucyBmYWxzZS4gCi0gKiAgIDxsaT5XaGVuIGVuYWJsZWQsIG9wdGlvbmFsbHkgc2hvdyBmZWVkYmFjayBvbiB0aGUgPGNvZGU+RHJvcFRhcmdldDwvY29kZT4uCi0gKiAgIDxsaT5QZXJmb3JtIHRoZSBhY3R1YWwgZHJvcAotICogPC91bD4KLSAqIEEgPGNvZGU+RGVsZWdhdGluZ0Ryb3BBZGFwdGVyPC9jb2RlPiBhbGxvd3MgdGhlc2UgZnVuY3Rpb25zIHRvIGJlIGltcGxlbWVudGVkIAotICogc2VwYXJhdGVseSBmb3IgdW5yZWxhdGVkIHR5cGVzIG9mIGRyYWdzLiA8Y29kZT5EZWxlZ2F0aW5nRHJvcEFkYXB0ZXI8L2NvZGU+IHRoZW4gCi0gKiBjb21iaW5lcyB0aGUgZnVuY3Rpb24gb2YgZWFjaCA8Y29kZT5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjwvY29kZT4sIHdoaWxlIAotICogYWxsb3dpbmcgdGhlbSB0byBiZSBpbXBsZW1lbnRlZCBhcyBpZiB0aGV5IHdlcmUgdGhlIG9ubHkgPGNvZGU+RHJhZ1NvdXJjZUxpc3RlbmVyPC9jb2RlPi4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lciBleHRlbmRzIERyb3BUYXJnZXRMaXN0ZW5lciB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgPGNvZGU+VHJhbnNmZXI8L2NvZGU+IHR5cGUgdGhhdCB0aGlzIGxpc3RlbmVyIGNhbiAKLSAgICAgKiBhY2NlcHQgYSBkcm9wIG9wZXJhdGlvbiBmb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+VHJhbnNmZXI8L2NvZGU+IGZvciB0aGlzIGxpc3RlbmVyCi0gICAgICovCi0gICAgVHJhbnNmZXIgZ2V0VHJhbnNmZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBsaXN0ZW5lciBjYW4gaGFuZGxlIHRoZSBkcm9wCi0gICAgICogYmFzZWQgb24gdGhlIGdpdmVuIDxjb2RlPkRyb3BUYXJnZXRFdmVudDwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSA8Y29kZT5EZWxlZ2F0aW5nRHJvcEFkYXB0ZXI8L2NvZGU+IG9ubHkKLSAgICAgKiBpZiB0aGUgPGNvZGU+RHJvcFRhcmdldEV2ZW50PC9jb2RlPiBjb250YWlucyBhIHRyYW5zZmVyIGRhdGEgdHlwZQotICAgICAqIHN1cHBvcnRlZCBieSB0aGlzIGxpc3RlbmVyLiBUaGUgPGNvZGU+VHJhbnNmZXI8L2NvZGU+IHJldHVybmVkIGJ5IHRoZSAKLSAgICAgKiA8Y29kZT4jZ2V0VHJhbnNmZXIoKTwvY29kZT4gbWV0aG9kIGlzIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBkcm9wIHRhcmdldCBldmVudAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpc3RlbmVyIGlzIGVuYWJsZWQgZm9yIHRoZSBnaXZlbgotICAgICAqIAlkcm9wIHRhcmdldCBldmVudC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRW5hYmxlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFiMjM2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS91dGlsL1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiBBIHN0YXRpYyBjbGFzcyBwcm92aWRpbmcgdXRpbGl0eSBtZXRob2RzIHRvIGFsbCBvZiBKRmFjZS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVXRpbCB7Ci0KLQkvKioKLQkgKiBBbiB1bm1vZGlmaWFibGUsIGVtcHR5LCBzb3J0ZWQgc2V0LiBUaGlzIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIKLQkgKiBjaGFuZ2UgYW5kIG5ldmVyIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU29ydGVkU2V0IEVNUFRZX1NPUlRFRF9TRVQgPSBDb2xsZWN0aW9ucwotCQkJLnVubW9kaWZpYWJsZVNvcnRlZFNldChuZXcgVHJlZVNldCgpKTsKLQotCS8qKgotCSAqIEEgY29tbW9uIHplcm8tbGVuZ3RoIHN0cmluZy4gSXQgYXZvaWRzIG5lZWRpbmcgd3JpdGUgPGNvZGU+Tk9OLU5MUzwvY29kZT4KLQkgKiBuZXh0IHRvIGNvZGUgZnJhZ21lbnRzLiBJdCdzIGFsc28gYSBiaXQgY2xlYXJlciB0byByZWFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9fTEVOR1RIX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gY2hlY2s7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gYwotCSAqICAgICAgICAgICAgVGhlIGNsYXNzIHdoaWNoIHRoZSBvYmplY3Qgc2hvdWxkIGJlOyBtdXN0IG5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGFzc2VydEluc3RhbmNlKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzIGMpIHsKLQkJYXNzZXJ0SW5zdGFuY2Uob2JqZWN0LCBjLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhlIGdpdmVuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuIEl0IGlzCi0JICogcG9zc2libGUgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBvYmplY3QgaXMgcGVybWl0dGVkIHRvIGJlCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCB0byBjaGVjazsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBjCi0JICogICAgICAgICAgICBUaGUgY2xhc3Mgd2hpY2ggdGhlIG9iamVjdCBzaG91bGQgYmU7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gYWxsb3dOdWxsCi0JICogICAgICAgICAgICBXaGV0aGVyIHRoZSBvYmplY3QgaXMgYWxsb3dlZCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGFzc2VydEluc3RhbmNlKGZpbmFsIE9iamVjdCBvYmplY3QsCi0JCQlmaW5hbCBDbGFzcyBjLCBmaW5hbCBib29sZWFuIGFsbG93TnVsbCkgewotCQlpZiAob2JqZWN0ID09IG51bGwgJiYgYWxsb3dOdWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCBjID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJZWxzZSBpZiAoIWMuaXNJbnN0YW5jZShvYmplY3QpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIENvbXBhcmVzIHR3byBib29sZWFuIHZhbHVlcy4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIGNvbnNpZGVyZWQgdG8gYmUKLQkgKiAibGVzcyB0aGFuIiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbGVmdAotCSAqICAgICAgICAgICAgVGhlIGxlZnQgdmFsdWUgdG8gY29tcGFyZQotCSAqIEBwYXJhbSByaWdodAotCSAqICAgICAgICAgICAgVGhlIHJpZ2h0IHZhbHVlIHRvIGNvbXBhcmUKLQkgKiBAcmV0dXJuIDxjb2RlPi0xPC9jb2RlPiBpZiB0aGUgbGVmdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIHRoZQotCSAqICAgICAgICAgcmlnaHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIDxjb2RlPjE8L2NvZGU+IGlmIHRoZSBvcHBvc2l0ZQotCSAqICAgICAgICAgaXMgdHJ1ZS4gSWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gaXQgcmV0dXJucyA8Y29kZT4wPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wYXJlKGZpbmFsIGJvb2xlYW4gbGVmdCwgZmluYWwgYm9vbGVhbiByaWdodCkgewotCQlyZXR1cm4gbGVmdCA9PSBmYWxzZSA/IChyaWdodCA9PSB0cnVlID8gLTEgOiAwKSA6IDE7Ci0JfQotCi0JLyoqCi0JICogQ29tcGFyZXMgdHdvIGludGVnZXIgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBsZWZ0Ci0JICogICAgICAgICAgICBUaGUgbGVmdCB2YWx1ZSB0byBjb21wYXJlCi0JICogQHBhcmFtIHJpZ2h0Ci0JICogICAgICAgICAgICBUaGUgcmlnaHQgdmFsdWUgdG8gY29tcGFyZQotCSAqIEByZXR1cm4gPGNvZGU+bGVmdCAtIHJpZ2h0PC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbXBhcmUoZmluYWwgaW50IGxlZnQsIGZpbmFsIGludCByaWdodCkgewotCQlyZXR1cm4gbGVmdCAtIHJpZ2h0OwotCX0KLQotCS8qKgotCSAqIENvbXBhcmVzIHRvIGNvbXBhcmFibGUgb2JqZWN0cyAtLSBkZWZlbmRpbmcgYWdhaW5zdCA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbGVmdAotCSAqICAgICAgICAgICAgVGhlIGxlZnQgb2JqZWN0IHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcmlnaHQKLQkgKiAgICAgICAgICAgIFRoZSByaWdodCBvYmplY3QgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbi4gPGNvZGU+bnVsbDwvY29kZT4gaXMgY29uc2lkZXJlZAotCSAqICAgICAgICAgdG8gYmUgdGhlIGxlYXN0IHBvc3NpYmxlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbXBhcmUoZmluYWwgQ29tcGFyYWJsZSBsZWZ0LAotCQkJZmluYWwgQ29tcGFyYWJsZSByaWdodCkgewotCQlpZiAobGVmdCA9PSBudWxsICYmIHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZSBpZiAobGVmdCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQllbHNlIGlmIChyaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UKLQkJCXJldHVybiBsZWZ0LmNvbXBhcmVUbyhyaWdodCk7Ci0JfQotCi0JLyoqCi0JICogQ29tcGFyZXMgdHdvIGFycmF5cyBvZiBjb21wYXJhYmxlIG9iamVjdHMgLS0gYWNjb3VudGluZyBmb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbGVmdAotCSAqICAgICAgICAgICAgVGhlIGxlZnQgYXJyYXkgdG8gYmUgY29tcGFyZWQ7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcmlnaHQKLQkgKiAgICAgICAgICAgIFRoZSByaWdodCBhcnJheSB0byBiZSBjb21wYXJlZDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbi4gPGNvZGU+bnVsbDwvY29kZT4gaXMgY29uc2lkZXJlZAotCSAqICAgICAgICAgdG8gYmUgdGhlIGxlYXN0IHBvc3NpYmxlIHZhbHVlLiBBIHNob3J0ZXIgYXJyYXkgaXMgY29uc2lkZXJlZAotCSAqICAgICAgICAgbGVzcyB0aGFuIGEgbG9uZ2VyIGFycmF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbXBhcmUoZmluYWwgQ29tcGFyYWJsZVtdIGxlZnQsCi0JCQlmaW5hbCBDb21wYXJhYmxlW10gcmlnaHQpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKGxlZnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZSBpZiAocmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiAxOwotCQllbHNlIHsKLQkJCWludCBsID0gbGVmdC5sZW5ndGg7Ci0JCQlpbnQgciA9IHJpZ2h0Lmxlbmd0aDsKLQotCQkJaWYgKGwgIT0gcikKLQkJCQlyZXR1cm4gbCAtIHI7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7Ci0JCQkJaW50IGNvbXBhcmVUbyA9IGNvbXBhcmUobGVmdFtpXSwgcmlnaHRbaV0pOwotCi0JCQkJaWYgKGNvbXBhcmVUbyAhPSAwKQotCQkJCQlyZXR1cm4gY29tcGFyZVRvOwotCQkJfQotCi0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXBhcmVzIHR3byBsaXN0cyAtLSBhY2NvdW50IGZvciA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIGxpc3RzIG11c3QKLQkgKiBjb250YWluIGNvbXBhcmFibGUgb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGVmdAotCSAqICAgICAgICAgICAgVGhlIGxlZnQgbGlzdCB0byBjb21wYXJlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uIFRoaXMKLQkgKiAgICAgICAgICAgIGxpc3QgbXVzdCBvbmx5IGNvbnRhaW4gaW5zdGFuY2VzIG9mIDxjb2RlPkNvbXBhcmFibGU8L2NvZGU+LgotCSAqIEBwYXJhbSByaWdodAotCSAqICAgICAgICAgICAgVGhlIHJpZ2h0IGxpc3QgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzCi0JICogICAgICAgICAgICBsaXN0IG11c3Qgb25seSBjb250YWluIGluc3RhbmNlcyBvZiA8Y29kZT5Db21wYXJhYmxlPC9jb2RlPi4KLQkgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24uIDxjb2RlPm51bGw8L2NvZGU+IGlzIGNvbnNpZGVyZWQKLQkgKiAgICAgICAgIHRvIGJlIHRoZSBsZWFzdCBwb3NzaWJsZSB2YWx1ZS4gQSBzaG9ydGVyIGxpc3QgaXMgY29uc2lkZXJlZCBsZXNzCi0JICogICAgICAgICB0aGFuIGEgbG9uZ2VyIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tcGFyZShmaW5hbCBMaXN0IGxlZnQsIGZpbmFsIExpc3QgcmlnaHQpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKGxlZnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZSBpZiAocmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiAxOwotCQllbHNlIHsKLQkJCWludCBsID0gbGVmdC5zaXplKCk7Ci0JCQlpbnQgciA9IHJpZ2h0LnNpemUoKTsKLQotCQkJaWYgKGwgIT0gcikKLQkJCQlyZXR1cm4gbCAtIHI7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7Ci0JCQkJaW50IGNvbXBhcmVUbyA9IGNvbXBhcmUoKENvbXBhcmFibGUpIGxlZnQuZ2V0KGkpLAotCQkJCQkJKENvbXBhcmFibGUpIHJpZ2h0LmdldChpKSk7Ci0KLQkJCQlpZiAoY29tcGFyZVRvICE9IDApCi0JCQkJCXJldHVybiBjb21wYXJlVG87Ci0JCQl9Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgZmlyc3QgYXJyYXkgZW5kcyB3aXRoIHRoZSBzZWNvbmQgYXJyYXkuCi0JICogCi0JICogQHBhcmFtIGxlZnQKLQkgKiAgICAgICAgICAgIFRoZSBhcnJheSB0byBjaGVjayAobGFyZ2VyKTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSByaWdodAotCSAqICAgICAgICAgICAgVGhlIGFycmF5IHRoYXQgc2hvdWxkIGJlIGEgc3Vic2VxdWVuY2UgKHNtYWxsZXIpOyBtYXkgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBlcXVhbHMKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgdGhlIHR3byBhcnJheSBhcmUgYWxsb3dlZCB0byBiZSBlcXVhbC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWNvbmQgYXJyYXkgaXMgYSBzdWJzZXF1ZW5jZSBvZiB0aGUKLQkgKiAgICAgICAgIGFycmF5IGxpc3QsIGFuZCB0aGV5IHNoYXJlIGVuZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZW5kc1dpdGgoZmluYWwgT2JqZWN0W10gbGVmdCwKLQkJCWZpbmFsIE9iamVjdFtdIHJpZ2h0LCBmaW5hbCBib29sZWFuIGVxdWFscykgewotCQlpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGwgPSBsZWZ0Lmxlbmd0aDsKLQkJaW50IHIgPSByaWdodC5sZW5ndGg7Ci0KLQkJaWYgKHIgPiBsIHx8ICFlcXVhbHMgJiYgciA9PSBsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcjsgaSsrKQotCQkJaWYgKCFlcXVhbHMobGVmdFtsIC0gaSAtIDFdLCByaWdodFtyIC0gaSAtIDFdKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIHR3byBvYmplY3RzIGFyZSA8Y29kZT5udWxsPC9jb2RlPiAtLSBhbGxvd2luZyBmb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbGVmdAotCSAqICAgICAgICAgICAgVGhlIGxlZnQgb2JqZWN0IHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcmlnaHQKLQkgKiAgICAgICAgICAgIFRoZSByaWdodCBvYmplY3QgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVpdmFsZW50OwotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBsZWZ0LCBmaW5hbCBPYmplY3QgcmlnaHQpIHsKLQkJcmV0dXJuIGxlZnQgPT0gbnVsbCA/IHJpZ2h0ID09IG51bGwgOiAoKHJpZ2h0ICE9IG51bGwpICYmIGxlZnQKLQkJCQkuZXF1YWxzKHJpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0d28gYXJyYXlzIG9mIG9iamVjdHMgYXJlIGVxdWFsIHRvIGVhY2ggb3RoZXIuIFRoZSBhcnJheXMKLQkgKiBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiwgYnV0IHRoZWlyIGVsZW1lbnRzIG1heSBiZQotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBsZWZ0QXJyYXkKLQkgKiAgICAgICAgICAgIFRoZSBsZWZ0IGFycmF5IHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgYW5kCi0JICogICAgICAgICAgICBtYXkgYmUgZW1wdHkgYW5kIG1heSBjb250YWluIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnRzLgotCSAqIEBwYXJhbSByaWdodEFycmF5Ci0JICogICAgICAgICAgICBUaGUgcmlnaHQgYXJyYXkgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBhbmQKLQkgKiAgICAgICAgICAgIG1heSBiZSBlbXB0eSBhbmQgbWF5IGNvbnRhaW4gPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJyYXlzIGFyZSBlcXVhbCBsZW5ndGggYW5kIHRoZQotCSAqICAgICAgICAgZWxlbWVudHMgYXQgdGhlIHNhbWUgcG9zaXRpb24gYXJlIGVxdWFsOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdFtdIGxlZnRBcnJheSwKLQkJCWZpbmFsIE9iamVjdFtdIHJpZ2h0QXJyYXkpIHsKLQkJaWYgKGxlZnRBcnJheSA9PSByaWdodEFycmF5KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChsZWZ0QXJyYXkgPT0gbnVsbCkgewotCQkJcmV0dXJuIChyaWdodEFycmF5ID09IG51bGwpOwotCQl9IGVsc2UgaWYgKHJpZ2h0QXJyYXkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGxlZnRBcnJheS5sZW5ndGggIT0gcmlnaHRBcnJheS5sZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVmdEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBPYmplY3QgbGVmdCA9IGxlZnRBcnJheVtpXTsKLQkJCWZpbmFsIE9iamVjdCByaWdodCA9IHJpZ2h0QXJyYXlbaV07Ci0JCQlmaW5hbCBib29sZWFuIGVxdWFsID0gKGxlZnQgPT0gbnVsbCkgPyAocmlnaHQgPT0gbnVsbCkgOiAobGVmdAotCQkJCQkuZXF1YWxzKHJpZ2h0KSk7Ci0JCQlpZiAoIWVxdWFsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgYSBoYXNoIGNvZGUgYmFzZWQgb24gdGhlIGdpdmVuIGludGVnZXIgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIFRoZSBpbnRlZ2VyIHZhbHVlCi0JICogQHJldHVybiA8Y29kZT5pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhhc2hDb2RlKGZpbmFsIGludCBpKSB7Ci0JCXJldHVybiBpOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGEgaGFzaCBjb2RlIGZvciB0aGUgb2JqZWN0IC0tIGRlZmVuZGluZyBhZ2FpbnN0Ci0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCBmb3Igd2hpY2ggYSBoYXNoIGNvZGUgaXMgcmVxdWlyZWQuCi0JICogQHJldHVybiA8Y29kZT5vYmplY3QuaGFzaENvZGU8L2NvZGU+IG9yIDxjb2RlPjA8L2NvZGU+IGlmCi0JICogICAgICAgICA8Y29kZT5vYmplY3Q8L2NvZGU+IGlmIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhhc2hDb2RlKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdCAhPSBudWxsID8gb2JqZWN0Lmhhc2hDb2RlKCkgOiAwOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBoYXNoIGNvZGUgZm9yIGFuIGFycmF5IG9mIG9iamVjdHMsIGJ1dCB3aXRoIGRlZmVuc2UgYWdhaW5zdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzCi0JICogICAgICAgICAgICBUaGUgYXJyYXkgb2Ygb2JqZWN0cyBmb3Igd2hpY2ggYSBoYXNoIGNvZGUgaXMgbmVlZGVkOyBtYXkgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gVGhlIGhhc2ggY29kZSBmb3IgPGNvZGU+b2JqZWN0czwvY29kZT47IG9yIDxjb2RlPjA8L2NvZGU+IGlmCi0JICogICAgICAgICA8Y29kZT5vYmplY3RzPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBoYXNoQ29kZShmaW5hbCBPYmplY3RbXSBvYmplY3RzKSB7Ci0JCWlmIChvYmplY3RzID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaW50IGhhc2hDb2RlID0gODk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgT2JqZWN0IG9iamVjdCA9IG9iamVjdHNbaV07Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQloYXNoQ29kZSA9IGhhc2hDb2RlICogMzEgKyBvYmplY3QuaGFzaENvZGUoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBoYXNoQ29kZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgc2Vjb25kIGFycmF5IGlzIGEgc3Vic2VxdWVuY2Ugb2YgdGhlIGZpcnN0IGFycmF5LCBhbmQKLQkgKiB0aGF0IHRoZXkgc2hhcmUgY29tbW9uIHN0YXJ0aW5nIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsZWZ0Ci0JICogICAgICAgICAgICBUaGUgZmlyc3QgYXJyYXkgdG8gY29tcGFyZSAobGFyZ2UpOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHJpZ2h0Ci0JICogICAgICAgICAgICBUaGUgc2Vjb25kIGFycmF5IHRvIGNvbXBhcmUgKHNtYWxsKTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBlcXVhbHMKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgaXQgaXMgYWxsb3dlZCBmb3IgdGhlIHR3byBhcnJheXMgdG8gYmUgZXF1aXZhbGVudC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaXJzdCBhcnJheXMgc3RhcnRzIHdpdGggdGhlIHNlY29uZAotCSAqICAgICAgICAgbGlzdDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3RhcnRzV2l0aChmaW5hbCBPYmplY3RbXSBsZWZ0LAotCQkJZmluYWwgT2JqZWN0W10gcmlnaHQsIGZpbmFsIGJvb2xlYW4gZXF1YWxzKSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgbCA9IGxlZnQubGVuZ3RoOwotCQlpbnQgciA9IHJpZ2h0Lmxlbmd0aDsKLQotCQlpZiAociA+IGwgfHwgIWVxdWFscyAmJiByID09IGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByOyBpKyspCi0JCQlpZiAoIWVxdWFscyhsZWZ0W2ldLCByaWdodFtpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGFuIGFycmF5IGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBzdWl0YWJsZSBmb3IKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGFycmF5Ci0JICogICAgICAgICAgICBUaGUgYXJyYXkgdG8gY29udmVydDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJyYXk7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKGZpbmFsIE9iamVjdFtdIGFycmF5KSB7Ci0JCWlmIChhcnJheSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCdbJyk7Ci0KLQkJZmluYWwgaW50IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoJywnKTsKLQkJCX0KLQkJCWZpbmFsIE9iamVjdCBvYmplY3QgPSBhcnJheVtpXTsKLQkJCWZpbmFsIFN0cmluZyBlbGVtZW50ID0gU3RyaW5nLnZhbHVlT2Yob2JqZWN0KTsKLQkJCWJ1ZmZlci5hcHBlbmQoZWxlbWVudCk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnXScpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhIHRyYW5zbGF0aW9uIG9mIGEgcGFydGljdWxhciBrZXkgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQotCSAqICAgICAgICAgICAgVGhlIGtleSB0byBsb29rIHVwIGluIHRoZSByZXNvdXJjZSBidW5kbGU7IHNob3VsZCBub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBrZXkgdG8gbG9vayB1cCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlOyBzaG91bGQgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gZGVmYXVsdFN0cmluZwotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcmVzb3VyY2UgY2Fubm90IGJlIGZvdW5kOyBtYXkgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2xhdGVkIHJlc291cmNlIGF0IDxjb2RlPmtleTwvY29kZT4uIElmCi0JICogICAgICAgICB0aGUga2V5IGNhbm5vdCBiZSBmb3VuZCwgdGhlbiBpdCBpcyBzaW1wbHkgdGhlCi0JICogICAgICAgICA8Y29kZT5kZWZhdWx0U3RyaW5nPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0cmFuc2xhdGVTdHJpbmcoCi0JCQlmaW5hbCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgZmluYWwgU3RyaW5nIGtleSwKLQkJCWZpbmFsIFN0cmluZyBkZWZhdWx0U3RyaW5nKSB7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsICYmIGtleSAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlmaW5hbCBTdHJpbmcgdHJhbnNsYXRlZFN0cmluZyA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCi0JCQkJaWYgKHRyYW5zbGF0ZWRTdHJpbmcgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHRyYW5zbGF0ZWRTdHJpbmc7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZU1pc3NpbmdSZXNvdXJjZSkgewotCQkJCS8vIFN1Y2ggaXMgbGlmZS4gV2UnbGwgcmV0dXJuIHRoZSBrZXkKLQkJCX0KLQotCQlyZXR1cm4gZGVmYXVsdFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIHNob3VsZCBuZXZlciBiZSBjb25zdHJ1Y3RlZC4KLQkgKi8KLQlwcml2YXRlIFV0aWwoKSB7Ci0JCS8vIE5vdCBhbGxvd2VkLgotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3V0aWwvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmU5MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotUHJvdmlkZXMgdXNlZnVsIGJ1aWxkaW5nIGJsb2NrcyB1c2VkIHRocm91Z2hvdXQgSkZhY2UsCi1pbmNsdWRpbmcgcHJvcGVydHkgY2hhbmdlIGV2ZW50cywgYSBsaXN0ZW5lciBsaXN0IGltcGxlbWVudGF0aW9uLCBhbmQgcnVudGltZQotY2hlY2tlZCBhc3NlcnRpb25zLgotPGJyPiZuYnNwOwotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9BYnN0cmFjdExpc3RWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvQWJzdHJhY3RMaXN0Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNzZjN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9BYnN0cmFjdExpc3RWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQ2hyaXMgTG9uZ2ZpZWxkIDxjbG9uZ2ZpZWxkQGludGVybmFwLmNvbT4gLSBGaXggZm9yIEJ1ZyA3MDg1NgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB2aWV3ZXJzIHRoYXQgY29udGFpbiBsaXN0cyBvZiBpdGVtcyAoc3VjaCBhcyBhIGNvbWJvIG9yIGxpc3QpLgotICogTW9zdCBvZiB0aGUgdmlld2VyIGltcGxlbWVudGF0aW9uIGlzIGluIHRoaXMgYmFzZSBjbGFzcywgZXhjZXB0IGZvciB0aGUgbWluaW1hbCBjb2RlIHRoYXQKLSAqIGFjdHVhbGx5IGNvbW11bmljYXRlcyB3aXRoIHRoZSB1bmRlcmx5aW5nIHdpZGdldC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpc3RWaWV3ZXIgZXh0ZW5kcyBTdHJ1Y3R1cmVkVmlld2VyIHsKLQotICAgIC8qKgotICAgICAqIEEgbGlzdCBvZiB2aWV3ZXIgZWxlbWVudHMgKGVsZW1lbnQgdHlwZTogPGNvZGU+T2JqZWN0PC9jb2RlPikuCi0gICAgICovCi0gICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBsaXN0TWFwID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHdpZGdldCBhdCB0aGUgZ2l2ZW4gaW5kZXgKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHN0cmluZyB0aGUgc3RyaW5nIHRvIGFkZAotICAgICAqIEBwYXJhbSBpbmRleCBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHN0cmluZyBpbnRvCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbGlzdEFkZChTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGV4dCBvZiB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gaW5kZXggaW4gdGhlIHVuZGVybHlpbmcgd2lkZ2V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCBpbmRleCB0byBtb2RpZnkKLSAgICAgKiBAcGFyYW0gc3RyaW5nIG5ldyB0ZXh0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbGlzdFNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgc3RyaW5nKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHplcm8tcmVsYXRpdmUgaW5kaWNlcyBvZiB0aGUgaXRlbXMgd2hpY2ggYXJlIGN1cnJlbnRseQotICAgICAqIHNlbGVjdGVkIGluIHRoZSB1bmRlcmx5aW5nIHdpZGdldC4gIFRoZSBhcnJheSBpcyBlbXB0eSBpZiBubyBpdGVtcyBhcmUgc2VsZWN0ZWQuCi0gICAgICogPHA+Ci0gICAgICogTm90ZTogVGhpcyBpcyBub3QgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgcmVjZWl2ZXIKLSAgICAgKiB0byBtYWludGFpbiBpdHMgc2VsZWN0aW9uLCBzbyBtb2RpZnlpbmcgdGhlIGFycmF5IHdpbGwKLSAgICAgKiBub3QgYWZmZWN0IHRoZSByZWNlaXZlci4gCi0gICAgICogPC9wPgotICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGluZGljZXMgb2YgdGhlIHNlbGVjdGVkIGl0ZW1zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGludFtdIGxpc3RHZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgY29udGFpbmVkIGluIHRoZSB1bmRlcmx5aW5nIHdpZGdldC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcwotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgbGlzdEdldEl0ZW1Db3VudCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdW5kZXJseWluZyB3aWRnZXQncyBpdGVtcyB0byBiZSB0aGUgZ2l2ZW4gYXJyYXkgb2YgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGFiZWxzIHRoZSBhcnJheSBvZiBsYWJlbCB0ZXh0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbGlzdFNldEl0ZW1zKFN0cmluZ1tdIGxhYmVscyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBvZiB0aGUgaXRlbXMgZnJvbSB0aGUgdW5kZXJseWluZyB3aWRnZXQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbGlzdFJlbW92ZUFsbCgpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgaXRlbSBmcm9tIHRoZSB1bmRlcmx5aW5nIHdpZGdldCBhdCB0aGUgZ2l2ZW4KLSAgICAgKiB6ZXJvLXJlbGF0aXZlIGluZGV4LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggZm9yIHRoZSBpdGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbGlzdFJlbW92ZShpbnQgaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyB0aGUgaXRlbXMgYXQgdGhlIGdpdmVuIHplcm8tcmVsYXRpdmUgaW5kaWNlcyBpbiB0aGUgdW5kZXJseWluZyB3aWRnZXQuCi0gICAgICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGNsZWFyZWQgYmVmb3JlIHRoZSBuZXcgaXRlbXMgYXJlIHNlbGVjdGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljZXMgdGhhdCBhcmUgb3V0IG9mIHJhbmdlIGFuZCBkdXBsaWNhdGUgaW5kaWNlcyBhcmUgaWdub3JlZC4KLSAgICAgKiBJZiB0aGUgcmVjZWl2ZXIgaXMgc2luZ2xlLXNlbGVjdCBhbmQgbXVsdGlwbGUgaW5kaWNlcyBhcmUgc3BlY2lmaWVkLAotICAgICAqIHRoZW4gYWxsIGluZGljZXMgYXJlIGlnbm9yZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXhzIHRoZSBpbmRpY2VzIG9mIHRoZSBpdGVtcyB0byBzZWxlY3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsaXN0U2V0U2VsZWN0aW9uKGludFtdIGl4cyk7Ci0KLSAgICAvKioKLSAgICAgKiBTaG93cyB0aGUgc2VsZWN0aW9uLiAgSWYgdGhlIHNlbGVjdGlvbiBpcyBhbHJlYWR5IHNob3dpbmcgaW4gdGhlIHJlY2VpdmVyLAotICAgICAqIHRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zLiAgT3RoZXJ3aXNlLCB0aGUgaXRlbXMgYXJlIHNjcm9sbGVkIHVudGlsCi0gICAgICogdGhlIHNlbGVjdGlvbiBpcyB2aXNpYmxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxpc3RTaG93U2VsZWN0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBEZXNlbGVjdHMgYWxsIHNlbGVjdGVkIGl0ZW1zIGluIHRoZSB1bmRlcmx5aW5nIHdpZGdldC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsaXN0RGVzZWxlY3RBbGwoKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGVsZW1lbnRzIHRvIHRoaXMgbGlzdCB2aWV3ZXIuCi0gICAgICogSWYgdGhpcyB2aWV3ZXIgZG9lcyBub3QgaGF2ZSBhIHNvcnRlciwgdGhlIGVsZW1lbnRzIGFyZSBhZGRlZCBhdCB0aGUgZW5kCi0gICAgICogaW4gdGhlIG9yZGVyIGdpdmVuOyBvdGhlcndpc2UgdGhlIGVsZW1lbnRzIGFyZSBpbnNlcnRlZCBhdCBhcHByb3ByaWF0ZSBwb3NpdGlvbnMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCAoYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIpIHdoZW4gZWxlbWVudHMgCi0gICAgICogaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBtb2RlbCwgaW4gb3JkZXIgdG8gY2F1c2UgdGhlIHZpZXdlciB0byBhY2N1cmF0ZWx5Ci0gICAgICogcmVmbGVjdCB0aGUgbW9kZWwuIFRoaXMgbWV0aG9kIG9ubHkgYWZmZWN0cyB0aGUgdmlld2VyLCBub3QgdGhlIG1vZGVsLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0gICAgICAgIGFzc2VydEVsZW1lbnRzTm90TnVsbChlbGVtZW50cyk7Ci0gICAgICAgIE9iamVjdFtdIGZpbHRlcmVkID0gZmlsdGVyKGVsZW1lbnRzKTsKLSAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IChJTGFiZWxQcm92aWRlcikgZ2V0TGFiZWxQcm92aWRlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcmVkLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGZpbHRlcmVkW2ldOwotICAgICAgICAgICAgaW50IGl4ID0gaW5kZXhGb3JFbGVtZW50KGVsZW1lbnQpOwotICAgICAgICAgICAgbGlzdEFkZChnZXRMYWJlbFByb3ZpZGVyVGV4dChsYWJlbFByb3ZpZGVyLGVsZW1lbnQpLCBpeCk7Ci0gICAgICAgICAgICBsaXN0TWFwLmFkZChpeCwgZWxlbWVudCk7Ci0gICAgICAgICAgICBtYXBFbGVtZW50KGVsZW1lbnQsIGdldENvbnRyb2woKSk7IC8vIG11c3QgbWFwIGl0LCBzaW5jZSBmaW5kSXRlbSBvbmx5IGxvb2tzIGluIG1hcCwgaWYgZW5hYmxlZAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdGV4dCBmb3IgdGhlIGVsZW1lbnQgZnJvbSB0aGUgbGFiZWxQcm92aWRlci4KLSAgICAgKiBJZiBpdCBpcyBudWxsIHRoZW4gcmV0dXJuIHRoZSBlbXB0eSBTdHJpbmcuCi0gICAgICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgSUxhYmVsUHJvdmlkZXIKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEByZXR1cm4gU3RyaW5nLiBSZXR1cm4gdGhlIGVtcHR5U3RyaW5nIGlmIHRoZSBsYWJlbFByb3ZpZGVyCi0gICAgICogcmV0dXJucyBudWxsIGZvciB0aGUgdGV4dC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWxQcm92aWRlclRleHQoSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgT2JqZWN0IGVsZW1lbnQpewotICAgIAlTdHJpbmcgdGV4dCA9IGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLSAgICAgICAgaWYodGV4dCA9PSBudWxsKQotICAgICAgICAJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gZWxlbWVudCB0byB0aGlzIGxpc3Qgdmlld2VyLgotICAgICAqIElmIHRoaXMgdmlld2VyIGRvZXMgbm90IGhhdmUgYSBzb3J0ZXIsIHRoZSBlbGVtZW50IGlzIGFkZGVkIGF0IHRoZSBlbmQ7Ci0gICAgICogb3RoZXJ3aXNlIHRoZSBlbGVtZW50IGlzIGluc2VydGVkIGF0IHRoZSBhcHByb3ByaWF0ZSBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIChieSB0aGUgY29udGVudCBwcm92aWRlcikgd2hlbiBhIHNpbmdsZSBlbGVtZW50IAotICAgICAqIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBtb2RlbCwgaW4gb3JkZXIgdG8gY2F1c2UgdGhlIHZpZXdlciB0byBhY2N1cmF0ZWx5Ci0gICAgICogcmVmbGVjdCB0aGUgbW9kZWwuIFRoaXMgbWV0aG9kIG9ubHkgYWZmZWN0cyB0aGUgdmlld2VyLCBub3QgdGhlIG1vZGVsLgotICAgICAqIE5vdGUgdGhhdCB0aGVyZSBpcyBhbm90aGVyIG1ldGhvZCBmb3IgZWZmaWNpZW50bHkgcHJvY2Vzc2luZyB0aGUgc2ltdWx0YW5lb3VzCi0gICAgICogYWRkaXRpb24gb2YgbXVsdGlwbGUgZWxlbWVudHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgYWRkKG5ldyBPYmplY3RbXSB7IGVsZW1lbnQgfSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBTdHJ1Y3R1cmVkVmlld2VyLgotICAgICAqIFNpbmNlIFNXVC5MaXN0IGRvZXNuJ3QgdXNlIGl0ZW1zIHdlIGFsd2F5cyByZXR1cm4gdGhlIExpc3QgaXRzZWxmLgotICAgICAqLwotICAgIHByb3RlY3RlZCBXaWRnZXQgZG9GaW5kSW5wdXRJdGVtKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZXF1YWxzKGVsZW1lbnQsIGdldFJvb3QoKSkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udHJvbCgpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFN0cnVjdHVyZWRWaWV3ZXIuCi0gICAgICogU2luY2UgU1dULkxpc3QgZG9lc24ndCB1c2UgaXRlbXMgd2UgYWx3YXlzIHJldHVybiB0aGUgTGlzdCBpdHNlbGYuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFdpZGdldCBkb0ZpbmRJdGVtKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsaXN0TWFwLmNvbnRhaW5zKGVsZW1lbnQpKQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb250cm9sKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBTdHJ1Y3R1cmVkVmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvVXBkYXRlSXRlbShXaWRnZXQgZGF0YSwgT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZnVsbE1hcCkgewotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaXggPSBsaXN0TWFwLmluZGV4T2YoZWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoaXggPj0gMCkgewotICAgICAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSUxhYmVsUHJvdmlkZXIpIGdldExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICBsaXN0U2V0SXRlbShpeCwgZ2V0TGFiZWxQcm92aWRlclRleHQobGFiZWxQcm92aWRlcixlbGVtZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFZpZXdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ29udHJvbCBnZXRDb250cm9sKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIGluZGV4IGZyb20gdGhpcyBsaXN0IHZpZXdlci4KLSAgICAgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXgKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0gICAgICogICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBsaXN0TWFwLnNpemUoKSkKLSAgICAgICAgICAgIHJldHVybiBsaXN0TWFwLmdldChpbmRleCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBsaXN0IHZpZXdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlZpZXdlcjwvY29kZT4gZnJhbWV3b3JrCi0gICAgICogbWV0aG9kIHJldHVybnMgdGhlIGxhYmVsIHByb3ZpZGVyLCB3aGljaCBpbiB0aGUgY2FzZSBvZiBsaXN0Ci0gICAgICogdmlld2VycyB3aWxsIGJlIGFuIGluc3RhbmNlIG9mIDxjb2RlPklMYWJlbFByb3ZpZGVyPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUJhc2VMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXIuCi0gICAgICovCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBTdHJ1Y3R1cmVkVmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldFNlbGVjdGlvbkZyb21XaWRnZXQoKSB7Ci0gICAgICAgIGludFtdIGl4cyA9IGxpc3RHZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChpeHMubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpeHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE9iamVjdCBlID0gZ2V0RWxlbWVudEF0KGl4c1tpXSk7Ci0gICAgICAgICAgICBpZiAoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggd2hlcmUgdGhlIGl0ZW0gc2hvdWxkIGJlIGluc2VydGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgaW5kZXhGb3JFbGVtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIFZpZXdlclNvcnRlciBzb3J0ZXIgPSBnZXRTb3J0ZXIoKTsKLSAgICAgICAgaWYgKHNvcnRlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGxpc3RHZXRJdGVtQ291bnQoKTsKLSAgICAgICAgaW50IGNvdW50ID0gbGlzdEdldEl0ZW1Db3VudCgpOwotICAgICAgICBpbnQgbWluID0gMCwgbWF4ID0gY291bnQgLSAxOwotICAgICAgICB3aGlsZSAobWluIDw9IG1heCkgewotICAgICAgICAgICAgaW50IG1pZCA9IChtaW4gKyBtYXgpIC8gMjsKLSAgICAgICAgICAgIE9iamVjdCBkYXRhID0gbGlzdE1hcC5nZXQobWlkKTsKLSAgICAgICAgICAgIGludCBjb21wYXJlID0gc29ydGVyLmNvbXBhcmUodGhpcywgZGF0YSwgZWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoY29tcGFyZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmluZCBmaXJzdCBpdGVtID4gZWxlbWVudAotICAgICAgICAgICAgICAgIHdoaWxlIChjb21wYXJlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgKyttaWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaWQgPj0gY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBsaXN0TWFwLmdldChtaWQpOwotICAgICAgICAgICAgICAgICAgICBjb21wYXJlID0gc29ydGVyLmNvbXBhcmUodGhpcywgZGF0YSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtaWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29tcGFyZSA8IDApCi0gICAgICAgICAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtYXggPSBtaWQgLSAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtaW47Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5wdXRDaGFuZ2VkKE9iamVjdCBpbnB1dCwgT2JqZWN0IG9sZElucHV0KSB7Ci0gICAgICAgIGxpc3RNYXAuY2xlYXIoKTsKLSAgICAgICAgT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRTb3J0ZWRDaGlsZHJlbihnZXRSb290KCkpOwotICAgICAgICBpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQotICAgICAgICBsaXN0UmVtb3ZlQWxsKCk7Ci0gICAgICAgIFN0cmluZ1tdIGxhYmVscyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3QgZWwgPSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgIGxhYmVsc1tpXSA9IGdldExhYmVsUHJvdmlkZXJUZXh0KChJTGFiZWxQcm92aWRlcikgZ2V0TGFiZWxQcm92aWRlcigpLGVsKTsKLSAgICAgICAgICAgIGxpc3RNYXAuYWRkKGVsKTsKLSAgICAgICAgICAgIG1hcEVsZW1lbnQoZWwsIGdldENvbnRyb2woKSk7IC8vIG11c3QgbWFwIGl0LCBzaW5jZSBmaW5kSXRlbSBvbmx5IGxvb2tzIGluIG1hcCwgaWYgZW5hYmxlZAotICAgICAgICB9Ci0gICAgICAgIGxpc3RTZXRJdGVtcyhsYWJlbHMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gU3RydWN0dXJlZFZpZXdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFJlZnJlc2goT2JqZWN0IGVsZW1lbnQpIHsKLQotICAgICAgICBDb250cm9sIGxpc3QgPSBnZXRDb250cm9sKCk7Ci0gICAgICAgIGlmIChlbGVtZW50ID09IG51bGwgfHwgZXF1YWxzKGVsZW1lbnQsIGdldFJvb3QoKSkpIHsKLSAgICAgICAgICAgIC8vIHRoZSBwYXJlbnQKLSAgICAgICAgICAgIGlmIChsaXN0TWFwICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbGlzdE1hcC5jbGVhcigpOwotICAgICAgICAgICAgdW5tYXBBbGxFbGVtZW50cygpOwotICAgICAgICAgICAgTGlzdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb25Gcm9tV2lkZ2V0KCk7Ci0KLSAgICAgICAgICAgIGxpc3Quc2V0UmVkcmF3KGZhbHNlKTsKLQkJCWxpc3RSZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRTb3J0ZWRDaGlsZHJlbihnZXRSb290KCkpOwotCQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW2NoaWxkcmVuLmxlbmd0aF07Ci0JCQkKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSUxhYmVsUHJvdmlkZXIpIGdldExhYmVsUHJvdmlkZXIoKTsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBlbCA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgIGl0ZW1zW2ldID0gZ2V0TGFiZWxQcm92aWRlclRleHQobGFiZWxQcm92aWRlciwgZWwpOwotICAgICAgICAgICAgICAgIGxpc3RNYXAuYWRkKGVsKTsKLSAgICAgICAgICAgICAgICBtYXBFbGVtZW50KGVsLCBsaXN0KTsgLy8gbXVzdCBtYXAgaXQsIHNpbmNlIGZpbmRJdGVtIG9ubHkgbG9va3MgaW4gbWFwLCBpZiBlbmFibGVkCi0gICAgICAgICAgICB9Ci0JCQkKLQkJCWxpc3RTZXRJdGVtcyhpdGVtcyk7Ci0gICAgICAgICAgICBsaXN0LnNldFJlZHJhdyh0cnVlKTsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvblRvV2lkZ2V0KHNlbGVjdGlvbiwgZmFsc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG9VcGRhdGVJdGVtKGxpc3QsIGVsZW1lbnQsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZWxlbWVudHMgZnJvbSB0aGlzIGxpc3Qgdmlld2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnRzIHRoZSBlbGVtZW50cyB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW50ZXJuYWxSZW1vdmUoZmluYWwgT2JqZWN0W10gZWxlbWVudHMpIHsKLSAgICAgICAgT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgaWYgKGVxdWFscyhlbGVtZW50c1tpXSwgaW5wdXQpKSB7Ci0gICAgICAgICAgICAgICAgc2V0SW5wdXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGl4ID0gbGlzdE1hcC5pbmRleE9mKGVsZW1lbnRzW2ldKTsKLSAgICAgICAgICAgIGlmIChpeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGlzdFJlbW92ZShpeCk7Ci0gICAgICAgICAgICAgICAgbGlzdE1hcC5yZW1vdmUoaXgpOwotICAgICAgICAgICAgICAgIHVubWFwRWxlbWVudChlbGVtZW50c1tpXSwgZ2V0Q29udHJvbCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIGVsZW1lbnRzIGZyb20gdGhpcyBsaXN0IHZpZXdlci4KLSAgICAgKiBUaGUgc2VsZWN0aW9uIGlzIHVwZGF0ZWQgaWYgcmVxdWlyZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCAoYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIpIHdoZW4gZWxlbWVudHMgCi0gICAgICogaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbW9kZWwsIGluIG9yZGVyIHRvIGNhdXNlIHRoZSB2aWV3ZXIgdG8gYWNjdXJhdGVseQotICAgICAqIHJlZmxlY3QgdGhlIG1vZGVsLiBUaGlzIG1ldGhvZCBvbmx5IGFmZmVjdHMgdGhlIHZpZXdlciwgbm90IHRoZSBtb2RlbC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIHRvIHJlbW92ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShmaW5hbCBPYmplY3RbXSBlbGVtZW50cykgewotICAgICAgICBhc3NlcnRFbGVtZW50c05vdE51bGwoZWxlbWVudHMpOwotICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHsKLSAgICAgICAgCXJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwcmVzZXJ2aW5nU2VsZWN0aW9uKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnRlcm5hbFJlbW92ZShlbGVtZW50cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIGVsZW1lbnQgZnJvbSB0aGlzIGxpc3Qgdmlld2VyLgotICAgICAqIFRoZSBzZWxlY3Rpb24gaXMgdXBkYXRlZCBpZiBuZWNlc3NhcnkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCAoYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIpIHdoZW4gYSBzaW5nbGUgZWxlbWVudCAKLSAgICAgKiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1vZGVsLCBpbiBvcmRlciB0byBjYXVzZSB0aGUgdmlld2VyIHRvIGFjY3VyYXRlbHkKLSAgICAgKiByZWZsZWN0IHRoZSBtb2RlbC4gVGhpcyBtZXRob2Qgb25seSBhZmZlY3RzIHRoZSB2aWV3ZXIsIG5vdCB0aGUgbW9kZWwuCi0gICAgICogTm90ZSB0aGF0IHRoZXJlIGlzIGFub3RoZXIgbWV0aG9kIGZvciBlZmZpY2llbnRseSBwcm9jZXNzaW5nIHRoZSBzaW11bHRhbmVvdXMKLSAgICAgKiByZW1vdmFsIG9mIG11bHRpcGxlIGVsZW1lbnRzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJlbW92ZShuZXcgT2JqZWN0W10geyBlbGVtZW50IH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBsaXN0IHZpZXdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlZpZXdlcjwvY29kZT4gZnJhbWV3b3JrCi0gICAgICogbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGUgZ2l2ZW4gbGFiZWwgcHJvdmlkZXIgaXMgYW4gaW5zdGFuY2UKLSAgICAgKiBvZiA8Y29kZT5JTGFiZWxQcm92aWRlcjwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWxQcm92aWRlcihJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotICAgICAgICBBc3NlcnQuaXNUcnVlKGxhYmVsUHJvdmlkZXIgaW5zdGFuY2VvZiBJTGFiZWxQcm92aWRlcik7Ci0gICAgICAgIHN1cGVyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBTdHJ1Y3R1cmVkVmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFNlbGVjdGlvblRvV2lkZ2V0KExpc3QgaW4sIGJvb2xlYW4gcmV2ZWFsKSB7Ci0gICAgICAgIGlmIChpbiA9PSBudWxsIHx8IGluLnNpemUoKSA9PSAwKSB7IC8vIGNsZWFyIHNlbGVjdGlvbgotICAgICAgICAgICAgbGlzdERlc2VsZWN0QWxsKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgbiA9IGluLnNpemUoKTsKLSAgICAgICAgICAgIGludFtdIGl4cyA9IG5ldyBpbnRbbl07Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZWwgPSBpbi5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaW50IGl4ID0gbGlzdE1hcC5pbmRleE9mKGVsKTsKLSAgICAgICAgICAgICAgICBpZiAoaXggPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgaXhzW2NvdW50KytdID0gaXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY291bnQgPCBuKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShpeHMsIDAsIGl4cyA9IG5ldyBpbnRbY291bnRdLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsaXN0U2V0U2VsZWN0aW9uKGl4cyk7Ci0gICAgICAgICAgICBpZiAocmV2ZWFsKSB7Ci0gICAgICAgICAgICAgICAgbGlzdFNob3dTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBnZXRFbGVtZW50SW5kZXgoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIGxpc3RNYXAuaW5kZXhPZihlbGVtZW50KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvQWJzdHJhY3RUcmVlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0Fic3RyYWN0VHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODhiMmUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvQWJzdHJhY3RUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgaW1wbGVtZW50YXRpb24gZm9yIHRyZWUtc3RydWN0dXJlLW9yaWVudGVkIHZpZXdlcnMgKHRyZWVzIGFuZAotICogdGFibGUgdHJlZXMpLgotICogPHA+Ci0gKiBOb2RlcyBpbiB0aGUgdHJlZSBjYW4gYmUgaW4gZWl0aGVyIGFuIGV4cGFuZGVkIG9yIGEgY29sbGFwc2VkIHN0YXRlLAotICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNoaWxkcmVuIG9uIGEgbm9kZSBhcmUgdmlzaWJsZS4gVGhpcyBjbGFzcwotICogaW50cm9kdWNlcyBwdWJsaWMgbWV0aG9kcyBmb3IgY29udHJvbGxpbmcgdGhlIGV4cGFuZGluZyBhbmQgY29sbGFwc2luZyBvZgotICogbm9kZXMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENvbnRlbnQgcHJvdmlkZXJzIGZvciBhYnN0cmFjdCB0cmVlIHZpZXdlcnMgbXVzdCBpbXBsZW1lbnQgdGhlIDxjb2RlPklUcmVlQ29udGVudFByb3ZpZGVyPC9jb2RlPgotICogaW50ZXJmYWNlLgotICogPC9wPgotICogCi0gKiBAc2VlIFRyZWVWaWV3ZXIKLSAqIEBzZWUgVGFibGVUcmVlVmlld2VyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVWaWV3ZXIgZXh0ZW5kcyBTdHJ1Y3R1cmVkVmlld2VyIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhbGwgbGV2ZWxzIG9mIHRoZSB0cmVlIHNob3VsZCBiZSBleHBhbmRlZCBvcgotICAgICAqIGNvbGxhcHNlZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNleHBhbmRUb0xldmVsCi0gICAgICogQHNlZSAjY29sbGFwc2VUb0xldmVsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMX0xFVkVMUyA9IC0xOwotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiByZWdpc3RlcmVkIHRyZWUgbGlzdGVuZXJzIChlbGVtZW50IHR5cGU6IDxjb2RlPlRyZWVMaXN0ZW5lcjwvY29kZT4pLiAqLwotICAgIHByaXZhdGUgTGlzdGVuZXJMaXN0IHRyZWVMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGV2ZWwgdG8gd2hpY2ggdGhlIHRyZWUgaXMgYXV0b21hdGljYWxseSBleHBhbmRlZCBlYWNoIHRpbWUgdGhlCi0gICAgICogdmlld2VyJ3MgaW5wdXQgaXMgY2hhbmdlZCAodGhhdCBpcywgYnkgPGNvZGU+c2V0SW5wdXQ8L2NvZGU+KS4gQQotICAgICAqIHZhbHVlIG9mIDAgbWVhbnMgdGhhdCBhdXRvLWV4cGFuZCBpcyBvZmYuCi0gICAgICogCi0gICAgICogQHNlZSAjc2V0QXV0b0V4cGFuZExldmVsCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZXhwYW5kVG9MZXZlbCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTYWZlIHJ1bm5hYmxlIHVzZWQgdG8gdXBkYXRlIGFuIGl0ZW0uCi0gICAgICovCi0gICAgY2xhc3MgVXBkYXRlSXRlbVNhZmVSdW5uYWJsZSBleHRlbmRzIFNhZmVSdW5uYWJsZSB7Ci0gICAgICAgIHByaXZhdGUgT2JqZWN0IGVsZW1lbnQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBJdGVtIGl0ZW07Ci0KLSAgICAgICAgVXBkYXRlSXRlbVNhZmVSdW5uYWJsZShJdGVtIGl0ZW0sIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICB0aGlzLml0ZW0gPSBpdGVtOwotICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGRvVXBkYXRlSXRlbShpdGVtLCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGFic3RyYWN0IHRyZWUgdmlld2VyLiBUaGUgdmlld2VyIGhhcyBubyBpbnB1dCwgbm8gY29udGVudAotICAgICAqIHByb3ZpZGVyLCBhIGRlZmF1bHQgbGFiZWwgcHJvdmlkZXIsIG5vIHNvcnRlciwgbm8gZmlsdGVycywgYW5kIGhhcwotICAgICAqIGF1dG8tZXhwYW5kIHR1cm5lZCBvZmYuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VHJlZVZpZXdlcigpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGNoaWxkIGVsZW1lbnRzIHRvIHRoaXMgdmlld2VyIGFzIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotICAgICAqIHBhcmVudCBlbGVtZW50LiBJZiB0aGlzIHZpZXdlciBkb2VzIG5vdCBoYXZlIGEgc29ydGVyLCB0aGUgZWxlbWVudHMgYXJlCi0gICAgICogYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50J3MgbGlzdCBvZiBjaGlsZHJlbiBpbiB0aGUgb3JkZXIgZ2l2ZW47Ci0gICAgICogb3RoZXJ3aXNlLCB0aGUgZWxlbWVudHMgYXJlIGluc2VydGVkIGF0IHRoZSBhcHByb3ByaWF0ZSBwb3NpdGlvbnMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCAoYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIpIHdoZW4gZWxlbWVudHMKLSAgICAgKiBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIG1vZGVsLCBpbiBvcmRlciB0byBjYXVzZSB0aGUgdmlld2VyIHRvIGFjY3VyYXRlbHkKLSAgICAgKiByZWZsZWN0IHRoZSBtb2RlbC4gVGhpcyBtZXRob2Qgb25seSBhZmZlY3RzIHRoZSB2aWV3ZXIsIG5vdCB0aGUgbW9kZWwuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRFbGVtZW50Ci0gICAgICogICAgICAgICAgIHRoZSBwYXJlbnQgZWxlbWVudAotICAgICAqIEBwYXJhbSBjaGlsZEVsZW1lbnRzCi0gICAgICogICAgICAgICAgIHRoZSBjaGlsZCBlbGVtZW50cyB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdFtdIGNoaWxkRWxlbWVudHMpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChwYXJlbnRFbGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RWxlbWVudHNOb3ROdWxsKGNoaWxkRWxlbWVudHMpOwotCi0gICAgICAgIFdpZGdldFtdIHdpZGdldHMgPSBmaW5kSXRlbXMocGFyZW50RWxlbWVudCk7Ci0gICAgICAgIC8vIElmIHBhcmVudCBoYXNuJ3QgYmVlbiByZWFsaXplZCB5ZXQsIGp1c3QgaWdub3JlIHRoZSBhZGQuCi0gICAgICAgIGlmICh3aWRnZXRzLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgd2lkZ2V0cy5sZW5ndGg7IGkrKykgewotCQkJaW50ZXJuYWxBZGQod2lkZ2V0c1tpXSwgcGFyZW50RWxlbWVudCwgY2hpbGRFbGVtZW50cyk7Ci0JCX0gICAgICAgIAotICAgIH0KLQotCS8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGNoaWxkIGVsZW1lbnRzIHRvIHRoaXMgdmlld2VyIGFzIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotICAgICAqIHBhcmVudCBlbGVtZW50LgotICAgICAqIDxwPgotICAgICAqIEVYUEVSSU1FTlRBTC4gIE5vdCB0byBiZSB1c2VkIGV4Y2VwdCBieSBKRFQuCi0gICAgICogVGhpcyBtZXRob2Qgd2FzIGFkZGVkIHRvIHN1cHBvcnQgSkRUJ3MgZXhwbG9yYXRpb25zCi0gICAgICogaW50byBncm91cGluZyBieSB3b3JraW5nIHNldHMsIHdoaWNoIHJlcXVpcmVzIHZpZXdlcnMgdG8gc3VwcG9ydCBtdWx0aXBsZSAKLSAgICAgKiBlcXVhbCBlbGVtZW50cy4gIFNlZSBidWcgNzY0ODIgZm9yIG1vcmUgZGV0YWlscy4gIFRoaXMgc3VwcG9ydCB3aWxsCi0gICAgICogbGlrZWx5IGJlIHJlbW92ZWQgaW4gRWNsaXBzZSAzLjIgaW4gZmF2b3VyIG9mIHByb3BlciBzdXBwb3J0IGZvcgotICAgICAqIG11bHRpcGxlIGVxdWFsIGVsZW1lbnRzLiAKLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gd2lkZ2V0IAotICAgICAqICAgICAgICAgICB0aGUgd2lkZ2V0IGZvciB0aGUgcGFyZW50IGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gcGFyZW50RWxlbWVudAotICAgICAqICAgICAgICAgICB0aGUgcGFyZW50IGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gY2hpbGRFbGVtZW50cwotICAgICAqICAgICAgICAgICB0aGUgY2hpbGQgZWxlbWVudHMgdG8gYWRkCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGludGVybmFsQWRkKFdpZGdldCB3aWRnZXQsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3RbXSBjaGlsZEVsZW1lbnRzKSB7Ci0JCQotCQkvLyBvcHRpbWl6YXRpb24hCi0gICAgICAgIC8vIGlmIHRoZSB3aWRnZXQgaXMgbm90IGV4cGFuZGVkIHdlIGp1c3QgaW52YWxpZGF0ZSB0aGUgc3VidHJlZQotICAgICAgICBpZiAod2lkZ2V0IGluc3RhbmNlb2YgSXRlbSkgewotICAgICAgICAgICAgSXRlbSB0aSA9IChJdGVtKSB3aWRnZXQ7Ci0gICAgICAgICAgICBpZiAoIWdldEV4cGFuZGVkKHRpKSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZER1bW15ID0gaXNFeHBhbmRhYmxlKHBhcmVudEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaGF2ZUR1bW15ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCBjaGlsZHJlbgotICAgICAgICAgICAgICAgIEl0ZW1bXSBpdGVtcyA9IGdldEl0ZW1zKHRpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtc1tpXS5nZXREYXRhKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzYXNzb2NpYXRlKGl0ZW1zW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkRHVtbXkgJiYgIWhhdmVEdW1teSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVEdW1teSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBhcHBlbmQgYSBkdW1teSBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICBpZiAobmVlZER1bW15ICYmICFoYXZlRHVtbXkpIAotICAgICAgICAgICAgICAgICAgICBuZXdJdGVtKHRpLCBTV1QuTlVMTCwgLTEpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjaGlsZEVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIE9iamVjdFtdIGZpbHRlcmVkID0gZmlsdGVyKGNoaWxkRWxlbWVudHMpOwotCQkJaWYoZ2V0U29ydGVyKCkgIT0gbnVsbCkKLQkJCQlnZXRTb3J0ZXIoKS5zb3J0KHRoaXMsZmlsdGVyZWQpOwotICAgICAgICAgICAgY3JlYXRlQWRkZWRFbGVtZW50cyh3aWRnZXQsIGZpbHRlcmVkKTsKLSAgICAgICAgfQotCX0KLQotCS8qKgotICAgICAqIENyZWF0ZSB0aGUgbmV3IGVsZW1lbnRzIGluIHRoZSBwYXJlbnQgd2lkZ2V0LiBJZiB0aGUKLSAgICAgKiBjaGlsZCBhbHJlYWR5IGV4aXN0cyBkbyBub3RoaW5nLgotICAgICAqIEBwYXJhbSB3aWRnZXQKLSAgICAgKiBAcGFyYW0gZWxlbWVudHMgU29ydGVkIGxpc3Qgb2YgZWxlbWVudHMgdG8gYWRkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBZGRlZEVsZW1lbnRzKFdpZGdldCB3aWRnZXQsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0KLQkJaWYoZWxlbWVudHMubGVuZ3RoID09IDEpewotCQkJaWYgKGVxdWFscyhlbGVtZW50c1swXSwgd2lkZ2V0LmdldERhdGEoKSkpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlWaWV3ZXJTb3J0ZXIgc29ydGVyID0gZ2V0U29ydGVyICgpOwotCQlJdGVtW10gaXRlbXMgPSBnZXRDaGlsZHJlbih3aWRnZXQpOwotCQkKLQkJLy9BcyB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHJlYWR5IHdlIG9wdGltaXplIGZvciBhIAotCQkvL3N0YXJ0IHBvc2l0aW9uCi0JCWludCBsYXN0SW5zZXJ0aW9uID0gMDsJCQotCQkKLQkJLy9PcHRpbWl6ZSBmb3IgdGhlIGVtcHR5IGNhc2UKLQkJaWYoaXRlbXMubGVuZ3RoID09IDApewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWNyZWF0ZVRyZWVJdGVtKHdpZGdldCwgZWxlbWVudHNbaV0sIC0xKTsJCQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gbmV3SXRlbSA9IHRydWU7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJaW50IGluZGV4OwotCQkJaWYoc29ydGVyID09IG51bGwpewotCQkJCWlmKGl0ZW1FeGlzdHMoaXRlbXMsZWxlbWVudCkpewotCQkJCQlyZWZyZXNoKGVsZW1lbnQpOwotCQkJCQluZXdJdGVtID0gZmFsc2U7Ci0JCQkJfQotCQkJCWluZGV4ID0gLTE7Ci0JCQl9Ci0JCQllbHNlewotCQkJCWxhc3RJbnNlcnRpb24gPSBpbnNlcnRpb25Qb3NpdGlvbihpdGVtcyxzb3J0ZXIsbGFzdEluc2VydGlvbiwgZWxlbWVudCk7Ci0JCQkJLy9BcyB3ZSBhcmUgb25seSBzZWFyY2hpbmcgdGhlIG9yaWdpbmFsIGFycmF5IHdlIGtlZXAgdHJhY2sgb2YgdGhvc2UgcG9zaXRpb25zIG9ubHkKLQkJCQlpZihsYXN0SW5zZXJ0aW9uID09IGl0ZW1zLmxlbmd0aCkKLQkJCQkJaW5kZXggPSAtMTsKLQkJCQllbHNley8vU2VlIGlmIHdlIHNob3VsZCBqdXN0IHJlZnJlc2gKLQkJCQkJd2hpbGUobGFzdEluc2VydGlvbiA8IGl0ZW1zLmxlbmd0aCAmJiBzb3J0ZXIuY29tcGFyZSh0aGlzLGVsZW1lbnQsaXRlbXNbbGFzdEluc2VydGlvbl0uZ2V0RGF0YSgpKSA9PSAwKXsKLQkJCQkJCS8vQXMgd2UgY2Fubm90IGFzc3VtZSB0aGUgc29ydGVyIGlzIGNvbnNpc3RlbnQgd2l0aCBlcXVhbHMoKSAtIHRoZXJlZm9yZSB3ZSBjYW4KLQkJCQkJCS8vIGp1c3QgY2hlY2sgYWdhaW5zdCB0aGUgaXRlbSBwcmlvciB0byB0aGlzIGluZGV4IChpZiBhbnkpCi0JCQkJCQlpZiAoaXRlbXNbbGFzdEluc2VydGlvbl0uZ2V0RGF0YSgpLmVxdWFscyhlbGVtZW50KSkgewotCQkJCQkJCS8vcmVmcmVzaCB0aGUgZWxlbWVudCBpbiBjYXNlIGl0IGhhcyBuZXcgY2hpbGRyZW4KLQkJCQkJCQlyZWZyZXNoKGVsZW1lbnQpOwotCQkJCQkJCW5ld0l0ZW0gPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWxhc3RJbnNlcnRpb24gKys7Ly9XZSBoYWQgYW4gaW5zZXJ0aW9uIHNvIGluY3JlbWVudAotCQkJCQl9Ci0JCQkJCS8vRGlkIHdlIGdldCB0byB0aGUgZW5kPwotCQkJCQlpZihsYXN0SW5zZXJ0aW9uID09IGl0ZW1zLmxlbmd0aCkKLQkJCQkJCWluZGV4ID0gLTE7Ci0JCQkJCWVsc2UKLQkJCQkJCWluZGV4ID0gbGFzdEluc2VydGlvbiArIGk7IC8vQWRkIHRoZSBpbmRleCBhcyB0aGUgYXJyYXkgaXMgZ3Jvd2luZwkJCQkJCi0JCQkJfQotCQkJfQotCQkJaWYobmV3SXRlbSkKLQkJCQljcmVhdGVUcmVlSXRlbSh3aWRnZXQsIGVsZW1lbnQsIGluZGV4KTsJCQotCQl9Ci0gICAgfQotCQotCi0gICAgLyoqCi0gICAgICogU2VlIGlmIGVsZW1lbnQgaXMgdGhlIGRhdGEgb2Ygb25lIG9mIHRoZSBlbGVtZW50cyBpbiAKLSAgICAgKiBpdGVtcy4KLSAgICAgKiBAcGFyYW0gaXRlbXMKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGVsZW1lbnQgbWF0Y2hlcy4KLSAgICAgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXRlbUV4aXN0cyhJdGVtW10gaXRlbXMsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKHVzaW5nRWxlbWVudE1hcCgpKS8vaWYgd2UgY2FuIGRvIGEgY29uc3RhbnQgdGltZSBsb29rdXAgZmluZCBpdAotCQkJcmV0dXJuIGZpbmRJdGVtKGVsZW1lbnQpICE9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKGl0ZW1zW2ldLmdldERhdGEoKS5lcXVhbHMoZWxlbWVudCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IHdoZXJlIHRoZSBpdGVtIHNob3VsZCBiZSBpbnNlcnRlZC4gSXQgdXNlcyBzb3J0ZXIgdG8KLSAgICAgKiBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgcG9zaXRpb24sIGlmIHNvcnRlciBpcyBub3QgYXNzaWduZWQsIHJldHVybnMgdGhlCi0gICAgICogaW5kZXggb2YgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGxhc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZW1zIHRoZSBpdGVtcyB0byBzZWFyY2gKLSAgICAgKiBAcGFyYW0gc29ydGVyIFRoZSBzb3J0ZXIgdG8gdXNlLgotICAgICAqIEBwYXJhbSBsYXN0SW5zZXJ0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggdG8gc3RhcnQgc2VhcmNoIGZvciBwb3NpdGlvbiBmcm9tIHRoaXMgYWxsb3dzCi0gICAgICogICAgICAgICAgICBvcHRpbWlzaW5nIHNlYXJjaCBmb3IgbXVsdGlwbGUgZWxlbWVudHMgdGhhdCBhcmUgc29ydGVkCi0gICAgICogICAgICAgICAgICB0aGVtc2VsZi4KLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqICAgICAgICAgICAgZWxlbWVudCB0byBmaW5kIHBvc2l0aW9uIGZvci4KLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCB0byB1c2Ugd2hlbiBpbnNlcnRpbmcgdGhlIGVsZW1lbnQuCi0gICAgICogCi0gICAgICovCi0JCi0JcHJpdmF0ZSBpbnQgaW5zZXJ0aW9uUG9zaXRpb24oSXRlbVtdIGl0ZW1zLCAgVmlld2VyU29ydGVyIHNvcnRlciwgaW50IGxhc3RJbnNlcnRpb24sIE9iamVjdCBlbGVtZW50KSB7Ci0JICAgIAotCQlpbnQgc2l6ZSA9IGl0ZW1zLmxlbmd0aDsKLQkJaWYgKHNvcnRlciA9PSBudWxsKQotCQkJcmV0dXJuIHNpemU7Ci0JICAgIGludCBtaW4gPSBsYXN0SW5zZXJ0aW9uLCBtYXggPSBzaXplIC0gMTsKLQotCQl3aGlsZSAobWluIDw9IG1heCkgewotICAgICAgICAgICAgaW50IG1pZCA9IChtaW4gKyBtYXgpIC8gMjsKLSAgICAgICAgICAgIE9iamVjdCBkYXRhID0gaXRlbXNbbWlkXS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBpbnQgY29tcGFyZSA9IHNvcnRlci5jb21wYXJlKHRoaXMsIGRhdGEsIGVsZW1lbnQpOwotICAgICAgICAgICAgaWYgKGNvbXBhcmUgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtaWQ7Ly9SZXR1cm4gaWYgd2UgYWxyZWFkeSBtYXRjaAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbXBhcmUgPCAwKQotICAgICAgICAgICAgICAgIG1pbiA9IG1pZCArIDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWF4ID0gbWlkIC0gMTsKLQkgICAgICAgIH0KLQkgICByZXR1cm4gbWluOwotCSAgICAKLQkJCQotCX0KLQotCS8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IHdoZXJlIHRoZSBpdGVtIHNob3VsZCBiZSBpbnNlcnRlZC4gSXQgdXNlcyBzb3J0ZXIgdG8KLSAgICAgKiBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgcG9zaXRpb24sIGlmIHNvcnRlciBpcyBub3QgYXNzaWduZWQsIHJldHVybnMgdGhlCi0gICAgICogaW5kZXggb2YgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGxhc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHdpZGdldAotICAgICAqIEBwYXJhbSBzb3J0ZXIgVGhlIHNvcnRlciB0byB1c2UuCi0gICAgICogQHBhcmFtIHN0YXJ0SW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCB0byBzdGFydCBzZWFyY2ggZm9yIHBvc2l0aW9uIGZyb20gdGhpcyBhbGxvd3MKLSAgICAgKiAgICAgICAgICAgIG9wdGltaXNpbmcgc2VhcmNoIGZvciBtdWx0aXBsZSBlbGVtZW50cyB0aGF0IGFyZSBzb3J0ZWQKLSAgICAgKiAgICAgICAgICAgIHRoZW1zZWxmLgotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogICAgICAgICAgICBlbGVtZW50IHRvIGZpbmQgcG9zaXRpb24gZm9yLgotICAgICAqIEBwYXJhbSBjdXJyZW50U2l6ZQotICAgICAqIAkJCXRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbGxlY3Rpb24KLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCB0byB1c2Ugd2hlbiBpbnNlcnRpbmcgdGhlIGVsZW1lbnQuCi0gICAgICogCi0gICAgICovCi0JCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggd2hlcmUgdGhlIGl0ZW0gc2hvdWxkIGJlIGluc2VydGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgVGhlIHBhcmVudCB3aWRnZXQgdGhlIGVsZW1lbnQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvLgotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogICAgICAgICAgIFRoZSBlbGVtZW50IHRvIGluc2VydC4KLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgaW5kZXhGb3JFbGVtZW50KFdpZGdldCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIFZpZXdlclNvcnRlciBzb3J0ZXIgPSBnZXRTb3J0ZXIoKTsKLQkJCi0JCQotCQlJdGVtW10gaXRlbXMgPSBnZXRDaGlsZHJlbihwYXJlbnQpOwotCQlpbnQgY291bnQgPSBpdGVtcy5sZW5ndGg7Ci0KLSAgICAgICAgaWYgKHNvcnRlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgICBpbnQgbWluID0gMCwgbWF4ID0gY291bnQgLSAxOwotCi0gICAgICAgIHdoaWxlIChtaW4gPD0gbWF4KSB7Ci0gICAgICAgICAgICBpbnQgbWlkID0gKG1pbiArIG1heCkgLyAyOwotICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSBpdGVtc1ttaWRdLmdldERhdGEoKTsKLSAgICAgICAgICAgIGludCBjb21wYXJlID0gc29ydGVyLmNvbXBhcmUodGhpcywgZGF0YSwgZWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoY29tcGFyZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmluZCBmaXJzdCBpdGVtID4gZWxlbWVudAotICAgICAgICAgICAgICAgIHdoaWxlIChjb21wYXJlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgKyttaWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaWQgPj0gY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpdGVtc1ttaWRdLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgY29tcGFyZSA9IHNvcnRlci5jb21wYXJlKHRoaXMsIGRhdGEsIGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWlkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbXBhcmUgPCAwKQotICAgICAgICAgICAgICAgIG1pbiA9IG1pZCArIDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWF4ID0gbWlkIC0gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWluOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGNoaWxkIGVsZW1lbnQgdG8gdGhpcyB2aWV3ZXIgYXMgYSBjaGlsZCBvZiB0aGUgZ2l2ZW4KLSAgICAgKiBwYXJlbnQgZWxlbWVudC4gSWYgdGhpcyB2aWV3ZXIgZG9lcyBub3QgaGF2ZSBhIHNvcnRlciwgdGhlIGVsZW1lbnQgaXMKLSAgICAgKiBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQncyBsaXN0IG9mIGNoaWxkcmVuOyBvdGhlcndpc2UsIHRoZQotICAgICAqIGVsZW1lbnQgaXMgaW5zZXJ0ZWQgYXQgdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgKGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyKSB3aGVuIGEgc2luZ2xlCi0gICAgICogZWxlbWVudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbW9kZWwsIGluIG9yZGVyIHRvIGNhdXNlIHRoZSB2aWV3ZXIgdG8KLSAgICAgKiBhY2N1cmF0ZWx5IHJlZmxlY3QgdGhlIG1vZGVsLiBUaGlzIG1ldGhvZCBvbmx5IGFmZmVjdHMgdGhlIHZpZXdlciwgbm90Ci0gICAgICogdGhlIG1vZGVsLiBOb3RlIHRoYXQgdGhlcmUgaXMgYW5vdGhlciBtZXRob2QgZm9yIGVmZmljaWVudGx5IHByb2Nlc3NpbmcKLSAgICAgKiB0aGUgc2ltdWx0YW5lb3VzIGFkZGl0aW9uIG9mIG11bHRpcGxlIGVsZW1lbnRzLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50RWxlbWVudAotICAgICAqICAgICAgICAgICB0aGUgcGFyZW50IGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gY2hpbGRFbGVtZW50Ci0gICAgICogICAgICAgICAgIHRoZSBjaGlsZCBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgY2hpbGRFbGVtZW50KSB7Ci0gICAgICAgIGFkZChwYXJlbnRFbGVtZW50LCBuZXcgT2JqZWN0W10geyBjaGlsZEVsZW1lbnQgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gU1dUIHNlbGVjdGlvbiBsaXN0ZW5lciB0byB0aGUgZ2l2ZW4gU1dUIGNvbnRyb2wuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRyb2wKLSAgICAgKiAgICAgICAgICAgdGhlIFNXVCBjb250cm9sCi0gICAgICogQHBhcmFtIGxpc3RlbmVyCi0gICAgICogICAgICAgICAgIHRoZSBTV1Qgc2VsZWN0aW9uIGxpc3RlbmVyCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihDb250cm9sIGNvbnRyb2wsCi0gICAgICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGxpc3RlbmVyIGZvciBleHBhbmQgYW5kIGNvbGxhcHNlIGV2ZW50cyBpbiB0aGlzIHZpZXdlci4gSGFzIG5vCi0gICAgICogZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyCi0gICAgICogICAgICAgICAgIGEgdHJlZSB2aWV3ZXIgbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUcmVlTGlzdGVuZXIoSVRyZWVWaWV3ZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICB0cmVlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gU1dUIHRyZWUgbGlzdGVuZXIgdG8gdGhlIGdpdmVuIFNXVCBjb250cm9sLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250cm9sCi0gICAgICogICAgICAgICAgIHRoZSBTV1QgY29udHJvbAotICAgICAqIEBwYXJhbSBsaXN0ZW5lcgotICAgICAqICAgICAgICAgICB0aGUgU1dUIHRyZWUgbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRUcmVlTGlzdGVuZXIoQ29udHJvbCBjb250cm9sLAotICAgICAgICAgICAgVHJlZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qIChub24tSmF2YWRvYykgQHNlZSBTdHJ1Y3R1cmVkVmlld2VyI2Fzc29jaWF0ZShPYmplY3QsIEl0ZW0pICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzb2NpYXRlKE9iamVjdCBlbGVtZW50LCBJdGVtIGl0ZW0pIHsKLSAgICAgICAgT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhICE9IGVsZW1lbnQgJiYgZXF1YWxzKGRhdGEsIGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBQUiAxRlY2MkJUCi0gICAgICAgICAgICAvLyBhc3N1bXB0aW9uOiBlbGVtZW50cyBhcmUgZXF1YWwgYnV0IG5vdCBpZGVudGljYWwKLSAgICAgICAgICAgIC8vIC0+IHJlbW92ZSBmcm9tIG1hcCBidXQgZG9uJ3QgdG91Y2ggY2hpbGRyZW4KLSAgICAgICAgICAgIHVubWFwRWxlbWVudChkYXRhLCBpdGVtKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0RGF0YShlbGVtZW50KTsKLSAgICAgICAgICAgIG1hcEVsZW1lbnQoZWxlbWVudCwgaXRlbSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyByZWN1cnNpdmVseSBkaXNhc3NvY2lhdGUgYWxsCi0gICAgICAgICAgICBzdXBlci5hc3NvY2lhdGUoZWxlbWVudCwgaXRlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb2xsYXBzZXMgYWxsIG5vZGVzIG9mIHRoZSB2aWV3ZXIncyB0cmVlLCBzdGFydGluZyB3aXRoIHRoZSByb290LiBUaGlzCi0gICAgICogbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gPGNvZGU+Y29sbGFwc2VUb0xldmVsKEFMTF9MRVZFTFMpPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb2xsYXBzZUFsbCgpIHsKLSAgICAgICAgT2JqZWN0IHJvb3QgPSBnZXRSb290KCk7Ci0gICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbGxhcHNlVG9MZXZlbChyb290LCBBTExfTEVWRUxTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbGxhcHNlcyB0aGUgc3VidHJlZSByb290ZWQgYXQgdGhlIGdpdmVuIGVsZW1lbnQgb3IgdHJlZSBwYXRoIHRvIHRoZSBnaXZlbiBsZXZlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE9yVHJlZVBhdGgKLSAgICAgKiAgICAgICAgICAgdGhlIGVsZW1lbnQgb3IgdHJlZSBwYXRoCi0gICAgICogQHBhcmFtIGxldmVsCi0gICAgICogICAgICAgICAgIG5vbi1uZWdhdGl2ZSBsZXZlbCwgb3IgPGNvZGU+QUxMX0xFVkVMUzwvY29kZT4gdG8gY29sbGFwc2UKLSAgICAgKiAgICAgICAgICAgYWxsIGxldmVscyBvZiB0aGUgdHJlZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbGxhcHNlVG9MZXZlbChPYmplY3QgZWxlbWVudE9yVHJlZVBhdGgsIGludCBsZXZlbCkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGVsZW1lbnRPclRyZWVQYXRoKTsKLSAgICAgICAgV2lkZ2V0IHcgPSBpbnRlcm5hbEdldFdpZGdldFRvU2VsZWN0KGVsZW1lbnRPclRyZWVQYXRoKTsKLSAgICAgICAgaWYgKHcgIT0gbnVsbCkKLSAgICAgICAgICAgIGludGVybmFsQ29sbGFwc2VUb0xldmVsKHcsIGxldmVsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFsbCBjaGlsZHJlbiBmb3IgdGhlIGdpdmVuIHdpZGdldC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgYXNzdW1lcyB0aGF0IDxjb2RlPndpZGdldC5nZXREYXRhKCk8L2NvZGU+Ci0gICAgICogcmV0dXJucyB0aGUgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlLiBOb3RlOiB0aGUgbm9kZSBpcyBub3QKLSAgICAgKiB2aXN1YWxseSBleHBhbmRlZCEgWW91IG1heSBoYXZlIHRvIGNhbGwgPGNvZGU+cGFyZW50LnNldEV4cGFuZGVkKHRydWUpPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHdpZGdldAotICAgICAqICAgICAgICAgICB0aGUgd2lkZ2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRyZW4oZmluYWwgV2lkZ2V0IHdpZGdldCkgewotICAgICAgICBmaW5hbCBJdGVtW10gdGlzID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKLSAgICAgICAgaWYgKHRpcyAhPSBudWxsICYmIHRpcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBPYmplY3QgZGF0YSA9IHRpc1swXS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsgLy8gY2hpbGRyZW4gYWxyZWFkeSB0aGVyZSEKLSAgICAgICAgfQotCi0gICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHdpZGdldC5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAvLyBmaXggZm9yIFBSIDFGVzg5TDc6Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgY29tcGxhaW4gYW5kIHJlbW92ZSBhbGwgImR1bW1pZXMiIC4uLgotICAgICAgICAgICAgICAgIGlmICh0aXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRpcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpc1tpXS5nZXREYXRhKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Fzc29jaWF0ZSh0aXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5pc1RydWUodGlzW2ldLmdldERhdGEoKSA9PSBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlY29uZCBvciBsYXRlciBjaGlsZCBpcyBub24gLW51bGwiKTsvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGQgPSB3aWRnZXQuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGlmIChkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHBhcmVudEVsZW1lbnQgPSBkOwotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBjaGlsZHJlbiA9IGdldFNvcnRlZENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVUcmVlSXRlbSh3aWRnZXQsIGNoaWxkcmVuW2ldLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzaW5nbGUgaXRlbSBmb3IgdGhlIGdpdmVuIHBhcmVudCBhbmQgc3luY2hyb25pemVzIGl0IHdpdGggdGhlCi0gICAgICogZ2l2ZW4gZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgIHRoZSBwYXJlbnQgd2lkZ2V0Ci0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiAgICAgICAgICAgdGhlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgaWYgbm9uLW5lZ2F0aXZlLCBpbmRpY2F0ZXMgdGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgaXRlbQotICAgICAqICAgICAgICAgICBpbnRvIGl0cyBwYXJlbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUcmVlSXRlbShXaWRnZXQgcGFyZW50LCBPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0gICAgICAgIEl0ZW0gaXRlbSA9IG5ld0l0ZW0ocGFyZW50LCBTV1QuTlVMTCwgaW5kZXgpOwotICAgICAgICB1cGRhdGVJdGVtKGl0ZW0sIGVsZW1lbnQpOwotICAgICAgICB1cGRhdGVQbHVzKGl0ZW0sIGVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5BYnN0cmFjdFRyZWVWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGFsc28KLSAgICAgKiByZWN1cnNlcyBvdmVyIGNoaWxkcmVuIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGlzYXNzb2NpYXRlKEl0ZW0gaXRlbSkgewotICAgICAgICBzdXBlci5kaXNhc3NvY2lhdGUoaXRlbSk7Ci0gICAgICAgIC8vIHJlY3Vyc2l2ZWx5IHVubWFwcGluZyB0aGUgaXRlbXMgaXMgb25seSByZXF1aXJlZCB3aGVuCi0gICAgICAgIC8vIHRoZSBoYXNoIG1hcCBpcyB1c2VkLiBJbiB0aGUgb3RoZXIgY2FzZSBkaXNwb3NpbmcKLSAgICAgICAgLy8gYW4gaXRlbSB3aWxsIHJlY3Vyc2l2ZWx5IGRpc3Bvc2UgaXRzIGNoaWxkcmVuLgotICAgICAgICBpZiAodXNpbmdFbGVtZW50TWFwKCkpCi0gICAgICAgICAgICBkaXNhc3NvY2lhdGVDaGlsZHJlbihpdGVtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNhc3NvY2lhdGVzIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gU1dUIGl0ZW0gZnJvbSB0aGVpcgotICAgICAqIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZW0KLSAgICAgKiAgICAgICAgICAgdGhlIHdpZGdldAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkaXNhc3NvY2lhdGVDaGlsZHJlbihJdGVtIGl0ZW0pIHsKLSAgICAgICAgSXRlbVtdIGl0ZW1zID0gZ2V0Q2hpbGRyZW4oaXRlbSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtc1tpXS5nZXREYXRhKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBkaXNhc3NvY2lhdGUoaXRlbXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gU3RydWN0dXJlZFZpZXdlci4gKi8KLSAgICBwcm90ZWN0ZWQgV2lkZ2V0IGRvRmluZElucHV0SXRlbShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAvLyBjb21wYXJlIHdpdGggcm9vdAotICAgICAgICBPYmplY3Qgcm9vdCA9IGdldFJvb3QoKTsKLSAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGlmIChlcXVhbHMocm9vdCwgZWxlbWVudCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udHJvbCgpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBTdHJ1Y3R1cmVkVmlld2VyLiAqLwotICAgIHByb3RlY3RlZCBXaWRnZXQgZG9GaW5kSXRlbShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAvLyBjb21wYXJlIHdpdGggcm9vdAotICAgICAgICBPYmplY3Qgcm9vdCA9IGdldFJvb3QoKTsKLSAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IGdldENoaWxkcmVuKGdldENvbnRyb2woKSk7Ci0gICAgICAgIGlmIChpdGVtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgV2lkZ2V0IG8gPSBpbnRlcm5hbEZpbmRJdGVtKGl0ZW1zW2ldLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAobyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaW50byB0aGUgZ2l2ZW4gU1dUIGl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZW0KLSAgICAgKiAgICAgICAgICAgdGhlIFNXVCBpdGVtCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiAgICAgICAgICAgdGhlIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1VwZGF0ZUl0ZW0oSXRlbSBpdGVtLCBPYmplY3QgZWxlbWVudCk7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBTdHJ1Y3R1cmVkVmlld2VyLiAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvVXBkYXRlSXRlbShXaWRnZXQgd2lkZ2V0LCBPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBmdWxsTWFwKSB7Ci0gICAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBJdGVtKSB7Ci0gICAgICAgICAgICBJdGVtIGl0ZW0gPSAoSXRlbSkgd2lkZ2V0OwotCi0gICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCBiYWNrcG9pbnRlciBpcyBjb3JyZWN0Ci0gICAgICAgICAgICBpZiAoZnVsbE1hcCkgewotICAgICAgICAgICAgICAgIGFzc29jaWF0ZShlbGVtZW50LCBpdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAJT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgIAlpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJCXVubWFwRWxlbWVudChkYXRhLCBpdGVtKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgaXRlbS5zZXREYXRhKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG1hcEVsZW1lbnQoZWxlbWVudCwgaXRlbSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHVwZGF0ZSBpY29uIGFuZCBsYWJlbAotICAgICAgICAgICAgU2FmZVJ1bm5hYmxlLnJ1bihuZXcgVXBkYXRlSXRlbVNhZmVSdW5uYWJsZShpdGVtLCBlbGVtZW50KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHBhbmRzIGFsbCBub2RlcyBvZiB0aGUgdmlld2VyJ3MgdHJlZSwgc3RhcnRpbmcgd2l0aCB0aGUgcm9vdC4gVGhpcwotICAgICAqIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPmV4cGFuZFRvTGV2ZWwoQUxMX0xFVkVMUyk8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4cGFuZEFsbCgpIHsKLSAgICAgICAgZXhwYW5kVG9MZXZlbChBTExfTEVWRUxTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHBhbmRzIHRoZSByb290IG9mIHRoZSB2aWV3ZXIncyB0cmVlIHRvIHRoZSBnaXZlbiBsZXZlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGV2ZWwKLSAgICAgKiAgICAgICAgICAgbm9uLW5lZ2F0aXZlIGxldmVsLCBvciA8Y29kZT5BTExfTEVWRUxTPC9jb2RlPiB0byBleHBhbmQgYWxsCi0gICAgICogICAgICAgICAgIGxldmVscyBvZiB0aGUgdHJlZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4cGFuZFRvTGV2ZWwoaW50IGxldmVsKSB7Ci0gICAgICAgIGV4cGFuZFRvTGV2ZWwoZ2V0Um9vdCgpLCBsZXZlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhwYW5kcyBhbGwgYW5jZXN0b3JzIG9mIHRoZSBnaXZlbiBlbGVtZW50IG9yIHRyZWUgcGF0aCBzbyB0aGF0IHRoZSBnaXZlbiBlbGVtZW50Ci0gICAgICogYmVjb21lcyB2aXNpYmxlIGluIHRoaXMgdmlld2VyJ3MgdHJlZSBjb250cm9sLCBhbmQgdGhlbiBleHBhbmRzIHRoZQotICAgICAqIHN1YnRyZWUgcm9vdGVkIGF0IHRoZSBnaXZlbiBlbGVtZW50IHRvIHRoZSBnaXZlbiBsZXZlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE9yVHJlZVBhdGgKLSAgICAgKiAgICAgICAgICAgdGhlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gbGV2ZWwKLSAgICAgKiAgICAgICAgICAgbm9uLW5lZ2F0aXZlIGxldmVsLCBvciA8Y29kZT5BTExfTEVWRUxTPC9jb2RlPiB0byBleHBhbmQgYWxsCi0gICAgICogICAgICAgICAgIGxldmVscyBvZiB0aGUgdHJlZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4cGFuZFRvTGV2ZWwoT2JqZWN0IGVsZW1lbnRPclRyZWVQYXRoLCBpbnQgbGV2ZWwpIHsKLSAgICAgICAgV2lkZ2V0IHcgPSBpbnRlcm5hbEV4cGFuZChlbGVtZW50T3JUcmVlUGF0aCwgdHJ1ZSk7Ci0gICAgICAgIGlmICh3ICE9IG51bGwpCi0gICAgICAgICAgICBpbnRlcm5hbEV4cGFuZFRvTGV2ZWwodywgbGV2ZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpcmVzIGEgdHJlZSBjb2xsYXBzZWQgZXZlbnQuIE9ubHkgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUgdGhpcwotICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudAotICAgICAqICAgICAgICAgICB0aGUgdHJlZSBleHBhbnNpb24gZXZlbnQKLSAgICAgKiBAc2VlIElUcmVlVmlld2VyTGlzdGVuZXIjdHJlZUNvbGxhcHNlZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVUcmVlQ29sbGFwc2VkKGZpbmFsIFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnMgPSB0cmVlTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgZmluYWwgSVRyZWVWaWV3ZXJMaXN0ZW5lciBsID0gKElUcmVlVmlld2VyTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLSAgICAgICAgICAgIFNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGwudHJlZUNvbGxhcHNlZChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaXJlcyBhIHRyZWUgZXhwYW5kZWQgZXZlbnQuIE9ubHkgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUgdGhpcwotICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudAotICAgICAqICAgICAgICAgICB0aGUgdHJlZSBleHBhbnNpb24gZXZlbnQKLSAgICAgKiBAc2VlIElUcmVlVmlld2VyTGlzdGVuZXIjdHJlZUV4cGFuZGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVFeHBhbmRlZChmaW5hbCBUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgT2JqZWN0W10gbGlzdGVuZXJzID0gdHJlZUxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGZpbmFsIElUcmVlVmlld2VyTGlzdGVuZXIgbCA9IChJVHJlZVZpZXdlckxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICBTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBsLnRyZWVFeHBhbmRlZChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGF1dG8tZXhwYW5kIGxldmVsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gbm9uLW5lZ2F0aXZlIGxldmVsLCBvciA8Y29kZT5BTExfTEVWRUxTPC9jb2RlPiBpZiBhbGwgbGV2ZWxzCi0gICAgICogICAgICAgICBvZiB0aGUgdHJlZSBhcmUgZXhwYW5kZWQgYXV0b21hdGljYWxseQotICAgICAqIEBzZWUgI3NldEF1dG9FeHBhbmRMZXZlbAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QXV0b0V4cGFuZExldmVsKCkgewotICAgICAgICByZXR1cm4gZXhwYW5kVG9MZXZlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTV1QgY2hpbGQgaXRlbXMgZm9yIHRoZSBnaXZlbiBTV1Qgd2lkZ2V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSB3aWRnZXQKLSAgICAgKiAgICAgICAgICAgdGhlIHdpZGdldAotICAgICAqIEByZXR1cm4gdGhlIGNoaWxkIGl0ZW1zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEl0ZW1bXSBnZXRDaGlsZHJlbihXaWRnZXQgd2lkZ2V0KTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGNoaWxkIGZvciB0aGUgd2lkZ2V0IGF0IGluZGV4LiBOb3RlIHRoYXQgdGhlIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiBpcyBub3QgdmVyeSBlZmZlY2llbnQgYW5kIHNob3VsZCBiZSBvdmVycmlkZGVuCi0JICogaWYgdGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZC4KLQkgKiBAcGFyYW0gd2lkZ2V0IHRoZSB3aWRnZXQgdG8gY2hlY2sKLQkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSB3aWRnZXQKLQkgKiBAcmV0dXJuIEl0ZW0gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgd2lkZ2V0IGlzIG5vdCBhIHR5cGUKLQkgKiB0aGF0IGNhbiBjb250YWluIGl0ZW1zLgotICAgICAqCi0JICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG5vdCB2YWxpZC4KLSAgICAgKiBAc2luY2UgMy4xCi0JICovCi0gICAgcHJvdGVjdGVkIEl0ZW0gZ2V0Q2hpbGQgKFdpZGdldCB3aWRnZXQsIGludCBpbmRleCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4od2lkZ2V0KVtpbmRleF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBTV1QgaXRlbSBpcyBleHBhbmRlZCBvciBjb2xsYXBzZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZW0KLSAgICAgKiAgICAgICAgICAgdGhlIGl0ZW0KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpdGVtIGlzIGNvbnNpZGVyZWQgZXhwYW5kZWQgYW5kCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY29sbGFwc2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZ2V0RXhwYW5kZWQoSXRlbSBpdGVtKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gZXhwYW5kZWQgbm9kZXMgaW4gdGhpcwotICAgICAqIHZpZXdlcidzIHRyZWUsIGluY2x1ZGluZyBjdXJyZW50bHkgaGlkZGVuIG9uZXMgdGhhdCBhcmUgbWFya2VkIGFzCi0gICAgICogZXhwYW5kZWQgYnV0IGFyZSB1bmRlciBhIGNvbGxhcHNlZCBhbmNlc3Rvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHByZXNlcnZpbmcgdGhlIGludGVyZXN0aW5nIHN0YXRlIG9mIGEKLSAgICAgKiB2aWV3ZXI7IDxjb2RlPnNldEV4cGFuZGVkRWxlbWVudHM8L2NvZGU+IGlzIHVzZWQgZHVyaW5nIHRoZSByZXN0b3JlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBleHBhbmRlZCBlbGVtZW50cwotICAgICAqIEBzZWUgI3NldEV4cGFuZGVkRWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RXhwYW5kZWRFbGVtZW50cygpIHsKLSAgICAgICAgQXJyYXlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpbnRlcm5hbENvbGxlY3RFeHBhbmRlZEl0ZW1zKGl0ZW1zLCBnZXRDb250cm9sKCkpOwotICAgICAgICBBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChpdGVtcy5zaXplKCkpOwotICAgICAgICBmb3IoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgIAlJdGVtIGl0ZW0gPSAoSXRlbSkgaXQubmV4dCgpOwotICAgICAgICAJT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgCWlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgCQlyZXN1bHQuYWRkKGRhdGEpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9BcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBlbGVtZW50IG9yIHRyZWUgcGF0aCBpcyBleHBhbmRlZAotICAgICAqIG9yIGNvbGxhcHNlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE9yVHJlZVBhdGgKLSAgICAgKiAgICAgICAgICAgdGhlIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBub2RlIGlzIGV4cGFuZGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBpZiBjb2xsYXBzZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRlZFN0YXRlKE9iamVjdCBlbGVtZW50T3JUcmVlUGF0aCkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGVsZW1lbnRPclRyZWVQYXRoKTsKLSAgICAgICAgV2lkZ2V0IGl0ZW0gPSBpbnRlcm5hbEdldFdpZGdldFRvU2VsZWN0KGVsZW1lbnRPclRyZWVQYXRoKTsKLSAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJdGVtKQotICAgICAgICAgICAgcmV0dXJuIGdldEV4cGFuZGVkKChJdGVtKSBpdGVtKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZCBpdGVtcyBvZiB0aGUgZ2l2ZW4gU1dUIGNvbnRyb2wuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRyb2wKLSAgICAgKiAgICAgICAgICAgdGhlIGNvbnRyb2wKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldEl0ZW1Db3VudChDb250cm9sIGNvbnRyb2wpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkIGl0ZW1zIG9mIHRoZSBnaXZlbiBTV1QgaXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlbQotICAgICAqICAgICAgICAgICB0aGUgaXRlbQotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0SXRlbUNvdW50KEl0ZW0gaXRlbSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGlsZCBpdGVtcyBvZiB0aGUgZ2l2ZW4gU1dUIGl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZW0KLSAgICAgKiAgICAgICAgICAgdGhlIGl0ZW0KLSAgICAgKiBAcmV0dXJuIHRoZSBjaGlsZCBpdGVtcwotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBJdGVtW10gZ2V0SXRlbXMoSXRlbSBpdGVtKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGl0ZW0gYWZ0ZXIgdGhlIGdpdmVuIGl0ZW0gaW4gdGhlIHRyZWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgdGhlcmUgaXMgbm8gbmV4dCBpdGVtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpdGVtCi0gICAgICogICAgICAgICAgIHRoZSBpdGVtCi0gICAgICogQHBhcmFtIGluY2x1ZGVDaGlsZHJlbgotICAgICAqICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gYXJlIGNvbnNpZGVyZWQgaW4KLSAgICAgKiAgICAgICAgICAgZGV0ZXJtaW5pbmcgd2hpY2ggaXRlbSBpcyBuZXh0LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmCi0gICAgICogICAgICAgICAgIHN1YnRyZWVzIGFyZSBpZ25vcmVkCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBpdGVtLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEl0ZW0gZ2V0TmV4dEl0ZW0oSXRlbSBpdGVtLCBib29sZWFuIGluY2x1ZGVDaGlsZHJlbikgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5jbHVkZUNoaWxkcmVuICYmIGdldEV4cGFuZGVkKGl0ZW0pKSB7Ci0gICAgICAgICAgICBJdGVtW10gY2hpbGRyZW4gPSBnZXRJdGVtcyhpdGVtKTsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL25leHQgaXRlbSBpcyBlaXRoZXIgbmV4dCBzaWJsaW5nIG9yIG5leHQgc2libGluZyBvZiBmaXJzdAotICAgICAgICAvL3BhcmVudCB0aGF0IGhhcyBhIG5leHQgc2libGluZy4KLSAgICAgICAgSXRlbSBwYXJlbnQgPSBnZXRQYXJlbnRJdGVtKGl0ZW0pOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIEl0ZW1bXSBzaWJsaW5ncyA9IGdldEl0ZW1zKHBhcmVudCk7Ci0gICAgICAgIGlmIChzaWJsaW5ncyAhPSBudWxsKXsKLSAgICAgICAgCWlmKHNpYmxpbmdzLmxlbmd0aCA8PSAxKSAKLSAgICAgICAgCQlyZXR1cm4gZ2V0TmV4dEl0ZW0ocGFyZW50LCBmYWxzZSk7Ci0gICAgICAgIAkKLSAgICAgICAgCWZvciAoaW50IGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoc2libGluZ3NbaV0gPT0gaXRlbSAmJiBpIDwgKHNpYmxpbmdzLmxlbmd0aCAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWJsaW5nc1tpICsgMV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXROZXh0SXRlbShwYXJlbnQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgaXRlbSBvZiB0aGUgZ2l2ZW4gaXRlbSBpbiB0aGUgdHJlZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBpZiB0aGVyZSBpcyBubyBwYXJlbnQgaXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlbQotICAgICAqICAgICAgICAgICB0aGUgaXRlbQotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBpdGVtLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEl0ZW0gZ2V0UGFyZW50SXRlbShJdGVtIGl0ZW0pOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaXRlbSBiZWZvcmUgdGhlIGdpdmVuIGl0ZW0gaW4gdGhlIHRyZWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgaXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlbQotICAgICAqICAgICAgICAgICB0aGUgaXRlbQotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGl0ZW0sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSXRlbSBnZXRQcmV2aW91c0l0ZW0oSXRlbSBpdGVtKSB7Ci0gICAgICAgIC8vcHJldmlvdXMgaXRlbSBpcyBlaXRoZXIgcmlnaHQtbW9zdCB2aXNpYmxlIGRlc2NlbmRlbnQgb2YgcHJldmlvdXMKLSAgICAgICAgLy9zaWJsaW5nIG9yIHBhcmVudAotICAgICAgICBJdGVtIHBhcmVudCA9IGdldFBhcmVudEl0ZW0oaXRlbSk7Ci0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgSXRlbVtdIHNpYmxpbmdzID0gZ2V0SXRlbXMocGFyZW50KTsKLSAgICAgICAgaWYgKHNpYmxpbmdzLmxlbmd0aCA9PSAwIHx8IHNpYmxpbmdzWzBdID09IGl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgSXRlbSBwcmV2aW91cyA9IHNpYmxpbmdzWzBdOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoc2libGluZ3NbaV0gPT0gaXRlbSkgewotICAgICAgICAgICAgICAgIHJldHVybiByaWdodE1vc3RWaXNpYmxlRGVzY2VuZGVudChwcmV2aW91cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmV2aW91cyA9IHNpYmxpbmdzW2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFN0cnVjdHVyZWRWaWV3ZXIuICovCi0gICAgcHJvdGVjdGVkIE9iamVjdFtdIGdldFJhd0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZXF1YWxzKHBhcmVudCwgZ2V0Um9vdCgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmF3Q2hpbGRyZW4ocGFyZW50KTsKLSAgICAgICAgICAgIElUcmVlQ29udGVudFByb3ZpZGVyIGNwID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSBnZXRDb250ZW50UHJvdmlkZXIoKTsKLSAgICAgICAgICAgIGlmIChjcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gY3AuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgc2VsZWN0ZWQgaXRlbXMgZm9yIHRoZSBnaXZlbiBTV1QgY29udHJvbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udHJvbAotICAgICAqICAgICAgICAgICB0aGUgY29udHJvbAotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgaXRlbXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlbVtdIGdldFNlbGVjdGlvbihDb250cm9sIGNvbnRyb2wpOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gU3RydWN0dXJlZFZpZXdlci4gKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRTZWxlY3Rpb25Gcm9tV2lkZ2V0KCkgewotICAgICAgICBXaWRnZXRbXSBpdGVtcyA9IGdldFNlbGVjdGlvbihnZXRDb250cm9sKCkpOwotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoaXRlbXMubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgV2lkZ2V0IGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgIE9iamVjdCBlID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBpZiAoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYSB0cmVlIGNvbGxhcHNlIGV2ZW50IGZyb20gdGhlIFNXVCB3aWRnZXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50Ci0gICAgICogICAgICAgICAgIHRoZSBTV1QgdHJlZSBldmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVRyZWVDb2xsYXBzZShUcmVlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50Lml0ZW0uZ2V0RGF0YSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpcmVUcmVlQ29sbGFwc2VkKG5ldyBUcmVlRXhwYW5zaW9uRXZlbnQodGhpcywgZXZlbnQuaXRlbS5nZXREYXRhKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYSB0cmVlIGV4cGFuZCBldmVudCBmcm9tIHRoZSBTV1Qgd2lkZ2V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudAotICAgICAqICAgICAgICAgICB0aGUgU1dUIHRyZWUgZXZlbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUcmVlRXhwYW5kKFRyZWVFdmVudCBldmVudCkgewotICAgIAlpZiAoIShnZXRDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIElMYXp5VHJlZUNvbnRlbnRQcm92aWRlcikpIHsKLQkJCWNyZWF0ZUNoaWxkcmVuKGV2ZW50Lml0ZW0pOwotCQl9Ci0gICAgICAgIGlmIChldmVudC5pdGVtLmdldERhdGEoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaXJlVHJlZUV4cGFuZGVkKG5ldyBUcmVlRXhwYW5zaW9uRXZlbnQodGhpcywgZXZlbnQuaXRlbS5nZXREYXRhKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFZpZXdlci4gKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBob29rQ29udHJvbChDb250cm9sIGNvbnRyb2wpIHsKLSAgICAgICAgc3VwZXIuaG9va0NvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFkZFRyZWVMaXN0ZW5lcihjb250cm9sLCBuZXcgVHJlZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGhhbmRsZVRyZWVFeHBhbmQoZXZlbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGhhbmRsZVRyZWVDb2xsYXBzZShldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gU3RydWN0dXJlZFZpZXdlci4gQnVpbGRzIHRoZSBpbml0aWFsCi0gICAgICogdHJlZSBhbmQgaGFuZGxlcyB0aGUgYXV0b21hdGljIGV4cGFuZCBmZWF0dXJlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGlucHV0Q2hhbmdlZChPYmplY3QgaW5wdXQsIE9iamVjdCBvbGRJbnB1dCkgewotICAgICAgICBwcmVzZXJ2aW5nU2VsZWN0aW9uKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBDb250cm9sIHRyZWUgPSBnZXRDb250cm9sKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VSZWRyYXcgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIChzaXplID4gUkVEUkFXX1RIUkVTSE9MRCkgfHwgKHRhYmxlLmdldEl0ZW1Db3VudCgpID4KLSAgICAgICAgICAgICAgICAvLyBSRURSQVdfVEhSRVNIT0xEKTsKLSAgICAgICAgICAgICAgICBpZiAodXNlUmVkcmF3KQotICAgICAgICAgICAgICAgICAgICB0cmVlLnNldFJlZHJhdyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQWxsKHRyZWUpOwotICAgICAgICAgICAgICAgIHRyZWUuc2V0RGF0YShnZXRSb290KCkpOwotICAgICAgICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHRyZWUpOwotICAgICAgICAgICAgICAgIGludGVybmFsRXhwYW5kVG9MZXZlbCh0cmVlLCBleHBhbmRUb0xldmVsKTsKLSAgICAgICAgICAgICAgICBpZiAodXNlUmVkcmF3KQotICAgICAgICAgICAgICAgICAgICB0cmVlLnNldFJlZHJhdyh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjdXJzaXZlbHkgY29sbGFwc2VzIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGUgZ2l2ZW4gd2lkZ2V0IHRvIHRoZQotICAgICAqIGdpdmVuIGxldmVsLgotICAgICAqIDxwPgotICAgICAqIDwvcD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgY2FsbCA8Y29kZT5zZXRSZWRyYXc8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSB3aWRnZXQKLSAgICAgKiAgICAgICAgICAgdGhlIHdpZGdldAotICAgICAqIEBwYXJhbSBsZXZlbAotICAgICAqICAgICAgICAgICBub24tbmVnYXRpdmUgbGV2ZWwsIG9yIDxjb2RlPkFMTF9MRVZFTFM8L2NvZGU+IHRvIGNvbGxhcHNlCi0gICAgICogICAgICAgICAgIGFsbCBsZXZlbHMgb2YgdGhlIHRyZWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbENvbGxhcHNlVG9MZXZlbChXaWRnZXQgd2lkZ2V0LCBpbnQgbGV2ZWwpIHsKLSAgICAgICAgaWYgKGxldmVsID09IEFMTF9MRVZFTFMgfHwgbGV2ZWwgPiAwKSB7Ci0KLSAgICAgICAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBJdGVtKQotICAgICAgICAgICAgICAgIHNldEV4cGFuZGVkKChJdGVtKSB3aWRnZXQsIGZhbHNlKTsKLQotICAgICAgICAgICAgaWYgKGxldmVsID09IEFMTF9MRVZFTFMgfHwgbGV2ZWwgPiAxKSB7Ci0gICAgICAgICAgICAgICAgSXRlbVtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dExldmVsID0gKGxldmVsID09IEFMTF9MRVZFTFMgPyBBTExfTEVWRUxTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsZXZlbCAtIDEpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxDb2xsYXBzZVRvTGV2ZWwoY2hpbGRyZW5baV0sIG5leHRMZXZlbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjdXJzaXZlbHkgY29sbGVjdHMgYWxsIGV4cGFuZGVkIGl0ZW1zIGZyb20gdGhlIGdpdmVuIHdpZGdldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAgICogICAgICAgICAgIGEgbGlzdCAoZWxlbWVudCB0eXBlOiA8Y29kZT5JdGVtPC9jb2RlPikgaW50byB3aGljaCB0bwotICAgICAqICAgICAgICAgICBjb2xsZWN0IHRoZSBlbGVtZW50cwotICAgICAqIEBwYXJhbSB3aWRnZXQKLSAgICAgKiAgICAgICAgICAgdGhlIHdpZGdldAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbENvbGxlY3RFeHBhbmRlZEl0ZW1zKExpc3QgcmVzdWx0LCBXaWRnZXQgd2lkZ2V0KSB7Ci0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IGdldENoaWxkcmVuKHdpZGdldCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgaWYgKGdldEV4cGFuZGVkKGl0ZW0pKSB7Ci0gICAgICAgICAgICAJcmVzdWx0LmFkZChpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsQ29sbGVjdEV4cGFuZGVkSXRlbXMocmVzdWx0LCBpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWVzIHRvIGNyZWF0ZSBhIHBhdGggb2YgdHJlZSBpdGVtcyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgb3IgdHJlZSBwYXRoLgotICAgICAqIFRoaXMgbWV0aG9kIHJlY3Vyc2l2ZWx5IHdhbGtzIHVwIHRvd2FyZHMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgYW5kIGluIHRoZQotICAgICAqIGNhc2Ugb2YgYW4gZWxlbWVudCAocmF0aGVyIHRoYW4gYSB0cmVlIHBhdGgpIGFzc3VtZXMgdGhhdAotICAgICAqIDxjb2RlPmdldFBhcmVudDwvY29kZT4gcmV0dXJucyB0aGUgY29ycmVjdCBwYXJlbnQgb2YgYW4gZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE9yUGF0aAotICAgICAqICAgICAgICAgICB0aGUgZWxlbWVudAotICAgICAqIEBwYXJhbSBleHBhbmQKLSAgICAgKiAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWxsIG5vZGVzIG9uIHRoZSBwYXRoIHNob3VsZCBiZQotICAgICAqICAgICAgICAgICBleHBhbmRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKiBAcmV0dXJuIFdpZGdldAotICAgICAqLwotICAgIHByb3RlY3RlZCBXaWRnZXQgaW50ZXJuYWxFeHBhbmQoT2JqZWN0IGVsZW1lbnRPclBhdGgsIGJvb2xlYW4gZXhwYW5kKSB7Ci0KLSAgICAgICAgaWYgKGVsZW1lbnRPclBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFdpZGdldCB3ID0gaW50ZXJuYWxHZXRXaWRnZXRUb1NlbGVjdChlbGVtZW50T3JQYXRoKTsKLSAgICAgICAgaWYgKHcgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVxdWFscyhlbGVtZW50T3JQYXRoLCBnZXRSb290KCkpKSB7IC8vIHN0b3AgYXQgcm9vdAotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gbXkgcGFyZW50IGhhcyB0byBjcmVhdGUgbWUKLSAgICAgICAgICAgIE9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnRFbGVtZW50KGVsZW1lbnRPclBhdGgpOwotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgV2lkZ2V0IHB3ID0gaW50ZXJuYWxFeHBhbmQocGFyZW50LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHB3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbGV0IG15IHBhcmVudCBjcmVhdGUgbWUKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ2hpbGRyZW4ocHcpOwotICAgICAgICAgICAgICAgICAgICAvLyBleHBhbmQgcGFyZW50IGFuZCBmaW5kIG1lCi0gICAgICAgICAgICAgICAgICAgIGlmIChwdyBpbnN0YW5jZW9mIEl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW0gaXRlbSA9IChJdGVtKSBwdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gaW50ZXJuYWxUb0VsZW1lbnQoZWxlbWVudE9yUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ID0gaW50ZXJuYWxGaW5kQ2hpbGQoaXRlbSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwYW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJLy8gZXhwYW5kIHBhcmVudCBpdGVtcyB0b3AtZG93bgotICAgICAgICAgICAgICAgICAgICAgICAgCUxpbmtlZExpc3QgdG9FeHBhbmRMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAl3aGlsZSAoaXRlbSAhPSBudWxsICYmICFnZXRFeHBhbmRlZChpdGVtKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgCQl0b0V4cGFuZExpc3QuYWRkRmlyc3QoaXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJCWl0ZW0gPSBnZXRQYXJlbnRJdGVtKGl0ZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIAlmb3IoSXRlcmF0b3IgaXQgPSB0b0V4cGFuZExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgCQlJdGVtIHRvRXhwYW5kID0gKEl0ZW0pIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0RXhwYW5kZWQodG9FeHBhbmQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgYXJndW1lbnQgaXMgYSB0cmVlIHBhdGgsIHJldHVybnMgaXRzIGxhc3Qgc2VnbWVudCwgb3RoZXJ3aXNlCi0gICAgICogcmV0dXJuIHRoZSBhcmd1bWVudAotICAgICAqIEBwYXJhbSBlbGVtZW50T3JQYXRoIGFuIGVsZW1lbnQgb3IgYSB0cmVlIHBhdGgKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50LCBvciB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSB0cmVlIHBhdGgKLSAgICAgKi8KLQlwcml2YXRlIE9iamVjdCBpbnRlcm5hbFRvRWxlbWVudChPYmplY3QgZWxlbWVudE9yUGF0aCkgewotCQlpZiAoZWxlbWVudE9yUGF0aCBpbnN0YW5jZW9mIFRyZWVQYXRoKSB7Ci0JCQlyZXR1cm4gKChUcmVlUGF0aCllbGVtZW50T3JQYXRoKS5nZXRMYXN0U2VnbWVudCgpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50T3JQYXRoOwotCX0KLQotICAgIC8qKgotCSAqIFRoaXMgbWV0aG9kIHRha2VzIGEgdHJlZSBwYXRoIG9yIGFuIGVsZW1lbnQuIElmIHRoZSBhcmd1bWVudCBpcyBub3QgYQotCSAqIHRyZWUgcGF0aCwgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBnaXZlbiBlbGVtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgdGhlIHBhcmVudCBpcyBub3Qga25vd24uIElmIHRoZSBhcmd1bWVudCBpcyBhIHRyZWUgcGF0aCB3aXRoIG1vcmUgdGhhbgotCSAqIG9uZSBzZWdtZW50LCByZXR1cm5zIGl0cyBwYXJlbnQgdHJlZSBwYXRoLCBvdGhlcndpc2UgcmV0dXJucwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50T3JUcmVlUGF0aAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBlbGVtZW50LCBvciBwYXJlbnQgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8gCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRQYXJlbnRFbGVtZW50KE9iamVjdCBlbGVtZW50T3JUcmVlUGF0aCkgewotICAgIAlpZihlbGVtZW50T3JUcmVlUGF0aCBpbnN0YW5jZW9mIFRyZWVQYXRoKSB7Ci0gICAgCQlUcmVlUGF0aCB0cmVlUGF0aCA9IChUcmVlUGF0aCllbGVtZW50T3JUcmVlUGF0aDsKLSAgICAJCWlmKHRyZWVQYXRoLmdldFNlZ21lbnRDb3VudCgpIDw9IDEpIHsKLSAgICAJCQlyZXR1cm4gbnVsbDsKLSAgICAJCX0KLQkJCXJldHVybiAodHJlZVBhdGgpLmdldFBhcmVudFBhdGgoKTsKLSAgICAJfQotICAgICAgICBJVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0gICAgICAgIGlmIChjcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3AuZ2V0UGFyZW50KGVsZW1lbnRPclRyZWVQYXRoKTsKLQl9Ci0KLQkvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3aWRnZXQgdG8gYmUgc2VsZWN0ZWQgZm9yIHRoZSBnaXZlbiBlbGVtZW50IG9yIHRyZWUgcGF0aC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE9yVHJlZVBhdGggdGhlIGVsZW1lbnQgb3IgdHJlZSBwYXRoIHRvIHNlbGVjdAotICAgICAqIEByZXR1cm4gdGhlIHdpZGdldCB0byBiZSBzZWxlY3RlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotCXByb3RlY3RlZCBXaWRnZXQgaW50ZXJuYWxHZXRXaWRnZXRUb1NlbGVjdChPYmplY3QgZWxlbWVudE9yVHJlZVBhdGgpIHsKLQkJaWYoZWxlbWVudE9yVHJlZVBhdGggaW5zdGFuY2VvZiBUcmVlUGF0aCkgewotCQkJVHJlZVBhdGggdHJlZVBhdGggPSAoVHJlZVBhdGgpIGVsZW1lbnRPclRyZWVQYXRoOwotCQkJaWYodHJlZVBhdGguZ2V0U2VnbWVudENvdW50KCk9PTApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCVdpZGdldFtdIGNhbmRpZGF0ZXMgPSBmaW5kSXRlbXModHJlZVBhdGguZ2V0TGFzdFNlZ21lbnQoKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhbmRpZGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlXaWRnZXQgY2FuZGlkYXRlID0gY2FuZGlkYXRlc1tpXTsKLQkJCQlpZighKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEl0ZW0pKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZih0cmVlUGF0aC5lcXVhbHMoZ2V0VHJlZVBhdGhGcm9tSXRlbSgoSXRlbSkgY2FuZGlkYXRlKSwgZ2V0Q29tcGFyZXIoKSkpIHsKLQkJCQkJcmV0dXJuIGNhbmRpZGF0ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmluZEl0ZW0oZWxlbWVudE9yVHJlZVBhdGgpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJlY3Vyc2l2ZWx5IGV4cGFuZHMgdGhlIHN1YnRyZWUgcm9vdGVkIGF0IHRoZSBnaXZlbiB3aWRnZXQgdG8gdGhlIGdpdmVuCi0gICAgICogbGV2ZWwuCi0gICAgICogPHA+Ci0gICAgICogPC9wPgotICAgICAqIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBjYWxsIDxjb2RlPnNldFJlZHJhdzwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHdpZGdldAotICAgICAqICAgICAgICAgICB0aGUgd2lkZ2V0Ci0gICAgICogQHBhcmFtIGxldmVsCi0gICAgICogICAgICAgICAgIG5vbi1uZWdhdGl2ZSBsZXZlbCwgb3IgPGNvZGU+QUxMX0xFVkVMUzwvY29kZT4gdG8gY29sbGFwc2UKLSAgICAgKiAgICAgICAgICAgYWxsIGxldmVscyBvZiB0aGUgdHJlZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGludGVybmFsRXhwYW5kVG9MZXZlbChXaWRnZXQgd2lkZ2V0LCBpbnQgbGV2ZWwpIHsKLSAgICAgICAgaWYgKGxldmVsID09IEFMTF9MRVZFTFMgfHwgbGV2ZWwgPiAwKSB7Ci0gICAgCQljcmVhdGVDaGlsZHJlbih3aWRnZXQpOwotICAgICAgICAgICAgaWYgKHdpZGdldCBpbnN0YW5jZW9mIEl0ZW0pCi0gICAgICAgICAgICAgICAgc2V0RXhwYW5kZWQoKEl0ZW0pIHdpZGdldCwgdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAobGV2ZWwgPT0gQUxMX0xFVkVMUyB8fCBsZXZlbCA+IDEpIHsKLSAgICAgICAgICAgICAgICBJdGVtW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbih3aWRnZXQpOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBuZXdMZXZlbCA9IChsZXZlbCA9PSBBTExfTEVWRUxTID8gQUxMX0xFVkVMUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGV2ZWwgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsRXhwYW5kVG9MZXZlbChjaGlsZHJlbltpXSwgbmV3TGV2ZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vbi1yZWN1cnNpdmVseSB0cmllcyB0byBmaW5kIHRoZSBnaXZlbiBlbGVtZW50IGFzIGEgY2hpbGQgb2YgdGhlIGdpdmVuCi0gICAgICogcGFyZW50IGl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICB0aGUgcGFyZW50IGl0ZW0KLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqICAgICAgICAgICB0aGUgZWxlbWVudAotICAgICAqIEByZXR1cm4gV2lkZ2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBXaWRnZXQgaW50ZXJuYWxGaW5kQ2hpbGQoSXRlbSBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IGdldENoaWxkcmVuKHBhcmVudCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwgJiYgZXF1YWxzKGRhdGEsIGVsZW1lbnQpKQotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY3Vyc2l2ZWx5IHRyaWVzIHRvIGZpbmQgdGhlIGdpdmVuIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICB0aGUgcGFyZW50IGl0ZW0KLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqICAgICAgICAgICB0aGUgZWxlbWVudAotICAgICAqIEByZXR1cm4gV2lkZ2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBXaWRnZXQgaW50ZXJuYWxGaW5kSXRlbShJdGVtIHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQotICAgICAgICAvLyBjb21wYXJlIHdpdGggbm9kZQotICAgICAgICBPYmplY3QgZGF0YSA9IHBhcmVudC5nZXREYXRhKCk7Ci0gICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChlcXVhbHMoZGF0YSwgZWxlbWVudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICAgICAgfQotICAgICAgICAvLyByZWN1cnNlIG92ZXIgY2hpbGRyZW4KLSAgICAgICAgSXRlbVtdIGl0ZW1zID0gZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICBXaWRnZXQgbyA9IGludGVybmFsRmluZEl0ZW0oaXRlbSwgZWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAobyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBvOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFN0cnVjdHVyZWRWaWV3ZXIuICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxSZWZyZXNoKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGludGVybmFsUmVmcmVzaChlbGVtZW50LCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBTdHJ1Y3R1cmVkVmlld2VyLiAqLwotICAgIHByb3RlY3RlZCB2b2lkIGludGVybmFsUmVmcmVzaChPYmplY3QgZWxlbWVudCwgYm9vbGVhbiB1cGRhdGVMYWJlbHMpIHsKLSAgICAgICAgLy8gSWYgZWxlbWVudCBpcyBudWxsLCBkbyBhIGZ1bGwgcmVmcmVzaC4KLSAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZXJuYWxSZWZyZXNoKGdldENvbnRyb2woKSwgZ2V0Um9vdCgpLCB0cnVlLCB1cGRhdGVMYWJlbHMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFdpZGdldFtdIGl0ZW1zID0gZmluZEl0ZW1zKGVsZW1lbnQpOwotICAgICAgICBpZiAoaXRlbXMubGVuZ3RoICE9IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBwaWNrIHVwIHN0cnVjdHVyZSBjaGFuZ2VzIHRvbwotCQkJCWludGVybmFsUmVmcmVzaChpdGVtc1tpXSwgZWxlbWVudCwgdHJ1ZSwgdXBkYXRlTGFiZWxzKTsKLQkJCX0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZnJlc2hlcyB0aGUgdHJlZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gd2lkZ2V0LgotICAgICAqIDxwPgotICAgICAqIEVYUEVSSU1FTlRBTC4gIE5vdCB0byBiZSB1c2VkIGV4Y2VwdCBieSBKRFQuCi0gICAgICogVGhpcyBtZXRob2Qgd2FzIGFkZGVkIHRvIHN1cHBvcnQgSkRUJ3MgZXhwbG9yYXRpb25zCi0gICAgICogaW50byBncm91cGluZyBieSB3b3JraW5nIHNldHMsIHdoaWNoIHJlcXVpcmVzIHZpZXdlcnMgdG8gc3VwcG9ydCBtdWx0aXBsZSAKLSAgICAgKiBlcXVhbCBlbGVtZW50cy4gIFNlZSBidWcgNzY0ODIgZm9yIG1vcmUgZGV0YWlscy4gIFRoaXMgc3VwcG9ydCB3aWxsCi0gICAgICogbGlrZWx5IGJlIHJlbW92ZWQgaW4gRWNsaXBzZSAzLjIgaW4gZmF2b3VyIG9mIHByb3BlciBzdXBwb3J0IGZvcgotICAgICAqIG11bHRpcGxlIGVxdWFsIGVsZW1lbnRzLiAKLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHdpZGdldAotICAgICAqICAgICAgICAgICB0aGUgd2lkZ2V0Ci0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiAgICAgICAgICAgdGhlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gZG9TdHJ1Y3QKLSAgICAgKiAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3RydWN0dXJhbCBjaGFuZ2VzIGFyZSB0byBiZSBwaWNrZWQgdXAsCi0gICAgICogICAgICAgICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgb25seSBsYWJlbCBwcm92aWRlciBjaGFuZ2VzIGFyZSBvZgotICAgICAqICAgICAgICAgICBpbnRlcmVzdAotICAgICAqIEBwYXJhbSB1cGRhdGVMYWJlbHMKLSAgICAgKiAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gdXBkYXRlIGxhYmVscyBmb3IgZXhpc3RpbmcgZWxlbWVudHMsCi0gICAgICogICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBvbmx5IHVwZGF0ZSBsYWJlbHMgYXMgbmVlZGVkLCBhc3N1bWluZwotICAgICAqICAgICAgICAgICB0aGF0IGxhYmVscyBmb3IgZXhpc3RpbmcgZWxlbWVudHMgYXJlIHVuY2hhbmdlZC4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxSZWZyZXNoKFdpZGdldCB3aWRnZXQsIE9iamVjdCBlbGVtZW50LAotICAgICAgICAgICAgYm9vbGVhbiBkb1N0cnVjdCwgYm9vbGVhbiB1cGRhdGVMYWJlbHMpIHsKLQotICAgICAgICBpZiAod2lkZ2V0IGluc3RhbmNlb2YgSXRlbSkgewotICAgICAgICAgICAgaWYgKGRvU3RydWN0KSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGx1cygoSXRlbSkgd2lkZ2V0LCBlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh1cGRhdGVMYWJlbHMgfHwgIWVxdWFscyhlbGVtZW50LCB3aWRnZXQuZ2V0RGF0YSgpKSkgewotICAgICAgICAgICAgICAgIGRvVXBkYXRlSXRlbSh3aWRnZXQsIGVsZW1lbnQsIHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhc3NvY2lhdGUoZWxlbWVudCwgKEl0ZW0pIHdpZGdldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZG9TdHJ1Y3QpIHsKLSAgICAgICAgICAgIGludGVybmFsUmVmcmVzaFN0cnVjdCh3aWRnZXQsIGVsZW1lbnQsIHVwZGF0ZUxhYmVscyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJdGVtW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbih3aWRnZXQpOwotICAgICAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFdpZGdldCBpdGVtID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbFJlZnJlc2goaXRlbSwgZGF0YSwgZG9TdHJ1Y3QsIHVwZGF0ZUxhYmVscyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBzdHJ1Y3R1cmUgYW5kIHJlY3Vyc2UuIEl0ZW1zIGFyZSB1cGRhdGVkIGluIHVwZGF0ZUNoaWxkcmVuLAotICAgICAqIGFzIG5lZWRlZC4KLSAgICAgKiBAcGFyYW0gd2lkZ2V0Ci0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gdXBkYXRlTGFiZWxzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGludGVybmFsUmVmcmVzaFN0cnVjdChXaWRnZXQgd2lkZ2V0LCBPYmplY3QgZWxlbWVudCwKLSAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7Ci0gICAgICAgIHVwZGF0ZUNoaWxkcmVuKHdpZGdldCwgZWxlbWVudCwgbnVsbCwgdXBkYXRlTGFiZWxzKTsKLSAgICAgICAgSXRlbVtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKLSAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBXaWRnZXQgaXRlbSA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgIE9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxSZWZyZXNoU3RydWN0KGl0ZW0sIGRhdGEsIHVwZGF0ZUxhYmVscyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBlbGVtZW50cyBmcm9tIHRoaXMgdmlld2VyLgotICAgICAqIDxwPgotICAgICAqIEVYUEVSSU1FTlRBTC4gIE5vdCB0byBiZSB1c2VkIGV4Y2VwdCBieSBKRFQuCi0gICAgICogVGhpcyBtZXRob2Qgd2FzIGFkZGVkIHRvIHN1cHBvcnQgSkRUJ3MgZXhwbG9yYXRpb25zCi0gICAgICogaW50byBncm91cGluZyBieSB3b3JraW5nIHNldHMsIHdoaWNoIHJlcXVpcmVzIHZpZXdlcnMgdG8gc3VwcG9ydCBtdWx0aXBsZSAKLSAgICAgKiBlcXVhbCBlbGVtZW50cy4gIFNlZSBidWcgNzY0ODIgZm9yIG1vcmUgZGV0YWlscy4gIFRoaXMgc3VwcG9ydCB3aWxsCi0gICAgICogbGlrZWx5IGJlIHJlbW92ZWQgaW4gRWNsaXBzZSAzLjIgaW4gZmF2b3VyIG9mIHByb3BlciBzdXBwb3J0IGZvcgotICAgICAqIG11bHRpcGxlIGVxdWFsIGVsZW1lbnRzLiAKLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnRzCi0gICAgICogICAgICAgICAgIHRoZSBlbGVtZW50cyB0byByZW1vdmUKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxSZW1vdmUoT2JqZWN0W10gZWxlbWVudHMpIHsKLSAgICAgICAgT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLSAgICAgICAgLy8gTm90ZTogZG8gbm90IHVzZSB0aGUgY29tcGFyZXIgaGVyZSBzaW5jZSB0aGUgaGFzaHRhYmxlCi0gICAgICAgIC8vIGNvbnRhaW5zIFNXVCBJdGVtcywgbm90IG1vZGVsIGVsZW1lbnRzLgotICAgICAgICBDdXN0b21IYXNodGFibGUgcGFyZW50SXRlbXMgPSBuZXcgQ3VzdG9tSGFzaHRhYmxlKDUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoZXF1YWxzKGVsZW1lbnRzW2ldLCBpbnB1dCkpIHsKLSAgICAgICAgICAgICAgICBzZXRJbnB1dChudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBXaWRnZXRbXSBjaGlsZEl0ZW1zID0gZmluZEl0ZW1zKGVsZW1lbnRzW2ldKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRJdGVtcy5sZW5ndGg7IGorKykgewotCQkJCVdpZGdldCBjaGlsZEl0ZW0gPSBjaGlsZEl0ZW1zW2pdOwotCQkJCWlmIChjaGlsZEl0ZW0gaW5zdGFuY2VvZiBJdGVtKSB7Ci0JCQkJCUl0ZW0gcGFyZW50SXRlbSA9IGdldFBhcmVudEl0ZW0oKEl0ZW0pIGNoaWxkSXRlbSk7Ci0JCQkJCWlmIChwYXJlbnRJdGVtICE9IG51bGwpIHsKLQkJCQkJCXBhcmVudEl0ZW1zLnB1dChwYXJlbnRJdGVtLCBwYXJlbnRJdGVtKTsKLQkJCQkJfQotCQkJCQlkaXNhc3NvY2lhdGUoKEl0ZW0pIGNoaWxkSXRlbSk7Ci0JCQkJCWNoaWxkSXRlbS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIENvbnRyb2wgdHJlZSA9IGdldENvbnRyb2woKTsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gcGFyZW50SXRlbXMua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgSXRlbSBwYXJlbnRJdGVtID0gKEl0ZW0pIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmKHBhcmVudEl0ZW0uaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgCWNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKCFnZXRFeHBhbmRlZChwYXJlbnRJdGVtKSAmJiBnZXRJdGVtQ291bnQocGFyZW50SXRlbSkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGFwcGVuZCBhIGR1bW15IGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgIGlmIChpc0V4cGFuZGFibGUocGFyZW50SXRlbS5nZXREYXRhKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0ocGFyZW50SXRlbSwgU1dULk5VTEwsIC0xKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBYWFg6IFdvcmthcm91bmQgKFBSIG1pc3NpbmcpCi0gICAgICAgICAgICAgICAgICAgIHRyZWUucmVkcmF3KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZXhwYW5kZWQgc3RhdGUgb2YgYWxsIGl0ZW1zIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGdpdmVuIHNldCBvZgotICAgICAqIGV4cGFuZGVkIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBleHBhbmRlZEVsZW1lbnRzCi0gICAgICogICAgICAgICAgIHRoZSBzZXQgKGVsZW1lbnQgdHlwZTogPGNvZGU+T2JqZWN0PC9jb2RlPikgb2YgZWxlbWVudHMKLSAgICAgKiAgICAgICAgICAgd2hpY2ggYXJlIGV4cGFuZGVkCi0gICAgICogQHBhcmFtIHdpZGdldAotICAgICAqICAgICAgICAgICB0aGUgd2lkZ2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGludGVybmFsU2V0RXhwYW5kZWQoQ3VzdG9tSGFzaHRhYmxlIGV4cGFuZGVkRWxlbWVudHMsCi0gICAgICAgICAgICBXaWRnZXQgd2lkZ2V0KSB7Ci0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IGdldENoaWxkcmVuKHdpZGdldCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGVsZW1lbnQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcAotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzYW1lIGVsZW1lbnQgYXBwZWFycyBvbiBhIGNoaWxkIGl0ZW0KLSAgICAgICAgICAgICAgICBib29sZWFuIGV4cGFuZGVkID0gZXhwYW5kZWRFbGVtZW50cy5yZW1vdmUoZGF0YSkgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoZXhwYW5kZWQgIT0gZ2V0RXhwYW5kZWQoaXRlbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDaGlsZHJlbihpdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXRFeHBhbmRlZChpdGVtLCBleHBhbmRlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWxTZXRFeHBhbmRlZChleHBhbmRlZEVsZW1lbnRzLCBpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV4cGFuZGVkIHN0YXRlIG9mIGFsbCBpdGVtcyB0byBjb3JyZXNwb25kIHRvIHRoZSBnaXZlbiBzZXQgb2YKLSAgICAgKiBleHBhbmRlZCB0cmVlIHBhdGhzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBleHBhbmRlZFRyZWVQYXRocwotICAgICAqICAgICAgICAgICB0aGUgc2V0IChlbGVtZW50IHR5cGU6IDxjb2RlPlRyZWVQYXRoPC9jb2RlPikgb2YgZWxlbWVudHMKLSAgICAgKiAgICAgICAgICAgd2hpY2ggYXJlIGV4cGFuZGVkCi0gICAgICogQHBhcmFtIHdpZGdldAotICAgICAqICAgICAgICAgICB0aGUgd2lkZ2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGludGVybmFsU2V0RXhwYW5kZWRUcmVlUGF0aHMoQ3VzdG9tSGFzaHRhYmxlIGV4cGFuZGVkVHJlZVBhdGhzLCBXaWRnZXQgd2lkZ2V0LCBUcmVlUGF0aCBjdXJyZW50UGF0aCkgewotICAgICAgICBJdGVtW10gaXRlbXMgPSBnZXRDaGlsZHJlbih3aWRnZXQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgIE9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBUcmVlUGF0aCBjaGlsZFBhdGggPSBkYXRhPT1udWxsID8gbnVsbDogY3VycmVudFBhdGguY3JlYXRlQ2hpbGRQYXRoKGRhdGEpOwotICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBjaGlsZFBhdGghPW51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGVsZW1lbnQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcAotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzYW1lIGVsZW1lbnQgYXBwZWFycyBvbiBhIGNoaWxkIGl0ZW0KLSAgICAgICAgICAgICAgICBib29sZWFuIGV4cGFuZGVkID0gZXhwYW5kZWRUcmVlUGF0aHMucmVtb3ZlKGNoaWxkUGF0aCkgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoZXhwYW5kZWQgIT0gZ2V0RXhwYW5kZWQoaXRlbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDaGlsZHJlbihpdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXRFeHBhbmRlZChpdGVtLCBleHBhbmRlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWxTZXRFeHBhbmRlZFRyZWVQYXRocyhleHBhbmRlZFRyZWVQYXRocywgaXRlbSwgY2hpbGRQYXRoKTsKLSAgICAgICAgfQotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSB0cmVlIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBlbGVtZW50IGNhbiBiZQotICAgICAqIGV4cGFuZGVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBjYWxscyA8Y29kZT5oYXNDaGlsZHJlbjwvY29kZT4KLSAgICAgKiBvbiB0aGlzIHZpZXdlcidzIGNvbnRlbnQgcHJvdmlkZXIuIEl0IG1heSBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiAgICAgICAgICAgdGhlIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0cmVlIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBnaXZlbgotICAgICAqICAgICAgICAgZWxlbWVudCBjYW4gYmUgZXhwYW5kZWQsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZGFibGUoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIGdldENvbnRlbnRQcm92aWRlcigpOwotICAgICAgICByZXR1cm4gY3AgIT0gbnVsbCAmJiBjcC5oYXNDaGlsZHJlbihlbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXIuICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoKSB7Ci0gICAgICAgIC8vIHdlIGhhdmUgdG8gd2FsayB0aGUgKHZpc2libGUpIHRyZWUgYW5kIHVwZGF0ZSBldmVyeSBpdGVtCi0gICAgICAgIENvbnRyb2wgdHJlZSA9IGdldENvbnRyb2woKTsKLSAgICAgICAgdHJlZS5zZXRSZWRyYXcoZmFsc2UpOwotICAgICAgICAvLyBkb24ndCBwaWNrIHVwIHN0cnVjdHVyZSBjaGFuZ2VzLCBidXQgZG8gZm9yY2UgbGFiZWwgdXBkYXRlcwotICAgICAgICBpbnRlcm5hbFJlZnJlc2godHJlZSwgZ2V0Um9vdCgpLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIHRyZWUuc2V0UmVkcmF3KHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgIHRoZSBwYXJlbnQgd2lkZ2V0Ci0gICAgICogQHBhcmFtIHN0eWxlCi0gICAgICogICAgICAgICAgIFNXVCBzdHlsZSBiaXRzCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgIGlmIG5vbi1uZWdhdGl2ZSwgaW5kaWNhdGVzIHRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIGl0ZW0KLSAgICAgKiAgICAgICAgICAgaW50byBpdHMgcGFyZW50Ci0gICAgICogQHJldHVybiB0aGUgbmV3bHktY3JlYXRlZCBpdGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEl0ZW0gbmV3SXRlbShXaWRnZXQgcGFyZW50LCBpbnQgc3R5bGUsIGludCBpbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBlbGVtZW50cyBmcm9tIHRoaXMgdmlld2VyLiBUaGUgc2VsZWN0aW9uIGlzIHVwZGF0ZWQgaWYKLSAgICAgKiByZXF1aXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIChieSB0aGUgY29udGVudCBwcm92aWRlcikgd2hlbiBlbGVtZW50cwotICAgICAqIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1vZGVsLCBpbiBvcmRlciB0byBjYXVzZSB0aGUgdmlld2VyIHRvCi0gICAgICogYWNjdXJhdGVseSByZWZsZWN0IHRoZSBtb2RlbC4gVGhpcyBtZXRob2Qgb25seSBhZmZlY3RzIHRoZSB2aWV3ZXIsIG5vdAotICAgICAqIHRoZSBtb2RlbC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnRzCi0gICAgICogICAgICAgICAgIHRoZSBlbGVtZW50cyB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoZmluYWwgT2JqZWN0W10gZWxlbWVudHMpIHsKLSAgICAgICAgYXNzZXJ0RWxlbWVudHNOb3ROdWxsKGVsZW1lbnRzKTsKLSAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgIAlyZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcHJlc2VydmluZ1NlbGVjdGlvbihuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaW50ZXJuYWxSZW1vdmUoZWxlbWVudHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBlbGVtZW50IGZyb20gdGhlIHZpZXdlci4gVGhlIHNlbGVjdGlvbiBpcyB1cGRhdGVkIGlmCi0gICAgICogbmVjZXNzYXJ5LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgKGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyKSB3aGVuIGEgc2luZ2xlCi0gICAgICogZWxlbWVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1vZGVsLCBpbiBvcmRlciB0byBjYXVzZSB0aGUgdmlld2VyIHRvCi0gICAgICogYWNjdXJhdGVseSByZWZsZWN0IHRoZSBtb2RlbC4gVGhpcyBtZXRob2Qgb25seSBhZmZlY3RzIHRoZSB2aWV3ZXIsIG5vdAotICAgICAqIHRoZSBtb2RlbC4gTm90ZSB0aGF0IHRoZXJlIGlzIGFub3RoZXIgbWV0aG9kIGZvciBlZmZpY2llbnRseSBwcm9jZXNzaW5nCi0gICAgICogdGhlIHNpbXVsdGFuZW91cyByZW1vdmFsIG9mIG11bHRpcGxlIGVsZW1lbnRzLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqICAgICAgICAgICB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZW1vdmUobmV3IE9iamVjdFtdIHsgZWxlbWVudCB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBpdGVtcyBmcm9tIHRoZSBnaXZlbiBjb250cm9sLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250cm9sCi0gICAgICogICAgICAgICAgIHRoZSBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVtb3ZlQWxsKENvbnRyb2wgY29udHJvbCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZm9yIGV4cGFuZCBhbmQgY29sbGFwc2UgZXZlbnRzIGluIHRoaXMgdmlld2VyLiBIYXMgbm8KLSAgICAgKiBhZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lcgotICAgICAqICAgICAgICAgICBhIHRyZWUgdmlld2VyIGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlVHJlZUxpc3RlbmVyKElUcmVlVmlld2VyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgdHJlZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgcmV2ZWFsKCkgcmV2ZWFscyB0aGUgZ2l2ZW4gZWxlbWVudCBvciB0cmVlIHBhdGguCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmV2ZWFsKE9iamVjdCBlbGVtZW50T3JUcmVlUGF0aCkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGVsZW1lbnRPclRyZWVQYXRoKTsKLSAgICAgICAgV2lkZ2V0IHcgPSBpbnRlcm5hbEV4cGFuZChlbGVtZW50T3JUcmVlUGF0aCwgdHJ1ZSk7Ci0gICAgICAgIGlmICh3IGluc3RhbmNlb2YgSXRlbSkKLSAgICAgICAgICAgIHNob3dJdGVtKChJdGVtKSB3KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByaWdodG1vc3QgdmlzaWJsZSBkZXNjZW5kZW50IG9mIHRoZSBnaXZlbiBpdGVtLiBSZXR1cm5zIHRoZQotICAgICAqIGl0ZW0gaXRzZWxmIGlmIGl0IGhhcyBubyBjaGlsZHJlbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlbQotICAgICAqICAgICAgICAgICB0aGUgaXRlbSB0byBjb21wdXRlIHRoZSBkZXNjZW5kZW50IG9mCi0gICAgICogQHJldHVybiB0aGUgcmlnaHRtb3N0IHZpc2libGUgZGVzY2VuZGVudCBvciB0aGUgaXRlbSBpc2VsZiBpZiBpdCBoYXMgbm8KLSAgICAgKiAgICAgICAgIGNoaWxkcmVuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJdGVtIHJpZ2h0TW9zdFZpc2libGVEZXNjZW5kZW50KEl0ZW0gaXRlbSkgewotICAgICAgICBJdGVtW10gY2hpbGRyZW4gPSBnZXRJdGVtcyhpdGVtKTsKLSAgICAgICAgaWYgKGdldEV4cGFuZGVkKGl0ZW0pICYmIGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHJpZ2h0TW9zdFZpc2libGVEZXNjZW5kZW50KGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXIuICovCi0gICAgcHVibGljIEl0ZW0gc2Nyb2xsRG93bihpbnQgeCwgaW50IHkpIHsKLSAgICAgICAgSXRlbSBjdXJyZW50ID0gZ2V0SXRlbSh4LCB5KTsKLSAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlbSBuZXh0ID0gZ2V0TmV4dEl0ZW0oY3VycmVudCwgdHJ1ZSk7Ci0gICAgICAgICAgICBzaG93SXRlbShuZXh0ID09IG51bGwgPyBjdXJyZW50IDogbmV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXIuICovCi0gICAgcHVibGljIEl0ZW0gc2Nyb2xsVXAoaW50IHgsIGludCB5KSB7Ci0gICAgICAgIEl0ZW0gY3VycmVudCA9IGdldEl0ZW0oeCwgeSk7Ci0gICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZW0gcHJldmlvdXMgPSBnZXRQcmV2aW91c0l0ZW0oY3VycmVudCk7Ci0gICAgICAgICAgICBzaG93SXRlbShwcmV2aW91cyA9PSBudWxsID8gY3VycmVudCA6IHByZXZpb3VzKTsKLSAgICAgICAgICAgIHJldHVybiBwcmV2aW91czsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhdXRvLWV4cGFuZCBsZXZlbC4gVGhlIHZhbHVlIDAgbWVhbnMgdGhhdCB0aGVyZSBpcyBubwotICAgICAqIGF1dG8tZXhwYW5kOyAxIG1lYW5zIHRoYXQgdG9wLWxldmVsIGVsZW1lbnRzIGFyZSBleHBhbmRlZCwgYnV0IG5vdCB0aGVpcgotICAgICAqIGNoaWxkcmVuOyAyIG1lYW5zIHRoYXQgdG9wLWxldmVsIGVsZW1lbnRzIGFyZSBleHBhbmRlZCwgYW5kIHRoZWlyCi0gICAgICogY2hpbGRyZW4sIGJ1dCBub3QgZ3JhbmRjaGlsZHJlbjsgYW5kIHNvIG9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSA8Y29kZT5BTExfTEVWRUxTPC9jb2RlPiBtZWFucyB0aGF0IGFsbCBzdWJ0cmVlcyBzaG91bGQgYmUKLSAgICAgKiBleHBhbmRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGxldmVsCi0gICAgICogICAgICAgICAgIG5vbi1uZWdhdGl2ZSBsZXZlbCwgb3IgPGNvZGU+QUxMX0xFVkVMUzwvY29kZT4gdG8gZXhwYW5kIGFsbAotICAgICAqICAgICAgICAgICBsZXZlbHMgb2YgdGhlIHRyZWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRXhwYW5kTGV2ZWwoaW50IGxldmVsKSB7Ci0gICAgICAgIGV4cGFuZFRvTGV2ZWwgPSBsZXZlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+QWJzdHJhY3RUcmVlVmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZAotICAgICAqIGNoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGUgY29udGVudCBwcm92aWRlciBpcyBhbiA8Y29kZT5JVHJlZUNvbnRlbnRQcm92aWRlcjwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAJLy8gdGhlIGFjdHVhbCBjaGVjayBpcyBpbiBhc3NlcnRDb250ZW50UHJvdmlkZXJUeXBlCi0gICAgICAgIHN1cGVyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCB2b2lkIGFzc2VydENvbnRlbnRQcm92aWRlclR5cGUoSUNvbnRlbnRQcm92aWRlciBwcm92aWRlcikgewotCQlBc3NlcnQuaXNUcnVlKHByb3ZpZGVyIGluc3RhbmNlb2YgSVRyZWVDb250ZW50UHJvdmlkZXIpOwotCX0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV4cGFuZCBzdGF0ZSBvZiB0aGUgZ2l2ZW4gaXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlbQotICAgICAqICAgICAgICAgICB0aGUgaXRlbQotICAgICAqIEBwYXJhbSBleHBhbmQKLSAgICAgKiAgICAgICAgICAgdGhlIGV4cGFuZCBzdGF0ZSBvZiB0aGUgaXRlbQotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldEV4cGFuZGVkKEl0ZW0gaXRlbSwgYm9vbGVhbiBleHBhbmQpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGljaCBub2RlcyBhcmUgZXhwYW5kZWQgaW4gdGhpcyB2aWV3ZXIncyB0cmVlLiBUaGUgZ2l2ZW4gbGlzdAotICAgICAqIGNvbnRhaW5zIHRoZSBlbGVtZW50cyB0aGF0IGFyZSB0byBiZSBleHBhbmRlZDsgYWxsIG90aGVyIG5vZGVzIGFyZSB0byBiZQotICAgICAqIGNvbGxhcHNlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHJlc3RvcmluZyB0aGUgaW50ZXJlc3Rpbmcgc3RhdGUgb2YgYQotICAgICAqIHZpZXdlciBjYXB0dXJlZCBieSBhbiBlYXJsaWVyIGNhbGwgdG8gPGNvZGU+Z2V0RXhwYW5kZWRFbGVtZW50czwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50cwotICAgICAqICAgICAgICAgICB0aGUgYXJyYXkgb2YgZXhwYW5kZWQgZWxlbWVudHMKLSAgICAgKiBAc2VlICNnZXRFeHBhbmRlZEVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhwYW5kZWRFbGVtZW50cyhPYmplY3RbXSBlbGVtZW50cykgewotICAgICAgICBhc3NlcnRFbGVtZW50c05vdE51bGwoZWxlbWVudHMpOwotICAgICAgICBDdXN0b21IYXNodGFibGUgZXhwYW5kZWRFbGVtZW50cyA9IG5ld0hhc2h0YWJsZShlbGVtZW50cy5sZW5ndGggKiAyICsgMSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICAvLyBFbnN1cmUgaXRlbSBleGlzdHMgZm9yIGVsZW1lbnQuIFRoaXMgd2lsbCBtYXRlcmlhbGl6ZSBpdGVtcyBmb3IKLSAgICAgICAgICAgIC8vIGVhY2ggZWxlbWVudCBhbmQgdGhlaXIgcGFyZW50cywgaWYgcG9zc2libGUuIFRoaXMgaXMgaW1wb3J0YW50Ci0gICAgICAgICAgICAvLyB0byBzdXBwb3J0IGV4cGFuZGluZyBvZiBpbm5lciB0cmVlIG5vZGVzIHdpdGhvdXQgbmVjZXNzYXJpbHkKLSAgICAgICAgICAgIC8vIGV4cGFuZGluZyB0aGVpciBwYXJlbnRzLgotICAgICAgICAgICAgaW50ZXJuYWxFeHBhbmQoZWxlbWVudCwgZmFsc2UpOwotICAgICAgICAgICAgZXhwYW5kZWRFbGVtZW50cy5wdXQoZWxlbWVudCwgZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdGhpcyB3aWxsIHRyYXZlcnNlIGFsbCBleGlzdGluZyBpdGVtcywgYW5kIGNyZWF0ZSBjaGlsZHJlbiBmb3IKLSAgICAgICAgLy8gZWxlbWVudHMgdGhhdCBuZWVkIHRvIGJlIGV4cGFuZGVkLiBJZiB0aGUgdHJlZSBjb250YWlucyBtdWx0aXBsZQotICAgICAgICAvLyBlcXVhbCBlbGVtZW50cywgYW5kIHRob3NlIGFyZSBpbiB0aGUgc2V0IG9mIGVsZW1lbnRzIHRvIGJlIGV4cGFuZGVkLAotICAgICAgICAvLyBvbmx5IHRoZSBmaXJzdCBpdGVtIGZvdW5kIGZvciBlYWNoIGVsZW1lbnQgd2lsbCBiZSBleHBhbmRlZC4KLSAgICAgICAgaW50ZXJuYWxTZXRFeHBhbmRlZChleHBhbmRlZEVsZW1lbnRzLCBnZXRDb250cm9sKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hpY2ggbm9kZXMgYXJlIGV4cGFuZGVkIGluIHRoaXMgdmlld2VyJ3MgdHJlZS4gVGhlIGdpdmVuIGxpc3QKLSAgICAgKiBjb250YWlucyB0aGUgdHJlZSBwYXRocyB0aGF0IGFyZSB0byBiZSBleHBhbmRlZDsgYWxsIG90aGVyIG5vZGVzIGFyZSB0bwotICAgICAqIGJlIGNvbGxhcHNlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHJlc3RvcmluZyB0aGUgaW50ZXJlc3Rpbmcgc3RhdGUgb2YgYQotICAgICAqIHZpZXdlciBjYXB0dXJlZCBieSBhbiBlYXJsaWVyIGNhbGwgdG8gPGNvZGU+Z2V0RXhwYW5kZWRUcmVlUGF0aHM8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJlZVBhdGhzCi0gICAgICogICAgICAgICAgIHRoZSBhcnJheSBvZiBleHBhbmRlZCB0cmVlIHBhdGhzCi0gICAgICogQHNlZSAjZ2V0RXhwYW5kZWRUcmVlUGF0aHMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4cGFuZGVkVHJlZVBhdGhzKFRyZWVQYXRoW10gdHJlZVBhdGhzKSB7Ci0gICAgICAgIGFzc2VydEVsZW1lbnRzTm90TnVsbCh0cmVlUGF0aHMpOwotICAgICAgICBmaW5hbCBJRWxlbWVudENvbXBhcmVyIGNvbXBhcmVyID0gZ2V0Q29tcGFyZXIoKTsKLSAgICAgICAgSUVsZW1lbnRDb21wYXJlciB0cmVlUGF0aENvbXBhcmVyID0gbmV3IElFbGVtZW50Q29tcGFyZXIoKXsKLQotCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCXJldHVybiAoKFRyZWVQYXRoKWEpLmVxdWFscygoKFRyZWVQYXRoKWIpLCBjb21wYXJlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgaGFzaENvZGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChUcmVlUGF0aCllbGVtZW50KS5oYXNoQ29kZShjb21wYXJlcik7Ci0JCQl9fTsKLSAgICAgICAgQ3VzdG9tSGFzaHRhYmxlIGV4cGFuZGVkVHJlZVBhdGhzID0gbmV3IEN1c3RvbUhhc2h0YWJsZSh0cmVlUGF0aHMubGVuZ3RoICogMiArIDEsIHRyZWVQYXRoQ29tcGFyZXIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyZWVQYXRocy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgVHJlZVBhdGggdHJlZVBhdGggPSB0cmVlUGF0aHNbaV07Ci0gICAgICAgICAgICAvLyBFbnN1cmUgaXRlbSBleGlzdHMgZm9yIGVsZW1lbnQuIFRoaXMgd2lsbCBtYXRlcmlhbGl6ZSBpdGVtcyBmb3IKLSAgICAgICAgICAgIC8vIGVhY2ggZWxlbWVudCBhbmQgdGhlaXIgcGFyZW50cywgaWYgcG9zc2libGUuIFRoaXMgaXMgaW1wb3J0YW50Ci0gICAgICAgICAgICAvLyB0byBzdXBwb3J0IGV4cGFuZGluZyBvZiBpbm5lciB0cmVlIG5vZGVzIHdpdGhvdXQgbmVjZXNzYXJpbHkKLSAgICAgICAgICAgIC8vIGV4cGFuZGluZyB0aGVpciBwYXJlbnRzLgotICAgICAgICAgICAgaW50ZXJuYWxFeHBhbmQodHJlZVBhdGgsIGZhbHNlKTsKLSAgICAgICAgICAgIGV4cGFuZGVkVHJlZVBhdGhzLnB1dCh0cmVlUGF0aCwgdHJlZVBhdGgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHRoaXMgd2lsbCB0cmF2ZXJzZSBhbGwgZXhpc3RpbmcgaXRlbXMsIGFuZCBjcmVhdGUgY2hpbGRyZW4gZm9yCi0gICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgbmVlZCB0byBiZSBleHBhbmRlZC4gSWYgdGhlIHRyZWUgY29udGFpbnMgbXVsdGlwbGUKLSAgICAgICAgLy8gZXF1YWwgZWxlbWVudHMsIGFuZCB0aG9zZSBhcmUgaW4gdGhlIHNldCBvZiBlbGVtZW50cyB0byBiZSBleHBhbmRlZCwKLSAgICAgICAgLy8gb25seSB0aGUgZmlyc3QgaXRlbSBmb3VuZCBmb3IgZWFjaCBlbGVtZW50IHdpbGwgYmUgZXhwYW5kZWQuCi0gICAgICAgIGludGVybmFsU2V0RXhwYW5kZWRUcmVlUGF0aHMoZXhwYW5kZWRUcmVlUGF0aHMsIGdldENvbnRyb2woKSwgbmV3IFRyZWVQYXRoKG5ldyBPYmplY3RbMF0pKTsKLSAgICB9Ci0KLQkvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIG5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZWxlbWVudCBvciB0cmVlIHBhdGggaXMgZXhwYW5kZWQgb3IKLSAgICAgKiBjb2xsYXBzZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnRPclRyZWVQYXRoCi0gICAgICogICAgICAgICAgIHRoZSBlbGVtZW50Ci0gICAgICogQHBhcmFtIGV4cGFuZGVkCi0gICAgICogICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBub2RlIGlzIGV4cGFuZGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICAgIGlmIGNvbGxhcHNlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4cGFuZGVkU3RhdGUoT2JqZWN0IGVsZW1lbnRPclRyZWVQYXRoLCBib29sZWFuIGV4cGFuZGVkKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoZWxlbWVudE9yVHJlZVBhdGgpOwotICAgICAgICBXaWRnZXQgaXRlbSA9IGludGVybmFsRXhwYW5kKGVsZW1lbnRPclRyZWVQYXRoLCBmYWxzZSk7Ci0gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgSXRlbSkgewotICAgICAgICAgICAgaWYgKGV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgY3JlYXRlQ2hpbGRyZW4oaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRFeHBhbmRlZCgoSXRlbSkgaXRlbSwgZXhwYW5kZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2VsZWN0aW9uIHRvIHRoZSBnaXZlbiBsaXN0IG9mIGl0ZW1zLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpdGVtcwotICAgICAqICAgICAgICAgICBsaXN0IG9mIGl0ZW1zIChlbGVtZW50IHR5cGU6IDxjb2RlPm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW08L2NvZGU+KQotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFNlbGVjdGlvbihMaXN0IGl0ZW1zKTsKLQotICAgIC8qKgotICAgICAqICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHNldFNlbGVjdGlvblRvV2lkZ2V0IGFjY2VwdHMgYSBsaXN0IG9mIGVsZW1lbnRzCi0gICAgICogIG9yIGEgbGlzdCBvZiB0cmVlIHBhdGhzLgotICAgICAqKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3Rpb25Ub1dpZGdldChMaXN0IHYsIGJvb2xlYW4gcmV2ZWFsKSB7Ci0gICAgICAgIGlmICh2ID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvbihuZXcgQXJyYXlMaXN0KDApKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnQgc2l6ZSA9IHYuc2l6ZSgpOwotICAgICAgICBMaXN0IG5ld1NlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAvLyBVc2UgaW50ZXJuYWxFeHBhbmQgc2luY2UgaXRlbSBtYXkgbm90IHlldCBiZSBjcmVhdGVkLiBTZWUKLSAgICAgICAgICAgIC8vIDFHNkIxQVIuCi0gICAgICAgICAgICBXaWRnZXQgdyA9IGludGVybmFsRXhwYW5kKHYuZ2V0KGkpLCBmYWxzZSk7Ci0gICAgICAgICAgICBpZiAodyBpbnN0YW5jZW9mIEl0ZW0pIHsKLSAgICAgICAgICAgICAgICBuZXdTZWxlY3Rpb24uYWRkKHcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pOwotICAgICAgICAKLSAgICAgICAgLy8gQWx0aG91Z2ggc2V0dGluZyB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250cm9sIHNob3VsZCByZXZlYWwgaXQsCi0gICAgICAgIC8vIHNldFNlbGVjdGlvbiBtYXkgYmUgYSBuby1vcCBpZiB0aGUgc2VsZWN0aW9uIGlzIHVuY2hhbmdlZCwKLSAgICAgICAgLy8gc28gZXhwbGljaXRseSByZXZlYWwgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHNlbGVjdGlvbiBoZXJlLgotICAgICAgICAvLyBTZWUgYnVnIDEwMDU2NSBmb3IgbW9yZSBkZXRhaWxzLgotICAgICAgICBpZiAocmV2ZWFsICYmIG5ld1NlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBzaG93SXRlbSgoSXRlbSkgbmV3U2VsZWN0aW9uLmdldCgwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93cyB0aGUgZ2l2ZW4gaXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlbQotICAgICAqICAgICAgICAgICB0aGUgaXRlbQotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNob3dJdGVtKEl0ZW0gaXRlbSk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB0cmVlIGl0ZW1zIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBnaXZlbgotICAgICAqIHBhcmVudCBlbGVtZW50LiBJZiBudWxsIGlzIHBhc3NlZCBmb3IgdGhlIGNoaWxkcmVuLCB0aGlzIG1ldGhvZCBvYnRhaW5zCi0gICAgICogdGhlbSAob25seSBpZiBuZWVkZWQpLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3aWRnZXQKLSAgICAgKiAgICAgICAgICAgdGhlIHdpZGdldAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgdGhlIHBhcmVudCBlbGVtZW50Ci0gICAgICogQHBhcmFtIGVsZW1lbnRDaGlsZHJlbgotICAgICAqICAgICAgICAgICB0aGUgY2hpbGQgZWxlbWVudHMsIG9yIG51bGwKLSAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIGlzIG5vIGxvbmdlciBjYWxsZWQgYnkgdGhlIGZyYW1ld29yawotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNoaWxkcmVuKFdpZGdldCB3aWRnZXQsIE9iamVjdCBwYXJlbnQsCi0gICAgICAgICAgICBPYmplY3RbXSBlbGVtZW50Q2hpbGRyZW4pIHsKLSAgICAgICAgdXBkYXRlQ2hpbGRyZW4od2lkZ2V0LCBwYXJlbnQsIGVsZW1lbnRDaGlsZHJlbiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdHJlZSBpdGVtcyB0byBjb3JyZXNwb25kIHRvIHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4KLSAgICAgKiBwYXJlbnQgZWxlbWVudC4gSWYgbnVsbCBpcyBwYXNzZWQgZm9yIHRoZSBjaGlsZHJlbiwgdGhpcyBtZXRob2Qgb2J0YWlucwotICAgICAqIHRoZW0gKG9ubHkgaWYgbmVlZGVkKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkZ2V0Ci0gICAgICogICAgICAgICAgIHRoZSB3aWRnZXQKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgIHRoZSBwYXJlbnQgZWxlbWVudAotICAgICAqIEBwYXJhbSBlbGVtZW50Q2hpbGRyZW4KLSAgICAgKiAgICAgICAgICAgdGhlIGNoaWxkIGVsZW1lbnRzLCBvciBudWxsCi0gICAgICogQHBhcmFtIHVwZGF0ZUxhYmVscwotICAgICAqICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byB1cGRhdGUgbGFiZWxzIGZvciBleGlzdGluZyBlbGVtZW50cywKLSAgICAgKiAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG9ubHkgdXBkYXRlIGxhYmVscyBhcyBuZWVkZWQsIGFzc3VtaW5nCi0gICAgICogICAgICAgICAgIHRoYXQgbGFiZWxzIGZvciBleGlzdGluZyBlbGVtZW50cyBhcmUgdW5jaGFuZ2VkLgotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ2hpbGRyZW4oV2lkZ2V0IHdpZGdldCwgT2JqZWN0IHBhcmVudCwKLSAgICAgICAgICAgIE9iamVjdFtdIGVsZW1lbnRDaGlsZHJlbiwgYm9vbGVhbiB1cGRhdGVMYWJlbHMpIHsKLSAgICAgICAgLy8gb3B0aW1pemF0aW9uISBwcnVuZSBjb2xsYXBzZWQgc3VidHJlZXMKLSAgICAgICAgaWYgKHdpZGdldCBpbnN0YW5jZW9mIEl0ZW0pIHsKLSAgICAgICAgICAgIEl0ZW0gdGkgPSAoSXRlbSkgd2lkZ2V0OwotICAgICAgICAgICAgaWYgKCFnZXRFeHBhbmRlZCh0aSkpIHsKLSAgICAgICAgICAgICAgICAvLyBuZWVkIGEgZHVtbXkgbm9kZSBpZiBlbGVtZW50IGlzIGV4cGFuZGFibGU7Ci0gICAgICAgICAgICAgICAgLy8gYnV0IHRyeSB0byBhdm9pZCByZWNyZWF0aW5nIHRoZSBkdW1teSBub2RlCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkRHVtbXkgPSBpc0V4cGFuZGFibGUocGFyZW50KTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGhhdmVEdW1teSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgY2hpbGRyZW4KLSAgICAgICAgICAgICAgICBJdGVtW10gaXRlbXMgPSBnZXRJdGVtcyh0aSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbXNbaV0uZ2V0RGF0YSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Fzc29jaWF0ZShpdGVtc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZER1bW15ICYmICFoYXZlRHVtbXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlRHVtbXkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWREdW1teSAmJiAhaGF2ZUR1bW15KSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0odGksIFNXVC5OVUxMLCAtMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIGNoaWxkcmVuIHdlcmVuJ3QgcGFzc2VkIGluLCBnZXQgdGhlbSBub3cgc2luY2UgdGhleSdyZSBuZWVkZWQKLSAgICAgICAgLy8gYmVsb3cuCi0gICAgICAgIGlmIChlbGVtZW50Q2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgZWxlbWVudENoaWxkcmVuID0gZ2V0U29ydGVkQ2hpbGRyZW4ocGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRyb2wgdHJlZSA9IGdldENvbnRyb2woKTsKLQotICAgICAgICAvLyBXT1JLQVJPVU5ECi0gICAgICAgIGludCBvbGRDbnQgPSAtMTsKLSAgICAgICAgaWYgKHdpZGdldCA9PSB0cmVlKQotICAgICAgICAgICAgb2xkQ250ID0gZ2V0SXRlbUNvdW50KHRyZWUpOwotCi0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IGdldENoaWxkcmVuKHdpZGdldCk7Ci0KLSAgICAgICAgLy8gc2F2ZSB0aGUgZXhwYW5kZWQgZWxlbWVudHMKLSAgICAgICAgQ3VzdG9tSGFzaHRhYmxlIGV4cGFuZGVkID0gbmV3SGFzaHRhYmxlKEN1c3RvbUhhc2h0YWJsZS5ERUZBVUxUX0NBUEFDSVRZKTsgLy8gYXNzdW1lIG51bSBleHBhbmRlZCBpcyBzbWFsbAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0RXhwYW5kZWQoaXRlbXNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBpdGVtc1tpXS5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBleHBhbmRlZC5wdXQoZWxlbWVudCwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKGVsZW1lbnRDaGlsZHJlbi5sZW5ndGgsIGl0ZW1zLmxlbmd0aCk7Ci0KLSAgICAgICAgLy8gTm90ZTogSW4gdGhlIGNvZGUgYmVsb3csIGRvaW5nIGRpc2Fzc29jaWF0ZSBjYWxscyBiZWZvcmUgYXNzb2NpYXRlCi0gICAgICAgIC8vIGNhbGxzIGlzIGltcG9ydGFudCwKLSAgICAgICAgLy8gc2luY2UgYSBsYXRlciBkaXNhc3NvY2lhdGUgY2FuIHVuZG8gYW4gZWFybGllciBhc3NvY2lhdGUsCi0gICAgICAgIC8vIGlmIGl0ZW1zIGFyZSBjaGFuZ2luZyBwb3NpdGlvbi4KLQotICAgICAgICAvLyBkaXNwb3NlIG9mIGFsbCBpdGVtcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBlbGVtZW50cwotICAgICAgICBmb3IgKGludCBpID0gaXRlbXMubGVuZ3RoOyAtLWkgPj0gbWluOykgewotICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLmdldERhdGEoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGlzYXNzb2NpYXRlKGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ZW1zW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbXBhcmUgZmlyc3QgbWluIGl0ZW1zLCBhbmQgdXBkYXRlIGl0ZW0gaWYgbmVjZXNzYXJ5Ci0gICAgICAgIC8vIG5lZWQgdG8gZG8gaXQgaW4gdHdvIHBhc3NlczoKLSAgICAgICAgLy8gMTogZGlzYXNzb2NpYXRlIG9sZCBpdGVtcwotICAgICAgICAvLyAyOiBhc3NvY2lhdGUgbmV3IGl0ZW1zCi0gICAgICAgIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIGEgbGF0ZXIgZGlzYXNzb2NpYXRlIGNhbiByZW1vdmUgYSBtYXBwaW5nIG1hZGUgZm9yCi0gICAgICAgIC8vIGEgcHJldmlvdXMgYXNzb2NpYXRlLAotICAgICAgICAvLyBtYWtpbmcgdGhlIG1hcCBpbmNvbnNpc3RlbnQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW47ICsraSkgewotICAgICAgICAgICAgSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICBPYmplY3Qgb2xkRWxlbWVudCA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgaWYgKG9sZEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9iamVjdCBuZXdFbGVtZW50ID0gZWxlbWVudENoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgIGlmIChuZXdFbGVtZW50ICE9IG9sZEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVxdWFscyhuZXdFbGVtZW50LCBvbGRFbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBkYXRhIHRvIGJlIHRoZSBuZXcgZWxlbWVudCwgc2luY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsdGhvdWdoIHRoZSBlbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGJlIGVxdWFsLCB0aGV5IG1heSBzdGlsbCBoYXZlIGRpZmZlcmVudCBsYWJlbHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGNoaWxkcmVuCi0gICAgICAgICAgICAgICAgICAgIAlPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAJaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAJCXVubWFwRWxlbWVudChkYXRhLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0RGF0YShuZXdFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcEVsZW1lbnQobmV3RWxlbWVudCwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNhc3NvY2lhdGUoaXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0NsZWFyIHRoZSB0ZXh0IGFuZCBpbWFnZSB0byBmb3JjZSBhIGxhYmVsIHVwZGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRJbWFnZShudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW47ICsraSkgewotICAgICAgICAgICAgSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICBPYmplY3QgbmV3RWxlbWVudCA9IGVsZW1lbnRDaGlsZHJlbltpXTsKLSAgICAgICAgICAgIGlmIChpdGVtLmdldERhdGEoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gb2xkIGFuZCBuZXcgZWxlbWVudHMgYXJlIG5vdCBlcXVhbAotICAgICAgICAgICAgICAgIGFzc29jaWF0ZShuZXdFbGVtZW50LCBpdGVtKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQbHVzKGl0ZW0sIG5ld0VsZW1lbnQpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaXRlbSwgbmV3RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBleHBhbmRlZCBzdGF0ZSBmb3IgaXRlbXMgdGhhdCBjaGFuZ2VkIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzZXRFeHBhbmRlZCBpcyBjYWxsZWQgYWZ0ZXIgdXBkYXRlUGx1cywgc2luY2UKLSAgICAgICAgICAgICAgICAvLyBzZXRFeHBhbmRlZChmYWxzZSkgZmFpbHMgaWYgaXRlbSBoYXMgbm8gY2hpbGRyZW4uCi0gICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjYWxsIHNldEV4cGFuZGVkIGZvciBib3RoIGV4cGFuZGVkIGFuZCB1bmV4cGFuZGVkCi0gICAgICAgICAgICAgICAgLy8gY2FzZXMKLSAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgZXhwYW5kZWQgc3RhdGUgY2FuIGNoYW5nZSBlaXRoZXIgd2F5LgotICAgICAgICAgICAgICAgIHNldEV4cGFuZGVkKGl0ZW0sIGV4cGFuZGVkLmNvbnRhaW5zS2V5KG5ld0VsZW1lbnQpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gb2xkIGFuZCBuZXcgZWxlbWVudHMgYXJlIGVxdWFsCi0gICAgICAgICAgICAgICAgdXBkYXRlUGx1cyhpdGVtLCBuZXdFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAodXBkYXRlTGFiZWxzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaXRlbSwgbmV3RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIGFueSByZW1haW5pbmcgZWxlbWVudHMKLSAgICAgICAgaWYgKG1pbiA8IGVsZW1lbnRDaGlsZHJlbi5sZW5ndGgpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtaW47IGkgPCBlbGVtZW50Q2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBjcmVhdGVUcmVlSXRlbSh3aWRnZXQsIGVsZW1lbnRDaGlsZHJlbltpXSwgaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5lZWQgdG8gcmVzdG9yZSBleHBhbmRlZCBzdGF0ZSBpbiBhIHNlcGFyYXRlIHBhc3MKLSAgICAgICAgICAgIC8vIGJlY2F1c2UgY3JlYXRlVHJlZUl0ZW0gZG9lcyBub3QgcmV0dXJuIHRoZSBuZXcgaXRlbS4KLSAgICAgICAgICAgIC8vIEF2b2lkIGRvaW5nIHRoaXMgdW5sZXNzIG5lZWRlZC4KLSAgICAgICAgICAgIGlmIChleHBhbmRlZC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBpdGVtcyBhZ2FpbiwgdG8gaW5jbHVkZSB0aGUgbmV3IGl0ZW1zCi0gICAgICAgICAgICAgICAgaXRlbXMgPSBnZXRDaGlsZHJlbih3aWRnZXQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtaW47IGkgPCBlbGVtZW50Q2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBleHBhbmRlZCBzdGF0ZSBmb3IgaXRlbXMgdGhhdCBjaGFuZ2VkIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgc2V0RXhwYW5kZWQgaXMgY2FsbGVkIGFmdGVyIHVwZGF0ZVBsdXMgKGNhbGxlZAotICAgICAgICAgICAgICAgICAgICAvLyBpbiBjcmVhdGVUcmVlSXRlbSksIHNpbmNlCi0gICAgICAgICAgICAgICAgICAgIC8vIHNldEV4cGFuZGVkKGZhbHNlKSBmYWlscyBpZiBpdGVtIGhhcyBubyBjaGlsZHJlbi4KLSAgICAgICAgICAgICAgICAgICAgLy8gT25seSBuZWVkIHRvIGNhbGwgc2V0RXhwYW5kZWQgaWYgZWxlbWVudCB3YXMgZXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgbmV3IGl0ZW1zIGFyZSBpbml0aWFsbHkgdW5leHBhbmRlZC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGFuZGVkLmNvbnRhaW5zS2V5KGVsZW1lbnRDaGlsZHJlbltpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEV4cGFuZGVkKGl0ZW1zW2ldLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdPUktBUk9VTkQKLSAgICAgICAgaWYgKHdpZGdldCA9PSB0cmVlICYmIG9sZENudCA9PSAwICYmIGdldEl0ZW1Db3VudCh0cmVlKSAhPSAwKSB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiV09SS0FST1VORCBzZXRSZWRyYXciKTsKLSAgICAgICAgICAgIHRyZWUuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgICAgIHRyZWUuc2V0UmVkcmF3KHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgIisiLyItIiBpY29uIG9mIHRoZSB0cmVlIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudC4gSXQKLSAgICAgKiBjYWxscyA8Y29kZT5pc0V4cGFuZGFibGU8L2NvZGU+IHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGVsZW1lbnQgaXMKLSAgICAgKiBleHBhbmRhYmxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpdGVtCi0gICAgICogICAgICAgICAgIHRoZSBpdGVtCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiAgICAgICAgICAgdGhlIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQbHVzKEl0ZW0gaXRlbSwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgYm9vbGVhbiBoYXNQbHVzID0gZ2V0SXRlbUNvdW50KGl0ZW0pID4gMDsKLSAgICAgICAgYm9vbGVhbiBuZWVkc1BsdXMgPSBpc0V4cGFuZGFibGUoZWxlbWVudCk7Ci0gICAgICAgIGJvb2xlYW4gcmVtb3ZlQWxsID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYWRkRHVtbXkgPSBmYWxzZTsKLSAgICAgICAgT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBlcXVhbHMoZWxlbWVudCwgZGF0YSkpIHsKLSAgICAgICAgICAgIC8vIGl0ZW0gc2hvd3Mgc2FtZSBlbGVtZW50Ci0gICAgICAgICAgICBpZiAoaGFzUGx1cyAhPSBuZWVkc1BsdXMpIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZHNQbHVzKQotICAgICAgICAgICAgICAgICAgICBhZGREdW1teSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZW1vdmVBbGwgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaXRlbSBzaG93cyBkaWZmZXJlbnQgZWxlbWVudAotICAgICAgICAgICAgcmVtb3ZlQWxsID0gdHJ1ZTsKLSAgICAgICAgICAgIGFkZER1bW15ID0gbmVlZHNQbHVzOwotCi0gICAgICAgICAgICAvLyB3ZSBjYW5ub3QgbWFpbnRhaW4gZXhwYW5kIHN0YXRlIHNvIGNvbGxhcHNlIGl0Ci0gICAgICAgICAgICBzZXRFeHBhbmRlZChpdGVtLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlbW92ZUFsbCkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCBjaGlsZHJlbgotICAgICAgICAgICAgSXRlbVtdIGl0ZW1zID0gZ2V0SXRlbXMoaXRlbSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLmdldERhdGEoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkaXNhc3NvY2lhdGUoaXRlbXNbaV0pOwotICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYWRkRHVtbXkpCi0gICAgICAgICAgICBuZXdJdGVtKGl0ZW0sIFNXVC5OVUxMLCAtMSk7IC8vIGFwcGVuZCBhIGR1bW15Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZXhwYW5kZWQgZWxlbWVudHMgdGhhdCBhcmUgdmlzaWJsZSB0byB0aGUgdXNlci4gQW4gZXhwYW5kZWQKLSAgICAgKiBlbGVtZW50IGlzIG9ubHkgdmlzaWJsZSBpZiB0aGUgcGFyZW50IGlzIGV4cGFuZGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZpc2libGUgZXhwYW5kZWQgZWxlbWVudHMKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldFZpc2libGVFeHBhbmRlZEVsZW1lbnRzKCkgewotICAgICAgICBBcnJheUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW50ZXJuYWxDb2xsZWN0VmlzaWJsZUV4cGFuZGVkKHYsIGdldENvbnRyb2woKSk7Ci0gICAgICAgIHJldHVybiB2LnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW50ZXJuYWxDb2xsZWN0VmlzaWJsZUV4cGFuZGVkKEFycmF5TGlzdCByZXN1bHQsIFdpZGdldCB3aWRnZXQpIHsKLSAgICAgICAgSXRlbVtdIGl0ZW1zID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICBpZiAoZ2V0RXhwYW5kZWQoaXRlbSkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZGF0YSk7Ci0gICAgICAgICAgICAgICAgLy9Pbmx5IHJlY3Vyc2UgaWYgaXQgaXMgZXhwYW5kZWQgLSBpZgotICAgICAgICAgICAgICAgIC8vbm90IHRoZW4gdGhlIGNoaWxkcmVuIGFyZW4ndCB2aXNpYmxlCi0gICAgICAgICAgICAgICAgaW50ZXJuYWxDb2xsZWN0VmlzaWJsZUV4cGFuZGVkKHJlc3VsdCwgaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVHJlZVBhdGggZ2V0VHJlZVBhdGhGcm9tSXRlbShJdGVtIGl0ZW0pIHsKLQkJTGlua2VkTGlzdCBzZWdtZW50cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXdoaWxlKGl0ZW0hPW51bGwpIHsKLQkJCU9iamVjdCBzZWdtZW50ID0gaXRlbS5nZXREYXRhKCk7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKHNlZ21lbnQpOwotCQkJc2VnbWVudHMuYWRkRmlyc3Qoc2VnbWVudCk7Ci0JCQlpdGVtID0gZ2V0UGFyZW50SXRlbShpdGVtKTsKLQkJfQotCQlyZXR1cm4gbmV3IFRyZWVQYXRoKHNlZ21lbnRzLnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBnZXRTZWxlY3Rpb24oKSByZXR1cm5zIGFuIGluc3RhbmNlIG9mCi0JICogSVRyZWVTZWxlY3Rpb24uCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJQ29udHJvbCBjb250cm9sID0gZ2V0Q29udHJvbCgpOwotCQlpZiAoY29udHJvbCA9PSBudWxsIHx8IGNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gVHJlZVNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCQlXaWRnZXRbXSBpdGVtcyA9IGdldFNlbGVjdGlvbihnZXRDb250cm9sKCkpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoaXRlbXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJV2lkZ2V0IGl0ZW0gPSBpdGVtc1tpXTsKLQkJCWlmIChpdGVtLmdldERhdGEoKSAhPSBudWxsKSB7Ci0JCQkJbGlzdC5hZGQoZ2V0VHJlZVBhdGhGcm9tSXRlbSgoSXRlbSkgaXRlbSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgVHJlZVNlbGVjdGlvbigoVHJlZVBhdGhbXSkgbGlzdC50b0FycmF5KG5ldyBUcmVlUGF0aFtsaXN0Ci0JCQkJLnNpemUoKV0pKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0aW9uVG9XaWRnZXQoSVNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gcmV2ZWFsKSB7Ci0JCWlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUcmVlU2VsZWN0aW9uKSB7Ci0JCQlJVHJlZVNlbGVjdGlvbiB0cmVlU2VsZWN0aW9uID0gKElUcmVlU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlzZXRTZWxlY3Rpb25Ub1dpZGdldChBcnJheXMuYXNMaXN0KHRyZWVTZWxlY3Rpb24uZ2V0UGF0aHMoKSksIHJldmVhbCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zZXRTZWxlY3Rpb25Ub1dpZGdldChzZWxlY3Rpb24sIHJldmVhbCk7Ci0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0cmVlIHBhdGhzIGNvcnJlc3BvbmRpbmcgdG8gZXhwYW5kZWQgbm9kZXMgaW4gdGhpcwotICAgICAqIHZpZXdlcidzIHRyZWUsIGluY2x1ZGluZyBjdXJyZW50bHkgaGlkZGVuIG9uZXMgdGhhdCBhcmUgbWFya2VkIGFzCi0gICAgICogZXhwYW5kZWQgYnV0IGFyZSB1bmRlciBhIGNvbGxhcHNlZCBhbmNlc3Rvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHByZXNlcnZpbmcgdGhlIGludGVyZXN0aW5nIHN0YXRlIG9mIGEKLSAgICAgKiB2aWV3ZXI7IDxjb2RlPnNldEV4cGFuZGVkRWxlbWVudHM8L2NvZGU+IGlzIHVzZWQgZHVyaW5nIHRoZSByZXN0b3JlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBleHBhbmRlZCB0cmVlIHBhdGhzCi0gICAgICogQHNlZSAjc2V0RXhwYW5kZWRFbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBUcmVlUGF0aFtdIGdldEV4cGFuZGVkVHJlZVBhdGhzKCkgewotICAgICAgICBBcnJheUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGludGVybmFsQ29sbGVjdEV4cGFuZGVkSXRlbXMoaXRlbXMsIGdldENvbnRyb2woKSk7Ci0gICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGl0ZW1zLnNpemUoKSk7Ci0gICAgICAgIGZvcihJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgCUl0ZW0gaXRlbSA9IChJdGVtKSBpdC5uZXh0KCk7Ci0gICAgICAgIAlUcmVlUGF0aCB0cmVlUGF0aCA9IGdldFRyZWVQYXRoRnJvbUl0ZW0oaXRlbSk7Ci0gICAgICAgIAlpZiAodHJlZVBhdGggIT0gbnVsbCkgewotICAgICAgICAJCXJlc3VsdC5hZGQodHJlZVBhdGgpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoVHJlZVBhdGhbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFRyZWVQYXRoW2l0ZW1zLnNpemUoKV0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9BY2NlcHRBbGxGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvQWNjZXB0QWxsRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOWJkODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9BY2NlcHRBbGxGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi0KLS8qKgotICogRmlsdGVyIHRoYXQgYWNjZXB0cyBldmVyeXRoaW5nLiBBdmFpbGFibGUgYXMgYSBzaW5nbGV0b24gc2luY2UgaGF2aW5nCi0gKiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIHdvdWxkIGJlIHdhc3RlZnVsLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBY2NlcHRBbGxGaWx0ZXIgaW1wbGVtZW50cyBJRmlsdGVyIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBBY2NlcHRBbGxGaWx0ZXIKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQWNjZXB0QWxsRmlsdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsdGVyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUZpbHRlciBzaW5nbGV0b24gPSBuZXcgQWNjZXB0QWxsRmlsdGVyKCk7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZC5JRmlsdGVyI3NlbGVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNlbGVjdChPYmplY3QgdG9UZXN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJcmV0dXJuIG90aGVyID09IHRoaXMgfHwgb3RoZXIgaW5zdGFuY2VvZiBBY2NlcHRBbGxGaWx0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0FycmF5Q29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0FycmF5Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTRkODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9BcnJheUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI8L2NvZGU+IGhhbmRsZXMKLSAqIHRoZSBjYXNlIHdoZXJlIHRoZSB2aWV3ZXIgaW5wdXQgaXMgYW4gdW5jaGFuZ2luZyBhcnJheSBvciBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG91dHNpZGUgdGhlIHZpZXdlciBmcmFtZXdvcmsuCi0gKiA8L3A+IAotICogCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRzIGluIHRoZSBpbnB1dCwgd2hpY2ggbXVzdCBiZSBlaXRoZXIgYW4gYXJyYXkgb3IgYQotICAgICAqIDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+LiAKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0W10pCi0gICAgICAgICAgICByZXR1cm4gKE9iamVjdFtdKSBpbnB1dEVsZW1lbnQ7Ci0gICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKQotICAgICAgICAgICAgcmV0dXJuICgoQ29sbGVjdGlvbikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAvLyBkbyBub3RoaW5nLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcuCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9DZWxsRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0NlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4YWRjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0NlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY2VsbCBlZGl0b3JzLiBJbXBsZW1lbnRzIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBoYW5kbGluZywKLSAqIGFuZCBTV1Qgd2luZG93IG1hbmFnZW1lbnQuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IHBhcnRpY3VsYXIga2luZHMgb2YgY2VsbCBlZGl0b3JzLiBUaGlzIHBhY2thZ2UgY29udGFpbnMgdmFyaW91cwotICogc3BlY2lhbGl6ZWQgY2VsbCBlZGl0b3JzOgotICogPHVsPgotICogICA8bGk+PGNvZGU+VGV4dENlbGxFZGl0b3I8L2NvZGU+IC0gZm9yIHNpbXBsZSB0ZXh0IHN0cmluZ3M8L2xpPgotICogICA8bGk+PGNvZGU+Q29sb3JDZWxsRWRpdG9yPC9jb2RlPiAtIGZvciBjb2xvcnM8L2xpPgotICogICA8bGk+PGNvZGU+Q29tYm9Cb3hDZWxsRWRpdG9yPC9jb2RlPiAtIHZhbHVlIHNlbGVjdGVkIGZyb20gZHJvcC1kb3duIGNvbWJvIGJveDwvbGk+Ci0gKiAgIDxsaT48Y29kZT5DaGVja2JveENlbGxFZGl0b3I8L2NvZGU+IC0gYm9vbGVhbiB2YWx1ZWQgY2hlY2tib3g8L2xpPgotICogICA8bGk+PGNvZGU+RGlhbG9nQ2VsbEVkaXRvcjwvY29kZT4gLSB2YWx1ZSBmcm9tIGFyYml0cmFyeSBkaWFsb2c8L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENlbGxFZGl0b3IgewotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiBjZWxsIGVkaXRvciBsaXN0ZW5lcnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+SUNlbGxFZGl0b3JMaXN0ZW5lcjwvY29kZT4pLgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIExpc3Qgb2YgY2VsbCBlZGl0b3IgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyAKLSAgICAgKiAoZWxlbWVudCB0eXBlOiA8Y29kZT5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjwvY29kZT4pLgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdGVuZXJMaXN0IHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBjZWxsIGVkaXRvcidzIGN1cnJlbnQgdmFsdWUgaXMgdmFsaWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBPcHRpb25hbCBjZWxsIGVkaXRvciB2YWxpZGF0b3I7IDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJQ2VsbEVkaXRvclZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGVycm9yIG1lc3NhZ2Ugc3RyaW5nIHRvIGRpc3BsYXkgZm9yIGludmFsaWQgdmFsdWVzOwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgKHRoYXQgaXMsIHRoZSB2YWx1ZSBpcyB2YWxpZCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgY2VsbCBlZGl0b3IgaGFzIGJlZW4gY2hhbmdlZCByZWNlbnRseS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZGlydHkgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY2VsbCBlZGl0b3IncyBjb250cm9sLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIGlmIG5vdCBjcmVhdGVkIHlldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIENvbnRyb2wgY29udHJvbCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNlbGwgZWRpdG9yIHN0eWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHRTdHlsZSA9IFNXVC5OT05FOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBjZWxsIGVkaXRvcidzIHN0eWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgc3R5bGUgPSBkZWZhdWx0U3R5bGU7Ci0KLSAgICAvKiogCi0gICAgICogU3RydWN0LWxpa2UgbGF5b3V0IGRhdGEgZm9yIGNlbGwgZWRpdG9ycywgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzCi0gICAgICogZm9yIGFsbCBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBMYXlvdXREYXRhIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEhvcml6b250YWwgYWxpZ25tZW50OyA8Y29kZT5TV1QuTEVGVDwvY29kZT4gYnkgZGVmYXVsdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbmRpY2F0ZXMgY29udHJvbCBncmFicyBhZGRpdGlvbmFsIHNwYWNlOyA8Y29kZT50cnVlPC9jb2RlPiBieSBkZWZhdWx0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBNaW5pbXVtIHdpZHRoIGluIHBpeGVsczsgPGNvZGU+NTA8L2NvZGU+IHBpeGVscyBieSBkZWZhdWx0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBtaW5pbXVtV2lkdGggPSA1MDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIGZvciB0aGUgY29weSBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZID0gImNvcHkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIGZvciB0aGUgY3V0IGFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVVCA9ICJjdXQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIGZvciB0aGUgZGVsZXRlIGFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURSA9ICJkZWxldGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIGZvciB0aGUgZmluZCBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5EID0gImZpbmQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIGZvciB0aGUgcGFzdGUgYWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTVEUgPSAicGFzdGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIGZvciB0aGUgcmVkbyBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRURPID0gInJlZG8iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIGZvciB0aGUgc2VsZWN0IGFsbCBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQUxMID0gInNlbGVjdGFsbCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFByb3BlcnR5IG5hbWUgZm9yIHRoZSB1bmRvIGFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVORE8gPSAidW5kbyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY2VsbCBlZGl0b3Igd2l0aCBubyBjb250cm9sIAotICAgICAqIFRoZSBjZWxsIGVkaXRvciBoYXMgbm8gY2VsbCB2YWxpZGF0b3IuCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBDZWxsRWRpdG9yKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY2VsbCBlZGl0b3IgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb250cm9sLgotICAgICAqIFRoZSBjZWxsIGVkaXRvciBoYXMgbm8gY2VsbCB2YWxpZGF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIGRlZmF1bHRTdHlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBjZWxsIGVkaXRvciB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRyb2wuCi0gICAgICogVGhlIGNlbGwgZWRpdG9yIGhhcyBubyBjZWxsIHZhbGlkYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBiaXRzCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7Ci0gICAgICAgIGNyZWF0ZShwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjdGl2YXRlcyB0aGlzIGNlbGwgZWRpdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZAotICAgICAqIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGlzIGNlbGwgZWRpdG9yLgotICAgICAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIGNlbGwgZWRpdG9yIGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUNlbGxFZGl0b3JMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgY2VsbCBlZGl0b3IuCi0gICAgICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIAotICAgICAqIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250cm9sIGZvciB0aGlzIGNlbGwgZWRpdG9yIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZyYW1ld29yayBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZQotICAgICAqIHN1YmNsYXNzZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY29udHJvbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBjZWxsIGVkaXRvciBoYXMgbm8gY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250cm9sIGZvciB0aGlzIGNlbGwgZWRpdG9yIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKGNvbnRyb2wgPT0gbnVsbCk7Ci0gICAgICAgIGNvbnRyb2wgPSBjcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgICAgIC8vIFNlZSAxR0Q1Q0E2OiBJVFBVSTpBTEwgLSBUYXNrVmlldy5zZXRTZWxlY3Rpb24gZG9lcyBub3Qgd29yawotICAgICAgICAvLyBDb250cm9sIGlzIGNyZWF0ZWQgd2l0aCBnZXRWaXNpYmxlKCk9PXRydWUgYnkgZGVmYXVsdC4KLSAgICAgICAgLy8gVGhpcyBjYXVzZXMgY29tcG9zaXRlLnNldEZvY3VzKCkgdG8gd29yayBpbmNvcnJlY3RseS4KLSAgICAgICAgLy8gVGhlIGNlbGwgZWRpdG9yJ3MgY29udHJvbCBncmFicyBmb2N1cyBpbnN0ZWFkLCBldmVuIGlmIGl0IGlzIG5vdCBhY3RpdmUuCi0gICAgICAgIC8vIE1ha2UgdGhlIGNvbnRyb2wgaW52aXNpYmxlIGhlcmUgYnkgZGVmYXVsdC4KLSAgICAgICAgZGVhY3RpdmF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhpZGVzIHRoaXMgY2VsbCBlZGl0b3IncyBjb250cm9sLiBEb2VzIG5vdGhpbmcgaWYgdGhpcyAKLSAgICAgKiBjZWxsIGVkaXRvciBpcyBub3QgdmlzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmICFjb250cm9sLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIGNvbnRyb2wuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcG9zZXMgb2YgdGhpcyBjZWxsIGVkaXRvciBhbmQgZnJlZXMgYW55IGFzc29jaWF0ZWQgU1dUIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmICFjb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgY29udHJvbC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbCA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIGNlbGwgZWRpdG9yJ3MgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBmcmFtZXdvcmsgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgc3ViY2xhc3Nlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIGNlbGwgZWRpdG9yCi0gICAgICogQHNlZSAjZ2V0VmFsdWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGRvR2V0VmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZvY3VzIHRvIHRoZSBjZWxsIGVkaXRvcidzIGNvbnRyb2wuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBmcmFtZXdvcmsgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgc3ViY2xhc3Nlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNzZXRGb2N1cwotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvU2V0Rm9jdXMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyBjZWxsIGVkaXRvcidzIHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZnJhbWV3b3JrIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGNvbmNyZXRlIHN1YmNsYXNzZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGlzIGNlbGwgZWRpdG9yCi0gICAgICogQHNlZSAjc2V0VmFsdWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyBhbGwgcmVnaXN0ZXJlZCBjZWxsIGVkaXRvciBsaXN0ZW5lcnMgb2YgYW4gYXBwbHkgZXZlbnQuCi0gICAgICogT25seSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgotICAgICAqCi0gICAgICogQHNlZSBJQ2VsbEVkaXRvckxpc3RlbmVyI2FwcGx5RWRpdG9yVmFsdWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlQXBwbHlFZGl0b3JWYWx1ZSgpIHsKLSAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIElDZWxsRWRpdG9yTGlzdGVuZXIgbCA9IChJQ2VsbEVkaXRvckxpc3RlbmVyKSBhcnJheVtpXTsKLSAgICAgICAgICAgIFNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGwuYXBwbHlFZGl0b3JWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgYWxsIHJlZ2lzdGVyZWQgY2VsbCBlZGl0b3IgbGlzdGVuZXJzIHRoYXQgZWRpdGluZyBoYXMgYmVlbgotICAgICAqIGNhbmNlbGVkLgotICAgICAqCi0gICAgICogQHNlZSBJQ2VsbEVkaXRvckxpc3RlbmVyI2NhbmNlbEVkaXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVDYW5jZWxFZGl0b3IoKSB7Ci0gICAgICAgIE9iamVjdFtdIGFycmF5ID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBJQ2VsbEVkaXRvckxpc3RlbmVyIGwgPSAoSUNlbGxFZGl0b3JMaXN0ZW5lcikgYXJyYXlbaV07Ci0gICAgICAgICAgICBTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBsLmNhbmNlbEVkaXRvcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgYWxsIHJlZ2lzdGVyZWQgY2VsbCBlZGl0b3IgbGlzdGVuZXJzIG9mIGEgdmFsdWUgY2hhbmdlLgotICAgICAqCi0gICAgICogQHBhcmFtIG9sZFZhbGlkU3RhdGUgdGhlIHZhbGlkIHN0YXRlIGJlZm9yZSB0aGUgZW5kIHVzZXIgY2hhbmdlZCB0aGUgdmFsdWUKLSAgICAgKiBAcGFyYW0gbmV3VmFsaWRTdGF0ZSB0aGUgY3VycmVudCB2YWxpZCBzdGF0ZQotICAgICAqIEBzZWUgSUNlbGxFZGl0b3JMaXN0ZW5lciNlZGl0b3JWYWx1ZUNoYW5nZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlRWRpdG9yVmFsdWVDaGFuZ2VkKGZpbmFsIGJvb2xlYW4gb2xkVmFsaWRTdGF0ZSwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbmV3VmFsaWRTdGF0ZSkgewotICAgICAgICBPYmplY3RbXSBhcnJheSA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgSUNlbGxFZGl0b3JMaXN0ZW5lciBsID0gKElDZWxsRWRpdG9yTGlzdGVuZXIpIGFycmF5W2ldOwotICAgICAgICAgICAgU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgbC5lZGl0b3JWYWx1ZUNoYW5nZWQob2xkVmFsaWRTdGF0ZSwgbmV3VmFsaWRTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyBhbGwgcmVnaXN0ZXJlZCBwcm9wZXJ0eSBsaXN0ZW5lcnMKLSAgICAgKiBvZiBhbiBlbmFibGVtZW50IGNoYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb25JZCB0aGUgaWQgaW5kaWNhdGluZyB3aGF0IGFjdGlvbidzIGVuYWJsZW1lbnQgaGFzIGNoYW5nZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZUVuYWJsZW1lbnRDaGFuZ2VkKGZpbmFsIFN0cmluZyBhY3Rpb25JZCkgewotICAgICAgICBPYmplY3RbXSBhcnJheSA9IHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsID0gKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBhcnJheVtpXTsKLSAgICAgICAgICAgIFNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGwucHJvcGVydHlDaGFuZ2UobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgYWN0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3R5bGUgYml0cyBmb3IgdGhpcyBjZWxsIGVkaXRvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIFNXVCBzdHlsZSBiaXRzIGZvciB0aGlzIGNlbGwgZWRpdG9yCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKGludCBzdHlsZSkgewotICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3R5bGUgYml0cyBmb3IgdGhpcyBjZWxsIGVkaXRvci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHN0eWxlIGZvciB0aGlzIGNlbGwgZWRpdG9yCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBzdHlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250cm9sIHVzZWQgdG8gaW1wbGVtZW50IHRoaXMgY2VsbCBlZGl0b3IuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250cm9sLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGNlbGwgZWRpdG9yIGhhcyBubyBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBlcnJvciBtZXNzYWdlIGZvciB0aGlzIGNlbGwgZWRpdG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGNlbGwgZWRpdG9yIGlzIGluIGFuIGludmFsaWQgc3RhdGUsCi0gICAgICogIGFuZCA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY2VsbCBlZGl0b3IgaXMgdmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGF5b3V0IGRhdGEgb2JqZWN0IGZvciB0aGlzIGNlbGwgZWRpdG9yLgotICAgICAqIFRoaXMgaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgY2VsbCBlZGl0b3IgaXMgYWN0aXZhdGVkCi0gICAgICogYW5kIGNvbnRyb2xzIHRoZSBsYXlvdXQgb2YgdGhlIFNXVCB0YWJsZSBlZGl0b3IuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgc2V0cyB0aGUgCi0gICAgICogbWluaW11bSB3aWR0aCB0byB0aGUgY29udHJvbCdzIHByZWZlcnJlZCB3aWR0aC4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgb3IgcmVpbXBsZW1lbnQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbGF5b3V0IGRhdGEgb2JqZWN0IAotICAgICAqLwotICAgIHB1YmxpYyBMYXlvdXREYXRhIGdldExheW91dERhdGEoKSB7Ci0gICAgICAgIExheW91dERhdGEgcmVzdWx0ID0gbmV3IExheW91dERhdGEoKTsKLSAgICAgICAgQ29udHJvbCBjb250cm9sID0gZ2V0Q29udHJvbCgpOwotICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQubWluaW11bVdpZHRoID0gY29udHJvbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgIHRydWUpLng7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCB2YWxpZGF0b3IgZm9yIHRoaXMgY2VsbCBlZGl0b3IuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBjZWxsIGVkaXRvcidzIHZhbHVlIHByb3ZpZGVkIHRoYXQgaXQgaGFzIGEgdmFsaWQgb25lLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBjZWxsIGVkaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAgIGlmIHRoZSBjZWxsIGVkaXRvciBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICBpZiAoIXZhbGlkKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIGRvR2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjZWxsIGVkaXRvciBpcyBhY3RpdmF0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2VsbCBlZGl0b3IncyBjb250cm9sIGlzCi0gICAgICogICBjdXJyZW50bHkgYWN0aXZhdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdCBhY3RpdmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2YXRlZCgpIHsKLSAgICAJLy8gVXNlIHRoZSBzdGF0ZSBvZiB0aGUgdmlzaWJsZSBzdHlsZSBiaXQgKGdldFZpc2libGUoKSkgcmF0aGVyIHRoYW4gdGhlCi0gICAgCS8vIHdpbmRvdydzIGFjdHVhbCB2aXNpYmlsaXR5IChpc1Zpc2libGUoKSkgdG8gZ2V0IGNvcnJlY3QgaGFuZGxpbmcgd2hlbgotICAgIAkvLyBhbiBhbmNlc3RvciBjb250cm9sIGdvZXMgaW52aXNpYmxlLCBzZWUgYnVnIDg1MzMxLgotICAgICAgICByZXR1cm4gY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2wuZ2V0VmlzaWJsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjZWxsIGVkaXRvciBpcwotICAgICAqIGFibGUgdG8gcGVyZm9ybSB0aGUgY29weSBhY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKLSAgICAgKiA8L3A+Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb3B5IGlzIHBvc3NpYmxlLAotICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb3B5RW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgdmFsaWQgZm9yIHRoaXMgY2VsbCBlZGl0b3IuCi0gICAgICogVGhpcyBjZWxsIGVkaXRvcidzIHZhbGlkYXRvciAoaWYgYW55KSBtYWtlcyB0aGUgYWN0dWFsIGRldGVybWluYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSBpcyB2YWxpZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICBpZiBpbnZhbGlkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb3JyZWN0KE9iamVjdCB2YWx1ZSkgewotICAgICAgICBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgICAgICBpZiAodmFsaWRhdG9yID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBlcnJvck1lc3NhZ2UgPSB2YWxpZGF0b3IuaXNWYWxpZCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiAoZXJyb3JNZXNzYWdlID09IG51bGwgfHwgZXJyb3JNZXNzYWdlLmVxdWFscygiIikpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2VsbCBlZGl0b3IgaXMKLSAgICAgKiBhYmxlIHRvIHBlcmZvcm0gdGhlIGN1dCBhY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKLSAgICAgKiA8L3A+Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjdXQgaXMgcG9zc2libGUsCi0gICAgICogIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0N1dEVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2VsbCBlZGl0b3IgaXMKLSAgICAgKiBhYmxlIHRvIHBlcmZvcm0gdGhlIGRlbGV0ZSBhY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKLSAgICAgKiA8L3A+Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBkZWxldGUgaXMgcG9zc2libGUsCi0gICAgICogIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZUVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoaXMgY2VsbCBlZGl0b3IgaGFzIGNoYW5nZWQgc2luY2UgdGhlCi0gICAgICogbGFzdCBjYWxsIHRvIDxjb2RlPnNldFZhbHVlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogIGlmIHVuY2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgICAgIHJldHVybiBkaXJ0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXJrcyB0aGlzIGNlbGwgZWRpdG9yIGFzIGRpcnR5LgotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYXJrRGlydHkoKSB7Ci0gICAgICAgIGRpcnR5ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2VsbCBlZGl0b3IgaXMKLSAgICAgKiBhYmxlIHRvIHBlcmZvcm0gdGhlIGZpbmQgYWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyAKLSAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0gICAgICogPC9wPgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmluZCBpcyBwb3NzaWJsZSwKLSAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRmluZEVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2VsbCBlZGl0b3IgaXMKLSAgICAgKiBhYmxlIHRvIHBlcmZvcm0gdGhlIHBhc3RlIGFjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZQotICAgICAqIDwvcD4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBhc3RlIGlzIHBvc3NpYmxlLAotICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXN0ZUVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2VsbCBlZGl0b3IgaXMKLSAgICAgKiBhYmxlIHRvIHBlcmZvcm0gdGhlIHJlZG8gYWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyAKLSAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0gICAgICogPC9wPgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVkbyBpcyBwb3NzaWJsZSwKLSAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVkb0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2VsbCBlZGl0b3IgaXMKLSAgICAgKiBhYmxlIHRvIHBlcmZvcm0gdGhlIHNlbGVjdCBhbGwgYWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyAKLSAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0gICAgICogPC9wPgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc2VsZWN0IGFsbCBpcyBwb3NzaWJsZSwKLSAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0QWxsRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjZWxsIGVkaXRvciBpcwotICAgICAqIGFibGUgdG8gcGVyZm9ybSB0aGUgdW5kbyBhY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKLSAgICAgKiA8L3A+Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB1bmRvIGlzIHBvc3NpYmxlLAotICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVbmRvRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNlbGwgZWRpdG9yIGhhcyBhIHZhbGlkIHZhbHVlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgaXMgdmFsaWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgaWYgaW52YWxpZAotICAgICAqCi0gICAgICogQHNlZSAjc2V0VmFsdWVWYWxpZChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsdWVWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIGtleSByZWxlYXNlIGV2ZW50IHRoYXQgb2NjdXJyZWQgaW4gdGhpcyBjZWxsIGVkaXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgY2FuY2VscyBlZGl0aW5nCi0gICAgICogd2hlbiB0aGUgRVNDIGtleSBpcyBwcmVzc2VkLiAgV2hlbiB0aGUgUkVUVVJOIGtleSBpcyBwcmVzc2VkIHRoZSBjdXJyZW50Ci0gICAgICogdmFsdWUgaXMgYXBwbGllZCBhbmQgdGhlIGNlbGwgZWRpdG9yIGRlYWN0aXZhdGVzLgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYXQgYXBwcm9wcmlhdGUgdGltZXMuIAotICAgICAqIFN1YmNsYXNzZXMgbWF5IGFsc28gZXh0ZW5kIG9yIHJlaW1wbGVtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXlFdmVudCB0aGUga2V5IGV2ZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQga2V5UmVsZWFzZU9jY3VyZWQoS2V5RXZlbnQga2V5RXZlbnQpIHsKLSAgICAgICAgaWYgKGtleUV2ZW50LmNoYXJhY3RlciA9PSAnXHUwMDFiJykgeyAvLyBFc2NhcGUgY2hhcmFjdGVyCi0gICAgICAgICAgICBmaXJlQ2FuY2VsRWRpdG9yKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoa2V5RXZlbnQuY2hhcmFjdGVyID09ICdccicpIHsgLy8gUmV0dXJuIGtleQotICAgICAgICAgICAgZmlyZUFwcGx5RWRpdG9yVmFsdWUoKTsKLSAgICAgICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIGZvY3VzIGxvc3QgZXZlbnQgdGhhdCBvY2N1cnJlZCBpbiB0aGlzIGNlbGwgZWRpdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBhcHBsaWVzIHRoZSBjdXJyZW50Ci0gICAgICogdmFsdWUgYW5kIGRlYWN0aXZhdGVzIHRoZSBjZWxsIGVkaXRvci4KLSAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGF0IGFwcHJvcHJpYXRlIHRpbWVzLiAKLSAgICAgKiBTdWJjbGFzc2VzIG1heSBhbHNvIGV4dGVuZCBvciByZWltcGxlbWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZm9jdXNMb3N0KCkgewotICAgICAgICBpZiAoaXNBY3RpdmF0ZWQoKSkgewotICAgICAgICAgICAgZmlyZUFwcGx5RWRpdG9yVmFsdWUoKTsKLSAgICAgICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHRoZSBjb3B5IGFjdGlvbi4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1Db3B5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHRoZSBjdXQgYWN0aW9uLgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGVyZm9ybUN1dCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGUgZGVsZXRlIGFjdGlvbi4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIGZpbmQgYWN0aW9uLgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGVyZm9ybUZpbmQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIHBhc3RlIGFjdGlvbi4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1QYXN0ZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGUgcmVkbyBhY3Rpb24uCi0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZQotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVkbygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGUgc2VsZWN0IGFsbCBhY3Rpb24uCi0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZQotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtU2VsZWN0QWxsKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHRoZSB1bmRvIGFjdGlvbi4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1VbmRvKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhpcyBjZWxsIGVkaXRvci4KLSAgICAgKiBIYXMgbm8gYWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIGNlbGwgZWRpdG9yIGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUNlbGxFZGl0b3JMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIGNlbGwgZWRpdG9yLgotICAgICAqIEhhcyBubyBhZmZlY3QgaWYgYW4gaWRlbnRpY2FsIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBpcyBub3QgCi0gICAgICogcmVnaXN0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgY3VycmVudCBlcnJvciBtZXNzYWdlIGZvciB0aGlzIGNlbGwgZWRpdG9yLgotICAgICAqIDxwPgotICAgICAqIE5vIGZvcm1hdHRpbmcgaXMgZG9uZSBoZXJlLCB0aGUgbWVzc2FnZSB0byBiZSBzZXQgaXMgZXhwZWN0ZWQgdG8gYmUgZnVsbHkgZm9ybWF0dGVkCi0gICAgICogYmVmb3JlIGJlaW5nIHBhc3NlZCBpbi4KLSAgICAgKiA8L3A+Ci0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNsZWFyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVycm9yTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZm9jdXMgdG8gdGhlIGNlbGwgZWRpdG9yJ3MgY29udHJvbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgZG9TZXRGb2N1cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGlucHV0IHZhbGlkYXRvciBmb3IgdGhpcyBjZWxsIGVkaXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWxpZGF0b3IgdGhlIGlucHV0IHZhbGlkYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihJQ2VsbEVkaXRvclZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLSAgICAgICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIGNlbGwgZWRpdG9yJ3MgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoaXMgY2VsbCBlZGl0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdmFsaWQgPSBpc0NvcnJlY3QodmFsdWUpOwotICAgICAgICBkaXJ0eSA9IGZhbHNlOwotICAgICAgICBkb1NldFZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWxpZCBzdGF0ZSBvZiB0aGlzIGNlbGwgZWRpdG9yLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgb24gY29uc3RydWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbGlkIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHZhbGllIGlzIHZhbGlkLAotICAgICAqICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGludmFsaWQKLSAgICAgKgotICAgICAqIEBzZWUgI2lzVmFsdWVWYWxpZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbHVlVmFsaWQoYm9vbGVhbiB2YWxpZCkgewotICAgICAgICB0aGlzLnZhbGlkID0gdmFsaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHZhbHVlIGhhcyBjaGFuZ2VkLiAgCi0gICAgICogVXBkYXRlcyB0aGUgdmFsaWQgc3RhdGUgZmxhZywgbWFya3MgdGhpcyBjZWxsIGVkaXRvciBhcyBkaXJ0eSwKLSAgICAgKiBhbmQgbm90aWZpZXMgYWxsIHJlZ2lzdGVyZWQgY2VsbCBlZGl0b3IgbGlzdGVuZXJzIG9mIGEgdmFsdWUgY2hhbmdlLgotICAgICAqCi0gICAgICogQHBhcmFtIG9sZFZhbGlkU3RhdGUgdGhlIHZhbGlkIHN0YXRlIGJlZm9yZSB0aGUgZW5kIHVzZXIgY2hhbmdlZCB0aGUgdmFsdWUKLSAgICAgKiBAcGFyYW0gbmV3VmFsaWRTdGF0ZSB0aGUgY3VycmVudCB2YWxpZCBzdGF0ZQotICAgICAqIEBzZWUgSUNlbGxFZGl0b3JMaXN0ZW5lciNlZGl0b3JWYWx1ZUNoYW5nZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoYm9vbGVhbiBvbGRWYWxpZFN0YXRlLCBib29sZWFuIG5ld1ZhbGlkU3RhdGUpIHsKLSAgICAgICAgdmFsaWQgPSBuZXdWYWxpZFN0YXRlOwotICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgICAgIGZpcmVFZGl0b3JWYWx1ZUNoYW5nZWQob2xkVmFsaWRTdGF0ZSwgbmV3VmFsaWRTdGF0ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9DaGVja1N0YXRlQ2hhbmdlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0NoZWNrU3RhdGVDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlNjcwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0NoZWNrU3RhdGVDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi0vKioKLSAqIEV2ZW50IG9iamVjdCBkZXNjcmliaW5nIGEgY2hhbmdlIHRvIHRoZSBjaGVja2VkIHN0YXRlCi0gKiBvZiBhIHZpZXdlciBlbGVtZW50LgotICoKLSAqIEBzZWUgSUNoZWNrU3RhdGVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTY0NDM2MDMzNDAyNDQ3ODlMOwotCi0gICAgLyoqCi0gICAgICogVGhlIHZpZXdlciBlbGVtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGVsZW1lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2hlY2tlZCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc3RhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGV2ZW50IGZvciB0aGUgZ2l2ZW4gc291cmNlLCBlbGVtZW50LCBhbmQgY2hlY2tlZCBzdGF0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZQotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHN0YXRlIHRoZSBjaGVja2VkIHN0YXRlCi0gICAgICovCi0gICAgcHVibGljIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQoSUNoZWNrYWJsZSBzb3VyY2UsIE9iamVjdCBlbGVtZW50LAotICAgICAgICAgICAgYm9vbGVhbiBzdGF0ZSkgewotICAgICAgICBzdXBlcihzb3VyY2UpOwotICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hlY2thYmxlIHRoYXQgaXMgdGhlIHNvdXJjZSBvZiB0aGlzIGV2ZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgb3JpZ2luYXRpbmcgY2hlY2thYmxlCi0gICAgICovCi0gICAgcHVibGljIElDaGVja2FibGUgZ2V0Q2hlY2thYmxlKCkgewotICAgICAgICByZXR1cm4gKElDaGVja2FibGUpIHNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBlbGVtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY2hlY2tlZCBzdGF0ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldENoZWNrZWQoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHdob3NlIGNoZWNrIHN0YXRlIGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0NoZWNrYm94Q2VsbEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9DaGVja2JveENlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmODIwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0NoZWNrYm94Q2VsbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBBIGNlbGwgZWRpdG9yIHRoYXQgbWFuYWdlcyBhIGNoZWNrYm94LgotICogVGhlIGNlbGwgZWRpdG9yJ3MgdmFsdWUgaXMgYSBib29sZWFuLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogPHA+Ci0gKiBOb3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgZmFrZXMgaXQgYW5kIGRvZXMgZG9lcyBub3QgY3JlYXRlCi0gKiBhbnkgbmV3IGNvbnRyb2xzLiBUaGUgbWVyZSBhY3RpdmF0aW9uIG9mIHRoaXMgZWRpdG9yIG1lYW5zIHRoYXQgdGhlIHZhbHVlCi0gKiBvZiB0aGUgY2hlY2sgYm94IGlzIGJlaW5nIHRvZ2dsZWQgYnkgdGhlIGVuZCB1c2VyczsgdGhlIGxpc3RlbmVyIG1ldGhvZAotICogPGNvZGU+YXBwbHlFZGl0b3JWYWx1ZTwvY29kZT4gaXMgaW1tZWRpYXRlbHkgY2FsbGVkIHRvIHNpZ25hbCB0aGUgY2hhbmdlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tib3hDZWxsRWRpdG9yIGV4dGVuZHMgQ2VsbEVkaXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2hlY2tib3ggdmFsdWUuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLwotICAgIGJvb2xlYW4gdmFsdWUgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ2hlY2tib3hDZWxsRWRpdG9yIHN0eWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHRTdHlsZSA9IFNXVC5OT05FOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBjaGVja2JveCBjZWxsIGVkaXRvciB3aXRoIG5vIGNvbnRyb2wKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICovCi0gICAgcHVibGljIENoZWNrYm94Q2VsbEVkaXRvcigpIHsKLSAgICAgICAgc2V0U3R5bGUoZGVmYXVsdFN0eWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGNoZWNrYm94IGNlbGwgZWRpdG9yIHBhcmVudGVkIHVuZGVyIHRoZSBnaXZlbiBjb250cm9sLgotICAgICAqIFRoZSBjZWxsIGVkaXRvciB2YWx1ZSBpcyBhIGJvb2xlYW4gdmFsdWUsIHdoaWNoIGlzIGluaXRpYWxseSA8Y29kZT5mYWxzZTwvY29kZT4uIAotICAgICAqIEluaXRpYWxseSwgdGhlIGNlbGwgZWRpdG9yIGhhcyBubyBjZWxsIHZhbGlkYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIENoZWNrYm94Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMocGFyZW50LCBkZWZhdWx0U3R5bGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY2hlY2tib3ggY2VsbCBlZGl0b3IgcGFyZW50ZWQgdW5kZXIgdGhlIGdpdmVuIGNvbnRyb2wuCi0gICAgICogVGhlIGNlbGwgZWRpdG9yIHZhbHVlIGlzIGEgYm9vbGVhbiB2YWx1ZSwgd2hpY2ggaXMgaW5pdGlhbGx5IDxjb2RlPmZhbHNlPC9jb2RlPi4gCi0gICAgICogSW5pdGlhbGx5LCB0aGUgY2VsbCBlZGl0b3IgaGFzIG5vIGNlbGwgdmFsaWRhdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIGJpdHMKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICovCi0gICAgcHVibGljIENoZWNrYm94Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkNoZWNrYm94Q2VsbEVkaXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YKLSAgICAgKiB0aGlzIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IGZyYW1ld29yayBtZXRob2Qgc2ltdWxhdGVzCi0gICAgICogdGhlIHRvZ2dsaW5nIG9mIHRoZSBjaGVja2JveCBjb250cm9sIGFuZCBub3RpZmllcwotICAgICAqIGxpc3RlbmVycyB3aXRoIDxjb2RlPklDZWxsRWRpdG9yTGlzdGVuZXIuYXBwbHlFZGl0b3JWYWx1ZTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0gICAgICAgIHZhbHVlID0gIXZhbHVlOwotICAgICAgICBmaXJlQXBwbHlFZGl0b3JWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5DaGVja2JveENlbGxFZGl0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mCi0gICAgICogdGhpcyA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBmcmFtZXdvcmsgbWV0aG9kIGRvZXMKLSAgICAgKiBub3RoaW5nIGFuZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+Q2hlY2tib3hDZWxsRWRpdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAqIHRoaXMgPGNvZGU+Q2VsbEVkaXRvcjwvY29kZT4gZnJhbWV3b3JrIG1ldGhvZCByZXR1cm5zCi0gICAgICogdGhlIGNoZWNrYm94IHNldHRpbmcgd3JhcHBlZCBhcyBhIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgQm9vbGVhbiBjaGVja2JveCB2YWx1ZQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZG9HZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIENlbGxFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRGb2N1cygpIHsKLSAgICAgICAgLy8gSWdub3JlCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkNoZWNrYm94Q2VsbEVkaXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YKLSAgICAgKiB0aGlzIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IGZyYW1ld29yayBtZXRob2QgYWNjZXB0cwotICAgICAqIGEgdmFsdWUgd3JhcHBlZCBhcyBhIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGEgQm9vbGVhbiB2YWx1ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKTsKLSAgICAgICAgdGhpcy52YWx1ZSA9ICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvQ2hlY2tib3hUYWJsZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9DaGVja2JveFRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjY4MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9DaGVja2JveFRhYmxlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogQSBjb25jcmV0ZSB2aWV3ZXIgYmFzZWQgb24gYW4gU1dUIDxjb2RlPlRhYmxlPC9jb2RlPgotICogY29udHJvbCB3aXRoIGNoZWNrYm94ZXMgb24gZWFjaCBub2RlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG91dHNpZGUgdGhlIHZpZXdlciBmcmFtZXdvcmsuIAotICogSXQgaXMgZGVzaWduZWQgdG8gYmUgaW5zdGFudGlhdGVkIHdpdGggYSBwcmUtZXhpc3RpbmcgU1dUIHRhYmxlIGNvbnRyb2wgYW5kIGNvbmZpZ3VyZWQKLSAqIHdpdGggYSBkb21haW4tc3BlY2lmaWMgY29udGVudCBwcm92aWRlciwgbGFiZWwgcHJvdmlkZXIsIGVsZW1lbnQgZmlsdGVyIChvcHRpb25hbCksCi0gKiBhbmQgZWxlbWVudCBzb3J0ZXIgKG9wdGlvbmFsKS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENoZWNrYm94VGFibGVWaWV3ZXIgZXh0ZW5kcyBUYWJsZVZpZXdlciBpbXBsZW1lbnRzIElDaGVja2FibGUgewotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiBjaGVjayBzdGF0ZSBsaXN0ZW5lcnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+SUNoZWNrU3RhdGVMaXN0ZW5lcjwvY29kZT4pLgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdGVuZXJMaXN0IGNoZWNrU3RhdGVMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgdGFibGUgdmlld2VyIG9uIGEgbmV3bHktY3JlYXRlZCB0YWJsZSBjb250cm9sIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQuCi0gICAgICogVGhlIHRhYmxlIGNvbnRyb2wgaXMgY3JlYXRlZCB1c2luZyB0aGUgU1dUIHN0eWxlIGJpdHM6IAotICAgICAqIDxjb2RlPlNXVC5DSEVDSzwvY29kZT4gYW5kIDxjb2RlPlNXVC5CT1JERVI8L2NvZGU+LgotICAgICAqIFRoZSB0YWJsZSBoYXMgb25lIGNvbHVtbi4KLSAgICAgKiBUaGUgdmlld2VyIGhhcyBubyBpbnB1dCwgbm8gY29udGVudCBwcm92aWRlciwgYSBkZWZhdWx0IGxhYmVsIHByb3ZpZGVyLCAKLSAgICAgKiBubyBzb3J0ZXIsIGFuZCBubyBmaWx0ZXJzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIDxjb2RlPm5ldyBDaGVja2JveFRhYmxlVmlld2VyKHBhcmVudCwgU1dULkJPUkRFUik8L2NvZGU+LgotICAgICAqIFNlZSB0aGF0IGNvbnN0cnVjdG9yIGZvciBtb3JlIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgbmV3Q2hlY2tMaXN0KENvbXBvc2l0ZSwgaW50KSBvciBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcihUYWJsZSkKLSAgICAgKiAgIGluc3RlYWQgKHNlZSBiZWxvdyBmb3IgZGV0YWlscykKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hlY2tib3hUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgdGFibGUgdmlld2VyIG9uIGEgbmV3bHktY3JlYXRlZCB0YWJsZSBjb250cm9sIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQuCi0gICAgICogVGhlIHRhYmxlIGNvbnRyb2wgaXMgY3JlYXRlZCB1c2luZyB0aGUgZ2l2ZW4gU1dUIHN0eWxlIGJpdHMsIHBsdXMgdGhlIAotICAgICAqIDxjb2RlPlNXVC5DSEVDSzwvY29kZT4gc3R5bGUgYml0LgotICAgICAqIFRoZSB0YWJsZSBoYXMgb25lIGNvbHVtbi4gCi0gICAgICogVGhlIHZpZXdlciBoYXMgbm8gaW5wdXQsIG5vIGNvbnRlbnQgcHJvdmlkZXIsIGEgZGVmYXVsdCBsYWJlbCBwcm92aWRlciwgCi0gICAgICogbm8gc29ydGVyLCBhbmQgbm8gZmlsdGVycy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFsc28gYWRkcyBhIDxjb2RlPlRhYmxlQ29sdW1uPC9jb2RlPiBmb3IgdGhlIHNpbmdsZSBjb2x1bW4sIAotICAgICAqIGFuZCBzZXRzIGEgPGNvZGU+VGFibGVMYXlvdXQ8L2NvZGU+IG9uIHRoZSB0YWJsZSB3aGljaCBzaXplcyB0aGUgY29sdW1uIHRvIGZpbGwgCi0gICAgICogdGhlIHRhYmxlIGZvciBpdHMgaW5pdGlhbCBzaXppbmcsIGJ1dCBkb2VzIG5vdGhpbmcgb24gc3Vic2VxdWVudCByZXNpemVzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2FsbGVyIGp1c3QgbmVlZHMgdG8gc2hvdyBhIHNpbmdsZSBjb2x1bW4gd2l0aCBubyBoZWFkZXIsCi0gICAgICogaXQgaXMgcHJlZmVyYWJsZSB0byB1c2UgdGhlIDxjb2RlPm5ld0NoZWNrTGlzdDwvY29kZT4gZmFjdG9yeSBtZXRob2QgaW5zdGVhZCwKLSAgICAgKiBzaW5jZSBTV1QgcHJvcGVybHkgaGFuZGxlcyB0aGUgaW5pdGlhbCBzaXppbmcgYW5kIHN1YnNlcXVlbnQgcmVzaXplcyBpbiB0aGlzIGNhc2UuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjYWxsZXIgYWRkcyBpdHMgb3duIGNvbHVtbnMsIHVzZXMgPGNvZGU+VGFibGUuc2V0SGVhZGVyc1Zpc2libGUodHJ1ZSk8L2NvZGU+LCAKLSAgICAgKiBvciBuZWVkcyB0byBoYW5kbGUgZHluYW1pYyByZXNpemluZyBvZiB0aGUgdGFibGUsIGl0IGlzIHJlY29tbWVuZGVkIHRvICAKLSAgICAgKiBjcmVhdGUgdGhlIDxjb2RlPlRhYmxlPC9jb2RlPiBpdHNlbGYsIHNwZWNpZnlpbmcgdGhlIDxjb2RlPlNXVC5DSEVDSzwvY29kZT4gc3R5bGUgYml0IAotICAgICAqIChhbG9uZyB3aXRoIGFueSBvdGhlciBzdHlsZSBiaXRzIG5lZWRlZCksIGFuZCB1c2UgPGNvZGU+bmV3IENoZWNrYm94VGFibGVWaWV3ZXIoVGFibGUpPC9jb2RlPiAKLSAgICAgKiByYXRoZXIgdGhhbiB0aGlzIGNvbnN0cnVjdG9yLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqIEBwYXJhbSBzdHlsZSBTV1Qgc3R5bGUgYml0cwotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIHVzZSBuZXdDaGVja0xpc3QoQ29tcG9zaXRlLCBpbnQpIG9yIG5ldyBDaGVja2JveFRhYmxlVmlld2VyKFRhYmxlKSAKLSAgICAgKiAgIGluc3RlYWQgKHNlZSBhYm92ZSBmb3IgZGV0YWlscykKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hlY2tib3hUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgdGhpcyhjcmVhdGVUYWJsZShwYXJlbnQsIHN0eWxlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHRhYmxlIHZpZXdlciBvbiBhIG5ld2x5LWNyZWF0ZWQgdGFibGUgY29udHJvbCB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50LgotICAgICAqIFRoZSB0YWJsZSBjb250cm9sIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIGdpdmVuIFNXVCBzdHlsZSBiaXRzLCBwbHVzIHRoZSAKLSAgICAgKiA8Y29kZT5TV1QuQ0hFQ0s8L2NvZGU+IHN0eWxlIGJpdC4KLSAgICAgKiBUaGUgdGFibGUgc2hvd3MgaXRzIGNvbnRlbnRzIGluIGEgc2luZ2xlIGNvbHVtbiwgd2l0aCBubyBoZWFkZXIuCi0gICAgICogVGhlIHZpZXdlciBoYXMgbm8gaW5wdXQsIG5vIGNvbnRlbnQgcHJvdmlkZXIsIGEgZGVmYXVsdCBsYWJlbCBwcm92aWRlciwgCi0gICAgICogbm8gc29ydGVyLCBhbmQgbm8gZmlsdGVycy4KLSAgICAgKiA8cD4KLSAgICAgKiBObyA8Y29kZT5UYWJsZUNvbHVtbjwvY29kZT4gaXMgYWRkZWQuIFNXVCBkb2VzIG5vdCByZXF1aXJlIGEgCi0gICAgICogPGNvZGU+VGFibGVDb2x1bW48L2NvZGU+IGlmIHNob3dpbmcgb25seSBhIHNpbmdsZSBjb2x1bW4gd2l0aCBubyBoZWFkZXIuCi0gICAgICogU1dUIGNvcnJlY3RseSBoYW5kbGVzIHRoZSBpbml0aWFsIHNpemluZyBhbmQgc3Vic2VxdWVudCByZXNpemVzIGluIHRoaXMgY2FzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHBhcmFtIHN0eWxlIFNXVCBzdHlsZSBiaXRzCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqIEByZXR1cm4gQ2hlY2tib3hUYWJsZVZpZXdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2hlY2tib3hUYWJsZVZpZXdlciBuZXdDaGVja0xpc3QoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkNIRUNLIHwgc3R5bGUpOwotICAgICAgICByZXR1cm4gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIodGFibGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0YWJsZSB2aWV3ZXIgb24gdGhlIGdpdmVuIHRhYmxlIGNvbnRyb2wuCi0gICAgICogVGhlIDxjb2RlPlNXVC5DSEVDSzwvY29kZT4gc3R5bGUgYml0IG11c3QgYmUgc2V0IG9uIHRoZSBnaXZlbiB0YWJsZSBjb250cm9sLgotICAgICAqIFRoZSB2aWV3ZXIgaGFzIG5vIGlucHV0LCBubyBjb250ZW50IHByb3ZpZGVyLCBhIGRlZmF1bHQgbGFiZWwgcHJvdmlkZXIsIAotICAgICAqIG5vIHNvcnRlciwgYW5kIG5vIGZpbHRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hlY2tib3hUYWJsZVZpZXdlcihUYWJsZSB0YWJsZSkgewotICAgICAgICBzdXBlcih0YWJsZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ2hlY2thYmxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENoZWNrU3RhdGVMaXN0ZW5lcihJQ2hlY2tTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGNoZWNrU3RhdGVMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYmxlIGNvbnRyb2wgd2l0aCBvbmUgY29sdW1uLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKiBAcGFyYW0gc3R5bGUgc3R5bGUgYml0cwotICAgICAqIEByZXR1cm4gYSBuZXcgdGFibGUgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgVGFibGUgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkNIRUNLIHwgc3R5bGUpOwotCi0gICAgICAgIC8vIEFsdGhvdWdoIHRoaXMgdGFibGUgY29sdW1uIGlzIG5vdCBuZWVkZWQsIGFuZCBjYW4gY2F1c2UgcmVzaXplIHByb2JsZW1zLAotICAgICAgICAvLyBpdCBjYW4ndCBiZSByZW1vdmVkIHNpbmNlIHRoaXMgd291bGQgYmUgYSBicmVha2luZyBjaGFuZ2UgYWdhaW5zdCBSMS4wLgotICAgICAgICAvLyBTZWUgYnVnIDY2NDMgZm9yIG1vcmUgZGV0YWlscy4KLSAgICAgICAgbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDApKTsKLSAgICAgICAgdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICAgICAgcmV0dXJuIHRhYmxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIGFueSBjaGVjayBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCBhIGNoZWNrIHN0YXRlIGNoYW5nZWQgIGhhcyBiZWVuIHJlY2VpdmVkLgotICAgICAqIE9ubHkgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFyZSBub3RpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCBhIGNoZWNrIHN0YXRlIGNoYW5nZWQgZXZlbnQKLSAgICAgKgotICAgICAqIEBzZWUgSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmaXJlQ2hlY2tTdGF0ZUNoYW5nZWQoZmluYWwgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBPYmplY3RbXSBhcnJheSA9IGNoZWNrU3RhdGVMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIElDaGVja1N0YXRlTGlzdGVuZXIgbCA9IChJQ2hlY2tTdGF0ZUxpc3RlbmVyKSBhcnJheVtpXTsKLSAgICAgICAgICAgIFNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGwuY2hlY2tTdGF0ZUNoYW5nZWQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ2hlY2thYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldENoZWNrZWQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgV2lkZ2V0IHdpZGdldCA9IGZpbmRJdGVtKGVsZW1lbnQpOwotICAgICAgICBpZiAod2lkZ2V0IGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChUYWJsZUl0ZW0pIHdpZGdldCkuZ2V0Q2hlY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIGNoZWNrZWQgdGFibGUgaXRlbXMgaW4gdGhpcwotICAgICAqIHZpZXdlci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHByZXNlcnZpbmcgdGhlIGludGVyZXN0aW5nCi0gICAgICogc3RhdGUgb2YgYSB2aWV3ZXI7IDxjb2RlPnNldENoZWNrZWRFbGVtZW50czwvY29kZT4gaXMgdXNlZCBkdXJpbmcgdGhlIHJlc3RvcmUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgY2hlY2tlZCBlbGVtZW50cwotICAgICAqIEBzZWUgI3NldENoZWNrZWRFbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGVja2VkRWxlbWVudHMoKSB7Ci0gICAgICAgIFRhYmxlSXRlbVtdIGNoaWxkcmVuID0gZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICBBcnJheUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgIGlmIChpdGVtLmdldENoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICB2LmFkZChpdGVtLmdldERhdGEoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHYudG9BcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdyYXllZCBzdGF0ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZWxlbWVudCBpcyBncmF5ZWQsCi0gICAgICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdCBncmF5ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRHcmF5ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgV2lkZ2V0IHdpZGdldCA9IGZpbmRJdGVtKGVsZW1lbnQpOwotICAgICAgICBpZiAod2lkZ2V0IGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChUYWJsZUl0ZW0pIHdpZGdldCkuZ2V0R3JheWVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gZ3JheWVkIG5vZGVzIGluIHRoaXMKLSAgICAgKiB2aWV3ZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiBwcmVzZXJ2aW5nIHRoZSBpbnRlcmVzdGluZwotICAgICAqIHN0YXRlIG9mIGEgdmlld2VyOyA8Y29kZT5zZXRHcmF5ZWRFbGVtZW50czwvY29kZT4gaXMgdXNlZCBkdXJpbmcgdGhlIHJlc3RvcmUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZ3JheWVkIGVsZW1lbnRzCi0gICAgICogQHNlZSAjc2V0R3JheWVkRWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0R3JheWVkRWxlbWVudHMoKSB7Ci0gICAgICAgIFRhYmxlSXRlbVtdIGNoaWxkcmVuID0gZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICBMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICBpZiAoaXRlbS5nZXRHcmF5ZWQoKSkKLSAgICAgICAgICAgICAgICB2LmFkZChpdGVtLmdldERhdGEoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHYudG9BcnJheSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gU3RydWN0dXJlZFZpZXdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVTZWxlY3QoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQ0hFQ0spIHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZVNlbGVjdChldmVudCk7IC8vIHRoaXMgd2lsbCBjaGFuZ2UgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0KLSAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLSAgICAgICAgICAgIE9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmlyZUNoZWNrU3RhdGVDaGFuZ2VkKG5ldyBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50KHRoaXMsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmdldENoZWNrZWQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZVNlbGVjdChldmVudCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlc2VydmluZ1NlbGVjdGlvbihSdW5uYWJsZSB1cGRhdGVDb2RlKSB7Ci0KLSAgICAgICAgVGFibGVJdGVtW10gY2hpbGRyZW4gPSBnZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0gICAgICAgIEN1c3RvbUhhc2h0YWJsZSBjaGVja2VkID0gbmV3SGFzaHRhYmxlKGNoaWxkcmVuLmxlbmd0aCAqIDIgKyAxKTsKLSAgICAgICAgQ3VzdG9tSGFzaHRhYmxlIGdyYXllZCA9IG5ld0hhc2h0YWJsZShjaGlsZHJlbi5sZW5ndGggKiAyICsgMSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgIE9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0Q2hlY2tlZCgpKQotICAgICAgICAgICAgICAgICAgICBjaGVja2VkLnB1dChkYXRhLCBkYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbS5nZXRHcmF5ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZ3JheWVkLnB1dChkYXRhLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLnByZXNlcnZpbmdTZWxlY3Rpb24odXBkYXRlQ29kZSk7Ci0KLSAgICAgICAgY2hpbGRyZW4gPSBnZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICBPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q2hlY2tlZChjaGVja2VkLmNvbnRhaW5zS2V5KGRhdGEpKTsKLSAgICAgICAgICAgICAgICBpdGVtLnNldEdyYXllZChncmF5ZWQuY29udGFpbnNLZXkoZGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ2hlY2thYmxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNoZWNrU3RhdGVMaXN0ZW5lcihJQ2hlY2tTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGNoZWNrU3RhdGVMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRvIHRoZSBnaXZlbiB2YWx1ZSB0aGUgY2hlY2tlZCBzdGF0ZSBmb3IgYWxsIGVsZW1lbnRzIGluIHRoaXMgdmlld2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXRlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBjaGVja2VkLAotICAgICAqICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHNob3VsZCBiZSB1bmNoZWNrZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxDaGVja2VkKGJvb2xlYW4gc3RhdGUpIHsKLSAgICAgICAgVGFibGVJdGVtW10gY2hpbGRyZW4gPSBnZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICBpdGVtLnNldENoZWNrZWQoc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0byB0aGUgZ2l2ZW4gdmFsdWUgdGhlIGdyYXllZCBzdGF0ZSBmb3IgYWxsIGVsZW1lbnRzIGluIHRoaXMgdmlld2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXRlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBncmF5ZWQsCi0gICAgICogIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgc2hvdWxkIGJlIHVuZ3JheWVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWxsR3JheWVkKGJvb2xlYW4gc3RhdGUpIHsKLSAgICAgICAgVGFibGVJdGVtW10gY2hpbGRyZW4gPSBnZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICBpdGVtLnNldEdyYXllZChzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDaGVja2FibGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0Q2hlY2tlZChPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBzdGF0ZSkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGVsZW1lbnQpOwotICAgICAgICBXaWRnZXQgd2lkZ2V0ID0gZmluZEl0ZW0oZWxlbWVudCk7Ci0gICAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLSAgICAgICAgICAgICgoVGFibGVJdGVtKSB3aWRnZXQpLnNldENoZWNrZWQoc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hpY2ggbm9kZXMgYXJlIGNoZWNrZWQgaW4gdGhpcyB2aWV3ZXIuCi0gICAgICogVGhlIGdpdmVuIGxpc3QgY29udGFpbnMgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIHRvIGJlIGNoZWNrZWQ7Ci0gICAgICogYWxsIG90aGVyIG5vZGVzIGFyZSB0byBiZSB1bmNoZWNrZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiByZXN0b3JpbmcgdGhlIGludGVyZXN0aW5nCi0gICAgICogc3RhdGUgb2YgYSB2aWV3ZXIgY2FwdHVyZWQgYnkgYW4gZWFybGllciBjYWxsIHRvIDxjb2RlPmdldENoZWNrZWRFbGVtZW50czwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnRzIHRoZSBsaXN0IG9mIGNoZWNrZWQgZWxlbWVudHMgKGVsZW1lbnQgdHlwZTogPGNvZGU+T2JqZWN0PC9jb2RlPikKLSAgICAgKiBAc2VlICNnZXRDaGVja2VkRWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2VkRWxlbWVudHMoT2JqZWN0W10gZWxlbWVudHMpIHsKLSAgICAgICAgYXNzZXJ0RWxlbWVudHNOb3ROdWxsKGVsZW1lbnRzKTsKLSAgICAgICAgQ3VzdG9tSGFzaHRhYmxlIHNldCA9IG5ld0hhc2h0YWJsZShlbGVtZW50cy5sZW5ndGggKiAyICsgMSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIHNldC5wdXQoZWxlbWVudHNbaV0sIGVsZW1lbnRzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IGdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVjayA9IHNldC5jb250YWluc0tleShlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IHNldCBpZiBkaWZmZXJlbnQsIHRvIGF2b2lkIGZsaWNrZXIKLSAgICAgICAgICAgICAgICBpZiAoaXRlbS5nZXRDaGVja2VkKCkgIT0gY2hlY2spIHsKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRDaGVja2VkKGNoZWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBncmF5ZWQgc3RhdGUgZm9yIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoaXMgdmlld2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gc3RhdGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZW0gc2hvdWxkIGJlIGdyYXllZCwKLSAgICAgKiAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBzaG91bGQgYmUgdW5ncmF5ZWQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgYW5kIHRoZSBncmF5Ci0gICAgICogIHN0YXRlIGNvdWxkIGJlIHNldCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRHcmF5ZWQoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gc3RhdGUpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChlbGVtZW50KTsKLSAgICAgICAgV2lkZ2V0IHdpZGdldCA9IGZpbmRJdGVtKGVsZW1lbnQpOwotICAgICAgICBpZiAod2lkZ2V0IGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0gICAgICAgICAgICAoKFRhYmxlSXRlbSkgd2lkZ2V0KS5zZXRHcmF5ZWQoc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hpY2ggbm9kZXMgYXJlIGdyYXllZCBpbiB0aGlzIHZpZXdlci4KLSAgICAgKiBUaGUgZ2l2ZW4gbGlzdCBjb250YWlucyB0aGUgZWxlbWVudHMgdGhhdCBhcmUgdG8gYmUgZ3JheWVkOwotICAgICAqIGFsbCBvdGhlciBub2RlcyBhcmUgdG8gYmUgdW5ncmF5ZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiByZXN0b3JpbmcgdGhlIGludGVyZXN0aW5nCi0gICAgICogc3RhdGUgb2YgYSB2aWV3ZXIgY2FwdHVyZWQgYnkgYW4gZWFybGllciBjYWxsIHRvIDxjb2RlPmdldEdyYXllZEVsZW1lbnRzPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudHMgdGhlIGFycmF5IG9mIGdyYXllZCBlbGVtZW50cwotICAgICAqCi0gICAgICogQHNlZSAjZ2V0R3JheWVkRWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHcmF5ZWRFbGVtZW50cyhPYmplY3RbXSBlbGVtZW50cykgewotICAgICAgICBhc3NlcnRFbGVtZW50c05vdE51bGwoZWxlbWVudHMpOwotICAgICAgICBDdXN0b21IYXNodGFibGUgc2V0ID0gbmV3SGFzaHRhYmxlKGVsZW1lbnRzLmxlbmd0aCAqIDIgKyAxKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgc2V0LnB1dChlbGVtZW50c1tpXSwgZWxlbWVudHNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIFRhYmxlSXRlbVtdIGl0ZW1zID0gZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGdyYXkgPSBzZXQuY29udGFpbnNLZXkoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgLy8gb25seSBzZXQgaWYgZGlmZmVyZW50LCB0byBhdm9pZCBmbGlja2VyCi0gICAgICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0R3JheWVkKCkgIT0gZ3JheSkgewotICAgICAgICAgICAgICAgICAgICBpdGVtLnNldEdyYXllZChncmF5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0NoZWNrYm94VHJlZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9DaGVja2JveFRyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwYTdhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0NoZWNrYm94VHJlZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogQSBjb25jcmV0ZSB0cmVlLXN0cnVjdHVyZWQgdmlld2VyIGJhc2VkIG9uIGFuIFNXVCA8Y29kZT5UcmVlPC9jb2RlPgotICogY29udHJvbCB3aXRoIGNoZWNrYm94ZXMgb24gZWFjaCBub2RlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG91dHNpZGUgdGhlIHZpZXdlciBmcmFtZXdvcmsuIAotICogSXQgaXMgZGVzaWduZWQgdG8gYmUgaW5zdGFudGlhdGVkIHdpdGggYSBwcmUtZXhpc3RpbmcgU1dUIHRyZWUgY29udHJvbCBhbmQgY29uZmlndXJlZAotICogd2l0aCBhIGRvbWFpbi1zcGVjaWZpYyBjb250ZW50IHByb3ZpZGVyLCBsYWJlbCBwcm92aWRlciwgZWxlbWVudCBmaWx0ZXIgKG9wdGlvbmFsKSwKLSAqIGFuZCBlbGVtZW50IHNvcnRlciAob3B0aW9uYWwpLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tib3hUcmVlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciBpbXBsZW1lbnRzIElDaGVja2FibGUgewotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiBjaGVjayBzdGF0ZSBsaXN0ZW5lcnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+SUNoZWNrU3RhdGVMaXN0ZW5lcjwvY29kZT4pLgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdGVuZXJMaXN0IGNoZWNrU3RhdGVMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBMYXN0IGl0ZW0gY2xpY2tlZCBvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRyZWVJdGVtIGxhc3RDbGlja2VkSXRlbSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgdHJlZSB2aWV3ZXIgb24gYSBuZXdseS1jcmVhdGVkIHRyZWUgY29udHJvbCB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50LgotICAgICAqIFRoZSB0cmVlIGNvbnRyb2wgaXMgY3JlYXRlZCB1c2luZyB0aGUgU1dUIHN0eWxlIGJpdHM6IDxjb2RlPkNIRUNLPC9jb2RlPiBhbmQgPGNvZGU+Qk9SREVSPC9jb2RlPi4KLSAgICAgKiBUaGUgdmlld2VyIGhhcyBubyBpbnB1dCwgbm8gY29udGVudCBwcm92aWRlciwgYSBkZWZhdWx0IGxhYmVsIHByb3ZpZGVyLCAKLSAgICAgKiBubyBzb3J0ZXIsIGFuZCBubyBmaWx0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hlY2tib3hUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0cmVlIHZpZXdlciBvbiBhIG5ld2x5LWNyZWF0ZWQgdHJlZSBjb250cm9sIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQuCi0gICAgICogVGhlIHRyZWUgY29udHJvbCBpcyBjcmVhdGVkIHVzaW5nIHRoZSBnaXZlbiBTV1Qgc3R5bGUgYml0cywgcGx1cyB0aGUgPGNvZGU+Q0hFQ0s8L2NvZGU+IHN0eWxlIGJpdC4KLSAgICAgKiBUaGUgdmlld2VyIGhhcyBubyBpbnB1dCwgbm8gY29udGVudCBwcm92aWRlciwgYSBkZWZhdWx0IGxhYmVsIHByb3ZpZGVyLCAKLSAgICAgKiBubyBzb3J0ZXIsIGFuZCBubyBmaWx0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIFNXVCBzdHlsZSBiaXRzCi0gICAgICovCi0gICAgcHVibGljIENoZWNrYm94VHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgdGhpcyhuZXcgVHJlZShwYXJlbnQsIFNXVC5DSEVDSyB8IHN0eWxlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHRyZWUgdmlld2VyIG9uIHRoZSBnaXZlbiB0cmVlIGNvbnRyb2wuCi0gICAgICogVGhlIDxjb2RlPlNXVC5DSEVDSzwvY29kZT4gc3R5bGUgYml0IG11c3QgYmUgc2V0IG9uIHRoZSBnaXZlbiB0cmVlIGNvbnRyb2wuCi0gICAgICogVGhlIHZpZXdlciBoYXMgbm8gaW5wdXQsIG5vIGNvbnRlbnQgcHJvdmlkZXIsIGEgZGVmYXVsdCBsYWJlbCBwcm92aWRlciwgCi0gICAgICogbm8gc29ydGVyLCBhbmQgbm8gZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0cmVlIHRoZSB0cmVlIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hlY2tib3hUcmVlVmlld2VyKFRyZWUgdHJlZSkgewotICAgICAgICBzdXBlcih0cmVlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDaGVja2FibGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgY2hlY2tTdGF0ZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGxpZXMgdGhlIGNoZWNrZWQgYW5kIGdyYXllZCBzdGF0ZXMgb2YgdGhlIGdpdmVuIHdpZGdldCBhbmQgaXRzCi0gICAgICogZGVzY2VuZGVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2hlY2tlZCBhIHNldCBvZiBlbGVtZW50cyAoZWxlbWVudCB0eXBlOiA8Y29kZT5PYmplY3Q8L2NvZGU+KSAKLSAgICAgKiBAcGFyYW0gZ3JheWVkIGEgc2V0IG9mIGVsZW1lbnRzIChlbGVtZW50IHR5cGU6IDxjb2RlPk9iamVjdDwvY29kZT4pIAotICAgICAqIEBwYXJhbSB3aWRnZXQgdGhlIHdpZGdldAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBseVN0YXRlKEN1c3RvbUhhc2h0YWJsZSBjaGVja2VkLCBDdXN0b21IYXNodGFibGUgZ3JheWVkLAotICAgICAgICAgICAgV2lkZ2V0IHdpZGdldCkgewotICAgICAgICBJdGVtW10gaXRlbXMgPSBnZXRDaGlsZHJlbih3aWRnZXQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgVHJlZUl0ZW0gdGkgPSAoVHJlZUl0ZW0pIGl0ZW07Ci0gICAgICAgICAgICAgICAgICAgIHRpLnNldENoZWNrZWQoY2hlY2tlZC5jb250YWluc0tleShkYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRpLnNldEdyYXllZChncmF5ZWQuY29udGFpbnNLZXkoZGF0YSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwcGx5U3RhdGUoY2hlY2tlZCwgZ3JheWVkLCBpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIGFueSBjaGVjayBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCB0aGUgY2hlY2sgc3RhdGUgb2YgYW4gZWxlbWVudCBoYXMgY2hhbmdlZC4KLSAgICAgKiBPbmx5IGxpc3RlbmVycyByZWdpc3RlcmVkIGF0IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcmUgbm90aWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgYSBjaGVjayBzdGF0ZSBjaGFuZ2VkIGV2ZW50Ci0gICAgICoKLSAgICAgKiBAc2VlIElDaGVja1N0YXRlTGlzdGVuZXIjY2hlY2tTdGF0ZUNoYW5nZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlQ2hlY2tTdGF0ZUNoYW5nZWQoZmluYWwgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBPYmplY3RbXSBhcnJheSA9IGNoZWNrU3RhdGVMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIElDaGVja1N0YXRlTGlzdGVuZXIgbCA9IChJQ2hlY2tTdGF0ZUxpc3RlbmVyKSBhcnJheVtpXTsKLSAgICAgICAgICAgIFNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGwuY2hlY2tTdGF0ZUNoYW5nZWQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHYXRoZXJzIHRoZSBjaGVja2VkIGFuZCBncmF5ZWQgc3RhdGVzIG9mIHRoZSBnaXZlbiB3aWRnZXQgYW5kIGl0cwotICAgICAqIGRlc2NlbmRlbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNoZWNrZWQgYSB3cml0ZWFibGUgc2V0IG9mIGVsZW1lbnRzIChlbGVtZW50IHR5cGU6IDxjb2RlPk9iamVjdDwvY29kZT4pIAotICAgICAqIEBwYXJhbSBncmF5ZWQgYSB3cml0ZWFibGUgc2V0IG9mIGVsZW1lbnRzIChlbGVtZW50IHR5cGU6IDxjb2RlPk9iamVjdDwvY29kZT4pIAotICAgICAqIEBwYXJhbSB3aWRnZXQgdGhlIHdpZGdldAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnYXRoZXJTdGF0ZShDdXN0b21IYXNodGFibGUgY2hlY2tlZCwgQ3VzdG9tSGFzaHRhYmxlIGdyYXllZCwKLSAgICAgICAgICAgIFdpZGdldCB3aWRnZXQpIHsKLSAgICAgICAgSXRlbVtdIGl0ZW1zID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyZWVJdGVtIHRpID0gKFRyZWVJdGVtKSBpdGVtOwotICAgICAgICAgICAgICAgICAgICBpZiAodGkuZ2V0Q2hlY2tlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZC5wdXQoZGF0YSwgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aS5nZXRHcmF5ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyYXllZC5wdXQoZGF0YSwgZGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2F0aGVyU3RhdGUoY2hlY2tlZCwgZ3JheWVkLCBpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNoZWNrYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRDaGVja2VkKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIFdpZGdldCB3aWRnZXQgPSBmaW5kSXRlbShlbGVtZW50KTsKLSAgICAgICAgaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRyZWVJdGVtKQotICAgICAgICAgICAgcmV0dXJuICgoVHJlZUl0ZW0pIHdpZGdldCkuZ2V0Q2hlY2tlZCgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgY2hlY2tlZCBlbGVtZW50cyBpbiB0aGlzIHZpZXdlcidzIHRyZWUsIAotICAgICAqIGluY2x1ZGluZyBjdXJyZW50bHkgaGlkZGVuIG9uZXMgdGhhdCBhcmUgbWFya2VkIGFzCi0gICAgICogY2hlY2tlZCBidXQgYXJlIHVuZGVyIGEgY29sbGFwc2VkIGFuY2VzdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gcHJlc2VydmluZyB0aGUgaW50ZXJlc3RpbmcKLSAgICAgKiBzdGF0ZSBvZiBhIHZpZXdlcjsgPGNvZGU+c2V0Q2hlY2tlZEVsZW1lbnRzPC9jb2RlPiBpcyB1c2VkIGR1cmluZyB0aGUgcmVzdG9yZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBjaGVja2VkIGVsZW1lbnRzCi0gICAgICoKLSAgICAgKiBAc2VlICNzZXRDaGVja2VkRWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hlY2tlZEVsZW1lbnRzKCkgewotICAgICAgICBBcnJheUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQ29udHJvbCB0cmVlID0gZ2V0Q29udHJvbCgpOwotICAgICAgICBpbnRlcm5hbENvbGxlY3RDaGVja2VkKHYsIHRyZWUpOwotICAgICAgICByZXR1cm4gdi50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ3JheWVkIHN0YXRlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGlzIGdyYXllZCwKLSAgICAgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90IGdyYXllZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEdyYXllZChPYmplY3QgZWxlbWVudCkgewotICAgICAgICBXaWRnZXQgd2lkZ2V0ID0gZmluZEl0ZW0oZWxlbWVudCk7Ci0gICAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotICAgICAgICAgICAgcmV0dXJuICgoVHJlZUl0ZW0pIHdpZGdldCkuZ2V0R3JheWVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGdyYXllZCBlbGVtZW50cyBpbiB0aGlzIHZpZXdlcidzIHRyZWUsIAotICAgICAqIGluY2x1ZGluZyBjdXJyZW50bHkgaGlkZGVuIG9uZXMgdGhhdCBhcmUgbWFya2VkIGFzCi0gICAgICogZ3JheWVkIGJ1dCBhcmUgdW5kZXIgYSBjb2xsYXBzZWQgYW5jZXN0b3IuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiBwcmVzZXJ2aW5nIHRoZSBpbnRlcmVzdGluZwotICAgICAqIHN0YXRlIG9mIGEgdmlld2VyOyA8Y29kZT5zZXRHcmF5ZWRFbGVtZW50czwvY29kZT4gaXMgdXNlZCBkdXJpbmcgdGhlIHJlc3RvcmUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZ3JheWVkIGVsZW1lbnRzCi0gICAgICoKLSAgICAgKiBAc2VlICNzZXRHcmF5ZWRFbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRHcmF5ZWRFbGVtZW50cygpIHsKLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGludGVybmFsQ29sbGVjdEdyYXllZChyZXN1bHQsIGdldENvbnRyb2woKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9BcnJheSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gU3RydWN0dXJlZFZpZXdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVTZWxlY3QoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgICAgICBpZiAobGFzdENsaWNrZWRJdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgIFRyZWVJdGVtIGl0ZW0gPSBsYXN0Q2xpY2tlZEl0ZW07Ci0gICAgICAgICAgICBPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RhdGUgPSBpdGVtLmdldENoZWNrZWQoKTsKLSAgICAgICAgICAgICAgICBzZXRDaGVja2VkKGRhdGEsICFzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgZmlyZUNoZWNrU3RhdGVDaGFuZ2VkKG5ldyBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50KHRoaXMsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAhc3RhdGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxhc3RDbGlja2VkSXRlbSA9IG51bGw7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgc3VwZXIuaGFuZGxlRG91YmxlU2VsZWN0KGV2ZW50KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFN0cnVjdHVyZWRWaWV3ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0KFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0KLSAgICAgICAgbGFzdENsaWNrZWRJdGVtID0gbnVsbDsKLSAgICAgICAgaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQ0hFQ0spIHsKLSAgICAgICAgICAgIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0gICAgICAgICAgICBsYXN0Q2xpY2tlZEl0ZW0gPSBpdGVtOwotICAgICAgICAgICAgc3VwZXIuaGFuZGxlU2VsZWN0KGV2ZW50KTsKLQotICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaXJlQ2hlY2tTdGF0ZUNoYW5nZWQobmV3IENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQodGhpcywgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZ2V0Q2hlY2tlZCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgc3VwZXIuaGFuZGxlU2VsZWN0KGV2ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHYXRoZXJzIHRoZSBjaGVja2VkIHN0YXRlcyBvZiB0aGUgZ2l2ZW4gd2lkZ2V0IGFuZCBpdHMKLSAgICAgKiBkZXNjZW5kZW50cywgZm9sbG93aW5nIGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgdHJlZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXN1bHQgYSB3cml0ZWFibGUgbGlzdCBvZiBlbGVtZW50cyAoZWxlbWVudCB0eXBlOiA8Y29kZT5PYmplY3Q8L2NvZGU+KQotICAgICAqIEBwYXJhbSB3aWRnZXQgdGhlIHdpZGdldAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbENvbGxlY3RDaGVja2VkKExpc3QgcmVzdWx0LCBXaWRnZXQgd2lkZ2V0KSB7Ci0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IGdldENoaWxkcmVuKHdpZGdldCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSAmJiAoKFRyZWVJdGVtKSBpdGVtKS5nZXRDaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbENvbGxlY3RDaGVja2VkKHJlc3VsdCwgaXRlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHYXRoZXJzIHRoZSBncmF5ZWQgc3RhdGVzIG9mIHRoZSBnaXZlbiB3aWRnZXQgYW5kIGl0cwotICAgICAqIGRlc2NlbmRlbnRzLCBmb2xsb3dpbmcgYSBwcmUtb3JkZXIgdHJhdmVyc2FsIG9mIHRoZSB0cmVlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc3VsdCBhIHdyaXRlYWJsZSBsaXN0IG9mIGVsZW1lbnRzIChlbGVtZW50IHR5cGU6IDxjb2RlPk9iamVjdDwvY29kZT4pCi0gICAgICogQHBhcmFtIHdpZGdldCB0aGUgd2lkZ2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGludGVybmFsQ29sbGVjdEdyYXllZChMaXN0IHJlc3VsdCwgV2lkZ2V0IHdpZGdldCkgewotICAgICAgICBJdGVtW10gaXRlbXMgPSBnZXRDaGlsZHJlbih3aWRnZXQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0gJiYgKChUcmVlSXRlbSkgaXRlbSkuZ2V0R3JheWVkKCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbENvbGxlY3RHcmF5ZWQocmVzdWx0LCBpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYWxsIGl0ZW1zIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGdpdmVuIHNldCBvZiBjaGVja2VkIGVsZW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNoZWNrZWRFbGVtZW50cyB0aGUgc2V0IChlbGVtZW50IHR5cGU6IDxjb2RlPk9iamVjdDwvY29kZT4pIG9mIGVsZW1lbnRzIHdoaWNoIGFyZSBjaGVja2VkCi0gICAgICogQHBhcmFtIHdpZGdldCB0aGUgd2lkZ2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGludGVybmFsU2V0Q2hlY2tlZChDdXN0b21IYXNodGFibGUgY2hlY2tlZEVsZW1lbnRzLAotICAgICAgICAgICAgV2lkZ2V0IHdpZGdldCkgewotICAgICAgICBJdGVtW10gaXRlbXMgPSBnZXRDaGlsZHJlbih3aWRnZXQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBpdGVtc1tpXTsKLSAgICAgICAgICAgIE9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVja2VkID0gY2hlY2tlZEVsZW1lbnRzLmNvbnRhaW5zS2V5KGRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChjaGVja2VkICE9IGl0ZW0uZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q2hlY2tlZChjaGVja2VkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbFNldENoZWNrZWQoY2hlY2tlZEVsZW1lbnRzLCBpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGdyYXllZCBzdGF0ZSBvZiBhbGwgaXRlbXMgdG8gY29ycmVzcG9uZCB0byB0aGUgZ2l2ZW4gc2V0IG9mIGdyYXllZCBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBncmF5ZWRFbGVtZW50cyB0aGUgc2V0IChlbGVtZW50IHR5cGU6IDxjb2RlPk9iamVjdDwvY29kZT4pIG9mIGVsZW1lbnRzIHdoaWNoIGFyZSBncmF5ZWQKLSAgICAgKiBAcGFyYW0gd2lkZ2V0IHRoZSB3aWRnZXQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW50ZXJuYWxTZXRHcmF5ZWQoQ3VzdG9tSGFzaHRhYmxlIGdyYXllZEVsZW1lbnRzLCBXaWRnZXQgd2lkZ2V0KSB7Ci0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IGdldENoaWxkcmVuKHdpZGdldCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGl0ZW1zW2ldOwotICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGdyYXllZCA9IGdyYXllZEVsZW1lbnRzLmNvbnRhaW5zS2V5KGRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChncmF5ZWQgIT0gaXRlbS5nZXRHcmF5ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpdGVtLnNldEdyYXllZChncmF5ZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsU2V0R3JheWVkKGdyYXllZEVsZW1lbnRzLCBpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gVmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByZXNlcnZpbmdTZWxlY3Rpb24oUnVubmFibGUgdXBkYXRlQ29kZSkgewotCi0gICAgICAgIGludCBuID0gZ2V0SXRlbUNvdW50KGdldENvbnRyb2woKSk7Ci0gICAgICAgIEN1c3RvbUhhc2h0YWJsZSBjaGVja2VkTm9kZXMgPSBuZXdIYXNodGFibGUobiAqIDIgKyAxKTsKLSAgICAgICAgQ3VzdG9tSGFzaHRhYmxlIGdyYXllZE5vZGVzID0gbmV3SGFzaHRhYmxlKG4gKiAyICsgMSk7Ci0KLSAgICAgICAgZ2F0aGVyU3RhdGUoY2hlY2tlZE5vZGVzLCBncmF5ZWROb2RlcywgZ2V0Q29udHJvbCgpKTsKLQotICAgICAgICBzdXBlci5wcmVzZXJ2aW5nU2VsZWN0aW9uKHVwZGF0ZUNvZGUpOwotCi0gICAgICAgIGFwcGx5U3RhdGUoY2hlY2tlZE5vZGVzLCBncmF5ZWROb2RlcywgZ2V0Q29udHJvbCgpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDaGVja2FibGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hlY2tTdGF0ZUxpc3RlbmVyKElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgY2hlY2tTdGF0ZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNoZWNrYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRDaGVja2VkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIHN0YXRlKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoZWxlbWVudCk7Ci0gICAgICAgIFdpZGdldCB3aWRnZXQgPSBpbnRlcm5hbEV4cGFuZChlbGVtZW50LCBmYWxzZSk7Ci0gICAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotICAgICAgICAgICAgKChUcmVlSXRlbSkgd2lkZ2V0KS5zZXRDaGVja2VkKHN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjaGVja2VkIHN0YXRlIGZvciB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGl0ZW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbSB0aGUgaXRlbQotICAgICAqIEBwYXJhbSBzdGF0ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaXRlbSBzaG91bGQgYmUgY2hlY2tlZCwKLSAgICAgKiAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBzaG91bGQgYmUgdW5jaGVja2VkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldENoZWNrZWRDaGlsZHJlbihJdGVtIGl0ZW0sIGJvb2xlYW4gc3RhdGUpIHsKLSAgICAgICAgY3JlYXRlQ2hpbGRyZW4oaXRlbSk7Ci0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IGdldENoaWxkcmVuKGl0ZW0pOwotICAgICAgICBpZiAoaXRlbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEl0ZW0gaXQgPSBpdGVtc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoaXQuZ2V0RGF0YSgpICE9IG51bGwgJiYgKGl0IGluc3RhbmNlb2YgVHJlZUl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKSBpdDsKLSAgICAgICAgICAgICAgICAgICAgdHJlZUl0ZW0uc2V0Q2hlY2tlZChzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldENoZWNrZWRDaGlsZHJlbih0cmVlSXRlbSwgc3RhdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hpY2ggZWxlbWVudHMgYXJlIGNoZWNrZWQgaW4gdGhpcyB2aWV3ZXIncyB0cmVlLgotICAgICAqIFRoZSBnaXZlbiBsaXN0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyB0aGF0IGFyZSB0byBiZSBjaGVja2VkOwotICAgICAqIGFsbCBvdGhlciBlbGVtZW50cyBhcmUgdG8gYmUgdW5jaGVja2VkLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gcmVzdG9yaW5nIHRoZSBpbnRlcmVzdGluZwotICAgICAqIHN0YXRlIG9mIGEgdmlld2VyIGNhcHR1cmVkIGJ5IGFuIGVhcmxpZXIgY2FsbCB0byA8Y29kZT5nZXRDaGVja2VkRWxlbWVudHM8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50cyB0aGUgYXJyYXkgb2YgY2hlY2tlZCBlbGVtZW50cwotICAgICAqIEBzZWUgI2dldENoZWNrZWRFbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWRFbGVtZW50cyhPYmplY3RbXSBlbGVtZW50cykgewotICAgICAgICBhc3NlcnRFbGVtZW50c05vdE51bGwoZWxlbWVudHMpOwotICAgICAgICBDdXN0b21IYXNodGFibGUgY2hlY2tlZEVsZW1lbnRzID0gbmV3SGFzaHRhYmxlKGVsZW1lbnRzLmxlbmd0aCAqIDIgKyAxKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLSAgICAgICAgICAgIC8vIEVuc3VyZSBpdGVtIGV4aXN0cyBmb3IgZWxlbWVudAotICAgICAgICAgICAgaW50ZXJuYWxFeHBhbmQoZWxlbWVudCwgZmFsc2UpOwotICAgICAgICAgICAgY2hlY2tlZEVsZW1lbnRzLnB1dChlbGVtZW50LCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBDb250cm9sIHRyZWUgPSBnZXRDb250cm9sKCk7Ci0gICAgICAgIHRyZWUuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgaW50ZXJuYWxTZXRDaGVja2VkKGNoZWNrZWRFbGVtZW50cywgdHJlZSk7Ci0gICAgICAgIHRyZWUuc2V0UmVkcmF3KHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGdyYXllZCBzdGF0ZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgaW4gdGhpcyB2aWV3ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotICAgICAqIEBwYXJhbSBzdGF0ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaXRlbSBzaG91bGQgYmUgZ3JheWVkLAotICAgICAqICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHNob3VsZCBiZSB1bmdyYXllZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdyYXkgc3RhdGUgY291bGQgYmUgc2V0LCAKLSAgICAgKiAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRHcmF5ZWQoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gc3RhdGUpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChlbGVtZW50KTsKLSAgICAgICAgV2lkZ2V0IHdpZGdldCA9IGludGVybmFsRXhwYW5kKGVsZW1lbnQsIGZhbHNlKTsKLSAgICAgICAgaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0gICAgICAgICAgICAoKFRyZWVJdGVtKSB3aWRnZXQpLnNldEdyYXllZChzdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgYW5kIGdyYXkgdGhlIHNlbGVjdGlvbiByYXRoZXIgdGhhbiBjYWxsaW5nIGJvdGgKLSAgICAgKiBzZXRHcmF5ZWQgYW5kIHNldENoZWNrZWQgYXMgYW4gb3B0aW1pemF0aW9uLgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBpdGVtIGJlaW5nIGNoZWNrZWQKLSAgICAgKiBAcGFyYW0gc3RhdGUgYSBib29sZWFuIGluZGljYXRpbmcgc2VsZWN0aW9uIG9yIGRlc2VsZWN0aW9uCi0gICAgICogQHJldHVybiBib29sZWFuIGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldEdyYXlDaGVja2VkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIHN0YXRlKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoZWxlbWVudCk7Ci0gICAgICAgIFdpZGdldCB3aWRnZXQgPSBpbnRlcm5hbEV4cGFuZChlbGVtZW50LCBmYWxzZSk7Ci0gICAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotICAgICAgICAgICAgVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgd2lkZ2V0OwotICAgICAgICAgICAgaXRlbS5zZXRDaGVja2VkKHN0YXRlKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0R3JheWVkKHN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoaWNoIGVsZW1lbnRzIGFyZSBncmF5ZWQgaW4gdGhpcyB2aWV3ZXIncyB0cmVlLgotICAgICAqIFRoZSBnaXZlbiBsaXN0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyB0aGF0IGFyZSB0byBiZSBncmF5ZWQ7Ci0gICAgICogYWxsIG90aGVyIGVsZW1lbnRzIGFyZSB0byBiZSB1bmdyYXllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHJlc3RvcmluZyB0aGUgaW50ZXJlc3RpbmcKLSAgICAgKiBzdGF0ZSBvZiBhIHZpZXdlciBjYXB0dXJlZCBieSBhbiBlYXJsaWVyIGNhbGwgdG8gPGNvZGU+Z2V0R3JheWVkRWxlbWVudHM8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50cyB0aGUgYXJyYXkgb2YgZ3JheWVkIGVsZW1lbnRzCi0gICAgICoKLSAgICAgKiBAc2VlICNnZXRHcmF5ZWRFbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdyYXllZEVsZW1lbnRzKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0gICAgICAgIGFzc2VydEVsZW1lbnRzTm90TnVsbChlbGVtZW50cyk7Ci0gICAgICAgIEN1c3RvbUhhc2h0YWJsZSBncmF5ZWRFbGVtZW50cyA9IG5ld0hhc2h0YWJsZShlbGVtZW50cy5sZW5ndGggKiAyICsgMSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICAvLyBFbnN1cmUgaXRlbSBleGlzdHMgZm9yIGVsZW1lbnQKLSAgICAgICAgICAgIGludGVybmFsRXhwYW5kKGVsZW1lbnQsIGZhbHNlKTsKLSAgICAgICAgICAgIGdyYXllZEVsZW1lbnRzLnB1dChlbGVtZW50LCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBDb250cm9sIHRyZWUgPSBnZXRDb250cm9sKCk7Ci0gICAgICAgIHRyZWUuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgaW50ZXJuYWxTZXRHcmF5ZWQoZ3JheWVkRWxlbWVudHMsIHRyZWUpOwotICAgICAgICB0cmVlLnNldFJlZHJhdyh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBncmF5ZWQgc3RhdGUgZm9yIHRoZSBnaXZlbiBlbGVtZW50IGFuZCBpdHMgcGFyZW50cwotICAgICAqIGluIHRoaXMgdmlld2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gc3RhdGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZW0gc2hvdWxkIGJlIGdyYXllZCwKLSAgICAgKiAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBzaG91bGQgYmUgdW5ncmF5ZWQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgYW5kIHRoZSBncmF5Ci0gICAgICogIHN0YXRlIGNvdWxkIGJlIHNldCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKiBAc2VlICNzZXRHcmF5ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRQYXJlbnRzR3JheWVkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIHN0YXRlKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoZWxlbWVudCk7Ci0gICAgICAgIFdpZGdldCB3aWRnZXQgPSBpbnRlcm5hbEV4cGFuZChlbGVtZW50LCBmYWxzZSk7Ci0gICAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotICAgICAgICAgICAgVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgd2lkZ2V0OwotICAgICAgICAgICAgaXRlbS5zZXRHcmF5ZWQoc3RhdGUpOwotICAgICAgICAgICAgaXRlbSA9IGl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGl0ZW0uc2V0R3JheWVkKHN0YXRlKTsKLSAgICAgICAgICAgICAgICBpdGVtID0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2hlY2tlZCBzdGF0ZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgYW5kIGl0cyB2aXNpYmxlCi0gICAgICogY2hpbGRyZW4gaW4gdGhpcyB2aWV3ZXIuCi0gICAgICogQXNzdW1lcyB0aGF0IHRoZSBlbGVtZW50IGhhcyBiZWVuIGV4cGFuZGVkIGJlZm9yZS4gVG8gZW5mb3JjZQotICAgICAqIHRoYXQgdGhlIGl0ZW0gaXMgZXhwYW5kZWQsIGNhbGwgPGNvZGU+ZXhwYW5kVG9MZXZlbDwvY29kZT4KLSAgICAgKiBmb3IgdGhlIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotICAgICAqIEBwYXJhbSBzdGF0ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaXRlbSBzaG91bGQgYmUgY2hlY2tlZCwKLSAgICAgKiAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBzaG91bGQgYmUgdW5jaGVja2VkCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2tlZCBzdGF0ZSBjb3VsZCBiZSBzZXQsIAotICAgICAqICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldFN1YnRyZWVDaGVja2VkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIHN0YXRlKSB7Ci0gICAgICAgIFdpZGdldCB3aWRnZXQgPSBpbnRlcm5hbEV4cGFuZChlbGVtZW50LCBmYWxzZSk7Ci0gICAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotICAgICAgICAgICAgVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgd2lkZ2V0OwotICAgICAgICAgICAgaXRlbS5zZXRDaGVja2VkKHN0YXRlKTsKLSAgICAgICAgICAgIHNldENoZWNrZWRDaGlsZHJlbihpdGVtLCBzdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0byB0aGUgZ2l2ZW4gdmFsdWUgdGhlIGNoZWNrZWQgc3RhdGUgZm9yIGFsbCBlbGVtZW50cyBpbiB0aGlzIHZpZXdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGF0ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCwKLSAgICAgKiAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBzaG91bGQgYmUgdW5jaGVja2VkCi0gICAgICovCi0JcHVibGljIHZvaWQgc2V0QWxsQ2hlY2tlZChib29sZWFuIHN0YXRlKSB7Ci0JCXNldEFsbENoZWNrZWQoc3RhdGUsICBnZXRUcmVlKCkuZ2V0SXRlbXMoKSk7Ci0JCQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBpdGVtcyBhbmQgdGhpZXIgY2hpbGRyZW4gdG8gc3RhdGUuCi0JICogQHBhcmFtIHN0YXRlCi0JICogQHBhcmFtIGl0ZW1zCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFsbENoZWNrZWQoYm9vbGVhbiBzdGF0ZSwgVHJlZUl0ZW1bXSBpdGVtcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpdGVtc1tpXS5zZXRDaGVja2VkKHN0YXRlKTsJCQkKLQkJCVRyZWVJdGVtW10gY2hpbGRyZW4gPSBpdGVtc1tpXS5nZXRJdGVtcygpOwotCQkJc2V0QWxsQ2hlY2tlZChzdGF0ZSwgY2hpbGRyZW4pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Db2xvckNlbGxFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvQ29sb3JDZWxsRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4N2JmMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Db2xvckNlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29sb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci0KLS8qKgotICogQSBjZWxsIGVkaXRvciB0aGF0IG1hbmFnZXMgYSBjb2xvciBmaWVsZC4KLSAqIFRoZSBjZWxsIGVkaXRvcidzIHZhbHVlIGlzIHRoZSBjb2xvciAoYW4gU1dUIDxjb2RlPlJCRzwvY29kZT4pLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ29sb3JDZWxsRWRpdG9yIGV4dGVuZHMgRGlhbG9nQ2VsbEVkaXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBleHRlbnQgaW4gcGl4ZWxzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0VYVEVOVCA9IDE2OwotCi0gICAgLyoqCi0gICAgICogR2FwIGJldHdlZW4gYmV0d2VlbiBpbWFnZSBhbmQgdGV4dCBpbiBwaXhlbHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdBUCA9IDY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29tcG9zaXRlIHdpZGdldCBjb250YWluaW5nIHRoZSBjb2xvciBhbmQgUkdCIGxhYmVsIHdpZGdldHMKLSAgICAgKi8KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGFiZWwgd2lkZ2V0IHNob3dpbmcgdGhlIGN1cnJlbnQgY29sb3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMYWJlbCBjb2xvckxhYmVsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxhYmVsIHdpZGdldCBzaG93aW5nIHRoZSBSR0IgdmFsdWVzLgotICAgICAqLwotICAgIHByaXZhdGUgTGFiZWwgcmdiTGFiZWw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaW1hZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGNsYXNzIGZvciBsYXlpbmcgb3V0IHRoaXMgY2VsbCBlZGl0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBDb2xvckNlbGxMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotICAgICAgICBwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGVkaXRvciwgaW50IHdIaW50LCBpbnQgaEhpbnQsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JjZSkgewotICAgICAgICAgICAgaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUICYmIGhIaW50ICE9IFNXVC5ERUZBVUxUKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQod0hpbnQsIGhIaW50KTsKLSAgICAgICAgICAgIFBvaW50IGNvbG9yU2l6ZSA9IGNvbG9yTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICBmb3JjZSk7Ci0gICAgICAgICAgICBQb2ludCByZ2JTaXplID0gcmdiTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICBmb3JjZSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KGNvbG9yU2l6ZS54ICsgR0FQICsgcmdiU2l6ZS54LCBNYXRoLm1heCgKLSAgICAgICAgICAgICAgICAgICAgY29sb3JTaXplLnksIHJnYlNpemUueSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBlZGl0b3IsIGJvb2xlYW4gZm9yY2UpIHsKLSAgICAgICAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBlZGl0b3IuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgUG9pbnQgY29sb3JTaXplID0gY29sb3JMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgIGZvcmNlKTsKLSAgICAgICAgICAgIFBvaW50IHJnYlNpemUgPSByZ2JMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgIGZvcmNlKTsKLSAgICAgICAgICAgIGludCB0eSA9IChib3VuZHMuaGVpZ2h0IC0gcmdiU2l6ZS55KSAvIDI7Ci0gICAgICAgICAgICBpZiAodHkgPCAwKQotICAgICAgICAgICAgICAgIHR5ID0gMDsKLSAgICAgICAgICAgIGNvbG9yTGFiZWwuc2V0Qm91bmRzKC0xLCAwLCBjb2xvclNpemUueCwgY29sb3JTaXplLnkpOwotICAgICAgICAgICAgcmdiTGFiZWwuc2V0Qm91bmRzKGNvbG9yU2l6ZS54ICsgR0FQIC0gMSwgdHksIGJvdW5kcy53aWR0aAotICAgICAgICAgICAgICAgICAgICAtIGNvbG9yU2l6ZS54IC0gR0FQLCBib3VuZHMuaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY29sb3IgY2VsbCBlZGl0b3IgcGFyZW50ZWQgdW5kZXIgdGhlIGdpdmVuIGNvbnRyb2wuCi0gICAgICogVGhlIGNlbGwgZWRpdG9yIHZhbHVlIGlzIGJsYWNrICg8Y29kZT5SR0IoMCwwLDApPC9jb2RlPikgaW5pdGlhbGx5LCBhbmQgaGFzIG5vIAotICAgICAqIHZhbGlkYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIENvbG9yQ2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBjb2xvciBjZWxsIGVkaXRvciBwYXJlbnRlZCB1bmRlciB0aGUgZ2l2ZW4gY29udHJvbC4KLSAgICAgKiBUaGUgY2VsbCBlZGl0b3IgdmFsdWUgaXMgYmxhY2sgKDxjb2RlPlJHQigwLDAsMCk8L2NvZGU+KSBpbml0aWFsbHksIGFuZCBoYXMgbm8gCi0gICAgICogdmFsaWRhdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIGJpdHMKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICovCi0gICAgcHVibGljIENvbG9yQ2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIGRvU2V0VmFsdWUobmV3IFJHQigwLCAwLCAwKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29sb3IgaW1hZ2UgZGF0YSBmb3IgdGhlIGdpdmVuIGNvbnRyb2wKLSAgICAgKiBhbmQgUkdCIHZhbHVlLiBUaGUgaW1hZ2UncyBzaXplIGlzIGVpdGhlciB0aGUgY29udHJvbCdzIGl0ZW0gZXh0ZW50IAotICAgICAqIG9yIHRoZSBjZWxsIGVkaXRvcidzIGRlZmF1bHQgZXh0ZW50LCB3aGljaCBpcyAxNiBwaXhlbHMgc3F1YXJlLgotICAgICAqCi0gICAgICogQHBhcmFtIHcgdGhlIGNvbnRyb2wKLSAgICAgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yCi0gICAgICovCi0gICAgcHJpdmF0ZSBJbWFnZURhdGEgY3JlYXRlQ29sb3JJbWFnZShDb250cm9sIHcsIFJHQiBjb2xvcikgewotCi0gICAgICAgIEdDIGdjID0gbmV3IEdDKHcpOwotICAgICAgICBGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0gICAgICAgIGludCBzaXplID0gZm0uZ2V0QXNjZW50KCk7Ci0gICAgICAgIGdjLmRpc3Bvc2UoKTsKLQotICAgICAgICBpbnQgaW5kZW50ID0gNjsKLSAgICAgICAgaW50IGV4dGVudCA9IERFRkFVTFRfRVhURU5UOwotICAgICAgICBpZiAodyBpbnN0YW5jZW9mIFRhYmxlKQotICAgICAgICAgICAgZXh0ZW50ID0gKChUYWJsZSkgdykuZ2V0SXRlbUhlaWdodCgpIC0gMTsKLSAgICAgICAgZWxzZSBpZiAodyBpbnN0YW5jZW9mIFRyZWUpCi0gICAgICAgICAgICBleHRlbnQgPSAoKFRyZWUpIHcpLmdldEl0ZW1IZWlnaHQoKSAtIDE7Ci0gICAgICAgIGVsc2UgaWYgKHcgaW5zdGFuY2VvZiBUYWJsZVRyZWUpCi0gICAgICAgICAgICBleHRlbnQgPSAoKFRhYmxlVHJlZSkgdykuZ2V0SXRlbUhlaWdodCgpIC0gMTsKLQotICAgICAgICBpZiAoc2l6ZSA+IGV4dGVudCkKLSAgICAgICAgICAgIHNpemUgPSBleHRlbnQ7Ci0KLSAgICAgICAgaW50IHdpZHRoID0gaW5kZW50ICsgc2l6ZTsKLSAgICAgICAgaW50IGhlaWdodCA9IGV4dGVudDsKLQotICAgICAgICBpbnQgeG9mZnNldCA9IGluZGVudDsKLSAgICAgICAgaW50IHlvZmZzZXQgPSAoaGVpZ2h0IC0gc2l6ZSkgLyAyOwotCi0gICAgICAgIFJHQiBibGFjayA9IG5ldyBSR0IoMCwgMCwgMCk7Ci0gICAgICAgIFBhbGV0dGVEYXRhIGRhdGFQYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7IGJsYWNrLCBibGFjaywKLSAgICAgICAgICAgICAgICBjb2xvciB9KTsKLSAgICAgICAgSW1hZ2VEYXRhIGRhdGEgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIDQsIGRhdGFQYWxldHRlKTsKLSAgICAgICAgZGF0YS50cmFuc3BhcmVudFBpeGVsID0gMDsKLQotICAgICAgICBpbnQgZW5kID0gc2l6ZSAtIDE7Ci0gICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgc2l6ZTsgeSsrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHNpemU7IHgrKykgewotICAgICAgICAgICAgICAgIGlmICh4ID09IDAgfHwgeSA9PSAwIHx8IHggPT0gZW5kIHx8IHkgPT0gZW5kKQotICAgICAgICAgICAgICAgICAgICBkYXRhLnNldFBpeGVsKHggKyB4b2Zmc2V0LCB5ICsgeW9mZnNldCwgMSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkYXRhLnNldFBpeGVsKHggKyB4b2Zmc2V0LCB5ICsgeW9mZnNldCwgMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZ0NlbGxFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGNlbGwpIHsKLSAgICAgICAgQ29sb3IgYmcgPSBjZWxsLmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjZWxsLCBnZXRTdHlsZSgpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEJhY2tncm91bmQoYmcpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBDb2xvckNlbGxMYXlvdXQoKSk7Ci0gICAgICAgIGNvbG9yTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgICAgIGNvbG9yTGFiZWwuc2V0QmFja2dyb3VuZChiZyk7Ci0gICAgICAgIHJnYkxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgICAgICByZ2JMYWJlbC5zZXRCYWNrZ3JvdW5kKGJnKTsKLSAgICAgICAgcmdiTGFiZWwuc2V0Rm9udChjZWxsLmdldEZvbnQoKSk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBDZWxsRWRpdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChpbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBpbWFnZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nQ2VsbEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG9wZW5EaWFsb2dCb3goQ29udHJvbCBjZWxsRWRpdG9yV2luZG93KSB7Ci0gICAgICAgIENvbG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhjZWxsRWRpdG9yV2luZG93LmdldFNoZWxsKCkpOwotICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIGRpYWxvZy5zZXRSR0IoKFJHQikgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIHJldHVybiBkaWFsb2cuZ2V0UkdCKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2dDZWxsRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRlbnRzKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBSR0IgcmdiID0gKFJHQikgdmFsdWU7Ci0gICAgICAgIC8vIFhYWDogV2UgZG9uJ3QgaGF2ZSBhIHZhbHVlIHRoZSBmaXJzdCB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCIuCi0gICAgICAgIGlmIChyZ2IgPT0gbnVsbCkgewotICAgICAgICAgICAgcmdiID0gbmV3IFJHQigwLCAwLCAwKTsKLSAgICAgICAgfQotICAgICAgICAvLyBYWFg6IFdvcmthcm91bmQgZm9yIDFGTVEwUDM6IFNXVDpBTEwgLSBUYWJsZUl0ZW0uc2V0SW1hZ2UgZG9lc24ndCB3b3JrIGlmIHVzaW5nIHRoZSBpZGVudGljYWwgaW1hZ2UuIgotICAgICAgICBpZiAoaW1hZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIGltYWdlLmRpc3Bvc2UoKTsKLQotICAgICAgICBJbWFnZURhdGEgaWQgPSBjcmVhdGVDb2xvckltYWdlKGNvbG9yTGFiZWwuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCksIHJnYik7Ci0gICAgICAgIEltYWdlRGF0YSBtYXNrID0gaWQuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotICAgICAgICBpbWFnZSA9IG5ldyBJbWFnZShjb2xvckxhYmVsLmdldERpc3BsYXkoKSwgaWQsIG1hc2spOwotICAgICAgICBjb2xvckxhYmVsLnNldEltYWdlKGltYWdlKTsKLQotICAgICAgICByZ2JMYWJlbAotICAgICAgICAgICAgICAgIC5zZXRUZXh0KCIoIiArIHJnYi5yZWQgKyAiLCIgKyByZ2IuZ3JlZW4gKyAiLCIgKyByZ2IuYmx1ZSArICIpIik7Ly8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvQ29sdW1uTGF5b3V0RGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Db2x1bW5MYXlvdXREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OTA1MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Db2x1bW5MYXlvdXREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBjb2x1bW4gbGF5b3V0IGRhdGEgZGVzY3JpYmluZyB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIAotICogKGJ5IDxjb2RlPlRhYmxlTGF5b3V0PC9jb2RlPikgdG8gcHJvcGVybHkgbGF5IG91dCBhIHRhYmxlLiAKLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlIHRoZSBmcmFtZXdvcmsuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb2x1bW5MYXlvdXREYXRhIHsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgcmVzaXphYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlc2l6YWJsZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY29sdW1uIGxheW91dCBkYXRhIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNpemFibGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbHVtbiBpcyByZXNpemFibGUsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbHVtbkxheW91dERhdGEoYm9vbGVhbiByZXNpemFibGUpIHsKLSAgICAgICAgdGhpcy5yZXNpemFibGUgPSByZXNpemFibGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Db2x1bW5QaXhlbERhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvQ29sdW1uUGl4ZWxEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYTAzNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Db2x1bW5QaXhlbERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSB3aWR0aCBvZiBhIHRhYmxlIGNvbHVtbiBpbiBwaXhlbHMsIGFuZAotICogd2hldGhlciB0aGUgY29sdW1uIGlzIHJlc2l6YWJsZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENvbHVtblBpeGVsRGF0YSBleHRlbmRzIENvbHVtbkxheW91dERhdGEgewotCi0gICAvKioKLSAgICAgKiBUaGUgY29sdW1uJ3Mgd2lkdGggaW4gcGl4ZWxzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgd2lkdGg7Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRvIGFsbG9jYXRlIGV4dHJhIHdpZHRoIHRvIHRoZSBjb2x1bW4gdG8gYWNjb3VudCBmb3IKLQkgKiB0cmltIHRha2VuIGJ5IHRoZSBjb2x1bW4gaXRzZWxmLgotCSAqIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dAotCSAqIHRoZSByZWNvbW1lbmRlZCBwcmFjdGljZSBpcyB0byBzcGVjaWZ5IDxjb2RlPnRydWU8L2NvZGU+LCBhbmQKLQkgKiBzcGVjaWZ5IHRoZSBkZXNpcmVkIHdpZHRoIGZvciB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uLCByYXRoZXIKLQkgKiB0aGFuIGFkZGluZyBhIGZ1ZGdlIGZhY3RvciB0byB0aGUgc3BlY2lmaWVkIHdpZHRoLgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGRUcmltID0gZmFsc2U7Ci0JCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlc2l6YWJsZSBjb2x1bW4gd2lkdGggb2YgdGhlIGdpdmVuIG51bWJlciBvZiBwaXhlbHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2lkdGhJblBpeGVscyB0aGUgd2lkdGggb2YgY29sdW1uIGluIHBpeGVscwotICAgICAqLwotICAgIHB1YmxpYyBDb2x1bW5QaXhlbERhdGEoaW50IHdpZHRoSW5QaXhlbHMpIHsKLSAgICAgICAgdGhpcyh3aWR0aEluUGl4ZWxzLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbHVtbiB3aWR0aCBvZiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHBpeGVscy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3aWR0aEluUGl4ZWxzIHRoZSB3aWR0aCBvZiBjb2x1bW4gaW4gcGl4ZWxzCi0gICAgICogQHBhcmFtIHJlc2l6YWJsZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29sdW1uIGlzIHJlc2l6YWJsZSwKLSAgICAgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgc2l6ZSBvZiB0aGUgY29sdW1uIGlzIGZpeGVkCi0gICAgICovCi0gICAgcHVibGljIENvbHVtblBpeGVsRGF0YShpbnQgd2lkdGhJblBpeGVscywgYm9vbGVhbiByZXNpemFibGUpIHsKLQkJdGhpcyh3aWR0aEluUGl4ZWxzLCByZXNpemFibGUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBDcmVhdGVzIGEgY29sdW1uIHdpZHRoIG9mIHRoZSBnaXZlbiBudW1iZXIgb2YgcGl4ZWxzLgotCSAqIAotCSAqIEBwYXJhbSB3aWR0aEluUGl4ZWxzCi0JICogICAgICAgICAgICB0aGUgd2lkdGggb2YgY29sdW1uIGluIHBpeGVscwotCSAqIEBwYXJhbSByZXNpemFibGUKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb2x1bW4gaXMgcmVzaXphYmxlLCBhbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBzaXplIG9mIHRoZSBjb2x1bW4gaXMgZml4ZWQKLQkgKiBAcGFyYW0gYWRkVHJpbQotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYWxsb2NhdGUgZXh0cmEgd2lkdGggdG8gdGhlIGNvbHVtbiB0bwotCSAqICAgICAgICAgICAgYWNjb3VudCBmb3IgdHJpbSB0YWtlbiBieSB0aGUgY29sdW1uIGl0c2VsZiwKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiB0byB1c2UgdGhlIGdpdmVuIHdpZHRoIGV4YWN0bHkKLQkgKiBAc2luY2UgMy4xCi0JICovCi0gICAgcHVibGljIENvbHVtblBpeGVsRGF0YShpbnQgd2lkdGhJblBpeGVscywgYm9vbGVhbiByZXNpemFibGUsIGJvb2xlYW4gYWRkVHJpbSkgewotICAgICAgICBzdXBlcihyZXNpemFibGUpOwotICAgICAgICBBc3NlcnQuaXNUcnVlKHdpZHRoSW5QaXhlbHMgPj0gMCk7Ci0gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aEluUGl4ZWxzOwotCQl0aGlzLmFkZFRyaW0gPSBhZGRUcmltOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvQ29sdW1uV2VpZ2h0RGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Db2x1bW5XZWlnaHREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZDE5ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Db2x1bW5XZWlnaHREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgd2lkdGggb2YgYSB0YWJsZSBjb2x1bW4gaW4gdGVybXMgb2YgYSB3ZWlnaHQsIAotICogYSBtaW5pbXVtIHdpZHRoLCBhbmQgd2hldGhlciB0aGUgY29sdW1uIGlzIHJlc2l6YWJsZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENvbHVtbldlaWdodERhdGEgZXh0ZW5kcyBDb2x1bW5MYXlvdXREYXRhIHsKLQotICAgIC8qKiAKLSAgICAgKiBEZWZhdWx0IHdpZHRoIG9mIGEgY29sdW1uIChpbiBwaXhlbHMpLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTklNVU1fV0lEVEggPSAyMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb2x1bW4ncyBtaW5pbXVtIHdpZHRoIGluIHBpeGVscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG1pbmltdW1XaWR0aDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb2x1bW4ncyB3ZWlnaHQuCi0gICAgICovCi0gICAgcHVibGljIGludCB3ZWlnaHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcmVzaXphYmxlIGNvbHVtbiB3aWR0aCB3aXRoIHRoZSBnaXZlbiB3ZWlnaHQgYW5kIGEgZGVmYXVsdAotICAgICAqIG1pbmltdW0gd2lkdGguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2VpZ2h0IHRoZSB3ZWlnaHQgb2YgdGhlIGNvbHVtbgotICAgICAqLwotICAgIHB1YmxpYyBDb2x1bW5XZWlnaHREYXRhKGludCB3ZWlnaHQpIHsKLSAgICAgICAgdGhpcyh3ZWlnaHQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZXNpemFibGUgY29sdW1uIHdpZHRoIHdpdGggdGhlIGdpdmVuIHdlaWdodCBhbmQgbWluaW11bSB3aWR0aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3ZWlnaHQgdGhlIHdlaWdodCBvZiB0aGUgY29sdW1uCi0gICAgICogQHBhcmFtIG1pbmltdW1XaWR0aCB0aGUgbWluaW11bSB3aWR0aCBvZiB0aGUgY29sdW1uIGluIHBpeGVscwotICAgICAqLwotICAgIHB1YmxpYyBDb2x1bW5XZWlnaHREYXRhKGludCB3ZWlnaHQsIGludCBtaW5pbXVtV2lkdGgpIHsKLSAgICAgICAgdGhpcyh3ZWlnaHQsIG1pbmltdW1XaWR0aCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbHVtbiB3aWR0aCB3aXRoIHRoZSBnaXZlbiB3ZWlnaHQgYW5kIG1pbmltdW0gd2lkdGguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2VpZ2h0IHRoZSB3ZWlnaHQgb2YgdGhlIGNvbHVtbgotICAgICAqIEBwYXJhbSBtaW5pbXVtV2lkdGggdGhlIG1pbmltdW0gd2lkdGggb2YgdGhlIGNvbHVtbiBpbiBwaXhlbHMKLSAgICAgKiBAcGFyYW0gcmVzaXphYmxlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb2x1bW4gaXMgcmVzaXphYmxlLAotICAgICAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBzaXplIG9mIHRoZSBjb2x1bW4gaXMgZml4ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sdW1uV2VpZ2h0RGF0YShpbnQgd2VpZ2h0LCBpbnQgbWluaW11bVdpZHRoLCBib29sZWFuIHJlc2l6YWJsZSkgewotICAgICAgICBzdXBlcihyZXNpemFibGUpOwotICAgICAgICBBc3NlcnQuaXNUcnVlKHdlaWdodCA+PSAwKTsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZShtaW5pbXVtV2lkdGggPj0gMCk7Ci0gICAgICAgIHRoaXMud2VpZ2h0ID0gd2VpZ2h0OwotICAgICAgICB0aGlzLm1pbmltdW1XaWR0aCA9IG1pbmltdW1XaWR0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29sdW1uIHdpZHRoIHdpdGggdGhlIGdpdmVuIHdlaWdodCBhbmQgYSBkZWZhdWx0Ci0gICAgICogbWluaW11bSB3aWR0aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3ZWlnaHQgdGhlIHdlaWdodCBvZiB0aGUgY29sdW1uCi0gICAgICogQHBhcmFtIHJlc2l6YWJsZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29sdW1uIGlzIHJlc2l6YWJsZSwKLSAgICAgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgc2l6ZSBvZiB0aGUgY29sdW1uIGlzIGZpeGVkCi0gICAgICovCi0gICAgcHVibGljIENvbHVtbldlaWdodERhdGEoaW50IHdlaWdodCwgYm9vbGVhbiByZXNpemFibGUpIHsKLSAgICAgICAgdGhpcyh3ZWlnaHQsIE1JTklNVU1fV0lEVEgsIHJlc2l6YWJsZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Db21ib0JveENlbGxFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvQ29tYm9Cb3hDZWxsRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OWMzMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Db21ib0JveENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBBIGNlbGwgZWRpdG9yIHRoYXQgcHJlc2VudHMgYSBsaXN0IG9mIGl0ZW1zIGluIGEgY29tYm8gYm94LgotICogVGhlIGNlbGwgZWRpdG9yJ3MgdmFsdWUgaXMgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHNlbGVjdGVkCi0gKiBpdGVtLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hDZWxsRWRpdG9yIGV4dGVuZHMgQ2VsbEVkaXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGlzdCBvZiBpdGVtcyB0byBwcmVzZW50IGluIHRoZSBjb21ibyBib3guCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBpdGVtczsKLQotICAgIC8qKgotICAgICAqIFRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtLgotICAgICAqLwotICAgIGludCBzZWxlY3Rpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VzdG9tIGNvbWJvIGJveCBjb250cm9sLgotICAgICAqLwotICAgIENDb21ibyBjb21ib0JveDsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29tYm9Cb3hDZWxsRWRpdG9yIHN0eWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHRTdHlsZSA9IFNXVC5OT05FOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBjZWxsIGVkaXRvciB3aXRoIG5vIGNvbnRyb2wgYW5kIG5vICBzdCBvZiBjaG9pY2VzLiBJbml0aWFsbHksCi0gICAgICogdGhlIGNlbGwgZWRpdG9yIGhhcyBubyBjZWxsIHZhbGlkYXRvci4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICogQHNlZSBDZWxsRWRpdG9yI3NldFN0eWxlCi0gICAgICogQHNlZSBDZWxsRWRpdG9yI2NyZWF0ZQotICAgICAqIEBzZWUgQ29tYm9Cb3hDZWxsRWRpdG9yI3NldEl0ZW1zCi0gICAgICogQHNlZSBDZWxsRWRpdG9yI2Rpc3Bvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tYm9Cb3hDZWxsRWRpdG9yKCkgewotICAgICAgICBzZXRTdHlsZShkZWZhdWx0U3R5bGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY2VsbCBlZGl0b3Igd2l0aCBhIGNvbWJvIGNvbnRhaW5pbmcgdGhlIGdpdmVuIAotICAgICAqIGxpc3Qgb2YgY2hvaWNlcyBhbmQgcGFyZW50ZWQgdW5kZXIgdGhlIGdpdmVuIGNvbnRyb2wuIFRoZSBjZWxsCi0gICAgICogZWRpdG9yIHZhbHVlIGlzIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtLgotICAgICAqIEluaXRpYWxseSwgdGhlIGNlbGwgZWRpdG9yIGhhcyBubyBjZWxsIHZhbGlkYXRvciBhbmQKLSAgICAgKiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBpcyBzZWxlY3RlZC4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqIEBwYXJhbSBpdGVtcyB0aGUgbGlzdCBvZiBzdHJpbmdzIGZvciB0aGUgY29tYm8gYm94Ci0gICAgICovCi0gICAgcHVibGljIENvbWJvQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBpdGVtcykgewotICAgICAgICB0aGlzKHBhcmVudCwgaXRlbXMsIGRlZmF1bHRTdHlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBjZWxsIGVkaXRvciB3aXRoIGEgY29tYm8gY29udGFpbmluZyB0aGUgZ2l2ZW4gCi0gICAgICogbGlzdCBvZiBjaG9pY2VzIGFuZCBwYXJlbnRlZCB1bmRlciB0aGUgZ2l2ZW4gY29udHJvbC4gVGhlIGNlbGwKLSAgICAgKiBlZGl0b3IgdmFsdWUgaXMgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0uCi0gICAgICogSW5pdGlhbGx5LCB0aGUgY2VsbCBlZGl0b3IgaGFzIG5vIGNlbGwgdmFsaWRhdG9yIGFuZAotICAgICAqIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IGlzIHNlbGVjdGVkLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHBhcmFtIGl0ZW1zIHRoZSBsaXN0IG9mIHN0cmluZ3MgZm9yIHRoZSBjb21ibyBib3gKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIGJpdHMKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICovCi0gICAgcHVibGljIENvbWJvQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBpdGVtcywgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBzZXRJdGVtcyhpdGVtcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjaG9pY2VzIGZvciB0aGUgY29tYm8gYm94Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNob2ljZXMgZm9yIHRoZSBjb21ibyBib3gKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLml0ZW1zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgY2hvaWNlcyBmb3IgdGhlIGNvbWJvIGJveAotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1zIHRoZSBsaXN0IG9mIGNob2ljZXMgZm9yIHRoZSBjb21ibyBib3gKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBpdGVtcykgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGl0ZW1zKTsKLSAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zOwotICAgICAgICBwb3B1bGF0ZUNvbWJvQm94SXRlbXMoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIENlbGxFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgY29tYm9Cb3ggPSBuZXcgQ0NvbWJvKHBhcmVudCwgZ2V0U3R5bGUoKSk7Ci0gICAgICAgIGNvbWJvQm94LnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgY29tYm9Cb3guYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAvLyBob29rIGtleSBwcmVzc2VkIC0gc2VlIFBSIDE0MjAxICAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGtleVJlbGVhc2VPY2N1cmVkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjb21ib0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gY29tYm9Cb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY29tYm9Cb3guYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotICAgICAgICAgICAgICAgICAgICBlLmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGNvbWJvQm94LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBDb21ib0JveENlbGxFZGl0b3IudGhpcy5mb2N1c0xvc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBjb21ib0JveDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+Q29tYm9Cb3hDZWxsRWRpdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAqIHRoaXMgPGNvZGU+Q2VsbEVkaXRvcjwvY29kZT4gZnJhbWV3b3JrIG1ldGhvZCByZXR1cm5zCi0gICAgICogdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gd3JhcHBlZAotICAgICAqICBhcyBhbiA8Y29kZT5JbnRlZ2VyPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZG9HZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHNlbGVjdGlvbik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBDZWxsRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0Rm9jdXMoKSB7Ci0gICAgICAgIGNvbWJvQm94LnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkNvbWJvQm94Q2VsbEVkaXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YKLSAgICAgKiB0aGlzIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IGZyYW1ld29yayBtZXRob2Qgc2V0cyB0aGUgCi0gICAgICogbWluaW11bSB3aWR0aCBvZiB0aGUgY2VsbC4gIFRoZSBtaW5pbXVtIHdpZHRoIGlzIDEwIGNoYXJhY3RlcnMKLSAgICAgKiBpZiA8Y29kZT5jb21ib0JveDwvY29kZT4gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IG9yIDxjb2RlPmRpc3Bvc2VkPC9jb2RlPgotICAgICAqIGVsZXMgaXQgaXMgNjAgcGl4ZWxzIHRvIG1ha2Ugc3VyZSB0aGUgYXJyb3cgYnV0dG9uIGFuZCBzb21lIHRleHQgaXMgdmlzaWJsZS4KLSAgICAgKiBUaGUgbGlzdCBvZiBDQ29tYm8gd2lsbCBiZSB3aWRlIGVub3VnaCB0byBzaG93IGl0cyBsb25nZXN0IGl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIExheW91dERhdGEgZ2V0TGF5b3V0RGF0YSgpIHsKLSAgICAgICAgTGF5b3V0RGF0YSBsYXlvdXREYXRhID0gc3VwZXIuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICBpZiAoKGNvbWJvQm94ID09IG51bGwpIHx8IGNvbWJvQm94LmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIGxheW91dERhdGEubWluaW11bVdpZHRoID0gNjA7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gbWFrZSB0aGUgY29tYm9Cb3ggMTAgY2hhcmFjdGVycyB3aWRlCi0gICAgICAgICAgICBHQyBnYyA9IG5ldyBHQyhjb21ib0JveCk7Ci0gICAgICAgICAgICBsYXlvdXREYXRhLm1pbmltdW1XaWR0aCA9IChnYy5nZXRGb250TWV0cmljcygpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBdmVyYWdlQ2hhcldpZHRoKCkgKiAxMCkgKyAxMDsKLSAgICAgICAgICAgIGdjLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGF5b3V0RGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+Q29tYm9Cb3hDZWxsRWRpdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAqIHRoaXMgPGNvZGU+Q2VsbEVkaXRvcjwvY29kZT4gZnJhbWV3b3JrIG1ldGhvZAotICAgICAqIGFjY2VwdHMgYSB6ZXJvLWJhc2VkIGluZGV4IG9mIGEgc2VsZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBzZWxlY3Rpb24gd3JhcHBlZAotICAgICAqICAgYXMgYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKGNvbWJvQm94ICE9IG51bGwgJiYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikpOwotICAgICAgICBzZWxlY3Rpb24gPSAoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpOwotICAgICAgICBjb21ib0JveC5zZWxlY3Qoc2VsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBsaXN0IG9mIGNob2ljZXMgZm9yIHRoZSBjb21ibyBib3ggZm9yIHRoZSBjdXJyZW50IGNvbnRyb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm9Cb3hJdGVtcygpIHsKLSAgICAgICAgaWYgKGNvbWJvQm94ICE9IG51bGwgJiYgaXRlbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tYm9Cb3gucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGNvbWJvQm94LmFkZChpdGVtc1tpXSwgaSk7Ci0KLSAgICAgICAgICAgIHNldFZhbHVlVmFsaWQodHJ1ZSk7Ci0gICAgICAgICAgICBzZWxlY3Rpb24gPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwbGllcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZhbHVlIGFuZCBkZWFjdGlhdmF0ZXMgdGhlIGNlbGwgZWRpdG9yCi0gICAgICovCi0gICAgdm9pZCBhcHBseUVkaXRvclZhbHVlQW5kRGVhY3RpdmF0ZSgpIHsKLSAgICAgICAgLy8JbXVzdCBzZXQgdGhlIHNlbGVjdGlvbiBiZWZvcmUgZ2V0dGluZyB2YWx1ZQotICAgICAgICBzZWxlY3Rpb24gPSBjb21ib0JveC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBPYmplY3QgbmV3VmFsdWUgPSBkb0dldFZhbHVlKCk7Ci0gICAgICAgIG1hcmtEaXJ0eSgpOwotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBpc0NvcnJlY3QobmV3VmFsdWUpOwotICAgICAgICBzZXRWYWx1ZVZhbGlkKGlzVmFsaWQpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFpc1ZhbGlkKSB7Ci0gICAgICAgIAkvLyBPbmx5IGZvcm1hdCBpZiB0aGUgJ2luZGV4JyBpcyB2YWxpZAotICAgICAgICAJaWYgKGl0ZW1zLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uID49IDAgJiYgc2VsZWN0aW9uIDwgaXRlbXMubGVuZ3RoKSB7Ci0JICAgICAgICAgICAgLy8gdHJ5IHRvIGluc2VydCB0aGUgY3VycmVudCB2YWx1ZSBpbnRvIHRoZSBlcnJvciBtZXNzYWdlLgotCSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRFcnJvck1lc3NhZ2UoKSwKLQkgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGl0ZW1zW3NlbGVjdGlvbl0gfSkpOwotICAgICAgICAJfQotICAgICAgICAJZWxzZSB7Ci0JICAgICAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIHZhbGlkIGluZGV4LCBhc3N1bWUgd2UncmUgdXNpbmcgYW4gJ2VkaXQnCi0gICAgICAgIAkJLy8gY29tYm8gc28gZm9ybWF0IHVzaW5nIGl0cyB0ZXh0IHZhbHVlCi0JICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEVycm9yTWVzc2FnZSgpLAotCSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgY29tYm9Cb3guZ2V0VGV4dCgpIH0pKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotCi0gICAgICAgIGZpcmVBcHBseUVkaXRvclZhbHVlKCk7Ci0gICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IjZm9jdXNMb3N0KCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmb2N1c0xvc3QoKSB7Ci0gICAgICAgIGlmIChpc0FjdGl2YXRlZCgpKSB7Ci0gICAgICAgICAgICBhcHBseUVkaXRvclZhbHVlQW5kRGVhY3RpdmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yI2tleVJlbGVhc2VPY2N1cmVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQga2V5UmVsZWFzZU9jY3VyZWQoS2V5RXZlbnQga2V5RXZlbnQpIHsKLSAgICAgICAgaWYgKGtleUV2ZW50LmNoYXJhY3RlciA9PSAnXHUwMDFiJykgeyAvLyBFc2NhcGUgY2hhcmFjdGVyCi0gICAgICAgICAgICBmaXJlQ2FuY2VsRWRpdG9yKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoa2V5RXZlbnQuY2hhcmFjdGVyID09ICdcdCcpIHsgLy8gdGFiIGtleQotICAgICAgICAgICAgYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvQ29tYm9WaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvQ29tYm9WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0ZWM4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0NvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQSBjb25jcmV0ZSB2aWV3ZXIgYmFzZWQgb24gYW4gU1dUIDxjb2RlPkNvbWJvPC9jb2RlPiBjb250cm9sLiBUaGlzIGNsYXNzIGlzIGludGVuZGVkCi0gKiBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgSkZhY2UgPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4sIHdoaWNoIGRpc3BsYXlzIGl0cyBjb250ZW50Ci0gKiBpbiBhIGNvbWJvIGJveCByYXRoZXIgdGhhbiBhIGxpc3QuIFdoZXJldmVyIHBvc3NpYmxlLCB0aGlzIGNsYXNzIGF0dGVtcHRzIHRvIGJlaGF2ZQotICogbGlrZSBMaXN0Vmlld2VyLiA8cD4KLSAqIAotICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIHByZS1leGlzdGluZyBTV1QgY29tYm8gY29udHJvbCAKLSAqIGFuZCBjb25maWd1cmVkIHdpdGggYSBkb21haW4tc3BlY2lmaWMgY29udGVudCBwcm92aWRlciwgbGFiZWwgcHJvdmlkZXIsIGVsZW1lbnQKLSAqIGZpbHRlciAob3B0aW9uYWwpLCBhbmQgZWxlbWVudCBzb3J0ZXIgKG9wdGlvbmFsKS4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXIKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbWJvVmlld2VyIGV4dGVuZHMgQWJzdHJhY3RMaXN0Vmlld2VyIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgdmlld2VyJ3MgbGlzdCBjb250cm9sLgotICAgICAqLwotICAgIHByaXZhdGUgQ29tYm8gY29tYm87Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29tYm8gdmlld2VyIG9uIGEgbmV3bHktY3JlYXRlZCBjb21ibyBjb250cm9sIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQuCi0gICAgICogVGhlIHZpZXdlciBoYXMgbm8gaW5wdXQsIG5vIGNvbnRlbnQgcHJvdmlkZXIsIGEgZGVmYXVsdCBsYWJlbCBwcm92aWRlciwgCi0gICAgICogbm8gc29ydGVyLCBhbmQgbm8gZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIENvbWJvVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29tYm8gdmlld2VyIG9uIGEgbmV3bHktY3JlYXRlZCBjb21ibyBjb250cm9sIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQuCi0gICAgICogVGhlIGNvbWJvIGNvbnRyb2wgaXMgY3JlYXRlZCB1c2luZyB0aGUgZ2l2ZW4gU1dUIHN0eWxlIGJpdHMuCi0gICAgICogVGhlIHZpZXdlciBoYXMgbm8gaW5wdXQsIG5vIGNvbnRlbnQgcHJvdmlkZXIsIGEgZGVmYXVsdCBsYWJlbCBwcm92aWRlciwgCi0gICAgICogbm8gc29ydGVyLCBhbmQgbm8gZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBTV1Qgc3R5bGUgYml0cwotICAgICAqLwotICAgIHB1YmxpYyBDb21ib1ZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgdGhpcyhuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb21ibyB2aWV3ZXIgb24gdGhlIGdpdmVuIGNvbWJvIGNvbnRyb2wuCi0gICAgICogVGhlIHZpZXdlciBoYXMgbm8gaW5wdXQsIG5vIGNvbnRlbnQgcHJvdmlkZXIsIGEgZGVmYXVsdCBsYWJlbCBwcm92aWRlciwgCi0gICAgICogbm8gc29ydGVyLCBhbmQgbm8gZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0IHRoZSBjb21ibyBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIENvbWJvVmlld2VyKENvbWJvIGxpc3QpIHsKLSAgICAgICAgdGhpcy5jb21ibyA9IGxpc3Q7Ci0gICAgICAgIGhvb2tDb250cm9sKGxpc3QpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RBZGQoU3RyaW5nIHN0cmluZywgaW50IGluZGV4KSB7Ci0gICAgICAgIGNvbWJvLmFkZChzdHJpbmcsIGluZGV4KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0U2V0SXRlbShpbnQgaW5kZXgsIFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgY29tYm8uc2V0SXRlbShpbmRleCwgc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50W10gbGlzdEdldFNlbGVjdGlvbkluZGljZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgaW50W10geyBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpIH07Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBsaXN0R2V0SXRlbUNvdW50KCkgewotICAgICAgICByZXR1cm4gY29tYm8uZ2V0SXRlbUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbGlzdFNldEl0ZW1zKFN0cmluZ1tdIGxhYmVscykgewotICAgICAgICBjb21iby5zZXRJdGVtcyhsYWJlbHMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RSZW1vdmVBbGwoKSB7Ci0gICAgICAgIGNvbWJvLnJlbW92ZUFsbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RSZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgICAgIGNvbWJvLnJlbW92ZShpbmRleCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXIuCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbWJvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBsaXN0IHZpZXdlcidzIGxpc3QgY29udHJvbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxpc3QgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBDb21ibyBnZXRDb21ibygpIHsKLSAgICAgICAgcmV0dXJuIGNvbWJvOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRG8gbm90aGluZyAtLSBjb21ib3Mgb25seSBkaXNwbGF5IHRoZSBzZWxlY3RlZCBlbGVtZW50LCBzbyB0aGVyZSBpcyBubyB3YXkKLSAgICAgKiB3ZSBjYW4gZW5zdXJlIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgaXMgdmlzaWJsZSB3aXRob3V0IGNoYW5naW5nIHRoZSBzZWxlY3Rpb24uCi0gICAgICogTWV0aG9kIGRlZmluZWQgb24gU3RydWN0dXJlZFZpZXdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXZlYWwoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RMaXN0Vmlld2VyI2xpc3RTZWxlY3RBbmRTaG93KGludFtdKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RTZXRTZWxlY3Rpb24oaW50W10gaXhzKSB7Ci0gICAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IGl4cy5sZW5ndGg7IGlkeCsrKSB7Ci0gICAgICAgICAgICBjb21iby5zZWxlY3QoaXhzW2lkeF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdExpc3RWaWV3ZXIjbGlzdERlc2VsZWN0QWxsKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0RGVzZWxlY3RBbGwoKSB7Ci0gICAgICAgIGNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0gICAgICAgIGNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdExpc3RWaWV3ZXIjbGlzdFNob3dTZWxlY3Rpb24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RTaG93U2VsZWN0aW9uKCkgewotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Db250ZW50Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0NvbnRlbnRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2OTcwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0NvbnRlbnRWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQSBjb250ZW50IHZpZXdlciBpcyBhIG1vZGVsLWJhc2VkIGFkYXB0ZXIgb24gYSB3aWRnZXQgd2hpY2ggYWNjZXNzZXMgaXRzCi0gKiBtb2RlbCBieSBtZWFucyBvZiBhIGNvbnRlbnQgcHJvdmlkZXIgYW5kIGEgbGFiZWwgcHJvdmlkZXIuCi0gKiA8cD4KLSAqIEEgdmlld2VyJ3MgbW9kZWwgY29uc2lzdHMgb2YgZWxlbWVudHMsIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMuCi0gKiBBIHZpZXdlciBkZWZpbmVzIGFuZCBpbXBsZW1lbnRzIGdlbmVyaWMgaW5mcmFzdHJ1Y3R1cmUgZm9yIGhhbmRsaW5nIG1vZGVsIAotICogaW5wdXQsIHVwZGF0ZXMsIGFuZCBzZWxlY3Rpb25zIGluIHRlcm1zIG9mIGVsZW1lbnRzLgotICogSW5wdXQgaXMgb2J0YWluZWQgYnkgcXVlcnlpbmcgYW4gPGNvZGU+SUNvbnRlbnRQcm92aWRlcjwvY29kZT4gd2hpY2ggcmV0dXJucwotICogZWxlbWVudHMuIFRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgZGlzcGxheWVkIGRpcmVjdGx5LiAgVGhleSBhcmUKLSAqIG1hcHBlZCB0byBsYWJlbHMsIGNvbnRhaW5pbmcgdGV4dCBhbmQvb3IgYW4gaW1hZ2UsIHVzaW5nIHRoZSB2aWV3ZXIncyAKLSAqIDxjb2RlPklMYWJlbFByb3ZpZGVyPC9jb2RlPi4KLSAqIDwvcD4KLSAqIDxwPgotICogSW1wbGVtZW50aW5nIGEgY29uY3JldGUgY29udGVudCB2aWV3ZXIgdHlwaWNhbGx5IGludm9sdmVzIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0gKiA8dWw+Ci0gKiA8bGk+Ci0gKiBjcmVhdGUgU1dUIGNvbnRyb2xzIGZvciB2aWV3ZXIgKGluIGNvbnN0cnVjdG9yKSAob3B0aW9uYWwpCi0gKiA8L2xpPgotICogPGxpPgotICogaW5pdGlhbGl6ZSBTV1QgY29udHJvbHMgZnJvbSBpbnB1dCAoaW5wdXRDaGFuZ2VkKQotICogPC9saT4KLSAqIDxsaT4KLSAqIGRlZmluZSB2aWV3ZXItc3BlY2lmaWMgdXBkYXRlIG1ldGhvZHMKLSAqIDwvbGk+Ci0gKiA8bGk+Ci0gKiBzdXBwb3J0IHNlbGVjdGlvbnMgKDxjb2RlPnNldFNlbGVjdGlvbjwvY29kZT4sIDxjb2RlPmdldFNlbGVjdGlvbjwvY29kZT4pCi0gKiA8L3VsPgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudFZpZXdlciBleHRlbmRzIFZpZXdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHZpZXdlcidzIGNvbnRlbnQgcHJvdmlkZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHZpZXdlcidzIGlucHV0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqIFRoZSB2aWV3ZXIncyBpbnB1dCBwcm92aWRlcyB0aGUgIm1vZGVsIiBmb3IgdGhlIHZpZXdlcidzIGNvbnRlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgaW5wdXQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhpcyB2aWV3ZXIncyBsYWJlbCBwcm92aWRlci4gSW5pdGlhbGx5IDxjb2RlPm51bGw8L2NvZGU+LCBidXQKLSAgICAgKiBsYXppbHkgaW5pdGlhbGl6ZWQgKHRvIGEgPGNvZGU+U2ltcGxlTGFiZWxQcm92aWRlcjwvY29kZT4pLgotICAgICAqLwotICAgIHByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhpcyB2aWV3ZXIncyBsYWJlbCBwcm92aWRlciBsaXN0ZW5lci4KLSAgICAgKiBOb3RlOiBIYXZpbmcgYSB2aWV3ZXIgcmVnaXN0ZXIgYSBsYWJlbCBwcm92aWRlciBsaXN0ZW5lciB3aXRoCi0gICAgICogYSBsYWJlbCBwcm92aWRlciBhdm9pZHMgaGF2aW5nIHRvIGRlZmluZSBwdWJsaWMgbWV0aG9kcwotICAgICAqIGZvciBpbnRlcm5hbCBldmVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxhYmVsUHJvdmlkZXJMaXN0ZW5lciA9IG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBDb250ZW50Vmlld2VyLnRoaXMuaGFuZGxlTGFiZWxQcm92aWRlckNoYW5nZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb250ZW50IHZpZXdlciB3aXRoIG5vIGlucHV0LCBubyBjb250ZW50IHByb3ZpZGVyLCBhbmQgYQotICAgICAqIGRlZmF1bHQgbGFiZWwgcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRlbnRWaWV3ZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudCBwcm92aWRlciB1c2VkIGJ5IHRoaXMgdmlld2VyLCAKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHZpZXcgZG9lcyBub3QgeWV0IGhhdmUgYSBjb250ZW50Ci0gICAgICogcHJvdmlkZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPkNvbnRlbnRWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGNvbnRlbnQKLSAgICAgKiBwcm92aWRlciByZWNvcmRlZCBpcyBhbiBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZS4gCi0gICAgICogT3ZlcnJpZGluZyB0aGlzIG1ldGhvZCBpcyBnZW5lcmFsbHkgbm90IHJlcXVpcmVkOyAKLSAgICAgKiBob3dldmVyLCBpZiBvdmVycmlkaW5nIGluIGEgc3ViY2xhc3MsIAotICAgICAqIDxjb2RlPnN1cGVyLmdldENvbnRlbnRQcm92aWRlcjwvY29kZT4gbXVzdCBiZSBpbnZva2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgcHJvdmlkZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50UHJvdmlkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkNvbnRlbnRWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUlucHV0UHJvdmlkZXI8L2NvZGU+IAotICAgICAqIG1ldGhvZCByZXR1cm5zIHRoZSBjdXJyZW50IGlucHV0IG9mIHRoaXMgdmlld2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIGlmIG5vbmUuIFRoZSB2aWV3ZXIncyBpbnB1dCBwcm92aWRlcyB0aGUgIm1vZGVsIiBmb3IgdGhlIHZpZXdlcidzCi0gICAgICogY29udGVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewotICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFiZWwgcHJvdmlkZXIgdXNlZCBieSB0aGlzIHZpZXdlci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+Q29udGVudFZpZXdlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbGFiZWwKLSAgICAgKiBwcm92aWRlciByZWNvcmRlZCBpbiBhbiBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZTsgaWYgbm9uZSBoYXMgYmVlbgotICAgICAqIHNldCAod2l0aCA8Y29kZT5zZXRMYWJlbFByb3ZpZGVyPC9jb2RlPikgYSA8Y29kZT5TaW1wbGVMYWJlbFByb3ZpZGVyPC9jb2RlPgotICAgICAqIHdpbGwgYmUgY3JlYXRlZCwgcmVtZW1iZXJlZCwgYW5kIHJldHVybmVkLgotICAgICAqIE92ZXJyaWRpbmcgdGhpcyBtZXRob2QgaXMgZ2VuZXJhbGx5IG5vdCByZXF1aXJlZDsgCi0gICAgICogaG93ZXZlciwgaWYgb3ZlcnJpZGluZyBpbiBhIHN1YmNsYXNzLAotICAgICAqIDxjb2RlPnN1cGVyLmdldExhYmVsUHJvdmlkZXI8L2NvZGU+IG11c3QgYmUgaW52b2tlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbGFiZWwgcHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgSUJhc2VMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIGlmIChsYWJlbFByb3ZpZGVyID09IG51bGwpCi0gICAgICAgICAgICBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIGRpc3Bvc2UgZXZlbnQgb24gdGhpcyB2aWV3ZXIncyBjb250cm9sLgotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5Db250ZW50Vmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkaXNwb3NlcyBvZiB0aGlzCi0gICAgICogdmlld2VyJ3MgbGFiZWwgcHJvdmlkZXIgYW5kIGNvbnRlbnQgcHJvdmlkZXIgKGlmIGl0IGhhcyBvbmUpLgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gYW55IGFkZGl0aW9uYWwKLSAgICAgKiBjbGVhbnVwIG9mIHJlc291cmNlczsgaG93ZXZlciwgb3ZlcnJpZGluZyBtZXRob2RzIG11c3QgaW52b2tlCi0gICAgICogPGNvZGU+c3VwZXIuaGFuZGxlRGlzcG9zZTwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IGEgZGlzcG9zZSBldmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZURpc3Bvc2UoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudFByb3ZpZGVyLmlucHV0Q2hhbmdlZCh0aGlzLCBnZXRJbnB1dCgpLCBudWxsKTsKLSAgICAgICAgICAgIGNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobGFiZWxQcm92aWRlckxpc3RlbmVyKTsKLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgbGFiZWxQcm92aWRlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXQgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYSBsYWJlbCBwcm92aWRlciBjaGFuZ2VkIGV2ZW50LgotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5Db250ZW50Vmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBjYWxscyA8Y29kZT5sYWJlbFByb3ZpZGVyQ2hhbmdlZCgpPC9jb2RlPgotICAgICAqIHRvIGNhdXNlIGEgY29tcGxldGUgcmVmcmVzaCBvZiB0aGUgdmlld2VyLgotICAgICAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50IG9yIGV4dGVuZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlTGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBsYWJlbFByb3ZpZGVyQ2hhbmdlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgZXZlbnQgbGlzdGVuZXIgaG9va3MgdG8gdGhlIGdpdmVuIGNvbnRyb2wuCi0gICAgICogPHA+Ci0gICAgICogQWxsIHN1YmNsYXNzZXMgbXVzdCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhlaXIgY29udHJvbCBpcwotICAgICAqIGZpcnN0IGVzdGFibGlzaGVkLgotICAgICAqIDwvcD4gCi0gICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPkNvbnRlbnRWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGhvb2tzIAotICAgICAqIGRpc3Bvc2UgZXZlbnRzIGZvciB0aGUgZ2l2ZW4gY29udHJvbC4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBpZiB0aGV5IG5lZWQgdG8gYWRkIG90aGVyIGNvbnRyb2wgaG9va3M7Ci0gICAgICogaG93ZXZlciwgPGNvZGU+c3VwZXIuaG9va0NvbnRyb2w8L2NvZGU+IG11c3QgYmUgaW52b2tlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udHJvbCB0aGUgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhvb2tDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotICAgICAgICBjb250cm9sLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRGlzcG9zZShldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoYXQgdGhlIGxhYmVsIHByb3ZpZGVyIGhhcyBjaGFuZ2VkLgotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5Db250ZW50Vmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBjYWxscyA8Y29kZT5yZWZyZXNoKCk8L2NvZGU+LgotICAgICAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50IG9yIGV4dGVuZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoKSB7Ci0gICAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb250ZW50IHByb3ZpZGVyIHVzZWQgYnkgdGhpcyB2aWV3ZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPkNvbnRlbnRWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJlY29yZHMgdGhlIAotICAgICAqIGNvbnRlbnQgcHJvdmlkZXIgaW4gYW4gaW50ZXJuYWwgc3RhdGUgdmFyaWFibGUuCi0gICAgICogT3ZlcnJpZGluZyB0aGlzIG1ldGhvZCBpcyBnZW5lcmFsbHkgbm90IHJlcXVpcmVkOyAKLSAgICAgKiBob3dldmVyLCBpZiBvdmVycmlkaW5nIGluIGEgc3ViY2xhc3MsCi0gICAgICogPGNvZGU+c3VwZXIuc2V0Q29udGVudFByb3ZpZGVyPC9jb2RlPiBtdXN0IGJlIGludm9rZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRlbnRQcm92aWRlciB0aGUgY29udGVudCBwcm92aWRlcgotICAgICAqIEBzZWUgI2dldENvbnRlbnRQcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRQcm92aWRlcihJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGNvbnRlbnRQcm92aWRlcik7Ci0gICAgICAgIElDb250ZW50UHJvdmlkZXIgb2xkQ29udGVudFByb3ZpZGVyID0gdGhpcy5jb250ZW50UHJvdmlkZXI7Ci0gICAgICAgIHRoaXMuY29udGVudFByb3ZpZGVyID0gY29udGVudFByb3ZpZGVyOwotICAgICAgICBpZiAob2xkQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCBjdXJyZW50SW5wdXQgPSBnZXRJbnB1dCgpOwotICAgICAgICAgICAgb2xkQ29udGVudFByb3ZpZGVyLmlucHV0Q2hhbmdlZCh0aGlzLCBjdXJyZW50SW5wdXQsIG51bGwpOwotICAgICAgICAgICAgb2xkQ29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGNvbnRlbnRQcm92aWRlci5pbnB1dENoYW5nZWQodGhpcywgbnVsbCwgY3VycmVudElucHV0KTsKLSAgICAgICAgICAgIHJlZnJlc2goKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db250ZW50Vmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlZpZXdlcjwvY29kZT4KLSAgICAgKiBtZXRob2QgaW52b2tlcyA8Y29kZT5pbnB1dENoYW5nZWQ8L2NvZGU+IG9uIHRoZSBjb250ZW50IHByb3ZpZGVyIGFuZCB0aGVuIHRoZQotICAgICAqIDxjb2RlPmlucHV0Q2hhbmdlZDwvY29kZT4gaG9vayBtZXRob2QuIFRoaXMgbWV0aG9kIGZhaWxzIGlmIHRoaXMgdmlld2VyIGRvZXMKLSAgICAgKiBub3QgaGF2ZSBhIGNvbnRlbnQgcHJvdmlkZXIuIFN1YmNsYXNzZXJzIGFyZSBhZHZpc2VkIHRvIG92ZXJyaWRlIAotICAgICAqIDxjb2RlPmlucHV0Q2hhbmdlZDwvY29kZT4gcmF0aGVyIHRoYW4gdGhpcyBtZXRob2QsIGJ1dCBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kCi0gICAgICogaWYgcmVxdWlyZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0gICAgICAgIEFzc2VydAotICAgICAgICAgICAgICAgIC5pc1RydWUoZ2V0Q29udGVudFByb3ZpZGVyKCkgIT0gbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50Vmlld2VyIG11c3QgaGF2ZSBhIGNvbnRlbnQgcHJvdmlkZXIgd2hlbiBpbnB1dCBpcyBzZXQuIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBPYmplY3Qgb2xkSW5wdXQgPSBnZXRJbnB1dCgpOwotICAgICAgICBjb250ZW50UHJvdmlkZXIuaW5wdXRDaGFuZ2VkKHRoaXMsIG9sZElucHV0LCBpbnB1dCk7Ci0gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLQotICAgICAgICAvLyBjYWxsIGlucHV0IGhvb2sKLSAgICAgICAgaW5wdXRDaGFuZ2VkKHRoaXMuaW5wdXQsIG9sZElucHV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsYWJlbCBwcm92aWRlciBmb3IgdGhpcyB2aWV3ZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPkNvbnRlbnRWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGUKLSAgICAgKiBnaXZlbiBsYWJlbCBwcm92aWRlciBpcyBjb25uZWN0ZWQgdG8gdGhpcyB2aWV3ZXIgYW5kIHRoZQotICAgICAqIGZvcm1lciBsYWJlbCBwcm92aWRlciBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGlzIHZpZXdlci4KLSAgICAgKiBPdmVycmlkaW5nIHRoaXMgbWV0aG9kIGlzIGdlbmVyYWxseSBub3QgcmVxdWlyZWQ7IAotICAgICAqIGhvd2V2ZXIsIGlmIG92ZXJyaWRpbmcgaW4gYSBzdWJjbGFzcywKLSAgICAgKiA8Y29kZT5zdXBlci5zZXRMYWJlbFByb3ZpZGVyPC9jb2RlPiBtdXN0IGJlIGludm9rZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgdGhlIGxhYmVsIHByb3ZpZGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWxQcm92aWRlcihJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgb2xkUHJvdmlkZXIgPSB0aGlzLmxhYmVsUHJvdmlkZXI7Ci0gICAgICAgIC8vIElmIGl0IGhhc24ndCBjaGFuZ2VkLCBkbyBub3RoaW5nLgotICAgICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwcm92aWRlciBpcyBub3QgZGlzcG9zZWQKLSAgICAgICAgLy8gaWYgc2V0IGEgc2Vjb25kIHRpbWUuCi0gICAgICAgIGlmIChsYWJlbFByb3ZpZGVyID09IG9sZFByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9sZFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9sZFByb3ZpZGVyLnJlbW92ZUxpc3RlbmVyKHRoaXMubGFiZWxQcm92aWRlckxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotICAgICAgICBpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKHRoaXMubGFiZWxQcm92aWRlckxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICByZWZyZXNoKCk7Ci0KLSAgICAgICAgLy8gRGlzcG9zZSBvbGQgcHJvdmlkZXIgYWZ0ZXIgcmVmcmVzaCwgc28gdGhhdCBpdGVtcyBuZXZlciByZWZlciB0byBzdGFsZSBpbWFnZXMuCi0gICAgICAgIGlmIChvbGRQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvbGRQcm92aWRlci5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0N1c3RvbUhhc2h0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9DdXN0b21IYXNodGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzN2Y2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0N1c3RvbUhhc2h0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBQZXRlciBTaGlwdG9uIC0gb3JpZ2luYWwgaGFzaHRhYmxlIGltcGxlbWVudGF0aW9uCi0gKiAgICAgTmljayBFZGdhciAtIGFkZGVkIGVsZW1lbnQgY29tcGFyZXIgc3VwcG9ydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDdXN0b21IYXNodGFibGUgYXNzb2NpYXRlcyBrZXlzIHdpdGggdmFsdWVzLiBLZXlzIGFuZCB2YWx1ZXMgY2Fubm90IGJlIG51bGwuCi0gKiBUaGUgc2l6ZSBvZiB0aGUgSGFzaHRhYmxlIGlzIHRoZSBudW1iZXIgb2Yga2V5L3ZhbHVlIHBhaXJzIGl0IGNvbnRhaW5zLgotICogVGhlIGNhcGFjaXR5IGlzIHRoZSBudW1iZXIgb2Yga2V5L3ZhbHVlIHBhaXJzIHRoZSBIYXNodGFibGUgY2FuIGhvbGQuCi0gKiBUaGUgbG9hZCBmYWN0b3IgaXMgYSBmbG9hdCB2YWx1ZSB3aGljaCBkZXRlcm1pbmVzIGhvdyBmdWxsIHRoZSBIYXNodGFibGUKLSAqIGdldHMgYmVmb3JlIGV4cGFuZGluZyB0aGUgY2FwYWNpdHkuIElmIHRoZSBsb2FkIGZhY3RvciBvZiB0aGUgSGFzaHRhYmxlCi0gKiBpcyBleGNlZWRlZCwgdGhlIGNhcGFjaXR5IGlzIGRvdWJsZWQuCi0gKiA8cD4KLSAqIEN1c3RvbUhhc2h0YWJsZSBhbGxvd3MgYSBjdXN0b20gY29tcGFyYXRvciBhbmQgaGFzaCBjb2RlIHByb3ZpZGVyLgotICovCi0vKiBwYWNrYWdlICovZmluYWwgY2xhc3MgQ3VzdG9tSGFzaHRhYmxlIHsKLQotICAgIC8qKgotICAgICAqIEhhc2hNYXBFbnRyeSBpcyBhbiBpbnRlcm5hbCBjbGFzcyB3aGljaCBpcyB1c2VkIHRvIGhvbGQgdGhlIGVudHJpZXMgb2YgYSBIYXNodGFibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGFzaE1hcEVudHJ5IHsKLSAgICAgICAgT2JqZWN0IGtleSwgdmFsdWU7Ci0KLSAgICAgICAgSGFzaE1hcEVudHJ5IG5leHQ7Ci0KLSAgICAgICAgSGFzaE1hcEVudHJ5KE9iamVjdCB0aGVLZXksIE9iamVjdCB0aGVWYWx1ZSkgewotICAgICAgICAgICAga2V5ID0gdGhlS2V5OwotICAgICAgICAgICAgdmFsdWUgPSB0aGVWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEVtcHR5RW51bWVyYXRvciBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEhhc2hFbnVtZXJhdG9yIGltcGxlbWVudHMgRW51bWVyYXRpb24gewotICAgICAgICBib29sZWFuIGtleTsKLQotICAgICAgICBpbnQgc3RhcnQ7Ci0KLSAgICAgICAgSGFzaE1hcEVudHJ5IGVudHJ5OwotCi0gICAgICAgIEhhc2hFbnVtZXJhdG9yKGJvb2xlYW4gaXNLZXkpIHsKLSAgICAgICAgICAgIGtleSA9IGlzS2V5OwotICAgICAgICAgICAgc3RhcnQgPSBmaXJzdFNsb3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIHdoaWxlIChzdGFydCA8PSBsYXN0U2xvdCkKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudERhdGFbc3RhcnQrK10gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGVsZW1lbnREYXRhW3N0YXJ0IC0gMV07Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0gICAgICAgICAgICBpZiAoaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0ga2V5ID8gZW50cnkua2V5IDogZW50cnkudmFsdWU7Ci0gICAgICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdHJhbnNpZW50IGludCBlbGVtZW50Q291bnQ7Ci0KLSAgICB0cmFuc2llbnQgSGFzaE1hcEVudHJ5W10gZWxlbWVudERhdGE7Ci0KLSAgICBwcml2YXRlIGZsb2F0IGxvYWRGYWN0b3I7Ci0KLSAgICBwcml2YXRlIGludCB0aHJlc2hvbGQ7Ci0KLSAgICB0cmFuc2llbnQgaW50IGZpcnN0U2xvdCA9IDA7Ci0KLSAgICB0cmFuc2llbnQgaW50IGxhc3RTbG90ID0gLTE7Ci0KLSAgICB0cmFuc2llbnQgcHJpdmF0ZSBJRWxlbWVudENvbXBhcmVyIGNvbXBhcmVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1wdHlFbnVtZXJhdG9yIGVtcHR5RW51bWVyYXRvciA9IG5ldyBFbXB0eUVudW1lcmF0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGNhcGFjaXR5IHVzZWQgd2hlbiBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NBUEFDSVRZID0gMTM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEhhc2h0YWJsZSB1c2luZyB0aGUgZGVmYXVsdCBjYXBhY2l0eQotICAgICAqIGFuZCBsb2FkIGZhY3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ3VzdG9tSGFzaHRhYmxlKCkgewotICAgICAgICB0aGlzKDEzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEhhc2h0YWJsZSB1c2luZyB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5Ci0gICAgICogYW5kIHRoZSBkZWZhdWx0IGxvYWQgZmFjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0gICAgICovCi0gICAgcHVibGljIEN1c3RvbUhhc2h0YWJsZShpbnQgY2FwYWNpdHkpIHsKLSAgICAgICAgdGhpcyhjYXBhY2l0eSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBoYXNoIHRhYmxlIHdpdGggdGhlIGRlZmF1bHQgY2FwYWNpdHkgYW5kIHRoZSBnaXZlbgotICAgICAqIGVsZW1lbnQgY29tcGFyZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcGFyZXIgdGhlIGVsZW1lbnQgY29tcGFyZXIgdG8gdXNlIHRvIGNvbXBhcmUga2V5cyBhbmQgb2J0YWluCi0gICAgICogICBoYXNoIGNvZGVzIGZvciBrZXlzLCBvciA8Y29kZT5udWxsPC9jb2RlPiAgdG8gdXNlIHRoZSBub3JtYWwgCi0gICAgICogICA8Y29kZT5lcXVhbHM8L2NvZGU+IGFuZCA8Y29kZT5oYXNoQ29kZTwvY29kZT4gbWV0aG9kcwotICAgICAqLwotICAgIHB1YmxpYyBDdXN0b21IYXNodGFibGUoSUVsZW1lbnRDb21wYXJlciBjb21wYXJlcikgewotICAgICAgICB0aGlzKERFRkFVTFRfQ0FQQUNJVFksIGNvbXBhcmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGhhc2ggdGFibGUgd2l0aCB0aGUgZ2l2ZW4gY2FwYWNpdHkgYW5kIHRoZSBnaXZlbgotICAgICAqIGVsZW1lbnQgY29tcGFyZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhcGFjaXR5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGNhbiBiZSBhZGRlZCB3aXRob3V0Ci0gICAgICogICByZWhhc2hpbmcKLSAgICAgKiBAcGFyYW0gY29tcGFyZXIgdGhlIGVsZW1lbnQgY29tcGFyZXIgdG8gdXNlIHRvIGNvbXBhcmUga2V5cyBhbmQgb2J0YWluCi0gICAgICogICBoYXNoIGNvZGVzIGZvciBrZXlzLCBvciA8Y29kZT5udWxsPC9jb2RlPiAgdG8gdXNlIHRoZSBub3JtYWwgCi0gICAgICogICA8Y29kZT5lcXVhbHM8L2NvZGU+IGFuZCA8Y29kZT5oYXNoQ29kZTwvY29kZT4gbWV0aG9kcwotICAgICAqLwotICAgIHB1YmxpYyBDdXN0b21IYXNodGFibGUoaW50IGNhcGFjaXR5LCBJRWxlbWVudENvbXBhcmVyIGNvbXBhcmVyKSB7Ci0gICAgICAgIGlmIChjYXBhY2l0eSA+PSAwKSB7Ci0gICAgICAgICAgICBlbGVtZW50Q291bnQgPSAwOwotICAgICAgICAgICAgZWxlbWVudERhdGEgPSBuZXcgSGFzaE1hcEVudHJ5W2NhcGFjaXR5ID09IDAgPyAxIDogY2FwYWNpdHldOwotICAgICAgICAgICAgZmlyc3RTbG90ID0gZWxlbWVudERhdGEubGVuZ3RoOwotICAgICAgICAgICAgbG9hZEZhY3RvciA9IDAuNzVmOwotICAgICAgICAgICAgY29tcHV0ZU1heFNpemUoKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIHRoaXMuY29tcGFyZXIgPSBjb21wYXJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGhhc2ggdGFibGUgd2l0aCBlbm91Z2ggY2FwYWNpdHkgdG8gaG9sZCBhbGwga2V5cyBpbiB0aGUKLSAgICAgKiBnaXZlbiBoYXNoIHRhYmxlLCB0aGVuIGFkZHMgYWxsIGtleS92YWx1ZSBwYWlycyBpbiB0aGUgZ2l2ZW4gaGFzaCB0YWJsZQotICAgICAqIHRvIHRoZSBuZXcgb25lLCB1c2luZyB0aGUgZ2l2ZW4gZWxlbWVudCBjb21wYXJlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2FwYWNpdHkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgY2FuIGJlIGFkZGVkIHdpdGhvdXQKLSAgICAgKiAgIHJlaGFzaGluZwotICAgICAqIEBwYXJhbSBjb21wYXJlciB0aGUgZWxlbWVudCBjb21wYXJlciB0byB1c2UgdG8gY29tcGFyZSBrZXlzIGFuZCBvYnRhaW4KLSAgICAgKiAgIGhhc2ggY29kZXMgZm9yIGtleXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+ICB0byB1c2UgdGhlIG5vcm1hbCAKLSAgICAgKiAgIDxjb2RlPmVxdWFsczwvY29kZT4gYW5kIDxjb2RlPmhhc2hDb2RlPC9jb2RlPiBtZXRob2RzCi0gICAgICovCi0gICAgcHVibGljIEN1c3RvbUhhc2h0YWJsZShDdXN0b21IYXNodGFibGUgdGFibGUsIElFbGVtZW50Q29tcGFyZXIgY29tcGFyZXIpIHsKLSAgICAgICAgdGhpcyh0YWJsZS5zaXplKCkgKiAyLCBjb21wYXJlcik7Ci0gICAgICAgIGZvciAoaW50IGkgPSB0YWJsZS5lbGVtZW50RGF0YS5sZW5ndGg7IC0taSA+PSAwOykgewotICAgICAgICAgICAgSGFzaE1hcEVudHJ5IGVudHJ5ID0gdGFibGUuZWxlbWVudERhdGFbaV07Ci0gICAgICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHB1dChlbnRyeS5rZXksIGVudHJ5LnZhbHVlKTsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29tcHV0ZU1heFNpemUoKSB7Ci0gICAgICAgIHRocmVzaG9sZCA9IChpbnQpIChlbGVtZW50RGF0YS5sZW5ndGggKiBsb2FkRmFjdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbnN3ZXJzIGlmIHRoaXMgSGFzaHRhYmxlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFzIGEga2V5Ci0gICAgICogb2Ygb25lIG9mIHRoZSBrZXkvdmFsdWUgcGFpcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0JCWtleQl0aGUgb2JqZWN0IHRvIGxvb2sgZm9yIGFzIGEga2V5IGluIHRoaXMgSGFzaHRhYmxlCi0gICAgICogQHJldHVybgkJdHJ1ZSBpZiBvYmplY3QgaXMgYSBrZXkgaW4gdGhpcyBIYXNodGFibGUsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldEVudHJ5KGtleSkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbnN3ZXJzIGFuIEVudW1lcmF0aW9uIG9uIHRoZSB2YWx1ZXMgb2YgdGhpcyBIYXNodGFibGUuIFRoZQotICAgICAqIHJlc3VsdHMgb2YgdGhlIEVudW1lcmF0aW9uIG1heSBiZSBhZmZlY3RlZCBpZiB0aGUgY29udGVudHMKLSAgICAgKiBvZiB0aGlzIEhhc2h0YWJsZSBhcmUgbW9kaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCQlhbiBFbnVtZXJhdGlvbiBvZiB0aGUgdmFsdWVzIG9mIHRoaXMgSGFzaHRhYmxlCi0gICAgICovCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewotICAgICAgICBpZiAoZWxlbWVudENvdW50ID09IDApCi0gICAgICAgICAgICByZXR1cm4gZW1wdHlFbnVtZXJhdG9yOwotICAgICAgICByZXR1cm4gbmV3IEhhc2hFbnVtZXJhdG9yKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbnN3ZXJzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgaW4KLSAgICAgKiB0aGlzIEhhc2h0YWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbQkJa2V5CXRoZSBrZXkgb2YgdGhlIHZhbHVlIHJldHVybmVkCi0gICAgICogQHJldHVybgkJdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgbnVsbCBpZiB0aGUgc3BlY2lmaWVkIGtleQotICAgICAqCQkJCWRvZXMgbm90IGV4aXN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICBpbnQgaW5kZXggPSAoaGFzaENvZGUoa2V5KSAmIDB4N0ZGRkZGRkYpICUgZWxlbWVudERhdGEubGVuZ3RoOwotICAgICAgICBIYXNoTWFwRW50cnkgZW50cnkgPSBlbGVtZW50RGF0YVtpbmRleF07Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoa2V5RXF1YWxzKGtleSwgZW50cnkua2V5KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBIYXNoTWFwRW50cnkgZ2V0RW50cnkoT2JqZWN0IGtleSkgewotICAgICAgICBpbnQgaW5kZXggPSAoaGFzaENvZGUoa2V5KSAmIDB4N0ZGRkZGRkYpICUgZWxlbWVudERhdGEubGVuZ3RoOwotICAgICAgICBIYXNoTWFwRW50cnkgZW50cnkgPSBlbGVtZW50RGF0YVtpbmRleF07Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoa2V5RXF1YWxzKGtleSwgZW50cnkua2V5KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VycyB0aGUgaGFzaCBjb2RlIGZvciB0aGUgZ2l2ZW4ga2V5LgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGhhc2hDb2RlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGNvbXBhcmVyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4ga2V5Lmhhc2hDb2RlKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlci5oYXNoQ29kZShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBrZXlzIGZvciBlcXVhbGl0eS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4ga2V5RXF1YWxzKE9iamVjdCBhLCBPYmplY3QgYikgewotICAgICAgICBpZiAoY29tcGFyZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBhLmVxdWFscyhiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVyLmVxdWFscyhhLCBiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbnN3ZXJzIGFuIEVudW1lcmF0aW9uIG9uIHRoZSBrZXlzIG9mIHRoaXMgSGFzaHRhYmxlLiBUaGUKLSAgICAgKiByZXN1bHRzIG9mIHRoZSBFbnVtZXJhdGlvbiBtYXkgYmUgYWZmZWN0ZWQgaWYgdGhlIGNvbnRlbnRzCi0gICAgICogb2YgdGhpcyBIYXNodGFibGUgYXJlIG1vZGlmaWVkLgotICAgICAqCi0gICAgICogQHJldHVybgkJYW4gRW51bWVyYXRpb24gb2YgdGhlIGtleXMgb2YgdGhpcyBIYXNodGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgRW51bWVyYXRpb24ga2V5cygpIHsKLSAgICAgICAgaWYgKGVsZW1lbnRDb3VudCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGVtcHR5RW51bWVyYXRvcjsKLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoRW51bWVyYXRvcih0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NvY2lhdGUgdGhlIHNwZWNpZmllZCB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgSGFzaHRhYmxlLgotICAgICAqIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMsIHRoZSBvbGQgdmFsdWUgaXMgcmVwbGFjZWQuIFRoZSBrZXkgYW5kIHZhbHVlCi0gICAgICogY2Fubm90IGJlIG51bGwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0JCWtleQl0aGUga2V5IHRvIGFkZAotICAgICAqIEBwYXJhbQkJdmFsdWUJdGhlIHZhbHVlIHRvIGFkZAotICAgICAqIEByZXR1cm4JCXRoZSBvbGQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBudWxsIGlmIHRoZSBrZXkgZGlkCi0gICAgICoJCQkJbm90IGV4aXN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChrZXkgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAoaGFzaENvZGUoa2V5KSAmIDB4N0ZGRkZGRkYpICUgZWxlbWVudERhdGEubGVuZ3RoOwotICAgICAgICAgICAgSGFzaE1hcEVudHJ5IGVudHJ5ID0gZWxlbWVudERhdGFbaW5kZXhdOwotICAgICAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwgJiYgIWtleUVxdWFscyhrZXksIGVudHJ5LmtleSkpCi0gICAgICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwotICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoKytlbGVtZW50Q291bnQgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVoYXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gKGhhc2hDb2RlKGtleSkgJiAweDdGRkZGRkZGKSAlIGVsZW1lbnREYXRhLmxlbmd0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgZmlyc3RTbG90KQotICAgICAgICAgICAgICAgICAgICBmaXJzdFNsb3QgPSBpbmRleDsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiBsYXN0U2xvdCkKLSAgICAgICAgICAgICAgICAgICAgbGFzdFNsb3QgPSBpbmRleDsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IG5ldyBIYXNoTWFwRW50cnkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgZW50cnkubmV4dCA9IGVsZW1lbnREYXRhW2luZGV4XTsKLSAgICAgICAgICAgICAgICBlbGVtZW50RGF0YVtpbmRleF0gPSBlbnRyeTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBlbnRyeS52YWx1ZTsKLSAgICAgICAgICAgIGVudHJ5LmtleSA9IGtleTsgLy8gaW1wb3J0YW50IHRvIGF2b2lkIGhhbmdpbmcgb250byBrZXlzIHRoYXQgYXJlIGVxdWFsIGJ1dCAib2xkIiAtLSBzZWUgYnVnIDMwNjA3Ci0gICAgICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmNyZWFzZXMgdGhlIGNhcGFjaXR5IG9mIHRoaXMgSGFzaHRhYmxlLiBUaGlzIG1ldGhvZCBpcyBzZW50IHdoZW4KLSAgICAgKiB0aGUgc2l6ZSBvZiB0aGlzIEhhc2h0YWJsZSBleGNlZWRzIHRoZSBsb2FkIGZhY3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVoYXNoKCkgewotICAgICAgICBpbnQgbGVuZ3RoID0gZWxlbWVudERhdGEubGVuZ3RoIDw8IDE7Ci0gICAgICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICAgICAgICAgIGxlbmd0aCA9IDE7Ci0gICAgICAgIGZpcnN0U2xvdCA9IGxlbmd0aDsKLSAgICAgICAgbGFzdFNsb3QgPSAtMTsKLSAgICAgICAgSGFzaE1hcEVudHJ5W10gbmV3RGF0YSA9IG5ldyBIYXNoTWFwRW50cnlbbGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGVsZW1lbnREYXRhLmxlbmd0aDsgLS1pID49IDA7KSB7Ci0gICAgICAgICAgICBIYXNoTWFwRW50cnkgZW50cnkgPSBlbGVtZW50RGF0YVtpXTsKLSAgICAgICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gKGhhc2hDb2RlKGVudHJ5LmtleSkgJiAweDdGRkZGRkZGKSAlIGxlbmd0aDsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBmaXJzdFNsb3QpCi0gICAgICAgICAgICAgICAgICAgIGZpcnN0U2xvdCA9IGluZGV4OwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IGxhc3RTbG90KQotICAgICAgICAgICAgICAgICAgICBsYXN0U2xvdCA9IGluZGV4OwotICAgICAgICAgICAgICAgIEhhc2hNYXBFbnRyeSBuZXh0ID0gZW50cnkubmV4dDsKLSAgICAgICAgICAgICAgICBlbnRyeS5uZXh0ID0gbmV3RGF0YVtpbmRleF07Ci0gICAgICAgICAgICAgICAgbmV3RGF0YVtpbmRleF0gPSBlbnRyeTsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IG5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudERhdGEgPSBuZXdEYXRhOwotICAgICAgICBjb21wdXRlTWF4U2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUga2V5L3ZhbHVlIHBhaXIgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBmcm9tIHRoaXMgSGFzaHRhYmxlLgotICAgICAqCi0gICAgICogQHBhcmFtCQlrZXkJdGhlIGtleSB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuCQl0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBudWxsIGlmIHRoZSBzcGVjaWZpZWQga2V5Ci0gICAgICoJCQkJZGlkIG5vdCBleGlzdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgSGFzaE1hcEVudHJ5IGxhc3QgPSBudWxsOwotICAgICAgICBpbnQgaW5kZXggPSAoaGFzaENvZGUoa2V5KSAmIDB4N0ZGRkZGRkYpICUgZWxlbWVudERhdGEubGVuZ3RoOwotICAgICAgICBIYXNoTWFwRW50cnkgZW50cnkgPSBlbGVtZW50RGF0YVtpbmRleF07Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsICYmICFrZXlFcXVhbHMoa2V5LCBlbnRyeS5rZXkpKSB7Ci0gICAgICAgICAgICBsYXN0ID0gZW50cnk7Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsYXN0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgZWxlbWVudERhdGFbaW5kZXhdID0gZW50cnkubmV4dDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBsYXN0Lm5leHQgPSBlbnRyeS5uZXh0OwotICAgICAgICAgICAgZWxlbWVudENvdW50LS07Ci0gICAgICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VycyB0aGUgbnVtYmVyIG9mIGtleS92YWx1ZSBwYWlycyBpbiB0aGlzIEhhc2h0YWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4JCXRoZSBudW1iZXIgb2Yga2V5L3ZhbHVlIHBhaXJzIGluIHRoaXMgSGFzaHRhYmxlCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudENvdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuc3dlcnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEhhc2h0YWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4JCXRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBIYXNodGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoc2l6ZSgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gInt9IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJ3snKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGVsZW1lbnREYXRhLmxlbmd0aDsgLS1pID49IDA7KSB7Ci0gICAgICAgICAgICBIYXNoTWFwRW50cnkgZW50cnkgPSBlbGVtZW50RGF0YVtpXTsKLSAgICAgICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChlbnRyeS5rZXkpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJz0nKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGVudHJ5LnZhbHVlKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFJlbW92ZSB0aGUgbGFzdCAiLCAiCi0gICAgICAgIGlmIChlbGVtZW50Q291bnQgPiAwKQotICAgICAgICAgICAgYnVmZmVyLnNldExlbmd0aChidWZmZXIubGVuZ3RoKCkgLSAyKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnfScpOwotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9EZWNvcmF0aW5nTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9EZWNvcmF0aW5nTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDcxMGM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBBIGRlY29yYXRpbmcgbGFiZWwgcHJvdmlkZXIgaXMgYSBsYWJlbCBwcm92aWRlciB3aGljaCBjb21iaW5lcyAKLSAqIGEgbmVzdGVkIGxhYmVsIHByb3ZpZGVyIGFuZCBhbiBvcHRpb25hbCBkZWNvcmF0b3IuCi0gKiBUaGUgZGVjb3JhdG9yIGRlY29yYXRlcyB0aGUgbGFiZWwgdGV4dCwgaW1hZ2UsIGZvbnQgYW5kIGNvbG9ycyBwcm92aWRlZCBieSAKLSAqIHRoZSBuZXN0ZWQgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cwotICAgICAgICBJTGFiZWxQcm92aWRlciwgSVZpZXdlckxhYmVsUHJvdmlkZXIsIElDb2xvclByb3ZpZGVyLCBJRm9udFByb3ZpZGVyIHsKLQkKLQkvKioKLQkgKiBUaGUgVVBEQVRFX0xBQkVMIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGxhYmVsIHNob3VsZCAKLQkgKiBiZSB1cGRhdGVkIGZvciB0aGUgZWxlbWVudCBwYXNzZWQgdG8gdGhlIHZhbGlkYXRvci4KLQkgKiBAc2VlIElMYWJlbFVwZGF0ZVZhbGlkYXRvcgotCSAqIEBkZXByZWNhdGVkIHNob3VsZCBiZSByZW1vdmVkIGJ5IDMuMiBNNQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9MQUJFTCA9ICJVUERBVEVfTEFCRUwiOy8vJE5PTi1OTFMtMSQKLQkKLSAgICBwcml2YXRlIElMYWJlbFByb3ZpZGVyIHByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yOwotCi0gICAgLy8gTmVlZCB0byBrZWVwIG91ciBvd24gbGlzdCBvZiBsaXN0ZW5lcnMKLSAgICBwcml2YXRlIExpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQlwcml2YXRlIElEZWNvcmF0aW9uQ29udGV4dCBkZWNvcmF0aW9uQ29udGV4dCA9IERlY29yYXRpb25Db250ZXh0LkRFRkFVTFRfQ09OVEVYVDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkZWNvcmF0aW5nIGxhYmVsIHByb3ZpZGVyIHdoaWNoIHVzZXMgdGhlIGdpdmVuIGxhYmVsIGRlY29yYXRvcgotICAgICAqIHRvIGRlY29yYXRlIGxhYmVscyBwcm92aWRlZCBieSB0aGUgZ2l2ZW4gbGFiZWwgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIG5lc3RlZCBsYWJlbCBwcm92aWRlcgotICAgICAqIEBwYXJhbSBkZWNvcmF0b3IgdGhlIGxhYmVsIGRlY29yYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZGVjb3JhdG9yIGlzIHRvIGJlIHVzZWQgaW5pdGlhbGx5Ci0gICAgICovCi0gICAgcHVibGljIERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHByb3ZpZGVyKTsKLSAgICAgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICB0aGlzLmRlY29yYXRvciA9IGRlY29yYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+RGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUJhc2VMYWJlbFByb3ZpZGVyPC9jb2RlPiBtZXRob2QKLSAgICAgKiBhZGRzIHRoZSBsaXN0ZW5lciB0byBib3RoIHRoZSBuZXN0ZWQgbGFiZWwgcHJvdmlkZXIgYW5kIHRoZSBsYWJlbCBkZWNvcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgYSBsYWJlbCBwcm92aWRlciBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBwcm92aWRlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGlmIChkZWNvcmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZGVjb3JhdG9yLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+RGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SUJhc2VMYWJlbFByb3ZpZGVyPC9jb2RlPiBtZXRob2QKLSAgICAgKiBkaXNwb3NlcyBib3RoIHRoZSBuZXN0ZWQgbGFiZWwgcHJvdmlkZXIgYW5kIHRoZSBsYWJlbCBkZWNvcmF0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgcHJvdmlkZXIuZGlzcG9zZSgpOwotICAgICAgICBpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRlY29yYXRvci5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+RGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+IG1ldGhvZCByZXR1cm5zIHRoZSBpbWFnZSBwcm92aWRlZAotICAgICAqIGJ5IHRoZSBuZXN0ZWQgbGFiZWwgcHJvdmlkZXIncyA8Y29kZT5nZXRJbWFnZTwvY29kZT4gbWV0aG9kLCAKLSAgICAgKiBkZWNvcmF0ZWQgd2l0aCB0aGUgZGVjb3JhdGlvbiBwcm92aWRlZCBieSB0aGUgbGFiZWwgZGVjb3JhdG9yJ3MKLSAgICAgKiA8Y29kZT5kZWNvcmF0ZUltYWdlPC9jb2RlPiBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIEltYWdlIGltYWdlID0gcHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0gICAgICAgIGlmIChkZWNvcmF0b3IgIT0gbnVsbCkgewotICAgICAgICAJaWYgKGRlY29yYXRvciBpbnN0YW5jZW9mIExhYmVsRGVjb3JhdG9yKSB7Ci0JCQkJTGFiZWxEZWNvcmF0b3IgbGQyID0gKExhYmVsRGVjb3JhdG9yKSBkZWNvcmF0b3I7Ci0JICAgICAgICAgICAgSW1hZ2UgZGVjb3JhdGVkID0gbGQyLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIGVsZW1lbnQsIGdldERlY29yYXRpb25Db250ZXh0KCkpOwotCSAgICAgICAgICAgIGlmIChkZWNvcmF0ZWQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICByZXR1cm4gZGVjb3JhdGVkOwotCSAgICAgICAgICAgIH0KLQkJCX0gZWxzZSB7Ci0JICAgICAgICAgICAgSW1hZ2UgZGVjb3JhdGVkID0gZGVjb3JhdG9yLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIGVsZW1lbnQpOwotCSAgICAgICAgICAgIGlmIChkZWNvcmF0ZWQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICByZXR1cm4gZGVjb3JhdGVkOwotCSAgICAgICAgICAgIH0KLQkJCX0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotCi0JLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFiZWwgZGVjb3JhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGhhcyBiZWVuIHNldC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxhYmVsIGRlY29yYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBoYXMgYmVlbiBzZXQuCi0gICAgICovCi0gICAgcHVibGljIElMYWJlbERlY29yYXRvciBnZXRMYWJlbERlY29yYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGRlY29yYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXN0ZWQgbGFiZWwgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXN0ZWQgbGFiZWwgcHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIHByb3ZpZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5JTGFiZWxQcm92aWRlcjwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIHRleHQgbGFiZWwgcHJvdmlkZWQKLSAgICAgKiBieSB0aGUgbmVzdGVkIGxhYmVsIHByb3ZpZGVyJ3MgPGNvZGU+Z2V0VGV4dDwvY29kZT4gbWV0aG9kLCAKLSAgICAgKiBkZWNvcmF0ZWQgd2l0aCB0aGUgZGVjb3JhdGlvbiBwcm92aWRlZCBieSB0aGUgbGFiZWwgZGVjb3JhdG9yJ3MKLSAgICAgKiA8Y29kZT5kZWNvcmF0ZVRleHQ8L2NvZGU+IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBwcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotICAgICAgICBpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKLSAgICAgICAgCWlmIChkZWNvcmF0b3IgaW5zdGFuY2VvZiBMYWJlbERlY29yYXRvcikgewotCQkJCUxhYmVsRGVjb3JhdG9yIGxkMiA9IChMYWJlbERlY29yYXRvcikgZGVjb3JhdG9yOwotCSAgICAgICAgICAgIFN0cmluZyBkZWNvcmF0ZWQgPSBsZDIuZGVjb3JhdGVUZXh0KHRleHQsIGVsZW1lbnQsIGdldERlY29yYXRpb25Db250ZXh0KCkpOwotCSAgICAgICAgICAgIGlmIChkZWNvcmF0ZWQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICByZXR1cm4gZGVjb3JhdGVkOwotCSAgICAgICAgICAgIH0KLQkJCX0gZWxzZSB7Ci0JICAgICAgICAgICAgU3RyaW5nIGRlY29yYXRlZCA9IGRlY29yYXRvci5kZWNvcmF0ZVRleHQodGV4dCwgZWxlbWVudCk7Ci0JICAgICAgICAgICAgaWYgKGRlY29yYXRlZCAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgIHJldHVybiBkZWNvcmF0ZWQ7Ci0JICAgICAgICAgICAgfQotCQkJfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5JQmFzZUxhYmVsUHJvdmlkZXI8L2NvZGU+IG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZAotICAgICAqIG9uIHRoZSBuZXN0ZWQgbGFiZWwgcHJvdmlkZXIgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBvciBpZiB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIAotICAgICAqIGRlY29yYXRvciByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIGlmIChwcm92aWRlci5pc0xhYmVsUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChkZWNvcmF0b3IgIT0gbnVsbCAmJiBkZWNvcmF0b3IuaXNMYWJlbFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklCYXNlTGFiZWxQcm92aWRlcjwvY29kZT4gbWV0aG9kCi0gICAgICogcmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSBib3RoIHRoZSBuZXN0ZWQgbGFiZWwgcHJvdmlkZXIgYW5kIHRoZSBsYWJlbCBkZWNvcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgYSBsYWJlbCBwcm92aWRlciBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBwcm92aWRlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGlmIChkZWNvcmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZGVjb3JhdG9yLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsYWJlbCBkZWNvcmF0b3IuCi0gICAgICogUmVtb3ZlcyBhbGwga25vd24gbGlzdGVuZXJzIGZyb20gdGhlIG9sZCBkZWNvcmF0b3IsIGFuZCBhZGRzIGFsbCBrbm93biBsaXN0ZW5lcnMgdG8gdGhlIG5ldyBkZWNvcmF0b3IuCi0gICAgICogVGhlIG9sZCBkZWNvcmF0b3IgaXMgbm90IGRpc3Bvc2VkLgotICAgICAqIEZpcmVzIGEgbGFiZWwgcHJvdmlkZXIgY2hhbmdlZCBldmVudCBpbmRpY2F0aW5nIHRoYXQgYWxsIGxhYmVscyBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBnaXZlbiBkZWNvcmF0b3IgaXMgaWRlbnRpY2FsIHRvIHRoZSBjdXJyZW50IG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWNvcmF0b3IgdGhlIGxhYmVsIGRlY29yYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZGVjb3JhdGlvbnMgYXJlIHRvIGJlIGFwcGxpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbERlY29yYXRvcihJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yKSB7Ci0gICAgICAgIElMYWJlbERlY29yYXRvciBvbGREZWNvcmF0b3IgPSB0aGlzLmRlY29yYXRvcjsKLSAgICAgICAgaWYgKG9sZERlY29yYXRvciAhPSBkZWNvcmF0b3IpIHsKLSAgICAgICAgICAgIE9iamVjdFtdIGxpc3RlbmVyTGlzdCA9IHRoaXMubGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICAgICAgaWYgKG9sZERlY29yYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lckxpc3QubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgb2xkRGVjb3JhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUxpc3RlbmVyKChJTGFiZWxQcm92aWRlckxpc3RlbmVyKSBsaXN0ZW5lckxpc3RbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuZGVjb3JhdG9yID0gZGVjb3JhdG9yOwotICAgICAgICAgICAgaWYgKGRlY29yYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lckxpc3QubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVjb3JhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZExpc3RlbmVyKChJTGFiZWxQcm92aWRlckxpc3RlbmVyKSBsaXN0ZW5lckxpc3RbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChuZXcgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCh0aGlzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVZpZXdlckxhYmVsUHJvdmlkZXIjdXBkYXRlTGFiZWwob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJMYWJlbCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVMYWJlbChWaWV3ZXJMYWJlbCBzZXR0aW5ncywgT2JqZWN0IGVsZW1lbnQpIHsKLQotICAgICAgICBJTGFiZWxEZWNvcmF0b3IgY3VycmVudERlY29yYXRvciA9IGdldExhYmVsRGVjb3JhdG9yKCk7Ci0gICAgICAgIFN0cmluZyBvbGRUZXh0ID0gc2V0dGluZ3MuZ2V0VGV4dCgpOwotICAgICAgICBib29sZWFuIGRlY29yYXRpb25SZWFkeSA9IHRydWU7Ci0gICAgICAgIGlmIChjdXJyZW50RGVjb3JhdG9yIGluc3RhbmNlb2YgSURlbGF5ZWRMYWJlbERlY29yYXRvcikgewotICAgICAgICAgICAgSURlbGF5ZWRMYWJlbERlY29yYXRvciBkZWxheWVkRGVjb3JhdG9yID0gKElEZWxheWVkTGFiZWxEZWNvcmF0b3IpIGN1cnJlbnREZWNvcmF0b3I7Ci0gICAgICAgICAgICBpZiAoIWRlbGF5ZWREZWNvcmF0b3IucHJlcGFyZURlY29yYXRpb24oZWxlbWVudCwgb2xkVGV4dCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZGVjb3JhdGlvbiBpcyBub3QgcmVhZHkgYnV0IGhhcyBiZWVuIHF1ZXVlZCBmb3IgcHJvY2Vzc2luZwotICAgICAgICAgICAgICAgIGRlY29yYXRpb25SZWFkeSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIHVwZGF0ZSBpY29uIGFuZCBsYWJlbAotCi0gICAgICAgIGlmIChkZWNvcmF0aW9uUmVhZHkgfHwgb2xkVGV4dCA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgc2V0dGluZ3MuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICBzZXR0aW5ncy5zZXRUZXh0KGdldFRleHQoZWxlbWVudCkpOwotCi0gICAgICAgIEltYWdlIG9sZEltYWdlID0gc2V0dGluZ3MuZ2V0SW1hZ2UoKTsKLSAgICAgICAgaWYgKGRlY29yYXRpb25SZWFkeSB8fCBvbGRJbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXR0aW5ncy5zZXRJbWFnZShnZXRJbWFnZShlbGVtZW50KSk7Ci0gICAgICAgIH0KLSAKLSAgICAgICAgaWYoZGVjb3JhdGlvblJlYWR5KQotICAgICAgICAJdXBkYXRlRm9yRGVjb3JhdGlvblJlYWR5KHNldHRpbmdzLGVsZW1lbnQpOwotCi0gICAgfQotCi0JLyoqCi0JICogRGVjb3JhdGlvbiBpcyByZWFkeS4gVXBkYXRlIGFueXRoaW5nIGVsc2UgZm9yIHRoZSBzZXR0aW5ncy4KLQkgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIG9iamVjdCBjb2xsZWN0aW5nIHRoZSBzZXR0aW5ncy4KLQkgKiBAcGFyYW0gZWxlbWVudCBUaGUgT2JqZWN0IGJlaW5nIGRlY29yYXRlZC4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRm9yRGVjb3JhdGlvblJlYWR5KFZpZXdlckxhYmVsIHNldHRpbmdzLCBPYmplY3QgZWxlbWVudCkgewotCQkKLQkJaWYoZGVjb3JhdG9yIGluc3RhbmNlb2YgSUNvbG9yRGVjb3JhdG9yKXsKLQkJCUlDb2xvckRlY29yYXRvciBjb2xvckRlY29yYXRvciA9IChJQ29sb3JEZWNvcmF0b3IpIGRlY29yYXRvcjsKLQkJCXNldHRpbmdzLnNldEJhY2tncm91bmQoY29sb3JEZWNvcmF0b3IuZGVjb3JhdGVCYWNrZ3JvdW5kKGVsZW1lbnQpKTsKLQkJCXNldHRpbmdzLnNldEZvcmVncm91bmQoY29sb3JEZWNvcmF0b3IuZGVjb3JhdGVGb3JlZ3JvdW5kKGVsZW1lbnQpKTsKLQkJfQotCQkKLQkJaWYoZGVjb3JhdG9yIGluc3RhbmNlb2YgSUZvbnREZWNvcmF0b3IpCi0JCQlzZXR0aW5ncy5zZXRGb250KCgoSUZvbnREZWNvcmF0b3IpIGRlY29yYXRvcikuZGVjb3JhdGVGb250KGVsZW1lbnQpKTsKLQkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0QmFja2dyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKHByb3ZpZGVyIGluc3RhbmNlb2YgSUNvbG9yUHJvdmlkZXIpCi0JCQlyZXR1cm4gKChJQ29sb3JQcm92aWRlcikgcHJvdmlkZXIpLmdldEJhY2tncm91bmQoZWxlbWVudCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGb250UHJvdmlkZXIjZ2V0Rm9udChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBGb250IGdldEZvbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYocHJvdmlkZXIgaW5zdGFuY2VvZiBJRm9udFByb3ZpZGVyKQotCQkJcmV0dXJuICgoSUZvbnRQcm92aWRlcikgcHJvdmlkZXIpLmdldEZvbnQoZWxlbWVudCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyI2dldEZvcmVncm91bmQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZChPYmplY3QgZWxlbWVudCkgewotCQlpZihwcm92aWRlciBpbnN0YW5jZW9mIElDb2xvclByb3ZpZGVyKQotCQkJcmV0dXJuICgoSUNvbG9yUHJvdmlkZXIpIHByb3ZpZGVyKS5nZXRGb3JlZ3JvdW5kKGVsZW1lbnQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGRlY29yYXRpb24gY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYWJlbCBwcm92aWRlci4KLSAgICAgKiBJdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZGVjb3JhdG9yIGlmIHRoZSBkZWNvcmF0b3IgaXMgYW4gCi0gICAgICogaW5zdGFuY2Ugb2Yge0BsaW5rIExhYmVsRGVjb3JhdG9yfS4KLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0aW9uIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGFiZWwgcHJvdmlkZXIKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4yCi0gICAgICovCi0gICAgcHVibGljIElEZWNvcmF0aW9uQ29udGV4dCBnZXREZWNvcmF0aW9uQ29udGV4dCgpIHsKLQkJcmV0dXJuIGRlY29yYXRpb25Db250ZXh0OwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlY29yYXRpb24gY29udGV4dCB0aGF0IHdpbGwgYmUgYmFzZWQgdG8gdGhlIGRlY29yYXRvciAKLSAgICAgKiBmb3IgdGhpcyBsYWJlbCBwcm92aWRlciBpZiB0aGF0IGRlY29yYXRvciBpbXBsZW1lbnRzIHtAbGluayBMYWJlbERlY29yYXRvcn0uCi0gICAgICogQHBhcmFtIGRlY29yYXRpb25Db250ZXh0IHRoZSBkZWNvcmF0aW9uIGNvbnRleHQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMgotICAgICAqLwotCXB1YmxpYyB2b2lkIHNldERlY29yYXRpb25Db250ZXh0KElEZWNvcmF0aW9uQ29udGV4dCBkZWNvcmF0aW9uQ29udGV4dCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGRlY29yYXRpb25Db250ZXh0KTsKLQkJdGhpcy5kZWNvcmF0aW9uQ29udGV4dCA9IGRlY29yYXRpb25Db250ZXh0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvRGVjb3JhdGlvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvRGVjb3JhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjYTg3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0RlY29yYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIElEZWNvcmF0aW9uQ29udGV4dH0gaW50ZXJmYWNlLAotICogc3VpdGFibGUgZm9yIGluc3RhbnRpYXRpbmcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNvcmF0aW9uQ29udGV4dCBpbXBsZW1lbnRzIElEZWNvcmF0aW9uQ29udGV4dCB7Ci0JCi0JLyoqCi0JICogQ29uc3RhbnQgdGhhdCBkZWZpbmVzIGEgZGVmYXVsdCBkZWNvcmF0aW9uIGNvbnRleHQgdGhhdCBoYXMKLQkgKiBubyBjb250ZXh0IGlkcyBhc3NvY2lhdGVkIHdpdGggaXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRGVjb3JhdGlvbkNvbnRleHQgREVGQVVMVF9DT05URVhUID0gbmV3IERlY29yYXRpb25Db250ZXh0KCk7Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb250ZXh0SWRzOwotCXByaXZhdGUgTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgZGVjb3JhdGlvbiBjb250ZXh0LgotCSAqLwotCXB1YmxpYyBEZWNvcmF0aW9uQ29udGV4dCgpIHsKLQkJdGhpcy5jb250ZXh0SWRzID0gbmV3IFN0cmluZ1swXTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZGVjb3JhdGlvbiBjb250ZXh0IHdpdGggdGhlIGdpdmVuIGNvbnRleHQgaWRzCi0JICogQHBhcmFtIGNvbnRleHRJZHMgdGhlIGNvbnRleHQgaWRzIGZvciB0aGlzIGRlY29yYXRpb24gY29udGV4dAotCSAqIEBkZXByZWNhdGVkIHRvIGJlIHJlbW92ZWQgYnkgTTUKLQkgKi8KLQlwdWJsaWMgRGVjb3JhdGlvbkNvbnRleHQoU3RyaW5nW10gY29udGV4dElkcykgewotCQl0aGlzLmNvbnRleHRJZHMgPSBjb250ZXh0SWRzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb25Db250ZXh0I2dldENvbnRleHRJZHMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZXh0SWRzKCkgewotCQlyZXR1cm4gY29udGV4dElkczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uQ29udGV4dCNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBwcm9wZXJ0aWVzLmdldChwcm9wZXJ0eSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbkNvbnRleHQjZ2V0UHJvcGVydGllcygpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoU3RyaW5nW10pIHByb3BlcnRpZXMua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nW3Byb3BlcnRpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBwZ2l2ZW4gcm9wZXJ0eSB0byB0aGUgZ2l2ZW4gdmFsdWUuIFNldHRpbmcgdGhlIHZhbHVlIG9mCi0JICogYSBwcm9wZXJ0IHRvIDxjb2RlPm51bGw8L2NvZGU+IHJlbW92ZXMgdGhlIHByb3BlcnR5IGZyb20KLQkgKiB0aGUgY29udGV4dC4KLQkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB0aGUgcHJvcGVydHkgaXMgdG8gYmUgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcHJvcGVydGllcy5yZW1vdmUocHJvcGVydHkpOwotCQl9IGVsc2UgewotCQkJcHJvcGVydGllcy5wdXQocHJvcGVydHksIHZhbHVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvRGlhbG9nQ2VsbEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9EaWFsb2dDZWxsRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZWU4ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9EaWFsb2dDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBjZWxsIGVkaXRvciB0aGF0IHVzZXMgYSBkaWFsb2cuCi0gKiBEaWFsb2cgY2VsbCBlZGl0b3JzIHVzdWFsbHkgaGF2ZSBhIGxhYmVsIGNvbnRyb2wgb24gdGhlIGxlZnQgYW5kIGEgYnV0dG9uIG9uCi0gKiB0aGUgcmlnaHQuIFByZXNzaW5nIHRoZSBidXR0b24gb3BlbnMgYSBkaWFsb2cgd2luZG93IChmb3IgZXhhbXBsZSwgYSBjb2xvciBkaWFsb2cKLSAqIG9yIGEgZmlsZSBkaWFsb2cpIHRvIGNoYW5nZSB0aGUgY2VsbCBlZGl0b3IncyB2YWx1ZS4KLSAqIFRoZSBjZWxsIGVkaXRvcidzIHZhbHVlIGlzIHRoZSB2YWx1ZSBvZiB0aGUgZGlhbG9nLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZDoKLSAqIDx1bD4KLSAqCTxsaT48Y29kZT5jcmVhdGVCdXR0b248L2NvZGU+OiBjcmVhdGVzIHRoZSBjZWxsIGVkaXRvcidzIGJ1dHRvbiBjb250cm9sPC9saT4KLSAqCTxsaT48Y29kZT5vcGVuRGlhbG9nQm94PC9jb2RlPjogb3BlbnMgdGhlIGRpYWxvZyBib3ggd2hlbiB0aGUgZW5kIHVzZXIgcHJlc3NlcwotICogICAgICB0aGUgYnV0dG9uPC9saT4KLSAqCTxsaT48Y29kZT51cGRhdGVMYWJlbDwvY29kZT46IHVwZGF0ZXMgdGhlIGNlbGwgZWRpdG9yJ3MgbGFiZWwgYWZ0ZXIgaXRzCi0gKgkJdmFsdWUgaGFzIGNoYW5nZWQ8L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpYWxvZ0NlbGxFZGl0b3IgZXh0ZW5kcyBDZWxsRWRpdG9yIHsKLQotICAgIC8qKgotICAgICAqIEltYWdlIHJlZ2lzdHJ5IGtleSBmb3IgdGhyZWUgZG90IGltYWdlICh2YWx1ZSA8Y29kZT4iY2VsbF9lZGl0b3JfZG90c19idXR0b25faW1hZ2UiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VMTF9FRElUT1JfSU1HX0RPVFNfQlVUVE9OID0gImNlbGxfZWRpdG9yX2RvdHNfYnV0dG9uX2ltYWdlIjsvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgZWRpdG9yIGNvbnRyb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgZWRpdG9yOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgY29udGVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb250cm9sIGNvbnRlbnRzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxhYmVsIHRoYXQgZ2V0cyByZXVzZWQgYnkgPGNvZGU+dXBkYXRlTGFiZWw8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgTGFiZWwgZGVmYXVsdExhYmVsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGJ1dHRvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIEJ1dHRvbiBidXR0b247Ci0KLQkvKioKLQkgKiBMaXN0ZW5zIGZvciAnZm9jdXNMb3N0JyBldmVudHMgYW5kICBmaXJlcyB0aGUgJ2FwcGx5JyBldmVudCBhcyBsb25nCi0JICogYXMgdGhlIGZvY3VzIHdhc24ndCBsb3N0IGJlY2F1c2UgdGhlIGRpYWxvZyB3YXMgb3BlbmVkLgotCSAqLwotCXByaXZhdGUgRm9jdXNMaXN0ZW5lciBidXR0b25Gb2N1c0xpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogVGhlIHZhbHVlIG9mIHRoaXMgY2VsbCBlZGl0b3I7IGluaXRpYWxseSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBJbWFnZVJlZ2lzdHJ5IHJlZyA9IEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLSAgICAgICAgcmVnLnB1dChDRUxMX0VESVRPUl9JTUdfRE9UU19CVVRUT04sIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZSgKLSAgICAgICAgICAgICAgICBEaWFsb2dDZWxsRWRpdG9yLmNsYXNzLCAiaW1hZ2VzL2RvdHNfYnV0dG9uLmdpZiIpKTsvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgY2xhc3MgZm9yIGxheWluZyBvdXQgdGhlIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIERpYWxvZ0NlbGxMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotICAgICAgICBwdWJsaWMgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGVkaXRvciwgYm9vbGVhbiBmb3JjZSkgewotICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IGVkaXRvci5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICBQb2ludCBzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZm9yY2UpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGVudHMuc2V0Qm91bmRzKDAsIDAsIGJvdW5kcy53aWR0aCAtIHNpemUueCwgYm91bmRzLmhlaWdodCk7Ci0gICAgICAgICAgICBidXR0b24uc2V0Qm91bmRzKGJvdW5kcy53aWR0aCAtIHNpemUueCwgMCwgc2l6ZS54LCBib3VuZHMuaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgZWRpdG9yLCBpbnQgd0hpbnQsIGludCBoSGludCwKLSAgICAgICAgICAgICAgICBib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgICAgICBpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQgJiYgaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh3SGludCwgaEhpbnQpOwotICAgICAgICAgICAgUG9pbnQgY29udGVudHNTaXplID0gY29udGVudHMuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICBmb3JjZSk7Ci0gICAgICAgICAgICBQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgZm9yY2UpOwotICAgICAgICAgICAgLy8gSnVzdCByZXR1cm4gdGhlIGJ1dHRvbiB3aWR0aCB0byBlbnN1cmUgdGhlIGJ1dHRvbiBpcyBub3QgY2xpcHBlZAotICAgICAgICAgICAgLy8gaWYgdGhlIGxhYmVsIGlzIGxvbmcuCi0gICAgICAgICAgICAvLyBUaGUgbGFiZWwgd2lsbCBqdXN0IHVzZSB3aGF0ZXZlciBleHRyYSB3aWR0aCB0aGVyZSBpcwotICAgICAgICAgICAgUG9pbnQgcmVzdWx0ID0gbmV3IFBvaW50KGJ1dHRvblNpemUueCwgTWF0aC5tYXgoY29udGVudHNTaXplLnksCi0gICAgICAgICAgICAgICAgICAgIGJ1dHRvblNpemUueSkpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgRGlhbG9nQ2VsbEVkaXRvciBzdHlsZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0U3R5bGUgPSBTV1QuTk9ORTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZGlhbG9nIGNlbGwgZWRpdG9yIHdpdGggbm8gY29udHJvbAotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgRGlhbG9nQ2VsbEVkaXRvcigpIHsKLSAgICAgICAgc2V0U3R5bGUoZGVmYXVsdFN0eWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGRpYWxvZyBjZWxsIGVkaXRvciBwYXJlbnRlZCB1bmRlciB0aGUgZ2l2ZW4gY29udHJvbC4KLSAgICAgKiBUaGUgY2VsbCBlZGl0b3IgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gaW5pdGlhbGx5LCBhbmQgaGFzIG5vIAotICAgICAqIHZhbGlkYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERpYWxvZ0NlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICB0aGlzKHBhcmVudCwgZGVmYXVsdFN0eWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGRpYWxvZyBjZWxsIGVkaXRvciBwYXJlbnRlZCB1bmRlciB0aGUgZ2l2ZW4gY29udHJvbC4KLSAgICAgKiBUaGUgY2VsbCBlZGl0b3IgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gaW5pdGlhbGx5LCBhbmQgaGFzIG5vIAotICAgICAqIHZhbGlkYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBiaXRzCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBEaWFsb2dDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBidXR0b24gZm9yIHRoaXMgY2VsbCBlZGl0b3IgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb250cm9sLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBjcmVhdGVzIHRoZSBidXR0b24gCi0gICAgICogZGlzcGxheSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBkaWFsb2cgY2VsbCBlZGl0b3IuIFN1YmNsYXNzZXMKLSAgICAgKiBtYXkgZXh0ZW5kIG9yIHJlaW1wbGVtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHJldHVybiB0aGUgbmV3IGJ1dHRvbiBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gcmVzdWx0ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5ET1dOKTsKLSAgICAgICAgcmVzdWx0LnNldFRleHQoIi4uLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgY29udHJvbHMgdXNlZCB0byBzaG93IHRoZSB2YWx1ZSBvZiB0aGlzIGNlbGwgZWRpdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBjcmVhdGVzCi0gICAgICogYSBsYWJlbCB3aWRnZXQsIHVzaW5nIHRoZSBzYW1lIGZvbnQgYW5kIGJhY2tncm91bmQgY29sb3IgYXMgdGhlIHBhcmVudCBjb250cm9sLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4gIElmIHlvdSByZWltcGxlbWVudCB0aGlzIG1ldGhvZCwgeW91Ci0gICAgICogc2hvdWxkIGFsc28gcmVpbXBsZW1lbnQgPGNvZGU+dXBkYXRlQ29udGVudHM8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjZWxsIHRoZSBjb250cm9sIGZvciB0aGlzIGNlbGwgZWRpdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGNlbGwpIHsKLSAgICAgICAgZGVmYXVsdExhYmVsID0gbmV3IExhYmVsKGNlbGwsIFNXVC5MRUZUKTsKLSAgICAgICAgZGVmYXVsdExhYmVsLnNldEZvbnQoY2VsbC5nZXRGb250KCkpOwotICAgICAgICBkZWZhdWx0TGFiZWwuc2V0QmFja2dyb3VuZChjZWxsLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0TGFiZWw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBDZWxsRWRpdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgIENvbG9yIGJnID0gcGFyZW50LmdldEJhY2tncm91bmQoKTsKLQotICAgICAgICBlZGl0b3IgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgZ2V0U3R5bGUoKSk7Ci0gICAgICAgIGVkaXRvci5zZXRGb250KGZvbnQpOwotICAgICAgICBlZGl0b3Iuc2V0QmFja2dyb3VuZChiZyk7Ci0gICAgICAgIGVkaXRvci5zZXRMYXlvdXQobmV3IERpYWxvZ0NlbGxMYXlvdXQoKSk7Ci0KLSAgICAgICAgY29udGVudHMgPSBjcmVhdGVDb250ZW50cyhlZGl0b3IpOwotICAgICAgICB1cGRhdGVDb250ZW50cyh2YWx1ZSk7Ci0KLSAgICAgICAgYnV0dG9uID0gY3JlYXRlQnV0dG9uKGVkaXRvcik7Ci0gICAgICAgIGJ1dHRvbi5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIGJ1dHRvbi5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lciNrZXlSZWxlYXNlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50KQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuY2hhcmFjdGVyID09ICdcdTAwMWInKSB7IC8vIEVzY2FwZQotICAgICAgICAgICAgICAgICAgICBmaXJlQ2FuY2VsRWRpdG9yKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIAkvLyBSZW1vdmUgdGhlIGJ1dHRvbidzIGZvY3VzIGxpc3RlbmVyIHNpbmNlIGl0J3MgZ3VhcmFudGVlZAotICAgICAgICAgICAgCS8vIHRvIGxvc2UgZm9jdXMgd2hlbiB0aGUgZGlhbG9nIG9wZW5zCi0gICAgICAgICAgICAJYnV0dG9uLnJlbW92ZUZvY3VzTGlzdGVuZXIoZ2V0QnV0dG9uRm9jdXNMaXN0ZW5lcigpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIAlPYmplY3QgbmV3VmFsdWUgPSBvcGVuRGlhbG9nQm94KGVkaXRvcik7Ci0gICAgICAgICAgICAJCi0gICAgICAgICAgICAJLy8gUmUtYWRkIHRoZSBsaXN0ZW5lciBvbmNlIHRoZSBkaWFsb2cgY2xvc2VzCi0gICAgICAgICAgICAJYnV0dG9uLmFkZEZvY3VzTGlzdGVuZXIoZ2V0QnV0dG9uRm9jdXNMaXN0ZW5lcigpKTsKLQotICAgICAgICAgICAgCWlmIChuZXdWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV3VmFsaWRTdGF0ZSA9IGlzQ29ycmVjdChuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWxpZFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXJrRGlydHkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvU2V0VmFsdWUobmV3VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGluc2VydCB0aGUgY3VycmVudCB2YWx1ZSBpbnRvIHRoZSBlcnJvciBtZXNzYWdlLgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEVycm9yTWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBuZXdWYWx1ZS50b1N0cmluZygpIH0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaXJlQXBwbHlFZGl0b3JWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2V0VmFsdWVWYWxpZCh0cnVlKTsKLQotICAgICAgICByZXR1cm4gZWRpdG9yOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBPdmVycmlkZSBpbiBvcmRlciB0byByZW1vdmUgdGhlIGJ1dHRvbidzIGZvY3VzIGxpc3RlbmVyIGlmIHRoZSBjZWxsZWRpdG9yCi0gICAgICogaXMgZGVhY3RpdmF0aW5nLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yI2RlYWN0aXZhdGUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0gICAgCWlmIChidXR0b24gIT0gbnVsbCAmJiAhYnV0dG9uLmlzRGlzcG9zZWQoKSkgewotICAgIAkJYnV0dG9uLnJlbW92ZUZvY3VzTGlzdGVuZXIoZ2V0QnV0dG9uRm9jdXNMaXN0ZW5lcigpKTsKLSAgICAJfQotICAgIAkKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQ2VsbEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvR2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIENlbGxFZGl0b3IuCi0gICAgICogVGhlIGZvY3VzIGlzIHNldCB0byB0aGUgY2VsbCBlZGl0b3IncyBidXR0b24uIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0Rm9jdXMoKSB7Ci0gICAgICAgIGJ1dHRvbi5zZXRGb2N1cygpOwotICAgICAgICAKLSAgICAgICAgLy8gYWRkIGEgRm9jdXNMaXN0ZW5lciB0byB0aGUgYnV0dG9uCi0gICAgICAgIGJ1dHRvbi5hZGRGb2N1c0xpc3RlbmVyKGdldEJ1dHRvbkZvY3VzTGlzdGVuZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgbGlzdGVuZXIgZm9yIGJ1dHRvbiBmb2N1cy4KLSAgICAgKiBAcmV0dXJuIEZvY3VzTGlzdGVuZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZvY3VzTGlzdGVuZXIgZ2V0QnV0dG9uRm9jdXNMaXN0ZW5lcigpIHsKLSAgICAJaWYgKGJ1dHRvbkZvY3VzTGlzdGVuZXIgPT0gbnVsbCkgewotICAgIAkJYnV0dG9uRm9jdXNMaXN0ZW5lciA9IG5ldyBGb2N1c0xpc3RlbmVyKCkgewotCi0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyI2ZvY3VzR2FpbmVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJLy8gRG8gbm90aGluZwotCQkJCX0KLQotCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lciNmb2N1c0xvc3Qob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50KQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJZmlyZUFwcGx5RWRpdG9yVmFsdWUoKTsKLQkJCQl9Ci0gICAgCQl9OwotICAgIAl9Ci0gICAgCQotICAgIAlyZXR1cm4gYnV0dG9uRm9jdXNMaXN0ZW5lcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIENlbGxFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB1cGRhdGVDb250ZW50cyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBsYWJlbCB3aWRnZXQgY3JlYXRlZCBieSA8Y29kZT5jcmVhdGVDb250ZW50czwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGxhYmVsIHdpZGdldAotICAgICAqLwotICAgIHByb3RlY3RlZCBMYWJlbCBnZXREZWZhdWx0TGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0TGFiZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYSBkaWFsb2cgYm94IHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbCBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiBkaWFsb2cncyB2YWx1ZSB3aGVuIGl0IGNsb3Nlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRpYWxvZwotICAgICAqIHdhcyBjYW5jZWxsZWQgb3Igbm8gc2VsZWN0aW9uIHdhcyBtYWRlIGluIHRoZSBkaWFsb2cuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBmcmFtZXdvcmsgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgc3ViY2xhc3Nlcy4KLSAgICAgKiBJdCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBoYXMgcHJlc3NlZCB0aGUgYnV0dG9uIGFuZCB0aGUgZGlhbG9nCi0gICAgICogYm94IG11c3QgcG9wIHVwLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjZWxsRWRpdG9yV2luZG93IHRoZSBwYXJlbnQgY29udHJvbCBjZWxsIGVkaXRvcidzIHdpbmRvdwotICAgICAqICAgc28gdGhhdCBhIHN1YmNsYXNzIGNhbiBhZGp1c3QgdGhlIGRpYWxvZyBib3ggYWNjb3JkaW5nbHkKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3RlZCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRpYWxvZyB3YXMgCi0gICAgICogICBjYW5jZWxsZWQgb3Igbm8gc2VsZWN0aW9uIHdhcyBtYWRlIGluIHRoZSBkaWFsb2cKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IG9wZW5EaWFsb2dCb3goQ29udHJvbCBjZWxsRWRpdG9yV2luZG93KTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGNvbnRyb2xzIHNob3dpbmcgdGhlIHZhbHVlIG9mIHRoaXMgY2VsbCBlZGl0b3IuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIGp1c3QgY29udmVydHMKLSAgICAgKiB0aGUgcGFzc2VkIG9iamVjdCB0byBhIHN0cmluZyB1c2luZyA8Y29kZT50b1N0cmluZzwvY29kZT4gYW5kCi0gICAgICogc2V0cyB0aGlzIGFzIHRoZSB0ZXh0IG9mIHRoZSBsYWJlbCB3aWRnZXQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LiAgSWYgeW91IHJlaW1wbGVtZW50IHRoaXMgbWV0aG9kLCB5b3UKLSAgICAgKiBzaG91bGQgYWxzbyByZWltcGxlbWVudCA8Y29kZT5jcmVhdGVDb250ZW50czwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhpcyBjZWxsIGVkaXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRlbnRzKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoZGVmYXVsdExhYmVsID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU3RyaW5nIHRleHQgPSAiIjsvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgdGV4dCA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgIGRlZmF1bHRMYWJlbC5zZXRUZXh0KHRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvRG91YmxlQ2xpY2tFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Eb3VibGVDbGlja0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OGVkYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9Eb3VibGVDbGlja0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIEV2ZW50IG9iamVjdCBkZXNjcmliaW5nIGEgZG91YmxlLWNsaWNrLiBUaGUgc291cmNlIG9mIHRoZXNlCi0gKiBldmVudHMgaXMgYSB2aWV3ZXIuCi0gKgotICogQHNlZSBJRG91YmxlQ2xpY2tMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgRG91YmxlQ2xpY2tFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTg0MDg0NDM2MDUwMzgxMzNMOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBldmVudCBmb3IgdGhlIGdpdmVuIHNvdXJjZSBhbmQgc2VsZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgdmlld2VyCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgc2VsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIERvdWJsZUNsaWNrRXZlbnQoVmlld2VyIHNvdXJjZSwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIoc291cmNlKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChzZWxlY3Rpb24pOwotICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmlld2VyIHRoYXQgaXMgdGhlIHNvdXJjZSBvZiB0aGlzIGV2ZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgb3JpZ2luYXRpbmcgdmlld2VyCi0gICAgICovCi0gICAgcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0gICAgICAgIHJldHVybiAoVmlld2VyKSBnZXRTb3VyY2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lCYXNlTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JQmFzZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkY2JjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lCYXNlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLS8qKgotICogQSBsYWJlbCBwcm92aWRlciBtYXBzIGFuIGVsZW1lbnQgb2YgdGhlIHZpZXdlcidzIG1vZGVsIHRvCi0gKiBhbiBvcHRpb25hbCBpbWFnZSBhbmQgb3B0aW9uYWwgdGV4dCBzdHJpbmcgdXNlZCB0byBkaXNwbGF5Ci0gKiB0aGUgZWxlbWVudCBpbiB0aGUgdmlld2VyJ3MgY29udHJvbC4gIENlcnRhaW4gbGFiZWwgcHJvdmlkZXJzCi0gKiBtYXkgYWxsb3cgbXVsdGlwbGUgbGFiZWxzIHBlciBlbGVtZW50LiAgCi0gKiBUaGlzIGlzIGFuICJhYnN0cmFjdCBpbnRlcmZhY2UiLCBkZWZpbmluZyBtZXRob2RzIGNvbW1vbiAKLSAqIHRvIGFsbCBsYWJlbCBwcm92aWRlcnMsIGJ1dCBkb2VzIG5vdCBhY3R1YWxseSBkZWZpbmUgdGhlIG1ldGhvZHMgCi0gKiB0byBnZXQgdGhlIGxhYmVsKHMpIGZvciBhbiBlbGVtZW50LiAgVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIG5ldmVyCi0gKiBiZSBkaXJlY3RseSBpbXBsZW1lbnRlZC4KLSAqIE1vc3Qgdmlld2VycyB3aWxsIHRha2UgZWl0aGVyIGFuIDxjb2RlPklMYWJlbFByb3ZpZGVyPC9jb2RlPiBvcgotICogYW4gPGNvZGU+SVRhYmxlTGFiZWxQcm92aWRlcjwvY29kZT4uCi0gKiA8cD4KLSAqIEEgbGFiZWwgcHJvdmlkZXIgbXVzdCBub3QgYmUgc2hhcmVkIGJldHdlZW4gdmlld2VycyAKLSAqIHNpbmNlIGEgbGFiZWwgcHJvdmlkZXIgZ2VuZXJhbGx5IG1hbmFnZXMgU1dUIHJlc291cmNlcyAoaW1hZ2VzKSwKLSAqIHdoaWNoIG11c3QgYmUgZGlzcG9zZWQgd2hlbiB0aGUgdmlld2VyIGlzIGRpc3Bvc2VkLgotICogVG8gc2ltcGxpZnkgbGlmZSBjeWNsZSBtYW5hZ2VtZW50LCB0aGUgY3VycmVudCBsYWJlbCBwcm92aWRlciAKLSAqIG9mIGEgdmlld2VyIGlzIGRpc3Bvc2VkIHdoZW4gdGhlIHZpZXdlciBpcyBkaXNwb3NlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogTGFiZWwgcHJvdmlkZXJzIGNhbiBiZSB1c2VkIG91dHNpZGUgdGhlIGNvbnRleHQgb2Ygdmlld2VycyB3aGVyZXZlcgotICogaW1hZ2VzIGFyZSBuZWVkZWQuICBXaGVuIGxhYmVsIHByb3ZpZGVycyBhcmUgdXNlZCBpbiB0aGlzIGZhc2hpb24KLSAqIGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdXNlciB0byBlbnN1cmUgPGNvZGU+ZGlzcG9zZTwvY29kZT4KLSAqIGlzIGNhbGxlZCB3aGVuIHRoZSBwcm92aWRlciBpcyBubyBsb25nZXIgbmVlZGVkLgotICogPC9wPgotICoKLSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIKLSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCYXNlTGFiZWxQcm92aWRlciB7Ci0gICAgLyoqCi0gICAgICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuIAotICAgICAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBMYWJlbCBwcm92aWRlciBsaXN0ZW5lcnMgYXJlIGluZm9ybWVkIGFib3V0IHN0YXRlIGNoYW5nZXMgCi0gICAgICogdGhhdCBhZmZlY3QgdGhlIHJlbmRlcmluZyBvZiB0aGUgdmlld2VyIHRoYXQgdXNlcyB0aGlzIGxhYmVsIHByb3ZpZGVyLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIGxhYmVsIHByb3ZpZGVyIGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlcyBvZiB0aGlzIGxhYmVsIHByb3ZpZGVyLiAgV2hlbiBhIGxhYmVsIHByb3ZpZGVyIGlzCi0gICAgICogYXR0YWNoZWQgdG8gYSB2aWV3ZXIsIHRoZSB2aWV3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwKLSAgICAgKiB0aGlzIG1ldGhvZCB3aGVuIHRoZSB2aWV3ZXIgaXMgYmVpbmcgY2xvc2VkLiAgV2hlbiBsYWJlbCBwcm92aWRlcnMKLSAgICAgKiBhcmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIGEgdmlld2VyLCBpdCBpcyB0aGUgY2xpZW50J3MKLSAgICAgKiByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKLSAgICAgKiBwcm92aWRlciBpcyBubyBsb25nZXIgbmVlZGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbGFiZWwgd291bGQgYmUgYWZmZWN0ZWQgCi0gICAgICogYnkgYSBjaGFuZ2UgdG8gdGhlIGdpdmVuIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBlbGVtZW50LgotICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gb3B0aW1pemUgYSBub24tc3RydWN0dXJhbCB2aWV3ZXIgdXBkYXRlLgotICAgICAqIElmIHRoZSBwcm9wZXJ0eSBtZW50aW9uZWQgaW4gdGhlIHVwZGF0ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIGxhYmVsLAotICAgICAqIHRoZW4gdGhlIHZpZXdlciBuZWVkIG5vdCB1cGRhdGUgdGhlIGxhYmVsLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGFiZWwgd291bGQgYmUgYWZmZWN0ZWQsCi0gICAgICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCB3b3VsZCBiZSB1bmFmZmVjdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuCi0gICAgICogSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgYSBsYWJlbCBwcm92aWRlciBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JQmFzaWNQcm9wZXJ0eUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JQmFzaWNQcm9wZXJ0eUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTA0MjJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUJhc2ljUHJvcGVydHlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi0vKioKLSAqIFByZWRlZmluZWQgcHJvcGVydHkgbmFtZXMgdXNlZCBmb3IgZWxlbWVudHMgZGlzcGxheWVkIGluIHZpZXdlcnMuCi0gKgotICogQHNlZSBTdHJ1Y3R1cmVkVmlld2VyI3VwZGF0ZShPYmplY3QsIFN0cmluZ1tdKQotICogQHNlZSBTdHJ1Y3R1cmVkVmlld2VyI3VwZGF0ZShPYmplY3RbXSwgU3RyaW5nW10pCi0gKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkKLSAqIEBzZWUgVmlld2VyU29ydGVyI2lzU29ydGVyUHJvcGVydHkKLSAqIEBzZWUgVmlld2VyRmlsdGVyI2lzRmlsdGVyUHJvcGVydHkKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmFzaWNQcm9wZXJ0eUNvbnN0YW50cyB7Ci0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuamZhY2UudGV4dCI8L2NvZGU+KQotICAgICAqIGZvciBhbiBlbGVtZW50J3MgbGFiZWwgdGV4dC4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9URVhUID0gIm9yZy5lY2xpcHNlLmpmYWNlLnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuamZhY2UuaW1hZ2UiPC9jb2RlPikKLSAgICAgKiBmb3IgYW4gZWxlbWVudCdzIGxhYmVsIGltYWdlLgotICAgICAqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9JTUFHRSA9ICJvcmcuZWNsaXBzZS5qZmFjZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFByb3BlcnR5IG5hbWUgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qZmFjZS5jaGlsZHJlbiI8L2NvZGU+KQotICAgICAqIGZvciBhbiBlbGVtZW50J3MgY2hpbGRyZW4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9DSElMRFJFTiA9ICJvcmcuZWNsaXBzZS5qZmFjZS5jaGlsZHJlbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFByb3BlcnR5IG5hbWUgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qZmFjZS5wYXJlbnQiPC9jb2RlPikKLSAgICAgKiBmb3IgYW4gZWxlbWVudCdzIHBhcmVudCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9QQVJFTlQgPSAib3JnLmVjbGlwc2UuamZhY2UucGFyZW50IjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lDZWxsRWRpdG9yTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUNlbGxFZGl0b3JMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDY1ZDU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUNlbGxFZGl0b3JMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLS8qKgotICogQSBsaXN0ZW5lciB3aGljaCBpcyBub3RpZmllZCBvZiBzaWduaWZpY2FudCBldmVudHMgaW4gdGhlCi0gKiBsaWZlIG9mIGEgY2VsbCBlZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgd2lzaCB0bwotICogcmVhY3QgdG8gY2VsbCBlZGl0b3IgYWN0aXZpdHkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIE5vdGU6IHRoZSBjZWxsIGVkaXRvciBpcyBub3QgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIGFueQotICogb2YgdGhlc2UgbWV0aG9kczsgc28gdGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUgbGlzdGVuZXIKLSAqIGtub3dzIHdoaWNoIGNlbGwgZWRpdG9yIGlzIHRhbGtpbmcgdG8gaXQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNlbGxFZGl0b3JMaXN0ZW5lciB7Ci0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCB0aGUgZW5kIHVzZXIgaGFzIHJlcXVlc3RlZCBhcHBseWluZyBhIHZhbHVlLgotICAgICAqIEFsbCBjZWxsIGVkaXRvcnMgc2VuZCB0aGlzIG5vdGlmaWNhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbm9ybWFsIHJlYWN0aW9uIGlzIHRvIHVwZGF0ZSB0aGUgbW9kZWwgd2l0aCB0aGUgY3VycmVudCBjZWxsIGVkaXRvciB2YWx1ZS4KLSAgICAgKiBIb3dldmVyLCBpZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkLCBpdCBzaG91bGQgbm90IGJlIGFwcGxpZWQuIAotICAgICAqIEEgdHlwaWNhbCB0ZXh0LWJhc2VkIGNlbGwgZWRpdG9yIHdvdWxkIHNlbmQgdGhpcyBtZXNzYWdlCi0gICAgICogd2hlbiB0aGUgZW5kIHVzZXIgaGl0cyBSZXR1cm4sIHdoZXJlYXMgb3RoZXIgZWRpdG9ycyB3b3VsZAotICAgICAqIHNlbmQgaXQgd2hlbmV2ZXIgdGhlaXIgdmFsdWUgY2hhbmdlcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCB0aGUgZW5kIHVzZXIgaGFzIGNhbmNlbGVkIGVkaXRpbmcuCi0gICAgICogQWxsIGNlbGwgZWRpdG9ycyBzZW5kIHRoaXMgbm90aWZpY2F0aW9uLgotICAgICAqIEEgbGlzdGVuZXIgc2hvdWxkIDxiPm5vdDwvYj4gdXBkYXRlIHRoZSBtb2RlbCBiYXNlZCBvbiB0aGlzCi0gICAgICogbm90aWZpY2F0aW9uOyBzZWUgPGNvZGU+YXBwbHlFZGl0b3JWYWx1ZTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2FuY2VsRWRpdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGF0IHRoZSBlbmQgdXNlciBpcyBjaGFuZ2luZyB0aGUgdmFsdWUgaW4gdGhlIGNlbGwgZWRpdG9yLiBUaGlzCi0gICAgICogbm90aWZpY2F0aW9uIGlzIG5vcm1hbGx5IHNlbnQgb25seSBieSB0ZXh0LWJhc2VkIGVkaXRvcnMgaW4gcmVzcG9uc2UgdG8gYQotICAgICAqIGtleXN0cm9rZSwgc28gdGhhdCB0aGUgbGlzdGVuZXIgbWF5IHNob3cgYW4gZXJyb3IgbWVzc2FnZSByZWZsZWN0aW5nIHRoZQotICAgICAqIGN1cnJlbnQgdmFsaWQgc3RhdGUuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hpbGUgdGhlIHZhbHVlIGlzIGJlaW5nCi0gICAgICogYWN0aXZlbHkgZWRpdGVkLCBiZWZvcmUgdGhlIHZhbHVlIGlzIGFwcGxpZWQgb3IgY2FuY2VsbGVkLiAgQSBsaXN0ZW5lciBzaG91bGQKLSAgICAgKiA8Yj5ub3Q8L2I+IHVwZGF0ZSB0aGUgbW9kZWwgYmFzZWQgb24gdGhpcyBub3RpZmljYXRpb247IHNlZQotICAgICAqIDxjb2RlPmFwcGx5RWRpdG9yVmFsdWU8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSA8Y29kZT5uZXdWYWxpZFN0YXRlPC9jb2RlPiBwYXJhbWV0ZXIgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sCi0gICAgICogdGhlIG5ldyB2YWx1ZSBtYXkgYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgPGNvZGU+SUNlbGxFZGl0b3IuZ2V0VmFsdWU8L2NvZGU+Ci0gICAgICogb24gdGhlIGFwcHJvcHJpYXRlIGNlbGwgZWRpdG9yLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2xkVmFsaWRTdGF0ZSB0aGUgdmFsaWQgc3RhdGUgYmVmb3JlIHRoZSBlbmQgdXNlciBjaGFuZ2VkIHRoZSB2YWx1ZQotICAgICAqIEBwYXJhbSBuZXdWYWxpZFN0YXRlIHRoZSBjdXJyZW50IHZhbGlkIHN0YXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkVmFsaWRTdGF0ZSwgYm9vbGVhbiBuZXdWYWxpZFN0YXRlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUNlbGxFZGl0b3JWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUNlbGxFZGl0b3JWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4YTZkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lDZWxsRWRpdG9yVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIHZhbGlkYXRpbmcgYSBjZWxsIGVkaXRvcidzIGlucHV0LgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdpc2ggdG8KLSAqIGFjdCBhcyBjZWxsIGVkaXRvciB2YWxpZGF0b3JzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDZWxsRWRpdG9yVmFsaWRhdG9yIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgdmFsaWQ7Ci0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gbWVhbnMgdmFsaWQsIGFuZCBub24tPGNvZGU+bnVsbDwvY29kZT4gbWVhbnMKLSAgICAgKiBpbnZhbGlkLCB3aXRoIHRoZSByZXN1bHQgYmVpbmcgdGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheQotICAgICAqIHRvIHRoZSBlbmQgdXNlci4KLSAgICAgKiA8cD4KLSAgICAgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGltcGxlbWVudG9yIHRvIGZ1bGx5IGZvcm1hdCB0aGUKLSAgICAgKiBtZXNzYWdlIGJlZm9yZSByZXR1cm5pbmcgaXQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkCi0gICAgICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZwotICAgICAqCXRoYXQgdGhlIHZhbHVlIGlzIHZhbGlkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lDZWxsTW9kaWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUNlbGxNb2RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjNlY2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUNlbGxNb2RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLS8qKgotICogQSBjZWxsIG1vZGlmaWVyIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhIG1vZGVsIGZyb20gYSBjZWxsCi0gKiBlZGl0b3IgaW4gYW4gYWJzdHJhY3Qgd2F5LiBJdCBvZmZlcnMgbWV0aG9kcyB0bzoKLSAqIDx1bD4KLSAqCTxsaT50byBjaGVjayBpZiBhIGEgbW9kZWwgZWxlbWVudCdzIHByb3BlcnR5IGNhbiBiZSBlZGl0ZWQgb3Igbm90PC9saT4KLSAqCTxsaT5yZXRyaWV2ZSBhIHZhbHVlIGEgbW9kZWwgZWxlbWVudCdzIHByb3BlcnR5PC9saT4KLSAqCTxsaT50byBzdG9yZSBhIGNlbGwgZWRpdG9yJ3MgdmFsdWUgYmFjayBpbnRvIHRoZSBtb2RlbCAKLSAqICAgIGVsZW1lbnQncyBwcm9wZXJ0eTwvbGk+Ci0gKiA8L3VsPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdpc2ggdG8KLSAqIGFjdCBhcyBjZWxsIG1vZGlmaWVycy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2VsbE1vZGlmaWVyIHsKLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnQgY2FuIGJlIAotICAgICAqIG1vZGlmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgY2FuIGJlIG1vZGlmaWVkLAotICAgICAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub3QgbW9kaWZpYWJsZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0gICAgICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIHRoZSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KTsKLQotICAgIC8qKgotICAgICAqIE1vZGlmaWVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBlbGVtZW50LgotICAgICAqIEhhcyBubyBlZmZlY3QgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSB0aGUgZ2l2ZW4gcHJvcGVydHksCi0gICAgICogb3IgaWYgdGhlIHByb3BlcnR5IGNhbm5vdCBiZSBtb2RpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGFuIFNXVCBJdGVtIHRvIGJlIHBhc3NlZCBpbnN0ZWFkIG9mIAotICAgICAqIHRoZSBtb2RlbCBlbGVtZW50LiBUbyBoYW5kbGUgdGhpcyBjYXNlIGluIGEgc2FmZSB3YXksIHVzZTogCi0gICAgICogPHByZT4KLSAgICAgKiAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJdGVtKSB7Ci0gICAgICogICAgICAgICBlbGVtZW50ID0gKChJdGVtKSBlbGVtZW50KS5nZXREYXRhKCk7Ci0gICAgICogICAgIH0KLSAgICAgKiAgICAgLy8gbW9kaWZ5IHRoZSBlbGVtZW50J3MgcHJvcGVydHkgaGVyZQotICAgICAqIDwvcHJlPgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgbW9kZWwgZWxlbWVudCBvciBTV1QgSXRlbSAoc2VlIGFib3ZlKQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JQ2hlY2tTdGF0ZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lDaGVja1N0YXRlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjYTYwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lDaGVja1N0YXRlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi0vKioKLSAqIEEgbGlzdGVuZXIgd2hpY2ggaXMgbm90aWZpZWQgb2YgY2hhbmdlcyB0byB0aGUgY2hlY2tlZAotICogc3RhdGUgb2YgaXRlbXMgaW4gY2hlY2tib3ggdmlld2Vycy4KLSAqCi0gKiBAc2VlIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2hlY2tTdGF0ZUxpc3RlbmVyIHsKLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyBvZiBhIGNoYW5nZSB0byB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhbiBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IGV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKLSAgICAgKi8KLSAgICB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JQ2hlY2thYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lDaGVja2FibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3ODcxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lDaGVja2FibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHN1cHBvcnQgZWxlbWVudHMgd2l0aCBhIGNoZWNrZWQgc3RhdGUuCi0gKgotICogQHNlZSBJQ2hlY2tTdGF0ZUxpc3RlbmVyCi0gKiBAc2VlIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2hlY2thYmxlIHsKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIGNoYW5nZXMgdG8gdGhlIGNoZWNrZWQgc3RhdGUgb2YgZWxlbWVudHMKLSAgICAgKiBpbiB0aGlzIHZpZXdlci4KLSAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgYSBjaGVjayBzdGF0ZSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENoZWNrU3RhdGVMaXN0ZW5lcihJQ2hlY2tTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGVsZW1lbnQgaXMgY2hlY2tlZCwKLSAgICAgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90IGNoZWNrZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRDaGVja2VkKE9iamVjdCBlbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIGNoZWNrIHN0YXRlIGxpc3RlbmVyIGZyb20gdGhpcyB2aWV3ZXIuCi0gICAgICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgYSBjaGVjayBzdGF0ZSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNoZWNrU3RhdGVMaXN0ZW5lcihJQ2hlY2tTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNoZWNrZWQgc3RhdGUgZm9yIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoaXMgdmlld2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gc3RhdGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZW0gc2hvdWxkIGJlIGNoZWNrZWQsCi0gICAgICogIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgc2hvdWxkIGJlIHVuY2hlY2tlZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrZWQgc3RhdGUgY291bGQgYmUgc2V0LCAKLSAgICAgKiAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRDaGVja2VkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIHN0YXRlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUNvbG9yRGVjb3JhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lDb2xvckRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjJmN2VmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUNvbG9yRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBUaGUgSUNvbG9yRGVjb3JhdG9yIGlzIGFuIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHJldHVybiBhIGNvbG9yIHRvCi0gKiBkZWNvcmF0ZSBlaXRoZXIgdGhlIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzIGZvciBkaXNwbGF5aW5nIGFuCi0gKiBhbiBvYmplY3QuCi0gKiAKLSAqIElmIGFuIElDb2xvckRlY29yYXRvciBkZWNvcmF0ZXMgYSBmb3JlZ3JvdW5kIG9yIGJhY2tncm91bmQgaW4gYW4gb2JqZWN0IAotICogdGhhdCBhbHNvIGhhcyBhbiBJQ29sb3JQcm92aWRlciB0aGUgSUNvbG9yRGVjb3JhdG9yIHdpbGwgdGFrZSBwcmVjZW5kZW5jZS4KLSAqIEBzZWUgSUNvbG9yUHJvdmlkZXIKLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb2xvckRlY29yYXRvciB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlZ3JvdW5kIENvbG9yIGZvciBlbGVtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlCi0JICogaXMgbm90IG9uZS4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gQ29sb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29sb3IgZGVjb3JhdGVGb3JlZ3JvdW5kKE9iamVjdCBlbGVtZW50KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGJhY2tncm91bmQgQ29sb3IgZm9yIGVsZW1lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUKLQkgKiBpcyBub3Qgb25lLgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBDb2xvciBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb2xvciBkZWNvcmF0ZUJhY2tncm91bmQoT2JqZWN0IGVsZW1lbnQpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lDb2xvclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lDb2xvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMGQ0ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JQ29sb3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcHJvdmlkZSBjb2xvciByZXByZXNlbnRhdGlvbiBmb3IgYSBnaXZlbiBlbGVtZW50LgotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvckRlY29yYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb2xvclByb3ZpZGVyIHsKLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGEgZm9yZWdyb3VuZCBjb2xvciBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuCXRoZSBmb3JlZ3JvdW5kIGNvbG9yIGZvciB0aGUgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gCi0gICAgICogICB0byB1c2UgdGhlIGRlZmF1bHQgZm9yZWdyb3VuZCBjb2xvcgotICAgICAqLwotICAgIENvbG9yIGdldEZvcmVncm91bmQoT2JqZWN0IGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUHJvdmlkZXMgYSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotICAgICAqIEByZXR1cm4JdGhlIGJhY2tncm91bmQgY29sb3IgZm9yIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiAKLSAgICAgKiAgIHRvIHVzZSB0aGUgZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yCi0gICAgICovCi0gICAgQ29sb3IgZ2V0QmFja2dyb3VuZChPYmplY3QgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDM0NWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLS8qKiAKLSAqIEEgY29udGVudCBwcm92aWRlciBtZWRpYXRlcyBiZXR3ZWVuIHRoZSB2aWV3ZXIncyBtb2RlbAotICogYW5kIHRoZSB2aWV3ZXIgaXRzZWxmLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29udGVudFZpZXdlciNzZXRDb250ZW50UHJvdmlkZXIoSUNvbnRlbnRQcm92aWRlcikKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudFByb3ZpZGVyIHsKLSAgICAvKioKLSAgICAgKiBEaXNwb3NlcyBvZiB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuICAKLSAgICAgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgdmlld2VyIHdoZW4gaXQgaXMgZGlzcG9zZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZpZXdlciBzaG91bGQgbm90IGJlIHVwZGF0ZWQgZHVyaW5nIHRoaXMgY2FsbCwgYXMgaXQgaXMgaW4gdGhlIHByb2Nlc3MKLSAgICAgKiBvZiBiZWluZyBkaXNwb3NlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIHRoYXQgdGhlIGdpdmVuIHZpZXdlcidzIGlucHV0Ci0gICAgICogaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBkaWZmZXJlbnQgZWxlbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHR5cGljYWwgdXNlIGZvciB0aGlzIG1ldGhvZCBpcyByZWdpc3RlcmluZyB0aGUgY29udGVudCBwcm92aWRlciBhcyBhIGxpc3RlbmVyCi0gICAgICogdG8gY2hhbmdlcyBvbiB0aGUgbmV3IGlucHV0ICh1c2luZyBtb2RlbC1zcGVjaWZpYyBtZWFucyksIGFuZCBkZXJlZ2lzdGVyaW5nIHRoZSB2aWV3ZXIgCi0gICAgICogZnJvbSB0aGUgb2xkIGlucHV0LiBJbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucywgdGhlIGNvbnRlbnQgcHJvdmlkZXIKLSAgICAgKiBzaG91bGQgdXBkYXRlIHRoZSB2aWV3ZXIgKHNlZSB0aGUgYWRkLCByZW1vdmUsIHVwZGF0ZSBhbmQgcmVmcmVzaCBtZXRob2RzIG9uIHRoZSB2aWV3ZXJzKS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIHZpZXdlciBzaG91bGQgbm90IGJlIHVwZGF0ZWQgZHVyaW5nIHRoaXMgY2FsbCwgYXMgaXQgbWlnaHQgYmUgaW4gdGhlIHByb2Nlc3MKLSAgICAgKiBvZiBiZWluZyBkaXNwb3NlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIKLSAgICAgKiBAcGFyYW0gb2xkSW5wdXQgdGhlIG9sZCBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmlld2VyCi0gICAgICogICBkaWQgbm90IHByZXZpb3VzbHkgaGF2ZSBhbiBpbnB1dAotICAgICAqIEBwYXJhbSBuZXdJbnB1dCB0aGUgbmV3IGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIKLSAgICAgKiAgIGRvZXMgbm90IGhhdmUgYW4gaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JRGVjb3JhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JRGVjb3JhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmUwZTAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSURlY29yYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgcmVzdWx0IG9mIGRlY29yYXRpbmcgYW4gZWxlbWVudC4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGFuZCB3aWxsIGJlIHByb3ZpZGVkIHRvCi0gKiBpbnN0YW5jZXMgb2YgPGNvZGU+SUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I8L2NvZGU+LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEZWNvcmF0aW9uewotCi0JLyoqCi0JICogQ29uc3RhbnRzIGZvciBwbGFjZW1lbnQgb2YgaW1hZ2UgZGVjb3JhdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QX0xFRlQgPSAwOwotCi0JLyoqCi0JICogQ29uc3RhbnQgZm9yIHRoZSB0b3AgcmlnaHQgcXVhZHJhbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QX1JJR0hUID0gMTsKLQotCS8qKgotCSAqIENvbnN0YW50IGZvciB0aGUgYm90dG9tIGxlZnQgcXVhZHJhbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NX0xFRlQgPSAyOwotCi0JLyoqCi0JICogQ29uc3RhbnQgZm9yIHRoZSBib3R0b20gcmlnaHQgcXVhZHJhbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NX1JJR0hUID0gMzsKLQotCS8qKgotCSAqIENvbnN0YW50IGZvciB0aGUgdW5kZXJsYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMQVkgPSA0OwotCi0JLyoqCi0JICogQWRkcyBhIHByZWZpeCB0byB0aGUgZWxlbWVudCdzIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmaXgKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmaXgKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcmVmaXgoU3RyaW5nIHByZWZpeCk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgc3VmZml4IHRvIHRoZSBlbGVtZW50J3MgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHN1ZmZpeAotCSAqICAgICAgICAgICAgdGhlIHN1ZmZpeAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFN1ZmZpeChTdHJpbmcgc3VmZml4KTsKLQotCS8qKgotCSAqIEFkZHMgYW4gb3ZlcmxheSB0byB0aGUgZWxlbWVudCdzIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBvdmVybGF5Ci0JICogICAgICAgICAgICB0aGUgb3ZlcmxheSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHZvaWQgYWRkT3ZlcmxheShJbWFnZURlc2NyaXB0b3Igb3ZlcmxheSk7Ci0KLQkvKioKLQkgKiBBZGRzIGFuIG92ZXJsYXkgdG8gdGhlIGVsZW1lbnQncyBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3ZlcmxheQotCSAqICAgICAgICAgICAgdGhlIG92ZXJsYXkgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBxdWFkcmFudAotCSAqICAgICAgICAgICAgVGhlIGNvbnN0YW50IGZvciB0aGUgcXVhZHJhbnQgdG8gZHJhdyB0aGUgaW1hZ2Ugb24uCi0JICovCi0JcHVibGljIHZvaWQgYWRkT3ZlcmxheShJbWFnZURlc2NyaXB0b3Igb3ZlcmxheSwgaW50IHF1YWRyYW50KTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGZvcmVncm91bmQgY29sb3IgZm9yIHRoaXMgZGVjb3JhdGlvbi4KLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIHRvIGJlIHNldCBmb3IgdGhlIGZvcmVncm91bmQKLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IgZm9yIHRoaXMgZGVjb3JhdGlvbi4KLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIHRvIGJlIHNldCBmb3IgdGhlIGJhY2tncm91bmQKLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGZvbnQgZm9yIHRoaXMgZGVjb3JhdGlvbi4KLQkgKiBAcGFyYW0gZm9udCB0aGUgZm9udCB0byB1c2UgaW4gdGhpcyBkZWNvcmF0aW9uCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBmb250KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjb3JhdGlvbiBjb250ZXh0IGluIHdoaWNoIHRoaXMgZGVjb3JhdGlvbgotCSAqIHdpbGwgYmUgYXBwbGllZC4KLQkgKiBAcmV0dXJuIHRoZSBkZWNvcmF0aW9uIGNvbnRleHQKLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIElEZWNvcmF0aW9uQ29udGV4dCBnZXREZWNvcmF0aW9uQ29udGV4dCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JRGVjb3JhdGlvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSURlY29yYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMGU0ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JRGVjb3JhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0cy5Db250ZXh0OwotCi0vKioKLSAqIEEgZGVjb3JhdGlvbiBjb250ZXh0IHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8KLSAqIGEgbGFiZWwgZGVjb3JhdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cwotICogCi0gKiBAc2VlIExhYmVsRGVjb3JhdG9yCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVjb3JhdGlvbkNvbnRleHQgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaWRzIG9mIHRoZSBjb250ZXh0cyB0aGF0IGFyZSBhY3RpdmUgZm9yCi0JICogdGhlIGVsZW1lbnQgdGhhdCBpcyBiZWluZyBkZWNvcmF0ZWQuIENvbnRleHQgaWRzIGlkZW50aWZ5Ci0JICogYSBjb21tYW5kIHtAbGluayBDb250ZXh0fS4KLQkgKiBAcmV0dXJuIHRoZSBpZHMgb2YgdGhlIGNvbnRleHRzIHRoYXQgYXJlIGFjdGl2ZSBmb3IKLQkgKiB0aGUgZWxlbWVudCB0aGF0IGlzIGJlaW5nIGRlY29yYXRlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0cy5Db250ZXh0Ci0JICogQGRlcHJlY2F0ZWQgdG8gYmUgcmVtb3ZlZCBiZWZvcmUgTTUKLQkgKi8KLQlTdHJpbmdbXSBnZXRDb250ZXh0SWRzKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBjb250ZXh0LgotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb3BlcnRpZXMgdGhhdCBleGlzdCBpbiB0aGlzIGNvbnRleHQKLQkgKiAoaS5lLiB0aGUgc2V0IG9mIHByb3BlcnRpZXMgdGhhdCBoYXZlIHZhbHVlcyBhc3NvY2lhdGVkCi0JICogd2l0aCB0aGVtLgotCSAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgdGhhdCBleGlzdCBpbiB0aGlzIGNvbnRleHQKLQkgKi8KLQlTdHJpbmdbXSBnZXRQcm9wZXJ0aWVzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSURlbGF5ZWRMYWJlbERlY29yYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JRGVsYXllZExhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MjM1NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JRGVsYXllZExhYmVsRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotLyoqCi0gKiBBIGRlbGF5ZWQgbGFiZWwgZGVjb3JhdG9yIGlzIGEgbGFiZWwgZGVjb3JhdG9yIHRoYXQgbWF5IG5vdCBoYXZlIGEKLSAqIGRlY29yYXRpb24gYXZhaWxhYmxlIGltbWlkaWF0ZWx5LiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIHRoZSBtZXRob2RzIGZvcgotICogcmVxdWVzdGluZyB0aGUgcHJlcGFyYXRpb24gb2YgYSBkZWNvcmF0b3IgZm9yIGFuIG9iamVjdCBhbmQgZm9yIHF1ZXJ5aW5nCi0gKiBpZiB0aGUgZGVjb3JhdG9yIGlzIHJlYWR5LiBJbnRlcmVzdGVkIHBhcnRpZXMgc2hvdWxkIHJlZ2lzdGVyIGFuCi0gKiBJTGFiZWxQcm92aWRlckxpc3RlbmVyIHdpdGggYSBkZWxheWVkIGxhYmVsIGRlY29yYXRvciBpbiBvcmRlciB0byBiZSBpbmZvcm1lZAotICogd2hlbiB0aGUgZGVjb3JhdGlvbiBpcyByZWFkeS4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVsYXllZExhYmVsRGVjb3JhdG9yIGV4dGVuZHMgSUxhYmVsRGVjb3JhdG9yIHsKLQotICAgIC8qKgotICAgICAqIFByZXBhcmUgdGhlIGVsZW1lbnQgZm9yIGRlY29yYXRpb24uIElmIGl0IGlzIGFscmVhZHkgZGVjb3JhdGVkIGFuZCByZWFkeSBmb3IgdXBkYXRlCi0gICAgICogcmV0dXJuIHRydWUuIElmIGRlY29yYXRpb24gaXMgcGVuZGluZyByZXR1cm4gZmFsc2UuCi0gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gYmUgZGVjb3JhdGVkCi0gICAgICogQHBhcmFtIG9yaWdpbmFsVGV4dCBUaGUgc3RhcnRpbmcgdGV4dC4gCi0gICAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZWNvcmF0aW9uIGlzIHJlYWR5IGZvciB0aGlzIGVsZW1lbnQKLSAgICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIHByZXBhcmVEZWNvcmF0aW9uKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgb3JpZ2luYWxUZXh0KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JRG91YmxlQ2xpY2tMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JRG91YmxlQ2xpY2tMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjE2MjI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSURvdWJsZUNsaWNrTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi0vKioKLSAqIEEgbGlzdGVuZXIgd2hpY2ggaXMgbm90aWZpZWQgb2YgZG91YmxlLWNsaWNrIGV2ZW50cyBvbiB2aWV3ZXJzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEb3VibGVDbGlja0xpc3RlbmVyIHsKLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyBvZiBhIGRvdWJsZSBjbGljay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCBldmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgZG91YmxlLWNsaWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lFbGVtZW50Q29tcGFyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUVsZW1lbnRDb21wYXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWEwZmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUVsZW1lbnRDb21wYXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgaW4gYSB2aWV3ZXIgZm9yIGVxdWFsaXR5LAotICogYW5kIHRvIHByb3ZpZGUgdGhlIGhhc2ggY29kZSBmb3IgYW4gZWxlbWVudC4KLSAqIFRoaXMgYWxsb3dzIHRoZSBjbGllbnQgb2YgdGhlIHZpZXdlciB0byBzcGVjaWZ5IGRpZmZlcmVudCBlcXVhbGl0eSBjcml0ZXJpYQotICogYW5kIGEgZGlmZmVyZW50IGhhc2ggY29kZSBpbXBsZW1lbnRhdGlvbiB0aGFuIHRoZSAKLSAqIDxjb2RlPmVxdWFsczwvY29kZT4gYW5kIDxjb2RlPmhhc2hDb2RlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCi0gKiBlbGVtZW50cyB0aGVtc2VsdmVzLiAKLSAqIAotICogQHNlZSBTdHJ1Y3R1cmVkVmlld2VyI3NldENvbXBhcmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVsZW1lbnRDb21wYXJlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gZWxlbWVudHMgZm9yIGVxdWFsaXR5Ci0gICAgICogCi0gICAgICogQHBhcmFtIGEgdGhlIGZpcnN0IGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gYiB0aGUgc2Vjb25kIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgYSBpcyBlcXVhbCB0byBiCi0gICAgICovCi0gICAgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGEsIE9iamVjdCBiKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotICAgICAqLwotICAgIGludCBoYXNoQ29kZShPYmplY3QgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGQwMTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBmaWx0ZXJzLiBDYW4gYWNjZXB0IG9yIHJlamVjdCBpdGVtcy4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWx0ZXIgewotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIG9iamVjdCBwYXNzZXMgdGhpcyBmaWx0ZXIuCi0JICogCi0JICogQHBhcmFtIHRvVGVzdCBvYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBmaWx0ZXIgCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmZiB0aGUgb2JqZWN0IGlzIGFjY2VwdGVkIGJ5IHRoZSBmaWx0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JRm9udERlY29yYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JRm9udERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDdlMjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUZvbnREZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci0KLS8qKgotICogVGhlIElGb250RGVjb3JhdG9yIGlzIGFuIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHJldHVybiBhIGZvbnQgdG8KLSAqIGRlY29yYXRlIGFuIG9iamVjdC4KLSAqIAotICogSWYgYW4gSUZvbnREZWNvcmF0b3IgZGVjb3JhdGVzIGEgZm9udCBpbiBhbiBvYmplY3QgdGhhdCBhbHNvIGhhcwotICogYW4gSUZvbnRQcm92aWRlciB0aGUgSUZvbnREZWNvcmF0b3Igd2lsbCB0YWtlIHByZWNlbmRlbmNlLgotICogQHNlZSBJRm9udFByb3ZpZGVyCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJRm9udERlY29yYXRvciB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb250IGZvciBlbGVtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlCi0JICogaXMgbm90IG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gRm9udCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBGb250IGRlY29yYXRlRm9udChPYmplY3QgZWxlbWVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUZvbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JRm9udFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzliNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JRm9udFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotCi0vKioKLSAqIEludGVyZmFjZSB0byBwcm92aWRlIGZvbnQgcmVwcmVzZW50YXRpb24gZm9yIGEgZ2l2ZW4gZWxlbWVudC4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRm9udERlY29yYXRvcgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZvbnRQcm92aWRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBhIGZvbnQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICogQHJldHVybiB0aGUgZm9udCBmb3IgdGhlIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IAotICAgICAqICAgdG8gdXNlIHRoZSBkZWZhdWx0IGZvbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgRm9udCBnZXRGb250KE9iamVjdCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUlucHV0UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUlucHV0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiZWQwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lJbnB1dFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotLyoqCi0gKiBJbnRlcmZhY2UgY29tbW9uIHRvIGFsbCBvYmplY3RzIHRoYXQgcHJvdmlkZSBhbiBpbnB1dC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5wdXRQcm92aWRlciB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5wdXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lJbnB1dFNlbGVjdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lJbnB1dFNlbGVjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTJjNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JSW5wdXRTZWxlY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLS8qKgotICogSW50ZXJmYWNlIGNvbW1vbiB0byBhbGwgb2JqZWN0cyB0aGF0IHByb3ZpZGUgYm90aCBhbiBpbnB1dCBhbmQKLSAqIGEgc2VsZWN0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnB1dFNlbGVjdGlvblByb3ZpZGVyIGV4dGVuZHMgSUlucHV0UHJvdmlkZXIsCi0gICAgICAgIElTZWxlY3Rpb25Qcm92aWRlciB7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lMYWJlbERlY29yYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JTGFiZWxEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE3MWRkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lMYWJlbERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQSBsYWJlbCBkZWNvcmF0b3IgZGVjb3JhdGVzIHRoZSBsYWJlbCB0ZXh0IGFuZCBpbWFnZSBmb3Igc29tZSBlbGVtZW50LgotICogVGhlIG9yaWdpbmFsIGxhYmVsIHRleHQgYW5kIGltYWdlIGFyZSBvYnRhaW5lZCBieSBzb21lIG90aGVyIG1lYW5zLAotICogZm9yIGV4YW1wbGUgYnkgYSBsYWJlbCBwcm92aWRlci4KLSAqCi0gKiBAc2VlIElMYWJlbFByb3ZpZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxhYmVsRGVjb3JhdG9yIGV4dGVuZHMgSUJhc2VMYWJlbFByb3ZpZGVyIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGltYWdlIHRoYXQgaXMgYmFzZWQgb24gdGhlIGdpdmVuIGltYWdlLAotICAgICAqIGJ1dCBkZWNvcmF0ZWQgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBzdGF0ZQotICAgICAqIG9mIHRoZSBwcm92aWRlZCBlbGVtZW50LgotICAgICAqIAotICAgICAqIFRleHQgYW5kIGltYWdlIGRlY29yYXRpb24gdXBkYXRlcyBjYW4gb2NjdXIgYXMgYSByZXN1bHQgb2Ygb3RoZXIgdXBkYXRlcwotICAgICAqIHdpdGhpbiB0aGUgd29ya2JlbmNoIGluY2x1ZGluZyBkZWZlcnJlZCBkZWNvcmF0aW9uIGJ5IGJhY2tncm91bmQgcHJvY2Vzc2VzLgotICAgICAqIENsaWVudHMgc2hvdWxkIGhhbmRsZSBsYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50cyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgdG8gZ2V0Ci0gICAgICogdGhlIGNvbXBsZXRlIGRlY29yYXRpb24uCi0gICAgICogQHNlZSBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50Ci0gICAgICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgaW5wdXQgaW1hZ2UgdG8gZGVjb3JhdGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGhhcyBubyBpbWFnZQotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHdob3NlIGltYWdlIGlzIGJlaW5nIGRlY29yYXRlZAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZGVjb3JhdGlvbiBpcyB0byBiZSBhcHBsaWVkCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBkZWNvcmF0ZUltYWdlKEltYWdlIGltYWdlLCBPYmplY3QgZWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdGV4dCBsYWJlbCB0aGF0IGlzIGJhc2VkIG9uIHRoZSBnaXZlbiB0ZXh0IGxhYmVsLAotICAgICAqIGJ1dCBkZWNvcmF0ZWQgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBzdGF0ZQotICAgICAqIG9mIHRoZSBwcm92aWRlZCBlbGVtZW50LgotICAgICAqIAotICAgICAqIFRleHQgYW5kIGltYWdlIGRlY29yYXRpb24gdXBkYXRlcyBjYW4gb2NjdXIgYXMgYSByZXN1bHQgb2Ygb3RoZXIgdXBkYXRlcwotICAgICAqIHdpdGhpbiB0aGUgd29ya2JlbmNoIGluY2x1ZGluZyBkZWZlcnJlZCBkZWNvcmF0aW9uIGJ5IGJhY2tncm91bmQgcHJvY2Vzc2VzLgotICAgICAqIENsaWVudHMgc2hvdWxkIGhhbmRsZSBsYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50cyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgdG8gZ2V0Ci0gICAgICogdGhlIGNvbXBsZXRlIGRlY29yYXRpb24uCi0gICAgICogQHNlZSBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50Ci0gICAgICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBpbnB1dCB0ZXh0IGxhYmVsIHRvIGRlY29yYXRlCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgd2hvc2UgaW1hZ2UgaXMgYmVpbmcgZGVjb3JhdGVkCi0gICAgICogQHJldHVybiB0aGUgZGVjb3JhdGVkIHRleHQgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGRlY29yYXRpb24gaXMgdG8gYmUgYXBwbGllZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZGVjb3JhdGVUZXh0KFN0cmluZyB0ZXh0LCBPYmplY3QgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OWFlMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogRXh0ZW5kcyA8Y29kZT5JQmFzZUxhYmVsUHJvdmlkZXI8L2NvZGU+IHdpdGggdGhlIG1ldGhvZHMKLSAqIHRvIHByb3ZpZGUgdGhlIHRleHQgYW5kL29yIGltYWdlIGZvciB0aGUgbGFiZWwgb2YgYSBnaXZlbiBlbGVtZW50LiAKLSAqIFVzZWQgYnkgbW9zdCBzdHJ1Y3R1cmVkIHZpZXdlcnMsIGV4Y2VwdCB0YWJsZSB2aWV3ZXJzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMYWJlbFByb3ZpZGVyIGV4dGVuZHMgSUJhc2VMYWJlbFByb3ZpZGVyIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LiAgVGhlIGltYWdlCi0gICAgICogaXMgb3duZWQgYnkgdGhlIGxhYmVsIHByb3ZpZGVyIGFuZCBtdXN0IG5vdCBiZSBkaXNwb3NlZCBkaXJlY3RseS4KLSAgICAgKiBJbnN0ZWFkLCBkaXNwb3NlIHRoZSBsYWJlbCBwcm92aWRlciB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgaW1hZ2UKLSAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSB1c2VkIHRvIGxhYmVsIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICAgaWYgdGhlcmUgaXMgbm8gaW1hZ2UgZm9yIHRoZSBnaXZlbiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIHByb3ZpZGUgdGhlIGxhYmVsIHRleHQKLSAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0IHN0cmluZyB1c2VkIHRvIGxhYmVsIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICAgaWYgdGhlcmUgaXMgbm8gdGV4dCBsYWJlbCBmb3IgdGhlIGdpdmVuIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lMYWJlbFByb3ZpZGVyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUxhYmVsUHJvdmlkZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzZkZGYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUxhYmVsUHJvdmlkZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLS8qKiAKLSAqIEEgbGlzdGVuZXIgd2hpY2ggaXMgbm90aWZpZWQgd2hlbiBhIGxhYmVsIHByb3ZpZGVyJ3Mgc3RhdGUgY2hhbmdlcy4KLSAqCi0gKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcgotICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGFiZWxQcm92aWRlckxpc3RlbmVyIHsKLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgdGhlIHN0YXRlIG9mIHRoZSBsYWJlbCBwcm92aWRlciAKLSAgICAgKiBoYXMgY2hhbmdlZCBpbiBhIHdheSB0aGF0IGFmZmVjdHMgdGhlIGxhYmVscyBpdCBjb21wdXRlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHR5cGljYWwgcmVzcG9uc2Ugd291bGQgYmUgdG8gcmVmcmVzaCBhbGwgbGFiZWxzIGJ5IAotICAgICAqIHJlLXJlcXVlc3RpbmcgdGhlbSBmcm9tIHRoZSBsYWJlbCBwcm92aWRlci4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGxhYmVsIHByb3ZpZGVyIGNoYW5nZSBldmVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JTGF6eUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JTGF6eUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2FiYWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUxhenlDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi0vKioKLSAqIFRoZSBJTGF6eUNvbnRlbnRQcm92aWRlciBpcyB0aGUgY29udGVudCBwcm92aWRlcgotICogZm9yIHRhYmxlIHZpZXdlcnMgY3JlYXRlZCB1c2luZyB0aGUgU1dULlZJUlRVQUwgZmxhZyB0aGF0Ci0gKiBvbmx5IHdpc2ggdG8gcmV0dXJuIHRoaWVyIGNvbnRlbnRzIGFzIHRoZXkgYXJlIHF1ZXJpZWQuCi0gKiAKLSAqIDxzdHJvbmc+Tk9URTo8L3N0cm9uZz4gQXMgdGhlIElMYXp5Q29udGVudFByb3ZpZGVyIGRvZXMKLSAqIG5vdCBoYXZlIEFQSSBmb3IgZGV0ZXJtaW5pbmcgdGhlIHRvdGFsIGl0ZW0gY291bnQgYW55Ci0gKiBjaGFuZ2VzIHRvIHRoZSBudW1iZXIgb2YgaXRlbXMgZm9yIHRoaXMgb2JqZWN0IHdoaWxlCi0gKiByZXF1aXJlIGEgY2FsbCB0byA8Y29kZT4jc2V0SXRlbUNvdW50PC9jb2RlPiBvbiB0aGUgCi0gKiB2aWV3ZXIgdGhhdCB1c2VzIGl0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMYXp5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgSUNvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogQ2FsbGVkIHdoZW4gYSBwcmV2aW91c2x5LWJsYW5rIGl0ZW0gYmVjb21lcyB2aXNpYmxlIGluIHRoZQotCSAqIFRhYmxlVmlld2VyLiBJZiB0aGUgY29udGVudCBwcm92aWRlciBrbm93cyB0aGUgZWxlbWVudAotCSAqIGF0IHRoaXMgcm93LCBpdCBzaG91bGQgcmVzcG9uZCBieSBjYWxsaW5nIAotCSAqIFRhYmxlVmlld2VyI3JlcGxhY2UoT2JqZWN0LCBpbnQpLgotCSAqIAotCSAqIDxzdHJvbmc+Tk9URTwvc3Ryb25nPiAjdXBkYXRlRWxlbWVudChpbnQgaW5kZXgpIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBzZWxlY3Rpb24KLQkgKiB2YWx1ZXMuIFRhYmxlVmlld2VyI3JlcGxhY2UoT2JqZWN0LCBpbnQpIGlzIG5vdCBjYWxsZWQgYmVmb3JlIAotCSAqIHJldHVybmluZyBmcm9tIHRoaXMgbWV0aG9kIHNlbGVjdGlvbnMgbWF5IGhhdmUgbWlzc2luZyBvciBzdGFsZSBlbGVtZW50cy4KLQkgKiBJbiB0aGlzIHNpdHVhdGlvbiBpdCBpcyBzdWdnZXN0ZWQgdGhhdCB0aGUgc2VsZWN0aW9uIGlzIGFza2VkCi0JICogZm9yIGFnYWluIGFmdGVyIGhlIHVwZGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRoYXQgaXMgYmVpbmcgdXBkYXRlZWQgaW4gdGhlCi0JICogdGFibGUuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudChpbnQgaW5kZXgpOwotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JTGF6eVRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUxhenlUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTY3NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JTGF6eVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi0vKioKLSAqIFRoZSBJTGF6eVRyZWVDb250ZW50UHJvdmlkZXIgaXMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRyZWUgdmlld2VycyBjcmVhdGVkCi0gKiB1c2luZyB0aGUgU1dULlZJUlRVQUwgZmxhZyB0aGF0IG9ubHkgd2lzaCB0byByZXR1cm4gdGhlaXIgY29udGVudHMgYXMgdGhleQotICogYXJlIHF1ZXJpZWQuCi0gKiAKLSAqIDxzdHJvbmc+Tk9URTo8L3N0cm9uZz4gQ2hhbmdlcyB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zIGZvciBhIGdpdmVuIHBhcmVudAotICogcmVxdWlyZSBhIGNhbGwgdG8ge0BsaW5rIFRyZWVWaWV3ZXIjc2V0Q2hpbGRDb3VudChPYmplY3QsIGludCl9IG9uIHRoZSB0cmVlIHZpZXdlciwgb3IKLSAqIGNhbGxzIHRvIHRoZSB2aWV3ZXIncyA8Y29kZT5hZGQoKTwvY29kZT4gb3IgPGNvZGU+cmVtb3ZlKCk8L2NvZGU+Ci0gKiBtZXRob2RzLgotICogCi0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHJlbWFpbgotICogdW5jaGFuZ2VkIGR1cmluZyB0aGUgMy4yIHJlbGVhc2UgY3ljbGUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMYXp5VHJlZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIElDb250ZW50UHJvdmlkZXIgewotCS8qKgotCSAqIENhbGxlZCB3aGVuIGEgcHJldmlvdXNseS1ibGFuayBpdGVtIGJlY29tZXMgdmlzaWJsZSBpbiB0aGUgVHJlZVZpZXdlci4gSWYKLQkgKiB0aGUgY29udGVudCBwcm92aWRlciBrbm93cyB0aGUgY2hpbGQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIHBhcmVudCBhdCB0aGlzCi0JICogaW5kZXgsIGl0IHNob3VsZCByZXNwb25kIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgVHJlZVZpZXdlciNyZXBsYWNlKE9iamVjdCwgaW50LCBPYmplY3QpfS4gSWYgdGhlIGNvbnRlbnQgcHJvdmlkZXIKLQkgKiBrbm93cyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGZvciB0aGUgY2hpbGQgZWxlbWVudCwgaXQgc2hvdWxkIGFsc28gY2FsbAotCSAqIHtAbGluayBUcmVlVmlld2VyI3NldENoaWxkQ291bnQoT2JqZWN0LCBpbnQpfS4KLQkgKiAKLQkgKiA8c3Ryb25nPk5PVEU8L3N0cm9uZz4gI3VwZGF0ZUVsZW1lbnQoaW50IGluZGV4KSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUKLQkgKiBzZWxlY3Rpb24gdmFsdWVzLiBJZiBUYWJsZVZpZXdlciNyZXBsYWNlKE9iamVjdCwgaW50KSBpcyBub3QgY2FsbGVkCi0JICogYmVmb3JlIHJldHVybmluZyBmcm9tIHRoaXMgbWV0aG9kLCBzZWxlY3Rpb25zIG1heSBoYXZlIG1pc3Npbmcgb3Igc3RhbGUKLQkgKiBlbGVtZW50cy4gSW4gdGhpcyBzaXR1YXRpb24gaXQgaXMgc3VnZ2VzdGVkIHRoYXQgdGhlIHNlbGVjdGlvbiBpcyBhc2tlZAotCSAqIGZvciBhZ2FpbiBhZnRlciByZXBsYWNlKCkgaGFzIGJlZW4gY2FsbGVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIFRoZSBjaGlsZCBpbmRleCBvZiB0aGUgcGFyZW50IHRoYXQgaXMgYmVpbmcgdXBkYXRlZCBpbiB0aGUKLQkgKiAgICAgICAgICAgIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudChPYmplY3QgcGFyZW50LCBpbnQgaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50IGZvciB0aGUgZ2l2ZW4gZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gCi0gICAgICogaW5kaWNhdGluZyB0aGF0IHRoZSBwYXJlbnQgY2FuJ3QgYmUgY29tcHV0ZWQuIAotICAgICAqIEluIHRoaXMgY2FzZSB0aGUgdHJlZS1zdHJ1Y3R1cmVkIHZpZXdlciBjYW4ndCBleHBhbmQKLSAgICAgKiBhIGdpdmVuIG5vZGUgY29ycmVjdGx5IGlmIHJlcXVlc3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICogQHJldHVybiB0aGUgcGFyZW50IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0Ci0gICAgICogICBoYXMgbm9uZSBvciBpZiB0aGUgcGFyZW50IGNhbm5vdCBiZSBjb21wdXRlZAotICAgICAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhNDk4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotLyoqCi0gKiBUaGUgPGNvZGU+SUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I8L2NvZGU+IGlzIGEgZGVjb3JhdG9yIHRoYXQgZGVjb3JhdGVzCi0gKiB1c2luZyBhIHByZWZpeCwgc3VmZml4IGFuZCBvdmVybGF5IGltYWdlIHJhdGhlciB0aGFuIGRvaW5nIGFsbCAKLSAqIG9mIHRoZSBpbWFnZSBhbmQgdGV4dCBtYW5hZ2VtZW50IGl0c2VsZiBsaWtlIGFuIDxjb2RlPklMYWJlbERlY29yYXRvcjwvY29kZT4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgZXh0ZW5kcyBJQmFzZUxhYmVsUHJvdmlkZXIgewotCi0gICAgLyoqCi0gICAgICogQ2FsY3VsYXRlcyBkZWNvcmF0aW9ucyBiYXNlZCBvbiBlbGVtZW50LiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBkZWNvcmF0ZQotICAgICAqIEBwYXJhbSBkZWNvcmF0aW9uIHRoZSBkZWNvcmF0aW9uIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JT3Blbkxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lPcGVuTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhNzU4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lPcGVuTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi0vKioKLSAqIEEgbGlzdGVuZXIgd2hpY2ggaXMgbm90aWZpZWQgb2Ygb3BlbiBldmVudHMgb24gdmlld2Vycy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJT3Blbkxpc3RlbmVyIHsKLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyBvZiBhbiBvcGVuIGV2ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IGV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBvcGVuIGV2ZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3BlbihPcGVuRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JUG9zdFNlbGVjdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lQb3N0U2VsZWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E5MDBjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lQb3N0U2VsZWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi0vKioKLSAqIFNlbGVjdGlvbiBwcm92aWRlciBleHRlbnNpb24gaW50ZXJmYWNlIHRvIGFsbG93IHByb3ZpZGVycwotICogdG8gbm90aWZ5IGFib3V0IHBvc3Qgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnRzLgotICogQSBwb3N0IHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IGlzIGVxdWl2YWxlbnQgdG8gc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQKLSAqIGlmIHRoZSBzZWxlY3Rpb24gY2hhbmdlIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIG1vdXNlLCBidXQgaXQgaGFzIGEgZGVsYXkgCi0gKiBpZiB0aGUgc2VsZWN0aW9uIGNoYW5nZSBpcyB0cmlnZ2VyZWQgYnkga2V5Ym9hcmQgbmF2aWdhdGlvbi4KLSAqCi0gKiBAc2VlIElTZWxlY3Rpb25Qcm92aWRlcgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBvc3RTZWxlY3Rpb25Qcm92aWRlciBleHRlbmRzIElTZWxlY3Rpb25Qcm92aWRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIHBvc3Qgc2VsZWN0aW9uIGNoYW5nZXMgaW4gdGhpcyBzZWxlY3Rpb24gcHJvdmlkZXIuCi0gICAgICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIGEgc2VsZWN0aW9uIGNoYW5nZWQgbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotICAgICAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBsaXN0ZW5lciBmb3IgcG9zdCBzZWxlY3Rpb24gY2hhbmdlcyBmcm9tIHRoaXMgc2VsZWN0aW9uIAotICAgICAqIHByb3ZpZGVyLgotICAgICAqIEhhcyBubyBhZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIGEgc2VsZWN0aW9uIGNoYW5nZWQgbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotICAgICAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSVNlbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MDk3ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGEgc2VsZWN0aW9uLgotICoKLSAqIEBzZWUgSVNlbGVjdGlvblByb3ZpZGVyCi0gKiBAc2VlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAqIEBzZWUgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlbGVjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZWxlY3Rpb24gaXMgZW1wdHkuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlbGVjdGlvbiBpcyBlbXB0eSwKLSAgICAgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0ZDRkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi0vKiogCi0gKiBBIGxpc3RlbmVyIHdoaWNoIGlzIG5vdGlmaWVkIHdoZW4gYSB2aWV3ZXIncyBzZWxlY3Rpb24gY2hhbmdlcy4KLSAqCi0gKiBAc2VlIElTZWxlY3Rpb24KLSAqIEBzZWUgSVNlbGVjdGlvblByb3ZpZGVyCi0gKiBAc2VlIFNlbGVjdGlvbkNoYW5nZWRFdmVudAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCBldmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgY2hhbmdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JU2VsZWN0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSVNlbGVjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Y2YyYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JU2VsZWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi0vKioKLSAqIEludGVyZmFjZSBjb21tb24gdG8gYWxsIG9iamVjdHMgdGhhdCBwcm92aWRlIGEgc2VsZWN0aW9uLgotICoKLSAqIEBzZWUgSVNlbGVjdGlvbgotICogQHNlZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gKiBAc2VlIFNlbGVjdGlvbkNoYW5nZWRFdmVudAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZWxlY3Rpb25Qcm92aWRlciB7Ci0gICAgLyoqCi0gICAgICogQWRkcyBhIGxpc3RlbmVyIGZvciBzZWxlY3Rpb24gY2hhbmdlcyBpbiB0aGlzIHNlbGVjdGlvbiBwcm92aWRlci4KLSAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgYSBzZWxlY3Rpb24gY2hhbmdlZCBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGZvciB0aGlzIHByb3ZpZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBzZWxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBzZWxlY3Rpb24gcHJvdmlkZXIuCi0gICAgICogSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgYSBzZWxlY3Rpb24gY2hhbmdlZCBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLSAgICAgICAgICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gZm9yIHRoaXMgc2VsZWN0aW9uIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgbmV3IHNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlM2E4NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIHRvIGNvbnRlbnQgcHJvdmlkZXJzIGZvciBzdHJ1Y3R1cmVkIHZpZXdlcnMuCi0gKgotICogQHNlZSBTdHJ1Y3R1cmVkVmlld2VyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBJQ29udGVudFByb3ZpZGVyIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIgCi0gICAgICogd2hlbiBpdHMgaW5wdXQgaXMgc2V0IHRvIHRoZSBnaXZlbiBlbGVtZW50LiAKLSAgICAgKiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwgaXRlbXMgaW4gYSBsaXN0LCBldGMuCi0gICAgICogVGhlIHJlc3VsdCBpcyBub3QgbW9kaWZpZWQgYnkgdGhlIHZpZXdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnB1dEVsZW1lbnQgdGhlIGlucHV0IGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lTdHJ1Y3R1cmVkU2VsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lTdHJ1Y3R1cmVkU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MWVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JU3RydWN0dXJlZFNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQSBzZWxlY3Rpb24gY29udGFpbmluZyBlbGVtZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBleHRlbmRzIElTZWxlY3Rpb24gewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhpcyBzZWxlY3Rpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgdGhlIHNlbGVjdGlvbiBpcyBlbXB0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIG9mIHRoaXMgc2VsZWN0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBzZWxlY3RlZCBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHNlbGVjdGVkIGluIHRoaXMgc2VsZWN0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHNlbGVjdGVkCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyBpbiB0aGlzIHNlbGVjdGlvbiBhcyBhbiBhcnJheS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIGVsZW1lbnRzIGFzIGFuIGFycmF5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRzIGluIHRoaXMgc2VsZWN0aW9uIGFzIGEgPGNvZGU+TGlzdDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3RlZCBlbGVtZW50cyBhcyBhIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCB0b0xpc3QoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSVRhYmxlQ29sb3JQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JVGFibGVDb2xvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMDM0NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JVGFibGVDb2xvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAtIEd1bm5hciBBaGxiZXJnIChJQlMgQUIsIHd3dy5pYnMubmV0KQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGZ1cnRoZXIgcmV2aXNpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBwcm92aWRlIGNvbG9yIHJlcHJlc2VudGF0aW9uIGZvciBhIGdpdmVuIGNlbGwgd2l0aGluCi0gKiB0aGUgcm93IGZvciBhbiBlbGVtZW50IGluIGEgdGFibGUuCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhYmxlQ29sb3JQcm92aWRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBhIGZvcmVncm91bmQgY29sb3IgZm9yIHRoZSBnaXZlbiBlbGVtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gd2hpY2gKLSAgICAgKiAJdGhlIGNvbG9yIGFwcGVhcnMKLSAgICAgKiBAcmV0dXJuIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIGZvciB0aGUgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICAgKiAgICAgICAgIHVzZSB0aGUgZGVmYXVsdCBmb3JlZ3JvdW5kIGNvbG9yCi0gICAgICovCi0gICAgQ29sb3IgZ2V0Rm9yZWdyb3VuZChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KTsKLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGEgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gd2hpY2ggdGhlIGNvbG9yIGFwcGVhcnMKLSAgICAgKiBAcmV0dXJuIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICAgKiAgICAgICAgIHVzZSB0aGUgZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yCi0gICAgICogIAotICAgICAqLwotICAgIENvbG9yIGdldEJhY2tncm91bmQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lUYWJsZUZvbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JVGFibGVGb250UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjZDUzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lUYWJsZUZvbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLQotLyoqCi0gKiBUaGUgSVRhYmxlRm9udFByb3ZpZGVyIGlzIGEgZm9udCBwcm92aWRlciB0aGF0IHByb3ZpZGVzIGZvbnRzIHRvIAotICogaW5kaXZpZHVhbCBjZWxscyB3aXRoaW4gdGFibGVzLgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWJsZUZvbnRQcm92aWRlciB7Ci0JCi0JLyoqCi0JICogUHJvdmlkZXMgYSBmb250IGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBhdCBpbmRleAotCSAqIGNvbHVtbkluZGV4LgotCSAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IGJlaW5nIGRpc3BsYXllZAotCSAqIEBwYXJhbSBjb2x1bW5JbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbHVtbiBiZWluZyBkaXNwbGF5ZWQKLQkgKiBAcmV0dXJuIEZvbnQKLQkgKi8KLQlwdWJsaWMgRm9udCBnZXRGb250KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lUYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSVRhYmxlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzhlYjhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSVRhYmxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogRXh0ZW5kcyA8Y29kZT5JQmFzZUxhYmVsUHJvdmlkZXI8L2NvZGU+IHdpdGggdGhlIG1ldGhvZHMKLSAqIHRvIHByb3ZpZGUgdGhlIHRleHQgYW5kL29yIGltYWdlIGZvciBlYWNoIGNvbHVtbiBvZiBhIGdpdmVuIGVsZW1lbnQuICAKLSAqIFVzZWQgYnkgdGFibGUgdmlld2Vycy4KLSAqCi0gKiBAc2VlIFRhYmxlVmlld2VyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIElCYXNlTGFiZWxQcm92aWRlciB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFiZWwgaW1hZ2UgZm9yIHRoZSBnaXZlbiBjb2x1bW4gb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZW50aXJlIHJvdywgb3IgCi0gICAgICogICAgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyB0aGF0IG5vIGlucHV0IG9iamVjdCBpcyBzZXQKLSAgICAgKiAgICBpbiB0aGUgdmlld2VyCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gd2hpY2gKLSAgICAgKiAgIHRoZSBsYWJlbCBhcHBlYXJzCi0gICAgICogQHJldHVybiBJbWFnZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBpbWFnZSBmb3IgdGhlIAotICAgICAqICBnaXZlbiBvYmplY3QgYXQgY29sdW1uSW5kZXgKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgZ2l2ZW4gY29sdW1uIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVudGlyZSByb3csIG9yCi0gICAgICogICA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgbm8gaW5wdXQgb2JqZWN0IGlzIHNldAotICAgICAqICAgaW4gdGhlIHZpZXdlcgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgY29sdW1uIGluIHdoaWNoIHRoZSBsYWJlbCBhcHBlYXJzCi0gICAgICogQHJldHVybiBTdHJpbmcgb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gdGV4dCBmb3IgdGhlIAotICAgICAqICBnaXZlbiBvYmplY3QgYXQgY29sdW1uSW5kZXgKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YzlmMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIHRvIGNvbnRlbnQgcHJvdmlkZXJzIGZvciB0cmVlLXN0cnVjdHVyZS1vcmllbnRlZAotICogdmlld2Vycy4KLSAqCi0gKiBAc2VlIEFic3RyYWN0VHJlZVZpZXdlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUcmVlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgZWxlbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgbWV0aG9kIGFuZCA8Y29kZT5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50czwvY29kZT4gCi0gICAgICogaXMgdGhhdCA8Y29kZT5nZXRFbGVtZW50czwvY29kZT4gaXMgY2FsbGVkIHRvIG9idGFpbiB0aGUgCi0gICAgICogdHJlZSB2aWV3ZXIncyByb290IGVsZW1lbnRzLCB3aGVyZWFzIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBpcyB1c2VkCi0gICAgICogdG8gb2J0YWluIHRoZSBjaGlsZHJlbiBvZiBhIGdpdmVuIHBhcmVudCBlbGVtZW50IGluIHRoZSB0cmVlIChpbmNsdWRpbmcgYSByb290KS4KLSAgICAgKiA8L3A+Ci0gICAgICogVGhlIHJlc3VsdCBpcyBub3QgbW9kaWZpZWQgYnkgdGhlIHZpZXdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IHRoZSBwYXJlbnQgZWxlbWVudAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2hpbGQgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50IGZvciB0aGUgZ2l2ZW4gZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gCi0gICAgICogaW5kaWNhdGluZyB0aGF0IHRoZSBwYXJlbnQgY2FuJ3QgYmUgY29tcHV0ZWQuIAotICAgICAqIEluIHRoaXMgY2FzZSB0aGUgdHJlZS1zdHJ1Y3R1cmVkIHZpZXdlciBjYW4ndCBleHBhbmQKLSAgICAgKiBhIGdpdmVuIG5vZGUgY29ycmVjdGx5IGlmIHJlcXVlc3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICogQHJldHVybiB0aGUgcGFyZW50IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0Ci0gICAgICogICBoYXMgbm9uZSBvciBpZiB0aGUgcGFyZW50IGNhbm5vdCBiZSBjb21wdXRlZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCBoYXMgY2hpbGRyZW4uCi0gICAgICogPHA+Ci0gICAgICogSW50ZW5kZWQgYXMgYW4gb3B0aW1pemF0aW9uIGZvciB3aGVuIHRoZSB2aWV3ZXIgZG9lcyBub3QKLSAgICAgKiBuZWVkIHRoZSBhY3R1YWwgY2hpbGRyZW4uICBDbGllbnRzIG1heSBiZSBhYmxlIHRvIGltcGxlbWVudAotICAgICAqIHRoaXMgbW9yZSBlZmZpY2llbnRseSB0aGFuIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaGFzIGNoaWxkcmVuLAotICAgICAqICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGhhcyBubyBjaGlsZHJlbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSVRyZWVTZWxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSVRyZWVTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkNWU1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lUcmVlU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi0vKioKLSAqIEEgc2VsZWN0aW9uIGNvbnRhaW5pbmcgdHJlZSBwYXRocy4KLSAqIAotICogQHNpbmNlIDMuMgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVHJlZVNlbGVjdGlvbiBleHRlbmRzIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGhzIGluIHRoaXMgc2VsZWN0aW9uCi0JICogCi0JICogQHJldHVybiB0aGUgcGF0aHMgaW4gdGhpcyBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgVHJlZVBhdGhbXSBnZXRQYXRocygpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lUcmVlVmlld2VyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSVRyZWVWaWV3ZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGE2OTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvSVRyZWVWaWV3ZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLS8qKiAKLSAqIEEgbGlzdGVuZXIgd2hpY2ggaXMgbm90aWZpZWQgd2hlbiBhIHRyZWUgdmlld2VyIGV4cGFuZHMgb3IgY29sbGFwc2VzCi0gKiBhIG5vZGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRyZWVWaWV3ZXJMaXN0ZW5lciB7Ci0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCBhIG5vZGUgaW4gdGhlIHRyZWUgaGFzIGJlZW4gY29sbGFwc2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IGV2ZW50IG9iamVjdCBkZXNjcmliaW5nIGRldGFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGF0IGEgbm9kZSBpbiB0aGUgdHJlZSBoYXMgYmVlbiBleHBhbmRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCBldmVudCBvYmplY3QgZGVzY3JpYmluZyBkZXRhaWxzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lWaWV3ZXJMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0lWaWV3ZXJMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTIxN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9JVmlld2VyTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLS8qKgotICogRXh0ZW5kcyA8Y29kZT5JQmFzZUxhYmVsUHJvdmlkZXI8L2NvZGU+IHdpdGggdGhlIG1ldGhvZHMKLSAqIHRvIHVwZGF0ZSB0aGUgbGFiZWwgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gIFRoZSBsYWJlbCBpcyByZXByZXNlbnRlZCBieSBhIAotICogPGNvZGU+Vmlld2VyTGFiZWw8L2NvZGU+LgotICogVW5saWtlIDxjb2RlPklMYWJlbFByb3ZpZGVyPC9jb2RlPiwgdGhpcyBhbGxvd3MgdGhlIHRleHQgYW5kIGltYWdlIHRvIGJlCi0gKiBzZXQgaW4gdGhlIHNhbWUgcmVxdWVzdCwgcmF0aGVyIHRoYW4gdmlhIHNlcGFyYXRlIHJlcXVlc3RzLiAgCi0gKiA8cD4KLSAqIEl0IGFsc28gYWxsb3dzIHRoZSBjdXJyZW50IHZhbHVlcyBmb3IgdGhlIHRleHQgYW5kIGltYWdlIHRvIGJlIGNvbnNpZGVyZWQgYnkgCi0gKiB0aGUgbGFiZWwgcHJvdmlkZXIsIGFsbG93aW5nIGZvciBwb3RlbnRpYWwgb3B0aW1pemF0aW9ucy4KLSAqIEZvciBleGFtcGxlLCBkZWNvcmF0aW5nIGxhYmVsIHByb3ZpZGVycyB0aGF0IHJ1biBpbiB0aGUgYmFja2dyb3VuZCBjYW4gaG9sZCBvZmYKLSAqIGFwcGx5aW5nIGFuIHVwZGF0ZSB0byBhIHByZXZpb3VzbHkgcG9wdWxhdGVkIGxhYmVsIHVudGlsIHRoZSBkZWNvcmF0aW9uIGlzIHJlYWR5LAotICogdGhlcmVieSByZWR1Y2luZyBmbGlja2VyLgotICogPC9wPgotICogCi0gKiBAc2VlIElEZWxheWVkTGFiZWxEZWNvcmF0b3IKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmlld2VyTGFiZWxQcm92aWRlciBleHRlbmRzIElCYXNlTGFiZWxQcm92aWRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCB0byB1cGRhdGUKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUxhYmVsKFZpZXdlckxhYmVsIGxhYmVsLCBPYmplY3QgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0xhYmVsRGVjb3JhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0xhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OTkxYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9MYWJlbERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGUgTGFiZWxEZWNvcmF0b3IgaXMgYW4gYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBJTGFiZWxEZWNvcmF0b3JzCi0gKiB0aGF0IHN1cHBvcnQgSURlY29yYXRpb25Db250ZXh0LgotICogQHNlZSBJRGVjb3JhdGlvbkNvbnRleHQKLSAqIEBzaW5jZSAzLjIKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMYWJlbERlY29yYXRvciBpbXBsZW1lbnRzIElMYWJlbERlY29yYXRvciB7Ci0JCi0JIC8qKgotICAgICAqIFJldHVybnMgYW4gaW1hZ2UgdGhhdCBpcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gaW1hZ2UsCi0gICAgICogYnV0IGRlY29yYXRlZCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gdGhlIHN0YXRlCi0gICAgICogb2YgdGhlIHByb3ZpZGVkIGVsZW1lbnQgdGFraW5nIGludG8gYWNjb3VudCB0aGUgcHJvdmlkZWQgY29udGV4dC4KLSAgICAgKiAKLSAgICAgKiBUZXh0IGFuZCBpbWFnZSBkZWNvcmF0aW9uIHVwZGF0ZXMgY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIG90aGVyIHVwZGF0ZXMKLSAgICAgKiB3aXRoaW4gdGhlIHdvcmtiZW5jaCBpbmNsdWRpbmcgZGVmZXJyZWQgZGVjb3JhdGlvbiBieSBiYWNrZ3JvdW5kIHByb2Nlc3Nlcy4KLSAgICAgKiBDbGllbnRzIHNob3VsZCBoYW5kbGUgbGFiZWxQcm92aWRlckNoYW5nZWRFdmVudHMgZm9yIHRoZSBnaXZlbiBlbGVtZW50IHRvIGdldAotICAgICAqIHRoZSBjb21wbGV0ZSBkZWNvcmF0aW9uLgotICAgICAqIEBzZWUgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudAotICAgICAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIGlucHV0IGltYWdlIHRvIGRlY29yYXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZWxlbWVudCBoYXMgbm8gaW1hZ2UKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB3aG9zZSBpbWFnZSBpcyBiZWluZyBkZWNvcmF0ZWQKLSAgICAgKiBAcGFyYW0gY29udGV4dCBhZGRpdGlvbmFsIGNvbnRleHQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVsZW1lbnQgYmVpbmcgZGVjb3JhdGVkCi0gICAgICogQHJldHVybiB0aGUgZGVjb3JhdGVkIGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBkZWNvcmF0aW9uIGlzIHRvIGJlIGFwcGxpZWQKLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEltYWdlIGRlY29yYXRlSW1hZ2UoSW1hZ2UgaW1hZ2UsIE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdGV4dCBsYWJlbCB0aGF0IGlzIGJhc2VkIG9uIHRoZSBnaXZlbiB0ZXh0IGxhYmVsLAotICAgICAqIGJ1dCBkZWNvcmF0ZWQgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBzdGF0ZQotICAgICAqIG9mIHRoZSBwcm92aWRlZCBlbGVtZW50IHRha2luZyBpbnRvIGFjY291bnQgdGhlIHByb3ZpZGVkIGNvbnRleHQuCi0gICAgICogCi0gICAgICogVGV4dCBhbmQgaW1hZ2UgZGVjb3JhdGlvbiB1cGRhdGVzIGNhbiBvY2N1ciBhcyBhIHJlc3VsdCBvZiBvdGhlciB1cGRhdGVzCi0gICAgICogd2l0aGluIHRoZSB3b3JrYmVuY2ggaW5jbHVkaW5nIGRlZmVycmVkIGRlY29yYXRpb24gYnkgYmFja2dyb3VuZCBwcm9jZXNzZXMuCi0gICAgICogQ2xpZW50cyBzaG91bGQgaGFuZGxlIGxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnRzIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCB0byBnZXQKLSAgICAgKiB0aGUgY29tcGxldGUgZGVjb3JhdGlvbi4KLSAgICAgKiBAc2VlIExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQKLSAgICAgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgdGhlIGlucHV0IHRleHQgbGFiZWwgdG8gZGVjb3JhdGUKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB3aG9zZSBpbWFnZSBpcyBiZWluZyBkZWNvcmF0ZWQKLSAgICAgKiBAcGFyYW0gY29udGV4dCBhZGRpdGlvbmFsIGNvbnRleHQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVsZW1lbnQgYmVpbmcgZGVjb3JhdGVkCi0gICAgICogQHJldHVybiB0aGUgZGVjb3JhdGVkIHRleHQgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGRlY29yYXRpb24gaXMgdG8gYmUgYXBwbGllZAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZGVjb3JhdGVUZXh0KFN0cmluZyB0ZXh0LCBPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb25Db250ZXh0IGNvbnRleHQpOwotICAgIAotICAgIC8qKgotICAgICAqIFByZXBhcmUgdGhlIGVsZW1lbnQgZm9yIGRlY29yYXRpb24uIElmIGl0IGlzIGFscmVhZHkgZGVjb3JhdGVkIGFuZCByZWFkeSBmb3IgdXBkYXRlCi0gICAgICogcmV0dXJuIHRydWUuIElmIGRlY29yYXRpb24gaXMgcGVuZGluZyByZXR1cm4gZmFsc2UuCi0gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gYmUgZGVjb3JhdGVkCi0gICAgICogQHBhcmFtIG9yaWdpbmFsVGV4dCBUaGUgc3RhcnRpbmcgdGV4dC4gCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGRlY29yYXRpb24gY29udGV4dAotICAgICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGVjb3JhdGlvbiBpcyByZWFkeSBmb3IgdGhpcyBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcHJlcGFyZURlY29yYXRpb24oT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBvcmlnaW5hbFRleHQsIElEZWNvcmF0aW9uQ29udGV4dCBjb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTcyOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5FdmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEEgbGFiZWwgcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gd2hpY2gsIGJ5IGRlZmF1bHQsIHVzZXMgYW4gZWxlbWVudCdzIAotICogPGNvZGU+dG9TdHJpbmc8L2NvZGU+IHZhbHVlIGZvciBpdHMgdGV4dCBhbmQgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGl0cyBpbWFnZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgdXNlZCBhcyBpcywgb3Igc3ViY2xhc3NlZCB0byBwcm92aWRlIHJpY2hlciBsYWJlbHMuIAotICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgYW55IG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPmlzTGFiZWxQcm9wZXJ0eTwvY29kZT48L2xpPiAKLSAqICAgPGxpPjxjb2RlPmdldEltYWdlPC9jb2RlPjwvbGk+IAotICogICA8bGk+PGNvZGU+Z2V0VGV4dDwvY29kZT48L2xpPiAKLSAqICAgPGxpPjxjb2RlPmRpc3Bvc2U8L2NvZGU+PC9saT4gCi0gKiA8L3VsPgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTGFiZWxQcm92aWRlciBleHRlbmRzIEV2ZW50TWFuYWdlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgbGFiZWwgcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQmFzZUxhYmVsUHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBhZGRMaXN0ZW5lck9iamVjdChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkxhYmVsUHJvdmlkZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+SUJhc2VMYWJlbFByb3ZpZGVyPC9jb2RlPiBtZXRob2QgZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaXJlcyBhIGxhYmVsIHByb3ZpZGVyIGNoYW5nZWQgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0gICAgICogT25seSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IGEgbGFiZWwgcHJvdmlkZXIgY2hhbmdlZCBldmVudAotICAgICAqCi0gICAgICogQHNlZSBJTGFiZWxQcm92aWRlckxpc3RlbmVyI2xhYmVsUHJvdmlkZXJDaGFuZ2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKAotICAgICAgICAgICAgZmluYWwgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGZpbmFsIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbCA9IChJTGFiZWxQcm92aWRlckxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICBTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBsLmxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkxhYmVsUHJvdmlkZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+IG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSAKLSAgICAgKiBvdmVycmlkZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkxhYmVsUHJvdmlkZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+IG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50J3MgPGNvZGU+dG9TdHJpbmc8L2NvZGU+Ci0gICAgICogc3RyaW5nLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQgPT0gbnVsbCA/ICIiIDogZWxlbWVudC50b1N0cmluZygpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+TGFiZWxQcm92aWRlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5JQmFzZUxhYmVsUHJvdmlkZXI8L2NvZGU+IG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSAKLSAgICAgKiBvdmVycmlkZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElCYXNlTGFiZWxQcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHJlbW92ZUxpc3RlbmVyT2JqZWN0KGxpc3RlbmVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0xhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjk5NDYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLS8qKgotICogRXZlbnQgb2JqZWN0IGRlc2NyaWJpbmcgYSBsYWJlbCBwcm92aWRlciBzdGF0ZSBjaGFuZ2UuCi0gKgotICogQHNlZSBJTGFiZWxQcm92aWRlckxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcmlhbCB2ZXJzaW9uIFVJRCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODQxMDYxMjQ3OTMwOTg3OEw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGVsZW1lbnRzIHdob3NlIGxhYmVscyBuZWVkIHRvIGJlIHVwZGF0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBlbGVtZW50czsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZXZlbnQgZm9yIHRoZSBnaXZlbiBzb3VyY2UsIGluZGljYXRpbmcgdGhhdCBhbGwgbGFiZWxzCi0gICAgICogcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSBhcmUgbm8gbG9uZ2VyIHZhbGlkIGFuZCBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIGxhYmVsIHByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQoSUJhc2VMYWJlbFByb3ZpZGVyIHNvdXJjZSkgewotICAgICAgICBzdXBlcihzb3VyY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZXZlbnQgZm9yIHRoZSBnaXZlbiBzb3VyY2UsIGluZGljYXRpbmcgdGhhdCB0aGUgbGFiZWwKLSAgICAgKiBwcm92aWRlZCBieSB0aGUgc291cmNlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudHMgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIGxhYmVsIHByb3ZpZGVyCi0gICAgICogQHBhcmFtIGVsZW1lbnRzIHRoZSBlbGVtZW50IHdob3NlIGxhYmVscyBoYXZlIGNoYW5nZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudChJQmFzZUxhYmVsUHJvdmlkZXIgc291cmNlLAotICAgICAgICAgICAgT2JqZWN0W10gZWxlbWVudHMpIHsKLSAgICAgICAgc3VwZXIoc291cmNlKTsKLSAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZXZlbnQgZm9yIHRoZSBnaXZlbiBzb3VyY2UsIGluZGljYXRpbmcgdGhhdCB0aGUgbGFiZWwKLSAgICAgKiBwcm92aWRlZCBieSB0aGUgc291cmNlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIHNob3VsZCBiZSB1cGRhdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgbGFiZWwgcHJvdmlkZXIKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB3aG9zZSBsYWJlbCBuZWVkcyB0byBiZSB1cGRhdGVkCi0gICAgICovCi0gICAgcHVibGljIExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQoSUJhc2VMYWJlbFByb3ZpZGVyIHNvdXJjZSwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgc3VwZXIoc291cmNlKTsKLSAgICAgICAgdGhpcy5lbGVtZW50cyA9IG5ldyBPYmplY3RbMV07Ci0gICAgICAgIHRoaXMuZWxlbWVudHNbMF0gPSBlbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgd2hvc2UgbGFiZWwgbmVlZHMgdG8gYmUgdXBkYXRlZCwKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbGwgbGFiZWxzIG5lZWQgdG8gYmUgdXBkYXRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgd2hvc2UgbGFiZWwgbmVlZHMgdG8gYmUgdXBkYXRlZCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudCgpIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgPT0gbnVsbCB8fCB0aGlzLmVsZW1lbnRzLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzWzBdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHdob3NlIGxhYmVscyBuZWVkIHRvIGJlIHVwZGF0ZWQsCi0gICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYWxsIGxhYmVscyBuZWVkIHRvIGJlIHVwZGF0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IHdob3NlIGxhYmVscyBuZWVkIHRvIGJlIHVwZGF0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoKSB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9MaXN0Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0xpc3RWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxNTZjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL0xpc3RWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIEEgY29uY3JldGUgdmlld2VyIGJhc2VkIG9uIGFuIFNXVCA8Y29kZT5MaXN0PC9jb2RlPiBjb250cm9sLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLiBJdCBpcyBkZXNpZ25lZCB0byBiZQotICogaW5zdGFudGlhdGVkIHdpdGggYSBwcmUtZXhpc3RpbmcgU1dUIDxjb2RlPkxpc3Q8L2NvZGU+IGNvbnRyb2wgYW5kIGNvbmZpZ3VyZWQKLSAqIHdpdGggYSBkb21haW4tc3BlY2lmaWMgY29udGVudCBwcm92aWRlciwgbGFiZWwgcHJvdmlkZXIsIGVsZW1lbnQgZmlsdGVyIChvcHRpb25hbCksCi0gKiBhbmQgZWxlbWVudCBzb3J0ZXIgKG9wdGlvbmFsKS4KLSAqIDxwPgotICogTm90ZSB0aGF0IHRoZSBTV1QgPGNvZGU+TGlzdDwvY29kZT4gY29udHJvbCBvbmx5IHN1cHBvcnRzIHRoZSBkaXNwbGF5IG9mIHN0cmluZ3MsIG5vdCBpY29ucy4KLSAqIElmIHlvdSBuZWVkIHRvIHNob3cgaWNvbnMgZm9yIGl0ZW1zLCB1c2UgPGNvZGU+VGFibGVWaWV3ZXI8L2NvZGU+IGluc3RlYWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgVGFibGVWaWV3ZXIKLSAqLwotcHVibGljIGNsYXNzIExpc3RWaWV3ZXIgZXh0ZW5kcyBBYnN0cmFjdExpc3RWaWV3ZXIgewotCi0gICAgLyoqCi0gICAgICogVGhpcyB2aWV3ZXIncyBsaXN0IGNvbnRyb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0IGxpc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbGlzdCB2aWV3ZXIgb24gYSBuZXdseS1jcmVhdGVkIGxpc3QgY29udHJvbCB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50LgotICAgICAqIFRoZSBsaXN0IGNvbnRyb2wgaXMgY3JlYXRlZCB1c2luZyB0aGUgU1dUIHN0eWxlIGJpdHMgPGNvZGU+TVVMVEksIEhfU0NST0xMLCBWX1NDUk9MTCw8L2NvZGU+IGFuZCA8Y29kZT5CT1JERVI8L2NvZGU+LgotICAgICAqIFRoZSB2aWV3ZXIgaGFzIG5vIGlucHV0LCBubyBjb250ZW50IHByb3ZpZGVyLCBhIGRlZmF1bHQgbGFiZWwgcHJvdmlkZXIsIAotICAgICAqIG5vIHNvcnRlciwgYW5kIG5vIGZpbHRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBsaXN0IHZpZXdlciBvbiBhIG5ld2x5LWNyZWF0ZWQgbGlzdCBjb250cm9sIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQuCi0gICAgICogVGhlIGxpc3QgY29udHJvbCBpcyBjcmVhdGVkIHVzaW5nIHRoZSBnaXZlbiBTV1Qgc3R5bGUgYml0cy4KLSAgICAgKiBUaGUgdmlld2VyIGhhcyBubyBpbnB1dCwgbm8gY29udGVudCBwcm92aWRlciwgYSBkZWZhdWx0IGxhYmVsIHByb3ZpZGVyLCAKLSAgICAgKiBubyBzb3J0ZXIsIGFuZCBubyBmaWx0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIFNXVCBzdHlsZSBiaXRzCi0gICAgICovCi0gICAgcHVibGljIExpc3RWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHRoaXMobmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QocGFyZW50LCBzdHlsZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBsaXN0IHZpZXdlciBvbiB0aGUgZ2l2ZW4gbGlzdCBjb250cm9sLgotICAgICAqIFRoZSB2aWV3ZXIgaGFzIG5vIGlucHV0LCBubyBjb250ZW50IHByb3ZpZGVyLCBhIGRlZmF1bHQgbGFiZWwgcHJvdmlkZXIsIAotICAgICAqIG5vIHNvcnRlciwgYW5kIG5vIGZpbHRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdCBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIExpc3RWaWV3ZXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBsaXN0KSB7Ci0gICAgICAgIHRoaXMubGlzdCA9IGxpc3Q7Ci0gICAgICAgIGhvb2tDb250cm9sKGxpc3QpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gVmlld2VyLgotICAgICAqLwotICAgIHB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBsaXN0IHZpZXdlcidzIGxpc3QgY29udHJvbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxpc3QgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0IGdldExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogTm9uLUphdmFkb2MuCi0gICAgICogTWV0aG9kIGRlZmluZWQgb24gU3RydWN0dXJlZFZpZXdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXZlYWwoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChlbGVtZW50KTsKLSAgICAgICAgaW50IGluZGV4ID0gZ2V0RWxlbWVudEluZGV4KGVsZW1lbnQpOwotICAgICAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC8vIGFsZ29yaXRobSBwYXR0ZXJuZWQgYWZ0ZXIgTGlzdC5zaG93U2VsZWN0aW9uKCkKLSAgICAgICAgaW50IGNvdW50ID0gbGlzdC5nZXRJdGVtQ291bnQoKTsKLSAgICAgICAgaWYgKGNvdW50ID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGludCBoZWlnaHQgPSBsaXN0LmdldEl0ZW1IZWlnaHQoKTsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBsaXN0LmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgaW50IHRvcEluZGV4ID0gbGlzdC5nZXRUb3BJbmRleCgpOwotICAgICAgICBpbnQgdmlzaWJsZUNvdW50ID0gTWF0aC5tYXgocmVjdC5oZWlnaHQgLyBoZWlnaHQsIDEpOwotICAgICAgICBpbnQgYm90dG9tSW5kZXggPSBNYXRoLm1pbih0b3BJbmRleCArIHZpc2libGVDb3VudCwgY291bnQpIC0gMTsKLSAgICAgICAgaWYgKCh0b3BJbmRleCA8PSBpbmRleCkgJiYgKGluZGV4IDw9IGJvdHRvbUluZGV4KSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaW50IG5ld1RvcCA9IE1hdGgubWluKE1hdGgubWF4KGluZGV4IC0gKHZpc2libGVDb3VudCAvIDIpLCAwKSwKLSAgICAgICAgICAgICAgICBjb3VudCAtIDEpOwotICAgICAgICBsaXN0LnNldFRvcEluZGV4KG5ld1RvcCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdExpc3RWaWV3ZXIjbGlzdEFkZChqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbGlzdEFkZChTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgbGlzdC5hZGQoc3RyaW5nLCBpbmRleCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdExpc3RWaWV3ZXIjbGlzdFNldEl0ZW0oaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RTZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIHN0cmluZykgewotICAgICAgICBsaXN0LnNldEl0ZW0oaW5kZXgsIHN0cmluZyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdExpc3RWaWV3ZXIjbGlzdEdldFNlbGVjdGlvbkluZGljZXMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnRbXSBsaXN0R2V0U2VsZWN0aW9uSW5kaWNlcygpIHsKLSAgICAgICAgcmV0dXJuIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RMaXN0Vmlld2VyI2xpc3RHZXRJdGVtQ291bnQoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgbGlzdEdldEl0ZW1Db3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGxpc3QuZ2V0SXRlbUNvdW50KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdExpc3RWaWV3ZXIjbGlzdFNldEl0ZW1zKGphdmEubGFuZy5TdHJpbmdbXSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0U2V0SXRlbXMoU3RyaW5nW10gbGFiZWxzKSB7Ci0gICAgICAgIGxpc3Quc2V0SXRlbXMobGFiZWxzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0TGlzdFZpZXdlciNsaXN0UmVtb3ZlQWxsKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0UmVtb3ZlQWxsKCkgewotICAgICAgICBsaXN0LnJlbW92ZUFsbCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RMaXN0Vmlld2VyI2xpc3RSZW1vdmUoaW50KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RSZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgICAgIGxpc3QucmVtb3ZlKGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0TGlzdFZpZXdlciNsaXN0U2VsZWN0QW5kU2hvdyhpbnRbXSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0U2V0U2VsZWN0aW9uKGludFtdIGl4cykgewotICAgICAgICBsaXN0LnNldFNlbGVjdGlvbihpeHMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RMaXN0Vmlld2VyI2xpc3REZXNlbGVjdEFsbCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbGlzdERlc2VsZWN0QWxsKCkgewotICAgICAgICBsaXN0LmRlc2VsZWN0QWxsKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdExpc3RWaWV3ZXIjbGlzdFNob3dTZWxlY3Rpb24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RTaG93U2VsZWN0aW9uKCkgewotICAgICAgICBsaXN0LnNob3dTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvTmFtZWRIYW5kbGVPYmplY3RMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL05hbWVkSGFuZGxlT2JqZWN0TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmI4YWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvTmFtZWRIYW5kbGVPYmplY3RMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL09wZW5FdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9PcGVuRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkYjgyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL09wZW5FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBFdmVudCBvYmplY3QgZGVzY3JpYmluZyBhbiBvcGVuIHdoaWNoIG1heSBiZSBnZW5lcmF0ZWQgZnJvbSBhIAotICogc2VsZWN0aW9uIG9yIGRlZmF1bHQgc2VsZWN0aW9uIGV2ZW50LiBUaGUgc291cmNlIG9mIHRoZXNlCi0gKiBldmVudHMgaXMgYSB2aWV3ZXIuCi0gKgotICogQHNlZSBJT3Blbkxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZWQgc2VyaWFsIHZlcnNpb24gVUlEIGZvciB0aGlzIGNsYXNzLgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNzYxOTcyNjUyOTczMTc2MTE3TDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZXZlbnQgZm9yIHRoZSBnaXZlbiBzb3VyY2UgYW5kIHNlbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHZpZXdlcgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIHNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBPcGVuRXZlbnQoVmlld2VyIHNvdXJjZSwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIoc291cmNlKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChzZWxlY3Rpb24pOwotICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmlld2VyIHRoYXQgaXMgdGhlIHNvdXJjZSBvZiB0aGlzIGV2ZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgb3JpZ2luYXRpbmcgdmlld2VyCi0gICAgICovCi0gICAgcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0gICAgICAgIHJldHVybiAoVmlld2VyKSBnZXRTb3VyY2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1NlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9TZWxlY3Rpb25DaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxNTY0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1NlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBFdmVudCBvYmplY3QgZGVzY3JpYmluZyBhIHNlbGVjdGlvbiBjaGFuZ2UuIFRoZSBzb3VyY2Ugb2YgdGhlc2UKLSAqIGV2ZW50cyBpcyBhIHNlbGVjdGlvbiBwcm92aWRlci4KLSAqCi0gKiBAc2VlIElTZWxlY3Rpb24KLSAqIEBzZWUgSVNlbGVjdGlvblByb3ZpZGVyCi0gKiBAc2VlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM4MzUxNDk1NDU1MTk3MjM1NzRMOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBldmVudCBmb3IgdGhlIGdpdmVuIHNvdXJjZSBhbmQgc2VsZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc2VsZWN0aW9uIHByb3ZpZGVyCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgc2VsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIFNlbGVjdGlvbkNoYW5nZWRFdmVudChJU2VsZWN0aW9uUHJvdmlkZXIgc291cmNlLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzdXBlcihzb3VyY2UpOwotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHNlbGVjdGlvbik7Ci0gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNlbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gcHJvdmlkZXIgdGhhdCBpcyB0aGUgc291cmNlIG9mIHRoaXMgZXZlbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBvcmlnaW5hdGluZyBzZWxlY3Rpb24gcHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNlbGVjdGlvblByb3ZpZGVyIGdldFNlbGVjdGlvblByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gKElTZWxlY3Rpb25Qcm92aWRlcikgZ2V0U291cmNlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9TdHJ1Y3R1cmVkU2VsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1N0cnVjdHVyZWRTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2MWRlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1N0cnVjdHVyZWRTZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogQSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+SVN0cnVjdHVyZWRTZWxlY3Rpb248L2NvZGU+IGludGVyZmFjZSwKLSAqIHN1aXRhYmxlIGZvciBpbnN0YW50aWF0aW5nLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdGlvbiBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBlbGVtZW50IHRoYXQgbWFrZSB1cCB0aGlzIHN0cnVjdHVyZWQgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0W10gZWxlbWVudHM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2Fub25pY2FsIGVtcHR5IHNlbGVjdGlvbi4gVGhpcyBzZWxlY3Rpb24gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RydWN0dXJlZFNlbGVjdGlvbiBFTVBUWSA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGVtcHR5IHNlbGVjdGlvbi4gIAotICAgICAqIFNlZSBhbHNvIHRoZSBzdGF0aWMgZmllbGQgPGNvZGU+RU1QVFk8L2NvZGU+IHdoaWNoIGNvbnRhaW5zIGFuIGVtcHR5IHNlbGVjdGlvbiBzaW5nbGV0b24uCi0gICAgICoKLSAgICAgKiBAc2VlICNFTVBUWQotICAgICAqLwotICAgIHB1YmxpYyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBmcm9tIHRoZSBnaXZlbiBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50cyBhbiBhcnJheSBvZiBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMgPSBuZXcgT2JqZWN0W2VsZW1lbnRzLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZWxlbWVudHMsIDAsIHRoaXMuZWxlbWVudHMsIDAsIGVsZW1lbnRzLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGNvbnRhaW5pbmcgYSBzaW5nbGUgb2JqZWN0LgotICAgICAqIFRoZSBvYmplY3QgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoZWxlbWVudCk7Ci0gICAgICAgIGVsZW1lbnRzID0gbmV3IE9iamVjdFtdIHsgZWxlbWVudCB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBmcm9tIHRoZSBnaXZlbiA8Y29kZT5MaXN0PC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RydWN0dXJlZFNlbGVjdGlvbihMaXN0IGVsZW1lbnRzKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoZWxlbWVudHMpOwotICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHMudG9BcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGlzIGVxdWFsIHRvIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICogVHdvIHN0cnVjdHVyZWQgc2VsZWN0aW9ucyBhcmUgZXF1YWwgaWZmIHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cwotICAgICAqIGluIHRoZSBzYW1lIG9yZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG8gdGhlIG90aGVyIG9iamVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhleSBhcmUgZXF1YWwsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG8pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vbnVsbCBhbmQgb3RoZXIgY2xhc3NlcwotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMyID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIG87Ci0KLSAgICAgICAgLy8gZWl0aGVyIG9yIGJvdGggZW1wdHk/Ci0gICAgICAgIGlmIChpc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzMi5pc0VtcHR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMyLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zaXplCi0gICAgICAgIGludCBteUxlbiA9IGVsZW1lbnRzLmxlbmd0aDsKLSAgICAgICAgaWYgKG15TGVuICE9IHMyLmVsZW1lbnRzLmxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vZWxlbWVudCBjb21wYXJpc29uCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXlMZW47IGkrKykgewotICAgICAgICAgICAgaWYgKCFlbGVtZW50c1tpXS5lcXVhbHMoczIuZWxlbWVudHNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgaW4gSVN0cnVjdHVyZWRTZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRGaXJzdEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBpc0VtcHR5KCkgPyBudWxsIDogZWxlbWVudHNbMF07Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBpbiBJU2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgaW4gSVN0cnVjdHVyZWRTZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChlbGVtZW50cyA9PSBudWxsID8gbmV3IE9iamVjdFswXSA6IGVsZW1lbnRzKQotICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgaW4gSVN0cnVjdHVyZWRTZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudHMgPT0gbnVsbCA/IDAgOiBlbGVtZW50cy5sZW5ndGg7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBpbiBJU3RydWN0dXJlZFNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnRzID09IG51bGwgPyBuZXcgT2JqZWN0WzBdIDogKE9iamVjdFtdKSBlbGVtZW50cy5jbG9uZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgaW4gSVN0cnVjdHVyZWRTZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIExpc3QgdG9MaXN0KCkgewotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChlbGVtZW50cyA9PSBudWxsID8gbmV3IE9iamVjdFswXSA6IGVsZW1lbnRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBtZXRob2Qgd2hpY2ggcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzCi0gICAgICogc2VsZWN0aW9uIHN1aXRhYmxlIGZvciBkZWJ1ZyBwdXJwb3NlcyBvbmx5LgotICAgICAqCi0gICAgICogQHJldHVybiBkZWJ1ZyBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gaXNFbXB0eSgpID8gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCI8ZW1wdHlfc2VsZWN0aW9uPiIpIDogdG9MaXN0KCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvU3RydWN0dXJlZFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9TdHJ1Y3R1cmVkVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNGJjZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9TdHJ1Y3R1cmVkVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JT3BlbkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5PcGVuU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGltcGxlbWVudGF0aW9uIGZvciBzdHJ1Y3R1cmUtb3JpZW50ZWQgdmlld2VycyAodHJlZXMsIGxpc3RzLAotICogdGFibGVzKS4gU3VwcG9ydHMgY3VzdG9tIHNvcnRpbmcsIGZpbHRlcmluZywgYW5kIHJlbmRlcmluZy4KLSAqIDxwPgotICogQW55IG51bWJlciBvZiB2aWV3ZXIgZmlsdGVycyBjYW4gYmUgYWRkZWQgdG8gdGhpcyB2aWV3ZXIgKHVzaW5nCi0gKiA8Y29kZT5hZGRGaWx0ZXI8L2NvZGU+KS4gV2hlbiB0aGUgdmlld2VyIHJlY2VpdmVzIGFuIHVwZGF0ZSwgaXQgYXNrcyBlYWNoCi0gKiBvZiBpdHMgZmlsdGVycyBpZiBpdCBpcyBvdXQgb2YgZGF0ZSwgYW5kIHJlZmlsdGVycyBlbGVtZW50cyBhcyByZXF1aXJlZC4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBWaWV3ZXJGaWx0ZXIKLSAqIEBzZWUgVmlld2VyU29ydGVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJ1Y3R1cmVkVmlld2VyIGV4dGVuZHMgQ29udGVudFZpZXdlciBpbXBsZW1lbnRzIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIgewotCi0JLyoqCi0JICogQSBtYXAgZnJvbSB0aGUgdmlld2VyJ3MgbW9kZWwgZWxlbWVudHMgdG8gU1dUIHdpZGdldHMuIChrZXkgdHlwZToKLQkgKiA8Y29kZT5PYmplY3Q8L2NvZGU+LCB2YWx1ZSB0eXBlOiA8Y29kZT5XaWRnZXQ8L2NvZGU+KS4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBtZWFucyB0aGF0IHRoZSBlbGVtZW50IG1hcCBpcyBkaXNhYmxlZC4KLQkgKi8KLQlwcml2YXRlIEN1c3RvbUhhc2h0YWJsZSBlbGVtZW50TWFwOwotCi0JLyoqCi0JICogVGhlIGNvbXBhcmVyIHRvIHVzZSBmb3IgY29tcGFyaW5nIGVsZW1lbnRzLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UKLQkgKiB0aGUgZGVmYXVsdCA8Y29kZT5lcXVhbHM8L2NvZGU+IGFuZCA8Y29kZT5oYXNoQ29kZTwvY29kZT4gbWV0aG9kcyBvbgotCSAqIHRoZSBlbGVtZW50IGl0c2VsZi4KLQkgKi8KLQlwcml2YXRlIElFbGVtZW50Q29tcGFyZXIgY29tcGFyZXI7Ci0KLQkvKioKLQkgKiBUaGlzIHZpZXdlcidzIHNvcnRlci4gPGNvZGU+bnVsbDwvY29kZT4gbWVhbnMgdGhlcmUgaXMgbm8gc29ydGVyLgotCSAqLwotCXByaXZhdGUgVmlld2VyU29ydGVyIHNvcnRlcjsKLQotCS8qKgotCSAqIFRoaXMgdmlld2VyJ3MgZmlsdGVycyAoZWxlbWVudCB0eXBlOiA8Y29kZT5WaWV3ZXJGaWx0ZXI8L2NvZGU+KS4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBtZWFucyB0aGVyZSBhcmUgbm8gZmlsdGVycy4KLQkgKi8KLQlwcml2YXRlIExpc3QgZmlsdGVyczsKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIGEgc2VsZWN0aW9uIGNoYW5nZSBpcyBpbiBwcm9ncmVzcyBvbiB0aGlzIHZpZXdlci4KLQkgKiAKLQkgKiBAc2VlICNzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiwgYm9vbGVhbikKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaW5DaGFuZ2U7Ci0KLQkvKioKLQkgKiBVc2VkIHdoaWxlIGEgc2VsZWN0aW9uIGNoYW5nZSBpcyBpbiBwcm9ncmVzcyBvbiB0aGlzIHZpZXdlciB0byBpbmRpY2F0ZXMKLQkgKiB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gc2hvdWxkIGJlIHJlc3RvcmVkLgotCSAqIAotCSAqIEBzZWUgI3NldFNlbGVjdGlvbihJU2VsZWN0aW9uLCBib29sZWFuKQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZXN0b3JlU2VsZWN0aW9uOwotCi0JLyoqCi0JICogTGlzdCBvZiBkb3VibGUtY2xpY2sgc3RhdGUgbGlzdGVuZXJzIChlbGVtZW50IHR5cGU6Ci0JICogPGNvZGU+SURvdWJsZUNsaWNrTGlzdGVuZXI8L2NvZGU+KS4KLQkgKiAKLQkgKiBAc2VlICNmaXJlRG91YmxlQ2xpY2sKLQkgKi8KLQlwcml2YXRlIExpc3RlbmVyTGlzdCBkb3VibGVDbGlja0xpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotCS8qKgotCSAqIExpc3Qgb2Ygb3BlbiBsaXN0ZW5lcnMgKGVsZW1lbnQgdHlwZToKLQkgKiA8Y29kZT5JU2VsZWN0aW9uQWN0aXZhdGVMaXN0ZW5lcjwvY29kZT4pLgotCSAqIAotCSAqIEBzZWUgI2ZpcmVPcGVuCi0JICovCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Qgb3Blbkxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotCS8qKgotCSAqIExpc3Qgb2YgcG9zdCBzZWxlY3Rpb24gbGlzdGVuZXJzIChlbGVtZW50IHR5cGU6Ci0JICogPGNvZGU+SVNlbGVjdGlvbkFjdGl2YXRlTGlzdGVuZXI8L2NvZGU+KS4KLQkgKiAKLQkgKiBAc2VlICNmaXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQKLQkgKi8KLQlwcml2YXRlIExpc3RlbmVyTGlzdCBwb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotCS8qKgotCSAqIFRoZSBjb2xvckFuZEZvbnRDb2xsZWN0b3IgaXMgYW4gb2JqZWN0IHVzZWQgYnkgdmlld2VycyB0aGF0Ci0JICogc3VwcG9ydCB0aGUgSUNvbG9yUHJvdmlkZXIsIHRoZSBJRm9udFByb3ZpZGVyIGFuZC9vciB0aGUgCi0JICogSVZpZXdlckxhYmVsUHJvdmlkZXIgZm9yIGNvbG9yIGFuZCBmb250IHVwZGF0ZXMuCi0JICogSW5pdGlhbGl6ZSBpdCB0byBoYXZlIG5vIGNvbG9yIG9yIGZvbnQgcHJvdmlkaW5nCi0JICogaW5pdGlhbGx5LgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcml2YXRlIENvbG9yQW5kRm9udENvbGxlY3RvciBjb2xvckFuZEZvbnRDb2xsZWN0b3IgPSBuZXcgQ29sb3JBbmRGb250Q29sbGVjdG9yKCk7Ci0JCi0JLyoqCi0JICogRW1wdHkgYXJyYXkgb2Ygd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBXaWRnZXRbXSBOT19XSURHRVRTID0gbmV3IFdpZGdldFswXTsKLQotCS8qKgotCSAqIFRoZSBDb2xvckFuZEZvbnRDb2xsZWN0b3IgaXMgYSBoZWxwZXIgY2xhc3MgZm9yIHZpZXdlcnMKLQkgKiB0aGF0IGhhdmUgY29sb3IgYW5kIGZvbnQgc3VwcG9ydCBhZCBvcHRpb25hbGx5IGRlY29yYXRvcnMuCi0JICogQHNlZSBJQ29sb3JEZWNvcmF0b3IKLQkgKiBAc2VlIElGb250RGVjb3JhdG9yCi0JICogQHNlZSBJQ29sb3JQcm92aWRlcgotCSAqIEBzZWUgSUZvbnRQcm92aWRlcgotCSAqIEBzZWUgSURlY29yYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgQ29sb3JBbmRGb250Q29sbGVjdG9yV2l0aFByb3ZpZGVycyBleHRlbmRzIENvbG9yQW5kRm9udENvbGxlY3RvcnsKLQotCQlJQ29sb3JQcm92aWRlciBjb2xvclByb3ZpZGVyOwotCi0JCUlGb250UHJvdmlkZXIgZm9udFByb3ZpZGVyOwotCQkKLQkJLyoqCi0JCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgdXNpbmcgdGhlIHN1cHBsaWVkCi0JCSAqIGxhYmVsIHByb3ZpZGVyLiBJZiBpdCBpcyBhbiBJQ29sb3JQcm92aWRlciBvciBJRm9udFByb3ZpZGVyCi0JCSAqIHNldCB0aGVzZSB2YWx1ZXMgdXAuCi0JCSAqIEBwYXJhbSBwcm92aWRlciBJQmFzZUxhYmVsUHJvdmlkZXIKLQkJICogQHNlZSBJQ29sb3JQcm92aWRlcgotCQkgKiBAc2VlIElGb250UHJvdmlkZXIKLQkJICovCi0JCXB1YmxpYyBDb2xvckFuZEZvbnRDb2xsZWN0b3JXaXRoUHJvdmlkZXJzKElCYXNlTGFiZWxQcm92aWRlciBwcm92aWRlcikgewotCQkJc3VwZXIoKTsKLQkJCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIElDb2xvclByb3ZpZGVyKQotCQkJCWNvbG9yUHJvdmlkZXIgPSAoSUNvbG9yUHJvdmlkZXIpIHByb3ZpZGVyOwotCQkJaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgSUZvbnRQcm92aWRlcikKLQkJCQlmb250UHJvdmlkZXIgPSAoSUZvbnRQcm92aWRlcikgcHJvdmlkZXI7Ci0JCX0KLQkJCi0JCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXIuQ29sb3JBbmRGb250TWFuYWdlciNzZXRGb250c0FuZENvbG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0Rm9udHNBbmRDb2xvcnMoT2JqZWN0IGVsZW1lbnQpewotCQkJCi0JCQlpZihmb250UHJvdmlkZXIgIT0gbnVsbCl7Ci0JCQkJaWYoZm9udCA9PSBudWxsKS8vT25seSBzZXQgdGhlIGZvbnQgaWYgaXQgaGFzbid0IGJlZW4gc2V0IHlldAotCQkJCQlmb250ID0gZm9udFByb3ZpZGVyLmdldEZvbnQoZWxlbWVudCk7CQotCQkJfQotCQkJCi0JCQlpZihjb2xvclByb3ZpZGVyID09IG51bGwpCi0JCQkJcmV0dXJuOwkJCQotCQkJLy9TZXQgdGhlIGNvbG9ycyBpZiB0aGV5IGFyZSBub3Qgc2V0IHlldAotCQkJaWYoYmFja2dyb3VuZCA9PSBudWxsKQotCQkJCWJhY2tncm91bmQgPSBjb2xvclByb3ZpZGVyLmdldEJhY2tncm91bmQoZWxlbWVudCk7Ci0JCQkKLQkJCWlmKGZvcmVncm91bmQgPT0gbnVsbCkKLQkJCQlmb3JlZ3JvdW5kID0gY29sb3JQcm92aWRlci5nZXRGb3JlZ3JvdW5kKGVsZW1lbnQpOwkJCQotCQl9Ci0JCQotCQkvKioKLQkJICogQXBwbHkgdGhlIGZvbnRzIGFuZCBjb2xvcnMgdG8gdGhlIGNvbnRyb2wgaWYKLQkJICogcmVxdWlyZWQuCi0JCSAqIEBwYXJhbSBjb250cm9sCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhcHBseUZvbnRzQW5kQ29sb3JzKFRhYmxlSXRlbSBjb250cm9sKSB7Ci0JCQkKLQkJCWlmKGNvbG9yUHJvdmlkZXIgPT0gbnVsbCl7Ci0JCQkJaWYodXNlZERlY29yYXRvcnMpewotCQkJCQkvL0lmIHRoZXJlIGlzIG5vIHByb3ZpZGVyIG9ubHkgYXBwbHkgc2V0IHZhbHVlcwotCQkJCQlpZihiYWNrZ3JvdW5kICE9IG51bGwpCi0JCQkJCQljb250cm9sLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0JCQkJCi0JCQkJCWlmKGZvcmVncm91bmQgIT0gbnVsbCkKLQkJCQkJCWNvbnRyb2wuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlewotCQkJCS8vQWx3YXlzIHNldCB0aGUgdmFsdWUgaWYgdGhlcmUgaXMgYSBwcm92aWRlcgotCQkJCWNvbnRyb2wuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLQkJCQljb250cm9sLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0JCQl9Ci0JCQkKLQkJCWlmKGZvbnRQcm92aWRlciA9PSBudWxsKXsKLQkJCQlpZih1c2VkRGVjb3JhdG9ycyAmJiBmb250ICE9IG51bGwpCi0JCQkJCWNvbnRyb2wuc2V0Rm9udChmb250KTsKLQkJCX0KLQkJCWVsc2UvL0Fsd2F5cyBzZXQgdGhlIHZhbHVlIGlmIHRoZXJlIGlzIGEgcHJvdmlkZXIKLQkJCQljb250cm9sLnNldEZvbnQoZm9udCk7Ci0JCQkKLQkJCWNsZWFyKCk7Ci0JCX0KLQkJCi0KLQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlci5Db2xvckFuZEZvbnRNYW5hZ2VyI2FwcGx5Rm9udHNBbmRDb2xvcnMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhcHBseUZvbnRzQW5kQ29sb3JzKFRyZWVJdGVtIGNvbnRyb2wpIHsKLQkJCQotCQkJaWYoY29sb3JQcm92aWRlciA9PSBudWxsKXsKLQkJCQlpZih1c2VkRGVjb3JhdG9ycyl7Ci0JCQkJCS8vSWYgdGhlcmUgaXMgbm8gcHJvdmlkZXIgb25seSBhcHBseSBzZXQgdmFsdWVzCi0JCQkJCWlmKGJhY2tncm91bmQgIT0gbnVsbCkKLQkJCQkJCWNvbnRyb2wuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLQkJCQkKLQkJCQkJaWYoZm9yZWdyb3VuZCAhPSBudWxsKQotCQkJCQkJY29udHJvbC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2V7Ci0JCQkJLy9BbHdheXMgc2V0IHRoZSB2YWx1ZSBpZiB0aGVyZSBpcyBhIHByb3ZpZGVyCi0JCQkJY29udHJvbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCQkJCWNvbnRyb2wuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCX0KLQkJCQotCQkJaWYoZm9udFByb3ZpZGVyID09IG51bGwpewotCQkJCWlmKHVzZWREZWNvcmF0b3JzICYmIGZvbnQgIT0gbnVsbCkKLQkJCQkJY29udHJvbC5zZXRGb250KGZvbnQpOwotCQkJfQotCQkJZWxzZS8vQWx3YXlzIHNldCB0aGUgdmFsdWUgaWYgdGhlcmUgaXMgYSBwcm92aWRlcgotCQkJCWNvbnRyb2wuc2V0Rm9udChmb250KTsKLQkJCQotCQkJY2xlYXIoKTsKLQkJfQotCQkKLQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlci5Db2xvckFuZEZvbnRNYW5hZ2VyI2FwcGx5Rm9udHNBbmRDb2xvcnMob3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWVJdGVtKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYXBwbHlGb250c0FuZENvbG9ycyhUYWJsZVRyZWVJdGVtIGNvbnRyb2wpIHsKLQkJCQotCQkJaWYoY29sb3JQcm92aWRlciA9PSBudWxsKXsKLQkJCQlpZih1c2VkRGVjb3JhdG9ycyl7Ci0JCQkJCS8vSWYgdGhlcmUgaXMgbm8gcHJvdmlkZXIgb25seSBhcHBseSBzZXQgdmFsdWVzCi0JCQkJCWlmKGJhY2tncm91bmQgIT0gbnVsbCkKLQkJCQkJCWNvbnRyb2wuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLQkJCQkKLQkJCQkJaWYoZm9yZWdyb3VuZCAhPSBudWxsKQotCQkJCQkJY29udHJvbC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2V7Ci0JCQkJLy9BbHdheXMgc2V0IHRoZSB2YWx1ZSBpZiB0aGVyZSBpcyBhIHByb3ZpZGVyCi0JCQkJY29udHJvbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCQkJCWNvbnRyb2wuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCX0KLQkJCQotCQkJaWYoZm9udFByb3ZpZGVyID09IG51bGwpewotCQkJCWlmKHVzZWREZWNvcmF0b3JzICYmIGZvbnQgIT0gbnVsbCkKLQkJCQkJY29udHJvbC5zZXRGb250KGZvbnQpOwotCQkJfQotCQkJZWxzZS8vQWx3YXlzIHNldCB0aGUgdmFsdWUgaWYgdGhlcmUgaXMgYSBwcm92aWRlcgotCQkJCWNvbnRyb2wuc2V0Rm9udChmb250KTsKLQkJCQotCQkJY2xlYXIoKTsKLQkJfQotCQkKLQkJCi0JfQotCQotCS8qKgotCSAqIFRoZSBDb2xvckFuZEZvbnRNYW5hZ2VyIGNvbGxlY3RzIGZvbnRzIGFuZCBjb2xvcnMgd2l0aG91dCBhCi0JICogYSBjb2xvciBvciBmb250IHByb3ZpZGVyLgotCSAqCi0JICovCi0JY2xhc3MgQ29sb3JBbmRGb250Q29sbGVjdG9yIHsKLQotCQlDb2xvciBmb3JlZ3JvdW5kID0gbnVsbDsKLQotCQlDb2xvciBiYWNrZ3JvdW5kID0gbnVsbDsKLQotCQlGb250IGZvbnQgPSBudWxsOwotCi0JCWJvb2xlYW4gdXNlZERlY29yYXRvcnMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciB3aXRoCi0JCSAqIG5vIGNvbG91ciBhbmQgZm9udCBwcm92aWRlci4JCi0JCSAqLwotCQlwdWJsaWMgQ29sb3JBbmRGb250Q29sbGVjdG9yKCl7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCQotCi0JCS8qKgotCQkgKiBDbGVhciBhbGwgb2YgdGhlIHJlc3VsdHMuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCWZvcmVncm91bmQgPSBudWxsOwotCQkJYmFja2dyb3VuZCA9IG51bGw7Ci0JCQlmb250ID0gbnVsbDsKLQkJCXVzZWREZWNvcmF0b3JzID0gZmFsc2U7Ci0JCX0KLQotCQkKLQkJLyoqCi0JCSAqIFNldCB0aGUgaW5pdGlhbCBmb250cyBhbmQgY29sb3JzIGZvciB0aGUgZWxlbWVudCBmcm9tIHRoZQotCQkgKiBjb250ZW50IHByb3ZpZGVycy4KLQkJICogQHBhcmFtIGVsZW1lbnQgT2JqZWN0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRGb250c0FuZENvbG9ycyhPYmplY3QgZWxlbWVudCl7Ci0JCQkvL0RvIG5vdGhpbmcgaWYgdGhlcmUgYXJlIG5vIHByb3ZpZGVycwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGF0IGRlY29yYXRvcnMgd2VyZSBhcHBsaWVkLgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VXNlZERlY29yYXRvcnMoKSB7Ci0JCQl0aGlzLnVzZWREZWNvcmF0b3JzID0gdHJ1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBBcHBseSB0aGUgZm9udHMgYW5kIGNvbG9ycyB0byB0aGUgY29udHJvbCBpZgotCQkgKiByZXF1aXJlZC4KLQkJICogQHBhcmFtIGNvbnRyb2wKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFwcGx5Rm9udHNBbmRDb2xvcnMoVGFibGVJdGVtIGNvbnRyb2wpIHsKLQkJCQotCQkJaWYodXNlZERlY29yYXRvcnMpewotCQkJCS8vSWYgdGhlcmUgaXMgbm8gcHJvdmlkZXIgb25seSBhcHBseSBzZXQgdmFsdWVzCi0JCQkJaWYoYmFja2dyb3VuZCAhPSBudWxsKQotCQkJCQljb250cm9sLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0JCQkKLQkJCQlpZihmb3JlZ3JvdW5kICE9IG51bGwpCi0JCQkJCWNvbnRyb2wuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCi0JCQkJaWYoZm9udCAhPSBudWxsKQotCQkJCQljb250cm9sLnNldEZvbnQoZm9udCk7Ci0JCQl9Ci0JCQljbGVhcigpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQXBwbHkgdGhlIGZvbnRzIGFuZCBjb2xvcnMgdG8gdGhlIGNvbnRyb2wgaWYKLQkJICogcmVxdWlyZWQuCi0JCSAqIEBwYXJhbSBjb250cm9sCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhcHBseUZvbnRzQW5kQ29sb3JzKFRyZWVJdGVtIGNvbnRyb2wpIHsKLQkJCWlmKHVzZWREZWNvcmF0b3JzKXsKLQkJCQkvL0lmIHRoZXJlIGlzIG5vIHByb3ZpZGVyIG9ubHkgYXBwbHkgc2V0IHZhbHVlcwotCQkJCWlmKGJhY2tncm91bmQgIT0gbnVsbCkKLQkJCQkJY29udHJvbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCQkJCi0JCQkJaWYoZm9yZWdyb3VuZCAhPSBudWxsKQotCQkJCQljb250cm9sLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0JCQotCQkJCWlmKGZvbnQgIT0gbnVsbCkKLQkJCQkJY29udHJvbC5zZXRGb250KGZvbnQpOwotCQkJfQotCQkJY2xlYXIoKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEFwcGx5IHRoZSBmb250cyBhbmQgY29sb3JzIHRvIHRoZSBjb250cm9sIGlmCi0JCSAqIHJlcXVpcmVkLgotCQkgKiBAcGFyYW0gY29udHJvbAotCQkgKi8KLQkJcHVibGljIHZvaWQgYXBwbHlGb250c0FuZENvbG9ycyhUYWJsZVRyZWVJdGVtIGNvbnRyb2wpIHsKLQkJCWlmKHVzZWREZWNvcmF0b3JzKXsKLQkJCQkvL0lmIHRoZXJlIGlzIG5vIHByb3ZpZGVyIG9ubHkgYXBwbHkgc2V0IHZhbHVlcwotCQkJCWlmKGJhY2tncm91bmQgIT0gbnVsbCkKLQkJCQkJY29udHJvbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCQkJCi0JCQkJaWYoZm9yZWdyb3VuZCAhPSBudWxsKQotCQkJCQljb250cm9sLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0JCQotCQkJCWlmKGZvbnQgIT0gbnVsbCkKLQkJCQkJY29udHJvbC5zZXRGb250KGZvbnQpOwotCQkJfQotCQkJY2xlYXIoKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNldCB0aGUgYmFja2dyb3VuZCBjb2xvci4KLQkJICogQHBhcmFtIGJhY2tncm91bmQgCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKENvbG9yIGJhY2tncm91bmQpIHsKLQkJCXRoaXMuYmFja2dyb3VuZCA9IGJhY2tncm91bmQ7Ci0JCX0KLQkJLyoqCi0JCSAqIFNldCB0aGUgZm9udC4KLQkJICogQHBhcmFtIGZvbnQgCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgewotCQkJdGhpcy5mb250ID0gZm9udDsKLQkJfQotCQkvKioKLQkJICogU2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yLgotCQkgKiBAcGFyYW0gZm9yZWdyb3VuZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChDb2xvciBmb3JlZ3JvdW5kKSB7Ci0JCQl0aGlzLmZvcmVncm91bmQgPSBmb3JlZ3JvdW5kOwotCQl9Ci0JCi0JCQotCX0KLQotCS8qKgotCSAqIFRoZSBzYWZlIHJ1bm5hYmxlIHVzZWQgdG8gdXBkYXRlIGFuIGl0ZW0uCi0JICovCi0JY2xhc3MgVXBkYXRlSXRlbVNhZmVSdW5uYWJsZSBleHRlbmRzIFNhZmVSdW5uYWJsZSB7Ci0JCXByaXZhdGUgV2lkZ2V0IHdpZGdldDsKLQotCQlwcml2YXRlIE9iamVjdCBlbGVtZW50OwotCi0JCXByaXZhdGUgYm9vbGVhbiBmdWxsTWFwOwotCi0JCVVwZGF0ZUl0ZW1TYWZlUnVubmFibGUoV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZnVsbE1hcCkgewotCQkJdGhpcy53aWRnZXQgPSB3aWRnZXQ7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQkJdGhpcy5mdWxsTWFwID0gZnVsbE1hcDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWRvVXBkYXRlSXRlbSh3aWRnZXQsIGVsZW1lbnQsIGZ1bGxNYXApOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdHJ1Y3R1cmVkIGVsZW1lbnQgdmlld2VyLiBUaGUgdmlld2VyIGhhcyBubyBpbnB1dCwgbm8gY29udGVudAotCSAqIHByb3ZpZGVyLCBhIGRlZmF1bHQgbGFiZWwgcHJvdmlkZXIsIG5vIHNvcnRlciwgYW5kIG5vIGZpbHRlcnMuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRWaWV3ZXIoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIGRvdWJsZS1jbGlja3MgaW4gdGhpcyB2aWV3ZXIuIEhhcyBubyBlZmZlY3QgaWYgYW4KLQkgKiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBkb3VibGUtY2xpY2sgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb3VibGVDbGlja0xpc3RlbmVyKElEb3VibGVDbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWRvdWJsZUNsaWNrTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIGZvciBzZWxlY3Rpb24tb3BlbiBpbiB0aGlzIHZpZXdlci4gSGFzIG5vIGVmZmVjdCBpZiBhbgotCSAqIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGRvdWJsZS1jbGljayBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE9wZW5MaXN0ZW5lcihJT3Blbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCW9wZW5MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBzdXBwb3J0IGZvciBkcmFnZ2luZyBpdGVtcyBvdXQgb2YgdGhpcyB2aWV3ZXIgdmlhIGEgdXNlcgotCSAqIGRyYWctYW5kLWRyb3Agb3BlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogICAgICAgICAgICBhIGJpdHdpc2UgT1Igb2YgdGhlIHN1cHBvcnRlZCBkcmFnIGFuZCBkcm9wIG9wZXJhdGlvbiB0eXBlcyAoCi0JICogICAgICAgICAgICA8Y29kZT5EUk9QX0NPUFk8L2NvZGU+LDxjb2RlPkRST1BfTElOSzwvY29kZT4sIGFuZAotCSAqICAgICAgICAgICAgPGNvZGU+RFJPUF9NT1ZFPC9jb2RlPikKLQkgKiBAcGFyYW0gdHJhbnNmZXJUeXBlcwotCSAqICAgICAgICAgICAgdGhlIHRyYW5zZmVyIHR5cGVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgZHJhZyBvcGVyYXRpb24KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCB0byBzZXQgdGhlIGRyYWcgZGF0YSBhbmQgdG8KLQkgKiAgICAgICAgICAgIGNsZWFudXAgYWZ0ZXIgdGhlIGRyYWcgYW5kIGRyb3Agb3BlcmF0aW9uIGZpbmlzaGVzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERyYWdTdXBwb3J0KGludCBvcGVyYXRpb25zLCBUcmFuc2ZlcltdIHRyYW5zZmVyVHlwZXMsIERyYWdTb3VyY2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCUNvbnRyb2wgbXlDb250cm9sID0gZ2V0Q29udHJvbCgpOwotCQlmaW5hbCBEcmFnU291cmNlIGRyYWdTb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShteUNvbnRyb2wsIG9wZXJhdGlvbnMpOwotCQlkcmFnU291cmNlLnNldFRyYW5zZmVyKHRyYW5zZmVyVHlwZXMpOwotCQlkcmFnU291cmNlLmFkZERyYWdMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBzdXBwb3J0IGZvciBkcm9wcGluZyBpdGVtcyBpbnRvIHRoaXMgdmlld2VyIHZpYSBhIHVzZXIgZHJhZy1hbmQtZHJvcAotCSAqIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9ucwotCSAqICAgICAgICAgICAgYSBiaXR3aXNlIE9SIG9mIHRoZSBzdXBwb3J0ZWQgZHJhZyBhbmQgZHJvcCBvcGVyYXRpb24gdHlwZXMgKAotCSAqICAgICAgICAgICAgPGNvZGU+RFJPUF9DT1BZPC9jb2RlPiw8Y29kZT5EUk9QX0xJTks8L2NvZGU+LCBhbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPkRST1BfTU9WRTwvY29kZT4pCi0JICogQHBhcmFtIHRyYW5zZmVyVHlwZXMKLQkgKiAgICAgICAgICAgIHRoZSB0cmFuc2ZlciB0eXBlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGRyb3Agb3BlcmF0aW9uCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGRyYWcgYW5kIGRyb3AKLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbiBmaW5pc2hlcwotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREcm9wU3VwcG9ydChpbnQgb3BlcmF0aW9ucywgVHJhbnNmZXJbXSB0cmFuc2ZlclR5cGVzLAotCQkJZmluYWwgRHJvcFRhcmdldExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woKTsKLQkJRHJvcFRhcmdldCBkcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoY29udHJvbCwgb3BlcmF0aW9ucyk7Ci0JCWRyb3BUYXJnZXQuc2V0VHJhbnNmZXIodHJhbnNmZXJUeXBlcyk7Ci0JCWRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBmaWx0ZXIgdG8gdGhpcyB2aWV3ZXIsIGFuZCB0cmlnZ2VycyByZWZpbHRlcmluZyBhbmQKLQkgKiByZXNvcnRpbmcgb2YgdGhlIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIGEgdmlld2VyIGZpbHRlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEZpbHRlcihWaWV3ZXJGaWx0ZXIgZmlsdGVyKSB7Ci0JCWlmIChmaWx0ZXJzID09IG51bGwpCi0JCQlmaWx0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmaWx0ZXJzLmFkZChmaWx0ZXIpOwotCQlyZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBhcnJheSBvZiBlbGVtZW50cyBpcyBpdHNlbGYgbm9uLSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGFuZCBjb250YWlucyBubyA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiAgICAgICAgICAgIHRoZSBhcnJheSB0byBjaGVjawotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFzc2VydEVsZW1lbnRzTm90TnVsbChPYmplY3RbXSBlbGVtZW50cykgewotCQlBc3NlcnQuaXNOb3ROdWxsKGVsZW1lbnRzKTsKLQkJZm9yIChpbnQgaSA9IDAsIG4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBuOyArK2kpIHsKLQkJCUFzc2VydC5pc05vdE51bGwoZWxlbWVudHNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlcyB0aGUgZ2l2ZW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB3aWRnZXQuIFNldHMgdGhlIGdpdmVuIGl0ZW0ncwotCSAqIGRhdGEgdG8gYmUgdGhlIGVsZW1lbnQsIGFuZCBtYXBzIHRoZSBlbGVtZW50IHRvIHRoZSBpdGVtIGluIHRoZSBlbGVtZW50Ci0JICogbWFwIChpZiBlbmFibGVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gaXRlbQotCSAqICAgICAgICAgICAgdGhlIHdpZGdldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFzc29jaWF0ZShPYmplY3QgZWxlbWVudCwgSXRlbSBpdGVtKSB7Ci0JCU9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0JCWlmIChkYXRhICE9IGVsZW1lbnQpIHsKLQkJCWlmIChkYXRhICE9IG51bGwpCi0JCQkJZGlzYXNzb2NpYXRlKGl0ZW0pOwotCQkJaXRlbS5zZXREYXRhKGVsZW1lbnQpOwotCQl9Ci0JCS8vIEFsd2F5cyBtYXAgdGhlIGVsZW1lbnQsIGV2ZW4gaWYgZGF0YSA9PSBlbGVtZW50LAotCQkvLyBzaW5jZSB1bm1hcEFsbEVsZW1lbnRzKCkgY2FuIGxlYXZlIHRoZSBtYXAgaW5jb25zaXN0ZW50Ci0JCS8vIFNlZSBidWcgMjc0MSBmb3IgZGV0YWlscy4KLQkJbWFwRWxlbWVudChlbGVtZW50LCBpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNhc3NvY2lhdGVzIHRoZSBnaXZlbiBTV1QgaXRlbSBmcm9tIGl0cyBjb3JyZXNwb25kaW5nIGVsZW1lbnQuIFNldHMgdGhlCi0JICogaXRlbSdzIGRhdGEgdG8gPGNvZGU+bnVsbDwvY29kZT4gYW5kIHJlbW92ZXMgdGhlIGVsZW1lbnQgZnJvbSB0aGUKLQkgKiBlbGVtZW50IG1hcCAoaWYgZW5hYmxlZCkuCi0JICogCi0JICogQHBhcmFtIGl0ZW0KLQkgKiAgICAgICAgICAgIHRoZSB3aWRnZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNhc3NvY2lhdGUoSXRlbSBpdGVtKSB7Ci0JCU9iamVjdCBlbGVtZW50ID0gaXRlbS5nZXREYXRhKCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZWxlbWVudCk7Ci0JCS8vQ2xlYXIgdGhlIG1hcCBiZWZvcmUgd2UgY2xlYXIgdGhlIGRhdGEKLQkJdW5tYXBFbGVtZW50KGVsZW1lbnQsIGl0ZW0pOwotCQlpdGVtLnNldERhdGEobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2lkZ2V0IGluIHRoaXMgdmlld2VyJ3MgY29udHJvbCB3aGljaCByZXByZXNlbnRzIHRoZSBnaXZlbgotCSAqIGVsZW1lbnQgaWYgaXQgaXMgdGhlIHZpZXdlcidzIGlucHV0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcms7IHN1YmNsYXNzZXJzIHNob3VsZCBub3QgY2FsbAotCSAqIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgd2lkZ2V0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFdpZGdldCBkb0ZpbmRJbnB1dEl0ZW0oT2JqZWN0IGVsZW1lbnQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2lkZ2V0IGluIHRoaXMgdmlld2VyJ3MgY29udHJvbCB3aGljaCByZXByZXNlbnQgdGhlIGdpdmVuCi0JICogZWxlbWVudC4gVGhpcyBtZXRob2Qgc2VhcmNocyBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSBpbnB1dCBlbGVtZW50LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcms7IHN1YmNsYXNzZXJzIHNob3VsZCBub3QgY2FsbAotCSAqIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgd2lkZ2V0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFdpZGdldCBkb0ZpbmRJdGVtKE9iamVjdCBlbGVtZW50KTsKLQotCS8qKgotCSAqIENvcGllcyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBpbnRvIHRoZSBnaXZlbiBTV1QgaXRlbS4gVGhlCi0JICogZWxlbWVudCBtYXAgaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIDxjb2RlPmZ1bGxNYXA8L2NvZGU+LgotCSAqIElmIDxjb2RlPmZ1bGxNYXA8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdGhlIGN1cnJlbnQgbWFwcGluZwotCSAqIGZyb20gZWxlbWVudCB0byB3aWRnZXRzIGlzIHJlbW92ZWQgYW5kIHRoZSBuZXcgbWFwcGluZyBpcyBhZGRlZC4gSWYKLQkgKiBmdWxsbWFwIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGVuIG9ubHkgdGhlIG5ldyBtYXAgZ2V0cyBpbnN0YWxsZWQuCi0JICogSW5zdGFsbGluZyBvbmx5IHRoZSBuZXcgbWFwIGlzIG5lY2Vzc2FyeSBpbiBjYXNlcyB3aGVyZSBvbmx5IHRoZSBvcmRlciBvZgotCSAqIGVsZW1lbnRzIGNoYW5nZXMgYnV0IG5vdCB0aGUgc2V0IG9mIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcms7IHN1YmNsYXNzZXJzIHNob3VsZCBub3QgY2FsbAotCSAqIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbQotCSAqIEBwYXJhbSBlbGVtZW50IGVsZW1lbnQKLQkgKiBAcGFyYW0gZnVsbE1hcAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbWFwcGluZ3MgYXJlIGFkZGVkIGFuZCByZW1vdmVkLCBhbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBvbmx5IHRoZSBuZXcgbWFwIGdldHMgaW5zdGFsbGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9VcGRhdGVJdGVtKFdpZGdldCBpdGVtLCBPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBmdWxsTWFwKTsKLQotCS8qKgotCSAqIENvbXBhcmVzIHR3byBlbGVtZW50cyBmb3IgZXF1YWxpdHkuIFVzZXMgdGhlIGVsZW1lbnQgY29tcGFyZXIgaWYgb25lIGhhcwotCSAqIGJlZW4gc2V0LCBvdGhlcndpc2UgdXNlcyB0aGUgZGVmYXVsdCA8Y29kZT5lcXVhbHM8L2NvZGU+IG1ldGhvZCBvbiB0aGUKLQkgKiBlbGVtZW50cyB0aGVtc2VsdmVzLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50QQotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudEIKLQkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgZWxlbWVudAotCSAqIEByZXR1cm4gd2hldGhlciBlbGVtZW50QSBpcyBlcXVhbCB0byBlbGVtZW50QgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVxdWFscyhPYmplY3QgZWxlbWVudEEsIE9iamVjdCBlbGVtZW50QikgewotCQlpZiAoY29tcGFyZXIgPT0gbnVsbCkKLQkJCXJldHVybiBlbGVtZW50QSA9PSBudWxsID8gZWxlbWVudEIgPT0gbnVsbCA6IGVsZW1lbnRBLmVxdWFscyhlbGVtZW50Qik7Ci0JCWVsc2UKLQkJCXJldHVybiBlbGVtZW50QSA9PSBudWxsID8gZWxlbWVudEIgPT0gbnVsbCA6IGNvbXBhcmVyLmVxdWFscyhlbGVtZW50QSwgZWxlbWVudEIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBnaXZlbiBlbGVtZW50cyB0aHJvdWdoIHRoZSBmaWx0ZXJzLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIGZpbHRlcgotCSAqIEByZXR1cm4gb25seSB0aGUgZWxlbWVudHMgd2hpY2ggYWxsIGZpbHRlcnMgYWNjZXB0Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGZpbHRlcihPYmplY3RbXSBlbGVtZW50cykgewotCQlpZiAoZmlsdGVycyAhPSBudWxsKSB7Ci0JCQlBcnJheUxpc3QgZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCQlPYmplY3Qgcm9vdCA9IGdldFJvb3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlib29sZWFuIGFkZCA9IHRydWU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaWx0ZXJzLnNpemUoKTsgaisrKSB7Ci0JCQkJCWFkZCA9ICgoVmlld2VyRmlsdGVyKSBmaWx0ZXJzLmdldChqKSkuc2VsZWN0KHRoaXMsIHJvb3QsIGVsZW1lbnRzW2ldKTsKLQkJCQkJaWYgKCFhZGQpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGFkZCkKLQkJCQkJZmlsdGVyZWQuYWRkKGVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJCXJldHVybiBmaWx0ZXJlZC50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSB3aWRnZXQgd2hpY2ggcmVwcmVzZW50cyB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0cmllcyBmaXJzdCB0byBmaW5kIHRoZSB3aWRnZXQKLQkgKiBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgYXNzdW1pbmcgdGhhdCBpdCBpcyB0aGUgdmlld2VyJ3MgaW5wdXQ7IHRoaXMgaXMKLQkgKiBkb25lIGJ5IGNhbGxpbmcgPGNvZGU+ZG9GaW5kSW5wdXRJdGVtPC9jb2RlPi4gSWYgaXQgaXMgbm90IGZvdW5kCi0JICogdGhlcmUsIGl0IGlzIGxvb2tlZCB1cCBpbiB0aGUgaW50ZXJuYWwgZWxlbWVudCBtYXAgcHJvdmlkZWQgdGhhdCB0aGlzCi0JICogZmVhdHVyZSBoYXMgYmVlbiBlbmFibGVkLiBJZiB0aGUgZWxlbWVudCBtYXAgaXMgZGlzYWJsZWQsIHRoZSB3aWRnZXQgaXMKLQkgKiBmb3VuZCB2aWEgPGNvZGU+ZG9GaW5kSW5wdXRJdGVtPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB3aWRnZXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgV2lkZ2V0IGZpbmRJdGVtKE9iamVjdCBlbGVtZW50KSB7Ci0JCVdpZGdldFtdIHJlc3VsdCA9IGZpbmRJdGVtcyhlbGVtZW50KTsKLQkJcmV0dXJuIHJlc3VsdC5sZW5ndGggPT0gMCA/IG51bGwgOiByZXN1bHRbMF07Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHdpZGdldHMgd2hpY2ggcmVwcmVzZW50IHRoZSBnaXZlbiBlbGVtZW50LiBUaGUgcmV0dXJuZWQgYXJyYXkKLQkgKiBtdXN0IG5vdCBiZSBjaGFuZ2VkIGJ5IGNsaWVudHM7IGl0IG1pZ2h0IGNoYW5nZSB1cG9uIGNhbGxpbmcgb3RoZXIKLQkgKiBtZXRob2RzIG9uIHRoaXMgdmlld2VyLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRyaWVzIGZpcnN0IHRvIGZpbmQgdGhlIHdpZGdldAotCSAqIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBhc3N1bWluZyB0aGF0IGl0IGlzIHRoZSB2aWV3ZXIncyBpbnB1dDsgdGhpcyBpcwotCSAqIGRvbmUgYnkgY2FsbGluZyA8Y29kZT5kb0ZpbmRJbnB1dEl0ZW08L2NvZGU+LiBJZiBpdCBpcyBub3QgZm91bmQKLQkgKiB0aGVyZSwgdGhlIHdpZGdldHMgYXJlIGxvb2tlZCB1cCBpbiB0aGUgaW50ZXJuYWwgZWxlbWVudCBtYXAgcHJvdmlkZWQgdGhhdCB0aGlzCi0JICogZmVhdHVyZSBoYXMgYmVlbiBlbmFibGVkLiBJZiB0aGUgZWxlbWVudCBtYXAgaXMgZGlzYWJsZWQsIHRoZSB3aWRnZXQgaXMKLQkgKiBmb3VuZCB2aWEgPGNvZGU+ZG9GaW5kSW5wdXRJdGVtPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB3aWRnZXRzCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBXaWRnZXRbXSBmaW5kSXRlbXMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJV2lkZ2V0IHJlc3VsdCA9IGRvRmluZElucHV0SXRlbShlbGVtZW50KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBXaWRnZXRbXSB7IHJlc3VsdCB9OwotCQkvLyBpZiB3ZSBoYXZlIGFuIGVsZW1lbnQgbWFwIHVzZSBpdCwgb3RoZXJ3aXNlIHNlYXJjaCBmb3IgdGhlIGl0ZW0uCi0JCWlmICh1c2luZ0VsZW1lbnRNYXAoKSkgewotCQkJT2JqZWN0IHdpZGdldE9yV2lkZ2V0cyA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpOwotCQkJaWYgKHdpZGdldE9yV2lkZ2V0cz09bnVsbCkgewotCQkJCXJldHVybiBOT19XSURHRVRTOwotCQkJfSBlbHNlIGlmICh3aWRnZXRPcldpZGdldHMgaW5zdGFuY2VvZiBXaWRnZXQpIHsKLQkJCQlyZXR1cm4gbmV3IFdpZGdldFtdIHsoV2lkZ2V0KSB3aWRnZXRPcldpZGdldHN9OwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gKFdpZGdldFtdKXdpZGdldE9yV2lkZ2V0czsKLQkJCX0KLQkJfQotCQlyZXN1bHQgPSBkb0ZpbmRJdGVtKGVsZW1lbnQpOwotCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPyBOT19XSURHRVRTIDogbmV3IFdpZGdldFtdIHsgcmVzdWx0IH07Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgYW55IGRvdWJsZS1jbGljayBsaXN0ZW5lcnMgdGhhdCBhIGRvdWJsZS1jbGljayBoYXMgYmVlbgotCSAqIHJlY2VpdmVkLiBPbmx5IGxpc3RlbmVycyByZWdpc3RlcmVkIGF0IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcmUKLQkgKiBub3RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIGEgZG91YmxlLWNsaWNrIGV2ZW50Ci0JICogCi0JICogQHNlZSBJRG91YmxlQ2xpY2tMaXN0ZW5lciNkb3VibGVDbGljawotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVEb3VibGVDbGljayhmaW5hbCBEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IGRvdWJsZUNsaWNrTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgSURvdWJsZUNsaWNrTGlzdGVuZXIgbCA9IChJRG91YmxlQ2xpY2tMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJbC5kb3VibGVDbGljayhldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBhbnkgb3BlbiBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIG9wZW4gZXZlbnQgaGFzIGJlZW4gcmVjZWl2ZWQuCi0JICogT25seSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgYSBkb3VibGUtY2xpY2sgZXZlbnQKLQkgKiAKLQkgKiBAc2VlIElPcGVuTGlzdGVuZXIjb3BlbihPcGVuRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU9wZW4oZmluYWwgT3BlbkV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IG9wZW5MaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBJT3Blbkxpc3RlbmVyIGwgPSAoSU9wZW5MaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJbC5vcGVuKGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIGFueSBwb3N0IHNlbGVjdGlvbiBsaXN0ZW5lcnMgdGhhdCBhIHBvc3Qgc2VsZWN0aW9uIGV2ZW50IGhhcwotCSAqIGJlZW4gcmVjZWl2ZWQuIE9ubHkgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMKLQkgKiBjYWxsZWQgYXJlIG5vdGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudAotCSAqIAotCSAqIEBzZWUgI2FkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQoZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCVNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWwuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21wYXJhdG9yIHRvIHVzZSBmb3IgY29tcGFyaW5nIGVsZW1lbnRzLCBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaGFzIGJlZW4gc2V0LgotCSAqICAgICAgICAgICAKLQkgKiBAcmV0dXJuIElFbGVtZW50Q29tcGFyZXIgIHRoZSBjb21wYXJhdG9yIHRvIHVzZSBmb3IgY29tcGFyaW5nIGVsZW1lbnRzIG9yCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBJRWxlbWVudENvbXBhcmVyIGdldENvbXBhcmVyKCkgewotCQlyZXR1cm4gY29tcGFyZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsdGVyZWQgYXJyYXkgb2YgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGVsZW1lbnQuIFRoZQotCSAqIHJlc3VsdGluZyBhcnJheSBtdXN0IG5vdCBiZSBtb2RpZmllZCwgYXMgaXQgbWF5IGNvbWUgZGlyZWN0bHkgZnJvbSB0aGUKLQkgKiBtb2RlbCdzIGludGVybmFsIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gYSBmaWx0ZXJlZCBhcnJheSBvZiBjaGlsZCBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBnZXRGaWx0ZXJlZENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gZ2V0UmF3Q2hpbGRyZW4ocGFyZW50KTsKLQkJaWYgKGZpbHRlcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmlsdGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlWaWV3ZXJGaWx0ZXIgZiA9IChWaWV3ZXJGaWx0ZXIpIGl0ZXIubmV4dCgpOwotCQkJCXJlc3VsdCA9IGYuZmlsdGVyKHRoaXMsIHBhcmVudCwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyB2aWV3ZXIncyBmaWx0ZXJzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygdmlld2VyIGZpbHRlcnMKLQkgKi8KLQlwdWJsaWMgVmlld2VyRmlsdGVyW10gZ2V0RmlsdGVycygpIHsKLQkJaWYgKGZpbHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgVmlld2VyRmlsdGVyWzBdOwotCQlWaWV3ZXJGaWx0ZXJbXSByZXN1bHQgPSBuZXcgVmlld2VyRmlsdGVyW2ZpbHRlcnMuc2l6ZSgpXTsKLQkJZmlsdGVycy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gZGlzcGxheS1yZWxhdGl2ZSBjb29yZGluYXRlcywgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBpdGVtIGF0IHRoYXQgbG9jYXRpb24uCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHgKLQkgKiAgICAgICAgICAgIGhvcml6b250YWwgY29vcmRpbmF0ZQotCSAqIEBwYXJhbSB5Ci0JICogICAgICAgICAgICB2ZXJ0aWNhbCBjb29yZGluYXRlCi0JICogQHJldHVybiB0aGUgaXRlbSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gaXRlbSBhdCB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIGNvb3JkaW5hdGVzCi0JICovCi0JcHJvdGVjdGVkIEl0ZW0gZ2V0SXRlbShpbnQgeCwgaW50IHkpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIHBhcmVudCB3aXRob3V0IHNvcnRpbmcgYW5kIGZpbHRlcmluZwotCSAqIHRoZW0uIFRoZSByZXN1bHRpbmcgYXJyYXkgbXVzdCBub3QgYmUgbW9kaWZpZWQsIGFzIGl0IG1heSBjb21lIGRpcmVjdGx5Ci0JICogZnJvbSB0aGUgbW9kZWwncyBpbnRlcm5hbCBzdGF0ZS4KLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBnaXZlbiBwYXJlbnQgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGNoaWxkIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldFJhd0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjcCA9IChJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcikgZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQlpZiAoY3AgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGNwLmdldEVsZW1lbnRzKHBhcmVudCk7Ci0JCQkJYXNzZXJ0RWxlbWVudHNOb3ROdWxsKHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChyZXN1bHQgIT0gbnVsbCkgPyByZXN1bHQgOiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgZm9yd2FyZHMgdG8KLQkgKiA8Y29kZT5nZXRJbnB1dDwvY29kZT4uIE92ZXJyaWRlIGlmIHRoZSByb290IGVsZW1lbnQgaXMgZGlmZmVyZW50IGZyb20KLQkgKiB0aGUgdmlld2VyJ3MgaW5wdXQgZWxlbWVudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcm9vdCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gZ2V0SW5wdXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+U3RydWN0dXJlZFZpZXdlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucwotCSAqIHRoZSByZXN1bHQgYXMgYW4gPGNvZGU+SVN0cnVjdHVyZWRTZWxlY3Rpb248L2NvZGU+LgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgZG8gbm90IHR5cGljYWxseSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgYnV0IGltcGxlbWVudAotCSAqIDxjb2RlPmdldFNlbGVjdGlvbkZyb21XaWRnZXQoTGlzdCk8L2NvZGU+IGluc3RlYWQuCi0JICogPHA+Ci0JICogQHJldHVybiBJU2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sID09IG51bGwgfHwgY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQl9Ci0JCUxpc3QgbGlzdCA9IGdldFNlbGVjdGlvbkZyb21XaWRnZXQoKTsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgc2VsZWN0aW9uLCBhcyBhIDxjb2RlPkxpc3Q8L2NvZGU+LCBmcm9tIHRoZSB1bmRlcmx5aW5nCi0JICogd2lkZ2V0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgZWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdCBnZXRTZWxlY3Rpb25Gcm9tV2lkZ2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzb3J0ZWQgYW5kIGZpbHRlcmVkIHNldCBvZiBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhlCi0JICogcmVzdWx0aW5nIGFycmF5IG11c3Qgbm90IGJlIG1vZGlmaWVkLCBhcyBpdCBtYXkgY29tZSBkaXJlY3RseSBmcm9tIHRoZQotCSAqIG1vZGVsJ3MgaW50ZXJuYWwgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBlbGVtZW50Ci0JICogQHJldHVybiBhIHNvcnRlZCBhbmQgZmlsdGVyZWQgYXJyYXkgb2YgY2hpbGQgZWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0U29ydGVkQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQlPYmplY3RbXSByZXN1bHQgPSBnZXRGaWx0ZXJlZENoaWxkcmVuKHBhcmVudCk7Ci0JCWlmIChzb3J0ZXIgIT0gbnVsbCkgewotCQkJLy8gYmUgc3VyZSB3ZSdyZSBub3QgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBhcnJheSBmcm9tIHRoZSBtb2RlbAotCQkJcmVzdWx0ID0gKE9iamVjdFtdKSByZXN1bHQuY2xvbmUoKTsKLQkJCXNvcnRlci5zb3J0KHRoaXMsIHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgdmlld2VyJ3Mgc29ydGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2VzIG5vdCBoYXZlCi0JICogb25lLgotCSAqIAotCSAqIEByZXR1cm4gYSB2aWV3ZXIgc29ydGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFZpZXdlclNvcnRlciBnZXRTb3J0ZXIoKSB7Ci0JCXJldHVybiBzb3J0ZXI7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIGRvdWJsZS1jbGljayBzZWxlY3QgZXZlbnQgZnJvbSB0aGUgd2lkZ2V0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcms7IHN1YmNsYXNzZXJzIHNob3VsZCBub3QgY2FsbAotCSAqIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBTV1Qgc2VsZWN0aW9uIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG91YmxlU2VsZWN0KFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCS8vIGhhbmRsZSBjYXNlIHdoZXJlIGFuIGVhcmxpZXIgc2VsZWN0aW9uIGxpc3RlbmVyIGRpc3Bvc2VkIHRoZSBjb250cm9sLgotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQkvLyBJZiB0aGUgZG91YmxlLWNsaWNrZWQgZWxlbWVudCBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgZXZlbnQsIHVzZSBpdAotCQkJLy8gb3RoZXJ3aXNlIGdldCBpdCBmcm9tIHRoZSBjb250cm9sLiAgU29tZSBjb250cm9scyBsaWtlIExpc3QgZG8KLQkJCS8vIG5vdCBoYXZlIHRoZSBub3Rpb24gb2YgaXRlbS4KLQkJCS8vIEZvciBkZXRhaWxzLCBzZWUgYnVnIDkwMTYxIFtOYXZpZ2F0b3JdIERlZmF1bHRTZWxlY3RpbmcgZm9sZGVycyBzaG91bGRuJ3QgYWx3YXlzIGV4cGFuZCBmaXJzdCBvbmUKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQkJaWYgKGV2ZW50Lml0ZW0gIT0gbnVsbCAmJiBldmVudC5pdGVtLmdldERhdGEoKSAhPSBudWxsKSB7Ci0JCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZXZlbnQuaXRlbS5nZXREYXRhKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJdXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCQlmaXJlRG91YmxlQ2xpY2sobmV3IERvdWJsZUNsaWNrRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGFuIG9wZW4gZXZlbnQgZnJvbSB0aGUgT3BlblN0cmF0ZWd5LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcms7IHN1YmNsYXNzZXJzIHNob3VsZCBub3QgY2FsbAotCSAqIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBTV1Qgc2VsZWN0aW9uIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlT3BlbihTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQkJZmlyZU9wZW4obmV3IE9wZW5FdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYW4gaW52YWxpZCBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBmcmFtZXdvcmsgbWV0aG9kIGlzIGNhbGxlZCBpZiBhIG1vZGVsIGNoYW5nZSBwaWNrZWQgdXAgYnkgYSB2aWV3ZXIKLQkgKiByZXN1bHRzIGluIGFuIGludmFsaWQgc2VsZWN0aW9uLiBGb3IgaW5zdGFuY2UgaWYgYW4gZWxlbWVudCBjb250YWluZWQgaW4KLQkgKiB0aGUgc2VsZWN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgdmlld2VyLCB0aGUgdmlld2VyIGlzIGZyZWUgdG8KLQkgKiBlaXRoZXIgcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20gdGhlIHNlbGVjdGlvbiBvciB0byBwaWNrIGFub3RoZXIgZWxlbWVudAotCSAqIGFzIGl0cyBuZXcgc2VsZWN0aW9uLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBjYWxscwotCSAqIDxjb2RlPnVwZGF0ZVNlbGVjdGlvbjwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIGl0IHRvIGltcGxlbWVudAotCSAqIGEgZGlmZmVyZW50IHN0cmF0ZWd5IGZvciBwaWNraW5nIGEgbmV3IHNlbGVjdGlvbiB3aGVuIHRoZSBvbGQgc2VsZWN0aW9uCi0JICogYmVjb21lcyBpbnZhbGlkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaW52YWxpZFNlbGVjdGlvbgotCSAqICAgICAgICAgICAgdGhlIHNlbGVjdGlvbiBiZWZvcmUgdGhlIHZpZXdlciB3YXMgdXBkYXRlZAotCSAqIEBwYXJhbSBuZXdTZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBzZWxlY3Rpb24gYWZ0ZXIgdGhlIHVwZGF0ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUludmFsaWRTZWxlY3Rpb24oSVNlbGVjdGlvbiBpbnZhbGlkU2VsZWN0aW9uLCBJU2VsZWN0aW9uIG5ld1NlbGVjdGlvbikgewotCQl1cGRhdGVTZWxlY3Rpb24obmV3U2VsZWN0aW9uKTsKLQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBuZXdTZWxlY3Rpb24pOwotCQlmaXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIFRoZSA8Y29kZT5TdHJ1Y3R1cmVkVmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0JICogPGNvZGU+Q29udGVudFZpZXdlcjwvY29kZT4gbWV0aG9kIGNhbGxzIDxjb2RlPnVwZGF0ZTwvY29kZT4gaWYgdGhlCi0JICogZXZlbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGxhYmVsIG9mIGEgZ2l2ZW4gZWxlbWVudCBoYXMgY2hhbmdlZCwgb3RoZXJ3aXNlCi0JICogaXQgY2FsbHMgc3VwZXIuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50IG9yIGV4dGVuZC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB0aGF0IGdlbmVyYXRlZCB0aGlzIHVwZGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSBldmVudC5nZXRFbGVtZW50cygpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJdXBkYXRlKGVsZW1lbnRzLCBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmhhbmRsZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBzZWxlY3QgZXZlbnQgZnJvbSB0aGUgd2lkZ2V0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcms7IHN1YmNsYXNzZXJzIHNob3VsZCBub3QgY2FsbAotCSAqIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBTV1Qgc2VsZWN0aW9uIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0KFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCS8vIGhhbmRsZSBjYXNlIHdoZXJlIGFuIGVhcmxpZXIgc2VsZWN0aW9uIGxpc3RlbmVyIGRpc3Bvc2VkIHRoZSBjb250cm9sLgotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQl1cGRhdGVTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIHBvc3Qgc2VsZWN0IGV2ZW50IGZyb20gdGhlIHdpZGdldC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlcm5hbCB0byB0aGUgZnJhbWV3b3JrOyBzdWJjbGFzc2VycyBzaG91bGQgbm90IGNhbGwKLQkgKiB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGUgdGhlIFNXVCBzZWxlY3Rpb24gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQb3N0U2VsZWN0KFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBnZXRTZWxlY3Rpb24oKSk7Ci0JCWZpcmVQb3N0U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCXN1cGVyLmhvb2tDb250cm9sKGNvbnRyb2wpOwotCQlPcGVuU3RyYXRlZ3kgaGFuZGxlciA9IG5ldyBPcGVuU3RyYXRlZ3koY29udHJvbCk7Ci0JCWhhbmRsZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVEb3VibGVTZWxlY3QoZSk7Ci0JCQl9Ci0JCX0pOwotCQloYW5kbGVyLmFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVQb3N0U2VsZWN0KGUpOwotCQkJfQotCQl9KTsKLQkJaGFuZGxlci5hZGRPcGVuTGlzdGVuZXIobmV3IElPcGVuRXZlbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZU9wZW4oU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRWaWV3ZXIudGhpcy5oYW5kbGVPcGVuKGUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB2aWV3ZXIgaGFzIGFueSBmaWx0ZXJzLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0ZpbHRlcnMoKSB7Ci0JCXJldHVybiBmaWx0ZXJzICE9IG51bGwgJiYgZmlsdGVycy5zaXplKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGlzIHZpZXdlciBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbnRlcm5hbFJlZnJlc2goT2JqZWN0IGVsZW1lbnQpOwotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoaXMgdmlld2VyIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBlbGVtZW50LiBMYWJlbHMgYXJlIHVwZGF0ZWQKLQkgKiBhcyBkZXNjcmliZWQgaW4gPGNvZGU+cmVmcmVzaChib29sZWFuIHVwZGF0ZUxhYmVscyk8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBjYWxscwotCSAqIDxjb2RlPmludGVybmFsUmVmcmVzaChlbGVtZW50KTwvY29kZT4sIGlnbm9yaW5nCi0JICogPGNvZGU+dXBkYXRlTGFiZWxzPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBJZiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIHRvIGRvIHRoZSBhY3R1YWwgcmVmcmVzaCwgdGhlbgotCSAqIDxjb2RlPmludGVybmFsUmVmcmVzaChPYmplY3QgZWxlbWVudCk8L2NvZGU+IHNob3VsZCBzaW1wbHkgY2FsbAotCSAqIDxjb2RlPmludGVybmFsUmVmcmVzaChlbGVtZW50LCB0cnVlKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHVwZGF0ZUxhYmVscwotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gdXBkYXRlIGxhYmVscyBmb3IgZXhpc3RpbmcgZWxlbWVudHMsCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gb25seSB1cGRhdGUgbGFiZWxzIGFzIG5lZWRlZCwgYXNzdW1pbmcKLQkgKiAgICAgICAgICAgIHRoYXQgbGFiZWxzIGZvciBleGlzdGluZyBlbGVtZW50cyBhcmUgdW5jaGFuZ2VkLgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFJlZnJlc2goT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7Ci0JCWludGVybmFsUmVmcmVzaChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBlbGVtZW50IGl0ZW0gcGFpciB0byB0aGUgZWxlbWVudCBtYXAuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgaW50ZXJuYWwgdG8gdGhlIGZyYW1ld29yazsgc3ViY2xhc3NlcnMgc2hvdWxkIG5vdCBjYWxsCi0JICogdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBpdGVtCi0JICogICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyB3aWRnZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYXBFbGVtZW50KE9iamVjdCBlbGVtZW50LCBXaWRnZXQgaXRlbSkgewotCQlpZiAoZWxlbWVudE1hcCAhPSBudWxsKSB7Ci0JCQlPYmplY3Qgd2lkZ2V0T3JXaWRnZXRzID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCQlpZiAod2lkZ2V0T3JXaWRnZXRzID09IG51bGwpIHsKLQkJCQllbGVtZW50TWFwLnB1dChlbGVtZW50LCBpdGVtKTsKLQkJCX0gZWxzZSBpZiAod2lkZ2V0T3JXaWRnZXRzIGluc3RhbmNlb2YgV2lkZ2V0KSB7Ci0JCQkJaWYgKHdpZGdldE9yV2lkZ2V0cyAhPSBpdGVtKSB7Ci0JCQkJCWVsZW1lbnRNYXAucHV0KGVsZW1lbnQsIG5ldyBXaWRnZXRbXSB7Ci0JCQkJCQkJKFdpZGdldCkgd2lkZ2V0T3JXaWRnZXRzLCBpdGVtIH0pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJV2lkZ2V0W10gd2lkZ2V0cyA9IChXaWRnZXRbXSkgd2lkZ2V0T3JXaWRnZXRzOwotCQkJCWludCBpbmRleE9mSXRlbSA9IEFycmF5cy5hc0xpc3Qod2lkZ2V0cykuaW5kZXhPZihpdGVtKTsKLQkJCQlpZiAoaW5kZXhPZkl0ZW0gPT0gLTEpIHsKLQkJCQkJaW50IGxlbmd0aCA9IHdpZGdldHMubGVuZ3RoOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHdpZGdldHMsIDAsCi0JCQkJCQkJd2lkZ2V0cyA9IG5ldyBXaWRnZXRbbGVuZ3RoICsgMV0sIDAsIGxlbmd0aCk7Ci0JCQkJCXdpZGdldHNbbGVuZ3RoXSA9IGl0ZW07Ci0JCQkJCWVsZW1lbnRNYXAucHV0KGVsZW1lbnQsIHdpZGdldHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciBhIGNoYW5nZSB0byB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiB3b3VsZCByZXF1aXJlIHJlZmlsdGVyaW5nIGFuZC9vciByZXNvcnRpbmcuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgaW50ZXJuYWwgdG8gdGhlIGZyYW1ld29yazsgc3ViY2xhc3NlcnMgc2hvdWxkIG5vdCBjYWxsCi0JICogdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWZpbHRlcmluZyBpcyByZXF1aXJlZCwgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmVlZHNSZWZpbHRlcihPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChzb3J0ZXIgIT0gbnVsbCAmJiBzb3J0ZXIuaXNTb3J0ZXJQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0eSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAoZmlsdGVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbiA9IGZpbHRlcnMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQkJVmlld2VyRmlsdGVyIGZpbHRlciA9IChWaWV3ZXJGaWx0ZXIpIGZpbHRlcnMuZ2V0KGkpOwotCQkJCWlmIChmaWx0ZXIuaXNGaWx0ZXJQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0eSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IGhhc2h0YWJsZSB1c2luZyB0aGUgZ2l2ZW4gY2FwYWNpdHkgYW5kIHRoaXMgdmlld2VyJ3MgZWxlbWVudCBjb21wYXJlci4KLQkgKiAKLQkgKiBAcGFyYW0gY2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhlIGhhc2h0YWJsZQotCSAqIEByZXR1cm4gYSBuZXcgaGFzaHRhYmxlCi0JICogCi0JICogQHNpbmNlIDMuMAotCSAqLwotCUN1c3RvbUhhc2h0YWJsZSBuZXdIYXNodGFibGUoaW50IGNhcGFjaXR5KSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tSGFzaHRhYmxlKGNhcGFjaXR5LCBnZXRDb21wYXJlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBdHRlbXB0cyB0byBwcmVzZXJ2ZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFjcm9zcyBhIHJ1biBvZiB0aGUgZ2l2ZW4KLQkgKiBjb2RlLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kOgotCSAqIDx1bD4KLQkgKiA8bGk+ZGlzY292ZXJzIHRoZSBvbGQgc2VsZWN0aW9uICh2aWEgPGNvZGU+Z2V0U2VsZWN0aW9uPC9jb2RlPik8L2xpPgotCSAqIDxsaT5ydW5zIHRoZSBnaXZlbiBydW5uYWJsZTwvbGk+Ci0JICogPGxpPmF0dGVtcHRzIHRvIHJlc3RvcmUgdGhlIG9sZCBzZWxlY3Rpb24gKHVzaW5nCi0JICogPGNvZGU+c2V0U2VsZWN0aW9uVG9XaWRnZXQ8L2NvZGU+PC9saT4KLQkgKiA8bGk+cmVkaXNjb3ZlcnMgdGhlIHJlc3VsdGluZyBzZWxlY3Rpb24gKHZpYSA8Y29kZT5nZXRTZWxlY3Rpb248L2NvZGU+KQotCSAqIDwvbGk+Ci0JICogPGxpPmNhbGxzIDxjb2RlPmhhbmRsZUludmFsaWRTZWxlY3Rpb248L2NvZGU+IGlmIHRoZSBzZWxlY3Rpb24gZGlkIG5vdAotCSAqIHRha2U8L2xpPgotCSAqIDxsaT5jYWxscyA8Y29kZT5wb3N0VXBkYXRlSG9vazwvY29kZT48L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB1cGRhdGVDb2RlCi0JICogICAgICAgICAgICB0aGUgY29kZSB0byBydW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmVzZXJ2aW5nU2VsZWN0aW9uKFJ1bm5hYmxlIHVwZGF0ZUNvZGUpIHsKLQotCQlJU2VsZWN0aW9uIG9sZFNlbGVjdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBwcmVzZXJ2ZSBzZWxlY3Rpb24KLQkJCW9sZFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQkJaW5DaGFuZ2UgPSByZXN0b3JlU2VsZWN0aW9uID0gdHJ1ZTsKLQotCQkJLy8gcGVyZm9ybSB0aGUgdXBkYXRlCi0JCQl1cGRhdGVDb2RlLnJ1bigpOwotCi0JCX0gZmluYWxseSB7Ci0JCQlpbkNoYW5nZSA9IGZhbHNlOwotCi0JCQkvLyByZXN0b3JlIHNlbGVjdGlvbgotCQkJaWYgKHJlc3RvcmVTZWxlY3Rpb24pCi0JCQkJc2V0U2VsZWN0aW9uVG9XaWRnZXQob2xkU2VsZWN0aW9uLCBmYWxzZSk7Ci0KLQkJCS8vIHNlbmQgb3V0IG5vdGlmaWNhdGlvbiBpZiBvbGQgYW5kIG5ldyBkaWZmZXIKLQkJCUlTZWxlY3Rpb24gbmV3U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoIW5ld1NlbGVjdGlvbi5lcXVhbHMob2xkU2VsZWN0aW9uKSkKLQkJCQloYW5kbGVJbnZhbGlkU2VsZWN0aW9uKG9sZFNlbGVjdGlvbiwgbmV3U2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogTm9uLUphdmFkb2MuIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJcmVmcmVzaChnZXRSb290KCkpOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGlzIHZpZXdlciB3aXRoIGluZm9ybWF0aW9uIGZyZXNobHkgb2J0YWluZWQgZnJvbSB0aGlzCi0JICogdmlld2VyJ3MgbW9kZWwuIElmIDxjb2RlPnVwZGF0ZUxhYmVsczwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiB0aGVuIGxhYmVscyBmb3Igb3RoZXJ3aXNlIHVuYWZmZWN0ZWQgZWxlbWVudHMgYXJlIHVwZGF0ZWQgYXMgd2VsbC4KLQkgKiBPdGhlcndpc2UsIGl0IGFzc3VtZXMgbGFiZWxzIGZvciBleGlzdGluZyBlbGVtZW50cyBhcmUgdW5jaGFuZ2VkLCBhbmQKLQkgKiBsYWJlbHMgYXJlIG9ubHkgb2J0YWluZWQgYXMgbmVlZGVkIChmb3IgZXhhbXBsZSwgZm9yIG5ldyBlbGVtZW50cykuCi0JICogPHA+Ci0JICogQ2FsbGluZyA8Y29kZT5yZWZyZXNoKHRydWUpPC9jb2RlPiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzCi0JICogPGNvZGU+cmVmcmVzaCgpPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIG1heSBzdGlsbCBvYnRhaW4gbGFiZWxzIGZvciBleGlzdGluZwotCSAqIGVsZW1lbnRzIGV2ZW4gaWYgPGNvZGU+dXBkYXRlTGFiZWxzPC9jb2RlPiBpcyBmYWxzZS4gVGhlIGludGVudCBpcwotCSAqIHNpbXBseSB0byBhbGxvdyBvcHRpbWl6YXRpb24gd2hlcmUgcG9zc2libGUuCi0JICogCi0JICogQHBhcmFtIHVwZGF0ZUxhYmVscwotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gdXBkYXRlIGxhYmVscyBmb3IgZXhpc3RpbmcgZWxlbWVudHMsCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gb25seSB1cGRhdGUgbGFiZWxzIGFzIG5lZWRlZCwgYXNzdW1pbmcKLQkgKiAgICAgICAgICAgIHRoYXQgbGFiZWxzIGZvciBleGlzdGluZyBlbGVtZW50cyBhcmUgdW5jaGFuZ2VkLgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7Ci0JCXJlZnJlc2goZ2V0Um9vdCgpLCB1cGRhdGVMYWJlbHMpOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGlzIHZpZXdlciBzdGFydGluZyB3aXRoIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIDxwPgotCSAqIFVubGlrZSB0aGUgPGNvZGU+dXBkYXRlPC9jb2RlPiBtZXRob2RzLCB0aGlzIGhhbmRsZXMgc3RydWN0dXJhbCBjaGFuZ2VzCi0JICogdG8gdGhlIGdpdmVuIGVsZW1lbnQgKGUuZy4gYWRkaXRpb24gb3IgcmVtb3ZhbCBvZiBjaGlsZHJlbikuIElmIG9ubHkgdGhlCi0JICogZ2l2ZW4gZWxlbWVudCBuZWVkcyB1cGRhdGluZywgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gdXNlIHRoZQotCSAqIDxjb2RlPnVwZGF0ZTwvY29kZT4gbWV0aG9kcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChmaW5hbCBPYmplY3QgZWxlbWVudCkgewotCQlwcmVzZXJ2aW5nU2VsZWN0aW9uKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpbnRlcm5hbFJlZnJlc2goZWxlbWVudCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGlzIHZpZXdlciBzdGFydGluZyB3aXRoIHRoZSBnaXZlbiBlbGVtZW50LiBMYWJlbHMgYXJlIHVwZGF0ZWQKLQkgKiBhcyBkZXNjcmliZWQgaW4gPGNvZGU+cmVmcmVzaChib29sZWFuIHVwZGF0ZUxhYmVscyk8L2NvZGU+LgotCSAqIDxwPgotCSAqIFVubGlrZSB0aGUgPGNvZGU+dXBkYXRlPC9jb2RlPiBtZXRob2RzLCB0aGlzIGhhbmRsZXMgc3RydWN0dXJhbCBjaGFuZ2VzCi0JICogdG8gdGhlIGdpdmVuIGVsZW1lbnQgKGUuZy4gYWRkaXRpb24gb3IgcmVtb3ZhbCBvZiBjaGlsZHJlbikuIElmIG9ubHkgdGhlCi0JICogZ2l2ZW4gZWxlbWVudCBuZWVkcyB1cGRhdGluZywgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gdXNlIHRoZQotCSAqIDxjb2RlPnVwZGF0ZTwvY29kZT4gbWV0aG9kcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHVwZGF0ZUxhYmVscwotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gdXBkYXRlIGxhYmVscyBmb3IgZXhpc3RpbmcgZWxlbWVudHMsCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gb25seSB1cGRhdGUgbGFiZWxzIGFzIG5lZWRlZCwgYXNzdW1pbmcKLQkgKiAgICAgICAgICAgIHRoYXQgbGFiZWxzIGZvciBleGlzdGluZyBlbGVtZW50cyBhcmUgdW5jaGFuZ2VkLgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKGZpbmFsIE9iamVjdCBlbGVtZW50LCBmaW5hbCBib29sZWFuIHVwZGF0ZUxhYmVscykgewotCQlwcmVzZXJ2aW5nU2VsZWN0aW9uKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpbnRlcm5hbFJlZnJlc2goZWxlbWVudCwgdXBkYXRlTGFiZWxzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmVmcmVzaGVzIHRoZSBnaXZlbiBUYWJsZUl0ZW0gd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudC4gQ2FsbHMKLQkgKiA8Y29kZT5kb1VwZGF0ZUl0ZW0oLi4uLCBmYWxzZSk8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcms7IHN1YmNsYXNzZXJzIHNob3VsZCBub3QgY2FsbAotCSAqIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gd2lkZ2V0Ci0gICAgICogICAgICAgICAgICB0aGUgd2lkZ2V0Ci0JICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmcmVzaEl0ZW0oV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJU2FmZVJ1bm5hYmxlLnJ1bihuZXcgVXBkYXRlSXRlbVNhZmVSdW5uYWJsZSh3aWRnZXQsIGVsZW1lbnQsIHRydWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBvcGVuIGxpc3RlbmVyIGZyb20gdGhpcyB2aWV3ZXIuIEhhcyBubyBhZmZlY3QgaWYgYW4KLQkgKiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGRvdWJsZS1jbGljayBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU9wZW5MaXN0ZW5lcihJT3Blbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCW9wZW5MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZG91YmxlLWNsaWNrIGxpc3RlbmVyIGZyb20gdGhpcyB2aWV3ZXIuIEhhcyBubyBhZmZlY3QKLQkgKiBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGRvdWJsZS1jbGljayBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoSURvdWJsZUNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZG91YmxlQ2xpY2tMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBmaWx0ZXIgZnJvbSB0aGlzIHZpZXdlciwgYW5kIHRyaWdnZXJzIHJlZmlsdGVyaW5nIGFuZAotCSAqIHJlc29ydGluZyBvZiB0aGUgZWxlbWVudHMgaWYgcmVxdWlyZWQuIEhhcyBubyBlZmZlY3QgaWYgdGhlIGlkZW50aWNhbAotCSAqIGZpbHRlciBpcyBub3QgcmVnaXN0ZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBhIHZpZXdlciBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGaWx0ZXIoVmlld2VyRmlsdGVyIGZpbHRlcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGZpbHRlcik7Ci0JCWlmIChmaWx0ZXJzICE9IG51bGwpIHsKLQkJCS8vIE5vdGU6IGNhbid0IHVzZSBMaXN0LnJlbW92ZShPYmplY3QpLiBVc2UgaWRlbnRpdHkgY29tcGFyaXNvbgotCQkJLy8gaW5zdGVhZC4KLQkJCWZvciAoSXRlcmF0b3IgaSA9IGZpbHRlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpLm5leHQoKTsKLQkJCQlpZiAobyA9PSBmaWx0ZXIpIHsKLQkJCQkJaS5yZW1vdmUoKTsKLQkJCQkJcmVmcmVzaCgpOwotCQkJCQlpZiAoZmlsdGVycy5zaXplKCkgPT0gMCkKLQkJCQkJCWZpbHRlcnMgPSBudWxsOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY2FyZHMgdGhpcyB2aWV3ZXIncyBmaWx0ZXJzIGFuZCB0cmlnZ2VycyByZWZpbHRlcmluZyBhbmQgcmVzb3J0aW5nIG9mCi0JICogdGhlIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0RmlsdGVycygpIHsKLQkJaWYgKGZpbHRlcnMgIT0gbnVsbCkgewotCQkJZmlsdGVycyA9IG51bGw7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgaXMgdmlzaWJsZSwgc2Nyb2xsaW5nIHRoZSB2aWV3ZXIgaWYKLQkgKiBuZWNlc3NhcnkuIFRoZSBzZWxlY3Rpb24gaXMgdW5jaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCB0byByZXZlYWwKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXZlYWwoT2JqZWN0IGVsZW1lbnQpOwotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db250ZW50Vmlld2VyI3NldENvbnRlbnRQcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJYXNzZXJ0Q29udGVudFByb3ZpZGVyVHlwZShwcm92aWRlcik7Ci0JCXN1cGVyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0IHRoYXQgdGhlIGNvbnRlbnQgcHJvdmlkZXIgaXMgb2Ygb25lIG9mIHRoZQotCSAqIHN1cHBvcnRlZCB0eXBlcy4KLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb250ZW50UHJvdmlkZXJUeXBlKElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShwcm92aWRlciBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNzZXRJbnB1dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCi0JCXRyeSB7Ci0JCQkvLwkJZkluQ2hhbmdlPSB0cnVlOwotCi0JCQl1bm1hcEFsbEVsZW1lbnRzKCk7Ci0KLQkJCXN1cGVyLnNldElucHV0KGlucHV0KTsKLQotCQl9IGZpbmFsbHkgewotCQkJLy8JCWZJbkNoYW5nZT0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiByZXZlYWwpIHsKLQkJLyoqCi0JCSAqIDxwPgotCQkgKiBJZiB0aGUgbmV3IHNlbGVjdGlvbiBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHRoZSBob29rCi0JCSAqIDxjb2RlPnVwZGF0ZVNlbGVjdGlvbjwvY29kZT4gaXMgY2FsbGVkLgotCQkgKiA8L3A+Ci0JCSAqIDxwPgotCQkgKiBJZiA8Y29kZT5zZXRTZWxlY3Rpb248L2NvZGU+IGlzIGNhbGxlZCBmcm9tIHdpdGhpbgotCQkgKiA8Y29kZT5wcmVzZXJ2ZVNlbGVjdGlvbjwvY29kZT4sIHRoZSBjYWxsIHRvCi0JCSAqIDxjb2RlPnVwZGF0ZVNlbGVjdGlvbjwvY29kZT4gaXMgZGVsYXllZCB1bnRpbCB0aGUgZW5kIG9mCi0JCSAqIDxjb2RlPnByZXNlcnZlU2VsZWN0aW9uPC9jb2RlPi4KLQkJICogPC9wPgotCQkgKiA8cD4KLQkJICogU3ViY2xhc3NlcyBkbyBub3QgdHlwaWNhbGx5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBidXQgaW1wbGVtZW50Ci0JCSAqIDxjb2RlPnNldFNlbGVjdGlvblRvV2lkZ2V0PC9jb2RlPiBpbnN0ZWFkLgotCQkgKiA8L3A+Ci0JCSAqLwotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sID09IG51bGwgfHwgY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIWluQ2hhbmdlKSB7Ci0JCQlzZXRTZWxlY3Rpb25Ub1dpZGdldChzZWxlY3Rpb24sIHJldmVhbCk7Ci0JCQlJU2VsZWN0aW9uIHNlbCA9IGdldFNlbGVjdGlvbigpOwotCQkJdXBkYXRlU2VsZWN0aW9uKHNlbCk7Ci0JCQlmaXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWwpKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3RvcmVTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCXNldFNlbGVjdGlvblRvV2lkZ2V0KHNlbGVjdGlvbiwgcmV2ZWFsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcmxheXMgdGhlIGdpdmVuIGxpc3Qgb2Ygc2VsZWN0ZWQgZWxlbWVudHMgaW50byBzZWxlY3Rpb25zIG9uIHRoaXMKLQkgKiB2aWV3ZXIncyBjb250cm9sLgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHNldCB0aGVpciBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGdpdmVuIGxpc3QKLQkgKiBvZiBlbGVtZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIGxpc3Qgb2Ygc2VsZWN0ZWQgZWxlbWVudHMgKGVsZW1lbnQgdHlwZTogPGNvZGU+T2JqZWN0PC9jb2RlPikKLQkgKiAgICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzZWxlY3Rpb24gaXMgdG8gYmUgY2xlYXJlZAotCSAqIEBwYXJhbSByZXZlYWwKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWxlY3Rpb24gaXMgdG8gYmUgbWFkZSB2aXNpYmxlLAotCSAqICAgICAgICAgICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRTZWxlY3Rpb25Ub1dpZGdldChMaXN0IGwsIGJvb2xlYW4gcmV2ZWFsKTsKLQotCS8qKgotCSAqIENvbnZlcnRzIHRoZSBzZWxlY3Rpb24gdG8gYSA8Y29kZT5MaXN0PC9jb2RlPiBhbmQgY2FsbHMKLQkgKiA8Y29kZT5zZXRTZWxlY3Rpb25Ub1dpZGdldChMaXN0LCBib29sZWFuKTwvY29kZT4uIFRoZSBzZWxlY3Rpb24gaXMKLQkgKiBleHBlY3RlZCB0byBiZSBhbiA8Y29kZT5JU3RydWN0dXJlZFNlbGVjdGlvbjwvY29kZT4gb2YgZWxlbWVudHMuIElmCi0JICogbm90LCB0aGUgc2VsZWN0aW9uIGlzIGNsZWFyZWQuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBkbyBub3QgdHlwaWNhbGx5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBidXQgaW1wbGVtZW50Ci0JICogPGNvZGU+c2V0U2VsZWN0aW9uVG9XaWRnZXQoTGlzdCwgYm9vbGVhbik8L2NvZGU+IGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgYW4gSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2YgZWxlbWVudHMKLQkgKiBAcGFyYW0gcmV2ZWFsCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byByZXZlYWwgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlCi0JICogICAgICAgICAgICBzZWxlY3Rpb24sIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3Rpb25Ub1dpZGdldChJU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiByZXZlYWwpIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJc2V0U2VsZWN0aW9uVG9XaWRnZXQoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKSwgcmV2ZWFsKTsKLQkJZWxzZQotCQkJc2V0U2VsZWN0aW9uVG9XaWRnZXQoKExpc3QpIG51bGwsIHJldmVhbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGlzIHZpZXdlcidzIHNvcnRlciBhbmQgdHJpZ2dlcnMgcmVmaWx0ZXJpbmcgYW5kIHJlc29ydGluZyBvZiB0aGlzCi0JICogdmlld2VyJ3MgZWxlbWVudC4gUGFzc2luZyA8Y29kZT5udWxsPC9jb2RlPiB0dXJucyBzb3J0aW5nIG9mZi4KLQkgKiAKLQkgKiBAcGFyYW0gc29ydGVyCi0JICogICAgICAgICAgICBhIHZpZXdlciBzb3J0ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3J0ZXIoVmlld2VyU29ydGVyIHNvcnRlcikgewotCQlpZiAodGhpcy5zb3J0ZXIgIT0gc29ydGVyKSB7Ci0JCQl0aGlzLnNvcnRlciA9IHNvcnRlcjsKLQkJCXJlZnJlc2goKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgd2hldGhlciB0aGlzIHN0cnVjdHVyZWQgdmlld2VyIHVzZXMgYW4gaW50ZXJuYWwgaGFzaCB0YWJsZSB0bwotCSAqIHNwZWVkcyB1cCB0aGUgbWFwcGluZyBiZXR3ZWVuIGVsZW1lbnRzIGFuZCBTV1QgaXRlbXMuIFRoaXMgbXVzdCBiZSBjYWxsZWQKLQkgKiBiZWZvcmUgdGhlIHZpZXdlciBpcyBnaXZlbiBhbiBpbnB1dCAodmlhIDxjb2RlPnNldElucHV0PC9jb2RlPikuCi0JICogCi0JICogQHBhcmFtIGVuYWJsZQotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZW5hYmxlIGhhc2ggbG9va3VwLCBhbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBkaXNhYmxlIGl0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlSGFzaGxvb2t1cChib29sZWFuIGVuYWJsZSkgewotCQlBc3NlcnQuaXNUcnVlKGdldElucHV0KCkgPT0gbnVsbCwKLQkJCQkiQ2FuIG9ubHkgZW5hYmxlIHRoZSBoYXNoIGxvb2sgdXAgYmVmb3JlIGlucHV0IGhhcyBiZWVuIHNldCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGVuYWJsZSkgewotCQkJZWxlbWVudE1hcCA9IG5ld0hhc2h0YWJsZShDdXN0b21IYXNodGFibGUuREVGQVVMVF9DQVBBQ0lUWSk7Ci0JCX0gZWxzZSB7Ci0JCQllbGVtZW50TWFwID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbXBhcmF0b3IgdG8gdXNlIGZvciBjb21wYXJpbmcgZWxlbWVudHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogdG8gdXNlIHRoZSBkZWZhdWx0IDxjb2RlPmVxdWFsczwvY29kZT4gYW5kIDxjb2RlPmhhc2hDb2RlPC9jb2RlPgotCSAqIG1ldGhvZHMgb24gdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMuCi0JICogCi0JICogQHBhcmFtIGNvbXBhcmVyCi0JICogICAgICAgICAgICB0aGUgY29tcGFyYXRvciB0byB1c2UgZm9yIGNvbXBhcmluZyBlbGVtZW50cyBvcgotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wYXJlcihJRWxlbWVudENvbXBhcmVyIGNvbXBhcmVyKSB7Ci0JCXRoaXMuY29tcGFyZXIgPSBjb21wYXJlcjsKLQkJaWYgKGVsZW1lbnRNYXAgIT0gbnVsbCkgewotCQkJZWxlbWVudE1hcCA9IG5ldyBDdXN0b21IYXNodGFibGUoZWxlbWVudE1hcCwgY29tcGFyZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSG9vayBmb3IgdGVzdGluZy4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gV2lkZ2V0Ci0JICovCi0JcHVibGljIFdpZGdldCB0ZXN0RmluZEl0ZW0oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZpbmRJdGVtKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEhvb2sgZm9yIHRlc3RpbmcuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFdpZGdldFtdCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBXaWRnZXRbXSB0ZXN0RmluZEl0ZW1zKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmaW5kSXRlbXMoZWxlbWVudCk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhlIG1hcC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlcm5hbCB0byB0aGUgZnJhbWV3b3JrOyBzdWJjbGFzc2VycyBzaG91bGQgbm90IGNhbGwKLQkgKiB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5tYXBBbGxFbGVtZW50cygpIHsKLQkJaWYgKGVsZW1lbnRNYXAgIT0gbnVsbCkgewotCQkJZWxlbWVudE1hcCA9IG5ld0hhc2h0YWJsZShDdXN0b21IYXNodGFibGUuREVGQVVMVF9DQVBBQ0lUWSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBlbGVtZW50IGZyb20gdGhlIGludGVybmFsIGVsZW1lbnQgdG8gd2lkZ2V0IG1hcC4gRG9lcwotCSAqIG5vdGhpbmcgaWYgbWFwcGluZyBpcyBkaXNhYmxlZC4gSWYgbWFwcGluZyBpcyBlbmFibGVkLCB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIG11c3QgYmUgcHJlc2VudC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlcm5hbCB0byB0aGUgZnJhbWV3b3JrOyBzdWJjbGFzc2VycyBzaG91bGQgbm90IGNhbGwKLQkgKiB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5tYXBFbGVtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50TWFwICE9IG51bGwpIHsKLQkJCWVsZW1lbnRNYXAucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gYXNzb2NpYXRpb24gZnJvbSB0aGUgaW50ZXJuYWwgZWxlbWVudCB0byB3aWRnZXQgbWFwLgotCSAqIERvZXMgbm90aGluZyBpZiBtYXBwaW5nIGlzIGRpc2FibGVkLCBvciBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBkb2VzIG5vdCBtYXAKLQkgKiB0byB0aGUgZ2l2ZW4gaXRlbS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlcm5hbCB0byB0aGUgZnJhbWV3b3JrOyBzdWJjbGFzc2VycyBzaG91bGQgbm90IGNhbGwKLQkgKiB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGl0ZW0gdGhlIGl0ZW0gdG8gdW5tYXAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5tYXBFbGVtZW50KE9iamVjdCBlbGVtZW50LCBXaWRnZXQgaXRlbSkgewotCQkvLyBkb3VibGUtY2hlY2sgdGhhdCB0aGUgZWxlbWVudCBhY3R1YWxseSBtYXBzIHRvIHRoZSBnaXZlbiBpdGVtIGJlZm9yZQotCQkvLyB1bm1hcHBpbmcgaXQKLQkJaWYgKGVsZW1lbnRNYXAgIT0gbnVsbCkgewotCQkJT2JqZWN0IHdpZGdldE9yV2lkZ2V0cyA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpOwotCQkJaWYgKHdpZGdldE9yV2lkZ2V0cyA9PSBudWxsKSB7Ci0JCQkJLy8gaXRlbSB3YXMgbm90IG1hcHBlZCwgcmV0dXJuCi0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIGlmICh3aWRnZXRPcldpZGdldHMgaW5zdGFuY2VvZiBXaWRnZXQpIHsKLQkJCQlpZiAoaXRlbSA9PSB3aWRnZXRPcldpZGdldHMpIHsKLQkJCQkJZWxlbWVudE1hcC5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlXaWRnZXRbXSB3aWRnZXRzID0gKFdpZGdldFtdKSB3aWRnZXRPcldpZGdldHM7Ci0JCQkJaW50IGluZGV4T2ZJdGVtID0gQXJyYXlzLmFzTGlzdCh3aWRnZXRzKS5pbmRleE9mKGl0ZW0pOwotCQkJCWlmIChpbmRleE9mSXRlbSA9PSAtMSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWludCBsZW5ndGggPSB3aWRnZXRzLmxlbmd0aDsKLQkJCQlpZiAoaW5kZXhPZkl0ZW0gPT0gMCkgewotCQkJCQlpZihsZW5ndGggPT0gMSkgewotCQkJCQkJZWxlbWVudE1hcC5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlXaWRnZXRbXSB1cGRhdGVkV2lkZ2V0cyA9IG5ldyBXaWRnZXRbbGVuZ3RoIC0gMV07Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHdpZGdldHMsIDEsIHVwZGF0ZWRXaWRnZXRzLCAwLCBsZW5ndGggLTEgKTsKLQkJCQkJCWVsZW1lbnRNYXAucHV0KGVsZW1lbnQsIHVwZGF0ZWRXaWRnZXRzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCVdpZGdldFtdIHVwZGF0ZWRXaWRnZXRzID0gbmV3IFdpZGdldFtsZW5ndGggLSAxXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weSh3aWRnZXRzLCAwLCB1cGRhdGVkV2lkZ2V0cywgMCwgaW5kZXhPZkl0ZW0pOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHdpZGdldHMsIGluZGV4T2ZJdGVtICsgMSwgdXBkYXRlZFdpZGdldHMsIGluZGV4T2ZJdGVtLCBsZW5ndGggLSBpbmRleE9mSXRlbSAtIDEpOwotCQkJCQllbGVtZW50TWFwLnB1dChlbGVtZW50LCB1cGRhdGVkV2lkZ2V0cyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZ2l2ZW4gZWxlbWVudHMnIHByZXNlbnRhdGlvbiB3aGVuIG9uZSBvciBtb3JlIG9mIHRoZWlyCi0JICogcHJvcGVydGllcyBjaGFuZ2UuIE9ubHkgdGhlIGdpdmVuIGVsZW1lbnRzIGFyZSB1cGRhdGVkLgotCSAqIDxwPgotCSAqIFRoaXMgZG9lcyBub3QgaGFuZGxlIHN0cnVjdHVyYWwgY2hhbmdlcyAoZS5nLiBhZGRpdGlvbiBvciByZW1vdmFsIG9mCi0JICogZWxlbWVudHMpLCBhbmQgZG9lcyBub3QgdXBkYXRlIGFueSBvdGhlciByZWxhdGVkIGVsZW1lbnRzIChlLmcuIGNoaWxkCi0JICogZWxlbWVudHMpLiBUbyBoYW5kbGUgc3RydWN0dXJhbCBjaGFuZ2VzLCB1c2UgdGhlIDxjb2RlPnJlZnJlc2g8L2NvZGU+Ci0JICogbWV0aG9kcyBpbnN0ZWFkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhbiBlbGVtZW50IGhhcyBjaGFuZ2VkIGluIHRoZSBtb2RlbCwgaW4gb3JkZXIKLQkgKiB0byBoYXZlIHRoZSB2aWV3ZXIgYWNjdXJhdGVseSByZWZsZWN0IHRoZSBtb2RlbC4gVGhpcyBtZXRob2Qgb25seSBhZmZlY3RzCi0JICogdGhlIHZpZXdlciwgbm90IHRoZSBtb2RlbC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogU3BlY2lmeWluZyB3aGljaCBwcm9wZXJ0aWVzIGFyZSBhZmZlY3RlZCBtYXkgYWxsb3cgdGhlIHZpZXdlciB0byBvcHRpbWl6ZQotCSAqIHRoZSB1cGRhdGUuIEZvciBleGFtcGxlLCBpZiB0aGUgbGFiZWwgcHJvdmlkZXIgaXMgbm90IGFmZmVjdGVkIGJ5IGNoYW5nZXMKLQkgKiB0byBhbnkgb2YgdGhlc2UgcHJvcGVydGllcywgYW4gdXBkYXRlIG1heSBub3QgYWN0dWFsbHkgYmUgcmVxdWlyZWQuCi0JICogU3BlY2lmaW5nIDxjb2RlPnByb3BlcnRpZXM8L2NvZGU+IGFzIDxjb2RlPm51bGw8L2NvZGU+IGZvcmNlcyBhIGZ1bGwKLQkgKiB1cGRhdGUgb2YgdGhlIGdpdmVuIGVsZW1lbnRzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgdmlld2VyIGhhcyBhIHNvcnRlciB3aGljaCBpcyBhZmZlY3RlZCBieSBhIGNoYW5nZSB0byBvbmUgb2YgdGhlCi0JICogcHJvcGVydGllcywgdGhlIGVsZW1lbnRzJyBwb3NpdGlvbnMgYXJlIHVwZGF0ZWQgdG8gbWFpbnRhaW4gdGhlIHNvcnQKLQkgKiBvcmRlci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhlIHZpZXdlciBoYXMgYSBmaWx0ZXIgd2hpY2ggaXMgYWZmZWN0ZWQgYnkgYSBjaGFuZ2UgdG8gb25lIG9mIHRoZQotCSAqIHByb3BlcnRpZXMsIGVsZW1lbnRzIG1heSBhcHBlYXIgb3IgZGlzYXBwZWFyIGlmIHRoZSBjaGFuZ2UgYWZmZWN0cwotCSAqIHdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGZpbHRlcmVkIG91dC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudHMKLQkgKiBAcGFyYW0gcHJvcGVydGllcwotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGNoYW5nZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB1bmtub3duCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKE9iamVjdFtdIGVsZW1lbnRzLCBTdHJpbmdbXSBwcm9wZXJ0aWVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpCi0JCQl1cGRhdGUoZWxlbWVudHNbaV0sIHByb3BlcnRpZXMpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGdpdmVuIGVsZW1lbnQncyBwcmVzZW50YXRpb24gd2hlbiBvbmUgb3IgbW9yZSBvZiBpdHMKLQkgKiBwcm9wZXJ0aWVzIGNoYW5nZXMuIE9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgaXMgdXBkYXRlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGRvZXMgbm90IGhhbmRsZSBzdHJ1Y3R1cmFsIGNoYW5nZXMgKGUuZy4gYWRkaXRpb24gb3IgcmVtb3ZhbCBvZgotCSAqIGVsZW1lbnRzKSwgYW5kIGRvZXMgbm90IHVwZGF0ZSBhbnkgb3RoZXIgcmVsYXRlZCBlbGVtZW50cyAoZS5nLiBjaGlsZAotCSAqIGVsZW1lbnRzKS4gVG8gaGFuZGxlIHN0cnVjdHVyYWwgY2hhbmdlcywgdXNlIHRoZSA8Y29kZT5yZWZyZXNoPC9jb2RlPgotCSAqIG1ldGhvZHMgaW5zdGVhZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYW4gZWxlbWVudCBoYXMgY2hhbmdlZCBpbiB0aGUgbW9kZWwsIGluIG9yZGVyCi0JICogdG8gaGF2ZSB0aGUgdmlld2VyIGFjY3VyYXRlbHkgcmVmbGVjdCB0aGUgbW9kZWwuIFRoaXMgbWV0aG9kIG9ubHkgYWZmZWN0cwotCSAqIHRoZSB2aWV3ZXIsIG5vdCB0aGUgbW9kZWwuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFNwZWNpZnlpbmcgd2hpY2ggcHJvcGVydGllcyBhcmUgYWZmZWN0ZWQgbWF5IGFsbG93IHRoZSB2aWV3ZXIgdG8gb3B0aW1pemUKLQkgKiB0aGUgdXBkYXRlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGxhYmVsIHByb3ZpZGVyIGlzIG5vdCBhZmZlY3RlZCBieSBjaGFuZ2VzCi0JICogdG8gYW55IG9mIHRoZXNlIHByb3BlcnRpZXMsIGFuIHVwZGF0ZSBtYXkgbm90IGFjdHVhbGx5IGJlIHJlcXVpcmVkLgotCSAqIFNwZWNpZmluZyA8Y29kZT5wcm9wZXJ0aWVzPC9jb2RlPiBhcyA8Y29kZT5udWxsPC9jb2RlPiBmb3JjZXMgYSBmdWxsCi0JICogdXBkYXRlIG9mIHRoZSBlbGVtZW50LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgdmlld2VyIGhhcyBhIHNvcnRlciB3aGljaCBpcyBhZmZlY3RlZCBieSBhIGNoYW5nZSB0byBvbmUgb2YgdGhlCi0JICogcHJvcGVydGllcywgdGhlIGVsZW1lbnQncyBwb3NpdGlvbiBpcyB1cGRhdGVkIHRvIG1haW50YWluIHRoZSBzb3J0IG9yZGVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgdmlld2VyIGhhcyBhIGZpbHRlciB3aGljaCBpcyBhZmZlY3RlZCBieSBhIGNoYW5nZSB0byBvbmUgb2YgdGhlCi0JICogcHJvcGVydGllcywgdGhlIGVsZW1lbnQgbWF5IGFwcGVhciBvciBkaXNhcHBlYXIgaWYgdGhlIGNoYW5nZSBhZmZlY3RzCi0JICogd2hldGhlciBvciBub3QgdGhlIGVsZW1lbnQgaXMgZmlsdGVyZWQgb3V0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHJvcGVydGllcwotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGNoYW5nZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB1bmtub3duCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKE9iamVjdCBlbGVtZW50LCBTdHJpbmdbXSBwcm9wZXJ0aWVzKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZWxlbWVudCk7Ci0JCVdpZGdldFtdIGl0ZW1zID0gZmluZEl0ZW1zKGVsZW1lbnQpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWludGVybmFsVXBkYXRlKGl0ZW1zW2ldLCBlbGVtZW50LCBwcm9wZXJ0aWVzKTsKLQkJfQkJCi0JfQotCi0JLyoqCi0gICAgICogVXBkYXRlcyB0aGUgZ2l2ZW4gZWxlbWVudCdzIHByZXNlbnRhdGlvbiB3aGVuIG9uZSBvciBtb3JlIG9mIGl0cwotICAgICAqIHByb3BlcnRpZXMgY2hhbmdlcy4gT25seSB0aGUgZ2l2ZW4gZWxlbWVudCBpcyB1cGRhdGVkLgotICAgICAqIDxwPgotICAgICAqIEVYUEVSSU1FTlRBTC4gIE5vdCB0byBiZSB1c2VkIGV4Y2VwdCBieSBKRFQuCi0gICAgICogVGhpcyBtZXRob2Qgd2FzIGFkZGVkIHRvIHN1cHBvcnQgSkRUJ3MgZXhwbG9yYXRpb25zCi0gICAgICogaW50byBncm91cGluZyBieSB3b3JraW5nIHNldHMsIHdoaWNoIHJlcXVpcmVzIHZpZXdlcnMgdG8gc3VwcG9ydCBtdWx0aXBsZSAKLSAgICAgKiBlcXVhbCBlbGVtZW50cy4gIFNlZSBidWcgNzY0ODIgZm9yIG1vcmUgZGV0YWlscy4gIFRoaXMgc3VwcG9ydCB3aWxsCi0gICAgICogbGlrZWx5IGJlIHJlbW92ZWQgaW4gRWNsaXBzZSAzLjIgaW4gZmF2b3VyIG9mIHByb3BlciBzdXBwb3J0IGZvcgotICAgICAqIG11bHRpcGxlIGVxdWFsIGVsZW1lbnRzLiAKLSAgICAgKiA8L3A+Ci0gICAgICogQHBhcmFtIHdpZGdldAotICAgICAqICAgICAgICAgICAgdGhlIHdpZGdldCBmb3IgdGhlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcwotICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGNoYW5nZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZSB1bmtub3duCi0gICAgICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxVcGRhdGUoV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQsIFN0cmluZ1tdIHByb3BlcnRpZXMpIHsKLQkJYm9vbGVhbiBuZWVkc1JlZmlsdGVyID0gZmFsc2U7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7ICsraSkgewotCQkJCW5lZWRzUmVmaWx0ZXIgPSBuZWVkc1JlZmlsdGVyKGVsZW1lbnQsIHByb3BlcnRpZXNbaV0pOwotCQkJCWlmIChuZWVkc1JlZmlsdGVyKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobmVlZHNSZWZpbHRlcikgewotCQkJcmVmcmVzaCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBuZWVkc1VwZGF0ZTsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJbmVlZHNVcGRhdGUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJbmVlZHNVcGRhdGUgPSBmYWxzZTsKLQkJCUlCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgKytpKSB7Ci0JCQkJbmVlZHNVcGRhdGUgPSBsYWJlbFByb3ZpZGVyLmlzTGFiZWxQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0aWVzW2ldKTsKLQkJCQlpZiAobmVlZHNVcGRhdGUpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChuZWVkc1VwZGF0ZSkgewotCQkJdXBkYXRlSXRlbSh3aWRnZXQsIGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGF0dHJpYnV0ZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaW50byB0aGUgZ2l2ZW4gd2lkZ2V0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcms7IHN1YmNsYXNzZXJzIHNob3VsZCBub3QgY2FsbAotCSAqIHRoaXMgbWV0aG9kLiBDYWxscyA8Y29kZT5kb1VwZGF0ZUl0ZW0od2lkZ2V0LCBlbGVtZW50LCB0cnVlKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB3aWRnZXQKLQkgKiAgICAgICAgICAgIHRoZSB3aWRnZXQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCB1cGRhdGVJdGVtKFdpZGdldCB3aWRnZXQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCVNhZmVSdW5uYWJsZS5ydW4obmV3IFVwZGF0ZUl0ZW1TYWZlUnVubmFibGUod2lkZ2V0LCBlbGVtZW50LCB0cnVlKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc2VsZWN0aW9uIG9mIHRoaXMgdmlld2VyLgotCSAqIDxwPgotCSAqIFRoaXMgZnJhbWV3b3JrIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHNlbGVjdGlvbiBpbiB0aGUgdmlld2VyCi0JICogd2lkZ2V0IGNoYW5nZXMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIG5vdGlmaWVzIGFsbCBzZWxlY3Rpb24gY2hhbmdlCi0JICogbGlzdGVuZXJzIHJlY29yZGVkIGluIGFuIGludGVybmFsIHN0YXRlIHZhcmlhYmxlLiBPdmVycmlkaW5nIHRoaXMgbWV0aG9kCi0JICogaXMgZ2VuZXJhbGx5IG5vdCByZXF1aXJlZDsgaG93ZXZlciwgaWYgb3ZlcnJpZGluZyBpbiBhIHN1YmNsYXNzLAotCSAqIDxjb2RlPnN1cGVyLnVwZGF0ZVNlbGVjdGlvbjwvY29kZT4gbXVzdCBiZSBpbnZva2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc2VsZWN0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKTsKLQkJZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHN0cnVjdHVyZWQgdmlld2VyIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIGFuIGludGVybmFsCi0JICogbWFwIHRvIHNwZWVkIHVwIHRoZSBtYXBwaW5nIGJldHdlZW4gZWxlbWVudHMgYW5kIFNXVCBpdGVtcy4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgY2hlY2tzIHdoZXRoZXIgdGhlCi0JICogaW50ZXJuYWwgbWFwIGhhcyBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbGVtZW50IG1hcCBpcyBlbmFibGVkLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBkaXNhYmxlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVzaW5nRWxlbWVudE1hcCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRNYXAgIT0gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbnRlbnRWaWV3ZXIjc2V0TGFiZWxQcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCWlmIChsYWJlbFByb3ZpZGVyIGluc3RhbmNlb2YgSUNvbG9yUHJvdmlkZXIgfHwgbGFiZWxQcm92aWRlciBpbnN0YW5jZW9mIElGb250UHJvdmlkZXIpCi0JCQljb2xvckFuZEZvbnRDb2xsZWN0b3IgPSBuZXcgQ29sb3JBbmRGb250Q29sbGVjdG9yV2l0aFByb3ZpZGVycyhsYWJlbFByb3ZpZGVyKTsKLQkJZWxzZQotCQkJY29sb3JBbmRGb250Q29sbGVjdG9yID0gbmV3IENvbG9yQW5kRm9udENvbGxlY3RvcigpOwotCQlzdXBlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYSBsYWJlbCB1cCBmb3IgdGhlIGVsZW1lbnQgdXNpbmcgdGhlIHN1cHBsaWVkIGxhYmVsIHByb3ZpZGVyLgotCSAqIEBwYXJhbSB1cGRhdGVMYWJlbCBUaGUgVmlld2VyTGFiZWwgdG8gY29sbGVjdCB0aGUgcmVzdWx0IGluCi0JICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgYmVpbmcgZGVjb3JhdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1aWxkTGFiZWwoVmlld2VyTGFiZWwgdXBkYXRlTGFiZWwsIE9iamVjdCBlbGVtZW50KXsKLQotCQlpZiAoZ2V0TGFiZWxQcm92aWRlcigpIGluc3RhbmNlb2YgSVZpZXdlckxhYmVsUHJvdmlkZXIpIHsKLQkJCUlWaWV3ZXJMYWJlbFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVmlld2VyTGFiZWxQcm92aWRlcikgZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJaXRlbVByb3ZpZGVyLnVwZGF0ZUxhYmVsKHVwZGF0ZUxhYmVsLCBlbGVtZW50KTsKLSAgICAgICAgICAgIAkJCi0JCQljb2xvckFuZEZvbnRDb2xsZWN0b3Iuc2V0VXNlZERlY29yYXRvcnMoKTsKLQkJCQotCQkJaWYodXBkYXRlTGFiZWwuaGFzTmV3QmFja2dyb3VuZCgpKQotCQkJCWNvbG9yQW5kRm9udENvbGxlY3Rvci5zZXRCYWNrZ3JvdW5kKHVwZGF0ZUxhYmVsLmdldEJhY2tncm91bmQoKSk7Ci0JCQkKLQkJCWlmKHVwZGF0ZUxhYmVsLmhhc05ld0ZvcmVncm91bmQoKSkKLQkJCQljb2xvckFuZEZvbnRDb2xsZWN0b3Iuc2V0Rm9yZWdyb3VuZCh1cGRhdGVMYWJlbC5nZXRGb3JlZ3JvdW5kKCkpOwotCQkJCi0JCQlpZih1cGRhdGVMYWJlbC5oYXNOZXdGb250KCkpCi0JCQkJY29sb3JBbmRGb250Q29sbGVjdG9yLnNldEZvbnQodXBkYXRlTGFiZWwuZ2V0Rm9udCgpKTsKLQkJCXJldHVybjsKLQotCQl9IAotCQkKLQkJaWYoZ2V0TGFiZWxQcm92aWRlcigpIGluc3RhbmNlb2YgSUxhYmVsUHJvdmlkZXIpewotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IChJTGFiZWxQcm92aWRlcikgZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJdXBkYXRlTGFiZWwuc2V0VGV4dChsYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCkpOwotCQkJdXBkYXRlTGFiZWwuc2V0SW1hZ2UobGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KSk7Ci0JCX0KLQkKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYSBsYWJlbCB1cCBmb3IgdGhlIGVsZW1lbnQgdXNpbmcgdGhlIHN1cHBsaWVkIGxhYmVsIHByb3ZpZGVyLgotCSAqIEBwYXJhbSB1cGRhdGVMYWJlbCBUaGUgVmlld2VyTGFiZWwgdG8gY29sbGVjdCB0aGUgcmVzdWx0IGluCi0JICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgYmVpbmcgZGVjb3JhdGVkLgotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIElMYWJlbFByb3ZpZGVyIHRoZSBsYWJlbFByb3ZpZGVyIGZvciB0aGUgcmVjZWl2ZXIuCi0JICovCi0Jdm9pZCBidWlsZExhYmVsKFZpZXdlckxhYmVsIHVwZGF0ZUxhYmVsLCBPYmplY3QgZWxlbWVudCxJVmlld2VyTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKXsKLQotCQkJbGFiZWxQcm92aWRlci51cGRhdGVMYWJlbCh1cGRhdGVMYWJlbCwgZWxlbWVudCk7Ci0gICAgICAgICAgICAJCQotCQkJY29sb3JBbmRGb250Q29sbGVjdG9yLnNldFVzZWREZWNvcmF0b3JzKCk7Ci0JCQkKLQkJCWlmKHVwZGF0ZUxhYmVsLmhhc05ld0JhY2tncm91bmQoKSkKLQkJCQljb2xvckFuZEZvbnRDb2xsZWN0b3Iuc2V0QmFja2dyb3VuZCh1cGRhdGVMYWJlbC5nZXRCYWNrZ3JvdW5kKCkpOwotCQkJCi0JCQlpZih1cGRhdGVMYWJlbC5oYXNOZXdGb3JlZ3JvdW5kKCkpCi0JCQkJY29sb3JBbmRGb250Q29sbGVjdG9yLnNldEZvcmVncm91bmQodXBkYXRlTGFiZWwuZ2V0Rm9yZWdyb3VuZCgpKTsKLQkJCQotCQkJaWYodXBkYXRlTGFiZWwuaGFzTmV3Rm9udCgpKQotCQkJCWNvbG9yQW5kRm9udENvbGxlY3Rvci5zZXRGb250KHVwZGF0ZUxhYmVsLmdldEZvbnQoKSk7Ci0JCi0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGEgbGFiZWwgdXAgZm9yIHRoZSBlbGVtZW50IHVzaW5nIHRoZSBzdXBwbGllZCBsYWJlbCBwcm92aWRlci4KLQkgKiBAcGFyYW0gdXBkYXRlTGFiZWwgVGhlIFZpZXdlckxhYmVsIHRvIGNvbGxlY3QgdGhlIHJlc3VsdCBpbgotCSAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IGJlaW5nIGRlY29yYXRlZC4KLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBJTGFiZWxQcm92aWRlciB0aGUgbGFiZWxQcm92aWRlciBmb3IgdGhlIHJlY2VpdmVyLgotCSAqLwotCXZvaWQgYnVpbGRMYWJlbChWaWV3ZXJMYWJlbCB1cGRhdGVMYWJlbCwgT2JqZWN0IGVsZW1lbnQsSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcil7Ci0JCQl1cGRhdGVMYWJlbC5zZXRUZXh0KGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KSk7Ci0JCQl1cGRhdGVMYWJlbC5zZXRJbWFnZShsYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIENvbG9yQW5kRm9udENvbGxlY3RvciBmb3IgdGhlIHJlY2VpdmVyLgotCSAqIEByZXR1cm4gQ29sb3JBbmRGb250Q29sbGVjdG9yIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3JBbmRGb250Q29sbGVjdG9yIGdldENvbG9yQW5kRm9udENvbGxlY3RvcigpIHsKLQkJcmV0dXJuIGNvbG9yQW5kRm9udENvbGxlY3RvcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVGFibGVFZGl0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1RhYmxlRWRpdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2M3NjdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVGFibGVFZGl0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotCi0vKioKLSAqIEludGVybmFsIHRhYmxlIHZpZXdlciBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0vKiBwYWNrYWdlICovYWJzdHJhY3QgY2xhc3MgVGFibGVFZGl0b3JJbXBsIHsKLQotICAgIHByaXZhdGUgQ2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0gICAgcHJpdmF0ZSBDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnM7Ci0KLSAgICBwcml2YXRlIElDZWxsTW9kaWZpZXIgY2VsbE1vZGlmaWVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzOwotCi0gICAgcHJpdmF0ZSBJdGVtIHRhYmxlSXRlbTsKLQotICAgIHByaXZhdGUgaW50IGNvbHVtbk51bWJlcjsKLQotICAgIHByaXZhdGUgSUNlbGxFZGl0b3JMaXN0ZW5lciBjZWxsRWRpdG9yTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIEZvY3VzTGlzdGVuZXIgZm9jdXNMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgTW91c2VMaXN0ZW5lciBtb3VzZUxpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBpbnQgZG91YmxlQ2xpY2tFeHBpcmF0aW9uVGltZTsKLQotICAgIHByaXZhdGUgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXI7Ci0KLSAgICBUYWJsZUVkaXRvckltcGwoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLSAgICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICAgIGluaXRDZWxsRWRpdG9yTGlzdGVuZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgPGNvZGU+VGFibGVWaWV3ZXJJbXBsPC9jb2RlPiB2aWV3ZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2aWV3ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RydWN0dXJlZFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0gICAgICAgIHJldHVybiB2aWV3ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFjdGl2YXRlQ2VsbEVkaXRvcigpIHsKLSAgICAgICAgaWYgKGNlbGxFZGl0b3JzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjZWxsRWRpdG9yc1tjb2x1bW5OdW1iZXJdICE9IG51bGwgJiYgY2VsbE1vZGlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IHRhYmxlSXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gY29sdW1uUHJvcGVydGllc1tjb2x1bW5OdW1iZXJdOwotICAgICAgICAgICAgICAgIGlmIChjZWxsTW9kaWZpZXIuY2FuTW9kaWZ5KGVsZW1lbnQsIHByb3BlcnR5KSkgewotICAgICAgICAgICAgICAgICAgICBjZWxsRWRpdG9yID0gY2VsbEVkaXRvcnNbY29sdW1uTnVtYmVyXTsKLSAgICAgICAgICAgICAgICAgICAgLy90YWJsZS5zaG93U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNlbGxFZGl0b3IuYWRkTGlzdGVuZXIoY2VsbEVkaXRvckxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY2VsbE1vZGlmaWVyLmdldFZhbHVlKGVsZW1lbnQsIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICAgICAgY2VsbEVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRyaWNreSBmbG93IG9mIGNvbnRyb2wgaGVyZToKLSAgICAgICAgICAgICAgICAgICAgLy8gYWN0aXZhdGUoKSBjYW4gdHJpZ2dlciBjYWxsYmFjayB0byBjZWxsRWRpdG9yTGlzdGVuZXIgd2hpY2ggd2lsbCBjbGVhciBjZWxsRWRpdG9yCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIG11c3QgZ2V0IGNvbnRyb2wgZmlyc3QsIGJ1dCBtdXN0IHN0aWxsIGNhbGwgYWN0aXZhdGUoKSBldmVuIGlmIHRoZXJlIGlzIG5vIGNvbnRyb2wuCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRyb2wgY29udHJvbCA9IGNlbGxFZGl0b3IuZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgICAgICAgICBjZWxsRWRpdG9yLmFjdGl2YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIHNldExheW91dERhdGEoY2VsbEVkaXRvci5nZXRMYXlvdXREYXRhKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3IoY29udHJvbCwgdGFibGVJdGVtLCBjb2x1bW5OdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICBjZWxsRWRpdG9yLnNldEZvY3VzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c0xpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzTGlzdGVuZXIgPSBuZXcgRm9jdXNBZGFwdGVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlFZGl0b3JWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29udHJvbC5hZGRGb2N1c0xpc3RlbmVyKGZvY3VzTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICBtb3VzZUxpc3RlbmVyID0gbmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lIHdyYXA/CQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBleHBpcmF0aW9uIG9mIGRvdWJsZUNsaWNrVGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnRpbWUgPD0gZG91YmxlQ2xpY2tFeHBpcmF0aW9uVGltZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnJlbW92ZU1vdXNlTGlzdGVuZXIobW91c2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbEVkaXRpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG91YmxlQ2xpY2tFdmVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW91c2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucmVtb3ZlTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuYWRkTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY3RpdmF0ZSBhIGNlbGwgZWRpdG9yIGZvciB0aGUgZ2l2ZW4gbW91c2UgcG9zaXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFjdGl2YXRlQ2VsbEVkaXRvcihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmICh0YWJsZUl0ZW0gPT0gbnVsbCB8fCB0YWJsZUl0ZW0uaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAvL2l0ZW0gbm8gbG9uZ2VyIGV4aXN0cwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBjb2x1bW5Ub0VkaXQ7Ci0gICAgICAgIGludCBjb2x1bW5zID0gZ2V0Q29sdW1uQ291bnQoKTsKLSAgICAgICAgaWYgKGNvbHVtbnMgPT0gMCkgewotICAgICAgICAgICAgLy8gSWYgbm8gVGFibGVDb2x1bW4sIFRhYmxlIGFjdHMgYXMgaWYgaXQgaGFzIGEgc2luZ2xlIGNvbHVtbgotICAgICAgICAgICAgLy8gd2hpY2ggdGFrZXMgdGhlIHdob2xlIHdpZHRoLgotICAgICAgICAgICAgY29sdW1uVG9FZGl0ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbHVtblRvRWRpdCA9IC0xOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zOyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gZ2V0Qm91bmRzKHRhYmxlSXRlbSwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJvdW5kcy5jb250YWlucyhldmVudC54LCBldmVudC55KSkgewotICAgICAgICAgICAgICAgICAgICBjb2x1bW5Ub0VkaXQgPSBpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29sdW1uVG9FZGl0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29sdW1uTnVtYmVyID0gY29sdW1uVG9FZGl0OwotICAgICAgICBhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWFjdGl2YXRlcyB0aGUgY3VycmVudGx5IGFjdGl2ZSBjZWxsIGVkaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBseUVkaXRvclZhbHVlKCkgewotICAgICAgICBDZWxsRWRpdG9yIGMgPSB0aGlzLmNlbGxFZGl0b3I7Ci0gICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG51bGwgb3V0IGNlbGwgZWRpdG9yIGJlZm9yZSBjYWxsaW5nIHNhdmUKLSAgICAgICAgICAgIC8vIGluIGNhc2Ugc2F2ZSByZXN1bHRzIGluIGFwcGx5RWRpdG9yVmFsdWUgYmVpbmcgcmUtZW50ZXJlZAotICAgICAgICAgICAgLy8gc2VlIDFHQUhJOFo6IElUUFVJOkFMTCAtIEhvdyB0byBjb2RlIGV2ZW50IG5vdGlmaWNhdGlvbiB3aGVuIHVzaW5nIGNlbGwgZWRpdG9yID8KLSAgICAgICAgICAgIHRoaXMuY2VsbEVkaXRvciA9IG51bGw7Ci0gICAgICAgICAgICBJdGVtIHQgPSB0aGlzLnRhYmxlSXRlbTsKLSAgICAgICAgICAgIC8vIGRvbid0IG51bGwgb3V0IHRhYmxlIGl0ZW0gLS0gc2FtZSBpdGVtIGlzIHN0aWxsIHNlbGVjdGVkCi0gICAgICAgICAgICBpZiAodCAhPSBudWxsICYmICF0LmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgIHNhdmVFZGl0b3JWYWx1ZShjLCB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEVkaXRvcihudWxsLCBudWxsLCAwKTsKLSAgICAgICAgICAgIGMucmVtb3ZlTGlzdGVuZXIoY2VsbEVkaXRvckxpc3RlbmVyKTsKLSAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCA9IGMuZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChtb3VzZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbC5yZW1vdmVNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZm9jdXNMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucmVtb3ZlRm9jdXNMaXN0ZW5lcihmb2N1c0xpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbmNlbHMgdGhlIGFjdGl2ZSBjZWxsIGVkaXRvciwgd2l0aG91dCBzYXZpbmcgdGhlIHZhbHVlIAotICAgICAqIGJhY2sgdG8gdGhlIGRvbWFpbiBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxFZGl0aW5nKCkgewotICAgICAgICBpZiAoY2VsbEVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRFZGl0b3IobnVsbCwgbnVsbCwgMCk7Ci0gICAgICAgICAgICBjZWxsRWRpdG9yLnJlbW92ZUxpc3RlbmVyKGNlbGxFZGl0b3JMaXN0ZW5lcik7Ci0gICAgICAgICAgICBDZWxsRWRpdG9yIG9sZEVkaXRvciA9IGNlbGxFZGl0b3I7Ci0gICAgICAgICAgICBjZWxsRWRpdG9yID0gbnVsbDsKLSAgICAgICAgICAgIG9sZEVkaXRvci5kZWFjdGl2YXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBlZGl0aW5nIHRoZSBnaXZlbiBlbGVtZW50LiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAKLSAgICAgKiBAcGFyYW0gY29sdW1uIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVkaXRFbGVtZW50KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uKSB7Ci0gICAgICAgIGlmIChjZWxsRWRpdG9yICE9IG51bGwpCi0gICAgICAgICAgICBhcHBseUVkaXRvclZhbHVlKCk7Ci0KLSAgICAgICAgc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVsZW1lbnQpLCB0cnVlKTsKLSAgICAgICAgSXRlbVtdIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCAhPSAxKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRhYmxlSXRlbSA9IHNlbGVjdGlvblswXTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgc2VsZWN0aW9uIGlzIHZpc2libGUKLSAgICAgICAgc2hvd1NlbGVjdGlvbigpOwotICAgICAgICBjb2x1bW5OdW1iZXIgPSBjb2x1bW47Ci0gICAgICAgIGFjdGl2YXRlQ2VsbEVkaXRvcigpOwotCi0gICAgfQotCi0gICAgYWJzdHJhY3QgUmVjdGFuZ2xlIGdldEJvdW5kcyhJdGVtIGl0ZW0sIGludCBjb2x1bW5OdW1iZXIpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBhcnJheSBvZiBDZWxsRWRpdG9ycyB1c2VkIGluIHRoZSB2aWV3ZXIKLSAgICAgKiBAcmV0dXJuIHRoZSBjZWxsIGVkaXRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2VsbEVkaXRvcltdIGdldENlbGxFZGl0b3JzKCkgewotICAgICAgICByZXR1cm4gY2VsbEVkaXRvcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjZWxsIG1vZGlmaWVyCi0gICAgICogQHJldHVybiB0aGUgY2VsbCBtb2RpZmllcgotICAgICAqLwotICAgIHB1YmxpYyBJQ2VsbE1vZGlmaWVyIGdldENlbGxNb2RpZmllcigpIHsKLSAgICAgICAgcmV0dXJuIGNlbGxNb2RpZmllcjsKLSAgICB9Ci0KLSAgICBhYnN0cmFjdCBpbnQgZ2V0Q29sdW1uQ291bnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcHJvcGVydGllcyBmb3IgdGhlIGNvbHVtbgotICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGNvbHVtbiBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldENvbHVtblByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5Qcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIGFic3RyYWN0IEl0ZW1bXSBnZXRTZWxlY3Rpb24oKTsKLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgdGhlIG1vdXNlIGRvd24gZXZlbnQ7IGFjdGl2YXRlcyB0aGUgY2VsbCBlZGl0b3IuCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCB0aGF0IHNob3VsZCBiZSBoYW5kbGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlTW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChjZWxsRWRpdG9yICE9IG51bGwpCi0gICAgICAgICAgICBhcHBseUVkaXRvclZhbHVlKCk7Ci0KLSAgICAgICAgLy8gYWN0aXZhdGUgdGhlIGNlbGwgZWRpdG9yIGltbWVkaWF0ZWx5LiAgSWYgYSBzZWNvbmQgbW91c2VEb3duCi0gICAgICAgIC8vIGlzIHJlY2VpdmVkIHByaW9yIHRvIHRoZSBleHBpcmF0aW9uIG9mIHRoZSBkb3VibGVDbGljayB0aW1lIHRoZW4KLSAgICAgICAgLy8gdGhlIGNlbGwgZWRpdG9yIHdpbGwgYmUgZGVhY3RpdmF0ZWQgYW5kIGEgZG91YmxlQ2xpY2sgZXZlbnQgd2lsbAotICAgICAgICAvLyBiZSBwcm9jZXNzZWQuCi0gICAgICAgIC8vCi0gICAgICAgIGRvdWJsZUNsaWNrRXhwaXJhdGlvblRpbWUgPSBldmVudC50aW1lCi0gICAgICAgICAgICAgICAgKyBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXREb3VibGVDbGlja1RpbWUoKTsKLQotICAgICAgICBJdGVtW10gaXRlbXMgPSBnZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgLy8gRG8gbm90IGVkaXQgaWYgbW9yZSB0aGFuIG9uZSByb3cgaXMgc2VsZWN0ZWQuCi0gICAgICAgIGlmIChpdGVtcy5sZW5ndGggIT0gMSkgewotICAgICAgICAgICAgdGFibGVJdGVtID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0YWJsZUl0ZW0gPSBpdGVtc1swXTsKLSAgICAgICAgYWN0aXZhdGVDZWxsRWRpdG9yKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdENlbGxFZGl0b3JMaXN0ZW5lcigpIHsKLSAgICAgICAgY2VsbEVkaXRvckxpc3RlbmVyID0gbmV3IElDZWxsRWRpdG9yTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBlZGl0b3JWYWx1ZUNoYW5nZWQoYm9vbGVhbiBvbGRWYWxpZFN0YXRlLAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbGlkU3RhdGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUuCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbEVkaXRvcigpIHsKLSAgICAgICAgICAgICAgICBUYWJsZUVkaXRvckltcGwudGhpcy5jYW5jZWxFZGl0aW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5RWRpdG9yVmFsdWUoKSB7Ci0gICAgICAgICAgICAgICAgVGFibGVFZGl0b3JJbXBsLnRoaXMuYXBwbHlFZGl0b3JWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGlzIGFuIGFjdGl2ZSBjZWxsIGVkaXRvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBjZWxsIGVkaXRvcjsgb3RoZXJ3aXNlCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2VsbEVkaXRvckFjdGl2ZSgpIHsKLSAgICAgICAgcmV0dXJuIGNlbGxFZGl0b3IgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBlZGl0b3IsCi0gICAgICogYnkgZGVsZWdhdGluZyB0byB0aGUgY2VsbCBtb2RpZmllci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2F2ZUVkaXRvclZhbHVlKENlbGxFZGl0b3IgY2VsbEVkaXRvciwgSXRlbSB0YWJsZUl0ZW0pIHsKLSAgICAgICAgaWYgKGNlbGxNb2RpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWNlbGxFZGl0b3IuaXNWYWx1ZVZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICAvLy9EbyB3aGF0ID8/PwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChjb2x1bW5Qcm9wZXJ0aWVzICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgY29sdW1uTnVtYmVyIDwgY29sdW1uUHJvcGVydGllcy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgPSBjb2x1bW5Qcm9wZXJ0aWVzW2NvbHVtbk51bWJlcl07Ci0gICAgICAgICAgICBjZWxsTW9kaWZpZXIubW9kaWZ5KHRhYmxlSXRlbSwgcHJvcGVydHksIGNlbGxFZGl0b3IuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNlbGwgZWRpdG9ycwotICAgICAqIEBwYXJhbSBlZGl0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2VsbEVkaXRvcnMoQ2VsbEVkaXRvcltdIGVkaXRvcnMpIHsKLSAgICAgICAgdGhpcy5jZWxsRWRpdG9ycyA9IGVkaXRvcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjZWxsIG1vZGlmaWVyCi0gICAgICogQHBhcmFtIG1vZGlmaWVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2VsbE1vZGlmaWVyKElDZWxsTW9kaWZpZXIgbW9kaWZpZXIpIHsKLSAgICAgICAgdGhpcy5jZWxsTW9kaWZpZXIgPSBtb2RpZmllcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNvbHVtbiBwcm9wZXJ0aWVzCi0gICAgICogQHBhcmFtIGNvbHVtblByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5Qcm9wZXJ0aWVzKFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMpIHsKLSAgICAgICAgdGhpcy5jb2x1bW5Qcm9wZXJ0aWVzID0gY29sdW1uUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBhYnN0cmFjdCB2b2lkIHNldEVkaXRvcihDb250cm9sIHcsIEl0ZW0gaXRlbSwgaW50IGZDb2x1bW5OdW1iZXIpOwotCi0gICAgYWJzdHJhY3Qgdm9pZCBzZXRMYXlvdXREYXRhKENlbGxFZGl0b3IuTGF5b3V0RGF0YSBsYXlvdXREYXRhKTsKLQotICAgIGFic3RyYWN0IHZvaWQgc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGIpOwotCi0gICAgYWJzdHJhY3Qgdm9pZCBzaG93U2VsZWN0aW9uKCk7Ci0KLSAgICBhYnN0cmFjdCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrRXZlbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVGFibGVMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVGFibGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1N2Y2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1RhYmxlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLQotLyoqCi0gKiBBIGxheW91dCBmb3IgYSB0YWJsZS4gQ2FsbCA8Y29kZT5hZGRDb2x1bW5EYXRhPC9jb2RlPiB0byBhZGQgY29sdW1ucy4KLSAqLwotcHVibGljIGNsYXNzIFRhYmxlTGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgZXh0cmEgcGl4ZWxzIHRha2VuIGFzIGhvcml6b250YWwgdHJpbSBieSB0aGUgdGFibGUgY29sdW1uLgotCSAqIFRvIGVuc3VyZSB0aGVyZSBhcmUgTiBwaXhlbHMgYXZhaWxhYmxlIGZvciB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uLAotCSAqIGFzc2lnbiBOK0NPTFVNTl9UUklNIGZvciB0aGUgY29sdW1uIHdpZHRoLgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgQ09MVU1OX1RSSU0gPSAiY2FyYm9uIi5lcXVhbHMoU1dULmdldFBsYXRmb3JtKCkpID8gMjQgOiAzOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgbGlzdCBvZiBjb2x1bW4gbGF5b3V0IGRhdGEgKGVsZW1lbnQgdHlwZToKLQkgKiA8Y29kZT5Db2x1bW5MYXlvdXREYXRhPC9jb2RlPikuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciA8Y29kZT5sYXlvdXQ8L2NvZGU+IGhhcyB5ZXQgdG8gYmUgY2FsbGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmaXJzdFRpbWUgPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0YWJsZSBsYXlvdXQuCi0JICovCi0JcHVibGljIFRhYmxlTGF5b3V0KCkgewotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgY29sdW1uIG9mIGRhdGEgdG8gdGhpcyB0YWJsZSBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gbGF5b3V0IGRhdGEKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW5EYXRhKENvbHVtbkxheW91dERhdGEgZGF0YSkgewotCQljb2x1bW5zLmFkZChkYXRhKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIExheW91dC4KLQkgKi8KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGMsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoKSB7Ci0JCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCAmJiBoSGludCAhPSBTV1QuREVGQVVMVCkKLQkJCXJldHVybiBuZXcgUG9pbnQod0hpbnQsIGhIaW50KTsKLQotCQlUYWJsZSB0YWJsZSA9IChUYWJsZSkgYzsKLQkJLy8gVG8gYXZvaWQgcmVjdXJzaW9ucy4KLQkJdGFibGUuc2V0TGF5b3V0KG51bGwpOwotCQkvLyBVc2UgbmF0aXZlIGxheW91dCBhbGdvcml0aG0KLQkJUG9pbnQgcmVzdWx0ID0gdGFibGUuY29tcHV0ZVNpemUod0hpbnQsIGhIaW50LCBmbHVzaCk7Ci0JCXRhYmxlLnNldExheW91dCh0aGlzKTsKLQotCQlpbnQgd2lkdGggPSAwOwotCQlpbnQgc2l6ZSA9IGNvbHVtbnMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJQ29sdW1uTGF5b3V0RGF0YSBsYXlvdXREYXRhID0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGxheW91dERhdGEgaW5zdGFuY2VvZiBDb2x1bW5QaXhlbERhdGEpIHsKLQkJCQlDb2x1bW5QaXhlbERhdGEgY29sID0gKENvbHVtblBpeGVsRGF0YSkgbGF5b3V0RGF0YTsKLQkJCQl3aWR0aCArPSBjb2wud2lkdGg7Ci0JCQkJaWYgKGNvbC5hZGRUcmltKSB7Ci0JCQkJCXdpZHRoICs9IENPTFVNTl9UUklNOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAobGF5b3V0RGF0YSBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQlDb2x1bW5XZWlnaHREYXRhIGNvbCA9IChDb2x1bW5XZWlnaHREYXRhKSBsYXlvdXREYXRhOwotCQkJCXdpZHRoICs9IGNvbC5taW5pbXVtV2lkdGg7Ci0JCQl9IGVsc2UgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGNvbHVtbiBsYXlvdXQgZGF0YSIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlpZiAod2lkdGggPiByZXN1bHQueCkKLQkJCXJlc3VsdC54ID0gd2lkdGg7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBMYXlvdXQuCi0JICovCi0JcHVibGljIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjLCBib29sZWFuIGZsdXNoKSB7Ci0JCS8vIE9ubHkgZG8gaW5pdGlhbCBsYXlvdXQuIFRyeWluZyB0byBtYWludGFpbiBwcm9wb3J0aW9ucyB3aGVuIHJlc2l6aW5nCi0JCS8vIGlzIHRvbyBoYXJkLAotCQkvLyBjYXVzZXMgbG90cyBvZiB3aWRnZXQgZmxpY2tlciwgY2F1c2VzIHNjcm9sbCBiYXJzIHRvIGFwcGVhciBhbmQKLQkJLy8gb2NjYXNpb25hbGx5IHN0aWNrIGFyb3VuZCAob24gV2luZG93cyksCi0JCS8vIHJlcXVpcmVzIGhvb2tpbmcgY29sdW1uIHJlc2l6aW5nIGFzIHdlbGwsIGFuZCBtYXkgbm90IGJlIHdoYXQgdGhlCi0JCS8vIHVzZXIgd2FudHMgYW55d2F5LgotCQlpZiAoIWZpcnN0VGltZSkKLQkJCXJldHVybjsKLQotCQlpbnQgd2lkdGggPSBjLmdldENsaWVudEFyZWEoKS53aWR0aDsKLQotCQkvLyBYWFg6IExheW91dCBpcyBiZWluZyBjYWxsZWQgd2l0aCBhbiBpbnZhbGlkIHZhbHVlIHRoZSBmaXJzdCB0aW1lCi0JCS8vIGl0IGlzIGJlaW5nIGNhbGxlZCBvbiBMaW51eC4gVGhpcyBtZXRob2QgcmVzZXRzIHRoZQotCQkvLyBMYXlvdXQgdG8gbnVsbCBzbyB3ZSBtYWtlIHN1cmUgd2UgcnVuIGl0IG9ubHkgd2hlbgotCQkvLyB0aGUgdmFsdWUgaXMgT0suCi0JCWlmICh3aWR0aCA8PSAxKQotCQkJcmV0dXJuOwotCi0JCUl0ZW1bXSB0YWJsZUNvbHVtbnMgPSBnZXRDb2x1bW5zKGMpOwotCQlpbnQgc2l6ZSA9IE1hdGgubWluKGNvbHVtbnMuc2l6ZSgpLCB0YWJsZUNvbHVtbnMubGVuZ3RoKTsKLQkJaW50W10gd2lkdGhzID0gbmV3IGludFtzaXplXTsKLQkJaW50IGZpeGVkV2lkdGggPSAwOwotCQlpbnQgbnVtYmVyT2ZXZWlnaHRDb2x1bW5zID0gMDsKLQkJaW50IHRvdGFsV2VpZ2h0ID0gMDsKLQotCQkvLyBGaXJzdCBjYWxjIHNwYWNlIG9jY3VwaWVkIGJ5IGZpeGVkIGNvbHVtbnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUNvbHVtbkxheW91dERhdGEgY29sID0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtblBpeGVsRGF0YSkgewotCQkJCUNvbHVtblBpeGVsRGF0YSBjcGQgPSAoQ29sdW1uUGl4ZWxEYXRhKSBjb2w7Ci0JCQkJaW50IHBpeGVscyA9IGNwZC53aWR0aDsKLQkJCQlpZiAoY3BkLmFkZFRyaW0pIHsKLQkJCQkJcGl4ZWxzICs9IENPTFVNTl9UUklNOwotCQkJCX0KLQkJCQl3aWR0aHNbaV0gPSBwaXhlbHM7Ci0JCQkJZml4ZWRXaWR0aCArPSBwaXhlbHM7Ci0JCQl9IGVsc2UgaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQlDb2x1bW5XZWlnaHREYXRhIGN3ID0gKENvbHVtbldlaWdodERhdGEpIGNvbDsKLQkJCQludW1iZXJPZldlaWdodENvbHVtbnMrKzsKLQkJCQkvLyBmaXJzdCB0aW1lLCB1c2UgdGhlIHdlaWdodCBzcGVjaWZpZWQgYnkgdGhlIGNvbHVtbiBkYXRhLAotCQkJCS8vIG90aGVyd2lzZSB1c2UgdGhlIGFjdHVhbCB3aWR0aCBhcyB0aGUgd2VpZ2h0Ci0JCQkJLy8gaW50IHdlaWdodCA9IGZpcnN0VGltZSA/IGN3LndlaWdodCA6Ci0JCQkJLy8gdGFibGVDb2x1bW5zW2ldLmdldFdpZHRoKCk7Ci0JCQkJaW50IHdlaWdodCA9IGN3LndlaWdodDsKLQkJCQl0b3RhbFdlaWdodCArPSB3ZWlnaHQ7Ci0JCQl9IGVsc2UgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGNvbHVtbiBsYXlvdXQgZGF0YSIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8vIERvIHdlIGhhdmUgY29sdW1ucyB0aGF0IGhhdmUgYSB3ZWlnaHQKLQkJaWYgKG51bWJlck9mV2VpZ2h0Q29sdW1ucyA+IDApIHsKLQkJCS8vIE5vdyBkaXN0cmlidXRlIHRoZSByZXN0IHRvIHRoZSBjb2x1bW5zIHdpdGggd2VpZ2h0LgotCQkJaW50IHJlc3QgPSB3aWR0aCAtIGZpeGVkV2lkdGg7Ci0JCQlpbnQgdG90YWxEaXN0cmlidXRlZCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJCUNvbHVtbkxheW91dERhdGEgY29sID0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwotCQkJCWlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJCUNvbHVtbldlaWdodERhdGEgY3cgPSAoQ29sdW1uV2VpZ2h0RGF0YSkgY29sOwotCQkJCQkvLyBjYWxjdWxhdGUgd2VpZ2h0IGFzIGFib3ZlCi0JCQkJCS8vIGludCB3ZWlnaHQgPSBmaXJzdFRpbWUgPyBjdy53ZWlnaHQgOgotCQkJCQkvLyB0YWJsZUNvbHVtbnNbaV0uZ2V0V2lkdGgoKTsKLQkJCQkJaW50IHdlaWdodCA9IGN3LndlaWdodDsKLQkJCQkJaW50IHBpeGVscyA9IHRvdGFsV2VpZ2h0ID09IDAgPyAwIDogd2VpZ2h0ICogcmVzdAotCQkJCQkJCS8gdG90YWxXZWlnaHQ7Ci0JCQkJCWlmIChwaXhlbHMgPCBjdy5taW5pbXVtV2lkdGgpCi0JCQkJCQlwaXhlbHMgPSBjdy5taW5pbXVtV2lkdGg7Ci0JCQkJCXRvdGFsRGlzdHJpYnV0ZWQgKz0gcGl4ZWxzOwotCQkJCQl3aWR0aHNbaV0gPSBwaXhlbHM7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBEaXN0cmlidXRlIGFueSByZW1haW5pbmcgcGl4ZWxzIHRvIGNvbHVtbnMgd2l0aCB3ZWlnaHQuCi0JCQlpbnQgZGlmZiA9IHJlc3QgLSB0b3RhbERpc3RyaWJ1dGVkOwotCQkJZm9yIChpbnQgaSA9IDA7IGRpZmYgPiAwOyArK2kpIHsKLQkJCQlpZiAoaSA9PSBzaXplKQotCQkJCQlpID0gMDsKLQkJCQlDb2x1bW5MYXlvdXREYXRhIGNvbCA9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCQkrK3dpZHRoc1tpXTsKLQkJCQkJLS1kaWZmOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZpcnN0VGltZSA9IGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzZXRXaWR0aCh0YWJsZUNvbHVtbnNbaV0sIHdpZHRoc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHdpZHRoIG9mIHRoZSBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBpdGVtCi0JICogQHBhcmFtIHdpZHRoCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFdpZHRoKEl0ZW0gaXRlbSwgaW50IHdpZHRoKSB7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgVHJlZUNvbHVtbikKLQkJCSgoVHJlZUNvbHVtbikgaXRlbSkuc2V0V2lkdGgod2lkdGgpOwotCQllbHNlCi0JCQkoKFRhYmxlQ29sdW1uKSBpdGVtKS5zZXRXaWR0aCh3aWR0aCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbnMgZm9yIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHJldHVybiBJdGVtW10KLQkgKi8KLQlwcml2YXRlIEl0ZW1bXSBnZXRDb2x1bW5zKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaWYgKGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFRyZWUpCi0JCQlyZXR1cm4gKChUcmVlKSBjb21wb3NpdGUpLmdldENvbHVtbnMoKTsKLQkJcmV0dXJuICgoVGFibGUpIGNvbXBvc2l0ZSkuZ2V0Q29sdW1ucygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVGFibGVUcmVlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1RhYmxlVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTU1ZmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVGFibGVUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBBIGNvbmNyZXRlIHZpZXdlciBiYXNlZCBvbiBhIFNXVCA8Y29kZT5UYWJsZVRyZWU8L2NvZGU+IGNvbnRyb2wuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSB0aGUgdmlld2VyIGZyYW1ld29yay4gCi0gKiBJdCBpcyBkZXNpZ25lZCB0byBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIHByZS1leGlzdGluZyBTV1QgdGFibGUgdHJlZSBjb250cm9sIGFuZCBjb25maWd1cmVkCi0gKiB3aXRoIGEgZG9tYWluLXNwZWNpZmljIGNvbnRlbnQgcHJvdmlkZXIsIGxhYmVsIHByb3ZpZGVyLCBlbGVtZW50IGZpbHRlciAob3B0aW9uYWwpLAotICogYW5kIGVsZW1lbnQgc29ydGVyIChvcHRpb25hbCkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENvbnRlbnQgcHJvdmlkZXJzIGZvciB0YWJsZSB0cmVlIHZpZXdlcnMgbXVzdCBpbXBsZW1lbnQgdGhlIDxjb2RlPklUcmVlQ29udGVudFByb3ZpZGVyPC9jb2RlPgotICogaW50ZXJmYWNlLgotICogPC9wPgotICogPHA+Ci0gKiBMYWJlbCBwcm92aWRlcnMgZm9yIHRhYmxlIHRyZWUgdmlld2VycyBtdXN0IGltcGxlbWVudCBlaXRoZXIgdGhlIDxjb2RlPklUYWJsZUxhYmVsUHJvdmlkZXI8L2NvZGU+Ci0gKiBvciB0aGUgPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+IGludGVyZmFjZSAoc2VlIDxjb2RlPlRhYmxlVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyPC9jb2RlPiAKLSAqIGZvciBtb3JlIGRldGFpbHMpLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVGFibGVUcmVlVmlld2VyIGV4dGVuZHMgQWJzdHJhY3RUcmVlVmlld2VyIHsKLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCB0YWJsZSB2aWV3ZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBUYWJsZUVkaXRvckltcGwgdGFibGVWaWV3ZXJJbXBsOwotCi0gICAgLyoqCi0gICAgICogVGhpcyB2aWV3ZXIncyB0YWJsZSB0cmVlIGNvbnRyb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUYWJsZVRyZWUgdGFibGVUcmVlOwotCi0gICAgLyoqCi0gICAgICogVGhpcyB2aWV3ZXIncyB0YWJsZSB0cmVlIGVkaXRvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRhYmxlVHJlZUVkaXRvciB0YWJsZVRyZWVFZGl0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBQcml2YXRlIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAqLwotICAgIGNsYXNzIFRhYmxlVHJlZVZpZXdlckltcGwgZXh0ZW5kcyBUYWJsZUVkaXRvckltcGwgewotICAgICAgICBwdWJsaWMgVGFibGVUcmVlVmlld2VySW1wbChUYWJsZVRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0gICAgICAgICAgICBzdXBlcih2aWV3ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVjdGFuZ2xlIGdldEJvdW5kcyhJdGVtIGl0ZW0sIGludCBjb2x1bW5OdW1iZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFRhYmxlVHJlZUl0ZW0pIGl0ZW0pLmdldEJvdW5kcyhjb2x1bW5OdW1iZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldENvbHVtbkNvdW50KCkgewotICAgICAgICAgICAgLy9nZXRDb2x1bW5Db3VudCgpIHNob3VsZCBiZSBhIEFQSSBpbiBUYWJsZVRyZWUuCi0gICAgICAgICAgICByZXR1cm4gZ2V0VGFibGVUcmVlKCkuZ2V0VGFibGUoKS5nZXRDb2x1bW5Db3VudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgSXRlbVtdIGdldFNlbGVjdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRUYWJsZVRyZWUoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0RWRpdG9yKENvbnRyb2wgdywgSXRlbSBpdGVtLCBpbnQgY29sdW1uTnVtYmVyKSB7Ci0gICAgICAgICAgICB0YWJsZVRyZWVFZGl0b3Iuc2V0RWRpdG9yKHcsIChUYWJsZVRyZWVJdGVtKSBpdGVtLCBjb2x1bW5OdW1iZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gYikgewotICAgICAgICAgICAgVGFibGVUcmVlVmlld2VyLnRoaXMuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgYik7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0gICAgICAgICAgICBnZXRUYWJsZVRyZWUoKS5zaG93U2VsZWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldExheW91dERhdGEoQ2VsbEVkaXRvci5MYXlvdXREYXRhIGxheW91dERhdGEpIHsKLSAgICAgICAgICAgIHRhYmxlVHJlZUVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gbGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50OwotICAgICAgICAgICAgdGFibGVUcmVlRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gbGF5b3V0RGF0YS5ncmFiSG9yaXpvbnRhbDsKLSAgICAgICAgICAgIHRhYmxlVHJlZUVkaXRvci5taW5pbXVtV2lkdGggPSBsYXlvdXREYXRhLm1pbmltdW1XaWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2tFdmVudCgpIHsKLSAgICAgICAgICAgIFZpZXdlciB2aWV3ZXIgPSBnZXRWaWV3ZXIoKTsKLSAgICAgICAgICAgIGZpcmVEb3VibGVDbGljayhuZXcgRG91YmxlQ2xpY2tFdmVudCh2aWV3ZXIsIHZpZXdlci5nZXRTZWxlY3Rpb24oKSkpOwotICAgICAgICAgICAgZmlyZU9wZW4obmV3IE9wZW5FdmVudCh2aWV3ZXIsIHZpZXdlci5nZXRTZWxlY3Rpb24oKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHRhYmxlIHRyZWUgdmlld2VyIG9uIHRoZSBnaXZlbiB0YWJsZSB0cmVlIGNvbnRyb2wuCi0gICAgICogVGhlIHZpZXdlciBoYXMgbm8gaW5wdXQsIG5vIGNvbnRlbnQgcHJvdmlkZXIsIGEgZGVmYXVsdCBsYWJlbCBwcm92aWRlciwgCi0gICAgICogbm8gc29ydGVyLCBhbmQgbm8gZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0cmVlIHRoZSB0YWJsZSB0cmVlIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFibGVUcmVlVmlld2VyKFRhYmxlVHJlZSB0cmVlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRhYmxlVHJlZSA9IHRyZWU7Ci0gICAgICAgIGhvb2tDb250cm9sKHRyZWUpOwotICAgICAgICB0YWJsZVRyZWVFZGl0b3IgPSBuZXcgVGFibGVUcmVlRWRpdG9yKHRhYmxlVHJlZSk7Ci0gICAgICAgIHRhYmxlVmlld2VySW1wbCA9IG5ldyBUYWJsZVRyZWVWaWV3ZXJJbXBsKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0YWJsZSB0cmVlIHZpZXdlciBvbiBhIG5ld2x5LWNyZWF0ZWQgdGFibGUgdHJlZSBjb250cm9sIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQuCi0gICAgICogVGhlIHRhYmxlIHRyZWUgY29udHJvbCBpcyBjcmVhdGVkIHVzaW5nIHRoZSBTV1Qgc3R5bGUgYml0cyA8Y29kZT5NVUxUSSwgSF9TQ1JPTEwsIFZfU0NST0xMLCBhbmQgQk9SREVSPC9jb2RlPi4KLSAgICAgKiBUaGUgdmlld2VyIGhhcyBubyBpbnB1dCwgbm8gY29udGVudCBwcm92aWRlciwgYSBkZWZhdWx0IGxhYmVsIHByb3ZpZGVyLCAKLSAgICAgKiBubyBzb3J0ZXIsIGFuZCBubyBmaWx0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFibGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0YWJsZSB0cmVlIHZpZXdlciBvbiBhIG5ld2x5LWNyZWF0ZWQgdGFibGUgdHJlZSBjb250cm9sIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQuCi0gICAgICogVGhlIHRhYmxlIHRyZWUgY29udHJvbCBpcyBjcmVhdGVkIHVzaW5nIHRoZSBnaXZlbiBTV1Qgc3R5bGUgYml0cy4KLSAgICAgKiBUaGUgdmlld2VyIGhhcyBubyBpbnB1dCwgbm8gY29udGVudCBwcm92aWRlciwgYSBkZWZhdWx0IGxhYmVsIHByb3ZpZGVyLCAKLSAgICAgKiBubyBzb3J0ZXIsIGFuZCBubyBmaWx0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIFNXVCBzdHlsZSBiaXRzCi0gICAgICovCi0gICAgcHVibGljIFRhYmxlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgdGhpcyhuZXcgVGFibGVUcmVlKHBhcmVudCwgc3R5bGUpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEFic3RyYWN0VHJlZVZpZXdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUcmVlTGlzdGVuZXIoQ29udHJvbCBjLCBUcmVlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgKChUYWJsZVRyZWUpIGMpLmFkZFRyZWVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBlZGl0b3IuIEFsbCBjaGFuZ2VzIGFscmVhZHkgZG9uZSBpbiB0aGUgY2VsbAotICAgICAqIGVkaXRvciBhcmUgbG9zdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxFZGl0aW5nKCkgewotICAgICAgICB0YWJsZVZpZXdlckltcGwuY2FuY2VsRWRpdGluZygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQWJzdHJhY3RUcmVlVmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvVXBkYXRlSXRlbShJdGVtIGl0ZW0sIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIC8vIHVwZGF0ZSBpY29uIGFuZCBsYWJlbAotICAgICAgICAvLyBTaW1pbGFyIGNvZGUgaW4gVGFibGVUcmVlVmlld2VyLmRvVXBkYXRlSXRlbSgpCi0gICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBwcm92ID0gZ2V0TGFiZWxQcm92aWRlcigpOwotICAgICAgICBJVGFibGVMYWJlbFByb3ZpZGVyIHRwcm92ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBpZiAocHJvdiBpbnN0YW5jZW9mIElUYWJsZUxhYmVsUHJvdmlkZXIpCi0gICAgICAgICAgICB0cHJvdiA9IChJVGFibGVMYWJlbFByb3ZpZGVyKSBwcm92OwotICAgICAgICAKLSAgICAgICAgaW50IGNvbHVtbkNvdW50ID0gdGFibGVUcmVlLmdldFRhYmxlKCkuZ2V0Q29sdW1uQ291bnQoKTsKLSAgICAgICAgVGFibGVUcmVlSXRlbSB0aSA9IChUYWJsZVRyZWVJdGVtKSBpdGVtOwotICAgICAgICAvLyBBbHNvIGVudGVyIGxvb3AgaWYgbm8gY29sdW1ucyBhZGRlZC4gIFNlZSAxRzlXV0daOiBKRlVJRjpXSU5OVCAtIFRhYmxlVmlld2VyIHdpdGggMCBjb2x1bW5zIGRvZXMgbm90IHdvcmsKLSAgICAgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgY29sdW1uQ291bnQgfHwgY29sdW1uID09IDA7IGNvbHVtbisrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9ICIiOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gbnVsbDsKLSAgICAgICAgICAgIGlmICh0cHJvdiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGV4dCA9IHRwcm92LmdldENvbHVtblRleHQoZWxlbWVudCwgY29sdW1uKTsKLSAgICAgICAgICAgICAgICBpbWFnZSA9IHRwcm92LmdldENvbHVtbkltYWdlKGVsZW1lbnQsIGNvbHVtbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjb2x1bW4gPT0gMCkgewotCQkJCQlWaWV3ZXJMYWJlbCB1cGRhdGVMYWJlbCA9IG5ldyBWaWV3ZXJMYWJlbChpdGVtCi0JCQkJCQkJLmdldFRleHQoKSwgaXRlbS5nZXRJbWFnZSgpKTsKLQkJCQkJYnVpbGRMYWJlbCh1cGRhdGVMYWJlbCxlbGVtZW50KTsKLQkJCQkJCi0JCQkJCS8vQXMgaXQgaXMgcG9zc2libGUgZm9yIHVzZXIgY29kZSB0byBydW4gdGhlIGV2ZW50IAotCQkgICAgICAgICAgICAvL2xvb3AgY2hlY2sgaGVyZS4KLQkJCQkJaWYgKGl0ZW0uaXNEaXNwb3NlZCgpKSB7Ci0JCSAgICAgICAgICAgICAgICB1bm1hcEVsZW1lbnQoZWxlbWVudCwgaXRlbSk7Ci0JCSAgICAgICAgICAgICAgICByZXR1cm47Ci0JCSAgICAgICAgICAgIH0gICAKLQkJCQkJCi0JCQkJCXRleHQgPSB1cGRhdGVMYWJlbC5nZXRUZXh0KCk7Ci0JCQkJCWltYWdlID0gdXBkYXRlTGFiZWwuZ2V0SW1hZ2UoKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vQXZvaWQgc2V0dGluZyB0ZXh0IHRvIG51bGwKLSAgICAgICAgICAgIGlmKHRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIAl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGkuc2V0VGV4dChjb2x1bW4sIHRleHQpOwotICAgICAgICAgICAgLy8gQXBwYXJlbnRseSBhIHByb2JsZW0gdG8gc2V0SW1hZ2UgdG8gbnVsbCBpZiBhbHJlYWR5IG51bGwKLSAgICAgICAgICAgIGlmICh0aS5nZXRJbWFnZShjb2x1bW4pICE9IGltYWdlKQotICAgICAgICAgICAgICAgIHRpLnNldEltYWdlKGNvbHVtbiwgaW1hZ2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBnZXRDb2xvckFuZEZvbnRDb2xsZWN0b3IoKS5zZXRGb250c0FuZENvbG9ycyhlbGVtZW50KTsKLSAgICAgICAgICAgIGdldENvbG9yQW5kRm9udENvbGxlY3RvcigpLmFwcGx5Rm9udHNBbmRDb2xvcnModGkpOwotICAgICAgICB9Ci0gICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgZWRpdGluZyB0aGUgZ2l2ZW4gZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICogQHBhcmFtIGNvbHVtbiB0aGUgY29sdW1uIG51bWJlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVkaXRFbGVtZW50KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uKSB7Ci0gICAgICAgIHRhYmxlVmlld2VySW1wbC5lZGl0RWxlbWVudChlbGVtZW50LCBjb2x1bW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNlbGwgZWRpdG9ycyBvZiB0aGlzIHZpZXdlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2VsbCBlZGl0b3JzCi0gICAgICovCi0gICAgcHVibGljIENlbGxFZGl0b3JbXSBnZXRDZWxsRWRpdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIHRhYmxlVmlld2VySW1wbC5nZXRDZWxsRWRpdG9ycygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNlbGwgbW9kaWZpZXIgb2YgdGhpcyB2aWV3ZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjZWxsIG1vZGlmaWVyCi0gICAgICovCi0gICAgcHVibGljIElDZWxsTW9kaWZpZXIgZ2V0Q2VsbE1vZGlmaWVyKCkgewotICAgICAgICByZXR1cm4gdGFibGVWaWV3ZXJJbXBsLmdldENlbGxNb2RpZmllcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQWJzdHJhY3RUcmVlVmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVtW10gZ2V0Q2hpbGRyZW4oV2lkZ2V0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYWJsZVRyZWVJdGVtKQotICAgICAgICAgICAgcmV0dXJuICgoVGFibGVUcmVlSXRlbSkgbykuZ2V0SXRlbXMoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYWJsZVRyZWUpCi0gICAgICAgICAgICByZXR1cm4gKChUYWJsZVRyZWUpIG8pLmdldEl0ZW1zKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgIAotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyI2dldENoaWxkKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCwgaW50KQotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVtIGdldENoaWxkIChXaWRnZXQgd2lkZ2V0LCBpbnQgaW5kZXgpIHsKLSAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJsZVRyZWVJdGVtKQotICAgICAgICByZXR1cm4gKChUYWJsZVRyZWVJdGVtKSB3aWRnZXQpLmdldEl0ZW0gKGluZGV4KTsKLSAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJsZVRyZWUpCi0gICAgICAgIHJldHVybiAoKFRhYmxlVHJlZSkgd2lkZ2V0KS5nZXRJdGVtIChpbmRleCk7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gcHJvcGVydGllcyBvZiB0aGlzIHZpZXdlci4KLSAgICAgKiBUaGUgcHJvcGVydGllcyBtdXN0IGNvcnJlc3BvbmQgd2l0aCB0aGUgY29sdW1ucyBvZiB0aGUgdGFibGUgY29udHJvbC4KLSAgICAgKiBUaGV5IGFyZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBjb2x1bW4gaW4gYSBjZWxsIG1vZGlmaWVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjb2x1bW4gcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDb2x1bW5Qcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gdGFibGVWaWV3ZXJJbXBsLmdldENvbHVtblByb3BlcnRpZXMoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFZpZXdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotICAgICAgICByZXR1cm4gdGFibGVUcmVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXggZnJvbSB0aGlzIHZpZXdlci4KLSAgICAgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgaW50ZXJuYWwgdG8gdGhlIGZyYW1ld29yay4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXgKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0gICAgICogICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgLy8gWFhYOiBXb3JrYXJvdW5kIGZvciAxR0JDU0IxOiBTV1Q6V0lOMjAwMCAtIFRhYmxlVHJlZSBzaG91bGQgaGF2ZSBnZXRJdGVtKGludCBpbmRleCkKLSAgICAgICAgVGFibGVUcmVlSXRlbSBpID0gdGFibGVUcmVlLmdldEl0ZW1zKClbaW5kZXhdOwotICAgICAgICBpZiAoaSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGkuZ2V0RGF0YSgpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEFic3RyYWN0VHJlZVZpZXdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFeHBhbmRlZChJdGVtIGl0ZW0pIHsKLSAgICAgICAgcmV0dXJuICgoVGFibGVUcmVlSXRlbSkgaXRlbSkuZ2V0RXhwYW5kZWQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFN0cnVjdHVyZWRWaWV3ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEl0ZW0gZ2V0SXRlbShpbnQgeCwgaW50IHkpIHsKLSAgICAgICAgLy8gWFhYOiBXb3JrYXJvdW5kIGZvciAxR0JDU0hHOiBTV1Q6V0lOMjAwMCAtIFRhYmxlVHJlZSBzaG91bGQgaGF2ZSBnZXRJdGVtKFBvaW50IHBvaW50KQotICAgICAgICByZXR1cm4gZ2V0VGFibGVUcmVlKCkuZ2V0VGFibGUoKS5nZXRJdGVtKAotICAgICAgICAgICAgICAgIGdldFRhYmxlVHJlZSgpLnRvQ29udHJvbChuZXcgUG9pbnQoeCwgeSkpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEFic3RyYWN0VHJlZVZpZXdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGdldEl0ZW1Db3VudChDb250cm9sIHdpZGdldCkgewotICAgICAgICByZXR1cm4gKChUYWJsZVRyZWUpIHdpZGdldCkuZ2V0SXRlbUNvdW50KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBYnN0cmFjdFRyZWVWaWV3ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRJdGVtQ291bnQoSXRlbSBpdGVtKSB7Ci0gICAgICAgIHJldHVybiAoKFRhYmxlVHJlZUl0ZW0pIGl0ZW0pLmdldEl0ZW1Db3VudCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQWJzdHJhY3RUcmVlVmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtW10gZ2V0SXRlbXMoCi0gICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtIGl0ZW0pIHsKLSAgICAgICAgcmV0dXJuICgoVGFibGVUcmVlSXRlbSkgaXRlbSkuZ2V0SXRlbXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGFibGUgdHJlZSB2aWV3ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5WaWV3ZXI8L2NvZGU+IGZyYW1ld29yawotICAgICAqIG1ldGhvZCByZXR1cm5zIHRoZSBsYWJlbCBwcm92aWRlciwgd2hpY2ggaW4gdGhlIGNhc2Ugb2YgdGFibGUgdHJlZQotICAgICAqIHZpZXdlcnMgd2lsbCBiZSBhbiBpbnN0YW5jZSBvZiBlaXRoZXIgPGNvZGU+SVRhYmxlTGFiZWxQcm92aWRlcjwvY29kZT4KLSAgICAgKiBvciA8Y29kZT5JTGFiZWxQcm92aWRlcjwvY29kZT4uCi0gICAgICogSWYgaXQgaXMgYW4gPGNvZGU+SVRhYmxlTGFiZWxQcm92aWRlcjwvY29kZT4sIHRoZW4gaXQgcHJvdmlkZXMgYQotICAgICAqIHNlcGFyYXRlIGxhYmVsIHRleHQgYW5kIGltYWdlIGZvciBlYWNoIGNvbHVtbi4gSWYgaXQgaXMgYW4gCi0gICAgICogPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+LCB0aGVuIGl0IHByb3ZpZGVzIG9ubHkgdGhlIGxhYmVsIHRleHQgCi0gICAgICogYW5kIGltYWdlIGZvciB0aGUgZmlyc3QgY29sdW1uLCBhbmQgYW55IHJlbWFpbmluZyBjb2x1bW5zIGFyZSBibGFuay4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUJhc2VMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBYnN0cmFjdFRyZWVWaWV3ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEl0ZW0gZ2V0UGFyZW50SXRlbShJdGVtIGl0ZW0pIHsKLSAgICAgICAgcmV0dXJuICgoVGFibGVUcmVlSXRlbSkgaXRlbSkuZ2V0UGFyZW50SXRlbSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQWJzdHJhY3RUcmVlVmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVtW10gZ2V0U2VsZWN0aW9uKENvbnRyb2wgd2lkZ2V0KSB7Ci0gICAgICAgIHJldHVybiAoKFRhYmxlVHJlZSkgd2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdGFibGUgdHJlZSB2aWV3ZXIncyB0YWJsZSB0cmVlIGNvbnRyb2wuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0YWJsZSB0cmVlIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFibGVUcmVlIGdldFRhYmxlVHJlZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhYmxlVHJlZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEFic3RyYWN0VHJlZVZpZXdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBob29rQ29udHJvbChDb250cm9sIGNvbnRyb2wpIHsKLSAgICAgICAgc3VwZXIuaG9va0NvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIHRhYmxlVHJlZS5nZXRUYWJsZSgpLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvKiBJZiB1c2VyIGNsaWNrZWQgb24gdGhlIFsrXSBvciBbLV0sIGRvIG5vdCBhY3RpdmF0ZSBDZWxsRWRpdG9yLiAqLwotICAgICAgICAgICAgICAgIC8vWFhYOiBUaGlzIGNvZGUgc2hvdWxkIG5vdCBiZSBoZXJlLiBTV1Qgc2hvdWxkIGVpdGhlciBoYXZlIHN1cHBvcnQgdG8gc2VlCi0gICAgICAgICAgICAgICAgLy9pZiB0aGUgdXNlciBjbGlja2VkIG9uIHRoZSBbK10vWy1dIG9yIG1hbmFnZSB0aGUgdGFibGUgZWRpdG9yIAotICAgICAgICAgICAgICAgIC8vYWN0aXZhdGlvbgotICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGVUcmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBpdGVtc1tpXS5nZXRJbWFnZUJvdW5kcygwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QuY29udGFpbnMoZS54LCBlLnkpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRhYmxlVmlld2VySW1wbC5oYW5kbGVNb3VzZURvd24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGVyZSBpcyBhbiBhY3RpdmUgY2VsbCBlZGl0b3IuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBjZWxsIGVkaXRvciwgYW5kIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2VsbEVkaXRvckFjdGl2ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhYmxlVmlld2VySW1wbC5pc0NlbGxFZGl0b3JBY3RpdmUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIGluIEFic3RyYWN0VHJlZVZpZXdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSXRlbSBuZXdJdGVtKFdpZGdldCBwYXJlbnQsIGludCBmbGFncywgaW50IGl4KSB7Ci0gICAgICAgIFRhYmxlVHJlZUl0ZW0gaXRlbTsKLSAgICAgICAgaWYgKGl4ID49IDApIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBUYWJsZVRyZWVJdGVtKQotICAgICAgICAgICAgICAgIGl0ZW0gPSBuZXcgVGFibGVUcmVlSXRlbSgoVGFibGVUcmVlSXRlbSkgcGFyZW50LCBmbGFncywgaXgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGl0ZW0gPSBuZXcgVGFibGVUcmVlSXRlbSgoVGFibGVUcmVlKSBwYXJlbnQsIGZsYWdzLCBpeCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVGFibGVUcmVlSXRlbSkKLSAgICAgICAgICAgICAgICBpdGVtID0gbmV3IFRhYmxlVHJlZUl0ZW0oKFRhYmxlVHJlZUl0ZW0pIHBhcmVudCwgZmxhZ3MpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGl0ZW0gPSBuZXcgVGFibGVUcmVlSXRlbSgoVGFibGVUcmVlKSBwYXJlbnQsIGZsYWdzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIGluIEFic3RyYWN0VHJlZVZpZXdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGwoQ29udHJvbCB3aWRnZXQpIHsKLSAgICAgICAgKChUYWJsZVRyZWUpIHdpZGdldCkucmVtb3ZlQWxsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2VsbCBlZGl0b3JzIG9mIHRoaXMgdGFibGUgdmlld2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIGVkaXRvcnMgdGhlIGxpc3Qgb2YgY2VsbCBlZGl0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2VsbEVkaXRvcnMoQ2VsbEVkaXRvcltdIGVkaXRvcnMpIHsKLSAgICAgICAgdGFibGVWaWV3ZXJJbXBsLnNldENlbGxFZGl0b3JzKGVkaXRvcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNlbGwgbW9kaWZpZXIgb2YgdGhpcyB0YWJsZSB2aWV3ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kaWZpZXIgdGhlIGNlbGwgbW9kaWZpZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDZWxsTW9kaWZpZXIoSUNlbGxNb2RpZmllciBtb2RpZmllcikgewotICAgICAgICB0YWJsZVZpZXdlckltcGwuc2V0Q2VsbE1vZGlmaWVyKG1vZGlmaWVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb2x1bW4gcHJvcGVydGllcyBvZiB0aGlzIHRhYmxlIHZpZXdlci4KLSAgICAgKiBUaGUgcHJvcGVydGllcyBtdXN0IGNvcnJlc3BvbmQgd2l0aCB0aGUgY29sdW1ucyBvZiB0aGUgdGFibGUgY29udHJvbC4KLSAgICAgKiBUaGV5IGFyZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBjb2x1bW4gaW4gYSBjZWxsIG1vZGlmaWVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtblByb3BlcnRpZXMgdGhlIGxpc3Qgb2YgY29sdW1uIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5Qcm9wZXJ0aWVzKFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMpIHsKLSAgICAgICAgdGFibGVWaWV3ZXJJbXBsLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBpbiBBYnN0cmFjdFRyZWVWaWV3ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RXhwYW5kZWQoSXRlbSBub2RlLCBib29sZWFuIGV4cGFuZCkgewotICAgICAgICAoKFRhYmxlVHJlZUl0ZW0pIG5vZGUpLnNldEV4cGFuZGVkKGV4cGFuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHRhYmxlIHRyZWUgdmlld2VyIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+Vmlld2VyPC9jb2RlPiBmcmFtZXdvcmsKLSAgICAgKiBtZXRob2QgZW5zdXJlcyB0aGF0IHRoZSBnaXZlbiBsYWJlbCBwcm92aWRlciBpcyBhbiBpbnN0YW5jZQotICAgICAqIG9mIGVpdGhlciA8Y29kZT5JVGFibGVMYWJlbFByb3ZpZGVyPC9jb2RlPiBvciA8Y29kZT5JTGFiZWxQcm92aWRlcjwvY29kZT4uCi0gICAgICogSWYgaXQgaXMgYW4gPGNvZGU+SVRhYmxlTGFiZWxQcm92aWRlcjwvY29kZT4sIHRoZW4gaXQgcHJvdmlkZXMgYQotICAgICAqIHNlcGFyYXRlIGxhYmVsIHRleHQgYW5kIGltYWdlIGZvciBlYWNoIGNvbHVtbi4gSWYgaXQgaXMgYW4gCi0gICAgICogPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+LCB0aGVuIGl0IHByb3ZpZGVzIG9ubHkgdGhlIGxhYmVsIHRleHQgCi0gICAgICogYW5kIGltYWdlIGZvciB0aGUgZmlyc3QgY29sdW1uLCBhbmQgYW55IHJlbWFpbmluZyBjb2x1bW5zIGFyZSBibGFuay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUobGFiZWxQcm92aWRlciBpbnN0YW5jZW9mIElUYWJsZUxhYmVsUHJvdmlkZXIKLSAgICAgICAgICAgICAgICB8fCBsYWJlbFByb3ZpZGVyIGluc3RhbmNlb2YgSUxhYmVsUHJvdmlkZXIpOwotICAgICAgICBzdXBlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgaW4gQWJzdHJhY3RUcmVlVmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFNlbGVjdGlvbihMaXN0IGl0ZW1zKSB7Ci0gICAgICAgIFRhYmxlVHJlZUl0ZW1bXSBuZXdJdGVtcyA9IG5ldyBUYWJsZVRyZWVJdGVtW2l0ZW1zLnNpemUoKV07Ci0gICAgICAgIGl0ZW1zLnRvQXJyYXkobmV3SXRlbXMpOwotICAgICAgICBnZXRUYWJsZVRyZWUoKS5zZXRTZWxlY3Rpb24obmV3SXRlbXMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgaW4gQWJzdHJhY3RUcmVlVmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNob3dJdGVtKEl0ZW0gaXRlbSkgewotICAgICAgICBnZXRUYWJsZVRyZWUoKS5zaG93SXRlbSgoVGFibGVUcmVlSXRlbSkgaXRlbSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9UYWJsZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9UYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjk1NTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBBIGNvbmNyZXRlIHZpZXdlciBiYXNlZCBvbiBhIFNXVCA8Y29kZT5UYWJsZTwvY29kZT4gY29udHJvbC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlIHRoZSB2aWV3ZXIgZnJhbWV3b3JrLiBJdAotICogaXMgZGVzaWduZWQgdG8gYmUgaW5zdGFudGlhdGVkIHdpdGggYSBwcmUtZXhpc3RpbmcgU1dUIHRhYmxlIGNvbnRyb2wgYW5kCi0gKiBjb25maWd1cmVkIHdpdGggYSBkb21haW4tc3BlY2lmaWMgY29udGVudCBwcm92aWRlciwgdGFibGUgbGFiZWwgcHJvdmlkZXIsCi0gKiBlbGVtZW50IGZpbHRlciAob3B0aW9uYWwpLCBhbmQgZWxlbWVudCBzb3J0ZXIgKG9wdGlvbmFsKS4KLSAqIDwvcD4KLSAqIDxwPgotICogTGFiZWwgcHJvdmlkZXJzIGZvciB0YWJsZSB2aWV3ZXJzIG11c3QgaW1wbGVtZW50IGVpdGhlciB0aGUKLSAqIDxjb2RlPklUYWJsZUxhYmVsUHJvdmlkZXI8L2NvZGU+IG9yIHRoZSA8Y29kZT5JTGFiZWxQcm92aWRlcjwvY29kZT4KLSAqIGludGVyZmFjZSAoc2VlIDxjb2RlPlRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXI8L2NvZGU+IGZvciBtb3JlIGRldGFpbHMpLgotICogPC9wPgotICogPHA+Ci0gKiBBcyBvZiAzLjEgdGhlIFRhYmxlVmlld2VyIG5vdyBzdXBwb3J0cyB0aGUgU1dULlZJUlRVQUwKLSAqIGZsYWcuIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgaWYgU1dULlZJUlRVQUwgaXMgaW4gdXNlCi0gKiB0aGF0IHRoZSBXaWRnZXQgYmFzZWQgQVBJcyB3aWxsIHJldHVybiBudWxsIGluIGJvdGggdGhlCi0gKiBjYXNlcyB3aGVyZSBlaXRoZXIgdGhlIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCBvciBub3QKLSAqIGNyZWF0ZWQgeWV0LiAKLSAqIDwvcD4KLSAqIDxwPgotICogVXNlcnMgb2YgU1dULlZJUlRVQUwgc2hvdWxkIGFsc28gYXZvaWQgdXNpbmcgZ2V0SXRlbXMoKQotICogZnJvbSB0aGUgVGFibGUgd2l0aGluIHRoZSBUcmVlVmlld2VyIGFzIHRoaXMgZG9lcyBub3QKLSAqIG5lY2Vzc2FyaWx5IGdlbmVyYXRlIGEgY2FsbGJhY2sgZm9yIHRoZSBUcmVlVmlld2VyIAotICogdG8gcG9wdWxhdGUgdGhlIGl0ZW1zLiBJdCBhbHNvIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YKLSAqIGNyZWF0aW5nIGFsbCBvZiB0aGUgaXRlbXMgdGhlcmVieSBlbGltaW5hdGluZyB0aGUKLSAqIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBvZiBTV1QuVklSVFVBTC4KLSAqIDwvcD4KLSAqIEBzZWUgU1dUI1ZJUlRVQUwKLSAqIEBzZWUgI2RvRmluZEl0ZW0oT2JqZWN0KQotICogQHNlZSAjaW50ZXJuYWxSZWZyZXNoKE9iamVjdCwgYm9vbGVhbikKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlVmlld2VyIGV4dGVuZHMgU3RydWN0dXJlZFZpZXdlciB7Ci0JCQotCXByaXZhdGUgY2xhc3MgVmlydHVhbE1hbmFnZXJ7Ci0KLQkJLyoqCi0JCSAqIFRoZSBjdXJyZW50bHkgaW52aXNpYmxlIGVsZW1lbnRzIGFzIHByb3ZpZGVkIAotCQkgKiBieSB0aGUgY29udGVudCBwcm92aWRlciBvciBieSBhZGRpdGlvbi4KLQkJICogVGhpcyB3aWxsIG5vdCBiZSBwb3B1bGF0ZWQgYnkgYW4gSUxhenlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0JCSAqIGFzIGFuIElMYXp5U3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBpcyBvbmx5IHF1ZXJpZWQKLQkJICogb24gdGhlIHZpcnR1YWwgY2FsbGFiY2suCi0JCSAqLwotCQlwcml2YXRlIE9iamVjdFtdIGNhY2hlZEVsZW1lbnRzID0gbmV3IE9iamVjdFswXTsKLQkJLyoqCi0JCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JCSAqCi0JCSAqLwotCQlwdWJsaWMgVmlydHVhbE1hbmFnZXIoKXsKLQkJCWFkZFRhYmxlTGlzdGVuZXIoKTsKLQkJfQotCi0JCQotCQkvKioKLQkJICogQWRkIHRoZSBsaXN0ZW5lciBmb3IgU2V0RGF0YSBvbiB0aGUgdGFibGUKLQkJICovCi0JCXByaXZhdGUgdm9pZCBhZGRUYWJsZUxpc3RlbmVyKCkgewotCQkJdGFibGUuYWRkTGlzdGVuZXIoU1dULlNldERhdGEsbmV3IExpc3RlbmVyKCl7Ci0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotCQkJCQlmaW5hbCBpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJCQlPYmplY3QgZWxlbWVudCA9IHJlc29sdmVFbGVtZW50KGluZGV4KTsKLQkJCQkJaWYoZWxlbWVudCA9PSBudWxsKXsKLQkJCQkJCS8vRGlkbid0IGZpbmQgaXQgc28gbWFrZSBhIHJlcXVlc3QKLQkJCQkJCS8vS2VlcCBsb29raW5nIGlmIGl0IGlzIG5vdCBpbiB0aGUgY2FjaGUuCi0JCQkJCQlJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IGdldENvbnRlbnRQcm92aWRlcigpOwotCQkJCQkJLy9JZiB3ZSBhcmUgYnVpbGRpbmcgbGF6aWx5IHRoZW4gcmVxdWVzdCBsb29rdXAgbm93Ci0JCQkJCQlpZihjb250ZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBJTGF6eUNvbnRlbnRQcm92aWRlcil7Ci0JCQkJCQkJKChJTGF6eUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyKS4KLQkJCQkJCQkJdXBkYXRlRWxlbWVudChpbmRleCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQkKLQkJCQkJfQotCQkJCQkJCi0JCQkJCQotCQkJCQlhc3NvY2lhdGUoZWxlbWVudCxpdGVtKTsKLQkJCQkJdXBkYXRlSXRlbShpdGVtLGVsZW1lbnQpOwotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBHZXQgdGhlIGVsZW1lbnQgYXQgaW5kZXguUmVzb2x2ZSBpdCBsYXppbHkgaWYgdGhpcwotCQkgKiBpcyBhdmFpbGFibGUuCi0JCSAqIEBwYXJhbSBpbmRleAotCQkgKiBAcmV0dXJuIE9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBjb3VsZAotCQkgKiBub3QgYmUgZm91bmQKLQkJICovCi0JCXByb3RlY3RlZCBPYmplY3QgcmVzb2x2ZUVsZW1lbnQoaW50IGluZGV4KSB7Ci0JCQkKLQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCWlmKGluZGV4IDwgY2FjaGVkRWxlbWVudHMubGVuZ3RoKQotCQkJCWVsZW1lbnQgPSAgY2FjaGVkRWxlbWVudHNbaW5kZXhdOwotCQkJCi0JCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBBIG5vbiB2aXNpYmxlIGl0ZW0gaGFzIGJlZW4gYWRkZWQuCi0JCSAqIEBwYXJhbSBlbGVtZW50Ci0JCSAqIEBwYXJhbSBpbmRleAotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90VmlzaWJsZUFkZGVkKE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJCQotCQkJaW50IHJlcXVpcmVkQ291bnQgPSBpbmRleCArIDE7Ci0JCQkKLQkJCWlmKHJlcXVpcmVkQ291bnQgPiBnZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpKXsKLQkJCQlnZXRUYWJsZSgpLnNldEl0ZW1Db3VudChyZXF1aXJlZENvdW50KTsKLQkJCQlPYmplY3RbXSBuZXdDYWNoZSA9IG5ldyBPYmplY3RbcmVxdWlyZWRDb3VudF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShjYWNoZWRFbGVtZW50cywgMCwgbmV3Q2FjaGUsIDAsIGNhY2hlZEVsZW1lbnRzLmxlbmd0aCk7Ci0JCQkJY2FjaGVkRWxlbWVudHMgPSBuZXdDYWNoZTsKLQkJCX0KLQkJCQotCQkJCi0JCQljYWNoZWRFbGVtZW50c1tpbmRleF0gPSBlbGVtZW50OwotCQkJCi0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgVmlydHVhbE1hbmFnZXIgdmlydHVhbE1hbmFnZXI7Ci0JCi0JLyoqCi0JICogVGFibGVDb2xvckFuZEZvbnROb09wIGlzIGFuIG9wdGltaXphdGlvbiBmb3IgdGFibGVzIHdpdGhvdXQKLQkgKiBjb2xvciBhbmQgZm9udCBzdXBwb3J0LgotCSAqIEBzZWUgSVRhYmxlQ29sb3JQcm92aWRlcgotCSAqIEBzZWUgSVRhYmxlRm9udFByb3ZpZGVyCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUNvbG9yQW5kRm9udE5vT3B7Ci0JCQotCQkvKioKLQkJICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkJICoKLQkJICovCi0JCVRhYmxlQ29sb3JBbmRGb250Tm9PcCgpewotCQkJCi0JCX0KLQkJCi0JCS8qKgotCQkgKiBTZXQgdGhlIGZvbnRzIGFuZCBjb2xvcnMgZm9yIHRoZSB0YWJsZUl0ZW0gaWYgdGhlcmUgaXMgYSBjb2xvcgotCQkgKiBhbmQgZm9udCBwcm92aWRlciBhdmFpbGFibGUuCi0JCSAqIEBwYXJhbSB0YWJsZUl0ZW0gVGhlIGl0ZW0gdG8gdXBkYXRlLgotCQkgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCBiZWluZyByZXByZXNlbnRlZAotCQkgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gaW5kZXgKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEZvbnRzQW5kQ29sb3JzKFRhYmxlSXRlbSB0YWJsZUl0ZW0sIE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uKXsKLQkJfQkKLQkJCi0JfQotCi0JLyoqCi0JICogVGFibGVDb2xvckFuZEZvbnRDb2xsZWN0b3IgaXMgYW4gaGVscGVyIGNsYXNzIGZvciBjb2xvciBhbmQgZm9udAotCSAqIHN1cHBvcnQgZm9yIHRhYmxlcyB0aGF0IHN1cHBvcnQgdGhlIElUYWJsZUZvbnRQcm92aWRlciBhbmQKLQkgKiB0aGUgSVRhYmxlQ29sb3JQcm92aWRlci4KLQkgKiBAc2VlIElUYWJsZUNvbG9yUHJvdmlkZXIKLQkgKiBAc2VlIElUYWJsZUZvbnRQcm92aWRlcgotCSAqLwotCQotCXByaXZhdGUgY2xhc3MgVGFibGVDb2xvckFuZEZvbnRDb2xsZWN0b3IgZXh0ZW5kcyBUYWJsZUNvbG9yQW5kRm9udE5vT3B7Ci0JCQotCQlJVGFibGVGb250UHJvdmlkZXIgZm9udFByb3ZpZGVyID0gbnVsbDsKLQkJSVRhYmxlQ29sb3JQcm92aWRlciBjb2xvclByb3ZpZGVyID0gbnVsbDsKLQkJCi0JCS8qKgotCQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLiBTZXQgdGhlIGNvbG9yIGFuZCBmb250Ci0JCSAqIHByb3ZpZGVycyBpZiBwcm92aWRlciBjYW4gYmUgY2FzdCB0byB0aGUgY29ycmVjdCB0eXBlLgotCQkgKiBAcGFyYW0gcHJvdmlkZXIgSUJhc2VMYWJlbFByb3ZpZGVyCi0JCSAqLwotCQlwdWJsaWMgVGFibGVDb2xvckFuZEZvbnRDb2xsZWN0b3IoSUJhc2VMYWJlbFByb3ZpZGVyIHByb3ZpZGVyKXsKLQkJCWlmKHByb3ZpZGVyIGluc3RhbmNlb2YgSVRhYmxlRm9udFByb3ZpZGVyKQotCQkJCWZvbnRQcm92aWRlciA9IChJVGFibGVGb250UHJvdmlkZXIpIHByb3ZpZGVyOwotCQkJaWYocHJvdmlkZXIgaW5zdGFuY2VvZiBJVGFibGVDb2xvclByb3ZpZGVyKQotCQkJCWNvbG9yUHJvdmlkZXIgPSAoSVRhYmxlQ29sb3JQcm92aWRlcikgcHJvdmlkZXI7Ci0JCX0KLQkKLQkJCi0JCS8qKgotCQkgKiBTZXQgdGhlIGZvbnRzIGFuZCBjb2xvcnMgZm9yIHRoZSB0YWJsZUl0ZW0gaWYgdGhlcmUgaXMgYSBjb2xvcgotCQkgKiBhbmQgZm9udCBwcm92aWRlciBhdmFpbGFibGUuCi0JCSAqIEBwYXJhbSB0YWJsZUl0ZW0gVGhlIGl0ZW0gdG8gdXBkYXRlLgotCQkgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCBiZWluZyByZXByZXNlbnRlZAotCQkgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gaW5kZXgKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEZvbnRzQW5kQ29sb3JzKFRhYmxlSXRlbSB0YWJsZUl0ZW0sIE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uKXsKLQkJCWlmIChjb2xvclByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZChjb2x1bW4sIGNvbG9yUHJvdmlkZXIuZ2V0QmFja2dyb3VuZChlbGVtZW50LAotCQkJCQkJY29sdW1uKSk7Ci0JCQkJdGFibGVJdGVtLnNldEZvcmVncm91bmQoY29sdW1uLCBjb2xvclByb3ZpZGVyLmdldEZvcmVncm91bmQoZWxlbWVudCwKLQkJCQkJCWNvbHVtbikpOwotCQkJfQotCQkJaWYoZm9udFByb3ZpZGVyICE9IG51bGwpCi0JCQkJdGFibGVJdGVtLnNldEZvbnQoY29sdW1uLGZvbnRQcm92aWRlci5nZXRGb250KGVsZW1lbnQsY29sdW1uKSk7Ci0JCX0JCi0JCQotCX0KLQkKLQkvKioKLQkgKiBJbnRlcm5hbCB0YWJsZSB2aWV3ZXIgaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHJpdmF0ZSBUYWJsZUVkaXRvckltcGwgdGFibGVWaWV3ZXJJbXBsOwotCi0JLyoqCi0JICogVGhpcyB2aWV3ZXIncyB0YWJsZSBjb250cm9sLgotCSAqLwotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQkvKioKLQkgKiBUaGlzIHZpZXdlcidzIHRhYmxlIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIFRhYmxlRWRpdG9yIHRhYmxlRWRpdG9yOwotCQotCS8qKgotCSAqIFRoZSBjb2xvciBhbmQgZm9udCBjb2xsZWN0b3IgZm9yIHRoZSBjZWxscy4KLQkgKi8KLQlwcml2YXRlIFRhYmxlQ29sb3JBbmRGb250Tm9PcCB0YWJsZUNvbG9yQW5kRm9udCA9IG5ldyBUYWJsZUNvbG9yQW5kRm9udE5vT3AoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFibGUgdmlld2VyIG9uIGEgbmV3bHktY3JlYXRlZCB0YWJsZSBjb250cm9sIHVuZGVyIHRoZSBnaXZlbgotCSAqIHBhcmVudC4gVGhlIHRhYmxlIGNvbnRyb2wgaXMgY3JlYXRlZCB1c2luZyB0aGUgU1dUIHN0eWxlIGJpdHMKLQkgKiA8Y29kZT5NVUxUSSwgSF9TQ1JPTEwsIFZfU0NST0xMLDwvY29kZT4gYW5kIDxjb2RlPkJPUkRFUjwvY29kZT4uIFRoZQotCSAqIHZpZXdlciBoYXMgbm8gaW5wdXQsIG5vIGNvbnRlbnQgcHJvdmlkZXIsIGEgZGVmYXVsdCBsYWJlbCBwcm92aWRlciwgbm8KLQkgKiBzb3J0ZXIsIGFuZCBubyBmaWx0ZXJzLiBUaGUgdGFibGUgaGFzIG5vIGNvbHVtbnMuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHVibGljIFRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0YWJsZSB2aWV3ZXIgb24gYSBuZXdseS1jcmVhdGVkIHRhYmxlIGNvbnRyb2wgdW5kZXIgdGhlIGdpdmVuCi0JICogcGFyZW50LiBUaGUgdGFibGUgY29udHJvbCBpcyBjcmVhdGVkIHVzaW5nIHRoZSBnaXZlbiBzdHlsZSBiaXRzLiBUaGUKLQkgKiB2aWV3ZXIgaGFzIG5vIGlucHV0LCBubyBjb250ZW50IHByb3ZpZGVyLCBhIGRlZmF1bHQgbGFiZWwgcHJvdmlkZXIsIG5vCi0JICogc29ydGVyLCBhbmQgbm8gZmlsdGVycy4gVGhlIHRhYmxlIGhhcyBubyBjb2x1bW5zLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgU1dUIHN0eWxlIGJpdHMKLQkgKi8KLQlwdWJsaWMgVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXRoaXMobmV3IFRhYmxlKHBhcmVudCwgc3R5bGUpKTsJCQkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFibGUgdmlld2VyIG9uIHRoZSBnaXZlbiB0YWJsZSBjb250cm9sLiBUaGUgdmlld2VyIGhhcyBubwotCSAqIGlucHV0LCBubyBjb250ZW50IHByb3ZpZGVyLCBhIGRlZmF1bHQgbGFiZWwgcHJvdmlkZXIsIG5vIHNvcnRlciwgYW5kIG5vCi0JICogZmlsdGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZSBjb250cm9sCi0JICovCi0JcHVibGljIFRhYmxlVmlld2VyKFRhYmxlIHRhYmxlKSB7Ci0JCXRoaXMudGFibGUgPSB0YWJsZTsKLQkJaG9va0NvbnRyb2wodGFibGUpOwotCQl0YWJsZUVkaXRvciA9IG5ldyBUYWJsZUVkaXRvcih0YWJsZSk7Ci0JCWluaXRUYWJsZVZpZXdlckltcGwoKTsKLQkJaW5pdGlhbGl6ZVZpcnR1YWxNYW5hZ2VyKHRhYmxlLmdldFN0eWxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSB2aXJ0dWFsIG1hbmFnZXIgdG8gbWFuYWdlIHRoZSB2aXJ0dWFsIHN0YXRlCi0JICogaWYgdGhlIHRhYmxlIGlzIFZJUlRVQUwuIElmIG5vdCB1c2UgdGhlIGRlZmF1bHQgbm8tb3AKLQkgKiB2ZXJzaW9uLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmlydHVhbE1hbmFnZXIoaW50IHN0eWxlKSB7Ci0JCWlmKChzdHlsZSAmIFNXVC5WSVJUVUFMKSA9PSAwKQotCQkJcmV0dXJuOwotCQkJCi0JCXZpcnR1YWxNYW5hZ2VyID0gbmV3IFZpcnR1YWxNYW5hZ2VyKCk7CQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGVsZW1lbnRzIHRvIHRoaXMgdGFibGUgdmlld2VyLiBJZiB0aGlzIHZpZXdlciBkb2VzIG5vdAotCSAqIGhhdmUgYSBzb3J0ZXIsIHRoZSBlbGVtZW50cyBhcmUgYWRkZWQgYXQgdGhlIGVuZCBpbiB0aGUgb3JkZXIgZ2l2ZW47Ci0JICogb3RoZXJ3aXNlIHRoZSBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgYXQgYXBwcm9wcmlhdGUgcG9zaXRpb25zLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgKGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyKSB3aGVuIGVsZW1lbnRzIGhhdmUKLQkgKiBiZWVuIGFkZGVkIHRvIHRoZSBtb2RlbCwgaW4gb3JkZXIgdG8gY2F1c2UgdGhlIHZpZXdlciB0byBhY2N1cmF0ZWx5Ci0JICogcmVmbGVjdCB0aGUgbW9kZWwuIFRoaXMgbWV0aG9kIG9ubHkgYWZmZWN0cyB0aGUgdmlld2VyLCBub3QgdGhlIG1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJYXNzZXJ0RWxlbWVudHNOb3ROdWxsKGVsZW1lbnRzKTsKLQkJT2JqZWN0W10gZmlsdGVyZWQgPSBmaWx0ZXIoZWxlbWVudHMpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJlZC5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBmaWx0ZXJlZFtpXTsKLQkJCWludCBpbmRleCA9IGluZGV4Rm9yRWxlbWVudChlbGVtZW50KTsKLQkJCWNyZWF0ZUl0ZW0oZWxlbWVudCwgaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFRhYmxlSXRlbSBhdCBpbmRleCBpZiByZXF1aXJlZC4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBpbmRleAotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlSXRlbShPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCWlmKHZpcnR1YWxNYW5hZ2VyID09IG51bGwpCi0JCQl1cGRhdGVJdGVtKG5ldyBUYWJsZUl0ZW0oZ2V0VGFibGUoKSwgU1dULk5PTkUsIGluZGV4KSwgZWxlbWVudCk7Ci0JCWVsc2V7Ci0JCQl2aXJ0dWFsTWFuYWdlci5ub3RWaXNpYmxlQWRkZWQoZWxlbWVudCxpbmRleCk7Ci0JCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGVsZW1lbnQgdG8gdGhpcyB0YWJsZSB2aWV3ZXIuIElmIHRoaXMgdmlld2VyIGRvZXMgbm90IGhhdmUKLQkgKiBhIHNvcnRlciwgdGhlIGVsZW1lbnQgaXMgYWRkZWQgYXQgdGhlIGVuZDsgb3RoZXJ3aXNlIHRoZSBlbGVtZW50IGlzCi0JICogaW5zZXJ0ZWQgYXQgdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgKGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyKSB3aGVuIGEgc2luZ2xlCi0JICogZWxlbWVudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbW9kZWwsIGluIG9yZGVyIHRvIGNhdXNlIHRoZSB2aWV3ZXIgdG8KLQkgKiBhY2N1cmF0ZWx5IHJlZmxlY3QgdGhlIG1vZGVsLiBUaGlzIG1ldGhvZCBvbmx5IGFmZmVjdHMgdGhlIHZpZXdlciwgbm90Ci0JICogdGhlIG1vZGVsLiBOb3RlIHRoYXQgdGhlcmUgaXMgYW5vdGhlciBtZXRob2QgZm9yIGVmZmljaWVudGx5IHByb2Nlc3NpbmcKLQkgKiB0aGUgc2ltdWx0YW5lb3VzIGFkZGl0aW9uIG9mIG11bHRpcGxlIGVsZW1lbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkKE9iamVjdCBlbGVtZW50KSB7Ci0JCWFkZChuZXcgT2JqZWN0W10geyBlbGVtZW50IH0pOwotCX0KLQotCS8qKgotCSAqIENhbmNlbHMgYSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgZWRpdG9yLiBBbGwgY2hhbmdlcyBhbHJlYWR5IGRvbmUgaW4gdGhlCi0JICogY2VsbCBlZGl0b3IgYXJlIGxvc3QuCi0JICovCi0JcHVibGljIHZvaWQgY2FuY2VsRWRpdGluZygpIHsKLQkJdGFibGVWaWV3ZXJJbXBsLmNhbmNlbEVkaXRpbmcoKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXIjZG9GaW5kSW5wdXRJdGVtKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIFdpZGdldCBkb0ZpbmRJbnB1dEl0ZW0oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVxdWFscyhlbGVtZW50LCBnZXRSb290KCkpKQotCQkJcmV0dXJuIGdldFRhYmxlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlciNkb0ZpbmRJdGVtKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIFdpZGdldCBkb0ZpbmRJdGVtKE9iamVjdCBlbGVtZW50KSB7Ci0JCQotCQlUYWJsZUl0ZW1bXSBjaGlsZHJlbiA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gY2hpbGRyZW5baV07Ci0JCQlPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBlcXVhbHMoZGF0YSwgZWxlbWVudCkpCi0JCQkJcmV0dXJuIGl0ZW07Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXIjZG9VcGRhdGVJdGVtKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCwgamF2YS5sYW5nLk9iamVjdCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VwZGF0ZUl0ZW0oV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZnVsbE1hcCkgewotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0JCQlmaW5hbCBUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIHdpZGdldDsKLQotCQkJLy8gcmVtZW1iZXIgZWxlbWVudCB3ZSBhcmUgc2hvd2luZwotCQkJaWYgKGZ1bGxNYXApIHsKLQkJCQlhc3NvY2lhdGUoZWxlbWVudCwgaXRlbSk7Ci0JCQl9IGVsc2UgewotICAgICAgICAgICAgCU9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICAJaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgCQl1bm1hcEVsZW1lbnQoZGF0YSwgaXRlbSk7Ci0gICAgICAgICAgICAJfQotCQkJCWl0ZW0uc2V0RGF0YShlbGVtZW50KTsKLQkJCQltYXBFbGVtZW50KGVsZW1lbnQsIGl0ZW0pOwotCQkJfQotCi0JCQlJQmFzZUxhYmVsUHJvdmlkZXIgcHJvdiA9IGdldExhYmVsUHJvdmlkZXIoKTsKLQkJCUlUYWJsZUxhYmVsUHJvdmlkZXIgdHByb3YgPSBudWxsOwkJCi0JCQlJTGFiZWxQcm92aWRlciBscHJvdiA9IG51bGw7Ci0JCQlJVmlld2VyTGFiZWxQcm92aWRlciB2cHJvdiA9IG51bGw7Ci0JCQkKLQkJCWlmKHByb3YgaW5zdGFuY2VvZiBJTGFiZWxQcm92aWRlcikKLQkJCQlscHJvdiA9IChJTGFiZWxQcm92aWRlcikgcHJvdjsKLQkJCQotCQkJaWYgKHByb3YgaW5zdGFuY2VvZiBJVmlld2VyTGFiZWxQcm92aWRlcikgewotCQkJCXZwcm92ID0gKElWaWV3ZXJMYWJlbFByb3ZpZGVyKSBwcm92OwotCQkJfSAKLQotCQkJaWYgKHByb3YgaW5zdGFuY2VvZiBJVGFibGVMYWJlbFByb3ZpZGVyKSB7Ci0JCQkJdHByb3YgPSAoSVRhYmxlTGFiZWxQcm92aWRlcikgcHJvdjsKLQkJCX0gCi0JCQkKLQkJCWludCBjb2x1bW5Db3VudCA9IHRhYmxlLmdldENvbHVtbkNvdW50KCk7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBpdGVtOwotCQkJZ2V0Q29sb3JBbmRGb250Q29sbGVjdG9yKCkuc2V0Rm9udHNBbmRDb2xvcnMoZWxlbWVudCk7Ci0JCQkKLQkJCS8vIEFsc28gZW50ZXIgbG9vcCBpZiBubyBjb2x1bW5zIGFkZGVkLiBTZWUgMUc5V1dHWjogSkZVSUY6V0lOTlQgLQotCQkJLy8gVGFibGVWaWV3ZXIgd2l0aCAwIGNvbHVtbnMgZG9lcyBub3Qgd29yawotCQkJZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgY29sdW1uQ291bnQgfHwgY29sdW1uID09IDA7IGNvbHVtbisrKSB7Ci0JCQkJLy8gU2ltaWxhciBjb2RlIGluIFRyZWVWaWV3ZXIuZG9VcGRhdGVJdGVtKCkKLQkJCQlTdHJpbmcgdGV4dCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCQkJdGFibGVDb2xvckFuZEZvbnQuc2V0Rm9udHNBbmRDb2xvcnModGksZWxlbWVudCxjb2x1bW4pOwotCi0JCQkJaWYgKHRwcm92ID09IG51bGwpIHsKLQkJCQkJaWYgKGNvbHVtbiA9PSAwKSB7Ci0JCQkJCQlWaWV3ZXJMYWJlbCB1cGRhdGVMYWJlbCA9IG5ldyBWaWV3ZXJMYWJlbChpdGVtCi0JCQkJCQkJCS5nZXRUZXh0KCksIGl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JCQkJCQkKLQkJCQkJCWlmKHZwcm92ICE9IG51bGwpCi0JCQkJCQkJYnVpbGRMYWJlbCh1cGRhdGVMYWJlbCxlbGVtZW50LHZwcm92KTsKLQkJCQkJCWVsc2V7Ci0JCQkJCQkJaWYobHByb3YgIT0gbnVsbCkKLQkJCQkJCQkJYnVpbGRMYWJlbCh1cGRhdGVMYWJlbCxlbGVtZW50LGxwcm92KTsKLQkJCQkJCX0KLQkJCQkJCQotLy8JCQkJCQlBcyBpdCBpcyBwb3NzaWJsZSBmb3IgdXNlciBjb2RlIHRvIHJ1biB0aGUgZXZlbnQgCi0JCQkgICAgICAgICAgICAvL2xvb3AgY2hlY2sgaGVyZS4KLQkJCQkJCWlmIChpdGVtLmlzRGlzcG9zZWQoKSkgewotCQkJICAgICAgICAgICAgICAgIHVubWFwRWxlbWVudChlbGVtZW50LCBpdGVtKTsKLQkJCSAgICAgICAgICAgICAgICByZXR1cm47Ci0JCQkgICAgICAgICAgICB9ICAgCi0JCQkJCQkKLQkJCQkJCXRleHQgPSB1cGRhdGVMYWJlbC5nZXRUZXh0KCk7Ci0JCQkJCQlpbWFnZSA9IHVwZGF0ZUxhYmVsLmdldEltYWdlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0ZXh0ID0gdHByb3YuZ2V0Q29sdW1uVGV4dChlbGVtZW50LCBjb2x1bW4pOwotCQkJCQlpbWFnZSA9IHRwcm92LmdldENvbHVtbkltYWdlKGVsZW1lbnQsIGNvbHVtbik7Ci0JCQkJfQotCi0JCQkJLy9Bdm9pZCBzZXR0aW5nIHRleHQgdG8gbnVsbAotCQkJCWlmICh0ZXh0ID09IG51bGwpCi0JCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXRpLnNldFRleHQoY29sdW1uLCB0ZXh0KTsKLQkJCQlpZiAodGkuZ2V0SW1hZ2UoY29sdW1uKSAhPSBpbWFnZSkgewotCQkJCQl0aS5zZXRJbWFnZShjb2x1bW4sIGltYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCQotCQkJZ2V0Q29sb3JBbmRGb250Q29sbGVjdG9yKCkuYXBwbHlGb250c0FuZENvbG9ycyh0aSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgZWRpdGluZyB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgY29sdW1uIG51bWJlcgotCSAqLwotCXB1YmxpYyB2b2lkIGVkaXRFbGVtZW50KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uKSB7Ci0JCXRhYmxlVmlld2VySW1wbC5lZGl0RWxlbWVudChlbGVtZW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNlbGwgZWRpdG9ycyBvZiB0aGlzIHRhYmxlIHZpZXdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNlbGwgZWRpdG9ycwotCSAqLwotCXB1YmxpYyBDZWxsRWRpdG9yW10gZ2V0Q2VsbEVkaXRvcnMoKSB7Ci0JCXJldHVybiB0YWJsZVZpZXdlckltcGwuZ2V0Q2VsbEVkaXRvcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjZWxsIG1vZGlmaWVyIG9mIHRoaXMgdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNlbGwgbW9kaWZpZXIKLQkgKi8KLQlwdWJsaWMgSUNlbGxNb2RpZmllciBnZXRDZWxsTW9kaWZpZXIoKSB7Ci0JCXJldHVybiB0YWJsZVZpZXdlckltcGwuZ2V0Q2VsbE1vZGlmaWVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIHByb3BlcnRpZXMgb2YgdGhpcyB0YWJsZSB2aWV3ZXIuIFRoZSBwcm9wZXJ0aWVzIG11c3QKLQkgKiBjb3JyZXNwb25kIHdpdGggdGhlIGNvbHVtbnMgb2YgdGhlIHRhYmxlIGNvbnRyb2wuIFRoZXkgYXJlIHVzZWQgdG8KLQkgKiBpZGVudGlmeSB0aGUgY29sdW1uIGluIGEgY2VsbCBtb2RpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNvbHVtbiBwcm9wZXJ0aWVzCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENvbHVtblByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0YWJsZVZpZXdlckltcGwuZ2V0Q29sdW1uUHJvcGVydGllcygpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI2dldENvbnRyb2woKQotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIGluZGV4IGZyb20gdGhpcyB0YWJsZSB2aWV3ZXIuIFJldHVybnMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBmcmFtZXdvcmsuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIHplcm8tYmFzZWQgaW5kZXgKLQkgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0YWJsZS5nZXRJdGVtQ291bnQoKSkgewotCQkJVGFibGVJdGVtIGkgPSB0YWJsZS5nZXRJdGVtKGluZGV4KTsKLQkJCWlmIChpICE9IG51bGwpCi0JCQkJcmV0dXJuIGkuZ2V0RGF0YSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSB0YWJsZSB2aWV3ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5WaWV3ZXI8L2NvZGU+IGZyYW1ld29yawotCSAqIG1ldGhvZCByZXR1cm5zIHRoZSBsYWJlbCBwcm92aWRlciwgd2hpY2ggaW4gdGhlIGNhc2Ugb2YgdGFibGUgdmlld2VycwotCSAqIHdpbGwgYmUgYW4gaW5zdGFuY2Ugb2YgZWl0aGVyIDxjb2RlPklUYWJsZUxhYmVsUHJvdmlkZXI8L2NvZGU+IG9yCi0JICogPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+LiBJZiBpdCBpcyBhbgotCSAqIDxjb2RlPklUYWJsZUxhYmVsUHJvdmlkZXI8L2NvZGU+LCB0aGVuIGl0IHByb3ZpZGVzIGEgc2VwYXJhdGUgbGFiZWwKLQkgKiB0ZXh0IGFuZCBpbWFnZSBmb3IgZWFjaCBjb2x1bW4uIElmIGl0IGlzIGFuIDxjb2RlPklMYWJlbFByb3ZpZGVyPC9jb2RlPiwKLQkgKiB0aGVuIGl0IHByb3ZpZGVzIG9ubHkgdGhlIGxhYmVsIHRleHQgYW5kIGltYWdlIGZvciB0aGUgZmlyc3QgY29sdW1uLCBhbmQKLQkgKiBhbnkgcmVtYWluaW5nIGNvbHVtbnMgYXJlIGJsYW5rLgotCSAqLwotCXB1YmxpYyBJQmFzZUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldExhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXIjZ2V0U2VsZWN0aW9uRnJvbVdpZGdldCgpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VsZWN0aW9uRnJvbVdpZGdldCgpIHsKLQkJaWYodmlydHVhbE1hbmFnZXIgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRWaXJ0dWFsU2VsZWN0aW9uKCk7Ci0JCVdpZGdldFtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChpdGVtcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlXaWRnZXQgaXRlbSA9IGl0ZW1zW2ldOwotCQkJT2JqZWN0IGUgPSBpdGVtLmdldERhdGEoKTsKLQkJCWlmIChlICE9IG51bGwpCi0JCQkJbGlzdC5hZGQoZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgdmlydHVhbCBzZWxlY3Rpb24uIEF2b2lkIGNhbGxpbmcgU1dUIHdoZW5ldmVyIHBvc3NpYmxlCi0JICogdG8gcHJldmVudCBleHRyYSB3aWRnZXQgY3JlYXRpb24uCi0JICogQHJldHVybiBMaXN0IG9mIE9iamVjdAotCSAqLwotCi0JcHJpdmF0ZSBMaXN0IGdldFZpcnR1YWxTZWxlY3Rpb24oKSB7Ci0JCQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50W10gc2VsZWN0aW9uSW5kaWNlcyA9IGdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOyAKLQkJaWYoZ2V0Q29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJTGF6eUNvbnRlbnRQcm92aWRlcil7Ci0JCQlJTGF6eUNvbnRlbnRQcm92aWRlciBsYXp5ID0gKElMYXp5Q29udGVudFByb3ZpZGVyKSBnZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uSW5kaWNlcy5sZW5ndGg7IGkrKykgewotCQkJCWludCBzZWxlY3Rpb25JbmRleCA9IHNlbGVjdGlvbkluZGljZXNbaV07Ci0JCQkJbGF6eS51cGRhdGVFbGVtZW50KHNlbGVjdGlvbkluZGV4KTsvL1N0YXJ0IHRoZSB1cGRhdGUKLQkJCQlPYmplY3QgZWxlbWVudCA9IGdldFRhYmxlKCkuZ2V0SXRlbShzZWxlY3Rpb25JbmRleCkuZ2V0RGF0YSgpOwotCQkJCS8vT25seSBhZGQgdGhlIGVsZW1lbnQgaWYgaXQgZ290IHVwZGF0ZWQuCi0JCQkJLy9JZiB0aGlzIGlzIGRvbmUgZGVmZXJyZWQgdGhlIHNlbGVjdGlvbiB3aWxsCi0JCQkJLy9iZSBpbmNvbXBsZXRlIHVudGlsIHNlbGVjdGlvbiBpcyBmaW5pc2hlZC4KLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwkJCQkKLQkJCX0KLQkJfQotCQllbHNlewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25JbmRpY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQkJCS8vU2VlIGlmIGl0IGlzIGNhY2hlZAotCQkJCWludCBzZWxlY3Rpb25JbmRleCA9IHNlbGVjdGlvbkluZGljZXNbaV07Ci0JCQkJaWYgKHNlbGVjdGlvbkluZGV4IDwgdmlydHVhbE1hbmFnZXIuY2FjaGVkRWxlbWVudHMubGVuZ3RoKXsKLQkJCQkJZWxlbWVudCA9IHZpcnR1YWxNYW5hZ2VyLmNhY2hlZEVsZW1lbnRzW3NlbGVjdGlvbkluZGV4XTsKLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCl7Ci0JCQkJCS8vIE5vdCBjYWNoZWQgc28gdHJ5IHRoZSBpdGVtJ3MgZGF0YQotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGdldFRhYmxlKCkuZ2V0SXRlbShzZWxlY3Rpb25JbmRleCk7Ci0JCQkJCWVsZW1lbnQgPSBpdGVtLmdldERhdGEoKTsKLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkJCQkJcmVzdWx0LmFkZChlbGVtZW50KTsJCQkJCi0JCQl9Ci0JCQkKLQkJCQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHRhYmxlIHZpZXdlcidzIHRhYmxlIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgdGFibGUgY29udHJvbAotCSAqLwotCXB1YmxpYyBUYWJsZSBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29udGVudFZpZXdlciNob29rQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhvb2tDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotCQlzdXBlci5ob29rQ29udHJvbChjb250cm9sKTsKLQkJVGFibGUgdGFibGVDb250cm9sID0gKFRhYmxlKSBjb250cm9sOwotCQl0YWJsZUNvbnRyb2wuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCXRhYmxlVmlld2VySW1wbC5oYW5kbGVNb3VzZURvd24oZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgaW5kZXggd2hlcmUgdGhlIGl0ZW0gc2hvdWxkIGJlIGluc2VydGVkLgotCSAqLwotCXByb3RlY3RlZCBpbnQgaW5kZXhGb3JFbGVtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCVZpZXdlclNvcnRlciBzb3J0ZXIgPSBnZXRTb3J0ZXIoKTsKLQkJaWYgKHNvcnRlciA9PSBudWxsKQotCQkJcmV0dXJuIHRhYmxlLmdldEl0ZW1Db3VudCgpOwotCQlpbnQgY291bnQgPSB0YWJsZS5nZXRJdGVtQ291bnQoKTsKLQkJaW50IG1pbiA9IDAsIG1heCA9IGNvdW50IC0gMTsKLQkJd2hpbGUgKG1pbiA8PSBtYXgpIHsKLQkJCWludCBtaWQgPSAobWluICsgbWF4KSAvIDI7Ci0JCQlPYmplY3QgZGF0YSA9IHRhYmxlLmdldEl0ZW0obWlkKS5nZXREYXRhKCk7Ci0JCQlpbnQgY29tcGFyZSA9IHNvcnRlci5jb21wYXJlKHRoaXMsIGRhdGEsIGVsZW1lbnQpOwotCQkJaWYgKGNvbXBhcmUgPT0gMCkgewotCQkJCS8vIGZpbmQgZmlyc3QgaXRlbSA+IGVsZW1lbnQKLQkJCQl3aGlsZSAoY29tcGFyZSA9PSAwKSB7Ci0JCQkJCSsrbWlkOwotCQkJCQlpZiAobWlkID49IGNvdW50KSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlkYXRhID0gdGFibGUuZ2V0SXRlbShtaWQpLmdldERhdGEoKTsKLQkJCQkJY29tcGFyZSA9IHNvcnRlci5jb21wYXJlKHRoaXMsIGRhdGEsIGVsZW1lbnQpOwotCQkJCX0KLQkJCQlyZXR1cm4gbWlkOwotCQkJfQotCQkJaWYgKGNvbXBhcmUgPCAwKQotCQkJCW1pbiA9IG1pZCArIDE7Ci0JCQllbHNlCi0JCQkJbWF4ID0gbWlkIC0gMTsKLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB0YWJsZSB2aWV3ZXIgaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRUYWJsZVZpZXdlckltcGwoKSB7Ci0JCXRhYmxlVmlld2VySW1wbCA9IG5ldyBUYWJsZUVkaXRvckltcGwodGhpcykgewotCQkJUmVjdGFuZ2xlIGdldEJvdW5kcyhJdGVtIGl0ZW0sIGludCBjb2x1bW5OdW1iZXIpIHsKLQkJCQlyZXR1cm4gKChUYWJsZUl0ZW0pIGl0ZW0pLmdldEJvdW5kcyhjb2x1bW5OdW1iZXIpOwotCQkJfQotCi0JCQlpbnQgZ2V0Q29sdW1uQ291bnQoKSB7Ci0JCQkJcmV0dXJuIGdldFRhYmxlKCkuZ2V0Q29sdW1uQ291bnQoKTsKLQkJCX0KLQotCQkJSXRlbVtdIGdldFNlbGVjdGlvbigpIHsKLQkJCQlyZXR1cm4gZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQotCQkJdm9pZCBzZXRFZGl0b3IoQ29udHJvbCB3LCBJdGVtIGl0ZW0sIGludCBjb2x1bW5OdW1iZXIpIHsKLQkJCQl0YWJsZUVkaXRvci5zZXRFZGl0b3IodywgKFRhYmxlSXRlbSkgaXRlbSwgY29sdW1uTnVtYmVyKTsKLQkJCX0KLQotCQkJdm9pZCBzZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gYikgewotCQkJCVRhYmxlVmlld2VyLnRoaXMuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgYik7Ci0JCQl9Ci0KLQkJCXZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJCQlnZXRUYWJsZSgpLnNob3dTZWxlY3Rpb24oKTsKLQkJCX0KLQotCQkJdm9pZCBzZXRMYXlvdXREYXRhKENlbGxFZGl0b3IuTGF5b3V0RGF0YSBsYXlvdXREYXRhKSB7Ci0JCQkJdGFibGVFZGl0b3IuZ3JhYkhvcml6b250YWwgPSBsYXlvdXREYXRhLmdyYWJIb3Jpem9udGFsOwotCQkJCXRhYmxlRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQ7Ci0JCQkJdGFibGVFZGl0b3IubWluaW11bVdpZHRoID0gbGF5b3V0RGF0YS5taW5pbXVtV2lkdGg7Ci0JCQl9Ci0KLQkJCXZvaWQgaGFuZGxlRG91YmxlQ2xpY2tFdmVudCgpIHsKLQkJCQlWaWV3ZXIgdmlld2VyID0gZ2V0Vmlld2VyKCk7Ci0JCQkJZmlyZURvdWJsZUNsaWNrKG5ldyBEb3VibGVDbGlja0V2ZW50KHZpZXdlciwgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCQlmaXJlT3BlbihuZXcgT3BlbkV2ZW50KHZpZXdlciwgdmlld2VyLmdldFNlbGVjdGlvbigpKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIjaW5wdXRDaGFuZ2VkKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5wdXRDaGFuZ2VkKE9iamVjdCBpbnB1dCwgT2JqZWN0IG9sZElucHV0KSB7Ci0JCWdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotCQl0cnkgewotCQkJLy8gcmVmcmVzaCgpIGF0dGVtcHRzIHRvIHByZXNlcnZlIHNlbGVjdGlvbiwgd2hpY2ggd2Ugd2FudCBoZXJlCi0JCQlyZWZyZXNoKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlnZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyB0aGUgZ2l2ZW4gZWxlbWVudCBpbnRvIHRoaXMgdGFibGUgdmlld2VyIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4KLQkgKiBJZiB0aGlzIHZpZXdlciBoYXMgYSBzb3J0ZXIsIHRoZSBwb3NpdGlvbiBpcyBpZ25vcmVkIGFuZCB0aGUgZWxlbWVudCBpcwotCSAqIGluc2VydGVkIGF0IHRoZSBjb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBzb3J0IG9yZGVyLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgKGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyKSB3aGVuIGVsZW1lbnRzIGhhdmUKLQkgKiBiZWVuIGFkZGVkIHRvIHRoZSBtb2RlbCwgaW4gb3JkZXIgdG8gY2F1c2UgdGhlIHZpZXdlciB0byBhY2N1cmF0ZWx5Ci0JICogcmVmbGVjdCB0aGUgbW9kZWwuIFRoaXMgbWV0aG9kIG9ubHkgYWZmZWN0cyB0aGUgdmlld2VyLCBub3QgdGhlIG1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIGEgMC1iYXNlZCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgbW9kZWwsIG9yIC0xIHRvIGluZGljYXRlCi0JICogICAgICAgICAgICB0aGUgbGFzdCBwb3NpdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydChPYmplY3QgZWxlbWVudCwgaW50IHBvc2l0aW9uKSB7Ci0JCXRhYmxlVmlld2VySW1wbC5hcHBseUVkaXRvclZhbHVlKCk7Ci0JCWlmIChnZXRTb3J0ZXIoKSAhPSBudWxsIHx8IGhhc0ZpbHRlcnMoKSkgewotCQkJYWRkKGVsZW1lbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChwb3NpdGlvbiA9PSAtMSkKLQkJCXBvc2l0aW9uID0gdGFibGUuZ2V0SXRlbUNvdW50KCk7Ci0JCQotCQljcmVhdGVJdGVtKGVsZW1lbnQscG9zaXRpb24pOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlciNpbnRlcm5hbFJlZnJlc2goamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFJlZnJlc2goT2JqZWN0IGVsZW1lbnQpIHsKLQkJaW50ZXJuYWxSZWZyZXNoKGVsZW1lbnQsIHRydWUpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlciNpbnRlcm5hbFJlZnJlc2goamF2YS5sYW5nLk9iamVjdCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFJlZnJlc2goT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7Ci0JCXRhYmxlVmlld2VySW1wbC5hcHBseUVkaXRvclZhbHVlKCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZXF1YWxzKGVsZW1lbnQsIGdldFJvb3QoKSkpIHsKLQkJCWlmKHZpcnR1YWxNYW5hZ2VyID09IG51bGwpCi0JCQkJaW50ZXJuYWxSZWZyZXNoQWxsKHVwZGF0ZUxhYmVscyk7Ci0JCQllbHNlewotCQkJCWludGVybmFsVmlydHVhbFJlZnJlc2hBbGwoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVdpZGdldCB3ID0gZmluZEl0ZW0oZWxlbWVudCk7Ci0JCQlpZiAodyAhPSBudWxsKSB7Ci0JCQkJdXBkYXRlSXRlbSh3LCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggYWxsIHdpdGggdmlydHVhbCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsVmlydHVhbFJlZnJlc2hBbGwoKSB7Ci0JCQotCQlPYmplY3Qgcm9vdCA9IGdldFJvb3QoKTsKLQkJSUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBnZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCi0JCS8vSW52YWxpZGF0ZSBmb3IgbGF6eQotCQlpZighKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIElMYXp5Q29udGVudFByb3ZpZGVyKSAKLQkJCQkmJiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIpKSB7Ci0JCQkvL0Rvbid0IGNhY2hlIGlmIHRoZSByb290IGlzIG51bGwgYnV0IGNhY2hlIGlmIGl0IGlzIG5vdCBsYXp5LgotCQkJaWYocm9vdCAhPSBudWxsKXsKLQkJCQl2aXJ0dWFsTWFuYWdlci5jYWNoZWRFbGVtZW50cyA9IAotCQkJCQkoKElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKSBnZXRDb250ZW50UHJvdmlkZXIoKSkuZ2V0RWxlbWVudHMocm9vdCk7Ci0JCQkJZ2V0VGFibGUoKS5zZXRJdGVtQ291bnQodmlydHVhbE1hbmFnZXIuY2FjaGVkRWxlbWVudHMubGVuZ3RoKTsKLQkJCX0KLQkJfQotCQlnZXRUYWJsZSgpLmNsZWFyQWxsKCk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCBhbGwgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSB0YWJsZS4gdXBkYXRlIHRoZQotCSAqIGxhYmVscyBpZiB1cGRhdExhYmVscyBpcyB0cnVlOwotCSAqIEBwYXJhbSB1cGRhdGVMYWJlbHMKLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsUmVmcmVzaEFsbChib29sZWFuIHVwZGF0ZUxhYmVscykgewotCQkvLyB0aGUgcGFyZW50Ci0KLQkJLy8gaW4gdGhlIGNvZGUgYmVsb3csIGl0IGlzIGltcG9ydGFudCB0byBkbyBhbGwgZGlzYXNzb2NpYXRlcwotCQkvLyBiZWZvcmUgYW55IGFzc29jaWF0ZXMsIHNpbmNlIGEgbGF0ZXIgZGlzYXNzb2NpYXRlIGNhbiB1bmRvIGFuCi0JCS8vIGVhcmxpZXIgYXNzb2NpYXRlCi0JCS8vIGUuZy4gaWYgKGEsIGIpIGlzIHJlcGxhY2VkIGJ5IChiLCBhKSwgdGhlIGRpc2Fzc29jaWF0ZSBvZiBiIHRvCi0JCS8vIGl0ZW0gMSBjb3VsZCB1bmRvCi0JCS8vIHRoZSBhc3NvY2lhdGUgb2YgYiB0byBpdGVtIDAuCi0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRTb3J0ZWRDaGlsZHJlbihnZXRSb290KCkpOwotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLQkJaW50IG1pbiA9IE1hdGgubWluKGNoaWxkcmVuLmxlbmd0aCwgaXRlbXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaW47ICsraSkgewotCQkJCi0JCQkKLQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQkJCi0JCQkvLyBpZiB0aGUgZWxlbWVudCBpcyB1bmNoYW5nZWQsIHVwZGF0ZSBpdHMgbGFiZWwgaWYgYXBwcm9wcmlhdGUKLQkJCWlmIChlcXVhbHMoY2hpbGRyZW5baV0sIGl0ZW0uZ2V0RGF0YSgpKSkgewotCQkJCWlmICh1cGRhdGVMYWJlbHMpIHsKLQkJCQkJdXBkYXRlSXRlbShpdGVtLCBjaGlsZHJlbltpXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gYXNzb2NpYXRlIHRoZSBuZXcgZWxlbWVudCwgZXZlbiBpZiBlcXVhbCB0byB0aGUgb2xkCi0JCQkJCS8vIG9uZSwKLQkJCQkJLy8gdG8gcmVtb3ZlIHN0YWxlIHJlZmVyZW5jZXMgKHNlZSBidWcgMzEzMTQpCi0JCQkJCWFzc29jaWF0ZShjaGlsZHJlbltpXSwgaXRlbSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyB1cGRhdGVJdGVtIGRvZXMgYW4gYXNzb2NpYXRlKC4uLiksIHdoaWNoIGNhbiBtZXNzIHVwCi0JCQkJLy8gdGhlIGFzc29jaWF0aW9ucyBpZiB0aGUgb3JkZXIgb2YgZWxlbWVudHMgaGFzIGNoYW5nZWQuCi0JCQkJLy8gRS5nLiAoYSwgYikgLT4gKGIsIGEpIGZpcnN0IHJlcGxhY2VzIGEtPjAgd2l0aCBiLT4wLCB0aGVuCi0JCQkJLy8gcmVwbGFjZXMgYi0+MSB3aXRoIGEtPjEsIGJ1dCB0aGlzIGFjdHVhbGx5IHJlbW92ZXMgYi0+MC4KLQkJCQkvLyBTbywgaWYgdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpdGVtIGhhcyBjaGFuZ2VkLAotCQkJCS8vIGp1c3QgZGlzYXNzb2NpYXRlIGl0IGZvciBub3csIGFuZCB1cGRhdGUgaXQgYmVsb3cuCi0JCQkJaXRlbS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW01hdGgubWF4KDEsdGFibGUuZ2V0Q29sdW1uQ291bnQoKSldKTsvL0NsZWFyIGFsbCBpbWFnZXMKLQkJCQlkaXNhc3NvY2lhdGUoaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZGlzcG9zZSBvZiBhbGwgaXRlbXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZWxlbWVudHMKLQkJaWYgKG1pbiA8IGl0ZW1zLmxlbmd0aCkgewotCQkJZm9yIChpbnQgaSA9IGl0ZW1zLmxlbmd0aDsgLS1pID49IG1pbjspIHsKLQkJCQkKLQkJCQlkaXNhc3NvY2lhdGUoaXRlbXNbaV0pOwotCQkJfQotCQkJdGFibGUucmVtb3ZlKG1pbiwgaXRlbXMubGVuZ3RoIC0gMSk7Ci0JCX0KLQkJLy8gV29ya2Fyb3VuZCBmb3IgMUdER040UTogSVRQVUk6V0lOMjAwMCAtIFRhYmxlVmlld2VyIGljb25zIGdldAotCQkvLyBzY3J1bmNoZWQKLQkJaWYgKHRhYmxlLmdldEl0ZW1Db3VudCgpID09IDApIHsKLQkJCXRhYmxlLnJlbW92ZUFsbCgpOwotCQl9Ci0JCS8vIFVwZGF0ZSBpdGVtcyB3aGljaCB3ZXJlIHJlbW92ZWQgYWJvdmUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaW47ICsraSkgewotCQkJCQkJCQotCQkJVGFibGVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCWlmIChpdGVtLmdldERhdGEoKSA9PSBudWxsKSAKLQkJCQl1cGRhdGVJdGVtKGl0ZW0sIGNoaWxkcmVuW2ldKTsKLQkJfQotCQkvLyBhZGQgYW55IHJlbWFpbmluZyBlbGVtZW50cwotCQlmb3IgKGludCBpID0gbWluOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCWNyZWF0ZUl0ZW0oY2hpbGRyZW5baV0saSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGVsZW1lbnRzIGZyb20gdGhpcyB0YWJsZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gcmVtb3ZlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsUmVtb3ZlKGZpbmFsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChlcXVhbHMoZWxlbWVudHNbaV0sIGlucHV0KSkgewotCQkJCXNldElucHV0KG51bGwpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyB1c2UgcmVtb3ZlKGludFtdKSByYXRoZXIgdGhhbiByZXBlYXRlZCBUYWJsZUl0ZW0uZGlzcG9zZSgpIGNhbGxzCi0JCS8vIHRvIGFsbG93IFNXVCB0byBvcHRpbWl6ZSBtdWx0aXBsZSByZW1vdmFscwotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFtlbGVtZW50cy5sZW5ndGhdOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQlXaWRnZXQgdyA9IGZpbmRJdGVtKGVsZW1lbnRzW2ldKTsKLQkJCWlmICh3IGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSB3OwotCQkJCWRpc2Fzc29jaWF0ZShpdGVtKTsKLQkJCQlpbmRpY2VzW2NvdW50KytdID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCX0KLQkJfQotCQlpZiAoY291bnQgPCBpbmRpY2VzLmxlbmd0aCkgewotCQkJU3lzdGVtLmFycmF5Y29weShpbmRpY2VzLCAwLCBpbmRpY2VzID0gbmV3IGludFtjb3VudF0sIDAsIGNvdW50KTsKLQkJfQotCQl0YWJsZS5yZW1vdmUoaW5kaWNlcyk7Ci0KLQkJLy8gV29ya2Fyb3VuZCBmb3IgMUdER040UTogSVRQVUk6V0lOMjAwMCAtIFRhYmxlVmlld2VyIGljb25zIGdldAotCQkvLyBzY3J1bmNoZWQKLQkJaWYgKHRhYmxlLmdldEl0ZW1Db3VudCgpID09IDApIHsKLQkJCXRhYmxlLnJlbW92ZUFsbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZXJlIGlzIGFuIGFjdGl2ZSBjZWxsIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBjZWxsIGVkaXRvciwgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDZWxsRWRpdG9yQWN0aXZlKCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXJJbXBsLmlzQ2VsbEVkaXRvckFjdGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGVsZW1lbnRzIGZyb20gdGhpcyB0YWJsZSB2aWV3ZXIuIFRoZSBzZWxlY3Rpb24gaXMKLQkgKiB1cGRhdGVkIGlmIHJlcXVpcmVkLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgKGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyKSB3aGVuIGVsZW1lbnRzIGhhdmUKLQkgKiBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbW9kZWwsIGluIG9yZGVyIHRvIGNhdXNlIHRoZSB2aWV3ZXIgdG8gYWNjdXJhdGVseQotCSAqIHJlZmxlY3QgdGhlIG1vZGVsLiBUaGlzIG1ldGhvZCBvbmx5IGFmZmVjdHMgdGhlIHZpZXdlciwgbm90IHRoZSBtb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gcmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKGZpbmFsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCWFzc2VydEVsZW1lbnRzTm90TnVsbChlbGVtZW50cyk7Ci0gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkgewotICAgICAgICAJcmV0dXJuOwotICAgICAgICB9Ci0JCXByZXNlcnZpbmdTZWxlY3Rpb24obmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWludGVybmFsUmVtb3ZlKGVsZW1lbnRzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZWxlbWVudCBmcm9tIHRoaXMgdGFibGUgdmlld2VyLiBUaGUgc2VsZWN0aW9uIGlzCi0JICogdXBkYXRlZCBpZiBuZWNlc3NhcnkuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCAoYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIpIHdoZW4gYSBzaW5nbGUKLQkgKiBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbW9kZWwsIGluIG9yZGVyIHRvIGNhdXNlIHRoZSB2aWV3ZXIgdG8KLQkgKiBhY2N1cmF0ZWx5IHJlZmxlY3QgdGhlIG1vZGVsLiBUaGlzIG1ldGhvZCBvbmx5IGFmZmVjdHMgdGhlIHZpZXdlciwgbm90Ci0JICogdGhlIG1vZGVsLiBOb3RlIHRoYXQgdGhlcmUgaXMgYW5vdGhlciBtZXRob2QgZm9yIGVmZmljaWVudGx5IHByb2Nlc3NpbmcKLQkgKiB0aGUgc2ltdWx0YW5lb3VzIHJlbW92YWwgb2YgbXVsdGlwbGUgZWxlbWVudHMuCi0JICogPC9wPgotCSAqIDxzdHJvbmc+Tk9URTo8L3N0cm9uZz4gcmVtb3ZpbmcgYW4gb2JqZWN0IGZyb20gYSB2aXJ0dWFsCi0JICogdGFibGUgd2lsbCBkZWNyZW1lbnQgdGhlIGl0ZW1Db3VudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmVtb3ZlKG5ldyBPYmplY3RbXSB7IGVsZW1lbnQgfSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyI3JldmVhbChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJldmVhbChPYmplY3QgZWxlbWVudCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGVsZW1lbnQpOwotCQlXaWRnZXQgdyA9IGZpbmRJdGVtKGVsZW1lbnQpOwotCQlpZiAodyBpbnN0YW5jZW9mIFRhYmxlSXRlbSkKLQkJCWdldFRhYmxlKCkuc2hvd0l0ZW0oKFRhYmxlSXRlbSkgdyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2VsbCBlZGl0b3JzIG9mIHRoaXMgdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3JzCi0JICogICAgICAgICAgICB0aGUgbGlzdCBvZiBjZWxsIGVkaXRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDZWxsRWRpdG9ycyhDZWxsRWRpdG9yW10gZWRpdG9ycykgewotCQl0YWJsZVZpZXdlckltcGwuc2V0Q2VsbEVkaXRvcnMoZWRpdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2VsbCBtb2RpZmllciBvZiB0aGlzIHRhYmxlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZXIKLQkgKiAgICAgICAgICAgIHRoZSBjZWxsIG1vZGlmaWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VsbE1vZGlmaWVyKElDZWxsTW9kaWZpZXIgbW9kaWZpZXIpIHsKLQkJdGFibGVWaWV3ZXJJbXBsLnNldENlbGxNb2RpZmllcihtb2RpZmllcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29sdW1uIHByb3BlcnRpZXMgb2YgdGhpcyB0YWJsZSB2aWV3ZXIuIFRoZSBwcm9wZXJ0aWVzIG11c3QKLQkgKiBjb3JyZXNwb25kIHdpdGggdGhlIGNvbHVtbnMgb2YgdGhlIHRhYmxlIGNvbnRyb2wuIFRoZXkgYXJlIHVzZWQgdG8KLQkgKiBpZGVudGlmeSB0aGUgY29sdW1uIGluIGEgY2VsbCBtb2RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uUHJvcGVydGllcwotCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgY29sdW1uIHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5Qcm9wZXJ0aWVzKFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMpIHsKLQkJdGFibGVWaWV3ZXJJbXBsLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHRhYmxlIHZpZXdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlZpZXdlcjwvY29kZT4gZnJhbWV3b3JrCi0JICogbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGUgZ2l2ZW4gbGFiZWwgcHJvdmlkZXIgaXMgYW4gaW5zdGFuY2Ugb2YgZWl0aGVyCi0JICogPGNvZGU+SVRhYmxlTGFiZWxQcm92aWRlcjwvY29kZT4gb3IgPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+LiBJZgotCSAqIGl0IGlzIGFuIDxjb2RlPklUYWJsZUxhYmVsUHJvdmlkZXI8L2NvZGU+LCB0aGVuIGl0IHByb3ZpZGVzIGEgc2VwYXJhdGUKLQkgKiBsYWJlbCB0ZXh0IGFuZCBpbWFnZSBmb3IgZWFjaCBjb2x1bW4uIElmIGl0IGlzIGFuCi0JICogPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+LCB0aGVuIGl0IHByb3ZpZGVzIG9ubHkgdGhlIGxhYmVsIHRleHQgYW5kCi0JICogaW1hZ2UgZm9yIHRoZSBmaXJzdCBjb2x1bW4sIGFuZCBhbnkgcmVtYWluaW5nIGNvbHVtbnMgYXJlIGJsYW5rLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsUHJvdmlkZXIoSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShsYWJlbFByb3ZpZGVyIGluc3RhbmNlb2YgSVRhYmxlTGFiZWxQcm92aWRlcgotCQkJCXx8IGxhYmVsUHJvdmlkZXIgaW5zdGFuY2VvZiBJTGFiZWxQcm92aWRlcik7Ci0JCXN1cGVyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWlmKGxhYmVsUHJvdmlkZXIgaW5zdGFuY2VvZiBJVGFibGVGb250UHJvdmlkZXIgfHwgbGFiZWxQcm92aWRlciBpbnN0YW5jZW9mIElUYWJsZUNvbG9yUHJvdmlkZXIpCi0JCQl0YWJsZUNvbG9yQW5kRm9udCA9IG5ldyBUYWJsZUNvbG9yQW5kRm9udENvbGxlY3RvcihsYWJlbFByb3ZpZGVyKTsKLQkJZWxzZQotCQkJdGFibGVDb2xvckFuZEZvbnQgPSBuZXcgVGFibGVDb2xvckFuZEZvbnROb09wKCk7Ci0JCQkJCi0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFNldHMgYSBuZXcgc2VsZWN0aW9uIGZvciB0aGlzIHZpZXdlciBhbmQgb3B0aW9uYWxseSBtYWtlcyBpdCB2aXNpYmxlLgotCSAqIFRoZSBUYWJsZVZpZXdlciBpbXBsbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIGluZWZmZWNpZW50IGZvciB0aGUKLQkgKiBJTGF6eUNvbnRlbnRQcm92aWRlciBhcyBsb29rdXAgaXMgZG9uZSBieSBpbmRpY2VzIHJhdGhlciB0aGFuIGVsZW1lbnRzCi0JICogYW5kIG1heSByZXF1aXJlIHBvcHVsYXRpb24gb2YgdGhlIGVudGlyZSB0YWJsZSBpbiB3b3JzZSBjYXNlLiAKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIFRhYmxlI3NldFNlbGVjdGlvbihpbnRbXSBpbmRpY2VzKSBhbmQgVGFibGUjc2hvd1NlbGVjdGlvbigpIGlmCi0JICogeW91IHdpc2ggdG8gc2V0IHNlbGVjdGlvbiBtb3JlIGVmZmVjaWVudGx5IHdoZW4gdXNpbmcgYSBJTGF6eUNvbnRlbnRQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgbmV3IHNlbGVjdGlvbgotICAgICAqIEBwYXJhbSByZXZlYWwgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlbGVjdGlvbiBpcyB0byBiZSBtYWRlCi0gICAgICogICB2aXNpYmxlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzZWUgVGFibGUjc2V0U2VsZWN0aW9uKGludFtdKQotCSAqIEBzZWUgVGFibGUjc2hvd1NlbGVjdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIHJldmVhbCkgewotCQlzdXBlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCByZXZlYWwpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlciNzZXRTZWxlY3Rpb25Ub1dpZGdldChqYXZhLnV0aWwuTGlzdCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3Rpb25Ub1dpZGdldChMaXN0IGxpc3QsIGJvb2xlYW4gcmV2ZWFsKSB7Ci0JCQotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZih2aXJ0dWFsTWFuYWdlciAhPSBudWxsKXsKLQkJCXZpcnR1YWxTZXRTZWxlY3Rpb25Ub1dpZGdldChsaXN0LCByZXZlYWwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bc2l6ZV07Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQlPYmplY3QgbyA9IGxpc3QuZ2V0KGkpOwotCQkJV2lkZ2V0IHcgPSBmaW5kSXRlbShvKTsKLQkJCWlmICh3IGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSB3OwotCQkJCWl0ZW1zW2NvdW50KytdID0gaXRlbTsKLQkJCX0KLQkJfQotCQlpZiAoY291bnQgPCBzaXplKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bY291bnRdLCAwLCBjb3VudCk7Ci0JCX0KLQkJdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQotCQlpZiAocmV2ZWFsKSB7Ci0JCQl0YWJsZS5zaG93U2VsZWN0aW9uKCk7Ci0JCX0KLQkJCQotCX0KLQkKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHNlbGVjdGlvbiBvbiBhIHZpcnR1YWwgdGFibGUKLQkgKiBAcGFyYW0gbGlzdCBUaGUgZWxlbWVudHMgdG8gc2V0Ci0JICogQHBhcmFtIHJldmVhbCBXaGV0aGVyIG9yIG5vdCByZXZlYWwgdGhlIGZpcnN0IGl0ZW0uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZpcnR1YWxTZXRTZWxlY3Rpb25Ub1dpZGdldChMaXN0IGxpc3QsIGJvb2xlYW4gcmV2ZWFsKSB7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2xpc3Quc2l6ZSgpXTsKLQkJCi0JCVRhYmxlSXRlbSBmaXJzdEl0ZW0gPSBudWxsOwotCQlpbnQgY291bnQgPSAwOwotCQlIYXNoU2V0IHZpcnR1YWxFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7IAotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJT2JqZWN0IG8gPSBsaXN0LmdldChpKTsKLQkJCVdpZGdldCB3ID0gZmluZEl0ZW0obyk7Ci0JCQlpZiAodyBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgdzsKLQkJCQlpbmRpY2VzW2NvdW50KytdID0gZ2V0VGFibGUoKS5pbmRleE9mKGl0ZW0pOwotCQkJCWlmIChmaXJzdEl0ZW0gPT0gbnVsbCkKLQkJCQkJZmlyc3RJdGVtID0gaXRlbTsKLQkJCX0KLQkJCWVsc2UKLQkJCQl2aXJ0dWFsRWxlbWVudHMuYWRkKG8pOwotCQl9Ci0JCQotCQlpZihnZXRDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIElMYXp5Q29udGVudFByb3ZpZGVyKXsKLQkJCUlMYXp5Q29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gCi0JCQkJKElMYXp5Q29udGVudFByb3ZpZGVyKSBnZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCi0JCQkvL05vdyBnbyB0aHJvdWdoIGl0IGFnYWluIHVudGlsIGFsbCBpcyBkb25lIG9yIHdlIGFyZSBubyBsb25nZXIgdmlydHVhbAotCQkJLy9UaGlzIG1heSBjcmVhdGUgYWxsIGl0ZW1zIHNvIGl0IGlzIG5vdCBhIGdvb2QKLQkJCS8vaWRlYSBpbiBnZW5lcmFsLgotCQkJLy9Vc2UgI3NldFNlbGVjdGlvbiAoaW50IFtdIGluZGljZXMsYm9vbGVhbiByZXZlYWwpIGluc3RlYWQKLQkJCWZvciAoaW50IGkgPSAwOyB2aXJ0dWFsRWxlbWVudHMuc2l6ZSgpID4gMCAmJiBpIDwgZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0JCQkJcHJvdmlkZXIudXBkYXRlRWxlbWVudChpKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGdldFRhYmxlKCkuZ2V0SXRlbShpKTsKLQkJCQlpZih2aXJ0dWFsRWxlbWVudHMuY29udGFpbnMoaXRlbS5nZXREYXRhKCkpKXsKLQkJCQkJaW5kaWNlc1tjb3VudCsrXSA9IGk7CQotCQkJCQl2aXJ0dWFsRWxlbWVudHMucmVtb3ZlKGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQkJaWYgKGZpcnN0SXRlbSA9PSBudWxsKQotCQkJCQkJZmlyc3RJdGVtID0gaXRlbTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZXsKLQkJCQotCQkJaWYoY291bnQgIT0gbGlzdC5zaXplKCkpey8vQXMgdGhpcyBpcyBleHBlbnNpdmUgc2tpcCBpdCBpZiBhbGwgaGF2ZSBiZWVuIGZvdW5kCi0JCQkJLy9JZiBpdCBpcyBub3QgbGF6eSB3ZSBjYW4gdXNlIHRoZSBjYWNoZQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlydHVhbE1hbmFnZXIuY2FjaGVkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSB2aXJ0dWFsTWFuYWdlci5jYWNoZWRFbGVtZW50c1tpXTsKLQkJCQkJaWYodmlydHVhbEVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpKXsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gZ2V0VGFibGUoKS5nZXRJdGVtKGkpOwotCQkJCQkJaXRlbS5nZXRUZXh0KCk7Ly9CZSBzdXJlIHRvIGZpcmUgdGhlIHVwZGF0ZQotCQkJCQkJaW5kaWNlc1tjb3VudCsrXSA9IGk7CQotCQkJCQkJdmlydHVhbEVsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJCWlmIChmaXJzdEl0ZW0gPT0gbnVsbCkKLQkJCQkJCQlmaXJzdEl0ZW0gPSBpdGVtOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoY291bnQgPCBzaXplKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGluZGljZXMsIDAsIGluZGljZXMgPSBuZXcgaW50W2NvdW50XSwgMCwgY291bnQpOwotCQl9Ci0JCXRhYmxlLnNldFNlbGVjdGlvbihpbmRpY2VzKTsKLQotCQlpZiAocmV2ZWFsICYmIGZpcnN0SXRlbSAhPSBudWxsKSB7Ci0JCQl0YWJsZS5zaG93SXRlbShmaXJzdEl0ZW0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBpdGVtIGNvdW50IG9mIHRoZSByZWNlaXZlci4KLQkgKiBAcGFyYW0gY291bnQgdGhlIG5ldyB0YWJsZSBzaXplLgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJdGVtQ291bnQoaW50IGNvdW50KXsKLQkJZ2V0VGFibGUoKS5zZXRJdGVtQ291bnQoY291bnQpOwotCQlnZXRUYWJsZSgpLnJlZHJhdygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXBsYWNlIHRoZSBlbnRyaWVzIHN0YXJ0aW5nIGF0IGluZGV4IHdpdGggZWxlbWVudHMuCi0JICogVGhpcyBtZXRob2QgYXNzdW1lcyBhbGwgb2YgdGhlc2UgdmFsdWVzIGFyZSBjb3JyZWN0Ci0JICogYW5kIHdpbGwgbm90IGNhbGwgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gdmVyaWZ5LgotCSAqIDxzdHJvbmc+Tm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlIGEgVGFibGVJdGVtCi0JICogZm9yIGFsbCBvZiB0aGUgZWxlbWVudHMgcHJvdmlkZWQ8L3N0cm9uZz4uCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAc2VlIElMYXp5Q29udGVudFByb3ZpZGVyCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2UoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCl7Ci0JCVRhYmxlSXRlbSBpdGVtID0gZ2V0VGFibGUoKS5nZXRJdGVtKGluZGV4KTsKLQkJcmVmcmVzaEl0ZW0oaXRlbSwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHRhYmxlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIHRhYmxlIGl0ZW0gdG8gYmUgY2xlYXJlZAotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcihpbnQgaW5kZXgpIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBnZXRUYWJsZSgpLmdldEl0ZW0oaW5kZXgpOwotCQlpZiAoaXRlbS5nZXREYXRhKCkgIT0gbnVsbCkgewotCQkJZGlzYXNzb2NpYXRlKGl0ZW0pOwotCQl9Ci0JCXRhYmxlLmNsZWFyKGluZGV4KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyI2dldFJhd0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldFJhd0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQotCQlBc3NlcnQuaXNUcnVlKCEoZ2V0Q29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJTGF6eUNvbnRlbnRQcm92aWRlciksIkNhbm5vdCBnZXQgcmF3IGNoaWxkcmVuIHdpdGggYW4gSUxhenlDb250ZW50UHJvdmlkZXIiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdXBlci5nZXRSYXdDaGlsZHJlbihwYXJlbnQpOwotCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXIjYXNzZXJ0Q29udGVudFByb3ZpZGVyVHlwZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29udGVudFByb3ZpZGVyVHlwZShJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCUFzc2VydC5pc1RydWUocHJvdmlkZXIgaW5zdGFuY2VvZiBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB8fAotCQkJCXByb3ZpZGVyIGluc3RhbmNlb2YgSUxhenlDb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQkKLQkKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9UZXh0Q2VsbEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9UZXh0Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmY1ZDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVGV4dENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIGNlbGwgZWRpdG9yIHRoYXQgbWFuYWdlcyBhIHRleHQgZW50cnkgZmllbGQuCi0gKiBUaGUgY2VsbCBlZGl0b3IncyB2YWx1ZSBpcyB0aGUgdGV4dCBzdHJpbmcgaXRzZWxmLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVGV4dENlbGxFZGl0b3IgZXh0ZW5kcyBDZWxsRWRpdG9yIHsKLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXh0IGNvbnRyb2w7IGluaXRpYWxseSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGV4dCB0ZXh0OwotCi0gICAgcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIFN0YXRlIGluZm9ybWF0aW9uIGZvciB1cGRhdGluZyBhY3Rpb24gZW5hYmxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NlbGVjdGlvbiA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGVsZXRlYWJsZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2VsZWN0YWJsZSA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBUZXh0Q2VsbEVkaXRvciBzdHlsZQotICAgICAqIHNwZWNpZnkgbm8gYm9yZGVycyBvbiB0ZXh0IHdpZGdldCBhcyBjZWxsIG91dGxpbmUgaW4gdGFibGUgYWxyZWFkeQotICAgICAqIHByb3ZpZGVzIHRoZSBsb29rIG9mIGEgYm9yZGVyLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0U3R5bGUgPSBTV1QuU0lOR0xFOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB0ZXh0IHN0cmluZyBjZWxsIGVkaXRvciB3aXRoIG5vIGNvbnRyb2wKLSAgICAgKiBUaGUgY2VsbCBlZGl0b3IgdmFsdWUgaXMgdGhlIHN0cmluZyBpdHNlbGYsIHdoaWNoIGlzIGluaXRpYWxseSB0aGUgZW1wdHkKLSAgICAgKiBzdHJpbmcuIEluaXRpYWxseSwgdGhlIGNlbGwgZWRpdG9yIGhhcyBubyBjZWxsIHZhbGlkYXRvci4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICovCi0gICAgcHVibGljIFRleHRDZWxsRWRpdG9yKCkgewotICAgICAgICBzZXRTdHlsZShkZWZhdWx0U3R5bGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgdGV4dCBzdHJpbmcgY2VsbCBlZGl0b3IgcGFyZW50ZWQgdW5kZXIgdGhlIGdpdmVuIGNvbnRyb2wuCi0gICAgICogVGhlIGNlbGwgZWRpdG9yIHZhbHVlIGlzIHRoZSBzdHJpbmcgaXRzZWxmLCB3aGljaCBpcyBpbml0aWFsbHkgdGhlIGVtcHR5IHN0cmluZy4gCi0gICAgICogSW5pdGlhbGx5LCB0aGUgY2VsbCBlZGl0b3IgaGFzIG5vIGNlbGwgdmFsaWRhdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgVGV4dENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICB0aGlzKHBhcmVudCwgZGVmYXVsdFN0eWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHRleHQgc3RyaW5nIGNlbGwgZWRpdG9yIHBhcmVudGVkIHVuZGVyIHRoZSBnaXZlbiBjb250cm9sLgotICAgICAqIFRoZSBjZWxsIGVkaXRvciB2YWx1ZSBpcyB0aGUgc3RyaW5nIGl0c2VsZiwgd2hpY2ggaXMgaW5pdGlhbGx5IHRoZSBlbXB0eSBzdHJpbmcuIAotICAgICAqIEluaXRpYWxseSwgdGhlIGNlbGwgZWRpdG9yIGhhcyBubyBjZWxsIHZhbGlkYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBiaXRzCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHB1YmxpYyBUZXh0Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgImRlbGV0ZWFibGUiIHN0YXRlIChjYW4gZGVsZXRlLwotICAgICAqIG5vdGhpbmcgdG8gZGVsZXRlKSBoYXMgY2hhbmdlZCBhbmQgaWYgc28gZmlyZSBhbgotICAgICAqIGVuYWJsZW1lbnQgY2hhbmdlZCBub3RpZmljYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRGVsZXRlYWJsZSgpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRJc0RlbGV0ZWFibGUgPSBpc0RlbGV0ZWFibGU7Ci0gICAgICAgIGlzRGVsZXRlYWJsZSA9IGlzRGVsZXRlRW5hYmxlZCgpOwotICAgICAgICBpZiAob2xkSXNEZWxldGVhYmxlICE9IGlzRGVsZXRlYWJsZSkgewotICAgICAgICAgICAgZmlyZUVuYWJsZW1lbnRDaGFuZ2VkKERFTEVURSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSAic2VsZWN0YWJsZSIgc3RhdGUgKGNhbiBzZWxlY3QpCi0gICAgICogaGFzIGNoYW5nZWQgYW5kIGlmIHNvIGZpcmUgYW4gZW5hYmxlbWVudCBjaGFuZ2VkIG5vdGlmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tTZWxlY3RhYmxlKCkgewotICAgICAgICBib29sZWFuIG9sZElzU2VsZWN0YWJsZSA9IGlzU2VsZWN0YWJsZTsKLSAgICAgICAgaXNTZWxlY3RhYmxlID0gaXNTZWxlY3RBbGxFbmFibGVkKCk7Ci0gICAgICAgIGlmIChvbGRJc1NlbGVjdGFibGUgIT0gaXNTZWxlY3RhYmxlKSB7Ci0gICAgICAgICAgICBmaXJlRW5hYmxlbWVudENoYW5nZWQoU0VMRUNUX0FMTCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBzZWxlY3Rpb24gc3RhdGUgKHNlbGVjdGlvbiAvCi0gICAgICogbm8gc2VsZWN0aW9uKSBoYXMgY2hhbmdlZCBhbmQgaWYgc28gZmlyZSBhbgotICAgICAqIGVuYWJsZW1lbnQgY2hhbmdlZCBub3RpZmljYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrU2VsZWN0aW9uKCkgewotICAgICAgICBib29sZWFuIG9sZElzU2VsZWN0aW9uID0gaXNTZWxlY3Rpb247Ci0gICAgICAgIGlzU2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpID4gMDsKLSAgICAgICAgaWYgKG9sZElzU2VsZWN0aW9uICE9IGlzU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBmaXJlRW5hYmxlbWVudENoYW5nZWQoQ09QWSk7Ci0gICAgICAgICAgICBmaXJlRW5hYmxlbWVudENoYW5nZWQoQ1VUKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQ2VsbEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgZ2V0U3R5bGUoKSk7Ci0gICAgICAgIHRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZURlZmF1bHRTZWxlY3Rpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0ZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotICAgICAgICAgICAgLy8gaG9vayBrZXkgcHJlc3NlZCAtIHNlZSBQUiAxNDIwMSAgCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBrZXlSZWxlYXNlT2NjdXJlZChlKTsKLQotICAgICAgICAgICAgICAgIC8vIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgdGhlIGFib3ZlIGNhbGwsIGNsaWVudHMgbWF5IGhhdmUKLSAgICAgICAgICAgICAgICAvLyBkaXNwb3NlZCB0aGlzIGNlbGwgZWRpdG9yCi0gICAgICAgICAgICAgICAgaWYgKChnZXRDb250cm9sKCkgPT0gbnVsbCkgfHwgZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGNoZWNrU2VsZWN0aW9uKCk7IC8vIHNlZSBleHBsYWluYXRpb24gYmVsb3cKLSAgICAgICAgICAgICAgICBjaGVja0RlbGV0ZWFibGUoKTsKLSAgICAgICAgICAgICAgICBjaGVja1NlbGVjdGFibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotICAgICAgICAgICAgICAgICAgICBlLmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAvLyBXZSByZWFsbHkgd2FudCBhIHNlbGVjdGlvbiBsaXN0ZW5lciBidXQgaXQgaXMgbm90IHN1cHBvcnRlZCBzbyB3ZQotICAgICAgICAvLyB1c2UgYSBrZXkgbGlzdGVuZXIgYW5kIGEgbW91c2UgbGlzdGVuZXIgdG8ga25vdyB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzCi0gICAgICAgIC8vIG1heSBoYXZlIG9jY3VyZWQKLSAgICAgICAgdGV4dC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNoZWNrU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY2hlY2tEZWxldGVhYmxlKCk7Ci0gICAgICAgICAgICAgICAgY2hlY2tTZWxlY3RhYmxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0ZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBUZXh0Q2VsbEVkaXRvci50aGlzLmZvY3VzTG9zdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGV4dC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICB0ZXh0LnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgIHRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGdldE1vZGlmeUxpc3RlbmVyKCkpOwotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+VGV4dENlbGxFZGl0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mCi0gICAgICogdGhpcyA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBmcmFtZXdvcmsgbWV0aG9kIHJldHVybnMKLSAgICAgKiB0aGUgdGV4dCBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0IHN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZG9HZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRleHQuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQ2VsbEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldEZvY3VzKCkgewotICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXh0LnNlbGVjdEFsbCgpOwotICAgICAgICAgICAgdGV4dC5zZXRGb2N1cygpOwotICAgICAgICAgICAgY2hlY2tTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGNoZWNrRGVsZXRlYWJsZSgpOwotICAgICAgICAgICAgY2hlY2tTZWxlY3RhYmxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+VGV4dENlbGxFZGl0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mCi0gICAgICogdGhpcyA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBmcmFtZXdvcmsgbWV0aG9kIGFjY2VwdHMKLSAgICAgKiBhIHRleHQgc3RyaW5nICh0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4pLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGEgdGV4dCBzdHJpbmcgKHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKHRleHQgIT0gbnVsbCAmJiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKTsKLSAgICAgICAgdGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihnZXRNb2RpZnlMaXN0ZW5lcigpKTsKLSAgICAgICAgdGV4dC5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRNb2RpZnlMaXN0ZW5lcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBtb2RpZnkgZXZlbnQgdGhhdCBvY2N1cnJlZCBpbiB0aGlzIHRleHQgY2VsbCBlZGl0b3IuCi0gICAgICogVGhpcyBmcmFtZXdvcmsgbWV0aG9kIHBlcmZvcm1zIHZhbGlkYXRpb24gYW5kIHNldHMgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBhY2NvcmRpbmdseSwgYW5kIHRoZW4gcmVwb3J0cyBhIGNoYW5nZSB2aWEgPGNvZGU+ZmlyZUVkaXRvclZhbHVlQ2hhbmdlZDwvY29kZT4uCi0gICAgICogU3ViY2xhc3NlcyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBhdCBhcHByb3ByaWF0ZSB0aW1lcy4gU3ViY2xhc3NlcwotICAgICAqIG1heSBleHRlbmQgb3IgcmVpbXBsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZSB0aGUgU1dUIG1vZGlmeSBldmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGVkaXRPY2N1cmVkKE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gdGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgdmFsdWUgPSAiIjsvLyROT04tTkxTLTEkCi0gICAgICAgIE9iamVjdCB0eXBlZFZhbHVlID0gdmFsdWU7Ci0gICAgICAgIGJvb2xlYW4gb2xkVmFsaWRTdGF0ZSA9IGlzVmFsdWVWYWxpZCgpOwotICAgICAgICBib29sZWFuIG5ld1ZhbGlkU3RhdGUgPSBpc0NvcnJlY3QodHlwZWRWYWx1ZSk7Ci0gICAgICAgIGlmICh0eXBlZFZhbHVlID09IG51bGwgJiYgbmV3VmFsaWRTdGF0ZSkKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUoZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICJWYWxpZGF0b3IgaXNuJ3QgbGltaXRpbmcgdGhlIGNlbGwgZWRpdG9yJ3MgdHlwZSByYW5nZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKCFuZXdWYWxpZFN0YXRlKSB7Ci0gICAgICAgICAgICAvLyB0cnkgdG8gaW5zZXJ0IHRoZSBjdXJyZW50IHZhbHVlIGludG8gdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0RXJyb3JNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHZhbHVlIH0pKTsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZUNoYW5nZWQob2xkVmFsaWRTdGF0ZSwgbmV3VmFsaWRTdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2luY2UgYSB0ZXh0IGVkaXRvciBmaWVsZCBpcyBzY3JvbGxhYmxlIHdlIGRvbid0Ci0gICAgICogc2V0IGEgbWluaW11bVNpemUuCi0gICAgICovCi0gICAgcHVibGljIExheW91dERhdGEgZ2V0TGF5b3V0RGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXREYXRhKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBtb2RpZnkgbGlzdGVuZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBnZXRNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgaWYgKG1vZGlmeUxpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBlZGl0T2NjdXJlZChlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RpZnlMaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIGEgZGVmYXVsdCBzZWxlY3Rpb24gZXZlbnQgZnJvbSB0aGUgdGV4dCBjb250cm9sIGJ5IGFwcGx5aW5nIHRoZSBlZGl0b3IKLSAgICAgKiB2YWx1ZSBhbmQgZGVhY3RpdmF0aW5nIHRoaXMgY2VsbCBlZGl0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBzZWxlY3Rpb24gZXZlbnQKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGVmYXVsdFNlbGVjdGlvbihTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAvLyBzYW1lIHdpdGggZW50ZXIta2V5IGhhbmRsaW5nIGNvZGUgaW4ga2V5UmVsZWFzZU9jY3VyZWQoZSk7Ci0gICAgICAgIGZpcmVBcHBseUVkaXRvclZhbHVlKCk7Ci0gICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+VGV4dENlbGxFZGl0b3I8L2NvZGU+ICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIAotICAgICAqIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBub3QgZW1wdHkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb3B5RW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlRleHRDZWxsRWRpdG9yPC9jb2RlPiAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiAKLSAgICAgKiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMgbm90IGVtcHR5LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ3V0RW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlRleHRDZWxsRWRpdG9yPC9jb2RlPiAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPgotICAgICAqIGlmIHRoZXJlIGlzIGEgc2VsZWN0aW9uIG9yIGlmIHRoZSBjYXJldCBpcyBub3QgcG9zaXRpb25lZCAKLSAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZXRlRW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDAKLSAgICAgICAgICAgICAgICB8fCB0ZXh0LmdldENhcmV0UG9zaXRpb24oKSA8IHRleHQuZ2V0Q2hhckNvdW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlRleHRDZWxsRWRpdG9yPC9jb2RlPiAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBtZXRob2QgYWx3YXlzIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXN0ZUVuYWJsZWQoKSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5UZXh0Q2VsbEVkaXRvcjwvY29kZT4gIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+Q2VsbEVkaXRvcjwvY29kZT4gbWV0aG9kIGFsd2F5cyByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFsbEVuYWJsZWQoKSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjZWxsIGVkaXRvciBpcwotICAgICAqIGFibGUgdG8gcGVyZm9ybSB0aGUgc2VsZWN0IGFsbCBhY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKLSAgICAgKiA8L3A+Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzZWxlY3QgYWxsIGlzIHBvc3NpYmxlLAotICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RBbGxFbmFibGVkKCkgewotICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdGV4dC5nZXRDaGFyQ291bnQoKSA+IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEga2V5IHJlbGVhc2UgZXZlbnQgdGhhdCBvY2N1cnJlZCBpbiB0aGlzIGNlbGwgZWRpdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5UZXh0Q2VsbEVkaXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIAotICAgICAqIGlnbm9yZXMgd2hlbiB0aGUgUkVUVVJOIGtleSBpcyBwcmVzc2VkIHNpbmNlIHRoaXMgaXMgaGFuZGxlZCBpbiAKLSAgICAgKiA8Y29kZT5oYW5kbGVEZWZhdWx0U2VsZWN0aW9uPC9jb2RlPi4KLSAgICAgKiBBbiBleGNlcHRpb24gaXMgbWFkZSBmb3IgQ3RybCtFbnRlciBmb3IgbXVsdGktbGluZSB0ZXh0cywgc2luY2UKLSAgICAgKiBhIGRlZmF1bHQgc2VsZWN0aW9uIGV2ZW50IGlzIG5vdCBzZW50IGluIHRoaXMgY2FzZS4gCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleUV2ZW50IHRoZSBrZXkgZXZlbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBrZXlSZWxlYXNlT2NjdXJlZChLZXlFdmVudCBrZXlFdmVudCkgewotICAgICAgICBpZiAoa2V5RXZlbnQuY2hhcmFjdGVyID09ICdccicpIHsgLy8gUmV0dXJuIGtleQotICAgICAgICAgICAgLy8gRW50ZXIgaXMgaGFuZGxlZCBpbiBoYW5kbGVEZWZhdWx0U2VsZWN0aW9uLgotICAgICAgICAgICAgLy8gRG8gbm90IGFwcGx5IHRoZSBlZGl0b3IgdmFsdWUgaW4gcmVzcG9uc2UgdG8gYW4gRW50ZXIga2V5IGV2ZW50Ci0gICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGNhbiBiZSByZWNlaXZlZCBmcm9tIHRoZSBJTUUgd2hlbiB0aGUgaW50ZW50IGlzIC1ub3QtCi0gICAgICAgICAgICAvLyB0byBhcHBseSB0aGUgdmFsdWUuICAKLSAgICAgICAgICAgIC8vIFNlZSBidWcgMzkwNzQgW0NlbGxFZGl0b3JzXSBbREJDU10gY2FubmEgaW5wdXQgbW9kZSBmaXJlcyBib2d1cyBldmVudCBmcm9tIFRleHQgQ29udHJvbAotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEFuIGV4Y2VwdGlvbiBpcyBtYWRlIGZvciBDdHJsK0VudGVyIGZvciBtdWx0aS1saW5lIHRleHRzLCBzaW5jZQotICAgICAgICAgICAgLy8gYSBkZWZhdWx0IHNlbGVjdGlvbiBldmVudCBpcyBub3Qgc2VudCBpbiB0aGlzIGNhc2UuIAotICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCAmJiAhdGV4dC5pc0Rpc3Bvc2VkKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKHRleHQuZ2V0U3R5bGUoKSAmIFNXVC5NVUxUSSkgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmICgoa2V5RXZlbnQuc3RhdGVNYXNrICYgU1dULkNUUkwpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIua2V5UmVsZWFzZU9jY3VyZWQoa2V5RXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5rZXlSZWxlYXNlT2NjdXJlZChrZXlFdmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlRleHRDZWxsRWRpdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+Q2VsbEVkaXRvcjwvY29kZT4gbWV0aG9kIGNvcGllcyB0aGUKLSAgICAgKiBjdXJyZW50IHNlbGVjdGlvbiB0byB0aGUgY2xpcGJvYXJkLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQ29weSgpIHsKLSAgICAgICAgdGV4dC5jb3B5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlRleHRDZWxsRWRpdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+Q2VsbEVkaXRvcjwvY29kZT4gbWV0aG9kIGN1dHMgdGhlCi0gICAgICogY3VycmVudCBzZWxlY3Rpb24gdG8gdGhlIGNsaXBib2FyZC4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGVyZm9ybUN1dCgpIHsKLSAgICAgICAgdGV4dC5jdXQoKTsKLSAgICAgICAgY2hlY2tTZWxlY3Rpb24oKTsKLSAgICAgICAgY2hlY2tEZWxldGVhYmxlKCk7Ci0gICAgICAgIGNoZWNrU2VsZWN0YWJsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5UZXh0Q2VsbEVkaXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IG1ldGhvZCBkZWxldGVzIHRoZQotICAgICAqIGN1cnJlbnQgc2VsZWN0aW9uIG9yLCBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24sCi0gICAgICogdGhlIGNoYXJhY3RlciBuZXh0IGNoYXJhY3RlciBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtRGVsZXRlKCkgewotICAgICAgICBpZiAodGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCkKLSAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0gICAgICAgICAgICB0ZXh0Lmluc2VydCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgdGhlIG5leHQgY2hhcmFjdGVyCi0gICAgICAgICAgICBpbnQgcG9zID0gdGV4dC5nZXRDYXJldFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBpZiAocG9zIDwgdGV4dC5nZXRDaGFyQ291bnQoKSkgewotICAgICAgICAgICAgICAgIHRleHQuc2V0U2VsZWN0aW9uKHBvcywgcG9zICsgMSk7Ci0gICAgICAgICAgICAgICAgdGV4dC5pbnNlcnQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tTZWxlY3Rpb24oKTsKLSAgICAgICAgY2hlY2tEZWxldGVhYmxlKCk7Ci0gICAgICAgIGNoZWNrU2VsZWN0YWJsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5UZXh0Q2VsbEVkaXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IG1ldGhvZCBwYXN0ZXMgdGhlCi0gICAgICogdGhlIGNsaXBib2FyZCBjb250ZW50cyBvdmVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGVyZm9ybVBhc3RlKCkgewotICAgICAgICB0ZXh0LnBhc3RlKCk7Ci0gICAgICAgIGNoZWNrU2VsZWN0aW9uKCk7Ci0gICAgICAgIGNoZWNrRGVsZXRlYWJsZSgpOwotICAgICAgICBjaGVja1NlbGVjdGFibGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+VGV4dENlbGxFZGl0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBtZXRob2Qgc2VsZWN0cyBhbGwgb2YgdGhlCi0gICAgICogY3VycmVudCB0ZXh0LiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtU2VsZWN0QWxsKCkgewotICAgICAgICB0ZXh0LnNlbGVjdEFsbCgpOwotICAgICAgICBjaGVja1NlbGVjdGlvbigpOwotICAgICAgICBjaGVja0RlbGV0ZWFibGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1RyZWVFZGl0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1RyZWVFZGl0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNDBkMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9UcmVlRWRpdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLQotLyoqCi0gKiBJbnRlcm5hbCB0cmVlIHZpZXdlciBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0vKiBwYWNrYWdlICovYWJzdHJhY3QgY2xhc3MgVHJlZUVkaXRvckltcGwgewotCi0gICAgcHJpdmF0ZSBDZWxsRWRpdG9yIGNlbGxFZGl0b3I7Ci0KLSAgICBwcml2YXRlIENlbGxFZGl0b3JbXSBjZWxsRWRpdG9yczsKLQotICAgIHByaXZhdGUgSUNlbGxNb2RpZmllciBjZWxsTW9kaWZpZXI7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXM7Ci0KLSAgICBwcml2YXRlIEl0ZW0gdHJlZUl0ZW07Ci0KLSAgICBwcml2YXRlIGludCBjb2x1bW5OdW1iZXI7Ci0KLSAgICBwcml2YXRlIElDZWxsRWRpdG9yTGlzdGVuZXIgY2VsbEVkaXRvckxpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBGb2N1c0xpc3RlbmVyIGZvY3VzTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIE1vdXNlTGlzdGVuZXIgbW91c2VMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgaW50IGRvdWJsZUNsaWNrRXhwaXJhdGlvblRpbWU7Ci0KLSAgICBwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyOwotCi0gICAgVHJlZUVkaXRvckltcGwoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLSAgICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICAgIGluaXRDZWxsRWRpdG9yTGlzdGVuZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgPGNvZGU+VHJlZVZpZXdlckltcGw8L2NvZGU+IHZpZXdlcgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZpZXdlcgotICAgICAqLwotICAgIHB1YmxpYyBTdHJ1Y3R1cmVkVmlld2VyIGdldFZpZXdlcigpIHsKLSAgICAgICAgcmV0dXJuIHZpZXdlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWN0aXZhdGVDZWxsRWRpdG9yKCkgewotICAgICAgICBpZiAoY2VsbEVkaXRvcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNlbGxFZGl0b3JzW2NvbHVtbk51bWJlcl0gIT0gbnVsbCAmJiBjZWxsTW9kaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gdHJlZUl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGNvbHVtblByb3BlcnRpZXNbY29sdW1uTnVtYmVyXTsKLSAgICAgICAgICAgICAgICBpZiAoY2VsbE1vZGlmaWVyLmNhbk1vZGlmeShlbGVtZW50LCBwcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2VsbEVkaXRvciA9IGNlbGxFZGl0b3JzW2NvbHVtbk51bWJlcl07Ci0gICAgICAgICAgICAgICAgICAgIC8vdHJlZS5zaG93U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNlbGxFZGl0b3IuYWRkTGlzdGVuZXIoY2VsbEVkaXRvckxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY2VsbE1vZGlmaWVyLmdldFZhbHVlKGVsZW1lbnQsIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICAgICAgY2VsbEVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRyaWNreSBmbG93IG9mIGNvbnRyb2wgaGVyZToKLSAgICAgICAgICAgICAgICAgICAgLy8gYWN0aXZhdGUoKSBjYW4gdHJpZ2dlciBjYWxsYmFjayB0byBjZWxsRWRpdG9yTGlzdGVuZXIgd2hpY2ggd2lsbCBjbGVhciBjZWxsRWRpdG9yCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIG11c3QgZ2V0IGNvbnRyb2wgZmlyc3QsIGJ1dCBtdXN0IHN0aWxsIGNhbGwgYWN0aXZhdGUoKSBldmVuIGlmIHRoZXJlIGlzIG5vIGNvbnRyb2wuCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRyb2wgY29udHJvbCA9IGNlbGxFZGl0b3IuZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgICAgICAgICBjZWxsRWRpdG9yLmFjdGl2YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIHNldExheW91dERhdGEoY2VsbEVkaXRvci5nZXRMYXlvdXREYXRhKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3IoY29udHJvbCwgdHJlZUl0ZW0sIGNvbHVtbk51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgIGNlbGxFZGl0b3Iuc2V0Rm9jdXMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzTGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNMaXN0ZW5lciA9IG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseUVkaXRvclZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb250cm9sLmFkZEZvY3VzTGlzdGVuZXIoZm9jdXNMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIG1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VBZGFwdGVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWUgd3JhcD8JCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGV4cGlyYXRpb24gb2YgZG91YmxlQ2xpY2tUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUudGltZSA8PSBkb3VibGVDbGlja0V4cGlyYXRpb25UaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucmVtb3ZlTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsRWRpdGluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3VibGVDbGlja0V2ZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb3VzZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5yZW1vdmVNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjdGl2YXRlIGEgY2VsbCBlZGl0b3IgZm9yIHRoZSBnaXZlbiBtb3VzZSBwb3NpdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWN0aXZhdGVDZWxsRWRpdG9yKE1vdXNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKHRyZWVJdGVtID09IG51bGwgfHwgdHJlZUl0ZW0uaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAvL2l0ZW0gbm8gbG9uZ2VyIGV4aXN0cwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBjb2x1bW5Ub0VkaXQ7Ci0gICAgICAgIGludCBjb2x1bW5zID0gZ2V0Q29sdW1uQ291bnQoKTsKLSAgICAgICAgaWYgKGNvbHVtbnMgPT0gMCkgewotICAgICAgICAgICAgLy8gSWYgbm8gVHJlZUNvbHVtbiwgVHJlZSBhY3RzIGFzIGlmIGl0IGhhcyBhIHNpbmdsZSBjb2x1bW4KLSAgICAgICAgICAgIC8vIHdoaWNoIHRha2VzIHRoZSB3aG9sZSB3aWR0aC4KLSAgICAgICAgICAgIGNvbHVtblRvRWRpdCA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb2x1bW5Ub0VkaXQgPSAtMTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcyh0cmVlSXRlbSwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJvdW5kcy5jb250YWlucyhldmVudC54LCBldmVudC55KSkgewotICAgICAgICAgICAgICAgICAgICBjb2x1bW5Ub0VkaXQgPSBpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29sdW1uVG9FZGl0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29sdW1uTnVtYmVyID0gY29sdW1uVG9FZGl0OwotICAgICAgICBhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWFjdGl2YXRlcyB0aGUgY3VycmVudGx5IGFjdGl2ZSBjZWxsIGVkaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBseUVkaXRvclZhbHVlKCkgewotICAgICAgICBDZWxsRWRpdG9yIGMgPSB0aGlzLmNlbGxFZGl0b3I7Ci0gICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG51bGwgb3V0IGNlbGwgZWRpdG9yIGJlZm9yZSBjYWxsaW5nIHNhdmUKLSAgICAgICAgICAgIC8vIGluIGNhc2Ugc2F2ZSByZXN1bHRzIGluIGFwcGx5RWRpdG9yVmFsdWUgYmVpbmcgcmUtZW50ZXJlZAotICAgICAgICAgICAgLy8gc2VlIDFHQUhJOFo6IElUUFVJOkFMTCAtIEhvdyB0byBjb2RlIGV2ZW50IG5vdGlmaWNhdGlvbiB3aGVuIHVzaW5nIGNlbGwgZWRpdG9yID8KLSAgICAgICAgICAgIHRoaXMuY2VsbEVkaXRvciA9IG51bGw7Ci0gICAgICAgICAgICBJdGVtIHQgPSB0aGlzLnRyZWVJdGVtOwotICAgICAgICAgICAgLy8gZG9uJ3QgbnVsbCBvdXQgdHJlZSBpdGVtIC0tIHNhbWUgaXRlbSBpcyBzdGlsbCBzZWxlY3RlZAotICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCAmJiAhdC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBzYXZlRWRpdG9yVmFsdWUoYywgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRFZGl0b3IobnVsbCwgbnVsbCwgMCk7Ci0gICAgICAgICAgICBjLnJlbW92ZUxpc3RlbmVyKGNlbGxFZGl0b3JMaXN0ZW5lcik7Ci0gICAgICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBjLmdldENvbnRyb2woKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobW91c2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucmVtb3ZlTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZvY3VzTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250cm9sLnJlbW92ZUZvY3VzTGlzdGVuZXIoZm9jdXNMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYy5kZWFjdGl2YXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIHRoZSBhY3RpdmUgY2VsbCBlZGl0b3IsIHdpdGhvdXQgc2F2aW5nIHRoZSB2YWx1ZSAKLSAgICAgKiBiYWNrIHRvIHRoZSBkb21haW4gbW9kZWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2FuY2VsRWRpdGluZygpIHsKLSAgICAgICAgaWYgKGNlbGxFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0RWRpdG9yKG51bGwsIG51bGwsIDApOwotICAgICAgICAgICAgY2VsbEVkaXRvci5yZW1vdmVMaXN0ZW5lcihjZWxsRWRpdG9yTGlzdGVuZXIpOwotICAgICAgICAgICAgQ2VsbEVkaXRvciBvbGRFZGl0b3IgPSBjZWxsRWRpdG9yOwotICAgICAgICAgICAgY2VsbEVkaXRvciA9IG51bGw7Ci0gICAgICAgICAgICBvbGRFZGl0b3IuZGVhY3RpdmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgZWRpdGluZyB0aGUgZ2l2ZW4gZWxlbWVudC4gCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gY29sdW1uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZWRpdEVsZW1lbnQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW4pIHsKLSAgICAgICAgaWYgKGNlbGxFZGl0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIGFwcGx5RWRpdG9yVmFsdWUoKTsKLQotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uOwotICAgICAgICBpZihlbGVtZW50IGluc3RhbmNlb2YgVHJlZVBhdGgpIHsKLSAgICAgICAgCXN0cnVjdHVyZWRTZWxlY3Rpb24gPSBuZXcgVHJlZVNlbGVjdGlvbigoVHJlZVBhdGgpZWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0U2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24sIHRydWUpOwotICAgICAgICBJdGVtW10gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoICE9IDEpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgdHJlZUl0ZW0gPSBzZWxlY3Rpb25bMF07Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHNlbGVjdGlvbiBpcyB2aXNpYmxlCi0gICAgICAgIHNob3dTZWxlY3Rpb24oKTsKLSAgICAgICAgY29sdW1uTnVtYmVyID0gY29sdW1uOwotICAgICAgICBhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQotICAgIH0KLQotICAgIGFic3RyYWN0IFJlY3RhbmdsZSBnZXRCb3VuZHMoSXRlbSBpdGVtLCBpbnQgY29sdW1uTnVtYmVyKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgQ2VsbCBFZGl0b3JzIGZvciB0aGUgcmVjZWl2ZXIuCi0gICAgICogQHJldHVybiBDZWxsRWRpdG9yW10KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2VsbEVkaXRvcltdIGdldENlbGxFZGl0b3JzKCkgewotICAgICAgICByZXR1cm4gY2VsbEVkaXRvcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjZWxsIG1vZGlmaWVyIGZvciB0aGUgcmVjZWl2ZXIuCi0gICAgICogQHJldHVybiBJQ2VsbE1vZGlmaWVyCi0gICAgICovCi0gICAgcHVibGljIElDZWxsTW9kaWZpZXIgZ2V0Q2VsbE1vZGlmaWVyKCkgewotICAgICAgICByZXR1cm4gY2VsbE1vZGlmaWVyOwotICAgIH0KLQotICAgIGFic3RyYWN0IGludCBnZXRDb2x1bW5Db3VudCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjb2x1bW4gcHJvcGVydGllcyBmb3IgdGhlIHJlY2VpdmVyLgotICAgICAqIEByZXR1cm4gT2JqZWN0W10KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q29sdW1uUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIGNvbHVtblByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgYWJzdHJhY3QgSXRlbVtdIGdldFNlbGVjdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB0aGUgbW91c2UgZG93biBldmVudDsgYWN0aXZhdGVzIHRoZSBjZWxsIGVkaXRvci4KLSAgICAgKiBAcGFyYW0gZXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVNb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuYnV0dG9uICE9IDEpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKGNlbGxFZGl0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIGFwcGx5RWRpdG9yVmFsdWUoKTsKLQotICAgICAgICAvLyBhY3RpdmF0ZSB0aGUgY2VsbCBlZGl0b3IgaW1tZWRpYXRlbHkuICBJZiBhIHNlY29uZCBtb3VzZURvd24KLSAgICAgICAgLy8gaXMgcmVjZWl2ZWQgcHJpb3IgdG8gdGhlIGV4cGlyYXRpb24gb2YgdGhlIGRvdWJsZUNsaWNrIHRpbWUgdGhlbgotICAgICAgICAvLyB0aGUgY2VsbCBlZGl0b3Igd2lsbCBiZSBkZWFjdGl2YXRlZCBhbmQgYSBkb3VibGVDbGljayBldmVudCB3aWxsCi0gICAgICAgIC8vIGJlIHByb2Nlc3NlZC4KLSAgICAgICAgLy8KLSAgICAgICAgZG91YmxlQ2xpY2tFeHBpcmF0aW9uVGltZSA9IGV2ZW50LnRpbWUKLSAgICAgICAgICAgICAgICArIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldERvdWJsZUNsaWNrVGltZSgpOwotCi0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IGdldFNlbGVjdGlvbigpOwotICAgICAgICAvLyBEbyBub3QgZWRpdCBpZiBtb3JlIHRoYW4gb25lIHJvdyBpcyBzZWxlY3RlZC4KLSAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCAhPSAxKSB7Ci0gICAgICAgICAgICB0cmVlSXRlbSA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJlZUl0ZW0gPSBpdGVtc1swXTsKLSAgICAgICAgYWN0aXZhdGVDZWxsRWRpdG9yKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdENlbGxFZGl0b3JMaXN0ZW5lcigpIHsKLSAgICAgICAgY2VsbEVkaXRvckxpc3RlbmVyID0gbmV3IElDZWxsRWRpdG9yTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBlZGl0b3JWYWx1ZUNoYW5nZWQoYm9vbGVhbiBvbGRWYWxpZFN0YXRlLAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbGlkU3RhdGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUuCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbEVkaXRvcigpIHsKLSAgICAgICAgICAgICAgICBUcmVlRWRpdG9ySW1wbC50aGlzLmNhbmNlbEVkaXRpbmcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZSgpIHsKLSAgICAgICAgICAgICAgICBUcmVlRWRpdG9ySW1wbC50aGlzLmFwcGx5RWRpdG9yVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlcmUgaXMgYW4gYWN0aXZlIGNlbGwgZWRpdG9yLgotICAgICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgY2VsbCBlZGl0b3I7IG90aGVyd2lzZQotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0b3JBY3RpdmUoKSB7Ci0gICAgICAgIHJldHVybiBjZWxsRWRpdG9yICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgZWRpdG9yLAotICAgICAqIGJ5IGRlbGVnYXRpbmcgdG8gdGhlIGNlbGwgbW9kaWZpZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVFZGl0b3JWYWx1ZShDZWxsRWRpdG9yIGNlbGxFZGl0b3IsIEl0ZW0gdHJlZUl0ZW0pIHsKLSAgICAgICAgaWYgKGNlbGxNb2RpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBudWxsOwotICAgICAgICAgICAgaWYgKGNvbHVtblByb3BlcnRpZXMgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBjb2x1bW5OdW1iZXIgPCBjb2x1bW5Qcm9wZXJ0aWVzLmxlbmd0aCkKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IGNvbHVtblByb3BlcnRpZXNbY29sdW1uTnVtYmVyXTsKLSAgICAgICAgICAgIGNlbGxNb2RpZmllci5tb2RpZnkodHJlZUl0ZW0sIHByb3BlcnR5LCBjZWxsRWRpdG9yLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjZWxsIGVkaXRvcnMgZm9yIHRoZSByZWNlaXZlci4KLSAgICAgKiBAcGFyYW0gZWRpdG9ycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENlbGxFZGl0b3JzKENlbGxFZGl0b3JbXSBlZGl0b3JzKSB7Ci0gICAgICAgIHRoaXMuY2VsbEVkaXRvcnMgPSBlZGl0b3JzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2VsbCBtb2RpZmllciBmb3IgdGhlIHJlY2VpdmVyLgotICAgICAqIEBwYXJhbSBtb2RpZmllcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENlbGxNb2RpZmllcihJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyKSB7Ci0gICAgICAgIHRoaXMuY2VsbE1vZGlmaWVyID0gbW9kaWZpZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjb2x1bW4gcHJvcGVydGllcyBmb3IgdGhlIHJlY2VpdmVyLgotICAgICAqIEBwYXJhbSBjb2x1bW5Qcm9wZXJ0aWVzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sdW1uUHJvcGVydGllcyhTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMuY29sdW1uUHJvcGVydGllcyA9IGNvbHVtblByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgYWJzdHJhY3Qgdm9pZCBzZXRFZGl0b3IoQ29udHJvbCB3LCBJdGVtIGl0ZW0sIGludCBmQ29sdW1uTnVtYmVyKTsKLQotICAgIGFic3RyYWN0IHZvaWQgc2V0TGF5b3V0RGF0YShDZWxsRWRpdG9yLkxheW91dERhdGEgbGF5b3V0RGF0YSk7Ci0KLSAgICBhYnN0cmFjdCB2b2lkIHNldFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gYik7Ci0KLSAgICBhYnN0cmFjdCB2b2lkIHNob3dTZWxlY3Rpb24oKTsKLQotICAgIGFic3RyYWN0IHZvaWQgaGFuZGxlRG91YmxlQ2xpY2tFdmVudCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9UcmVlRXhwYW5zaW9uRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVHJlZUV4cGFuc2lvbkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NTBlOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9UcmVlRXhwYW5zaW9uRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi0vKioKLSAqIEV2ZW50IG9iamVjdCBkZXNjcmliaW5nIGEgdHJlZSBub2RlIGJlaW5nIGV4cGFuZGVkCi0gKiBvciBjb2xsYXBzZWQuIFRoZSBzb3VyY2Ugb2YgdGhlc2UgZXZlbnRzIGlzIHRoZSB0cmVlIHZpZXdlci4KLSAqCi0gKiBAc2VlIElUcmVlVmlld2VyTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRyZWVFeHBhbnNpb25FdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM2MTg0MTQ5MzAyMjc4MzUxODVMOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBlbGVtZW50IHRoYXQgd2FzIGV4cGFuZGVkIG9yIGNvbGxhcHNlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBlbGVtZW50OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBldmVudCBmb3IgdGhlIGdpdmVuIHNvdXJjZSBhbmQgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHRyZWUgdmlld2VyCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJlZUV4cGFuc2lvbkV2ZW50KEFic3RyYWN0VHJlZVZpZXdlciBzb3VyY2UsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHN1cGVyKHNvdXJjZSk7Ci0gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudCB0aGF0IGdvdCBleHBhbmRlZCBvciBjb2xsYXBzZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBldmVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG9yaWdpbmF0aW5nIHRyZWUgdmlld2VyCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0VHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkgewotICAgICAgICByZXR1cm4gKEFic3RyYWN0VHJlZVZpZXdlcikgc291cmNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVHJlZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVHJlZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2NGNjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1RyZWVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1RyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1RyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMGEzNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9UcmVlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9UcmVlUGF0aC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9UcmVlUGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWMxMmIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVHJlZVBhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogQSB0cmVlIHBhdGggZGVub3RlcyBhIG1vZGVsIGVsZW1lbnQgaW4gYSB0cmVlIHZpZXdlci4gVHJlZSBwYXRoIG9iamVjdHMgaGF2ZQotICogdmFsdWUgc2VtYW50aWNzLiBBIG1vZGVsIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSBwYXRoIG9mIGVsZW1lbnRzIGluIHRoZQotICogdHJlZSBmcm9tIHRoZSByb290IGVsZW1lbnQgdG8gdGhlIGxlYWYgZWxlbWVudC4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW5zdGFudGlhdGUgdGhpcyBjbGFzcy4gTm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyZWVQYXRoIHsKLQlwcml2YXRlIE9iamVjdFtdIHNlZ21lbnRzOwotCi0JcHJpdmF0ZSBpbnQgaGFzaDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBwYXRoIGlkZW50aWZ5aW5nIGEgbGVhZiBub2RlIGluIGEgdHJlZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VnbWVudHMKLQkgKiAgICAgICAgICAgIHBhdGggb2YgZWxlbWVudHMgdG8gYSBsZWFmIG5vZGUgaW4gYSB0cmVlLCBzdGFydGluZyB3aXRoIHRoZQotCSAqICAgICAgICAgICAgcm9vdCBlbGVtZW50Ci0JICovCi0JcHVibGljIFRyZWVQYXRoKE9iamVjdFtdIHNlZ21lbnRzKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoc2VnbWVudHMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKHNlZ21lbnRzW2ldKTsKLQkJfQotCQl0aGlzLnNlZ21lbnRzID0gc2VnbWVudHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoaXMgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGluZGV4IG9mIGVsZW1lbnQgdG8gcmV0dXJuCi0JICogQHJldHVybiBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlZ21lbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBzZWdtZW50c1tpbmRleF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgcGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBwYXRoCi0JICovCi0JcHVibGljIGludCBnZXRTZWdtZW50Q291bnQoKSB7Ci0JCXJldHVybiBzZWdtZW50cy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGlzIHBhdGguCi0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGlzIHBhdGgKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpcnN0U2VnbWVudCgpIHsKLQkJaWYgKHNlZ21lbnRzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzZWdtZW50c1swXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhpcyBwYXRoLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGlzIHBhdGgKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhc3RTZWdtZW50KCkgewotCQlpZiAoc2VnbWVudHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCWlmICghKG90aGVyIGluc3RhbmNlb2YgVHJlZVBhdGgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZXF1YWxzKChUcmVlUGF0aCkgb3RoZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWlmIChoYXNoID09IDApCi0JCQloYXNoID0gaGFzaENvZGUobnVsbCk7Ci0JCXJldHVybiBoYXNoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBoYXNoIGNvZGUgY29tcHV0ZWQgZnJvbSB0aGUgaGFzaCBjb2RlcyBvZiB0aGUgc2VnbWVudHMsIHVzaW5nCi0JICogdGhlIGdpdmVuIGNvbXBhcmVyIHRvIGNvbXB1dGUgdGhlIGhhc2ggY29kZXMgb2YgdGhlIHNlZ21lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBjb21wYXJlcgotCSAqICAgICAgICAgICAgY29tcGFyZXIgdG8gdXNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzZWdtZW50cycgaGFzaAotCSAqICAgICAgICAgICAgY29kZXMgc2hvdWxkIGJlIGNvbXB1dGVkIGJ5IGNhbGxpbmcgdGhlaXIgaGFzaENvZGUoKSBtZXRob2RzLgotCSAqIEByZXR1cm4gdGhlIGNvbXB1dGVkIGhhc2ggY29kZQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoSUVsZW1lbnRDb21wYXJlciBjb21wYXJlcikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbXBhcmVyID09IG51bGwpIHsKLQkJCQlyZXN1bHQgKz0gc2VnbWVudHNbaV0uaGFzaENvZGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ICs9IGNvbXBhcmVyLmhhc2hDb2RlKHNlZ21lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhdGggaXMgZXF1aXZhbGVudCB0byB0aGUgZ2l2ZW4gcGF0aCB1c2luZyB0aGUKLQkgKiBzcGVjaWZpZWQgY29tcGFyZXIgdG8gY29tcGFyZSBpbmRpdmlkdWFsIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBvdGhlclBhdGgKLQkgKiAgICAgICAgICAgIHRyZWUgcGF0aCB0byBjb21wYXJlIHRvCi0JICogQHBhcmFtIGNvbXBhcmVyCi0JICogICAgICAgICAgICBjb21wYXJhdG9yIHRvIHVzZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBzZWdtZW50cyBzaG91bGQgYmUKLQkgKiAgICAgICAgICAgIGNvbXBhcmVkIHVzaW5nIGVxdWFscygpCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBwYXRocyBhcmUgZXF1YWwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoVHJlZVBhdGggb3RoZXJQYXRoLCBJRWxlbWVudENvbXBhcmVyIGNvbXBhcmVyKSB7Ci0JCWlmIChvdGhlclBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHNlZ21lbnRzLmxlbmd0aCAhPSBvdGhlclBhdGguc2VnbWVudHMubGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29tcGFyZXIgPT0gbnVsbCkgewotCQkJCWlmICghc2VnbWVudHNbaV0uZXF1YWxzKG90aGVyUGF0aC5zZWdtZW50c1tpXSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFjb21wYXJlci5lcXVhbHMoc2VnbWVudHNbaV0sIG90aGVyUGF0aC5zZWdtZW50c1tpXSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYXRoIHN0YXJ0cyB3aXRoIHRoZSBzYW1lIHNlZ21lbnRzIGFzIHRoZSBnaXZlbgotCSAqIHBhdGgsIHVzaW5nIHRoZSBnaXZlbiBjb21wYXJlciB0byBjb21wYXJlIHNlZ21lbnRzLgotCSAqIAotCSAqIEBwYXJhbSB0cmVlUGF0aAotCSAqICAgICAgICAgICAgcGF0aCB0byBjb21wYXJlIHRvCi0JICogQHBhcmFtIGNvbXBhcmVyCi0JICogICAgICAgICAgICB0aGUgY29tcGFyZXIgdG8gdXNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBlcXVhbHMoKSBzaG91bGQKLQkgKiAgICAgICAgICAgIGJlIHVzZWQgdG8gY29tcGFyZSBzZWdtZW50cwotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBhIHByZWZpeCBvZiB0aGlzIHBhdGgsIG9yIHRoZSBzYW1lIGFzCi0JICogICAgICAgICB0aGlzIHBhdGgKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKFRyZWVQYXRoIHRyZWVQYXRoLCBJRWxlbWVudENvbXBhcmVyIGNvbXBhcmVyKSB7Ci0JCWludCB0aGlzU2VnbWVudENvdW50ID0gZ2V0U2VnbWVudENvdW50KCk7Ci0JCWludCBvdGhlclNlZ21lbnRDb3VudCA9IHRyZWVQYXRoLmdldFNlZ21lbnRDb3VudCgpOwotCQlpZiAob3RoZXJTZWdtZW50Q291bnQgPT0gdGhpc1NlZ21lbnRDb3VudCkgewotCQkJcmV0dXJuIGVxdWFscyh0cmVlUGF0aCwgY29tcGFyZXIpOwotCQl9Ci0JCWlmIChvdGhlclNlZ21lbnRDb3VudCA+IHRoaXNTZWdtZW50Q291bnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyU2VnbWVudENvdW50OyBpKyspIHsKLQkJCU9iamVjdCBvdGhlclNlZ21lbnQgPSB0cmVlUGF0aC5nZXRTZWdtZW50KGkpOwotCQkJaWYgKGNvbXBhcmVyID09IG51bGwpIHsKLQkJCQlpZiAoIW90aGVyU2VnbWVudC5lcXVhbHMoc2VnbWVudHNbaV0pKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICghY29tcGFyZXIuZXF1YWxzKG90aGVyU2VnbWVudCwgc2VnbWVudHNbaV0pKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyB0cmVlIHBhdGggd2l0aCBvbmUgc2VnbWVudCByZW1vdmVkIGZyb20gdGhlIGVuZCwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHRyZWUgcGF0aCBoYXMgbm8gc2VnbWVudHMuCi0JICogQHJldHVybiBhIHRyZWUgcGF0aAotCSAqLwotCXB1YmxpYyBUcmVlUGF0aCBnZXRQYXJlbnRQYXRoKCkgewotCQlpbnQgc2VnbWVudENvdW50ID0gZ2V0U2VnbWVudENvdW50KCk7Ci0JCWlmIChzZWdtZW50Q291bnQgPD0gMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJT2JqZWN0W10gcGFyZW50U2VnbWVudHMgPSBuZXcgT2JqZWN0W3NlZ21lbnRDb3VudCAtIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHNlZ21lbnRzLCAwLCBwYXJlbnRTZWdtZW50cywgMCwgc2VnbWVudENvdW50IC0gMSk7Ci0JCXJldHVybiBuZXcgVHJlZVBhdGgocGFyZW50U2VnbWVudHMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgdHJlZSBwYXRoIHdpdGggdGhlIGdpdmVuIHNlZ21lbnQgYWRkZWQgYXQgdGhlIGVuZC4KLQkgKiBAcGFyYW0gbmV3U2VnbWVudCAKLQkgKiBAcmV0dXJuIGEgdHJlZSBwYXRoCi0JICovCi0JcHVibGljIFRyZWVQYXRoIGNyZWF0ZUNoaWxkUGF0aChPYmplY3QgbmV3U2VnbWVudCkgewotCQlpbnQgc2VnbWVudENvdW50ID0gZ2V0U2VnbWVudENvdW50KCk7Ci0JCU9iamVjdFtdIGNoaWxkU2VnbWVudHMgPSBuZXcgT2JqZWN0W3NlZ21lbnRDb3VudCArIDFdOwotCQlpZihzZWdtZW50Q291bnQ+MCkgewotCQkJU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgMCwgY2hpbGRTZWdtZW50cywgMCwgc2VnbWVudENvdW50KTsKLQkJfQotCQljaGlsZFNlZ21lbnRzW3NlZ21lbnRDb3VudF0gPSBuZXdTZWdtZW50OwotCQlyZXR1cm4gbmV3IFRyZWVQYXRoKGNoaWxkU2VnbWVudHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVHJlZVNlbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9UcmVlU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZGMxODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9UcmVlU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+SVRyZWVTZWxlY3Rpb248L2NvZGU+IGludGVyZmFjZSwKLSAqIHN1aXRhYmxlIGZvciBpbnN0YW50aWF0aW5nLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlU2VsZWN0aW9uIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdGlvbiBpbXBsZW1lbnRzIElUcmVlU2VsZWN0aW9uIHsKLQotCS8qIEltcGxlbWVudGF0aW9uIG5vdGUuICBUaGlzIGNsYXNzIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdGlvbiBiZWNhdXNlIG1hbnkgcHJlLWV4aXN0aW5nCi0JICogSkZhY2Ugdmlld2VyIGNsaWVudHMgYXNzdW1lZCB0aGF0IHRoZSBvbmx5IGltcGxlbWVudGF0aW9uIG9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIAotCSAqIHdhcyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLiAgQnkgZXh0ZW5kaW5nIFN0cnVjdHVyZWRTZWxlY3Rpb24gcmF0aGVyIHRoYW4gaW1wbGVtZW50aW5nCi0JICogSVRyZWVTZWxlY3Rpb24gZGlyZWN0bHksIHdlIGF2b2lkIHRoaXMgcHJvYmxlbS4KLQkgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgQnVnIDEyMTkzOSBbVmlld2Vyc10gVHJlZVNlbGVjdGlvbiBzaG91bGQgc3ViY2xhc3MgU3RydWN0dXJlZFNlbGVjdGlvbi4gCi0JICovCi0JCi0JcHJpdmF0ZSBUcmVlUGF0aFtdIHBhdGhzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYW5vbmljYWwgZW1wdHkgc2VsZWN0aW9uLiBUaGlzIHNlbGVjdGlvbiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmVlU2VsZWN0aW9uIEVNUFRZID0gbmV3IFRyZWVTZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIEludGVybmFsIC0gRXh0cmFjdHMgdGhlIGxhc3Qgc2VnbWVudHMgb2YgdGhlIGdpdmVuIHBhdGhzIGludG8gYSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBwYXRocyB0aGUgcGF0aHMKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGxhc3Qgc2VnbWVudHMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGxhc3RTZWdtZW50cyhUcmVlUGF0aFtdIHBhdGhzKSB7Ci0JCWludCBzaXplID0gcGF0aHMubGVuZ3RoOwotCQlMaXN0IHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzZWxlY3Rpb24uYWRkKHBhdGhzW2ldLmdldExhc3RTZWdtZW50KCkpOwotCQl9Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGVsZW1lbnRzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHRyZWUKLQkgKiBwYXRocy4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aHMKLQkgKiAgICAgICAgICAgIHRyZWUgcGF0aHMKLQkgKi8KLQlwdWJsaWMgVHJlZVNlbGVjdGlvbihUcmVlUGF0aFtdIHBhdGhzKSB7Ci0JCXN1cGVyKGxhc3RTZWdtZW50cyhwYXRocykpOwotICAgICAgICB0aGlzLnBhdGhzID0gbmV3IFRyZWVQYXRoW3BhdGhzLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGF0aHMsIDAsIHRoaXMucGF0aHMsIDAsIHBhdGhzLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgZWxlbWVudHMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gdHJlZQotCSAqIHBhdGguCi0JICogCi0JICogQHBhcmFtIHRyZWVQYXRoCi0JICogICAgICAgICAgICB0cmVlIHBhdGgsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBhbiBlbXB0eSBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgVHJlZVNlbGVjdGlvbihUcmVlUGF0aCB0cmVlUGF0aCkgewotCQl0aGlzKHRyZWVQYXRoICE9IG51bGwgPyBuZXcgVHJlZVBhdGhbXSB7IHRyZWVQYXRoIH0gOiBuZXcgVHJlZVBhdGhbMF0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZW1wdHkgc2VsZWN0aW9uLiBTZWUgYWxzbyB0aGUgc3RhdGljIGZpZWxkCi0JICogPGNvZGU+RU1QVFk8L2NvZGU+IHdoaWNoIGNvbnRhaW5zIGFuIGVtcHR5IHNlbGVjdGlvbiBzaW5nbGV0b24uCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IFRyZWVTZWxlY3Rpb24uRU1QVFkgaXMgbm90IGVxdWFscygpIHRvIFN0cnVjdHVyZWRWaWV3ZXIuRU1QVFkuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI0VNUFRZCi0JICovCi0JcHVibGljIFRyZWVTZWxlY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uKSB7Ci0JCQlUcmVlU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChUcmVlU2VsZWN0aW9uKSBvYmo7Ci0JCQlpbnQgc2l6ZSA9IHNpemUoKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IHNpemUpIHsKLQkJCQlpZiAoc2l6ZSA+IDApIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKCFwYXRoc1tpXS5lcXVhbHMoc2VsZWN0aW9uLnBhdGhzW2ldKSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgY29kZSA9IGdldENsYXNzKCkuaGFzaENvZGUoKTsKLQkJaWYgKHBhdGhzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCQljb2RlID0gY29kZSAqIDE3ICsgcGF0aHNbaV0uaGFzaENvZGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVTZWxlY3Rpb24jZ2V0UGF0aHMoKQotCSAqLwotCXB1YmxpYyBUcmVlUGF0aFtdIGdldFBhdGhzKCkgewotCQlyZXR1cm4gcGF0aHM9PW51bGwgPyBuZXcgVHJlZVBhdGhbMF0gOiAoVHJlZVBhdGhbXSkgcGF0aHMuY2xvbmUoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1RyZWVWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmVhMGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVHJlZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVHJlZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogQSBjb25jcmV0ZSB2aWV3ZXIgYmFzZWQgb24gYW4gU1dUIDxjb2RlPlRyZWU8L2NvZGU+IGNvbnRyb2wuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSB0aGUgdmlld2VyIGZyYW1ld29yay4gSXQKLSAqIGlzIGRlc2lnbmVkIHRvIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgcHJlLWV4aXN0aW5nIFNXVCB0cmVlIGNvbnRyb2wgYW5kCi0gKiBjb25maWd1cmVkIHdpdGggYSBkb21haW4tc3BlY2lmaWMgY29udGVudCBwcm92aWRlciwgbGFiZWwgcHJvdmlkZXIsIGVsZW1lbnQKLSAqIGZpbHRlciAob3B0aW9uYWwpLCBhbmQgZWxlbWVudCBzb3J0ZXIgKG9wdGlvbmFsKS4KLSAqIDwvcD4KLSAqIDxwPgotICogQ29udGVudCBwcm92aWRlcnMgZm9yIHRyZWUgdmlld2VycyBtdXN0IGltcGxlbWVudCB0aGUKLSAqIDxjb2RlPklUcmVlQ29udGVudFByb3ZpZGVyPC9jb2RlPiBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlVmlld2VyIGV4dGVuZHMgQWJzdHJhY3RUcmVlVmlld2VyIHsKLQotCS8qKgotCSAqIFRyZWVDb2xvckFuZEZvbnRDb2xsZWN0b3IgaXMgYW4gaGVscGVyIGNsYXNzIGZvciBjb2xvciBhbmQgZm9udCBzdXBwb3J0Ci0JICogZm9yIHRyZWVzIHRoYXQgc3VwcG9ydCB0aGUgSVRhYmxlRm9udFByb3ZpZGVyIGFuZCB0aGUKLQkgKiBJVGFibGVDb2xvclByb3ZpZGVyLgotCSAqIAotCSAqIEBzZWUgSVRhYmxlQ29sb3JQcm92aWRlcgotCSAqIEBzZWUgSVRhYmxlRm9udFByb3ZpZGVyCi0JICovCi0KLQlwcml2YXRlIGNsYXNzIFRyZWVDb2xvckFuZEZvbnRDb2xsZWN0b3IgewotCi0JCUlUYWJsZUZvbnRQcm92aWRlciBmb250UHJvdmlkZXIgPSBudWxsOwotCi0JCUlUYWJsZUNvbG9yUHJvdmlkZXIgY29sb3JQcm92aWRlciA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuIFNldCB0aGUgY29sb3IgYW5kIGZvbnQgcHJvdmlkZXJzCi0JCSAqIGlmIHByb3ZpZGVyIGNhbiBiZSBjYXN0IHRvIHRoZSBjb3JyZWN0IHR5cGUuCi0JCSAqIAotCQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkJICogICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIKLQkJICovCi0JCXB1YmxpYyBUcmVlQ29sb3JBbmRGb250Q29sbGVjdG9yKElCYXNlTGFiZWxQcm92aWRlciBwcm92aWRlcikgewotCQkJaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgSVRhYmxlRm9udFByb3ZpZGVyKQotCQkJCWZvbnRQcm92aWRlciA9IChJVGFibGVGb250UHJvdmlkZXIpIHByb3ZpZGVyOwotCQkJaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgSVRhYmxlQ29sb3JQcm92aWRlcikKLQkJCQljb2xvclByb3ZpZGVyID0gKElUYWJsZUNvbG9yUHJvdmlkZXIpIHByb3ZpZGVyOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd2l0aCBubyBjb2xvciBhbmQgZm9udCBwcm92aWRlcnMuCi0JCSAqLwotCQlwdWJsaWMgVHJlZUNvbG9yQW5kRm9udENvbGxlY3RvcigpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXQgdGhlIGZvbnRzIGFuZCBjb2xvcnMgZm9yIHRoZSB0cmVlSXRlbSBpZiB0aGVyZSBpcyBhIGNvbG9yIGFuZAotCQkgKiBmb250IHByb3ZpZGVyIGF2YWlsYWJsZS4KLQkJICogCi0JCSAqIEBwYXJhbSB0cmVlSXRlbQotCQkgKiAgICAgICAgICAgIFRoZSBpdGVtIHRvIHVwZGF0ZS4KLQkJICogQHBhcmFtIGVsZW1lbnQKLQkJICogICAgICAgICAgICBUaGUgZWxlbWVudCBiZWluZyByZXByZXNlbnRlZAotCQkgKiBAcGFyYW0gY29sdW1uCi0JCSAqICAgICAgICAgICAgVGhlIGNvbHVtbiBpbmRleAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0Rm9udHNBbmRDb2xvcnMoVHJlZUl0ZW0gdHJlZUl0ZW0sIE9iamVjdCBlbGVtZW50LAotCQkJCWludCBjb2x1bW4pIHsKLQkJCWlmIChjb2xvclByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKGNvbHVtbiwgY29sb3JQcm92aWRlci5nZXRCYWNrZ3JvdW5kKAotCQkJCQkJZWxlbWVudCwgY29sdW1uKSk7Ci0JCQkJdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZChjb2x1bW4sIGNvbG9yUHJvdmlkZXIuZ2V0Rm9yZWdyb3VuZCgKLQkJCQkJCWVsZW1lbnQsIGNvbHVtbikpOwotCQkJfQotCQkJaWYgKGZvbnRQcm92aWRlciAhPSBudWxsKQotCQkJCXRyZWVJdGVtLnNldEZvbnQoY29sdW1uLCBmb250UHJvdmlkZXIuZ2V0Rm9udChlbGVtZW50LCBjb2x1bW4pKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwgdHJlZSB2aWV3ZXIgaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHJpdmF0ZSBUcmVlRWRpdG9ySW1wbCB0cmVlVmlld2VySW1wbDsKLQotCS8qKgotCSAqIFRoaXMgdmlld2VyJ3MgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIFRyZWUgdHJlZTsKLQotCS8qKgotCSAqIFRoaXMgdmlld2VyJ3MgdHJlZSBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBUcmVlRWRpdG9yIHRyZWVFZGl0b3I7Ci0KLQkvKioKLQkgKiBUaGUgY29sb3IgYW5kIGZvbnQgY29sbGVjdG9yIGZvciB0aGUgY2VsbHMuCi0JICovCi0JcHJpdmF0ZSBUcmVlQ29sb3JBbmRGb250Q29sbGVjdG9yIHRyZWVDb2xvckFuZEZvbnQgPSBuZXcgVHJlZUNvbG9yQW5kRm9udENvbGxlY3RvcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRyZWUgdmlld2VyIG9uIGEgbmV3bHktY3JlYXRlZCB0cmVlIGNvbnRyb2wgdW5kZXIgdGhlIGdpdmVuCi0JICogcGFyZW50LiBUaGUgdHJlZSBjb250cm9sIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIFNXVCBzdHlsZSBiaXRzCi0JICogPGNvZGU+TVVMVEksIEhfU0NST0xMLCBWX1NDUk9MTCw8L2NvZGU+IGFuZCA8Y29kZT5CT1JERVI8L2NvZGU+LiBUaGUKLQkgKiB2aWV3ZXIgaGFzIG5vIGlucHV0LCBubyBjb250ZW50IHByb3ZpZGVyLCBhIGRlZmF1bHQgbGFiZWwgcHJvdmlkZXIsIG5vCi0JICogc29ydGVyLCBhbmQgbm8gZmlsdGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdHJlZSB2aWV3ZXIgb24gYSBuZXdseS1jcmVhdGVkIHRyZWUgY29udHJvbCB1bmRlciB0aGUgZ2l2ZW4KLQkgKiBwYXJlbnQuIFRoZSB0cmVlIGNvbnRyb2wgaXMgY3JlYXRlZCB1c2luZyB0aGUgZ2l2ZW4gU1dUIHN0eWxlIGJpdHMuIFRoZQotCSAqIHZpZXdlciBoYXMgbm8gaW5wdXQsIG5vIGNvbnRlbnQgcHJvdmlkZXIsIGEgZGVmYXVsdCBsYWJlbCBwcm92aWRlciwgbm8KLQkgKiBzb3J0ZXIsIGFuZCBubyBmaWx0ZXJzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIFNXVCBzdHlsZSBiaXRzIHVzZWQgdG8gY3JlYXRlIHRoZSB0cmVlLgotCSAqLwotCXB1YmxpYyBUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQl0aGlzKG5ldyBUcmVlKHBhcmVudCwgc3R5bGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdHJlZSB2aWV3ZXIgb24gdGhlIGdpdmVuIHRyZWUgY29udHJvbC4gVGhlIHZpZXdlciBoYXMgbm8gaW5wdXQsCi0JICogbm8gY29udGVudCBwcm92aWRlciwgYSBkZWZhdWx0IGxhYmVsIHByb3ZpZGVyLCBubyBzb3J0ZXIsIGFuZCBubyBmaWx0ZXJzLgotCSAqIAotCSAqIEBwYXJhbSB0cmVlCi0JICogICAgICAgICAgICB0aGUgdHJlZSBjb250cm9sCi0JICovCi0JcHVibGljIFRyZWVWaWV3ZXIoVHJlZSB0cmVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudHJlZSA9IHRyZWU7Ci0JCWhvb2tDb250cm9sKHRyZWUpOwotCQl0cmVlRWRpdG9yID0gbmV3IFRyZWVFZGl0b3IodHJlZSk7Ci0JCWluaXRUcmVlVmlld2VySW1wbCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gQWJzdHJhY3RUcmVlVmlld2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRyZWVMaXN0ZW5lcihDb250cm9sIGMsIFRyZWVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkoKFRyZWUpIGMpLmFkZFRyZWVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ2FuY2VscyBhIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBlZGl0b3IuIEFsbCBjaGFuZ2VzIGFscmVhZHkgZG9uZSBpbiB0aGUKLQkgKiBjZWxsIGVkaXRvciBhcmUgbG9zdC4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgY2FuY2VsRWRpdGluZygpIHsKLQkJdHJlZVZpZXdlckltcGwuY2FuY2VsRWRpdGluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gQWJzdHJhY3RUcmVlVmlld2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVXBkYXRlSXRlbShmaW5hbCBJdGVtIGl0ZW0sIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghKGl0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkpCi0JCQlyZXR1cm47Ci0JCVRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKSBpdGVtOwotCQlpZiAodHJlZUl0ZW0uaXNEaXNwb3NlZCgpKSB7Ci0JCQl1bm1hcEVsZW1lbnQoZWxlbWVudCwgdHJlZUl0ZW0pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZ2V0Q29sb3JBbmRGb250Q29sbGVjdG9yKCkuc2V0Rm9udHNBbmRDb2xvcnMoZWxlbWVudCk7Ci0KLQkJSUJhc2VMYWJlbFByb3ZpZGVyIHByb3YgPSBnZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCUlUYWJsZUxhYmVsUHJvdmlkZXIgdHByb3YgPSBudWxsOwotCQlJTGFiZWxQcm92aWRlciBscHJvdiA9IG51bGw7Ci0JCUlWaWV3ZXJMYWJlbFByb3ZpZGVyIHZwcm92ID0gbnVsbDsKLQkJCi0JCWlmKHByb3YgaW5zdGFuY2VvZiBJTGFiZWxQcm92aWRlcikKLQkJCWxwcm92ID0gKElMYWJlbFByb3ZpZGVyKSBwcm92OwotCQkKLQkJaWYgKHByb3YgaW5zdGFuY2VvZiBJVmlld2VyTGFiZWxQcm92aWRlcikgewotCQkJdnByb3YgPSAoSVZpZXdlckxhYmVsUHJvdmlkZXIpIHByb3Y7Ci0JCX0gCi0JCQotCQlpZiAocHJvdiBpbnN0YW5jZW9mIElUYWJsZUxhYmVsUHJvdmlkZXIpIHsKLQkJCXRwcm92ID0gKElUYWJsZUxhYmVsUHJvdmlkZXIpIHByb3Y7Ci0JCX0KLQkJCi0JCQotCQlpbnQgY29sdW1uQ291bnQgPSB0cmVlLmdldENvbHVtbkNvdW50KCk7Ci0JCWlmIChjb2x1bW5Db3VudCA9PSAwKSB7Ly8gSWYgbm8gY29sdW1ucyB3ZXJlIGNyZWF0ZWQgdXNlIHRoZSBsYWJlbAotCQkJCQkJCQkvLyBwcm92aWRlcgotCi0JCQlWaWV3ZXJMYWJlbCB1cGRhdGVMYWJlbCA9IG5ldyBWaWV3ZXJMYWJlbCh0cmVlSXRlbS5nZXRUZXh0KCksCi0JCQkJCXRyZWVJdGVtLmdldEltYWdlKCkpOwotCQkJaWYodnByb3YgIT0gbnVsbCkKLQkJCQlidWlsZExhYmVsKHVwZGF0ZUxhYmVsLGVsZW1lbnQsdnByb3YpOwotCQkJZWxzZXsKLQkJCQlpZihscHJvdiAhPSBudWxsKQotCQkJCQlidWlsZExhYmVsKHVwZGF0ZUxhYmVsLGVsZW1lbnQsbHByb3YpOwotCQkJfQotCi0JCQkvLyBBcyBpdCBpcyBwb3NzaWJsZSBmb3IgdXNlciBjb2RlIHRvIHJ1biB0aGUgZXZlbnQKLQkJCS8vIGxvb3AgY2hlY2sgaGVyZS4KLQkJCWlmICh0cmVlSXRlbS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQl1bm1hcEVsZW1lbnQoZWxlbWVudCwgdHJlZUl0ZW0pOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKHVwZGF0ZUxhYmVsLmhhc05ld1RleHQoKSkKLQkJCQl0cmVlSXRlbS5zZXRUZXh0KHVwZGF0ZUxhYmVsLmdldFRleHQoKSk7Ci0JCQlpZiAodXBkYXRlTGFiZWwuaGFzTmV3SW1hZ2UoKSkKLQkJCQl0cmVlSXRlbS5zZXRJbWFnZSh1cGRhdGVMYWJlbC5nZXRJbWFnZSgpKTsKLQotCQl9IGVsc2Ugey8vIFVzZSB0aGUgdGFibGUgYmFzZWQgc3VwcG9ydAotCQkJZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgY29sdW1uQ291bnQ7IGNvbHVtbisrKSB7Ci0JCQkJLy8gU2ltaWxhciBjb2RlIGluIFRhYmxlVmlld2VyLmRvVXBkYXRlSXRlbSgpCi0JCQkJU3RyaW5nIHRleHQgPSAiIjsvLyROT04tTkxTLTEkCi0JCQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkJCXRyZWVDb2xvckFuZEZvbnQuc2V0Rm9udHNBbmRDb2xvcnModHJlZUl0ZW0sIGVsZW1lbnQsIGNvbHVtbik7Ci0KLQkJCQlpZiAodHByb3YgPT0gbnVsbCkgewotCQkJCQlpZiAoY29sdW1uID09IDApIHsKLQkJCQkJCVZpZXdlckxhYmVsIHVwZGF0ZUxhYmVsID0gbmV3IFZpZXdlckxhYmVsKHRyZWVJdGVtCi0JCQkJCQkJCS5nZXRUZXh0KCksIHRyZWVJdGVtLmdldEltYWdlKCkpOwotCQkJCQkJaWYodnByb3YgIT0gbnVsbCkKLQkJCQkJCQlidWlsZExhYmVsKHVwZGF0ZUxhYmVsLGVsZW1lbnQsdnByb3YpOwotCQkJCQkJZWxzZXsKLQkJCQkJCQlpZihscHJvdiAhPSBudWxsKQotCQkJCQkJCQlidWlsZExhYmVsKHVwZGF0ZUxhYmVsLGVsZW1lbnQsbHByb3YpOwotCQkJCQkJfQotCi0JCQkJCQkvLyBBcyBpdCBpcyBwb3NzaWJsZSBmb3IgdXNlciBjb2RlIHRvIHJ1biB0aGUgZXZlbnQKLQkJCQkJCS8vIGxvb3AgY2hlY2sgaGVyZS4KLQkJCQkJCWlmICh0cmVlSXRlbS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQl1bm1hcEVsZW1lbnQoZWxlbWVudCwgdHJlZUl0ZW0pOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQkJdGV4dCA9IHVwZGF0ZUxhYmVsLmdldFRleHQoKTsKLQkJCQkJCWltYWdlID0gdXBkYXRlTGFiZWwuZ2V0SW1hZ2UoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRleHQgPSB0cHJvdi5nZXRDb2x1bW5UZXh0KGVsZW1lbnQsIGNvbHVtbik7Ci0JCQkJCWltYWdlID0gdHByb3YuZ2V0Q29sdW1uSW1hZ2UoZWxlbWVudCwgY29sdW1uKTsKLQkJCQl9Ci0KLQkJCQkvLyBBdm9pZCBzZXR0aW5nIHRleHQgdG8gbnVsbAotCQkJCWlmICh0ZXh0ID09IG51bGwpCi0JCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXRyZWVJdGVtLnNldFRleHQoY29sdW1uLCB0ZXh0KTsKLQkJCQlpZiAodHJlZUl0ZW0uZ2V0SW1hZ2UoY29sdW1uKSAhPSBpbWFnZSkgewotCQkJCQl0cmVlSXRlbS5zZXRJbWFnZShjb2x1bW4sIGltYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZ2V0Q29sb3JBbmRGb250Q29sbGVjdG9yKCkuYXBwbHlGb250c0FuZENvbG9ycyh0cmVlSXRlbSk7Ci0JfQotCi0JLyoqCi0JICogU3RhcnRzIGVkaXRpbmcgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIGNvbHVtbiBudW1iZXIKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgZWRpdEVsZW1lbnQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW4pIHsKLQkJdHJlZVZpZXdlckltcGwuZWRpdEVsZW1lbnQoZWxlbWVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjZWxsIGVkaXRvcnMgb2YgdGhpcyB0cmVlIHZpZXdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNlbGwgZWRpdG9ycwotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgQ2VsbEVkaXRvcltdIGdldENlbGxFZGl0b3JzKCkgewotCQlyZXR1cm4gdHJlZVZpZXdlckltcGwuZ2V0Q2VsbEVkaXRvcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjZWxsIG1vZGlmaWVyIG9mIHRoaXMgdHJlZSB2aWV3ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgY2VsbCBtb2RpZmllcgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgSUNlbGxNb2RpZmllciBnZXRDZWxsTW9kaWZpZXIoKSB7Ci0JCXJldHVybiB0cmVlVmlld2VySW1wbC5nZXRDZWxsTW9kaWZpZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIEFic3RyYWN0VHJlZVZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlbVtdIGdldENoaWxkcmVuKFdpZGdldCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgVHJlZUl0ZW0pCi0JCQlyZXR1cm4gKChUcmVlSXRlbSkgbykuZ2V0SXRlbXMoKTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBUcmVlKQotCQkJcmV0dXJuICgoVHJlZSkgbykuZ2V0SXRlbXMoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIHByb3BlcnRpZXMgb2YgdGhpcyB0cmVlIHZpZXdlci4gVGhlIHByb3BlcnRpZXMgbXVzdAotCSAqIGNvcnJlc3BvbmQgd2l0aCB0aGUgY29sdW1ucyBvZiB0aGUgdHJlZSBjb250cm9sLiBUaGV5IGFyZSB1c2VkIHRvCi0JICogaWRlbnRpZnkgdGhlIGNvbHVtbiBpbiBhIGNlbGwgbW9kaWZpZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBjb2x1bW4gcHJvcGVydGllcwotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q29sdW1uUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRyZWVWaWV3ZXJJbXBsLmdldENvbHVtblByb3BlcnRpZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIFZpZXdlci4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gdHJlZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIEFic3RyYWN0VHJlZVZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFeHBhbmRlZChJdGVtIGl0ZW0pIHsKLQkJcmV0dXJuICgoVHJlZUl0ZW0pIGl0ZW0pLmdldEV4cGFuZGVkKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBTdHJ1Y3R1cmVkVmlld2VyLgotCSAqLwotCXByb3RlY3RlZCBJdGVtIGdldEl0ZW0oaW50IHgsIGludCB5KSB7Ci0JCXJldHVybiBnZXRUcmVlKCkuZ2V0SXRlbShnZXRUcmVlKCkudG9Db250cm9sKG5ldyBQb2ludCh4LCB5KSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gQWJzdHJhY3RUcmVlVmlld2VyLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0SXRlbUNvdW50KENvbnRyb2wgd2lkZ2V0KSB7Ci0JCXJldHVybiAoKFRyZWUpIHdpZGdldCkuZ2V0SXRlbUNvdW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBBYnN0cmFjdFRyZWVWaWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRJdGVtQ291bnQoSXRlbSBpdGVtKSB7Ci0JCXJldHVybiAoKFRyZWVJdGVtKSBpdGVtKS5nZXRJdGVtQ291bnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIEFic3RyYWN0VHJlZVZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlbVtdIGdldEl0ZW1zKEl0ZW0gaXRlbSkgewotCQlyZXR1cm4gKChUcmVlSXRlbSkgaXRlbSkuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHJlZSB2aWV3ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5WaWV3ZXI8L2NvZGU+IGZyYW1ld29yawotCSAqIG1ldGhvZCBlbnN1cmVzIHRoYXQgdGhlIGdpdmVuIGxhYmVsIHByb3ZpZGVyIGlzIGFuIGluc3RhbmNlIG9mIGVpdGhlcgotCSAqIDxjb2RlPklUYWJsZUxhYmVsUHJvdmlkZXI8L2NvZGU+IG9yIDxjb2RlPklMYWJlbFByb3ZpZGVyPC9jb2RlPi4gSWYKLQkgKiBpdCBpcyBhbiA8Y29kZT5JVGFibGVMYWJlbFByb3ZpZGVyPC9jb2RlPiwgdGhlbiBpdCBwcm92aWRlcyBhIHNlcGFyYXRlCi0JICogbGFiZWwgdGV4dCBhbmQgaW1hZ2UgZm9yIGVhY2ggY29sdW1uLiBJZiBpdCBpcyBhbgotCSAqIDxjb2RlPklMYWJlbFByb3ZpZGVyPC9jb2RlPiwgdGhlbiBpdCBwcm92aWRlcyBvbmx5IHRoZSBsYWJlbCB0ZXh0IGFuZAotCSAqIGltYWdlIGZvciB0aGUgZmlyc3QgY29sdW1uLCBhbmQgYW55IHJlbWFpbmluZyBjb2x1bW5zIGFyZSBibGFuay4KLQkgKi8KLQlwdWJsaWMgSUJhc2VMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBBYnN0cmFjdFRyZWVWaWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIEl0ZW0gZ2V0UGFyZW50SXRlbShJdGVtIGl0ZW0pIHsKLQkJcmV0dXJuICgoVHJlZUl0ZW0pIGl0ZW0pLmdldFBhcmVudEl0ZW0oKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBBYnN0cmFjdFRyZWVWaWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIEl0ZW1bXSBnZXRTZWxlY3Rpb24oQ29udHJvbCB3aWRnZXQpIHsKLQkJcmV0dXJuICgoVHJlZSkgd2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgdHJlZSB2aWV3ZXIncyB0cmVlIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgdHJlZSBjb250cm9sCi0JICovCi0JcHVibGljIFRyZWUgZ2V0VHJlZSgpIHsKLQkJcmV0dXJuIHRyZWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlciNob29rQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhvb2tDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotCQlzdXBlci5ob29rQ29udHJvbChjb250cm9sKTsKLQkJVHJlZSB0cmVlQ29udHJvbCA9IChUcmVlKSBjb250cm9sOwotCQl0cmVlQ29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJdHJlZVZpZXdlckltcGwuaGFuZGxlTW91c2VEb3duKGUpOwotCQkJfQotCQl9KTsKLQkJaWYgKCh0cmVlQ29udHJvbC5nZXRTdHlsZSgpICYgU1dULlZJUlRVQUwpICE9IDApIHsKLQkJCXRyZWVDb250cm9sLmFkZExpc3RlbmVyKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIoKXsKLQotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChnZXRDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIElMYXp5VHJlZUNvbnRlbnRQcm92aWRlcikgewotCQkJCQkJSUxhenlUcmVlQ29udGVudFByb3ZpZGVyIGxhenlDb250ZW50UHJvdmlkZXIgPSAoSUxhenlUcmVlQ29udGVudFByb3ZpZGVyKSBnZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJCQlUcmVlSXRlbSBwYXJlbnRJdGVtID0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQkJCQlPYmplY3QgcGFyZW50OwotCQkJCQkJaW50IGluZGV4OwotCQkJCQkJaWYgKHBhcmVudEl0ZW0gIT0gbnVsbCkgewotCQkJCQkJCXBhcmVudCA9IHBhcmVudEl0ZW0uZ2V0RGF0YSgpOwotCQkJCQkJCWluZGV4ID0gcGFyZW50SXRlbS5pbmRleE9mKGl0ZW0pOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwYXJlbnQgPSBnZXRJbnB1dCgpOwotCQkJCQkJCWluZGV4ID0gZ2V0VHJlZSgpLmluZGV4T2YoaXRlbSk7Ci0JCQkJCQl9Ci0JCQkJCQlsYXp5Q29udGVudFByb3ZpZGVyLnVwZGF0ZUVsZW1lbnQocGFyZW50LCBpbmRleCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB0cmVlIHZpZXdlciBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdFRyZWVWaWV3ZXJJbXBsKCkgewotCQl0cmVlVmlld2VySW1wbCA9IG5ldyBUcmVlRWRpdG9ySW1wbCh0aGlzKSB7Ci0JCQlSZWN0YW5nbGUgZ2V0Qm91bmRzKEl0ZW0gaXRlbSwgaW50IGNvbHVtbk51bWJlcikgewotCQkJCXJldHVybiAoKFRyZWVJdGVtKSBpdGVtKS5nZXRCb3VuZHMoY29sdW1uTnVtYmVyKTsKLQkJCX0KLQotCQkJaW50IGdldENvbHVtbkNvdW50KCkgewotCQkJCXJldHVybiBnZXRUcmVlKCkuZ2V0Q29sdW1uQ291bnQoKTsKLQkJCX0KLQotCQkJSXRlbVtdIGdldFNlbGVjdGlvbigpIHsKLQkJCQlyZXR1cm4gZ2V0VHJlZSgpLmdldFNlbGVjdGlvbigpOwotCQkJfQotCi0JCQl2b2lkIHNldEVkaXRvcihDb250cm9sIHcsIEl0ZW0gaXRlbSwgaW50IGNvbHVtbk51bWJlcikgewotCQkJCXRyZWVFZGl0b3Iuc2V0RWRpdG9yKHcsIChUcmVlSXRlbSkgaXRlbSwgY29sdW1uTnVtYmVyKTsKLQkJCX0KLQotCQkJdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGIpIHsKLQkJCQlUcmVlVmlld2VyLnRoaXMuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgYik7Ci0JCQl9Ci0KLQkJCXZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJCQlnZXRUcmVlKCkuc2hvd1NlbGVjdGlvbigpOwotCQkJfQotCi0JCQl2b2lkIHNldExheW91dERhdGEoQ2VsbEVkaXRvci5MYXlvdXREYXRhIGxheW91dERhdGEpIHsKLQkJCQl0cmVlRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gbGF5b3V0RGF0YS5ncmFiSG9yaXpvbnRhbDsKLQkJCQl0cmVlRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQ7Ci0JCQkJdHJlZUVkaXRvci5taW5pbXVtV2lkdGggPSBsYXlvdXREYXRhLm1pbmltdW1XaWR0aDsKLQkJCX0KLQotCQkJdm9pZCBoYW5kbGVEb3VibGVDbGlja0V2ZW50KCkgewotCQkJCVZpZXdlciB2aWV3ZXIgPSBnZXRWaWV3ZXIoKTsKLQkJCQlmaXJlRG91YmxlQ2xpY2sobmV3IERvdWJsZUNsaWNrRXZlbnQodmlld2VyLCB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCWZpcmVPcGVuKG5ldyBPcGVuRXZlbnQodmlld2VyLCB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgaXMgYW4gYWN0aXZlIGNlbGwgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgYW4gYWN0aXZlIGNlbGwgZWRpdG9yLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDZWxsRWRpdG9yQWN0aXZlKCkgewotCQlyZXR1cm4gdHJlZVZpZXdlckltcGwuaXNDZWxsRWRpdG9yQWN0aXZlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBBYnN0cmFjdFRyZWVWaWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIEl0ZW0gbmV3SXRlbShXaWRnZXQgcGFyZW50LCBpbnQgZmxhZ3MsIGludCBpeCkgewotCQlUcmVlSXRlbSBpdGVtOwotCQlpZiAoaXggPj0gMCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRyZWVJdGVtKQotCQkJCWl0ZW0gPSBuZXcgVHJlZUl0ZW0oKFRyZWVJdGVtKSBwYXJlbnQsIGZsYWdzLCBpeCk7Ci0JCQllbHNlCi0JCQkJaXRlbSA9IG5ldyBUcmVlSXRlbSgoVHJlZSkgcGFyZW50LCBmbGFncywgaXgpOwotCQl9IGVsc2UgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRyZWVJdGVtKQotCQkJCWl0ZW0gPSBuZXcgVHJlZUl0ZW0oKFRyZWVJdGVtKSBwYXJlbnQsIGZsYWdzKTsKLQkJCWVsc2UKLQkJCQlpdGVtID0gbmV3IFRyZWVJdGVtKChUcmVlKSBwYXJlbnQsIGZsYWdzKTsKLQkJfQotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIEFic3RyYWN0VHJlZVZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGwoQ29udHJvbCB3aWRnZXQpIHsKLQkJKChUcmVlKSB3aWRnZXQpLnJlbW92ZUFsbCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNlbGwgZWRpdG9ycyBvZiB0aGlzIHRyZWUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3JzCi0JICogICAgICAgICAgICB0aGUgbGlzdCBvZiBjZWxsIGVkaXRvcnMKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VsbEVkaXRvcnMoQ2VsbEVkaXRvcltdIGVkaXRvcnMpIHsKLQkJdHJlZVZpZXdlckltcGwuc2V0Q2VsbEVkaXRvcnMoZWRpdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2VsbCBtb2RpZmllciBvZiB0aGlzIHRyZWUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBtb2RpZmllcgotCSAqICAgICAgICAgICAgdGhlIGNlbGwgbW9kaWZpZXIKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VsbE1vZGlmaWVyKElDZWxsTW9kaWZpZXIgbW9kaWZpZXIpIHsKLQkJdHJlZVZpZXdlckltcGwuc2V0Q2VsbE1vZGlmaWVyKG1vZGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb2x1bW4gcHJvcGVydGllcyBvZiB0aGlzIHRyZWUgdmlld2VyLiBUaGUgcHJvcGVydGllcyBtdXN0Ci0JICogY29ycmVzcG9uZCB3aXRoIHRoZSBjb2x1bW5zIG9mIHRoZSB0cmVlIGNvbnRyb2wuIFRoZXkgYXJlIHVzZWQgdG8KLQkgKiBpZGVudGlmeSB0aGUgY29sdW1uIGluIGEgY2VsbCBtb2RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uUHJvcGVydGllcwotCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgY29sdW1uIHByb3BlcnRpZXMKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uUHJvcGVydGllcyhTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXRyZWVWaWV3ZXJJbXBsLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBBYnN0cmFjdFRyZWVWaWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXhwYW5kZWQoSXRlbSBub2RlLCBib29sZWFuIGV4cGFuZCkgewotCQkoKFRyZWVJdGVtKSBub2RlKS5zZXRFeHBhbmRlZChleHBhbmQpOwotCQlpZihnZXRDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIElMYXp5VHJlZUNvbnRlbnRQcm92aWRlcikgewotCQkJLy8gZm9yY2UgcmVwYWludHMgdG8gaGFwcGVuCi0JCQlnZXRDb250cm9sKCkudXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHJlZSB2aWV3ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5WaWV3ZXI8L2NvZGU+IGZyYW1ld29yawotCSAqIG1ldGhvZCBlbnN1cmVzIHRoYXQgdGhlIGdpdmVuIGxhYmVsIHByb3ZpZGVyIGlzIGFuIGluc3RhbmNlIG9mCi0JICogPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsUHJvdmlkZXIoSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShsYWJlbFByb3ZpZGVyIGluc3RhbmNlb2YgSVRhYmxlTGFiZWxQcm92aWRlcgotCQkJCXx8IGxhYmVsUHJvdmlkZXIgaW5zdGFuY2VvZiBJTGFiZWxQcm92aWRlcik7Ci0JCXN1cGVyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWVDb2xvckFuZEZvbnQgPSBuZXcgVHJlZUNvbG9yQW5kRm9udENvbGxlY3RvcihsYWJlbFByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIEFic3RyYWN0VHJlZVZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3Rpb24oTGlzdCBpdGVtcykgewotCi0JCUl0ZW1bXSBjdXJyZW50ID0gZ2V0U2VsZWN0aW9uKGdldFRyZWUoKSk7Ci0KLQkJLy8gRG9uJ3QgYm90aGVyIHJlc2V0dGluZyB0aGUgc2FtZSBzZWxlY3Rpb24KLQkJaWYgKGlzU2FtZVNlbGVjdGlvbihpdGVtcywgY3VycmVudCkpCi0JCQlyZXR1cm47Ci0KLQkJVHJlZUl0ZW1bXSBuZXdJdGVtcyA9IG5ldyBUcmVlSXRlbVtpdGVtcy5zaXplKCldOwotCQlpdGVtcy50b0FycmF5KG5ld0l0ZW1zKTsKLQkJZ2V0VHJlZSgpLnNldFNlbGVjdGlvbihuZXdJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbGlzdCBhbmQgYXJyYXkgb2YgaXRlbXMgcmVmZXIgdG8KLQkgKiB0aGUgc2FtZSBtb2RlbCBlbGVtZW50cy4gT3JkZXIgaXMgdW5pbXBvcnRhbnQuCi0JICogCi0JICogQHBhcmFtIGl0ZW1zCi0JICogICAgICAgICAgICB0aGUgbGlzdCBvZiBpdGVtcwotCSAqIEBwYXJhbSBjdXJyZW50Ci0JICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgaXRlbXMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWZlciB0byB0aGUgc2FtZSBlbGVtZW50cywKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiAgICAgICAgIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NhbWVTZWxlY3Rpb24oTGlzdCBpdGVtcywgSXRlbVtdIGN1cnJlbnQpIHsKLQkJLy8gSWYgdGhleSBhcmUgbm90IHRoZSBzYW1lIHNpemUgdGhlbiB0aGV5IGFyZSBub3QgZXF1aXZhbGVudAotCQlpbnQgbiA9IGl0ZW1zLnNpemUoKTsKLQkJaWYgKG4gIT0gY3VycmVudC5sZW5ndGgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ3VzdG9tSGFzaHRhYmxlIGl0ZW1TZXQgPSBuZXdIYXNodGFibGUobiAqIDIgKyAxKTsKLQkJZm9yIChJdGVyYXRvciBpID0gaXRlbXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJdGVtIGl0ZW0gPSAoSXRlbSkgaS5uZXh0KCk7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZW0uZ2V0RGF0YSgpOwotCQkJaXRlbVNldC5wdXQoZWxlbWVudCwgZWxlbWVudCk7Ci0JCX0KLQotCQkvLyBHbyB0aHJvdWdoIHRoZSBpdGVtcyBvZiB0aGUgY3VycmVudCBjb2xsZWN0aW9uCi0JCS8vIElmIHRoZXJlIGlzIGEgbWlzbWF0Y2ggcmV0dXJuIGZhbHNlCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudC5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFpdGVtU2V0LmNvbnRhaW5zS2V5KGN1cnJlbnRbaV0uZ2V0RGF0YSgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIEFic3RyYWN0VHJlZVZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93SXRlbShJdGVtIGl0ZW0pIHsKLQkJZ2V0VHJlZSgpLnNob3dJdGVtKChUcmVlSXRlbSkgaXRlbSk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlciNnZXRDaGlsZChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlbSBnZXRDaGlsZChXaWRnZXQgd2lkZ2V0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRyZWVJdGVtKQotCQkJcmV0dXJuICgoVHJlZUl0ZW0pIHdpZGdldCkuZ2V0SXRlbShpbmRleCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUcmVlKQotCQkJcmV0dXJuICgoVHJlZSkgd2lkZ2V0KS5nZXRJdGVtKGluZGV4KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFzc2VydENvbnRlbnRQcm92aWRlclR5cGUoSUNvbnRlbnRQcm92aWRlciBwcm92aWRlcikgewotCQlpZihwcm92aWRlciBpbnN0YW5jZW9mIElMYXp5VHJlZUNvbnRlbnRQcm92aWRlcikKLQkJCXJldHVybjsKLQkJc3VwZXIuYXNzZXJ0Q29udGVudFByb3ZpZGVyVHlwZShwcm92aWRlcik7Ci0JfQotCQotICAgIHByb3RlY3RlZCBPYmplY3RbXSBnZXRSYXdDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0gICAgCWlmKGdldENvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgSUxhenlUcmVlQ29udGVudFByb3ZpZGVyKSB7Ci0gICAgCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICAJfQotICAgIAlyZXR1cm4gc3VwZXIuZ2V0UmF3Q2hpbGRyZW4ocGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgYSBUcmVlVmlld2VyIHdpdGggYSB0cmVlIHdpdGggdGhlIFZJUlRVQUwgc3R5bGUgYml0IHNldCwgc2V0IHRoZQotICAgICAqIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4gVG8gc2V0IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4KLSAgICAgKiBvZiB0aGUgaW52aXNpYmxlIHJvb3Qgb2YgdGhlIHRyZWUsIHRoZSBpbnB1dCBvYmplY3QgaXMgcGFzc2VkIGFzIHRoZQotICAgICAqIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gY291bnQKLSAgICAgKiAKLQkgKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLQkgKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCByZW1haW4KLQkgKiB1bmNoYW5nZWQgZHVyaW5nIHRoZSAzLjIgcmVsZWFzZSBjeWNsZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotCSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLQkgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHNpbmNlIDMuMgotICAgICAqLwotCXB1YmxpYyB2b2lkIHNldENoaWxkQ291bnQoT2JqZWN0IGVsZW1lbnQsIGludCBjb3VudCkgewotCQlUcmVlIHRyZWUgPSAoVHJlZSkgZG9GaW5kSW5wdXRJdGVtKGVsZW1lbnQpOwotCQlpZiAodHJlZSAhPSBudWxsKSB7Ci0JCQl0cmVlLnNldEl0ZW1Db3VudChjb3VudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJV2lkZ2V0W10gaXRlbXMgPSBmaW5kSXRlbXMoZWxlbWVudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCSgoVHJlZUl0ZW0paXRlbXNbaV0pLnNldEl0ZW1Db3VudChjb3VudCk7Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIEZvciBhIFRyZWVWaWV3ZXIgd2l0aCBhIHRyZWUgd2l0aCB0aGUgVklSVFVBTCBzdHlsZSBiaXQgc2V0LCByZXBsYWNlIHRoZQotCSAqIGdpdmVuIHBhcmVudCdzIGNoaWxkIGF0IGluZGV4IHdpdGggdGhlIGdpdmVuIGVsZW1lbnQuIElmIHRoZSBnaXZlbiBwYXJlbnQKLQkgKiBpcyB0aGlzIHZpZXdlcidzIGlucHV0LCB0aGlzIHdpbGwgcmVwbGFjZSB0aGUgcm9vdCBlbGVtZW50IGF0IHRoZSBnaXZlbgotCSAqIGluZGV4LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgaW1wbGVtZW50ZXJzIG9mIElMYXp5VHJlZUNvbnRlbnRQcm92aWRlcgotCSAqIHRvIHBvcHVsYXRlIHRoaXMgdmlld2VyLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXBkYXRlZAotCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggaW4gdGhlIHBhcmVudCdzIGNoaWxkcmVuCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIG5ldyBlbGVtZW50Ci0JICogCi0JICogQHNlZSAjc2V0Q2hpbGRDb3VudChPYmplY3QsIGludCkKLQkgKiBAc2VlIElMYXp5VHJlZUNvbnRlbnRQcm92aWRlcgotICAgICAqIAotCSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotCSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHJlbWFpbgotCSAqIHVuY2hhbmdlZCBkdXJpbmcgdGhlIDMuMiByZWxlYXNlIGN5Y2xlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0JICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotCSAqIDwvcD4KLSAgICAgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZShPYmplY3QgcGFyZW50LCBpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKHBhcmVudC5lcXVhbHMoZ2V0SW5wdXQoKSkpIHsKLQkJCXVwZGF0ZUl0ZW0odHJlZS5nZXRJdGVtKGluZGV4KSwgZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlXaWRnZXRbXSBwYXJlbnRJdGVtcyA9IGZpbmRJdGVtcyhwYXJlbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoKFRyZWVJdGVtKSBwYXJlbnRJdGVtc1tpXSkuZ2V0SXRlbShpbmRleCk7Ci0JCQkJdXBkYXRlSXRlbShpdGVtLCBlbGVtZW50KTsKLQkJCX0JCQkKLQkJfQotCX0KLQkKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZGFibGUoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAJaWYgKGdldENvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgSUxhenlUcmVlQ29udGVudFByb3ZpZGVyKSB7Ci0gICAgCQlUcmVlSXRlbSB0cmVlSXRlbSA9IChUcmVlSXRlbSkgaW50ZXJuYWxFeHBhbmQoZWxlbWVudCwgZmFsc2UpOwotICAgIAkJaWYgKHRyZWVJdGVtID09IG51bGwpIHsKLSAgICAJCQlyZXR1cm4gZmFsc2U7Ci0gICAgCQl9Ci0gICAgCQl2aXJ0dWFsTWF0ZXJpYWxpemVJdGVtKHRyZWVJdGVtKTsKLSAgICAJCXJldHVybiB0cmVlSXRlbS5nZXRJdGVtQ291bnQoKSA+IDA7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHN1cGVyLmlzRXhwYW5kYWJsZShlbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFBhcmVudEVsZW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAJaWYoIShlbGVtZW50IGluc3RhbmNlb2YgVHJlZVBhdGgpICYmIChnZXRDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIElMYXp5VHJlZUNvbnRlbnRQcm92aWRlcikpIHsKLSAgICAJCUlMYXp5VHJlZUNvbnRlbnRQcm92aWRlciBsYXp5VHJlZUNvbnRlbnRQcm92aWRlciA9IChJTGF6eVRyZWVDb250ZW50UHJvdmlkZXIpIGdldENvbnRlbnRQcm92aWRlcigpOwotICAgIAkJcmV0dXJuIGxhenlUcmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudChlbGVtZW50KTsKLSAgICAJfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UGFyZW50RWxlbWVudChlbGVtZW50KTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRyZW4oV2lkZ2V0IHdpZGdldCkgewotICAgIAlpZiAoZ2V0Q29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJTGF6eVRyZWVDb250ZW50UHJvdmlkZXIpIHsKLSAgICAJCUlMYXp5VHJlZUNvbnRlbnRQcm92aWRlciBsYXp5VHJlZUNvbnRlbnRQcm92aWRlciA9IChJTGF6eVRyZWVDb250ZW50UHJvdmlkZXIpIGdldENvbnRlbnRQcm92aWRlcigpOwotICAgIAkJT2JqZWN0IGVsZW1lbnQgPSB3aWRnZXQuZ2V0RGF0YSgpOwotICAgIAkJaWYgKGVsZW1lbnQgPT0gbnVsbCAmJiB3aWRnZXQgaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotICAgIAkJCS8vIHBhcmVudCBoYXMgbm90IGJlZW4gbWF0ZXJpYWxpemVkCi0gICAgCQkJdmlydHVhbE1hdGVyaWFsaXplSXRlbSgoVHJlZUl0ZW0pIHdpZGdldCk7Ci0gICAgCQkJLy8gdHJ5IGdldHRpbmcgdGhlIGVsZW1lbnQgbm93IHRoYXQgdXBkYXRlRWxlbWVudCB3YXMgY2FsbGVkCi0gICAgCQkJZWxlbWVudCA9IHdpZGdldC5nZXREYXRhKCk7Ci0gICAgCQl9Ci0gICAgCQlpbnQgY2hpbGRDb3VudDsKLSAgICAJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUcmVlKSB7Ci0gICAgCQkJY2hpbGRDb3VudCA9ICgoVHJlZSkgd2lkZ2V0KS5nZXRJdGVtQ291bnQoKTsKLSAgICAJCX0gZWxzZSB7Ci0gICAgCQkJY2hpbGRDb3VudCA9ICgoVHJlZUl0ZW0pIHdpZGdldCkuZ2V0SXRlbUNvdW50KCk7Ci0gICAgCQl9Ci0gICAgCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGNoaWxkQ291bnQgPiAwKSB7Ci0gICAgCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKLSAgICAJCQkJbGF6eVRyZWVDb250ZW50UHJvdmlkZXIudXBkYXRlRWxlbWVudChlbGVtZW50LCBpKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJc3VwZXIuY3JlYXRlQ2hpbGRyZW4od2lkZ2V0KTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxBZGQoV2lkZ2V0IHdpZGdldCwgT2JqZWN0IHBhcmVudEVsZW1lbnQsCi0gICAgCQlPYmplY3RbXSBjaGlsZEVsZW1lbnRzKSB7Ci0gICAgCWlmIChnZXRDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIElMYXp5VHJlZUNvbnRlbnRQcm92aWRlcikgewotICAgIAkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0gICAgCQkJVHJlZUl0ZW0gdGkgPSAoVHJlZUl0ZW0pIHdpZGdldDsKLSAgICAJCQl0aS5zZXRJdGVtQ291bnQodGkuZ2V0SXRlbUNvdW50KCkgKyAxKTsKLSAgICAJCQl0aS5jbGVhckFsbChmYWxzZSk7Ci0gICAgCQl9IGVsc2UgewotICAgIAkJCVRyZWUgdCA9IChUcmVlKSB3aWRnZXQ7Ci0gICAgCQkJdC5zZXRJdGVtQ291bnQodC5nZXRJdGVtQ291bnQoKSArIDEpOwotICAgIAkJCXQuY2xlYXJBbGwoZmFsc2UpOwotICAgIAkJfQotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCXN1cGVyLmludGVybmFsQWRkKHdpZGdldCwgcGFyZW50RWxlbWVudCwgY2hpbGRFbGVtZW50cyk7Ci0gICAgfQotCi0JcHJvdGVjdGVkIHZvaWQgdmlydHVhbE1hdGVyaWFsaXplSXRlbShUcmVlSXRlbSB0cmVlSXRlbSkgewotCQlpZiAodHJlZUl0ZW0uZ2V0RGF0YSgpICE9IG51bGwpIHsKLQkJCS8vIGFscmVhZHkgbWF0ZXJpYWxpemVkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEoZ2V0Q29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJTGF6eVRyZWVDb250ZW50UHJvdmlkZXIpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUxhenlUcmVlQ29udGVudFByb3ZpZGVyIGxhenlUcmVlQ29udGVudFByb3ZpZGVyID0gKElMYXp5VHJlZUNvbnRlbnRQcm92aWRlcikgZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCWludCBpbmRleDsKLQkJV2lkZ2V0IHBhcmVudCA9IHRyZWVJdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlwYXJlbnQgPSB0cmVlSXRlbS5nZXRQYXJlbnQoKTsKLQkJfQotCQlPYmplY3QgcGFyZW50RWxlbWVudCA9IHBhcmVudC5nZXREYXRhKCk7Ci0JCWlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBUcmVlKSB7Ci0JCQkJaW5kZXggPSAoKFRyZWUpIHBhcmVudCkuaW5kZXhPZih0cmVlSXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ID0gKChUcmVlSXRlbSkgcGFyZW50KS5pbmRleE9mKHRyZWVJdGVtKTsKLQkJCX0KLQkJCWxhenlUcmVlQ29udGVudFByb3ZpZGVyLnVwZGF0ZUVsZW1lbnQocGFyZW50RWxlbWVudCwgaW5kZXgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9WaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZWRmZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotCi0vKioKLSAqIEEgdmlld2VyIGlzIGEgbW9kZWwtYmFzZWQgYWRhcHRlciBvbiBhIHdpZGdldC4KLSAqIDxwPgotICogQSB2aWV3ZXIgY2FuIGJlIGNyZWF0ZWQgYXMgYW4gYWRhcHRlciBvbiBhIHByZS1leGlzdGluZyBjb250cm9sIChlLmcuLCAKLSAqIGNyZWF0aW5nIGEgPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4gb24gYW4gZXhpc3RpbmcgPGNvZGU+TGlzdDwvY29kZT4gY29udHJvbCkuCi0gKiBBbGwgdmlld2VycyBhbHNvIHByb3ZpZGUgYSBjb252ZW5pZW5jZSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgdGhlIGNvbnRyb2wuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEltcGxlbWVudGluZyBhIGNvbmNyZXRlIHZpZXdlciB0eXBpY2FsbHkgaW52b2x2ZXMgdGhlIGZvbGxvd2luZyBzdGVwczoKLSAqIDx1bD4KLSAqIDxsaT4KLSAqIGNyZWF0ZSBTV1QgY29udHJvbHMgZm9yIHZpZXdlciAoaW4gY29uc3RydWN0b3IpIChvcHRpb25hbCkKLSAqIDwvbGk+Ci0gKiA8bGk+Ci0gKiBpbml0aWFsaXplIFNXVCBjb250cm9scyBmcm9tIGlucHV0IChpbnB1dENoYW5nZWQpCi0gKiA8L2xpPgotICogPGxpPgotICogZGVmaW5lIHZpZXdlci1zcGVjaWZpYyB1cGRhdGUgbWV0aG9kcwotICogPC9saT4KLSAqIDxsaT4KLSAqIHN1cHBvcnQgc2VsZWN0aW9ucyAoPGNvZGU+c2V0U2VsZWN0aW9uPC9jb2RlPiwgPGNvZGU+Z2V0U2VsZWN0aW9uPC9jb2RlPikKLSAqIDwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlld2VyIGltcGxlbWVudHMgSUlucHV0U2VsZWN0aW9uUHJvdmlkZXIgewotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiBzZWxlY3Rpb24gY2hhbmdlIGxpc3RlbmVycyAoZWxlbWVudCB0eXBlOiA8Y29kZT5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPC9jb2RlPikuCi0gICAgICoKLSAgICAgKiBAc2VlICNmaXJlU2VsZWN0aW9uQ2hhbmdlZAotICAgICAqLwotICAgIHByaXZhdGUgTGlzdGVuZXJMaXN0IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIGhlbHAgcmVxdWVzdCBsaXN0ZW5lcnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXI8L2NvZGU+KS4KLSAgICAgKiBIZWxwIHJlcXVlc3QgbGlzdGVuZXJzLgotICAgICAqCi0gICAgICogQHNlZSAjaGFuZGxlSGVscFJlcXVlc3QKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3RlbmVyTGlzdCBoZWxwTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWVzIG9mIHRoaXMgdmlld2VyJ3MgcHJvcGVydGllcy4KLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHZpZXdlciBoYXMgbm8gcHJvcGVydGllcy4KLSAgICAgKgotICAgICAqIEBzZWUgI3NldERhdGEKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGtleXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmFsdWVzIG9mIHRoaXMgdmlld2VyJ3MgcHJvcGVydGllcy4KLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHZpZXdlciBoYXMgbm8gcHJvcGVydGllcy4KLSAgICAgKiBUaGlzIGFycmF5IHBhcmFsbGVscyB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmtleXM8L2NvZGU+IGZpZWxkLgotICAgICAqCi0gICAgICogQHNlZSAjc2V0RGF0YQotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0W10gdmFsdWVzOwotCi0gICAgLyoqCi0gICAgICogUmVtZW1iZXJzIHdoZXRoZXIgd2UndmUgaG9va2VkIHRoZSBoZWxwIGxpc3RlbmVyIG9uIHRoZSBjb250cm9sIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGVscEhvb2tlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogSGVscCBsaXN0ZW5lciBmb3IgdGhlIGNvbnRyb2wsIGNyZWF0ZWQgbGF6aWx5IHdoZW4gY2xpZW50J3MgZmlyc3QgaGVscCBsaXN0ZW5lciBpcyBhZGRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEhlbHBMaXN0ZW5lciBoZWxwTGlzdGVuZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVW5pcXVlIGtleSBmb3IgYXNzb2NpYXRpbmcgZWxlbWVudCBkYXRhIHdpdGggd2lkZ2V0cy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNzZXREYXRhKFN0cmluZywgT2JqZWN0KQotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdJREdFVF9EQVRBX0tFWSA9ICJvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLldJREdFVF9EQVRBIjsvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHZpZXdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmlld2VyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgaGVscCByZXF1ZXN0cyBpbiB0aGlzIHZpZXdlci4KLSAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgYSBoZWxwIGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBoZWxwTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgICAgIGlmICghaGVscEhvb2tlZCkgewotICAgICAgICAgICAgQ29udHJvbCBjb250cm9sID0gZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5oZWxwTGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmhlbHBMaXN0ZW5lciA9IG5ldyBIZWxwTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoZWxwUmVxdWVzdGVkKEhlbHBFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUhlbHBSZXF1ZXN0KGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udHJvbC5hZGRIZWxwTGlzdGVuZXIodGhpcy5oZWxwTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIGhlbHBIb29rZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU2VsZWN0aW9uUHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIGFueSBoZWxwIGxpc3RlbmVycyB0aGF0IGhlbHAgaGFzIGJlZW4gcmVxdWVzdGVkLgotICAgICAqIE9ubHkgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFyZSBub3RpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCBhIGhlbHAgZXZlbnQKLSAgICAgKgotICAgICAqIEBzZWUgSGVscExpc3RlbmVyI2hlbHBSZXF1ZXN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwRXZlbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZUhlbHBSZXF1ZXN0ZWQoSGVscEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIE9iamVjdFtdIGxpc3RlbmVycyA9IGhlbHBMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAoKEhlbHBMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKS5oZWxwUmVxdWVzdGVkKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIGFueSBzZWxlY3Rpb24gY2hhbmdlZCBsaXN0ZW5lcnMgdGhhdCB0aGUgdmlld2VyJ3Mgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLgotICAgICAqIE9ubHkgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFyZSBub3RpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50Ci0gICAgICoKLSAgICAgKiBAc2VlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVTZWxlY3Rpb25DaGFuZ2VkKGZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnMgPSBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLSAgICAgICAgICAgIFNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGwuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcmltYXJ5IGNvbnRyb2wgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlld2VyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgU1dUIGNvbnRyb2wgd2hpY2ggZGlzcGxheXMgdGhpcyB2aWV3ZXIncyBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IENvbnRyb2wgZ2V0Q29udHJvbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUsCi0gICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyBhIChsaW5lYXIpIHNlYXJjaCBvZgotICAgICAqIGFuIGludGVybmFsIHRhYmxlLiBPdmVycmlkaW5nIHRoaXMgbWV0aG9kIGlzIGdlbmVyYWxseSBub3QKLSAgICAgKiByZXF1aXJlZCBpZiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBrZXlzIGlzIHNtYWxsLiBJZiBhIG1vcmUKLSAgICAgKiBlZmZpY2llbnQgcmVwcmVzZW50YXRpb24gb2YgYSB2aWV3ZXIncyBwcm9wZXJ0aWVzIGlzIHJlcXVpcmVkLAotICAgICAqIG92ZXJyaWRlIGJvdGggPGNvZGU+Z2V0RGF0YTwvY29kZT4gYW5kIDxjb2RlPnNldERhdGE8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgdGhlIHByb3BlcnR5IG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAgKiAgICB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXREYXRhKFN0cmluZyBrZXkpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChrZXkpOwotICAgICAgICBpZiAoa2V5cyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGtleXNbaV0uZXF1YWxzKGtleSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQ29weS1kb3duIG9mIG1ldGhvZCBkZWNsYXJlZCBvbiA8Y29kZT5JSW5wdXRQcm92aWRlcjwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRJbnB1dCgpOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIENvcHktZG93biBvZiBtZXRob2QgZGVjbGFyZWQgb24gPGNvZGU+SVNlbGVjdGlvblByb3ZpZGVyPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKTsKLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYSBoZWxwIHJlcXVlc3QgZnJvbSB0aGUgdW5kZXJseWluZyBTV1QgY29udHJvbC4KLSAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBmaXJlIGEgaGVscCByZXF1ZXN0LAotICAgICAqIHdpdGggdGhlIGV2ZW50J3MgZGF0YSBtb2RpZmllZCB0byBob2xkIHRoaXMgdmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUhlbHBSZXF1ZXN0KEhlbHBFdmVudCBldmVudCkgewotICAgICAgICBPYmplY3Qgb2xkRGF0YSA9IGV2ZW50LmRhdGE7Ci0gICAgICAgIGV2ZW50LmRhdGEgPSB0aGlzOwotICAgICAgICBmaXJlSGVscFJlcXVlc3RlZChldmVudCk7Ci0gICAgICAgIGV2ZW50LmRhdGEgPSBvbGREYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGhvb2sgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBpbnB1dCB0byB0aGlzIHZpZXdlciBpcwotICAgICAqIGluaXRpYWxseSBzZXQgb3Igc3Vic2VxdWVudGx5IGNoYW5nZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VycyBtYXkgb3ZlcnJpZGUgCi0gICAgICogdGhpcyBtZXRob2QgdG8gZG8gc29tZXRoaW5nIHdoZW4gYSB2aWV3ZXIncyBpbnB1dCBpcyBzZXQuCi0gICAgICogQSB0eXBpY2FsIHVzZSBpcyBwb3B1bGF0ZSB0aGUgdmlld2VyLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgbmV3IGlucHV0IG9mIHRoaXMgdmlld2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIG9sZElucHV0IHRoZSBvbGQgaW5wdXQgZWxlbWVudCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZQotICAgICAqICAgd2FzIHByZXZpb3VzbHkgbm8gaW5wdXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnB1dENoYW5nZWQoT2JqZWN0IGlucHV0LCBPYmplY3Qgb2xkSW5wdXQpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZyZXNoZXMgdGhpcyB2aWV3ZXIgY29tcGxldGVseSB3aXRoIGluZm9ybWF0aW9uIGZyZXNobHkgb2J0YWluZWQgZnJvbSB0aGlzCi0gICAgICogdmlld2VyJ3MgbW9kZWwuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVmcmVzaCgpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gaGVscCBsaXN0ZW5lciBmcm9tIHRoaXMgdmlld2VyLgotICAgICAqIEhhcyBubyBhZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIGEgaGVscCBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaGVscExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgICAgICBpZiAoaGVscExpc3RlbmVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgQ29udHJvbCBjb250cm9sID0gZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBjb250cm9sLnJlbW92ZUhlbHBMaXN0ZW5lcih0aGlzLmhlbHBMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgaGVscEhvb2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU2VsZWN0aW9uUHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotICAgICAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2Nyb2xscyB0aGUgdmlld2VyJ3MgY29udHJvbCBkb3duIGJ5IG9uZSBpdGVtIGZyb20gdGhlIGdpdmVuCi0gICAgICogZGlzcGxheS1yZWxhdGl2ZSBjb29yZGluYXRlcy4gIFJldHVybnMgdGhlIG5ld2x5IHJldmVhbGVkIEl0ZW0sCi0gICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc2Nyb2xsaW5nIG9jY3VycmVkIG9yIGlmIHRoZSB2aWV3ZXIKLSAgICAgKiBkb2Vzbid0IHJlcHJlc2VudCBhbiBpdGVtLWJhc2VkIHdpZGdldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4IGhvcml6b250YWwgY29vcmRpbmF0ZQotICAgICAqIEBwYXJhbSB5IHZlcnRpY2FsIGNvb3JkaW5hdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlbSBzY3JvbGxEb3duKGludCB4LCBpbnQgeSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTY3JvbGxzIHRoZSB2aWV3ZXIncyBjb250cm9sIHVwIGJ5IG9uZSBpdGVtIGZyb20gdGhlIGdpdmVuCi0gICAgICogZGlzcGxheS1yZWxhdGl2ZSBjb29yZGluYXRlcy4gIFJldHVybnMgdGhlIG5ld2x5IHJldmVhbGVkIEl0ZW0sCi0gICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc2Nyb2xsaW5nIG9jY3VycmVkIG9yIGlmIHRoZSB2aWV3ZXIKLSAgICAgKiBkb2Vzbid0IHJlcHJlc2VudCBhbiBpdGVtLWJhc2VkIHdpZGdldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4IGhvcml6b250YWwgY29vcmRpbmF0ZQotICAgICAqIEBwYXJhbSB5IHZlcnRpY2FsIGNvb3JkaW5hdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlbSBzY3JvbGxVcChpbnQgeCwgaW50IHkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUgdG8gdGhlCi0gICAgICogZ2l2ZW4gdmFsdWUsIG9yIHRvIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyB0byBiZQotICAgICAqIHJlbW92ZWQuIElmIHRoaXMgdmlld2VyIGhhcyBzdWNoIGEgcHJvcGVydHksIGl0cyB2YWx1ZSBpcwotICAgICAqIHJlcGxhY2VkOyBvdGhlcndpc2UgYSBuZXcgcHJvcGVydHkgaXMgYWRkZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmVjb3JkcyBwcm9wZXJ0aWVzIGluIGFuIGludGVybmFsCi0gICAgICogdGFibGUgd2hpY2ggaXMgc2VhcmNoZWQgbGluZWFybHkuIE92ZXJyaWRpbmcgdGhpcyBtZXRob2QgaXMgZ2VuZXJhbGx5IG5vdAotICAgICAqIHJlcXVpcmVkIGlmIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGtleXMgaXMgc21hbGwuIElmIGEgbW9yZQotICAgICAqIGVmZmljaWVudCByZXByZXNlbnRhdGlvbiBvZiBhIHZpZXdlcidzIHByb3BlcnRpZXMgaXMgcmVxdWlyZWQsCi0gICAgICogb3ZlcnJpZGUgYm90aCA8Y29kZT5nZXREYXRhPC9jb2RlPiBhbmQgPGNvZGU+c2V0RGF0YTwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSB0aGUgcHJvcGVydHkgbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJvcGVydHkgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0gICAgICogICAgdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoa2V5KTsKLSAgICAgICAgLyogUmVtb3ZlIHRoZSBrZXkvdmFsdWUgcGFpciAqLwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGtleXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwga2V5cy5sZW5ndGggJiYgIWtleXNbaW5kZXhdLmVxdWFscyhrZXkpKQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0ga2V5cy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICBrZXlzID0gbnVsbDsKLSAgICAgICAgICAgICAgICB2YWx1ZXMgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBuZXdLZXlzID0gbmV3IFN0cmluZ1trZXlzLmxlbmd0aCAtIDFdOwotICAgICAgICAgICAgICAgIE9iamVjdFtdIG5ld1ZhbHVlcyA9IG5ldyBPYmplY3RbdmFsdWVzLmxlbmd0aCAtIDFdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoa2V5cywgMCwgbmV3S2V5cywgMCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoa2V5cywgaW5kZXggKyAxLCBuZXdLZXlzLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0tleXMubGVuZ3RoIC0gaW5kZXgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsdWVzLCAwLCBuZXdWYWx1ZXMsIDAsIGluZGV4KTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbHVlcywgaW5kZXggKyAxLCBuZXdWYWx1ZXMsIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWVzLmxlbmd0aCAtIGluZGV4KTsKLSAgICAgICAgICAgICAgICBrZXlzID0gbmV3S2V5czsKLSAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXdWYWx1ZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBZGQgdGhlIGtleS92YWx1ZSBwYWlyICovCi0gICAgICAgIGlmIChrZXlzID09IG51bGwpIHsKLSAgICAgICAgICAgIGtleXMgPSBuZXcgU3RyaW5nW10geyBrZXkgfTsKLSAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBPYmplY3RbXSB7IHZhbHVlIH07Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoa2V5c1tpXS5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSBuZXdLZXlzID0gbmV3IFN0cmluZ1trZXlzLmxlbmd0aCArIDFdOwotICAgICAgICBPYmplY3RbXSBuZXdWYWx1ZXMgPSBuZXcgT2JqZWN0W3ZhbHVlcy5sZW5ndGggKyAxXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShrZXlzLCAwLCBuZXdLZXlzLCAwLCBrZXlzLmxlbmd0aCk7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsdWVzLCAwLCBuZXdWYWx1ZXMsIDAsIHZhbHVlcy5sZW5ndGgpOwotICAgICAgICBuZXdLZXlzW2tleXMubGVuZ3RoXSA9IGtleTsKLSAgICAgICAgbmV3VmFsdWVzW3ZhbHVlcy5sZW5ndGhdID0gdmFsdWU7Ci0gICAgICAgIGtleXMgPSBuZXdLZXlzOwotICAgICAgICB2YWx1ZXMgPSBuZXdWYWx1ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIGlucHV0IGZvciB0aGlzIHZpZXdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2YgdGhpcyB2aWV3ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpOwotCi0gICAgLyoqCi0gICAgICogVGhlIHZpZXdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklTZWxlY3Rpb25Qcm92aWRlcjwvY29kZT4gCi0gICAgICogbWV0aG9kIG1ha2UgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIHRoaXMgdmlld2VyIHdpdGhvdXQgbWFraW5nIGl0IHZpc2libGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byA8Y29kZT5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLGZhbHNlKTwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIG5ldyBzZWxlY3Rpb24gZm9yIHRoaXMgdmlld2VyIGFuZCBvcHRpb25hbGx5IG1ha2VzIGl0IHZpc2libGUuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBuZXcgc2VsZWN0aW9uCi0gICAgICogQHBhcmFtIHJldmVhbCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VsZWN0aW9uIGlzIHRvIGJlIG1hZGUKLSAgICAgKiAgIHZpc2libGUsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIHJldmVhbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1ZpZXdlckRyb3BBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1ZpZXdlckRyb3BBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Y2RjMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9WaWV3ZXJEcm9wQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgY2xhc3MgcHJvdmlkZXMgZ2VuZXJpYyBkcmFnLWFuZC1kcm9wIHN1cHBvcnQgZm9yIGEgdmlld2VyLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPnZhbGlkYXRlRHJvcDwvY29kZT4gLSBpZGVudGlmaWVzIHZhbGlkIGRyb3AgdGFyZ2V0cyBpbiB2aWV3ZXI8L2xpPgotICogICA8bGk+PGNvZGU+cGVyZm9ybURyb3A8L2NvZGU+IC0gY2FycmllcyBvdXQgYSBkcm9wIGludG8gYSB2aWV3ZXI8L2xpPgotICogPC91bD4KLSAqIFRoZSA8Y29kZT5zZXRGZWVkYmFja0VuYWJsZWQ8L2NvZGU+IG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHR1cm4gb24gYW5kIG9mZiAKLSAqIHZpc3VhbCBpbnNlcnRpb24gZmVlZGJhY2sgKG9uIGJ5IGRlZmF1bHQpLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlld2VyRHJvcEFkYXB0ZXIgZXh0ZW5kcyBEcm9wVGFyZ2V0QWRhcHRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdGFudCBkZXNjcmliaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIHJlbGF0aXZlIAotICAgICAqIHRvIHRoZSB0YXJnZXQgb2JqZWN0LiAgVGhpcyBtZWFucyB0aGUgbW91c2UgaXMgcG9zaXRpb25lZAotICAgICAqIHNsaWdodGx5IGJlZm9yZSB0aGUgdGFyZ2V0LgotICAgICAqIEBzZWUgI2dldEN1cnJlbnRMb2NhdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQVRJT05fQkVGT1JFID0gMTsKLQotICAgIC8qKgotICAgICAqIENvbnN0YW50IGRlc2NyaWJpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IgcmVsYXRpdmUgCi0gICAgICogdG8gdGhlIHRhcmdldCBvYmplY3QuICBUaGlzIG1lYW5zIHRoZSBtb3VzZSBpcyBwb3NpdGlvbmVkCi0gICAgICogc2xpZ2h0bHkgYWZ0ZXIgdGhlIHRhcmdldC4KLSAgICAgKiBAc2VlICNnZXRDdXJyZW50TG9jYXRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FUSU9OX0FGVEVSID0gMjsKLQotICAgIC8qKgotICAgICAqIENvbnN0YW50IGRlc2NyaWJpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IgcmVsYXRpdmUgCi0gICAgICogdG8gdGhlIHRhcmdldCBvYmplY3QuICBUaGlzIG1lYW5zIHRoZSBtb3VzZSBpcyBwb3NpdGlvbmVkCi0gICAgICogZGlyZWN0bHkgb24gdGhlIHRhcmdldC4KLSAgICAgKiBAc2VlICNnZXRDdXJyZW50TG9jYXRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FUSU9OX09OID0gMzsKLQotICAgIC8qKgotICAgICAqIENvbnN0YW50IGRlc2NyaWJpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IgcmVsYXRpdmUgCi0gICAgICogdG8gdGhlIHRhcmdldCBvYmplY3QuICBUaGlzIG1lYW5zIHRoZSBtb3VzZSBpcyBub3QgcG9zaXRpb25lZAotICAgICAqIG92ZXIgb3IgbmVhciBhbnkgdmFsaWQgdGFyZ2V0LgotICAgICAqIEBzZWUgI2dldEN1cnJlbnRMb2NhdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQVRJT05fTk9ORSA9IDQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmlld2VyIHRvIHdoaWNoIHRoaXMgZHJvcCBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLgotICAgICAqLwotICAgIHByaXZhdGUgVmlld2VyIHZpZXdlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBjdXJyZW50T3BlcmF0aW9uID0gRE5ELkRST1BfTk9ORTsKLQotICAgIC8qKgotICAgICAqIFRoZSBsYXN0IHZhbGlkIG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBsYXN0VmFsaWRPcGVyYXRpb24gPSBETkQuRFJPUF9OT05FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRhdGEgaXRlbSBjdXJyZW50bHkgdW5kZXIgdGhlIG1vdXNlLgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGN1cnJlbnRUYXJnZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9zaXRpb24gb2YgdGhlIG1vdXNlIHJlbGF0aXZlIHRvIHRoZQotICAgICAqIHRhcmdldCAoYmVmb3JlLCBvbiwgb3IgYWZ0ZXIgdGhlIHRhcmdldC4gIExvY2F0aW9uIGlzIG9uZSBvZgotICAgICAqIHRoZSA8Y29kZT5MT0NBVElPTl8qIDwvY29kZT4gY29uc3RhbnRzIGRlZmluZWQgaW4gdGhpcyB0eXBlLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGN1cnJlbnRMb2NhdGlvbjsKLQotICAgIC8qKgotICAgICAqIEEgZmxhZyB0aGF0IGFsbG93cyBhZGFwdGVyIHVzZXJzIHRvIHR1cm4gdGhlIGluc2VydGlvbgotICAgICAqIGZlZWRiYWNrIG9uIG9yIG9mZi4gRGVmYXVsdCBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZmVlZGJhY2tFbmFibGVkID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIEEgZmxhZyB0aGF0IGFsbG93cyBhZGFwdGVyIHVzZXJzIHRvIHR1cm4gYXV0byBzY3JvbGxpbmcKLSAgICAgKiBhbmQgZXhwYW5kaW5nIG9uIG9yIG9mZi4gRGVmYXVsdCBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2Nyb2xsRXhwYW5kRW5hYmxlZCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBBIGZsYWcgdGhhdCBhbGxvd3MgYWRhcHRlciB1c2VycyB0byB0dXJuIHNlbGVjdGlvbiBmZWVkYmFjawotICAgICAqICBvbiBvciBvZmYuIERlZmF1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNlbGVjdEZlZWRiYWNrRW5hYmxlZCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGRyb3AgYWRhcHRlciBmb3IgdGhlIGdpdmVuIHZpZXdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2aWV3ZXIgdGhlIHZpZXdlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBWaWV3ZXJEcm9wQWRhcHRlcihWaWV3ZXIgdmlld2VyKSB7Ci0gICAgICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBldmVudCdzIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIGl0cyB0YXJnZXQuCi0gICAgICogVGhlIHBvc2l0aW9uIGlzIGRldGVybWluZWQgdG8gYmUgYmVmb3JlLCBhZnRlciwgb3Igb24gdGhlIGl0ZW0sIGJhc2VkIG9uCi0gICAgICogc29tZSB0aHJlc2hvbGQgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50Ci0gICAgICogQHJldHVybiBvbmUgb2YgdGhlIDxjb2RlPkxPQ0FUSU9OXyogPC9jb2RlPmNvbnN0YW50cyBkZWZpbmVkIGluIHRoaXMgY2xhc3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGRldGVybWluZUxvY2F0aW9uKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotICAgICAgICBpZiAoIShldmVudC5pdGVtIGluc3RhbmNlb2YgSXRlbSkpIHsKLSAgICAgICAgICAgIHJldHVybiBMT0NBVElPTl9OT05FOwotICAgICAgICB9Ci0gICAgICAgIEl0ZW0gaXRlbSA9IChJdGVtKSBldmVudC5pdGVtOwotICAgICAgICBQb2ludCBjb29yZGluYXRlcyA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLSAgICAgICAgY29vcmRpbmF0ZXMgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpLnRvQ29udHJvbChjb29yZGluYXRlcyk7Ci0gICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBnZXRCb3VuZHMoaXRlbSk7Ci0gICAgICAgICAgICBpZiAoYm91bmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTE9DQVRJT05fTk9ORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoY29vcmRpbmF0ZXMueSAtIGJvdW5kcy55KSA8IDUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTE9DQVRJT05fQkVGT1JFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgLSBjb29yZGluYXRlcy55KSA8IDUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTE9DQVRJT05fQUZURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIExPQ0FUSU9OX09OOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRhcmdldCBpdGVtIG9mIHRoZSBnaXZlbiBkcm9wIGV2ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudAotICAgICAqIEByZXR1cm4gVGhlIHRhcmdldCBvZiB0aGUgZHJvcCwgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZGV0ZXJtaW5lVGFyZ2V0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotICAgICAgICByZXR1cm4gZXZlbnQuaXRlbSA9PSBudWxsID8gbnVsbCA6IGV2ZW50Lml0ZW0uZ2V0RGF0YSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRHJvcFRhcmdldEFkYXB0ZXIuCi0gICAgICogVGhlIG1vdXNlIGhhcyBtb3ZlZCBvdmVyIHRoZSBkcm9wIHRhcmdldC4gIElmIHRoZQotICAgICAqIHRhcmdldCBpdGVtIGhhcyBjaGFuZ2VkLCBub3RpZnkgdGhlIGFjdGlvbiBhbmQgY2hlY2sKLSAgICAgKiB0aGF0IGl0IGlzIHN0aWxsIGVuYWJsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRvRHJvcFZhbGlkYXRpb24oRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vdXBkYXRlIGxhc3QgdmFsaWQgb3BlcmF0aW9uCi0gICAgICAgIGlmIChldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfTk9ORSkgewotICAgICAgICAgICAgbGFzdFZhbGlkT3BlcmF0aW9uID0gZXZlbnQuZGV0YWlsOwotICAgICAgICB9Ci0gICAgICAgIC8vdmFsaWQgZHJvcCBhbmQgc2V0IGV2ZW50IGRldGFpbCBhY2NvcmRpbmdseQotICAgICAgICBpZiAodmFsaWRhdGVEcm9wKGN1cnJlbnRUYXJnZXQsIGV2ZW50LmRldGFpbCwgZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotICAgICAgICAgICAgY3VycmVudE9wZXJhdGlvbiA9IGxhc3RWYWxpZE9wZXJhdGlvbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGN1cnJlbnRPcGVyYXRpb24gPSBETkQuRFJPUF9OT05FOwotICAgICAgICB9Ci0gICAgICAgIGV2ZW50LmRldGFpbCA9IGN1cnJlbnRPcGVyYXRpb247Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEcm9wVGFyZ2V0QWRhcHRlci4KLSAgICAgKiBUaGUgZHJhZyBoYXMgZW50ZXJlZCB0aGlzIHdpZGdldCdzIHJlZ2lvbi4gIFNlZQotICAgICAqIGlmIHRoZSBkcm9wIHNob3VsZCBiZSBhbGxvd2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgY3VycmVudFRhcmdldCA9IGRldGVybWluZVRhcmdldChldmVudCk7Ci0gICAgICAgIGRvRHJvcFZhbGlkYXRpb24oZXZlbnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRHJvcFRhcmdldEFkYXB0ZXIuCi0gICAgICogVGhlIGRyb3Agb3BlcmF0aW9uIGhhcyBjaGFuZ2VkLCBzZWUgaWYgdGhlIGFjdGlvbgotICAgICAqIHNob3VsZCBzdGlsbCBiZSBlbmFibGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotICAgICAgICBjdXJyZW50VGFyZ2V0ID0gZGV0ZXJtaW5lVGFyZ2V0KGV2ZW50KTsKLSAgICAgICAgZG9Ecm9wVmFsaWRhdGlvbihldmVudCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEcm9wVGFyZ2V0QWRhcHRlci4KLSAgICAgKiBUaGUgbW91c2UgaGFzIG1vdmVkIG92ZXIgdGhlIGRyb3AgdGFyZ2V0LiAgSWYgdGhlCi0gICAgICogdGFyZ2V0IGl0ZW0gaGFzIGNoYW5nZWQsIG5vdGlmeSB0aGUgYWN0aW9uIGFuZCBjaGVjawotICAgICAqIHRoYXQgaXQgaXMgc3RpbGwgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgLy91c2UgbmV3bHkgcmV2ZWFsZWQgaXRlbSBhcyB0YXJnZXQgaWYgc2Nyb2xsaW5nIG9jY3VycwotICAgICAgICBPYmplY3QgdGFyZ2V0ID0gZGV0ZXJtaW5lVGFyZ2V0KGV2ZW50KTsKLQotICAgICAgICAvL3NldCB0aGUgbG9jYXRpb24gZmVlZGJhY2sKLSAgICAgICAgaW50IG9sZExvY2F0aW9uID0gY3VycmVudExvY2F0aW9uOwotICAgICAgICBjdXJyZW50TG9jYXRpb24gPSBkZXRlcm1pbmVMb2NhdGlvbihldmVudCk7Ci0gICAgICAgIHNldEZlZWRiYWNrKGV2ZW50LCBjdXJyZW50TG9jYXRpb24pOwotCi0gICAgICAgIC8vc2VlIGlmIGFueXRoaW5nIGhhcyByZWFsbHkgY2hhbmdlZCBiZWZvcmUgZG9pbmcgdmFsaWRhdGlvbi4KLSAgICAgICAgaWYgKHRhcmdldCAhPSBjdXJyZW50VGFyZ2V0IHx8IGN1cnJlbnRMb2NhdGlvbiAhPSBvbGRMb2NhdGlvbikgewotICAgICAgICAgICAgY3VycmVudFRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgICAgIGRvRHJvcFZhbGlkYXRpb24oZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEcm9wVGFyZ2V0QWRhcHRlci4KLSAgICAgKiBUaGUgdXNlciBoYXMgZHJvcHBlZCBzb21ldGhpbmcgb24gdGhlIGRlc2t0b3Agdmlld2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGN1cnJlbnRMb2NhdGlvbiA9IGRldGVybWluZUxvY2F0aW9uKGV2ZW50KTsKLQotICAgICAgICAvL3BlcmZvcm0gdGhlIGRyb3AgYmVoYXZpb3VyCi0gICAgICAgIGlmICghcGVyZm9ybURyb3AoZXZlbnQuZGF0YSkpIHsKLSAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0gICAgICAgIH0KLSAgICAgICAgY3VycmVudE9wZXJhdGlvbiA9IGV2ZW50LmRldGFpbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERyb3BUYXJnZXRBZGFwdGVyLgotICAgICAqIExhc3QgY2hhbmNlIGZvciB0aGUgYWN0aW9uIHRvIGRpc2FibGUgaXRzZWxmCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZURyb3AoY3VycmVudFRhcmdldCwgZXZlbnQuZGV0YWlsLCBldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0gICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBTV1QgdHJlZSBvciB0YWJsZSBpdGVtLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW0gdGhlIFNXVCBJdGVtCi0gICAgICogQHJldHVybiB0aGUgYm91bmRzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyBub3QgYSBrbm93biB0eXBlIG9mIGl0ZW0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldEJvdW5kcyhJdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotICAgICAgICAgICAgcmV0dXJuICgoVHJlZUl0ZW0pIGl0ZW0pLmdldEJvdW5kcygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChUYWJsZUl0ZW0pIGl0ZW0pLmdldEJvdW5kcygwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29uc3RhbnQgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgdGhlIG1vdXNlIHJlbGF0aXZlIHRvIHRoZQotICAgICAqIHRhcmdldCAoYmVmb3JlLCBvbiwgb3IgYWZ0ZXIgdGhlIHRhcmdldC4gIAotICAgICAqCi0gICAgICogQHJldHVybiBvbmUgb2YgdGhlIDxjb2RlPkxPQ0FUSU9OXyogPC9jb2RlPiBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGlzIHR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGdldEN1cnJlbnRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5EUk9QXyo8L2NvZGU+IGNvbnN0YW50IGZyb20gY2xhc3MgPGNvZGU+RE5EPC9jb2RlPgotICAgICAqCi0gICAgICogQHNlZSBETkQjRFJPUF9DT1BZCi0gICAgICogQHNlZSBETkQjRFJPUF9NT1ZFCi0gICAgICogQHNlZSBETkQjRFJPUF9MSU5LCi0gICAgICogQHNlZSBETkQjRFJPUF9OT05FCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRDdXJyZW50T3BlcmF0aW9uKCkgewotICAgICAgICByZXR1cm4gY3VycmVudE9wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgb2JqZWN0IGN1cnJlbnRseSB1bmRlciB0aGUgbW91c2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRhcmdldCBvYmplY3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldEN1cnJlbnRUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50VGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB2aXNpYmxlIGluc2VydGlvbiBmZWVkYmFjayBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgotICAgICAqIDxwPgotICAgICAqIFR5cGljYWwgaW5zZXJ0aW9uIGZlZWRiYWNrIGlzIHRoZSBob3Jpem9udGFsIGluc2VydGlvbiBiYXJzIHRoYXQgYXBwZWFyIAotICAgICAqIGJldHdlZW4gYWRqYWNlbnQgaXRlbXMgd2hpbGUgZHJhZ2dpbmcuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB2aXN1YWwgZmVlZGJhY2sgaXMgZGVzaXJlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRGZWVkYmFja0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmZWVkYmFja0VuYWJsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IGN1cnJlbnRseSBzZWxlY3RlZCBieSB0aGUgdmlld2VyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc2VsZWN0ZWQgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBlaXRoZXIgbm8gb2JqZWN0IG9yIAotICAgICAqICAgbXVsdGlwbGUgb2JqZWN0cyBhcmUgc2VsZWN0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGVkT2JqZWN0KCkgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgICAgICByZXR1cm4gc3RydWN0dXJlZC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2aWV3ZXIgdG8gd2hpY2ggdGhpcyBkcm9wIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0gICAgICAgIHJldHVybiB2aWV3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgdGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLiBFeGNlcHRpb24gaGFuZGxpbmcgaGFzIGJlZW4gCi0gICAgICogCXJlbW92ZWQgZnJvbSBEcm9wVGFyZ2V0QWRhcHRlciBtZXRob2RzIG92ZXJyaWRkZW4gYnkgdGhpcyBjbGFzcy4KLSAgICAgKiBIYW5kbGVzIGFueSBleGNlcHRpb24gdGhhdCBvY2N1cnMgZHVyaW5nIGNhbGxiYWNrLCBpbmNsdWRpbmcgCi0gICAgICogcmV0aHJvd2luZyBiZWhhdmlvci4KLSAgICAgKiA8cD4KLSAgICAgKiBbSXNzdWU6IEltcGxlbWVudGF0aW9uIHByaW50cyBzdGFjayB0cmFjZSBhbmQgZWF0cyBleGNlcHRpb24gdG8gYXZvaWQKLSAgICAgKiAgY3Jhc2hpbmcgVkEvSi4KLSAgICAgKiAgQ29uc2lkZXIgY29uZGl0aW9uYWxpemluZyB0aGUgaW1wbGVtZW50YXRpb24gdG8gZG8gb25lIHRoaW5nIGluIFZBSgotICAgICAqICBhbmQgc29tZXRoaW5nIG1vcmUgcmVhc29uYWJsZSBpbiBvdGhlciBvcGVyYXRpbmcgZW52aXJvbm1lbnRzLgotICAgICAqIF0KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIHRoZSBleGNlcHRpb24KLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24sIERyb3BUYXJnZXRFdmVudCBldmVudCkgewotICAgICAgICAvLyBDdXJyZW50bHkgd2UgbmV2ZXIgcmV0aHJvdyBiZWNhdXNlIFZBL0phdmEgY3Jhc2hlcyBpZiBhbiBTV1QKLSAgICAgICAgLy8gY2FsbGJhY2sgdGhyb3dzIGFueXRoaW5nLiBHZW5lcmFsbHkgY2F0Y2hpbmcgVGhyb3dhYmxlIGlzIGJhZCwgYnV0IGluCi0gICAgICAgIC8vIHRoaXMgY2FzZXMgaXQncyBiZXR0ZXIgdGhhbiBoYW5naW5nIHRoZSBpbWFnZS4KLSAgICAgICAgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGFueSB3b3JrIGFzc29jaWF0ZWQgd2l0aCB0aGUgZHJvcC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgZHJvcCBiZWhhdmlvci4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZHJvcCBkYXRhCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZHJvcCB3YXMgc3VjY2Vzc2Z1bCwgYW5kIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHBlcmZvcm1Ecm9wKE9iamVjdCBkYXRhKTsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRHJvcFRhcmdldEFkYXB0ZXIuCi0gICAgICogVGhlIG1vdXNlIGhhcyBtb3ZlZCBvdmVyIHRoZSBkcm9wIHRhcmdldC4gIElmIHRoZQotICAgICAqIHRhcmdldCBpdGVtIGhhcyBjaGFuZ2VkLCBub3RpZnkgdGhlIGFjdGlvbiBhbmQgY2hlY2sKLSAgICAgKiB0aGF0IGl0IGlzIHN0aWxsIGVuYWJsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEZlZWRiYWNrKERyb3BUYXJnZXRFdmVudCBldmVudCwgaW50IGxvY2F0aW9uKSB7Ci0gICAgICAgIGlmIChmZWVkYmFja0VuYWJsZWQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobG9jYXRpb24pIHsKLSAgICAgICAgICAgIGNhc2UgTE9DQVRJT05fQkVGT1JFOgotICAgICAgICAgICAgICAgIGV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIExPQ0FUSU9OX0FGVEVSOgotICAgICAgICAgICAgICAgIGV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTE9DQVRJT05fT046Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgIC8vIEV4cGxpY2l0bHkgaW5oaWJpdCBTRUxFQ1QgZmVlZGJhY2sgaWYgZGVzaXJlZAotCQlpZiAoIXNlbGVjdEZlZWRiYWNrRW5hYmxlZCkKLQkJCWV2ZW50LmZlZWRiYWNrICY9IH5ETkQuRkVFREJBQ0tfU0VMRUNUOwotCi0JCWlmIChzY3JvbGxFeHBhbmRFbmFibGVkKQotCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0VYUEFORCB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0gICAgfQotCi0gICAgLyoqCi0JICogU2V0cyB3aGV0aGVyIHZpc2libGUgaW5zZXJ0aW9uIGZlZWRiYWNrIHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCi0JICogPHA+Ci0JICogVHlwaWNhbCBpbnNlcnRpb24gZmVlZGJhY2sgaXMgdGhlIGhvcml6b250YWwgaW5zZXJ0aW9uIGJhcnMgdGhhdCBhcHBlYXIKLQkgKiBiZXR3ZWVuIGFkamFjZW50IGl0ZW1zIHdoaWxlIGRyYWdnaW5nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHZpc3VhbCBmZWVkYmFjayBpcyBkZXNpcmVkLCBhbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGZWVkYmFja0VuYWJsZWQoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBmZWVkYmFja0VuYWJsZWQgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgc2VsZWN0aW9uIGZlZWRiYWNrIHNob3VsZCBiZSBwcm92aWRlZCBkdXJpbmcgZHJhZ2dpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc2VsZWN0aW9uIGZlZWRiYWNrIGlzIGRlc2lyZWQsIGFuZAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotICAgICAqICAgCi0gICAgICogQHNpbmNlIDMuMgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbkZlZWRiYWNrRW5hYmxlZChib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIHNlbGVjdEZlZWRiYWNrRW5hYmxlZCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBhdXRvIHNjcm9sbGluZyBhbmQgZXhwYW5kaW5nIHNob3VsZCBiZSBwcm92aWRlZCBkdXJpbmcgZHJhZ2dpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc2Nyb2xsaW5nIGFuZCBleHBhbmRpbmcgaXMgZGVzaXJlZCwgYW5kCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNjcm9sbEV4cGFuZEVuYWJsZWQoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBzY3JvbGxFeHBhbmRFbmFibGVkID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIGRyb3BwaW5nIG9uIHRoZSBnaXZlbiBvYmplY3QuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBzb21lIAotICAgICAqIGFzcGVjdCBvZiB0aGUgZHJvcCBvcGVyYXRpb24gY2hhbmdlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGRlZmluZSB3aGljaCBkcm9wcyBtYWtlIHNlbnNlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdGhhdCB0aGUgbW91c2UgaXMgY3VycmVudGx5IGhvdmVyaW5nIG92ZXIsIG9yCi0gICAgICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbW91c2UgaXMgaG92ZXJpbmcgb3ZlciBlbXB0eSBzcGFjZQotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIGN1cnJlbnQgZHJhZyBvcGVyYXRpb24gKGNvcHksIG1vdmUsIGV0Yy4pCi0gICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZSB0aGUgY3VycmVudCB0cmFuc2ZlciB0eXBlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZHJvcCBpcyB2YWxpZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdmFsaWRhdGVEcm9wKE9iamVjdCB0YXJnZXQsIGludCBvcGVyYXRpb24sCi0gICAgICAgICAgICBUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVmlld2VyRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1ZpZXdlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQwZWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVmlld2VyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQSB2aWV3ZXIgZmlsdGVyIGlzIHVzZWQgYnkgYSBzdHJ1Y3R1cmVkIHZpZXdlciB0bwotICogZXh0cmFjdCBhIHN1YnNldCBvZiBlbGVtZW50cyBwcm92aWRlZCBieSBpdHMgY29udGVudCBwcm92aWRlci4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgPGNvZGU+c2VsZWN0PC9jb2RlPiBtZXRob2QKLSAqIGFuZCBtYXkgaW1wbGVtZW50IHRoZSA8Y29kZT5pc0ZpbHRlclByb3BlcnR5PC9jb2RlPiBtZXRob2QuCi0gKiA8L3A+Ci0gKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gKiBAc2VlIFN0cnVjdHVyZWRWaWV3ZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZpZXdlckZpbHRlciB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB2aWV3ZXIgZmlsdGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBWaWV3ZXJGaWx0ZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsdGVycyB0aGUgZ2l2ZW4gZWxlbWVudHMgZm9yIHRoZSBnaXZlbiB2aWV3ZXIuCi0gICAgICogVGhlIGlucHV0IGFycmF5IGlzIG5vdCBtb2RpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBjYWxscyAKLSAgICAgKiA8Y29kZT5zZWxlY3Q8L2NvZGU+IG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXksIAotICAgICAqIGFuZCByZXR1cm5zIG9ubHkgdGhvc2UgZWxlbWVudHMgZm9yIHdoaWNoIDxjb2RlPnNlbGVjdDwvY29kZT4KLSAgICAgKiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgZWxlbWVudAotICAgICAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgdG8gZmlsdGVyCi0gICAgICogQHJldHVybiB0aGUgZmlsdGVyZWQgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZmlsdGVyKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0gICAgICAgIGludCBzaXplID0gZWxlbWVudHMubGVuZ3RoOwotICAgICAgICBBcnJheUxpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICBpZiAoc2VsZWN0KHZpZXdlciwgcGFyZW50LCBlbGVtZW50KSkKLSAgICAgICAgICAgICAgICBvdXQuYWRkKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQudG9BcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHZpZXdlciBmaWx0ZXIgd291bGQgYmUgYWZmZWN0ZWQgCi0gICAgICogYnkgYSBjaGFuZ2UgdG8gdGhlIGdpdmVuIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBlbGVtZW50LgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIHJlaW1wbGVtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbHRlcmluZyB3b3VsZCBiZSBhZmZlY3RlZCwKLSAgICAgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHdvdWxkIGJlIHVuYWZmZWN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCBtYWtlcyBpdCB0aHJvdWdoIHRoaXMgZmlsdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHZpZXdlciB0aGUgdmlld2VyCi0gICAgICogQHBhcmFtIHBhcmVudEVsZW1lbnQgdGhlIHBhcmVudCBlbGVtZW50Ci0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gdGhlCi0gICAgICogICBmaWx0ZXJlZCBzZXQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgZXhjbHVkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsCi0gICAgICAgICAgICBPYmplY3QgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1ZpZXdlckxhYmVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL1ZpZXdlckxhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MzYxNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9WaWV3ZXJMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGUgVmlld2VyTGFiZWwgaXMgdGhlIGNsYXNzIHRoYXQgaXMgcGFzc2VkIHRvIGEgdmlld2VyIHRvIGhhbmRsZSB1cGRhdGVzIG9mCi0gKiBsYWJlbHMuIEl0IGtlZXBzIHRyYWNrIG9mIGJvdGggb3JpZ2luYWwgYW5kIHVwZGF0ZXMgdGV4dC4KLSAqIAotICogQHNlZSBJVmlld2VyTGFiZWxQcm92aWRlcgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyTGFiZWwgewotCi0JLy9OZXcgdmFsdWVzIGZvciB0aGUgcmVjZWl2ZXIuIE51bGwgaWYgbm90aGluZyBoYXMgYmVlbiBzZXQuCi0JcHJpdmF0ZSBTdHJpbmcgbmV3VGV4dCA9IG51bGw7Ci0KLQlwcml2YXRlIEltYWdlIG5ld0ltYWdlID0gbnVsbDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gaW1hZ2VVcGRhdGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHRleHRVcGRhdGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIENvbG9yIGJhY2tncm91bmQgPSBudWxsOwotCi0JcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kID0gbnVsbDsKLQotCXByaXZhdGUgRm9udCBmb250ID0gbnVsbDsKLQotCS8vVGhlIGluaXRpYWwgdmFsdWVzIGZvciB0aGUgcmVjZWl2ZXIuCi0JcHJpdmF0ZSBTdHJpbmcgc3RhcnRUZXh0OwotCi0JcHJpdmF0ZSBJbWFnZSBzdGFydEltYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciB3aXRoIHRoZSBzdXBwbGllZAotCSAqIGluaXRpYWwgdGV4dCBhbmQgaW1hZ2UuCi0JICogQHBhcmFtIGluaXRpYWxUZXh0Ci0JICogQHBhcmFtIGluaXRpYWxJbWFnZQotCSAqLwotCXB1YmxpYyBWaWV3ZXJMYWJlbChTdHJpbmcgaW5pdGlhbFRleHQsIEltYWdlIGluaXRpYWxJbWFnZSkgewotCQlzdGFydFRleHQgPSBpbml0aWFsVGV4dDsKLQkJc3RhcnRJbWFnZSA9IGluaXRpYWxJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGltYWdlIGZvciB0aGUgcmVjZWl2ZXIuIElmIHRoZSBuZXcgaW1hZ2UgaGFzIGJlZW4gc2V0IHJldHVybiBpdCwKLQkgKiBvdGhlcndpc2UgcmV0dXJuIHRoZSBzdGFydGluZyBpbWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKGltYWdlVXBkYXRlZCkKLQkJCXJldHVybiBuZXdJbWFnZTsKLQkJcmV0dXJuIHN0YXJ0SW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBpbWFnZSBmb3IgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgVGhlIGltYWdlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQlpbWFnZVVwZGF0ZWQgPSB0cnVlOwotCQluZXdJbWFnZSA9IGltYWdlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdGV4dCBmb3IgdGhlIHJlY2VpdmVyLiBJZiB0aGUgbmV3IHRleHQgaGFzIGJlZW4gc2V0IHJldHVybiBpdCwKLQkgKiBvdGhlcndpc2UgcmV0dXJuIHRoZSBzdGFydGluZyB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGV4dC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmICh0ZXh0VXBkYXRlZCkKLQkJCXJldHVybiBuZXdUZXh0OwotCQlyZXR1cm4gc3RhcnRUZXh0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGV4dCBmb3IgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgbGFiZWwgdG8gc2V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJbmV3VGV4dCA9IHRleHQ7Ci0JCXRleHRVcGRhdGVkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIGltYWdlIGhhcyBiZWVuIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4uIDxjb2RlPnRydWU8L2NvZGU+ICBpZiB0aGUgaW1hZ2UgaGFzIGJlZW4gc2V0IHRvIHNvbWV0aGluZyBuZXcuCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05ld0ltYWdlKCkgewotCi0JCS8vSWYgd2Ugc3RhcnRlZCB3aXRoIG51bGwgYW55IGNoYW5nZSBpcyBhbiB1cGRhdGUKLQkJaWYgKHN0YXJ0SW1hZ2UgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdJbWFnZSAhPSBudWxsOwotCQkKLQkJaWYoaW1hZ2VVcGRhdGVkKQotCQkJcmV0dXJuICEoc3RhcnRJbWFnZS5lcXVhbHMobmV3SW1hZ2UpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgdGV4dCBoYXMgYmVlbiBzZXQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuLiA8Y29kZT50cnVlPC9jb2RlPiAgaWYgdGhlIHRleHQgaGFzIGJlZW4gc2V0IHRvIHNvbWV0aGluZyBuZXcuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTmV3VGV4dCgpIHsKLQotCQkvL0lmIHdlIHN0YXJ0ZWQgd2l0aCBudWxsIGFueSBjaGFuZ2UgaXMgYW4gdXBkYXRlCi0JCWlmIChzdGFydFRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdUZXh0ICE9IG51bGw7Ci0JCQotCQlpZih0ZXh0VXBkYXRlZCkKLQkJCXJldHVybiAhKHN0YXJ0VGV4dC5lcXVhbHMobmV3VGV4dCkpOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgYmFja2dyb3VuZCBjb2xvciBoYXMgYmVlbiBzZXQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuLiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgaGFzIGJlZW4gc2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05ld0JhY2tncm91bmQoKSB7Ci0JCXJldHVybiBiYWNrZ3JvdW5kICE9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgZm9yZWdyb3VuZCBjb2xvciBoYXMgYmVlbiBzZXQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuLiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgaGFzIGJlZW4gc2V0LgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXdGb3JlZ3JvdW5kKCkgewotCQlyZXR1cm4gZm9yZWdyb3VuZCAhPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIGZvbnQgaGFzIGJlZW4gc2V0LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbi4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHZhbHVlIGhhcyBiZWVuIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTmV3Rm9udCgpIHsKLQkJcmV0dXJuIGZvbnQgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJhY2tncm91bmQgQ29sb3IuCi0JICogQHJldHVybiBDb2xvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBuZXcgdmFsdWUKLQkgKiB3YXMgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIGJhY2tncm91bmQ7Ci0JfQotCS8qKgotCSAqIFNldCB0aGUgYmFja2dyb3VuZCBDb2xvci4KLQkgKiBAcGFyYW0gYmFja2dyb3VuZCBDb2xvcgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKENvbG9yIGJhY2tncm91bmQpIHsKLQkJdGhpcy5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsKLQl9Ci0JLyoqCi0JICogR2V0IHRoZSBmb250LgotCSAqIEByZXR1cm4gRm9udCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBuZXcgdmFsdWUKLQkgKiB3YXMgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgRm9udCBnZXRGb250KCkgewotCQlyZXR1cm4gZm9udDsKLQl9Ci0JLyoqCi0JICogU2V0IHRoZSBmb250LgotCSAqIEBwYXJhbSBmb250IEZvbnQKLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udChGb250IGZvbnQpIHsKLQkJdGhpcy5mb250ID0gZm9udDsKLQl9Ci0JLyoqCi0JICogR2V0IHRoZSBmb3JlZ3JvdW5kIENvbG9yLgotCSAqIEByZXR1cm4gQ29sb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbmV3IHZhbHVlCi0JICogd2FzIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoKSB7Ci0JCXJldHVybiBmb3JlZ3JvdW5kOwotCX0KLQkvKioKLQkgKiBTZXQgdGhlIGZvcmVncm91bmQgQ29sb3IuCi0JICogQHBhcmFtIGZvcmVncm91bmQKLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChDb2xvciBmb3JlZ3JvdW5kKSB7Ci0JCXRoaXMuZm9yZWdyb3VuZCA9IGZvcmVncm91bmQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9WaWV3ZXJTb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvVmlld2VyU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyODZhOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9WaWV3ZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyczsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIEEgdmlld2VyIHNvcnRlciBpcyB1c2VkIGJ5IGEgc3RydWN0dXJlZCB2aWV3ZXIgdG8KLSAqIHJlb3JkZXIgdGhlIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IGl0cyBjb250ZW50IHByb3ZpZGVyLgotICogPHA+Ci0gKiBUaGUgZGVmYXVsdCA8Y29kZT5jb21wYXJlPC9jb2RlPiBtZXRob2QgY29tcGFyZXMgZWxlbWVudHMgdXNpbmcgdHdvIHN0ZXBzLiAKLSAqIFRoZSBmaXJzdCBzdGVwIHVzZXMgdGhlIHZhbHVlcyByZXR1cm5lZCBmcm9tIDxjb2RlPmNhdGVnb3J5PC9jb2RlPi4gCi0gKiBCeSBkZWZhdWx0LCBhbGwgZWxlbWVudHMgYXJlIGluIHRoZSBzYW1lIGNhdGVnb3J5LiAKLSAqIFRoZSBzZWNvbmQgbGV2ZWwgaXMgYmFzZWQgb24gYSBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmUgb2YgdGhlIHN0cmluZ3Mgb2J0YWluZWQgCi0gKiBmcm9tIHRoZSBjb250ZW50IHZpZXdlcidzIGxhYmVsIHByb3ZpZGVyIHZpYSA8Y29kZT5JTGFiZWxQcm92aWRlci5nZXRUZXh0PC9jb2RlPi4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtYXkgaW1wbGVtZW50IHRoZSA8Y29kZT5pc1NvcnRlclByb3BlcnR5PC9jb2RlPiBtZXRob2Q7Ci0gKiB0aGV5IG1heSByZWltcGxlbWVudCB0aGUgPGNvZGU+Y2F0ZWdvcnk8L2NvZGU+IG1ldGhvZCB0byBwcm92aWRlIAotICogY2F0ZWdvcml6YXRpb247IGFuZCB0aGV5IG1heSBvdmVycmlkZSB0aGUgPGNvZGU+Y29tcGFyZTwvY29kZT4gbWV0aG9kcwotICogdG8gcHJvdmlkZSBhIHRvdGFsbHkgZGlmZmVyZW50IHdheSBvZiBzb3J0aW5nIGVsZW1lbnRzLgotICogPC9wPgotICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICogQHNlZSBTdHJ1Y3R1cmVkVmlld2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3ZXJTb3J0ZXIgewotICAgIC8qKgotICAgICAqIFRoZSBjb2xsYXRvciB1c2VkIHRvIHNvcnQgc3RyaW5ncy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29sbGF0b3IgY29sbGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHZpZXdlciBzb3J0ZXIsIHdoaWNoIHVzZXMgdGhlIGRlZmF1bHQgY29sbGF0b3IKLSAgICAgKiB0byBzb3J0IHN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIFZpZXdlclNvcnRlcigpIHsKLSAgICAgICAgdGhpcyhDb2xsYXRvci5nZXRJbnN0YW5jZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHZpZXdlciBzb3J0ZXIsIHdoaWNoIHVzZXMgdGhlIGdpdmVuIGNvbGxhdG9yCi0gICAgICogdG8gc29ydCBzdHJpbmdzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbGxhdG9yIHRoZSBjb2xsYXRvciB0byB1c2UgdG8gc29ydCBzdHJpbmdzCi0gICAgICovCi0gICAgcHVibGljIFZpZXdlclNvcnRlcihDb2xsYXRvciBjb2xsYXRvcikgewotICAgICAgICB0aGlzLmNvbGxhdG9yID0gY29sbGF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2F0ZWdvcnkgb2YgdGhlIGdpdmVuIGVsZW1lbnQuIFRoZSBjYXRlZ29yeSBpcyBhCi0gICAgICogbnVtYmVyIHVzZWQgdG8gYWxsb2NhdGUgZWxlbWVudHMgdG8gYmluczsgdGhlIGJpbnMgYXJlIGFycmFuZ2VkCi0gICAgICogaW4gYXNjZW5kaW5nIG51bWVyaWMgb3JkZXIuIFRoZSBlbGVtZW50cyB3aXRoaW4gYSBiaW4gYXJlIGFycmFuZ2VkCi0gICAgICogdmlhIGEgc2Vjb25kIGxldmVsIHNvcnQgY3JpdGVyaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCByZXR1cm5zCi0gICAgICogPGNvZGU+MDwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUKLSAgICAgKiBub24tdHJpdmlhbCBjYXRlZ29yaXphdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotICAgICAqIEByZXR1cm4gdGhlIGNhdGVnb3J5Ci0gICAgICovCi0gICAgcHVibGljIGludCBjYXRlZ29yeShPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmVnYXRpdmUsIHplcm8sIG9yIHBvc2l0aXZlIG51bWJlciBkZXBlbmRpbmcgb24gd2hldGhlcgotICAgICAqIHRoZSBmaXJzdCBlbGVtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbgotICAgICAqIHRoZSBzZWNvbmQgZWxlbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpcyBiYXNlZCBvbgotICAgICAqIGNvbXBhcmluZyB0aGUgZWxlbWVudHMnIGNhdGVnb3JpZXMgYXMgY29tcHV0ZWQgYnkgdGhlIDxjb2RlPmNhdGVnb3J5PC9jb2RlPgotICAgICAqIGZyYW1ld29yayBtZXRob2QuIEVsZW1lbnRzIHdpdGhpbiB0aGUgc2FtZSBjYXRlZ29yeSBhcmUgZnVydGhlciAKLSAgICAgKiBzdWJqZWN0ZWQgdG8gYSBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmUgb2YgdGhlaXIgbGFiZWwgc3RyaW5ncywgZWl0aGVyCi0gICAgICogYXMgY29tcHV0ZWQgYnkgdGhlIGNvbnRlbnQgdmlld2VyJ3MgbGFiZWwgcHJvdmlkZXIsIG9yIHRoZWlyIAotICAgICAqIDxjb2RlPnRvU3RyaW5nPC9jb2RlPiB2YWx1ZXMgaW4gb3RoZXIgY2FzZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIKLSAgICAgKiBAcGFyYW0gZTEgdGhlIGZpcnN0IGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gZTIgdGhlIHNlY29uZCBlbGVtZW50Ci0gICAgICogQHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBsZXNzICB0aGFuIHRoZSAKLSAgICAgKiAgc2Vjb25kIGVsZW1lbnQ7IHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcwotICAgICAqICBlcXVhbCB0byB0aGUgc2Vjb25kIGVsZW1lbnQ7IGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QKLSAgICAgKiAgZWxlbWVudCBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0KLSAgICAgICAgaW50IGNhdDEgPSBjYXRlZ29yeShlMSk7Ci0gICAgICAgIGludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0gICAgICAgIGlmIChjYXQxICE9IGNhdDIpCi0gICAgICAgICAgICByZXR1cm4gY2F0MSAtIGNhdDI7Ci0KLSAgICAgICAgLy8gY2F0MSA9PSBjYXQyCi0KLSAgICAgICAgU3RyaW5nIG5hbWUxOwotICAgICAgICBTdHJpbmcgbmFtZTI7Ci0KLSAgICAgICAgaWYgKHZpZXdlciA9PSBudWxsIHx8ICEodmlld2VyIGluc3RhbmNlb2YgQ29udGVudFZpZXdlcikpIHsKLSAgICAgICAgICAgIG5hbWUxID0gZTEudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIG5hbWUyID0gZTIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBwcm92ID0gKChDb250ZW50Vmlld2VyKSB2aWV3ZXIpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgICAgICBpZiAocHJvdiBpbnN0YW5jZW9mIElMYWJlbFByb3ZpZGVyKSB7Ci0gICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbHByb3YgPSAoSUxhYmVsUHJvdmlkZXIpIHByb3Y7Ci0gICAgICAgICAgICAgICAgbmFtZTEgPSBscHJvdi5nZXRUZXh0KGUxKTsKLSAgICAgICAgICAgICAgICBuYW1lMiA9IGxwcm92LmdldFRleHQoZTIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuYW1lMSA9IGUxLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgbmFtZTIgPSBlMi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lMSA9PSBudWxsKQotICAgICAgICAgICAgbmFtZTEgPSAiIjsvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChuYW1lMiA9PSBudWxsKQotICAgICAgICAgICAgbmFtZTIgPSAiIjsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBjb2xsYXRvci5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29sbGF0b3IgdXNlZCB0byBzb3J0IHN0cmluZ3MuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb2xsYXRvciB1c2VkIHRvIHNvcnQgc3RyaW5ncwotICAgICAqLwotICAgIHB1YmxpYyBDb2xsYXRvciBnZXRDb2xsYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbGxhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHZpZXdlciBzb3J0ZXIgd291bGQgYmUgYWZmZWN0ZWQgCi0gICAgICogYnkgYSBjaGFuZ2UgdG8gdGhlIGdpdmVuIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBlbGVtZW50LgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotICAgICAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNvcnRpbmcgd291bGQgYmUgYWZmZWN0ZWQsCi0gICAgICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCB3b3VsZCBiZSB1bmFmZmVjdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gZWxlbWVudHMgaW4tcGxhY2UsIG1vZGlmeWluZyB0aGUgZ2l2ZW4gYXJyYXkuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdXNlcyB0aGUgCi0gICAgICogamF2YS51dGlsLkFycmF5cyNzb3J0IGFsZ29yaXRobSBvbiB0aGUgZ2l2ZW4gYXJyYXksIAotICAgICAqIGNhbGxpbmcgPGNvZGU+Y29tcGFyZTwvY29kZT4gdG8gY29tcGFyZSBlbGVtZW50cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhIG1vcmUgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2aWV3ZXIgdGhlIHZpZXdlcgotICAgICAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgdG8gc29ydAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNvcnQoZmluYWwgVmlld2VyIHZpZXdlciwgT2JqZWN0W10gZWxlbWVudHMpIHsKLSAgICAgICAgQXJyYXlzLnNvcnQoZWxlbWVudHMsIG5ldyBDb21wYXJhdG9yKCkgewotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotICAgICAgICAgICAgICAgIHJldHVybiBWaWV3ZXJTb3J0ZXIudGhpcy5jb21wYXJlKHZpZXdlciwgYSwgYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvQWJzdHJhY3RDb25jdXJyZW50TW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvQWJzdHJhY3RDb25jdXJyZW50TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5MzI0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL2RlZmVycmVkL0Fic3RyYWN0Q29uY3VycmVudE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotCi0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIElDb25jdXJyZW50TW9kZWwgaW1wbGVtZW50YXRpb25zLiBDbGllbnRzIHNob3VsZAotICogc3ViY2xhc3MgdGhpcyBjbGFzcyBpbnN0ZWFkIG9mIGltcGxlbWVudGluZyBJQ29uY3VycmVudE1vZGVsIGRpcmVjdGx5LiAKLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb25jdXJyZW50TW9kZWwgaW1wbGVtZW50cwotICAgICAgICBJQ29uY3VycmVudE1vZGVsIHsKLQotICAgIHByaXZhdGUgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsgCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZC5JQ29uY3VycmVudENvbnRlbnRQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLmRlZmVycmVkLklDb25jdXJyZW50Q29udGVudFByb3ZpZGVyTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGaXJlcyBhbiBhZGQgbm90aWZpY2F0aW9uIHRvIGFsbCBsaXN0ZW5lcnMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWRkZWQgb2JqZWN0cyBhZGRlZCB0byB0aGUgc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUFkZChPYmplY3RbXSBhZGRlZCkgewotICAgICAgICBPYmplY3RbXSBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lckFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJQ29uY3VycmVudE1vZGVsTGlzdGVuZXIgbmV4dCA9IChJQ29uY3VycmVudE1vZGVsTGlzdGVuZXIpIGxpc3RlbmVyQXJyYXlbaV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG5leHQuYWRkKGFkZGVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpcmVzIGEgcmVtb3ZlIG5vdGlmaWNhdGlvbiB0byBhbGwgbGlzdGVuZXJzCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlbW92ZWQgb2JqZWN0cyByZW1vdmVkIGZyb20gdGhlIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVSZW1vdmUoT2JqZWN0W10gcmVtb3ZlZCkgewotICAgICAgICBPYmplY3RbXSBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lckFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJQ29uY3VycmVudE1vZGVsTGlzdGVuZXIgbmV4dCA9IChJQ29uY3VycmVudE1vZGVsTGlzdGVuZXIpIGxpc3RlbmVyQXJyYXlbaV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG5leHQucmVtb3ZlKHJlbW92ZWQpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEZpcmVzIGFuIHVwZGF0ZSBub3RpZmljYXRpb24gdG8gYWxsIGxpc3RlbmVycwotICAgICAqIAotICAgICAqIEBwYXJhbSB1cGRhdGVkIG9iamVjdHMgdGhhdCBoYXZlIGNoYW5nZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlVXBkYXRlKE9iamVjdFtdIHVwZGF0ZWQpIHsKLSAgICAgICAgT2JqZWN0W10gbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyIG5leHQgPSAoSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyKSBsaXN0ZW5lckFycmF5W2ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBuZXh0LnVwZGF0ZSh1cGRhdGVkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBsaXN0ZW5lcnMgZm9yIHRoaXMgbW9kZWwKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBsaXN0ZW5lcnMgZm9yIHRoaXMgbW9kZWwgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIElDb25jdXJyZW50TW9kZWxMaXN0ZW5lcltdIGdldExpc3RlbmVycygpIHsKLSAgICAJT2JqZWN0W10gbCA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICAJSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyW10gcmVzdWx0ID0gbmV3IElDb25jdXJyZW50TW9kZWxMaXN0ZW5lcltsLmxlbmd0aF07Ci0gICAgCQotICAgIAlmb3IgKGludCBpID0gMDsgaSA8IGwubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IChJQ29uY3VycmVudE1vZGVsTGlzdGVuZXIpbFtpXTsKLQkJfQotICAgIAkKLSAgICAJcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZC5JQ29uY3VycmVudENvbnRlbnRQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLmRlZmVycmVkLklDb25jdXJyZW50Q29udGVudFByb3ZpZGVyTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvQWJzdHJhY3RWaXJ0dWFsVGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvQWJzdHJhY3RWaXJ0dWFsVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4ZDZjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL2RlZmVycmVkL0Fic3RyYWN0VmlydHVhbFRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogV3JhcHBlciBmb3IgYSB2aXJ0dWFsLXRhYmxlLWxpa2Ugd2lkZ2V0LiBDb250YWlucyBhbGwgbWV0aG9kcyBuZWVkZWQgZm9yIGxhenkgdXBkYXRlcy4KLSAqIFRoZSBKRmFjZSBhbGdvcml0aG1zIGZvciBkZWZlcnJlZCBvciBsYXp5IGNvbnRlbnQgcHJvdmlkZXJzIHNob3VsZCB0YWxrIHRvIHRoaXMgY2xhc3MKLSAqIGluc3RlYWQgb2YgZGlyZWN0bHkgdG8gYSBUYWJsZVZpZXdlci4gVGhpcyB3aWxsIGFsbG93IHRoZW0gdG8gYmUgdXNlZCB3aXRoIG90aGVyIHZpcnR1YWwKLSAqIHZpZXdlcnMgYW5kIHdpZGdldHMgaW4gdGhlIGZ1dHVyZS4KLSAqIAotICogPHA+Ci0gKiBGb3IgZXhhbXBsZSwgaWYgU1dUIHN0YXJ0cyB0byBzdXBwb3J0IHZpcnR1YWwgTGlzdHMgaW4gdGhlIGZ1dHVyZSwgaXQgc2hvdWxkIGJlIHBvc3NpYmxlCi0gKiB0byBjcmVhdGUgYW4gYWRhcHRlciBmcm9tIDxjb2RlPkFic3RyYWN0VmlydHVhbFRhYmxlPC9jb2RlPiB0byA8Y29kZT5MaXN0Vmlld2VyPC9jb2RlPiBpbiAKLSAqIG9yZGVyIHRvIHJldXNlIHRoZSBleGlzdGluZyBhbGdvcml0aG1zIGZvciBkZWZlcnJlZCB1cGRhdGVzLiAKLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGlzIHBhY2thZ2UgdmlzaWJsaXR5IGJ5IGRlc2lnbi4gSXQgd291bGQgb25seSBuZWVkIHRvIGJlIG1hZGUgcHVibGljIGlmIHRoZXJlIHdhcwotICogYSBkZW1hbmQgdG8gdXNlIHRoZSBkZWZlcnJlZCBjb250ZW50IHByb3ZpZGVyIGFsZ29yaXRobXMgbGlrZSAKLSAqIDxjb2RlPkJhY2tncm91bmRDb250ZW50UHJvdmlkZXI8L2NvZGU+IHdpdGggbm9uLUpGYWNlIHZpZXdlcnMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWaXJ0dWFsVGFibGUgewotICAgIC8qKgotICAgICAqIFRlbGxzIHRoZSByZWNlaXZlciB0aGF0IHRoZSBpdGVtIGF0IGdpdmVuIHJvdyBoYXMgY2hhbmdlZC4gVGhpcyBtYXkgaW5kaWNhdGUKLSAgICAgKiB0aGF0IGEgZGlmZmVyZW50IGVsZW1lbnQgaXMgbm93IGF0IHRoaXMgcm93LCBidXQgZG9lcyBub3QgbmVjZXNzYXJpbHkgaW5kaWNhdGUKLSAgICAgKiB0aGF0IHRoZSBlbGVtZW50IGl0c2VsZiBoYXMgY2hhbmdlZC4gVGhlIHJlY2VpdmVyIHNob3VsZCByZXF1ZXN0IGluZm9ybWF0aW9uIGZvcgotICAgICAqIHRoaXMgcm93IHRoZSBuZXh0IHRpbWUgaXQgYmVjb21lcyB2aXNpYmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggcm93IHRvIGNsZWFyCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXIoaW50IGluZGV4KTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGUgcmVjZWl2ZXIgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBub3cgbG9jYXRlZCBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQgb2JqZWN0IGxvY2F0ZWQgYXQgdGhlIHJvdwotICAgICAqIEBwYXJhbSBpdGVtSW5kZXggcm93IG51bWJlcgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcGxhY2UoT2JqZWN0IGVsZW1lbnQsIGludCBpdGVtSW5kZXgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGl0ZW0gY291bnQgZm9yIHRoaXMgdGFibGUgCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvdGFsIG5ldyB0b3RhbCBudW1iZXIgb2YgaXRlbXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJdGVtQ291bnQoaW50IHRvdGFsKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgdG9wIGl0ZW0gdmlzaWJsZSBpbiB0aGUgdGFibGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgdG9wIGl0ZW0gdmlzaWJsZSBpbiB0aGUgdGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFRvcEluZGV4KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSB0YWJsZS4gVGhpcyBpcwotICAgICAqIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50bHkgdmlzaWJsZSB3aW5kb3csIG5vdCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgdGFibGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSB0YWJsZQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VmlzaWJsZUl0ZW1Db3VudCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdGFibGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRhYmxlCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGludCBnZXRJdGVtQ291bnQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTV1QgY29udHJvbCB0aGF0IHRoaXMgQVBJIGlzIHdyYXBwZXJpbmcuCi0gICAgICogQHJldHVybiBDb250cm9sLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBDb250cm9sIGdldENvbnRyb2woKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvQmFja2dyb3VuZENvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9kZWZlcnJlZC9CYWNrZ3JvdW5kQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYzM4YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9kZWZlcnJlZC9CYWNrZ3JvdW5kQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWNjZXB0QWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLmRlZmVycmVkLkNvbmN1cnJlbnRUYWJsZVVwZGF0b3IuUmFuZ2U7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIGFsZ29yaXRobSBmb3IgcGVyZm9ybWluZyBiYWNrZ3JvdW5kIHNvcnRpbmcgYW5kIGZpbHRlcmluZyBpbiBhIHZpcnR1YWwKLSAqIHRhYmxlLiBUaGlzIGlzIHRoZSByZWFsIGltcGxlbWVudGF0aW9uIGZvciA8Y29kZT5EZWZlcnJlZENvbnRlbnRQcm92aWRlcjwvY29kZT4uCi0gKiBIb3dldmVyLCB0aGlzIGNsYXNzIHdpbGwgd29yayB3aXRoIGFueXRoaW5nIHRoYXQgaW1wbGVtZW50cyA8Y29kZT5BYnN0cmFjdFZpcnR1YWxUYWJsZTwvY29kZT4KLSAqIHJhdGhlciB0aGFuIGJlaW5nIHRpZWQgdG8gYSA8Y29kZT5UYWJsZVZpZXdlcjwvY29kZT4uCi0gKiAKLSAqIDxwPgotICogVGhpcyBpcyBwYWNrYWdlIHZpc2libGl0eSBzaW5jZSBpdCBjdXJyZW50bHkgb25seSBuZWVkcyB0byBiZSB1c2VkIGluIG9uZSBwbGFjZSwKLSAqIGJ1dCBpdCBjb3VsZCBwb3RlbnRpYWxseSBiZSBtYWRlIHB1YmxpYyBpZiB0aGVyZSB3YXMgYSBuZWVkIHRvIHVzZSB0aGUgc2FtZSBiYWNrZ3JvdW5kCi0gKiBzb3J0aW5nIGFsZ29yaXRobSBmb3Igc29tZXRoaW5nIG90aGVyIHRoYW4gYSBUYWJsZVZpZXdlci4gCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogSW5mb3JtYXRpb24gZmxvdyBpcyBsaWtlIHRoaXM6Ci0gKiA8L3A+Ci0gKiA8b2w+SUNvbmN1cnJlbnRNb2RlbCBzZW5kcyB1bm9yZGVyZWQgZWxlbWVudHMgdG8gQmFja2dyb3VuZENvbnRlbnRQcm92aWRlciAoaW4gYSBiYWNrZ3JvdW5kIHRocmVhZCk8L29sPgotICogPG9sPkJhY2tncm91bmRDb250ZW50UHJvdmlkZXIgc29ydHMsIGZpbHRlcnMsIGFuZCBzZW5kcyBlbGVtZW50L2luZGV4IHBhaXJzIHRvCi0gKiAgICAgQ29uY3VycmVudFRhYmxlVXBkYXRvciAoaW4gYSBiYWNrZ3JvdW5kIHRocmVhZCk8L29sPgotICogPG9sPkNvbmN1cnJlbnRUYWJsZVVwZGF0b3IgYmF0Y2hlcyB0aGUgdXBkYXRlcyBhbmQgc2VuZHMgdGhlbSB0byBhbiBBYnN0cmFjdFZpcnR1YWxUYWJsZSAKLSAqICAgICAoaW4gdGhlIFVJIHRocmVhZCk8L29sPiAgCi0gKiA8bGk+Ci0gKiA8L29sPgotICogCi0gKiA8cD4KLSAqIEludGVybmFsbHksIHNvcnRpbmcgaXMgZG9uZSB1c2luZyBhIDxjb2RlPkxhenlTb3J0ZWRDb2xsZWN0aW9uPC9jb2RlPi4gVGhpcyBkYXRhIHN0cnVjdHVyZQotICogYWxsb3dzIHRoZSBjb250ZW50IHByb3ZpZGVyIHRvIGxvY2F0ZSBhbmQgc29ydCB0aGUgdmlzaWJsZSByYW5nZSB3aXRob3V0IGZ1bGx5IHNvcnRpbmcKLSAqIGFsbCBlbGVtZW50cyBpbiB0aGUgdGFibGUuIEl0IGFsc28gc3VwcG9ydHMgZmFzdCBjYW5jZWxsYXRpb24sIGFsbG93aW5nIHRoZSB2aXNpYmxlIHJhbmdlCi0gKiB0byBjaGFuZ2UgaW4gdGhlIG1pZGRsZSBvZiBhIHNvcnQgd2l0aG91dCBkaXNjYXJkaW5nIHBhcnRpYWxseS1zb3J0ZWQgaW5mb3JtYXRpb24gZnJvbQotICogdGhlIHByZXZpb3VzIHJhbmdlLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLS8qIHBhY2thZ2UgKi8gZmluYWwgY2xhc3MgQmFja2dyb3VuZENvbnRlbnRQcm92aWRlciB7Ci0gICAgCi0JLyoqCi0JICogU29ydGluZyBtZXNzYWdlIHN0cmluZwotCSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT1JUSU5HID0gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJTb3J0aW5nIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRhYmxlIGxpbWl0LiAtMSBpZiB1bmxpbWl0ZWQKLSAgICAgKi8KLQlwcml2YXRlIGludCBsaW1pdCA9IC0xOwotCQotCS8qKgotCSAqIE1vZGVsIHRoYXQgaXMgY3VycmVudGx5IHByb3ZpZGluZyBpbnB1dCB0byB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuCi0JICovCi0gICAgcHJpdmF0ZSBJQ29uY3VycmVudE1vZGVsIG1vZGVsOwotICAgIAotICAgIC8qKgotICAgICAqIEN1cnJlbnQgc29ydCBvcmRlciAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvbGF0aWxlIENvbXBhcmF0b3Igc29ydE9yZGVyOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWZmIHRoZSBjb250ZW50IHByb3ZpZGVyIGhhcyAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvbGF0aWxlIElGaWx0ZXIgZmlsdGVyID0gQWNjZXB0QWxsRmlsdGVyLmdldEluc3RhbmNlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUXVldWVkIGNoYW5nZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIENoYW5nZVF1ZXVlIGNoYW5nZVF1ZXVlID0gbmV3IENoYW5nZVF1ZXVlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTGlzdGVuZXIgdGhhdCBnZXRzIGNhbGxiYWNrcyBmcm9tIHRoZSBtb2RlbAotICAgICAqLwotICAgIHByaXZhdGUgSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElDb25jdXJyZW50TW9kZWxMaXN0ZW5lcigpIHsKLSAgICAJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQuSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyI2FkZChqYXZhLmxhbmcuT2JqZWN0W10pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGQoT2JqZWN0W10gYWRkZWQpIHsKLQkJCUJhY2tncm91bmRDb250ZW50UHJvdmlkZXIudGhpcy5hZGQoYWRkZWQpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZC5JQ29uY3VycmVudE1vZGVsTGlzdGVuZXIjcmVtb3ZlKGphdmEubGFuZy5PYmplY3RbXSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3RbXSByZW1vdmVkKSB7Ci0JCQlCYWNrZ3JvdW5kQ29udGVudFByb3ZpZGVyLnRoaXMucmVtb3ZlKHJlbW92ZWQpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZC5JQ29uY3VycmVudE1vZGVsTGlzdGVuZXIjc2V0Q29udGVudHMoamF2YS5sYW5nLk9iamVjdFtdKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0Q29udGVudHMoT2JqZWN0W10gbmV3Q29udGVudHMpIHsKLQkJCUJhY2tncm91bmRDb250ZW50UHJvdmlkZXIudGhpcy5zZXRDb250ZW50cyhuZXdDb250ZW50cyk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLmRlZmVycmVkLklDb25jdXJyZW50TW9kZWxMaXN0ZW5lciN1cGRhdGUoamF2YS5sYW5nLk9iamVjdFtdKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdXBkYXRlKE9iamVjdFtdIGNoYW5nZWQpIHsKLQkJCUJhY2tncm91bmRDb250ZW50UHJvdmlkZXIudGhpcy51cGRhdGUoY2hhbmdlZCk7Ci0JCX0KLQkJCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIE9iamVjdCB0aGF0IHBvc3RzIHVwZGF0ZXMgdG8gdGhlIFVJIHRocmVhZC4gTXVzdCBzeW5jaHJvbml6ZSBvbgotICAgICAqIHNvcnRNdXRleCB3aGVuIGFjY2Vzc2luZy4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb25jdXJyZW50VGFibGVVcGRhdG9yIHVwZGF0b3I7Ci0gICAgCi0gICAgcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIHNvcnRpbmdQcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotICAgIHByaXZhdGUgVGhyZWFkIHNvcnRUaHJlYWQgPSBuZXcgVGhyZWFkKFNPUlRJTkcpIHsKLSAgICAJcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgZG9Tb3J0KHNvcnRpbmdQcm9ncmVzc01vbml0b3IpOwotICAgIAl9Ci0gICAgfTsKLQotCXByaXZhdGUgdm9sYXRpbGUgRmFzdFByb2dyZXNzUmVwb3J0ZXIgc29ydE1vbiA9IG5ldyBGYXN0UHJvZ3Jlc3NSZXBvcnRlcigpOwotCi0JcHJpdmF0ZSB2b2xhdGlsZSBSYW5nZSByYW5nZSA9IG5ldyBSYW5nZSgwLDApOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYmFja2dyb3VuZCBjb250ZW50IHByb3ZpZGVyCi0gICAgICogIAotICAgICAqIEBwYXJhbSB0YWJsZSB0YWJsZSB0aGF0IHdpbGwgcmVjZWl2ZSB1cGRhdGVzCi0gICAgICogQHBhcmFtIG1vZGVsIGRhdGEgc291cmNlCi0gICAgICogQHBhcmFtIHNvcnRPcmRlciBpbml0aWFsIHNvcnQgb3JkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQmFja2dyb3VuZENvbnRlbnRQcm92aWRlcihBYnN0cmFjdFZpcnR1YWxUYWJsZSB0YWJsZSwgCi0gICAgICAgICAgICBJQ29uY3VycmVudE1vZGVsIG1vZGVsLCBDb21wYXJhdG9yIHNvcnRPcmRlcikgewotICAgICAgICAKLSAgICAgICAgdXBkYXRvciA9IG5ldyBDb25jdXJyZW50VGFibGVVcGRhdG9yKHRhYmxlKTsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICB0aGlzLnNvcnRPcmRlciA9IHNvcnRPcmRlcjsKLSAgICAgICAgc29ydFRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0gICAgICAgIHNvcnRUaHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgLSAxKTsKLSAgICAgICAgbW9kZWwuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDbGVhbnMgdXAgdGhpcyBjb250ZW50IHByb3ZpZGVyLCBkZXRhY2hlcyBsaXN0ZW5lcnMsIGZyZWVzIHVwIG1lbW9yeSwgZXRjLiAKLSAgICAgKiBNdXN0IGJlIHRoZSBsYXN0IHB1YmxpYyBtZXRob2QgY2FsbGVkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGNhbmNlbFNvcnRKb2IoKTsKLSAgICAgICAgdXBkYXRvci5kaXNwb3NlKCk7Ci0gICAgICAgIG1vZGVsLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRm9yY2UgYSByZWZyZXNoLiBBc2tzIHRoZSBtb2RlbCB0byByZS1zZW5kIGl0cyBjb21wbGV0ZSBjb250ZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgIAlpZiAodXBkYXRvci5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgICAgICBtb2RlbC5yZXF1ZXN0VXBkYXRlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgZnJvbSBzb3J0Sm9iLiBTb3J0cyB0aGUgZWxlbWVudHMgZGVmaW5lZCBieSBzb3J0U3RhcnQgYW5kIHNvcnRMZW5ndGguCi0gICAgICogU2NoZWR1bGVzIGEgVUkgdXBkYXRlIHdoZW4gZmluaXNoZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1vbiBtb25pdG9yIHdoZXJlIHByb2dyZXNzIHdpbGwgYmUgcmVwb3J0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZG9Tb3J0KElQcm9ncmVzc01vbml0b3IgbW9uKSB7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHNvbWUgd2VpcmRuZXNzIGluIHRoZSBKb2JzIGZyYW1ld29yazogaWYgeW91IGNhbmNlbCBhIG1vbml0b3IKLSAgICAgICAgLy8gZm9yIGEgam9iIHRoYXQgaGFzIGVuZGVkIGFuZCByZXNjaGVkdWxlIHRoYXQgc2FtZSBqb2IsIGl0IHdpbGwgc3RhcnQgCi0gICAgICAgIC8vIHRoZSBqb2Igd2l0aCBhIG1vbml0b3IgdGhhdCBpcyBhbHJlYWR5IGNhbmNlbGxlZC4gV2UgY2FuIHdvcmthcm91bmQgdGhpcyBieQotICAgICAgICAvLyByZW1vdmluZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB3aGVuZXZlciB0aGUgam9iIHRlcm1pbmF0ZXMsCi0gICAgICAgIC8vIGJ1dCB0aGlzIHdvdWxkIHJlcXVpcmUgYWRkaXRpb25hbCBzeW5jaHJvbml6ZSBibG9ja3MgKHdoaWNoIGFyZSBzbG93KSBhbmQgbW9yZQotICAgICAgICAvLyBjb21wbGV4aXR5LiBJbnN0ZWFkLCB3ZSBqdXN0IHVuLWNhbmNlbCB0aGUgbW9uaXRvciBhdCB0aGUgc3RhcnQgb2YgZWFjaCBqb2IuIAotICAgICAgICBtb24uc2V0Q2FuY2VsZWQoZmFsc2UpOwotCi0gICAgICAgCW1vbi5iZWdpblRhc2soU09SVElORywgMTAwKTsKLSAgICAgICAJCi0gICAgICAgIC8vIENyZWF0ZSBhIExhenlTb3J0ZWRDb2xsZWN0aW9uCi0gICAgICAgIENvbXBhcmF0b3Igb3JkZXIgPSBzb3J0T3JkZXI7Ci0gICAgICAgIElGaWx0ZXIgZiA9IGZpbHRlcjsKLSAgICAgICAgTGF6eVNvcnRlZENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IG5ldyBMYXp5U29ydGVkQ29sbGVjdGlvbihvcmRlcik7Ci0gICAgICAgIAotICAgICAgICAvLyBGaWxsIGl0IGluIHdpdGggYWxsIGV4aXN0aW5nIGtub3duIG9iamVjdHMKLSAgICAgICAgT2JqZWN0W10ga25vd25PYmplY3RzID0gdXBkYXRvci5nZXRLbm93bk9iamVjdHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrbm93bk9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBrbm93bk9iamVjdHNbaV07Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0KLSAgICAgICAgYm9vbGVhbiBkaXJ0eSA9IGZhbHNlOwotICAgICAgICBpbnQgcHJldlNpemUgPSBrbm93bk9iamVjdHMubGVuZ3RoOwotICAgICAgICB1cGRhdG9yLnNldFRvdGFsSXRlbXMocHJldlNpemUpOwotICAgICAgICAKLQkJLy8gU3RhcnQgcHJvY2Vzc2luZyBjaGFuZ2VzCi0gICAgICAgIHdoaWxlKHRydWUpIHsKLSAgICAgICAgCS8vIElmIHRoZSBzb3J0IG9yZGVyIGhhcyBjaGFuZ2VkLCBidWlsZCBhIG5ldyBMYXp5U29ydGVkQ29sbGVjdGlvbiB3aXRoCi0gICAgICAgIAkvLyB0aGUgbmV3IGNvbXBhcmF0b3IKLSAgICAgICAgCWlmIChvcmRlciAhPSBzb3J0T3JkZXIpIHsKLSAgICAgICAgCQlkaXJ0eSA9IHRydWU7Ci0gICAgICAgIAkJb3JkZXIgPSBzb3J0T3JkZXI7Ci0gICAgICAgIAkJLy8gQ29weSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgb2xkIGNvbGxlY3Rpb24gdG8gdGhlIG5ldyBvbmUgCi0gICAgICAgIAkJTGF6eVNvcnRlZENvbGxlY3Rpb24gbmV3Q29sbGVjdGlvbiA9IG5ldyBMYXp5U29ydGVkQ29sbGVjdGlvbihvcmRlcik7Ci0gICAgICAgIAkJCi0gICAgICAgIAkJT2JqZWN0W10gaXRlbXMgPSBjb2xsZWN0aW9uLmdldEl0ZW1zKGZhbHNlKTsKLSAgICAgICAgCQlmb3IgKGludCBqID0gMDsgaiA8IGl0ZW1zLmxlbmd0aCAmJiBvcmRlciA9PSBzb3J0T3JkZXI7IGorKykgewotCQkJCQlPYmplY3QgaXRlbSA9IGl0ZW1zW2pdOwotCQkJCQkKLQkJCQkJbmV3Q29sbGVjdGlvbi5hZGQoaXRlbSk7Ci0JCQkJfQotICAgICAgICAJCQotICAgICAgICAJCS8vIElmIHRoZSBzb3J0IG9yZGVyIGNoYW5nZWQgYWdhaW4sIHJlLWxvb3AKLQkJCQlpZiAob3JkZXIgIT0gc29ydE9yZGVyKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQljb2xsZWN0aW9uID0gbmV3Q29sbGVjdGlvbjsKLQkJCQljb250aW51ZTsKLSAgICAgICAgCX0gCi0gICAgICAgIAkKLSAgICAgICAgCS8vIElmIHRoZSBmaWx0ZXIgaGFzIGNoYW5nZWQKLSAgICAgICAgCWlmIChmICE9IGZpbHRlcikgewotICAgICAgICAJCWRpcnR5ID0gdHJ1ZTsKLSAgICAgICAgCQlmID0gZmlsdGVyOwotICAgICAgICAJCQotICAgICAgICAJCU9iamVjdFtdIGl0ZW1zID0gY29sbGVjdGlvbi5nZXRJdGVtcyhmYWxzZSk7Ci0gICAgICAgIAkJCi0gICAgICAgIAkJLy8gUmVtb3ZlIGFueSBpdGVtcyB0aGF0IGRvbid0IHBhc3MgdGhlIG5ldyBmaWx0ZXIKLSAgICAgICAgCQlmb3IgKGludCBqID0gMDsgaiA8IGl0ZW1zLmxlbmd0aCAmJiBmID09IGZpbHRlcjsgaisrKSB7Ci0JCQkJCU9iamVjdCB0b1Rlc3QgPSBpdGVtc1tqXTsKLQkJCQkJCi0JCQkJCWlmICghZi5zZWxlY3QodG9UZXN0KSkgewotCQkJCQkJY29sbGVjdGlvbi5yZW1vdmUodG9UZXN0KTsKLQkJCQkJfQotCQkJCX0KLSAgICAgICAgCQljb250aW51ZTsKLSAgICAgICAgCX0KLSAgICAgICAgCi0gICAgICAgIAkvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzLCBwcm9jZXNzIG9uZSBvZiB0aGVtCi0gICAgICAgIAlpZiAoIWNoYW5nZVF1ZXVlLmlzRW1wdHkoKSkgewotICAgICAgICAJCWRpcnR5ID0gdHJ1ZTsKLQkgICAgICAgIAlDaGFuZ2VRdWV1ZS5DaGFuZ2UgbmV4dCA9IGNoYW5nZVF1ZXVlLmRlcXVldWUoKTsKLQkgICAgICAgIAkKLQkgICAgICAgIAlzd2l0Y2gobmV4dC5nZXRUeXBlKCkpIHsKLQkJICAgICAgICAJY2FzZSBDaGFuZ2VRdWV1ZS5BREQ6IHsKLQkJICAgICAgICAgICAgCWZpbHRlcmVkQWRkKGNvbGxlY3Rpb24sIG5leHQuZ2V0RWxlbWVudHMoKSwgZik7Ci0JCSAgICAgICAgCQlicmVhazsKLQkJICAgICAgICAJfQotCQkgICAgICAgIAljYXNlIENoYW5nZVF1ZXVlLlJFTU9WRTogewotCQkgICAgICAgIAkJT2JqZWN0W10gdG9SZW1vdmUgPSBuZXh0LmdldEVsZW1lbnRzKCk7Ci0JCi0JCSAgICAgICAgICAgICAgICBmbHVzaCh0b1JlbW92ZSwgY29sbGVjdGlvbik7Ci0JCSAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnJlbW92ZUFsbCh0b1JlbW92ZSk7Ci0JCi0JCSAgICAgICAgCQlicmVhazsKLQkJICAgICAgICAJfQotCQkgICAgICAgIAljYXNlIENoYW5nZVF1ZXVlLlVQREFURTogewotCQkgICAgICAgIAkJT2JqZWN0W10gaXRlbXMgID0gbmV4dC5nZXRFbGVtZW50cygpOwotCQkgICAgICAgIAkJCi0JICAgICAgICAJICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JICAgICAgICAJICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBpdGVtc1tpXTsKLQkgICAgICAgIAkgICAgICAgICAgICAKLQkgICAgICAgIAkgICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5jb250YWlucyhpdGVtKSkgewotCSAgICAgICAgCSAgICAgICAgICAgICAgICAvLyBUT0RPOiB3cml0ZSBhIGNvbGxlY3Rpb24udXBkYXRlKC4uLikgbWV0aG9kCi0JICAgICAgICAJICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24ucmVtb3ZlKGl0ZW0pOwotCSAgICAgICAgCSAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmFkZChpdGVtKTsKLQkgICAgICAgIAkgICAgICAgICAgICAgICAgdXBkYXRvci5jbGVhcihpdGVtKTsgICAgICAgIAkgICAgICAgICAgICAgICAgCi0JICAgICAgICAJICAgICAgICAgICAgfQotCSAgICAgICAgCSAgICAgICAgfQotCQkgICAgICAgIAkgICAgICAgIAotCQkgICAgICAgIAkJYnJlYWs7Ci0JCSAgICAgICAgCX0KLQkJICAgICAgICAJY2FzZSBDaGFuZ2VRdWV1ZS5TRVQ6IHsKLQkJICAgICAgICAJCU9iamVjdFtdIGl0ZW1zID0gbmV4dC5nZXRFbGVtZW50cygpOwotCQkgICAgICAgIAkJY29sbGVjdGlvbi5jbGVhcigpOwotCQkgICAgICAgIAkJZmlsdGVyZWRBZGQoY29sbGVjdGlvbiwgaXRlbXMsIGYpOwotCQkgICAgICAgIAkgICAgICAgIAotCQkgICAgICAgIAkJYnJlYWs7Ci0JCSAgICAgICAgCX0KLQkgICAgICAgIAl9Ci0JICAgICAgICAJCi0JICAgICAgICAJY29udGludWU7Ci0gICAgICAgIAl9Ci0gICAgICAgIAkKLQkgICAgICAgIGludCB0b3RhbEVsZW1lbnRzID0gY29sbGVjdGlvbi5zaXplKCk7Ci0gICAgICAgICAgICBpZiAobGltaXQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAodG90YWxFbGVtZW50cyA+IGxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsRWxlbWVudHMgPSBsaW1pdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh0b3RhbEVsZW1lbnRzICE9IHByZXZTaXplKSB7Ci0gICAgICAgICAgICAJcHJldlNpemUgPSB0b3RhbEVsZW1lbnRzOwotCSAgICAgICAgICAgIC8vIFNlbmQgdGhlIHRvdGFsIGl0ZW1zIHRvIHRoZSB1cGRhdG9yIEFTQVAgLS0gdGhlIHVzZXIgbWF5IHdhbnQKLQkgICAgICAgICAgICAvLyB0byBzY3JvbGwgdG8gYSBkaWZmZXJlbnQgc2VjdGlvbiBvZiB0aGUgdGFibGUsIHdoaWNoIHdvdWxkCi0JICAgICAgICAgICAgLy8gY2F1c2Ugb3VyIHNvcnQgcmFuZ2UgdG8gY2hhbmdlIGFuZCBjYXVzZSB0aGlzIGpvYiB0byBnZXQgY2FuY2VsbGVkLgotCQkgICAgICAgIHVwZGF0b3Iuc2V0VG90YWxJdGVtcyh0b3RhbEVsZW1lbnRzKTsKLQkJICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSBsb29wCi0gICAgICAgICAgICBpZiAoIWRpcnR5KSB7Ci0gICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAkKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAJQ29uY3VycmVudFRhYmxlVXBkYXRvci5SYW5nZSB1cGRhdGVSYW5nZSA9IHVwZGF0b3IuZ2V0VmlzaWJsZVJhbmdlKCk7Ci0gICAgICAgICAgICAJc29ydE1vbiA9IG5ldyBGYXN0UHJvZ3Jlc3NSZXBvcnRlcigpOwotICAgICAgICAgICAgCXJhbmdlID0gdXBkYXRlUmFuZ2U7Ci0gICAgICAgICAgICAJaW50IHNvcnRTdGFydCA9IHVwZGF0ZVJhbmdlLnN0YXJ0OwotICAgICAgICAgICAgCWludCBzb3J0TGVuZ3RoID0gdXBkYXRlUmFuZ2UubGVuZ3RoOwotICAgICAgICAgICAgCi0JCSAgICAgICAgaWYgKGxpbWl0ICE9IC0xKSB7Ci0JCSAgICAgICAgICAgIGNvbGxlY3Rpb24ucmV0YWluRmlyc3QobGltaXQsIHNvcnRNb24pOwotCQkgICAgICAgIH0KLQotCQkgICAgICAgIHNvcnRMZW5ndGggPSBNYXRoLm1pbihzb3J0TGVuZ3RoLCB0b3RhbEVsZW1lbnRzIC0gc29ydFN0YXJ0KTsKLQkJICAgICAgICBzb3J0TGVuZ3RoID0gTWF0aC5tYXgoc29ydExlbmd0aCwgMCk7Ci0JCSAgICAgICAgCi0JCSAgICAgICAgT2JqZWN0W10gb2JqZWN0c09mSW50ZXJlc3QgPSBuZXcgT2JqZWN0W3NvcnRMZW5ndGhdOwotCQkgICAgIAotCQkgICAgICAgIGNvbGxlY3Rpb24uZ2V0UmFuZ2Uob2JqZWN0c09mSW50ZXJlc3QsIHNvcnRTdGFydCwgdHJ1ZSwgc29ydE1vbik7Ci0JCSAgICAgICAgCi0JCSAgICAgICAgLy8gU2VuZCB0aGUgbmV3IGVsZW1lbnRzIHRvIHRoZSB0YWJsZQotCQkgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29ydExlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBvYmplY3RzT2ZJbnRlcmVzdFtpXTsKLQkJCQkJdXBkYXRvci5yZXBsYWNlKG9iamVjdCwgc29ydFN0YXJ0ICsgaSk7Ci0JCQkJfQotCQkgICAgICAgIAotCQkJICAgIG9iamVjdHNPZkludGVyZXN0ID0gbmV3IE9iamVjdFtjb2xsZWN0aW9uLnNpemUoKV07Ci0JCQkgICAgICAgIAotCQkJICAgIGNvbGxlY3Rpb24uZ2V0Rmlyc3Qob2JqZWN0c09mSW50ZXJlc3QsIHRydWUsIHNvcnRNb24pOwotCQkgICAgICAgIAotCQkgICAgICAgIC8vIFNlbmQgdGhlIG5ldyBlbGVtZW50cyB0byB0aGUgdGFibGUKLQkJICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsRWxlbWVudHM7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gb2JqZWN0c09mSW50ZXJlc3RbaV07Ci0JCQkJCXVwZGF0b3IucmVwbGFjZShvYmplY3QsIGkpOwotCQkJCX0KLQotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgCWNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBkaXJ0eSA9IGZhbHNlOwotCSAgICB9Ci0gICAgICAgIAotICAgICAgICBtb24uZG9uZSgpOwotICAgIH0KLQotCS8qKgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICogQHBhcmFtIHRvQWRkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWx0ZXJlZEFkZChMYXp5U29ydGVkQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBPYmplY3RbXSB0b0FkZCwgSUZpbHRlciBmaWx0ZXIpIHsKLQkJaWYgKGZpbHRlciAhPSBBY2NlcHRBbGxGaWx0ZXIuZ2V0SW5zdGFuY2UoKSkgeyAKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9BZGQubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gdG9BZGRbaV07Ci0JCQkJCi0JCQkJaWYgKGZpbHRlci5zZWxlY3Qob2JqZWN0KSkgewotCQkJCQljb2xsZWN0aW9uLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNvbGxlY3Rpb24uYWRkQWxsKHRvQWRkKTsKLQkJfQotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzb3J0IG9yZGVyIGZvciB0aGlzIGNvbnRlbnQgcHJvdmlkZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc29ydGVyIHNvcnQgb3JkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3J0T3JkZXIoQ29tcGFyYXRvciBzb3J0ZXIpIHsKLSAgICAJQXNzZXJ0LmlzTm90TnVsbChzb3J0ZXIpOwotICAgICAgICB0aGlzLnNvcnRPcmRlciA9IHNvcnRlcjsKLSAgICAJc29ydE1vbi5jYW5jZWwoKTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmaWx0ZXIgZm9yIHRoaXMgY29udGVudCBwcm92aWRlcgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b1NldCBmaWx0ZXIgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgdG9TZXQpIHsKLSAgICAJQXNzZXJ0LmlzTm90TnVsbCh0b1NldCk7Ci0gICAgCXRoaXMuZmlsdGVyID0gdG9TZXQ7Ci0gICAgCXNvcnRNb24uY2FuY2VsKCk7Ci0gICAgCXJlZnJlc2goKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWF4aW11bSB0YWJsZSBzaXplLiBCYXNlZCBvbiB0aGUgY3VycmVudCBzb3J0IG9yZGVyLAotICAgICAqIHRoZSB0YWJsZSB3aWxsIGJlIHRydW5jYXRlZCBpZiBpdCBncm93cyBiZXlvbmQgdGhpcyBzaXplLgotICAgICAqIFVzaW5nIGEgbGltaXQgaW1wcm92ZXMgbWVtb3J5IHVzYWdlIGFuZCBwZXJmb3JtYW5jZSwgYW5kIGlzCi0gICAgICogc3Ryb25nbHkgcmVjb21tZW5kZWQgZm9yIGxhcmdlIHRhYmxlcy4gCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpbWl0IG1heGltdW0gcm93cyB0byBzaG93IGluIHRoZSB0YWJsZSBvciAtMSBpZiB1bmJvdW5kZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaW1pdChpbnQgbGltaXQpIHsKLSAgICAgICAgdGhpcy5saW1pdCA9IGxpbWl0OwotICAgICAgICByZWZyZXNoKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gdGFibGUgc2l6ZSBvciAtMSBpZiB1bmJvdW5kZWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZSBvciAtMSBpZiB1bmJvdW5kZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldExpbWl0KCkgewotICAgICAgICByZXR1cm4gbGltaXQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBjdXJyZW50bHkgdmlzaWJsZSByYW5nZSBoYXMgY2hhbmdlZCwgYW5kIHRyaWdnZXJzIGFuZCB1cGRhdGUKLSAgICAgKiBhbmQgcmVzb3J0IGlmIG5lY2Vzc2FyeS4gTXVzdCBiZSBjYWxsZWQgaW4gdGhlIFVJIHRocmVhZCwgdHlwaWNhbGx5Ci0gICAgICogd2l0aGluIGEgU1dULlNldERhdGEgY2FsbGJhY2suCi0gICAgICogQHBhcmFtIGluY2x1ZGVJbmRleCB0aGUgaW5kZXggdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHZpc2libGUgcmFuZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hlY2tWaXNpYmxlUmFuZ2UoaW50IGluY2x1ZGVJbmRleCkgewotICAgIAl1cGRhdG9yLmNoZWNrVmlzaWJsZVJhbmdlKGluY2x1ZGVJbmRleCk7Ci0JCUNvbmN1cnJlbnRUYWJsZVVwZGF0b3IuUmFuZ2UgbmV3UmFuZ2UgPSB1cGRhdG9yLmdldFZpc2libGVSYW5nZSgpOwotCQlDb25jdXJyZW50VGFibGVVcGRhdG9yLlJhbmdlIG9sZFJhbmdlID0gcmFuZ2U7Ci0JCQotCQkvLyBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIHByb2Nlc3NpbmcgYW4gaW52YWxpZCByYW5nZSwgY2FuY2VsIHRoZSBzb3J0Ci0JCWlmIChuZXdSYW5nZS5zdGFydCAhPSBvbGRSYW5nZS5zdGFydCB8fCBuZXdSYW5nZS5sZW5ndGggIT0gb2xkUmFuZ2UubGVuZ3RoKSB7Ci0JCQlzb3J0TW9uLmNhbmNlbCgpOwotCQl9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE11c3QgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBtb2RlbCBjaGFuZ2VzLiBEaXJ0aWVzIHRoaXMgb2JqZWN0IGFuZCB0cmlnZ2VycyBhIHNvcnQKLSAgICAgKiBpZiBuZWNlc3NhcnkuIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtYWtlRGlydHkoKSB7Ci0gICAgICAgIHNvcnRNb24uY2FuY2VsKCk7Ci0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgc29ydCB0aHJlYWQgaXMgbm90IHJ1bm5pbmcKLSAgICAgICAgdHJ5IHsKLQkJCXNvcnRUaHJlYWQuam9pbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotCQl9Ci0gICAgCXNvcnRUaHJlYWQuc3RhcnQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbnkgc29ydCBpbiBwcm9ncmVzcy4gTm90ZSB0aGF0IHdlIHRyeSB0byB1c2UgdGhlIEZhc3RQcm9ncmVzUmVwb3J0ZXIgaWYgcG9zc2libGUKLSAgICAgKiBzaW5jZSB0aGlzIGlzIG1vcmUgcmVzcG9uc2l2ZSB0aGFuIGNhbmNlbGxpbmcgdGhlIHNvcnQgam9iLiBIb3dldmVyLCBpdCBpcyBub3QKLSAgICAgKiBhIHByb2JsZW0gdG8gY2FuY2VsIGluIGJvdGggd2F5cy4gCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNhbmNlbFNvcnRKb2IoKSB7Ci0gICAgICAgIHNvcnRNb24uY2FuY2VsKCk7Ci0gICAgICAgIHNvcnRpbmdQcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIG5ldyBlbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIG1vZGVsLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b0FkZCBuZXdseSBhZGRlZCBlbGVtZW50cwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGQoT2JqZWN0W10gdG9BZGQpIHsKLSAgICAJY2hhbmdlUXVldWUuZW5xdWV1ZShDaGFuZ2VRdWV1ZS5BREQsIHRvQWRkKTsKLSAgICAJbWFrZURpcnR5KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENhbGxlZCB3aXRoIHRoZSBjb21wbGV0ZSBjb250ZW50cyBvZiB0aGUgbW9kZWwKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGVudHMgbmV3IGNvbnRlbnRzIG9mIHRoZSBtb2RlbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRDb250ZW50cyhPYmplY3RbXSBjb250ZW50cykgewotICAgIAljaGFuZ2VRdWV1ZS5lbnF1ZXVlKENoYW5nZVF1ZXVlLlNFVCwgY29udGVudHMpOwotICAgIAltYWtlRGlydHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBlbGVtZW50cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbAotICAgICAqIAotICAgICAqIEBwYXJhbSB0b1JlbW92ZSBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIG1vZGVsCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZShPYmplY3RbXSB0b1JlbW92ZSkgewotICAgICAgICBjaGFuZ2VRdWV1ZS5lbnF1ZXVlKENoYW5nZVF1ZXVlLlJFTU9WRSwgdG9SZW1vdmUpOwotICAgICAgICBtYWtlRGlydHkoKTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoZSB1cGRhdG9yIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnRzIGhhdmUgY2hhbmdlZCAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9GbHVzaCBjaGFuZ2VkIGVsZW1lbnRzCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gY29sbGVjdGlvbiBvZiBjdXJyZW50bHkta25vd24gZWxlbWVudHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmx1c2goT2JqZWN0W10gdG9GbHVzaCwgTGF6eVNvcnRlZENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvRmx1c2gubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE9iamVjdCBpdGVtID0gdG9GbHVzaFtpXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24uY29udGFpbnMoaXRlbSkpIHsKLSAgICAgICAgICAgICAgICB1cGRhdG9yLmNsZWFyKGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBlbGVtZW50cyBpbiB0aGUgbW9kZWwgY2hhbmdlCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZW1zIGNoYW5nZWQgaXRlbXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlKE9iamVjdFtdIGl0ZW1zKSB7Ci0gICAgICAgIGNoYW5nZVF1ZXVlLmVucXVldWUoQ2hhbmdlUXVldWUuVVBEQVRFLCBpdGVtcyk7Ci0gICAgICAgIG1ha2VEaXJ0eSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvQ2hhbmdlUXVldWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvQ2hhbmdlUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1YmRlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL2RlZmVycmVkL0NoYW5nZVF1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLS8qKgotICogSG9sZHMgYSBxdWV1ZSBvZiBhZGRpdGlvbnMsIHJlbW92YWxzLCB1cGRhdGVzLCBhbmQgU0VUIGNhbGxzIGZvciBhCi0gKiBCYWNrZ3JvdW5kQ29udGVudFByb3ZpZGVyCi0gKi8KLWZpbmFsIGNsYXNzIENoYW5nZVF1ZXVlIHsKLQkvKioKLQkgKiBSZXByZXNlbnRzIHRoZSBhZGRpdGlvbiBvZiBhbiBpdGVtCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERCA9IDA7Ci0JLyoqCi0JICogUmVwcmVzZW50cyB0aGUgcmVtb3ZhbCBvZiBhbiBpdGVtCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IDE7Ci0JLyoqCi0JICogUmVwcmVzZW50cyBhIHJlc2V0IG9mIGFsbCB0aGUgaXRlbXMKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUID0gMjsKLQkvKioKLQkgKiBSZXByZXNlbnRzIGFuIHVwZGF0ZSBvZiBhbiBpdGVtCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQREFURSA9IDM7Ci0JCi0JLyoqCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2hhbmdlIHsKLQkJcHJpdmF0ZSBpbnQgdHlwZTsKLQkJcHJpdmF0ZSBPYmplY3RbXSBlbGVtZW50czsKLQkJCi0JCS8qKgotCQkgKiBDcmVhdGUgYSBjaGFuZ2Ugb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgYWZmZWN0cyB0aGUgZ2l2ZW4gZWxlbWVudHMuCi0JCSAqIAotCQkgKiBAcGFyYW0gdHlwZSBvbmUgb2YgPGNvZGU+QUREPC9jb2RlPiwgPGNvZGU+UkVNT1ZFPC9jb2RlPiwgPGNvZGU+U0VUPC9jb2RlPiwgb3IgPGNvZGU+VVBEQVRFPC9jb2RlPi4KLQkJICogQHBhcmFtIGVsZW1lbnRzIHRoZSBlbGVtZW50cyBhZmZlY3RlZCBieSB0aGUgY2hhbmdlLgotCQkgKiAKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIENoYW5nZShpbnQgdHlwZSwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBHZXQgdGhlIHR5cGUgb2YgY2hhbmdlLgotCQkgKiBAcmV0dXJuIG9uZSBvZiA8Y29kZT5BREQ8L2NvZGU+LCA8Y29kZT5SRU1PVkU8L2NvZGU+LCA8Y29kZT5TRVQ8L2NvZGU+LCBvciA8Y29kZT5VUERBVEU8L2NvZGU+LgotCQkgKiAKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIGludCBnZXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2hhbmdlLgotCQkgKiBAcmV0dXJuIHRoZSBlbGVtZW50cyBhZmZlY3RlZCBieSB0aGUgY2hhbmdlLgotCQkgKiAKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIGVsZW1lbnRzOwotCQl9Ci0JfQotCQotCXByaXZhdGUgTGlua2VkTGlzdCBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JcHJpdmF0ZSBpbnQgd29ya2xvYWQgPSAwOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIGNoYW5nZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgZWxlbWVudHMgYW5kIGVucXVldWUgaXQuCi0JICogCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgY2hhbmdlIHRvIGJlIGNyZWF0ZWQKLQkgKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIGFmZmVjdGVkIGJ5IHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW5xdWV1ZShpbnQgdHlwZSwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJZW5xdWV1ZShuZXcgQ2hhbmdlKHR5cGUsIGVsZW1lbnRzKSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGNoYW5nZSB0byB0aGUgcXVldWUKLQkgKiBAcGFyYW0gdG9RdWV1ZSB0aGUgY2hhbmdlIHRvIGJlIGFkZGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVucXVldWUoQ2hhbmdlIHRvUXVldWUpIHsKLQkJLy8gQSBTRVQgZXZlbnQgbWFrZXMgYWxsIHByZXZpb3VzIGFkZHMsIHJlbW92ZXMsIGFuZCBzZXRzIHJlZHVuZGFudC4uLiBzbyByZW1vdmUKLQkJLy8gdGhlbSBmcm9tIHRoZSBxdWV1ZQotCQlpZiAodG9RdWV1ZS50eXBlID09IFNFVCkgewotCQkJd29ya2xvYWQgPSAwOwotCQkJTGlua2VkTGlzdCBuZXdRdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBxdWV1ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlDaGFuZ2UgbmV4dCA9IChDaGFuZ2UpIGl0ZXIubmV4dCgpOwotCQkJCQotCQkJCWlmIChuZXh0LmdldFR5cGUoKSA9PSBBREQgfHwgbmV4dC5nZXRUeXBlKCkgPT0gUkVNT1ZFIHx8IG5leHQuZ2V0VHlwZSgpID09IFNFVCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJbmV3UXVldWUuYWRkKG5leHQpOwotCQkJCXdvcmtsb2FkICs9IG5leHQuZWxlbWVudHMubGVuZ3RoOwotCQkJfQotCQkJcXVldWUgPSBuZXdRdWV1ZTsKLQkJfQotCQkKLQkJcXVldWUuYWRkKHRvUXVldWUpOwotCQl3b3JrbG9hZCArPSB0b1F1ZXVlLmVsZW1lbnRzLmxlbmd0aDsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBjaGFuZ2UgZnJvbSB0aGUgcXVldWUuCi0JICogQHJldHVybiB0aGUgZmlyc3QgY2hhbmdlCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBDaGFuZ2UgZGVxdWV1ZSgpIHsKLQkJQ2hhbmdlIHJlc3VsdCA9IChDaGFuZ2UpcXVldWUucmVtb3ZlRmlyc3QoKTsKLQkJCi0JCXdvcmtsb2FkIC09IHJlc3VsdC5lbGVtZW50cy5sZW5ndGg7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBxdWV1ZSBpcyBlbXB0eQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZW1wdHksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHF1ZXVlLmlzRW1wdHkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL2RlZmVycmVkL0NvbmN1cnJlbnRUYWJsZVVwZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvQ29uY3VycmVudFRhYmxlVXBkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDZiMjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvQ29uY3VycmVudFRhYmxlVXBkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLmRlZmVycmVkOwotCi0KLQotLyoqCi0gKiBBbGxvd3MgYSB0YWJsZSB0byBiZSBhY2Nlc3NlZCBmcm9tIGEgYmFja2dyb3VuZCB0aHJlYWQuIFByb3ZpZGVzIGEgdGFibGUtbGlrZSBwdWJsaWMgCi0gKiBpbnRlcmZhY2UgdGhhdCBjYW4gYWNjZXNzZWQgZnJvbSBhIGJhY2tncm91bmQgdGhyZWFkLiBBcyB1cGRhdGVzIGFycml2ZSBmcm9tIHRoZSAKLSAqIGJhY2tncm91bmQgdGhyZWFkLCBpdCBiYXRjaGVzIGFuZCBzY2hlZHVsZXMgdXBkYXRlcyB0byB0aGUgcmVhbCB0YWJsZSBpbiB0aGUgVUkgdGhyZWFkLiAKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgd2l0aCBhbnkgd2lkZ2V0IHRoYXQgY2FuIGJlIHdyYXBwZWQgaW4gdGhlIAotICogPGNvZGU+QWJzdHJhY3RWaXJ0dWFsVGFibGU8L2NvZGU+IGludGVyZmFjZS4gIAotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLS8qIHBhY2thZ2UgKi8gZmluYWwgY2xhc3MgQ29uY3VycmVudFRhYmxlVXBkYXRvciB7Ci0JLyoqCi0JICogV3JhcHBlciBmb3IgdGhlIHJlYWwgdGFibGUuIE1heSBvbmx5IGJlIGFjY2Vzc2VkIGluIHRoZSBVSSB0aHJlYWQuCi0JICovCi0gICAgcHJpdmF0ZSBBYnN0cmFjdFZpcnR1YWxUYWJsZSB0YWJsZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBzZW50IHRvIHRoZSBVSS4gRWxlbWVudHMgYXJlIG51bGwKLSAgICAgKiBpZiB0aGV5IGVpdGhlciBoYXZlbid0IGJlZW4gc2VudCB5ZXQgb3IgaGF2ZSBiZWVuIHNjaGVkdWxlZCBmb3IgY2xlYXIuIAotICAgICAqIE1hcHMgaW5kaWNlcyBvbnRvIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0W10gc2VudE9iamVjdHMgPSBuZXcgT2JqZWN0WzBdOwotICAgIAotICAgIC8qKgotICAgICAqIE1hcCBvZiBlbGVtZW50cyB0byBvYmplY3QgaW5kaWNlcyAoaW52ZXJzZSBvZiB0aGUga25vd25PYmplY3RzIGFycmF5KQotICAgICAqLwotICAgIHByaXZhdGUgSW50SGFzaE1hcCBrbm93bkluZGljZXMgPSBuZXcgSW50SGFzaE1hcCgpOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnRhaW5zIGFsbCBrbm93biBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIHNlbnQgaGVyZSBmcm9tIHRoZSBiYWNrZ3JvdW5kCi0gICAgICogdGhyZWFkLgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0W10ga25vd25PYmplY3RzID0gbmV3IE9iamVjdFswXTsKLSAgICAKLSAgICAvLyBNaW5pbXVtIGxlbmd0aCBmb3IgdGhlIHBlbmRpbmdGbHVzaGVzIHN0YWNrCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9GTFVTSExFTkdUSCA9IDY0OwotICAgIAotICAgIC8qKgotICAgICAqIEFycmF5IG9mIGVsZW1lbnQgaW5kaWNlcy4gQ29udGFpbnMgZWxlbWVudHMgc2NoZWR1bGVkIHRvIGJlCi0gICAgICogY2xlYXJlZC4gT25seSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheSBpcyB1c2VkLiBUaGUgbnVtYmVyCi0gICAgICogb2YgdXNlZCBlbGVtZW50cyBpcyBzdG9yZWQgaW4gbGFzdENsZWFyCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnRbXSBwZW5kaW5nQ2xlYXJzID0gbmV3IGludFtNSU5fRkxVU0hMRU5HVEhdOwotICAgIAotICAgIC8qKgotICAgICAqIE51bWJlciBvZiBwZW5kaW5nIGNsZWFycyBpbiB0aGUgcGVuZGluZ0NsZWFycyBhcnJheSAodGhpcyBpcyBub3JtYWxseQotICAgICAqIHVzZWQgaW5zdGVhZCBvZiBwZW5kaW5nQ2xlYXJzLmxlbmd0aCBzaW5jZSB0aGUgCi0gICAgICogcGVuZGluZ0NsZWFycyBhcnJheSBpcyB1c3VhbGx5IGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHBlbmRpbmcKLSAgICAgKiBjbGVhcnMpIAotICAgICAqLwotICAgIHByaXZhdGUgaW50IGxhc3RDbGVhciA9IDA7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTGFzdCBrbm93biB2aXNpYmxlIHJhbmdlCi0gICAgICovICAgIAotICAgIHByaXZhdGUgdm9sYXRpbGUgUmFuZ2UgbGFzdFJhbmdlID0gbmV3IFJhbmdlKDAsMCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZmYgYSBVSSB1cGRhdGUgaGFzIGJlZW4gc2NoZWR1bGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHVwZGF0ZVNjaGVkdWxlZDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBkaXNwb3NlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkaXNwb3NlZCA9IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIE9iamVjdCB0aGF0IGhvbGRzIGEgc3RhcnQgaW5kZXggYW5kIGxlbmd0aC4gQWxsb3dzCi0gICAgICogdGhlIHZpc2libGUgcmFuZ2UgdG8gYmUgcmV0dXJuZWQgYXMgYW4gYXRvbWljIG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFJhbmdlIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgUmFuZ2UoaW50IHMsIGludCBsKSB7Ci0gICAgICAgICAgICBzdGFydCA9IHM7Ci0gICAgICAgICAgICBsZW5ndGggPSBsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJ1bm5hYmxlIHRoYXQgY2FuIGJlIHBvc3RlZCB3aXRoIGFuIGFzeW5jRXhlYyB0byBzY2hlZHVsZQotICAgICAqIGFuIHVwZGF0ZSB0byB0aGUgcmVhbCB0YWJsZS4gIAotICAgICAqLwotICAgIFJ1bm5hYmxlIHVpUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYoIXRhYmxlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICAJdXBkYXRlVGFibGUoKTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB0YWJsZSB1cGRhdG9yCi0gICAgICogCi0gICAgICogQHBhcmFtIHRhYmxlIHJlYWwgdGFibGUgdG8gdXBkYXRlCi0gICAgICovCi0gICAgcHVibGljIENvbmN1cnJlbnRUYWJsZVVwZGF0b3IoQWJzdHJhY3RWaXJ0dWFsVGFibGUgdGFibGUpIHsKLSAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDbGVhbnMgdXAgdGhlIHVwZGF0b3Igb2JqZWN0IChidXQgbm90IHRoZSB0YWJsZSBpdHNlbGYpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgCWRpc3Bvc2VkID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZmYgdGhpcyBvYmplY3QgaGFzIGJlZW4gZGlzcG9zZWQuIAotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgZGlzcG9zZSgpIGhhcyBiZWVuIGNhbGxlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0gICAgCXJldHVybiBkaXNwb3NlZDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHZpc2libGUgcmFuZ2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50bHkgdmlzaWJsZSByYW5nZQotICAgICAqLwotICAgIHB1YmxpYyBSYW5nZSBnZXRWaXNpYmxlUmFuZ2UoKSB7Ci0gICAgCXJldHVybiBsYXN0UmFuZ2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE1hcmtzIHRoZSBnaXZlbiBvYmplY3QgYXMgZGlydHkuIFdpbGwgY2F1c2UgaXQgdG8gYmUgY2xlYXJlZAotICAgICAqIGluIHRoZSB0YWJsZS4gCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvRmx1c2gKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcihPYmplY3QgdG9GbHVzaCkgewotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgaW50IGN1cnJlbnRJZHggPSBrbm93bkluZGljZXMuZ2V0KHRvRmx1c2gsIC0xKTsKLQotICAgICAgICAgICAgLy8gSWYgd2UndmUgbmV2ZXIgaGVhcmQgb2YgdGhpcyBvYmplY3QsIGJhaWwgb3V0LgotICAgICAgICAgICAgaWYgKGN1cnJlbnRJZHggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1c2hDbGVhcihjdXJyZW50SWR4KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgdGFibGUuIENhbGxlZCBmcm9tIGEgYmFja2dyb3VuZCB0aHJlYWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5ld1RvdGFsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG90YWxJdGVtcyhpbnQgbmV3VG90YWwpIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAobmV3VG90YWwgIT0ga25vd25PYmplY3RzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGlmIChuZXdUb3RhbCA8IGtub3duT2JqZWN0cy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggYW55IG9iamVjdHMgdGhhdCBhcmUgYmVpbmcgcmVtb3ZlZCBhcyBhIHJlc3VsdCBvZiB0aGUgcmVzaXplCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBuZXdUb3RhbDsgaSA8IGtub3duT2JqZWN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHRvRmx1c2ggPSBrbm93bk9iamVjdHNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0ZsdXNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAlrbm93bkluZGljZXMucmVtb3ZlKHRvRmx1c2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCBtaW5TaXplID0gTWF0aC5taW4oa25vd25PYmplY3RzLmxlbmd0aCwgbmV3VG90YWwpOwotICAgICAgICAgICAgICAgIAotCSAgICAgICAgICAgIE9iamVjdFtdIG5ld0tub3duT2JqZWN0cyA9IG5ldyBPYmplY3RbbmV3VG90YWxdOwotCSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoa25vd25PYmplY3RzLCAwLCBuZXdLbm93bk9iamVjdHMsIDAsIG1pblNpemUpOwotCSAgICAgICAgICAgIGtub3duT2JqZWN0cyA9IG5ld0tub3duT2JqZWN0czsKLQkgICAgICAgICAgICAJICAgICAgICAgICAgCi0JICAgICAgICAgICAgc2NoZWR1bGVVSVVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFB1c2hlcyBhbiBpbmRleCBvbnRvIHRoZSBjbGVhciBzdGFjawotICAgICAqIAotICAgICAqIEBwYXJhbSB0b0NsZWFyIHJvdyB0byBjbGVhcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwdXNoQ2xlYXIoaW50IHRvQ2xlYXIpIHsKLSAgICAgICAgCi0gICAgCS8vIElmIGJleW9uZCB0aGUgZW5kIG9mIHRoZSB0YWJsZQotICAgIAlpZiAodG9DbGVhciA+PSBzZW50T2JqZWN0cy5sZW5ndGgpIHsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAkKLSAgICAJLy8gSWYgYWxyZWFkeSBmbHVzaGVkIG9yIG5ldmVyIHNlbnQKLSAgICAgICAgaWYgKHNlbnRPYmplY3RzW3RvQ2xlYXJdID09IG51bGwpIHsKLSAgICAgICAgCXJldHVybjsgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1hcmsgYXMgZmx1c2hlZAotICAgICAgICBzZW50T2JqZWN0c1t0b0NsZWFyXSA9IG51bGw7Ci0gICAgCQotICAgICAgICBpZiAobGFzdENsZWFyID49IHBlbmRpbmdDbGVhcnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBpbnQgbmV3Q2FwYWNpdHkgPSBNYXRoLm1pbihNSU5fRkxVU0hMRU5HVEgsIGxhc3RDbGVhciAqIDIpOwotICAgICAgICAgICAgaW50W10gbmV3UGVuZGluZ0NsZWFycyA9IG5ldyBpbnRbbmV3Q2FwYWNpdHldOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwZW5kaW5nQ2xlYXJzLCAwLCBuZXdQZW5kaW5nQ2xlYXJzLCAwLCBsYXN0Q2xlYXIpOwotICAgICAgICAgICAgcGVuZGluZ0NsZWFycyA9IG5ld1BlbmRpbmdDbGVhcnM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHBlbmRpbmdDbGVhcnNbbGFzdENsZWFyKytdID0gdG9DbGVhcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaXRlbSBvbiB0aGUgZ2l2ZW4gcm93IHRvIHRoZSBnaXZlbiB2YWx1ZS4gTWF5IGJlIGNhbGxlZCBmcm9tIGEgYmFja2dyb3VuZAotICAgICAqIHRocmVhZC4gU2NoZWR1bGVzIGEgVUkgdXBkYXRlIGlmIG5lY2Vzc2FyeQotICAgICAqIAotICAgICAqIEBwYXJhbSBpZHggcm93IHRvIGNoYW5nZQotICAgICAqIEBwYXJhbSB2YWx1ZSBuZXcgdmFsdWUgZm9yIHRoZSBnaXZlbiByb3cKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlKE9iamVjdCB2YWx1ZSwgaW50IGlkeCkgeyAgICAgICAgCi0gICAgICAgIC8vIEtlZXAgdGhlIHN5bmNocm9uaXplZCBibG9jayBhcyBzbWFsbCBhcyBwb3NzaWJsZSwgc2luY2UgdGhlIFVJIG1heQotICAgICAgICAvLyBiZSB3YWl0aW5nIG9uIGl0LgotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgT2JqZWN0IG9sZE9iamVjdCA9IGtub3duT2JqZWN0c1tpZHhdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAob2xkT2JqZWN0ICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICAJaWYgKG9sZE9iamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJCWtub3duSW5kaWNlcy5yZW1vdmUob2xkT2JqZWN0KTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAJCi0gICAgICAgICAgICAgICAga25vd25PYmplY3RzW2lkeF0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIAlpZiAodmFsdWUgIT0gbnVsbCkgewotCSAgICAgICAgCQlpbnQgb2xkSW5kZXggPSBrbm93bkluZGljZXMuZ2V0KHZhbHVlLCAtMSk7Ci0JICAgICAgICAJCWlmIChvbGRJbmRleCAhPSAtMSkgewotCSAgICAgICAgCQkJa25vd25PYmplY3RzW29sZEluZGV4XSA9IG51bGw7Ci0JICAgICAgICAJCQlwdXNoQ2xlYXIob2xkSW5kZXgpOwotCSAgICAgICAgCQl9Ci0JICAgICAgICAJCQotCSAgICAgICAgCQlrbm93bkluZGljZXMucHV0KHZhbHVlLCBpZHgpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwdXNoQ2xlYXIoaWR4KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzY2hlZHVsZVVJVXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2NoZWR1bGVzIGEgVUkgdXBkYXRlLiBIYXMgbm8gZWZmZWN0IGlmIGFuIHVwZGF0ZSBoYXMgYWxyZWFkeSBiZWVuCi0gICAgICogc2NoZWR1bGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzY2hlZHVsZVVJVXBkYXRlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotCSAgICAgICAgaWYgKCF1cGRhdGVTY2hlZHVsZWQpIHsKLQkgICAgICAgICAgICB1cGRhdGVTY2hlZHVsZWQgPSB0cnVlOwotCSAgICAgICAgICAgIGlmKCF0YWJsZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCSAgICAgICAgICAgIAl0YWJsZS5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyh1aVJ1bm5hYmxlKTsKLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgaW4gdGhlIFVJIHRocmVhZCBieSBhIFNldERhdGEgY2FsbGJhY2suIFJlZnJlc2hlcyB0aGUKLSAgICAgKiB0YWJsZSBpZiBuZWNlc3NhcnkuIFJldHVybnMgdHJ1ZSBpZmYgYSByZWZyZXNoIGlzIG5lZWRlZC4KLSAgICAgKiBAcGFyYW0gaW5jbHVkZUluZGV4IHRoZSBpbmRleCB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgdmlzaWJsZSByYW5nZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja1Zpc2libGVSYW5nZShpbnQgaW5jbHVkZUluZGV4KSB7Ci0gICAgICAgIGludCBzdGFydCA9IE1hdGgubWluKHRhYmxlLmdldFRvcEluZGV4KCkgLSAxLCBpbmNsdWRlSW5kZXgpOwotICAgICAgICBpbnQgbGVuZ3RoID0gTWF0aC5tYXgodGFibGUuZ2V0VmlzaWJsZUl0ZW1Db3VudCgpLCBpbmNsdWRlSW5kZXggLSBzdGFydCk7Ci0gICAgICAgIFJhbmdlIHIgPSBsYXN0UmFuZ2U7Ci0KLSAgICAJaWYgKHN0YXJ0ICE9IHIuc3RhcnQgfHwgbGVuZ3RoICE9IHIubGVuZ3RoKSB7Ci0gICAgCQl1cGRhdGVUYWJsZSgpOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHRhYmxlLiBTZW5kcyBhbnkgdW5zZW50IGl0ZW1zIGluIHRoZSB2aXNpYmxlIHJhbmdlIHRvIHRoZSB0YWJsZSwKLSAgICAgKiBhbmQgY2xlYXJzIGFueSBwcmV2aW91c2x5LXZpc2libGUgaXRlbXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzZW50IHRvIHRoZSB0YWJsZS4KLSAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhYmxlKCkgeyAgICAJCi0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotCi0gICAgICAgIAkvLyBSZXNpemUgdGhlIHRhYmxlIGlmIG5lY2Vzc2FyeQotCSAgICAgICAgaWYgKHNlbnRPYmplY3RzLmxlbmd0aCAhPSBrbm93bk9iamVjdHMubGVuZ3RoKSB7Ci0JICAgICAgICAJT2JqZWN0W10gbmV3U2VudE9iamVjdHMgPSBuZXcgT2JqZWN0W2tub3duT2JqZWN0cy5sZW5ndGhdOwotCSAgICAgICAgCVN5c3RlbS5hcnJheWNvcHkobmV3U2VudE9iamVjdHMsIDAsIHNlbnRPYmplY3RzLCAwLCAKLQkgICAgICAgIAkJCU1hdGgubWluKG5ld1NlbnRPYmplY3RzLmxlbmd0aCwgc2VudE9iamVjdHMubGVuZ3RoKSk7Ci0JICAgICAgICAJc2VudE9iamVjdHMgPSBuZXdTZW50T2JqZWN0czsKLQkgICAgICAgICAgICB0YWJsZS5zZXRJdGVtQ291bnQobmV3U2VudE9iamVjdHMubGVuZ3RoKTsKLQkgICAgICAgIH0KLQotCSAgICAgICAgLy8gQ29tcHV0ZSB0aGUgY3VycmVudGx5IHZpc2libGUgcmFuZ2UKLQkgICAgICAgIGludCBzdGFydCA9IE1hdGgubWluKHRhYmxlLmdldFRvcEluZGV4KCksIGtub3duT2JqZWN0cy5sZW5ndGgpOwotCSAgICAgICAgaW50IGxlbmd0aCA9IE1hdGgubWluKHRhYmxlLmdldFZpc2libGVJdGVtQ291bnQoKSwga25vd25PYmplY3RzLmxlbmd0aCAtIHN0YXJ0KTsKLQkgICAgICAgIGludCBpdGVtQ291bnQgPSB0YWJsZS5nZXRJdGVtQ291bnQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAJaW50IG9sZFN0YXJ0ID0gbGFzdFJhbmdlLnN0YXJ0OwotICAgICAgICAJaW50IG9sZExlbiA9IGxhc3RSYW5nZS5sZW5ndGg7Ci0gICAgICAgIAkKLSAgICAgICAgCS8vIFN0b3JlIHRoZSB2aXNpYmxlIHJhbmdlLiBEbyBpdCBCRUZPUkUgc2VuZGluZyBhbnkgdGFibGUuY2xlYXIgY2FsbHMsCi0gICAgICAgIAkvLyBzaW5jZSBjbGVhcmluZyBhIHZpc2libGUgcm93IHdpbGwgcmVzdWx0IGluIGEgU2V0RGF0YSBjYWxsYmFjayB3aGljaAotICAgICAgICAJLy8gY2F1c2UgYW5vdGhlciB0YWJsZSB1cGRhdGUgaWYgdGhlIHZpc2libGUgcmFuZ2UgaXMgZGlmZmVyZW50IGZyb20KLSAgICAgICAgCS8vIHRoZSBzdG9yZWQgdmFsdWVzIC0tIHRoaXMgY291bGQgY2F1c2UgaW5maW5pdGUgcmVjdXJzaW9uLgotICAgICAgICAJbGFzdFJhbmdlID0gbmV3IFJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotICAgICAgICAJCi0JCQkvLyBSZS1jbGVhciBhbnkgaXRlbXMgaW4gdGhlIG9sZCByYW5nZSB0aGF0IHdlcmUgbmV2ZXIgZmlsbGVkIGluCi0JCQlmb3IoaW50IGlkeCA9IDA7IGlkeCA8IG9sZExlbjsgaWR4KyspIHsKLQkJCQlpbnQgcm93ID0gaWR4ICsgb2xkU3RhcnQ7Ci0JCQkJCi0JCQkJLy8gSWYgdGhpcyBpdGVtIGlzIG5vIGxvbmdlciB2aXNpYmxlCi0JCQkJaWYgKHJvdyA8IGl0ZW1Db3VudCAmJiAocm93IDwgc3RhcnQgfHwgcm93ID49IHN0YXJ0ICsgbGVuZ3RoKSkgewotCQkJCQkKLQkJCQkJLy8gTm90ZTogaWYgd2Ugd2FudGVkIHRvIGJlIHJlYWxseSBhZ2dyZXNzaXZlIGFib3V0IGNsZWFyaW5nCi0JCQkJCS8vIGl0ZW1zIHRoYXQgYXJlIG5vIGxvbmdlciB2aXNpYmxlLCB3ZSBjb3VsZCBjbGVhciBoZXJlIHVuY29uZGl0aW9uYWxseS4KLQkJCQkJLy8gVGhlIGN1cnJlbnQgd2F5IG9mIGRvaW5nIHRoaW5ncyB3b24ndCBjbGVhciBhIHJvdyBpZiBpdHMgY29udGVudHMgYXJlCi0JCQkJCS8vIHVwLXRvLWRhdGUuCi0JCQkJCWlmIChzZW50T2JqZWN0c1tyb3ddID09IG51bGwpIHsKLQkJCQkJCXRhYmxlLmNsZWFyKHJvdyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIFByb2Nlc3MgYW55IHBlbmRpbmcgY2xlYXJzCi0JICAgICAgICBpZiAobGFzdENsZWFyID4gMCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGFzdENsZWFyOyBpKyspIHsKLQkJCQkJaW50IHJvdyA9IHBlbmRpbmdDbGVhcnNbaV07Ci0JCQotCQkJCQlpZiAocm93IDwgc2VudE9iamVjdHMubGVuZ3RoKSB7Ci0JCQkJCQl0YWJsZS5jbGVhcihyb3cpOwotCQkJCQl9Ci0JCQkJfQotCQotCQkJCWlmIChwZW5kaW5nQ2xlYXJzLmxlbmd0aCA+IE1JTl9GTFVTSExFTkdUSCkgewotCQkJCQlwZW5kaW5nQ2xlYXJzID0gbmV3IGludFtNSU5fRkxVU0hMRU5HVEhdOwotCQkJCX0KLQkJCQlsYXN0Q2xlYXIgPSAwOwotCSAgICAgICAgfQotCQkgICAgCi0JICAgICAgICAvLyBTZW5kIGFueSB1bnNlbnQgaXRlbXMgaW4gdGhlIHZpc2libGUgcmFuZ2UKLQkgICAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHsKLQkgICAgICAgIAlpbnQgcm93ID0gaWR4ICsgc3RhcnQ7Ci0JICAgICAgICAJCi0JICAgICAgICAJT2JqZWN0IG9iaiA9IGtub3duT2JqZWN0c1tyb3ddOwotCSAgICAgICAgCWlmIChvYmogIT0gbnVsbCAmJiBvYmogIT0gc2VudE9iamVjdHNbaWR4XSkgewotCSAgICAgICAgCQl0YWJsZS5yZXBsYWNlKG9iaiwgcm93KTsKLQkgICAgICAgIAkJc2VudE9iamVjdHNbaWR4XSA9IG9iajsKLQkgICAgICAgIAl9Ci0JICAgICAgICB9Ci0JICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgb2YgYWxsIGtub3duIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gc2VudCBoZXJlIGZyb20gdGhlIGJhY2tncm91bmQKLSAgICAgKiB0aHJlYWQuCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgYWxsIGtub3duIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0S25vd25PYmplY3RzKCkgewotCQlyZXR1cm4ga25vd25PYmplY3RzOwotCX0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvRGVmZXJyZWRDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvRGVmZXJyZWRDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlZjVkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL2RlZmVycmVkL0RlZmVycmVkQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWNjZXB0QWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYXp5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotLyoqCi0gKiBDb250ZW50IHByb3ZpZGVyIHRoYXQgcGVyZm9ybXMgc29ydGluZyBhbmQgZmlsdGVyaW5nIGluIGEgYmFja2dyb3VuZCB0aHJlYWQuCi0gKiBSZXF1aXJlcyBhIDxjb2RlPlRhYmxlVmlld2VyPC9jb2RlPiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlNXVC5WSVJUVUFMPC9jb2RlPgotICogZmxhZyBhbmQgYW4gPGNvZGU+SUNvbmN1cnJlbnRNb2RlbDwvY29kZT4gYXMgaW5wdXQuCi0gKiA8cD4KLSAqIFRoZSBzb3J0ZXIgYW5kIGZpbHRlciBtdXN0IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29udGVudCBwcm92aWRlci4KLSAqIEFueSBzb3J0ZXIgb3IgZmlsdGVyIG9uIHRoZSBUYWJsZVZpZXdlciB3aWxsIGJlIGlnbm9yZWQuIAotICogPC9wPgotICogIAotICogPHA+Ci0gKiBUaGUgcmVhbCBpbXBsZW1lbnRhdGlvbiBpcyBpbiA8Y29kZT5CYWNrZ3JvdW5kQ29udGVudFByb3ZpZGVyPC9jb2RlPi4gVGhpcyAKLSAqIG9iamVjdCBpcyBhIGxpZ2h0d2VpZ2h0IHdyYXBwZXIgdGhhdCBhZGFwdHMgdGhlIGFsZ29yaXRobSB0byB3b3JrIHdpdGggCi0gKiA8Y29kZT5UYWJsZVZpZXdlcjwvY29kZT4uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIERlZmVycmVkQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUxhenlDb250ZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBpbnQgbGltaXQgPSAtMTsKLQlwcml2YXRlIEJhY2tncm91bmRDb250ZW50UHJvdmlkZXIgcHJvdmlkZXI7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIHNvcnRPcmRlcjsKLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyID0gQWNjZXB0QWxsRmlsdGVyLmdldEluc3RhbmNlKCk7Ci0JcHJpdmF0ZSBBYnN0cmFjdFZpcnR1YWxUYWJsZSB0YWJsZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUYWJsZVZpZXdlckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFZpcnR1YWxUYWJsZSB7Ci0JCQotCQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcjsKLQkJCi0JCXB1YmxpYyBUYWJsZVZpZXdlckFkYXB0ZXIoVGFibGVWaWV3ZXIgdmlld2VyKSB7Ci0JCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQuQWJzdHJhY3RWaXJ0dWFsVGFibGUjZmx1c2hDYWNoZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgY2xlYXIoaW50IGluZGV4KSB7Ci0JCQl2aWV3ZXIuY2xlYXIoaW5kZXgpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZC5BYnN0cmFjdFZpcnR1YWxUYWJsZSNyZXBsYWNlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlcGxhY2UoT2JqZWN0IGVsZW1lbnQsIGludCBpdGVtSW5kZXgpIHsKLQkJCXZpZXdlci5yZXBsYWNlKGVsZW1lbnQsIGl0ZW1JbmRleCk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLmRlZmVycmVkLkFic3RyYWN0VmlydHVhbFRhYmxlI3NldEl0ZW1Db3VudChpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRJdGVtQ291bnQoaW50IHRvdGFsKSB7Ci0JCQl2aWV3ZXIuc2V0SXRlbUNvdW50KHRvdGFsKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQuQWJzdHJhY3RWaXJ0dWFsVGFibGUjZ2V0SXRlbUNvdW50KCkKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0SXRlbUNvdW50KCkgewotCQkJcmV0dXJuIHZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZC5BYnN0cmFjdFZpcnR1YWxUYWJsZSNnZXRUb3BJbmRleCgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldFRvcEluZGV4KCkgewotCQkJcmV0dXJuIE1hdGgubWF4KHZpZXdlci5nZXRUYWJsZSgpLmdldFRvcEluZGV4KCkgLSAxLCAwKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQuQWJzdHJhY3RWaXJ0dWFsVGFibGUjZ2V0VmlzaWJsZUl0ZW1Db3VudCgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldFZpc2libGVJdGVtQ291bnQoKSB7Ci0JCQlpbnQgc3RhcnQgPSBnZXRUb3BJbmRleCgpOwotCQkJaW50IGl0ZW1Db3VudCA9IGdldEl0ZW1Db3VudCgpOwotCQkJVGFibGUgdGFibGUgPSB2aWV3ZXIuZ2V0VGFibGUoKTsKLQkJCXJldHVybiBNYXRoLm1pbih0YWJsZS5nZXRCb3VuZHMoKS5oZWlnaHQgLyB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgKyAyLCAKLQkJCQkJaXRlbUNvdW50IC0gc3RhcnQpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZC5BYnN0cmFjdFZpcnR1YWxUYWJsZSNnZXRDb250cm9sKCkKLQkJICovCi0JCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gdmlld2VyLmdldENvbnRyb2woKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBEZWZlcnJlZENvbnRlbnRQcm92aWRlciB3aXRoIHRoZSBnaXZlbiBzb3J0IG9yZGVyLgotCSAqIEBwYXJhbSBzb3J0T3JkZXIgYSBjb21wYXJhdG9yIHRoYXQgc29ydHMgdGhlIGNvbnRlbnQuCi0JICovCi0JcHVibGljIERlZmVycmVkQ29udGVudFByb3ZpZGVyKENvbXBhcmF0b3Igc29ydE9yZGVyKSB7Ci0JCXRoaXMuc29ydE9yZGVyID0gc29ydE9yZGVyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzZXRQcm92aWRlcihudWxsKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAobmV3SW5wdXQgPT0gbnVsbCkgewotCQkJc2V0UHJvdmlkZXIobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUFzc2VydC5pc1RydWUobmV3SW5wdXQgaW5zdGFuY2VvZiBJQ29uY3VycmVudE1vZGVsKTsKLQkJQXNzZXJ0LmlzVHJ1ZSh2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcik7Ci0JCUlDb25jdXJyZW50TW9kZWwgbW9kZWwgPSAoSUNvbmN1cnJlbnRNb2RlbCluZXdJbnB1dDsKLQkJCi0JCXRoaXMudGFibGUgPSBuZXcgVGFibGVWaWV3ZXJBZGFwdGVyKChUYWJsZVZpZXdlcil2aWV3ZXIpOwotCQkKLQkJQmFja2dyb3VuZENvbnRlbnRQcm92aWRlciBuZXdQcm92aWRlciA9IG5ldyBCYWNrZ3JvdW5kQ29udGVudFByb3ZpZGVyKAotCQkJCXRhYmxlLAotCQkJCW1vZGVsLCBzb3J0T3JkZXIpOyAKLQkJCi0JCXNldFByb3ZpZGVyKG5ld1Byb3ZpZGVyKTsKLQkJCi0JCW5ld1Byb3ZpZGVyLnNldExpbWl0KGxpbWl0KTsKLQkJbmV3UHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNvcnQgb3JkZXIgZm9yIHRoaXMgY29udGVudCBwcm92aWRlci4gVGhpcyBzb3J0IG9yZGVyIHRha2VzIHByaW9yaXR5Ci0JICogb3ZlciBhbnl0aGluZyB0aGF0IHdhcyBzdXBwbGllZCB0byB0aGUgPGNvZGU+VGFibGVWaWV3ZXI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBzb3J0T3JkZXIgbmV3IHNvcnQgb3JkZXIuIFRoZSBjb21wYXJhdG9yIG11c3QgYmUgYWJsZSB0byBzdXBwb3J0IGJlaW5nCi0JICogdXNlZCBpbiBhIGJhY2tncm91bmQgdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvcnRPcmRlcihDb21wYXJhdG9yIHNvcnRPcmRlcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKHNvcnRPcmRlcik7Ci0JCXRoaXMuc29ydE9yZGVyID0gc29ydE9yZGVyOwotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcHJvdmlkZXIuc2V0U29ydE9yZGVyKHNvcnRPcmRlcik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZmlsdGVyIGZvciB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuIFRoaXMgZmlsdGVyIHRha2VzIHByaW9yaXR5IG92ZXIKLQkgKiBhbnl0aGluZyB0aGF0IHdhcyBzdXBwbGllZCB0byB0aGUgPGNvZGU+VGFibGVWaWV3ZXI8L2NvZGU+LiBUaGUgZmlsdGVyCi0JICogbXVzdCBiZSBjYXBhYmxlIG9mIGJlaW5nIHVzZWQgaW4gYSBiYWNrZ3JvdW5kIHRocmVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9TZXQgZmlsdGVyIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIHRvU2V0KSB7Ci0JCXRoaXMuZmlsdGVyID0gdG9TZXQ7Ci0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlwcm92aWRlci5zZXRGaWx0ZXIodG9TZXQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlLiBJZiB0aGUgbW9kZWwgY29udGFpbnMgbW9yZQotCSAqIHRoYW4gdGhpcyBudW1iZXIgb2YgZWxlbWVudHMsIG9ubHkgdGhlIHRvcCBlbGVtZW50cyB3aWxsIGJlIHNob3duIGJhc2VkIG9uCi0JICogdGhlIGN1cnJlbnQgc29ydCBvcmRlci4gCi0JICogCi0JICogQHBhcmFtIGxpbWl0IG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gc2hvdyBvciAtMSBpZiB1bmJvdW5kZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW1pdChpbnQgbGltaXQpIHsKLQkJdGhpcy5saW1pdCA9IGxpbWl0OwotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcHJvdmlkZXIuc2V0TGltaXQobGltaXQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgbWF4aW11bSBudW1iZXIgb2Ygcm93cyBvciAtMSBpZiB1bmJvdW5kZWQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IG1heGltdW0gbnVtYmVyIG9mIHJvd3Mgb3IgLTEgaWYgdW5ib3VuZGVkCi0JICovCi0JcHVibGljIGludCBnZXRMaW1pdCgpIHsKLQkJcmV0dXJuIGxpbWl0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYXp5Q29udGVudFByb3ZpZGVyI3VwZGF0ZUVsZW1lbnQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoaW50IGVsZW1lbnQpIHsKLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXByb3ZpZGVyLmNoZWNrVmlzaWJsZVJhbmdlKGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRQcm92aWRlcihCYWNrZ3JvdW5kQ29udGVudFByb3ZpZGVyIG5ld1Byb3ZpZGVyKSB7Ci0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlwcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXByb3ZpZGVyID0gbmV3UHJvdmlkZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL2RlZmVycmVkL0Zhc3RQcm9ncmVzc1JlcG9ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL2RlZmVycmVkL0Zhc3RQcm9ncmVzc1JlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YTM2MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9kZWZlcnJlZC9GYXN0UHJvZ3Jlc3NSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLmRlZmVycmVkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogQSBtb3JlIGVmZmljaWVudCBhbHRlcm5hdGl2ZSB0byBhbiBJUHJvZ3Jlc3NNb25pdG9yLiBJbiBwYXJ0aWN1bGFyLCB0aGUgaW1wbGVtZW50YXRpb24KLSAqIGlzIGRlc2lnbmVkIHRvIG1ha2UgaXNDYW5jZWxlZCgpIHJ1biBhcyBlZmZpY2llbnRseSBhcyBwb3NzaWJsZS4gQ3VycmVudGx5IHBhY2thZ2UtdmlzaWJsZQotICogYmVjYXVzZSB0aGUgaW1wbGVtZW50YXRpb24gaXMgaW5jb21wbGV0ZS4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1maW5hbCBjbGFzcyBGYXN0UHJvZ3Jlc3NSZXBvcnRlciB7Ci0gICAgcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGNhbmNlbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBpbnQgY2FuY2VsQ2hlY2sgPSAwOwotLy8gICAgcHJpdmF0ZSBTdHJpbmcgdGFza05hbWU7Ci0vLyAgICAKLS8vICAgIHByaXZhdGUgaW50IHRhc2tEZXB0aCA9IDA7Ci0vLyAgICBwcml2YXRlIGludCBzdWJUYXNrU2l6ZSA9IDE7Ci0vLyAgICBwcml2YXRlIGludCB0b3RhbFdvcmsgPSAxOwotLy8gICAgcHJpdmF0ZSBpbnQgcGFyZW50V29yayA9IDE7Ci0vLyAgICBwcml2YXRlIGludCBtb25pdG9yVW5pdHNSZW1haW5pbmc7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IENBTkNFTF9DSEVDS19QRVJJT0QgPSA0MDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbnVsbCBGYXN0UHJvZ3Jlc3NSZXBvcnRlcgotICAgICAqLwotICAgIHB1YmxpYyBGYXN0UHJvZ3Jlc3NSZXBvcnRlcigpIHsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEZhc3RQcm9ncmVzc1JlcG9ydGVyIHRoYXQgd3JhcHMgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciB0byB3cmFwCi0gICAgICogQHBhcmFtIHRvdGFsUHJvZ3Jlc3MgdGhlIHRvdGFsIHByb2dyZXNzIHRvIGJlIHJlcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIEZhc3RQcm9ncmVzc1JlcG9ydGVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRvdGFsUHJvZ3Jlc3MpIHsKLSAgICAgICAgdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLSAgICAgICAgLy9tb25pdG9yVW5pdHNSZW1haW5pbmcgPSB0b3RhbFByb2dyZXNzOwotICAgICAgICBjYW5jZWxlZCA9IG1vbml0b3IuaXNDYW5jZWxlZCgpOwotICAgIH0KLSAgICAKLS8vICAgIC8qKgotLy8gICAgICogRXZlcnkgY2FsbCB0byBiZWdpblRhc2sgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBjYWxsIHRvIGVuZFRhc2ssIHdpdGggdGhlCi0vLyAgICAgKiBzYW1lIGFyZ3VtZW50LgotLy8gICAgICogCi0vLyAgICAgKiBAcGFyYW0gdG90YWxXb3JrCi0vLyAgICAgKiBAc2luY2UgMy4xCi0vLyAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIGJlZ2luVGFzayhpbnQgdG90YWxXb3JrKSB7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgaWYgKG1vbml0b3IgPT0gbnVsbCkgewotLy8gICAgICAgICAgICByZXR1cm47Ci0vLyAgICAgICAgfQotLy8gICAgICAgIAotLy8gICAgICAgIHRhc2tEZXB0aCsrOwotLy8KLS8vICAgICAgICBpZiAodG90YWxXb3JrID09IDApIHsKLS8vICAgICAgICAgICAgcmV0dXJuOwotLy8gICAgICAgIH0KLS8vICAgICAgICAKLS8vICAgICAgICB0aGlzLnRvdGFsV29yayAqPSB0b3RhbFdvcms7Ci0vLyAgICB9Ci0vLyAgICAKLS8vICAgIHB1YmxpYyB2b2lkIGJlZ2luU3ViVGFzayhpbnQgc3ViVGFza1dvcmspIHsKLS8vICAgICAgICBzdWJUYXNrU2l6ZSAqPSBzdWJUYXNrV29yazsKLS8vICAgIH0KLS8vICAgIAotLy8gICAgcHVibGljIHZvaWQgZW5kU3ViVGFzayhpbnQgc3ViVGFza1dvcmspIHsKLS8vICAgICAgICBzdWJUYXNrU2l6ZSAvPSBzdWJUYXNrV29yazsKLS8vICAgIH0KLS8vICAgIAotLy8gICAgcHVibGljIHZvaWQgd29ya2VkKGludCBhbW91bnQpIHsKLS8vICAgICAgICBhbW91bnQgKj0gc3ViVGFza1NpemU7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgaWYgKGFtb3VudCA+IHRvdGFsV29yaykgewotLy8gICAgICAgICAgICBhbW91bnQgPSB0b3RhbFdvcms7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIAotLy8gICAgICAgIGludCBjb25zdW1lZCA9IG1vbml0b3JVbml0c1JlbWFpbmluZyAqIGFtb3VudCAvIHRvdGFsV29yazsKLS8vICAgICAgICAKLS8vICAgICAgICBpZiAoY29uc3VtZWQgPiAwKSB7Ci0vLyAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKGNvbnN1bWVkKTsKLS8vICAgICAgICAgICAgbW9uaXRvclVuaXRzUmVtYWluaW5nIC09IGNvbnN1bWVkOwotLy8gICAgICAgIH0KLS8vICAgICAgICB0b3RhbFdvcmsgLT0gYW1vdW50OwotLy8gICAgfQotLy8gICAgCi0vLyAgICBwdWJsaWMgdm9pZCBlbmRUYXNrKGludCB0b3RhbFdvcmspIHsgICAgICAgIAotLy8gICAgICAgIHRhc2tEZXB0aC0tOwotLy8gICAgICAgIAotLy8gICAgICAgIGlmICh0YXNrRGVwdGggPT0gMCkgewotLy8gICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3JVbml0c1JlbWFpbmluZyA+IDApIHsKLS8vICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKG1vbml0b3JVbml0c1JlbWFpbmluZyk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgICAgCi0vLyAgICAgICAgaWYgKHRvdGFsV29yayA9PSAwKSB7Ci0vLyAgICAgICAgICAgIHJldHVybjsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgCi0vLyAgICAgICAgdGhpcy50b3RhbFdvcmsgLz0gdG90YWxXb3JrOwotLy8KLS8vICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBoYXMgYmVlbiBjYW5jZWxlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb25pdG9yIGhhcyBiZWVuIGNhbmNlbGxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotICAgICAgICBpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2FuY2VsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNhbmNlbENoZWNrKys7Ci0gICAgICAgIGlmIChjYW5jZWxDaGVjayA+IENBTkNFTF9DSEVDS19QRVJJT0QpIHsKLSAgICAgICAgICAgIGNhbmNlbGVkID0gbW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0gICAgICAgICAgICBjYW5jZWxDaGVjayA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhbmNlbGVkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYW5jZWwgdGhlIHByb2dyZXNzIG1vbml0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeyAgICAgICAgCi0gICAgICAgIGNhbmNlbGVkID0gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIGlmIChtb25pdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvSUNvbmN1cnJlbnRNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9kZWZlcnJlZC9JQ29uY3VycmVudE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MjI3MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9kZWZlcnJlZC9JQ29uY3VycmVudE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZDsKLQotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBzZXQgb2YgdW5vcmRlcmVkIGVsZW1lbnRzIHRoYXQgY2FuIGZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbnMuCi0gKiBJQ29uY3VycmVudE1vZGVsIHJldHVybnMgaXRzIGNvbnRlbnRzIGFzeW5jaHJvbm91cy4gUmF0aGVyIHRoYW4gaW1wbGVtZW50aW5nIAotICogImdldCIgbWV0aG9kcywgbGlzdGVuZXJzIGNhbiByZXF1ZXN0IGFuIHVwZGF0ZSBhbmQgdGhlIG1vZGVsIGZpcmVzIGJhY2sKLSAqIGluZm9ybWF0aW9uIGF0IGl0cyBlYXJsaWVzdCBjb252ZW5pZW5jZS4KLSAqIAotICogPHA+Ci0gKiBUaGUgbW9kZWwgaXMgYWxsb3dlZCB0byBzZW5kIGJhY2sgbm90aWZpY2F0aW9ucyB0byBpdHMgbGlzdGVuZXJzIGluIGFueSB0aHJlYWQsCi0gKiBhbmQgdGhlIGxpc3RlbmVycyBtdXN0IG5vdCBhc3N1bWUgdGhhdCB0aGUgbm90aWZpY2F0aW9ucyB3aWxsIGFycml2ZSBpbiB0aGUgVUkKLSAqIHRocmVhZC4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBOb3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gQ2xpZW50cyBzaG91bGQgc3ViY2xhc3MgCi0gKiA8Y29kZT5BYnN0cmFjdENvbmN1cnJlbnRNb2RlbDwvY29kZT4gaW5zdGVhZC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25jdXJyZW50TW9kZWwgewotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdHMgdGhhdCB0aGUgcmVjZWl2ZXIgdG8gY2FsbCB0aGUgZ2l2ZW4gbGlzdGVuZXIncyBzZXRDb250ZW50cyguLi4pIAotICAgICAqIG1ldGhvZCBhdCBpdHMgZWFybGllc3QgY29udmVuaWVuY2UuIFRoZSByZWNlaXZlciBpcyBhbGxvd2VkIHRvIGNvbXB1dGUgdGhlIAotICAgICAqIGVsZW1lbnRzIGFzeW5jaHJvbm91c2x5LiBUaGF0IGlzLCBpdCBjYW4gY29tcHV0ZSB0aGUgcmVzdWx0IGluIGEgYmFja2dyb3VuZCAKLSAgICAgKiB0aHJlYWQgYW5kIGNhbGwgc2V0Q29udGVudHMoLi4uKSBvbmNlIHRoZSByZXN1bHQgaXMgcmVhZHkuIElmIHRoZSByZXN1bHQgaXMKLSAgICAgKiB0b28gbGFyZ2UgdG8gcmV0dXJuIGluIG9uZSBiYXRjaCwgaXQgY2FuIGNhbGwgc2V0Q29udGVudHMgd2l0aCBhbiBlbXB0eSBhcnJheQotICAgICAqIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YgYWRkcy4KLSAgICAgKiA8cD4KLSAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIHVwZGF0ZSBpcyBhbHJlYWR5IHF1ZXVlZCBmb3IgYW4gaWRlbnRpY2FsIGxpc3RlbmVyLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgbGlzdGVuZXIgd2hvc2Ugc2V0Q29udGVudHMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQuIFRoZQotICAgICAqIGxpc3RlbmVyIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIGFkZExpc3RlbmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGUoSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyIGxpc3RlbmVyKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhpcyBtb2RlbC4gVGhlIGxpc3RlbmVyIHNob3VsZCBiZSBnaXZlbiB0aGUgbW9kZWwncwotICAgICAqIGN1cnJlbnQgY29udGVudHMgKGVpdGhlciB0aHJvdWdoIHNldENvbnRlbnRzIG9yIGEgc2VxdWVuY2Ugb2YgYWRkcykgYXQgdGhlCi0gICAgICogcmVjZWl2ZXIncyBlYXJsaWVzdCBjb252ZW5pZW5jZS4gVGhlIHJlY2VpdmVyIHdpbGwgbm90aWZ5IHRoZSBsaXN0ZW5lcgotICAgICAqIGFib3V0IGFueSBjaGFuZ2VzIGluIHN0YXRlIHVudGlsIHRoZSBsaXN0ZW5lciBpcyByZW1vdmVkLgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIGxpc3RlbmVyIHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElDb25jdXJyZW50TW9kZWxMaXN0ZW5lciBsaXN0ZW5lcik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhpcyBtb2RlbC4gVGhlIHJlY2VpdmVyIHdpbGwgc3RvcCBzZW5kaW5nCi0gICAgICogbm90aWZpY2F0aW9ucyB0byB0aGUgZ2l2ZW4gbGlzdGVuZXIgYXMgc29vbiBhcyBwb3NzaWJsZSAoYWx0aG91Z2gKLSAgICAgKiBzb21lIGFkZGl0aW9uYWwgbm90aWZpY2F0aW9ucyBtYXkgc3RpbGwgaWYgYXJyaXZlIGlmIHRoZSByZWNlaXZlcgotICAgICAqIHdhcyBpbiB0aGUgcHJvY2VzcyBvZiBzZW5kaW5nIG5vdGlmaWNhdGlvbnMgaW4gYW5vdGhlciB0aHJlYWQpLgotICAgICAqIEFueSBwZW5kaW5nIHVwZGF0ZXMgZm9yIHRoaXMgbGlzdGVuZXIgd2lsbCBiZSBjYW5jZWxsZWQuCi0gICAgICogPHA+Ci0gICAgICogSGFzIG5vIGVmZmVjdCBpZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgaXMgbm90IGtub3duIHRvIHRoaXMgbW9kZWwuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBsaXN0ZW5lciB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJQ29uY3VycmVudE1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9kZWZlcnJlZC9JQ29uY3VycmVudE1vZGVsTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTA3NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9kZWZlcnJlZC9JQ29uY3VycmVudE1vZGVsTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLmRlZmVycmVkOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGNhbiBsaXN0ZW4gdG8gY2hhbmdlcyBpbiBhbiBJQ29uY3VycmVudE1vZGVsLgotICogRWxlbWVudHMgaW4gYW4gSUNvbmN1cnJlbnRNb2RlbCBhcmUgdW5vcmRlcmVkLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyIHsKLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiBlbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIG1vZGVsIAotCSAqIAotCSAqIEBwYXJhbSBhZGRlZCBlbGVtZW50cyBhZGRlZCB0byB0aGUgbW9kZWwKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0W10gYWRkZWQpOwotICAgIAotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGVsZW1lbnRzIGFyZSByZW1vdmVkIGZyb20gdGhlIG1vZGVsCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlbW92ZWQgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3RbXSByZW1vdmVkKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBlbGVtZW50cyBpbiB0aGUgbW9kZWwgaGF2ZSBjaGFuZ2VkCi0gICAgICogCi0gICAgICogQHBhcmFtIGNoYW5nZWQgZWxlbWVudHMgdGhhdCBoYXZlIGNoYW5nZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoT2JqZWN0W10gY2hhbmdlZCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhlIHJlY2VpdmVyIGFib3V0IHRoZSBjb21wbGV0ZSBzZXQKLSAgICAgKiBvZiBlbGVtZW50cyBpbiB0aGUgbW9kZWwuIE1vc3QgbW9kZWxzIHdpbGwKLSAgICAgKiBub3QgY2FsbCB0aGlzIG1ldGhvZCB1bmxlc3MgdGhlIGxpc3RlbmVyIGV4cGxpY2l0bHkKLSAgICAgKiByZXF1ZXN0cyBpdCBieSBjYWxsaW5nIAotICAgICAqIDxjb2RlPklDb25jdXJyZW50TW9kZWwucmVxdWVzdFVwZGF0ZTwvY29kZT4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIG5ld0NvbnRlbnRzIGNvbnRlbnRzIG9mIHRoZSBtb2RlbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRzKE9iamVjdFtdIG5ld0NvbnRlbnRzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvSW50SGFzaE1hcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9kZWZlcnJlZC9JbnRIYXNoTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMDliMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9kZWZlcnJlZC9JbnRIYXNoTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBtYXAgb2Ygb2JqZWN0cyBvbnRvIGludHMuIFRoaXMgaXMgaW50ZW5kZWQgZm9yIGZ1dHVyZSBvcHRpbWl6YXRpb246Ci0gKiB1c2luZyBpbnQgcHJpbWl0aXZlcyB3b3VsZCBhbGxvdyBmb3IgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBkb2Vzbid0IHJlcXVpcmUKLSAqIGFkZGl0aW9uYWwgb2JqZWN0IGFsbG9jYXRpb25zIGZvciBJbnRlZ2Vycy4gSG93ZXZlciwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KLSAqIHNpbXBseSBkZWxlZ2F0ZXMgdG8gdGhlIEphdmEgSGFzaE1hcCBjbGFzcy4gCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBJbnRIYXNoTWFwIHsKLSAgICBwcml2YXRlIEhhc2hNYXAgbWFwOyAKLSAgICAKLSAgICBwdWJsaWMgSW50SGFzaE1hcChpbnQgc2l6ZSwgZmxvYXQgbG9hZEZhY3RvcikgewotICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcChzaXplLCBsb2FkRmFjdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEludEhhc2hNYXAoKSB7Ci0gICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIG1hcC5yZW1vdmUoa2V5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHV0KE9iamVjdCBrZXksIGludCB2YWx1ZSkgewotICAgICAgICBtYXAucHV0KGtleSwgbmV3IEludGVnZXIodmFsdWUpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gZ2V0KGtleSwgMCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0KE9iamVjdCBrZXksIGludCBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgSW50ZWdlciByZXN1bHQgPSAoSW50ZWdlciltYXAuZ2V0KGtleSk7Ci0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuaW50VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAJcmV0dXJuIG1hcC5zaXplKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9kZWZlcnJlZC9MYXp5U29ydGVkQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9kZWZlcnJlZC9MYXp5U29ydGVkQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGVlY2ZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvZGVmZXJyZWQvTGF6eVNvcnRlZENvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBUaGlzIG9iamVjdCBtYWludGFpbnMgYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzLCBzb3J0ZWQgYnkgYSBjb21wYXJhdG9yCi0gKiBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3IuIFRoZSBjb2xsZWN0aW9uIGlzIGxhemlseSBzb3J0ZWQsIGFsbG93aW5nIAotICogbW9yZSBlZmZpY2llbnQgcnVudGltZXMgZm9yIG1vc3QgbWV0aG9kcy4gVGhlcmUgYXJlIHNldmVyYWwgbWV0aG9kcyBvbiB0aGlzCi0gKiBvYmplY3QgdGhhdCBhbGxvdyBvYmplY3RzIHRvIGJlIHF1ZXJpZWQgYnkgdGhlaXIgcG9zaXRpb24gaW4gdGhlIHNvcnRlZAotICogY29sbGVjdGlvbi4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGlzIGEgbW9kaWZpZWQgYmluYXJ5IHNlYXJjaCB0cmVlLiBFYWNoIHN1YnRyZWUgaGFzIGEgdmFsdWUsIGEgbGVmdCBhbmQgcmlnaHQgc3VidHJlZSwgCi0gKiBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4sIGFuZCBhIHNldCBvZiB1bnNvcnRlZCBjaGlsZHJlbi4gCi0gKiBJbnNlcnRpb24gaGFwcGVucyBsYXppbHkuIFdoZW4gYSBuZXcgbm9kZSBOIGlzIGluc2VydGVkIGludG8gYSBzdWJ0cmVlIFQsIGl0IGlzIGluaXRpYWxseSAKLSAqIGFkZGVkIHRvIHRoZSBzZXQgb2YgdW5zb3J0ZWQgY2hpbGRyZW4gZm9yIFQgd2l0aG91dCBhY3R1YWxseSBjb21wYXJpbmcgaXQgd2l0aCB0aGUgdmFsdWUgZm9yIFQuIAotICogPC9wPgotICogPHA+Ci0gKiBUaGUgdW5zb3J0ZWQgY2hpbGRyZW4gd2lsbCByZW1haW4gaW4gdGhlIHVuc29ydGVkIHNldCB1bnRpbCBzb21lIHN1YnNlcXVlbnQgb3BlcmF0aW9uIHJlcXVpcmVzCi0gKiB1cyB0byBrbm93IHRoZSBleGFjdCBzZXQgb2YgZWxlbWVudHMgaW4gb25lIG9mIHRoZSBzdWJ0cmVlcy4gQXQgdGhhdCB0aW1lLCB3ZSBwYXJ0aXRpb24KLSAqIFQgYnkgY29tcGFyaW5nIGFsbCBvZiBpdHMgdW5zb3J0ZWQgY2hpbGRyZW4gd2l0aCBUJ3MgdmFsdWUgYW5kIG1vdmluZyB0aGVtIGludG8gdGhlIGxlZnQgCi0gKiBvciByaWdodCBzdWJ0cmVlcy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgTGF6eVNvcnRlZENvbGxlY3Rpb24gewotICAgIHByaXZhdGUgZmluYWwgaW50IE1JTl9DQVBBQ0lUWSA9IDg7Ci0gICAgcHJpdmF0ZSBPYmplY3RbXSBjb250ZW50cyA9IG5ldyBPYmplY3RbTUlOX0NBUEFDSVRZXTsKLSAgICBwcml2YXRlIGludFtdIGxlZnRTdWJUcmVlID0gbmV3IGludFtNSU5fQ0FQQUNJVFldOwotICAgIHByaXZhdGUgaW50W10gcmlnaHRTdWJUcmVlID0gbmV3IGludFtNSU5fQ0FQQUNJVFldOwotICAgIHByaXZhdGUgaW50W10gbmV4dFVuc29ydGVkID0gbmV3IGludFtNSU5fQ0FQQUNJVFldOwotICAgIHByaXZhdGUgaW50W10gdHJlZVNpemUgPSBuZXcgaW50W01JTl9DQVBBQ0lUWV07Ci0gICAgcHJpdmF0ZSBpbnRbXSBwYXJlbnRUcmVlID0gbmV3IGludFtNSU5fQ0FQQUNJVFldOwotICAgIHByaXZhdGUgaW50IHJvb3QgPSAtMTsKLSAgICBwcml2YXRlIGludCBsYXN0Tm9kZSA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgZmlyc3RVbnVzZWROb2RlID0gLTE7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgbG9hZEZhY3RvciA9IDAuNzVmOwotICAgIAotICAgIHByaXZhdGUgSW50SGFzaE1hcCBvYmplY3RJbmRpY2VzOwotICAgIHByaXZhdGUgQ29tcGFyYXRvciBjb21wYXJhdG9yOwotICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudGVyID0gMDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEaXNhYmxlcyByYW5kb21pemF0aW9uIGFuZCBlbmFibGVzIGFkZGl0aW9uYWwgcnVudGltZSBlcnJvciBjaGVja2luZy4KLSAgICAgKiBTZXZlcmVseSBkZWdyYWRlcyBwZXJmb3JtYW5jZSBpZiBzZXQgdG8gdHJ1ZS4gSW50ZW5kZWQgZm9yIHVzZSBpbiB0ZXN0IAotICAgICAqIHN1aXRlcyBvbmx5LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZURlYnVnID0gZmFsc2U7Ci0gICAgCi0gICAgLy8gVGhpcyBvYmplY3QgaXMgaW5zZXJ0ZWQgYXMgdGhlIHZhbHVlIGludG8gYW55IG5vZGUgc2NoZWR1bGVkIGZvciBsYXp5IHJlbW92YWwKLSAgICBwcml2YXRlIE9iamVjdCBsYXp5UmVtb3ZhbEZsYWcgPSBuZXcgT2JqZWN0KCkgewotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJMYXp5IHJlbW92YWwgZmxhZyI7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9OwotICAgIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBESVJfTEVGVCA9IDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERJUl9SSUdIVCA9IDE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERJUl9VTlNPUlRFRCA9IDI7Ci0gICAgCi0gICAgLy8gRGlyZWN0aW9uIGNvbnN0YW50cyBpbmRpY2F0aW5nIHJvb3Qgbm9kZXMKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRElSX1JPT1QgPSAzOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBESVJfVU5VU0VEID0gNDsKLSAgICAgICAKLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEVkZ2UgewotICAgICAgICBwcml2YXRlIGludCBzdGFydE5vZGU7Ci0gICAgICAgIHByaXZhdGUgaW50IGRpcmVjdGlvbjsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRWRnZSgpIHsKLSAgICAgICAgICAgIHN0YXJ0Tm9kZSA9IC0xOwotICAgICAgICAgICAgZGlyZWN0aW9uID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRWRnZShpbnQgbm9kZSwgaW50IGRpcikgewotICAgICAgICAgICAgc3RhcnROb2RlID0gbm9kZTsKLSAgICAgICAgICAgIGRpcmVjdGlvbiA9IGRpcjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0U3RhcnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhcnROb2RlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGludCBnZXRUYXJnZXQoKSB7Ci0gICAgICAgICAgICBpZiAoc3RhcnROb2RlID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBESVJfVU5TT1JURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0VW51c2VkTm9kZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJfUk9PVCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9vdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IERJUl9MRUZUKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRTdWJUcmVlW3N0YXJ0Tm9kZV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IERJUl9SSUdIVCkgewotICAgICAgICAgICAgICAgIHJldHVybiByaWdodFN1YlRyZWVbc3RhcnROb2RlXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXh0VW5zb3J0ZWRbc3RhcnROb2RlXTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzTnVsbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRUYXJnZXQoKSA9PSAtMTsKLSAgICAgICAgfQotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZGlyZWN0cyB0aGlzIGVkZ2UgdG8gYSBuZXcgbm9kZQotICAgICAgICAgKiBAcGFyYW0gbmV3Tm9kZQotICAgICAgICAgKiBAc2luY2UgMy4xCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgc2V0VGFyZ2V0KGludCBuZXdOb2RlKSB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IERJUl9MRUZUKSB7Ci0gICAgCSAgICAgICAgbGVmdFN1YlRyZWVbc3RhcnROb2RlXSA9IG5ld05vZGU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJfUklHSFQpIHsKLSAgICAgICAgICAgICAgICByaWdodFN1YlRyZWVbc3RhcnROb2RlXSA9IG5ld05vZGU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJfVU5TT1JURUQpIHsKLSAgICAgICAgICAgICAgICBuZXh0VW5zb3J0ZWRbc3RhcnROb2RlXSA9IG5ld05vZGU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJfUk9PVCkgewotICAgICAgICAgICAgICAgIHJvb3QgPSBuZXdOb2RlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRElSX1VOVVNFRCkgewotICAgICAgICAgICAgICAgIGZpcnN0VW51c2VkTm9kZSA9IG5ld05vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLQkgICAgICAgIGlmIChuZXdOb2RlICE9IC0xKSB7Ci0JICAgICAgICAgICAgcGFyZW50VHJlZVtuZXdOb2RlXSA9IHN0YXJ0Tm9kZTsKLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkdmFuY2UoaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgc3RhcnROb2RlID0gZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRSb290Tm9kZShpbnQgbm9kZSkgewotICAgICAgICByb290ID0gbm9kZTsKLSAgICAgICAgaWYgKG5vZGUgIT0gLTEpIHsKLSAgICAgICAgICAgIHBhcmVudFRyZWVbbm9kZV0gPSAtMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHNvcnRlZCBjb2xsZWN0aW9uIHVzaW5nIHRoZSBnaXZlbiBjb21wYXJhdG9yIHRvIGRldGVybWluZQotICAgICAqIHNvcnQgb3JkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGMgY29tcGFyYXRvciB0aGF0IGRldGVybWluZXMgdGhlIHNvcnQgb3JkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTGF6eVNvcnRlZENvbGxlY3Rpb24oQ29tcGFyYXRvciBjKSB7Ci0gICAgICAgIHRoaXMuY29tcGFyYXRvciA9IGM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIGlmIHRoaXMgb2JqZWN0J3MgaW50ZXJuYWwgc3RhdGUgaXMgdmFsaWQuIFRocm93cyBhIHJ1bnRpbWUKLSAgICAgKiBleGNlcHRpb24gaWYgdGhlIHN0YXRlIGlzIGludmFsaWQsIGluZGljYXRpbmcgYSBwcm9ncmFtbWluZyBlcnJvcgotICAgICAqIGluIHRoaXMgY2xhc3MuIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB1c2UgaW4gdGVzdAotICAgICAqIHN1aXRlcyBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkgY2xpZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YXJpYW50cygpIHsKLSAgICAgICAgaWYgKCFlbmFibGVEZWJ1ZykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0ZXN0SW52YXJpYW50cyhyb290KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RJbnZhcmlhbnRzKGludCBub2RlKSB7Ci0gICAgICAgIGlmIChub2RlID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB0cmVlIHNpemUgKHdlIHdpbGwgbGF0ZXIgZm9yY2UgdGhlIHRyZWUgc2l6ZQotICAgICAgICAvLyB0byBiZSByZWNvbXB1dGVkIGZyb20gc2NyYXRjaCAtLSBpZiBldmVyeXRoaW5nIHdvcmtzIHByb3Blcmx5LCB0aGVuCi0gICAgICAgIC8vIHRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2UuCi0gICAgICAgIGludCB0cmVlU2l6ZSA9IGdldFN1YnRyZWVTaXplKG5vZGUpOwotCi0gICAgICAgIGludCBsZWZ0ID0gbGVmdFN1YlRyZWVbbm9kZV07Ci0gICAgICAgIGludCByaWdodCA9IHJpZ2h0U3ViVHJlZVtub2RlXTsKLSAgICAgICAgaW50IHVuc29ydGVkID0gbmV4dFVuc29ydGVkW25vZGVdOwotICAgICAgICAKLSAgICAgICAgaWYgKGlzVW5zb3J0ZWQobm9kZSkpIHsKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUobGVmdCA9PSAtMSwgInVuc29ydGVkIG5vZGVzIHNob3VsZG4ndCBoYXZlIGEgbGVmdCBzdWJ0cmVlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUocmlnaHQgPT0gLTEsICJ1bnNvcnRlZCBub2RlcyBzaG91bGRuJ3QgaGF2ZSBhIHJpZ2h0IHN1YnRyZWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobGVmdCAhPSAtMSkgewotICAgICAgICAgICAgdGVzdEludmFyaWFudHMobGVmdCk7Ci0gICAgICAgICAgICBBc3NlcnQuaXNUcnVlKHBhcmVudFRyZWVbbGVmdF0gPT0gbm9kZSwgImxlZnQgbm9kZSBoYXMgaW52YWxpZCBwYXJlbnQgcG9pbnRlciIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHJpZ2h0ICE9IC0xKSB7Ci0gICAgICAgICAgICB0ZXN0SW52YXJpYW50cyhyaWdodCk7Ci0gICAgICAgICAgICBBc3NlcnQuaXNUcnVlKHBhcmVudFRyZWVbcmlnaHRdID09IG5vZGUsICJyaWdodCBub2RlIGhhcyBpbnZhbGlkIHBhcmVudCBwb2ludGVyIik7ICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIGludCBwcmV2aW91cyA9IG5vZGU7Ci0gICAgICAgIHdoaWxlICh1bnNvcnRlZCAhPSAtMSkgewotICAgICAgICAgICAgaW50IG9sZFRyZWVTaXplID0gdGhpcy50cmVlU2l6ZVt1bnNvcnRlZF07Ci0gICAgICAgICAgICByZWNvbXB1dGVUcmVlU2l6ZSh1bnNvcnRlZCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUodGhpcy50cmVlU2l6ZVt1bnNvcnRlZF0gPT0gb2xkVHJlZVNpemUsIAotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBub2RlIHNpemUgZm9yIHVuc29ydGVkIG5vZGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgQXNzZXJ0LmlzVHJ1ZShsZWZ0U3ViVHJlZVt1bnNvcnRlZF0gPT0gLTEsICJ1bnNvcnRlZCBub2RlcyBzaG91bGRuJ3QgaGF2ZSBsZWZ0IHN1YnRyZWVzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUocmlnaHRTdWJUcmVlW3Vuc29ydGVkXSA9PSAtMSwgInVuc29ydGVkIG5vZGVzIHNob3VsZG4ndCBoYXZlIHJpZ2h0IHN1YnRyZWVzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUocGFyZW50VHJlZVt1bnNvcnRlZF0gPT0gcHJldmlvdXMsICJ1bnNvcnRlZCBub2RlIGhhcyBpbnZhbGlkIHBhcmVudCBwb2ludGVyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUoY29udGVudHNbdW5zb3J0ZWRdICE9IGxhenlSZW1vdmFsRmxhZywgInVuc29ydGVkIG5vZGVzIHNob3VsZCBub3QgYmUgbGF6aWx5IHJlbW92ZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcHJldmlvdXMgPSB1bnNvcnRlZDsKLSAgICAgICAgICAgIHVuc29ydGVkID0gbmV4dFVuc29ydGVkW3Vuc29ydGVkXTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gTm90ZSB0aGF0IHdlJ3ZlIGFscmVhZHkgdGVzdGVkIHRoYXQgdGhlIGNoaWxkIHNpemVzIGFyZSBjb3JyZWN0Li4uIGlmIG91ciBzaXplIGlzCi0gICAgICAgIC8vIGNvcnJlY3QsIHRoZW4gcmVjb21wdXRpbmcgaXQgbm93IHNob3VsZCBub3QgY2F1c2UgYW55IGNoYW5nZS4KLSAgICAgICAgcmVjb21wdXRlVHJlZVNpemUobm9kZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIEFzc2VydC5pc1RydWUodHJlZVNpemUgPT0gZ2V0U3VidHJlZVNpemUobm9kZSksICJpbnZhbGlkIHRyZWUgc2l6ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Vuc29ydGVkKGludCBub2RlKSB7Ci0gICAgICAgIGludCBwYXJlbnQgPSBwYXJlbnRUcmVlW25vZGVdOwotICAgICAgICAKLSAgICAgICAgaWYgKHBhcmVudCAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIG5leHRVbnNvcnRlZFtwYXJlbnRdID09IG5vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzTGVzcyhpbnQgZWxlbWVudDEsIGludCBlbGVtZW50MikgewotICAgICAgICByZXR1cm4gY29tcGFyYXRvci5jb21wYXJlKGNvbnRlbnRzW2VsZW1lbnQxXSwgY29udGVudHNbZWxlbWVudDJdKSA8IDA7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGVsZW1lbnQgdG8gdGhlIGdpdmVuIHN1YnRyZWUuIFJldHVybnMgdGhlIG5ldwotICAgICAqIHJvb3Qgb2YgdGhlIHN1YnRyZWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN1YlRyZWUgaW5kZXggb2YgdGhlIHN1YnRyZWUgdG8gaW5zZXJ0IGVsZW1lbnRUb0FkZCBpbnRvLiBJZiAtMSwgCi0gICAgICogICAgICAgICAgICAgICAgdGhlbiBhIG5ldyBzdWJ0cmVlIHdpbGwgYmUgY3JlYXRlZCBmb3IgZWxlbWVudFRvQWRkCi0gICAgICogQHBhcmFtIGVsZW1lbnRUb0FkZCBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBhZGQgdG8gdGhlIHN1YnRyZWUuIElmIC0xLCB0aGlzIG1ldGhvZAotICAgICAqICAgICAgICAgICAgICAgICBpcyBhIE5PUC4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgYWRkVW5zb3J0ZWQoaW50IHN1YlRyZWUsIGludCBlbGVtZW50VG9BZGQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnRUb0FkZCA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIHN1YlRyZWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChzdWJUcmVlID09IC0xKSB7Ci0gICAgICAgICAgICBuZXh0VW5zb3J0ZWRbZWxlbWVudFRvQWRkXSA9IC0xOwotICAgICAgICAgICAgdHJlZVNpemVbZWxlbWVudFRvQWRkXSA9IDE7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbWVudFRvQWRkOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGUgc3ViVHJlZSBpcyBlbXB0eSAoaWU6IGl0IG9ubHkgY29udGFpbnMgbm9kZXMgZmxhZ2dlZCBmb3IgbGF6eSByZW1vdmFsKSwKLSAgICAgICAgLy8gY2hvcCBpdCBvZmYuCi0gICAgICAgIGlmICh0cmVlU2l6ZVtzdWJUcmVlXSA9PSAwKSB7Ci0gICAgICAgICAgICByZW1vdmVTdWJUcmVlKHN1YlRyZWUpOwotICAgICAgICAgICAgbmV4dFVuc29ydGVkW2VsZW1lbnRUb0FkZF0gPSAtMTsKLSAgICAgICAgICAgIHRyZWVTaXplW2VsZW1lbnRUb0FkZF0gPSAxOwotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRUb0FkZDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSWYgbmVpdGhlciBzdWJ0cmVlIGhhcyBhbnkgY2hpbGRyZW4sIGFkZCBhIHBzZXVkb3JhbmRvbSBjaGFuY2Ugb2YgdGhlCi0gICAgICAgIC8vIG5ld2x5IGFkZGVkIGVsZW1lbnQgYmVjb21pbmcgdGhlIG5ldyBwaXZvdCBmb3IgdGhpcyBub2RlLiBOb3RlOiBpbnN0ZWFkCi0gICAgICAgIC8vIG9mIGEgcmVhbCBwc2V1ZG9yYW5kb20gZ2VuZXJhdG9yLCB3ZSBzaW1wbHkgdXNlIGEgY291bnRlciBoZXJlLgotICAgICAgICBpZiAoIWVuYWJsZURlYnVnICYmIGxlZnRTdWJUcmVlW3N1YlRyZWVdID09IC0xICYmIHJpZ2h0U3ViVHJlZVtzdWJUcmVlXSA9PSAtMSAKLSAgICAgICAgICAgICAgICAmJiBsZWZ0U3ViVHJlZVtlbGVtZW50VG9BZGRdID09IC0xICYmIHJpZ2h0U3ViVHJlZVtlbGVtZW50VG9BZGRdID09IC0xKSB7Ci0JICAgICAgICBjb3VudGVyLS07Ci0JICAgICAgICAKLQkgICAgICAgIGlmIChjb3VudGVyICUgdHJlZVNpemVbc3ViVHJlZV0gPT0gMCkgewotCSAgICAgICAgICAgIC8vIE1ha2UgdGhlIG5ldyBub2RlIGludG8gdGhlIG5ldyBwaXZvdCAKLQkgICAgICAgICAgICBuZXh0VW5zb3J0ZWRbZWxlbWVudFRvQWRkXSA9IHN1YlRyZWU7Ci0JICAgICAgICAgICAgcGFyZW50VHJlZVtlbGVtZW50VG9BZGRdID0gcGFyZW50VHJlZVtzdWJUcmVlXTsKLQkgICAgICAgICAgICBwYXJlbnRUcmVlW3N1YlRyZWVdID0gZWxlbWVudFRvQWRkOwotCSAgICAgICAgICAgIHRyZWVTaXplW2VsZW1lbnRUb0FkZF0gPSB0cmVlU2l6ZVtzdWJUcmVlXSArIDE7Ci0JICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRUb0FkZDsKLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IG9sZE5leHRVbnNvcnRlZCA9IG5leHRVbnNvcnRlZFtzdWJUcmVlXTsKLSAgICAgICAgbmV4dFVuc29ydGVkW2VsZW1lbnRUb0FkZF0gPSBvbGROZXh0VW5zb3J0ZWQ7Ci0gICAgICAgIAotICAgICAgICBpZiAob2xkTmV4dFVuc29ydGVkID09IC0xKSB7Ci0gICAgICAgICAgICB0cmVlU2l6ZVtlbGVtZW50VG9BZGRdID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyZWVTaXplW2VsZW1lbnRUb0FkZF0gPSB0cmVlU2l6ZVtvbGROZXh0VW5zb3J0ZWRdICsgMTsKLSAgICAgICAgICAgIHBhcmVudFRyZWVbb2xkTmV4dFVuc29ydGVkXSA9IGVsZW1lbnRUb0FkZDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcGFyZW50VHJlZVtlbGVtZW50VG9BZGRdID0gc3ViVHJlZTsKLSAgICAgICAgCi0gICAgICAgIG5leHRVbnNvcnRlZFtzdWJUcmVlXSA9IGVsZW1lbnRUb0FkZDsKLSAgICAgICAgdHJlZVNpemVbc3ViVHJlZV0rKzsgICAgICAgIAotICAgICAgICByZXR1cm4gc3ViVHJlZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0U3VidHJlZVNpemUocm9vdCk7Ci0gICAgICAgIAotICAgICAgICB0ZXN0SW52YXJpYW50cygpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSB0cmVlIGFuZCBvbmUgb2YgaXRzIHVuc29ydGVkIGNoaWxkcmVuLCB0aGlzIHNvcnRzIHRoZSBjaGlsZCBieSBtb3ZpbmcKLSAgICAgKiBpdCBpbnRvIHRoZSBsZWZ0IG9yIHJpZ2h0IHN1YnRyZWVzLiBSZXR1cm5zIHRoZSBuZXh0IHVuc29ydGVkIGNoaWxkIG9yIC0xIGlmIG5vbmUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3ViVHJlZSBwYXJlbnQgdHJlZQotICAgICAqIEBwYXJhbSB0b01vdmUgY2hpbGQgKHVuc29ydGVkKSBzdWJ0cmVlCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IHBhcnRpdGlvbihpbnQgc3ViVHJlZSwgaW50IHRvTW92ZSkgewotICAgICAgICBpbnQgcmVzdWx0ID0gbmV4dFVuc29ydGVkW3RvTW92ZV07Ci0gICAgICAgIAotICAgICAgICBpZiAoaXNMZXNzKHRvTW92ZSwgc3ViVHJlZSkpIHsKLSAgICAgICAgICAgIGludCBuZXh0TGVmdCA9IGFkZFVuc29ydGVkKGxlZnRTdWJUcmVlW3N1YlRyZWVdLCB0b01vdmUpOwotICAgICAgICAgICAgbGVmdFN1YlRyZWVbc3ViVHJlZV0gPSBuZXh0TGVmdDsKLSAgICAgICAgICAgIHBhcmVudFRyZWVbbmV4dExlZnRdID0gc3ViVHJlZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBuZXh0UmlnaHQgPSBhZGRVbnNvcnRlZChyaWdodFN1YlRyZWVbc3ViVHJlZV0sIHRvTW92ZSk7Ci0gICAgICAgICAgICByaWdodFN1YlRyZWVbc3ViVHJlZV0gPSBuZXh0UmlnaHQ7Ci0gICAgICAgICAgICBwYXJlbnRUcmVlW25leHRSaWdodF0gPSBzdWJUcmVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQYXJ0aXRpb25zIHRoZSBnaXZlbiBzdWJ0cmVlLiBNb3ZlcyBhbGwgdW5zb3J0ZWQgZWxlbWVudHMgYXQgdGhlIGdpdmVuIG5vZGUKLSAgICAgKiB0byBlaXRoZXIgdGhlIGxlZnQgb3IgcmlnaHQgc3VidHJlZXMuIElmIHRoZSBub2RlIGl0c2VsZiB3YXMgc2NoZWR1bGVkIGZvcgotICAgICAqIGxhenkgcmVtb3ZhbCwgdGhpcyB3aWxsIGZvcmNlIHRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaW1tZWRpYXRlbHkuIFJldHVybnMKLSAgICAgKiB0aGUgbmV3IHN1YlRyZWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN1YlRyZWUKLSAgICAgKiBAcmV0dXJuIHRoZSByZXBsYWNlbWVudCBub2RlICh0aGlzIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBzdWJUcmVlIGlmIHRoZSBzdWJ0cmVlCi0gICAgICogd2FzIHJlcGxhY2VkIGR1cmluZyB0aGUgcmVtb3ZhbCkKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgcGFydGl0aW9uKGludCBzdWJUcmVlLCBGYXN0UHJvZ3Jlc3NSZXBvcnRlciBtb24pIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdWJUcmVlID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChjb250ZW50c1tzdWJUcmVlXSA9PSBsYXp5UmVtb3ZhbEZsYWcpIHsKLSAgICAgICAgICAgIHN1YlRyZWUgPSByZW1vdmVOb2RlKHN1YlRyZWUpOwotICAgICAgICAgICAgaWYgKHN1YlRyZWUgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGlkeCA9IG5leHRVbnNvcnRlZFtzdWJUcmVlXTsgaWR4ICE9IC0xOykgeyAKLSAgICAgICAgICAgIGlkeCA9IHBhcnRpdGlvbihzdWJUcmVlLCBpZHgpOwotICAgICAgICAgICAgbmV4dFVuc29ydGVkW3N1YlRyZWVdID0gaWR4OwotICAgICAgICAgICAgaWYgKGlkeCAhPSAtMSkgewotICAgICAgICAgICAgICAgIHBhcmVudFRyZWVbaWR4XSA9IHN1YlRyZWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtb24uaXNDYW5jZWxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZXJlIGFyZSBubyByZW1haW5pbmcgdW5zb3J0ZWQgbm9kZXMgaW4gdGhpcyBzdWJ0cmVlCi0gICAgICAgIG5leHRVbnNvcnRlZFtzdWJUcmVlXSA9IC0xOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1YlRyZWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgaW50IGdldFN1YnRyZWVTaXplKGludCBzdWJUcmVlKSB7Ci0gICAgICAgIGlmIChzdWJUcmVlID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJlZVNpemVbc3ViVHJlZV07Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEluY3JlYXNlcyB0aGUgY2FwYWNpdHkgb2YgdGhpcyBjb2xsZWN0aW9uLCBpZiBuZWNlc3NhcnksIHNvIHRoYXQgaXQgY2FuIGhvbGQgdGhlIAotICAgICAqIGdpdmVuIG51bWJlciBvZiBlbGVtZW50cy4gVGhpcyBjYW4gYmUgdXNlZCBwcmlvciB0byBhIHNlcXVlbmNlIG9mIGFkZGl0aW9ucyB0bwotICAgICAqIGF2b2lkIG1lbW9yeSByZWFsbG9jYXRpb24uIFRoaXMgY2Fubm90IGJlIHVzZWQgdG8gcmVkdWNlIHRoZSBhbW91bnQgCi0gICAgICogb2YgbWVtb3J5IHVzZWQgYnkgdGhlIGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV3U2l6ZSBjYXBhY2l0eSBmb3IgdGhpcyBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FwYWNpdHkoaW50IG5ld1NpemUpIHsKLSAgICAgICAgaWYgKG5ld1NpemUgPiBjb250ZW50cy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHNldEFycmF5U2l6ZShuZXdTaXplKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGp1c3RzIHRoZSBjYXBhY2l0eSBvZiB0aGUgYXJyYXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5ld0NhcGFjaXR5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNldEFycmF5U2l6ZShpbnQgbmV3Q2FwYWNpdHkpIHsKLSAgICAgICAgT2JqZWN0W10gbmV3Q29udGVudHMgPSBuZXcgT2JqZWN0W25ld0NhcGFjaXR5XTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgbmV3Q29udGVudHMsIDAsIGxhc3ROb2RlKTsKLSAgICAgICAgY29udGVudHMgPSBuZXdDb250ZW50czsKLSAgICAgICAgCi0gICAgICAgIGludFtdIG5ld0xlZnRTdWJUcmVlID0gbmV3IGludFtuZXdDYXBhY2l0eV07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkobGVmdFN1YlRyZWUsIDAsIG5ld0xlZnRTdWJUcmVlLCAwLCBsYXN0Tm9kZSk7Ci0gICAgICAgIGxlZnRTdWJUcmVlID0gbmV3TGVmdFN1YlRyZWU7Ci0gICAgICAgIAotICAgICAgICBpbnRbXSBuZXdSaWdodFN1YlRyZWUgPSBuZXcgaW50W25ld0NhcGFjaXR5XTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyaWdodFN1YlRyZWUsIDAsIG5ld1JpZ2h0U3ViVHJlZSwgMCwgbGFzdE5vZGUpOwotICAgICAgICByaWdodFN1YlRyZWUgPSBuZXdSaWdodFN1YlRyZWU7Ci0gICAgICAgIAotICAgICAgICBpbnRbXSBuZXdOZXh0VW5zb3J0ZWQgPSBuZXcgaW50W25ld0NhcGFjaXR5XTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShuZXh0VW5zb3J0ZWQsIDAsIG5ld05leHRVbnNvcnRlZCwgMCwgbGFzdE5vZGUpOwotICAgICAgICBuZXh0VW5zb3J0ZWQgPSBuZXdOZXh0VW5zb3J0ZWQ7Ci0gICAgICAgIAotICAgICAgICBpbnRbXSBuZXdUcmVlU2l6ZSA9IG5ldyBpbnRbbmV3Q2FwYWNpdHldOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRyZWVTaXplLCAwLCBuZXdUcmVlU2l6ZSwgMCwgbGFzdE5vZGUpOwotICAgICAgICB0cmVlU2l6ZSA9IG5ld1RyZWVTaXplOwotICAgICAgICAKLSAgICAgICAgaW50W10gbmV3UGFyZW50VHJlZSA9IG5ldyBpbnRbbmV3Q2FwYWNpdHldOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcmVudFRyZWUsIDAsIG5ld1BhcmVudFRyZWUsIDAsIGxhc3ROb2RlKTsKLSAgICAgICAgcGFyZW50VHJlZSA9IG5ld1BhcmVudFRyZWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgbm9kZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5ld2x5Ci0gICAgICogY3JlYXRlZCBub2RlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBuZXdseSBjcmVhdGVkIG5vZGUKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgY3JlYXRlTm9kZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IC0xOwotCi0gICAgICAgIGlmIChmaXJzdFVudXNlZE5vZGUgPT0gLTEpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyB1bnVzZWQgbm9kZXMgZnJvbSBwcmlvciByZW1vdmFscywgdGhlbiAKLSAgICAgICAgICAgIC8vIHdlIGFkZCBhIG5vZGUgYXQgdGhlIGVuZAotICAgICAgICAgICAgcmVzdWx0ID0gbGFzdE5vZGU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIHRoaXMgd291bGQgY2F1c2UgdGhlIGFycmF5IHRvIG92ZXJmbG93LCByZWFsbG9jYXRlIHRoZSBhcnJheSAKLSAgICAgICAgICAgIGlmIChjb250ZW50cy5sZW5ndGggPD0gbGFzdE5vZGUpIHsKLSAgICAgICAgICAgICAgICBzZXRDYXBhY2l0eShsYXN0Tm9kZSAqIDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBsYXN0Tm9kZSsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gUmV1c2UgYSBub2RlIGZyb20gYSBwcmlvciByZW1vdmFsCi0gICAgICAgICAgICByZXN1bHQgPSBmaXJzdFVudXNlZE5vZGU7Ci0gICAgICAgICAgICBmaXJzdFVudXNlZE5vZGUgPSBuZXh0VW5zb3J0ZWRbcmVzdWx0XTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29udGVudHNbcmVzdWx0XSA9IHZhbHVlOwotICAgICAgICB0cmVlU2l6ZVtyZXN1bHRdID0gMTsKLSAgICAgICAgCi0gICAgICAgIC8vIENsZWFyIHBvaW50ZXJzCi0gICAgICAgIGxlZnRTdWJUcmVlW3Jlc3VsdF0gPSAtMTsKLSAgICAgICAgcmlnaHRTdWJUcmVlW3Jlc3VsdF0gPSAtMTsKLSAgICAgICAgbmV4dFVuc29ydGVkW3Jlc3VsdF0gPSAtMTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFzIGxvbmcgYXMgd2UgaGF2ZSBhIGhhc2ggdGFibGUgb2YgdmFsdWVzIG9udG8gdHJlZSBpbmRpY2VzLCBpbmNyZW1lbnRhbGx5Ci0gICAgICAgIC8vIHVwZGF0ZSB0aGUgaGFzaCB0YWJsZS4gTm90ZTogdGhlIHRhYmxlIGlzIG9ubHkgY29uc3RydWN0ZWQgYXMgbmVlZGVkLCBhbmQgaXQKLSAgICAgICAgLy8gaXMgZGVzdHJveWVkIHdoZW5ldmVyIHRoZSBhcnJheXMgYXJlIHJlYWxsb2NhdGVkIGluc3RlYWQgb2YgcmVhbGxvY2F0aW5nIGl0LgotICAgICAgICBpZiAob2JqZWN0SW5kaWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvYmplY3RJbmRpY2VzLnB1dCh2YWx1ZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB0cmVlIGluZGV4IGZvciB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdHJlZSBpbmRleAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRPYmplY3RJbmRleChPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIG1hcCBvZiB2YWx1ZXMgb250byB0cmVlIGluZGljZXMsIGJ1aWxkIHRoZSBtYXAgbm93LgotICAgICAgICBpZiAob2JqZWN0SW5kaWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gLTE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG9iamVjdEluZGljZXMgPSBuZXcgSW50SGFzaE1hcCgoaW50KShjb250ZW50cy5sZW5ndGggLyBsb2FkRmFjdG9yKSArIDEsIGxvYWRGYWN0b3IpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhc3ROb2RlOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGNvbnRlbnRzW2ldOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCAhPSBsYXp5UmVtb3ZhbEZsYWcpIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0SW5kaWNlcy5wdXQoZWxlbWVudCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gZWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIG1hcCBvZiB2YWx1ZXMgb250byB0cmVlIGluZGljZXMsIHJldHVybiB0aGUgcmVzdWx0IGJ5IGxvb2tpbmcgaXQgdXAgaW4KLSAgICAgICAgLy8gdGhlIG1hcAotICAgICAgICByZXR1cm4gb2JqZWN0SW5kaWNlcy5nZXQodmFsdWUsIC0xKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVkaXJlY3RzIGFueSBwb2ludGVycyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgcmVwbGFjZW1lbnQuIElmIHRoZSByZXBsYWNlbWVudAotICAgICAqIGNhdXNlcyBhIGNoYW5nZSBpbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBwYXJlbnQgdHJlZSwgdGhlIGNoYW5nZXMgYXJlCi0gICAgICogcHJvcG9nYXRlZCB0b3dhcmQgdGhlIHJvb3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGVUb1JlcGxhY2UKLSAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnROb2RlCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXBsYWNlTm9kZShpbnQgbm9kZVRvUmVwbGFjZSwgaW50IHJlcGxhY2VtZW50Tm9kZSkgewotICAgICAgICBpbnQgcGFyZW50ID0gcGFyZW50VHJlZVtub2RlVG9SZXBsYWNlXTsKLSAgICAgICAgCi0gICAgICAgIGlmIChwYXJlbnQgPT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChyb290ID09IG5vZGVUb1JlcGxhY2UpIHsKLSAgICAgICAgICAgICAgICBzZXRSb290Tm9kZShyZXBsYWNlbWVudE5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxlZnRTdWJUcmVlW3BhcmVudF0gPT0gbm9kZVRvUmVwbGFjZSkgewotICAgICAgICAgICAgICAgIGxlZnRTdWJUcmVlW3BhcmVudF0gPSByZXBsYWNlbWVudE5vZGU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJpZ2h0U3ViVHJlZVtwYXJlbnRdID09IG5vZGVUb1JlcGxhY2UpIHsKLSAgICAgICAgICAgICAgICByaWdodFN1YlRyZWVbcGFyZW50XSA9IHJlcGxhY2VtZW50Tm9kZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dFVuc29ydGVkW3BhcmVudF0gPT0gbm9kZVRvUmVwbGFjZSkgewotICAgICAgICAgICAgICAgIG5leHRVbnNvcnRlZFtwYXJlbnRdID0gcmVwbGFjZW1lbnROb2RlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50Tm9kZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIHBhcmVudFRyZWVbcmVwbGFjZW1lbnROb2RlXSA9IHBhcmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVjb21wdXRlQW5jZXN0b3JUcmVlU2l6ZXMoaW50IG5vZGUpIHsKLSAgICAgICAgd2hpbGUgKG5vZGUgIT0gLTEpIHsKLSAgICAgICAgICAgIGludCBvbGRTaXplID0gdHJlZVNpemVbbm9kZV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJlY29tcHV0ZVRyZWVTaXplKG5vZGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodHJlZVNpemVbbm9kZV0gPT0gb2xkU2l6ZSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBub2RlID0gcGFyZW50VHJlZVtub2RlXTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlY29tcHV0ZXMgdGhlIHRyZWUgc2l6ZSBmb3IgdGhlIGdpdmVuIG5vZGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlY29tcHV0ZVRyZWVTaXplKGludCBub2RlKSB7Ci0gICAgICAgIGlmIChub2RlID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJlZVNpemVbbm9kZV0gPSBnZXRTdWJ0cmVlU2l6ZShsZWZ0U3ViVHJlZVtub2RlXSkKLSAgICAJCSsgZ2V0U3VidHJlZVNpemUocmlnaHRTdWJUcmVlW25vZGVdKQotICAgIAkJKyBnZXRTdWJ0cmVlU2l6ZShuZXh0VW5zb3J0ZWRbbm9kZV0pCi0gICAgCQkrIChjb250ZW50c1tub2RlXSA9PSBsYXp5UmVtb3ZhbEZsYWcgPyAwIDogMSk7IAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9SZWNvbXB1dGUKLSAgICAgKiBAcGFyYW0gd2hlcmVUb1N0b3AKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZvcmNlUmVjb21wdXRlVHJlZVNpemUoaW50IHRvUmVjb21wdXRlLCBpbnQgd2hlcmVUb1N0b3ApIHsKLSAgICAgICAgd2hpbGUgKHRvUmVjb21wdXRlICE9IC0xICYmIHRvUmVjb21wdXRlICE9IHdoZXJlVG9TdG9wKSB7Ci0JICAgICAgICByZWNvbXB1dGVUcmVlU2l6ZSh0b1JlY29tcHV0ZSk7Ci0JICAgICAgICAKLQkgICAgICAgIHRvUmVjb21wdXRlID0gcGFyZW50VHJlZVt0b1JlY29tcHV0ZV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGVzdHJveSB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXggaW4gdGhlIHRyZWUKLSAgICAgKiBAcGFyYW0gbm9kZVRvRGVzdHJveQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGVzdHJveU5vZGUoaW50IG5vZGVUb0Rlc3Ryb3kpIHsKLSAgICAgICAgLy8gSWYgd2UncmUgbWFpbnRhaW5pbmcgYSBtYXAgb2YgdmFsdWVzIG9udG8gdHJlZSBpbmRpY2VzLCByZW1vdmUgdGhpcyBlbnRyeSBmcm9tCi0gICAgICAgIC8vIHRoZSBtYXAKLSAgICAgICAgaWYgKG9iamVjdEluZGljZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IG9sZENvbnRlbnRzID0gY29udGVudHNbbm9kZVRvRGVzdHJveV07Ci0gICAgICAgICAgICBpZiAob2xkQ29udGVudHMgIT0gbGF6eVJlbW92YWxGbGFnKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0SW5kaWNlcy5yZW1vdmUob2xkQ29udGVudHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjb250ZW50c1tub2RlVG9EZXN0cm95XSA9IG51bGw7Ci0gICAgICAgIGxlZnRTdWJUcmVlW25vZGVUb0Rlc3Ryb3ldID0gLTE7Ci0gICAgICAgIHJpZ2h0U3ViVHJlZVtub2RlVG9EZXN0cm95XSA9IC0xOwotICAgICAgICAKLSAgICAgICAgaWYgKGZpcnN0VW51c2VkTm9kZSA9PSAtMSkgewotICAgICAgICAgICAgdHJlZVNpemVbbm9kZVRvRGVzdHJveV0gPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJlZVNpemVbbm9kZVRvRGVzdHJveV0gPSB0cmVlU2l6ZVtmaXJzdFVudXNlZE5vZGVdICsgMTsKLSAgICAgICAgICAgIHBhcmVudFRyZWVbZmlyc3RVbnVzZWROb2RlXSA9IG5vZGVUb0Rlc3Ryb3k7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG5leHRVbnNvcnRlZFtub2RlVG9EZXN0cm95XSA9IGZpcnN0VW51c2VkTm9kZTsKLSAgICAgICAgCi0gICAgICAgIGZpcnN0VW51c2VkTm9kZSA9IG5vZGVUb0Rlc3Ryb3k7IAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGcmVlcyB1cCBtZW1vcnkgYnkgY2xlYXJpbmcgdGhlIGxpc3Qgb2Ygbm9kZXMgdGhhdCBoYXZlIGJlZW4gZnJlZWQgdXAgdGhyb3VnaCByZW1vdmFscy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHBhY2soKSB7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gdW51c2VkIG5vZGVzLCB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KLSAgICAgICAgaWYgKGZpcnN0VW51c2VkTm9kZSA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgcmV1c2FibGVOb2RlcyA9IGdldFN1YnRyZWVTaXplKGZpcnN0VW51c2VkTm9kZSk7Ci0gICAgICAgIGludCBub25QYWNrYWJsZU5vZGVzID0gbGFzdE5vZGUgLSByZXVzYWJsZU5vZGVzOwotICAgICAgICAKLSAgICAgICAgLy8gT25seSBwYWNrIHRoZSBhcnJheSBpZiB3ZSdyZSB1dGlsaXppbmcgbGVzcyB0aGFuIDEvNCBvZiB0aGUgYXJyYXkgKG5vdGU6Ci0gICAgICAgIC8vIHRoaXMgY2hlY2sgaXMgaW1wb3J0YW50LCBvciBpdCB3aWxsIGNoYW5nZSB0aGUgdGltZSBib3VuZHMgZm9yIHJlbW92YWxzKQotICAgICAgICBpZiAoY29udGVudHMubGVuZ3RoIDwgTUlOX0NBUEFDSVRZIHx8IG5vblBhY2thYmxlTm9kZXMgPiBjb250ZW50cy5sZW5ndGggLyA0KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFJhdGhlciB0aGFuIHVwZGF0ZSB0aGUgZW50aXJlIG1hcCwganVzdCBudWxsIGl0IG91dC4gSWYgaXQgaXMgbmVlZGVkLAotICAgICAgICAvLyBpdCB3aWxsIGJlIHJlY3JlYXRlZCBsYXppbHkgbGF0ZXIuIFRoaXMgd2lsbCBzYXZlIHNvbWUgbWVtb3J5IGlmIHRoZQotICAgICAgICAvLyBtYXAgaXNuJ3QgbmVlZGVkLCBhbmQgaXQgdGFrZXMgYSBzaW1pbGFyIGFtb3VudCBvZiB0aW1lIHRvIHJlY3JlYXRlIHRoZQotICAgICAgICAvLyBtYXAgYXMgdG8gdXBkYXRlIGFsbCB0aGUgaW5kaWNlcy4KLSAgICAgICAgb2JqZWN0SW5kaWNlcyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAvLyBNYXBzIG9sZCBpbmRleCAtPiBuZXcgaW5kZXgKLSAgICAgICAgaW50W10gbWFwTmV3SWR4T250b09sZCA9IG5ldyBpbnRbY29udGVudHMubGVuZ3RoXTsKLSAgICAgICAgaW50W10gbWFwT2xkSWR4T250b05ldyA9IG5ldyBpbnRbY29udGVudHMubGVuZ3RoXTsKLSAgICAgICAgCi0gICAgICAgIGludCBuZXh0TmV3SWR4ID0gMDsKLSAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbWFwcGluZy4gRGV0ZXJtaW5lIHRoZSBuZXcgaW5kZXggZm9yIGVhY2ggZWxlbWVudCAKLSAgICAgICAgZm9yIChpbnQgb2xkSWR4ID0gMDsgb2xkSWR4IDwgbGFzdE5vZGU7IG9sZElkeCsrKSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudHNbb2xkSWR4XSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWFwT2xkSWR4T250b05ld1tvbGRJZHhdID0gbmV4dE5ld0lkeDsKLSAgICAgICAgICAgICAgICBtYXBOZXdJZHhPbnRvT2xkW25leHROZXdJZHhdID0gb2xkSWR4OwotICAgICAgICAgICAgICAgIG5leHROZXdJZHgrKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWFwT2xkSWR4T250b05ld1tvbGRJZHhdID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE1ha2UgdGhlIGFjdHVhbCBhcnJheSBzaXplIGRvdWJsZSB0aGUgbnVtYmVyIG9mIG5vZGVzIHRvIGFsbG93Ci0gICAgICAgIC8vIGZvciBleHBhbnNpb24uCi0gICAgICAgIGludCBuZXdOb2RlcyA9IG5leHROZXdJZHg7Ci0gICAgICAgIGludCBuZXdDYXBhY2l0eSA9IE1hdGgubWF4KG5ld05vZGVzICogMiwgTUlOX0NBUEFDSVRZKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFsbG9jYXRlIG5ldyBhcnJheXMKLSAgICAgICAgT2JqZWN0W10gbmV3Q29udGVudHMgPSBuZXcgT2JqZWN0W25ld0NhcGFjaXR5XTsKLSAgICAgICAgaW50W10gbmV3VHJlZVNpemUgPSBuZXcgaW50W25ld0NhcGFjaXR5XTsKLSAgICAgICAgaW50W10gbmV3TmV4dFVuc29ydGVkID0gbmV3IGludFtuZXdDYXBhY2l0eV07Ci0gICAgICAgIGludFtdIG5ld0xlZnRTdWJUcmVlID0gbmV3IGludFtuZXdDYXBhY2l0eV07Ci0gICAgICAgIGludFtdIG5ld1JpZ2h0U3ViVHJlZSA9IG5ldyBpbnRbbmV3Q2FwYWNpdHldOwotICAgICAgICBpbnRbXSBuZXdQYXJlbnRUcmVlID0gbmV3IGludFtuZXdDYXBhY2l0eV07Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBuZXdJZHggPSAwOyBuZXdJZHggPCBuZXdOb2RlczsgbmV3SWR4KyspIHsKLSAgICAgICAgICAgIGludCBvbGRJZHggPSBtYXBOZXdJZHhPbnRvT2xkW25ld0lkeF07Ci0gICAgICAgICAgICBuZXdDb250ZW50c1tuZXdJZHhdID0gY29udGVudHNbb2xkSWR4XTsKLSAgICAgICAgICAgIG5ld1RyZWVTaXplW25ld0lkeF0gPSB0cmVlU2l6ZVtvbGRJZHhdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgbGVmdCA9IGxlZnRTdWJUcmVlW29sZElkeF07Ci0gICAgICAgICAgICBpZiAobGVmdCA9PSAtMSkgewotICAgICAgICAgICAgICAgIG5ld0xlZnRTdWJUcmVlW25ld0lkeF0gPSAtMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV3TGVmdFN1YlRyZWVbbmV3SWR4XSA9IG1hcE9sZElkeE9udG9OZXdbbGVmdF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCByaWdodCA9IHJpZ2h0U3ViVHJlZVtvbGRJZHhdOwotICAgICAgICAgICAgaWYgKHJpZ2h0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgbmV3UmlnaHRTdWJUcmVlW25ld0lkeF0gPSAtMTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5ld1JpZ2h0U3ViVHJlZVtuZXdJZHhdID0gbWFwT2xkSWR4T250b05ld1tyaWdodF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCB1bnNvcnRlZCA9IG5leHRVbnNvcnRlZFtvbGRJZHhdOwotICAgICAgICAgICAgaWYgKHVuc29ydGVkID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgbmV3TmV4dFVuc29ydGVkW25ld0lkeF0gPSAtMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV3TmV4dFVuc29ydGVkW25ld0lkeF0gPSBtYXBPbGRJZHhPbnRvTmV3W3Vuc29ydGVkXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IHBhcmVudCA9IHBhcmVudFRyZWVbb2xkSWR4XTsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBuZXdQYXJlbnRUcmVlW25ld0lkeF0gPSAtMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFyZW50VHJlZVtuZXdJZHhdID0gbWFwT2xkSWR4T250b05ld1twYXJlbnRdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjb250ZW50cyA9IG5ld0NvbnRlbnRzOwotICAgICAgICBuZXh0VW5zb3J0ZWQgPSBuZXdOZXh0VW5zb3J0ZWQ7Ci0gICAgICAgIHRyZWVTaXplID0gbmV3VHJlZVNpemU7Ci0gICAgICAgIGxlZnRTdWJUcmVlID0gbmV3TGVmdFN1YlRyZWU7Ci0gICAgICAgIHJpZ2h0U3ViVHJlZSA9IG5ld1JpZ2h0U3ViVHJlZTsKLSAgICAgICAgcGFyZW50VHJlZSA9IG5ld1BhcmVudFRyZWU7Ci0gICAgICAgIAotICAgICAgICBpZiAocm9vdCAhPSAtMSkgewotICAgICAgICAgICAgcm9vdCA9IG1hcE9sZElkeE9udG9OZXdbcm9vdF07Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEFsbCB1bnVzZWQgbm9kZXMgaGF2ZSBiZWVuIHJlbW92ZWQKLSAgICAgICAgZmlyc3RVbnVzZWROb2RlID0gLTE7Ci0gICAgICAgIGxhc3ROb2RlID0gbmV3Tm9kZXM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgY29sbGVjdGlvbi4gUnVucyBpbiBPKDEpIGFtb3J0aXplZCB0aW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b0FkZCBvYmplY3QgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgYWRkKE9iamVjdCB0b0FkZCkgewotICAgIAlBc3NlcnQuaXNOb3ROdWxsKHRvQWRkKTsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgbm9kZQotICAgICAgICBpbnQgbmV3SWR4ID0gY3JlYXRlTm9kZSh0b0FkZCk7Ci0gICAgICAgIAotICAgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBub2RlIGludG8gdGhlIHJvb3QgdHJlZQotICAgICAgICBzZXRSb290Tm9kZShhZGRVbnNvcnRlZChyb290LCBuZXdJZHgpKTsKLSAgICAgICAgCi0gICAgICAgIHRlc3RJbnZhcmlhbnRzKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYWxsIGl0ZW1zIGZyb20gdGhlIGdpdmVuIGNvbGxlY3Rpb24gdG8gdGhpcyBjb2xsZWN0aW9uIAotICAgICAqIAotICAgICAqIEBwYXJhbSB0b0FkZCBvYmplY3RzIHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZEFsbChDb2xsZWN0aW9uIHRvQWRkKSB7Ci0gICAgCUFzc2VydC5pc05vdE51bGwodG9BZGQpOwotICAgICAgICBJdGVyYXRvciBpdGVyID0gdG9BZGQuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBhZGQoaXRlci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0ZXN0SW52YXJpYW50cygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGFsbCBpdGVtcyBmcm9tIHRoZSBnaXZlbiBhcnJheSB0byB0aGUgY29sbGVjdGlvbgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b0FkZCBvYmplY3RzIHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZEFsbChPYmplY3RbXSB0b0FkZCkgewotICAgIAlBc3NlcnQuaXNOb3ROdWxsKHRvQWRkKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b0FkZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHRvQWRkW2ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGQob2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGVzdEludmFyaWFudHMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eQotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIGNvbGxlY3Rpb24gY29udGFpbnMgbm8gZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IChyb290ID09IC0xKTsKLSAgICAgICAgCi0gICAgICAgIHRlc3RJbnZhcmlhbnRzKCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBvYmplY3QgZnJvbSB0aGUgY29sbGVjdGlvbi4gSGFzIG5vIGVmZmVjdCBpZgotICAgICAqIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoaXMgY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9SZW1vdmUgZWxlbWVudCB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmUoT2JqZWN0IHRvUmVtb3ZlKSB7Ci0gICAgICAgIGludGVybmFsUmVtb3ZlKHRvUmVtb3ZlKTsKLSAgICAgICAgCi0gICAgICAgIHBhY2soKTsKLSAgICAgICAgCi0gICAgICAgIHRlc3RJbnZhcmlhbnRzKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIHJlbW92ZS4gUmVtb3ZlcyB0aGUgZ2l2ZW4gZWxlbWVudCBidXQgZG9lcyBub3QKLSAgICAgKiBwYWNrIHRoZSBjb250YWluZXIgYWZ0ZXIgdGhlIHJlbW92YWwuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvUmVtb3ZlIGVsZW1lbnQgdG8gcmVtb3ZlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGludGVybmFsUmVtb3ZlKE9iamVjdCB0b1JlbW92ZSkgewotICAgICAgICBpbnQgb2JqZWN0SW5kZXggPSBnZXRPYmplY3RJbmRleCh0b1JlbW92ZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAob2JqZWN0SW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgIGludCBwYXJlbnQgPSBwYXJlbnRUcmVlW29iamVjdEluZGV4XTsKLSAgICAgICAgICAgIGxhenlSZW1vdmVOb2RlKG9iamVjdEluZGV4KTsKLSAgICAgICAgICAgIC8vRWRnZSBwYXJlbnRFZGdlID0gZ2V0RWRnZVRvKG9iamVjdEluZGV4KTsKLSAgICAgICAgICAgIC8vcGFyZW50RWRnZS5zZXRUYXJnZXQobGF6eVJlbW92ZU5vZGUob2JqZWN0SW5kZXgpKTsKLSAgICAgICAgICAgIHJlY29tcHV0ZUFuY2VzdG9yVHJlZVNpemVzKHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vdGVzdEludmFyaWFudHMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGFycmF5IGZyb20gdGhpcyBjb2xsZWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b1JlbW92ZSBlbGVtZW50cyB0byByZW1vdmUgCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQWxsKE9iamVjdFtdIHRvUmVtb3ZlKSB7Ci0gICAgCUFzc2VydC5pc05vdE51bGwodG9SZW1vdmUpOwotICAgIAkKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b1JlbW92ZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHRvUmVtb3ZlW2ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnRlcm5hbFJlbW92ZShvYmplY3QpOwotICAgICAgICB9Ci0gICAgCXBhY2soKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0YWlucyB0aGUgbiBzbWFsbGVzdCBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbiwgcmVtb3ZpbmcgdGhlIHJlc3QuIFdoZW4KLSAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zLCB0aGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbiB3aWxsIGJlIG4uIE5vdGUgdGhhdAotICAgICAqIHRoaXMgaXMgYSBuby1vcCBpZiBuID4gdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBUZW1wb3JhcmlseSBwYWNrYWdlIHZpc2liaWxpdHkgdW50aWwgdGhlIGltcGxlbWVudGF0aW9uIG9mIEZhc3RQcm9ncmVzc1JlcG9ydGVyCi0gICAgICogaXMgZmluaXNoZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG4gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldGFpbgotICAgICAqIEBwYXJhbSBtb24gcHJvZ3Jlc3MgbW9uaXRvcgotICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHByb2dyZXNzIG1vbml0b3IgaXMgY2FuY2VsbGVkIGluIGFub3RoZXIgdGhyZWFkCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBmaW5hbCB2b2lkIHJldGFpbkZpcnN0KGludCBuLCBGYXN0UHJvZ3Jlc3NSZXBvcnRlciBtb24pIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzeiA9IHNpemUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChuID49IHN6KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlbW92ZVJhbmdlKG4sIHN6IC0gbiwgbW9uKTsKLSAgICAgICAgCi0gICAgICAgIHRlc3RJbnZhcmlhbnRzKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldGFpbnMgdGhlIG4gc21hbGxlc3QgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24sIHJlbW92aW5nIHRoZSByZXN0LiBXaGVuCi0gICAgICogdGhpcyBtZXRob2QgcmV0dXJucywgdGhlIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24gd2lsbCBiZSBuLiBOb3RlIHRoYXQKLSAgICAgKiB0aGlzIGlzIGEgbm8tb3AgaWYgbiA+IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbGxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG4gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldGFpbgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJldGFpbkZpcnN0KGludCBuKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXRhaW5GaXJzdChuLCBuZXcgRmFzdFByb2dyZXNzUmVwb3J0ZXIoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGVzdEludmFyaWFudHMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIHJhbmdlIGZyb20gdGhpcyBjb2xsZWN0aW9uLgotICAgICAqIEZvciBleGFtcGxlLCByZW1vdmVSYW5nZSgxMCwgMykgd291bGQgcmVtb3ZlIHRoZSAxMXRoIHRocm91Z2ggMTN0aAotICAgICAqIHNtYWxsZXN0IGl0ZW1zIGZyb20gdGhlIGNvbGxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpcnN0IDAtYmFzZWQgaW5kZXggb2YgdGhlIHNtYWxsZXN0IGl0ZW0gdG8gcmVtb3ZlCi0gICAgICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IGZpcnN0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZW1vdmVSYW5nZShmaXJzdCwgbGVuZ3RoLCBuZXcgRmFzdFByb2dyZXNzUmVwb3J0ZXIoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGVzdEludmFyaWFudHMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIHJhbmdlIGZyb20gdGhpcyBjb2xsZWN0aW9uLgotICAgICAqIEZvciBleGFtcGxlLCByZW1vdmVSYW5nZSgxMCwgMykgd291bGQgcmVtb3ZlIHRoZSAxMXRoIHRocm91Z2ggMTN0aAotICAgICAqIHNtYWxsZXN0IGl0ZW1zIGZyb20gdGhlIGNvbGxlY3Rpb24uCi0gICAgICogCi0gICAgICogVGVtcG9yYXJpbHkgcGFja2FnZSB2aXNpYmxpdHkgdW50aWwgdGhlIGltcGxlbWVudGF0aW9uIG9mIEZhc3RQcm9ncmVzc1JlcG9ydGVyIGlzCi0gICAgICogZmluaXNoZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpcnN0IDAtYmFzZWQgaW5kZXggb2YgdGhlIHNtYWxsZXN0IGl0ZW0gdG8gcmVtb3ZlCi0gICAgICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlCi0gICAgICogQHBhcmFtIG1vbiBwcm9ncmVzcyBtb25pdG9yCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBpcyBjYW5jZWxsZWQgaW4gYW5vdGhlciB0aHJlYWQKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIGZpbmFsIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IGZpcnN0LCBpbnQgbGVuZ3RoLCBGYXN0UHJvZ3Jlc3NSZXBvcnRlciBtb24pIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgCXJlbW92ZVJhbmdlKHJvb3QsIGZpcnN0LCBsZW5ndGgsIG1vbik7Ci0gICAgCQotICAgIAlwYWNrKCk7Ci0gICAgCQotICAgIAl0ZXN0SW52YXJpYW50cygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IG5vZGUsIGludCByYW5nZVN0YXJ0LCBpbnQgcmFuZ2VMZW5ndGgsIEZhc3RQcm9ncmVzc1JlcG9ydGVyIG1vbikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAJaWYgKHJhbmdlTGVuZ3RoID09IDApIHsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAkKLSAgICAJaW50IHNpemUgPSBnZXRTdWJ0cmVlU2l6ZShub2RlKTsKLSAgICAJCi0gICAgCWlmIChzaXplIDw9IHJhbmdlU3RhcnQpIHsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAkKLSAgICAJLy8gSWYgd2UgY2FuIGNob3Agb2ZmIHRoaXMgZW50aXJlIHN1YnRyZWUgd2l0aG91dCBhbnkgc29ydGluZywgZG8gc28uCi0gICAgCWlmIChyYW5nZVN0YXJ0ID09IDAgJiYgcmFuZ2VMZW5ndGggPj0gc2l6ZSkgewotICAgIAkJcmVtb3ZlU3ViVHJlZShub2RlKTsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAl0cnkgewotCSAgICAJLy8gUGFydGl0aW9uIGFueSB1bnNvcnRlZCBub2RlcwotICAgIAkgICAgbm9kZSA9IHBhcnRpdGlvbihub2RlLCBtb24pOwotCSAgICAJCi0JICAgIAlpbnQgbGVmdCA9IGxlZnRTdWJUcmVlW25vZGVdOwotCSAgICAJaW50IGxlZnRTaXplID0gZ2V0U3VidHJlZVNpemUobGVmdCk7Ci0JICAgIAkKLQkgICAgCWludCB0b1JlbW92ZUZyb21MZWZ0ID0gTWF0aC5taW4obGVmdFNpemUgLSByYW5nZVN0YXJ0LCByYW5nZUxlbmd0aCk7Ci0JICAgIAkKLQkgICAgCS8vIElmIHdlJ3JlIHJlbW92aW5nIGFueXRoaW5nIGZyb20gdGhlIGxlZnQgbm9kZQotCSAgICAJaWYgKHRvUmVtb3ZlRnJvbUxlZnQgPj0gMCkgewotCSAgICAJCXJlbW92ZVJhbmdlKGxlZnRTdWJUcmVlW25vZGVdLCByYW5nZVN0YXJ0LCB0b1JlbW92ZUZyb21MZWZ0LCBtb24pOwotCSAgICAJCQotCSAgICAJCS8vIENoZWNrIGlmIHdlJ3JlIHJlbW92aW5nIGZyb20gYm90aCBzaWRlcwotCSAgICAJCWludCB0b1JlbW92ZUZyb21SaWdodCA9IHJhbmdlU3RhcnQgKyByYW5nZUxlbmd0aCAtIGxlZnRTaXplIC0gMTsKLQkgICAgCQkKLQkgICAgCQlpZiAodG9SZW1vdmVGcm9tUmlnaHQgPj0gMCkgewotCSAgICAJCQkvLyBSZW1vdmUgZnJvbSByaWdodCBzdWJ0cmVlCi0JICAgIAkJCXJlbW92ZVJhbmdlKHJpZ2h0U3ViVHJlZVtub2RlXSwgMCwgdG9SZW1vdmVGcm9tUmlnaHQsIG1vbik7Ci0JICAgIAkJCQotCSAgICAJCQkvLyAuLi4gcmVtb3ZpbmcgZnJvbSBib3RoIHNpZGVzIG1lYW5zIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBub2RlIGl0c2VsZiB0b28KLQkgICAgCQkJcmVtb3ZlTm9kZShub2RlKTsKLQkgICAgCQkJcmV0dXJuOwotCSAgICAJCX0KLQkgICAgCX0gZWxzZSB7Ci0JICAgIAkJLy8gSWYgcmVtb3ZpbmcgZnJvbSB0aGUgcmlnaHQgc2lkZSBvbmx5Ci0JICAgIAkJcmVtb3ZlUmFuZ2UocmlnaHRTdWJUcmVlW25vZGVdLCByYW5nZVN0YXJ0IC0gbGVmdFNpemUgLSAxLCByYW5nZUxlbmd0aCwgbW9uKTsKLQkgICAgCX0KLSAgICAJfSBmaW5hbGx5IHsKLSAgICAJICAgIHJlY29tcHV0ZVRyZWVTaXplKG5vZGUpOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBydW5lcyB0aGUgZ2l2ZW4gc3VidHJlZSAoYW5kIGFsbCBjaGlsZCBub2Rlcywgc29ydGVkIG9yIHVuc29ydGVkKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3ViVHJlZQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgcmVtb3ZlU3ViVHJlZShpbnQgc3ViVHJlZSkgewotICAgICAgICBpZiAoc3ViVHJlZSA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBEZXN0cm95IGFsbCB1bnNvcnRlZCBub2RlcwotICAgICAgICBmb3IgKGludCBuZXh0ID0gbmV4dFVuc29ydGVkW3N1YlRyZWVdOyBuZXh0ICE9IC0xOykgewotICAgICAgICAgICAgaW50IGN1cnJlbnQgPSBuZXh0OwotICAgICAgICAgICAgbmV4dCA9IG5leHRVbnNvcnRlZFtuZXh0XTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRGVzdHJveSB0aGlzIHVuc29ydGVkIG5vZGUKLSAgICAgICAgICAgIGRlc3Ryb3lOb2RlKGN1cnJlbnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBEZXN0cm95IGxlZnQgc3VidHJlZQotICAgICAgICByZW1vdmVTdWJUcmVlKGxlZnRTdWJUcmVlW3N1YlRyZWVdKTsKLSAgICAgICAgCi0gICAgICAgIC8vIERlc3Ryb3kgcmlnaHQgc3VidHJlZQotICAgICAgICByZW1vdmVTdWJUcmVlKHJpZ2h0U3ViVHJlZVtzdWJUcmVlXSk7Ci0gICAgICAgIAotICAgICAgICByZXBsYWNlTm9kZShzdWJUcmVlLCAtMSk7Ci0gICAgICAgIC8vIERlc3Ryb3kgcGl2b3Qgbm9kZQotICAgICAgICBkZXN0cm95Tm9kZShzdWJUcmVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2NoZWR1bGVzIHRoZSBub2RlIGZvciByZW1vdmFsLiBJZiB0aGUgbm9kZSBjYW4gYmUgcmVtb3ZlZCBpbiBjb25zdGFudCB0aW1lLAotICAgICAqIGl0IGlzIHJlbW92ZWQgaW1tZWRpYXRlbHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN1YlRyZWUKLSAgICAgKiBAcmV0dXJuIHRoZSByZXBsYWNlbWVudCBub2RlCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IGxhenlSZW1vdmVOb2RlKGludCBzdWJUcmVlKSB7Ci0gICAgICAgIGludCBsZWZ0ID0gbGVmdFN1YlRyZWVbc3ViVHJlZV07Ci0gICAgICAgIGludCByaWdodCA9IHJpZ2h0U3ViVHJlZVtzdWJUcmVlXTsKLQotICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGVhZiBub2RlLCByZW1vdmUgaXQgaW1tZWRpYXRlbHkKLSAgICAgICAgaWYgKGxlZnQgPT0gLTEgJiYgcmlnaHQgPT0gLTEpIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBuZXh0VW5zb3J0ZWRbc3ViVHJlZV07Ci0gICAgICAgICAgICByZXBsYWNlTm9kZShzdWJUcmVlLCByZXN1bHQpOwotICAgICAgICAgICAgZGVzdHJveU5vZGUoc3ViVHJlZSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBPdGhlcndpc2UsIGZsYWcgaXQgZm9yIGZ1dHVyZSByZW1vdmFsCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGNvbnRlbnRzW3N1YlRyZWVdOwotICAgICAgICBjb250ZW50c1tzdWJUcmVlXSA9IGxhenlSZW1vdmFsRmxhZzsKLSAgICAgICAgdHJlZVNpemVbc3ViVHJlZV0tLTsKLSAgICAgICAgaWYgKG9iamVjdEluZGljZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgb2JqZWN0SW5kaWNlcy5yZW1vdmUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3ViVHJlZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gc3VidHJlZSwgcmVwbGFjaW5nIGl0IHdpdGggb25lIG9mIGl0cyBjaGlsZHJlbi4KLSAgICAgKiBSZXR1cm5zIHRoZSBuZXcgcm9vdCBvZiB0aGUgc3VidHJlZQotICAgICAqIAotICAgICAqIEBwYXJhbSBzdWJUcmVlCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIG5ldyByb290Ci0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IHJlbW92ZU5vZGUoaW50IHN1YlRyZWUpIHsKLSAgICAgICAgaW50IGxlZnQgPSBsZWZ0U3ViVHJlZVtzdWJUcmVlXTsKLSAgICAgICAgaW50IHJpZ2h0ID0gcmlnaHRTdWJUcmVlW3N1YlRyZWVdOwotICAgICAgICAKLSAgICAgICAgaWYgKGxlZnQgPT0gLTEgfHwgcmlnaHQgPT0gLTEpIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSAtMTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGxlZnQgPT0gLTEgJiYgcmlnaHQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGVhZiBub2RlLCByZXBsYWNlIGl0IHdpdGggaXRzIGZpcnN0IHVuc29ydGVkIGNoaWxkCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV4dFVuc29ydGVkW3N1YlRyZWVdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBFaXRoZXIgdGhlIGxlZnQgb3IgcmlnaHQgY2hpbGQgaXMgbWlzc2luZyAtLSByZXBsYWNlIHdpdGggdGhlIHJlbWFpbmluZyBjaGlsZCAgCi0gICAgICAgICAgICAgICAgaWYgKGxlZnQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmlnaHQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVmdDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwYXJ0aXRpb24ocmVzdWx0LCBuZXcgRmFzdFByb2dyZXNzUmVwb3J0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXh0VW5zb3J0ZWRbc3ViVHJlZV07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkgICAgICAgICAgICAgICAgaW50IHVuc29ydGVkID0gbmV4dFVuc29ydGVkW3N1YlRyZWVdOwotCSAgICAgICAgICAgICAgICBuZXh0VW5zb3J0ZWRbcmVzdWx0XSA9IHVuc29ydGVkOwotCSAgICAgICAgICAgICAgICBpbnQgYWRkaXRpb25hbE5vZGVzID0gMDsKLQkgICAgICAgICAgICAgICAgaWYgKHVuc29ydGVkICE9IC0xKSB7Ci0JICAgICAgICAgICAgICAgICAgICBwYXJlbnRUcmVlW3Vuc29ydGVkXSA9IHJlc3VsdDsKLQkgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxOb2RlcyA9IHRyZWVTaXplW3Vuc29ydGVkXTsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICB0cmVlU2l6ZVtyZXN1bHRdICs9IGFkZGl0aW9uYWxOb2RlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJlcGxhY2VOb2RlKHN1YlRyZWUsIHJlc3VsdCk7Ci0gICAgICAgICAgICBkZXN0cm95Tm9kZShzdWJUcmVlKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gRmluZCB0aGUgZWRnZXMgdGhhdCBsZWFkIHRvIHRoZSBuZXh0LXNtYWxsZXN0IGFuZAotICAgICAgICAvLyBuZXh0LWxhcmdlc3Qgbm9kZXMKLSAgICAgICAgRWRnZSBuZXh0U21hbGxlc3QgPSBuZXcgRWRnZShzdWJUcmVlLCBESVJfTEVGVCk7Ci0gICAgICAgIHdoaWxlICghbmV4dFNtYWxsZXN0LmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICBuZXh0U21hbGxlc3QuYWR2YW5jZShESVJfUklHSFQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBFZGdlIG5leHRMYXJnZXN0ID0gbmV3IEVkZ2Uoc3ViVHJlZSwgRElSX1JJR0hUKTsKLSAgICAgICAgd2hpbGUgKCFuZXh0TGFyZ2VzdC5pc051bGwoKSkgewotICAgICAgICAgICAgbmV4dExhcmdlc3QuYWR2YW5jZShESVJfTEVGVCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEluZGV4IG9mIHRoZSByZXBsYWNlbWVudCBub2RlCi0gICAgICAgIGludCByZXBsYWNlbWVudE5vZGUgPSAtMTsKLSAgICAgICAgCi0gICAgICAgIC8vIENvdW50IG9mIG51bWJlciBvZiBub2RlcyBtb3ZlZCB0byB0aGUgcmlnaHQKLSAgICAgICAgCi0gICAgICAgIGludCBsZWZ0U2l6ZSA9IGdldFN1YnRyZWVTaXplKGxlZnQpOwotICAgICAgICBpbnQgcmlnaHRTaXplID0gZ2V0U3VidHJlZVNpemUocmlnaHQpOwotICAgICAgICAKLSAgICAgICAgLy8gU3dhcCB3aXRoIGEgY2hpbGQgZnJvbSB0aGUgbGFyZ2VyIHN1YnRyZWUKLSAgICAgICAgaWYgKGxlZnRTaXplID4gcmlnaHRTaXplKSB7Ci0gICAgICAgICAgICByZXBsYWNlbWVudE5vZGUgPSBuZXh0U21hbGxlc3QuZ2V0U3RhcnQoKTsKLQotICAgICAgICAgICAgLy8gTW92ZSBhbnkgdW5zb3J0ZWQgbm9kZXMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gdGhlIHJlcGxhY2VtZW50IG5vZGUgaW50bwotICAgICAgICAgICAgLy8gdGhlIGxlZnQgc3VidHJlZSBvZiB0aGUgbmV4dC1sYXJnZXN0IG5vZGUKLSAgICAgICAgICAgIEVkZ2UgdW5zb3J0ZWQgPSBuZXcgRWRnZShyZXBsYWNlbWVudE5vZGUsIERJUl9VTlNPUlRFRCk7Ci0gICAgICAgICAgICB3aGlsZSAoIXVuc29ydGVkLmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgaW50IHRhcmdldCA9IHVuc29ydGVkLmdldFRhcmdldCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICghaXNMZXNzKHRhcmdldCwgcmVwbGFjZW1lbnROb2RlKSkgewotICAgICAgICAgICAgICAgICAgICB1bnNvcnRlZC5zZXRUYXJnZXQobmV4dFVuc29ydGVkW3RhcmdldF0pOwotICAgICAgICAgICAgICAgICAgICBuZXh0TGFyZ2VzdC5zZXRUYXJnZXQoYWRkVW5zb3J0ZWQobmV4dExhcmdlc3QuZ2V0VGFyZ2V0KCksIHRhcmdldCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuc29ydGVkLmFkdmFuY2UoRElSX1VOU09SVEVEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvcmNlUmVjb21wdXRlVHJlZVNpemUodW5zb3J0ZWQuZ2V0U3RhcnQoKSwgcmVwbGFjZW1lbnROb2RlKTsKLSAgICAgICAgICAgIGZvcmNlUmVjb21wdXRlVHJlZVNpemUobmV4dExhcmdlc3QuZ2V0U3RhcnQoKSwgc3ViVHJlZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXBsYWNlbWVudE5vZGUgPSBuZXh0TGFyZ2VzdC5nZXRTdGFydCgpOwotCi0gICAgICAgICAgICAvLyBNb3ZlIGFueSB1bnNvcnRlZCBub2RlcyB0aGF0IGFyZSBzbWFsbGVyIHRoYW4gdGhlIHJlcGxhY2VtZW50IG5vZGUgaW50bwotICAgICAgICAgICAgLy8gdGhlIHJpZ2h0IHN1YnRyZWUgb2YgdGhlIG5leHQtc21hbGxlc3Qgbm9kZQotICAgICAgICAgICAgRWRnZSB1bnNvcnRlZCA9IG5ldyBFZGdlKHJlcGxhY2VtZW50Tm9kZSwgRElSX1VOU09SVEVEKTsKLSAgICAgICAgICAgIHdoaWxlICghdW5zb3J0ZWQuaXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0ID0gdW5zb3J0ZWQuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGlzTGVzcyh0YXJnZXQsIHJlcGxhY2VtZW50Tm9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdW5zb3J0ZWQuc2V0VGFyZ2V0KG5leHRVbnNvcnRlZFt0YXJnZXRdKTsKLSAgICAgICAgICAgICAgICAgICAgbmV4dFNtYWxsZXN0LnNldFRhcmdldChhZGRVbnNvcnRlZChuZXh0U21hbGxlc3QuZ2V0VGFyZ2V0KCksIHRhcmdldCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuc29ydGVkLmFkdmFuY2UoRElSX1VOU09SVEVEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvcmNlUmVjb21wdXRlVHJlZVNpemUodW5zb3J0ZWQuZ2V0U3RhcnQoKSwgcmVwbGFjZW1lbnROb2RlKTsKLSAgICAgICAgICAgIGZvcmNlUmVjb21wdXRlVHJlZVNpemUobmV4dFNtYWxsZXN0LmdldFN0YXJ0KCksIHN1YlRyZWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBOb3cgYWxsIHRoZSBhZmZlY3RlZCB0cmVlU2l6ZVsuLi5dIGVsZW1lbnRzIHNob3VsZCBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlCi0gICAgICAgIC8vIHVuc29ydGVkIG5vZGVzIHRoYXQgbW92ZWQuIFN3YXAgbm9kZXMuIAotICAgICAgICBPYmplY3QgcmVwbGFjZW1lbnRDb250ZW50ID0gY29udGVudHNbcmVwbGFjZW1lbnROb2RlXTsKLSAgICAgICAgY29udGVudHNbcmVwbGFjZW1lbnROb2RlXSA9IGNvbnRlbnRzW3N1YlRyZWVdOwotICAgICAgICBjb250ZW50c1tzdWJUcmVlXSA9IHJlcGxhY2VtZW50Q29udGVudDsKLSAgICAgICAgCi0gICAgICAgIGlmIChvYmplY3RJbmRpY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9iamVjdEluZGljZXMucHV0KHJlcGxhY2VtZW50Q29udGVudCwgc3ViVHJlZSk7Ci0gICAgICAgICAgICAvLyBOb3RlOiBjdXJyZW50bHkgd2UgZG9uJ3QgYm90aGVyIHVwZGF0aW5nIHRoZSBpbmRleCBvZiB0aGUgcmVwbGFjZW1lbnQKLSAgICAgICAgICAgIC8vIG5vZGUgc2luY2Ugd2UncmUgZ29pbmcgdG8gcmVtb3ZlIGl0IGltbWVkaWF0ZWx5IGFmdGVyd2FyZHMgYW5kIHRoZXJlJ3MKLSAgICAgICAgICAgIC8vIG5vIGdvb2QgcmVhc29uIHRvIHNlYXJjaCBmb3IgdGhlIGluZGV4IGluIGEgbWV0aG9kIHRoYXQgd2FzIGdpdmVuIHRoZQotICAgICAgICAgICAgLy8gaW5kZXggYXMgYSBwYXJhbWV0ZXIuLi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gb2JqZWN0SW5kaWNlcy5wdXQoY29udGVudHNbcmVwbGFjZW1lbnROb2RlXSwgcmVwbGFjZW1lbnROb2RlKQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgcmVwbGFjZW1lbnRQYXJlbnQgPSBwYXJlbnRUcmVlW3JlcGxhY2VtZW50Tm9kZV07IAotICAgICAgICAKLSAgICAgICAgcmVwbGFjZU5vZGUocmVwbGFjZW1lbnROb2RlLCByZW1vdmVOb2RlKHJlcGxhY2VtZW50Tm9kZSkpOwotICAgICAgICAvL0VkZ2UgcGFyZW50RWRnZSA9IGdldEVkZ2VUbyhyZXBsYWNlbWVudE5vZGUpOwotICAgICAgICAvL3BhcmVudEVkZ2Uuc2V0VGFyZ2V0KHJlbW92ZU5vZGUocmVwbGFjZW1lbnROb2RlKSk7Ci0KLSAgICAgICAgZm9yY2VSZWNvbXB1dGVUcmVlU2l6ZShyZXBsYWNlbWVudFBhcmVudCwgc3ViVHJlZSk7Ci0gICAgICAgIHJlY29tcHV0ZVRyZWVTaXplKHN1YlRyZWUpOwotICAgICAgICAKLSAgICAgICAgLy90ZXN0SW52YXJpYW50cygpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1YlRyZWU7Ci0gICAgfQotICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGUgY29sbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyKCkgewotICAgICAgICBsYXN0Tm9kZSA9IDA7Ci0gICAgICAgIHNldEFycmF5U2l6ZShNSU5fQ0FQQUNJVFkpOwotICAgICAgICByb290ID0gLTE7Ci0gICAgICAgIGZpcnN0VW51c2VkTm9kZSA9IC0xOwotICAgICAgICBvYmplY3RJbmRpY2VzID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRlc3RJbnZhcmlhbnRzKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbXBhcmF0b3IgdGhhdCBpcyBkZXRlcm1pbmluZyB0aGUgc29ydCBvcmRlciBmb3IgdGhpcyBjb2xsZWN0aW9uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb21wYXJhdG9yIGZvciB0aGlzIGNvbGxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcGFyYXRvciBnZXRDb21wYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gY29tcGFyYXRvcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmlsbHMgaW4gYW4gYXJyYXkgb2Ygc2l6ZSBuIHdpdGggdGhlIG4gc21hbGxlc3QgZWxlbWVudHMgZnJvbSB0aGUgY29sbGVjdGlvbi4KLSAgICAgKiBDYW4gY29tcHV0ZSB0aGUgcmVzdWx0IGluIHNvcnRlZCBvciB1bnNvcnRlZCBvcmRlci4gCi0gICAgICogCi0gICAgICogQ3VycmVudGx5IHBhY2thZ2UgdmlzaWJsZSB1bnRpbCB0aGUgaW1wbGVtZW50YXRpb24gb2YgRmFzdFByb2dyZXNzUmVwb3J0ZXIgaXMgZmluaXNoZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc3VsdCBhcnJheSB0byBiZSBmaWxsZWQKLSAgICAgKiBAcGFyYW0gc29ydGVkIGlmIHRydWUsIHRoZSByZXN1bHQgYXJyYXkgd2lsbCBiZSBzb3J0ZWQuIElmIGZhbHNlLCB0aGUgcmVzdWx0IGFycmF5Ci0gICAgICogbWF5IGJlIHVuc29ydGVkLiBUaGlzIGRvZXMgbm90IGFmZmVjdCB3aGljaCBlbGVtZW50cyBhcHBlYXIgaW4gdGhlIHJlc3VsdCwgb25seSB0aGVpciAKLSAgICAgKiBvcmRlci4KLSAgICAgKiBAcGFyYW0gbW9uIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MgYW5kIGNoZWNrIGZvciBjYW5jZWxsYXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW5zZXJ0ZWQgaW50byB0aGUgcmVzdWx0IGFycmF5LiBUaGlzIHdpbGwgYmUgZXF1YWwgdG8gdGhlIG1pbmltdW0KLSAgICAgKiBvZiByZXN1bHQubGVuZ3RoIGFuZCBjb250YWluZXIuc2l6ZSgpCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBpcyBjYW5jZWxsZWQKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIGZpbmFsIGludCBnZXRGaXJzdChPYmplY3RbXSByZXN1bHQsIGJvb2xlYW4gc29ydGVkLCBGYXN0UHJvZ3Jlc3NSZXBvcnRlciBtb24pIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXR1cm5WYWx1ZSA9IGdldFJhbmdlKHJlc3VsdCwgMCwgc29ydGVkLCBtb24pOwotICAgICAgICAKLSAgICAgICAgdGVzdEludmFyaWFudHMoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmlsbHMgaW4gYW4gYXJyYXkgb2Ygc2l6ZSBuIHdpdGggdGhlIG4gc21hbGxlc3QgZWxlbWVudHMgZnJvbSB0aGUgY29sbGVjdGlvbi4KLSAgICAgKiBDYW4gY29tcHV0ZSB0aGUgcmVzdWx0IGluIHNvcnRlZCBvciB1bnNvcnRlZCBvcmRlci4gCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc3VsdCBhcnJheSB0byBiZSBmaWxsZWQKLSAgICAgKiBAcGFyYW0gc29ydGVkIGlmIHRydWUsIHRoZSByZXN1bHQgYXJyYXkgd2lsbCBiZSBzb3J0ZWQuIElmIGZhbHNlLCB0aGUgcmVzdWx0IGFycmF5Ci0gICAgICogbWF5IGJlIHVuc29ydGVkLiBUaGlzIGRvZXMgbm90IGFmZmVjdCB3aGljaCBlbGVtZW50cyBhcHBlYXIgaW4gdGhlIHJlc3VsdC4gSXQgb25seQotICAgICAqIGFmZmVjdHMgdGhlaXIgb3JkZXIuIENvbXB1dGluZyBhbiB1bnNvcnRlZCByZXN1bHQgaXMgYXN5bXB0b3RpY2FsbHkgZmFzdGVyLgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbnNlcnRlZCBpbnRvIHRoZSByZXN1bHQgYXJyYXkuIFRoaXMgd2lsbCBiZSBlcXVhbCB0byB0aGUgbWluaW11bQotICAgICAqIG9mIHJlc3VsdC5sZW5ndGggYW5kIGNvbnRhaW5lci5zaXplKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEZpcnN0KE9iamVjdFtdIHJlc3VsdCwgYm9vbGVhbiBzb3J0ZWQpIHsKLSAgICAgICAgaW50IHJldHVyblZhbHVlID0gMDsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGdldEZpcnN0KHJlc3VsdCwgc29ydGVkLCBuZXcgRmFzdFByb2dyZXNzUmVwb3J0ZXIoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGVzdEludmFyaWFudHMoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBwb3NpdGlvbiBkZWZpbmVkIGJ5IGsgYW5kIGFuIGFycmF5IG9mIHNpemUgbiwgdGhpcyBmaWxscyBpbiB0aGUgYXJyYXkgd2l0aAotICAgICAqIHRoZSBrdGggc21hbGxlc3QgZWxlbWVudCB0aHJvdWdoIHRvIHRoZSAoaytuKXRoIHNtYWxsZXN0IGVsZW1lbnQuIEZvciBleGFtcGxlLCAKLSAgICAgKiBnZXRSYW5nZShteUFycmF5LCAxMCwgZmFsc2UpIHdvdWxkIGZpbGwgaW4gbXlBcnJheSBzdGFydGluZyB3aXRoIHRoZSAxMHRoIHNtYWxsZXN0IGl0ZW0KLSAgICAgKiBpbiB0aGUgY29sbGVjdGlvbi4gVGhlIHJlc3VsdCBjYW4gYmUgY29tcHV0ZWQgaW4gc29ydGVkIG9yIHVuc29ydGVkIG9yZGVyLiBDb21wdXRpbmcgdGhlCi0gICAgICogcmVzdWx0IGluIHVuc29ydGVkIG9yZGVyIGlzIG1vcmUgZWZmaWNpZW50LgotICAgICAqIDxwPgotICAgICAqIFRlbXBvcmFyaWx5IHNldCB0byBwYWNrYWdlIHZpc2liaWxpdHkgdW50aWwgdGhlIGltcGxlbWVudGF0aW9uIG9mIEZhc3RQcm9ncmVzc1JlcG9ydGVyCi0gICAgICogaXMgZmluaXNoZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXN1bHQgYXJyYXkgdG8gYmUgZmlsbGVkIGluCi0gICAgICogQHBhcmFtIHJhbmdlU3RhcnQgaW5kZXggb2YgdGhlIHNtYWxsZXN0IGVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSByZXN1bHQKLSAgICAgKiBAcGFyYW0gc29ydGVkIHRydWUgaWZmIHRoZSByZXN1bHQgYXJyYXkgc2hvdWxkIGJlIHNvcnRlZAotICAgICAqIEBwYXJhbSBtb24gcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIGNhbmNlbCB0aGUgb3BlcmF0aW9uCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB3YXMgY2FuY2VsbGVkIGluIGFub3RoZXIgdGhyZWFkCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBmaW5hbCBpbnQgZ2V0UmFuZ2UoT2JqZWN0W10gcmVzdWx0LCBpbnQgcmFuZ2VTdGFydCwgYm9vbGVhbiBzb3J0ZWQsIEZhc3RQcm9ncmVzc1JlcG9ydGVyIG1vbikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFJhbmdlKHJlc3VsdCwgMCwgcmFuZ2VTdGFydCwgcm9vdCwgc29ydGVkLCBtb24pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wdXRlcyB0aGUgbiB0aHJvdWdoIG4rayBpdGVtcyBpbiB0aGlzIGNvbGxlY3Rpb24uCi0gICAgICogQ29tcHV0aW5nIHRoZSByZXN1bHQgaW4gdW5zb3J0ZWQgb3JkZXIgaXMgbW9yZSBlZmZpY2llbnQuIFNvcnRpbmcgdGhlIHJlc3VsdCB3aWxsCi0gICAgICogbm90IGNoYW5nZSB3aGljaCBlbGVtZW50cyBhY3R1YWxseSBzaG93IHVwIGluIHRoZSByZXN1bHQuIFRoYXQgaXMsIGV2ZW4gaWYgdGhlIHJlc3VsdCBpcwotICAgICAqIHVuc29ydGVkLCBpdCB3aWxsIHN0aWxsIGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMgYXMgd291bGQgaGF2ZSBiZWVuIGF0IHRoYXQgcmFuZ2UgaW4KLSAgICAgKiBhIGZ1bGx5IHNvcnRlZCBjb2xsZWN0aW9uLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzdWx0IGFycmF5IGNvbnRhaW5pbmcgdGhlIHJlc3VsdAotICAgICAqIEBwYXJhbSByYW5nZVN0YXJ0IGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IHRvIGJlIGluc2VydGVkIGludG8gdGhlIHJlc3VsdCBhcnJheQotICAgICAqIEBwYXJhbSBzb3J0ZWQgdHJ1ZSBpZmYgdGhlIHJlc3VsdCB3aWxsIGJlIGNvbXB1dGVkIGluIHNvcnRlZCBvcmRlcgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBhY3R1YWxseSBpbnNlcnRlZCBpbnRvIHRoZSByZXN1bHQgYXJyYXkgKHdpbGwgYmUgdGhlIG1pbmltdW0KLSAgICAgKiBvZiByZXN1bHQubGVuZ3RoIGFuZCB0aGlzLnNpemUoKSkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFJhbmdlKE9iamVjdFtdIHJlc3VsdCwgaW50IHJhbmdlU3RhcnQsIGJvb2xlYW4gc29ydGVkKSB7Ci0gICAgICAgIGludCByZXR1cm5WYWx1ZSA9IDA7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBnZXRSYW5nZShyZXN1bHQsIHJhbmdlU3RhcnQsIHNvcnRlZCwgbmV3IEZhc3RQcm9ncmVzc1JlcG9ydGVyKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRlc3RJbnZhcmlhbnRzKCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGluZGV4LiBJbmRleGVzIGFyZSBiYXNlZCBvbiBzb3J0ZWQgb3JkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IGluZGV4IHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBpbmRleAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFJhbmdlKHJlc3VsdCwgaW5kZXgsIGZhbHNlLCBuZXcgRmFzdFByb2dyZXNzUmVwb3J0ZXIoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4KLSAgICAgICAgfQotICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSByZXN1bHRbMF07Ci0gICAgICAgIAotICAgICAgICB0ZXN0SW52YXJpYW50cygpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIGNvbGxlY3Rpb24gYXMgYSBzb3J0ZWQgb3IgdW5zb3J0ZWQKLSAgICAgKiBhcnJheS4gQ29tcHV0aW5nIGFuIHVuc29ydGVkIGFycmF5IGlzIG1vcmUgZWZmaWNpZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3J0ZWQgaWYgdHJ1ZSwgdGhlIHJlc3VsdCB3aWxsIGJlIGluIHNvcnRlZCBvcmRlci4gSWYgZmFsc2UsCi0gICAgICogdGhlIHJlc3VsdCBtYXkgYmUgaW4gdW5zb3J0ZWQgb3JkZXIuCi0gICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyBjb2xsZWN0aW9uIGFzIGFuIGFycmF5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXRJdGVtcyhib29sZWFuIHNvcnRlZCkgewotICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W3NpemUoKV07Ci0gICAgICAgIAotICAgICAgICBnZXRSYW5nZShyZXN1bHQsIDAsIHNvcnRlZCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIGludCBnZXRSYW5nZShPYmplY3RbXSByZXN1bHQsIGludCByZXN1bHRJZHgsIGludCByYW5nZVN0YXJ0LCBpbnQgbm9kZSwgYm9vbGVhbiBzb3J0ZWQsIEZhc3RQcm9ncmVzc1JlcG9ydGVyIG1vbikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5vZGUgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGF2YWlsYWJsZVNwYWNlID0gcmVzdWx0Lmxlbmd0aCAtIHJlc3VsdElkeDsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgYWxsIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUsIHNpbXBseSBjYWxsIGdldENoaWxkcmVuCi0gICAgICAgIGlmIChyYW5nZVN0YXJ0ID09IDApIHsKLSAgICAgICAgICAgIGlmICh0cmVlU2l6ZVtub2RlXSA8PSBhdmFpbGFibGVTcGFjZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihyZXN1bHQsIHJlc3VsdElkeCwgbm9kZSwgc29ydGVkLCBtb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBub2RlID0gcGFydGl0aW9uKG5vZGUsIG1vbik7Ci0gICAgICAgIGlmIChub2RlID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IGluc2VydGVkID0gMDsKLSAgICAgICAgCi0gICAgICAgIGludCBudW1iZXJMZXNzVGhhbk5vZGUgPSBnZXRTdWJ0cmVlU2l6ZShsZWZ0U3ViVHJlZVtub2RlXSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChyYW5nZVN0YXJ0IDwgbnVtYmVyTGVzc1RoYW5Ob2RlKSB7Ci0gICAgICAgICAgICBpZiAoaW5zZXJ0ZWQgPCBhdmFpbGFibGVTcGFjZSkgewotICAgICAgICAgICAgICAgIGluc2VydGVkICs9IGdldFJhbmdlKHJlc3VsdCwgcmVzdWx0SWR4LCByYW5nZVN0YXJ0LCBsZWZ0U3ViVHJlZVtub2RlXSwgc29ydGVkLCBtb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocmFuZ2VTdGFydCA8PSBudW1iZXJMZXNzVGhhbk5vZGUpIHsKLQkgICAgICAgIGlmIChpbnNlcnRlZCA8IGF2YWlsYWJsZVNwYWNlKSB7Ci0JICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdElkeCArIGluc2VydGVkXSA9IGNvbnRlbnRzW25vZGVdOwotCSAgICAgICAgICAgIGluc2VydGVkKys7Ci0JICAgICAgICB9CSAgICAgICAgCi0gICAgICAgIH0gCi0gICAgICAgIAotICAgICAgICBpZiAoaW5zZXJ0ZWQgPCBhdmFpbGFibGVTcGFjZSkgewotICAgICAgICAgICAgaW5zZXJ0ZWQgKz0gZ2V0UmFuZ2UocmVzdWx0LCByZXN1bHRJZHggKyBpbnNlcnRlZCwKLSAgICAgICAgICAgICAgICBNYXRoLm1heChyYW5nZVN0YXJ0IC0gbnVtYmVyTGVzc1RoYW5Ob2RlIC0gMSwgMCksIHJpZ2h0U3ViVHJlZVtub2RlXSwgc29ydGVkLCBtb24pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW5zZXJ0ZWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEZpbGxzIGluIHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIGdpdmVuIGFycmF5IHdpdGggYWxsIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBub2RlLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXN1bHQgCi0gICAgICogQHBhcmFtIHJlc3VsdElkeCBpbmRleCBpbiB0aGUgcmVzdWx0IGFycmF5IHdoZXJlIHdlIHdpbGwgYmVnaW4gZmlsbGluZyBpbiBjaGlsZHJlbgotICAgICAqIEBwYXJhbSBub2RlCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGFkZGVkIHRvIHRoZSBhcnJheQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGludCBnZXRDaGlsZHJlbihPYmplY3RbXSByZXN1bHQsIGludCByZXN1bHRJZHgsIGludCBub2RlLCBib29sZWFuIHNvcnRlZCwgRmFzdFByb2dyZXNzUmVwb3J0ZXIgbW9uKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBpZiAobm9kZSA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludCB0ZW1wSWR4ID0gcmVzdWx0SWR4OwotICAgICAgICAKLSAgICAgICAgaWYgKHNvcnRlZCkgewotICAgICAgICAgICAgbm9kZSA9IHBhcnRpdGlvbihub2RlLCBtb24pOwotICAgICAgICAgICAgaWYgKG5vZGUgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQWRkIGNoaWxkIG5vZGVzIHNtYWxsZXIgdGhhbiB0aGlzIG9uZQotICAgICAgICBpZiAodGVtcElkeCA8IHJlc3VsdC5sZW5ndGgpIHsKLSAgICAgICAgICAgIHRlbXBJZHggKz0gZ2V0Q2hpbGRyZW4ocmVzdWx0LCB0ZW1wSWR4LCBsZWZ0U3ViVHJlZVtub2RlXSwgc29ydGVkLCBtb24pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgdGhlIHBpdm90Ci0gICAgICAgIGlmICh0ZW1wSWR4IDwgcmVzdWx0Lmxlbmd0aCkgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY29udGVudHNbbm9kZV07Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbGF6eVJlbW92YWxGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W3RlbXBJZHgrK10gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQWRkIGNoaWxkIG5vZGVzIGxhcmdlciB0aGFuIHRoaXMgb25lCi0gICAgICAgIGlmICh0ZW1wSWR4IDwgcmVzdWx0Lmxlbmd0aCkgewotICAgICAgICAgICAgdGVtcElkeCArPSBnZXRDaGlsZHJlbihyZXN1bHQsIHRlbXBJZHgsIHJpZ2h0U3ViVHJlZVtub2RlXSwgc29ydGVkLCBtb24pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgdW5zb3J0ZWQgY2hpbGRyZW4gKHNob3VsZCBiZSBlbXB0eSBpZiB0aGUgc29ydGVkIGZsYWcgd2FzIHRydWUpCi0gICAgICAgIGZvciAoaW50IHVuc29ydGVkTm9kZSA9IG5leHRVbnNvcnRlZFtub2RlXTsgdW5zb3J0ZWROb2RlICE9IC0xICYmIHRlbXBJZHggPCByZXN1bHQubGVuZ3RoOyAKLSAgICAgICAgCXVuc29ydGVkTm9kZSA9IG5leHRVbnNvcnRlZFt1bnNvcnRlZE5vZGVdKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJlc3VsdFt0ZW1wSWR4KytdID0gY29udGVudHNbdW5zb3J0ZWROb2RlXTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRlbXBJZHggLSByZXN1bHRJZHg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmZiB0aGlzIGNvbGxlY3Rpb24gY29udGFpbnMgdGhlIGdpdmVuIGl0ZW0KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlbSBpdGVtIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoaXMgY29sbGVjdGlvbiBjb250YWlucyB0aGUgZ2l2ZW4gaXRlbQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBpdGVtKSB7Ci0gICAgCUFzc2VydC5pc05vdE51bGwoaXRlbSk7Ci0gICAgICAgIGJvb2xlYW4gcmV0dXJuVmFsdWUgPSAoZ2V0T2JqZWN0SW5kZXgoaXRlbSkgIT0gLTEpOwotICAgICAgICAKLSAgICAgICAgdGVzdEludmFyaWFudHMoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL2RlZmVycmVkL1NldE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL2RlZmVycmVkL1NldE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDRiNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvdmlld2Vycy9kZWZlcnJlZC9TZXRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLmRlZmVycmVkOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIFRyaXZpYWwgaW1wbGVtZW50YXRpb24gb2YgYW4gPGNvZGU+SUNvbmN1cnJlbnRNb2RlbDwvY29kZT4uIEltcGxlbWVudHMgCi0gKiBhbiB1bm9yZGVyZWQgc2V0IG9mIGVsZW1lbnRzIHRoYXQgZmlyZXMgb2ZmIGNoYW5nZSBub3RpZmljYXRpb25zIHdoZW5ldmVyCi0gKiBlbGVtZW50cyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBzZXQuIEFsbCBub3RpZmljYXRpb25zIGFyZSBzZW50Ci0gKiBzeW5jaHJvbm91c2x5LgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRNb2RlbCBleHRlbmRzIEFic3RyYWN0Q29uY3VycmVudE1vZGVsIHsKLSAgICAKLSAgICBwcml2YXRlIEhhc2hTZXQgZGF0YSA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgbW9kZWwuCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZWxlbWVudHMKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhLnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb250ZW50cyB0byB0aGUgZ2l2ZW4gYXJyYXkgb2YgZWxlbWVudHMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3Q29udGVudHMgbmV3IGNvbnRlbnRzIG9mIHRoaXMgc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0KE9iamVjdFtdIG5ld0NvbnRlbnRzKSB7Ci0gICAgCUFzc2VydC5pc05vdE51bGwobmV3Q29udGVudHMpOwotICAgIAlkYXRhLmNsZWFyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3Q29udGVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBuZXdDb250ZW50c1tpXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZGF0YS5hZGQob2JqZWN0KTsKLSAgICAgICAgfQotICAgIAkKLSAgICAJSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyW10gbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKCk7Ci0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uY3VycmVudE1vZGVsTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07Ci0JCQkKLQkJCWxpc3RlbmVyLnNldENvbnRlbnRzKG5ld0NvbnRlbnRzKTsKLQkJfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVtcHRpZXMgdGhlIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBPYmplY3RbXSByZW1vdmVkID0gZGF0YS50b0FycmF5KCk7Ci0gICAgICAgIGRhdGEuY2xlYXIoKTsKLSAgICAgICAgZmlyZVJlbW92ZShyZW1vdmVkKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gZWxlbWVudHMgdG8gdGhlIHNldAotICAgICAqIAotICAgICAqIEBwYXJhbSB0b0FkZCBlbGVtZW50cyB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBbGwoT2JqZWN0W10gdG9BZGQpIHsKLSAgICAJQXNzZXJ0LmlzTm90TnVsbCh0b0FkZCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9BZGQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSB0b0FkZFtpXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZGF0YS5hZGQob2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmlyZUFkZCh0b0FkZCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGVsZW1lbnRzIHRvIHRoZSBzZXQuIER1cGxpY2F0ZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9BZGQgZWxlbWVudHMgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQWxsKENvbGxlY3Rpb24gdG9BZGQpIHsKLSAgICAJQXNzZXJ0LmlzTm90TnVsbCh0b0FkZCk7Ci0gICAgICAgIGFkZEFsbCh0b0FkZC50b0FycmF5KCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGaXJlcyBhIGNoYW5nZSBub3RpZmljYXRpb24gZm9yIGFsbCBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhbmdlZCBhcnJheSBvZiBlbGVtZW50cyB0aGF0IGhhdmUgY2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoYW5nZUFsbChPYmplY3RbXSBjaGFuZ2VkKSB7Ci0gICAgCUFzc2VydC5pc05vdE51bGwoY2hhbmdlZCk7Ci0gICAgICAgIGZpcmVVcGRhdGUoY2hhbmdlZCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBnaXZlbiBlbGVtZW50cyBmcm9tIHRoZSBzZXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvUmVtb3ZlIGVsZW1lbnRzIHRvIHJlbW92ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbChPYmplY3RbXSB0b1JlbW92ZSkgewotICAgIAlBc3NlcnQuaXNOb3ROdWxsKHRvUmVtb3ZlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b1JlbW92ZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHRvUmVtb3ZlW2ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBkYXRhLnJlbW92ZShvYmplY3QpOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGZpcmVSZW1vdmUodG9SZW1vdmUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQuSUNvbmN1cnJlbnRNb2RlbCNyZXF1ZXN0VXBkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQuSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGUoSUNvbmN1cnJlbnRNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgCUFzc2VydC5pc05vdE51bGwobGlzdGVuZXIpOwotICAgICAgICBsaXN0ZW5lci5zZXRDb250ZW50cyhnZXRFbGVtZW50cygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS92aWV3ZXJzL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTU2NTEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3ZpZXdlcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciB2aWV3ZXJzLCB3aGljaCBhcmUgbW9kZWwtYmFzZWQKLWNvbnRlbnQgYWRhcHRlcnMgZm9yIFNXVCB3aWRnZXRzLgotPGgyPgotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLUEgdmlld2VyIGlzIGEgbW9kZWwtYmFzZWQgYWRhcHRlciBvbiBhbiBTV1Qgd2lkZ2V0LiZuYnNwOyBFYWNoIHZpZXdlciBoYXMKLWZvdXIgcGFydHM6Ci08YmxvY2txdW90ZT4KLTxsaT4KLWFuIDxiPmlucHV0PC9iPiAtIHRoZSBvYmplY3QgdGhhdCBzZXJ2ZXMgYXMgdGhlIHZpZXdlcidzIG1vZGVsPC9saT4KLQotPGxpPgotYSA8Yj53aWRnZXQ8L2I+IC0gdGhlIFNXVCBjb250cm9sIHRocm91Z2ggd2hpY2ggdGhlIHZpZXdlcidzIG1vZGVsIGlzIGRpc3BsYXllZDwvbGk+Ci0KLTxsaT4KLWEgPGI+Y29udGVudCBwcm92aWRlcjwvYj4gLSBtZWRpYXRlcyBiZXR3ZWVuIHRoZSBtb2RlbCBhbmQgdmlld2VyPC9saT4KLQotPGxpPgotYSA8Yj5sYWJlbCBwcm92aWRlcjwvYj4gLSBtYXBzIG1vZGVsIG9iamVjdHMgdG8gZGlzcGxheWFibGUgbGFiZWxzIGNvbnRhaW5pbmcKLXRleHQgYW5kL29yIGFuIGltYWdlPC9saT4KLTwvYmxvY2txdW90ZT4KLVRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgdmlld2VyIGZyYW1ld29yay4gVGhlIHZpZXdlciBmcmFtZXdvcmsgaXMgYW4KLWluZGVwZW5kZW50IEpGYWNlIG1vZHVsZS4gVXNpbmcgaXQgcmVxdWlyZXMgYSBrbm93bGVkZ2Ugb2YgU1dULCBidXQgZG9lcwotbm90IHJlcXVpcmUgZmFtaWxpYXJpdHkgd2l0aCBhbnkgb2YgdGhlIG90aGVyIEpGYWNlIG1vZHVsZXMuIFRoZSBmcmFtZXdvcmsKLWNvbnNpc3RzIG9mIGFic3RyYWN0IGJhc2UgY2xhc3NlcyBmb3Igdmlld2VycyAoPHR0PlZpZXdlcjwvdHQ+LCA8dHQ+U3RydWN0dXJlZFZpZXdlcjwvdHQ+LAotPHR0PkFic3RyYWN0VHJlZVZpZXdlcjwvdHQ+KSB0b2dldGhlciB3aXRoIGNvbmNyZXRlIHZpZXdlciBjbGFzc2VzICg8dHQ+TGlzdFZpZXdlcjwvdHQ+LAotPHR0PlRyZWVWaWV3ZXI8L3R0PiwKLTx0dD5UYWJsZVZpZXdlcjwvdHQ+LAotPHR0PlRhYmxlVHJlZVZpZXdlcjwvdHQ+LCA8dHQ+Q2hlY2tib3hUcmVlVmlld2VyPC90dD4sCi1hbmQgPHR0PkNoZWNrYm94VGFibGVWaWV3ZXI8L3R0PiksCi1hbmQgdmFyaW91cyBsZXNzZXIgc3VwcG9ydCBjbGFzc2VzLiBUaGUgY29uY3JldGUgc3RydWN0dXJlZCB2aWV3ZXIgY2xhc3NlcwotYXJlIHJlYWR5LXRvLXVzZSBhbmQgaGF2ZSBidWlsdC1pbiBzdXBwb3J0IGZvciBkcmFnLWFuZC1kcm9wLCBmaWx0ZXJpbmcKLSg8dHQ+SVZpZXdlckZpbHRlcjwvdHQ+IGFuZCA8dHQ+Vmlld2VyRmlsdGVyPC90dD4pLCBhbmQgc29ydGluZyAoPHR0PklWaWV3ZXJTb3J0ZXI8L3R0PgotYW5kIDx0dD5WaWV3ZXJTb3J0ZXI8L3R0Pik7IHRoZXNlIGNsYXNzZXMgbWF5IGFsc28gYmUgc3ViY2xhc3NlZCBmdXJ0aGVyCi1pZiByZXF1aXJlZC4KLTxwPkluIGdlbmVyYWwgdGVybXMsIGNyZWF0aW5nIGEgdmlld2VyIGludm9sdmVzIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci08dWw+Ci08bGk+Ci1pbnN0YW50aWF0aW5nIGEgdmlld2VyIG9uIHNvbWUgcHJlLWV4aXN0aW5nIFNXVCB3aWRnZXQsPC9saT4KLQotPGxpPgotc2V0dGluZyB0aGUgdmlld2VyJ3MgY29udGVudCBwcm92aWRlciAoYW4gb2JqZWN0IGltcGxlbWVudGluZyA8dHQ+SUNvbnRlbnRQcm92aWRlcjwvdHQ+KSw8L2xpPgotCi08bGk+Ci1zZXR0aW5nIHRoZSB2aWV3ZXIncyBsYWJlbCBwcm92aWRlciAoYW4gb2JqZWN0IGltcGxlbWVudGluZwotPHR0PklMYWJlbFByb3ZpZGVyPC90dD4pLDwvbGk+Ci0KLTxsaT4KLWFuZCwgZmluYWxseSwgc2V0dGluZyB0aGUgdmlld2VyJ3MgaW5wdXQuPC9saT4KLTwvdWw+Ci1PbmNlIGEgdmlld2VyJ3MgaW5wdXQgaXMgc2V0LCB0aGUgdmlld2VyIGJlY29tZXMgYWN0aXZlLiBBcyB0aGUgbW9kZWwgY2hhbmdlcywKLWl0IGlzIHRoZSBjb250ZW50IHByb3ZpZGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gcmVzcG9uZCB0byBjaGFuZ2VzIHRvIHRoZQotbW9kZWwgYnkgdGVsbGluZyB0aGUgdmlld2VyIHdoYXQgdG8gY2hhbmdlIChkb25lIGJ5IGNhbGxpbmcgYWRkIGFuZCByZW1vdmUKLW1ldGhvZHMgb24gdGhlIHZpZXdlcikuIEFuIGV4aXN0aW5nIHZpZXdlciBtYXkgYmUgcmV0YXJnZXRlZCBieSBnaXZpbmcKLWl0IGEgZGlmZmVyZW50IG9iamVjdCBhcyBpbnB1dDsgdGhlIHZpZXdlciBpcyByZXNwb25zaWJsZSBmb3IgaW5mb3JtaW5nCi10aGUgY29udGVudCBwcm92aWRlciBvZiB0aGVzZSBraW5kcyBvZiB3aG9sZXNhbGUgY2hhbmdlcyAoPHR0PklDb250ZW50UHJvdmlkZXIuaW5wdXRDaGFuZ2VkPC90dD4pLgotQWxzbywgZWFjaCB2aWV3ZXIgcmVnaXN0ZXJzIHdpdGggaXRzIGxhYmVsIHByb3ZpZGVyIGZvciBub3RpZmljYXRpb24gb2YKLWNoYW5nZXMgdGhhdCB3b3VsZCBhZmZlY3Qgd2hhdCB0aGUgdmlld2VyIGRpc3BsYXlzIChzZWUgPHR0PklMYWJlbFByb3ZpZGVyTGlzdGVuZXIuc3RhdGVDaGFuZ2VkPC90dD4pLgotPHA+Tm90ZTogTm9uZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgbWFpbnRhaW4gZ2xvYmFsIHN0YXRlLgotPGJyPiZuYnNwOwotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2luZG93L0FwcGxpY2F0aW9uV2luZG93LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aW5kb3cvQXBwbGljYXRpb25XaW5kb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhNDUyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aW5kb3cvQXBwbGljYXRpb25XaW5kb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3c7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLk1vZGFsQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRlY29yYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLQotLyoqCi0gKiBBbiBhcHBsaWNhdGlvbiB3aW5kb3cgaXMgYSBoaWdoLWxldmVsICJtYWluIHdpbmRvdyIsIHdpdGggYnVpbHQtaW4KLSAqIHN1cHBvcnQgZm9yIGFuIG9wdGlvbmFsIG1lbnUgYmFyIHdpdGggc3RhbmRhcmQgbWVudXMsIGFuIG9wdGlvbmFsIHRvb2xiYXIsCi0gKiBhbmQgYW4gb3B0aW9uYWwgc3RhdHVzIGxpbmUuCi0gKiA8cD4KLSAqIENyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIHdpbmRvdyBpbnZvbHZlcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICogPHVsPgotICogICA8bGk+Y3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+QXBwbGljYXRpb25XaW5kb3c8L2NvZGU+Ci0gKiAgIDwvbGk+Ci0gKiAgIDxsaT5hc3NpZ25pbmcgdGhlIHdpbmRvdyB0byBhIHdpbmRvdyBtYW5hZ2VyIChvcHRpb25hbCkKLSAqICAgPC9saT4KLSAqICAgPGxpPm9wZW5pbmcgdGhlIHdpbmRvdyBieSBjYWxsaW5nIDxjb2RlPm9wZW48L2NvZGU+Ci0gKiAgIDwvbGk+Ci0gKiA8L3VsPgotICogT25seSBvbiB0aGUgbGFzdCBzdGVwLCB3aGVuIHRoZSB3aW5kb3cgaXMgdG9sZCB0byBvcGVuLCBhcmUKLSAqIHRoZSB3aW5kb3cncyBzaGVsbCBhbmQgd2lkZ2V0IHRyZWUgY3JlYXRlZC4gV2hlbiB0aGUgd2luZG93IGlzCi0gKiBjbG9zZWQsIHRoZSBzaGVsbCBhbmQgd2lkZ2V0IHRyZWUgYXJlIGRpc3Bvc2VkIG9mIGFuZCBhcmUgbm8gbG9uZ2VyCi0gKiByZWZlcmVuY2VkLCBhbmQgdGhlIHdpbmRvdyBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSBpdHMgd2luZG93Ci0gKiBtYW5hZ2VyLiBMaWtlIGFsbCB3aW5kb3dzLCBhbiBhcHBsaWNhdGlvbiB3aW5kb3cgbWF5IGJlIHJlb3BlbmVkLgotICogPC9wPgotICogPHA+Ci0gKiBBbiBhcHBsaWNhdGlvbiB3aW5kb3cgaXMgYWxzbyBhIHN1aXRhYmxlIGNvbnRleHQgaW4gd2hpY2ggdG8gcGVyZm9ybSAKLSAqIGxvbmctcnVubmluZyBvcGVyYXRpb25zICh0aGF0IGlzLCBpdCBpbXBsZW1lbnRzIDxjb2RlPklSdW5uYWJsZUNvbnRleHQ8L2NvZGU+KS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uV2luZG93IGV4dGVuZHMgV2luZG93IGltcGxlbWVudHMgSVJ1bm5hYmxlQ29udGV4dCB7Ci0KLSAgICAvKioKLSAgICAgKiBNZW51IGJhciBtYW5hZ2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIChkZWZhdWx0KS4KLSAgICAgKgotICAgICAqIEBzZWUgI2FkZE1lbnVCYXIKLSAgICAgKi8KLSAgICBwcml2YXRlIE1lbnVNYW5hZ2VyIG1lbnVCYXJNYW5hZ2VyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRvb2wgYmFyIG1hbmFnZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgKGRlZmF1bHQpLgotICAgICAqCi0gICAgICogQHNlZSAjYWRkVG9vbEJhcgotICAgICAqLwotICAgIHByaXZhdGUgVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogU3RhdHVzIGxpbmUgbWFuYWdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSAoZGVmYXVsdCkuCi0gICAgICoKLSAgICAgKiBAc2VlICNhZGRTdGF0dXNMaW5lCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDb29sIGJhciBtYW5hZ2VyLCBvciA8Y29kZT5udWxsPC9udWxsPiBpZiBub25lIChkZWZhdWx0KS4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNhZGRDb29sQmFyCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHByaXZhdGUgQ29vbEJhck1hbmFnZXIgY29vbEJhck1hbmFnZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNlcGVyYXRvciBiZXR3ZWVuIHRoZSBtZW51IGJhciBhbmQgdGhlIHJlc3Qgb2YgdGhlIHdpbmRvdy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGFiZWwgc2VwZXJhdG9yMTsKLQotICAgIC8qKgotICAgICAqIEEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYW4gb3BlcmF0aW9uIGlzIHJ1bm5pbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG9wZXJhdGlvbkluUHJvZ3Jlc3MgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGFwcGxpY2F0aW9uIHdpbmRvdyBsYXlvdXQgY2xhc3MuCi0gICAgICogVGhpcyB2ZXJ0aWNhbCBsYXlvdXQgc3VwcG9ydHMgYSB0b29sIGJhciBhcmVhIChmaXhlZCBzaXplKSwKLSAgICAgKiBhIHNlcGFyYXRvciBsaW5lLCB0aGUgY29udGVudCBhcmVhICh2YXJpYWJsZSBzaXplKSwgYW5kIGEgCi0gICAgICogc3RhdHVzIGxpbmUgKGZpeGVkIHNpemUpLgotICAgICAqLwotICAgIC8qcGFja2FnZSovY2xhc3MgQXBwbGljYXRpb25XaW5kb3dMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVkdBUCA9IDI7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBCQVJfU0laRSA9IDIzOwotCi0gICAgICAgIHByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwKLSAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLSAgICAgICAgICAgIGlmICh3SGludCAhPSBTV1QuREVGQVVMVCAmJiBoSGludCAhPSBTV1QuREVGQVVMVCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KHdIaW50LCBoSGludCk7Ci0KLSAgICAgICAgICAgIFBvaW50IHJlc3VsdCA9IG5ldyBQb2ludCgwLCAwKTsKLSAgICAgICAgICAgIENvbnRyb2xbXSB3cyA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIENvbnRyb2wgdyA9IHdzW2ldOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBoaWRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFRvb2xCYXJDb250cm9sKCkgPT0gdykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXRvb2xCYXJDaGlsZHJlbkV4aXN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhpZGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnkgKz0gQkFSX1NJWkU7IC8vIFJFVklTSVQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q29vbEJhckNvbnRyb2woKSA9PSB3KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY29vbEJhckNoaWxkcmVuRXhpc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaGlkZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQueSArPSBCQVJfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3RhdHVzTGluZU1hbmFnZXIuZ2V0Q29udHJvbCgpID09IHcpIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPiAwKSB7IC8qIHdlIGFzc3VtZSB0aGlzIHdpbmRvdyBpcyBjb250ZW50cyAqLwotICAgICAgICAgICAgICAgICAgICBoaWRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFoaWRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBvaW50IGUgPSB3LmNvbXB1dGVTaXplKHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC54ID0gTWF0aC5tYXgocmVzdWx0LngsIGUueCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC55ICs9IGUueSArIFZHQVA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpCi0gICAgICAgICAgICAgICAgcmVzdWx0LnggPSB3SGludDsKLSAgICAgICAgICAgIGlmIChoSGludCAhPSBTV1QuREVGQVVMVCkKLSAgICAgICAgICAgICAgICByZXN1bHQueSA9IGhIaW50OwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLSAgICAgICAgICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQotICAgICAgICAgICAgQ29udHJvbFtdIHdzID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBDb250cm9sIHcgPSB3c1tpXTsKLQotICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsgLy8gU2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICAgIFBvaW50IGUgPSB3LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaENhY2hlKTsKLSAgICAgICAgICAgICAgICAgICAgdy5zZXRCb3VuZHMoY2xpZW50QXJlYS54LCBjbGllbnRBcmVhLnksIGNsaWVudEFyZWEud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS55KTsKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50QXJlYS55ICs9IGUueTsKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50QXJlYS5oZWlnaHQgLT0gZS55OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0VG9vbEJhckNvbnRyb2woKSA9PSB3KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b29sQmFyQ2hpbGRyZW5FeGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQb2ludCBlID0gdy5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ2FjaGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdy5zZXRCb3VuZHMoY2xpZW50QXJlYS54LCBjbGllbnRBcmVhLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEFyZWEud2lkdGgsIGUueSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRBcmVhLnkgKz0gZS55ICsgVkdBUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEFyZWEuaGVpZ2h0IC09IGUueSArIFZHQVA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdldENvb2xCYXJDb250cm9sKCkgPT0gdykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29vbEJhckNoaWxkcmVuRXhpc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgZSA9IHcuY29tcHV0ZVNpemUoY2xpZW50QXJlYS53aWR0aCwgU1dULkRFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ2FjaGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdy5zZXRCb3VuZHMoY2xpZW50QXJlYS54LCBjbGllbnRBcmVhLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEFyZWEud2lkdGgsIGUueSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRBcmVhLnkgKz0gZS55ICsgVkdBUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEFyZWEuaGVpZ2h0IC09IGUueSArIFZHQVA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHN0YXR1c0xpbmVNYW5hZ2VyLmdldENvbnRyb2woKSA9PSB3KSB7Ci0gICAgICAgICAgICAgICAgICAgIFBvaW50IGUgPSB3LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaENhY2hlKTsKLSAgICAgICAgICAgICAgICAgICAgdy5zZXRCb3VuZHMoY2xpZW50QXJlYS54LCBjbGllbnRBcmVhLnkgKyBjbGllbnRBcmVhLmhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZS55LCBjbGllbnRBcmVhLndpZHRoLCBlLnkpOwotICAgICAgICAgICAgICAgICAgICBjbGllbnRBcmVhLmhlaWdodCAtPSBlLnkgKyBWR0FQOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHcuc2V0Qm91bmRzKGNsaWVudEFyZWEueCwgY2xpZW50QXJlYS55ICsgVkdBUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRBcmVhLndpZHRoLCBjbGllbnRBcmVhLmhlaWdodCAtIFZHQVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdG9wIHNlcGVyYXRvci4KLSAgICAgKiBAcmV0dXJuIExhYmVsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExhYmVsIGdldFNlcGVyYXRvcjEoKSB7Ci0gICAgICAgIHJldHVybiBzZXBlcmF0b3IxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBhcHBsaWNhdGlvbiB3aW5kb3cgaW5zdGFuY2UsIHdob3NlIHNoZWxsIHdpbGwgYmUgY3JlYXRlZCB1bmRlciB0aGUKLSAgICAgKiBnaXZlbiBwYXJlbnQgc2hlbGwuCi0gICAgICogTm90ZSB0aGF0IHRoZSB3aW5kb3cgd2lsbCBoYXZlIG5vIHZpc3VhbCByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykKLSAgICAgKiB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uIEJ5IGRlZmF1bHQsIDxjb2RlPm9wZW48L2NvZGU+IGRvZXMgbm90IGJsb2NrLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBwYXJlbnQgc2hlbGwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNyZWF0ZSBhIHRvcC1sZXZlbCBzaGVsbAotICAgICAqLwotICAgIHB1YmxpYyBBcHBsaWNhdGlvbldpbmRvdyhTaGVsbCBwYXJlbnRTaGVsbCkgewotICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlcyB0aGlzIHdpbmRvdyB0byBoYXZlIGEgbWVudSBiYXIuCi0gICAgICogRG9lcyBub3RoaW5nIGlmIGl0IGFscmVhZHkgaGFzIG9uZS4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyB3aW5kb3cncyBzaGVsbCBpcyBjcmVhdGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZE1lbnVCYXIoKSB7Ci0gICAgICAgIGlmICgoZ2V0U2hlbGwoKSA9PSBudWxsKSAmJiAobWVudUJhck1hbmFnZXIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG1lbnVCYXJNYW5hZ2VyID0gY3JlYXRlTWVudU1hbmFnZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZXMgdGhpcyB3aW5kb3cgdG8gaGF2ZSBhIHN0YXR1cyBsaW5lLgotICAgICAqIERvZXMgbm90aGluZyBpZiBpdCBhbHJlYWR5IGhhcyBvbmUuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgd2luZG93J3Mgc2hlbGwgaXMgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdGF0dXNMaW5lKCkgewotICAgICAgICBpZiAoKGdldFNoZWxsKCkgPT0gbnVsbCkgJiYgKHN0YXR1c0xpbmVNYW5hZ2VyID09IG51bGwpKSB7Ci0gICAgICAgICAgICBzdGF0dXNMaW5lTWFuYWdlciA9IGNyZWF0ZVN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIHRoaXMgd2luZG93IHRvIGhhdmUgYSB0b29sIGJhci4KLSAgICAgKiBEb2VzIG5vdGhpbmcgaWYgaXQgYWxyZWFkeSBoYXMgb25lLgotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIHdpbmRvdydzIHNoZWxsIGlzIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVG9vbEJhcihpbnQgc3R5bGUpIHsKLSAgICAgICAgaWYgKChnZXRTaGVsbCgpID09IG51bGwpICYmICh0b29sQmFyTWFuYWdlciA9PSBudWxsKQotICAgICAgICAgICAgICAgICYmIChjb29sQmFyTWFuYWdlciA9PSBudWxsKSkgewotICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIgPSBjcmVhdGVUb29sQmFyTWFuYWdlcihzdHlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIHRoaXMgd2luZG93IHRvIGhhdmUgYSBjb29sIGJhci4KLSAgICAgKiBEb2VzIG5vdGhpbmcgaWYgaXQgYWxyZWFkeSBoYXMgb25lLgotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIHdpbmRvdydzIHNoZWxsIGlzIGNyZWF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBjb29sIGJhciBzdHlsZQotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDb29sQmFyKGludCBzdHlsZSkgewotICAgICAgICBpZiAoKGdldFNoZWxsKCkgPT0gbnVsbCkgJiYgKHRvb2xCYXJNYW5hZ2VyID09IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgKGNvb2xCYXJNYW5hZ2VyID09IG51bGwpKSB7Ci0gICAgICAgICAgICBjb29sQmFyTWFuYWdlciA9IGNyZWF0ZUNvb2xCYXJNYW5hZ2VyKHN0eWxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkhhbmRsZVNoZWxsQ2xvc2VFdmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNhbkhhbmRsZVNoZWxsQ2xvc2VFdmVudCgpICYmICFvcGVyYXRpb25JblByb2dyZXNzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotICAgICAgICBpZiAob3BlcmF0aW9uSW5Qcm9ncmVzcykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoc3VwZXIuY2xvc2UoKSkgewotICAgICAgICAgICAgaWYgKG1lbnVCYXJNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZW51QmFyTWFuYWdlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgbWVudUJhck1hbmFnZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRvb2xCYXJNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0b29sQmFyTWFuYWdlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaW5lTWFuYWdlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGluZU1hbmFnZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvb2xCYXJNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb29sQmFyTWFuYWdlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgY29vbEJhck1hbmFnZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dGVuZHMgdGhlIHN1cGVyIGltcGxlbWVudGF0aW9uIGJ5IGNyZWF0aW5nIHRoZSB0cmltIHdpZGdldHMgdXNpbmcgPGNvZGU+Y3JlYXRlVHJpbVdpZGdldHM8L2NvZGU+LiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCi0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQotICAgICAgICBjcmVhdGVUcmltV2lkZ2V0cyhzaGVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgdHJpbSB3aWRnZXRzIGFyb3VuZCB0aGUgY29udGVudCBhcmVhLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJpbVdpZGdldHMoU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgaWYgKG1lbnVCYXJNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lbnVCYXJNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsKLSAgICAgICAgICAgIHNoZWxsLnNldE1lbnVCYXIobWVudUJhck1hbmFnZXIuY3JlYXRlTWVudUJhcigoRGVjb3JhdGlvbnMpIHNoZWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2hvd1RvcFNlcGVyYXRvcigpKQotICAgICAgICAgICAgc2VwZXJhdG9yMSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQotICAgICAgICAvLyB3aWxsIGNyZWF0ZSBlaXRoZXIgYSBjb29sIGJhciBvciBhIHRvb2wgYmFyCi0gICAgICAgIGNyZWF0ZVRvb2xCYXJDb250cm9sKHNoZWxsKTsKLSAgICAgICAgY3JlYXRlQ29vbEJhckNvbnRyb2woc2hlbGwpOwotICAgICAgICBjcmVhdGVTdGF0dXNMaW5lKHNoZWxsKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2dldExheW91dCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExheW91dCBnZXRMYXlvdXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25XaW5kb3dMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gc2hvdyBhIHRvcCBzZXBhcmF0b3IgbGluZSBiZXR3ZWVuIHRoZSBtZW51IGJhcgotICAgICAqIGFuZCB0aGUgcmVzdCBvZiB0aGUgd2luZG93IGNvbnRlbnRzLiAgT24gc29tZSBwbGF0Zm9ybXMgc3VjaCBhcyB0aGUgTWFjLAotICAgICAqIHRoZSBtZW51IGlzIHNlcGFyYXRlZCBmcm9tIHRoZSBtYWluIHdpbmRvdyBhbHJlYWR5LCBzbyBhIHNlcGFyYXRvciBsaW5lCi0gICAgICogaXMgbm90IGRlc2lyZWQuIAotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc2hvdyB0aGUgdG9wIHNlcGFyYXRvciwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICB0byBub3Qgc2hvdyBpdAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93VG9wU2VwZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gISJjYXJib24iLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHN0YXR1cyBsaW5lIGlmIHJlcXVpcmVkLgotICAgICAqIEBwYXJhbSBzaGVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVN0YXR1c0xpbmUoU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXR1c0xpbmVNYW5hZ2VyLmNyZWF0ZUNvbnRyb2woc2hlbGwsIFNXVC5OT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgbWVudSBtYW5hZ2VyIGZvciB0aGUgd2luZG93LgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgbWVudSBtYW5hZ2VyLgotICAgICAqIDwvcD4KLSAgICAgKiBAcmV0dXJuIGEgbWVudSBtYW5hZ2VyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGNyZWF0ZU1lbnVNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBzdGF0dXMgbGluZSBtYW5hZ2VyIGZvciB0aGUgd2luZG93LgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgc3RhdHVzIGxpbmUgbWFuYWdlci4KLSAgICAgKiA8L3A+Ci0gICAgICogQHJldHVybiBhIHN0YXR1cyBsaW5lIG1hbmFnZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RhdHVzTGluZU1hbmFnZXIgY3JlYXRlU3RhdHVzTGluZU1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdHVzTGluZU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IHRvb2wgYmFyIG1hbmFnZXIgZm9yIHRoZSB3aW5kb3cuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHRoZSB0b29sIGJhciBtYW5hZ2VyLgotICAgICAqIDwvcD4KLSAgICAgKiBAcmV0dXJuIGEgdG9vbCBiYXIgbWFuYWdlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBUb29sQmFyTWFuYWdlciBjcmVhdGVUb29sQmFyTWFuYWdlcihpbnQgc3R5bGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUb29sQmFyTWFuYWdlcihzdHlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBjb29sIGJhciBtYW5hZ2VyIGZvciB0aGUgd2luZG93LgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgY29vbCBiYXIgbWFuYWdlci4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHJldHVybiBhIGNvb2wgYmFyIG1hbmFnZXIKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvb2xCYXJNYW5hZ2VyIGNyZWF0ZUNvb2xCYXJNYW5hZ2VyKGludCBzdHlsZSkgewotICAgICAgICByZXR1cm4gbmV3IENvb2xCYXJNYW5hZ2VyKHN0eWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250cm9sIGZvciB0aGUgdG9vbCBiYXIgbWFuYWdlci4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIHRvb2wgYmFyIG1hbmFnZXIuCi0gICAgICogPC9wPgotICAgICAqIEByZXR1cm4gYSBDb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlVG9vbEJhckNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpZiAodG9vbEJhck1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRvb2xCYXJNYW5hZ2VyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250cm9sIGZvciB0aGUgY29vbCBiYXIgbWFuYWdlci4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGNvb2wgYmFyIG1hbmFnZXIuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+Q29vbEJhcjwvY29kZT4KLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29vbEJhckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICBpZiAoY29vbEJhck1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGNvb2xCYXJNYW5hZ2VyLmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGZvbnQgdXNlZCBmb3IgdGhpcyB3aW5kb3cuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kCi0gICAgICogb2J0YWlucyB0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGUgZm9udCBmcm9tIHRoZQotICAgICAqIDxjb2RlPmdldFN5bWJvbGljRm9udE5hbWU8L2NvZGU+IGZyYW1ld29yayBtZXRob2QKLSAgICAgKiBhbmQgcmV0cmlldmVzIHRoaXMgZm9udCBmcm9tIEpGYWNlJ3MgZm9udAotICAgICAqIHJlZ2lzdHJ5IHVzaW5nIDxjb2RlPkpGYWNlUmVzb3VyY2VzLmdldEZvbnQ8L2NvZGU+LgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHVzZSBhIGRpZmZlcmVudCByZWdpc3RyeSwKLSAgICAgKiBldGMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBmb250LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZvbnQgZ2V0Rm9udCgpIHsKLSAgICAgICAgcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoZ2V0U3ltYm9saWNGb250TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZW51IGJhciBtYW5hZ2VyIGZvciB0aGlzIHdpbmRvdyAoaWYgaXQgaGFzIG9uZSkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBtZW51IGJhciBtYW5hZ2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqICAgdGhpcyB3aW5kb3cgZG9lcyBub3QgaGF2ZSBhIG1lbnUgYmFyCi0gICAgICogQHNlZSAjYWRkTWVudUJhcigpCi0gICAgICovCi0gICAgcHVibGljIE1lbnVNYW5hZ2VyIGdldE1lbnVCYXJNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gbWVudUJhck1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhdHVzIGxpbmUgbWFuYWdlciBmb3IgdGhpcyB3aW5kb3cgKGlmIGl0IGhhcyBvbmUpLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc3RhdHVzIGxpbmUgbWFuYWdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAgKiAgIHRoaXMgd2luZG93IGRvZXMgbm90IGhhdmUgYSBzdGF0dXMgbGluZQotICAgICAqIEBzZWUgI2FkZFN0YXR1c0xpbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RhdHVzTGluZU1hbmFnZXIgZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXNMaW5lTWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzeW1ib2xpYyBmb250IG5hbWUgb2YgdGhlIGZvbnQgdG8gYmUKLSAgICAgKiB1c2VkIHRvIGRpc3BsYXkgdGV4dCBpbiB0aGlzIHdpbmRvdy4KLSAgICAgKiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCBhbmQgaXMgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcwotICAgICAqIGNvbXBhdGFiaWxpdHkuCi0gICAgICogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBkZWZhdWx0IGZvbnQgcHJvdmlkZWQgYnkKLSAgICAgKiBTV1QgKHRoYXQgaXMsIGRvIG5vdCBzZXQgdGhlIGZvbnQpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN5bWJvbGljIGZvbnQgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ltYm9saWNGb250TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEpGYWNlUmVzb3VyY2VzLlRFWFRfRk9OVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0b29sIGJhciBtYW5hZ2VyIGZvciB0aGlzIHdpbmRvdyAoaWYgaXQgaGFzIG9uZSkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0b29sIGJhciBtYW5hZ2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqICAgdGhpcyB3aW5kb3cgZG9lcyBub3QgaGF2ZSBhIHRvb2wgYmFyCi0gICAgICogQHNlZSAjYWRkVG9vbEJhcihpbnQpCi0gICAgICovCi0gICAgcHVibGljIFRvb2xCYXJNYW5hZ2VyIGdldFRvb2xCYXJNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdG9vbEJhck1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29vbCBiYXIgbWFuYWdlciBmb3IgdGhpcyB3aW5kb3cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb29sIGJhciBtYW5hZ2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqICAgdGhpcyB3aW5kb3cgZG9lcyBub3QgaGF2ZSBhIGNvb2wgYmFyCi0gICAgICogQHNlZSAjYWRkQ29vbEJhcihpbnQpCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBDb29sQmFyTWFuYWdlciBnZXRDb29sQmFyTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIGNvb2xCYXJNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRyb2wgZm9yIHRoZSB3aW5kb3cncyB0b29sYmFyLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgdG9vbCBiYXIgbWFuYWdlci4KLSAgICAgKiA8L3A+Ci0gICAgICogQHJldHVybiBhIENvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBnZXRUb29sQmFyQ29udHJvbCgpIHsKLSAgICAgICAgaWYgKHRvb2xCYXJNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0b29sQmFyTWFuYWdlci5nZXRDb250cm9sKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udHJvbCBmb3IgdGhlIHdpbmRvdydzIGNvb2wgYmFyLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgY29vbCBiYXIgbWFuYWdlci4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5Db29sQmFyPC9jb2RlPgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBnZXRDb29sQmFyQ29udHJvbCgpIHsKLSAgICAgICAgaWYgKGNvb2xCYXJNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjb29sQmFyTWFuYWdlci5nZXRDb250cm9sKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBJUnVubmFibGVDb250ZXh0I3J1bihib29sZWFuLCBib29sZWFuLAotICAgICAqIElSdW5uYWJsZVdpdGhQcm9ncmVzcykgYmxvY2tzIHVudGlsIHRoZSBydW5uYWJsZSBoYXMgYmVlbiBydW4sCi0gICAgICogcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgPGNvZGU+Zm9yazwvY29kZT4uCi0gICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCA8Y29kZT5mb3JrPC9jb2RlPiBpcyBzZXQgdG8KLSAgICAgKiB0cnVlIGluIG1vc3QgY2FzZXMuIElmIDxjb2RlPmZvcms8L2NvZGU+IGlzIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sCi0gICAgICogdGhlIHJ1bm5hYmxlIHdpbGwgcnVuIGluIHRoZSBVSSB0aHJlYWQgYW5kIGl0IGlzIHRoZSBydW5uYWJsZSdzCi0gICAgICogcmVzcG9uc2liaWxpdHkgdG8gY2FsbCA8Y29kZT5EaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpPC9jb2RlPgotICAgICAqIHRvIGVuc3VyZSBVSSByZXNwb25zaXZlbmVzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oZmluYWwgYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsCi0gICAgICAgICAgICBmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpCi0gICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3BlcmF0aW9uSW5Qcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgICAgICBmaW5hbCBTdGF0dXNMaW5lTWFuYWdlciBtZ3IgPSBnZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotICAgICAgICAgICAgaWYgKG1nciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcnVubmFibGUucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2xlYW4gY2FuY2VsV2FzRW5hYmxlZCA9IG1nci5pc0NhbmNlbEVuYWJsZWQoKTsKLQotICAgICAgICAgICAgZmluYWwgQ29udHJvbCBjb250ZW50cyA9IGdldENvbnRlbnRzKCk7Ci0gICAgICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBjb250ZW50cy5nZXREaXNwbGF5KCk7Ci0gICAgICAgICAgICBTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0gICAgICAgICAgICBib29sZWFuIGNvbnRlbnRzV2FzRW5hYmxlZCA9IGNvbnRlbnRzLmdldEVuYWJsZWQoKTsKLSAgICAgICAgICAgIE1lbnVNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNZW51QmFyTWFuYWdlcigpOwotICAgICAgICAgICAgTWVudSBtZW51QmFyID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZW51QmFyID0gbWFuYWdlci5nZXRNZW51KCk7Ci0gICAgICAgICAgICAgICAgbWFuYWdlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sZWFuIG1lbnVCYXJXYXNFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobWVudUJhciAhPSBudWxsKQotICAgICAgICAgICAgICAgIG1lbnVCYXJXYXNFbmFibGVkID0gbWVudUJhci5pc0VuYWJsZWQoKTsKLQotICAgICAgICAgICAgQ29udHJvbCB0b29sYmFyQ29udHJvbCA9IGdldFRvb2xCYXJDb250cm9sKCk7Ci0gICAgICAgICAgICBib29sZWFuIHRvb2xiYXJXYXNFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAodG9vbGJhckNvbnRyb2wgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0b29sYmFyV2FzRW5hYmxlZCA9IHRvb2xiYXJDb250cm9sLmdldEVuYWJsZWQoKTsKLQotICAgICAgICAgICAgQ29udHJvbCBjb29sYmFyQ29udHJvbCA9IGdldENvb2xCYXJDb250cm9sKCk7Ci0gICAgICAgICAgICBib29sZWFuIGNvb2xiYXJXYXNFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoY29vbGJhckNvbnRyb2wgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb29sYmFyV2FzRW5hYmxlZCA9IGNvb2xiYXJDb250cm9sLmdldEVuYWJsZWQoKTsKLQotICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgcmVzdCBvZiB0aGUgc2hlbGxzIG9uIHRoZSBjdXJyZW50IGRpc3BsYXkKLSAgICAgICAgICAgIFNoZWxsW10gc2hlbGxzID0gZGlzcGxheS5nZXRTaGVsbHMoKTsKLSAgICAgICAgICAgIGJvb2xlYW5bXSBlbmFibGVkID0gbmV3IGJvb2xlYW5bc2hlbGxzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNoZWxscy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFNoZWxsIGN1cnJlbnQgPSBzaGVsbHNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gc2hlbGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgIWN1cnJlbnQuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZWRbaV0gPSBjdXJyZW50LmdldEVuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbnRyb2wgY3VycmVudEZvY3VzID0gZGlzcGxheS5nZXRGb2N1c0NvbnRyb2woKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29udGVudHMuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbnVCYXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgbWVudUJhci5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAodG9vbGJhckNvbnRyb2wgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdG9vbGJhckNvbnRyb2wuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvb2xiYXJDb250cm9sICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvb2xiYXJDb250cm9sLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIG1nci5zZXRDYW5jZWxFbmFibGVkKGNhbmNlbGFibGUpOwotICAgICAgICAgICAgICAgIGZpbmFsIEV4Y2VwdGlvbltdIGhvbGRlciA9IG5ldyBFeGNlcHRpb25bMV07Ci0gICAgICAgICAgICAgICAgQnVzeUluZGljYXRvci5zaG93V2hpbGUoZGlzcGxheSwgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGFsQ29udGV4dC5ydW4ocnVubmFibGUsIGZvcmssIG1ncgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2dyZXNzTW9uaXRvcigpLCBkaXNwbGF5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGVyWzBdID0gaXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXJbMF0gPSBpZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICAgICAgaWYgKGhvbGRlclswXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXJbMF0gaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgaG9sZGVyWzBdOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhvbGRlclswXSBpbnN0YW5jZW9mIEludGVycnVwdGVkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSW50ZXJydXB0ZWRFeGNlcHRpb24pIGhvbGRlclswXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uSW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIC8vIEVuYWJsZSB0aGUgcmVzdCBvZiB0aGUgc2hlbGxzIG9uIHRoZSBjdXJyZW50IGRpc3BsYXkKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNoZWxscy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTaGVsbCBjdXJyZW50ID0gc2hlbGxzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PSBzaGVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsICYmICFjdXJyZW50LmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5zZXRFbmFibGVkKGVuYWJsZWRbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghY29udGVudHMuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgICAgICAgICBjb250ZW50cy5zZXRFbmFibGVkKGNvbnRlbnRzV2FzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbnVCYXIgIT0gbnVsbCAmJiAhbWVudUJhci5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICAgICAgICAgIG1lbnVCYXIuc2V0RW5hYmxlZChtZW51QmFyV2FzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRvb2xiYXJDb250cm9sICE9IG51bGwgJiYgIXRvb2xiYXJDb250cm9sLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgdG9vbGJhckNvbnRyb2wuc2V0RW5hYmxlZCh0b29sYmFyV2FzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvb2xiYXJDb250cm9sICE9IG51bGwgJiYgIWNvb2xiYXJDb250cm9sLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgY29vbGJhckNvbnRyb2wuc2V0RW5hYmxlZChjb29sYmFyV2FzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgbWdyLnNldENhbmNlbEVuYWJsZWQoY2FuY2VsV2FzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGb2N1cyAhPSBudWxsICYmICFjdXJyZW50Rm9jdXMuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEl0J3MgbmVjZXNzYXJ5IHRvIHJlc3RvcmUgZm9jdXMgYWZ0ZXIgcmVlbmFibGluZyB0aGUgY29udHJvbHMKLSAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBkaXNhYmxpbmcgdGhlbSBjYXVzZXMgZm9jdXMgdG8ganVtcCBlbHNld2hlcmUuCi0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBmb3JjZUZvY3VzIHJhdGhlciB0aGFuIHNldEZvY3VzIHRvIGF2b2lkIFNXVCdzCi0gICAgICAgICAgICAgICAgICAgIC8vIHNlYXJjaCBmb3IgY2hpbGRyZW4gd2hpY2ggY2FuIHRha2UgZm9jdXMsIHNvIGZvY3VzCi0gICAgICAgICAgICAgICAgICAgIC8vIGVuZHMgdXAgYmFjayBvbiB0aGUgYWN0dWFsIGNvbnRyb2wgdGhhdCBwcmV2aW91c2x5IGhhZCBpdC4KLSAgICAgICAgICAgICAgICAgICAgY3VycmVudEZvY3VzLmZvcmNlRm9jdXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBvcGVyYXRpb25JblByb2dyZXNzID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWVzc2FnZSBkaXNwbGF5ZWQgaW4gdGhpcyB3aW5kb3cncyBzdGF0dXMKLSAgICAgKiBsaW5lIChpZiBpdCBoYXMgb25lKS4gVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiB0aGUKLSAgICAgKiB3aW5kb3cgZG9lcyBub3QgaGF2ZSBhIHN0YXR1cyBsaW5lLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIHN0YXR1cyBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciBpdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBvciBub3QgY2hpbGRyZW4gZXhpc3QgZm9yIHRoZSBBcHBsaWNhdGlvbiBXaW5kb3cncwotICAgICAqIHRvb2xiYXIgY29udHJvbC4KLSAgICAgKiA8cD4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjaGlsZHJlbiBleGlzdCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdG9vbEJhckNoaWxkcmVuRXhpc3QoKSB7Ci0gICAgICAgIENvbnRyb2wgdG9vbENvbnRyb2wgPSBnZXRUb29sQmFyQ29udHJvbCgpOwotICAgICAgICBpZiAodG9vbENvbnRyb2wgaW5zdGFuY2VvZiBUb29sQmFyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChUb29sQmFyKSB0b29sQ29udHJvbCkuZ2V0SXRlbUNvdW50KCkgPiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGNoaWxkcmVuIGV4aXN0IGZvciB0aGlzIGFwcGxpY2F0aW9uIHdpbmRvdydzCi0gICAgICogY29vbCBiYXIgY29udHJvbC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjaGlsZHJlbiBleGlzdCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGNvb2xCYXJDaGlsZHJlbkV4aXN0KCkgewotICAgICAgICBDb250cm9sIGNvb2xDb250cm9sID0gZ2V0Q29vbEJhckNvbnRyb2woKTsKLSAgICAgICAgaWYgKGNvb2xDb250cm9sIGluc3RhbmNlb2YgQ29vbEJhcikgewotICAgICAgICAgICAgcmV0dXJuICgoQ29vbEJhcikgY29vbENvbnRyb2wpLmdldEl0ZW1Db3VudCgpID4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aW5kb3cvSVNoZWxsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpbmRvdy9JU2hlbGxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2ViOWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpbmRvdy9JU2hlbGxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGNhbiByZXR1cm4gYSBzaGVsbC4gVGhpcyBpcyBub3JtYWxseSB1c2VkIGZvciAKLSAqIG9wZW5pbmcgY2hpbGQgd2luZG93cy4gQW4gb2JqZWN0IHRoYXQgd2FudHMgdG8gb3BlbiBjaGlsZCBzaGVsbHMgY2FuIHRha2UgCi0gKiBhbiBJU2hlbGxQcm92aWRlciBpbiBpdHMgY29uc3RydWN0b3IsIGFuZCB0aGUgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBJU2hlbGxQcm92aWRlcgotICogY2FuIGR5bmFtaWNhbGx5IGNob29zZSB3aGVyZSBjaGlsZCBzaGVsbHMgc2hvdWxkIGJlIG9wZW5lZC4gIAotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNoZWxsUHJvdmlkZXIgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2hlbGwgKG9yIG51bGwgaWYgbm9uZSkuIFRoaXMgcmV0dXJuIHZhbHVlIG1heQotICAgICAqIGNoYW5nZSBvdmVyIHRpbWUsIGFuZCBzaG91bGQgbm90IGJlIGNhY2hlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHNoZWxsIG9yIG51bGwgaWYgbm9uZQotICAgICAqLwotICAgIFNoZWxsIGdldFNoZWxsKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aW5kb3cvU2FtZVNoZWxsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpbmRvdy9TYW1lU2hlbGxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWQwZThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpbmRvdy9TYW1lU2hlbGxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogU3RhbmRhcmQgc2hlbGwgcHJvdmlkZXIgdGhhdCBhbHdheXMgcmV0dXJucyB0aGUgc2hlbGwgY29udGFpbmluZyB0aGUgZ2l2ZW4KLSAqIGNvbnRyb2wuIFRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjb3JyZWN0IHNoZWxsIGZvciB0aGUgY29udHJvbCwgZXZlbiBpZgotICogdGhlIGNvbnRyb2wgaXMgcmVwYXJlbnRlZC4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgU2FtZVNoZWxsUHJvdmlkZXIgaW1wbGVtZW50cyBJU2hlbGxQcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIENvbnRyb2wgdGFyZ2V0Q29udHJvbDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2hlbGwgcHJvdmlkZXIgdGhhdCBhbHdheXMgcmV0dXJucyB0aGUgY3VycmVudAotICAgICAqIHNoZWxsIGZvciB0aGUgZ2l2ZW4gY29udHJvbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFyZ2V0Q29udHJvbCBjb250cm9sIHdob3NlIHNoZWxsIHdpbGwgYmUgdHJhY2tlZCwgb3IgbnVsbCBpZiBnZXRTaGVsbCgpIHNob3VsZCBhbHdheXMKLSAgICAgKiByZXR1cm4gbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBTYW1lU2hlbGxQcm92aWRlcihDb250cm9sIHRhcmdldENvbnRyb2wpIHsKLSAgICAgICAgdGhpcy50YXJnZXRDb250cm9sID0gdGFyZ2V0Q29udHJvbDsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1qYXZhZG9jKQotICAgICAqIEBzZWUgSVNoZWxsUHJvdmlkZXIjZ2V0U2hlbGwoKQotICAgICAqLwotICAgIHB1YmxpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgaWYgKHRhcmdldENvbnRyb2wgaW5zdGFuY2VvZiBTaGVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChTaGVsbCl0YXJnZXRDb250cm9sOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdGFyZ2V0Q29udHJvbCA9PSBudWxsPyBudWxsIDp0YXJnZXRDb250cm9sLmdldFNoZWxsKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aW5kb3cvV2luZG93LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aW5kb3cvV2luZG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOGI0OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2luZG93L1dpbmRvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uud2luZG93OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuR2VvbWV0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIEpGYWNlIHdpbmRvdyBpcyBhbiBvYmplY3QgdGhhdCBoYXMgbm8gdmlzdWFsIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKQotICogdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICogPHA+Ci0gKiBDcmVhdGluZyBhIHdpbmRvdyBpbnZvbHZlcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICogPHVsPgotICogPGxpPmNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIGEgY29uY3JldGUgc3ViY2xhc3Mgb2YgPGNvZGU+V2luZG93PC9jb2RlPgotICogPC9saT4KLSAqIDxsaT5jcmVhdGluZyB0aGUgd2luZG93J3Mgc2hlbGwgYW5kIHdpZGdldCB0cmVlIGJ5IGNhbGxpbmcKLSAqIDxjb2RlPmNyZWF0ZTwvY29kZT4gKG9wdGlvbmFsKTwvbGk+Ci0gKiA8bGk+YXNzaWduaW5nIHRoZSB3aW5kb3cgdG8gYSB3aW5kb3cgbWFuYWdlciB1c2luZwotICogPGNvZGU+V2luZG93TWFuYWdlci5hZGQ8L2NvZGU+IChvcHRpb25hbCk8L2xpPgotICogPGxpPm9wZW5pbmcgdGhlIHdpbmRvdyBieSBjYWxsaW5nIDxjb2RlPm9wZW48L2NvZGU+PC9saT4KLSAqIDwvdWw+Ci0gKiBPcGVuaW5nIHRoZSB3aW5kb3cgd2lsbCBjcmVhdGUgaXRzIHNoZWxsIGFuZCB3aWRnZXQgdHJlZSBpZiB0aGV5IGhhdmUgbm90Ci0gKiBhbHJlYWR5IGJlZW4gY3JlYXRlZC4gV2hlbiB0aGUgd2luZG93IGlzIGNsb3NlZCwgdGhlIHNoZWxsIGFuZCB3aWRnZXQgdHJlZQotICogYXJlIGRpc3Bvc2VkIG9mIGFuZCBhcmUgbm8gbG9uZ2VyIHJlZmVyZW5jZWQsIGFuZCB0aGUgd2luZG93IGlzIGF1dG9tYXRpY2FsbHkKLSAqIHJlbW92ZWQgZnJvbSBpdHMgd2luZG93IG1hbmFnZXIuIEEgd2luZG93IG1heSBiZSByZW9wZW5lZC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIEpGYWNlIHdpbmRvdyBmcmFtZXdvcmsgKHRoaXMgcGFja2FnZSkgY29uc2lzdHMgb2YgdGhpcyBjbGFzcywKLSAqIDxjb2RlPldpbmRvdzwvY29kZT4sIHRoZSBhYnN0cmFjdCBiYXNlIG9mIGFsbCB3aW5kb3dzLCBhbmQgb25lIGNvbmNyZXRlCi0gKiB3aW5kb3cgY2xhc3NlcyAoPGNvZGU+QXBwbGljYXRpb25XaW5kb3c8L2NvZGU+KSB3aGljaCBtYXkgYWxzbyBiZQotICogc3ViY2xhc3NlZC4gQ2xpZW50cyBtYXkgZGVmaW5lIGFkZGl0aW9uYWwgd2luZG93IHN1YmNsYXNzZXMgYXMgcmVxdWlyZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSA8Y29kZT5XaW5kb3c8L2NvZGU+IGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgdGhhdCBzdWJjbGFzc2VzIG1heSAKLSAqIG92ZXJyaWRlIHRvIGNvbmZpZ3VyZSB0aGUgd2luZG93LCBpbmNsdWRpbmc6Ci0gKiA8dWw+Ci0gKiA8bGk+PGNvZGU+Y2xvc2U8L2NvZGU+LSBleHRlbmQgdG8gZnJlZSBvdGhlciBTV1QgcmVzb3VyY2VzPC9saT4KLSAqIDxsaT48Y29kZT5jb25maWd1cmVTaGVsbDwvY29kZT4tIGV4dGVuZCBvciByZWltcGxlbWVudCB0byBzZXQgc2hlbGwKLSAqIHByb3BlcnRpZXMgYmVmb3JlIHdpbmRvdyBvcGVuczwvbGk+Ci0gKiA8bGk+PGNvZGU+Y3JlYXRlQ29udGVudHM8L2NvZGU+LSBleHRlbmQgb3IgcmVpbXBsZW1lbnQgdG8gY3JlYXRlIGNvbnRyb2xzCi0gKiBiZWZvcmUgd2luZG93IG9wZW5zPC9saT4KLSAqIDxsaT48Y29kZT5nZXRJbml0aWFsU2l6ZTwvY29kZT4tIHJlaW1wbGVtZW50IHRvIGdpdmUgdGhlIGluaXRpYWwgc2l6ZSBmb3IKLSAqIHRoZSBzaGVsbDwvbGk+Ci0gKiA8bGk+PGNvZGU+Z2V0SW5pdGlhbExvY2F0aW9uPC9jb2RlPi0gcmVpbXBsZW1lbnQgdG8gZ2l2ZSB0aGUgaW5pdGlhbAotICogbG9jYXRpb24gZm9yIHRoZSBzaGVsbDwvbGk+Ci0gKiA8bGk+PGNvZGU+Z2V0U2hlbGxMaXN0ZW5lcjwvY29kZT4tIGV4dGVuZCBvciByZWltcGxlbWVudCB0byByZWNlaXZlIHNoZWxsCi0gKiBldmVudHM8L2xpPgotICogPGxpPjxjb2RlPmhhbmRsZUZvbnRDaGFuZ2U8L2NvZGU+LSByZWltcGxlbWVudCB0byByZXNwb25kIHRvIGZvbnQgY2hhbmdlcwotICogPC9saT4KLSAqIDxsaT48Y29kZT5oYW5kbGVTaGVsbENsb3NlRXZlbnQ8L2NvZGU+LSBleHRlbmQgb3IgcmVpbXBsZW1lbnQgdG8gaGFuZGxlCi0gKiBzaGVsbCBjbG9zaW5nczwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2luZG93IGltcGxlbWVudHMgSVNoZWxsUHJvdmlkZXIgewotCi0JLyoqCi0JICogU3RhbmRhcmQgcmV0dXJuIGNvZGUgY29uc3RhbnQgKHZhbHVlIDApIGluZGljYXRpbmcgdGhhdCB0aGUgd2luZG93IHdhcwotCSAqIG9wZW5lZC4KLQkgKiAKLQkgKiBAc2VlICNvcGVuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSAwOwotCi0JLyoqCi0JICogU3RhbmRhcmQgcmV0dXJuIGNvZGUgY29uc3RhbnQgKHZhbHVlIDEpIGluZGljYXRpbmcgdGhhdCB0aGUgd2luZG93IHdhcwotCSAqIGNhbmNlbGVkLgotCSAqIAotCSAqIEBzZWUgI29wZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5DRUwgPSAxOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgaW1hZ2VzIHRvIGJlIHVzZWQgZm9yIHRoZSB3aW5kb3cuIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlCi0JICogYXJyYXkgd2lsbCBjb250YWluIHRoZSBzYW1lIGljb24gcmVuZGVyZWQgYXQgZGlmZmVyZW50IHJlc29sdXRpb25zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlW10gZGVmYXVsdEltYWdlczsKLQotCS8qKgotCSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBFeGNlcHRpb24gSGFuZGxlciB3aGljaCBjYW4gYmUgc2V0IGFzIGEgZ2xvYmFsCi0JICogaGFuZGxlciBhbmQgd2lsbCBiZSBjYWxsZWQgaWYgYW4gZXhjZXB0aW9uIGhhcHBlbnMgaW4gdGhlIGV2ZW50IGxvb3AuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUV4Y2VwdGlvbkhhbmRsZXIgewotCQkvKioKLQkJICogSGFuZGxlIHRoZSBleGNlcHRpb24uCi0JCSAqIAotCQkgKiBAcGFyYW0gdAotCQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhhdCBvY2N1cmVkLgotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0KTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZpbmVzIGEgZGVmYXVsdCBleGNlcHRpb24gaGFuZGxlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWZhdWx0RXhjZXB0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElFeGNlcHRpb25IYW5kbGVyIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93LklFeGNlcHRpb25IYW5kbGVyI2hhbmRsZUV4Y2VwdGlvbihqYXZhLmxhbmcuVGhyb3dhYmxlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0JCQlpZiAodCBpbnN0YW5jZW9mIFRocmVhZERlYXRoKQotCQkJCS8vIERvbid0IGNhdGNoIFRocmVhZERlYXRoIGFzIHRoaXMgaXMgYSBub3JtYWwgb2NjdXJyZW5jZSB3aGVuCi0JCQkJLy8gdGhlIHRocmVhZCBkaWVzCi0JCQkJdGhyb3cgKFRocmVhZERlYXRoKSB0OwotCQkJLy8gVHJ5IHRvIGtlZXAgcnVubmluZy4KLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlciA9IG5ldyBEZWZhdWx0RXhjZXB0aW9uSGFuZGxlcigpOwotCQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IG9yaWVudGF0aW9uIG9mIHRoZSB3aW5kb3cuIEJ5IGRlZmF1bHQKLQkgKiBpdCBpcyBTV1QjTk9ORSBidXQgaXQgY2FuIGFsc28gYmUgU1dUI0xFRlRfVE9fUklHSFQKLQkgKiBvciBTV1QjUklHSFRfVE9fTEVGVAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBvcmllbnRhdGlvbiA9IFNXVC5OT05FOwotCi0gICAgLyoqCi0gICAgICogT2JqZWN0IHVzZWQgdG8gbG9jYXRlIHRoZSBkZWZhdWx0IHBhcmVudCBmb3IgbW9kYWwgc2hlbGxzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVNoZWxsUHJvdmlkZXIgZGVmYXVsdE1vZGFsUGFyZW50ID0gbmV3IElTaGVsbFByb3ZpZGVyKCkgewotICAgICAgICBwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0gICAgICAgICAgICBEaXNwbGF5IGQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTaGVsbCBwYXJlbnQgPSBkLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBwaWNrIGEgcGFyZW50IHRoYXQgaGFzIGEgbW9kYWwgY2hpbGQgKHRoaXMgY2FuIGxvY2sgdGhlIGFwcCkKLSAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSB0b3AtbGV2ZWwgd2luZG93LCB0aGVuIHRoZXJlIG11c3Qgbm90IGJlIGFueSBvcGVuIG1vZGFsIHdpbmRvd3MuCi0gICAgICAgICAgICAgICAgcGFyZW50ID0gZ2V0TW9kYWxDaGlsZChEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRTaGVsbHMoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIHBpY2tlZCBhIHBhcmVudCB3aXRoIGEgbW9kYWwgY2hpbGQsIHVzZSB0aGUgbW9kYWwgY2hpbGQgaW5zdGVhZAotICAgICAgICAgICAgICAgIFNoZWxsIG1vZGFsQ2hpbGQgPSBnZXRNb2RhbENoaWxkKHBhcmVudC5nZXRTaGVsbHMoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGFsQ2hpbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBtb2RhbENoaWxkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICAgICAgfQotICAgIH07Ci0gICAgCi0JLyoqCi0JICogT2JqZWN0IHRoYXQgcmV0dXJucyB0aGUgcGFyZW50IHNoZWxsLgotCSAqLwotCXByaXZhdGUgSVNoZWxsUHJvdmlkZXIgcGFyZW50U2hlbGw7Ci0KLQkvKioKLQkgKiBTaGVsbCBzdHlsZSBiaXRzLgotCSAqIAotCSAqIEBzZWUgI3NldFNoZWxsU3R5bGUKLQkgKi8KLQlwcml2YXRlIGludCBzaGVsbFN0eWxlID0gU1dULlNIRUxMX1RSSU07Ci0KLQkvKioKLQkgKiBXaW5kb3cgbWFuYWdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiAKLQkgKiBAc2VlICNzZXRXaW5kb3dNYW5hZ2VyCi0JICovCi0JcHJpdmF0ZSBXaW5kb3dNYW5hZ2VyIHdpbmRvd01hbmFnZXI7Ci0KLQkvKioKLQkgKiBXaW5kb3cgc2hlbGwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCS8qKgotCSAqIFRvcCBsZXZlbCBTV1QgY29udHJvbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXByaXZhdGUgQ29udHJvbCBjb250ZW50czsKLQotCS8qKgotCSAqIFdpbmRvdyByZXR1cm4gY29kZTsgaW5pdGlhbGx5IDxjb2RlPk9LPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2VlICNzZXRSZXR1cm5Db2RlCi0JICovCi0JcHJpdmF0ZSBpbnQgcmV0dXJuQ29kZSA9IE9LOwotCi0JLyoqCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPm9wZW48L2NvZGU+IG1ldGhvZCBzaG91bGQgbm90IHJldHVybgotCSAqIHVudGlsIHRoZSB3aW5kb3cgY2xvc2VzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZQotCSAqIDxjb2RlPm9wZW48L2NvZGU+IG1ldGhvZCBzaG91bGQgcmV0dXJuIGltbWVkaWF0ZWx5OyBpbml0aWFsbHkKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKG5vbi1ibG9ja2luZykuCi0JICogCi0JICogQHNlZSAjc2V0QmxvY2tPbk9wZW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYmxvY2sgPSBmYWxzZTsKLQotCS8qKgotCSAqIEludGVybmFsIGNsYXNzIGZvciBpbmZvcm1pbmcgdGhpcyB3aW5kb3cgd2hlbiBmb250cyBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBGb250Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWhhbmRsZUZvbnRDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwgZm9udCBjaGFuZ2UgbGlzdGVuZXIuCi0JICovCi0JcHJpdmF0ZSBGb250Q2hhbmdlTGlzdGVuZXIgZm9udENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogSW50ZXJuYWwgZmllbGRzIHRvIGRldGVjdCBpZiBzaGVsbCBzaXplIGhhcyBiZWVuIHNldAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZXNpemVIYXNPY2N1cnJlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBMaXN0ZW5lciByZXNpemVMaXN0ZW5lcjsKLSAKLQkvKioKLQkgKiBDcmVhdGVzIGEgd2luZG93IGluc3RhbmNlLCB3aG9zZSBzaGVsbCB3aWxsIGJlIGNyZWF0ZWQgdW5kZXIgdGhlIGdpdmVuCi0JICogcGFyZW50IHNoZWxsLiBOb3RlIHRoYXQgdGhlIHdpbmRvdyB3aWxsIGhhdmUgbm8gdmlzdWFsIHJlcHJlc2VudGF0aW9uCi0JICogdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLiBCeSBkZWZhdWx0LCA8Y29kZT5vcGVuPC9jb2RlPiBkb2VzIG5vdCBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNyZWF0ZSBhIHRvcC1sZXZlbAotCSAqICAgICAgICAgICAgc2hlbGwuIFRyeSBwYXNzaW5nICIoU2hlbGwpbnVsbCIgdG8gdGhpcyBtZXRob2QgaW5zdGVhZCBvZiAibnVsbCIKLSAgICAgKiAgICAgICAgICAgIGlmIHlvdXIgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0IGFuIGFtYmlndWl0eSBlcnJvci4KLQkgKiBAc2VlICNzZXRCbG9ja09uT3BlbgotCSAqIEBzZWUgI2dldERlZmF1bHRPcmllbnRhdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFdpbmRvdyhTaGVsbCBwYXJlbnRTaGVsbCkgewotICAgICAgICB0aGlzKG5ldyBTYW1lU2hlbGxQcm92aWRlcihwYXJlbnRTaGVsbCkpOwotICAgICAgICAKLSAgICAgICAgaWYocGFyZW50U2hlbGwgPT0gbnVsbCkvL0luaGVyaXQgdGhlIHN0eWxlIGZyb20gdGhlIHBhcmVudCBpZiB0aGVyZSBpcyBvbmUKLSAgICAgICAgICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCkpOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHdpbmRvdyB3aGljaCB3aWxsIGNyZWF0ZSBpdHMgc2hlbGwgYXMgYSBjaGlsZCBvZiB3aGF0ZXZlcgotICAgICAqIHRoZSBnaXZlbiBzaGVsbFByb3ZpZGVyIHJldHVybnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNoZWxsUHJvdmlkZXIgb2JqZWN0IHRoYXQgd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQgcGFyZW50IHNoZWxsLiBOb3QgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFdpbmRvdyhJU2hlbGxQcm92aWRlciBzaGVsbFByb3ZpZGVyKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoc2hlbGxQcm92aWRlcik7Ci0gICAgICAgIHRoaXMucGFyZW50U2hlbGwgPSBzaGVsbFByb3ZpZGVyOyAgIAotICAgIH0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIHdpbmRvdyBzaG91bGQgaGFuZGxlIHRoZSBjbG9zZSBldmVudCBvciBkbyBub3RoaW5nLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCByZXR1cm5zCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4sIHdoaWNoIHdpbGwgYWxsb3cgdGhlCi0JICogPGNvZGU+aGFuZGxlU2hlbGxDbG9zZUV2ZW50PC9jb2RlPiBtZXRob2QgdG8gYmUgY2FsbGVkLiBTdWJjbGFzc2VzIG1heQotCSAqIGV4dGVuZCBvciByZWltcGxlbWVudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGhhbmRsZSB0aGUgY2xvc2UgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSGFuZGxlU2hlbGxDbG9zZUV2ZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhpcyB3aW5kb3csIGRpc3Bvc2VzIGl0cyBzaGVsbCwgYW5kIHJlbW92ZXMgdGhpcyB3aW5kb3cgZnJvbSBpdHMKLQkgKiB3aW5kb3cgbWFuYWdlciAoaWYgaXQgaGFzIG9uZSkuCi0JICogPHA+Ci0JICogVGhpcyBmcmFtZXdvcmsgbWV0aG9kIG1heSBiZSBleHRlbmRlZCAoPGNvZGU+c3VwZXIuY2xvc2U8L2NvZGU+IG11c3QKLQkgKiBiZSBjYWxsZWQpLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB3aW5kb3cgaXMgKG9yIHdhcyBhbHJlYWR5KSBjbG9zZWQsIGFuZAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIHN0aWxsIG9wZW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJCi0JCS8vIHN0b3AgbGlzdGVuaW5nIGZvciBmb250IGNoYW5nZXMKLQkJaWYgKGZvbnRDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5yZW1vdmVMaXN0ZW5lcihmb250Q2hhbmdlTGlzdGVuZXIpOwotCQkJZm9udENoYW5nZUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCQkKLQkJLy8gcmVtb3ZlIHRoaXMgd2luZG93IGZyb20gYSB3aW5kb3cgbWFuYWdlciBpZiBpdCBoYXMgb25lCi0JCWlmICh3aW5kb3dNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXdpbmRvd01hbmFnZXIucmVtb3ZlKHRoaXMpOwotCQkJd2luZG93TWFuYWdlciA9IG51bGw7Ci0JCX0KLQotCQlpZiAoc2hlbGwgPT0gbnVsbCB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvLyBJZiB3ZSAiY2xvc2UiIHRoZSBzaGVsbCByZWN1cnNpb24gd2lsbCBvY2N1ci4KLQkJLy8gSW5zdGVhZCwgd2UgbmVlZCB0byAiZGlzcG9zZSIgdGhlIHNoZWxsIHRvIHJlbW92ZSBpdCBmcm9tIHRoZQotCQkvLyBkaXNwbGF5LgotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCXNoZWxsID0gbnVsbDsKLQkJY29udGVudHMgPSBudWxsOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIGdpdmVuIHNoZWxsIGluIHByZXBhcmF0aW9uIGZvciBvcGVuaW5nIHRoaXMgd2luZG93IGluIGl0LgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBzZXRzIHRoZSBzaGVsbCdzCi0JICogaW1hZ2UgYW5kIGdpdmVzIGl0IGEgZ3JpZCBsYXlvdXQuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCBvciByZWltcGxlbWVudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5ld1NoZWxsCi0JICogICAgICAgICAgICB0aGUgc2hlbGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCi0JCS8vIFRoZSBzaW5nbGUgaW1hZ2UgdmVyc2lvbiBvZiB0aGlzIGNvZGUgaGFkIGEgY29tbWVudCByZWxhdGVkIHRvIGJ1ZwotCQkvLyA0NjYyNCwKLQkJLy8gYW5kIHNvbWUgY29kZSB0aGF0IGRpZCBub3RoaW5nIGlmIHRoZSBzdG9yZWQgaW1hZ2Ugd2FzIGFscmVhZHkKLQkJLy8gZGlzcG9zZWQuCi0JCS8vIFRoZSBlcXVpdmFsZW50IGluIHRoZSBtdWx0aS1pbWFnZSB2ZXJzaW9uIHNlZW1zIHRvIGJlIHRvIHJlbW92ZSB0aGUKLQkJLy8gZGlzcG9zZWQgaW1hZ2VzIGZyb20gdGhlIGFycmF5IHBhc3NlZCB0byB0aGUgc2hlbGwuCi0JCWlmIChkZWZhdWx0SW1hZ2VzICE9IG51bGwgJiYgZGVmYXVsdEltYWdlcy5sZW5ndGggPiAwKSB7Ci0JCQlBcnJheUxpc3Qgbm9uRGlzcG9zZWRJbWFnZXMgPSBuZXcgQXJyYXlMaXN0KGRlZmF1bHRJbWFnZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmYXVsdEltYWdlcy5sZW5ndGg7ICsraSkKLQkJCQlpZiAoZGVmYXVsdEltYWdlc1tpXSAhPSBudWxsICYmICFkZWZhdWx0SW1hZ2VzW2ldLmlzRGlzcG9zZWQoKSkKLQkJCQkJbm9uRGlzcG9zZWRJbWFnZXMuYWRkKGRlZmF1bHRJbWFnZXNbaV0pOwotCi0JCQlpZiAobm9uRGlzcG9zZWRJbWFnZXMuc2l6ZSgpIDw9IDApCi0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJXaW5kb3cuY29uZmlndXJlU2hlbGw6IGltYWdlcyBkaXNwb3NlZCIpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIHsKLQkJCQlJbWFnZVtdIGFycmF5ID0gbmV3IEltYWdlW25vbkRpc3Bvc2VkSW1hZ2VzLnNpemUoKV07Ci0JCQkJbm9uRGlzcG9zZWRJbWFnZXMudG9BcnJheShhcnJheSk7Ci0JCQkJbmV3U2hlbGwuc2V0SW1hZ2VzKGFycmF5KTsKLQkJCX0KLQkJfQotCi0JCUxheW91dCBsYXlvdXQgPSBnZXRMYXlvdXQoKTsKLQkJaWYgKGxheW91dCAhPSBudWxsKQotCQkJbmV3U2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGF5b3V0IGZvciB0aGUgc2hlbGwuIFRoZSBsYXlvdXQgY3JlYXRlZCBoZXJlIHdpbGwgYmUKLQkgKiBhdHRhY2hlZCB0byB0aGUgY29tcG9zaXRlIHBhc3NlZCBpbnRvIGNyZWF0ZUNvbnRlbnRzLiBUaGUgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSBHcmlkTGF5b3V0IHdpdGggbm8gbWFyZ2lucy4gU3ViY2xhc3NlcyB0aGF0Ci0JICogY2hhbmdlIHRoZSBsYXlvdXQgdHlwZSBieSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHNob3VsZCBhbHNvIG92ZXJyaWRlCi0JICogY3JlYXRlQ29udGVudHMuCi0JICogCi0JICogPHA+Ci0JICogQSByZXR1cm4gdmFsdWUgb2YgbnVsbCBpbmRpY2F0ZXMgdGhhdCBubyBsYXlvdXQgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIHRoZQotCSAqIGNvbXBvc2l0ZS4gSW4gdGhpcyBjYXNlLCB0aGUgbGF5b3V0IG1heSBiZSBhdHRhY2hlZCB3aXRoaW4KLQkgKiBjcmVhdGVDb250ZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgTGF5b3V0IG9yIG51bGwgaWYgbm8gbGF5b3V0IHNob3VsZCBiZSBhdHRhY2hlZC4KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHJvdGVjdGVkIExheW91dCBnZXRMYXlvdXQoKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXJldHVybiBsYXlvdXQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RyYWluIHRoZSBzaGVsbCBzaXplIHRvIGJlIG5vIGxhcmdlciB0aGFuIHRoZSBkaXNwbGF5IGJvdW5kcy4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uc3RyYWluU2hlbGxTaXplKCkgewotCQkvLyBsaW1pdCB0aGUgc2hlbGwgc2l6ZSB0byB0aGUgZGlzcGxheSBzaXplCi0JCVJlY3RhbmdsZSBib3VuZHMgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLQkJUmVjdGFuZ2xlIGNvbnN0cmFpbmVkID0gZ2V0Q29uc3RyYWluZWRTaGVsbEJvdW5kcyhib3VuZHMpOwotCQlpZiAoIWJvdW5kcy5lcXVhbHMoY29uc3RyYWluZWQpKSB7Ci0JCQlzaGVsbC5zZXRCb3VuZHMoY29uc3RyYWluZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGlzIHdpbmRvdydzIHdpZGdldHJ5IGluIGEgbmV3IHRvcC1sZXZlbCBzaGVsbC4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgY3JlYXRlcyB0aGlzIHdpbmRvdydzCi0JICogc2hlbGwgKGJ5IGNhbGxpbmcgPGNvZGU+Y3JlYXRlU2hlbGw8L2NvZGU+KSwgYW5kIGl0cyBjb250cm9scyAoYnkKLQkgKiBjYWxsaW5nIDxjb2RlPmNyZWF0ZUNvbnRlbnRzPC9jb2RlPiksIHRoZW4gaW5pdGlhbGl6ZXMgdGhpcyB3aW5kb3cncwotCSAqIHNoZWxsIGJvdW5kcyAoYnkgY2FsbGluZyA8Y29kZT5pbml0aWFsaXplQm91bmRzPC9jb2RlPikuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc2hlbGwgPSBjcmVhdGVTaGVsbCgpOwotCQljb250ZW50cyA9IGNyZWF0ZUNvbnRlbnRzKHNoZWxsKTsKLQotCQkvL2luaXRpYWxpemUgdGhlIGJvdW5kcyBvZiB0aGUgc2hlbGwgdG8gdGhhdCBhcHByb3ByaWF0ZSBmb3IgdGhlCi0JCS8vIGNvbnRlbnRzCi0JCWluaXRpYWxpemVCb3VuZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoaXMgd2luZG93J3MgY29udGVudHMuIFN1YmNsYXNzZXMgbWF5IGF0dGFjaCBhbnkKLQkgKiBudW1iZXIgb2YgY2hpbGRyZW4gdG8gdGhlIHBhcmVudC4gQXMgYSBjb252ZW5pZW5jZSwgdGhlIHJldHVybiB2YWx1ZSBvZgotCSAqIHRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtZW1iZXJlZCBhbmQgcmV0dXJuZWQgYnkgc3Vic2VxdWVudCBjYWxscyB0bwotCSAqIGdldENvbnRyb2woKS4gU3ViY2xhc3NlcyBtYXkgbW9kaWZ5IHRoZSBwYXJlbnQncyBsYXlvdXQgaWYgdGhleSBvdmVybG9hZAotCSAqIGdldExheW91dCgpIHRvIHJldHVybiBudWxsLgotCSAqIAotCSAqIDxwPgotCSAqIEl0IGlzIGNvbW1vbiBwcmFjdGlzZSB0byBjcmVhdGUgYW5kIHJldHVybiBhIHNpbmdsZSBjb21wb3NpdGUgdGhhdAotCSAqIGNvbnRhaW5zIHRoZSBlbnRpcmUgd2luZG93IGNvbnRlbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgY3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIG9mIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSBmb3IgdGhlIGNvbnRyb2xzIGluIHRoaXMgd2luZG93LiBUaGUgdHlwZQotCSAqICAgICAgICAgICAgb2YgbGF5b3V0IHVzZWQgaXMgZGV0ZXJtaW5lZCBieSBnZXRMYXlvdXQoKQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRyb2wgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHN1YnNlcXVlbnQgY2FsbHMgdG8KLQkgKiAgICAgICAgIGdldENvbnRyb2woKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwganVzdCBjcmVhdGUgYSBjb21wb3NpdGUKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGlzIHdpbmRvdydzIHNoZWxsLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBjcmVhdGVzIGEgbmV3IHNoZWxsCi0JICogYW5kIGNvbmZpZ3VyZXMgaXQgdXNpbmcgPGNvZGUvPmNvbmZpZ3VyZVNoZWxsPC9jb2RlPi4gUmF0aGVyIHRoYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCwgc3ViY2xhc3NlcyBzaG91bGQgaW5zdGVhZCBvdmVycmlkZQotCSAqIDxjb2RlLz5jb25maWd1cmVTaGVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNoZWxsCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNoZWxsIGNyZWF0ZVNoZWxsKCkgewotCi0JCVNoZWxsIG5ld1BhcmVudCA9IGdldFBhcmVudFNoZWxsKCk7Ci0JCWlmKG5ld1BhcmVudCAhPSBudWxsICYmICBuZXdQYXJlbnQuaXNEaXNwb3NlZCgpKXsKLQkJCXBhcmVudFNoZWxsID0gbmV3IFNhbWVTaGVsbFByb3ZpZGVyKG51bGwpOwotCQkJbmV3UGFyZW50ID0gZ2V0UGFyZW50U2hlbGwoKTsvL0ZpbmQgYSBiZXR0ZXIgcGFyZW50Ci0JCX0KLQkJCi0JCS8vQ3JlYXRlIHRoZSBzaGVsbAotCQlTaGVsbCBuZXdTaGVsbCA9IG5ldyBTaGVsbChuZXdQYXJlbnQsIGdldFNoZWxsU3R5bGUoKSk7Ci0KLQkJcmVzaXplTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJcmVzaXplSGFzT2NjdXJyZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCi0JCW5ld1NoZWxsLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIHJlc2l6ZUxpc3RlbmVyKTsKLQkJbmV3U2hlbGwuc2V0RGF0YSh0aGlzKTsKLQotCQkvL0FkZCBhIGxpc3RlbmVyCi0JCW5ld1NoZWxsLmFkZFNoZWxsTGlzdGVuZXIoZ2V0U2hlbGxMaXN0ZW5lcigpKTsKLQotCQkvL1NldCB0aGUgbGF5b3V0Ci0JCWNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQotCQkvL1JlZ2lzdGVyIGZvciBmb250IGNoYW5nZXMKLQkJaWYgKGZvbnRDaGFuZ2VMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmb250Q2hhbmdlTGlzdGVuZXIgPSBuZXcgRm9udENoYW5nZUxpc3RlbmVyKCk7Ci0JCX0KLQkJSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuYWRkTGlzdGVuZXIoZm9udENoYW5nZUxpc3RlbmVyKTsKLQotCQlyZXR1cm4gbmV3U2hlbGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9wIGxldmVsIGNvbnRyb2wgZm9yIHRoaXMgd2luZG93LiBUaGUgcGFyZW50IG9mIHRoaXMgY29udHJvbAotCSAqIGlzIHRoZSBzaGVsbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0b3AgbGV2ZWwgY29udHJvbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB3aW5kb3cncwotCSAqICAgICAgICAgY29udHJvbCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXRDb250ZW50cygpIHsKLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgaW1hZ2UuIFRoaXMgaXMgdGhlIGltYWdlIHRoYXQgd2lsbCBiZSB1c2VkIGZvcgotCSAqIHdpbmRvd3MgdGhhdCBoYXZlIG5vIHNoZWxsIGltYWdlIGF0IHRoZSB0aW1lIHRoZXkgYXJlIG9wZW5lZC4gVGhlcmUgaXMgbm8KLQkgKiBkZWZhdWx0IGltYWdlIHVubGVzcyBvbmUgaXMgaW5zdGFsbGVkIHZpYSA8Y29kZT5zZXREZWZhdWx0SW1hZ2U8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAc2VlICNzZXREZWZhdWx0SW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldERlZmF1bHRJbWFnZSgpIHsKLQkJcmV0dXJuIChkZWZhdWx0SW1hZ2VzID09IG51bGwgfHwgZGVmYXVsdEltYWdlcy5sZW5ndGggPCAxKSA/IG51bGwKLQkJCQk6IGRlZmF1bHRJbWFnZXNbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXJyYXkgb2YgZGVmYXVsdCBpbWFnZXMgdG8gdXNlIGZvciBuZXdseSBvcGVuZWQgd2luZG93cy4gSXQKLQkgKiBpcyBleHBlY3RlZCB0aGF0IHRoZSBhcnJheSB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgaWNvbiByZW5kZXJlZCBhdAotCSAqIGRpZmZlcmVudCByZXNvbHV0aW9ucy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRlY29yYXRpb25zI3NldEltYWdlcyhvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VbXSkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBpbWFnZXMgdG8gYmUgdXNlZCB3aGVuIGEgbmV3IHdpbmRvdyBpcyBvcGVuZWQKLQkgKiBAc2VlICNzZXREZWZhdWx0SW1hZ2VzCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VbXSBnZXREZWZhdWx0SW1hZ2VzKCkgewotCQlyZXR1cm4gKGRlZmF1bHRJbWFnZXMgPT0gbnVsbCA/IG5ldyBJbWFnZVswXSA6IGRlZmF1bHRJbWFnZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluaXRpYWwgbG9jYXRpb24gdG8gdXNlIGZvciB0aGUgc2hlbGwuIFRoZSBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gY2VudGVycyB0aGUgc2hlbGwgaG9yaXpvbnRhbGx5ICgxLzIgb2YgdGhlIGRpZmZlcmVuY2UgdG8KLQkgKiB0aGUgbGVmdCBhbmQgMS8yIHRvIHRoZSByaWdodCkgYW5kIHZlcnRpY2FsbHkgKDEvMyBhYm92ZSBhbmQgMi8zIGJlbG93KQotCSAqIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQgc2hlbGwsIG9yIGRpc3BsYXkgYm91bmRzIGlmIHRoZXJlIGlzIG5vIHBhcmVudAotCSAqIHNoZWxsLgotCSAqIAotCSAqIEBwYXJhbSBpbml0aWFsU2l6ZQotCSAqICAgICAgICAgICAgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgc2hlbGwsIGFzIHJldHVybmVkIGJ5Ci0JICogICAgICAgICAgICA8Y29kZT5nZXRJbml0aWFsU2l6ZTwvY29kZT4uCi0JICogQHJldHVybiB0aGUgaW5pdGlhbCBsb2NhdGlvbiBvZiB0aGUgc2hlbGwKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbExvY2F0aW9uKFBvaW50IGluaXRpYWxTaXplKSB7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBzaGVsbC5nZXRQYXJlbnQoKTsKLQotCQlNb25pdG9yIG1vbml0b3IgPSBzaGVsbC5nZXREaXNwbGF5KCkuZ2V0UHJpbWFyeU1vbml0b3IoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQltb25pdG9yID0gcGFyZW50LmdldE1vbml0b3IoKTsKLQkJfQotCi0JCVJlY3RhbmdsZSBtb25pdG9yQm91bmRzID0gbW9uaXRvci5nZXRDbGllbnRBcmVhKCk7Ci0JCVBvaW50IGNlbnRlclBvaW50OwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCWNlbnRlclBvaW50ID0gR2VvbWV0cnkuY2VudGVyUG9pbnQocGFyZW50LmdldEJvdW5kcygpKTsKLQkJfSBlbHNlIHsKLQkJCWNlbnRlclBvaW50ID0gR2VvbWV0cnkuY2VudGVyUG9pbnQobW9uaXRvckJvdW5kcyk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFBvaW50KGNlbnRlclBvaW50LnggLSAoaW5pdGlhbFNpemUueCAvIDIpLCBNYXRoLm1heCgKLQkJCQltb25pdG9yQm91bmRzLnksIE1hdGgubWluKGNlbnRlclBvaW50LnkKLQkJCQkJCS0gKGluaXRpYWxTaXplLnkgKiAyIC8gMyksIG1vbml0b3JCb3VuZHMueQotCQkJCQkJKyBtb25pdG9yQm91bmRzLmhlaWdodCAtIGluaXRpYWxTaXplLnkpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5pdGlhbCBzaXplIHRvIHVzZSBmb3IgdGhlIHNoZWxsLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCSAqIHJldHVybnMgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBzaGVsbCwgdXNpbmcKLQkgKiA8Y29kZT5TaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHNoZWxsCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxTaXplKCkgewotCQlyZXR1cm4gc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb3N0IHNwZWNpZmljIG1vZGFsIGNoaWxkIGZyb20gdGhlIGdpdmVuIGxpc3Qgb2YgU2hlbGxzLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9TZWFyY2ggc2hlbGxzIHRvIHNlYXJjaCBmb3IgbW9kYWwgY2hpbGRyZW4KLSAgICAgKiBAcmV0dXJuIHRoZSBtb3N0IHNwZWNpZmljIG1vZGFsIGNoaWxkLCBvciBudWxsIGlmIG5vbmUKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2hlbGwgZ2V0TW9kYWxDaGlsZChTaGVsbFtdIHRvU2VhcmNoKSB7Ci0gICAgICAgIGludCBtb2RhbCA9IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5TWVNURU1fTU9EQUwgfCBTV1QuUFJJTUFSWV9NT0RBTDsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSB0b1NlYXJjaC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSB0b1NlYXJjaFtpXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBzaGVsbCBoYXMgYSBtb2RhbCBjaGlsZAotICAgICAgICAgICAgU2hlbGxbXSBjaGlsZHJlbiA9IHNoZWxsLmdldFNoZWxscygpOwotICAgICAgICAgICAgU2hlbGwgbW9kYWxDaGlsZCA9IGdldE1vZGFsQ2hpbGQoY2hpbGRyZW4pOwotICAgICAgICAgICAgaWYgKG1vZGFsQ2hpbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtb2RhbENoaWxkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJZiBub3QsIGNoZWNrIGlmIHRoaXMgc2hlbGwgaXMgbW9kYWwgaXRzZWxmCi0gICAgICAgICAgICBpZiAoc2hlbGwuaXNWaXNpYmxlKCkgJiYgKHNoZWxsLmdldFN0eWxlKCkgJiBtb2RhbCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzaGVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIFJldHVybnMgcGFyZW50IHNoZWxsLCB1bmRlciB3aGljaCB0aGlzIHdpbmRvdydzIHNoZWxsIGlzIGNyZWF0ZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IHNoZWxsLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBwYXJlbnQKLQkgKiAgICAgICAgIHNoZWxsCi0JICovCi0JcHJvdGVjdGVkIFNoZWxsIGdldFBhcmVudFNoZWxsKCkgewotICAgICAgICBTaGVsbCBwYXJlbnQgPSBwYXJlbnRTaGVsbC5nZXRTaGVsbCgpOwotICAgICAgICAKLSAgICAgICAgaW50IG1vZGFsID0gU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlNZU1RFTV9NT0RBTCB8IFNXVC5QUklNQVJZX01PREFMOwotICAgICAgICAKLSAgICAgICAgaWYgKChnZXRTaGVsbFN0eWxlKCkgJiBtb2RhbCkgIT0gMCkgewotICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIG1vZGFsIHNoZWxsIHdpdGggbm8gcGFyZW50LCBwaWNrIGEgc2hlbGwgdXNpbmcgZGVmYXVsdE1vZGFsUGFyZW50LgotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50ID0gZGVmYXVsdE1vZGFsUGFyZW50LmdldFNoZWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHdpbmRvdydzIHJldHVybiBjb2RlLiBBIHdpbmRvdydzIHJldHVybiBjb2RlcyBhcmUKLQkgKiB3aW5kb3ctc3BlY2lmaWMsIGFsdGhvdWdoIHR3byBzdGFuZGFyZCByZXR1cm4gY29kZXMgYXJlIHByZWRlZmluZWQ6Ci0JICogPGNvZGU+T0s8L2NvZGU+IGFuZCA8Y29kZT5DQU5DRUw8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJldHVybiBjb2RlCi0JICovCi0JcHVibGljIGludCBnZXRSZXR1cm5Db2RlKCkgewotCQlyZXR1cm4gcmV0dXJuQ29kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgd2luZG93J3Mgc2hlbGwuCi0JICogCi0JICogQHJldHVybiB0aGlzIHdpbmRvdydzIHNoZWxsLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHdpbmRvdydzCi0JICogICAgICAgICBzaGVsbCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQKLQkgKi8KLQlwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hlbGwgbGlzdGVuZXIuIFRoaXMgc2hlbGwgbGlzdGVuZXIgZ2V0cyByZWdpc3RlcmVkIHdpdGggdGhpcwotCSAqIHdpbmRvdydzIHNoZWxsLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCByZXR1cm5zIGEgbmV3Ci0JICogbGlzdGVuZXIgdGhhdCBtYWtlcyB0aGlzIHdpbmRvdyB0aGUgYWN0aXZlIHdpbmRvdyBmb3IgaXRzIHdpbmRvdyBtYW5hZ2VyCi0JICogKGlmIGl0IGhhcyBvbmUpIHdoZW4gdGhlIHNoZWxsIGlzIGFjdGl2YXRlZCwgYW5kIGNhbGxzIHRoZSBmcmFtZXdvcmsKLQkgKiBtZXRob2QgPGNvZGU+aGFuZGxlU2hlbGxDbG9zZUV2ZW50PC9jb2RlPiB3aGVuIHRoZSBzaGVsbCBpcyBjbG9zZWQuCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIG9yIHJlaW1wbGVtZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc2hlbGwgbGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgU2hlbGxMaXN0ZW5lciBnZXRTaGVsbExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNoZWxsQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZXZlbnQpIHsKLQkJCQlldmVudC5kb2l0ID0gZmFsc2U7IC8vIGRvbid0IGNsb3NlIG5vdwotCQkJCWlmIChjYW5IYW5kbGVTaGVsbENsb3NlRXZlbnQoKSkKLQkJCQkJaGFuZGxlU2hlbGxDbG9zZUV2ZW50KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hlbGwgc3R5bGUgYml0cy4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5TV1QuQ0xPU0V8U1dULk1JTnxTV1QuTUFYfFNXVC5SRVNJWkU8L2NvZGU+LgotCSAqIFN1YmNsYXNzZXJzIHNob3VsZCBjYWxsIDxjb2RlPnNldFNoZWxsU3R5bGU8L2NvZGU+IHRvIGNoYW5nZSB0aGlzCi0JICogdmFsdWUsIHJhdGhlciB0aGFuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNoZWxsIHN0eWxlIGJpdHMKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFNoZWxsU3R5bGUoKSB7Ci0JCXJldHVybiBzaGVsbFN0eWxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpbmRvdyBtYW5hZ2VyIG9mIHRoaXMgd2luZG93LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFdpbmRvd01hbmFnZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgV2luZG93TWFuYWdlciBnZXRXaW5kb3dNYW5hZ2VyKCkgewotCQlyZXR1cm4gd2luZG93TWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBvZiBhIGZvbnQgcHJvcGVydHkgY2hhbmdlLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IGNoYW5nZSBldmVudCBkZXRhaWxpbmcgd2hhdCBjaGFuZ2VkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRm9udENoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoZSB3aW5kb3cncyBjbG9zZSBidXR0b24gd2FzIHByZXNzZWQsIHRoZSBjbG9zZSBtZW51IHdhcwotCSAqIHNlbGVjdGVkLCBvciB0aGUgRVNDQVBFIGtleSBwcmVzc2VkLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBzZXRzIHRoZSB3aW5kb3cncwotCSAqIHJldHVybiBjb2RlIHRvIDxjb2RlPkNBTkNFTDwvY29kZT4gYW5kIGNsb3NlcyB0aGUgd2luZG93IHVzaW5nCi0JICogPGNvZGU+Y2xvc2U8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSBleHRlbmQgb3IgcmVpbXBsZW1lbnQuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNoZWxsQ2xvc2VFdmVudCgpIHsKLQkJc2V0UmV0dXJuQ29kZShDQU5DRUwpOwotCQljbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBsb2NhdGlvbiBhbmQgc2l6ZSBvZiB0aGlzIHdpbmRvdydzIFNXVCBzaGVsbCBhZnRlciBpdCBoYXMKLQkgKiBiZWVuIGNyZWF0ZWQuCi0JICogPHA+Ci0JICogVGhpcyBmcmFtZXdvcmsgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgPGNvZGU+Y3JlYXRlPC9jb2RlPiBmcmFtZXdvcmsKLQkgKiBtZXRob2QuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIDxjb2RlPmdldEluaXRpYWxTaXplPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5nZXRJbml0aWFsTG9jYXRpb248L2NvZGU+IGFuZCBwYXNzZXMgdGhlIHJlc3VsdHMgdG8KLQkgKiA8Y29kZT5TaGVsbC5zZXRCb3VuZHM8L2NvZGU+LiBUaGlzIGlzIG9ubHkgZG9uZSBpZiB0aGUgYm91bmRzIG9mIHRoZQotCSAqIHNoZWxsIGhhdmUgbm90IGFscmVhZHkgYmVlbiBtb2RpZmllZC4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIG9yCi0JICogcmVpbXBsZW1lbnQuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCb3VuZHMoKSB7Ci0JCWlmIChyZXNpemVMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlzaGVsbC5yZW1vdmVMaXN0ZW5lcihTV1QuUmVzaXplLCByZXNpemVMaXN0ZW5lcik7Ci0JCX0KLQkJaWYgKHJlc2l6ZUhhc09jY3VycmVkKSB7IC8vIENoZWNrIGlmIHNoZWxsIHNpemUgaGFzIGJlZW4gc2V0IGFscmVhZHkuCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlQb2ludCBzaXplID0gZ2V0SW5pdGlhbFNpemUoKTsKLQkJUG9pbnQgbG9jYXRpb24gPSBnZXRJbml0aWFsTG9jYXRpb24oc2l6ZSk7Ci0JCXNoZWxsLnNldEJvdW5kcyhnZXRDb25zdHJhaW5lZFNoZWxsQm91bmRzKG5ldyBSZWN0YW5nbGUobG9jYXRpb24ueCwKLQkJCQlsb2NhdGlvbi55LCBzaXplLngsIHNpemUueSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGlzIHdpbmRvdywgY3JlYXRpbmcgaXQgZmlyc3QgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgotCSAqIDxwPgotCSAqIElmIHRoaXMgd2luZG93IGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gYmxvY2sgb24gb3BlbiAoCi0JICogPGNvZGU+c2V0QmxvY2tPbk9wZW48L2NvZGU+KSwgdGhpcyBtZXRob2Qgd2FpdHMgdW50aWwgdGhlIHdpbmRvdyBpcwotCSAqIGNsb3NlZCBieSB0aGUgZW5kIHVzZXIsIGFuZCB0aGVuIGl0IHJldHVybnMgdGhlIHdpbmRvdydzIHJldHVybiBjb2RlOwotCSAqIG90aGVyd2lzZSwgdGhpcyBtZXRob2QgcmV0dXJucyBpbW1lZGlhdGVseS4gQSB3aW5kb3cncyByZXR1cm4gY29kZXMgYXJlCi0JICogd2luZG93LXNwZWNpZmljLCBhbHRob3VnaCB0d28gc3RhbmRhcmQgcmV0dXJuIGNvZGVzIGFyZSBwcmVkZWZpbmVkOgotCSAqIDxjb2RlPk9LPC9jb2RlPiBhbmQgPGNvZGU+Q0FOQ0VMPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcmV0dXJuIGNvZGUKLQkgKiAKLQkgKiBAc2VlICNjcmVhdGUoKQotCSAqLwotCXB1YmxpYyBpbnQgb3BlbigpIHsKLSAgICAgICAgCi0JCWlmIChzaGVsbCA9PSBudWxsIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgc2hlbGwgPSBudWxsOwotCQkJLy8gY3JlYXRlIHRoZSB3aW5kb3cKLQkJCWNyZWF0ZSgpOwotCQl9Ci0KLQkJLy8gbGltaXQgdGhlIHNoZWxsIHNpemUgdG8gdGhlIGRpc3BsYXkgc2l6ZQotCQljb25zdHJhaW5TaGVsbFNpemUoKTsKLQotCQkvLyBvcGVuIHRoZSB3aW5kb3cKLQkJc2hlbGwub3BlbigpOwotCi0JCS8vIHJ1biB0aGUgZXZlbnQgbG9vcCBpZiBzcGVjaWZpZWQKLQkJaWYgKGJsb2NrKQotCQkJcnVuRXZlbnRMb29wKHNoZWxsKTsKLQotCQlyZXR1cm4gcmV0dXJuQ29kZTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBldmVudCBsb29wIGZvciB0aGUgZ2l2ZW4gc2hlbGwuCi0JICogCi0JICogQHBhcmFtIGxvb3BTaGVsbAotCSAqICAgICAgICAgICAgdGhlIHNoZWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJ1bkV2ZW50TG9vcChTaGVsbCBsb29wU2hlbGwpIHsKLQotCQkvL1VzZSB0aGUgZGlzcGxheSBwcm92aWRlZCBieSB0aGUgc2hlbGwgaWYgcG9zc2libGUKLQkJRGlzcGxheSBkaXNwbGF5OwotCQlpZiAoc2hlbGwgPT0gbnVsbCkKLQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJZWxzZQotCQkJZGlzcGxheSA9IGxvb3BTaGVsbC5nZXREaXNwbGF5KCk7Ci0KLQkJd2hpbGUgKGxvb3BTaGVsbCAhPSBudWxsICYmICFsb29wU2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0cnkgewotCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQlleGNlcHRpb25IYW5kbGVyLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlkaXNwbGF5LnVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgPGNvZGU+b3BlbjwvY29kZT4gbWV0aG9kIHNob3VsZCBibG9jayB1bnRpbCB0aGUgd2luZG93Ci0JICogY2xvc2VzLgotCSAqIAotCSAqIEBwYXJhbSBzaG91bGRCbG9jawotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPm9wZW48L2NvZGU+IG1ldGhvZCBzaG91bGQKLQkgKiAgICAgICAgICAgIG5vdCByZXR1cm4gdW50aWwgdGhlIHdpbmRvdyBjbG9zZXMsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgICAgIGlmIHRoZSA8Y29kZT5vcGVuPC9jb2RlPiBtZXRob2Qgc2hvdWxkIHJldHVybiBpbW1lZGlhdGVseQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJsb2NrT25PcGVuKGJvb2xlYW4gc2hvdWxkQmxvY2spIHsKLQkJYmxvY2sgPSBzaG91bGRCbG9jazsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IGltYWdlLiBUaGlzIGlzIHRoZSBpbWFnZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3Igd2luZG93cwotCSAqIHRoYXQgaGF2ZSBubyBzaGVsbCBpbWFnZSBhdCB0aGUgdGltZSB0aGV5IGFyZSBvcGVuZWQuIFRoZXJlIGlzIG5vIGRlZmF1bHQKLQkgKiBpbWFnZSB1bmxlc3Mgb25lIGlzIGluc3RhbGxlZCB2aWEgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJZGVmYXVsdEltYWdlcyA9IGltYWdlID09IG51bGwgPyBudWxsIDogbmV3IEltYWdlW10geyBpbWFnZSB9OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFycmF5IG9mIGRlZmF1bHQgaW1hZ2VzIHRvIHVzZSBmb3IgbmV3bHkgb3BlbmVkIHdpbmRvd3MuIEl0IGlzCi0JICogZXhwZWN0ZWQgdGhhdCB0aGUgYXJyYXkgd2lsbCBjb250YWluIHRoZSBzYW1lIGljb24gcmVuZGVyZWQgYXQgZGlmZmVyZW50Ci0JICogcmVzb2x1dGlvbnMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EZWNvcmF0aW9ucyNzZXRJbWFnZXMob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlW10pCi0JICogCi0JICogQHBhcmFtIGltYWdlcwotCSAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGltYWdlcyB0byBiZSB1c2VkIHdoZW4gdGhpcyB3aW5kb3cgaXMgb3BlbmVkCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0SW1hZ2VzKEltYWdlW10gaW1hZ2VzKSB7Ci0JCUltYWdlW10gbmV3QXJyYXkgPSBuZXcgSW1hZ2VbaW1hZ2VzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoaW1hZ2VzLCAwLCBuZXdBcnJheSwgMCwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJZGVmYXVsdEltYWdlcyA9IG5ld0FycmF5OwotCX0KLQkKLQkvKioKLSAgICAgKiBDaGFuZ2VzIHRoZSBwYXJlbnQgc2hlbGwuIFRoaXMgaXMgb25seSBzYWZlIHRvIHVzZSB3aGVuIHRoZSBzaGVsbCBpcyBub3QKLSAgICAgKiB5ZXQgcmVhbGl6ZWQgKGkuZS4sIGNyZWF0ZWQpLiBPbmNlIHRoZSBzaGVsbCBpcyBjcmVhdGVkLCBpdCBtdXN0IGJlCi0gICAgICogZGlzcG9zZWQgKGkuZS4sIGNsb3NlZCkgYmVmb3JlIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5ld1BhcmVudFNoZWxsCi0gICAgICogICAgICAgICAgICBUaGUgbmV3IHBhcmVudCBzaGVsbDsgdGhpcyB2YWx1ZSBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAgKiAgICAgICAgICAgIHRoZXJlIGlzIHRvIGJlIG5vIHBhcmVudC4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UGFyZW50U2hlbGwoZmluYWwgU2hlbGwgbmV3UGFyZW50U2hlbGwpIHsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZSgoc2hlbGwgPT0gbnVsbCksICJUaGVyZSBtdXN0IG5vdCBiZSBhbiBleGlzdGluZyBzaGVsbC4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBwYXJlbnRTaGVsbCA9IG5ldyBTYW1lU2hlbGxQcm92aWRlcihuZXdQYXJlbnRTaGVsbCk7Ci0gICAgfQotCi0JLyoqCi0JICogU2V0cyB0aGlzIHdpbmRvdydzIHJldHVybiBjb2RlLiBUaGUgcmV0dXJuIGNvZGUgaXMgYXV0b21hdGljYWxseSByZXR1cm5lZAotCSAqIGJ5IDxjb2RlPm9wZW48L2NvZGU+IGlmIGJsb2NrIG9uIG9wZW4gaXMgZW5hYmxlZC4gRm9yIG5vbi1ibG9ja2luZwotCSAqIG9wZW5zLCB0aGUgcmV0dXJuIGNvZGUgbmVlZHMgdG8gYmUgcmV0cmlldmVkIG1hbnVhbGx5IHVzaW5nCi0JICogPGNvZGU+Z2V0UmV0dXJuQ29kZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGNvZGUKLQkgKiAgICAgICAgICAgIHRoZSByZXR1cm4gY29kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJldHVybkNvZGUoaW50IGNvZGUpIHsKLQkJcmV0dXJuQ29kZSA9IGNvZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9uaXRvciB3aG9zZSBjbGllbnQgYXJlYSBjb250YWlucyB0aGUgZ2l2ZW4gcG9pbnQuIElmIG5vCi0JICogbW9uaXRvciBjb250YWlucyB0aGUgcG9pbnQsIHJldHVybnMgdGhlIG1vbml0b3IgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZQotCSAqIHBvaW50LiBJZiB0aGlzIGlzIGV2ZXIgbWFkZSBwdWJsaWMsIGl0IHNob3VsZCBiZSBtb3ZlZCBpbnRvIGEgc2VwYXJhdGUKLQkgKiB1dGlsaXR5IGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSB0b1NlYXJjaAotCSAqICAgICAgICAgICAgcG9pbnQgdG8gZmluZCAoZGlzcGxheSBjb29yZGluYXRlcykKLQkgKiBAcGFyYW0gdG9GaW5kCi0JICogICAgICAgICAgICBwb2ludCB0byBmaW5kIChkaXNwbGF5IGNvb3JkaW5hdGVzKQotCSAqIEByZXR1cm4gdGhlIG1vbnRvciBjbG9zZXN0IHRvIHRoZSBnaXZlbiBwb2ludAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1vbml0b3IgZ2V0Q2xvc2VzdE1vbml0b3IoRGlzcGxheSB0b1NlYXJjaCwgUG9pbnQgdG9GaW5kKSB7Ci0JCWludCBjbG9zZXN0ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJTW9uaXRvcltdIG1vbml0b3JzID0gdG9TZWFyY2guZ2V0TW9uaXRvcnMoKTsKLQkJTW9uaXRvciByZXN1bHQgPSBtb25pdG9yc1swXTsKLQotCQlmb3IgKGludCBpZHggPSAwOyBpZHggPCBtb25pdG9ycy5sZW5ndGg7IGlkeCsrKSB7Ci0JCQlNb25pdG9yIGN1cnJlbnQgPSBtb25pdG9yc1tpZHhdOwotCi0JCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGN1cnJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCi0JCQlpZiAoY2xpZW50QXJlYS5jb250YWlucyh0b0ZpbmQpKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQl9Ci0KLQkJCWludCBkaXN0YW5jZSA9IEdlb21ldHJ5LmRpc3RhbmNlU3F1YXJlZChHZW9tZXRyeQotCQkJCQkuY2VudGVyUG9pbnQoY2xpZW50QXJlYSksIHRvRmluZCk7Ci0JCQlpZiAoZGlzdGFuY2UgPCBjbG9zZXN0KSB7Ci0JCQkJY2xvc2VzdCA9IGRpc3RhbmNlOwotCQkJCXJlc3VsdCA9IGN1cnJlbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBkZXNpcmVkIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3csIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gYWRqdXN0ZWQKLQkgKiBwb3NpdGlvbiBzdWNoIHRoYXQgdGhlIHdpbmRvdyBpcyBubyBsYXJnZXIgdGhhbiBpdHMgbW9uaXRvciwgYW5kIGRvZXMgbm90Ci0JICogZXh0ZW5kIGJleW9uZCB0aGUgZWRnZSBvZiB0aGUgbW9uaXRvci4gVGhpcyBpcyB1c2VkIGZvciBjb21wdXRpbmcgdGhlCi0JICogaW5pdGlhbCB3aW5kb3cgcG9zaXRpb24sIGFuZCBzdWJjbGFzc2VzIGNhbiB1c2UgdGhpcyBhcyBhIHV0aWxpdHkgbWV0aG9kCi0JICogaWYgdGhleSB3YW50IHRvIGxpbWl0IHRoZSByZWdpb24gaW4gd2hpY2ggdGhlIHdpbmRvdyBtYXkgYmUgbW92ZWQuCi0JICogCi0JICogQHBhcmFtIHByZWZlcnJlZFNpemUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgcG9zaXRpb24gb2YgdGhlIHdpbmRvdwotCSAqIEByZXR1cm4gYSByZWN0YW5nbGUgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gcHJlZmVycmVkU2l6ZSB0aGF0IGRvZXMgbm90Ci0JICogICAgICAgICBleHRlbmQgb3V0c2lkZSB0aGUgbW9uaXRvcgotCSAqIAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldENvbnN0cmFpbmVkU2hlbGxCb3VuZHMoUmVjdGFuZ2xlIHByZWZlcnJlZFNpemUpIHsKLQkJUmVjdGFuZ2xlIHJlc3VsdCA9IG5ldyBSZWN0YW5nbGUocHJlZmVycmVkU2l6ZS54LCBwcmVmZXJyZWRTaXplLnksCi0JCQkJcHJlZmVycmVkU2l6ZS53aWR0aCwgcHJlZmVycmVkU2l6ZS5oZWlnaHQpOwotCi0JCU1vbml0b3IgbW9uID0gZ2V0Q2xvc2VzdE1vbml0b3IoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIEdlb21ldHJ5Ci0JCQkJLmNlbnRlclBvaW50KHJlc3VsdCkpOwotCi0JCVJlY3RhbmdsZSBib3VuZHMgPSBtb24uZ2V0Q2xpZW50QXJlYSgpOwotCi0JCWlmIChyZXN1bHQuaGVpZ2h0ID4gYm91bmRzLmhlaWdodCkgewotCQkJcmVzdWx0LmhlaWdodCA9IGJvdW5kcy5oZWlnaHQ7Ci0JCX0KLQotCQlpZiAocmVzdWx0LndpZHRoID4gYm91bmRzLndpZHRoKSB7Ci0JCQlyZXN1bHQud2lkdGggPSBib3VuZHMud2lkdGg7Ci0JCX0KLQotCQlyZXN1bHQueCA9IE1hdGgubWF4KGJvdW5kcy54LCBNYXRoLm1pbihyZXN1bHQueCwgYm91bmRzLngKLQkJCQkrIGJvdW5kcy53aWR0aCAtIHJlc3VsdC53aWR0aCkpOwotCQlyZXN1bHQueSA9IE1hdGgubWF4KGJvdW5kcy55LCBNYXRoLm1pbihyZXN1bHQueSwgYm91bmRzLnkKLQkJCQkrIGJvdW5kcy5oZWlnaHQgLSByZXN1bHQuaGVpZ2h0KSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaGVsbCBzdHlsZSBiaXRzLiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGFmdGVyIHRoZSBzaGVsbCBpcwotCSAqIGNyZWF0ZWQuCi0JICogPHA+Ci0JICogVGhlIHNoZWxsIHN0eWxlIGJpdHMgYXJlIHVzZWQgYnkgdGhlIGZyYW1ld29yayBtZXRob2QKLQkgKiA8Y29kZT5jcmVhdGVTaGVsbDwvY29kZT4gd2hlbiBjcmVhdGluZyB0aGlzIHdpbmRvdydzIHNoZWxsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2hlbGxTdHlsZQotCSAqICAgICAgICAgICAgdGhlIG5ldyBzaGVsbCBzdHlsZSBiaXRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2hlbGxTdHlsZShpbnQgbmV3U2hlbGxTdHlsZSkgewotCQlzaGVsbFN0eWxlID0gbmV3U2hlbGxTdHlsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3aW5kb3cgbWFuYWdlciBvZiB0aGlzIHdpbmRvdy4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgdXNlZCBieSA8Y29kZT5XaW5kb3dNYW5hZ2VyPC9jb2RlPiB0byBtYWludGFpbgotCSAqIGEgYmFja3BvaW50ZXIuIENsaWVudHMgbXVzdCBub3QgY2FsbCB0aGUgbWV0aG9kIGRpcmVjdGx5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIHdpbmRvdyBtYW5hZ2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJd2luZG93TWFuYWdlciA9IG1hbmFnZXI7Ci0KLQkJLy8gQ29kZSB0byBkZXRlY3QgaW52YWxpZCB1c2FnZQotCi0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCVdpbmRvd1tdIHdpbmRvd3MgPSBtYW5hZ2VyLmdldFdpbmRvd3MoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93cy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh3aW5kb3dzW2ldID09IHRoaXMpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCW1hbmFnZXIuYWRkKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IG9ubHkgb25lIGhhbmRsZXIgbWF5IGJlIHNldC4gT3RoZXIgY2FsbHMgdG8gdGhpcyBtZXRob2Qgd2lsbCBiZQotCSAqIGlnbm9yZWQuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGhhbmRsZXIKLQkgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gaGFuZGxlciBmb3IgdGhlIGFwcGxpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeGNlcHRpb25IYW5kbGVyKElFeGNlcHRpb25IYW5kbGVyIGhhbmRsZXIpIHsKLQkJaWYgKGV4Y2VwdGlvbkhhbmRsZXIgaW5zdGFuY2VvZiBEZWZhdWx0RXhjZXB0aW9uSGFuZGxlcikKLQkJCWV4Y2VwdGlvbkhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHBhcmVudCBmb3IgbW9kYWwgV2luZG93cy4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gbG9jYXRlCi0gICAgICogdGhlIHBhcmVudCBmb3IgYW55IG1vZGFsIFdpbmRvdyBjb25zdHJ1Y3RlZCB3aXRoIGEgbnVsbCBwYXJlbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3ZpZGVyIHNoZWxsIHByb3ZpZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGxvY2F0ZSB0aGUgcGFyZW50IHNoZWxsCi0gICAgICogd2hlbmV2ZXIgYSBXaW5kb3cgaXMgY3JlYXRlZCB3aXRoIGEgbnVsbCBwYXJlbnQKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRNb2RhbFBhcmVudChJU2hlbGxQcm92aWRlciBwcm92aWRlcikgewotICAgICAgICBkZWZhdWx0TW9kYWxQYXJlbnQgPSBwcm92aWRlcjsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBvcmllbnRhdGlvbiBmb3Igd2luZG93cy4gSWYgaXQgaXMgbm90Ci0JICogc2V0IHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdW5zcGVjaWZpZWQgKFNXVCNOT05FKS4KLQkgKiAKLQkgKiAKLQkgKiBAcmV0dXJuIFNXVCNOT05FLCBTV1QuUklHSFRfVE9fTEVGVCBvciBTV1QuTEVGVF9UT19SSUdIVAotCSAqIEBzZWUgU1dUI1JJR0hUX1RPX0xFRlQKLQkgKiBAc2VlIFNXVCNMRUZUX1RPX1JJR0hUCi0JICogQHNlZSBTV1QjTk9ORQotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0T3JpZW50YXRpb24oKSB7Ci0JCXJldHVybiBvcmllbnRhdGlvbjsKLQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgb3JpZW50YXRpb24gb2Ygd2luZG93cy4KLQkgKiBAcGFyYW0gZGVmYXVsdE9yaWVudGF0aW9uIG9uZSBvZiAKLQkgKiAJU1dUI1JJR0hUX1RPX0xFRlQsIFNXVCNMRUZUX1RPX1JJR0hUICxTV1QjTk9ORQotCSAqIEBzZWUgU1dUI1JJR0hUX1RPX0xFRlQKLQkgKiBAc2VlIFNXVCNMRUZUX1RPX1JJR0hUCi0JICogQHNlZSBTV1QjTk9ORQotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdE9yaWVudGF0aW9uKGludCBkZWZhdWx0T3JpZW50YXRpb24pIHsKLQkJb3JpZW50YXRpb24gPSBkZWZhdWx0T3JpZW50YXRpb247Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2luZG93L1dpbmRvd01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpbmRvdy9XaW5kb3dNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWNjMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2luZG93L1dpbmRvd01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uud2luZG93OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBBIG1hbmFnZXIgZm9yIGEgZ3JvdXAgb2Ygd2luZG93cy4gV2luZG93IG1hbmFnZXJzIGFyZSBhbiBvcHRpb25hbCBKRmFjZSAKLSAqIGZlYXR1cmUgdXNlZCBpbiBhcHBsaWNhdGlvbnMgd2hpY2ggY3JlYXRlIG1hbnkgZGlmZmVyZW50IHdpbmRvd3MgKGRpYWxvZ3MsCi0gKiB3aXphcmRzLCBldGMuKSBpbiBhZGRpdGlvbiB0byBhIG1haW4gd2luZG93LiBBIHdpbmRvdyBtYW5hZ2VyIGNhbiBiZSB1c2VkIHRvCi0gKiByZW1lbWJlciBhbGwgdGhlIHdpbmRvd3MgdGhhdCBhbiBhcHBsaWNhdGlvbiBoYXMgY3JlYXRlZCAoaW5kZXBlbmRlbnQgb2YgCi0gKiB3aGV0aGVyIHRoZXkgYXJlIHByZXNlbnRseSBvcGVuIG9yIGNsb3NlZCkuIFRoZXJlIGNhbiBiZSBzZXZlcmFsIHdpbmRvdwotICogbWFuYWdlcnMsIGFuZCB0aGV5IGNhbiBiZSBhcnJhbmdlZCBpbnRvIGEgdHJlZS4gVGhpcyBraW5kIG9mIG9yZ2FuaXphdGlvbiAKLSAqIG1ha2VzIGl0IHNpbXBsZSB0byBjbG9zZSB3aG9sZSBzdWJncm91cGluZ3Mgb2Ygd2luZG93cy4KLSAqIDxwPgotICogQ3JlYXRpbmcgYSB3aW5kb3cgbWFuYWdlciBpcyBhcyBzaW1wbGUgYXMgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgCi0gKiA8Y29kZT5XaW5kb3dNYW5hZ2VyPC9jb2RlPi4gQXNzb2NpYXRpbmcgYSB3aW5kb3cgd2l0aCBhIHdpbmRvdyBtYW5hZ2VyIGlzIAotICogZG9uZSB3aXRoIDxjb2RlPldpbmRvd01hbmFnZXIuYWRkKFdpbmRvdyk8L2NvZGU+LiBBIHdpbmRvdyBpcyBhdXRvbWF0aWNhbGx5Ci0gKiByZW1vdmVkIGZyb20gaXRzIHdpbmRvdyBtYW5hZ2VyIGFzIGEgc2lkZSBlZmZlY3Qgb2YgY2xvc2luZyB0aGUgd2luZG93LgotICogPC9wPgotICoKLSAqIEBzZWUgV2luZG93Ci0gKi8KLXB1YmxpYyBjbGFzcyBXaW5kb3dNYW5hZ2VyIHsKLQotICAgIC8qKgotICAgICAqIExpc3Qgb2Ygd2luZG93cyBtYW5hZ2VkIGJ5IHRoaXMgd2luZG93IG1hbmFnZXIKLSAgICAgKiAoZWxlbWVudCB0eXBlOiA8Y29kZT5XaW5kb3c8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdCB3aW5kb3dzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiB3aW5kb3cgbWFuYWdlcnMgd2hvIGhhdmUgdGhpcyB3aW5kb3cgbWFuYWdlcgotICAgICAqIGFzIHRoZWlyIHBhcmVudCAoZWxlbWVudCB0eXBlOiA8Y29kZT5XaW5kb3dNYW5hZ2VyPC9jb2RlPikuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IHN1Yk1hbmFnZXJzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbXB0eSB3aW5kb3cgbWFuYWdlciB3aXRob3V0IGEgcGFyZW50IHdpbmRvdwotICAgICAqIG1hbmFnZXIgKHRoYXQgaXMsIGEgcm9vdCB3aW5kb3cgbWFuYWdlcikuCi0gICAgICovCi0gICAgcHVibGljIFdpbmRvd01hbmFnZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbXB0eSB3aW5kb3cgbWFuYWdlciB3aXRoIHRoZSBnaXZlbgotICAgICAqIHdpbmRvdyBtYW5hZ2VyIGFzIHBhcmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCB3aW5kb3cgbWFuYWdlcgotICAgICAqLwotICAgIHB1YmxpYyBXaW5kb3dNYW5hZ2VyKFdpbmRvd01hbmFnZXIgcGFyZW50KSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwocGFyZW50KTsKLSAgICAgICAgcGFyZW50LmFkZFdpbmRvd01hbmFnZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gd2luZG93IHRvIHRoZSBzZXQgb2Ygd2luZG93cyBtYW5hZ2VkIGJ5Ci0gICAgICogdGhpcyB3aW5kb3cgbWFuYWdlci4gRG9lcyBub3RoaW5nIGlzIHRoaXMgd2luZG93IGlzCi0gICAgICogYWxyZWFkeSBtYW5hZ2VkIGJ5IHRoaXMgd2luZG93IG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2luZG93IHRoZSB3aW5kb3cKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoV2luZG93IHdpbmRvdykgewotICAgICAgICBpZiAoIXdpbmRvd3MuY29udGFpbnMod2luZG93KSkgewotICAgICAgICAgICAgd2luZG93cy5hZGQod2luZG93KTsKLSAgICAgICAgICAgIHdpbmRvdy5zZXRXaW5kb3dNYW5hZ2VyKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gd2luZG93IG1hbmFnZXIgdG8gdGhlIGxpc3Qgb2YKLSAgICAgKiB3aW5kb3cgbWFuYWdlcnMgdGhhdCBoYXZlIHRoaXMgb25lIGFzIGEgcGFyZW50LgotICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gd20gdGhlIGNoaWxkIHdpbmRvdyBtYW5hZ2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSkgewotICAgICAgICBpZiAoc3ViTWFuYWdlcnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHN1Yk1hbmFnZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoIXN1Yk1hbmFnZXJzLmNvbnRhaW5zKHdtKSkgewotICAgICAgICAgICAgc3ViTWFuYWdlcnMuYWRkKHdtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIGNsb3NlIGFsbCB3aW5kb3dzIG1hbmFnZWQgYnkgdGhpcyB3aW5kb3cgbWFuYWdlciwKLSAgICAgKiBhcyB3ZWxsIGFzIHdpbmRvd3MgbWFuYWdlZCBieSBhbnkgZGVzY2VuZGVudCB3aW5kb3cgbWFuYWdlcnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCB3aW5kb3dzIHdlcmUgc3VjZXNzZnVsbHkgY2xvc2VkLCAKLSAgICAgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGFueSB3aW5kb3cgcmVmdXNlZCB0byBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotICAgICAgICBMaXN0IHQgPSAoTGlzdCkgd2luZG93cy5jbG9uZSgpOyAvLyBtYWtlIGl0ZXJhdGlvbiByb2J1c3QgCi0gICAgICAgIEl0ZXJhdG9yIGUgPSB0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc05leHQoKSkgewotICAgICAgICAgICAgV2luZG93IHdpbmRvdyA9IChXaW5kb3cpIGUubmV4dCgpOwotICAgICAgICAgICAgYm9vbGVhbiBjbG9zZWQgPSB3aW5kb3cuY2xvc2UoKTsKLSAgICAgICAgICAgIGlmICghY2xvc2VkKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3ViTWFuYWdlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZSA9IHN1Yk1hbmFnZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyIHdtID0gKFdpbmRvd01hbmFnZXIpIGUubmV4dCgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gY2xvc2VkID0gd20uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB3aW5kb3cgbWFuYWdlcidzIG51bWJlciBvZiB3aW5kb3dzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHdpbmRvd3MKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRXaW5kb3dDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIHdpbmRvd3Muc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB3aW5kb3cgbWFuYWdlcidzIHNldCBvZiB3aW5kb3dzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2Ygd2luZG93Ci0gICAgICovCi0gICAgcHVibGljIFdpbmRvd1tdIGdldFdpbmRvd3MoKSB7Ci0gICAgICAgIFdpbmRvdyBic1tdID0gbmV3IFdpbmRvd1t3aW5kb3dzLnNpemUoKV07Ci0gICAgICAgIHdpbmRvd3MudG9BcnJheShicyk7Ci0gICAgICAgIHJldHVybiBiczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiB3aW5kb3cgZnJvbSB0aGUgc2V0IG9mIHdpbmRvd3MgbWFuYWdlZCBieQotICAgICAqIHRoaXMgd2luZG93IG1hbmFnZXIuIERvZXMgbm90aGluZyBpcyB0aGlzIHdpbmRvdyBpcwotICAgICAqIG5vdCBtYW5hZ2VkIGJ5IHRoaXMgd2luZG93IG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2luZG93IHRoZSB3aW5kb3cKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmUoV2luZG93IHdpbmRvdykgewotICAgICAgICBpZiAod2luZG93cy5jb250YWlucyh3aW5kb3cpKSB7Ci0gICAgICAgICAgICB3aW5kb3dzLnJlbW92ZSh3aW5kb3cpOwotICAgICAgICAgICAgd2luZG93LnNldFdpbmRvd01hbmFnZXIobnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aW5kb3cvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2luZG93L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2NzY4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aW5kb3cvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIGEgZ2VuZXJhbCBmcmFtZXdvcmsgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZwotd2luZG93cy4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci1BIEpGYWNlIHdpbmRvdyBpcyBhbiBvYmplY3QgdGhhdCBoYXMgbm8gdmlzdWFsIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKQotdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLiBBbGwgSkZhY2Ugd2luZG93cywgaW5jbHVkaW5nIGRpYWxvZ3MsIGFyZSBpbnN0YW5jZXMKLW9mIHRoZSBhYnN0cmFjdCBjbGFzcyA8dHQ+V2luZG93PC90dD4gb3IgYSBzdWJjbGFzcy4gVGhpcyBwYWNrYWdlIGNvbnRhaW5zCi10aGUgYmFzZSB3aW5kb3cgY2xhc3NlczoKLTx0dD5XaW5kb3c8L3R0PiBpdHNlbGYsIHdoaWNoIHByb3ZpZGVzIHN1cHBvcnQKLWZvciBhIGJhc2ljIHdpbmRvd3M7IGFuZCA8dHQ+QXBwbGljYXRpb25XaW5kb3c8L3R0Piwgd2hpY2ggcHJvdmlkZXMgcmVhZHktdG8tdXNlCi1zdXBwb3J0IGZvciBhIGhpZ2gtbGV2ZWwgIm1haW4gd2luZG93IiB3aXRoIHN0YW5kYXJkIG1lbnVzLCB0b29sIGJhciwgYW5kCi1zdGF0dXMgbGluZS4gQm90aCBvZiB0aGVzZSBjbGFzc2VzIG1heSBiZSBzdWJjbGFzc2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsCi10eXBlcyBvZiB3aW5kb3cgYXMgcmVxdWlyZWQuCi08cD5UaGlzIHBhY2thZ2UgYWxzbyBjb250YWlucyA8dHQ+V2luZG93TWFuYWdlcjwvdHQ+LCBpbnN0YW5jZSBvZiB3aGljaAotYXJlIHVzZWQgZm9yIG1hbmFnaW5nIGEgZ3JvdXAgb2Ygd2luZG93cy4gV2luZG93IG1hbmFnZXJzIGFyZSB1c2VmdWwgaW4KLWFwcGxpY2F0aW9ucyB3aGljaCBjcmVhdGUgbWFueSBkaWZmZXJlbnQgd2luZG93cyAoZGlhbG9ncywgd2l6YXJkcywgZXRjLikKLWluIGFkZGl0aW9uIHRvIGEgbWFpbiB3aW5kb3cuIFdpbmRvdyBtYW5hZ2VycyBhcmUgbm90IHJlcXVpcmVkIGZvciBzaW1wbGUKLWFwcGxpY2F0aW9ucy4KLTxwPlRoZSBvbmx5IGdsb2JhbCBzdGF0ZSBtYWludGFpbmVkIGJ5IGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGlzIGEgZGVmYXVsdAotaW1hZ2UgZm9yIHdpbmRvdyB0aXRsZSBiYXJzICg8dHQ+V2luZG93LnNldERlZmF1bHRJbWFnZTwvdHQ+KS4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9JV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvSVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDA3NmQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9JV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGEgd2l6YXJkLiAgQSB3aXphcmQgbWFpbnRhaW5zIGEgbGlzdCBvZiB3aXphcmQgcGFnZXMsCi0gKiBzdGFja2VkIG9uIHRvcCBvZiBlYWNoIG90aGVyIGluIGNhcmQgbGF5b3V0IGZhc2hpb24uCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyA8Y29kZT5XaXphcmQ8L2NvZGU+IHByb3ZpZGVzIGFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uCi0gKiBvZiB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgY2xpZW50cyBhcmUgYWxzbyBmcmVlIHRvIGltcGxlbWVudCB0aGlzIAotICogaW50ZXJmYWNlIGlmIDxjb2RlPldpemFyZDwvY29kZT4gZG9lcyBub3Qgc3VpdCB0aGVpciBuZWVkcy4KLSAqIDwvcD4KLSAqIEBzZWUgV2l6YXJkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdpemFyZCB7Ci0gICAgLyoqCi0gICAgICogQWRkcyBhbnkgbGFzdC1taW51dGUgcGFnZXMgdG8gdGhpcyB3aXphcmQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIHRoZSB3aXphcmQgYmVjb21lcyB2aXNpYmxlLCB0byBnaXZlIHRoZSAKLSAgICAgKiB3aXphcmQgdGhlIG9wcG9ydHVuaXR5IHRvIGFkZCBhbnkgbGF6aWx5IGNyZWF0ZWQgcGFnZXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB3aXphcmQgY291bGQgYmUgZmluaXNoZWQgd2l0aG91dCBmdXJ0aGVyIHVzZXIKLSAgICAgKiBpbnRlcmFjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkIGJ5IHRoZSB3aXphcmQgY29udGFpbmVyIHRvIGVuYWJsZQotICAgICAqIG9yIGRpc2FibGUgdGhlIEZpbmlzaCBidXR0b24uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgd2l6YXJkIGNvdWxkIGJlIGZpbmlzaGVkLAotICAgICAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhpcyB3aXphcmQncyBjb250cm9scyBpbiB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRyb2wuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHdpemFyZCBjb250YWluZXIgY2FsbHMgdGhpcyBtZXRob2QgdG8gY3JlYXRlIHRoZSBjb250cm9scwotICAgICAqIGZvciB0aGUgd2l6YXJkJ3MgcGFnZXMgYmVmb3JlIHRoZSB3aXphcmQgaXMgb3BlbmVkLiBUaGlzIGFsbG93cwotICAgICAqIHRoZSB3aXphcmQgdG8gc2l6ZSBjb3JyZWN0bHk7IG90aGVyd2lzZSBhIHJlc2l6ZSBtYXkgb2NjdXIgd2hlbgotICAgICAqIG1vdmluZyB0byBhIG5ldyBwYWdlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlQ29udGFpbmVyIHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlcyBvZiB0aGlzIHdpemFyZCBhbmQgZnJlZXMgYWxsIFNXVCByZXNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGFpbmVyIG9mIHRoaXMgd2l6YXJkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgd2l6YXJkIGNvbnRhaW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcwotICAgICAqICAgd2l6YXJkIGhhcyB5ZXQgdG8gYmUgYWRkZWQgdG8gYSBjb250YWluZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdpemFyZENvbnRhaW5lciBnZXRDb250YWluZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgcGFnZSBpbWFnZSBmb3IgdGhpcyB3aXphcmQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbWFnZSBjYW4gYmUgdXNlZCBmb3IgcGFnZXMgd2hpY2ggZG8gbm90Ci0gICAgICogc3VwcGx5IHRoZWlyIG93biBpbWFnZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHBhZ2UgaW1hZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0RGVmYXVsdFBhZ2VJbWFnZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlhbG9nIHNldHRpbmdzIGZvciB0aGlzIHdpemFyZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGlhbG9nIHN0b3JlIGlzIHVzZWQgdG8gcmVjb3JkIHN0YXRlIGJldHdlZW4KLSAgICAgKiB3aXphcmQgaW52b2NhdGlvbnMgKGZvciBleGFtcGxlLCByYWRpbyBidXR0b24gc2VsZWN0aW9ucywKLSAgICAgKiBsYXN0IGRpcmVjdG9yeSwgZXRjLikuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZGlhbG9nIHNldHRpbmdzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBnaXZlbiBwYWdlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSBjYWxsZWQgYnkgYSB3aXphcmQgcGFnZQotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlIHRoZSBwYWdlCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBwYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBiZWxvbmdpbmcgdG8gdGhpcyB3aXphcmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFnZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHdpemFyZCBwYWdlCi0gICAgICogQHJldHVybiB0aGUgd2l6YXJkIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQYWdlKFN0cmluZyBwYWdlTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFnZXMgaW4gdGhpcyB3aXphcmQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygd2l6YXJkIHBhZ2VzCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQYWdlQ291bnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSBwYWdlcyBpbiB0aGlzIHdpemFyZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHBhZ2VzCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlW10gZ2V0UGFnZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZWRlY2Vzc29yIG9mIHRoZSBnaXZlbiBwYWdlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSBjYWxsZWQgYnkgYSB3aXphcmQgcGFnZQotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlIHRoZSBwYWdlCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgcGFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoSVdpemFyZFBhZ2UgcGFnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBwYWdlIHRvIGJlIHNob3duIGluIHRoaXMgd2l6YXJkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZmlyc3Qgd2l6YXJkIHBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0U3RhcnRpbmdQYWdlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aXRsZSBiYXIgY29sb3IgZm9yIHRoaXMgd2l6YXJkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdGl0bGUgYmFyIGNvbG9yCi0gICAgICovCi0gICAgcHVibGljIFJHQiBnZXRUaXRsZUJhckNvbG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3aW5kb3cgdGl0bGUgc3RyaW5nIGZvciB0aGlzIHdpemFyZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHdpbmRvdyB0aXRsZSBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyB0aXRsZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2luZG93VGl0bGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBoZWxwIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyB3aXphcmQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCBieSB0aGUgY29udGFpbmVyIHRvCi0gICAgICogc2hvdyBvciBoaWRlIHRoZSBIZWxwIGJ1dHRvbi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGhlbHAgaXMgYXZhaWxhYmxlLAotICAgICAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIHdpemFyZCBpcyBoZWxwbGVzcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSGVscEF2YWlsYWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgd2l6YXJkIG5lZWRzIFByZXZpb3VzIGFuZCBOZXh0IGJ1dHRvbnMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCBieSB0aGUgY29udGFpbmVyLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgUHJldmlvdXMgYW5kIE5leHQgYnV0dG9ucyBhcmUgcmVxdWlyZWQsCi0gICAgICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vbmUgYXJlIG5lZWRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG5lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgd2l6YXJkIG5lZWRzIGEgcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkIGJ5IHRoZSBjb250YWluZXIuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHByb2dyZXNzIG1vbml0b3IgaXMgcmVxdWlyZWQsCi0gICAgICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vbmUgaXMgbmVlZGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbmVlZHNQcm9ncmVzc01vbml0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGFueSBhY3Rpb25zIGFwcHJvcHJpYXRlIGluIHJlc3BvbnNlIHRvIHRoZSB1c2VyIAotICAgICAqIGhhdmluZyBwcmVzc2VkIHRoZSBDYW5jZWwgYnV0dG9uLCBvciByZWZ1c2UgaWYgY2FuY2VsaW5nCi0gICAgICogbm93IGlzIG5vdCBwZXJtaXR0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIGluZGljYXRlIHRoZSBjYW5jZWwgcmVxdWVzdAotICAgICAqICAgd2FzIGFjY2VwdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGluZGljYXRlCi0gICAgICogICB0aGF0IHRoZSBjYW5jZWwgcmVxdWVzdCB3YXMgcmVmdXNlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKTsKLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGFueSBhY3Rpb25zIGFwcHJvcHJpYXRlIGluIHJlc3BvbnNlIHRvIHRoZSB1c2VyIAotICAgICAqIGhhdmluZyBwcmVzc2VkIHRoZSBGaW5pc2ggYnV0dG9uLCBvciByZWZ1c2UgaWYgZmluaXNoaW5nCi0gICAgICogbm93IGlzIG5vdCBwZXJtaXR0ZWQuCi0gICAgICoKLSAgICAgKiBOb3JtYWxseSB0aGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBvbiB0aGUgY29udGFpbmVyJ3MKLSAgICAgKiBjdXJyZW50IHdpemFyZC4gSG93ZXZlciBpZiB0aGUgY3VycmVudCB3aXphcmQgaXMgYSBuZXN0ZWQgd2l6YXJkCi0gICAgICogdGhpcyBtZXRob2Qgd2lsbCBhbHNvIGJlIGNhbGxlZCBvbiBhbGwgd2l6YXJkcyBpbiBpdHMgcGFyZW50IGNoYWluLgotICAgICAqIFN1Y2ggcGFyZW50cyBtYXkgdXNlIHRoaXMgbm90aWZpY2F0aW9uIHRvIHNhdmUgc3RhdGUgZXRjLiBIb3dldmVyLAotICAgICAqIHRoZSB2YWx1ZSB0aGUgcGFyZW50cyByZXR1cm4gZnJvbSB0aGlzIG1ldGhvZCBpcyBpZ25vcmVkLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGUgZmluaXNoIHJlcXVlc3QKLSAgICAgKiAgIHdhcyBhY2NlcHRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBpbmRpY2F0ZQotICAgICAqICAgdGhhdCB0aGUgZmluaXNoIHJlcXVlc3Qgd2FzIHJlZnVzZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgY29udGFpbmVyIG9mIHRoaXMgd2l6YXJkLgotICAgICAqCi0gICAgICogQHBhcmFtIHdpemFyZENvbnRhaW5lciB0aGUgd2l6YXJkIGNvbnRhaW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKElXaXphcmRDb250YWluZXIgd2l6YXJkQ29udGFpbmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9JV2l6YXJkQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvSVdpemFyZENvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGYzZjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9JV2l6YXJkQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgY29udGFpbmVycyB0aGF0IGNhbiBob3N0IGEgd2l6YXJkLiBJdCBkaXNwbGF5cwotICogd2l6YXJkIHBhZ2VzLCBhdCBtb3N0IG9uZSBvZiB3aGljaCBpcyBjb25zaWRlcmVkCi0gKiB0aGUgY3VycmVudCBwYWdlLiA8Y29kZT5nZXRDdXJyZW50UGFnZTwvY29kZT4gcmV0dXJucyB0aGUKLSAqIGN1cnJlbnQgcGFnZTsgPGNvZGU+c2hvd1BhZ2U8L2NvZGU+IHByb2dyYW1tYXRpY2FsbHkgY2hhbmdlcyB0aGUKLSAqIHRoZSBjdXJyZW50IHBhZ2UuIE5vdGUgdGhhdCB0aGUgcGFnZXMgbmVlZCBub3QgYWxsIGJlbG9uZwotICogdG8gdGhlIHNhbWUgd2l6YXJkLgotICogPHA+Ci0gKiBUaGUgY2xhc3MgPGNvZGU+V2l6YXJkRGlhbG9nPC9jb2RlPiBwcm92aWRlcyBhIGZ1bGx5IGZ1bmN0aW9uYWwgCi0gKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSB3aGljaCB3aWxsIG1lZXQgdGhlIG5lZWRzIG9mCi0gKiBtb3N0IGNsaWVudHMuIEhvd2V2ZXIsIGNsaWVudHMgYXJlIGFsc28gZnJlZSB0byBpbXBsZW1lbnQgdGhpcyAKLSAqIGludGVyZmFjZSBpZiA8Y29kZT5XaXphcmREaWFsb2c8L2NvZGU+IGRvZXMgbm90IHN1aXQgdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEltcGxlbWVudG9ycyBhcmUgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBvZiB0aGVpciB3aXphcmRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXaXphcmRDb250YWluZXIgZXh0ZW5kcyBJUnVubmFibGVDb250ZXh0IHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHdpemFyZCBwYWdlIGZvciB0aGlzIGNvbnRhaW5lci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgd2l6YXJkIHBhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb250YWluZXIKLSAgICAgKiAgIGlzIG5vdCB5ZXQgc2hvd2luZyB0aGUgd2l6YXJkCi0gICAgICogQHNlZSAjc2hvd1BhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0Q3VycmVudFBhZ2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoZWxsIGZvciB0aGlzIHdpemFyZCBjb250YWluZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGVsbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB3aXphcmQKLSAgICAgKiAgIGNvbnRhaW5lciBkb2VzIG5vdCBoYXZlIGEgc2hlbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKTsKLQotICAgIC8qKgotICAgICAqIE1ha2VzIHRoZSBnaXZlbiBwYWdlIHZpc2libGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2UgZm9yIG5vcm1hbCBwYWdlCi0gICAgICogc2VxdWVuY2luZyAoYmFjaywgbmV4dCkgd2hpY2ggaXMgaGFuZGxlZCBieSB0aGUgCi0gICAgICogY29udGFpbmVyIGl0c2VsZi4gSXQgbWF5LCBob3dldmVyLCBiZSB1c2VkIHRvCi0gICAgICogbW92ZSB0byBhbm90aGVyIHBhZ2UgaW4gcmVzcG9uc2UgdG8gc29tZSBjdXN0b20KLSAgICAgKiBhY3Rpb24gc3VjaCBhcyBkb3VibGUgY2xpY2tpbmcgaW4gYSBsaXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlIHRoZSBwYWdlIHRvIHNob3cKLSAgICAgKiBAc2VlICNnZXRDdXJyZW50UGFnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dQYWdlKElXaXphcmRQYWdlIHBhZ2UpOwotCi0gICAgLyoqCi0gICAgICogQWRqdXN0cyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBCYWNrLCBOZXh0LCBhbmQgRmluaXNoIAotICAgICAqIGJ1dHRvbnMgdG8gcmVmbGVjdCB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgCi0gICAgICogcGFnZSBpbiB0aGlzIGNvbnRhaW5lci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGNvbnRhaW5lciBpdHNlbGYKLSAgICAgKiB3aGVuIGl0cyB3aXphcmQgcGFnZSBjaGFuZ2VzIGFuZCBtYXkgYmUgY2FsbGVkCi0gICAgICogYnkgdGhlIHBhZ2UgYXQgb3RoZXIgdGltZXMgdG8gZm9yY2UgYSBidXR0b24gc3RhdGUKLSAgICAgKiB1cGRhdGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJ1dHRvbnMoKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIG1lc3NhZ2UgKG9yIGVycm9yIG1lc3NhZ2UpIHNob3duIGluIHRoZSBtZXNzYWdlIGxpbmUgdG8gCi0gICAgICogcmVmbGVjdCB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFnZSBpbiB0aGlzIGNvbnRhaW5lci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGNvbnRhaW5lciBpdHNlbGYKLSAgICAgKiB3aGVuIGl0cyB3aXphcmQgcGFnZSBjaGFuZ2VzIGFuZCBtYXkgYmUgY2FsbGVkCi0gICAgICogYnkgdGhlIHBhZ2UgYXQgb3RoZXIgdGltZXMgdG8gZm9yY2UgYSBtZXNzYWdlIAotICAgICAqIHVwZGF0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlTWVzc2FnZSgpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdGl0bGUgYmFyICh0aXRsZSwgZGVzY3JpcHRpb24sIGFuZCBpbWFnZSkgdG8gCi0gICAgICogcmVmbGVjdCB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFnZSBpbiB0aGlzIGNvbnRhaW5lci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGNvbnRhaW5lciBpdHNlbGYKLSAgICAgKiB3aGVuIGl0cyB3aXphcmQgcGFnZSBjaGFuZ2VzIGFuZCBtYXkgYmUgY2FsbGVkCi0gICAgICogYnkgdGhlIHBhZ2UgYXQgb3RoZXIgdGltZXMgdG8gZm9yY2UgYSB0aXRsZSBiYXIgCi0gICAgICogdXBkYXRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVUaXRsZUJhcigpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgd2luZG93IHRpdGxlIHRvIHJlZmxlY3QgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IHdpemFyZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGNvbnRhaW5lciBpdHNlbGYKLSAgICAgKiB3aGVuIGl0cyB3aXphcmQgY2hhbmdlcyBhbmQgbWF5IGJlIGNhbGxlZAotICAgICAqIGJ5IHRoZSB3aXphcmQgYXQgb3RoZXIgdGltZXMgdG8gZm9yY2UgYSB3aW5kb3cgCi0gICAgICogdGl0bGUgY2hhbmdlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVXaW5kb3dUaXRsZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2l6YXJkL0lXaXphcmRDb250YWluZXIyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvSVdpemFyZENvbnRhaW5lcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlMzkwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvSVdpemFyZENvbnRhaW5lcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZDsKLQotLyoqCi0gKiA8cD48Y29kZT5JV2l6YXJkQ29udGFpbmVyMjwvY29kZT4gaXMgYSBzdXBwbGVtZW50IHRvIAotICogPGNvZGU+SVdpemFyZENvbnRhaW5lcjwvY29kZT4gdGhhdCBhZGRzIGEgbWV0aG9kIGZvciB1cGRhdGluZyB0aGUgc2l6ZSBvZiAKLSAqIHRoZSB3aXphcmQgc2hlbGwgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IHBhZ2UuPC9wPgotICogCi0gKiA8cD5UaGUgY2xhc3MgPGNvZGU+V2l6YXJkRGlhbG9nPC9jb2RlPiBwcm92aWRlcyBhIGZ1bGx5IGZ1bmN0aW9uYWwgCi0gKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSB3aGljaCB3aWxsIG1lZXQgdGhlIG5lZWRzIG9mCi0gKiBtb3N0IGNsaWVudHMuIEhvd2V2ZXIsIGNsaWVudHMgYXJlIGFsc28gZnJlZSB0byBpbXBsZW1lbnQgdGhpcyAKLSAqIGludGVyZmFjZSBpZiA8Y29kZT5XaXphcmREaWFsb2c8L2NvZGU+IGRvZXMgbm90IHN1aXQgdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXIKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2l6YXJkQ29udGFpbmVyMiBleHRlbmRzIElXaXphcmRDb250YWluZXIgewotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgd2luZG93IHNpemUgdG8gcmVmbGVjdCB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgd2l6YXJkLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgY29udGFpbmVyIGl0c2VsZgotICAgICAqIHdoZW4gaXRzIHdpemFyZCBjaGFuZ2VzIGFuZCBtYXkgYmUgY2FsbGVkCi0gICAgICogYnkgdGhlIHdpemFyZCBhdCBvdGhlciB0aW1lcyB0byBmb3JjZSBhIHdpbmRvdyAKLSAgICAgKiBzaXplIGNoYW5nZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlU2l6ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2l6YXJkL0lXaXphcmROb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvSVdpemFyZE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3NjI5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvSVdpemFyZE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLS8qKgotICogQSB3aXphcmQgbm9kZSBhY3RzIGEgcGxhY2Vob2xkZXIgZm9yIGEgcmVhbCB3aXphcmQgaW4gYSB3aXphcmQgCi0gKiBzZWxlY3Rpb24gcGFnZS4gSXQgaXMgZG9uZSBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIGFjdHVhbCBjcmVhdGlvbgotICogb2YgYSB3aXphcmQgY2FuIGJlIGRlZmVycmVkIHVudGlsIHRoZSB3aXphcmQgaXMgcmVhbGx5IG5lZWRlZC4KLSAqIDxwPgotICogV2hlbiBhIHdpemFyZCBub2RlIGNvbWVzIGludG8gZXhpc3RlbmNlLCBpdHMgd2l6YXJkIG1heSBvciBtYXkKLSAqIG5vdCBoYXZlIGJlZW4gY3JlYXRlZCB5ZXQ7IDxjb2RlPmlzQ29udGVudENyZWF0ZWQ8L2NvZGU+IGNhbgotICogYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2guIEEgbm9kZSBtYXkgYmUgYXNrZWQgZm9yIGl0cyB3aXphcmQKLSAqIHVzaW5nIDxjb2RlPmdldFdpemFyZDwvY29kZT4sIHdoaWNoIHdpbGwgZm9yY2UgaXQgdG8gYmUgY3JlYXRlZAotICogaWYgcmVxdWlyZWQuIE9uY2UgdGhlIGNsaWVudCBpcyBkb25lIHdpdGggYSB3aXphcmQgbm9kZSwgaXRzCi0gKiA8Y29kZT5kaXNwb3NlPC9jb2RlPm1ldGhvZCBtdXN0IGJlIGNhbGxlZCB0byBmcmVlIHVwIHRoZSB3aXphcmQ7Ci0gKiBvbmNlIGRpc3Bvc2VzLCB0aGUgbm9kZSBzaG91bGQgbm8gbG9uZ2VyIGJlIHVzZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzIHdpc2hpbmcgdG8KLSAqIHN1cHBvcnQgdGhpcyBraW5kIG9mIHdpemFyZCBwbGFjZWhvbGRlciBpbiBhIHdpemFyZCBzZWxlY3Rpb24gcGFnZS4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIFdpemFyZFNlbGVjdGlvblBhZ2UKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2l6YXJkTm9kZSB7Ci0gICAgLyoqCi0gICAgICogRGlzcG9zZXMgdGhlIHdpemFyZCBtYW5hZ2VkIGJ5IHRoaXMgbm9kZS4gRG9lcyBub3RoaW5nCi0gICAgICogaWYgdGhlIHdpemFyZCBoYXMgbm90IGJlZW4gY3JlYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIHRoZSBsYXN0IG1lc3NhZ2UgdGhhdCBzaG91bGQgZXZlciBiZSBzZW50IHRvIHRoaXMgbm9kZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXh0ZW50IG9mIHRoZSB3aXphcmQgZm9yIHRoaXMgbm9kZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY29udGVudCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQsIGNhbGxpbmcgdGhpcyBtZXRob2QKLSAgICAgKiBkb2VzIG5vdCB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiB0aGUgd2l6YXJkLiBUaGlzIGFsbG93cwotICAgICAqIHRoaXMgbm9kZSB0byBzdWdnZXN0IGFuIGV4dGVudCBpbiBhZHZhbmNlIG9mIGFjdHVhbGx5IGNyZWF0aW5nIAotICAgICAqIHRoZSB3aXphcmQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZXh0ZW50LCBvciA8Y29kZT4oLTEsIC0xKTwvY29kZT4gZXh0ZW50IGlzIG5vdCBrbm93bgotICAgICAqLwotICAgIHB1YmxpYyBQb2ludCBnZXRFeHRlbnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdpemFyZCB0aGlzIG5vZGUgc3RhbmRzIGZvci4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY29udGVudCBoYXMgbm90IGJlZW4gY3JlYXRlZCBiZWZvcmVoYW5kLCBjYWxsaW5nIHRoaXMKLSAgICAgKiBtZXRob2QgdHJpZ2dlcnMgdGhlIGNyZWF0aW9uIG9mIHRoZSB3aXphcmQgYW5kIGNhY2hlcyBpdCBzbyB0aGF0Ci0gICAgICogdGhlIGlkZW50aWNhbCB3aXphcmQgb2JqZWN0IGlzIHJldHVybmVkIG9uIHN1YnNlcXVlbnQgY2FsbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgd2l6YXJkCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmQgZ2V0V2l6YXJkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB3aXphcmQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhpcyBub2RlLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHdpemFyZCBoYXMgYmVlbiBjcmVhdGVkLAotICAgICAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnRDcmVhdGVkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvSVdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9JV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmQyNDliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9JV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIHdpemFyZCBwYWdlLgotICogPHA+Ci0gKiBUaGUgY2xhc3MgPGNvZGU+V2l6YXJkUGFnZTwvY29kZT4gcHJvdmlkZXMgYW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24KLSAqIG9mIHRoaXMgaW50ZXJmYWNlLiBIb3dldmVyLCBjbGllbnRzIGFyZSBhbHNvIGZyZWUgdG8gaW1wbGVtZW50IHRoaXMgCi0gKiBpbnRlcmZhY2UgaWYgPGNvZGU+V2l6YXJkUGFnZTwvY29kZT4gZG9lcyBub3Qgc3VpdCB0aGVpciBuZWVkcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJV2l6YXJkUGFnZSBleHRlbmRzIElEaWFsb2dQYWdlIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG5leHQgcGFnZSBjb3VsZCBiZSBkaXNwbGF5ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuZXh0IHBhZ2UgY291bGQgYmUgZGlzcGxheWVkLAotICAgICAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHBhZ2UncyBuYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdpemFyZCBwYWdlIHRoYXQgd291bGQgdG8gYmUgc2hvd24gaWYgdGhlIHVzZXIgd2FzIHRvCi0gICAgICogcHJlc3MgdGhlIE5leHQgYnV0dG9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV4dCB3aXphcmQgcGFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgdGhhdCB3b3VsZCB0byBiZSBzaG93biBpZiB0aGUgdXNlciB3YXMgdG8KLSAgICAgKiBwcmVzcyB0aGUgQmFjayBidXR0b24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyB3aXphcmQgcGFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdpemFyZCB0aGF0IGhvc3RzIHRoaXMgd2l6YXJkIHBhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB3aXphcmQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgcGFnZSBoYXMgbm90IGJlZW4KLSAgICAgKiAgIGFkZGVkIHRvIGFueSB3aXphcmQKLSAgICAgKiBAc2VlICNzZXRXaXphcmQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdpemFyZCBnZXRXaXphcmQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhZ2UgaXMgY29tcGxldGUgb3Igbm90LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdHlwaWNhbGx5IHVzZWQgYnkgdGhlIHdpemFyZCB0byBkZWNpZGUKLSAgICAgKiB3aGVuIGl0IGlzIG9rYXkgdG8gZmluaXNoLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBwYWdlIGlzIGNvbXBsZXRlLCBhbmQKLSAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aXphcmQgcGFnZSB0aGF0IHdvdWxkIHR5cGljYWxseSBiZSBzaG93biAKLSAgICAgKiBpZiB0aGUgdXNlciB3YXMgdG8gcHJlc3MgdGhlIEJhY2sgYnV0dG9uLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgY29udGFpbmVyLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlIHRoZSBwcmV2aW91cyB3aXphcmQgcGFnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzUGFnZShJV2l6YXJkUGFnZSBwYWdlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpemFyZCB0aGF0IGhvc3RzIHRoaXMgd2l6YXJkIHBhZ2UuCi0gICAgICogT25jZSBlc3RhYmxpc2hlZCwgYSBwYWdlJ3Mgd2l6YXJkIGNhbm5vdCBiZSBjaGFuZ2VkCi0gICAgICogdG8gYSBkaWZmZXJlbnQgd2l6YXJkLgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld1dpemFyZCB0aGUgd2l6YXJkCi0gICAgICogQHNlZSAjZ2V0V2l6YXJkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V2l6YXJkKElXaXphcmQgbmV3V2l6YXJkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9Qcm9ncmVzc01vbml0b3JQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvUHJvZ3Jlc3NNb25pdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjM5NTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9Qcm9ncmVzc01vbml0b3JQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yV2l0aEJsb2NraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBBIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIGFuIElQcm9ncmVzc01vbml0b3IuIEl0IGNvbnNpc3RzCi0gKiBvZiBhIGxhYmVsIGRpc3BsYXlpbmcgdGhlIHRhc2sgYW5kIHN1YnRhc2sgbmFtZSwgYW5kIGEKLSAqIHByb2dyZXNzIGluZGljYXRvciB0byBzaG93IHByb2dyZXNzLiBJbiBjb250cmFzdCB0byAKLSAqIDxjb2RlPlByb2dyZXNzTW9uaXRvckRpYWxvZzwvY29kZT4gdGhpcyBjbGFzcyBvbmx5IGltcGxlbWVudHMKLSAqIDxjb2RlPklQcm9ncmVzc01vbml0b3I8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgUHJvZ3Jlc3NNb25pdG9yUGFydCBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzCi0gICAgICAgIElQcm9ncmVzc01vbml0b3JXaXRoQmxvY2tpbmcgewotCi0gICAgcHJvdGVjdGVkIExhYmVsIGZMYWJlbDsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZlRhc2tOYW1lOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmU3ViVGFza05hbWU7Ci0KLSAgICBwcm90ZWN0ZWQgUHJvZ3Jlc3NJbmRpY2F0b3IgZlByb2dyZXNzSW5kaWNhdG9yOwotCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgZkNhbmNlbENvbXBvbmVudDsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGZJc0NhbmNlbGVkOwotCi0gICAgcHJvdGVjdGVkIElTdGF0dXMgYmxvY2tlZFN0YXR1czsKLQotICAgIHByb3RlY3RlZCBMaXN0ZW5lciBmQ2FuY2VsTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgICAgIHNldENhbmNlbGVkKHRydWUpOwotICAgICAgICAgICAgaWYgKGZDYW5jZWxDb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBmQ2FuY2VsQ29tcG9uZW50LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBQcm9ncmVzc01vbml0b3JQYXJ0LgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIFNXVCBwYXJlbnQgb2YgdGhlIHBhcnQuCi0gICAgICogQHBhcmFtIGxheW91dCBUaGUgU1dUIGdyaWQgYmFnIGxheW91dCB1c2VkIGJ5IHRoZSBwYXJ0LiBBIGNsaWVudAotICAgICAqIGNhbiBzdXBwbHkgdGhlIGxheW91dCB0byBjb250cm9sIGhvdyB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBwYXJ0Ci0gICAgICogaXMgbGF5ZWQgb3V0LiBJZiBudWxsIGlzIHBhc3NlZCB0aGUgcGFydCB1c2VzIGl0cyBkZWZhdWx0IGxheW91dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvZ3Jlc3NNb25pdG9yUGFydChDb21wb3NpdGUgcGFyZW50LCBMYXlvdXQgbGF5b3V0KSB7Ci0gICAgICAgIHRoaXMocGFyZW50LCBsYXlvdXQsIFNXVC5ERUZBVUxUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUHJvZ3Jlc3NNb25pdG9yUGFydC4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBTV1QgcGFyZW50IG9mIHRoZSBwYXJ0LgotICAgICAqIEBwYXJhbSBsYXlvdXQgVGhlIFNXVCBncmlkIGJhZyBsYXlvdXQgdXNlZCBieSB0aGUgcGFydC4gQSBjbGllbnQKLSAgICAgKiBjYW4gc3VwcGx5IHRoZSBsYXlvdXQgdG8gY29udHJvbCBob3cgdGhlIHByb2dyZXNzIG1vbml0b3IgcGFydAotICAgICAqIGlzIGxheWVkIG91dC4gSWYgbnVsbCBpcyBwYXNzZWQgdGhlIHBhcnQgdXNlcyBpdHMgZGVmYXVsdCBsYXlvdXQuCi0gICAgICogQHBhcmFtIHByb2dyZXNzSW5kaWNhdG9ySGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIHByb2dyZXNzIGluZGljYXRvciBpbiBwaXhlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvZ3Jlc3NNb25pdG9yUGFydChDb21wb3NpdGUgcGFyZW50LCBMYXlvdXQgbGF5b3V0LAotICAgICAgICAgICAgaW50IHByb2dyZXNzSW5kaWNhdG9ySGVpZ2h0KSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBpbml0aWFsaXplKGxheW91dCwgcHJvZ3Jlc3NJbmRpY2F0b3JIZWlnaHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF0dGFjaGVzIHRoZSBwcm9ncmVzcyBtb25pdG9yIHBhcnQgdG8gdGhlIGdpdmVuIGNhbmNlbAotICAgICAqIGNvbXBvbmVudC4gCi0gICAgICogQHBhcmFtIGNhbmNlbENvbXBvbmVudCB0aGUgY29udHJvbCB3aG9zZSBzZWxlY3Rpb24gd2lsbAotICAgICAqIHRyaWdnZXIgYSBjYW5jZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhdHRhY2hUb0NhbmNlbENvbXBvbmVudChDb250cm9sIGNhbmNlbENvbXBvbmVudCkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGNhbmNlbENvbXBvbmVudCk7Ci0gICAgICAgIGZDYW5jZWxDb21wb25lbnQgPSBjYW5jZWxDb21wb25lbnQ7Ci0gICAgICAgIGZDYW5jZWxDb21wb25lbnQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZkNhbmNlbExpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRzIDxjb2RlPklQcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrPC9jb2RlPi4KLSAgICAgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjYmVnaW5UYXNrKGphdmEubGFuZy5TdHJpbmcsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLSAgICAgICAgZlRhc2tOYW1lID0gbmFtZTsKLSAgICAgICAgdXBkYXRlTGFiZWwoKTsKLSAgICAgICAgaWYgKHRvdGFsV29yayA9PSBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04gfHwgdG90YWxXb3JrID09IDApIHsKLSAgICAgICAgICAgIGZQcm9ncmVzc0luZGljYXRvci5iZWdpbkFuaW1hdGVkVGFzaygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZlByb2dyZXNzSW5kaWNhdG9yLmJlZ2luVGFzayh0b3RhbFdvcmspOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50cyA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yLmRvbmU8L2NvZGU+LgotICAgICAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNkb25lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb25lKCkgewotICAgICAgICBmTGFiZWwuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBmUHJvZ3Jlc3NJbmRpY2F0b3Iuc2VuZFJlbWFpbmluZ1dvcmsoKTsKLSAgICAgICAgZlByb2dyZXNzSW5kaWNhdG9yLmRvbmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFc2NhcGVzIGFueSBvY2N1cnJlbmNlIG9mICcmJyBpbiB0aGUgZ2l2ZW4gU3RyaW5nIHNvIHRoYXQKLSAgICAgKiBpdCBpcyBub3QgY29uc2lkZXJlZCBhcyBhIG1uZW1vbmljCi0gICAgICogY2hhcmFjdGVyIGluIFNXVCBUb29sSXRlbXMsIE1lbnVJdGVtcywgQnV0dG9uIGFuZCBMYWJlbHMuCi0gICAgICogQHBhcmFtIGluIHRoZSBvcmlnaW5hbCBTdHJpbmcKLSAgICAgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQgU3RyaW5nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZXNjYXBlTWV0YUNoYXJhY3RlcnMoU3RyaW5nIGluKSB7Ci0gICAgICAgIGlmIChpbiA9PSBudWxsIHx8IGluLmluZGV4T2YoJyYnKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gaW47Ci0gICAgICAgIGludCBsZW5ndGggPSBpbi5sZW5ndGgoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgMSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IGluLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjID09ICcmJykKLSAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCImJiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBwcm9ncmVzcyBtb25pdG9yJ3MgVUkgcGFydHMgYW5kIGxheW91dHMgdGhlbQotICAgICAqIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gbGF5b3V0LiBJZiB0aGUgbGF5b3UgaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiB0aGUgcGFydCdzIGRlZmF1bHQgbGF5b3V0IGlzIHVzZWQuCi0gICAgICogQHBhcmFtIGxheW91dCBUaGUgbGF5b3V0Zm9yIHRoZSByZWNlaXZlci4KLSAgICAgKiBAcGFyYW0gcHJvZ3Jlc3NJbmRpY2F0b3JIZWlnaHQgVGhlIHN1Z2dlc3RlZCBoZWlnaHQgb2YgdGhlIGluZGljYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoTGF5b3V0IGxheW91dCwgaW50IHByb2dyZXNzSW5kaWNhdG9ySGVpZ2h0KSB7Ci0gICAgICAgIGlmIChsYXlvdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgR3JpZExheW91dCBsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgICAgIGwubWFyZ2luV2lkdGggPSAwOwotICAgICAgICAgICAgbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICAgICAgbC5udW1Db2x1bW5zID0gMTsKLSAgICAgICAgICAgIGxheW91dCA9IGw7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICAgICAgZkxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5MRUZUKTsKLSAgICAgICAgZkxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIGlmIChwcm9ncmVzc0luZGljYXRvckhlaWdodCA9PSBTV1QuREVGQVVMVCkgewotICAgICAgICAgICAgR0MgZ2MgPSBuZXcgR0MoZkxhYmVsKTsKLSAgICAgICAgICAgIEZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLSAgICAgICAgICAgIGdjLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHByb2dyZXNzSW5kaWNhdG9ySGVpZ2h0ID0gZm0uZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmUHJvZ3Jlc3NJbmRpY2F0b3IgPSBuZXcgUHJvZ3Jlc3NJbmRpY2F0b3IodGhpcyk7Ci0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgICAgIGdkLmhlaWdodEhpbnQgPSBwcm9ncmVzc0luZGljYXRvckhlaWdodDsKLSAgICAgICAgZlByb2dyZXNzSW5kaWNhdG9yLnNldExheW91dERhdGEoZ2QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudHMgPGNvZGU+SVByb2dyZXNzTW9uaXRvci5pbnRlcm5hbFdvcmtlZDwvY29kZT4uCi0gICAgICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI2ludGVybmFsV29ya2VkKGRvdWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgd29yaykgewotICAgICAgICBmUHJvZ3Jlc3NJbmRpY2F0b3Iud29ya2VkKHdvcmspOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudHMgPGNvZGU+SVByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkPC9jb2RlPi4KLSAgICAgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZJc0NhbmNlbGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGFjaCB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBwYXJ0IGZyb20gdGhlIGdpdmVuIGNhbmNlbAotICAgICAqIGNvbXBvbmVudAotICAgICAqIEBwYXJhbSBjYwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZyb21DYW5jZWxDb21wb25lbnQoQ29udHJvbCBjYykgewotICAgICAgICBBc3NlcnQuaXNUcnVlKGZDYW5jZWxDb21wb25lbnQgPT0gY2MgJiYgZkNhbmNlbENvbXBvbmVudCAhPSBudWxsKTsKLSAgICAgICAgZkNhbmNlbENvbXBvbmVudC5yZW1vdmVMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBmQ2FuY2VsTGlzdGVuZXIpOwotICAgICAgICBmQ2FuY2VsQ29tcG9uZW50ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRzIDxjb2RlPklQcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQ8L2NvZGU+LgotICAgICAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNzZXRDYW5jZWxlZChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gYikgewotICAgICAgICBmSXNDYW5jZWxlZCA9IGI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBwYXJ0J3MgZm9udC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgewotICAgICAgICBzdXBlci5zZXRGb250KGZvbnQpOwotICAgICAgICBmTGFiZWwuc2V0Rm9udChmb250KTsKLSAgICAgICAgZlByb2dyZXNzSW5kaWNhdG9yLnNldEZvbnQoZm9udCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3Ijc2V0VGFza05hbWUoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmVGFza05hbWUgPSBuYW1lOwotICAgICAgICB1cGRhdGVMYWJlbCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3N1YlRhc2soamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZTdWJUYXNrTmFtZSA9IG5hbWU7Ci0gICAgICAgIHVwZGF0ZUxhYmVsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgbGFiZWwgd2l0aCB0aGUgY3VycmVudCB0YXNrIGFuZCBzdWJ0YXNrIG5hbWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUxhYmVsKCkgewotICAgICAgICBpZiAoYmxvY2tlZFN0YXR1cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHRhc2tMYWJlbCgpOwotICAgICAgICAgICAgZkxhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgZkxhYmVsLnNldFRleHQoYmxvY2tlZFN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIC8vRm9yY2UgYW4gdXBkYXRlIGFzIHdlIGFyZSBpbiB0aGUgVUkgVGhyZWFkCi0gICAgICAgIGZMYWJlbC51cGRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGxhYmVsIGZvciBzaG93aW5nIHRhc2tzCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0YXNrTGFiZWwoKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gZlN1YlRhc2tOYW1lID09IG51bGwgPyAiIiA6IGZTdWJUYXNrTmFtZTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoZlRhc2tOYW1lICE9IG51bGwgJiYgZlRhc2tOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgdGV4dCA9IEpGYWNlUmVzb3VyY2VzLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlNldF9TdWJUYXNrIiwgbmV3IE9iamVjdFtdIHsgZlRhc2tOYW1lLCB0ZXh0IH0pOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXNjYXBlTWV0YUNoYXJhY3RlcnModGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50cyA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yLndvcmtlZDwvY29kZT4uCi0gICAgICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI3dvcmtlZChpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd29ya2VkKGludCB3b3JrKSB7Ci0gICAgICAgIGludGVybmFsV29ya2VkKHdvcmspOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yV2l0aEJsb2NraW5nI2NsZWFyQmxvY2tlZCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJCbG9ja2VkKCkgewotICAgICAgICBibG9ja2VkU3RhdHVzID0gbnVsbDsKLSAgICAgICAgdXBkYXRlTGFiZWwoKTsKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yV2l0aEJsb2NraW5nI3NldEJsb2NrZWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmxvY2tlZChJU3RhdHVzIHJlYXNvbikgewotICAgICAgICBibG9ja2VkU3RhdHVzID0gcmVhc29uOwotICAgICAgICB1cGRhdGVMYWJlbCgpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2l6YXJkL1dpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2l6YXJkL1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWRmYTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHdpemFyZC4gQSB0eXBpY2FsIGNsaWVudCBzdWJjbGFzc2VzCi0gKiA8Y29kZT5XaXphcmQ8L2NvZGU+IHRvIGltcGxlbWVudCBhIHBhcnRpY3VsYXIgd2l6YXJkLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG1heSBjYWxsIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0byBjb25maWd1cmUgdGhlIHdpemFyZDoKLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5hZGRQYWdlPC9jb2RlPjwvbGk+Ci0gKiA8bGk+PGNvZGU+c2V0SGVscEF2YWlsYWJsZTwvY29kZT48L2xpPgotICogPGxpPjxjb2RlPnNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yPC9jb2RlPjwvbGk+Ci0gKiA8bGk+PGNvZGU+c2V0RGlhbG9nU2V0dGluZ3M8L2NvZGU+PC9saT4KLSAqIDxsaT48Y29kZT5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcjwvY29kZT48L2xpPgotICogPGxpPjxjb2RlPnNldFRpdGxlQmFyQ29sb3I8L2NvZGU+PC9saT4KLSAqIDxsaT48Y29kZT5zZXRXaW5kb3dUaXRsZTwvY29kZT48L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhlc2UgbWV0aG9kcyBpZiByZXF1aXJlZDoKLSAqIDx1bD4KLSAqIDxsaT5yZWltcGxlbWVudCA8Y29kZT5jcmVhdGVQYWdlQ29udHJvbHM8L2NvZGU+PC9saT4KLSAqIDxsaT5yZWltcGxlbWVudCA8Y29kZT5wZXJmb3JtQ2FuY2VsPC9jb2RlPjwvbGk+Ci0gKiA8bGk+ZXh0ZW5kIDxjb2RlPmFkZFBhZ2VzPC9jb2RlPjwvbGk+Ci0gKiA8bGk+cmVpbXBsZW1lbnQgPGNvZGU+cGVyZm9ybUZpbmlzaDwvY29kZT48L2xpPgotICogPGxpPmV4dGVuZCA8Y29kZT5kaXNwb3NlPC9jb2RlPjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogPHA+Ci0gKiBOb3RlIHRoYXQgY2xpZW50cyBhcmUgZnJlZSB0byBpbXBsZW1lbnQgPGNvZGU+SVdpemFyZDwvY29kZT4gZnJvbSBzY3JhdGNoCi0gKiBpbnN0ZWFkIG9mIHN1YmNsYXNzaW5nIDxjb2RlPldpemFyZDwvY29kZT4uIENvcnJlY3QgaW1wbGVtZW50YXRpb25zIG9mCi0gKiA8Y29kZT5JV2l6YXJkPC9jb2RlPiB3aWxsIHdvcmsgd2l0aCBhbnkgY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZgotICogPGNvZGU+SVdpemFyZFBhZ2U8L2NvZGU+LgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2l6YXJkIGltcGxlbWVudHMgSVdpemFyZCB7Ci0gICAgLyoqCi0gICAgICogSW1hZ2UgcmVnaXN0cnkga2V5IG9mIHRoZSBkZWZhdWx0IGltYWdlIGZvciB3aXphcmQgcGFnZXMgKHZhbHVlCi0gICAgICogPGNvZGU+Im9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQucGFnZUltYWdlIjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSU1BR0UgPSAib3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZC5wYWdlSW1hZ2UiOy8vJE5PTi1OTFMtMSQKLSAgICAvKgotICAgICAqIFJlZ2lzdGVyIHRoZSBkZWZhdWx0IHBhZ2UgaW1hZ2UKLSAgICAgKi8KLSAgICBzdGF0aWMgewotICAgICAgICBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCkKLSAgICAgICAgICAgICAgICAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9JTUFHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShXaXphcmQuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZXMvcGFnZS5naWYiKSk7Ly8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB3aXphcmQgY29udGFpbmVyIHRoaXMgd2l6YXJkIGJlbG9uZ3MgdG87IDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJV2l6YXJkQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpemFyZCdzIGxpc3Qgb2YgcGFnZXMgKGVsZW1lbnQgdHlwZTogPGNvZGU+SVdpemFyZFBhZ2U8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgcGFnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHdpemFyZCBuZWVkcyBhIHByb2dyZXNzIG1vbml0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG5lZWRzUHJvZ3Jlc3NNb25pdG9yID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHdpemFyZCBuZWVkcyBwcmV2aW91cyBhbmQgbmV4dCBidXR0b25zIGV2ZW4gaWYgdGhlCi0gICAgICogd2l6YXJkIGhhcyBvbmx5IG9uZSBwYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgd2l6YXJkIHN1cHBvcnRzIGhlbHAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSGVscEF2YWlsYWJsZSA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgcGFnZSBpbWFnZSBmb3IgcGFnZXMgd2l0aG91dCBvbmUgb2YgdGhlaXIgb25lOwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJbWFnZSBkZWZhdWx0SW1hZ2UgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgcGFnZSBpbWFnZSBkZXNjcmlwdG9yLCB1c2VkIGZvciBjcmVhdGluZyBhIGRlZmF1bHQgcGFnZSBpbWFnZQotICAgICAqIGlmIHJlcXVpcmVkOyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqLwotICAgIHByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGRlZmF1bHRJbWFnZURlc2NyaXB0b3IgPSBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihERUZBVUxUX0lNQUdFKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb2xvciBvZiB0aGUgd2l6YXJkIHRpdGxlIGJhcjsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFJHQiB0aXRsZUJhckNvbG9yID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSB3aW5kb3cgdGl0bGUgc3RyaW5nIGZvciB0aGlzIHdpemFyZDsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB3aW5kb3dUaXRsZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGlhbG9nIHNldHRpbmdzIGZvciB0aGlzIHdpemFyZDsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGVtcHR5IHdpemFyZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgV2l6YXJkKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgcGFnZSB0byB0aGlzIHdpemFyZC4gVGhlIHBhZ2UgaXMgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgKiBwYWdlIGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcGFnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotICAgICAgICBwYWdlcy5hZGQocGFnZSk7Ci0gICAgICAgIHBhZ2Uuc2V0V2l6YXJkKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XaXphcmQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SVdpemFyZDwvY29kZT4KLSAgICAgKiBtZXRob2QgZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIHNob3VsZCBleHRlbmQgaWYgZXh0cmEgcGFnZXMgbmVlZCB0byBiZQotICAgICAqIGFkZGVkIGJlZm9yZSB0aGUgd2l6YXJkIG9wZW5zLiBOZXcgcGFnZXMgc2hvdWxkIGJlIGFkZGVkIGJ5IGNhbGxpbmcKLSAgICAgKiA8Y29kZT5hZGRQYWdlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotICAgICAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHRvIGNoZWNrIGlmIGFsbCBwYWdlcyBhcmUgY29tcGxldGUuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghKChJV2l6YXJkUGFnZSkgcGFnZXMuZ2V0KGkpKS5pc1BhZ2VDb21wbGV0ZSgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklXaXphcmQ8L2NvZGU+Ci0gICAgICogbWV0aG9kIGNyZWF0ZXMgYWxsIHRoZSBwYWdlcyBjb250cm9scyB1c2luZwotICAgICAqIDxjb2RlPklEaWFsb2dQYWdlLmNyZWF0ZUNvbnRyb2w8L2NvZGU+LiBTdWJjbGFzc2VzIHNob3VsZCByZWltcGxlbWVudAotICAgICAqIHRoaXMgbWV0aG9kIGlmIHRoZXkgd2FudCB0byBkZWxheSBjcmVhdGluZyBvbmUgb3IgbW9yZSBvZiB0aGUgcGFnZXMKLSAgICAgKiBsYXppbHkuIFRoZSBmcmFtZXdvcmsgZW5zdXJlcyB0aGF0IHRoZSBjb250ZW50cyBvZiBhIHBhZ2Ugd2lsbCBiZSBjcmVhdGVkCi0gICAgICogYmVmb3JlIGF0dGVtcHRpbmcgdG8gc2hvdyBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLSAgICAgICAgLy8gdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY3JlYXRlIGFsbCB0aGUgcGFnZXMgY29udHJvbHMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSVdpemFyZFBhZ2UgcGFnZSA9IChJV2l6YXJkUGFnZSkgcGFnZXMuZ2V0KGkpOwotICAgICAgICAgICAgcGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotICAgICAgICAgICAgLy8gcGFnZSBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhlIGNyZWF0ZWQgY29udHJvbCBpcwotICAgICAgICAgICAgLy8gYWNjZXNzYWJsZQotICAgICAgICAgICAgLy8gdmlhIGdldENvbnRyb2wuCi0gICAgICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHBhZ2UuZ2V0Q29udHJvbCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XaXphcmQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SVdpemFyZDwvY29kZT4KLSAgICAgKiBtZXRob2QgZGlzcG9zZXMgYWxsIHRoZSBwYWdlcyBjb250cm9scyB1c2luZwotICAgICAqIDxjb2RlPkRpYWxvZ1BhZ2UuZGlzcG9zZTwvY29kZT4uIFN1YmNsYXNzZXMgc2hvdWxkIGV4dGVuZCB0aGlzIG1ldGhvZAotICAgICAqIGlmIHRoZSB3aXphcmQgaW5zdGFuY2UgbWFpbnRhaW5zIGFkZGl0aW9uIFNXVCByZXNvdXJjZSB0aGF0IG5lZWQgdG8gYmUKLSAgICAgKiBkaXNwb3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAvLyBub3RpZnkgcGFnZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgKChJV2l6YXJkUGFnZSkgcGFnZXMuZ2V0KGkpKS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZGlzcG9zZSBvZiBpbWFnZQotICAgICAgICBpZiAoZGVmYXVsdEltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEpGYWNlUmVzb3VyY2VzLmdldFJlc291cmNlcygpLmRlc3Ryb3lJbWFnZShkZWZhdWx0SW1hZ2VEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIGRlZmF1bHRJbWFnZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgewotICAgICAgICByZXR1cm4gY29udGFpbmVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0RGVmYXVsdFBhZ2VJbWFnZSgpIHsKLSAgICAgICAgaWYgKGRlZmF1bHRJbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZWZhdWx0SW1hZ2UgPSBKRmFjZVJlc291cmNlcy5nZXRSZXNvdXJjZXMoKS5jcmVhdGVJbWFnZVdpdGhEZWZhdWx0KGRlZmF1bHRJbWFnZURlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWZhdWx0SW1hZ2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0gICAgICAgIHJldHVybiBkaWFsb2dTZXR0aW5nczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvCi0gICAgICogcmV0dXJuIHRoZSBwYWdlIHRoYXQgd2FzIGFkZGVkIHRvIHRoaXMgd2l6YXJkIGFmdGVyIHRoZSBnaXZlbiBwYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgIGludCBpbmRleCA9IHBhZ2VzLmluZGV4T2YocGFnZSk7Ci0gICAgICAgIGlmIChpbmRleCA9PSBwYWdlcy5zaXplKCkgLSAxIHx8IGluZGV4ID09IC0xKQotICAgICAgICAgICAgLy8gbGFzdCBwYWdlIG9yIHBhZ2Ugbm90IGZvdW5kCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIChJV2l6YXJkUGFnZSkgcGFnZXMuZ2V0KGluZGV4ICsgMSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQYWdlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIElXaXphcmRQYWdlIHBhZ2UgPSAoSVdpemFyZFBhZ2UpIHBhZ2VzLmdldChpKTsKLSAgICAgICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IHBhZ2UuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKHBhZ2VOYW1lLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFnZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQYWdlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBwYWdlcy5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZVtdIGdldFBhZ2VzKCkgewotICAgICAgICByZXR1cm4gKElXaXphcmRQYWdlW10pIHBhZ2VzLnRvQXJyYXkobmV3IElXaXphcmRQYWdlW3BhZ2VzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8KLSAgICAgKiByZXR1cm4gdGhlIHBhZ2UgdGhhdCB3YXMgYWRkZWQgdG8gdGhpcyB3aXphcmQgYmVmb3JlIHRoZSBnaXZlbiBwYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotICAgICAgICBpbnQgaW5kZXggPSBwYWdlcy5pbmRleE9mKHBhZ2UpOwotICAgICAgICBpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA9PSAtMSkKLSAgICAgICAgICAgIC8vIGZpcnN0IHBhZ2Ugb3IgcGFnZSBub3QgZm91bmQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gKElXaXphcmRQYWdlKSBwYWdlcy5nZXQoaW5kZXggLSAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3aXphcmQncyBzaGVsbCBpZiB0aGUgd2l6YXJkIGlzIHZpc2libGUuIE90aGVyd2lzZQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gU2hlbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0gICAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gY29udGFpbmVyLmdldFNoZWxsKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLiBCeSBkZWZhdWx0IHRoaXMgaXMgdGhlIGZpcnN0Ci0gICAgICogcGFnZSBpbnNlcnRlZCBpbnRvIHRoZSB3aXphcmQuCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldFN0YXJ0aW5nUGFnZSgpIHsKLSAgICAgICAgaWYgKHBhZ2VzLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoSVdpemFyZFBhZ2UpIHBhZ2VzLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIFJHQiBnZXRUaXRsZUJhckNvbG9yKCkgewotICAgICAgICByZXR1cm4gdGl0bGVCYXJDb2xvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXaW5kb3dUaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIHdpbmRvd1RpdGxlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hlbHBBdmFpbGFibGUoKSB7Ci0gICAgICAgIHJldHVybiBpc0hlbHBBdmFpbGFibGU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG5lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpIHsKLSAgICAgICAgcmV0dXJuIGZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyB8fCBwYWdlcy5zaXplKCkgPiAxOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc1Byb2dyZXNzTW9uaXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG5lZWRzUHJvZ3Jlc3NNb25pdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XaXphcmQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SVdpemFyZDwvY29kZT4KLSAgICAgKiBtZXRob2QgZG9lcyBub3RoaW5nIGFuZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LiBTdWJjbGFzc2VzIHNob3VsZAotICAgICAqIHJlaW1wbGVtZW50IHRoaXMgbWV0aG9kIGlmIHRoZXkgbmVlZCB0byBwZXJmb3JtIGFueSBzcGVjaWFsIGNhbmNlbAotICAgICAqIHByb2Nlc3NpbmcgZm9yIHRoZWlyIHdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgPGNvZGU+SVdpemFyZDwvY29kZT4gbWV0aG9kIHRvIHBlcmZvcm0KLSAgICAgKiBhbnkgc3BlY2lhbCBmaW5pc2ggcHJvY2Vzc2luZyBmb3IgdGhlaXIgd2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHBlcmZvcm1GaW5pc2goKTsKLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoSVdpemFyZENvbnRhaW5lciB3aXphcmRDb250YWluZXIpIHsKLSAgICAgICAgY29udGFpbmVyID0gd2l6YXJkQ29udGFpbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgcGFnZSBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGlzIHdpemFyZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltYWdlIGRlc2NyaXB0b3Igd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGFuIGltYWdlIGZvciBhIHBhZ2Ugd2l0aAotICAgICAqIG5vIGltYWdlIG9mIGl0cyBvd247IHRoZSBpbWFnZSB3aWxsIGJlIGNvbXB1dGVkIG9uY2UgYW5kIGNhY2hlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGltYWdlRGVzY3JpcHRvcgotICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgcGFnZSBpbWFnZSBkZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcikgewotICAgICAgICBkZWZhdWx0SW1hZ2VEZXNjcmlwdG9yID0gaW1hZ2VEZXNjcmlwdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRpYWxvZyBzZXR0aW5ncyBmb3IgdGhpcyB3aXphcmQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRpYWxvZyBzZXR0aW5ncyBpcyB1c2VkIHRvIHJlY29yZCBzdGF0ZSBiZXR3ZWVuIHdpemFyZCBpbnZvY2F0aW9ucwotICAgICAqIChmb3IgZXhhbXBsZSwgcmFkaW8gYnV0dG9uIHNlbGVjdGlvbiwgbGFzdCBpbXBvcnQgZGlyZWN0b3J5LCBldGMuKQotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2V0dGluZ3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBkaWFsb2cgc2V0dGluZ3MsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAc2VlICNnZXREaWFsb2dTZXR0aW5ncwotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaWFsb2dTZXR0aW5ncyhJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLSAgICAgICAgZGlhbG9nU2V0dGluZ3MgPSBzZXR0aW5nczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSB3aXphcmQgbmVlZHMgUHJldmlvdXMgYW5kIE5leHQgYnV0dG9ucyBldmVuIGlmIGl0Ci0gICAgICogY3VycmVudGx5IGNvbnRhaW5zIG9ubHkgb25lIHBhZ2UuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBmbGFnIHNob3VsZCBiZSBzZXQgb24gd2l6YXJkcyB3aGVyZSB0aGUgZmlyc3Qgd2l6YXJkIHBhZ2UgYWRkcwotICAgICAqIGZvbGxvdy1vbiB3aXphcmQgcGFnZXMgYmFzZWQgb24gdXNlciBpbnB1dC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGIKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIGFsd2F5cyBzaG93IE5leHQgYW5kIFByZXZpb3VzIGJ1dHRvbnMsCi0gICAgICogICAgICAgICAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHN1cHByZXNzIE5leHQgYW5kIFByZXZpb3VzIGJ1dHRvbnMKLSAgICAgKiAgICAgICAgICAgIGZvciBzaW5nbGUgcGFnZSB3aXphcmRzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKGJvb2xlYW4gYikgewotICAgICAgICBmb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMgPSBiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBoZWxwIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyB3aXphcmQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCBieSB0aGUgY29udGFpbmVyIHRvIHNob3cgb3IKLSAgICAgKiBoaWRlIHRoZSBIZWxwIGJ1dHRvbi4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGIKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIGhlbHAgaXMgYXZhaWxhYmxlLCBhbmQKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIHdpemFyZCBpcyBoZWxwbGVzcwotICAgICAqIEBzZWUgI2lzSGVscEF2YWlsYWJsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhlbHBBdmFpbGFibGUoYm9vbGVhbiBiKSB7Ci0gICAgICAgIGlzSGVscEF2YWlsYWJsZSA9IGI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRoaXMgd2l6YXJkIG5lZWRzIGEgcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYgotICAgICAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBwcm9ncmVzcyBtb25pdG9yIGlzIHJlcXVpcmVkLCBhbmQKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub25lIGlzIG5lZWRlZAotICAgICAqIEBzZWUgI25lZWRzUHJvZ3Jlc3NNb25pdG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcihib29sZWFuIGIpIHsKLSAgICAgICAgbmVlZHNQcm9ncmVzc01vbml0b3IgPSBiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRpdGxlIGJhciBjb2xvciBmb3IgdGhpcyB3aXphcmQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yCi0gICAgICogICAgICAgICAgICB0aGUgdGl0bGUgYmFyIGNvbG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGVCYXJDb2xvcihSR0IgY29sb3IpIHsKLSAgICAgICAgdGl0bGVCYXJDb2xvciA9IGNvbG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpbmRvdyB0aXRsZSBmb3IgdGhlIGNvbnRhaW5lciB0aGF0IGhvc3RzIHRoaXMgcGFnZSB0byB0aGUgZ2l2ZW4KLSAgICAgKiBzdHJpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5ld1RpdGxlCi0gICAgICogICAgICAgICAgICB0aGUgd2luZG93IHRpdGxlIGZvciB0aGUgY29udGFpbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V2luZG93VGl0bGUoU3RyaW5nIG5ld1RpdGxlKSB7Ci0gICAgICAgIHdpbmRvd1RpdGxlID0gbmV3VGl0bGU7Ci0gICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGNvbnRhaW5lci51cGRhdGVXaW5kb3dUaXRsZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9XaXphcmREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9XaXphcmREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJkOWQ3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvV2l6YXJkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Db250cm9sRW5hYmxlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklQYWdlQ2hhbmdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JUGFnZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5QYWdlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLk1vZGFsQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIGRpYWxvZyB0byBzaG93IGEgd2l6YXJkIHRvIHRoZSBlbmQgdXNlci4gCi0gKiA8cD4KLSAqIEluIHR5cGljYWwgdXNhZ2UsIHRoZSBjbGllbnQgaW5zdGFudGlhdGVzIHRoaXMgY2xhc3Mgd2l0aCAKLSAqIGEgcGFydGljdWxhciB3aXphcmQuIFRoZSBkaWFsb2cgc2VydmVzIGFzIHRoZSB3aXphcmQgY29udGFpbmVyCi0gKiBhbmQgb3JjaGVzdHJhdGVzIHRoZSBwcmVzZW50YXRpb24gb2YgaXRzIHBhZ2VzLgotICogPHA+Ci0gKiBUaGUgc3RhbmRhcmQgbGF5b3V0IGlzIHJvdWdobHkgYXMgZm9sbG93czogCi0gKiBpdCBoYXMgYW4gYXJlYSBhdCB0aGUgdG9wIGNvbnRhaW5pbmcgYm90aCB0aGUKLSAqIHdpemFyZCdzIHRpdGxlLCBkZXNjcmlwdGlvbiwgYW5kIGltYWdlOyB0aGUgYWN0dWFsIHdpemFyZCBwYWdlCi0gKiBhcHBlYXJzIGluIHRoZSBtaWRkbGU7IGJlbG93IHRoYXQgaXMgYSBwcm9ncmVzcyBpbmRpY2F0b3IKLSAqICh3aGljaCBpcyBtYWRlIHZpc2libGUgaWYgbmVlZGVkKTsgYW5kIGF0IHRoZSBib3R0b20KLSAqIG9mIHRoZSBwYWdlIGlzIG1lc3NhZ2UgbGluZSBhbmQgYSBidXR0b24gYmFyIGNvbnRhaW5pbmcgCi0gKiBIZWxwLCBOZXh0LCBCYWNrLCBGaW5pc2gsIGFuZCBDYW5jZWwgYnV0dG9ucyAob3Igc29tZSBzdWJzZXQpLgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBzdWJjbGFzcyA8Y29kZT5XaXphcmREaWFsb2c8L2NvZGU+LCBhbHRob3VnaCB0aGlzCi0gKiBpcyByYXJlbHkgcmVxdWlyZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmREaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgaW1wbGVtZW50cyBJV2l6YXJkQ29udGFpbmVyMiwgSVBhZ2VDaGFuZ2VQcm92aWRlciB7Ci0gICAgLyoqCi0gICAgICogSW1hZ2UgcmVnaXN0cnkga2V5IGZvciBlcnJvciBtZXNzYWdlIGltYWdlICh2YWx1ZSA8Y29kZT4iZGlhbG9nX3RpdGxlX2Vycm9yX2ltYWdlIjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWl9JTUdfRVJST1IgPSAiZGlhbG9nX3RpdGxlX2Vycm9yX2ltYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHdpemFyZCB0aGUgZGlhbG9nIGlzIGN1cnJlbnRseSBzaG93aW5nLgotICAgIHByaXZhdGUgSVdpemFyZCB3aXphcmQ7Ci0KLSAgICAvLyBXaXphcmRzIHRvIGRpc3Bvc2UKLSAgICBwcml2YXRlIEFycmF5TGlzdCBjcmVhdGVkV2l6YXJkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8vIEN1cnJlbnQgbmVzdGVkIHdpemFyZHMKLSAgICBwcml2YXRlIEFycmF5TGlzdCBuZXN0ZWRXaXphcmRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLy8gVGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZS4KLSAgICBwcml2YXRlIElXaXphcmRQYWdlIGN1cnJlbnRQYWdlID0gbnVsbDsKLQotICAgIC8vIFRoZSBudW1iZXIgb2YgbG9uZyBydW5uaW5nIG9wZXJhdGlvbiBleGVjdXRlZCBmcm9tIHRoZSBkaWFsb2cuCQotICAgIHByaXZhdGUgbG9uZyBhY3RpdmVSdW5uaW5nT3BlcmF0aW9ucyA9IDA7Ci0KLSAgICAvLyBUaGUgY3VycmVudCBwYWdlIG1lc3NhZ2UgYW5kIGRlc2NyaXB0aW9uCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFnZU1lc3NhZ2U7Ci0KLSAgICBwcml2YXRlIGludCBwYWdlTWVzc2FnZVR5cGUgPSBJTWVzc2FnZVByb3ZpZGVyLk5PTkU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwYWdlRGVzY3JpcHRpb247Ci0KLSAgICAvLyBUaGUgcHJvZ3Jlc3MgbW9uaXRvcgotICAgIHByaXZhdGUgUHJvZ3Jlc3NNb25pdG9yUGFydCBwcm9ncmVzc01vbml0b3JQYXJ0OwotCi0gICAgcHJpdmF0ZSBDdXJzb3Igd2FpdEN1cnNvcjsKLQotICAgIHByaXZhdGUgQ3Vyc29yIGFycm93Q3Vyc29yOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlRGlhbG9nIHdpbmRvd0Nsb3NpbmdEaWFsb2c7Ci0KLSAgICAvLyBOYXZpZ2F0aW9uIGJ1dHRvbnMKLSAgICBwcml2YXRlIEJ1dHRvbiBiYWNrQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbmV4dEJ1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGZpbmlzaEJ1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGNhbmNlbEJ1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGhlbHBCdXR0b247Ci0KLSAgICBwcml2YXRlIFNlbGVjdGlvbkFkYXB0ZXIgY2FuY2VsTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb3ZpbmdUb1ByZXZpb3VzUGFnZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgcGFnZUNvbnRhaW5lcjsKLQotICAgIHByaXZhdGUgUGFnZUNvbnRhaW5lckZpbGxMYXlvdXQgcGFnZUNvbnRhaW5lckxheW91dCA9IG5ldyBQYWdlQ29udGFpbmVyRmlsbExheW91dCgKLSAgICAgICAgICAgIDUsIDUsIDMwMCwgMjI1KTsKLQotICAgIHByaXZhdGUgaW50IHBhZ2VXaWR0aCA9IFNXVC5ERUZBVUxUOwotCi0gICAgcHJpdmF0ZSBpbnQgcGFnZUhlaWdodCA9IFNXVC5ERUZBVUxUOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPQ1VTX0NPTlRST0wgPSAiZm9jdXNDb250cm9sIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBib29sZWFuIGxvY2tlZFVJID0gZmFsc2U7Ci0JCi0gICAgcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcGFnZUNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGxheW91dCBmb3IgYSBjb250YWluZXIgd2hpY2ggaW5jbHVkZXMgc2V2ZXJhbCBwYWdlcywgbGlrZQotICAgICAqIGEgbm90ZWJvb2ssIHdpemFyZCwgb3IgcHJlZmVyZW5jZSBkaWFsb2cuIFRoZSBzaXplIGNvbXB1dGVkIGJ5Ci0gICAgICogdGhpcyBsYXlvdXQgaXMgdGhlIG1heGltdW0gd2lkdGggYW5kIGhlaWdodCBvZiBhbGwgcGFnZXMgY3VycmVudGx5Ci0gICAgICogaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBjbGFzcyBQYWdlQ29udGFpbmVyRmlsbExheW91dCBleHRlbmRzIExheW91dCB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWFyZ2luIHdpZHRoOyA8Y29kZT41PC9jb2RlPiBwaXhlbHMgYnkgZGVmYXVsdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgbWFyZ2luV2lkdGggPSA1OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWFyZ2luIGhlaWdodDsgPGNvZGU+NTwvY29kZT4gcGl4ZWxzIGJ5IGRlZmF1bHQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IG1hcmdpbkhlaWdodCA9IDU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtaW5pbXVtIHdpZHRoOyA8Y29kZT4wPC9jb2RlPiBwaXhlbHMgYnkgZGVmYXVsdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgbWluaW11bVdpZHRoID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1pbmltdW0gaGVpZ2h0OyA8Y29kZT4wPC9jb2RlPiBwaXhlbHMgYnkgZGVmYXVsdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgbWluaW11bUhlaWdodCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgbmV3IGxheW91dCBvYmplY3QuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtdyB0aGUgbWFyZ2luIHdpZHRoCi0gICAgICAgICAqIEBwYXJhbSBtaCB0aGUgbWFyZ2luIGhlaWdodAotICAgICAgICAgKiBAcGFyYW0gbWluVyB0aGUgbWluaW11bSB3aWR0aAotICAgICAgICAgKiBAcGFyYW0gbWluSCB0aGUgbWluaW11bSBoZWlnaHQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBQYWdlQ29udGFpbmVyRmlsbExheW91dChpbnQgbXcsIGludCBtaCwgaW50IG1pblcsIGludCBtaW5IKSB7Ci0gICAgICAgICAgICBtYXJnaW5XaWR0aCA9IG13OwotICAgICAgICAgICAgbWFyZ2luSGVpZ2h0ID0gbWg7Ci0gICAgICAgICAgICBtaW5pbXVtV2lkdGggPSBtaW5XOwotICAgICAgICAgICAgbWluaW11bUhlaWdodCA9IG1pbkg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBMYXlvdXQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JjZSkgewotICAgICAgICAgICAgaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUICYmIGhIaW50ICE9IFNXVC5ERUZBVUxUKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQod0hpbnQsIGhIaW50KTsKLSAgICAgICAgICAgIFBvaW50IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBvaW50KDAsIDApOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgY3AgPSBjaGlsZHJlbltpXS5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQsIGZvcmNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnggPSBNYXRoLm1heChyZXN1bHQueCwgY3AueCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC55ID0gTWF0aC5tYXgocmVzdWx0LnksIGNwLnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQueCA9IHJlc3VsdC54ICsgMiAqIG1hcmdpbldpZHRoOwotICAgICAgICAgICAgICAgIHJlc3VsdC55ID0gcmVzdWx0LnkgKyAyICogbWFyZ2luSGVpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBvaW50KHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdC54ID0gTWF0aC5tYXgocmVzdWx0LngsIG1pbmltdW1XaWR0aCk7Ci0gICAgICAgICAgICByZXN1bHQueSA9IE1hdGgubWF4KHJlc3VsdC55LCBtaW5pbXVtSGVpZ2h0KTsKLSAgICAgICAgICAgIGlmICh3SGludCAhPSBTV1QuREVGQVVMVCkKLSAgICAgICAgICAgICAgICByZXN1bHQueCA9IHdIaW50OwotICAgICAgICAgICAgaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQotICAgICAgICAgICAgICAgIHJlc3VsdC55ID0gaEhpbnQ7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGNsaWVudCBhcmVhIGZvciB0aGUgZ2l2ZW4gY29tcG9zaXRlIGFjY29yZGluZyB0byB0aGlzIGxheW91dC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGMgdGhlIGNvbXBvc2l0ZQotICAgICAgICAgKiBAcmV0dXJuIHRoZSBjbGllbnQgYXJlYSByZWN0YW5nbGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Q2xpZW50QXJlYShDb21wb3NpdGUgYykgewotICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBjLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgIHJlY3QueCA9IHJlY3QueCArIG1hcmdpbldpZHRoOwotICAgICAgICAgICAgcmVjdC55ID0gcmVjdC55ICsgbWFyZ2luSGVpZ2h0OwotICAgICAgICAgICAgcmVjdC53aWR0aCA9IHJlY3Qud2lkdGggLSAyICogbWFyZ2luV2lkdGg7Ci0gICAgICAgICAgICByZWN0LmhlaWdodCA9IHJlY3QuaGVpZ2h0IC0gMiAqIG1hcmdpbkhlaWdodDsKLSAgICAgICAgICAgIHJldHVybiByZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gTGF5b3V0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZm9yY2UpIHsKLSAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gZ2V0Q2xpZW50QXJlYShjb21wb3NpdGUpOwotICAgICAgICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW5baV0uc2V0Qm91bmRzKHJlY3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIExheXMgb3V0cyB0aGUgcGFnZSBhY2NvcmRpbmcgdG8gdGhpcyBsYXlvdXQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB3IHRoZSBjb250cm9sCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBsYXlvdXRQYWdlKENvbnRyb2wgdykgewotICAgICAgICAgICAgdy5zZXRCb3VuZHMoZ2V0Q2xpZW50QXJlYSh3LmdldFBhcmVudCgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIHBhZ2Ugc28gdGhhdCBpdHMgb3JpZ2luIGlzIGluIHRoZQotICAgICAgICAgKiB1cHBlciBsZWZ0IGNvcm5lci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHcgdGhlIGNvbnRyb2wKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBhZ2VMb2NhdGlvbihDb250cm9sIHcpIHsKLSAgICAgICAgICAgIHcuc2V0TG9jYXRpb24obWFyZ2luV2lkdGgsIG1hcmdpbkhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHdpemFyZCBkaWFsb2cgZm9yIHRoZSBnaXZlbiB3aXphcmQuIAotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBwYXJlbnQgc2hlbGwKLSAgICAgKiBAcGFyYW0gbmV3V2l6YXJkIHRoZSB3aXphcmQgdGhpcyBkaWFsb2cgaXMgd29ya2luZyBvbgotICAgICAqLwotICAgIHB1YmxpYyBXaXphcmREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElXaXphcmQgbmV3V2l6YXJkKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICAgICAgc2V0U2hlbGxTdHlsZShTV1QuQ0xPU0UgfCBTV1QuVElUTEUgfCBTV1QuQk9SREVSCi0gICAgICAgICAgICAgICAgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuUkVTSVpFIHwgZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCkpOwotICAgICAgICBzZXRXaXphcmQobmV3V2l6YXJkKTsKLSAgICAgICAgLy8gc2luY2UgVkFKYXZhIGNhbid0IGluaXRpYWxpemUgYW4gaW5zdGFuY2UgdmFyIHdpdGggYW4gYW5vbnltb3VzCi0gICAgICAgIC8vIGNsYXNzIG91dHNpZGUgYSBjb25zdHJ1Y3RvciB3ZSBkbyBpdCBoZXJlOgotICAgICAgICBjYW5jZWxMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNhbmNlbFByZXNzZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBYm91dCB0byBzdGFydCBhIGxvbmcgcnVubmluZyBvcGVyYXRpb24gdHJpZ2dlcmVkIHRocm91Z2gKLSAgICAgKiB0aGUgd2l6YXJkLiBTaG93cyB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBhbmQgZGlzYWJsZXMgdGhlIHdpemFyZCdzCi0gICAgICogYnV0dG9ucyBhbmQgY29udHJvbHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5hYmxlQ2FuY2VsQnV0dG9uIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBDYW5jZWwgYnV0dG9uIHNob3VsZAotICAgICAqICAgYmUgZW5hYmxlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBzaG91bGQgYmUgZGlzYWJsZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBzYXZlZCBVSSBzdGF0ZQotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGFib3V0VG9TdGFydChib29sZWFuIGVuYWJsZUNhbmNlbEJ1dHRvbikgewotICAgICAgICBNYXAgc2F2ZWRTdGF0ZSA9IG51bGw7Ci0gICAgICAgIGlmIChnZXRTaGVsbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFNhdmUgZm9jdXMgY29udHJvbAotICAgICAgICAgICAgQ29udHJvbCBmb2N1c0NvbnRyb2wgPSBnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5nZXRGb2N1c0NvbnRyb2woKTsKLSAgICAgICAgICAgIGlmIChmb2N1c0NvbnRyb2wgIT0gbnVsbCAmJiBmb2N1c0NvbnRyb2wuZ2V0U2hlbGwoKSAhPSBnZXRTaGVsbCgpKQotICAgICAgICAgICAgICAgIGZvY3VzQ29udHJvbCA9IG51bGw7Ci0gICAgICAgICAgICBib29sZWFuIG5lZWRzUHJvZ3Jlc3NNb25pdG9yID0gd2l6YXJkLm5lZWRzUHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgICAgICAgICBjYW5jZWxCdXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoY2FuY2VsTGlzdGVuZXIpOwotICAgICAgICAgICAgLy8gU2V0IHRoZSBidXN5IGN1cnNvciB0byBhbGwgc2hlbGxzLgotICAgICAgICAgICAgRGlzcGxheSBkID0gZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0gICAgICAgICAgICB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkLCBTV1QuQ1VSU09SX1dBSVQpOwotICAgICAgICAgICAgc2V0RGlzcGxheUN1cnNvcih3YWl0Q3Vyc29yKTsKLSAgICAgICAgICAgIC8vIFNldCB0aGUgYXJyb3cgY3Vyc29yIHRvIHRoZSBjYW5jZWwgY29tcG9uZW50LgotICAgICAgICAgICAgYXJyb3dDdXJzb3IgPSBuZXcgQ3Vyc29yKGQsIFNXVC5DVVJTT1JfQVJST1cpOwotICAgICAgICAgICAgY2FuY2VsQnV0dG9uLnNldEN1cnNvcihhcnJvd0N1cnNvcik7Ci0gICAgICAgICAgICAvLyBEZWFjdGl2YXRlIHNoZWxsCi0gICAgICAgICAgICBzYXZlZFN0YXRlID0gc2F2ZVVJU3RhdGUobmVlZHNQcm9ncmVzc01vbml0b3IgJiYgZW5hYmxlQ2FuY2VsQnV0dG9uKTsKLSAgICAgICAgICAgIGlmIChmb2N1c0NvbnRyb2wgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzYXZlZFN0YXRlLnB1dChGT0NVU19DT05UUk9MLCBmb2N1c0NvbnRyb2wpOwotICAgICAgICAgICAgLy8gQXR0YWNoIHRoZSBwcm9ncmVzcyBtb25pdG9yIHBhcnQgdG8gdGhlIGNhbmNlbCBidXR0b24KLSAgICAgICAgICAgIGlmIChuZWVkc1Byb2dyZXNzTW9uaXRvcikgewotICAgICAgICAgICAgICAgIHByb2dyZXNzTW9uaXRvclBhcnQuYXR0YWNoVG9DYW5jZWxDb21wb25lbnQoY2FuY2VsQnV0dG9uKTsKLSAgICAgICAgICAgICAgICBwcm9ncmVzc01vbml0b3JQYXJ0LnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNhdmVkU3RhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIEJhY2sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYmFja1ByZXNzZWQoKSB7Ci0gICAgICAgIElXaXphcmRQYWdlIHBhZ2UgPSBjdXJyZW50UGFnZS5nZXRQcmV2aW91c1BhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2Ugd2UgaGF2ZSBhbHJlYWR5IHZpc2l0ZWQgdGhlIHBhZ2UKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgLy8gc2V0IGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgbW92aW5nIGJhY2sKLSAgICAgICAgaXNNb3ZpbmdUb1ByZXZpb3VzUGFnZSA9IHRydWU7Ci0gICAgICAgIC8vIHNob3cgdGhlIHBhZ2UKLSAgICAgICAgc2hvd1BhZ2UocGFnZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLSAgICAgICAgc3dpdGNoIChidXR0b25JZCkgewotICAgICAgICBjYXNlIElEaWFsb2dDb25zdGFudHMuSEVMUF9JRDogewotICAgICAgICAgICAgaGVscFByZXNzZWQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgSURpYWxvZ0NvbnN0YW50cy5CQUNLX0lEOiB7Ci0gICAgICAgICAgICBiYWNrUHJlc3NlZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBJRGlhbG9nQ29uc3RhbnRzLk5FWFRfSUQ6IHsKLSAgICAgICAgICAgIG5leHRQcmVzc2VkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIElEaWFsb2dDb25zdGFudHMuRklOSVNIX0lEOiB7Ci0gICAgICAgICAgICBmaW5pc2hQcmVzc2VkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgQ2FuY2VsIGJ1dHRvbiBoYXMgYSBsaXN0ZW5lciB3aGljaCBjYWxscyBjYW5jZWxQcmVzc2VkIGRpcmVjdGx5Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGluIHNpemUgYmV0d2VlbiB0aGUgZ2l2ZW4KLSAgICAgKiBwYWdlIGFuZCB0aGUgcGFnZSBjb250YWluZXIuIEEgbGFyZ2VyIHBhZ2UgcmVzdWx0cyAKLSAgICAgKiBpbiBhIHBvc2l0aXZlIGRlbHRhLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhZ2UgdGhlIHBhZ2UKLSAgICAgKiBAcmV0dXJuIHRoZSBzaXplIGRpZmZlcmVuY2UgZW5jb2RlZAotICAgICAqICAgYXMgYSA8Y29kZT5uZXcgUG9pbnQoZGVsdGFXaWR0aCxkZWx0YUhlaWdodCk8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBQb2ludCBjYWxjdWxhdGVQYWdlU2l6ZURlbHRhKElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgQ29udHJvbCBwYWdlQ29udHJvbCA9IHBhZ2UuZ2V0Q29udHJvbCgpOwotICAgICAgICBpZiAocGFnZUNvbnRyb2wgPT0gbnVsbCkKLSAgICAgICAgICAgIC8vIGNvbnRyb2wgbm90IGNyZWF0ZWQgeWV0Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KDAsIDApOwotICAgICAgICBQb2ludCBjb250ZW50U2l6ZSA9IHBhZ2VDb250cm9sLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwKLSAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBwYWdlQ29udGFpbmVyTGF5b3V0LmdldENsaWVudEFyZWEocGFnZUNvbnRhaW5lcik7Ci0gICAgICAgIFBvaW50IGNvbnRhaW5lclNpemUgPSBuZXcgUG9pbnQocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotICAgICAgICByZXR1cm4gbmV3IFBvaW50KE1hdGgubWF4KDAsIGNvbnRlbnRTaXplLnggLSBjb250YWluZXJTaXplLngpLCBNYXRoCi0gICAgICAgICAgICAgICAgLm1heCgwLCBjb250ZW50U2l6ZS55IC0gY29udGFpbmVyU2l6ZS55KSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLSAgICAgICAgaWYgKGFjdGl2ZVJ1bm5pbmdPcGVyYXRpb25zIDw9IDApIHsKLSAgICAgICAgICAgIC8vIENsb3NlIHRoZSBkaWFsb2cuIFRoZSBjaGVjayB3aGV0aGVyIHRoZSBkaWFsb2cgY2FuIGJlCi0gICAgICAgICAgICAvLyBjbG9zZWQgb3Igbm90IGlzIGRvbmUgaW4gPGNvZGU+b2tUb0Nsb3NlPC9jb2RlPi4KLSAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBjaGVjayBpcyBhbHNvIGV2YWx1YXRlZCB3aGVuIHRoZSB1c2VyCi0gICAgICAgICAgICAvLyBwcmVzc2VzIHRoZSB3aW5kb3cncyBjbG9zZSBidXR0b24uCi0gICAgICAgICAgICBzZXRSZXR1cm5Db2RlKENBTkNFTCk7Ci0gICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2Nsb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLSAgICAgICAgaWYgKG9rVG9DbG9zZSgpKQotICAgICAgICAgICAgcmV0dXJuIGhhcmRDbG9zZSgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXaW5kb3cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotICAgICAgICAvLyBSZWdpc3RlciBoZWxwIGxpc3RlbmVyIG9uIHRoZSBzaGVsbAotICAgICAgICBuZXdTaGVsbC5hZGRIZWxwTGlzdGVuZXIobmV3IEhlbHBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhlbHBSZXF1ZXN0ZWQoSGVscEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gY2FsbCBwZXJmb3JtIGhlbHAgb24gdGhlIGN1cnJlbnQgcGFnZQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlLnBlcmZvcm1IZWxwKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIGRpYWxvZydzIAotICAgICAqIGJ1dHRvbiBiYXIuCi0gICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPldpemFyZERpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kCi0gICAgICogcHJldmVudHMgdGhlIGNvbXBvc2l0ZSdzIGNvbHVtbnMgZnJvbSBiZWluZyBtYWRlIGVxdWFsIHdpZHRoIGluIG9yZGVyCi0gICAgICogdG8gcmVtb3ZlIHRoZSBtYXJnaW4gYmV0d2VlbiB0aGUgQmFjayBhbmQgTmV4dCBidXR0b25zLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgYnV0dG9uIGJhcgotICAgICAqIEByZXR1cm4gdGhlIGJ1dHRvbiBiYXIgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLSAgICAgICAgKChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpZiAod2l6YXJkLmlzSGVscEF2YWlsYWJsZSgpKSB7Ci0gICAgICAgICAgICBoZWxwQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5IRUxQX0lELAotICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkhFTFBfTEFCRUwsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod2l6YXJkLm5lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpKQotICAgICAgICAgICAgY3JlYXRlUHJldmlvdXNBbmROZXh0QnV0dG9ucyhwYXJlbnQpOwotICAgICAgICBmaW5pc2hCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkZJTklTSF9JRCwKLSAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkZJTklTSF9MQUJFTCwgdHJ1ZSk7Ci0gICAgICAgIGNhbmNlbEJ1dHRvbiA9IGNyZWF0ZUNhbmNlbEJ1dHRvbihwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIENhbmNlbCBidXR0b24gZm9yIHRoaXMgd2l6YXJkIGRpYWxvZy4KLSAgICAgKiBDcmVhdGVzIGEgc3RhbmRhcmQgKDxjb2RlPlNXVC5QVVNIPC9jb2RlPikgYnV0dG9uIGFuZCByZWdpc3RlcnMgZm9yIGl0cwotICAgICAqIHNlbGVjdGlvbiBldmVudHMuIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGJ1dHRvbiBiYXIgY29tcG9zaXRlCi0gICAgICogaXMgaW5jcmVtZW50ZWQuIFRoZSBDYW5jZWwgYnV0dG9uIGlzIGNyZWF0ZWQgc3BlY2lhbGx5IHRvIGdpdmUgaXQgYSAKLSAgICAgKiByZW1vdmVhYmxlIGxpc3RlbmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGJ1dHRvbiBiYXIKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQ2FuY2VsIGJ1dHRvbgotICAgICAqLwotICAgIHByaXZhdGUgQnV0dG9uIGNyZWF0ZUNhbmNlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIGluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGJ1dHRvbiBiYXIKLSAgICAgICAgKChHcmlkTGF5b3V0KSBwYXJlbnQuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMrKzsKLSAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMKTsKLSAgICAgICAgc2V0QnV0dG9uTGF5b3V0RGF0YShidXR0b24pOwotICAgICAgICBidXR0b24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgYnV0dG9uLnNldERhdGEobmV3IEludGVnZXIoSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpKTsKLSAgICAgICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNhbmNlbExpc3RlbmVyKTsKLSAgICAgICAgcmV0dXJuIGJ1dHRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNhbmNlbCBidXR0b24gaWYgdGhlIGlkIGlzIGEgdGhlIGNhbmNlbCBpZC4KLSAgICAgKiBAcGFyYW0gaWQgdGhlIGJ1dHRvbiBpZAotICAgICAqIEByZXR1cm4gdGhlIGJ1dHRvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBidXR0b24gaWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQnV0dG9uIGdldEJ1dHRvbihpbnQgaWQpIHsKLSAgICAgICAgaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKQotICAgICAgICAgICAgcmV0dXJuIGNhbmNlbEJ1dHRvbjsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEJ1dHRvbihpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPldpemFyZERpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5XaW5kb3c8L2NvZGU+Ci0gICAgICogbWV0aG9kIGNhbGxzIGNhbGwgPGNvZGU+SVdpemFyZC5hZGRQYWdlczwvY29kZT4gdG8gYWxsb3cgdGhlIGN1cnJlbnQKLSAgICAgKiB3aXphcmQgdG8gYWRkIGV4dHJhIHBhZ2VzLCB0aGVuIDxjb2RlPnN1cGVyLmNyZWF0ZUNvbnRlbnRzPC9jb2RlPiB0byBjcmVhdGUKLSAgICAgKiB0aGUgY29udHJvbHMuIEl0IHRoZW4gY2FsbHMgPGNvZGU+SVdpemFyZC5jcmVhdGVQYWdlQ29udHJvbHM8L2NvZGU+Ci0gICAgICogdG8gYWxsb3cgdGhlIHdpemFyZCB0byBwcmUtY3JlYXRlIHRoZWlyIHBhZ2UgY29udHJvbHMgcHJpb3IgdG8gb3BlbmluZywKLSAgICAgKiBzbyB0aGF0IHRoZSB3aXphcmQgb3BlbnMgdG8gdGhlIGNvcnJlY3Qgc2l6ZS4gQW5kIGZpbmFsbHkgaXQKLSAgICAgKiBzaG93cyB0aGUgZmlyc3QgcGFnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIEFsbG93IHRoZSB3aXphcmQgdG8gYWRkIHBhZ2VzIHRvIGl0c2VsZgotICAgICAgICAvLyBOZWVkIHRvIGNhbGwgdGhpcyBub3cgc28gcGFnZSBjb3VudCBpcyBjb3JyZWN0Ci0gICAgICAgIC8vIGZvciBkZXRlcm1pbmluZyBpZiBuZXh0L3ByZXZpb3VzIGJ1dHRvbnMgYXJlIG5lZWRlZAotICAgICAgICB3aXphcmQuYWRkUGFnZXMoKTsKLSAgICAgICAgQ29udHJvbCBjb250ZW50cyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgICAgIC8vIEFsbG93IHRoZSB3aXphcmQgcGFnZXMgdG8gcHJlY3JlYXRlIHRoZWlyIHBhZ2UgY29udHJvbHMKLSAgICAgICAgY3JlYXRlUGFnZUNvbnRyb2xzKCk7Ci0gICAgICAgIC8vIFNob3cgdGhlIGZpcnN0IHBhZ2UKLSAgICAgICAgc2hvd1N0YXJ0aW5nUGFnZSgpOwotICAgICAgICByZXR1cm4gY29udGVudHM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICAgIC8vIEJ1aWxkIHRoZSBQYWdlIGNvbnRhaW5lcgotICAgICAgICBwYWdlQ29udGFpbmVyID0gY3JlYXRlUGFnZUNvbnRhaW5lcihjb21wb3NpdGUpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBnZC53aWR0aEhpbnQgPSBwYWdlV2lkdGg7Ci0gICAgICAgIGdkLmhlaWdodEhpbnQgPSBwYWdlSGVpZ2h0OwotICAgICAgICBwYWdlQ29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBwYWdlQ29udGFpbmVyLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIC8vIEluc2VydCBhIHByb2dyZXNzIG1vbml0b3IgCi0gICAgICAgIEdyaWRMYXlvdXQgcG1sYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBwbWxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICAgICAgcHJvZ3Jlc3NNb25pdG9yUGFydCA9IGNyZWF0ZVByb2dyZXNzTW9uaXRvclBhcnQoY29tcG9zaXRlLCBwbWxheW91dCk7Ci0gICAgICAgIHByb2dyZXNzTW9uaXRvclBhcnQKLSAgICAgICAgICAgICAgICAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIHByb2dyZXNzTW9uaXRvclBhcnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIC8vIEJ1aWxkIHRoZSBzZXBhcmF0b3IgbGluZQotICAgICAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotICAgICAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgYXBwbHlEaWFsb2dGb250KHByb2dyZXNzTW9uaXRvclBhcnQpOwotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBwYXJ0IGluIHRoZSByZWNlaXZlci4KLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlCi0gICAgICogQHBhcmFtIHBtbGF5b3V0Ci0gICAgICogQHJldHVybiBQcm9ncmVzc01vbml0b3JQYXJ0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb2dyZXNzTW9uaXRvclBhcnQgY3JlYXRlUHJvZ3Jlc3NNb25pdG9yUGFydCgKLSAgICAgICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUsIEdyaWRMYXlvdXQgcG1sYXlvdXQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9ncmVzc01vbml0b3JQYXJ0KGNvbXBvc2l0ZSwgcG1sYXlvdXQsIFNXVC5ERUZBVUxUKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY3VycmVudFRhc2sgPSBudWxsOwotCi0gICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I3NldEJsb2NrZWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEJsb2NrZWQoSVN0YXR1cyByZWFzb24pIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRCbG9ja2VkKHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgaWYgKCFsb2NrZWRVSSkvL0RvIG5vdCBzaG93IGJsb2NrZWQgaWYgd2UgYXJlIGxvY2tpbmcgdGhlIFVJCi0gICAgICAgICAgICAgICAgICAgIGdldEJsb2NrZWRIYW5kbGVyKCkuc2hvd0Jsb2NrZWQoZ2V0U2hlbGwoKSwgdGhpcywgcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNjbGVhckJsb2NrZWQoKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjbGVhckJsb2NrZWQoKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuY2xlYXJCbG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFsb2NrZWRVSSkvL0RvIG5vdCB2bGVhciBpZiB3ZSBuZXZlciBzZXQgaXQKLSAgICAgICAgICAgICAgICAgICAgZ2V0QmxvY2tlZEhhbmRsZXIoKS5jbGVhckJsb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNiZWdpblRhc2soamF2YS5sYW5nLlN0cmluZywgaW50KQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLSAgICAgICAgICAgICAgICBzdXBlci5iZWdpblRhc2sobmFtZSwgdG90YWxXb3JrKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50VGFzayA9IG5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjc2V0VGFza05hbWUoamF2YS5sYW5nLlN0cmluZykKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRUYXNrTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50VGFzayA9IG5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjc3ViVGFzayhqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc3ViVGFzayhuYW1lKTsKLSAgICAgICAgICAgICAgICAvL0lmIHdlIGhhdmVuJ3QgZ290IGFueXRoaW5nIHlldCB1c2UgdGhpcyB2YWx1ZSBmb3IgbW9yZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUYXNrID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrID0gbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBhbGwgcGFnZXMuCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqIEByZXR1cm4gQ29tcG9zaXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlUGFnZUNvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSByZXN1bHQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICByZXN1bHQuc2V0TGF5b3V0KHBhZ2VDb250YWluZXJMYXlvdXQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG93IHRoZSB3aXphcmQncyBwYWdlcyB0byBwcmUtY3JlYXRlIHRoZWlyIHBhZ2UgY29udHJvbHMuCi0gICAgICogVGhpcyBhbGxvd3MgdGhlIHdpemFyZCBkaWFsb2cgdG8gb3BlbiB0byB0aGUgY29ycmVjdCBzaXplLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoKSB7Ci0gICAgICAgIC8vIEFsbG93IHRoZSB3aXphcmQgcGFnZXMgdG8gcHJlY3JlYXRlIHRoZWlyIHBhZ2UgY29udHJvbHMKLSAgICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHdpemFyZCB0byBvcGVuIHRvIHRoZSBjb3JyZWN0IHNpemUKLSAgICAgICAgd2l6YXJkLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBjcmVhdGVkIHBhZ2VzIGFyZSBpbml0aWFsbHkgbm90IHZpc2libGUKLSAgICAgICAgSVdpemFyZFBhZ2VbXSBwYWdlcyA9IHdpemFyZC5nZXRQYWdlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJV2l6YXJkUGFnZSBwYWdlID0gcGFnZXNbaV07Ci0gICAgICAgICAgICBpZiAocGFnZS5nZXRDb250cm9sKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwYWdlLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFByZXZpb3VzIGFuZCBOZXh0IGJ1dHRvbnMgZm9yIHRoaXMgd2l6YXJkIGRpYWxvZy4KLSAgICAgKiBDcmVhdGVzIHN0YW5kYXJkICg8Y29kZT5TV1QuUFVTSDwvY29kZT4pIGJ1dHRvbnMgYW5kIHJlZ2lzdGVycyBmb3IgdGhlaXIKLSAgICAgKiBzZWxlY3Rpb24gZXZlbnRzLiBOb3RlIHRoYXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBidXR0b24gYmFyIGNvbXBvc2l0ZQotICAgICAqIGlzIGluY3JlbWVudGVkLiBUaGVzZSBidXR0b25zIGFyZSBjcmVhdGVkIHNwZWNpYWxseSB0byBwcmV2ZW50IGFueSBzcGFjZSAKLSAgICAgKiBiZXR3ZWVuIHRoZW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgYnV0dG9uIGJhcgotICAgICAqIEByZXR1cm4gYSBjb21wb3NpdGUgY29udGFpbmluZyB0aGUgbmV3IGJ1dHRvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVQcmV2aW91c0FuZE5leHRCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgYnV0dG9uIGJhcgotICAgICAgICAoKEdyaWRMYXlvdXQpIHBhcmVudC5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucysrOwotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgLy8gY3JlYXRlIGEgbGF5b3V0IHdpdGggc3BhY2luZyBhbmQgbWFyZ2lucyBhcHByb3ByaWF0ZSBmb3IgdGhlIGZvbnQgc2l6ZS4KLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDA7IC8vIHdpbGwgYmUgaW5jcmVtZW50ZWQgYnkgY3JlYXRlQnV0dG9uCi0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSCi0gICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIGJhY2tCdXR0b24gPSBjcmVhdGVCdXR0b24oY29tcG9zaXRlLCBJRGlhbG9nQ29uc3RhbnRzLkJBQ0tfSUQsCi0gICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5CQUNLX0xBQkVMLCBmYWxzZSk7Ci0gICAgICAgIG5leHRCdXR0b24gPSBjcmVhdGVCdXR0b24oY29tcG9zaXRlLCBJRGlhbG9nQ29uc3RhbnRzLk5FWFRfSUQsCi0gICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ORVhUX0xBQkVMLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJuIGEgbmV3IHdpemFyZCBjbG9zaW5nIGRpYWxvZyB3aXRob3V0IG9wZW5pb25nIGl0LgotICAgICAqIEByZXR1cm4gTWVzc2FnZURhbG9nCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlRGlhbG9nIGNyZWF0ZVdpemFyZENsb3NpbmdEaWFsb2coKSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cgcmVzdWx0ID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgSkZhY2VSZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJXaXphcmRDbG9zaW5nRGlhbG9nLnRpdGxlIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBudWxsLCBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIldpemFyZENsb3NpbmdEaWFsb2cubWVzc2FnZSIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMIH0sIDApOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBGaW5pc2ggYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoUHJlc3NlZCgpIHsKLSAgICAgICAgLy8gV2l6YXJkcyBhcmUgYWRkZWQgdG8gdGhlIG5lc3RlZCB3aXphcmRzIGxpc3QgaW4gc2V0V2l6YXJkLgotICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGN1cnJlbnQgd2l6YXJkIGlzIGFsd2F5cyB0aGUgbGFzdCB3aXphcmQgaW4gdGhlIGxpc3QuCi0gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBmaXJzdCBjYWxsIHRoZSBjdXJyZW50IHdpemFyZCBkaXJlY3RseSAodG8gZ2l2ZSBpdCBhIGNoYW5jZSB0byAKLSAgICAgICAgLy8gYWJvcnQsIGRvIHdvcmssIGFuZCBzYXZlIHN0YXRlKSB0aGVuIGNhbGwgdGhlIHJlbWFpbmluZyBuLTEgd2l6YXJkcyBpbiB0aGUgCi0gICAgICAgIC8vIGxpc3QgKHRvIHNhdmUgc3RhdGUpLgotICAgICAgICBpZiAod2l6YXJkLnBlcmZvcm1GaW5pc2goKSkgewotICAgICAgICAgICAgLy8gQ2FsbCBwZXJmb3JtIGZpbmlzaCBvbiBvdXRlciB3aXphcmRzIGluIHRoZSBuZXN0ZWQgY2hhaW4KLSAgICAgICAgICAgIC8vICh0byBhbGxvdyB0aGVtIHRvIHNhdmUgc3RhdGUgZm9yIGV4YW1wbGUpCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZFdpemFyZHMuc2l6ZSgpIC0gMTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgKChJV2l6YXJkKSBuZXN0ZWRXaXphcmRzLmdldChpKSkucGVyZm9ybUZpbmlzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSGFyZCBjbG9zZSB0aGUgZGlhbG9nLiAKLSAgICAgICAgICAgIHNldFJldHVybkNvZGUoT0spOwotICAgICAgICAgICAgaGFyZENsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmRDb250YWluZXIuCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldEN1cnJlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gY3VycmVudFBhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhpcyB3aXphcmQgZGlhbG9nIChpZiBpdCBoYXMgb25lKS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0gICAgICogICB0aGlzIHdpemFyZCBkaWFsb2cgZG9lcyBub3QgaGF2ZSBvbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0gICAgICAgIHJldHVybiBwcm9ncmVzc01vbml0b3JQYXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdpemFyZCB0aGlzIGRpYWxvZyBpcyBjdXJyZW50bHkgZGlzcGxheWluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgd2l6YXJkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElXaXphcmQgZ2V0V2l6YXJkKCkgewotICAgICAgICByZXR1cm4gd2l6YXJkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGlzIHdpbmRvdy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHdpbmRvdyBpcyAob3Igd2FzIGFscmVhZHkpIGNsb3NlZCwgCi0gICAgICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIHN0aWxsIG9wZW4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFyZENsb3NlKCkgewotICAgICAgICAvLyBpbmZvcm0gd2l6YXJkcwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNyZWF0ZWRXaXphcmRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBJV2l6YXJkIGNyZWF0ZWRXaXphcmQgPSAoSVdpemFyZCkgY3JlYXRlZFdpemFyZHMuZ2V0KGkpOwotICAgICAgICAgICAgY3JlYXRlZFdpemFyZC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBkaWFsb2cgYXMgYSBwYXJlbnQgZnJvbSB0aGUgbWFuYWdlZCB3aXphcmQuCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gdGhpcyBhZnRlciBjYWxsaW5nIGRpc3Bvc2UgYXMgdGhlIHdpemFyZCBvcgotICAgICAgICAgICAgLy8gaXRzIHBhZ2VzIG1heSBuZWVkIGFjY2VzcyB0byB0aGUgY29udGFpbmVyIGR1cmluZwotICAgICAgICAgICAgLy8gZGlzcG9zZSBjb2RlCi0gICAgICAgICAgICBjcmVhdGVkV2l6YXJkLnNldENvbnRhaW5lcihudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSGVscCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoZWxwUHJlc3NlZCgpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRQYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGN1cnJlbnRQYWdlLnBlcmZvcm1IZWxwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgTmV4dCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBuZXh0UHJlc3NlZCgpIHsKLSAgICAgICAgSVdpemFyZFBhZ2UgcGFnZSA9IGN1cnJlbnRQYWdlLmdldE5leHRQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHNvbWV0aGluZyBtdXN0IGhhdmUgaGFwcGVuZCBnZXR0aW5nIHRoZSBuZXh0IHBhZ2UKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBzaG93IHRoZSBuZXh0IHBhZ2UKLSAgICAgICAgc2hvd1BhZ2UocGFnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgaXQgaXMgYWxyaWdodCB0byBjbG9zZSB0aGlzIHdpemFyZCBkaWFsb2cKLSAgICAgKiBhbmQgcGVyZm9ybWVkIHN0YW5kYXJkIGNhbmNlbCBwcm9jZXNzaW5nLiBJZiB0aGVyZSBpcyBhCi0gICAgICogbG9uZyBydW5uaW5nIG9wZXJhdGlvbiBpbiBwcm9ncmVzcywgdGhpcyBtZXRob2QgcG9zdHMgYW4KLSAgICAgKiBhbGVydCBtZXNzYWdlIHNheWluZyB0aGF0IHRoZSB3aXphcmQgY2Fubm90IGJlIGNsb3NlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIGFscmlnaHQgdG8gY2xvc2UgdGhpcyBkaWFsb2csIGFuZAotICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgbm90Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG9rVG9DbG9zZSgpIHsKLSAgICAgICAgaWYgKGFjdGl2ZVJ1bm5pbmdPcGVyYXRpb25zID4gMCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgd2luZG93Q2xvc2luZ0RpYWxvZyA9IGNyZWF0ZVdpemFyZENsb3NpbmdEaWFsb2coKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdpbmRvd0Nsb3NpbmdEaWFsb2cub3BlbigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgd2luZG93Q2xvc2luZ0RpYWxvZyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdpemFyZC5wZXJmb3JtQ2FuY2VsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZXMgdGhlIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGUgb2YgdGhlIGdpdmVuIGNvbnRyb2wuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdyB0aGUgY29udHJvbAotICAgICAqIEBwYXJhbSBoIHRoZSBtYXAgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+LCBlbGVtZW50IHR5cGU6Ci0gICAgICogICA8Y29kZT5Cb29sZWFuPC9jb2RlPikKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICAgKiBAc2VlICNzYXZlRW5hYmxlU3RhdGVBbmRTZXQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVzdG9yZUVuYWJsZVN0YXRlKENvbnRyb2wgdywgTWFwIGgsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKHcgIT0gbnVsbCkgewotICAgICAgICAgICAgQm9vbGVhbiBiID0gKEJvb2xlYW4pIGguZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAoYiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHcuc2V0RW5hYmxlZChiLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmVzIHRoZSBlbmFibGVkL2Rpc2FibGVkIHN0YXRlIG9mIHRoZSB3aXphcmQgZGlhbG9nJ3MKLSAgICAgKiBidXR0b25zIGFuZCB0aGUgdHJlZSBvZiBjb250cm9scyBmb3IgdGhlIGN1cnJlbnRseSBzaG93aW5nIHBhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhdGUgYSBtYXAgY29udGFpbmluZyB0aGUgc2F2ZWQgc3RhdGUgYXMgcmV0dXJuZWQgYnkgCi0gICAgICogICA8Y29kZT5zYXZlVUlTdGF0ZTwvY29kZT4KLSAgICAgKiBAc2VlICNzYXZlVUlTdGF0ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlVUlTdGF0ZShNYXAgc3RhdGUpIHsKLSAgICAgICAgcmVzdG9yZUVuYWJsZVN0YXRlKGJhY2tCdXR0b24sIHN0YXRlLCAiYmFjayIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJlc3RvcmVFbmFibGVTdGF0ZShuZXh0QnV0dG9uLCBzdGF0ZSwgIm5leHQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXN0b3JlRW5hYmxlU3RhdGUoZmluaXNoQnV0dG9uLCBzdGF0ZSwgImZpbmlzaCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJlc3RvcmVFbmFibGVTdGF0ZShjYW5jZWxCdXR0b24sIHN0YXRlLCAiY2FuY2VsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVzdG9yZUVuYWJsZVN0YXRlKGhlbHBCdXR0b24sIHN0YXRlLCAiaGVscCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIE9iamVjdCBwYWdlVmFsdWUgPSBzdGF0ZS5nZXQoInBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAocGFnZVZhbHVlICE9IG51bGwpLy9wYWdlIG1heSBuZXZlciBoYXZlIGJlZW4gY3JlYXRlZAotICAgICAgICAgICAgKChDb250cm9sRW5hYmxlU3RhdGUpIHBhZ2VWYWx1ZSkucmVzdG9yZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgSVJ1bm5hYmxlQ29udGV4dCNydW4oYm9vbGVhbiwgYm9vbGVhbiwKLSAgICAgKiBJUnVubmFibGVXaXRoUHJvZ3Jlc3MpIGJsb2NrcyB1bnRpbCB0aGUgcnVubmFibGUgaGFzIGJlZW4gcnVuLAotICAgICAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIDxjb2RlPmZvcms8L2NvZGU+LgotICAgICAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgPGNvZGU+Zm9yazwvY29kZT4gaXMgc2V0IHRvCi0gICAgICogdHJ1ZSBpbiBtb3N0IGNhc2VzLiBJZiA8Y29kZT5mb3JrPC9jb2RlPiBpcyBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LAotICAgICAqIHRoZSBydW5uYWJsZSB3aWxsIHJ1biBpbiB0aGUgVUkgdGhyZWFkIGFuZCBpdCBpcyB0aGUgcnVubmFibGUncwotICAgICAqIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGwgPGNvZGU+RGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKTwvY29kZT4KLSAgICAgKiB0byBlbnN1cmUgVUkgcmVzcG9uc2l2ZW5lc3MuCi0gICAgICogCi0gICAgICogVUkgc3RhdGUgaXMgc2F2ZWQgcHJpb3IgdG8gZXhlY3V0aW5nIHRoZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIGFuZCBpcyAKLSAgICAgKiByZXN0b3JlZCBhZnRlciB0aGUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiBjb21wbGV0ZXMgZXhlY3V0aW5nLiAgQW55IGF0dGVtcHQgIAotICAgICAqIHRvIGNoYW5nZSB0aGUgVUkgc3RhdGUgb2YgdGhlIHdpemFyZCBpbiB0aGUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiB3aWxsIGJlIAotICAgICAqIG51bGxpZmllZCB3aGVuIG9yaWdpbmFsIFVJIHN0YXRlIGlzIHJlc3RvcmVkLgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihib29sZWFuIGZvcmssIGJvb2xlYW4gY2FuY2VsYWJsZSwKLSAgICAgICAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRoZSBvcGVyYXRpb24gY2FuIG9ubHkgYmUgY2FuY2VsZWQgaWYgaXQgaXMgZXhlY3V0ZWQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCi0gICAgICAgIC8vIE90aGVyd2lzZSB0aGUgVUkgaXMgYmxvY2tlZCBhbnl3YXkuCi0gICAgICAgIE9iamVjdCBzdGF0ZSA9IG51bGw7Ci0gICAgICAgIGlmIChhY3RpdmVSdW5uaW5nT3BlcmF0aW9ucyA9PSAwKQotICAgICAgICAgICAgc3RhdGUgPSBhYm91dFRvU3RhcnQoZm9yayAmJiBjYW5jZWxhYmxlKTsKLSAgICAgICAgYWN0aXZlUnVubmluZ09wZXJhdGlvbnMrKzsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghZm9yaykvL0lmIHdlIGFyZSBub3QgZm9ya2luZyBkbyBub3Qgb3BlbiBvdGhlciBkaWFsb2dzCi0gICAgICAgICAgICAgICAgbG9ja2VkVUkgPSB0cnVlOwotICAgICAgICAgICAgTW9kYWxDb250ZXh0LnJ1bihydW5uYWJsZSwgZm9yaywgZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIGdldFNoZWxsKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldERpc3BsYXkoKSk7Ci0gICAgICAgICAgICBsb2NrZWRVSSA9IGZhbHNlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgYWN0aXZlUnVubmluZ09wZXJhdGlvbnMtLTsKLSAgICAgICAgICAgIC8vU3RvcCBpZiB0aGlzIGlzIHRoZSBsYXN0IG9uZQotICAgICAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RvcHBlZChzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZSBvZiB0aGUgZ2l2ZW4gY29udHJvbCBpbiB0aGUKLSAgICAgKiBnaXZlbiBtYXAsIHdoaWNoIG11c3QgYmUgbW9kaWZpYWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3IHRoZSBjb250cm9sLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIGggdGhlIG1hcCAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT4sIGVsZW1lbnQgdHlwZToKLSAgICAgKiAgIDxjb2RlPkJvb2xlYW48L2NvZGU+KQotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgICAqIEBwYXJhbSBlbmFibGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGVuYWJsZSB0aGUgY29udHJvbCwgCi0gICAgICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGRpc2FibGUgaXQKLSAgICAgKiBAc2VlICNyZXN0b3JlRW5hYmxlU3RhdGUoQ29udHJvbCwgTWFwLCBTdHJpbmcpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVFbmFibGVTdGF0ZUFuZFNldChDb250cm9sIHcsIE1hcCBoLCBTdHJpbmcga2V5LAotICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIGlmICh3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGgucHV0KGtleSwgbmV3IEJvb2xlYW4ody5nZXRFbmFibGVkKCkpKTsKLSAgICAgICAgICAgIHcuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhcHR1cmVzIGFuZCByZXR1cm5zIHRoZSBlbmFibGVkL2Rpc2FibGVkIHN0YXRlIG9mIHRoZSB3aXphcmQgZGlhbG9nJ3MKLSAgICAgKiBidXR0b25zIGFuZCB0aGUgdHJlZSBvZiBjb250cm9scyBmb3IgdGhlIGN1cnJlbnRseSBzaG93aW5nIHBhZ2UuIEFsbAotICAgICAqIHRoZXNlIGNvbnRyb2xzIGFyZSBkaXNhYmxlZCBpbiB0aGUgcHJvY2Vzcywgd2l0aCB0aGUgcG9zc2libGUgZXhjZXB0b24gb2YKLSAgICAgKiB0aGUgQ2FuY2VsIGJ1dHRvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZWVwQ2FuY2VsRW5hYmxlZCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgQ2FuY2VsIGJ1dHRvbiBzaG91bGQKLSAgICAgKiAgIHJlbWFpbiBlbmFibGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHNob3VsZCBiZSBkaXNhYmxlZAotICAgICAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgc2F2ZWQgc3RhdGUgc3VpdGFibGUgZm9yIHJlc3RvcmluZyBsYXRlcgotICAgICAqICAgd2l0aCA8Y29kZT5yZXN0b3JlVUlTdGF0ZTwvY29kZT4KLSAgICAgKiBAc2VlICNyZXN0b3JlVUlTdGF0ZQotICAgICAqLwotICAgIHByaXZhdGUgTWFwIHNhdmVVSVN0YXRlKGJvb2xlYW4ga2VlcENhbmNlbEVuYWJsZWQpIHsKLSAgICAgICAgTWFwIHNhdmVkU3RhdGUgPSBuZXcgSGFzaE1hcCgxMCk7Ci0gICAgICAgIHNhdmVFbmFibGVTdGF0ZUFuZFNldChiYWNrQnV0dG9uLCBzYXZlZFN0YXRlLCAiYmFjayIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzYXZlRW5hYmxlU3RhdGVBbmRTZXQobmV4dEJ1dHRvbiwgc2F2ZWRTdGF0ZSwgIm5leHQiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2F2ZUVuYWJsZVN0YXRlQW5kU2V0KGZpbmlzaEJ1dHRvbiwgc2F2ZWRTdGF0ZSwgImZpbmlzaCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzYXZlRW5hYmxlU3RhdGVBbmRTZXQoY2FuY2VsQnV0dG9uLCBzYXZlZFN0YXRlLAotICAgICAgICAgICAgICAgICJjYW5jZWwiLCBrZWVwQ2FuY2VsRW5hYmxlZCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2F2ZUVuYWJsZVN0YXRlQW5kU2V0KGhlbHBCdXR0b24sIHNhdmVkU3RhdGUsICJoZWxwIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChjdXJyZW50UGFnZSAhPSBudWxsKQotICAgICAgICAgICAgc2F2ZWRTdGF0ZQotICAgICAgICAgICAgICAgICAgICAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWdlIiwgQ29udHJvbEVuYWJsZVN0YXRlLmRpc2FibGUoY3VycmVudFBhZ2UuZ2V0Q29udHJvbCgpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHNhdmVkU3RhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZ2l2ZW4gY3Vyc29yIGZvciBhbGwgc2hlbGxzIGN1cnJlbnRseSBhY3RpdmUKLSAgICAgKiBmb3IgdGhpcyB3aW5kb3cncyBkaXNwbGF5LgotICAgICAqCi0gICAgICogQHBhcmFtIGMgdGhlIGN1cnNvcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXREaXNwbGF5Q3Vyc29yKEN1cnNvciBjKSB7Ci0gICAgICAgIFNoZWxsW10gc2hlbGxzID0gZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U2hlbGxzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2hlbGxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgc2hlbGxzW2ldLnNldEN1cnNvcihjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtaW5pbXVtIHBhZ2Ugc2l6ZSB1c2VkIGZvciB0aGUgcGFnZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWluV2lkdGggdGhlIG1pbmltdW0gcGFnZSB3aWR0aAotICAgICAqIEBwYXJhbSBtaW5IZWlnaHQgdGhlIG1pbmltdW0gcGFnZSBoZWlnaHQKLSAgICAgKiBAc2VlICNzZXRNaW5pbXVtUGFnZVNpemUoUG9pbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWluaW11bVBhZ2VTaXplKGludCBtaW5XaWR0aCwgaW50IG1pbkhlaWdodCkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKG1pbldpZHRoID49IDAgJiYgbWluSGVpZ2h0ID49IDApOwotICAgICAgICBwYWdlQ29udGFpbmVyTGF5b3V0Lm1pbmltdW1XaWR0aCA9IG1pbldpZHRoOwotICAgICAgICBwYWdlQ29udGFpbmVyTGF5b3V0Lm1pbmltdW1IZWlnaHQgPSBtaW5IZWlnaHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWluaW11bSBwYWdlIHNpemUgdXNlZCBmb3IgdGhlIHBhZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNpemUgdGhlIHBhZ2Ugc2l6ZSBlbmNvZGVkIGFzCi0gICAgICogICA8Y29kZT5uZXcgUG9pbnQod2lkdGgsaGVpZ2h0KTwvY29kZT4KLSAgICAgKiBAc2VlICNzZXRNaW5pbXVtUGFnZVNpemUoaW50LGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW5pbXVtUGFnZVNpemUoUG9pbnQgc2l6ZSkgewotICAgICAgICBzZXRNaW5pbXVtUGFnZVNpemUoc2l6ZS54LCBzaXplLnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNpemUgb2YgYWxsIHBhZ2VzLgotICAgICAqIFRoZSBnaXZlbiBzaXplIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBjb21wdXRlZCBzaXplcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgcGFnZSB3aWR0aAotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIHBhZ2UgaGVpZ2h0Ci0gICAgICogQHNlZSAjc2V0UGFnZVNpemUoUG9pbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZVNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIHBhZ2VXaWR0aCA9IHdpZHRoOwotICAgICAgICBwYWdlSGVpZ2h0ID0gaGVpZ2h0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNpemUgb2YgYWxsIHBhZ2VzLgotICAgICAqIFRoZSBnaXZlbiBzaXplIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBjb21wdXRlZCBzaXplcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzaXplIHRoZSBwYWdlIHNpemUgZW5jb2RlZCBhcwotICAgICAqICAgPGNvZGU+bmV3IFBvaW50KHdpZHRoLGhlaWdodCk8L2NvZGU+Ci0gICAgICogQHNlZSAjc2V0UGFnZVNpemUoaW50LGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlU2l6ZShQb2ludCBzaXplKSB7Ci0gICAgICAgIHNldFBhZ2VTaXplKHNpemUueCwgc2l6ZS55KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aXphcmQgdGhpcyBkaWFsb2cgaXMgY3VycmVudGx5IGRpc3BsYXlpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV3V2l6YXJkIHRoZSB3aXphcmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRXaXphcmQoSVdpemFyZCBuZXdXaXphcmQpIHsKLSAgICAgICAgd2l6YXJkID0gbmV3V2l6YXJkOwotICAgICAgICB3aXphcmQuc2V0Q29udGFpbmVyKHRoaXMpOwotICAgICAgICBpZiAoIWNyZWF0ZWRXaXphcmRzLmNvbnRhaW5zKHdpemFyZCkpIHsKLSAgICAgICAgICAgIGNyZWF0ZWRXaXphcmRzLmFkZCh3aXphcmQpOwotICAgICAgICAgICAgLy8gTmV3IHdpemFyZCBzbyBqdXN0IGFkZCBpdCB0byB0aGUgZW5kIG9mIG91ciBuZXN0ZWQgbGlzdAotICAgICAgICAgICAgbmVzdGVkV2l6YXJkcy5hZGQod2l6YXJkKTsKLSAgICAgICAgICAgIGlmIChwYWdlQ29udGFpbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBEaWFsb2cgaXMgYWxyZWFkeSBvcGVuCQotICAgICAgICAgICAgICAgIC8vIEFsbG93IHRoZSB3aXphcmQgcGFnZXMgdG8gcHJlY3JlYXRlIHRoZWlyIHBhZ2UgY29udHJvbHMKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGFsbG93cyB0aGUgd2l6YXJkIHRvIG9wZW4gdG8gdGhlIGNvcnJlY3Qgc2l6ZQotICAgICAgICAgICAgICAgIGNyZWF0ZVBhZ2VDb250cm9scygpOwotICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZGlhbG9nIGlzIGxhcmdlIGVub3VnaCBmb3IgdGhlIHdpemFyZAotICAgICAgICAgICAgICAgIHVwZGF0ZVNpemVGb3JXaXphcmQod2l6YXJkKTsKLSAgICAgICAgICAgICAgICBwYWdlQ29udGFpbmVyLmxheW91dCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBzZWVuIHRoaXMgd2l6YXJkLCBpZiBpdCBpcyB0aGUgcHJldmlvdXMgd2l6YXJkCi0gICAgICAgICAgICAvLyBvbiB0aGUgbmVzdGVkIGxpc3QgdGhlbiB3ZSBhc3N1bWUgd2UgaGF2ZSBnb25lIGJhY2sgYW5kIHJlbW92ZSAKLSAgICAgICAgICAgIC8vIHRoZSBsYXN0IHdpemFyZCBmcm9tIHRoZSBsaXN0Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IG5lc3RlZFdpemFyZHMuc2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPj0gMiAmJiBuZXN0ZWRXaXphcmRzLmdldChzaXplIC0gMikgPT0gd2l6YXJkKQotICAgICAgICAgICAgICAgIG5lc3RlZFdpemFyZHMucmVtb3ZlKHNpemUgLSAxKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAvLyBBc3N1bWUgd2UgYXJlIGdvaW5nIGZvcndhcmQgdG8gcmV2aXNpdCBhIHdpemFyZAotICAgICAgICAgICAgICAgIG5lc3RlZFdpemFyZHMuYWRkKHdpemFyZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmRDb250YWluZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd1BhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotICAgICAgICBpZiAocGFnZSA9PSBudWxsIHx8IHBhZ2UgPT0gY3VycmVudFBhZ2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWlzTW92aW5nVG9QcmV2aW91c1BhZ2UpCi0gICAgICAgICAgICAvLyByZW1lbWJlciBteSBwcmV2aW91cyBwYWdlLgotICAgICAgICAgICAgcGFnZS5zZXRQcmV2aW91c1BhZ2UoY3VycmVudFBhZ2UpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpc01vdmluZ1RvUHJldmlvdXNQYWdlID0gZmFsc2U7Ci0gICAgICAgIC8vVXBkYXRlIGZvciB0aGUgbmV3IHBhZ2UgaW5hIGJ1c3kgY3Vyc29yIGlmIHBvc3NpYmxlCi0gICAgICAgIGlmIChnZXRDb250ZW50cygpID09IG51bGwpCi0gICAgICAgICAgICB1cGRhdGVGb3JQYWdlKHBhZ2UpOwotCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmluYWwgSVdpemFyZFBhZ2UgZmluYWxQYWdlID0gcGFnZTsKLSAgICAgICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldENvbnRlbnRzKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVGb3JQYWdlKGZpbmFsUGFnZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHJlY2VpdmVyIGZvciB0aGUgbmV3IHBhZ2UuCi0gICAgICogQHBhcmFtIHBhZ2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRm9yUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgIC8vIGVuc3VyZSB0aGlzIHBhZ2UgYmVsb25ncyB0byB0aGUgY3VycmVudCB3aXphcmQKLSAgICAgICAgaWYgKHdpemFyZCAhPSBwYWdlLmdldFdpemFyZCgpKQotICAgICAgICAgICAgc2V0V2l6YXJkKHBhZ2UuZ2V0V2l6YXJkKCkpOwotICAgICAgICAvLyBlbnN1cmUgdGhhdCBwYWdlIGNvbnRyb2wgaGFzIGJlZW4gY3JlYXRlZAotICAgICAgICAvLyAodGhpcyBhbGxvd3MgbGF6eSBwYWdlIGNvbnRyb2wgY3JlYXRpb24pCi0gICAgICAgIGlmIChwYWdlLmdldENvbnRyb2woKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7Ci0gICAgICAgICAgICAvLyB0aGUgcGFnZSBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhlIGNyZWF0ZWQgY29udHJvbCBpcyBhY2Nlc3NhYmxlCi0gICAgICAgICAgICAvLyB2aWEgZ2V0Q29udHJvbC4KLSAgICAgICAgICAgIEFzc2VydC5pc05vdE51bGwocGFnZS5nZXRDb250cm9sKCkpOwotICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSBkaWFsb2cgaXMgbGFyZ2UgZW5vdWdoIGZvciB0aGlzIHBhZ2UKLSAgICAgICAgICAgIHVwZGF0ZVNpemUocGFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbWFrZSB0aGUgbmV3IHBhZ2UgdmlzaWJsZQotICAgICAgICBJV2l6YXJkUGFnZSBvbGRQYWdlID0gY3VycmVudFBhZ2U7Ci0gICAgICAgIGN1cnJlbnRQYWdlID0gcGFnZTsKLSAgICAgICAgY3VycmVudFBhZ2Uuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgaWYgKG9sZFBhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIG9sZFBhZ2Uuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIC8vIHVwZGF0ZSB0aGUgZGlhbG9nIGNvbnRyb2xzCi0gICAgICAgIHVwZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgkKLSAgICAgKiBTaG93cyB0aGUgc3RhcnRpbmcgcGFnZSBvZiB0aGUgd2l6YXJkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzaG93U3RhcnRpbmdQYWdlKCkgewotICAgICAgICBjdXJyZW50UGFnZSA9IHdpemFyZC5nZXRTdGFydGluZ1BhZ2UoKTsKLSAgICAgICAgaWYgKGN1cnJlbnRQYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHNvbWV0aGluZyBtdXN0IGhhdmUgaGFwcGVuZCBnZXR0aW5nIHRoZSBwYWdlCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZW5zdXJlIHRoZSBwYWdlIGNvbnRyb2wgaGFzIGJlZW4gY3JlYXRlZAotICAgICAgICBpZiAoY3VycmVudFBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGN1cnJlbnRQYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7Ci0gICAgICAgICAgICAvLyB0aGUgcGFnZSBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhlIGNyZWF0ZWQgY29udHJvbCBpcyBhY2Nlc3NhYmxlCi0gICAgICAgICAgICAvLyB2aWEgZ2V0Q29udHJvbC4KLSAgICAgICAgICAgIEFzc2VydC5pc05vdE51bGwoY3VycmVudFBhZ2UuZ2V0Q29udHJvbCgpKTsKLSAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBuZWVkIHRvIHVwZGF0ZSB0aGUgc2l6ZSBzaW5jZSB0aGUgY2FsbAotICAgICAgICAgICAgLy8gdG8gaW5pdGlhbGl6ZSBib3VuZHMgaGFzIG5vdCBiZWVuIG1hZGUgeWV0LgotICAgICAgICB9Ci0gICAgICAgIC8vIG1ha2UgdGhlIG5ldyBwYWdlIHZpc2libGUKLSAgICAgICAgY3VycmVudFBhZ2Uuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgLy8gdXBkYXRlIHRoZSBkaWFsb2cgY29udHJvbHMKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBsb25nIHJ1bm5pbmcgb3BlcmF0aW9uIHRyaWdnZXJlZCB0aHJvdWdoIHRoZSB3aXphcmQKLSAgICAgKiB3YXMgc3RvcHBlZCBlaXRoZXIgYnkgdXNlciBpbnB1dCBvciBieSBub3JtYWwgZW5kLgotICAgICAqIEhpZGVzIHRoZSBwcm9ncmVzcyBtb25pdG9yIGFuZCByZXN0b3JlcyB0aGUgZW5hYmxlIHN0YXRlCi0gICAgICogd2l6YXJkJ3MgYnV0dG9ucyBhbmQgY29udHJvbHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2F2ZWRTdGF0ZSB0aGUgc2F2ZWQgVUkgc3RhdGUgYXMgcmV0dXJuZWQgYnkgPGNvZGU+YWJvdXRUb1N0YXJ0PC9jb2RlPgotICAgICAqIEBzZWUgI2Fib3V0VG9TdGFydAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdG9wcGVkKE9iamVjdCBzYXZlZFN0YXRlKSB7Ci0gICAgICAgIGlmIChnZXRTaGVsbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh3aXphcmQubmVlZHNQcm9ncmVzc01vbml0b3IoKSkgewotICAgICAgICAgICAgICAgIHByb2dyZXNzTW9uaXRvclBhcnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcHJvZ3Jlc3NNb25pdG9yUGFydC5yZW1vdmVGcm9tQ2FuY2VsQ29tcG9uZW50KGNhbmNlbEJ1dHRvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNYXAgc3RhdGUgPSAoTWFwKSBzYXZlZFN0YXRlOwotICAgICAgICAgICAgcmVzdG9yZVVJU3RhdGUoc3RhdGUpOwotICAgICAgICAgICAgY2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNhbmNlbExpc3RlbmVyKTsKLSAgICAgICAgICAgIHNldERpc3BsYXlDdXJzb3IobnVsbCk7Ci0gICAgICAgICAgICBjYW5jZWxCdXR0b24uc2V0Q3Vyc29yKG51bGwpOwotICAgICAgICAgICAgd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB3YWl0Q3Vyc29yID0gbnVsbDsKLSAgICAgICAgICAgIGFycm93Q3Vyc29yLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGFycm93Q3Vyc29yID0gbnVsbDsKLSAgICAgICAgICAgIENvbnRyb2wgZm9jdXNDb250cm9sID0gKENvbnRyb2wpIHN0YXRlLmdldChGT0NVU19DT05UUk9MKTsKLSAgICAgICAgICAgIGlmIChmb2N1c0NvbnRyb2wgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBmb2N1c0NvbnRyb2wuc2V0Rm9jdXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhpcyBkaWFsb2cncyBjb250cm9scyB0byByZWZsZWN0IHRoZSBjdXJyZW50IHBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotICAgICAgICAvLyBVcGRhdGUgdGhlIHdpbmRvdyB0aXRsZQotICAgICAgICB1cGRhdGVXaW5kb3dUaXRsZSgpOwotICAgICAgICAvLyBVcGRhdGUgdGhlIHRpdGxlIGJhcgotICAgICAgICB1cGRhdGVUaXRsZUJhcigpOwotICAgICAgICAvLyBVcGRhdGUgdGhlIGJ1dHRvbnMKLSAgICAgICAgdXBkYXRlQnV0dG9ucygpOwotCQkvLyBGaXJlcyB0aGUgcGFnZSBjaGFuZ2UgZXZlbnQKLQkJZmlyZVBhZ2VDaGFuZ2VkKG5ldyBQYWdlQ2hhbmdlZEV2ZW50KHRoaXMsIGdldEN1cnJlbnRQYWdlKCkpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmRDb250YWluZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLSAgICAgICAgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGNhbkZpbmlzaCA9IHdpemFyZC5jYW5GaW5pc2goKTsKLSAgICAgICAgaWYgKGJhY2tCdXR0b24gIT0gbnVsbCkKLSAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0RW5hYmxlZChjdXJyZW50UGFnZS5nZXRQcmV2aW91c1BhZ2UoKSAhPSBudWxsKTsKLSAgICAgICAgaWYgKG5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgY2FuRmxpcFRvTmV4dFBhZ2UgPSBjdXJyZW50UGFnZS5jYW5GbGlwVG9OZXh0UGFnZSgpOwotICAgICAgICAgICAgbmV4dEJ1dHRvbi5zZXRFbmFibGVkKGNhbkZsaXBUb05leHRQYWdlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5pc2hCdXR0b24uc2V0RW5hYmxlZChjYW5GaW5pc2gpOwotICAgICAgICAvLyBmaW5pc2ggaXMgZGVmYXVsdCB1bmxlc3MgaXQgaXMgZGlhYmxlZCBhbmQgbmV4dCBpcyBlbmFibGVkCi0gICAgICAgIGlmIChjYW5GbGlwVG9OZXh0UGFnZSAmJiAhY2FuRmluaXNoKQotICAgICAgICAgICAgZ2V0U2hlbGwoKS5zZXREZWZhdWx0QnV0dG9uKG5leHRCdXR0b24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBnZXRTaGVsbCgpLnNldERlZmF1bHRCdXR0b24oZmluaXNoQnV0dG9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIG1lc3NhZ2UgbGluZSB3aXRoIHRoZSBwYWdlJ3MgZGVzY3JpcHRpb24uCi0gICAgICogPHA+Ci0gICAgICogQSBkaXNjcmlwdGlvbiBpcyBzaG93biBvbmx5IGlmIHRoZXJlIGlzIG5vIG1lc3NhZ2Ugb3IgZXJyb3IgbWVzc2FnZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURlc2NyaXB0aW9uTWVzc2FnZSgpIHsKLSAgICAgICAgcGFnZURlc2NyaXB0aW9uID0gY3VycmVudFBhZ2UuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKHBhZ2VNZXNzYWdlID09IG51bGwpCi0gICAgICAgICAgICBzZXRNZXNzYWdlKGN1cnJlbnRQYWdlLmdldERlc2NyaXB0aW9uKCkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZENvbnRhaW5lci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVNZXNzYWdlKCkgewotCi0gICAgICAgIGlmIChjdXJyZW50UGFnZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHBhZ2VNZXNzYWdlID0gY3VycmVudFBhZ2UuZ2V0TWVzc2FnZSgpOwotICAgICAgICBpZiAocGFnZU1lc3NhZ2UgIT0gbnVsbCAmJiBjdXJyZW50UGFnZSBpbnN0YW5jZW9mIElNZXNzYWdlUHJvdmlkZXIpCi0gICAgICAgICAgICBwYWdlTWVzc2FnZVR5cGUgPSAoKElNZXNzYWdlUHJvdmlkZXIpIGN1cnJlbnRQYWdlKS5nZXRNZXNzYWdlVHlwZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwYWdlTWVzc2FnZVR5cGUgPSBJTWVzc2FnZVByb3ZpZGVyLk5PTkU7Ci0gICAgICAgIGlmIChwYWdlTWVzc2FnZSA9PSBudWxsKQotICAgICAgICAgICAgc2V0TWVzc2FnZShwYWdlRGVzY3JpcHRpb24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZXRNZXNzYWdlKHBhZ2VNZXNzYWdlLCBwYWdlTWVzc2FnZVR5cGUpOwotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoY3VycmVudFBhZ2UuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoYW5nZXMgdGhlIHNoZWxsIHNpemUgdG8gdGhlIGdpdmVuIHNpemUsIGVuc3VyaW5nIHRoYXQKLSAgICAgKiBpdCBpcyBubyBsYXJnZXIgdGhhbiB0aGUgZGlzcGxheSBib3VuZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSBzaGVsbCB3aWR0aAotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIHNoZWxsIGhlaWdodAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTaGVsbFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIFJlY3RhbmdsZSBzaXplID0gZ2V0U2hlbGwoKS5nZXRCb3VuZHMoKTsKLSAgICAgICAgc2l6ZS5oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHNpemUud2lkdGggPSB3aWR0aDsKLSAgICAgICAgZ2V0U2hlbGwoKS5zZXRCb3VuZHMoZ2V0Q29uc3RyYWluZWRTaGVsbEJvdW5kcyhzaXplKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIGNvcnJlY3QgZGlhbG9nIHNpemUgZm9yIHRoZSBjdXJyZW50IHBhZ2UgYW5kIHJlc2l6ZXMgCi0gICAgICogaXRzIHNoZWxsIGlmIG5lc3Nlc3NhcnkuIEFsc28gY2F1c2VzIHRoZSBjb250YWluZXIgdG8gcmVmcmVzaCBpdHMKLSAgICAgKiBsYXlvdXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhZ2UgdGhlIHdpemFyZCBwYWdlIHRvIHVzZSB0byByZXNpemUgdGhlIGRpYWxvZwotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTaXplKElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCB8fCBwYWdlLmdldENvbnRyb2woKSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB1cGRhdGVTaXplRm9yUGFnZShwYWdlKTsKLSAgICAgICAgcGFnZUNvbnRhaW5lckxheW91dC5sYXlvdXRQYWdlKHBhZ2UuZ2V0Q29udHJvbCgpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZENvbnRhaW5lcjIjdXBkYXRlU2l6ZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlU2l6ZSgpIHsKLSAgICAgICAgdXBkYXRlU2l6ZShjdXJyZW50UGFnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIGNvcnJlY3QgZGlhbG9nIHNpemUgZm9yIHRoZSBnaXZlbiBwYWdlIGFuZCByZXNpemVzIAotICAgICAqIGl0cyBzaGVsbCBpZiBuZXNzZXNzYXJ5LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhZ2UgdGhlIHdpemFyZCBwYWdlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNpemVGb3JQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgLy8gZW5zdXJlIHRoZSBwYWdlIGNvbnRhaW5lciBpcyBsYXJnZSBlbm91Z2gKLSAgICAgICAgUG9pbnQgZGVsdGEgPSBjYWxjdWxhdGVQYWdlU2l6ZURlbHRhKHBhZ2UpOwotICAgICAgICBpZiAoZGVsdGEueCA+IDAgfHwgZGVsdGEueSA+IDApIHsKLSAgICAgICAgICAgIC8vIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBzaGVsbCAKLSAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgIFBvaW50IHNoZWxsU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLSAgICAgICAgICAgIHNldFNoZWxsU2l6ZShzaGVsbFNpemUueCArIGRlbHRhLngsIHNoZWxsU2l6ZS55ICsgZGVsdGEueSk7Ci0gICAgICAgICAgICBjb25zdHJhaW5TaGVsbFNpemUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGVzIHRoZSBjb3JyZWN0IGRpYWxvZyBzaXplIGZvciB0aGUgZ2l2ZW4gd2l6YXJkIGFuZCByZXNpemVzIAotICAgICAqIGl0cyBzaGVsbCBpZiBuZXNzZXNzYXJ5LgotICAgICAqCi0gICAgICogQHBhcmFtIHNpemluZ1dpemFyZCB0aGUgd2l6YXJkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNpemVGb3JXaXphcmQoSVdpemFyZCBzaXppbmdXaXphcmQpIHsKLSAgICAgICAgUG9pbnQgZGVsdGEgPSBuZXcgUG9pbnQoMCwgMCk7Ci0gICAgICAgIElXaXphcmRQYWdlW10gcGFnZXMgPSBzaXppbmdXaXphcmQuZ2V0UGFnZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSBwYWdlIGNvbnRhaW5lciBpcyBsYXJnZSBlbm91Z2gKLSAgICAgICAgICAgIFBvaW50IHBhZ2VEZWx0YSA9IGNhbGN1bGF0ZVBhZ2VTaXplRGVsdGEocGFnZXNbaV0pOwotICAgICAgICAgICAgZGVsdGEueCA9IE1hdGgubWF4KGRlbHRhLngsIHBhZ2VEZWx0YS54KTsKLSAgICAgICAgICAgIGRlbHRhLnkgPSBNYXRoLm1heChkZWx0YS55LCBwYWdlRGVsdGEueSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlbHRhLnggPiAwIHx8IGRlbHRhLnkgPiAwKSB7Ci0gICAgICAgICAgICAvLyBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgc2hlbGwgCi0gICAgICAgICAgICBTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0gICAgICAgICAgICBQb2ludCBzaGVsbFNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0gICAgICAgICAgICBzZXRTaGVsbFNpemUoc2hlbGxTaXplLnggKyBkZWx0YS54LCBzaGVsbFNpemUueSArIGRlbHRhLnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkQ29udGFpbmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVRpdGxlQmFyKCkgewotICAgICAgICBTdHJpbmcgcyA9IG51bGw7Ci0gICAgICAgIGlmIChjdXJyZW50UGFnZSAhPSBudWxsKQotICAgICAgICAgICAgcyA9IGN1cnJlbnRQYWdlLmdldFRpdGxlKCk7Ci0gICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICBzID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0VGl0bGUocyk7Ci0gICAgICAgIGlmIChjdXJyZW50UGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRUaXRsZUltYWdlKGN1cnJlbnRQYWdlLmdldEltYWdlKCkpOwotICAgICAgICAgICAgdXBkYXRlRGVzY3JpcHRpb25NZXNzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlTWVzc2FnZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZENvbnRhaW5lci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVXaW5kb3dUaXRsZSgpIHsKLSAgICAgICAgaWYgKGdldFNoZWxsKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIC8vIE5vdCBjcmVhdGVkIHlldAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBTdHJpbmcgdGl0bGUgPSB3aXphcmQuZ2V0V2luZG93VGl0bGUoKTsKLSAgICAgICAgaWYgKHRpdGxlID09IG51bGwpCi0gICAgICAgICAgICB0aXRsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0gICAgfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JUGFnZUNoYW5nZVByb3ZpZGVyI2dldFNlbGVjdGVkUGFnZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZFBhZ2UoKSB7Ci0JCXJldHVybiBnZXRDdXJyZW50UGFnZSgpOwotCX0KLQotICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2cuSVBhZ2VDaGFuZ2VQcm92aWRlciNhZGRQYWdlQ2hhbmdlZExpc3RlbmVyKCkKLSAgICAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VDaGFuZ2VkTGlzdGVuZXIoSVBhZ2VDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcGFnZUNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0gICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZy5JUGFnZUNoYW5nZVByb3ZpZGVyI3JlbW92ZVBhZ2VDaGFuZ2VkTGlzdGVuZXIoKQotICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGFnZUNoYW5nZWRMaXN0ZW5lcihJUGFnZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlwYWdlQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwkJCi0JfQotIAotCS8qKgotICAgICAqIE5vdGlmaWVzIGFueSBzZWxlY3Rpb24gY2hhbmdlZCBsaXN0ZW5lcnMgdGhhdCB0aGUgc2VsZWN0ZWQgcGFnZQotICAgICAqIGhhcyBjaGFuZ2VkLgotICAgICAqIE9ubHkgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFyZSBub3RpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50Ci0gICAgICoKLSAgICAgKiBAc2VlIElQYWdlQ2hhbmdlZExpc3RlbmVyI3BhZ2VDaGFuZ2VkCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVQYWdlQ2hhbmdlZChmaW5hbCBQYWdlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIE9iamVjdFtdIGxpc3RlbmVycyA9IHBhZ2VDaGFuZ2VkTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgZmluYWwgSVBhZ2VDaGFuZ2VkTGlzdGVuZXIgbCA9IChJUGFnZUNoYW5nZWRMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotICAgICAgICAgICAgU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgbC5wYWdlQ2hhbmdlZChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2l6YXJkL1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkNTM2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGEgd2l6YXJkIHBhZ2UuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIDxjb2RlPmNyZWF0ZUNvbnRyb2w8L2NvZGU+IG1ldGhvZAotICogdG8gY3JlYXRlIHRoZSBzcGVjaWZpYyBjb250cm9scyBmb3IgdGhlIHdpemFyZCBwYWdlLgotICogPC9wPgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG1heSBjYWxsIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0byBjb25maWd1cmUgdGhlIHdpemFyZCBwYWdlOgotICogPHVsPgotICogIDxsaT48Y29kZT5zZXREZXNjcmlwdGlvbjwvY29kZT48L2xpPgotICogIDxsaT48Y29kZT5zZXRFcnJvck1lc3NhZ2U8L2NvZGU+PC9saT4KLSAqICA8bGk+PGNvZGU+c2V0SW1hZ2VEZXNjcmlwdG9yPC9jb2RlPjwvbGk+Ci0gKiAgPGxpPjxjb2RlPnNldE1lc3NhZ2U8L2NvZGU+PC9saT4KLSAqICA8bGk+PGNvZGU+c2V0UGFnZUNvbXBsZXRlPC9jb2RlPjwvbGk+Ci0gKiAgPGxpPjxjb2RlPnNldFByZXZpb3VzUGFnZTwvY29kZT48L2xpPgotICogIDxsaT48Y29kZT5zZXRUaXRsZTwvY29kZT48L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhlc2UgbWV0aG9kcyBpZiByZXF1aXJlZDoKLSAqIDx1bD4KLSAqICA8bGk+PGNvZGU+cGVyZm9ybUhlbHA8L2NvZGU+IC0gbWF5IGJlIHJlaW1wbGVtZW50ZWQgdG8gZGlzcGxheSBoZWxwIGZvciB0aGUgcGFnZTwvbGk+ICAKLSAqIDxsaT48Y29kZT5jYW5GbGlwVG9OZXh0UGFnZTwvY29kZT4gLSBtYXkgYmUgZXh0ZW5kZWQgb3IgcmVpbXBsZW1lbnRlZDwvbGk+Ci0gKiAgPGxpPjxjb2RlPmlzUGFnZUNvbXBsZXRlPC9jb2RlPiAtIG1heSBiZSBleHRlbmRlZCA8L2xpPgotICogIDxsaT48Y29kZT5zZXREZXNjcmlwdGlvbjwvY29kZT4gLSBtYXkgYmUgZXh0ZW5kZWQgPC9saT4KLSAqICA8bGk+PGNvZGU+c2V0VGl0bGU8L2NvZGU+IC0gbWF5IGJlIGV4dGVuZGVkIDwvbGk+Ci0gKiAgPGxpPjxjb2RlPmRpc3Bvc2U8L2NvZGU+IC0gbWF5IGJlIGV4dGVuZGVkIHRvIGRpc3Bvc2UgYWRkaXRpb25hbCBhbGxvY2F0ZWQgU1dUIHJlc291cmNlczwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogPHA+Ci0gKiBOb3RlIHRoYXQgY2xpZW50cyBhcmUgZnJlZSB0byBpbXBsZW1lbnQgPGNvZGU+SVdpemFyZFBhZ2U8L2NvZGU+IGZyb20gc2NyYXRjaAotICogaW5zdGVhZCBvZiBzdWJjbGFzc2luZyA8Y29kZT5XaXphcmRQYWdlPC9jb2RlPi4gQ29ycmVjdCBpbXBsZW1lbnRhdGlvbnMgb2YKLSAqIDxjb2RlPklXaXphcmRQYWdlPC9jb2RlPiB3aWxsIHdvcmsgd2l0aCBhbnkgY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZiAKLSAqIDxjb2RlPklXaXphcmQ8L2NvZGU+LgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2l6YXJkUGFnZSBleHRlbmRzIERpYWxvZ1BhZ2UgaW1wbGVtZW50cyBJV2l6YXJkUGFnZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHBhZ2UncyBuYW1lLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd2l6YXJkIHRvIHdoaWNoIHRoaXMgcGFnZSBiZWxvbmdzOyA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIGlmIHRoaXMgcGFnZSBoYXMgeWV0IHRvIGJlIGFkZGVkIHRvIGEgd2l6YXJkLgotICAgICAqLwotICAgIHByaXZhdGUgSVdpemFyZCB3aXphcmQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBwYWdlIGlzIGNvbXBsZXRlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGFnZSB0aGF0IHdhcyBzaG93biByaWdodCBiZWZvcmUgdGhpcyBwYWdlIGJlY2FtZSB2aXNpYmxlOwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJV2l6YXJkUGFnZSBwcmV2aW91c1BhZ2UgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB3aXphcmQgcGFnZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBhbmQKLSAgICAgKiB3aXRoIG5vIHRpdGxlIG9yIGltYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhZ2VOYW1lIHRoZSBuYW1lIG9mIHRoZSBwYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0gICAgICAgIHRoaXMocGFnZU5hbWUsIG51bGwsIChJbWFnZURlc2NyaXB0b3IpIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgd2l6YXJkIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdGl0bGUsIGFuZCBpbWFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFnZQotICAgICAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUgZm9yIHRoaXMgd2l6YXJkIHBhZ2UsCi0gICAgICogICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIHRpdGxlSW1hZ2UgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSB0aXRsZSBvZiB0aGlzIHdpemFyZCBwYWdlLAotICAgICAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHByb3RlY3RlZCBXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHRpdGxlLAotICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIHRpdGxlSW1hZ2UpIHsKLSAgICAgICAgc3VwZXIodGl0bGUsIHRpdGxlSW1hZ2UpOwotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHBhZ2VOYW1lKTsgLy8gcGFnZSBuYW1lIG11c3Qgbm90IGJlIG51bGwKLSAgICAgICAgbmFtZSA9IHBhZ2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XaXphcmRQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklXaXphcmRQYWdlPC9jb2RlPgotICAgICAqIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcGFnZSBpcyBjb21wbGV0ZSAoPGNvZGU+aXNQYWdlQ29tcGxldGU8L2NvZGU+KQotICAgICAqIGFuZCB0aGVyZSBpcyBhIG5leHQgcGFnZSB0byBmbGlwIHRvLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSAoZXh0ZW5kIG9yIHJlaW1wbGVtZW50KS4KLSAgICAgKgotICAgICAqIEBzZWUgI2dldE5leHRQYWdlCi0gICAgICogQHNlZSAjaXNQYWdlQ29tcGxldGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCkgJiYgZ2V0TmV4dFBhZ2UoKSAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdpemFyZCBjb250YWluZXIgZm9yIHRoaXMgd2l6YXJkIHBhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB3aXphcmQgY29udGFpbmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzCi0gICAgICogICB3aXphcmQgcGFnZSBoYXMgeWV0IHRvIGJlIGFkZGVkIHRvIGEgd2l6YXJkLCBvciB0aGUKLSAgICAgKiAgIHdpemFyZCBoYXMgeWV0IHRvIGJlIGFkZGVkIHRvIGEgY29udGFpbmVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElXaXphcmRDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgewotICAgICAgICBpZiAod2l6YXJkID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHdpemFyZC5nZXRDb250YWluZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaWFsb2cgc2V0dGluZ3MgZm9yIHRoaXMgd2l6YXJkIHBhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBkaWFsb2cgc2V0dGluZ3MsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotICAgICAgICBpZiAod2l6YXJkID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHdpemFyZC5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKCkgewotICAgICAgICBJbWFnZSByZXN1bHQgPSBzdXBlci5nZXRJbWFnZSgpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiB3aXphcmQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB3aXphcmQuZ2V0RGVmYXVsdFBhZ2VJbWFnZSgpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UuCi0gICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gYXNrIHRoZSB3aXphcmQgZm9yIHRoZSBuZXh0IHBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotICAgICAgICBpZiAod2l6YXJkID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHdpemFyZC5nZXROZXh0UGFnZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmRQYWdlLgotICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHJldHVybiB0aGUgY2FjaGVkIHByZXZpb3VzIGJhY2sgb3IsCi0gICAgICogbGFja2luZyB0aGF0LCB0byBhc2sgdGhlIHdpemFyZCBmb3IgdGhlIHByZXZpb3VzIHBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZSgpIHsKLSAgICAgICAgaWYgKHByZXZpb3VzUGFnZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzUGFnZTsKLQotICAgICAgICBpZiAod2l6YXJkID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gd2l6YXJkLmdldFByZXZpb3VzUGFnZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZGVjbGFyZWQgb24KLSAgICAgKiA8Y29kZT5EaWFsb2dQYWdlPC9jb2RlPiByZXR1cm5zIHRoZSBzaGVsbCBvZiB0aGUgY29udGFpbmVyLgotICAgICAqIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IHRoZSBzaGVsbCBpcyBhY2Nlc3NhYmxlCi0gICAgICogb25jZSB0aGUgY29udGFpbmVyIGlzIGNyZWF0ZWQgZXZlbiB0aG91Z2ggdGhpcyBwYWdlJ3MgY29udHJvbCBtYXkgbm90IAotICAgICAqIHlldCBiZSBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLQotICAgICAgICBJV2l6YXJkQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAvLyBBc2sgdGhlIHdpemFyZCBzaW5jZSBvdXIgY29udGVudHMgbWF5IG5vdCBoYXZlIGJlZW4gY3JlYXRlZC4KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmQgZ2V0V2l6YXJkKCkgewotICAgICAgICByZXR1cm4gd2l6YXJkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhZ2UgaXMgdGhlIGN1cnJlbnQgb25lIGluIHRoZSB3aXphcmQncyBjb250YWluZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYWdlIGlzIGFjdGl2ZSwKLSAgICAgKiAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnJlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gKGdldENvbnRhaW5lcigpICE9IG51bGwgJiYgdGhpcyA9PSBnZXRDb250YWluZXIoKQotICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50UGFnZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JV2l6YXJkPC9jb2RlPiBtZXRob2QgCi0gICAgICogcmV0dXJucyB0aGUgdmFsdWUgb2YgYW4gaW50ZXJuYWwgc3RhdGUgdmFyaWFibGUgc2V0IGJ5Ci0gICAgICogPGNvZGU+c2V0UGFnZUNvbXBsZXRlPC9jb2RlPi4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gaXNQYWdlQ29tcGxldGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPldpemFyZFBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SURpYWxvZ1BhZ2U8L2NvZGU+Ci0gICAgICogbWV0aG9kIGV4dGVuZHMgdGhlIDxjb2RlPkRpYWxvZ1BhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIHRvIHVwZGF0ZQotICAgICAqIHRoZSB3aXphcmQgY29udGFpbmVyIHRpdGxlIGJhci4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICBzdXBlci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIGlmIChpc0N1cnJlbnRQYWdlKCkpCi0gICAgICAgICAgICBnZXRDb250YWluZXIoKS51cGRhdGVUaXRsZUJhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XaXphcmRQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCAKLSAgICAgKiBkZWNsYXJlZCBvbiA8Y29kZT5EaWFsb2dQYWdlPC9jb2RlPiB1cGRhdGVzIHRoZSBjb250YWluZXIKLSAgICAgKiBpZiB0aGlzIGlzIHRoZSBjdXJyZW50IHBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyLnNldEVycm9yTWVzc2FnZShuZXdNZXNzYWdlKTsKLSAgICAgICAgaWYgKGlzQ3VycmVudFBhZ2UoKSkgewotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkudXBkYXRlTWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPldpemFyZFBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIAotICAgICAqIGRlY2xhcmVkIG9uIDxjb2RlPkRpYWxvZ1BhZ2U8L2NvZGU+IHVwZGF0ZXMgdGhlIGNvbnRhaW5lcgotICAgICAqIGlmIHRoaXMgcGFnZSBpcyB0aGUgY3VycmVudCBwYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgaW1hZ2UpIHsKLSAgICAgICAgc3VwZXIuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlKTsKLSAgICAgICAgaWYgKGlzQ3VycmVudFBhZ2UoKSkKLSAgICAgICAgICAgIGdldENvbnRhaW5lcigpLnVwZGF0ZVRpdGxlQmFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPldpemFyZFBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIAotICAgICAqIGRlY2xhcmVkIG9uIDxjb2RlPkRpYWxvZ1BhZ2U8L2NvZGU+IHVwZGF0ZXMgdGhlIGNvbnRhaW5lcgotICAgICAqIGlmIHRoaXMgaXMgdGhlIGN1cnJlbnQgcGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlLCBpbnQgbmV3VHlwZSkgewotICAgICAgICBzdXBlci5zZXRNZXNzYWdlKG5ld01lc3NhZ2UsIG5ld1R5cGUpOwotICAgICAgICBpZiAoaXNDdXJyZW50UGFnZSgpKQotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkudXBkYXRlTWVzc2FnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGlzIHBhZ2UgaXMgY29tcGxldGUuIAotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdHlwaWNhbGx5IHVzZWQgYnkgdGhlIHdpemFyZCB0byBkZWNpZGUKLSAgICAgKiB3aGVuIGl0IGlzIG9rYXkgdG8gbW92ZSBvbiB0byB0aGUgbmV4dCBwYWdlIG9yIGZpbmlzaCB1cC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcGxldGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBwYWdlIGlzIGNvbXBsZXRlLCBhbmQKLSAgICAgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogQHNlZSAjaXNQYWdlQ29tcGxldGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlQ29tcGxldGUoYm9vbGVhbiBjb21wbGV0ZSkgewotICAgICAgICBpc1BhZ2VDb21wbGV0ZSA9IGNvbXBsZXRlOwotICAgICAgICBpZiAoaXNDdXJyZW50UGFnZSgpKQotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgcHJldmlvdXNQYWdlID0gcGFnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JRGlhbG9nUGFnZTwvY29kZT4KLSAgICAgKiBtZXRob2QgZXh0ZW5kcyB0aGUgPGNvZGU+RGlhbG9nUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gdG8gdXBkYXRlCi0gICAgICogdGhlIHdpemFyZCBjb250YWluZXIgdGl0bGUgYmFyLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgaWYgKGlzQ3VycmVudFBhZ2UoKSkgewotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkudXBkYXRlVGl0bGVCYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V2l6YXJkKElXaXphcmQgbmV3V2l6YXJkKSB7Ci0gICAgICAgIHdpemFyZCA9IG5ld1dpemFyZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgd2l6YXJkIHBhZ2Ugc3VpdGFibGUKLSAgICAgKiBvbmx5IGZvciBkZWJ1ZyBwdXJwb3Nlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvV2l6YXJkU2VsZWN0aW9uUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2l6YXJkL1dpemFyZFNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdmN2VlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvV2l6YXJkU2VsZWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgd2l6YXJkIHBhZ2UgdGhhdCBtYW5hZ2VzIGEKLSAqIHNldCBvZiBlbWJlZGRlZCB3aXphcmRzLgotICogPHA+Ci0gKiBBIHdpemFyZCBzZWxlY3Rpb24gcGFnZSBzaG91bGQgcHJlc2VudCBhIGxpc3Qgb2Ygd2l6YXJkIG5vZGVzIAotICogY29ycmVzcG9uZGluZyB0byBvdGhlciB3aXphcmRzLiBXaGVuIHRoZSBlbmQgdXNlciBzZWxlY3RzIG9uZSBvZgotICogdGhlbSBmcm9tIHRoZSBsaXN0LCB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgc2VsZWN0ZWQgd2l6YXJkIGJlY29tZXMKLSAqIHRoZSBuZXh0IHBhZ2UuIFRoZSBvbmx5IG5ldyBtZXRob2RzIGludHJvZHVjZWQgYnkgdGhpcyBjbGFzcyBhcmUgCi0gKiA8Y29kZT5nZXRTZWxlY3RlZE5vZGU8L2NvZGU+IGFuZCA8Y29kZT5zZXRTZWxlY3RlZE5vZGU8L2NvZGU+LiAKLSAqIE90aGVyd2lzZSwgdGhlIHN1YmNsYXNzIGNvbnRyYWN0IGlzIHRoZSBzYW1lIGFzIDxjb2RlPldpemFyZFBhZ2U8L2NvZGU+LgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2l6YXJkU2VsZWN0aW9uUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0gICAgLyoqCi0gICAgICogVGhlIHNlbGVjdGVkIG5vZGU7IDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJV2l6YXJkTm9kZSBzZWxlY3RlZE5vZGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiB3aXphcmQgbm9kZXMgdGhhdCBoYXZlIGNyb3BwZWQgdXAgaW4gdGhlIHBhc3QKLSAgICAgKiAoZWxlbWVudCB0eXBlOiA8Y29kZT5JV2l6YXJkTm9kZTwvY29kZT4pLgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBzZWxlY3RlZFdpemFyZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB3aXphcmQgc2VsZWN0aW9uIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgYW5kCi0gICAgICogd2l0aCBubyB0aXRsZSBvciBpbWFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFnZQotICAgICAqLwotICAgIHByb3RlY3RlZCBXaXphcmRTZWxlY3Rpb25QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotICAgICAgICBzdXBlcihwYWdlTmFtZSk7Ci0gICAgICAgIC8vIENhbm5vdCBmaW5pc2ggZnJvbSB0aGlzIHBhZ2UKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiB3aXphcmQgbm9kZSB0byB0aGUgbGlzdCBvZiBzZWxlY3RlZCBub2RlcyBpZgotICAgICAqIGl0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgdGhlIHdpemFyZCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRTZWxlY3RlZE5vZGUoSVdpemFyZE5vZGUgbm9kZSkgewotICAgICAgICBpZiAobm9kZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChzZWxlY3RlZFdpemFyZE5vZGVzLmNvbnRhaW5zKG5vZGUpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHNlbGVjdGVkV2l6YXJkTm9kZXMuYWRkKG5vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XaXphcmRTZWxlY3Rpb25QYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiAKLSAgICAgKiB0aGlzIDxjb2RlPklXaXphcmRQYWdlPC9jb2RlPiBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPgotICAgICAqIGlmIHRoZXJlIGlzIGEgc2VsZWN0ZWQgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkTm9kZSAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgkKLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkU2VsZWN0aW9uUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgYW4gPGNvZGU+SURpYWxvZ1BhZ2U8L2NvZGU+Ci0gICAgICogbWV0aG9kIGRpc3Bvc2VzIG9mIGFsbCBuZXN0ZWQgd2l6YXJkcy4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgLy8gbm90aWZ5IG5lc3RlZCB3aXphcmRzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRXaXphcmROb2Rlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgKChJV2l6YXJkTm9kZSkgc2VsZWN0ZWRXaXphcmROb2Rlcy5nZXQoaSkpLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XaXphcmRTZWxlY3Rpb25QYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiAKLSAgICAgKiB0aGlzIDxjb2RlPklXaXphcmRQYWdlPC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgcGFnZSAKLSAgICAgKiBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHdpemFyZCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotICAgICAgICBpZiAoc2VsZWN0ZWROb2RlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBib29sZWFuIGlzQ3JlYXRlZCA9IHNlbGVjdGVkTm9kZS5pc0NvbnRlbnRDcmVhdGVkKCk7Ci0KLSAgICAgICAgSVdpemFyZCB3aXphcmQgPSBzZWxlY3RlZE5vZGUuZ2V0V2l6YXJkKCk7Ci0KLSAgICAgICAgaWYgKHdpemFyZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRTZWxlY3RlZE5vZGUobnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNDcmVhdGVkKQotICAgICAgICAgICAgLy8gQWxsb3cgdGhlIHdpemFyZCB0byBjcmVhdGUgaXRzIHBhZ2VzCi0gICAgICAgICAgICB3aXphcmQuYWRkUGFnZXMoKTsKLQotICAgICAgICByZXR1cm4gd2l6YXJkLmdldFN0YXJ0aW5nUGFnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB3aXphcmQgbm9kZSB3aXRoaW4gdGhpcyBwYWdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHdpemFyZCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBub2RlIGlzIHNlbGVjdGVkCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmROb2RlIGdldFNlbGVjdGVkTm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkTm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHdpemFyZCBub2RlIHdpdGhpbiB0aGlzIHBhZ2UuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBub2RlIHRoZSB3aXphcmQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gY2xlYXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3RlZE5vZGUoSVdpemFyZE5vZGUgbm9kZSkgewotICAgICAgICBhZGRTZWxlY3RlZE5vZGUobm9kZSk7Ci0gICAgICAgIHNlbGVjdGVkTm9kZSA9IG5vZGU7Ci0gICAgICAgIGlmIChpc0N1cnJlbnRQYWdlKCkpCi0gICAgICAgICAgICBnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2l6YXJkL2ltYWdlcy9wYWdlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9pbWFnZXMvcGFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZDkwZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qZmFjZS9zcmMvb3JnL2VjbGlwc2UvamZhY2Uvd2l6YXJkL2ltYWdlcy9wYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpmYWNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS93aXphcmQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU3YzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuamZhY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3dpemFyZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotUHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIHdpemFyZHMuCi08aDI+Ci1QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotQSB3aXphcmQgZGlhbG9nIGlzIGEgc3BlY2lhbGl6ZWQgd2luZG93IGZvciB3YWxraW5nIHRoZSBlbmQgdXNlciB0aHJvdWdoCi1hIHNlcXVlbmNlIG9mIHN0ZXBzOyBlYWNoIHN0ZXAgaXMgcHJlc2VudGVkIG9uIGEgc2VwYXJhdGUgcGFnZS4KLTxwPkF0IHRoZSBtb3N0IGFic3RyYWN0IGxldmVsLCB0aGUgcHJvdG9jb2wgaXMgZ2l2ZW4gYnkgMyBpbnRlcmZhY2VzOgotPHVsPgotPGxpPgotPHR0PklXaXphcmQ8L3R0PiAtIGEgd2l6YXJkIGNvbnNpc3Rpbmcgb2Ygc2V2ZXJhbCB3aXphcmQgcGFnZXM8L2xpPgotCi08bGk+Ci08dHQ+SVdpemFyZFBhZ2U8L3R0PiAtIGFuIGluZGl2aWR1YWwgd2l6YXJkIHBhZ2U8L2xpPgotCi08bGk+Ci08dHQ+SVdpemFyZENvbnRhaW5lcjwvdHQ+IC0gdGhlIG91dHNpZGUgd29ybGQgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZgotYSB3aXphcmQ8L2xpPgotPC91bD4KLUEgd2l6YXJkIGlzIGFueSBvYmplY3QgaW1wbGVtZW50aW5nIDx0dD5JV2l6YXJkPC90dD4uIFRoZSBhYnN0cmFjdCBiYXNlCi1jbGFzcyA8dHQ+V2l6YXJkPC90dD4gaXMgcHJvdmlkZWQgYXMgYSBzdGFydGluZyBwb2ludDsgaXQgaXMgc2ltcGxlciB0bwotc3ViY2xhc3MgPHR0PldpemFyZDwvdHQ+IHRoYW4gdG8gaW1wbGVtZW50IDx0dD5JV2l6YXJkPC90dD4gZnJvbSBzY3JhdGNoLgotVGhlIG1haW4gcmVzcG9uc2liaWxpdHkgb2YgYSA8dHQ+V2l6YXJkPC90dD4gc3ViY2xhc3MgaXMgZG9pbmcgdGhlIHJlYWwKLXdvcmsgd2hlbiB0aGUgd2l6YXJkIGZpbmlzaGVzLgotPHA+U2ltaWxhcmx5LCBhIHdpemFyZCBwYWdlIGlzIGFueSBvYmplY3QgaW1wbGVtZW50aW5nIDx0dD5JV2l6YXJkUGFnZTwvdHQ+LgotVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgPHR0PldpemFyZFBhZ2U8L3R0PiBpcyBwcm92aWRlZCBhcyBhIHN0YXJ0aW5nIHBvaW50LgotVGhlIG1haW4gcmVzcG9uc2liaWxpdHkgb2YgYSA8dHQ+V2l6YXJkUGFnZTwvdHQ+IHN1YmNsYXNzIGlzIHByb3ZpZGluZwotdGhlIFNXVCBjb250cm9scyBhbmQgdGhlIGJhY2tpbmcgbG9naWMgZm9yIGEgc2luZ2xlIHdpemFyZCBwYWdlLgotPHA+PHR0PldpemFyZERpYWxvZzwvdHQ+IGlzIGEgcmVhZHktdG8tdXNlIEpGYWNlIGRpYWxvZyB0aGF0IGlzIGluc3RhbnRpYXRlZAotd2l0aCBhIHdpemFyZCBhbmQgYWN0cyBhcyB0aGUgd2l6YXJkJ3MgY29udGFpbmVyLiBUaGlzIGRpYWxvZyBoYXMgYSBzdGFuZGFyZAotbGF5b3V0OiBhbiBhcmVhIGF0IHRoZSB0b3AgY29udGFpbmluZyB0aGUgd2l6YXJkJ3MgdGl0bGUsIGRlc2NyaXB0aW9uLAotYW5kIGltYWdlOyB0aGUgYWN0dWFsIHdpemFyZCBwYWdlIGFwcGVhcnMgaW4gdGhlIG1pZGRsZTsgYmVsb3cgaXQgaXMgYQotcHJvZ3Jlc3MgaW5kaWNhdG9yOyBhbmQgYXQgdGhlIGJvdHRvbSBpcyBhbiBhcmVhIHdpdGggYSBtZXNzYWdlIGxpbmUgYW5kCi1hIGJ1dHRvbiBiYXIgY29udGFpbmluZyBOZXh0LCBCYWNrLCBGaW5pc2gsIENhbmNlbCwgYW5kIEhlbHAgYnV0dG9ucy4KLTxwPjx0dD5XaXphcmRTZWxlY3Rpb25QYWdlPC90dD4sIGEgc3BlY2lhbCBhYnN0cmFjdCBzdWJjbGFzcyBvZiA8dHQ+V2l6YXJkUGFnZTwvdHQ+LAotYWxsb3dzIHdob2xlIG90aGVyIHdpemFyZHMgdG8gYmUgY29ubmVjdGVkIHRvIGEgcm9vdCBwYWdlLgotPHA+Tm90ZTogTm9uZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgbWFpbnRhaW4gZ2xvYmFsIHN0YXRlLgotPGJyPiZuYnNwOwotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ODExNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2UudWkuYnJvd3NlciBwbHVnaW4uCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIHRoZSBvcmcuZWNsaXBzZS51aS5icm93c2VyIHBsdWdpbi4KLW9yZy5lY2xpcHNlLnVpLmJyb3dzZXIvZGVidWc9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1ODU3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS51aS5icm93c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDllYjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaHUgTWFyIDMxIDE3OjIzOjMwIEVTVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL01lc3NhZ2VzLnByb3BlcnRpZXM9ODg1OV8xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlMTE2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI01vbiBBcHIgMTggMTE6MzE6MTAgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTcxYWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jTW9uIEFwciAxOCAxMToyNzo1MiBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQotb3JnLmVjbGlwc2UuamR0LnVpLmdldHRlcnNldHRlci51c2UuaXM9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTBkMTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQbHVnaW4ubmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UudWkuYnJvd3Nlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBsdWdpbi5wcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIsCi0gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuYnJvd3NlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLm1hY29zeDt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4xLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU0NTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBob21lLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGRlZmF1bHRCcm93c2Vycy54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzODc4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0iV2ViIEJyb3dzZXIgU3VwcG9ydCI+Ci0gIDxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLSAgPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkuYnJvd3NlciIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIiPgotICAgIDx0eXBlIG5hbWU9IkJyb3dzZXJGYWN0b3J5IiBpbXBsZW1lbnQ9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgPC9wYWNrYWdlPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2NsY2wxNi9uYXZfYmFja3dhcmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2NsY2wxNi9uYXZfYmFja3dhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDBlOGNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9jbGNsMTYvbmF2X2JhY2t3YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9jbGNsMTYvbmF2X2ZvcndhcmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2NsY2wxNi9uYXZfZm9yd2FyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NTY3ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2NsY2wxNi9uYXZfZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvY2xjbDE2L25hdl9nby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvY2xjbDE2L25hdl9nby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YjNiZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2NsY2wxNi9uYXZfZ28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2NsY2wxNi9uYXZfaG9tZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvY2xjbDE2L25hdl9ob21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlZmI2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvY2xjbDE2L25hdl9ob21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9jbGNsMTYvbmF2X3ByaW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9jbGNsMTYvbmF2X3ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyMTNjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvY2xjbDE2L25hdl9wcmludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvY2xjbDE2L25hdl9yZWZyZXNoLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9jbGNsMTYvbmF2X3JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2EwNGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9jbGNsMTYvbmF2X3JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2NsY2wxNi9uYXZfc3RvcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvY2xjbDE2L25hdl9zdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0M2ExMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvY2xjbDE2L25hdl9zdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9kbGNsMTYvbmF2X2JhY2t3YXJkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9kbGNsMTYvbmF2X2JhY2t3YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiMGU4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZGxjbDE2L25hdl9iYWNrd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZGxjbDE2L25hdl9mb3J3YXJkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9kbGNsMTYvbmF2X2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjNlNWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9kbGNsMTYvbmF2X2ZvcndhcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2RsY2wxNi9uYXZfZ28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2RsY2wxNi9uYXZfZ28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGY3M2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9kbGNsMTYvbmF2X2dvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9kbGNsMTYvbmF2X2hvbWUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2RsY2wxNi9uYXZfaG9tZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNWQ1NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2RsY2wxNi9uYXZfaG9tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZGxjbDE2L25hdl9wcmludC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZGxjbDE2L25hdl9wcmludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTBiYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2RsY2wxNi9uYXZfcHJpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2RsY2wxNi9uYXZfcmVmcmVzaC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZGxjbDE2L25hdl9yZWZyZXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0ODQ4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZGxjbDE2L25hdl9yZWZyZXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9kbGNsMTYvbmF2X3N0b3AuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2RsY2wxNi9uYXZfc3RvcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNDVkNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2RsY2wxNi9uYXZfc3RvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZGxjbDE2L3N5bmNlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZGxjbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNmU0M2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2RsY2wxNi9zeW5jZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2VsY2wxNi9uYXZfYmFja3dhcmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2VsY2wxNi9uYXZfYmFja3dhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDBlOGNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9lbGNsMTYvbmF2X2JhY2t3YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9lbGNsMTYvbmF2X2ZvcndhcmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2VsY2wxNi9uYXZfZm9yd2FyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NTY3ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2VsY2wxNi9uYXZfZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZWxjbDE2L25hdl9nby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZWxjbDE2L25hdl9nby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YjNiZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2VsY2wxNi9uYXZfZ28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2VsY2wxNi9uYXZfaG9tZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZWxjbDE2L25hdl9ob21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlZmI2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZWxjbDE2L25hdl9ob21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9lbGNsMTYvbmF2X3ByaW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9lbGNsMTYvbmF2X3ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyMTNjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZWxjbDE2L25hdl9wcmludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZWxjbDE2L25hdl9yZWZyZXNoLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9lbGNsMTYvbmF2X3JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2EwNGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9lbGNsMTYvbmF2X3JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL2VsY2wxNi9uYXZfc3RvcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZWxjbDE2L25hdl9zdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0M2ExMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZWxjbDE2L25hdl9zdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9lbGNsMTYvc3luY2VkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9lbGNsMTYvc3luY2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwOTM0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvZWxjbDE2L3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvb2JqMTYvYnVzeS8xLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2YwNmFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvMTAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvMTAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzVlNjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzEwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzExLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzExLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmZDA2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvb2JqMTYvYnVzeS8xMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvb2JqMTYvYnVzeS8xMi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvb2JqMTYvYnVzeS8xMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NGQ3MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvMTIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvMTMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvMTMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTA3YTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzEzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNGQwNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvb2JqMTYvYnVzeS8zLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDBlMjFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvNC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvb2JqMTYvYnVzeS80LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0YTczNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvb2JqMTYvYnVzeS80LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvNS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Mjk4OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvNS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvb2JqMTYvYnVzeS82LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDI4NDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvNy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvb2JqMTYvYnVzeS83LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZjMmZmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvb2JqMTYvYnVzeS83LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzguZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvOC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTljNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2J1c3kvOC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvb2JqMTYvYnVzeS85LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NThmYzY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9idXN5LzkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2V4dGVybmFsX2Jyb3dzZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL2ljb25zL29iajE2L2V4dGVybmFsX2Jyb3dzZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTFmOTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9leHRlcm5hbF9icm93c2VyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9pbnRlcm5hbF9icm93c2VyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9pY29ucy9vYmoxNi9pbnRlcm5hbF9icm93c2VyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5YzM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvaWNvbnMvb2JqMTYvaW50ZXJuYWxfYnJvd3Nlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Yzc5YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUGx1Z2luLm5hbWU9QnJvd3NlciBTdXBwb3J0Ci1QbHVnaW4ucHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLWJyb3dzZXJfZXh0ZW5zaW9uX3BvaW50X25hbWU9V2ViIEJyb3dzZXIKLQotdmlld1dlYkJyb3dzZXJUaXRsZT1JbnRlcm5hbCBXZWIgQnJvd3Nlcgotdmlld1dlYkJyb3dzZXJTdXBwb3J0VGl0bGU9IFdlYiBCcm93c2VyCi1wcmVmZXJlbmNlV2ViQnJvd3NlclRpdGxlPVdlYiBCcm93c2VyCi1wcmVmZXJlbmNlS2V5d29yZHM9SFRNTCBGaXJlZm94IE1vemlsbGEgTmV0c2NhcGUgSW50ZXJuZXQgT3BlcmEgU2FmYXJpCi0KLWFjdGlvblNldFdlYkJyb3dzZXJUaXRsZT1XZWIgQnJvd3NlcgotYWN0aW9uU2V0T3BlbldlYkJyb3dzZXI9T3BlbiBXZWIgQnJvd3NlcgotCi1icm93c2VySW50ZXJuZXRFeHBsb3Jlcj1JbnRlcm5ldCBFeHBsb3JlcgotYnJvd3Nlck5ldHNjYXBlND1OZXRzY2FwZSBDb21tdW5pY2F0b3IgdjQueAotYnJvd3Nlck5ldHNjYXBlNz1OZXRzY2FwZSB2Ny54Ci1icm93c2VyTmV0c2NhcGU9TmV0c2NhcGUKLWJyb3dzZXJNb3ppbGxhPU1vemlsbGEKLWJyb3dzZXJPcGVyYT1PcGVyYQotYnJvd3NlcktvbnF1ZXJvcj1Lb25xdWVyb3IKLWJyb3dzZXJHYWxlb249R2FsZW9uCi1icm93c2VyRmlyZWZveD1GaXJlZm94Ci1icm93c2VyU2FmYXJpPVNhZmFyaQotYnJvd3NlckNhbWlubz1DYW1pbm8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NmYxMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImJyb3dzZXJzIiBuYW1lPSIlYnJvd3Nlcl9leHRlbnNpb25fcG9pbnRfbmFtZSIgc2NoZW1hPSJzY2hlbWEvYnJvd3NlcnMuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyLnByZWZlcmVuY2VQYWdlIgotICAgICAgICAgbmFtZT0iJXByZWZlcmVuY2VXZWJCcm93c2VyVGl0bGUiCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLldvcmtiZW5jaCIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyLnByZWZlcmVuY2VLZXl3b3JkcyIvPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLSAgICAgIDxrZXl3b3JkCi0gICAgICAgICBsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3JkcyIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyLnByZWZlcmVuY2VLZXl3b3JkcyIvPgotICAgPC9leHRlbnNpb24+ICAKLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYnJvd3NlclN1cHBvcnQiPgotICAgICAgPHN1cHBvcnQKLSAgICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5EZWZhdWx0QnJvd3NlclN1cHBvcnQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8dmlldwotICAgICAgICAgYWxsb3dNdWx0aXBsZT0idHJ1ZSIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJWaWV3IgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvaW50ZXJuYWxfYnJvd3Nlci5naWYiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYnJvd3Nlci52aWV3IgotICAgICAgICAgbmFtZT0iJXZpZXdXZWJCcm93c2VyVGl0bGUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJFZGl0b3IiCi0gICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L2ludGVybmFsX2Jyb3dzZXIuZ2lmIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuZWRpdG9yIgotICAgICAgICAgbmFtZT0iJXZpZXdXZWJCcm93c2VyVGl0bGUiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgIGV4dGVuc2lvbnM9Imh0bSxodG1sLHNodG1sIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvaW50ZXJuYWxfYnJvd3Nlci5naWYiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5lZGl0b3JTdXBwb3J0IgotICAgICAgICAgbGF1bmNoZXI9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuQnJvd3NlckxhdW5jaGVyIgotICAgICAgICAgbmFtZT0iJXZpZXdXZWJCcm93c2VyU3VwcG9ydFRpdGxlIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08IS0tCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgIDxhY3Rpb25TZXQKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyLmFjdGlvblNldCIKLSAgICAgIGxhYmVsPSIlYWN0aW9uU2V0V2ViQnJvd3NlclRpdGxlIgotICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICA8YWN0aW9uCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyLmFjdGlvbi5vcGVuIgotICAgICAgICB0b29sYmFyUGF0aD0iYnJvd3NlciIKLSAgICAgICAgbGFiZWw9IiVhY3Rpb25TZXRPcGVuV2ViQnJvd3NlciIKLSAgICAgICAgdG9vbHRpcD0iJWFjdGlvblNldE9wZW5XZWJCcm93c2VyIgotICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9pbnRlcm5hbF9icm93c2VyLmdpZiIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24iLz4KLSAgICA8L2FjdGlvblNldD4KLSAgPC9leHRlbnNpb24+Ci0tLT4KLQotICAgPCEtLSBXZWIgQnJvd3NlcnMgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5icm93c2VyLmJyb3dzZXJzIj4KLSAgICAgIDwhLS0gTGludXggLS0+Ci0gICAgICA8YnJvd3NlcgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIubW96aWxsYSIKLSAgICAgICAgIG5hbWU9IiVicm93c2VyTW96aWxsYSIKLSAgICAgICAgIG9zPSJsaW51eCxhaXgsaHB1eCxzb2xhcmlzIgotICAgICAgICAgZXhlY3V0YWJsZT0ibW96aWxsYSIKLSAgICAgICAgIGZhY3RvcnljbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5icm93c2Vycy5Nb3ppbGxhRmFjdG9yeSI+Ci0gICAgICAgICA8bG9jYXRpb24+dXNyL2Jpbi9tb3ppbGxhPC9sb2NhdGlvbj4KLSAgICAgICAgIDxsb2NhdGlvbj51c3IvWDExL2Jpbi9tb3ppbGxhPC9sb2NhdGlvbj4KLSAgICAgIDwvYnJvd3Nlcj4KLSAgICAgIDxicm93c2VyCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5uZXRzY2FwZSIKLSAgICAgICAgIG5hbWU9IiVicm93c2VyTmV0c2NhcGUiCi0gICAgICAgICBvcz0ibGludXgsYWl4LGhwdXgsc29sYXJpcyIKLSAgICAgICAgIGV4ZWN1dGFibGU9Im5ldHNjYXBlIgotICAgICAgICAgZmFjdG9yeWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLmJyb3dzZXJzLk1vemlsbGFGYWN0b3J5Ij4KLSAgICAgICAgIDxsb2NhdGlvbj51c3IvYmluL25ldHNjYXBlPC9sb2NhdGlvbj4KLSAgICAgICAgIDxsb2NhdGlvbj51c3IvWDExUjYvYmluL25ldHNjYXBlPC9sb2NhdGlvbj4KLSAgICAgICAgIDxsb2NhdGlvbj51c3IvZHQvYmluL25ldHNjYXBlPC9sb2NhdGlvbj4KLSAgICAgIDwvYnJvd3Nlcj4KLSAgICAgIDxicm93c2VyCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5maXJlZm94IgotICAgICAgICAgbmFtZT0iJWJyb3dzZXJGaXJlZm94IgotICAgICAgICAgb3M9ImxpbnV4LGFpeCxocHV4LHNvbGFyaXMiCi0gICAgICAgICBleGVjdXRhYmxlPSJmaXJlZm94IgotICAgICAgICAgZmFjdG9yeWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLmJyb3dzZXJzLk1vemlsbGFGYWN0b3J5Ij4KLSAgICAgIDwvYnJvd3Nlcj4KLSAgICAgIDxicm93c2VyCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5rb25xdWVyb3IiCi0gICAgICAgICBuYW1lPSIlYnJvd3NlcktvbnF1ZXJvciIKLSAgICAgICAgIG9zPSJsaW51eCxhaXgsaHB1eCxzb2xhcmlzIgotICAgICAgICAgZXhlY3V0YWJsZT0ia29ucXVlcm9yIj4KLSAgICAgICAgIDxsb2NhdGlvbj5vcHQva2RlMy9iaW4va29ucXVlcm9yPC9sb2NhdGlvbj4KLSAgICAgIDwvYnJvd3Nlcj4KLSAgICAgIDxicm93c2VyCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5nYWxlb24iCi0gICAgICAgICBuYW1lPSIlYnJvd3NlckdhbGVvbiIKLSAgICAgICAgIG9zPSJsaW51eCxhaXgsaHB1eCxzb2xhcmlzIgotICAgICAgICAgZXhlY3V0YWJsZT0iZ2FsZW9uIj4KLSAgICAgICAgIDxsb2NhdGlvbj5vcHQvdXNyL2dub21lL2Jpbi9nYWxlb248L2xvY2F0aW9uPgotICAgICAgPC9icm93c2VyPgotICAgICAgCi0gICAgICA8IS0tIFdpbmRvd3MgLS0+Ci0gICAgICA8YnJvd3NlcgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIubW96aWxsYSIKLSAgICAgICAgIG5hbWU9IiVicm93c2VyTW96aWxsYSIKLSAgICAgICAgIG9zPSJXaW4zMiIKLSAgICAgICAgIGV4ZWN1dGFibGU9Im1vemlsbGEuZXhlIgotICAgICAgICAgZmFjdG9yeWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLmJyb3dzZXJzLk1vemlsbGFGYWN0b3J5Ij4KLSAgICAgICAgIDxsb2NhdGlvbj5Qcm9ncmFtIEZpbGVzXG1vemlsbGEub3JnXE1vemlsbGFcbW96aWxsYS5leGU8L2xvY2F0aW9uPgotICAgICAgPC9icm93c2VyPgotICAgICAgPGJyb3dzZXIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyLm5ldHNjYXBlNyIKLSAgICAgICAgIG5hbWU9IiVicm93c2VyTmV0c2NhcGU3IgotICAgICAgICAgb3M9IldpbjMyIgotICAgICAgICAgZXhlY3V0YWJsZT0ibmV0c2MuZXhlIgotICAgICAgICAgZmFjdG9yeWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLmJyb3dzZXJzLk1vemlsbGFGYWN0b3J5Ij4KLSAgICAgICAgIDxsb2NhdGlvbj5Qcm9ncmFtIEZpbGVzXE5ldHNjYXBlXE5ldHNjYXBlXG5ldHNjcC5leGU8L2xvY2F0aW9uPgotICAgICAgPC9icm93c2VyPgotICAgICAgPGJyb3dzZXIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyLm5ldHNjYXBlNCIKLSAgICAgICAgIG5hbWU9IiVicm93c2VyTmV0c2NhcGU0IgotICAgICAgICAgb3M9IldpbjMyIgotICAgICAgICAgZXhlY3V0YWJsZT0ibmV0c2NhcGUuZXhlIgotICAgICAgICAgZmFjdG9yeWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLmJyb3dzZXJzLk1vemlsbGFGYWN0b3J5Ij4KLSAgICAgICAgIDxsb2NhdGlvbj5Qcm9ncmFtIEZpbGVzXE5ldHNjYXBlXENvbW11bmljYXRvclxQcm9ncmFtXG5ldHNjYXBlLmV4ZTwvbG9jYXRpb24+Ci0gICAgICA8L2Jyb3dzZXI+Ci0gICAgICA8YnJvd3NlcgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuZmlyZWZveCIKLSAgICAgICAgIG5hbWU9IiVicm93c2VyRmlyZWZveCIKLSAgICAgICAgIG9zPSJXaW4zMiIKLSAgICAgICAgIGV4ZWN1dGFibGU9ImZpcmVmb3guZXhlIgotICAgICAgICAgZmFjdG9yeWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLmJyb3dzZXJzLk1vemlsbGFGYWN0b3J5Ij4KLSAgICAgICAgIDxsb2NhdGlvbj5Qcm9ncmFtIEZpbGVzXG1vemlsbGEub3JnXEZpcmVmb3hcZmlyZWZveC5leGU8L2xvY2F0aW9uPgotICAgICAgICAgPGxvY2F0aW9uPlByb2dyYW0gRmlsZXNcTW96aWxsYSBGaXJlZm94XGZpcmVmb3guZXhlPC9sb2NhdGlvbj4KLSAgICAgIDwvYnJvd3Nlcj4KLSAgICAgIDxicm93c2VyCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5pZSIKLSAgICAgICAgIG5hbWU9IiVicm93c2VySW50ZXJuZXRFeHBsb3JlciIKLSAgICAgICAgIG9zPSJXaW4zMiIKLSAgICAgICAgIGV4ZWN1dGFibGU9ImlleHBsb3JlLmV4ZSI+Ci0gICAgICAgICA8bG9jYXRpb24+UHJvZ3JhbSBGaWxlc1xJbnRlcm5ldCBFeHBsb3JlclxpZXhwbG9yZS5leGU8L2xvY2F0aW9uPgotICAgICAgPC9icm93c2VyPgotICAgICAgPGJyb3dzZXIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyLm9wZXJhIgotICAgICAgICAgbmFtZT0iJWJyb3dzZXJPcGVyYSIKLSAgICAgICAgIG9zPSJXaW4zMiIKLSAgICAgICAgIGV4ZWN1dGFibGU9Im9wZXJhLmV4ZSI+Ci0gICAgICAgICA8bG9jYXRpb24+UHJvZ3JhbSBGaWxlc1xPcGVyYTdcb3BlcmEuZXhlPC9sb2NhdGlvbj4KLSAgICAgIDwvYnJvd3Nlcj4KLSAgICAgIAotICAgICAgPCEtLSBNYWMgLS0+Ci0gICAgICA8YnJvd3NlcgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuZmlyZWZveCIKLSAgICAgICAgIG5hbWU9IiVicm93c2VyRmlyZWZveCIKLSAgICAgICAgIG9zPSJNYWNPU1giCi0gICAgICAgICBleGVjdXRhYmxlPSJmaXJlZm94LWJpbiIKLSAgICAgICAgIGZhY3RvcnljbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5icm93c2Vycy5Nb3ppbGxhRmFjdG9yeSI+Ci0gICAgICAgICA8bG9jYXRpb24+QXBwbGljYXRpb25zL0ZpcmVmb3guYXBwL0NvbnRlbnRzL01hY09TL2ZpcmVmb3gtYmluPC9sb2NhdGlvbj4KLSAgICAgIDwvYnJvd3Nlcj4KLSAgICAgIDxicm93c2VyCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5jYW1pbm8iCi0gICAgICAgICBuYW1lPSIlYnJvd3NlckNhbWlubyIKLSAgICAgICAgIG9zPSJNYWNPU1giCi0gICAgICAgICBleGVjdXRhYmxlPSJDYW1pbm8iPgotICAgICAgICAgPGxvY2F0aW9uPkFwcGxpY2F0aW9ucy9DYW1pbm8uYXBwL0NvbnRlbnRzL01hY09TL0NhbWlubzwvbG9jYXRpb24+Ci0gICAgICA8L2Jyb3dzZXI+Ci08IS0tICAgICAgPGJyb3dzZXIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyLnNhZmFyaSIKLSAgICAgICAgIG5hbWU9IiVicm93c2VyU2FmYXJpIgotICAgICAgICAgb3M9Ik1hY09TWCIKLSAgICAgICAgIGV4ZWN1dGFibGU9IlNhZmFyaSIKLSAgICAgICAgIGZhY3RvcnljbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5tYWNvc3guU2FmYXJpQnJvd3NlckZhY3RvcnkiPgotICAgICAgICAgPGxvY2F0aW9uPkFwcGxpY2F0aW9ucy9TYWZhcmkuYXBwL0NvbnRlbnRzL01hY09TL1NhZmFyaTwvbG9jYXRpb24+Ci0gICAgICA8L2Jyb3dzZXI+IC0tPgotICAgICAgPGJyb3dzZXIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyLm1vemlsbGEiCi0gICAgICAgICBuYW1lPSIlYnJvd3Nlck1vemlsbGEiCi0gICAgICAgICBvcz0iTWFjT1NYIgotICAgICAgICAgZXhlY3V0YWJsZT0ibW96aWxsYS1iaW4iCi0gICAgICAgICBmYWN0b3J5Y2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuYnJvd3NlcnMuTW96aWxsYUZhY3RvcnkiPgotICAgICAgICAgPGxvY2F0aW9uPkFwcGxpY2F0aW9ucy9Nb3ppbGxhLmFwcC9Db250ZW50cy9NYWNPUy9tb3ppbGxhLWJpbjwvbG9jYXRpb24+Ci0gICAgICA8L2Jyb3dzZXI+Ci0gICAgICA8YnJvd3NlcgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuaWUiCi0gICAgICAgICBuYW1lPSIlYnJvd3NlckludGVybmV0RXhwbG9yZXIiCi0gICAgICAgICBvcz0iTWFjT1NYIgotICAgICAgICAgZXhlY3V0YWJsZT0iSW50ZXJuZXQgRXhwbG9yZXIiPgotICAgICAgICAgPGxvY2F0aW9uPkFwcGxpY2F0aW9ucy9JbnRlcm5ldCBFeHBsb3Jlci5hcHAvQ29udGVudHMvTWFjT1MvIkludGVybmV0IEV4cGxvcmVyIjwvbG9jYXRpb24+Ci0gICAgICA8L2Jyb3dzZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NjaGVtYS9icm93c2Vycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NjaGVtYS9icm93c2Vycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTJkYWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zY2hlbWEvYnJvd3NlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aS5icm93c2VyIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5icm93c2VyIiBpZD0iYnJvd3NlcnMiIG5hbWU9IkJyb3dzZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEZvciBwcm92aWRpbmcgd2ViIGJyb3dzZXJzIGNhcGFibGUgb2YgZGlzcGxheWluZyBodG1sIGRvY3VtZW50cyBhdCBhIGdpdmVuIFVSTC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYnJvd3NlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJicm93c2VyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibG9jYXRpb24iLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSB1bmlxdWUgSUQgb2YgdGhlIGJyb3dzZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeWNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhlIGJyb3dzZXIgZmFjdG9yeS4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuYnJvd3Nlci5Ccm93c2VyRmFjdG9yeSZsdDsvc2FtcCZndDsgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuaGVscC5icm93c2VyLklCcm93c2VyRmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIgKHRyYW5zbGF0YWJsZSkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBvcGVyYXRpbmcgc3lzdGVtcy4gT25seSBicm93c2VycyB3aXRoIHRoZSBjb3JyZWN0IE9TIHdpbGwgYmUgdXNlZC4gSWYgdGhlIG9zIHBhcmFtZXRlciBpcyBlbXB0eSwgdGhlIGJyb3dzZXIgd2lsbCBiZSBhc3N1bWVkIHRvIHdvcmsgb24gYWxsIE9TCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhlY3V0YWJsZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgZXhlY3V0YWJsZSBmaWxlbmFtZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZhdWx0IGluc3RhbGwgbG9jYXRpb25zLiB0aGVzZSBsb2NhdGlvbnMgc2hvdWxkIG5vdCBjb250YWluIHRoZSBpbml0aWFsIHBhdGgsIGFzIGl0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCBhbGwga25vd24gZHJpdmVzLiAoZS5nLiBvbiBXaW5kb3dzLCBhIGxvY2F0aW9uIG9mICZxdW90O3Rlc3QuZXhlJnF1b3Q7IHdvdWxkIGxvb2sgZm9yICZxdW90O2M6XHRlc3QuZXhlJnF1b3Q7LCAmcXVvdDtkOlx0ZXN0LmV4ZSZxdW90OywgZXRjLiBmb3IgYWxsIGtub3duIGRyaXZlcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4wIChvcmlnaW5hbGx5IGFkZGVkIGluIHJlbGVhc2UgMi4wIGFzIG9yZy5lY2xpcHNlLmhlbHAudWkuYnJvd3NlcikKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhIHNhbXBsZSB1c2FnZSBvZiB0aGUgYnJvd3NlciBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmhlbHAuYmFzZS5icm93c2VyJnF1b3Q7Jmd0OwotICAmbHQ7YnJvd3NlciAKLSAgIGlkPSZxdW90O29yZy5lY2xpcHNlLm15UGx1Z2luLm15QnJvd3NlcklEJnF1b3Q7Ci0gICBmYWN0b3J5Q2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UubXlQbHVnaW4ubXlQYWNrYWdlLk15RmFjdG9yeUNsYXNzJnF1b3Q7Ci0gICBuYW1lPSZxdW90O015IEJyb3dzZXImcXVvdDsmZ3Q7Ci0gICZsdDsvYnJvd3NlciZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBzdXBwbGllZCBmYWN0b3J5IGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5oZWxwLmJyb3dzZXIuSUJyb3dzZXJGYWN0b3J5Jmx0Oy9zYW1wJmd0OyBpbnRlcmZhY2UuCi1NZXRob2RzIGluIHRoYXQgaW50ZXJmYWNlIGRldGVybWluZSB3aGV0aGVyIHRoZSBmYWN0b3J5IGlzIGF2YWlsYWJsZSBvbiB0aGUgZ2l2ZW4gc3lzdGVtLCBpLmUuIGlzIGNhcGFibGUKLW9mIHN1cHBseWluZyBicm93c2VyIGluc3RhbmNlcywgYW5kIGNyZWF0ZSBicm93c2VyIGluc3RhbmNlcyB0aGF0IGltcGxlbWVudCBJQnJvd3NlciBpbnRlcmZhY2UuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5oZWxwLmJhc2UmbHQ7L3NhbXAmZ3Q7IGFuZCAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5oZWxwLnVpJmx0Oy9zYW1wJmd0OyBwbHVnLWlucyBjb250YWluIGltcGxlbWVudGF0aW9uIG9mIGJyb3dzZXJzIG9uIGNvbW1vbiBwbGF0Zm9ybXMuCi1PdGhlciBwbHVnLWlucyBjYW4gcHJvdmlkZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zLiAgSW4gdGhlIHByZWZlcmVuY2VzLCB0aGUgdXNlciBjYW4gc2VsZWN0IHRoZSBkZWZhdWx0Ci1icm93c2VyIGZyb20gYW1vbmcgYXZhaWxhYmxlIGJyb3dzZXJzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvYnJvd3Nlci9Ccm93c2VyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9icm93c2VyL0Jyb3dzZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OGQyMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9icm93c2VyL0Jyb3dzZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXZWJCcm93c2VyOwotLyoqCi0gKiBJbXBsZW1lbnRhdG9ycyBvZiA8Y29kZT5vcmcuZWNsaXBzZS51aS5icm93c2VyLmJyb3dzZXJzPC9jb2RlPiBleHRlbnNpb24KLSAqIHBvaW50cyBtdXN0IHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBhYnN0cmFjdCBjbGFzcy4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnJvd3NlckZhY3RvcnkgewotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBmYWN0b3J5IGNhbiB3b3JrIG9uIHRoZSB1c2VyIHN5c3RlbS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgZmFjdG9yeSBjYW4gd29yayBvbiB0aGlzIHN5c3RlbTsgZm9yCi0JICogICAgZXhhbXBsZSB0aGUgcmVxdWlyZWQgbmF0aXZlIGJyb3dzZXIgcmVxdWlyZWQgYnkgYnJvd3NlciBhZGFwdGVycyB0aGF0Ci0JICogICAgaXQgY3JlYXRlcyBpcyBub3QgaW5zdGFsbGVkLCBvciA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogT2J0YWlucyBhIG5ldyBpbnN0YW5jZSBvZiBhIHdlYiBicm93c2VyLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYnJvd3NlciBpZAotCSAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgYnJvd3NlciBsb2NhdGlvbgotCSAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBicm93c2VyIHBhcmFtZXRlcnMKLQkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIElXZWJCcm93c2VyCi0JICovCi0JcHVibGljIGFic3RyYWN0IElXZWJCcm93c2VyIGNyZWF0ZUJyb3dzZXIoU3RyaW5nIGlkLCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBwYXJhbWV0ZXJzKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvQnJvd3NlckRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9Ccm93c2VyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGIxNzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9Ccm93c2VyRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJyb3dzZXJEZXNjcmlwdG9yIGltcGxlbWVudHMgSUJyb3dzZXJEZXNjcmlwdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNRU5UT19OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fTE9DQVRJT04gPSAibG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fUEFSQU1FVEVSUyA9ICJwYXJhbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBwYXJhbWV0ZXJzOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuSVdlYkJyb3dzZXIjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLklCcm93c2VyRGVzY3JpcHRvciNnZXRMb2NhdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuSUJyb3dzZXJEZXNjcmlwdG9yI2dldFBhcmFtZXRlcnMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIHBhcmFtZXRlcnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKLQkJQnJvd3Nlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVXZWJCcm93c2VyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSUJyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkgZ2V0V29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiBuZXcgQnJvd3NlckRlc2NyaXB0b3JXb3JraW5nQ29weSh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbChJQnJvd3NlckRlc2NyaXB0b3IgYnJvd3NlcikgewotCQluYW1lID0gYnJvd3Nlci5nZXROYW1lKCk7Ci0JCWxvY2F0aW9uID0gYnJvd3Nlci5nZXRMb2NhdGlvbigpOwotCQlwYXJhbWV0ZXJzID0gYnJvd3Nlci5nZXRQYXJhbWV0ZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCW1lbWVudG8ucHV0U3RyaW5nKE1FTUVOVE9fTkFNRSwgbmFtZSk7Ci0JCW1lbWVudG8ucHV0U3RyaW5nKE1FTUVOVE9fTE9DQVRJT04sIGxvY2F0aW9uKTsKLQkJbWVtZW50by5wdXRTdHJpbmcoTUVNRU5UT19QQVJBTUVURVJTLCBwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJbmFtZSA9IG1lbWVudG8uZ2V0U3RyaW5nKE1FTUVOVE9fTkFNRSk7Ci0JCWxvY2F0aW9uID0gbWVtZW50by5nZXRTdHJpbmcoTUVNRU5UT19MT0NBVElPTik7Ci0JCXBhcmFtZXRlcnMgPSBtZW1lbnRvLmdldFN0cmluZyhNRU1FTlRPX1BBUkFNRVRFUlMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRXh0ZXJuYWwgV2ViIGJyb3dzZXI6ICIgKyBnZXROYW1lKCkgKyAiIC8gIiArIGdldExvY2F0aW9uKCkgKyAiIC8gIiArIGdldFBhcmFtZXRlcnMoKTsgICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0Jyb3dzZXJEZXNjcmlwdG9yRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvQnJvd3NlckRlc2NyaXB0b3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyZWNiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvQnJvd3NlckRlc2NyaXB0b3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlckRlc2NyaXB0b3JEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBJQnJvd3NlckRlc2NyaXB0b3JXb3JraW5nQ29weSBicm93c2VyOwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld1BhZ2VDaGVja2JveDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGNsZWFySGlzdG9yeUNoZWNrYm94OwotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCXByb3RlY3RlZCBUZXh0IGJyb3dzZXJOYW1lVGV4dGZpZWxkOwotCXByb3RlY3RlZCBUZXh0IGJyb3dzZXJMb2NhdGlvblRleHRmaWVsZDsKLQlwcm90ZWN0ZWQgVGV4dCBicm93c2VyUGFyYW1ldGVyc1RleHRmaWVsZDsKLQlwcml2YXRlIEJ1dHRvbiBva0J1dHRvbjsKLQkKLQlpbnRlcmZhY2UgU3RyaW5nTW9kaWZ5TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoU3RyaW5nIHMpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKi8KLQlwdWJsaWMgQnJvd3NlckRlc2NyaXB0b3JEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElCcm93c2VyRGVzY3JpcHRvcldvcmtpbmdDb3B5IGJyb3dzZXIpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmJyb3dzZXIgPSBicm93c2VyOwotCQlpc0VkaXQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBCcm93c2VyRGVzY3JpcHRvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCWJyb3dzZXIgPSBCcm93c2VyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUV4dGVybmFsV2ViQnJvd3NlcigpOwotCQlpc0VkaXQgPSBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCQotCQlpZiAoaXNFZGl0KQotCQkJc2hlbGwuc2V0VGV4dChNZXNzYWdlcy5lZGl0RXh0ZXJuYWxCcm93c2VyKTsKLQkJZWxzZQotCQkJc2hlbGwuc2V0VGV4dChNZXNzYWdlcy5jcmVhdGVCcm93c2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBjb21wLCBTdHJpbmcgdHh0LCBmaW5hbCBTdHJpbmdNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wLCBTV1QuQk9SREVSKTsKLQkJaWYgKHR4dCAhPSBudWxsKQotCQkJdGV4dC5zZXRUZXh0KHR4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyNTA7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsJCi0JCQkJCWxpc3RlbmVyLnZhbHVlQ2hhbmdlZCh0ZXh0LmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkoKEdyaWRMYXlvdXQpY29tcG9zaXRlLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMzsKLQkJCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlBSRUZfQlJPV1NFUl9ESUFMT0cpOwotCQkKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLm5hbWUpOwotCQlicm93c2VyTmFtZVRleHRmaWVsZCA9IGNyZWF0ZVRleHQoY29tcG9zaXRlLCBicm93c2VyLmdldE5hbWUoKSwgbmV3IFN0cmluZ01vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyBzKSB7Ci0JCQkJYnJvd3Nlci5zZXROYW1lKHMpOwotCQkJCXZhbGlkYXRlRmllbGRzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQotCQlTV1RVdGlsLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMubG9jYXRpb24pOwotCQlicm93c2VyTG9jYXRpb25UZXh0ZmllbGQgPSBjcmVhdGVUZXh0KGNvbXBvc2l0ZSwgYnJvd3Nlci5nZXRMb2NhdGlvbigpLCBuZXcgU3RyaW5nTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoU3RyaW5nIHMpIHsKLQkJCQlicm93c2VyLnNldExvY2F0aW9uKHMpOwotCQkJCXZhbGlkYXRlRmllbGRzKCk7Ci0JCQl9Ci0JCX0pOwkJCi0JCQotCQlicm93c2VCdXR0b24gPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE1lc3NhZ2VzLmJyb3dzZSk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCksIFNXVC5PUEVOKTsKLQkJCQlkaWFsb2cuc2V0VGV4dChNZXNzYWdlcy5icm93c2VNZXNzYWdlKTsKLQkJCQkKLQkJCQlTdHJpbmcgZm5hbWUgPSBicm93c2VyTG9jYXRpb25UZXh0ZmllbGQuZ2V0VGV4dCgpOwotCQkJCQotCQkJCWRpYWxvZy5zZXRGaWxlTmFtZShmbmFtZSk7Ci0JCQkJZm5hbWUgPSBkaWFsb2cub3BlbigpOwotCQkJCQotCQkJCWlmIChmbmFtZSAhPSBudWxsKQotCQkJCQlicm93c2VyTG9jYXRpb25UZXh0ZmllbGQuc2V0VGV4dChmbmFtZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLnBhcmFtZXRlcnMpOwotCQlicm93c2VyUGFyYW1ldGVyc1RleHRmaWVsZCA9IGNyZWF0ZVRleHQoY29tcG9zaXRlLCBicm93c2VyLmdldFBhcmFtZXRlcnMoKSwgbmV3IFN0cmluZ01vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyBzKSB7Ci0JCQkJYnJvd3Nlci5zZXRQYXJhbWV0ZXJzKHMpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUxhYmVsIHVybExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cmxMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcnNNZXNzYWdlLCBJQnJvd3NlckRlc2NyaXB0b3IuVVJMX1BBUkFNRVRFUikpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJLy8gZG8gc2ltcGxlIGZpZWxkIHZhbGlkYXRpb24gdG8gYXQgbGVhc3QgZW5zdXJlIHRhcmdldCBkaXJlY3RvcnkgZW50ZXJlZCBpcyB2YWxpZCBwYXRobmFtZQotCQl0cnkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShicm93c2VyLmdldExvY2F0aW9uKCkpOwotCQkJaWYoIWZpbGUuaXNGaWxlKCkpewotCQkJCVdlYkJyb3dzZXJVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5sb2NhdGlvbkludmFsaWQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSl7Ci0JCQlXZWJCcm93c2VyVXRpbC5vcGVuRXJyb3IoTWVzc2FnZXMubG9jYXRpb25JbnZhbGlkKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYnJvd3Nlci5zYXZlKCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0T0tCdXR0b25FbmFibGVkKGJvb2xlYW4gY3VySXNFbmFibGVkKSB7Ci0JCWlmIChva0J1dHRvbiA9PSBudWxsKQotCQkJb2tCdXR0b24gPSBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0JCQotCQlpZiAob2tCdXR0b24gIT0gbnVsbCkKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoY3VySXNFbmFibGVkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBidXR0b25Db250cm9sID0gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7Ci0JCXZhbGlkYXRlRmllbGRzKCk7Ci0JCXJldHVybiBidXR0b25Db250cm9sOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUZpZWxkcygpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0JCQotCQlTdHJpbmcgbmFtZSA9IGJyb3dzZXJOYW1lVGV4dGZpZWxkLmdldFRleHQoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA8IDEpCi0JCQl2YWxpZCA9IGZhbHNlOwotCQkKLQkJU3RyaW5nIGxvY2F0aW9uID0gYnJvd3NlckxvY2F0aW9uVGV4dGZpZWxkLmdldFRleHQoKTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24udHJpbSgpLmxlbmd0aCgpIDwgMSkKLQkJCXZhbGlkID0gZmFsc2U7Ci0JCQotCQlzZXRPS0J1dHRvbkVuYWJsZWQodmFsaWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvQnJvd3NlckRlc2NyaXB0b3JXb3JraW5nQ29weS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0Jyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiOGI5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvQnJvd3NlckRlc2NyaXB0b3JXb3JraW5nQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2VyRGVzY3JpcHRvcldvcmtpbmdDb3B5IGV4dGVuZHMgQnJvd3NlckRlc2NyaXB0b3IgaW1wbGVtZW50cyBJQnJvd3NlckRlc2NyaXB0b3JXb3JraW5nQ29weSB7Ci0JcHJvdGVjdGVkIEJyb3dzZXJEZXNjcmlwdG9yIGJyb3dzZXI7Ci0KLQkvLyBjcmVhdGlvbgotCXB1YmxpYyBCcm93c2VyRGVzY3JpcHRvcldvcmtpbmdDb3B5KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLy8gd29ya2luZyBjb3B5Ci0JcHVibGljIEJyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkoQnJvd3NlckRlc2NyaXB0b3IgYnJvd3NlcikgewotCQl0aGlzLmJyb3dzZXIgPSBicm93c2VyOwotCQlzZXRJbnRlcm5hbChicm93c2VyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLklCcm93c2VyRGVzY3JpcHRvcldvcmtpbmdDb3B5I3NldE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5JQnJvd3NlckRlc2NyaXB0b3JXb3JraW5nQ29weSNzZXRMb2NhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5JQnJvd3NlckRlc2NyaXB0b3JXb3JraW5nQ29weSNzZXRQYXJhbWV0ZXJzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhTdHJpbmcgcGFyYW1zKSB7Ci0JCXRoaXMucGFyYW1ldGVycyA9IHBhcmFtczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIElCcm93c2VyRGVzY3JpcHRvcldvcmtpbmdDb3B5IGdldFdvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLklCcm93c2VyRGVzY3JpcHRvcldvcmtpbmdDb3B5I3NhdmUoKQotCSAqLwotCXB1YmxpYyBJQnJvd3NlckRlc2NyaXB0b3Igc2F2ZSgpIHsKLQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJYnJvd3Nlci5zZXRJbnRlcm5hbCh0aGlzKTsKLQkJCUJyb3dzZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2F2ZUJyb3dzZXJzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXJEZXNjcmlwdG9yKCk7Ci0JCQlicm93c2VyLnNldEludGVybmFsKHRoaXMpOwotCQkJQnJvd3Nlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRCcm93c2VyKGJyb3dzZXIpOwotCQl9Ci0JCXJldHVybiBicm93c2VyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvQnJvd3NlckV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0Jyb3dzZXJFeHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlYWU5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvQnJvd3NlckV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIKAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLkJyb3dzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJyb3dzZXJFeHQgaW1wbGVtZW50cyBJQnJvd3NlckV4dCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRkFDVE9SWV9DTEFTUyA9ICJmYWN0b3J5Y2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JcHJpdmF0ZSBCcm93c2VyRmFjdG9yeSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIEJyb3dzZXJFeHQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQnJvd3NlckV4dChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgYnJvd3Nlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBsYWJlbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxhYmVsID09IG51bGwpCi0JCQlyZXR1cm4gIm4vYSI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJwYXJhbWV0ZXJzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEV4ZWN1dGFibGUoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZXhlY3V0YWJsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPUygpIHsKLQkJU3RyaW5nIG9zID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm9zIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9zID09IG51bGwpCi0JCQlvcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBvczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RGVmYXVsdExvY2F0aW9ucygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oImxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlsaXN0LmFkZChjaGlsZHJlbltpXS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnJvd3NlckZhY3RvcnkgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQlpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9GQUNUT1JZX0NMQVNTKSA9PSBudWxsCi0JCQkJCXx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfRkFDVE9SWV9DTEFTUykubGVuZ3RoKCkgPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChCcm93c2VyRmFjdG9yeSkgZWxlbWVudAotCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUl9GQUNUT1JZX0NMQVNTKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UKLQkJCQkJCS50cmFjZSgKLQkJCQkJCQkJVHJhY2UuU0VWRVJFLAotCQkJCQkJCQkiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBmYWN0b3J5IGNhbiB3b3JrIG9uIHRoZSB1c2VyIHN5c3RlbS4KLQkgKiAKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSBmYWN0b3J5IGNhbm5vdCB3b3JrIG9uIHRoaXMgc3lzdGVtOyBmb3IgZXhhbXBsZSB0aGUKLQkgKiAgICAgICAgIHJlcXVpcmVkIG5hdGl2ZSBicm93c2VyIHJlcXVpcmVkIGJ5IGJyb3dzZXIgYWRhcHRlcnMgdGhhdCBpdAotCSAqICAgICAgICAgY3JlYXRlcyBpcyBub3QgaW5zdGFsbGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsICYmIChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0ZBQ1RPUllfQ0xBU1MpID09IG51bGwKLQkJCQl8fCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0ZBQ1RPUllfQ0xBU1MpLmxlbmd0aCgpID09IDApKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuaXNBdmFpbGFibGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlCi0JCQkJCS50cmFjZSgKLQkJCQkJCQlUcmFjZS5TRVZFUkUsCi0JCQkJCQkJIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9idGFpbnMgYSBuZXcgaW5zdGFuY2Ugb2YgYSB3ZWIgYnJvd3Nlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIElCcm93c2VyCi0JICovCi0JcHVibGljIElXZWJCcm93c2VyIGNyZWF0ZUJyb3dzZXIoU3RyaW5nIGlkLCBTdHJpbmcgbG9jYXRpb24sCi0JCQlTdHJpbmcgcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuY3JlYXRlQnJvd3NlcihpZCwgbG9jYXRpb24sIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UKLQkJCQkJLnRyYWNlKAotCQkJCQkJCVRyYWNlLlNFVkVSRSwKLQkJCQkJCQkiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHMgPSAiQnJvd3NlckV4dDogIiArIGdldElkKCkgKyAiLCAiICsgZ2V0TmFtZSgpICsgIiwgIiArIGdldE9TKCkgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkrICIsICIgKyBnZXRFeGVjdXRhYmxlKCkgKyAiLCAiICsgZ2V0UGFyYW1ldGVycygpICsgIiwgIjsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJU3RyaW5nW10gbG9jYXRpb25zID0gZ2V0RGVmYXVsdExvY2F0aW9ucygpOwotCQlpZiAobG9jYXRpb25zICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbG9jYXRpb25zLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJcyArPSBsb2NhdGlvbnNbaV0gKyAiOyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0Jyb3dzZXJMYXVuY2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0Jyb3dzZXJMYXVuY2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGYyZDkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9Ccm93c2VyTGF1bmNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckxhdW5jaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyTGF1bmNoZXIgaW1wbGVtZW50cyBJRWRpdG9yTGF1bmNoZXIgewotCi0JcHVibGljIEJyb3dzZXJMYXVuY2hlcigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oSVBhdGggZmlsZSkgewotCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgc3VwcG9ydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKTsKLQkJdHJ5IHsKLQkJCWlmIChXZWJCcm93c2VyUHJlZmVyZW5jZS5nZXRCcm93c2VyQ2hvaWNlKCk9PSBXZWJCcm93c2VyUHJlZmVyZW5jZS5JTlRFUk5BTCkKLQkJCQlzdXBwb3J0LmNyZWF0ZUJyb3dzZXIoSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LkxPQ0FUSU9OX0JBUiB8IElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5OQVZJR0FUSU9OX0JBUiwKLQkJCQkJCWZpbGUudG9Qb3J0YWJsZVN0cmluZygpLCBudWxsLCBudWxsKS5vcGVuVVJMKGZpbGUudG9GaWxlKCkudG9VUkwoKSk7Ci0JCQllbHNlCi0JCQkJc3VwcG9ydC5jcmVhdGVCcm93c2VyKElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5MT0NBVElPTl9CQVIgfCBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTkFWSUdBVElPTl9CQVIsCi0JCQkJCQlEZWZhdWx0QnJvd3NlclN1cHBvcnQuU0hBUkVEX0lELCBudWxsLCBudWxsKS5vcGVuVVJMKGZpbGUudG9GaWxlKCkudG9VUkwoKSk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9Ccm93c2VyTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0Jyb3dzZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNDMzNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0Jyb3dzZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5PYnNlcnZhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlhNTE1lbWVudG87Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQnJvd3Nlck1hbmFnZXIgZXh0ZW5kcyBPYnNlcnZhYmxlIHsKLQlwcm90ZWN0ZWQgTGlzdCBicm93c2VyczsKLQlwcm90ZWN0ZWQgSUJyb3dzZXJEZXNjcmlwdG9yIGN1cnJlbnRCcm93c2VyOwotCQotCXByaXZhdGUgUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcGNsOwotCXByb3RlY3RlZCBib29sZWFuIGlnbm9yZVByZWZlcmVuY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEJyb3dzZXJNYW5hZ2VyIGluc3RhbmNlOwotCQotCXB1YmxpYyBzdGF0aWMgQnJvd3Nlck1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgQnJvd3Nlck1hbmFnZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgQnJvd3Nlck1hbmFnZXIoKSB7Ci0JCXBjbCA9IG5ldyBQcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgcHJvcGVydHkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJCWlmICghaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgJiYgcHJvcGVydHkuZXF1YWxzKCJicm93c2VycyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9hZEJyb3dzZXJzKCk7Ci0JCQkJfQotCQkJCXNldENoYW5nZWQoKTsKLQkJCQlub3RpZnlPYnNlcnZlcnMoKTsKLQkJCX0KLQkJfTsKLQkJCi0JCVdlYkJyb3dzZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwY2wpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzYWZlRGlzcG9zZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFdlYkJyb3dzZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmcyAhPSBudWxsKQotCQkJcHJlZnMucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwY2wpOwotCX0KLQotCXB1YmxpYyBJQnJvd3NlckRlc2NyaXB0b3JXb3JraW5nQ29weSBjcmVhdGVFeHRlcm5hbFdlYkJyb3dzZXIoKSB7Ci0JCXJldHVybiBuZXcgQnJvd3NlckRlc2NyaXB0b3JXb3JraW5nQ29weSgpOwotCX0JCi0KLQlwdWJsaWMgTGlzdCBnZXRXZWJCcm93c2VycygpIHsKLQkJaWYgKGJyb3dzZXJzID09IG51bGwpCi0JCQlsb2FkQnJvd3NlcnMoKTsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoYnJvd3NlcnMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRCcm93c2VycygpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyB3ZWIgYnJvd3NlcnMiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBXZWJCcm93c2VyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgeG1sU3RyaW5nID0gcHJlZnMuZ2V0U3RyaW5nKCJicm93c2VycyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh4bWxTdHJpbmcgIT0gbnVsbCAmJiB4bWxTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlicm93c2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0JCQkJUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbik7Ci0JCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlUmVhZFJvb3QocmVhZGVyKTsKLQkJCQkKLQkJCQlJTWVtZW50byBzeXN0ZW0gPSBtZW1lbnRvLmdldENoaWxkKCJzeXN0ZW0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChzeXN0ZW0gIT0gbnVsbCAmJiBXZWJCcm93c2VyVXRpbC5jYW5Vc2VTeXN0ZW1Ccm93c2VyKCkpCi0JCQkJCWJyb3dzZXJzLmFkZChuZXcgU3lzdGVtQnJvd3NlckRlc2NyaXB0b3IoKSk7Ci0JCQkJCi0JCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oImV4dGVybmFsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlCcm93c2VyRGVzY3JpcHRvciBicm93c2VyID0gbmV3IEJyb3dzZXJEZXNjcmlwdG9yKCk7Ci0JCQkJCWJyb3dzZXIubG9hZChjaGlsZHJlbltpXSk7Ci0JCQkJCWJyb3dzZXJzLmFkZChicm93c2VyKTsKLQkJCQl9Ci0JCQkJCi0JCQkJSW50ZWdlciBjdXJyZW50ID0gbWVtZW50by5nZXRJbnRlZ2VyKCJjdXJyZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQkJCWN1cnJlbnRCcm93c2VyID0gKElCcm93c2VyRGVzY3JpcHRvcikgYnJvd3NlcnMuZ2V0KGN1cnJlbnQuaW50VmFsdWUoKSk7IAotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIGJyb3dzZXJzOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCUlCcm93c2VyRGVzY3JpcHRvciBzeXN0ZW0gPSBuZXcgU3lzdGVtQnJvd3NlckRlc2NyaXB0b3IoKTsKLQkJCWlmIChXZWJCcm93c2VyVXRpbC5jYW5Vc2VTeXN0ZW1Ccm93c2VyKCkgJiYgIWJyb3dzZXJzLmNvbnRhaW5zKHN5c3RlbSkpIHsKLQkJCQlicm93c2Vycy5hZGQoMCwgc3lzdGVtKTsKLQkJCQljdXJyZW50QnJvd3NlciA9IHN5c3RlbTsKLQkJCQlzYXZlQnJvd3NlcnMoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNldHVwRGVmYXVsdEJyb3dzZXJzKCk7Ci0JCQlzYXZlQnJvd3NlcnMoKTsKLQkJfQotCQkKLQkJaWYgKGN1cnJlbnRCcm93c2VyID09IG51bGwgJiYgYnJvd3NlcnMuc2l6ZSgpID4gMCkKLQkJCWN1cnJlbnRCcm93c2VyID0gKElCcm93c2VyRGVzY3JpcHRvcikgYnJvd3NlcnMuZ2V0KDApOwotCQlzZXRDaGFuZ2VkKCk7Ci0JCW5vdGlmeU9ic2VydmVycygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVCcm93c2VycygpIHsKLQkJdHJ5IHsKLQkJCWlnbm9yZVByZWZlcmVuY2VDaGFuZ2VzID0gdHJ1ZTsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJ3ZWItYnJvd3NlcnMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGJyb3dzZXJzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQnJvd3NlckRlc2NyaXB0b3IpIHsKLQkJCQkJQnJvd3NlckRlc2NyaXB0b3IgYnJvd3NlciA9IChCcm93c2VyRGVzY3JpcHRvcikgb2JqOwotCQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoImV4dGVybmFsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJvd3Nlci5zYXZlKGNoaWxkKTsKLQkJCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFN5c3RlbUJyb3dzZXJEZXNjcmlwdG9yKSB7Ci0JCQkJCW1lbWVudG8uY3JlYXRlQ2hpbGQoInN5c3RlbSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJCi0JCQltZW1lbnRvLnB1dEludGVnZXIoImN1cnJlbnQiLCBicm93c2Vycy5pbmRleE9mKGN1cnJlbnRCcm93c2VyKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCW1lbWVudG8uc2F2ZSh3cml0ZXIpOwotCQkJU3RyaW5nIHhtbFN0cmluZyA9IHdyaXRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBXZWJCcm93c2VyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJcHJlZnMuc2V0VmFsdWUoImJyb3dzZXJzIiwgeG1sU3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJV2ViQnJvd3NlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBicm93c2VycyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERlZmF1bHRCcm93c2VycygpIHsKLQkJYnJvd3NlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gYWRkIHN5c3RlbSBicm93c2VyCi0JCWlmIChXZWJCcm93c2VyVXRpbC5jYW5Vc2VTeXN0ZW1Ccm93c2VyKCkpIHsKLQkJCUlCcm93c2VyRGVzY3JpcHRvciBzeXN0ZW0gPSBuZXcgU3lzdGVtQnJvd3NlckRlc2NyaXB0b3IoKTsKLQkJCWJyb3dzZXJzLmFkZChzeXN0ZW0pOwotCQl9Ci0JCQotCQkvLyBoYW5kbGUgYWxsIHRoZSBFWFRFUk5BTCBicm93c2VycyBieSBjcml0ZXJpYSBhbmQgYWRkIHRob3NlIHRvbyBhdCBzdGFydHVwCi0JCVdlYkJyb3dzZXJVdGlsLmFkZEZvdW5kQnJvd3NlcnMoYnJvd3NlcnMpOwotCQkKLQkJLy8gYnkgZGVmYXVsdCwgaWYgaW50ZXJuYWwgaXMgdGhlcmUsIHRoYXQgaXMgY3VycmVudCwgZWxzZSBzZXQgdGhlIGZpcnN0IGV4dGVybmFsIG9uZQotCQlpZiAoIWJyb3dzZXJzLmlzRW1wdHkoKSAmJiBjdXJyZW50QnJvd3NlciA9PSBudWxsKQotCQkJY3VycmVudEJyb3dzZXIgPSAoSUJyb3dzZXJEZXNjcmlwdG9yKSBicm93c2Vycy5nZXQoMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQnJvd3NlcihJQnJvd3NlckRlc2NyaXB0b3IgYnJvd3NlcikgewotCQlpZiAoYnJvd3NlcnMgPT0gbnVsbCkKLQkJCWxvYWRCcm93c2VycygpOwotCQlpZiAoIWJyb3dzZXJzLmNvbnRhaW5zKGJyb3dzZXIpKQotCQkJYnJvd3NlcnMuYWRkKGJyb3dzZXIpOwotCQlpZiAoYnJvd3NlcnMuc2l6ZSgpID09IDEpCi0JCQlzZXRDdXJyZW50V2ViQnJvd3Nlcihicm93c2VyKTsKLQkJCi0JCXNhdmVCcm93c2VycygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVdlYkJyb3dzZXIoSUJyb3dzZXJEZXNjcmlwdG9yIGJyb3dzZXIpIHsKLQkJaWYgKGJyb3dzZXJzID09IG51bGwpCi0JCQlsb2FkQnJvd3NlcnMoKTsKLQkJYnJvd3NlcnMucmVtb3ZlKGJyb3dzZXIpOwotCQkKLQkJaWYgKGN1cnJlbnRCcm93c2VyID09IG51bGwgfHwgY3VycmVudEJyb3dzZXIuZXF1YWxzKGJyb3dzZXIpKSB7Ci0JCQljdXJyZW50QnJvd3NlciA9IG51bGw7Ci0JCQlpZiAoYnJvd3NlcnMuc2l6ZSgpID4gMCkKLQkJCQljdXJyZW50QnJvd3NlciA9IChJQnJvd3NlckRlc2NyaXB0b3IpIGJyb3dzZXJzLmdldCgwKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJQnJvd3NlckRlc2NyaXB0b3IgZ2V0Q3VycmVudFdlYkJyb3dzZXIoKSB7Ci0JCWlmIChicm93c2VycyA9PSBudWxsKQotCQkJbG9hZEJyb3dzZXJzKCk7Ci0KLQkJaWYgKGN1cnJlbnRCcm93c2VyID09IG51bGwgJiYgYnJvd3NlcnMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoSUJyb3dzZXJEZXNjcmlwdG9yKSBicm93c2Vycy5nZXQoMCk7Ci0JCQotCQlyZXR1cm4gY3VycmVudEJyb3dzZXI7IAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRXZWJCcm93c2VyKElCcm93c2VyRGVzY3JpcHRvciB3YikgewotCQlpZiAod2IgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotCQlpZiAoYnJvd3NlcnMuY29udGFpbnMod2IpKQotCQkJY3VycmVudEJyb3dzZXIgPSB3YjsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlzYXZlQnJvd3NlcnMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0Jyb3dzZXJUZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvQnJvd3NlclRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNzAxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvQnJvd3NlclRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIEJyb3dzZXJUZXh0IHsKLSAgICBwcml2YXRlIFN0cmluZyB1cmw7Ci0KLSAgICBwcml2YXRlIEZhbGxiYWNrU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXA7Ci0KLSAgICBwcml2YXRlIExhYmVsIHRpdGxlOwotCi0gICAgcHJpdmF0ZSBMYWJlbCBleFRpdGxlOwotCi0gICAgcHJpdmF0ZSBMYWJlbCB0ZXh0OwotCi0gICAgcHJpdmF0ZSBMYWJlbCBzZXA7Ci0KLSAgICBwcm90ZWN0ZWQgTGluayBsaW5rOwotCi0gICAgcHJpdmF0ZSBCcm93c2VyVmlld2VyIHZpZXdlcjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGJ1dHRvbjsKLQotICAgIHByaXZhdGUgVGV4dCBleGNlcHRpb247Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZXhwYW5kZWQ7Ci0KLSAgICBwcml2YXRlIFRocm93YWJsZSBleDsKLQotICAgIGNsYXNzIFJlZmxvd1Njcm9sbGVkQ29tcG9zaXRlIGV4dGVuZHMgRmFsbGJhY2tTY3JvbGxlZENvbXBvc2l0ZSB7Ci0gICAgICAgIHB1YmxpYyBSZWZsb3dTY3JvbGxlZENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVmbG93KGJvb2xlYW4gZmx1c2hDYWNoZSkgewotICAgICAgICAgICAgdXBkYXRlV2lkdGgodGhpcyk7Ci0gICAgICAgICAgICBzdXBlci5yZWZsb3coZmx1c2hDYWNoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQnJvd3NlclRleHQoQ29tcG9zaXRlIHBhcmVudCwgQnJvd3NlclZpZXdlciB2aWV3ZXIsIFRocm93YWJsZSBleCkgewotICAgICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICAgICAgdGhpcy5leCA9IGV4OwotICAgICAgICBDb2xvciBiZyA9IHBhcmVudC5nZXREaXNwbGF5KCkKLSAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0gICAgICAgIHNjb21wID0gbmV3IFJlZmxvd1Njcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLSAgICAgICAgQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUoc2NvbXAsIFNXVC5OVUxMKTsKLSAgICAgICAgZmlsbENvbnRlbnQoY2xpZW50LCBiZyk7Ci0gICAgICAgIHNjb21wLnNldENvbnRlbnQoY2xpZW50KTsgICAgICAgIAotICAgICAgICBzY29tcC5zZXRCYWNrZ3JvdW5kKGJnKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlsbENvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCwgQ29sb3IgYmcpIHsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0gICAgICAgIHBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgdGl0bGUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0gICAgICAgIHRpdGxlLnNldFRleHQoTWVzc2FnZXMuQnJvd3NlclRleHRfdGl0bGUpOwotICAgICAgICB0aXRsZS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEhlYWRlckZvbnQoKSk7Ci0gICAgICAgIHRpdGxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICB0aXRsZS5zZXRCYWNrZ3JvdW5kKGJnKTsKLQotICAgICAgICBsaW5rID0gbmV3IExpbmsocGFyZW50LCBTV1QuV1JBUCk7Ci0gICAgICAgIGxpbmsuc2V0VGV4dChNZXNzYWdlcy5Ccm93c2VyVGV4dF9saW5rKTsKLSAgICAgICAgbGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbGluay5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5Ccm93c2VyVGV4dF90b29sdGlwKTsKLSAgICAgICAgbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShsaW5rLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb09wZW5FeHRlcm5hbCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBsaW5rLnNldEJhY2tncm91bmQoYmcpOwotICAgICAgICBzZXAgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgICAgICBzZXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGV4VGl0bGUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIGV4VGl0bGUuc2V0QmFja2dyb3VuZChiZyk7Ci0gICAgICAgIGV4VGl0bGUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRCYW5uZXJGb250KCkpOwotICAgICAgICBleFRpdGxlLnNldFRleHQoTWVzc2FnZXMuQnJvd3NlclRleHRfZHRpdGxlKTsKLSAgICAgICAgZXhUaXRsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgdGV4dCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLSAgICAgICAgdGV4dC5zZXRUZXh0KE1lc3NhZ2VzLkJyb3dzZXJUZXh0X3RleHQpOwotICAgICAgICB0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICB0ZXh0LnNldEJhY2tncm91bmQoYmcpOwotICAgICAgICBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICB1cGRhdGVCdXR0b25UZXh0KCk7Ci0gICAgICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB0b2dnbGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJKTsKLSAgICAgICAgbG9hZEV4Y2VwdGlvblRleHQoKTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZ2QuZXhjbHVkZSA9IHRydWU7Ci0gICAgICAgIGV4Y2VwdGlvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZEV4Y2VwdGlvblRleHQoKSB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBzd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3dyaXRlcik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOwotICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgZXhjZXB0aW9uLnNldFRleHQoc3dyaXRlci50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0b2dnbGVFeGNlcHRpb24oKSB7Ci0gICAgICAgIGV4cGFuZGVkID0gIWV4cGFuZGVkOwotICAgICAgICB1cGRhdGVCdXR0b25UZXh0KCk7Ci0gICAgICAgIEdyaWREYXRhIGdkID0gKEdyaWREYXRhKSBleGNlcHRpb24uZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICBnZC5leGNsdWRlID0gIWV4cGFuZGVkOwotICAgICAgICBleGNlcHRpb24uc2V0VmlzaWJsZShleHBhbmRlZCk7Ci0gICAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQnV0dG9uVGV4dCgpIHsKLSAgICAgICAgaWYgKGV4cGFuZGVkKQotICAgICAgICAgICAgYnV0dG9uLnNldFRleHQoTWVzc2FnZXMuQnJvd3NlclRleHRfYnV0dG9uX2NvbGxhcHNlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYnV0dG9uLnNldFRleHQoTWVzc2FnZXMuQnJvd3NlclRleHRfYnV0dG9uX2V4cGFuZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkdGgoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgIHVwZGF0ZVdpZHRoKHRpdGxlLCBhcmVhLndpZHRoKTsKLSAgICAgICAgdXBkYXRlV2lkdGgodGV4dCwgYXJlYS53aWR0aCk7Ci0gICAgICAgIHVwZGF0ZVdpZHRoKHNlcCwgYXJlYS53aWR0aCk7Ci0gICAgICAgIHVwZGF0ZVdpZHRoKGxpbmssIGFyZWEud2lkdGgpOwotICAgICAgICB1cGRhdGVXaWR0aChleFRpdGxlLCBhcmVhLndpZHRoKTsKLSAgICAgICAgdXBkYXRlV2lkdGgoZXhjZXB0aW9uLCBhcmVhLndpZHRoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlV2lkdGgoQ29udHJvbCBjLCBpbnQgd2lkdGgpIHsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSAoR3JpZERhdGEpIGMuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICBpZiAoZ2QgIT0gbnVsbCkKLSAgICAgICAgICAgIGdkLndpZHRoSGludCA9IHdpZHRoIC0gMTA7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9PcGVuRXh0ZXJuYWwoKSB7Ci0gICAgICAgIElCcm93c2VyVmlld2VyQ29udGFpbmVyIGNvbnRhaW5lciA9IHZpZXdlci5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQotICAgICAgICAgICAgY29udGFpbmVyLm9wZW5JbkV4dGVybmFsQnJvd3Nlcih1cmwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0gICAgICAgIHJldHVybiBzY29tcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRVcmwoU3RyaW5nIHVybCkgewotICAgICAgICB0aGlzLnVybCA9IHVybDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIGxpbmsuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICBzY29tcC5yZWZsb3codHJ1ZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9Ccm93c2VyVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvQnJvd3NlclZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njk1NmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9Ccm93c2VyVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0goCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQ2xvc2VXaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuT3BlbldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlRpdGxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuVGl0bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5WaXNpYmlsaXR5V2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuV2luZG93RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgV2ViIGJyb3dzZXIgd2lkZ2V0LiBJdCBleHRlbmRzIHRoZSBFY2xpcHNlIFNXVCBCcm93c2VyIHdpZGdldCBieSBhZGRpbmcgYW4KLSAqIG9wdGlvbmFsIHRvb2xiYXIgY29tcGxldGUgd2l0aCBhIFVSTCBjb21ibyBib3gsIGhpc3RvcnksIGJhY2sgJiBmb3J3YXJkLCBhbmQKLSAqIHJlZnJlc2ggYnV0dG9ucy4KLSAqIDxwPgotICogVXNlIHRoZSBzdHlsZSBiaXRzIHRvIGNob29zZSB3aGljaCB0b29sYmFycyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGUgYnJvd3NlcgotICogY29tcG9zaXRlLiBZb3UgY2FuIGFjY2VzcyB0aGUgZW1iZWRkZWQgU1dUIEJyb3dzZXIgZGlyZWN0bHkgdXNpbmcgdGhlCi0gKiBnZXRCcm93c2VyKCkgbWV0aG9kLgotICogPC9wPgotICogPHA+Ci0gKiBBZGRpdGlvbmFsIGNhcGFiaWxpdGllcyBhcmUgYXZhaWxhYmxlIHdoZW4gdXNlZCBhcyB0aGUgaW50ZXJuYWwgV2ViIGJyb3dzZXIsCi0gKiBpbmNsdWRpbmcgc3RhdHVzIHRleHQgYW5kIHByb2dyZXNzIG9uIHRoZSBFY2xpcHNlIHdpbmRvdydzIHN0YXR1cyBsaW5lLCBvcgotICogbW92aW5nIHRoZSB0b29sYmFyIGNhcGFiaWxpdGllcyB1cCBpbnRvIHRoZSBtYWluIHRvb2xiYXIuCi0gKiA8L3A+Ci0gKiA8ZGw+Ci0gKiA8ZHQ+PGI+U3R5bGVzOjwvYj48L2R0PgotICogPGRkPkxPQ0FUSU9OX0JBUiwgQlVUVE9OX0JBUjwvZGQ+Ci0gKiA8ZHQ+PGI+RXZlbnRzOjwvYj48L2R0PgotICogPGRkPk5vbmU8L2RkPgotICogPC9kbD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlclZpZXdlciBleHRlbmRzIENvbXBvc2l0ZSB7Ci0gICAgLyoqCi0gICAgICogU3R5bGUgcGFyYW1ldGVyICh2YWx1ZSAxKSBpbmRpY2F0aW5nIHRoYXQgdGhlIFVSTCBhbmQgR28gYnV0dG9uIHdpbGwgYmUKLSAgICAgKiBvbiB0aGUgbG9jYWwgdG9vbGJhci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBVElPTl9CQVIgPSAxIDw8IDE7Ci0KLSAgICAvKioKLSAgICAgKiBTdHlsZSBwYXJhbWV0ZXIgKHZhbHVlIDIpIGluZGljYXRpbmcgdGhhdCB0aGUgdG9vbGJhciB3aWxsIGJlIGF2YWlsYWJsZQotICAgICAqIG9uIHRoZSB3ZWIgYnJvd3Nlci4gVGhpcyBzdHlsZSBwYXJhbWV0ZXIgY2Fubm90IGJlIHVzZWQgd2l0aG91dCB0aGUKLSAgICAgKiBMT0NBVElPTl9CQVIgc3R5bGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX0JBUiA9IDEgPDwgMjsKLQkgCi0JIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1RJVExFID0gInRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ISVNUT1JZID0gNTA7Ci0KLSAgICBwdWJsaWMgQ2xpcGJvYXJkIGNsaXBib2FyZDsKLQotICAgIHB1YmxpYyBDb21ibyBjb21ibzsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIHNob3dUb29sYmFyOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1VSTGJhcjsKLQotICAgIHByb3RlY3RlZCBUb29sSXRlbSBiYWNrOwotCi0gICAgcHJvdGVjdGVkIFRvb2xJdGVtIGZvcndhcmQ7Ci0KLSAgICBwcm90ZWN0ZWQgQnVzeUluZGljYXRvciBidXN5OwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbG9hZGluZzsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgamF2YS51dGlsLkxpc3QgaGlzdG9yeTsKLQotICAgIHByb3RlY3RlZCBCcm93c2VyIGJyb3dzZXI7Ci0gICAgCi0gICAgcHJvdGVjdGVkIEJyb3dzZXJUZXh0IHRleHQ7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBuZXdXaW5kb3c7Ci0KLSAgICBwcm90ZWN0ZWQgSUJyb3dzZXJWaWV3ZXJDb250YWluZXIgY29udGFpbmVyOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotICAgIHByb3RlY3RlZCBpbnQgcHJvZ3Jlc3NXb3JrZWQgPSAwOwotCSAKLQkgcHJvdGVjdGVkIExpc3QgcHJvcGVydHlMaXN0ZW5lcnM7Ci0KLSAgICAvKioKLSAgICAgKiBVbmRlciBkZXZlbG9wbWVudCAtIGRvIG5vdCB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJTG9jYXRpb25MaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGxvY2F0aW9uQ2hhbmdlZChTdHJpbmcgdXJsKTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBoaXN0b3J5Q2hhbmdlZChTdHJpbmdbXSBoaXN0b3J5Mik7Ci0gICAgfQotCi0gICAgcHVibGljIElMb2NhdGlvbkxpc3RlbmVyIGxvY2F0aW9uTGlzdGVuZXI7Ci0KLSAgICAvKioKLSAgICAgKiBVbmRlciBkZXZlbG9wbWVudCAtIGRvIG5vdCB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJQmFja05leHRMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJhY2tOZXh0QnVzeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJQmFja05leHRMaXN0ZW5lciBiYWNrTmV4dExpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBXZWIgYnJvd3NlciBnaXZlbiBpdHMgcGFyZW50IGFuZCBhIHN0eWxlIHZhbHVlIGRlc2NyaWJpbmcKLSAgICAgKiBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHN0eWxlIHZhbHVlIGlzIGVpdGhlciBvbmUgb2YgdGhlIHN0eWxlIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoZSBjbGFzcwotICAgICAqIGhlYWRlciBvciBjbGFzcyA8Y29kZT5TV1Q8L2NvZGU+IHdoaWNoIGlzIGFwcGxpY2FibGUgdG8gaW5zdGFuY2VzIG9mCi0gICAgICogdGhpcyBjbGFzcywgb3IgbXVzdCBiZSBidWlsdCBieSA8ZW0+Yml0d2lzZSBPUjwvZW0+J2luZyB0b2dldGhlciAodGhhdAotICAgICAqIGlzLCB1c2luZyB0aGUgPGNvZGU+aW50PC9jb2RlPiAifCIgb3BlcmF0b3IpIHR3byBvciBtb3JlIG9mIHRob3NlCi0gICAgICogPGNvZGU+U1dUPC9jb2RlPiBzdHlsZSBjb25zdGFudHMuIFRoZSBjbGFzcyBkZXNjcmlwdGlvbiBsaXN0cyB0aGUgc3R5bGUKLSAgICAgKiBjb25zdGFudHMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgY2xhc3MuIFN0eWxlIGJpdHMgYXJlIGFsc28gaW5oZXJpdGVkCi0gICAgICogZnJvbSBzdXBlcmNsYXNzZXMuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIGEgY29tcG9zaXRlIGNvbnRyb2wgd2hpY2ggd2lsbCBiZSB0aGUgcGFyZW50IG9mIHRoZSBuZXcKLSAgICAgKiAgICAgICAgICAgIGluc3RhbmNlIChjYW5ub3QgYmUgbnVsbCkKLSAgICAgKiBAcGFyYW0gc3R5bGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHlsZSBvZiBjb250cm9sIHRvIGNvbnN0cnVjdAotICAgICAqLwotICAgIHB1YmxpYyBCcm93c2VyVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJICAKLSAgICAgICAgaWYgKChzdHlsZSAmIExPQ0FUSU9OX0JBUikgIT0gMCkKLSAgICAgICAgICAgIHNob3dVUkxiYXIgPSB0cnVlOwotCi0gICAgICAgIGlmICgoc3R5bGUgJiBCVVRUT05fQkFSKSAhPSAwKQotICAgICAgICAgICAgc2hvd1Rvb2xiYXIgPSB0cnVlOwotCi0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIHNldExheW91dChsYXlvdXQpOwotICAgICAgICBzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChzaG93VG9vbGJhciB8fCBzaG93VVJMYmFyKSB7Ci0gICAgICAgICAgICBDb21wb3NpdGUgdG9vbGJhckNvbXAgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIHRvb2xiYXJDb21wLnNldExheW91dChuZXcgVG9vbGJhckxheW91dCgpKTsKLSAgICAgICAgICAgIHRvb2xiYXJDb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotICAgICAgICAgICAgICAgICAgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HCi0gICAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgICAgICBpZiAoc2hvd1Rvb2xiYXIpCi0gICAgICAgICAgICAgICAgY3JlYXRlVG9vbGJhcih0b29sYmFyQ29tcCk7Ci0gICAgICAgICAgICAKLQkJCQlpZiAoc2hvd1VSTGJhcikKLSAgICAgICAgICAgICAgICBjcmVhdGVMb2NhdGlvbkJhcih0b29sYmFyQ29tcCk7Ci0KLQkJCQlpZiAoc2hvd1Rvb2xiYXIgfCBzaG93VVJMYmFyKSB7Ci0JCQkJICAgIGJ1c3kgPSBuZXcgQnVzeUluZGljYXRvcih0b29sYmFyQ29tcCwgU1dULk5PTkUpOwotCQkJCSAgICBidXN5LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCQkJICAgIGJ1c3kuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQkJCQkJLy8gaWdub3JlCi0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQkJCQlzZXRVUkwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJfQotCQkJCSAgICB9KTsKLQkJCQl9Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotICAgICAgICAgICAgICAgICAgQ29udGV4dElkcy5XRUJfQlJPV1NFUik7IAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgbmV3IFNXVCBXZWIgYnJvd3NlciB3aWRnZXQsIGNoZWNraW5nIG9uY2UgYWdhaW4gdG8gbWFrZSBzdXJlCi0gICAgICAgIC8vIHdlIGNhbiB1c2UgaXQgaW4gdGhpcyBlbnZpcm9ubWVudAotICAgICAgICAvL2lmIChXZWJCcm93c2VyVXRpbC5jYW5Vc2VJbnRlcm5hbFdlYkJyb3dzZXIoKSkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuYnJvd3NlciA9IG5ldyBCcm93c2VyKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU1dURXJyb3IgZSkgewotICAgICAgICAgICAgaWYgKGUuY29kZSE9U1dULkVSUk9SX05PX0hBTkRMRVMpIHsKLSAgICAgICAgICAgICAgICBXZWJCcm93c2VyVXRpbC5vcGVuRXJyb3IoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExhdW5jaEludGVybmFsV2ViQnJvd3Nlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGV4dCA9IG5ldyBCcm93c2VyVGV4dCh0aGlzLCB0aGlzLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzaG93VVJMYmFyKQotICAgICAgICAgICAgdXBkYXRlSGlzdG9yeSgpOwotICAgICAgICBpZiAoc2hvd1Rvb2xiYXIpCi0gICAgICAgICAgICB1cGRhdGVCYWNrTmV4dEJ1c3koKTsKLQotICAgICAgICAgaWYgKGJyb3dzZXIhPW51bGwpIHsKLSAgICAgICAgICAgIGJyb3dzZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGJyb3dzZXIsCi0gICAgICAgICAgICAgICAgICAgIENvbnRleHRJZHMuV0VCX0JST1dTRVIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRleHQuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIGFkZEJyb3dzZXJMaXN0ZW5lcnMoKTsKLSAgICAgICAgLy9saXN0ZW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIFNXVCBicm93c2VyIHdpZGdldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB1bmRlcmx5aW5nIGJyb3dzZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQnJvd3NlciBnZXRCcm93c2VyKCkgewotICAgICAgICByZXR1cm4gYnJvd3NlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOYXZpZ2F0ZSB0byB0aGUgaG9tZSBVUkwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaG9tZSgpIHsKLSAgIAkgYnJvd3Nlci5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIGEgVVJMLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmwKLSAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgdG8gYmUgbG9hZGVkCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIDx1bD4KLSAgICAgKiAgICAgICAgICAgICAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSB1cmwgaXMgbnVsbDwvbGk+Ci0gICAgICogICAgICAgICAgICAgICAgPC91bD4KLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIDx1bD4KLSAgICAgKiAgICAgICAgICAgICAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIHdoZW4gY2FsbGVkIGZyb20gdGhlCi0gICAgICogICAgICAgICAgICAgICAgd3JvbmcgdGhyZWFkPC9saT4KLSAgICAgKiAgICAgICAgICAgICAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIHdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbgotICAgICAqICAgICAgICAgICAgICAgIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICAgICAgICAgICAgICA8L3VsPgotICAgICAqIEBzZWUgI2dldFVSTCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VVJMKFN0cmluZyB1cmwpIHsKLSAgICAgICBzZXRVUkwodXJsLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCYWNrTmV4dEJ1c3koKSB7Ci0gICAgICAgIGJhY2suc2V0RW5hYmxlZChpc0JhY2tFbmFibGVkKCkpOwotICAgICAgICBmb3J3YXJkLnNldEVuYWJsZWQoaXNGb3J3YXJkRW5hYmxlZCgpKTsKLSAgICAgICAgYnVzeS5zZXRCdXN5KGxvYWRpbmcpOwotCi0gICAgICAgIGlmIChiYWNrTmV4dExpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICBiYWNrTmV4dExpc3RlbmVyLnVwZGF0ZUJhY2tOZXh0QnVzeSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUxvY2F0aW9uKCkgewotICAgICAgICBpZiAobG9jYXRpb25MaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgbG9jYXRpb25MaXN0ZW5lci5oaXN0b3J5Q2hhbmdlZChudWxsKTsKLQotICAgICAgICBpZiAobG9jYXRpb25MaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgbG9jYXRpb25MaXN0ZW5lci5sb2NhdGlvbkNoYW5nZWQobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkQnJvd3Nlckxpc3RlbmVycygpIHsKLSAgICAgICAgaWYgKGJyb3dzZXI9PW51bGwpIHJldHVybjsKLSAgICAgICAgLy8gcmVzcG9uZCB0byBFeHRlcm5hbEJyb3dzZXJJbnN0YW5jZSBTdGF0dXNUZXh0RXZlbnRzIGV2ZW50cyBieQotICAgICAgICAvLyB1cGRhdGluZyB0aGUgc3RhdHVzIGxpbmUKLSAgICAgICAgYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzdGF0dXM6ICIgKyBldmVudC50ZXh0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzID0gY29udGFpbmVyLmdldEFjdGlvbkJhcnMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0TWVzc2FnZShldmVudC50ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIEFkZCBsaXN0ZW5lciBmb3IgbmV3IHdpbmRvdyBjcmVhdGlvbiBzbyB0aGF0IHdlIGNhbiBpbnN0ZWFkIG9mCi0gICAgICAgIC8vIG9wZW5pbmcgYSBzZXBhcmF0ZQotICAgICAgICAvLyBuZXcgd2luZG93IGluIHdoaWNoIHRoZSBzZXNzaW9uIGlzIGxvc3QsIHdlIGNhbiBpbnN0ZWFkIG9wZW4gYSBuZXcKLSAgICAgICAgLy8gd2luZG93IGluIGEgbmV3Ci0gICAgICAgIC8vIHNoZWxsIHdpdGhpbiB0aGUgYnJvd3NlciBhcmVhIHRoZXJlYnkgbWFpbnRhaW5pbmcgdGhlIHNlc3Npb24uCi0gICAgICAgIGJyb3dzZXIuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwyID0gbmV3IFNoZWxsKGdldFNoZWxsKCkpOwotICAgICAgICAgICAgICAgIHNoZWxsMi5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgICAgICAgICAgICAgc2hlbGwyLnNldFRleHQoTWVzc2FnZXMudmlld1dlYkJyb3dzZXJUaXRsZSk7Ci0gICAgICAgICAgICAgICAgc2hlbGwyLnNldEltYWdlKGdldFNoZWxsKCkuZ2V0SW1hZ2UoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHNoZWxsMi5zZXRMb2NhdGlvbihldmVudC5sb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnNpemUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2hlbGwyLnNldFNpemUoZXZlbnQuc2l6ZSk7Ci0JCQkJCSBpbnQgc3R5bGUgPSAwOwotCQkJCQkgaWYgKGV2ZW50LmFkZHJlc3NCYXIpCi0JCQkJCQkgc3R5bGUgKz0gTE9DQVRJT05fQkFSOwotCQkJCQkgaWYgKGV2ZW50LnRvb2xCYXIpCi0JCQkJCQkgc3R5bGUgKz0gQlVUVE9OX0JBUjsKLSAgICAgICAgICAgICAgICBCcm93c2VyVmlld2VyIGJyb3dzZXIyID0gbmV3IEJyb3dzZXJWaWV3ZXIoc2hlbGwyLCAwKTsKLSAgICAgICAgICAgICAgICBicm93c2VyMi5uZXdXaW5kb3cgPSB0cnVlOwotICAgICAgICAgICAgICAgIGV2ZW50LmJyb3dzZXIgPSBicm93c2VyMi5icm93c2VyOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQkJICAKLQkJICBicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgc2hvdyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJCUJyb3dzZXIgYnJvd3NlcjIgPSAoQnJvd3NlcillLndpZGdldDsKLQkJCQkJaWYgKGJyb3dzZXIyLmdldFBhcmVudCgpLmdldFBhcmVudCgpIGluc3RhbmNlb2YgU2hlbGwpIHsKLQkJCQkJCVNoZWxsIHNoZWxsID0gKFNoZWxsKSBicm93c2VyMi5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKLQkJCQkJCWlmIChlLmxvY2F0aW9uICE9IG51bGwpCi0JCQkJCQkJc2hlbGwuc2V0TG9jYXRpb24oZS5sb2NhdGlvbik7Ci0JCQkJCQlpZiAoZS5zaXplICE9IG51bGwpCi0JCQkJCQkJc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShlLnNpemUueCwgZS5zaXplLnkpKTsKLQkJCQkJCXNoZWxsLm9wZW4oKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0gICAgICAgIGJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgc2hlbGwgaXMgbm90IG51bGwsIGl0IG11c3QgYmUgYSBzZWNvbmRhcnkgcG9wdXAgd2luZG93LAotICAgICAgICAgICAgICAgIC8vIGVsc2UgaXRzIGFuIGVkaXRvciB3aW5kb3cKLSAgICAgICAgICAgICAgICBpZiAobmV3V2luZG93KQotICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInByb2dyZXNzOiAiICsgZXZlbnQuY3VycmVudCArICIsICIgKyBldmVudC50b3RhbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIGlmIChldmVudC50b3RhbCA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGRvbmUgPSAoZXZlbnQuY3VycmVudCA9PSBldmVudC50b3RhbCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcGVyY2VudFByb2dyZXNzID0gZXZlbnQuY3VycmVudCAqIDEwMCAvIGV2ZW50LnRvdGFsOwotICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBjb250YWluZXIuZ2V0QWN0aW9uQmFycygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzV29ya2VkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9ncmVzc1dvcmtlZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzaygiIiwgZXZlbnQudG90YWwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1dvcmtlZCA9IHBlcmNlbnRQcm9ncmVzczsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKGV2ZW50LmN1cnJlbnQgLSBwcm9ncmVzc1dvcmtlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1dvcmtlZCA9IGV2ZW50LmN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2hvd1Rvb2xiYXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFidXN5LmlzQnVzeSgpICYmICFkb25lKQotICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1c3kuaXNCdXN5KCkgJiYgZG9uZSkgLy8gb25jZSB0aGUgcHJvZ3Jlc3MgaGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAwIHBlcmNlbnQsIGRvbmUsIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVzeSB0byBmYWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZyA9IGZhbHNlOwotCi0JCQkJCQkgIC8vU3lzdGVtLm91dC5wcmludGxuKCJsb2FkaW5nOiAiICsgbG9hZGluZyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQmFja05leHRCdXN5KCk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUhpc3RvcnkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGNvbnRhaW5lci5nZXRBY3Rpb25CYXJzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzaG93VG9vbGJhcikgewotICAgICAgICAgICAgICAgICAgICBsb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUJhY2tOZXh0QnVzeSgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVIaXN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpZiAoc2hvd1Rvb2xiYXIpIHsKLSAgICAgICAgICAgIGJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFldmVudC50b3ApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21ibyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJhYm91dDpibGFuayIuZXF1YWxzKGV2ZW50LmxvY2F0aW9uKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYm8uc2V0VGV4dChldmVudC5sb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9IaXN0b3J5KGV2ZW50LmxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVIaXN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ly8gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG5ldyBUaXRsZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY2hhbmdlZChUaXRsZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCSBTdHJpbmcgb2xkVGl0bGUgPSB0aXRsZTsKLSAgICAgICAgICAgICAgICB0aXRsZSA9IGV2ZW50LnRpdGxlOwotCQkJCQkgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUEVSVFlfVElUTEUsIG9sZFRpdGxlLCB0aXRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQkgCi0JIC8qKgotCQkgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBpbnN0YW5jZS4KLQkJICoKLQkJICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCQlwcm9wZXJ0eUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXByb3BlcnR5TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQkvKioKLQkJICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBpbnN0YW5jZS4KLQkJICoKLQkJICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCQlwcm9wZXJ0eUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJaWYgKHByb3BlcnR5TGlzdGVuZXJzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJLy9UcmFjZS50cmFjZSgiRmlyaW5nOiAiICsgZXZlbnQgKyAiICIgKyBvbGRWYWx1ZSk7Ci0JCQl0cnkgewotCQkJCWludCBzaXplID0gcHJvcGVydHlMaXN0ZW5lcnMuc2l6ZSgpOwotCQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBwY2wgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltzaXplXTsKLQkJCQlwcm9wZXJ0eUxpc3RlbmVycy50b0FycmF5KHBjbCk7Ci0JCQkJCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCXRyeSB7Ci0JCQkJCQlwY2xbaV0ucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQotICAgIC8qKgotICAgICAqIE5hdmlnYXRlIHRvIHRoZSBuZXh0IHNlc3Npb24gaGlzdG9yeSBpdGVtLiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCBjYWxscwotICAgICAqIHRoZSB1bmRlcmx5aW5nIFNXVCBicm93c2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBhbmQKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIDx1bD4KLSAgICAgKiAgICAgICAgICAgICAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIHdoZW4gY2FsbGVkIGZyb20gdGhlCi0gICAgICogICAgICAgICAgICAgICAgd3JvbmcgdGhyZWFkPC9saT4KLSAgICAgKiAgICAgICAgICAgICAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIHdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbgotICAgICAqICAgICAgICAgICAgICAgIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICAgICAgICAgICAgICA8L3VsPgotICAgICAqIEBzZWUgI2JhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmb3J3YXJkKCkgewotICAgICAgICBpZiAoYnJvd3Nlcj09bnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGJyb3dzZXIuZm9yd2FyZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5hdmlnYXRlIHRvIHRoZSBwcmV2aW91cyBzZXNzaW9uIGhpc3RvcnkgaXRlbS4gQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQKLSAgICAgKiBjYWxscyB0aGUgdW5kZXJseWluZyBTV1QgYnJvd3Nlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYW5kCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICA8dWw+Ci0gICAgICogICAgICAgICAgICAgICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyB3aGVuIGNhbGxlZCBmcm9tIHRoZQotICAgICAqICAgICAgICAgICAgICAgIHdyb25nIHRocmVhZDwvbGk+Ci0gICAgICogICAgICAgICAgICAgICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCB3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4KLSAgICAgKiAgICAgICAgICAgICAgICBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgICAgICAgICAgICAgPC91bD4KLSAgICAgKiBAc2VlICNmb3J3YXJkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYmFjaygpIHsKLSAgICAgICAgaWYgKGJyb3dzZXI9PW51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBicm93c2VyLmJhY2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWNlaXZlciBjYW4gbmF2aWdhdGUgdG8gdGhlIHByZXZpb3VzCi0gICAgICogc2Vzc2lvbiBoaXN0b3J5IGl0ZW0sIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLiBDb252ZW5pZW5jZQotICAgICAqIG1ldGhvZCB0aGF0IGNhbGxzIHRoZSB1bmRlcmx5aW5nIFNXVCBicm93c2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgYmFjayBjb21tYW5kIGVuYWJsZWQgc3RhdGUKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIDx1bD4KLSAgICAgKiAgICAgICAgICAgICAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuCi0gICAgICogICAgICAgICAgICAgICAgZGlzcG9zZWQ8L2xpPgotICAgICAqICAgICAgICAgICAgICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlCi0gICAgICogICAgICAgICAgICAgICAgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICogQHNlZSAjYmFjawotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQmFja0VuYWJsZWQoKSB7Ci0gICAgICAgIGlmIChicm93c2VyPT1udWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gYnJvd3Nlci5pc0JhY2tFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVjZWl2ZXIgY2FuIG5hdmlnYXRlIHRvIHRoZSBuZXh0Ci0gICAgICogc2Vzc2lvbiBoaXN0b3J5IGl0ZW0sIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLiBDb252ZW5pZW5jZQotICAgICAqIG1ldGhvZCB0aGF0IGNhbGxzIHRoZSB1bmRlcmx5aW5nIFNXVCBicm93c2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgZm9yd2FyZCBjb21tYW5kIGVuYWJsZWQgc3RhdGUKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIDx1bD4KLSAgICAgKiAgICAgICAgICAgICAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuCi0gICAgICogICAgICAgICAgICAgICAgZGlzcG9zZWQ8L2xpPgotICAgICAqICAgICAgICAgICAgICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlCi0gICAgICogICAgICAgICAgICAgICAgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICogQHNlZSAjZm9yd2FyZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRm9yd2FyZEVuYWJsZWQoKSB7Ci0gICAgICAgIGlmIChicm93c2VyPT1udWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCBhbnkgbG9hZGluZyBhbmQgcmVuZGVyaW5nIGFjdGl2aXR5LiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCBjYWxscwotICAgICAqIHRoZSB1bmRlcmx5aW5nIFNXVCBicm93c2VyLgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgPHVsPgotICAgICAqICAgICAgICAgICAgICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1Mgd2hlbiBjYWxsZWQgZnJvbSB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICB3cm9uZyB0aHJlYWQ8L2xpPgotICAgICAqICAgICAgICAgICAgICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuCi0gICAgICogICAgICAgICAgICAgICAgZGlzcG9zZWQ8L2xpPgotICAgICAqICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgaWYgKGJyb3dzZXIhPW51bGwpCi0gICAgICAgICAgICBicm93c2VyLnN0b3AoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbmF2aWdhdGUoU3RyaW5nIHVybCkgewotICAgICAgICBUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIk5hdmlnYXRlOiAiICsgdXJsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAodXJsICE9IG51bGwgJiYgdXJsLmVxdWFscyhnZXRVUkwoKSkpIHsKLSAgICAgICAgICAgIHJlZnJlc2goKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyIT1udWxsKQotICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIuc2V0VXJsKHVybCk7Ci0gICAgICAgIHJldHVybiB0ZXh0LnNldFVybCh1cmwpOwotICAgIH0KLSAKLSAgICAvKioKLSAgICAgKiBSZWZyZXNoIHRoZSBjdXJyZW50IHBhZ2UuIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNhbGxzIHRoZSB1bmRlcmx5aW5nCi0gICAgICogU1dUIGJyb3dzZXIuCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICA8dWw+Ci0gICAgICogICAgICAgICAgICAgICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyB3aGVuIGNhbGxlZCBmcm9tIHRoZQotICAgICAqICAgICAgICAgICAgICAgIHdyb25nIHRocmVhZDwvbGk+Ci0gICAgICogICAgICAgICAgICAgICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCB3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4KLSAgICAgKiAgICAgICAgICAgICAgICBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgICAgICAgICAgICAgPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICBpZiAoYnJvd3NlciE9bnVsbCkKLSAgICAgICAgICAgIGJyb3dzZXIucmVmcmVzaCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0ZXh0LnJlZnJlc2goKTsKLQkJICB0cnkgewotCQkJICBUaHJlYWQuc2xlZXAoNTApOwotCQkgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkgIC8vIGlnbm9yZQotCQkgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VVJMKFN0cmluZyB1cmwsIGJvb2xlYW4gYnJvd3NlKSB7Ci0gICAgICAgIFRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInNldFVSTDogIiArIHVybCArICIgIiArIGJyb3dzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIGhvbWUoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgiZWNsaXBzZSIuZXF1YWxzSWdub3JlQ2FzZSh1cmwpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZWxzZSBpZiAoInd0cCIuZXF1YWxzSWdub3JlQ2FzZSh1cmwpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy8iOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgaWYgKGJyb3dzZSkKLSAgICAgICAgICAgIG5hdmlnYXRlKHVybCk7Ci0KLSAgICAgICAgYWRkVG9IaXN0b3J5KHVybCk7Ci0gICAgICAgIHVwZGF0ZUhpc3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb0hpc3RvcnkoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAoaGlzdG9yeSA9PSBudWxsKQotICAgICAgICAgICAgaGlzdG9yeSA9IFdlYkJyb3dzZXJQcmVmZXJlbmNlLmdldEludGVybmFsV2ViQnJvd3Nlckhpc3RvcnkoKTsKLSAgICAgICAgaW50IGZvdW5kID0gLTE7Ci0gICAgICAgIGludCBzaXplID0gaGlzdG9yeS5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpIGhpc3RvcnkuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHMuZXF1YWxzKHVybCkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZm91bmQgPT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChzaXplID49IE1BWF9ISVNUT1JZKQotICAgICAgICAgICAgICAgIGhpc3RvcnkucmVtb3ZlKHNpemUgLSAxKTsKLSAgICAgICAgICAgIGhpc3RvcnkuYWRkKDAsIHVybCk7Ci0gICAgICAgICAgICBXZWJCcm93c2VyUHJlZmVyZW5jZS5zZXRJbnRlcm5hbFdlYkJyb3dzZXJIaXN0b3J5KGhpc3RvcnkpOwotICAgICAgICB9IGVsc2UgaWYgKGZvdW5kICE9IDApIHsKLSAgICAgICAgICAgIGhpc3RvcnkucmVtb3ZlKGZvdW5kKTsKLSAgICAgICAgICAgIGhpc3RvcnkuYWRkKDAsIHVybCk7Ci0gICAgICAgICAgICBXZWJCcm93c2VyUHJlZmVyZW5jZS5zZXRJbnRlcm5hbFdlYkJyb3dzZXJIaXN0b3J5KGhpc3RvcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0KLSAgICAgICAgc2hvd1Rvb2xiYXIgPSBmYWxzZTsKLQotICAgICAgICBpZiAoYnVzeSAhPSBudWxsKQotICAgICAgICAgICAgYnVzeS5kaXNwb3NlKCk7Ci0gICAgICAgIGJ1c3kgPSBudWxsOwotCi0gICAgICAgIGJyb3dzZXIgPSBudWxsOwotICAgICAgICB0ZXh0ID0gbnVsbDsKLSAgICAgICAgaWYgKGNsaXBib2FyZCE9bnVsbCkKLSAgICAgICAgCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0gICAgICAgIGNsaXBib2FyZD1udWxsOwotCi0gICAgICAgIHJlbW92ZVN5bmNocm9uaXphdGlvbkxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUb29sQmFyIGNyZWF0ZUxvY2F0aW9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOKTsKLQotICAgICAgICB1cGRhdGVIaXN0b3J5KCk7Ci0KLSAgICAgICAgY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCB3ZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpICE9IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0VVJMKGNvbWJvLmdldEl0ZW0oY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGNvbWJvLmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0VVJMKGNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgVG9vbEJhciB0b29sYmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuRkxBVCk7Ci0KLSAgICAgICAgVG9vbEl0ZW0gZ28gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULk5PTkUpOwotICAgICAgICBnby5zZXRJbWFnZShJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfTkFWX0dPKSk7Ci0gICAgICAgIGdvLnNldEhvdEltYWdlKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9OQVZfR08pKTsKLSAgICAgICAgZ28uc2V0RGlzYWJsZWRJbWFnZShJbWFnZVJlc291cmNlCi0gICAgICAgICAgICAgICAgLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfTkFWX0dPKSk7Ci0gICAgICAgIGdvLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbldlYkJyb3dzZXJHbyk7Ci0gICAgICAgIGdvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzZXRVUkwoY29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0JCSAgCi0JCSAgcmV0dXJuIHRvb2xiYXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUb29sQmFyIGNyZWF0ZVRvb2xiYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkgIFRvb2xCYXIgdG9vbGJhciA9IG5ldyBUb29sQmFyKHBhcmVudCwgU1dULkZMQVQpOwotCQkgIAotICAgICAgICAvLyBjcmVhdGUgYmFjayBhbmQgZm9yd2FyZCBhY3Rpb25zCi0gICAgICAgIGJhY2sgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULk5PTkUpOwotICAgICAgICBiYWNrLnNldEltYWdlKEltYWdlUmVzb3VyY2UKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9OQVZfQkFDS1dBUkQpKTsKLSAgICAgICAgYmFjay5zZXRIb3RJbWFnZShJbWFnZVJlc291cmNlCi0gICAgICAgICAgICAgICAgLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfTkFWX0JBQ0tXQVJEKSk7Ci0gICAgICAgIGJhY2suc2V0RGlzYWJsZWRJbWFnZShJbWFnZVJlc291cmNlCi0gICAgICAgICAgICAgICAgLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfTkFWX0JBQ0tXQVJEKSk7Ci0gICAgICAgIGJhY2suc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uV2ViQnJvd3NlckJhY2spOwotICAgICAgICBiYWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBiYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGZvcndhcmQgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULk5PTkUpOwotICAgICAgICBmb3J3YXJkLnNldEltYWdlKEltYWdlUmVzb3VyY2UKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9OQVZfRk9SV0FSRCkpOwotICAgICAgICBmb3J3YXJkLnNldEhvdEltYWdlKEltYWdlUmVzb3VyY2UKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9OQVZfRk9SV0FSRCkpOwotICAgICAgICBmb3J3YXJkLnNldERpc2FibGVkSW1hZ2UoSW1hZ2VSZXNvdXJjZQotICAgICAgICAgICAgICAgIC5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19ETENMX05BVl9GT1JXQVJEKSk7Ci0gICAgICAgIGZvcndhcmQuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uV2ViQnJvd3NlckZvcndhcmQpOwotICAgICAgICBmb3J3YXJkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBmb3J3YXJkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIGNyZWF0ZSByZWZyZXNoLCBzdG9wLCBhbmQgcHJpbnQgYWN0aW9ucwotICAgICAgICBUb29sSXRlbSBzdG9wID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLSAgICAgICAgc3RvcC5zZXRJbWFnZShJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfTkFWX1NUT1ApKTsKLSAgICAgICAgc3RvcC5zZXRIb3RJbWFnZShJbWFnZVJlc291cmNlCi0gICAgICAgICAgICAgICAgLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfTkFWX1NUT1ApKTsKLSAgICAgICAgc3RvcC5zZXREaXNhYmxlZEltYWdlKEltYWdlUmVzb3VyY2UKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9OQVZfU1RPUCkpOwotICAgICAgICBzdG9wLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbldlYkJyb3dzZXJTdG9wKTsKLSAgICAgICAgc3RvcC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBUb29sSXRlbSByZWZyZXNoID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLSAgICAgICAgcmVmcmVzaC5zZXRJbWFnZShJbWFnZVJlc291cmNlCi0gICAgICAgICAgICAgICAgLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfTkFWX1JFRlJFU0gpKTsKLSAgICAgICAgcmVmcmVzaC5zZXRIb3RJbWFnZShJbWFnZVJlc291cmNlCi0gICAgICAgICAgICAgICAgLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfTkFWX1JFRlJFU0gpKTsKLSAgICAgICAgcmVmcmVzaC5zZXREaXNhYmxlZEltYWdlKEltYWdlUmVzb3VyY2UKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9OQVZfUkVGUkVTSCkpOwotICAgICAgICByZWZyZXNoLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbldlYkJyb3dzZXJSZWZyZXNoKTsKLSAgICAgICAgcmVmcmVzaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgcmVmcmVzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQkJICAKLQkJICByZXR1cm4gdG9vbGJhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IFVSTC4gQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY2FsbHMgdGhlIHVuZGVybHlpbmcgU1dUCi0gICAgICogYnJvd3Nlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IFVSTCBvciBhbiBlbXB0eSA8Y29kZT5TdHJpbmc8L2NvZGU+IGlmIHRoZXJlIGlzIG5vCi0gICAgICogICAgICAgICBjdXJyZW50IFVSTAotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgPHVsPgotICAgICAqICAgICAgICAgICAgICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1Mgd2hlbiBjYWxsZWQgZnJvbSB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICB3cm9uZyB0aHJlYWQ8L2xpPgotICAgICAqICAgICAgICAgICAgICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuCi0gICAgICogICAgICAgICAgICAgICAgZGlzcG9zZWQ8L2xpPgotICAgICAqICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICogQHNlZSAjc2V0VVJMKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLSAgICAgICAgaWYgKGJyb3dzZXIhPW51bGwpCi0gICAgICAgICAgICByZXR1cm4gYnJvd3Nlci5nZXRVcmwoKTsKLSAgICAgICAgcmV0dXJuIHRleHQuZ2V0VXJsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMoKSB7Ci0gICAgICAgIGlmIChjb21ibyAhPSBudWxsKQotICAgICAgICAgICAgY29tYm8uc2V0Rm9jdXMoKTsKLSAgICAgICAgZWxzZSBpZiAoYnJvd3NlciE9bnVsbCkKLSAgICAgICAgICAgIGJyb3dzZXIuc2V0Rm9jdXMoKTsKLSAgICAgICAgZWxzZSBpZiAodGV4dCE9bnVsbCkKLSAgICAgICAgICAgIHRleHQuc2V0Rm9jdXMoKTsKLSAgICAgICAgdXBkYXRlSGlzdG9yeSgpOwotICAgICAgICByZXR1cm4gc3VwZXIuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIGhpc3RvcnkgbGlzdCB0byB0aGUgZ2xvYmFsL3NoYXJlZCBjb3B5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUhpc3RvcnkoKSB7Ci0gICAgICAgIGlmIChjb21ibyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFN0cmluZyB0ZW1wID0gY29tYm8uZ2V0VGV4dCgpOwotICAgICAgICBpZiAoaGlzdG9yeSA9PSBudWxsKQotICAgICAgICAgICAgaGlzdG9yeSA9IFdlYkJyb3dzZXJQcmVmZXJlbmNlLmdldEludGVybmFsV2ViQnJvd3Nlckhpc3RvcnkoKTsKLQotICAgICAgICBTdHJpbmdbXSBoaXN0b3J5TGlzdCA9IG5ldyBTdHJpbmdbaGlzdG9yeS5zaXplKCldOwotICAgICAgICBoaXN0b3J5LnRvQXJyYXkoaGlzdG9yeUxpc3QpOwotICAgICAgICBjb21iby5zZXRJdGVtcyhoaXN0b3J5TGlzdCk7Ci0KLSAgICAgICAgY29tYm8uc2V0VGV4dCh0ZW1wKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUJyb3dzZXJWaWV3ZXJDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgewotICAgICAgICByZXR1cm4gY29udGFpbmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihJQnJvd3NlclZpZXdlckNvbnRhaW5lciBjb250YWluZXIpIHsKLSAgICAJaWYgKGNvbnRhaW5lcj09bnVsbCAmJiB0aGlzLmNvbnRhaW5lciE9bnVsbCkgewotICAgIAkJSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIgPSB0aGlzLmNvbnRhaW5lci5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLSAgICAJCWlmIChtYW5hZ2VyIT1udWxsKSAKLSAgICAJCQltYW5hZ2VyLmdldFByb2dyZXNzTW9uaXRvcigpLmRvbmUoKTsKLSAgICAJfQotICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlOwotICAgIHByb3RlY3RlZCBsb25nIHRpbWVzdGFtcDsKLSAgICBwcm90ZWN0ZWQgVGhyZWFkIGZpbGVMaXN0ZW5lclRocmVhZDsKLSAgICBwcm90ZWN0ZWQgTG9jYXRpb25MaXN0ZW5lciBsb2NhdGlvbkxpc3RlbmVyMjsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHN5bmNPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkU3luY2hyb25pemF0aW9uTGlzdGVuZXIoKSB7Ci0gICAJIGlmIChmaWxlTGlzdGVuZXJUaHJlYWQgIT0gbnVsbCkKLSAgIAkJIHJldHVybjsKLSAgIAkgCi0gICAJIGZpbGVMaXN0ZW5lclRocmVhZCA9IG5ldyBUaHJlYWQoIkJyb3dzZXIgZmlsZSBzeW5jaHJvbml6YXRpb24iKSB7IC8vJE5PTi1OTFMtMSQKLSAgIAkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgIAkJCSB3aGlsZSAoZmlsZUxpc3RlbmVyVGhyZWFkICE9IG51bGwpIHsKLSAgIAkJCQkgdHJ5IHsKLSAgIAkJCQkJIFRocmVhZC5zbGVlcCgyMDAwKTsKLSAgIAkJCQkgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgIAkJCQkJIC8vIGlnbm9yZQotICAgCQkJCSB9Ci0gICAJCQkJIHN5bmNocm9uaXplZCAoc3luY09iamVjdCkgewotCQkJCQkJIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5sYXN0TW9kaWZpZWQoKSAhPSB0aW1lc3RhbXApIHsKLQkgICAJCQkJCSB0aW1lc3RhbXAgPSBmaWxlLmxhc3RNb2RpZmllZCgpOwotCSAgIAkJCQkJIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkgCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkgCQkJCQkJCQlyZWZyZXNoKCk7Ci0JIAkJCQkJCQl9Ci0JICAgCQkJCQkgfSk7Ci0JCQkJCQkgfQotCQkJCQkgIH0KLSAgIAkJCSB9Ci0gICAJCSB9Ci0gICAJIH07Ci0gICAJIGZpbGVMaXN0ZW5lclRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0gICAJIGZpbGVMaXN0ZW5lclRocmVhZC5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZKTsKLSAgIAkgCi0gICAJIGxvY2F0aW9uTGlzdGVuZXIyID0gbmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAJIEZpbGUgdGVtcCA9IGdldEZpbGUoZXZlbnQubG9jYXRpb24pOwotICAgICAgICAgCSBpZiAodGVtcCAhPSBudWxsICYmIHRlbXAuZXhpc3RzKCkpIHsKLSAgICAgICAgIAkJIHN5bmNocm9uaXplZCAoc3luY09iamVjdCkgewotICAgICAgICAgCQkJIGZpbGUgPSB0ZW1wOwotICAgICAgICAgICAgCQkgdGltZXN0YW1wID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJCQkJIH0KLSAgICAgICAgIAkgfSBlbHNlCi0gICAgICAgICAJCSBmaWxlID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgIH0KLSAgICAgICB9OwotICAgICAgIGJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihsb2NhdGlvbkxpc3RlbmVyMik7Ci0gICAgICAgCi0gICAgICAgRmlsZSB0ZW1wID0gZ2V0RmlsZShicm93c2VyLmdldFVybCgpKTsKLSAgIAkgaWYgKHRlbXAgIT0gbnVsbCAmJiB0ZW1wLmV4aXN0cygpKSB7Ci0gICAJCWZpbGUgPSB0ZW1wOwotICAgICAgCXRpbWVzdGFtcCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7Ci0gICAJIH0KLSAgIAkgZmlsZUxpc3RlbmVyVGhyZWFkLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBGaWxlIGdldEZpbGUoU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAJIGlmIChsb2NhdGlvbiA9PSBudWxsKQotICAgCQkgcmV0dXJuIG51bGw7Ci0gICAJIGlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCJmaWxlOi8iKSkgLy8kTk9OLU5MUy0xJAotICAgCQkgbG9jYXRpb24gPSBsb2NhdGlvbi5zdWJzdHJpbmcoNik7Ci0gICAJIAotICAgCSByZXR1cm4gbmV3IEZpbGUobG9jYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZVN5bmNocm9uaXphdGlvbkxpc3RlbmVyKCkgewotICAgCSBpZiAoZmlsZUxpc3RlbmVyVGhyZWFkID09IG51bGwpCi0gICAJCSByZXR1cm47Ci0gICAJIAotICAgCSBmaWxlTGlzdGVuZXJUaHJlYWQgPSBudWxsOwotICAgCSBicm93c2VyLnJlbW92ZUxvY2F0aW9uTGlzdGVuZXIobG9jYXRpb25MaXN0ZW5lcjIpOwotICAgCSBsb2NhdGlvbkxpc3RlbmVyMiA9IG51bGw7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9CdXN5SW5kaWNhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvQnVzeUluZGljYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTBlMTE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9CdXN5SW5kaWNhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLS8qKgotICogQW4gYW5pbWF0ZWQgaW1hZ2UgdG8gc2hvdyBidXN5IHN0YXR1cyBvZiB0aGUgV2ViIGJyb3dzZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBCdXN5SW5kaWNhdG9yIGV4dGVuZHMgQ2FudmFzIHsKLQlwcm90ZWN0ZWQgSW1hZ2VbXSBpbWFnZXM7Ci0JcHJvdGVjdGVkIEltYWdlIGltYWdlOwotCi0JcHJvdGVjdGVkIFRocmVhZCBidXN5VGhyZWFkOwotCXByb3RlY3RlZCBib29sZWFuIHN0b3A7Ci0KLQkvKioKLQkgKiBCdXN5V2lkZ2V0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUgaW50Ci0JICovCi0JcHVibGljIEJ1c3lJbmRpY2F0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQotCQlpbWFnZXMgPSBJbWFnZVJlc291cmNlLmdldEJ1c3lJbWFnZXMoKTsKLQkKLQkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQkJb25QYWludChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQotCQlpbWFnZSA9IGltYWdlc1swXTsKLQl9Ci0JCi0JcHVibGljIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJcmV0dXJuIG5ldyBQb2ludCgyNSwgMjUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgdGhyZWFkIHRvIGFuaW1hdGUgdGhlIGltYWdlLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBjcmVhdGVCdXN5VGhyZWFkKCkgewotCQlpZiAoYnVzeVRocmVhZCAhPSBudWxsKQotCQkJcmV0dXJuOwotCQotCQlzdG9wID0gZmFsc2U7Ci0JCWJ1c3lUaHJlYWQgPSBuZXcgVGhyZWFkKCkgewotCQkJcHJvdGVjdGVkIGludCBjb3VudDsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQljb3VudCA9IDE7Ci0JCQkJCXdoaWxlICghc3RvcCkgewotCQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJaWYgKCFzdG9wKSB7Ci0JCQkJCQkJCQlpZiAoY291bnQgPCAxMykKLQkJCQkJCQkJCQlzZXRJbWFnZShpbWFnZXNbY291bnRdKTsKLQkJCQkJCQkJCWNvdW50Kys7Ci0JCQkJCQkJCQlpZiAoY291bnQgPiAxMikKLQkJCQkJCQkJCQljb3VudCA9IDE7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc2xlZXAoMTI1KTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWdub3JlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGJ1c3lUaHJlYWQgPT0gbnVsbCkKLQkJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBUaHJlYWQoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlzZXRJbWFnZShpbWFnZXNbMF0pOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJCdXN5IGVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCi0JCWJ1c3lUaHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgKyAyKTsKLQkJYnVzeVRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCWJ1c3lUaHJlYWQuc3RhcnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3RvcCA9IHRydWU7Ci0JCWJ1c3lUaHJlYWQgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGl0IGlzIGN1cnJlbnRseSBidXN5LgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCdXN5KCkgewotCQlyZXR1cm4gKGJ1c3lUaHJlYWQgIT0gbnVsbCk7Ci0JfQotCi0JLyogCi0JICogUHJvY2VzcyB0aGUgcGFpbnQgZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvblBhaW50KFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRDbGllbnRBcmVhKCk7Ci0JCWlmIChyZWN0LndpZHRoID09IDAgfHwgcmVjdC5oZWlnaHQgPT0gMCkKLQkJCXJldHVybjsKLQkKLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDIsIDIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluZGljYXRvcnMgYnVzeSBjb3VudCB1cCAodHJ1ZSkgb3IgZG93biAoZmFsc2UpIG9uZS4KLQkgKgotCSAqIEBwYXJhbSBidXN5IGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0QnVzeShib29sZWFuIGJ1c3kpIHsKLQkJaWYgKGJ1c3kpIHsKLQkJCWlmIChidXN5VGhyZWFkID09IG51bGwpCi0JCQkJY3JlYXRlQnVzeVRocmVhZCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGJ1c3lUaHJlYWQgIT0gbnVsbCkgewotCQkJCXN0b3AgPSB0cnVlOwotCQkJCWJ1c3lUaHJlYWQgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBpbWFnZS4KLQkgKiBUaGUgdmFsdWUgPGNvZGU+bnVsbDwvY29kZT4gY2xlYXJzIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCWlmIChpbWFnZSAhPSB0aGlzLmltYWdlICYmICFpc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQkJCXJlZHJhdygpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9Db250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTdjMTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9Db250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0vKioKLSAqIENvbnRleHQgaGVscCBpZCBjb25zdGFudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dElkcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9CUk9XU0VSID0gV2ViQnJvd3NlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYnJvd3Nlcl9wcmVmZXJlbmNlX3BhZ2VfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0JST1dTRVJfRElBTE9HID0gV2ViQnJvd3NlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYnJvd3Nlcl9wcmVmZXJlbmNlX3BhZ2VfZGlhbG9nX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0JST1dTRVIgPSBXZWJCcm93c2VyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5icm93c2VyX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0RlZmF1bHRCcm93c2VyU3VwcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0RlZmF1bHRCcm93c2VyU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzdiOWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9EZWZhdWx0QnJvd3NlclN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuT2JzZXJ2YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuT2JzZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5BYnN0cmFjdFdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHdvcmtiZW5jaCBicm93c2VyIHN1cHBvcnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QnJvd3NlclN1cHBvcnQgZXh0ZW5kcyBBYnN0cmFjdFdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRF9JRCA9ICJvcmcuZWNsaXBzZS51aS5icm93c2VyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEhhc2hNYXAgYnJvd3NlcklkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgRGVmYXVsdEJyb3dzZXJTdXBwb3J0IGluc3RhbmNlOwotCi0JcHVibGljIERlZmF1bHRCcm93c2VyU3VwcG9ydCgpIHsKLQkJLy8gZG8gbm90aGluZwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JCUJyb3dzZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkT2JzZXJ2ZXIobmV3IE9ic2VydmVyKCkgewotCQkJcHVibGljIHZvaWQgdXBkYXRlKE9ic2VydmFibGUgbywgT2JqZWN0IGFyZykgewotCQkJCS8vIFRPRE8gSSBhbSBub3Qgc3VyZSB3aGF0IHdlIHNob3VsZCBkbyBoZXJlCi0JCQkJLy8gVGhlIHByZWZlcmVuY2VzIGhhdmUgY2hhbmdlZCBzbyBtYXliZSB3ZSBzaG91bGQKLQkJCQkvLyBjbG9zZSB0aGUgb3BlbmVkIGJyb3dzZXJzIGluIGFkZGl0aW9uIHRvIGNsZWFyaW5nCi0JCQkJLy8gdGhlIHRhYmxlCi0JCQkJYnJvd3NlcklkTWFwLmNsZWFyKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRGVmYXVsdEJyb3dzZXJTdXBwb3J0IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIElXZWJCcm93c2VyIGdldEV4aXN0aW5nV2ViQnJvd3NlcihTdHJpbmcgYnJvd3NlcklkKSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2JqID0gYnJvd3NlcklkTWFwLmdldChicm93c2VySWQpOwotCQkJSVdlYkJyb3dzZXIgYnJvd3NlciA9IG51bGw7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVdlYkJyb3dzZXIpCi0JCQkJYnJvd3NlciA9IChJV2ViQnJvd3Nlcikgb2JqOwotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSGFzaE1hcCkgewotCQkJCUhhc2hNYXAgd21hcCA9IChIYXNoTWFwKSBvYmo7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIgPSAoSVdlYkJyb3dzZXIpIHdtYXAuZ2V0KGdldFdpbmRvd0tleSh3aW5kb3cpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYnJvd3NlciAhPSBudWxsKQotCQkJCXJldHVybiBicm93c2VyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGdldFdpbmRvd0tleShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlyZXR1cm4gbmV3IEludGVnZXIod2luZG93Lmhhc2hDb2RlKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQjY3JlYXRlQnJvd3NlcihpbnQsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJV2ViQnJvd3NlciBjcmVhdGVCcm93c2VyKGludCBzdHlsZSwgU3RyaW5nIGJyb3dzZXJJZCwgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmcgdG9vbHRpcCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKGJyb3dzZXJJZCA9PSBudWxsKQotCQkJYnJvd3NlcklkID0gU0hBUkVEX0lEOwotCQlJV2ViQnJvd3NlciBicm93c2VyID0gZ2V0RXhpc3RpbmdXZWJCcm93c2VyKGJyb3dzZXJJZCk7Ci0JCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCWlmIChicm93c2VyIGluc3RhbmNlb2YgSW50ZXJuYWxCcm93c2VySW5zdGFuY2UpIHsKLQkJCQlJbnRlcm5hbEJyb3dzZXJJbnN0YW5jZSBpbnN0YW5jZTIgPSAoSW50ZXJuYWxCcm93c2VySW5zdGFuY2UpIGJyb3dzZXI7Ci0JCQkJaW5zdGFuY2UyLnNldE5hbWUobmFtZSk7Ci0JCQkJaW5zdGFuY2UyLnNldFRvb2x0aXAodG9vbHRpcCk7Ci0JCQl9Ci0JCQlyZXR1cm4gYnJvd3NlcjsKLQkJfQotCi0JCUlXZWJCcm93c2VyIHdlYkJyb3dzZXIgPSBudWxsOwotCi0JCS8vIEFTX0VYVEVSTkFMIHdpbGwgZm9yY2UgdGhlIGV4dGVybmFsIGJyb3dzZXIgcmVnYXJkbGVzcyBvZiB0aGUgdXNlcgotCQkvLyBwcmVmZXJlbmNlCi0JCWlmICgoc3R5bGUgJiBBU19FWFRFUk5BTCkgIT0gMAotCQkJCXx8IFdlYkJyb3dzZXJQcmVmZXJlbmNlLmdldEJyb3dzZXJDaG9pY2UoKSAhPSBXZWJCcm93c2VyUHJlZmVyZW5jZS5JTlRFUk5BTCkgewotCQkJSUJyb3dzZXJEZXNjcmlwdG9yIGV3YiA9IEJyb3dzZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRXZWJCcm93c2VyKCk7Ci0JCQlpZiAoZXdiID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKE1lc3NhZ2VzLmVycm9yTm9Ccm93c2VyKTsKLQkJCQotCQkJaWYgKGV3YiBpbnN0YW5jZW9mIFN5c3RlbUJyb3dzZXJEZXNjcmlwdG9yKQotCQkJCXdlYkJyb3dzZXIgPSBuZXcgU3lzdGVtQnJvd3Nlckluc3RhbmNlKGJyb3dzZXJJZCk7Ci0JCQllbHNlIHsKLQkJCQlJQnJvd3NlckV4dCBleHQgPSBudWxsOwotCQkJCWlmIChld2IgIT0gbnVsbCkKLQkJCQkJZXh0ID0gV2ViQnJvd3NlclVJUGx1Z2luLmZpbmRCcm93c2Vycyhld2IuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJaWYgKGV4dCAhPSBudWxsKQotCQkJCQl3ZWJCcm93c2VyID0gZXh0LmNyZWF0ZUJyb3dzZXIoYnJvd3NlcklkLAotCQkJCQkJCWV3Yi5nZXRMb2NhdGlvbigpLCBld2IuZ2V0UGFyYW1ldGVycygpKTsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKQotCQkJCQl3ZWJCcm93c2VyID0gbmV3IEV4dGVybmFsQnJvd3Nlckluc3RhbmNlKGJyb3dzZXJJZCwgZXdiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoc3R5bGUgJiBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuQVNfVklFVykgIT0gMCkKLQkJCQl3ZWJCcm93c2VyID0gbmV3IEludGVybmFsQnJvd3NlclZpZXdJbnN0YW5jZShicm93c2VySWQsIHN0eWxlLAotCQkJCQkJbmFtZSwgdG9vbHRpcCk7Ci0JCQllbHNlCi0JCQkJd2ViQnJvd3NlciA9IG5ldyBJbnRlcm5hbEJyb3dzZXJFZGl0b3JJbnN0YW5jZShicm93c2VySWQsCi0JCQkJCQlzdHlsZSwgbmFtZSwgdG9vbHRpcCk7Ci0JCX0KLQotCQlpZiAod2ViQnJvd3NlciBpbnN0YW5jZW9mIEludGVybmFsQnJvd3Nlckluc3RhbmNlKSB7Ci0JCQkvLyB3ZSBzaG91bGQgb25seSBzaGFyZSBpbnRlcm5hbCBicm93c2VycyB3aXRoaW4gb25lCi0JCQkvLyB3b3JrYmVuY2ggd2luZG93LiBFYWNoIHdvcmtiZW5jaCB3aW5kb3cgY2FuIGhhdmUKLQkJCS8vIGEgc2hhcmVkIGJyb3dzZXIgd2l0aCB0aGUgc2FtZSBpZAotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCUludGVnZXIga2V5ID0gZ2V0V2luZG93S2V5KHdpbmRvdyk7Ci0JCQlIYXNoTWFwIHdtYXAgPSAoSGFzaE1hcCkgYnJvd3NlcklkTWFwLmdldChicm93c2VySWQpOwotCQkJaWYgKHdtYXAgPT0gbnVsbCkgewotCQkJCXdtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWJyb3dzZXJJZE1hcC5wdXQoYnJvd3NlcklkLCB3bWFwKTsKLQkJCX0KLQkJCXdtYXAucHV0KGtleSwgd2ViQnJvd3Nlcik7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBleHRlcm5hbCBhbmQgc3lzdGVtIGJyb3dzZXJzIGFyZSBzaGFyZWQKLQkJCS8vIGZvciB0aGUgZW50aXJlIHdvcmtiZW5jaAotCQkJYnJvd3NlcklkTWFwLnB1dChicm93c2VySWQsIHdlYkJyb3dzZXIpOwotCQl9Ci0JCXJldHVybiB3ZWJCcm93c2VyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQjY3JlYXRlQnJvd3NlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJV2ViQnJvd3NlciBjcmVhdGVCcm93c2VyKFN0cmluZyBicm93c2VySWQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVCcm93c2VyKDAsIGJyb3dzZXJJZCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXb3JrYmVuY2hCcm93c2VyU3VwcG9ydCNpc0ludGVybmFsV2ViQnJvd3NlckF2YWlsYWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcm5hbFdlYkJyb3dzZXJBdmFpbGFibGUoKSB7Ci0JCXJldHVybiBXZWJCcm93c2VyVXRpbC5jYW5Vc2VJbnRlcm5hbFdlYkJyb3dzZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVCcm93c2VyKElXZWJCcm93c2VyIGJyb3dzZXIpIHsKLQkJU3RyaW5nIGJhc2VJZCA9IFdlYkJyb3dzZXJVdGlsLmRlY29kZUlkKGJyb3dzZXIuZ2V0SWQoKSk7Ci0JCWlmIChicm93c2VyIGluc3RhbmNlb2YgSW50ZXJuYWxCcm93c2VySW5zdGFuY2UpIHsKLQkJCS8vIFJlbW92ZSBpdCBmcm9tIHRoZSB3aW5kb3cgbWFwIGFuZAotCQkJLy8gYWxzbyByZW1vdmUgdGhlIHdpbmRvdyBtYXAgaXRzZWxmIGlmIGl0IGlzIGVtcHR5LgotCQkJSW50ZWdlciBrZXkgPSAoKEludGVybmFsQnJvd3Nlckluc3RhbmNlKSBicm93c2VyKS5nZXRXaW5kb3dLZXkoKTsKLQkJCUhhc2hNYXAgd21hcCA9IChIYXNoTWFwKSBicm93c2VySWRNYXAuZ2V0KGJhc2VJZCk7Ci0JCQlpZiAod21hcCAhPSBudWxsKSB7Ci0JCQkJd21hcC5yZW1vdmUoa2V5KTsKLQkJCQlpZiAod21hcC5pc0VtcHR5KCkpCi0JCQkJCWJyb3dzZXJJZE1hcC5yZW1vdmUoYmFzZUlkKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlicm93c2VySWRNYXAucmVtb3ZlKGJhc2VJZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9FeHRlcm5hbEJyb3dzZXJJbnN0YW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0V4dGVybmFsQnJvd3Nlckluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjZjNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0V4dGVybmFsQnJvd3Nlckluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLkFic3RyYWN0V2ViQnJvd3NlcjsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiBhIHJ1bm5pbmcgV2ViIGJyb3dzZXIuIHJ1bmRsbDMyLmV4ZQotICogdXJsLmRsbCxGaWxlUHJvdG9jb2xIYW5kbGVyIHd3dy5pYm0uY29tCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbEJyb3dzZXJJbnN0YW5jZSBleHRlbmRzIEFic3RyYWN0V2ViQnJvd3NlciB7Ci0JcHJvdGVjdGVkIElCcm93c2VyRGVzY3JpcHRvciBicm93c2VyOwotCi0JcHJvdGVjdGVkIFByb2Nlc3MgcHJvY2VzczsKLQotCXB1YmxpYyBFeHRlcm5hbEJyb3dzZXJJbnN0YW5jZShTdHJpbmcgaWQsIElCcm93c2VyRGVzY3JpcHRvciBicm93c2VyKSB7Ci0JCXN1cGVyKGlkKTsKLQkJdGhpcy5icm93c2VyID0gYnJvd3NlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuVVJMKFVSTCB1cmwpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB1cmxUZXh0ID0gbnVsbDsKLQotCQlpZiAodXJsICE9IG51bGwpCi0JCQl1cmxUZXh0ID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0KLQkJLy8gY2hhbmdlIHNwYWNlcyB0byAiJTIwIgotCQlpZiAodXJsVGV4dCAhPSBudWxsICYmICFXZWJCcm93c2VyVXRpbC5pc1dpbmRvd3MoKSkgewotCQkJaW50IGluZGV4ID0gdXJsVGV4dC5pbmRleE9mKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlIChpbmRleCA+PSAwKSB7Ci0JCQkJdXJsVGV4dCA9IHVybFRleHQuc3Vic3RyaW5nKDAsIGluZGV4KQotCQkJCQkJKyAiJTIwIiArIHVybFRleHQuc3Vic3RyaW5nKGluZGV4ICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmRleCA9IHVybFRleHQuaW5kZXhPZigiICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgbG9jYXRpb24gPSBicm93c2VyLmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyBwYXJhbWV0ZXJzID0gYnJvd3Nlci5nZXRQYXJhbWV0ZXJzKCk7Ci0JCVRyYWNlCi0JCQkJLnRyYWNlKAotCQkJCQkJVHJhY2UuRklORVNULAotCQkJCQkJIkxhdW5jaGluZyBleHRlcm5hbCBXZWIgYnJvd3NlcjogIiArIGxvY2F0aW9uICsgIiAtICIgKyBwYXJhbWV0ZXJzICsgIiAtICIgKyB1cmxUZXh0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQlTdHJpbmcgcGFyYW1zID0gcGFyYW1ldGVyczsKLQkJaWYgKHBhcmFtcyA9PSBudWxsKQotCQkJcGFyYW1zID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAodXJsVGV4dCAhPSBudWxsKSB7Ci0JCQlpbnQgdXJsSW5kZXggPSBwYXJhbXMuaW5kZXhPZihJQnJvd3NlckRlc2NyaXB0b3IuVVJMX1BBUkFNRVRFUik7Ci0JCQlpZiAodXJsSW5kZXggPj0gMCkKLQkJCQlwYXJhbXMgPSBwYXJhbXMuc3Vic3RyaW5nKDAsIHVybEluZGV4KQotCQkJCQkJKyAiICIgKyB1cmxUZXh0ICsgIiAiICsgcGFyYW1zLnN1YnN0cmluZyh1cmxJbmRleCArIElCcm93c2VyRGVzY3JpcHRvci5VUkxfUEFSQU1FVEVSLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQllbHNlIHsKLQkJCQlpZiAoIXBhcmFtcy5lbmRzV2l0aCgiICIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXBhcmFtcyArPSAiICI7IC8vJE5PTi1OTFMtMSQgCi0JCQkJcGFyYW1zICs9IHVybFRleHQ7Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTGF1bmNoaW5nICIgKyBsb2NhdGlvbiArICIgIiArIHBhcmFtcyk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQlpZiAocGFyYW1zID09IG51bGwgfHwgcGFyYW1zLmxlbmd0aCgpID09IDApCi0JCQkJcHJvY2VzcyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMobG9jYXRpb24pOwotCQkJZWxzZQotCQkJCXByb2Nlc3MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGxvY2F0aW9uICsgIiAiICsgcGFyYW1zKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGxhdW5jaCBleHRlcm5hbCBicm93c2VyIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCVdlYkJyb3dzZXJVdGlsLm9wZW5FcnJvcihOTFMuYmluZCgKLQkJCQkJTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExhdW5jaFdlYkJyb3dzZXIsIHVybFRleHQpKTsKLQkJfQotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlwcm9jZXNzLndhaXRGb3IoKTsKLQkJCQkJRGVmYXVsdEJyb3dzZXJTdXBwb3J0LmdldEluc3RhbmNlKCkucmVtb3ZlQnJvd3NlcigKLQkJCQkJCQlFeHRlcm5hbEJyb3dzZXJJbnN0YW5jZS50aGlzKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQl0cnkgewotCQkJcHJvY2Vzcy5kZXN0cm95KCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvRmFsbGJhY2tTY3JvbGxlZENvbXBvc2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0ZhbGxiYWNrU2Nyb2xsZWRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdiYzkzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvRmFsbGJhY2tTY3JvbGxlZENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxCYXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGYWxsYmFja1Njcm9sbGVkQ29tcG9zaXRlIGV4dGVuZHMgU2Nyb2xsZWRDb21wb3NpdGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIX1NDUk9MTF9JTkNSRU1FTlQgPSA1OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZfU0NST0xMX0lOQ1JFTUVOVCA9IDY0OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbmV3IGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICogQHBhcmFtIHN0eWxlCi0gICAgICogICAgICAgICAgICB0aGUgc3R5bGUgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIEZhbGxiYWNrU2Nyb2xsZWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBhZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgcmVmbG93KHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0gICAgICAgIHNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0gICAgICAgIGluaXRpYWxpemVTY3JvbGxCYXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZm9yZWdyb3VuZCBvZiB0aGUgY29udHJvbCBhbmQgaXRzIGNvbnRlbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZnCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IGZvcmVncm91bmQgY29sb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIGZnKSB7Ci0gICAgICAgIHN1cGVyLnNldEZvcmVncm91bmQoZmcpOwotICAgICAgICBpZiAoZ2V0Q29udGVudCgpICE9IG51bGwpCi0gICAgICAgICAgICBnZXRDb250ZW50KCkuc2V0Rm9yZWdyb3VuZChmZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgY29udHJvbCBhbmQgaXRzIGNvbnRlbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJnCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IGJhY2tncm91bmQgY29sb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKENvbG9yIGJnKSB7Ci0gICAgICAgIHN1cGVyLnNldEJhY2tncm91bmQoYmcpOwotICAgICAgICBpZiAoZ2V0Q29udGVudCgpICE9IG51bGwpCi0gICAgICAgICAgICBnZXRDb250ZW50KCkuc2V0QmFja2dyb3VuZChiZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZm9udCBvZiB0aGUgZm9ybS4gVGhpcyBmb250IHdpbGwgYmUgdXNlZCB0byByZW5kZXIgdGhlIHRpdGxlCi0gICAgICogdGV4dC4gSXQgd2lsbCBub3QgYWZmZWN0IHRoZSBib2R5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBmb250KSB7Ci0gICAgICAgIHN1cGVyLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIGlmIChnZXRDb250ZW50KCkgIT0gbnVsbCkKLSAgICAgICAgICAgIGdldENvbnRlbnQoKS5zZXRGb250KGZvbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlcyAnc3VwZXInIHRvIHBhc3MgdGhlIHByb3BlciBjb2xvcnMgYW5kIGZvbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50KENvbnRyb2wgY29udGVudCkgewotICAgICAgICBzdXBlci5zZXRDb250ZW50KGNvbnRlbnQpOwotICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZW50LnNldEZvcmVncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsKLSAgICAgICAgICAgIGNvbnRlbnQuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICAgICAgY29udGVudC5zZXRGb250KGdldEZvbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiBjb250ZW50IGlzIHNldCwgdHJhbnNmZXJzIGZvY3VzIHRvIHRoZSBjb250ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldEZvY3VzKCkgewotICAgICAgICBpZiAoZ2V0Q29udGVudCgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udGVudCgpLnNldEZvY3VzKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5zZXRGb2N1cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY29tcHV0ZXMgdGhlIGJvZHkgbGF5b3V0IGFuZCB0aGUgc2Nyb2xsIGJhcnMuIFRoZSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQKLSAgICAgKiB3aGVuIGNoYW5nZXMgc29tZXdoZXJlIGluIHRoZSBmb3JtIGJvZHkgaW52YWxpZGF0ZSB0aGUgY3VycmVudCBsYXlvdXQKLSAgICAgKiBhbmQvb3Igc2Nyb2xsIGJhcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZsdXNoQ2FjaGUKLSAgICAgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBkcm9wIHRoZSBjYWNoZWQgZGF0YQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZmxvdyhib29sZWFuIGZsdXNoQ2FjaGUpIHsKLSAgICAgICAgQ29tcG9zaXRlIGMgPSAoQ29tcG9zaXRlKSBnZXRDb250ZW50KCk7Ci0gICAgICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICBpZiAoYyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFBvaW50IG5ld1NpemUgPSBjCi0gICAgICAgICAgICAgICAgLmNvbXB1dGVTaXplKGNsaWVudEFyZWEud2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKTsKLQotICAgICAgICBzZXRNaW5TaXplKG5ld1NpemUpOwotICAgICAgICB1cGRhdGVQYWdlSW5jcmVtZW50KCk7Ci0gICAgICAgIGxheW91dChmbHVzaENhY2hlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGFnZUluY3JlbWVudCgpIHsKLSAgICAgICAgU2Nyb2xsQmFyIHZiYXIgPSBnZXRWZXJ0aWNhbEJhcigpOwotICAgICAgICBpZiAodmJhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgIGludCBpbmNyZW1lbnQgPSBjbGllbnRBcmVhLmhlaWdodCAtIDU7Ci0gICAgICAgICAgICB2YmFyLnNldFBhZ2VJbmNyZW1lbnQoaW5jcmVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplU2Nyb2xsQmFycygpIHsKLSAgICAgICAgU2Nyb2xsQmFyIGhiYXIgPSBnZXRIb3Jpem9udGFsQmFyKCk7Ci0gICAgICAgIGlmIChoYmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGhiYXIuc2V0SW5jcmVtZW50KEhfU0NST0xMX0lOQ1JFTUVOVCk7Ci0gICAgICAgIH0KLSAgICAgICAgU2Nyb2xsQmFyIHZiYXIgPSBnZXRWZXJ0aWNhbEJhcigpOwotICAgICAgICBpZiAodmJhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2YmFyLnNldEluY3JlbWVudChWX1NDUk9MTF9JTkNSRU1FTlQpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBhZ2VJbmNyZW1lbnQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSUJyb3dzZXJEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSUJyb3dzZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNTdkYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0lCcm93c2VyRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdG8gYW4gZXh0ZXJuYWwgV2ViIGJyb3dzZXIuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogQHNlZSBJQnJvd3NlckRlc2NyaXB0b3JXb3JraW5nQ29weQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCcm93c2VyRGVzY3JpcHRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1BBUkFNRVRFUiA9ICIlVVJMJSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIG5hbWUgb2YgdGhlIFdlYiBicm93c2VyLgotCSAqICAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgV2ViIGJyb3dzZXIncyBleGVjdXRhYmxlLgotCSAqIFRoZSBsb2NhdGlvbiBpcyBwbGF0Zm9ybSBzcGVjaWZpYyBhbmQgbWF5IHJldHVybiBudWxsIGlmIG5vIGxvY2F0aW9uIGhhcyBiZWVuCi0JICogc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXJzIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gbGF1bmNoIHRoZSBXZWIgYnJvd3NlciBleGVjdXRhYmxlLgotCSAqICVVUkwlIGlzIHVzZWQgaWYgdGhlIFVSTCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgcGFyYW1ldGVycy4gSWYgdGhlcmUgYXJlCi0JICogbm8gcGFyYW1ldGVycywgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyYW1ldGVycwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVycygpOwotCi0JLyoqCi0JICogRGVsZXRlcyB0aGlzIFdlYiBicm93c2VyLiBUaGUgYnJvd3NlciB3aWxsIG5vIGxvbmdlciBiZSBhdmFpbGFibGUgdG8gdXNlcnMuCi0JICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiB0aGUgYnJvd3NlciBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgb3IgaGFzIG5ldmVyCi0JICogYmVlbiBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGJyb3dzZXIgaXMgYSB3b3JraW5nIGNvcHkuIEJyb3dzZXJzIHdoaWNoIHJldHVybgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IHRvIHRoaXMgbWV0aG9kIGNhbiBiZSBzYWZlbHkgY2FzdCB0byAKLQkgKiA8Y29kZT5vcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLklCcm93c2VyRGVzY3JpcHRvcldvcmtpbmdDb3B5PC9jb2RlPgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGJyb3dzZXIgaXMgYSB3b3JraW5nIGNvcHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd29ya2luZyBjb3B5IG9mIHRoaXMgYnJvd3Nlci4gQ2hhbmdlcyB0byB0aGUgd29ya2luZyBjb3B5IHdpbGwgYmUKLQkgKiBhcHBsaWVkIHRvIHRoaXMgYnJvd3NlciB3aGVuIHNhdmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSB3b3JraW5nIGNvcHkgb2YgdGhpcyBicm93c2VyCi0JICovCi0JcHVibGljIElCcm93c2VyRGVzY3JpcHRvcldvcmtpbmdDb3B5IGdldFdvcmtpbmdDb3B5KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0lCcm93c2VyRGVzY3JpcHRvcldvcmtpbmdDb3B5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSUJyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxZjk5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSUJyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLS8qKgotICogQSB3b3JraW5nIGNvcHkgb2YgYW4gZXh0ZXJuYWwgd2ViIGJyb3dzZXIuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLklXZWJCcm93c2VyCi0gKiBAc2VlIElCcm93c2VyRGVzY3JpcHRvcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCcm93c2VyRGVzY3JpcHRvcldvcmtpbmdDb3B5IGV4dGVuZHMgSUJyb3dzZXJEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZW5hbWVzIHRoaXMgYnJvd3NlciB0byB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoZSBuZXcgbmFtZSBjYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG5hbWUgdGhlIG5ldyBuYW1lIGZvciB0aGlzIGJyb3dzZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFNldCB0aGUgbG9jYXRpb24gb2YgdGhpcyBicm93c2VycyBleGVjdXRhYmxlLiBUaGUgbG9jYXRpb24gbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIHRoZSBuZXcgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pOwotCi0JLyoqCi0JICogU2V0IHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGJyb3dzZXIuIElmIHRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzLCB0aGUgcGFyYW1ldGVycwotCSAqIHNob3VsZCBiZSBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJhbXMgdGhlIG5ldyBwYXJhbWV0ZXJzCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhTdHJpbmcgcGFyYW1zKTsKLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjaGFuZ2VzIHRvIHRoaXMgd29ya2luZyBjb3B5IGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgd2ViIGJyb3dzZXIuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBtb2RpZmllZCBvciBjcmVhdGVkIGJyb3dzZXIKLQkgKi8KLQlwdWJsaWMgSUJyb3dzZXJEZXNjcmlwdG9yIHNhdmUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSUJyb3dzZXJFeHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9JQnJvd3NlckV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjQ1NmQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9JQnJvd3NlckV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV2ViQnJvd3NlcjsKLQotLyoqCi0gKiBBIAotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQnJvd3NlckV4dCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBjbGllbnQuIEVhY2gga25vd24gY2xpZW50IGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgY2xpZW50IGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBjbGllbnQuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgbmFtZSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIGNsaWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBicm93c2VyLgotCSAqCi0JICogQHJldHVybiB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBicm93c2VyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBicm93c2VyJ3MgZXhlY3V0YWJsZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGJyb3dzZXIncyBleGVjdXRhYmxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeGVjdXRhYmxlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgT1NzIHRoYXQgdGhpcyBicm93c2VyIGlzIGF2YWlsYWJsZSBvbi4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgT1NzIHRoYXQgdGhpcyBicm93c2VyIHJ1bnMgb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9TKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBpbnN0YWxsIGxvY2F0aW9ucyBvZiB0aGlzIGJyb3dzZXIuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGluc3RhbGwgbG9jYXRpb25zIG9mIHRoaXMgYnJvd3NlcgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXREZWZhdWx0TG9jYXRpb25zKCk7Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZhY3RvcnkgY2FuIHdvcmsgb24gdGhlIHVzZXIgc3lzdGVtLgotCSAqIAotCSAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIGZhY3RvcnkgY2Fubm90IHdvcmsgb24gdGhpcyBzeXN0ZW07IGZvciBleGFtcGxlIHRoZQotCSAqICAgIHJlcXVpcmVkIG5hdGl2ZSBicm93c2VyIHJlcXVpcmVkIGJ5IGJyb3dzZXIgYWRhcHRlcnMgdGhhdCBpdAotCSAqICAgIGNyZWF0ZXMgaXMgbm90IGluc3RhbGxlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKCk7Ci0KLQkvKioKLQkgKiBPYnRhaW5zIGEgbmV3IGluc3RhbmNlIG9mIGEgd2ViIGJyb3dzZXIuCi0JICogCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiBJQnJvd3NlcgotCSAqLwotCXB1YmxpYyBJV2ViQnJvd3NlciBjcmVhdGVCcm93c2VyKFN0cmluZyBpZCwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgcGFyYW1ldGVycyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0lCcm93c2VyVmlld2VyQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSUJyb3dzZXJWaWV3ZXJDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4NGZmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSUJyb3dzZXJWaWV3ZXJDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElCcm93c2VyVmlld2VyQ29udGFpbmVyIHsKLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhlIGNvbnRhaW5lciBmcm9tIHRoZSBpbnNpZGUuCi0gICAgICogQHJldHVybiAKLSAgICAgKi8KLSAgICBib29sZWFuIGNsb3NlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9uIGJhcnMgb2YgdGhlIGNvbnRhaW5lci4KLSAgICAgKiBAcmV0dXJuIGFjdGlvbiBiYXJzIG9mIHRoZSBjb250YWluZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAgKiBub3QgYXZhaWxhYmxlLgotICAgICAqLwotICAgIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKTsKLSAgICAvKioKLSAgICAgKiBPcGVucyB0aGUgdXJsIGluIHRoZSBleHRlcm5hbCBicm93c2VyIGlmCi0gICAgICogaW50ZXJuYWwgYnJvd3NlciBmYWlsZWQgdG8gY3JlYXRlLgotICAgICAqIEBwYXJhbSB1cmwKLSAgICAgKi8KLSAgICB2b2lkIG9wZW5JbkV4dGVybmFsQnJvd3NlcihTdHJpbmcgdXJsKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSW1hZ2VSZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0ltYWdlUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjMWVmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSW1hZ2VSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gaGFuZGxlIGltYWdlIHJlc291cmNlcy4KLSAqLwotcHVibGljIGNsYXNzIEltYWdlUmVzb3VyY2UgewotCS8vIHRoZSBpbWFnZSByZWdpc3RyeQotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeTsKLQotCS8vIG1hcCBvZiBpbWFnZSBkZXNjcmlwdG9ycyBzaW5jZSB0aGVzZQotCS8vIHdpbGwgYmUgbG9zdCBieSB0aGUgaW1hZ2UgcmVnaXN0cnkKLQlwcml2YXRlIHN0YXRpYyBNYXAgaW1hZ2VEZXNjcmlwdG9yczsKLQotCS8vIGJhc2UgdXJscyBmb3IgaW1hZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIElDT05fQkFTRV9VUkw7Ci0KLQlzdGF0aWMgewotCQl0cnkgewotCQkJU3RyaW5nIHBhdGhTdWZmaXggPSAiaWNvbnMvIjsgLy8kTk9OLU5MUy0xJAotCQkJSUNPTl9CQVNFX1VSTCA9IFBsYXRmb3JtLmZpbmQoV2ViQnJvd3NlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCksIG5ldyBQYXRoKHBhdGhTdWZmaXgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzZXQgaWNvbiBiYXNlIFVSTCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVtdIGJ1c3lJbWFnZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0NMQ0wgPSAiY2xjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VMQ0wgPSAiZWxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0RMQ0wgPSAiZGxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfT0JKID0gIm9iajE2LyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIC0tLSBjb25zdGFudHMgZm9yIGltYWdlcyAtLS0KLQkvLyB0b29sYmFyIGltYWdlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX05BVl9CQUNLV0FSRCA9ICJJTUdfQ0xDTF9OQVZfQkFDS1dBUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfTkFWX0ZPUldBUkQgPSAiSU1HX0NMQ0xfTkFWX0ZPUldBUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfTkFWX1NUT1AgPSAiSU1HX0NMQ0xfTkFWX1NUT1AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfTkFWX1JFRlJFU0ggPSAiSU1HX0NMQ0xfTkFWX1JFRlJFU0giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfTkFWX0dPID0gIklNR19DTENMX05BVl9HTyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9OQVZfSE9NRSA9ICJJTUdfQ0xDTF9OQVZfSE9NRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9OQVZfUFJJTlQgPSAiSU1HX0NMQ0xfTkFWX1BSSU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfTkFWX0JBQ0tXQVJEID0gIklNR19FTENMX05BVl9CQUNLV0FSRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9OQVZfRk9SV0FSRCA9ICJJTUdfRUxDTF9OQVZfRk9SV0FSRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9OQVZfU1RPUCA9ICJJTUdfRUxDTF9OQVZfU1RPUCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9OQVZfUkVGUkVTSCA9ICJJTUdfRUxDTF9OQVZfUkVGUkVTSCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9OQVZfR08gPSAiSU1HX0VMQ0xfTkFWX0dPIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX05BVl9IT01FID0gIklNR19FTENMX05BVl9IT01FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX05BVl9QUklOVCA9ICJJTUdfRUxDTF9OQVZfUFJJTlQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9OQVZfQkFDS1dBUkQgPSAiSU1HX0RMQ0xfTkFWX0JBQ0tXQVJEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX05BVl9GT1JXQVJEID0gIklNR19ETENMX05BVl9GT1JXQVJEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX05BVl9TVE9QID0gIklNR19ETENMX05BVl9TVE9QIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX05BVl9SRUZSRVNIID0gIklNR19ETENMX05BVl9SRUZSRVNIIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX05BVl9HTyA9ICJJTUdfRExDTF9OQVZfR08iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfTkFWX0hPTUUgPSAiSU1HX0RMQ0xfTkFWX0hPTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfTkFWX1BSSU5UID0gIklNR19ETENMX05BVl9QUklOVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGdlbmVyYWwgb2JqZWN0IGltYWdlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19JTlRFUk5BTF9CUk9XU0VSID0gImludGVybmFsQnJvd3NlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVhURVJOQUxfQlJPV1NFUiA9ICJleHRlcm5hbEJyb3dzZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NZU1RFTV9CUk9XU0VSID0gInN5c3RlbUJyb3dzZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDYW5ub3QgY29uc3RydWN0IGFuIEltYWdlUmVzb3VyY2UuIFVzZSBzdGF0aWMgbWV0aG9kcyBvbmx5LgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZXNvdXJjZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJ1c3kgaW1hZ2VzIGZvciB0aGUgV2ViIGJyb3dzZXIuCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZVtdCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZVtdIGdldEJ1c3lJbWFnZXMoKSB7Ci0JCXJldHVybiBidXN5SW1hZ2VzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpCi0JCQlpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpOwotCQlyZXR1cm4gKEltYWdlRGVzY3JpcHRvcikgaW1hZ2VEZXNjcmlwdG9ycy5nZXQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBpbWFnZSByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCkgewotCQlpbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsKLQkJaW1hZ2VEZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JCS8vIGxvYWQgV2ViIGJyb3dzZXIgaW1hZ2VzCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VMQ0xfTkFWX0JBQ0tXQVJELCBVUkxfRUxDTCArICJuYXZfYmFja3dhcmQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRUxDTF9OQVZfRk9SV0FSRCwgVVJMX0VMQ0wgKyAibmF2X2ZvcndhcmQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRUxDTF9OQVZfU1RPUCwgVVJMX0VMQ0wgKyAibmF2X3N0b3AuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRUxDTF9OQVZfUkVGUkVTSCwgVVJMX0VMQ0wgKyAibmF2X3JlZnJlc2guZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRUxDTF9OQVZfR08sIFVSTF9FTENMICsgIm5hdl9nby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3RlckltYWdlKElNR19FTENMX05BVl9IT01FLCBVUkxfRUxDTCArICJuYXZfaG9tZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3RlckltYWdlKElNR19FTENMX05BVl9QUklOVCwgVVJMX0VMQ0wgKyAibmF2X3ByaW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfTkFWX0JBQ0tXQVJELCBVUkxfQ0xDTCArICJuYXZfYmFja3dhcmQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9OQVZfRk9SV0FSRCwgVVJMX0NMQ0wgKyAibmF2X2ZvcndhcmQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9OQVZfU1RPUCwgVVJMX0NMQ0wgKyAibmF2X3N0b3AuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9OQVZfUkVGUkVTSCwgVVJMX0NMQ0wgKyAibmF2X3JlZnJlc2guZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9OQVZfR08sIFVSTF9DTENMICsgIm5hdl9nby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3RlckltYWdlKElNR19DTENMX05BVl9IT01FLCBVUkxfQ0xDTCArICJuYXZfaG9tZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3RlckltYWdlKElNR19DTENMX05BVl9QUklOVCwgVVJMX0NMQ0wgKyAibmF2X3ByaW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0RMQ0xfTkFWX0JBQ0tXQVJELCBVUkxfRExDTCArICJuYXZfYmFja3dhcmQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9OQVZfRk9SV0FSRCwgVVJMX0RMQ0wgKyAibmF2X2ZvcndhcmQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9OQVZfU1RPUCwgVVJMX0RMQ0wgKyAibmF2X3N0b3AuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9OQVZfUkVGUkVTSCwgVVJMX0RMQ0wgKyAibmF2X3JlZnJlc2guZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9OQVZfR08sIFVSTF9ETENMICsgIm5hdl9nby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3RlckltYWdlKElNR19ETENMX05BVl9IT01FLCBVUkxfRExDTCArICJuYXZfaG9tZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3RlckltYWdlKElNR19ETENMX05BVl9QUklOVCwgVVJMX0RMQ0wgKyAibmF2X3ByaW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0lOVEVSTkFMX0JST1dTRVIsIFVSTF9PQkogKyAiaW50ZXJuYWxfYnJvd3Nlci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3RlckltYWdlKElNR19FWFRFUk5BTF9CUk9XU0VSLCBVUkxfT0JKICsgImV4dGVybmFsX2Jyb3dzZXIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIGJ1c3kgaW1hZ2VzCi0JCWJ1c3lJbWFnZXMgPSBuZXcgSW1hZ2VbMTNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEzOyBpKyspIHsKLQkJCXJlZ2lzdGVySW1hZ2UoImJ1c3kiICsgaSwgVVJMX09CSiArICJidXN5LyIgKyAoaSsxKSArICIuZ2lmIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlidXN5SW1hZ2VzW2ldID0gZ2V0SW1hZ2UoImJ1c3kiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGFuIGltYWdlIHdpdGggdGhlIHJlZ2lzdHJ5LgotCSAqCi0JICogQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhcnRpYWxVUkwgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVnaXN0ZXJJbWFnZShTdHJpbmcga2V5LCBTdHJpbmcgcGFydGlhbFVSTCkgewotCQl0cnkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobmV3IFVSTChJQ09OX0JBU0VfVVJMLCBwYXJ0aWFsVVJMKSk7Ci0JCQlpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGlkKTsKLQkJCWltYWdlRGVzY3JpcHRvcnMucHV0KGtleSwgaWQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIHJlZ2lzdGVyaW5nIGltYWdlICIgKyBrZXkgKyAiIGZyb20gIiArIHBhcnRpYWxVUkwsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSW50ZXJuYWxCcm93c2VyRWRpdG9ySW5zdGFuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9JbnRlcm5hbEJyb3dzZXJFZGl0b3JJbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTcxMDVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9JbnRlcm5hbEJyb3dzZXJFZGl0b3JJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgYSBydW5uaW5nIFdlYiBicm93c2VyLgotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxCcm93c2VyRWRpdG9ySW5zdGFuY2UgZXh0ZW5kcyBJbnRlcm5hbEJyb3dzZXJJbnN0YW5jZSB7Ci0KLQlwdWJsaWMgSW50ZXJuYWxCcm93c2VyRWRpdG9ySW5zdGFuY2UoU3RyaW5nIGlkLCBpbnQgc3R5bGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgdG9vbHRpcCkgewotCQlzdXBlcihpZCwgc3R5bGUsIG5hbWUsIHRvb2x0aXApOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW5VUkwoVVJMIHVybCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJV2ViQnJvd3NlckVkaXRvcklucHV0IGlucHV0ID0gbmV3IFdlYkJyb3dzZXJFZGl0b3JJbnB1dCh1cmwsIHN0eWxlKTsKLQkJaW5wdXQuc2V0TmFtZSh0aGlzLm5hbWUpOwotCQlpbnB1dC5zZXRUb29sVGlwVGV4dCh0aGlzLnRvb2x0aXApOwotCQlXZWJCcm93c2VyRWRpdG9yIGVkaXRvciA9IChXZWJCcm93c2VyRWRpdG9yKXBhcnQ7Ci0JCQotCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFdlYkJyb3dzZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gbnVsbDsKLQkJaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotCQkJcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQotCQlpZiAocGFnZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMYXVuY2hJbnRlcm5hbFdlYkJyb3dzZXIpOwotCQkKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuaW5pdChlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLCBpbnB1dCk7Ci0JCQlwYWdlLmFjdGl2YXRlKGVkaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBwYWdlLm9wZW5FZGl0b3IoaW5wdXQsIFdlYkJyb3dzZXJFZGl0b3IuV0VCX0JST1dTRVJfRURJVE9SX0lEKTsKLQkJCQlob29rUGFydChwYWdlLCBlZGl0b3JQYXJ0KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igb3BlbmluZyBXZWIgYnJvd3NlciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKFdlYkJyb3dzZXJFZGl0b3IpcGFydCkuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSW50ZXJuYWxCcm93c2VySW5zdGFuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9JbnRlcm5hbEJyb3dzZXJJbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVkNjIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9JbnRlcm5hbEJyb3dzZXJJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuQWJzdHJhY3RXZWJCcm93c2VyOwotCi0vKioKLSAqIEFuIGluc3RhbmNlIG9mIGEgcnVubmluZyBXZWIgYnJvd3Nlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEludGVybmFsQnJvd3Nlckluc3RhbmNlIGV4dGVuZHMgQWJzdHJhY3RXZWJCcm93c2VyIHsKLQlwcm90ZWN0ZWQgaW50IHN0eWxlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyB0b29sdGlwOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0KLQlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBsaXN0ZW5lcjsKLQkKLQlwcml2YXRlIEludGVnZXIgd2luZG93S2V5OwotCi0JcHVibGljIEludGVybmFsQnJvd3Nlckluc3RhbmNlKFN0cmluZyBpZCwgaW50IHN0eWxlLCBTdHJpbmcgbmFtZSwKLQkJCVN0cmluZyB0b29sdGlwKSB7Ci0JCXN1cGVyKFdlYkJyb3dzZXJVdGlsLmVuY29kZVN0eWxlKGlkLCBzdHlsZSkpOwotCQl0aGlzLnN0eWxlID0gc3R5bGU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudG9vbHRpcCA9IHRvb2x0aXA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRvb2x0aXAoU3RyaW5nIHRvb2x0aXApIHsKLQkJdGhpcy50b29sdGlwID0gdG9vbHRpcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBob29rUGFydChmaW5hbCBJV29ya2JlbmNoUGFnZSBwYWdlLCBJV29ya2JlbmNoUGFydCBwYXJ0MikgewotCQl0aGlzLnBhcnQgPSBwYXJ0MjsKLQkJbGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydDMpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0MykgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQzKSB7Ci0JCQkJaWYgKHBhcnQuZXF1YWxzKEludGVybmFsQnJvd3Nlckluc3RhbmNlLnRoaXMucGFydCkpIHsKLQkJCQkJSW50ZXJuYWxCcm93c2VySW5zdGFuY2UudGhpcy5wYXJ0ID0gbnVsbDsKLQkJCQkJcGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIobGlzdGVuZXIpOwotCQkJCQlEZWZhdWx0QnJvd3NlclN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5yZW1vdmVCcm93c2VyKAotCQkJCQkJCUludGVybmFsQnJvd3Nlckluc3RhbmNlLnRoaXMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQzKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydDMpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfTsKLQkJcGFnZS5hZGRQYXJ0TGlzdGVuZXIobGlzdGVuZXIpOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IHBhcnQuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCQl3aW5kb3dLZXkgPSBuZXcgSW50ZWdlcih3aW5kb3cuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0V2luZG93S2V5KCkgewotCQlyZXR1cm4gd2luZG93S2V5OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSW50ZXJuYWxCcm93c2VyVmlld0luc3RhbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvSW50ZXJuYWxCcm93c2VyVmlld0luc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZDlmOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL0ludGVybmFsQnJvd3NlclZpZXdJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgYSBydW5uaW5nIFdlYiBicm93c2VyLgotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxCcm93c2VyVmlld0luc3RhbmNlIGV4dGVuZHMgSW50ZXJuYWxCcm93c2VySW5zdGFuY2UgewotCXB1YmxpYyBJbnRlcm5hbEJyb3dzZXJWaWV3SW5zdGFuY2UoU3RyaW5nIGlkLCBpbnQgc3R5bGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgdG9vbHRpcCkgewotCQlzdXBlcihXZWJCcm93c2VyVXRpbC5lbmNvZGVTdHlsZShpZCwgc3R5bGUpLCBzdHlsZSwgbmFtZSwgdG9vbHRpcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlblVSTChVUkwgdXJsKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFdlYkJyb3dzZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICBmaW5hbCBJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgV2ViQnJvd3NlclZpZXcgdmlldyA9IChXZWJCcm93c2VyVmlldylwYXJ0OwotCQlpZiAodmlldyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotCQkJCXZpZXcgPSAoV2ViQnJvd3NlclZpZXcpcGFnZS5zaG93VmlldyhXZWJCcm93c2VyVmlldy5XRUJfQlJPV1NFUl9WSUVXX0lELCBnZXRJZCgpLCBJV29ya2JlbmNoUGFnZS5WSUVXX0NSRUFURSk7Ci0gICAgICAgICAgICAgICAgaG9va1BhcnQocGFnZSwgdmlldyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG9wZW5pbmcgV2ViIGJyb3dzZXIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0gICAgICAgIGlmICh2aWV3IT1udWxsKSB7Ci0gICAgICAgICAgICBwYWdlLmJyaW5nVG9Ub3Aodmlldyk7Ci0gICAgICAgICAgICB2aWV3LnNldFVSTCh1cmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgIH0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLSAgICAgICAgcmV0dXJuICgoV2ViQnJvd3NlclZpZXcpcGFydCkuY2xvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxODY4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcm93c2VyVGV4dF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcm93c2VyVGV4dF9saW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyb3dzZXJUZXh0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJvd3NlclRleHRfZHRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyb3dzZXJUZXh0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJvd3NlclRleHRfYnV0dG9uX2NvbGxhcHNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyb3dzZXJUZXh0X2J1dHRvbl9leHBhbmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90TGF1bmNoSW50ZXJuYWxXZWJCcm93c2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbldlYkJyb3dzZXJHbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3V2ViQnJvd3NlclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbldlYkJyb3dzZXJCYWNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbldlYkJyb3dzZXJGb3J3YXJkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbldlYkJyb3dzZXJTdG9wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbldlYkJyb3dzZXJSZWZyZXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1Jlc291cmNlRGVsZXRlZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1Jlc291cmNlRGVsZXRlZE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUmVzb3VyY2VEZWxldGVkSWdub3JlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW52YWxpZEVkaXRvcklucHV0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VXZWJCcm93c2VyRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkludGVybmFsQnJvd3NlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmRXh0ZXJuYWxCcm93c2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZTeXN0ZW1Ccm93c2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZXJMaXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGlyZWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpcmVjdG9yeURpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaGluZ1Rhc2tOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaGluZ05vbmVGb3VuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlV2ViQnJvd3NlclRpdGxlTG9uZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90TGF1bmNoV2ViQnJvd3NlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vQnJvd3NlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0RXh0ZXJuYWxCcm93c2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUJyb3dzZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJhbWV0ZXJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcmFtZXRlcnNNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvY2F0aW9uSW52YWxpZDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTcwYmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotQnJvd3NlclRleHRfdGl0bGU9RW1iZWRkZWQgYnJvd3NlciBub3QgYXZhaWxhYmxlCi1Ccm93c2VyVGV4dF9saW5rPTxhIGhyZWY9Im9wZW4iPk9wZW4gZmlsZSB1c2luZyB0aGUgc3lzdGVtIGVkaXRvcjwvYT4KLUJyb3dzZXJUZXh0X3Rvb2x0aXA9T3BlbiBFeHRlcm5hbCBFZGl0b3IKLUJyb3dzZXJUZXh0X2R0aXRsZT1Qcm9ibGVtIERldGFpbHMKLUJyb3dzZXJUZXh0X3RleHQ9VGhlIGVtYmVkZGVkIGJyb3dzZXIgd2lkZ2V0IGZvciB0aGlzIGVkaXRvciBjYW5ub3QgYmUgY3JlYXRlZC4gSXQgaXMgZWl0aGVyIG5vdCBhdmFpbGFibGUgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBvciB0aGUgc3lzdGVtIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCBlbWJlZGRlZCBicm93c2VyLgotQnJvd3NlclRleHRfYnV0dG9uX2NvbGxhcHNlPURldGFpbHM8PAotQnJvd3NlclRleHRfYnV0dG9uX2V4cGFuZD1EZXRhaWxzPj4KLQotIyAtLS0gSW50ZXJuYWwgV2ViIEJyb3dzZXIgLS0tCi12aWV3V2ViQnJvd3NlclRpdGxlPVdlYiBCcm93c2VyCi0KLSMgQWN0aW9ucwotYWN0aW9uV2ViQnJvd3NlckdvPUdvIHRvIHRoZSBzZWxlY3RlZCBVUkwKLWFjdGlvbldlYkJyb3dzZXJCYWNrPUJhY2sgdG8gdGhlIHByZXZpb3VzIHBhZ2UKLWFjdGlvbldlYkJyb3dzZXJGb3J3YXJkPUZvcndhcmQgdG8gdGhlIG5leHQgcGFnZQotYWN0aW9uV2ViQnJvd3NlclN0b3A9U3RvcCBsb2FkaW5nIHRoZSBjdXJyZW50IHBhZ2UKLWFjdGlvbldlYkJyb3dzZXJSZWZyZXNoPVJlZnJlc2ggdGhlIGN1cnJlbnQgcGFnZQotCi0jIG1lc3NhZ2UgaWYgYSByZXNvdXJjZSBpcyBkZWxldGVkCi1kaWFsb2dSZXNvdXJjZURlbGV0ZWRUaXRsZT1XZWIgUmVzb3VyY2UgRGVsZXRlZAotZGlhbG9nUmVzb3VyY2VEZWxldGVkTWVzc2FnZT1UaGUgZmlsZSB7MH0gaW5pdGlhbGx5IG9wZW5lZCBpbiB0aGUgV2ViIEJyb3dzZXIgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBmaWxlIHN5c3RlbS4gRG8geW91IHdhbnQgdG8gaWdub3JlIHRoZSBkZWxldGlvbiBvciBjbG9zZSB0aGUgV2ViIEJyb3dzZXI/Ci1kaWFsb2dSZXNvdXJjZURlbGV0ZWRJZ25vcmU9SWdub3JlCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFByZWZlcmVuY2VzIC0tLS0tLS0tLS0tLS0tLQotCi0jIE5hbWUgb2YgdGhlIHByZWZlcmVuY2UgcGFnZXMKLXByZWZlcmVuY2VXZWJCcm93c2VyVGl0bGVMb25nPVdlYiBCcm93c2VycwotcHJlZmVyZW5jZVdlYkJyb3dzZXJEZXNjcmlwdGlvbj1BZGQsIHJlbW92ZSwgb3IgZWRpdCBpbnN0YWxsZWQgV2ViIGJyb3dzZXJzLlxuVGhlIHNlbGVjdGVkIFdlYiBicm93c2VyIHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0IHdoZW4gV2ViIHBhZ2VzIGFyZSBvcGVuZWQsXG5hbHRob3VnaCBzb21lIGFwcGxpY2F0aW9ucyBtYXkgYWx3YXlzIHVzZSB0aGUgZXh0ZXJuYWwgYnJvd3Nlci4KLQotIyBXZWIgQnJvd3NlciBwcmVmZXJlbmNlcwotcHJlZkludGVybmFsQnJvd3Nlcj1Vc2UgJmludGVybmFsIFdlYiBicm93c2VyCi1wcmVmU3lzdGVtQnJvd3Nlcj1EZWZhdWx0IHN5c3RlbSBXZWIgYnJvd3NlcgotcHJlZkV4dGVybmFsQnJvd3Nlcj1Vc2UgZSZ4dGVybmFsIFdlYiBicm93c2VyCi0KLWVycm9yRGlhbG9nVGl0bGU9RXJyb3IKLWVycm9yQ291bGROb3RMYXVuY2hXZWJCcm93c2VyPUNvdWxkIG5vdCBsYXVuY2ggZXh0ZXJuYWwgV2ViIEJyb3dzZXIgZm9yIHswfS4gQ2hlY2sgdGhlIFdlYiBCcm93c2VyIHByZWZlcmVuY2VzLgotZXJyb3JOb0Jyb3dzZXI9Q291bGQgbm90IG9wZW4gYSBXZWIgYnJvd3NlciBiZWNhdXNlIHRoZXJlIGFyZSBub25lIGNvbmZpZ3VyZWQuIENoZWNrIHRoZSBXZWIgQnJvd3NlciBwcmVmZXJlbmNlcy4KLWVycm9ySW52YWxpZEVkaXRvcklucHV0PUNvdWxkIG5vdCBvcGVuIFdlYiBicm93c2VyIG9uIHswfS4gRW5zdXJlIHRoYXQgaXQgaXMgYW4gdW5jb21wcmVzc2VkIGZpbGUuCi0KLWJyb3dzZXJMaXN0PUV4dGVybmFsICZXZWIgYnJvd3NlcnM6Ci1hZGQ9Jk5ldy4uLgotZWRpdD0mRWRpdC4uLgotcmVtb3ZlPSZSZW1vdmUKLXNlYXJjaD0mU2VhcmNoLi4uCi1jcmVhdGVCcm93c2VyPUFkZCBFeHRlcm5hbCBXZWIgQnJvd3NlcgotZWRpdEV4dGVybmFsQnJvd3Nlcj1FZGl0IEV4dGVybmFsIFdlYiBCcm93c2VyCi1uYW1lPSZOYW1lOgotbG9jYXRpb249JkxvY2F0aW9uOgotcGFyYW1ldGVycz0mUGFyYW1ldGVyczoKLXBhcmFtZXRlcnNNZXNzYWdlPUV4YW1wbGU6IC11cmwgezB9XG4oVXNlIHswfSB0byBpbmNsdWRlIHRoZSBVUkwpCi1icm93c2U9JkJyb3dzZS4uLgotYnJvd3NlTWVzc2FnZT1TcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgV2ViIEJyb3dzZXIgZXhlY3V0YWJsZQotZXJyb3JDb3VsZE5vdExhdW5jaEludGVybmFsV2ViQnJvd3Nlcj1Db3VsZCBub3QgbGF1bmNoIGludGVybmFsIFdlYiBCcm93c2VyLiBQbGVhc2Ugc2V0IGFuIGV4dGVybmFsIGJyb3dzZXIgaW4gdGhlIEJyb3dzZXIgcHJlZmVyZW5jZXMuCi1zZWFyY2hpbmdUYXNrTmFtZT1TZWFyY2hpbmcgZm9yIFdlYiBicm93c2Vycy4uLgotc2VhcmNoaW5nPUZvdW5kIHswfSAtIFNlYXJjaGluZyB7MX0KLXNlYXJjaGluZ05vbmVGb3VuZD1ObyBXZWIgYnJvd3NlcnMgd2VyZSBmb3VuZC4KLXNlbGVjdERpcmVjdG9yeT1TZWxlY3QgYSBkaXJlY3RvcnkgdG8gc2VhcmNoIGZvciBXZWIgYnJvd3NlcnM6Ci1kaXJlY3RvcnlEaWFsb2dUaXRsZT1EaXJlY3RvcnkgU2VsZWN0aW9uCi1sb2NhdGlvbkludmFsaWQ9VGhlIGxvY2F0aW9uIHZhbHVlIGlzIG5vdCBhIHZhbGlkIHBhdGggbmFtZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9PcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmIxZDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9PcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci0vKioKLSAqIEFjdGlvbiB0byBvcGVuIHRoZSBXZWIgYnJvc3dlci4KLSAqLwotcHVibGljIGNsYXNzIE9wZW5Ccm93c2VyV29ya2JlbmNoQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQkvKioKLQkgKiBPcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZS4gIFRoZSBpbXBsZW1lbnRvciBzaG91bGQgdW5ob29rIGFueSByZWZlcmVuY2VzCi0JICogdG8gaXRzZWxmIHNvIHRoYXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGNhbiBvY2N1ci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUgd2l0aCB0aGUgd29ya2JlbmNoIHdpbmRvdyBpdCB3aWxsIHdvcmsgaW4uCi0JICoKLQkgKiBAcGFyYW0gd2luZG93IHRoZSB3aW5kb3cgdGhhdCBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhpcyBkZWxlZ2F0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoaXMgYWN0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBkZWxlZ2F0aW5nIGFjdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQuCi0JICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGRvIHRoZSBhY3R1YWwgd29yay4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gcHJveHkgdGhhdCBoYW5kbGVzIHRoZSBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUKLQkgKiAgIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IGJyb3dzZXJTdXBwb3J0ID0gV2ViQnJvd3NlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKTsKLQkJCUlXZWJCcm93c2VyIGJyb3dzZXIgPSBicm93c2VyU3VwcG9ydC5jcmVhdGVCcm93c2VyKElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5MT0NBVElPTl9CQVIgfCBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTkFWSUdBVElPTl9CQVIsIG51bGwsIG51bGwsIG51bGwpOwotCQkJYnJvd3Nlci5vcGVuVVJMKG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igb3BlbmluZyBicm93c2VyIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgYWN0aW9uIGRlbGVnYXRlIHRoYXQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqIEltcGxlbWVudGVycyBjYW4gdXNlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gY2hhbmdlIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlCi0JICogYWN0aW9uIG9yIHRvIG1vZGlmeSBvdGhlciBwcmVzZW50YXRpb24gcHJvcGVydGllcy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gcHJveHkgdGhhdCBoYW5kbGVzIHByZXNlbnRhdGlvbiBwb3J0aW9uIG9mIHRoZSBhY3Rpb24KLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvU1dUVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL1NXVFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRlNzg2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvU1dUVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLS8qKgotICogU1dUIFV0aWxpdHkgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBGb250TWV0cmljcyBmb250TWV0cmljczsKLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCB0ZXN0Q29udHJvbCkgewotCQkvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0JCUdDIGdjID0gbmV3IEdDKHRlc3RDb250cm9sKTsKLQkJZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlpbnQgd2lkdGhIaW50ID0gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCXJldHVybiBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBidXR0b24gd2l0aCB0aGUgc3RhbmRhcmQgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcCBhIGNvbXBvbmVudCB0byBhZGQgdGhlIGJ1dHRvbiB0bwotCSAqIEBwYXJhbSBsYWJlbCB0aGUgYnV0dG9uIGxhYmVsCi0JICogQHJldHVybiBhIGJ1dHRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29tcCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dChsYWJlbCk7Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXApOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGIpOwotCQliLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBiOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgc3RhbmRhcmQgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGNvbXAgYSBjb21wb25lbnQgdG8gYWRkIHRoZSBsYWJlbCB0bwotCSAqIEBwYXJhbSB0ZXh0IHRoZSBsYWJlbCB0ZXh0Ci0JICogQHJldHVybiBhIGxhYmVsCi0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29tcCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9TeXN0ZW1Ccm93c2VyRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL1N5c3RlbUJyb3dzZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTk2MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL1N5c3RlbUJyb3dzZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0KLXB1YmxpYyBjbGFzcyBTeXN0ZW1Ccm93c2VyRGVzY3JpcHRvciBpbXBsZW1lbnRzIElCcm93c2VyRGVzY3JpcHRvciB7Ci0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTWVzc2FnZXMucHJlZlN5c3RlbUJyb3dzZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSUJyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkgZ2V0V29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgU3lzdGVtQnJvd3NlckRlc2NyaXB0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9TeXN0ZW1Ccm93c2VySW5zdGFuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9TeXN0ZW1Ccm93c2VySW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhY2RkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvU3lzdGVtQnJvd3Nlckluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5BYnN0cmFjdFdlYkJyb3dzZXI7Ci0KLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgYSBydW5uaW5nIHN5c3RlbSBXZWIgYnJvd3Nlci4KLSAqLwotcHVibGljIGNsYXNzIFN5c3RlbUJyb3dzZXJJbnN0YW5jZSBleHRlbmRzIEFic3RyYWN0V2ViQnJvd3NlciB7Ci0JcHVibGljIFN5c3RlbUJyb3dzZXJJbnN0YW5jZShTdHJpbmcgaWQpIHsKLQkJc3VwZXIoaWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW5VUkwoVVJMIHVybCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVybFRleHQgPSBudWxsOwotCi0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCXVybFRleHQgPSB1cmwudG9FeHRlcm5hbEZvcm0oKTsKLQotCQkvLyBjaGFuZ2Ugc3BhY2VzIHRvICIlMjAiCi0JCWlmICh1cmxUZXh0ICE9IG51bGwgJiYgIVdlYkJyb3dzZXJVdGlsLmlzV2luZG93cygpKSB7Ci0JCQlpbnQgaW5kZXggPSB1cmxUZXh0LmluZGV4T2YoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKGluZGV4ID49IDApIHsKLQkJCQl1cmxUZXh0ID0gdXJsVGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIiUyMCIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyB1cmxUZXh0LnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCWluZGV4ID0gdXJsVGV4dC5pbmRleE9mKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMYXVuY2hpbmcgc3lzdGVtIFdlYiBicm93c2VyOiAiICsgdXJsVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJUHJvZ3JhbSBwcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbSgiaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwcm9ncmFtICE9IG51bGwpIHsKLQkJCWlmIChwcm9ncmFtLmV4ZWN1dGUodXJsVGV4dCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghUHJvZ3JhbS5sYXVuY2godXJsVGV4dCkpCi0JCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExhdW5jaFdlYkJyb3dzZXIsIHVybC50b0V4dGVybmFsRm9ybSgpKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9UZXh0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvVGV4dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzM3NGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9UZXh0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci0vKioKLSAqIFRleHQgYWN0aW9ucyAoY3V0LCBjb3B5LCBwYXN0ZSkgZm9yIHRoZSBXZWIgYnJvd3Nlci4KLSAqLwotcHVibGljIGNsYXNzIFRleHRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBCcm93c2VyVmlld2VyIGJyb3dzZXI7Ci0JcHJvdGVjdGVkIGJ5dGUgdHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDVVQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT1BZID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUEFTVEUgPSAyOwotCQotCS8qKgotCSAqIFRleHRBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dEFjdGlvbihCcm93c2VyVmlld2VyIGJyb3dzZXIsIGJ5dGUgdHlwZSkgewotCQlzdXBlcih0eXBlICsgIiEiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmJyb3dzZXIgPSBicm93c2VyOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQkKLQkvKioKLQkgKiBDb3BpZXMgdGhlIHNlbGVjdGVkIHRleHQgdG8gdGhlIGNsaXBib2FyZC4gIFRoZSB0ZXh0IHdpbGwgYmUgcHV0IGluIHRoZSAKLQkgKiBjbGlwYm9hcmQgaW4gcGxhaW4gdGV4dCBmb3JtYXQuCi0JICogPHA+Ci0JICoKLQkgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0JICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0JICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHZvaWQgY29weSgpIHsKLQkJUG9pbnQgc2VsZWN0aW9uID0gYnJvd3Nlci5jb21iby5nZXRTZWxlY3Rpb24oKTsKLQkKLQkJaW50IGxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCWlmIChsZW5ndGggPiAwKSB7Ci0JCQlUZXh0VHJhbnNmZXIgcGxhaW5UZXh0VHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCXRyeSB7Ci0JCQkJYnJvd3Nlci5jbGlwYm9hcmQuc2V0Q29udGVudHMoCi0JCQkJCW5ldyBTdHJpbmdbXSB7IGJyb3dzZXIuY29tYm8uZ2V0VGV4dCgpLnN1YnN0cmluZyhzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkpIH0sIAotCQkJCQluZXcgVHJhbnNmZXJbXSB7IHBsYWluVGV4dFRyYW5zZmVyIH0pOwotCQkJfSBjYXRjaCAoU1dURXJyb3IgZXJyb3IpIHsKLQkJCQkvLyBDb3B5IHRvIGNsaXBib2FyZCBmYWlsZWQuIFRoaXMgaGFwcGVucyB3aGVuIGFub3RoZXIgYXBwbGljYXRpb24gCi0JCQkJLy8gaXMgYWNjZXNzaW5nIHRoZSBjbGlwYm9hcmQgd2hpbGUgd2UgY29weS4gSWdub3JlIHRoZSBlcnJvci4KLQkJCQkvLyBGaXhlcyAxR0RRQVZOCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTW92ZXMgdGhlIHNlbGVjdGVkIHRleHQgdG8gdGhlIGNsaXBib2FyZC4gIFRoZSB0ZXh0IHdpbGwgYmUgcHV0IGluIHRoZSAKLQkgKiBjbGlwYm9hcmQgaW4gcGxhaW4gdGV4dCBmb3JtYXQgYW5kIFJURiBmb3JtYXQuCi0JICogPHA+Ci0JICoKLQkgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0JICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0JICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHZvaWQgY3V0KCl7Ci0JCVBvaW50IHNlbGVjdGlvbiA9IGJyb3dzZXIuY29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JCi0JCWlmIChzZWxlY3Rpb24ueSA+IHNlbGVjdGlvbi54KSB7Ci0JCQljb3B5KCk7Ci0JCQlkZWxldGUoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEZWxldGVzIHRoZSBjaGFyYWN0ZXIgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjYXJldC4gRGVsZXRlIHRoZSBzZWxlY3RlZCB0ZXh0IGlmIGFueS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0JCVBvaW50IHNlbGVjdGlvbiA9IGJyb3dzZXIuY29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JCVN0cmluZyB0ZXh0ID0gYnJvd3Nlci5jb21iby5nZXRUZXh0KCk7Ci0JCi0JCWlmIChzZWxlY3Rpb24ueCAhPSBzZWxlY3Rpb24ueSkgewotCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHNlbGVjdGlvbi54KSArIHRleHQuc3Vic3RyaW5nKHNlbGVjdGlvbi55KTsKLQkJCWJyb3dzZXIuY29tYm8uc2V0VGV4dCh0ZXh0KTsKLQkJCWJyb3dzZXIuY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLngpKTsKLQkJfQotCX0KLQkKLQkvKiogCi0JICogUmVwbGFjZXMgdGhlIHNlbGVjdGlvbiB3aXRoIHRoZSBjbGlwYm9hcmQgdGV4dCBvciBpbnNlcnQgdGhlIHRleHQgYXQgCi0JICogdGhlIGN1cnJlbnQgY2FyZXQgb2Zmc2V0IGlmIHRoZXJlIGlzIG5vIHNlbGVjdGlvbi4gCi0JICogSWYgdGhlIHdpZGdldCBoYXMgdGhlIFNXVC5TSU5HTEUgc3R5bGUgYW5kIHRoZSBjbGlwYm9hcmQgdGV4dCBjb250YWlucwotCSAqIG1vcmUgdGhhbiBvbmUgbGluZSwgb25seSB0aGUgZmlyc3QgbGluZSB3aXRob3V0IGxpbmUgZGVsaW1pdGVycyBpcyAKLQkgKiBpbnNlcnRlZCBpbiB0aGUgd2lkZ2V0LgotCSAqIDxwPgotCSAqCi0JICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotCSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotCSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHBhc3RlKCkgewotCQlUZXh0VHJhbnNmZXIgdHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJUG9pbnQgc2VsZWN0aW9uID0gYnJvd3Nlci5jb21iby5nZXRTZWxlY3Rpb24oKTsKLQkJU3RyaW5nIHRleHQgPSBicm93c2VyLmNvbWJvLmdldFRleHQoKTsKLQkJCi0JCVN0cmluZyBuZXdUZXh0ID0gKFN0cmluZykgYnJvd3Nlci5jbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCQlpZiAobmV3VGV4dCAhPSBudWxsICYmIG5ld1RleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc2VsZWN0aW9uLngpICsgbmV3VGV4dCArIHRleHQuc3Vic3RyaW5nKHNlbGVjdGlvbi55KTsKLQkJCWJyb3dzZXIuY29tYm8uc2V0VGV4dCh0ZXh0KTsKLQkKLQkJCS8vIHNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIHBhc3RlCi0JCQlpbnQgeCA9IHNlbGVjdGlvbi54ICsgbmV3VGV4dC5sZW5ndGgoKTsKLQkJCWJyb3dzZXIuY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCh4LCB4KSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGRlZmluZWQgb24gPGNvZGU+SUFjdGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoYnJvd3NlciA9PSBudWxsIHx8IGJyb3dzZXIuY29tYm8gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHR5cGUgPT0gQ1VUKQotCQkJY3V0KCk7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ09QWSkKLQkJCWNvcHkoKTsKLQkJZWxzZSBpZiAodHlwZSA9PSBQQVNURSkKLQkJCXBhc3RlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9Ub29sYmFyTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvVG9vbGJhckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGFiYmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9Ub29sYmFyTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLS8qKgotICogQ3VzdG9tIGxheW91dCBmb3IgdGhlIGJyb3dzZXIncyB0b29sYmFyLgotICovCi1wdWJsaWMgY2xhc3MgVG9vbGJhckxheW91dCBleHRlbmRzIExheW91dCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNQQUNJTkcgPSA1OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFRSQV9CVVNZX1NQQUNJTkcgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVJHSU4gPSAyOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0I2NvbXB1dGVTaXplKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgaW50LCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJcmV0dXJuIG5ldyBQb2ludCh3SGludCwgaEhpbnQpOwotCQkKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWludCBoID0gMDsKLQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQloID0gTWF0aC5tYXgoaCwgY2hpbGRyZW5baV0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLQkJfQotCQkKLQkJcmV0dXJuIG5ldyBQb2ludCh3SGludCwgaCArIE1BUkdJTiAqIDIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dCNsYXlvdXQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCVJlY3RhbmdsZSByID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJCi0JCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQlQb2ludFtdIHNpemVzID0gbmV3IFBvaW50W3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJc2l6ZXNbaV0gPSBjaGlsZHJlbltpXS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQl9Ci0KLQkJaW50IGggPSByLmhlaWdodCAtIE1BUkdJTiAqIDI7Ci0JCQotCQkvLyBwdXQgYnVzeSBpY29uIGF0IHJpZ2h0IHdpdGggYSBsaXR0bGUgZXh0cmEgc3BhY2luZwotCQlpbnQgYnVzeSA9IHNpemUgLSAxOwotCQljaGlsZHJlbltidXN5XS5zZXRCb3VuZHMoci54ICsgci53aWR0aCAtIE1BUkdJTiAtIHNpemVzW2J1c3ldLngsCi0JCQkJci55ICsgTUFSR0lOICsgKGgtc2l6ZXNbYnVzeV0ueSkgLyAyLCAKLQkJCQlzaXplc1tidXN5XS54LCBzaXplc1tidXN5XS55KTsKLQkJCi0JCS8vIGZpbmQgY29tYm8KLQkJaW50IGNvbWJvID0gLTE7Ci0JCWludCB0dyA9IHIud2lkdGggLSBNQVJHSU4gKiAyIC0gKHNpemUgLSAxKSAqIFNQQUNJTkcKLQkJCQktIHNpemVzW3NpemUtMV0ueCAtIEVYVFJBX0JVU1lfU1BBQ0lORzsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBDb21ibykKLQkJCQljb21ibyA9IGk7Ci0JCQllbHNlCi0JCQkJdHcgLT0gc2l6ZXNbaV0ueDsKLQkJfQotCQlpZiAoY29tYm8gPj0gMCkKLQkJCXNpemVzW2NvbWJvXS54ID0gdHc7Ci0JCQotCQkvLyBzcGFjZSBvdXQgb3RoZXIgY2hpbGRyZW4gd2l0aCB0aGVpciBzdGFuZGFyZCBzaXplLCBnaXZlIGNvbWJvIGFsbAotCQkvLyByZW1haW5pbmcgc3BhY2UgKGlmIGl0IGV4aXN0cykKLQkJaW50IHggPSBNQVJHSU47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgewotCQkJY2hpbGRyZW5baV0uc2V0Qm91bmRzKHIueCArIHgsIHIueSArIE1BUkdJTiArIChoLXNpemVzW2ldLnkpIC8gMiwKLQkJCQkJc2l6ZXNbaV0ueCwgc2l6ZXNbaV0ueSk7Ci0JCQl4ICs9IFNQQUNJTkcgKyBzaXplc1tpXS54OwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9UcmFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzZkZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSB7Ci0JcHVibGljIHN0YXRpYyBpbnQgQ09ORklHID0gMDsKLQlwdWJsaWMgc3RhdGljIGludCBXQVJOSU5HID0gMjsKLQlwdWJsaWMgc3RhdGljIGludCBTRVZFUkUgPSAzOwotCXB1YmxpYyBzdGF0aWMgaW50IEZJTkVSID0gNDsKLQlwdWJsaWMgc3RhdGljIGludCBGSU5FU1QgPSA1OwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShpbnQgbGV2ZWwsIFN0cmluZyBzKSB7Ci0JCVRyYWNlLnRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0IGphdmEubGFuZy5UaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoaW50IGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKCFXZWJCcm93c2VyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbihzKTsKLQkJaWYgKHQgIT0gbnVsbCkKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvV2ViQnJvd3NlckVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2ExNTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXb3JrYmVuY2hCcm93c2VyU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci0vKioKLSAqIEFuIGludGVncmF0ZWQgV2ViIGJyb3dzZXIsIGRlZmluZWQgYXMgYW4gZWRpdG9yIHRvIG1ha2UKLSAqIGJldHRlciB1c2Ugb2YgdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyRWRpdG9yIGV4dGVuZHMgRWRpdG9yUGFydCBpbXBsZW1lbnRzIElCcm93c2VyVmlld2VyQ29udGFpbmVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfQlJPV1NFUl9FRElUT1JfSUQgPSAib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5lZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgQnJvd3NlclZpZXdlciB3ZWJCcm93c2VyOwotCXByb3RlY3RlZCBTdHJpbmcgaW5pdGlhbFVSTDsKLQlwcm90ZWN0ZWQgSW1hZ2UgaW1hZ2U7Ci0KLQlwcm90ZWN0ZWQgVGV4dEFjdGlvbiBjdXRBY3Rpb247Ci0JcHJvdGVjdGVkIFRleHRBY3Rpb24gY29weUFjdGlvbjsKLQlwcm90ZWN0ZWQgVGV4dEFjdGlvbiBwYXN0ZUFjdGlvbjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGxvY2tOYW1lOwotCi0JLyoqCi0JICogV2ViQnJvd3NlckVkaXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXZWJCcm93c2VyRWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKgotCSAqIENyZWF0ZXMgdGhlIFNXVCBjb250cm9scyBmb3IgdGhpcyB3b3JrYmVuY2ggcGFydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVdlYkJyb3dzZXJFZGl0b3JJbnB1dCBpbnB1dCA9IGdldFdlYkJyb3dzZXJFZGl0b3JJbnB1dCgpOwotCQkKLQkJaW50IHN0eWxlID0gMDsKLQkJaWYgKGlucHV0ID09IG51bGwgfHwgaW5wdXQuaXNMb2NhdGlvbkJhckxvY2FsKCkpIHsKLQkJCXN0eWxlICs9IEJyb3dzZXJWaWV3ZXIuTE9DQVRJT05fQkFSOwotCQl9Ci0JCWlmIChpbnB1dCA9PSBudWxsIHx8IGlucHV0LmlzVG9vbGJhckxvY2FsKCkpIHsKLQkJCXN0eWxlICs9IEJyb3dzZXJWaWV3ZXIuQlVUVE9OX0JBUjsKLQkJfQotCQl3ZWJCcm93c2VyID0gbmV3IEJyb3dzZXJWaWV3ZXIocGFyZW50LCBzdHlsZSk7Ci0JCQotCQl3ZWJCcm93c2VyLnNldFVSTChpbml0aWFsVVJMKTsKLQkJd2ViQnJvd3Nlci5zZXRDb250YWluZXIodGhpcyk7Ci0JCQotCQlpZiAoaW5wdXQgPT0gbnVsbCB8fCBpbnB1dC5pc0xvY2F0aW9uQmFyTG9jYWwoKSkgewotCQkJY3V0QWN0aW9uID0gbmV3IFRleHRBY3Rpb24od2ViQnJvd3NlciwgVGV4dEFjdGlvbi5DVVQpOwotCQkJY29weUFjdGlvbiA9IG5ldyBUZXh0QWN0aW9uKHdlYkJyb3dzZXIsIFRleHRBY3Rpb24uQ09QWSk7Ci0JCQlwYXN0ZUFjdGlvbiA9IG5ldyBUZXh0QWN0aW9uKHdlYkJyb3dzZXIsIFRleHRBY3Rpb24uUEFTVEUpOwotCQl9Ci0JCQotCQlpZiAoIWxvY2tOYW1lKSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChCcm93c2VyVmlld2VyLlBST1BFUlRZX1RJVExFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJCXNldFBhcnROYW1lKChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXdlYkJyb3dzZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiAhaW1hZ2UuaXNEaXNwb3NlZCgpKQotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlpbWFnZSA9IG51bGw7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkvLyBtYXJrIHRoaXMgaW5zdGFuY2UgYXMgZGlzcG9zZWQgdG8gYXZvaWQgc3RhbGUgcmVmZXJlbmNlcwotCQlkaXNwb3NlZCA9IHRydWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBkaXNwb3NlZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIFNhdmVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWRpdG9yIHRvIGFub3RoZXIgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvcHkgYWN0aW9uLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbgotCSAqLwotCXB1YmxpYyBJQWN0aW9uIGdldENvcHlBY3Rpb24oKSB7Ci0JCXJldHVybiBjb3B5QWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXQgYWN0aW9uLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbgotCSAqLwotCXB1YmxpYyBJQWN0aW9uIGdldEN1dEFjdGlvbigpIHsKLQkJcmV0dXJuIGN1dEFjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2ViIGVkaXRvciBpbnB1dCwgaWYgYXZhaWxhYmxlLiBJZiB0aGUgaW5wdXQgd2FzIG9mCi0JICogYW5vdGhlciB0eXBlLCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5JV2ViQnJvd3NlckVkaXRvcklucHV0Ci0JICovCi0JcHJvdGVjdGVkIFdlYkJyb3dzZXJFZGl0b3JJbnB1dCBnZXRXZWJCcm93c2VyRWRpdG9ySW5wdXQoKSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIFdlYkJyb3dzZXJFZGl0b3JJbnB1dCkKLQkJCXJldHVybiAoV2ViQnJvd3NlckVkaXRvcklucHV0KSBpbnB1dDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFzdGUgYWN0aW9uLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbgotCSAqLwotCXB1YmxpYyBJQWN0aW9uIGdldFBhc3RlQWN0aW9uKCkgewotCQlyZXR1cm4gcGFzdGVBY3Rpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgcGFydCB3aXRoIGEgc2l0ZSBhbmQgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIk9wZW5pbmcgYnJvd3NlcjogIiArIGlucHV0KTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJUGF0aEVkaXRvcklucHV0KSB7Ci0JCQlJUGF0aEVkaXRvcklucHV0IHBlaSA9IChJUGF0aEVkaXRvcklucHV0KSBpbnB1dDsKLQkJCUlQYXRoIHBhdGggPSBwZWkuZ2V0UGF0aCgpOwotCQkJVVJMIHVybCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJCXVybCA9IHBhdGgudG9GaWxlKCkudG9VUkwoKTsKLQkJCQlpbml0aWFsVVJMID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgVVJMIHRvIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHdlYkJyb3dzZXIgIT0gbnVsbCkgewotCQkJCWlmIChpbml0aWFsVVJMICE9IG51bGwpCi0JCQkJCXdlYkJyb3dzZXIuc2V0VVJMKGluaXRpYWxVUkwpOwotCQkJCXNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmFjdGl2YXRlKHRoaXMpOwotCQkJfQotCQkJCi0JCQlzZXRQYXJ0TmFtZShwYXRoLmxhc3RTZWdtZW50KCkpOwotCQkJaWYgKHVybCAhPSBudWxsKQotCQkJCXNldFRpdGxlVG9vbFRpcCh1cmwuZ2V0RmlsZSgpKTsKLQotCQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpbWFnZTsKLQkJCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0lOVEVSTkFMX0JST1dTRVIpOwotCQkJaW1hZ2UgPSBpZC5jcmVhdGVJbWFnZSgpOwotCi0JCQlzZXRUaXRsZUltYWdlKGltYWdlKTsKLQkJCWlmIChvbGRJbWFnZSAhPSBudWxsICYmICFvbGRJbWFnZS5pc0Rpc3Bvc2VkKCkpCi0JCQkJb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQkJLy9hZGRSZXNvdXJjZUxpc3RlbmVyKGZpbGUpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgV2ViQnJvd3NlckVkaXRvcklucHV0KSB7Ci0JCQlXZWJCcm93c2VyRWRpdG9ySW5wdXQgd2JlaSA9IChXZWJCcm93c2VyRWRpdG9ySW5wdXQpIGlucHV0OwotCQkJaW5pdGlhbFVSTCA9IG51bGw7Ci0JCQlpZiAod2JlaS5nZXRVUkwoKSAhPSBudWxsKQotCQkJCWluaXRpYWxVUkwgPSB3YmVpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQlpZiAod2ViQnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJd2ViQnJvd3Nlci5zZXRVUkwoaW5pdGlhbFVSTCk7Ci0JCQkJc2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuYWN0aXZhdGUodGhpcyk7Ci0JCQl9Ci0JCi0JCQlzZXRQYXJ0TmFtZSh3YmVpLmdldE5hbWUoKSk7Ci0JCQlzZXRUaXRsZVRvb2xUaXAod2JlaS5nZXRUb29sVGlwVGV4dCgpKTsKLQkJCWxvY2tOYW1lID0gd2JlaS5pc05hbWVMb2NrZWQoKTsKLQotCQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpbWFnZTsKLQkJCUltYWdlRGVzY3JpcHRvciBpZCA9IHdiZWkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlpbWFnZSA9IGlkLmNyZWF0ZUltYWdlKCk7Ci0KLQkJCXNldFRpdGxlSW1hZ2UoaW1hZ2UpOwotCQkJaWYgKG9sZEltYWdlICE9IG51bGwgJiYgIW9sZEltYWdlLmlzRGlzcG9zZWQoKSkKLQkJCQlvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCX0gZWxzZQotCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9ySW52YWxpZEVkaXRvcklucHV0LCBpbnB1dC5nZXROYW1lKCkpKTsKLQkJCi0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29udGVudHMgb2YgdGhpcyBlZGl0b3IgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHNhdmUKLQkgKiBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSAic2F2ZSBhcyIgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGlzIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIHRoZSBpbnB1dCBpbiB0aGUgaW50ZXJuYWwgV2ViIGJyb3dzZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oV2ViQnJvd3NlckVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gV2ViQnJvd3NlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCi0JCXRyeSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9ycyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJaW50IHNpemUgPSBlZGl0b3JzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKFdFQl9CUk9XU0VSX0VESVRPUl9JRC5lcXVhbHMoZWRpdG9yc1tpXS5nZXRJZCgpKSkgewotCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBlZGl0b3JzW2ldLmdldEVkaXRvcih0cnVlKTsKLQkJCQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGVkaXRvciBpbnN0YW5jZW9mIFdlYkJyb3dzZXJFZGl0b3IpIHsKLQkJCQkJCVdlYkJyb3dzZXJFZGl0b3Igd2ViRWRpdG9yID0gKFdlYkJyb3dzZXJFZGl0b3IpIGVkaXRvcjsKLQkJCQkJCVdlYkJyb3dzZXJFZGl0b3JJbnB1dCBpbnB1dDIgPSB3ZWJFZGl0b3IuZ2V0V2ViQnJvd3NlckVkaXRvcklucHV0KCk7Ci0JCQkJCQlpZiAoaW5wdXQyID09IG51bGwgfHwgaW5wdXQuY2FuUmVwbGFjZUlucHV0KGlucHV0MikpIHsKLQkJCQkJCQllZGl0b3IuaW5pdChlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLCBpbnB1dCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlwYWdlLm9wZW5FZGl0b3IoaW5wdXQsIFdlYkJyb3dzZXJFZGl0b3IuV0VCX0JST1dTRVJfRURJVE9SX0lEKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG9wZW5pbmcgV2ViIGJyb3dzZXIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qCi0JICogQXNrcyB0aGlzIHBhcnQgdG8gdGFrZSBmb2N1cyB3aXRoaW4gdGhlIHdvcmtiZW5jaC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKHdlYkJyb3dzZXIgIT0gbnVsbCkKLQkJCXdlYkJyb3dzZXIuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSB0aGUgZWRpdG9yIGNvcnJlY3RseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBbXSByZXN1bHQgPSBuZXcgYm9vbGVhblsxXTsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyZXN1bHRbMF0gPSBnZXRFZGl0b3JTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKFdlYkJyb3dzZXJFZGl0b3IudGhpcywgZmFsc2UpOwotCQkJfQotCQl9KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0JCi0gICAgcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9wZW5JbkV4dGVybmFsQnJvd3NlcihTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGZpbmFsIElFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGdldEVkaXRvclNpdGUoKS5nZXRJZCgpOwotICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBkb09wZW5FeHRlcm5hbEVkaXRvcihpZCwgaW5wdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9PcGVuRXh0ZXJuYWxFZGl0b3IoU3RyaW5nIGlkLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLSAgICAgICAgSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICAgICAgSUVkaXRvckRlc2NyaXB0b3IgW10gZWRpdG9ycyA9IHJlZ2lzdHJ5LmdldEVkaXRvcnMobmFtZSk7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQotICAgICAgICBTdHJpbmcgZWRpdG9ySWQgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvciA9IGVkaXRvcnNbaV07Ci0gICAgICAgICAgICBpZiAoZWRpdG9yLmdldElkKCkuZXF1YWxzKGlkKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGVkaXRvcklkID0gZWRpdG9yLmdldElkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIElFZGl0b3JEZXNjcmlwdG9yIGRkZXNjID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihuYW1lKTsKLSAgICAgICAgaWYgKGRkZXNjIT1udWxsICYmIGRkZXNjLmdldElkKCkuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgaW50IGRvdCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIFN0cmluZyBleHQgPSBuYW1lOwotICAgICAgICAgICAgaWYgKGRvdCE9IC0xKQotICAgICAgICAgICAgICAgIGV4dCA9ICIqLiIrbmFtZS5zdWJzdHJpbmcoZG90KzEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZWdpc3RyeS5zZXREZWZhdWx0RWRpdG9yKGV4dCwgbnVsbCk7Ci0gICAgICAgIH0KLSAKLSAgICAgICAgIGlmIChlZGl0b3JJZD09bnVsbCkgewotICAgICAgICAgICAgLy8gbm8gZWRpdG9yCi0gICAgICAgICAgICAvLyBuZXh0IGNoZWNrIHdpdGggdGhlIE9TIGZvciBhbiBleHRlcm5hbCBlZGl0b3IKLSAgICAgICAgICAgIGlmIChyZWdpc3RyeS5pc1N5c3RlbUV4dGVybmFsRWRpdG9yQXZhaWxhYmxlKG5hbWUpKQotICAgICAgICAgICAgICAgIGVkaXRvcklkID0gSUVkaXRvclJlZ2lzdHJ5LlNZU1RFTV9FWFRFUk5BTF9FRElUT1JfSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWRpdG9ySWQhPW51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFnZS5vcGVuRWRpdG9yKGlucHV0LCBlZGl0b3JJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gbm8gcmVnaXN0ZXJlZCBlZGl0b3IgLSBvcGVuIHVzaW5nIGJyb3dzZXIgc3VwcG9ydAotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHRoZVVSTCA9IG5ldyBVUkwod2ViQnJvd3Nlci5nZXRVUkwoKSk7Ci0gICAgICAgICAgICBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgc3VwcG9ydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKTsKLSAgICAgICAgICAgIHN1cHBvcnQuZ2V0RXh0ZXJuYWxCcm93c2VyKCkub3BlblVSTCh0aGVVUkwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9UT0RPIGhhbmRsZSB0aGlzCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vVE9ETyBoYW5kbGUgdGhpcwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlNDkxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvV2ViQnJvd3NlckVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLS8qKgotICogQWN0aW9uQmFyQ29udHJpYnV0b3IgZm9yIHRoZSBXZWIgYnJvd3Nlci4KLSAqIEp1c3QgYWRkcyBjdXQsIGNvcHksIHBhc3RlIGFjdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciB7Ci0JcHJvdGVjdGVkIFdlYkJyb3dzZXJFZGl0b3IgZWRpdG9yOwotCXByb3RlY3RlZCBBY3Rpb24gYmFjazsKLQlwcm90ZWN0ZWQgQWN0aW9uIGZvcndhcmQ7Ci0JcHJvdGVjdGVkIFVwZGF0ZXIgdXBkYXRlciA9IG5ldyBVcGRhdGVyKCk7Ci0KLQljbGFzcyBVcGRhdGVyIGltcGxlbWVudHMgQnJvd3NlclZpZXdlci5JQmFja05leHRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHVwZGF0ZUJhY2tOZXh0QnVzeSgpIHsKLQkJCWlmIChiYWNrID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJYmFjay5zZXRFbmFibGVkKGdldFdlYkJyb3dzZXIoKS5pc0JhY2tFbmFibGVkKCkpOwotCQkJZm9yd2FyZC5zZXRFbmFibGVkKGdldFdlYkJyb3dzZXIoKS5pc0ZvcndhcmRFbmFibGVkKCkpOwotCQkJLy9idXN5LnNldEJ1c3koZ2V0V2ViQnJvd3NlcigpLmxvYWRpbmcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2ViQnJvd3NlckVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdlYkJyb3dzZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIFNldHMgdGhlIGFjdGl2ZSBlZGl0b3IgZm9yIHRoZSBjb250cmlidXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWlmICh0YXJnZXRFZGl0b3IgaW5zdGFuY2VvZiBXZWJCcm93c2VyRWRpdG9yKSB7Ci0JCQllZGl0b3IgPSAoV2ViQnJvd3NlckVkaXRvcikgdGFyZ2V0RWRpdG9yOwotCQkJV2ViQnJvd3NlckVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldFdlYkJyb3dzZXJFZGl0b3JJbnB1dCgpOwotCQkJCi0JCQlpZiAoaW5wdXQgPT0gbnVsbCB8fCBpbnB1dC5pc0xvY2F0aW9uQmFyTG9jYWwoKSkgewotCQkJCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLCBlZGl0b3IuZ2V0Q29weUFjdGlvbigpKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwgZWRpdG9yLmdldEN1dEFjdGlvbigpKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLCBlZGl0b3IuZ2V0UGFzdGVBY3Rpb24oKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vaWYgKGlucHV0LmlzVG9vbGJhckdsb2JhbCgpKQotCQkJLy8JZ2V0V2ViQnJvd3NlcigpLmJhY2tOZXh0TGlzdGVuZXIgPSB0aGlzLnVwZGF0ZXI7Ci0JCQkJCi0JCQkvL2VkaXRvci51cGRhdGVBY3Rpb25zKCk7Ci0JCX0gZWxzZQotCQkJZWRpdG9yID0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJyb3dzZXJWaWV3ZXIgZ2V0V2ViQnJvd3NlcigpIHsKLQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gZWRpdG9yLndlYkJyb3dzZXI7IAotCX0KLQotCS8qCi0gICAgKiBDb250cmlidXRlcyB0byB0aGUgZ2l2ZW4gdG9vbCBiYXIuCi0gICAgKi8KLSAgIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0gICAJaWYgKGVkaXRvciA9PSBudWxsKQotICAgCQlyZXR1cm47Ci0gICAJLypXZWJCcm93c2VyRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0V2ViQnJvd3NlckVkaXRvcklucHV0KCk7Ci0gICAJaWYgKGlucHV0LmlzTG9jYXRpb25CYXJHbG9iYWwoKSkgewotCSAgIAlmaW5hbCBMb2NhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gbG9jYXRpb24gPSBuZXcgTG9jYXRpb25Db250cmlidXRpb25JdGVtKCk7Ci0JICAgCXRvb2xCYXJNYW5hZ2VyLmFkZChsb2NhdGlvbik7Ci0JICAgCi0JICAgCUFjdGlvbiBnbyA9IG5ldyBBY3Rpb24oKSB7Ci0JICAgCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JICAgCQkJZ2V0V2ViQnJvd3NlcigpLnNldFVSTChsb2NhdGlvbi5nZXRUZXh0KCkpOwotCSAgIAkJfQotCSAgIAl9OwotCSAgIAlnby5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9OQVZfR08pKTsKLQkgICAJZ28uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9OQVZfR08pKTsKLQkgICAJZ28uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9OQVZfR08pKTsKLQkgICAJZ28uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uV2ViQnJvd3NlckdvIikpOwotCSAgIAl0b29sQmFyTWFuYWdlci5hZGQoZ28pOwotICAgCX0KLSAgIAkKLSAgIAlpZiAoaW5wdXQuaXNMb2NhdGlvbkJhckdsb2JhbCgpICYmIGlucHV0LmlzVG9vbGJhckdsb2JhbCgpKSB7Ci0gICAJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgCX0KLSAgIAkKLSAgIAlpZiAoaW5wdXQuaXNUb29sYmFyR2xvYmFsKCkpIHsKLQkgICAJQWN0aW9uIGZhdm9yaXRlcyA9IG5ldyBBY3Rpb24oTWVzc2FnZXMuYWN0aW9uV2ViQnJvd3NlckZhdm9yaXRlcyIpLCBJQWN0aW9uLkFTX0RST1BfRE9XTl9NRU5VKSB7Ci0JICAgCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JICAgCQkJZ2V0V2ViQnJvd3NlcigpLmFkZEZhdm9yaXRlKCk7Ci0JICAgCQl9Ci0JICAgCQlwdWJsaWMgSU1lbnVDcmVhdG9yIGdldE1lbnVDcmVhdG9yKCkgewotCSAgIAkJCXJldHVybiBuZXcgSU1lbnVDcmVhdG9yKCkgewotCQkJCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJCQl9Ci0JCi0JCQkJCQlwdWJsaWMgTWVudSBnZXRNZW51KGZpbmFsIENvbnRyb2wgcGFyZW50KSB7Ci0JCQkJCQkJTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLQkJCQkJCQkKLQkJCQkJCQkvLyBsb2NrZWQgZmF2b3JpdGVzCi0JCQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBXZWJCcm93c2VyVXRpbC5nZXRMb2NrZWRGYXZvcml0ZXMoKS5pdGVyYXRvcigpOwotCQkJCQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCQkJZmluYWwgRmF2b3JpdGUgZiA9IChGYXZvcml0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCQkJCQkJCQlpdGVtLnNldFRleHQoZi5nZXROYW1lKCkpOwotCQkJCQkJCQkJaXRlbS5zZXRJbWFnZShJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0ZBVk9SSVRFKSk7Ci0JCQkJCQkJCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJCQkJCWdldFdlYkJyb3dzZXIoKS5zZXRVUkwoZi5nZXRVUkwoKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJaXRlcmF0b3IgPSBXZWJCcm93c2VyUHJlZmVyZW5jZS5nZXRJbnRlcm5hbFdlYkJyb3dzZXJGYXZvcml0ZXMoKS5pdGVyYXRvcigpOwotCQkJCQkJCWlmICghaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQkJCQkJCQlpdGVtLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uV2ViQnJvd3Nlck5vRmF2b3JpdGVzIikpOwotCQkJCQkJCX0KLQkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCWZpbmFsIEZhdm9yaXRlIGYgPSAoRmF2b3JpdGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCQkJCQkJCWl0ZW0uc2V0VGV4dChmLmdldE5hbWUoKSk7Ci0JCQkJCQkJCWl0ZW0uc2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19GQVZPUklURSkpOwotCQkJCQkJCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQkJCQlnZXRXZWJCcm93c2VyKCkuc2V0VVJMKGYuZ2V0VVJMKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQkJCQkKLQkJCQkJCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQkJCQkJCQlpdGVtLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uV2ViQnJvd3Nlck9yZ2FuaXplRmF2b3JpdGVzIikpOwotCQkJCQkJCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJCQlPcmdhbml6ZUZhdm9yaXRlc0RpYWxvZyBkaWFsb2cgPSBuZXcgT3JnYW5pemVGYXZvcml0ZXNEaWFsb2cocGFyZW50LmdldFNoZWxsKCkpOwotCQkJCQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJCXJldHVybiBtZW51OwotCQkJCQkJfQotCQotCQkJCQkJcHVibGljIE1lbnUgZ2V0TWVudShmaW5hbCBNZW51IHBhcmVudCkgewotCQkJCQkJCU1lbnUgbWVudSA9IG5ldyBNZW51KHBhcmVudCk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gbG9ja2VkIGZhdm9yaXRlcwotCQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gV2ViQnJvd3NlclV0aWwuZ2V0TG9ja2VkRmF2b3JpdGVzKCkuaXRlcmF0b3IoKTsKLQkJCQkJCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJCWZpbmFsIEZhdm9yaXRlIGYgPSAoRmF2b3JpdGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQkJCQkJCQkJaXRlbS5zZXRUZXh0KGYuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJCWl0ZW0uc2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19GQVZPUklURSkpOwotCQkJCQkJCQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQkJCQkJCQlnZXRXZWJCcm93c2VyKCkuc2V0VVJMKGYuZ2V0VVJMKCkpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0pOwotCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCWl0ZXJhdG9yID0gV2ViQnJvd3NlclByZWZlcmVuY2UuZ2V0SW50ZXJuYWxXZWJCcm93c2VyRmF2b3JpdGVzKCkuaXRlcmF0b3IoKTsKLQkJCQkJCQlpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQkJCQkJCQkJaXRlbS5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbldlYkJyb3dzZXJOb0Zhdm9yaXRlcyIpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCQlmaW5hbCBGYXZvcml0ZSBmID0gKEZhdm9yaXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQkJCQkJCQlpdGVtLnNldFRleHQoZi5nZXROYW1lKCkpOwotCQkJCQkJCQlpdGVtLnNldEltYWdlKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfRkFWT1JJVEUpKTsKLQkJCQkJCQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJCQkJZ2V0V2ViQnJvd3NlcigpLnNldFVSTChmLmdldFVSTCgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJCQkJCi0JCQkJCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCQkJCQkJaXRlbS5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbldlYkJyb3dzZXJPcmdhbml6ZUZhdm9yaXRlcyIpKTsKLQkJCQkJCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQkJCQkJT3JnYW5pemVGYXZvcml0ZXNEaWFsb2cgZGlhbG9nID0gbmV3IE9yZ2FuaXplRmF2b3JpdGVzRGlhbG9nKHBhcmVudC5nZXRTaGVsbCgpKTsKLQkJCQkJCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCQlyZXR1cm4gbWVudTsKLQkJCQkJCX0KLQkgICAJCQl9OwotCSAgIAkJfQotCSAgIAl9OwotCSAgIAlmYXZvcml0ZXMuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfTkFWX0ZBVk9SSVRFUykpOwotCSAgIAlmYXZvcml0ZXMuc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9OQVZfRkFWT1JJVEVTKSk7Ci0JICAgCWZhdm9yaXRlcy5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX05BVl9GQVZPUklURVMpKTsKLQkgICAJZmF2b3JpdGVzLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbldlYkJyb3dzZXJGYXZvcml0ZXMiKSk7Ci0JICAgCXRvb2xCYXJNYW5hZ2VyLmFkZChmYXZvcml0ZXMpOwotCSAgIAkKLQkgICAJYmFjayA9IG5ldyBBY3Rpb24oKSB7Ci0JICAgCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JICAgCQkJZ2V0V2ViQnJvd3NlcigpLmJhY2soKTsKLQkgICAJCX0KLQkgICAJfTsKLQkgICAJYmFjay5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9OQVZfQkFDS1dBUkQpKTsKLQkJCWJhY2suc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9OQVZfQkFDS1dBUkQpKTsKLQkJCWJhY2suc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9OQVZfQkFDS1dBUkQpKTsKLQkJCWJhY2suc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uV2ViQnJvd3NlckJhY2siKSk7Ci0JICAgCXRvb2xCYXJNYW5hZ2VyLmFkZChiYWNrKTsKLQkgICAJCi0JICAgCWZvcndhcmQgPSBuZXcgQWN0aW9uKCkgewotCSAgIAkJcHVibGljIHZvaWQgcnVuKCkgewotCSAgIAkJCWdldFdlYkJyb3dzZXIoKS5mb3J3YXJkKCk7Ci0JICAgCQl9Ci0JICAgCX07Ci0JICAgCWZvcndhcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfTkFWX0ZPUldBUkQpKTsKLQkgICAJZm9yd2FyZC5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX05BVl9GT1JXQVJEKSk7Ci0JCQlmb3J3YXJkLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfTkFWX0ZPUldBUkQpKTsKLQkJCWZvcndhcmQuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uV2ViQnJvd3NlckZvcndhcmQiKSk7Ci0JICAgCXRvb2xCYXJNYW5hZ2VyLmFkZChmb3J3YXJkKTsKLQkgICAJCi0JICAgCUFjdGlvbiBzdG9wID0gbmV3IEFjdGlvbigpIHsKLQkgICAJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkgICAJCQlnZXRXZWJCcm93c2VyKCkuc3RvcCgpOwotCSAgIAkJfQotCSAgIAl9OwotCSAgIAlzdG9wLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX05BVl9TVE9QKSk7Ci0JICAgCXN0b3Auc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9OQVZfU1RPUCkpOwotCSAgIAlzdG9wLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfTkFWX1NUT1ApKTsKLQkgICAJc3RvcC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25XZWJCcm93c2VyU3RvcCIpKTsKLQkgICAJdG9vbEJhck1hbmFnZXIuYWRkKHN0b3ApOwotCSAgIAkKLQkgICAJQWN0aW9uIHJlZnJlc2ggPSBuZXcgQWN0aW9uKCkgewotCSAgIAkJcHVibGljIHZvaWQgcnVuKCkgewotCSAgIAkJCWdldFdlYkJyb3dzZXIoKS5yZWZyZXNoKCk7Ci0JICAgCQl9Ci0JICAgCX07Ci0JICAgCXJlZnJlc2guc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfTkFWX1JFRlJFU0gpKTsKLQkgICAJcmVmcmVzaC5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX05BVl9SRUZSRVNIKSk7Ci0JICAgCXJlZnJlc2guc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9OQVZfUkVGUkVTSCkpOwotCSAgIAlyZWZyZXNoLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbldlYkJyb3dzZXJSZWZyZXNoIikpOwotCSAgIAl0b29sQmFyTWFuYWdlci5hZGQocmVmcmVzaCk7Ci0gICAJfSovCi0gICAJCi0gICAJLyp0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgIAkKLSAgIAlDb250cm9sQ29udHJpYnV0aW9uIGJ1c3lDb250ID0gbmV3IENvbnRyb2xDb250cmlidXRpb24oIndlYmJyb3dzZXIuYnVzeSIpIHsKLSAgIAkgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgIAkgICAJYnVzeSA9IG5ldyBCdXN5SW5kaWNhdG9yKHBhcmVudCwgU1dULk5PTkUpOwotICAgCSAgIAlyZXR1cm4gYnVzeTsKLSAgIAkgICB9Ci0gICAJfTsKLSAgIAl0b29sQmFyTWFuYWdlci5hZGQoYnVzeUNvbnQpOyovCi0gICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL1dlYkJyb3dzZXJFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL1dlYkJyb3dzZXJFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2RlZTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0OwotCi0vKioKLSAqIFRoZSBlZGl0b3IgaW5wdXQgZm9yIHRoZSBpbnRlZ3JhdGVkIHdlYiBicm93c2VyLgotICovCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlckVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0LAotCQlJUGVyc2lzdGFibGVFbGVtZW50LCBJRWxlbWVudEZhY3RvcnkgewotCS8vIC0tLSBjb25zdGFudHMgdG8gcGFzcyBpbnRvIGNvbnN0cnVjdG9yIC0tLQotCi0JLy8gaWYgdXNlZCwgdGhlIHRvb2xiYXIgd2lsbCBiZSBhdmFpbGFibGUKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX1RPT0xCQVIgPSAxIDw8IDE7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0dMT0JBTF9UT09MQkFSID0gMSA8PCAyOwotCi0JLy8gaWYgdXNlZCwgdGhlIHN0YXR1cyBiYXIgd2lsbCBiZSBhdmFpbGFibGUKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX1NUQVRVU0JBUiA9IDEgPDwgMjsKLQotCS8vIGlmIHVzZWQsIHRoZSBvcmlnaW5hbCBVUkwgd2lsbCBiZSBzYXZlZCBhbmQKLQkvLyB0aGUgcGFnZSBjYW4gcmVvcGVuIHRvIHRoZSBzYW1lIFVSTCBhZnRlcgotCS8vIHNodXR0aW5nIGRvd24KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQVZFX1VSTCA9IDEgPDwgNTsKLQotCS8vIGlmIHVzZWQsIHRoZSBicm93c2VyIHdpbGwgYmUgdHJhbnNpZW50IGFuZCB3aWxsIG5vdCBhcHBlYXIKLQkvLyBpbiB0aGUgbW9zdCByZWNlbnRseSB1c2VkIGZpbGUgbGlzdCwgbm9yIHdpbGwgaXQgcmVvcGVuIGFmdGVyCi0JLy8gcmVzdGFydGluZyBFY2xpcHNlCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNJRU5UID0gMSA8PCA2OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRkFDVE9SWV9JRCA9ICJvcmcuZWNsaXBzZS51aS5icm93c2VyLmVsZW1lbnRGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fVVJMID0gInVybCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1FTlRPX1NUWUxFID0gInN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFVSTCB1cmw7Ci0KLQlwcml2YXRlIGludCBzdHlsZTsKLQotCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyB0b29sdGlwOwotCi0JLyoqCi0JICogRXh0ZXJuYWxCcm93c2VySW5zdGFuY2UgZWRpdG9yIGlucHV0IGZvciB0aGUgaG9tZXBhZ2UuCi0JICovCi0JcHVibGljIFdlYkJyb3dzZXJFZGl0b3JJbnB1dCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBXZWJCcm93c2VyRWRpdG9ySW5wdXQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgV2ViQnJvd3NlckVkaXRvcklucHV0KFVSTCB1cmwpIHsKLQkJdGhpcyh1cmwsIDApOwotCX0KLQotCS8qKgotCSAqIFdlYkJyb3dzZXJFZGl0b3JJbnB1dCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXZWJCcm93c2VyRWRpdG9ySW5wdXQoVVJMIHVybCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudXJsID0gdXJsOwotCQl0aGlzLnN0eWxlID0gc3R5bGU7Ci0JfQotCi0JLyoqCi0JICogV2ViQnJvd3NlckVkaXRvcklucHV0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdlYkJyb3dzZXJFZGl0b3JJbnB1dChVUkwgdXJsLCBpbnQgc3R5bGUsIFN0cmluZyBicm93c2VySWQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JCXRoaXMuc3R5bGUgPSBzdHlsZTsKLQkJdGhpcy5pZCA9IGJyb3dzZXJJZDsKLQl9Ci0KLQkvKioKLQkgKiBXZWJCcm93c2VyRWRpdG9ySW5wdXQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgV2ViQnJvd3NlckVkaXRvcklucHV0KFVSTCB1cmwsIGJvb2xlYW4gYikgewotCQl0aGlzKHVybCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbikgewotCQluYW1lID0gbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dChTdHJpbmcgdCkgewotCQl0b29sdGlwID0gdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwYWdlIGNhbiByZXVzZSB0aGUgYnJvd3NlciB0aGF0IHRoZSBnaXZlbiBpbnB1dCBpcwotCSAqIGJlaW5nIGRpc3BsYXllZCBpbiwgb3IgZmFsc2UgaWYgaXQgc2hvdWxkIG9wZW4gdXAgaW4gYSBuZXcgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuSVdlYkJyb3dzZXJFZGl0b3JJbnB1dAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlcGxhY2VJbnB1dChXZWJCcm93c2VyRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiY2FuUmVwbGFjZUlucHV0ICIgKyB0aGlzICsgIiAiICsgaW5wdXQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJLy8gaWYgKChzdHlsZSAmIEZPUkNFX05FV19QQUdFKSAhPSAwKQotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCS8vIGlmIChpbnB1dC5pc1Rvb2xiYXJWaXNpYmxlKCkgIT0gaXNUb29sYmFyVmlzaWJsZSgpKQotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCS8vIGVsc2UKLQkJaWYgKGlucHV0LmlzU3RhdHVzYmFyVmlzaWJsZSgpICE9IGlzU3RhdHVzYmFyVmlzaWJsZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlIGlmIChpZCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYmlkID0gaW5wdXQuZ2V0QnJvd3NlcklkKCk7Ci0JCQlyZXR1cm4gaWQuZXF1YWxzKGJpZCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gPGNvZGU+SUVsZW1lbnQ8L2NvZGU+IGZyb20gdGhlIHN0YXRlIGNhcHR1cmVkIHdpdGhpbiBhbgotCSAqIDxjb2RlPklNZW1lbnRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVtZW50bwotCSAqICAgICAgICAgICAgYSBtZW1lbnRvIGNvbnRhaW5pbmcgdGhlIHN0YXRlIGZvciBhbiBlbGVtZW50Ci0JICogQHJldHVybiBhbiBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZWxlbWVudCBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgSUFkYXB0YWJsZSBjcmVhdGVFbGVtZW50KElNZW1lbnRvIG1lbWVudG8pIHsKLQkJVVJMIHVybDIgPSBudWxsOwotCQlpbnQgbmV3U3R5bGUgPSAwOwotCi0JCXRyeSB7Ci0JCQluZXdTdHlsZSA9IG1lbWVudG8uZ2V0SW50ZWdlcihNRU1FTlRPX1NUWUxFKS5pbnRWYWx1ZSgpOwotCi0JCQlpZiAobmV3U3R5bGUgIT0gMCkKLQkJCQl1cmwgPSBuZXcgVVJMKG1lbWVudG8uZ2V0U3RyaW5nKE1FTUVOVE9fVVJMKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBzdHlsZQotCQl9Ci0KLQkJU3RyaW5nIGlkMiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZDIgPSBtZW1lbnRvLmdldFN0cmluZyhNRU1FTlRPX0lEKTsKLQkJCWlmIChpZDIgIT0gbnVsbCAmJiBpZDIubGVuZ3RoKCkgPCAxKQotCQkJCWlkMiA9IG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCXJldHVybiBuZXcgV2ViQnJvd3NlckVkaXRvcklucHV0KHVybDIsIG5ld1N0eWxlLCBpZDIpOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHNvbWUgb3RoZXIgb2JqZWN0IGlzICJlcXVhbCB0byIgdGhpcyBvbmUuIEluIHRoaXMgY2FzZQotCSAqIGl0IG1lYW5zIHRoYXQgdGhlIHVuZGVybHlpbmcgSUZvbGRlcnMgYXJlIGVxdWFsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBXZWJCcm93c2VyRWRpdG9ySW5wdXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlXZWJCcm93c2VyRWRpdG9ySW5wdXQgb3RoZXIgPSAoV2ViQnJvd3NlckVkaXRvcklucHV0KSBvYmo7Ci0KLQkJaWYgKHVybCAhPSBudWxsICYmICF1cmwuZXF1YWxzKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGNhblJlcGxhY2VJbnB1dChvdGhlcik7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVkaXRvciBpbnB1dCBleGlzdHMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlpZiAoKHN0eWxlICYgSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LlBFUlNJU1RFTlQpICE9IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzIGFzc29jaWF0ZWQgd2l0aAotCSAqIHRoaXMgb2JqZWN0LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggb2JqZWN0IGNhbiBiZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqICAgICAgICAgICAgdGhlIGFkYXB0ZXIgY2xhc3MgdG8gbG9vayB1cAotCSAqIEByZXR1cm4gYSBvYmplY3QgY2FzdGFibGUgdG8gdGhlIGdpdmVuIGNsYXNzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhpcyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbiBhZGFwdGVyIGZvciB0aGUgZ2l2ZW4gY2xhc3MKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRCBvZiBhbiBlbGVtZW50IGZhY3Rvcnkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhpcwotCSAqIG9iamVjdC4gQW4gZWxlbWVudCBmYWN0b3J5IGV4dGVuc2lvbiB3aXRoIHRoaXMgSUQgbXVzdCBleGlzdCB3aXRoaW4gdGhlCi0JICogd29ya2JlbmNoIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQgZmFjdG9yeSBJRAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgewotCQlyZXR1cm4gRUxFTUVOVF9GQUNUT1JZX0lEOwotCX0KLQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZQotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfSU5URVJOQUxfQlJPV1NFUik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmFtZSBpcyBsb2NrZWQgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIgc2hvdWxkIG5vdCBjaGFuZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05hbWVMb2NrZWQoKSB7Ci0JCXJldHVybiAobmFtZSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZWRpdG9yIGlucHV0IGZvciBkaXNwbGF5IHB1cnBvc2VzLgotCSAqIDxwPgotCSAqIEZvciBpbnN0YW5jZSwgaWYgdGhlIGZ1bGx5IHF1YWxpZmllZCBpbnB1dCBuYW1lIGlzCi0JICogPGNvZGU+ImFcYlxNeUZpbGUuZ2lmIjwvY29kZT4sIHRoZSByZXR1cm4gdmFsdWUgd291bGQgYmUganVzdAotCSAqIDxjb2RlPiJNeUZpbGUuZ2lmIjwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgZmlsZSBuYW1lIHN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCXJldHVybiBuYW1lOwotCi0JCXJldHVybiBNZXNzYWdlcy52aWV3V2ViQnJvd3NlclRpdGxlOwotCX0KLQotCS8qCi0JICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGlzIGVkaXRvcgotCSAqIGlucHV0LiBAcmV0dXJuIHRoZSBwZXJzaXN0YWJsZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzCi0JICogZWRpdG9yIGlucHV0IGNhbm5vdCBiZSBwZXJzaXN0ZWQKLQkgKi8KLQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJaWYgKChzdHlsZSAmIElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5QRVJTSVNURU5UKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJaWYgKHRvb2x0aXAgIT0gbnVsbCkKLQkJCXJldHVybiB0b29sdGlwOwotCi0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCXJldHVybiB1cmwudG9FeHRlcm5hbEZvcm0oKTsKLQotCQlyZXR1cm4gTWVzc2FnZXMudmlld1dlYkJyb3dzZXJUaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1cmwuCi0JICogCi0JICogQHJldHVybiBqYXZhLm5ldC5VUkwKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBicm93c2VyIGlkLiBCcm93c2VycyB3aXRoIGEgc2V0IGlkIHdpbGwgYWx3YXlzICYgb25seSBiZQotCSAqIHJlcGxhY2VkIGJ5IGJyb3dzZXJzIHdpdGggdGhlIHNhbWUgaWQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyb3dzZXJJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhdHVzIGJhciBzaG91bGQgYmUgc2hvd24uCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0dXNiYXJWaXNpYmxlKCkgewotCQlyZXR1cm4gKHN0eWxlICYgSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LlNUQVRVUykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRvb2xiYXIgc2hvdWxkIGJlIHNob3duLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTG9jYXRpb25CYXJMb2NhbCgpIHsKLQkJcmV0dXJuIChzdHlsZSAmIEJyb3dzZXJWaWV3ZXIuTE9DQVRJT05fQkFSKSAhPSAwOwotCX0KLQotCS8qCi0JICogcHVibGljIGJvb2xlYW4gaXNMb2NhdGlvbkJhckdsb2JhbCgpIHsgcmV0dXJuIChzdHlsZSAmCi0JICogRXh0ZXJuYWxCcm93c2VySW5zdGFuY2UuTE9DQVRJT05fVE9PTEJBUikgIT0gMDsgfQotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gaXNUb29sYmFyTG9jYWwoKSB7Ci0JCXJldHVybiAoc3R5bGUgJiBCcm93c2VyVmlld2VyLkJVVFRPTl9CQVIpICE9IDA7Ci0JfQotCi0JLyoKLQkgKiBwdWJsaWMgYm9vbGVhbiBpc1Rvb2xiYXJHbG9iYWwoKSB7IHJldHVybiAoc3R5bGUgJgotCSAqIEV4dGVybmFsQnJvd3Nlckluc3RhbmNlLkJVVFRPTl9UT09MQkFSKSAhPSAwOyB9Ci0JICovCi0KLQkvKioKLQkgKiBTYXZlcyB0aGUgc3RhdGUgb2YgYW4gZWxlbWVudCB3aXRoaW4gYSBtZW1lbnRvLgotCSAqIAotCSAqIEBwYXJhbSBtZW1lbnRvCi0JICogICAgICAgICAgICB0aGUgc3RvcmFnZSBhcmVhIGZvciBlbGVtZW50IHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJaWYgKChzdHlsZSAmIElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5QRVJTSVNURU5UKSAhPSAwICYmIHVybCAhPSBudWxsKQotCQkJbWVtZW50by5wdXRTdHJpbmcoTUVNRU5UT19VUkwsIHVybC50b0V4dGVybmFsRm9ybSgpKTsKLQotCQltZW1lbnRvLnB1dEludGVnZXIoTUVNRU5UT19TVFlMRSwgc3R5bGUpOwotCi0JCWlmIChpZCAhPSBudWxsKQotCQkJbWVtZW50by5wdXRTdHJpbmcoTUVNRU5UT19JRCwgaWQpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgc3RyaW5nLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiV2ViQnJvd3NlckVkaXRvcklucHV0WyIgKyB1cmwgKyAiICIgKyBzdHlsZSArICIgIiArIGlkICsgIl0iOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9XZWJCcm93c2VyUHJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL1dlYkJyb3dzZXJQcmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhN2ZmNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL1dlYkJyb3dzZXJQcmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBQcmVmZXJlbmNlcyBmb3IgdGhlIFdlYiBicm93c2VyLgotICovCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlclByZWZlcmVuY2UgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQlJPV1NFUl9ISVNUT1JZID0gIndlYkJyb3dzZXJIaXN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9JTlRFUk5BTF9XRUJfQlJPV1NFUl9ISVNUT1JZID0gImludGVybmFsV2ViQnJvd3Nlckhpc3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0JST1dTRVJfQ0hPSUNFID0gImJyb3dzZXItY2hvaWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMX0JST1dTRVJfSUQgPSAib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5lZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJPV1NFUl9TVVBQT1JUX0lEID0gIm9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuZWRpdG9yU3VwcG9ydCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkFMID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVSTkFMID0gMTsKLQotCS8qKgotCSAqIFdlYkJyb3dzZXJQcmVmZXJlbmNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBXZWJCcm93c2VyUHJlZmVyZW5jZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gV2ViQnJvd3NlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgV2ViIGJyb3dzZXIgaGlzdG9yeSBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0SW50ZXJuYWxXZWJCcm93c2VySGlzdG9yeSgpIHsKLQkJU3RyaW5nIHRlbXAgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJUFJFRl9JTlRFUk5BTF9XRUJfQlJPV1NFUl9ISVNUT1JZKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZW1wLCAifCp8Iik7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBsID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgcyA9IHN0Lm5leHRUb2tlbigpOwotCQkJbC5hZGQocyk7Ci0JCX0KLQkJcmV0dXJuIGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgV2ViIGJyb3dzZXIgaGlzdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdAotCSAqICAgICAgICAgICAgdGhlIGhpc3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW50ZXJuYWxXZWJCcm93c2VySGlzdG9yeShMaXN0IGxpc3QpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlzYi5hcHBlbmQocyk7Ci0JCQkJc2IuYXBwZW5kKCJ8KnwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFBSRUZfSU5URVJOQUxfV0VCX0JST1dTRVJfSElTVE9SWSwKLQkJCQlzYi50b1N0cmluZygpKTsKLQkJV2ViQnJvd3NlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbnRlcm5hbCBicm93c2VyIGlzIHVzZWQgYnkgZGVmYXVsdAotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW50ZXJuYWwgYnJvd3NlciBpcyB1c2VkIGJ5IGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWZhdWx0VXNlSW50ZXJuYWxCcm93c2VyKCkgewotCQlyZXR1cm4gV2ViQnJvd3NlclV0aWwuY2FuVXNlSW50ZXJuYWxXZWJCcm93c2VyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzeXN0ZW0gYnJvd3NlciBpcyB1c2VkIGJ5IGRlZmF1bHQKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN5c3RlbSBicm93c2VyIGlzIHVzZWQgYnkgZGVmYXVsdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlZmF1bHRVc2VTeXN0ZW1Ccm93c2VyKCkgewotCQlyZXR1cm4gV2ViQnJvd3NlclV0aWwuY2FuVXNlU3lzdGVtQnJvd3NlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgYnJvd3NlciBpcyBiZWluZyB1c2VkCi0JICogCi0JICogQHJldHVybiBvbmUgb2YgPGNvZGU+SU5URVJOQUw8L2NvZGU+IG9yIDxjb2RlPkVYVEVSTkFMPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRCcm93c2VyQ2hvaWNlKCkgewotCQlpbnQgY2hvaWNlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KFBSRUZfQlJPV1NFUl9DSE9JQ0UpOwotCQlpZiAoY2hvaWNlID09IDIpCi0JCQlyZXR1cm4gRVhURVJOQUw7Ci0JCWlmIChjaG9pY2UgPT0gSU5URVJOQUwgJiYgIVdlYkJyb3dzZXJVdGlsLmNhblVzZUludGVybmFsV2ViQnJvd3NlcigpKQotCQkJcmV0dXJuIEVYVEVSTkFMOwotCQlyZXR1cm4gY2hvaWNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgaW50ZXJuYWwsIHN5c3RlbSBhbmQgZXh0ZXJuYWwgYnJvd3NlciBpcyB1c2VkCi0JICogCi0JICogQHBhcmFtIGNob2ljZQotCSAqICAgICAgICAgICAgPC9jb2RlPklOVEVSTkFMPC9jb2RlPiwgPGNvZGU+U1lTVEVNPC9jb2RlPiBhbmQgPGNvZGU+RVhURVJOQUw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEJyb3dzZXJDaG9pY2UoaW50IGNob2ljZSkgewotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShQUkVGX0JST1dTRVJfQ0hPSUNFLCBjaG9pY2UpOwotCQlXZWJCcm93c2VyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJdXBkYXRlRGVmYXVsdEVkaXRvcihjaG9pY2UpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlRGVmYXVsdEVkaXRvcihpbnQgY2hvaWNlKSB7Ci0JCS8vIFRvZ2dsZSBmcm9tIGludGVybmFsIGVkaXRvciB0byBicm93c2VyIHN1cHBvcnQKLQkJLy8gdG8gYXZvaWQgY29uZnVzaW9uIGJldHdlZW4gZGVmYXVsdCBlZGl0b3JzIGFuZAotCQkvLyBXZWIgYnJvd3NlciBwcmVmZXJlbmNlIHBhZ2UKLQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQlTdHJpbmcgb2xkSWQgPSBjaG9pY2UgPT0gSU5URVJOQUwgPyBCUk9XU0VSX1NVUFBPUlRfSUQKLQkJCQk6IElOVEVSTkFMX0JST1dTRVJfSUQ7Ci0JCVN0cmluZyBuZXdJZCA9IGNob2ljZSA9PSBJTlRFUk5BTCA/IElOVEVSTkFMX0JST1dTRVJfSUQKLQkJCQk6IEJST1dTRVJfU1VQUE9SVF9JRDsKLQotCQlTdHJpbmdbXVtdIGV4dGVuc2lvbnMgPSB7IHsgImEuaHRtbCIsICIqLmh0bWwiIH0sIHsgImEuaHRtIiwgIiouaHRtIiB9LCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJeyAiYS5zaHRtbCIsICIqLnNodG1sIiB9IH07ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCi0JCS8vIEZvciBlYWNoIGRlZmF1bHQgZWRpdG9yIHRoYXQgbWF0Y2hlcyB0aGUgb2xkSWQsIGNoYW5nZQotCQkvLyB0aGUgZGVmYXVsdCBlZGl0b3IgdG8gdGhlIG5ld0lkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gZXh0ID0gZXh0ZW5zaW9uc1tpXTsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRkZXNjID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihleHRbMF0pOwotCQkJaWYgKGRkZXNjICE9IG51bGwgJiYgZGRlc2MuZ2V0SWQoKS5lcXVhbHMob2xkSWQpKSB7Ci0JCQkJcmVnaXN0cnkuc2V0RGVmYXVsdEVkaXRvcihleHRbMV0sIG5ld0lkKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvV2ViQnJvd3NlclByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvV2ViQnJvd3NlclByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjQzMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL1dlYkJyb3dzZXJQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBob2xkcyBXZWIgYnJvd3NlciBwcmVmZXJlbmNlcy4KLSAqLwotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIGludGVybmFsOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBleHRlcm5hbDsKLQotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQotCXByb3RlY3RlZCBDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBlZGl0OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmU7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHNlYXJjaDsKLQotCXByb3RlY3RlZCBMYWJlbCBsb2NhdGlvbjsKLQotCXByb3RlY3RlZCBMYWJlbCBwYXJhbWV0ZXJzOwotCQotCXByb3RlY3RlZCBJQnJvd3NlckRlc2NyaXB0b3IgY2hlY2tlZEJyb3dzZXI7Ci0KLQljbGFzcyBCcm93c2VyQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBCcm93c2VyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFdlYkJyb3dzZXJzKCkKLQkJCQkJLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSUJyb3dzZXJEZXNjcmlwdG9yIGJyb3dzZXIgPSAoSUJyb3dzZXJEZXNjcmlwdG9yKSBpdGVyYXRvcgotCQkJCQkJLm5leHQoKTsKLQkJCQlsaXN0LmFkZChicm93c2VyKTsKLQkJCX0KLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCWNsYXNzIEJyb3dzZXJUYWJsZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUlCcm93c2VyRGVzY3JpcHRvciBicm93c2VyID0gKElCcm93c2VyRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCXJldHVybiBub3ROdWxsKGJyb3dzZXIuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgbm90TnVsbChTdHJpbmcgcykgewotCQkJaWYgKHMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBzOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZWJCcm93c2VyUHJlZmVyZW5jZVBhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgV2ViQnJvd3NlclByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgcHJlZmVyZW5jZSBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LAotCQkJCUNvbnRleHRJZHMuUFJFRl9CUk9XU0VSKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZlcmVuY2VXZWJCcm93c2VyRGVzY3JpcHRpb24pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWludGVybmFsID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWludGVybmFsLnNldFRleHQoTWVzc2FnZXMucHJlZkludGVybmFsQnJvd3Nlcik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJaW50ZXJuYWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlpZiAoIVdlYkJyb3dzZXJVdGlsLmNhblVzZUludGVybmFsV2ViQnJvd3NlcigpKQotCQkJaW50ZXJuYWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZXh0ZXJuYWwgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJZXh0ZXJuYWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmRXh0ZXJuYWxCcm93c2VyKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlleHRlcm5hbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmJyb3dzZXJMaXN0KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXRhYmxlID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULkNIRUNLIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTAotCQkJCXwgU1dULkhfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0KLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMTAwKSk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJdGFibGVWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQnJvd3NlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQnJvd3NlclRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoInJvb3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHVuY2hlY2sgYW55IG90aGVyIGVsZW1lbnRzIHRoYXQgbWlnaHQgYmUgY2hlY2tlZCBhbmQgbGVhdmUgb25seSB0aGUKLQkJLy8gZWxlbWVudCBjaGVja2VkIHRvIHJlbWFpbiBjaGVja2VkIHNpbmNlIG9uZSBjYW4gb25seSBjaG9zZSBvbmUKLQkJLy8gYnJvd2VyIGF0IGEgdGltZSB0byBiZSBjdXJyZW50LgotCQl0YWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQljaGVja05ld0RlZmF1bHRCcm93c2VyKGUuZ2V0RWxlbWVudCgpKTsKLQkJCQljaGVja2VkQnJvd3NlciA9IChJQnJvd3NlckRlc2NyaXB0b3IpIGUuZ2V0RWxlbWVudCgpOwotCQkJCQotCQkJCS8vIGlmIG5vIG90aGVyIGJyb3dzZXJzIGFyZSBjaGVja2VkLCBkb24ndCBhbGxvdyB0aGUgc2luZ2xlIG9uZQotCQkJCS8vIGN1cnJlbnRseSBjaGVja2VkIHRvIGJlY29tZSB1bmNoZWNrZWQsIGFuZCBsb3NlIGEgY3VycmVudAotCQkJCS8vIGJyb3dzZXIuIFRoYXQgaXMsIGRvbid0IHBlcm1pdCB1bmNoZWNraW5nIGlmIG5vIG90aGVyIGl0ZW0KLQkJCQkvLyBpcyBjaGVja2VkIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBjYXNlLgotCQkJCU9iamVjdFtdIG9iaiA9IHRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQkJCWlmIChvYmoubGVuZ3RoID09IDApCi0JCQkJCXRhYmxlVmlld2VyLnNldENoZWNrZWQoZS5nZXRFbGVtZW50KCksIHRydWUpOwotCQkJfQotCQl9KTsKLQotCQkvLyBzZXQgYSBkZWZhdWx0LCBjaGVja2VkIGJyb3dzZXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgYnJvd3Nlci4gSWYgdGhlcmUKLQkJLy8gaXMgbm90IGEgY3VycmVudCBicm93c2VyLCBidXQgdGhlIGZpcnN0IGl0ZW0gZXhpc3RzLCB1c2UgdGhhdCBpbnN0ZWFkLgotCQkvLyBUaGlzIHdpbGwgd29yayBjdXJyZW50bHkgdW50aWwgd29ya2JlbmNoIHNodXRkb3duLCBiZWNhdXNlIGN1cnJlbnQKLQkJLy8gYnJvd3NlciBpcyBub3QgeWV0IHBlcnNpc3RlZC4KLQkJY2hlY2tlZEJyb3dzZXIgPSBCcm93c2VyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRXZWJCcm93c2VyKCk7Ci0JCWlmIChjaGVja2VkQnJvd3NlciAhPSBudWxsKQotCQkJdGFibGVWaWV3ZXIuc2V0Q2hlY2tlZChjaGVja2VkQnJvd3NlciwgdHJ1ZSk7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG9iaiA9IHRhYmxlVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKLQkJCWlmIChvYmogIT0gbnVsbCkKLQkJCQl0YWJsZVZpZXdlci5zZXRDaGVja2VkKG9iaiwgdHJ1ZSk7Ci0JCX0KLQotCQl0YWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCWJvb2xlYW4gc2VsID0gc2VsZS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBudWxsICYmCi0JCQkJCQkJCSEoc2VsZS5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIFN5c3RlbUJyb3dzZXJEZXNjcmlwdG9yKTsKLQkJCQkJCXJlbW92ZS5zZXRFbmFibGVkKHNlbCk7Ci0JCQkJCQllZGl0LnNldEVuYWJsZWQoc2VsKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCXRhYmxlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWlmIChzZWwuZ2V0Rmlyc3RFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQlJQnJvd3NlckRlc2NyaXB0b3IgYnJvd3NlcjIgPSAoSUJyb3dzZXJEZXNjcmlwdG9yKSBzZWwKLQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCUlCcm93c2VyRGVzY3JpcHRvcldvcmtpbmdDb3B5IHdjID0gYnJvd3NlcjIKLQkJCQkJCQkuZ2V0V29ya2luZ0NvcHkoKTsKLQkJCQkJQnJvd3NlckRlc2NyaXB0b3JEaWFsb2cgZGlhbG9nID0gbmV3IEJyb3dzZXJEZXNjcmlwdG9yRGlhbG9nKAotCQkJCQkJCWdldFNoZWxsKCksIHdjKTsKLQkJCQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93LkNBTkNFTCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKHdjLnNhdmUoKSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdGFibGUuYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hhcmFjdGVyID09IFNXVC5ERUwpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoc2VsLmdldEZpcnN0RWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCUlCcm93c2VyRGVzY3JpcHRvciBicm93c2VyMiA9IChJQnJvd3NlckRlc2NyaXB0b3IpIHNlbAotCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWJyb3dzZXIyLmRlbGV0ZSgpOwotCQkJCQkJCXRhYmxlVmlld2VyLnJlbW92ZShicm93c2VyMik7Ci0KLQkJCQkJCQkvLyBuZWVkIGhlcmUgdG8gZW5zdXJlIHRoYXQgaWYgdGhlIGl0ZW0gZGVsZXRlZCB3YXMKLQkJCQkJCQkvLyBjaGVja2VkLCBpZS4gd2FzCi0JCQkJCQkJLy8gdGhlIGN1cnJlbnQgYnJvd3NlciwgdGhhdCB0aGUgbmV3IGN1cnJlbnQgYnJvd3NlcgotCQkJCQkJCS8vIHdpbGwgYmUgdGhlIGZpcnN0IGluIHRoZQotCQkJCQkJCS8vIGxpc3QsIHR5cGljYWxseSwgdGhlIGludGVybmFsIGJyb3dzZXIsIHdoaWNoCi0JCQkJCQkJLy8gY2Fubm90IGJlCi0JCQkJCQkJLy8gZGVsZXRlZCwgYW5kIGJlIGN1cnJlbnQKLQkJCQkJCQlCcm93c2VyTWFuYWdlciBtYW5hZ2VyID0gQnJvd3Nlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQkJCQlpZiAoYnJvd3NlcjIgPT0gY2hlY2tlZEJyb3dzZXIpIHsKLQkJCQkJCQkJaWYgKG1hbmFnZXIuYnJvd3NlcnMuc2l6ZSgpID4gMCkgewotCQkJCQkJCQkJY2hlY2tlZEJyb3dzZXIgPSAoSUJyb3dzZXJEZXNjcmlwdG9yKSBtYW5hZ2VyLmJyb3dzZXJzLmdldCgwKTsKLQkJCQkJCQkJCXRhYmxlVmlld2VyLnNldENoZWNrZWQoY2hlY2tlZEJyb3dzZXIsIHRydWUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJLy8gaWdub3JlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlidXR0b25Db21wLnNldExheW91dChsYXlvdXQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmaW5hbCBCdXR0b24gYWRkID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuYWRkKTsKLQkJYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUJyb3dzZXJEZXNjcmlwdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBCcm93c2VyRGVzY3JpcHRvckRpYWxvZygKLQkJCQkJCWdldFNoZWxsKCkpOwotCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpCi0JCQkJCXJldHVybjsKLQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJaWYgKGNoZWNrZWRCcm93c2VyICE9IG51bGwpCi0JCQkJCXRhYmxlVmlld2VyLnNldENoZWNrZWQoY2hlY2tlZEJyb3dzZXIsIHRydWUpOwotCQkJfQotCQl9KTsKLQotCQllZGl0ID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuZWRpdCk7Ci0JCWVkaXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJSUJyb3dzZXJEZXNjcmlwdG9yIGJyb3dzZXIyID0gKElCcm93c2VyRGVzY3JpcHRvcikgc2VsCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJSUJyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkgd2MgPSBicm93c2VyMi5nZXRXb3JraW5nQ29weSgpOwotCQkJCUJyb3dzZXJEZXNjcmlwdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBCcm93c2VyRGVzY3JpcHRvckRpYWxvZygKLQkJCQkJCWdldFNoZWxsKCksIHdjKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKHdjLnNhdmUoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXJlbW92ZSA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLnJlbW92ZSk7Ci0JCXJlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCQlJQnJvd3NlckRlc2NyaXB0b3IgYnJvd3NlcjIgPSAoSUJyb3dzZXJEZXNjcmlwdG9yKSBzZWwKLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQl0cnkgewotCQkJCQlicm93c2VyMi5kZWxldGUoKTsKLQkJCQkJdGFibGVWaWV3ZXIucmVtb3ZlKGJyb3dzZXIyKTsKLQotCQkJCQkvLyBuZWVkIGhlcmUgdG8gZW5zdXJlIHRoYXQgaWYgdGhlIGl0ZW0gZGVsZXRlZCB3YXMgY2hlY2tlZCwKLQkJCQkJLy8gaWUuIHdhcwotCQkJCQkvLyB0aGUgY3VycmVudCBicm93c2VyLCB0aGF0IHRoZSBuZXcgY3VycmVudCBicm93c2VyIHdpbGwgYmUKLQkJCQkJLy8gdGhlIGZpcnN0IGluIHRoZQotCQkJCQkvLyBsaXN0LCB0eXBpY2FsbHksIHRoZSBpbnRlcm5hbCBicm93c2VyLCB3aGljaCBjYW5ub3QgYmUKLQkJCQkJLy8gZGVsZXRlZCwgYW5kIGJlIGN1cnJlbnQKLQkJCQkJQnJvd3Nlck1hbmFnZXIgbWFuYWdlciA9IEJyb3dzZXJNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCQkJCWlmIChicm93c2VyMiA9PSBjaGVja2VkQnJvd3NlcikgewotCQkJCQkJaWYgKG1hbmFnZXIuYnJvd3NlcnMuc2l6ZSgpID4gMCkgewotCQkJCQkJCWNoZWNrZWRCcm93c2VyID0gKElCcm93c2VyRGVzY3JpcHRvcikgbWFuYWdlci5icm93c2Vycy5nZXQoMCk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIuc2V0Q2hlY2tlZChjaGVja2VkQnJvd3NlciwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlzZWFyY2ggPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5zZWFyY2gpOwotCQlkYXRhID0gKEdyaWREYXRhKSBzZWFyY2guZ2V0TGF5b3V0RGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gOTsKLQkJc2VhcmNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbmFsIExpc3QgZm91bmRCcm93c2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmaW5hbCBMaXN0IGV4aXN0aW5nUGF0aHMgPSBXZWJCcm93c2VyVXRpbAotCQkJCQkJLmdldEV4dGVybmFsQnJvd3NlclBhdGhzKCk7Ci0KLQkJCQkvLyBzZWxlY3QgYSB0YXJnZXQgZGlyZWN0b3J5IGZvciB0aGUgc2VhcmNoCi0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuc2VsZWN0RGlyZWN0b3J5KTsKLQkJCQlkaWFsb2cuc2V0VGV4dChNZXNzYWdlcy5kaXJlY3RvcnlEaWFsb2dUaXRsZSk7Ci0KLQkJCQlTdHJpbmcgcGF0aCA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJZmluYWwgRmlsZSByb290RGlyID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHBtID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKTsKLQotCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyByID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuc2VhcmNoaW5nVGFza05hbWUsCi0JCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQkJCQlzZWFyY2gocm9vdERpciwgZXhpc3RpbmdQYXRocywgZm91bmRCcm93c2VycywgbW9uaXRvcik7Ci0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQl0cnkgewotCQkJCQlwbS5ydW4odHJ1ZSwgdHJ1ZSwgcik7Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsCi0JCQkJCQkJIkludm9jYXRpb24gRXhjZXB0aW9uIG9jY3VyZWQgcnVubmluZyBtb25pdG9yOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgZXgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwKLQkJCQkJCQkiSW50ZXJydXB0ZWQgZXhjZXB0aW9uIG9jY3VyZWQgcnVubmluZyBtb25pdG9yOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgZXgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKHBtLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuOwotCi0JCQkJTGlzdCBicm93c2Vyc1RvQ3JlYXRlID0gZm91bmRCcm93c2VyczsKLQotCQkJCWlmIChicm93c2Vyc1RvQ3JlYXRlID09IG51bGwpIC8vIGNhbmNlbGxlZAotCQkJCQlyZXR1cm47Ci0KLQkJCQlpZiAoYnJvd3NlcnNUb0NyZWF0ZS5pc0VtcHR5KCkpIHsgLy8gbm8gYnJvd3NlcnMgZm91bmQKLQkJCQkJV2ViQnJvd3NlclV0aWwub3Blbk1lc3NhZ2UoTWVzc2FnZXMuc2VhcmNoaW5nTm9uZUZvdW5kKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYnJvd3NlcnNUb0NyZWF0ZS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJSUJyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkgYnJvd3NlcjIgPSAoSUJyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkpIGl0ZXJhdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJYnJvd3NlcjIuc2F2ZSgpOwotCQkJCX0KLQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCi0JCQkJaWYgKGNoZWNrZWRCcm93c2VyICE9IG51bGwpCi0JCQkJCXRhYmxlVmlld2VyLnNldENoZWNrZWQoY2hlY2tlZEJyb3dzZXIsIHRydWUpOwotCQkJfQotCQl9KTsKLQotCQl0YWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQljaGVja05ld0RlZmF1bHRCcm93c2VyKGUuZ2V0RWxlbWVudCgpKTsKLQkJCQljaGVja2VkQnJvd3NlciA9IChJQnJvd3NlckRlc2NyaXB0b3IpIGUKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8qZXh0ZXJuYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gc2VsID0gIXRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKTsKLQkJCQllZGl0LnNldEVuYWJsZWQoc2VsKTsKLQkJCQlyZW1vdmUuc2V0RW5hYmxlZChzZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9KTsqLwotCQlpbnRlcm5hbC5zZXRTZWxlY3Rpb24oV2ViQnJvd3NlclByZWZlcmVuY2UuZ2V0QnJvd3NlckNob2ljZSgpID09IFdlYkJyb3dzZXJQcmVmZXJlbmNlLklOVEVSTkFMKTsKLQkJZXh0ZXJuYWwuc2V0U2VsZWN0aW9uKFdlYkJyb3dzZXJQcmVmZXJlbmNlLmdldEJyb3dzZXJDaG9pY2UoKSA9PSBXZWJCcm93c2VyUHJlZmVyZW5jZS5FWFRFUk5BTCk7Ci0KLQkJLy9ib29sZWFuIHNlbCA9ICF0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWJvb2xlYW4gc2VsID0gc2VsZS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBudWxsICYmCi0JCQkJIShzZWxlLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgU3lzdGVtQnJvd3NlckRlc2NyaXB0b3IpOwotCQllZGl0LnNldEVuYWJsZWQoc2VsKTsKLQkJcmVtb3ZlLnNldEVuYWJsZWQoc2VsKTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSB1c2luZyB0aGUgcGFzc2VkIHdvcmtiZW5jaC4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya2JlbmNoCi0JICogICAgICAgICAgICB0aGUgY3VycmVudCB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkKLQkJCXNldFRpdGxlKE1lc3NhZ2VzLnByZWZlcmVuY2VXZWJCcm93c2VyVGl0bGVMb25nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbDIpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwyOwotCQlyZXR1cm4gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQotCS8vIFVuY2hlY2sgYWxsIHRoZSBpdGVtcyBleGNlcHQgdGhlIGN1cnJlbnQgb25lIHRoYXQgd2FzIGp1c3QgY2hlY2tlZAotCXByb3RlY3RlZCB2b2lkIGNoZWNrTmV3RGVmYXVsdEJyb3dzZXIoT2JqZWN0IGJyb3dzZXIpIHsKLQkJVGFibGVJdGVtW10gY2hpbGRyZW4gPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gY2hpbGRyZW5baV07Ci0KLQkJCWlmICghKGl0ZW0uZ2V0RGF0YSgpLmVxdWFscyhicm93c2VyKSkpCi0JCQkJaXRlbS5zZXRDaGVja2VkKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZWFyY2goRmlsZSBkaXJlY3RvcnksIExpc3QgZXhpc3RpbmdQYXRocywKLQkJCUxpc3QgZm91bmRCcm93c2VycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQotCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuc2VhcmNoaW5nLAotCQkJCW5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcoZm91bmRCcm93c2Vycy5zaXplKCkpLCBkaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCl9KSk7Ci0JCQotCQlTdHJpbmdbXSBuYW1lcyA9IGRpcmVjdG9yeS5saXN0KCk7Ci0JCUxpc3Qgc3ViRGlycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnksIG5hbWVzW2ldKTsKLQotCQkJaWYgKGV4aXN0aW5nUGF0aHMuY29udGFpbnMoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS50b0xvd2VyQ2FzZSgpKSkKLQkJCQljb250aW51ZTsKLQotCQkJSUJyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkgd2MgPSBXZWJCcm93c2VyVXRpbAotCQkJCQkuY3JlYXRlRXh0ZXJuYWxCcm93c2VyKGZpbGUpOwotCQkJaWYgKHdjICE9IG51bGwpCi0JCQkJZm91bmRCcm93c2Vycy5hZGQod2MpOwotCQkJCi0JCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQkJc3ViRGlycy5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKCFzdWJEaXJzLmlzRW1wdHkoKSkgewotCQkJRmlsZSBzdWJEaXIgPSAoRmlsZSkgc3ViRGlycy5yZW1vdmUoMCk7Ci0JCQlzZWFyY2goc3ViRGlyLCBleGlzdGluZ1BhdGhzLCBmb3VuZEJyb3dzZXJzLCBtb25pdG9yKTsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHNwZWNpYWwgcHJvY2Vzc2luZyB3aGVuIHRoaXMgcGFnZSdzIERlZmF1bHRzIGJ1dHRvbiBoYXMgYmVlbgotCSAqIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlpbnRlcm5hbC5zZXRTZWxlY3Rpb24oV2ViQnJvd3NlclByZWZlcmVuY2UKLQkJCQkuaXNEZWZhdWx0VXNlSW50ZXJuYWxCcm93c2VyKCkpOwotCQlleHRlcm5hbC5zZXRTZWxlY3Rpb24oIVdlYkJyb3dzZXJQcmVmZXJlbmNlLgotCQkJCWlzRGVmYXVsdFVzZUludGVybmFsQnJvd3NlcigpKTsKLQkJCi0JCUJyb3dzZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3VycmVudEJyb3dzZXIgPSBudWxsOwotCQlCcm93c2VyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnNldHVwRGVmYXVsdEJyb3dzZXJzKCk7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCi0JCWNoZWNrZWRCcm93c2VyID0gQnJvd3Nlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50V2ViQnJvd3NlcigpOwotCQlpZiAoY2hlY2tlZEJyb3dzZXIgIT0gbnVsbCkKLQkJCXRhYmxlVmlld2VyLnNldENoZWNrZWQoY2hlY2tlZEJyb3dzZXIsIHRydWUpOwotCQkKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlUGFnZS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWludCBjaG9pY2U7Ci0JCWlmIChpbnRlcm5hbC5nZXRTZWxlY3Rpb24oKSkKLQkJCWNob2ljZSA9IFdlYkJyb3dzZXJQcmVmZXJlbmNlLklOVEVSTkFMOwotCQllbHNlCi0JCQljaG9pY2UgPSBXZWJCcm93c2VyUHJlZmVyZW5jZS5FWFRFUk5BTDsKLQkJV2ViQnJvd3NlclByZWZlcmVuY2Uuc2V0QnJvd3NlckNob2ljZShjaG9pY2UpOwotCQlpZiAoY2hlY2tlZEJyb3dzZXIgIT0gbnVsbCkKLQkJCUJyb3dzZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudFdlYkJyb3dzZXIoY2hlY2tlZEJyb3dzZXIpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvV2ViQnJvd3NlclVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvV2ViQnJvd3NlclVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YTk2OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL1dlYkJyb3dzZXJVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0vKioKLSAqIFRoZSBtYWluIHdlYiBicm93c2VyIHBsdWdpbiBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vIFdlYiBicm93c2VyIHBsdWdpbiBpZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS51aS5icm93c2VyIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLQlwcml2YXRlIHN0YXRpYyBXZWJCcm93c2VyVUlQbHVnaW4gc2luZ2xldG9uOwotCQotCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBicm93c2VycwotCXByaXZhdGUgc3RhdGljIExpc3QgYnJvd3NlcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIFdlYkJyb3dzZXJVSVBsdWdpbgotCSAqLwotCXB1YmxpYyBXZWJCcm93c2VyVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNpbmdsZXRvbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYkJyb3dzZXJVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQkvKioKLQkgKiBTaHV0cyBkb3duIHRoaXMgcGx1Zy1pbiBhbmQgc2F2ZXMgYWxsIHBsdWctaW4gc3RhdGUuCi0JICoKLQkgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJQnJvd3Nlck1hbmFnZXIuc2FmZURpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gYnJvd2Vycy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgYnJvd3NlciBpbnN0YW5jZXMge0BsaW5rIElDbGllbnR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJQnJvd3NlckV4dFtdIGdldEJyb3dzZXJzKCkgewotCQlpZiAoYnJvd3NlcnMgPT0gbnVsbCkKLQkJCWxvYWRCcm93c2VycygpOwotCQlJQnJvd3NlckV4dFtdIGMgPSBuZXcgSUJyb3dzZXJFeHRbYnJvd3NlcnMuc2l6ZSgpXTsKLQkJYnJvd3NlcnMudG9BcnJheShjKTsKLQkJcmV0dXJuIGM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUJyb3dzZXJFeHQgZmluZEJyb3dzZXJzKFN0cmluZyBleGVjdXRhYmxlKSB7Ci0JCUlCcm93c2VyRXh0W10gYnJvd3NlcnMyID0gZ2V0QnJvd3NlcnMoKTsKLQkJaWYgKGJyb3dzZXJzMiA9PSBudWxsIHx8IGV4ZWN1dGFibGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaW50IGluZDEgPSBleGVjdXRhYmxlLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGluZDIgPSBleGVjdXRhYmxlLmxhc3RJbmRleE9mKCJcXCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmQyID4gaW5kMSkKLQkJCWluZDEgPSBpbmQyOwotCQlleGVjdXRhYmxlID0gZXhlY3V0YWJsZS5zdWJzdHJpbmcoaW5kMSArIDEpOwotCQkKLQkJU3RyaW5nIG9zID0gUGxhdGZvcm0uZ2V0T1MoKTsKLQkJaW50IHNpemUgPSBicm93c2VyczIubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGJyb3dzZXJzMltpXS5nZXRPUygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcykgIT0gLTEpIHsKLQkJCQlpZiAoYnJvd3NlcnMyW2ldLmlzQXZhaWxhYmxlKCkpIHsKLQkJCQkJU3RyaW5nIGV4ZWN1dGFibGUyID0gYnJvd3NlcnMyW2ldLmdldEV4ZWN1dGFibGUoKTsKLQkJCQkJaWYgKGV4ZWN1dGFibGUuc3RhcnRzV2l0aChleGVjdXRhYmxlMikpCi0JCQkJCQlyZXR1cm4gYnJvd3NlcnMyW2ldOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCB0aGUgYnJvd3NlcnMgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRCcm93c2VycygpIHsKLQkJaWYgKGJyb3dzZXJzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0+LSBMb2FkaW5nIC5icm93c2VycyBleHRlbnNpb24gcG9pbnQgLT4tIik7IC8vJE5PTi1OTFMtMSQKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoUExVR0lOX0lELCAiYnJvd3NlcnMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlicm93c2VycyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWJyb3dzZXJzLmFkZChuZXcgQnJvd3NlckV4dChjZltpXSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIiAgTG9hZGVkIGJyb3dzZXI6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBicm93c2VyOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLTwtIERvbmUgbG9hZGluZyAuYnJvd3NlcnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIExvZ3MgYW4gRXJyb3IgbWVzc2FnZSB3aXRoIGFuIGV4Y2VwdGlvbi4gTm90ZSB0aGF0IHRoZSBtZXNzYWdlIHNob3VsZAotCSAqIGFscmVhZHkgYmUgbG9jYWxpemVkIHRvIHByb3BlciBsb2NhbGUuIGllOiBSZXNvdXJjZXMuZ2V0U3RyaW5nKCkgc2hvdWxkCi0JICogYWxyZWFkeSBoYXZlIGJlZW4gY2FsbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4KSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQltZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIGVycm9yU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssCi0JCQkJbWVzc2FnZSwgZXgpOwotCQlXZWJCcm93c2VyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2coZXJyb3JTdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgYSBXYXJuaW5nIG1lc3NhZ2Ugd2l0aCBhbiBleGNlcHRpb24uIE5vdGUgdGhhdCB0aGUgbWVzc2FnZSBzaG91bGQKLQkgKiBhbHJlYWR5IGJlIGxvY2FsaXplZCB0byBwcm9wZXIgbG9jYWwuIGllOiBSZXNvdXJjZXMuZ2V0U3RyaW5nKCkgc2hvdWxkCi0JICogYWxyZWFkeSBoYXZlIGJlZW4gY2FsbGVkCi0JICovCi0JLypwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKFdlYkJyb3dzZXJVSVBsdWdpbi5ERUJVRykgewotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLQkJCQltZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyB3YXJuaW5nU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFBMVUdJTl9JRCwKLQkJCQkJSVN0YXR1cy5PSywgbWVzc2FnZSwgbnVsbCk7Ci0JCQlXZWJCcm93c2VyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cod2FybmluZ1N0YXR1cyk7Ci0JCX0KLQl9Ki8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvV2ViQnJvd3NlclV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9XZWJCcm93c2VyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjQ5MzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9XZWJCcm93c2VyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHRoZSBXZWIgYnJvd3NlciB0b29scy4KLSAqLwotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJPV1NFUl9QQUNLQUdFX05BTUUgPSAib3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiBpc0ludGVybmFsQnJvd3Nlck9wZXJhdGlvbmFsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTVFlMRV9TRVAgPSAnLSc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TVFlMRSA9IEJyb3dzZXJWaWV3ZXIuQlVUVE9OX0JBUgotCQkJfCBCcm93c2VyVmlld2VyLkxPQ0FUSU9OX0JBUjsKLQotCS8qKgotCSAqIFdlYkJyb3dzZXJVdGlsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdlYkJyb3dzZXJVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB3ZSdyZSBydW5uaW5nIG9uIFdpbmRvd3MuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2luZG93cygpIHsKLQkJU3RyaW5nIG9zID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9zICE9IG51bGwgJiYgb3MudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ3aW4iKSA+PSAwKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB3ZSdyZSBydW5uaW5nIG9uIGxpbnV4LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xpbnV4KCkgewotCQlTdHJpbmcgb3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAob3MgIT0gbnVsbCAmJiBvcy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImxpbiIpID49IDApIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIGRpYWxvZyB3aW5kb3cuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCURpc3BsYXkgZCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZCA9PSBudWxsKQotCQkJZCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCi0JCVNoZWxsIHNoZWxsID0gZC5nZXRBY3RpdmVTaGVsbCgpOwotCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIGRpYWxvZyB3aW5kb3cuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3Blbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkID09IG51bGwpCi0JCQlkID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0KLQkJU2hlbGwgc2hlbGwgPSBkLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCBNZXNzYWdlcy5zZWFyY2hpbmdUYXNrTmFtZSwKLQkJCQltZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSB0aGUgaW50ZXJuYWwgYnJvd3NlciBvciBub3QsCi0JICogYmFzZWQgb24gd2hldGhlciBvciBub3QgdGhlIG9yZy5lY2xpcHNlLnN3dC5Ccm93c2VyIGNsYXNzIGNhbiBiZQotCSAqIGZvdW5kL2xvYWRlZC4gSWYgaXQgY2FuIGl0IG1lYW5zIGlzIGlzIHN1cHBvcnRlZCBvbiB0aGUgcGxhdGZvcm0gaW4gd2hpY2gKLQkgKiB0aGlzIHBsdWdpbiBpcyBydW5uaW5nLiBJZiBub3QsIGRpc2FibGUgdGhlIGFiaWxpdHkgdG8gdXNlIHRoZSBpbnRlcm5hbAotCSAqIGJyb3dzZXIuIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUgaWYgaXQgY2FuIG5ldyB1cCBhIG5ldwotCSAqIEV4dGVybmFsQnJvd3Nlckluc3RhbmNlLiBJZiB0aGUgU1dUIHdpZGdldCBjYW4gbm90IGJlIGJvdW5kIHRvIHRoZQotCSAqIHBhcnRpY3VsYXIgb3BlcmF0aW5nIHN5c3RlbSBpdCB0aHJvd3MgYW4gU1dURXhjZXB0aW9uLiBXZSBjYXRjaCB0aGF0IGFuZAotCSAqIHNldCBhIGJvb2xlYW4gZmxhZyB3aGljaCByZXByZXNlbnRzIHdoZXRoZXIgb3Igbm90IHdlIHdlcmUgc3VjY2Vzc2Z1bGx5Ci0JICogYWJsZSB0byBjcmVhdGUgYSBFeHRlcm5hbEJyb3dzZXJJbnN0YW5jZSBpbnN0YW5jZSBvciBub3QuIElmIG5vdCwgZG9uJ3QKLQkgKiBib3RoZXIgYWRkaW5nIHRoZSBJbnRlcm5hbCBXZWIgRXh0ZXJuYWxCcm93c2VySW5zdGFuY2UgdGhhdCB1c2VzIHRoaXMKLQkgKiB3aWRnZXQuIERlc2lnbmVkIHRvIGJlIGF0dGVtcGVkIG9ubHkgb25jZSBhbmQgdGhlIGZsYWcgc2V0IHVzZWQKLQkgKiB0aHJvdWdob3V0LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5Vc2VJbnRlcm5hbFdlYkJyb3dzZXIoKSB7Ci0JCS8vIGlmIHdlIGhhdmUgYWxyZWFkeSBmaWd1cmVkIHRoaXMgb3V0LCBkb24ndCBkbyBpdCBhZ2Fpbi4KLQkJaWYgKGlzSW50ZXJuYWxCcm93c2VyT3BlcmF0aW9uYWwgIT0gbnVsbCkKLQkJCXJldHVybiBpc0ludGVybmFsQnJvd3Nlck9wZXJhdGlvbmFsLmJvb2xlYW5WYWx1ZSgpOwotCi0JCS8vIGNoZWNrIGZvciB0aGUgY2xhc3MKLQkJdHJ5IHsKLQkJCUNsYXNzLmZvck5hbWUoQlJPV1NFUl9QQUNLQUdFX05BTUUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWlzSW50ZXJuYWxCcm93c2VyT3BlcmF0aW9uYWwgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyB0cnkgbG9hZGluZyBpdAotCQlTaGVsbCBzaGVsbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzaGVsbCA9IG5ldyBTaGVsbChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKSk7Ci0JCQluZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQkJaXNJbnRlcm5hbEJyb3dzZXJPcGVyYXRpb25hbCA9IG5ldyBCb29sZWFuKHRydWUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlXZWJCcm93c2VyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2coCi0JCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBXZWJCcm93c2VyVUlQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCTAsICJJbnRlcm5hbCBicm93c2VyIGlzIG5vdCBhdmFpbGFibGU6ICIgKyB0LmdldE1lc3NhZ2UoKSwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQlpc0ludGVybmFsQnJvd3Nlck9wZXJhdGlvbmFsID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHNoZWxsICE9IG51bGwpCi0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblVzZVN5c3RlbUJyb3dzZXIoKSB7Ci0JCS8vIERpc2FibGluZyBzeXN0ZW0gYnJvd3NlciBvbiBTb2xhcmlzIGR1ZSB0byBidWcgOTQ0OTcKLQkJaWYgKFBsYXRmb3JtLk9TX1NPTEFSSVMuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gUHJvZ3JhbS5maW5kUHJvZ3JhbSgiaHRtbCIpICE9IG51bGw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RXh0ZXJuYWxCcm93c2VyUGF0aHMoKSB7Ci0JCUxpc3QgcGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gQnJvd3Nlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRXZWJCcm93c2VycygpCi0JCQkJLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlCcm93c2VyRGVzY3JpcHRvciB3YiA9IChJQnJvd3NlckRlc2NyaXB0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh3YiAhPSBudWxsICYmIHdiLmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLQkJCQlwYXRocy5hZGQod2IuZ2V0TG9jYXRpb24oKS50b0xvd2VyQ2FzZSgpKTsKLQkJfQotCQlyZXR1cm4gcGF0aHM7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFueSBzdXBwb3J0ZWQgRVhURVJOQUwgd2ViIGJyb3dzZXJzIGZvdW5kIGFmdGVyIGFuIGFyYml0cmFyeSBjaGVjayBpbgotCSAqIHNwZWNpZmljIHBhdGhzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEZvdW5kQnJvd3NlcnMoTGlzdCBsaXN0KSB7Ci0JCUxpc3QgcGF0aHMgPSBnZXRFeHRlcm5hbEJyb3dzZXJQYXRocygpOwotCi0JCVN0cmluZyBvcyA9IFBsYXRmb3JtLmdldE9TKCk7Ci0JCUZpbGVbXSByb290cyA9IGdldFVzYWJsZURyaXZlcyhGaWxlLmxpc3RSb290cygpKTsKLQkJaW50IHJvb3RTaXplID0gcm9vdHMubGVuZ3RoOwotCi0JCS8vIE1hdGgubWluKHJvb3RzLmxlbmd0aCwgMik7IC8vIGp1c3QgY2hlY2sgdGhlIGZpcnN0IHR3byBkcml2ZXMKLQotCQlJQnJvd3NlckV4dFtdIGJyb3dzZXJzID0gV2ViQnJvd3NlclVJUGx1Z2luLmdldEJyb3dzZXJzKCk7Ci0JCWludCBzaXplID0gYnJvd3NlcnMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGJyb3dzZXJzW2ldLmdldERlZmF1bHRMb2NhdGlvbnMoKSAhPSBudWxsCi0JCQkJCSYmIGJyb3dzZXJzW2ldLmdldE9TKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKG9zKSA+PSAwKSB7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCByb290U2l6ZTsgaysrKSB7Ci0JCQkJCWludCBzaXplMiA9IGJyb3dzZXJzW2ldLmdldERlZmF1bHRMb2NhdGlvbnMoKS5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gYnJvd3NlcnNbaV0uZ2V0RGVmYXVsdExvY2F0aW9ucygpW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShyb290c1trXSwgbG9jYXRpb24pOwotCQkJCQkJCWlmICghcGF0aHMuY29udGFpbnMoZi5nZXRBYnNvbHV0ZVBhdGgoKQotCQkJCQkJCQkJLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJCQkJCWlmIChmLmV4aXN0cygpKSB7Ci0JCQkJCQkJCQlCcm93c2VyRGVzY3JpcHRvciBicm93c2VyID0gbmV3IEJyb3dzZXJEZXNjcmlwdG9yKCk7Ci0JCQkJCQkJCQlicm93c2VyLm5hbWUgPSBicm93c2Vyc1tpXS5nZXROYW1lKCk7Ci0JCQkJCQkJCQlicm93c2VyLmxvY2F0aW9uID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJCQkJCWJyb3dzZXIucGFyYW1ldGVycyA9IGJyb3dzZXJzW2ldCi0JCQkJCQkJCQkJCS5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQkJCQkJCQlsaXN0LmFkZChicm93c2VyKTsKLQkJCQkJCQkJCWogKz0gc2l6ZTI7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIGdldFVzYWJsZURyaXZlcyhGaWxlW10gcm9vdHMpIHsKLQkJaWYgKCFQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5PU19XSU4zMikpCi0JCQlyZXR1cm4gcm9vdHM7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IHJvb3RzW2ldLmdldEFic29sdXRlUGF0aCgpOwotCQkJaWYgKHBhdGggIT0gbnVsbAotCQkJCQkmJiAocGF0aC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImE6IikgfHwgcGF0aC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImI6IikpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQljb250aW51ZTsKLQkJCWxpc3QuYWRkKHJvb3RzW2ldKTsKLQkJfQotCQlyZXR1cm4gKEZpbGVbXSkgbGlzdC50b0FycmF5KG5ldyBGaWxlW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGV4dGVybmFsIFdlYiBicm93c2VyIGlmIHRoZSBmaWxlIG1hdGNoZXMgdGhlIGRlZmF1bHQgKGtub3duKQotCSAqIGJyb3dzZXJzLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiBhbiBleHRlcm5hbCBicm93c2VyIHdvcmtpbmcgY29weQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUJyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkgY3JlYXRlRXh0ZXJuYWxCcm93c2VyKEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmlzRmlsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGV4ZWN1dGFibGUgPSBmaWxlLmdldE5hbWUoKTsKLQkJSUJyb3dzZXJFeHRbXSBicm93c2VycyA9IFdlYkJyb3dzZXJVSVBsdWdpbi5nZXRCcm93c2VycygpOwotCQlpbnQgc2l6ZSA9IGJyb3dzZXJzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChleGVjdXRhYmxlLmVxdWFscyhicm93c2Vyc1tpXS5nZXRFeGVjdXRhYmxlKCkpKSB7Ci0JCQkJSUJyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkgYnJvd3NlciA9IEJyb3dzZXJNYW5hZ2VyCi0JCQkJCQkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVFeHRlcm5hbFdlYkJyb3dzZXIoKTsKLQkJCQlicm93c2VyLnNldE5hbWUoYnJvd3NlcnNbaV0uZ2V0TmFtZSgpKTsKLQkJCQlicm93c2VyLnNldExvY2F0aW9uKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCWJyb3dzZXIuc2V0UGFyYW1ldGVycyhicm93c2Vyc1tpXS5nZXRQYXJhbWV0ZXJzKCkpOwotCQkJCXJldHVybiBicm93c2VyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRW5jb2RlcyBicm93c2VyIHN0eWxlIGluIHRoZSBzZWNvbmRhcnkgaWQgYXMgaWQtc3R5bGUKLQkgKiAKLQkgKiBAcGFyYW0gYnJvd3NlcklkCi0JICogQHBhcmFtIHN0eWxlCi0JICogQHJldHVybiBzZWNvbmRhcnlJZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZVN0eWxlKFN0cmluZyBicm93c2VySWQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gYnJvd3NlcklkICsgU1RZTEVfU0VQICsgc3R5bGU7Ci0JfQotCi0JLyoqCi0JICogRGVjb2RlcyBzZWNvbmRhcnkgaWQgaW50byBhIGJyb3dzZXIgc3R5bGUuCi0JICogCi0JICogQHBhcmFtIHNlY29uZGFyeUlkCi0JICogQHJldHVybiBzdHlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRlY29kZVN0eWxlKFN0cmluZyBzZWNvbmRhcnlJZCkgewotCQlpZiAoc2Vjb25kYXJ5SWQgIT0gbnVsbCkgewotCQkJaW50IHNlcCA9IHNlY29uZGFyeUlkLmxhc3RJbmRleE9mKFNUWUxFX1NFUCk7Ci0JCQlpZiAoc2VwICE9IC0xKSB7Ci0JCQkJU3RyaW5nIHN0b2tlbiA9IHNlY29uZGFyeUlkLnN1YnN0cmluZyhzZXAgKyAxKTsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChzdG9rZW4pOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gREVGQVVMVF9TVFlMRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVJZChTdHJpbmcgZW5jb2RlZElkKSB7Ci0JCWludCBzZXAgPSBlbmNvZGVkSWQubGFzdEluZGV4T2YoU1RZTEVfU0VQKTsKLQkJaWYgKHNlcCAhPSAtMSkgewotCQkJcmV0dXJuIGVuY29kZWRJZC5zdWJzdHJpbmcoMCwgc2VwKTsKLQkJfQotCQlyZXR1cm4gZW5jb2RlZElkOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvV2ViQnJvd3NlclZpZXcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9XZWJCcm93c2VyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzI3MTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9XZWJCcm93c2VyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXb3JrYmVuY2hCcm93c2VyU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotLyoqCi0gKiBBIFdlYiBicm93c2VyIHZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJWaWV3IGV4dGVuZHMgVmlld1BhcnQgaW1wbGVtZW50cwotCQlJQnJvd3NlclZpZXdlckNvbnRhaW5lciwgSVNldFNlbGVjdGlvblRhcmdldCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0JST1dTRVJfVklFV19JRCA9ICJvcmcuZWNsaXBzZS51aS5icm93c2VyLnZpZXciOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgQnJvd3NlclZpZXdlciB2aWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbnQgc3R5bGUgPSBXZWJCcm93c2VyVXRpbC5kZWNvZGVTdHlsZShnZXRWaWV3U2l0ZSgpLmdldFNlY29uZGFyeUlkKCkpOwotCQl2aWV3ZXIgPSBuZXcgQnJvd3NlclZpZXdlcihwYXJlbnQsIHN0eWxlKTsKLQkJdmlld2VyLnNldENvbnRhaW5lcih0aGlzKTsKLQotCQkvKgotCQkgKiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBuZXcKLQkJICogUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsgcHVibGljIHZvaWQKLQkJICogcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeyBpZgotCQkgKiAoQnJvd3NlclZpZXdlci5QUk9QRVJUWV9USVRMRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCSAqIHNldFBhcnROYW1lKChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOyB9IH0gfTsKLQkJICogdmlld2VyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCSAqLwotCQlpbml0RHJhZ0FuZERyb3AoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodmlld2VyIT1udWxsKQotCQkJdmlld2VyLnNldENvbnRhaW5lcihudWxsKTsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQlyZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdXJsKSB7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCkKLQkJCXZpZXdlci5zZXRVUkwodXJsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJdmlld2VyLnNldEZvY3VzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCXRyeSB7Ci0JCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmhpZGVWaWV3KHRoaXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKLQkJcmV0dXJuIGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW5JbkV4dGVybmFsQnJvd3NlcihTdHJpbmcgdXJsKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgdGhlVVJMID0gbmV3IFVSTCh1cmwpOwotCQkJSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IHN1cHBvcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRCcm93c2VyU3VwcG9ydCgpOwotCQkJc3VwcG9ydC5nZXRFeHRlcm5hbEJyb3dzZXIoKS5vcGVuVVJMKHRoZVVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIGhhbmRsZSB0aGlzCi0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gaGFuZGxlIHRoaXMKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlsaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsCi0JCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJb25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfTsKLQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKQotCQkJCS5hZGRQb3N0U2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgb25TZWxlY3Rpb25DaGFuZ2UoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJT2JqZWN0IG9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCUlBZGFwdGFibGUgYWRhcHQgPSAoSUFkYXB0YWJsZSkgb2JqOwotCQkJVVJMIHVybCA9IGdldFVSTEZyb21BZGFwdGFibGUoYWRhcHQpOwotCQkJaWYgKHVybCE9bnVsbCkKLQkJCQlzZXRVUkwodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgVVJMIGdldFVSTEZyb21BZGFwdGFibGUoSUFkYXB0YWJsZSBhZGFwdCkgewotCQkvLyB0ZXN0IGZvciBwYXRoCi0JCUlQYXRoIHBhdGggPSAoSVBhdGgpIGFkYXB0LmdldEFkYXB0ZXIoSVBhdGguY2xhc3MpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlGaWxlIGZpbGUgPSBwYXRoLnRvRmlsZSgpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgaXNXZWJGaWxlKGZpbGUuZ2V0TmFtZSgpKSkKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gZmlsZS50b1VSTCgpOwotCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gKFVSTClhZGFwdC5nZXRBZGFwdGVyKFVSTC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpCi0JCQkJLnJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWxpc3RlbmVyID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZW5hbWUgaGFzIGEgIndlYiIgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV2ViRmlsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS5lbmRzV2l0aCgiaHRtbCIpIHx8IG5hbWUuZW5kc1dpdGgoImh0bSIpIHx8IG5hbWUuZW5kc1dpdGgoImdpZiIpIHx8IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJbmFtZS5lbmRzV2l0aCgianBnIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGRyYWcgYW5kIGRyb3Agc3VwcG9ydCB0byB0aGUgdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RHJhZ0FuZERyb3AoKSB7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10gewotCQkvLyBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCksCi0JCS8vIFJlc291cmNlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkJRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLQotCQlEcm9wVGFyZ2V0IGRyb3BUYXJnZXQgPSBuZXcgRHJvcFRhcmdldCh2aWV3ZXIsIERORC5EUk9QX0NPUFkKLQkJCQl8IERORC5EUk9QX0RFRkFVTFQpOwotCQlkcm9wVGFyZ2V0LnNldFRyYW5zZmVyKHRyYW5zZmVycyk7Ci0JCWRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBXZWJCcm93c2VyVmlld0Ryb3BBZGFwdGVyKHZpZXdlcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdFJldmVhbChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlvblNlbGVjdGlvbkNoYW5nZShzZWxlY3Rpb24pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvV2ViQnJvd3NlclZpZXdEcm9wQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL1dlYkJyb3dzZXJWaWV3RHJvcEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkMTFmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvV2ViQnJvd3NlclZpZXdEcm9wQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyVmlld0Ryb3BBZGFwdGVyIGV4dGVuZHMgRHJvcFRhcmdldEFkYXB0ZXIgewotICAgLyoqCi0gICAgKiBUaGUgdmlldyB0byB3aGljaCB0aGlzIGRyb3Agc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4KLSAgICAqLwotICAgcHJpdmF0ZSBCcm93c2VyVmlld2VyIHZpZXc7Ci0KLSAgIC8qKgotICAgICogVGhlIGN1cnJlbnQgb3BlcmF0aW9uLgotICAgICovCi0gICBwcml2YXRlIGludCBjdXJyZW50T3BlcmF0aW9uID0gRE5ELkRST1BfTk9ORTsKLQotICAgLyoqCi0gICAgKiBUaGUgbGFzdCB2YWxpZCBvcGVyYXRpb24uCi0gICAgKi8KLSAgIHByaXZhdGUgaW50IGxhc3RWYWxpZE9wZXJhdGlvbiA9IERORC5EUk9QX05PTkU7Ci0gICAKLSAgIHByb3RlY3RlZCBXZWJCcm93c2VyVmlld0Ryb3BBZGFwdGVyKEJyb3dzZXJWaWV3ZXIgdmlldykgewotCQl0aGlzLnZpZXcgPSB2aWV3OwotCX0KLQotICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERyb3BUYXJnZXRBZGFwdGVyLgotICAgICogVGhlIG1vdXNlIGhhcyBtb3ZlZCBvdmVyIHRoZSBkcm9wIHRhcmdldC4gIElmIHRoZQotICAgICogdGFyZ2V0IGl0ZW0gaGFzIGNoYW5nZWQsIG5vdGlmeSB0aGUgYWN0aW9uIGFuZCBjaGVjawotICAgICogdGhhdCBpdCBpcyBzdGlsbCBlbmFibGVkLgotICAgICovCi0gICBwcml2YXRlIHZvaWQgZG9Ecm9wVmFsaWRhdGlvbihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLSAgICAgICAvL3VwZGF0ZSBsYXN0IHZhbGlkIG9wZXJhdGlvbgotICAgICAgIGlmIChldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfTk9ORSkKLSAgICAgICAgICAgbGFzdFZhbGlkT3BlcmF0aW9uID0gZXZlbnQuZGV0YWlsOwotICAgICAgIAotICAgICAgIC8vdmFsaWQgZHJvcCBhbmQgc2V0IGV2ZW50IGRldGFpbCBhY2NvcmRpbmdseQotICAgICAgIGlmICh2YWxpZGF0ZURyb3AoZXZlbnQuZGV0YWlsLCBldmVudC5jdXJyZW50RGF0YVR5cGUpKQotICAgICAgICAgICBjdXJyZW50T3BlcmF0aW9uID0gbGFzdFZhbGlkT3BlcmF0aW9uOwotICAgICAgIGVsc2UKLSAgICAgICAgICAgY3VycmVudE9wZXJhdGlvbiA9IERORC5EUk9QX05PTkU7Ci0gICAgICAgCi0gICAgICAgZXZlbnQuZGV0YWlsID0gY3VycmVudE9wZXJhdGlvbjsKLSAgIH0KLQotICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERyb3BUYXJnZXRBZGFwdGVyLgotICAgICogVGhlIGRyb3Agb3BlcmF0aW9uIGhhcyBjaGFuZ2VkLCBzZWUgaWYgdGhlIGFjdGlvbgotICAgICogc2hvdWxkIHN0aWxsIGJlIGVuYWJsZWQuCi0gICAgKi8KLSAgIHB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotICAgICAgIGRvRHJvcFZhbGlkYXRpb24oZXZlbnQpOwotICAgfQotCi0gICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRHJvcFRhcmdldEFkYXB0ZXIuCi0gICAgKiBUaGUgbW91c2UgaGFzIG1vdmVkIG92ZXIgdGhlIGRyb3AgdGFyZ2V0LiAgSWYgdGhlCi0gICAgKiB0YXJnZXQgaXRlbSBoYXMgY2hhbmdlZCwgbm90aWZ5IHRoZSBhY3Rpb24gYW5kIGNoZWNrCi0gICAgKiB0aGF0IGl0IGlzIHN0aWxsIGVuYWJsZWQuCi0gICAgKi8KLSAgIHB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotICAgICAgIC8vc2V0IHRoZSBsb2NhdGlvbiBmZWVkYmFjawotICAgCSBldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0KLSAgICAgICAvL3NlZSBpZiBhbnl0aGluZyBoYXMgcmVhbGx5IGNoYW5nZWQgYmVmb3JlIGRvaW5nIHZhbGlkYXRpb24uCi0gICAgICAgZG9Ecm9wVmFsaWRhdGlvbihldmVudCk7Ci0gICB9Ci0KLSAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEcm9wVGFyZ2V0QWRhcHRlci4KLSAgICAqIFRoZSB1c2VyIGhhcyBkcm9wcGVkIHNvbWV0aGluZyBvbiB0aGUgZGVza3RvcCB2aWV3ZXIuCi0gICAgKi8KLSAgIHB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgLy9wZXJmb3JtIHRoZSBkcm9wIGJlaGF2aW91cgotICAgICAgIGlmICghcGVyZm9ybURyb3AoZXZlbnQuZGF0YSkpCi0gICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0gICAgICAgCi0gICAgICAgY3VycmVudE9wZXJhdGlvbiA9IGV2ZW50LmRldGFpbDsKLSAgIH0KLQotICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERyb3BUYXJnZXRBZGFwdGVyLgotICAgICogTGFzdCBjaGFuY2UgZm9yIHRoZSBhY3Rpb24gdG8gZGlzYWJsZSBpdHNlbGYKLSAgICAqLwotICAgcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLSAgICAgICBpZiAoIXZhbGlkYXRlRHJvcChldmVudC5kZXRhaWwsIGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpCi0gICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0gICB9Ci0KLQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0KLSAgICAgICBkb0Ryb3BWYWxpZGF0aW9uKGV2ZW50KTsKLQl9Ci0KLQkvKioKLSAgICAqIFBlcmZvcm1zIGFueSB3b3JrIGFzc29jaWF0ZWQgd2l0aCB0aGUgZHJvcC4KLSAgICAqIDxwPgotICAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGRyb3AgYmVoYXZpb3IuCi0gICAgKiA8L3A+Ci0gICAgKgotICAgICogQHBhcmFtIGRhdGEgdGhlIGRyb3AgZGF0YQotICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZHJvcCB3YXMgc3VjY2Vzc2Z1bCwgYW5kIAotICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwZXJmb3JtRHJvcChPYmplY3QgZGF0YSkgewotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7Ci0JCQlTdHJpbmdbXSBzID0gKFN0cmluZ1tdKSBkYXRhOwotCQkJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiB0cnVlOwotCQkJRmlsZSBmID0gbmV3IEZpbGUoc1swXSk7Ci0JCQl0cnkgewotCQkJCXZpZXcuc2V0VVJMKGYudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLSAgICAqIFZhbGlkYXRlcyBkcm9wcGluZyBvbiB0aGUgZ2l2ZW4gb2JqZWN0LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgc29tZSAKLSAgICAqIGFzcGVjdCBvZiB0aGUgZHJvcCBvcGVyYXRpb24gY2hhbmdlcy4KLSAgICAqIDxwPgotICAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBkZWZpbmUgd2hpY2ggZHJvcHMgbWFrZSBzZW5zZS4KLSAgICAqIDwvcD4KLSAgICAqIAotICAgICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRoYXQgdGhlIG1vdXNlIGlzIGN1cnJlbnRseSBob3ZlcmluZyBvdmVyLCBvcgotICAgICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbW91c2UgaXMgaG92ZXJpbmcgb3ZlciBlbXB0eSBzcGFjZQotICAgICogQHBhcmFtIG9wZXJhdGlvbiB0aGUgY3VycmVudCBkcmFnIG9wZXJhdGlvbiAoY29weSwgbW92ZSwgZXRjLikKLSAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIGN1cnJlbnQgdHJhbnNmZXIgdHlwZQotICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZHJvcCBpcyB2YWxpZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICogICBvdGhlcndpc2UKLSAgICAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRHJvcChpbnQgb3BlcmF0aW9uLCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKSB7Ci0JCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkKLQkJCXJldHVybiB0cnVlOwotCQkvKmlmIChSZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkKLQkJCXJldHVybiB0cnVlOyovCi0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9icm93c2Vycy9Ccm93c2VyTG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvYnJvd3NlcnMvQnJvd3NlckxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzZlN2RhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9icm93c2Vycy9Ccm93c2VyTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuYnJvd3NlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJVSVBsdWdpbjsKLS8qKgotICogTG9nIGZvciBtZXNzYWdlcyBvdXRwdXQgYnkgZXh0ZXJuYWwgYnJvd3NlciBwcm9jZXNzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2VyTG9nIHsKLQlwcml2YXRlIHN0YXRpYyBCcm93c2VyTG9nIGluc3RhbmNlOwotCXByaXZhdGUgU3RyaW5nIGxvZ0ZpbGVOYW1lOwotCXByaXZhdGUgYm9vbGVhbiBuZXdTZXNzaW9uOwotCURhdGVGb3JtYXQgZm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NTSBkZCwgeXl5eSBrazptbTpzcy5TUyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIExOID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIEJyb3dzZXJMb2coKSB7Ci0JCXRyeSB7Ci0JCQluZXdTZXNzaW9uID0gdHJ1ZTsKLQkJCWxvZ0ZpbGVOYW1lID0gV2ViQnJvd3NlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgiYnJvd3Nlci5sb2ciKS50b09TU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGNhbiBnZXQgaGVyZSBpZiBwbGF0Zm9ybSBpcyBzaHV0dGluZyBkb3duCi0JCX0KLQl9Ci0JLyoqCi0JICogT2J0YWlucyBzaW5nbGV0b24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBCcm93c2VyTG9nIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQnJvd3NlckxvZygpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JLyoqCi0JICogQXBwZW5kcyBhIGxpbmUgdG8gdGhlIGJyb3dzZXIubG9nCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZ2V0SW5zdGFuY2UoKS5hcHBlbmQobWVzc2FnZSk7Ci0JfQotCXByaXZhdGUgdm9pZCBhcHBlbmQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKGxvZ0ZpbGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlXcml0ZXIgb3V0V3JpdGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW91dFdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShsb2dGaWxlTmFtZSwgdHJ1ZSksICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG5ld1Nlc3Npb24pIHsKLQkJCQluZXdTZXNzaW9uID0gZmFsc2U7Ci0JCQkJb3V0V3JpdGVyLndyaXRlKExOICsgZm9ybWF0dGVyLmZvcm1hdChuZXcgRGF0ZSgpKQotCQkJCQkJKyAiIE5FVyBTRVNTSU9OIiArIExOKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJb3V0V3JpdGVyLndyaXRlKGZvcm1hdHRlci5mb3JtYXQobmV3IERhdGUoKSkgKyAiICIgKyBtZXNzYWdlICsgTE4pOyAvLyROT04tTkxTLTEkCi0JCQlvdXRXcml0ZXIuZmx1c2goKTsKLQkJCW91dFdyaXRlci5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKG91dFdyaXRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb3V0V3JpdGVyLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9icm93c2Vycy9EZWZhdWx0QnJvd3Nlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL2Jyb3dzZXJzL0RlZmF1bHRCcm93c2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZTNiZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL2Jyb3dzZXJzL0RlZmF1bHRCcm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLmJyb3dzZXJzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuQWJzdHJhY3RXZWJCcm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJVSVBsdWdpbjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QnJvd3NlciBleHRlbmRzIEFic3RyYWN0V2ViQnJvd3NlciB7Ci0JcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtZXRlcnM7Ci0JCi0JcHVibGljIERlZmF1bHRCcm93c2VyKFN0cmluZyBpZCwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgcGFyYW1ldGVycykgewotCQlzdXBlcihpZCk7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmhlbHAuYnJvd3Nlci5JQnJvd3NlciNkaXNwbGF5VVJMKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgb3BlblVSTChVUkwgdXJsMikgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVybCA9IHVybDIudG9FeHRlcm5hbEZvcm0oKTsKLQkJU3RyaW5nIHBhdGggPSBsb2NhdGlvbjsKLQotCQlTdHJpbmdbXSBjb21tYW5kID0gcHJlcGFyZUNvbW1hbmQocGF0aCwgdXJsKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJDb21tYW5kOiAiICsgY29tbWFuZCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJUHJvY2VzcyBwciA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZCk7Ci0JCQlUaHJlYWQgb3V0Q29uc3VtZXIgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHIuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQlvdXRDb25zdW1lci5zZXROYW1lKCJDdXN0b20gYnJvd3NlciBhZGFwdGVyIG91dHB1dCByZWFkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0Q29uc3VtZXIuc3RhcnQoKTsKLQkJCVRocmVhZCBlcnJDb25zdW1lciA9IG5ldyBTdHJlYW1Db25zdW1lcihwci5nZXRFcnJvclN0cmVhbSgpKTsKLQkJCWVyckNvbnN1bWVyLnNldE5hbWUoIkN1c3RvbSBicm93c2VyIGFkYXB0ZXIgZXJyb3IgcmVhZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVyckNvbnN1bWVyLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlXZWJCcm93c2VyVUlQbHVnaW4ubG9nRXJyb3IoCi0JCQkJIkxhdW5jaGluZyBVUkwgXCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyB1cmwKLQkJCQkJKyAiXCIgdXNpbmcgYnJvd3NlciBwcm9ncmFtIFwiIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgcGF0aAotCQkJCQkrICJcIiBoYXMgZmFpbGVkLiAgU3BlY2lmeSBhbm90aGVyIGJyb3dzZXIgaW4gaGVscCBwcmVmZXJlbmNlcy4iLCAvLyROT04tTkxTLTEkCi0JCQkJCWUpOwotCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMYXVuY2hXZWJCcm93c2VyLCBwYXRoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmaW5hbCBjb21tYW5kIHRvIGxhdW5jaC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIFN0cmluZ1tdCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIHByZXBhcmVDb21tYW5kKFN0cmluZyBwYXRoLCBTdHJpbmcgdXJsKSB7Ci0JCUFycmF5TGlzdCB0b2tlbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vRGl2aWRlIGFsb25nIHF1b3RhdGlvbiBtYXJrcwotCQlTdHJpbmdUb2tlbml6ZXIgcVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0aC50cmltKCksCi0JCQkiXCIiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHdpdGhpblF1b3RhdGlvbiA9IGZhbHNlOwotCQlTdHJpbmcgcXVvdGVkU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHFUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgY3VyVG9rZW4gPSBxVG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKGN1clRva2VuLmVxdWFscygiXCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHdpdGhpblF1b3RhdGlvbikgewotCQkJCQlpZiAoQ29uc3RhbnRzLk9TX1dJTjMyLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0T1MoKSkpIHsKLQkJCQkJCS8vIG5lZWQgdG8gcXVvdGUgVVJMcyBvbiBXaW5kb3dzCi0JCQkJCQl0b2tlbkxpc3QuYWRkKCJcIiIgKyBxdW90ZWRTdHJpbmcgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBxdW90ZXMgcHJldmVudCBsYXVuY2hpbmcgb24gVW5peCAzNTY3MwotCQkJCQkJdG9rZW5MaXN0LmFkZChxdW90ZWRTdHJpbmcpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcXVvdGVkU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJd2l0aGluUXVvdGF0aW9uID0gIXdpdGhpblF1b3RhdGlvbjsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAod2l0aGluUXVvdGF0aW9uKSB7Ci0JCQkJcXVvdGVkU3RyaW5nID0gY3VyVG9rZW47Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgewotCQkJCS8vZGl2aWRlIHVucXVvdGVkIHN0cmluZ3MgYWxvbmcgd2hpdGUgc3BhY2UKLQkJCQlTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjdXJUb2tlbi50cmltKCkpOwotCQkJCXdoaWxlIChwYXJzZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCXRva2VuTGlzdC5hZGQocGFyc2VyLm5leHRUb2tlbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gc3Vic3RpdHV0ZSAlMSBieSB1cmwKLQkJYm9vbGVhbiBzdWJzdGl0dXRlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2VuTGlzdC5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIHRva2VuID0gKFN0cmluZykgdG9rZW5MaXN0LmdldChpKTsKLQkJCVN0cmluZyBuZXdUb2tlbiA9IGRvU3Vic3RpdHV0aW9ucyh0b2tlbiwgdXJsKTsKLQkJCWlmIChuZXdUb2tlbiAhPSBudWxsKSB7Ci0JCQkJdG9rZW5MaXN0LnNldChpLCBuZXdUb2tlbik7Ci0JCQkJc3Vic3RpdHV0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGFkZCB0aGUgdXJsIGlmIG5vdCBzdWJzdGl0dXRlZCBhbHJlYWR5Ci0JCWlmICghc3Vic3RpdHV0ZWQpCi0JCQl0b2tlbkxpc3QuYWRkKHVybCk7Ci0KLQkJU3RyaW5nW10gY29tbWFuZCA9IG5ldyBTdHJpbmdbdG9rZW5MaXN0LnNpemUoKV07Ci0JCXRva2VuTGlzdC50b0FycmF5KGNvbW1hbmQpOwotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0JCi0JLyoqCi0JICogUmVwbGFjZXMgYW55IG9jY3VycmVuY2VzIG9mIDxjb2RlPiIlMSI8L2NvZGU+IG9yIDxjb2RlPiUxPC9jb2RlPiB3aXRoCi0JICogdGhlIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiAgICAgICAgICAgIFRoZSB0b2tlbiBpbiB3aGljaCB0aGUgc3Vic3RpdHV0aW9ucyBzaG91bGQgYmUgbWFkZTsgbXVzdCBub3QKLQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gVGhlIHN1YnN0aXR1dGVkIHN0cmluZywgaWYgYSBzdWJzdGl0dXRpb24gaXMgbWFkZTsKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1YnN0aXR1dGlvbiBpcyBtYWRlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZG9TdWJzdGl0dXRpb25zKFN0cmluZyB0b2tlbiwgU3RyaW5nIHVybCkgewotCQlib29sZWFuIHN1YnN0aXR1dGVkID0gZmFsc2U7Ci0JCVN0cmluZ0J1ZmZlciBuZXdUb2tlbiA9IG5ldyBTdHJpbmdCdWZmZXIodG9rZW4pOwotCQlTdHJpbmcgc3Vic3RpdHV0aW9uTWFya2VyID0gIiUxIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaW5kZXggPSBuZXdUb2tlbi5pbmRleE9mKHN1YnN0aXR1dGlvbk1hcmtlcik7Ci0JCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJbmV3VG9rZW4ucmVwbGFjZShpbmRleCwgaW5kZXggKyBzdWJzdGl0dXRpb25NYXJrZXIubGVuZ3RoKCksIHVybCk7Ci0JCQlpbmRleCA9IG5ld1Rva2VuLmluZGV4T2Yoc3Vic3RpdHV0aW9uTWFya2VyLCBpbmRleCArIHVybC5sZW5ndGgoKSk7Ci0JCQlzdWJzdGl0dXRlZCA9IHRydWU7Ci0JCX0KLQotCQlpZiAoc3Vic3RpdHV0ZWQpIHsKLQkJCXJldHVybiBuZXdUb2tlbi50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9icm93c2Vycy9EZWZhdWx0QnJvd3NlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9icm93c2Vycy9EZWZhdWx0QnJvd3NlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyNzViOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvYnJvd3NlcnMvRGVmYXVsdEJyb3dzZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuYnJvd3NlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLkJyb3dzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci0vKioKLSAqIFByb2R1Y2VzIEN1c3RvbSBCcm93c2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QnJvd3NlckZhY3RvcnkgZXh0ZW5kcyBCcm93c2VyRmFjdG9yeSB7Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5icm93c2VyLnByb3Zpc2lvbmFsLkJyb3dzZXJGYWN0b3J5I2NyZWF0ZUJyb3dzZXIoKQotCSAqLwotCXB1YmxpYyBJV2ViQnJvd3NlciBjcmVhdGVCcm93c2VyKFN0cmluZyBpZCwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgcGFyYW1ldGVycykgewotCQlyZXR1cm4gbmV3IERlZmF1bHRCcm93c2VyKGlkLCBsb2NhdGlvbiwgcGFyYW1ldGVycyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9icm93c2Vycy9Nb3ppbGxhQnJvd3Nlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL2Jyb3dzZXJzL01vemlsbGFCcm93c2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjM4YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL2Jyb3dzZXJzL01vemlsbGFCcm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLmJyb3dzZXJzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLkFic3RyYWN0V2ViQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJVSVBsdWdpbjsKLS8qKgotICogQnJvd3NlciBhZGFwdGVyIGZvciBicm93c2VycyBzdXBwb3J0aW5nIC1yZW1vdGUgb3BlblVSTCBjb21tYW5kIGxpbmUgb3B0aW9uCi0gKiBpLmUuIE1vemlsbGEgYW5kIE5ldHNjYXBlLgotICovCi1wdWJsaWMgY2xhc3MgTW96aWxsYUJyb3dzZXIgZXh0ZW5kcyBBYnN0cmFjdFdlYkJyb3dzZXIgewotCS8vIGRlbGF5IHRoYXQgaXQgdGFrZXMgbW96aWxsYSB0byBzdGFydCByZXNwb25kaW5nCi0JLy8gdG8gcmVtb3RlIGNvbW1hbmQgYWZ0ZXIgbW96aWxsYSBoYXMgYmVlbiBjYWxsZWQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERUxBWSA9IDUwMDA7Ci0KLQlwcm90ZWN0ZWQgbG9uZyBicm93c2VyRnVsbHlPcGVuZWRBdCA9IDA7Ci0KLQlwcml2YXRlIEJyb3dzZXJUaHJlYWQgbGFzdEJyb3dzZXJUaHJlYWQgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBleGVjdXRhYmxlOwotCQotCXByb3RlY3RlZCBib29sZWFuIGZpcnN0TGF1bmNoID0gdHJ1ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogCi0JICogQGV4ZWN1dGFibGUgZXhlY3V0YWJsZSBmaWxlbmFtZSB0byBsYXVuY2gKLQkgKiBAZXhlY3V0YWJsZU5hbWUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byBkaXNwbGF5IHdoZW4gZXJyb3Igb2NjdXJzCi0JICovCi0JcHVibGljIE1vemlsbGFCcm93c2VyKFN0cmluZyBpZCwgU3RyaW5nIGV4ZWN1dGFibGUpIHsKLQkJc3VwZXIoaWQpOwotCQl0aGlzLmV4ZWN1dGFibGUgPSBleGVjdXRhYmxlOwotCX0KLQotCS8qCi0JICogQHNlZSBJQnJvd3NlciNkaXNwbGF5VVJMKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuVVJMKFVSTCB1cmwyKSB7Ci0JCVN0cmluZyB1cmwgPSB1cmwyLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCWlmIChsYXN0QnJvd3NlclRocmVhZCAhPSBudWxsKQotCQkJbGFzdEJyb3dzZXJUaHJlYWQuZXhpdFJlcXVlc3RlZCA9IHRydWU7Ci0KLQkJbGFzdEJyb3dzZXJUaHJlYWQgPSBuZXcgQnJvd3NlclRocmVhZCh1cmwpOwotCQlsYXN0QnJvd3NlclRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCWxhc3RCcm93c2VyVGhyZWFkLnN0YXJ0KCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBCcm93c2VyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJcHVibGljIGJvb2xlYW4gZXhpdFJlcXVlc3RlZCA9IGZhbHNlOwotCi0JCXByaXZhdGUgU3RyaW5nIHVybDsKLQotCQlwdWJsaWMgQnJvd3NlclRocmVhZChTdHJpbmcgdXJsTmFtZSkgewotCQkJdGhpcy51cmwgPSB1cmxOYW1lOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBicm93c2VyQ21kCi0JCSAqIEByZXR1cm4gaW50IDAgaWYgc3VjY2VzcwotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgb3BlbkJyb3dzZXIoU3RyaW5nIGJyb3dzZXJDbWQpIHsKLQkJCXRyeSB7Ci0JCQkJUHJvY2VzcyBwciA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoYnJvd3NlckNtZCk7Ci0JCQkJU3RyZWFtQ29uc3VtZXIgb3V0cHV0cyA9IG5ldyBTdHJlYW1Db25zdW1lcihwci5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCQkob3V0cHV0cykuc3RhcnQoKTsKLQkJCQlTdHJlYW1Db25zdW1lciBlcnJvcnMgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHIuZ2V0RXJyb3JTdHJlYW0oKSk7Ci0JCQkJKGVycm9ycykuc3RhcnQoKTsKLQkJCQlwci53YWl0Rm9yKCk7Ci0JCQkJaW50IHJldCA9IHByLmV4aXRWYWx1ZSgpOwotCi0JCQkJaWYgKHJldCA9PSAwICYmIGVycm9yc0luT3V0cHV0KG91dHB1dHMsIGVycm9ycykpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0OwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVdlYkJyb3dzZXJVSVBsdWdpbi5sb2dFcnJvcigiTGF1bmNoaW5nICIgKyBleGVjdXRhYmxlIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiIGhhcyBmYWlsZWQuIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBUT0RPOiBsb2cgZXJyb3IKLQkJCQkvKlN0cmluZyBtc2cgPSBIZWxwQmFzZVJlc291cmNlcy5nZXRTdHJpbmcoCi0JCQkJCQkiTW96aWxsYUJyb3dzZXIuZXhlY3V0ZUZhaWxlZCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWV4ZWN1dGFibGVOYW1lKTsKLQkJCQlCYXNlSGVscFN5c3RlbS5nZXREZWZhdWx0RXJyb3JVdGlsKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IobXNnLCB1aVRocmVhZCk7Ki8KLQkJCQkvLyByZXR1cm4gc3VjY2Vzcywgc28gc2Vjb25kIGNvbW1hbmQgZG9lcyBub3QgZXhlY3V0ZQotCQkJCXJldHVybiAwOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJLyoqCi0JCSAqIE9uIHNvbWUgT1NlcyAwIGlzIGFsd2F5cyByZXR1cm5lZCBieSBuZXRzY2FwZSAtcmVtb3RlLiBJdCBpcwotCQkgKiBuZWNlc3NhcnkgdG8gZXhhbWluZSBvdXB1dCB0byBmaW5kIG91dCBmYWlsdXJlCi0JCSAqIAotCQkgKiBAcGFyYW0gb3V0cHV0cwotCQkgKiBAcGFyYW0gZXJyb3JzCi0JCSAqIEByZXR1cm4gQHRocm93cwotCQkgKiAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gZXJyb3JzSW5PdXRwdXQoU3RyZWFtQ29uc3VtZXIgb3V0cHV0cywKLQkJCQlTdHJlYW1Db25zdW1lciBlcnJvcnMpIHsKLQkJCXRyeSB7Ci0JCQkJb3V0cHV0cy5qb2luKDEwMDApOwotCQkJCWlmIChvdXRwdXRzLmdldExhc3RMaW5lKCkgIT0gbnVsbAotCQkJCQkJJiYgKG91dHB1dHMuZ2V0TGFzdExpbmUoKS5pbmRleE9mKAotCQkJCQkJCQkiTm8gcnVubmluZyB3aW5kb3cgZm91bmQiKSAvLyROT04tTkxTLTEkCi0JCQkJCQk+PSAwIHx8IG91dHB1dHMuZ2V0TGFzdExpbmUoKS5pbmRleE9mKAotCQkJCQkJCQkibm90IHJ1bm5pbmcgb24gZGlzcGxheSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCT49IDApKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQllcnJvcnMuam9pbigxMDAwKTsKLQkJCQlpZiAoZXJyb3JzLmdldExhc3RMaW5lKCkgIT0gbnVsbAotCQkJCQkJJiYgKGVycm9ycy5nZXRMYXN0TGluZSgpLmluZGV4T2YoCi0JCQkJCQkJCSJObyBydW5uaW5nIHdpbmRvdyBmb3VuZCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCT49IDAgfHwgZXJyb3JzLmdldExhc3RMaW5lKCkuaW5kZXhPZigKLQkJCQkJCQkJIm5vdCBydW5uaW5nIG9uIGRpc3BsYXkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQk+PSAwKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLy8gaWYgYnJvd3NlciBpcyBvcGVuaW5nLCB3YWl0IHVudGlsIGl0IGZ1bGx5IG9wZW5zCi0JCQl3YWl0Rm9yQnJvd3NlcigpOwotCQkJaWYgKGV4aXRSZXF1ZXN0ZWQpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGZpcnN0TGF1bmNoICYmIFBsYXRmb3JtLk9TX1dJTjMyLmVxdWFscyhQbGF0Zm9ybS5nZXRPUygpKSkgewotCQkJCWlmIChvcGVuQnJvd3NlcihleGVjdXRhYmxlICsgIiAiICsgdXJsKSA9PSAwKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybjsKLQkJCQlicm93c2VyRnVsbHlPcGVuZWRBdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgREVMQVk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKG9wZW5Ccm93c2VyKGV4ZWN1dGFibGUgKyAiIC1yZW1vdGUgb3BlblVSTCgiICsgdXJsICsgIikiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJPT0gMCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCWlmIChleGl0UmVxdWVzdGVkKQotCQkJCXJldHVybjsKLQkJCWJyb3dzZXJGdWxseU9wZW5lZEF0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBERUxBWTsKLQkJCW9wZW5Ccm93c2VyKGV4ZWN1dGFibGUgKyAiICIgKyB1cmwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgd2FpdEZvckJyb3dzZXIoKSB7Ci0JCQl3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBicm93c2VyRnVsbHlPcGVuZWRBdCkKLQkJCQl0cnkgewotCQkJCQlpZiAoZXhpdFJlcXVlc3RlZCkKLQkJCQkJCXJldHVybjsKLQkJCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9icm93c2Vycy9Nb3ppbGxhRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL2Jyb3dzZXJzL01vemlsbGFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZGM2ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL2Jyb3dzZXJzL01vemlsbGFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuYnJvd3NlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLkJyb3dzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb3ppbGxhRmFjdG9yeSBleHRlbmRzIEJyb3dzZXJGYWN0b3J5IHsKLQlwcml2YXRlIE1vemlsbGFCcm93c2VyIGJyb3dzZXJJbnN0YW5jZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE1vemlsbGFGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgQnJvd3NlckZhY3RvcnkjaXNBdmFpbGFibGUoKQotCSAqLwotCS8qcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7Ci0JCXRyeSB7Ci0JCQlQcm9jZXNzIHByID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYygid2hpY2ggIiArIGV4ZWN1dGFibGUpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJlYW1Db25zdW1lciBvdXRwdXRzID0gbmV3IFN0cmVhbUNvbnN1bWVyKHByLmdldElucHV0U3RyZWFtKCkpOwotCQkJKG91dHB1dHMpLnN0YXJ0KCk7Ci0JCQlTdHJlYW1Db25zdW1lciBlcnJvcnMgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHIuZ2V0RXJyb3JTdHJlYW0oKSk7Ci0JCQkoZXJyb3JzKS5zdGFydCgpOwotCQkJcHIud2FpdEZvcigpOwotCQkJCi0JCQlpbnQgcmV0ID0gcHIuZXhpdFZhbHVlKCk7Ci0JCQlpZiAocmV0ID09IDApCi0JCQkJcmV0dXJuICFlcnJvcnNJbk91dHB1dChvdXRwdXRzLCBlcnJvcnMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxhdW5jaGluZyB3aGljaCBmYWlsZWQsIGFzc3VtZSBicm93c2VyIGV4ZWN1dGFibGUgaXMgcHJlc2VudAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ki8KLQkKLQkvKioKLQkgKiBPbiBzb21lIE9TZXMgMCBpcyBhbHdheXMgcmV0dXJuZWQgYnkgIndoaWNoIiBjb21tYW5kIGl0IGlzIG5lY2Vzc2FyeSB0bwotCSAqIGV4YW1pbmUgb3VwdXQgdG8gZmluZCBvdXQgZmFpbHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3V0cHV0cwotCSAqIEBwYXJhbSBlcnJvcnMKLQkgKiBAcmV0dXJuIEB0aHJvd3MKLQkgKiAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICovCi0JLypwcml2YXRlIGJvb2xlYW4gZXJyb3JzSW5PdXRwdXQoU3RyZWFtQ29uc3VtZXIgb3V0cHV0cywgU3RyZWFtQ29uc3VtZXIgZXJyb3JzKSB7Ci0JCXRyeSB7Ci0JCQlvdXRwdXRzLmpvaW4oMTAwMCk7Ci0JCQlpZiAob3V0cHV0cy5nZXRMYXN0TGluZSgpICE9IG51bGwKLQkJCQkmJiBvdXRwdXRzLmdldExhc3RMaW5lKCkKLQkJCQkJLmluZGV4T2YoIm5vICIgKyBleGVjdXRhYmxlICsgIiBpbiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQk+PSAwKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllcnJvcnMuam9pbigxMDAwKTsKLQkJCWlmIChlcnJvcnMuZ2V0TGFzdExpbmUoKSAhPSBudWxsCi0JCQkJCSYmIGVycm9ycy5nZXRMYXN0TGluZSgpLmluZGV4T2YoIm5vICIgKyBleGVjdXRhYmxlICsgIiBpbiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQk+PSAwKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfSovCi0KLQkvKgotCSAqIEBzZWUgQnJvd3NlckZhY3RvcnkjY3JlYXRlQnJvd3NlcigpCi0JICovCi0JcHVibGljIElXZWJCcm93c2VyIGNyZWF0ZUJyb3dzZXIoU3RyaW5nIGlkLCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBwYXJhbWV0ZXJzKSB7Ci0JCS8vIENyZWF0ZSBzaW5nbGUgYnJvd3NlciBmb3IgYWxsIGNsaWVudHMKLQkJaWYgKGJyb3dzZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlicm93c2VySW5zdGFuY2UgPSBuZXcgTW96aWxsYUJyb3dzZXIoaWQsIGxvY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gYnJvd3Nlckluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvYnJvd3NlcnMvTnVsbEJyb3dzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9icm93c2Vycy9OdWxsQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzg0ZTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9icm93c2Vycy9OdWxsQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLmJyb3dzZXJzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5BYnN0cmFjdFdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIE51bGxCcm93c2VyIGV4dGVuZHMgQWJzdHJhY3RXZWJCcm93c2VyIHsKLQlwdWJsaWMgTnVsbEJyb3dzZXIoU3RyaW5nIGlkKSB7Ci0JCXN1cGVyKGlkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuVVJMKFVSTCB1cmwpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCVdlYkJyb3dzZXJVSVBsdWdpbi5sb2dFcnJvcigKLQkJCSJUaGVyZSBpcyBubyBicm93c2VyIGFkYXB0ZXIgY29uZmlndXJlZCB0byBkaXNwbGF5ICIgLy8kTk9OLU5MUy0xJAotCQkJKyB1cmwKLQkJCSsgIi4gIEVuc3VyZSB0aGF0IHlvdSBoYXZlIGEgcmVxdWlyZWQgYnJvd3NlciBhbmQgYWRhcHRlciBpbnN0YWxsZWQsIGFuZCB0aGF0IHRoZSBicm93c2VyIHByb2dyYW0gaXMgYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0gcGF0aC4iLCAvLyROT04tTkxTLTEkCi0JCQludWxsKTsKLQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKE1lc3NhZ2VzLmVycm9yTm9Ccm93c2VyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL2Jyb3dzZXJzL1N0cmVhbUNvbnN1bWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvYnJvd3NlcnMvU3RyZWFtQ29uc3VtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0YjQ2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvYnJvd3NlcnMvU3RyZWFtQ29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5icm93c2VyczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuV2ViQnJvd3NlclVJUGx1Z2luOwotLyoqCi0gKiBVc2VkIHRvIHJlY2VpdmUgb3V0cHV0IGZyb20gcHJvY2Vzc2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJlYW1Db25zdW1lciBleHRlbmRzIFRocmVhZCB7Ci0JQnVmZmVyZWRSZWFkZXIgYlJlYWRlcjsKLQotCXByaXZhdGUgU3RyaW5nIGxhc3RMaW5lOwotCi0JcHVibGljIFN0cmVhbUNvbnN1bWVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldERhZW1vbih0cnVlKTsKLQkJYlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbGluZTsKLQkJCXdoaWxlIChudWxsICE9IChsaW5lID0gYlJlYWRlci5yZWFkTGluZSgpKSkgewotCQkJCWxhc3RMaW5lID0gbGluZTsKLQkJCQlCcm93c2VyTG9nLmxvZyhsaW5lKTsKLQkJCX0KLQkJCWJSZWFkZXIuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlXZWJCcm93c2VyVUlQbHVnaW4ubG9nRXJyb3IoIkV4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIGZyb20gd2ViIGJyb3dzZXIuIiwgaW9lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBsYXN0IGxpbmUgb2J0YWluZWQgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdExpbmUoKSB7Ci0JCXJldHVybiBsYXN0TGluZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL21hY29zeC9EZWZhdWx0QnJvd3Nlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL21hY29zeC9EZWZhdWx0QnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA3ZjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9tYWNvc3gvRGVmYXVsdEJyb3dzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5tYWNvc3g7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5BYnN0cmFjdFdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5XZWJCcm93c2VyVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QnJvd3NlciBleHRlbmRzIEFic3RyYWN0V2ViQnJvd3NlciB7Ci0KLQlwdWJsaWMgRGVmYXVsdEJyb3dzZXIoU3RyaW5nIGlkKSB7Ci0JCXN1cGVyKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmhlbHAuYnJvd3Nlci5JQnJvd3NlciNkaXNwbGF5VVJMKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuVVJMKFVSTCB1cmwyKSB7Ci0JCVN0cmluZyB1cmwgPSB1cmwyLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCS8qCi0JCSAqIENvZGUgZnJvbSBNYXJjLUFudG9pbmUgUGFyZW50Ci0JCSAqLwotCQl0cnkgewotCQkJUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhuZXcgU3RyaW5nW10geyAiL3Vzci9iaW4vb3Nhc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkiLWUiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJvcGVuIGxvY2F0aW9uIFwiIiArIHVybCArICJcIiIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCVdlYkJyb3dzZXJVSVBsdWdpbi5sb2dFcnJvcigiTGF1bmNoaW5nIFwib3Nhc2NyaXB0XCIgaGFzIGZhaWxlZC4iLCBpb2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL21hY29zeC9EZWZhdWx0QnJvd3NlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvYnJvd3Nlci9tYWNvc3gvRGVmYXVsdEJyb3dzZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MTBmOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL21hY29zeC9EZWZhdWx0QnJvd3NlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5tYWNvc3g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLkJyb3dzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QnJvd3NlckZhY3RvcnkgZXh0ZW5kcyBCcm93c2VyRmFjdG9yeSB7Ci0JLyoKLQkgKiBAc2VlIEJyb3dzZXJGYWN0b3J5I2NyZWF0ZUJyb3dzZXIoKQotCSAqLwotCXB1YmxpYyBJV2ViQnJvd3NlciBjcmVhdGVCcm93c2VyKFN0cmluZyBpZCwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgcGFyYW1ldGVycykgewotCQlyZXR1cm4gbmV3IERlZmF1bHRCcm93c2VyKGlkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL21hY29zeC9TYWZhcmlCcm93c2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvbWFjb3N4L1NhZmFyaUJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4Yjg3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvbWFjb3N4L1NhZmFyaUJyb3dzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5tYWNvc3g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLmJyb3dzZXJzLkRlZmF1bHRCcm93c2VyOwotCi1wdWJsaWMgY2xhc3MgU2FmYXJpQnJvd3NlciBleHRlbmRzIERlZmF1bHRCcm93c2VyIHsKLQkKLQlwdWJsaWMgU2FmYXJpQnJvd3NlcihTdHJpbmcgaWQsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIHBhcmFtZXRlcnMpIHsKLQkJc3VwZXIoaWQsIGxvY2F0aW9uLCBwYXJhbWV0ZXJzKTsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCQl0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGZpbmFsIGNvbW1hbmQgdG8gbGF1bmNoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4gU3RyaW5nW10KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gcHJlcGFyZUNvbW1hbmQoU3RyaW5nIHBhdGgsIFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybCAhPSBudWxsICYmIHVybC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdXJsID0gdXJsLnN1YnN0cmluZyg1KTsKLQkJfQotCQkKLQkJQXJyYXlMaXN0IHRva2VuTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy9EaXZpZGUgYWxvbmcgcXVvdGF0aW9uIG1hcmtzCi0JCVN0cmluZ1Rva2VuaXplciBxVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLnRyaW0oKSwKLQkJCSJcIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gd2l0aGluUXVvdGF0aW9uID0gZmFsc2U7Ci0JCVN0cmluZyBxdW90ZWRTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAocVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBjdXJUb2tlbiA9IHFUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAoY3VyVG9rZW4uZXF1YWxzKCJcIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAod2l0aGluUXVvdGF0aW9uKSB7Ci0JCQkJCS8vIHF1b3RlcyBwcmV2ZW50IGxhdW5jaGluZyBvbiBVbml4IDM1NjczCi0JCQkJCXRva2VuTGlzdC5hZGQocXVvdGVkU3RyaW5nKTsKLQkJCQl9IGVsc2UgewotCQkJCQlxdW90ZWRTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQl3aXRoaW5RdW90YXRpb24gPSAhd2l0aGluUXVvdGF0aW9uOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmICh3aXRoaW5RdW90YXRpb24pIHsKLQkJCQlxdW90ZWRTdHJpbmcgPSBjdXJUb2tlbjsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy9kaXZpZGUgdW5xdW90ZWQgc3RyaW5ncyBhbG9uZyB3aGl0ZSBzcGFjZQotCQkJCVN0cmluZ1Rva2VuaXplciBwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGN1clRva2VuLnRyaW0oKSk7Ci0JCQkJd2hpbGUgKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJdG9rZW5MaXN0LmFkZChwYXJzZXIubmV4dFRva2VuKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBzdWJzdGl0dXRlICUxIGJ5IHVybAotCQlib29sZWFuIHN1YnN0aXR1dGVkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSAoU3RyaW5nKSB0b2tlbkxpc3QuZ2V0KGkpOwotCQkJU3RyaW5nIG5ld1Rva2VuID0gZG9TdWJzdGl0dXRpb25zKHRva2VuLCB1cmwpOwotCQkJaWYgKG5ld1Rva2VuICE9IG51bGwpIHsKLQkJCQl0b2tlbkxpc3Quc2V0KGksIG5ld1Rva2VuKTsKLQkJCQlzdWJzdGl0dXRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gYWRkIHRoZSB1cmwgaWYgbm90IHN1YnN0aXR1dGVkIGFscmVhZHkKLQkJaWYgKCFzdWJzdGl0dXRlZCkKLQkJCXRva2VuTGlzdC5hZGQodXJsKTsKLQotCQlTdHJpbmdbXSBjb21tYW5kID0gbmV3IFN0cmluZ1t0b2tlbkxpc3Quc2l6ZSgpXTsKLQkJdG9rZW5MaXN0LnRvQXJyYXkoY29tbWFuZCk7Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvbWFjb3N4L1NhZmFyaUJyb3dzZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Jyb3dzZXIvbWFjb3N4L1NhZmFyaUJyb3dzZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDgzMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9icm93c2VyL21hY29zeC9TYWZhcmlCcm93c2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLm1hY29zeDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuQnJvd3NlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV2ViQnJvd3NlcjsKLQotcHVibGljIGNsYXNzIFNhZmFyaUJyb3dzZXJGYWN0b3J5IGV4dGVuZHMgQnJvd3NlckZhY3RvcnkgewotCS8qCi0JICogQHNlZSBCcm93c2VyRmFjdG9yeSNjcmVhdGVCcm93c2VyKCkKLQkgKi8KLQlwdWJsaWMgSVdlYkJyb3dzZXIgY3JlYXRlQnJvd3NlcihTdHJpbmcgaWQsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIG5ldyBTYWZhcmlCcm93c2VyKGlkLCBsb2NhdGlvbiwgcGFyYW1ldGVycyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGVhYWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UudWkuY2FyYm9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5oZWxwPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDY4YzUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSNUaHUgSnVsIDIxIDE1OjA4OjI5IENFU1QgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTdmYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI01vbiBKdWwgMTggMTE6NTY6MDEgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9dXNlcgotb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKLW9yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBnZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50Ij4vKipcbiAqIEByZXR1cm4gUmV0dXJucyB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgY29udGV4dFw9InNldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyY29tbWVudCIgbmFtZVw9InNldHRlcmNvbW1lbnQiPi8qKlxuICogQHBhcmFtICR7cGFyYW19IFRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBKYXZhIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpbGVjb21tZW50IiBuYW1lXD0iZmlsZWNvbW1lbnQiPi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBDb3B5cmlnaHQgKGMpICR7eWVhcn0gSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG4gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcbiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwXDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbiAqXG4gKiBDb250cmlidXRvcnNcOlxuICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcbiAqIEBzaW5jZSAzLjFcbiAqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBmaWVsZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50Ij4vKipcbiAqIFxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG5vbi1vdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGNvbnRleHRcPSJuZXd0eXBlX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJOZXdseSBjcmVhdGVkIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm5ld3R5cGUiIG5hbWVcPSJuZXd0eXBlIj4ke2ZpbGVjb21tZW50fVxuJHtwYWNrYWdlX2RlY2xhcmF0aW9ufVxuXG4ke3R5cGVjb21tZW50fVxuJHt0eXBlX2RlY2xhcmF0aW9ufTwvdGVtcGxhdGU+PHRlbXBsYXRlIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgY29udGV4dFw9ImNvbnN0cnVjdG9yYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGNvbnN0cnVjdG9yIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yYm9keSIgbmFtZVw9ImNvbnN0cnVjdG9yYm9keSI+JHtib2R5X3N0YXRlbWVudH1cbi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YjwvdGVtcGxhdGU+PHRlbXBsYXRlIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmI5OGY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jVHVlIE5vdiAxNiAxNDoxMDo1NiBFU1QgMjAwNAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi8udGVtcGxhdGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi8udGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NWUwZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZvcm0+Ci0gICA8cC8+PHA+PGI+VGlwcyBvbiB3b3JraW5nIHdpdGggdGhpcyBwbHVnLWluIHByb2plY3Q8L2I+PC9wPjxsaT5Gb3IgdGhlIHZpZXcgb2YgdGhlIG5ldyBwbHVnLWluIGF0IGEgZ2xhbmNlLCBnbyB0byB0aGUgPGltZyBocmVmPSJwYWdlSW1hZ2UiLz48YSBocmVmPSJPdmVydmlld1BhZ2UiPk92ZXJ2aWV3PC9hPi48L2xpPjxsaT5Zb3UgY2FuIHRlc3QgdGhlIGNvbnRyaWJ1dGlvbnMgb2YgdGhpcyBwbHVnLWluIGJ5IGxhdW5jaGluZyBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSB3b3JrYmVuY2guIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIGNsaWNrIDxiPlJ1biBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5ydW4iPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT48bGk+WW91IGNhbiBhZGQgbW9yZSBmdW5jdGlvbmFsaXR5IHRvIHRoaXMgcGx1Zy1pbiBieSBhZGRpbmcgZXh0ZW5zaW9ucyB1c2luZyB0aGUgPGEgaHJlZj0iYWN0aW9uLm5ld0V4dGVuc2lvbiI+TmV3IEV4dGVuc2lvbiBXaXphcmQ8L2E+LjwvbGk+PGxpPlRoZSBwbHVnLWluIHByb2plY3QgY29udGFpbnMgSmF2YSBjb2RlIHRoYXQgeW91IGNhbiBkZWJ1Zy4gUGxhY2UgYnJlYWtwb2ludHMgaW4gSmF2YSBjbGFzc2VzLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBzZWxlY3QgPGI+RGVidWcgQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24uZGVidWciPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT4KLTwvZm9ybT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMDFlYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51aS5jYXJib247IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudC1jYXJib24KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS51aS5jYXJib24KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FY2xpcHNlLVBsYXRmb3JtRmlsdGVyOiAob3NnaS53cz1jYXJib24pCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5MGZkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBmcmFnbWVudC54bWwsXAotICAgICAgICAgICAgICAgZnJhZ21lbnQtY2FyYm9uLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uL2ZyYWdtZW50LWNhcmJvbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vZnJhZ21lbnQtY2FyYm9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiM2ExY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vZnJhZ21lbnQtY2FyYm9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZnJhZ21lbnROYW1lPUVjbGlwc2UgVUkgTWFjT1MgWCBFbmhhbmNlbWVudHMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uL2ZyYWdtZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uL2ZyYWdtZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkYzdiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi9mcmFnbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPGZyYWdtZW50PgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+Ci0gICAgICA8c3RhcnR1cAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmNhcmJvbi5DYXJib25VSUVuaGFuY2VyIj4KLSAgICAgIDwvc3RhcnR1cD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi08L2ZyYWdtZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTg1NDk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uL3NjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLnVpLmNhcmJvbiIgZGVmYXVsdD0iZXhwb3J0IiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIuLi8uLi9wbHVnaW4tZXhwb3J0IiAvPgotCQk8cHJvcGVydHkgbmFtZT0idGVtcGRpciIgdmFsdWU9Ii4uLy4uL3RtcCIgLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9Im9yZy5lY2xpcHNlLnVpLmNhcmJvbiIgLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbl92ZXJzaW9uIiAgdmFsdWU9Il8zLjEuMCIgLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QiICB2YWx1ZT0iJHtkZXN0ZGlyfS8ke3BsdWdpbn0ke3BsdWdpbl92ZXJzaW9ufSIgLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RqYXIiICB2YWx1ZT0iJHtkZXN0ZGlyfS8ke3BsdWdpbn0ke3BsdWdpbl92ZXJzaW9ufS5qYXIiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAJPGVjbGlwc2UuaW5jcmVtZW50YWxCdWlsZCBwcm9qZWN0PSIke3BsdWdpbn0iIGtpbmQ9ImluY3IiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZXhwb3J0IiBkZXBlbmRzPSJidWlsZCI+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXBkaXJ9IiAvPgotCQk8bWtkaXIgZGlyPSIke3RlbXBkaXJ9IiAvPgotCQk8bWtkaXIgZGlyPSIke2Rlc3RkaXJ9IiAvPgotCQk8ZGVsZXRlIGZpbGU9IiR7ZGVzdGphcn0iIC8+Ci0JCTx6aXAgemlwZmlsZT0iJHt0ZW1wZGlyfS9jYXJib25zcmMuemlwIj4KLQkJICAgIDxmaWxlc2V0IGRpcj0ic3JjIiAvPgotICAJCTwvemlwPgotCQk8emlwIHppcGZpbGU9IiR7ZGVzdGphcn0iPgotCQkJPGZpbGVzZXQgZGlyPSIuIj4KLQkJCSAgPGluY2x1ZGUgbmFtZT0iZnJhZ21lbnQueG1sIiAvPgotCQkJICA8aW5jbHVkZSBuYW1lPSJmcmFnbWVudC1jYXJib24ucHJvcGVydGllcyIgLz4KLQkJCSAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCQk8ZmlsZXNldCBkaXI9ImJpbiIgLz4KLQkJCTxmaWxlc2V0IGZpbGU9IiR7dGVtcGRpcn0vY2FyYm9uc3JjLnppcCIgLz4KLQkJPC96aXA+Ci0JCTxkZWxldGUgZmlsZT0iJHt0ZW1wZGlyfS9jYXJib25zcmMuemlwIiAvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vc3JjL29yZy9lY2xpcHNlL3VpL2NhcmJvbi9DYXJib25VSUVuaGFuY2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi9zcmMvb3JnL2VjbGlwc2UvdWkvY2FyYm9uL0NhcmJvblVJRW5oYW5jZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmYjg0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmNhcmJvbi9zcmMvb3JnL2VjbGlwc2UvdWkvY2FyYm9uL0NhcmJvblVJRW5oYW5jZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuY2FyYm9uOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5DYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLkhJQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLk9TOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hXaW5kb3c7Ci0KLS8qKgotICogVGhlIENhcmJvblVJRW5oYW5jZXIgcHJvdmlkZXMgdGhlIHN0YW5kYXJkICJBYm91dCIgYW5kICJQcmVmZXJlbmNlIiBtZW51IGl0ZW1zCi0gKiBhbmQgbGlua3MgdGhlbSB0byB0aGUgY29ycmVzcG9uZGluZyB3b3JrYmVuY2ggY29tbWFuZHMuIAotICogVGhpcyBtdXN0IGJlIGRvbmUgaW4gYSBNYWNPUyBYIGZyYWdtZW50IGJlY2F1c2UgU1dUIGRvZXNuJ3QgcHJvdmlkZSBhbiBhYnN0cmFjdGlvbgotICogZm9yIHRoZSAoTWFjT1MgWCBvbmx5KSBhcHBsaWNhdGlvbiBtZW51IGFuZCB3ZSBoYXZlIHRvIHVzZSBNYWNPUyBzcGVjaWZpYyBuYXRpdmVzLgotICogVGhlIGZyYWdtZW50IGlzIGZvciB0aGUgb3JnLmVjbGlwc2UudWkgcGx1Z2luIGJlY2F1c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlCi0gKiBXb3JrYmVuY2ggIkFib3V0IiBhbmQgIlByZWZlcmVuY2UiIGFjdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXJib25VSUVuaGFuY2VyIGltcGxlbWVudHMgSVN0YXJ0dXAgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtISUNvbW1hbmRQcmVmZXJlbmNlcyA9ICgncCcgPDwgMjQpICsgKCdyJyA8PCAxNikgKyAoJ2UnIDw8IDgpICsgJ2YnOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrSElDb21tYW5kQWJvdXQgPSAoJ2EnIDw8IDI0KSArICgnYicgPDwgMTYpICsgKCdvJyA8PCA4KSArICd1JzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0hJQ29tbWFuZFNlcnZpY2VzID0gKCdzJyA8PCAyNCkgKyAoJ2UnIDw8IDE2KSArICgncicgPDwgOCkgKyAndic7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQlVORExFID0gIm9yZy5lY2xpcHNlLnVpLmNhcmJvbi5NZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTEJBUl9CVVRUT05fVE9HR0xFX0ZMQUdTID0gInRvb2xiYXJCdXR0b25Ub2dnbGVGbGFncyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgU3RyaW5nIGZBYm91dEFjdGlvbk5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENhcmJvblVJRW5oYW5jZXIoKSB7Ci0gICAgICAgIElQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0gICAgICAgIFN0cmluZyBwcm9kdWN0TmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChwcm9kdWN0ICE9IG51bGwpCi0gICAgICAgICAgICBwcm9kdWN0TmFtZSA9IHByb2R1Y3QuZ2V0TmFtZSgpOwotICAgICAgICAKLQkJUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoUkVTT1VSQ0VfQlVORExFKTsKLQkJdHJ5IHsKLQkJCWlmIChwcm9kdWN0TmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZvcm1hdCA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZygiQWJvdXRBY3Rpb24uZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZm9ybWF0ICE9IG51bGwpCi0JCQkJCWZBYm91dEFjdGlvbk5hbWU9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IE9iamVjdFtdIHsgcHJvZHVjdE5hbWUgfSApOwotCQkJfQotCQkJaWYgKGZBYm91dEFjdGlvbk5hbWUgPT0gbnVsbCkKLQkJCQlmQWJvdXRBY3Rpb25OYW1lID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKCJBYm91dEFjdGlvbi5uYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJaWYgKGZBYm91dEFjdGlvbk5hbWUgPT0gbnVsbCkKLQkJCWZBYm91dEFjdGlvbk5hbWUgPSAiQWJvdXQiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXAjZWFybHlTdGFydHVwKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7Ci0gICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotICAgICAgICBkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlob29rQXBwbGljYXRpb25NZW51KGRpc3BsYXkpOwotCQkJCWhvb2tUb29sYmFyQnV0dG9uQ2FsbGJhY2soKTsKLQkJCQlob29rV29ya2JlbmNoTGlzdGVuZXIoKTsKLQkJCQkvLyBtb2RpZnkgYWxsIHNoZWxscyBvcGVuZWQgb24gc3RhcnR1cAotCQkJCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJbW9kaWZ5V2luZG93U2hlbGwod2luZG93c1tpXSk7Ci0JCQkJfQotCQkJfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBIb29rcyBhIGxpc3RlbmVyIHRoYXQgdHdlYWtzIG5ld2x5IG9wZW5lZCB3b3JrYmVuY2ggd2luZG93IHNoZWxscyB3aXRoCi0JICogdGhlIHByb3BlciBPUyBmbGFncy4KLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaG9va1dvcmtiZW5jaExpc3RlbmVyKCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmFkZFdpbmRvd0xpc3RlbmVyKG5ldyBJV2luZG93TGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJCS8vIG5vLW9wCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQkJLy8gbm8tb3AKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQkJLy8gbm8tb3AKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2luZG93T3BlbmVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQkJbW9kaWZ5V2luZG93U2hlbGwod2luZG93KTsKLQkJCX19KTsKLQl9Ci0KLSAgICAvKioKLQkgKiBNb2RpZnkgdGhlIGdpdmVuIHdvcmtiZW5jaCB3aW5kb3cgc2hlbGwgYml0cyB0byBzaG93IHRoZSB0b29sYmFyIHRvZ2dsZQotCSAqIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gd2luZG93Ci0JICogICAgICAgICAgICB0aGUgd2luZG93IHRvIG1vZGlmeQotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlXaW5kb3dTaGVsbChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkvLyBvbmx5IGFkZCB0aGUgYnV0dG9uIHdoZW4gZWl0aGVyIHRoZSBjb29sYmFyIG9yIHBlcnNwZWN0aXZlYmFyCi0JCS8vIGlzIGluaXRpYWxseSB2aXNpYmxlLiBUaGlzIGlzIHNvIHRoYXQgUkNQIGFwcHMgY2FuIGNob29zZSB0byB1c2UKLQkJLy8gdGhpcyBmcmFnbWVudCB3aXRob3V0IGZlYXIgdGhhdCB0aGVpciBleHBsaWNpdGx5IGludmlzYmxlIGJhcnMKLQkJLy8gY2FuJ3QgYmUgc2hvd24uCi0JCWJvb2xlYW4gY29vbEJhckluaXRpYWxseVZzaWJsZSA9ICgoV29ya2JlbmNoV2luZG93KSB3aW5kb3cpCi0JCQkJLmdldENvb2xCYXJWaXNpYmxlKCk7Ci0JCWJvb2xlYW4gcGVyc3BlY3RpdmVCYXJJbml0aWFsbHlWc2libGUgPSAoKFdvcmtiZW5jaFdpbmRvdykgd2luZG93KQotCQkJCS5nZXRQZXJzcGVjdGl2ZUJhclZpc2libGUoKTsKLQotCQlpZiAoY29vbEJhckluaXRpYWxseVZzaWJsZSB8fCBwZXJzcGVjdGl2ZUJhckluaXRpYWxseVZzaWJsZSkgewotCQkJLy8gbW9kaWZ5IHRoZSBuZXdseSBvcGVuZWQgd2luZG93IHdpdGggdGhlIGNvcnJlY3QgT1MgWAotCQkJLy8gc3R5bGUgYml0cyBzdWNoIHRoYXQgaXQgcG9zc2Vzc2VzIHRoZSB0b29sYmFyIGJ1dHRvbgotCQkJU2hlbGwgc2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJCWJvb2xlYW5bXSBzd2l0Y2hBcnJheSA9IG5ldyBib29sZWFuW10geyBjb29sQmFySW5pdGlhbGx5VnNpYmxlLAotCQkJCQlwZXJzcGVjdGl2ZUJhckluaXRpYWxseVZzaWJsZSB9OwotCQkJc2hlbGwuc2V0RGF0YShUT09MQkFSX0JVVFRPTl9UT0dHTEVfRkxBR1MsIHN3aXRjaEFycmF5KTsKLQkJCWludCB3aW5kb3dIYW5kbGUgPSBPUy5HZXRDb250cm9sT3duZXIoc2hlbGwuaGFuZGxlKTsKLQkJCU9TLkNoYW5nZVdpbmRvd0F0dHJpYnV0ZXMod2luZG93SGFuZGxlLAotCQkJCQlPUy5rV2luZG93VG9vbGJhckJ1dHRvbkF0dHJpYnV0ZSwgMCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSG9vayB0aGUgd2luZG93IHRvb2xiYXIgYnV0dG9uIHRvIHRvZ2dsZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgY29vbGJhcgotCSAqIGFuZCBwZXJzcGVjdGl2ZSBiYXIuCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhvb2tUb29sYmFyQnV0dG9uQ2FsbGJhY2soKSB7Ci0JCU9iamVjdCB0YXJnZXQgPSBuZXcgT2JqZWN0KCkgewotCQkJaW50IHRvb2xiYXJQcm9jIChpbnQgbmV4dEhhbmRsZXIsIGludCB0aGVFdmVudCwgaW50IHVzZXJEYXRhKSB7Ci0JCQkJaW50IGV2ZW50S2luZCA9IE9TLkdldEV2ZW50S2luZCAodGhlRXZlbnQpOwotCQkJCWlmIChldmVudEtpbmQgIT0gT1Mua0V2ZW50V2luZG93VG9vbGJhclN3aXRjaE1vZGUpCi0JCQkJCXJldHVybiBPUy5ldmVudE5vdEhhbmRsZWRFcnI7Ci0JCQkJCi0JCQkJaW50IFtdIHRoZVdpbmRvdyA9IG5ldyBpbnQgWzFdOwotCQkJCU9TLkdldEV2ZW50UGFyYW1ldGVyICh0aGVFdmVudCwgT1Mua0V2ZW50UGFyYW1EaXJlY3RPYmplY3QsIE9TLnR5cGVXaW5kb3dSZWYsIG51bGwsIDQsIG51bGwsIHRoZVdpbmRvdyk7Ci0JCQkJCi0JCQkJaW50IFtdIHRoZVJvb3QgPSBuZXcgaW50IFsxXTsKLQkJCQlPUy5HZXRSb290Q29udHJvbCAodGhlV2luZG93IFswXSwgdGhlUm9vdCk7Ci0JCQkJV2lkZ2V0IHdpZGdldCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmZpbmRXaWRnZXQodGhlUm9vdCBbMF0pOwotCQkJCQotCQkJCWlmICghKHdpZGdldCBpbnN0YW5jZW9mIFNoZWxsKSkgewotCQkJCQlyZXR1cm4gT1MuZXZlbnROb3RIYW5kbGVkRXJyOwotCQkJCX0KLQkJCQlTaGVsbCBzaGVsbCA9IChTaGVsbCkgd2lkZ2V0OwotCQkJCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHdpbmRvd3NbaV0uZ2V0U2hlbGwoKSA9PSBzaGVsbCkgewotCQkJCQkJV29ya2JlbmNoV2luZG93IGNhc3RlZFdpbmRvdyA9IChXb3JrYmVuY2hXaW5kb3cpIHdpbmRvd3NbaV07Ci0JCQkJCQkvLyBnZXQgdGhlIHN3aXRjaCBmbGFncyB0aGF0IHdlcmUgc2V0IG9uIHRoZSBzaGVsbCBieQotCQkJCQkJLy8gdGhlIHdpbmRvdyBsaXN0ZW5lcgotCQkJCQkJYm9vbGVhbltdIHN3aXRjaEZsYWdzID0gKGJvb2xlYW5bXSkgc2hlbGwKLQkJCQkJCQkJLmdldERhdGEoVE9PTEJBUl9CVVRUT05fVE9HR0xFX0ZMQUdTKTsKLQkJCQkJCWlmIChzd2l0Y2hGbGFncyA9PSBudWxsKQotCQkJCQkJCXJldHVybiBPUy5ldmVudE5vdEhhbmRsZWRFcnI7Ci0JCQkJCQlib29sZWFuIGNvb2xiYXJWaXNpYmxlID0gY2FzdGVkV2luZG93Ci0JCQkJCQkJCS5nZXRDb29sQmFyVmlzaWJsZSgpOwotCQkJCQkJYm9vbGVhbiBwZXJzcGVjdGl2ZWJhclZpc2libGUgPSBjYXN0ZWRXaW5kb3cKLQkJCQkJCQkJLmdldFBlcnNwZWN0aXZlQmFyVmlzaWJsZSgpOwotCQkJCQkJLy8gb25seSB0b2dnbGUgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGNvbXBvbmVudHMgdGhhdAotCQkJCQkJLy8gd2VyZSBvbiBpbml0aWFsbHkKLQkJCQkJCWlmIChzd2l0Y2hGbGFnc1swXSkKLQkJCQkJCQljYXN0ZWRXaW5kb3cuc2V0Q29vbEJhclZpc2libGUoIWNvb2xiYXJWaXNpYmxlKTsKLQkJCQkJCWlmIChzd2l0Y2hGbGFnc1sxXSkKLQkJCQkJCQljYXN0ZWRXaW5kb3cKLQkJCQkJCQkJCS5zZXRQZXJzcGVjdGl2ZUJhclZpc2libGUoIXBlcnNwZWN0aXZlYmFyVmlzaWJsZSk7Ci0JCQkJCQlzaGVsbC5sYXlvdXQoKTsKLQkJCQkJCXJldHVybiBPUy5ub0VycjsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gT1MuZXZlbnROb3RIYW5kbGVkRXJyOwotCQkJfQotCi0JCX07Ci0JCQotCSAgICBmaW5hbCBDYWxsYmFjayBjb21tYW5kQ2FsbGJhY2sgPSBuZXcgQ2FsbGJhY2sodGFyZ2V0LCAidG9vbGJhclByb2MiLCAzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbnQgY29tbWFuZFByb2MgPSBjb21tYW5kQ2FsbGJhY2suZ2V0QWRkcmVzcygpOwotICAgICAgICBpZiAoY29tbWFuZFByb2MgPT0gMCkgewotICAgICAgICAgICAgY29tbWFuZENhbGxiYWNrLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHJldHVybjsgLy8gZ2l2ZSB1cAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnRbXSBtYXNrID0gbmV3IGludFtdIHsgT1Mua0V2ZW50Q2xhc3NXaW5kb3csIE9TLmtFdmVudFdpbmRvd1Rvb2xiYXJTd2l0Y2hNb2RlIH07Ci0gICAgICAgIE9TLkluc3RhbGxFdmVudEhhbmRsZXIoT1MuR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCgpLCBjb21tYW5kUHJvYywKLSAgICAgICAgICAgICAgICBtYXNrLmxlbmd0aCAvIDIsIG1hc2ssIDAsIG51bGwpOwotCQkKLQl9Ci0KLQkvKioKLSAgICAgKiBTZWUgQXBwbGUgVGVjaG5pY2FsIFEmQSAxMDc5IChodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9xYS9xYTIwMDEvcWExMDc5Lmh0bWwpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhvb2tBcHBsaWNhdGlvbk1lbnUoRGlzcGxheSBkaXNwbGF5KSB7Ci0KLSAgICAgICAgLy8gQ2FsbGJhY2sgdGFyZ2V0Ci0gICAgICAgIE9iamVjdCB0YXJnZXQgPSBuZXcgT2JqZWN0KCkgewotICAgICAgICAgICAgaW50IGNvbW1hbmRQcm9jKGludCBuZXh0SGFuZGxlciwgaW50IHRoZUV2ZW50LCBpbnQgdXNlckRhdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAoT1MuR2V0RXZlbnRLaW5kKHRoZUV2ZW50KSA9PSBPUy5rRXZlbnRQcm9jZXNzQ29tbWFuZCkgewotICAgICAgICAgICAgICAgICAgICBISUNvbW1hbmQgY29tbWFuZCA9IG5ldyBISUNvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgT1MuR2V0RXZlbnRQYXJhbWV0ZXIodGhlRXZlbnQsIE9TLmtFdmVudFBhcmFtRGlyZWN0T2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TLnR5cGVISUNvbW1hbmQsIG51bGwsIEhJQ29tbWFuZC5zaXplb2YsIG51bGwsIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQuY29tbWFuZElEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Uga0hJQ29tbWFuZFByZWZlcmVuY2VzOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bkFjdGlvbigicHJlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBjYXNlIGtISUNvbW1hbmRBYm91dDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBydW5BY3Rpb24oImFib3V0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBPUy5ldmVudE5vdEhhbmRsZWRFcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgZmluYWwgQ2FsbGJhY2sgY29tbWFuZENhbGxiYWNrID0gbmV3IENhbGxiYWNrKHRhcmdldCwgImNvbW1hbmRQcm9jIiwgMyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IGNvbW1hbmRQcm9jID0gY29tbWFuZENhbGxiYWNrLmdldEFkZHJlc3MoKTsKLSAgICAgICAgaWYgKGNvbW1hbmRQcm9jID09IDApIHsKLSAgICAgICAgICAgIGNvbW1hbmRDYWxsYmFjay5kaXNwb3NlKCk7Ci0gICAgICAgICAgICByZXR1cm47IC8vIGdpdmUgdXAKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEluc3RhbGwgZXZlbnQgaGFuZGxlciBmb3IgY29tbWFuZHMKLSAgICAgICAgaW50W10gbWFzayA9IG5ldyBpbnRbXSB7IE9TLmtFdmVudENsYXNzQ29tbWFuZCwgT1Mua0V2ZW50UHJvY2Vzc0NvbW1hbmQgfTsKLSAgICAgICAgT1MuSW5zdGFsbEV2ZW50SGFuZGxlcihPUy5HZXRBcHBsaWNhdGlvbkV2ZW50VGFyZ2V0KCksIGNvbW1hbmRQcm9jLAotICAgICAgICAgICAgICAgIG1hc2subGVuZ3RoIC8gMiwgbWFzaywgMCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIEFib3V0IEVjbGlwc2UgbWVudSBjb21tYW5kCi0gICAgICAgIGludFtdIG91dE1lbnUgPSBuZXcgaW50WzFdOwotICAgICAgICBzaG9ydFtdIG91dEluZGV4ID0gbmV3IHNob3J0WzFdOwotICAgICAgICBpZiAoT1MuR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKDAsIGtISUNvbW1hbmRQcmVmZXJlbmNlcywgMSwgb3V0TWVudSwgb3V0SW5kZXgpID09IE9TLm5vRXJyCi0gICAgICAgICAgICAgICAgJiYgb3V0TWVudVswXSAhPSAwKSB7Ci0gICAgICAgICAgICBpbnQgbWVudSA9IG91dE1lbnVbMF07Ci0KLSAgICAgICAgICAgIGludCBsID0gZkFib3V0QWN0aW9uTmFtZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGNoYXIgYnVmZmVyW10gPSBuZXcgY2hhcltsXTsKLSAgICAgICAgICAgIGZBYm91dEFjdGlvbk5hbWUuZ2V0Q2hhcnMoMCwgbCwgYnVmZmVyLCAwKTsKLSAgICAgICAgICAgIGludCBzdHIgPSBPUy5DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKE9TLmtDRkFsbG9jYXRvckRlZmF1bHQsIGJ1ZmZlciwgbCk7Ci0gICAgICAgICAgICBPUy5JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcobWVudSwgc3RyLCAoc2hvcnQpIDAsIDAsIGtISUNvbW1hbmRBYm91dCk7Ci0gICAgICAgICAgICBPUy5DRlJlbGVhc2Uoc3RyKTsKLQotICAgICAgICAgICAgLy8gYWRkIHNlcGFyYXRvciBiZXR3ZWVuIEFib3V0ICYgUHJlZmVyZW5jZXMKLSAgICAgICAgICAgIE9TLkluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhtZW51LCAwLCAoc2hvcnQpIDEsIE9TLmtNZW51SXRlbUF0dHJTZXBhcmF0b3IsIDApOwotCi0gICAgICAgICAgICAvLyBlbmFibGUgcHJlZiBtZW51Ci0gICAgICAgICAgICBPUy5FbmFibGVNZW51Q29tbWFuZChtZW51LCBrSElDb21tYW5kUHJlZmVyZW5jZXMpOwotCi0gICAgICAgICAgICAvLyBkaXNhYmxlIHNlcnZpY2VzIG1lbnUKLSAgICAgICAgICAgIE9TLkRpc2FibGVNZW51Q29tbWFuZChtZW51LCBrSElDb21tYW5kU2VydmljZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2NoZWR1bGUgZGlzcG9zYWwgb2YgY2FsbGJhY2sgb2JqZWN0Ci0gICAgICAgIGRpc3BsYXkuZGlzcG9zZUV4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGNvbW1hbmRDYWxsYmFjay5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvY2F0ZSBhbiBhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gaWQgaW4gdGhlIGN1cnJlbnQgbWVudWJhciBhbmQgcnVuIGl0LgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHJ1bkFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICBpZiAod2luZG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7Ci0gICAgICAgICAgICBNZW51IG1lbnViYXIgPSBzaGVsbC5nZXRNZW51QmFyKCk7Ci0gICAgICAgICAgICBpZiAobWVudWJhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51YmFyLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgTWVudUl0ZW0gbWkgPSBtZW51YmFyLmdldEl0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgICAgIE1lbnUgbSA9IG1pLmdldE1lbnUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtLmdldEl0ZW1Db3VudCgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVJdGVtIG1pMiA9IG0uZ2V0SXRlbShqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gbWkyLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYWNpID0gKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIG87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gYWNpLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQuZXF1YWxzKGFjdGlvbklkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IGFjaS5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsICYmIGFjdGlvbi5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9TLm5vRXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBPUy5ldmVudE5vdEhhbmRsZWRFcnI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vc3JjL29yZy9lY2xpcHNlL3VpL2NhcmJvbi9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5jYXJib24vc3JjL29yZy9lY2xpcHNlL3VpL2NhcmJvbi9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThmOGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuY2FyYm9uL3NyYy9vcmcvZWNsaXBzZS91aS9jYXJib24vTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQWJvdXRBY3Rpb24uZm9ybWF0PUFib3V0IHswfQotQWJvdXRBY3Rpb24ubmFtZT1BYm91dApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkYmYxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1vcmcuZWNsaXBzZS51aS5mb3Jtcy9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS51aS5mb3Jtcy9kZWJ1Zy90ZXh0PXRydWUKLW9yZy5lY2xpcHNlLnVpLmZvcm1zL2RlYnVnL2ZvY3VzPXRydWUKLW9yZy5lY2xpcHNlLnVpLmZvcm1zL2RlYnVnL3RleHRzaXplPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyM2VhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UudWkuZm9ybXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZmM3MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVuYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51aS5mb3JtcwotQnVuZGxlLVZlcnNpb246IDMuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyLW5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnVpLmZvcm1zLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvciwKLSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMsCi0gb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cywKLSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHM7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2U7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4YzA3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZS4uID0gc3JjLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJkNDlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0iVUkgIEZvcm1zIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS5mb3JtcyIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkuZm9ybXMiPjwvcGFja2FnZT48cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzIj48L3BhY2thZ2U+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMTFkOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgcGx1Z2luLnhtbCBwcm9wZXJ0aWVzCi0jCi0KLW5hbWUgPSBFY2xpcHNlIEZvcm1zCi1wcm92aWRlci1uYW1lID0gRWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvQWJzdHJhY3RGb3JtUGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvQWJzdHJhY3RGb3JtUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTkxOTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL0Fic3RyYWN0Rm9ybVBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXM7Ci0vKioKLSAqIEFic3RyYWN0Rm9ybVBhcnQgaW1wbGVtZW50cyBJRm9ybVBhcnQgaW50ZXJmYWNlIGFuZCBjYW4gYmUgdXNlZCBhcyBhCi0gKiBjb252ZW5pZW50IGJhc2UgY2xhc3MgZm9yIGNvbmNyZXRlIGZvcm0gcGFydHMuIElmIGEgbWV0aG9kIGNvbnRhaW5zCi0gKiBjb2RlIHRoYXQgbXVzdCBiZSBjYWxsZWQsIGxvb2sgZm9yIGluc3RydWN0aW9ucyB0byBjYWxsICdzdXBlcicKLSAqIHdoZW4gb3ZlcnJpZGluZy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb24KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Rm9ybVBhcnQgaW1wbGVtZW50cyBJRm9ybVBhcnQgewotCXByaXZhdGUgSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtOwotCXByaXZhdGUgYm9vbGVhbiBkaXJ0eSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBzdGFsZSA9IHRydWU7Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRm9ybVBhcnQjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm0pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJTWFuYWdlZEZvcm0gZm9ybSkgewotCQl0aGlzLm1hbmFnZWRGb3JtID0gZm9ybTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9ybSB0aGF0IG1hbmFnZXMgdGhpcyBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1hbmFnZWQgZm9ybQotCSAqLwotCXB1YmxpYyBJTWFuYWdlZEZvcm0gZ2V0TWFuYWdlZEZvcm0oKSB7Ci0JCXJldHVybiBtYW5hZ2VkRm9ybTsKLQl9Ci0JLyoqCi0JICogRGlzcG9zZXMgdGhlIHBhcnQuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHJlbGVhc2UgYW55IHN5c3RlbQotCSAqIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQkvKioKLQkgKiBDb21taXRzIHRoZSBwYXJ0LiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsICdzdXBlcicgd2hlbiBvdmVycmlkaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvblNhdmUKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXF1ZXN0IHRvIGNvbW1pdCBoYXMgYXJyaXZlZCBhcyBhCi0JICogICAgICAgICAgICByZXN1bHQgb2YgdGhlICdzYXZlJyBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgY29tbWl0KGJvb2xlYW4gb25TYXZlKSB7Ci0JCWRpcnR5ID0gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIG92ZXJhbGwgZm9ybSBpbnB1dC4gU3ViY2xhc2VzIG1heSBlbGVjdCB0byBvdmVycmlkZSB0aGUgbWV0aG9kCi0JICogYW5kIGFkanVzdCBhY2NvcmRpbmcgdG8gdGhlIGZvcm0gaW5wdXQuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICB0aGUgZm9ybSBpbnB1dCBvYmplY3QKLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldEZvcm1JbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBJbnN0cnVjdHMgdGhlIHBhcnQgdG8gZ3JhYiBrZXlib2FyZCBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQl9Ci0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBzZWN0aW9uIGFmdGVyIGJlY29taW5nIHN0YWxlIChmYWxsaW5nIGJlaGluZCBkYXRhIGluIHRoZQotCSAqIG1vZGVsKS4gU3ViY2xhc3NlcyBtdXN0IGNhbGwgJ3N1cGVyJyB3aGVuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc3RhbGUgPSBmYWxzZTsKLQkJLy8gc2luY2Ugd2UgaGF2ZSByZWZyZXNoZWQsIGFueSBjaGFuZ2VzIHdlIGhhZCBpbiB0aGUKLQkJLy8gcGFydCBhcmUgZ29uZSBhbmQgd2UgYXJlIG5vdCBkaXJ0eQotCQlkaXJ0eSA9IGZhbHNlOwotCX0KLQkvKioKLQkgKiBNYXJrcyB0aGUgcGFydCBkaXJ0eS4gU3ViY2xhc3NlcyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBhcyBhIHJlc3VsdCBvZgotCSAqIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgd2lkZ2V0cyBpbiB0aGUgc2VjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrRGlydHkoKSB7Ci0JCWRpcnR5ID0gdHJ1ZTsKLQkJbWFuYWdlZEZvcm0uZGlydHlTdGF0ZUNoYW5nZWQoKTsKLQl9Ci0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgcGFydCBpcyBkaXJ0eSBpLmUuIGl0cyB3aWRnZXRzIGhhdmUgc3RhdGUgdGhhdCBpcwotCSAqIG5ld2VyIHRoYW4gdGhlIGRhdGEgaW4gdGhlIG1vZGVsLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhcnQgaXMgZGlydHksIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiBkaXJ0eTsKLQl9Ci0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgcGFydCBpcyBzdGFsZSBpLmUuIGl0cyB3aWRnZXRzIGhhdmUgc3RhdGUgdGhhdCBpcwotCSAqIG9sZGVyIHRoYW4gdGhlIGRhdGEgaW4gdGhlIG1vZGVsLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhcnQgaXMgc3RhbGUsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhbGUoKSB7Ci0JCXJldHVybiBzdGFsZTsKLQl9Ci0JLyoqCi0JICogTWFya3MgdGhlIHBhcnQgc3RhbGUuIFN1YmNsYXNzZXMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYXMgYSByZXN1bHQgb2YKLQkgKiBtb2RlbCBub3RpZmljYXRpb24gdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgc2VjdGlvbiBpcyBubwotCSAqIGxvbmdlciBpbiBzeW5jIHdpdGggdGhlIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtTdGFsZSgpIHsKLQkJc3RhbGUgPSB0cnVlOwotCQltYW5hZ2VkRm9ybS5zdGFsZVN0YXRlQ2hhbmdlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL0RldGFpbHNQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9EZXRhaWxzUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzkyNjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL0RldGFpbHNQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZFBhZ2VCb29rOwotLyoqCi0gKiBUaGlzIG1hbmFnZWQgZm9ybSBwYXJ0IGhhbmRsZXMgdGhlICdkZXRhaWxzJyBwb3J0aW9uIG9mIHRoZSAKLSAqICdtYXN0ZXIvZGV0YWlscycgYmxvY2suIEl0IGhhcyBhIHBhZ2UgYm9vayB0aGF0IG1hbmFnZXMgcGFnZXMKLSAqIG9mIGRldGFpbHMgcmVnaXN0ZXJlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICogPHA+QnkgZGVmYXVsdCwgZGV0YWlscyBwYXJ0IGFjY2VwdHMgYW55IG51bWJlciBvZiBwYWdlcy4KLSAqIElmIGR5bmFtaWMgcGFnZSBwcm92aWRlciBpcyByZWdpc3RlcmVkLCB0aGlzIG51bWJlciBtYXkKLSAqIGJlIGV4Y2Vzc2l2ZS4gVG8gYXZvaWQgcnVubmluZyBvdXQgb2Ygc3RlYW0gKGJ5IGNyZWF0aW5nIAotICogYSBsYXJnZSBudW1iZXIgb2YgcGFnZXMgd2l0aCB3aWRnZXRzIG9uIGVhY2gpLCBtYXhpbXVtCi0gKiBudW1iZXIgb2YgcGFnZXMgY2FuIGJlIHNldCB0byBzb21lIHJlYXNvbmFibGUgdmFsdWUgKGUuZy4gMTApLgotICogV2hlbiB0aGlzIG51bWJlciBpcyByZWFjaGVkLCBvbGQgcGFnZXMgKHRob3NlIGNyZWF0ZWQgZmlyc3QpCi0gKiB3aWxsIGJlIHJlbW92ZWQgYW5kIGRpc3Bvc2VkIGFzIG5ldyBvbmVzIGFyZSBhZGRlZC4gSWYKLSAqIHRoZSBkaXNwb3NlZCBwYWdlcyBhcmUgbmVlZGVkIGFnYWluIGFmdGVyIHRoYXQsIHRoZXkKLSAqIHdpbGwgYmUgY3JlYXRlZCBhZ2Fpbi4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGV0YWlsc1BhcnQgaW1wbGVtZW50cyBJRm9ybVBhcnQsIElQYXJ0U2VsZWN0aW9uTGlzdGVuZXIgewotCXByaXZhdGUgSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtOwotCXByaXZhdGUgU2Nyb2xsZWRQYWdlQm9vayBwYWdlQm9vazsKLQlwcml2YXRlIElGb3JtUGFydCBtYXN0ZXJQYXJ0OwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQlwcml2YXRlIEhhc2h0YWJsZSBwYWdlczsKLQlwcml2YXRlIElEZXRhaWxzUGFnZVByb3ZpZGVyIHBhZ2VQcm92aWRlcjsKLQlwcml2YXRlIGludCBwYWdlTGltaXQ9SW50ZWdlci5NQVhfVkFMVUU7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFnZUJhZyB7Ci0JCXByaXZhdGUgc3RhdGljIGludCBjb3VudGVyOwotCQlwcml2YXRlIGludCB0aWNrZXQ7Ci0JCXByaXZhdGUgSURldGFpbHNQYWdlIHBhZ2U7Ci0JCXByaXZhdGUgYm9vbGVhbiBmaXhlZDsKLQkJCi0JCXB1YmxpYyBQYWdlQmFnKElEZXRhaWxzUGFnZSBwYWdlLCBib29sZWFuIGZpeGVkKSB7Ci0JCQl0aGlzLnBhZ2U9IHBhZ2U7Ci0JCQl0aGlzLmZpeGVkID0gZml4ZWQ7Ci0JCQl0aGlzLnRpY2tldCA9ICsrY291bnRlcjsKLQkJfQotCQlwdWJsaWMgaW50IGdldFRpY2tldCgpIHsKLQkJCXJldHVybiB0aWNrZXQ7Ci0JCX0KLQkJcHVibGljIElEZXRhaWxzUGFnZSBnZXRQYWdlKCkgewotCQkJcmV0dXJuIHBhZ2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXBhZ2UuZGlzcG9zZSgpOwotCQkJcGFnZT1udWxsOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCQlyZXR1cm4gcGFnZT09bnVsbDsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZpeGVkKCkgewotCQkJcmV0dXJuIGZpeGVkOwotCQl9Ci0JCXB1YmxpYyBzdGF0aWMgaW50IGdldEN1cnJlbnRUaWNrZXQoKSB7Ci0JCQlyZXR1cm4gY291bnRlcjsKLQkJfQotCX0KLS8qKgotICogQ3JlYXRlcyBhIGRldGFpbHMgcGFydCBieSB3cmFwcGluZyB0aGUgcHJvdmlkZWQgcGFnZSBib29rLgotICogQHBhcmFtIG1mb3JtIHRoZSBwYXJlbnQgZm9ybQotICogQHBhcmFtIHBhZ2VCb29rIHRoZSBwYWdlIGJvb2sgdG8gd3JhcAotICovCQotCXB1YmxpYyBEZXRhaWxzUGFydChJTWFuYWdlZEZvcm0gbWZvcm0sIFNjcm9sbGVkUGFnZUJvb2sgcGFnZUJvb2spIHsKLQkJdGhpcy5wYWdlQm9vayA9IHBhZ2VCb29rOwotCQlwYWdlcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdGlhbGl6ZShtZm9ybSk7Ci0JfQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IGRldGFpbHMgcGFydCBpbiB0aGUgcHJvdmlkZWQgZm9ybSBieSBjcmVhdGluZyAKLSAqIHRoZSBwYWdlIGJvb2suCi0gKiBAcGFyYW0gbWZvcm0gdGhlIHBhcmVudCBmb3JtCi0gKiBAcGFyYW0gcGFyZW50IHRoZSBjb21wb3NpdGUgdG8gY3JlYXRlIHRoZSBwYWdlIGJvb2sgaW4KLSAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgZm9yIHRoZSBwYWdlIGJvb2sKLSAqLwotCXB1YmxpYyBEZXRhaWxzUGFydChJTWFuYWdlZEZvcm0gbWZvcm0sIENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQl0aGlzKG1mb3JtLCBtZm9ybS5nZXRUb29sa2l0KCkuY3JlYXRlUGFnZUJvb2socGFyZW50LCBzdHlsZXxTV1QuVl9TQ1JPTEx8U1dULkhfU0NST0xMKSk7Ci0JfQotLyoqCi0gKiBSZWdpc3RlcnMgdGhlIGRldGFpbHMgcGFnZSB0byBiZSB1c2VkIGZvciBhbGwgdGhlIG9iamVjdHMgb2YKLSAqIHRoZSBwcm92aWRlZCBvYmplY3QgY2xhc3MuCi0gKiBAcGFyYW0gb2JqZWN0Q2xhc3MgYW4gb2JqZWN0IG9mIHR5cGUgJ2phdmEubGFuZy5DbGFzcycgdG8gYmUgdXNlZCAKLSAqIGFzIGEga2V5IGZvciB0aGUgcHJvdmlkZWQgcGFnZQotICogQHBhcmFtIHBhZ2UgdGhlIHBhZ2UgdG8gc2hvdyBmb3Igb2JqZWN0cyBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGNsYXNzCi0gKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlclBhZ2UoT2JqZWN0IG9iamVjdENsYXNzLCBJRGV0YWlsc1BhZ2UgcGFnZSkgewotCQlyZWdpc3RlclBhZ2Uob2JqZWN0Q2xhc3MsIHBhZ2UsIHRydWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJQYWdlKE9iamVjdCBvYmplY3RDbGFzcywgSURldGFpbHNQYWdlIHBhZ2UsIGJvb2xlYW4gZml4ZWQpIHsKLQkJcGFnZXMucHV0KG9iamVjdENsYXNzLCBuZXcgUGFnZUJhZyhwYWdlLCBmaXhlZCkpOwotCQlwYWdlLmluaXRpYWxpemUobWFuYWdlZEZvcm0pOwotCX0KLS8qKgotICogU2V0cyB0aGUgZHluYW1pYyBwYWdlIHByb3ZpZGVyLiBUaGUgZHluYW1pYyBwcm92aWRlciBjYW4gcmV0dXJuCi0gKiBkaWZmZXJlbnQgcGFnZXMgZm9yIG9iamVjdHMgb2YgdGhlIHNhbWUgY2xhc3MgYmFzZWQgb24gdGhlaXIgc3RhdGUuCi0gKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHByb3ZpZGVyIHRvIHVzZQotICovCi0JcHVibGljIHZvaWQgc2V0UGFnZVByb3ZpZGVyKElEZXRhaWxzUGFnZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXRoaXMucGFnZVByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JfQotLyoqCi0gKiBDb21taXRzIHRoZSBwYXJ0IGJ5IGNvbW1pdHRpbmcgdGhlIGN1cnJlbnQgcGFnZS4KLSAqIEBwYXJhbSBvblNhdmUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29tbWl0IGlzIHJlcXVlc3RlZCBhcyBhIHJlc3VsdAotICogb2YgdGhlICdzYXZlJyBhY3Rpb24sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gKi8KLQlwdWJsaWMgdm9pZCBjb21taXQoYm9vbGVhbiBvblNhdmUpIHsKLQkJSURldGFpbHNQYWdlIHBhZ2UgPSBnZXRDdXJyZW50UGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKQotCQkJcGFnZS5jb21taXQob25TYXZlKTsKLQl9Ci0vKioKLSAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFnZSB2aXNpYmxlIGluIHRoZSBwYXJ0LgotICogQHJldHVybiB0aGUgY3VycmVudCBwYWdlCi0gKi8KLQlwdWJsaWMgSURldGFpbHNQYWdlIGdldEN1cnJlbnRQYWdlKCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBwYWdlQm9vay5nZXRDdXJyZW50UGFnZSgpOwotCQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZGF0YSA9IGNvbnRyb2wuZ2V0RGF0YSgpOwotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBJRGV0YWlsc1BhZ2UpCi0JCQkJcmV0dXJuIChJRGV0YWlsc1BhZ2UpIGRhdGE7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuSUZvcm1QYXJ0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoRW51bWVyYXRpb24gZW5tID0gcGFnZXMuZWxlbWVudHMoKTsgZW5tLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJUGFnZUJhZyBwYWdlQmFnID0gKFBhZ2VCYWcpIGVubS5uZXh0RWxlbWVudCgpOwotCQkJcGFnZUJhZy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRm9ybVBhcnQjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm0pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJTWFuYWdlZEZvcm0gZm9ybSkgewotCQl0aGlzLm1hbmFnZWRGb3JtID0gZm9ybTsKLQl9Ci0vKioKLSAqIFRlc3RzIGlmIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBwYWdlIGlzIGRpcnR5LgotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFnZSBpcyBkaXJ0eSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCUlEZXRhaWxzUGFnZSBwYWdlID0gZ2V0Q3VycmVudFBhZ2UoKTsKLQkJaWYgKHBhZ2UgIT0gbnVsbCkKLQkJCXJldHVybiBwYWdlLmlzRGlydHkoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLS8qKgotICogVGVzdHMgaWYgdGhlIGN1cnJlbnRseSB2aXNpYmxlIHBhZ2UgaXMgc3RhbGUgYW5kIG5lZWRzIHJlZnJlc2hpbmcuCi0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYWdlIGlzIHN0YWxlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICovCQotCXB1YmxpYyBib29sZWFuIGlzU3RhbGUoKSB7Ci0JCUlEZXRhaWxzUGFnZSBwYWdlID0gZ2V0Q3VycmVudFBhZ2UoKTsKLQkJaWYgKHBhZ2UgIT0gbnVsbCkKLQkJCXJldHVybiBwYWdlLmlzU3RhbGUoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotLyoqCi0gKiBSZWZyZXNoZXMgdGhlIGN1cnJlbnQgcGFnZS4KLSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCUlEZXRhaWxzUGFnZSBwYWdlID0gZ2V0Q3VycmVudFBhZ2UoKTsKLQkJaWYgKHBhZ2UgIT0gbnVsbCkKLQkJCXBhZ2UucmVmcmVzaCgpOwotCX0KLS8qKgotICogU2V0cyB0aGUgZm9jdXMgdG8gdGhlIGN1cnJlbnRseSB2aXNpYmxlIHBhZ2UuCi0gKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJSURldGFpbHNQYWdlIHBhZ2UgPSBnZXRDdXJyZW50UGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKQotCQkJcGFnZS5zZXRGb2N1cygpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklGb3JtUGFydCNzZXRGb3JtSW5wdXQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXRGb3JtSW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JUGFydFNlbGVjdGlvbkxpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuZm9ybXMuSUZvcm1QYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUZvcm1QYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMubWFzdGVyUGFydCA9IHBhcnQ7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uICE9IG51bGwpIHsKLQkJfQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQljdXJyZW50U2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCWVsc2UKLQkJCWN1cnJlbnRTZWxlY3Rpb24gPSBudWxsOwotCQl1cGRhdGUoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHVwZGF0ZSgpIHsKLQkJT2JqZWN0IGtleSA9IG51bGw7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGN1cnJlbnRTZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChrZXkgPT0gbnVsbCkKLQkJCQkJa2V5ID0gZ2V0S2V5KG9iaik7Ci0JCQkJZWxzZSBpZiAoZ2V0S2V5KG9iaikuZXF1YWxzKGtleSkgPT0gZmFsc2UpIHsKLQkJCQkJa2V5ID0gbnVsbDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNob3dQYWdlKGtleSk7Ci0JfQotCXByaXZhdGUgT2JqZWN0IGdldEtleShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYWdlUHJvdmlkZXIhPW51bGwpIHsKLQkJCU9iamVjdCBrZXkgPSBwYWdlUHJvdmlkZXIuZ2V0UGFnZUtleShvYmplY3QpOwotCQkJaWYgKGtleSE9bnVsbCkKLQkJCQlyZXR1cm4ga2V5OwotCQl9Ci0JCXJldHVybiBvYmplY3QuZ2V0Q2xhc3MoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNob3dQYWdlKGZpbmFsIE9iamVjdCBrZXkpIHsKLQkJY2hlY2tMaW1pdCgpOwotCQlmaW5hbCBJRGV0YWlsc1BhZ2Ugb2xkUGFnZSA9IGdldEN1cnJlbnRQYWdlKCk7Ci0JCWlmIChrZXkgIT0gbnVsbCkgewotCQkJUGFnZUJhZyBwYWdlQmFnID0gKFBhZ2VCYWcpcGFnZXMuZ2V0KGtleSk7Ci0JCQlJRGV0YWlsc1BhZ2UgcGFnZSA9IHBhZ2VCYWchPW51bGw/cGFnZUJhZy5nZXRQYWdlKCk6bnVsbDsKLQkJCWlmIChwYWdlPT1udWxsKSB7Ci0JCQkJLy8gdHJ5IHRvIGdldCB0aGUgcGFnZSBkeW5hbWljYWxseSBmcm9tIHRoZSBwcm92aWRlcgotCQkJCWlmIChwYWdlUHJvdmlkZXIhPW51bGwpIHsKLQkJCQkJcGFnZSA9IHBhZ2VQcm92aWRlci5nZXRQYWdlKGtleSk7Ci0JCQkJCWlmIChwYWdlIT1udWxsKSB7Ci0JCQkJCQlyZWdpc3RlclBhZ2Uoa2V5LCBwYWdlLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJZmluYWwgSURldGFpbHNQYWdlIGZwYWdlID0gcGFnZTsKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShwYWdlQm9vay5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKCFwYWdlQm9vay5oYXNQYWdlKGtleSkpIHsKLQkJCQkJCQlDb21wb3NpdGUgcGFyZW50ID0gcGFnZUJvb2suY3JlYXRlUGFnZShrZXkpOwotCQkJCQkJCWZwYWdlLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCQkJCQkJcGFyZW50LnNldERhdGEoZnBhZ2UpOwotCQkJCQkJfQotCQkJCQkJLy9jb21taXQgdGhlIGN1cnJlbnQgcGFnZQotCQkJCQkJaWYgKG9sZFBhZ2UhPW51bGwgJiYgb2xkUGFnZS5pc0RpcnR5KCkpCi0JCQkJCQkJb2xkUGFnZS5jb21taXQoZmFsc2UpOwotCQkJCQkJLy9yZWZyZXNoIHRoZSBuZXcgcGFnZQotCQkJCQkJaWYgKGZwYWdlLmlzU3RhbGUoKSkKLQkJCQkJCQlmcGFnZS5yZWZyZXNoKCk7Ci0JCQkJCQlmcGFnZS5zZWxlY3Rpb25DaGFuZ2VkKG1hc3RlclBhcnQsIGN1cnJlbnRTZWxlY3Rpb24pOwotCQkJCQkJcGFnZUJvb2suc2hvd1BhZ2Uoa2V5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBJZiB3ZSBhcmUgc3dpdGNoaW5nIGZyb20gYW4gb2xkIHBhZ2UgdG8gbm90aGluZywKLQkJLy8gZG9uJ3QgbG9vc2UgZGF0YSAKLQkJaWYgKG9sZFBhZ2UhPW51bGwgJiYgb2xkUGFnZS5pc0RpcnR5KCkpCi0JCQlvbGRQYWdlLmNvbW1pdChmYWxzZSk7Ci0JCXBhZ2VCb29rLnNob3dFbXB0eVBhZ2UoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNoZWNrTGltaXQoKSB7Ci0JCWlmIChwYWdlcy5zaXplKCkgPD0gZ2V0UGFnZUxpbWl0KCkpIHJldHVybjsKLQkJLy8gb3ZlcmZsb3cKLQkJaW50IGN1cnJlbnRUaWNrZXQgPSBQYWdlQmFnLmdldEN1cnJlbnRUaWNrZXQoKTsKLQkJaW50IGN1dG9mZlRpY2tldCA9IGN1cnJlbnRUaWNrZXQgLSBnZXRQYWdlTGltaXQoKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlbm09cGFnZXMua2V5cygpOyBlbm0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlPYmplY3Qga2V5ID0gZW5tLm5leHRFbGVtZW50KCk7Ci0JCQlQYWdlQmFnIHBhZ2VCYWcgPSAoUGFnZUJhZylwYWdlcy5nZXQoa2V5KTsKLQkJCWlmIChwYWdlQmFnLmdldFRpY2tldCgpPD1jdXRvZmZUaWNrZXQpIHsKLQkJCQkvLyBjYW5kaWRhdGUgLSBzZWUgaWYgaXQgaXMgYWN0aXZlIGFuZCBub3QgZml4ZWQKLQkJCQlpZiAoIXBhZ2VCYWcuaXNGaXhlZCgpICYmICFwYWdlQmFnLmdldFBhZ2UoKS5lcXVhbHMoZ2V0Q3VycmVudFBhZ2UoKSkpIHsKLQkJCQkJLy8gZHJvcCBpdAotCQkJCQlwYWdlQmFnLmRpc3Bvc2UoKTsKLQkJCQkJcGFnZXMucmVtb3ZlKGtleSk7Ci0JCQkJCXBhZ2VCb29rLnJlbW92ZVBhZ2Uoa2V5LCBmYWxzZSk7CQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWdlcyB0aGF0IHNob3VsZCBiZQotCSAqIG1haW50YWluZWQgaW4gdGhpcyBwYXJ0LiBXaGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0bwotCSAqIGFkZCBtb3JlIHBhZ2VzLCBvbGQgcGFnZXMgYXJlIHJlbW92ZWQgYW5kIGRpc3Bvc2VkCi0JICogYmFzZWQgb24gdGhlIG9yZGVyIG9mIGNyZWF0aW9uICh0aGUgb2xkZXN0IHBhZ2VzCi0JICogYXJlIHJlbW92ZWQpLiBUaGUgZXhjZXB0aW9uIGlzIG1hZGUgZm9yIHRoZSAKLQkgKiBwYWdlIHRoYXQgc2hvdWxkIG90aGVyd2lzZSBiZSBkaXNwb3NlZCBidXQgaXMKLQkgKiBjdXJyZW50bHkgYWN0aXZlLgotCSAqIEByZXR1cm4gbWF4aW11bSBudW1iZXIgb2YgcGFnZXMgZm9yIHRoaXMgcGFydAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UGFnZUxpbWl0KCkgewotCQlyZXR1cm4gcGFnZUxpbWl0OwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBwYWdlIGxpbWl0IGZvciB0aGlzIHBhcnQuIAotCSAqIEBzZWUgI2dldFBhZ2VMaW1pdCgpCi0JICogQHBhcmFtIHBhZ2VMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMgdGhhdAotCSAqIHNob3VsZCBiZSBtYWludGFpbmVkIGluIHRoaXMgcGFydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlTGltaXQoaW50IHBhZ2VMaW1pdCkgewotCQl0aGlzLnBhZ2VMaW1pdCA9IHBhZ2VMaW1pdDsKLQkJY2hlY2tMaW1pdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL0Zvcm1Db2xvcnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL0Zvcm1Db2xvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3OThhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9Gb3JtQ29sb3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogTWFuYWdlcyBjb2xvcnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gZm9ybXMgYW5kIGZvcm0gd2lkZ2V0cy4gVGhlIGNvbG9ycyBhcmUKLSAqIGNob3NlbiB0byBtYWtlIHRoZSB3aWRnZXRzIGxvb2sgY29ycmVjdCBpbiB0aGUgZWRpdG9yIGFyZWEuIElmIGEgZGlmZmVyZW50Ci0gKiBzZXQgb2YgY29sb3JzIGlzIG5lZWRlZCwgc3ViY2xhc3MgdGhpcyBjbGFzcyBhbmQgb3ZlcnJpZGUgJ2luaXRpYWxpemUnIGFuZC9vcgotICogJ2luaXRpYWxpemVDb2xvcnMnLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtQ29sb3JzIHsKLQkvKioKLQkgKiBLZXkgZm9yIHRoZSBmb3JtIHRpdGxlIGZvcmVncm91bmQgY29sb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAib3JnLmVjbGlwc2UudWkuZm9ybXMuVElUTEUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBLZXkgZm9yIHRoZSB0cmVlL3RhYmxlIGJvcmRlciBjb2xvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT1JERVIgPSAib3JnLmVjbGlwc2UudWkuZm9ybXMuQk9SREVSIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogS2V5IGZvciB0aGUgc2VjdGlvbiBzZXBhcmF0b3IgY29sb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIm9yZy5lY2xpcHNlLnVpLmZvcm1zLlNFUEFSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEtleSBmb3IgdGhlIHNlY3Rpb24gdGl0bGUgYmFyIGJhY2tncm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEJfQkcgPSAib3JnLmVjbGlwc2UudWkuZm9ybXMuVEJfQkciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBLZXkgZm9yIHRoZSBzZWN0aW9uIHRpdGxlIGJhciBmb3JlZ3JvdW5kLgotCSAqIAotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRCX0ZHID0gIm9yZy5lY2xpcHNlLnVpLmZvcm1zLlRCX0ZHIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogS2V5IGZvciB0aGUgc2VjdGlvbiB0aXRsZSBiYXIgZ3JhZGllbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEJfR0JHID0gIm9yZy5lY2xpcHNlLnVpLmZvcm1zLlRCX0dCRyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEtleSBmb3IgdGhlIHNlY3Rpb24gdGl0bGUgYmFyIGJvcmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQl9CT1JERVIgPSAib3JnLmVjbGlwc2UudWkuZm9ybXMuVEJfQk9SREVSIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogS2V5IGZvciB0aGUgc2VjdGlvbiB0b2dnbGUgY29sb3IuIFNpbmNlIDMuMSwgdGhpcyBjb2xvciBpcyB1c2VkIGZvciBhbGwKLQkgKiBzZWN0aW9uIHN0eWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQl9UT0dHTEUgPSAib3JnLmVjbGlwc2UudWkuZm9ybXMuVEJfVE9HR0xFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogS2V5IGZvciB0aGUgc2VjdGlvbiB0b2dnbGUgaG92ZXIgY29sb3IuCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRCX1RPR0dMRV9IT1ZFUiA9ICJvcmcuZWNsaXBzZS51aS5mb3Jtcy5UQl9UT0dHTEVfSE9WRVIiOyAvLyROT04tTkxTLTEkCQotCi0JcHJvdGVjdGVkIE1hcCBjb2xvclJlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoMTApOwotCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmQ7Ci0KLQlwcm90ZWN0ZWQgQ29sb3IgZm9yZWdyb3VuZDsKLQotCXByaXZhdGUgYm9vbGVhbiBzaGFyZWQ7Ci0KLQlwcm90ZWN0ZWQgRGlzcGxheSBkaXNwbGF5OwotCi0JcHJvdGVjdGVkIENvbG9yIGJvcmRlcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJHQiBXSElURSA9IG5ldyBSR0IoMjU1LCAyNTUsIDI1NSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSR0IgQkxBQ0sgPSBuZXcgUkdCKDAsIDAsIDApOwotCi0JLyoqCi0JICogQ3JlYXRlcyBmb3JtIGNvbG9ycyB1c2luZyB0aGUgcHJvdmlkZWQgZGlzcGxheS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheQotCSAqICAgICAgICAgICAgdGhlIGRpc3BsYXkgdG8gdXNlCi0JICovCi0JcHVibGljIEZvcm1Db2xvcnMoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCXRoaXMuZGlzcGxheSA9IGRpc3BsYXk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5IHVzZWQgdG8gY3JlYXRlIGNvbG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5Ci0JICovCi0JcHVibGljIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIGRpc3BsYXk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGNvbG9ycy4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoZQotCSAqIHdheSBjb2xvcnMgYXJlIGNyZWF0ZWQuIEFsdGVybmF0aXZlbHksIG9ubHkgdGhlIGNvbG9yIHRhYmxlIGNhbiBiZQotCSAqIG1vZGlmaWVkIGJ5IG92ZXJyaWRpbmcgPGNvZGU+aW5pdGlhbGl6ZUNvbG9yVGFibGUoKTwvY29kZT4uCi0JICogCi0JICogQHNlZSAjaW5pdGlhbGl6ZUNvbG9yVGFibGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQliYWNrZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQkJZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCWluaXRpYWxpemVDb2xvclRhYmxlKCk7Ci0JCXVwZGF0ZUJvcmRlckNvbG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb2NhdGVzIGNvbG9ycyBmb3IgdGhlIGZvbGxvd2luZyBrZXlzOiBCT1JERVIsIENPTVBPU0lURV9TRVBBUkFUT1IgYW5kCi0JICogREVGQVVMVF9IRUFERVIuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIGFsbG9jYXRlIHRoaXMgY29sb3JzCi0JICogZGlmZmVyZW50bHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbG9yVGFibGUoKSB7Ci0JCWNyZWF0ZVRpdGxlQ29sb3IoKTsKLQkJY3JlYXRlVHdpc3RpZUNvbG9ycygpOwotCQljcmVhdGVDb2xvcihTRVBBUkFUT1IsIGdldENvbG9yKFRJVExFKS5nZXRSR0IoKSk7Ci0JCVJHQiBib3JkZXJSR0IgPSBnZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfVElUTEVfSU5BQ1RJVkVfQkFDS0dST1VORF9HUkFESUVOVCk7Ci0JCWNyZWF0ZUNvbG9yKEJPUkRFUiwgYmxlbmQoYm9yZGVyUkdCLCBCTEFDSywgODApKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvY2F0ZXMgY29sb3JzIGZvciB0aGUgc2VjdGlvbiB0b29sIGJhciAoYWxsIHRoZSBrZXlzIHRoYXQgc3RhcnQgd2l0aAotCSAqIFRCKS4gU2luY2UgdGhlc2UgY29sb3JzIGFyZSBvbmx5IG5lZWRlZCB3aGVuIFRJVExFX0JBUiBzdHlsZSBpcyB1c2VkIHdpdGgKLQkgKiB0aGUgU2VjdGlvbiB3aWRnZXQsIHRoZXkgYXJlIG5vdCBuZWVkZWQgYWxsIHRoZSB0aW1lIGFuZCBhcmUgYWxsb2NhdGVkIG9uCi0JICogZGVtYW5kLiBDb25zZXF1ZW50bHksIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZyBpZiB0aGUgY29sb3JzIGhhdmUgYmVlbgotCSAqIGFscmVhZHkgaW5pdGlhbGl6ZWQuIENhbGwgdGhpcyBtZXRob2QgcHJpb3IgdG8gdXNpbmcgY29sb3JzIHdpdGggdGhlIFRCCi0JICoga2V5cyB0byBlbnN1cmUgdGhleSBhcmUgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVTZWN0aW9uVG9vbEJhckNvbG9ycygpIHsKLQkJaWYgKGdldENvbG9yKEZvcm1Db2xvcnMuVEJfQkcpICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNyZWF0ZVRpdGxlQmFyR3JhZGllbnRDb2xvcnMoKTsKLQkJY3JlYXRlVGl0bGVCYXJPdXRsaW5lQ29sb3JzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgUkdCIHZhbHVlIG9mIHRoZSBzeXN0ZW0gY29sb3IgcmVwcmVzZW50ZWQgYnkgdGhlIGNvZGUKLQkgKiBhcmd1bWVudCwgYXMgZGVmaW5lZCBpbiA8Y29kZT5TV1Q8L2NvZGU+IGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBjb2RlCi0JICogICAgICAgICAgICB0aGUgc3lzdGVtIGNvbG9yIGNvbnN0YW50IGFzIGRlZmluZWQgaW4gPGNvZGU+U1dUPC9jb2RlPgotCSAqICAgICAgICAgICAgY2xhc3MuCi0JICogQHJldHVybiB0aGUgUkdCIHZhbHVlIG9mIHRoZSBzeXN0ZW0gY29sb3IKLQkgKi8KLQlwdWJsaWMgUkdCIGdldFN5c3RlbUNvbG9yKGludCBjb2RlKSB7Ci0JCXJldHVybiBnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoY29kZSkuZ2V0UkdCKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29sb3IgZm9yIHRoZSBzcGVjaWZpZWQga2V5IHVzaW5nIHRoZSBwcm92aWRlZCBSR0Igb2JqZWN0LgotCSAqIFRoZSBjb2xvciBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZCBhbmQgYWxzbyBwdXQgaW50byB0aGUgcmVnaXN0cnkuIFdoZW4KLQkgKiB0aGUgY2xhc3MgaXMgZGlzcG9zZWQsIHRoZSBjb2xvciB3aWxsIGJlIGRpc3Bvc2VkIHdpdGggaXQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBjb2xvciBrZXkKLQkgKiBAcGFyYW0gcmdiCi0JICogICAgICAgICAgICB0aGUgUkdCIG9iamVjdAotCSAqIEByZXR1cm4gdGhlIGFsbG9jYXRlZCBjb2xvciBvYmplY3QKLQkgKi8KLQlwdWJsaWMgQ29sb3IgY3JlYXRlQ29sb3IoU3RyaW5nIGtleSwgUkdCIHJnYikgewotCQlyZXR1cm4gY3JlYXRlQ29sb3Ioa2V5LCByZ2IucmVkLCByZ2IuZ3JlZW4sIHJnYi5ibHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29sb3IgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYXJlYXMgb2YgdGhlIGZvcm0gdGhhdCBpcyBpbmFjdGl2ZS4KLQkgKiBUaGVzZSBhcmVhcyBjYW4gY29udGFpbiBpbWFnZXMsIGxpbmtzLCBjb250cm9scyBhbmQgb3RoZXIgY29udGVudCBidXQgYXJlCi0JICogY29uc2lkZXJlZCBhdXhpbGxpYXJ5IHRvIHRoZSBtYWluIGNvbnRlbnQgYXJlYS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGUgY29sb3Igc2hvdWxkIG5vdCBiZSBkaXNwb3NlZCBiZWNhdXNlIGl0IGlzIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbmFjdGl2ZSBmb3JtIGNvbG9yCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRJbmFjdGl2ZUJhY2tncm91bmQoKSB7Ci0JCVN0cmluZyBrZXkgPSAiX19uY2JnX18iOyAvLyROT04tTkxTLTEkCi0JCUNvbG9yIGNvbG9yID0gZ2V0Q29sb3Ioa2V5KTsKLQkJaWYgKGNvbG9yID09IG51bGwpIHsKLQkJCVJHQiBzZWwgPSBnZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pOwotCQkJLy8gYSBibGVuZCBvZiA5NSUgd2hpdGUgYW5kIDUlIGxpc3Qgc2VsZWN0aW9uIHN5c3RlbSBjb2xvcgotCQkJUkdCIG5jYmcgPSBibGVuZChzZWwsIGdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSksIDUpOwotCQkJY29sb3IgPSBjcmVhdGVDb2xvcihrZXksIG5jYmcpOwotCQl9Ci0JCXJldHVybiBjb2xvcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb2xvciBmb3IgdGhlIHNwZWNpZmllZCBrZXkgdXNpbmcgdGhlIHByb3ZpZGVkIFJHQiB2YWx1ZXMuCi0JICogVGhlIGNvbG9yIG9iamVjdCB3aWxsIGJlIHJldHVybmVkIGFuZCBhbHNvIHB1dCBpbnRvIHRoZSByZWdpc3RyeS4gSWYKLQkgKiB0aGVyZSBpcyBhbHJlYWR5IGFub3RoZXIgY29sb3Igb2JqZWN0IHVuZGVyIHRoZSBzYW1lIGtleSBpbiB0aGUgcmVnaXN0cnksCi0JICogdGhlIGV4aXN0aW5nIG9iamVjdCB3aWxsIGJlIGRpc3Bvc2VkLiBXaGVuIHRoZSBjbGFzcyBpcyBkaXNwb3NlZCwgdGhlCi0JICogY29sb3Igd2lsbCBiZSBkaXNwb3NlZCB3aXRoIGl0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSB1bmlxdWUgY29sb3Iga2V5Ci0JICogQHBhcmFtIHIKLQkgKiAgICAgICAgICAgIHJlZCB2YWx1ZQotCSAqIEBwYXJhbSBnCi0JICogICAgICAgICAgICBncmVlbiB2YWx1ZQotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICBibHVlIHZhbHVlCi0JICogQHJldHVybiB0aGUgYWxsb2NhdGVkIGNvbG9yIG9iamVjdAotCSAqLwotCXB1YmxpYyBDb2xvciBjcmVhdGVDb2xvcihTdHJpbmcga2V5LCBpbnQgciwgaW50IGcsIGludCBiKSB7Ci0JCUNvbG9yIGMgPSBuZXcgQ29sb3IoZGlzcGxheSwgciwgZywgYik7Ci0JCUNvbG9yIHByZXZDID0gKENvbG9yKSBjb2xvclJlZ2lzdHJ5LmdldChrZXkpOwotCQlpZiAocHJldkMgIT0gbnVsbCkKLQkJCXByZXZDLmRpc3Bvc2UoKTsKLQkJY29sb3JSZWdpc3RyeS5wdXQoa2V5LCBjKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGJvcmRlciBjb2xvciByZWxhdGl2ZSB0byB0aGUgYmFja2dyb3VuZC4gQWxsb2NhdGVkIGJvcmRlcgotCSAqIGNvbG9yIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2VsbCB3aXRoIHdoaXRlLiBPdGhlcndpc2UsIHN0YW5hcmQgd2lkZ2V0Ci0JICogYmFja2dyb3VuZCBjb2xvciB3aWxsIGJlIHVzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQm9yZGVyQ29sb3IoKSB7Ci0JCWlmIChpc1doaXRlQmFja2dyb3VuZCgpKQotCQkJYm9yZGVyID0gZ2V0Q29sb3IoQk9SREVSKTsKLQkJZWxzZSB7Ci0JCQlib3JkZXIgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCk7Ci0JCQlDb2xvciBiZyA9IGdldEltcGxpZWRCYWNrZ3JvdW5kKCk7Ci0JCQlpZiAoYm9yZGVyLmdldFJlZCgpID09IGJnLmdldFJlZCgpCi0JCQkJCSYmIGJvcmRlci5nZXRHcmVlbigpID09IGJnLmdldEdyZWVuKCkKLQkJCQkJJiYgYm9yZGVyLmdldEJsdWUoKSA9PSBiZy5nZXRCbHVlKCkpCi0JCQkJYm9yZGVyID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0RBUktfU0hBRE9XKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3IuIEFsbCB0aGUgdG9vbGtpdHMgdGhhdCB1c2UgdGhpcyBjbGFzcyB3aWxsCi0JICogc2hhcmUgdGhlIHNhbWUgYmFja2dyb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gYmcKLQkgKiAgICAgICAgICAgIGJhY2tncm91bmQgY29sb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKENvbG9yIGJnKSB7Ci0JCXRoaXMuYmFja2dyb3VuZCA9IGJnOwotCQl1cGRhdGVCb3JkZXJDb2xvcigpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3IuIEFsbCB0aGUgdG9vbGtpdHMgdGhhdCB1c2UgdGhpcyBjbGFzcyB3aWxsCi0JICogc2hhcmUgdGhlIHNhbWUgZm9yZWdyb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmcKLQkgKiAgICAgICAgICAgIGZvcmVncm91bmQgY29sb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIGZnKSB7Ci0JCXRoaXMuZm9yZWdyb3VuZCA9IGZnOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgYmFja2dyb3VuZCBjb2xvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYWNrZ3JvdW5kIGNvbG9yCi0JICovCi0JcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoKSB7Ci0JCXJldHVybiBiYWNrZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgZm9yZWdyb3VuZCBjb2xvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb3JlZ3JvdW5kIGNvbG9yCi0JICovCi0JcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoKSB7Ci0JCXJldHVybiBmb3JlZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXB1dGVkIGJvcmRlciBjb2xvci4gQm9yZGVyIGNvbG9yIGRlcGVuZHMgb24gdGhlIGJhY2tncm91bmQKLQkgKiBhbmQgaXMgcmVjb21wdXRlZCB3aGVuZXZlciB0aGUgYmFja2dyb3VuZCBjaGFuZ2VzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgYm9yZGVyIGNvbG9yCi0JICovCi0JcHVibGljIENvbG9yIGdldEJvcmRlckNvbG9yKCkgewotCQlyZXR1cm4gYm9yZGVyOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGlmIHRoZSBiYWNrZ3JvdW5kIGlzIHdoaXRlLiBXaGl0ZSBiYWNrZ3JvdW5kIGhhcyBSR0IgdmFsdWUKLQkgKiAyNTUsMjU1LDI1NS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxzYW1wPnRydWU8L3NhbXA+IGlmIGJhY2tncm91bmQgaXMgd2hpdGUsIDxzYW1wPmZhbHNlPC9zYW1wPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2hpdGVCYWNrZ3JvdW5kKCkgewotCQlDb2xvciBiZyA9IGdldEltcGxpZWRCYWNrZ3JvdW5kKCk7Ci0JCXJldHVybiBiZy5nZXRSZWQoKSA9PSAyNTUgJiYgYmcuZ2V0R3JlZW4oKSA9PSAyNTUKLQkJCQkmJiBiZy5nZXRCbHVlKCkgPT0gMjU1OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbG9yIG9iamVjdCBmb3IgdGhlIHByb3ZpZGVkIGtleSBvciA8c2FtcD5udWxsIDwvc2FtcD4gaWYKLQkgKiBub3QgaW4gdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBjb2xvciBrZXkKLQkgKiBAcmV0dXJuIGNvbG9yIG9iamVjdCBpZiBmb3VuZCwgb3IgPHNhbXA+bnVsbCA8L3NhbXA+IGlmIG5vdC4KLQkgKi8KLQlwdWJsaWMgQ29sb3IgZ2V0Q29sb3IoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gKENvbG9yKSBjb2xvclJlZ2lzdHJ5LmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCB0aGUgY29sb3JzIGluIHRoZSByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlJdGVyYXRvciBlID0gY29sb3JSZWdpc3RyeS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpCi0JCQkoKENvbG9yKSBlLm5leHQoKSkuZGlzcG9zZSgpOwotCQljb2xvclJlZ2lzdHJ5ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBNYXJrcyB0aGUgY29sb3JzIHNoYXJlZC4gVGhpcyBwcmV2ZW50cyB0b29sa2l0cyB0aGF0IHNoYXJlIHRoaXMgb2JqZWN0Ci0JICogZnJvbSBkaXNwb3NpbmcgaXQuCi0JICovCi0JcHVibGljIHZvaWQgbWFya1NoYXJlZCgpIHsKLQkJdGhpcy5zaGFyZWQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGlmIHRoZSBjb2xvcnMgYXJlIHNoYXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHNoYXJlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuIHNoYXJlZDsKLQl9Ci0KLQkvKioKLQkgKiBCbGVuZHMgYzEgYW5kIGMyIGJhc2VkIGluIHRoZSBwcm92aWRlZCByYXRpby4KLQkgKiAKLQkgKiBAcGFyYW0gYzEKLQkgKiAgICAgICAgICAgIGZpcnN0IGNvbG9yCi0JICogQHBhcmFtIGMyCi0JICogICAgICAgICAgICBzZWNvbmQgY29sb3IKLQkgKiBAcGFyYW0gcmF0aW8KLQkgKiAgICAgICAgICAgIHBlcmNlbnRhZ2Ugb2YgdGhlIGZpcnN0IGNvbG9yIGluIHRoZSBibGVuZCAoMC0xMDApCi0JICogQHJldHVybiB0aGUgUkdCIHZhbHVlIG9mIHRoZSBibGVuZGVkIGNvbG9yCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUkdCIGJsZW5kKFJHQiBjMSwgUkdCIGMyLCBpbnQgcmF0aW8pIHsKLQkJaW50IHIgPSBibGVuZChjMS5yZWQsIGMyLnJlZCwgcmF0aW8pOwotCQlpbnQgZyA9IGJsZW5kKGMxLmdyZWVuLCBjMi5ncmVlbiwgcmF0aW8pOwotCQlpbnQgYiA9IGJsZW5kKGMxLmJsdWUsIGMyLmJsdWUsIHJhdGlvKTsKLQkJcmV0dXJuIG5ldyBSR0IociwgZywgYik7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlIHNvdXJjZSBSR0IgZm9yIHJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSByZ2IKLQkgKiAgICAgICAgICAgIHRoZSB0ZXN0ZWQgUkdCCi0JICogQHBhcmFtIGZyb20KLQkgKiAgICAgICAgICAgIHJhbmdlIHN0YXJ0IChleGNsdWRpbmcgdGhlIHZhbHVlIGl0c2VsZikKLQkgKiBAcGFyYW0gdG8KLQkgKiAgICAgICAgICAgIHJhbmdlIGVuZCAoZXhjbHVkaW5nIHRoZSB2YWx1ZSBpdHNlbGYpCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIHByaW1hcnkgY29sb3JzIGluIHRoZQotCSAqICAgICAgICAgc291cmNlIFJHQiBhcmUgd2l0aGluIHRoZSBwcm92aWRlZCByYW5nZSwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0QW55UHJpbWFyeUNvbG9yKFJHQiByZ2IsIGludCBmcm9tLCBpbnQgdG8pIHsKLQkJaWYgKHRlc3RQcmltYXJ5Q29sb3IocmdiLnJlZCwgZnJvbSwgdG8pKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0ZXN0UHJpbWFyeUNvbG9yKHJnYi5ncmVlbiwgZnJvbSwgdG8pKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0ZXN0UHJpbWFyeUNvbG9yKHJnYi5ibHVlLCBmcm9tLCB0bykpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoZSBzb3VyY2UgUkdCIGZvciByYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmdiCi0JICogICAgICAgICAgICB0aGUgdGVzdGVkIFJHQgotCSAqIEBwYXJhbSBmcm9tCi0JICogICAgICAgICAgICByYW5nZSBzdGFydCAoZXhjbHVkaW5nIHRoZSB2YWx1ZSBpdHNlbGYpCi0JICogQHBhcmFtIHRvCi0JICogICAgICAgICAgICB0YW5nZSBlbmQgKGV4Y2x1ZGluZyB0aGUgdmFsdWUgaXRzZWxmKQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3QgdHdvIG9mIHRoZSBwcmltYXJ5IGNvbG9ycyBpbiB0aGUKLQkgKiAgICAgICAgIHNvdXJjZSBSR0IgYXJlIHdpdGhpbiB0aGUgcHJvdmlkZWQgcmFuZ2UsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdFR3b1ByaW1hcnlDb2xvcnMoUkdCIHJnYiwgaW50IGZyb20sIGludCB0bykgewotCQlpbnQgdG90YWwgPSAwOwotCQlpZiAodGVzdFByaW1hcnlDb2xvcihyZ2IucmVkLCBmcm9tLCB0bykpCi0JCQl0b3RhbCsrOwotCQlpZiAodGVzdFByaW1hcnlDb2xvcihyZ2IuZ3JlZW4sIGZyb20sIHRvKSkKLQkJCXRvdGFsKys7Ci0JCWlmICh0ZXN0UHJpbWFyeUNvbG9yKHJnYi5ibHVlLCBmcm9tLCB0bykpCi0JCQl0b3RhbCsrOwotCQlyZXR1cm4gdG90YWwgPj0gMjsKLQl9Ci0KLQkvKioKLQkgKiBCbGVuZHMgdHdvIHByaW1hcnkgY29sb3IgY29tcG9uZW50cyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcmF0aW8uCi0JICogCi0JICogQHBhcmFtIHYxCi0JICogICAgICAgICAgICBmaXJzdCBjb21wb25lbnQKLQkgKiBAcGFyYW0gdjIKLQkgKiAgICAgICAgICAgIHNlY29uZCBjb21wb25lbnQKLQkgKiBAcGFyYW0gcmF0aW8KLQkgKiAgICAgICAgICAgIHBlcmNlbnRhZ2Ugb2YgdGhlIGZpcnN0IGNvbXBvbmVudCBpbiB0aGUgYmxlbmQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGJsZW5kKGludCB2MSwgaW50IHYyLCBpbnQgcmF0aW8pIHsKLQkJaW50IGIgPSAocmF0aW8gKiB2MSArICgxMDAgLSByYXRpbykgKiB2MikgLyAxMDA7Ci0JCXJldHVybiBNYXRoLm1pbigyNTUsIGIpOwotCX0KLQotCXByaXZhdGUgQ29sb3IgZ2V0SW1wbGllZEJhY2tncm91bmQoKSB7Ci0JCWlmIChnZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRCYWNrZ3JvdW5kKCk7Ci0JCXJldHVybiBnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHRlc3RQcmltYXJ5Q29sb3IoaW50IHZhbHVlLCBpbnQgZnJvbSwgaW50IHRvKSB7Ci0JCXJldHVybiB2YWx1ZSA+IGZyb20gJiYgdmFsdWUgPCB0bzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGl0bGVDb2xvcigpIHsKLQkJUkdCIHJnYiA9IGdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTik7Ci0JCS8vIHRlc3QgdG9vIGxpZ2h0Ci0JCWlmICh0ZXN0VHdvUHJpbWFyeUNvbG9ycyhyZ2IsIDEyMCwgMTUxKSkKLQkJCXJnYiA9IGJsZW5kKHJnYiwgQkxBQ0ssIDgwKTsKLQkJZWxzZSBpZiAodGVzdFR3b1ByaW1hcnlDb2xvcnMocmdiLCAxNTAsIDI1NikpCi0JCQlyZ2IgPSBibGVuZChyZ2IsIEJMQUNLLCA1MCk7Ci0JCWNyZWF0ZUNvbG9yKFRJVExFLCByZ2IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUd2lzdGllQ29sb3JzKCkgewotCQlSR0IgcmdiID0gZ2V0Q29sb3IoVElUTEUpLmdldFJHQigpOwotCQljcmVhdGVDb2xvcihUQl9UT0dHTEUsIHJnYik7Ci0KLQkJLy8gaG92ZXIgdHdpc3RpZQotCQlyZ2IgPSBibGVuZChyZ2IsIFdISVRFLCA3MCk7Ci0JCS8vIGJvdW5kcwotCQlpZiAodGVzdFR3b1ByaW1hcnlDb2xvcnMocmdiLCAyMTUsIDIyNikpCi0JCQlyZ2IgPSBibGVuZChyZ2IsIEJMQUNLLCA5MCk7Ci0JCWVsc2UgaWYgKHRlc3RUd29QcmltYXJ5Q29sb3JzKHJnYiwgMjI1LCAyNTYpKQotCQkJcmdiID0gYmxlbmQocmdiLCBCTEFDSywgOTUpOwotCQljcmVhdGVDb2xvcihUQl9UT0dHTEVfSE9WRVIsIHJnYik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRpdGxlQmFyR3JhZGllbnRDb2xvcnMoKSB7Ci0JCVJHQiB0YkJnID0gZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1RJVExFX0JBQ0tHUk9VTkRfR1JBRElFTlQpOwotCQlDb2xvciBiZyA9IGdldEltcGxpZWRCYWNrZ3JvdW5kKCk7Ci0JCVJHQiBmb3JtQmFja2dyb3VuZCA9IGJnLmdldFJHQigpOwotCi0JCS8vIGJsZW5kIDc3JSB3aGl0ZSB3aXRoIHRoZSB0aXRsZSBiYWNrZ3JvdW5kIGdyYWRpZW50Ci0JCXRiQmcgPSBibGVuZChmb3JtQmFja2dyb3VuZCwgdGJCZywgNzcpOwotCi0JCWlmIChpc1doaXRlQmFja2dyb3VuZCgpKSB7Ci0JCQkvLyBjb3JyZWN0aW9ucwotCQkJaWYgKHRlc3RUd29QcmltYXJ5Q29sb3JzKHRiQmcsIDI0MSwgMjU2KSkgewotCQkJCS8vIHRvbyBsaWdodAotCQkJCXRiQmcgPSBibGVuZCh0YkJnLCBCTEFDSywgOTApOwotCQkJfSBlbHNlIGlmICh0ZXN0VHdvUHJpbWFyeUNvbG9ycyh0YkJnLCAwLCAyMzEpKSB7Ci0JCQkJLy8gdG9vIGRhcmsKLQkJCQlpZiAodGVzdEFueVByaW1hcnlDb2xvcih0YkJnLCAyMTQsIDIzMSkpCi0JCQkJCXRiQmcgPSBibGVuZCh0YkJnLCBXSElURSwgOTUpOwotCQkJCWVsc2UgaWYgKHRlc3RBbnlQcmltYXJ5Q29sb3IodGJCZywgMTk5LCAyMTUpKQotCQkJCQl0YkJnID0gYmxlbmQodGJCZywgV0hJVEUsIDkwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0ZXN0VHdvUHJpbWFyeUNvbG9ycyh0YkJnLCAyMDksIDI1NikpIHsKLQkJCQkvLyB0b28gbGlnaHQKLQkJCQlpZiAodGVzdEFueVByaW1hcnlDb2xvcih0YkJnLCAyMTAsIDIzNikpCi0JCQkJCXRiQmcgPSBibGVuZCh0YkJnLCBCTEFDSywgNjApOwotCQkJCWVsc2UgaWYgKHRlc3RBbnlQcmltYXJ5Q29sb3IodGJCZywgMjM1LCAyNTYpKQotCQkJCQl0YkJnID0gYmxlbmQodGJCZywgQkxBQ0ssIDIwKTsKLQkJCX0KLQkJfQotCQljcmVhdGVDb2xvcihGb3JtQ29sb3JzLlRCX0JHLCB0YkJnKTsKLQotCQkvLyBibGVuZCA1MCAlIHdoaXRlIHdpdGggdGhlIHByZXZpb3VzIGJsZW5kIGZvciBoYWxmLXdheQotCQlSR0IgdGJHYmcgPSBibGVuZChmb3JtQmFja2dyb3VuZCwgdGJCZywgNTApOwotCQljcmVhdGVDb2xvcihGb3JtQ29sb3JzLlRCX0dCRywgdGJHYmcpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUaXRsZUJhck91dGxpbmVDb2xvcnMoKSB7Ci0JCS8vIHRpdGxlIGJhciBvdXRsaW5lIC0gYm9yZGVyIGNvbG9yCi0JCVJHQiB0YkJvcmRlciA9IGdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9CQUNLR1JPVU5EX0dSQURJRU5UKTsKLQkJLy8gUGVyZm9ybSBhZGp1c3RtZW50cyBmb3IgdG9vIGJyaWdodAotCQlpZiAoaXNXaGl0ZUJhY2tncm91bmQoKSkgewotCQkJaWYgKHRlc3RUd29QcmltYXJ5Q29sb3JzKHRiQm9yZGVyLCAyMTUsIDI1NikpIHsKLQkJCQkvLyB0b28gYnJpZ2h0Ci0JCQkJaWYgKHRlc3RBbnlQcmltYXJ5Q29sb3IodGJCb3JkZXIsIDIxNSwgMjI2KSkKLQkJCQkJLy8gZGVjcmVhc2Ugd2hpdGUgYnkgMTAlCi0JCQkJCXRiQm9yZGVyID0gYmxlbmQodGJCb3JkZXIsIEJMQUNLLCA5MCk7Ci0JCQkJZWxzZSBpZiAodGVzdEFueVByaW1hcnlDb2xvcih0YkJvcmRlciwgMjI1LCAyNTYpKQotCQkJCQkvLyBkZWNyZWFzZSB3aGl0ZSBieSAyMCUKLQkJCQkJdGJCb3JkZXIgPSBibGVuZCh0YkJvcmRlciwgQkxBQ0ssIDcwKTsKLQkJCX0gZWxzZSBpZiAodGVzdFR3b1ByaW1hcnlDb2xvcnModGJCb3JkZXIsIDAsIDE4NikpIHsKLQkJCQkvLyB0b28gZGFyawotCQkJCWlmICh0ZXN0QW55UHJpbWFyeUNvbG9yKHRiQm9yZGVyLCAxNzUsIDE4NikpCi0JCQkJCS8vIGFkZCA1JSB3aGl0ZQotCQkJCQl0YkJvcmRlciA9IGJsZW5kKHRiQm9yZGVyLCBXSElURSwgOTUpOwotCQkJCWVsc2UgaWYgKHRlc3RUd29QcmltYXJ5Q29sb3JzKHRiQm9yZGVyLCAxNTQsIDE3NikpCi0JCQkJCS8vIGFkZCAxMCUgd2hpdGUKLQkJCQkJdGJCb3JkZXIgPSBibGVuZCh0YkJvcmRlciwgV0hJVEUsIDkwKTsKLQkJCQllbHNlIGlmICh0ZXN0VHdvUHJpbWFyeUNvbG9ycyh0YkJvcmRlciwgMTI0LCAxNTUpKQotCQkJCQkvLyBhZGQgMjAlIHdoaXRlCi0JCQkJCXRiQm9yZGVyID0gYmxlbmQodGJCb3JkZXIsIFdISVRFLCA4MCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGVzdFR3b1ByaW1hcnlDb2xvcnModGJCb3JkZXIsIDIwMCwgMjU2KSkKLQkJCQkvLyB0b28gYnJpZ2h0IC0gZGVjcmVhc2Ugd2hpdGUgYnkgNTAlCi0JCQkJdGJCb3JkZXIgPSBibGVuZCh0YkJvcmRlciwgQkxBQ0ssIDUwKTsKLQkJfQotCQljcmVhdGVDb2xvcihGb3JtQ29sb3JzLlRCX0JPUkRFUiwgdGJCb3JkZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9IeXBlcmxpbmtHcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvSHlwZXJsaW5rR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkNzZmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9IeXBlcmxpbmtHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotCi0vKioKLSAqIE1hbmFnZXMgYSBncm91cCBvZiBoeXBlcmxpbmtzLiBJdCB0cmFja3MgYWN0aXZhdGlvbiwgdXBkYXRlcyBub3JtYWwgYW5kCi0gKiBhY3RpdmUgY29sb3JzIGFuZCB1cGRhdGVzIHVuZGVybGluZSBzdGF0ZSBkZXBlbmRpbmcgb24gdGhlIHVuZGVybGluZQotICogcHJlZmVyZW5jZS4gSHlwZXJsaW5rIGxhYmVscyBhcmUgYWRkZWQgdG8gdGhlIGdyb3VwIGFmdGVyIGNyZWF0aW9uIGFuZCBhcmUKLSAqIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSBncm91cCB3aGVuIHRoZXkgYXJlIGRpc3Bvc2VkLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEh5cGVybGlua0dyb3VwIGV4dGVuZHMgSHlwZXJsaW5rU2V0dGluZ3MgewotCXByaXZhdGUgQXJyYXlMaXN0IGxpbmtzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgSHlwZXJsaW5rIGxhc3RBY3RpdmF0ZWQ7Ci0JcHJpdmF0ZSBIeXBlcmxpbmsgbGFzdEVudGVyZWQ7Ci0JcHJpdmF0ZSBHcm91cExpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHJpdmF0ZSBjbGFzcyBHcm91cExpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIsIElIeXBlcmxpbmtMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCXN3aXRjaCAoZS50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VFbnRlciA6Ci0JCQkJCW9uTW91c2VFbnRlcihlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VFeGl0IDoKLQkJCQkJb25Nb3VzZUV4aXQoZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlRG93biA6Ci0JCQkJCW9uTW91c2VEb3duKGUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5EaXNwb3NlIDoKLQkJCQkJdW5ob29rKChIeXBlcmxpbmspIGUud2lkZ2V0KTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIG9uTW91c2VFbnRlcihFdmVudCBlKSB7Ci0JCQlIeXBlcmxpbmsgbGluayA9IChIeXBlcmxpbmspIGUud2lkZ2V0OwotCQkJaWYgKGdldEFjdGl2ZUJhY2tncm91bmQoKSAhPSBudWxsKQotCQkJCWxpbmsuc2V0QmFja2dyb3VuZChnZXRBY3RpdmVCYWNrZ3JvdW5kKCkpOwotCQkJaWYgKGdldEFjdGl2ZUZvcmVncm91bmQoKSAhPSBudWxsKQotCQkJCWxpbmsuc2V0Rm9yZWdyb3VuZChnZXRBY3RpdmVGb3JlZ3JvdW5kKCkpOwotCQkJaWYgKGdldEh5cGVybGlua1VuZGVybGluZU1vZGUoKSA9PSBVTkRFUkxJTkVfSE9WRVIpCi0JCQkJbGluay5zZXRVbmRlcmxpbmVkKHRydWUpOwotCQkJbGluay5zZXRDdXJzb3IoZ2V0SHlwZXJsaW5rQ3Vyc29yKCkpOwkJCQotCQl9Ci0JCXByaXZhdGUgdm9pZCBvbk1vdXNlRXhpdChFdmVudCBlKSB7Ci0JCQlIeXBlcmxpbmsgbGluayA9IChIeXBlcmxpbmspIGUud2lkZ2V0OwotCQkJaWYgKGdldEJhY2tncm91bmQoKSAhPSBudWxsKQotCQkJCWxpbmsuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotCQkJaWYgKGdldEZvcmVncm91bmQoKSAhPSBudWxsKQotCQkJCWxpbmsuc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOwotCQkJaWYgKGdldEh5cGVybGlua1VuZGVybGluZU1vZGUoKSA9PSBVTkRFUkxJTkVfSE9WRVIpCi0JCQkJbGluay5zZXRVbmRlcmxpbmVkKGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCUh5cGVybGluayBsaW5rID0gKEh5cGVybGluaykgZS53aWRnZXQ7Ci0JCQlpZiAobGFzdEVudGVyZWQgIT0gbnVsbCkgewotCQkJCWxpbmtFeGl0ZWQobGFzdEVudGVyZWQpOwotCQkJfQotCQkJbGFzdEVudGVyZWQgPSBsaW5rOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlua0V4aXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQlsaW5rRXhpdGVkKChIeXBlcmxpbmspIGUud2lkZ2V0KTsKLQkJfQotCQlwcml2YXRlIHZvaWQgbGlua0V4aXRlZChIeXBlcmxpbmsgbGluaykgewotCQkJbGluay5zZXRDdXJzb3IobnVsbCk7Ci0JCQlpZiAobGFzdEVudGVyZWQgPT0gbGluaykKLQkJCQlsYXN0RW50ZXJlZCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgaHlwZXJsaW5rIGdyb3VwLgotCSAqLwotCi0JcHVibGljIEh5cGVybGlua0dyb3VwKERpc3BsYXkgZGlzcGxheSkgewotCQlzdXBlcihkaXNwbGF5KTsKLQkJbGlzdGVuZXIgPSBuZXcgR3JvdXBMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpbmsgdGhhdCBoYXMgYmVlbiBhY3RpdmUgdGhlIGxhc3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm8gbGluayBoYXMgYmVlbiBhY3RpdmUgeWV0IG9yIHRoZSBsYXN0IGFjdGl2ZSBsaW5rIGhhcyBiZWVuCi0JICogZGlzcG9zZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgbGFzdCBhY3RpdmUgbGluayBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBIeXBlcmxpbmsgZ2V0TGFzdEFjdGl2YXRlZCgpIHsKLQkJcmV0dXJuIGxhc3RBY3RpdmF0ZWQ7Ci0JfQotCS8qKgotCSAqIEFkZHMgYSBoeXBlcmxpbmsgdG8gdGhlIGdyb3VwIHRvIGJlIGpvaW50bHkgbWFuYWdlZC4gSHlwZXJsaW5rIHdpbGwgYmUKLQkgKiBtYW5hZ2VkIHVudGlsIGl0IGlzIGRpc3Bvc2VkLiBTZXR0aW5ncyBsaWtlIGNvbG9ycywgY3Vyc29ycyBhbmQgbW9kZXMKLQkgKiB3aWxsIGFmZmVjdCBhbGwgbWFuYWdlZCBoeXBlcmxpbmtzLgotCSAqIAotCSAqIEBwYXJhbSBsaW5rCi0JICovCi0KLQlwdWJsaWMgdm9pZCBhZGQoSHlwZXJsaW5rIGxpbmspIHsKLQkJaWYgKGdldEJhY2tncm91bmQoKSAhPSBudWxsKQotCQkJbGluay5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0JCWlmIChnZXRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkKLQkJCWxpbmsuc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOwotCQlpZiAoZ2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSgpID09IFVOREVSTElORV9BTFdBWVMpCi0JCQlsaW5rLnNldFVuZGVybGluZWQodHJ1ZSk7Ci0JCWhvb2sobGluayk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGdyb3VwIGJhY2tncm91bmQgYW5kIGFsc28gc2V0cyB0aGUgYmFja2dyb3VuZCBvZiBhbGwgdGhlCi0JICogY3VycmVudGx5IG1hbmFnZWQgbGlua3MuCi0JICogCi0JICogQHBhcmFtIGJnCi0JICogICAgICAgICAgICB0aGUgbmV3IGJhY2tncm91bmQKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoQ29sb3IgYmcpIHsKLQkJc3VwZXIuc2V0QmFja2dyb3VuZChiZyk7Ci0JCWlmIChsaW5rcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSHlwZXJsaW5rIGxhYmVsID0gKEh5cGVybGluaykgbGlua3MuZ2V0KGkpOwotCQkJCWxhYmVsLnNldEJhY2tncm91bmQoYmcpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGdyb3VwIGZvcmVncm91bmQgYW5kIGFsc28gc2V0cyB0aGUgYmFja2dyb3VuZCBvZiBhbGwgdGhlCi0JICogY3VycmVudGx5IG1hbmFnZWQgbGlua3MuCi0JICogCi0JICogQHBhcmFtIGZnCi0JICogICAgICAgICAgICB0aGUgbmV3IGZvcmVncm91bmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIGZnKSB7Ci0JCXN1cGVyLnNldEZvcmVncm91bmQoZmcpOwotCQlpZiAobGlua3MgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5zaXplKCk7IGkrKykgewotCQkJCUh5cGVybGluayBsYWJlbCA9IChIeXBlcmxpbmspIGxpbmtzLmdldChpKTsKLQkJCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKGZnKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBoeXBlcmxpbmsgdW5kZXJsaW5lIG1vZGUuCi0JICogCi0JICogQHBhcmFtIG1vZGUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgaHlwZXJsaW5rIHVuZGVybGluZSBtb2RlCi0JICogQHNlZSBIeXBlcmxpbmtTZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1VuZGVybGluZU1vZGUoaW50IG1vZGUpIHsKLQkJc3VwZXIuc2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZShtb2RlKTsKLQkJaWYgKGxpbmtzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlua3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlIeXBlcmxpbmsgbGFiZWwgPSAoSHlwZXJsaW5rKSBsaW5rcy5nZXQoaSk7Ci0JCQkJbGFiZWwuc2V0VW5kZXJsaW5lZChtb2RlID09IFVOREVSTElORV9BTFdBWVMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhvb2soSHlwZXJsaW5rIGxpbmspIHsKLQkJbGluay5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0JCWxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobGlzdGVuZXIpOwotCQlsaW5rLmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0JCWxpbmsuYWRkTGlzdGVuZXIoU1dULk1vdXNlRW50ZXIsIGxpc3RlbmVyKTsKLQkJbGluay5hZGRMaXN0ZW5lcihTV1QuTW91c2VFeGl0LCBsaXN0ZW5lcik7Ci0JCWxpbmtzLmFkZChsaW5rKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5ob29rKEh5cGVybGluayBsaW5rKSB7Ci0JCWxpbmsucmVtb3ZlTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCQlsaW5rLnJlbW92ZUh5cGVybGlua0xpc3RlbmVyKGxpc3RlbmVyKTsKLQkJbGluay5yZW1vdmVMaXN0ZW5lcihTV1QuTW91c2VFbnRlciwgbGlzdGVuZXIpOwotCQlsaW5rLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb3VzZUV4aXQsIGxpc3RlbmVyKTsKLQkJaWYgKGxhc3RBY3RpdmF0ZWQgPT0gbGluaykKLQkJCWxhc3RBY3RpdmF0ZWQgPSBudWxsOwotCQlpZiAobGFzdEVudGVyZWQgPT0gbGluaykKLQkJCWxhc3RFbnRlcmVkID0gbnVsbDsKLQkJbGlua3MucmVtb3ZlKGxpbmspOwotCX0KLQotCXByaXZhdGUgdm9pZCBvbk1vdXNlRG93bihFdmVudCBlKSB7Ci0JCWlmIChlLmJ1dHRvbiA9PSAxKQotCQkJcmV0dXJuOwotCQlsYXN0QWN0aXZhdGVkID0gKEh5cGVybGluaykgZS53aWRnZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvSHlwZXJsaW5rU2V0dGluZ3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL0h5cGVybGlua1NldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZTQzZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvSHlwZXJsaW5rU2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VDb2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuKjsKLS8qKgotICogTWFuYWdlcyBjb2xvciBhbmQgdW5kZXJsaW5lIG1vZGUgc2V0dGluZ3MgZm9yIGEgZ3JvdXAgb2YgaHlwZXJsaW5rcy4gVGhlCi0gKiBjbGFzcyBpcyBleHRlbmRlZCBieSBIeXBlcmxpbmtHcm91cCBidXQgaXMgb3R3ZXJ3aXNlIG5vdCBpbnRlbmRlZCB0byBiZQotICogc3ViY2xhc3NlZC4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgSHlwZXJsaW5rU2V0dGluZ3MgewotCS8qKgotCSAqIFVuZGVybGluZSBtb2RlIHRvIGJlIHVzZWQgd2hlbiBoeXBlcmxpbmtzIHNob3VsZCBub3QgYmUgdW5kZXJsaW5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFUkxJTkVfTkVWRVIgPSAxOwotCS8qKgotCSAqIFVuZGVybGluZSBtb2RlIHRvIGJlIHVzZWQgd2hlbiBoeXBlcmxpbmtzIHNob3VsZCBvbmx5IGJlIHVuZGVybGluZWQgb24KLQkgKiBtb3VzZSBob3Zlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFUkxJTkVfSE9WRVIgPSAyOwotCS8qKgotCSAqIFVuZGVybGluZSBtb2RlIHRvIGJlIHVzZWQgd2hlbiBoeXBlcmxpbmtzIHNob3VsZCBhbHdheXMgYmUgdW5kZXJsaW5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFUkxJTkVfQUxXQVlTID0gMzsKLQlwcml2YXRlIGludCBoeXBlcmxpbmtVbmRlcmxpbmVNb2RlID0gVU5ERVJMSU5FX0FMV0FZUzsKLQlwcml2YXRlIENvbG9yIGJhY2tncm91bmQ7Ci0JcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kOwotCXByaXZhdGUgQ29sb3IgYWN0aXZlQmFja2dyb3VuZDsKLQlwcml2YXRlIENvbG9yIGFjdGl2ZUZvcmVncm91bmQ7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5Ci0JICogICAgICAgICAgICB0aGUgZGlzcGxheSB0byB1c2Ugd2hlbiBjcmVhdGluZyBjb2xvcnMuCi0JICovCi0JcHVibGljIEh5cGVybGlua1NldHRpbmdzKERpc3BsYXkgZGlzcGxheSkgewotCQlpbml0aWFsaXplRGVmYXVsdEZvcmVncm91bmRzKGRpc3BsYXkpOwotCX0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgaHlwZXJsaW5rIGZvcmVncm91bmRzIGZyb20gdGhlIEpGYWNlIGRlZmF1bHRzIHNldCBmb3IgdGhlCi0JICogZW50aXJlIHdvcmtiZW5jaC4KLQkgKiAKLQkgKiBAc2VlIEpGYWNlQ29sb3JzCi0JICogQHBhcmFtIGRpc3BsYXkKLQkgKiAgICAgICAgICAgIHRoZSBkaXNwbGF5IHRvIHVzZSB3aGVuIGNyZWF0aW5nIGNvbG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0Rm9yZWdyb3VuZHMoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCUNvbG9yIGZnID0gSkZhY2VDb2xvcnMuZ2V0SHlwZXJsaW5rVGV4dChkaXNwbGF5KTsKLQkJQ29sb3IgYWZnID0gSkZhY2VDb2xvcnMuZ2V0QWN0aXZlSHlwZXJsaW5rVGV4dChkaXNwbGF5KTsKLQkJaWYgKGZnPT1udWxsKQotCQkJZmcgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQkJc2V0Rm9yZWdyb3VuZChmZyk7Ci0JCXNldEFjdGl2ZUZvcmVncm91bmQoYWZnKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFja2dyb3VuZCB0byB1c2UgZm9yIHRoZSBhY3RpdmUgaHlwZXJsaW5rLgotCSAqIAotCSAqIEByZXR1cm4gYWN0aXZlIGh5cGVybGluayBiYWNrZ3JvdW5kCi0JICovCi0JcHVibGljIENvbG9yIGdldEFjdGl2ZUJhY2tncm91bmQoKSB7Ci0JCXJldHVybiBhY3RpdmVCYWNrZ3JvdW5kOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmb3JlZ3JvdW5kIHRvIHVzZSBmb3IgdGhlIGFjdGl2ZSBoeXBlcmxpbmsuCi0JICogCi0JICogQHJldHVybiBhY3RpdmUgaHlwZXJsaW5rIGZvcmVncm91bmQKLQkgKi8KLQlwdWJsaWMgQ29sb3IgZ2V0QWN0aXZlRm9yZWdyb3VuZCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUZvcmVncm91bmQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhY2tncm91bmQgdG8gdXNlIGZvciB0aGUgbm9ybWFsIGh5cGVybGluay4KLQkgKiAKLQkgKiBAcmV0dXJuIG5vcm1hbCBoeXBlcmxpbmsgYmFja2dyb3VuZAotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gYmFja2dyb3VuZDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY3Vyc29yIHRvIHVzZSB3aGVuIHRoZSBoeXBlcmxpbmsgaXMgYWN0aXZlLiBUaGlzIGN1cnNvciB3aWxsCi0JICogYmUgc2hvd24gYmVmb3JlIGh5cGVybGluayBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkIG9mIGh5cGVybGluawotCSAqIGFjdGl2YXRpb24gYW5kIGhpZGRlbiB3aGVuIHRoZSBub3RpZmljYXRpb24gbWV0aG9kIHJldHVybnMuCi0JICogCi0JICogQHJldHVybiB0aGUgYnVzeSBjdXJzb3IKLQkgKi8KLQlwdWJsaWMgQ3Vyc29yIGdldEJ1c3lDdXJzb3IoKSB7Ci0JCXJldHVybiBGb3Jtc1Jlc291cmNlcy5nZXRCdXN5Q3Vyc29yKCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnNvciB0byB1c2Ugd2hlbiBvdmVyIHRleHQuCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBjdXJzb3IKLQkgKi8KLQlwdWJsaWMgQ3Vyc29yIGdldFRleHRDdXJzb3IoKSB7Ci0JCXJldHVybiBGb3Jtc1Jlc291cmNlcy5nZXRUZXh0Q3Vyc29yKCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZvcmVncm91bmQgdG8gdXNlIGZvciB0aGUgbm9ybWFsIGh5cGVybGluay4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBub3JtYWwgaHlwZXJsaW5rIGZvcmVncm91bmQKLQkgKi8KLQlwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZCgpIHsKLQkJcmV0dXJuIGZvcmVncm91bmQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnNvciB0byB1c2Ugd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBoeXBlcmxpbmsuCi0JICogCi0JICogQHJldHVybiB0aGUgaHlwZXJsaW5rIGN1cnNvcgotCSAqLwotCXB1YmxpYyBDdXJzb3IgZ2V0SHlwZXJsaW5rQ3Vyc29yKCkgewotCQlyZXR1cm4gRm9ybXNSZXNvdXJjZXMuZ2V0SGFuZEN1cnNvcigpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1bmRlcmxpbmUgbW9kZSB0byBiZSB1c2VkIGZvciBhbGwgdGhlIGh5cGVybGlua3MgaW4gdGhpcwotCSAqIGdyb3VwLgotCSAqIAotCSAqIEByZXR1cm4gb25lIG9mIFVOREVSTElORV9ORVZFUiwgVU5ERVJMSU5FX0FMV0FZUywgVU5ERVJMSU5FX0hPVkVSCi0JICovCi0JcHVibGljIGludCBnZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rVW5kZXJsaW5lTW9kZTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgbmV3IGFjdGl2ZSBoeXBlcmxpbmsgYmFja2dyb3VuZCBmb3IgYWxsIHRoZSBsaW5rcy4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3QWN0aXZlQmFja2dyb3VuZAotCSAqICAgICAgICAgICAgdGhlIG5ldyBhY3RpdmUgYmFja2dyb3VuZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUJhY2tncm91bmQoQ29sb3IgbmV3QWN0aXZlQmFja2dyb3VuZCkgewotCQlhY3RpdmVCYWNrZ3JvdW5kID0gbmV3QWN0aXZlQmFja2dyb3VuZDsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgbmV3IGFjdGl2ZSBoeXBlcmxpbmsgZm9yZWdyb3VuZCBmb3IgYWxsIHRoZSBsaW5rcy4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3QWN0aXZlRm9yZWdyb3VuZAotCSAqICAgICAgICAgICAgdGhlIG5ldyBhY3RpdmUgZm9yZWdyb3VuZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUZvcmVncm91bmQoQ29sb3IgbmV3QWN0aXZlRm9yZWdyb3VuZCkgewotCQlhY3RpdmVGb3JlZ3JvdW5kID0gbmV3QWN0aXZlRm9yZWdyb3VuZDsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgbmV3IGh5cGVybGluayBiYWNrZ3JvdW5kIGZvciBhbGwgdGhlIGxpbmtzLgotCSAqIAotCSAqIEBwYXJhbSBuZXdCYWNrZ3JvdW5kCi0JICogICAgICAgICAgICB0aGUgbmV3IGh5cGVybGluayBiYWNrZ3JvdW5kCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBuZXdCYWNrZ3JvdW5kKSB7Ci0JCWJhY2tncm91bmQgPSBuZXdCYWNrZ3JvdW5kOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBuZXcgaHlwZXJsaW5rIGZvcmVncm91bmQgZm9yIGFsbCB0aGUgbGlua3MuCi0JICogCi0JICogQHBhcmFtIG5ld0ZvcmVncm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgaHlwZXJsaW5rIGZvcmVncm91bmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIG5ld0ZvcmVncm91bmQpIHsKLQkJZm9yZWdyb3VuZCA9IG5ld0ZvcmVncm91bmQ7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIG5ldyBoeXBlcmxpbmsgdW5kZXJsaW5lIG1vZGUgZm9yIGFsbCB0aGUgbGlua3MgaW4gdGhpcyBncm91cC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZQotCSAqICAgICAgICAgICAgb25lIG9mIDxjb2RlPlVOREVSTElORV9ORVZFUjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5VTkRFUkxJTkVfSE9WRVI8L2NvZGU+IGFuZAotCSAqICAgICAgICAgICAgPGNvZGU+VU5ERVJMSU5FX0FMV0FZUzwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZShpbnQgbW9kZSkgewotCQloeXBlcmxpbmtVbmRlcmxpbmVNb2RlID0gbW9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9JRGV0YWlsc1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL0lEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDNmYmI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL0lEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzIHByb3ZpZGluZwotICogcGFnZXMgdG8gaGFuZGxlIG9iamVjdCB0eXBlcyBpbiBEZXRhaWxzUGFydC4gTW9zdCBvZiB0aGUKLSAqIGxpZmUgY3ljbGUgaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBJRm9ybVBhcnQuIFRoZSBwYWdlIGlzCi0gKiBhIHBhcnQgc2VsZWN0aW9uIGxpc3RlbmVyIHNpbmNlIHNlbGVjdGlvbnMgaW4gdGhlIG1hc3RlcgotICogcGFydCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY3VycmVudGx5IHZpc2libGUgcGFnZS4KLSAqIAotICogQHNlZSBEZXRhaWxzUGFydAotICogQHNlZSBNYXN0ZXJEZXRhaWxzQmxvY2sKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGV0YWlsc1BhZ2UgZXh0ZW5kcyBJRm9ybVBhcnQsIElQYXJ0U2VsZWN0aW9uTGlzdGVuZXIgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWdlIGluIHRoZSBwcm92aWRlZCBwYXJlbnQuCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IHRvIGNyZWF0ZSB0aGUgcGFnZSBpbgotCSAqLwotCXZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9JRGV0YWlsc1BhZ2VQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvSURldGFpbHNQYWdlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyZmUwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9JRGV0YWlsc1BhZ2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zOwotCi0vKioKLSAqIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgZm9yIGR5bmFtaWMKLSAqIGNvbXB1dGF0aW9uIG9mIHBhZ2Uga2V5IGFuZCB0aGUgcGFnZSBpdHNlbGYgYmFzZWQgb24gdGhlCi0gKiBpbnB1dCBvYmplY3QuIEl0IHNob3VsZCBiZSB1c2VkIGluIHNpdHVhdGlvbnMgd2hlcmUKLSAqIHVzaW5nIHRoZSBvYmplY3QgY2xhc3MgYXMgYSBzdGF0aWMga2V5IGlzIG5vdCBlbm91Z2gKLSAqIGkuZS4gZGlmZmVyZW50IHBhZ2VzIG1heSBuZWVkIHRvIGJlIGxvYWRlZCBmb3Igb2JqZWN0cwotICogb2YgdGhlIHNhbWUgdHlwZSBkZXBlbmRpbmcgb24gdGhlaXIgc3RhdGUuCi0gKiAKLSAqIEBzZWUgRGV0YWlsc1BhcnQKLSAqIEBzZWUgTWFzdGVyRGV0YWlsc0Jsb2NrCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURldGFpbHNQYWdlUHJvdmlkZXIgewotLyoqCi0gKiBSZXR1cm5zIHRoZSBwYWdlIGtleSBmb3IgdGhlIHByb3ZpZGVkIG9iamVjdC4gVGhlIGFzc3VtcHRpb24gaXMKLSAqIHRoYXQgdGhlIHByb3ZpZGVyIGtub3dzIGFib3V0IHZhcmlvdXMgb2JqZWN0IHR5cGVzIGFuZAotICogaXMgaW4gcG9zaXRpb24gdG8gY2FzdCB0aGUgb2JqZWN0IGludG8gYSB0eXBlIGFuZCBjYWxsIG1ldGhvZHMKLSAqIG9uIGl0IHRvIGRldGVybWluZSB0aGUgbWF0Y2hpbmcgcGFnZSBrZXkuCi0gKiBAcGFyYW0gb2JqZWN0IHRoZSBpbnB1dCBvYmplY3QKLSAqIEByZXR1cm4gdGhlIHBhZ2Uga2V5IGZvciB0aGUgcHJvdmlkZWQgb2JqZWN0Ci0gKi8KLQlPYmplY3QgZ2V0UGFnZUtleShPYmplY3Qgb2JqZWN0KTsKLS8qKgotICogUmV0dXJucyB0aGUgcGFnZSBmb3IgdGhlIHByb3ZpZGVkIGtleS4gVGhpcyBtZXRob2QgaXMgdGhlIGR5bmFtaWMKLSAqIGFsdGVybmF0aXZlIHRvIHJlZ2lzdGVyaW5nIHBhZ2VzIHdpdGggdGhlIGRldGFpbHMgcGFydCBkaXJlY3RseS4KLSAqIEBwYXJhbSBrZXkgdGhlIHBhZ2Uga2V5Ci0gKiBAcmV0dXJuIHRoZSBtYXRjaGluZyBwYWdlIGZvciB0aGUgcHJvdmlkZWQga2V5Ci0gKi8KLQlJRGV0YWlsc1BhZ2UgZ2V0UGFnZShPYmplY3Qga2V5KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL0lGb3JtUGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvSUZvcm1QYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOGU1MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvSUZvcm1QYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zOwotCi0vKioKLSAqIENsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIGFkZGVkIHRvIHRoZSBtYW5hZ2VkCi0gKiBmb3JtIGFuZCB0YWtlIHBhcnQgaW4gdGhlIGZvcm0gbGlmZSBjeWNsZS4gVGhlIHBhcnQgaXMgaW5pdGlhbGl6ZQotICogd2l0aCB0aGUgZm9ybSBhbmQgYmUgYXNrZWQgdG8gYWNjZXB0IGZvY3VzLiBUaGUgcGFydCBjYW4gcmVjZWl2ZQotICogZm9ybSBpbnB1dCBhbmQgY2FuIGVsZWN0IHRvIGRvIHNvbWV0aGluZyBhY2NvcmRpbmcgdG8gaXQgKGZvcgotICogZXhhbXBsZSwgc2VsZWN0IGFuIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGlucHV0KS4KLSAqIDxwPlRoZSBmb3JtIHBhcnQgaGFzIHR3byAnb3V0IG9mIHN5bmMnIHN0YXRlcyBpbiByZXNwZWN0IHRvIAotICogdGhlIG1vZGVsKHMpIHRoYXQgZmVlZCB0aGUgZm9ybTogPGI+ZGlydHk8L2I+IGFuZCA8Yj5zdGFsZTwvYj4uCi0gKiBXaGVuIGEgcGFydCBpcyBkaXJ0eSwgaXQgbWVhbnMgdGhhdCB0aGUgdXNlciBpbnRlcmFjdGVkIHdpdGggCi0gKiBpdCBhbmQgbm93IGl0cyB3aWRnZXRzIGNvbnRhaW4gc3RhdGUgdGhhdCBpcyBuZXdlciB0aGFuIHRoZQotICogbW9kZWwuIEluIG9yZGVyIHRvIHN5bmMgdXAgd2l0aCB0aGUgbW9kZWwsICdjb21taXQnIG5lZWRzIHRvCi0gKiBiZSBjYWxsZWQuIEluIGNvbnRyYXN0LCB0aGUgbW9kZWwgY2FuIGNoYW5nZSAndW5kZXInIHRoZSBmb3JtCi0gKiAoYXMgYSByZXN1bHQgb2Ygc29tZSBhY3Rpb25zIG91dHNpZGUgdGhlIGZvcm0pLCByZXN1bHRpbmcKLSAqIGluIGRhdGEgaW4gdGhlIG1vZGVsIGJlaW5nICduZXdlcicgdGhhbiB0aGUgY29udGVudCBwcmVzZW50ZWQKLSAqIGluIHRoZSBmb3JtLiBBICdzdGFsZScgZm9ybSBwYXJ0IGlzIGJyb3VnaHQgaW4gc3luYyB3aXRoIHRoZSAKLSAqIG1vZGVsIGJ5IGNhbGxpbmcgJ3JlZnJlc2gnLiBUaGUgcGFydCBpcyByZXNwb25zaWJsZSB0byBub3RpZnkKLSAqIHRoZSBmb3JtIHdoZW4gb25lIG9mIHRoZXNlIHN0YXRlcyBjaGFuZ2UgaW4gdGhlIHBhcnQuIFRoZQotICogZm9ybSByZXNlcnZlcyB0aGUgcmlnaHQgdG8gaGFuZGxlIHRoaXMgbm90aWZpY2F0aW9uIGluIHRoZQotICogbW9zdCBhcHByb3ByaWF0ZSB3YXkgZm9yIHRoZSBzaXR1YXRpb24gKGZvciBleGFtcGxlLCBpZiAKLSAqIGZvcm0gaXMgaW4gYSBwYWdlIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvciwgaXQgbWF5IGRvIAotICogbm90aGluZyBmb3Igc3RhbGUgcGFydHMgaWYgdGhlIHBhZ2UgaXMgY3VycmVudGx5IG5vdCBzaG93aW5nKS4KLSAqIDxwPldoZW4gZm9ybSBpcyBkaXNwb3NlZCwgZWFjaCByZWdpc3RlcmVkIHBhcnQgaXMgZGlzcG9zZWQgCi0gKiBhcyB3ZWxsLgotICogUGFydHMgYXJlIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgYW55IHN5c3RlbSByZXNvdXJjZXMKLSAqIHRoZXkgY3JlYXRlZCBhbmQgZm9yIHJlbW92aW5nIHRoZW1zZWx2ZXMgYXMgbGlzdGVuZXJzCi0gKiBmcm9tIGFsbCBldmVudCBwcm92aWRlcnMuCi0gKiBAc2VlIElNYW5hZ2VkRm9ybQotICogQHNpbmNlIDMuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZvcm1QYXJ0IHsKLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgcGFydC4KLQkgKiAKLQkgKiBAcGFyYW0gZm9ybSB0aGUgbWFuYWdlZCBmb3JtIHRoYXQgbWFuYWdlcyB0aGUgcGFydAotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZShJTWFuYWdlZEZvcm0gZm9ybSk7Ci0JLyoqCi0JICogRGlzcG9zZXMgdGhlIHBhcnQgYWxsb3dpbmcgaXQgdG8gcmVsZWFzZSBhbGxvY2F0ZWQgcmVzb3VyY2VzLgotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFydCBoYXMgYmVlbiBtb2RpZmllZCB3aXRoIHJlc3BlY3QgdG8KLQkgKiB0aGUgZGF0YSBsb2FkZWQgZnJvbSB0aGUgbW9kZWwuCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXJ0IGhhcyBiZWVuIG1vZGlmaWVkIHdpdGggcmVzcGVjdCB0bwotCSAqIHRoZSBkYXRhIGxvYWRlZCBmcm9tIHRoZSBtb2RlbAotCSAqLwotCWJvb2xlYW4gaXNEaXJ0eSgpOwotCS8qKgotCSAqIElmIHBhcnQgaXMgZGlzcGxheWluZyBpbmZvcm1hdGlvbiBsb2FkZWQgZnJvbSBhIG1vZGVsLCB0aGlzIG1ldGhvZAotCSAqIGluc3RydWN0cyBpdCB0byBjb21taXQgdGhlIG5ldyAobW9kaWZpZWQpIGRhdGEgYmFjayBpbnRvIHRoZSBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gb25TYXZlCi0JICogICAgICAgICAgICBpbmRpY2F0ZXMgaWYgY29tbWl0IGlzIGNhbGxlZCBkdXJpbmcgJ3NhdmUnIG9wZXJhdGlvbiBvciBmb3IKLQkgKiAgICAgICAgICAgIHNvbWUgb3RoZXIgcmVhc29uIChmb3IgZXhhbXBsZSwgaWYgZm9ybSBpcyBjb250YWluZWQgaW4gYQotCSAqICAgICAgICAgICAgd2l6YXJkIG9yIGEgbXVsdGktcGFnZSBlZGl0b3IgYW5kIHRoZSB1c2VyIGlzIGFib3V0IHRvIGxlYXZlCi0JICogICAgICAgICAgICB0aGUgcGFnZSkuCi0JICovCi0Jdm9pZCBjb21taXQoYm9vbGVhbiBvblNhdmUpOwotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHBhcnQgdGhhdCBhbiBvYmplY3QgaGFzIGJlZW4gc2V0IGFzIG92ZXJhbGwgZm9ybSdzIGlucHV0LgotCSAqIFRoZSBwYXJ0IGNhbiBlbGVjdCB0byByZWFjdCBieSByZXZlYWxpbmcgb3Igc2VsZWN0aW5nIHRoZSBvYmplY3QsIG9yIGRvCi0JICogbm90aGluZyBpZiBub3QgYXBwbGljYWJsZS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXJ0IGhhcyBzZWxlY3RlZCBhbmQgcmV2ZWFsZWQKLQkgKiB0aGUgaW5wdXQgb2JqZWN0LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCWJvb2xlYW4gc2V0Rm9ybUlucHV0KE9iamVjdCBpbnB1dCk7Ci0JLyoqCi0JICogSW5zdHJ1Y3RzIGZvcm0gcGFydCB0byB0cmFuc2ZlciBmb2N1cyB0byB0aGUgd2lkZ2V0IHRoYXQgc2hvdWxkIGhhcwotCSAqIGZvY3VzIGluIHRoYXQgcGFydC4gVGhlIG1ldGhvZCBjYW4gZG8gbm90aGluZyAoaWYgaXQgaGFzIG5vIHdpZGdldHMKLQkgKiBjYXBhYmxlIG9mIGFjY2VwdGluZyBmb2N1cykuCi0JICovCi0Jdm9pZCBzZXRGb2N1cygpOwotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhlIGZvcm0gcGFydCBpcyBzdGFsZSBhbmQgbmVlZHMgcmVmcmVzaGluZy4KLQkgKiBQYXJ0cyBjYW4gcmVjZWl2ZSBub3RpZmljYXRpb24gZnJvbSBtb2RlbHMgdGhhdCB3aWxsIG1ha2UKLQkgKiB0aGVpciBjb250ZW50IHN0YWxlLCBidXQgbWF5IG5lZWQgdG8gZGVsYXkgcmVmcmVzaGluZwotCSAqIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgKGZvciBleGFtcGxlLCB0aGVyZSBpcyBubwotCSAqIG5lZWQgdG8gaW1tZWRpYXRlbHkgcmVmcmVzaCBhIHBhcnQgb24gYSBmb3JtIHRoYXQgaXMKLQkgKiBjdXJyZW50IG9uIGEgaGlkZGVuIHBhZ2UpLgotCSAqIDxwPkl0IGlzIGltcG9ydGFudCB0byBkaWZmZXJlbnRpYXRlICdzdGFsZScgYW5kICdkaXJ0eScKLQkgKiBzdGF0ZXMuIFBhcnQgaXMgJ2RpcnR5JyBpZiB1c2VyIGludGVyYWN0ZWQgd2l0aAotCSAqIGl0cyBlZGl0YWJsZSB3aWRnZXRzIGFuZCBjaGFuZ2VkIHRoZSB2YWx1ZXMuIEluIGNvbnRyYXN0LAotCSAqIHBhcnQgaXMgJ3N0YWxlJyB3aGVuIHRoZSBkYXRhIGl0IHByZXNlbnRzIGluIHRoZSB3aWRnZXRzCi0JICogaGFzIGJlZW4gY2hhbmdlZCBpbiB0aGUgbW9kZWwgd2l0aG91dCBkaXJlY3QgdXNlcgotCSAqIGludGVyYWN0aW9uLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhcnQgbmVlZHMgcmVmcmVzaGluZywgCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIGlzU3RhbGUoKTsKLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIHBhcnQgY29tcGxldGVseSBmcm9tIHRoZSBpbmZvcm1hdGlvbiBmcmVzaGx5IAotCSAqIG9idGFpbmVkIGZyb20gdGhlIG1vZGVsLiBUaGUgbWV0aG9kIHdpbGwgbm90IGJlIGNhbGxlZAotCSAqIGlmIHRoZSBwYXJ0IGlzIG5vdCBzdGFsZS4gT3RoZXJ3aXNlLCB0aGUgcGFydCBpcwotCSAqIHJlc3BvbnNpYmxlIGZvciBjbGVhcmluZyB0aGUgJ3N0YWxlJyBmbGFnIGFmdGVyIHJlZnJlc2hpbmcKLQkgKiBpdHNlbGYuCi0JICovCi0Jdm9pZCByZWZyZXNoKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9JTWFuYWdlZEZvcm0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL0lNYW5hZ2VkRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODI0ZjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL0lNYW5hZ2VkRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotCi0vKioKLSAqIE1hbmFnZWQgZm9ybSB3cmFwcyBhIGZvcm0gd2lkZ2V0IGFuZCBhZGRzIGxpZmUgY3ljbGUgbWV0aG9kcyBmb3IgZm9ybSBwYXJ0cy4KLSAqIEEgZm9ybSBwYXJ0IGlzIGEgcG9ydGlvbiBvZiB0aGUgZm9ybSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBmb3JtIGxpZmUgY3ljbGUKLSAqIGV2ZW50cy4KLSAqIDxwPgotICogVGhlcmUgaXMgbm8gMS8xIG1hcHBpbmcgYmV0d2VlbiB3aWRnZXRzIGFuZCBmb3JtIHBhcnRzLiBBIHdpZGdldCBsaWtlIFNlY3Rpb24KLSAqIGNhbiBiZSBhIHBhcnQgYnkgaXRzZWxmLCBidXQgYSBudW1iZXIgb2Ygd2lkZ2V0cyBjYW4gZ2F0aGVyIGFyb3VuZCBvbmUgZm9ybQotICogcGFydC4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIG5vdCBiZSBleHRlbmRlZCBvciBpbXBsZW1lbnRlZC4gTmV3IGZvcm0gaW5zdGFuY2VzCi0gKiBzaG91bGQgYmUgY3JlYXRlZCB1c2luZyBNYW5hZ2VkRm9ybS4KLSAqIAotICogQHNlZSBNYW5hZ2VkRm9ybQotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNYW5hZ2VkRm9ybSB7Ci0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGZvcm0gYnkgbG9vcGluZyB0aHJvdWdoIHRoZSBtYW5hZ2VkIHBhcnRzIGFuZAotCSAqIGluaXRpYWxpemluZyB0aGVtLiBIYXMgbm8gZWZmZWN0IGlmIGFscmVhZHkgY2FsbGVkIG9uY2UuCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvb2xraXQgdXNlZCBieSB0aGlzIGZvcm0uCi0JICogCi0JICogQHJldHVybiB0aGUgdG9vbGtpdAotCSAqLwotCXB1YmxpYyBGb3JtVG9vbGtpdCBnZXRUb29sa2l0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmb3JtIHdpZGdldCBtYW5hZ2VkIGJ5IHRoaXMgZm9ybS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb3JtIHdpZGdldAotCSAqLwotCXB1YmxpYyBTY3JvbGxlZEZvcm0gZ2V0Rm9ybSgpOwotCi0JLyoqCi0JICogUmVmbG93cyB0aGUgZm9ybSBhcyBhIHJlc3VsdCBvZiB0aGUgbGF5b3V0IGNoYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gY2hhbmdlZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGRpc2NhcmQgY2FjaGVkIGxheW91dCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZmxvdyhib29sZWFuIGNoYW5nZWQpOwotCi0JLyoqCi0JICogQSBwYXJ0IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gbm90aWZ5IG90aGVyIHBhcnRzIHRoYXQgaW1wbGVtZW50Ci0JICogSVBhcnRTZWxlY3Rpb25MaXN0ZW5lciBhYm91dCBzZWxlY3Rpb24gY2hhbmdlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydAotCSAqICAgICAgICAgICAgdGhlIHBhcnQgdGhhdCBicm9hZGNhc3RzIHRoZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc2VsZWN0aW9uIGluIHRoZSBwYXJ0Ci0JICovCi0JcHVibGljIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoSUZvcm1QYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBwYXJ0cyBjdXJyZW50bHkgbWFuYWdlZCBieSB0aGlzIGZvcm0uCi0JICogCi0JICogQHJldHVybiB0aGUgbWFuYWdlZCBwYXJ0cwotCSAqLwotCUlGb3JtUGFydFtdIGdldFBhcnRzKCk7Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBuZXcgcGFydCB0byB0aGUgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydAotCSAqICAgICAgICAgICAgdGhlIHBhcnQgdG8gYWRkCi0JICovCi0Jdm9pZCBhZGRQYXJ0KElGb3JtUGFydCBwYXJ0KTsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHBhcnQgZnJvbSB0aGUgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydAotCSAqICAgICAgICAgICAgdGhlIHBhcnQgdG8gcmVtb3ZlCi0JICovCi0Jdm9pZCByZW1vdmVQYXJ0KElGb3JtUGFydCBwYXJ0KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGlucHV0IG9mIHRoaXMgcGFnZSB0byB0aGUgcHJvdmlkZWQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgdGhlIG5ldyBwYWdlIGlucHV0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZm9ybSBjb250YWlucyB0aGlzIG9iamVjdCwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JYm9vbGVhbiBzZXRJbnB1dChPYmplY3QgaW5wdXQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBwYWdlIGlucHV0LgotCSAqIAotCSAqIEByZXR1cm4gcGFnZSBpbnB1dCBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGFwcGxpY2FibGUuCi0JICovCi0JT2JqZWN0IGdldElucHV0KCk7Ci0KLQkvKioKLQkgKiBUZXN0cyBpZiBmb3JtIGlzIGRpcnR5LiBBIG1hbmFnZWQgZm9ybSBpcyBkaXJ0eSBpZiBhdCBsZWFzdCBvbmUgbWFuYWdlZAotCSAqIHBhcnQgaXMgZGlydHkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgbWFuYWdlZCBwYXJ0IGlzIGRpcnR5LAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIGlzRGlydHkoKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBmb3JtIHRoYXQgdGhlIGRpcnR5IHN0YXRlIG9mIG9uZSBvZiBpdHMgcGFydHMgaGFzIGNoYW5nZWQuCi0JICogVGhlIGdsb2JhbCBkaXJ0eSBzdGF0ZSBvZiB0aGUgZm9ybSBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZyAnaXNEaXJ0eScuCi0JICogCi0JICogQHNlZSAjaXNEaXJ0eQotCSAqLwotCXZvaWQgZGlydHlTdGF0ZUNoYW5nZWQoKTsKLQotCS8qKgotCSAqIENvbW1pdHMgdGhlIGRpcnR5IGZvcm0uIEFsbCBwZW5kaW5nIGNoYW5nZXMgaW4gdGhlIHdpZGdldHMgYXJlIGZsdXNoZWQKLQkgKiBpbnRvIHRoZSBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gb25TYXZlCi0JICovCi0Jdm9pZCBjb21taXQoYm9vbGVhbiBvblNhdmUpOwotCi0JLyoqCi0JICogVGVzdHMgaWYgZm9ybSBpcyBzdGFsZS4gQSBtYW5hZ2VkIGZvcm0gaXMgc3RhbGUgaWYgYXQgbGVhc3Qgb25lIG1hbmFnZWQKLQkgKiBwYXJ0IGlzIHN0YWxlLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBjaGFuZ2VzLAotCSAqIHJlc3VsdGluZyBpbiB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBwYXJ0IGJlaW5nIG91dCBvZiBzeW5jIHdpdGggdGhlCi0JICogbW9kZWwgYW5kIG5lZWRpbmcgcmVmcmVzaGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmb3JtIGlzIHN0YWxlLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIGlzU3RhbGUoKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBmb3JtIHRoYXQgdGhlIHN0YWxlIHN0YXRlIG9mIG9uZSBvZiBpdHMgcGFydHMgaGFzIGNoYW5nZWQuCi0JICogVGhlIGdsb2JhbCBzdGFsZSBzdGF0ZSBvZiB0aGUgZm9ybSBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZyAnaXNTdGFsZScuCi0JICovCi0Jdm9pZCBzdGFsZVN0YXRlQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBmb3JtIGJ5IHJlZnJlc2hpbmcgZXZlcnkgcGFydCB0aGF0IGlzIHN0YWxlLgotCSAqLwotCXZvaWQgcmVmcmVzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGFpbmVyIHRoYXQgb3ducyB0aGlzIGZvcm0uIERlcGVuZGluZyBvbiB0aGUgY29udGV4dCwgdGhlCi0JICogY29udGFpbmVyIG1heSBiZSB3aXphcmQsIGVkaXRvciBwYWdlLCBlZGl0b3IgZXRjLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHRoZSBjb250YWluZXIgb2YgdGhpcyBmb3JtCi0JICovCi0Jdm9pZCBzZXRDb250YWluZXIoT2JqZWN0IGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250YWluZXIgb2YgdGhpcyBmb3JtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvcm0gY29udGFpbmVyCi0JICovCi0JT2JqZWN0IGdldENvbnRhaW5lcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvSVBhcnRTZWxlY3Rpb25MaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvSVBhcnRTZWxlY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmM0MGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL0lQYXJ0U2VsZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotLyoqCi0gKiBGb3JtIHBhcnRzIGNhbiBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaWYgdGhleSB3YW50IHRvIGJlIAotICogbm90aWZpZWQgd2hlbiBhbm90aGVyIHBhcnQgb24gdGhlIHNhbWUgZm9ybSBjaGFuZ2VzIHNlbGVjdGlvbiAKLSAqIHN0YXRlLgotICogCi0gKiBAc2VlIElGb3JtUGFydAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQYXJ0U2VsZWN0aW9uTGlzdGVuZXIgewotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBwcm92aWRlZCBwYXJ0IGhhcyBjaGFuZ2VkIHNlbGVjdGlvbiBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydAotCSAqICAgICAgICAgICAgdGhlIHNlbGVjdGlvbiBzb3VyY2UKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgbmV3IHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUZvcm1QYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL01hbmFnZWRGb3JtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9NYW5hZ2VkRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjk3MWY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL01hbmFnZWRGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLio7Ci0vKioKLSAqIE1hbmFnZWQgZm9ybSB3cmFwcyBhIGZvcm0gd2lkZ2V0IGFuZCBhZGRzIGxpZmUgY3ljbGUgbWV0aG9kcyBmb3IgZm9ybSBwYXJ0cy4KLSAqIEEgZm9ybSBwYXJ0IGlzIGEgcG9ydGlvbiBvZiB0aGUgZm9ybSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBmb3JtIGxpZmUgY3ljbGUKLSAqIGV2ZW50cy4KLSAqIDxwPgotICogVGhlcmUgaXMgcmVxdWlyZW1lbnQgZm9yIDEvMSBtYXBwaW5nIGJldHdlZW4gd2lkZ2V0cyBhbmQgZm9ybSBwYXJ0cy4gQQotICogd2lkZ2V0IGxpa2UgU2VjdGlvbiBjYW4gYmUgYSBwYXJ0IGJ5IGl0c2VsZiwgYnV0IGEgbnVtYmVyIG9mIHdpZGdldHMgY2FuCi0gKiBqb2luIGFyb3VuZCBvbmUgZm9ybSBwYXJ0LgotICogPHA+Tm90ZSB0byBkZXZlbG9wZXJzOiB0aGlzIGNsYXNzIGlzIGxlZnQgcHVibGljIHRvIGFsbG93IGl0cyB1c2UKLSAqIGJleW9uZCB0aGUgb3JpZ2luYWwgaW50ZW50aW9uIChpbnNpZGUgYSBtdWx0aS1wYWdlIGVkaXRvcidzIHBhZ2UpLgotICogWW91IHNob3VsZCBsaW1pdCB0aGUgdXNlIG9mIHRoaXMgY2xhc3MgdG8gbWFrZSBuZXcgaW5zdGFuY2VzCi0gKiBpbnNpZGUgYSBmb3JtIGNvbnRhaW5lciAod2l6YXJkIHBhZ2UsIGRpYWxvZyBldGMuKS4KLSAqIENsaWVudHMgdGhhdCBuZWVkIGFjY2VzcyB0byB0aGUgY2xhc3Mgc2hvdWxkIG5vdCBkbyBpdCBkaXJlY3RseS4gCi0gKiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBkbyBpdCB0aHJvdWdoIElNYW5hZ2VkRm9ybSBpbnRlcmZhY2UgYXMgCi0gKiBtdWNoIGFzIHBvc3NpYmxlLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW5hZ2VkRm9ybSBpbXBsZW1lbnRzIElNYW5hZ2VkRm9ybSB7Ci0JcHJpdmF0ZSBPYmplY3QgaW5wdXQ7Ci0JcHJpdmF0ZSBTY3JvbGxlZEZvcm0gZm9ybTsKLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0JcHJpdmF0ZSBPYmplY3QgY29udGFpbmVyOwotCXByaXZhdGUgYm9vbGVhbiBvd25zVG9vbGtpdDsKLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7CQotCXByaXZhdGUgVmVjdG9yIHBhcnRzID0gbmV3IFZlY3RvcigpOwotCS8qKgotCSAqIENyZWF0ZXMgYSBtYW5hZ2VkIGZvcm0gaW4gdGhlIHByb3ZpZGVkIHBhcmVudC4gRm9ybSB0b29sa2l0IGFuZCB3aWRnZXQKLQkgKiB3aWxsIGJlIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgd2lkZ2V0Ci0JICovCi0JcHVibGljIE1hbmFnZWRGb3JtKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdG9vbGtpdCA9IG5ldyBGb3JtVG9vbGtpdChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLQkJb3duc1Rvb2xraXQgPSB0cnVlOwotCQlmb3JtID0gdG9vbGtpdC5jcmVhdGVTY3JvbGxlZEZvcm0ocGFyZW50KTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG1hbmFnZWQgZm9ybSB0aGF0IHdpbGwgdXNlIHRoZSBwcm92aWRlZCB0b29sa2l0IGFuZAotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHBhcmFtIGZvcm0KLQkgKi8KLQlwdWJsaWMgTWFuYWdlZEZvcm0oRm9ybVRvb2xraXQgdG9vbGtpdCwgU2Nyb2xsZWRGb3JtIGZvcm0pIHsKLQkJdGhpcy5mb3JtID0gZm9ybTsKLQkJdGhpcy50b29sa2l0ID0gdG9vbGtpdDsKLQl9Ci0JLyoqCi0JICogQWRkIGEgcGFydCB0byBiZSBtYW5hZ2VkIGJ5IHRoaXMgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydAotCSAqICAgICAgICAgICAgcGFydCB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYXJ0KElGb3JtUGFydCBwYXJ0KSB7Ci0JCXBhcnRzLmFkZChwYXJ0KTsKLQkJcGFydC5pbml0aWFsaXplKHRoaXMpOwotCX0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHBhcnQgZnJvbSB0aGlzIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcnQKLQkgKiAgICAgICAgICAgIHBhcnQgdG8gcmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGFydChJRm9ybVBhcnQgcGFydCkgewotCQlwYXJ0cy5yZW1vdmUocGFydCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBwYXJ0cyBjdXJyZW50IG1hbmFnZWQgYnkgdGhpcyBmb3JtLgotCSAqLwotCXB1YmxpYyBJRm9ybVBhcnRbXSBnZXRQYXJ0cygpIHsKLQkJcmV0dXJuIChJRm9ybVBhcnRbXSkgcGFydHMudG9BcnJheShuZXcgSUZvcm1QYXJ0W3BhcnRzLnNpemUoKV0pOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b29sa2l0IHVzZWQgYnkgdGhpcyBmb3JtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvb2xraXQKLQkgKi8KLQlwdWJsaWMgRm9ybVRvb2xraXQgZ2V0VG9vbGtpdCgpIHsKLQkJcmV0dXJuIHRvb2xraXQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZvcm0gd2lkZ2V0IG1hbmFnZWQgYnkgdGhpcyBmb3JtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvcm0gd2lkZ2V0Ci0JICovCi0JcHVibGljIFNjcm9sbGVkRm9ybSBnZXRGb3JtKCkgewotCQlyZXR1cm4gZm9ybTsKLQl9Ci0JLyoqCi0JICogUmVmbG93cyB0aGUgZm9ybSBhcyBhIHJlc3VsdCBvZiBhIGxheW91dCBjaGFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgcmVmbG93KGJvb2xlYW4gY2hhbmdlZCkgewotCQlmb3JtLnJlZmxvdyhjaGFuZ2VkKTsKLQl9Ci0JLyoqCi0JICogQSBwYXJ0IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gbm90aWZ5IG90aGVyIHBhcnRzIHRoYXQgaW1wbGVtZW50Ci0JICogSVBhcnRTZWxlY3Rpb25MaXN0ZW5lciBhYm91dCBzZWxlY3Rpb24gY2hhbmdlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydAotCSAqICAgICAgICAgICAgdGhlIHBhcnQgdGhhdCBicm9hZGNhc3RzIHRoZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc2VsZWN0aW9uIGluIHRoZSBwYXJ0Ci0JICogQHNlZSBJUGFydFNlbGVjdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoSUZvcm1QYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGb3JtUGFydCBjcGFydCA9IChJRm9ybVBhcnQpIHBhcnRzLmdldChpKTsKLQkJCWlmIChwYXJ0LmVxdWFscyhjcGFydCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoY3BhcnQgaW5zdGFuY2VvZiBJUGFydFNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0JCQkJKChJUGFydFNlbGVjdGlvbkxpc3RlbmVyKSBjcGFydCkuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LAotCQkJCQkJc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBmb3JtIGJ5IGxvb3BpbmcgdGhyb3VnaCB0aGUgbWFuYWdlZAotCSAqIHBhcnRzIGFuZCBpbml0aWFsaXppbmcgdGhlbS4gSGFzIG5vIGVmZmVjdCBpZgotCSAqIGFscmVhZHkgY2FsbGVkIG9uY2UuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKGluaXRpYWxpemVkKSByZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGb3JtUGFydCBwYXJ0ID0gKElGb3JtUGFydCkgcGFydHMuZ2V0KGkpOwotCQkJcGFydC5pbml0aWFsaXplKHRoaXMpOwotCQl9Ci0JCWluaXRpYWxpemVkPXRydWU7Ci0JfQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCB0aGUgcGFydHMgaW4gdGhpcyBmb3JtLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGb3JtUGFydCBwYXJ0ID0gKElGb3JtUGFydCkgcGFydHMuZ2V0KGkpOwotCQkJcGFydC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKG93bnNUb29sa2l0KSB7Ci0JCQl0b29sa2l0LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGZvcm0gYnkgcmVmcmVzaGVzIGFsbCB0aGUgc3RhbGUgcGFydHMuIAotCSAqIFNpbmNlIDMuMSwgdGhpcyBtZXRob2QgaXMgcGVyZm9ybWVkIG9uIGEgVUkgdGhyZWFkCi0JICogd2hlbiBjYWxsZWQgZnJvbSBhbm90aGVyIHRocmVhZCBzbyBpdCBpcyBub3QgbmVlZGVkCi0JICogdG8gd3JhcCB0aGUgY2FsbCBpbiA8Y29kZT5EaXNwbGF5LnN5bmNFeGVjPC9jb2RlPgotCSAqIG9yIDxjb2RlPmFzeW5jRXhlYzwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJVGhyZWFkIHQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQlUaHJlYWQgZHQgPSB0b29sa2l0LmdldENvbG9ycygpLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKTsKLQkJaWYgKHQuZXF1YWxzKGR0KSkKLQkJCWRvUmVmcmVzaCgpOwotCQllbHNlIHsKLQkJCXRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb1JlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9SZWZyZXNoKCkgewotCQlpbnQgbnJlZnJlc2hlZCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGb3JtUGFydCBwYXJ0ID0gKElGb3JtUGFydCkgcGFydHMuZ2V0KGkpOwotCQkJaWYgKHBhcnQuaXNTdGFsZSgpKSB7Ci0JCQkJcGFydC5yZWZyZXNoKCk7Ci0JCQkJbnJlZnJlc2hlZCsrOwotCQkJfQotCQl9Ci0JCWlmIChucmVmcmVzaGVkID4gMCkKLQkJCWZvcm0ucmVmbG93KHRydWUpOwotCX0KLQkvKioKLQkgKiBDb21taXRzIHRoZSBmb3JtIGJ5IGNvbW1pdGluZyBhbGwgdGhlIGRpcnR5IHBhcnRzIHRvIHRoZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21taXQoYm9vbGVhbiBvblNhdmUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0cy5zaXplKCk7IGkrKykgewotCQkJSUZvcm1QYXJ0IHBhcnQgPSAoSUZvcm1QYXJ0KSBwYXJ0cy5nZXQoaSk7Ci0JCQlpZiAocGFydC5pc0RpcnR5KCkpCi0JCQkJcGFydC5jb21taXQob25TYXZlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb3JtIGlucHV0LiBNYW5hZ2VkIHBhcnRzIGNvdWxkIG9wdCB0byByZWFjdCB0byBpdCBieSBzZWxlY3RpbmcKLQkgKiBhbmQvb3IgcmV2ZWFsaW5nIHRoZSBvYmplY3QgaWYgdGhleSBjb250YWluIGl0LgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgdGhlIGlucHV0IG9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCQlib29sZWFuIHBhZ2VSZXN1bHQ9ZmFsc2U7Ci0JCQotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGb3JtUGFydCBwYXJ0ID0gKElGb3JtUGFydCkgcGFydHMuZ2V0KGkpOwotCQkJYm9vbGVhbiByZXN1bHQgPSBwYXJ0LnNldEZvcm1JbnB1dChpbnB1dCk7Ci0JCQlpZiAocmVzdWx0KQotCQkJCXBhZ2VSZXN1bHQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBwYWdlUmVzdWx0OwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCS8qKgotCSAqIFRyYW5zZmVycyB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IGZvcm0gcGFydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKHBhcnRzLnNpemUoKSA+IDApIHsKLQkJCUlGb3JtUGFydCBwYXJ0ID0gKElGb3JtUGFydCkgcGFydHMuZ2V0KDApOwotCQkJcGFydC5zZXRGb2N1cygpOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGb3JtUGFydCBwYXJ0ID0gKElGb3JtUGFydCkgcGFydHMuZ2V0KGkpOwotCQkJaWYgKHBhcnQuaXNEaXJ0eSgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNTdGFsZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0cy5zaXplKCk7IGkrKykgewotCQkJSUZvcm1QYXJ0IHBhcnQgPSAoSUZvcm1QYXJ0KSBwYXJ0cy5nZXQoaSk7Ci0JCQlpZiAocGFydC5pc1N0YWxlKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBAc2VlIElNYW5hZ2VkRm9ybSNkaXJ0eVN0YXRlQ2hhbmdlZAotCSAqLwotCXB1YmxpYyB2b2lkIGRpcnR5U3RhdGVDaGFuZ2VkKCkgewotCX0KLQkvKioKLQkgKiBAc2VlIElNYW5hZ2VkRm9ybSNzdGFsZVN0YXRlQ2hhbmdlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YWxlU3RhdGVDaGFuZ2VkKCkgewotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbnRhaW5lci4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoT2JqZWN0IGNvbnRhaW5lcikgewotCQl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9NYXN0ZXJEZXRhaWxzQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL01hc3RlckRldGFpbHNCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGRiMGIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL01hc3RlckRldGFpbHNCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3JtczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLio7Ci0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgJ21hc3Rlci9kZXRhaWxzJyBVSSBwYXR0ZXJuIHN1aXRhYmxlIGZvciBpbmNsdXNpb24KLSAqIGluIGEgZm9ybS4gVGhlIGJsb2NrIGNvbnNpc3RzIG9mIHR3byBwYXJ0czogJ21hc3RlcicgYW5kICdkZXRhaWxzJyBpbiBhIHNhc2gKLSAqIGZvcm0gdGhhdCBhbGxvd3MgdXNlcnMgdG8gY2hhbmdlIHRoZSByZWxhdGl2ZSByYXRpbyBvbiB0aGUgcGFnZS4gVGhlIG1hc3RlcgotICogcGFydCBuZWVkcyB0byBiZSBjcmVhdGVkIGJ5IHRoZSB1c2VycyBvZiB0aGlzIGNsYXNzLiBUaGUgZGV0YWlscyBwYXJ0IGlzCi0gKiBjcmVhdGVkIGJ5IHRoZSBibG9jay4KLSAqIDxwPgotICogVGhlIG1hc3RlciBwYXJ0IGlzIHJlc3BvbnNpYmxlIGZvciBhZGRpbmcgaXRzZWxmIGFzIGEgZm9ybSBwYXJ0IGFuZCBmaXJpbmcKLSAqIHNlbGVjdGlvbiBldmVudHMuIFRoZSBkZXRhaWxzIHBhcnQgY2F0Y2hlcyB0aGUgc2VsZWN0aW9uIGV2ZW50cyBhbmQgdHJpZXMgdG8KLSAqIGxvYWQgYSBwYWdlIHJlZ2lzdGVyZWQgdG8gaGFuZGxlIHRoZSBzZWxlY3RlZCBvYmplY3QocykuIFRoZSBwYWdlIHNob3dzIHRoZQotICogZGV0YWlscyBvZiB0aGUgc2VsZWN0ZWQgb2JqZWN0KHMpIGFuZCBhbGxvd3MgdXNlcnMgdG8gZWRpdCB0aGVtLgotICogPHA+Ci0gKiBEZXRhaWxzIHBhZ2VzIGNhbiBiZSByZWdpc3RlcmVkIHN0YXRpY2FsbHkgdXNpbmcgJ3JlZ2lzdGVyUGFnZScgb3IKLSAqIGR5bmFtaWNhbGx5IHRocm91Z2ggdGhlIHVzZSBvZiAnSURldGFpbHNQYWdlUHJvdmlkZXInIGluIGNhc2Ugd2hlcmUgZGlmZmVyZW50Ci0gKiBwYWdlcyBuZWVkIHRvIGJlIHNob3duIGZvciBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZGVwZW5kaW5nIG9uIHRoZWlyIHN0YXRlLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIGFyZSByZXF1aXJlZCB0byBpbXBsZW1lbnQgYWJzdHJhY3QgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLiBNYXN0ZXIKLSAqIHBhcnQgbXVzdCBiZSBjcmVhdGVkIGFuZCBhdCBsZWFzdCBvbmUgZGV0YWlscyBwYWdlIHNob3VsZCBiZSByZWdpc3RlcmVkIGluCi0gKiBvcmRlciB0byBzaG93IGRldGFpbHMgb2YgdGhlIG9iamVjdHMgc2VsZWN0ZWQgaW4gdGhlIG1hc3RlciBwYXJ0LiBUb29sIGJhcgotICogYWN0aW9ucyBjYW4gYmUgb3B0aW9uYWxseSBhZGRlZCB0byB0aGUgdG9vbCBiYXIgbWFuYWdlci4KLSAqIAotICogQHNlZSBEZXRhaWxzUGFydAotICogQHNlZSBJRGV0YWlsc1BhZ2UKLSAqIEBzZWUgSURldGFpbHNQYWdlUHJvdmlkZXIKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1hc3RlckRldGFpbHNCbG9jayB7Ci0vKioKLSAqIERldGFpbHMgcGFydCBjcmVhdGVkIGJ5IHRoZSBibG9jay4gTm8gYXR0ZW1wdCBzaG91bGQgYmUKLSAqIG1hZGUgdG8gYWNjZXNzIHRoaXMgZmllbGQgaW5zaWRlIDxjb2RlPmNyZWF0ZU1hc3RlclBhcnQ8L2NvZGU+Ci0gKiBiZWNhdXNlIGl0IGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldCBhbmQgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAqLwotCXByb3RlY3RlZCBEZXRhaWxzUGFydCBkZXRhaWxzUGFydDsKLS8qKgotICogVGhlIGZvcm0gdGhhdCBpcyB0aGUgcGFyZW50IG9mIGJvdGggbWFzdGVyIGFuZCBkZXRhaWxzIHBhcnQuCi0gKiBUaGUgZm9ybSBhbGxvd3MgdXNlcnMgdG8gY2hhbmdlIHRoZSByYXRpbyBiZXR3ZWVuIHRoZSB0d28KLSAqIHBhcnRzLgotICovCi0JcHJvdGVjdGVkIFNhc2hGb3JtIHNhc2hGb3JtOwotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIG1hc3Rlci9kZXRhaWxzIGJsb2NrIGluc2lkZSB0aGUgbWFuYWdlZCBmb3JtLgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYXMgbGF0ZSBhcyBwb3NzaWJsZSBpbnNpZGUgdGhlIHBhcmVudCBwYXJ0LgotCSAqIAotCSAqIEBwYXJhbSBtYW5hZ2VkRm9ybQotCSAqICAgICAgICAgICAgdGhlIG1hbmFnZWQgZm9ybSB0byBjcmVhdGUgdGhlIGJsb2NrIGluCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJZmluYWwgU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChsYXlvdXQpOwotCQlzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShmb3JtLmdldEJvZHkoKSwgU1dULk5VTEwpOwotCQl0b29sa2l0LmFkYXB0KHNhc2hGb3JtLCBmYWxzZSwgZmFsc2UpOwotCQlzYXNoRm9ybS5zZXRNZW51KGZvcm0uZ2V0Qm9keSgpLmdldE1lbnUoKSk7Ci0JCXNhc2hGb3JtLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljcmVhdGVNYXN0ZXJQYXJ0KG1hbmFnZWRGb3JtLCBzYXNoRm9ybSk7Ci0JCWNyZWF0ZURldGFpbHNQYXJ0KG1hbmFnZWRGb3JtLCBzYXNoRm9ybSk7Ci0JCWNyZWF0ZVRvb2xCYXJBY3Rpb25zKG1hbmFnZWRGb3JtKTsKLQkJZm9ybS51cGRhdGVUb29sQmFyKCk7Ci0JfQotCS8qKgotCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBtYXN0ZXIgcGFydCBpbiB0aGUgcHJvdmlkZWQgcGFyZW50LgotCSAqIFR5cGljYWwgbWFzdGVyIHBhcnRzIGFyZSBzZWN0aW9uIHBhcnRzIHRoYXQgY29udGFpbiB0cmVlIG9yIHRhYmxlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuYWdlZEZvcm0KLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgZm9ybQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlTWFzdGVyUGFydChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0sCi0JCQlDb21wb3NpdGUgcGFyZW50KTsKLQkvKioKLQkgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc3RhdGljYWxseSByZWdpc3RlciBwYWdlcyBmb3IgdGhlIGV4cGVjdGVkCi0JICogb2JqZWN0IHR5cGVzLiBUaGlzIG1lY2hhbmlzbSBjYW4gYmUgdXNlZCB3aGVuIHRoZXJlIGlzIDEtJmd0OzEgbWFwcGluZwotCSAqIGJldHdlZW4gb2JqZWN0IGNsYXNzZXMgYW5kIGRldGFpbHMgcGFnZXMuCi0JICogCi0JICogQHBhcmFtIGRldGFpbHNQYXJ0Ci0JICogICAgICAgICAgICB0aGUgZGV0YWlscyBwYXJ0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJQYWdlcyhEZXRhaWxzUGFydCBkZXRhaWxzUGFydCk7Ci0JLyoqCi0JICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBmb3JtIHRvb2wgYmFyIGFjdGlvbnMgYW5kIGFkZCB0aGVtIHRvIHRoZQotCSAqIGZvcm0gdG9vbCBiYXIgaWYgZGVzaXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuYWdlZEZvcm0KLQkgKiAgICAgICAgICAgIHRoZSBmb3JtIHRoYXQgb3ducyB0aGUgdG9vbCBiYXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVUb29sQmFyQWN0aW9ucyhJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pOwotCXByaXZhdGUgdm9pZCBjcmVhdGVEZXRhaWxzUGFydChmaW5hbCBJTWFuYWdlZEZvcm0gbWZvcm0sIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZGV0YWlsc1BhcnQgPSBuZXcgRGV0YWlsc1BhcnQobWZvcm0sIHBhcmVudCwgU1dULk5VTEwpOwotCQltZm9ybS5hZGRQYXJ0KGRldGFpbHNQYXJ0KTsKLQkJcmVnaXN0ZXJQYWdlcyhkZXRhaWxzUGFydCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvU2VjdGlvblBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL1NlY3Rpb25QYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyODFjYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvU2VjdGlvblBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkV4cGFuc2lvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkV4cGFuc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotLyoqCi0gKiBTZWN0aW9uIHBhcnQgaW1wbGVtZW50cyBJRm9ybVBhcnQgaW50ZXJmYWNlIGJhc2VkIG9uIHRoZSBTZWN0aW9uIHdpZGdldC4gSXQKLSAqIGNhbiBlaXRoZXIgd3JhcCB0aGUgd2lkZ2V0IG9yIGNyZWF0ZSBvbmUgaXRzZWxmLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIHNob3VsZCBleHRlbmQgPGNvZGU+U2VjdGlvblBhcnQ8L2NvZGU+IGFuZCBpbXBsZW1lbnQgCi0gKiBsaWZlIGN5Y2xlIG1ldGhvZHMgbGlrZSA8Y29kZT5yZWZyZXNoPC9jb2RlPiwgPGNvZGU+Y29tbWl0PC9jb2RlPiwKLSAqIDxjb2RlPnNldEZvY3VzPC9jb2RlPiBldGMuIE5vdGUgdGhhdCBtb3N0IG9mIHRoZXNlIG1ldGhvZHMKLSAqIGFyZSBub3QgZW1wdHkgLSBjYWxsaW5nIDxjb2RlPnN1cGVyPC9jb2RlPiBpcyByZXF1aXJlZC4KLSAqIEBzZWUgU2VjdGlvbgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvblBhcnQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYXJ0IHsKLQlwcml2YXRlIFNlY3Rpb24gc2VjdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2VjdGlvbiBwYXJ0IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBzZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc2VjdGlvbiB0byB1c2UKLQkgKi8KLQlwdWJsaWMgU2VjdGlvblBhcnQoU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCXRoaXMuc2VjdGlvbiA9IHNlY3Rpb247Ci0JCWhvb2tMaXN0ZW5lcnMoKTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzZWN0aW9uIHBhcnQgaW5zaWRlIHRoZSBwcm92aWRlZCBwYXJlbnQgYW5kIHVzaW5nIHRoZQotCSAqIHByb3ZpZGVkIHRvb2xraXQuIFRoZSBzZWN0aW9uIHBhcnQgd2lsbCBjcmVhdGUgdGhlIHNlY3Rpb24gd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgdGhlIHRvb2xraXQgdG8gdXNlCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgc2VjdGlvbiB3aWRnZXQgc3R5bGUKLQkgKi8KLQlwdWJsaWMgU2VjdGlvblBhcnQoQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCwgaW50IHN0eWxlKSB7Ci0JCXRoaXModG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgc3R5bGUpKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgaG9va0xpc3RlbmVycygpIHsKLQkJaWYgKChzZWN0aW9uLmdldEV4cGFuc2lvblN0eWxlKCkgJiBTZWN0aW9uLlRXSVNUSUUpICE9IDAKLQkJCQl8fCAoc2VjdGlvbi5nZXRFeHBhbnNpb25TdHlsZSgpICYgU2VjdGlvbi5UUkVFX05PREUpICE9IDApIHsKLQkJCXNlY3Rpb24uYWRkRXhwYW5zaW9uTGlzdGVuZXIobmV3IEV4cGFuc2lvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZXhwYW5zaW9uU3RhdGVDaGFuZ2luZyhFeHBhbnNpb25FdmVudCBlKSB7Ci0JCQkJCVNlY3Rpb25QYXJ0LnRoaXMuZXhwYW5zaW9uU3RhdGVDaGFuZ2luZyhlLmdldFN0YXRlKCkpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5nZWQoRXhwYW5zaW9uRXZlbnQgZSkgewotCQkJCQlTZWN0aW9uUGFydC50aGlzLmV4cGFuc2lvblN0YXRlQ2hhbmdlZChlLmdldFN0YXRlKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlY3Rpb24gd2lkZ2V0IHVzZWQgaW4gdGhpcyBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlY3Rpb24gd2lkZ2V0Ci0JICovCi0JcHVibGljIFNlY3Rpb24gZ2V0U2VjdGlvbigpIHsKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCS8qKgotCSAqIFRoZSBzZWN0aW9uIGlzIGFib3V0IHRvIGV4cGFuZCBvciBjb2xsYXBzZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwYW5kaW5nCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBmb3IgZXhwYW5zaW9uLCA8Y29kZT5mYWxzZTwvY29kZT4gZm9yCi0JICogICAgICAgICAgICBjb2xsYXBzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5naW5nKGJvb2xlYW4gZXhwYW5kaW5nKSB7Ci0JfQotCS8qKgotCSAqIFRoZSBzZWN0aW9uIGhhcyBleHBhbmRlZCBvciBjb2xsYXBzZWQuCi0JICogCi0JICogQHBhcmFtIGV4cGFuZGVkCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBmb3IgZXhwYW5zaW9uLCA8Y29kZT5mYWxzZTwvY29kZT4gZm9yCi0JICogICAgICAgICAgICBjb2xsYXBzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5nZWQoYm9vbGVhbiBleHBhbmRlZCkgewotCQlnZXRNYW5hZ2VkRm9ybSgpLmdldEZvcm0oKS5yZWZsb3coZmFsc2UpOwotCX0KLQkvKioKLQkgKiBJbnN0cnVjdHMgdGhlIHNlY3Rpb24gdG8gZ3JhYiBrZXlib2FyZCBmb2N1cy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQkgKiB3aWxsIHRyYW5zZmVyIGZvY3VzIHRvIHRoZSBzZWN0aW9uIGNsaWVudC4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgYW5kCi0JICogdHJhbnNmZXIgZm9jdXMgdG8gc29tZSB3aWRnZXQgaW4gdGhlIGNsaWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJQ29udHJvbCBjbGllbnQgPSBzZWN0aW9uLmdldENsaWVudCgpOwotCQlpZiAoY2xpZW50ICE9IG51bGwpCi0JCQljbGllbnQuc2V0Rm9jdXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9lZGl0b3IvRm9ybUVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZWRpdG9yL0Zvcm1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiOThkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9lZGl0b3IvRm9ybUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JUGFnZUNoYW5nZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSVBhZ2VDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5QYWdlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZm9ybXMgYSBiYXNlIG9mIG11bHRpLXBhZ2UgZm9ybSBlZGl0b3JzIHRoYXQgdHlwaWNhbGx5IHVzZSBvbmUgb3IKLSAqIG1vcmUgcGFnZXMgd2l0aCBmb3JtcyBhbmQgb25lIHBhZ2UgZm9yIHJhdyBzb3VyY2Ugb2YgdGhlIGVkaXRvciBpbnB1dC4KLSAqIDxwPgotICogUGFnZXMgYXJlIGFkZGVkICdsYXppbHknIGkuZS4gYWRkaW5nIGEgcGFnZSByZXNlcnZlcyBhIHRhYiBmb3IgaXQgYnV0IGRvZXMKLSAqIG5vdCBjYXVzZSB0aGUgcGFnZSBjb250cm9sIHRvIGJlIGNyZWF0ZWQuIFBhZ2UgY29udHJvbCBpcyBjcmVhdGVkIHdoZW4gYW4KLSAqIGF0dGVtcHQgaXMgbWFkZSB0byBzZWxlY3QgdGhlIHBhZ2UgaW4gcXVlc3Rpb24uIFRoaXMgYWxsb3dzIGVkaXRvcnMgd2l0aAotICogc2V2ZXJhbCB0YWJzIGFuZCBjb21wbGV4IHBhZ2VzIHRvIG9wZW4gcXVpY2tseS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIGltcGxlbWVudCA8Y29kZT5hZGRQYWdlczwvY29kZT4KLSAqIG1ldGhvZC4gT25lIG9mIHRoZSB0d28gPGNvZGU+YWRkUGFnZTwvY29kZT4gbWV0aG9kcyBzaG91bGQgYmUgY2FsbGVkIHRvCi0gKiBjb250cmlidXRlIHBhZ2VzIHRvIHRoZSBlZGl0b3IuIE9uZSBhZGRzIGNvbXBsZXRlIChzdGFuZGFsb25lKSBlZGl0b3JzIGFzCi0gKiBuZXN0ZWQgdGFicy4gVGhlc2UgZWRpdG9ycyB3aWxsIGJlIGNyZWF0ZWQgcmlnaHQgYXdheSBhbmQgd2lsbCBiZSBob29rZWQgc28KLSAqIHRoYXQga2V5IGJpbmRpbmdzLCBzZWxlY3Rpb24gc2VydmljZSBldGMuIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb25lIGZvciB0aGUKLSAqIHN0YW5kYWxvbmUgY2FzZS4gVGhlIG90aGVyIG1ldGhvZCBhZGRzIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQKLSAqIDxjb2RlPklGb3JtUGFnZTwvY29kZT4gaW50ZXJmYWNlLiBUaGVzZSBwYWdlcyB3aWxsIGJlIGNyZWF0ZWQgbGF6aWx5IGFuZAotICogdGhleSB3aWxsIHNoYXJlIHRoZSBjb21tb24ga2V5IGJpbmRpbmcgYW5kIHNlbGVjdGlvbiBzZXJ2aWNlLiBTaW5jZSAzLjEsCi0gKiBGb3JtRWRpdG9yIGlzIGEgcGFnZSBjaGFuZ2UgcHJvdmlkZXIuIEl0IGFsbG93cyBsaXN0ZW5lcnMgdG8gYXR0YWNoIHRvIGl0IGFuZAotICogZ2V0IG5vdGlmaWVkIHdoZW4gcGFnZXMgYXJlIGNoYW5nZWQuIFRoaXMgbmV3IEFQSSBpbiBKRmFjZSBhbGxvd3MgZHluYW1pYwotICogaGVscCB0byB1cGRhdGUgb24gcGFnZSBjaGFuZ2VzLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb3JtRWRpdG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydCBpbXBsZW1lbnRzCi0JCUlQYWdlQ2hhbmdlUHJvdmlkZXIgewotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgcGFnZXMgY3VycmVudGx5IGluIHRoZSBlZGl0b3IuIFBhZ2Ugb2JqZWN0cyBhcmUgbm90IGxpbWl0ZWQKLQkgKiB0byB0aG9zZSB0aGF0IGltcGxlbWVudCA8Y29kZT5JRm9ybVBhZ2U8L2NvZGU+LCBoZW5jZSB0aGUgc2l6ZSBvZiB0aGlzCi0JICogYXJyYXkgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIGFzIHZpZXdlZCBieSB0aGUgdXNlci4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIGNhbiBhY2Nlc3MgdGhpcyBmaWVsZCBidXQgc2hvdWxkIG5vdCBtb2RpZnkgaXQuCi0JICovCi0JcHJvdGVjdGVkIFZlY3RvciBwYWdlcyA9IG5ldyBWZWN0b3IoKTsKLQotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByaXZhdGUgaW50IGN1cnJlbnRQYWdlID0gLTE7Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdCBwYWdlTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgzKTsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZvcm1FZGl0b3JTZWxlY3Rpb25Qcm92aWRlciBleHRlbmRzCi0JCQlNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlciB7Ci0JCXByaXZhdGUgSVNlbGVjdGlvbiBnbG9iYWxTZWxlY3Rpb247Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBtdWx0aVBhZ2VFZGl0b3IKLQkJICovCi0JCXB1YmxpYyBGb3JtRWRpdG9yU2VsZWN0aW9uUHJvdmlkZXIoRm9ybUVkaXRvciBmb3JtRWRpdG9yKSB7Ci0JCQlzdXBlcihmb3JtRWRpdG9yKTsKLQkJfQotCi0JCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJCUlFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvciA9ICgoRm9ybUVkaXRvcikgZ2V0TXVsdGlQYWdlRWRpdG9yKCkpCi0JCQkJCS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotCQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZUVkaXRvci5nZXRTaXRlKCkKLQkJCQkJCS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKQotCQkJCQlyZXR1cm4gc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2xvYmFsU2VsZWN0aW9uOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gPGNvZGU+IElTZWxlY3Rpb25Qcm92aWRlciA8L2NvZGU+IC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yID0gKChGb3JtRWRpdG9yKSBnZXRNdWx0aVBhZ2VFZGl0b3IoKSkKLQkJCQkJLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yLmdldFNpdGUoKQotCQkJCQkJLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpCi0JCQkJCXNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmdsb2JhbFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJCQlnbG9iYWxTZWxlY3Rpb24pKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRm9ybUVkaXRvcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZXMgc3VwZXIgdG8gcGx1ZyBpbiBhIGRpZmZlcmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0JCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIobmV3IEZvcm1FZGl0b3JTZWxlY3Rpb25Qcm92aWRlcih0aGlzKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29tbW9uIHRvb2xraXQgZm9yIHRoaXMgZWRpdG9yIGFuZCBhZGRzIHBhZ2VzIHRvIHRoZSBlZGl0b3IuCi0JICogCi0JICogQHNlZSAjYWRkUGFnZXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKLQkJdG9vbGtpdCA9IGNyZWF0ZVRvb2xraXQoZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpKTsKLQkJYWRkUGFnZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmb3JtIHRvb2xraXQuIFRoZSBtZXRob2QgY2FuIGJlIGltcGxlbWVudGVkIHRvIHN1YnN0aXR1dGUgYQotCSAqIHN1YmNsYXNzIG9mIHRoZSB0b29sa2l0IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgZWRpdG9yLiBBIHR5cGljYWwKLQkgKiB1c2Ugb2YgdGhpcyBtZXRob2Qgd291bGQgYmUgdG8gY3JlYXRlIHRoZSBmb3JtIHRvb2xraXQgdXNpbmcgb25lIHNoYXJlZAotCSAqIDxjb2RlPkZvcm1Db2xvcnM8L2NvZGU+IG9iamVjdCB0byBzaGFyZSByZXNvdXJjZXMgYWNyb3NzIHRoZSBtdWx0aXBsZQotCSAqIGVkaXRvciBpbnN0YW5jZXMuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkKLQkgKiAgICAgICAgICAgIHRoZSBkaXNwbGF5IHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSB0b29sa2l0Ci0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCB0b29sa2l0IGluc3RhbmNlCi0JICovCi0JcHJvdGVjdGVkIEZvcm1Ub29sa2l0IGNyZWF0ZVRvb2xraXQoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCXJldHVybiBuZXcgRm9ybVRvb2xraXQoZGlzcGxheSk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3Mgc2hvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhZGQgcGFnZXMgdG8gdGhlIGVkaXRvciB1c2luZwotCSAqICdhZGRQYWdlKElGb3JtUGFnZSknIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRQYWdlcygpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklQYWdlQ2hhbmdlUHJvdmlkZXIjYWRkUGFnZUNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklQYWdlQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VDaGFuZ2VkTGlzdGVuZXIoSVBhZ2VDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcGFnZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JUGFnZUNoYW5nZVByb3ZpZGVyI3JlbW92ZVBhZ2VDaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JUGFnZUNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQYWdlQ2hhbmdlZExpc3RlbmVyKElQYWdlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXBhZ2VMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSVBhZ2VDaGFuZ2VQcm92aWRlciNnZXRTZWxlY3RlZFBhZ2UoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRQYWdlKCkgewotCQlyZXR1cm4gZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZm9ybSBwYWdlIHRvIHRoaXMgZWRpdG9yLiBGb3JtIHBhZ2Ugd2lsbCBiZSBsb2FkZWQgbGF6aWx5LiBJdHMKLQkgKiBwYXJ0IGNvbnRyb2wgd2lsbCBub3QgYmUgY3JlYXRlZCB1bnRpbCBpdCBpcyBhY3RpdmF0ZWQgZm9yIHRoZSBmaXJzdAotCSAqIHRpbWUuCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBmb3JtIHBhZ2UgdG8gYWRkCi0JICovCi0JcHVibGljIGludCBhZGRQYWdlKElGb3JtUGFnZSBwYWdlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlpbnQgaSA9IHN1cGVyLmFkZFBhZ2UocGFnZS5nZXRQYXJ0Q29udHJvbCgpKTsKLQkJY29uZmlndXJlUGFnZShpLCBwYWdlKTsKLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZm9ybSBwYWdlIHRvIHRoaXMgZWRpdG9yIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggKDAtYmFzZWQpLiBGb3JtCi0JICogcGFnZSB3aWxsIGJlIGxvYWRlZCBsYXppbHkuIEl0cyBwYXJ0IGNvbnRyb2wgd2lsbCBub3QgYmUgY3JlYXRlZCB1bnRpbCBpdAotCSAqIGlzIGFjdGl2YXRlZCBmb3IgdGhlIGZpcnN0IHRpbWUuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gdG8gYWRkIHRoZSBwYWdlIGF0ICgwLWJhc2VkKQotCSAqIEBwYXJhbSBwYWdlCi0JICogICAgICAgICAgICB0aGUgZm9ybSBwYWdlIHRvIGFkZAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlKGludCBpbmRleCwgSUZvcm1QYWdlIHBhZ2UpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmFkZFBhZ2UoaW5kZXgsIHBhZ2UuZ2V0UGFydENvbnRyb2woKSk7Ci0JCWNvbmZpZ3VyZVBhZ2UoaW5kZXgsIHBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBzaW1wbGUgU1dUIGNvbnRyb2wgYXMgYSBwYWdlLiBPdmVycmlkZXMgc3VwZXJjbGFzcyBpbXBsZW1lbnRhdGlvbgotCSAqIHRvIGtlZXAgdHJhY2sgb2YgcGFnZXMuCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIGNvbnRyb2wgdG8gYWRkCi0JICogQHJldHVybiB0aGUgMC1iYXNlZCBpbmRleCBvZiB0aGUgbmV3bHkgYWRkZWQgcGFnZQotCSAqLwotCXB1YmxpYyBpbnQgYWRkUGFnZShDb250cm9sIGNvbnRyb2wpIHsKLQkJaW50IGkgPSBzdXBlci5hZGRQYWdlKGNvbnRyb2wpOwotCQl0cnkgewotCQkJcmVnaXN0ZXJQYWdlKC0xLCBjb250cm9sKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJLy8gY2Fubm90IGhhcHBlbiBmb3IgY29udHJvbHMKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgc2ltcGxlIFNXVCBjb250cm9sIGFzIGEgcGFnZS4gT3ZlcnJpZGVzIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24KLQkgKiB0byBrZWVwIHRyYWNrIG9mIHBhZ2VzLgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgcGFnZSBjb250cm9sIHRvIGFkZAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGFkZCB0aGUgcGFnZSAoMC1iYXNlZCkKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZShpbnQgaW5kZXgsIENvbnRyb2wgY29udHJvbCkgewotCQlzdXBlci5hZGRQYWdlKGluZGV4LCBjb250cm9sKTsKLQkJdHJ5IHsKLQkJCXJlZ2lzdGVyUGFnZShpbmRleCwgY29udHJvbCk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGNhbm5vdCBoYXBwZW4gZm9yIGNvbnRyb2xzCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHRoZSBlZGl0b3IgaXMgZGlydHkgYnkgY2hlY2tpbmcgYWxsIHRoZSBwYWdlcyB0aGF0Ci0JICogaW1wbGVtZW50IDxjb2RlPklGb3JtUGFnZTwvY29kZT4uIElmIG5vbmUgb2YgdGhlbSBpcyBkaXJ0eSwgdGhlIG1ldGhvZAotCSAqIGRlbGVnYXRlcyBmdXJ0aGVyIHByb2Nlc3NpbmcgdG8gPGNvZGU+c3VwZXIuaXNEaXJ0eSgpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSBvZiB0aGUgcGFnZXMgaW4gdGhlIGVkaXRvciBhcmUgZGlydHksCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWlmIChwYWdlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IHBhZ2UgPSBwYWdlcy5nZXQoaSk7Ci0JCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpIHsKLQkJCQkJSUZvcm1QYWdlIGZwYWdlID0gKElGb3JtUGFnZSkgcGFnZTsKLQkJCQkJaWYgKGZwYWdlLmlzRGlydHkoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEaXJ0eSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBjb21wbGV0ZSBlZGl0b3IgcGFydCB0byB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0JICogCi0JICogQHNlZSBNdWx0aVBhZ2VFZGl0b3JQYXJ0I2FkZFBhZ2UoSUVkaXRvclBhcnQsIElFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgaW50IGFkZFBhZ2UoSUVkaXRvclBhcnQgZWRpdG9yLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlpbnQgaW5kZXggPSBzdXBlci5hZGRQYWdlKGVkaXRvciwgaW5wdXQpOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSUZvcm1QYWdlKQotCQkJY29uZmlndXJlUGFnZShpbmRleCwgKElGb3JtUGFnZSkgZWRpdG9yKTsKLQkJZWxzZQotCQkJcmVnaXN0ZXJQYWdlKC0xLCBlZGl0b3IpOwotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGNvbXBsZXRlIGVkaXRvciBwYXJ0IHRvIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBhdCB0aGUgc3BlY2lmaWVkCi0JICogcG9zaXRpb24uCi0JICogCi0JICogQHNlZSBNdWx0aVBhZ2VFZGl0b3JQYXJ0I2FkZFBhZ2UoaW50LCBJRWRpdG9yUGFydCwgSUVkaXRvcklucHV0KQotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlKGludCBpbmRleCwgSUVkaXRvclBhcnQgZWRpdG9yLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5hZGRQYWdlKGluZGV4LCBlZGl0b3IsIGlucHV0KTsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElGb3JtUGFnZSkKLQkJCWNvbmZpZ3VyZVBhZ2UoaW5kZXgsIChJRm9ybVBhZ2UpIGVkaXRvcik7Ci0JCWVsc2UKLQkJCXJlZ2lzdGVyUGFnZShpbmRleCwgZWRpdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgcGFnZSBpbmRleAotCSAqIEBwYXJhbSBwYWdlCi0JICogICAgICAgICAgICB0aGUgcGFnZSB0byBjb25maWd1cmUKLQkgKiBAdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlcmUgYXJlIHByb2JsZW1zIGluIGNvbmZpZ3VyaW5nIHRoZSBwYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUGFnZShpbnQgaW5kZXgsIElGb3JtUGFnZSBwYWdlKQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc2V0UGFnZVRleHQoaW5kZXgsIHBhZ2UuZ2V0VGl0bGUoKSk7Ci0JCS8vIHNldFBhZ2VJbWFnZShpbmRleCwgcGFnZS5nZXRUaXRsZUltYWdlKCkpOwotCQlwYWdlLnNldEluZGV4KGluZGV4KTsKLQkJcmVnaXN0ZXJQYWdlKGluZGV4LCBwYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgdG8gcmVtb3ZlIHRoZSBwYWdlIGZyb20gdGhlIHBhZ2UgdGFibGUuCi0JICogCi0JICogQHBhcmFtIHBhZ2VJbmRleAotCSAqICAgICAgICAgICAgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIHBhZ2UgaW4gdGhlIGVkaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBhZ2UoaW50IHBhZ2VJbmRleCkgewotCQlpZiAocGFnZUluZGV4ID49IDAgJiYgcGFnZUluZGV4IDwgcGFnZXMuc2l6ZSgpKSB7Ci0JCQlPYmplY3QgcGFnZSA9IHBhZ2VzLmdldChwYWdlSW5kZXgpOwotCQkJcGFnZXMucmVtb3ZlKHBhZ2UpOwotCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpIHsKLQkJCQlJRm9ybVBhZ2UgZnBhZ2UgPSAoSUZvcm1QYWdlKSBwYWdlOwotCQkJCWlmICghZnBhZ2UuaXNFZGl0b3IoKSkKLQkJCQkJZnBhZ2UuZGlzcG9zZSgpOwotCQkJCXVwZGF0ZVBhZ2VJbmRpY2VzKCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIucmVtb3ZlUGFnZShwYWdlSW5kZXgpOwotCX0KLQotCS8vIGZpeCB0aGUgcGFnZSBpbmRpY2VzIGFmdGVyIHRoZSByZW1vdmFsCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhZ2VJbmRpY2VzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3QgcGFnZSA9IHBhZ2VzLmdldChpKTsKLQkJCWlmIChwYWdlIGluc3RhbmNlb2YgSUZvcm1QYWdlKSB7Ci0JCQkJSUZvcm1QYWdlIGZwYWdlID0gKElGb3JtUGFnZSkgcGFnZTsKLQkJCQlmcGFnZS5zZXRJbmRleChpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBlZGl0b3IgaGFzIGJlZW4gbWFkZSBkaXJ0eSBvciB0aGUgY2hhbmdlcwotCSAqIGhhdmUgYmVlbiBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0b3JEaXJ0eVN0YXRlQ2hhbmdlZCgpIHsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBwYWdlcyBhbmQgdGhlIHRvb2xraXQgYWZ0ZXIgZGlzcG9zaW5nIHRoZSBlZGl0b3IgaXRzZWxmLgotCSAqIFN1YmNsYXNzZXMgbXVzdCBjYWxsICdzdXBlcicgd2hlbiByZWltcGxlbWVudGluZyB0aGUgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IHBhZ2UgPSBwYWdlcy5nZXQoaSk7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewotCQkJCUlGb3JtUGFnZSBmcGFnZSA9IChJRm9ybVBhZ2UpIHBhZ2U7Ci0JCQkJLy8gZG9uJ3QgZGlzcG9zZSBzb3VyY2UgcGFnZXMgYmVjYXVzZSB0aGV5IHdpbGwKLQkJCQkvLyBiZSBkaXNwb3NlZCBhcyBuZXN0ZWQgZWRpdG9ycyBieSB0aGUgc3VwZXJjbGFzcwotCQkJCWlmICghZnBhZ2UuaXNFZGl0b3IoKSkKLQkJCQkJZnBhZ2UuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXBhZ2VzID0gbnVsbDsKLQkJLy8gdG9vbGtpdCBtYXkgYmUgbnVsbCBpZiBlZGl0b3IgaGFzIGJlZW4gaW5zdGFudGlhdGVkCi0JCS8vIGJ1dCBuZXZlciBjcmVhdGVkIC0gc2VlIGRlZmVjdCAjNjIxOTAKLQkJaWYgKHRvb2xraXQgIT0gbnVsbCkgewotCQkJdG9vbGtpdC5kaXNwb3NlKCk7Ci0JCQl0b29sa2l0ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvb2xraXQgb3duZWQgYnkgdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgdG9vbGtpdCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgRm9ybVRvb2xraXQgZ2V0VG9vbGtpdCgpIHsKLQkJcmV0dXJuIHRvb2xraXQ7Ci0JfQotCi0JLyoqCi0JICogV2lkZW5zIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBtZXRob2QgaW4gdGhlIHN1cGVyY2xhc3MuCi0JICogCi0JICogQHJldHVybiB0aGUgYWN0aXZlIG5lc3RlZCBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBwYWdlIGluZGV4LiBUaGUgdmFsdWUgaXMgaWRlbnRpY2FsIHRvIHRoZSB2YWx1ZSBvZgotCSAqICdnZXRBY3RpdmVQYWdlKCknIGV4Y2VwdCBkdXJpbmcgdGhlIHBhZ2Ugc3dpdGNoLCB3aGVuIHRoaXMgbWV0aG9kIHN0aWxsCi0JICogaGFzIHRoZSBvbGQgYWN0aXZlIHBhZ2UgaW5kZXguCi0JICogPHA+Ci0JICogQW5vdGhlciBpbXBvcnRhbnQgZGlmZmVyZW5jZSBpcyBkdXJpbmcgdGhlIGVkaXRvciBjbG9zaW5nLiBXaGVuIHRoZSB0YWIKLQkgKiBmb2xkZXIgaXMgZGlzcG9zZWQsICdnZXRBY3RpdmVQYWdlKCknIHdpbGwgcmV0dXJuIC0xLCB3aGlsZSB0aGlzIG1ldGhvZAotCSAqIHdpbGwgc3RpbGwgcmV0dXJuIHRoZSBsYXN0IGFjdGl2ZSBwYWdlLgotCSAqIAotCSAqIEBzZWUgI2dldEFjdGl2ZVBhZ2UKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFnZSBvciAtMSBpZiBubyBwYWdlIGlzIGN1cnJlbnRseQotCSAqICAgICAgICAgc2VsZWN0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldEN1cnJlbnRQYWdlKCkgewotCQlyZXR1cm4gY3VycmVudFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNdWx0aVBhZ2VFZGl0b3JQYXJ0I3BhZ2VDaGFuZ2UoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkgewotCQkvLyBmaXggZm9yIHdpbmRvd3MgaGFuZGxlcwotCQlpbnQgb2xkUGFnZSA9IGdldEN1cnJlbnRQYWdlKCk7Ci0JCWlmIChvbGRQYWdlICE9IC0xICYmIHBhZ2VzLnNpemUoKSA+IG9sZFBhZ2UKLQkJCQkmJiBwYWdlcy5nZXQob2xkUGFnZSkgaW5zdGFuY2VvZiBJRm9ybVBhZ2UKLQkJCQkmJiBvbGRQYWdlICE9IG5ld1BhZ2VJbmRleCkgewotCQkJLy8gQ2hlY2sgdGhlIG9sZCBwYWdlCi0JCQlJRm9ybVBhZ2Ugb2xkRm9ybVBhZ2UgPSAoSUZvcm1QYWdlKSBwYWdlcy5nZXQob2xkUGFnZSk7Ci0JCQlpZiAob2xkRm9ybVBhZ2UuY2FuTGVhdmVUaGVQYWdlKCkgPT0gZmFsc2UpIHsKLQkJCQlzZXRBY3RpdmVQYWdlKG9sZFBhZ2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBOb3cgaXMgdGhlIGFic29sdXRlIGxhc3QgbW9tZW50IHRvIGNyZWF0ZSB0aGUgcGFnZSBjb250cm9sLgotCQlPYmplY3QgcGFnZSA9IHBhZ2VzLmdldChuZXdQYWdlSW5kZXgpOwotCQlpZiAocGFnZSBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewotCQkJSUZvcm1QYWdlIGZwYWdlID0gKElGb3JtUGFnZSkgcGFnZTsKLQkJCWlmIChmcGFnZS5nZXRQYXJ0Q29udHJvbCgpID09IG51bGwpIHsKLQkJCQlmcGFnZS5jcmVhdGVQYXJ0Q29udHJvbChnZXRDb250YWluZXIoKSk7Ci0JCQkJc2V0Q29udHJvbChuZXdQYWdlSW5kZXgsIGZwYWdlLmdldFBhcnRDb250cm9sKCkpOwotCQkJCWZwYWdlLmdldFBhcnRDb250cm9sKCkuc2V0TWVudShnZXRDb250YWluZXIoKS5nZXRNZW51KCkpOwotCQkJfQotCQl9Ci0JCWlmIChvbGRQYWdlICE9IC0xICYmIHBhZ2VzLnNpemUoKSA+IG9sZFBhZ2UKLQkJCQkmJiBwYWdlcy5nZXQob2xkUGFnZSkgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpIHsKLQkJCS8vIENvbW1pdCBvbGQgcGFnZSBiZWZvcmUgYWN0aXZhdGluZyB0aGUgbmV3IG9uZQotCQkJSUZvcm1QYWdlIG9sZEZvcm1QYWdlID0gKElGb3JtUGFnZSkgcGFnZXMuZ2V0KG9sZFBhZ2UpOwotCQkJSU1hbmFnZWRGb3JtIG1mb3JtID0gb2xkRm9ybVBhZ2UuZ2V0TWFuYWdlZEZvcm0oKTsKLQkJCWlmIChtZm9ybSAhPSBudWxsKQotCQkJCW1mb3JtLmNvbW1pdChmYWxzZSk7Ci0JCX0KLQkJaWYgKHBhZ2VzLnNpemUoKSA+IG5ld1BhZ2VJbmRleAotCQkJCSYmIHBhZ2VzLmdldChuZXdQYWdlSW5kZXgpIGluc3RhbmNlb2YgSUZvcm1QYWdlKQotCQkJKChJRm9ybVBhZ2UpIHBhZ2VzLmdldChuZXdQYWdlSW5kZXgpKS5zZXRBY3RpdmUodHJ1ZSk7Ci0JCWlmIChvbGRQYWdlICE9IC0xICYmIHBhZ2VzLnNpemUoKSA+IG9sZFBhZ2UKLQkJCQkmJiBwYWdlcy5nZXQob2xkUGFnZSkgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpCi0JCQkoKElGb3JtUGFnZSkgcGFnZXMuZ2V0KG9sZFBhZ2UpKS5zZXRBY3RpdmUoZmFsc2UpOwotCQkvLyBDYWxsIHN1cGVyIC0gdGhpcyB3aWxsIGNhdXNlIHBhZ2VzIHRvIHN3aXRjaAotCQlzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0JCXRoaXMuY3VycmVudFBhZ2UgPSBuZXdQYWdlSW5kZXg7Ci0JCUlGb3JtUGFnZSBuZXdQYWdlID0gZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCWlmIChuZXdQYWdlICE9IG51bGwpCi0JCQlmaXJlUGFnZUNoYW5nZWQobmV3IFBhZ2VDaGFuZ2VkRXZlbnQodGhpcywgbmV3UGFnZSkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGl2ZSBwYWdlIHVzaW5nIHRoZSB1bmlxdWUgcGFnZSBpZGVudGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlSWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgcGFnZSB0byBzd2l0Y2ggdG8KLQkgKiBAcmV0dXJuIHBhZ2UgdGhhdCB3YXMgc2V0IGFjdGl2ZSBvciA8c2FtcD5udWxsIDwvc2FtcD4gaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBJRm9ybVBhZ2Ugc2V0QWN0aXZlUGFnZShTdHJpbmcgcGFnZUlkKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBwYWdlID0gcGFnZXMuZ2V0KGkpOwotCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpIHsKLQkJCQlJRm9ybVBhZ2UgZnBhZ2UgPSAoSUZvcm1QYWdlKSBwYWdlOwotCQkJCWlmIChmcGFnZS5nZXRJZCgpLmVxdWFscyhwYWdlSWQpKSB7Ci0JCQkJCXNldEFjdGl2ZVBhZ2UoaSk7Ci0JCQkJCXJldHVybiBmcGFnZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHBhZ2UgaW5zdGFuY2UgdGhhdCBoYXMgdGhlIHByb3ZpZGVkIGlkLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlSWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgcGFnZSB0byBmaW5kCi0JICogQHJldHVybiBwYWdlIHdpdGggdGhlIG1hdGNoaW5nIGlkIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgSUZvcm1QYWdlIGZpbmRQYWdlKFN0cmluZyBwYWdlSWQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IHBhZ2UgPSBwYWdlcy5nZXQoaSk7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewotCQkJCUlGb3JtUGFnZSBmcGFnZSA9IChJRm9ybVBhZ2UpIHBhZ2VzLmdldChpKTsKLQkJCQlpZiAoZnBhZ2UuZ2V0SWQoKS5lcXVhbHMocGFnZUlkKSkKLQkJCQkJcmV0dXJuIGZwYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGl2ZSBwYWdlIHVzaW5nIHRoZSB1bmlxdWUgcGFnZSBpZGVudGlmaWVyIGFuZCBzZXRzIGl0cyBpbnB1dAotCSAqIHRvIHRoZSBwcm92aWRlZCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHBhZ2VJZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBwYWdlIHRvIHN3aXRjaCB0bwotCSAqIEBwYXJhbSBwYWdlSW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIGlucHV0Ci0JICogQHJldHVybiBwYWdlIHRoYXQgd2FzIHNldCBhY3RpdmUgb3IgPHNhbXA+bnVsbCA8L3NhbXA+IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgSUZvcm1QYWdlIHNldEFjdGl2ZVBhZ2UoU3RyaW5nIHBhZ2VJZCwgT2JqZWN0IHBhZ2VJbnB1dCkgewotCQlJRm9ybVBhZ2UgcGFnZSA9IHNldEFjdGl2ZVBhZ2UocGFnZUlkKTsKLQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJSU1hbmFnZWRGb3JtIG1mb3JtID0gcGFnZS5nZXRNYW5hZ2VkRm9ybSgpOwotCQkJaWYgKG1mb3JtICE9IG51bGwpCi0JCQkJbWZvcm0uc2V0SW5wdXQocGFnZUlucHV0KTsKLQkJfQotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBwYWdlcyBjYWxsaW5nIHNpbWlsYXIgbWV0aG9kIHVudGlsIGEgcGFnZSBpcyBmb3VuZAotCSAqIHRoYXQgY29udGFpbnMgdGhlIGRlc2lyZWQgcGFnZSBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZUlucHV0Ci0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNlbGVjdCBhbmQgcmV2ZWFsCi0JICogQHJldHVybiB0aGUgcGFnZSB0aGF0IGFjY2VwdGVkIHRoZSByZXF1ZXN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICAgICAgICBwYWdlIGhhcyB0aGUgZGVzaXJlZCBvYmplY3QuCi0JICogQHNlZSAjc2V0QWN0aXZlUGFnZQotCSAqLwotCXB1YmxpYyBJRm9ybVBhZ2Ugc2VsZWN0UmV2ZWFsKE9iamVjdCBwYWdlSW5wdXQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IHBhZ2UgPSBwYWdlcy5nZXQoaSk7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewotCQkJCUlGb3JtUGFnZSBmcGFnZSA9IChJRm9ybVBhZ2UpIHBhZ2U7Ci0JCQkJaWYgKGZwYWdlLnNlbGVjdFJldmVhbChwYWdlSW5wdXQpKQotCQkJCQlyZXR1cm4gZnBhZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhY3RpdmUgcGFnZSBpbnN0YW5jZSBpZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhZ2UgaW5kZXggaXMgbm90Ci0JICogLTEsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzLgotCSAqIAotCSAqIEByZXR1cm4gYWN0aXZlIHBhZ2UgaW5zdGFuY2UgaWYgc2VsZWN0ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICAgICAgICBwYWdlIGlzIGN1cnJlbnRseSBhY3RpdmUuCi0JICovCi0JcHVibGljIElGb3JtUGFnZSBnZXRBY3RpdmVQYWdlSW5zdGFuY2UoKSB7Ci0JCWludCBpbmRleCA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQlPYmplY3QgcGFnZSA9IHBhZ2VzLmdldChpbmRleCk7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIElGb3JtUGFnZSkKLQkJCQlyZXR1cm4gKElGb3JtUGFnZSkgcGFnZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE11bHRpUGFnZUVkaXRvclBhcnQjc2V0QWN0aXZlUGFnZShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWN0aXZlUGFnZShpbnQgcGFnZUluZGV4KSB7Ci0JCS8vIGZpeCBmb3Igd2luZG93IGhhbmRsZXMgcHJvYmxlbQotCQkvLyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHRoZSBlZGl0b3IgaXMgZmlyc3Qgb3BlbmVkCi0JCWlmIChwYWdlcy5zaXplKCkgPiBwYWdlSW5kZXgKLQkJCQkmJiBwYWdlcy5nZXQocGFnZUluZGV4KSBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewotCQkJcGFnZUNoYW5nZShwYWdlSW5kZXgpOwotCQkJSUZvcm1QYWdlIGFjdGl2ZVBhZ2UgPSAoSUZvcm1QYWdlKSBwYWdlcy5nZXQocGFnZUluZGV4KTsKLQkJCWFjdGl2ZVBhZ2Uuc2V0QWN0aXZlKHRydWUpOwotCQkJc3VwZXIuc2V0QWN0aXZlUGFnZShwYWdlSW5kZXgpOwotCQl9IGVsc2UKLQkJCXN1cGVyLnNldEFjdGl2ZVBhZ2UocGFnZUluZGV4KTsKLQkJdXBkYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IocGFnZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGFib3V0IHBhZ2UgY2hhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlSW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgbmV3IHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBY3Rpb25CYXJDb250cmlidXRvcihpbnQgcGFnZUluZGV4KSB7Ci0JCS8vIHRoaXMgaXMgdG8gZW5hYmxlIHRoZSB1bmRvL3JlZG8gYWN0aW9ucyBiZWZvcmUgYSBwYWdlIGNoYW5nZSBoYXMKLQkJLy8gb2NjdXJyZWQKLQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JCWlmIChjb250cmlidXRvciAhPSBudWxsCi0JCQkJJiYgY29udHJpYnV0b3IgaW5zdGFuY2VvZiBNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJKChNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgY29udHJpYnV0b3IpCi0JCQkJCS5zZXRBY3RpdmVQYWdlKGdldEVkaXRvcihwYWdlSW5kZXgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgZWRpdG9yIHByb2dyYW1tYXRpY2FsbHkuCi0JICogCi0JICogQHBhcmFtIHNhdmUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgY29udGVudCBzaG91bGQgYmUgc2F2ZWQgYmVmb3JlCi0JICogICAgICAgICAgICBjbG9zaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKGZpbmFsIGJvb2xlYW4gc2F2ZSkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodG9vbGtpdCAhPSBudWxsKSB7Ci0JCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoRm9ybUVkaXRvci50aGlzLCBzYXZlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWdpc3RlclBhZ2UoaW50IGluZGV4LCBPYmplY3QgcGFnZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKCFwYWdlcy5jb250YWlucyhwYWdlKSkgewotCQkJaWYgKGluZGV4ID09IC0xKQotCQkJCXBhZ2VzLmFkZChwYWdlKTsKLQkJCWVsc2UKLQkJCQlwYWdlcy5hZGQoaW5kZXgsIHBhZ2UpOwotCQl9Ci0JCWlmIChwYWdlIGluc3RhbmNlb2YgSUZvcm1QYWdlKSB7Ci0JCQlJRm9ybVBhZ2UgZnBhZ2UgPSAoSUZvcm1QYWdlKSBwYWdlOwotCQkJaWYgKGZwYWdlLmlzRWRpdG9yKCkgPT0gZmFsc2UpCi0JCQkJZnBhZ2UuaW5pdChnZXRFZGl0b3JTaXRlKCksIGdldEVkaXRvcklucHV0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVQYWdlQ2hhbmdlZChmaW5hbCBQYWdlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHBhZ2VMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBJUGFnZUNoYW5nZWRMaXN0ZW5lciBsID0gKElQYWdlQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0JCQlTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlsLnBhZ2VDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9lZGl0b3IvRm9ybVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2VkaXRvci9Gb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjk2MTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2VkaXRvci9Gb3JtUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci0vKioKLSAqIEEgYmFzZSBjbGFzcyB0aGF0IGFsbCBwYWdlcyB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byBGb3JtRWRpdG9yIG11c3Qgc3ViY2xhc3MuCi0gKiBGb3JtIHBhZ2UgaGFzIGFuIGluc3RhbmNlIG9mIFBhZ2VGb3JtIHRoYXQgZXh0ZW5kcyBtYW5hZ2VkIGZvcm0uIFN1YmNsYXNzZXMKLSAqIHNob3VsZCBvdmVycmlkZSBtZXRob2QgJ2NyZWF0ZUZvcm1Db250ZW50KE1hbmFnZWRGb3JtKScgdG8gZmlsbCB0aGUgZm9ybSB3aXRoCi0gKiBjb250ZW50LiBOb3RlIHRoYXQgcGFnZSBpdHNlbGYgY2FuIGJlIGxvYWRlZCBsYXppbHkgKG9uIGZpcnN0IG9wZW4pLgotICogQ29uc2VxdWVudGx5LCB0aGUgY2FsbCB0byBjcmVhdGUgdGhlIGZvcm0gY29udGVudCBjYW4gY29tZSBhZnRlciB0aGUgZWRpdG9yCi0gKiBoYXMgYmVlbiBvcGVuZWQgZm9yIGEgd2hpbGUgKGluIGZhY3QsIGl0IGlzIHBvc3NpYmxlIHRvIG9wZW4gYW5kIGNsb3NlIHRoZQotICogZWRpdG9yIGFuZCBuZXZlciBjcmVhdGUgdGhlIGZvcm0gYmVjYXVzZSBubyBhdHRlbXB0IGhhcyBiZWVuIG1hZGUgdG8gc2hvdyB0aGUKLSAqIHBhZ2UpLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtUGFnZSBleHRlbmRzIEVkaXRvclBhcnQgaW1wbGVtZW50cyBJRm9ybVBhZ2UgewotCXByaXZhdGUgRm9ybUVkaXRvciBlZGl0b3I7Ci0JcHJpdmF0ZSBQYWdlRm9ybSBtZm9ybTsKLQlwcml2YXRlIGludCBpbmRleDsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYWdlRm9ybSBleHRlbmRzIE1hbmFnZWRGb3JtIHsKLQkJcHVibGljIFBhZ2VGb3JtKEZvcm1QYWdlIHBhZ2UsIFNjcm9sbGVkRm9ybSBmb3JtKSB7Ci0JCQlzdXBlcihwYWdlLmdldEVkaXRvcigpLmdldFRvb2xraXQoKSwgZm9ybSk7Ci0JCQlzZXRDb250YWluZXIocGFnZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBGb3JtUGFnZSBnZXRQYWdlKCkgewotCQkJcmV0dXJuIChGb3JtUGFnZSlnZXRDb250YWluZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkaXJ0eVN0YXRlQ2hhbmdlZCgpIHsKLQkJCWdldFBhZ2UoKS5nZXRFZGl0b3IoKS5lZGl0b3JEaXJ0eVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YWxlU3RhdGVDaGFuZ2VkKCkgewotCQkJaWYgKGdldFBhZ2UoKS5pc0FjdGl2ZSgpKQotCQkJCXJlZnJlc2goKTsKLQkJfQotCX0KLQkvKioKLQkgKiBBIGNvbnN0cnVjdG9yIHRoYXQgY3JlYXRlcyB0aGUgcGFnZSBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCB0aGUgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgZWRpdG9yCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICB0aGUgdW5pcXVlIGlkZW50aWZpZXIKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIHRpdGxlCi0JICovCi0JcHVibGljIEZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgewotCQl0aGlzKGlkLCB0aXRsZSk7Ci0JCWluaXRpYWxpemUoZWRpdG9yKTsKLQl9Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLiBUaGUgcGFyZW50IGVkaXRvciBuZWVkIHRvIGJlIHBhc3NlZCBpbiB0aGUKLQkgKiA8Y29kZT5pbml0aWFsaXplPC9jb2RlPiBtZXRob2QgaWYgdGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgYSB1bmlxdWUgcGFnZSBpZGVudGlmaWVyCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBhIHVzZXItZnJpZW5kbHkgcGFnZSB0aXRsZQotCSAqLwotCXB1YmxpYyBGb3JtUGFnZShTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXNldFBhcnROYW1lKHRpdGxlKTsKLQl9Ci0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAc2VlIElFZGl0b3JQYXJ0I2luaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0JfQotCS8qKgotCSAqIFByaW1lcyB0aGUgZm9ybSBwYWdlIHdpdGggdGhlIHBhcmVudCBlZGl0b3IgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGVkaXRvcgotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXRoaXMuZWRpdG9yID0gZWRpdG9yOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gcGFyZW50IGVkaXRvciBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBGb3JtRWRpdG9yIGdldEVkaXRvcigpIHsKLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFuYWdlZCBmb3JtIG93bmVkIGJ5IHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYW5hZ2VkIGZvcm0KLQkgKi8KLQlwdWJsaWMgSU1hbmFnZWRGb3JtIGdldE1hbmFnZWRGb3JtKCkgewotCQlyZXR1cm4gbWZvcm07Ci0JfQotCS8qKgotCSAqIEltcGxlbWVudHMgdGhlIHJlcXVpcmVkIG1ldGhvZCBieSByZWZyZXNoaW5nIHRoZSBmb3JtIHdoZW4gc2V0IGFjdGl2ZS4KLQkgKiBTdWJjbGFzc2VzIG11c3QgY2FsbCBzdXBlciB3aGVuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7Ci0JCWlmIChhY3RpdmUpIHsKLQkJCS8vIFdlIGFyZSBzd2l0Y2hpbmcgdG8gdGhpcyBwYWdlIC0gcmVmcmVzaCBpdAotCQkJLy8gaWYgbmVlZGVkLgotCQkJbWZvcm0ucmVmcmVzaCgpOwotCQl9Ci0JfQotCS8qKgotCSAqIFRlc3RzIGlmIHRoZSBwYWdlIGlzIGFjdGl2ZSBieSBhc2tpbmcgdGhlIHBhcmVudCBlZGl0b3IgaWYgdGhpcyBwYWdlIGlzCi0JICogdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYWdlIGlzIGN1cnJlbnRseSBhY3RpdmUsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5lcXVhbHMoZWRpdG9yLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpKTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGFydCBjb250cm9sIGJ5IGNyZWF0aW5nIHRoZSBtYW5hZ2VkIGZvcm0gdXNpbmcgdGhlIHBhcmVudAotCSAqIGVkaXRvcidzIHRvb2xraXQuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCi0JICogPGNvZGU+Y3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKTwvY29kZT4gdG8gcG9wdWxhdGUgdGhlIGZvcm0gd2l0aAotCSAqIGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhZ2UgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU2Nyb2xsZWRGb3JtIGZvcm0gPSBlZGl0b3IuZ2V0VG9vbGtpdCgpLmNyZWF0ZVNjcm9sbGVkRm9ybShwYXJlbnQpOwotCQltZm9ybSA9IG5ldyBQYWdlRm9ybSh0aGlzLCBmb3JtKTsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUocGFyZW50LmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWNyZWF0ZUZvcm1Db250ZW50KG1mb3JtKTsKLQkJCX0KLQkJfSk7Ci0JfQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBjb250ZW50IGluIHRoZSBmb3JtCi0JICogaG9zdGVkIGluIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuYWdlZEZvcm0KLQkgKiAgICAgICAgICAgIHRoZSBmb3JtIGhvc3RlZCBpbiB0aGlzIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZvcm0gcGFnZSBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gbWFuYWdlZCBmb3JtJ3MgY29udHJvbAotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldFBhcnRDb250cm9sKCkgewotCQlyZXR1cm4gbWZvcm0gIT0gbnVsbCA/IG1mb3JtLmdldEZvcm0oKSA6IG51bGw7Ci0JfQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBtYW5hZ2VkIGZvcm0uCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKG1mb3JtICE9IG51bGwpCi0JCQltZm9ybS5kaXNwb3NlKCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB1bmlxdWUgcGFnZSBpZGVudGlmaWVyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LSBmb3JtIHBhZ2UgaGFzIG5vIHRpdGxlIGltYWdlLiBTdWJjbGFzc2VzCi0JICogbWF5IG92ZXJyaWRlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0VGl0bGVJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGZvY3VzIGJ5IGRlbGVnYXRpbmcgdG8gdGhlIG1hbmFnZWQgZm9ybS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKG1mb3JtICE9IG51bGwpCi0JCQltZm9ybS5zZXRGb2N1cygpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1mb3JtICE9IG51bGwpCi0JCQltZm9ybS5jb21taXQodHJ1ZSk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBJbXBsZW1lbnRlZCBieSB0ZXN0aW5nIGlmIHRoZSBtYW5hZ2VkIGZvcm0gaXMgZGlydHkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFuYWdlZCBmb3JtIGlzIGRpcnR5LAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIG1mb3JtICE9IG51bGwgPyBtZm9ybS5pc0RpcnR5KCkgOiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogUHJlc2VydmVzIHRoZSBwYWdlIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGFzc2lnbmVkIHBhZ2UgaW5kZXgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzYXZlZCBwYWdlIGluZGV4LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhZ2UgaW5kZXgKLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCS8qKgotCSAqIEZvcm0gcGFnZXMgYXJlIG5vdCBlZGl0b3JzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZGl0b3IoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQXR0ZW1wdHMgdG8gc2VsZWN0IGFuZCByZXZlYWwgdGhlIGdpdmVuIG9iamVjdCBieSBwYXNzaW5nIHRoZSByZXF1ZXN0IHRvCi0JICogdGhlIG1hbmFnZWQgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNlbGVjdCBhbmQgcmV2ZWFsIGluIHRoZSBwYWdlIGlmIHBvc3NpYmxlLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhZ2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNlbGVjdGVkCi0JICogICAgICAgICBhbmQgcmV2ZWFsZWQgYnkgb25lIG9mIHRoZSBtYW5hZ2VkIGZvcm0gcGFydHMsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNlbGVjdFJldmVhbChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtZm9ybSAhPSBudWxsKQotCQkJcmV0dXJuIG1mb3JtLnNldElucHV0KG9iamVjdCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQnkgZGVmYXVsdCwgZWRpdG9yIHdpbGwgYmUgYWxsb3dlZCB0byBmbGlwIHRoZSBwYWdlLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5MZWF2ZVRoZVBhZ2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2VkaXRvci9JRm9ybVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2VkaXRvci9JRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4NDY0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9lZGl0b3IvSUZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLS8qKgotICogSW50ZXJmYWNlIHRoYXQgYWxsIEdVSSBwYWdlcyBuZWVkIHRvIGltcGxlbWVudCBpbiBvcmRlcgotICogdG8gYmUgYWRkZWQgdG8gRm9ybUVkaXRvciBwYXJ0LiBUaGUgaW50ZXJmYWNlIG1ha2VzIAotICogc2V2ZXJhbCBhc3N1bXB0aW9uczoKLSAqIDx1bD4KLSAqIDxsaT5UaGUgZm9ybSBwYWdlIGhhcyBhIG1hbmFnZWQgZm9ybTwvbGk+Ci0gKiA8bGk+VGhlIGZvcm0gcGFnZSBoYXMgYSB1bmlxdWUgaWQ8L2xpPgotICogPGxpPlRoZSBmb3JtIHBhZ2UgY2FuIGJlIEdVSSBidXQgY2FuIGFsc28gd3JhcCBhIGNvbXBsZXRlCi0gKiBlZGl0b3IgY2xhc3MgKGluIHRoYXQgY2FzZSwgaXQgc2hvdWxkIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotICogZnJvbSA8Y29kZT5pc0VkaXRvcigpPC9jb2RlPiBtZXRob2QpLjwvbGk+Ci0gKiA8bGk+VGhlIGZvcm0gcGFnZSBpcyBsYXp5IGkuZS4gdW5kZXJzdGFuZHMgdGhhdCAKLSAqIGl0cyBwYXJ0IGNvbnRyb2wgd2lsbCBiZSBjcmVhdGVkIGF0IHRoZSBsYXN0IHBvc3NpYmxlCi0gKiBtb21lbnQuPC9saT4uCi0gKiA8L3VsPgotICogPHA+RXhpc3RpbmcgZWRpdG9ycyBjYW4gYmUgd3JhcHBlZCBieSBpbXBsZW1lbnRpbmcKLSAqIHRoaXMgaW50ZXJmYWNlLiBJbiB0aGlzIGNhc2UsICdpc0VkaXRvcicgc2hvdWxkIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLSAqIEEgY29tbW9uIGVkaXRvciB0byB3cmFwIGluIDxjb2RlPlRleHRFZGl0b3I8L2NvZGU+IHRoYXQgaXMKLSAqIG9mdGVuIGFkZGVkIHRvIHNob3cgdGhlIHJhdyBzb3VyY2UgY29kZSBvZiB0aGUgZmlsZSBvcGVuIGludG8KLSAqIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGb3JtUGFnZSBleHRlbmRzIElFZGl0b3JQYXJ0IHsKLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogICAgICAgICAgICB0aGUgZm9ybSBlZGl0b3IgdGhhdCB0aGlzIHBhZ2UgYmVsb25ncyB0bwotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZShGb3JtRWRpdG9yIGVkaXRvcik7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdG9yIHRoaXMgcGFnZSBiZWxvbmdzIHRvLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvcm0gZWRpdG9yCi0JICovCi0JRm9ybUVkaXRvciBnZXRFZGl0b3IoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYW5hZ2VkIGZvcm0gb2YgdGhpcyBwYWdlLCB1bmxlc3MgdGhpcyBpcyBhIHNvdXJjZSBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1hbmFnZWQgZm9ybSBvciA8c2FtcD5udWxsIDwvc2FtcD4gaWYgdGhpcyBpcyBhIHNvdXJjZSBwYWdlLgotCSAqLwotCUlNYW5hZ2VkRm9ybSBnZXRNYW5hZ2VkRm9ybSgpOwotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwYWdlIGhhcyBiZWNvbWUgdGhlIGFjdGl2ZSBpbiB0aGUgZWRpdG9yLiBDbGFzc2VzCi0JICogdGhhdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgbWF5IHVzZSB0aGlzIG1ldGhvZCB0byBjb21taXQgdGhlIHBhZ2UgKG9uCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+KSBvciBsYXppbHkgY3JlYXRlIGFuZC9vciBwb3B1bGF0ZSB0aGUgY29udGVudCBvbgotCSAqIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBhY3RpdmUKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBhZ2Ugc2hvdWxkIGJlIHZpc2libGUsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKTsKLQkvKioKLQkgKiBSZXR1cm5zIDxzYW1wPnRydWUgPC9zYW1wPiBpZiBwYWdlIGlzIGN1cnJlbnRseSBhY3RpdmUsIGZhbHNlIGlmIG5vdC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxzYW1wPnRydWUgPC9zYW1wPiBmb3IgYWN0aXZlIHBhZ2UuCi0JICovCi0JYm9vbGVhbiBpc0FjdGl2ZSgpOwotCS8qKgotCSAqIFRlc3RzIGlmIHRoZSBjb250ZW50IG9mIHRoZSBwYWdlIGlzIGluIGEgc3RhdGUgdGhhdCBhbGxvd3MgdGhlCi0JICogZWRpdG9yIHRvIGZsaXAgdG8gYW5vdGhlciBwYWdlLiBUeXBpY2FsbHksIHBhZ2VzIHRoYXQgY29udGFpbgotCSAqIHJhdyBzb3VyY2Ugd2l0aCBzeW50YXggZXJyb3JzIHNob3VsZCBub3QgYWxsb3cgZWRpdG9ycyB0byAKLQkgKiBsZWF2ZSB0aGVtIHVudGlsIGVycm9ycyBhcmUgY29ycmVjdGVkLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGVkaXRvciBjYW4gZmxpcCB0byBhbm90aGVyIHBhZ2UsCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIGNhbkxlYXZlVGhlUGFnZSgpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRyb2wgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250cm9sIG9mIHRoaXMgcGFnZSBpZiBjcmVhdGVkIG9yIDxzYW1wPm51bGwgPC9zYW1wPiBpZiB0aGUKLQkgKiAgICAgICAgIHBhZ2UgaGFzIG5vdCBiZWVuIHNob3duIHlldC4KLQkgKi8KLQlDb250cm9sIGdldFBhcnRDb250cm9sKCk7Ci0JLyoqCi0JICogUGFnZSBtdXN0IGhhdmUgYSB1bmlxdWUgaWQgdGhhdCBjYW4gYmUgdXNlZCB0byBzaG93IGl0IHdpdGhvdXQga25vd2luZwotCSAqIGl0cyByZWxhdGl2ZSBwb3NpdGlvbiBpbiB0aGUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVuaXF1ZSBwYWdlIGlkZW50aWZpZXIKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSBpbiB0aGUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHBhZ2UgaW4gdGhlIGVkaXRvci4KLQkgKi8KLQlpbnQgZ2V0SW5kZXgoKTsKLQkvKioKLQkgKiBTZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSBpbiB0aGUgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHBhZ2UgaW4gdGhlIGVkaXRvci4KLQkgKi8KLQl2b2lkIHNldEluZGV4KGludCBpbmRleCk7Ci0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGlzIHBhZ2Ugd3JhcHMgYSBjb21wbGV0ZSBlZGl0b3IgdGhhdAotCSAqIGNhbiBiZSByZWdpc3RlcmVkIG9uIGl0cyBvd24sIG9yIHJlcHJlc2VudHMgYSBwYWdlCi0JICogdGhhdCBjYW5ub3QgZXhpc3Qgb3V0c2lkZSB0aGUgbXVsdGktcGFnZSBlZGl0b3IgY29udGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxzYW1wPnRydWUgPC9zYW1wPiBpZiB0aGUgcGFnZSB3cmFwcyBhbiBlZGl0b3IsCi0JICogICAgICAgICA8c2FtcD5mYWxzZSA8L3NhbXA+IGlmIHRoaXMgaXMgYSBmb3JtIHBhZ2UuCi0JICovCi0JYm9vbGVhbiBpc0VkaXRvcigpOwotCS8qKgotCSAqIEEgaGludCB0byBicmluZyB0aGUgcHJvdmlkZWQgb2JqZWN0IGludG8gZm9jdXMuIElmIHRoZSBvYmplY3QgaXMgaW4gYQotCSAqIHRyZWUgb3IgdGFibGUgY29udHJvbCwgc2VsZWN0IGl0LiBJZiBpdCBpcyBzaG93biBvbiBhIHNjcm9sbGFibGUgcGFnZSwKLQkgKiBlbnN1cmUgdGhhdCBpdCBpcyB2aXNpYmxlLiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBwcmVzZW50ZWQgaW4gCi0JICogdGhlIHBhZ2UsIDxjb2RlPmZhbHNlPC9jb2RlPiBzaG91bGQgYmUgcmV0dXJuZWQgdG8gYWxsb3cgYW5vdGhlcgotCSAqIHBhZ2UgdG8gdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCB0byBzZWxlY3QgYW5kIHJldmVhbAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCWJvb2xlYW4gc2VsZWN0UmV2ZWFsKE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZWRpdG9yL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2VkaXRvci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjQzYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZWRpdG9yL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1TdXBwb3J0IGZvciBmb3Jtcy1iYXNlZCBtdWx0aS1wYWdlIGVkaXRvcnMuCi08YnI+Jm5ic3A7Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9ldmVudHMvRXhwYW5zaW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXZlbnRzL0V4cGFuc2lvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JlMDdjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9ldmVudHMvRXhwYW5zaW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50czsKLS8qKgotICogVGhpcyBhZGFwdGVyIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgbWV0aG9kcwotICogZGVzY3JpYmVkIGJ5IHRoZSA8Y29kZT5FeHBhbnNpb25MaXN0ZW5lcjwvY29kZT4gaW50ZXJmYWNlLgotICogPHA+Ci0gKiBDbGFzc2VzIHRoYXQgd2lzaCB0byBkZWFsIHdpdGggPGNvZGU+RXhwYW5zaW9uRXZlbnQ8L2NvZGU+cyBjYW4gZXh0ZW5kCi0gKiB0aGlzIGNsYXNzIGFuZCBvdmVycmlkZSBvbmx5IHRoZSBtZXRob2RzIHdoaWNoIHRoZXkgYXJlIGludGVyZXN0ZWQgaW4uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgSUV4cGFuc2lvbkxpc3RlbmVyCi0gKiBAc2VlIEV4cGFuc2lvbkV2ZW50Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBhbnNpb25BZGFwdGVyIGltcGxlbWVudHMgSUV4cGFuc2lvbkxpc3RlbmVyIHsKLQkvKioKLQkgKiBTZW50IHdoZW4gdGhlIGxpbmsgaXMgZW50ZXJlZC4gVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGRvIG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdpbmcoRXhwYW5zaW9uRXZlbnQgZSkgewotCX0KLQkvKioKLQkgKiBTZW50IHdoZW4gdGhlIGxpbmsgaXMgZXhpdGVkLiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgZXhwYW5zaW9uU3RhdGVDaGFuZ2VkKEV4cGFuc2lvbkV2ZW50IGUpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9ldmVudHMvRXhwYW5zaW9uRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V2ZW50cy9FeHBhbnNpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzI0NjI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V2ZW50cy9FeHBhbnNpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlR5cGVkRXZlbnQ7Ci0vKioKLSAqIE5vdGlmaWVzIGxpc3RlbmVycyB3aGVuIGV4cGFuZGFibGUgY29udHJvbHMgY2hhbmdlIGV4cGFuc2lvbiBzdGF0ZS4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXhwYW5zaW9uRXZlbnQgZXh0ZW5kcyBUeXBlZEV2ZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MDA5MzM1MDc0NzI3NDE3NDQ1TDsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGV4cGFuc2lvbiBlY2VudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBldmVudCBzb3VyY2UKLQkgKiBAcGFyYW0gc3RhdGUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgZXhwYW5zaW9uIHN0YXRlCi0JICovCi0JcHVibGljIEV4cGFuc2lvbkV2ZW50KE9iamVjdCBvYmosIGJvb2xlYW4gc3RhdGUpIHsKLQkJc3VwZXIob2JqKTsKLQkJZGF0YSA9IHN0YXRlID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV3IGV4cGFuc2lvbiBzdGF0ZSBvZiB0aGUgd2lkZ2V0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHdpZGdldCBpcyBub3cgZXhwYW5lZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3RhdGUoKSB7Ci0JCXJldHVybiBkYXRhLmVxdWFscyhCb29sZWFuLlRSVUUpID8gdHJ1ZSA6IGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V2ZW50cy9IeXBlcmxpbmtBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9ldmVudHMvSHlwZXJsaW5rQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWVjOTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V2ZW50cy9IeXBlcmxpbmtBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzOwotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgY2xhc3MgcHJvdmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBtZXRob2RzCi0gKiBkZXNjcmliZWQgYnkgdGhlIDxjb2RlPkh5cGVybGlua0xpc3RlbmVyPC9jb2RlPiBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIENsYXNzZXMgdGhhdCB3aXNoIHRvIGRlYWwgd2l0aCA8Y29kZT5IeXBlcmxpbmtFdmVudDwvY29kZT4gcyBjYW4gZXh0ZW5kCi0gKiB0aGlzIGNsYXNzIGFuZCBvdmVycmlkZSBvbmx5IHRoZSBtZXRob2RzIHdoaWNoIHRoZXkgYXJlIGludGVyZXN0ZWQgaW4uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgSUh5cGVybGlua0xpc3RlbmVyCi0gKiBAc2VlIEh5cGVybGlua0V2ZW50Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIeXBlcmxpbmtBZGFwdGVyIGltcGxlbWVudHMgSUh5cGVybGlua0xpc3RlbmVyIHsKLQkvKioKLQkgKiBTZW50IHdoZW4gdGhlIGxpbmsgaXMgZW50ZXJlZC4gVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGRvIG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQl9Ci0JLyoqCi0JICogU2VudCB3aGVuIHRoZSBsaW5rIGlzIGV4aXRlZC4gVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGRvIG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCX0KLQkvKioKLQkgKiBTZW50IHdoZW4gdGhlIGxpbmsgaXMgYWN0aXZhdGVkLiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXZlbnRzL0h5cGVybGlua0V2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9ldmVudHMvSHlwZXJsaW5rRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3NGE3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9ldmVudHMvSHlwZXJsaW5rRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UeXBlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLS8qKgotICogTm90aWZpZXMgbGlzdGVuZXJzIGFib3V0IGEgaHlwZXJsaW5rIGNoYW5nZS4KLSAqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBIeXBlcmxpbmtFdmVudCBleHRlbmRzIFR5cGVkRXZlbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYwMDkzMzUwNzQ3Mjc0MTc0NDVMOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgaW50IHN0YXRlTWFzazsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGh5cGVybGluawotCSAqIAotCSAqIEBwYXJhbSB3aWRnZXQKLQkgKiAgICAgICAgICAgIGV2ZW50IHNvdXJjZQotCSAqIEBwYXJhbSBocmVmCi0JICogICAgICAgICAgICB0aGUgaHlwZXJsaW5rIHJlZmVyZW5jZSB0aGF0IHdpbGwgYmUgZm9sbG93ZWQgdXBvbiB3aGVuIHRoZQotCSAqICAgICAgICAgICAgaHlwZXJsaW5rIGlzIGFjdGl2YXRlZC4KLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBoeXBlcmxpbmsgKHRoZSB0ZXh0IHRoYXQgaXMgcmVuZGVyZWQgYXMgYQotCSAqICAgICAgICAgICAgbGluayBpbiB0aGUgc291cmNlIHdpZGdldCkuCi0JICogQHBhcmFtIHN0YXRlTWFzawotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHN0YXRlIG1hc2sKLQkgKi8KLQlwdWJsaWMgSHlwZXJsaW5rRXZlbnQoV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGhyZWYsIFN0cmluZyBsYWJlbCwgaW50IHN0YXRlTWFzaykgewotCQlzdXBlcih3aWRnZXQpOwotCQl0aGlzLndpZGdldCA9IHdpZGdldDsKLQkJdGhpcy5kYXRhID0gaHJlZjsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLnN0YXRlTWFzayA9IHN0YXRlTWFzazsKLQl9Ci0JLyoqCi0JICogVGhlIGh5cGVybGluayByZWZlcmVuY2UgdGhhdCB3aWxsIGJlIGZvbGxvd2VkIHdoZW4gdGhlIGh5cGVybGluayBpcwotCSAqIGFjdGl2YXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBoeXBlcmxpbmsgcmVmZXJlbmNlIG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SHJlZigpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YTsKLQl9Ci0JLyoqCi0JICogVGhlIHRleHQgb2YgdGhlIGh5cGVybGluayByZW5kZXJlZCBpbiB0aGUgc291cmNlIHdpZGdldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBoeXBlcmxpbmsgbGFiZWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBrZXlib2FyZCBzdGF0ZSBtYXNrIHByZXNlbnQgd2hlbgotCSAqIHRoZSBldmVudCBvY2N1cmVkLCBvciBTV1QuTlVMTCBmb3Igbm8gbW9kaWZpZXJzLgotCSAqIEByZXR1cm4gdGhlIGtleWJvYXJkIHN0YXRlIG1hc2sgb3IgPGNvZGU+U1dULk5VTEw8L2NvZGU+LiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXRlTWFzaygpIHsKLQkJcmV0dXJuIHN0YXRlTWFzazsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9ldmVudHMvSUV4cGFuc2lvbkxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9ldmVudHMvSUV4cGFuc2lvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YWNhOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXZlbnRzL0lFeHBhbnNpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50czsKLS8qKgotICogQ2xhc3NlcyB0aGF0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB3aWxsIGJlIG5vdGlmaWVkIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlCi0gKiBleHBhbmRhYmxlIGNvbnRyb2wncyBleHBhbnNpb24gc3RhdGUgY2hhbmdlcy4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeHBhbnNpb25MaXN0ZW5lciB7Ci0JLyoqCi0JICogTm90aWZpZXMgdGhlIGxpc3RlbmVyIHRoYXQgdGhlIGV4cGFuZGFibGUgY29udHJvbCBpcyBhYm91dCB0byBjaGFuZ2UgaXRzCi0JICogZXhwYW5zaW9uIHN0YXRlLiBUaGUgc3RhdGUgcHJvdmlkZWQgYnkgdGhlIGV2ZW50IGlzIHRoZSBuZXcgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBleHBhbnNpb24gZXZlbnQKLQkgKi8KLQl2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdpbmcoRXhwYW5zaW9uRXZlbnQgZSk7Ci0JLyoqCi0JICogTm90aWZpZXMgdGhlIGxpc3RlbmVyIGFmdGVyIHRoZSBleHBhbmRhYmxlIGNvbnRyb2wgaGFzIGNoYW5nZWQgaXRzCi0JICogZXhwYW5zaW9uIHN0YXRlLiBUaGUgc3RhdGUgcHJvdmlkZWQgYnkgdGhlIGV2ZW50IGlzIHRoZSBuZXcgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBleHBhbnNpb24gZXZlbnQKLQkgKi8KLQl2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdlZChFeHBhbnNpb25FdmVudCBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V2ZW50cy9JSHlwZXJsaW5rTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V2ZW50cy9JSHlwZXJsaW5rTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkZTM5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9ldmVudHMvSUh5cGVybGlua0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzOwotLyoqCi0gKiBDbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBoeXBlcmxpbmtzIGFyZQotICogZW50ZXJlZCwgZXhpdGVkIGFuZCBhY3RpdmF0ZWQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbmsKLSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluawotICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1UZXh0Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUh5cGVybGlua0xpc3RlbmVyIHsKLQkvKioKLQkgKiBTZW50IHdoZW4gaHlwZXJsaW5rIGlzIGVudGVyZWQgZWl0aGVyIGJ5IG1vdXNlIGVudGVyaW5nIHRoZSBsaW5rIGNsaWVudAotCSAqIGFyZWEsIG9yIGtleWJvYXJkIGZvY3VzIHN3aXRjaGluZyB0byB0aGUgaHlwZXJsaW5rLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBoeXBlcmxpbmsKLQkgKi8KLQl2b2lkIGxpbmtFbnRlcmVkKEh5cGVybGlua0V2ZW50IGUpOwotCS8qKgotCSAqIFNlbnQgd2hlbiBoeXBlcmxpbmsgaXMgZXhpdGVkIGVpdGhlciBieSBtb3VzZSBleGl0aW5nIHRoZSBsaW5rIGNsaWVudAotCSAqIGFyZWEsIG9yIGtleWJvYXJkIGZvY3VzIHN3aXRjaGluZyBmcm9tIHRoZSBoeXBlcmxpbmsuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGh5cGVybGluawotCSAqLwotCXZvaWQgbGlua0V4aXRlZChIeXBlcmxpbmtFdmVudCBlKTsKLQkvKioKLQkgKiBTZW50IHdoZW4gaHlwZXJsaW5rIGlzIGFjdGl2YXRlZCBlaXRoZXIgYnkgbW91c2UgY2xpY2sgaW5zaWRlIHRoZSBsaW5rCi0JICogY2xpZW50IGFyZWEsIG9yIGJ5IHByZXNzaW5nICdFbnRlcicga2V5IHdoaWxlIGh5cGVybGluayBoYXMga2V5Ym9hcmQKLQkgKiBmb2N1cy4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaHlwZXJsaW5rCi0JICovCi0Jdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXZlbnRzL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V2ZW50cy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZmIwNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXZlbnRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1FdmVudHMgYW5kIGxpc3RlbmVycyBmb3IgZm9ybXMtYmFzZWQgcGFydHMuCi08YnI+Jm5ic3A7Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOGM1ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLUZvcm1zLWJhc2VkIGNvbnRyb2xzIGZvciB1c2UgaW4gdmlld3MsIGVkaXRvcnMsIGFuZCB3aXphcmRzLgotPGJyPiZuYnNwOwotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9BYnN0cmFjdEh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9BYnN0cmFjdEh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjkwNjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvQWJzdHJhY3RIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLklIeXBlcmxpbmtMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzLkZvcm1zUmVzb3VyY2VzOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGN1c3RvbSBoeXBlcmxpbmsgd2lkZ2V0LiBJdCBpcyByZXNwb25zaWJsZSBmb3IKLSAqIHByb2Nlc3NpbmcgbW91c2UgYW5kIGtleWJvYXJkIGV2ZW50cywgYW5kIGNvbnZlcnRpbmcgdGhlbSBpbnRvIHVuaWZpZWQKLSAqIGh5cGVybGluayBldmVudHMuIFN1YmNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvciByZW5kZXJpbmcgdGhlIGh5cGVybGluayBpbgotICogdGhlIGNsaWVudCBhcmVhLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEh5cGVybGluayBleHRlbmRzIENhbnZhcyB7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0ZvY3VzOwotCi0JcHJpdmF0ZSBWZWN0b3IgbGlzdGVuZXJzOwotCi0JLyoqCi0JICogQW1vdW50IG9mIHRoZSBtYXJnaW4gd2lkdGggYXJvdW5kIHRoZSBoeXBlcmxpbmsgKGRlZmF1bHQgaXMgMSkuCi0JICovCi0JcHJvdGVjdGVkIGludCBtYXJnaW5XaWR0aCA9IDE7Ci0KLQkvKioKLQkgKiBBbW91bnQgb2YgdGhlIG1hcmdpbiBoZWlnaHQgYXJvdW5kIHRoZSBoeXBlcmxpbmsgKGRlZmF1bHQgaXMgMSkuCi0JICovCi0JcHJvdGVjdGVkIGludCBtYXJnaW5IZWlnaHQgPSAxOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBoeXBlcmxpbmsgaW4gdGhlIHByb3ZpZGVkIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgY29udHJvbCBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSB3aWRnZXQgc3R5bGUKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RIeXBlcmxpbmsoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlhZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChlLmNoYXJhY3RlciA9PSAnXHInKSB7Ci0JCQkJCWhhbmRsZUFjdGl2YXRlKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJcGFpbnQoZSk7Ci0JCQl9Ci0JCX0pOwotCQlhZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfUEFHRV9ORVhUOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfUFJFVklPVVM6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVDoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9BUlJPV19QUkVWSU9VUzoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzd2l0Y2ggKGUudHlwZSkgewotCQkJCWNhc2UgU1dULkZvY3VzSW46Ci0JCQkJCWhhc0ZvY3VzID0gdHJ1ZTsKLQkJCQkJaGFuZGxlRW50ZXIoZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULkZvY3VzT3V0OgotCQkJCQloYXNGb2N1cyA9IGZhbHNlOwotCQkJCQloYW5kbGVFeGl0KGUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5EZWZhdWx0U2VsZWN0aW9uOgotCQkJCQloYW5kbGVBY3RpdmF0ZShlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VFbnRlcjoKLQkJCQkJaGFuZGxlRW50ZXIoZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlRXhpdDoKLQkJCQkJaGFuZGxlRXhpdChlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VVcDoKLQkJCQkJaGFuZGxlTW91c2VVcChlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRMaXN0ZW5lcihTV1QuTW91c2VFbnRlciwgbGlzdGVuZXIpOwotCQlhZGRMaXN0ZW5lcihTV1QuTW91c2VFeGl0LCBsaXN0ZW5lcik7Ci0JCWFkZExpc3RlbmVyKFNXVC5Nb3VzZVVwLCBsaXN0ZW5lcik7Ci0JCWFkZExpc3RlbmVyKFNXVC5Gb2N1c0luLCBsaXN0ZW5lcik7Ci0JCWFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgbGlzdGVuZXIpOwotCQlzZXRDdXJzb3IoRm9ybXNSZXNvdXJjZXMuZ2V0SGFuZEN1cnNvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBldmVudCBsaXN0ZW5lciB0byB0aGlzIGh5cGVybGluay4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCBsaXN0ZW5lciB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRIeXBlcmxpbmtMaXN0ZW5lcihJSHlwZXJsaW5rTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQotCQkJbGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgaHlwZXJsaW5rLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIHJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUh5cGVybGlua0xpc3RlbmVyKElIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGUgY29udHJvbC4gV2hlbiBmb2N1cyBpcyBnYWluZWQsIHRoZQotCSAqIHN0YXRlIHdpbGwgYmUgPHNhbXA+dHJ1ZSA8L3NhbXA+OyBpdCB3aWxsIHN3aXRjaCB0byA8c2FtcD5mYWxzZSA8L3NhbXA+Ci0JICogd2hlbiB0aGUgY29udHJvbCBsb29zZXMgZm9jdXMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgd2lkZ2V0IGhhcyBmb2N1cywgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gaGFzRm9jdXM7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gaHlwZXJsaW5rIGlzIGVudGVyZWQuIFN1YmNsYXNzZXMgdGhhdCBvdmVycmlkZSB0aGlzIG1ldGhvZAotCSAqIG11c3QgY2FsbCAnc3VwZXInLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVudGVyKEV2ZW50IGUpIHsKLQkJcmVkcmF3KCk7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IHNpemUgPSBsaXN0ZW5lcnMuc2l6ZSgpOwotCQlIeXBlcmxpbmtFdmVudCBoZSA9IG5ldyBIeXBlcmxpbmtFdmVudCh0aGlzLCBnZXRIcmVmKCksIGdldFRleHQoKSwKLQkJCQllLnN0YXRlTWFzayk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJSHlwZXJsaW5rTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUh5cGVybGlua0xpc3RlbmVyKSBsaXN0ZW5lcnMuZ2V0KGkpOwotCQkJbGlzdGVuZXIubGlua0VudGVyZWQoaGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gaHlwZXJsaW5rIGlzIGV4aXRlZC4gU3ViY2xhc3NlcyB0aGF0IG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0JICogbXVzdCBjYWxsICdzdXBlcicuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhpdChFdmVudCBlKSB7Ci0JCXJlZHJhdygpOwotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBzaXplID0gbGlzdGVuZXJzLnNpemUoKTsKLQkJSHlwZXJsaW5rRXZlbnQgaGUgPSBuZXcgSHlwZXJsaW5rRXZlbnQodGhpcywgZ2V0SHJlZigpLCBnZXRUZXh0KCksCi0JCQkJZS5zdGF0ZU1hc2spOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSUh5cGVybGlua0xpc3RlbmVyIGxpc3RlbmVyID0gKElIeXBlcmxpbmtMaXN0ZW5lcikgbGlzdGVuZXJzLmdldChpKTsKLQkJCWxpc3RlbmVyLmxpbmtFeGl0ZWQoaGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gaHlwZXJsaW5rIGhhcyBiZWVuIGFjdGl2YXRlZC4gU3ViY2xhc3NlcyB0aGF0IG92ZXJyaWRlIHRoaXMKLQkgKiBtZXRob2QgbXVzdCBjYWxsICdzdXBlcicuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoRXZlbnQgZSkgewotCQlnZXRBY2Nlc3NpYmxlKCkuc2V0Rm9jdXMoQUNDLkNISUxESURfU0VMRik7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IHNpemUgPSBsaXN0ZW5lcnMuc2l6ZSgpOwotCQlzZXRDdXJzb3IoRm9ybXNSZXNvdXJjZXMuZ2V0QnVzeUN1cnNvcigpKTsKLQkJSHlwZXJsaW5rRXZlbnQgaGUgPSBuZXcgSHlwZXJsaW5rRXZlbnQodGhpcywgZ2V0SHJlZigpLCBnZXRUZXh0KCksCi0JCQkJZS5zdGF0ZU1hc2spOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSUh5cGVybGlua0xpc3RlbmVyIGxpc3RlbmVyID0gKElIeXBlcmxpbmtMaXN0ZW5lcikgbGlzdGVuZXJzLmdldChpKTsKLQkJCWxpc3RlbmVyLmxpbmtBY3RpdmF0ZWQoaGUpOwotCQl9Ci0JCWlmICghaXNEaXNwb3NlZCgpKQotCQkJc2V0Q3Vyc29yKEZvcm1zUmVzb3VyY2VzLmdldEhhbmRDdXJzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGh5cGVybGluay4gQ29uY3JldGUgaW1wbGVtZW50YXRpb24KLQkgKiBvZiB0aGlzIGNsYXNzIGNhbiB1c2UgaWYgdG8gc3RvcmUgdGV4dCwgVVJMcyBvciBtb2RlbCBvYmplY3RzIHRoYXQgbmVlZAotCSAqIHRvIGJlIHByb2Nlc3NlZCBvbiBoeXBlcmxpbmsgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBocmVmCi0JICogICAgICAgICAgICB0aGUgaHlwZXJsaW5rIG9iamVjdCByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIcmVmKE9iamVjdCBocmVmKSB7Ci0JCXNldERhdGEoImhyZWYiLCBocmVmKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBoeXBlcmxpbmsuCi0JICogCi0JICogQHNlZSAjc2V0SHJlZgotCSAqIEByZXR1cm4gdGhlIGh5cGVybGluayBvYmplY3QgcmVmZXJlbmNlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRIcmVmKCkgewotCQlyZXR1cm4gZ2V0RGF0YSgiaHJlZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGh5cGVybGluayBzdWl0YWJsZSBmb3Igc2hvd2luZwotCSAqIGluIHRvb2wgdGlwcyBvciBvbiB0aGUgc3RhdHVzIGxpbmUuCi0JICogCi0JICogQHJldHVybiB0aGUgaHlwZXJsaW5rIHRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBnZXRUb29sVGlwVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFBhaW50cyB0aGUgaHlwZXJsaW5rIGFzIGEgcmVhY3Rpb24gdG8gdGhlIHByb3ZpZGVkIHBhaW50IGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBnYwotCSAqICAgICAgICAgICAgZ3JhcGhpYyBjb250ZXh0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcGFpbnRIeXBlcmxpbmsoR0MgZ2MpOwotCi0JLyoqCi0JICogUGFpbnRzIHRoZSBjb250cm9sIGFzIGEgcmVhY3Rpb24gdG8gdGhlIHByb3ZpZGVkIHBhaW50IGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICB0aGUgcGFpbnQgZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWludChQYWludEV2ZW50IGUpIHsKLQkJR0MgZ2MgPSBlLmdjOwotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGdldENsaWVudEFyZWEoKTsKLQkJaWYgKGNsaWVudEFyZWEud2lkdGggPT0gMCB8fCBjbGllbnRBcmVhLmhlaWdodCA9PSAwKQotCQkJcmV0dXJuOwotCQlwYWludEh5cGVybGluayhnYyk7Ci0JCWlmIChoYXNGb2N1cykgewotCQkJUmVjdGFuZ2xlIGNhcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOwotCQkJZ2MuZHJhd0ZvY3VzKDAsIDAsIGNhcmVhLndpZHRoLCBjYXJlYS5oZWlnaHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU1vdXNlVXAoRXZlbnQgZSkgewotCQlpZiAoZS5idXR0b24gIT0gMSkKLQkJCXJldHVybjsKLQkJUG9pbnQgc2l6ZSA9IGdldFNpemUoKTsKLQkJLy8gRmlsdGVyIG91dCBtb3VzZSB1cCBldmVudHMgb3V0c2lkZQotCQkvLyB0aGUgbGluay4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gbW91c2UgaXMKLQkJLy8gY2xpY2tlZCwgZHJhZ2dlZCBvdXRzaWRlIHRoZSBsaW5rLCB0aGVuCi0JCS8vIHJlbGVhc2VkLgotCQlpZiAoZS54IDwgMCkKLQkJCXJldHVybjsKLQkJaWYgKGUueSA8IDApCi0JCQlyZXR1cm47Ci0JCWlmIChlLnggPj0gc2l6ZS54KQotCQkJcmV0dXJuOwotCQlpZiAoZS55ID49IHNpemUueSkKLQkJCXJldHVybjsKLQkJaGFuZGxlQWN0aXZhdGUoZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9Db2x1bW5MYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvQ29sdW1uTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZWVjMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9Db2x1bW5MYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgZGlua28uaXZhbm92QHNhcC5jb20gLSBwYXRjaCAjNzA3OTAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotLyoqCi0gKiBUaGlzIGxheW91dCBtYW5hZ2VyIGFycmFuZ2VzIGNoaWxkcmVuIG9mIHRoZSBjb21wb3NpdGUgcGFyZW50IGluIHZlcnRpY2FsCi0gKiBjb2x1bW5zLiBBbGwgdGhlIGNvbHVtbnMgYXJlIGlkZW50aWNhbCBzaXplIGFuZCBjaGlsZHJlbiBhcmUgc3RyZXRjaGVkCi0gKiBob3Jpem9udGFsbHkgdG8gZmlsbCB0aGUgY29sdW1uIHdpZHRoLiBUaGUgZ29hbCBpcyB0byBnaXZlIGxheW91dCBzb21lCi0gKiByZWFzb25hYmxlIHJhbmdlIG9mIGNvbHVtbiBudW1iZXJzIHRvIGFsbG93IGl0IHRvIGhhbmRsZSB2YXJpb3VzIHBhcmVudAotICogd2lkdGhzLiBUaGF0IHdheSwgY29sdW1uIG51bWJlciB3aWxsIGRyb3AgdG8gdGhlIGxvd2VzdCBudW1iZXIgaW4gdGhlIHJhbmdlCi0gKiB3aGVuIHdpZHRoIGRlY3JlYXNlcywgYW5kIGdyb3cgdXAgdG8gdGhlIGhpZ2hlc3QgbnVtYmVyIGluIHRoZSByYW5nZSB3aGVuCi0gKiBhbGxvd2VkIGJ5IHRoZSBwYXJlbnQgd2lkdGguCi0gKiA8cD4KLSAqIEluIGFkZGl0aW9uLCB0aGUgbGF5b3V0IGF0dGVtcHRzIHRvICdmaWxsIHRoZSBzcGFjZScgZXF1YWxseSBpLmUuIHRvIGF2b2lkCi0gKiBsYXJnZSBnYXBzIGF0IHRoZSBhbmQgb2YgdGhlIGxhc3QgY29sdW1uLgotICogPHA+Ci0gKiBDaGlsZCBjb250cm9scyBhcmUgbGF5ZWQgb3V0IGFjY29yZGluZyB0byB0aGVpciAnbmF0dXJhbCcgKHByZWZlcnJlZCkgc2l6ZS4KLSAqIEZvciAnc3RyZXRjaHknIGNvbnRyb2xzIHRoYXQgZG8gbm90IGhhdmUgbmF0dXJhbCBwcmVmZXJyZWQgc2l6ZSwgaXQgaXMKLSAqIHBvc3NpYmxlIHRvIHNldCB3aWR0aCBhbmQvb3IgaGVpZ2h0IGhpbnRzIHVzaW5nIENvbHVtbkxheW91dERhdGEgb2JqZWN0cy4KLSAqIAotICogQHNlZSBDb2x1bW5MYXlvdXREYXRhCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2x1bW5MYXlvdXQgZXh0ZW5kcyBMYXlvdXQgaW1wbGVtZW50cyBJTGF5b3V0RXh0ZW5zaW9uIHsKLQkvKioKLQkgKiBNaW5pbXVtIG51bWJlciBvZiBjb2x1bW5zIChkZWZhdWx0IGlzIDEpLgotCSAqLwotCXB1YmxpYyBpbnQgbWluTnVtQ29sdW1ucyA9IDE7Ci0JLyoqCi0JICogTWF4aW11bSBudW1iZXIgb2YgY29sdW1ucyAoZGVmYXVsdCBpcyAzKS4KLQkgKi8KLQlwdWJsaWMgaW50IG1heE51bUNvbHVtbnMgPSAzOwotCS8qKgotCSAqIEhvcml6b250YWwgc3BhY2luZyBiZXR3ZWVuIGNvbHVtbnMgKGRlZmF1bHQgaXMgNSkuCi0JICovCi0JcHVibGljIGludCBob3Jpem9udGFsU3BhY2luZyA9IDU7Ci0JLyoqCi0JICogVmVydGljYWwgc3BhY2luZyBiZXR3ZWVuIGNvbnRyb2xzIChkZWZhdWx0IGlzIDUpLgotCSAqLwotCXB1YmxpYyBpbnQgdmVydGljYWxTcGFjaW5nID0gNTsKLQkvKioKLQkgKiBUb3AgbWFyZ2luIChkZWZhdWx0IGlzIDUpLgotCSAqLwotCXB1YmxpYyBpbnQgdG9wTWFyZ2luID0gNTsKLQkvKioKLQkgKiBMZWZ0IG1hcmdpbiAoZGVmYXVsdCBpcyA1KS4KLQkgKi8KLQlwdWJsaWMgaW50IGxlZnRNYXJnaW4gPSA1OwotCS8qKgotCSAqIEJvdHRvbSBtYXJnaW4gKGRlZmF1bHQgaXMgNSkuCi0JICovCi0JcHVibGljIGludCBib3R0b21NYXJnaW4gPSA1OwotCS8qKgotCSAqIFJpZ2h0IG1hcmdpbiAoZGVmYXVsdCBpcyA1KS4KLQkgKi8KLQlwdWJsaWMgaW50IHJpZ2h0TWFyZ2luID0gNTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNvbHVtbiBsYXlvdXQuCi0JICovCi0JcHVibGljIENvbHVtbkxheW91dCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlpZiAod0hpbnQgPT0gMCkKLQkJCXJldHVybiBjb21wdXRlU2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgbWluTnVtQ29sdW1ucyk7Ci0JCWVsc2UgaWYgKHdIaW50ID09IFNXVC5ERUZBVUxUKQotCQkJcmV0dXJuIGNvbXB1dGVTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCBtYXhOdW1Db2x1bW5zKTsKLQkJZWxzZQotCQkJcmV0dXJuIGNvbXB1dGVTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCAtMSk7Ci0JfQotCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgd0hpbnQsIGludCBoSGludCwgaW50IG5jb2x1bW5zKSB7Ci0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotCQlpbnQgY3dpZHRoID0gMDsKLQkJaW50IGNoZWlnaHQgPSAwOwotCQlQb2ludFtdIHNpemVzID0gbmV3IFBvaW50W2NoaWxkcmVuLmxlbmd0aF07Ci0KLQkJaW50IGN3SGludCA9IFNXVC5ERUZBVUxUOwotCQlpZiAobmNvbHVtbnMgIT0gLTEpIHsKLQkJCWN3SGludCA9IHdIaW50IC0gbGVmdE1hcmdpbiAtIHJpZ2h0TWFyZ2luIC0gKG5jb2x1bW5zIC0gMSkgKiBob3Jpem9udGFsU3BhY2luZzsKLQkJCWlmIChjd0hpbnQgPD0gMCkKLQkJCQljd0hpbnQgPSAwOwotCQkJZWxzZQotCQkJCWN3SGludCAvPSBuY29sdW1uczsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXNpemVzW2ldID0gY29tcHV0ZUNvbnRyb2xTaXplKGNoaWxkcmVuW2ldLCBjd0hpbnQpOwotCQkJY3dpZHRoID0gTWF0aC5tYXgoY3dpZHRoLCBzaXplc1tpXS54KTsKLQkJCWNoZWlnaHQgKz0gc2l6ZXNbaV0ueTsKLQkJfQotCQlpZiAobmNvbHVtbnMgPT0gLTEpIHsKLQkJCS8vIG11c3QgY29tcHV0ZQotCQkJbmNvbHVtbnMgPSAod0hpbnQgLSBsZWZ0TWFyZ2luIC0gcmlnaHRNYXJnaW4gLSBob3Jpem9udGFsU3BhY2luZykgLyAoY3dpZHRoICsgaG9yaXpvbnRhbFNwYWNpbmcpOwotCQkJbmNvbHVtbnMgPSBNYXRoLm1heChuY29sdW1ucywgbWluTnVtQ29sdW1ucyk7Ci0JCQluY29sdW1ucyA9IE1hdGgubWluKG5jb2x1bW5zLCBtYXhOdW1Db2x1bW5zKTsKLQkJfQotCQlpbnQgcGVyQ29sSGVpZ2h0ID0gY2hlaWdodCAvIG5jb2x1bW5zOwotCQlpZiAoY2hlaWdodCAlIG5jb2x1bW5zICE9IDApCi0JCQlwZXJDb2xIZWlnaHQrKzsKLQkJaW50IGNvbEhlaWdodCA9IDA7Ci0JCWludFtdIGhlaWdodHMgPSBuZXcgaW50W25jb2x1bW5zXTsKLQkJaW50IG5jb2wgPSAwOwotCQkKLQkJYm9vbGVhbiBmaWxsSW4gPSBmYWxzZTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBjaGlsZEhlaWdodCA9IHNpemVzW2ldLnk7Ci0JCQlpZiAoY29sSGVpZ2h0ICsgY2hpbGRIZWlnaHQgPiBwZXJDb2xIZWlnaHQpIHsKLQkJCQloZWlnaHRzW25jb2xdID0gY29sSGVpZ2h0OwotCQkJCW5jb2wrKzsKLQkJCQlpZiAobmNvbCA9PSBuY29sdW1ucyB8fCBmaWxsSW4pIHsKLQkJCQkJLy8gb3ZlcmZsb3cgLSBzdGFydCBmaWxsaW5nIGluCi0JCQkJCWZpbGxJbiA9IHRydWU7Ci0JCQkJCW5jb2wgPSBmaW5kU2hvcnRlc3RDb2x1bW4oaGVpZ2h0cyk7Ci0JCQkJfQotCQkJCWNvbEhlaWdodCA9IGhlaWdodHNbbmNvbF07Ci0JCQl9Ci0JCQlpZiAoY29sSGVpZ2h0ID4gMCkKLQkJCQljb2xIZWlnaHQgKz0gdmVydGljYWxTcGFjaW5nOwotCQkJY29sSGVpZ2h0ICs9IGNoaWxkSGVpZ2h0OwotCQl9Ci0JCWhlaWdodHNbbmNvbF0gPSBNYXRoLm1heChoZWlnaHRzW25jb2xdLGNvbEhlaWdodCk7Ci0JCQotCQlQb2ludCBzaXplID0gbmV3IFBvaW50KDAsIDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5jb2x1bW5zOyBpKyspIHsKLQkJCXNpemUueSA9IE1hdGgubWF4KHNpemUueSwgaGVpZ2h0c1tpXSk7Ci0JCX0KLQkJc2l6ZS54ID0gY3dpZHRoICogbmNvbHVtbnMgKyAobmNvbHVtbnMgLSAxKSAqIGhvcml6b250YWxTcGFjaW5nOwotCQlzaXplLnggKz0gbGVmdE1hcmdpbiArIHJpZ2h0TWFyZ2luOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ29sdW1uTGF5b3V0OiB3aGludD0iK3dIaW50KyIsIHNpemUueD0iK3NpemUueCk7Ci0JCXNpemUueSArPSB0b3BNYXJnaW4gKyBib3R0b21NYXJnaW47Ci0JCXJldHVybiBzaXplOwotCX0KLQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZUNvbnRyb2xTaXplKENvbnRyb2wgYywgaW50IHdIaW50KSB7Ci0JCUNvbHVtbkxheW91dERhdGEgY2QgPSAoQ29sdW1uTGF5b3V0RGF0YSkgYy5nZXRMYXlvdXREYXRhKCk7Ci0JCWludCB3aWR0aEhpbnQgPSBjZCAhPSBudWxsID8gY2Qud2lkdGhIaW50IDogd0hpbnQ7Ci0JCWludCBoZWlnaHRIaW50ID0gY2QgIT0gbnVsbCA/IGNkLmhlaWdodEhpbnQgOiBTV1QuREVGQVVMVDsKLQkJcmV0dXJuIGMuY29tcHV0ZVNpemUod2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLQl9Ci0KLQlwcml2YXRlIGludCBmaW5kU2hvcnRlc3RDb2x1bW4oaW50W10gaGVpZ2h0cykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaW50IGhlaWdodCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGhlaWdodHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChoZWlnaHQgPiBoZWlnaHRzW2ldKSB7Ci0JCQkJaGVpZ2h0ID0gaGVpZ2h0c1tpXTsKLQkJCQlyZXN1bHQgPSBpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQjbGF5b3V0KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJUmVjdGFuZ2xlIGNhcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJaW50IGN3aWR0aCA9IDA7Ci0JCWludCBjaGVpZ2h0ID0gMDsKLQkJUG9pbnRbXSBzaXplcyA9IG5ldyBQb2ludFtjaGlsZHJlbi5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlzaXplc1tpXSA9IGNvbXB1dGVDb250cm9sU2l6ZShjaGlsZHJlbltpXSwgU1dULkRFRkFVTFQpOwotCQkJY3dpZHRoID0gTWF0aC5tYXgoY3dpZHRoLCBzaXplc1tpXS54KTsKLQkJCWNoZWlnaHQgKz0gc2l6ZXNbaV0ueTsKLQkJfQotCQlpbnQgbmNvbHVtbnMgPSAoY2FyZWEud2lkdGggLSBsZWZ0TWFyZ2luIC0gcmlnaHRNYXJnaW4gLSBob3Jpem9udGFsU3BhY2luZykgLyAoY3dpZHRoICsgaG9yaXpvbnRhbFNwYWNpbmcpOwotCQluY29sdW1ucyA9IE1hdGgubWF4KG5jb2x1bW5zLCBtaW5OdW1Db2x1bW5zKTsKLQkJbmNvbHVtbnMgPSBNYXRoLm1pbihuY29sdW1ucywgbWF4TnVtQ29sdW1ucyk7Ci0JCWludCByZWFsV2lkdGggPSAoY2FyZWEud2lkdGggLSBsZWZ0TWFyZ2luIC0gcmlnaHRNYXJnaW4gKyBob3Jpem9udGFsU3BhY2luZykgLyBuY29sdW1ucyAtIGhvcml6b250YWxTcGFjaW5nOwotLy8JCWludCBjaGlsZHJlblBlckNvbHVtbiA9IGNoaWxkcmVuLmxlbmd0aCAvIG5jb2x1bW5zOwotLy8JCWlmIChjaGlsZHJlbi5sZW5ndGggJSBuY29sdW1ucyAhPSAwKQotLy8JCQljaGlsZHJlblBlckNvbHVtbisrOwotLy8JCWludCBjb2xXaWR0aCA9IDA7Ci0KLQkJaW50IGZpbGxXaWR0aCA9IE1hdGgubWF4KGN3aWR0aCwgcmVhbFdpZHRoKTsKLQkJCi0JCWludCBwZXJDb2xIZWlnaHQgPSBjaGVpZ2h0IC8gbmNvbHVtbnM7Ci0JCWlmIChjaGVpZ2h0ICUgbmNvbHVtbnMgIT0gMCkKLQkJCXBlckNvbEhlaWdodCsrOwotCQkKLQkJaW50IGNvbEhlaWdodCA9IDA7Ci0JCWludFtdIGhlaWdodHMgPSBuZXcgaW50W25jb2x1bW5zXTsKLQkJaW50IG5jb2wgPSAwOwotCQlpbnQgeCA9IGxlZnRNYXJnaW47Ci0JCWJvb2xlYW4gZmlsbEluID0gZmFsc2U7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQlQb2ludCBjc2l6ZSA9IHNpemVzW2ldOwotCQkJQ29sdW1uTGF5b3V0RGF0YSBjZCA9IChDb2x1bW5MYXlvdXREYXRhKSBjaGlsZC5nZXRMYXlvdXREYXRhKCk7Ci0JCQlpbnQgYWxpZ24gPSBjZCAhPSBudWxsID8gY2QuaG9yaXpvbnRhbEFsaWdubWVudCA6IENvbHVtbkxheW91dERhdGEuRklMTDsKLQkJCWludCBjaGlsZFdpZHRoID0gYWxpZ24gPT0gQ29sdW1uTGF5b3V0RGF0YS5GSUxMID8gZmlsbFdpZHRoIDogY3NpemUueDsKLQotCQkJaWYgKGNvbEhlaWdodCArIGNzaXplLnkgPiBwZXJDb2xIZWlnaHQpIHsKLQkJCQloZWlnaHRzW25jb2xdID0gY29sSGVpZ2h0OwotCQkJCWlmIChmaWxsSW4gfHwgbmNvbCA9PSBuY29sdW1ucy0xKSB7Ci0JCQkJCS8vIG92ZXJmbG93IC0gc3RhcnQgZmlsbGluZyBpbgotCQkJCQlmaWxsSW4gPSB0cnVlOwotCQkJCQluY29sID0gZmluZFNob3J0ZXN0Q29sdW1uKGhlaWdodHMpOwotCQkJCQkKLQkJCQkJeCA9IGxlZnRNYXJnaW4gKyBuY29sICogKGZpbGxXaWR0aCArIGhvcml6b250YWxTcGFjaW5nKTsKLQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmNvbCsrOwotCQkJCQl4ICs9IGZpbGxXaWR0aCArIGhvcml6b250YWxTcGFjaW5nOwotCQkJCX0KLQkJCQljb2xIZWlnaHQgPSBoZWlnaHRzW25jb2xdOwotCQkJfQotCQkJaWYgKGNvbEhlaWdodCA+IDApCi0JCQkJY29sSGVpZ2h0ICs9IHZlcnRpY2FsU3BhY2luZzsKLQkJCQotCQkJCi0JCQlzd2l0Y2ggKGFsaWduKSB7Ci0JCQkJY2FzZSBDb2x1bW5MYXlvdXREYXRhLkxFRlQgOgotCQkJCWNhc2UgQ29sdW1uTGF5b3V0RGF0YS5GSUxMIDoKLQkJCQkJY2hpbGQuc2V0Qm91bmRzKHgsIHRvcE1hcmdpbitjb2xIZWlnaHQsIGNoaWxkV2lkdGgsIGNzaXplLnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkxheW91dERhdGEuUklHSFQgOgotCQkJCQljaGlsZC5zZXRCb3VuZHMoeCArIGZpbGxXaWR0aCAtIGNoaWxkV2lkdGgsIHRvcE1hcmdpbitjb2xIZWlnaHQsIGNoaWxkV2lkdGgsIGNzaXplLnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkxheW91dERhdGEuQ0VOVEVSIDoKLQkJCQkJY2hpbGQuc2V0Qm91bmRzKHggKyBmaWxsV2lkdGggLyAyIC0gY2hpbGRXaWR0aCAvIDIsIHRvcE1hcmdpbitjb2xIZWlnaHQsIGNoaWxkV2lkdGgsIGNzaXplLnkpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJY29sSGVpZ2h0ICs9IGNzaXplLnk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSUxheW91dEV4dGVuc2lvbiNjb21wdXRlTWF4aW11bVdpZHRoKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIGludCBjb21wdXRlTWF4aW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQlyZXR1cm4gY29tcHV0ZVNpemUocGFyZW50LCBTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpLng7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLklMYXlvdXRFeHRlbnNpb24jY29tcHV0ZU1pbmltdW1XaWR0aChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBpbnQgY29tcHV0ZU1pbmltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJcmV0dXJuIGNvbXB1dGVTaXplKHBhcmVudCwgMCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpLng7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9Db2x1bW5MYXlvdXREYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL0NvbHVtbkxheW91dERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzMjZiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL0NvbHVtbkxheW91dERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzdG9yZSBsYXlvdXQgZGF0YSBmb3IgdGhlIDxjb2RlPkNvbHVtbkxheW91dDwvY29kZT4KLSAqIGNsYXNzLiBZb3UgY2FuIGNvbnRyb2wgd2lkdGggYW5kIGhlaWdodCBoaW50cywgYXMgd2VsbCBhcyBob3Jpem9udGFsCi0gKiBhbGlnbm1lbnQgdXNpbmcgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuIEFzIHdpdGggb3RoZXIgbGF5b3V0cywgdGhleSBhcmUgbm90Ci0gKiByZXF1aXJlZCB0byBnZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLgotICogCi0gKiBAc2VlIENvbHVtbkxheW91dAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sdW1uTGF5b3V0RGF0YSB7Ci0JLyoqCi0JICogV2lkdGggaGludCB0aGF0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBjb21wdXRlZCBjb250cm9sIHdpZHRoIHdoZW4KLQkgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggPGNvZGU+Q29sdW1uTGF5b3V0PC9jb2RlPiBjbGFzcyAoZGVmYXVsdCBpcwotCSAqIFNXVC5ERUZBVUxUKS4KLQkgKi8KLQlwdWJsaWMgaW50IHdpZHRoSGludCA9IFNXVC5ERUZBVUxUOwotCS8qKgotCSAqIEhlaWdodCBoaW50IHRoYXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGNvbXB1dGVkIGNvbnRyb2wgaGVpZ2h0Ci0JICogd2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggPGNvZGU+Q29sdW1uTGF5b3V0PC9jb2RlPiBjbGFzcyAoZGVmYXVsdAotCSAqIGlzIFNXVC5ERUZBVUxUKS4KLQkgKi8KLQlwdWJsaWMgaW50IGhlaWdodEhpbnQgPSBTV1QuREVGQVVMVDsKLQkvKioKLQkgKiBIb3Jpem9udGFsIGFsaWdubWVudCBjb25zdGFudCAtIGNvbnRyb2wgd2lsbCBiZSBhbGlnbmVkIHRvIHRoZSBsZWZ0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlQgPSAxOwotCS8qKgotCSAqIEhvcml6b250YWwgYWxpZ25tZW50IGNvbnN0YW50IC0gY29udHJvbCB3aWxsIGJlIGFsaWduZWQgdG8gdGhlIHJpZ2h0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTlRFUiA9IDI7Ci0JLyoqCi0JICogSG9yaXpvbnRhbCBhbGlnbm1lbnQgY29uc3RhbnQgLSBjb250cm9sIHdpbGwgYmUgY2VudGVyZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFQgPSAzOwotCS8qKgotCSAqIEhvcml6b250YWwgYWxpZ25tZW50IGNvbnN0YW50IC0gY29udHJvbCB3aWxsIGZpbGwgdGhlIGNvbHVtbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMID0gNDsKLQkvKioKLQkgKiBIb3Jpem9udGFsIGFsaWdubWVudCB2YXJpYWJsZSAoZGVmYXVsdCBpcyBGSUxMKS4KLQkgKi8KLQlwdWJsaWMgaW50IGhvcml6b250YWxBbGlnbm1lbnQgPSBGSUxMOwotCS8qKgotCSAqIENvbnZpbmllbmNlIGNvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIHdIaW50Ci0JICogICAgICAgICAgICB3aWR0aCBoaW50IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoSGludAotCSAqICAgICAgICAgICAgaGVpZ2h0IGhpbnQgZm9yIHRoZSBjb250cm9sCi0JICovCi0JcHVibGljIENvbHVtbkxheW91dERhdGEoaW50IHdIaW50LCBpbnQgaEhpbnQpIHsKLQkJdGhpcy53aWR0aEhpbnQgPSB3SGludDsKLQkJdGhpcy5oZWlnaHRIaW50ID0gaEhpbnQ7Ci0JfQotCS8qKgotCSAqIENvbnZpbmllbmNlIGNvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIHdIaW50Ci0JICogICAgICAgICAgICB3aWR0aCBoaW50IGZvciB0aGUgY29udHJvbAotCSAqLwotCXB1YmxpYyBDb2x1bW5MYXlvdXREYXRhKGludCB3SGludCkgewotCQl0aGlzLndpZHRoSGludCA9IHdIaW50OwotCX0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKiAgCi0JICovCi0JcHVibGljIENvbHVtbkxheW91dERhdGEoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9FeHBhbmRhYmxlQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL0V4cGFuZGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwZjM4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL0V4cGFuZGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkV4cGFuc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUV4cGFuc2lvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuRm9ybVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5Gb3Jtc1Jlc291cmNlczsKLQotLyoqCi0gKiBUaGlzIGNvbXBvc2l0ZSBpcyBjYXBhYmxlIG9mIGV4cGFuZGluZyBvciBjb2xsYXBzaW5nIGEgc2luZ2xlIGNsaWVudCB0aGF0IGlzCi0gKiBpdHMgZGlyZWN0IGNoaWxkLiBUaGUgY29tcG9zaXRlIHJlbmRlcnMgYW4gZXhwYW5zaW9uIHRvZ2dsZSBhZmZvcmRhbmNlCi0gKiAoYWNjb3JkaW5nIHRvIHRoZSBjaG9zZW4gc3R5bGUpLCBhbmQgYSB0aXRsZSB0aGF0IGFsc28gYWN0cyBhcyBhIGh5cGVybGluawotICogKGNhbiBiZSBzZWxlY3RlZCBhbmQgaXMgdHJhdmVyc2FibGUpLiBUaGUgY2xpZW50IGlzIGxheWVkIG91dCBiZWxvdyB0aGUgdGl0bGUKLSAqIHdoZW4gZXhwYW5kZWQsIG9yIGhpZGRlbiB3aGVuIGNvbGxhcHNlZC4KLSAqIDxwPgotICogVGhlIHdpZGdldCBjYW4gYmUgaW5zdGFudGlhdGVkIGFzLWlzLCBvciBzdWJjbGFzc2VkIHRvIG1vZGlmeSBzb21lIGFzcGVjdHMgb2YKLSAqIGl0LgotICogCi0gKiA8cD4KLSAqIFNpbmNlIDMuMSwgbGVmdC9yaWdodCBhcnJvdyBrZXlzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGV4cGFuc2lvbiBzdGF0ZS4KLSAqIElmIHNldmVyYWwgZXhwYW5kYWJsZSBjb21wb3NpdGVzIGFyZSBjcmVhdGVkIGluIHRoZSBzYW1lIHBhcmVudCwgdXAvZG93bgotICogYXJyb3cga2V5cyBjYW4gYmUgdXNlZCB0byB0cmF2ZXJzZSBiZXR3ZWVuIHRoZW0uIEV4cGFuZGFibGUgdGV4dCBhY2NlcHRzCi0gKiBtbmVtb25pY3MgYW5kIG1uZW1vbmljIGFjdGl2YXRpb24gd2lsbCB0b2dnbGUgdGhlIGV4cGFuc2lvbiBzdGF0ZS4KLSAqIAotICogQHNlZSBTZWN0aW9uCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBhbmRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQkvKioKLQkgKiBJZiB0aGlzIHN0eWxlIGlzIHVzZWQsIGEgdHdpc3RpZSB3aWxsIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBleHBhbnNpb24KLQkgKiB0b2dnbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFdJU1RJRSA9IDEgPDwgMTsKLQotCS8qKgotCSAqIElmIHRoaXMgc3R5bGUgaXMgdXNlZCwgYSB0cmVlIG5vZGUgd2l0aCBlaXRoZXIgKyBvciAtIHNpZ25zIHdpbGwgYmUgdXNlZAotCSAqIHRvIHJlbmRlciB0aGUgZXhwYW5zaW9uIHRvZ2dsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkVFX05PREUgPSAxIDw8IDI7Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHN0eWxlIGlzIHVzZWQsIHRoZSB0aXRsZSB0ZXh0IHdpbGwgYmUgcmVuZGVyZWQgYXMgYSBoeXBlcmxpbmsKLQkgKiB0aGF0IGNhbiBpbmRpdmlkdWFsbHkgYWNjZXB0IGZvY3VzLiBPdGhlcndpc2UsIGl0IHdpbGwgc3RpbGwgYWN0IGxpa2UgYQotCSAqIGh5cGVybGluaywgYnV0IG9ubHkgdGhlIHRvZ2dsZSBjb250cm9sIHdpbGwgYWNjZXB0IGZvY3VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPQ1VTX1RJVExFID0gMSA8PCAzOwotCi0JLyoqCi0JICogSWYgdGhpcyBzdHlsZSBpcyB1c2VkLCB0aGUgY2xpZW50IG9yaWdpbiB3aWxsIGJlIHZlcnRpY2FsbHkgYWxpZ25lZCB3aXRoCi0JICogdGhlIHRpdGxlIHRleHQuIE90aGVyd2lzZSwgaXQgd2lsbCBzdGFydCBhdCB4ID0gMC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfSU5ERU5UID0gMSA8PCA0OwotCi0JLyoqCi0JICogSWYgdGhpcyBzdHlsZSBpcyB1c2VkLCBjb21wdXRlZCBzaXplIG9mIHRoZSBjb21wb3NpdGUgd2lsbCB0YWtlIHRoZQotCSAqIGNsaWVudCB3aWR0aCBpbnRvIGNvbnNpZGVyYXRpb24gb25seSBpbiB0aGUgZXhwYW5kZWQgc3RhdGUuIE90aGVyd2lzZSwKLQkgKiBjbGllbnQgd2lkdGggd2lsbCBhbHdheXMgYmUgdGFrZW4gaW50byBhY291bnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUEFDVCA9IDEgPDwgNTsKLQotCS8qKgotCSAqIElmIHRoaXMgc3R5bGUgaXMgdXNlZCwgdGhlIGNvbnRyb2wgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBleHBhbmRlZCBzdGF0ZS4KLQkgKiBUaGlzIHN0YXRlIGNhbiBsYXRlciBiZSBjaGFuZ2VkIHByb2dyYW1tYXRpY2FsbHkgb3IgYnkgdGhlIHVzZXIgaWYKLQkgKiBUV0lTVElFIG9yIFRSRUVfTk9ERSBzdHlsZSBpcyB1c2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUEFOREVEID0gMSA8PCA2OwotCi0JLyoqCi0JICogSWYgdGhpcyBzdHlsZSBpcyB1c2VkLCB0aXRsZSBiYXIgZGVjb3JhdGlvbiB3aWxsIGJlIHBhaW50ZWQgYmVoaW5kIHRoZQotCSAqIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElUTEVfQkFSID0gMSA8PCA4OwotCi0JLyoqCi0JICogSWYgdGhpcyBzdHlsZSBpcyB1c2VkLCBhIHNob3J0IHZlcnNpb24gb2YgdGhlIHRpdGxlIGJhciBkZWNvcmF0aW9uIHdpbGwKLQkgKiBiZSBwYWludGVkIGJlaGluZCB0aGUgdGV4dC4gVGhpcyBzdHlsZSBpcyB1c2VmdWwgd2hlbiBhIG1vcmUgZGVzY3JldGUKLQkgKiBvcHRpb24gaXMgbmVlZGVkIGZvciB0aGUgdGl0bGUgYmFyLgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVF9USVRMRV9CQVIgPSAxIDw8IDk7Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHN0eWxlIGlzIHVzZWQsIHRpdGxlIHdpbGwgbm90IGJlIHJlbmRlcmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX1RJVExFID0gMSA8PCAxMjsKLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIHRleHQgY2xpZW50IGlzIHJpZ2h0LWFsaWduZWQuIElmIHRoaXMgc3R5bGUgaXMgdXNlZCwgaXQgd2lsbAotCSAqIGJlIHBvc2l0aW9uZWQgYWZ0ZXIgdGhlIHRleHQgY29udHJvbCBhbmQgdmVydGljYWxseSBjZW50ZXJlZCB3aXRoIGl0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfVEVYVF9DTElFTlRfQUxJR05NRU5UID0gMSA8PCAxMzsKLQotCS8qKgotCSAqIFdpZHRoIG9mIHRoZSBtYXJnaW4gdGhhdCB3aWxsIGJlIGFkZGVkIGFyb3VuZCB0aGUgY29udHJvbCAoZGVmYXVsdCBpcyAwKS4KLQkgKi8KLQlwdWJsaWMgaW50IG1hcmdpbldpZHRoID0gMDsKLQotCS8qKgotCSAqIEhlaWdodCBvZiB0aGUgbWFyZ2luIHRoYXQgd2lsbCBiZSBhZGRlZCBhcm91bmQgdGhlIGNvbnRyb2wgKGRlZmF1bHQgaXMKLQkgKiAwKS4KLQkgKi8KLQlwdWJsaWMgaW50IG1hcmdpbkhlaWdodCA9IDA7Ci0KLQkvKioKLQkgKiBWZXJ0aWNhbCBzcGFjaW5nIGJldHdlZW4gdGhlIHRpdGxlIGFyZWEgYW5kIHRoZSBjb21wb3NpdGUgY2xpZW50IGNvbnRyb2wKLQkgKiAoZGVmYXVsdCBpcyAzKS4KLQkgKi8KLQlwdWJsaWMgaW50IGNsaWVudFZlcnRpY2FsU3BhY2luZyA9IDM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQb2ludCBOVUxMX1NJWkUgPSBuZXcgUG9pbnQoMCwgMCk7Ci0KLQlwcml2YXRlIGludCBWU1BBQ0UgPSAzOwotCi0JcHJvdGVjdGVkIGludCBHQVAgPSA0OwotCi0JcHJpdmF0ZSBpbnQgU0VQQVJBVE9SX0hFSUdIVCA9IDI7Ci0KLQlwcml2YXRlIGludCBleHBhbnNpb25TdHlsZSA9IFRXSVNUSUUgfCBGT0NVU19USVRMRSB8IEVYUEFOREVEOwotCi0JcHJpdmF0ZSBib29sZWFuIGV4cGFuZGVkOwotCi0JcHJpdmF0ZSBDb250cm9sIHRleHRDbGllbnQ7Ci0KLQlwcml2YXRlIENvbnRyb2wgY2xpZW50OwotCi0JcHJpdmF0ZSBWZWN0b3IgbGlzdGVuZXJzOwotCi0JcHJvdGVjdGVkIFRvZ2dsZUh5cGVybGluayB0b2dnbGU7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCB0ZXh0TGFiZWw7Ci0KLQlwcml2YXRlIENvbG9yIHRpdGxlQmFyRm9yZWdyb3VuZDsKLQotCXByaXZhdGUgY2xhc3MgRXhwYW5kYWJsZUxheW91dCBleHRlbmRzIExheW91dCBpbXBsZW1lbnRzIElMYXlvdXRFeHRlbnNpb24gewotCi0JCXByaXZhdGUgU2l6ZUNhY2hlIHRvZ2dsZUNhY2hlID0gbmV3IFNpemVDYWNoZSgpOwotCi0JCXByaXZhdGUgU2l6ZUNhY2hlIHRleHRDbGllbnRDYWNoZSA9IG5ldyBTaXplQ2FjaGUoKTsKLQotCQlwcml2YXRlIFNpemVDYWNoZSB0ZXh0TGFiZWxDYWNoZSA9IG5ldyBTaXplQ2FjaGUoKTsKLQotCQlwcml2YXRlIFNpemVDYWNoZSBkZXNjcmlwdGlvbkNhY2hlID0gbmV3IFNpemVDYWNoZSgpOwotCi0JCXByaXZhdGUgU2l6ZUNhY2hlIGNsaWVudENhY2hlID0gbmV3IFNpemVDYWNoZSgpOwotCi0JCXByaXZhdGUgdm9pZCBpbml0Q2FjaGUoYm9vbGVhbiBzaG91bGRGbHVzaCkgewotCQkJdG9nZ2xlQ2FjaGUuc2V0Q29udHJvbCh0b2dnbGUpOwotCQkJdGV4dENsaWVudENhY2hlLnNldENvbnRyb2wodGV4dENsaWVudCk7Ci0JCQl0ZXh0TGFiZWxDYWNoZS5zZXRDb250cm9sKHRleHRMYWJlbCk7Ci0JCQlkZXNjcmlwdGlvbkNhY2hlLnNldENvbnRyb2woZ2V0RGVzY3JpcHRpb25Db250cm9sKCkpOwotCQkJY2xpZW50Q2FjaGUuc2V0Q29udHJvbChjbGllbnQpOwotCi0JCQlpZiAoc2hvdWxkRmx1c2gpIHsKLQkJCQl0b2dnbGVDYWNoZS5mbHVzaCgpOwotCQkJCXRleHRDbGllbnRDYWNoZS5mbHVzaCgpOwotCQkJCXRleHRMYWJlbENhY2hlLmZsdXNoKCk7Ci0JCQkJZGVzY3JpcHRpb25DYWNoZS5mbHVzaCgpOwotCQkJCWNsaWVudENhY2hlLmZsdXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JCQlpbml0Q2FjaGUoY2hhbmdlZCk7Ci0KLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJCWludCB0aG1hcmdpbiA9IDA7Ci0JCQlpbnQgdHZtYXJnaW4gPSAwOwotCi0JCQlpZiAoaGFzVGl0bGVCYXIoKSkgewotCQkJCXRobWFyZ2luID0gR0FQOwotCQkJCXR2bWFyZ2luID0gR0FQOwotCQkJfQotCQkJaW50IHggPSBtYXJnaW5XaWR0aCArIHRobWFyZ2luOwotCQkJaW50IHkgPSBtYXJnaW5IZWlnaHQgKyB0dm1hcmdpbjsKLQkJCVBvaW50IHRzaXplID0gTlVMTF9TSVpFOwotCQkJUG9pbnQgdGNzaXplID0gTlVMTF9TSVpFOwotCQkJaWYgKHRvZ2dsZSAhPSBudWxsKQotCQkJCXRzaXplID0gdG9nZ2xlQ2FjaGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWludCB0d2lkdGggPSBjbGllbnRBcmVhLndpZHRoIC0gbWFyZ2luV2lkdGggLSBtYXJnaW5XaWR0aAotCQkJCQktIHRobWFyZ2luIC0gdGhtYXJnaW47Ci0JCQlpZiAodHNpemUueCA+IDApCi0JCQkJdHdpZHRoIC09IHRzaXplLnggKyBHQVA7Ci0JCQlpZiAodGV4dENsaWVudCAhPSBudWxsKQotCQkJCXRjc2l6ZSA9IHRleHRDbGllbnRDYWNoZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJaWYgKHRjc2l6ZS54ID4gMCkKLQkJCQl0d2lkdGggLT0gdGNzaXplLnggKyBHQVA7Ci0JCQlQb2ludCBzaXplID0gTlVMTF9TSVpFOwotCQkJaWYgKHRleHRMYWJlbCAhPSBudWxsKQotCQkJCXNpemUgPSB0ZXh0TGFiZWxDYWNoZS5jb21wdXRlU2l6ZSh0d2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJCWlmICh0ZXh0TGFiZWwgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCVBvaW50IGRlZlNpemUgPSB0ZXh0TGFiZWxDYWNoZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJCVNXVC5ERUZBVUxUKTsKLQkJCQlpZiAoZGVmU2l6ZS55ID09IHNpemUueSkgewotCQkJCQkvLyBPbmUgbGluZSAtIHBpY2sgdGhlIHNtYWxsZXIgb2YgdGhlIHR3byB3aWR0aHMKLQkJCQkJc2l6ZS54ID0gTWF0aC5taW4oZGVmU2l6ZS54LCBzaXplLngpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh0b2dnbGUgIT0gbnVsbCkgewotCQkJCUdDIGdjID0gbmV3IEdDKEV4cGFuZGFibGVDb21wb3NpdGUudGhpcyk7Ci0JCQkJZ2Muc2V0Rm9udChnZXRGb250KCkpOwotCQkJCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJCQlpbnQgdGV4dEhlaWdodCA9IGZtLmdldEhlaWdodCgpOwotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQlpZiAodGV4dENsaWVudCAhPSBudWxsCi0JCQkJCQkmJiAoZXhwYW5zaW9uU3R5bGUgJiBMRUZUX1RFWFRfQ0xJRU5UX0FMSUdOTUVOVCkgIT0gMCkgewotCQkJCQl0ZXh0SGVpZ2h0ID0gTWF0aC5tYXgodGV4dEhlaWdodCwgdGNzaXplLnkpOwotCQkJCX0KLQkJCQlpbnQgdHkgPSB0ZXh0SGVpZ2h0IC8gMiAtIHRzaXplLnkgLyAyICsgMTsKLQkJCQl0eSA9IE1hdGgubWF4KHR5LCAwKTsKLQkJCQl0eSArPSBtYXJnaW5IZWlnaHQgKyB0dm1hcmdpbjsKLQkJCQl0b2dnbGUuc2V0TG9jYXRpb24oeCwgdHkpOwotCQkJCXRvZ2dsZS5zZXRTaXplKHRzaXplKTsKLQkJCQl4ICs9IHRzaXplLnggKyBHQVA7Ci0JCQl9Ci0JCQlpZiAodGV4dExhYmVsICE9IG51bGwpIHsKLQkJCQlpbnQgdHkgPSB5OwotCQkJCWlmICh0ZXh0Q2xpZW50ICE9IG51bGwKLQkJCQkJCSYmIChleHBhbnNpb25TdHlsZSAmIExFRlRfVEVYVF9DTElFTlRfQUxJR05NRU5UKSAhPSAwKSB7Ci0JCQkJCWlmIChzaXplLnkgPCB0Y3NpemUueSkKLQkJCQkJCXR5ID0gdGNzaXplLnkgLyAyIC0gc2l6ZS55IC8gMiArIG1hcmdpbkhlaWdodAotCQkJCQkJCQkrIHR2bWFyZ2luOwotCQkJCX0KLQkJCQl0ZXh0TGFiZWxDYWNoZS5zZXRCb3VuZHMoeCwgdHksIHNpemUueCwgc2l6ZS55KTsKLQkJCX0KLQkJCWlmICh0ZXh0Q2xpZW50ICE9IG51bGwpIHsKLQkJCQlpbnQgdGN4OwotCQkJCWlmICgoZXhwYW5zaW9uU3R5bGUgJiBMRUZUX1RFWFRfQ0xJRU5UX0FMSUdOTUVOVCkgIT0gMCkgewotCQkJCQl0Y3ggPSB4ICsgc2l6ZS54ICsgR0FQOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRjeCA9IGNsaWVudEFyZWEud2lkdGggLSB0Y3NpemUueCAtIG1hcmdpbldpZHRoIC0gdGhtYXJnaW47Ci0JCQkJfQotCQkJCXRleHRDbGllbnRDYWNoZS5zZXRCb3VuZHModGN4LCB5LCB0Y3NpemUueCwgdGNzaXplLnkpOwotCQkJfQotCQkJaW50IHRiYXJIZWlnaHQgPSAwOwotCQkJaWYgKHNpemUueT4wKQotCQkJCXRiYXJIZWlnaHQgPSBzaXplLnk7Ci0JCQlpZiAodGNzaXplLnkgPiAwKQotCQkJCXRiYXJIZWlnaHQgPSBNYXRoLm1heCh0YmFySGVpZ2h0LCB0Y3NpemUueSk7Ci0JCQl5ICs9IHRiYXJIZWlnaHQ7Ci0JCQlpZiAoaGFzVGl0bGVCYXIoKSkKLQkJCQl5ICs9IHR2bWFyZ2luOwotCQkJaWYgKGdldFNlcGFyYXRvckNvbnRyb2woKSAhPSBudWxsKSB7Ci0JCQkJeSArPSBWU1BBQ0U7Ci0JCQkJZ2V0U2VwYXJhdG9yQ29udHJvbCgpLnNldEJvdW5kcyhtYXJnaW5XaWR0aCwgeSwKLQkJCQkJCWNsaWVudEFyZWEud2lkdGggLSBtYXJnaW5XaWR0aCAtIG1hcmdpbldpZHRoLAotCQkJCQkJU0VQQVJBVE9SX0hFSUdIVCk7Ci0JCQkJeSArPSBTRVBBUkFUT1JfSEVJR0hUOwotCQkJCWlmIChleHBhbmRlZCkKLQkJCQkJeSArPSBWU1BBQ0U7Ci0JCQl9Ci0JCQlpZiAoZXhwYW5kZWQpIHsKLQkJCQlpbnQgYXJlYVdpZHRoID0gY2xpZW50QXJlYS53aWR0aCAtIG1hcmdpbldpZHRoIC0gbWFyZ2luV2lkdGgKLQkJCQkJCS0gdGhtYXJnaW4gLSB0aG1hcmdpbjsKLQkJCQlpbnQgY3ggPSBtYXJnaW5XaWR0aCArIHRobWFyZ2luOwotCQkJCWlmICgoZXhwYW5zaW9uU3R5bGUgJiBDTElFTlRfSU5ERU5UKSAhPSAwKSB7Ci0JCQkJCWN4ID0geDsKLQkJCQkJYXJlYVdpZHRoIC09IHg7Ci0JCQkJfQotCQkJCWlmIChjbGllbnQgIT0gbnVsbCkgewotCQkJCQlQb2ludCBkc2l6ZSA9IG51bGw7Ci0JCQkJCUNvbnRyb2wgZGVzYyA9IGdldERlc2NyaXB0aW9uQ29udHJvbCgpOwotCQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlkc2l6ZSA9IGRlc2NyaXB0aW9uQ2FjaGUuY29tcHV0ZVNpemUoYXJlYVdpZHRoLAotCQkJCQkJCQlTV1QuREVGQVVMVCk7Ci0JCQkJCQlkZXNjcmlwdGlvbkNhY2hlLnNldEJvdW5kcyhjeCwgeSwgZHNpemUueCwgZHNpemUueSk7Ci0JCQkJCQl5ICs9IGRzaXplLnkgKyBjbGllbnRWZXJ0aWNhbFNwYWNpbmc7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl5ICs9IGNsaWVudFZlcnRpY2FsU3BhY2luZzsKLQkJCQkJCWlmIChnZXRTZXBhcmF0b3JDb250cm9sKCkhPW51bGwpCi0JCQkJCQkJeSAtPSBWU1BBQ0U7Ci0JCQkJCX0KLQkJCQkJaW50IGN3aWR0aCA9IGFyZWFXaWR0aDsKLQkJCQkJaW50IGNoZWlnaHQgPSBjbGllbnRBcmVhLmhlaWdodCAtIG1hcmdpbkhlaWdodAotCQkJCQkJCS0gbWFyZ2luSGVpZ2h0IC0geTsKLQkJCQkJY2xpZW50Q2FjaGUuc2V0Qm91bmRzKGN4LCB5LCBjd2lkdGgsIGNoZWlnaHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgd0hpbnQsIGludCBoSGludCwKLQkJCQlib29sZWFuIGNoYW5nZWQpIHsKLQkJCWluaXRDYWNoZShjaGFuZ2VkKTsKLQotCQkJaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKLQkJCVBvaW50IHRzaXplID0gTlVMTF9TSVpFOwotCQkJaW50IHR3aWR0aCA9IDA7Ci0JCQlpZiAodG9nZ2xlICE9IG51bGwpIHsKLQkJCQl0c2l6ZSA9IHRvZ2dsZUNhY2hlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJdHdpZHRoID0gdHNpemUueCArIEdBUDsKLQkJCX0KLQkJCWludCB0aG1hcmdpbiA9IDA7Ci0JCQlpbnQgdHZtYXJnaW4gPSAwOwotCi0JCQlpZiAoaGFzVGl0bGVCYXIoKSkgewotCQkJCXRobWFyZ2luID0gR0FQOwotCQkJCXR2bWFyZ2luID0gR0FQOwotCQkJfQotCQkJaW50IGlubmVyd0hpbnQgPSB3SGludDsgCi0JCQlpZiAoaW5uZXJ3SGludCAhPSBTV1QuREVGQVVMVCkKLQkJCQlpbm5lcndIaW50IC09IHR3aWR0aCArIG1hcmdpbldpZHRoICsgbWFyZ2luV2lkdGgKLQkJCQkrIHRobWFyZ2luICsgdGhtYXJnaW47Ci0KLQkJCWludCBpbm5lcnRIaW50ID0gaW5uZXJ3SGludDsKLQotCQkJUG9pbnQgdGNzaXplID0gTlVMTF9TSVpFOwotCQkJaWYgKHRleHRDbGllbnQgIT0gbnVsbCkgewotCQkJCXRjc2l6ZSA9IHRleHRDbGllbnRDYWNoZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWlmIChpbm5lcnRIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJCQlpbm5lcnRIaW50IC09IEdBUCArIHRjc2l6ZS54OwotCQkJfQotCQkJUG9pbnQgc2l6ZSA9IE5VTExfU0laRTsKLQotCQkJaWYgKHRleHRMYWJlbCAhPSBudWxsKQotCQkJCXNpemUgPSB0ZXh0TGFiZWxDYWNoZS5jb21wdXRlU2l6ZShpbm5lcnRIaW50LCBTV1QuREVGQVVMVCk7Ci0JCQlpZiAodGV4dExhYmVsIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQlQb2ludCBkZWZTaXplID0gdGV4dExhYmVsQ2FjaGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCQlTV1QuREVGQVVMVCk7Ci0JCQkJaWYgKGRlZlNpemUueSA9PSBzaXplLnkpIHsKLQkJCQkJLy8gT25lIGxpbmUgLSBwaWNrIHRoZSBzbWFsbGVyIG9mIHRoZSB0d28gd2lkdGhzCi0JCQkJCXNpemUueCA9IE1hdGgubWluKGRlZlNpemUueCwgc2l6ZS54KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2l6ZS54ID4gMCkKLQkJCQl3aWR0aCA9IHNpemUueDsKLQkJCWlmICh0Y3NpemUueD4wKQotCQkJCXdpZHRoICs9IEdBUCArIHRjc2l6ZS54OwotCQkJaGVpZ2h0ID0gdGNzaXplLnkgPiAwID8gTWF0aC5tYXgodGNzaXplLnksIHNpemUueSkgOiBzaXplLnk7Ci0JCQlpZiAoZ2V0U2VwYXJhdG9yQ29udHJvbCgpICE9IG51bGwpIHsKLQkJCQloZWlnaHQgKz0gVlNQQUNFICsgU0VQQVJBVE9SX0hFSUdIVDsKLQkJCQlpZiAoZXhwYW5kZWQgJiYgY2xpZW50ICE9IG51bGwpCi0JCQkJCWhlaWdodCArPSBWU1BBQ0U7Ci0JCQl9Ci0JCQlpZiAoaGFzVGl0bGVCYXIoKSkKLQkJCQloZWlnaHQgKz0gVlNQQUNFOwotCQkJaWYgKChleHBhbmRlZCB8fCAoZXhwYW5zaW9uU3R5bGUgJiBDT01QQUNUKSA9PSAwKSAmJiBjbGllbnQgIT0gbnVsbCkgewotCQkJCWludCBjd0hpbnQgPSB3SGludDsKLQotCQkJCWlmIChjd0hpbnQgIT0gU1dULkRFRkFVTFQpIHsKLQkJCQkJY3dIaW50IC09IG1hcmdpbldpZHRoICsgbWFyZ2luV2lkdGggKyB0aG1hcmdpbiArIHRobWFyZ2luOwotCQkJCQlpZiAoKGV4cGFuc2lvblN0eWxlICYgQ0xJRU5UX0lOREVOVCkgIT0gMCkKLQkJCQkJCWlmICh0Y3NpemUueD4wKQotCQkJCQkJCWN3SGludCAtPSB0d2lkdGg7Ci0JCQkJfQotCQkJCVBvaW50IGRzaXplID0gbnVsbDsKLQkJCQlQb2ludCBjc2l6ZSA9IGNsaWVudENhY2hlLmNvbXB1dGVTaXplKEZvcm1VdGlsLmdldFdpZHRoSGludCgKLQkJCQkJCWN3SGludCwgY2xpZW50KSwgU1dULkRFRkFVTFQpOwotCQkJCWlmIChnZXREZXNjcmlwdGlvbkNvbnRyb2woKSAhPSBudWxsKSB7Ci0JCQkJCWludCBkd0hpbnQgPSBjd0hpbnQ7Ci0JCQkJCWlmIChkd0hpbnQgPT0gU1dULkRFRkFVTFQpIHsKLQkJCQkJCWR3SGludCA9IGNzaXplLng7Ci0JCQkJCQlpZiAoKGV4cGFuc2lvblN0eWxlICYgQ0xJRU5UX0lOREVOVCkgIT0gMCkKLQkJCQkJCQlkd0hpbnQgLT0gdHdpZHRoOwotCQkJCQl9Ci0JCQkJCWRzaXplID0gZGVzY3JpcHRpb25DYWNoZS5jb21wdXRlU2l6ZShkd0hpbnQsIFNXVC5ERUZBVUxUKTsKLQkJCQl9Ci0JCQkJaWYgKGRzaXplICE9IG51bGwpIHsKLQkJCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgZHNpemUueCk7Ci0JCQkJCWlmIChleHBhbmRlZCkKLQkJCQkJCWhlaWdodCArPSBkc2l6ZS55ICsgY2xpZW50VmVydGljYWxTcGFjaW5nOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWhlaWdodCArPSBjbGllbnRWZXJ0aWNhbFNwYWNpbmc7Ci0JCQkJCWlmIChnZXRTZXBhcmF0b3JDb250cm9sKCkhPW51bGwpCi0JCQkJCQloZWlnaHQgLT0gVlNQQUNFOwotCQkJCX0KLQkJCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjc2l6ZS54KTsKLQkJCQlpZiAoZXhwYW5kZWQpCi0JCQkJCWhlaWdodCArPSBjc2l6ZS55OwotCQkJfQotCQkJaWYgKHRvZ2dsZSAhPSBudWxsKSB7Ci0JCQkJaGVpZ2h0ID0gaGVpZ2h0IC0gc2l6ZS55ICsgTWF0aC5tYXgoc2l6ZS55LCB0c2l6ZS55KTsKLQkJCQl3aWR0aCArPSB0d2lkdGg7Ci0JCQl9Ci0JCQkKLQkJCVBvaW50IHJlc3VsdCA9IG5ldyBQb2ludCh3aWR0aCArIG1hcmdpbldpZHRoICsgbWFyZ2luV2lkdGgKLQkJCQkJKyB0aG1hcmdpbiArIHRobWFyZ2luLCBoZWlnaHQgKyBtYXJnaW5IZWlnaHQgKyBtYXJnaW5IZWlnaHQKLQkJCQkJKyB0dm1hcmdpbiArIHR2bWFyZ2luKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXB1dGVNaW5pbXVtV2lkdGgoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JCQkvKgotCQkJaW5pdENhY2hlKGNoYW5nZWQpOwotCi0JCQlpbnQgd2lkdGggPSAwOwotCQkJUG9pbnQgc2l6ZSA9IE5VTExfU0laRTsKLQkJCWlmICh0ZXh0TGFiZWwgIT0gbnVsbCkKLQkJCQlzaXplID0gdGV4dExhYmVsQ2FjaGUuY29tcHV0ZVNpemUoNSwgU1dULkRFRkFVTFQpOwotCQkJUG9pbnQgdGNzaXplID0gTlVMTF9TSVpFOwotCQkJaWYgKHRleHRDbGllbnQgIT0gbnVsbCkgewotCQkJCXRjc2l6ZSA9IHRleHRDbGllbnRDYWNoZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJfQotCQkJaW50IHRobWFyZ2luID0gMDsKLQotCQkJaWYgKGhhc1RpdGxlQmFyKCkpIHsKLQkJCQl0aG1hcmdpbiA9IEdBUDsKLQkJCX0KLQkJCWlmIChzaXplLnggPiAwKQotCQkJCXdpZHRoID0gc2l6ZS54OwotCQkJaWYgKHRjc2l6ZS54ID4gMCkKLQkJCQl3aWR0aCArPSBHQVAgKyB0Y3NpemUueDsKLQotCQkJaWYgKChleHBhbmRlZCB8fCAoZXhwYW5zaW9uU3R5bGUgJiBDT01QQUNUKSA9PSAwKSAmJiBjbGllbnQgIT0gbnVsbCkgewotCQkJCVBvaW50IGRzaXplID0gbnVsbDsKLQkJCQlpZiAoZ2V0RGVzY3JpcHRpb25Db250cm9sKCkgIT0gbnVsbCkgewotCQkJCQlkc2l6ZSA9IGRlc2NyaXB0aW9uQ2FjaGUuY29tcHV0ZVNpemUoNSwgU1dULkRFRkFVTFQpOwotCQkJCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBkc2l6ZS54KTsKLQkJCQl9Ci0JCQkJaW50IGN3aWR0aCA9IEZvcm1VdGlsLmNvbXB1dGVNaW5pbXVtV2lkdGgoY2xpZW50LCBjaGFuZ2VkKTsKLQkJCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjd2lkdGgpOwotCQkJfQotCQkJaWYgKHRvZ2dsZSAhPSBudWxsKSB7Ci0JCQkJUG9pbnQgdHNpemUgPSB0b2dnbGVDYWNoZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCXdpZHRoICs9IHRzaXplLnggKyBHQVA7Ci0JCQl9Ci0JCQlyZXR1cm4gd2lkdGggKyBtYXJnaW5XaWR0aCArIG1hcmdpbldpZHRoICsgdGhtYXJnaW4gKyB0aG1hcmdpbjsKLQkJCSovCi0JCQlyZXR1cm4gY29tcHV0ZVNpemUocGFyZW50LCAwLCBTV1QuREVGQVVMVCwgY2hhbmdlZCkueDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMucGFydHMuSUxheW91dEV4dGVuc2lvbiNjb21wdXRlTWluaW11bVdpZHRoKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIGludCBjb21wdXRlTWF4aW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQkJLyoKLQotCQkJaW5pdENhY2hlKGNoYW5nZWQpOwotCi0JCQlpbnQgd2lkdGggPSAwOwotCQkJUG9pbnQgc2l6ZSA9IE5VTExfU0laRTsKLQkJCWlmICh0ZXh0TGFiZWwgIT0gbnVsbCkKLQkJCQlzaXplID0gdGV4dExhYmVsQ2FjaGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCVBvaW50IHRjc2l6ZSA9IE5VTExfU0laRTsKLQkJCWludCB0aG1hcmdpbiA9IDA7Ci0KLQkJCWlmIChoYXNUaXRsZUJhcigpKSB7Ci0JCQkJdGhtYXJnaW4gPSBHQVA7Ci0JCQl9Ci0JCQlpZiAodGV4dENsaWVudCAhPSBudWxsKSB7Ci0JCQkJdGNzaXplID0gdGV4dENsaWVudENhY2hlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQl9Ci0JCQlpZiAoc2l6ZS54ID4gMCkKLQkJCQl3aWR0aCA9IHNpemUueDsKLQkJCWlmICh0Y3NpemUueCA+IDApCi0JCQkJd2lkdGggKz0gR0FQICsgdGNzaXplLng7Ci0JCQlpZiAoKGV4cGFuZGVkIHx8IChleHBhbnNpb25TdHlsZSAmIENPTVBBQ1QpID09IDApICYmIGNsaWVudCAhPSBudWxsKSB7Ci0JCQkJUG9pbnQgZHNpemUgPSBudWxsOwotCQkJCWlmIChnZXREZXNjcmlwdGlvbkNvbnRyb2woKSAhPSBudWxsKSB7Ci0JCQkJCWRzaXplID0gZGVzY3JpcHRpb25DYWNoZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJCQlTV1QuREVGQVVMVCk7Ci0JCQkJCXdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGRzaXplLngpOwotCQkJCX0KLQkJCQlpbnQgY3dpZHRoID0gRm9ybVV0aWwuY29tcHV0ZU1heGltdW1XaWR0aChjbGllbnQsIGNoYW5nZWQpOwotCQkJCXdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGN3aWR0aCk7Ci0JCQl9Ci0JCQlpZiAodG9nZ2xlICE9IG51bGwpIHsKLQkJCQlQb2ludCB0c2l6ZSA9IHRvZ2dsZUNhY2hlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJd2lkdGggKz0gdHNpemUueCArIEdBUDsKLQkJCX0KLQkJCXJldHVybiB3aWR0aCArIG1hcmdpbldpZHRoICsgbWFyZ2luV2lkdGggKyB0aG1hcmdpbiArIHRobWFyZ2luOwotCQkJKi8KLQkJCXJldHVybiBjb21wdXRlU2l6ZShwYXJlbnQsIFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCkueDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZXhwYW5kYWJsZSBjb21wb3NpdGUgdXNpbmcgYSBUV0lTVElFIHRvZ2dsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgU1dUIHN0eWxlIGJpdHMKLQkgKi8KLQlwdWJsaWMgRXhwYW5kYWJsZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJdGhpcyhwYXJlbnQsIHN0eWxlLCBUV0lTVElFKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleHBhbmRhYmxlIGNvbXBvc2l0ZSBpbiB0aGUgcHJvdmlkZWQgcGFyZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250cm9sIHN0eWxlCi0JICogQHBhcmFtIGV4cGFuc2lvblN0eWxlCi0JICogICAgICAgICAgICB0aGUgc3R5bGUgb2YgdGhlIGV4cGFuc2lvbiB3aWRnZXQgKFRSRUVfTk9ERSwgVFdJU1RJRSwKLQkgKiAgICAgICAgICAgIENMSUVOVF9JTkRFTlQsIENPTVBBQ1QsIEZPQ1VTX1RJVExFKQotCSAqLwotCXB1YmxpYyBFeHBhbmRhYmxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgaW50IGV4cGFuc2lvblN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQl0aGlzLmV4cGFuc2lvblN0eWxlID0gZXhwYW5zaW9uU3R5bGU7Ci0JCXN1cGVyLnNldExheW91dChuZXcgRXhwYW5kYWJsZUxheW91dCgpKTsKLQkJbGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotCQlpZiAoaGFzVGl0bGVCYXIoKSkgewotCQkJdGhpcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJb25QYWludChlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoKGV4cGFuc2lvblN0eWxlICYgVFdJU1RJRSkgIT0gMCkKLQkJCXRvZ2dsZSA9IG5ldyBUd2lzdGllKHRoaXMsIFNXVC5OVUxMKTsKLQkJZWxzZSBpZiAoKGV4cGFuc2lvblN0eWxlICYgVFJFRV9OT0RFKSAhPSAwKQotCQkJdG9nZ2xlID0gbmV3IFRyZWVOb2RlKHRoaXMsIFNXVC5OVUxMKTsKLQkJZWxzZQotCQkJZXhwYW5kZWQgPSB0cnVlOwotCQlpZiAoKGV4cGFuc2lvblN0eWxlICYgRVhQQU5ERUQpICE9IDApCi0JCQlleHBhbmRlZCA9IHRydWU7Ci0JCWlmICh0b2dnbGUgIT0gbnVsbCkgewotCQkJdG9nZ2xlLnNldEV4cGFuZGVkKGV4cGFuZGVkKTsKLQkJCXRvZ2dsZS5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQkJdG9nZ2xlU3RhdGUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXRvZ2dsZS5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJaWYgKHRleHRMYWJlbCBpbnN0YW5jZW9mIExhYmVsICYmICFpc0ZpeGVkU3R5bGUoKSkKLQkJCQkJCXRleHRMYWJlbC5zZXRGb3JlZ3JvdW5kKHRvZ2dsZS5ob3ZlciA/IHRvZ2dsZQotCQkJCQkJCQkuZ2V0SG92ZXJEZWNvcmF0aW9uQ29sb3IoKSA6IGdldFRpdGxlQmFyRm9yZWdyb3VuZCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXRvZ2dsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuQVJST1dfVVApIHsKLQkJCQkJCXZlcnRpY2FsTW92ZShmYWxzZSk7Ci0JCQkJCQllLmRvaXQ9ZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZS5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSB7Ci0JCQkJCQl2ZXJ0aWNhbE1vdmUodHJ1ZSk7Ci0JCQkJCQllLmRvaXQ9ZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoKGV4cGFuc2lvblN0eWxlICYgRk9DVVNfVElUTEUpICE9IDApIHsKLQkJCUh5cGVybGluayBsaW5rID0gbmV3IEh5cGVybGluayh0aGlzLCBTV1QuV1JBUCk7Ci0JCQlsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCQlwcm9ncmFtbWF0aWNUb2dnbGVTdGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJdGV4dExhYmVsID0gbGluazsKLQkJfSBlbHNlIGlmICgoZXhwYW5zaW9uU3R5bGUgJiBOT19USVRMRSkgPT0gMCkgewotCQkJZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOwotCQkJaWYgKCFpc0ZpeGVkU3R5bGUoKSkgewotCQkJCWxhYmVsLnNldEN1cnNvcihGb3Jtc1Jlc291cmNlcy5nZXRIYW5kQ3Vyc29yKCkpOwotCQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlzd2l0Y2ggKGUudHlwZSkgewotCQkJCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQkJCWlmICh0b2dnbGUgIT0gbnVsbCkKLQkJCQkJCQkJdG9nZ2xlLnNldEZvY3VzKCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNXVC5Nb3VzZVVwOgotCQkJCQkJCWxhYmVsLnNldEN1cnNvcihGb3Jtc1Jlc291cmNlcy5nZXRCdXN5Q3Vyc29yKCkpOwotCQkJCQkJCXByb2dyYW1tYXRpY1RvZ2dsZVN0YXRlKCk7Ci0JCQkJCQkJbGFiZWwuc2V0Q3Vyc29yKEZvcm1zUmVzb3VyY2VzLmdldEhhbmRDdXJzb3IoKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNXVC5Nb3VzZUVudGVyOgotCQkJCQkJCWlmICh0b2dnbGUgIT0gbnVsbCkgewotCQkJCQkJCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKHRvZ2dsZQotCQkJCQkJCQkJCS5nZXRIb3ZlckRlY29yYXRpb25Db2xvcigpKTsKLQkJCQkJCQkJdG9nZ2xlLmhvdmVyID0gdHJ1ZTsKLQkJCQkJCQkJdG9nZ2xlLnJlZHJhdygpOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1dULk1vdXNlRXhpdDoKLQkJCQkJCQlpZiAodG9nZ2xlICE9IG51bGwpIHsKLQkJCQkJCQkJbGFiZWwuc2V0Rm9yZWdyb3VuZChnZXRUaXRsZUJhckZvcmVncm91bmQoKSk7Ci0JCQkJCQkJCXRvZ2dsZS5ob3ZlciA9IGZhbHNlOwotCQkJCQkJCQl0b2dnbGUucmVkcmF3KCk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCQlsYWJlbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0JCQkJbGFiZWwuYWRkTGlzdGVuZXIoU1dULk1vdXNlVXAsIGxpc3RlbmVyKTsKLQkJCQlsYWJlbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VFbnRlciwgbGlzdGVuZXIpOwotCQkJCWxhYmVsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZUV4aXQsIGxpc3RlbmVyKTsKLQkJCX0KLQkJCXRleHRMYWJlbCA9IGxhYmVsOwotCQl9Ci0JCWlmICh0ZXh0TGFiZWwgIT0gbnVsbCkgewotCQkJdGV4dExhYmVsLnNldE1lbnUoZ2V0TWVudSgpKTsKLQkJCXRleHRMYWJlbC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQkJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9NTkVNT05JQykgewotCQkJCQkJLy8gc3RlYWwgdGhlIG1uZW1vbmljCi0JCQkJCQlpZiAoIWlzVmlzaWJsZSgpIHx8ICFpc0VuYWJsZWQoKSkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlpZiAoRm9ybVV0aWwubW5lbW9uaWNNYXRjaChnZXRUZXh0KCksIGUuY2hhcmFjdGVyKSkgewotCQkJCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQkJCXByb2dyYW1tYXRpY1RvZ2dsZVN0YXRlKCk7Ci0JCQkJCQkJc2V0Rm9jdXMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGVzICdzdXBlcicgdG8gcGFzcyB0aGUgbWVudSB0byB0aGUgdGV4dCBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gbWVudQotCSAqICAgICAgICAgICAgdGhlIG1lbnUgZnJvbSB0aGUgcGFyZW50IHRvIGF0dGFjaCB0byB0aGlzIGNvbnRyb2wuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRNZW51KE1lbnUgbWVudSkgewotCQlpZiAodGV4dExhYmVsICE9IG51bGwpCi0JCQl0ZXh0TGFiZWwuc2V0TWVudShtZW51KTsKLQkJc3VwZXIuc2V0TWVudShtZW51KTsKLQl9Ci0KLQkvKioKLQkgKiBQcmV2ZW50cyBhc3NpZ25tZW50IG9mIHRoZSBsYXlvdXQgbWFuYWdlciAtIGV4cGFuZGFibGUgY29tcG9zaXRlIHVzZXMgaXRzCi0JICogb3duIGxheW91dC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRMYXlvdXQoTGF5b3V0IGxheW91dCkgewotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgb2YgYWxsIHRoZSBjdXN0b20gY29udHJvbHMgaW4gdGhlIGV4cGFuZGFibGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBiZykgewotCQlzdXBlci5zZXRCYWNrZ3JvdW5kKGJnKTsKLQkJaWYgKHRleHRMYWJlbCAhPSBudWxsKQotCQkJdGV4dExhYmVsLnNldEJhY2tncm91bmQoYmcpOwotCQlpZiAodG9nZ2xlICE9IG51bGwpCi0JCQl0b2dnbGUuc2V0QmFja2dyb3VuZChiZyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBvZiBhbGwgdGhlIGN1c3RvbSBjb250cm9scyBpbiB0aGUgZXhwYW5kYWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIGZnKSB7Ci0JCXN1cGVyLnNldEZvcmVncm91bmQoZmcpOwotCQlpZiAodGV4dExhYmVsICE9IG51bGwpCi0JCQl0ZXh0TGFiZWwuc2V0Rm9yZWdyb3VuZChmZyk7Ci0JCWlmICh0b2dnbGUgIT0gbnVsbCkKLQkJCXRvZ2dsZS5zZXRGb3JlZ3JvdW5kKGZnKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb2xvciBvZiB0aGUgdG9nZ2xlIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGMKLQkgKiAgICAgICAgICAgIHRoZSBjb2xvciBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb2dnbGVDb2xvcihDb2xvciBjKSB7Ci0JCWlmICh0b2dnbGUgIT0gbnVsbCkKLQkJCXRvZ2dsZS5zZXREZWNvcmF0aW9uQ29sb3IoYyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aXZlIGNvbG9yIG9mIHRoZSB0b2dnbGUgY29udHJvbCAod2hlbiB0aGUgbW91c2UgZW50ZXJzIHRoZQotCSAqIHRvZ2dsZSBhcmVhKS4KLQkgKiAKLQkgKiBAcGFyYW0gYwotCSAqICAgICAgICAgICAgdGhlIGFjdGl2ZSBjb2xvciBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVUb2dnbGVDb2xvcihDb2xvciBjKSB7Ci0JCWlmICh0b2dnbGUgIT0gbnVsbCkKLQkJCXRvZ2dsZS5zZXRIb3ZlckRlY29yYXRpb25Db2xvcihjKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb250cyBvZiBhbGwgdGhlIGN1c3RvbSBjb250cm9scyBpbiB0aGUgZXhwYW5kYWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgewotCQlzdXBlci5zZXRGb250KGZvbnQpOwotCQlpZiAodGV4dExhYmVsICE9IG51bGwpCi0JCQl0ZXh0TGFiZWwuc2V0Rm9udChmb250KTsKLQkJaWYgKHRvZ2dsZSAhPSBudWxsKQotCQkJdG9nZ2xlLnNldEZvbnQoZm9udCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2xpZW50IG9mIHRoaXMgZXhwYW5kYWJsZSBjb21wb3NpdGUuIFRoZSBjbGllbnQgbXVzdCBub3QgYmUKLQkgKiA8c2FtcD5udWxsIDwvc2FtcD4gYW5kIG11c3QgYmUgYSBkaXJlY3QgY2hpbGQgb2YgdGhpcyBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGNsaWVudAotCSAqICAgICAgICAgICAgdGhlIGNsaWVudCB0aGF0IHdpbGwgYmUgZXhwYW5kZWQgb3IgY29sbGFwc2VkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50KENvbnRyb2wgY2xpZW50KSB7Ci0JCUFzc2VydC5pc1RydWUoY2xpZW50ICE9IG51bGwgJiYgY2xpZW50LmdldFBhcmVudCgpLmVxdWFscyh0aGlzKSk7Ci0JCXRoaXMuY2xpZW50ID0gY2xpZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgZXhwYW5kYWJsZSBjbGllbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgY2xpZW50IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDbGllbnQoKSB7Ci0JCXJldHVybiBjbGllbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIGV4cGFuZGFibGUgY29tcG9zaXRlLiBUaGUgdGl0bGUgd2lsbCBhY3QgYXMgYQotCSAqIGh5cGVybGluayBhbmQgYWN0aXZhdGluZyBpdCB3aWxsIHRvZ2dsZSB0aGUgY2xpZW50IGJldHdlZW4gZXhwYW5kZWQgYW5kCi0JICogY29sbGFwc2VkIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB0aXRsZSBzdHJpbmcKLQkgKiBAc2VlICNnZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0aXRsZSkgewotCQlpZiAodGV4dExhYmVsIGluc3RhbmNlb2YgTGFiZWwpCi0JCQkoKExhYmVsKSB0ZXh0TGFiZWwpLnNldFRleHQodGl0bGUpOwotCQllbHNlIGlmICh0ZXh0TGFiZWwgaW5zdGFuY2VvZiBIeXBlcmxpbmspCi0JCQkoKEh5cGVybGluaykgdGV4dExhYmVsKS5zZXRUZXh0KHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aXRsZSBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgdGl0bGUgc3RyaW5nCi0JICogQHNlZSAjc2V0VGV4dChTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlpZiAodGV4dExhYmVsIGluc3RhbmNlb2YgTGFiZWwpCi0JCQlyZXR1cm4gKChMYWJlbCkgdGV4dExhYmVsKS5nZXRUZXh0KCk7Ci0JCWVsc2UgaWYgKHRleHRMYWJlbCBpbnN0YW5jZW9mIEh5cGVybGluaykKLQkJCXJldHVybiAoKEh5cGVybGluaykgdGV4dExhYmVsKS5nZXRUZXh0KCk7Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoZSBleHBhbmRlZCBzdGF0ZSBvZiB0aGUgY29tcG9zaXRlLgotCSAqIAotCSAqIEByZXR1cm4gPHNhbXA+dHJ1ZSA8L3NhbXA+IGlmIGV4cGFuZGVkLCA8c2FtcD5mYWxzZSA8L3NhbXA+IGlmIGNvbGxhcHNlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZGVkKCkgewotCQlyZXR1cm4gZXhwYW5kZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYml0d2lzZS1PUmVkIHN0eWxlIGJpdHMgZm9yIHRoZSBleHBhbnNpb24gY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiaXR3aXNlLU9SZWQgc3R5bGUgYml0cyBmb3IgdGhlIGV4cGFuc2lvbiBjb250cm9sCi0JICovCi0JcHVibGljIGludCBnZXRFeHBhbnNpb25TdHlsZSgpIHsKLQkJcmV0dXJuIGV4cGFuc2lvblN0eWxlOwotCX0KLQotCS8qKgotCSAqIFByb2dyYW1tYXRpY2FsbHkgY2hhbmdlcyBleHBhbmRlZCBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwYW5kZWQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgZXhwYW5kZWQgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGV4cGFuZGVkKSB7Ci0JCWludGVybmFsU2V0RXhwYW5kZWQoZXhwYW5kZWQpOwotCQlpZiAodG9nZ2xlICE9IG51bGwpCi0JCQl0b2dnbGUuc2V0RXhwYW5kZWQoZXhwYW5kZWQpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBleHBhbnNpb24gc3RhdGUgY2hhbmdlIGZvciB0aGUgZXhwYW5kYWJsZSBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBleHBhbmRlZAotCSAqICAgICAgICAgICAgdGhlIGV4cGFuc2lvbiBzdGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsU2V0RXhwYW5kZWQoYm9vbGVhbiBleHBhbmRlZCkgewotCQlpZiAodGhpcy5leHBhbmRlZCAhPSBleHBhbmRlZCkgewotCQkJdGhpcy5leHBhbmRlZCA9IGV4cGFuZGVkOwotCQkJaWYgKGdldERlc2NyaXB0aW9uQ29udHJvbCgpICE9IG51bGwpCi0JCQkJZ2V0RGVzY3JpcHRpb25Db250cm9sKCkuc2V0VmlzaWJsZShleHBhbmRlZCk7Ci0JCQlpZiAoY2xpZW50ICE9IG51bGwpCi0JCQkJY2xpZW50LnNldFZpc2libGUoZXhwYW5kZWQpOwotCQkJbGF5b3V0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgZXhwYW5zaW9uIHN0YXRlIGNoYW5nZXMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXhwYW5zaW9uTGlzdGVuZXIoSUV4cGFuc2lvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGV4cGFuc2lvbiBsaXN0ZW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0bmVyIHRvIHJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUV4cGFuc2lvbkxpc3RlbmVyKElFeHBhbnNpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0b2dnbGVTdGF0ZSgpIHsKLQkJYm9vbGVhbiBuZXdTdGF0ZSA9ICFpc0V4cGFuZGVkKCk7Ci0JCWZpcmVFeHBhbmRpbmcobmV3U3RhdGUsIHRydWUpOwotCQlpbnRlcm5hbFNldEV4cGFuZGVkKG5ld1N0YXRlKTsKLQkJZmlyZUV4cGFuZGluZyhuZXdTdGF0ZSwgZmFsc2UpOwotCQlpZiAobmV3U3RhdGUpCi0JCQlGb3JtVXRpbC5lbnN1cmVWaXNpYmxlKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIElmIFRJVExFX0JBUiBvciBTSE9SVF9USVRMRV9CQVIgc3R5bGUgaXMgdXNlZCwgdGl0bGUgYmFyIGRlY29yYXRpb24gd2lsbAotCSAqIGJlIHBhaW50ZWQgYmVoaW5kIHRoZSB0ZXh0IGluIHRoaXMgbWV0aG9kLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCSAqIGRvZXMgbm90aGluZyAtIHN1YmNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvciByZW5kZXJpbmcgdGhlIHRpdGxlIGFyZWEuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBwYWludCBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9uUGFpbnQoUGFpbnRFdmVudCBlKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVFeHBhbmRpbmcoYm9vbGVhbiBzdGF0ZSwgYm9vbGVhbiBiZWZvcmUpIHsKLQkJaW50IHNpemUgPSBsaXN0ZW5lcnMuc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuOwotCQlFeHBhbnNpb25FdmVudCBlID0gbmV3IEV4cGFuc2lvbkV2ZW50KHRoaXMsIHN0YXRlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlFeHBhbnNpb25MaXN0ZW5lciBsaXN0ZW5lciA9IChJRXhwYW5zaW9uTGlzdGVuZXIpIGxpc3RlbmVycy5nZXQoaSk7Ci0JCQlpZiAoYmVmb3JlKQotCQkJCWxpc3RlbmVyLmV4cGFuc2lvblN0YXRlQ2hhbmdpbmcoZSk7Ci0JCQllbHNlCi0JCQkJbGlzdGVuZXIuZXhwYW5zaW9uU3RhdGVDaGFuZ2VkKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBkZXNjcmlwdGlvbiBjb250cm9sIHRoYXQgd2lsbCBiZSBwbGFjZWQgdW5kZXIgdGhlIHRpdGxlIGlmCi0JICogcHJlc2VudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBjb250cm9sIG9yIDxzYW1wPm51bGwgPC9zYW1wPiBpZiBub3QgdXNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXREZXNjcmlwdGlvbkNvbnRyb2woKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcGFyYXRvciBjb250cm9sIHRoYXQgd2lsbCBiZSBwbGFjZWQgYmV0d2VlbiB0aGUgdGl0bGUgYW5kCi0JICogdGhlIGRlc2NyaXB0aW9uIGlmIHByZXNlbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VwYXJhdG9yIGNvbnRyb2wgb3IgPHNhbXA+bnVsbCA8L3NhbXA+IGlmIG5vdCB1c2VkLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGdldFNlcGFyYXRvckNvbnRyb2woKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBzaXplIG9mIHRoZSBleHBhbmRhYmxlIGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSNjb21wdXRlU2l6ZQotCSAqLwotCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JCWNoZWNrV2lkZ2V0KCk7Ci0JCVBvaW50IHNpemU7Ci0JCUV4cGFuZGFibGVMYXlvdXQgbGF5b3V0ID0gKEV4cGFuZGFibGVMYXlvdXQpIGdldExheW91dCgpOwotCQlpZiAod0hpbnQgPT0gU1dULkRFRkFVTFQgfHwgaEhpbnQgPT0gU1dULkRFRkFVTFQpIHsKLQkJCXNpemUgPSBsYXlvdXQuY29tcHV0ZVNpemUodGhpcywgd0hpbnQsIGhIaW50LCBjaGFuZ2VkKTsKLQkJfSBlbHNlIHsKLQkJCXNpemUgPSBuZXcgUG9pbnQod0hpbnQsIGhIaW50KTsKLQkJfQotCQlSZWN0YW5nbGUgdHJpbSA9IGNvbXB1dGVUcmltKDAsIDAsIHNpemUueCwgc2l6ZS55KTsKLQkJcmV0dXJuIG5ldyBQb2ludCh0cmltLndpZHRoLCB0cmltLmhlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8c2FtcD50cnVlIDwvc2FtcD4gaWYgdGhlIGNvbXBvc2l0ZSBpcyBmaXhlZCBpLmUuIGNhbm5vdCBiZQotCSAqIGV4cGFuZGVkIG9yIGNvbGxhcHNlZC4gRml4ZWQgY29udHJvbCB3aWxsIHN0aWxsIGNvbnRhaW4gdGhlIHRpdGxlLAotCSAqIHNlcGFyYXRvciBhbmQgZGVzY3JpcHRpb24gKGlmIHByZXNlbnQpIGFzIHdlbGwgYXMgdGhlIGNsaWVudCwgYnV0IHdpbGwgYmUKLQkgKiBpbiB0aGUgcGVybWFuZW50IGV4cGFuZGVkIHN0YXRlIGFuZCB0aGUgdG9nZ2xlIGFmZm9yZGFuY2Ugd2lsbCBub3QgYmUKLQkgKiBzaG93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxzYW1wPnRydWUgPC9zYW1wPiBpZiB0aGUgY29udHJvbCBpcyBmaXhlZCBpbiB0aGUgZXhwYW5kZWQgc3RhdGUsCi0JICogICAgICAgICA8c2FtcD5mYWxzZSA8L3NhbXA+IGlmIGl0IGNhbiBiZSBjb2xsYXBzZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGaXhlZFN0eWxlKCkgewotCQlyZXR1cm4gKGV4cGFuc2lvblN0eWxlICYgVFdJU1RJRSkgPT0gMAotCQkJCSYmIChleHBhbnNpb25TdHlsZSAmIFRSRUVfTk9ERSkgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGNsaWVudCBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGV4dCBjbGllbnQgY29udHJvbCBpZiBzcGVjaWZpZWQsIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QuCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0VGV4dENsaWVudCgpIHsKLQkJcmV0dXJuIHRleHRDbGllbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGV4dCBjbGllbnQgY29udHJvbC4gVGV4dCBjbGllbnQgaXMgYSBjb250cm9sIHRoYXQgaXMgYSBjaGlsZCBvZgotCSAqIHRoZSBleHBhbmRhYmxlIGNvbXBvc2l0ZSBhbmQgaXMgcGxhY2VkIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dC4gSXQgY2FuCi0JICogYmUgdXNlZCB0byBwbGFjZSBzbWFsbCBpbWFnZSBoeXBlcmxpbmtzLiBJZiBtb3JlIHRoYW4gb25lIGNvbnRyb2wgaXMKLQkgKiBuZWVkZWQsIHVzZSBDb21wb3NpdGUgdG8gaG9sZCB0aGVtLiBDYXJlIHNob3VsZCBiZSB0YWtlbiB0aGF0IHRoZSBoZWlnaHQKLQkgKiBvZiB0aGUgY29udHJvbCBpcyBjb21wYXJhYmxlIHRvIHRoZSBoZWlnaHQgb2YgdGhlIHRleHQuCi0JICogCi0JICogQHBhcmFtIHRleHRDbGllbnQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0Q2xpZW50IHRvIHNldCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgbmVlZGVkIGFueQotCSAqICAgICAgICAgICAgbW9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0Q2xpZW50KENvbnRyb2wgdGV4dENsaWVudCkgewotCQlpZiAodGhpcy50ZXh0Q2xpZW50ICE9IG51bGwpCi0JCQl0aGlzLnRleHRDbGllbnQuZGlzcG9zZSgpOwotCQl0aGlzLnRleHRDbGllbnQgPSB0ZXh0Q2xpZW50OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc1RpdGxlQmFyKCkgewotCQlyZXR1cm4gKGdldEV4cGFuc2lvblN0eWxlKCkgJiBUSVRMRV9CQVIpICE9IDAKLQkJCQl8fCAoZ2V0RXhwYW5zaW9uU3R5bGUoKSAmIFNIT1JUX1RJVExFX0JBUikgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb2xvciBvZiB0aGUgdGl0bGUgYmFyIGZvcmVncm91bmQgd2hlbiBUSVRMRV9CQVIgc3R5bGUgaXMgdXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IKLQkgKiAgICAgICAgICAgIHRoZSB0aXRsZSBiYXIgZm9yZWdyb3VuZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlQmFyRm9yZWdyb3VuZChDb2xvciBjb2xvcikgewotCQl0aXRsZUJhckZvcmVncm91bmQ9IGNvbG9yOwotCQl0ZXh0TGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGl0bGUgYmFyIGZvcmVncm91bmQgd2hlbiBUSVRMRV9CQVIgc3R5bGUgaXMgdXNlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aXRsZSBiYXIgZm9yZWdyb3VuZAotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRUaXRsZUJhckZvcmVncm91bmQoKSB7Ci0JCXJldHVybiB0aXRsZUJhckZvcmVncm91bmQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcnRpY2FsTW92ZShib29sZWFuIGRvd24pIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IGdldFBhcmVudCgpOwotCQlDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJaWYgKGNoaWxkID09IHRoaXMpIHsKLQkJCQlFeHBhbmRhYmxlQ29tcG9zaXRlIHNpYmxpbmcgPSBnZXRTaWJsaW5nKGNoaWxkcmVuLCBpLCBkb3duKTsKLQkJCQlpZiAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcudG9nZ2xlICE9IG51bGwpIHsKLQkJCQkJc2libGluZy5zZXRGb2N1cygpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgRXhwYW5kYWJsZUNvbXBvc2l0ZSBnZXRTaWJsaW5nKENvbnRyb2xbXSBjaGlsZHJlbiwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBkb3duKSB7Ci0JCWludCBsb2MgPSBkb3duID8gaW5kZXggKyAxIDogaW5kZXggLSAxOwotCQl3aGlsZSAobG9jID49IDAgJiYgbG9jIDwgY2hpbGRyZW4ubGVuZ3RoKSB7Ci0JCQlDb250cm9sIGMgPSBjaGlsZHJlbltsb2NdOwotCQkJaWYgKGMgaW5zdGFuY2VvZiBFeHBhbmRhYmxlQ29tcG9zaXRlICYmIGMuaXNWaXNpYmxlKCkpCi0JCQkJcmV0dXJuIChFeHBhbmRhYmxlQ29tcG9zaXRlKSBjOwotCQkJbG9jID0gZG93biA/IGxvYyArIDEgOiBsb2MgLSAxOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9ncmFtbWF0aWNUb2dnbGVTdGF0ZSgpIHsKLQkJaWYgKHRvZ2dsZSAhPSBudWxsKQotCQkJdG9nZ2xlLnNldEV4cGFuZGVkKCF0b2dnbGUuaXNFeHBhbmRlZCgpKTsKLQkJdG9nZ2xlU3RhdGUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9Gb3JtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL0Zvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3ZGQzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL0Zvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuRm9ybUhlYWRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5Gb3JtVXRpbDsKLQotLyoqCi0gKiBGb3JtIGlzIGEgY3VzdG9tIGNvbnRyb2wgdGhhdCByZW5kZXJzIGEgdGl0bGUgYW5kIGFuIG9wdGlvbmFsIGJhY2tncm91bmQKLSAqIGltYWdlIGFib3ZlIHRoZSBib2R5IGNvbXBvc2l0ZS4gSXQgY2FuIGJlIHVzZWQgYWxvbmUgd2hlbiBwYXJ0IG9mIHBhcmVudHMKLSAqIHRoYXQgYXJlIHNjcm9sbGVkLiBJZiBzY3JvbGxpbmcgaXMgcmVxdWlyZWQsIHVzZSA8Y29kZT5TY3JvbGxlZEZvcm08L2NvZGU+Ci0gKiBpbnN0ZWFkIGJlY2F1c2UgaXQgaGFzIGFuIGluc3RhbmNlIG9mIDxjb2RlPkZvcm08L2NvZGU+IGFuZCBhZGRzIHNjcm9sbGluZwotICogY2FwYWJpbGl0eS4KLSAqIDxwPgotICogRm9ybSBjYW4gaGF2ZSBhIHRpdGxlIGlmIHNldC4gSWYgbm90IHNldCwgdGl0bGUgYXJlYSB3aWxsIG5vdCBiZSBsZWZ0IGVtcHR5IC0KLSAqIGZvcm0gYm9keSB3aWxsIGJlIHJlc2l6ZWQgdG8gZmlsbCB0aGUgZW50aXJlIGZvcm0uIEluIGFkZGl0aW9uLCBhbiBvcHRpb25hbAotICogdGl0bGUgaW1hZ2UgY2FuIGJlIHNldCBhbmQgaXMgcmVuZGVyZWQgdG8gdGhlIGxlZnQgb2YgdGhlIHRpdGxlIChzaW5jZSAzLjIpLgotICogPHA+Ci0gKiBUaGUgZm9ybSBzdXBwb3J0cyBzdGF0dXMgbWVzc2FnZXMuIFRoZXNlIG1lc3NhZ2VzIGNhbiBoYXZlIHZhcmlvdXMKLSAqIHNldmVyaXR5IChlcnJvciwgd2FybmluZywgaW5mbyBvciBub25lKS4gTWVzc2FnZSB0cmF5IGNhbiBiZSBtaW5pbWl6ZWQgYW5kCi0gKiBsYXRlciByZXN0b3JlZCBieSB0aGUgdXNlciwgYnV0IGNhbiBvbmx5IGJlIGNsb3NlZCBwcm9ncmFtbWF0aWNhbGx5LgotICogPHA+Ci0gKiBGb3JtIGNhbiBoYXZlIGEgYmFja2dyb3VuZCBpbWFnZSBiZWhpbmQgdGhlIHRpdGxlIHRleHQuIFRoZSBpbWFnZSBjYW4gYmUKLSAqIHBhaW50ZWQgYXMtaXMsIG9yIHRpbGVkIGFzIG1hbnkgdGltZXMgYXMgbmVlZGVkIHRvIGZpbGwgdGhlIHRpdGxlIGFyZWEuCi0gKiBBbHRlcm5hdGl2ZWx5LCBncmFkaWVudCBiYWNrZ3JvdW5kIGNhbiBiZSBwYWludGVkIHZlcnRpY2FsbHkgb3IKLSAqIGhvcml6b250YWxseS4KLSAqIDxwPkZvcm0gY2FuIGJlIHB1dCBpbiB0aGUgJ2J1c3knIHN0YXRlLiBXaGlsZSBpbiB0aGlzIHN0YXRlLAotICogdGl0bGUgaW1hZ2UgaXMgcmVwbGFjZWQgd2l0aCBhbiBhbmltYXRpb24gdGhhdCBsYXN0cyBhcyBsb25nIGFzIHRoZQotICogJ2J1c3knIHN0YXRlIGlzIGFjdGl2ZS4KLSAqIDxwPkl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBhbiBvcHRpb25hbCBoZWFkIGNsaWVudCBjb250cm9sLgotICogV2hlbiBjcmVhdGVkLCB0aGlzIGNvbnRyb2wgaXMgcGxhY2VkIG5leHQgdG8gdGhlIHRpdGxlLiBJZiB0aXRsZSB0b29sCi0gKiBiYXIgaXMgYWxzbyBwcmVzZW50LCBhIG5ldyByb3cgaXMgY3JlYXRlZCBpbiB0aGUgaGVhZGVyLCBhbmQgdGhlIHRvb2wKLSAqIGJhciBpcyByaWdodC1qdXN0aWZpZWQgaW4gdGhlIHNlY29uZCByb3cuCi0gKiA8cD4KLSAqIEZvcm0gaGFzIGEgY3VzdG9tIGxheW91dCBtYW5hZ2VyIHRoYXQgaXMgd3JhcC1lbmFibGVkLiBJZiBhIGZvcm0gaXMgcGxhY2VkIGluCi0gKiBhIGNvbXBvc2l0ZSB3aG9zZSBsYXlvdXQgbWFuYWdlciBpbXBsZW1lbnRzIElMYXlvdXRFeHRlbnNpb24sIHRoZSBib2R5IG9mIHRoZQotICogd29ybSB3aWxsIHBhcnRpY2lwYXRlIGluIHdyYXBwaW5nIGFzIGxvbmcgYXMgaXRzIGxheW91dCBtYW5hZ2VyIGltcGxlbWVudHMKLSAqIElMYXlvdXRFeHRlbnNpb24gYXMgd2VsbC4KLSAqIDxwPgotICogQ2hpbGRyZW4gb2YgdGhlIGZvcm0gc2hvdWxkIHR5cGljYWxseSBiZSBjcmVhdGVkIHVzaW5nIEZvcm1Ub29sa2l0IHRvIG1hdGNoCi0gKiB0aGUgYXBwZWFyYW5jZSBhbmQgYmVoYXZpb3VyLiBXaGVuIGNyZWF0aW5nIGNoaWxkcmVuLCB1c2UgdGhlIGZvcm0gYm9keSBhcyBhCi0gKiBwYXJlbnQgYnkgY2FsbGluZyAnZ2V0Qm9keSgpJyBvbiB0aGUgZm9ybSBpbnN0YW5jZS4gRXhhbXBsZToKLSAqIAotICogPHByZT4KLSAqIEZvcm1Ub29sa2l0IHRvb2xraXQgPSBuZXcgRm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0gKiBGb3JtIGZvcm0gPSB0b29sa2l0LmNyZWF0ZUZvcm0ocGFyZW50KTsKLSAqIGZvcm1Db250ZW50LnNldFRleHQoJnF1b3Q7U2FtcGxlIGZvcm0mcXVvdDspOwotICogZm9ybUNvbnRlbnQuZ2V0Qm9keSgpLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAqIHRvb2xraXQuY3JlYXRlQnV0dG9uKGZvcm1Db250ZW50LmdldEJvZHkoKSwgJnF1b3Q7Q2hlY2tib3gmcXVvdDssIFNXVC5DSEVDSyk7Ci0gKiA8L3ByZT4KLSAqIAotICogPHA+Ci0gKiBObyBsYXlvdXQgbWFuYWdlciBoYXMgYmVlbiBzZXQgb24gdGhlIGJvZHkuIENsaWVudHMgYXJlIHJlcXVpcmVkIHRvIHNldCB0aGUKLSAqIGRlc2lyZWQgbGF5b3V0IG1hbmFnZXIgZXhwbGljaXRseS4KLSAqIDxwPgotICogQWx0aG91Z2ggdGhlIGNsYXNzIGlzIG5vdCBmaW5hbCwgaXQgc2hvdWxkIG5vdCBiZSBzdWJjbGFzc2VkLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcml2YXRlIEZvcm1IZWFkaW5nIGhlYWQ7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBib2R5OwotCi0JcHJpdmF0ZSBTaXplQ2FjaGUgYm9keUNhY2hlID0gbmV3IFNpemVDYWNoZSgpOwotCi0JcHJpdmF0ZSBTaXplQ2FjaGUgaGVhZENhY2hlID0gbmV3IFNpemVDYWNoZSgpOwotCi0JcHJpdmF0ZSBGb3JtVGV4dCBzZWxlY3Rpb25UZXh0OwotCi0JcHJpdmF0ZSBjbGFzcyBGb3JtTGF5b3V0IGV4dGVuZHMgTGF5b3V0IGltcGxlbWVudHMgSUxheW91dEV4dGVuc2lvbiB7Ci0JCXB1YmxpYyBpbnQgY29tcHV0ZU1pbmltdW1XaWR0aChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJCXJldHVybiBjb21wdXRlU2l6ZShjb21wb3NpdGUsIDUsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKS54OwotCQl9Ci0KLQkJcHVibGljIGludCBjb21wdXRlTWF4aW11bVdpZHRoKENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkJcmV0dXJuIGNvbXB1dGVTaXplKGNvbXBvc2l0ZSwgU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKS54OwotCQl9Ci0KLQkJcHVibGljIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LAotCQkJCWJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkJaWYgKGZsdXNoQ2FjaGUpIHsKLQkJCQlib2R5Q2FjaGUuZmx1c2goKTsKLQkJCQloZWFkQ2FjaGUuZmx1c2goKTsKLQkJCX0KLQkJCWJvZHlDYWNoZS5zZXRDb250cm9sKGJvZHkpOwotCQkJaGVhZENhY2hlLnNldENvbnRyb2woaGVhZCk7Ci0KLQkJCWludCB3aWR0aCA9IDA7Ci0JCQlpbnQgaGVpZ2h0ID0gMDsKLQotCQkJUG9pbnQgaHNpemUgPSBoZWFkQ2FjaGUuY29tcHV0ZVNpemUoRm9ybVV0aWwuZ2V0V2lkdGhIaW50KHdIaW50LAotCQkJCQloZWFkKSwgU1dULkRFRkFVTFQpOwotCQkJd2lkdGggPSBNYXRoLm1heChoc2l6ZS54LCB3aWR0aCk7Ci0JCQloZWlnaHQgPSBoc2l6ZS55OwotCi0JCQlQb2ludCBic2l6ZSA9IGJvZHlDYWNoZS5jb21wdXRlU2l6ZShGb3JtVXRpbC5nZXRXaWR0aEhpbnQod0hpbnQsCi0JCQkJCWJvZHkpLCBTV1QuREVGQVVMVCk7Ci0JCQl3aWR0aCA9IE1hdGgubWF4KGJzaXplLngsIHdpZHRoKTsKLQkJCWhlaWdodCArPSBic2l6ZS55OwotCQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJCWlmIChmbHVzaENhY2hlKSB7Ci0JCQkJYm9keUNhY2hlLmZsdXNoKCk7Ci0JCQkJaGVhZENhY2hlLmZsdXNoKCk7Ci0JCQl9Ci0JCQlib2R5Q2FjaGUuc2V0Q29udHJvbChib2R5KTsKLQkJCWhlYWRDYWNoZS5zZXRDb250cm9sKGhlYWQpOwotCQkJUmVjdGFuZ2xlIGNhcmVhID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQotCQkJUG9pbnQgaHNpemUgPSBoZWFkQ2FjaGUuY29tcHV0ZVNpemUoY2FyZWEud2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJCWhlYWRDYWNoZS5zZXRCb3VuZHMoMCwgMCwgY2FyZWEud2lkdGgsIGhzaXplLnkpOwotCQkJYm9keUNhY2hlCi0JCQkJCS5zZXRCb3VuZHMoMCwgaHNpemUueSwgY2FyZWEud2lkdGgsIGNhcmVhLmhlaWdodCAtIGhzaXplLnkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZm9ybSBjb250ZW50IGNvbnRyb2wgYXMgYSBjaGlsZCBvZiB0aGUgcHJvdmlkZWQgcGFyZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgd2lkZ2V0Ci0JICovCi0JcHVibGljIEZvcm0oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PX0JBQ0tHUk9VTkQgfCBzdHlsZSk7Ci0JCXN1cGVyLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJaGVhZCA9IG5ldyBGb3JtSGVhZGluZyh0aGlzLCBTV1QuTlVMTCk7Ci0JCWhlYWQuc2V0TWVudShwYXJlbnQuZ2V0TWVudSgpKTsKLQkJYm9keSA9IG5ldyBMYXlvdXRDb21wb3NpdGUodGhpcywgU1dULk5VTEwpOwotCQlib2R5LnNldE1lbnUocGFyZW50LmdldE1lbnUoKSk7Ci0JfQotCi0JLyoqCi0JICogUGFzc2VzIHRoZSBtZW51IHRvIHRoZSBmb3JtIGJvZHkuCi0JICogCi0JICogQHBhcmFtIG1lbnUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgbWVudQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lbnUoTWVudSBtZW51KSB7Ci0JCXN1cGVyLnNldE1lbnUobWVudSk7Ci0JCWhlYWQuc2V0TWVudShtZW51KTsKLQkJYm9keS5zZXRNZW51KG1lbnUpOwotCX0KLQotCS8qKgotCSAqIEZ1bGx5IGRlbGVnYXRlcyB0aGUgc2l6ZSBjb21wdXRhdGlvbiB0byB0aGUgaW50ZXJuYWwgbGF5b3V0IG1hbmFnZXIuCi0JICovCi0JcHVibGljIGZpbmFsIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJcmV0dXJuICgoRm9ybUxheW91dCkgZ2V0TGF5b3V0KCkpLmNvbXB1dGVTaXplKHRoaXMsIHdIaW50LCBoSGludCwKLQkJCQljaGFuZ2VkKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmV2ZW50cyBmcm9tIGNoYW5naW5nIHRoZSBjdXN0b20gY29udHJvbCBsYXlvdXQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0TGF5b3V0KExheW91dCBsYXlvdXQpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aXRsZSB0ZXh0IHRoYXQgd2lsbCBiZSByZW5kZXJlZCBhdCB0aGUgdG9wIG9mIHRoZSBmb3JtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRpdGxlIHRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBoZWFkLmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aXRsZSBpbWFnZSB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgdG8gdGhlIGxlZnQgb2YgdGhlIHRpdGxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRpdGxlIGltYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGhlYWQuZ2V0SW1hZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRoZSBmb3JtLiBUaGlzIGNvbG9yIHdpbGwgYWxzbyBiZSB1c2VkIGZvcgotCSAqIHRoZSBib2R5LgotCSAqIAotCSAqIEBwYXJhbSBmZwotCSAqICAgICAgICAgICAgdGhlIGZvcmVncm91bmQgY29sb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIGZnKSB7Ci0JCXN1cGVyLnNldEZvcmVncm91bmQoZmcpOwotCQloZWFkLnNldEZvcmVncm91bmQoZmcpOwotCQlib2R5LnNldEZvcmVncm91bmQoZmcpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGZvcm0uIFRoaXMgY29sb3Igd2lsbCBhbHNvIGJlIHVzZWQgZm9yCi0JICogdGhlIGJvZHkuCi0JICogCi0JICogQHBhcmFtIGJnCi0JICogICAgICAgICAgICB0aGUgYmFja2dyb3VuZCBjb2xvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoQ29sb3IgYmcpIHsKLQkJc3VwZXIuc2V0QmFja2dyb3VuZChiZyk7Ci0JCWhlYWQuc2V0QmFja2dyb3VuZChiZyk7Ci0JCWJvZHkuc2V0QmFja2dyb3VuZChiZyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBvZiB0aGUgaGVhZGVyIHRleHQuCi0JICogCi0JICogQHBhcmFtIGZvbnQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgZm9udAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBmb250KSB7Ci0JCXN1cGVyLnNldEZvbnQoZm9udCk7Ci0JCWhlYWQuc2V0Rm9udChmb250KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZXh0IHRvIGJlIHJlbmRlcmVkIGF0IHRoZSB0b3Agb2YgdGhlIGZvcm0gYWJvdmUgdGhlIGJvZHkgYXMgYQotCSAqIHRpdGxlLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGl0bGUgdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaGVhZC5zZXRUZXh0KHRleHQpOwotCQlsYXlvdXQoKTsKLQkJcmVkcmF3KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgdG8gYmUgcmVuZGVyZWQgdG8gdGhlIGxlZnQgb2YgdGhlIHRpdGxlLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIGltYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHNob3cgbm8gaW1hZ2UuCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCWhlYWQuc2V0SW1hZ2UoaW1hZ2UpOwotCQlsYXlvdXQoKTsKLQkJcmVkcmF3KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvcnMgdG8gYmUgcGFpbnRlZCBiZWhpbmQgdGhlIHRpdGxlIHRleHQgaW4gYQotCSAqIGdyYWRpZW50LgotCSAqIAotCSAqIEBwYXJhbSBncmFkaWVudENvbG9ycwotCSAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbG9ycyB0aGF0IGZvcm0gdGhlIGdyYWRpZW50Ci0JICogQHBhcmFtIHBlcmNlbnRzCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIG9mIHRoZSBvdmVyYWxsIHNwYWNlIGJldHdlZW4gdGhlIGdyYWRpZW50IGNvbG9ycwotCSAqIEBwYXJhbSB2ZXJ0aWNhbAotCSAqICAgICAgICAgICAgb2YgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBncmFkaWVudCB3aWxsIGJlIHJlbmRlcmVkCi0JICogICAgICAgICAgICB2ZXJ0aWNhbGx5LCBpZiA8Y29kZT5mYWxzZTwvY29kZT4gdGhlIG9yaWVudGF0aW9uIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGhvcml6b250YWwuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0QmFja2dyb3VuZChDb2xvcltdIGdyYWRpZW50Q29sb3JzLCBpbnRbXSBwZXJjZW50cywKLQkJCWJvb2xlYW4gdmVydGljYWwpIHsKLQkJaGVhZC5zZXRUZXh0QmFja2dyb3VuZChncmFkaWVudENvbG9ycywgcGVyY2VudHMsIHZlcnRpY2FsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCBiYWNrZ3JvdW5kIGltYWdlIG9mIHRoZSBmb3JtIGhlYWQuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFja2dyb3VuZCBpbWFnZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc3BlY2lmaWVkLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRCYWNrZ3JvdW5kSW1hZ2UoKSB7Ci0JCXJldHVybiBoZWFkLmdldEJhY2tncm91bmRJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG9wdGlvbmFsIGJhY2tncm91bmQgaW1hZ2UgdG8gYmUgcmVuZGVyZWQgYmVoaW5kIHRoZSB0aXRsZQotCSAqIHN0YXJ0aW5nIGF0IHRoZSBwb3NpdGlvbiAwLDAuCi0JICogCi0JICogQHBhcmFtIGJhY2tncm91bmRJbWFnZQotCSAqICAgICAgICAgICAgdGhlIGhlYWQgYmFja2dyb3VuZCBpbWFnZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kSW1hZ2UoSW1hZ2UgYmFja2dyb3VuZEltYWdlKSB7Ci0JCWhlYWQuc2V0QmFja2dyb3VuZEltYWdlKGJhY2tncm91bmRJbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9vbCBiYXIgbWFuYWdlciB0aGF0IGlzIHVzZWQgdG8gbWFuYWdlIHRvb2wgaXRlbXMgaW4gdGhlCi0JICogZm9ybSdzIHRpdGxlIGFyZWEuCi0JICogCi0JICogQHJldHVybiBmb3JtIHRvb2wgYmFyIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSVRvb2xCYXJNYW5hZ2VyIGdldFRvb2xCYXJNYW5hZ2VyKCkgewotCQlyZXR1cm4gaGVhZC5nZXRUb29sQmFyTWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGxvY2FsIHRvb2wgYmFyIG1hbmFnZXIgaWYgdXNlZC4gRG9lcyBub3RoaW5nIGlmIGxvY2FsIHRvb2wKLQkgKiBiYXIgbWFuYWdlciBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVG9vbEJhcigpIHsKLQkJaGVhZC51cGRhdGVUb29sQmFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGFpbmVyIHRoYXQgb2NjdXBpZXMgdGhlIGhlYWQgb2YgdGhlIGZvcm0gKHRoZSBmb3JtIGFyZWEKLQkgKiBhYm92ZSB0aGUgYm9keSkuIFVzZSB0aGlzIGNvbnRhaW5lciBhcyBhIHBhcmVudCBmb3IgdGhlIGhlYWQgY2xpZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhlYWQgb2YgdGhlIGZvcm0uCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0SGVhZCgpIHsKLQkJcmV0dXJuIGhlYWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3B0aW9uYWwgaGVhZCBjbGllbnQgaWYgc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhlYWQgY2xpZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogQHNlZSAjc2V0SGVhZENsaWVudChDb250cm9sKQotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRIZWFkQ2xpZW50KCkgewotCQlyZXR1cm4gaGVhZC5nZXRIZWFkQ2xpZW50KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgb3B0aW9uYWwgaGVhZCBjbGllbnQuIEhlYWQgY2xpZW50IGlzIHBsYWNlZCBhZnRlciB0aGUgZm9ybQotCSAqIHRpdGxlLiBUaGlzIG9wdGlvbiBjYXVzZXMgdGhlIHRvb2wgYmFyIHRvIGJlIHBsYWNlZCBpbiB0aGUgc2Vjb25kIHJhdyBvZgotCSAqIHRoZSBoZWFkZXIgKGJlbG93IHRoZSBoZWFkIGNsaWVudCkuCi0JICogPHA+Ci0JICogVGhlIGhlYWQgY2xpZW50IG11c3QgYmUgYSBjaGlsZCBvZiB0aGUgY29tcG9zaXRlIHJldHVybmVkIGJ5Ci0JICogPGNvZGU+Z2V0SGVhZCgpPC9jb2RlPiBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIGhlYWRDbGllbnQKLQkgKiAgICAgICAgICAgIHRoZSBvcHRpb25hbCBjaGlsZCBvZiB0aGUgaGVhZAotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWFkQ2xpZW50KENvbnRyb2wgaGVhZENsaWVudCkgewotCQloZWFkLnNldEhlYWRDbGllbnQoaGVhZENsaWVudCk7Ci0JCWxheW91dCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRhaW5lciB0aGF0IG9jY3VwaWVzIHRoZSBib2R5IG9mIHRoZSBmb3JtICh0aGUgZm9ybSBhcmVhCi0JICogYmVsb3cgdGhlIHRpdGxlKS4gVXNlIHRoaXMgY29udGFpbmVyIGFzIGEgcGFyZW50IGZvciB0aGUgY29udHJvbHMgdGhhdAotCSAqIHNob3VsZCBiZSBpbiB0aGUgZm9ybS4gTm8gbGF5b3V0IG1hbmFnZXIgaGFzIGJlZW4gc2V0IG9uIHRoZSBmb3JtIGJvZHkuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoZSBmb3JtLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Qm9keSgpIHsKLQkJcmV0dXJuIGJvZHk7Ci0JfQotCi0JLyoqCi0JICogVE9ETyBhZGQgamF2YWRvYyAtCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBiYWNrZ3JvdW5kSW1hZ2VUaWxlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JhY2tncm91bmRJbWFnZVRpbGVkKCkgewotCQlyZXR1cm4gaGVhZC5pc0JhY2tncm91bmRJbWFnZVRpbGVkKCk7Ci0JfQotCi0JLyoqCi0JICogVE9ETyBhZGQgamF2YWRvYwotCSAqIAotCSAqIEBwYXJhbSBiYWNrZ3JvdW5kSW1hZ2VUaWxlZAotCSAqICAgICAgICAgICAgVGhlIGJhY2tncm91bmRJbWFnZVRpbGVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kSW1hZ2VUaWxlZChib29sZWFuIGJhY2tncm91bmRJbWFnZVRpbGVkKSB7Ci0JCWhlYWQuc2V0QmFja2dyb3VuZEltYWdlVGlsZWQoYmFja2dyb3VuZEltYWdlVGlsZWQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYmFja2dyb3VuZEltYWdlQWxpZ25tZW50LiBUT0RPIGFkZCBqYXZhZG9jCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZEltYWdlQWxpZ25tZW50KCkgewotCQlyZXR1cm4gaGVhZC5nZXRCYWNrZ3JvdW5kSW1hZ2VBbGlnbm1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFja2dyb3VuZEltYWdlQWxpZ25tZW50Ci0JICogICAgICAgICAgICBUaGUgYmFja2dyb3VuZEltYWdlQWxpZ25tZW50IHRvIHNldC4gVE9ETyBhZGQgamF2YWRvYwotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kSW1hZ2VBbGlnbm1lbnQoaW50IGJhY2tncm91bmRJbWFnZUFsaWdubWVudCkgewotCQloZWFkLnNldEJhY2tncm91bmRJbWFnZUFsaWdubWVudChiYWNrZ3JvdW5kSW1hZ2VBbGlnbm1lbnQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYmFja2dyb3VuZEltYWdlQ2xpcHBlZC4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCYWNrZ3JvdW5kSW1hZ2VDbGlwcGVkKCkgewotCQlyZXR1cm4gaGVhZC5pc0JhY2tncm91bmRJbWFnZUNsaXBwZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFja2dyb3VuZEltYWdlQ2xpcHBlZAotCSAqICAgICAgICAgICAgVGhlIGJhY2tncm91bmRJbWFnZUNsaXBwZWQgdG8gc2V0LgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kSW1hZ2VDbGlwcGVkKGJvb2xlYW4gYmFja2dyb3VuZEltYWdlQ2xpcHBlZCkgewotCQloZWFkLnNldEJhY2tncm91bmRJbWFnZUNsaXBwZWQoYmFja2dyb3VuZEltYWdlQ2xpcHBlZCk7Ci0JfQotCi0Jdm9pZCBzZXRTZWxlY3Rpb25UZXh0KEZvcm1UZXh0IHRleHQpIHsKLQkJaWYgKHNlbGVjdGlvblRleHQgIT0gbnVsbCAmJiBzZWxlY3Rpb25UZXh0ICE9IHRleHQpIHsKLQkJCXNlbGVjdGlvblRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQkJfQotCQl0aGlzLnNlbGVjdGlvblRleHQgPSB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFRPRE8gYWRkIGphdmFkb2MgZXhwZXJpbWVudGFsIC0gZG8gbm90IHVzZSB5ZXQKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWNlaXZlciBpcyBhIHZpc2libGUgc2VwYXJhdG9yLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VwYXJhdG9yVmlzaWJsZSgpIHsKLQkJcmV0dXJuIGhlYWQuaXNTZXBhcmF0b3JWaXNpYmxlKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgc2V0LCBhZGRzIGEgc2VwYXJhdG9yIGJldHdlZW4gdGhlIGhlYWQgYW5kIGJvZHkuIElmIGdyYWRpZW50IHRleHQKLQkgKiBiYWNrZ3JvdW5kIGlzIHVzZWQsIHRoZSBzZXBhcmF0b3Igd2lsbCB1c2UgZ3JhZGllbnQgY29sb3JzLgotCSAqIAotCSAqIEBwYXJhbSBhZGRTZXBhcmF0b3IKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHNlcGFyYXRvciB2aXNpYmxlLAotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VwYXJhdG9yVmlzaWJsZShib29sZWFuIGFkZFNlcGFyYXRvcikgewotCQloZWFkLnNldFNlcGFyYXRvclZpc2libGUoYWRkU2VwYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xvciB1c2VkIHRvIHJlbmRlciB0aGUgb3B0aW9uYWwgaGVhZCBzZXBhcmF0b3IuCi0JICogCi0JICogQHJldHVybiBzZXBhcmF0b3IgY29sb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKi8KLQotCXB1YmxpYyBDb2xvciBnZXRTZXBhcmF0b3JDb2xvcigpIHsKLQkJcmV0dXJuIGhlYWQuZ2V0U2VwYXJhdG9yQ29sb3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb2xvciB0byBiZSB1c2VkIHRvIHJlbmRlciB0aGUgb3B0aW9uYWwgaGVhZCBzZXBhcmF0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcGFyYXRvckNvbG9yCi0JICogICAgICAgICAgICB0aGUgY29sb3IgdG8gcmVuZGVyIHRoZSBoZWFkIHNlcGFyYXRvciBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgdG8gdXNlIHRoZSBkZWZhdWx0IGNvbG9yLgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3JDb2xvcihDb2xvciBzZXBhcmF0b3JDb2xvcikgewotCQloZWFkLnNldFNlcGFyYXRvckNvbG9yKHNlcGFyYXRvckNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXNzYWdlIGZvciB0aGlzIGZvcm0uIE1lc3NhZ2UgdGV4dCBpcyByZW5kZXJlZCBpbiB0aGUgZm9ybSBoZWFkCi0JICogd2hlbiBzaG93bi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNsZWFyIHRoZSBtZXNzYWdlCi0JICogQHNlZSAjc2V0TWVzc2FnZShTdHJpbmcsIGludCkKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQloZWFkLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWVzc2FnZSBmb3IgdGhpcyBmb3JtIHdpdGggYW4gaW5kaWNhdGlvbiBvZiB3aGF0IHR5cGUgb2YgbWVzc2FnZQotCSAqIGl0IGlzLgotCSAqIDxwPgotCSAqIFRoZSB2YWxpZCBtZXNzYWdlIHR5cGVzIGFyZSBvbmUgb2YgPGNvZGU+Tk9ORTwvY29kZT4sCi0JICogPGNvZGU+SU5GT1JNQVRJT048L2NvZGU+LDxjb2RlPldBUk5JTkc8L2NvZGU+LCBvcgotCSAqIDxjb2RlPkVSUk9SPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIG5ld01lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciB0aGUgbWVzc2FnZQotCSAqIEBwYXJhbSBuZXdUeXBlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0eXBlCi0JICogQHNpbmNlIDMuMgotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpIHsKLQkJaGVhZC5zZXRNZXNzYWdlKG5ld01lc3NhZ2UsIG5ld1R5cGUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGlmIHRoZSBmb3JtIGlzIGluIHRoZSAnYnVzeScgc3RhdGUuIEJ1c3kgZm9ybSBkaXNwbGF5cyAnYnVzeScKLQkgKiBhbmltYXRpb24gaW4gdGhlIGFyZWEgb2YgdGhlIHRpdGxlIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYnVzeSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0J1c3koKSB7Ci0JCXJldHVybiBoZWFkLmlzQnVzeSgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcm0ncyBidXN5IHN0YXRlLiBCdXN5IGZvcm0gd2lsbCBkaXNwbGF5ICdidXN5JyBhbmltYXRpb24gaW4KLQkgKiB0aGUgYXJlYSBvZiB0aGUgdGl0bGUgaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIGJ1c3kKLQkgKiAgICAgICAgICAgIHRoZSBmb3JtJ3MgYnVzeSBzdGF0ZQotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldEJ1c3koYm9vbGVhbiBidXN5KSB7Ci0JCWhlYWQuc2V0QnVzeShidXN5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9Gb3JtVGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9Gb3JtVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGUwOTY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvRm9ybVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQUNDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UeXBlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkh5cGVybGlua1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuQ29udHJvbFNlZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuRm9ybVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5JRm9jdXNTZWxlY3RhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuSUh5cGVybGlua1NlZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5JbWFnZVNlZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5Mb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuUGFyYWdyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuUGFyYWdyYXBoU2VnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzLlNlbGVjdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5UZXh0U2VnbWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgcmVhZC1vbmx5IHRleHQgY29udHJvbCB0aGF0IGlzIGNhcGFibGUgb2YgcmVuZGVyaW5nIHdyYXBwZWQKLSAqIHRleHQuIFRleHQgY2FuIGJlIHJlbmRlcmVkIGFzLWlzIG9yIGJ5IHBhcnNpbmcgdGhlIGZvcm1hdHRpbmcgWE1MIHRhZ3MuCi0gKiBJbmRlcGVuZGVudGx5LCB3b3JkcyB0aGF0IHN0YXJ0IHdpdGggaHR0cDovLyBjYW4gYmUgY29udmVydGVkIGludG8gaHlwZXJsaW5rcwotICogb24gdGhlIGZseS4KLSAqIDxwPgotICogV2hlbiBjb25maWd1cmVkIHRvIHVzZSBmb3JtYXR0aW5nIFhNTCwgdGhlIGNvbnRyb2wgcmVxdWlyZXMgdGhlIHJvb3QgZWxlbWVudAotICogPGNvZGU+Zm9ybTwvY29kZT4gdG8gYmUgdXNlZC4gVGhlIGZvbGxvd2luZyB0YWdzIGNhbiBiZSBjaGlsZHJlbiBvZiB0aGUKLSAqIDxjb2RlPmZvcm08L2NvZGU+IGVsZW1lbnQ6Ci0gKiA8L3A+Ci0gKiA8dWw+Ci0gKiA8bGk+PGI+cCA8L2I+LSBmb3IgZGVmaW5pbmcgcGFyYWdyYXBocy4gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZQotICogYWxsb3dlZDoKLSAqIDx1bD4KLSAqIDxsaT48Yj52c3BhY2UgPC9iPi0gaWYgc2V0IHRvICdmYWxzZScsIG5vIHZlcnRpY2FsIHNwYWNlIHdpbGwgYmUgYWRkZWQKLSAqIChkZWZhdWx0IGlzICd0cnVlJyk8L2xpPgotICogPC91bD4KLSAqIDwvbGk+Ci0gKiA8bGk+PGI+bGkgPC9iPi0gZm9yIGRlZmluaW5nIGxpc3QgaXRlbXMuIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUKLSAqIGFsbG93ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+PGI+dnNwYWNlIDwvYj4tIHRoZSBzYW1lIGFzIHdpdGggdGhlIDxiPnAgPC9iPiB0YWc8L2xpPgotICogPGxpPjxiPnN0eWxlIDwvYj4tIGNvdWxkIGJlICdidWxsZXQnIChkZWZhdWx0KSwgJ3RleHQnIGFuZCAnaW1hZ2UnPC9saT4KLSAqIDxsaT48Yj52YWx1ZSA8L2I+LSBub3QgdXNlZCBmb3IgJ2J1bGxldCcuIEZvciB0ZXh0LCBpdCBpcyB0aGUgdmFsdWUgb2YgdGhlCi0gKiB0ZXh0IHRoYXQgaXMgcmVuZGVyZWQgYXMgYSBidWxsZXQuIEZvciBpbWFnZSwgaXQgaXMgdGhlIGhyZWYgb2YgdGhlIGltYWdlIHRvCi0gKiBiZSByZW5kZXJlZCBhcyBhIGJ1bGxldC48L2xpPgotICogPGxpPjxiPmluZGVudCA8L2I+LSB0aGUgbnVtYmVyIG9mIHBpeGVscyB0byBpbmRlbnQgdGhlIHRleHQgaW4gdGhlIGxpc3QgaXRlbQotICogPC9saT4KLSAqIDxsaT48Yj5iaW5kZW50IDwvYj4tIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRvIGluZGVudCB0aGUgYnVsbGV0IGl0c2VsZjwvbGk+Ci0gKiA8L3VsPgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFRleHQgaW4gcGFyYWdyYXBocyBhbmQgbGlzdCBpdGVtcyB3aWxsIGJlIHdyYXBwZWQgYWNjb3JkaW5nIHRvIHRoZSB3aWR0aCBvZgotICogdGhlIGNvbnRyb2wuIFRoZSBmb2xsb3dpbmcgdGFncyBjYW4gYXBwZWFyIGFzIGNoaWxkcmVuIG9mIGVpdGhlciA8Yj5wIDwvYj4gb3IKLSAqIDxiPmxpIDwvYj4gZWxlbWVudHM6Ci0gKiA8dWw+Ci0gKiA8bGk+PGI+aW1nIDwvYj4tIHRvIHJlbmRlciBhbiBpbWFnZS4gRWxlbWVudCBhY2NlcHRzIGF0dHJpYnV0ZSAnaHJlZicgdGhhdAotICogaXMgYSBrZXkgdG8gdGhlIDxjb2RlPkltYWdlPC9jb2RlPiBzZXQgdXNpbmcgJ3NldEltYWdlJyBtZXRob2QuIFZlcnRpY2FsCi0gKiBwb3NpdGlvbiBvZiBpbWFnZSByZWxhdGl2ZSB0byBzdXJyb3VuZGluZyB0ZXh0IGlzIG9wdGlvbmFsbHkgY29udHJvbGxlZCBieQotICogdGhlIGF0dHJpYnV0ZSA8Yj5hbGlnbjwvYj4gdGhhdCBjYW4gaGF2ZSB2YWx1ZXMgPGI+dG9wPC9iPiwgPGI+bWlkZGxlPC9iPgotICogYW5kIDxiPmJvdHRvbTwvYj48L2xpPgotICogPGxpPjxiPmEgPC9iPi0gdG8gcmVuZGVyIGEgaHlwZXJsaW5rLiBFbGVtZW50IGFjY2VwdHMgYXR0cmlidXRlICdocmVmJyB0aGF0Ci0gKiB3aWxsIGJlIHByb3ZpZGVkIHRvIHRoZSBoeXBlcmxpbmsgbGlzdGVuZXJzIHZpYSBIeXBlcmxpbmtFdmVudCBvYmplY3QuIFRoZQotICogZWxlbWVudCBhbHNvIGFjY2VwdHMgJ25vd3JhcCcgYXR0cmlidXRlIChkZWZhdWx0IGlzIGZhbHNlKS4gV2hlbiBzZXQgdG8KLSAqICd0cnVlJywgdGhlIGh5cGVybGluayB3aWxsIG5vdCBiZSB3cmFwcGVkLiBIeXBlcmxpbmtzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZAotICogd2hlbiAnaHR0cDovLycgaXMgZW5jb3VudGVyZWQgaW4gdGV4dCBhcmUgbm90IHdyYXBwZWQuPC9saT4KLSAqIDxsaT48Yj5iIDwvYj4tIHRoZSBlbmNsb3NlZCB0ZXh0IHdpbGwgdXNlIGJvbGQgZm9udC48L2xpPgotICogPGxpPjxiPmJyIDwvYj4tIGZvcmNlZCBsaW5lIGJyZWFrIChubyBhdHRyaWJ1dGVzKS48L2xpPgotICogPGxpPjxiPnNwYW4gPC9iPi0gdGhlIGVuY2xvc2VkIHRleHQgd2lsbCBoYXZlIHRoZSBjb2xvciBhbmQgZm9udCBzcGVjaWZpZWQKLSAqIGluIHRoZSBlbGVtZW50IGF0dHJpYnV0ZXMuIENvbG9yIGlzIHByb3ZpZGVkIHVzaW5nICdjb2xvcicgYXR0cmlidXRlIGFuZCBpcyBhCi0gKiBrZXkgdG8gdGhlIENvbG9yIG9iamVjdCBzZXQgYnkgJ3NldENvbG9yJyBtZXRob2QuIEZvbnQgaXMgcHJvdmlkZWQgdXNpbmcKLSAqICdmb250JyBhdHRyaWJ1dGUgYW5kIGlzIGEga2V5IHRvIHRoZSBGb250IG9iamVjdCBzZXQgYnkgJ3NldEZvbnQnIG1ldGhvZC4KLSAqIDwvbGk+Ci0gKiA8bGk+PGI+Y29udHJvbCAobmV3IGluIDMuMSk8L2I+IC0gdG8gcGxhY2UgYSBjb250cm9sIHRoYXQgaXMgYSBjaGlsZCBvZiB0aGUKLSAqIHRleHQgY29udHJvbC4gRWxlbWVudCBhY2NlcHRzIGF0dHJpYnV0ZSAnaHJlZicgdGhhdCBpcyBhIGtleSB0byB0aGUgQ29udHJvbAotICogb2JqZWN0IHNldCB1c2luZyAnc2V0Q29udHJvbCcgbWV0aG9kLiBPcHRpb25hbGx5LCBhdHRyaWJ1dGUgJ2ZpbGwnIGNhbiBiZSBzZXQKLSAqIHRvIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIGNvbnRyb2wgZmlsbCB0aGUgZW50aXJlIHdpZHRoIG9mIHRoZSB0ZXh0LgotICogRm9ybSB0ZXh0IGlzIG5vdCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgb3IgZGlzcG9zaW5nIGNvbnRyb2xzLCBpdCBvbmx5Ci0gKiBwbGFjZXMgdGhlbSByZWxhdGl2ZSB0byB0aGUgc3Vycm91bmRpbmcgdGV4dC4gU2ltaWxhciB0byA8Yj5pbWc8L2I+LAotICogdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIGNvbnRyb2wgY2FuIGJlIHNldCB1c2luZyB0aGUgPGI+YWxpZ248L2I+Ci0gKiBhdHRyaWJ1dGUuCi0gKiA8L3VsPgotICogPHA+Ci0gKiBOb25lIG9mIHRoZSBlbGVtZW50cyBjYW4gbmVzdC4gRm9yIGV4YW1wbGUsIHlvdSBjYW5ub3QgaGF2ZSA8Yj5iIDwvYj4gaW5zaWRlCi0gKiBhIDxiPnNwYW4gPC9iPi4gVGhpcyB3YXMgZG9uZSB0byBrZWVwIGV2ZXJ5dGhpbmcgc2ltcGxlIGFuZCB0cmFuc3BhcmVudC4KLSAqIFNpbmNlIDMuMSwgYW4gZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBoYXMgYmVlbiBhZGRlZCB0byBzdXBwb3J0IG5lc3RpbmcgaW1hZ2VzCi0gKiBhbmQgdGV4dCBpbnNpZGUgdGhlIGh5cGVybGluayB0YWcgKDxiPmE8L2I+KS4gSW1hZ2UgZW5jbG9zZWQgaW4gdGhlCi0gKiBoeXBlcmxpbmsgdGFnIGFjdHMgYXMgYSBoeXBlcmxpbmssIGNhbiBiZSBjbGlja2VkIG9uIGFuZCBjYW4gYWNjZXB0IGFuZAotICogcmVuZGVyIHNlbGVjdGlvbiBmb2N1cy4gV2hlbiBib3RoIHRleHQgYW5kIGltYWdlIGlzIGVuY2xvc2VkLCBzZWxlY3Rpb24gYW5kCi0gKiByZW5kZXJpbmcgd2lsbCBhZmZlY3QgYm90aCBhcyBhIHNpbmdsZSBoeXBlcmxpbmsuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFNpbmNlIDMuMSwgaXQgaXMgcG9zc2libGUgdG8gc2VsZWN0IHRleHQuIFRleHQgc2VsZWN0aW9uIGNhbiBiZQotICogcHJvZ3JhbW1hdGljYWxseSBhY2Nlc3NlZCBhbmQgYWxzbyBjb3BpZWQgdG8gY2xpcGJvYXJkLiBOb24tdGV4dHVhbCBvYmplY3RzCi0gKiAoaW1hZ2VzLCBjb250cm9scyBldGMuKSBpbiB0aGUgc2VsZWN0aW9uIHJhbmdlIGFyZSBpZ25vcmVkLgotICogPHA+Ci0gKiBDYXJlIHNob3VsZCBiZSB0YWtlbiB3aGVuIHVzaW5nIHRoaXMgY29udHJvbC4gRm9ybSB0ZXh0IGlzIG5vdCBhbiBIVE1MCi0gKiBicm93c2VyIGFuZCBzaG91bGQgbm90IGJlIHRyZWF0ZWQgYXMgc3VjaC4gSWYgeW91IG5lZWQgY29tcGxleCBmb3JtYXR0aW5nCi0gKiBjYXBhYmlsaXRpZXMsIHVzZSBCcm93c2VyIHdpZGdldC4gSWYgeW91IG5lZWQgZWRpdGluZyBjYXBhYmlsaXRpZXMgYW5kCi0gKiBmb250L2NvbG9yIHN0eWxlcyBvZiB0ZXh0IHNlZ21lbnRzIGlzIGFsbCB5b3UgbmVlZCwgdXNlIFN0eWxlVGV4dCB3aWRnZXQuCi0gKiBGaW5hbGx5LCBpZiBhbGwgeW91IG5lZWQgaXMgdG8gd3JhcCB0ZXh0LCB1c2UgU1dUIExhYmVsIHdpZGdldCBhbmQgY3JlYXRlIGl0Ci0gKiB3aXRoIFNXVC5XUkFQIHN0eWxlLgotICogCi0gKiBAc2VlIEZvcm1Ub29sa2l0Ci0gKiBAc2VlIFRhYmxlV3JhcExheW91dAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRm9ybVRleHQgZXh0ZW5kcyBDYW52YXMgewotCS8qKgotCSAqIFRoZSBvYmplY3QgSUQgdG8gYmUgdXNlZCB3aGVuIHJlZ2lzdGVyaW5nIGFjdGlvbiB0byBoYW5kbGUgVVJMIGh5cGVybGlua3MKLQkgKiAodGhvc2UgdGhhdCBzaG91bGQgcmVzdWx0IGluIG9wZW5pbmcgdGhlIHdlYiBicm93c2VyKS4gVmFsdWUgaXMKLQkgKiAidXJsSGFuZGxlciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0hBTkRMRVJfSUQgPSAidXJsSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFZhbHVlIG9mIHRoZSBob3Jpem9udGFsIG1hcmdpbiAoZGVmYXVsdCBpcyAwKS4KLQkgKi8KLQlwdWJsaWMgaW50IG1hcmdpbldpZHRoID0gMDsKLQotCS8qKgotCSAqIFZhbHVlIG9mIHR1ZSB2ZXJ0aWNhbCBtYXJnaW4gKGRlZmF1bHQgaXMgMSkuCi0JICovCi0JcHVibGljIGludCBtYXJnaW5IZWlnaHQgPSAxOwotCi0JLy8gcHJpdmF0ZSBmaWVsZHMKLQkvL1RPRE8gV2Ugc2hvdWxkIHJlbW92ZSB0aGUgZGVwZW5kZW5jeSBvbiBQbGF0Zm9ybQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEVYVCA9IGZhbHNlOy8vInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oRm9ybVV0aWwuREVCVUdfVEVYVCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEVYVFNJWkUgPSBmYWxzZTsvLyJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEZvcm1VdGlsLkRFQlVHX1RFWFRTSVpFKSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0ZPQ1VTID0gZmFsc2U7Ly8idHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihGb3JtVXRpbC5ERUJVR19GT0NVUykpOwkKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNGb2N1czsKLQotCXByaXZhdGUgYm9vbGVhbiBwYXJhZ3JhcGhzU2VwYXJhdGVkID0gdHJ1ZTsKLQotCXByaXZhdGUgRm9ybVRleHRNb2RlbCBtb2RlbDsKLQotCXByaXZhdGUgVmVjdG9yIGxpc3RlbmVyczsKLQotCXByaXZhdGUgSGFzaHRhYmxlIHJlc291cmNlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwcml2YXRlIElIeXBlcmxpbmtTZWdtZW50IGVudGVyZWQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW91c2VGb2N1cyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRyb2xGb2N1c1RyYW5zZmVyID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5TZWxlY3Rpb24gPSBmYWxzZTsKLQotCXByaXZhdGUgU2VsZWN0aW9uRGF0YSBzZWxEYXRhOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMX01FTlUgPSAiX19pbnRlcm5hbF9tZW51X18iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJPTF9LRVkgPSAiX19zZWdtZW50X18iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGNsYXNzIEZvcm1UZXh0TGF5b3V0IGV4dGVuZHMgTGF5b3V0IGltcGxlbWVudHMgSUxheW91dEV4dGVuc2lvbiB7Ci0JCXB1YmxpYyBGb3JtVGV4dExheW91dCgpIHsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcHV0ZU1heGltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJCXJldHVybiBjb21wdXRlU2l6ZShwYXJlbnQsIFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCkueDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcHV0ZU1pbmltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJCXJldHVybiBjb21wdXRlU2l6ZShwYXJlbnQsIDUsIFNXVC5ERUZBVUxULCB0cnVlKS54OwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBMYXlvdXQjY29tcHV0ZVNpemUoQ29tcG9zaXRlLCBpbnQsIGludCwgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwKLQkJCQlib29sZWFuIGNoYW5nZWQpIHsKLQkJCWxvbmcgc3RhcnQgPSAwOwotCi0JCQlpZiAoREVCVUdfVEVYVCkKLQkJCQlzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJaW50IGlubmVyV2lkdGggPSB3SGludDsKLQkJCWlmIChpbm5lcldpZHRoICE9IFNXVC5ERUZBVUxUKQotCQkJCWlubmVyV2lkdGggLT0gbWFyZ2luV2lkdGggKiAyOwotCQkJUG9pbnQgdGV4dFNpemUgPSBjb21wdXRlVGV4dFNpemUoaW5uZXJXaWR0aCk7Ci0JCQlpbnQgdGV4dFdpZHRoID0gdGV4dFNpemUueCArIDIgKiBtYXJnaW5XaWR0aDsKLQkJCWludCB0ZXh0SGVpZ2h0ID0gdGV4dFNpemUueSArIDIgKiBtYXJnaW5IZWlnaHQ7Ci0JCQlQb2ludCByZXN1bHQgPSBuZXcgUG9pbnQodGV4dFdpZHRoLCB0ZXh0SGVpZ2h0KTsKLQkJCWlmIChERUJVR19URVhUKSB7Ci0JCQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3JtVGV4dCBjb21wdXRlU2l6ZTogIiArIChzdG9wIC0gc3RhcnQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgIm1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChERUJVR19URVhUU0laRSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm9ybVRleHQgKCIrbW9kZWwuZ2V0QWNjZXNzaWJsZVRleHQoKSsiKSwgY29tcHV0ZVNpemU6IHdIaW50PSIrd0hpbnQrIiwgcmVzdWx0PSIrcmVzdWx0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwcml2YXRlIFBvaW50IGNvbXB1dGVUZXh0U2l6ZShpbnQgd0hpbnQpIHsKLQkJCVBhcmFncmFwaFtdIHBhcmFncmFwaHMgPSBtb2RlbC5nZXRQYXJhZ3JhcGhzKCk7Ci0JCQlHQyBnYyA9IG5ldyBHQyhGb3JtVGV4dC50aGlzKTsKLQkJCWdjLnNldEZvbnQoZ2V0Rm9udCgpKTsKLQkJCUxvY2F0b3IgbG9jID0gbmV3IExvY2F0b3IoKTsKLQkJCWludCB3aWR0aCA9IHdIaW50ICE9IFNXVC5ERUZBVUxUID8gd0hpbnQgOiAwOwotCQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCQkJaW50IGxpbmVIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsKLQkJCWJvb2xlYW4gc2VsZWN0YWJsZUluVGhlTGFzdFJvdyA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhZ3JhcGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUGFyYWdyYXBoIHAgPSBwYXJhZ3JhcGhzW2ldOwotCQkJCWlmIChpID4gMCAmJiBnZXRQYXJhZ3JhcGhzU2VwYXJhdGVkKCkKLQkJCQkJCSYmIHAuZ2V0QWRkVmVydGljYWxTcGFjZSgpKQotCQkJCQlsb2MueSArPSBnZXRQYXJhZ3JhcGhTcGFjaW5nKGxpbmVIZWlnaHQpOwotCQkJCWxvYy5yb3dIZWlnaHQgPSAwOwotCQkJCWxvYy5pbmRlbnQgPSBwLmdldEluZGVudCgpOwotCQkJCWxvYy54ID0gcC5nZXRJbmRlbnQoKTsKLQkJCQlQYXJhZ3JhcGhTZWdtZW50W10gc2VnbWVudHMgPSBwLmdldFNlZ21lbnRzKCk7Ci0JCQkJaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJc2VsZWN0YWJsZUluVGhlTGFzdFJvdyA9IGZhbHNlOwotCQkJCQlpbnQgcHdpZHRoID0gMDsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWdtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50ID0gc2VnbWVudHNbal07Ci0JCQkJCQlzZWdtZW50LmFkdmFuY2VMb2NhdG9yKGdjLCB3SGludCwgbG9jLCByZXNvdXJjZVRhYmxlLAotCQkJCQkJCQlmYWxzZSk7Ci0JCQkJCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHsKLQkJCQkJCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBsb2Mud2lkdGgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwd2lkdGggKz0gbG9jLndpZHRoOwotCQkJCQkJfQotCQkJCQkJaWYgKHNlZ21lbnQgaW5zdGFuY2VvZiBJRm9jdXNTZWxlY3RhYmxlKQotCQkJCQkJCXNlbGVjdGFibGVJblRoZUxhc3RSb3cgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmICh3SGludCA9PSBTV1QuREVGQVVMVCkKLQkJCQkJCXdpZHRoID0gTWF0aC5tYXgod2lkdGgsIHB3aWR0aCk7Ci0JCQkJCWxvYy55ICs9IGxvYy5yb3dIZWlnaHQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZW1wdHkgbmV3IGxpbmUKLQkJCQkJbG9jLnkgKz0gbGluZUhlaWdodDsKLQkJCQl9Ci0JCQl9Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCQlpZiAoc2VsZWN0YWJsZUluVGhlTGFzdFJvdykKLQkJCQlsb2MueSArPSAxOwotCQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgbG9jLnkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkJbG9uZyBzdGFydCA9IDA7Ci0KLQkJCWlmIChERUJVR19URVhUKSB7Ci0JCQkJc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCXNlbERhdGEgPSBudWxsOwotCQkJUmVjdGFuZ2xlIGNhcmVhID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJCWlmIChERUJVR19URVhUU0laRSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm9ybVRleHQgbGF5b3V0ICgiK21vZGVsLmdldEFjY2Vzc2libGVUZXh0KCkrIiksIGNhcmVhPSIrY2FyZWEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0JCQkKLQkJCUdDIGdjID0gbmV3IEdDKGNvbXBvc2l0ZSk7Ci0JCQlnYy5zZXRGb250KGdldEZvbnQoKSk7Ci0JCQllbnN1cmVCb2xkRm9udFByZXNlbnQoZ2V0Rm9udCgpKTsKLQkJCWdjLnNldEZvcmVncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsKLQkJCWdjLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQotCQkJTG9jYXRvciBsb2MgPSBuZXcgTG9jYXRvcigpOwotCQkJbG9jLm1hcmdpbldpZHRoID0gbWFyZ2luV2lkdGg7Ci0JCQlsb2MubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0OwotCQkJbG9jLnggPSBtYXJnaW5XaWR0aDsKLQkJCWxvYy55ID0gbWFyZ2luSGVpZ2h0OwotCQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCQkJaW50IGxpbmVIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsKLQotCQkJUGFyYWdyYXBoW10gcGFyYWdyYXBocyA9IG1vZGVsLmdldFBhcmFncmFwaHMoKTsKLQkJCUlIeXBlcmxpbmtTZWdtZW50IHNlbGVjdGVkTGluayA9IGdldFNlbGVjdGVkTGluaygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhZ3JhcGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUGFyYWdyYXBoIHAgPSBwYXJhZ3JhcGhzW2ldOwotCQkJCWlmIChpID4gMCAmJiBwYXJhZ3JhcGhzU2VwYXJhdGVkICYmIHAuZ2V0QWRkVmVydGljYWxTcGFjZSgpKQotCQkJCQlsb2MueSArPSBnZXRQYXJhZ3JhcGhTcGFjaW5nKGxpbmVIZWlnaHQpOwotCQkJCWxvYy5pbmRlbnQgPSBwLmdldEluZGVudCgpOwotCQkJCWxvYy5yZXNldENhcmV0KCk7Ci0JCQkJbG9jLnJvd0hlaWdodCA9IDA7Ci0JCQkJcC5sYXlvdXQoZ2MsIGNhcmVhLndpZHRoLCBsb2MsIGxpbmVIZWlnaHQsIHJlc291cmNlVGFibGUsCi0JCQkJCQlzZWxlY3RlZExpbmspOwotCQkJfQotCQkJZ2MuZGlzcG9zZSgpOwotCQkJaWYgKERFQlVHX1RFWFQpIHsKLQkJCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvcm1UZXh0LmxheW91dDogIiArIChzdG9wIC0gc3RhcnQpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udHJ1Y3RzIGEgbmV3IGZvcm0gdGV4dCB3aWRnZXQgaW4gdGhlIHByb3ZpZGVkIHBhcmVudCBhbmQgdXNpbmcgdGhlCi0JICogc3R5bGVzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIGZvcm0gdGV4dCBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHdpZGdldCBzdHlsZQotCSAqLwotCXB1YmxpYyBGb3JtVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9fQkFDS0dST1VORCB8IFNXVC5XUkFQIHwgc3R5bGUpOwotCQlzZXRMYXlvdXQobmV3IEZvcm1UZXh0TGF5b3V0KCkpOwotCQltb2RlbCA9IG5ldyBGb3JtVGV4dE1vZGVsKCk7Ci0JCWFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQltb2RlbC5kaXNwb3NlKCk7Ci0JCQkJZGlzcG9zZVJlc291cmNlVGFibGUodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCXBhaW50KGUpOwotCQkJfQotCQl9KTsKLQkJYWRkTGlzdGVuZXIoU1dULktleURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xyJykgewotCQkJCQlhY3RpdmF0ZVNlbGVjdGVkTGluaygpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKERFQlVHX0ZPQ1VTKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRyYXZlcnNhbDogIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfTkVYVDoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX1BSRVZJT1VTOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX05FWFQ6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVM6Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICghbW9kZWwuaGFzRm9jdXNTZWdtZW50cygpKSB7Ci0JCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkKLQkJCQkJZS5kb2l0ID0gYWR2YW5jZSh0cnVlKTsKLQkJCQllbHNlIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTKQotCQkJCQllLmRvaXQgPSBhZHZhbmNlKGZhbHNlKTsKLQkJCQllbHNlIGlmIChlLmRldGFpbCAhPSBTV1QuVFJBVkVSU0VfUkVUVVJOKQotCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCWlmICghaGFzRm9jdXMpIHsKLQkJCQkJaGFzRm9jdXMgPSB0cnVlOwotCQkJCQlpZiAoREVCVUdfRk9DVVMpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm9ybVRleHQ6IGZvY3VzIGdhaW5lZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKCFtb3VzZUZvY3VzICYmICFjb250cm9sRm9jdXNUcmFuc2ZlcikgewotCQkJCQkJaGFuZGxlRm9jdXNDaGFuZ2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWlmIChERUJVR19GT0NVUykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvcm1UZXh0OiBmb2N1cyBsb3N0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGhhc0ZvY3VzKSB7Ci0JCQkJCWhhc0ZvY3VzID0gZmFsc2U7Ci0JCQkJCWlmICghY29udHJvbEZvY3VzVHJhbnNmZXIpCi0JCQkJCQloYW5kbGVGb2N1c0NoYW5nZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJLy8gc2VsZWN0IGEgbGluawotCQkJCWhhbmRsZU1vdXNlQ2xpY2soZSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJLy8gYWN0aXZhdGUgYSBsaW5rCi0JCQkJaGFuZGxlTW91c2VDbGljayhlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCQlhZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE1vdXNlVHJhY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7Ci0JCQkJaGFuZGxlTW91c2VNb3ZlKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGVudGVyZWQgIT0gbnVsbCkgewotCQkJCQlleGl0TGluayhlbnRlcmVkLCBlLnN0YXRlTWFzayk7Ci0JCQkJCXBhaW50TGlua0hvdmVyKGVudGVyZWQsIGZhbHNlKTsKLQkJCQkJZW50ZXJlZCA9IG51bGw7Ci0JCQkJCXNldEN1cnNvcihudWxsKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7Ci0JCQkJaGFuZGxlTW91c2VIb3ZlcihlKTsKLQkJCX0KLQkJfSk7Ci0JCWFkZE1vdXNlTW92ZUxpc3RlbmVyKG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLQkJCQloYW5kbGVNb3VzZU1vdmUoZSk7Ci0JCQl9Ci0JCX0pOwotCQlpbml0QWNjZXNzaWJsZSgpOwotCQllbnN1cmVCb2xkRm9udFByZXNlbnQoZ2V0Rm9udCgpKTsKLQkJY3JlYXRlTWVudSgpOwotCQkvLyB3ZSB3aWxsIGhhbmRsZSB0cmF2ZXJzYWwgb2YgY29udHJvbHMsIGlmIGFueQotCQlzZXRUYWJMaXN0KG5ldyBDb250cm9sW10ge30pOwotCX0KLQotCS8qKgotCSAqIFRlc3QgZm9yIGZvY3VzLgotCSAqIAotCSAqIEByZXR1cm4gPHNhbXA+dHJ1ZSA8L3NhbXA+IGlmIHRoZSB3aWRnZXQgaGFzIGZvY3VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEZvY3VzKCkgewotCQlyZXR1cm4gaGFzRm9jdXM7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBpZiB0aGUgd2lkZ2V0IGlzIGN1cnJlbnRseSBwcm9jZXNzaW5nIHRoZSB0ZXh0IGl0IGlzIGFib3V0IHRvCi0JICogcmVuZGVyLgotCSAqIAotCSAqIEByZXR1cm4gPHNhbXA+dHJ1ZSA8L3NhbXA+IGlmIHRoZSB3aWRnZXQgaXMgc3RpbGwgbG9hZGluZyB0aGUgdGV4dCwKLQkgKiAgICAgICAgIDxzYW1wPmZhbHNlIDwvc2FtcD4gb3RoZXJ3aXNlLgotCSAqIEBkZXByZWNhdGVkIG5vdCB1c2VkIGFueSBtb3JlIC0gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRpbmcoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgY29udHJvbCB3aGlsZSB0aGUgcmVhbCBjb250ZW50Ci0JICogaXMgbG9hZGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGxvYWRpbmcgdGV4dCBtZXNzYWdlCi0JICogQGRlcHJlY2F0ZWQgbG9hZGluZyB0ZXh0IGlzIG5vdCB1c2VkIHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9hZGluZ1RleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRleHQgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBjb250cm9sIHdoaWxlIHRoZSByZWFsIGNvbnRlbnQgaXMKLQkgKiBsb2FkaW5nLiBUaGlzIGlzIHNpZ25pZmljYW50IHdoZW4gY29udGVudCB0byByZW5kZXIgaXMgbG9hZGVkIGZyb20gdGhlCi0JICogaW5wdXQgc3RyZWFtIHRoYXQgd2FzIGNyZWF0ZWQgZnJvbSBhIHJlbW90ZSBVUkwsIGFuZCB0aGUgdGltZSB0byBsb2FkIHRoZQotCSAqIGVudGlyZSBjb250ZW50IGlzIG5vbnRyaXZpYWwuCi0JICogCi0JICogQHBhcmFtIGxvYWRpbmdUZXh0Ci0JICogICAgICAgICAgICBsb2FkaW5nIHRleHQgbWVzc2FnZQotCSAqIEBkZXByZWNhdGVkIHVzZSBzZXRUZXh0KGxvYWRpbmdUZXh0LCBmYWxzZSwgZmFsc2UpOwotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvYWRpbmdUZXh0KFN0cmluZyBsb2FkaW5nVGV4dCkgewotCQlzZXRUZXh0KGxvYWRpbmdUZXh0LCBmYWxzZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIElmIHBhcmFncmFwaHMgYXJlIHNlcGFyYXRlZCwgc3BhY2luZyB3aWxsIGJlIGFkZGVkIGJldHdlZW4gdGhlbS4KLQkgKiBPdGhlcndpc2UsIG5ldyBwYXJhZ3JhcGhzIHdpbGwgc2ltcGx5IHN0YXJ0IG9uIGEgbmV3IGxpbmUgd2l0aCBubwotCSAqIHNwYWNpbmcuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICA8c2FtcD50cnVlIDwvc2FtcD4gaWYgcGFyYWdyYXBocyBhcmUgc2VwYXJhdGVkLCA8L3NhbXA+IGZhbHNlCi0JICogICAgICAgICAgICA8L3NhbXA+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhZ3JhcGhzU2VwYXJhdGVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJcGFyYWdyYXBoc1NlcGFyYXRlZCA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGlmIHRoZXJlIGlzIHNvbWUgaW50ZXItcGFyYWdyYXBoIHNwYWNpbmcuCi0JICogCi0JICogQHJldHVybiA8c2FtcD50cnVlIDwvc2FtcD4gaWYgcGFyYWdyYXBocyBhcmUgc2VwYXJhdGVkLCA8c2FtcD5mYWxzZQotCSAqICAgICAgICAgPC9zYW1wPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UGFyYWdyYXBoc1NlcGFyYXRlZCgpIHsKLQkJcmV0dXJuIHBhcmFncmFwaHNTZXBhcmF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoZSBpbWFnZSByZWZlcmVuY2VkIGJ5IHRoZSBwcm92aWRlZCBrZXkuCi0JICogPHA+Ci0JICogRm9yIDxzYW1wPmltZyA8L3NhbXA+IHRhZ3MsIGFuIG9iamVjdCBvZiBhIHR5cGUgPHNhbXA+SW1hZ2UgPC9zYW1wPiBtdXN0Ci0JICogYmUgcmVnaXN0ZXJlZCB1c2luZyB0aGUga2V5IGVxdWl2YWxlbnQgdG8gdGhlIHZhbHVlIG9mIHRoZSA8c2FtcD5ocmVmCi0JICogPC9zYW1wPiBhdHRyaWJ1dGUgdXNlZCBpbiB0aGUgdGFnLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHVuaXF1ZSBrZXkgdGhhdCBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUgPHNhbXA+aHJlZiA8L3NhbXA+Ci0JICogICAgICAgICAgICBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICBhbiBvYmplY3Qgb2YgYSB0eXBlIDxzYW1wPkltYWdlIDwvc2FtcD4uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoU3RyaW5nIGtleSwgSW1hZ2UgaW1hZ2UpIHsKLQkJcmVzb3VyY2VUYWJsZS5wdXQoImkuIiArIGtleSwgaW1hZ2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoZSBjb2xvciByZWZlcmVuY2VkIGJ5IHRoZSBwcm92aWRlZCBrZXkuCi0JICogPHA+Ci0JICogRm9yIDxzYW1wPnNwYW4gPC9zYW1wPiB0YWdzLCBhbiBvYmplY3Qgb2YgYSB0eXBlIDxzYW1wPkNvbG9yIDwvc2FtcD4gbXVzdAotCSAqIGJlIHJlZ2lzdGVyZWQgdXNpbmcgdGhlIGtleSBlcXVpdmFsZW50IHRvIHRoZSB2YWx1ZSBvZiB0aGUgPHNhbXA+Y29sb3IKLQkgKiA8L3NhbXA+IGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB1bmlxdWUga2V5IHRoYXQgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIDxzYW1wPmNvbG9yIDwvc2FtcD4KLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZS4KLQkgKiBAcGFyYW0gY29sb3IKLQkgKiAgICAgICAgICAgIGFuIG9iamVjdCBvZiB0aGUgdHlwZSA8c2FtcD5Db2xvciA8L3NhbXA+IG9yIDxzYW1wPm51bGw8L3NhbXA+Ci0JICogICAgICAgICAgICBpZiB0aGUga2V5IG5lZWRzIHRvIGJlIGNsZWFyZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sb3IoU3RyaW5nIGtleSwgQ29sb3IgY29sb3IpIHsKLQkJU3RyaW5nIGZ1bGxLZXkgPSAiYy4iICsga2V5OyAvLyROT04tTkxTLTEkCi0JCWlmIChjb2xvciA9PSBudWxsKQotCQkJcmVzb3VyY2VUYWJsZS5yZW1vdmUoZnVsbEtleSk7Ci0JCWVsc2UKLQkJCXJlc291cmNlVGFibGUucHV0KGZ1bGxLZXksIGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgdGhlIGZvbnQgcmVmZXJlbmNlZCBieSB0aGUgcHJvdmlkZWQga2V5LgotCSAqIDxwPgotCSAqIEZvciA8c2FtcD5zcGFuIDwvc2FtcD4gdGFncywgYW4gb2JqZWN0IG9mIGEgdHlwZSA8c2FtcD5Gb250IDwvc2FtcD4gbXVzdAotCSAqIGJlIHJlZ2lzdGVyZWQgdXNpbmcgdGhlIGtleSBlcXVpdmFsZW50IHRvIHRoZSB2YWx1ZSBvZiB0aGUgPHNhbXA+Zm9udAotCSAqIDwvc2FtcD4gYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHVuaXF1ZSBrZXkgdGhhdCBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUgPHNhbXA+Zm9udCA8L3NhbXA+Ci0JICogICAgICAgICAgICBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGZvbnQKLQkgKiAgICAgICAgICAgIGFuIG9iamVjdCBvZiB0aGUgdHlwZSA8c2FtcD5Gb250IDwvc2FtcD4gb3IgPHNhbXA+bnVsbDwvc2FtcD4KLQkgKiAgICAgICAgICAgIGlmIHRoZSBrZXkgbmVlZHMgdG8gYmUgY2xlYXJlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250KFN0cmluZyBrZXksIEZvbnQgZm9udCkgewotCQlTdHJpbmcgZnVsbEtleSA9ICJmLiIgKyBrZXk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZvbnQgPT0gbnVsbCkKLQkJCXJlc291cmNlVGFibGUucmVtb3ZlKGZ1bGxLZXkpOwotCQllbHNlCi0JCQlyZXNvdXJjZVRhYmxlLnB1dChmdWxsS2V5LCBmb250KTsKLQkJbW9kZWwuY2xlYXJDYWNoZShmdWxsS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgdGhlIGNvbnRyb2wgcmVmZXJlbmNlZCBieSB0aGUgcHJvdmlkZWQga2V5LgotCSAqIDxwPgotCSAqIEZvciA8c2FtcD5jb250cm9sPC9zYW1wPiB0YWdzLCBhbiBvYmplY3Qgb2YgYSB0eXBlIDxzYW1wPkNvbnRyb2w8L3NhbXA+Ci0JICogbXVzdCBiZSByZWdpc3RlcmVkIHVzaW5nIHRoZSBrZXkgZXF1aXZhbGVudCB0byB0aGUgdmFsdWUgb2YgdGhlCi0JICogPHNhbXA+Y29udHJvbDwvc2FtcD4gYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHVuaXF1ZSBrZXkgdGhhdCBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUgPHNhbXA+Y29udHJvbDwvc2FtcD4KLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZS4KLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgYW4gb2JqZWN0IG9mIHRoZSB0eXBlIDxzYW1wPkNvbnRyb2w8L3NhbXA+IG9yIDxzYW1wPm51bGw8L3NhbXA+Ci0JICogICAgICAgICAgICBpZiB0aGUgZXhpc3RpbmcgY29udHJvbCBhdCB0aGUgc3BlY2lmaWVkIGtleSBuZWVkcyB0byBiZQotCSAqICAgICAgICAgICAgcmVtb3ZlZC4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJvbChTdHJpbmcga2V5LCBDb250cm9sIGNvbnRyb2wpIHsKLQkJU3RyaW5nIGZ1bGxLZXkgPSAiby4iICsga2V5OyAvLyROT04tTkxTLTEkCi0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXNvdXJjZVRhYmxlLnJlbW92ZShmdWxsS2V5KTsKLQkJZWxzZQotCQkJcmVzb3VyY2VUYWJsZS5wdXQoZnVsbEtleSwgY29udHJvbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCB0byB1c2UgdG8gcmVuZGVyIHRoZSBkZWZhdWx0IHRleHQgKHRleHQgdGhhdCBkb2VzIG5vdCBoYXZlCi0JICogc3BlY2lhbCBmb250IHByb3BlcnR5IGFzc2lnbmVkKS4gQm9sZCBmb250IHdpbGwgYmUgY29uc3RydWN0ZWQgZnJvbSB0aGlzCi0JICogZm9udC4KLQkgKiAKLQkgKiBAcGFyYW0gZm9udAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgZm9udCB0byB1c2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgewotCQlzdXBlci5zZXRGb250KGZvbnQpOwotCQltb2RlbC5jbGVhckNhY2hlKG51bGwpOwotCQlGb250IGJvbGRGb250ID0gKEZvbnQpIHJlc291cmNlVGFibGUuZ2V0KEZvcm1UZXh0TW9kZWwuQk9MRF9GT05UX0lEKTsKLQkJaWYgKGJvbGRGb250ICE9IG51bGwpIHsKLQkJCWJvbGRGb250LmRpc3Bvc2UoKTsKLQkJCXJlc291cmNlVGFibGUucmVtb3ZlKEZvcm1UZXh0TW9kZWwuQk9MRF9GT05UX0lEKTsKLQkJfQotCQllbnN1cmVCb2xkRm9udFByZXNlbnQoZ2V0Rm9udCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcm92aWRlZCB0ZXh0LiBUZXh0IGNhbiBiZSByZW5kZXJlZCBhcy1pcywgb3IgYnkgcGFyc2luZyB0aGUKLQkgKiBmb3JtYXR0aW5nIHRhZ3MuIE9wdGlvbmFsbHksIHNlY3Rpb25zIG9mIHRleHQgc3RhcnRpbmcgd2l0aCBodHRwOi8vIHdpbGwKLQkgKiBiZSBjb252ZXJ0ZWQgdG8gaHlwZXJsaW5rcy4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gcmVuZGVyCi0JICogQHBhcmFtIHBhcnNlVGFncwotCSAqICAgICAgICAgICAgaWYgPHNhbXA+dHJ1ZSA8L3NhbXA+LCBmb3JtYXR0aW5nIHRhZ3Mgd2lsbCBiZSBwYXJzZWQuCi0JICogICAgICAgICAgICBPdGhlcndpc2UsIHRleHQgd2lsbCBiZSByZW5kZXJlZCBhcy1pcy4KLQkgKiBAcGFyYW0gZXhwYW5kVVJMcwotCSAqICAgICAgICAgICAgaWYgPHNhbXA+dHJ1ZSA8L3NhbXA+LCBVUkxzIGZvdW5kIGluIHRoZSB1bnRhZ2dlZCB0ZXh0IHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGNvbnZlcnRlZCBpbnRvIGh5cGVybGlua3MuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCwgYm9vbGVhbiBwYXJzZVRhZ3MsIGJvb2xlYW4gZXhwYW5kVVJMcykgewotCQlkaXNwb3NlUmVzb3VyY2VUYWJsZShmYWxzZSk7Ci0JCWVudGVyZWQgPSBudWxsOwotCQlpZiAocGFyc2VUYWdzKQotCQkJbW9kZWwucGFyc2VUYWdnZWRUZXh0KHRleHQsIGV4cGFuZFVSTHMpOwotCQllbHNlCi0JCQltb2RlbC5wYXJzZVJlZ3VsYXJUZXh0KHRleHQsIGV4cGFuZFVSTHMpOwotCQlob29rQ29udHJvbFNlZ21lbnRGb2N1cygpOwotCQlsYXlvdXQoKTsKLQkJcmVkcmF3KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIHN0cmVhbS4gT3B0aW9uYWxseSwgVVJMcyBpbiB1bnRhZ2dlZCB0ZXh0IGNhbiBiZQotCSAqIGNvbnZlcnRlZCBpbnRvIGh5cGVybGlua3MuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlCi0JICogc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBpcwotCSAqICAgICAgICAgICAgc3RyZWFtIHRvIHJlbmRlcgotCSAqIEBwYXJhbSBleHBhbmRVUkxzCi0JICogICAgICAgICAgICBpZiA8c2FtcD50cnVlIDwvc2FtcD4sIFVSTHMgZm91bmQgaW4gdW50YWdnZWQgdGV4dCB3aWxsIGJlCi0JICogICAgICAgICAgICBjb252ZXJ0ZWQgaW50byBoeXBlcmxpbmtzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRzKElucHV0U3RyZWFtIGlzLCBib29sZWFuIGV4cGFuZFVSTHMpIHsKLQkJZW50ZXJlZCA9IG51bGw7Ci0JCWRpc3Bvc2VSZXNvdXJjZVRhYmxlKGZhbHNlKTsKLQkJbW9kZWwucGFyc2VJbnB1dFN0cmVhbShpcywgZXhwYW5kVVJMcyk7Ci0JCWhvb2tDb250cm9sU2VnbWVudEZvY3VzKCk7Ci0JCWxheW91dCgpOwotCQlyZWRyYXcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaG9va0NvbnRyb2xTZWdtZW50Rm9jdXMoKSB7Ci0JCVBhcmFncmFwaFtdIHBhcmFncmFwaHMgPSBtb2RlbC5nZXRQYXJhZ3JhcGhzKCk7Ci0JCWlmIChwYXJhZ3JhcGhzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXN3aXRjaCAoZS50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuRm9jdXNJbjoKLQkJCQkJaWYgKCFjb250cm9sRm9jdXNUcmFuc2ZlcikKLQkJCQkJCXN5bmNDb250cm9sU2VnbWVudEZvY3VzKChDb250cm9sKSBlLndpZGdldCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULlRyYXZlcnNlOgotCQkJCQlpZiAoREVCVUdfRk9DVVMpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRyb2wgdHJhdmVyc2FsOiAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX05FWFQ6Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfUFJFVklPVVM6Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX05FWFQ6Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTOgotCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJQ29udHJvbCBjID0gKENvbnRyb2wpIGUud2lkZ2V0OwotCQkJCQlDb250cm9sU2VnbWVudCBzZWdtZW50ID0gKENvbnRyb2xTZWdtZW50KSBjCi0JCQkJCQkJLmdldERhdGEoQ09OVFJPTF9LRVkpOwotCQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKQotCQkJCQkJZS5kb2l0ID0gYWR2YW5jZUNvbnRyb2woYywgc2VnbWVudCwgdHJ1ZSk7Ci0JCQkJCWVsc2UgaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpCi0JCQkJCQllLmRvaXQgPSBhZHZhbmNlQ29udHJvbChjLCBzZWdtZW50LCBmYWxzZSk7Ci0JCQkJCWlmICghZS5kb2l0KQotCQkJCQkJZS5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFncmFwaHMubGVuZ3RoOyBpKyspIHsKLQkJCVBhcmFncmFwaCBwID0gcGFyYWdyYXBoc1tpXTsKLQkJCVBhcmFncmFwaFNlZ21lbnRbXSBzZWdtZW50cyA9IHAuZ2V0U2VnbWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VnbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoc2VnbWVudHNbal0gaW5zdGFuY2VvZiBDb250cm9sU2VnbWVudCkgewotCQkJCQlDb250cm9sU2VnbWVudCBjcyA9IChDb250cm9sU2VnbWVudCkgc2VnbWVudHNbal07Ci0JCQkJCUNvbnRyb2wgYyA9IGNzLmdldENvbnRyb2wocmVzb3VyY2VUYWJsZSk7Ci0JCQkJCWlmIChjICE9IG51bGwpIHsKLQkJCQkJCWlmIChjLmdldERhdGEoQ09OVFJPTF9LRVkpID09IG51bGwpIHsKLQkJCQkJCQkvLyBmaXJzdCB0aW1lIC0gaG9vawotCQkJCQkJCWMuc2V0RGF0YShDT05UUk9MX0tFWSwgY3MpOwotCQkJCQkJCWF0dGFjaFRyYXZlcnNlTGlzdGVuZXIoYywgbGlzdGVuZXIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGF0dGFjaFRyYXZlcnNlTGlzdGVuZXIoQ29udHJvbCBjLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoYyBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJQ29tcG9zaXRlIHBhcmVudCA9IChDb21wb3NpdGUpIGM7Ci0JCQlDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlhdHRhY2hUcmF2ZXJzZUxpc3RlbmVyKGNoaWxkcmVuW2ldLCBsaXN0ZW5lcik7Ci0JCQl9Ci0JCQlpZiAoYyBpbnN0YW5jZW9mIENhbnZhcykgewotCQkJCS8vIElmIENhbnZhcywgdGhlIGNvbnRyb2wgaXRlc2VsZiBjYW4gYWNjZXB0Ci0JCQkJLy8gdHJhdmVyc2UgZXZlbnRzIGFuZCBzaG91bGQgYmUgbW9uaXRvcmVkCi0JCQkJYy5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIGxpc3RlbmVyKTsKLQkJCQljLmFkZExpc3RlbmVyKFNXVC5Gb2N1c0luLCBsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljLmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgbGlzdGVuZXIpOwotCQkJYy5hZGRMaXN0ZW5lcihTV1QuRm9jdXNJbiwgbGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgY2xpY2sgb24gdGhlIGNvbnRyb2wgcmFuZG9tbHksIG91ciBpbnRlcm5hbCBib29rLWtlZXBpbmcgd2lsbCBiZQotCSAqIG9mZi4gV2UgbmVlZCB0byB1cGRhdGUgdGhlIG1vZGVsIGFuZCBtYXJrIHRoZSBjb250cm9sIHNlZ21lbnQgYW5kCi0JICogY3VycmVudGx5IHNlbGVjdGVkLiBIeXBlcmxpbmsgdGhhdCBtYXkgaGF2ZSBoYWQgZm9jdXMgbXVzdCBhbHNvIGJlCi0JICogZXhpdGVkLgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgY29udHJvbCB0aGF0IGdvdCBmb2N1cwotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jQ29udHJvbFNlZ21lbnRGb2N1cyhDb250cm9sIGNvbnRyb2wpIHsKLQkJQ29udHJvbFNlZ21lbnQgY3MgPSBudWxsOwotCi0JCXdoaWxlIChjb250cm9sICE9IG51bGwpIHsKLQkJCWNzID0gKENvbnRyb2xTZWdtZW50KSBjb250cm9sLmdldERhdGEoQ09OVFJPTF9LRVkpOwotCQkJaWYgKGNzICE9IG51bGwpCi0JCQkJYnJlYWs7Ci0JCQljb250cm9sID0gY29udHJvbC5nZXRQYXJlbnQoKTsKLQkJfQotCQlpZiAoY3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUZvY3VzU2VsZWN0YWJsZSBjdXJyZW50ID0gbW9kZWwuZ2V0U2VsZWN0ZWRTZWdtZW50KCk7Ci0JCS8vIElmIHRoZSBtb2RlbCBhbmQgdGhlIGNvbnRyb2wgbWF0Y2gsIGFsbCBpcyB3ZWxsCi0JCWlmIChjdXJyZW50ID09IGNzKQotCQkJcmV0dXJuOwotCQlJSHlwZXJsaW5rU2VnbWVudCBvbGRMaW5rID0gbnVsbDsKLQkJaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50IGluc3RhbmNlb2YgSUh5cGVybGlua1NlZ21lbnQpIHsKLQkJCW9sZExpbmsgPSAoSUh5cGVybGlua1NlZ21lbnQpIGN1cnJlbnQ7Ci0JCQlleGl0TGluayhvbGRMaW5rLCBTV1QuTlVMTCk7Ci0JCX0KLQkJaWYgKERFQlVHX0ZPQ1VTKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTeW5jIGNvbnRyb2w6ICIgKyBjcyArICIsIG9sZExpbms9IiArIG9sZExpbmspOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbW9kZWwuc2VsZWN0KGNzKTsKLQkJaWYgKG9sZExpbmsgIT0gbnVsbCkKLQkJCXBhaW50Rm9jdXNUcmFuc2ZlcihvbGRMaW5rLCBudWxsKTsKLQkJLy8gZ2V0QWNjZXNzaWJsZSgpLnNldEZvY3VzKG1vZGVsLmdldFNlbGVjdGVkU2VnbWVudEluZGV4KCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZHZhbmNlQ29udHJvbChDb250cm9sIGMsIENvbnRyb2xTZWdtZW50IHNlZ21lbnQsCi0JCQlib29sZWFuIG5leHQpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IGMuZ2V0UGFyZW50KCk7Ci0JCWlmIChwYXJlbnQgPT0gdGhpcykgewotCQkJLy8gc2VnbWVudC1sZXZlbCBjb250cm9sCi0JCQlJRm9jdXNTZWxlY3RhYmxlIG5leHRTZWdtZW50ID0gbW9kZWwuZ2V0TmV4dEZvY3VzU2VnbWVudChuZXh0KTsKLQkJCWlmIChuZXh0U2VnbWVudCAhPSBudWxsKSB7Ci0JCQkJY29udHJvbEZvY3VzVHJhbnNmZXIgPSB0cnVlOwotCQkJCXN1cGVyLmZvcmNlRm9jdXMoKTsKLQkJCQljb250cm9sRm9jdXNUcmFuc2ZlciA9IGZhbHNlOwotCQkJCW1vZGVsLnNlbGVjdChzZWdtZW50KTsKLQkJCQlyZXR1cm4gYWR2YW5jZShuZXh0KTsKLQkJCX0KLQkJCS8vIG5vd2hlcmUgdG8gZ28KLQkJCXJldHVybiBzZXRGb2N1c1RvTmV4dFNpYmxpbmcodGhpcywgbmV4dCk7Ci0JCX0KLQkJaWYgKHNldEZvY3VzVG9OZXh0U2libGluZyhjLCBuZXh0KSkKLQkJCXJldHVybiB0cnVlOwotCQkvLyBzdGlsbCBoZXJlIC0gbXVzdCBnbyBvbmUgbGV2ZWwgdXAKLQkJc2VnbWVudCA9IChDb250cm9sU2VnbWVudCkgcGFyZW50LmdldERhdGEoQ09OVFJPTF9LRVkpOwotCQlyZXR1cm4gYWR2YW5jZUNvbnRyb2wocGFyZW50LCBzZWdtZW50LCBuZXh0KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2V0Rm9jdXNUb05leHRTaWJsaW5nKENvbnRyb2wgYywgYm9vbGVhbiBuZXh0KSB7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBjLmdldFBhcmVudCgpOwotCQlDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0VGFiTGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQlpZiAoY2hpbGQgPT0gYykgewotCQkJCS8vIGhlcmUKLQkJCQlpZiAobmV4dCkgewotCQkJCQlmb3IgKGludCBqID0gaSArIDE7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQkJQ29udHJvbCBuYyA9IGNoaWxkcmVuW2pdOwotCQkJCQkJaWYgKG5jLnNldEZvY3VzKCkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChpbnQgaiA9IGkgLSAxOyBqID49IDA7IGotLSkgewotCQkJCQkJQ29udHJvbCBwYyA9IGNoaWxkcmVuW2pdOwotCQkJCQkJaWYgKHBjLnNldEZvY3VzKCkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9scyB3aGV0aGVyIHdoaXRlc3BhY2UgaW5zaWRlIHBhcmFncmFwaCBhbmQgbGlzdCBpdGVtcyBpcwotCSAqIG5vcm1hbGl6ZWQuIE5vdGUgdGhhdCB0aGUgbmV3IHZhbHVlIHdpbGwgbm90IGFmZmVjdCB0aGUgY3VycmVudCB0ZXh0IGluCi0JICogdGhlIGNvbnRyb2wsIG9ubHkgc3Vic2VxdWVudCBjYWxscyB0byA8Y29kZT5zZXRUZXh0PC9jb2RlPiBvcgotCSAqIDxjb2RlPnNldENvbnRlbnRzPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBJZiBub3JtYWxpemVkOgotCSAqIDx1bD4KLQkgKiA8bGk+YWxsIHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMgd2lsbCBiZSBjb25kZW5zZWQgaW50byBhdCBtb3N0IG9uZSB3aGVuCi0JICogYmV0d2VlbiB3b3Jkcy48L2xpPgotCSAqIDxsaT5uZXcgbGluZSBjaGFyYWN0ZXJzIHdpbGwgYmUgaWdub3JlZCBhbmQgcmVwbGFjZWQgd2l0aCBvbmUgd2hpdGUKLQkgKiBzcGFjZSBjaGFyYWN0ZXI8L2xpPgotCSAqIDxsaT53aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBvcGVuaW5nIHRhZ3MgYW5kIGJlZm9yZSB0aGUgY2xvc2luZwotCSAqIHRhZ3Mgd2lsbCBiZSB0cmltbWVkPC9saT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHdoaXRlc3BhY2UgaXMgbm9ybWFsaXplZCwKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2hpdGVzcGFjZU5vcm1hbGl6ZWQoYm9vbGVhbiB2YWx1ZSkgewotCQltb2RlbC5zZXRXaGl0ZXNwYWNlTm9ybWFsaXplZCh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB3aGl0ZXNwYWNlIGluc2lkZSBwYXJhZ3JhcGggYW5kIGxpc3QgaXRlbSBpcyBub3JtYWxpemVkLgotCSAqIAotCSAqIEBzZWUgI3NldFdoaXRlc3BhY2VOb3JtYWxpemVkKGJvb2xlYW4pCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB3aGl0ZXNwYWNlIGlzIG5vcm1hbGl6ZWQsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZU5vcm1hbGl6ZWQoKSB7Ci0JCXJldHVybiBtb2RlbC5pc1doaXRlc3BhY2VOb3JtYWxpemVkKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIGludGVybmFsIG1lbnUgaWYgY3JlYXRlZCBhbmQgc2V0cyB0aGUgbWVudSBwcm92aWRlZCBhcyBhCi0JICogcGFyYW1ldGVyLgotCSAqIAotCSAqIEBwYXJhbSBtZW51Ci0JICogICAgICAgICAgICB0aGUgbWVudSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lbnUoTWVudSBtZW51KSB7Ci0JCU1lbnUgY3VycmVudE1lbnUgPSBzdXBlci5nZXRNZW51KCk7Ci0JCWlmIChjdXJyZW50TWVudSAhPSBudWxsICYmIElOVEVSTkFMX01FTlUuZXF1YWxzKGN1cnJlbnRNZW51LmdldERhdGEoKSkpIHsKLQkJCS8vIGludGVybmFsIG1lbnUgc2V0Ci0JCQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudE1lbnUuZGlzcG9zZSgpOwotCQkJCXN1cGVyLnNldE1lbnUobWVudSk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJc3VwZXIuc2V0TWVudShtZW51KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTWVudSgpIHsKLQkJTWVudSBtZW51ID0gbmV3IE1lbnUodGhpcyk7Ci0JCWZpbmFsIE1lbnVJdGVtIGNvcHlJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQkJY29weUl0ZW0uc2V0VGV4dChNZXNzYWdlcy5Gb3JtVGV4dF9jb3B5KTsKLQotCQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCA9PSBjb3B5SXRlbSkgewotCQkJCQljb3B5KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCW1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCQljb3B5SXRlbS5zZXRFbmFibGVkKGNhbkNvcHkoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1lbnVIaWRkZW4oTWVudUV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCW1lbnUuc2V0RGF0YShJTlRFUk5BTF9NRU5VKTsKLQkJc3VwZXIuc2V0TWVudShtZW51KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoeXBlcmxpbmsgc2V0dGluZ3MgdGhhdCBhcmUgaW4gZWZmZWN0IGZvciB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBjdXJyZW50IGh5cGVybGlua3Mgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgSHlwZXJsaW5rU2V0dGluZ3MgZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSB7Ci0JCXJldHVybiBtb2RlbC5nZXRIeXBlcmxpbmtTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGh5cGVybGluayBzZXR0aW5ncyB0byBiZSB1c2VkIGZvciB0aGlzIGNvbnRyb2wuIFNldHRpbmdzIHdpbGwKLQkgKiBhZmZlY3QgdGhpbmdzIGxpa2UgaHlwZXJsaW5rIGNvbG9yLCByZW5kZXJpbmcgc3R5bGUsIGN1cnNvciBldGMuCi0JICogCi0JICogQHBhcmFtIHNldHRpbmdzCi0JICogICAgICAgICAgICBoeXBlcmxpbmsgc2V0dGluZ3MgZm9yIHRoaXMgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1NldHRpbmdzKEh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzKSB7Ci0JCW1vZGVsLnNldEh5cGVybGlua1NldHRpbmdzKHNldHRpbmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGhhbmRsZSBoeXBlcmxpbmsgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEh5cGVybGlua0xpc3RlbmVyKElIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlsaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGh5cGVybGluayBsaXN0ZW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVIeXBlcmxpbmtMaXN0ZW5lcihJSHlwZXJsaW5rTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgc2VsZWN0aW9uIGxpc3RlbmVyLiBBIFNlbGVjdGlvbiBldmVudCBpcyBzZW50IGJ5IHRoZSB3aWRnZXQgd2hlbgotCSAqIHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICogPHA+Ci0JICogPGNvZGU+d2lkZ2V0RGVmYXVsdFNlbGVjdGVkPC9jb2RlPiBpcyBub3QgY2FsbGVkIGZvciBGb3JtVGV4dC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIKLQkgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIDx1bD4KLQkgKiAgICAgICAgICAgICAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuCi0JICogICAgICAgICAgICAgICAgZGlzcG9zZWQ8L2xpPgotCSAqICAgICAgICAgICAgICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlCi0JICogICAgICAgICAgICAgICAgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotCSAqICAgICAgICAgICAgICAgIDwvdWw+Ci0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICAgICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgd2hlbiBsaXN0ZW5lciBpcyBudWxsPC9saT4KLQkgKiAgICAgICAgICAgICAgICA8L3VsPgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQljaGVja1dpZGdldCgpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQkJfQotCQlUeXBlZExpc3RlbmVyIHR5cGVkTGlzdGVuZXIgPSBuZXcgVHlwZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHR5cGVkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBzZWxlY3Rpb24gbGlzdGVuZXIuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIKLQkgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIDx1bD4KLQkgKiAgICAgICAgICAgICAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuCi0JICogICAgICAgICAgICAgICAgZGlzcG9zZWQ8L2xpPgotCSAqICAgICAgICAgICAgICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlCi0JICogICAgICAgICAgICAgICAgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotCSAqICAgICAgICAgICAgICAgIDwvdWw+Ci0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICAgICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgd2hlbiBsaXN0ZW5lciBpcyBudWxsPC9saT4KLQkgKiAgICAgICAgICAgICAgICA8L3VsPgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQljaGVja1dpZGdldCgpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQkJfQotCQlyZW1vdmVMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcmV0dXJuIHNlbGVjdGVkIHRleHQsIG9yIGFuIGVtcHR5IFN0cmluZyBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24uCi0JICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICAgICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbgotCSAqICAgICAgICAgICAgICAgIGRpc3Bvc2VkPC9saT4KLQkgKiAgICAgICAgICAgICAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZQotCSAqICAgICAgICAgICAgICAgIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLQkgKiAgICAgICAgICAgICAgICA8L3VsPgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uVGV4dCgpIHsKLQkJY2hlY2tXaWRnZXQoKTsKLQkJaWYgKHNlbERhdGEgIT0gbnVsbCkKLQkJCXJldHVybiBzZWxEYXRhLmdldFNlbGVjdGlvblRleHQoKTsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGVzdHMgaWYgdGhlIHRleHQgaXMgc2VsZWN0ZWQgYW5kIGNhbiBiZSBjb3BpZWQgaW50byB0aGUgY2xpcGJvYXJkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlbGVjdGVkIHRleHQgY2FuIGJlIGNvcGllZCBpbnRvIHRoZQotCSAqICAgICAgICAgY2xpcGJvYXJkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db3B5KCkgewotCQlyZXR1cm4gc2VsRGF0YSAhPSBudWxsICYmIHNlbERhdGEuY2FuQ29weSgpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgc2VsZWN0ZWQgdGV4dCBpbnRvIHRoZSBjbGlwYm9hcmQuIERvZXMgbm90aGluZyBpZiBubyB0ZXh0IGlzCi0JICogc2VsZWN0ZWQgb3IgdGhlIHRleHQgY2Fubm90IGJlIGNvcGllZCBmb3IgYW55IG90aGVyIHJlYXNvbi4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0KLQlwdWJsaWMgdm9pZCBjb3B5KCkgewotCQlpZiAoIWNhbkNvcHkoKSkKLQkJCXJldHVybjsKLQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoZ2V0RGlzcGxheSgpKTsKLQkJT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbXSB7IGdldFNlbGVjdGlvblRleHQoKSB9OwotCQlUcmFuc2ZlcltdIHQgPSBuZXcgVHJhbnNmZXJbXSB7IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCWNsaXBib2FyZC5zZXRDb250ZW50cyhvLCB0KTsKLQkJY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2Ugb2YgdGhlIGh5cGVybGluayB0aGF0IGN1cnJlbnRseSBoYXMga2V5Ym9hcmQgZm9jdXMsCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGh5cGVybGlua3MgaW4gdGhlIHJlY2VpdmVyIG9yIG5vCi0JICogaHlwZXJsaW5rIGhhcyBmb2N1cyBhdCB0aGUgbW9tZW50LgotCSAqIAotCSAqIEByZXR1cm4gaHJlZiBvZiB0aGUgc2VsZWN0ZWQgaHlwZXJsaW5rIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiAgICAgICAgIHNlbGVjdGVkLgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkTGlua0hyZWYoKSB7Ci0JCUlIeXBlcmxpbmtTZWdtZW50IGxpbmsgPSBnZXRTZWxlY3RlZExpbmsoKTsKLQkJcmV0dXJuIGxpbmsgIT0gbnVsbCA/IGxpbmsuZ2V0SHJlZigpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBoeXBlcmxpbmsgdGhhdCBjdXJyZW50bHkgaGFzIGtleWJvYXJkIGZvY3VzLCBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBoeXBlcmxpbmtzIGluIHRoZSByZWNlaXZlciBvciBubwotCSAqIGh5cGVybGluayBoYXMgZm9jdXMgYXQgdGhlIG1vbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRleHQgb2YgdGhlIHNlbGVjdGVkIGh5cGVybGluayBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogICAgICAgICBzZWxlY3RlZC4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZExpbmtUZXh0KCkgewotCQlJSHlwZXJsaW5rU2VnbWVudCBsaW5rID0gZ2V0U2VsZWN0ZWRMaW5rKCk7Ci0JCXJldHVybiBsaW5rICE9IG51bGwgPyBsaW5rLmdldFRleHQoKSA6IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJSHlwZXJsaW5rU2VnbWVudCBnZXRTZWxlY3RlZExpbmsoKSB7Ci0JCUlGb2N1c1NlbGVjdGFibGUgc2VnbWVudCA9IG1vZGVsLmdldFNlbGVjdGVkU2VnbWVudCgpOwotCQlpZiAoc2VnbWVudCAhPSBudWxsICYmIHNlZ21lbnQgaW5zdGFuY2VvZiBJSHlwZXJsaW5rU2VnbWVudCkKLQkJCXJldHVybiAoSUh5cGVybGlua1NlZ21lbnQpIHNlZ21lbnQ7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0QWNjZXNzaWJsZSgpIHsKLQkJQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gZ2V0QWNjZXNzaWJsZSgpOwotCQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKQotCQkJCQllLnJlc3VsdCA9IG1vZGVsLmdldEFjY2Vzc2libGVUZXh0KCk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBsaW5rQ291bnQgPSBtb2RlbC5nZXRIeXBlcmxpbmtDb3VudCgpOwotCQkJCQlpZiAoZS5jaGlsZElEID49IDAgJiYgZS5jaGlsZElEIDwgbGlua0NvdW50KSB7Ci0JCQkJCQlJSHlwZXJsaW5rU2VnbWVudCBsaW5rID0gbW9kZWwuZ2V0SHlwZXJsaW5rKGUuY2hpbGRJRCk7Ci0JCQkJCQllLnJlc3VsdCA9IGxpbmsuZ2V0VGV4dCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBnZXRIZWxwKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJZS5yZXN1bHQgPSBnZXRUb29sVGlwVGV4dCgpOwotCQkJCWludCBsaW5rQ291bnQgPSBtb2RlbC5nZXRIeXBlcmxpbmtDb3VudCgpOwotCQkJCWlmIChlLnJlc3VsdCA9PSBudWxsICYmIGUuY2hpbGRJRCA+PSAwICYmIGUuY2hpbGRJRCA8IGxpbmtDb3VudCkgewotCQkJCQlJSHlwZXJsaW5rU2VnbWVudCBsaW5rID0gbW9kZWwuZ2V0SHlwZXJsaW5rKGUuY2hpbGRJRCk7Ci0JCQkJCWUucmVzdWx0ID0gbGluay5nZXRUZXh0KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXRDaGlsZEF0UG9pbnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJUG9pbnQgcHQgPSB0b0NvbnRyb2wobmV3IFBvaW50KGUueCwgZS55KSk7Ci0JCQkJSUh5cGVybGlua1NlZ21lbnQgbGluayA9IG1vZGVsLmZpbmRIeXBlcmxpbmtBdChwdC54LCBwdC55KTsKLQkJCQlpZiAobGluayAhPSBudWxsKQotCQkJCQllLmNoaWxkSUQgPSBtb2RlbC5pbmRleE9mKGxpbmspOwotCQkJCWVsc2UKLQkJCQkJZS5jaGlsZElEID0gQUNDLkNISUxESURfU0VMRjsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZ2V0TG9jYXRpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGxvY2F0aW9uID0gbnVsbDsKLQkJCQlpZiAoZS5jaGlsZElEICE9IEFDQy5DSElMRElEX1NFTEYKLQkJCQkJCSYmIGUuY2hpbGRJRCAhPSBBQ0MuQ0hJTERJRF9OT05FKSB7Ci0JCQkJCWludCBpbmRleCA9IGUuY2hpbGRJRDsKLQkJCQkJSUh5cGVybGlua1NlZ21lbnQgbGluayA9IG1vZGVsLmdldEh5cGVybGluayhpbmRleCk7Ci0JCQkJCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCQkJCWxvY2F0aW9uID0gbGluay5nZXRCb3VuZHMoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJCQlsb2NhdGlvbiA9IGdldEJvdW5kcygpOwotCQkJCX0KLQkJCQlQb2ludCBwdCA9IHRvRGlzcGxheShuZXcgUG9pbnQobG9jYXRpb24ueCwgbG9jYXRpb24ueSkpOwotCQkJCWUueCA9IHB0Lng7Ci0JCQkJZS55ID0gcHQueTsKLQkJCQllLndpZHRoID0gbG9jYXRpb24ud2lkdGg7Ci0JCQkJZS5oZWlnaHQgPSBsb2NhdGlvbi5oZWlnaHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGdldEZvY3VzKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJCWludCBjaGlsZElEID0gQUNDLkNISUxESURfTk9ORTsKLQotCQkJCWlmIChpc0ZvY3VzQ29udHJvbCgpKSB7Ci0JCQkJCWludCBzZWxlY3RlZEluZGV4ID0gbW9kZWwuZ2V0U2VsZWN0ZWRTZWdtZW50SW5kZXgoKTsKLQkJCQkJaWYgKHNlbGVjdGVkSW5kZXggPT0gLTEpIHsKLQkJCQkJCWNoaWxkSUQgPSBBQ0MuQ0hJTERJRF9TRUxGOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY2hpbGRJRCA9IHNlbGVjdGVkSW5kZXg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZS5jaGlsZElEID0gY2hpbGRJRDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRDb3VudChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCQllLmRldGFpbCA9IG1vZGVsLmdldEh5cGVybGlua0NvdW50KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGdldFJvbGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaW50IHJvbGUgPSAwOwotCQkJCWludCBjaGlsZElEID0gZS5jaGlsZElEOwotCQkJCWludCBsaW5rQ291bnQgPSBtb2RlbC5nZXRIeXBlcmxpbmtDb3VudCgpOwotCQkJCWlmIChjaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpIHsKLQkJCQkJcm9sZSA9IEFDQy5ST0xFX1RFWFQ7Ci0JCQkJfSBlbHNlIGlmIChjaGlsZElEID49IDAgJiYgY2hpbGRJRCA8IGxpbmtDb3VudCkgewotCQkJCQlyb2xlID0gQUNDLlJPTEVfTElOSzsKLQkJCQl9Ci0JCQkJZS5kZXRhaWwgPSByb2xlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBnZXRTZWxlY3Rpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaW50IHNlbGVjdGVkSW5kZXggPSBtb2RlbC5nZXRTZWxlY3RlZFNlZ21lbnRJbmRleCgpOwotCQkJCWUuY2hpbGRJRCA9IChzZWxlY3RlZEluZGV4ID09IC0xKSA/IEFDQy5DSElMRElEX05PTkUKLQkJCQkJCTogc2VsZWN0ZWRJbmRleDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaW50IGxpbmtDb3VudCA9IG1vZGVsLmdldEh5cGVybGlua0NvdW50KCk7Ci0JCQkJaW50IHNlbGVjdGVkSW5kZXggPSBtb2RlbC5nZXRTZWxlY3RlZFNlZ21lbnRJbmRleCgpOwotCQkJCWludCBzdGF0ZSA9IDA7Ci0JCQkJaW50IGNoaWxkSUQgPSBlLmNoaWxkSUQ7Ci0JCQkJaWYgKGNoaWxkSUQgPT0gQUNDLkNISUxESURfU0VMRikgewotCQkJCQlzdGF0ZSA9IEFDQy5TVEFURV9OT1JNQUw7Ci0JCQkJfSBlbHNlIGlmIChjaGlsZElEID49IDAgJiYgY2hpbGRJRCA8IGxpbmtDb3VudCkgewotCQkJCQlzdGF0ZSA9IEFDQy5TVEFURV9TRUxFQ1RBQkxFOwotCQkJCQlpZiAoaXNGb2N1c0NvbnRyb2woKSkgewotCQkJCQkJc3RhdGUgfD0gQUNDLlNUQVRFX0ZPQ1VTQUJMRTsKLQkJCQkJfQotCQkJCQlpZiAoc2VsZWN0ZWRJbmRleCA9PSBjaGlsZElEKSB7Ci0JCQkJCQlzdGF0ZSB8PSBBQ0MuU1RBVEVfU0VMRUNURUQ7Ci0JCQkJCQlpZiAoaXNGb2N1c0NvbnRyb2woKSkgewotCQkJCQkJCXN0YXRlIHw9IEFDQy5TVEFURV9GT0NVU0VEOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXN0YXRlIHw9IEFDQy5TVEFURV9SRUFET05MWTsKLQkJCQllLmRldGFpbCA9IHN0YXRlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBnZXRDaGlsZHJlbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpbnQgbGlua0NvdW50ID0gbW9kZWwuZ2V0SHlwZXJsaW5rQ291bnQoKTsKLQkJCQlPYmplY3RbXSBjaGlsZHJlbiA9IG5ldyBPYmplY3RbbGlua0NvdW50XTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmtDb3VudDsgaSsrKSB7Ci0JCQkJCWNoaWxkcmVuW2ldID0gbmV3IEludGVnZXIoaSk7Ci0JCQkJfQotCQkJCWUuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJLy8gZS5yZXN1bHQgPSBtb2RlbC5nZXRBY2Nlc3NpYmxlVGV4dCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRTZWxlY3Rpb24oTW91c2VFdmVudCBlKSB7Ci0JCWluU2VsZWN0aW9uID0gdHJ1ZTsKLQkJc2VsRGF0YSA9IG5ldyBTZWxlY3Rpb25EYXRhKGUpOwotCQlyZWRyYXcoKTsKLQkJRm9ybSBmb3JtID0gRm9ybVV0aWwuZ2V0Rm9ybSh0aGlzKTsKLQkJaWYgKGZvcm0gIT0gbnVsbCkKLQkJCWZvcm0uc2V0U2VsZWN0aW9uVGV4dCh0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kU2VsZWN0aW9uKE1vdXNlRXZlbnQgZSkgewotCQlpblNlbGVjdGlvbiA9IGZhbHNlOwotCQlpZiAoc2VsRGF0YSAhPSBudWxsKSB7Ci0JCQlpZiAoIXNlbERhdGEuaXNFbmNsb3NlZCgpKQotCQkJCXNlbERhdGEgPSBudWxsOwotCQkJZWxzZQotCQkJCWNvbXB1dGVTZWxlY3Rpb24oKTsKLQkJfQotCQlub3RpZnlTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVTZWxlY3Rpb24oKSB7Ci0JCUdDIGdjID0gbmV3IEdDKHRoaXMpOwotCQlQYXJhZ3JhcGhbXSBwYXJhZ3JhcGhzID0gbW9kZWwuZ2V0UGFyYWdyYXBocygpOwotCQlJSHlwZXJsaW5rU2VnbWVudCBzZWxlY3RlZExpbmsgPSBnZXRTZWxlY3RlZExpbmsoKTsKLQkJaWYgKGdldERpc3BsYXkoKS5nZXRGb2N1c0NvbnRyb2woKSAhPSB0aGlzKQotCQkJc2VsZWN0ZWRMaW5rID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhZ3JhcGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlQYXJhZ3JhcGggcCA9IHBhcmFncmFwaHNbaV07Ci0JCQlpZiAoaSA+IDApCi0JCQkJc2VsRGF0YS5tYXJrTmV3TGluZSgpOwotCQkJcC5jb21wdXRlU2VsZWN0aW9uKGdjLCByZXNvdXJjZVRhYmxlLCBzZWxlY3RlZExpbmssIHNlbERhdGEpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQl2b2lkIGNsZWFyU2VsZWN0aW9uKCkgewotCQlzZWxEYXRhID0gbnVsbDsKLQkJaWYgKCFpc0Rpc3Bvc2VkKCkpIHsKLQkJCXJlZHJhdygpOwotCQkJbm90aWZ5U2VsZWN0aW9uQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LndpZGdldCA9IHRoaXM7Ci0JCWV2ZW50LmRpc3BsYXkgPSB0aGlzLmdldERpc3BsYXkoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5TZWxlY3Rpb247Ci0JCW5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBldmVudCk7Ci0JCWdldEFjY2Vzc2libGUoKS5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURyYWcoTW91c2VFdmVudCBlKSB7Ci0JCWlmIChzZWxEYXRhICE9IG51bGwpIHsKLQkJCVNjcm9sbGVkQ29tcG9zaXRlIHNjb21wID0gRm9ybVV0aWwuZ2V0U2Nyb2xsZWRDb21wb3NpdGUodGhpcyk7Ci0JCQlpZiAoc2NvbXAgIT0gbnVsbCkgewotCQkJCUZvcm1VdGlsLmVuc3VyZVZpc2libGUoc2NvbXAsIHRoaXMsIGUpOwotCQkJfQotCQkJc2VsRGF0YS51cGRhdGUoZSk7Ci0JCQlyZWRyYXcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVNb3VzZUNsaWNrKE1vdXNlRXZlbnQgZSwgYm9vbGVhbiBkb3duKSB7Ci0JCWlmIChERUJVR19GT0NVUykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm9ybVRleHQ6IG1vdXNlIGNsaWNrKCIgKyBkb3duICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChkb3duKSB7Ci0JCQkvLyBzZWxlY3QgYSBoeXBlcmxpbmsKLQkJCW1vdXNlRm9jdXMgPSB0cnVlOwotCQkJSUh5cGVybGlua1NlZ21lbnQgc2VnbWVudFVuZGVyID0gbW9kZWwuZmluZEh5cGVybGlua0F0KGUueCwgZS55KTsKLQkJCWlmIChzZWdtZW50VW5kZXIgIT0gbnVsbCkgewotCQkJCUlIeXBlcmxpbmtTZWdtZW50IG9sZExpbmsgPSBnZXRTZWxlY3RlZExpbmsoKTsKLQkJCQlpZiAoZ2V0RGlzcGxheSgpLmdldEZvY3VzQ29udHJvbCgpICE9IHRoaXMpIHsKLQkJCQkJc2V0Rm9jdXMoKTsKLQkJCQl9Ci0JCQkJbW9kZWwuc2VsZWN0TGluayhzZWdtZW50VW5kZXIpOwotCQkJCWVudGVyTGluayhzZWdtZW50VW5kZXIsIGUuc3RhdGVNYXNrKTsKLQkJCQlwYWludEZvY3VzVHJhbnNmZXIob2xkTGluaywgc2VnbWVudFVuZGVyKTsKLQkJCX0KLQkJCWlmIChlLmJ1dHRvbiA9PSAxKQotCQkJCXN0YXJ0U2VsZWN0aW9uKGUpOwotCQkJZWxzZSB7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZS5idXR0b24gPT0gMSkgewotCQkJCWVuZFNlbGVjdGlvbihlKTsKLQkJCQlJSHlwZXJsaW5rU2VnbWVudCBzZWdtZW50VW5kZXIgPSBtb2RlbAotCQkJCQkJLmZpbmRIeXBlcmxpbmtBdChlLngsIGUueSk7Ci0JCQkJaWYgKHNlZ21lbnRVbmRlciAhPSBudWxsICYmIHNlbERhdGEgPT0gbnVsbCkgewotCQkJCQlhY3RpdmF0ZUxpbmsoc2VnbWVudFVuZGVyLCBlLnN0YXRlTWFzayk7Ci0JCQkJfQotCQkJfQotCQkJbW91c2VGb2N1cyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRvb2x0aXBUZXh0KFBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCkgewotCQlTdHJpbmcgdG9vbHRpcFRleHQgPSBudWxsOwotCQlpZiAoc2VnbWVudCAhPSBudWxsKSB7Ci0JCQl0b29sdGlwVGV4dCA9IHNlZ21lbnQuZ2V0VG9vbHRpcFRleHQoKTsKLQkJfQotCQlTdHJpbmcgY3VycmVudFRvb2x0aXBUZXh0ID0gZ2V0VG9vbFRpcFRleHQoKTsKLQotCQlpZiAoKGN1cnJlbnRUb29sdGlwVGV4dCAhPSBudWxsICYmIHRvb2x0aXBUZXh0ID09IG51bGwpCi0JCQkJfHwgKGN1cnJlbnRUb29sdGlwVGV4dCA9PSBudWxsICYmIHRvb2x0aXBUZXh0ICE9IG51bGwpKQotCQkJc2V0VG9vbFRpcFRleHQodG9vbHRpcFRleHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVNb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0JCWlmIChpblNlbGVjdGlvbikgewotCQkJaGFuZGxlRHJhZyhlKTsKLQkJCXJldHVybjsKLQkJfQotCQlQYXJhZ3JhcGhTZWdtZW50IHNlZ21lbnRVbmRlciA9IG1vZGVsLmZpbmRTZWdtZW50QXQoZS54LCBlLnkpOwotCQl1cGRhdGVUb29sdGlwVGV4dChzZWdtZW50VW5kZXIpOwotCQlpZiAoc2VnbWVudFVuZGVyID09IG51bGwpIHsKLQkJCWlmIChlbnRlcmVkICE9IG51bGwpIHsKLQkJCQlleGl0TGluayhlbnRlcmVkLCBlLnN0YXRlTWFzayk7Ci0JCQkJcGFpbnRMaW5rSG92ZXIoZW50ZXJlZCwgZmFsc2UpOwotCQkJCWVudGVyZWQgPSBudWxsOwotCQkJfQotCQkJc2V0Q3Vyc29yKG51bGwpOwotCQl9IGVsc2UgewotCQkJaWYgKHNlZ21lbnRVbmRlciBpbnN0YW5jZW9mIElIeXBlcmxpbmtTZWdtZW50KSB7Ci0JCQkJSUh5cGVybGlua1NlZ21lbnQgbGlua1VuZGVyID0gKElIeXBlcmxpbmtTZWdtZW50KSBzZWdtZW50VW5kZXI7Ci0JCQkJaWYgKGVudGVyZWQgPT0gbnVsbCkgewotCQkJCQllbnRlcmVkID0gbGlua1VuZGVyOwotCQkJCQllbnRlckxpbmsobGlua1VuZGVyLCBlLnN0YXRlTWFzayk7Ci0JCQkJCXBhaW50TGlua0hvdmVyKGVudGVyZWQsIHRydWUpOwotCQkJCQlzZXRDdXJzb3IobW9kZWwuZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKS5nZXRIeXBlcmxpbmtDdXJzb3IoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZW50ZXJlZCAhPSBudWxsKSB7Ci0JCQkJCWV4aXRMaW5rKGVudGVyZWQsIGUuc3RhdGVNYXNrKTsKLQkJCQkJcGFpbnRMaW5rSG92ZXIoZW50ZXJlZCwgZmFsc2UpOwotCQkJCQllbnRlcmVkID0gbnVsbDsKLQkJCQl9Ci0JCQkJaWYgKHNlZ21lbnRVbmRlciBpbnN0YW5jZW9mIFRleHRTZWdtZW50KQotCQkJCQlzZXRDdXJzb3IobW9kZWwuZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKS5nZXRUZXh0Q3Vyc29yKCkpOwotCQkJCWVsc2UKLQkJCQkJc2V0Q3Vyc29yKG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFkdmFuY2UoYm9vbGVhbiBuZXh0KSB7Ci0JCWlmIChERUJVR19GT0NVUykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWR2YW5jZTogbmV4dD0iICsgbmV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJSUZvY3VzU2VsZWN0YWJsZSBjdXJyZW50ID0gbW9kZWwuZ2V0U2VsZWN0ZWRTZWdtZW50KCk7Ci0JCWlmIChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudCBpbnN0YW5jZW9mIElIeXBlcmxpbmtTZWdtZW50KQotCQkJZXhpdExpbmsoKElIeXBlcmxpbmtTZWdtZW50KSBjdXJyZW50LCBTV1QuTlVMTCk7Ci0JCUlGb2N1c1NlbGVjdGFibGUgbmV3U2VnbWVudCA9IG51bGw7Ci0JCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQkJLy8gZ2V0IHRoZSBuZXh0IHNlZ21lbnQgdGhhdCBjYW4gYWNjZXB0IGZvY3VzLiBMaW5rcwotCQkvLyBjYW4gYWx3YXlzIGFjY2VwdCBmb2N1cyBidXQgY29udHJvbHMgbWF5IG5vdAotCQl3aGlsZSAoIXZhbGlkKSB7Ci0JCQlpZiAoIW1vZGVsLnRyYXZlcnNlRm9jdXNTZWxlY3RhYmxlT2JqZWN0cyhuZXh0KSkKLQkJCQlicmVhazsKLQkJCW5ld1NlZ21lbnQgPSBtb2RlbC5nZXRTZWxlY3RlZFNlZ21lbnQoKTsKLQkJCWlmIChuZXdTZWdtZW50ID09IG51bGwpCi0JCQkJYnJlYWs7Ci0JCQl2YWxpZCA9IHNldENvbnRyb2xGb2N1cyhuZXh0LCBuZXdTZWdtZW50KTsKLQkJfQotCQlJSHlwZXJsaW5rU2VnbWVudCBuZXdMaW5rID0gbmV3U2VnbWVudCBpbnN0YW5jZW9mIElIeXBlcmxpbmtTZWdtZW50ID8gKElIeXBlcmxpbmtTZWdtZW50KSBuZXdTZWdtZW50Ci0JCQkJOiBudWxsOwotCQlpZiAodmFsaWQpCi0JCQllbnRlckxpbmsobmV3TGluaywgU1dULk5VTEwpOwotCQlJSHlwZXJsaW5rU2VnbWVudCBvbGRMaW5rID0gY3VycmVudCBpbnN0YW5jZW9mIElIeXBlcmxpbmtTZWdtZW50ID8gKElIeXBlcmxpbmtTZWdtZW50KSBjdXJyZW50Ci0JCQkJOiBudWxsOwotCQlpZiAob2xkTGluayAhPSBudWxsIHx8IG5ld0xpbmsgIT0gbnVsbCkKLQkJCXBhaW50Rm9jdXNUcmFuc2ZlcihvbGRMaW5rLCBuZXdMaW5rKTsKLQkJaWYgKG5ld0xpbmsgIT0gbnVsbCkKLQkJCWVuc3VyZVZpc2libGUobmV3TGluayk7Ci0JCWlmIChuZXdMaW5rICE9IG51bGwpCi0JCQlnZXRBY2Nlc3NpYmxlKCkuc2V0Rm9jdXMobW9kZWwuZ2V0U2VsZWN0ZWRTZWdtZW50SW5kZXgoKSk7Ci0JCXJldHVybiAhdmFsaWQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNldENvbnRyb2xGb2N1cyhib29sZWFuIG5leHQsIElGb2N1c1NlbGVjdGFibGUgc2VsZWN0YWJsZSkgewotCQljb250cm9sRm9jdXNUcmFuc2ZlciA9IHRydWU7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc2VsZWN0YWJsZS5zZXRGb2N1cyhyZXNvdXJjZVRhYmxlLCBuZXh0KTsKLQkJY29udHJvbEZvY3VzVHJhbnNmZXIgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRm9jdXNDaGFuZ2UoKSB7Ci0JCWlmIChERUJVR19GT0NVUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJIYW5kbGUgZm9jdXMgY2hhbmdlOiBoYXNGb2N1cz0iICsgaGFzRm9jdXMgLy8kTk9OLU5MUy0xJAotCQkJCQkrICIsIG1vdXNlRm9jdXM9IiArIG1vdXNlRm9jdXMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGhhc0ZvY3VzKSB7Ci0JCQlib29sZWFuIGFkdmFuY2UgPSB0cnVlOwotCQkJaWYgKCFtb3VzZUZvY3VzKSB7Ci0JCQkJLy8gaWYgKG1vZGVsLnJlc3RvcmVTYXZlZExpbmsoKSA9PSBmYWxzZSkKLQkJCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCQkJSUZvY3VzU2VsZWN0YWJsZSBzZWxlY3RhYmxlID0gbnVsbDsKLQkJCQl3aGlsZSAoIXZhbGlkKSB7Ci0JCQkJCWlmICghbW9kZWwudHJhdmVyc2VGb2N1c1NlbGVjdGFibGVPYmplY3RzKGFkdmFuY2UpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCXNlbGVjdGFibGUgPSBtb2RlbC5nZXRTZWxlY3RlZFNlZ21lbnQoKTsKLQkJCQkJaWYgKHNlbGVjdGFibGUgPT0gbnVsbCkKLQkJCQkJCWJyZWFrOwotCQkJCQl2YWxpZCA9IHNldENvbnRyb2xGb2N1cyhhZHZhbmNlLCBzZWxlY3RhYmxlKTsKLQkJCQl9Ci0JCQkJaWYgKHNlbGVjdGFibGUgIT0gbnVsbCkKLQkJCQkJZW5zdXJlVmlzaWJsZShzZWxlY3RhYmxlKTsKLQkJCQlpZiAoc2VsZWN0YWJsZSBpbnN0YW5jZW9mIElIeXBlcmxpbmtTZWdtZW50KSB7Ci0JCQkJCWVudGVyTGluaygoSUh5cGVybGlua1NlZ21lbnQpIHNlbGVjdGFibGUsIFNXVC5OVUxMKTsKLQkJCQkJcGFpbnRGb2N1c1RyYW5zZmVyKG51bGwsIChJSHlwZXJsaW5rU2VnbWVudCkgc2VsZWN0YWJsZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcGFpbnRGb2N1c1RyYW5zZmVyKGdldFNlbGVjdGVkTGluaygpLCBudWxsKTsKLQkJCW1vZGVsLnNlbGVjdExpbmsobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW50ZXJMaW5rKElIeXBlcmxpbmtTZWdtZW50IGxpbmssIGludCBzdGF0ZU1hc2spIHsKLQkJaWYgKGxpbmsgPT0gbnVsbCB8fCBsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IHNpemUgPSBsaXN0ZW5lcnMuc2l6ZSgpOwotCQlIeXBlcmxpbmtFdmVudCBoZSA9IG5ldyBIeXBlcmxpbmtFdmVudCh0aGlzLCBsaW5rLmdldEhyZWYoKSwgbGluawotCQkJCS5nZXRUZXh0KCksIHN0YXRlTWFzayk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJSHlwZXJsaW5rTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUh5cGVybGlua0xpc3RlbmVyKSBsaXN0ZW5lcnMuZ2V0KGkpOwotCQkJbGlzdGVuZXIubGlua0VudGVyZWQoaGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4aXRMaW5rKElIeXBlcmxpbmtTZWdtZW50IGxpbmssIGludCBzdGF0ZU1hc2spIHsKLQkJaWYgKGxpbmsgPT0gbnVsbCB8fCBsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IHNpemUgPSBsaXN0ZW5lcnMuc2l6ZSgpOwotCQlIeXBlcmxpbmtFdmVudCBoZSA9IG5ldyBIeXBlcmxpbmtFdmVudCh0aGlzLCBsaW5rLmdldEhyZWYoKSwgbGluawotCQkJCS5nZXRUZXh0KCksIHN0YXRlTWFzayk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJSHlwZXJsaW5rTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUh5cGVybGlua0xpc3RlbmVyKSBsaXN0ZW5lcnMuZ2V0KGkpOwotCQkJbGlzdGVuZXIubGlua0V4aXRlZChoZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFpbnRMaW5rSG92ZXIoSUh5cGVybGlua1NlZ21lbnQgbGluaywgYm9vbGVhbiBob3ZlcikgewotCQlHQyBnYyA9IG5ldyBHQyh0aGlzKTsKLQkJSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRIeXBlcmxpbmtTZXR0aW5ncygpOwotCQlDb2xvciBuZXdGZyA9IGhvdmVyID8gc2V0dGluZ3MuZ2V0QWN0aXZlRm9yZWdyb3VuZCgpIDogc2V0dGluZ3MKLQkJCQkuZ2V0Rm9yZWdyb3VuZCgpOwotCQlpZiAobmV3RmcgIT0gbnVsbCkKLQkJCWdjLnNldEZvcmVncm91bmQobmV3RmcpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0JCWdjLnNldEZvbnQoZ2V0Rm9udCgpKTsKLQkJYm9vbGVhbiBzZWxlY3RlZCA9IChsaW5rID09IGdldFNlbGVjdGVkTGluaygpKTsKLQkJKChQYXJhZ3JhcGhTZWdtZW50KSBsaW5rKS5wYWludChnYywgaG92ZXIsIHJlc291cmNlVGFibGUsIHNlbGVjdGVkLAotCQkJCXNlbERhdGEsIG51bGwpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlU2VsZWN0ZWRMaW5rKCkgewotCQlJSHlwZXJsaW5rU2VnbWVudCBsaW5rID0gZ2V0U2VsZWN0ZWRMaW5rKCk7Ci0JCWlmIChsaW5rICE9IG51bGwpCi0JCQlhY3RpdmF0ZUxpbmsobGluaywgU1dULk5VTEwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZUxpbmsoSUh5cGVybGlua1NlZ21lbnQgbGluaywgaW50IHN0YXRlTWFzaykgewotCQlzZXRDdXJzb3IobW9kZWwuZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKS5nZXRCdXN5Q3Vyc29yKCkpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbGlzdGVuZXJzLnNpemUoKTsKLQkJCUh5cGVybGlua0V2ZW50IGUgPSBuZXcgSHlwZXJsaW5rRXZlbnQodGhpcywgbGluay5nZXRIcmVmKCksIGxpbmsKLQkJCQkJLmdldFRleHQoKSwgc3RhdGVNYXNrKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSUh5cGVybGlua0xpc3RlbmVyIGxpc3RlbmVyID0gKElIeXBlcmxpbmtMaXN0ZW5lcikgbGlzdGVuZXJzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWxpc3RlbmVyLmxpbmtBY3RpdmF0ZWQoZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFpc0Rpc3Bvc2VkKCkgJiYgbW9kZWwubGlua0V4aXN0cyhsaW5rKSkgewotCQkJc2V0Q3Vyc29yKG1vZGVsLmdldEh5cGVybGlua1NldHRpbmdzKCkuZ2V0SHlwZXJsaW5rQ3Vyc29yKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZUJvbGRGb250UHJlc2VudChGb250IHJlZ3VsYXJGb250KSB7Ci0JCUZvbnQgYm9sZEZvbnQgPSAoRm9udCkgcmVzb3VyY2VUYWJsZS5nZXQoRm9ybVRleHRNb2RlbC5CT0xEX0ZPTlRfSUQpOwotCQlpZiAoYm9sZEZvbnQgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYm9sZEZvbnQgPSBGb3JtVXRpbC5jcmVhdGVCb2xkRm9udChnZXREaXNwbGF5KCksIHJlZ3VsYXJGb250KTsKLQkJcmVzb3VyY2VUYWJsZS5wdXQoRm9ybVRleHRNb2RlbC5CT0xEX0ZPTlRfSUQsIGJvbGRGb250KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7Ci0JCUdDIGdjID0gZS5nYzsKLQkJZ2Muc2V0Rm9udChnZXRGb250KCkpOwotCQllbnN1cmVCb2xkRm9udFByZXNlbnQoZ2V0Rm9udCgpKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0JCXJlcGFpbnQoZ2MsIGUueCwgZS55LCBlLndpZHRoLCBlLmhlaWdodCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcGFpbnQoR0MgZ2MsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCUltYWdlIHRleHRCdWZmZXIgPSBuZXcgSW1hZ2UoZ2V0RGlzcGxheSgpLCB3aWR0aCwgaGVpZ2h0KTsKLQkJQ29sb3IgYmcgPSBnZXRCYWNrZ3JvdW5kKCk7Ci0JCUNvbG9yIGZnID0gZ2V0Rm9yZWdyb3VuZCgpOwotCQlpZiAoIWlzRW5hYmxlZCgpKSB7Ci0JCQliZyA9IGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpOwotCQkJZmcgPSBnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XKTsKLQkJfQotCQlHQyB0ZXh0R0MgPSBuZXcgR0ModGV4dEJ1ZmZlciwgZ2MuZ2V0U3R5bGUoKSk7Ci0JCXRleHRHQy5zZXRGb3JlZ3JvdW5kKGZnKTsKLQkJdGV4dEdDLnNldEJhY2tncm91bmQoYmcpOwotCQl0ZXh0R0Muc2V0Rm9udChnZXRGb250KCkpOwotCQl0ZXh0R0MuZmlsbFJlY3RhbmdsZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQkJUmVjdGFuZ2xlIHJlcGFpbnRSZWdpb24gPSBuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotCi0JCVBhcmFncmFwaFtdIHBhcmFncmFwaHMgPSBtb2RlbC5nZXRQYXJhZ3JhcGhzKCk7Ci0JCUlIeXBlcmxpbmtTZWdtZW50IHNlbGVjdGVkTGluayA9IGdldFNlbGVjdGVkTGluaygpOwotCQlpZiAoZ2V0RGlzcGxheSgpLmdldEZvY3VzQ29udHJvbCgpICE9IHRoaXMpCi0JCQlzZWxlY3RlZExpbmsgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFncmFwaHMubGVuZ3RoOyBpKyspIHsKLQkJCVBhcmFncmFwaCBwID0gcGFyYWdyYXBoc1tpXTsKLQkJCXAKLQkJCQkJLnBhaW50KHRleHRHQywgcmVwYWludFJlZ2lvbiwgcmVzb3VyY2VUYWJsZSwgc2VsZWN0ZWRMaW5rLAotCQkJCQkJCXNlbERhdGEpOwotCQl9Ci0JCWdjLmRyYXdJbWFnZSh0ZXh0QnVmZmVyLCB4LCB5KTsKLQkJdGV4dEdDLmRpc3Bvc2UoKTsKLQkJdGV4dEJ1ZmZlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0UGFyYWdyYXBoU3BhY2luZyhpbnQgbGluZUhlaWdodCkgewotCQlyZXR1cm4gbGluZUhlaWdodCAvIDI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhaW50Rm9jdXNUcmFuc2ZlcihJSHlwZXJsaW5rU2VnbWVudCBvbGRMaW5rLAotCQkJSUh5cGVybGlua1NlZ21lbnQgbmV3TGluaykgewotCQlHQyBnYyA9IG5ldyBHQyh0aGlzKTsKLQkJQ29sb3IgYmcgPSBnZXRCYWNrZ3JvdW5kKCk7Ci0JCUNvbG9yIGZnID0gZ2V0Rm9yZWdyb3VuZCgpOwotCQlnYy5zZXRGb250KGdldEZvbnQoKSk7Ci0JCWlmIChvbGRMaW5rICE9IG51bGwpIHsKLQkJCWdjLnNldEJhY2tncm91bmQoYmcpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChmZyk7Ci0JCQlvbGRMaW5rLnBhaW50Rm9jdXMoZ2MsIGJnLCBmZywgZmFsc2UsIG51bGwpOwotCQl9Ci0JCWlmIChuZXdMaW5rICE9IG51bGwpIHsKLQkJCS8vIGVuc3VyZVZpc2libGUobmV3TGluayk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGJnKTsKLQkJCWdjLnNldEZvcmVncm91bmQoZmcpOwotCQkJbmV3TGluay5wYWludEZvY3VzKGdjLCBiZywgZmcsIHRydWUsIG51bGwpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5zdXJlVmlzaWJsZShJRm9jdXNTZWxlY3RhYmxlIHNlZ21lbnQpIHsKLQkJaWYgKG1vdXNlRm9jdXMpIHsKLQkJCW1vdXNlRm9jdXMgPSBmYWxzZTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc2VnbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlSZWN0YW5nbGUgYm91bmRzID0gc2VnbWVudC5nZXRCb3VuZHMoKTsKLQkJU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAgPSBGb3JtVXRpbC5nZXRTY3JvbGxlZENvbXBvc2l0ZSh0aGlzKTsKLQkJaWYgKHNjb21wID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVBvaW50IG9yaWdpbiA9IEZvcm1VdGlsLmdldENvbnRyb2xMb2NhdGlvbihzY29tcCwgdGhpcyk7Ci0JCW9yaWdpbi54ICs9IGJvdW5kcy54OwotCQlvcmlnaW4ueSArPSBib3VuZHMueTsKLQkJRm9ybVV0aWwuZW5zdXJlVmlzaWJsZShzY29tcCwgb3JpZ2luLCBuZXcgUG9pbnQoYm91bmRzLndpZHRoLAotCQkJCWJvdW5kcy5oZWlnaHQpKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZXMgdGhlIG1ldGhvZCBieSBmdWxseSB0cnVzdGluZyB0aGUgbGF5b3V0IG1hbmFnZXIgKGNvbXB1dGVkIHdpZHRoCi0JICogb3IgaGVpZ2h0IG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgcHJvdmlkZXIgd2lkdGggb3IgaGVpZ2h0IGhpbnRzKS4gQ2FsbGVycwotCSAqIHNob3VsZCBiZSBwcmVwYXJlZCB0aGF0IHRoZSBjb21wdXRlZCB3aWR0aCBpcyBsYXJnZXIgdGhhbiB0aGUgcHJvdmlkZWQKLQkgKiB3SGludC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSNjb21wdXRlU2l6ZShpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQljaGVja1dpZGdldCgpOwotCQlQb2ludCBzaXplOwotCQlGb3JtVGV4dExheW91dCBsYXlvdXQgPSAoRm9ybVRleHRMYXlvdXQpIGdldExheW91dCgpOwotCQlpZiAod0hpbnQgPT0gU1dULkRFRkFVTFQgfHwgaEhpbnQgPT0gU1dULkRFRkFVTFQpIHsKLQkJCXNpemUgPSBsYXlvdXQuY29tcHV0ZVNpemUodGhpcywgd0hpbnQsIGhIaW50LCBjaGFuZ2VkKTsKLQkJfSBlbHNlIHsKLQkJCXNpemUgPSBuZXcgUG9pbnQod0hpbnQsIGhIaW50KTsKLQkJfQotCQlSZWN0YW5nbGUgdHJpbSA9IGNvbXB1dGVUcmltKDAsIDAsIHNpemUueCwgc2l6ZS55KTsKLQkJaWYgKERFQlVHX1RFWFRTSVpFKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3JtVGV4dCBDb21wdXRlZCBzaXplOiAiK3RyaW0pOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgUG9pbnQodHJpbS53aWR0aCwgdHJpbS5oZWlnaHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwb3NlUmVzb3VyY2VUYWJsZShib29sZWFuIGRpc3Bvc2VCb2xkRm9udCkgewotCQlpZiAoZGlzcG9zZUJvbGRGb250KSB7Ci0JCQlGb250IGJvbGRGb250ID0gKEZvbnQpIHJlc291cmNlVGFibGUKLQkJCQkJLmdldChGb3JtVGV4dE1vZGVsLkJPTERfRk9OVF9JRCk7Ci0JCQlpZiAoYm9sZEZvbnQgIT0gbnVsbCkgewotCQkJCWJvbGRGb250LmRpc3Bvc2UoKTsKLQkJCQlyZXNvdXJjZVRhYmxlLnJlbW92ZShGb3JtVGV4dE1vZGVsLkJPTERfRk9OVF9JRCk7Ci0JCQl9Ci0JCX0KLQkJQXJyYXlMaXN0IGltYWdlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEVudW1lcmF0aW9uIGVubSA9IHJlc291cmNlVGFibGUua2V5cygpOyBlbm0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW5tLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoa2V5LnN0YXJ0c1dpdGgoSW1hZ2VTZWdtZW50LlNFTF9JTUFHRV9QUkVGSVgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IHJlc291cmNlVGFibGUuZ2V0KGtleSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEltYWdlKSB7Ci0JCQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBvYmo7Ci0JCQkJCWlmICghaW1hZ2UuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQlpbWFnZXNUb1JlbW92ZS5hZGQoa2V5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlc1RvUmVtb3ZlLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXNvdXJjZVRhYmxlLnJlbW92ZShpbWFnZXNUb1JlbW92ZS5nZXQoaSkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sI3NldEVuYWJsZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlyZWRyYXcoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sI3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cygpIHsKLQkJbW91c2VGb2N1cyA9IHRydWU7Ci0JCUZvcm1VdGlsLnNldEZvY3VzU2Nyb2xsaW5nRW5hYmxlZCh0aGlzLCBmYWxzZSk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuc2V0Rm9jdXMoKTsKLQkJbW91c2VGb2N1cyA9IGZhbHNlOwotCQlGb3JtVXRpbC5zZXRGb2N1c1Njcm9sbGluZ0VuYWJsZWQodGhpcywgdHJ1ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9Gb3JtVG9vbGtpdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9Gb3JtVG9vbGtpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2QwOGI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvRm9ybVRvb2xraXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgTWljaGFlbCBXaWxsaWFtc29uIChlY2xpcHNlLWJ1Z3NAbWFnbmF3b3Jrcy5jb20pIC0gcGF0Y2ggKHNlZSBCdWd6aWxsYSAjOTI1NDUpIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5Gb3JtVXRpbDsKLQotLyoqCi0gKiBUaGUgdG9vbGtpdCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgU1dUIGNvbnRyb2xzIGFkYXB0ZWQgdG8gd29yayBpbgotICogRWNsaXBzZSBmb3Jtcy4gSW4gYWRkaXRpb24gdG8gY2hhbmdpbmcgdGhlaXIgcHJlc2VudGF0aW9uIHByb3BlcnRpZXMgKGZvbnRzLAotICogY29sb3JzIGV0Yy4pLCB2YXJpb3VzIGxpc3RlbmVycyBhcmUgYXR0YWNoZWQgdG8gbWFrZSB0aGVtIGJlaGF2ZSBjb3JyZWN0bHkgaW4KLSAqIHRoZSBmb3JtIGNvbnRleHQuCi0gKiA8cD4KLSAqIEluIGFkZGl0aW9uIHRvIGJlaW5nIHRoZSBjb250cm9sIGZhY3RvcnksIHRoZSB0b29sa2l0IGlzIGFsc28gcmVzcG9uc2libGUgZm9yCi0gKiBwYWludGluZyBmbGF0IGJvcmRlcnMgZm9yIHNlbGVjdCBjb250cm9scywgbWFuYWdpbmcgaHlwZXJsaW5rIGdyb3VwcyBhbmQKLSAqIGNvbnRyb2wgY29sb3JzLgotICogPHA+Ci0gKiBUaGUgdG9vbGtpdCBjcmVhdGVzIHNvbWUgb2YgdGhlIG1vc3QgY29tbW9uIGNvbnRyb2xzIHVzZWQgdG8gcG9wdWxhdGUgRWNsaXBzZQotICogZm9ybXMuIENvbnRyb2xzIHRoYXQgbXVzdCBiZSBjcmVhdGVkIHVzaW5nIHRoZWlyIGNvbnN0cnVjdG9ycywKLSAqIDxjb2RlPmFkYXB0KCk8L2NvZGU+IG1ldGhvZCBpcyBhdmFpbGFibGUgdG8gY2hhbmdlIGl0cyBwcm9wZXJ0aWVzIGluIHRoZQotICogc2FtZSB3YXkgYXMgd2l0aCB0aGUgc3VwcG9ydGVkIHRvb2xraXQgY29udHJvbHMuCi0gKiA8cD4KLSAqIFR5cGljYWxseSwgb25lIHRvb2xraXQgb2JqZWN0IGlzIGNyZWF0ZWQgcGVyIHdvcmtiZW5jaCBwYXJ0IChmb3IgZXhhbXBsZSwgYW4KLSAqIGVkaXRvciBvciBhIGZvcm0gd2l6YXJkKS4gVGhlIHRvb2xraXQgaXMgZGlzcG9zZWQgd2hlbiB0aGUgcGFydCBpcyBkaXNwb3NlZC4KLSAqIFRvIGNvbnNlcnZlIHJlc291cmNlcywgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIG9uZSBjb2xvciBvYmplY3QgZm9yIHRoZQotICogZW50aXJlIHBsdWctaW4gYW5kIHNoYXJlIGl0IGJldHdlZW4gc2V2ZXJhbCB0b29sa2l0cy4gVGhlIHBsdWctaW4gaXMKLSAqIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgdGhlIGNvbG9ycyAoZGlzcG9zaW5nIHRoZSB0b29sa2l0IHRoYXQgdXNlcyBzaGFyZWQKLSAqIGNvbG9yIG9iamVjdCB3aWxsIG5vdCBkaXNwb3NlIHRoZSBjb2xvcnMpLgotICogPHA+Ci0gKiBGb3JtVG9vbGtpdCBpcyBub3JtYWxseSBpbnN0YW50aWF0ZWQsIGJ1dCBjYW4gYWxzbyBiZSBzdWJjbGFzc2VkIGlmIHNvbWUgb2YKLSAqIHRoZSBtZXRob2RzIG5lZWRzIHRvIGJlIG1vZGlmaWVkLiBJbiB0aG9zZSBjYXNlcywgPGNvZGU+c3VwZXI8L2NvZGU+IG11c3QKLSAqIGJlIGNhbGxlZCB0byBwcmVzZXJ2ZSBub3JtYWwgYmVoYXZpb3VyLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtVG9vbGtpdCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RSQVdfQk9SREVSID0gIkZvcm1XaWRnZXRGYWN0b3J5LmRyYXdCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkVFX0JPUkRFUiA9ICJ0cmVlQm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9CT1JERVIgPSAidGV4dEJvcmRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IGJvcmRlclN0eWxlID0gU1dULk5VTEw7Ci0KLQlwcml2YXRlIEZvcm1Db2xvcnMgY29sb3JzOwotCi0JcHJpdmF0ZSBpbnQgb3JpZW50YXRpb24gPSBXaW5kb3cuZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCk7Ci0KLQkvLyBwcml2YXRlIEtleUxpc3RlbmVyIGRlbGV0ZUxpc3RlbmVyOwotCXByaXZhdGUgQm9yZGVyUGFpbnRlciBib3JkZXJQYWludGVyOwotCi0JcHJpdmF0ZSBCb2xkRm9udEhvbGRlciBib2xkRm9udEhvbGRlcjsKLQotCXByaXZhdGUgSHlwZXJsaW5rR3JvdXAgaHlwZXJsaW5rR3JvdXA7Ci0KLQkvKiBkZWZhdWx0ICovCi0JVmlzaWJpbGl0eUhhbmRsZXIgdmlzaWJpbGl0eUhhbmRsZXI7Ci0KLQkvKiBkZWZhdWx0ICovCi0JS2V5Ym9hcmRIYW5kbGVyIGtleWJvYXJkSGFuZGxlcjsKLQotCXByaXZhdGUgY2xhc3MgQm9yZGVyUGFpbnRlciBpbXBsZW1lbnRzIFBhaW50TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIGV2ZW50LndpZGdldDsKLQkJCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUNvbnRyb2wgYyA9IGNoaWxkcmVuW2ldOwotCQkJCWJvb2xlYW4gaW5hY3RpdmVCb3JkZXIgPSBmYWxzZTsKLQkJCQlib29sZWFuIHRleHRCb3JkZXIgPSBmYWxzZTsKLQkJCQlpZiAoIWMuaXNWaXNpYmxlKCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjLmdldEVuYWJsZWQoKSA9PSBmYWxzZSAmJiAhKGMgaW5zdGFuY2VvZiBDQ29tYm8pKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoYyBpbnN0YW5jZW9mIEh5cGVybGluaykKLQkJCQkJY29udGludWU7Ci0JCQkJT2JqZWN0IGZsYWcgPSBjLmdldERhdGEoS0VZX0RSQVdfQk9SREVSKTsKLQkJCQlpZiAoZmxhZyAhPSBudWxsKSB7Ci0JCQkJCWlmIChmbGFnLmVxdWFscyhCb29sZWFuLkZBTFNFKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAoZmxhZy5lcXVhbHMoVFJFRV9CT1JERVIpKQotCQkJCQkJaW5hY3RpdmVCb3JkZXIgPSB0cnVlOwotCQkJCQllbHNlIGlmIChmbGFnLmVxdWFscyhURVhUX0JPUkRFUikpCi0JCQkJCQl0ZXh0Qm9yZGVyID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKGdldEJvcmRlclN0eWxlKCkgPT0gU1dULkJPUkRFUikgewotCQkJCQlpZiAoIWluYWN0aXZlQm9yZGVyICYmICF0ZXh0Qm9yZGVyKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlpZiAoYyBpbnN0YW5jZW9mIFRleHQgfHwgYyBpbnN0YW5jZW9mIFRhYmxlCi0JCQkJCQkJfHwgYyBpbnN0YW5jZW9mIFRyZWUgfHwgYyBpbnN0YW5jZW9mIFRhYmxlVHJlZSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoIWluYWN0aXZlQm9yZGVyCi0JCQkJCQkmJiAoYyBpbnN0YW5jZW9mIFRleHQgfHwgYyBpbnN0YW5jZW9mIENDb21ibyB8fCB0ZXh0Qm9yZGVyKSkgewotCQkJCQlSZWN0YW5nbGUgYiA9IGMuZ2V0Qm91bmRzKCk7Ci0JCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJCWdjLnNldEZvcmVncm91bmQoYy5nZXRCYWNrZ3JvdW5kKCkpOwotCQkJCQlnYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDEsIGIueSAtIDEsIGIud2lkdGggKyAxLAotCQkJCQkJCWIuaGVpZ2h0ICsgMSk7Ci0JCQkJCS8vIGdjLnNldEZvcmVncm91bmQoZ2V0Qm9yZGVyU3R5bGUoKSA9PSBTV1QuQk9SREVSID8gY29sb3JzCi0JCQkJCS8vIC5nZXRCb3JkZXJDb2xvcigpIDogY29sb3JzLmdldEZvcmVncm91bmQoKSk7Ci0JCQkJCWdjLnNldEZvcmVncm91bmQoY29sb3JzLmdldEJvcmRlckNvbG9yKCkpOwotCQkJCQlpZiAoYyBpbnN0YW5jZW9mIENDb21ibykKLQkJCQkJCWdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMSwgYi55IC0gMSwgYi53aWR0aCArIDEsCi0JCQkJCQkJCWIuaGVpZ2h0ICsgMSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMSwgYi55IC0gMiwgYi53aWR0aCArIDEsCi0JCQkJCQkJCWIuaGVpZ2h0ICsgMyk7Ci0JCQkJfSBlbHNlIGlmIChpbmFjdGl2ZUJvcmRlciB8fCBjIGluc3RhbmNlb2YgVGFibGUKLQkJCQkJCXx8IGMgaW5zdGFuY2VvZiBUcmVlIHx8IGMgaW5zdGFuY2VvZiBUYWJsZVRyZWUpIHsKLQkJCQkJUmVjdGFuZ2xlIGIgPSBjLmdldEJvdW5kcygpOwotCQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9ycy5nZXRCb3JkZXJDb2xvcigpKTsKLQkJCQkJZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMSwKLQkJCQkJCQliLmhlaWdodCArIDEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZpc2liaWxpdHlIYW5kbGVyIGV4dGVuZHMgRm9jdXNBZGFwdGVyIHsKLQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQlXaWRnZXQgdyA9IGUud2lkZ2V0OwotCQkJaWYgKHcgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0JCQkJRm9ybVV0aWwuZW5zdXJlVmlzaWJsZSgoQ29udHJvbCkgdyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBLZXlib2FyZEhhbmRsZXIgZXh0ZW5kcyBLZXlBZGFwdGVyIHsKLQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQlXaWRnZXQgdyA9IGUud2lkZ2V0OwotCQkJaWYgKHcgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0JCQkJaWYgKGUuZG9pdCkKLQkJCQkJRm9ybVV0aWwucHJvY2Vzc0tleShlLmtleUNvZGUsIChDb250cm9sKSB3KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgQm9sZEZvbnRIb2xkZXIgewotCQlwcml2YXRlIEZvbnQgbm9ybWFsRm9udDsKLQotCQlwcml2YXRlIEZvbnQgYm9sZEZvbnQ7Ci0KLQkJcHVibGljIEJvbGRGb250SG9sZGVyKCkgewotCQl9Ci0KLQkJcHVibGljIEZvbnQgZ2V0Qm9sZEZvbnQoRm9udCBmb250KSB7Ci0JCQljcmVhdGVCb2xkRm9udChmb250KTsKLQkJCXJldHVybiBib2xkRm9udDsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVCb2xkRm9udChGb250IGZvbnQpIHsKLQkJCWlmIChub3JtYWxGb250ID09IG51bGwgfHwgIW5vcm1hbEZvbnQuZXF1YWxzKGZvbnQpKSB7Ci0JCQkJbm9ybWFsRm9udCA9IGZvbnQ7Ci0JCQkJZGlzcG9zZSgpOwotCQkJfQotCQkJaWYgKGJvbGRGb250ID09IG51bGwpIHsKLQkJCQlib2xkRm9udCA9IEZvcm1VdGlsLmNyZWF0ZUJvbGRGb250KGNvbG9ycy5nZXREaXNwbGF5KCksCi0JCQkJCQlub3JtYWxGb250KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAoYm9sZEZvbnQgIT0gbnVsbCkgewotCQkJCWJvbGRGb250LmRpc3Bvc2UoKTsKLQkJCQlib2xkRm9udCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdG9vbGtpdCB0aGF0IGlzIHNlbGYtc3VmZmljaWVudCAod2lsbCBtYW5hZ2UgaXRzIG93biBjb2xvcnMpLgotCSAqIAotCSAqLwotCXB1YmxpYyBGb3JtVG9vbGtpdChEaXNwbGF5IGRpc3BsYXkpIHsKLQkJdGhpcyhuZXcgRm9ybUNvbG9ycyhkaXNwbGF5KSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRvb2xraXQgdGhhdCB3aWxsIHVzZSB0aGUgcHJvdmlkZWQgKHNoYXJlZCkgY29sb3JzLiBUaGUgdG9vbGtpdAotCSAqIHdpbGwgPGI+bm90IDwvYj4gZGlzcG9zZSB0aGUgcHJvdmlkZWQgY29sb3JzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvcnMKLQkgKiAgICAgICAgICAgIHRoZSBzaGFyZWQgY29sb3JzCi0JICovCi0JcHVibGljIEZvcm1Ub29sa2l0KEZvcm1Db2xvcnMgY29sb3JzKSB7Ci0JCXRoaXMuY29sb3JzID0gY29sb3JzOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJ1dHRvbiBhcyBhIHBhcnQgb2YgdGhlIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbiBwYXJlbnQKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgYW4gb3B0aW9uYWwgdGV4dCBmb3IgdGhlIGJ1dHRvbiAoY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+KQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbiBzdHlsZSAoZm9yIGV4YW1wbGUsIDxjb2RlPlNXVC5QVVNIPC9jb2RlPikKLQkgKiBAcmV0dXJuIHRoZSBidXR0b24gd2lkZ2V0Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIHN0eWxlIHwgU1dULkZMQVQgfCBvcmllbnRhdGlvbik7Ci0JCWlmICh0ZXh0ICE9IG51bGwpCi0JCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJYWRhcHQoYnV0dG9uLCB0cnVlLCB0cnVlKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb21wb3NpdGUgYXMgYSBwYXJ0IG9mIHRoZSBmb3JtLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb21wb3NpdGUgcGFyZW50Ci0JICogQHJldHVybiB0aGUgY29tcG9zaXRlIHdpZGdldAotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb21wb3NpdGUgYXMgcGFydCBvZiB0aGUgZm9ybSB1c2luZyB0aGUgcHJvdmlkZWQgc3R5bGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIGNvbXBvc2l0ZSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBjb21wb3NpdGUgc3R5bGUKLQkgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGUgd2lkZ2V0Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgc3R5bGUgfCBvcmllbnRhdGlvbik7Ci0JCWFkYXB0KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRzIHRoZSBjb21wb3NpdGUgdGhhdCBjYW4gc2VydmVyIGFzIGEgc2VwYXJhdG9yIGJldHdlZW4gdmFyaW91cyBwYXJ0cwotCSAqIG9mIGEgZm9ybS4gU2VwYXJhdG9yIGhlaWdodCBzaG91bGQgYmUgY29udHJvbGxlZCBieSBzZXR0aW5nIHRoZSBoZWlnaHQKLQkgKiBoaW50IG9uIHRoZSBsYXlvdXQgZGF0YSBmb3IgdGhlIGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgc2VwYXJhdG9yIHBhcmVudAotCSAqIEByZXR1cm4gdGhlIHNlcGFyYXRvciB3aWRnZXQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgb3JpZW50YXRpb24pOwotCQljb21wb3NpdGUuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKGNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCXJldHVybjsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gY29tcG9zaXRlLmdldEJvdW5kcygpOwotCQkJCUdDIGdjID0gZS5nYzsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9ycy5nZXRDb2xvcihGb3JtQ29sb3JzLlNFUEFSQVRPUikpOwotCQkJCWlmIChjb2xvcnMuZ2V0QmFja2dyb3VuZCgpICE9IG51bGwpCi0JCQkJCWdjLnNldEJhY2tncm91bmQoY29sb3JzLmdldEJhY2tncm91bmQoKSk7Ci0JCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCwKLQkJCQkJCWZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBTZWN0aW9uKQotCQkJKChTZWN0aW9uKSBwYXJlbnQpLnNldFNlcGFyYXRvckNvbnRyb2woY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwgYXMgYSBwYXJ0IG9mIHRoZSBmb3JtLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBsYWJlbCBwYXJlbnQKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHRleHQKLQkgKiBAcmV0dXJuIHRoZSBsYWJlbCB3aWRnZXQKLQkgKi8KLQlwdWJsaWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCwgU1dULk5PTkUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBhcyBhIHBhcnQgb2YgdGhlIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHBhcmVudAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgbGFiZWwgdGV4dAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHN0eWxlCi0JICogQHJldHVybiB0aGUgbGFiZWwgd2lkZ2V0Ci0JICovCi0JcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBzdHlsZSB8IG9yaWVudGF0aW9uKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCWFkYXB0KGxhYmVsLCBmYWxzZSwgZmFsc2UpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGh5cGVybGluayBhcyBhIHBhcnQgb2YgdGhlIGZvcm0uIFRoZSBoeXBlcmxpbmsgd2lsbCBiZSBhZGRlZCB0bwotCSAqIHRoZSBoeXBlcmxpbmsgZ3JvdXAgdGhhdCBiZWxvbmdzIHRvIHRoaXMgdG9vbGtpdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgaHlwZXJsaW5rIHBhcmVudAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBvZiB0aGUgaHlwZXJsaW5rCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgaHlwZXJsaW5rIHN0eWxlCi0JICogQHJldHVybiB0aGUgaHlwZXJsaW5rIHdpZGdldAotCSAqLwotCXB1YmxpYyBIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJSHlwZXJsaW5rIGh5cGVybGluayA9IG5ldyBIeXBlcmxpbmsocGFyZW50LCBzdHlsZSB8IG9yaWVudGF0aW9uKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCWh5cGVybGluay5zZXRUZXh0KHRleHQpOwotCQloeXBlcmxpbmsuYWRkRm9jdXNMaXN0ZW5lcih2aXNpYmlsaXR5SGFuZGxlcik7Ci0JCWh5cGVybGluay5hZGRLZXlMaXN0ZW5lcihrZXlib2FyZEhhbmRsZXIpOwotCQloeXBlcmxpbmtHcm91cC5hZGQoaHlwZXJsaW5rKTsKLQkJcmV0dXJuIGh5cGVybGluazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGh5cGVybGluayBhcyBhIHBhcnQgb2YgdGhlIGZvcm0uIFRoZSBoeXBlcmxpbmsgd2lsbCBiZQotCSAqIGFkZGVkIHRvIHRoZSBoeXBlcmxpbmsgZ3JvdXAgdGhhdCBiZWxvbmdzIHRvIHRoaXMgdG9vbGtpdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgaHlwZXJsaW5rIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIGh5cGVybGluayBzdHlsZQotCSAqIEByZXR1cm4gdGhlIGltYWdlIGh5cGVybGluayB3aWRnZXQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VIeXBlcmxpbmsgY3JlYXRlSW1hZ2VIeXBlcmxpbmsoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCUltYWdlSHlwZXJsaW5rIGh5cGVybGluayA9IG5ldyBJbWFnZUh5cGVybGluayhwYXJlbnQsIHN0eWxlCi0JCQkJfCBvcmllbnRhdGlvbik7Ci0JCWh5cGVybGluay5hZGRGb2N1c0xpc3RlbmVyKHZpc2liaWxpdHlIYW5kbGVyKTsKLQkJaHlwZXJsaW5rLmFkZEtleUxpc3RlbmVyKGtleWJvYXJkSGFuZGxlcik7Ci0JCWh5cGVybGlua0dyb3VwLmFkZChoeXBlcmxpbmspOwotCQlyZXR1cm4gaHlwZXJsaW5rOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByaWNoIHRleHQgYXMgYSBwYXJ0IG9mIHRoZSBmb3JtLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSByaWNoIHRleHQgcGFyZW50Ci0JICogQHBhcmFtIHRyYWNrRm9jdXMKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgdG9vbGtpdCB3aWxsIG1vbml0b3IgZm9jdXMKLQkgKiAgICAgICAgICAgIHRyYW5zZmVycyB0byBlbnN1cmUgdGhhdCB0aGUgaHlwZXJsaW5rIGluIGZvY3VzIGlzIHZpc2libGUgaW4KLQkgKiAgICAgICAgICAgIHRoZSBmb3JtLgotCSAqIEByZXR1cm4gdGhlIHJpY2ggdGV4dCB3aWRnZXQKLQkgKi8KLQlwdWJsaWMgRm9ybVRleHQgY3JlYXRlRm9ybVRleHQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiB0cmFja0ZvY3VzKSB7Ci0JCUZvcm1UZXh0IGVuZ2luZSA9IG5ldyBGb3JtVGV4dChwYXJlbnQsIFNXVC5XUkFQIHwgb3JpZW50YXRpb24pOwotCQllbmdpbmUubWFyZ2luV2lkdGggPSAxOwotCQllbmdpbmUubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZW5naW5lLnNldEh5cGVybGlua1NldHRpbmdzKGdldEh5cGVybGlua0dyb3VwKCkpOwotCQlhZGFwdChlbmdpbmUsIHRyYWNrRm9jdXMsIHRydWUpOwotCQllbmdpbmUuc2V0TWVudShwYXJlbnQuZ2V0TWVudSgpKTsKLQkJcmV0dXJuIGVuZ2luZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGFwdHMgYSBjb250cm9sIHRvIGJlIHVzZWQgaW4gYSBmb3JtIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLQkgKiB0b29sa2l0LiBUaGlzIGludm9sdmVzIGFkanVzdGluZyBjb2xvcnMgYW5kIG9wdGlvbmFsbHkgYWRkaW5nIGhhbmRsZXJzIHRvCi0JICogZW5zdXJlIGZvY3VzIHRyYWNraW5nIGFuZCBrZXlib2FyZCBtYW5hZ2VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICBhIGNvbnRyb2wgdG8gYWRhcHQKLQkgKiBAcGFyYW0gdHJhY2tGb2N1cwotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZvcm0gd2lsbCBiZSBzY3JvbGxlZCBob3Jpem9udGFsbHkKLQkgKiAgICAgICAgICAgIGFuZC9vciB2ZXJ0aWNhbGx5IGlmIG5lZWRlZCB0byBlbnN1cmUgdGhhdCB0aGUgY29udHJvbCBpcwotCSAqICAgICAgICAgICAgdmlzaWJsZSB3aGVuIGl0IGdhaW5zIGZvY3VzLiBTZXQgaXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmCi0JICogICAgICAgICAgICB0aGUgY29udHJvbCBpcyBub3QgY2FwYWJsZSBvZiBnYWluaW5nIGZvY3VzLgotCSAqIEBwYXJhbSB0cmFja0tleWJvYXJkCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGNvbnRyb2wgdGhhdCBpcyBjYXBhYmxlIG9mCi0JICogICAgICAgICAgICBnYWluaW5nIGZvY3VzIHdpbGwgYmUgdHJhY2tlZCBmb3IgY2VydGFpbiBrZXlzIHRoYXQgYXJlCi0JICogICAgICAgICAgICBpbXBvcnRhbnQgdG8gdGhlIHVuZGVybHlpbmcgZm9ybSAoZm9yIGV4YW1wbGUsIFBhZ2VVcCwKLQkgKiAgICAgICAgICAgIFBhZ2VEb3duLCBTY3JvbGxVcCwgU2Nyb2xsRG93biBldGMuKS4gU2V0IGl0IHRvCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNvbnRyb2wgaXMgbm90IGNhcGFibGUgb2YgZ2FpbmluZwotCSAqICAgICAgICAgICAgZm9jdXMgb3IgdGhlc2UgcGFydGljdWxhciBrZXkgZXZlbnQgYXJlIGFscmVhZHkgdXNlZCBieSB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgYWRhcHQoQ29udHJvbCBjb250cm9sLCBib29sZWFuIHRyYWNrRm9jdXMsIGJvb2xlYW4gdHJhY2tLZXlib2FyZCkgewotCQljb250cm9sLnNldEJhY2tncm91bmQoY29sb3JzLmdldEJhY2tncm91bmQoKSk7Ci0JCWNvbnRyb2wuc2V0Rm9yZWdyb3VuZChjb2xvcnMuZ2V0Rm9yZWdyb3VuZCgpKTsKLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBFeHBhbmRhYmxlQ29tcG9zaXRlKSB7Ci0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGVjID0gKEV4cGFuZGFibGVDb21wb3NpdGUpY29udHJvbDsKLQkJCWlmIChlYy50b2dnbGUgIT0gbnVsbCkgewotCQkJCWlmICh0cmFja0ZvY3VzKQotCQkJCQllYy50b2dnbGUuYWRkRm9jdXNMaXN0ZW5lcih2aXNpYmlsaXR5SGFuZGxlcik7Ci0JCQkJaWYgKHRyYWNrS2V5Ym9hcmQpCi0JCQkJCWVjLnRvZ2dsZS5hZGRLZXlMaXN0ZW5lcihrZXlib2FyZEhhbmRsZXIpOwotCQkJfQotCQkJaWYgKGVjLnRleHRMYWJlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKHRyYWNrRm9jdXMpCi0JCQkJCWVjLnRleHRMYWJlbC5hZGRGb2N1c0xpc3RlbmVyKHZpc2liaWxpdHlIYW5kbGVyKTsKLQkJCQlpZiAodHJhY2tLZXlib2FyZCkKLQkJCQkJZWMudGV4dExhYmVsLmFkZEtleUxpc3RlbmVyKGtleWJvYXJkSGFuZGxlcik7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRyYWNrRm9jdXMpCi0JCQljb250cm9sLmFkZEZvY3VzTGlzdGVuZXIodmlzaWJpbGl0eUhhbmRsZXIpOwotCQlpZiAodHJhY2tLZXlib2FyZCkKLQkJCWNvbnRyb2wuYWRkS2V5TGlzdGVuZXIoa2V5Ym9hcmRIYW5kbGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRhcHRzIGEgY29tcG9zaXRlIHRvIGJlIHVzZWQgaW4gYSBmb3JtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2xraXQuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIGNvbXBvc2l0ZSB0byBhZGFwdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkYXB0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY29tcG9zaXRlLnNldEJhY2tncm91bmQoY29sb3JzLmdldEJhY2tncm91bmQoKSk7Ci0JCWNvbXBvc2l0ZS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJKChDb250cm9sKSBlLndpZGdldCkuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbXBvc2l0ZS5zZXRNZW51KGNvbXBvc2l0ZS5nZXRQYXJlbnQoKS5nZXRNZW51KCkpOwotCX0KLQotCS8qKgotCSAqIEEgaGVscGVyIG1ldGhvZCB0aGF0IGVuc3VyZXMgdGhlIHByb3ZpZGVkIGNvbnRyb2wgaXMgdmlzaWJsZSB3aGVuCi0JICogU2Nyb2xsZWRDb21wb3NpdGUgaXMgc29tZXdoZXJlIGluIHRoZSBwYXJlbnQgY2hhaW4uIElmIHNjcm9sbCBiYXJzIGFyZQotCSAqIHZpc2libGUgYW5kIHRoZSBjb250cm9sIGlzIGNsaXBwZWQsIHRoZSBjbGllbnQgb2YgdGhlIHNjcm9sbGVkIGNvbXBvc2l0ZQotCSAqIHdpbGwgYmUgc2Nyb2xsZWQgdG8gcmV2ZWFsIHRoZSBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBjCi0JICogICAgICAgICAgICB0aGUgY29udHJvbCB0byByZXZlYWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlVmlzaWJsZShDb250cm9sIGMpIHsKLQkJRm9ybVV0aWwuZW5zdXJlVmlzaWJsZShjKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc2VjdGlvbiBhcyBhIHBhcnQgb2YgdGhlIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHNlY3Rpb24gcGFyZW50Ci0JICogQHBhcmFtIHNlY3Rpb25TdHlsZQotCSAqICAgICAgICAgICAgdGhlIHNlY3Rpb24gc3R5bGUKLQkgKiBAcmV0dXJuIHRoZSBzZWN0aW9uIHdpZGdldAotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgaW50IHNlY3Rpb25TdHlsZSkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSBuZXcgU2VjdGlvbihwYXJlbnQsIG9yaWVudGF0aW9uLCBzZWN0aW9uU3R5bGUpOwotCQlzZWN0aW9uLnNldE1lbnUocGFyZW50LmdldE1lbnUoKSk7Ci0JCWFkYXB0KHNlY3Rpb24sIHRydWUsIHRydWUpOwotCQlpZiAoc2VjdGlvbi50b2dnbGUgIT0gbnVsbCkgewotCQkJc2VjdGlvbi50b2dnbGUuc2V0SG92ZXJEZWNvcmF0aW9uQ29sb3IoY29sb3JzCi0JCQkJCS5nZXRDb2xvcihGb3JtQ29sb3JzLlRCX1RPR0dMRV9IT1ZFUikpOwotCQkJc2VjdGlvbi50b2dnbGUuc2V0RGVjb3JhdGlvbkNvbG9yKGNvbG9ycwotCQkJCQkuZ2V0Q29sb3IoRm9ybUNvbG9ycy5UQl9UT0dHTEUpKTsKLQkJfQotCQlzZWN0aW9uLnNldEZvbnQoYm9sZEZvbnRIb2xkZXIuZ2V0Qm9sZEZvbnQocGFyZW50LmdldEZvbnQoKSkpOwotCQlpZiAoKHNlY3Rpb25TdHlsZSAmIFNlY3Rpb24uVElUTEVfQkFSKSAhPSAwCi0JCQkJfHwgKHNlY3Rpb25TdHlsZSAmIFNlY3Rpb24uU0hPUlRfVElUTEVfQkFSKSAhPSAwKSB7Ci0JCQljb2xvcnMuaW5pdGlhbGl6ZVNlY3Rpb25Ub29sQmFyQ29sb3JzKCk7Ci0JCQlzZWN0aW9uLnNldFRpdGxlQmFyQmFja2dyb3VuZChjb2xvcnMuZ2V0Q29sb3IoRm9ybUNvbG9ycy5UQl9HQkcpKTsKLQkJCXNlY3Rpb24uc2V0VGl0bGVCYXJCb3JkZXJDb2xvcihjb2xvcnMKLQkJCQkJLmdldENvbG9yKEZvcm1Db2xvcnMuVEJfQk9SREVSKSk7Ci0JCQlzZWN0aW9uLnNldFRpdGxlQmFyR3JhZGllbnRCYWNrZ3JvdW5kKGNvbG9ycwotCQkJCQkuZ2V0Q29sb3IoRm9ybUNvbG9ycy5UQl9HQkcpKTsKLQkJCXNlY3Rpb24uc2V0VGl0bGVCYXJGb3JlZ3JvdW5kKGNvbG9ycy5nZXRDb2xvcihGb3JtQ29sb3JzLlRCX0ZHKSk7Ci0JCX0KLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHBhbmRhYmxlIGNvbXBvc2l0ZSBhcyBhIHBhcnQgb2YgdGhlIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIGV4cGFuZGFibGUgY29tcG9zaXRlIHBhcmVudAotCSAqIEBwYXJhbSBleHBhbnNpb25TdHlsZQotCSAqICAgICAgICAgICAgdGhlIGV4cGFuZGFibGUgY29tcG9zaXRlIHN0eWxlCi0JICogQHJldHVybiB0aGUgZXhwYW5kYWJsZSBjb21wb3NpdGUgd2lkZ2V0Ci0JICovCi0JcHVibGljIEV4cGFuZGFibGVDb21wb3NpdGUgY3JlYXRlRXhwYW5kYWJsZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGV4cGFuc2lvblN0eWxlKSB7Ci0JCUV4cGFuZGFibGVDb21wb3NpdGUgZWMgPSBuZXcgRXhwYW5kYWJsZUNvbXBvc2l0ZShwYXJlbnQsIG9yaWVudGF0aW9uLAotCQkJCWV4cGFuc2lvblN0eWxlKTsKLQkJZWMuc2V0TWVudShwYXJlbnQuZ2V0TWVudSgpKTsKLQkJYWRhcHQoZWMsIHRydWUsIHRydWUpOwotCQllYy5zZXRGb250KGJvbGRGb250SG9sZGVyLmdldEJvbGRGb250KGVjLmdldEZvbnQoKSkpOwotCQlyZXR1cm4gZWM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNlcGFyYXRvciBsYWJlbCBhcyBhIHBhcnQgb2YgdGhlIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHNlcGFyYXRvciBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzZXBhcmF0b3Igc3R5bGUKLQkgKiBAcmV0dXJuIHRoZSBzZXBhcmF0b3IgbGFiZWwKLQkgKi8KLQlwdWJsaWMgTGFiZWwgY3JlYXRlU2VwYXJhdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBzdHlsZSB8IG9yaWVudGF0aW9uKTsKLQkJbGFiZWwuc2V0QmFja2dyb3VuZChjb2xvcnMuZ2V0QmFja2dyb3VuZCgpKTsKLQkJbGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcnMuZ2V0Qm9yZGVyQ29sb3IoKSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFibGUgYXMgYSBwYXJ0IG9mIHRoZSBmb3JtLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZSBzdHlsZQotCSAqIEByZXR1cm4gdGhlIHRhYmxlIHdpZGdldAotCSAqLwotCXB1YmxpYyBUYWJsZSBjcmVhdGVUYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBzdHlsZSB8IGJvcmRlclN0eWxlIHwgb3JpZW50YXRpb24pOwotCQlhZGFwdCh0YWJsZSwgZmFsc2UsIGZhbHNlKTsKLQkJLy8gaG9va0RlbGV0ZUxpc3RlbmVyKHRhYmxlKTsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0ZXh0IGFzIGEgcGFydCBvZiB0aGUgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBwYXJlbnQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGluaXRpYWwgdmFsdWUKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IHdpZGdldAotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHZhbHVlKSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0KHBhcmVudCwgdmFsdWUsIFNXVC5TSU5HTEUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0ZXh0IGFzIGEgcGFydCBvZiB0aGUgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBwYXJlbnQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGluaXRpYWwgdmFsdWUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHN0eWxlCi0JICogQHJldHVybiB0aGUgdGV4dCB3aWRnZXQKLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB2YWx1ZSwgaW50IHN0eWxlKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgYm9yZGVyU3R5bGUgfCBzdHlsZSB8IG9yaWVudGF0aW9uKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQl0ZXh0LnNldFRleHQodmFsdWUpOwotCQl0ZXh0LnNldEZvcmVncm91bmQoY29sb3JzLmdldEZvcmVncm91bmQoKSk7Ci0JCXRleHQuYWRkRm9jdXNMaXN0ZW5lcih2aXNpYmlsaXR5SGFuZGxlcik7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0cmVlIHdpZGdldCBhcyBhIHBhcnQgb2YgdGhlIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHRyZWUgcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgdHJlZSBzdHlsZQotCSAqIEByZXR1cm4gdGhlIHRyZWUgd2lkZ2V0Ci0JICovCi0JcHVibGljIFRyZWUgY3JlYXRlVHJlZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUocGFyZW50LCBib3JkZXJTdHlsZSB8IHN0eWxlIHwgb3JpZW50YXRpb24pOwotCQlhZGFwdCh0cmVlLCBmYWxzZSwgZmFsc2UpOwotCQkvLyBob29rRGVsZXRlTGlzdGVuZXIodHJlZSk7Ci0JCXJldHVybiB0cmVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzY3JvbGxlZCBmb3JtIHdpZGdldCBpbiB0aGUgcHJvdmlkZWQgcGFyZW50LiBJZiB5b3UgZG8gbm90Ci0JICogcmVxdWlyZSBzY3JvbGxpbmcgYmVjYXVzZSB0aGVyZSBpcyBhbHJlYWR5IGEgc2Nyb2xsZWQgY29tcG9zaXRlIHVwIHRoZQotCSAqIHBhcmVudCBjaGFpbiwgdXNlICdjcmVhdGVGb3JtJyBpbnN0ZWFkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBzY3JvbGxlZCBmb3JtIHBhcmVudAotCSAqIEByZXR1cm4gdGhlIGZvcm0gdGhhdCBjYW4gc2Nyb2xsIGl0c2VsZgotCSAqIEBzZWUgI2NyZWF0ZUZvcm0KLQkgKi8KLQlwdWJsaWMgU2Nyb2xsZWRGb3JtIGNyZWF0ZVNjcm9sbGVkRm9ybShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNjcm9sbGVkRm9ybSBmb3JtID0gbmV3IFNjcm9sbGVkRm9ybShwYXJlbnQsIFNXVC5WX1NDUk9MTAotCQkJCXwgU1dULkhfU0NST0xMIHwgb3JpZW50YXRpb24pOwotCQlmb3JtLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCWZvcm0uc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCWZvcm0uc2V0QmFja2dyb3VuZChjb2xvcnMuZ2V0QmFja2dyb3VuZCgpKTsKLQkJZm9ybS5zZXRGb3JlZ3JvdW5kKGNvbG9ycy5nZXRDb2xvcihGb3JtQ29sb3JzLlRJVExFKSk7Ci0JCWNvbG9ycy5pbml0aWFsaXplU2VjdGlvblRvb2xCYXJDb2xvcnMoKTsKLQkJZm9ybS5nZXRGb3JtKCkuc2V0U2VwYXJhdG9yQ29sb3IoY29sb3JzLmdldENvbG9yKEZvcm1Db2xvcnMuVEJfQk9SREVSKSk7Ci0JCWZvcm0uc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRIZWFkZXJGb250KCkpOwotCQlyZXR1cm4gZm9ybTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZm9ybSB3aWRnZXQgaW4gdGhlIHByb3ZpZGVkIHBhcmVudC4gTm90ZSB0aGF0IHRoaXMgd2lkZ2V0IGRvZXMKLQkgKiBub3Qgc2Nyb2xsIGl0cyBjb250ZW50LCBzbyBtYWtlIHN1cmUgdGhlcmUgaXMgYSBzY3JvbGxlZCBjb21wb3NpdGUgdXAgdGhlCi0JICogcGFyZW50IGNoYWluLiBJZiB5b3UgcmVxdWlyZSBzY3JvbGxpbmcsIHVzZSAnY3JlYXRlU2Nyb2xsZWRGb3JtJyBpbnN0ZWFkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBmb3JtIHBhcmVudAotCSAqIEByZXR1cm4gdGhlIGZvcm0gdGhhdCBkb2VzIG5vdCBzY3JvbGwKLQkgKiBAc2VlICNjcmVhdGVTY3JvbGxlZEZvcm0KLQkgKi8KLQlwdWJsaWMgRm9ybSBjcmVhdGVGb3JtKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9ybSBmb3JtQ29udGVudCA9IG5ldyBGb3JtKHBhcmVudCwgb3JpZW50YXRpb24pOwotCQlmb3JtQ29udGVudC5zZXRCYWNrZ3JvdW5kKGNvbG9ycy5nZXRCYWNrZ3JvdW5kKCkpOwotCQlmb3JtQ29udGVudC5zZXRGb3JlZ3JvdW5kKGNvbG9ycy5nZXRDb2xvcihGb3JtQ29sb3JzLlRJVExFKSk7Ci0JCWNvbG9ycy5pbml0aWFsaXplU2VjdGlvblRvb2xCYXJDb2xvcnMoKTsKLQkJZm9ybUNvbnRlbnQuc2V0U2VwYXJhdG9yQ29sb3IoY29sb3JzLmdldENvbG9yKEZvcm1Db2xvcnMuVEJfQk9SREVSKSk7Ci0JCWZvcm1Db250ZW50LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpKTsKLQkJcmV0dXJuIGZvcm1Db250ZW50OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzY3JvbGxlZCBwYWdlIGJvb2sgd2lkZ2V0IGFzIGEgcGFydCBvZiB0aGUgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFnZSBib29rIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHRleHQgc3R5bGUKLQkgKiBAcmV0dXJuIHRoZSBzY3JvbGxlZCBwYWdlIGJvb2sgd2lkZ2V0Ci0JICovCi0JcHVibGljIFNjcm9sbGVkUGFnZUJvb2sgY3JlYXRlUGFnZUJvb2soQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCVNjcm9sbGVkUGFnZUJvb2sgYm9vayA9IG5ldyBTY3JvbGxlZFBhZ2VCb29rKHBhcmVudCwgc3R5bGUKLQkJCQl8IG9yaWVudGF0aW9uKTsKLQkJYWRhcHQoYm9vaywgdHJ1ZSwgdHJ1ZSk7Ci0JCWJvb2suc2V0TWVudShwYXJlbnQuZ2V0TWVudSgpKTsKLQkJcmV0dXJuIGJvb2s7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIHRvb2xraXQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNvbG9ycy5pc1NoYXJlZCgpID09IGZhbHNlKSB7Ci0JCQljb2xvcnMuZGlzcG9zZSgpOwotCQkJY29sb3JzID0gbnVsbDsKLQkJfQotCQlib2xkRm9udEhvbGRlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaHlwZXJsaW5rIGdyb3VwIHRoYXQgbWFuYWdlcyBoeXBlcmxpbmtzIGZvciB0aGlzIHRvb2xraXQuCi0JICogCi0JICogQHJldHVybiB0aGUgaHlwZXJsaW5rIGdyb3VwCi0JICovCi0JcHVibGljIEh5cGVybGlua0dyb3VwIGdldEh5cGVybGlua0dyb3VwKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIGVudGlyZSB0b29sa2l0LiBUaGUgbWV0aG9kIGRlbGVnYXRlcwotCSAqIHRoZSBjYWxsIHRvIHRoZSBGb3JtQ29sb3JzIG9iamVjdCBhbmQgYWxzbyB1cGRhdGVzIHRoZSBoeXBlcmxpbmsgZ3JvdXAgc28KLQkgKiB0aGF0IGh5cGVybGlua3MgYW5kIG90aGVyIG9iamVjdHMgYXJlIGluIHN5bmMuCi0JICogCi0JICogQHBhcmFtIGJnCi0JICogICAgICAgICAgICB0aGUgbmV3IGJhY2tncm91bmQgY29sb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKENvbG9yIGJnKSB7Ci0JCWh5cGVybGlua0dyb3VwLnNldEJhY2tncm91bmQoYmcpOwotCQljb2xvcnMuc2V0QmFja2dyb3VuZChiZyk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBoeXBlcmxpbmsgY29sb3JzIGJ5IGxvYWRpbmcgZnJvbSBKRmFjZSBzZXR0aW5ncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoSHlwZXJsaW5rQ29sb3JzKCkgewotCQloeXBlcmxpbmtHcm91cC5pbml0aWFsaXplRGVmYXVsdEZvcmVncm91bmRzKGNvbG9ycy5nZXREaXNwbGF5KCkpOwotCX0KLQotCS8qKgotCSAqIFBhaW50cyBmbGF0IGJvcmRlcnMgZm9yIHdpZGdldHMgY3JlYXRlZCBieSB0aGlzIHRvb2xraXQgd2l0aGluIHRoZQotCSAqIHByb3ZpZGVkIHBhcmVudC4gQm9yZGVycyB3aWxsIG5vdCBiZSBwYWludGVkIGlmIHRoZSBnbG9iYWwgYm9yZGVyIHN0eWxlCi0JICogaXMgU1dULkJPUkRFUiAoaS5lLiBpZiBuYXRpdmUgYm9yZGVycyBhcmUgdXNlZCkuIENhbGwgdGhpcyBtZXRob2QgZHVyaW5nCi0JICogY3JlYXRpb24gb2YgYSBmb3JtIGNvbXBvc2l0ZSB0byBnZXQgdGhlIGJvcmRlcnMgb2YgaXRzIGNoaWxkcmVuIHBhaW50ZWQuCi0JICogQ2FyZSBzaG91bGQgYmUgdGFrZW4gd2hlbiBzZWxlY3Rpb24gbGF5b3V0IG1hcmdpbnMuIEF0IGxlYXN0IG9uZSBwaXhlbAotCSAqIHBhcmdpbiB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgY2hvc2VuIHRvIGFsbG93IHRoZSB0b29sa2l0IHRvIHBhaW50IHRoZQotCSAqIGJvcmRlciBvbiB0aGUgcGFyZW50IGFyb3VuZCB0aGUgd2lkZ2V0cy4KLQkgKiA8cD4KLQkgKiBCb3JkZXJzIGFyZSBwYWludGVkIGZvciBzb21lIGNvbnRyb2xzIHRoYXQgYXJlIHNlbGVjdGVkIGJ5IHRoZSB0b29sa2l0IGJ5Ci0JICogZGVmYXVsdC4gSWYgYSBjb250cm9sIG5lZWRzIGEgYm9yZGVyIGJ1dCBpcyBub3Qgb24gaXRzIGxpc3QsIGl0IGlzCi0JICogcG9zc2libGUgdG8gZm9yY2UgYm9yZGVyIGluIHRoZSBmb2xsb3dpbmcgd2F5OgotCSAqIAotCSAqIDxwcmU+Ci0JICogCi0JICogIAotCSAqICAgCi0JICogICAgICAgICAgIHdpZGdldC5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwgRm9ybVRvb2xraXQuVFJFRV9CT1JERVIpOwotCSAqICAgICAgICAgICAKLQkgKiAgICAgICAgICAgb3IKLQkgKiAgICAgICAgICAgCi0JICogICAgICAgICAgIHdpZGdldC5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwgRm9ybVRvb2xraXQuVEVYVF9CT1JERVIpOwotCSAqICAgICAgICAgIAotCSAqICAgCi0JICogIAotCSAqIDwvcHJlPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgdGhhdCBvd25zIHRoZSBjaGlsZHJlbiBmb3Igd2hpY2ggdGhlIGJvcmRlciBuZWVkcwotCSAqICAgICAgICAgICAgdG8gYmUgcGFpbnRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYWludEJvcmRlcnNGb3IoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBpZiAoYm9yZGVyU3R5bGUgPT0gU1dULkJPUkRFUikKLQkJLy8gcmV0dXJuOwotCQlpZiAoYm9yZGVyUGFpbnRlciA9PSBudWxsKQotCQkJYm9yZGVyUGFpbnRlciA9IG5ldyBCb3JkZXJQYWludGVyKCk7Ci0JCXBhcmVudC5hZGRQYWludExpc3RlbmVyKGJvcmRlclBhaW50ZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbG9ycyB1c2VkIGJ5IHRoaXMgdG9vbGtpdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xvciBvYmplY3QKLQkgKi8KLQlwdWJsaWMgRm9ybUNvbG9ycyBnZXRDb2xvcnMoKSB7Ci0JCXJldHVybiBjb2xvcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYm9yZGVyIHN0eWxlIHVzZWQgZm9yIHZhcmlvdXMgd2lkZ2V0cyBjcmVhdGVkIGJ5IHRoaXMKLQkgKiB0b29sa2l0LiBUaGUgaW50ZW50IG9mIHRoZSB0b29sa2l0IGlzIHRvIGNyZWF0ZSBjb250cm9scyB3aXRoIHN0eWxlcyB0aGF0Ci0JICogeWllbGQgYSAnZmxhdCcgYXBwZWFyYW5jZS4gT24gc3lzdGVtcyB3aGVyZSB0aGUgbmF0aXZlIGJvcmRlcnMgYXJlCi0JICogYWxyZWFkeSBmbGF0LCB3ZSBzZXQgdGhlIHN0eWxlIHRvIFNXVC5CT1JERVIgYW5kIGRvbid0IHBhaW50IHRoZSBib3JkZXJzCi0JICogb3Vyc2VsdmVzLiBPdGhlcndpc2UsIHRoZSBzdHlsZSBpcyBzZXQgdG8gU1dULk5VTEwsIGFuZCBib3JkZXJzIGFyZQotCSAqIHBhaW50ZWQgYnkgdGhlIHRvb2xraXQuCi0JICogCi0JICogQHJldHVybiB0aGUgZ2xvYmFsIGJvcmRlciBzdHlsZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Qm9yZGVyU3R5bGUoKSB7Ci0JCXJldHVybiBib3JkZXJTdHlsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBib3JkZXIgc3R5bGUgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIHdpZGdldHMuIFRoZSB0b29sa2l0Ci0JICogY2hvb3NlcyB0aGUgY29ycmVjdCBzdHlsZSBiYXNlZCBvbiB0aGUgcGxhdGZvcm0gYnV0IHRoaXMgdmFsdWUgY2FuIGJlCi0JICogY2hhbmdlZCB1c2luZyB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIDxjb2RlPlNXVC5CT1JERVI8L2NvZGU+IG9yIDxjb2RlPlNXVC5OVUxMPC9jb2RlPgotCSAqIEBzZWUgI2dldEJvcmRlclN0eWxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyU3R5bGUoaW50IHN0eWxlKSB7Ci0JCXRoaXMuYm9yZGVyU3R5bGUgPSBzdHlsZTsKLQl9Ci0KLQkvKioKLQkgKiBBIHV0aWxpdHkgbWV0aG9kIHRoYXQgZW5zdXJlcyB0aGF0IHRoZSBjb250cm9sIGlzIHZpc2libGUgaW4gdGhlIHNjcm9sbGVkCi0JICogY29tcG9zaXRlLiBUaGUgcHJlcmVxdWlzaXRlIGZvciB0aGlzIG1ldGhvZCBpcyB0aGF0IHRoZSBjb250cm9sIGhhcyBhCi0JICogY2xhc3MgdGhhdCBleHRlbmRzIFNjcm9sbGVkQ29tcG9zaXRlIHNvbWV3aGVyZSBpbiB0aGUgcGFyZW50IGNoYWluLiBJZgotCSAqIHRoZSBjb250cm9sIGlzIHBhcnRpYWxseSBvciBmdWxseSBjbGlwcGVkLCB0aGUgY29tcG9zaXRlIGlzIHNjcm9sbGVkIHRvCi0JICogc2V0IGJ5IHNldHRpbmcgdGhlIG9yaWdpbiB0byB0aGUgY29udHJvbCBvcmlnaW4uCi0JICogCi0JICogQHBhcmFtIGMKLQkgKiAgICAgICAgICAgIHRoZSBjb250cm9sIHRvIG1ha2UgdmlzaWJsZQotCSAqIEBwYXJhbSB2ZXJ0aWNhbE9ubHkKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgc2Nyb2xsZWQgY29tcG9zaXRlIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIHNjcm9sbGVkIG9ubHkgdmVydGljYWxseSBpZiBuZWVkZWQuIE90aGVyd2lzZSwgdGhlIHNjcm9sbGVkCi0JICogICAgICAgICAgICBjb21wb3NpdGUgb3JpZ2luIHdpbGwgYmUgc2V0IHRvIHRoZSBjb250cm9sIG9yaWdpbi4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbnRyb2xWaXNpYmxlKENvbnRyb2wgYywgYm9vbGVhbiB2ZXJ0aWNhbE9ubHkpIHsKLQkJU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAgPSBGb3JtVXRpbC5nZXRTY3JvbGxlZENvbXBvc2l0ZShjKTsKLQkJaWYgKHNjb21wID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVBvaW50IGxvY2F0aW9uID0gRm9ybVV0aWwuZ2V0Q29udHJvbExvY2F0aW9uKHNjb21wLCBjKTsKLQkJc2NvbXAuc2V0T3JpZ2luKGxvY2F0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaW5pdGlhbGl6ZUJvcmRlclN0eWxlKCk7Ci0JCWh5cGVybGlua0dyb3VwID0gbmV3IEh5cGVybGlua0dyb3VwKGNvbG9ycy5nZXREaXNwbGF5KCkpOwotCQloeXBlcmxpbmtHcm91cC5zZXRCYWNrZ3JvdW5kKGNvbG9ycy5nZXRCYWNrZ3JvdW5kKCkpOwotCQl2aXNpYmlsaXR5SGFuZGxlciA9IG5ldyBWaXNpYmlsaXR5SGFuZGxlcigpOwotCQlrZXlib2FyZEhhbmRsZXIgPSBuZXcgS2V5Ym9hcmRIYW5kbGVyKCk7Ci0JCWJvbGRGb250SG9sZGVyID0gbmV3IEJvbGRGb250SG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVCb3JkZXJTdHlsZSgpIHsKLQkJU3RyaW5nIG9zbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChvc25hbWUuZXF1YWxzKCJXaW5kb3dzIFhQIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGphdmFIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBob21lRGlyID0gbmV3IEZpbGUoamF2YUhvbWUpOwotCQkJRmlsZSBiaW5EaXIgPSBuZXcgRmlsZShob21lRGlyLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgbWFuaWZlc3QgPSBuZXcgRmlsZShiaW5EaXIsICJqYXZhdy5leGUubWFuaWZlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG1hbmlmZXN0LmV4aXN0cygpKSB7Ci0JCQkJLy8gU2tpbm5lZCB3aWRnZXRzIHVzZWQgLSBjaGVjayBmb3IgV2luZG93cyBDbGFzc2ljCi0JCQkJLy8gSWYgbm90IHVzZWQsIHNldCB0aGUgc3R5bGUgdG8gQk9SREVSCi0JCQkJUkdCIHJnYiA9IGNvbG9ycy5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpOwotCQkJCWlmIChyZ2IucmVkICE9IDIxMiAmJiByZ2IuZ3JlZW4gIT0gMjA4ICYmIHJnYi5ibHVlICE9IDIwMCkKLQkJCQkJYm9yZGVyU3R5bGUgPSBTV1QuQk9SREVSOwotCQkJfQotCQl9IGVsc2UgaWYgKG9zbmFtZS5zdGFydHNXaXRoKCJNYWMiKSkgLy8kTk9OLU5MUy0xJAotCQkJYm9yZGVyU3R5bGUgPSBTV1QuQk9SREVSOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9yaWVudGF0aW9uIHRoYXQgYWxsIHRoZSB3aWRnZXRzIGNyZWF0ZWQgYnkgdGhpcyB0b29sa2l0IHdpbGwKLQkgKiBpbmhlcml0LCBpZiBzZXQuIENhbiBiZSA8Y29kZT5TV1QuTlVMTDwvY29kZT4sCi0JICogPGNvZGU+U1dULkxFRlRfVE9fUklHSFQ8L2NvZGU+IGFuZCA8Y29kZT5TV1QuUklHSFRfVE9fTEVGVDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiBvcmllbnRhdGlvbiBzdHlsZSBmb3IgdGhpcyB0b29sa2l0LCBvciA8Y29kZT5TV1QuTlVMTDwvY29kZT4gaWYKLQkgKiAgICAgICAgIG5vdCBzZXQuIFRoZSBkZWZhdWx0IG9yaWVudGF0aW9uIGlzIGluaGVyaXRlZCBmcm9tIHRoZSBXaW5kb3cKLQkgKiAgICAgICAgIGRlZmF1bHQgb3JpZW50YXRpb24uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2dldERlZmF1bHRPcmllbnRhdGlvbigpCi0JICogQHNpbmNlIDMuMQotCSAqLwotCi0JcHVibGljIGludCBnZXRPcmllbnRhdGlvbigpIHsKLQkJcmV0dXJuIG9yaWVudGF0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG9yaWVudGF0aW9uIHRoYXQgYWxsIHRoZSB3aWRnZXRzIGNyZWF0ZWQgYnkgdGhpcyB0b29sa2l0IHdpbGwKLQkgKiBpbmhlcml0LiBDYW4gYmUgPGNvZGU+U1dULk5VTEw8L2NvZGU+LCA8Y29kZT5TV1QuTEVGVF9UT19SSUdIVDwvY29kZT4KLQkgKiBhbmQgPGNvZGU+U1dULlJJR0hUX1RPX0xFRlQ8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBvcmllbnRhdGlvbgotCSAqICAgICAgICAgICAgc3R5bGUgZm9yIHRoaXMgdG9vbGtpdC4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRPcmllbnRhdGlvbihpbnQgb3JpZW50YXRpb24pIHsKLQkJdGhpcy5vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL0h5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzcxNDc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuKjsKLQotLyoqCi0gKiBIeXBlcmxpbmsgaXMgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IGRyYXdzCi0gKiB0ZXh0IGluIHRoZSBjbGllbnQgYXJlYS4gVGV4dCBjYW4gYmUgd3JhcHBlZCBhbmQgdW5kZXJsaW5lZC4gSHlwZXJsaW5rIGlzCi0gKiB0eXBpY2FsbHkgYWRkZWQgdG8gdGhlIGh5cGVybGluayBncm91cCBzbyB0aGF0IGNlcnRhaW4gcHJvcGVydGllcyBhcmUgbWFuYWdlZAotICogZm9yIGFsbCB0aGUgaHlwZXJsaW5rcyB0aGF0IGJlbG9uZyB0byBpdC4KLSAqIDxwPgotICogSHlwZXJsaW5rIGNhbiBiZSBleHRlbmRlZC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5IeXBlcmxpbmtHcm91cAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgSHlwZXJsaW5rIGV4dGVuZHMgQWJzdHJhY3RIeXBlcmxpbmsgewotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdW5kZXJsaW5lZDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaHlwZXJsaW5rIGNvbnRyb2wgaW4gdGhlIHByb3ZpZGVkIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgY29udHJvbCBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSB3aWRnZXQgc3R5bGUKLQkgKi8KLQlwdWJsaWMgSHlwZXJsaW5rKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJaW5pdEFjY2Vzc2libGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0QWNjZXNzaWJsZSgpIHsKLQkJQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gZ2V0QWNjZXNzaWJsZSgpOwotCQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJZS5yZXN1bHQgPSBnZXRUZXh0KCk7Ci0JCQkJaWYgKGUucmVzdWx0ID09IG51bGwpCi0JCQkJCWdldEhlbHAoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGdldEhlbHAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQllLnJlc3VsdCA9IGdldFRvb2xUaXBUZXh0KCk7Ci0JCQl9Ci0JCX0pOwotCQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlQb2ludCBwdCA9IHRvQ29udHJvbChuZXcgUG9pbnQoZS54LCBlLnkpKTsKLQkJCQllLmNoaWxkSUQgPSAoZ2V0Qm91bmRzKCkuY29udGFpbnMocHQpKSA/IEFDQy5DSElMRElEX1NFTEYKLQkJCQkJCTogQUNDLkNISUxESURfTk9ORTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZ2V0TG9jYXRpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGxvY2F0aW9uID0gZ2V0Qm91bmRzKCk7Ci0JCQkJUG9pbnQgcHQgPSB0b0Rpc3BsYXkobmV3IFBvaW50KGxvY2F0aW9uLngsIGxvY2F0aW9uLnkpKTsKLQkJCQllLnggPSBwdC54OwotCQkJCWUueSA9IHB0Lnk7Ci0JCQkJZS53aWR0aCA9IGxvY2F0aW9uLndpZHRoOwotCQkJCWUuaGVpZ2h0ID0gbG9jYXRpb24uaGVpZ2h0OwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBnZXRDaGlsZENvdW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJCWUuZGV0YWlsID0gMDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCQllLmRldGFpbCA9IEFDQy5ST0xFX0xJTks7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGdldFN0YXRlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJCWludCBzdGF0ZSA9IEFDQy5TVEFURV9OT1JNQUw7Ci0JCQkJaWYgKEh5cGVybGluay50aGlzLmdldFNlbGVjdGlvbigpKQotCQkJCQlzdGF0ZSA9IEFDQy5TVEFURV9TRUxFQ1RFRCB8IEFDQy5TVEFURV9GT0NVU0VEOwotCQkJCWUuZGV0YWlsID0gc3RhdGU7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVuZGVybGluZWQgc3RhdGUuIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCB0aGlzIG1ldGhvZCB3aGVuCi0JICogaW4gYSBoeXBlcmxpbmsgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIHVuZGVybGluZWQKLQkgKiAgICAgICAgICAgIGlmIDxzYW1wPnRydWUgPC9zYW1wPiwgYSBsaW5lIHdpbGwgYmUgZHJhd24gYmVsb3cgdGhlIHRleHQgZm9yCi0JICogICAgICAgICAgICBlYWNoIHdyYXBwZWQgbGluZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmRlcmxpbmVkKGJvb2xlYW4gdW5kZXJsaW5lZCkgewotCQl0aGlzLnVuZGVybGluZWQgPSB1bmRlcmxpbmVkOwotCQlyZWRyYXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1bmRlcmxpbmUgc3RhdGUgb2YgdGhlIGh5cGVybGluay4KLQkgKiAKLQkgKiBAcmV0dXJuIDxzYW1wPnRydWUgPC9zYW1wPiBpZiB0ZXh0IGlzIHVuZGVybGluZWQsIDxzYW1wPmZhbHNlIDwvc2FtcD4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VuZGVybGluZWQoKSB7Ci0JCXJldHVybiB1bmRlcmxpbmVkOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlcyB0aGUgcGFyZW50IGJ5IGluY29ycG9yYXRpbmcgdGhlIG1hcmdpbi4KLQkgKi8KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQljaGVja1dpZGdldCgpOwotCQlpbnQgaW5uZXJXaWR0aCA9IHdIaW50OwotCQlpZiAoaW5uZXJXaWR0aCAhPSBTV1QuREVGQVVMVCkKLQkJCWlubmVyV2lkdGggLT0gbWFyZ2luV2lkdGggKiAyOwotCQlQb2ludCB0ZXh0U2l6ZSA9IGNvbXB1dGVUZXh0U2l6ZShpbm5lcldpZHRoLCBoSGludCk7Ci0JCWludCB0ZXh0V2lkdGggPSB0ZXh0U2l6ZS54ICsgMiAqIG1hcmdpbldpZHRoOwotCQlpbnQgdGV4dEhlaWdodCA9IHRleHRTaXplLnkgKyAyICogbWFyZ2luSGVpZ2h0OwotCQlyZXR1cm4gbmV3IFBvaW50KHRleHRXaWR0aCwgdGV4dEhlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBoeXBlcmxpbmsgdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIGh5cGVybGluayB0ZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZXh0IG9mIHRoaXMgaHlwZXJsaW5rLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgaHlwZXJsaW5rIHRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ICE9IG51bGwpCi0JCQl0aGlzLnRleHQgPSB0ZXh0OwotCQllbHNlCi0JCQl0aGlzLnRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZWRyYXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWludHMgdGhlIGh5cGVybGluayB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBnYwotCSAqICAgICAgICAgICAgZ3JhcGhpYyBjb250ZXh0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRIeXBlcmxpbmsoR0MgZ2MpIHsKLQkJUmVjdGFuZ2xlIGNhcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlSZWN0YW5nbGUgYm91bmRzID0gbmV3IFJlY3RhbmdsZShtYXJnaW5XaWR0aCwgbWFyZ2luSGVpZ2h0LCBjYXJlYS53aWR0aAotCQkJCS0gbWFyZ2luV2lkdGggLSBtYXJnaW5XaWR0aCwgY2FyZWEuaGVpZ2h0IC0gbWFyZ2luSGVpZ2h0Ci0JCQkJLSBtYXJnaW5IZWlnaHQpOwotCQlwYWludFRleHQoZ2MsIGJvdW5kcyk7Ci0JfQotCi0JLyoqCi0JICogUGFpbnRzIHRoZSBoeXBlcmxpbmsgdGV4dCBpbiBwcm92aWRlZCBib3VuZGluZyByZWN0YW5nbGUuCi0JICogCi0JICogQHBhcmFtIGdjCi0JICogICAgICAgICAgICBncmFwaGljIGNvbnRleHQKLQkgKiBAcGFyYW0gYm91bmRzCi0JICogICAgICAgICAgICB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGluIHdoaWNoIHRvIHBhaW50IHRoZSB0ZXh0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRUZXh0KEdDIGdjLCBSZWN0YW5nbGUgYm91bmRzKSB7Ci0JCWdjLnNldEZvbnQoZ2V0Rm9udCgpKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOwotCQlpZiAoKGdldFN0eWxlKCkgJiBTV1QuV1JBUCkgIT0gMCkgewotCQkJRm9ybVV0aWwucGFpbnRXcmFwVGV4dChnYywgdGV4dCwgYm91bmRzLCB1bmRlcmxpbmVkKTsKLQkJfSBlbHNlIHsKLQkJCVBvaW50IHRleHRTaXplID0gY29tcHV0ZVRleHRTaXplKGJvdW5kcy53aWR0aCwgU1dULkRFRkFVTFQpOwotCQkJaW50IHRleHRXaWR0aCA9IHRleHRTaXplLng7Ci0JCQlpbnQgdGV4dEhlaWdodCA9IHRleHRTaXplLnk7Ci0JCQlnYy5kcmF3VGV4dChnZXRUZXh0KCksIGJvdW5kcy54LCBib3VuZHMueSwgdHJ1ZSk7Ci0JCQlpZiAodW5kZXJsaW5lZCkgewotCQkJCWludCBkZXNjZW50ID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXREZXNjZW50KCk7Ci0JCQkJaW50IGxpbmVZID0gYm91bmRzLnkgKyB0ZXh0SGVpZ2h0IC0gZGVzY2VudCArIDE7Ci0JCQkJZ2MuZHJhd0xpbmUoYm91bmRzLngsIGxpbmVZLCBib3VuZHMueCArIHRleHRXaWR0aCwgbGluZVkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVUZXh0U2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkgewotCQlQb2ludCBleHRlbnQ7Ci0JCUdDIGdjID0gbmV3IEdDKHRoaXMpOwotCQlnYy5zZXRGb250KGdldEZvbnQoKSk7Ci0JCWlmICgoZ2V0U3R5bGUoKSAmIFNXVC5XUkFQKSAhPSAwICYmIHdIaW50ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQlleHRlbnQgPSBGb3JtVXRpbC5jb21wdXRlV3JhcFNpemUoZ2MsIGdldFRleHQoKSwgd0hpbnQpOwotCQl9IGVsc2UgewotCQkJZXh0ZW50ID0gZ2MudGV4dEV4dGVudChnZXRUZXh0KCkpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIGV4dGVudDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9JTGF5b3V0RXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL0lMYXlvdXRFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzYTRhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL0lMYXlvdXRFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLS8qKgotICogQ2xhc3NlcyB0aGF0IGV4dGVuZCBhYnN0cmFjdCBjbGFzcyBMYXlvdXQgYW5kIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBjYW4KLSAqIHRha2UgcGFydCBpbiBsYXlvdXQgY29tcHV0YXRpb24gb2YgdGhlIFRhYmxlV3JhcExheW91dCBtYW5hZ2VyLiBUaGlzIGxheW91dAotICogdXNlcyBhbHRlcm5hdGl2ZSBhbGdvcml0aG0gdGhhdCBjb21wdXRlcyBjb2x1bW5zIGJlZm9yZSByb3dzLiBJdCBhbGxvd3MgaXQKLSAqIHRvICdmbG93JyB3cmFwcGVkIHRleHQgcHJvcG9ydGlvbmFsbHkgKHNpbWlsYXIgdG8gdGhlIHdheSB3ZWIgYnJvd3NlcgotICogcmVuZGVycyB0YWJsZXMpLiBDdXN0b20gbGF5b3V0IG1hbmFnZXJzIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHdpbGwKLSAqIGFsbG93IFRhYmxlV3JhcExheW91dCB0byBwcm9wZXJseSBjb21wdXRlIHdpZHRoIGhpbnQgdG8gcGFzcy4KLSAqIAotICogQHNlZSBUYWJsZVdyYXBMYXlvdXQKLSAqIEBzZWUgQ29sdW1uTGF5b3V0Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxheW91dEV4dGVuc2lvbiB7Ci0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gd2lkdGggb2YgdGhlIHBhcmVudC4gQWxsIHdpZGdldHMgY2FwYWJsZSBvZiB3b3JkCi0JICogd3JhcHBpbmcgc2hvdWxkIHJldHVybiB0aGUgd2lkdGggb2YgdGhlIGxvbmdlc3Qgd29yZCB0aGF0IGNhbm5vdCBiZQotCSAqIGJyb2tlbiBhbnkgZnVydGhlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNoYW5nZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNhY2hlZCBpbmZvcm1hdGlvbiBzaG91bGQgYmUKLQkgKiBmbHVzaGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIEByZXR1cm4gdGhlIG1pbmltdW0gd2lkdGggb2YgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXB1dGVNaW5pbXVtV2lkdGgoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKTsKLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgbWF4aW11bSB3aWR0aCBvZiB0aGUgcGFyZW50LiBBbGwgd2lkZ2V0cyBjYXBhYmxlIG9mIHdvcmQKLQkgKiB3cmFwcGluZyBzaG91bGQgcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZSB0ZXh0IHdpdGggd3JhcHBpbmcKLQkgKiB0dXJuZWQgb2ZmLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY2hhbmdlZCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2FjaGVkIGluZm9ybWF0aW9uCi0JICogc2hvdWxkIGJlIGZsdXNoZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogQHJldHVybiB0aGUgbWF4aW11bSB3aWR0aCBvZiB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBpbnQgY29tcHV0ZU1heGltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9JbWFnZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9JbWFnZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWVlYzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvSW1hZ2VIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQ2hyaXNzIEdyb3NzIChzY2h0b29Ac2NodG9vLmNvbSkgLSBmaXggZm9yIDYxNjcwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZXh0ZW5kcyBoeXBlcmxpbmsgd2lkZ2V0IGJ5IGFkZGluZyB0aGUgY2FwYWJpbGl0eSB0byByZW5kZXIgYW4KLSAqIGltYWdlIHJlbGF0aXZlIHRvIHRoZSB0ZXh0LiBJZiBubyB0ZXh0IGhhcyBiZWVuIHNldCwgb25seSBpbWFnZSB3aWxsIGJlCi0gKiBzaG93bi4gSW1hZ2VzIGZvciBob3ZlciBhbmQgYWN0aXZlIHN0YXRlcyBjYW4gYmUgc2V0IGluIGFkZGl0aW9uIHRvIHRoZQotICogbm9ybWFsIHN0YXRlIGltYWdlLgotICogPHA+Ci0gKiBXaGVuIGltYWdlIGlzIHRhbGxlciB0aGFuIHRoZSB0ZXh0LCBhZGRpdGlvbmFsIHN0eWxlIGNhbiBiZSBwcm92aWRlZCB0bwotICogY29udHJvbCB2ZXJ0aWNhbCBhbGlnbm1lbnQgKHN1cHBvcnRlZCB2YWx1ZXMgYXJlIFNXVC5UT1AsIFNXVC5CT1RUT00gYW5kCi0gKiBTV1QuQ0VOVEVSKS4KLSAqIDxwPgotICogVGhlIGNsYXNzIGRvZXMgbm90IG5lZWQgdG8gYmUgc3VibGFzc2VkIGJ1dCBpdCBpcyBhbGxvd2VkIHRvIGRvIHNvIGlmIHNvbWUKLSAqIGFzcGVjdCBvZiB0aGUgaW1hZ2UgaHlwZXJsaW5rIG5lZWRzIHRvIGJlIG1vZGlmaWVkLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZUh5cGVybGluayBleHRlbmRzIEh5cGVybGluayB7Ci0JLyoqCi0JICogQW1vdW50IG9mIHBpeGVscyBiZXR3ZWVuIHRoZSBpbWFnZSBhbmQgdGhlIHRleHQgKGRlZmF1bHQgaXMgNSkuCi0JICovCi0JcHVibGljIGludCB0ZXh0U3BhY2luZyA9IDU7Ci0KLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JcHJpdmF0ZSBJbWFnZSBob3ZlckltYWdlOwotCi0JcHJpdmF0ZSBJbWFnZSBhY3RpdmVJbWFnZTsKLQotCXByaXZhdGUgaW50IHN0YXRlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhPVkVSID0gMSA8PCAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElWRSA9IDEgPDwgMjsKLQotCXByaXZhdGUgaW50IHZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQotCXByaXZhdGUgaW50IGhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGltYWdlIGh5cGVybGluayBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgY29udHJvbCBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250cm9sIHN0eWxlIChTV1QuV1JBUCwgQk9UVE9NLCBUT1AsIE1JRERMRSwgTEVGVCwgUklHSFQpCi0JICovCi0JcHVibGljIEltYWdlSHlwZXJsaW5rKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHJlbW92ZUFsaWdubWVudChzdHlsZSkpOwotCQlleHRyYWN0QWxpZ25tZW50KHN0eWxlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuQWJzdHJhY3RIeXBlcmxpbmsjcGFpbnRIeXBlcmxpbmsob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhaW50SHlwZXJsaW5rKEdDIGdjKSB7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCWlmICgoc3RhdGUgJiBBQ1RJVkUpICE9IDApCi0JCQlpbWFnZSA9IGFjdGl2ZUltYWdlOwotCQllbHNlIGlmICgoc3RhdGUgJiBIT1ZFUikgIT0gMCkKLQkJCWltYWdlID0gaG92ZXJJbWFnZTsKLQkJaWYgKGltYWdlID09IG51bGwpCi0JCQlpbWFnZSA9IHRoaXMuaW1hZ2U7Ci0JCVJlY3RhbmdsZSBpYm91bmRzID0gaW1hZ2UgIT0gbnVsbCA/IGltYWdlLmdldEJvdW5kcygpIDogbmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKTsKLQkJUG9pbnQgbWF4c2l6ZSA9IGNvbXB1dGVNYXhJbWFnZVNpemUoKTsKLQkJaW50IHNwYWNpbmcgPSBpbWFnZSE9bnVsbD90ZXh0U3BhY2luZzowOwkJCi0JCWludCB0ZXh0V2lkdGggPSBjbGllbnRBcmVhLndpZHRoIC0gbWF4c2l6ZS54IC0gc3BhY2luZwotCQkJCS0gbWFyZ2luV2lkdGggLSBtYXJnaW5XaWR0aDsKLQkJaW50IHkgPSBtYXJnaW5IZWlnaHQgKyBtYXhzaXplLnkgLyAyIC0gaWJvdW5kcy5oZWlnaHQgLyAyOwotCi0JCWlmIChob3Jpem9udGFsQWxpZ25tZW50ID09IFNXVC5MRUZUKSB7Ci0JCQlpbnQgeCA9IG1hcmdpbldpZHRoICsgbWF4c2l6ZS54IC8gMiAtIGlib3VuZHMud2lkdGggLyAyOwotCQkJaW50IHRleHRYID0gbWFyZ2luV2lkdGggKyBtYXhzaXplLnggKyBzcGFjaW5nOwotCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCB4LCB5KTsKLQkJCWlmIChnZXRUZXh0KCkgIT0gbnVsbCkKLQkJCQlkcmF3VGV4dChnYywgY2xpZW50QXJlYSwgdGV4dFgsIHRleHRXaWR0aCk7Ci0JCX0gZWxzZSBpZiAoaG9yaXpvbnRhbEFsaWdubWVudCA9PSBTV1QuUklHSFQpIHsKLQkJCWludCB4ID0gbWFyZ2luV2lkdGg7Ci0JCQlpZiAoZ2V0VGV4dCgpICE9IG51bGwpIHsKLQkJCQl4ICs9IGRyYXdUZXh0KGdjLCBjbGllbnRBcmVhLCB4LCB0ZXh0V2lkdGgpOwotCQkJfQotCQkJeCArPSBtYXhzaXplLnggLyAyIC0gaWJvdW5kcy53aWR0aCAvIDIgKyBzcGFjaW5nOwotCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCB4LCB5KTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGRyYXdUZXh0KEdDIGdjLCBSZWN0YW5nbGUgY2xpZW50QXJlYSwgaW50IHRleHRYLCBpbnQgdGV4dFdpZHRoKSB7Ci0JCVBvaW50IHRleHRTaXplID0gY29tcHV0ZVRleHRTaXplKHRleHRXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlpbnQgc2xvdEhlaWdodCA9IGNsaWVudEFyZWEuaGVpZ2h0IC0gbWFyZ2luSGVpZ2h0IC0gbWFyZ2luSGVpZ2h0OwotCQlpbnQgdGV4dFk7Ci0JCXRleHRXaWR0aCA9IHRleHRTaXplLng7Ci0JCWludCB0ZXh0SGVpZ2h0ID0gdGV4dFNpemUueTsKLQkJaWYgKHZlcnRpY2FsQWxpZ25tZW50ID09IFNXVC5CT1RUT00pIHsKLQkJCXRleHRZID0gbWFyZ2luSGVpZ2h0ICsgc2xvdEhlaWdodCAtIHRleHRIZWlnaHQ7Ci0JCX0gZWxzZSBpZiAodmVydGljYWxBbGlnbm1lbnQgPT0gU1dULkNFTlRFUikgewotCQkJdGV4dFkgPSBtYXJnaW5IZWlnaHQgKyBzbG90SGVpZ2h0IC8gMiAtIHRleHRIZWlnaHQgLyAyOwotCQl9IGVsc2UgewotCQkJdGV4dFkgPSBtYXJnaW5IZWlnaHQ7Ci0JCX0KLQkJcGFpbnRUZXh0KGdjLCBuZXcgUmVjdGFuZ2xlKHRleHRYLCB0ZXh0WSwgdGV4dFdpZHRoLCB0ZXh0SGVpZ2h0KSk7Ci0JCXJldHVybiB0ZXh0V2lkdGg7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGNvbnRyb2wgc2l6ZSBieSByZXNlcnZpbmcgc3BhY2UgZm9yIGltYWdlcyBpbiBhZGRpdGlvbiB0bwotCSAqIHRleHQuCi0JICogCi0JICogQHBhcmFtIHdIaW50Ci0JICogICAgICAgICAgICB3aWR0aCBoaW50Ci0JICogQHBhcmFtIGhIaW50Ci0JICogICAgICAgICAgICBoZWlnaHQgaGludAotCSAqIEBwYXJhbSBjaGFuZ2VkCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgYW55IGNhY2hlZCBsYXlvdXQgZGF0YSBzaG91bGQgYmUKLQkgKiAgICAgICAgICAgIGNvbXB1dGVkIGFuZXcKLQkgKi8KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQljaGVja1dpZGdldCgpOwotCQlQb2ludCBpc2l6ZSA9IGNvbXB1dGVNYXhJbWFnZVNpemUoKTsKLQkJaW50IHNwYWNpbmcgPSBpc2l6ZS54PjA/dGV4dFNwYWNpbmc6MDsKLQkJUG9pbnQgdGV4dFNpemUgPSBudWxsOwotCQlpZiAoZ2V0VGV4dCgpICE9IG51bGwpIHsKLQkJCWludCBpbm5lcldIaW50ID0gd0hpbnQ7Ci0JCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHsKLQkJCQlpbm5lcldIaW50ID0gd0hpbnQgLSAyICogbWFyZ2luV2lkdGggLSBpc2l6ZS54IC0gc3BhY2luZzsKLQkJCX0KLQkJCXRleHRTaXplID0gc3VwZXIuY29tcHV0ZVNpemUoaW5uZXJXSGludCwgaEhpbnQsIGNoYW5nZWQpOwotCQl9Ci0JCWludCB3aWR0aCA9IGlzaXplLng7Ci0JCWludCBoZWlnaHQgPSBpc2l6ZS55OwotCQlpZiAodGV4dFNpemUgIT0gbnVsbCkgewotCQkJd2lkdGggKz0gc3BhY2luZzsKLQkJCXdpZHRoICs9IHRleHRTaXplLng7Ci0JCQloZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIHRleHRTaXplLnkpOwotCQl9Ci0JCXdpZHRoICs9IDIgKiBtYXJnaW5XaWR0aDsKLQkJaGVpZ2h0ICs9IDIgKiBtYXJnaW5IZWlnaHQ7Ci0JCXJldHVybiBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRW50ZXIoRXZlbnQgZSkgewotCQlzdGF0ZSA9IEhPVkVSOwotCQlzdXBlci5oYW5kbGVFbnRlcihlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFeGl0KEV2ZW50IGUpIHsKLQkJc3RhdGUgPSAwOwotCQlzdXBlci5oYW5kbGVFeGl0KGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKEV2ZW50IGUpIHsKLQkJc3RhdGUgJj0gQUNUSVZFOwotCQlyZWRyYXcoKTsKLQkJc3VwZXIuaGFuZGxlQWN0aXZhdGUoZSk7Ci0JCXN0YXRlICY9IH5BQ1RJVkU7Ci0JCWlmICghaXNEaXNwb3NlZCgpKQotCQkJcmVkcmF3KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhY3RpdmUgaW1hZ2UuCi0JICogCi0JICogQHJldHVybiBhY3RpdmUgaW1hZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0QWN0aXZlSW1hZ2UoKSB7Ci0JCXJldHVybiBhY3RpdmVJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSB0byBzaG93IHdoZW4gbGluayBpcyBhY3RpdmF0ZWQuCi0JICogCi0JICogQHBhcmFtIGFjdGl2ZUltYWdlCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlSW1hZ2UoSW1hZ2UgYWN0aXZlSW1hZ2UpIHsKLQkJdGhpcy5hY3RpdmVJbWFnZSA9IGFjdGl2ZUltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhvdmVyIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gaG92ZXIgaW1hZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SG92ZXJJbWFnZSgpIHsKLQkJcmV0dXJuIGhvdmVySW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgdG8gc2hvdyB3aGVuIGxpbmsgaXMgaG92ZXIgc3RhdGUgKG9uIG1vdXNlIG92ZXIpLgotCSAqIAotCSAqIEBwYXJhbSBob3ZlckltYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG92ZXJJbWFnZShJbWFnZSBob3ZlckltYWdlKSB7Ci0JCXRoaXMuaG92ZXJJbWFnZSA9IGhvdmVySW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgdG8gc2hvdyBpbiB0aGUgbm9ybWFsIHN0YXRlLgotCSAqIAotCSAqIEByZXR1cm4gbm9ybWFsIGltYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgdG8gc2hvdyB3aGVuIGxpbmsgaXMgaW4gdGhlIG5vcm1hbCBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlTWF4SW1hZ2VTaXplKCkgewotCQlpbnQgeCA9IDA7Ci0JCWludCB5ID0gMDsKLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCXggPSBNYXRoLm1heChpbWFnZS5nZXRCb3VuZHMoKS53aWR0aCwgeCk7Ci0JCQl5ID0gTWF0aC5tYXgoaW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0LCB5KTsKLQkJfQotCQlpZiAoaG92ZXJJbWFnZSAhPSBudWxsKSB7Ci0JCQl4ID0gTWF0aC5tYXgoaG92ZXJJbWFnZS5nZXRCb3VuZHMoKS53aWR0aCwgeCk7Ci0JCQl5ID0gTWF0aC5tYXgoaG92ZXJJbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQsIHkpOwotCQl9Ci0JCWlmIChhY3RpdmVJbWFnZSAhPSBudWxsKSB7Ci0JCQl4ID0gTWF0aC5tYXgoYWN0aXZlSW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGgsIHgpOwotCQkJeSA9IE1hdGgubWF4KGFjdGl2ZUltYWdlLmdldEJvdW5kcygpLmhlaWdodCwgeSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQb2ludCh4LCB5KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgcmVtb3ZlQWxpZ25tZW50KGludCBzdHlsZSkgewotCQlpbnQgcmVzdWx0U3R5bGUgPSBzdHlsZTsKLQkJaWYgKChzdHlsZSAmIFNXVC5DRU5URVIpICE9IDApIHsKLQkJCXJlc3VsdFN0eWxlICY9ICh+U1dULkNFTlRFUik7Ci0JCX0KLQkJaWYgKChzdHlsZSAmIFNXVC5UT1ApICE9IDApIHsKLQkJCXJlc3VsdFN0eWxlICY9ICh+U1dULlRPUCk7Ci0JCX0KLQkJaWYgKChzdHlsZSAmIFNXVC5CT1RUT00pICE9IDApIHsKLQkJCXJlc3VsdFN0eWxlICY9ICh+U1dULkJPVFRPTSk7Ci0JCX0KLQkJaWYgKChzdHlsZSAmIFNXVC5MRUZUKSAhPSAwKSB7Ci0JCQlyZXN1bHRTdHlsZSAmPSAoflNXVC5MRUZUKTsKLQkJfQotCQlpZiAoKHN0eWxlICYgU1dULlJJR0hUKSAhPSAwKSB7Ci0JCQlyZXN1bHRTdHlsZSAmPSAoflNXVC5SSUdIVCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFN0eWxlOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHRyYWN0QWxpZ25tZW50KGludCBzdHlsZSkgewotCQlpZiAoKHN0eWxlICYgU1dULkNFTlRFUikgIT0gMCkgewotCQkJdmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQl9IGVsc2UgaWYgKChzdHlsZSAmIFNXVC5UT1ApICE9IDApIHsKLQkJCXZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJfSBlbHNlIGlmICgoc3R5bGUgJiBTV1QuQk9UVE9NKSAhPSAwKSB7Ci0JCQl2ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CT1RUT007Ci0JCX0KLQkJaWYgKChzdHlsZSAmIFNXVC5MRUZUKSAhPSAwKSB7Ci0JCQlob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCX0gZWxzZSBpZiAoKHN0eWxlICYgU1dULlJJR0hUKSAhPSAwKSB7Ci0JCQlob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULlJJR0hUOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9MYXlvdXRDYWNoZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9MYXlvdXRDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWVhNTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvTGF5b3V0Q2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIENhY2hlcyB0aGUgcHJlZmVycmVkIHNpemVzIG9mIGFuIGFycmF5IG9mIGNvbnRyb2xzCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIExheW91dENhY2hlIHsKLSAgICBwcml2YXRlIFNpemVDYWNoZVtdIGNhY2hlcyA9IG5ldyBTaXplQ2FjaGVbMF07Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGxheW91dCBjYWNoZQotICAgICAqLwotICAgIHB1YmxpYyBMYXlvdXRDYWNoZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY2FjaGUgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiBjb250cm9scwotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250cm9scwotICAgICAqLwotICAgIHB1YmxpYyBMYXlvdXRDYWNoZShDb250cm9sW10gY29udHJvbHMpIHsKLSAgICAgICAgcmVidWlsZENhY2hlKGNvbnRyb2xzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaXplIGNhY2hlIGZvciB0aGUgZ2l2ZW4gY29udHJvbAotICAgICAqIAotICAgICAqIEBwYXJhbSBpZHgKLSAgICAgKiBAcmV0dXJuIHRoZSBzaXplIGNhY2hlIGZvciB0aGUgZ2l2ZW4gY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBTaXplQ2FjaGUgZ2V0Q2FjaGUoaW50IGlkeCkgewotICAgICAgICByZXR1cm4gY2FjaGVzW2lkeF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udHJvbHMgdGhhdCBhcmUgYmVpbmcgY2FjaGVkIGhlcmUuIElmIHRoZXNlIGFyZSB0aGUgc2FtZQotICAgICAqIGNvbnRyb2xzIHRoYXQgd2VyZSB1c2VkIGxhc3QgdGltZSwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLiBPdGhlcndpc2UsCi0gICAgICogdGhlIGNhY2hlIGlzIGZsdXNoZWQgYW5kIGEgbmV3IGNhY2hlIGlzIGNyZWF0ZWQgZm9yIHRoZSBuZXcgY29udHJvbHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRyb2xzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udHJvbHMoQ29udHJvbFtdIGNvbnRyb2xzKSB7Ci0gICAgICAgIC8vIElmIHRoZSBudW1iZXIgb2YgY29udHJvbHMgaGFzIGNoYW5nZWQsIGRpc2NhcmQgdGhlIGVudGlyZSBjYWNoZQotICAgICAgICBpZiAoY29udHJvbHMubGVuZ3RoICE9IGNhY2hlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJlYnVpbGRDYWNoZShjb250cm9scyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBjb250cm9scy5sZW5ndGg7IGlkeCsrKSB7Ci0gICAgICAgICAgICBjYWNoZXNbaWR4XS5zZXRDb250cm9sKGNvbnRyb2xzW2lkeF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBzaXplIGNhY2hlIGZvciB0aGUgZ2l2ZW4gc2V0IG9mIGNvbnRyb2xzLCBkaXNjYXJkaW5nIGFueQotICAgICAqIGV4aXN0aW5nIGNhY2hlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250cm9scyB0aGUgY29udHJvbHMgd2hvc2Ugc2l6ZSBpcyBiZWluZyBjYWNoZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVidWlsZENhY2hlKENvbnRyb2xbXSBjb250cm9scykgewotICAgICAgICBTaXplQ2FjaGVbXSBuZXdDYWNoZSA9IG5ldyBTaXplQ2FjaGVbY29udHJvbHMubGVuZ3RoXTsKLQotICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBjb250cm9scy5sZW5ndGg7IGlkeCsrKSB7Ci0gICAgICAgICAgICAvLyBUcnkgdG8gcmV1c2UgZXhpc3RpbmcgY2FjaGVzIGlmIHBvc3NpYmxlCi0gICAgICAgICAgICBpZiAoaWR4IDwgY2FjaGVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIG5ld0NhY2hlW2lkeF0gPSBjYWNoZXNbaWR4XTsKLSAgICAgICAgICAgICAgICBuZXdDYWNoZVtpZHhdLnNldENvbnRyb2woY29udHJvbHNbaWR4XSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5ld0NhY2hlW2lkeF0gPSBuZXcgU2l6ZUNhY2hlKGNvbnRyb2xzW2lkeF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2FjaGVzID0gbmV3Q2FjaGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBudGggY29udHJvbAotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250cm9sSW5kZXggaW5kZXggb2YgdGhlIGNvbnRyb2wgd2hvc2Ugc2l6ZSB3aWxsIGJlIGNvbXB1dGVkCi0gICAgICogQHBhcmFtIHdpZHRoSGludCB3aWR0aCBvZiB0aGUgY29udHJvbCAob3IgU1dULkRFRkFVTFQgaWYgdW5rbm93bikKLSAgICAgKiBAcGFyYW0gaGVpZ2h0SGludCBoZWlnaHQgb2YgdGhlIGNvbnRyb2wgKG9yIFNXVC5ERUZBVUxUIGlmIHVua25vd24pCi0gICAgICogQHJldHVybiB0aGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IGNvbnRyb2xJbmRleCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQpIHsKLSAgICAgICAgcmV0dXJuIGNhY2hlc1tjb250cm9sSW5kZXhdLmNvbXB1dGVTaXplKHdpZHRoSGludCwgaGVpZ2h0SGludCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmx1c2hlcyB0aGUgY2FjaGUgZm9yIHRoZSBnaXZlbiBjb250cm9sLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaWYgZXhhY3RseQotICAgICAqIG9uZSBvZiB0aGUgY29udHJvbHMgaGFzIGNoYW5nZWQgYnV0IHRoZSByZW1haW5pbmcgY29udHJvbHMgcmVtYWluIHVubW9kaWZpZWQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udHJvbEluZGV4Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmx1c2goaW50IGNvbnRyb2xJbmRleCkgewotICAgICAgICBjYWNoZXNbY29udHJvbEluZGV4XS5mbHVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZsdXNoZXMgdGhlIGNhY2hlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgewotICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBjYWNoZXMubGVuZ3RoOyBpZHgrKykgewotICAgICAgICAgICAgY2FjaGVzW2lkeF0uZmx1c2goKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvTGF5b3V0Q29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL0xheW91dENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU1ODM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvTGF5b3V0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLS8qKgotICogVGhlIGNsYXNzIG92ZXJyaWRlcyBkZWZhdWx0IG1ldGhvZCBmb3IgY29tcHV0aW5nIHNpemUgaW4gQ29tcG9zaXRlIGJ5Ci0gKiBhY2NlcHRpbmcgc2l6ZSByZXR1cm5lZCBmcm9tIGxheW91dCBtYW5hZ2VycyBhcy1pcy4gVGhlIGRlZmF1bHQgY29kZSBhY2NlcHRzCi0gKiB3aWR0aCBvciBoZWlnaHQgaGludCBhc3N1bWluZyBpdCBpcyBjb3JyZWN0LiBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSB0aGF0Ci0gKiB0aGUgY29tcHV0YXRpb24gdXNpbmcgdGhlIHByb3ZpZGVkIHdpZHRoIGhpbnQgcmVzdWx0cyBpbiBhIHJlYWwgc2l6ZSB0aGF0IGlzCi0gKiBsYXJnZXIuIFRoaXMgY2FuIHJlc3VsdCBpbiB3cmFwcGVkIHRleHQgd2lkZ2V0cyBiZWluZyBjbGlwcGVkLCBhc2tpbmcgdG8KLSAqIHJlbmRlciBpbiBib3VuZHMgbmFycm93ZXIgdGhhbiB0aGUgbG9uZ2VzdCB3b3JkLgotICovCi0vKiBwYWNrYWdlICovY2xhc3MgTGF5b3V0Q29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwdWJsaWMgTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJc2V0TWVudShwYXJlbnQuZ2V0TWVudSgpKTsKLQl9Ci0JcHVibGljIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJTGF5b3V0IGxheW91dCA9IGdldExheW91dCgpOwotCQlpZiAobGF5b3V0IGluc3RhbmNlb2YgVGFibGVXcmFwTGF5b3V0KQotCQkJcmV0dXJuICgoVGFibGVXcmFwTGF5b3V0KSBsYXlvdXQpLmNvbXB1dGVTaXplKHRoaXMsIHdIaW50LCBoSGludCwKLQkJCQkJY2hhbmdlZCk7Ci0JCWlmIChsYXlvdXQgaW5zdGFuY2VvZiBDb2x1bW5MYXlvdXQpCi0JCQlyZXR1cm4gKChDb2x1bW5MYXlvdXQpIGxheW91dCkuY29tcHV0ZVNpemUodGhpcywgd0hpbnQsIGhIaW50LAotCQkJCQljaGFuZ2VkKTsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVTaXplKHdIaW50LCBoSGludCwgY2hhbmdlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9PbGRGb3JtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL09sZEZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwMWQ4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL09sZEZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzLkZvcm1IZWFkaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuRm9ybVV0aWw7Ci0KLS8qKgotICogRm9ybSBpcyBhIGN1c3RvbSBjb250cm9sIHRoYXQgcmVuZGVycyBhIHRpdGxlIGFuZCBhbiBvcHRpb25hbCBiYWNrZ3JvdW5kCi0gKiBpbWFnZSBhYm92ZSB0aGUgYm9keSBjb21wb3NpdGUuIEl0IGNhbiBiZSB1c2VkIGFsb25lIHdoZW4gcGFydCBvZiBwYXJlbnRzCi0gKiB0aGF0IGFyZSBzY3JvbGxlZC4gSWYgc2Nyb2xsaW5nIGlzIHJlcXVpcmVkLCB1c2UgPGNvZGU+U2Nyb2xsZWRGb3JtPC9jb2RlPgotICogaW5zdGVhZCBiZWNhdXNlIGl0IGhhcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5Gb3JtPC9jb2RlPiBhbmQgYWRkcyBzY3JvbGxpbmcKLSAqIGNhcGFiaWxpdHkuCi0gKiA8cD4KLSAqIEZvcm0gY2FuIGhhdmUgYSB0aXRsZSBpZiBzZXQuIElmIG5vdCBzZXQsIHRpdGxlIGFyZWEgd2lsbCBub3QgYmUgbGVmdCBlbXB0eSAtCi0gKiBmb3JtIGJvZHkgd2lsbCBiZSByZXNpemVkIHRvIGZpbGwgdGhlIGVudGlyZSBmb3JtLiBJbiBhZGRpdGlvbiwgYW4gb3B0aW9uYWwKLSAqIHRpdGxlIGltYWdlIGNhbiBiZSBzZXQgYW5kIGlzIHJlbmRlcmVkIHRvIHRoZSBsZWZ0IG9mIHRoZSB0aXRsZS4KLSAqIDxwPgotICogU2luY2UgMy4yLCB0aGUgZm9ybSBzdXBwb3J0cyBzdGF0dXMgbWVzc2FnZXMuIFRoZXNlIG1lc3NhZ2VzIGNhbiBoYXZlIHZhcmlvdXMKLSAqIHNldmVyaXR5IChlcnJvciwgd2FybmluZywgaW5mbyBvciBub25lKS4gTWVzc2FnZSB0cmF5IGNhbiBiZSBtaW5pbWl6ZWQgYW5kCi0gKiBsYXRlciByZXN0b3JlZCBieSB0aGUgdXNlciwgYnV0IGNhbiBvbmx5IGJlIGNsb3NlZCBwcm9ncmFtbWF0aWNhbGx5LgotICogPHA+Ci0gKiBGb3JtIGNhbiBoYXZlIGEgYmFja2dyb3VuZCBpbWFnZSBiZWhpbmQgdGhlIHRpdGxlIHRleHQuIFRoZSBpbWFnZSBjYW4gYmUKLSAqIHBhaW50ZWQgYXMtaXMsIG9yIHRpbGVkIGFzIG1hbnkgdGltZXMgYXMgbmVlZGVkIHRvIGZpbGwgdGhlIHRpdGxlIGFyZWEuCi0gKiA8cD4KLSAqIEZvcm0gaGFzIGEgY3VzdG9tIGxheW91dCBtYW5hZ2VyIHRoYXQgaXMgd3JhcC1lbmFibGVkLiBJZiBhIGZvcm0gaXMgcGxhY2VkIGluCi0gKiBhIGNvbXBvc2l0ZSB3aG9zZSBsYXlvdXQgbWFuYWdlciBpbXBsZW1lbnRzIElMYXlvdXRFeHRlbnNpb24sIHRoZSBib2R5IG9mIHRoZQotICogd29ybSB3aWxsIHBhcnRpY2lwYXRlIGluIHdyYXBwaW5nIGFzIGxvbmcgYXMgaXRzIGxheW91dCBtYW5hZ2VyIGltcGxlbWVudHMKLSAqIElMYXlvdXRFeHRlbnNpb24gYXMgd2VsbC4KLSAqIDxwPgotICogQ2hpbGRyZW4gb2YgdGhlIGZvcm0gc2hvdWxkIHR5cGljYWxseSBiZSBjcmVhdGVkIHVzaW5nIEZvcm1Ub29sa2l0IHRvIG1hdGNoCi0gKiB0aGUgYXBwZWFyYW5jZSBhbmQgYmVoYXZpb3VyLiBXaGVuIGNyZWF0aW5nIGNoaWxkcmVuLCB1c2UgdGhlIGZvcm0gYm9keSBhcyBhCi0gKiBwYXJlbnQgYnkgY2FsbGluZyAnZ2V0Qm9keSgpJyBvbiB0aGUgZm9ybSBpbnN0YW5jZS4gRXhhbXBsZToKLSAqIAotICogPHByZT4KLSAqIEZvcm1Ub29sa2l0IHRvb2xraXQgPSBuZXcgRm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0gKiBGb3JtIGZvcm0gPSB0b29sa2l0LmNyZWF0ZUZvcm0ocGFyZW50KTsKLSAqIGZvcm1Db250ZW50LnNldFRleHQoJnF1b3Q7U2FtcGxlIGZvcm0mcXVvdDspOwotICogZm9ybUNvbnRlbnQuZ2V0Qm9keSgpLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAqIHRvb2xraXQuY3JlYXRlQnV0dG9uKGZvcm1Db250ZW50LmdldEJvZHkoKSwgJnF1b3Q7Q2hlY2tib3gmcXVvdDssIFNXVC5DSEVDSyk7Ci0gKiA8L3ByZT4KLSAqIAotICogPHA+Ci0gKiBObyBsYXlvdXQgbWFuYWdlciBoYXMgYmVlbiBzZXQgb24gdGhlIGJvZHkuIENsaWVudHMgYXJlIHJlcXVpcmVkIHRvIHNldCB0aGUKLSAqIGRlc2lyZWQgbGF5b3V0IG1hbmFnZXIgZXhwbGljaXRseS4KLSAqIDxwPgotICogQWx0aG91Z2ggdGhlIGNsYXNzIGlzIG5vdCBmaW5hbCwgaXQgc2hvdWxkIG5vdCBiZSBzdWJjbGFzc2VkLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPbGRGb3JtIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcml2YXRlIEZvcm1IZWFkaW5nIGhlYWQ7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgYm9keTsKLQlwcml2YXRlIFNpemVDYWNoZSBib2R5Q2FjaGUgPSBuZXcgU2l6ZUNhY2hlKCk7Ci0JcHJpdmF0ZSBTaXplQ2FjaGUgaGVhZENhY2hlID0gbmV3IFNpemVDYWNoZSgpOwotCXByaXZhdGUgRm9ybVRleHQgc2VsZWN0aW9uVGV4dDsKLQotCXByaXZhdGUgY2xhc3MgRm9ybUxheW91dCBleHRlbmRzIExheW91dCBpbXBsZW1lbnRzIElMYXlvdXRFeHRlbnNpb24gewotCQlwdWJsaWMgaW50IGNvbXB1dGVNaW5pbXVtV2lkdGgoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQlyZXR1cm4gY29tcHV0ZVNpemUoY29tcG9zaXRlLCA1LCBTV1QuREVGQVVMVCwgZmx1c2hDYWNoZSkueDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcHV0ZU1heGltdW1XaWR0aChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJCXJldHVybiBjb21wdXRlU2l6ZShjb21wb3NpdGUsIFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2hDYWNoZSkueDsKLQkJfQotCi0JCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwKLQkJCQlib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJCWlmIChmbHVzaENhY2hlKSB7Ci0JCQkJYm9keUNhY2hlLmZsdXNoKCk7Ci0JCQkJaGVhZENhY2hlLmZsdXNoKCk7Ci0JCQl9Ci0JCQlib2R5Q2FjaGUuc2V0Q29udHJvbChib2R5KTsKLQkJCWhlYWRDYWNoZS5zZXRDb250cm9sKGhlYWQpOwotCi0JCQlpbnQgd2lkdGggPSAwOwotCQkJaW50IGhlaWdodCA9IDA7Ci0JCQkKLQkJCVBvaW50IGhzaXplID0gaGVhZENhY2hlLmNvbXB1dGVTaXplKEZvcm1VdGlsLmdldFdpZHRoSGludCh3SGludCwKLQkJCQkJaGVhZCksIFNXVC5ERUZBVUxUKTsKLQkJCXdpZHRoID0gTWF0aC5tYXgoaHNpemUueCwgd2lkdGgpOwotCQkJaGVpZ2h0ID0gaHNpemUueTsKLQkJCQotCQkJUG9pbnQgYnNpemUgPSBib2R5Q2FjaGUuY29tcHV0ZVNpemUoRm9ybVV0aWwuZ2V0V2lkdGhIaW50KHdIaW50LAotCQkJCQlib2R5KSwgU1dULkRFRkFVTFQpOwotCQkJd2lkdGggPSBNYXRoLm1heChic2l6ZS54LCB3aWR0aCk7Ci0JCQloZWlnaHQgKz0gYnNpemUueTsKLQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQlpZiAoZmx1c2hDYWNoZSkgewotCQkJCWJvZHlDYWNoZS5mbHVzaCgpOwotCQkJCWhlYWRDYWNoZS5mbHVzaCgpOwotCQkJfQotCQkJYm9keUNhY2hlLnNldENvbnRyb2woYm9keSk7Ci0JCQloZWFkQ2FjaGUuc2V0Q29udHJvbChoZWFkKTsKLQkJCVJlY3RhbmdsZSBjYXJlYSA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7CQkJCi0JCQkKLQkJCVBvaW50IGhzaXplID0gaGVhZENhY2hlLmNvbXB1dGVTaXplKGNhcmVhLndpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCQloZWFkQ2FjaGUuc2V0Qm91bmRzKDAsIDAsIGNhcmVhLndpZHRoLCBoc2l6ZS55KTsKLQkJCWJvZHlDYWNoZS5zZXRCb3VuZHMoMCwgaHNpemUueSwgY2FyZWEud2lkdGgsIGNhcmVhLmhlaWdodCAtIGhzaXplLnkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZm9ybSBjb250ZW50IGNvbnRyb2wgYXMgYSBjaGlsZCBvZiB0aGUgcHJvdmlkZWQgcGFyZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgd2lkZ2V0Ci0JICovCi0JcHVibGljIE9sZEZvcm0oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PX0JBQ0tHUk9VTkQgfCBzdHlsZSk7Ci0JCXN1cGVyLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJaGVhZCA9IG5ldyBGb3JtSGVhZGluZyh0aGlzLCBTV1QuTlVMTCk7Ci0JCWhlYWQuc2V0TWVudShwYXJlbnQuZ2V0TWVudSgpKTsKLQkJYm9keSA9IG5ldyBMYXlvdXRDb21wb3NpdGUodGhpcywgU1dULk5VTEwpOwotCQlib2R5LnNldE1lbnUocGFyZW50LmdldE1lbnUoKSk7Ci0JfQotCi0JLyoqCi0JICogUGFzc2VzIHRoZSBtZW51IHRvIHRoZSBmb3JtIGJvZHkuCi0JICogCi0JICogQHBhcmFtIG1lbnUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZW51KE1lbnUgbWVudSkgewotCQlzdXBlci5zZXRNZW51KG1lbnUpOwotCQloZWFkLnNldE1lbnUobWVudSk7Ci0JCWJvZHkuc2V0TWVudShtZW51KTsKLQl9Ci0KLQkvKioKLQkgKiBGdWxseSBkZWxlZ2F0ZXMgdGhlIHNpemUgY29tcHV0YXRpb24gdG8gdGhlIGludGVybmFsIGxheW91dCBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBmaW5hbCBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JCXJldHVybiAoKEZvcm1MYXlvdXQpIGdldExheW91dCgpKS5jb21wdXRlU2l6ZSh0aGlzLCB3SGludCwgaEhpbnQsCi0JCQkJY2hhbmdlZCk7Ci0JfQotCi0JLyoqCi0JICogUHJldmVudHMgZnJvbSBjaGFuZ2luZyB0aGUgY3VzdG9tIGNvbnRyb2wgbGF5b3V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldExheW91dChMYXlvdXQgbGF5b3V0KSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGl0bGUgdGV4dCB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgYXQgdGhlIHRvcCBvZiB0aGUgZm9ybS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aXRsZSB0ZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gaGVhZC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGl0bGUgaW1hZ2UgdGhhdCB3aWxsIGJlIHJlbmRlcmVkIHRvIHRoZSBsZWZ0IG9mIHRoZSB0aXRsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aXRsZSBpbWFnZQotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBoZWFkLmdldEltYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgZm9ybS4gVGhpcyBjb2xvciB3aWxsIGFsc28gYmUgdXNlZCBmb3IKLQkgKiB0aGUgYm9keS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIGZnKSB7Ci0JCXN1cGVyLnNldEZvcmVncm91bmQoZmcpOwotCQloZWFkLnNldEZvcmVncm91bmQoZmcpOwotCQlib2R5LnNldEZvcmVncm91bmQoZmcpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGZvcm0uIFRoaXMgY29sb3Igd2lsbCBhbHNvIGJlIHVzZWQgZm9yCi0JICogdGhlIGJvZHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBiZykgewotCQlzdXBlci5zZXRCYWNrZ3JvdW5kKGJnKTsKLQkJaGVhZC5zZXRCYWNrZ3JvdW5kKGJnKTsKLQkJYm9keS5zZXRCYWNrZ3JvdW5kKGJnKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBvZiB0aGUgaGVhZGVyIHRleHQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udChGb250IGZvbnQpIHsKLQkJc3VwZXIuc2V0Rm9udChmb250KTsKLQkJaGVhZC5zZXRGb250KGZvbnQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRleHQgdG8gYmUgcmVuZGVyZWQgYXQgdGhlIHRvcCBvZiB0aGUgZm9ybSBhYm92ZSB0aGUgYm9keSBhcyBhCi0JICogdGl0bGUuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQloZWFkLnNldFRleHQodGV4dCk7Ci0JCWxheW91dCgpOwotCQlyZWRyYXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSB0byBiZSByZW5kZXJlZCB0byB0aGUgbGVmdCBvZiB0aGUgdGl0bGUuCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgdGl0bGUgaW1hZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gc2hvdyBubyBpbWFnZS4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJaGVhZC5zZXRJbWFnZShpbWFnZSk7Ci0JCWxheW91dCgpOwotCQlyZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0QmFja2dyb3VuZChDb2xvcltdIGdyYWRpZW50Q29sb3JzLCBpbnRbXSBwZXJjZW50cywKLQkJCWJvb2xlYW4gdmVydGljYWwpIHsKLQkJaGVhZC5zZXRUZXh0QmFja2dyb3VuZChncmFkaWVudENvbG9ycywgcGVyY2VudHMsIHZlcnRpY2FsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCBiYWNrZ3JvdW5kIGltYWdlIG9mIHRoaXMgZm9ybS4gVGhlIGltYWdlIGlzIHJlbmRlcmVkCi0JICogc3RhcnRpbmcgYXQgdGhlIHBvc2l0aW9uIDAsMCBhbmQgaXMgcGFpbnRlZCBiZWhpbmQgdGhlIHRpdGxlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYmFja2dyb3VuZCBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0QmFja2dyb3VuZEltYWdlKCkgewotCQlyZXR1cm4gaGVhZC5nZXRCYWNrZ3JvdW5kSW1hZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvcHRpb25hbCBiYWNrZ3JvdW5kIGltYWdlIHRvIGJlIHJlbmRlcmVkIGJlaGluZCB0aGUgdGl0bGUKLQkgKiBzdGFydGluZyBhdCB0aGUgcG9zaXRpb24gMCwwLgotCSAqIAotCSAqIEBwYXJhbSBiYWNrZ3JvdW5kSW1hZ2UKLQkgKiAgICAgICAgICAgIFRoZSBiYWNrZ3JvdW5kSW1hZ2UgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRJbWFnZShJbWFnZSBiYWNrZ3JvdW5kSW1hZ2UpIHsKLQkJaGVhZC5zZXRCYWNrZ3JvdW5kSW1hZ2UoYmFja2dyb3VuZEltYWdlKTsKLQkJcmVkcmF3KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9vbCBiYXIgbWFuYWdlciB0aGF0IGlzIHVzZWQgdG8gbWFuYWdlIHRvb2wgaXRlbXMgaW4gdGhlCi0JICogZm9ybSdzIHRpdGxlIGFyZWEuCi0JICogCi0JICogQHJldHVybiBmb3JtIHRvb2wgYmFyIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSVRvb2xCYXJNYW5hZ2VyIGdldFRvb2xCYXJNYW5hZ2VyKCkgewotCQlyZXR1cm4gaGVhZC5nZXRUb29sQmFyTWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGxvY2FsIHRvb2wgYmFyIG1hbmFnZXIgaWYgdXNlZC4gRG9lcyBub3RoaW5nIGlmIGxvY2FsIHRvb2wKLQkgKiBiYXIgbWFuYWdlciBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVG9vbEJhcigpIHsKLQkJaGVhZC51cGRhdGVUb29sQmFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGFpbmVyIHRoYXQgb2NjdXBpZXMgdGhlIGJvZHkgb2YgdGhlIGZvcm0gKHRoZSBmb3JtIGFyZWEKLQkgKiBiZWxvdyB0aGUgdGl0bGUpLiBVc2UgdGhpcyBjb250YWluZXIgYXMgYSBwYXJlbnQgZm9yIHRoZSBjb250cm9scyB0aGF0Ci0JICogc2hvdWxkIGJlIGluIHRoZSBmb3JtLiBObyBsYXlvdXQgbWFuYWdlciBoYXMgYmVlbiBzZXQgb24gdGhlIGZvcm0gYm9keS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGJvZHkgb2YgdGhlIGZvcm0uCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBnZXRCb2R5KCkgewotCQlyZXR1cm4gYm9keTsKLQl9Ci0JLyoqCi0JICogVE9ETyBhZGQgamF2YWRvYwotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYmFja2dyb3VuZEltYWdlVGlsZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCYWNrZ3JvdW5kSW1hZ2VUaWxlZCgpIHsKLQkJcmV0dXJuIGhlYWQuaXNCYWNrZ3JvdW5kSW1hZ2VUaWxlZCgpOwotCX0KLQotCS8qKgotCSAqIFRPRE8gYWRkIGphdmFkb2MKLQkgKiAKLQkgKiBAcGFyYW0gYmFja2dyb3VuZEltYWdlVGlsZWQKLQkgKiAgICAgICAgICAgIFRoZSBiYWNrZ3JvdW5kSW1hZ2VUaWxlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZEltYWdlVGlsZWQoYm9vbGVhbiBiYWNrZ3JvdW5kSW1hZ2VUaWxlZCkgewotCQloZWFkLnNldEJhY2tncm91bmRJbWFnZVRpbGVkKGJhY2tncm91bmRJbWFnZVRpbGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGJhY2tncm91bmRJbWFnZUFsaWdubWVudC4gVE9ETyBhZGQgamF2YWRvYwotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgaW50IGdldEJhY2tncm91bmRJbWFnZUFsaWdubWVudCgpIHsKLQkJcmV0dXJuIGhlYWQuZ2V0QmFja2dyb3VuZEltYWdlQWxpZ25tZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhY2tncm91bmRJbWFnZUFsaWdubWVudAotCSAqICAgICAgICAgICAgVGhlIGJhY2tncm91bmRJbWFnZUFsaWdubWVudCB0byBzZXQuIFRPRE8gYWRkIGphdmFkb2MKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZEltYWdlQWxpZ25tZW50KGludCBiYWNrZ3JvdW5kSW1hZ2VBbGlnbm1lbnQpIHsKLQkJaGVhZC5zZXRCYWNrZ3JvdW5kSW1hZ2VBbGlnbm1lbnQoYmFja2dyb3VuZEltYWdlQWxpZ25tZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGJhY2tncm91bmRJbWFnZUNsaXBwZWQuCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmFja2dyb3VuZEltYWdlQ2xpcHBlZCgpIHsKLQkJcmV0dXJuIGhlYWQuaXNCYWNrZ3JvdW5kSW1hZ2VDbGlwcGVkKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhY2tncm91bmRJbWFnZUNsaXBwZWQKLQkgKiAgICAgICAgICAgIFRoZSBiYWNrZ3JvdW5kSW1hZ2VDbGlwcGVkIHRvIHNldC4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZEltYWdlQ2xpcHBlZChib29sZWFuIGJhY2tncm91bmRJbWFnZUNsaXBwZWQpIHsKLQkJaGVhZC5zZXRCYWNrZ3JvdW5kSW1hZ2VDbGlwcGVkKGJhY2tncm91bmRJbWFnZUNsaXBwZWQpOwotCX0KLQotCXZvaWQgc2V0U2VsZWN0aW9uVGV4dChGb3JtVGV4dCB0ZXh0KSB7Ci0JCWlmIChzZWxlY3Rpb25UZXh0ICE9IG51bGwgJiYgc2VsZWN0aW9uVGV4dCAhPSB0ZXh0KSB7Ci0JCQlzZWxlY3Rpb25UZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zZWxlY3Rpb25UZXh0ID0gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBUT0RPIGFkZCBqYXZhZG9jIGV4cGVyaW1lbnRhbCAtIGRvIG5vdCB1c2UgeWV0Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB2aXNpYmxlIHNlcGFyYXRvciwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcGFyYXRvclZpc2libGUoKSB7Ci0JCXJldHVybiBoZWFkLmlzU2VwYXJhdG9yVmlzaWJsZSgpOwotCX0KLQotCS8qKgotCSAqIGV4cGVyaW1lbnRhbCAtIGRvIG5vdCB1c2UgeWV0IFRPRE8gYWRkIGphdmFkb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3JWaXNpYmxlKGJvb2xlYW4gYWRkU2VwYXJhdG9yKSB7Ci1oZWFkLnNldFNlcGFyYXRvclZpc2libGUoYWRkU2VwYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBleHBlcmltZW50YWwgLSBkbyBub3QgdXNlIHlldCBUT0RPIGFkZCBqYXZhZG9jCi0JICovCi0KLQlwdWJsaWMgQ29sb3IgZ2V0U2VwYXJhdG9yQ29sb3IoKSB7Ci0JCXJldHVybiBoZWFkLmdldFNlcGFyYXRvckNvbG9yKCk7Ci0JfQotCi0JLyoqCi0JICogZXhwZXJpbWVudGFsIC0gZG8gbm90IHVzZSB5ZXQgVE9ETyBhZGQgamF2YWRvYwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcGFyYXRvckNvbG9yKENvbG9yIHNlcGFyYXRvckNvbG9yKSB7Ci0JCWhlYWQuc2V0U2VwYXJhdG9yQ29sb3Ioc2VwYXJhdG9yQ29sb3IpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1lc3NhZ2UgZm9yIHRoaXMgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNsZWFyIHRoZSBtZXNzYWdlCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaGVhZC5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1lc3NhZ2UgZm9yIHRoaXMgZm9ybSB3aXRoIGFuIGluZGljYXRpb24gb2Ygd2hhdCB0eXBlIG9mIG1lc3NhZ2UKLQkgKiBpdCBpcy4KLQkgKiA8cD4KLQkgKiBUaGUgdmFsaWQgbWVzc2FnZSB0eXBlcyBhcmUgb25lIG9mIDxjb2RlPk5PTkU8L2NvZGU+LAotCSAqIDxjb2RlPklORk9STUFUSU9OPC9jb2RlPiw8Y29kZT5XQVJOSU5HPC9jb2RlPiwgb3IKLQkgKiA8Y29kZT5FUlJPUjwvY29kZT4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBuZXdNZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gY2xlYXIgdGhlIG1lc3NhZ2UKLQkgKiBAcGFyYW0gbmV3VHlwZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdHlwZQotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UsIGludCBuZXdUeXBlKSB7Ci0JCWhlYWQuc2V0TWVzc2FnZShuZXdNZXNzYWdlLCBuZXdUeXBlKTsKLQl9Ci0JLyoqCi0JICogVGVzdHMgaWYgdGhlIGZvcm0gaXMgaW4gdGhlICdidXN5JyBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGJ1c3ksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0J1c3koKSB7Ci0JCXJldHVybiBoZWFkLmlzQnVzeSgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcm0ncyBidXN5IHN0YXRlLiBCdXN5IGZvcm0gd2lsbCBkaXNwbGF5ICdidXN5JyBhbmltYXRpb24gaW4KLQkgKiB0aGUgYXJlYSBvZiB0aGUgdGl0bGUgaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIGJ1c3kKLQkgKiAgICAgICAgICAgIHRoZSBmb3JtJ3MgYnVzeSBzdGF0ZQotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0QnVzeShib29sZWFuIGJ1c3kpIHsKLQkJaGVhZC5zZXRCdXN5KGJ1c3kpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1Njcm9sbGVkRm9ybS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9TY3JvbGxlZEZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0ZWI2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1Njcm9sbGVkRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotLyoqCi0gKiBTY3JvbGxlZEZvcm0gaXMgYSBjb250cm9sIHRoYXQgaXMgY2FwYWJsZSBvZiBzY3JvbGxpbmcgYW4gaW5zdGFuY2Ugb2YgdGhlCi0gKiBGb3JtIGNsYXNzLiBJdCBzaG91bGQgYmUgY3JlYXRlZCBpbiBhIHBhcmVudCB0aGF0IHdpbGwgYWxsb3cgaXQgdG8gdXNlIGFsbAotICogdGhlIGF2YWlsYWJsZSBhcmVhIChmb3IgZXhhbXBsZSwgYSBzaGVsbCwgYSB2aWV3IG9yIGFuIGVkaXRvcikuCi0gKiA8cD4KLSAqIENoaWxkcmVuIG9mIHRoZSBmb3JtIHNob3VsZCB0eXBpY2FsbHkgYmUgY3JlYXRlZCB1c2luZyBGb3JtVG9vbGtpdCB0byBtYXRjaAotICogdGhlIGFwcGVhcmFuY2UgYW5kIGJlaGF2aW91ci4gV2hlbiBjcmVhdGluZyBjaGlsZHJlbiwgdXNlIGEgZm9ybSBib2R5IGFzIGEKLSAqIHBhcmVudCBieSBjYWxsaW5nICdnZXRCb2R5KCknIG9uIHRoZSBmb3JtIGluc3RhbmNlLiBFeGFtcGxlOgotICogCi0gKiA8cHJlPgotICogIEZvcm1Ub29sa2l0IHRvb2xraXQgPSBuZXcgRm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0gKiAgU2Nyb2xsZWRGb3JtIGZvcm0gPSB0b29sa2l0LmNyZWF0ZVNjcm9sbGVkRm9ybShwYXJlbnQpOwotICogIGZvcm0uc2V0VGV4dCgmcXVvdDtTYW1wbGUgZm9ybSZxdW90Oyk7Ci0gKiAgZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICogIHRvb2xraXQuY3JlYXRlQnV0dG9uKGZvcm0uZ2V0Qm9keSgpLCAmcXVvdDtDaGVja2JveCZxdW90OywgU1dULkNIRUNLKTsKLSAqIDwvcHJlPgotICogCi0gKiA8cD4KLSAqIE5vIGxheW91dCBtYW5hZ2VyIGhhcyBiZWVuIHNldCBvbiB0aGUgYm9keS4gQ2xpZW50cyBhcmUgcmVxdWlyZWQgdG8gc2V0IHRoZQotICogZGVzaXJlZCBsYXlvdXQgbWFuYWdlciBleHBsaWNpdGx5LgotICo8cD5BbHRob3VnaCB0aGUgY2xhc3MgaXMgbm90IGZpbmFsLCBpdCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUKLSAqIGJlIGV4dGVuZGVkLiAKLSAqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTY3JvbGxlZEZvcm0gZXh0ZW5kcyBTaGFyZWRTY3JvbGxlZENvbXBvc2l0ZSB7Ci0JcHJpdmF0ZSBGb3JtIGNvbnRlbnQ7Ci0JcHVibGljIFNjcm9sbGVkRm9ybShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmb3JtIGNvbnRyb2wgYXMgYSBjaGlsZCBvZiB0aGUgcHJvdmlkZWQgcGFyZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgd2lkZ2V0Ci0JICovCi0JcHVibGljIFNjcm9sbGVkRm9ybShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXN1cGVyLnNldE1lbnUocGFyZW50LmdldE1lbnUoKSk7Ci0JCWNvbnRlbnQgPSBuZXcgRm9ybSh0aGlzLCBTV1QuTlVMTCk7Ci0JCXN1cGVyLnNldENvbnRlbnQoY29udGVudCk7Ci0JCWNvbnRlbnQuc2V0TWVudShnZXRNZW51KCkpOwotCX0KLS8qKgotICogUGFzc2VzIHRoZSBtZW51IHRvIHRoZSBib2R5LgotICogQHBhcmFtIG1lbnUKLSAqLwotCXB1YmxpYyB2b2lkIHNldE1lbnUoTWVudSBtZW51KSB7Ci0JCXN1cGVyLnNldE1lbnUobWVudSk7Ci0JCWlmIChjb250ZW50IT1udWxsKSAKLQkJCWNvbnRlbnQuc2V0TWVudShtZW51KTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdGl0bGUgdGV4dCB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgYXQgdGhlIHRvcCBvZiB0aGUgZm9ybS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aXRsZSB0ZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gY29udGVudC5nZXRUZXh0KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIGltYWdlIHRoYXQgd2lsbCBiZSByZW5kZXJlZCB0byB0aGUgbGVmdCBvZiB0aGUgdGl0bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgdGl0bGUgaW1hZ2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBjb250ZW50LmdldEltYWdlKCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIGZvcm0uIFRoaXMgY29sb3Igd2lsbCBhbHNvIGJlIHVzZWQgZm9yCi0JICogdGhlIGJvZHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChDb2xvciBmZykgewotCQlzdXBlci5zZXRGb3JlZ3JvdW5kKGZnKTsKLQkJY29udGVudC5zZXRGb3JlZ3JvdW5kKGZnKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgZm9ybS4gVGhpcyBjb2xvciB3aWxsIGFsc28gYmUgdXNlZCBmb3IKLQkgKiB0aGUgYm9keS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKENvbG9yIGJnKSB7Ci0JCXN1cGVyLnNldEJhY2tncm91bmQoYmcpOwotCQljb250ZW50LnNldEJhY2tncm91bmQoYmcpOwotCX0KLQkvKioKLQkgKiBUaGUgZm9ybSBzZXRzIHRoZSBjb250ZW50IHdpZGdldC4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkKLQkgKiBjbGFzc2VzIHRoYXQgaW5zdGFudGlhdGUgdGhpcyB3aWRnZXQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q29udGVudChDb250cm9sIGMpIHsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgdGV4dCB0byBiZSByZW5kZXJlZCBhdCB0aGUgdG9wIG9mIHRoZSBmb3JtIGFib3ZlIHRoZSBib2R5IGFzIGEKLQkgKiB0aXRsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIHRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWNvbnRlbnQuc2V0VGV4dCh0ZXh0KTsKLQkJcmVmbG93KHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSB0byBiZSByZW5kZXJlZCB0byB0aGUgbGVmdCBvZiB0aGUgdGl0bGUuCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgdGl0bGUgaW1hZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIGltYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCWNvbnRlbnQuc2V0SW1hZ2UoaW1hZ2UpOwotCQlyZWZsb3codHJ1ZSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9wdGlvbmFsIGJhY2tncm91bmQgaW1hZ2Ugb2YgdGhpcyBmb3JtLiBUaGUgaW1hZ2UgaXMKLQkgKiByZW5kZXJlZCBzdGFydGluZyBhdCB0aGUgcG9zaXRpb24gMCwwIGFuZCBpcyBwYWludGVkIGJlaGluZCB0aGUgdGl0bGUuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBiYWNrZ3JvdW5kIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRCYWNrZ3JvdW5kSW1hZ2UoKSB7Ci0JCXJldHVybiBjb250ZW50LmdldEJhY2tncm91bmRJbWFnZSgpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBvcHRpb25hbCBiYWNrZ3JvdW5kIGltYWdlIHRvIGJlIHJlbmRlcmVkIGJlaGluZCB0aGUgdGl0bGUKLQkgKiBzdGFydGluZyBhdCB0aGUgcG9zaXRpb24gMCwwLgotCSAqIAotCSAqIEBwYXJhbSBiYWNrZ3JvdW5kSW1hZ2UKLQkgKiAgICAgICAgICAgIFRoZSBiYWNrZ3JvdW5kSW1hZ2UgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRJbWFnZShJbWFnZSBiYWNrZ3JvdW5kSW1hZ2UpIHsKLQkJY29udGVudC5zZXRCYWNrZ3JvdW5kSW1hZ2UoYmFja2dyb3VuZEltYWdlKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9vbCBiYXIgbWFuYWdlciB0aGF0IGlzIHVzZWQgdG8gbWFuYWdlIHRvb2wgaXRlbXMgaW4gdGhlCi0JICogZm9ybSdzIHRpdGxlIGFyZWEuCi0JICogCi0JICogQHJldHVybiBmb3JtIHRvb2wgYmFyIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSVRvb2xCYXJNYW5hZ2VyIGdldFRvb2xCYXJNYW5hZ2VyKCkgewotCQlyZXR1cm4gY29udGVudC5nZXRUb29sQmFyTWFuYWdlcigpOwotCX0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBsb2NhbCB0b29sIGJhciBtYW5hZ2VyIGlmIHVzZWQuIERvZXMgbm90aGluZyBpZiBsb2NhbCB0b29sCi0JICogYmFyIG1hbmFnZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xCYXIoKSB7Ci0JCWNvbnRlbnQudXBkYXRlVG9vbEJhcigpOwotCX0KLQkvKioKLQkgKiBSZWNvbXB1dGVzIHRoZSBib2R5IGxheW91dCBhbmQgZm9ybSBzY3JvbGwgYmFycy4gVGhlIG1ldGhvZCBzaG91bGQgYmUKLQkgKiB1c2VkIHdoZW4gY2hhbmdlcyBzb21ld2hlcmUgaW4gdGhlIGZvcm0gYm9keSBpbnZhbGlkYXRlIHRoZSBjdXJyZW50Ci0JICogbGF5b3V0IGFuZC9vciBzY3JvbGwgYmFycy4KLQkgKiAKLQkgKiBAcGFyYW0gZmx1c2hDYWNoZQotCSAqICAgICAgICAgICAgaWYgPHNhbXA+dHJ1ZSA8L3NhbXA+LCBkcm9wIGFueSBjYWNoZWQgbGF5b3V0IGluZm9ybWF0aW9uIGFuZAotCSAqICAgICAgICAgICAgY29tcHV0ZSBuZXcgb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZmxvdyhib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJLy9jb250ZW50LmdldEJvZHkoKS5sYXlvdXQoKTsKLQkJLy9jb250ZW50LmxheW91dCgpOwotCQlzdXBlci5yZWZsb3coZmx1c2hDYWNoZSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRhaW5lciB0aGF0IG9jY3VwaWVzIHRoZSBib2R5IG9mIHRoZSBmb3JtICh0aGUgZm9ybSBhcmVhCi0JICogYmVsb3cgdGhlIHRpdGxlKS4gVXNlIHRoaXMgY29udGFpbmVyIGFzIGEgcGFyZW50IGZvciB0aGUgY29udHJvbHMgdGhhdAotCSAqIHNob3VsZCBiZSBpbiB0aGUgZm9ybS4gTm8gbGF5b3V0IG1hbmFnZXIgaGFzIGJlZW4gc2V0IG9uIHRoZSBmb3JtIGJvZHkuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoZSBmb3JtLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Qm9keSgpIHsKLQkJcmV0dXJuIGNvbnRlbnQuZ2V0Qm9keSgpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiB0aGUgZm9ybSBvd25lZCBieSB0aGUgc2Nyb2xsZWQgZm9ybS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb3JtIGluc3RhbmNlCi0JICovCi0JcHVibGljIEZvcm0gZ2V0Rm9ybSgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9TY3JvbGxlZEZvcm1UZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1Njcm9sbGVkRm9ybVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0MTFkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1Njcm9sbGVkRm9ybVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0czsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0vKioKLSAqIFNjcm9sbGVkRm9ybVRleHQgaXMgYSBjb250cm9sIHRoYXQgaXMgY2FwYWJsZSBvZiBzY3JvbGxpbmcgYW4gaW5zdGFuY2Ugb2YKLSAqIHRoZSBGb3JtVGV4dCBjbGFzcy4gSXQgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gYSBwYXJlbnQgdGhhdCB3aWxsIGFsbG93IGl0IHRvCi0gKiB1c2UgYWxsIHRoZSBhdmFpbGFibGUgYXJlYSAoZm9yIGV4YW1wbGUsIGEgc2hlbGwsIGEgdmlldyBvciBhbiBlZGl0b3IpLiBUaGUKLSAqIGZvcm0gdGV4dCBjYW4gYmUgY3JlYXRlZCBieSB0aGUgY2xhc3MgaXRzZWxmLCBvciBzZXQgZnJvbSBvdXRzaWRlLiBJbiB0aGUKLSAqIGxhdGVyIGNhc2UsIHRoZSBmb3JtIHRleHQgaW5zdGFuY2UgbXVzdCBiZSBhIGRpcmVjdCBjaGlsZCBvZiB0aGUKLSAqIFNjcm9sbGVkRm9ybVRleHQgaW5zdGFuY2UuCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyBhc3N1bWVzIHRoYXQgdGV4dCB0byBiZSByZW5kZXJlZCBjb250YWlucyBmb3JtYXR0aW5nIHRhZ3MuIEluIGNhc2UKLSAqIG9mIGEgc3RyaW5nLCBpdCB3aWxsIGVuY2xvc2UgdGhlIHRleHQgaW4gJ2Zvcm0nIHJvb3QgZWxlbWVudCBpZiBtaXNzaW5nIGZyb20KLSAqIHRoZSB0ZXh0IGFzIGEgY29udmluaWVuY2UuIEZvciBleGFtcGxlOgotICogCi0gKiA8cHJlPgotICogIGZ0ZXh0LnNldFRleHQoJnF1b3Q7Jmx0O3AmZ3Q7U29tZSB0ZXh0IGhlcmUmbHQ7LyZndDsmcXVvdDspOwotICogPC9wcmU+Ci0gKiAKLSAqIHdpbGwgbm90IGNhdXNlIGFuIGVycm9yLiBUaGUgc2FtZSBiZWhhdmlvciBkb2VzIG5vdCBleGlzdCBmb3IgY29udGVudCBmcm9tCi0gKiB0aGUgaW5wdXQgc3RyZWFtLCBob3dldmVyIC0gaXQgbXVzdCBiZSB3ZWxsIGZvcm1lZCBpbiB0aGF0IGNhc2UuCi0gKiA8L3A+Ci0KLSAqIEBzaW5jZSAzLjAKLSAqIEBzZWUgRm9ybVRleHQKLSAqLwotcHVibGljIGNsYXNzIFNjcm9sbGVkRm9ybVRleHQgZXh0ZW5kcyBTaGFyZWRTY3JvbGxlZENvbXBvc2l0ZSB7Ci0JcHJpdmF0ZSBGb3JtVGV4dCBjb250ZW50OwotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbmV3IHNjcm9sbGVkIHRleHQgaW5zdGFuY2UgaW4gdGhlIHByb3ZpZGVkIHBhcmVudAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNyZWF0ZUZvcm1UZXh0Ci0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZW5jbG9zaW5nIGZvcm0gdGV4dCBpbnN0YW5jZSB3aWxsIGJlCi0JICogICAgICAgICAgICBjcmVhdGVkIGluIHRoaXMgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFNjcm9sbGVkRm9ybVRleHQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjcmVhdGVGb3JtVGV4dCkgewotCQl0aGlzKHBhcmVudCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMLCBjcmVhdGVGb3JtVGV4dCk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG5ldyBzY3JvbGxlZCB0ZXh0IGluc3RhbmNlIGluIHRoZSBwcm92aWRlZCBwYXJlbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIHRvIHBhc3MgdG8gdGhlIHNjcm9sbGVkIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjcmVhdGVGb3JtVGV4dAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGVuY2xvc2luZyBmb3JtIHRleHQgaW5zdGFuY2Ugd2lsbCBiZQotCSAqICAgICAgICAgICAgY3JlYXRlZCBpbiB0aGlzIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTY3JvbGxlZEZvcm1UZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgYm9vbGVhbiBjcmVhdGVGb3JtVGV4dCkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJaWYgKGNyZWF0ZUZvcm1UZXh0KQotCQkJc2V0Rm9ybVRleHQobmV3IEZvcm1UZXh0KHRoaXMsIFNXVC5OVUxMKSk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGZvcm0gdGV4dCB0byBiZSBtYW5hZ2VkIGJ5IHRoaXMgc2Nyb2xsZWQgZm9ybSB0ZXh0LiBUaGUKLQkgKiBpbnN0YW5jZSBtdXN0IGJlIGEgZGlyZWN0IGNoaWxkIG9mIHRoaXMgY2xhc3MuIElmIHRoaXMgbWV0aG9kIGlzIHVzZWQsCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG11c3QgYmUgcGFzc2VkIGluIGVpdGhlciBvZiB0aGUgY29uc3RydWN0b3JzIHRvCi0JICogYXZvaWQgY3JlYXRpbmcgZm9ybSB0ZXh0IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBmb3JtVGV4dAotCSAqICAgICAgICAgICAgdGhlIGZvcm0gdGV4dCBpbnN0YW5jZSB0byB1c2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9ybVRleHQoRm9ybVRleHQgZm9ybVRleHQpIHsKLQkJdGhpcy5jb250ZW50ID0gZm9ybVRleHQ7Ci0JCXN1cGVyLnNldENvbnRlbnQoY29udGVudCk7Ci0JCWNvbnRlbnQuc2V0TWVudShnZXRNZW51KCkpOwotCQlpZiAodGV4dCAhPSBudWxsKQotCQkJbG9hZFRleHQodGV4dCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIHNjcm9sbGVkIGZvcm0gdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gZmcKLQkgKiAgICAgICAgICAgIHRoZSBmb3JlZ3JvdW5kIGNvbG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChDb2xvciBmZykgewotCQlzdXBlci5zZXRGb3JlZ3JvdW5kKGZnKTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCWNvbnRlbnQuc2V0Rm9yZWdyb3VuZChmZyk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHNjcm9sbGVkIGZvcm0gdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gYmcKLQkgKiAgICAgICAgICAgIHRoZSBiYWNrZ3JvdW5kIGNvbG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBiZykgewotCQlzdXBlci5zZXRCYWNrZ3JvdW5kKGJnKTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCWNvbnRlbnQuc2V0QmFja2dyb3VuZChiZyk7Ci0JfQotCS8qKgotCSAqIFRoZSBjbGFzcyBzZXRzIHRoZSBjb250ZW50IHdpZGdldC4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkKLQkgKiBjbGFzc2VzIHRoYXQgaW5zdGFudGlhdGUgdGhpcyB3aWRnZXQuCi0JICogCi0JICogQHBhcmFtIGMKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgY29udHJvbAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldENvbnRlbnQoQ29udHJvbCBjKSB7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHRleHQgdG8gYmUgcmVuZGVyZWQgaW4gdGhlIHNjcm9sbGVkIGZvcm0gdGV4dC4gVGhlIHRleHQgbXVzdAotCSAqIGNvbnRhaW4gZm9ybWF0dGluZyB0YWdzLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB0byBiZSByZW5kZXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJbG9hZFRleHQodGV4dCk7Ci0JCXJlZmxvdyh0cnVlKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudHMgdG8gcmVuZGVyZWQgaW4gdGhlIHNjcm9sbGVkIGZvcm0gdGV4dC4gVGhlIHN0cmVhbSBtdXN0Ci0JICogY29udGFpbiBmb3JtYXR0aW5nIHRhZ3MuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIGlucHV0Ci0JICogc3RyZWFtLiBUaGUgY2FsbCBtYXkgYmUgbG9uZyBydW5uaW5nLiBGb3IgYmVzdCByZXN1bHRzLCBjYWxsIHRoaXMgbWV0aG9kCi0JICogZnJvbSBhbm90aGVyIHRocmVhZCBhbmQgY2FsbCAncmVmbG93JyB3aGVuIGRvbmUgKGJ1dCBtYWtlIGJvdGggY2FsbHMKLQkgKiB1c2luZyAnRGlzcGxheS5hc3luY0V4ZWMnIGJlY2F1c2UgdGhlc2UgY2FsbHMgbXVzdCBiZSBtYWRlIGluIHRoZSBldmVudAotCSAqIGRpc3BhdGNoaW5nIHRocmVhZCkuCi0JICogCi0JICogQHBhcmFtIGlzCi0JICogICAgICAgICAgICBjb250ZW50IGlucHV0IHN0cmVhbQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRzKElucHV0U3RyZWFtIGlzKSB7Ci0JCWxvYWRDb250ZW50cyhpcyk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoZSBmb3JtIHRleHQuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9ybSB0ZXh0IGluc3RhbmNlCi0JICovCi0JcHVibGljIEZvcm1UZXh0IGdldEZvcm1UZXh0KCkgewotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGxvYWRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBtYXJrdXAgPSB0ZXh0OwotCQkJaWYgKCFtYXJrdXAuc3RhcnRzV2l0aCgiPGZvcm0+IikpIC8vJE5PTi1OTFMtMSQKLQkJCQltYXJrdXAgPSAiPGZvcm0+IiArIHRleHQgKyAiPC9mb3JtPiI7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJY29udGVudC5zZXRUZXh0KG1hcmt1cCwgdHJ1ZSwgZmFsc2UpOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBsb2FkQ29udGVudHMoSW5wdXRTdHJlYW0gaXMpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJY29udGVudC5zZXRDb250ZW50cyhpcywgZmFsc2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9TY3JvbGxlZFBhZ2VCb29rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1Njcm9sbGVkUGFnZUJvb2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxN2E4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1Njcm9sbGVkUGFnZUJvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5XcmFwcGVkUGFnZUJvb2s7Ci0vKioKLSAqIFNjcm9sbGVkUGFnZUJvb2sgaXMgYSBjbGFzcyB0aGF0IGlzIGNhcGFibGUgb2Ygc3RhY2tpbmcgc2V2ZXJhbCBjb21wb3NpdGVzCi0gKiAocGFnZXMpLCB3aGlsZSBzaG93aW5nIG9uZSBhdCBhIHRpbWUuIFRoZSBjb250ZW50IGlzIHNjcm9sbGVkIGlmIHRoZXJlIGlzCi0gKiBub3QgZW5vdWdoIHNwYWNlIHRvIGZpdCBpdCBpbiB0aGUgY2xpZW50IGFyZWEuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFNjcm9sbGVkUGFnZUJvb2sgZXh0ZW5kcyBTaGFyZWRTY3JvbGxlZENvbXBvc2l0ZSB7Ci0JcHJpdmF0ZSBXcmFwcGVkUGFnZUJvb2sgcGFnZUJvb2s7Ci0JcHJpdmF0ZSBIYXNodGFibGUgcGFnZXM7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgZW1wdHlQYWdlOwotCXByaXZhdGUgQ29udHJvbCBjdXJyZW50UGFnZTsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGluIHRoZSBwcm92aWRlZCBwYXJlbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIFNjcm9sbGVkUGFnZUJvb2soQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBpbiB0aGUgcHJvdmlkZWQgcGFyZW50IGFuZCB3aXRoIHRoZSBwcm92aWRlZAotCSAqIHN0eWxlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb250cm9sIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIHRvIHVzZQotCSAqLwotCXB1YmxpYyBTY3JvbGxlZFBhZ2VCb29rKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJcGFnZUJvb2sgPSBuZXcgV3JhcHBlZFBhZ2VCb29rKHRoaXMsIFNXVC5OVUxMKTsKLQkJc2V0Q29udGVudChwYWdlQm9vayk7Ci0JCXBhZ2VzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlzZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCQlzZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkJdGhpcy5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRSA6Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTiA6Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9ORVhUIDoKLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTIDoKLQkJCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBkZWZhdWx0IHNpemUgb2YgdGhlIGNvbXBvc2l0ZSwgYWxsb3dpbmcgdGhlIGNvbnRyb2wgdG8KLQkgKiBzaHJpbmsgdG8gdGhlIHRyaW0uCi0JICogCi0JICogQHBhcmFtIHdIaW50Ci0JICogICAgICAgICAgICB0aGUgd2lkdGggaGludAotCSAqIEBwYXJhbSBoSGludAotCSAqICAgICAgICAgICAgdGhlIGhlaWdodCBoaW50Ci0JICogQHBhcmFtIGNoYW5nZWQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBkbyBub3QgdXNlIGNhY2hlZCB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQlSZWN0YW5nbGUgdHJpbSA9IGNvbXB1dGVUcmltKDAsIDAsIDEwLCAxMCk7Ci0JCXJldHVybiBuZXcgUG9pbnQodHJpbS53aWR0aCwgdHJpbS5oZWlnaHQpOwotCX0KLQkvKioKLQkgKiBUZXN0cyBpZiB0aGUgcGFnZSB1bmRlciB0aGUgcHJvdmlkZWQga2V5IGlzIGN1cnJlbnRseSBpbiB0aGUgYm9vay4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgcGFnZSBrZXkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBhZ2UgZXhpc3RzLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQYWdlKE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIHBhZ2VzLmNvbnRhaW5zS2V5KGtleSk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcGFnZSBmb3IgdGhlIHByb3ZpZGVkIGtleS4gVXNlIHRoZSByZXR1cm5lZCBjb21wb3NpdGUgdG8KLQkgKiBjcmVhdGUgY2hpbGRyZW4gaW4gaXQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIHBhZ2Uga2V5Ci0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBwYWdlIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlUGFnZShPYmplY3Qga2V5KSB7Ci0JCUNvbXBvc2l0ZSBwYWdlID0gY3JlYXRlUGFnZSgpOwotCQlwYWdlcy5wdXQoa2V5LCBwYWdlKTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhZ2UgYm9vayBjb250YWluZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgcGFnZSBib29rIGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gcGFnZUJvb2s7Ci0JfQotCS8qKgotCSAqIFJlZ2lzdGVycyBhIHBhZ2UgdW5kZXIgdGhlIHByaXZpZGVkIGtleSB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBwYWdlIGJvb2suCi0JICogVGhlIHBhZ2UgbXVzdCBiZSBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgcGFnZSBib29rIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgcGFnZSBrZXkKLQkgKiBAcGFyYW0gcGFnZQotCSAqICAgICAgICAgICAgdGhlIHBhZ2UgY29tcG9zaXRlIHRvIHJlZ2lzdGVyCi0JICogQHNlZSAjY3JlYXRlUGFnZQotCSAqIEBzZWUgI2dldENvbnRhaW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUGFnZShPYmplY3Qga2V5LCBDb250cm9sIHBhZ2UpIHsKLQkJcGFnZXMucHV0KGtleSwgcGFnZSk7Ci0JfQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHBhZ2UgdW5kZXIgdGhlIHByb3ZpZGVkIGtleSBmcm9tIHRoZSBwYWdlIGJvb2suIERvZXMgbm90aGluZwotCSAqIGlmIHBhZ2Ugd2l0aCB0aGF0IGtleSBkb2VzIG5vdCBleGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgcGFnZSBrZXkuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGFnZShPYmplY3Qga2V5KSB7Ci0JCXJlbW92ZVBhZ2Uoa2V5LCB0cnVlKTsKLQl9Ci0JLyoqCi0JICogUmVtb3ZlcyB0aGUgcGFnZSB1bmRlciB0aGUgcHJvdmlkZWQga2V5IGZyb20gdGhlIHBhZ2UgYm9vay4gRG9lcyBub3RoaW5nCi0JICogaWYgcGFnZSB3aXRoIHRoYXQga2V5IGRvZXMgbm90IGV4aXN0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIGtleS4KLQkgKiBAcGFyYW0gc2hvd0VtcHR5UGFnZQotCSAqIAkJCSAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNob3dzIHRoZSBlbXB0eSBwYWdlCi0JICogICAgICAgICAgICBhZnRlciBwYWdlIHJlbW92YWwuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGFnZShPYmplY3Qga2V5LCBib29sZWFuIHNob3dFbXB0eVBhZ2UpIHsKLQkJQ29udHJvbCBwYWdlID0gKENvbnRyb2wpIHBhZ2VzLmdldChrZXkpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlwYWdlcy5yZW1vdmUoa2V5KTsKLQkJCXBhZ2UuZGlzcG9zZSgpOwotCQkJaWYgKHNob3dFbXB0eVBhZ2UpCi0JCQkJc2hvd0VtcHR5UGFnZSgpOwotCQl9Ci0JfQotCS8qKgotCSAqIFNob3dzIHRoZSBwYWdlIHdpdGggdGhlIHByb3ZpZGVkIGtleSBhbmQgaGlkZXMgdGhlIHBhZ2UgcHJldmlvdXNseQotCSAqIHNob3dpbmcuIERvZXMgbm90aGluZyBpZiB0aGUgcGFnZSB3aXRoIHRoYXQga2V5IGRvZXMgbm90IGV4aXN0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIGtleQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dQYWdlKE9iamVjdCBrZXkpIHsKLQkJQ29udHJvbCBwYWdlID0gKENvbnRyb2wpIHBhZ2VzLmdldChrZXkpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlwYWdlQm9vay5zaG93UGFnZShwYWdlKTsKLQkJCWlmIChjdXJyZW50UGFnZSAhPSBudWxsICYmIGN1cnJlbnRQYWdlICE9IHBhZ2UpIHsKLQkJCQkvLyBzd2l0Y2hpbmcgcGFnZXMgLSBmb3JjZSBsYXlvdXQKLQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkKLQkJCQkJKChDb21wb3NpdGUpIHBhZ2UpLmxheW91dChmYWxzZSk7Ci0JCQl9Ci0JCQljdXJyZW50UGFnZSA9IHBhZ2U7Ci0JCX0gZWxzZSB7Ci0JCQlzaG93RW1wdHlQYWdlKCk7Ci0JCX0KLQkJcmVmbG93KHRydWUpOwotCX0KLQkvKioKLQkgKiBTaG93cyBhIHBhZ2Ugd2l0aCBubyBjaGlsZHJlbiB0byBiZSB1c2VkIGlmIHRoZSBkZXNpcmUgaXMgdG8gbm90IHNob3cKLQkgKiBhbnkgcmVnaXN0ZXJlZCBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dFbXB0eVBhZ2UoKSB7Ci0JCWlmIChlbXB0eVBhZ2UgPT0gbnVsbCkgewotCQkJZW1wdHlQYWdlID0gY3JlYXRlUGFnZSgpOwotCQkJZW1wdHlQYWdlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJfQotCQlwYWdlQm9vay5zaG93UGFnZShlbXB0eVBhZ2UpOwotCQljdXJyZW50UGFnZSA9IGVtcHR5UGFnZTsKLQkJcmVmbG93KHRydWUpOwotCX0KLQkvKioKLQkgKiBTZXRzIGZvY3VzIG9uIHRoZSBjdXJyZW50IHBhZ2UgaWYgc2hvd24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMoKSB7Ci0JCWlmIChjdXJyZW50UGFnZSAhPSBudWxsKQotCQkJcmV0dXJuIGN1cnJlbnRQYWdlLnNldEZvY3VzKCk7Ci0JCXJldHVybiBzdXBlci5zZXRGb2N1cygpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWdlIGN1cnJlbnRseSBzaG93aW5nLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcGFnZQotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldEN1cnJlbnRQYWdlKCkgewotCQlyZXR1cm4gY3VycmVudFBhZ2U7Ci0JfQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVBhZ2UoKSB7Ci0JCUNvbXBvc2l0ZSBwYWdlID0gbmV3IExheW91dENvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5VTEwpOwotCQlwYWdlLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQkJcGFnZS5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0JCXBhZ2Uuc2V0TWVudShwYWdlQm9vay5nZXRNZW51KCkpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1NlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzdmNTEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBNaWNoYWVsIFdpbGxpYW1zb24gKGVjbGlwc2UtYnVnc0BtYWduYXdvcmtzLmNvbSkgLSBwYXRjaCAoc2VlIEJ1Z3ppbGxhICM5MjU0NSkgCi0gKiAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogQSB2YXJpYXRpb24gb2YgdGhlIGV4cGFuZGFibGUgY29tcG9zaXRlIHRoYXQgYWRkcyBvcHRpb25hbCBkZXNjcmlwdGlvbiBiZWxvdwotICogdGhlIHRpdGxlLiBTZWN0aW9uIGlzIG9mdGVuIHVzZWQgYXMgYSBiYXNpYyBidWlsZGluZyBibG9jayBpZiBmb3JtcyBiZWNhdXNlCi0gKiBpdCBwcm92aWRlcyBmb3IgbG9naWNhbCBncm91cGluZyBvZiBpbmZvcm1hdGlvbi4KLSAqIDxwPgotICogSW4gY2FzZSBvZiB0aGUgVElUTEVfQkFSIHN0eWxlLCBTZWN0aW9uIHJlbmRlcnMgdGhlIHRpdGxlIGJhciBpbiBhIHdheQotICogY29tcGF0aWJsZSB3aXRoIHRoZSByZXN0IG9mIHRoZSB3b3JrYmVuY2guIFNpbmNlIGl0IGlzIGEgd2lkZ2V0LCBhbGwgdGhlCi0gKiBjb2xvcnMgbXVzdCBiZSBzdXBwbGllZCBkaXJlY3RseS4gV2hlbiBjcmVhdGVkIGJ5IHRoZSBmb3JtIHRvb2xraXQsIHRoZXNlCi0gKiBjb2xvcnMgYXJlIHN1cHBsaWVkIGJ5IHRoZSB0b29sa2l0LiBUaGUgdG9vbGtpdCBpbml0aWFsaXplcyB0aGVzZSBjb2xvcnMKLSAqIGJhc2VkIG9uIHRoZSBzeXN0ZW0gY29sb3JzLiBGb3IgdGhpcyByZWFzb24sIGl0IGlzIHJlY29tbWVuZGVkIHRvIGNyZWF0ZSB0aGUKLSAqIHNlY3Rpb24gYnkgdGhlIHRvb2xraXQgaW5zdGVhZCBvZiB0aHJvdWdoIGl0cyBvd24gY29uc3RydWN0b3IuCi0gKiA8cD4KLSAqIFNpbmNlIDMuMSwgaXQgaXMgcG9zc2libGUgdG8gc2V0IGEgY29udHJvbCB0byBiZSB1c2VkIGZvciBzZWN0aW9uCi0gKiBkZXNjcmlwdGlvbi4gSWYgdXNlZCwgPGNvZGU+REVTQ1JJUFRJT048L2NvZGU+IHN0eWxlIHNob3VsZCBub3QgYmUgc2V0LiBBCi0gKiB0eXBpY2FsIHdheSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmV3IG1ldGhvZCBpcyB0byBzZXQgYW4gaW5zdGFuY2Ugb2YKLSAqIDxjb2RlPkZvcm1UZXh0PC9jb2RlPiB0byBwcm92aWRlIGZvciBoeXBlcmxpbmtzIGFuZCBpbWFnZXMgaW4gdGhlCi0gKiBkZXNjcmlwdGlvbiBhcmVhLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN0aW9uIGV4dGVuZHMgRXhwYW5kYWJsZUNvbXBvc2l0ZSB7Ci0JLyoqCi0JICogRGVzY3JpcHRpb24gc3R5bGUuIElmIHVzZWQsIGRlc2NyaXB0aW9uIHdpbGwgYmUgcmVuZGVyZWQgYmVsb3cgdGhlIHRpdGxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFU0NSSVBUSU9OID0gMSA8PCA3OwotCi0JcHJpdmF0ZSBDb250cm9sIGRlc2NyaXB0aW9uQ29udHJvbDsKLQotCXByaXZhdGUgQ29udHJvbCBzZXBhcmF0b3I7Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSB0aXRsZUNvbG9yczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9CRyA9ICJiZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9HQkcgPSAiZ2JnIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0JPUkRFUiA9ICJib3JkZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlY3Rpb24gaW5zdGFuY2UgaW4gdGhlIHByb3ZpZGVkIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIHRvIHVzZQotCSAqLwotCXB1YmxpYyBTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQl0aGlzKHBhcmVudCwgU1dULk5VTEwsIHN0eWxlKTsKLQl9Ci0KLQlTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjc3R5bGUsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIGNzdHlsZSwgc3R5bGUpOwotCQlpbnQgcnRsID0gY3N0eWxlICYgU1dULlJJR0hUX1RPX0xFRlQ7Ci0JCWlmICgoc3R5bGUgJiBERVNDUklQVElPTikgIT0gMCkgewotCQkJZGVzY3JpcHRpb25Db250cm9sID0gbmV3IExhYmVsKHRoaXMsIFNXVC5XUkFQIHwgcnRsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGludGVybmFsU2V0RXhwYW5kZWQoYm9vbGVhbiBleHBhbmRlZCkgewotCQlzdXBlci5pbnRlcm5hbFNldEV4cGFuZGVkKGV4cGFuZGVkKTsKLQkJcmVmbG93KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbG93KCkgewotCQlDb21wb3NpdGUgYyA9IHRoaXM7Ci0JCXdoaWxlIChjICE9IG51bGwpIHsKLQkJCWMuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCWMgPSBjLmdldFBhcmVudCgpOwotCQkJaWYgKGMgaW5zdGFuY2VvZiBTY3JvbGxlZEZvcm0pIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQljID0gdGhpczsKLQkJd2hpbGUgKGMgIT0gbnVsbCkgewotCQkJYy5sYXlvdXQodHJ1ZSk7Ci0JCQljID0gYy5nZXRQYXJlbnQoKTsKLQkJCWlmIChjIGluc3RhbmNlb2YgU2Nyb2xsZWRGb3JtKSB7Ci0JCQkJKChTY3JvbGxlZEZvcm0pIGMpLnJlZmxvdyh0cnVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQljID0gdGhpczsKLQkJd2hpbGUgKGMgIT0gbnVsbCkgewotCQkJYy5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQljID0gYy5nZXRQYXJlbnQoKTsKLQkJCWlmIChjIGluc3RhbmNlb2YgU2Nyb2xsZWRGb3JtKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiB0ZXh0LiBIYXMgbm8gZWZmZWN0IGlmIERFU0NSSVBUSU9OIHN0eWxlIHdhcyBub3QKLQkgKiB1c2VkIHRvIGNyZWF0ZSB0aGUgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJaWYgKGRlc2NyaXB0aW9uQ29udHJvbCBpbnN0YW5jZW9mIExhYmVsKQotCQkJKChMYWJlbCkgZGVzY3JpcHRpb25Db250cm9sKS5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGRlc2NyaXB0aW9uIHRleHQuCi0JICogCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiB0ZXh0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIERFU0NSSVBUSU9OIHN0eWxlIHdhcwotCSAqICAgICAgICAgbm90IHVzZWQgdG8gY3JlYXRlIHRoZSBjb250cm9sLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCWlmIChkZXNjcmlwdGlvbkNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbCkKLQkJCXJldHVybiAoKExhYmVsKSBkZXNjcmlwdGlvbkNvbnRyb2wpLmdldFRleHQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VwYXJhdG9yIGNvbnRyb2wgb2YgdGhpcyBzZWN0aW9uLiBUaGUgc2VwYXJhdG9yIG11c3Qgbm90IGJlCi0JICogPHNhbXA+bnVsbCA8L3NhbXA+IGFuZCBtdXN0IGJlIGEgZGlyZWN0IGNoaWxkIG9mIHRoaXMgY29udGFpbmVyLiBJZgotCSAqIGRlZmluZWQsIHNlcGFyYXRvciB3aWxsIGJlIHBsYWNlZCBiZWxvdyB0aGUgdGl0bGUgdGV4dCBhbmQgd2lsbCByZW1haW4KLQkgKiB2aXNpYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlIGV4cGFuc2lvbiBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VwYXJhdG9yCi0JICogICAgICAgICAgICB0aGUgc2VwYXJhdG9yIHRoYXQgd2lsbCBiZSBwbGFjZWQgYmVsb3cgdGhlIHRpdGxlIHRleHQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VwYXJhdG9yQ29udHJvbChDb250cm9sIHNlcGFyYXRvcikgewotCQlBc3NlcnQuaXNUcnVlKHNlcGFyYXRvciAhPSBudWxsICYmIHNlcGFyYXRvci5nZXRQYXJlbnQoKS5lcXVhbHModGhpcykpOwotCQl0aGlzLnNlcGFyYXRvciA9IHNlcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250cm9sIHRoYXQgaXMgdXNlZCBhcyBhIHNlcGFyYXRvciBiZXR3ZWVlbiB0aGUgdGl0bGUgYW5kCi0JICogdGhlIGNsaWVudCwgb3IgPHNhbXA+bnVsbCA8L3NhbXA+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHJldHVybiBzZXBhcmF0b3IgY29udHJvbCBvciA8c2FtcD5udWxsIDwvc2FtcD4gaWYgbm90IHNldC4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRTZXBhcmF0b3JDb250cm9sKCkgewotCQlyZXR1cm4gc2VwYXJhdG9yOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgb2YgdGhlIHNlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGJnCi0JICogICAgICAgICAgICB0aGUgbmV3IGJhY2tncm91bmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKENvbG9yIGJnKSB7Ci0JCXN1cGVyLnNldEJhY2tncm91bmQoYmcpOwotCQlpZiAoZGVzY3JpcHRpb25Db250cm9sICE9IG51bGwKLQkJCQkmJiAoZ2V0RXhwYW5zaW9uU3R5bGUoKSAmIERFU0NSSVBUSU9OKSAhPSAwKQotCQkJZGVzY3JpcHRpb25Db250cm9sLnNldEJhY2tncm91bmQoYmcpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgb2YgdGhlIHNlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGZnCi0JICogICAgICAgICAgICB0aGUgbmV3IGZvcmVncm91bmQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChDb2xvciBmZykgewotCQlzdXBlci5zZXRGb3JlZ3JvdW5kKGZnKTsKLQkJaWYgKGRlc2NyaXB0aW9uQ29udHJvbCAhPSBudWxsCi0JCQkJJiYgKGdldEV4cGFuc2lvblN0eWxlKCkgJiBERVNDUklQVElPTikgIT0gMCkKLQkJCWRlc2NyaXB0aW9uQ29udHJvbC5zZXRGb3JlZ3JvdW5kKGZnKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250cm9sIHVzZWQgdG8gcmVuZGVyIHRoZSBkZXNjcmlwdGlvbi4gSW4gMy4xLCB0aGlzIG1ldGhvZAotCSAqIHdhcyBwcm9tb3RlZCB0byBwdWJsaWMuCi0JICogCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiBjb250cm9sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIERFU0NSSVBUSU9OIHN0eWxlCi0JICogICAgICAgICB3YXMgbm90IHVzZWQgdG8gY3JlYXRlIHRoZSBjb250cm9sIGFuZCBkZXNjcmlwdGlvbiBjb250cm9sIHdhcwotCSAqICAgICAgICAgbm90IHNldCBieSB0aGUgY2xpZW50LgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sKQotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldERlc2NyaXB0aW9uQ29udHJvbCgpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uQ29udHJvbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBjb250cm9sIG9mIHRoaXMgc2VjdGlvbi4gVGhlIGNvbnRyb2wgbXVzdCBub3QgYmUKLQkgKiA8c2FtcD5udWxsPC9zYW1wPiBhbmQgbXVzdCBiZSBhIGRpcmVjdCBjaGlsZCBvZiB0aGlzIGNvbnRhaW5lci4gSWYKLQkgKiBkZWZpbmVkLCBjb250b2wgd2lsbCBiZSBwbGFjZWQgYmVsb3cgdGhlIHRpdGxlIHRleHQgYW5kIHRoZSBzZXBhcmF0b3IgYW5kCi0JICogd2lsbCBiZSBoaWRkZW4gaW50IGhlIGNvbGxhcHNlZCBzdGF0ZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBhbmQgPGNvZGU+REVTQ1JJUFRJT048L2NvZGU+IHN0eWxlIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCi0JICogVXNlIHRoZSBtZXRob2Qgb25seSBpZiB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIGRlc2NyaXB0aW9uIGNvbnRyb2wKLQkgKiB5b3Vyc2VsZi4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uQ29udHJvbAotCSAqICAgICAgICAgICAgdGhlIGNvbnRyb2wgdGhhdCB3aWxsIGJlIHBsYWNlZCBiZWxvdyB0aGUgdGl0bGUgdGV4dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbkNvbnRyb2woQ29udHJvbCBkZXNjcmlwdGlvbkNvbnRyb2wpIHsKLQkJQXNzZXJ0LmlzVHJ1ZSgoZ2V0RXhwYW5zaW9uU3R5bGUoKSAmIERFU0NSSVBUSU9OKSA9PSAwKTsKLQkJQXNzZXJ0LmlzVHJ1ZShkZXNjcmlwdGlvbkNvbnRyb2wgIT0gbnVsbAotCQkJCSYmIGRlc2NyaXB0aW9uQ29udHJvbC5nZXRQYXJlbnQoKS5lcXVhbHModGhpcykpOwotCQl0aGlzLmRlc2NyaXB0aW9uQ29udHJvbCA9IGRlc2NyaXB0aW9uQ29udHJvbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb2xvciBvZiB0aGUgdGl0bGUgYmFyIGJvcmRlciB3aGVuIFRJVExFX0JBUiBzdHlsZSBpcyB1c2VkLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvcgotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIGJhciBib3JkZXIgY29sb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZUJhckJvcmRlckNvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCXB1dFRpdGxlQmFyQ29sb3IoQ09MT1JfQk9SREVSLCBjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29sb3Igb2YgdGhlIHRpdGxlIGJhciBiYWNrZ3JvdW5kIHdoZW4gVElUTEVfQkFSIHN0eWxlIGlzIHVzZWQuCi0JICogVGhpcyBjb2xvciBpcyB1c2VkIGFzIGEgc3RhcnRpbmcgY29sb3IgZm9yIHRoZSB2ZXJ0aWNhbCBncmFkaWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IKLQkgKiAgICAgICAgICAgIHRoZSB0aXRsZSBiYXIgYm9yZGVyIGJhY2tncm91bmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZUJhckJhY2tncm91bmQoQ29sb3IgY29sb3IpIHsKLQkJcHV0VGl0bGVCYXJDb2xvcihDT0xPUl9CRywgY29sb3IpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbG9yIG9mIHRoZSB0aXRsZSBiYXIgZ3JhZGllbnQgYmFja2dyb3VuZCB3aGVuIFRJVExFX0JBUiBzdHlsZQotCSAqIGlzIHVzZWQuIFRoaXMgY29sb3IgaXMgdXNlZCBhdCB0aGUgaGVpZ2h0IHdoZXJlIHRpdGxlIGNvbnRyb2xzIGVuZAotCSAqICh0b2dnbGUsIHRvb2wgYmFyKS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IKLQkgKiAgICAgICAgICAgIHRoZSB0aXRsZSBiYXIgZ3JhZGllbnQgYmFja2dyb3VuZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlQmFyR3JhZGllbnRCYWNrZ3JvdW5kKENvbG9yIGNvbG9yKSB7Ci0JCXB1dFRpdGxlQmFyQ29sb3IoQ09MT1JfR0JHLCBjb2xvcik7Ci0JCWlmICgoZ2V0RXhwYW5zaW9uU3R5bGUoKSAmIFRJVExFX0JBUikgIT0gMCkgewotCQkJdGV4dExhYmVsLnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJaWYgKHRvZ2dsZSAhPSBudWxsKQotCQkJCXRvZ2dsZS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIGJhciBib3JkZXIgY29sb3Igd2hlbiBUSVRMRV9CQVIgc3R5bGUgaXMgdXNlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aXRsZSBiYXIgYm9yZGVyIGNvbG9yCi0JICovCi0JcHVibGljIENvbG9yIGdldFRpdGxlQmFyQm9yZGVyQ29sb3IoKSB7Ci0JCWlmICh0aXRsZUNvbG9ycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ29sb3IpIHRpdGxlQ29sb3JzLmdldChDT0xPUl9CT1JERVIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIGJhciBncmFkaWVudCBiYWNrZ3JvdW5kIGNvbG9yIHdoZW4gVElUTEVfQkFSIHN0eWxlIGlzCi0JICogdXNlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aXRsZSBiYXIgZ3JhZGllbnQgYmFja2dyb3VuZAotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRUaXRsZUJhckdyYWRpZW50QmFja2dyb3VuZCgpIHsKLQkJaWYgKHRpdGxlQ29sb3JzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKChnZXRFeHBhbnNpb25TdHlsZSgpICYgU0hPUlRfVElUTEVfQkFSKSAhPSAwKQotCQkJcmV0dXJuIGdldEJhY2tncm91bmQoKTsKLQkJcmV0dXJuIChDb2xvcikgdGl0bGVDb2xvcnMuZ2V0KENPTE9SX0dCRyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGl0bGUgYmFyIGJhY2tncm91bmQgd2hlbiBUSVRMRV9CQVIgc3R5bGUgaXMgdXNlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aXRsZSBiYXIgYmFja2dyb3VuZAotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRUaXRsZUJhckJhY2tncm91bmQoKSB7Ci0JCWlmICh0aXRsZUNvbG9ycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ29sb3IpIHRpdGxlQ29sb3JzLmdldChDT0xPUl9CRyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHB1dFRpdGxlQmFyQ29sb3IoU3RyaW5nIGtleSwgQ29sb3IgY29sb3IpIHsKLQkJaWYgKGNvbG9yID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aXRsZUNvbG9ycyA9PSBudWxsKQotCQkJdGl0bGVDb2xvcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXRpdGxlQ29sb3JzLnB1dChrZXksIGNvbG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvblBhaW50KFBhaW50RXZlbnQgZSkgewotCQlDb2xvciBiZyA9IG51bGw7Ci0JCUNvbG9yIGdiZyA9IG51bGw7Ci0JCUNvbG9yIGZnID0gbnVsbDsKLQkJQ29sb3IgYm9yZGVyID0gbnVsbDsKLQkJaWYgKHRpdGxlQ29sb3JzICE9IG51bGwpIHsKLQkJCWJnID0gKENvbG9yKSB0aXRsZUNvbG9ycy5nZXQoQ09MT1JfQkcpOwotCQkJZ2JnID0gKENvbG9yKSB0aXRsZUNvbG9ycy5nZXQoQ09MT1JfR0JHKTsKLQkJCWZnID0gZ2V0VGl0bGVCYXJGb3JlZ3JvdW5kKCk7Ci0JCQlib3JkZXIgPSAoQ29sb3IpIHRpdGxlQ29sb3JzLmdldChDT0xPUl9CT1JERVIpOwotCQl9Ci0JCWlmIChiZyA9PSBudWxsKQotCQkJYmcgPSBnZXRCYWNrZ3JvdW5kKCk7Ci0JCWlmIChmZyA9PSBudWxsKQotCQkJZmcgPSBnZXRGb3JlZ3JvdW5kKCk7Ci0JCWlmIChib3JkZXIgPT0gbnVsbCkKLQkJCWJvcmRlciA9IGZnOwotCQlpZiAoZ2JnID09IG51bGwpCi0JCQlnYmcgPSBiZzsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldENsaWVudEFyZWEoKTsKLQkJaW50IHRoZWlnaHQgPSAwOwotCQlpbnQgdHZtYXJnaW4gPSBHQVA7Ci0JCWlmICgoZ2V0RXhwYW5zaW9uU3R5bGUoKSAmIFRJVExFX0JBUikgIT0gMCkgewotCQkJUG9pbnQgdHNpemUgPSBudWxsOwotCQkJUG9pbnQgdGNzaXplID0gbnVsbDsKLQkJCWlmICh0b2dnbGUgIT0gbnVsbCkKLQkJCQl0c2l6ZSA9IHRvZ2dsZS5nZXRTaXplKCk7Ci0JCQlpbnQgdHdpZHRoID0gYm91bmRzLndpZHRoIC0gbWFyZ2luV2lkdGggLSBtYXJnaW5XaWR0aDsKLQkJCWlmICh0c2l6ZSAhPSBudWxsKQotCQkJCXR3aWR0aCAtPSB0c2l6ZS54ICsgR0FQOwotCQkJaWYgKGdldFRleHRDbGllbnQoKSAhPSBudWxsKQotCQkJCXRjc2l6ZSA9IGdldFRleHRDbGllbnQoKS5nZXRTaXplKCk7Ci0JCQlpZiAodGNzaXplICE9IG51bGwpCi0JCQkJdHdpZHRoIC09IHRjc2l6ZS54ICsgR0FQOwotCQkJUG9pbnQgc2l6ZSA9IHRleHRMYWJlbC5nZXRTaXplKCk7Ci0JCQlpZiAodHNpemUgIT0gbnVsbCkKLQkJCQl0aGVpZ2h0ICs9IE1hdGgubWF4KHRoZWlnaHQsIHRzaXplLnkpOwotCQkJaWYgKHRjc2l6ZSAhPSBudWxsKQotCQkJCXRoZWlnaHQgPSBNYXRoLm1heCh0aGVpZ2h0LCB0Y3NpemUueSk7Ci0JCQl0aGVpZ2h0ID0gTWF0aC5tYXgodGhlaWdodCwgc2l6ZS55KTsKLQkJCXRoZWlnaHQgKz0gdHZtYXJnaW4gKyB0dm1hcmdpbjsKLQkJfSBlbHNlIHsKLQkJCXRoZWlnaHQgPSA1OwotCQl9Ci0JCWludCBtaWRwb2ludCA9ICh0aGVpZ2h0ICogNjYpIC8gMTAwOwotCQlpbnQgcmVtID0gdGhlaWdodCAtIG1pZHBvaW50OwotCQlHQyBnYyA9IGUuZ2M7Ci0JCWlmICgoZ2V0RXhwYW5zaW9uU3R5bGUoKSAmIFRJVExFX0JBUikgIT0gMCkgewotCQkJZ2Muc2V0Rm9yZWdyb3VuZChiZyk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGdiZyk7Ci0JCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUobWFyZ2luV2lkdGgsIG1hcmdpbkhlaWdodCwgYm91bmRzLndpZHRoCi0JCQkJCS0gMSAtIG1hcmdpbldpZHRoIC0gbWFyZ2luV2lkdGgsIG1pZHBvaW50IC0gMSwgdHJ1ZSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGdiZyk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0JCQlnYwotCQkJCQkuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKG1hcmdpbldpZHRoLCBtYXJnaW5IZWlnaHQgKyBtaWRwb2ludAotCQkJCQkJCS0gMSwgYm91bmRzLndpZHRoIC0gMSAtIG1hcmdpbldpZHRoIC0gbWFyZ2luV2lkdGgsCi0JCQkJCQkJcmVtIC0gMSwgdHJ1ZSk7Ci0JCX0gZWxzZSBpZiAoaXNFeHBhbmRlZCgpKSB7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGJnKTsKLQkJCWdjLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZShtYXJnaW5XaWR0aCwgbWFyZ2luSGVpZ2h0LCBib3VuZHMud2lkdGgKLQkJCQkJLSBtYXJnaW5XaWR0aCAtIG1hcmdpbldpZHRoLCB0aGVpZ2h0LCB0cnVlKTsKLQkJfQotCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0JCS8vIHJlcGFpciB0aGUgdXBwZXIgbGVmdCBjb3JuZXIKLQkJZ2MuZmlsbFBvbHlnb24obmV3IGludFtdIHsgbWFyZ2luV2lkdGgsIG1hcmdpbkhlaWdodCwgbWFyZ2luV2lkdGgsCi0JCQkJbWFyZ2luSGVpZ2h0ICsgMiwgbWFyZ2luV2lkdGggKyAyLCBtYXJnaW5IZWlnaHQgfSk7Ci0JCS8vIHJlcGFpciB0aGUgdXBwZXIgcmlnaHQgY29ybmVyCi0JCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnRbXSB7IGJvdW5kcy53aWR0aCAtIG1hcmdpbldpZHRoIC0gMywKLQkJCQltYXJnaW5IZWlnaHQsIGJvdW5kcy53aWR0aCAtIG1hcmdpbldpZHRoIC0gMSwgbWFyZ2luSGVpZ2h0LAotCQkJCWJvdW5kcy53aWR0aCAtIG1hcmdpbldpZHRoIC0gMSwgbWFyZ2luSGVpZ2h0ICsgMiB9KTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChib3JkZXIpOwotCQlpZiAoaXNFeHBhbmRlZCgpIHx8IChnZXRFeHBhbnNpb25TdHlsZSgpICYgVElUTEVfQkFSKSAhPSAwKSB7Ci0JCQkvLyB0b3AgbGVmdCBjdXJ2ZQotCQkJZ2MuZHJhd0xpbmUobWFyZ2luV2lkdGgsIG1hcmdpbkhlaWdodCArIDIsIG1hcmdpbldpZHRoICsgMiwKLQkJCQkJbWFyZ2luSGVpZ2h0KTsKLQkJCS8vIHRvcCBlZGdlCi0JCQlnYy5kcmF3TGluZShtYXJnaW5XaWR0aCArIDIsIG1hcmdpbkhlaWdodCwgYm91bmRzLndpZHRoCi0JCQkJCS0gbWFyZ2luV2lkdGggLSAzLCBtYXJnaW5IZWlnaHQpOwotCQkJLy8gdG9wIHJpZ2h0IGN1cnZlCi0JCQlnYy5kcmF3TGluZShib3VuZHMud2lkdGggLSBtYXJnaW5XaWR0aCAtIDMsIG1hcmdpbkhlaWdodCwKLQkJCQkJYm91bmRzLndpZHRoIC0gbWFyZ2luV2lkdGggLSAxLCBtYXJnaW5IZWlnaHQgKyAyKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNvbGxhcHNlZCBzaG9ydCB0aXRsZSBiYXIKLQkJCS8vIHRvcCBlZGdlCi0JCQlnYy5kcmF3TGluZShtYXJnaW5XaWR0aCwgbWFyZ2luSGVpZ2h0LCBib3VuZHMud2lkdGggLSAxLAotCQkJCQltYXJnaW5IZWlnaHQpOwotCQl9Ci0JCWlmICgoZ2V0RXhwYW5zaW9uU3R5bGUoKSAmIFRJVExFX0JBUikgIT0gMCAmJiB0b2dnbGUgIT0gbnVsbAotCQkJCSYmICFpc0V4cGFuZGVkKCkpIHsKLQkJCS8vIGxlZnQgdmVydGljYWwgZWRnZQotCQkJZ2MuZHJhd0xpbmUobWFyZ2luV2lkdGgsIG1hcmdpbkhlaWdodCArIDIsIG1hcmdpbldpZHRoLAotCQkJCQltYXJnaW5IZWlnaHQgKyB0aGVpZ2h0IC0gMSk7Ci0JCQkvLyByaWdodCB2ZXJ0aWNhbCBlZGdlCi0JCQlnYy5kcmF3TGluZShib3VuZHMud2lkdGggLSBtYXJnaW5XaWR0aCAtIDEsIG1hcmdpbkhlaWdodCArIDIsCi0JCQkJCWJvdW5kcy53aWR0aCAtIG1hcmdpbldpZHRoIC0gMSwgbWFyZ2luSGVpZ2h0ICsgdGhlaWdodCAtIDEpOwotCQkJLy8gYm90dG9tIGVkZ2UgKGlmIGNsb3NlZCkKLQkJCWdjLmRyYXdMaW5lKG1hcmdpbldpZHRoLCBtYXJnaW5IZWlnaHQgKyB0aGVpZ2h0IC0gMSwgYm91bmRzLndpZHRoCi0JCQkJCS0gbWFyZ2luV2lkdGggLSAxLCBtYXJnaW5IZWlnaHQgKyB0aGVpZ2h0IC0gMSk7Ci0JCX0gZWxzZSBpZiAoaXNFeHBhbmRlZCgpKSB7Ci0JCQkvLyBsZWZ0IHZlcnRpY2FsIGVkZ2UgZ3JhZGllbnQKLQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZShtYXJnaW5XaWR0aCwgbWFyZ2luSGVpZ2h0ICsgMiwgMSwKLQkJCQkJdGhlaWdodCAtIDIsIHRydWUpOwotCQkJLy8gcmlnaHQgdmVydGljYWwgZWRnZSBncmFkaWVudAotCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKGJvdW5kcy53aWR0aCAtIG1hcmdpbldpZHRoIC0gMSwKLQkJCQkJbWFyZ2luSGVpZ2h0ICsgMiwgMSwgdGhlaWdodCAtIDIsIHRydWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvU2hhcmVkU2Nyb2xsZWRDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvU2hhcmVkU2Nyb2xsZWRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5YWFiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1NoYXJlZFNjcm9sbGVkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzLkZvcm1VdGlsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwcm92aWRlIGNvbW1vbiBzY3JvbGxpbmcgc2VydmljZXMgdG8gYSBudW1iZXIgb2YKLSAqIGNvbnRyb2xzIGluIHRoZSB0b29sa2l0LiBDbGFzc2VzIHRoYXQgZXh0ZW5kIGl0IGFyZSBub3QgcmVxdWlyZWQgdG8gaW1wbGVtZW50Ci0gKiBhbnkgbWV0aG9kLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaGFyZWRTY3JvbGxlZENvbXBvc2l0ZSBleHRlbmRzIFNjcm9sbGVkQ29tcG9zaXRlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSF9TQ1JPTExfSU5DUkVNRU5UID0gNTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWX1NDUk9MTF9JTkNSRU1FTlQgPSA2NDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gaWdub3JlTGF5b3V0cyA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaWdub3JlUmVzaXplcyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGV4cGFuZEhvcml6b250YWwgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBleHBhbmRWZXJ0aWNhbCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTaXplQ2FjaGUgY29udGVudENhY2hlID0gbmV3IFNpemVDYWNoZSgpOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlZmxvd1BlbmRpbmcgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWxheWVkUmVmbG93ID0gdHJ1ZTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZSB0byB1c2UKLQkgKi8KLQlwdWJsaWMgU2hhcmVkU2Nyb2xsZWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlhZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKCFpZ25vcmVSZXNpemVzKSB7Ci0JCQkJCXNjaGVkdWxlUmVmbG93KGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlpbml0aWFsaXplU2Nyb2xsQmFycygpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgb2YgdGhlIGNvbnRyb2wgYW5kIGl0cyBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSBmZwotCSAqICAgICAgICAgICAgdGhlIG5ldyBmb3JlZ3JvdW5kIGNvbG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChDb2xvciBmZykgewotCQlzdXBlci5zZXRGb3JlZ3JvdW5kKGZnKTsKLQkJaWYgKGdldENvbnRlbnQoKSAhPSBudWxsKQotCQkJZ2V0Q29udGVudCgpLnNldEZvcmVncm91bmQoZmcpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgb2YgdGhlIGNvbnRyb2wgYW5kIGl0cyBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSBiZwotCSAqICAgICAgICAgICAgdGhlIG5ldyBiYWNrZ3JvdW5kIGNvbG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBiZykgewotCQlzdXBlci5zZXRCYWNrZ3JvdW5kKGJnKTsKLQkJaWYgKGdldENvbnRlbnQoKSAhPSBudWxsKQotCQkJZ2V0Q29udGVudCgpLnNldEJhY2tncm91bmQoYmcpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgb2YgdGhlIGZvcm0uIFRoaXMgZm9udCB3aWxsIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSB0aXRsZQotCSAqIHRleHQuIEl0IHdpbGwgbm90IGFmZmVjdCB0aGUgYm9keS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgewotCQlzdXBlci5zZXRGb250KGZvbnQpOwotCQlpZiAoZ2V0Q29udGVudCgpICE9IG51bGwpCi0JCQlnZXRDb250ZW50KCkuc2V0Rm9udChmb250KTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZXMgJ3N1cGVyJyB0byBwYXNzIHRoZSBwcm9wZXIgY29sb3JzIGFuZCBmb250Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChDb250cm9sIGNvbnRlbnQpIHsKLQkJc3VwZXIuc2V0Q29udGVudChjb250ZW50KTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJY29udGVudC5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0JCQljb250ZW50LnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQkJCWNvbnRlbnQuc2V0Rm9udChnZXRGb250KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgY29udGVudCBpcyBzZXQsIHRyYW5zZmVycyBmb2N1cyB0byB0aGUgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cygpIHsKLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCUZvcm1VdGlsLnNldEZvY3VzU2Nyb2xsaW5nRW5hYmxlZCh0aGlzLCBmYWxzZSk7Ci0JCWlmIChnZXRDb250ZW50KCkgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGdldENvbnRlbnQoKS5zZXRGb2N1cygpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBzdXBlci5zZXRGb2N1cygpOwotCQlGb3JtVXRpbC5zZXRGb2N1c1Njcm9sbGluZ0VuYWJsZWQodGhpcywgdHJ1ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUjbGF5b3V0KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgbGF5b3V0KGJvb2xlYW4gY2hhbmdlZCkgewotCQlpZiAoaWdub3JlTGF5b3V0cykgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWdub3JlTGF5b3V0cyA9IHRydWU7Ci0JCWlnbm9yZVJlc2l6ZXMgPSB0cnVlOwotCQlzdXBlci5sYXlvdXQoY2hhbmdlZCk7Ci0JCWlnbm9yZVJlc2l6ZXMgPSBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGUjc2V0RXhwYW5kSG9yaXpvbnRhbChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuZEhvcml6b250YWwoYm9vbGVhbiBleHBhbmQpIHsKLQkJZXhwYW5kSG9yaXpvbnRhbCA9IGV4cGFuZDsKLQkJc3VwZXIuc2V0RXhwYW5kSG9yaXpvbnRhbChleHBhbmQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZSNzZXRFeHBhbmRWZXJ0aWNhbChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuZFZlcnRpY2FsKGJvb2xlYW4gZXhwYW5kKSB7Ci0JCWV4cGFuZFZlcnRpY2FsID0gZXhwYW5kOwotCQlzdXBlci5zZXRFeHBhbmRWZXJ0aWNhbChleHBhbmQpOwotCX0KLQotCS8qKgotCSAqIFJlY29tcHV0ZXMgdGhlIGJvZHkgbGF5b3V0IGFuZCB0aGUgc2Nyb2xsIGJhcnMuIFRoZSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQKLQkgKiB3aGVuIGNoYW5nZXMgc29tZXdoZXJlIGluIHRoZSBmb3JtIGJvZHkgaW52YWxpZGF0ZSB0aGUgY3VycmVudCBsYXlvdXQKLQkgKiBhbmQvb3Igc2Nyb2xsIGJhcnMuCi0JICogCi0JICogQHBhcmFtIGZsdXNoQ2FjaGUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBkcm9wIHRoZSBjYWNoZWQgZGF0YQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZmxvdyhib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJQ29tcG9zaXRlIGMgPSAoQ29tcG9zaXRlKSBnZXRDb250ZW50KCk7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlpZiAoYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNvbnRlbnRDYWNoZS5zZXRDb250cm9sKGMpOwotCQlpZiAoZmx1c2hDYWNoZSkgewotCQkJY29udGVudENhY2hlLmZsdXNoKCk7Ci0JCX0KLQkJc2V0UmVkcmF3KGZhbHNlKTsKLQkJUG9pbnQgbmV3U2l6ZSA9IGNvbnRlbnRDYWNoZS5jb21wdXRlU2l6ZShGb3JtVXRpbC5nZXRXaWR0aEhpbnQoCi0JCQkJY2xpZW50QXJlYS53aWR0aCwgYyksIEZvcm1VdGlsLmdldEhlaWdodEhpbnQoY2xpZW50QXJlYS5oZWlnaHQsCi0JCQkJYykpOwotCi0JCS8vIFBvaW50IGN1cnJlbnRTaXplID0gYy5nZXRTaXplKCk7Ci0JCWlmICghKGV4cGFuZEhvcml6b250YWwgJiYgZXhwYW5kVmVydGljYWwpKSB7Ci0JCQljLnNldFNpemUobmV3U2l6ZSk7Ci0JCX0KLQotCQlzZXRNaW5TaXplKG5ld1NpemUpOwotCQlGb3JtVXRpbC51cGRhdGVQYWdlSW5jcmVtZW50KHRoaXMpOwotCi0JCWlnbm9yZUxheW91dHMgPSBmYWxzZTsKLQkJbGF5b3V0KGZsdXNoQ2FjaGUpOwotCQlpZ25vcmVMYXlvdXRzID0gdHJ1ZTsKLQotCQljb250ZW50Q2FjaGUubGF5b3V0SWZOZWNlc3NhcnkoKTsKLQkJc2V0UmVkcmF3KHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVTaXplV2hpbGVQZW5kaW5nKCkgewotCQlDb250cm9sIGMgPSBnZXRDb250ZW50KCk7Ci0JCVJlY3RhbmdsZSBhcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlzZXRNaW5TaXplKGFyZWEud2lkdGgsIGMuZ2V0U2l6ZSgpLnkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzY2hlZHVsZVJlZmxvdyhmaW5hbCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJaWYgKGRlbGF5ZWRSZWZsb3cpIHsKLQkJCWlmIChyZWZsb3dQZW5kaW5nKSB7Ci0JCQkJdXBkYXRlU2l6ZVdoaWxlUGVuZGluZygpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKCFpc0Rpc3Bvc2VkKCkpCi0JCQkJCQlyZWZsb3coZmx1c2hDYWNoZSk7Ci0JCQkJCXJlZmxvd1BlbmRpbmcgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXJlZmxvd1BlbmRpbmcgPSB0cnVlOwotCQl9IGVsc2UKLQkJCXJlZmxvdyhmbHVzaENhY2hlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNjcm9sbEJhcnMoKSB7Ci0JCVNjcm9sbEJhciBoYmFyID0gZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlpZiAoaGJhciAhPSBudWxsKSB7Ci0JCQloYmFyLnNldEluY3JlbWVudChIX1NDUk9MTF9JTkNSRU1FTlQpOwotCQl9Ci0JCVNjcm9sbEJhciB2YmFyID0gZ2V0VmVydGljYWxCYXIoKTsKLQkJaWYgKHZiYXIgIT0gbnVsbCkgewotCQkJdmJhci5zZXRJbmNyZW1lbnQoVl9TQ1JPTExfSU5DUkVNRU5UKTsKLQkJfQotCQlGb3JtVXRpbC51cGRhdGVQYWdlSW5jcmVtZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGlmIHRoZSBjb250cm9sIHVzZXMgZGVsYXllZCByZWZsb3cuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWZsb3cgcmVxdWVzdHMgd2lsbAotCSAqIGJlIGRlbGF5ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVsYXllZFJlZmxvdygpIHsKLQkJcmV0dXJuIGRlbGF5ZWRSZWZsb3c7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVsYXllZCByZWZsb3cgZmVhdHVyZS4gV2hlbiB1c2VkLAotCSAqIGl0IHdpbGwgc2NoZWR1bGUgYSByZWZsb3cgb24gcmVzaXplIHJlcXVlc3RzCi0JICogYW5kIHJlamVjdCBzdWJzZXF1ZW50IHJlZmxvd3MgdW50aWwgdGhlCi0JICogc2NoZWR1bGVkIG9uZSBpcyBwZXJmb3JtZWQuIFRoaXMgaW1wcm92ZXMKLQkgKiBwZXJmb3JtYW5jZSBieSAKLQkgKiBAcGFyYW0gZGVsYXllZFJlZmxvdwotCSAqICAgICAgICAgICAgVGhlIGRlbGF5ZWRSZWZsb3cgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGF5ZWRSZWZsb3coYm9vbGVhbiBkZWxheWVkUmVmbG93KSB7Ci0JCXRoaXMuZGVsYXllZFJlZmxvdyA9IGRlbGF5ZWRSZWZsb3c7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9TaXplQ2FjaGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvU2l6ZUNhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NjIxOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9TaXplQ2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5HZW9tZXRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuUHJvZ3Jlc3NCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2FzaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY2FsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TbGlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5Gb3JtVXRpbDsKLQotLyoqCi0gKiBDYWNoZXMgdGhlIHByZWZlcnJlZCBzaXplIG9mIGFuIFNXVCBjb250cm9sCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFNpemVDYWNoZSB7Ci0gICAgcHJpdmF0ZSBDb250cm9sIGNvbnRyb2w7Ci0KLSAgICBwcml2YXRlIFBvaW50IHByZWZlcnJlZFNpemU7Ci0KLSAgICBwcml2YXRlIGludCBjYWNoZWRXaWR0aFF1ZXJ5OwotICAgIHByaXZhdGUgaW50IGNhY2hlZFdpZHRoUmVzdWx0OwotCi0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkSGVpZ2h0UXVlcnk7Ci0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkSGVpZ2h0UmVzdWx0OwotICAgIAotICAgIHByaXZhdGUgaW50IG1pbmltdW1XaWR0aDsKLSAgICBwcml2YXRlIGludCBoZWlnaHRBdE1pbmltdW1XaWR0aCA9IC0xOwotICAgIHByaXZhdGUgaW50IG1heGltdW1XaWR0aDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgcmVjdXJzaXZlbHkgZmx1c2ggYWxsIGNoaWxkcmVuIG9uIHRoZSBuZXh0IGxheW91dAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmbHVzaENoaWxkcmVuOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZmYgY2hhbmdpbmcgdGhlIGhlaWdodCBoaW50IGRvZXMgbm90IGFmZmVjdCB0aGUgcHJlZmVycmVkIHdpZHRoIGFuZCBjaGFuZ2luZwotICAgICAqIHRoZSB3aWR0aCBoaW50IGRvZXMgbm90IGNoYW5nZSB0aGUgcHJlZmVycmVkIGhlaWdodAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpbmRlcGVuZGVudERpbWVuc2lvbnMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWZmIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IGZvciBhbnkgaGludCBsYXJnZXIgdGhhbiB0aGUgcHJlZmVycmVkIHdpZHRoIHdpbGwgbm90Ci0gICAgICogY2hhbmdlIHRoZSBwcmVmZXJyZWQgaGVpZ2h0LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwcmVmZXJyZWRXaWR0aE9yTGFyZ2VySXNNaW5pbXVtSGVpZ2h0ID0gZmFsc2U7Ci0KLSAgICAvLyBIQUNLOiB0aGVzZSB2YWx1ZXMgZXN0aW1hdGUgaG93IG11Y2ggdG8gc3VidHJhY3QgZnJvbSB0aGUgd2lkdGggYW5kIGhlaWdodAotICAgIC8vIGhpbnRzIHRoYXQgZ2V0IHBhc3NlZCBpbnRvIGNvbXB1dGVTaXplLCBpbiBvcmRlciB0byBwcm9kdWNlIGEgcmVzdWx0Ci0gICAgLy8gdGhhdCBpcyBleGFjdGx5IHRoZSBkZXNpcmVkIHNpemUuIFRvIGJlIHJlbW92ZWQgb25jZSBidWcgNDYxMTIgaXMgZml4ZWQgKG5vdGU6Ci0gICAgLy8gYnVnIDQ2MTEyIGlzIGN1cnJlbnRseSBmbGFnZ2VkIGFzIGEgZHVwbGljYXRlLCBidXQgdGhlcmUgaXMgc3RpbGwgbm8gd29ya2Fyb3VuZCkuCi0gICAgcHJpdmF0ZSBpbnQgd2lkdGhBZGp1c3RtZW50ID0gMDsKLQotICAgIHByaXZhdGUgaW50IGhlaWdodEFkanVzdG1lbnQgPSAwOwotCi0gICAgcHJpdmF0ZSBpbnQgbWluaW11bUhlaWdodDsKLQotICAgIHByaXZhdGUgaW50IHdpZHRoQXRNaW5pbXVtSGVpZ2h0ID0gLTE7Ci0gICAgCi0gICAgLy8gSWYgdGhlIGxheW91dCBpcyBkaXJ0eSwgdGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgY29udHJvbCBhdCB0aGUgdGltZSBpdHMKLSAgICAvLyBsYXlvdXQgd2FzIGRpcnRpZWQuIG51bGwgaWYgdGhlIGxheW91dCBpcyBub3QgZGlydHkuCi0gICAgcHJpdmF0ZSBQb2ludCBkaXJ0eVNpemUgPSBudWxsOyAKLQotCi0gICAgLy8gRU5EIE9GIEhBQ0sKLQotICAgIHB1YmxpYyBTaXplQ2FjaGUoKSB7Ci0gICAgICAgIHRoaXMobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNhY2hlIGZvciBzaXplIGNvbXB1dGF0aW9ucyBvbiB0aGUgZ2l2ZW4gY29udHJvbAotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250cm9sIHRoZSBjb250cm9sIGZvciB3aGljaCBzaXplcyB3aWxsIGJlIGNhbGN1bGF0ZWQsIAotICAgICAqIG9yIG51bGwgdG8gYWx3YXlzIHJldHVybiAoMCwwKSAKLSAgICAgKi8KLSAgICBwdWJsaWMgU2l6ZUNhY2hlKENvbnRyb2wgY29udHJvbCkgewotICAgICAgICBzZXRDb250cm9sKGNvbnRyb2wpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbnRyb2wgd2hvc2Ugc2l6ZSBpcyBiZWluZyBjYWNoZWQuIERvZXMgbm90aGluZyAod2lsbCBub3QKLSAgICAgKiBldmVuIGZsdXNoIHRoZSBjYWNoZSkgaWYgdGhpcyBpcyB0aGUgc2FtZSBjb250cm9sIGFzIGxhc3QgdGltZS4gCi0gICAgICogCi0gICAgICogQHBhcmFtIG5ld0NvbnRyb2wgdGhlIGNvbnRyb2wgd2hvc2Ugc2l6ZSBpcyBiZWluZyBjYWNoZWQsIG9yIG51bGwgdG8gYWx3YXlzIHJldHVybiAoMCwwKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2woQ29udHJvbCBuZXdDb250cm9sKSB7Ci0gICAgICAgIGlmIChuZXdDb250cm9sICE9IGNvbnRyb2wpIHsKLSAgICAgICAgICAgIGNvbnRyb2wgPSBuZXdDb250cm9sOwotICAgICAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluZGVwZW5kZW50RGltZW5zaW9ucyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcHJlZmVycmVkV2lkdGhPckxhcmdlcklzTWluaW11bUhlaWdodCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHdpZHRoQWRqdXN0bWVudCA9IDA7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0QWRqdXN0bWVudCA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZGVwZW5kZW50RGltZW5zaW9ucyA9IGluZGVwZW5kZW50TGVuZ3RoQW5kV2lkdGgoY29udHJvbCk7Ci0gICAgICAgICAgICAgICAgcHJlZmVycmVkV2lkdGhPckxhcmdlcklzTWluaW11bUhlaWdodCA9IGlzUHJlZmVycmVkV2lkdGhNYXhpbXVtKGNvbnRyb2wpOwotICAgICAgICAgICAgICAgIGNvbXB1dGVIaW50T2Zmc2V0KGNvbnRyb2wpOwotICAgICAgICAgICAgICAgIGZsdXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250cm9sIHdob3NlIHNpemUgaXMgYmVpbmcgY2FjaGVkCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udHJvbCB3aG9zZSBzaXplIGlzIGJlaW5nIGNhY2hlZCwgb3IgbnVsbCBpZiB0aGlzIGNhY2hlIGFsd2F5cyByZXR1cm5zICgwLDApCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmx1c2ggdGhlIGNhY2hlIChzaG91bGQgYmUgY2FsbGVkIGlmIHRoZSBjb250cm9sJ3MgY29udGVudHMgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUKLSAgICAgKiBsYXN0IHF1ZXJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgewotICAgICAgICBmbHVzaCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmbHVzaChib29sZWFuIHJlY3Vyc2l2ZSkgewotICAgICAgICBwcmVmZXJyZWRTaXplID0gbnVsbDsKLSAgICAgICAgY2FjaGVkV2lkdGhRdWVyeSA9IC0xOwotICAgICAgICBjYWNoZWRXaWR0aFJlc3VsdCA9IC0xOwotICAgICAgICBjYWNoZWRIZWlnaHRRdWVyeSA9IC0xOwotICAgICAgICBjYWNoZWRIZWlnaHRSZXN1bHQgPSAtMTsKLSAgICAgICAgbWluaW11bVdpZHRoID0gLTE7Ci0gICAgICAgIG1heGltdW1XaWR0aCA9IC0xOwotICAgICAgICBtaW5pbXVtSGVpZ2h0ID0gLTE7Ci0gICAgICAgIGhlaWdodEF0TWluaW11bVdpZHRoID0gLTE7Ci0gICAgICAgIHdpZHRoQXRNaW5pbXVtSGVpZ2h0ID0gLTE7Ci0gICAgICAgIAotICAgICAgICBpZiAocmVjdXJzaXZlIHx8IGRpcnR5U2l6ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29udHJvbCA9PSBudWxsIHx8IGNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZGlydHlTaXplID0gbmV3IFBvaW50KDAsMCk7Ci0gICAgICAgICAgICAgICAgY29udHJvbCA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRpcnR5U2l6ZSA9IGNvbnRyb2wuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLmZsdXNoQ2hpbGRyZW4gPSB0aGlzLmZsdXNoQ2hpbGRyZW4gfHwgcmVjdXJzaXZlOwotICAgIH0KLQotICAgIHByaXZhdGUgUG9pbnQgZ2V0UHJlZmVycmVkU2l6ZSgpIHsKLSAgICAgICAgaWYgKHByZWZlcnJlZFNpemUgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJlZmVycmVkU2l6ZSA9IGNvbnRyb2xDb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByZWZlcnJlZFNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBjb250cm9sLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gd2lkdGhIaW50IHRoZSBrbm93biB3aWR0aCBvZiB0aGUgY29udHJvbCAocGl4ZWxzKSBvciBTV1QuREVGQVVMVCBpZiB1bmtub3duCi0gICAgICogQHBhcmFtIGhlaWdodEhpbnQgdGhlIGtub3duIGhlaWdodCBvZiB0aGUgY29udHJvbCAocGl4ZWxzKSBvciBTV1QuREVGQVVMVCBpZiB1bmtub3duCi0gICAgICogQHJldHVybiB0aGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQpIHsKLSAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCB8fCBjb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCgwLCAwKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSWYgd2UncmUgYXNraW5nIGZvciBhIHJlc3VsdCBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gd2lkdGgKLSAgICAgICAgaW50IG1pbldpZHRoID0gY29tcHV0ZU1pbmltdW1XaWR0aCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHdpZHRoSGludCAhPSBTV1QuREVGQVVMVCAmJiB3aWR0aEhpbnQgKyB3aWR0aEFkanVzdG1lbnQgPCBtaW5XaWR0aCkgewotICAgICAgICAgICAgaWYgKGhlaWdodEhpbnQgPT0gU1dULkRFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KG1pbldpZHRoLCBjb21wdXRlSGVpZ2h0QXRNaW5pbXVtV2lkdGgoKSk7ICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdpZHRoSGludCA9IG1pbldpZHRoIC0gd2lkdGhBZGp1c3RtZW50OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIGEgcmVzdWx0IHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSBoZWlnaHQKLSAgICAgICAgaW50IG1pbkhlaWdodCA9IGNvbXB1dGVNaW5pbXVtSGVpZ2h0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoaGVpZ2h0SGludCAhPSBTV1QuREVGQVVMVCAmJiBoZWlnaHRIaW50ICsgaGVpZ2h0QWRqdXN0bWVudCA8IG1pbkhlaWdodCkgewotICAgICAgICAgICAgaWYgKHdpZHRoSGludCA9PSBTV1QuREVGQVVMVCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQoY29tcHV0ZVdpZHRoQXRNaW5pbXVtSGVpZ2h0KCksIG1pbkhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGhlaWdodEhpbnQgPSBtaW5IZWlnaHQgLSBoZWlnaHRBZGp1c3RtZW50OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiBib3RoIGRpbWVuc2lvbnMgd2VyZSBzdXBwbGllZCBpbiB0aGUgaW5wdXQsIGNvbXB1dGUgdGhlIHRyaXZpYWwgcmVzdWx0Ci0gICAgICAgIGlmICh3aWR0aEhpbnQgIT0gU1dULkRFRkFVTFQgJiYgaGVpZ2h0SGludCAhPSBTV1QuREVGQVVMVCkgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh3aWR0aEhpbnQgKyB3aWR0aEFkanVzdG1lbnQsIGhlaWdodEhpbnQgKyBoZWlnaHRBZGp1c3RtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vIGhpbnRzIGdpdmVuIC0tIGZpbmQgdGhlIHByZWZlcnJlZCBzaXplCi0gICAgICAgIGlmICh3aWR0aEhpbnQgPT0gU1dULkRFRkFVTFQgJiYgaGVpZ2h0SGludCA9PSBTV1QuREVGQVVMVCkgewotICAgICAgICAgICAgcmV0dXJuIEdlb21ldHJ5LmNvcHkoZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBsZW5ndGggYW5kIHdpZHRoIGFyZSBpbmRlcGVuZGVudCwgY29tcHV0ZSB0aGUgcHJlZmVycmVkIHNpemUKLSAgICAgICAgLy8gYW5kIGFkanVzdCB3aGF0ZXZlciBkaW1lbnNpb24gd2FzIHN1cHBsaWVkIGluIHRoZSBpbnB1dAotICAgICAgICBpZiAoaW5kZXBlbmRlbnREaW1lbnNpb25zKSB7Ci0gICAgICAgICAgICBQb2ludCByZXN1bHQgPSBHZW9tZXRyeS5jb3B5KGdldFByZWZlcnJlZFNpemUoKSk7Ci0KLSAgICAgICAgICAgIGlmICh3aWR0aEhpbnQgIT0gU1dULkRFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQueCA9IHdpZHRoSGludCArIHdpZHRoQWRqdXN0bWVudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhlaWdodEhpbnQgIT0gU1dULkRFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQueSA9IGhlaWdodEhpbnQgKyBoZWlnaHRBZGp1c3RtZW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29tcHV0aW5nIGEgaGVpZ2h0Ci0gICAgICAgIGlmIChoZWlnaHRIaW50ID09IFNXVC5ERUZBVUxUKSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBrbm93IHRoZSBjb250cm9sJ3MgcHJlZmVycmVkIHNpemUKLSAgICAgICAgICAgIGlmIChwcmVmZXJyZWRTaXplICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZ2l2ZW4gd2lkdGggaXMgdGhlIHByZWZlcnJlZCB3aWR0aCwgdGhlbiByZXR1cm4gdGhlIHByZWZlcnJlZCBzaXplCi0gICAgICAgICAgICAgICAgaWYgKHdpZHRoSGludCArIHdpZHRoQWRqdXN0bWVudCA9PSBwcmVmZXJyZWRTaXplLngpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdlb21ldHJ5LmNvcHkocHJlZmVycmVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgY2FjaGVkIGhlaWdodCBtZWFzdXJlbWVudAotICAgICAgICAgICAgaWYgKGNhY2hlZEhlaWdodFF1ZXJ5ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgbWVhc3VyZWQgd2l0aCB0aGUgc2FtZSB3aWR0aCBoaW50Ci0gICAgICAgICAgICAgICAgaWYgKGNhY2hlZEhlaWdodFF1ZXJ5ID09IHdpZHRoSGludCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KHdpZHRoSGludCArIHdpZHRoQWRqdXN0bWVudCwgY2FjaGVkSGVpZ2h0UmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjb250cm9sIHdoZXJlIGFueSBoaW50IGxhcmdlciB0aGFuIHRoZQotICAgICAgICAgICAgLy8gcHJlZmVycmVkIHdpZHRoIHJlc3VsdHMgaW4gdGhlIG1pbmltdW0gaGVpZ2h0LCBkZXRlcm1pbmUgaWYKLSAgICAgICAgICAgIC8vIHdlIGNhbiBjb21wdXRlIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlIHByZWZlcnJlZCBoZWlnaHQKLSAgICAgICAgICAgIGlmIChwcmVmZXJyZWRXaWR0aE9yTGFyZ2VySXNNaW5pbXVtSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdGhlIHByZWZlcnJlZCBzaXplIChpZiB3ZSBkb24ndCBhbHJlYWR5IGtub3cgaXQpCi0gICAgICAgICAgICAgICAgZ2V0UHJlZmVycmVkU2l6ZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHdpZHRoIGhpbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIHByZWZlcnJlZCB3aWR0aCwgdGhlbgotICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBjb21wdXRlIHRoZSByZXN1bHQgZnJvbSB0aGUgcHJlZmVycmVkIHdpZHRoCi0gICAgICAgICAgICAgICAgaWYgKHdpZHRoSGludCArIHdpZHRoQWRqdXN0bWVudCA+PSBwcmVmZXJyZWRTaXplLngpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh3aWR0aEhpbnQgKyB3aWR0aEFkanVzdG1lbnQsIHByZWZlcnJlZFNpemUueSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFbHNlIHdlIGNhbid0IGZpbmQgYW4gZXhpc3Rpbmcgc2l6ZSBpbiB0aGUgY2FjaGUsIHNvIHJlY29tcHV0ZQotICAgICAgICAgICAgLy8gaXQgZnJvbSBzY3JhdGNoLgotICAgICAgICAgICAgUG9pbnQgbmV3SGVpZ2h0ID0gY29udHJvbENvbXB1dGVTaXplKHdpZHRoSGludCwgaGVpZ2h0SGludCk7Ci0KLSAgICAgICAgICAgIGNhY2hlZEhlaWdodFF1ZXJ5ID0gaGVpZ2h0SGludDsKLSAgICAgICAgICAgIGNhY2hlZEhlaWdodFJlc3VsdCA9IG5ld0hlaWdodC55OwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbmV3SGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29tcHV0aW5nIGEgd2lkdGgKLSAgICAgICAgaWYgKHdpZHRoSGludCA9PSBTV1QuREVGQVVMVCkgewotICAgICAgICAgICAgLy8gSWYgd2Uga25vdyB0aGUgY29udHJvbCdzIHByZWZlcnJlZCBzaXplCi0gICAgICAgICAgICBpZiAocHJlZmVycmVkU2l6ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGhlaWdodCBpcyB0aGUgcHJlZmVycmVkIGhlaWdodCwgdGhlbiByZXR1cm4gdGhlIHByZWZlcnJlZCBzaXplCi0gICAgICAgICAgICAgICAgaWYgKGhlaWdodEhpbnQgKyBoZWlnaHRBZGp1c3RtZW50ID09IHByZWZlcnJlZFNpemUueSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2VvbWV0cnkuY29weShwcmVmZXJyZWRTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBjYWNoZWQgd2lkdGggbWVhc3VyZW1lbnQgd2l0aCB0aGUgc2FtZSBoZWlnaHQgaGludAotICAgICAgICAgICAgaWYgKGNhY2hlZFdpZHRoUXVlcnkgPT0gaGVpZ2h0SGludCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQoY2FjaGVkV2lkdGhSZXN1bHQsIGhlaWdodEhpbnQgKyBoZWlnaHRBZGp1c3RtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUG9pbnQgd2lkdGhSZXN1bHQgPSBjb250cm9sQ29tcHV0ZVNpemUod2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLQotICAgICAgICAgICAgY2FjaGVkV2lkdGhRdWVyeSA9IGhlaWdodEhpbnQ7Ci0gICAgICAgICAgICBjYWNoZWRXaWR0aFJlc3VsdCA9IHdpZHRoUmVzdWx0Lng7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB3aWR0aFJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb250cm9sQ29tcHV0ZVNpemUod2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZSB0aGUgY29udHJvbCdzIHNpemUsIGFuZCBlbnN1cmUgdGhhdCBub24tZGVmYXVsdCBoaW50cyBhcmUgcmV0dXJuZWQgdmVyYmF0aW0KLSAgICAgKiAodGhpcyB0cmllcyB0byBjb21wZW5zYXRlIGZvciBTV1QncyBoaW50cywgd2hpY2ggYXJlbid0IHJlYWxseSB0aGUgb3V0ZXIgd2lkdGggb2YgdGhlCi0gICAgICogY29udHJvbCkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoSGludCB0aGUgaG9yaXpvbnRhbCBoaW50Ci0gICAgICogQHBhcmFtIGhlaWdodEhpbnQgdGhlIHZlcnRpY2FsIGhpbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250cm9sJ3Mgc2l6ZQotICAgICAqLwotICAgIHB1YmxpYyBQb2ludCBjb21wdXRlQWRqdXN0ZWRTaXplKGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50KSB7Ci0gICAgICAgIGludCBhZGp1c3RlZFdpZHRoSGludCA9IHdpZHRoSGludCA9PSBTV1QuREVGQVVMVCA/IFNXVC5ERUZBVUxUIDogTWF0aAotICAgICAgICAgICAgICAgIC5tYXgoMCwgd2lkdGhIaW50IC0gd2lkdGhBZGp1c3RtZW50KTsKLSAgICAgICAgaW50IGFkanVzdGVkSGVpZ2h0SGludCA9IGhlaWdodEhpbnQgPT0gU1dULkRFRkFVTFQgPyBTV1QuREVGQVVMVCA6IE1hdGgKLSAgICAgICAgICAgICAgICAubWF4KDAsIGhlaWdodEhpbnQgLSBoZWlnaHRBZGp1c3RtZW50KTsKLQotICAgICAgICBQb2ludCByZXN1bHQgPSBjb21wdXRlU2l6ZShhZGp1c3RlZFdpZHRoSGludCwgYWRqdXN0ZWRIZWlnaHRIaW50KTsKLQotICAgICAgICAvLyBJZiB0aGUgYW1vdW50cyB3ZSBzdWJ0cmFjdGVkIG9mZiB0aGUgd2lkdGhIaW50IGFuZCBoZWlnaHRIaW50IGRpZG4ndCBkbyB0aGUgdHJpY2ssIHRoZW4KLSAgICAgICAgLy8gbWFudWFsbHkgYWRqdXN0IHRoZSByZXN1bHQgdG8gZW5zdXJlIHRoYXQgYSBub24tZGVmYXVsdCBoaW50IHdpbGwgcmV0dXJuIHRoYXQgcmVzdWx0IHZlcmJhdGltLgotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByZWZlcnJlZCBsZW5ndGggb2YgdGhlIGdpdmVuIGNvbnRyb2wgaXMgCi0gICAgICogaW5kZXBlbmRlbnQgb2YgdGhlIHdpZHRoIGFuZCB2aXNhLXZlcnNhLiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwKLSAgICAgKiB0aGVuIGNoYW5naW5nIHRoZSB3aWR0aEhpbnQgYXJndW1lbnQgdG8gY29udHJvbC5jb21wdXRlU2l6ZSB3aWxsCi0gICAgICogbmV2ZXIgY2hhbmdlIHRoZSByZXN1bHRpbmcgaGVpZ2h0IGFuZCBjaGFuZ2luZyB0aGUgaGVpZ2h0SGludAotICAgICAqIHdpbGwgbmV2ZXIgY2hhbmdlIHRoZSByZXN1bHRpbmcgd2lkdGguIFJldHVybnMgZmFsc2UgaWYgdW5rbm93bi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgY2FjaGluZy4gSW5jb3JyZWN0bHkgcmV0dXJuaW5nCi0gICAgICogYSB2YWx1ZSBvZiBmYWxzZSBtYXkgZGVjcmVhc2UgcGVyZm9ybWFuY2UsIGJ1dCBpbmNvcnJlY3RseSByZXR1cm5pbmcgCi0gICAgICogYSB2YWx1ZSBvZiB0cnVlIHdpbGwgZ2VuZXJhdGUgaW5jb3JyZWN0IGxheW91dHMuLi4gc28gYWx3YXlzIHJldHVybgotICAgICAqIGZhbHNlIGlmIHVuc3VyZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRyb2wKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gaW5kZXBlbmRlbnRMZW5ndGhBbmRXaWR0aChDb250cm9sIGNvbnRyb2wpIHsKLSAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCB8fCBjb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEJ1dHRvbiB8fCBjb250cm9sIGluc3RhbmNlb2YgUHJvZ3Jlc3NCYXIKLSAgICAgICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgU2FzaCB8fCBjb250cm9sIGluc3RhbmNlb2YgU2NhbGUKLSAgICAgICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgU2xpZGVyIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBMaXN0Ci0gICAgICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIENvbWJvIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBUcmVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTGFiZWwgfHwgY29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiAoY29udHJvbC5nZXRTdHlsZSgpICYgU1dULldSQVApID09IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVbmxlc3Mgd2UncmUgY2VydGFpbiB0aGF0IHRoZSBjb250cm9sIGhhcyB0aGlzIHByb3BlcnR5LCB3ZSBzaG91bGQKLSAgICAgICAgLy8gcmV0dXJuIGZhbHNlLgotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ5IHRvIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2UgbmVlZCB0byBzdWJ0cmFjdCBmcm9tIHRoZSBoaW50cyB0aGF0IHdlCi0gICAgICogcGFzcyBpbnRvIHRoZSBnaXZlbiBjb250cm9sJ3MgY29tcHV0ZVNpemUoLi4uKSBtZXRob2QuIFRoaXMgdHJpZXMgdG8KLSAgICAgKiBjb21wZW5zYXRlIGZvciBidWcgNDYxMTIuIFRvIGJlIHJlbW92ZWQgb25jZSBTV1QgcHJvdmlkZXMgYW4gIm9mZmljaWFsIgotICAgICAqIHdheSB0byBjb21wdXRlIG9uZSBkaW1lbnNpb24gb2YgYSBjb250cm9sJ3Mgc2l6ZSBnaXZlbiB0aGUgb3RoZXIga25vd24KLSAgICAgKiBkaW1lbnNpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcHV0ZUhpbnRPZmZzZXQoQ29udHJvbCBjb250cm9sKSB7Ci0gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0gICAgICAgICAgICAvLyBGb3IgY29tcG9zaXRlcywgc3VidHJhY3Qgb2ZmIHRoZSB0cmltIHNpemUKLSAgICAgICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBjb250cm9sOwotICAgICAgICAgICAgUmVjdGFuZ2xlIHRyaW0gPSBjb21wb3NpdGUuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0KLSAgICAgICAgICAgIHdpZHRoQWRqdXN0bWVudCA9IHRyaW0ud2lkdGg7Ci0gICAgICAgICAgICBoZWlnaHRBZGp1c3RtZW50ID0gdHJpbS5oZWlnaHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBGb3Igbm9uLWNvbXBvc2l0ZXMsIHN1YnRyYWN0IG9mZiAyICogdGhlIGJvcmRlciBzaXplCi0gICAgICAgICAgICB3aWR0aEFkanVzdG1lbnQgPSBjb250cm9sLmdldEJvcmRlcldpZHRoKCkgKiAyOwotICAgICAgICAgICAgaGVpZ2h0QWRqdXN0bWVudCA9IHdpZHRoQWRqdXN0bWVudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUG9pbnQgY29udHJvbENvbXB1dGVTaXplKGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50KSB7Ci0gICAgICAgIFBvaW50IHJlc3VsdCA9IGNvbnRyb2wuY29tcHV0ZVNpemUod2lkdGhIaW50LCBoZWlnaHRIaW50LCBmbHVzaENoaWxkcmVuKTsKLSAgICAgICAgZmx1c2hDaGlsZHJlbiA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgb25seSBpZiB0aGUgY29udHJvbCB3aWxsIHJldHVybiBhIGNvbnN0YW50IGhlaWdodCBmb3IgYW55Ci0gICAgICogd2lkdGggaGludCBsYXJnZXIgdGhhbiB0aGUgcHJlZmVycmVkIHdpZHRoLiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzCi0gICAgICogYW55IHNpdHVhdGlvbiBpbiB3aGljaCB0aGUgY29udHJvbCBkb2VzIG5vdCBoYXZlIHRoaXMgcHJvcGVydHkuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogTm90ZTogdGhpcyBtZXRob2QgaXMgb25seSBpbXBvcnRhbnQgZm9yIHdyYXBwaW5nIGNvbnRyb2xzLCBhbmQgaXQgY2FuCi0gICAgICogc2FmZWx5IHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZWxzZS4gQUZBSUssIGFsbCBTV1QgY29udHJvbHMgaGF2ZSB0aGlzCi0gICAgICogcHJvcGVydHksIGJ1dCB0byBiZSBzYWZlIHRoZXkgd2lsbCBvbmx5IGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9uY2UgdGhlCi0gICAgICogcHJvcGVydHkgaGFzIGJlZW4gY29uZmlybWVkLgotICAgICAqIDwvcD4gCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRyb2wKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ByZWZlcnJlZFdpZHRoTWF4aW11bShDb250cm9sIGNvbnRyb2wpIHsKLSAgICAgICAgcmV0dXJuIChjb250cm9sIGluc3RhbmNlb2YgVG9vbEJhcgotICAgICAgICAvL3x8IGNvbnRyb2wgaW5zdGFuY2VvZiBDb29sQmFyCi0gICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgY29tcHV0ZU1pbmltdW1XaWR0aCgpIHsKLSAgICAgICAgaWYgKG1pbmltdW1XaWR0aCA9PSAtMSkgewotICAgIAkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLSAgICAJCQlMYXlvdXQgbGF5b3V0ID0gKChDb21wb3NpdGUpY29udHJvbCkuZ2V0TGF5b3V0KCk7Ci0gICAgCQkJaWYgKGxheW91dCBpbnN0YW5jZW9mIElMYXlvdXRFeHRlbnNpb24pIHsKLSAgICAJCQkJbWluaW11bVdpZHRoID0gKChJTGF5b3V0RXh0ZW5zaW9uKWxheW91dCkuY29tcHV0ZU1pbmltdW1XaWR0aCgoQ29tcG9zaXRlKWNvbnRyb2wsIGZsdXNoQ2hpbGRyZW4pOwotICAgIAkJCQlmbHVzaENoaWxkcmVuID0gZmFsc2U7Ci0gICAgCQkJfQotICAgIAkJfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1pbmltdW1XaWR0aCA9PSAtMSkgewotICAgICAgICAgICAgUG9pbnQgbWluV2lkdGggPSBjb250cm9sQ29tcHV0ZVNpemUoRm9ybVV0aWwuZ2V0V2lkdGhIaW50KDUsIGNvbnRyb2wpLCBTV1QuREVGQVVMVCk7IAotICAgICAgICAgICAgbWluaW11bVdpZHRoID0gbWluV2lkdGgueDsKLSAgICAgICAgICAgIGhlaWdodEF0TWluaW11bVdpZHRoID0gbWluV2lkdGgueTsKLSAgICAgICAgfQotCQkKLQkJcmV0dXJuIG1pbmltdW1XaWR0aDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBjb21wdXRlTWF4aW11bVdpZHRoKCkgewotICAgICAgICBpZiAobWF4aW11bVdpZHRoID09IC0xKSB7Ci0gICAgCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotICAgIAkJCUxheW91dCBsYXlvdXQgPSAoKENvbXBvc2l0ZSljb250cm9sKS5nZXRMYXlvdXQoKTsKLSAgICAJCQlpZiAobGF5b3V0IGluc3RhbmNlb2YgSUxheW91dEV4dGVuc2lvbikgewotICAgIAkJCQltYXhpbXVtV2lkdGggPSAoKElMYXlvdXRFeHRlbnNpb24pbGF5b3V0KS5jb21wdXRlTWF4aW11bVdpZHRoKChDb21wb3NpdGUpY29udHJvbCwgZmx1c2hDaGlsZHJlbik7Ci0gICAgCQkJCWZsdXNoQ2hpbGRyZW4gPSBmYWxzZTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF4aW11bVdpZHRoID09IC0xKSB7Ci0gICAgICAgICAgICBtYXhpbXVtV2lkdGggPSBnZXRQcmVmZXJyZWRTaXplKCkueDsKLSAgICAgICAgfQotCQkKLSAgICAgICAgcmV0dXJuIG1heGltdW1XaWR0aDsKLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY29tcHV0ZUhlaWdodEF0TWluaW11bVdpZHRoKCkgewotICAgICAgICBpbnQgbWluaW11bVdpZHRoID0gY29tcHV0ZU1pbmltdW1XaWR0aCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGhlaWdodEF0TWluaW11bVdpZHRoID09IC0xKSB7Ci0gICAgICAgICAgICBoZWlnaHRBdE1pbmltdW1XaWR0aCA9IGNvbnRyb2xDb21wdXRlU2l6ZShtaW5pbXVtV2lkdGggLSB3aWR0aEFkanVzdG1lbnQsIFNXVC5ERUZBVUxUKS55OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaGVpZ2h0QXRNaW5pbXVtV2lkdGg7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGNvbXB1dGVXaWR0aEF0TWluaW11bUhlaWdodCgpIHsKLSAgICAgICAgaW50IG1pbmltdW1IZWlnaHQgPSBjb21wdXRlTWluaW11bUhlaWdodCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHdpZHRoQXRNaW5pbXVtSGVpZ2h0ID09IC0xKSB7Ci0gICAgICAgICAgICB3aWR0aEF0TWluaW11bUhlaWdodCA9IGNvbnRyb2xDb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgbWluaW11bUhlaWdodCAtIGhlaWdodEFkanVzdG1lbnQpLng7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB3aWR0aEF0TWluaW11bUhlaWdodDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjb21wdXRlTWluaW11bUhlaWdodCgpIHsKLSAgICAgICAgaWYgKG1pbmltdW1IZWlnaHQgPT0gLTEpIHsKLSAgICAgICAgICAgIFBvaW50IHNpemVBdE1pbkhlaWdodCA9IGNvbnRyb2xDb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgMCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1pbmltdW1IZWlnaHQgPSBzaXplQXRNaW5IZWlnaHQueTsKLSAgICAgICAgICAgIHdpZHRoQXRNaW5pbXVtSGVpZ2h0ID0gc2l6ZUF0TWluSGVpZ2h0Lng7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBtaW5pbXVtSGVpZ2h0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUG9pbnQgY29tcHV0ZU1pbmltdW1TaXplKCkgewotICAgICAgICByZXR1cm4gbmV3IFBvaW50KGNvbXB1dGVNaW5pbXVtV2lkdGgoKSwgY29tcHV0ZU1pbmltdW1IZWlnaHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShQb2ludCBuZXdTaXplKSB7Ci0gICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRyb2wuc2V0U2l6ZShuZXdTaXplKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbGF5b3V0SWZOZWNlc3NhcnkoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udHJvbC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBsYXlvdXRJZk5lY2Vzc2FyeSgpOyAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250cm9sLnNldEJvdW5kcyh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbGF5b3V0SWZOZWNlc3NhcnkoKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRCb3VuZHMoUmVjdGFuZ2xlIGJvdW5kcykgewotICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250cm9sLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBsYXlvdXRJZk5lY2Vzc2FyeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxheW91dElmTmVjZXNzYXJ5KCkgewotICAgICAgICBpZiAoZGlydHlTaXplICE9IG51bGwgJiYgY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2wgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLSAgICAgICAgICAgIGlmIChjb250cm9sLmdldFNpemUoKS5lcXVhbHMoZGlydHlTaXplKSkgewotCSAgICAgICAgICAgICgoQ29tcG9zaXRlKWNvbnRyb2wpLmxheW91dChmbHVzaENoaWxkcmVuKTsKLQkgICAgICAgICAgICBmbHVzaENoaWxkcmVuID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGlydHlTaXplID0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1RhYmxlV3JhcERhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvVGFibGVXcmFwRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTc3NmUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvVGFibGVXcmFwRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLS8qKgotICogTGF5b3V0IGRhdGEgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIDxjb2RlPkhUTUxUYWJsZUxheW91dDwvY29kZT4uCi0gKiBDaGlsZHJlbiBpbiBhIGNvbXBvc2l0ZSB0aGF0IHVzZXMgdGhpcyBsYXlvdXQgc2hvdWxkIGNhbGwgPHNhbXA+c2V0TGF5b3V0RGF0YQotICogPC9zYW1wPiBhbmQgcGFzcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHRvIGNvbnRyb2wgcGh5c2ljYWwgcGxhY2VtZW50IGluCi0gKiB0aGUgcGFyZW50LgotICogCi0gKiBAc2VlIFRhYmxlV3JhcExheW91dAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGFibGVXcmFwRGF0YSB7Ci0JLyoqCi0JICogVGhlIGNvbnRyb2wgd2lsbCBiZSBsZWZ0LWp1c3RpZmllZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUID0gMSA8PCAxOwotCi0JLyoqCi0JICogVGhlIGNvbnRyb2wgd2lsbCBiZSBjZW50ZXJlZCBob3Jpem9udGFsbHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVEVSID0gMSA8PCAyOwotCi0JLyoqCi0JICogVGhlIGNvbnRyb2wgd2lsbCBiZSByaWdodC1qdXN0aWZpZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFQgPSAxIDw8IDM7Ci0KLQkvKioKLQkgKiBUaGUgY29udHJvbCB3aWxsIGJlIGFsaWduZWQgd2l0aCB0aGUgdG9wIG9mIHRoZSBjZWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPUCA9IDEgPDwgNDsKLQotCS8qKgotCSAqIFRoZSBjb250cm9sIHdpbGwgYmUgY2VudGVyZWQgdmVydGljYWxseS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSURETEUgPSAxIDw8IDU7Ci0KLQkvKioKLQkgKiBUaGUgY29udHJvbCB3aWxsIGJlIGFsaWduZWQgd2l0aCB0aGUgYm90dG9tIG9mIHRoZSBjZWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPVFRPTSA9IDEgPDwgNjsKLQotCS8qKgotCSAqIFRoZSBjb250cm9sIHdpbGwgaGF2ZSB0aGUgc2FtZSB3aWR0aCBhcyB0aGUgY29sdW1uIGl0IG9jY3VwaWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEwgPSAxIDw8IDc7Ci0KLQkvKioKLQkgKiBJbiBhZGRpdGlvbiB0byBmaWxsaW5nIHdpZHRoIG9yIGhlaWdodCwgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHBhcnQgaW4KLQkgKiBhbGxvY2F0aW9uIG9mIGFueSBleGNlc3Mgc3BhY2UuIE5vdGUgdGhhdCB0aGlzIGNvbnN0YW50IGNhbiBvbmx5IGJlCi0JICogcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciAoY2Fubm90IGJlIGRpcmVjdGx5IGFzc2lnbmVkIHRvCi0JICogPGNvZGU+YWxpZ248L2NvZGU+IHZhcmlhYmxlKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMX0dSQUIgPSAxIDw8IDg7Ci0KLQkvKioKLQkgKiBOdW1iZXIgb2YgY29sdW1ucyB0byBzcGFuIChkZWZhdWx0IGlzIDEpLgotCSAqLwotCXB1YmxpYyBpbnQgY29sc3BhbiA9IDE7Ci0KLQkvKioKLQkgKiBOdW1iZXIgb2Ygcm93cyB0byBzcGFuIChkZWZhdWx0IGlzIDEpLgotCSAqLwotCXB1YmxpYyBpbnQgcm93c3BhbiA9IDE7Ci0KLQkvKioKLQkgKiBIb3Jpem9udGFsIGFsaWdubWVudCAoTEVGVCwgQ0VOVEVSLCBSSUdIVCBvciBGSUxMOyBkZWZhdWx0IGlzIExFRlQpLgotCSAqLwotCXB1YmxpYyBpbnQgYWxpZ24gPSBMRUZUOwotCi0JLyoqCi0JICogVmVydGljYWwgYWxpZ25tZW50IChUT1AsIE1JRERMRSwgQk9UVE9NIG9yIEZJTEw7IGRlZmF1bHQgaXMgVE9QKS4KLQkgKi8KLQlwdWJsaWMgaW50IHZhbGlnbiA9IFRPUDsKLQotCS8qKgotCSAqIEhvcml6b250YWwgaW5kZW50IChkZWZhdWx0IGlzIDApLgotCSAqLwotCXB1YmxpYyBpbnQgaW5kZW50ID0gMDsKLQotCS8qKgotCSAqIE1heGltdW0gd2lkdGggb2YgdGhlIGNvbnRyb2wgKGRlZmF1bHQgaXMgU1dULkRFRkFVTFQpLgotCSAqLwotCXB1YmxpYyBpbnQgbWF4V2lkdGggPSBTV1QuREVGQVVMVDsKLQotCS8qKgotCSAqIE1heGltdW0gaGVpZ2h0IG9mIHRoZSBjb250cm9sIChkZWZhdWx0IGlzIFNXVC5ERUZBVUxUKS4KLQkgKi8KLQlwdWJsaWMgaW50IG1heEhlaWdodCA9IFNXVC5ERUZBVUxUOwotCi0JLyoqCi0JICogSGVpZ2h0IGhpbnQgb2YgdGhlIGNvbnRyb2wgKGRlZmF1bHQgaXMgU1dULkRFRkFVTFQpLgotCSAqLwotCXB1YmxpYyBpbnQgaGVpZ2h0SGludCA9IFNXVC5ERUZBVUxUOwotCi0JLyoqCi0JICogSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRha2UgcGFydCBpbiBleGNlc3MgaG9yaXpvbnRhbCBzcGFjZQotCSAqIGRpc3RyaWJ1dGlvbi4gKGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBncmFiSG9yaXpvbnRhbDsKLQotCS8qKgotCSAqIElmIDxjb2RlPnRydWU8L2NvZGU+LCB3aWxsIGdyYWIgYW55IGV4Y2VzcyB2ZXJ0aWNhbCBzcGFjZSAoZGVmYXVsdCBpcwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPikuIE5vdGUgdGhhdCBzaW5jZSBUYWJsZVdyYXBMYXlvdXQgd29ya3MgdG9wLWRvd24KLQkgKiBhbmQgZG9lcyBub3QgZ3Jvd3MgdG8gZmlsbCB0aGUgcGFyZW50LCB0aGlzIG9ubHkgYXBwbGllcyB0byBsb2NhbCBleGNlc3MKLQkgKiBzcGFjZSBjcmVhdGVkIGJ5IGZpeGVkLWhlaWdodCBjaGlsZHJlbiB0aGF0IHNwYW4gbXVsdGlwbGUgcm93cy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBncmFiVmVydGljYWw7Ci0KLQlpbnQgY2hpbGRJbmRleDsKLQotCWJvb2xlYW4gaXNJdGVtRGF0YSA9IHRydWU7Ci0KLQlpbnQgY29tcFdpZHRoOwotCi0JUG9pbnQgY29tcFNpemU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVGFibGVXcmFwRGF0YSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29udmluaWVuY2UgY29uc3RydWN0b3IgLSBhbGxvd3MgcGFzc2luZyB0aGUgaG9yaXpvbnRhbCBhbGlnbm1lbnQKLQkgKiBzdHlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWxpZ24KLQkgKiAgICAgICAgICAgIGhvcml6b250YWwgYWxpZ25tZW50IChMRUZULCBNSURETEUsIFJJR0hULCBGSUxMIG9yIEZJTExfR1JBQikuCi0JICovCi0JcHVibGljIFRhYmxlV3JhcERhdGEoaW50IGFsaWduKSB7Ci0JCXRoaXMoYWxpZ24sIFRPUCwgMSwgMSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnZpbmllbmNlIGNvbnN0cnVjdG9yIC0gYWxsb3dzIHBhc3NpbmcgdGhlIGFsaWdubWVudCBzdHlsZXMuCi0JICogCi0JICogQHBhcmFtIGFsaWduCi0JICogICAgICAgICAgICBob3Jpem9udGFsIGFsaWdubWVudCAoTEVGVCwgQ0VOVEVSLCBSSUdIVCwgRklMTCBvciBGSUxMX0dSQUIpLgotCSAqIEBwYXJhbSB2YWxpZ24KLQkgKiAgICAgICAgICAgIHZlcnRpY2FsIGFsaWdubWVudCAoVE9QLCBNSURETEUsIEJPVFRPTSwgRklMTCBvciBGSUxMX0dSQUIpLgotCSAqLwotCXB1YmxpYyBUYWJsZVdyYXBEYXRhKGludCBhbGlnbiwgaW50IHZhbGlnbikgewotCQl0aGlzKGFsaWduLCB2YWxpZ24sIDEsIDEpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb252aW5pZW5jZSBjb25zdHJ1Y3RvciAtIGFsbG93cyBwYXNzaW5nIHRoZSBhbGlnbm1lbnQgc3R5bGVzLCBjb2x1bW4KLQkgKiBhbmQgcm93IHNwYW5zLgotCSAqIAotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBhbGlnbm1lbnQgKExFRlQsIENFTlRFUiwgUklHSFQsIEZJTEwgb3IgRklMTF9HUkFCKS4KLQkgKiBAcGFyYW0gdmFsaWduCi0JICogICAgICAgICAgICB2ZXJ0aWNhbCBhbGlnbm1lbnQgKFRPUCwgTUlERExFLCBCT1RUT00sIEZJTEwgb3IgRklMTF9HUkFCKQotCSAqIEBwYXJhbSByb3dzcGFuCi0JICogICAgICAgICAgICByb3cgc3BhbiAoMSBvciBtb3JlKQotCSAqIEBwYXJhbSBjb2xzcGFuCi0JICogICAgICAgICAgICBjb2x1bW4gc3BhbiAoMSBvciBtb3JlKQotCSAqLwotCXB1YmxpYyBUYWJsZVdyYXBEYXRhKGludCBhbGlnbiwgaW50IHZhbGlnbiwgaW50IHJvd3NwYW4sIGludCBjb2xzcGFuKSB7Ci0JCWlmIChhbGlnbiAhPSBMRUZUICYmIGFsaWduICE9IENFTlRFUiAmJiBhbGlnbiAhPSBSSUdIVCAmJiBhbGlnbiAhPSBGSUxMCi0JCQkJJiYgYWxpZ24gIT0gRklMTF9HUkFCKQotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBudWxsLCAiYWxpZ24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodmFsaWduICE9IFRPUCAmJiB2YWxpZ24gIT0gTUlERExFICYmIHZhbGlnbiAhPSBCT1RUT00KLQkJCQkmJiB2YWxpZ24gIT0gRklMTCAmJiB2YWxpZ24gIT0gRklMTF9HUkFCKQotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBudWxsLCAidmFsaWduIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJvd3NwYW4gPCAxKQotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBudWxsLCAicm93c3BhbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb2xzcGFuIDwgMSkKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgbnVsbCwgImNvbHNwYW4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYWxpZ24gPT0gRklMTF9HUkFCKSB7Ci0JCQl0aGlzLmFsaWduID0gRklMTDsKLQkJCWdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJfSBlbHNlCi0JCQl0aGlzLmFsaWduID0gYWxpZ247Ci0JCWlmICh2YWxpZ24gPT0gRklMTF9HUkFCKSB7Ci0JCQl0aGlzLnZhbGlnbiA9IEZJTEw7Ci0JCQlncmFiVmVydGljYWwgPSB0cnVlOwotCQl9IGVsc2UKLQkJCXRoaXMudmFsaWduID0gdmFsaWduOwotCQl0aGlzLnJvd3NwYW4gPSByb3dzcGFuOwotCQl0aGlzLmNvbHNwYW4gPSBjb2xzcGFuOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvVGFibGVXcmFwTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1RhYmxlV3JhcExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGM3YmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvVGFibGVXcmFwTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGF5b3V0IGFsZ29yaXRobSBhdHRlbXB0cyB0byBwb3NpdGlvbiBjb250cm9scyBpbgotICogdGhlIGNvbXBvc2l0ZSB1c2luZyBhIHR3by1wYXNzIGF1dG9sYXlvdXQgSFRNTCB0YWJsZSBhbHRvcml0aG0gcmVjb21tZWRlZCBieQotICogSFRNTCA0LjAxIFczQyBzcGVjaWZpY2F0aW9uIChzZWUKLSAqIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2FwcGVuZGl4L25vdGVzLmh0bWwjaC1CLjUuMi4yKS4gVGhlIG1haW4KLSAqIGRpZmZlcmVuY2VzIHdpdGggR3JpZExheW91dCBpcyB0aGF0IGl0IGhhcyB0d28gcGFzc2VzIGFuZCB0aGF0IHdpZHRoIGFuZAotICogaGVpZ2h0IGFyZSBub3QgY2FsY3VsYXRlZCBpbiB0aGUgc2FtZSBwYXNzLgotICogPHA+Ci0gKiBUaGUgYWR2YW50YWdlIG9mIHRoZSBhbGdvcml0aG0gb3ZlciBHcmlkTGF5b3V0IGlzIHRoYXQgaXQgaXMgY2FwYWJsZSBvZgotICogZmxvd2luZyB0ZXh0IGNvbnRyb2xzIGNhcGFibGUgb2YgbGluZSB3cmFwLiBUaGVzZSBjb250cm9scyBkbyBub3QgaGF2ZQotICogbmF0dXJhbCAncHJlZmVycmVkIHNpemUnLiBJbnN0ZWFkLCB0aGV5IGFyZSBjYXBhYmxlIG9mIHByb3ZpZGluZyB0aGUgcmVxdWlyZWQKLSAqIGhlaWdodCBpZiB0aGUgd2lkdGggaXMgc2V0LiBDb25zZXF1ZW50bHksIHRoaXMgYWxnb3JpdGhtIGZpcnN0IGNhbGN1bGF0ZXMgdGhlCi0gKiB3aWR0aHMgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGNvbHVtbnMsIGFuZCB0aGVuIHBhc3NlcyB0aG9zZSB3aWR0aHMgdG8gdGhlCi0gKiBjb250cm9scyB0byBjYWxjdWxhdGUgdGhlIGhlaWdodC4gV2hlbiBhIGNvbXBvc2l0ZSB3aXRoIHRoaXMgbGF5b3V0IGlzIGEKLSAqIGNoaWxkIG9mIHRoZSBzY3JvbGxpbmcgY29tcG9zaXRlLCB0aGV5IHNob3VsZCBpbnRlcmFjdCBpbiBzdWNoIGEgd2F5IHRoYXQKLSAqIHJlZHVjdGlvbiBpbiB0aGUgc2Nyb2xsaW5nIGNvbXBvc2l0ZSB3aWR0aCByZXN1bHRzIGluIHRoZSByZWZsb3cgYW5kIGluY3JlYXNlCi0gKiBvZiB0aGUgb3ZlcmFsbCBoZWlnaHQuCi0gKiA8cD4KLSAqIElmIG5vbmUgb2YgdGhlIGNvbHVtbnMgY29udGFpbiBleHBhbmRhYmxlIGFuZCB3cmFwcGFibGUgY29udHJvbHMsIHRoZQotICogZW5kLXJlc3VsdCB3aWxsIGJlIHNpbWlsYXIgdG8gdGhlIG9uZSBwcm92aWRlZCBieSBHcmlkTGF5b3V0LiBUaGUgZGlmZmVyZW5jZQotICogd2lsbCBzaG93IHVwIGZvciBsYXlvdXRzIHRoYXQgY29udGFpbiBjb250cm9scyB3aG9zZSBtaW5pbXVtIGFuZCBtYXhpbXVtCi0gKiB3aWR0aHMgYXJlIG5vdCB0aGUgc2FtZS4KLSAqIAotICogQHNlZSBUYWJsZVdyYXBEYXRhCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZVdyYXBMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgaW1wbGVtZW50cyBJTGF5b3V0RXh0ZW5zaW9uIHsKLQkvKioKLQkgKiBOdW1iZXIgb2YgY29sdW1ucyB0byB1c2Ugd2hlbiBwb3NpdGlvbmluZyBjaGlsZHJlbiAoZGVmYXVsdCBpcyAxKS4KLQkgKi8KLQlwdWJsaWMgaW50IG51bUNvbHVtbnMgPSAxOwotCi0JLyoqCi0JICogTGVmdCBtYXJnaW4gdmFyaWFibGUgKGRlZmF1bHQgaXMgNSkuCi0JICovCi0JcHVibGljIGludCBsZWZ0TWFyZ2luID0gNTsKLQotCS8qKgotCSAqIFJpZ2h0IG1hcmdpbiB2YXJpYWJsZSAoZGVmYXVsdCBpcyA1KS4KLQkgKi8KLQlwdWJsaWMgaW50IHJpZ2h0TWFyZ2luID0gNTsKLQotCS8qKgotCSAqIFRvcCBtYXJnaW4gdmFyaWFibGUgKGRlZmF1bHQgaXMgNSkuCi0JICovCi0JcHVibGljIGludCB0b3BNYXJnaW4gPSA1OwotCi0JLyoqCi0JICogQm90b20gbWFyZ2luIHZhcmlhYmxlIChkZWZhdWx0IGlzIDUpLgotCSAqLwotCXB1YmxpYyBpbnQgYm90dG9tTWFyZ2luID0gNTsKLQotCS8qKgotCSAqIEhvcml6b250YWwgc3BhY2luZyAoZGVmYXVsdCBpcyA1KS4KLQkgKi8KLQlwdWJsaWMgaW50IGhvcml6b250YWxTcGFjaW5nID0gNTsKLQotCS8qKgotCSAqIFZlcnRpY2FsIHNwYWNpbmcgKGRlZmF1bHQgaXMgNSkuCi0JICovCi0JcHVibGljIGludCB2ZXJ0aWNhbFNwYWNpbmcgPSA1OwotCi0JLyoqCi0JICogSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBhbGwgdGhlIGNvbHVtbnMgd2lsbCBoYXZlIHRoZSBzYW1lIHdpZHRoLgotCSAqIE90aGVyd2lzZSwgY29sdW1uIHdpZHRocyB3aWxsIGJlIGNvbXB1dGVkIGJhc2VkIG9uIGNvbnRyb2xzIGluIHRoZW0gYW5kCi0JICogdGhlaXIgbGF5b3V0IGRhdGEgKGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsTGF5b3V0ID0gdHJ1ZTsKLQotCXByaXZhdGUgVmVjdG9yIGdyaWQgPSBudWxsOwotCi0JcHJpdmF0ZSBIYXNodGFibGUgcm93c3BhbnM7Ci0KLQlwcml2YXRlIGludFtdIG1pbkNvbHVtbldpZHRocywgbWF4Q29sdW1uV2lkdGhzOwotCi0JcHJpdmF0ZSBpbnQgd2lkZXN0Q29sdW1uV2lkdGg7Ci0KLQlwcml2YXRlIGludFtdIGdyb3dpbmdDb2x1bW5zOwotCi0JcHJpdmF0ZSBpbnRbXSBncm93aW5nUm93czsKLQotCXByaXZhdGUgTGF5b3V0Q2FjaGUgY2FjaGUgPSBuZXcgTGF5b3V0Q2FjaGUoKTsKLQotCXByaXZhdGUgY2xhc3MgUm93U3BhbiB7Ci0JCUNvbnRyb2wgY2hpbGQ7Ci0KLQkJaW50IHJvdzsKLQotCQlpbnQgY29sdW1uOwotCi0JCWludCBoZWlnaHQ7Ci0KLQkJaW50IHRvdGFsSGVpZ2h0OwotCi0JCXB1YmxpYyBSb3dTcGFuKENvbnRyb2wgY2hpbGQsIGludCBjb2x1bW4sIGludCByb3cpIHsKLQkJCXRoaXMuY2hpbGQgPSBjaGlsZDsKLQkJCXRoaXMuY29sdW1uID0gY29sdW1uOwotCQkJdGhpcy5yb3cgPSByb3c7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGUoaW50IGN1cnJlbnRSb3csIGludCByb3dIZWlnaHQpIHsKLQkJCVRhYmxlV3JhcERhdGEgdGQgPSAoVGFibGVXcmFwRGF0YSkgY2hpbGQuZ2V0TGF5b3V0RGF0YSgpOwotCQkJaWYgKGN1cnJlbnRSb3cgLSByb3cgPD0gdGQucm93c3BhbiAtIDEpIHsKLQkJCQl0b3RhbEhlaWdodCArPSByb3dIZWlnaHQ7Ci0JCQkJaWYgKGN1cnJlbnRSb3cgPiByb3cpCi0JCQkJCXRvdGFsSGVpZ2h0ICs9IHZlcnRpY2FsU3BhY2luZzsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVxdWlyZWRIZWlnaHRJbmNyZWFzZSgpIHsKLQkJCWlmICh0b3RhbEhlaWdodCA8IGhlaWdodCkKLQkJCQlyZXR1cm4gaGVpZ2h0IC0gdG90YWxIZWlnaHQ7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudHMgSUxheW91dEV4dGVuc2lvbi4gU2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCi0JICogCi0JICogQHNlZSBJTGF5b3V0RXh0ZW5zaW9uCi0JICovCi0JcHVibGljIGludCBjb21wdXRlTWluaW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotCQlpZiAoY2hhbmdlZCkgewotCQkJY2FjaGUuZmx1c2goKTsKLQkJfQotCi0JCWNhY2hlLnNldENvbnRyb2xzKGNoaWxkcmVuKTsKLQotCQljaGFuZ2VkID0gdHJ1ZTsKLQkJaW5pdGlhbGl6ZUlmTmVlZGVkKHBhcmVudCwgY2hhbmdlZCk7Ci0JCWlmIChpbml0aWFsTGF5b3V0KSB7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCWluaXRpYWxMYXlvdXQgPSBmYWxzZTsKLQkJfQotCQlpZiAoZ3JpZCA9PSBudWxsIHx8IGNoYW5nZWQpIHsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJZ3JpZCA9IG5ldyBWZWN0b3IoKTsKLQkJCWNyZWF0ZUdyaWQocGFyZW50KTsKLQkJfQotCQlpZiAobWluQ29sdW1uV2lkdGhzID09IG51bGwpCi0JCQltaW5Db2x1bW5XaWR0aHMgPSBuZXcgaW50W251bUNvbHVtbnNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgewotCQkJbWluQ29sdW1uV2lkdGhzW2ldID0gMDsKLQkJfQotCQlyZXR1cm4gaW50ZXJuYWxHZXRNaW5pbXVtV2lkdGgocGFyZW50LCBjaGFuZ2VkKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRzIElMYXlvdXRFeHRlbnNpb24uIFNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LgotCSAqIAotCSAqIEBzZWUgSUxheW91dEV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBpbnQgY29tcHV0ZU1heGltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0JCWlmIChjaGFuZ2VkKSB7Ci0JCQljYWNoZS5mbHVzaCgpOwotCQl9Ci0KLQkJY2FjaGUuc2V0Q29udHJvbHMoY2hpbGRyZW4pOwotCi0JCWNoYW5nZWQgPSB0cnVlOwotCQlpbml0aWFsaXplSWZOZWVkZWQocGFyZW50LCBjaGFuZ2VkKTsKLQkJaWYgKGluaXRpYWxMYXlvdXQpIHsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJaW5pdGlhbExheW91dCA9IGZhbHNlOwotCQl9Ci0JCWlmIChncmlkID09IG51bGwgfHwgY2hhbmdlZCkgewotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQlncmlkID0gbmV3IFZlY3RvcigpOwotCQkJY3JlYXRlR3JpZChwYXJlbnQpOwotCQl9Ci0JCWlmIChtYXhDb2x1bW5XaWR0aHMgPT0gbnVsbCkKLQkJCW1heENvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7Ci0JCQltYXhDb2x1bW5XaWR0aHNbaV0gPSAwOwotCQl9Ci0JCXJldHVybiBpbnRlcm5hbEdldE1heGltdW1XaWR0aChwYXJlbnQsIGNoYW5nZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGF5b3V0I2xheW91dChDb21wb3NpdGUsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0JCWlmIChjaGFuZ2VkKSB7Ci0JCQljYWNoZS5mbHVzaCgpOwotCQl9Ci0KLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCWNhY2hlLnNldENvbnRyb2xzKGNoaWxkcmVuKTsKLQotCQlpbnQgcGFyZW50V2lkdGggPSBjbGllbnRBcmVhLndpZHRoOwotCQljaGFuZ2VkID0gdHJ1ZTsKLQkJaW5pdGlhbGl6ZUlmTmVlZGVkKHBhcmVudCwgY2hhbmdlZCk7Ci0JCWlmIChpbml0aWFsTGF5b3V0KSB7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCWluaXRpYWxMYXlvdXQgPSBmYWxzZTsKLQkJfQotCQlpZiAoZ3JpZCA9PSBudWxsIHx8IGNoYW5nZWQpIHsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJZ3JpZCA9IG5ldyBWZWN0b3IoKTsKLQkJCWNyZWF0ZUdyaWQocGFyZW50KTsKLQkJfQotCQlyZXNldENvbHVtbldpZHRocygpOwotCQlpbnQgbWluV2lkdGggPSBpbnRlcm5hbEdldE1pbmltdW1XaWR0aChwYXJlbnQsIGNoYW5nZWQpOwotCQlpbnQgbWF4V2lkdGggPSBpbnRlcm5hbEdldE1heGltdW1XaWR0aChwYXJlbnQsIGNoYW5nZWQpOwotCQlpbnQgdGFibGVXaWR0aCA9IHBhcmVudFdpZHRoOwotCQlpbnRbXSBjb2x1bW5XaWR0aHM7Ci0JCWlmIChwYXJlbnRXaWR0aCA8PSBtaW5XaWR0aCkgewotCQkJdGFibGVXaWR0aCA9IG1pbldpZHRoOwotCQkJaWYgKG1ha2VDb2x1bW5zRXF1YWxXaWR0aCkgewotCQkJCWNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsKLQkJCQkJY29sdW1uV2lkdGhzW2ldID0gd2lkZXN0Q29sdW1uV2lkdGg7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJY29sdW1uV2lkdGhzID0gbWluQ29sdW1uV2lkdGhzOwotCQl9IGVsc2UgaWYgKHBhcmVudFdpZHRoID4gbWF4V2lkdGgpIHsKLQkJCWlmIChncm93aW5nQ29sdW1ucy5sZW5ndGggPT0gMCkgewotCQkJCXRhYmxlV2lkdGggPSBtYXhXaWR0aDsKLQkJCQljb2x1bW5XaWR0aHMgPSBtYXhDb2x1bW5XaWR0aHM7Ci0JCQl9IGVsc2UgewotCQkJCWNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107Ci0JCQkJaW50IGNvbFNwYWNlID0gdGFibGVXaWR0aCAtIGxlZnRNYXJnaW4gLSByaWdodE1hcmdpbjsKLQkJCQljb2xTcGFjZSAtPSAobnVtQ29sdW1ucyAtIDEpICogaG9yaXpvbnRhbFNwYWNpbmc7Ci0JCQkJaW50IGV4dHJhID0gcGFyZW50V2lkdGggLSBtYXhXaWR0aDsKLQkJCQlpbnQgY29sRXh0cmEgPSBleHRyYSAvIGdyb3dpbmdDb2x1bW5zLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgewotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSBtYXhDb2x1bW5XaWR0aHNbaV07Ci0JCQkJCWlmIChpc0dyb3dpbmdDb2x1bW4oaSkpIHsKLQkJCQkJCWNvbHVtbldpZHRoc1tpXSArPSBjb2xFeHRyYTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107Ci0JCQlpZiAobWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7Ci0JCQkJaW50IGNvbFNwYWNlID0gdGFibGVXaWR0aCAtIGxlZnRNYXJnaW4gLSByaWdodE1hcmdpbjsKLQkJCQljb2xTcGFjZSAtPSAobnVtQ29sdW1ucyAtIDEpICogaG9yaXpvbnRhbFNwYWNpbmc7Ci0JCQkJaW50IGNvbCA9IGNvbFNwYWNlIC8gbnVtQ29sdW1uczsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgewotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSBjb2w7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQljb2x1bW5XaWR0aHMgPSBhc3NpZ25FeHRyYVNwYWNlKHRhYmxlV2lkdGgsIG1heFdpZHRoLCBtaW5XaWR0aCk7Ci0JCQl9Ci0JCX0KLQkJaW50IHkgPSB0b3BNYXJnaW4rY2xpZW50QXJlYS55OwotCQlpbnRbXSByb3dIZWlnaHRzID0gY29tcHV0ZVJvd0hlaWdodHMoY2hpbGRyZW4sIGNvbHVtbldpZHRocywgY2hhbmdlZCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZC5zaXplKCk7IGkrKykgewotCQkJaW50IHJvd0hlaWdodCA9IHJvd0hlaWdodHNbaV07Ci0JCQlpbnQgeCA9IGxlZnRNYXJnaW4rY2xpZW50QXJlYS54OwotCQkJVGFibGVXcmFwRGF0YVtdIHJvdyA9IChUYWJsZVdyYXBEYXRhW10pIGdyaWQuZWxlbWVudEF0KGkpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBudW1Db2x1bW5zOyBqKyspIHsKLQkJCQlUYWJsZVdyYXBEYXRhIHRkID0gcm93W2pdOwotCQkJCWlmICh0ZC5pc0l0ZW1EYXRhKSB7Ci0JCQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlblt0ZC5jaGlsZEluZGV4XTsKLQkJCQkJcGxhY2VDb250cm9sKGNoaWxkLCB0ZCwgeCwgeSwgcm93SGVpZ2h0cywgaSk7Ci0JCQkJfQotCQkJCXggKz0gY29sdW1uV2lkdGhzW2pdOwotCQkJCWlmIChqIDwgbnVtQ29sdW1ucyAtIDEpCi0JCQkJCXggKz0gaG9yaXpvbnRhbFNwYWNpbmc7Ci0JCQl9Ci0JCQl5ICs9IHJvd0hlaWdodCArIHZlcnRpY2FsU3BhY2luZzsKLQkJfQotCX0KLQotCWludFtdIGNvbXB1dGVSb3dIZWlnaHRzKENvbnRyb2xbXSBjaGlsZHJlbiwgaW50W10gY29sdW1uV2lkdGhzLAotCQkJYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JCWludFtdIHJvd0hlaWdodHMgPSBuZXcgaW50W2dyaWQuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncmlkLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWJsZVdyYXBEYXRhW10gcm93ID0gKFRhYmxlV3JhcERhdGFbXSkgZ3JpZC5lbGVtZW50QXQoaSk7Ci0JCQlyb3dIZWlnaHRzW2ldID0gMDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbnVtQ29sdW1uczsgaisrKSB7Ci0JCQkJVGFibGVXcmFwRGF0YSB0ZCA9IHJvd1tqXTsKLQkJCQlpZiAodGQuaXNJdGVtRGF0YSA9PSBmYWxzZSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW3RkLmNoaWxkSW5kZXhdOwotCQkJCWludCBzcGFuID0gdGQuY29sc3BhbjsKLQkJCQlpbnQgY3dpZHRoID0gMDsKLQkJCQlmb3IgKGludCBrID0gajsgayA8IGogKyBzcGFuOyBrKyspIHsKLQkJCQkJY3dpZHRoICs9IGNvbHVtbldpZHRoc1trXTsKLQkJCQkJaWYgKGsgPCBqICsgc3BhbiAtIDEpCi0JCQkJCQljd2lkdGggKz0gaG9yaXpvbnRhbFNwYWNpbmc7Ci0JCQkJfQotCQkJCVBvaW50IHNpemUgPSBjb21wdXRlU2l6ZSh0ZC5jaGlsZEluZGV4LCBjd2lkdGgsIHRkLmluZGVudCwgdGQubWF4V2lkdGgsIHRkLm1heEhlaWdodCk7Ci0JCQkJdGQuY29tcFdpZHRoID0gY3dpZHRoOwotCQkJCWlmICh0ZC5oZWlnaHRIaW50ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJCXNpemUgPSBuZXcgUG9pbnQoc2l6ZS54LCB0ZC5oZWlnaHRIaW50KTsKLQkJCQl9Ci0JCQkJdGQuY29tcFNpemUgPSBzaXplOwotCQkJCVJvd1NwYW4gcm93c3BhbiA9IChSb3dTcGFuKSByb3dzcGFucy5nZXQoY2hpbGQpOwotCQkJCWlmIChyb3dzcGFuID09IG51bGwpIHsKLQkJCQkJcm93SGVpZ2h0c1tpXSA9IE1hdGgubWF4KHJvd0hlaWdodHNbaV0sIHNpemUueSk7Ci0JCQkJfSBlbHNlCi0JCQkJCXJvd3NwYW4uaGVpZ2h0ID0gc2l6ZS55OwotCQkJfQotCQkJdXBkYXRlUm93U3BhbnMoaSwgcm93SGVpZ2h0c1tpXSk7Ci0JCX0KLQkJZm9yIChFbnVtZXJhdGlvbiBlbm0gPSByb3dzcGFucy5lbGVtZW50cygpOyBlbm0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlSb3dTcGFuIHJvd3NwYW4gPSAoUm93U3BhbikgZW5tLm5leHRFbGVtZW50KCk7Ci0JCQlpbnQgaW5jcmVhc2UgPSByb3dzcGFuLmdldFJlcXVpcmVkSGVpZ2h0SW5jcmVhc2UoKTsKLQkJCWlmIChpbmNyZWFzZSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJVGFibGVXcmFwRGF0YSB0ZCA9IChUYWJsZVdyYXBEYXRhKSByb3dzcGFuLmNoaWxkLmdldExheW91dERhdGEoKTsKLQkJCWludCBuZ3Jvd2luZyA9IDA7Ci0JCQlpbnRbXSBhZmZlY3RlZFJvd3MgPSBuZXcgaW50W2dyaWQuc2l6ZSgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZ3Jvd2luZ1Jvd3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgZ3Jvd2luZ1JvdyA9IGdyb3dpbmdSb3dzW2ldOwotCQkJCWlmIChncm93aW5nUm93ID49IHJvd3NwYW4ucm93Ci0JCQkJCQkmJiBncm93aW5nUm93IDwgcm93c3Bhbi5yb3cgKyB0ZC5yb3dzcGFuKSB7Ci0JCQkJCWFmZmVjdGVkUm93c1tuZ3Jvd2luZysrXSA9IGdyb3dpbmdSb3c7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ncm93aW5nID09IDApIHsKLQkJCQluZ3Jvd2luZyA9IDE7Ci0JCQkJYWZmZWN0ZWRSb3dzWzBdID0gcm93c3Bhbi5yb3cgKyB0ZC5yb3dzcGFuIC0gMTsKLQkJCX0KLQkJCWluY3JlYXNlICs9IGluY3JlYXNlICUgbmdyb3dpbmc7Ci0JCQlpbnQgcGVyUm93SW5jcmVhc2UgPSBpbmNyZWFzZSAvIG5ncm93aW5nOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZ3Jvd2luZzsgaSsrKSB7Ci0JCQkJaW50IGdyb3dpbmdSb3cgPSBhZmZlY3RlZFJvd3NbaV07Ci0JCQkJcm93SGVpZ2h0c1tncm93aW5nUm93XSArPSBwZXJSb3dJbmNyZWFzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm93SGVpZ2h0czsKLQl9Ci0KLQlib29sZWFuIGlzR3Jvd2luZ0NvbHVtbihpbnQgY29sKSB7Ci0JCWlmIChncm93aW5nQ29sdW1ucyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3dpbmdDb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29sID09IGdyb3dpbmdDb2x1bW5zW2ldKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpbnRbXSBhc3NpZ25FeHRyYVNwYWNlKGludCB0YWJsZVdpZHRoLCBpbnQgbWF4V2lkdGgsIGludCBtaW5XaWR0aCkgewotCQlpbnQgZml4ZWRQYXJ0ID0gbGVmdE1hcmdpbiArIHJpZ2h0TWFyZ2luICsgKG51bUNvbHVtbnMgLSAxKQotCQkJCSogaG9yaXpvbnRhbFNwYWNpbmc7Ci0JCWludCBEID0gbWF4V2lkdGggLSBtaW5XaWR0aDsKLQkJaW50IFcgPSB0YWJsZVdpZHRoIC0gZml4ZWRQYXJ0IC0gbWluV2lkdGg7Ci0JCWludCB3aWR0aHNbXSA9IG5ldyBpbnRbbnVtQ29sdW1uc107Ci0JCWludCByZW0gPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgewotCQkJaW50IGNtaW4gPSBtaW5Db2x1bW5XaWR0aHNbaV07Ci0JCQlpbnQgY21heCA9IG1heENvbHVtbldpZHRoc1tpXTsKLQkJCWludCBkID0gY21heCAtIGNtaW47Ci0JCQlpbnQgZXh0cmEgPSBEICE9IDAgPyAoZCAqIFcpIC8gRCA6IDA7Ci0JCQlpZiAoaSA8IG51bUNvbHVtbnMgLSAxKSB7Ci0JCQkJd2lkdGhzW2ldID0gY21pbiArIGV4dHJhOwotCQkJCXJlbSArPSB3aWR0aHNbaV07Ci0JCQl9IGVsc2UgewotCQkJCXdpZHRoc1tpXSA9IHRhYmxlV2lkdGggLSBmaXhlZFBhcnQgLSByZW07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdpZHRoczsKLQl9Ci0KLQlQb2ludCBjb21wdXRlU2l6ZShpbnQgY2hpbGRJbmRleCwgaW50IHdpZHRoLCBpbnQgaW5kZW50LCBpbnQgbWF4V2lkdGgsIGludCBtYXhIZWlnaHQpIHsKLQkJaW50IHdpZHRoQXJnID0gd2lkdGggLSBpbmRlbnQ7Ci0JCVNpemVDYWNoZSBjb250cm9sQ2FjaGUgPSBjYWNoZS5nZXRDYWNoZShjaGlsZEluZGV4KTsKLQkJaWYgKCFpc1dyYXAoY29udHJvbENhY2hlLmdldENvbnRyb2woKSkpCi0JCQl3aWR0aEFyZyA9IFNXVC5ERUZBVUxUOwotCQlQb2ludCBzaXplID0gY29udHJvbENhY2hlLmNvbXB1dGVTaXplKHdpZHRoQXJnLCBTV1QuREVGQVVMVCk7Ci0JCWlmIChtYXhXaWR0aCE9U1dULkRFRkFVTFQpCi0JCQlzaXplLnggPSBNYXRoLm1pbihzaXplLngsIG1heFdpZHRoKTsKLQkJaWYgKG1heEhlaWdodCE9U1dULkRFRkFVTFQpCi0JCQlzaXplLnkgPSBNYXRoLm1pbihzaXplLnksIG1heEhlaWdodCk7Ci0JCXNpemUueCArPSBpbmRlbnQ7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCXZvaWQgcGxhY2VDb250cm9sKENvbnRyb2wgY29udHJvbCwgVGFibGVXcmFwRGF0YSB0ZCwgaW50IHgsIGludCB5LAotCQkJaW50W10gcm93SGVpZ2h0cywgaW50IHJvdykgewotCQlpbnQgeGxvYyA9IHggKyB0ZC5pbmRlbnQ7Ci0JCWludCB5bG9jID0geTsKLQkJaW50IGhlaWdodCA9IHRkLmNvbXBTaXplLnk7Ci0JCWludCBjb2xXaWR0aCA9IHRkLmNvbXBXaWR0aCAtIHRkLmluZGVudDsKLQkJaW50IHdpZHRoID0gdGQuY29tcFNpemUueC10ZC5pbmRlbnQ7Ci0JCXdpZHRoID0gTWF0aC5taW4od2lkdGgsIGNvbFdpZHRoKTsKLQkJaW50IHNsb3RIZWlnaHQgPSByb3dIZWlnaHRzW3Jvd107Ci0JCVJvd1NwYW4gcm93c3BhbiA9IChSb3dTcGFuKSByb3dzcGFucy5nZXQoY29udHJvbCk7Ci0JCWlmIChyb3dzcGFuICE9IG51bGwpIHsKLQkJCXNsb3RIZWlnaHQgPSAwOwotCQkJZm9yIChpbnQgaSA9IHJvdzsgaSA8IHJvdyArIHRkLnJvd3NwYW47IGkrKykgewotCQkJCWlmIChpID4gcm93KQotCQkJCQlzbG90SGVpZ2h0ICs9IHZlcnRpY2FsU3BhY2luZzsKLQkJCQlzbG90SGVpZ2h0ICs9IHJvd0hlaWdodHNbaV07Ci0JCQl9Ci0JCX0KLQkJLy8gYWxpZ24gaG9yaXpvbnRhbGx5Ci0JCWlmICh0ZC5hbGlnbiA9PSBUYWJsZVdyYXBEYXRhLkNFTlRFUikgewotCQkJeGxvYyA9IHggKyBjb2xXaWR0aCAvIDIgLSB3aWR0aCAvIDI7Ci0JCX0gZWxzZSBpZiAodGQuYWxpZ24gPT0gVGFibGVXcmFwRGF0YS5SSUdIVCkgewotCQkJeGxvYyA9IHggKyBjb2xXaWR0aCAtIHdpZHRoOwotCQl9IGVsc2UgaWYgKHRkLmFsaWduID09IFRhYmxlV3JhcERhdGEuRklMTCkgewotCQkJd2lkdGggPSBjb2xXaWR0aDsKLQkJfQotCQkvLyBhbGlnbiB2ZXJ0aWNhbGx5Ci0JCWlmICh0ZC52YWxpZ24gPT0gVGFibGVXcmFwRGF0YS5NSURETEUpIHsKLQkJCXlsb2MgPSB5ICsgc2xvdEhlaWdodCAvIDIgLSBoZWlnaHQgLyAyOwotCQl9IGVsc2UgaWYgKHRkLnZhbGlnbiA9PSBUYWJsZVdyYXBEYXRhLkJPVFRPTSkgewotCQkJeWxvYyA9IHkgKyBzbG90SGVpZ2h0IC0gaGVpZ2h0OwotCQl9IGVsc2UgaWYgKHRkLnZhbGlnbiA9PSBUYWJsZVdyYXBEYXRhLkZJTEwpIHsKLQkJCWhlaWdodCA9IHNsb3RIZWlnaHQ7Ci0JCX0KLQkJY29udHJvbC5zZXRCb3VuZHMoeGxvYywgeWxvYywgd2lkdGgsIGhlaWdodCk7Ci0JfQotCi0Jdm9pZCBjcmVhdGVHcmlkKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaW50IHJvdywgY29sdW1uLCByb3dGaWxsLCBjb2x1bW5GaWxsOwotCQlDb250cm9sW10gY2hpbGRyZW47Ci0JCVRhYmxlV3JhcERhdGEgc3BhY2VyU3BlYzsKLQkJVmVjdG9yIGdyb3dpbmdDb2xzID0gbmV3IFZlY3RvcigpOwotCQlWZWN0b3IgZ3Jvd2luZ1Jvd3MgPSBuZXcgVmVjdG9yKCk7Ci0JCXJvd3NwYW5zID0gbmV3IEhhc2h0YWJsZSgpOwotCQkvLyAKLQkJY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQkvLyAKLQkJZ3JpZC5hZGRFbGVtZW50KGNyZWF0ZUVtcHR5Um93KCkpOwotCQlyb3cgPSAwOwotCQljb2x1bW4gPSAwOwotCQkvLyBMb29wIHRocm91Z2ggdGhlIGNoaWxkcmVuIGFuZCBwbGFjZSB0aGVpciBhc3NvY2lhdGVkIGxheW91dCBzcGVjcyBpbgotCQkvLyB0aGUKLQkJLy8gZ3JpZC4gUGxhY2VtZW50IG9jY3VycyBsZWZ0IHRvIHJpZ2h0LCB0b3AgdG8gYm90dG9tIChpLmUuLCBieSByb3cpLgotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBGaW5kIHRoZSBmaXJzdCBhdmFpbGFibGUgc3BvdCBpbiB0aGUgZ3JpZC4KLQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCVRhYmxlV3JhcERhdGEgc3BlYyA9IChUYWJsZVdyYXBEYXRhKSBjaGlsZC5nZXRMYXlvdXREYXRhKCk7Ci0JCQl3aGlsZSAoKChUYWJsZVdyYXBEYXRhW10pIGdyaWQuZWxlbWVudEF0KHJvdykpW2NvbHVtbl0gIT0gbnVsbCkgewotCQkJCWNvbHVtbiA9IGNvbHVtbiArIDE7Ci0JCQkJaWYgKGNvbHVtbiA+PSBudW1Db2x1bW5zKSB7Ci0JCQkJCXJvdyA9IHJvdyArIDE7Ci0JCQkJCWNvbHVtbiA9IDA7Ci0JCQkJCWlmIChyb3cgPj0gZ3JpZC5zaXplKCkpIHsKLQkJCQkJCWdyaWQuYWRkRWxlbWVudChjcmVhdGVFbXB0eVJvdygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIFNlZSBpZiB0aGUgcGxhY2Ugd2lsbCBzdXBwb3J0IHRoZSB3aWRnZXQncyBob3Jpem9udGFsIHNwYW4uIElmCi0JCQkvLyBub3QsIGdvIHRvIHRoZQotCQkJLy8gbmV4dCByb3cuCi0JCQlpZiAoY29sdW1uICsgc3BlYy5jb2xzcGFuIC0gMSA+PSBudW1Db2x1bW5zKSB7Ci0JCQkJZ3JpZC5hZGRFbGVtZW50KGNyZWF0ZUVtcHR5Um93KCkpOwotCQkJCXJvdyA9IHJvdyArIDE7Ci0JCQkJY29sdW1uID0gMDsKLQkJCX0KLQkJCS8vIFRoZSB2ZXJ0aWNhbCBzcGFuIGZvciB0aGUgaXRlbSB3aWxsIGJlIGF0IGxlYXN0IDEuIElmIGl0IGlzID4gMSwKLQkJCS8vIGFkZCBvdGhlciByb3dzIHRvIHRoZSBncmlkLgotCQkJaWYgKHNwZWMucm93c3BhbiA+IDEpIHsKLQkJCQlyb3dzcGFucy5wdXQoY2hpbGQsIG5ldyBSb3dTcGFuKGNoaWxkLCBjb2x1bW4sIHJvdykpOwotCQkJfQotCQkJZm9yIChpbnQgaiA9IDI7IGogPD0gc3BlYy5yb3dzcGFuOyBqKyspIHsKLQkJCQlpZiAocm93ICsgaiA+IGdyaWQuc2l6ZSgpKSB7Ci0JCQkJCWdyaWQuYWRkRWxlbWVudChjcmVhdGVFbXB0eVJvdygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBTdG9yZSB0aGUgbGF5b3V0IHNwZWMuIEFsc28gY2FjaGUgdGhlIGNoaWxkSW5kZXguIE5PVEU6IFRoYXQgd2UKLQkJCS8vIGFzc3VtZSB0aGUgY2hpbGRyZW4gb2YgYQotCQkJLy8gY29tcG9zaXRlIGFyZSBtYWludGFpbmVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBjcmVhdGVkCi0JCQkvLyBhbmQgYWRkZWQgdG8gdGhlIGNvbXBvc2l0ZS4KLQkJCSgoVGFibGVXcmFwRGF0YVtdKSBncmlkLmVsZW1lbnRBdChyb3cpKVtjb2x1bW5dID0gc3BlYzsKLQkJCXNwZWMuY2hpbGRJbmRleCA9IGk7Ci0JCQlpZiAoc3BlYy5ncmFiSG9yaXpvbnRhbCkgewotCQkJCXVwZGF0ZUdyb3dpbmdDb2x1bW5zKGdyb3dpbmdDb2xzLCBzcGVjLCBjb2x1bW4pOwotCQkJfQotCQkJaWYgKHNwZWMuZ3JhYlZlcnRpY2FsKSB7Ci0JCQkJdXBkYXRlR3Jvd2luZ1Jvd3MoZ3Jvd2luZ1Jvd3MsIHNwZWMsIHJvdyk7Ci0JCQl9Ci0JCQkvLyBQdXQgc3BhY2VycyBpbiB0aGUgZ3JpZCB0byBhY2NvdW50IGZvciB0aGUgaXRlbSdzIHZlcnRpY2FsIGFuZAotCQkJLy8gaG9yaXpvbnRhbAotCQkJLy8gc3Bhbi4KLQkJCXJvd0ZpbGwgPSBzcGVjLnJvd3NwYW4gLSAxOwotCQkJY29sdW1uRmlsbCA9IHNwZWMuY29sc3BhbiAtIDE7Ci0JCQlmb3IgKGludCByID0gMTsgciA8PSByb3dGaWxsOyByKyspIHsKLQkJCQlmb3IgKGludCBjID0gMDsgYyA8IHNwZWMuY29sc3BhbjsgYysrKSB7Ci0JCQkJCXNwYWNlclNwZWMgPSBuZXcgVGFibGVXcmFwRGF0YSgpOwotCQkJCQlzcGFjZXJTcGVjLmlzSXRlbURhdGEgPSBmYWxzZTsKLQkJCQkJKChUYWJsZVdyYXBEYXRhW10pIGdyaWQuZWxlbWVudEF0KHJvdyArIHIpKVtjb2x1bW4gKyBjXSA9IHNwYWNlclNwZWM7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChpbnQgYyA9IDE7IGMgPD0gY29sdW1uRmlsbDsgYysrKSB7Ci0JCQkJZm9yIChpbnQgciA9IDA7IHIgPCBzcGVjLnJvd3NwYW47IHIrKykgewotCQkJCQlzcGFjZXJTcGVjID0gbmV3IFRhYmxlV3JhcERhdGEoKTsKLQkJCQkJc3BhY2VyU3BlYy5pc0l0ZW1EYXRhID0gZmFsc2U7Ci0JCQkJCSgoVGFibGVXcmFwRGF0YVtdKSBncmlkLmVsZW1lbnRBdChyb3cgKyByKSlbY29sdW1uICsgY10gPSBzcGFjZXJTcGVjOwotCQkJCX0KLQkJCX0KLQkJCWNvbHVtbiA9IGNvbHVtbiArIHNwZWMuY29sc3BhbiAtIDE7Ci0JCX0KLQkJLy8gRmlsbCBvdXQgZW1wdHkgZ3JpZCBjZWxscyB3aXRoIHNwYWNlcnMuCi0JCWZvciAoaW50IGsgPSBjb2x1bW4gKyAxOyBrIDwgbnVtQ29sdW1uczsgaysrKSB7Ci0JCQlzcGFjZXJTcGVjID0gbmV3IFRhYmxlV3JhcERhdGEoKTsKLQkJCXNwYWNlclNwZWMuaXNJdGVtRGF0YSA9IGZhbHNlOwotCQkJKChUYWJsZVdyYXBEYXRhW10pIGdyaWQuZWxlbWVudEF0KHJvdykpW2tdID0gc3BhY2VyU3BlYzsKLQkJfQotCQlmb3IgKGludCBrID0gcm93ICsgMTsgayA8IGdyaWQuc2l6ZSgpOyBrKyspIHsKLQkJCXNwYWNlclNwZWMgPSBuZXcgVGFibGVXcmFwRGF0YSgpOwotCQkJc3BhY2VyU3BlYy5pc0l0ZW1EYXRhID0gZmFsc2U7Ci0JCQkoKFRhYmxlV3JhcERhdGFbXSkgZ3JpZC5lbGVtZW50QXQoaykpW2NvbHVtbl0gPSBzcGFjZXJTcGVjOwotCQl9Ci0JCWdyb3dpbmdDb2x1bW5zID0gbmV3IGludFtncm93aW5nQ29scy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3dpbmdDb2xzLnNpemUoKTsgaSsrKSB7Ci0JCQlncm93aW5nQ29sdW1uc1tpXSA9ICgoSW50ZWdlcikgZ3Jvd2luZ0NvbHMuZ2V0KGkpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXRoaXMuZ3Jvd2luZ1Jvd3MgPSBuZXcgaW50W2dyb3dpbmdSb3dzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3Jvd2luZ1Jvd3Muc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuZ3Jvd2luZ1Jvd3NbaV0gPSAoKEludGVnZXIpIGdyb3dpbmdSb3dzLmdldChpKSkuaW50VmFsdWUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcm93aW5nQ29sdW1ucyhWZWN0b3IgZ3Jvd2luZ0NvbHVtbnMsCi0JCQlUYWJsZVdyYXBEYXRhIHNwZWMsIGludCBjb2x1bW4pIHsKLQkJaW50IGFmZmVjdGVkQ29sdW1uID0gY29sdW1uICsgc3BlYy5jb2xzcGFuIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncm93aW5nQ29sdW1ucy5zaXplKCk7IGkrKykgewotCQkJSW50ZWdlciBjb2wgPSAoSW50ZWdlcikgZ3Jvd2luZ0NvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGNvbC5pbnRWYWx1ZSgpID09IGFmZmVjdGVkQ29sdW1uKQotCQkJCXJldHVybjsKLQkJfQotCQlncm93aW5nQ29sdW1ucy5hZGQobmV3IEludGVnZXIoYWZmZWN0ZWRDb2x1bW4pKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3Jvd2luZ1Jvd3MoVmVjdG9yIGdyb3dpbmdSb3dzLCBUYWJsZVdyYXBEYXRhIHNwZWMsCi0JCQlpbnQgcm93KSB7Ci0JCWludCBhZmZlY3RlZFJvdyA9IHJvdyArIHNwZWMucm93c3BhbiAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3Jvd2luZ1Jvd3Muc2l6ZSgpOyBpKyspIHsKLQkJCUludGVnZXIgaXJvdyA9IChJbnRlZ2VyKSBncm93aW5nUm93cy5nZXQoaSk7Ci0JCQlpZiAoaXJvdy5pbnRWYWx1ZSgpID09IGFmZmVjdGVkUm93KQotCQkJCXJldHVybjsKLQkJfQotCQlncm93aW5nUm93cy5hZGQobmV3IEludGVnZXIoYWZmZWN0ZWRSb3cpKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlV3JhcERhdGFbXSBjcmVhdGVFbXB0eVJvdygpIHsKLQkJVGFibGVXcmFwRGF0YVtdIHJvdyA9IG5ldyBUYWJsZVdyYXBEYXRhW251bUNvbHVtbnNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykKLQkJCXJvd1tpXSA9IG51bGw7Ci0JCXJldHVybiByb3c7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMYXlvdXQjY29tcHV0ZVNpemUoQ29tcG9zaXRlLCBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdIaW50LCBpbnQgaEhpbnQsCi0JCQlib29sZWFuIGNoYW5nZWQpIHsKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0JCWlmIChjaGFuZ2VkKSB7Ci0JCQljYWNoZS5mbHVzaCgpOwotCQl9Ci0JCWlmIChjaGlsZHJlbi5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIG5ldyBQb2ludCgwLCAwKTsKLQkJfQotCQljYWNoZS5zZXRDb250cm9scyhjaGlsZHJlbik7Ci0KLQkJaW50IHBhcmVudFdpZHRoID0gd0hpbnQ7Ci0JCWNoYW5nZWQgPSB0cnVlOwotCQlpbml0aWFsaXplSWZOZWVkZWQocGFyZW50LCBjaGFuZ2VkKTsKLQkJaWYgKGluaXRpYWxMYXlvdXQpIHsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJaW5pdGlhbExheW91dCA9IGZhbHNlOwotCQl9Ci0JCWlmIChncmlkID09IG51bGwgfHwgY2hhbmdlZCkgewotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQlncmlkID0gbmV3IFZlY3RvcigpOwotCQkJY3JlYXRlR3JpZChwYXJlbnQpOwotCQl9Ci0JCXJlc2V0Q29sdW1uV2lkdGhzKCk7Ci0JCWludCBtaW5XaWR0aCA9IGludGVybmFsR2V0TWluaW11bVdpZHRoKHBhcmVudCwgY2hhbmdlZCk7Ci0JCWludCBtYXhXaWR0aCA9IGludGVybmFsR2V0TWF4aW11bVdpZHRoKHBhcmVudCwgY2hhbmdlZCk7Ci0JCWludCB0YWJsZVdpZHRoID0gcGFyZW50V2lkdGg7Ci0JCWludFtdIGNvbHVtbldpZHRoczsKLQkJaWYgKHBhcmVudFdpZHRoIDw9IG1pbldpZHRoKSB7Ci0JCQl0YWJsZVdpZHRoID0gbWluV2lkdGg7Ci0JCQlpZiAobWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7Ci0JCQkJY29sdW1uV2lkdGhzID0gbmV3IGludFtudW1Db2x1bW5zXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgewotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSB3aWRlc3RDb2x1bW5XaWR0aDsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQljb2x1bW5XaWR0aHMgPSBtaW5Db2x1bW5XaWR0aHM7Ci0JCX0gZWxzZSBpZiAocGFyZW50V2lkdGggPiBtYXhXaWR0aCkgewotCQkJaWYgKG1ha2VDb2x1bW5zRXF1YWxXaWR0aCkgewotCQkJCWNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107Ci0JCQkJaW50IGNvbFNwYWNlID0gcGFyZW50V2lkdGggLSBsZWZ0TWFyZ2luIC0gcmlnaHRNYXJnaW47Ci0JCQkJY29sU3BhY2UgLT0gKG51bUNvbHVtbnMgLSAxKSAqIGhvcml6b250YWxTcGFjaW5nOwotCQkJCWludCBjb2wgPSBjb2xTcGFjZSAvIG51bUNvbHVtbnM7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsKLQkJCQkJY29sdW1uV2lkdGhzW2ldID0gY29sOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdGFibGVXaWR0aCA9IG1heFdpZHRoOwotCQkJCWNvbHVtbldpZHRocyA9IG1heENvbHVtbldpZHRoczsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107Ci0JCQlpZiAobWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7Ci0JCQkJaW50IGNvbFNwYWNlID0gdGFibGVXaWR0aCAtIGxlZnRNYXJnaW4gLSByaWdodE1hcmdpbjsKLQkJCQljb2xTcGFjZSAtPSAobnVtQ29sdW1ucyAtIDEpICogaG9yaXpvbnRhbFNwYWNpbmc7Ci0JCQkJaW50IGNvbCA9IGNvbFNwYWNlIC8gbnVtQ29sdW1uczsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgewotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSBjb2w7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQljb2x1bW5XaWR0aHMgPSBhc3NpZ25FeHRyYVNwYWNlKHRhYmxlV2lkdGgsIG1heFdpZHRoLCBtaW5XaWR0aCk7Ci0JCQl9Ci0JCX0KLQkJaW50IHRvdGFsSGVpZ2h0ID0gMDsKLQkJaW50IGlubmVySGVpZ2h0ID0gMDsKLQkJLy8gY29tcHV0ZSB3aWR0aHMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncmlkLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWJsZVdyYXBEYXRhW10gcm93ID0gKFRhYmxlV3JhcERhdGFbXSkgZ3JpZC5lbGVtZW50QXQoaSk7Ci0JCQkvLyBhc3NpZ24gd2lkdGhzLCBjYWxjdWxhdGUgaGVpZ2h0cwotCQkJaW50IHJvd0hlaWdodCA9IDA7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IG51bUNvbHVtbnM7IGorKykgewotCQkJCVRhYmxlV3JhcERhdGEgdGQgPSByb3dbal07Ci0JCQkJaWYgKHRkLmlzSXRlbURhdGEgPT0gZmFsc2UpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlblt0ZC5jaGlsZEluZGV4XTsKLQkJCQlpbnQgc3BhbiA9IHRkLmNvbHNwYW47Ci0JCQkJaW50IGN3aWR0aCA9IDA7Ci0JCQkJZm9yIChpbnQgayA9IGo7IGsgPCBqICsgc3BhbjsgaysrKSB7Ci0JCQkJCWlmIChrID4gaikKLQkJCQkJCWN3aWR0aCArPSBob3Jpem9udGFsU3BhY2luZzsKLQkJCQkJY3dpZHRoICs9IGNvbHVtbldpZHRoc1trXTsKLQkJCQl9Ci0JCQkJaW50IGN5ID0gdGQuaGVpZ2h0SGludDsKLQkJCQlpZiAoY3kgPT0gU1dULkRFRkFVTFQpIHsKLQkJCQkJUG9pbnQgc2l6ZSA9IGNvbXB1dGVTaXplKHRkLmNoaWxkSW5kZXgsIGN3aWR0aCwgdGQuaW5kZW50LCB0ZC5tYXhXaWR0aCwgdGQubWF4SGVpZ2h0KTsKLQkJCQkJY3kgPSBzaXplLnk7Ci0JCQkJfQotCQkJCVJvd1NwYW4gcm93c3BhbiA9IChSb3dTcGFuKSByb3dzcGFucy5nZXQoY2hpbGQpOwotCQkJCWlmIChyb3dzcGFuICE9IG51bGwpIHsKLQkJCQkJLy8gZG9uJ3QgdGFrZSB0aGUgaGVpZ2h0IG9mIHRoaXMgY2hpbGQgaW50byBhY291bnQKLQkJCQkJLy8gYmVjYXVzZSBpdCBzcGFucyBtdWx0aXBsZSByb3dzCi0JCQkJCXJvd3NwYW4uaGVpZ2h0ID0gY3k7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBjeSk7Ci0JCQkJfQotCQkJfQotCQkJdXBkYXRlUm93U3BhbnMoaSwgcm93SGVpZ2h0KTsKLQkJCWlmIChpID4gMCkKLQkJCQlpbm5lckhlaWdodCArPSB2ZXJ0aWNhbFNwYWNpbmc7Ci0JCQlpbm5lckhlaWdodCArPSByb3dIZWlnaHQ7Ci0JCX0KLQkJaWYgKCFyb3dzcGFucy5pc0VtcHR5KCkpCi0JCQlpbm5lckhlaWdodCA9IGNvbXBlbnNhdGVGb3JSb3dTcGFucyhpbm5lckhlaWdodCk7Ci0JCXRvdGFsSGVpZ2h0ID0gdG9wTWFyZ2luICsgaW5uZXJIZWlnaHQgKyBib3R0b21NYXJnaW47Ci0JCXJldHVybiBuZXcgUG9pbnQodGFibGVXaWR0aCwgdG90YWxIZWlnaHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVSb3dTcGFucyhpbnQgcm93LCBpbnQgcm93SGVpZ2h0KSB7Ci0JCWlmIChyb3dzcGFucyA9PSBudWxsIHx8IHJvd3NwYW5zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuOwotCQlmb3IgKEVudW1lcmF0aW9uIGVubSA9IHJvd3NwYW5zLmVsZW1lbnRzKCk7IGVubS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVJvd1NwYW4gcm93c3BhbiA9IChSb3dTcGFuKSBlbm0ubmV4dEVsZW1lbnQoKTsKLQkJCXJvd3NwYW4udXBkYXRlKHJvdywgcm93SGVpZ2h0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGNvbXBlbnNhdGVGb3JSb3dTcGFucyhpbnQgdG90YWxIZWlnaHQpIHsKLQkJZm9yIChFbnVtZXJhdGlvbiBlbm0gPSByb3dzcGFucy5lbGVtZW50cygpOyBlbm0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlSb3dTcGFuIHJvd3NwYW4gPSAoUm93U3BhbikgZW5tLm5leHRFbGVtZW50KCk7Ci0JCQl0b3RhbEhlaWdodCArPSByb3dzcGFuLmdldFJlcXVpcmVkSGVpZ2h0SW5jcmVhc2UoKTsKLQkJfQotCQlyZXR1cm4gdG90YWxIZWlnaHQ7Ci0JfQotCi0JaW50IGludGVybmFsR2V0TWluaW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQlpZiAoY2hhbmdlZCkKLQkJCWNhbGN1bGF0ZU1pbmltdW1Db2x1bW5XaWR0aHMocGFyZW50LCB0cnVlKTsKLQkJaW50IG1pbmltdW1XaWR0aCA9IDA7Ci0JCXdpZGVzdENvbHVtbldpZHRoID0gMDsKLQkJaWYgKG1ha2VDb2x1bW5zRXF1YWxXaWR0aCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsKLQkJCQl3aWRlc3RDb2x1bW5XaWR0aCA9IE1hdGgubWF4KHdpZGVzdENvbHVtbldpZHRoLAotCQkJCQkJbWluQ29sdW1uV2lkdGhzW2ldKTsKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgewotCQkJaWYgKGkgPiAwKQotCQkJCW1pbmltdW1XaWR0aCArPSBob3Jpem9udGFsU3BhY2luZzsKLQkJCWlmIChtYWtlQ29sdW1uc0VxdWFsV2lkdGgpCi0JCQkJbWluaW11bVdpZHRoICs9IHdpZGVzdENvbHVtbldpZHRoOwotCQkJZWxzZQotCQkJCW1pbmltdW1XaWR0aCArPSBtaW5Db2x1bW5XaWR0aHNbaV07Ci0JCX0KLQkJLy8gYWRkIG1hcmdpbnMKLQkJbWluaW11bVdpZHRoICs9IGxlZnRNYXJnaW4gKyByaWdodE1hcmdpbjsKLQkJcmV0dXJuIG1pbmltdW1XaWR0aDsKLQl9Ci0KLQlpbnQgaW50ZXJuYWxHZXRNYXhpbXVtV2lkdGgoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JCWlmIChjaGFuZ2VkKQotCQkJY2FsY3VsYXRlTWF4aW11bUNvbHVtbldpZHRocyhwYXJlbnQsIHRydWUpOwotCQlpbnQgbWF4aW11bVdpZHRoID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsKLQkJCWlmIChpID4gMCkKLQkJCQltYXhpbXVtV2lkdGggKz0gaG9yaXpvbnRhbFNwYWNpbmc7Ci0JCQltYXhpbXVtV2lkdGggKz0gbWF4Q29sdW1uV2lkdGhzW2ldOwotCQl9Ci0JCS8vIGFkZCBtYXJnaW5zCi0JCW1heGltdW1XaWR0aCArPSBsZWZ0TWFyZ2luICsgcmlnaHRNYXJnaW47Ci0JCXJldHVybiBtYXhpbXVtV2lkdGg7Ci0JfQotCi0Jdm9pZCByZXNldENvbHVtbldpZHRocygpIHsKLQkJaWYgKG1pbkNvbHVtbldpZHRocyA9PSBudWxsKQotCQkJbWluQ29sdW1uV2lkdGhzID0gbmV3IGludFtudW1Db2x1bW5zXTsKLQkJaWYgKG1heENvbHVtbldpZHRocyA9PSBudWxsKQotCQkJbWF4Q29sdW1uV2lkdGhzID0gbmV3IGludFtudW1Db2x1bW5zXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsKLQkJCW1pbkNvbHVtbldpZHRoc1tpXSA9IDA7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsKLQkJCW1heENvbHVtbldpZHRoc1tpXSA9IDA7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNhbGN1bGF0ZU1pbmltdW1Db2x1bW5XaWR0aHMoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JCS8vQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZC5zaXplKCk7IGkrKykgewotCQkJVGFibGVXcmFwRGF0YVtdIHJvdyA9IChUYWJsZVdyYXBEYXRhW10pIGdyaWQuZWxlbWVudEF0KGkpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBudW1Db2x1bW5zOyBqKyspIHsKLQkJCQlUYWJsZVdyYXBEYXRhIHRkID0gcm93W2pdOwotCQkJCWlmICh0ZC5pc0l0ZW1EYXRhID09IGZhbHNlKQotCQkJCQljb250aW51ZTsKLQkJCQkvL0NvbnRyb2wgY2hpbGQgPSBjaGlsZHJlblt0ZC5jaGlsZEluZGV4XTsKLQotCQkJCVNpemVDYWNoZSBjaGlsZENhY2hlID0gY2FjaGUuZ2V0Q2FjaGUodGQuY2hpbGRJbmRleCk7Ci0JCQkJaW50IG1pbldpZHRoID0gY2hpbGRDYWNoZS5jb21wdXRlTWluaW11bVdpZHRoKCk7Ci0JCQkJaWYgKHRkLm1heFdpZHRoIT1TV1QuREVGQVVMVCkKLQkJCQkJbWluV2lkdGggPSBNYXRoLm1pbihtaW5XaWR0aCwgdGQubWF4V2lkdGgpOwotCi0JCQkJbWluV2lkdGggKz0gdGQuaW5kZW50OwotCQkJCWlmICh0ZC5jb2xzcGFuID09IDEpCi0JCQkJCW1pbkNvbHVtbldpZHRoc1tqXSA9IE1hdGgubWF4KG1pbkNvbHVtbldpZHRoc1tqXSwgbWluV2lkdGgpOwotCQkJCWVsc2UgewotCQkJCQkvLyBjaGVjayBpZiB0aGUgY3VycmVudCBtaW5pbXVtIHdpZHRoIGlzIGVub3VnaCB0bwotCQkJCQkvLyBzdXBwb3J0IHRoZSBjb250cm9sOyBpZiBub3QsIGFkZCB0aGUgZGVsdGEgdG8KLQkJCQkJLy8gdGhlIGxhc3QgY29sdW1uCi0JCQkJCWludCBjdXJyZW50ID0gMDsKLQkJCQkJZm9yIChpbnQgayA9IGo7IGsgPCBqICsgdGQuY29sc3BhbjsgaysrKSB7Ci0JCQkJCQlpZiAoayA+IGopCi0JCQkJCQkJY3VycmVudCArPSBob3Jpem9udGFsU3BhY2luZzsKLQkJCQkJCWN1cnJlbnQgKz0gbWluQ29sdW1uV2lkdGhzW2tdOwotCQkJCQl9Ci0JCQkJCWlmIChtaW5XaWR0aCA8PSBjdXJyZW50KSB7Ci0JCQkJCQkvLyB3ZSBhcmUgb2sgLSBub3RoaW5nIHRvIGRvIGhlcmUKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWludCBuZGl2ID0gMDsKLQkJCQkJCWlmIChncm93aW5nQ29sdW1ucyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgayA9IGo7IGsgPCBqICsgdGQuY29sc3BhbjsgaysrKSB7Ci0JCQkJCQkJCWlmIChpc0dyb3dpbmdDb2x1bW4oaykpIHsKLQkJCQkJCQkJCW5kaXYrKzsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChuZGl2ID09IDApIHsKLQkJCQkJCQkvLyBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IGNvbHVtbgotCQkJCQkJCW1pbkNvbHVtbldpZHRoc1tqICsgdGQuY29sc3BhbiAtIDFdICs9IG1pbldpZHRoCi0JCQkJCQkJCQktIGN1cnJlbnQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIGRpc3RyaWJ1dGUgdGhlIGRlbHRhIHRvIHRoZSBncm93aW5nCi0JCQkJCQkJLy8gY29sdW1ucwotCQkJCQkJCWludCBwZXJjb2x1bW4gPSAobWluV2lkdGggLSBjdXJyZW50KSAvIG5kaXY7Ci0JCQkJCQkJaWYgKChtaW5XaWR0aCAtIGN1cnJlbnQpICUgbmRpdiA+IDApCi0JCQkJCQkJCXBlcmNvbHVtbisrOwotCQkJCQkJCWZvciAoaW50IGsgPSBqOyBrIDwgaiArIHRkLmNvbHNwYW47IGsrKykgewotCQkJCQkJCQlpZiAoaXNHcm93aW5nQ29sdW1uKGspKQotCQkJCQkJCQkJbWluQ29sdW1uV2lkdGhzW2tdICs9IHBlcmNvbHVtbjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlib29sZWFuIGlzV3JhcChDb250cm9sIGNvbnRyb2wpIHsKLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21wb3NpdGUKLQkJCQkmJiAoKENvbXBvc2l0ZSkgY29udHJvbCkuZ2V0TGF5b3V0KCkgaW5zdGFuY2VvZiBJTGF5b3V0RXh0ZW5zaW9uKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiAoY29udHJvbC5nZXRTdHlsZSgpICYgU1dULldSQVApICE9IDA7Ci0JfQotCi0Jdm9pZCBjYWxjdWxhdGVNYXhpbXVtQ29sdW1uV2lkdGhzKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQkvL0NvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgewotCQkJbWF4Q29sdW1uV2lkdGhzW2ldID0gMDsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyaWQuc2l6ZSgpOyBpKyspIHsKLQkJCVRhYmxlV3JhcERhdGFbXSByb3cgPSAoVGFibGVXcmFwRGF0YVtdKSBncmlkLmVsZW1lbnRBdChpKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbnVtQ29sdW1uczsgaisrKSB7Ci0JCQkJVGFibGVXcmFwRGF0YSB0ZCA9IHJvd1tqXTsKLQkJCQlpZiAodGQuaXNJdGVtRGF0YSA9PSBmYWxzZSkKLQkJCQkJY29udGludWU7Ci0JCQkJLy9Db250cm9sIGNoaWxkID0gY2hpbGRyZW5bdGQuY2hpbGRJbmRleF07Ci0KLQkJCQlTaXplQ2FjaGUgc2MgPSBjYWNoZS5nZXRDYWNoZSh0ZC5jaGlsZEluZGV4KTsKLQkJCQlpbnQgbWF4V2lkdGggPSBzYy5jb21wdXRlTWF4aW11bVdpZHRoKCk7Ci0JCQkJaWYgKHRkLm1heFdpZHRoIT1TV1QuREVGQVVMVCkKLQkJCQkJbWF4V2lkdGggPSBNYXRoLm1pbihtYXhXaWR0aCwgdGQubWF4V2lkdGgpOwotCi0JCQkJbWF4V2lkdGggKz0gdGQuaW5kZW50OwotCQkJCWlmICh0ZC5jb2xzcGFuID09IDEpCi0JCQkJCW1heENvbHVtbldpZHRoc1tqXSA9IE1hdGgubWF4KG1heENvbHVtbldpZHRoc1tqXSwgbWF4V2lkdGgpOwotCQkJCWVsc2UgewotCQkJCQkvLyBjaGVjayBpZiB0aGUgY3VycmVudCBtYXhpbXVtIHdpZHRoIGlzIGVub3VnaCB0bwotCQkJCQkvLyBzdXBwb3J0IHRoZSBjb250cm9sOyBpZiBub3QsIGFkZCB0aGUgZGVsdGEgdG8KLQkJCQkJLy8gdGhlIGxhc3QgY29sdW1uCi0JCQkJCWludCBjdXJyZW50ID0gMDsKLQkJCQkJZm9yIChpbnQgayA9IGo7IGsgPCBqICsgdGQuY29sc3BhbjsgaysrKSB7Ci0JCQkJCQlpZiAoayA+IGopCi0JCQkJCQkJY3VycmVudCArPSBob3Jpem9udGFsU3BhY2luZzsKLQkJCQkJCWN1cnJlbnQgKz0gbWF4Q29sdW1uV2lkdGhzW2tdOwotCQkJCQl9Ci0JCQkJCWlmIChtYXhXaWR0aCA8PSBjdXJyZW50KSB7Ci0JCQkJCQkvLyB3ZSBhcmUgb2sgLSBub3RoaW5nIHRvIGRvIGhlcmUKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWludCBuZGl2ID0gMDsKLQkJCQkJCWlmIChncm93aW5nQ29sdW1ucyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgayA9IGo7IGsgPCBqICsgdGQuY29sc3BhbjsgaysrKSB7Ci0JCQkJCQkJCWlmIChpc0dyb3dpbmdDb2x1bW4oaykpIHsKLQkJCQkJCQkJCW5kaXYrKzsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChuZGl2ID09IDApIHsKLQkJCQkJCQkvLyBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IGNvbHVtbgotCQkJCQkJCW1heENvbHVtbldpZHRoc1tqICsgdGQuY29sc3BhbiAtIDFdICs9IG1heFdpZHRoCi0JCQkJCQkJCQktIGN1cnJlbnQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIGRpc3RyaWJ1dGUgdGhlIGRlbHRhIHRvIHRoZSBncm93aW5nCi0JCQkJCQkJLy8gY29sdW1ucwotCQkJCQkJCWludCBwZXJjb2x1bW4gPSAobWF4V2lkdGggLSBjdXJyZW50KSAvIG5kaXY7Ci0JCQkJCQkJaWYgKChtYXhXaWR0aCAtIGN1cnJlbnQpICUgbmRpdiA+IDApCi0JCQkJCQkJCXBlcmNvbHVtbisrOwotCQkJCQkJCS8vIGRpdmlkZSB0aGUgZGlzdHJpYnV0aW9uIHBlciByb3cKLQkJCQkJCQkvLyBpZiB0aGUgY29udHJvbCB3aWxsIHNwYW4gbXVsdGlwbGUgcm93cwotCQkJCQkJCXBlcmNvbHVtbiAvPSB0ZC5yb3dzcGFuOwotCQkJCQkJCWZvciAoaW50IGsgPSBqOyBrIDwgaiArIHRkLmNvbHNwYW47IGsrKykgewotCQkJCQkJCQlpZiAoaXNHcm93aW5nQ29sdW1uKGspKQotCQkJCQkJCQkJbWF4Q29sdW1uV2lkdGhzW2tdICs9IHBlcmNvbHVtbjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUlmTmVlZGVkKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQlpZiAoY2hhbmdlZCkKLQkJCWluaXRpYWxMYXlvdXQgPSB0cnVlOwotCQlpZiAoaW5pdGlhbExheW91dCkgewotCQkJaW5pdGlhbGl6ZUxheW91dERhdGEocGFyZW50KTsKLQkJCWluaXRpYWxMYXlvdXQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXZvaWQgaW5pdGlhbGl6ZUxheW91dERhdGEoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJaWYgKGNoaWxkLmdldExheW91dERhdGEoKSA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YSgpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvVG9nZ2xlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1RvZ2dsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2Q1MWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvVG9nZ2xlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLio7Ci0vKioKLSAqIEEgY3VzdG9tIHNlbGVjdGFibGUgY29udHJvbCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgYXJlYXMgdGhhdCBjYW4gYmUKLSAqIGV4cGFuZGVkIG9yIGNvbGxhcHNlZC4KLSAqIDxwPgotICogVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcy4gU3ViY2xhc3NlcyBhcmUgcmVzcG9uc2libGUgZm9yIHJlbmRlcmluZyB0aGUKLSAqIGNvbnRyb2wgdXNpbmcgZGVjb3JhdGlvbiBhbmQgaG92ZXIgZGVjb3JhdGlvbiBjb2xvci4gQ29udHJvbCBzaG91bGQgYmUKLSAqIHJlbmRlcmVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IGV4cGFuc2lvbiBzdGF0ZS4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVG9nZ2xlSHlwZXJsaW5rIGV4dGVuZHMgQWJzdHJhY3RIeXBlcmxpbmsgewotCXByb3RlY3RlZCBpbnQgaW5uZXJXaWR0aDsKLQlwcm90ZWN0ZWQgaW50IGlubmVySGVpZ2h0OwotCXByb3RlY3RlZCBib29sZWFuIGhvdmVyOwotCXByaXZhdGUgYm9vbGVhbiBleHBhbmRlZDsJCi0JcHJpdmF0ZSBDb2xvciBkZWNvcmF0aW9uQ29sb3I7Ci0JcHJpdmF0ZSBDb2xvciBob3ZlckNvbG9yOwotCS8qKgotCSAqIENyZWF0ZXMgYSBjb250cm9sIGluIGEgcHJvdmlkZWQgY29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZQotCSAqLwotCXB1YmxpYyBUb2dnbGVIeXBlcmxpbmsoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzd2l0Y2ggKGUudHlwZSkgewotCQkJCQljYXNlIFNXVC5Nb3VzZUVudGVyOgotCQkJCQkJaG92ZXI9dHJ1ZTsKLQkJCQkJCXJlZHJhdygpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU1dULk1vdXNlRXhpdDoKLQkJCQkJCWhvdmVyID0gZmFsc2U7Ci0JCQkJCQlyZWRyYXcoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFNXVC5LZXlEb3duOgotCQkJCQkJb25LZXlEb3duKGUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRMaXN0ZW5lcihTV1QuTW91c2VFbnRlciwgbGlzdGVuZXIpOwotCQlhZGRMaXN0ZW5lcihTV1QuTW91c2VFeGl0LCBsaXN0ZW5lcik7Ci0JCWFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBsaXN0ZW5lcik7Ci0JCWFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJc2V0RXhwYW5kZWQoIWlzRXhwYW5kZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCQlpbml0QWNjZXNzaWJsZSgpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb2xvciBvZiB0aGUgZGVjb3JhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjb3JhdGlvbkNvbG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVjb3JhdGlvbkNvbG9yKENvbG9yIGRlY29yYXRpb25Db2xvcikgewotCQl0aGlzLmRlY29yYXRpb25Db2xvciA9IGRlY29yYXRpb25Db2xvcjsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sb3Igb2YgdGhlIGRlY29yYXRpb24uCi0JICogCi0JICogQHJldHVybiBkZWNvcmF0aW9uIGNvbG9yCi0JICovCi0JcHVibGljIENvbG9yIGdldERlY29yYXRpb25Db2xvcigpIHsKLQkJcmV0dXJuIGRlY29yYXRpb25Db2xvcjsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgaG92ZXIgY29sb3Igb2YgZGVjb3JhdGlvbi4gSG92ZXIgY29sb3Igd2lsbCBiZSB1c2VkIHdoZW4gbW91c2UKLQkgKiBlbnRlcnMgdGhlIGRlY29yYXRpb24gYXJlYS4KLQkgKiAKLQkgKiBAcGFyYW0gaG92ZXJDb2xvcgotCSAqICAgICAgICAgICAgdGhlIGhvdmVyIGNvbG9yIHRvIHVzZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvdmVyRGVjb3JhdGlvbkNvbG9yKENvbG9yIGhvdmVyQ29sb3IpIHsKLQkJdGhpcy5ob3ZlckNvbG9yID0gaG92ZXJDb2xvcjsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaG92ZXIgY29sb3Igb2YgdGhlIGRlY29yYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgaG92ZXIgY29sb3Igb2YgdGhlIGRlY29yYXRpb24uCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRIb3ZlckRlY29yYXRpb25Db2xvcigpIHsKLQkJcmV0dXJuIGhvdmVyQ29sb3I7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhvdmVyIGNvbG9yIG9mIHRoZSBkZWNvcmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhvdmVyIGNvbG9yIG9mIHRoZSBkZWNvcmF0aW9uLgotCSAqIEBkZXByZWNhdGVkIHVzZSA8Y29kZT5nZXRIb3ZlckRlY29yYXRpb25Db2xvcjwvY29kZT4KLQkgKiBAc2VlICNnZXRIb3ZlckRlY29yYXRpb25Db2xvcigpCi0JICovCi0JcHVibGljIENvbG9yIGdlSG92ZXJEZWNvcmF0aW9uQ29sb3IoKSB7Ci0JCXJldHVybiBob3ZlckNvbG9yOwotCX0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgc2l6ZSBvZiB0aGUgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gd0hpbnQKLQkgKiAgICAgICAgICAgIHdpZHRoIGhpbnQKLQkgKiBAcGFyYW0gaEhpbnQKLQkgKiAgICAgICAgICAgIGhlaWdodCBoaW50Ci0JICogQHBhcmFtIGNoYW5nZWQKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGZsdXNoIGFueSBzYXZlZCBsYXlvdXQgc3RhdGUKLQkgKi8KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQlpbnQgd2lkdGgsIGhlaWdodDsKLQkJLyoKLQkJaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJd2lkdGggPSB3SGludDsKLQkJZWxzZSAqLwotCQkJd2lkdGggPSBpbm5lcldpZHRoICsgMiAqIG1hcmdpbldpZHRoOwotCQkvKgotCQlpZiAoaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQloZWlnaHQgPSBoSGludDsKLQkJZWxzZSAqLwotCQkJaGVpZ2h0ID0gaW5uZXJIZWlnaHQgKyAyICogbWFyZ2luSGVpZ2h0OwotCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBoZWlnaHQpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBleHBhbnNpb24gc3RhdGUgb2YgdGhlIHRvZ2dsZSBjb250cm9sLiBXaGVuIHRvZ2dsZSBpcyBpbiB0aGUKLQkgKiBub3JtYWwgKGRvd253YXJkKSBzdGF0ZSwgdGhlIHZhbHVlIGlzIDxzYW1wPnRydWUgPC9zYW1wPi4gQ29sbGFwc2VkCi0JICogY29udHJvbCB3aWxsIHJldHVybiA8c2FtcD5mYWxzZSA8L3NhbXA+LgotCSAqIAotCSAqIEByZXR1cm4gPHNhbXA+ZmFsc2UgPC9zYW1wPiBpZiBjb2xsYXBzZWQsIDxzYW1wPnRydWUgPC9zYW1wPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHBhbmRlZCgpIHsKLQkJcmV0dXJuIGV4cGFuZGVkOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHBhbnNpb24gc3RhdGUgb2YgdGhlIHR3aXN0aWUgY29udHJvbAotCSAqIAotCSAqIEBwYXJhbSBleHBhbmRlZCB0aGUgZXhwYW5zaW9uIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kZWQoYm9vbGVhbiBleHBhbmRlZCkgewotCQl0aGlzLmV4cGFuZGVkID0gZXhwYW5kZWQ7Ci0JCXJlZHJhdygpOwotCX0KLQlwcml2YXRlIHZvaWQgaW5pdEFjY2Vzc2libGUoKSB7Ci0JCWdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZ2V0SGVscChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCWUucmVzdWx0ID0gZ2V0VG9vbFRpcFRleHQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBFeHBhbmRhYmxlQ29tcG9zaXRlKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKChFeHBhbmRhYmxlQ29tcG9zaXRlKWdldFBhcmVudCgpKS5nZXRUZXh0KCk7Ci0JCQkJCWludCBpbmRleCA9IG5hbWUuaW5kZXhPZignJicpOwotCQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCkgKyBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCQl9Ci0JCQkJCWUucmVzdWx0ID0gbmFtZTsKLQkJCQl9Ci0JCQkJCQotCQkJfQotCQkJcHVibGljIHZvaWQgZ2V0RGVzY3JpcHRpb24oQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlnZXROYW1lKGUpOwotCQkJfQotCQl9KTsKLQkJZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoCi0JCQkJbmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRBdFBvaW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJCQkJUG9pbnQgdGVzdFBvaW50ID0gdG9Db250cm9sKG5ldyBQb2ludChlLngsIGUueSkpOwotCQkJCQkJaWYgKGdldEJvdW5kcygpLmNvbnRhaW5zKHRlc3RQb2ludCkpIHsKLQkJCQkJCQllLmNoaWxkSUQgPSBBQ0MuQ0hJTERJRF9TRUxGOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIGdldExvY2F0aW9uKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJCQkJUmVjdGFuZ2xlIGxvY2F0aW9uID0gZ2V0Qm91bmRzKCk7Ci0JCQkJCQlQb2ludCBwdCA9IHRvRGlzcGxheShuZXcgUG9pbnQobG9jYXRpb24ueCwgbG9jYXRpb24ueSkpOwotCQkJCQkJZS54ID0gcHQueDsKLQkJCQkJCWUueSA9IHB0Lnk7Ci0JCQkJCQllLndpZHRoID0gbG9jYXRpb24ud2lkdGg7Ci0JCQkJCQllLmhlaWdodCA9IGxvY2F0aW9uLmhlaWdodDsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCBnZXRDaGlsZENvdW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJCQkJZS5kZXRhaWwgPSAwOwotCQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIGdldFJvbGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJCQllLmRldGFpbCA9IEFDQy5ST0xFX1RSRUU7Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJCQllLmRldGFpbCA9IFRvZ2dsZUh5cGVybGluay50aGlzLmlzRXhwYW5kZWQoKQotCQkJCQkJCQk/IEFDQy5TVEFURV9FWFBBTkRFRAotCQkJCQkJCQk6IEFDQy5TVEFURV9DT0xMQVBTRUQ7Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJCQllLnJlc3VsdCA9ICIwIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCXByaXZhdGUgdm9pZCBvbktleURvd24oRXZlbnQgZSkgewotCQlpZiAoZS5rZXlDb2RlPT1TV1QuQVJST1dfUklHSFQpIHsKLQkJCS8vIGV4cGFuZCBpZiBjb2xsYXBzZWQKLQkJCWlmICghaXNFeHBhbmRlZCgpKSB7Ci0JCQkJaGFuZGxlQWN0aXZhdGUoZSk7Ci0JCQl9Ci0JCQllLmRvaXQ9ZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAoZS5rZXlDb2RlPT1TV1QuQVJST1dfTEVGVCkgewotCQkJLy8gY29sbGFwc2UgaWYgZXhwYW5kZWQKLQkJCWlmIChpc0V4cGFuZGVkKCkpIHsKLQkJCQloYW5kbGVBY3RpdmF0ZShlKTsKLQkJCX0KLQkJCWUuZG9pdD1mYWxzZTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1RyZWVOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1RyZWVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzBhNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9UcmVlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotLyoqCi0gKiBBIGN1c3RvbSBzZWxlY3RhYmxlIGNvbnRyb2wgdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sIGFyZWFzIHRoYXQgY2FuIGJlCi0gKiBleHBhbmRlZCBvciBjb2xsYXBzZWQuIFRoZSBjb250cm9sIGNvbnRyb2wgY2FuIGJlIHRvZ2dsZWQgYmV0d2VlbiBzZWxlY3RlZAotICogYW5kIGRlc2VsZWN0ZWQgc3RhdGUgd2l0aCBhIG1vdXNlIG9yIGJ5IHByZXNzaW5nICdFbnRlcicgd2hpbGUgdGhlIGNvbnRyb2wKLSAqIGhhcyBmb2N1cy4KLSAqIDxwPgotICogVGhlIGNvbnRyb2wgaXMgcmVuZGVyZWQgYXMgYm94IHdpdGggYSAnKycgb3IgJy0nIHNpZ24sIGRlcGVuZGluZyBvbiB0aGUKLSAqIGV4cGFuc2lvbiBzdGF0ZS4gRm9jdXMgaW5kaWNhdGlvbiBpcyByZW5kZXJlZCBhcm91bmQgdGhlIGJveCB3aGVuIHRoZQotICogY29udHJvbCBoYXMga2V5Ym9hcmQgZm9jdXMuCi0gKiAKLSAqIEBzZWUgVHdpc3RpZQotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVHJlZU5vZGUgZXh0ZW5kcyBUb2dnbGVIeXBlcmxpbmsgewotCS8qKgotCSAqIENyZWF0ZXMgYSBjb250cm9sIGluIGEgcHJvdmlkZWQgY29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZQotCSAqLwotCXB1YmxpYyBUcmVlTm9kZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCWlubmVyV2lkdGggPSAxMDsKLQkJaW5uZXJIZWlnaHQgPSAxMDsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7Ci0JCXBhaW50SHlwZXJsaW5rKGUuZ2MpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEh5cGVybGluayhHQyBnYykgewotCQlSZWN0YW5nbGUgYm94ID0gZ2V0Qm94Qm91bmRzKGdjKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoCi0JCQkJU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XKSk7Ci0JCWdjLmRyYXdSZWN0YW5nbGUoYm94KTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOwotCQlnYy5kcmF3TGluZShib3gueCArIDIsIGJveC55ICsgNCwgYm94LnggKyA2LCBib3gueSArIDQpOwotCQlpZiAoIWlzRXhwYW5kZWQoKSkgewotCQkJZ2MuZHJhd0xpbmUoYm94LnggKyA0LCBib3gueSArIDIsIGJveC54ICsgNCwgYm94LnkgKyA2KTsKLQkJfQotCQlpZiAoZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdjLnNldEZvcmVncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsKLQkJCWdjLmRyYXdGb2N1cyhib3gueCAtIDEsIGJveC55IC0gMSwgYm94LndpZHRoICsgMywgYm94LmhlaWdodCArIDMpOwotCQl9Ci0JfQotCXByaXZhdGUgUmVjdGFuZ2xlIGdldEJveEJvdW5kcyhHQyBnYykgewotCQlpbnQgeCA9IDE7Ci0JCWludCB5ID0gMDsKLQkJZ2Muc2V0Rm9udChnZXRGb250KCkpOwotCQkvL2ludCBoZWlnaHQgPSBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpOwotCQkvL3kgPSBoZWlnaHQgLyAyIC0gNDsKLQkJLy95ID0gTWF0aC5tYXgoeSwgMCk7Ci0JCXkgPSAyOwotCQlyZXR1cm4gbmV3IFJlY3RhbmdsZSh4LCB5LCA4LCA4KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL1R3aXN0aWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvVHdpc3RpZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmEyNzM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL3dpZGdldHMvVHdpc3RpZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBBIGN1c3RvbSBzZWxlY3RhYmxlIGNvbnRyb2wgdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sIGFyZWFzIHRoYXQgY2FuIGJlCi0gKiBleHBhbmRlZCBvciBjb2xsYXBzZWQuIFRoZSBjb250cm9sIGNvbnRyb2wgY2FuIGJlIHRvZ2dsZWQgYmV0d2VlbiBzZWxlY3RlZAotICogYW5kIGRlc2VsZWN0ZWQgc3RhdGUgd2l0aCBhIG1vdXNlIG9yIGJ5IHByZXNzaW5nICdFbnRlcicgd2hpbGUgdGhlIGNvbnRyb2wKLSAqIGhhcyBmb2N1cy4KLSAqIDxwPgotICogVGhlIGNvbnRyb2wgaXMgcmVuZGVyZWQgYXMgYSB0cmlhbmdsZSB0aGF0IHBvaW50cyB0byB0aGUgcmlnaHQgaW4gdGhlCi0gKiBjb2xsYXBzZWQgYW5kIGRvd24gaW4gdGhlIGV4cGFuZGVkIHN0YXRlLiBUcmlhbmdsZSBjb2xvciBjYW4gYmUgY2hhbmdlZC4KLSAqIAotICogQHNlZSBUcmVlTm9kZQotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVHdpc3RpZSBleHRlbmRzIFRvZ2dsZUh5cGVybGluayB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gb25Qb2ludHMgPSB7IDAsIDIsIDgsIDIsIDQsIDYgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIG9mZlBvaW50cyA9IHsgMiwgLTEsIDIsIDgsIDYsIDQgfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb250cm9sIGluIGEgcHJvdmlkZWQgY29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZQotCSAqLwotCXB1YmxpYyBUd2lzdGllKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJaW5uZXJXaWR0aCA9IDk7Ci0JCWlubmVySGVpZ2h0ID0gOTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgU2VsZWN0YWJsZUNvbnRyb2wjcGFpbnQoR0MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRIeXBlcmxpbmsoR0MgZ2MpIHsKLQkJQ29sb3IgYmc7Ci0JCWlmICghaXNFbmFibGVkKCkpCi0JCQliZyA9IGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1cpOwotCQllbHNlIGlmIChob3ZlciAmJiBnZXRIb3ZlckRlY29yYXRpb25Db2xvcigpICE9IG51bGwpCi0JCQliZyA9IGdldEhvdmVyRGVjb3JhdGlvbkNvbG9yKCk7Ci0JCWVsc2UgaWYgKGdldERlY29yYXRpb25Db2xvcigpICE9IG51bGwpCi0JCQliZyA9IGdldERlY29yYXRpb25Db2xvcigpOwotCQllbHNlCi0JCQliZyA9IGdldEZvcmVncm91bmQoKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChiZyk7Ci0JCWludFtdIGRhdGE7Ci0JCVBvaW50IHNpemUgPSBnZXRTaXplKCk7Ci0JCWludCB4ID0gKHNpemUueCAtIDkpIC8gMjsKLQkJaW50IHkgPSAoc2l6ZS55IC0gOSkgLyAyOwotCQlpZiAoaXNFeHBhbmRlZCgpKQotCQkJZGF0YSA9IHRyYW5zbGF0ZShvblBvaW50cywgeCwgeSk7Ci0JCWVsc2UKLQkJCWRhdGEgPSB0cmFuc2xhdGUob2ZmUG9pbnRzLCB4LCB5KTsKLQkJZ2MuZmlsbFBvbHlnb24oZGF0YSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQl9Ci0KLQlwcml2YXRlIGludFtdIHRyYW5zbGF0ZShpbnRbXSBkYXRhLCBpbnQgeCwgaW50IHkpIHsKLQkJaW50W10gdGFyZ2V0ID0gbmV3IGludFtkYXRhLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gMikgewotCQkJdGFyZ2V0W2ldID0gZGF0YVtpXSArIHg7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQl0YXJnZXRbaV0gPSBkYXRhW2ldICsgeTsKLQkJfQotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCNzZXRFbmFibGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJcmVkcmF3KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvd2lkZ2V0cy9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjMWI1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy93aWRnZXRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1DdXN0b20gd2lkZ2V0cyBhbmQgY29udHJvbHMgZm9yIGZvcm1zLWJhc2VkIHBhcnRzLgotPGJyPiZuYnNwOwotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDI4ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy5NZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1UZXh0X2NvcHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybV90b29sdGlwX21pbmltaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1fdG9vbHRpcF9yZXN0b3JlOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOGEyNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUZvcm1UZXh0X2NvcHk9JkNvcHkKLUZvcm1fdG9vbHRpcF9taW5pbWl6ZT1NaW5pbWl6ZQotRm9ybV90b29sdGlwX3Jlc3RvcmU9UmVzdG9yZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9BZ2dyZWdhdGVIeXBlcmxpbmtTZWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0FnZ3JlZ2F0ZUh5cGVybGlua1NlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5ZTlhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0FnZ3JlZ2F0ZUh5cGVybGlua1NlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLQotLyoqCi0gKiBUaGlzIHNlZ21lbnQgY29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIGltYWdlcyBhbmQgbGlua3MgdGhhdCBhbGwgYmVsb25nIHRvIG9uZQotICogbG9naWNhbCBoeXBlcmxpbmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZ2dyZWdhdGVIeXBlcmxpbmtTZWdtZW50IGV4dGVuZHMgUGFyYWdyYXBoU2VnbWVudCBpbXBsZW1lbnRzCi0JCUlIeXBlcmxpbmtTZWdtZW50IHsKLQlwcml2YXRlIFN0cmluZyBocmVmOwotCi0JcHJpdmF0ZSBWZWN0b3Igc2VnbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0KLQlwdWJsaWMgQWdncmVnYXRlSHlwZXJsaW5rU2VnbWVudCgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoVGV4dEh5cGVybGlua1NlZ21lbnQgc2VnbWVudCkgewotCQlzZWdtZW50cy5hZGQoc2VnbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEltYWdlSHlwZXJsaW5rU2VnbWVudCBzZWdtZW50KSB7Ci0JCXNlZ21lbnRzLmFkZChzZWdtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuUGFyYWdyYXBoU2VnbWVudCNhZHZhbmNlTG9jYXRvcihvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JICogICAgICBpbnQsIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuTG9jYXRvciwKLQkgKiAgICAgIGphdmEudXRpbC5IYXNodGFibGUsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWR2YW5jZUxvY2F0b3IoR0MgZ2MsIGludCB3SGludCwgTG9jYXRvciBsb2MsCi0JCQlIYXNodGFibGUgb2JqZWN0VGFibGUsIGJvb2xlYW4gY29tcHV0ZUhlaWdodE9ubHkpIHsKLQkJYm9vbGVhbiBuZXdMaW5lID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCA9IChQYXJhZ3JhcGhTZWdtZW50KSBzZWdtZW50cy5nZXQoaSk7Ci0JCQlpZiAoc2VnbWVudC5hZHZhbmNlTG9jYXRvcihnYywgd0hpbnQsIGxvYywgb2JqZWN0VGFibGUsCi0JCQkJCWNvbXB1dGVIZWlnaHRPbmx5KSkKLQkJCQluZXdMaW5lID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gbmV3TGluZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhyZWYuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotCQlyZXR1cm4gaHJlZjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaHJlZgotCSAqICAgICAgICAgICAgVGhlIGhyZWYgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpIHsKLQkJdGhpcy5ocmVmID0gaHJlZjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuSUh5cGVybGlua1NlZ21lbnQjcmVwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBib29sZWFuIGhvdmVyLCBIYXNodGFibGUgcmVzb3VyY2VUYWJsZSwKLQkJCWJvb2xlYW4gc2VsZWN0ZWQsIFNlbGVjdGlvbkRhdGEgc2VsRGF0YSwgUmVjdGFuZ2xlIHJlcGFpbnRSZWdpb24pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5zaXplKCk7IGkrKykgewotCQkJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50ID0gKFBhcmFncmFwaFNlZ21lbnQpIHNlZ21lbnRzLmdldChpKTsKLQkJCXNlZ21lbnQucGFpbnQoZ2MsIGhvdmVyLCByZXNvdXJjZVRhYmxlLCBzZWxlY3RlZCwgc2VsRGF0YSwKLQkJCQkJcmVwYWludFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlIeXBlcmxpbmtTZWdtZW50IHNlZ21lbnQgPSAoSUh5cGVybGlua1NlZ21lbnQpIHNlZ21lbnRzLmdldChpKTsKLQkJCWJ1Zi5hcHBlbmQoc2VnbWVudC5nZXRUZXh0KCkpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuSUh5cGVybGlua1NlZ21lbnQjcGFpbnRGb2N1cyhvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgcGFpbnRGb2N1cyhHQyBnYywgQ29sb3IgYmcsIENvbG9yIGZnLCBib29sZWFuIHNlbGVjdGVkLAotCQkJUmVjdGFuZ2xlIHJlcGFpbnRSZWdpb24pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5zaXplKCk7IGkrKykgewotCQkJSUh5cGVybGlua1NlZ21lbnQgc2VnbWVudCA9IChJSHlwZXJsaW5rU2VnbWVudCkgc2VnbWVudHMuZ2V0KGkpOwotCQkJc2VnbWVudC5wYWludEZvY3VzKGdjLCBiZywgZmcsIHNlbGVjdGVkLCByZXBhaW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5JSHlwZXJsaW5rU2VnbWVudCNnZXRCb3VuZHMoKQotCSAqLwotCXB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gbmV3IFJlY3RhbmdsZShJbnRlZ2VyLk1BWF9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUsCi0JCQkJMCwgMCk7Ci0JCS8vIFRPRE8gdGhpcyBpcyB3cm9uZwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlJSHlwZXJsaW5rU2VnbWVudCBzZWdtZW50ID0gKElIeXBlcmxpbmtTZWdtZW50KSBzZWdtZW50cy5nZXQoaSk7Ci0JCQlSZWN0YW5nbGUgc2JvdW5kcyA9IHNlZ21lbnQuZ2V0Qm91bmRzKCk7Ci0JCQlib3VuZHMueCA9IE1hdGgubWluKGJvdW5kcy54LCBzYm91bmRzLngpOwotCQkJYm91bmRzLnkgPSBNYXRoLm1pbihib3VuZHMueSwgc2JvdW5kcy55KTsKLQkJCWJvdW5kcy53aWR0aCA9IE1hdGgubWF4KGJvdW5kcy53aWR0aCwgc2JvdW5kcy53aWR0aCk7Ci0JCQlib3VuZHMuaGVpZ2h0ID0gTWF0aC5tYXgoYm91bmRzLmhlaWdodCwgc2JvdW5kcy5oZWlnaHQpOwotCQl9Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlIeXBlcmxpbmtTZWdtZW50IHNlZ21lbnQgPSAoSUh5cGVybGlua1NlZ21lbnQpIHNlZ21lbnRzLmdldChpKTsKLQkJCWlmIChzZWdtZW50LmNvbnRhaW5zKHgsIHkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKFJlY3RhbmdsZSByZWN0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlIeXBlcmxpbmtTZWdtZW50IHNlZ21lbnQgPSAoSUh5cGVybGlua1NlZ21lbnQpIHNlZ21lbnRzLmdldChpKTsKLQkJCWlmIChzZWdtZW50LmludGVyc2VjdHMocmVjdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5QYXJhZ3JhcGhTZWdtZW50I2xheW91dChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JICogICAgICBpbnQsIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuTG9jYXRvciwKLQkgKiAgICAgIGphdmEudXRpbC5IYXNodGFibGUsIGJvb2xlYW4sCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzLlNlbGVjdGlvbkRhdGEpCi0JICovCi0JcHVibGljIHZvaWQgbGF5b3V0KEdDIGdjLCBpbnQgd2lkdGgsIExvY2F0b3IgbG9jYXRvciwKLQkJCUhhc2h0YWJsZSByZXNvdXJjZVRhYmxlLCBib29sZWFuIHNlbGVjdGVkKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCA9IChQYXJhZ3JhcGhTZWdtZW50KSBzZWdtZW50cy5nZXQoaSk7Ci0JCQlzZWdtZW50LmxheW91dChnYywgd2lkdGgsIGxvY2F0b3IsIHJlc291cmNlVGFibGUsIHNlbGVjdGVkKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5QYXJhZ3JhcGhTZWdtZW50I2NvbXB1dGVTZWxlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLAotCSAqICAgICAgamF2YS51dGlsLkhhc2h0YWJsZSwgYm9vbGVhbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuU2VsZWN0aW9uRGF0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlU2VsZWN0aW9uKEdDIGdjLCBIYXNodGFibGUgcmVzb3VyY2VUYWJsZSwKLQkJCVNlbGVjdGlvbkRhdGEgc2VsRGF0YSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlQYXJhZ3JhcGhTZWdtZW50IHNlZ21lbnQgPSAoUGFyYWdyYXBoU2VnbWVudCkgc2VnbWVudHMuZ2V0KGkpOwotCQkJc2VnbWVudC5jb21wdXRlU2VsZWN0aW9uKGdjLCByZXNvdXJjZVRhYmxlLCBzZWxEYXRhKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoU3RyaW5nIGZvbnRJZCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlQYXJhZ3JhcGhTZWdtZW50IHNlZ21lbnQgPSAoUGFyYWdyYXBoU2VnbWVudCkgc2VnbWVudHMuZ2V0KGkpOwotCQkJc2VnbWVudC5jbGVhckNhY2hlKGZvbnRJZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2x0aXBUZXh0KCkgewotCQlpZiAoc2VnbWVudHMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoKFBhcmFncmFwaFNlZ21lbnQpIHNlZ21lbnRzLmdldCgwKSkuZ2V0VG9vbHRpcFRleHQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldFRvb2x0aXBUZXh0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb2N1c1NlbGVjdGFibGUoSGFzaHRhYmxlIHJlc291cmNlVGFibGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMoSGFzaHRhYmxlIHJlc291cmNlVGFibGUsIGJvb2xlYW4gZGlyZWN0aW9uKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvQnJlYWtTZWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0JyZWFrU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzVkYWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvQnJlYWtTZWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci0KLS8qKgotICogVGhpcyBzZWdtZW50IHNlcnZlcyBhcyBicmVhayB3aXRoaW4gYSBwYXJhZ3JhcGguIEl0IGhhcyBubyBkYXRhIC0KLSAqIGp1c3Qgc3RhcnRzIGEgbmV3IGxpbmUgYW5kIHJlc2V0cyB0aGUgbG9jYXRvci4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQnJlYWtTZWdtZW50IGV4dGVuZHMgUGFyYWdyYXBoU2VnbWVudCB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuaW50ZXJuYWwud2lkZ2V0cy5QYXJhZ3JhcGhTZWdtZW50I2FkdmFuY2VMb2NhdG9yKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywgaW50LCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5pbnRlcm5hbC53aWRnZXRzLkxvY2F0b3IsIGphdmEudXRpbC5IYXNodGFibGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWR2YW5jZUxvY2F0b3IoR0MgZ2MsIGludCB3SGludCwgTG9jYXRvciBsb2NhdG9yLAotCQkJSGFzaHRhYmxlIG9iamVjdFRhYmxlLCBib29sZWFuIGNvbXB1dGVIZWlnaHRPbmx5KSB7Ci0JCWlmIChsb2NhdG9yLnJvd0hlaWdodD09MCkgewotCQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCQkJbG9jYXRvci5yb3dIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsKLQkJfQotCQlpZiAoY29tcHV0ZUhlaWdodE9ubHkpIGxvY2F0b3IuY29sbGVjdEhlaWdodHMoKTsJCQotCQlsb2NhdG9yLnggPSBsb2NhdG9yLmluZGVudDsKLQkJbG9jYXRvci55ICs9IGxvY2F0b3Iucm93SGVpZ2h0OwotCQlsb2NhdG9yLnJvd0hlaWdodCA9IDA7Ci0JCWxvY2F0b3IubGVhZGluZyA9IDA7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBib29sZWFuIGhvdmVyLCBIYXNodGFibGUgcmVzb3VyY2VUYWJsZSwgYm9vbGVhbiBzZWxlY3RlZCwgU2VsZWN0aW9uRGF0YSBzZWxEYXRhLCBSZWN0YW5nbGUgcmVwYWludFJlZ2lvbikgewotCQkvL25vdGhpbmcgdG8gcGFpbnQKLQl9Ci0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhSZWN0YW5nbGUgcmVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuUGFyYWdyYXBoU2VnbWVudCNsYXlvdXQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuTG9jYXRvciwgamF2YS51dGlsLkhhc2h0YWJsZSwgYm9vbGVhbiwgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5TZWxlY3Rpb25EYXRhKQotCSAqLwotCXB1YmxpYyB2b2lkIGxheW91dChHQyBnYywgaW50IHdpZHRoLCBMb2NhdG9yIGxvY2F0b3IsIEhhc2h0YWJsZSBSZXNvdXJjZVRhYmxlLAotCQkJYm9vbGVhbiBzZWxlY3RlZCkgewotCQlsb2NhdG9yLnJlc2V0Q2FyZXQoKTsKLQkJaWYgKGxvY2F0b3Iucm93SGVpZ2h0PT0wKSB7Ci0JCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQlsb2NhdG9yLnJvd0hlaWdodCA9IGZtLmdldEhlaWdodCgpOwotCQl9Ci0JCWxvY2F0b3IueSArPSBsb2NhdG9yLnJvd0hlaWdodDsKLQkJbG9jYXRvci5yb3dIZWlnaHQgPSAwOwotCQlsb2NhdG9yLnJvd0NvdW50ZXIrKzsJCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuUGFyYWdyYXBoU2VnbWVudCNjb21wdXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywgamF2YS51dGlsLkhhc2h0YWJsZSwgYm9vbGVhbiwgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5TZWxlY3Rpb25EYXRhKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXB1dGVTZWxlY3Rpb24oR0MgZ2MsIEhhc2h0YWJsZSByZXNvdXJjZVRhYmxlLCBTZWxlY3Rpb25EYXRhIHNlbERhdGEpIHsKLQkJc2VsRGF0YS5tYXJrTmV3TGluZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvQnVsbGV0UGFyYWdyYXBoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0J1bGxldFBhcmFncmFwaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODA0ZTA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvQnVsbGV0UGFyYWdyYXBoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci0KLXB1YmxpYyBjbGFzcyBCdWxsZXRQYXJhZ3JhcGggZXh0ZW5kcyBQYXJhZ3JhcGggewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENJUkNMRSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNQUdFID0gMzsKLQotCXByaXZhdGUgaW50IHN0eWxlID0gQ0lSQ0xFOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXByaXZhdGUgaW50IENJUkNMRV9ESUFNID0gNTsKLQotCXByaXZhdGUgaW50IFNQQUNJTkcgPSAxMDsKLQotCXByaXZhdGUgaW50IGluZGVudCA9IC0xOwotCi0JcHJpdmF0ZSBpbnQgYmluZGVudCA9IC0xOwotCi0JcHJpdmF0ZSBSZWN0YW5nbGUgYmJvdW5kczsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCdWxsZXRQYXJhZ3JhcGguCi0JICogCi0JICogQHBhcmFtIGFkZFZlcnRpY2FsU3BhY2UKLQkgKi8KLQlwdWJsaWMgQnVsbGV0UGFyYWdyYXBoKGJvb2xlYW4gYWRkVmVydGljYWxTcGFjZSkgewotCQlzdXBlcihhZGRWZXJ0aWNhbFNwYWNlKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEluZGVudCgpIHsKLQkJaW50IGl2YWx1ZSA9IGluZGVudDsKLQkJaWYgKGl2YWx1ZSAhPSAtMSkKLQkJCXJldHVybiBpdmFsdWU7Ci0JCXN3aXRjaCAoc3R5bGUpIHsKLQkJY2FzZSBDSVJDTEU6Ci0JCQlpdmFsdWUgPSBDSVJDTEVfRElBTSArIFNQQUNJTkc7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWl2YWx1ZSA9IDIwOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGdldEJ1bGxldEluZGVudCgpICsgaXZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QnVsbGV0SW5kZW50KCkgewotCQlpZiAoYmluZGVudCAhPSAtMSkKLQkJCXJldHVybiBiaW5kZW50OwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUJ1bGxldFBhcmFncmFwaCNnZXRCdWxsZXRTdHlsZSgpCi0JICovCi0JcHVibGljIGludCBnZXRCdWxsZXRTdHlsZSgpIHsKLQkJcmV0dXJuIHN0eWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1bGxldFN0eWxlKGludCBzdHlsZSkgewotCQl0aGlzLnN0eWxlID0gc3R5bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnVsbGV0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLnRleHQgPSB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZGVudChpbnQgaW5kZW50KSB7Ci0JCXRoaXMuaW5kZW50ID0gaW5kZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1bGxldEluZGVudChpbnQgYmluZGVudCkgewotCQl0aGlzLmJpbmRlbnQgPSBiaW5kZW50OwotCX0KLQotCS8qCi0JICogQHNlZSBJQnVsbGV0UGFyYWdyYXBoI2dldEJ1bGxldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnVsbGV0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbGF5b3V0KEdDIGdjLCBpbnQgd2lkdGgsIExvY2F0b3IgbG9jLCBpbnQgbGluZUhlaWdodCwKLQkJCUhhc2h0YWJsZSByZXNvdXJjZVRhYmxlLCBJSHlwZXJsaW5rU2VnbWVudCBzZWxlY3RlZExpbmspIHsKLQkJY29tcHV0ZVJvd0hlaWdodHMoZ2MsIHdpZHRoLCBsb2MsIGxpbmVIZWlnaHQsIHJlc291cmNlVGFibGUpOwotCQlsYXlvdXRCdWxsZXQoZ2MsIGxvYywgbGluZUhlaWdodCwgcmVzb3VyY2VUYWJsZSk7Ci0JCXN1cGVyLmxheW91dChnYywgd2lkdGgsIGxvYywgbGluZUhlaWdodCwgcmVzb3VyY2VUYWJsZSwgc2VsZWN0ZWRMaW5rKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgUmVjdGFuZ2xlIHJlcGFpbnRSZWdpb24sCi0JCQlIYXNodGFibGUgcmVzb3VyY2VUYWJsZSwgSUh5cGVybGlua1NlZ21lbnQgc2VsZWN0ZWRMaW5rLAotCQkJU2VsZWN0aW9uRGF0YSBzZWxEYXRhKSB7Ci0JCXBhaW50QnVsbGV0KGdjLCByZXBhaW50UmVnaW9uLCByZXNvdXJjZVRhYmxlKTsKLQkJc3VwZXIucGFpbnQoZ2MsIHJlcGFpbnRSZWdpb24sIHJlc291cmNlVGFibGUsIHNlbGVjdGVkTGluaywgc2VsRGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxheW91dEJ1bGxldChHQyBnYywgTG9jYXRvciBsb2MsIGludCBsaW5lSGVpZ2h0LAotCQkJSGFzaHRhYmxlIHJlc291cmNlVGFibGUpIHsKLQkJaW50IHggPSBsb2MueCAtIGdldEluZGVudCgpICsgZ2V0QnVsbGV0SW5kZW50KCk7Ci0JCWludCByb3dIZWlnaHQgPSAoKGludFtdKSBsb2MuaGVpZ2h0cy5nZXQoMCkpWzBdOwotCQlpZiAoc3R5bGUgPT0gQ0lSQ0xFKSB7Ci0JCQlpbnQgeSA9IGxvYy55ICsgcm93SGVpZ2h0IC8gMiAtIENJUkNMRV9ESUFNIC8gMjsKLQkJCWJib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHgsIHksIENJUkNMRV9ESUFNLCBDSVJDTEVfRElBTSk7Ci0JCX0gZWxzZSBpZiAoc3R5bGUgPT0gVEVYVCAmJiB0ZXh0ICE9IG51bGwpIHsKLQkJCS8vaW50IGhlaWdodCA9IGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCk7Ci0JCQlQb2ludCB0ZXh0U2l6ZSA9IGdjLnRleHRFeHRlbnQodGV4dCk7Ci0JCQliYm91bmRzID0gbmV3IFJlY3RhbmdsZSh4LCBsb2MueSwgdGV4dFNpemUueCwgdGV4dFNpemUueSk7Ci0JCX0gZWxzZSBpZiAoc3R5bGUgPT0gSU1BR0UgJiYgdGV4dCAhPSBudWxsKSB7Ci0JCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgcmVzb3VyY2VUYWJsZS5nZXQodGV4dCk7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCVJlY3RhbmdsZSBpYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQkJaW50IHkgPSBsb2MueSArIHJvd0hlaWdodCAvIDIgLSBpYm91bmRzLmhlaWdodCAvIDI7Ci0JCQkJYmJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoeCwgeSwgaWJvdW5kcy53aWR0aCwgaWJvdW5kcy5oZWlnaHQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnRCdWxsZXQoR0MgZ2MsIFJlY3RhbmdsZSByZXBhaW50UmVnaW9uLAotCQkJSGFzaHRhYmxlIHJlc291cmNlVGFibGUpIHsKLQkJaWYgKGJib3VuZHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IHggPSBiYm91bmRzLng7Ci0JCWludCB5ID0gYmJvdW5kcy55OwotCQlpZiAocmVwYWludFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQl4IC09IHJlcGFpbnRSZWdpb24ueDsKLQkJCXkgLT0gcmVwYWludFJlZ2lvbi55OwotCQl9Ci0JCWlmIChzdHlsZSA9PSBDSVJDTEUpIHsKLQkJCUNvbG9yIGJnID0gZ2MuZ2V0QmFja2dyb3VuZCgpOwotCQkJQ29sb3IgZmcgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGZnKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUoeCwgeSArIDEsIDUsIDMpOwotCQkJZ2MuZmlsbFJlY3RhbmdsZSh4ICsgMSwgeSwgMywgNSk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGJnKTsKLQkJfSBlbHNlIGlmIChzdHlsZSA9PSBURVhUICYmIHRleHQgIT0gbnVsbCkgewotCQkJZ2MuZHJhd1RleHQodGV4dCwgeCwgeSk7Ci0JCX0gZWxzZSBpZiAoc3R5bGUgPT0gSU1BR0UgJiYgdGV4dCAhPSBudWxsKSB7Ci0JCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgcmVzb3VyY2VUYWJsZS5nZXQodGV4dCk7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9CdXN5SW5kaWNhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0J1c3lJbmRpY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczZjNjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0J1c3lJbmRpY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotcHVibGljIGNsYXNzIEJ1c3lJbmRpY2F0b3IgZXh0ZW5kcyBDYW52YXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVJHSU4gPSAyOwotCi0JcHJpdmF0ZSBJbWFnZURhdGFbXSBwcm9ncmVzc0RhdGE7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VMb2FkZXIgbG9hZGVyOwotCi0JcHJvdGVjdGVkIEltYWdlIGltYWdlOwotCi0JcHJvdGVjdGVkIEltYWdlIGFuaW1hdGlvbkltYWdlOwotCi0JcHJvdGVjdGVkIFRocmVhZCBidXN5VGhyZWFkOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3RvcDsKLQotCS8qKgotCSAqIEJ1c3lXaWRnZXQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBCdXN5SW5kaWNhdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQotCQlsb2FkUHJvZ3Jlc3NJbWFnZSgpOwotCi0JCWFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotCQkJCW9uUGFpbnQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFByb2dyZXNzSW1hZ2UoKSB7Ci0JCUlucHV0U3RyZWFtIGlzID0gQnVzeUluZGljYXRvci5jbGFzcwotCQkJCS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJwcm9ncmVzcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQl0cnkgewotCQkJCXByb2dyZXNzRGF0YSA9IGxvYWRlci5sb2FkKGlzKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQlQb2ludCBzaXplID0gbmV3IFBvaW50KDAsIDApOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIGlib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJCXNpemUueCA9IGlib3VuZHMud2lkdGg7Ci0JCQlzaXplLnkgPSBpYm91bmRzLmhlaWdodDsKLQkJfQotCQlpZiAobG9hZGVyICE9IG51bGwpIHsKLQkJCXNpemUueCA9IE1hdGgubWF4KHNpemUueCwgbG9hZGVyLmxvZ2ljYWxTY3JlZW5XaWR0aCk7Ci0JCQlzaXplLnkgPSBNYXRoLm1heChzaXplLnksIGxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0KTsKLQkJfQotCQlzaXplLnggKz0gTUFSR0lOICsgTUFSR0lOOwotCQlzaXplLnkgKz0gTUFSR0lOICsgTUFSR0lOOwotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGhyZWFkIHRvIGFuaW1hdGUgdGhlIGltYWdlLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBjcmVhdGVCdXN5VGhyZWFkKCkgewotCQlpZiAoYnVzeVRocmVhZCAhPSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXN0b3AgPSBmYWxzZTsKLQkJYnVzeVRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlwcml2YXRlIEltYWdlIHRpbWFnZTsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCS8qCi0JCQkJCSAqIENyZWF0ZSBhbiBvZmYtc2NyZWVuIGltYWdlIHRvIGRyYXcgb24sIGFuZCBmaWxsIGl0IHdpdGgKLQkJCQkJICogdGhlIHNoZWxsIGJhY2tncm91bmQuCi0JCQkJCSAqLwotCQkJCQlJbWFnZSBvZmZTY3JlZW5JbWFnZSA9IG5ldyBJbWFnZShnZXREaXNwbGF5KCksCi0JCQkJCQkJbG9hZGVyLmxvZ2ljYWxTY3JlZW5XaWR0aCwKLQkJCQkJCQlsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCk7Ci0JCQkJCWZpbmFsIEdDIG9mZlNjcmVlbkltYWdlR0MgPSBuZXcgR0Mob2ZmU2NyZWVuSW1hZ2UpOwotCQkJCQlnZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlkcmF3QmFja2dyb3VuZChvZmZTY3JlZW5JbWFnZUdDLCAwLCAwLCBsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoLCBsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQkvL2lmIChnZXRCYWNrZ3JvdW5kKCkhPW51bGwpIAotCQkJCQkvLwlvZmZTY3JlZW5JbWFnZUdDLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQkJCQkJLy9vZmZTY3JlZW5JbWFnZUdDLmZpbGxSZWN0YW5nbGUoMCwgMCwKLQkJCQkJLy8JCWxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGgsCi0JCQkJCS8vCQlsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCk7Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBDcmVhdGUgdGhlIGZpcnN0IGltYWdlIGFuZCBkcmF3IGl0IG9uIHRoZSBvZmYtc2NyZWVuCi0JCQkJCQkgKiBpbWFnZS4KLQkJCQkJCSAqLwotCQkJCQkJaW50IGltYWdlRGF0YUluZGV4ID0gMDsKLQkJCQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSBwcm9ncmVzc0RhdGFbaW1hZ2VEYXRhSW5kZXhdOwotCQkJCQkJaWYgKHRpbWFnZSAhPSBudWxsICYmICF0aW1hZ2UuaXNEaXNwb3NlZCgpKQotCQkJCQkJCXRpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQl0aW1hZ2UgPSBuZXcgSW1hZ2UoZ2V0RGlzcGxheSgpLCBpbWFnZURhdGEpOwotCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UodGltYWdlLCAwLCAwLAotCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS5oZWlnaHQsIGltYWdlRGF0YS54LAotCQkJCQkJCQlpbWFnZURhdGEueSwgaW1hZ2VEYXRhLndpZHRoLCBpbWFnZURhdGEuaGVpZ2h0KTsKLQotCQkJCQkJLyoKLQkJCQkJCSAqIE5vdyBsb29wIHRocm91Z2ggdGhlIGltYWdlcywgY3JlYXRpbmcgYW5kIGRyYXdpbmcKLQkJCQkJCSAqIGVhY2ggb25lIG9uIHRoZSBvZmYtc2NyZWVuIGltYWdlIGJlZm9yZSBkcmF3aW5nIGl0IG9uCi0JCQkJCQkgKiB0aGUgc2hlbGwuCi0JCQkJCQkgKi8KLQkJCQkJCWludCByZXBlYXRDb3VudCA9IGxvYWRlci5yZXBlYXRDb3VudDsKLQkJCQkJCXdoaWxlIChsb2FkZXIucmVwZWF0Q291bnQgPT0gMCB8fCByZXBlYXRDb3VudCA+IDApIHsKLQkJCQkJCQlpZiAoc3RvcCB8fCBpc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCXN3aXRjaCAoaW1hZ2VEYXRhLmRpc3Bvc2FsTWV0aG9kKSB7Ci0JCQkJCQkJY2FzZSBTV1QuRE1fRklMTF9CQUNLR1JPVU5EOgotCQkJCQkJCQkvKgotCQkJCQkJCQkgKiBGaWxsIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgYmVmb3JlCi0JCQkJCQkJCSAqIGRyYXdpbmcuCi0JCQkJCQkJCSAqLwotCQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmZpbGxSZWN0YW5nbGUoaW1hZ2VEYXRhLngsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLnksIGltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBTV1QuRE1fRklMTF9QUkVWSU9VUzoKLQkJCQkJCQkJLyogUmVzdG9yZSB0aGUgcHJldmlvdXMgaW1hZ2UgYmVmb3JlIGRyYXdpbmcuICovCi0JCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZHJhd0ltYWdlKHRpbWFnZSwgMCwgMCwKLQkJCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLngsIGltYWdlRGF0YS55LAotCQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQotCQkJCQkJCWltYWdlRGF0YUluZGV4ID0gKGltYWdlRGF0YUluZGV4ICsgMSkKLQkJCQkJCQkJCSUgcHJvZ3Jlc3NEYXRhLmxlbmd0aDsKLQkJCQkJCQlpbWFnZURhdGEgPSBwcm9ncmVzc0RhdGFbaW1hZ2VEYXRhSW5kZXhdOwotCQkJCQkJCXRpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQkJdGltYWdlID0gbmV3IEltYWdlKGdldERpc3BsYXkoKSwgaW1hZ2VEYXRhKTsKLQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSh0aW1hZ2UsIDAsIDAsCi0JCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJCQlpbWFnZURhdGEueCwgaW1hZ2VEYXRhLnksIGltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCi0JCQkJCQkJLyogRHJhdyB0aGUgb2ZmLXNjcmVlbiBpbWFnZSB0byB0aGUgc2hlbGwuICovCi0JCQkJCQkJYW5pbWF0aW9uSW1hZ2UgPSBvZmZTY3JlZW5JbWFnZTsKLQkJCQkJCQlnZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlpZiAoIWlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJCQlyZWRyYXcoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJCS8qCi0JCQkJCQkJICogU2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgZGVsYXkgdGltZSAoYWRkaW5nCi0JCQkJCQkJICogY29tbW9ubHktdXNlZCBzbG93LWRvd24gZnVkZ2UgZmFjdG9ycykuCi0JCQkJCQkJICovCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaW50IG1zID0gaW1hZ2VEYXRhLmRlbGF5VGltZSAqIDEwOwotCQkJCQkJCQlpZiAobXMgPCAyMCkKLQkJCQkJCQkJCW1zICs9IDMwOwotCQkJCQkJCQlpZiAobXMgPCAzMCkKLQkJCQkJCQkJCW1zICs9IDEwOwotCQkJCQkJCQlUaHJlYWQuc2xlZXAobXMpOwotCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9Ci0KLQkJCQkJCQkvKgotCQkJCQkJCSAqIElmIHdlIGhhdmUganVzdCBkcmF3biB0aGUgbGFzdCBpbWFnZSwgZGVjcmVtZW50Ci0JCQkJCQkJICogdGhlIHJlcGVhdCBjb3VudCBhbmQgc3RhcnQgYWdhaW4uCi0JCQkJCQkJICovCi0JCQkJCQkJaWYgKGltYWdlRGF0YUluZGV4ID09IHByb2dyZXNzRGF0YS5sZW5ndGggLSAxKQotCQkJCQkJCQlyZXBlYXRDb3VudC0tOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIlRoZXJlIHdhcyBhbiBlcnJvciBhbmltYXRpbmcgdGhlIEdJRiIpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKG9mZlNjcmVlbkltYWdlICE9IG51bGwKLQkJCQkJCQkJJiYgIW9mZlNjcmVlbkltYWdlLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQlvZmZTY3JlZW5JbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQlpZiAob2ZmU2NyZWVuSW1hZ2VHQyAhPSBudWxsCi0JCQkJCQkJCSYmICFvZmZTY3JlZW5JbWFnZUdDLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRpc3Bvc2UoKTsKLQkJCQkJCWlmICh0aW1hZ2UgIT0gbnVsbCAmJiAhdGltYWdlLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQl0aW1hZ2UuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChidXN5VGhyZWFkID09IG51bGwpCi0JCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlhbmltYXRpb25JbWFnZSA9IG51bGw7Ci0JCQkJCQkJCXJlZHJhdygpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJCdXN5IGVycm9yIiwgZSk7Ci0JCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWJ1c3lUaHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgKyAyKTsKLQkJYnVzeVRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCWJ1c3lUaHJlYWQuc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdG9wID0gdHJ1ZTsKLQkJYnVzeVRocmVhZCA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBjdXJyZW50bHkgYnVzeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0J1c3koKSB7Ci0JCXJldHVybiAoYnVzeVRocmVhZCAhPSBudWxsKTsKLQl9Ci0KLQkvKgotCSAqIFByb2Nlc3MgdGhlIHBhaW50IGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgb25QYWludChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChhbmltYXRpb25JbWFnZSE9bnVsbCAmJiBhbmltYXRpb25JbWFnZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWFuaW1hdGlvbkltYWdlPW51bGw7Ci0JCX0KLQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRDbGllbnRBcmVhKCk7Ci0JCWlmIChyZWN0LndpZHRoID09IDAgfHwgcmVjdC5oZWlnaHQgPT0gMCkKLQkJCXJldHVybjsKLQotCQlHQyBnYyA9IGV2ZW50LmdjOwotCQlJbWFnZSBhY3RpdmVJbWFnZSA9IGFuaW1hdGlvbkltYWdlICE9IG51bGwgPyBhbmltYXRpb25JbWFnZSA6IGltYWdlOwotCQlpZiAoYWN0aXZlSW1hZ2UgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIGlib3VuZHMgPSBhY3RpdmVJbWFnZS5nZXRCb3VuZHMoKTsKLQkJCWdjLmRyYXdJbWFnZShhY3RpdmVJbWFnZSwgcmVjdC53aWR0aCAvIDIgLSBpYm91bmRzLndpZHRoIC8gMiwKLQkJCQkJcmVjdC5oZWlnaHQgLyAyIC0gaWJvdW5kcy5oZWlnaHQgLyAyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluZGljYXRvcnMgYnVzeSBjb3VudCB1cCAodHJ1ZSkgb3IgZG93biAoZmFsc2UpIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVzeQotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRCdXN5KGJvb2xlYW4gYnVzeSkgewotCQlpZiAoYnVzeSkgewotCQkJaWYgKGJ1c3lUaHJlYWQgPT0gbnVsbCkKLQkJCQljcmVhdGVCdXN5VGhyZWFkKCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYnVzeVRocmVhZCAhPSBudWxsKSB7Ci0JCQkJc3RvcCA9IHRydWU7Ci0JCQkJYnVzeVRocmVhZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGltYWdlLiBUaGUgdmFsdWUgPGNvZGU+bnVsbDwvY29kZT4gY2xlYXJzIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCWlmIChpbWFnZSAhPSB0aGlzLmltYWdlICYmICFpc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQkJCXJlZHJhdygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9Db250cm9sU2VnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9Db250cm9sU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTNjYTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvQ29udHJvbFNlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLXB1YmxpYyBjbGFzcyBDb250cm9sU2VnbWVudCBleHRlbmRzIE9iamVjdFNlZ21lbnQgaW1wbGVtZW50cyBJRm9jdXNTZWxlY3RhYmxlIHsKLQlwcml2YXRlIGJvb2xlYW4gZmlsbDsKLQkKLQlwdWJsaWMgQ29udHJvbFNlZ21lbnQoKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpbGwoYm9vbGVhbiBmaWxsKSB7Ci0JCXRoaXMuZmlsbCA9IGZpbGw7Ci0JfQotCQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woSGFzaHRhYmxlIHJlc291cmNlVGFibGUpIHsKLQkJT2JqZWN0IG9iaiA9IHJlc291cmNlVGFibGUuZ2V0KGdldE9iamVjdElkKCkpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udHJvbCkgewotCQkJQ29udHJvbCBjID0gKENvbnRyb2wpb2JqOwotCQkJaWYgKCFjLmlzRGlzcG9zZWQoKSkKLQkJCQlyZXR1cm4gYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0T2JqZWN0U2l6ZShIYXNodGFibGUgcmVzb3VyY2VUYWJsZSwgaW50IHdIaW50KSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2wocmVzb3VyY2VUYWJsZSk7Ci0JCWlmIChjb250cm9sPT1udWxsKQotCQkJcmV0dXJuIG5ldyBQb2ludCgwLDApOwotCQlpbnQgcmVhbFdoaW50ID0gRm9ybVV0aWwuZ2V0V2lkdGhIaW50KHdIaW50LCBjb250cm9sKTsKLQkJUG9pbnQgc2l6ZSA9IGNvbnRyb2wuY29tcHV0ZVNpemUocmVhbFdoaW50LCBTV1QuREVGQVVMVCk7Ci0JCWlmICh3SGludCE9U1dULkRFRkFVTFQgJiYgZmlsbCkKLQkJCXNpemUueCA9IE1hdGgubWF4KHNpemUueCwgd0hpbnQpOwotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbGF5b3V0KEdDIGdjLCBpbnQgd2lkdGgsIExvY2F0b3IgbG9jLCBIYXNodGFibGUgcmVzb3VyY2VUYWJsZSwKLQkJCWJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJc3VwZXIubGF5b3V0KGdjLCB3aWR0aCwgbG9jLCByZXNvdXJjZVRhYmxlLCBzZWxlY3RlZCk7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2wocmVzb3VyY2VUYWJsZSk7Ci0JCWlmIChjb250cm9sIT1udWxsKQotCQkJY29udHJvbC5zZXRCb3VuZHMoZ2V0Qm91bmRzKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldEZvY3VzKEhhc2h0YWJsZSByZXNvdXJjZVRhYmxlLCBib29sZWFuIG5leHQpIHsKLQkJQ29udHJvbCBjID0gZ2V0Q29udHJvbChyZXNvdXJjZVRhYmxlKTsKLQkJaWYgKGMhPW51bGwpIHsKLQkJCXJldHVybiBzZXRGb2N1cyhjLCBuZXh0KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzZXRGb2N1cyhDb250cm9sIGMsIGJvb2xlYW4gZGlyZWN0aW9uKSB7Ci0JCWlmIChjIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0JCQlDb21wb3NpdGUgY29tcCA9IChDb21wb3NpdGUpYzsKLQkJCUNvbnRyb2wgW10gdGFiTGlzdCA9IGNvbXAuZ2V0VGFiTGlzdCgpOwotCQkJaWYgKGRpcmVjdGlvbikgewotCQkJCWZvciAoaW50IGk9MDsgaTx0YWJMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzZXRGb2N1cyh0YWJMaXN0W2ldLCBkaXJlY3Rpb24pKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaT10YWJMaXN0Lmxlbmd0aC0xOyBpPj0wOyBpLS0pIHsKLQkJCQkJaWYgKHNldEZvY3VzKHRhYkxpc3RbaV0sIGRpcmVjdGlvbikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIShjIGluc3RhbmNlb2YgQ2FudmFzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGMuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzU2VsZWN0YWJsZShIYXNodGFibGUgcmVzb3VyY2VUYWJsZSkgewotCQlDb250cm9sIGMgPSBnZXRDb250cm9sKHJlc291cmNlVGFibGUpOwotCQlpZiAoYyE9bnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvRm9ybUhlYWRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvRm9ybUhlYWRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxNjVlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0Zvcm1IZWFkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSUxheW91dEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2l6ZUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLk1lc3NhZ2VzOwotCi0vKioKLSAqIEZvcm0gaGVhZGVyIG1vdmVkIG91dCBvZiB0aGUgZm9ybSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIEZvcm1IZWFkaW5nIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcml2YXRlIGludCBUSVRMRV9ITUFSR0lOID0gMTA7Ci0KLQlwcml2YXRlIGludCBUSVRMRV9WTUFSR0lOID0gNTsKLQotCXByaXZhdGUgaW50IFRJVExFX0dBUCA9IDU7Ci0KLQlwcml2YXRlIGludCBTRVBBUkFUT1JfSEVJR0hUID0gNjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTX1RJTEVEID0gMSA8PCAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNfQ0xJUFBFRCA9IDEgPDwgMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTX1NFUEFSQVRPUiA9IDEgPDwgMzsKLQotCXByaXZhdGUgaW50IHN0eWxlID0gU19DTElQUEVEIHwgU1dULkxFRlQ7Ci0KLQlwcml2YXRlIEltYWdlIGdyYWRpZW50SW1hZ2U7Ci0KLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JcHJpdmF0ZSBDb2xvciBiYXNlQmc7Ci0KLQlwcml2YXRlIENvbG9yIHNlcGFyYXRvckNvbG9yOwotCi0JcHJpdmF0ZSBHcmFkaWVudEluZm8gZ3JhZGllbnRJbmZvOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXByaXZhdGUgVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXI7Ci0KLQlwcml2YXRlIFNpemVDYWNoZSB0aXRsZUNhY2hlID0gbmV3IFNpemVDYWNoZSgpOwotCi0JcHJpdmF0ZSBTaXplQ2FjaGUgdG9vbGJhckNhY2hlID0gbmV3IFNpemVDYWNoZSgpOwotCi0JcHJpdmF0ZSBTaXplQ2FjaGUgY2xpZW50Q2FjaGUgPSBuZXcgU2l6ZUNhY2hlKCk7Ci0KLQlwcml2YXRlIEJ1c3lJbmRpY2F0b3IgYnVzeUxhYmVsOwotCi0JcHJpdmF0ZSBMYWJlbCB0aXRsZUxhYmVsOwotCi0JcHJpdmF0ZSBDb250cm9sIGhlYWRDbGllbnQ7Ci0KLQlwcml2YXRlIE1lc3NhZ2VBcmVhIG1lc3NhZ2VBcmVhOwotCi0JcHJpdmF0ZSBjbGFzcyBHcmFkaWVudEluZm8gewotCQlDb2xvcltdIGdyYWRpZW50Q29sb3JzOwotCi0JCWludFtdIHBlcmNlbnRzOwotCi0JCWJvb2xlYW4gdmVydGljYWw7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBNZXNzYWdlQXJlYSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX0JPUkRFUiA9IFNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1c7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBCVVRUT05fRklMTCA9IFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQ7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBCVVRUT05fU0laRSA9IDE4OwotCi0JCXByaXZhdGUgSW1hZ2Ugbm9ybWFsOwotCi0JCXByaXZhdGUgSW1hZ2UgaG90OwotCi0JCXN0YXRpYyBmaW5hbCBpbnQgQ0xPU0VEID0gMDsKLQotCQlzdGF0aWMgZmluYWwgaW50IE9QRU5OSU5HID0gMTsKLQotCQlzdGF0aWMgZmluYWwgaW50IE9QRU4gPSAyOwotCi0JCXN0YXRpYyBmaW5hbCBpbnQgQ0xPU0lORyA9IDM7Ci0KLQkJcHJpdmF0ZSBDTGFiZWwgbGFiZWw7Ci0KLQkJcHJpdmF0ZSBJbWFnZUh5cGVybGluayBybGluazsKLQotCQlwcml2YXRlIEltYWdlSHlwZXJsaW5rIG1saW5rOwotCi0JCXByaXZhdGUgaW50IHN0YXRlID0gQ0xPU0VEOwotCi0JCXByaXZhdGUgYm9vbGVhbiBtaW5pbWl6ZWQ7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGFuaW1hdGlvblN0YXJ0OwotCi0JCXB1YmxpYyBNZXNzYWdlQXJlYShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJCXN1cGVyKHBhcmVudCwgU1dULk5VTEwpOwotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5VTEwpOwotCQkJR3JpZExheW91dCBnbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWdsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQlnbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWdsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWNvbnRhaW5lci5zZXRMYXlvdXQoZ2xheW91dCk7Ci0JCQlsYWJlbCA9IG5ldyBDTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCW1saW5rID0gbmV3IEltYWdlSHlwZXJsaW5rKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQkJbWxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJCXNldE1pbmltaXplZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCW1saW5rLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLkZvcm1fdG9vbHRpcF9taW5pbWl6ZSk7Ci0JCQlybGluayA9IG5ldyBJbWFnZUh5cGVybGluayh0aGlzLCBTV1QuTlVMTCk7Ci0JCQlybGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQkJc2V0TWluaW1pemVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWlmIChncmFkaWVudEluZm8gPT0gbnVsbCAmJiBnZXRCYWNrZ3JvdW5kSW1hZ2UoKSA9PSBudWxsKQotCQkJCXJsaW5rLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQkJCXJsaW5rLnNldFZpc2libGUoZmFsc2UpOwotCQkJcmxpbmsuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuRm9ybV90b29sdGlwX3Jlc3RvcmUpOwotCQkJY3JlYXRlTWluaW1pemVkSW1hZ2VzKCk7Ci0JCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJb25QYWludChlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJCWRpc3Bvc2VNaW5pbWl6ZUltYWdlcygpOwotCQkJCX0KLQkJCX0pOwotCQkJc2V0TGF5b3V0KG5ldyBMYXlvdXQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQkJCQlSZWN0YW5nbGUgY2FyZWEgPSBnZXRDbGllbnRBcmVhKCk7Ci0JCQkJCWlmIChtaW5pbWl6ZWQpIHsKLQkJCQkJCXJsaW5rLnNldEJvdW5kcyhjYXJlYS54LCBjYXJlYS55LCBjYXJlYS53aWR0aCwKLQkJCQkJCQkJY2FyZWEuaGVpZ2h0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWxhYmVsLmdldFBhcmVudCgpLnNldEJvdW5kcyhjYXJlYS54ICsgMiwgY2FyZWEueSArIDIsCi0JCQkJCQkJCWNhcmVhLndpZHRoIC0gNCwgY2FyZWEuaGVpZ2h0IC0gNCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdIaW50LAotCQkJCQkJaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJCQkJUG9pbnQgc2l6ZSA9IG5ldyBQb2ludCgwLCAwKTsKLQkJCQkJaWYgKG1pbmltaXplZCkKLQkJCQkJCXNpemUgPSBybGluay5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQsIGNoYW5nZWQpOwotCQkJCQllbHNlCi0JCQkJCQlzaXplID0gbGFiZWwuZ2V0UGFyZW50KCkuY29tcHV0ZVNpemUod0hpbnQsIGhIaW50LAotCQkJCQkJCQljaGFuZ2VkKTsKLQkJCQkJaWYgKCFtaW5pbWl6ZWQpIHsKLQkJCQkJCXNpemUueCArPSA0OwotCQkJCQkJc2l6ZS55ICs9IDQ7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHNpemU7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRNaW5pbWl6ZWQoYm9vbGVhbiBtaW5pbWl6ZWQpIHsKLQkJCXNldEJhY2tncm91bmQobWluaW1pemVkID8gbnVsbCA6IGJhc2VCZyk7Ci0JCQl0aGlzLm1pbmltaXplZCA9IG1pbmltaXplZDsKLQkJCWlmIChtaW5pbWl6ZWQpIHsKLQkJCQlybGluay5zZXRJbWFnZShsYWJlbC5nZXRJbWFnZSgpKTsKLQkJCX0KLQkJCXJsaW5rLnNldFZpc2libGUobWluaW1pemVkKTsKLQkJCWxhYmVsLmdldFBhcmVudCgpLnNldFZpc2libGUoIW1pbmltaXplZCk7Ci0JCQlsYXlvdXQoKTsKLQotCQkJRm9ybUhlYWRpbmcudGhpcy5sYXlvdXQoKTsKLQkJCUZvcm1IZWFkaW5nLnRoaXMucmVkcmF3KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc01pbmltaXplZCgpIHsKLQkJCXJldHVybiBtaW5pbWl6ZWQ7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U3RhdGUoaW50IHN0YXRlKSB7Ci0JCQl0aGlzLnN0YXRlID0gc3RhdGU7Ci0JCQlpZiAoc3RhdGUgPT0gT1BFTk5JTkcpCi0JCQkJc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWVsc2UgaWYgKHN0YXRlID09IENMT1NFRCkKLQkJCQlzZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7Ci0JCQlyZXR1cm4gc3RhdGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKENvbG9yIGJnKSB7Ci0JCQlzdXBlci5zZXRCYWNrZ3JvdW5kKGJnKTsKLQkJCWxhYmVsLnNldEJhY2tncm91bmQoYmcpOwotCQkJbWxpbmsuc2V0QmFja2dyb3VuZChiZyk7Ci0JCQlybGluay5zZXRCYWNrZ3JvdW5kKGJnKTsKLQkJCWxhYmVsLmdldFBhcmVudCgpLnNldEJhY2tncm91bmQoYmcpOwotCQkJY3JlYXRlTWluaW1pemVkSW1hZ2VzKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCQl0aGlzLmxhYmVsLnNldFRleHQodGV4dCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQkJdGhpcy5sYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0luVHJhbnNpdGlvbigpIHsKLQkJCXJldHVybiBzdGF0ZSA9PSBPUEVOTklORyB8fCBzdGF0ZSA9PSBDTE9TSU5HOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIG9uUGFpbnQoUGFpbnRFdmVudCBlKSB7Ci0JCQlpZiAobWluaW1pemVkKQotCQkJCXJldHVybjsKLQkJCVJlY3RhbmdsZSBjYXJlYSA9IGdldENsaWVudEFyZWEoKTsKLQkJCWUuZ2Muc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOwotCQkJZS5nYy5kcmF3UG9seWxpbmUobmV3IGludFtdIHsgY2FyZWEueCwgY2FyZWEueSArIGNhcmVhLmhlaWdodCAtIDEsCi0JCQkJCWNhcmVhLngsIGNhcmVhLnkgKyAyLCBjYXJlYS54ICsgMiwgY2FyZWEueSwKLQkJCQkJY2FyZWEueCArIGNhcmVhLndpZHRoIC0gMywgY2FyZWEueSwKLQkJCQkJY2FyZWEueCArIGNhcmVhLndpZHRoIC0gMSwgY2FyZWEueSArIDIsCi0JCQkJCWNhcmVhLnggKyBjYXJlYS53aWR0aCAtIDEsIGNhcmVhLnkgKyBjYXJlYS5oZWlnaHQgLSAxIH0pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNBbmltYXRpb25TdGFydCgpIHsKLQkJCXJldHVybiBhbmltYXRpb25TdGFydDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFuaW1hdGlvblN0YXJ0KGJvb2xlYW4gYW5pbWF0aW9uU3RhcnQpIHsKLQkJCXRoaXMuYW5pbWF0aW9uU3RhcnQgPSBhbmltYXRpb25TdGFydDsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVNaW5pbWl6ZWRJbWFnZXMoKSB7Ci0JCQlkaXNwb3NlTWluaW1pemVJbWFnZXMoKTsKLQkJCW5vcm1hbCA9IG5ldyBJbWFnZShnZXREaXNwbGF5KCksIEJVVFRPTl9TSVpFLCBCVVRUT05fU0laRSk7Ci0JCQlHQyBnYyA9IG5ldyBHQyhub3JtYWwpOwotCQkJcGFpbnROb3JtYWxJbWFnZShnZXREaXNwbGF5KCksIGdjKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCWhvdCA9IG5ldyBJbWFnZShnZXREaXNwbGF5KCksIEJVVFRPTl9TSVpFLCBCVVRUT05fU0laRSk7Ci0JCQlnYyA9IG5ldyBHQyhob3QpOwotCQkJcGFpbnRIb3RJbWFnZShnZXREaXNwbGF5KCksIGdjKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCW1saW5rLnNldEltYWdlKG5vcm1hbCk7Ci0JCQltbGluay5zZXRIb3ZlckltYWdlKGhvdCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZGlzcG9zZU1pbmltaXplSW1hZ2VzKCkgewotCQkJaWYgKG5vcm1hbCAhPSBudWxsKSB7Ci0JCQkJbm9ybWFsLmRpc3Bvc2UoKTsKLQkJCQlub3JtYWwgPSBudWxsOwotCQkJfQotCQkJaWYgKGhvdCAhPSBudWxsKSB7Ci0JCQkJaG90LmRpc3Bvc2UoKTsKLQkJCQlob3QgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHBhaW50Tm9ybWFsSW1hZ2UoRGlzcGxheSBkaXNwbGF5LCBHQyBnYykgewotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKEJVVFRPTl9CT1JERVIpKTsKLQkJCS8vIGdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihCVVRUT05fRklMTCkpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotCQkJcGFpbnRJbm5lckNvbnRlbnQoZ2MpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHBhaW50SG90SW1hZ2UoRGlzcGxheSBkaXNwbGF5LCBHQyBnYykgewotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKEJVVFRPTl9CT1JERVIpKTsKLQkJCS8vIGdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihCVVRUT05fRklMTCkpOwotCQkJLy8gZ2Muc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotCQkJLy8gZ2MuZmlsbFJvdW5kUmVjdGFuZ2xlKDAsIDAsIEJVVFRPTl9TSVpFLCBCVVRUT05fU0laRSwgNiwgNik7Ci0JCQlnYy5kcmF3Um91bmRSZWN0YW5nbGUoMCwgMCwgQlVUVE9OX1NJWkUgLSAxLCBCVVRUT05fU0laRSAtIDEsIDYsIDYpOwotCQkJcGFpbnRJbm5lckNvbnRlbnQoZ2MpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHBhaW50SW5uZXJDb250ZW50KEdDIGdjKSB7Ci0JCQlpbnQgeCA9IEJVVFRPTl9TSVpFIC8gMiAtIDU7Ci0JCQlpbnQgeSA9IDI7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlKHgsIHksIDksIDMpOwotCQkJZ2MuZHJhd1JlY3RhbmdsZSh4LCB5LCA5LCAzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgRm9ybUhlYWRpbmdMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgaW1wbGVtZW50cyBJTGF5b3V0RXh0ZW5zaW9uIHsKLQkJcHVibGljIGludCBjb21wdXRlTWluaW11bVdpZHRoKENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkJcmV0dXJuIGNvbXB1dGVTaXplKGNvbXBvc2l0ZSwgNSwgU1dULkRFRkFVTFQsIGZsdXNoQ2FjaGUpLng7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXB1dGVNYXhpbXVtV2lkdGgoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQlyZXR1cm4gY29tcHV0ZVNpemUoY29tcG9zaXRlLCBTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZsdXNoQ2FjaGUpLng7Ci0JCX0KLQotCQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsCi0JCQkJYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQlpZiAoZmx1c2hDYWNoZSkgewotCQkJCXRpdGxlQ2FjaGUuZmx1c2goKTsKLQkJCQl0b29sYmFyQ2FjaGUuZmx1c2goKTsKLQkJCQljbGllbnRDYWNoZS5mbHVzaCgpOwotCQkJfQotCi0JCQlpbnQgd2lkdGggPSAwOwotCQkJaW50IGhlaWdodCA9IDA7Ci0JCQlQb2ludCB0YnNpemUgPSBudWxsOwotCi0JCQlpZiAoaGVhZENsaWVudCAhPSBudWxsKSB7Ci0JCQkJY2xpZW50Q2FjaGUuc2V0Q29udHJvbChoZWFkQ2xpZW50KTsKLQkJCQlQb2ludCBjbHNpemUgPSBjbGllbnRDYWNoZQotCQkJCQkJLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCQkJd2lkdGggKz0gVElUTEVfR0FQOwotCQkJCXdpZHRoICs9IGNsc2l6ZS54OwotCQkJCWhlaWdodCArPSBjbHNpemUueTsKLQkJCX0KLQotCQkJaWYgKHRvb2xCYXJNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlUb29sQmFyIHRvb2xCYXIgPSB0b29sQmFyTWFuYWdlci5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCQl0b29sYmFyQ2FjaGUuc2V0Q29udHJvbCh0b29sQmFyKTsKLQkJCQkJdGJzaXplID0gdG9vbGJhckNhY2hlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJCWlmIChoZWFkQ2xpZW50ID09IG51bGwpIHsKLQkJCQkJCWlmICh0ZXh0ICE9IG51bGwpCi0JCQkJCQkJd2lkdGggKz0gVElUTEVfR0FQOwotCQkJCQkJd2lkdGggKz0gdGJzaXplLng7Ci0JCQkJCQloZWlnaHQgPSB0YnNpemUueTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWludCBpd2lkdGggPSAwOwotCQkJaW50IGloZWlnaHQgPSAwOwotCQkJaWYgKG1lc3NhZ2VBcmVhICE9IG51bGwgJiYgbWVzc2FnZUFyZWEuaXNNaW5pbWl6ZWQoKSkgewotCQkJCVBvaW50IHJzaXplID0gbWVzc2FnZUFyZWEuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQlpd2lkdGggPSBNYXRoLm1heChpd2lkdGgsIHJzaXplLngpOwotCQkJCWloZWlnaHQgPSBNYXRoLm1heChpaGVpZ2h0LCByc2l6ZS55KTsKLQkJCX0KLQkJCWlmIChidXN5TGFiZWwgIT0gbnVsbCkgewotCQkJCVBvaW50IGJzaXplID0gYnVzeUxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaXdpZHRoID0gTWF0aC5tYXgoaXdpZHRoLCBic2l6ZS54KTsKLQkJCQlpaGVpZ2h0ID0gTWF0aC5tYXgoaWhlaWdodCwgYnNpemUueSk7Ci0JCQl9Ci0JCQlpZiAoaXdpZHRoID4gMCkgewotCQkJCWlmICh0ZXh0ICE9IG51bGwpCi0JCQkJCXdpZHRoICs9IFRJVExFX0dBUDsKLQkJCQl3aWR0aCArPSBpd2lkdGg7Ci0JCQkJaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBpaGVpZ2h0KTsKLQkJCX0KLQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQlHQyBnYyA9IG5ldyBHQyhjb21wb3NpdGUpOwotCQkJCWdjLnNldEZvbnQoZ2V0Rm9udCgpKTsKLQotCQkJCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQlpbnQgdHdIaW50ID0gd0hpbnQgLSB3aWR0aDsKLQkJCQkJUG9pbnQgd3NpemUgPSBGb3JtVXRpbC5jb21wdXRlV3JhcFNpemUoZ2MsIHRleHQsIHR3SGludCk7Ci0JCQkJCXdpZHRoICs9IHdzaXplLng7Ci0JCQkJCWhlaWdodCA9IE1hdGgubWF4KHdzaXplLnksIGhlaWdodCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCh0ZXh0KTsKLQkJCQkJd2lkdGggKz0gZXh0ZW50Lng7Ci0JCQkJCWhlaWdodCA9IE1hdGgubWF4KGV4dGVudC55LCBoZWlnaHQpOwotCQkJCX0KLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpbnQgc2Vjb25kUm93SGVpZ2h0ID0gMDsKLQkJCWlmIChoZWFkQ2xpZW50ICE9IG51bGwpIHsKLQkJCQlpZiAodGJzaXplICE9IG51bGwpCi0JCQkJCXNlY29uZFJvd0hlaWdodCA9IHRic2l6ZS55OwotCQkJfQotCi0JCQlpZiAobWVzc2FnZUFyZWEgIT0gbnVsbCkgewotCQkJCVBvaW50IG1hc2l6ZSA9IG1lc3NhZ2VBcmVhCi0JCQkJCQkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQlpZiAoaGVhZENsaWVudCA9PSBudWxsKQotCQkJCQloZWlnaHQgPSBNYXRoLm1heChtYXNpemUueSwgaGVpZ2h0KTsKLQkJCQllbHNlIHsKLQkJCQkJc2Vjb25kUm93SGVpZ2h0ID0gTWF0aC5tYXgoc2Vjb25kUm93SGVpZ2h0LCBtYXNpemUueSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNlY29uZFJvd0hlaWdodCA+IDApCi0JCQkJaGVpZ2h0ICs9IHNlY29uZFJvd0hlaWdodDsKLQkJCWlmIChpc1NlcGFyYXRvclZpc2libGUoKSkKLQkJCQloZWlnaHQgKz0gU0VQQVJBVE9SX0hFSUdIVDsKLQkJCWlmIChoZWlnaHQgIT0gMCkKLQkJCQloZWlnaHQgKz0gVElUTEVfVk1BUkdJTiAqIDI7Ci0JCQlpZiAod2lkdGggIT0gMCkKLQkJCQl3aWR0aCArPSBUSVRMRV9ITUFSR0lOICogMjsKLQkJCWludCBpaEhpbnQgPSBoSGludDsKLQkJCWlmIChpaEhpbnQgPiAwICYmIGloSGludCAhPSBTV1QuREVGQVVMVCkKLQkJCQlpaEhpbnQgLT0gaGVpZ2h0OwotCQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJCWlmIChmbHVzaENhY2hlKSB7Ci0JCQkJdG9vbGJhckNhY2hlLmZsdXNoKCk7Ci0JCQl9Ci0JCQlSZWN0YW5nbGUgY2FyZWEgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotCQkJaW50IGhlaWdodCA9IDA7Ci0JCQlQb2ludCB0YnNpemUgPSBudWxsOwotCQkJUG9pbnQgY2xzaXplID0gbnVsbDsKLQkJCWludCB0d2lkdGggPSBjYXJlYS53aWR0aCAtIFRJVExFX0hNQVJHSU4gKiAyOwotCQkJaWYgKChpbWFnZSAhPSBudWxsIHx8IHRleHQgIT0gbnVsbCB8fCAobWVzc2FnZUFyZWEgIT0gbnVsbCAmJiBtZXNzYWdlQXJlYQotCQkJCQkuaXNNaW5pbWl6ZWQoKSkpCi0JCQkJCSYmIHRvb2xCYXJNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlUb29sQmFyIHRvb2xCYXIgPSB0b29sQmFyTWFuYWdlci5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCQl0b29sYmFyQ2FjaGUuc2V0Q29udHJvbCh0b29sQmFyKTsKLQkJCQkJdGJzaXplID0gdG9vbGJhckNhY2hlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJCWlmIChoZWFkQ2xpZW50ID09IG51bGwpIHsKLQkJCQkJCXRvb2xiYXJDYWNoZS5zZXRCb3VuZHMoY2FyZWEud2lkdGggLSAxIC0gVElUTEVfSE1BUkdJTgotCQkJCQkJCQktIHRic2l6ZS54LCBUSVRMRV9WTUFSR0lOLCB0YnNpemUueCwgdGJzaXplLnkpOwotCQkJCQkJaGVpZ2h0ID0gdGJzaXplLnk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCVJlY3RhbmdsZSBjbGllbnRSZWN0ID0gbnVsbDsKLQotCQkJaWYgKGhlYWRDbGllbnQgIT0gbnVsbCkgewotCQkJCWNsaWVudENhY2hlLnNldENvbnRyb2woaGVhZENsaWVudCk7Ci0JCQkJY2xzaXplID0gY2xpZW50Q2FjaGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQljbGllbnRSZWN0ID0gbmV3IFJlY3RhbmdsZShjYXJlYS53aWR0aCAtIDEgLSBUSVRMRV9ITUFSR0lOCi0JCQkJCQktIGNsc2l6ZS54LCBUSVRMRV9WTUFSR0lOLCBjbHNpemUueCwgY2xzaXplLnkpOwotCQkJCWhlaWdodCA9IGNsc2l6ZS55OwotCQkJCXR3aWR0aCAtPSBjbHNpemUueCArIFRJVExFX0dBUDsKLQkJCX0KLQkJCWlmIChoZWFkQ2xpZW50ID09IG51bGwgJiYgdGJzaXplICE9IG51bGwpIHsKLQkJCQl0d2lkdGggLT0gdGJzaXplLnggKyBUSVRMRV9HQVA7Ci0JCQl9Ci0JCQlpbnQgdHggPSBUSVRMRV9ITUFSR0lOOwotCQkJaW50IGl3aWR0aCA9IDA7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCVJlY3RhbmdsZSBpYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQkJaXdpZHRoID0gaWJvdW5kcy53aWR0aDsKLQkJCX0KLQkJCVBvaW50IG1zaXplID0gbnVsbDsKLQkJCVBvaW50IGJzaXplID0gbnVsbDsKLQkJCWludCBteCA9IDA7Ci0JCQlpZiAobWVzc2FnZUFyZWEgIT0gbnVsbCAmJiBtZXNzYWdlQXJlYS5pc01pbmltaXplZCgpKSB7Ci0JCQkJbXNpemUgPSBtZXNzYWdlQXJlYS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWl3aWR0aCA9IE1hdGgubWF4KG1zaXplLngsIGl3aWR0aCk7Ci0JCQkJbXggPSB0eDsKLQkJCX0KLQkJCWlmIChidXN5TGFiZWwgIT0gbnVsbCkgewotCQkJCWJzaXplID0gYnVzeUxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaXdpZHRoID0gTWF0aC5tYXgoYnNpemUueCwgaXdpZHRoKTsKLQkJCQlteCA9IHR4OwotCQkJfQotCQkJaWYgKGl3aWR0aCA+IDApIHsKLQkJCQl0eCArPSBpd2lkdGggKyBUSVRMRV9HQVA7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCQkJdHdpZHRoIC09IFRJVExFX0dBUDsKLQkJCQl0d2lkdGggLT0gaXdpZHRoOwotCQkJfQotCQkJUmVjdGFuZ2xlIHRpdGxlUmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCk7Ci0JCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJUG9pbnQgdHNpemUgPSB0aXRsZUNhY2hlLmNvbXB1dGVTaXplKHR3aWR0aCwgU1dULkRFRkFVTFQpOwotCQkJCWhlaWdodCA9IHRzaXplLnk7Ci0JCQkJaWYgKGhlYWRDbGllbnQgPT0gbnVsbCkgewotCQkJCQlpZiAodGJzaXplICE9IG51bGwpCi0JCQkJCQloZWlnaHQgPSBNYXRoLm1heCh0YnNpemUueSwgaGVpZ2h0KTsKLQkJCQl9IGVsc2UgewotCQkJCQloZWlnaHQgPSBNYXRoLm1heChjbHNpemUueSwgaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJaW50IG1pblRleHRXaWR0aCA9IHRzaXplLng7Ci0JCQkJUG9pbnQgcmVhbHRzaXplID0gdGl0bGVDYWNoZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJCVNXVC5ERUZBVUxUKTsKLQkJCQltaW5UZXh0V2lkdGggPSBNYXRoLm1pbihyZWFsdHNpemUueCwgbWluVGV4dFdpZHRoKTsKLQkJCQl0aXRsZUNhY2hlLnNldEJvdW5kcyh0eCwgVElUTEVfVk1BUkdJTiwgbWluVGV4dFdpZHRoLCBoZWlnaHQpOwotCQkJCXRpdGxlUmVjdCA9IHRpdGxlQ2FjaGUuZ2V0Q29udHJvbCgpLmdldEJvdW5kcygpOwotCQkJCWlmIChtaW5UZXh0V2lkdGggPCB0c2l6ZS54ICYmIGhlYWRDbGllbnQgIT0gbnVsbCkgewotCQkJCQkvLyBmaXggdXAgdGhlIGhlYWQgY2xpZW50IHRvIHVzZSB0aGUgZXh0cmEgc3BhY2UKLQkJCQkJaW50IGh4ID0gdHggKyBtaW5UZXh0V2lkdGggKyBUSVRMRV9HQVA7Ci0JCQkJCWludCBod2lkdGggPSBjYXJlYS53aWR0aCAtIFRJVExFX0hNQVJHSU4gLSBoeDsKLQkJCQkJY2xpZW50UmVjdC54ID0gaHg7Ci0JCQkJCWNsaWVudFJlY3Qud2lkdGggPSBod2lkdGg7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGhlYWRDbGllbnQgIT0gbnVsbCAmJiBjbGllbnRSZWN0ICE9IG51bGwpCi0JCQkJY2xpZW50Q2FjaGUuc2V0Qm91bmRzKGNsaWVudFJlY3QpOwotCi0JCQlpZiAobXNpemUgIT0gbnVsbCkgewotCQkJCW1lc3NhZ2VBcmVhLnNldEJvdW5kcyhteCwgdGl0bGVSZWN0LnkgKyB0aXRsZVJlY3QuaGVpZ2h0IC8gMgotCQkJCQkJLSBtc2l6ZS55IC8gMiwgbXNpemUueCwgbXNpemUueSk7Ci0JCQl9Ci0JCQlpZiAoYnNpemUgIT0gbnVsbCkgewotCQkJCWJ1c3lMYWJlbC5zZXRCb3VuZHMobXgsIHRpdGxlUmVjdC55ICsgdGl0bGVSZWN0LmhlaWdodCAvIDIKLQkJCQkJCS0gYnNpemUueSAvIDIsIGJzaXplLngsIGJzaXplLnkpOwotCQkJfQotCQkJaWYgKGhlYWRDbGllbnQgIT0gbnVsbCkgewotCQkJCWlmICh0YnNpemUgIT0gbnVsbCkgewotCQkJCQloZWlnaHQgKz0gVElUTEVfR0FQOwotCQkJCQl0b29sYmFyQ2FjaGUuc2V0Qm91bmRzKGNhcmVhLndpZHRoIC0gMSAtIFRJVExFX0hNQVJHSU4KLQkJCQkJCQktIHRic2l6ZS54LCBUSVRMRV9WTUFSR0lOICsgaGVpZ2h0LCB0YnNpemUueCwKLQkJCQkJCQl0YnNpemUueSk7Ci0JCQkJCWhlaWdodCArPSB0YnNpemUueTsKLQkJCQkJLy9oZWlnaHQgKz0gVElUTEVfR0FQOwotCQkJCX0KLQkJCX0KLQkJCWlmIChoZWlnaHQgPiAwKQotCQkJCWhlaWdodCArPSBUSVRMRV9WTUFSR0lOICogMjsKLQkJCWlmIChpc1NlcGFyYXRvclZpc2libGUoKSkKLQkJCQloZWlnaHQgKz0gU0VQQVJBVE9SX0hFSUdIVDsKLQkJCWlmIChtZXNzYWdlQXJlYSAhPSBudWxsCi0JCQkJCSYmICFtZXNzYWdlQXJlYS5pc01pbmltaXplZCgpCi0JCQkJCSYmIChtZXNzYWdlQXJlYS5pc0FuaW1hdGlvblN0YXJ0KCkgfHwgIW1lc3NhZ2VBcmVhCi0JCQkJCQkJLmlzSW5UcmFuc2l0aW9uKCkpICYmIG1lc3NhZ2VBcmVhLmlzVmlzaWJsZSgpKSB7Ci0JCQkJUG9pbnQgbWFzaXplID0gbWVzc2FnZUFyZWEKLQkJCQkJCS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWludCBtYXkgPSBtZXNzYWdlQXJlYS5pc0FuaW1hdGlvblN0YXJ0KCkKLQkJCQkJCSYmIG1lc3NhZ2VBcmVhLmdldFN0YXRlKCkgPT0gTWVzc2FnZUFyZWEuT1BFTk5JTkcgPyBoZWlnaHQtMQotCQkJCQkJOiBoZWlnaHQtMSAtIG1hc2l6ZS55OwotCQkJCWlmIChpc1NlcGFyYXRvclZpc2libGUoKSkKLQkJCQkJbWF5IC09IFNFUEFSQVRPUl9IRUlHSFQ7Ci0JCQkJaWYgKGhlYWRDbGllbnQgIT0gbnVsbCkKLQkJCQkJbWF5IC09IDI7Ci0JCQkJaW50IG1hd2lkdGggPSBjYXJlYS53aWR0aCAtIFRJVExFX0hNQVJHSU4gLSBUSVRMRV9ITUFSR0lOOwotCQkJCWlmICh0YnNpemUgIT0gbnVsbCkKLQkJCQkJbWF3aWR0aCAtPSB0YnNpemUueCArIFRJVExFX0dBUDsKLQkJCQltZXNzYWdlQXJlYS5zZXRCb3VuZHMoVElUTEVfSE1BUkdJTiwgbWF5LCBtYXdpZHRoLCBtYXNpemUueSk7Ci0JCQkJbWVzc2FnZUFyZWEuc2V0QW5pbWF0aW9uU3RhcnQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZm9ybSBjb250ZW50IGNvbnRyb2wgYXMgYSBjaGlsZCBvZiB0aGUgcHJvdmlkZWQgcGFyZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgd2lkZ2V0Ci0JICovCi0JcHVibGljIEZvcm1IZWFkaW5nKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJc2V0QmFja2dyb3VuZE1vZGUoU1dULklOSEVSSVRfREVGQVVMVCk7Ci0JCWFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCW9uUGFpbnQoZS5nYyk7Ci0JCQl9Ci0JCX0pOwotCQlhZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChncmFkaWVudEltYWdlICE9IG51bGwpIHsKLQkJCQkJZ3JhZGllbnRJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCWdyYWRpZW50SW1hZ2UgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWFkZExpc3RlbmVyKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAoZ3JhZGllbnRJbmZvICE9IG51bGwpCi0JCQkJCXVwZGF0ZUdyYWRpZW50SW1hZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCXN1cGVyLnNldExheW91dChuZXcgRm9ybUhlYWRpbmdMYXlvdXQoKSk7Ci0JCXRpdGxlTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOwotCQl0aXRsZUNhY2hlID0gbmV3IFNpemVDYWNoZSh0aXRsZUxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBGdWxseSBkZWxlZ2F0ZXMgdGhlIHNpemUgY29tcHV0YXRpb24gdG8gdGhlIGludGVybmFsIGxheW91dCBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBmaW5hbCBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JCXJldHVybiAoKEZvcm1IZWFkaW5nTGF5b3V0KSBnZXRMYXlvdXQoKSkuY29tcHV0ZVNpemUodGhpcywgd0hpbnQsCi0JCQkJaEhpbnQsIGNoYW5nZWQpOwotCX0KLQotCS8qKgotCSAqIFByZXZlbnRzIGZyb20gY2hhbmdpbmcgdGhlIGN1c3RvbSBjb250cm9sIGxheW91dC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRMYXlvdXQoTGF5b3V0IGxheW91dCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIHRleHQgdGhhdCB3aWxsIGJlIHJlbmRlcmVkIGF0IHRoZSB0b3Agb2YgdGhlIGZvcm0uCi0JICogCi0JICogQHJldHVybiB0aGUgdGl0bGUgdGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGl0bGUgaW1hZ2UgdGhhdCB3aWxsIGJlIHJlbmRlcmVkIHRvIHRoZSBsZWZ0IG9mIHRoZSB0aXRsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aXRsZSBpbWFnZQotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBoZWFkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBiZykgewotCQlzdXBlci5zZXRCYWNrZ3JvdW5kKGJnKTsKLQkJdGl0bGVMYWJlbC5zZXRCYWNrZ3JvdW5kKGJnKTsKLQkJaWYgKHRvb2xCYXJNYW5hZ2VyICE9IG51bGwpCi0JCQl0b29sQmFyTWFuYWdlci5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZChiZyk7Ci0JCWJhc2VCZyA9IGJnOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIGhlYWRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIGZnKSB7Ci0JCXN1cGVyLnNldEZvcmVncm91bmQoZmcpOwotCQl0aXRsZUxhYmVsLnNldEZvcmVncm91bmQoZmcpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRleHQgdG8gYmUgcmVuZGVyZWQgYXQgdGhlIHRvcCBvZiB0aGUgZm9ybSBhYm92ZSB0aGUgYm9keSBhcyBhCi0JICogdGl0bGUuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLnRleHQgPSB0ZXh0OwotCQlpZiAodG9vbEJhck1hbmFnZXIgIT0gbnVsbCkgewotCQkJdG9vbEJhck1hbmFnZXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoCi0JCQkJCWltYWdlICE9IG51bGwgfHwgdGV4dCAhPSBudWxsKTsKLQkJfQotCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQl0aXRsZUNhY2hlLnNldENvbnRyb2wodGl0bGVMYWJlbCk7Ci0JCQl0aXRsZUxhYmVsLnNldFRleHQodGV4dCk7Ci0JCX0KLQkJdGl0bGVMYWJlbC5zZXRWaXNpYmxlKHRleHQgIT0gbnVsbCk7Ci0JCWxheW91dCgpOwotCQlyZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgewotCQlzdXBlci5zZXRGb250KGZvbnQpOwotCQl0aXRsZUxhYmVsLnNldEZvbnQoZm9udCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgdG8gYmUgcmVuZGVyZWQgdG8gdGhlIGxlZnQgb2YgdGhlIHRpdGxlLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIGltYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHNob3cgbm8gaW1hZ2UuCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQkJaWYgKHRvb2xCYXJNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXRvb2xCYXJNYW5hZ2VyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKAotCQkJCQlpbWFnZSAhPSBudWxsIHx8IHRleHQgIT0gbnVsbCk7Ci0JCX0KLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUJ1c3lMYWJlbCgpOwotCQl9IGVsc2UgaWYgKGltYWdlID09IG51bGwgJiYgYnVzeUxhYmVsICE9IG51bGwpIHsKLQkJCWlmICghYnVzeUxhYmVsLmlzQnVzeSgpKSB7Ci0JCQkJYnVzeUxhYmVsLmRpc3Bvc2UoKTsKLQkJCQlidXN5TGFiZWwgPSBudWxsOwotCQkJfQotCQl9Ci0JCWJ1c3lMYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0JCWxheW91dCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVCdXN5TGFiZWwoKSB7Ci0JCWlmIChidXN5TGFiZWwgPT0gbnVsbCkgewotCQkJYnVzeUxhYmVsID0gbmV3IEJ1c3lJbmRpY2F0b3IodGhpcywgU1dULk5VTEwpOwotCQkJaWYgKGdyYWRpZW50SW5mbyA9PSBudWxsICYmIGdldEJhY2tncm91bmRJbWFnZSgpID09IG51bGwpCi0JCQkJYnVzeUxhYmVsLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRCYWNrZ3JvdW5kKENvbG9yW10gZ3JhZGllbnRDb2xvcnMsIGludFtdIHBlcmNlbnRzLAotCQkJYm9vbGVhbiB2ZXJ0aWNhbCkgewotCQlncmFkaWVudEluZm8gPSBuZXcgR3JhZGllbnRJbmZvKCk7Ci0JCWdyYWRpZW50SW5mby5ncmFkaWVudENvbG9ycyA9IGdyYWRpZW50Q29sb3JzOwotCQlncmFkaWVudEluZm8ucGVyY2VudHMgPSBwZXJjZW50czsKLQkJZ3JhZGllbnRJbmZvLnZlcnRpY2FsID0gdmVydGljYWw7Ci0JCXRpdGxlTGFiZWwuc2V0QmFja2dyb3VuZChudWxsKTsKLQkJc3VwZXIuc2V0QmFja2dyb3VuZChudWxsKTsKLQkJaWYgKHRvb2xCYXJNYW5hZ2VyICE9IG51bGwpCi0JCQl0b29sQmFyTWFuYWdlci5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZChudWxsKTsKLQkJaWYgKGJ1c3lMYWJlbCAhPSBudWxsKQotCQkJYnVzeUxhYmVsLnNldEJhY2tncm91bmQobnVsbCk7Ci0JCXVwZGF0ZUdyYWRpZW50SW1hZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kSW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJc3VwZXIuc2V0QmFja2dyb3VuZEltYWdlKGltYWdlKTsKLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCXRpdGxlTGFiZWwuc2V0QmFja2dyb3VuZChudWxsKTsKLQkJCWlmICh0b29sQmFyTWFuYWdlciAhPSBudWxsKQotCQkJCXRvb2xCYXJNYW5hZ2VyLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCQkJaWYgKGJ1c3lMYWJlbCAhPSBudWxsKQotCQkJCWJ1c3lMYWJlbC5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9vbCBiYXIgbWFuYWdlciB0aGF0IGlzIHVzZWQgdG8gbWFuYWdlIHRvb2wgaXRlbXMgaW4gdGhlCi0JICogZm9ybSdzIHRpdGxlIGFyZWEuCi0JICogCi0JICogQHJldHVybiBmb3JtIHRvb2wgYmFyIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSVRvb2xCYXJNYW5hZ2VyIGdldFRvb2xCYXJNYW5hZ2VyKCkgewotCQlpZiAodG9vbEJhck1hbmFnZXIgPT0gbnVsbCkgewotCQkJdG9vbEJhck1hbmFnZXIgPSBuZXcgVG9vbEJhck1hbmFnZXIoU1dULkZMQVQpOwotCQkJVG9vbEJhciB0b29sYmFyID0gdG9vbEJhck1hbmFnZXIuY3JlYXRlQ29udHJvbCh0aGlzKTsKLQkJCXRvb2xiYXIuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotCQkJdG9vbGJhci5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0JCQl0b29sYmFyLnNldEN1cnNvcihGb3Jtc1Jlc291cmNlcy5nZXRIYW5kQ3Vyc29yKCkpOwotCQkJYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQkJaWYgKHRvb2xCYXJNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCXRvb2xCYXJNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCQkJCXRvb2xCYXJNYW5hZ2VyID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiB0b29sQmFyTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBsb2NhbCB0b29sIGJhciBtYW5hZ2VyIGlmIHVzZWQuIERvZXMgbm90aGluZyBpZiBsb2NhbCB0b29sCi0JICogYmFyIG1hbmFnZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xCYXIoKSB7Ci0JCWlmICh0b29sQmFyTWFuYWdlciAhPSBudWxsKQotCQkJdG9vbEJhck1hbmFnZXIudXBkYXRlKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb25QYWludChHQyBnYykgewotCQlpZiAoIWlzU2VwYXJhdG9yVmlzaWJsZSgpKQotCQkJcmV0dXJuOwotCQlSZWN0YW5nbGUgY2FyZWEgPSBnZXRDbGllbnRBcmVhKCk7Ci0JCS8vIGdyYWRpZW50Ci0JCWlmIChncmFkaWVudEluZm8gIT0gbnVsbCAmJiBncmFkaWVudEluZm8uZ3JhZGllbnRDb2xvcnMubGVuZ3RoID49IDIpIHsKLQkJCWdjLnNldEJhY2tncm91bmQoZ3JhZGllbnRJbmZvLmdyYWRpZW50Q29sb3JzWzBdKTsKLQkJCWdjLnNldEZvcmVncm91bmQoZ3JhZGllbnRJbmZvLmdyYWRpZW50Q29sb3JzW2dyYWRpZW50SW5mby5ncmFkaWVudENvbG9ycy5sZW5ndGggLSAxXSk7Ci0JCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMCwgY2FyZWEuaGVpZ2h0IC0gU0VQQVJBVE9SX0hFSUdIVCArIDMsCi0JCQkJCWNhcmVhLndpZHRoLCBTRVBBUkFUT1JfSEVJR0hUIC0gMiwgZ3JhZGllbnRJbmZvLnZlcnRpY2FsKTsKLQkJfQotCQkvLyBiZyBzZXBhcmF0b3IKLQkJZ2Muc2V0Rm9yZWdyb3VuZChiYXNlQmcpOwotCQlnYy5kcmF3UG9seWxpbmUobmV3IGludFtdIHsgMCwgY2FyZWEuaGVpZ2h0IC0gU0VQQVJBVE9SX0hFSUdIVCArIDIsIDIsCi0JCQkJY2FyZWEuaGVpZ2h0IC0gU0VQQVJBVE9SX0hFSUdIVCwgY2FyZWEud2lkdGggLSAzLAotCQkJCWNhcmVhLmhlaWdodCAtIFNFUEFSQVRPUl9IRUlHSFQsIGNhcmVhLndpZHRoIC0gMSwKLQkJCQljYXJlYS5oZWlnaHQgLSBTRVBBUkFUT1JfSEVJR0hUICsgMiB9KTsKLQkJLy8gY29sb3Igc2VwYXJhdG9yCi0JCWlmIChzZXBhcmF0b3JDb2xvciAhPSBudWxsKQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChzZXBhcmF0b3JDb2xvcik7Ci0JCWVsc2UKLQkJCWdjLnNldEZvcmVncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsKLQkJZ2MuZHJhd1BvbHlsaW5lKG5ldyBpbnRbXSB7IAotCQkJCTAsIGNhcmVhLmhlaWdodCwKLQkJCQkwLCBjYXJlYS5oZWlnaHQgLSBTRVBBUkFUT1JfSEVJR0hUICsgMywgCi0JCQkJMiwgY2FyZWEuaGVpZ2h0IC0gU0VQQVJBVE9SX0hFSUdIVCArIDEsIAotCQkJCWNhcmVhLndpZHRoIC0gMywgY2FyZWEuaGVpZ2h0IC0gU0VQQVJBVE9SX0hFSUdIVCArIDEsIAotCQkJCWNhcmVhLndpZHRoIC0gMSwgY2FyZWEuaGVpZ2h0IC0gU0VQQVJBVE9SX0hFSUdIVCArIDMsCi0JCQkJY2FyZWEud2lkdGggLSAxLCBjYXJlYS5oZWlnaHQgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyYWRpZW50SW1hZ2UoKSB7Ci0JCVJlY3RhbmdsZSByZWN0ID0gZ2V0Qm91bmRzKCk7Ci0JCWJvb2xlYW4gdmVydGljYWwgPSBncmFkaWVudEluZm8udmVydGljYWw7Ci0JCWlmIChncmFkaWVudEltYWdlICE9IG51bGwpCi0JCQlncmFkaWVudEltYWdlLmRpc3Bvc2UoKTsKLQkJaW50IHdpZHRoID0gdmVydGljYWwgPyAxIDogcmVjdC53aWR0aDsKLQkJaW50IGhlaWdodCA9IHZlcnRpY2FsID8gcmVjdC5oZWlnaHQgOiAxOwotCQlncmFkaWVudEltYWdlID0gbmV3IEltYWdlKGdldERpc3BsYXkoKSwgTWF0aC5tYXgod2lkdGgsIDEpLCBNYXRoLm1heCgKLQkJCQloZWlnaHQsIDEpKTsKLQkJR0MgZ2MgPSBuZXcgR0MoZ3JhZGllbnRJbWFnZSk7Ci0JCWRyYXdUZXh0R3JhZGllbnQoZ2MsIHdpZHRoLCBoZWlnaHQpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCXNldEJhY2tncm91bmRJbWFnZShncmFkaWVudEltYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJhd1RleHRHcmFkaWVudChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWZpbmFsIENvbG9yIG9sZEJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCWlmIChncmFkaWVudEluZm8uZ3JhZGllbnRDb2xvcnMubGVuZ3RoID09IDEpIHsKLQkJCWlmIChncmFkaWVudEluZm8uZ3JhZGllbnRDb2xvcnNbMF0gIT0gbnVsbCkKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGdyYWRpZW50SW5mby5ncmFkaWVudENvbG9yc1swXSk7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQl9IGVsc2UgewotCQkJZmluYWwgQ29sb3Igb2xkRm9yZWdyb3VuZCA9IGdjLmdldEZvcmVncm91bmQoKTsKLQkJCUNvbG9yIGxhc3RDb2xvciA9IGdyYWRpZW50SW5mby5ncmFkaWVudENvbG9yc1swXTsKLQkJCWlmIChsYXN0Q29sb3IgPT0gbnVsbCkKLQkJCQlsYXN0Q29sb3IgPSBvbGRCYWNrZ3JvdW5kOwotCQkJaW50IHBvcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdyYWRpZW50SW5mby5wZXJjZW50cy5sZW5ndGg7ICsraSkgewotCQkJCWdjLnNldEZvcmVncm91bmQobGFzdENvbG9yKTsKLQkJCQlsYXN0Q29sb3IgPSBncmFkaWVudEluZm8uZ3JhZGllbnRDb2xvcnNbaSArIDFdOwotCQkJCWlmIChsYXN0Q29sb3IgPT0gbnVsbCkKLQkJCQkJbGFzdENvbG9yID0gb2xkQmFja2dyb3VuZDsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGxhc3RDb2xvcik7Ci0JCQkJaWYgKGdyYWRpZW50SW5mby52ZXJ0aWNhbCkgewotCQkJCQlmaW5hbCBpbnQgZ3JhZGllbnRIZWlnaHQgPSAoZ3JhZGllbnRJbmZvLnBlcmNlbnRzW2ldCi0JCQkJCQkJKiBoZWlnaHQgLyAxMDApCi0JCQkJCQkJLSBwb3M7Ci0JCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgwLCBwb3MsIHdpZHRoLCBncmFkaWVudEhlaWdodCwKLQkJCQkJCQl0cnVlKTsKLQkJCQkJcG9zICs9IGdyYWRpZW50SGVpZ2h0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpbmFsIGludCBncmFkaWVudFdpZHRoID0gKGdyYWRpZW50SW5mby5wZXJjZW50c1tpXSAqIHdpZHRoIC8gMTAwKQotCQkJCQkJCS0gcG9zOwotCQkJCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUocG9zLCAwLCBncmFkaWVudFdpZHRoLCBoZWlnaHQsCi0JCQkJCQkJZmFsc2UpOwotCQkJCQlwb3MgKz0gZ3JhZGllbnRXaWR0aDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZ3JhZGllbnRJbmZvLnZlcnRpY2FsICYmIHBvcyA8IGhlaWdodCkgewotCQkJCWdjLnNldEJhY2tncm91bmQoYmFzZUJnKTsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlKDAsIHBvcywgd2lkdGgsIGhlaWdodCAtIHBvcyk7Ci0JCQl9Ci0JCQlpZiAoIWdyYWRpZW50SW5mby52ZXJ0aWNhbCAmJiBwb3MgPCB3aWR0aCkgewotCQkJCWdjLnNldEJhY2tncm91bmQoYmFzZUJnKTsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlKHBvcywgMCwgd2lkdGggLSBwb3MsIGhlaWdodCk7Ci0JCQl9Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKG9sZEZvcmVncm91bmQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVE9ETyBhZGQgamF2YWRvYwotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYmFja2dyb3VuZEltYWdlVGlsZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCYWNrZ3JvdW5kSW1hZ2VUaWxlZCgpIHsKLQkJcmV0dXJuIChzdHlsZSAmIFNfVElMRUQpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogVE9ETyBhZGQgamF2YWRvYwotCSAqIAotCSAqIEBwYXJhbSBiYWNrZ3JvdW5kSW1hZ2VUaWxlZAotCSAqICAgICAgICAgICAgVGhlIGJhY2tncm91bmRJbWFnZVRpbGVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kSW1hZ2VUaWxlZChib29sZWFuIGJhY2tncm91bmRJbWFnZVRpbGVkKSB7Ci0JCWlmIChiYWNrZ3JvdW5kSW1hZ2VUaWxlZCkKLQkJCXN0eWxlIHw9IFNfVElMRUQ7Ci0JCWVsc2UKLQkJCXN0eWxlICY9ICh+U19USUxFRCk7Ci0JCWlmIChpc1Zpc2libGUoKSkKLQkJCXJlZHJhdygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYmFja2dyb3VuZEltYWdlQWxpZ25tZW50LiBUT0RPIGFkZCBqYXZhZG9jCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZEltYWdlQWxpZ25tZW50KCkgewotCQlpZiAoKHN0eWxlICYgU1dULkxFRlQpID4gMCkKLQkJCXJldHVybiBTV1QuTEVGVDsKLQkJaWYgKChzdHlsZSAmIFNXVC5SSUdIVCkgPiAwKQotCQkJcmV0dXJuIFNXVC5SSUdIVDsKLQkJaWYgKChzdHlsZSAmIFNXVC5DRU5URVIpID4gMCkKLQkJCXJldHVybiBTV1QuQ0VOVEVSOwotCQlyZXR1cm4gU1dULk5VTEw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhY2tncm91bmRJbWFnZUFsaWdubWVudAotCSAqICAgICAgICAgICAgVGhlIGJhY2tncm91bmRJbWFnZUFsaWdubWVudCB0byBzZXQuIFRPRE8gYWRkIGphdmFkb2MKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZEltYWdlQWxpZ25tZW50KGludCBiYWNrZ3JvdW5kSW1hZ2VBbGlnbm1lbnQpIHsKLQkJc3R5bGUgJj0gKH5nZXRCYWNrZ3JvdW5kSW1hZ2VBbGlnbm1lbnQoKSk7Ci0JCXN0eWxlIHw9IGJhY2tncm91bmRJbWFnZUFsaWdubWVudDsKLQkJaWYgKGlzVmlzaWJsZSgpKQotCQkJcmVkcmF3KCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBiYWNrZ3JvdW5kSW1hZ2VDbGlwcGVkLgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JhY2tncm91bmRJbWFnZUNsaXBwZWQoKSB7Ci0JCXJldHVybiAoc3R5bGUgJiBTX0NMSVBQRUQpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhY2tncm91bmRJbWFnZUNsaXBwZWQKLQkgKiAgICAgICAgICAgIFRoZSBiYWNrZ3JvdW5kSW1hZ2VDbGlwcGVkIHRvIHNldC4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZEltYWdlQ2xpcHBlZChib29sZWFuIGJhY2tncm91bmRJbWFnZUNsaXBwZWQpIHsKLQkJaWYgKGJhY2tncm91bmRJbWFnZUNsaXBwZWQpCi0JCQlzdHlsZSB8PSBTX0NMSVBQRUQ7Ci0JCWVsc2UKLQkJCXN0eWxlICY9ICh+U19DTElQUEVEKTsKLQl9Ci0KLQkvKioKLQkgKiBUT0RPIGFkZCBqYXZhZG9jIGV4cGVyaW1lbnRhbCAtIGRvIG5vdCB1c2UgeWV0Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB2aXNpYmxlIHNlcGFyYXRvciwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcGFyYXRvclZpc2libGUoKSB7Ci0JCXJldHVybiAoc3R5bGUgJiBTX1NFUEFSQVRPUikgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBleHBlcmltZW50YWwgLSBkbyBub3QgdXNlIHlldCBUT0RPIGFkZCBqYXZhZG9jCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VwYXJhdG9yVmlzaWJsZShib29sZWFuIGFkZFNlcGFyYXRvcikgewotCQlpZiAoYWRkU2VwYXJhdG9yKQotCQkJc3R5bGUgfD0gU19TRVBBUkFUT1I7Ci0JCWVsc2UKLQkJCXN0eWxlICY9ICh+U19TRVBBUkFUT1IpOwotCX0KLQotCS8qKgotCSAqIGV4cGVyaW1lbnRhbCAtIGRvIG5vdCB1c2UgeWV0IFRPRE8gYWRkIGphdmFkb2MKLQkgKi8KLQotCXB1YmxpYyBDb2xvciBnZXRTZXBhcmF0b3JDb2xvcigpIHsKLQkJcmV0dXJuIHNlcGFyYXRvckNvbG9yOwotCX0KLQotCS8qKgotCSAqIGV4cGVyaW1lbnRhbCAtIGRvIG5vdCB1c2UgeWV0IFRPRE8gYWRkIGphdmFkb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3JDb2xvcihDb2xvciBzZXBhcmF0b3JDb2xvcikgewotCQl0aGlzLnNlcGFyYXRvckNvbG9yID0gc2VwYXJhdG9yQ29sb3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWVzc2FnZSBmb3IgdGhpcyBmb3JtLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gY2xlYXIgdGhlIG1lc3NhZ2UKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQl0aGlzLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXNzYWdlIGZvciB0aGlzIGZvcm0gd2l0aCBhbiBpbmRpY2F0aW9uIG9mIHdoYXQgdHlwZSBvZiBtZXNzYWdlCi0JICogaXQgaXMuCi0JICogPHA+Ci0JICogVGhlIHZhbGlkIG1lc3NhZ2UgdHlwZXMgYXJlIG9uZSBvZiA8Y29kZT5OT05FPC9jb2RlPiwKLQkgKiA8Y29kZT5JTkZPUk1BVElPTjwvY29kZT4sPGNvZGU+V0FSTklORzwvY29kZT4sIG9yCi0JICogPGNvZGU+RVJST1I8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNsZWFyIHRoZSBtZXNzYWdlCi0JICogQHBhcmFtIG5ld1R5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHR5cGUKLQkgKiBAc2luY2UgMy4yCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlLCBpbnQgbmV3VHlwZSkgewotCQlJbWFnZSBuZXdJbWFnZSA9IG51bGw7Ci0JCWlmIChuZXdNZXNzYWdlICE9IG51bGwpIHsKLQkJCXN3aXRjaCAobmV3VHlwZSkgewotCQkJY2FzZSBJTWVzc2FnZVByb3ZpZGVyLk5PTkU6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT046Ci0JCQkJbmV3SW1hZ2UgPSBKRmFjZVJlc291cmNlcy5nZXRJbWFnZShEaWFsb2cuRExHX0lNR19NRVNTQUdFX0lORk8pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkc6Ci0JCQkJbmV3SW1hZ2UgPSBKRmFjZVJlc291cmNlcwotCQkJCQkJLmdldEltYWdlKERpYWxvZy5ETEdfSU1HX01FU1NBR0VfV0FSTklORyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElNZXNzYWdlUHJvdmlkZXIuRVJST1I6Ci0JCQkJbmV3SW1hZ2UgPSBKRmFjZVJlc291cmNlcwotCQkJCQkJLmdldEltYWdlKERpYWxvZy5ETEdfSU1HX01FU1NBR0VfRVJST1IpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXNob3dNZXNzYWdlKG5ld01lc3NhZ2UsIG5ld0ltYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hvd01lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UsIEltYWdlIG5ld0ltYWdlKSB7Ci0JCWlmIChuZXdNZXNzYWdlID09IG51bGwpIHsKLQkJCWlmIChtZXNzYWdlQXJlYSAhPSBudWxsKQotCQkJCXNldE1lc3NhZ2VBcmVhVmlzaWJsZShmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobWVzc2FnZUFyZWEgPT0gbnVsbCkgewotCQkJCW1lc3NhZ2VBcmVhID0gbmV3IE1lc3NhZ2VBcmVhKHRoaXMsIFNXVC5OVUxMKTsKLQkJCQltZXNzYWdlQXJlYS5zZXRCYWNrZ3JvdW5kKGJhc2VCZyk7Ci0JCQkJbWVzc2FnZUFyZWEuc2V0Rm9yZWdyb3VuZChzZXBhcmF0b3JDb2xvciE9bnVsbD9zZXBhcmF0b3JDb2xvcjpnZXRGb3JlZ3JvdW5kKCkpOwotCQkJfQotCQkJbWVzc2FnZUFyZWEuc2V0VGV4dChuZXdNZXNzYWdlKTsKLQkJCW1lc3NhZ2VBcmVhLnNldEltYWdlKG5ld0ltYWdlKTsKLQkJCXNldE1lc3NhZ2VBcmVhVmlzaWJsZSh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNZXNzYWdlQXJlYVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWlmIChtZXNzYWdlQXJlYS5pc01pbmltaXplZCgpKSB7Ci0JCQlpZiAoIXZpc2libGUpCi0JCQkJbWVzc2FnZUFyZWEuc2V0U3RhdGUoTWVzc2FnZUFyZWEuQ0xPU0VEKTsKLQkJCW1lc3NhZ2VBcmVhLnNldE1pbmltaXplZChmYWxzZSk7Ci0JCX0KLQkJLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBkbyBhbnl0aGluZwotCQlzd2l0Y2ggKG1lc3NhZ2VBcmVhLmdldFN0YXRlKCkpIHsKLQkJY2FzZSBNZXNzYWdlQXJlYS5PUEVOTklORzoKLQkJY2FzZSBNZXNzYWdlQXJlYS5PUEVOOgotCQkJaWYgKHZpc2libGUpCi0JCQkJcmV0dXJuOwotCQkJYnJlYWs7Ci0JCWNhc2UgTWVzc2FnZUFyZWEuQ0xPU0lORzoKLQkJY2FzZSBNZXNzYWdlQXJlYS5DTE9TRUQ6Ci0JCQlpZiAoIXZpc2libGUpCi0JCQkJcmV0dXJuOwotCQkJYnJlYWs7Ci0JCX0KLQkJLy8gd2UgZG8KLQkJbWVzc2FnZUFyZWEubW92ZUFib3ZlKG51bGwpOwotCQltZXNzYWdlQXJlYS5zZXRBbmltYXRpb25TdGFydCh0cnVlKTsKLQkJbWVzc2FnZUFyZWEuc2V0U3RhdGUodmlzaWJsZSA/IE1lc3NhZ2VBcmVhLk9QRU5OSU5HCi0JCQkJOiBNZXNzYWdlQXJlYS5DTE9TSU5HKTsKLQkJbGF5b3V0KHRydWUpOwotCQlSZWN0YW5nbGUgc3RhcnRCb3VuZHMgPSBtZXNzYWdlQXJlYS5nZXRCb3VuZHMoKTsKLQkJZmluYWwgaW50IGVuZFkgPSB2aXNpYmxlID8gc3RhcnRCb3VuZHMueSAtIHN0YXJ0Qm91bmRzLmhlaWdodAotCQkJCTogc3RhcnRCb3VuZHMueSArIHN0YXJ0Qm91bmRzLmhlaWdodDsKLQotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bMV07Ci0JCQkJLyoKLQkJCQkgKiBnZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7IGlmCi0JCQkJICogKGhlYWRDbGllbnQhPW51bGwpIGhlYWRDbGllbnQuc2V0UmVkcmF3KGZhbHNlKTsgfSB9KTsKLQkJCQkgKi8KLQkJCQlmb3IgKDs7KSB7Ci0JCQkJCWdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJUG9pbnQgbG9jID0gbWVzc2FnZUFyZWEuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQlpZiAobWVzc2FnZUFyZWEuZ2V0U3RhdGUoKSA9PSBNZXNzYWdlQXJlYS5PUEVOTklORykgewotCQkJCQkJCQkvLyBvcGVuaW5nCi0JCQkJCQkJCWxvYy55LS07Ci0JCQkJCQkJCWlmIChsb2MueSA+IGVuZFkpCi0JCQkJCQkJCQltZXNzYWdlQXJlYS5zZXRMb2NhdGlvbihsb2MpOwotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXJlc3VsdFswXSA9IHRydWU7Ci0JCQkJCQkJCQltZXNzYWdlQXJlYS5zZXRTdGF0ZShNZXNzYWdlQXJlYS5PUEVOKTsKLQkJCQkJCQkJCWxheW91dCh0cnVlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIGNsb3NpbmcKLQkJCQkJCQkJbG9jLnkrKzsKLQkJCQkJCQkJaWYgKGxvYy55IDwgZW5kWSkKLQkJCQkJCQkJCW1lc3NhZ2VBcmVhLnNldExvY2F0aW9uKGxvYyk7Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJcmVzdWx0WzBdID0gdHJ1ZTsKLQkJCQkJCQkJCW1lc3NhZ2VBcmVhLnNldFN0YXRlKE1lc3NhZ2VBcmVhLkNMT1NFRCk7Ci0JCQkJCQkJCQlsYXlvdXQodHJ1ZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQlpZiAocmVzdWx0WzBdKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQKLQkJCQkJCSAqIHJ1bigpIHsgaWYgKGhlYWRDbGllbnQhPW51bGwpCi0JCQkJCQkgKiBoZWFkQ2xpZW50LnNldFJlZHJhdyh0cnVlKTsgfSB9KTsKLQkJCQkJCSAqLwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJVGhyZWFkLnlpZWxkKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoNSk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCVRocmVhZCB0ID0gbmV3IFRocmVhZChydW5uYWJsZSk7Ci0JCXQuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBpZiB0aGUgZm9ybSBpcyBpbiB0aGUgJ2J1c3knIHN0YXRlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYnVzeSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGlzQnVzeSgpIHsKLQkJcmV0dXJuIGJ1c3lMYWJlbCAhPSBudWxsICYmIGJ1c3lMYWJlbC5pc0J1c3koKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb3JtJ3MgYnVzeSBzdGF0ZS4gQnVzeSBmb3JtIHdpbGwgZGlzcGxheSAnYnVzeScgYW5pbWF0aW9uIGluCi0JICogdGhlIGFyZWEgb2YgdGhlIHRpdGxlIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBidXN5Ci0JICogICAgICAgICAgICB0aGUgZm9ybSdzIGJ1c3kgc3RhdGUKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldEJ1c3koYm9vbGVhbiBidXN5KSB7Ci0JCWlmIChidXN5KQotCQkJY3JlYXRlQnVzeUxhYmVsKCk7Ci0JCWlmIChidXN5ID09IGJ1c3lMYWJlbC5pc0J1c3koKSkKLQkJCXJldHVybjsKLQkJYnVzeUxhYmVsLnNldEJ1c3koYnVzeSk7Ci0JCWxheW91dCgpOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldEhlYWRDbGllbnQoKSB7Ci0JCXJldHVybiBoZWFkQ2xpZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlYWRDbGllbnQoQ29udHJvbCBoZWFkQ2xpZW50KSB7Ci0JCUFzc2VydC5pc1RydWUoaGVhZENsaWVudC5nZXRQYXJlbnQoKSA9PSB0aGlzKTsKLQkJdGhpcy5oZWFkQ2xpZW50ID0gaGVhZENsaWVudDsKLQkJbGF5b3V0KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvRm9ybVRleHRNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9Gb3JtVGV4dE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNTJhM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9Gb3JtVGV4dE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkh5cGVybGlua1NldHRpbmdzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEZvcm1UZXh0TW9kZWwgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkKLQkJCS5uZXdJbnN0YW5jZSgpOwotCi0JcHJpdmF0ZSBib29sZWFuIHdoaXRlc3BhY2VOb3JtYWxpemVkID0gdHJ1ZTsKLQotCXByaXZhdGUgVmVjdG9yIHBhcmFncmFwaHM7Ci0KLQlwcml2YXRlIElGb2N1c1NlbGVjdGFibGVbXSBzZWxlY3RhYmxlU2VnbWVudHM7Ci0KLQlwcml2YXRlIGludCBzZWxlY3RlZFNlZ21lbnRJbmRleCA9IC0xOwotCQotCXByaXZhdGUgaW50IHNhdmVkU2VsZWN0ZWRMaW5rSW5kZXggPSAtMTsKLQotCXByaXZhdGUgSHlwZXJsaW5rU2V0dGluZ3MgaHlwZXJsaW5rU2V0dGluZ3M7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0xEX0ZPTlRfSUQgPSAiZi5fX19fYm9sZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFWFRfT05MWV9MSU5LID0gMTsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElNR19PTkxZX0xJTksgPSAyOwotCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9BTkRfSU1BR0VTX0xJTksgPSAzOwotCi0JcHVibGljIEZvcm1UZXh0TW9kZWwoKSB7Ci0JCXJlc2V0KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElUZXh0TW9kZWwjZ2V0UGFyYWdyYXBocygpCi0JICovCi0JcHVibGljIFBhcmFncmFwaFtdIGdldFBhcmFncmFwaHMoKSB7Ci0JCWlmIChwYXJhZ3JhcGhzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFBhcmFncmFwaFswXTsKLQkJcmV0dXJuIChQYXJhZ3JhcGhbXSkgcGFyYWdyYXBocwotCQkJCS50b0FycmF5KG5ldyBQYXJhZ3JhcGhbcGFyYWdyYXBocy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc2libGVUZXh0KCkgewotCQlpZiAocGFyYWdyYXBocyA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFncmFwaHMuc2l6ZSgpOyBpKyspIHsKLQkJCVBhcmFncmFwaCBwYXJhZ3JhcGggPSAoUGFyYWdyYXBoKSBwYXJhZ3JhcGhzLmdldChpKTsKLQkJCVN0cmluZyB0ZXh0ID0gcGFyYWdyYXBoLmdldEFjY2Vzc2libGVUZXh0KCk7Ci0JCQlzYnVmLmFwcGVuZCh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gc2J1Zi50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogQHNlZSBJVGV4dE1vZGVsI3BhcnNlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZVRhZ2dlZFRleHQoU3RyaW5nIHRhZ2dlZFRleHQsIGJvb2xlYW4gZXhwYW5kVVJMcykgewotCQlpZiAodGFnZ2VkVGV4dCA9PSBudWxsKSB7Ci0JCQlyZXNldCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGFnZ2VkVGV4dAotCQkJCQkuZ2V0Qnl0ZXMoIlVURjgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXBhcnNlSW5wdXRTdHJlYW0oc3RyZWFtLCBleHBhbmRVUkxzKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYXJzZUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzLCBib29sZWFuIGV4cGFuZFVSTHMpIHsKLQotCQlkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQlkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldElnbm9yaW5nQ29tbWVudHModHJ1ZSk7Ci0KLQkJcmVzZXQoKTsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ci0JCQkJCS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCUlucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpcyk7Ci0JCQlEb2N1bWVudCBkb2MgPSBwYXJzZXIucGFyc2Uoc291cmNlKTsKLQkJCXByb2Nlc3NEb2N1bWVudChkb2MsIGV4cGFuZFVSTHMpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRG9jdW1lbnQoRG9jdW1lbnQgZG9jLCBib29sZWFuIGV4cGFuZFVSTHMpIHsKLQkJTm9kZSByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOwotCQlwcm9jZXNzU3Vibm9kZXMocGFyYWdyYXBocywgY2hpbGRyZW4sIGV4cGFuZFVSTHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzU3Vibm9kZXMoVmVjdG9yIHBsaXN0LCBOb2RlTGlzdCBjaGlsZHJlbiwgYm9vbGVhbiBleHBhbmRVUkxzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCS8vIE1ha2UgYW4gaW1wbGljaXQgcGFyYWdyYXBoCi0JCQkJU3RyaW5nIHRleHQgPSBnZXRTaW5nbGVOb2RlVGV4dChjaGlsZCk7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCAmJiAhaXNJZ25vcmFibGVXaGl0ZVNwYWNlKHRleHQsIHRydWUpKSB7Ci0JCQkJCVBhcmFncmFwaCBwID0gbmV3IFBhcmFncmFwaCh0cnVlKTsKLQkJCQkJcC5wYXJzZVJlZ3VsYXJUZXh0KHRleHQsIGV4cGFuZFVSTHMsCi0JCQkJCQkJZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSwgbnVsbCk7Ci0JCQkJCXBsaXN0LmFkZChwKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlTdHJpbmcgdGFnID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKS50b0xvd2VyQ2FzZSgpOwotCQkJCWlmICh0YWcuZXF1YWxzKCJwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlQYXJhZ3JhcGggcCA9IHByb2Nlc3NQYXJhZ3JhcGgoY2hpbGQsIGV4cGFuZFVSTHMpOwotCQkJCQlpZiAocCAhPSBudWxsKQotCQkJCQkJcGxpc3QuYWRkKHApOwotCQkJCX0gZWxzZSBpZiAodGFnLmVxdWFscygibGkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVBhcmFncmFwaCBwID0gcHJvY2Vzc0xpc3RJdGVtKGNoaWxkLCBleHBhbmRVUkxzKTsKLQkJCQkJaWYgKHAgIT0gbnVsbCkKLQkJCQkJCXBsaXN0LmFkZChwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFBhcmFncmFwaCBwcm9jZXNzUGFyYWdyYXBoKE5vZGUgcGFyYWdyYXBoLCBib29sZWFuIGV4cGFuZFVSTHMpIHsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJhZ3JhcGguZ2V0Q2hpbGROb2RlcygpOwotCQlOYW1lZE5vZGVNYXAgYXR0cyA9IHBhcmFncmFwaC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCU5vZGUgYWRkU3BhY2VBdHQgPSBhdHRzLmdldE5hbWVkSXRlbSgiYWRkVmVydGljYWxTcGFjZSIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gYWRkU3BhY2UgPSB0cnVlOwotCi0JCWlmIChhZGRTcGFjZUF0dCA9PSBudWxsKQotCQkJYWRkU3BhY2VBdHQgPSBhdHRzLmdldE5hbWVkSXRlbSgidnNwYWNlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoYWRkU3BhY2VBdHQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZhbHVlID0gYWRkU3BhY2VBdHQuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQlhZGRTcGFjZSA9IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVBhcmFncmFwaCBwID0gbmV3IFBhcmFncmFwaChhZGRTcGFjZSk7Ci0KLQkJcHJvY2Vzc1NlZ21lbnRzKHAsIGNoaWxkcmVuLCBleHBhbmRVUkxzKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSBQYXJhZ3JhcGggcHJvY2Vzc0xpc3RJdGVtKE5vZGUgbGlzdEl0ZW0sIGJvb2xlYW4gZXhwYW5kVVJMcykgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGxpc3RJdGVtLmdldENoaWxkTm9kZXMoKTsKLQkJTmFtZWROb2RlTWFwIGF0dHMgPSBsaXN0SXRlbS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCU5vZGUgYWRkU3BhY2VBdHQgPSBhdHRzLmdldE5hbWVkSXRlbSgiYWRkVmVydGljYWxTcGFjZSIpOy8vJE5PTi1OTFMtMSQKLQkJTm9kZSBzdHlsZUF0dCA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJzdHlsZSIpOy8vJE5PTi1OTFMtMSQKLQkJTm9kZSB2YWx1ZUF0dCA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJ2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQkJTm9kZSBpbmRlbnRBdHQgPSBhdHRzLmdldE5hbWVkSXRlbSgiaW5kZW50Iik7Ly8kTk9OLU5MUy0xJAotCQlOb2RlIGJpbmRlbnRBdHQgPSBhdHRzLmdldE5hbWVkSXRlbSgiYmluZGVudCIpOy8vJE5PTi1OTFMtMSQKLQkJaW50IHN0eWxlID0gQnVsbGV0UGFyYWdyYXBoLkNJUkNMRTsKLQkJaW50IGluZGVudCA9IC0xOwotCQlpbnQgYmluZGVudCA9IC0xOwotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWJvb2xlYW4gYWRkU3BhY2UgPSB0cnVlOwotCi0JCWlmIChhZGRTcGFjZUF0dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBhZGRTcGFjZUF0dC5nZXROb2RlVmFsdWUoKTsKLQkJCWFkZFNwYWNlID0gdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHN0eWxlQXR0ICE9IG51bGwpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IHN0eWxlQXR0LmdldE5vZGVWYWx1ZSgpOwotCQkJaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRleHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3R5bGUgPSBCdWxsZXRQYXJhZ3JhcGguVEVYVDsKLQkJCX0gZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiaW1hZ2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3R5bGUgPSBCdWxsZXRQYXJhZ3JhcGguSU1BR0U7Ci0JCQl9IGVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoImJ1bGxldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdHlsZSA9IEJ1bGxldFBhcmFncmFwaC5DSVJDTEU7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZhbHVlQXR0ICE9IG51bGwpIHsKLQkJCXRleHQgPSB2YWx1ZUF0dC5nZXROb2RlVmFsdWUoKTsKLQkJCWlmIChzdHlsZSA9PSBCdWxsZXRQYXJhZ3JhcGguSU1BR0UpCi0JCQkJdGV4dCA9ICJpLiIgKyB0ZXh0OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGluZGVudEF0dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBpbmRlbnRBdHQuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQl0cnkgewotCQkJCWluZGVudCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlpZiAoYmluZGVudEF0dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBiaW5kZW50QXR0LmdldE5vZGVWYWx1ZSgpOwotCQkJdHJ5IHsKLQkJCQliaW5kZW50ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJQnVsbGV0UGFyYWdyYXBoIHAgPSBuZXcgQnVsbGV0UGFyYWdyYXBoKGFkZFNwYWNlKTsKLQkJcC5zZXRJbmRlbnQoaW5kZW50KTsKLQkJcC5zZXRCdWxsZXRJbmRlbnQoYmluZGVudCk7Ci0JCXAuc2V0QnVsbGV0U3R5bGUoc3R5bGUpOwotCQlwLnNldEJ1bGxldFRleHQodGV4dCk7Ci0KLQkJcHJvY2Vzc1NlZ21lbnRzKHAsIGNoaWxkcmVuLCBleHBhbmRVUkxzKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTZWdtZW50cyhQYXJhZ3JhcGggcCwgTm9kZUxpc3QgY2hpbGRyZW4sCi0JCQlib29sZWFuIGV4cGFuZFVSTHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCA9IG51bGw7Ci0KLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIHZhbHVlID0gZ2V0U2luZ2xlTm9kZVRleHQoY2hpbGQpOwotCi0JCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgIWlzSWdub3JhYmxlV2hpdGVTcGFjZSh2YWx1ZSwgZmFsc2UpKSB7Ci0JCQkJCXAucGFyc2VSZWd1bGFyVGV4dCh2YWx1ZSwgZXhwYW5kVVJMcywKLQkJCQkJCQlnZXRIeXBlcmxpbmtTZXR0aW5ncygpLCBudWxsKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaW1nIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlzZWdtZW50ID0gcHJvY2Vzc0ltYWdlU2VnbWVudChjaGlsZCk7Ci0JCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXNlZ21lbnQgPSBwcm9jZXNzSHlwZXJsaW5rU2VnbWVudChjaGlsZCwKLQkJCQkJCQlnZXRIeXBlcmxpbmtTZXR0aW5ncygpKTsKLQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic3BhbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvY2Vzc1RleHRTZWdtZW50KHAsIGV4cGFuZFVSTHMsIGNoaWxkKTsKLQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIHRleHQgPSBnZXROb2RlVGV4dChjaGlsZCk7Ci0JCQkJCVN0cmluZyBmb250SWQgPSBCT0xEX0ZPTlRfSUQ7Ci0JCQkJCXAucGFyc2VSZWd1bGFyVGV4dCh0ZXh0LCBleHBhbmRVUkxzLAotCQkJCQkJCWdldEh5cGVybGlua1NldHRpbmdzKCksIGZvbnRJZCk7Ci0JCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImJyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlzZWdtZW50ID0gbmV3IEJyZWFrU2VnbWVudCgpOwotCQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJjb250cm9sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlzZWdtZW50ID0gcHJvY2Vzc0NvbnRyb2xTZWdtZW50KGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2VnbWVudCAhPSBudWxsKSB7Ci0JCQkJcC5hZGRTZWdtZW50KHNlZ21lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSWdub3JhYmxlV2hpdGVTcGFjZShTdHJpbmcgdGV4dCwgYm9vbGVhbiBpZ25vcmVTcGFjZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGkpOwotCQkJaWYgKGlnbm9yZVNwYWNlcyAmJiBjID09ICcgJykKLQkJCQljb250aW51ZTsKLQkJCWlmIChjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xmJykKLQkJCQljb250aW51ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlU2VnbWVudCBwcm9jZXNzSW1hZ2VTZWdtZW50KE5vZGUgaW1hZ2UpIHsKLQkJSW1hZ2VTZWdtZW50IHNlZ21lbnQgPSBuZXcgSW1hZ2VTZWdtZW50KCk7Ci0JCXByb2Nlc3NPYmplY3RTZWdtZW50KHNlZ21lbnQsIGltYWdlLCAiaS4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc2VnbWVudDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2xTZWdtZW50IHByb2Nlc3NDb250cm9sU2VnbWVudChOb2RlIGNvbnRyb2wpIHsKLQkJQ29udHJvbFNlZ21lbnQgc2VnbWVudCA9IG5ldyBDb250cm9sU2VnbWVudCgpOwotCQlwcm9jZXNzT2JqZWN0U2VnbWVudChzZWdtZW50LCBjb250cm9sLCAiby4iKTsgLy8kTk9OLU5MUy0xJAotCQlOb2RlIGZpbGwgPSBjb250cm9sLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oImZpbGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZmlsbCE9bnVsbCkgewotCQkJU3RyaW5nIHZhbHVlID0gZmlsbC5nZXROb2RlVmFsdWUoKTsKLQkJCWJvb2xlYW4gZG9GaWxsID0gdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQlzZWdtZW50LnNldEZpbGwoZG9GaWxsKTsKLQkJfQotCQlyZXR1cm4gc2VnbWVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc09iamVjdFNlZ21lbnQoT2JqZWN0U2VnbWVudCBzZWdtZW50LCBOb2RlIG9iamVjdCwgU3RyaW5nIHByZWZpeCkgewotCQlOYW1lZE5vZGVNYXAgYXR0cyA9IG9iamVjdC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCU5vZGUgaWQgPSBhdHRzLmdldE5hbWVkSXRlbSgiaHJlZiIpOyAvLyROT04tTkxTLTEkCi0JCU5vZGUgYWxpZ24gPSBhdHRzLmdldE5hbWVkSXRlbSgiYWxpZ24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZhbHVlID0gaWQuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQlzZWdtZW50LnNldE9iamVjdElkKHByZWZpeCArIHZhbHVlKTsKLQkJfQotCQlpZiAoYWxpZ24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHZhbHVlID0gYWxpZ24uZ2V0Tm9kZVZhbHVlKCkudG9Mb3dlckNhc2UoKTsKLQkJCWlmICh2YWx1ZS5lcXVhbHMoInRvcCIpKSAvLyROT04tTkxTLTEkCi0JCQkJc2VnbWVudC5zZXRWZXJ0aWNhbEFsaWdubWVudChJbWFnZVNlZ21lbnQuVE9QKTsKLQkJCWVsc2UgaWYgKHZhbHVlLmVxdWFscygibWlkZGxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlzZWdtZW50LnNldFZlcnRpY2FsQWxpZ25tZW50KEltYWdlU2VnbWVudC5NSURETEUpOwotCQkJZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJib3R0b20iKSkgLy8kTk9OLU5MUy0xJAotCQkJCXNlZ21lbnQuc2V0VmVydGljYWxBbGlnbm1lbnQoSW1hZ2VTZWdtZW50LkJPVFRPTSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXBwZW5kVGV4dChTdHJpbmcgdmFsdWUsIFN0cmluZ0J1ZmZlciBidWYsIGludFtdIHNwYWNlQ291bnRlcikgewotCQlpZiAoIXdoaXRlc3BhY2VOb3JtYWxpemVkKQotCQkJYnVmLmFwcGVuZCh2YWx1ZSk7Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZS5sZW5ndGgoKTsgaisrKSB7Ci0JCQkJY2hhciBjID0gdmFsdWUuY2hhckF0KGopOwotCQkJCWlmIChjID09ICcgJyB8fCBjID09ICdcdCcpIHsKLQkJCQkJLy8gc3BhY2UKLQkJCQkJaWYgKCsrc3BhY2VDb3VudGVyWzBdID09IDEpIHsKLQkJCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXGYnKSB7Ci0JCQkJCS8vIG5ldyBsaW5lCi0JCQkJCWlmICgrK3NwYWNlQ291bnRlclswXSA9PSAxKSB7Ci0JCQkJCQlidWYuYXBwZW5kKCcgJyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBvdGhlciBjaGFyYWN0ZXJzCi0JCQkJCXNwYWNlQ291bnRlclswXSA9IDA7Ci0JCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9ybWFsaXplZFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaW50W10gc3BhY2VDb3VudGVyID0gbmV3IGludFsxXTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWFwcGVuZFRleHQodGV4dCwgYnVmLCBzcGFjZUNvdW50ZXIpOwotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2luZ2xlTm9kZVRleHQoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBnZXROb3JtYWxpemVkVGV4dChub2RlLmdldE5vZGVWYWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROb2RlVGV4dChOb2RlIG5vZGUpIHsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50W10gc3BhY2VDb3VudGVyID0gbmV3IGludFsxXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSBjaGlsZC5nZXROb2RlVmFsdWUoKTsKLQkJCQlhcHBlbmRUZXh0KHZhbHVlLCBidWYsIHNwYWNlQ291bnRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpLnRyaW0oKTsKLQl9Ci0KLQlwcml2YXRlIFBhcmFncmFwaFNlZ21lbnQgcHJvY2Vzc0h5cGVybGlua1NlZ21lbnQoTm9kZSBsaW5rLAotCQkJSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLQkJTmFtZWROb2RlTWFwIGF0dHMgPSBsaW5rLmdldEF0dHJpYnV0ZXMoKTsKLQkJU3RyaW5nIGhyZWYgPSBudWxsOwotCQlib29sZWFuIHdyYXBBbGxvd2VkID0gdHJ1ZTsKLQkJU3RyaW5nIGJvbGRGb250SWQgPSBudWxsOwotCi0JCU5vZGUgaHJlZkF0dCA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJocmVmIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGhyZWZBdHQgIT0gbnVsbCkgewotCQkJaHJlZiA9IGhyZWZBdHQuZ2V0Tm9kZVZhbHVlKCk7Ci0JCX0KLQkJTm9kZSBib2xkQXR0ID0gYXR0cy5nZXROYW1lZEl0ZW0oImJvbGQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYm9sZEF0dCAhPSBudWxsKSB7Ci0JCQlib2xkRm9udElkID0gQk9MRF9GT05UX0lEOwotCQl9Ci0JCU5vZGUgbm93cmFwID0gYXR0cy5nZXROYW1lZEl0ZW0oIm5vd3JhcCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub3dyYXAgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZhbHVlID0gbm93cmFwLmdldE5vZGVWYWx1ZSgpOwotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJd3JhcEFsbG93ZWQgPSBmYWxzZTsKLQkJfQotCQlPYmplY3Qgc3RhdHVzID0gY2hlY2tDaGlsZHJlbihsaW5rKTsKLQkJaWYgKHN0YXR1cyBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgY2hpbGQgPSAoTm9kZSlzdGF0dXM7Ci0JCQlJbWFnZUh5cGVybGlua1NlZ21lbnQgc2VnbWVudCA9IG5ldyBJbWFnZUh5cGVybGlua1NlZ21lbnQoKTsKLQkJCXNlZ21lbnQuc2V0SHJlZihocmVmKTsKLQkJCXNlZ21lbnQuc2V0V29yZFdyYXBBbGxvd2VkKHdyYXBBbGxvd2VkKTsKLQkJCU5vZGUgYWx0ID0gY2hpbGQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgiYWx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhbHQhPW51bGwpCi0JCQkJc2VnbWVudC5zZXRUb29sdGlwVGV4dChhbHQuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJTm9kZSB0ZXh0ID0gY2hpbGQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgidGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodGV4dCE9bnVsbCkKLQkJCQlzZWdtZW50LnNldFRleHQodGV4dC5nZXROb2RlVmFsdWUoKSk7Ci0JCQlwcm9jZXNzT2JqZWN0U2VnbWVudChzZWdtZW50LCBjaGlsZCwgImkuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBzZWdtZW50OwotCQl9ICBlbHNlIGlmIChzdGF0dXMgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgc3RhdHVzOwotCQkJVGV4dEh5cGVybGlua1NlZ21lbnQgc2VnbWVudCA9IG5ldyBUZXh0SHlwZXJsaW5rU2VnbWVudCh0ZXh0LAotCQkJCQlzZXR0aW5ncywgbnVsbCk7Ci0JCQlzZWdtZW50LnNldEhyZWYoaHJlZik7Ci0JCQlzZWdtZW50LnNldEZvbnRJZChib2xkRm9udElkKTsKLQkJCU5vZGUgYWx0ID0gYXR0cy5nZXROYW1lZEl0ZW0oImFsdCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYWx0IT1udWxsKQotCQkJCXNlZ21lbnQuc2V0VG9vbHRpcFRleHQoYWx0LmdldE5vZGVWYWx1ZSgpKTsJCQkKLQkJCXNlZ21lbnQuc2V0V29yZFdyYXBBbGxvd2VkKHdyYXBBbGxvd2VkKTsKLQkJCXJldHVybiBzZWdtZW50OwotCQl9IGVsc2UgewotCQkJQWdncmVnYXRlSHlwZXJsaW5rU2VnbWVudCBwYXJlbnQgPSBuZXcgQWdncmVnYXRlSHlwZXJsaW5rU2VnbWVudCgpOwotCQkJcGFyZW50LnNldEhyZWYoaHJlZik7Ci0JCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGxpbmsuZ2V0Q2hpbGROb2RlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJU3RyaW5nIHZhbHVlID0gY2hpbGQuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCVRleHRIeXBlcmxpbmtTZWdtZW50IHRzID0gbmV3IFRleHRIeXBlcmxpbmtTZWdtZW50KAotCQkJCQkJCWdldE5vcm1hbGl6ZWRUZXh0KHZhbHVlKSwgc2V0dGluZ3MsIG51bGwpOwotCQkJCQlOb2RlIGFsdCA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJhbHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoYWx0IT1udWxsKQotCQkJCQkJdHMuc2V0VG9vbHRpcFRleHQoYWx0LmdldE5vZGVWYWx1ZSgpKTsKLQkJCQkJdHMuc2V0V29yZFdyYXBBbGxvd2VkKHdyYXBBbGxvd2VkKTsKLQkJCQkJcGFyZW50LmFkZCh0cyk7Ci0JCQkJfSBlbHNlIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaW1nIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSW1hZ2VIeXBlcmxpbmtTZWdtZW50IGlzID0gbmV3IEltYWdlSHlwZXJsaW5rU2VnbWVudCgpOwotCQkJCQkJcHJvY2Vzc09iamVjdFNlZ21lbnQoaXMsIGNoaWxkLCAiaS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTm9kZSBhbHQgPSBjaGlsZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJhbHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGFsdCE9bnVsbCkKLQkJCQkJCQlpcy5zZXRUb29sdGlwVGV4dChhbHQuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJCQkJcGFyZW50LmFkZChpcyk7Ci0JCQkJCQlpcy5zZXRXb3JkV3JhcEFsbG93ZWQod3JhcEFsbG93ZWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCX0KLQotCXByaXZhdGUgT2JqZWN0IGNoZWNrQ2hpbGRyZW4oTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gdGV4dCA9IGZhbHNlOwotCQlOb2RlIGltZ05vZGUgPSBudWxsOwotCQkvL2ludCBzdGF0dXMgPSAwOwotCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQl0ZXh0ID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUKLQkJCQkJJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJpbWciKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1nTm9kZSA9IGNoaWxkOwotCQkJfQotCQl9Ci0JCWlmICh0ZXh0ICYmIGltZ05vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBnZXROb2RlVGV4dChub2RlKTsKLQkJZWxzZSBpZiAoIXRleHQgJiYgaW1nTm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIGltZ05vZGU7Ci0JCWVsc2UgcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NUZXh0U2VnbWVudChQYXJhZ3JhcGggcCwgYm9vbGVhbiBleHBhbmRVUkxzLAotCQkJTm9kZSB0ZXh0Tm9kZSkgewotCQlTdHJpbmcgdGV4dCA9IGdldE5vZGVUZXh0KHRleHROb2RlKTsKLQotCQlOYW1lZE5vZGVNYXAgYXR0cyA9IHRleHROb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJTm9kZSBmb250ID0gYXR0cy5nZXROYW1lZEl0ZW0oImZvbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlOb2RlIGNvbG9yID0gYXR0cy5nZXROYW1lZEl0ZW0oImNvbG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGZvbnRJZCA9IG51bGw7Ci0JCVN0cmluZyBjb2xvcklkID0gbnVsbDsKLQkJaWYgKGZvbnQgIT0gbnVsbCkgewotCQkJZm9udElkID0gImYuIiArIGZvbnQuZ2V0Tm9kZVZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoY29sb3IgIT0gbnVsbCkgewotCQkJY29sb3JJZCA9ICJjLiIgKyBjb2xvci5nZXROb2RlVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXAucGFyc2VSZWd1bGFyVGV4dCh0ZXh0LCBleHBhbmRVUkxzLCBnZXRIeXBlcmxpbmtTZXR0aW5ncygpLCBmb250SWQsCi0JCQkJY29sb3JJZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGFyc2VSZWd1bGFyVGV4dChTdHJpbmcgcmVndWxhclRleHQsIGJvb2xlYW4gY29udmVydFVSTHMpIHsKLQkJcmVzZXQoKTsKLQotCQlpZiAocmVndWxhclRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlyZWd1bGFyVGV4dCA9IGdldE5vcm1hbGl6ZWRUZXh0KHJlZ3VsYXJUZXh0KTsKLQotCQlQYXJhZ3JhcGggcCA9IG5ldyBQYXJhZ3JhcGgodHJ1ZSk7Ci0JCXBhcmFncmFwaHMuYWRkKHApOwotCQlpbnQgcHN0YXJ0ID0gMDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ3VsYXJUZXh0Lmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgYyA9IHJlZ3VsYXJUZXh0LmNoYXJBdChpKTsKLQkJCWlmIChwID09IG51bGwpIHsKLQkJCQlwID0gbmV3IFBhcmFncmFwaCh0cnVlKTsKLQkJCQlwYXJhZ3JhcGhzLmFkZChwKTsKLQkJCX0KLQkJCWlmIChjID09ICdcbicpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IHJlZ3VsYXJUZXh0LnN1YnN0cmluZyhwc3RhcnQsIGkpOwotCQkJCXBzdGFydCA9IGkgKyAxOwotCQkJCXAucGFyc2VSZWd1bGFyVGV4dCh0ZXh0LCBjb252ZXJ0VVJMcywgZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSwKLQkJCQkJCW51bGwpOwotCQkJCXAgPSBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCS8vIG5vIG5ldyBsaW5lCi0JCQlTdHJpbmcgdGV4dCA9IHJlZ3VsYXJUZXh0LnN1YnN0cmluZyhwc3RhcnQpOwotCQkJcC5wYXJzZVJlZ3VsYXJUZXh0KHRleHQsIGNvbnZlcnRVUkxzLCBnZXRIeXBlcmxpbmtTZXR0aW5ncygpLCBudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBIeXBlcmxpbmtTZXR0aW5ncyBnZXRIeXBlcmxpbmtTZXR0aW5ncygpIHsKLQkJcmV0dXJuIGh5cGVybGlua1NldHRpbmdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1NldHRpbmdzKEh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzKSB7Ci0JCXRoaXMuaHlwZXJsaW5rU2V0dGluZ3MgPSBzZXR0aW5nczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0JCWlmIChwYXJhZ3JhcGhzID09IG51bGwpCi0JCQlwYXJhZ3JhcGhzID0gbmV3IFZlY3RvcigpOwotCQlwYXJhZ3JhcGhzLmNsZWFyKCk7Ci0JCXNlbGVjdGVkU2VnbWVudEluZGV4ID0gLTE7Ci0JCXNhdmVkU2VsZWN0ZWRMaW5rSW5kZXggPSAtMTsKLQkJc2VsZWN0YWJsZVNlZ21lbnRzID0gbnVsbDsKLQl9Ci0KLQlJRm9jdXNTZWxlY3RhYmxlW10gZ2V0Rm9jdXNTZWxlY3RhYmxlU2VnbWVudHMoKSB7Ci0JCWlmIChzZWxlY3RhYmxlU2VnbWVudHMgIT0gbnVsbCB8fCBwYXJhZ3JhcGhzID09IG51bGwpCi0JCQlyZXR1cm4gc2VsZWN0YWJsZVNlZ21lbnRzOwotCQlWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFncmFwaHMuc2l6ZSgpOyBpKyspIHsKLQkJCVBhcmFncmFwaCBwID0gKFBhcmFncmFwaCkgcGFyYWdyYXBocy5nZXQoaSk7Ci0JCQlQYXJhZ3JhcGhTZWdtZW50W10gc2VnbWVudHMgPSBwLmdldFNlZ21lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNlZ21lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKHNlZ21lbnRzW2pdIGluc3RhbmNlb2YgSUZvY3VzU2VsZWN0YWJsZSkKLQkJCQkJcmVzdWx0LmFkZChzZWdtZW50c1tqXSk7Ci0JCQl9Ci0JCX0KLQkJc2VsZWN0YWJsZVNlZ21lbnRzID0gKElGb2N1c1NlbGVjdGFibGVbXSkgcmVzdWx0Ci0JCQkJLnRvQXJyYXkobmV3IElGb2N1c1NlbGVjdGFibGVbcmVzdWx0LnNpemUoKV0pOwotCQlyZXR1cm4gc2VsZWN0YWJsZVNlZ21lbnRzOwotCX0KLQkKLQlwdWJsaWMgSUh5cGVybGlua1NlZ21lbnQgZ2V0SHlwZXJsaW5rKGludCBpbmRleCkgewotCQlJRm9jdXNTZWxlY3RhYmxlW10gc2VsZWN0YWJsZXMgPSBnZXRGb2N1c1NlbGVjdGFibGVTZWdtZW50cygpOwotCQlpZiAoc2VsZWN0YWJsZXMubGVuZ3RoPmluZGV4KSB7Ci0JCQlJRm9jdXNTZWxlY3RhYmxlIGxpbmsgPSBzZWxlY3RhYmxlc1tpbmRleF07Ci0JCQlpZiAobGluayBpbnN0YW5jZW9mIElIeXBlcmxpbmtTZWdtZW50KQotCQkJCXJldHVybiAoSUh5cGVybGlua1NlZ21lbnQpbGluazsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElIeXBlcmxpbmtTZWdtZW50IGZpbmRIeXBlcmxpbmtBdChpbnQgeCwgaW50IHkpIHsKLQkJSUZvY3VzU2VsZWN0YWJsZVtdIHNlbGVjdGFibGVzID0gZ2V0Rm9jdXNTZWxlY3RhYmxlU2VnbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RhYmxlcy5sZW5ndGg7IGkrKykgewotCQkJSUZvY3VzU2VsZWN0YWJsZSBzZWdtZW50ID0gc2VsZWN0YWJsZXNbaV07Ci0JCQlpZiAoc2VnbWVudCBpbnN0YW5jZW9mIElIeXBlcmxpbmtTZWdtZW50KSB7Ci0JCQkJSUh5cGVybGlua1NlZ21lbnQgbGluayA9IChJSHlwZXJsaW5rU2VnbWVudClzZWdtZW50OwotCQkJCWlmIChsaW5rLmNvbnRhaW5zKHgsIHkpKQotCQkJCQlyZXR1cm4gbGluazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRIeXBlcmxpbmtDb3VudCgpIHsKLQkJcmV0dXJuIGdldEZvY3VzU2VsZWN0YWJsZVNlZ21lbnRzKCkubGVuZ3RoOwotCX0KLQkKLQlwdWJsaWMgaW50IGluZGV4T2YoSUh5cGVybGlua1NlZ21lbnQgbGluaykgewotCQlJRm9jdXNTZWxlY3RhYmxlW10gc2VsZWN0YWJsZXMgPSBnZXRGb2N1c1NlbGVjdGFibGVTZWdtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGFibGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRm9jdXNTZWxlY3RhYmxlIHNlZ21lbnQgPSBzZWxlY3RhYmxlc1tpXTsKLQkJCWlmIChzZWdtZW50IGluc3RhbmNlb2YgSUh5cGVybGlua1NlZ21lbnQpIHsKLQkJCQlJSHlwZXJsaW5rU2VnbWVudCBsID0gKElIeXBlcmxpbmtTZWdtZW50KXNlZ21lbnQ7Ci0JCQkJaWYgKGxpbms9PWwpCi0JCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgUGFyYWdyYXBoU2VnbWVudCBmaW5kU2VnbWVudEF0KGludCB4LCBpbnQgeSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFncmFwaHMuc2l6ZSgpOyBpKyspIHsKLQkJCVBhcmFncmFwaCBwID0gKFBhcmFncmFwaCkgcGFyYWdyYXBocy5nZXQoaSk7Ci0JCQlQYXJhZ3JhcGhTZWdtZW50IHNlZ21lbnQgPSBwLmZpbmRTZWdtZW50QXQoeCwgeSk7Ci0JCQlpZiAoc2VnbWVudCAhPSBudWxsKQotCQkJCXJldHVybiBzZWdtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKFN0cmluZyBmb250SWQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhZ3JhcGhzLnNpemUoKTsgaSsrKSB7Ci0JCQlQYXJhZ3JhcGggcCA9IChQYXJhZ3JhcGgpIHBhcmFncmFwaHMuZ2V0KGkpOwotCQkJcC5jbGVhckNhY2hlKGZvbnRJZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUZvY3VzU2VsZWN0YWJsZSBnZXRTZWxlY3RlZFNlZ21lbnQoKSB7Ci0JCWlmIChzZWxlY3RhYmxlU2VnbWVudHM9PW51bGwgfHwgc2VsZWN0ZWRTZWdtZW50SW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHNlbGVjdGFibGVTZWdtZW50c1tzZWxlY3RlZFNlZ21lbnRJbmRleF07Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRTZWdtZW50SW5kZXgoKSB7Ci0JCXJldHVybiBzZWxlY3RlZFNlZ21lbnRJbmRleDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbGlua0V4aXN0cyhJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7Ci0JCWlmIChzZWxlY3RhYmxlU2VnbWVudHM9PW51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGk9MDsgaTxzZWxlY3RhYmxlU2VnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzZWxlY3RhYmxlU2VnbWVudHNbaV09PWxpbmspCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRyYXZlcnNlRm9jdXNTZWxlY3RhYmxlT2JqZWN0cyhib29sZWFuIG5leHQpIHsKLQkJSUZvY3VzU2VsZWN0YWJsZVtdIHNlbGVjdGFibGVzID0gZ2V0Rm9jdXNTZWxlY3RhYmxlU2VnbWVudHMoKTsKLQkJaWYgKHNlbGVjdGFibGVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBzaXplID0gc2VsZWN0YWJsZXMubGVuZ3RoOwotCQlpZiAobmV4dCkgewotCQkJc2VsZWN0ZWRTZWdtZW50SW5kZXgrKzsKLQkJfSBlbHNlCi0JCQlzZWxlY3RlZFNlZ21lbnRJbmRleC0tOwotCi0JCWlmIChzZWxlY3RlZFNlZ21lbnRJbmRleCA8IDAgfHwgc2VsZWN0ZWRTZWdtZW50SW5kZXggPiBzaXplIC0gMSkgewotCQkJc2VsZWN0ZWRTZWdtZW50SW5kZXggPSAtMTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRTZWdtZW50SW5kZXggIT0gLTE7Ci0JfQotCQotCXB1YmxpYyBJRm9jdXNTZWxlY3RhYmxlIGdldE5leHRGb2N1c1NlZ21lbnQoYm9vbGVhbiBuZXh0KSB7Ci0JCUlGb2N1c1NlbGVjdGFibGVbXSBzZWxlY3RhYmxlcyA9IGdldEZvY3VzU2VsZWN0YWJsZVNlZ21lbnRzKCk7Ci0JCWlmIChzZWxlY3RhYmxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBuZXh0SW5kZXggPSBuZXh0P3NlbGVjdGVkU2VnbWVudEluZGV4KzE6c2VsZWN0ZWRTZWdtZW50SW5kZXgtMTsKLQotCQlpZiAobmV4dEluZGV4IDwgMCB8fCBuZXh0SW5kZXggPiBzZWxlY3RhYmxlcy5sZW5ndGggLSAxKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc2VsZWN0YWJsZXNbbmV4dEluZGV4XTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVzdG9yZVNhdmVkTGluaygpIHsKLQkJaWYgKHNhdmVkU2VsZWN0ZWRMaW5rSW5kZXghPSAtMSkgewotCQkJc2VsZWN0ZWRTZWdtZW50SW5kZXggPSBzYXZlZFNlbGVjdGVkTGlua0luZGV4OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdExpbmsoSUh5cGVybGlua1NlZ21lbnQgbGluaykgewotCQlpZiAobGluayA9PSBudWxsKSB7Ci0JCQlzYXZlZFNlbGVjdGVkTGlua0luZGV4ID0gc2VsZWN0ZWRTZWdtZW50SW5kZXg7CQotCQkJc2VsZWN0ZWRTZWdtZW50SW5kZXggPSAtMTsKLQkJfQotCQllbHNlIHsKLQkJCXNlbGVjdChsaW5rKTsKLQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdChJRm9jdXNTZWxlY3RhYmxlIHNlbGVjdGFibGUpIHsKLQkJSUZvY3VzU2VsZWN0YWJsZVtdIHNlbGVjdGFibGVzID0gZ2V0Rm9jdXNTZWxlY3RhYmxlU2VnbWVudHMoKTsKLQkJc2VsZWN0ZWRTZWdtZW50SW5kZXggPSAtMTsKLQkJaWYgKHNlbGVjdGFibGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0YWJsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzZWxlY3RhYmxlc1tpXS5lcXVhbHMoc2VsZWN0YWJsZSkpIHsKLQkJCQlzZWxlY3RlZFNlZ21lbnRJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGb2N1c1NlZ21lbnRzKCkgewotCQlJRm9jdXNTZWxlY3RhYmxlW10gc2VnbWVudHMgPSBnZXRGb2N1c1NlbGVjdGFibGVTZWdtZW50cygpOwotCQlpZiAoc2VnbWVudHMubGVuZ3RoID4gMCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJcGFyYWdyYXBocyA9IG51bGw7Ci0JCXNlbGVjdGVkU2VnbWVudEluZGV4ID0gLTE7Ci0JCXNhdmVkU2VsZWN0ZWRMaW5rSW5kZXggPSAtMTsKLQkJc2VsZWN0YWJsZVNlZ21lbnRzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdoaXRlc3BhY2VOb3JtYWxpemVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZU5vcm1hbGl6ZWQoKSB7Ci0JCXJldHVybiB3aGl0ZXNwYWNlTm9ybWFsaXplZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2hpdGVzcGFjZU5vcm1hbGl6ZWQKLQkgKiAgICAgICAgICAgIFRoZSB3aGl0ZXNwYWNlTm9ybWFsaXplZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2hpdGVzcGFjZU5vcm1hbGl6ZWQoYm9vbGVhbiB3aGl0ZXNwYWNlTm9ybWFsaXplZCkgewotCQl0aGlzLndoaXRlc3BhY2VOb3JtYWxpemVkID0gd2hpdGVzcGFjZU5vcm1hbGl6ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9Gb3JtVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9Gb3JtVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmJmZTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvRm9ybVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQ2hyaXNzIEdyb3NzIChzY2h0b29Ac2NodG9vLmNvbSkgLSBmaXggZm9yIDYxNjcwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudGV4dC5CcmVha0l0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Db2x1bW5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JTGF5b3V0RXh0ZW5zaW9uOwotCi1wdWJsaWMgY2xhc3MgRm9ybVV0aWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS51aS5mb3JtcyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBpbnQgSF9TQ1JPTExfSU5DUkVNRU5UID0gNTsKLQotCXN0YXRpYyBmaW5hbCBpbnQgVl9TQ1JPTExfSU5DUkVNRU5UID0gNjQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVRyA9IFBMVUdJTl9JRCArICIvZGVidWciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19URVhUID0gREVCVUcgKyAiL3RleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfVEVYVFNJWkUgPSBERUJVRyArICIvdGV4dHNpemUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19GT0NVUyA9IERFQlVHICsgIi9mb2N1cyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPQ1VTX1NDUk9MTElORyA9ICJmb2N1c1Njcm9sbGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwKLQkJCUZvcm1Ub29sa2l0IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGNyZWF0ZVRleHQocGFyZW50LCBsYWJlbCwgZmFjdG9yeSwgMSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLAotCQkJRm9ybVRvb2xraXQgZmFjdG9yeSwgaW50IHNwYW4pIHsKLQkJZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIGxhYmVsKTsKLQkJVGV4dCB0ZXh0ID0gZmFjdG9yeS5jcmVhdGVUZXh0KHBhcmVudCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWludCBoZmlsbCA9IHNwYW4gPT0gMSA/IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCTogR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShoZmlsbCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLAotCQkJRm9ybVRvb2xraXQgZmFjdG9yeSwgaW50IHNwYW4sIGludCBzdHlsZSkgewotCQlMYWJlbCBsID0gZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIGxhYmVsKTsKLQkJaWYgKChzdHlsZSAmIFNXVC5NVUxUSSkgIT0gMCkgewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJCWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQkJVGV4dCB0ZXh0ID0gZmFjdG9yeS5jcmVhdGVUZXh0KHBhcmVudCwgIiIsIHN0eWxlKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaGZpbGwgPSBzcGFuID09IDEgPyBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQk6IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTDsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoaGZpbGwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIEZvcm1Ub29sa2l0IGZhY3RvcnksCi0JCQlpbnQgc3BhbikgewotCQlUZXh0IHRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQocGFyZW50LCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGhmaWxsID0gc3BhbiA9PSAxID8gR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJOiBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEw7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKGhmaWxsIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBjb21wdXRlTWluaW11bVdpZHRoKEdDIGdjLCBTdHJpbmcgdGV4dCkgewotCQlCcmVha0l0ZXJhdG9yIHdiID0gQnJlYWtJdGVyYXRvci5nZXRXb3JkSW5zdGFuY2UoKTsKLQkJd2Iuc2V0VGV4dCh0ZXh0KTsKLQkJaW50IGxhc3QgPSAwOwotCi0JCWludCB3aWR0aCA9IDA7Ci0KLQkJZm9yIChpbnQgbG9jID0gd2IuZmlyc3QoKTsgbG9jICE9IEJyZWFrSXRlcmF0b3IuRE9ORTsgbG9jID0gd2IubmV4dCgpKSB7Ci0JCQlTdHJpbmcgd29yZCA9IHRleHQuc3Vic3RyaW5nKGxhc3QsIGxvYyk7Ci0JCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KHdvcmQpOwotCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgZXh0ZW50LngpOwotCQkJbGFzdCA9IGxvYzsKLQkJfQotCQlTdHJpbmcgbGFzdFdvcmQgPSB0ZXh0LnN1YnN0cmluZyhsYXN0KTsKLQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudChsYXN0V29yZCk7Ci0JCXdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGV4dGVudC54KTsKLQkJcmV0dXJuIHdpZHRoOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUG9pbnQgY29tcHV0ZVdyYXBTaXplKEdDIGdjLCBTdHJpbmcgdGV4dCwgaW50IHdIaW50KSB7Ci0JCUJyZWFrSXRlcmF0b3Igd2IgPSBCcmVha0l0ZXJhdG9yLmdldFdvcmRJbnN0YW5jZSgpOwotCQl3Yi5zZXRUZXh0KHRleHQpOwotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWludCBsaW5lSGVpZ2h0ID0gZm0uZ2V0SGVpZ2h0KCk7Ci0KLQkJaW50IHNhdmVkID0gMDsKLQkJaW50IGxhc3QgPSAwOwotCQlpbnQgaGVpZ2h0ID0gbGluZUhlaWdodDsKLQkJaW50IG1heFdpZHRoID0gMDsKLQotCQlmb3IgKGludCBsb2MgPSB3Yi5maXJzdCgpOyBsb2MgIT0gQnJlYWtJdGVyYXRvci5ET05FOyBsb2MgPSB3Yi5uZXh0KCkpIHsKLQkJCVN0cmluZyB3b3JkID0gdGV4dC5zdWJzdHJpbmcoc2F2ZWQsIGxvYyk7Ci0JCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KHdvcmQpOwotCQkJaWYgKGV4dGVudC54ID4gd0hpbnQpIHsKLQkJCQkvLyBvdmVyZmxvdwotCQkJCXNhdmVkID0gbGFzdDsKLQkJCQloZWlnaHQgKz0gZXh0ZW50Lnk7Ci0JCQl9IGVsc2UgewotCQkJCW1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGV4dGVudC54KTsKLQkJCX0KLQkJCWxhc3QgPSBsb2M7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQb2ludChtYXhXaWR0aCwgaGVpZ2h0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFpbnRXcmFwVGV4dChHQyBnYywgU3RyaW5nIHRleHQsIFJlY3RhbmdsZSBib3VuZHMpIHsKLQkJcGFpbnRXcmFwVGV4dChnYywgdGV4dCwgYm91bmRzLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhaW50V3JhcFRleHQoR0MgZ2MsIFN0cmluZyB0ZXh0LCBSZWN0YW5nbGUgYm91bmRzLAotCQkJYm9vbGVhbiB1bmRlcmxpbmUpIHsKLQkJQnJlYWtJdGVyYXRvciB3YiA9IEJyZWFrSXRlcmF0b3IuZ2V0V29yZEluc3RhbmNlKCk7Ci0JCXdiLnNldFRleHQodGV4dCk7Ci0JCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJaW50IGxpbmVIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsKLQkJaW50IGRlc2NlbnQgPSBmbS5nZXREZXNjZW50KCk7Ci0KLQkJaW50IHNhdmVkID0gMDsKLQkJaW50IGxhc3QgPSAwOwotCQlpbnQgeSA9IGJvdW5kcy55OwotCQlpbnQgd2lkdGggPSBib3VuZHMud2lkdGg7Ci0KLQkJZm9yIChpbnQgbG9jID0gd2IuZmlyc3QoKTsgbG9jICE9IEJyZWFrSXRlcmF0b3IuRE9ORTsgbG9jID0gd2IubmV4dCgpKSB7Ci0JCQlTdHJpbmcgbGluZSA9IHRleHQuc3Vic3RyaW5nKHNhdmVkLCBsb2MpOwotCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudChsaW5lKTsKLQotCQkJaWYgKGV4dGVudC54ID4gd2lkdGgpIHsKLQkJCQkvLyBvdmVyZmxvdwotCQkJCVN0cmluZyBwcmV2TGluZSA9IHRleHQuc3Vic3RyaW5nKHNhdmVkLCBsYXN0KTsKLQkJCQlnYy5kcmF3VGV4dChwcmV2TGluZSwgYm91bmRzLngsIHksIHRydWUpOwotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJUG9pbnQgcHJldkV4dGVudCA9IGdjLnRleHRFeHRlbnQocHJldkxpbmUpOwotCQkJCQlpbnQgbGluZVkgPSB5ICsgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAxOwotCQkJCQlnYwotCQkJCQkJCS5kcmF3TGluZShib3VuZHMueCwgbGluZVksIGJvdW5kcy54ICsgcHJldkV4dGVudC54LAotCQkJCQkJCQkJbGluZVkpOwotCQkJCX0KLQotCQkJCXNhdmVkID0gbGFzdDsKLQkJCQl5ICs9IGxpbmVIZWlnaHQ7Ci0JCQl9Ci0JCQlsYXN0ID0gbG9jOwotCQl9Ci0JCS8vIHBhaW50IHRoZSBsYXN0IGxpbmUKLQkJU3RyaW5nIGxhc3RMaW5lID0gdGV4dC5zdWJzdHJpbmcoc2F2ZWQsIGxhc3QpOwotCQlnYy5kcmF3VGV4dChsYXN0TGluZSwgYm91bmRzLngsIHksIHRydWUpOwotCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQlpbnQgbGluZVkgPSB5ICsgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAxOwotCQkJUG9pbnQgbGFzdEV4dGVudCA9IGdjLnRleHRFeHRlbnQobGFzdExpbmUpOwotCQkJZ2MuZHJhd0xpbmUoYm91bmRzLngsIGxpbmVZLCBib3VuZHMueCArIGxhc3RFeHRlbnQueCwgbGluZVkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTY3JvbGxlZENvbXBvc2l0ZSBnZXRTY3JvbGxlZENvbXBvc2l0ZShDb250cm9sIGMpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IGMuZ2V0UGFyZW50KCk7Ci0KLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsKLQkJCQlyZXR1cm4gKFNjcm9sbGVkQ29tcG9zaXRlKSBwYXJlbnQ7Ci0JCQl9Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZVZpc2libGUoQ29udHJvbCBjKSB7Ci0JCVNjcm9sbGVkQ29tcG9zaXRlIHNjb21wID0gZ2V0U2Nyb2xsZWRDb21wb3NpdGUoYyk7Ci0JCWlmIChzY29tcCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZGF0YSA9IHNjb21wLmdldERhdGEoRk9DVVNfU0NST0xMSU5HKTsKLQkJCWlmIChkYXRhID09IG51bGwgfHwgIWRhdGEuZXF1YWxzKEJvb2xlYW4uRkFMU0UpKQotCQkJCUZvcm1VdGlsLmVuc3VyZVZpc2libGUoc2NvbXAsIGMpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZVZpc2libGUoU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAsIENvbnRyb2wgY29udHJvbCkgewotCQlQb2ludCBjb250cm9sU2l6ZSA9IGNvbnRyb2wuZ2V0U2l6ZSgpOwotCQlQb2ludCBjb250cm9sT3JpZ2luID0gZ2V0Q29udHJvbExvY2F0aW9uKHNjb21wLCBjb250cm9sKTsKLQkJZW5zdXJlVmlzaWJsZShzY29tcCwgY29udHJvbE9yaWdpbiwgY29udHJvbFNpemUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVWaXNpYmxlKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLAotCQkJUG9pbnQgY29udHJvbE9yaWdpbiwgUG9pbnQgY29udHJvbFNpemUpIHsKLQkJUmVjdGFuZ2xlIGFyZWEgPSBzY29tcC5nZXRDbGllbnRBcmVhKCk7Ci0JCVBvaW50IHNjb21wT3JpZ2luID0gc2NvbXAuZ2V0T3JpZ2luKCk7Ci0KLQkJaW50IHggPSBzY29tcE9yaWdpbi54OwotCQlpbnQgeSA9IHNjb21wT3JpZ2luLnk7Ci0KLQkJLy8gaG9yaXpvbnRhbCByaWdodCwgYnV0IG9ubHkgaWYgdGhlIGNvbnRyb2wgaXMgc21hbGxlcgotCQkvLyB0aGFuIHRoZSBjbGllbnQgYXJlYQotCQlpZiAoY29udHJvbFNpemUueCA8IGFyZWEud2lkdGgKLQkJCQkmJiAoY29udHJvbE9yaWdpbi54ICsgY29udHJvbFNpemUueCA+IHNjb21wT3JpZ2luLngKLQkJCQkJCSsgYXJlYS53aWR0aCkpIHsKLQkJCXggPSBjb250cm9sT3JpZ2luLnggKyBjb250cm9sU2l6ZS54IC0gYXJlYS53aWR0aDsKLQkJfQotCQkvLyBob3Jpem9udGFsIGxlZnQgLSBtYWtlIHN1cmUgdGhlIGxlZnQgZWRnZSBvZgotCQkvLyB0aGUgY29udHJvbCBpcyBzaG93aW5nCi0JCWlmIChjb250cm9sT3JpZ2luLnggPCB4KSB7Ci0JCQlpZiAoY29udHJvbFNpemUueCA8IGFyZWEud2lkdGgpCi0JCQkJeCA9IGNvbnRyb2xPcmlnaW4ueCArIGNvbnRyb2xTaXplLnggLSBhcmVhLndpZHRoOwotCQkJZWxzZQotCQkJCXggPSBjb250cm9sT3JpZ2luLng7Ci0JCX0KLQkJLy8gdmVydGljYWwgYm90dG9tCi0JCWlmIChjb250cm9sU2l6ZS55IDwgYXJlYS5oZWlnaHQKLQkJCQkmJiAoY29udHJvbE9yaWdpbi55ICsgY29udHJvbFNpemUueSA+IHNjb21wT3JpZ2luLnkKLQkJCQkJCSsgYXJlYS5oZWlnaHQpKSB7Ci0JCQl5ID0gY29udHJvbE9yaWdpbi55ICsgY29udHJvbFNpemUueSAtIGFyZWEuaGVpZ2h0OwotCQl9Ci0JCS8vIHZlcnRpY2FsIHRvcCAtIG1ha2Ugc3VyZSB0aGUgdG9wIG9mCi0JCS8vIHRoZSBjb250cm9sIGlzIHNob3dpbmcKLQkJaWYgKGNvbnRyb2xPcmlnaW4ueSA8IHkpIHsKLQkJCWlmIChjb250cm9sU2l6ZS55IDwgYXJlYS5oZWlnaHQpCi0JCQkJeSA9IGNvbnRyb2xPcmlnaW4ueSArIGNvbnRyb2xTaXplLnkgLSBhcmVhLmhlaWdodDsKLQkJCWVsc2UKLQkJCQl5ID0gY29udHJvbE9yaWdpbi55OwotCQl9Ci0KLQkJaWYgKHNjb21wT3JpZ2luLnggIT0geCB8fCBzY29tcE9yaWdpbi55ICE9IHkpIHsKLQkJCS8vIHNjcm9sbCB0byByZXZlYWwKLQkJCXNjb21wLnNldE9yaWdpbih4LCB5KTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVWaXNpYmxlKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBDb250cm9sIGNvbnRyb2wsCi0JCQlNb3VzZUV2ZW50IGUpIHsKLQkJUG9pbnQgY29udHJvbE9yaWdpbiA9IGdldENvbnRyb2xMb2NhdGlvbihzY29tcCwgY29udHJvbCk7Ci0JCWludCByWCA9IGNvbnRyb2xPcmlnaW4ueCArIGUueDsKLQkJaW50IHJZID0gY29udHJvbE9yaWdpbi55ICsgZS55OwotCQlSZWN0YW5nbGUgYXJlYSA9IHNjb21wLmdldENsaWVudEFyZWEoKTsKLQkJUG9pbnQgc2NvbXBPcmlnaW4gPSBzY29tcC5nZXRPcmlnaW4oKTsKLQotCQlpbnQgeCA9IHNjb21wT3JpZ2luLng7Ci0JCWludCB5ID0gc2NvbXBPcmlnaW4ueTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFbnN1cmU6IGFyZWE9IithcmVhKyIsIG9yaWdpbj0iK3Njb21wT3JpZ2luKyIsCi0JCS8vIGNsb2M9Iitjb250cm9sT3JpZ2luKyIsIGNzaXplPSIrY29udHJvbFNpemUrIiwgeD0iK3grIiwgeT0iK3kpOwotCi0JCS8vIGhvcml6b250YWwgcmlnaHQKLQkJaWYgKHJYID4gc2NvbXBPcmlnaW4ueCArIGFyZWEud2lkdGgpIHsKLQkJCXggPSByWCAtIGFyZWEud2lkdGg7Ci0JCX0KLQkJLy8gaG9yaXpvbnRhbCBsZWZ0Ci0JCWVsc2UgaWYgKHJYIDwgeCkgewotCQkJeCA9IHJYOwotCQl9Ci0JCS8vIHZlcnRpY2FsIGJvdHRvbQotCQlpZiAoclkgPiBzY29tcE9yaWdpbi55ICsgYXJlYS5oZWlnaHQpIHsKLQkJCXkgPSByWSAtIGFyZWEuaGVpZ2h0OwotCQl9Ci0JCS8vIHZlcnRpY2FsIHRvcAotCQllbHNlIGlmIChyWSA8IHkpIHsKLQkJCXkgPSByWTsKLQkJfQotCi0JCWlmIChzY29tcE9yaWdpbi54ICE9IHggfHwgc2NvbXBPcmlnaW4ueSAhPSB5KSB7Ci0JCQkvLyBzY3JvbGwgdG8gcmV2ZWFsCi0JCQlzY29tcC5zZXRPcmlnaW4oeCwgeSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFBvaW50IGdldENvbnRyb2xMb2NhdGlvbihTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwKLQkJCUNvbnRyb2wgY29udHJvbCkgewotCQlpbnQgeCA9IDA7Ci0JCWludCB5ID0gMDsKLQkJQ29udHJvbCBjb250ZW50ID0gc2NvbXAuZ2V0Q29udGVudCgpOwotCQlDb250cm9sIGN1cnJlbnRDb250cm9sID0gY29udHJvbDsKLQkJZm9yICg7OykgewotCQkJaWYgKGN1cnJlbnRDb250cm9sID09IGNvbnRlbnQpCi0JCQkJYnJlYWs7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IGN1cnJlbnRDb250cm9sLmdldExvY2F0aW9uKCk7Ci0JCQkvLyBpZiAobG9jYXRpb24ueCA+IDApCi0JCQkvLyB4ICs9IGxvY2F0aW9uLng7Ci0JCQkvLyBpZiAobG9jYXRpb24ueSA+IDApCi0JCQkvLyB5ICs9IGxvY2F0aW9uLnk7Ci0JCQl4ICs9IGxvY2F0aW9uLng7Ci0JCQl5ICs9IGxvY2F0aW9uLnk7Ci0JCQljdXJyZW50Q29udHJvbCA9IGN1cnJlbnRDb250cm9sLmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBuZXcgUG9pbnQoeCwgeSk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgc2Nyb2xsVmVydGljYWwoU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAsIGJvb2xlYW4gdXApIHsKLQkJc2Nyb2xsKHNjb21wLCAwLCB1cCA/IC1WX1NDUk9MTF9JTkNSRU1FTlQgOiBWX1NDUk9MTF9JTkNSRU1FTlQpOwotCX0KLQotCXN0YXRpYyB2b2lkIHNjcm9sbEhvcml6b250YWwoU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAsIGJvb2xlYW4gbGVmdCkgewotCQlzY3JvbGwoc2NvbXAsIGxlZnQgPyAtSF9TQ1JPTExfSU5DUkVNRU5UIDogSF9TQ1JPTExfSU5DUkVNRU5ULCAwKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBzY3JvbGxQYWdlKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBib29sZWFuIHVwKSB7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2NvbXAuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgaW5jcmVtZW50ID0gdXAgPyAtY2xpZW50QXJlYS5oZWlnaHQgOiBjbGllbnRBcmVhLmhlaWdodDsKLQkJc2Nyb2xsKHNjb21wLCAwLCBpbmNyZW1lbnQpOwotCX0KLQotCXN0YXRpYyB2b2lkIHNjcm9sbChTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgaW50IHhvZmZzZXQsIGludCB5b2Zmc2V0KSB7Ci0JCVBvaW50IG9yaWdpbiA9IHNjb21wLmdldE9yaWdpbigpOwotCQlQb2ludCBjb250ZW50U2l6ZSA9IHNjb21wLmdldENvbnRlbnQoKS5nZXRTaXplKCk7Ci0JCWludCB4b3JpZ2luID0gb3JpZ2luLnggKyB4b2Zmc2V0OwotCQlpbnQgeW9yaWdpbiA9IG9yaWdpbi55ICsgeW9mZnNldDsKLQkJeG9yaWdpbiA9IE1hdGgubWF4KHhvcmlnaW4sIDApOwotCQl4b3JpZ2luID0gTWF0aC5taW4oeG9yaWdpbiwgY29udGVudFNpemUueCAtIDEpOwotCQl5b3JpZ2luID0gTWF0aC5tYXgoeW9yaWdpbiwgMCk7Ci0JCXlvcmlnaW4gPSBNYXRoLm1pbih5b3JpZ2luLCBjb250ZW50U2l6ZS55IC0gMSk7Ci0JCXNjb21wLnNldE9yaWdpbih4b3JpZ2luLCB5b3JpZ2luKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlUGFnZUluY3JlbWVudChTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCkgewotCQlTY3JvbGxCYXIgdmJhciA9IHNjb21wLmdldFZlcnRpY2FsQmFyKCk7Ci0JCWlmICh2YmFyICE9IG51bGwpIHsKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2NvbXAuZ2V0Q2xpZW50QXJlYSgpOwotCQkJaW50IGluY3JlbWVudCA9IGNsaWVudEFyZWEuaGVpZ2h0IC0gNTsKLQkJCXZiYXIuc2V0UGFnZUluY3JlbWVudChpbmNyZW1lbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NLZXkoaW50IGtleUNvZGUsIENvbnRyb2wgYykgewotCQlTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCA9IEZvcm1VdGlsLmdldFNjcm9sbGVkQ29tcG9zaXRlKGMpOwotCQlpZiAoc2NvbXAgIT0gbnVsbCkgewotCQkJaWYgKGMgaW5zdGFuY2VvZiBDb21ibykKLQkJCQlyZXR1cm47Ci0JCQlzd2l0Y2ggKGtleUNvZGUpIHsKLQkJCWNhc2UgU1dULkFSUk9XX0RPV046Ci0JCQkJaWYgKHNjb21wLmdldERhdGEoIm5vdmFycm93cyIpID09IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJRm9ybVV0aWwuc2Nyb2xsVmVydGljYWwoc2NvbXAsIGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULkFSUk9XX1VQOgotCQkJCWlmIChzY29tcC5nZXREYXRhKCJub3ZhcnJvd3MiKSA9PSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCUZvcm1VdGlsLnNjcm9sbFZlcnRpY2FsKHNjb21wLCB0cnVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULkFSUk9XX0xFRlQ6Ci0JCQkJRm9ybVV0aWwuc2Nyb2xsSG9yaXpvbnRhbChzY29tcCwgdHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5BUlJPV19SSUdIVDoKLQkJCQlGb3JtVXRpbC5zY3JvbGxIb3Jpem9udGFsKHNjb21wLCBmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5QQUdFX1VQOgotCQkJCUZvcm1VdGlsLnNjcm9sbFBhZ2Uoc2NvbXAsIHRydWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuUEFHRV9ET1dOOgotCQkJCUZvcm1VdGlsLnNjcm9sbFBhZ2Uoc2NvbXAsIGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXN0YXRpYyBib29sZWFuIGlzV3JhcENvbnRyb2woQ29udHJvbCBjKSB7Ci0JCWlmICgoYy5nZXRTdHlsZSgpICYgU1dULldSQVApICE9IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGMgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCXJldHVybiAoKENvbXBvc2l0ZSkgYykuZ2V0TGF5b3V0KCkgaW5zdGFuY2VvZiBJTGF5b3V0RXh0ZW5zaW9uOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRXaWR0aEhpbnQoaW50IHdIaW50LCBDb250cm9sIGMpIHsKLQkJYm9vbGVhbiB3cmFwID0gaXNXcmFwQ29udHJvbChjKTsKLQkJcmV0dXJuIHdyYXAgPyB3SGludCA6IFNXVC5ERUZBVUxUOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldEhlaWdodEhpbnQoaW50IGhIaW50LCBDb250cm9sIGMpIHsKLQkJaWYgKGMgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCUxheW91dCBsYXlvdXQgPSAoKENvbXBvc2l0ZSkgYykuZ2V0TGF5b3V0KCk7Ci0JCQlpZiAobGF5b3V0IGluc3RhbmNlb2YgQ29sdW1uTGF5b3V0KQotCQkJCXJldHVybiBoSGludDsKLQkJfQotCQlyZXR1cm4gU1dULkRFRkFVTFQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZU1pbmltdW1XaWR0aChDb250cm9sIGMsIGJvb2xlYW4gY2hhbmdlZCkgewotCQlpZiAoYyBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJTGF5b3V0IGxheW91dCA9ICgoQ29tcG9zaXRlKSBjKS5nZXRMYXlvdXQoKTsKLQkJCWlmIChsYXlvdXQgaW5zdGFuY2VvZiBJTGF5b3V0RXh0ZW5zaW9uKQotCQkJCXJldHVybiAoKElMYXlvdXRFeHRlbnNpb24pIGxheW91dCkuY29tcHV0ZU1pbmltdW1XaWR0aCgKLQkJCQkJCShDb21wb3NpdGUpIGMsIGNoYW5nZWQpOwotCQl9Ci0JCXJldHVybiBjLmNvbXB1dGVTaXplKEZvcm1VdGlsLmdldFdpZHRoSGludCg1LCBjKSwgU1dULkRFRkFVTFQsIGNoYW5nZWQpLng7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZU1heGltdW1XaWR0aChDb250cm9sIGMsIGJvb2xlYW4gY2hhbmdlZCkgewotCQlpZiAoYyBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJTGF5b3V0IGxheW91dCA9ICgoQ29tcG9zaXRlKSBjKS5nZXRMYXlvdXQoKTsKLQkJCWlmIChsYXlvdXQgaW5zdGFuY2VvZiBJTGF5b3V0RXh0ZW5zaW9uKQotCQkJCXJldHVybiAoKElMYXlvdXRFeHRlbnNpb24pIGxheW91dCkuY29tcHV0ZU1heGltdW1XaWR0aCgKLQkJCQkJCShDb21wb3NpdGUpIGMsIGNoYW5nZWQpOwotCQl9Ci0JCXJldHVybiBjLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCkueDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZvcm0gZ2V0Rm9ybShDb250cm9sIGMpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IGMuZ2V0UGFyZW50KCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEZvcm0pIHsKLQkJCQlyZXR1cm4gKEZvcm0pIHBhcmVudDsKLQkJCX0KLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGNyZWF0ZUFscGhhTWFzaEltYWdlKERldmljZSBkZXZpY2UsIEltYWdlIHNyY0ltYWdlKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBzcmNJbWFnZS5nZXRCb3VuZHMoKTsKLQkJaW50IGFscGhhID0gMDsKLQkJaW50IGNhbHBoYSA9IDA7Ci0JCUltYWdlRGF0YSBkYXRhID0gc3JjSW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCS8vIENyZWF0ZSBhIG5ldyBpbWFnZSB3aXRoIGFscGhhIHZhbHVlcyBhbHRlcm5hdGluZwotCQkvLyBiZXR3ZWVuIGZ1bGx5IHRyYW5zcGFyZW50ICgwKSBhbmQgZnVsbHkgb3BhcXVlICgyNTUpLgotCQkvLyBUaGlzIGltYWdlIHdpbGwgc2hvdyB0aGUgYmFja2dyb3VuZCB0aHJvdWdoIHRoZQotCQkvLyB0cmFuc3BhcmVudCBwaXhlbHMuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYm91bmRzLmhlaWdodDsgaSsrKSB7Ci0JCQkvLyBzY2FuIGxpbmUKLQkJCWFscGhhID0gY2FscGhhOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBib3VuZHMud2lkdGg7IGorKykgewotCQkJCS8vIGNvbHVtbgotCQkJCWRhdGEuc2V0QWxwaGEoaiwgaSwgYWxwaGEpOwotCQkJCWFscGhhID0gYWxwaGEgPT0gMjU1ID8gMCA6IDI1NTsKLQkJCX0KLQkJCWNhbHBoYSA9IGNhbHBoYSA9PSAyNTUgPyAwIDogMjU1OwotCQl9Ci0JCXJldHVybiBuZXcgSW1hZ2UoZGV2aWNlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZvbnQgY3JlYXRlQm9sZEZvbnQoRGlzcGxheSBkaXNwbGF5LCBGb250IHJlZ3VsYXJGb250KSB7Ci0JCUZvbnREYXRhW10gZm9udERhdGFzID0gcmVndWxhckZvbnQuZ2V0Rm9udERhdGEoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb250RGF0YXMubGVuZ3RoOyBpKyspIHsKLQkJCWZvbnREYXRhc1tpXS5zZXRTdHlsZShmb250RGF0YXNbaV0uZ2V0U3R5bGUoKSB8IFNXVC5CT0xEKTsKLQkJfQotCQlyZXR1cm4gbmV3IEZvbnQoZGlzcGxheSwgZm9udERhdGFzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbW5lbW9uaWNNYXRjaChTdHJpbmcgdGV4dCwgY2hhciBrZXkpIHsKLQkJY2hhciBtbmVtb25pYyA9IGZpbmRNbmVtb25pYyh0ZXh0KTsKLQkJaWYgKG1uZW1vbmljID09ICdcMCcpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBDaGFyYWN0ZXIudG9VcHBlckNhc2Uoa2V5KSA9PSBDaGFyYWN0ZXIudG9VcHBlckNhc2UobW5lbW9uaWMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXIgZmluZE1uZW1vbmljKFN0cmluZyBzdHJpbmcpIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJZG8gewotCQkJd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIHN0cmluZy5jaGFyQXQoaW5kZXgpICE9ICcmJykKLQkJCQlpbmRleCsrOwotCQkJaWYgKCsraW5kZXggPj0gbGVuZ3RoKQotCQkJCXJldHVybiAnXDAnOwotCQkJaWYgKHN0cmluZy5jaGFyQXQoaW5kZXgpICE9ICcmJykKLQkJCQlyZXR1cm4gc3RyaW5nLmNoYXJBdChpbmRleCk7Ci0JCQlpbmRleCsrOwotCQl9IHdoaWxlIChpbmRleCA8IGxlbmd0aCk7Ci0JCXJldHVybiAnXDAnOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9jdXNTY3JvbGxpbmdFbmFibGVkKENvbnRyb2wgYywgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCVNjcm9sbGVkQ29tcG9zaXRlIHNjb21wID0gbnVsbDsKLQkJCi0JCWlmIChjIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpCi0JCQlzY29tcCA9IChTY3JvbGxlZENvbXBvc2l0ZSljOwotCQllbHNlCi0JCQlzY29tcCA9IGdldFNjcm9sbGVkQ29tcG9zaXRlKGMpOwotCQlpZiAoc2NvbXAhPW51bGwpCi0JCQlzY29tcC5zZXREYXRhKEZvcm1VdGlsLkZPQ1VTX1NDUk9MTElORywgZW5hYmxlZD9udWxsOkJvb2xlYW4uRkFMU0UpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0Zvcm1zUmVzb3VyY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0Zvcm1zUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNzQxZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9Gb3Jtc1Jlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZHMgdG8gYWNjZXNzIHNoYXJlZCBmb3JtLXNwZWNpZmljIHJlc291cmNlcy4KLSAqIDxwPgotICogQWxsIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhpcyBjbGFzcyBhcmUgc3RhdGljLiBUaGlzCi0gKiBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgotICogPC9wPgotICogPHA+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGb3Jtc1Jlc291cmNlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgQ3Vyc29yIGJ1c3lDdXJzb3I7Ci0JcHJpdmF0ZSBzdGF0aWMgQ3Vyc29yIGhhbmRDdXJzb3I7Ci0JcHJpdmF0ZSBzdGF0aWMgQ3Vyc29yIHRleHRDdXJzb3I7Ci0JCi0JcHVibGljIHN0YXRpYyBDdXJzb3IgZ2V0QnVzeUN1cnNvcigpIHsKLQkJaWYgKGJ1c3lDdXJzb3I9PW51bGwpCi0JCQlidXN5Q3Vyc29yID0gbmV3IEN1cnNvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJcmV0dXJuIGJ1c3lDdXJzb3I7Ci0JfQotCXB1YmxpYyBzdGF0aWMgQ3Vyc29yIGdldEhhbmRDdXJzb3IoKSB7Ci0JCWlmIChoYW5kQ3Vyc29yPT1udWxsKQotCQkJaGFuZEN1cnNvciA9IG5ldyBDdXJzb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIFNXVC5DVVJTT1JfSEFORCk7Ci0JCXJldHVybiBoYW5kQ3Vyc29yOwotCX0KLQlwdWJsaWMgc3RhdGljIEN1cnNvciBnZXRUZXh0Q3Vyc29yKCkgewotCQlpZiAodGV4dEN1cnNvcj09bnVsbCkKLQkJCXRleHRDdXJzb3IgPSBuZXcgQ3Vyc29yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBTV1QuQ1VSU09SX0lCRUFNKTsKLQkJcmV0dXJuIHRleHRDdXJzb3I7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldFByb2dyZXNzRGVsYXkoaW50IGluZGV4KSB7Ci0JCS8qCi0JCWlmIChwcm9ncmVzc0RlbGF5cz09bnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gcHJvZ3Jlc3NEZWxheXNbaW5kZXhdOwotCQkqLwotCQlyZXR1cm4gMTAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChidXN5Q3Vyc29yIT1udWxsKQotCQkJYnVzeUN1cnNvci5kaXNwb3NlKCk7Ci0JCWlmIChoYW5kQ3Vyc29yIT1udWxsKQotCQkJaGFuZEN1cnNvci5kaXNwb3NlKCk7Ci0JCWlmICh0ZXh0Q3Vyc29yIT1udWxsKQotCQkJdGV4dEN1cnNvci5kaXNwb3NlKCk7Ci0JCWJ1c3lDdXJzb3I9bnVsbDsKLQkJaGFuZEN1cnNvcj1udWxsOwotCQl0ZXh0Q3Vyc29yPW51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9JRm9jdXNTZWxlY3RhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0lGb2N1c1NlbGVjdGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiOWE3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0lGb2N1c1NlbGVjdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZvY3VzU2VsZWN0YWJsZSB7Ci0JYm9vbGVhbiBpc0ZvY3VzU2VsZWN0YWJsZShIYXNodGFibGUgcmVzb3VyY2VUYWJsZSk7Ci0JYm9vbGVhbiBzZXRGb2N1cyhIYXNodGFibGUgcmVzb3VyY2VUYWJsZSwgYm9vbGVhbiBkaXJlY3Rpb24pOwotCVJlY3RhbmdsZSBnZXRCb3VuZHMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvSUh5cGVybGlua1NlZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvSUh5cGVybGlua1NlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkMTFhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0lIeXBlcmxpbmtTZWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQ2hyaXNzIEdyb3NzIChzY2h0b29Ac2NodG9vLmNvbSkgLSBmaXggZm9yIDYxNjcwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLQotcHVibGljIGludGVyZmFjZSBJSHlwZXJsaW5rU2VnbWVudCBleHRlbmRzIElGb2N1c1NlbGVjdGFibGUgewotCVN0cmluZyBnZXRIcmVmKCk7Ci0JU3RyaW5nIGdldFRleHQoKTsKLQl2b2lkIHBhaW50Rm9jdXMoR0MgZ2MsIENvbG9yIGJnLCBDb2xvciBmZywgYm9vbGVhbiBzZWxlY3RlZCwgUmVjdGFuZ2xlIHJlcGFpbnRSZWdpb24pOwotCWJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KTsKLQlib29sZWFuIGludGVyc2VjdHMoUmVjdGFuZ2xlIHJlY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9JbWFnZUh5cGVybGlua1NlZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvSW1hZ2VIeXBlcmxpbmtTZWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YWZiMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9JbWFnZUh5cGVybGlua1NlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIEltYWdlSHlwZXJsaW5rU2VnbWVudCBleHRlbmRzIEltYWdlU2VnbWVudCBpbXBsZW1lbnRzCi0JCUlIeXBlcmxpbmtTZWdtZW50IHsKLQlwcml2YXRlIFN0cmluZyBocmVmOwotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLQlwcml2YXRlIFN0cmluZyB0b29sdGlwVGV4dDsKLQotCXB1YmxpYyBJbWFnZUh5cGVybGlua1NlZ21lbnQoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzLklIeXBlcmxpbmtTZWdtZW50I3NldEhyZWYoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKSB7Ci0JCXRoaXMuaHJlZiA9IGhyZWY7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzLklIeXBlcmxpbmtTZWdtZW50I2dldEhyZWYoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLQkJcmV0dXJuIGhyZWY7Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnRGb2N1cyhHQyBnYywgQ29sb3IgYmcsIENvbG9yIGZnLCBib29sZWFuIHNlbGVjdGVkLAotCQkJUmVjdGFuZ2xlIHJlcGFpbnRSZWdpb24pIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlpZiAoYm91bmRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJZ2Muc2V0QmFja2dyb3VuZChiZyk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGZnKTsKLQkJCWdjLmRyYXdGb2N1cyhib3VuZHMueCwgYm91bmRzLnksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCX0gZWxzZSB7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGJnKTsKLQkJCWdjLmRyYXdSZWN0YW5nbGUoYm91bmRzLngsIGJvdW5kcy55LCBib3VuZHMud2lkdGggLSAxLAotCQkJCQlib3VuZHMuaGVpZ2h0IC0gMSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuSUh5cGVybGlua1NlZ21lbnQjaXNXb3JkV3JhcEFsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29yZFdyYXBBbGxvd2VkKCkgewotCQlyZXR1cm4gIWlzTm93cmFwKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzLklIeXBlcmxpbmtTZWdtZW50I3NldFdvcmRXcmFwQWxsb3dlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmRXcmFwQWxsb3dlZChib29sZWFuIHZhbHVlKSB7Ci0JCXNldE5vd3JhcCghdmFsdWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5JSHlwZXJsaW5rU2VnbWVudCNnZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0IT1udWxsP3RleHQ6IiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLnRleHQgPSB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG9vbHRpcFRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sdGlwVGV4dCgpIHsKLQkJcmV0dXJuIHRvb2x0aXBUZXh0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b29sdGlwVGV4dAotCSAqICAgICAgICAgICAgVGhlIHRvb2x0aXBUZXh0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb29sdGlwVGV4dChTdHJpbmcgdG9vbHRpcFRleHQpIHsKLQkJdGhpcy50b29sdGlwVGV4dCA9IHRvb2x0aXBUZXh0OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9jdXNTZWxlY3RhYmxlKEhhc2h0YWJsZSByZXNvdXJjZVRhYmxlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldEZvY3VzKEhhc2h0YWJsZSByZXNvdXJjZVRhYmxlLCBib29sZWFuIGRpcmVjdGlvbikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0ltYWdlU2VnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9JbWFnZVNlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlODYxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0ltYWdlU2VnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VTZWdtZW50IGV4dGVuZHMgT2JqZWN0U2VnbWVudCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMX0lNQUdFX1BSRUZJWCA9ICJpc2VsLiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShIYXNodGFibGUgb2JqZWN0VGFibGUpIHsKLQkJcmV0dXJuIGdldEltYWdlKGdldE9iamVjdElkKCksIG9iamVjdFRhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXksIEhhc2h0YWJsZSBvYmplY3RUYWJsZSkgewotCQlpZiAoa2V5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IG9iaiA9IG9iamVjdFRhYmxlLmdldChrZXkpOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEltYWdlKQotCQkJcmV0dXJuIChJbWFnZSkgb2JqOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldFNlbGVjdGVkSW1hZ2UoSGFzaHRhYmxlIG9iamVjdFRhYmxlLCBTZWxlY3Rpb25EYXRhIHNlbERhdGEpIHsKLQkJU3RyaW5nIGtleSA9IFNFTF9JTUFHRV9QUkVGSVggKyBnZXRPYmplY3RJZCgpOwotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlKGtleSwgb2JqZWN0VGFibGUpOwotCQlpZiAoaW1hZ2U9PW51bGwpIHsKLQkJCWltYWdlID0gRm9ybVV0aWwuY3JlYXRlQWxwaGFNYXNoSW1hZ2Uoc2VsRGF0YS5kaXNwbGF5LCBnZXRJbWFnZShvYmplY3RUYWJsZSkpOwotCQkJaWYgKGltYWdlIT1udWxsKQotCQkJCW9iamVjdFRhYmxlLnB1dChrZXksIGltYWdlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotLyoKLQlwcml2YXRlIFN0cmluZyBnZXRTZWxlY3RlZEltYWdlSWQoKSB7Ci0JCWlmIChnZXRPYmplY3RJZCgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIFNFTF9JTUFHRV9QUkVGSVggKyBnZXRPYmplY3RJZCgpOwotCX0KLSovCi0JCi0JcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGJvb2xlYW4gaG92ZXIsIEhhc2h0YWJsZSByZXNvdXJjZVRhYmxlLCBib29sZWFuIHNlbGVjdGVkLCBTZWxlY3Rpb25EYXRhIHNlbERhdGEsIFJlY3RhbmdsZSByZXBhaW50UmVnaW9uKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2UocmVzb3VyY2VUYWJsZSk7Ci0JCWludCBpd2lkdGggPSAwOwotCQlpbnQgaWhlaWdodCA9IDA7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJaXdpZHRoID0gcmVjdC53aWR0aCArIChpc1NlbGVjdGFibGUoKT8yOjApOwotCQkJaWhlaWdodCA9IHJlY3QuaGVpZ2h0ICsgKGlzU2VsZWN0YWJsZSgpPzI6MCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuOwotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0Qm91bmRzKCk7Ci0JCWludCBpeCA9IGJvdW5kcy54Kyhpc1NlbGVjdGFibGUoKT8xOjApOwotCQlpbnQgaXkgPSBib3VuZHMueSsoaXNTZWxlY3RhYmxlKCk/MTowKTsKLQotCQlpZiAoc2VsRGF0YSAhPSBudWxsKSB7Ci0JCQlpbnQgbGVmdE9mZnNldCA9IHNlbERhdGEuZ2V0TGVmdE9mZnNldChib3VuZHMuaGVpZ2h0KTsKLQkJCWludCByaWdodE9mZnNldCA9IHNlbERhdGEuZ2V0UmlnaHRPZmZzZXQoYm91bmRzLmhlaWdodCk7Ci0JCQlib29sZWFuIGZpcnN0Um93ID0gc2VsRGF0YS5pc0ZpcnN0U2VsZWN0aW9uUm93KGJvdW5kcy55LAotCQkJCQlib3VuZHMuaGVpZ2h0KTsKLQkJCWJvb2xlYW4gbGFzdFJvdyA9IHNlbERhdGEuaXNMYXN0U2VsZWN0aW9uUm93KGJvdW5kcy55LAotCQkJCQlib3VuZHMuaGVpZ2h0KTsKLQkJCWJvb2xlYW4gc2VsZWN0ZWRSb3cgPSBzZWxEYXRhCi0JCQkJCS5pc1NlbGVjdGVkUm93KGJvdW5kcy55LCBib3VuZHMuaGVpZ2h0KTsKLQkJCWlmIChzZWxlY3RlZFJvdykgewotCQkJCWlmICgoZmlyc3RSb3cgJiYgbGVmdE9mZnNldCA+IGl4KSB8fAotCQkJCQkobGFzdFJvdyAmJiByaWdodE9mZnNldCA8IGl4ICsgaXdpZHRoLzIpKSB7Ci0JCQkJCWRyYXdDbGlwSW1hZ2UoZ2MsIGltYWdlLCBpeCwgaXksIHJlcGFpbnRSZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJQ29sb3Igc2F2ZWRCZyA9IGdjLmdldEJhY2tncm91bmQoKTsKLQkJCQkJZ2Muc2V0QmFja2dyb3VuZChzZWxEYXRhLmJnKTsKLQkJCQkJaW50IHN4ID0gaXg7Ci0JCQkJCWludCBzeSA9IGl5OwotCQkJCQlpZiAocmVwYWludFJlZ2lvbiE9bnVsbCkgewotCQkJCQkJc3ggLT0gcmVwYWludFJlZ2lvbi54OwotCQkJCQkJc3kgLT0gcmVwYWludFJlZ2lvbi55OwotCQkJCQl9Ci0JCQkJCWdjLmZpbGxSZWN0YW5nbGUoc3gsIHN5LCBpd2lkdGgsIGloZWlnaHQpOwotCQkJCQlJbWFnZSBzZWxJbWFnZSA9IGdldFNlbGVjdGVkSW1hZ2UocmVzb3VyY2VUYWJsZSwgc2VsRGF0YSk7Ci0JCQkJCWdjLmRyYXdJbWFnZShzZWxJbWFnZSwgc3gsIHN5KTsKLQkJCQkJZ2Muc2V0QmFja2dyb3VuZChzYXZlZEJnKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJZHJhd0NsaXBJbWFnZShnYywgaW1hZ2UsIGl4LCBpeSwgcmVwYWludFJlZ2lvbik7Ci0JCX0gZWxzZQotCQkJZHJhd0NsaXBJbWFnZShnYywgaW1hZ2UsIGl4LCBpeSwgcmVwYWludFJlZ2lvbik7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaW50IGZ4ID0gYm91bmRzLng7Ci0JCQlpbnQgZnkgPSBib3VuZHMueTsKLQkJCWlmIChyZXBhaW50UmVnaW9uIT1udWxsKSB7Ci0JCQkJZnggLT0gcmVwYWludFJlZ2lvbi54OwotCQkJCWZ5IC09IHJlcGFpbnRSZWdpb24ueTsKLQkJCX0KLQkJCUNvbG9yIGZnID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChnYy5nZXRCYWNrZ3JvdW5kKCkpOwotCQkJLy8gQ2xlYW4gdXAgdG8gYXZvaWQgY2FuY2VsaW5nIG91dCBYT1IgaWYgaXQgaXMgYWxyZWFkeQotCQkJLy8gc2VsZWN0ZWQuCi0JCQlnYy5kcmF3UmVjdGFuZ2xlKGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLndpZHRoIC0gMSwKLQkJCQkJYm91bmRzLmhlaWdodCAtIDEpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChmZyk7Ci0JCQlnYy5kcmF3Rm9jdXMoZngsIGZ5LCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBkcmF3Q2xpcEltYWdlKEdDIGdjLCBJbWFnZSBpbWFnZSwgaW50IGl4LCBpbnQgaXksIFJlY3RhbmdsZSByZXBhaW50UmVnaW9uKSB7Ci0JCWlmIChyZXBhaW50UmVnaW9uIT1udWxsKSB7Ci0JCQlpeCAtPSByZXBhaW50UmVnaW9uLng7Ci0JCQlpeSAtPSByZXBhaW50UmVnaW9uLnk7Ci0JCX0KLQkJZ2MuZHJhd0ltYWdlKGltYWdlLCBpeCwgaXkpOwkJCQotCX0KLQotCXByb3RlY3RlZCBQb2ludCBnZXRPYmplY3RTaXplKEhhc2h0YWJsZSByZXNvdXJjZVRhYmxlLCBpbnQgd0hpbnQpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZShyZXNvdXJjZVRhYmxlKTsKLQkJaWYgKGltYWdlPT1udWxsKQotCQkJcmV0dXJuIG5ldyBQb2ludCgwLCAwKTsKLQkJUmVjdGFuZ2xlIGlib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJcmV0dXJuIG5ldyBQb2ludChpYm91bmRzLndpZHRoLCBpYm91bmRzLmhlaWdodCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9Mb2NhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0xvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcyZWQwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL0xvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIExvY2F0b3IgaW1wbGVtZW50cyBDbG9uZWFibGUgeyAKLQlwdWJsaWMgaW50IGluZGVudDsKLQlwdWJsaWMgaW50IHgsIHk7Ci0JcHVibGljIGludCB3aWR0aDsKLQlwdWJsaWMgaW50IGxlYWRpbmc7Ci0JcHVibGljIGludCByb3dIZWlnaHQ7Ci0JcHVibGljIGludCBtYXJnaW5XaWR0aDsKLQlwdWJsaWMgaW50IG1hcmdpbkhlaWdodDsKLQlwdWJsaWMgaW50IHJvd0NvdW50ZXI7Ci0JcHVibGljIEFycmF5TGlzdCBoZWlnaHRzOwotCQotCXB1YmxpYyB2b2lkIG5ld0xpbmUoKSB7Ci0JCXJlc2V0Q2FyZXQoKTsKLQkJeSArPSByb3dIZWlnaHQ7Ci0JCXJvd0hlaWdodCA9IDA7Ci0JfQotCi0JcHVibGljIExvY2F0b3IgY3JlYXRlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChMb2NhdG9yKWNsb25lKCk7Ci0JCX0KLQkJY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIGNvbGxlY3RIZWlnaHRzKCkgewotCQloZWlnaHRzLmFkZChuZXcgaW50IFtdIHsgcm93SGVpZ2h0LCBsZWFkaW5nfSApOwotCQlyb3dDb3VudGVyKys7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoaW50IHNlZ21lbnRIZWlnaHQpIHsKLQkJcmV0dXJuIGdldEJhc2VsaW5lKHNlZ21lbnRIZWlnaHQsIHRydWUpOwotCi0JfQotCXB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoaW50IHNlZ21lbnRIZWlnaHQsIGJvb2xlYW4gdGV4dCkgewotCQlpZiAoaGVpZ2h0cyE9bnVsbCAmJiBoZWlnaHRzLnNpemUoKT5yb3dDb3VudGVyKSB7Ci0JCQlpbnQgW10gcmRhdGEgPSAoaW50W10paGVpZ2h0cy5nZXQocm93Q291bnRlcik7Ci0JCQlpbnQgcmhlaWdodCA9IHJkYXRhWzBdOwotCQkJaW50IHJsZWFkaW5nID0gcmRhdGFbMV07Ci0JCQlpZiAodGV4dCkKLQkJCQlyZXR1cm4geSArIHJoZWlnaHQgLSBzZWdtZW50SGVpZ2h0IC0gcmxlYWRpbmc7Ci0JCQlyZXR1cm4geSArIHJoZWlnaHQgLSBzZWdtZW50SGVpZ2h0OwotCQl9Ci0JCXJldHVybiB5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNldENhcmV0KCkgewotCQl4ID0gZ2V0U3RhcnRYKCk7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRYKCkgewotCQlyZXR1cm4gbWFyZ2luV2lkdGggKyBpbmRlbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9PYmplY3RTZWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL09iamVjdFNlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3ZDg4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL09iamVjdFNlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPYmplY3RTZWdtZW50IGV4dGVuZHMgUGFyYWdyYXBoU2VnbWVudCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JRERMRSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT00gPSAzOwotCi0JcHJpdmF0ZSBpbnQgYWxpZ25tZW50ID0gQk9UVE9NOwotCXByaXZhdGUgYm9vbGVhbiBub3dyYXA9ZmFsc2U7Ci0JcHJpdmF0ZSBSZWN0YW5nbGUgYm91bmRzOwotCXByaXZhdGUgU3RyaW5nIG9iamVjdElkOwotCi0JcHVibGljIGludCBnZXRWZXJ0aWNhbEFsaWdubWVudCgpIHsKLQkJcmV0dXJuIGFsaWdubWVudDsKLQl9Ci0KLQl2b2lkIHNldFZlcnRpY2FsQWxpZ25tZW50KGludCBhbGlnbm1lbnQpIHsKLQkJdGhpcy5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RJZCgpIHsKLQkJcmV0dXJuIG9iamVjdElkOwotCX0KLQotCXZvaWQgc2V0T2JqZWN0SWQoU3RyaW5nIG9iamVjdElkKSB7Ci0JCXRoaXMub2JqZWN0SWQgPSBvYmplY3RJZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFBvaW50IGdldE9iamVjdFNpemUoSGFzaHRhYmxlIHJlc291cmNlVGFibGUsIGludCB3SGludCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZHZhbmNlTG9jYXRvcihHQyBnYywgaW50IHdIaW50LCBMb2NhdG9yIGxvYywKLQkJCUhhc2h0YWJsZSBvYmplY3RUYWJsZSwgYm9vbGVhbiBjb21wdXRlSGVpZ2h0T25seSkgewotCQlQb2ludCBvYmplY3RTaXplID0gZ2V0T2JqZWN0U2l6ZShvYmplY3RUYWJsZSwgd0hpbnQpOwotCQlpbnQgaXdpZHRoID0gMDsKLQkJaW50IGloZWlnaHQgPSAwOwotCQlib29sZWFuIG5ld0xpbmUgPSBmYWxzZTsKLQotCQlpZiAob2JqZWN0U2l6ZSAhPSBudWxsKSB7Ci0JCQlpd2lkdGggPSBvYmplY3RTaXplLnggKyAoaXNTZWxlY3RhYmxlKCk/MjowKTsKLQkJCWloZWlnaHQgPSBvYmplY3RTaXplLnkgKyAoaXNTZWxlY3RhYmxlKCk/MjowKTsKLQkJfQotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQgJiYgIW5vd3JhcCAmJiBsb2MueCArIGl3aWR0aCA+IHdIaW50KSB7Ci0JCQkvLyBuZXcgbGluZQotCQkJaWYgKGNvbXB1dGVIZWlnaHRPbmx5KQotCQkJCWxvYy5jb2xsZWN0SGVpZ2h0cygpOwotCQkJbG9jLnggPSBsb2MuaW5kZW50OwotCQkJbG9jLnggKz0gaXdpZHRoOwotCQkJbG9jLnkgKz0gbG9jLnJvd0hlaWdodDsKLQkJCWxvYy53aWR0aCA9IGxvYy5pbmRlbnQgKyBpd2lkdGg7Ci0JCQlsb2Mucm93SGVpZ2h0ID0gaWhlaWdodDsKLQkJCWxvYy5sZWFkaW5nID0gMDsKLQkJCW5ld0xpbmUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJbG9jLnggKz0gaXdpZHRoOwotCQkJbG9jLndpZHRoICs9IGl3aWR0aDsKLQkJCWxvYy5yb3dIZWlnaHQgPSBNYXRoLm1heChsb2Mucm93SGVpZ2h0LCBpaGVpZ2h0KTsKLQkJfQotCQlyZXR1cm4gbmV3TGluZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgeCwgaW50IHkpIHsKLQkJaWYgKGJvdW5kcz09bnVsbCkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBib3VuZHMuY29udGFpbnMoeCwgeSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoUmVjdGFuZ2xlIHJlY3QpIHsKLQkJaWYgKGJvdW5kcz09bnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGJvdW5kcy5pbnRlcnNlY3RzKHJlY3QpOwotCX0KLQotCXB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgewotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5vd3JhcC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vd3JhcCgpIHsKLQkJcmV0dXJuIG5vd3JhcDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIG5vd3JhcCBUaGUgbm93cmFwIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3dyYXAoYm9vbGVhbiBub3dyYXApIHsKLQkJdGhpcy5ub3dyYXAgPSBub3dyYXA7Ci0JfQotCXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBib29sZWFuIGhvdmVyLCBIYXNodGFibGUgcmVzb3VyY2VUYWJsZSwgYm9vbGVhbiBzZWxlY3RlZCwgU2VsZWN0aW9uRGF0YSBzZWxEYXRhLCBSZWN0YW5nbGUgcmVwYWludFJlZ2lvbikgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuUGFyYWdyYXBoU2VnbWVudCNsYXlvdXQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuTG9jYXRvciwgamF2YS51dGlsLkhhc2h0YWJsZSwgYm9vbGVhbiwgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5TZWxlY3Rpb25EYXRhKQotCSAqLwotCXB1YmxpYyB2b2lkIGxheW91dChHQyBnYywgaW50IHdpZHRoLCBMb2NhdG9yIGxvYywgSGFzaHRhYmxlIHJlc291cmNlVGFibGUsCi0JCQlib29sZWFuIHNlbGVjdGVkKSB7Ci0JCVBvaW50IHNpemUgPSBnZXRPYmplY3RTaXplKHJlc291cmNlVGFibGUsIHdpZHRoKTsKLQotCQlpbnQgb2JqV2lkdGggPSAwOwotCQlpbnQgb2JqSGVpZ2h0ID0gMDsKLQkJaWYgKHNpemUgIT0gbnVsbCkgewotCQkJb2JqV2lkdGggPSBzaXplLnggKyAoaXNTZWxlY3RhYmxlKCk/MjowKTsKLQkJCW9iakhlaWdodCA9IHNpemUueSArIChpc1NlbGVjdGFibGUoKT8yOjApOwotCQl9IGVsc2UKLQkJCXJldHVybjsKLQkJbG9jLndpZHRoID0gb2JqV2lkdGg7Ci0KLQkJaWYgKCFub3dyYXAgJiYgbG9jLnggKyBvYmpXaWR0aCA+IHdpZHRoKSB7Ci0JCQkvLyBuZXcgcm93Ci0JCQlsb2MubmV3TGluZSgpOwotCQkJbG9jLnJvd0NvdW50ZXIrKzsKLQkJfQotCQkvL1RPRE8gdmVydGljYWwgYWxpZ25tZW50IGlzIG5vdCB1c2VkCi0JCWludCBpeCA9IGxvYy54OwotCQlpbnQgaXkgPSBsb2MuZ2V0QmFzZWxpbmUob2JqSGVpZ2h0LCBmYWxzZSk7Ci0JCWxvYy54ICs9IG9ialdpZHRoOwotCQlsb2Mucm93SGVpZ2h0ID0gTWF0aC5tYXgobG9jLnJvd0hlaWdodCwgb2JqSGVpZ2h0KTsKLQkJYm91bmRzID0gbmV3IFJlY3RhbmdsZShpeCwgaXksIG9ialdpZHRoLCBvYmpIZWlnaHQpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzLlBhcmFncmFwaFNlZ21lbnQjY29tcHV0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsIGphdmEudXRpbC5IYXNodGFibGUsIGJvb2xlYW4sIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuU2VsZWN0aW9uRGF0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlU2VsZWN0aW9uKEdDIGdjLCBIYXNodGFibGUgcmVzb3VyY2VUYWJsZSwgU2VsZWN0aW9uRGF0YSBzZWxEYXRhKSB7Ci0JCS8vIFRPRE8gd2Ugc2hvdWxkIGFkZCB0aGlzIHRvIHRoZSBzZWxlY3Rpb24gCi0JCS8vIGlmIHdlIHdhbnQgdG8gc3VwcG9ydCByaWNoIHRleHQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL1BhcmFncmFwaC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9QYXJhZ3JhcGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhNjYxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL1BhcmFncmFwaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkh5cGVybGlua1NldHRpbmdzOwotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgUGFyYWdyYXBoIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQID0gImh0dHA6Ly8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFZlY3RvciBzZWdtZW50czsKLQotCXByaXZhdGUgYm9vbGVhbiBhZGRWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQotCXB1YmxpYyBQYXJhZ3JhcGgoYm9vbGVhbiBhZGRWZXJ0aWNhbFNwYWNlKSB7Ci0JCXRoaXMuYWRkVmVydGljYWxTcGFjZSA9IGFkZFZlcnRpY2FsU3BhY2U7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbmRlbnQoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEFkZFZlcnRpY2FsU3BhY2UoKSB7Ci0JCXJldHVybiBhZGRWZXJ0aWNhbFNwYWNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUGFyYWdyYXBoI2dldFNlZ21lbnRzKCkKLQkgKi8KLQlwdWJsaWMgUGFyYWdyYXBoU2VnbWVudFtdIGdldFNlZ21lbnRzKCkgewotCQlpZiAoc2VnbWVudHMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgUGFyYWdyYXBoU2VnbWVudFswXTsKLQkJcmV0dXJuIChQYXJhZ3JhcGhTZWdtZW50W10pIHNlZ21lbnRzCi0JCQkJLnRvQXJyYXkobmV3IFBhcmFncmFwaFNlZ21lbnRbc2VnbWVudHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU2VnbWVudChQYXJhZ3JhcGhTZWdtZW50IHNlZ21lbnQpIHsKLQkJaWYgKHNlZ21lbnRzID09IG51bGwpCi0JCQlzZWdtZW50cyA9IG5ldyBWZWN0b3IoKTsKLQkJc2VnbWVudHMuYWRkKHNlZ21lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhcnNlUmVndWxhclRleHQoU3RyaW5nIHRleHQsIGJvb2xlYW4gZXhwYW5kVVJMcywKLQkJCUh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzLCBTdHJpbmcgZm9udElkKSB7Ci0JCXBhcnNlUmVndWxhclRleHQodGV4dCwgZXhwYW5kVVJMcywgc2V0dGluZ3MsIGZvbnRJZCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGFyc2VSZWd1bGFyVGV4dChTdHJpbmcgdGV4dCwgYm9vbGVhbiBleHBhbmRVUkxzLAotCQkJSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3MsIFN0cmluZyBmb250SWQsIFN0cmluZyBjb2xvcklkKSB7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCWlmIChleHBhbmRVUkxzKSB7Ci0JCQlpbnQgbG9jID0gdGV4dC5pbmRleE9mKEhUVFApOwotCi0JCQlpZiAobG9jID09IC0xKQotCQkJCWFkZFNlZ21lbnQobmV3IFRleHRTZWdtZW50KHRleHQsIGZvbnRJZCwgY29sb3JJZCkpOwotCQkJZWxzZSB7Ci0JCQkJaW50IHRleHRMb2MgPSAwOwotCQkJCXdoaWxlIChsb2MgIT0gLTEpIHsKLQkJCQkJYWRkU2VnbWVudChuZXcgVGV4dFNlZ21lbnQodGV4dC5zdWJzdHJpbmcodGV4dExvYywgbG9jKSwKLQkJCQkJCQlmb250SWQsIGNvbG9ySWQpKTsKLQkJCQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQkJCQlmb3IgKHRleHRMb2MgPSBsb2M7IHRleHRMb2MgPCB0ZXh0Lmxlbmd0aCgpOyB0ZXh0TG9jKyspIHsKLQkJCQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KHRleHRMb2MpOwotCQkJCQkJaWYgKENoYXJhY3Rlci5pc1NwYWNlQ2hhcihjKSkgewotCQkJCQkJCWFkZEh5cGVybGlua1NlZ21lbnQodGV4dC5zdWJzdHJpbmcobG9jLCB0ZXh0TG9jKSwKLQkJCQkJCQkJCXNldHRpbmdzLCBmb250SWQpOwotCQkJCQkJCWFkZGVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWFkZGVkKSB7Ci0JCQkJCQkvLyB0aGVyZSB3YXMgbm8gc3BhY2UgLSBqdXN0IGVuZCBvZiB0ZXh0Ci0JCQkJCQlhZGRIeXBlcmxpbmtTZWdtZW50KHRleHQuc3Vic3RyaW5nKGxvYyksIHNldHRpbmdzLAotCQkJCQkJCQlmb250SWQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJbG9jID0gdGV4dC5pbmRleE9mKEhUVFAsIHRleHRMb2MpOwotCQkJCX0KLQkJCQlpZiAodGV4dExvYyA8IHRleHQubGVuZ3RoKCkpIHsKLQkJCQkJYWRkU2VnbWVudChuZXcgVGV4dFNlZ21lbnQodGV4dC5zdWJzdHJpbmcodGV4dExvYyksIGZvbnRJZCwKLQkJCQkJCQljb2xvcklkKSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJYWRkU2VnbWVudChuZXcgVGV4dFNlZ21lbnQodGV4dCwgZm9udElkLCBjb2xvcklkKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSHlwZXJsaW5rU2VnbWVudChTdHJpbmcgdGV4dCwgSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3MsCi0JCQlTdHJpbmcgZm9udElkKSB7Ci0JCVRleHRIeXBlcmxpbmtTZWdtZW50IGhzID0gbmV3IFRleHRIeXBlcmxpbmtTZWdtZW50KHRleHQsIHNldHRpbmdzLAotCQkJCWZvbnRJZCk7Ci0JCWhzLnNldFdvcmRXcmFwQWxsb3dlZChmYWxzZSk7Ci0JCWhzLnNldEhyZWYodGV4dCk7Ci0JCWFkZFNlZ21lbnQoaHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbXB1dGVSb3dIZWlnaHRzKEdDIGdjLCBpbnQgd2lkdGgsIExvY2F0b3IgbG9jLAotCQkJaW50IGxpbmVIZWlnaHQsIEhhc2h0YWJsZSByZXNvdXJjZVRhYmxlKSB7Ci0JCVBhcmFncmFwaFNlZ21lbnRbXSBzZWdtZW50cyA9IGdldFNlZ21lbnRzKCk7Ci0JCS8vIGNvbXB1dGUgaGVpZ2h0cwotCQlMb2NhdG9yIGhsb2MgPSBsb2MuY3JlYXRlKCk7Ci0JCUFycmF5TGlzdCBoZWlnaHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlobG9jLmhlaWdodHMgPSBoZWlnaHRzOwotCQlobG9jLnJvd0NvdW50ZXIgPSAwOwotCQlpbnQgaW5uZXJXaWR0aCA9IHdpZHRoIC0gbG9jLm1hcmdpbldpZHRoKjI7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgc2VnbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCA9IHNlZ21lbnRzW2pdOwotCQkJc2VnbWVudC5hZHZhbmNlTG9jYXRvcihnYywgaW5uZXJXaWR0aCwgaGxvYywgcmVzb3VyY2VUYWJsZSwgdHJ1ZSk7Ci0JCX0KLQkJaGxvYy5jb2xsZWN0SGVpZ2h0cygpOwotCQlsb2MuaGVpZ2h0cyA9IGhlaWdodHM7Ci0JCWxvYy5yb3dDb3VudGVyID0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsYXlvdXQoR0MgZ2MsIGludCB3aWR0aCwgTG9jYXRvciBsb2MsIGludCBsaW5lSGVpZ2h0LAotCQkJSGFzaHRhYmxlIHJlc291cmNlVGFibGUsIElIeXBlcmxpbmtTZWdtZW50IHNlbGVjdGVkTGluaykgewotCQlQYXJhZ3JhcGhTZWdtZW50W10gc2VnbWVudHMgPSBnZXRTZWdtZW50cygpOwotCQkvL2ludCBoZWlnaHQ7Ci0JCWlmIChzZWdtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkvKgotCQkJaWYgKHNlZ21lbnRzWzBdIGluc3RhbmNlb2YgVGV4dFNlZ21lbnQKLQkJCQkJJiYgKChUZXh0U2VnbWVudCkgc2VnbWVudHNbMF0pLmlzU2VsZWN0YWJsZSgpKQotCQkJCWxvYy54ICs9IDE7Ci0JCQkqLwotCQkJLy8gY29tcHV0ZSBoZWlnaHRzCi0JCQlpZiAobG9jLmhlaWdodHMgPT0gbnVsbCkKLQkJCQljb21wdXRlUm93SGVpZ2h0cyhnYywgd2lkdGgsIGxvYywgbGluZUhlaWdodCwgcmVzb3VyY2VUYWJsZSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNlZ21lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50ID0gc2VnbWVudHNbal07Ci0JCQkJYm9vbGVhbiBkb1NlbGVjdCA9IGZhbHNlOwotCQkJCWlmIChzZWxlY3RlZExpbmsgIT0gbnVsbCAmJiBzZWdtZW50LmVxdWFscyhzZWxlY3RlZExpbmspKQotCQkJCQlkb1NlbGVjdCA9IHRydWU7Ci0JCQkJc2VnbWVudC5sYXlvdXQoZ2MsIHdpZHRoLCBsb2MsIHJlc291cmNlVGFibGUsIGRvU2VsZWN0KTsKLQkJCX0KLQkJCWxvYy5oZWlnaHRzID0gbnVsbDsKLQkJCWxvYy55ICs9IGxvYy5yb3dIZWlnaHQ7Ci0JCX0gZWxzZSB7Ci0JCQlsb2MueSArPSBsaW5lSGVpZ2h0OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIFJlY3RhbmdsZSByZXBhaW50UmVnaW9uLAotCQkJSGFzaHRhYmxlIHJlc291cmNlVGFibGUsIElIeXBlcmxpbmtTZWdtZW50IHNlbGVjdGVkTGluaywKLQkJCVNlbGVjdGlvbkRhdGEgc2VsRGF0YSkgewotCQlQYXJhZ3JhcGhTZWdtZW50W10gc2VnbWVudHMgPSBnZXRTZWdtZW50cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCA9IHNlZ21lbnRzW2ldOwotCQkJaWYgKCFzZWdtZW50LmludGVyc2VjdHMocmVwYWludFJlZ2lvbikpCi0JCQkJY29udGludWU7Ci0JCQlib29sZWFuIGRvU2VsZWN0ID0gZmFsc2U7Ci0JCQlpZiAoc2VsZWN0ZWRMaW5rICE9IG51bGwgJiYgc2VnbWVudC5lcXVhbHMoc2VsZWN0ZWRMaW5rKSkKLQkJCQlkb1NlbGVjdCA9IHRydWU7Ci0JCQlzZWdtZW50LnBhaW50KGdjLCBmYWxzZSwgcmVzb3VyY2VUYWJsZSwgZG9TZWxlY3QsIHNlbERhdGEsIHJlcGFpbnRSZWdpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbXB1dGVTZWxlY3Rpb24oR0MgZ2MsCUhhc2h0YWJsZSByZXNvdXJjZVRhYmxlLCBJSHlwZXJsaW5rU2VnbWVudCBzZWxlY3RlZExpbmssCi0JCQlTZWxlY3Rpb25EYXRhIHNlbERhdGEpIHsKLQkJUGFyYWdyYXBoU2VnbWVudFtdIHNlZ21lbnRzID0gZ2V0U2VnbWVudHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlQYXJhZ3JhcGhTZWdtZW50IHNlZ21lbnQgPSBzZWdtZW50c1tpXTsKLQkJCS8vYm9vbGVhbiBkb1NlbGVjdCA9IGZhbHNlOwotCQkJLy9pZiAoc2VsZWN0ZWRMaW5rICE9IG51bGwgJiYgc2VnbWVudC5lcXVhbHMoc2VsZWN0ZWRMaW5rKSkKLQkJCQkvL2RvU2VsZWN0ID0gdHJ1ZTsKLQkJCXNlZ21lbnQuY29tcHV0ZVNlbGVjdGlvbihnYywgcmVzb3VyY2VUYWJsZSwgc2VsRGF0YSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc2libGVUZXh0KCkgewotCQlQYXJhZ3JhcGhTZWdtZW50W10gc2VnbWVudHMgPSBnZXRTZWdtZW50cygpOwotCQlTdHJpbmdXcml0ZXIgc3dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN3cml0ZXIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlQYXJhZ3JhcGhTZWdtZW50IHNlZ21lbnQgPSBzZWdtZW50c1tpXTsKLQkJCWlmIChzZWdtZW50IGluc3RhbmNlb2YgVGV4dFNlZ21lbnQpIHsKLQkJCQlTdHJpbmcgdGV4dCA9ICgoVGV4dFNlZ21lbnQpIHNlZ21lbnQpLmdldFRleHQoKTsKLQkJCQl3cml0ZXIucHJpbnQodGV4dCk7Ci0JCQl9Ci0JCX0KLQkJd3JpdGVyLnByaW50bG4oKTsKLQkJc3dyaXRlci5mbHVzaCgpOwotCQlyZXR1cm4gc3dyaXRlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBQYXJhZ3JhcGhTZWdtZW50IGZpbmRTZWdtZW50QXQoaW50IHgsIGludCB5KSB7Ci0JCWlmIChzZWdtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50ID0gKFBhcmFncmFwaFNlZ21lbnQpIHNlZ21lbnRzLmdldChpKTsKLQkJCQlpZiAoc2VnbWVudC5jb250YWlucyh4LCB5KSkKLQkJCQkJcmV0dXJuIHNlZ21lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoU3RyaW5nIGZvbnRJZCkgewotCQlpZiAoc2VnbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5zaXplKCk7IGkrKykgewotCQkJCVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCA9IChQYXJhZ3JhcGhTZWdtZW50KSBzZWdtZW50cy5nZXQoaSk7Ci0JCQkJc2VnbWVudC5jbGVhckNhY2hlKGZvbnRJZCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL1BhcmFncmFwaFNlZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvUGFyYWdyYXBoU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGRlZWVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvUGFyYWdyYXBoU2VnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBhcmFncmFwaFNlZ21lbnQgewotCS8qKgotCSAqIE1vdmVzIHRoZSBsb2NhdG9yIGFjY29yZGluZyB0byB0aGUgY29udGVudCBvZiB0aGlzIHNlZ21lbnQuCi0JICogQHBhcmFtIGdjCi0JICogQHBhcmFtIHdIaW50Ci0JICogQHBhcmFtIGxvYwotCSAqIEBwYXJhbSBvYmplY3RUYWJsZQotCSAqIEBwYXJhbSBjb21wdXRlSGVpZ2h0T25seQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhZHZhbmNlTG9jYXRvcihHQyBnYywgaW50IHdIaW50LCBMb2NhdG9yIGxvYywgSGFzaHRhYmxlIG9iamVjdFRhYmxlLCBib29sZWFuIGNvbXB1dGVIZWlnaHRPbmx5KTsKLQkvKioKLQkgKiBDb21wdXRlcyBib3VuZGluZyByZWN0YW5nbGVzIGFuZCByb3cgaGVpZ2h0cyBvZiB0aGlzIHNlZ21lbnRzLgotCSAqIEBwYXJhbSBnYwotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEBwYXJhbSBsb2MKLQkgKiBAcGFyYW0gcmVzb3VyY2VUYWJsZQotCSAqIEBwYXJhbSBzZWxlY3RlZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxheW91dChHQyBnYywgaW50IHdpZHRoLCBMb2NhdG9yIGxvYywgSGFzaHRhYmxlIHJlc291cmNlVGFibGUsIGJvb2xlYW4gc2VsZWN0ZWQpOwotCS8qKgotCSAqIFBhaW50cyB0aGlzIHNlZ21lbnQuCi0JICogQHBhcmFtIGdjCi0JICogQHBhcmFtIGhvdmVyCi0JICogQHBhcmFtIHJlc291cmNlVGFibGUKLQkgKiBAcGFyYW0gc2VsZWN0ZWQKLQkgKiBAcGFyYW0gc2VsRGF0YQotCSAqIEBwYXJhbSByZWdpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwYWludChHQyBnYywgYm9vbGVhbiBob3ZlciwgSGFzaHRhYmxlIHJlc291cmNlVGFibGUsIGJvb2xlYW4gc2VsZWN0ZWQsIFNlbGVjdGlvbkRhdGEgc2VsRGF0YSwgUmVjdGFuZ2xlIHJlZ2lvbik7Ci0JLyoqCi0JICogUGFpbnRzIHRoaXMgc2VnbWVudC4KLQkgKiBAcGFyYW0gZ2MKLQkgKiBAcGFyYW0gcmVzb3VyY2VUYWJsZQotCSAqIEBwYXJhbSBzZWxlY3RlZAotCSAqIEBwYXJhbSBzZWxEYXRhCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY29tcHV0ZVNlbGVjdGlvbihHQyBnYywgSGFzaHRhYmxlIHJlc291cmNlVGFibGUsIFNlbGVjdGlvbkRhdGEgc2VsRGF0YSk7CQotCS8qKgotCSAqIFRlc3RzIGlmIHRoZSBjb29yZGluYXRlcyBhcmUgY29udGFpbmVkIGluIG9uZSBvZiB0aGUKLQkgKiBib3VuZGluZyByZWN0YW5nbGVzIG9mIHRoaXMgc2VnbWVudC4KLQkgKiBAcGFyYW0geAotCSAqIEBwYXJhbSB5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbnRhaW5zKGludCB4LCBpbnQgeSk7Ci0JLyoqCi0JICogVGVzdHMgaWYgdGhlIHNvdXJjZSByZWN0YW5nbGUgaW50ZXJzZWN0cyB3aXRoCi0JICogb25lIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGVzIG9mIHRoaXMgc2VnbWVudC4KLQkgKiBAcGFyYW0gcmVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpbnRlcnNlY3RzKFJlY3RhbmdsZSByZWN0KTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b29sIHRpcCBvZiB0aGlzIHNlZ21lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub3QgZGVmaW5lZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sdGlwVGV4dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBmb250SWQgVE9ETwotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoU3RyaW5nIGZvbnRJZCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvUGl4ZWxDb252ZXJ0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvUGl4ZWxDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3ZmIzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL1BpeGVsQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotcHVibGljIGNsYXNzIFBpeGVsQ29udmVydGVyIHsKLQkvKioKLQkgKiBOdW1iZXIgb2YgaG9yaXpvbnRhbCBkaWFsb2cgdW5pdHMgcGVyIGNoYXJhY3RlciwgdmFsdWUgPGNvZGU+NDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhPUklaT05UQUxfRElBTE9HX1VOSVRfUEVSX0NIQVIgPSA0OwotCi0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0KLQlwdWJsaWMgUGl4ZWxDb252ZXJ0ZXIoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJZkZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nUGFnZSNjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscwotCSAqLwotCXB1YmxpYyBpbnQgY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoaW50IGRsdXMpIHsKLQkJLy8gcm91bmQgdG8gdGhlIG5lYXJlc3QgcGl4ZWwKLQkJcmV0dXJuIChmRm9udE1ldHJpY3MuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpICogZGx1cyArIEhPUklaT05UQUxfRElBTE9HX1VOSVRfUEVSX0NIQVIgLyAyKQotCQkJCS8gSE9SSVpPTlRBTF9ESUFMT0dfVU5JVF9QRVJfQ0hBUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL1NXVFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGNlNTcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvU1dUVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYXJldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gc2ltcGxpZnkgYWNjZXNzIHRvIHNvbWUgU1dUIHJlc291cmNlcy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmCi0JICogdGhlIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc2FwbHkuIElmIHNvLCB0aGlzCi0JICogZGlzcGxheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRTdGFuZGFyZERpc3BsYXkoKSB7Ci0JCURpc3BsYXkgZGlzcGxheTsKLQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gZGlzcGxheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGVsbCBmb3IgdGhlIGdpdmVuIHdpZGdldC4gSWYgdGhlIHdpZGdldCBkb2Vzbid0IHJlcHJlc2VudAotCSAqIGEgU1dUIG9iamVjdCB0aGF0IG1hbmFnZSBhIHNoZWxsLCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGVsbCBmb3IgdGhlIGdpdmVuIHdpZGdldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoV2lkZ2V0IHdpZGdldCkgewotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29udHJvbCkKLQkJCXJldHVybiAoKENvbnRyb2wpIHdpZGdldCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIENhcmV0KQotCQkJcmV0dXJuICgoQ2FyZXQpIHdpZGdldCkuZ2V0UGFyZW50KCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIERyYWdTb3VyY2UpCi0JCQlyZXR1cm4gKChEcmFnU291cmNlKSB3aWRnZXQpLmdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgRHJvcFRhcmdldCkKLQkJCXJldHVybiAoKERyb3BUYXJnZXQpIHdpZGdldCkuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBNZW51KQotCQkJcmV0dXJuICgoTWVudSkgd2lkZ2V0KS5nZXRQYXJlbnQoKS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgU2Nyb2xsQmFyKQotCQkJcmV0dXJuICgoU2Nyb2xsQmFyKSB3aWRnZXQpLmdldFBhcmVudCgpLmdldFNoZWxsKCk7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvU2VsZWN0aW9uRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9TZWxlY3Rpb25EYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3M2E2YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9TZWxlY3Rpb25EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotcHVibGljIGNsYXNzIFNlbGVjdGlvbkRhdGEgewotCXB1YmxpYyBEaXNwbGF5IGRpc3BsYXk7Ci0JcHVibGljIENvbG9yIGJnOwotCXB1YmxpYyBDb2xvciBmZzsKLQlwcml2YXRlIFBvaW50IHN0YXJ0OwotCXByaXZhdGUgUG9pbnQgc3RvcDsKLQlwcml2YXRlIEFycmF5TGlzdCBzZWdtZW50czsKLQlwcml2YXRlIGJvb2xlYW4gbmV3TGluZU5lZWRlZDsKLQkKLQlwdWJsaWMgU2VsZWN0aW9uRGF0YShNb3VzZUV2ZW50IGUpIHsKLQkJZGlzcGxheSA9IGUuZGlzcGxheTsKLQkJc2VnbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0YXJ0ID0gbmV3IFBvaW50KGUueCwgZS55KTsKLQkJc3RvcCA9IG5ldyBQb2ludChlLngsIGUueSk7Ci0JCWJnID0gZS5kaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTik7Ci0JCWZnID0gZS5kaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWFya05ld0xpbmUoKSB7Ci0JCW5ld0xpbmVOZWVkZWQ9dHJ1ZTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkU2VnbWVudChTdHJpbmcgdGV4dCkgewotCQlpZiAobmV3TGluZU5lZWRlZCkgewotCQkJc2VnbWVudHMuYWRkKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW5ld0xpbmVOZWVkZWQ9ZmFsc2U7Ci0JCX0KLQkJc2VnbWVudHMuYWRkKHRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShNb3VzZUV2ZW50IGUpIHsKLQkJLy9Db250cm9sIGMgPSAoQ29udHJvbCllLndpZGdldDsKLQkJc3RvcC54ID0gZS54OwotCQlzdG9wLnkgPSBlLnk7Ci0JfQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzZWdtZW50cy5jbGVhcigpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGlvblRleHQoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzZWdtZW50cy5zaXplKCk7IGkrKykgewotCQkJYnVmLmFwcGVuZCgoU3RyaW5nKXNlZ21lbnRzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db3B5KCkgewotCQlyZXR1cm4gc2VnbWVudHMuc2l6ZSgpPjA7Ci0JfQotCQotCXByaXZhdGUgaW50IGdldFRvcE9mZnNldCgpIHsKLQkJcmV0dXJuIHN0YXJ0Lnk8c3RvcC55P3N0YXJ0Lnk6c3RvcC55OwotCX0KLQlwcml2YXRlIGludCBnZXRCb3R0b21PZmZzZXQoKSB7Ci0JCXJldHVybiBzdGFydC55PnN0b3AueT9zdGFydC55OnN0b3AueTsKLQl9Ci0JcHVibGljIGludCBnZXRMZWZ0T2Zmc2V0KExvY2F0b3IgbG9jYXRvcikgewotCQlyZXR1cm4gaXNJbnZlcnRlZChsb2NhdG9yKT8gc3RvcC54OnN0YXJ0Lng7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0TGVmdE9mZnNldChpbnQgcm93SGVpZ2h0KSB7Ci0JCXJldHVybiBpc0ludmVydGVkKHJvd0hlaWdodCkgPyBzdG9wLng6c3RhcnQueDsKLQl9Ci0JcHVibGljIGludCBnZXRSaWdodE9mZnNldChMb2NhdG9yIGxvY2F0b3IpIHsKLQkJcmV0dXJuIGlzSW52ZXJ0ZWQobG9jYXRvcik/IHN0YXJ0Lng6IHN0b3AueDsKLQl9Ci0JcHVibGljIGludCBnZXRSaWdodE9mZnNldChpbnQgcm93SGVpZ2h0KSB7Ci0JCXJldHVybiBpc0ludmVydGVkKHJvd0hlaWdodCkgPyBzdGFydC54OnN0b3AueDsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGlzSW52ZXJ0ZWQoTG9jYXRvciBsb2NhdG9yKSB7Ci0JCWludCByb3dIZWlnaHQgPSAoKGludCBbXSlsb2NhdG9yLmhlaWdodHMuZ2V0KGxvY2F0b3Iucm93Q291bnRlcikpWzBdOwotCQlyZXR1cm4gaXNJbnZlcnRlZChyb3dIZWlnaHQpOwotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnZlcnRlZChpbnQgcm93SGVpZ2h0KSB7Ci0JCWludCBkZWx0YVkgPSBzdGFydC55IC0gc3RvcC55OwotCQlpZiAoTWF0aC5hYnMoZGVsdGFZKSA+IHJvd0hlaWdodCkgewotCQkJLy8gaW50ZXItcm93IHNlbGVjdGlvbgotCQkJcmV0dXJuIGRlbHRhWT4wOwotCQl9Ci0JCS8vIGludHJhLXJvdyBzZWxlY3Rpb24KLQkJcmV0dXJuIHN0YXJ0LnggPiBzdG9wLng7IAotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuY2xvc2VkKCkgewotCQlyZXR1cm4gIXN0YXJ0LmVxdWFscyhzdG9wKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkUm93KExvY2F0b3IgbG9jYXRvcikgewotCQlpZiAoIWlzRW5jbG9zZWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IHJvd0hlaWdodCA9ICgoaW50IFtdKWxvY2F0b3IuaGVpZ2h0cy5nZXQobG9jYXRvci5yb3dDb3VudGVyKSlbMF07Ci0JCXJldHVybiBpc1NlbGVjdGVkUm93KGxvY2F0b3IueSwgcm93SGVpZ2h0KTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZFJvdyhpbnQgeSwgaW50IHJvd0hlaWdodCkgewotCQlpZiAoIWlzRW5jbG9zZWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICh5ICsgcm93SGVpZ2h0ID49IGdldFRvcE9mZnNldCgpICYmCi0JCQkJeSA8PSBnZXRCb3R0b21PZmZzZXQoKSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRmlyc3RTZWxlY3Rpb25Sb3coTG9jYXRvciBsb2NhdG9yKSB7Ci0JCWlmICghaXNFbmNsb3NlZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgcm93SGVpZ2h0ID0gKChpbnQgW10pbG9jYXRvci5oZWlnaHRzLmdldChsb2NhdG9yLnJvd0NvdW50ZXIpKVswXTsKLQkJcmV0dXJuIChsb2NhdG9yLnkgKyByb3dIZWlnaHQgPj0gZ2V0VG9wT2Zmc2V0KCkgJiYKLQkJCQlsb2NhdG9yLnkgPD0gZ2V0VG9wT2Zmc2V0KCkpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0U2VsZWN0aW9uUm93KGludCB5LCBpbnQgcm93SGVpZ2h0KSB7Ci0JCWlmICghaXNFbmNsb3NlZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKHkgKyByb3dIZWlnaHQgPj0gZ2V0VG9wT2Zmc2V0KCkgJiYKLQkJCQl5IDw9IGdldFRvcE9mZnNldCgpKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNMYXN0U2VsZWN0aW9uUm93KExvY2F0b3IgbG9jYXRvcikgewotCQlpZiAoIWlzRW5jbG9zZWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IHJvd0hlaWdodCA9ICgoaW50IFtdKWxvY2F0b3IuaGVpZ2h0cy5nZXQobG9jYXRvci5yb3dDb3VudGVyKSlbMF07Ci0JCXJldHVybiAobG9jYXRvci55ICsgcm93SGVpZ2h0ID49Z2V0Qm90dG9tT2Zmc2V0KCkgJiYgCi0JCQkJbG9jYXRvci55IDw9IGdldEJvdHRvbU9mZnNldCgpKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNMYXN0U2VsZWN0aW9uUm93KGludCB5LCBpbnQgcm93SGVpZ2h0KSB7Ci0JCWlmICghaXNFbmNsb3NlZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKHkgKyByb3dIZWlnaHQgPj1nZXRCb3R0b21PZmZzZXQoKSAmJiAKLQkJCQl5IDw9IGdldEJvdHRvbU9mZnNldCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL1RleHRIeXBlcmxpbmtTZWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL1RleHRIeXBlcmxpbmtTZWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjI0ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9UZXh0SHlwZXJsaW5rU2VnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSHlwZXJsaW5rU2V0dGluZ3M7Ci0KLS8qKgotICogQHZlcnNpb24gMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0SHlwZXJsaW5rU2VnbWVudCBleHRlbmRzIFRleHRTZWdtZW50IGltcGxlbWVudHMKLQkJSUh5cGVybGlua1NlZ21lbnQgewotCXByaXZhdGUgU3RyaW5nIGhyZWY7Ci0KLQlwcml2YXRlIFN0cmluZyB0b29sdGlwVGV4dDsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfRkcgPSAiYy5fX19saW5rX2ZnIjsKLQotCXByaXZhdGUgSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3M7Ci0KLQlwdWJsaWMgVGV4dEh5cGVybGlua1NlZ21lbnQoU3RyaW5nIHRleHQsIEh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzLAotCQkJU3RyaW5nIGZvbnRJZCkgewotCQlzdXBlcih0ZXh0LCBmb250SWQpOwotCQl0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7Ci0JCXVuZGVybGluZSA9IHNldHRpbmdzLmdldEh5cGVybGlua1VuZGVybGluZU1vZGUoKSA9PSBIeXBlcmxpbmtTZXR0aW5ncy5VTkRFUkxJTkVfQUxXQVlTOwotCX0KLQotCS8qCi0JICogQHNlZSBJT2JqZWN0UmVmZXJlbmNlI2dldE9iamVjdElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCXJldHVybiBocmVmOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpIHsKLQkJdGhpcy5ocmVmID0gaHJlZjsKLQl9Ci0KLQkvKgotCSAqIHB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIExvY2F0b3IgbG9jYXRvciwgSGFzaHRhYmxlCi0JICogcmVzb3VyY2VUYWJsZSwgYm9vbGVhbiBzZWxlY3RlZCwgU2VsZWN0aW9uRGF0YSBzZWxEYXRhKSB7Ci0JICogcmVzb3VyY2VUYWJsZS5wdXQoTElOS19GRywgc2V0dGluZ3MuZ2V0Rm9yZWdyb3VuZCgpKTsKLQkgKiBzZXRDb2xvcklkKExJTktfRkcpOyBzdXBlci5wYWludChnYywgd2lkdGgsIGxvY2F0b3IsIHJlc291cmNlVGFibGUsCi0JICogc2VsZWN0ZWQsIHNlbERhdGEpOyB9Ci0JICovCi0KLQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgYm9vbGVhbiBob3ZlciwgSGFzaHRhYmxlIHJlc291cmNlVGFibGUsCi0JCQlib29sZWFuIHNlbGVjdGVkLCBTZWxlY3Rpb25EYXRhIHNlbERhdGEsIFJlY3RhbmdsZSByZXBhaW50UmVnaW9uKSB7Ci0JCWJvb2xlYW4gcm9sbG92ZXJNb2RlID0gc2V0dGluZ3MuZ2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSgpID09IEh5cGVybGlua1NldHRpbmdzLlVOREVSTElORV9IT1ZFUjsKLQkJQ29sb3Igc2F2ZWRGZyA9IGdjLmdldEZvcmVncm91bmQoKTsKLQkJQ29sb3IgbmV3RmcgPSBob3ZlciA/IHNldHRpbmdzLmdldEFjdGl2ZUZvcmVncm91bmQoKSA6IHNldHRpbmdzCi0JCQkJLmdldEZvcmVncm91bmQoKTsKLQkJaWYgKG5ld0ZnIT1udWxsKQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChuZXdGZyk7IAotCQlzdXBlci5wYWludChnYywgaG92ZXIsIHJlc291cmNlVGFibGUsIHNlbGVjdGVkLCByb2xsb3Zlck1vZGUsIHNlbERhdGEsCi0JCQkJcmVwYWludFJlZ2lvbik7Ci0JCWdjLnNldEZvcmVncm91bmQoc2F2ZWRGZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUb29sdGlwVGV4dCgpIHsKLQkJcmV0dXJuIHRvb2x0aXBUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRvb2x0aXBUZXh0KFN0cmluZyB0b29sdGlwKSB7Ci0JCXRoaXMudG9vbHRpcFRleHQgPSB0b29sdGlwOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9jdXNTZWxlY3RhYmxlKEhhc2h0YWJsZSByZXNvdXJjZVRhYmxlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldEZvY3VzKEhhc2h0YWJsZSByZXNvdXJjZVRhYmxlLCBib29sZWFuIGRpcmVjdGlvbikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9UZXh0U2VnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9UZXh0U2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk0OTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvVGV4dFNlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudGV4dC5CcmVha0l0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIFRleHRTZWdtZW50IGV4dGVuZHMgUGFyYWdyYXBoU2VnbWVudCB7Ci0JcHJpdmF0ZSBTdHJpbmcgY29sb3JJZDsKLQotCXByaXZhdGUgU3RyaW5nIGZvbnRJZDsKLQotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlcmxpbmU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gd3JhcEFsbG93ZWQgPSB0cnVlOwotCi0JcHJvdGVjdGVkIFZlY3RvciBhcmVhUmVjdGFuZ2xlcyA9IG5ldyBWZWN0b3IoKTsKLQotCXByaXZhdGUgVGV4dEZyYWdtZW50W10gdGV4dEZyYWdtZW50czsKLQotCWNsYXNzIEFyZWFSZWN0YW5nbGUgewotCQlSZWN0YW5nbGUgcmVjdDsKLQotCQlpbnQgZnJvbSwgdG87Ci0KLQkJcHVibGljIEFyZWFSZWN0YW5nbGUoUmVjdGFuZ2xlIHJlY3QsIGludCBmcm9tLCBpbnQgdG8pIHsKLQkJCXRoaXMucmVjdCA9IHJlY3Q7Ci0JCQl0aGlzLmZyb20gPSBmcm9tOwotCQkJdGhpcy50byA9IHRvOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KSB7Ci0JCQlyZXR1cm4gcmVjdC5jb250YWlucyh4LCB5KTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoUmVjdGFuZ2xlIHJlZ2lvbikgewotCQkJcmV0dXJuIHJlY3QuaW50ZXJzZWN0cyhyZWdpb24pOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkJaWYgKGZyb20gPT0gMCAmJiB0byA9PSAtMSkKLQkJCQlyZXR1cm4gVGV4dFNlZ21lbnQudGhpcy5nZXRUZXh0KCk7Ci0JCQlpZiAoZnJvbSA+IDAgJiYgdG8gPT0gLTEpCi0JCQkJcmV0dXJuIFRleHRTZWdtZW50LnRoaXMuZ2V0VGV4dCgpLnN1YnN0cmluZyhmcm9tKTsKLQkJCXJldHVybiBUZXh0U2VnbWVudC50aGlzLmdldFRleHQoKS5zdWJzdHJpbmcoZnJvbSwgdG8pOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFNlbGVjdGlvblJhbmdlIHsKLQkJcHVibGljIGludCBzdGFydDsKLQotCQlwdWJsaWMgaW50IHN0b3A7Ci0KLQkJcHVibGljIFNlbGVjdGlvblJhbmdlKCkgewotCQkJcmVzZXQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkJc3RhcnQgPSAtMTsKLQkJCXN0b3AgPSAtMTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXh0RnJhZ21lbnQgewotCQlzaG9ydCBpbmRleDsKLQotCQlzaG9ydCBsZW5ndGg7Ci0KLQkJcHVibGljIFRleHRGcmFnbWVudChzaG9ydCBpbmRleCwgc2hvcnQgbGVuZ3RoKSB7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0U2VnbWVudChTdHJpbmcgdGV4dCwgU3RyaW5nIGZvbnRJZCkgewotCQl0aGlzKHRleHQsIGZvbnRJZCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFRleHRTZWdtZW50KFN0cmluZyB0ZXh0LCBTdHJpbmcgZm9udElkLCBTdHJpbmcgY29sb3JJZCkgewotCQl0aGlzLnRleHQgPSBjbGVhbnVwKHRleHQpOwotCQl0aGlzLmZvbnRJZCA9IGZvbnRJZDsKLQkJdGhpcy5jb2xvcklkID0gY29sb3JJZDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjbGVhbnVwKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsKLQkJCWlmIChjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xmJykgewotCQkJCWlmIChpID4gMCkKLQkJCQkJYnVmLmFwcGVuZCgnICcpOwotCQkJfSBlbHNlCi0JCQkJYnVmLmFwcGVuZChjKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V29yZFdyYXBBbGxvd2VkKGJvb2xlYW4gdmFsdWUpIHsKLQkJd3JhcEFsbG93ZWQgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRXcmFwQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHdyYXBBbGxvd2VkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3JJZCgpIHsKLQkJcmV0dXJuIGNvbG9ySWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQl2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0ID0gY2xlYW51cCh0ZXh0KTsKLQkJdGV4dEZyYWdtZW50cyA9IG51bGw7Ci0JfQotCi0Jdm9pZCBzZXRDb2xvcklkKFN0cmluZyBjb2xvcklkKSB7Ci0JCXRoaXMuY29sb3JJZCA9IGNvbG9ySWQ7Ci0JfQotCi0Jdm9pZCBzZXRGb250SWQoU3RyaW5nIGZvbnRJZCkgewotCQl0aGlzLmZvbnRJZCA9IGZvbnRJZDsKLQkJdGV4dEZyYWdtZW50cyA9IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJlYVJlY3RhbmdsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUFyZWFSZWN0YW5nbGUgYXIgPSAoQXJlYVJlY3RhbmdsZSkgYXJlYVJlY3RhbmdsZXMuZ2V0KGkpOwotCQkJaWYgKGFyLmNvbnRhaW5zKHgsIHkpKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGk8YXJlYVJlY3RhbmdsZXMuc2l6ZSgpLTEpIHsKLQkJCQkvLyB0ZXN0IHRoZSBnYXAKLQkJCQlSZWN0YW5nbGUgdG9wID0gYXIucmVjdDsKLQkJCQlSZWN0YW5nbGUgYm90ID0gKChBcmVhUmVjdGFuZ2xlKWFyZWFSZWN0YW5nbGVzLmdldChpKzEpKS5yZWN0OwotCQkJCWlmICh5ID49IHRvcC55K3RvcC5oZWlnaHQgJiYgeSA8IGJvdC55KSB7Ci0JCQkJCS8vIGluIHRoZSBnYXAKLQkJCQkJaW50IGxlZnQgPSBNYXRoLm1heCh0b3AueCwgYm90LngpOwotCQkJCQlpbnQgcmlnaHQgPSBNYXRoLm1pbih0b3AueCt0b3Aud2lkdGgsIGJvdC54K2JvdC53aWR0aCk7Ci0JCQkJCWlmICh4Pj1sZWZ0ICYmIHg8PXJpZ2h0KSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhSZWN0YW5nbGUgcmVjdCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZWFSZWN0YW5nbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlBcmVhUmVjdGFuZ2xlIGFyID0gKEFyZWFSZWN0YW5nbGUpIGFyZWFSZWN0YW5nbGVzLmdldChpKTsKLQkJCWlmIChhci5pbnRlcnNlY3RzKHJlY3QpKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGk8YXJlYVJlY3RhbmdsZXMuc2l6ZSgpLTEpIHsKLQkJCQkvLyB0ZXN0IHRoZSBnYXAKLQkJCQlSZWN0YW5nbGUgdG9wID0gYXIucmVjdDsKLQkJCQlSZWN0YW5nbGUgYm90ID0gKChBcmVhUmVjdGFuZ2xlKWFyZWFSZWN0YW5nbGVzLmdldChpKzEpKS5yZWN0OwotCQkJCWlmICh0b3AueSt0b3AuaGVpZ2h0IDwgYm90LnkpIHsKLQkJCQkJaW50IHkgPSB0b3AueSt0b3AuaGVpZ2h0OwotCQkJCQlpbnQgaGVpZ2h0ID0gYm90LnkteTsKLQkJCQkJaW50IGxlZnQgPSBNYXRoLm1heCh0b3AueCwgYm90LngpOwotCQkJCQlpbnQgcmlnaHQgPSBNYXRoLm1pbih0b3AueCt0b3Aud2lkdGgsIGJvdC54K2JvdC53aWR0aCk7Ci0JCQkJCVJlY3RhbmdsZSBnYXAgPSBuZXcgUmVjdGFuZ2xlKGxlZnQsIHksIHJpZ2h0LWxlZnQsIGhlaWdodCk7Ci0JCQkJCWlmIChnYXAuaW50ZXJzZWN0cyhyZWN0KSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFJlY3RhbmdsZSBnZXRCb3VuZHMoKSB7Ci0JCWludCB4ID0gMCwgeSA9IDA7Ci0JCWludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmVhUmVjdGFuZ2xlcy5zaXplKCk7IGkrKykgewotCQkJQXJlYVJlY3RhbmdsZSBhciA9IChBcmVhUmVjdGFuZ2xlKSBhcmVhUmVjdGFuZ2xlcy5nZXQoaSk7Ci0JCQlpZiAoaSA9PSAwKSB7Ci0JCQkJeCA9IGFyLnJlY3QueDsKLQkJCQl5ID0gYXIucmVjdC55OwotCQkJfSBlbHNlCi0JCQkJeCA9IE1hdGgubWluKGFyLnJlY3QueCwgeCk7Ci0JCQl3aWR0aCA9IE1hdGgubWF4KGFyLnJlY3Qud2lkdGgsIHdpZHRoKTsKLQkJCWhlaWdodCArPSBhci5yZWN0LmhlaWdodDsKLQkJfQotCQlyZXR1cm4gbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZHZhbmNlTG9jYXRvcihHQyBnYywgaW50IHdIaW50LCBMb2NhdG9yIGxvY2F0b3IsCi0JCQlIYXNodGFibGUgb2JqZWN0VGFibGUsIGJvb2xlYW4gY29tcHV0ZUhlaWdodE9ubHkpIHsKLQkJRm9udCBvbGRGb250ID0gbnVsbDsKLQkJaWYgKGZvbnRJZCAhPSBudWxsKSB7Ci0JCQlvbGRGb250ID0gZ2MuZ2V0Rm9udCgpOwotCQkJRm9udCBuZXdGb250ID0gKEZvbnQpIG9iamVjdFRhYmxlLmdldChmb250SWQpOwotCQkJaWYgKG5ld0ZvbnQgIT0gbnVsbCkKLQkJCQlnYy5zZXRGb250KG5ld0ZvbnQpOwotCQl9Ci0JCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJaW50IGxpbmVIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsKLQkJYm9vbGVhbiBuZXdMaW5lID0gZmFsc2U7Ci0KLQkJaWYgKHdIaW50ID09IFNXVC5ERUZBVUxUIHx8ICF3cmFwQWxsb3dlZCkgewotCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCh0ZXh0KTsKLQkJCWludCB0b3RhbEV4dGVudCA9IGxvY2F0b3IueCtleHRlbnQueDsKLQkJCWlmIChpc1NlbGVjdGFibGUoKSkKLQkJCQl0b3RhbEV4dGVudCs9MTsKLQotCQkJaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUICYmIHRvdGFsRXh0ZW50ID4gd0hpbnQpIHsKLQkJCQkvLyBuZXcgbGluZQotCQkJCWxvY2F0b3IueCA9IGxvY2F0b3IuaW5kZW50OwotCQkJCWxvY2F0b3IueSArPSBsb2NhdG9yLnJvd0hlaWdodDsKLQkJCQlpZiAoY29tcHV0ZUhlaWdodE9ubHkpCi0JCQkJCWxvY2F0b3IuY29sbGVjdEhlaWdodHMoKTsKLQkJCQlsb2NhdG9yLnJvd0hlaWdodCA9IDA7Ci0JCQkJbG9jYXRvci5sZWFkaW5nID0gMDsKLQkJCQluZXdMaW5lID0gdHJ1ZTsKLQkJCX0KLQkJCWludCB3aWR0aCA9IGV4dGVudC54OwotCQkJaWYgKGlzU2VsZWN0YWJsZSgpKQotCQkJCXdpZHRoICs9IDE7Ci0JCQlsb2NhdG9yLnggKz0gd2lkdGg7Ci0JCQlsb2NhdG9yLndpZHRoID0gbG9jYXRvci5pbmRlbnQgKyB3aWR0aDsKLQkJCWxvY2F0b3Iucm93SGVpZ2h0ID0gTWF0aC5tYXgobG9jYXRvci5yb3dIZWlnaHQsIGV4dGVudC55KTsKLQkJCWxvY2F0b3IubGVhZGluZyA9IE1hdGgubWF4KGxvY2F0b3IubGVhZGluZywgZm0uZ2V0TGVhZGluZygpKTsKLQkJCXJldHVybiBuZXdMaW5lOwotCQl9Ci0KLQkJY29tcHV0ZVRleHRGcmFnbWVudHMoZ2MpOwotCi0JCWludCB3aWR0aCA9IDA7Ci0JCVBvaW50IGxpbmVFeHRlbnQgPSBuZXcgUG9pbnQoMCwgMCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0RnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUZXh0RnJhZ21lbnQgdGV4dEZyYWdtZW50ID0gdGV4dEZyYWdtZW50c1tpXTsKLQkJCWludCBjdXJyZW50RXh0ZW50ID0gbG9jYXRvci54ICsgbGluZUV4dGVudC54OwotCQkJCi0JCQlpZiAoaXNTZWxlY3RhYmxlKCkpCi0JCQkJY3VycmVudEV4dGVudCArPSAxOwotCQkJCi0JCQlpZiAoY3VycmVudEV4dGVudCArIHRleHRGcmFnbWVudC5sZW5ndGggPiB3SGludCkgewotCQkJCS8vIG92ZXJmbG93Ci0JCQkJaW50IGxpbmVXaWR0aCA9IGN1cnJlbnRFeHRlbnQ7Ci0JCQkJbG9jYXRvci5yb3dIZWlnaHQgPSBNYXRoLm1heChsb2NhdG9yLnJvd0hlaWdodCwgbGluZUV4dGVudC55KTsKLQkJCQlsb2NhdG9yLmxlYWRpbmcgPSBNYXRoLm1heChsb2NhdG9yLmxlYWRpbmcsIGZtLmdldExlYWRpbmcoKSk7Ci0JCQkJaWYgKGNvbXB1dGVIZWlnaHRPbmx5KQotCQkJCQlsb2NhdG9yLmNvbGxlY3RIZWlnaHRzKCk7Ci0JCQkJbG9jYXRvci54ID0gbG9jYXRvci5pbmRlbnQ7Ci0JCQkJbG9jYXRvci55ICs9IGxvY2F0b3Iucm93SGVpZ2h0OwotCQkJCWxvY2F0b3Iucm93SGVpZ2h0ID0gMDsKLQkJCQlsb2NhdG9yLmxlYWRpbmcgPSAwOwotCQkJCWxpbmVFeHRlbnQueCA9IDA7Ci0JCQkJbGluZUV4dGVudC55ID0gMDsKLQkJCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBsaW5lV2lkdGgpOwotCQkJCW5ld0xpbmUgPSB0cnVlOwotCQkJfQotCQkJbGluZUV4dGVudC54ICs9IHRleHRGcmFnbWVudC5sZW5ndGg7Ci0JCQlsaW5lRXh0ZW50LnkgPSBNYXRoLm1heChsaW5lSGVpZ2h0LCBsaW5lRXh0ZW50LnkpOwotCQl9Ci0JCWludCBsaW5lV2lkdGggPSBsaW5lRXh0ZW50Lng7Ci0JCWlmIChpc1NlbGVjdGFibGUoKSkKLQkJCWxpbmVXaWR0aCArPSAxOwotCQlsb2NhdG9yLnggKz0gbGluZVdpZHRoOwotCQlsb2NhdG9yLndpZHRoID0gd2lkdGg7Ci0JCWxvY2F0b3Iucm93SGVpZ2h0ID0gTWF0aC5tYXgobG9jYXRvci5yb3dIZWlnaHQsIGxpbmVFeHRlbnQueSk7Ci0JCWxvY2F0b3IubGVhZGluZyA9IE1hdGgubWF4KGxvY2F0b3IubGVhZGluZywgZm0uZ2V0TGVhZGluZygpKTsKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgewotCQkJZ2Muc2V0Rm9udChvbGRGb250KTsKLQkJfQotCQlyZXR1cm4gbmV3TGluZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZ2MKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gbG9jYXRvcgotCSAqIEBwYXJhbSBzZWxlY3RlZAotCSAqIEBwYXJhbSBzZWxEYXRhCi0JICogQHBhcmFtIGNvbG9yCi0JICogQHBhcmFtIGZtCi0JICogQHBhcmFtIGxpbmVIZWlnaHQKLQkgKiBAcGFyYW0gZGVzY2VudAotCSAqLwotCXByaXZhdGUgdm9pZCBsYXlvdXRXaXRob3V0V3JhcHBpbmcoR0MgZ2MsIGludCB3aWR0aCwgTG9jYXRvciBsb2NhdG9yLAotCQkJYm9vbGVhbiBzZWxlY3RlZCwgRm9udE1ldHJpY3MgZm0sIGludCBsaW5lSGVpZ2h0LCBpbnQgZGVzY2VudCkgewotCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KHRleHQpOwotCQlpbnQgZXdpZHRoID0gZXh0ZW50Lng7Ci0JCWlmIChpc1NlbGVjdGFibGUoKSkKLQkJCWV3aWR0aCArPSAxOwotCQlpZiAobG9jYXRvci54ICsgZXdpZHRoID4gd2lkdGgtbG9jYXRvci5tYXJnaW5XaWR0aCkgewotCQkJLy8gbmV3IGxpbmUKLQkJCWxvY2F0b3IucmVzZXRDYXJldCgpOwotCQkJbG9jYXRvci55ICs9IGxvY2F0b3Iucm93SGVpZ2h0OwotCQkJbG9jYXRvci5yb3dIZWlnaHQgPSAwOwotCQkJbG9jYXRvci5yb3dDb3VudGVyKys7Ci0JCX0KLQkJaW50IGx5ID0gbG9jYXRvci5nZXRCYXNlbGluZShmbS5nZXRIZWlnaHQoKSAtIGZtLmdldExlYWRpbmcoKSk7Ci0JCS8vaW50IGxpbmVZID0gbHkgKyBsaW5lSGVpZ2h0IC0gZGVzY2VudCArIDE7Ci0JCVJlY3RhbmdsZSBiciA9IG5ldyBSZWN0YW5nbGUobG9jYXRvci54LCBseSwgZXdpZHRoLAotCQkJCWxpbmVIZWlnaHQgLSBkZXNjZW50ICsgMyk7Ci0JCWFyZWFSZWN0YW5nbGVzLmFkZChuZXcgQXJlYVJlY3RhbmdsZShiciwgMCwgLTEpKTsKLQkJbG9jYXRvci54ICs9IGV3aWR0aDsKLQkJbG9jYXRvci53aWR0aCA9IGV3aWR0aDsKLQkJbG9jYXRvci5yb3dIZWlnaHQgPSBNYXRoLm1heChsb2NhdG9yLnJvd0hlaWdodCwgZXh0ZW50LnkpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgY29udmVydE9mZnNldFRvU3RyaW5nSW5kZXgoR0MgZ2MsIFN0cmluZyBzLCBpbnQgeCwKLQkJCWludCBzd2lkdGgsIGludCBzZWxPZmZzZXQpIHsKLQkJaW50IGluZGV4ID0gcy5sZW5ndGgoKTsKLQkJd2hpbGUgKGluZGV4ID4gMCAmJiB4ICsgc3dpZHRoID4gc2VsT2Zmc2V0KSB7Ci0JCQlpbmRleC0tOwotCQkJU3RyaW5nIHNzID0gcy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJc3dpZHRoID0gZ2MudGV4dEV4dGVudChzcykueDsKLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnRGb2N1cyhHQyBnYywgQ29sb3IgYmcsIENvbG9yIGZnLCBib29sZWFuIHNlbGVjdGVkLAotCQkJUmVjdGFuZ2xlIHJlcGFpbnRSZWdpb24pIHsKLQkJaWYgKGFyZWFSZWN0YW5nbGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJlYVJlY3RhbmdsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUFyZWFSZWN0YW5nbGUgYXJlYVJlY3RhbmdsZSA9IChBcmVhUmVjdGFuZ2xlKSBhcmVhUmVjdGFuZ2xlcy5nZXQoaSk7Ci0JCQlSZWN0YW5nbGUgYnIgPSBhcmVhUmVjdGFuZ2xlLnJlY3Q7Ci0JCQlpbnQgYnggPSBici54OwotCQkJaW50IGJ5ID0gYnIueTsKLQkJCWlmIChyZXBhaW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlieCAtPSByZXBhaW50UmVnaW9uLng7Ci0JCQkJYnkgLT0gcmVwYWludFJlZ2lvbi55OwotCQkJfQotCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChiZyk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChmZyk7Ci0JCQkJZ2MuZHJhd0ZvY3VzKGJ4LCBieSwgYnIud2lkdGgsIGJyLmhlaWdodCk7Ci0JCQl9IGVsc2UgewotCQkJCWdjLnNldEZvcmVncm91bmQoYmcpOwotCQkJCWdjLmRyYXdSZWN0YW5nbGUoYngsIGJ5LCBici53aWR0aCAtIDEsIGJyLmhlaWdodCAtIDEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGJvb2xlYW4gaG92ZXIsIEhhc2h0YWJsZSByZXNvdXJjZVRhYmxlLAotCQkJYm9vbGVhbiBzZWxlY3RlZCwgU2VsZWN0aW9uRGF0YSBzZWxEYXRhLCBSZWN0YW5nbGUgcmVwYWludFJlZ2lvbikgewotCQl0aGlzLnBhaW50KGdjLCBob3ZlciwgcmVzb3VyY2VUYWJsZSwgc2VsZWN0ZWQsIGZhbHNlLCBzZWxEYXRhLAotCQkJCXJlcGFpbnRSZWdpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhaW50KEdDIGdjLCBib29sZWFuIGhvdmVyLCBIYXNodGFibGUgcmVzb3VyY2VUYWJsZSwKLQkJCWJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gcm9sbG92ZXIsIFNlbGVjdGlvbkRhdGEgc2VsRGF0YSwKLQkJCVJlY3RhbmdsZSByZXBhaW50UmVnaW9uKSB7Ci0JCUZvbnQgb2xkRm9udCA9IG51bGw7Ci0JCUNvbG9yIG9sZENvbG9yID0gbnVsbDsKLQkJQ29sb3Igb2xkQmcgPSBudWxsOwotCi0JCS8vIGFwcGx5IHNlZ21lbnQtc3BlY2lmaWMgZm9udCwgY29sb3IgYW5kIGJhY2tncm91bmQKLQkJaWYgKGZvbnRJZCAhPSBudWxsKSB7Ci0JCQlvbGRGb250ID0gZ2MuZ2V0Rm9udCgpOwotCQkJRm9udCBuZXdGb250ID0gKEZvbnQpIHJlc291cmNlVGFibGUuZ2V0KGZvbnRJZCk7Ci0JCQlpZiAobmV3Rm9udCAhPSBudWxsKQotCQkJCWdjLnNldEZvbnQobmV3Rm9udCk7Ci0JCX0KLQkJaWYgKCFob3ZlciAmJiBjb2xvcklkICE9IG51bGwpIHsKLQkJCW9sZENvbG9yID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJQ29sb3IgbmV3Q29sb3IgPSAoQ29sb3IpIHJlc291cmNlVGFibGUuZ2V0KGNvbG9ySWQpOwotCQkJaWYgKG5ld0NvbG9yICE9IG51bGwpCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChuZXdDb2xvcik7Ci0JCX0KLQkJb2xkQmcgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0KLQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOwotCQlpbnQgZGVzY2VudCA9IGZtLmdldERlc2NlbnQoKTsKLQotCQkvLyBwYWludCBhcmVhIHJlY3RhbmdsZXMgb2YgdGhlIHNlZ21lbnQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmVhUmVjdGFuZ2xlcy5zaXplKCk7IGkrKykgewotCQkJQXJlYVJlY3RhbmdsZSBhcmVhUmVjdGFuZ2xlID0gKEFyZWFSZWN0YW5nbGUpIGFyZWFSZWN0YW5nbGVzLmdldChpKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gYXJlYVJlY3RhbmdsZS5yZWN0OwotCQkJU3RyaW5nIHRleHQgPSBhcmVhUmVjdGFuZ2xlLmdldFRleHQoKTsKLQkJCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQodGV4dCk7Ci0JCQlpbnQgdGV4dFggPSByZWN0LnggKyAoaXNTZWxlY3RhYmxlKCk/MTowKTsKLQkJCWludCBsaW5lWSA9IHJlY3QueSArIGxpbmVIZWlnaHQgLSBkZXNjZW50ICsgMTsKLQkJCXBhaW50U3RyaW5nKGdjLCB0ZXh0LCBleHRlbnQueCwgdGV4dFgsIHJlY3QueSwgbGluZVksIHNlbERhdGEsCi0JCQkJCXJlY3QsIGhvdmVyLCByb2xsb3ZlciwgcmVwYWludFJlZ2lvbik7Ci0JCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQlpbnQgZnggPSByZWN0Lng7Ci0JCQkJaW50IGZ5ID0gcmVjdC55OwotCQkJCWlmIChyZXBhaW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJZnggLT0gcmVwYWludFJlZ2lvbi54OwotCQkJCQlmeSAtPSByZXBhaW50UmVnaW9uLnk7Ci0JCQkJfQotCQkJCS8vVG8gYXZvaWQgcGFydGlhbGx5IGNhbmNlbGxpbmcgdGhlIGZvY3VzIGJ5IHBhaW50aW5nIG92ZXIKLQkJCQkvL1gtT1JlZCBwaXhlbHMsIGZpcnN0IGNhbmNlbCBpdCB5b3Vyc2VsZgotCQkJCUNvbG9yIGZnID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJCWdjLnNldEZvcmVncm91bmQob2xkQmcpOwotCQkJCWdjLmRyYXdSZWN0YW5nbGUoZngsIGZ5LCByZWN0LndpZHRoIC0gMSwgcmVjdC5oZWlnaHQgLSAxKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGZnKTsKLQkJCQlnYy5kcmF3Rm9jdXMoZngsIGZ5LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQl9Ci0JCX0KLQkJLy8gcmVzdG9yZSBHQyByZXNvdXJjZXMKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgewotCQkJZ2Muc2V0Rm9udChvbGRGb250KTsKLQkJfQotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgewotCQkJZ2Muc2V0Rm9yZWdyb3VuZChvbGRDb2xvcik7Ci0JCX0KLQkJaWYgKG9sZEJnICE9IG51bGwpIHsKLQkJCWdjLnNldEJhY2tncm91bmQob2xkQmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29tcHV0ZVNlbGVjdGlvbihHQyBnYywgSGFzaHRhYmxlIHJlc291cmNlVGFibGUsIFNlbGVjdGlvbkRhdGEgc2VsRGF0YSkgewotCQlGb250IG9sZEZvbnQgPSBudWxsOwotCi0JCWlmIChmb250SWQgIT0gbnVsbCkgewotCQkJb2xkRm9udCA9IGdjLmdldEZvbnQoKTsKLQkJCUZvbnQgbmV3Rm9udCA9IChGb250KSByZXNvdXJjZVRhYmxlLmdldChmb250SWQpOwotCQkJaWYgKG5ld0ZvbnQgIT0gbnVsbCkKLQkJCQlnYy5zZXRGb250KG5ld0ZvbnQpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmVhUmVjdGFuZ2xlcy5zaXplKCk7IGkrKykgewotCQkJQXJlYVJlY3RhbmdsZSBhcmVhUmVjdGFuZ2xlID0gKEFyZWFSZWN0YW5nbGUpIGFyZWFSZWN0YW5nbGVzLmdldChpKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gYXJlYVJlY3RhbmdsZS5yZWN0OwotCQkJU3RyaW5nIHRleHQgPSBhcmVhUmVjdGFuZ2xlLmdldFRleHQoKTsKLQkJCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQodGV4dCk7Ci0JCQljb21wdXRlU2VsZWN0aW9uKGdjLCB0ZXh0LCBleHRlbnQueCwgc2VsRGF0YSwKLQkJCQkJcmVjdCk7Ci0JCX0KLQkJLy8gcmVzdG9yZSBHQyByZXNvdXJjZXMKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgewotCQkJZ2Muc2V0Rm9udChvbGRGb250KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwYWludFN0cmluZyhHQyBnYywgU3RyaW5nIHMsIGludCBzd2lkdGgsIGludCB4LCBpbnQgeSwKLQkJCWludCBsaW5lWSwgU2VsZWN0aW9uRGF0YSBzZWxEYXRhLCBSZWN0YW5nbGUgYm91bmRzLCBib29sZWFuIGhvdmVyLAotCQkJYm9vbGVhbiByb2xsb3Zlck1vZGUsIFJlY3RhbmdsZSByZXBhaW50UmVnaW9uKSB7Ci0JCS8vIHJlcGFpbnRzIG9uZSBhcmVhIHJlY3RhbmdsZQotCQlpZiAoc2VsRGF0YSAhPSBudWxsICYmIHNlbERhdGEuaXNFbmNsb3NlZCgpKSB7Ci0JCQlDb2xvciBzYXZlZEJnID0gZ2MuZ2V0QmFja2dyb3VuZCgpOwotCQkJQ29sb3Igc2F2ZWRGZyA9IGdjLmdldEZvcmVncm91bmQoKTsKLQkJCWludCBsZWZ0T2Zmc2V0ID0gc2VsRGF0YS5nZXRMZWZ0T2Zmc2V0KGJvdW5kcy5oZWlnaHQpOwotCQkJaW50IHJpZ2h0T2Zmc2V0ID0gc2VsRGF0YS5nZXRSaWdodE9mZnNldChib3VuZHMuaGVpZ2h0KTsKLQkJCWJvb2xlYW4gZmlyc3RSb3cgPSBzZWxEYXRhLmlzRmlyc3RTZWxlY3Rpb25Sb3coYm91bmRzLnksCi0JCQkJCWJvdW5kcy5oZWlnaHQpOwotCQkJYm9vbGVhbiBsYXN0Um93ID0gc2VsRGF0YS5pc0xhc3RTZWxlY3Rpb25Sb3coYm91bmRzLnksCi0JCQkJCWJvdW5kcy5oZWlnaHQpOwotCQkJYm9vbGVhbiBzZWxlY3RlZFJvdyA9IHNlbERhdGEKLQkJCQkJLmlzU2VsZWN0ZWRSb3coYm91bmRzLnksIGJvdW5kcy5oZWlnaHQpOwotCi0JCQlpbnQgc3N0YXJ0ID0gLTE7Ci0JCQlpbnQgc3N0b3AgPSAtMTsKLQotCQkJaWYgKChmaXJzdFJvdyAmJiB4ICsgc3dpZHRoIDwgbGVmdE9mZnNldCkKLQkJCQkJfHwgKGxhc3RSb3cgJiYgeCA+IHJpZ2h0T2Zmc2V0KSkgewotCQkJCXBhaW50U3RyaW5nU2VnbWVudChnYywgcywgZ2MudGV4dEV4dGVudChzKS54LCB4LCB5LCBsaW5lWSwKLQkJCQkJCWhvdmVyLCByb2xsb3Zlck1vZGUsIHJlcGFpbnRSZWdpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGZpcnN0Um93ICYmIGJvdW5kcy54ICsgc3dpZHRoID4gbGVmdE9mZnNldCkgewotCQkJCXNzdGFydCA9IGNvbnZlcnRPZmZzZXRUb1N0cmluZ0luZGV4KGdjLCBzLCBib3VuZHMueCwgc3dpZHRoLAotCQkJCQkJbGVmdE9mZnNldCk7Ci0JCQl9Ci0JCQlpZiAobGFzdFJvdyAmJiBib3VuZHMueCArIHN3aWR0aCA+IHJpZ2h0T2Zmc2V0KSB7Ci0JCQkJc3N0b3AgPSBjb252ZXJ0T2Zmc2V0VG9TdHJpbmdJbmRleChnYywgcywgYm91bmRzLngsIHN3aWR0aCwKLQkJCQkJCXJpZ2h0T2Zmc2V0KTsKLQkJCX0KLQotCQkJaWYgKGZpcnN0Um93ICYmIHNzdGFydCAhPSAtMSkgewotCQkJCVN0cmluZyBsZWZ0ID0gcy5zdWJzdHJpbmcoMCwgc3N0YXJ0KTsKLQkJCQlpbnQgd2lkdGggPSBnYy50ZXh0RXh0ZW50KGxlZnQpLng7Ci0JCQkJcGFpbnRTdHJpbmdTZWdtZW50KGdjLCBsZWZ0LCB3aWR0aCwgeCwgeSwgbGluZVksIGhvdmVyLAotCQkJCQkJcm9sbG92ZXJNb2RlLCByZXBhaW50UmVnaW9uKTsKLQkJCQl4ICs9IHdpZHRoOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkUm93KSB7Ci0JCQkJaW50IGxpbmRleCA9IHNzdGFydCAhPSAtMSA/IHNzdGFydCA6IDA7Ci0JCQkJaW50IHJpbmRleCA9IHNzdG9wICE9IC0xID8gc3N0b3AgOiBzLmxlbmd0aCgpOwotCQkJCVN0cmluZyBtaWQgPSBzLnN1YnN0cmluZyhsaW5kZXgsIHJpbmRleCk7Ci0JCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudChtaWQpOwotCQkJCWdjLnNldEZvcmVncm91bmQoc2VsRGF0YS5mZyk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChzZWxEYXRhLmJnKTsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlKHgsIHksIGV4dGVudC54LCBleHRlbnQueSk7Ci0JCQkJcGFpbnRTdHJpbmdTZWdtZW50KGdjLCBtaWQsIGV4dGVudC54LCB4LCB5LCBsaW5lWSwgaG92ZXIsCi0JCQkJCQlyb2xsb3Zlck1vZGUsIHJlcGFpbnRSZWdpb24pOwotCQkJCXggKz0gZXh0ZW50Lng7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChzYXZlZEZnKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKHNhdmVkQmcpOwotCQkJfSBlbHNlIHsKLQkJCQlwYWludFN0cmluZ1NlZ21lbnQoZ2MsIHMsIGdjLnRleHRFeHRlbnQocykueCwgeCwgeSwgbGluZVksCi0JCQkJCQlob3Zlciwgcm9sbG92ZXJNb2RlLCByZXBhaW50UmVnaW9uKTsKLQkJCX0KLQkJCWlmIChsYXN0Um93ICYmIHNzdG9wICE9IC0xKSB7Ci0JCQkJU3RyaW5nIHJpZ2h0ID0gcy5zdWJzdHJpbmcoc3N0b3ApOwotCQkJCXBhaW50U3RyaW5nU2VnbWVudChnYywgcmlnaHQsIGdjLnRleHRFeHRlbnQocmlnaHQpLngsIHgsIHksCi0JCQkJCQlsaW5lWSwgaG92ZXIsIHJvbGxvdmVyTW9kZSwgcmVwYWludFJlZ2lvbik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwYWludFN0cmluZ1NlZ21lbnQoZ2MsIHMsIGdjLnRleHRFeHRlbnQocykueCwgeCwgeSwgbGluZVksIGhvdmVyLAotCQkJCQlyb2xsb3Zlck1vZGUsIHJlcGFpbnRSZWdpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVTZWxlY3Rpb24oR0MgZ2MsIFN0cmluZyBzLCBpbnQgc3dpZHRoLCBTZWxlY3Rpb25EYXRhIHNlbERhdGEsIFJlY3RhbmdsZSBib3VuZHMpIHsKLQkJaW50IGxlZnRPZmZzZXQgPSBzZWxEYXRhLmdldExlZnRPZmZzZXQoYm91bmRzLmhlaWdodCk7Ci0JCWludCByaWdodE9mZnNldCA9IHNlbERhdGEuZ2V0UmlnaHRPZmZzZXQoYm91bmRzLmhlaWdodCk7Ci0JCWJvb2xlYW4gZmlyc3RSb3cgPSBzZWxEYXRhLmlzRmlyc3RTZWxlY3Rpb25Sb3coYm91bmRzLnksIGJvdW5kcy5oZWlnaHQpOwotCQlib29sZWFuIGxhc3RSb3cgPSBzZWxEYXRhLmlzTGFzdFNlbGVjdGlvblJvdyhib3VuZHMueSwgYm91bmRzLmhlaWdodCk7Ci0JCWJvb2xlYW4gc2VsZWN0ZWRSb3cgPSBzZWxEYXRhLmlzU2VsZWN0ZWRSb3coYm91bmRzLnksIGJvdW5kcy5oZWlnaHQpOwotCi0JCWludCBzc3RhcnQgPSAtMTsKLQkJaW50IHNzdG9wID0gLTE7Ci0KLQkJaWYgKGZpcnN0Um93ICYmIGJvdW5kcy54ICsgc3dpZHRoID4gbGVmdE9mZnNldCkgewotCQkJc3N0YXJ0ID0gY29udmVydE9mZnNldFRvU3RyaW5nSW5kZXgoZ2MsIHMsIGJvdW5kcy54LCBzd2lkdGgsCi0JCQkJCWxlZnRPZmZzZXQpOwotCQl9Ci0JCWlmIChsYXN0Um93ICYmIGJvdW5kcy54ICsgc3dpZHRoID4gcmlnaHRPZmZzZXQpIHsKLQkJCXNzdG9wID0gY29udmVydE9mZnNldFRvU3RyaW5nSW5kZXgoZ2MsIHMsIGJvdW5kcy54LCBzd2lkdGgsCi0JCQkJCXJpZ2h0T2Zmc2V0KTsKLQkJfQotCi0JCWlmIChzZWxlY3RlZFJvdykgewotCQkJaW50IGxpbmRleCA9IHNzdGFydCAhPSAtMSA/IHNzdGFydCA6IDA7Ci0JCQlpbnQgcmluZGV4ID0gc3N0b3AgIT0gLTEgPyBzc3RvcCA6IHMubGVuZ3RoKCk7Ci0JCQlTdHJpbmcgbWlkID0gcy5zdWJzdHJpbmcobGluZGV4LCByaW5kZXgpOwotCQkJc2VsRGF0YS5hZGRTZWdtZW50KG1pZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZ2MKLQkgKiBAcGFyYW0gcwotCSAqIEBwYXJhbSB4Ci0JICogQHBhcmFtIHkKLQkgKiBAcGFyYW0gbGluZVkKLQkgKiBAcGFyYW0gaG92ZXIKLQkgKiBAcGFyYW0gcm9sbG92ZXJNb2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhaW50U3RyaW5nU2VnbWVudChHQyBnYywgU3RyaW5nIHMsIGludCBzd2lkdGgsIGludCB4LCBpbnQgeSwKLQkJCWludCBsaW5lWSwgYm9vbGVhbiBob3ZlciwgYm9vbGVhbiByb2xsb3Zlck1vZGUsCi0JCQlSZWN0YW5nbGUgcmVwYWludFJlZ2lvbikgewotCQlib29sZWFuIHJldmVyc2UgPSBmYWxzZTsKLQkJaW50IGNsaXBYID0geDsKLQkJaW50IGNsaXBZID0geTsKLQkJaW50IGNsaXBMaW5lWSA9IGxpbmVZOwotCQlpZiAocmVwYWludFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQljbGlwWCAtPSByZXBhaW50UmVnaW9uLng7Ci0JCQljbGlwWSAtPSByZXBhaW50UmVnaW9uLnk7Ci0JCQljbGlwTGluZVkgLT0gcmVwYWludFJlZ2lvbi55OwotCQl9Ci0JCWlmICh1bmRlcmxpbmUgfHwgaG92ZXIgfHwgcm9sbG92ZXJNb2RlKSB7Ci0JCQlpZiAocm9sbG92ZXJNb2RlICYmICFob3ZlcikKLQkJCQlyZXZlcnNlID0gdHJ1ZTsKLQkJfQotCQlpZiAocmV2ZXJzZSkgewotCQkJZHJhd1VuZGVybGluZShnYywgc3dpZHRoLCBjbGlwWCwgY2xpcExpbmVZLCBob3Zlciwgcm9sbG92ZXJNb2RlKTsKLQkJCWdjLmRyYXdTdHJpbmcocywgY2xpcFgsIGNsaXBZLCBmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlnYy5kcmF3U3RyaW5nKHMsIGNsaXBYLCBjbGlwWSwgZmFsc2UpOwotCQkJZHJhd1VuZGVybGluZShnYywgc3dpZHRoLCBjbGlwWCwgY2xpcExpbmVZLCBob3Zlciwgcm9sbG92ZXJNb2RlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkcmF3VW5kZXJsaW5lKEdDIGdjLCBpbnQgc3dpZHRoLCBpbnQgeCwgaW50IHksIGJvb2xlYW4gaG92ZXIsCi0JCQlib29sZWFuIHJvbGxvdmVyTW9kZSkgewotCQlpZiAodW5kZXJsaW5lIHx8IGhvdmVyIHx8IHJvbGxvdmVyTW9kZSkgewotCQkJQ29sb3Igc2F2ZWQgPSBudWxsOwotCQkJaWYgKHJvbGxvdmVyTW9kZSAmJiAhaG92ZXIpIHsKLQkJCQlzYXZlZCA9IGdjLmdldEZvcmVncm91bmQoKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGdjLmdldEJhY2tncm91bmQoKSk7Ci0JCQl9Ci0JCQlnYy5kcmF3TGluZSh4LCB5LCB4ICsgc3dpZHRoLTEsIHkpOwotCQkJaWYgKHNhdmVkICE9IG51bGwpCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChzYXZlZCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmZvcm1zLndpZGdldHMuUGFyYWdyYXBoU2VnbWVudCNsYXlvdXQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzLkxvY2F0b3IsCi0JICogICAgICBqYXZhLnV0aWwuSGFzaHRhYmxlLCBib29sZWFuLAotCSAqICAgICAgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZm9ybXMud2lkZ2V0cy5TZWxlY3Rpb25EYXRhKQotCSAqLwotCXB1YmxpYyB2b2lkIGxheW91dChHQyBnYywgaW50IHdpZHRoLCBMb2NhdG9yIGxvY2F0b3IsCi0JCQlIYXNodGFibGUgcmVzb3VyY2VUYWJsZSwgYm9vbGVhbiBzZWxlY3RlZCkgewotCQlGb250IG9sZEZvbnQgPSBudWxsOwotCi0JCWFyZWFSZWN0YW5nbGVzLmNsZWFyKCk7Ci0KLQkJaWYgKGZvbnRJZCAhPSBudWxsKSB7Ci0JCQlvbGRGb250ID0gZ2MuZ2V0Rm9udCgpOwotCQkJRm9udCBuZXdGb250ID0gKEZvbnQpIHJlc291cmNlVGFibGUuZ2V0KGZvbnRJZCk7Ci0JCQlpZiAobmV3Rm9udCAhPSBudWxsKQotCQkJCWdjLnNldEZvbnQobmV3Rm9udCk7Ci0JCX0KLQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOwotCQlpbnQgZGVzY2VudCA9IGZtLmdldERlc2NlbnQoKTsKLQotCQlpZiAoIXdyYXBBbGxvd2VkKSB7Ci0JCQlsYXlvdXRXaXRob3V0V3JhcHBpbmcoZ2MsIHdpZHRoLCBsb2NhdG9yLCBzZWxlY3RlZCwgZm0sIGxpbmVIZWlnaHQsCi0JCQkJCWRlc2NlbnQpOwotCQl9IGVsc2UgewotCQkJaW50IGxpbmVTdGFydCA9IDA7Ci0JCQlpbnQgbGFzdExvYyA9IDA7Ci0JCQlQb2ludCBsaW5lRXh0ZW50ID0gbmV3IFBvaW50KDAsIDApOwotCQkJY29tcHV0ZVRleHRGcmFnbWVudHMoZ2MpOwotCQkJaW50IHJpZ2h0RWRnZSA9IHdpZHRoLWxvY2F0b3IubWFyZ2luV2lkdGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRGcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlUZXh0RnJhZ21lbnQgZnJhZ21lbnQgPSB0ZXh0RnJhZ21lbnRzW2ldOwotCQkJCWludCBicmVha0xvYyA9IGZyYWdtZW50LmluZGV4OwotCQkJCWlmIChicmVha0xvYyA9PSAwKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAobG9jYXRvci54ICsgbGluZUV4dGVudC54ICsgZnJhZ21lbnQubGVuZ3RoID4gcmlnaHRFZGdlKSB7Ci0JCQkJCS8vIG92ZXJmbG93Ci0JCQkJCWludCBsaW5lV2lkdGggPSBsb2NhdG9yLnggKyBsaW5lRXh0ZW50Lng7Ci0JCQkJCWlmIChpc1NlbGVjdGFibGUoKSkKLQkJCQkJCWxpbmVXaWR0aCArPSAxOwotCQkJCQlpbnQgbHkgPSBsb2NhdG9yLmdldEJhc2VsaW5lKGxpbmVIZWlnaHQgLSBmbS5nZXRMZWFkaW5nKCkpOwotCQkJCQlSZWN0YW5nbGUgYnIgPSBuZXcgUmVjdGFuZ2xlKGlzU2VsZWN0YWJsZSgpPwotCQkJCQkJCWxvY2F0b3IueCAtIDE6bG9jYXRvci54LCBseSwKLQkJCQkJCQlpc1NlbGVjdGFibGUoKT9saW5lRXh0ZW50LnggKyAxOmxpbmVFeHRlbnQueCwgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAzKTsKLQkJCQkJYXJlYVJlY3RhbmdsZXMKLQkJCQkJCQkuYWRkKG5ldyBBcmVhUmVjdGFuZ2xlKGJyLCBsaW5lU3RhcnQsIGxhc3RMb2MpKTsKLQotCQkJCQlsb2NhdG9yLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvY2F0b3Iucm93SGVpZ2h0LAotCQkJCQkJCWxpbmVFeHRlbnQueSk7Ci0JCQkJCWxvY2F0b3IucmVzZXRDYXJldCgpOwotCQkJCQlpZiAoaXNTZWxlY3RhYmxlKCkpCi0JCQkJCQlsb2NhdG9yLnggKz0gMTsJCQkJCQotCQkJCQlsb2NhdG9yLnkgKz0gbG9jYXRvci5yb3dIZWlnaHQ7Ci0JCQkJCWxvY2F0b3Iucm93Q291bnRlcisrOwotCQkJCQlsb2NhdG9yLnJvd0hlaWdodCA9IDA7Ci0JCQkJCWxpbmVTdGFydCA9IGxhc3RMb2M7Ci0JCQkJCWxpbmVFeHRlbnQueCA9IDA7Ci0JCQkJCWxpbmVFeHRlbnQueSA9IDA7Ci0JCQkJfQotCQkJCWxhc3RMb2MgPSBicmVha0xvYzsKLQkJCQlsaW5lRXh0ZW50LnggKz0gZnJhZ21lbnQubGVuZ3RoOwotCQkJCWxpbmVFeHRlbnQueSA9IE1hdGgubWF4KGxpbmVIZWlnaHQsIGxpbmVFeHRlbnQueSk7Ci0JCQl9Ci0JCQkvL1N0cmluZyBsYXN0TGluZSA9IHRleHQuc3Vic3RyaW5nKGxpbmVTdGFydCwgbGFzdExvYyk7Ci0JCQlpbnQgbHkgPSBsb2NhdG9yLmdldEJhc2VsaW5lKGxpbmVIZWlnaHQgLSBmbS5nZXRMZWFkaW5nKCkpOwotCQkJaW50IGxhc3RXaWR0aCA9IGxpbmVFeHRlbnQueDsKLQkJCWlmIChpc1NlbGVjdGFibGUoKSkKLQkJCQlsYXN0V2lkdGggKz0gMTsKLQkJCVJlY3RhbmdsZSBiciA9IG5ldyBSZWN0YW5nbGUoaXNTZWxlY3RhYmxlKCk/bG9jYXRvci54IC0gMTpsb2NhdG9yLngsIGx5LCAKLQkJCQkJaXNTZWxlY3RhYmxlKCk/bGluZUV4dGVudC54ICsgMTpsaW5lRXh0ZW50LngsCi0JCQkJCWxpbmVIZWlnaHQgLSBkZXNjZW50ICsgMyk7Ci0JCQkvL2ludCBsaW5lWSA9IGx5ICsgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAxOwotCQkJYXJlYVJlY3RhbmdsZXMuYWRkKG5ldyBBcmVhUmVjdGFuZ2xlKGJyLCBsaW5lU3RhcnQsIGxhc3RMb2MpKTsKLQkJCWxvY2F0b3IueCArPSBsYXN0V2lkdGg7Ci0JCQlsb2NhdG9yLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvY2F0b3Iucm93SGVpZ2h0LCBsaW5lRXh0ZW50LnkpOwotCQl9Ci0JCWlmIChvbGRGb250ICE9IG51bGwpIHsKLQkJCWdjLnNldEZvbnQob2xkRm9udCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZVRleHRGcmFnbWVudHMoR0MgZ2MpIHsKLQkJaWYgKHRleHRGcmFnbWVudHMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUJyZWFrSXRlcmF0b3Igd2IgPSBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpOwotCQl3Yi5zZXRUZXh0KGdldFRleHQoKSk7Ci0JCWludCBjdXJzb3IgPSAwOwotCQlmb3IgKGludCBsb2MgPSB3Yi5maXJzdCgpOyBsb2MgIT0gQnJlYWtJdGVyYXRvci5ET05FOyBsb2MgPSB3Yi5uZXh0KCkpIHsKLQkJCWlmIChsb2MgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyB3b3JkID0gdGV4dC5zdWJzdHJpbmcoY3Vyc29yLCBsb2MpOwotCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCh3b3JkKTsKLQkJCWxpc3QuYWRkKG5ldyBUZXh0RnJhZ21lbnQoKHNob3J0KSBsb2MsIChzaG9ydCkgZXh0ZW50LngpKTsKLQkJCWN1cnNvciA9IGxvYzsKLQkJfQotCQl0ZXh0RnJhZ21lbnRzID0gKFRleHRGcmFnbWVudFtdKSBsaXN0LnRvQXJyYXkobmV3IFRleHRGcmFnbWVudFtsaXN0Ci0JCQkJLnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKFN0cmluZyBmb250SWQpIHsKLQkJaWYgKGZvbnRJZD09bnVsbCAmJiB0aGlzLmZvbnRJZD09bnVsbCkKLQkJCXRleHRGcmFnbWVudHMgPSBudWxsOwotCQllbHNlIGlmIChmb250SWQhPW51bGwgJiYgdGhpcy5mb250SWQhPW51bGwgJiYgZm9udElkLmVxdWFscyh0aGlzLmZvbnRJZCkpCi0JCQl0ZXh0RnJhZ21lbnRzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL1dyYXBwZWRQYWdlQm9vay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZm9ybXMvd2lkZ2V0cy9XcmFwcGVkUGFnZUJvb2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5MWY2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL1dyYXBwZWRQYWdlQm9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5mb3Jtcy53aWRnZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JTGF5b3V0RXh0ZW5zaW9uOwotCi0vKioKLSAqIEEgcGFnZWJvb2sgaXMgYSBjb21wb3NpdGUgY29udHJvbCB3aGVyZSBvbmx5IGEgc2luZ2xlIGNvbnRyb2wgaXMgdmlzaWJsZSBhdAotICogYSB0aW1lLiBJdCBpcyBzaW1pbGFyIHRvIGEgbm90ZWJvb2ssIGJ1dCB3aXRob3V0IHRhYnMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgUGFnZUJvb2tWaWV3Ci0gKi8KLXB1YmxpYyBjbGFzcyBXcmFwcGVkUGFnZUJvb2sgZXh0ZW5kcyBDb21wb3NpdGUgewotCWNsYXNzIFBhZ2VCb29rTGF5b3V0IGV4dGVuZHMgTGF5b3V0IGltcGxlbWVudHMgSUxheW91dEV4dGVuc2lvbiB7Ci0JCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwKLQkJCQlib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCAmJiBoSGludCAhPSBTV1QuREVGQVVMVCkKLQkJCQlyZXR1cm4gbmV3IFBvaW50KHdIaW50LCBoSGludCk7Ci0JCQlQb2ludCByZXN1bHQgPSBudWxsOwotCQkJaWYgKGN1cnJlbnRQYWdlICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBjdXJyZW50UGFnZS5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSBuZXcgUG9pbnQoMCwgMCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJCWlmIChjdXJyZW50UGFnZSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudFBhZ2Uuc2V0Qm91bmRzKGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCkpOwotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JTGF5b3V0RXh0ZW5zaW9uI2NvbXB1dGVNYXhpbXVtV2lkdGgob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXB1dGVNYXhpbXVtV2lkdGgoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JCQlyZXR1cm4gY29tcHV0ZVNpemUocGFyZW50LCBTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpLng7Ci0JCX0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLklMYXlvdXRFeHRlbnNpb24jY29tcHV0ZU1pbmltdW1XaWR0aChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JCSAqICAgICAgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyBpbnQgY29tcHV0ZU1pbmltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJCXJldHVybiBjb21wdXRlU2l6ZShwYXJlbnQsIDAsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKS54OwotCQl9Ci0JfQotCS8qKgotCSAqIFRoZSBjdXJyZW50IGNvbnRyb2w7IDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIGN1cnJlbnRQYWdlID0gbnVsbDsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVtcHR5IHBhZ2Vib29rLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgU1dUIHN0eWxlIGJpdHMKLQkgKi8KLQlwdWJsaWMgV3JhcHBlZFBhZ2VCb29rKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJc2V0TGF5b3V0KG5ldyBQYWdlQm9va0xheW91dCgpKTsKLQl9Ci0JLyoqCi0JICogU2hvd3MgdGhlIGdpdmVuIHBhZ2UuIFRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QgaWYgdGhlIGdpdmVuIHBhZ2UgaXMgbm90Ci0JICogY29udGFpbmVkIGluIHRoaXMgcGFnZWJvb2suCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIHRvIHNob3cKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93UGFnZShDb250cm9sIHBhZ2UpIHsKLQkJaWYgKHBhZ2UgPT0gY3VycmVudFBhZ2UpCi0JCQlyZXR1cm47Ci0JCWlmIChwYWdlLmdldFBhcmVudCgpICE9IHRoaXMpCi0JCQlyZXR1cm47Ci0JCUNvbnRyb2wgb2xkUGFnZSA9IGN1cnJlbnRQYWdlOwotCQljdXJyZW50UGFnZSA9IHBhZ2U7Ci0JCS8vIHNob3cgbmV3IHBhZ2UKLQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJaWYgKCFwYWdlLmlzRGlzcG9zZWQoKSkgewotCQkJCS8vcGFnZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCWxheW91dCh0cnVlKTsKLQkJCQlwYWdlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gaGlkZSBvbGQgKmFmdGVyKiBuZXcgcGFnZSBoYXMgYmVlbiBtYWRlIHZpc2libGUgaW4gb3JkZXIgdG8gYXZvaWQKLQkJLy8gZmxhc2hpbmcKLQkJaWYgKG9sZFBhZ2UgIT0gbnVsbCAmJiAhb2xkUGFnZS5pc0Rpc3Bvc2VkKCkpCi0JCQlvbGRQYWdlLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQlyZXR1cm4gKChQYWdlQm9va0xheW91dCkgZ2V0TGF5b3V0KCkpLmNvbXB1dGVTaXplKHRoaXMsIHdIaW50LCBoSGludCwKLQkJCQljaGFuZ2VkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9mb3Jtcy93aWRnZXRzL3Byb2dyZXNzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvcHJvZ3Jlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmEyMDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2Zvcm1zL3dpZGdldHMvcHJvZ3Jlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZWU4MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXh0ZW5zaW9ucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0NDI2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS51aS5pZGUgcGx1Z2luLgotCi0jIFR1cm4gb24gZGVidWdnaW5nIGZvciB0aGUgb3JnLmVjbGlwc2UudWkgcGx1Z2luLgotb3JnLmVjbGlwc2UudWkuaWRlL2RlYnVnPWZhbHNlCi0KLSMgU2hvdyBhIGRpYWxvZyB3aXRoIGRldGFpbHMgYnV0dG9uIHdoZW4gYW4gaW50ZXJuYWwgZXJyb3Igb2NjdXIuCi1vcmcuZWNsaXBzZS51aS5pZGUvZGVidWcvaW50ZXJuYWxlcnJvci9vcGVuRGlhbG9nPWZhbHNlCi0KLSMgVmVyYm9zZSBpbmZvcm1hdGlvbiB3aGVuIElERSBwZXJmb3JtcyBleHBsaWNpdCBnYXJiYWdlIGNvbGxlY3Rpb24KLW9yZy5lY2xpcHNlLnVpLmlkZS9kZWJ1Zy9nYz1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxYTI5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVpLmlkZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmhlbHA8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpmYWNlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkudmlld3M8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhYjczMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgRmViIDE1IDEzOjE0OjQ1IEVTVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wZXJmb3JtYW5jZS9tZXNzYWdlcy5wcm9wZXJ0aWVzPTg4NTlfMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWNiZTFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNNb24gT2N0IDI0IDE1OjE0OjI3IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjBkZDI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUdWUgT2N0IDE4IDE1OjE1OjU4IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmphdmFkb2M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGdldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyY29tbWVudCIgbmFtZVw9ImdldHRlcmNvbW1lbnQiPi8qKlxuICogQHJldHVybiBSZXR1cm5zIHRoZSAke2JhcmVfZmllbGRfbmFtZX0uXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyY29tbWVudCIgbmFtZVw9InNldHRlcmNvbW1lbnQiPi8qKlxuICogQHBhcmFtICR7cGFyYW19IFRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yY29tbWVudCIgbmFtZVw9ImNvbnN0cnVjdG9yY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpbGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCI+LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIENvcHlyaWdodCAoYykgJHt5ZWFyfSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcbiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHBcOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuICpcbiAqIENvbnRyaWJ1dG9yc1w6XG4gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9ImZhbHNlIiBjb250ZXh0XD0idHlwZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgdHlwZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMudHlwZWNvbW1lbnQiIG5hbWVcPSJ0eXBlY29tbWVudCI+LyoqXG4gKiBAc2luY2UgMy4yXG4gKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWVsZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGZpZWxkcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWVsZGNvbW1lbnQiIG5hbWVcPSJmaWVsZGNvbW1lbnQiPi8qKlxuICogXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG5vbi1vdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJvdmVycmlkZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5vdmVycmlkZWNvbW1lbnQiIG5hbWVcPSJvdmVycmlkZWNvbW1lbnQiPi8qIChub24tSmF2YWRvYylcbiAqICR7c2VlX3RvX292ZXJyaWRkZW59XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im5ld3R5cGVfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubmV3dHlwZSIgbmFtZVw9Im5ld3R5cGUiPiR7ZmlsZWNvbW1lbnR9XG4ke3BhY2thZ2VfZGVjbGFyYXRpb259XG5cbiR7dHlwZWNvbW1lbnR9XG4ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgbWV0aG9kIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5Ij4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2xhc3Nib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjbGFzcyB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jbGFzc2JvZHkiIG5hbWVcPSJjbGFzc2JvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJpbnRlcmZhY2Vib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBpbnRlcmZhY2UgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuaW50ZXJmYWNlYm9keSIgbmFtZVw9ImludGVyZmFjZWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJlbnVtYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgZW51bSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5lbnVtYm9keSIgbmFtZVw9ImVudW1ib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iYW5ub3RhdGlvbmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGFubm90YXRpb24gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuYW5ub3RhdGlvbmJvZHkiIG5hbWVcPSJhbm5vdGF0aW9uYm9keSI+XG48L3RlbXBsYXRlPjwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OGYzYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNUdWUgTm92IDE2IDE0OjExOjM3IEVTVCAyMDA0Ci1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNjdkMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUGx1Z2luLm5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVpLmlkZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUGx1Z2luLnByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UudWkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS5pZGUuZGlhbG9ncywKLSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1pc2M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUudXBkYXRlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuaWRlLAotIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5mcmFtZWxpc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MudGFza2xpc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2Zlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMubmV3cmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS51aS5tb2RlbCwKLSBvcmcuZWNsaXBzZS51aS5wYXJ0LAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXIsCi0gb3JnLmVjbGlwc2UudWkudmlld3MuZnJhbWVsaXN0LAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMsCi0gb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvciwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnRhc2tsaXN0LAotIG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLAotIG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLAotIG9yZy5lY2xpcHNlLmhlbHAsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UudWkudmlld3MsCi0gb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvciwKLSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZSwKLSBvcmcuZWNsaXBzZS51cGRhdGUudWksCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucwotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmMxYjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotc291cmNlLi4gPSBleHRlbnNpb25zLyxcCi0gICAgICAgICAgICAgICAgIHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDIwYTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL2NvbXBvbmVudCIKLSAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9lY2xpcHNlLm9yZy9jb21wb25lbnQgLi4vY29tcG9uZW50LnhzZCAiCi0gICBuYW1lPSJQbGF0Zm9ybSBVSSBJREUiPgotIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZSIgLz4KLSA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eSIgZnJhZ21lbnQ9InRydWUiIC8+Ci0gPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkud2luMzIiIGZyYWdtZW50PSJ0cnVlIiAvPgotCi08cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aSIgZXhjbHVzaXZlPSJmYWxzZSIgPgotICA8dHlwZSBuYW1lPSJJQ2FwYWJpbGl0eUluc3RhbGxXaXphcmQiLz4KLSAgPHR5cGUgbmFtZT0iSUNhcGFiaWxpdHlVbmluc3RhbGxXaXphcmQiLz4KLSAgPHR5cGUgbmFtZT0iSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyIi8+Ci0gIDx0eXBlIG5hbWU9IklGaWxlRWRpdG9ySW5wdXQiLz4KLSAgPHR5cGUgbmFtZT0iSU1hcmtlckFjdGlvbkZpbHRlciIvPgotICA8dHlwZSBuYW1lPSJJTWFya2VySGVscFJlZ2lzdHJ5Ii8+Ci0gIDx0eXBlIG5hbWU9IklNYXJrZXJSZXNvbHV0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IklNYXJrZXJSZXNvbHV0aW9uMiIvPgotICA8dHlwZSBuYW1lPSJJTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIvPgotICA8dHlwZSBuYW1lPSJJTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcjIiLz4KLSAgPHR5cGUgbmFtZT0iSVByb2plY3RBY3Rpb25GaWx0ZXIiIC8+Ci0gIDx0eXBlIG5hbWU9IklSZXNvdXJjZUFjdGlvbkZpbHRlciIvPgotICA8dHlwZSBuYW1lPSJJU3RvcmFnZUVkaXRvcklucHV0Ii8+Ci0gIDx0eXBlIG5hbWU9IlJlc291cmNlV29ya2luZ1NldEZpbHRlciIvPgotPC9wYWNrYWdlPgotCi08cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aS5hY3Rpb25zIiBleGNsdXNpdmU9ImZhbHNlIiA+Ci0gIDx0eXBlIG5hbWU9IkFkZEJvb2ttYXJrQWN0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iQWRkVGFza0FjdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IkJ1aWxkQWN0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iQ2xvc2VSZXNvdXJjZUFjdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24iIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJDb3B5UHJvamVjdEFjdGlvbiIvPgotICA8dHlwZSBuYW1lPSJDb3B5UHJvamVjdE9wZXJhdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IkNvcHlSZXNvdXJjZUFjdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IkNyZWF0ZUZpbGVBY3Rpb24iIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJDcmVhdGVGb2xkZXJBY3Rpb24iIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJDcmVhdGVQcm9qZWN0QWN0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IkRlbGV0ZVJlc291cmNlQWN0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iR2xvYmFsQnVpbGRBY3Rpb24iIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJNb3ZlRmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iTW92ZVByb2plY3RBY3Rpb24iLz4KLSAgPHR5cGUgbmFtZT0iTW92ZVJlc291cmNlQWN0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iTmV3RXhhbXBsZUFjdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9Ik5ld1Byb2plY3RBY3Rpb24iIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJOZXdXaXphcmRNZW51Ii8+Ci0gIDx0eXBlIG5hbWU9Ik9wZW5GaWxlQWN0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iT3BlblJlc291cmNlQWN0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iT3BlblN5c3RlbUVkaXRvckFjdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9Ik9wZW5XaXRoTWVudSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlF1aWNrU3RhcnRBY3Rpb24iLz4KLSAgPHR5cGUgbmFtZT0iUmVhZE9ubHlTdGF0ZUNoZWNrZXIiLz4KLSAgPHR5cGUgbmFtZT0iUmVmcmVzaEFjdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlJlbmFtZVJlc291cmNlQWN0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iU2NydWJMb2NhbEFjdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IlRleHRBY3Rpb25IYW5kbGVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iV29ya3NwYWNlQWN0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IldvcmtzcGFjZU1vZGlmeURlbGVnYXRpbmdPcGVyYXRpb24iIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24iLz4KLTwvcGFja2FnZT4KLQotPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkuZGlhbG9ncyIgZXhjbHVzaXZlPSJmYWxzZSIgPgotICA8dHlwZSBuYW1lPSJDb250YWluZXJHZW5lcmF0b3IiIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJDb250YWluZXJTZWxlY3Rpb25EaWFsb2ciIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJGaWxlU2VsZWN0aW9uRGlhbG9nIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iTWFya2VyUmVzb2x1dGlvblNlbGVjdGlvbkRpYWxvZyIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9Ik5ld0ZvbGRlckRpYWxvZyIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlByb2plY3RMb2NhdGlvbk1vdmVEaWFsb2ciLz4KLSAgPHR5cGUgbmFtZT0iUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nIi8+Ci0gIDx0eXBlIG5hbWU9IlJlc291cmNlTGlzdFNlbGVjdGlvbkRpYWxvZyIvPgotICA8dHlwZSBuYW1lPSJSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlNhdmVBc0RpYWxvZyIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IldpemFyZERhdGFUcmFuc2ZlclBhZ2UiIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJXaXphcmRFeHBvcnRQYWdlIi8+Ci0gIDx0eXBlIG5hbWU9IldpemFyZEV4cG9ydFJlc291cmNlc1BhZ2UiLz4KLSAgPHR5cGUgbmFtZT0iV2l6YXJkSW1wb3J0UGFnZSIvPgotICA8dHlwZSBuYW1lPSJXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIi8+Ci0gIDx0eXBlIG5hbWU9IldpemFyZE5ld0ZvbGRlck1haW5QYWdlIi8+Ci0gIDx0eXBlIG5hbWU9IldpemFyZE5ld0xpbmtQYWdlIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSIvPgotICA8dHlwZSBuYW1lPSJXaXphcmROZXdQcm9qZWN0UmVmZXJlbmNlUGFnZSIvPgotICA8dHlwZSBuYW1lPSJXaXphcmRSZXNvdXJjZUltcG9ydFBhZ2UiLz4KLTwvcGFja2FnZT4KLQotPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkubW9kZWwiIGV4Y2x1c2l2ZT0iZmFsc2UiID4KLSAgPHR5cGUgbmFtZT0iV29ya2JlbmNoQ29udGVudFByb3ZpZGVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLTwvcGFja2FnZT4KLQotPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkucGFydCIgZXhjbHVzaXZlPSJmYWxzZSIgPgotICA8dHlwZSBuYW1lPSJGaWxlRWRpdG9ySW5wdXQiIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJGaWxlRWRpdG9ySW5wdXRGYWN0b3J5IiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJGaWxlSW5QbGFjZUVkaXRvcklucHV0IiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iTWFya2VyVHJhbnNmZXIiIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJSZXNvdXJjZVRyYW5zZmVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLTwvcGFja2FnZT4KLQotPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkuaWRlIiA+Ci0gIDx0eXBlIG5hbWU9IklERSIvPgotICA8dHlwZSBuYW1lPSJJREVBY3Rpb25GYWN0b3J5Ii8+Ci0gIDx0eXBlIG5hbWU9IklERUVuY29kaW5nIi8+Ci0gIDx0eXBlIG5hbWU9IklHb3RvTWFya2VyIi8+Ci0gIDx0eXBlIG5hbWU9IklJREVBY3Rpb25Db25zdGFudHMiIGltcGxlbWVudD0iZmFsc2UiLz4KLTwvcGFja2FnZT4KLQotPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkuaWRlLmRpYWxvZ3MiID4KLSAgPHR5cGUgbmFtZT0iQWJzdHJhY3RFbmNvZGluZ0ZpZWxkRWRpdG9yIi8+Ci0gIDx0eXBlIG5hbWU9IkVuY29kaW5nRmllbGRFZGl0b3IiLz4KLSAgPHR5cGUgbmFtZT0iUmVzb3VyY2VFbmNvZGluZ0ZpZWxkRWRpdG9yIi8+Ci08L3BhY2thZ2U+Ci0KLTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXIiID4KLSAgPHR5cGUgbmFtZT0iQm9va21hcmtOYXZpZ2F0b3IiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci08L3BhY2thZ2U+Ci0KLTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLmZyYW1lbGlzdCIgPgotICA8dHlwZSBuYW1lPSJCYWNrQWN0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IkZvcndhcmRBY3Rpb24iLz4KLSAgPHR5cGUgbmFtZT0iRnJhbWUiLz4KLSAgPHR5cGUgbmFtZT0iRnJhbWVBY3Rpb24iLz4KLSAgPHR5cGUgbmFtZT0iRnJhbWVMaXN0Ii8+Ci0gIDx0eXBlIG5hbWU9IkdvSW50b0FjdGlvbiIvPgotICA8dHlwZSBuYW1lPSJJRnJhbWVTb3VyY2UiLz4KLSAgPHR5cGUgbmFtZT0iVHJlZUZyYW1lIi8+Ci0gIDx0eXBlIG5hbWU9IlRyZWVWaWV3ZXJGcmFtZVNvdXJjZSIvPgotICA8dHlwZSBuYW1lPSJVcEFjdGlvbiIvPgotPC9wYWNrYWdlPgotCi08cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzIiA+Ci0gIDx0eXBlIG5hbWU9Ik1hcmtlclZpZXdVdGlsIi8+Ci08L3BhY2thZ2U+Ci0KLTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvciIgPgotICA8dHlwZSBuYW1lPSJDb2xsYXBzZUFsbEFjdGlvbiIvPgotICA8dHlwZSBuYW1lPSJGaWx0ZXJTZWxlY3Rpb25BY3Rpb24iLz4KLSAgPHR5cGUgbmFtZT0iR290b0FjdGlvbkdyb3VwIi8+Ci0gIDx0eXBlIG5hbWU9IkdvdG9SZXNvdXJjZUFjdGlvbiIvPgotICA8dHlwZSBuYW1lPSJJUmVzb3VyY2VOYXZpZ2F0b3IiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iTG9jYWxTZWxlY3Rpb25UcmFuc2ZlciIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9Ik1haW5BY3Rpb25Hcm91cCIvPgotICA8dHlwZSBuYW1lPSJOYXZpZ2F0b3JEcmFnQWRhcHRlciIvPgotICA8dHlwZSBuYW1lPSJOYXZpZ2F0b3JEcm9wQWRhcHRlciIvPgotICA8dHlwZSBuYW1lPSJOYXZpZ2F0b3JGcmFtZVNvdXJjZSIvPgotICA8dHlwZSBuYW1lPSJPcGVuQWN0aW9uR3JvdXAiLz4KLSAgPHR5cGUgbmFtZT0iUmVmYWN0b3JBY3Rpb25Hcm91cCIvPgotICA8dHlwZSBuYW1lPSJSZXNvdXJjZU5hdmlnYXRvciIvPgotICA8dHlwZSBuYW1lPSJSZXNvdXJjZU5hdmlnYXRvckFjdGlvbiIvPgotICA8dHlwZSBuYW1lPSJSZXNvdXJjZU5hdmlnYXRvckFjdGlvbkdyb3VwIi8+Ci0gIDx0eXBlIG5hbWU9IlJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMiLz4KLSAgPHR5cGUgbmFtZT0iUmVzb3VyY2VOYXZpZ2F0b3JNb3ZlQWN0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IlJlc291cmNlTmF2aWdhdG9yUmVuYW1lQWN0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IlJlc291cmNlUGF0dGVybkZpbHRlciIvPgotICA8dHlwZSBuYW1lPSJSZXNvdXJjZVNlbGVjdGlvblV0aWwiIGluc3RhbnRpYXRlPSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlJlc291cmNlU29ydGVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iU2hvd0luTmF2aWdhdG9yQWN0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IlNvcnRBbmRGaWx0ZXJBY3Rpb25Hcm91cCIvPgotICA8dHlwZSBuYW1lPSJTb3J0Vmlld0FjdGlvbiIvPgotICA8dHlwZSBuYW1lPSJUb2dnbGVMaW5raW5nQWN0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IldvcmtzcGFjZUFjdGlvbkdyb3VwIi8+Ci08L3BhY2thZ2U+Ci0KLTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMiIGV4Y2x1c2l2ZT0iZmFsc2UiID4KLSAgPHR5cGUgbmFtZT0iRmlsZVByb3BlcnR5U291cmNlIi8+Ci0gIDx0eXBlIG5hbWU9IklERVByb3BlcnRpZXNNZXNzYWdlcyIvPgotICA8dHlwZSBuYW1lPSJJUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50cyIvPgotICA8dHlwZSBuYW1lPSJSZXNvdXJjZVByb3BlcnR5U291cmNlIi8+Ci08L3BhY2thZ2U+Ci0KLTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnRhc2tsaXN0IiA+Ci0gIDx0eXBlIG5hbWU9IklUYXNrTGlzdFJlc291cmNlQWRhcHRlciIvPgotICA8dHlwZSBuYW1lPSJUYXNrTGlzdCIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iVGFza1Byb3BlcnRpZXNEaWFsb2ciLz4KLTwvcGFja2FnZT4KLQotPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIiID4KLSAgPHR5cGUgbmFtZT0iRXh0ZXJuYWxQcm9qZWN0SW1wb3J0V2l6YXJkIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iRmlsZVN5c3RlbUV4cG9ydFdpemFyZCIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IkZpbGVTeXN0ZW1JbXBvcnRXaXphcmQiIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIiLz4KLSAgPHR5cGUgbmFtZT0iSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIi8+Ci0gIDx0eXBlIG5hbWU9IkltcG9ydE9wZXJhdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlBvcHVsYXRlRWxlbWVudE9wZXJhdGlvbiIvPgotICA8dHlwZSBuYW1lPSJQb3B1bGF0ZVJvb3RPcGVyYXRpb24iLz4KLSAgPHR5cGUgbmFtZT0iU2VsZWN0RmlsZXNPcGVyYXRpb24iLz4KLSAgPHR5cGUgbmFtZT0iV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZSIvPgotICA8dHlwZSBuYW1lPSJaaXBGaWxlRXhwb3J0V2l6YXJkIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iWmlwRmlsZUltcG9ydFdpemFyZCIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciIvPgotPC9wYWNrYWdlPgotCi08cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlIiA+Ci0gIDx0eXBlIG5hbWU9IkJhc2ljTmV3RmlsZVJlc291cmNlV2l6YXJkIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iQmFzaWNOZXdGb2xkZXJSZXNvdXJjZVdpemFyZCIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IkJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iQmFzaWNOZXdSZXNvdXJjZVdpemFyZCIgc3ViY2xhc3M9ImZhbHNlIi8+Ci08L3BhY2thZ2U+Ci0KLSA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIi8+Ci0KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9JQ2FwYWJpbGl0eUluc3RhbGxXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSUNhcGFiaWxpdHlJbnN0YWxsV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZDFmMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9JQ2FwYWJpbGl0eUluc3RhbGxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBwcm9qZWN0IGNhcGFiaWxpdHkgaW5zdGFsbCB3aXphcmQuIFRoZSB3aXphcmQgaXMKLSAqIHJlc3BvbnNpYmxlIGZvciBjb2xsZWN0aW5nIGFueSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUKLSAqIHVzZXIuCi0gKiA8cD4KLSAqIFRoZSBpbnN0YWxsIHdpemFyZCBtdXN0IG9ubHkgYWRkIG5hdHVyZXMgdGhhdCByZXByZXNlbnQgdGhlCi0gKiBjYXBhYmlsaXR5IGFuZCBhbnkgY2FwYWJpbGl0aWVzIGl0IGhhbmRsZXMgdGhlIFVJIGZvci4gVGhlCi0gKiBpbnN0YWxsIHdpemFyZCBtdXN0IGhhbmRsZSB0aGUgc2l0dWF0aW9uIHdoZXJlIHNvbWUgb3IgYWxsCi0gKiBvZiB0aGUgcmVxdWlyZWQgY2FwYWJpbGl0ZXMgYXJlIGFscmVhZHkgaW5zdGFsbGVkLgotICogPC9wPjxwPgotICogVGhlIDxjb2RlPklQcm9qZWN0PC9jb2RlPiBwYXNzZWQgaW4gdGhlIGluaXQgbWV0aG9kIHdpbGwgZXhpc3QKLSAqIGFuZCBjYW4gYmUgcXVlcmllZCBmb3IgdGhlIGV4aXN0YW5jZSBvZiBvdGhlciBuYXR1cmVzLiBUaGUKLSAqIGluc3RhbGwgd2l6YXJkIG11c3QgPGI+bm90PC9iPiBjbG9zZSBub3IgZGVsZXRlIHRoZSBwcm9qZWN0Ci0gKiBwYXNzZWQgaW4gdGhlIGluaXQgbWV0aG9kLiBUaGUgaW5zdGFsbCB3aXphcmQgbXVzdCA8Yj5ub3Q8L2I+Ci0gKiByZW5hbWUgdGhlIHByb2plY3QgcGFzc2VkIGluIHRoZSBpbml0IG1ldGhvZC4KLSAqIDwvcD48cD4KLSAqIFRoZSBpbnN0YWxsIHdpemFyZCBjYW4gY2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvamVjdCBpZgotICogcmVxdWlyZWQsIGJ1dCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGlzIGFjdGlvbi4KLSAqIDwvcD48cD4KLSAqIENsaWVudHMgc2hvdWxkIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBhbmQgaW5jbHVkZSB0aGUgbmFtZSBvZiB0aGVpciBjbGFzcwotICogaW4gYW4gZXh0ZW5zaW9uIGNvbnRyaWJ1dGVkIHRvIHRoZSB3b3JrYmVuY2gncyBjYXBhYmlsaXRpZXMgd2l6YXJkIGV4dGVuc2lvbiBwb2ludCAKLSAqIChuYW1lZCA8Y29kZT4ib3JnLmVjbGlwc2UudWkuY2FwYWJpbGl0aWVzIjwvY29kZT4pLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5OT1RFOjwvYj4gVGhpcyBpcyBleHBlcmltZW50YWwgQVBJLCB3aGljaCBtYXkgYmUgY2hhbmdlZCBvciByZW1vdmVkIGF0IGFueSBwb2ludAotICogaW4gdGltZS4gVGhpcyBBUEkgc2hvdWxkIG5vdCBiZSBjYWxsZWQsIG92ZXJyaWRkZW4gb3Igb3RoZXJ3aXNlIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQKLSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUNhcGFiaWxpdHlVbmluc3RhbGxXaXphcmQKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2FwYWJpbGl0eUluc3RhbGxXaXphcmQgZXh0ZW5kcyBJV2l6YXJkIHsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoaXMgY2FwYWJpbGl0eSB3aXphcmQgdXNpbmcgdGhlIHBhc3NlZCB3b3JrYmVuY2gsCi0gICAgICogb2JqZWN0IHNlbGVjdGlvbiwgYW5kIHByb2plY3QuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBhbmQKLSAgICAgKiBiZWZvcmUgb3RoZXIgbWV0aG9kcyBhcmUgY2FsbGVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3b3JrYmVuY2ggdGhlIGN1cnJlbnQgd29ya2JlbmNoCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgY3VycmVudCBvYmplY3Qgc2VsZWN0aW9uCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gY29uZmlndXJlIHdpdGggYSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLAotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL0lDYXBhYmlsaXR5VW5pbnN0YWxsV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL0lDYXBhYmlsaXR5VW5pbnN0YWxsV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDlhY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9JQ2FwYWJpbGl0eVVuaW5zdGFsbFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHByb2plY3QgY2FwYWJpbGl0eSB1bmluc3RhbGwgd2l6YXJkLiBUaGUgd2l6YXJkIGlzCi0gKiByZXNwb25zaWJsZSBmb3IgY29sbGVjdGluZyBhbnkgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlCi0gKiB1c2VyIGFuZCByZW1vdmluZyB0aGlzIGNhcGFiaWxpdHkncyBuYXR1cmUuIEFsc28gbXVzdCByZW1vdmUgbmF0dXJlcwotICogZnJvbSBjYXBhYmlsaXRpZXMgdGhhdCB0aGUgdXNlciB3YW50cyByZW1vdmVkIC0gY2FwYWJpbGl0ZXMgdGhhdCB0aGlzCi0gKiBjYXBhYmlsaXR5IGhhbmRsZXMgdGhlIFVJIGZvci4gVGhlc2Ugb3RoZXIgY2FwYWJpbGl0aWVzIHRoYXQgdGhlIHVzZXIKLSAqIHdhbnRzIHJlbW92ZWQgd2lsbCBiZSBwcm92aWRlZCBpbiB0aGUgPGNvZGU+aW5pdDwvY29kZT4gbWV0aG9kLgotICogPHA+Ci0gKiBUaGUgdW5pbnN0YWxsIHdpemFyZCBtdXN0IG9ubHkgcmVtb3ZlIG5hdHVyZXMgdGhhdCBhcmUgcGFzc2VkIGluCi0gKiBpdHMgPGNvZGU+aW5pdDwvY29kZT4gbWV0aG9kLgotICogPC9wPjxwPgotICogVGhlIDxjb2RlPklQcm9qZWN0PC9jb2RlPiBwYXNzZWQgaW4gdGhlIGluaXQgbWV0aG9kIHdpbGwgZXhpc3QKLSAqIGFuZCBjYW4gYmUgcXVlcmllZCBmb3IgdGhlIGV4aXN0YW5jZSBvZiBvdGhlciBuYXR1cmVzLiBUaGUKLSAqIHVuaW5zdGFsbCB3aXphcmQgbXVzdCA8Yj5ub3Q8L2I+IGNsb3NlIG5vciBkZWxldGUgdGhlIHByb2plY3QKLSAqIHBhc3NlZCBpbiB0aGUgPGNvZGU+aW5pdDwvY29kZT4gbWV0aG9kLiBUaGUgaW5zdGFsbCB3aXphcmQgbXVzdAotICogPGI+bm90PC9iPiByZW5hbWUgdGhlIHByb2plY3QgcGFzc2VkIGluIHRoZSA8Y29kZT5pbml0PC9jb2RlPiBtZXRob2QuCi0gKiA8L3A+PHA+Ci0gKiBUaGUgdW5pbnN0YWxsIHdpemFyZCBjYW4gY2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvamVjdCBpZgotICogcmVxdWlyZWQsIGJ1dCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGlzIGFjdGlvbi4KLSAqIDwvcD48cD4KLSAqIENsaWVudHMgc2hvdWxkIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBhbmQgaW5jbHVkZSB0aGUgbmFtZSBvZiB0aGVpciBjbGFzcwotICogaW4gYW4gZXh0ZW5zaW9uIGNvbnRyaWJ1dGVkIHRvIHRoZSB3b3JrYmVuY2gncyBjYXBhYmlsaXRpZXMgd2l6YXJkIGV4dGVuc2lvbiBwb2ludCAKLSAqIChuYW1lZCA8Y29kZT4ib3JnLmVjbGlwc2UudWkuY2FwYWJpbGl0aWVzIjwvY29kZT4pLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5OT1RFOjwvYj4gVGhpcyBpcyBleHBlcmltZW50YWwgQVBJLCB3aGljaCBtYXkgYmUgY2hhbmdlZCBvciByZW1vdmVkIGF0IGFueSBwb2ludAotICogaW4gdGltZS4gVGhpcyBBUEkgc2hvdWxkIG5vdCBiZSBjYWxsZWQsIG92ZXJyaWRkZW4gb3Igb3RoZXJ3aXNlIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQKLSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUNhcGFiaWxpdHlJbnN0YWxsV2l6YXJkCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhcGFiaWxpdHlVbmluc3RhbGxXaXphcmQgZXh0ZW5kcyBJV2l6YXJkIHsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoaXMgY2FwYWJpbGl0eSB3aXphcmQgdXNpbmcgdGhlIHBhc3NlZCB3b3JrYmVuY2gsCi0gICAgICogb2JqZWN0IHNlbGVjdGlvbiwgcHJvamVjdCwgYW5kIG5hdHVyZSBJRHMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBhbmQKLSAgICAgKiBiZWZvcmUgb3RoZXIgbWV0aG9kcyBhcmUgY2FsbGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgbGlzdCBvZiBuYXR1cmUgSURzIGNvbnRhaW5zIHRoZSBuYXR1cmUgSUQgZm9yIHRoaXMKLSAgICAgKiBjYXBhYmlsaXR5LiBBbHNvIGluY2x1ZGVzIG5hdHVyZSBJRHMgZm9yIGNhcGFiaWxpdGllcyB0aGF0Ci0gICAgICogdGhlIHVzZXIgd2FudHMgcmVtb3ZlZCAtIGNhcGFiaWxpdGVzIHRoYXQgdGhpcyBjYXBhYmlsaXR5Ci0gICAgICogaGFuZGxlcyB0aGUgVUkgZm9yLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3b3JrYmVuY2ggdGhlIGN1cnJlbnQgd29ya2JlbmNoCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgY3VycmVudCBvYmplY3Qgc2VsZWN0aW9uCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gY29uZmlndXJlIHdpdGggYSBjYXBhYmlsaXR5Ci0gICAgICogQHBhcmFtIG5hdHVyZUlkcyB0aGUgbmF0dXJlIGlkcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIHByb2plY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sCi0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBuYXR1cmVJZHMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9JQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MmM3OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9JQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotLyoqCi0gKiBUaGUgSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyIGlzIGFuIGludGVyZmFjZSB0aGF0IGRlZmluZXMKLSAqIHRoZSBBUEkgcmVxdWlyZWQgdG8gZ2V0IGEgcmVzb3VyY2UgdGhhdCBhbiBvYmplY3QgYWRhcHRzIHRvCi0gKiBmb3IgdXNlIG9mIG9iamVjdCBjb250cmlidXRpb25zLCBkZWNvcmF0b3JzIGFuZCBwcm9wZXJ0eQotICogcGFnZXMgdGhhdCBoYXZlIGFkYXB0YWJsZSA9IHRydWUuCi0gKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIHR5cGljYWxseSByZWdpc3RlcmVkIHdpdGggYW4KLSAqIElBZGFwdGVyRmFjdG9yeSBmb3IgbG9va3VwIHZpYSB0aGUgZ2V0QWRhcHRlcigpIG1lY2hhbmlzbS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSByZXNvdXJjZSB0aGF0IHRoZSBzdXBwbGllZCBhZGFwdGFibGUgCi0gICAgICogYWRhcHRzIHRvLiBBbiBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIgYXNzdW1lcwotICAgICAqIHRoYXQgYW55IG9iamVjdCBwYXNzZWQgdG8gaXQgYWRhcHRzIHRvIG9uZSBlcXVpdmFsZW50Ci0gICAgICogcmVzb3VyY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFkYXB0YWJsZSB0aGUgYWRhcHRhYmxlIGJlaW5nIHF1ZXJpZWQKLSAgICAgKiBAcmV0dXJuIGEgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlCi0gICAgICogCWlzIG5vIGFkYXB0ZWQgcmVzb3VyY2UgZm9yIHRoaXMgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBJUmVzb3VyY2UgZ2V0QWRhcHRlZFJlc291cmNlKElBZGFwdGFibGUgYWRhcHRhYmxlKTsKLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL0lGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSUZpbGVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjE0OTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSUZpbGVFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGZpbGUtb3JpZW50ZWQgaW5wdXQgdG8gYW4gZWRpdG9yLgotICogPHA+Ci0gKiBDbGllbnRzIGltcGxlbWVudGluZyB0aGlzIGVkaXRvciBpbnB1dCBpbnRlcmZhY2Ugc2hvdWxkIG92ZXJyaWRlCi0gKiA8Y29kZT5PYmplY3QuZXF1YWxzKE9iamVjdCk8L2NvZGU+IHRvIGFuc3dlciB0cnVlIGZvciB0d28gaW5wdXRzCi0gKiB0aGF0IGFyZSB0aGUgc2FtZS4gVGhlIDxjb2RlPklXb3JiZW5jaFBhZ2Uub3BlbkVkaXRvcjwvY29kZT4gQVBJcwotICogYXJlIGRlcGVuZGVudCBvbiB0aGlzIHRvIGZpbmQgYW4gZWRpdG9yIHdpdGggdGhlIHNhbWUgaW5wdXQuCi0gKiA8L3A+PHA+Ci0gKiBGaWxlLW9yaWVudGVkIGVkaXRvcnMgc2hvdWxkIHN1cHBvcnQgdGhpcyBhcyBhIHZhbGlkIGlucHV0IHR5cGUsIGFuZCBhbGxvdwotICogZnVsbCByZWFkLXdyaXRlIGVkaXRpbmcgb2YgaXRzIGNvbnRlbnQuCi0gKiA8L3A+PHA+Ci0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgCi0gKiBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dC4gIAotICogPC9wPjxwPgotICogQWxsIGVkaXRvciBpbnB1dHMgbXVzdCBpbXBsZW1lbnQgdGhlIDxjb2RlPklBZGFwdGFibGU8L2NvZGU+IGludGVyZmFjZTsKLSAqIGV4dGVuc2lvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIHBsYXRmb3JtJ3MgYWRhcHRlciBtYW5hZ2VyLgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmlsZUVkaXRvcklucHV0IGV4dGVuZHMgSVN0b3JhZ2VFZGl0b3JJbnB1dCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsZSByZXNvdXJjZSB1bmRlcmx5aW5nIHRoaXMgZWRpdG9yIGlucHV0LgotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5JRmlsZTwvY29kZT4gcmV0dXJuZWQgY2FuIGJlIGEgaGFuZGxlIHRvIGEgcmVzb3VyY2UKLSAgICAgKiB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuIEFzIHN1Y2gsIGFuIGVkaXRvciBzaG91bGQKLSAgICAgKiBwcm92aWRlIGFwcHJvcHJpYXRlIGZlZWRiYWNrIHRvIHRoZSB1c2VyIGluc3RlYWQgb2Ygc2ltcGx5IGZhaWxpbmcKLSAgICAgKiBkdXJpbmcgaW5wdXQgdmFsaWRhdGlvbi4gRm9yIGV4YW1wbGUsIGEgdGV4dCBlZGl0b3IgY291bGQgb3BlbgotICAgICAqIGluIHJlYWQtb25seSBtb2RlIHdpdGggYSBtZXNzYWdlIGluIHRoZSB0ZXh0IGFyZWEgdG8gaW5mb3JtIHRoZQotICAgICAqIHVzZXIgdGhhdCB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB1bmRlcmx5aW5nIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9JTWFya2VyQWN0aW9uRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL0lNYXJrZXJBY3Rpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg1ZDYwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL0lNYXJrZXJBY3Rpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aTsKLQotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcHVibGljIGF0dHJpYnV0ZXMgZm9yIGEgbWFya2VyIGFuZCB0aGUgYWNjZXB0YWJsZSB2YWx1ZXMKLSAqIGVhY2ggbWF5IGhhdmUuICAKLSAqIDxwPgotICogQSBwb3B1cCBtZW51IGV4dGVuc2lvbiBtYXkgdXNlIHRoZXNlIGNvbnN0YW50cyB0byBkZXNjcmliZSBpdHMgb2JqZWN0IHRhcmdldC4gIAotICogRWFjaCBpZGVudGlmaWVzIGFuIGF0dHJpYnV0ZSBuYW1lIG9yIHBvc3NpYmxlIHZhbHVlLiAgCi0gKiA8cD4KLSAqIENsaWVudHMgYXJlIG5vdCBleHBlY3RlZCB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBJQWN0aW9uRmlsdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1hcmtlckFjdGlvbkZpbHRlciBleHRlbmRzIElBY3Rpb25GaWx0ZXIgewotICAgIC8qKgotICAgICAqIEFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBtYXJrZXIgdHlwZSAodmFsdWUgPGNvZGU+InR5cGUiPC9jb2RlPikuICAKLSAgICAgKiBUaGUgYXR0cmlidXRlIHZhbHVlIGluIHhtbCBzaG91bGQgbWF0Y2ggb25lIG9mIHRoZSBtYXJrZXIgdHlwZXMgZGVmaW5lZCBpbiAKLSAgICAgKiB0aGUgd29ya2JlbmNoJ3MgbWFya2VyIGV4dGVuc2lvbiBwb2ludC4gIENvbW1vbiBleGFtcGxlcyBhcmUgCi0gICAgICogPGNvZGU+SU1hcmtlci5UQVNLLCBJTWFya2VyLkJPT0tNQVJLLCBhbmQgSU1hcmtlci5NQVJLRVI8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBtYXJrZXIgc3VwZXIgdHlwZSAodmFsdWUgPGNvZGU+InN1cGVyVHlwZSI8L2NvZGU+KS4gIAotICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4geG1sIHNob3VsZCBtYXRjaCBvbmUgb2YgdGhlIG1hcmtlciB0eXBlcyBkZWZpbmVkIGluIAotICAgICAqIHRoZSB3b3JrYmVuY2gncyBtYXJrZXIgZXh0ZW5zaW9uIHBvaW50LiAgQ29tbW9uIGV4YW1wbGVzIGFyZSAKLSAgICAgKiA8Y29kZT5JTWFya2VyLlRBU0ssIElNYXJrZXIuQk9PS01BUkssIGFuZCBJTWFya2VyLk1BUktFUjwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJfVFlQRSA9ICJzdXBlclR5cGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBBbiBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgbWFya2VyIHByaW9yaXR5ICh2YWx1ZSA8Y29kZT4icHJpb3JpdHkiPC9jb2RlPikuCi0gICAgICogVGhlIGF0dHJpYnV0ZSB2YWx1ZSBpbiB4bWwgbXVzdCBiZSBvbmUgb2YgPGNvZGU+SU1hcmtlci5QUklPUklUWV9MT1csIAotICAgICAqIElNYXJrZXIuUFJJT1JJVFlfTk9STUFMLCBvciBJTWFya2VyLlBSSU9SSVRZX0hJR0g8L2NvZGU+IAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZID0gInByaW9yaXR5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQW4gYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIG1hcmtlciBzZXZlcml0eSAodmFsdWUgPGNvZGU+InNldmVyaXR5IjwvY29kZT4pLiAgCi0gICAgICogVGhlIGF0dHJpYnV0ZSB2YWx1ZSBpbiB4bWwgaW4geG1sIG11c3QgYmUgb25lIG9mIDxjb2RlPklNYXJrZXIuU0VWRVJJVFlfRVJST1IsIAotICAgICAqIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgb3IgSU1hcmtlci5TRVZFUklUWV9JTkZPPC9jb2RlPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVZFUklUWSA9ICJzZXZlcml0eSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcmtlciBpcyBjb25zaWRlcmVkIGRvbmUgKHZhbHVlIAotICAgICAqIDxjb2RlPiJkb25lIjwvY29kZT4pLgotICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4geG1sIG11c3QgYmUgb25lIG9mIDxjb2RlPiJ0cnVlIiBvciAiZmFsc2UiPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET05FID0gImRvbmUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBBbiBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgbWFya2VyIG1lc3NhZ2UgKHZhbHVlIDxjb2RlPiJtZXNzYWdlIjwvY29kZT4pLgotICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4geG1sIGlzIHVuY29uc3RyYWluZWQuICIqIiBtYXkgYmUgdXNlZCBhdCB0aGUgc3RhcnQgb3IKLSAgICAgKiB0aGUgZW5kIHRvIHJlcHJlc2VudCAib25lIG9yIG1vcmUgY2hhcmFjdGVycyIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRSA9ICJtZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQW4gYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYXJrZXIKLSAgICAgKiAodmFsdWUgPGNvZGU+InJlc291cmNlVHlwZSI8L2NvZGU+KS4gVGhlIGF0dHJpYnV0ZSB2YWx1ZSBpbiB4bWwgbXVzdCBiZQotICAgICAqIG9uZSBvZiA8Y29kZT5JUmVzb3VyY2UuRklMRSwgSVJlc291cmNlLlBST0pFQ1QsIElSZXNvdXJjZS5GT0xERVIsCi0gICAgICogb3IgSVJlc291cmNlLlJPT1Q8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1RZUEUgPSAicmVzb3VyY2VUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL0lNYXJrZXJIZWxwUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSU1hcmtlckhlbHBSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzk0OGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSU1hcmtlckhlbHBSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLQotLyoqIAotICogUmVnaXN0cnkgb2YgRjEgaGVscCBjb250ZXh0cyBhbmQgcmVzb2x1dGlvbnMgZm9yIG1hcmtlcnMuCi0gKiA8cD4KLSAqIFRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIHJlZ2lzdHJ5IGlzIHJlYWQgZnJvbSB0aGUgCi0gKiBvcmcuZWNsaXBzZS51aS5tYXJrZXJoZWxwIGFuZCBvcmcuZWNsaXBzZS51aS5tYXJrZXJyZXNvbHV0aW9uCi0gKiBleHRlbnNpb24gcG9pbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1hcmtlckhlbHBSZWdpc3RyeSB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGhlbHAgY29udGV4dCBpZCBmb3IgdGhlIGdpdmVuIG1hcmtlciBvcgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGhlbHAgaGFzIGJlZW4gcmVnaXN0ZXJlZCAKLSAgICAgKiBmb3IgdGhlIG1hcmtlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIgZm9yIHdoaWNoIHRvIG9idGFpbiBoZWxwCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVscChJTWFya2VyIG1hcmtlcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gcmVzb2x1dGlvbnMgZm9yIAotICAgICAqIHRoZSBnaXZlbiBtYXJrZXIuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlaXIgbWF5Ci0gICAgICogYmUgcmVzb2x1dGlvbnMuIEluIG1vc3QgY2FzZXMgYSA8Y29kZT50cnVlPC9jb2RlPiB2YWx1ZSAKLSAgICAgKiBtZWFucyB0aGVyZSBhcmUgcmVzb2x1dGlvbnMgYnV0IGR1ZSB0byBwbHVnaW4gbG9hZGluZyAKLSAgICAgKiBpc3N1ZXMgZ2V0UmVzb2x1dGlvbnMgbWF5IHNvbWV0aW1lcyByZXR1cm4gYW4gZW1wdHkgYXJyYXkKLSAgICAgKiBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIgZm9yIHdoaWNoIHRvIGRldGVybWluZSBpZiB0aGVyZQotICAgICAqIGFyZSByZXNvbHV0aW9ucwotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlc29sdXRpb25zIGZvciB0aGUgZ2l2ZW4gbWFya2VyLiAKLSAgICAgKiBUaGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBiZSBlbXB0eSBpZiB0aGVyZSBhcmUgbm8gcmVzb2x1dGlvbnMKLSAgICAgKiBmb3IgdGhlIG1hcmtlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIgZm9yIHdoaWNoIHRvIG9idGFpbiByZXNvbHV0aW9ucwotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcik7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSU1hcmtlclJlc29sdXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSU1hcmtlclJlc29sdXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxNmJiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL0lNYXJrZXJSZXNvbHV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotCi0vKiogCi0gKiBSZXNvbHV0aW9uIGZvciBhIG1hcmtlci4gV2hlbiBydW4sIGEgcmVzb2x1dGlvbiB3b3VsZCAKLSAqIHR5cGljYWxseSBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHRoZSBtYXJrZXIuCi0gKiAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWFya2VyUmVzb2x1dGlvbiB7Ci0gICAgLyoqIAotICAgICAqIFJldHVybnMgYSBzaG9ydCBsYWJlbCBpbmRpY2F0aW5nIHdoYXQgdGhlIHJlc29sdXRpb24gd2lsbCBkby4gCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHNob3J0IGxhYmVsIGZvciB0aGlzIHJlc29sdXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIHRoaXMgcmVzb2x1dGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIgdG8gcmVzb2x2ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJTWFya2VyIG1hcmtlcik7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSU1hcmtlclJlc29sdXRpb24yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL0lNYXJrZXJSZXNvbHV0aW9uMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjQyMTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSU1hcmtlclJlc29sdXRpb24yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKiAKLSAqIEV4dGVuZHMgPGNvZGU+SU1hcmtlclJlc29sdXRpb248L2NvZGU+LiAgVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIHVzZWQgCi0gKiBpbiBwbGFjZSBvZiA8Y29kZT5JTWFya2VyUmVzb2x1dGlvbjwvY29kZT4gaWYgYSBkZXNjcmlwdGlvbiBhbmQvb3IgaW1hZ2UgCi0gKiBhcmUgZGVzaXJlZC4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNYXJrZXJSZXNvbHV0aW9uMiBleHRlbmRzIElNYXJrZXJSZXNvbHV0aW9uIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgb3B0aW9uYWwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb2x1dGlvbi4KLSAgICAgKiBUaGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aWxsIGJlIHByZXNlbnRlZCB0byBhc3Npc3QgdGhlIHVzZXIKLSAgICAgKiBpbiBkZWNpZGluZyBpZiB0aGUgc2VsZWN0ZWQgcHJvcG9zYWwgaXMgdGhlIGRlc2lyZWQgY2hvaWNlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGltYWdlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBvZiByZXNvbHV0aW9ucy4KLSAgICAgKiBUaGUgaW1hZ2Ugd291bGQgdHlwaWNhbGx5IGJlIHNob3duIHRvIHRoZSBsZWZ0IG9mIHRoZSBkaXNwbGF5IHN0cmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGltYWdlIHRvIGJlIHNob3duIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGltYWdlIGlzIGRlc2lyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9JTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9JTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmZiOGJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci0KLS8qKiAKLSAqIENyZWF0ZXMgcmVzb2x1dGlvbnMgZm9yIGEgZ2l2ZW4gbWFya2VyLiAKLSAqIFdoZW4gcnVuLCBhIHJlc29sdXRpb24gd291bGQgdHlwaWNhbGx5IGVsaW1pbmF0ZSAKLSAqIHRoZSBuZWVkIGZvciB0aGUgbWFya2VyLgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgewotICAgIC8qKiAKLSAgICAgKiBSZXR1cm5zIHJlc29sdXRpb25zIGZvciB0aGUgZ2l2ZW4gbWFya2VyIChtYXkKLSAgICAgKiBiZSBlbXB0eSkuIAotICAgICAqIAotICAgICAqIEByZXR1cm4gcmVzb2x1dGlvbnMgZm9yIHRoZSBnaXZlbiBtYXJrZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcik7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL0lNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzZjOTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci0KLS8qKiAKLSAqIEEgbWFya2VyIHJlc29sdXRpb24gZ2VuZXJhdG9yIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgcmF0aGVyIHRoYW4gICAKLSAqIDxjb2RlPklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPC9jb2RlPiBpZiBpdCBjYW4gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIG1hcmtlciAKLSAqIGhhcyBhbnkgcmVzb2x1dGlvbnMgbW9yZSBlZmZpY2llbnRseSB0aGFuIGNvbXB1dGluZyBhbGwgdGhlIHJlc29sdXRpb25zLgotICogCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IyIGV4dGVuZHMgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgewotCi0gICAgLyoqIAotICAgICAqIFJldHVybnMgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlc29sdXRpb25zIGZvciB0aGUgZ2l2ZW4gbWFya2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHJlc29sdXRpb25zIGZvciB0aGUgZ2l2ZW4gbWFya2VyLAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1Jlc29sdXRpb25zKElNYXJrZXIgbWFya2VyKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9JUHJvamVjdEFjdGlvbkZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9JUHJvamVjdEFjdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWI2ZWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSVByb2plY3RBY3Rpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aTsKLQotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcHVibGljIGF0dHJpYnV0ZXMgZm9yIGEgcHJvamVjdCBhbmQgdGhlIGFjY2VwdGFibGUgdmFsdWVzCi0gKiBlYWNoIG1heSBoYXZlLiAgCi0gKiA8cD4KLSAqIEEgcG9wdXAgbWVudSBleHRlbnNpb24gbWF5IHVzZSB0aGVzZSBjb25zdGFudHMgdG8gZGVzY3JpYmUgaXRzIG9iamVjdCB0YXJnZXQuICAKLSAqIEVhY2ggaWRlbnRpZmllcyBhbiBhdHRyaWJ1dGUgbmFtZSBvciBwb3NzaWJsZSB2YWx1ZS4gIAotICogPHA+Ci0gKiBDbGllbnRzIGFyZSBub3QgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9qZWN0QWN0aW9uRmlsdGVyIGV4dGVuZHMgSVJlc291cmNlQWN0aW9uRmlsdGVyIHsKLQotICAgIC8qKgotICAgICAqIEFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBwcm9qZWN0IG5hdHVyZSAodmFsdWUgPGNvZGU+Im5hdHVyZSI8L2NvZGU+KS4KLSAgICAgKiBUaGUgYXR0cmlidXRlIHZhbHVlIGluIHhtbCBpcyB1bmNvbnN0cmFpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVFVSRSA9ICJuYXR1cmUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBBbiBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwcm9qZWN0IGlzIG9wZW4gKHZhbHVlIDxjb2RlPiJvcGVuIjwvY29kZT4pLgotICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4geG1sIG11c3QgYmUgb25lIG9mIDxjb2RlPiJ0cnVlIiBvciAiZmFsc2UiPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOID0gIm9wZW4iOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSVJlc291cmNlQWN0aW9uRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL0lSZXNvdXJjZUFjdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzdhNzhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvSVJlc291cmNlQWN0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcHVibGljIGF0dHJpYnV0ZXMgZm9yIGEgcmVzb3VyY2UgYW5kIHRoZSBhY2NlcHRhYmxlIHZhbHVlcwotICogZWFjaCBtYXkgaGF2ZS4gIAotICogPHA+Ci0gKiBBIHBvcHVwIG1lbnUgZXh0ZW5zaW9uIG1heSB1c2UgdGhlc2UgY29uc3RhbnRzIHRvIGRlc2NyaWJlIGl0cyBvYmplY3QgdGFyZ2V0LiAgCi0gKiBFYWNoIGlkZW50aWZpZXMgYW4gYXR0cmlidXRlIG5hbWUgb3IgcG9zc2libGUgdmFsdWUuICAKLSAqIDxwPgotICogQ2xpZW50cyBhcmUgbm90IGV4cGVjdGVkIHRvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VBY3Rpb25GaWx0ZXIgZXh0ZW5kcyBJQWN0aW9uRmlsdGVyIHsKLSAgICAvKioKLSAgICAgKiBBbiBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgZmlsZSBuYW1lICh2YWx1ZSA8Y29kZT4ibmFtZSI8L2NvZGU+KS4gIAotICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4geG1sIGlzIHVuY29uc3RyYWluZWQuICAiKiIgbWF5IGJlIHVzZWQgYXQgdGhlIHN0YXJ0IG9yCi0gICAgICogdGhlIGVuZCB0byByZXByZXNlbnQgIm9uZSBvciBtb3JlIGNoYXJhY3RlcnMiLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBmaWxlIGV4dGVuc2lvbiAodmFsdWUgPGNvZGU+ImV4dGVuc2lvbiI8L2NvZGU+KS4KLSAgICAgKiBUaGUgYXR0cmlidXRlIHZhbHVlIGluIHhtbCBpcyB1bmNvbnN0cmFpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTiA9ICJleHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBBbiBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgZmlsZSBwYXRoICh2YWx1ZSA8Y29kZT4icGF0aCI8L2NvZGU+KS4KLSAgICAgKiBUaGUgYXR0cmlidXRlIHZhbHVlIGluIHhtbCBpcyB1bmNvbnN0cmFpbmVkLiAgIioiIG1heSBiZSB1c2VkIGF0IHRoZSBzdGFydCBvcgotICAgICAqIHRoZSBlbmQgdG8gcmVwcmVzZW50ICJvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBBbiBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGlzIHJlYWQgb25seSAodmFsdWUgPGNvZGU+InJlYWRPbmx5IjwvY29kZT4pLgotICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4geG1sIG11c3QgYmUgb25lIG9mIDxjb2RlPiJ0cnVlIiBvciAiZmFsc2UiPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX09OTFkgPSAicmVhZE9ubHkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBBbiBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgcHJvamVjdCBuYXR1cmUgKHZhbHVlIDxjb2RlPiJwcm9qZWN0TmF0dXJlIjwvY29kZT4pLgotICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4geG1sIGlzIHVuY29uc3RyYWluZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQVRVUkUgPSAicHJvamVjdE5hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIGEgcGVyc2lzdGVudCBwcm9wZXJ0eSBvbiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgCi0gICAgICogKHZhbHVlIDxjb2RlPiJwZXJzaXN0ZW50UHJvcGVydHkiPC9jb2RlPikuCi0gICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIHN0cmluZywgdGhlbiB0aGlzIHNpbXBseSB0ZXN0cyBmb3IgZXhpc3RlbmNlIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgcmVzb3VyY2UuCi0gICAgICogSWYgaXQgaGFzIHRoZSBmb3JtYXQgPGNvZGU+InByb3BlcnR5TmFtZT1wcm9wZXJ0eVZhbHVlIiB0aGlzIG9idGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB0ZXN0cyBpdCBmb3IgZXF1YWxpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfUFJPUEVSVFkgPSAicGVyc2lzdGVudFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQW4gYXR0cmlidXRlIGluZGljYXRpbmcgYSBwZXJzaXN0ZW50IHByb3BlcnR5IG9uIHRoZSBzZWxlY3RlZCByZXNvdXJjZSdzIHByb2plY3QuIAotICAgICAqICh2YWx1ZSA8Y29kZT4icHJvamVjdFBlcnNpc3RlbnRQcm9wZXJ0eSI8L2NvZGU+KS4KLSAgICAgKiBJZiB0aGUgdmFsdWUgaXMgYSBzaW1wbGUgc3RyaW5nLCB0aGVuIHRoaXMgc2ltcGx5IHRlc3RzIGZvciBleGlzdGVuY2Ugb2YgdGhlIHByb3BlcnR5IG9uIHRoZSByZXNvdXJjZS4KLSAgICAgKiBJZiBpdCBoYXMgdGhlIGZvcm1hdCA8Y29kZT4icHJvcGVydHlOYW1lPXByb3BlcnR5VmFsdWUiIHRoaXMgb2J0YWlucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHRlc3RzIGl0IGZvciBlcXVhbGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9QRVJTSVNURU5UX1BST1BFUlRZID0gInByb2plY3RQZXJzaXN0ZW50UHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBBbiBhdHRyaWJ1dGUgaW5kaWNhdGluZyBhIHNlc3Npb24gcHJvcGVydHkgb24gdGhlIHNlbGVjdGVkIHJlc291cmNlIAotICAgICAqICh2YWx1ZSA8Y29kZT4ic2Vzc2lvblByb3BlcnR5IjwvY29kZT4pLgotICAgICAqIElmIHRoZSB2YWx1ZSBpcyBhIHNpbXBsZSBzdHJpbmcsIHRoZW4gdGhpcyBzaW1wbHkgdGVzdHMgZm9yIGV4aXN0ZW5jZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIHJlc291cmNlLgotICAgICAqIElmIGl0IGhhcyB0aGUgZm9ybWF0IDxjb2RlPiJwcm9wZXJ0eU5hbWU9cHJvcGVydHlWYWx1ZSIgdGhpcyBvYnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdGVzdHMgaXQgZm9yIGVxdWFsaXR5IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX1BST1BFUlRZID0gInNlc3Npb25Qcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIGEgc2Vzc2lvbiBwcm9wZXJ0eSBvbiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UncyBwcm9qZWN0LiAKLSAgICAgKiAodmFsdWUgPGNvZGU+InByb2plY3RTZXNzaW9uUHJvcGVydHkiPC9jb2RlPikuCi0gICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIHN0cmluZywgdGhlbiB0aGlzIHNpbXBseSB0ZXN0cyBmb3IgZXhpc3RlbmNlIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgcmVzb3VyY2UuCi0gICAgICogSWYgaXQgaGFzIHRoZSBmb3JtYXQgPGNvZGU+InByb3BlcnR5TmFtZT1wcm9wZXJ0eVZhbHVlIiB0aGlzIG9idGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB0ZXN0cyBpdCBmb3IgZXF1YWxpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfU0VTU0lPTl9QUk9QRVJUWSA9ICJwcm9qZWN0U2Vzc2lvblByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQW4gYXR0cmlidXRlIGluZGljYXRpbmcgdGhhdCB0aGlzIGlzIGFuIHhtbCBmaWxlCi0gICAgICogYW5kIHdlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgZmlyc3QgdGFnIChvciB0b3AtbGV2ZWwKLSAgICAgKiB0YWcpIGhhcyB0aGlzIG5hbWUuCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgY29udGVudCB0eXBlcyBpbnN0ZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9GSVJTVF9UQUcgPSAieG1sRmlyc3RUYWciOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBBbiBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGF0IHRoaXMgaXMgYW4geG1sIGZpbGUgYW5kIHdlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgRFRECi0gICAgICogZGVmaW5pdGlvbiBpbiB0aGlzIHhtbCBmaWxlIGlzIHRoZSB2YWx1ZSBzdXBwbGllZCB3aXRoIHRoaXMgYXR0cmlidXRlLgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIGNvbnRlbnQgdHlwZXMgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRFREX05BTUUgPSAieG1sRFRETmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBpcyBhIGZpbGUsIGFuZCB3ZSBhcmUgbG9va2luZyB0byB2ZXJpZnkKLSAgICAgKiB0aGF0IHRoZSBmaWxlIG1hdGNoZXMgdGhlIGNvbnRlbnQgdHlwZSBtYXRjaGluZyB0aGUgZ2l2ZW4gaWRlbnRpZmllci4KLSAgICAgKiBUaGUgaWRlbnRpZmllciBpcyBwcm92aWRlZCBpbiB0aGUgdmFsdWUuCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRV9JRCA9ICJjb250ZW50VHlwZUlkIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9JU3RvcmFnZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL0lTdG9yYWdlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmMGVjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL0lTdG9yYWdlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSA8Y29kZT5JU3RvcmFnZTwvY29kZT4gaW5wdXQgdG8gYW4gZWRpdG9yLgotICogPHA+Ci0gKiBDbGllbnRzIGltcGxlbWVudGluZyB0aGlzIGVkaXRvciBpbnB1dCBpbnRlcmZhY2Ugc2hvdWxkIG92ZXJyaWRlCi0gKiA8Y29kZT5PYmplY3QuZXF1YWxzKE9iamVjdCk8L2NvZGU+IHRvIGFuc3dlciB0cnVlIGZvciB0d28gaW5wdXRzCi0gKiB0aGF0IGFyZSB0aGUgc2FtZS4gVGhlIDxjb2RlPklXb3JiZW5jaFBhZ2Uub3BlbkVkaXRvcjwvY29kZT4gQVBJcwotICogYXJlIGRlcGVuZGVudCBvbiB0aGlzIHRvIGZpbmQgYW4gZWRpdG9yIHdpdGggdGhlIHNhbWUgaW5wdXQuCi0gKiA8L3A+PHA+Ci0gKiBDbGllbnRzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gZGVjbGFyZSBuZXcgdHlwZXMgb2YgCi0gKiA8Y29kZT5JU3RvcmFnZTwvY29kZT4gZWRpdG9yIGlucHV0cy4KLSAqIDwvcD48cD4KLSAqIEZpbGUtb3JpZW50ZWQgZWRpdG9ycyBzaG91bGQgc3VwcG9ydCB0aGlzIGFzIGEgdmFsaWQgaW5wdXQgdHlwZSwgYW5kIGRpc3BsYXkKLSAqIGl0cyBjb250ZW50IGZvciB2aWV3aW5nIChidXQgbm90IGFsbG93IG1vZGlmaWNhdGlvbikuCi0gKiBXaXRoaW4gdGhlIGVkaXRvciwgdGhlICJzYXZlIiBhbmQgInNhdmUgYXMiIG9wZXJhdGlvbnMgc2hvdWxkIGNyZWF0ZSBhIG5ldyAKLSAqIGZpbGUgcmVzb3VyY2Ugd2l0aGluIHRoZSB3b3Jrc3BhY2UuCi0gKiA8L3A+PHA+Ci0gKiBBbGwgZWRpdG9yIGlucHV0cyBtdXN0IGltcGxlbWVudCB0aGUgPGNvZGU+SUFkYXB0YWJsZTwvY29kZT4gaW50ZXJmYWNlOwotICogZXh0ZW5zaW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgcGxhdGZvcm0ncyBhZGFwdGVyIG1hbmFnZXIuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0b3JhZ2VFZGl0b3JJbnB1dCBleHRlbmRzIElFZGl0b3JJbnB1dCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBJU3RvcmFnZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIElTdG9yYWdlIG9iamVjdC4KLSAgICAgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgSVN0b3JhZ2UgZ2V0U3RvcmFnZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9SZXNvdXJjZVdvcmtpbmdTZXRGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvUmVzb3VyY2VXb3JraW5nU2V0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNWYzZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9SZXNvdXJjZVdvcmtpbmdTZXRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotCi0vKioKLSAqIEEgcmVzb3VyY2Ugd29ya2luZyBzZXQgZmlsdGVyIGZpbHRlcnMgcmVzb3VyY2VzIGZyb20gYSB2aWV3IHRoYXQgCi0gKiBhcmUgbmVpdGhlciBhIHBhcmVudCBub3IgY2hpbGRyZW4gb2YgYSB3b3JraW5nIHNldCBlbGVtZW50LgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVdvcmtpbmdTZXRGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotICAgIHByaXZhdGUgSVdvcmtpbmdTZXQgd29ya2luZ1NldCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIElBZGFwdGFibGVbXSBjYWNoZWRXb3JraW5nU2V0ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjdGl2ZSB3b3JraW5nIHNldCB0aGUgZmlsdGVyIGlzIHdvcmtpbmcgd2l0aC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhY3RpdmUgd29ya2luZyBzZXQgCi0gICAgICovCi0gICAgcHVibGljIElXb3JraW5nU2V0IGdldFdvcmtpbmdTZXQoKSB7Ci0gICAgICAgIHJldHVybiB3b3JraW5nU2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjdGl2ZSB3b3JraW5nIHNldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd29ya2luZ1NldCB0aGUgd29ya2luZyBzZXQgdGhlIGZpbHRlciBzaG91bGQgd29yayB3aXRoCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V29ya2luZ1NldChJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0gICAgICAgIHRoaXMud29ya2luZ1NldCA9IHdvcmtpbmdTZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiBhbiBlbGVtZW50IHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuCi0gICAgICogCi0gICAgICogQHNlZSBWaWV3ZXJGaWx0ZXIjc2VsZWN0KFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCi0gICAgICAgIGlmICh3b3JraW5nU2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGVsZW1lbnQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLSAgICAgICAgICAgIElBZGFwdGFibGUgYWRhcHRhYmxlID0gKElBZGFwdGFibGUpIGVsZW1lbnQ7Ci0gICAgICAgICAgICByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGFkYXB0YWJsZS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0VuY2xvc2VkKHJlc291cmNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSBnaXZlbiByZXNvdXJjZSBpcyBlbmNsb3NlZCBieSBhIHdvcmtpbmcgc2V0IGVsZW1lbnQuCi0gICAgICogVGhlIElDb250YWlubWVudEFkYXB0ZXIgb2YgZWFjaCB3b3JraW5nIHNldCBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZQotICAgICAqIGNvbnRhaW5tZW50IHRlc3QuIElmIHRoZXJlIGlzIG5vIElDb250YWlubWVudEFkYXB0ZXIgZm9yIGEgd29ya2luZyAKLSAgICAgKiBzZXQgZWxlbWVudCwgYSBzaW1wbGUgcmVzb3VyY2UgYmFzZWQgdGVzdCBpcyB1c2VkLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudCByZXNvdXJjZSB0byB0ZXN0IGZvciBlbmNsb3N1cmUgYnkgYSB3b3JraW5nIHNldAotICAgICAqIAllbGVtZW50IAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlbGVtZW50IGlzIGVuY2xvc2VkIGJ5IGEgd29ya2luZyBzZXQgZWxlbWVudCBhbmQgCi0gICAgICogCWZhbHNlIG90aGVyd2lzZS4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRW5jbG9zZWQoSVJlc291cmNlIGVsZW1lbnQpIHsKLSAgICAgICAgSVBhdGggZWxlbWVudFBhdGggPSBlbGVtZW50LmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIElBZGFwdGFibGVbXSB3b3JraW5nU2V0RWxlbWVudHMgPSBjYWNoZWRXb3JraW5nU2V0OwotCi0gICAgICAgIC8vIHdvcmtpbmcgc2V0IGVsZW1lbnRzIHdvbid0IGJlIGNhY2hlZCBpZiBzZWxlY3QgaXMgY2FsbGVkCi0gICAgICAgIC8vIGRpcmVjdGx5LCBvdXRzaWRlIGZpbHRlci4gZml4ZXMgYnVnIDE0NTAwLgotICAgICAgICBpZiAod29ya2luZ1NldEVsZW1lbnRzID09IG51bGwpCi0gICAgICAgICAgICB3b3JraW5nU2V0RWxlbWVudHMgPSB3b3JraW5nU2V0LmdldEVsZW1lbnRzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JraW5nU2V0RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElBZGFwdGFibGUgd29ya2luZ1NldEVsZW1lbnQgPSB3b3JraW5nU2V0RWxlbWVudHNbaV07Ci0gICAgICAgICAgICBJQ29udGFpbm1lbnRBZGFwdGVyIGNvbnRhaW5tZW50QWRhcHRlciA9IChJQ29udGFpbm1lbnRBZGFwdGVyKSB3b3JraW5nU2V0RWxlbWVudAotICAgICAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJQ29udGFpbm1lbnRBZGFwdGVyLmNsYXNzKTsKLQotICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gSUNvbnRhaW5tZW50QWRhcHRlciBkZWZpbmVkIGZvciB0aGUgd29ya2luZyAgCi0gICAgICAgICAgICAvLyBzZXQgZWxlbWVudCB0eXBlIGZhbGwgYmFjayB0byB1c2luZyByZXNvdXJjZSBiYXNlZCAgCi0gICAgICAgICAgICAvLyBjb250YWlubWVudCBjaGVjayAKLSAgICAgICAgICAgIGlmIChjb250YWlubWVudEFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjb250YWlubWVudEFkYXB0ZXIuY29udGFpbnMod29ya2luZ1NldEVsZW1lbnQsIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBJQ29udGFpbm1lbnRBZGFwdGVyLkNIRUNLX0NPTlRFWFQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJQ29udGFpbm1lbnRBZGFwdGVyLkNIRUNLX0lGX0NISUxECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUNvbnRhaW5tZW50QWRhcHRlci5DSEVDS19JRl9BTkNFU1RPUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElDb250YWlubWVudEFkYXB0ZXIuQ0hFQ0tfSUZfREVTQ0VOREFOVCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0VuY2xvc2VkUmVzb3VyY2UoZWxlbWVudCwgZWxlbWVudFBhdGgsCi0gICAgICAgICAgICAgICAgICAgIHdvcmtpbmdTZXRFbGVtZW50KSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSBnaXZlbiByZXNvdXJjZSBpcyBlbmNsb3NlZCBieSBhIHdvcmtpbmcgc2V0IGVsZW1lbnQuCi0gICAgICogQSByZXNvdXJjZSBpcyBlbmNsb3NlZCBpZiBpdCBpcyBlaXRoZXIgYSBwYXJlbnQgb2YgYSB3b3JraW5nIHNldCAKLSAgICAgKiBlbGVtZW50LCBhIGNoaWxkIG9mIGEgd29ya2luZyBzZXQgZWxlbWVudCBvciBhIHdvcmtpbmcgc2V0IGVsZW1lbnQKLSAgICAgKiBpdHNlbGYuCi0gICAgICogU2ltcGxlIHBhdGggY29tcGFyaXNvbiBpcyB1c2VkLiBUaGlzIGlzIG9ubHkgZ3VhcmFudGVlZCB0byByZXR1cm4KLSAgICAgKiBjb3JyZWN0IHJlc3VsdHMgZm9yIHJlc291cmNlIHdvcmtpbmcgc2V0IGVsZW1lbnRzLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudCByZXNvdXJjZSB0byB0ZXN0IGZvciBlbmNsb3N1cmUgYnkgYSB3b3JraW5nIHNldAotICAgICAqIAllbGVtZW50Ci0gICAgICogQHBhcmFtIGVsZW1lbnRQYXRoIGZ1bGwsIGFic29sdXRlIHBhdGggb2YgdGhlIGVsZW1lbnQgdG8gdGVzdCAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCBpcyBlbmNsb3NlZCBieSBhIHdvcmtpbmcgc2V0IGVsZW1lbnQgYW5kIAotICAgICAqIAlmYWxzZSBvdGhlcndpc2UuIAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VuY2xvc2VkUmVzb3VyY2UoSVJlc291cmNlIGVsZW1lbnQsIElQYXRoIGVsZW1lbnRQYXRoLAotICAgICAgICAgICAgSUFkYXB0YWJsZSB3b3JraW5nU2V0RWxlbWVudCkgewotICAgICAgICBJUmVzb3VyY2Ugd29ya2luZ1NldFJlc291cmNlID0gbnVsbDsKLQotICAgICAgICBpZiAod29ya2luZ1NldEVsZW1lbnQuZXF1YWxzKGVsZW1lbnQpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmICh3b3JraW5nU2V0RWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgd29ya2luZ1NldFJlc291cmNlID0gKElSZXNvdXJjZSkgd29ya2luZ1NldEVsZW1lbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3b3JraW5nU2V0UmVzb3VyY2UgPSAoSVJlc291cmNlKSB3b3JraW5nU2V0RWxlbWVudAotICAgICAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3b3JraW5nU2V0UmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgSVBhdGggcmVzb3VyY2VQYXRoID0gd29ya2luZ1NldFJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VQYXRoLmlzUHJlZml4T2YoZWxlbWVudFBhdGgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKGVsZW1lbnRQYXRoLmlzUHJlZml4T2YocmVzb3VyY2VQYXRoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsdGVycyBvdXQgZWxlbWVudHMgdGhhdCBhcmUgbmVpdGhlciBhIHBhcmVudCBub3IgYSBjaGlsZCBvZiAKLSAgICAgKiBhIHdvcmtpbmcgc2V0IGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHNlZSBWaWV3ZXJGaWx0ZXIjZmlsdGVyKFZpZXdlciwgT2JqZWN0LCBPYmplY3RbXSkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZmlsdGVyKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0gICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmICh3b3JraW5nU2V0ICE9IG51bGwpCi0gICAgICAgICAgICBjYWNoZWRXb3JraW5nU2V0ID0gd29ya2luZ1NldC5nZXRFbGVtZW50cygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gc3VwZXIuZmlsdGVyKHZpZXdlciwgcGFyZW50LCBlbGVtZW50cyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjYWNoZWRXb3JraW5nU2V0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9BZGRCb29rbWFya0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0FkZEJvb2ttYXJrQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzM2E3MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0FkZEJvb2ttYXJrQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqICAgU2ViYXN0aWFuIERhdmlkcyA8c2Rhdmlkc0BnbXguZGU+Ci0gKiAgICAgLSBGaXggZm9yIGJ1ZyAyMDUxMCAtIEFkZCBCb29rbWFyayBhY3Rpb24gaGFzIHdyb25nIGxhYmVsIGluIG5hdmlnYXRvciBvcgotICogICAgICAgcGFja2FnZXMgdmlldwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotCi0vKioKLSAqIFN0YW5kYXJkIGFjdGlvbiBmb3IgYWRkaW5nIGEgYm9va21hcmsgdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmaWxlCi0gKiByZXNvdXJjZShzKS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEFkZEJvb2ttYXJrQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogVGhlIGlkIG9mIHRoaXMgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gUGxhdGZvcm1VSS5QTFVHSU5fSUQgKyAiLkFkZEJvb2ttYXJrQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIHNoZWxsIGluIHdoaWNoIHRvIHNob3cgYW55IGRpYWxvZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgYm9va21hcmsgbmFtZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcHJvbXB0Rm9yTmFtZSA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGJvb2ttYXJrIGFjdGlvbi4gQnkgZGVmYXVsdCwgcHJvbXB0cyB0aGUgdXNlciBmb3IgdGhlCi0gICAgICogYm9va21hcmsgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgZm9yIGFueSBkaWFsb2dzCi0gICAgICovCi0gICAgcHVibGljIEFkZEJvb2ttYXJrQWN0aW9uKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHRoaXMoc2hlbGwsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYm9va21hcmsgYWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbCBmb3IgYW55IGRpYWxvZ3MKLSAgICAgKiBAcGFyYW0gcHJvbXB0Rm9yTmFtZSB3aGV0aGVyIHRvIGFzayB0aGUgdXNlciBmb3IgdGhlIGJvb2ttYXJrIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRkQm9va21hcmtBY3Rpb24oU2hlbGwgc2hlbGwsIGJvb2xlYW4gcHJvbXB0Rm9yTmFtZSkgewotICAgICAgICBzdXBlcihJREVXb3JrYmVuY2hNZXNzYWdlcy5BZGRCb29rbWFya0xhYmVsKTsKLSAgICAgICAgc2V0SWQoSUQpOwotICAgICAgICBpZiAoc2hlbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2hlbGwgPSBzaGVsbDsKLSAgICAgICAgdGhpcy5wcm9tcHRGb3JOYW1lID0gcHJvbXB0Rm9yTmFtZTsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuQWRkQm9va21hcmtUb29sVGlwKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5BRERfQk9PS01BUktfQUNUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWFya2VyIG9mIHRoZSBnaXZlbiB0eXBlIG9uIGVhY2ggb2YgdGhlIGZpbGVzIGluIHRoZQotICAgICAqIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcmtlclR5cGUgdGhlIG1hcmtlciB0eXBlCi0gICAgICovCi0gICAgdm9pZCBjcmVhdGVNYXJrZXIoU3RyaW5nIG1hcmtlclR5cGUpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAgIGNyZWF0ZU1hcmtlcigoSUZpbGUpIG8sIG1hcmtlclR5cGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgICAgIE9iamVjdCByZXNvdXJjZSA9ICgoSUFkYXB0YWJsZSkgbykuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgICAgICAgICAgICAgICBjcmVhdGVNYXJrZXIoKElGaWxlKSByZXNvdXJjZSwgbWFya2VyVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWFya2VyIG9mIHRoZSBnaXZlbiB0eXBlIG9uIHRoZSBnaXZlbiBmaWxlIHJlc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgcmVzb3VyY2UKLSAgICAgKiBAcGFyYW0gbWFya2VyVHlwZSB0aGUgbWFya2VyIHR5cGUKLSAgICAgKi8KLSAgICB2b2lkIGNyZWF0ZU1hcmtlcihmaW5hbCBJRmlsZSBmaWxlLCBmaW5hbCBTdHJpbmcgbWFya2VyVHlwZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlsZS5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtYXJrZXJNZXNzYWdlID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9tcHRGb3JOYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyTWVzc2FnZSA9IGFza0ZvckxhYmVsKG1hcmtlck1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWFya2VyTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyIG1hcmtlciA9IGZpbGUuY3JlYXRlTWFya2VyKG1hcmtlclR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIG1hcmtlck1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmxvZyhudWxsLCBlLmdldFN0YXR1cygpKTsgLy8gV2UgZG9uJ3QgY2FyZQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgY3JlYXRlTWFya2VyKElNYXJrZXIuQk9PS01BUkspOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5BZGRCb29rbWFya0FjdGlvbjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uPC9jb2RlPiBtZXRob2QgZW5hYmxlcyB0aGUgYWN0aW9uIG9ubHkKLSAgICAgKiBpZiB0aGUgc2VsZWN0aW9uIGlzIG5vdCBlbXB0eSBhbmQgY29udGFpbnMganVzdCBmaWxlIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIC8vIEBpc3N1ZSB0eXBlZCBzZWxlY3Rpb25zCi0gICAgICAgIHJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgICYmIHNlbGVjdGlvbklzT2ZUeXBlKElSZXNvdXJjZS5GSUxFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc2tzIHRoZSB1c2VyIGZvciBhIGJvb2ttYXJrIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcG9zYWwgdGhlIHN1Z2dlc3RlZCBib29rbWFyayBuYW1lCi0gICAgICogQHJldHVybiB0aGUgYm9va21hcmsgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBjYW5jZWxsZWQuCi0gICAgICovCi0gICAgU3RyaW5nIGFza0ZvckxhYmVsKFN0cmluZyBwcm9wb3NhbCkgewotICAgICAgICBTdHJpbmcgdGl0bGUgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5BZGRCb29rbWFya0RpYWxvZ190aXRsZTsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5BZGRCb29rbWFya0RpYWxvZ19tZXNzYWdlOwotCi0gICAgICAgIElJbnB1dFZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG5ld1RleHQgPT0gbnVsbCB8fCBuZXdUZXh0Lmxlbmd0aCgpID09IDApID8gIiAiIDogbnVsbDsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBJbnB1dERpYWxvZyBkaWFsb2cgPSBuZXcgSW5wdXREaWFsb2coc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBwcm9wb3NhbCwKLSAgICAgICAgICAgICAgICBpbnB1dFZhbGlkYXRvcik7Ci0KLSAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93LkNBTkNFTCkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBkaWFsb2cuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBuYW1lID0gbmFtZS50cmltKCk7Ci0gICAgICAgICAgICByZXR1cm4gKG5hbWUubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogbmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0FkZFRhc2tBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9BZGRUYXNrQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZDQyZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0FkZFRhc2tBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dUYXNrUHJvcGVydGllczsKLQotLyoqCi0gKiBTdGFuZGFyZCBhY3Rpb24gZm9yIGFkZGluZyBhIHRhc2sgdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmaWxlCi0gKiByZXNvdXJjZShzKS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEFkZFRhc2tBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0gICAgLyoqCi0gICAgICogVGhlIGlkIG9mIHRoaXMgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gUGxhdGZvcm1VSS5QTFVHSU5fSUQgKyAiLkFkZFRhc2tBY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBzaGVsbCBpbiB3aGljaCB0byBzaG93IGFueSBkaWFsb2dzLgotICAgICAqLwotICAgIHByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2hlbGwgc2hlbGwgdG8gdXNlIHRvIHNob3cgYW55IGRpYWxvZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRkVGFza0FjdGlvbihTaGVsbCBzaGVsbCkgewotICAgICAgICBzdXBlcihJREVXb3JrYmVuY2hNZXNzYWdlcy5BZGRUYXNrTGFiZWwpOwotICAgICAgICBzZXRJZChJRCk7Ci0gICAgICAgIHRoaXMuc2hlbGwgPSBzaGVsbDsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChzaGVsbCk7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLkFkZFRhc2tUb29sVGlwKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5BRERfVEFTS19BQ1RJT04pOwotICAgIH0KLQotICAgIHByaXZhdGUgSVJlc291cmNlIGdldEVsZW1lbnQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICAgICAgICByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGVsZW1lbnQ7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKLSAgICAgICAgICAgIHJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBlbGVtZW50KQotICAgICAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCi0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLSAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotICAgICAgICAgICAgaWYgKHByb2plY3QuaXNPcGVuKCkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRFbGVtZW50KGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEaWFsb2dUYXNrUHJvcGVydGllcyBkaWFsb2cgPSBuZXcgRGlhbG9nVGFza1Byb3BlcnRpZXMoc2hlbGwpOwotICAgICAgICAgICAgZGlhbG9nLnNldFJlc291cmNlKHJlc291cmNlKTsKLSAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+QWRkVGFza0FjdGlvbjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uPC9jb2RlPiBtZXRob2QgZW5hYmxlcyB0aGUgYWN0aW9uIG9ubHkKLSAgICAgKiBpZiB0aGUgc2VsZWN0aW9uIGNvbnRhaW5zIGEgc2luZ2xlIHJlc291cmNlIGFuZCB0aGUgcmVzb3VyY2UgaXMKLSAgICAgKiBub3QgYSBjbG9zZWQgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBzZWxlY3Rpb24gdG8gdXBkYXRlIHRoZSBlbmFibGVkIHN0YXRlIGZvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pCi0gICAgICAgICAgICAgICAgJiYgZ2V0RWxlbWVudChzZWxlY3Rpb24pICE9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0J1aWxkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvQnVpbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkMTQ4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvQnVpbGRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVJbnRlcm5hbFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmFjdGlvbnMuQnVpbGRVdGlsaXRpZXM7Ci0KLS8qKgotICogU3RhbmRhcmQgYWN0aW9ucyBmb3IgZnVsbCBhbmQgaW5jcmVtZW50YWwgYnVpbGRzIG9mIHRoZSBzZWxlY3RlZCBwcm9qZWN0KHMpLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQnVpbGRBY3Rpb24gZXh0ZW5kcyBXb3Jrc3BhY2VBY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogVGhlIGlkIG9mIGFuIGluY3JlbWVudGFsIGJ1aWxkIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9CVUlMRCA9IFBsYXRmb3JtVUkuUExVR0lOX0lEICsgIi5CdWlsZEFjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIGlkIG9mIGEgcmVidWlsZCBhbGwgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1JFQlVJTERfQUxMID0gUGxhdGZvcm1VSS5QTFVHSU5fSUQKLSAgICAgICAgICAgICsgIi5SZWJ1aWxkQWxsQWN0aW9uIjsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGludCBidWlsZFR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGlzdCBvZiBJUHJvamVjdHMgdG8gYnVpbGQgKGNvbXB1dGVkIGxhemlseSkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IHByb2plY3RzVG9CdWlsZCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4gVGhlIGFjdGlvbiBpZCBpcyAKLSAgICAgKiA8Y29kZT5JRF9CVUlMRDwvY29kZT4gZm9yIGluY3JlbWVudGFsIGJ1aWxkcyBhbmQgPGNvZGU+SURfUkVCVUlMRF9BTEw8L2NvZGU+Ci0gICAgICogZm9yIGZ1bGwgYnVpbGRzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbCBmb3IgYW55IGRpYWxvZ3MKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBidWlsZDsgb25lIG9mCi0gICAgICogIDxjb2RlPkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQ8L2NvZGU+IG9yIAotICAgICAqICA8Y29kZT5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQ8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIEJ1aWxkQWN0aW9uKFNoZWxsIHNoZWxsLCBpbnQgdHlwZSkgewotICAgICAgICBzdXBlcihzaGVsbCwgIiIpOy8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpZiAodHlwZSA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxEKSB7Ci0gICAgICAgICAgICBzZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLkJ1aWxkQWN0aW9uX3RleHQpOwotICAgICAgICAgICAgc2V0VG9vbFRpcFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuQnVpbGRBY3Rpb25fdG9vbFRpcCk7Ci0gICAgICAgICAgICBzZXRJZChJRF9CVUlMRCk7Ci0gICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5JTkNSRU1FTlRBTF9CVUlMRF9BQ1RJT04pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5SZWJ1aWxkQWN0aW9uX3RleHQpOwotICAgICAgICAgICAgc2V0VG9vbFRpcFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuUmVidWlsZEFjdGlvbl90b29sdGlwKTsKLSAgICAgICAgICAgIHNldElkKElEX1JFQlVJTERfQUxMKTsKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQkJSUlERUhlbHBDb250ZXh0SWRzLkZVTExfQlVJTERfQUNUSU9OKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuYnVpbGRUeXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiBwcm9qZWN0IGFuZCBhbGwgb2YgaXRzIHByZXJlcXVpc2l0aWVzLCB0cmFuc2l0aXZlbHksCi0gICAgICogdG8gdGhlIHByb3ZpZGVkIHNldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkQWxsUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgSGFzaFNldCBwcm9qZWN0cykgewotICAgICAgICBpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpCi0gICAgICAgICAgICAgICAgfHwgcHJvamVjdHMuY29udGFpbnMocHJvamVjdCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHByb2plY3RzLmFkZChwcm9qZWN0KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQcm9qZWN0W10gcHJlUmVxcyA9IHByb2plY3QuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByZVJlcXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgYWRkQWxsUHJvamVjdHMocHJlUmVxc1tpXSwgcHJvamVjdHMpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vaWdub3JlIGluYWNjZXNzaWJsZSBwcm9qZWN0cwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXb3Jrc3BhY2VBY3Rpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0QWN0aW9uUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gZ2V0UHJvamVjdHNUb0J1aWxkKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXb3Jrc3BhY2VBY3Rpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyYXRpb25NZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoTWVzc2FnZXMuQnVpbGRBY3Rpb25fb3BlcmF0aW9uTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdvcmtzcGFjZUFjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2JsZW1zTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLkJ1aWxkQWN0aW9uX3Byb2JsZW1NZXNzYWdlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV29ya3NwYWNlQWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvYmxlbXNUaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLkJ1aWxkQWN0aW9uX3Byb2JsZW1UaXRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9qZWN0cyB0byBidWlsZC4KLSAgICAgKiBUaGlzIGNvbnRhaW5zIHRoZSBzZXQgb2YgcHJvamVjdHMgd2hpY2ggaGF2ZSBidWlsZGVycywgYWNyb3NzIGFsbCBzZWxlY3RlZCByZXNvdXJjZXMuCi0gICAgICovCi0gICAgTGlzdCBnZXRQcm9qZWN0c1RvQnVpbGQoKSB7Ci0gICAgICAgIGlmIChwcm9qZWN0c1RvQnVpbGQgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvamVjdHNUb0J1aWxkID0gbmV3IEFycmF5TGlzdCgzKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcHJvamVjdHNUb0J1aWxkLmNvbnRhaW5zKHByb2plY3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQnVpbGRlcihwcm9qZWN0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RzVG9CdWlsZC5hZGQocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2plY3RzVG9CdWlsZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgYXJlIGJ1aWxkZXJzIGNvbmZpZ3VyZWQgb24gdGhlIGdpdmVuIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGhhcyBidWlsZGVycywKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QsIG9yIGlmIHRoaXMgY291bGRuJ3QgYmUgZGV0ZXJtaW5lZAotICAgICAqLwotICAgIGJvb2xlYW4gaGFzQnVpbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQ29tbWFuZFtdIGNvbW1hbmRzID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldEJ1aWxkU3BlYygpOwotICAgICAgICAgICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcywgc28KLSAgICAgICAgICAgIC8vIGp1c3QgZmFsbCB0aHJvdWdoIGlmIGl0IGZhaWxzLgotICAgICAgICAgICAgLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFueXdheSwgc2luY2UgdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgcmVzb3VyY2VzCi0gICAgICAgICAgICAvLyBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgZm9yIGFjY2Vzc2liaWxpdHkgYmVmb3JlIHRoaXMgaXMgY2FsbGVkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV29ya3NwYWNlQWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGludm9rZU9wZXJhdGlvbihJUmVzb3VyY2UgcmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgKChJUHJvamVjdCkgcmVzb3VyY2UpLmJ1aWxkKGJ1aWxkVHlwZSwgbW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgIAkvL3VwZGF0ZSBlbmFibGVtZW50IGJhc2VkIG9uIGFjdGl2ZSB3aW5kb3cgYW5kIHBhcnQKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oQnVpbGRVdGlsaXRpZXMuZmluZFNlbGVjdGVkUHJvamVjdHMod2luZG93KSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc0VuYWJsZWQoKTsKLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZSBpcyBzZXQgdG8gYXV0b21hdGljYWxseSBzYXZlIG1vZGlmaWVkCi0gICAgICogcmVzb3VyY2VzIGJlZm9yZSBhIG1hbnVhbCBidWlsZCBpcyBkb25lLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBTYXZlIEFsbCBCZWZvcmUgQnVpbGQgaXMgZW5hYmxlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NhdmVBbGxTZXQoKSB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICByZXR1cm4gc3RvcmUuZ2V0Qm9vbGVhbihJREVJbnRlcm5hbFByZWZlcmVuY2VzLlNBVkVfQUxMX0JFRk9SRV9CVUlMRCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXb3Jrc3BhY2VBY3Rpb24uCi0gICAgICoKLSAgICAgKiBDaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSByZXNvdXJjZXMgc28gdGhhdAotICAgICAqIGl0IG1hdGNoZXMgdGhlIGJ1aWxkIG9yZGVyLiBDbG9zZWQgYW5kCi0gICAgICogbm9uIGV4aXN0YW50IHByb2plY3RzIGFyZSBlbGltaW5hdGVkLiBBbHNvLAotICAgICAqIGFueSBwcm9qZWN0cyBpbiBjeWNsZXMgYXJlIGVsaW1pbmF0ZWQuCi0gICAgICovCi0gICAgTGlzdCBwcnVuZVJlc291cmNlcyhMaXN0IHJlc291cmNlQ29sbGVjdGlvbikgewotICAgICAgICAvL3JlY3Vyc2l2ZWx5IGNvbXB1dGUgcHJvamVjdCBwcmVyZXF1aXNpdGVzCi0gICAgICAgIEhhc2hTZXQgdG9CdWlsZCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZUNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIGFkZEFsbFByb2plY3RzKChJUHJvamVjdCkgaXQubmV4dCgpLCB0b0J1aWxkKTsKLQotICAgICAgICAvLyBPcHRpbWl6ZS4uLgotICAgICAgICBpZiAodG9CdWlsZC5zaXplKCkgPCAyKQotICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQ29sbGVjdGlvbjsKLQotICAgICAgICAvLyBUcnkgdGhlIHdvcmtzcGFjZSdzIGRlc2NyaXB0aW9uIGJ1aWxkIG9yZGVyIGlmIHNwZWNpZmllZAotICAgICAgICBTdHJpbmdbXSBvcmRlcmVkTmFtZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKQotICAgICAgICAgICAgICAgIC5nZXRCdWlsZE9yZGVyKCk7Ci0gICAgICAgIGlmIChvcmRlcmVkTmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdCBvcmRlcmVkUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KHRvQnVpbGQuc2l6ZSgpKTsKLSAgICAgICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmRlcmVkTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJUHJvamVjdCBoYW5kbGUgPSByb290LmdldFByb2plY3Qob3JkZXJlZE5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAodG9CdWlsZC5jb250YWlucyhoYW5kbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZGVyZWRQcm9qZWN0cy5hZGQoaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgdG9CdWlsZC5yZW1vdmUoaGFuZGxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0FkZCBhbnl0aGluZyBub3Qgc3BlY2lmaWVkIGJlZm9yZSB3ZSByZXR1cm4KLSAgICAgICAgICAgIG9yZGVyZWRQcm9qZWN0cy5hZGRBbGwodG9CdWlsZCk7Ci0gICAgICAgICAgICByZXR1cm4gb3JkZXJlZFByb2plY3RzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVHJ5IHRoZSBwcm9qZWN0IHByZXJlcXVpc2l0ZSBvcmRlciB0aGVuCi0gICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSVByb2plY3RbdG9CdWlsZC5zaXplKCldOwotICAgICAgICBwcm9qZWN0cyA9IChJUHJvamVjdFtdKSB0b0J1aWxkLnRvQXJyYXkocHJvamVjdHMpOwotICAgICAgICBJV29ya3NwYWNlLlByb2plY3RPcmRlciBwbyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotICAgICAgICAgICAgICAgIC5jb21wdXRlUHJvamVjdE9yZGVyKHByb2plY3RzKTsKLSAgICAgICAgQXJyYXlMaXN0IG9yZGVyZWRQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgb3JkZXJlZFByb2plY3RzLmFkZEFsbChBcnJheXMuYXNMaXN0KHBvLnByb2plY3RzKSk7Ci0gICAgICAgIHJldHVybiBvcmRlcmVkUHJvamVjdHM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uOyBvdmVycmlkZXMgbWV0aG9kIG9uIFdvcmtzcGFjZUFjdGlvbi4KLSAgICAgKiBUaGlzIG92ZXJyaWRlIGFsbG93cyB0aGUgdXNlciB0byBzYXZlIHRoZSBjb250ZW50cyBvZiBzZWxlY3RlZAotICAgICAqIG9wZW4gZWRpdG9ycyBzbyB0aGF0IHRoZSB1cGRhdGVkIGNvbnRlbnRzIHdpbGwgYmUgdXNlZCBmb3IgYnVpbGRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotCSAgICBMaXN0IHByb2plY3RzID0gZ2V0UHJvamVjdHNUb0J1aWxkKCk7Ci0JICAgIGlmIChwcm9qZWN0cyA9PSBudWxsIHx8IHByb2plY3RzLmlzRW1wdHkoKSkKLQkgICAgICAgIHJldHVybjsKLQotCSAgICAvLyBTYXZlIGFsbCByZXNvdXJjZXMgcHJpb3IgdG8gZG9pbmcgYnVpbGQKLSAgICAgICAgQnVpbGRVdGlsaXRpZXMuc2F2ZUVkaXRvcnMocHJvamVjdHMpOwotICAgICAgICBydW5JbkJhY2tncm91bmQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAuYnVpbGRSdWxlKCksIFJlc291cmNlc1BsdWdpbi5GQU1JTFlfTUFOVUFMX0JVSUxEKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdvcmtzcGFjZUFjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRQZXJmb3JtUmVzb3VyY2VQcnVuaW5nKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+QnVpbGRBY3Rpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjwvY29kZT4gbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGlzIGFjdGlvbiBpcwotICAgICAqIGVuYWJsZWQgb25seSBpZiBhbGwgb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlcyBoYXZlIGJ1aWxkYWJsZSBwcm9qZWN0cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gcykgewotICAgICAgICBwcm9qZWN0c1RvQnVpbGQgPSBudWxsOwotICAgICAgICBJUHJvamVjdFtdIHByb2plY3RzID0gKElQcm9qZWN0W10pIGdldFByb2plY3RzVG9CdWlsZCgpLnRvQXJyYXkobmV3IElQcm9qZWN0WzBdKTsKLSAgICAgICAgcmV0dXJuIEJ1aWxkVXRpbGl0aWVzLmlzRW5hYmxlZChwcm9qZWN0cywgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0Nsb3NlUmVzb3VyY2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9DbG9zZVJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMGE3NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0Nsb3NlUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUnVsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5BZGFwdGFibGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hQYXJ0TGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBTdGFuZGFyZCBhY3Rpb24gZm9yIGNsb3NpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwcm9qZWN0KHMpLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ2xvc2VSZXNvdXJjZUFjdGlvbiBleHRlbmRzIFdvcmtzcGFjZUFjdGlvbiBpbXBsZW1lbnRzCi0gICAgICAgIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLSAgICAvKioKLSAgICAgKiBUaGUgaWQgb2YgdGhpcyBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBQbGF0Zm9ybVVJLlBMVUdJTl9JRAotICAgICAgICAgICAgKyAiLkNsb3NlUmVzb3VyY2VBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgZm9yIGFueSBkaWFsb2dzCi0gICAgICovCi0gICAgcHVibGljIENsb3NlUmVzb3VyY2VBY3Rpb24oU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgc3VwZXIoc2hlbGwsIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNsb3NlUmVzb3VyY2VBY3Rpb25fdGV4dCk7Ci0gICAgICAgIHNldElkKElEKTsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuQ2xvc2VSZXNvdXJjZUFjdGlvbl90b29sVGlwKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5DTE9TRV9SRVNPVVJDRV9BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGxpc3Qgb2YgZGlydHkgZWRpdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb2plY3RzLiAgUmV0dXJuCi0gICAgICogZWRpdG9ycyBmcm9tIGFsbCBwZXJzcGVjdGl2ZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBMaXN0IHRoZSBkaXJ0eSBlZGl0b3JzCi0gICAgICovCi0gICAgTGlzdCBnZXREaXJ0eUVkaXRvcnMoTGlzdCBwcm9qZWN0cykgewotICAgICAgICBMaXN0IGRpcnR5RWRpdG9ycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0gICAgICAgIElXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgIC5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IHdpbmRvd3NbaV0uZ2V0UGFnZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFnZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gcGFnZXNbal07Ci0gICAgICAgICAgICAgICAgSUVkaXRvclBhcnRbXSBlZGl0b3JzID0gcGFnZS5nZXREaXJ0eUVkaXRvcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGVkaXRvcnMubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZWRpdG9yc1trXTsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgaW5wdXRGaWxlID0gUmVzb3VyY2VVdGlsLmdldEZpbGUoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0cy5jb250YWlucyhpbnB1dEZpbGUuZ2V0UHJvamVjdCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnR5RWRpdG9ycy5hZGQoZWRpdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlydHlFZGl0b3JzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW4gYSBkaWFsb2cgdGhhdCBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hpY2ggb2YgdGhlIGdpdmVuCi0gICAgICogZWRpdG9ycyB0byBzYXZlLiBSZXR1cm4gdGhlIGxpc3Qgb2YgZWRpdG9ycyB0byBzYXZlLiAgQSB2YWx1ZSBvZiAKLSAgICAgKiBudWxsIGltcGxpZXMgdGhhdCB0aGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBMaXN0IHRoZSBlZGl0b3JzIHRvIHNhdmUKLSAgICAgKi8KLSAgICBMaXN0IGdldEVkaXRvcnNUb1NhdmUoTGlzdCBkaXJ0eUVkaXRvcnMpIHsKLSAgICAgICAgaWYgKGRpcnR5RWRpdG9ycy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQotICAgICAgICAvLyBUaGUgbGlzdCBtYXkgaGF2ZSBtdWx0aXBsZSBlZGl0b3JzIG9wZW5lZCBmb3IgdGhlIHNhbWUgaW5wdXQsCi0gICAgICAgIC8vIHNvIHByb2Nlc3MgdGhlIGxpc3QgZm9yIGR1cGxpY2F0ZXMuCi0gICAgICAgIExpc3Qgc2F2ZUVkaXRvcnMgPSBuZXcgQXJyYXlMaXN0KDApOwotICAgICAgICBMaXN0IGRpcnR5SW5wdXRzID0gbmV3IEFycmF5TGlzdCgwKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGRpcnR5RWRpdG9ycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IChJRWRpdG9yUGFydCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBJRmlsZSBpbnB1dEZpbGUgPSBSZXNvdXJjZVV0aWwuZ2V0RmlsZShlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBpZiAoaW5wdXRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc2FtZSBmaWxlIGlzIG9wZW4gaW4gbXVsdGlwbGUgcGVyc3BlY3RpdmVzLAotICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gY291bnQgaXQgYXMgZGlydHkgbXVsdGlwbGUgdGltZXMKLSAgICAgICAgICAgICAgICBpZiAoIWRpcnR5SW5wdXRzLmNvbnRhaW5zKGlucHV0RmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlydHlJbnB1dHMuYWRkKGlucHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNhdmVFZGl0b3JzLmFkZChlZGl0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBBZGFwdGFibGVMaXN0IGlucHV0ID0gbmV3IEFkYXB0YWJsZUxpc3Qoc2F2ZUVkaXRvcnMpOwotICAgICAgICBMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIGlucHV0LAotICAgICAgICAgICAgICAgIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSwKLSAgICAgICAgICAgICAgICBuZXcgV29ya2JlbmNoUGFydExhYmVsUHJvdmlkZXIoKSwgSURFV29ya2JlbmNoTWVzc2FnZXMuRWRpdG9yTWFuYWdlcl9zYXZlUmVzb3VyY2VzTWVzc2FnZSk7Ci0KLSAgICAgICAgZGxnLnNldEluaXRpYWxTZWxlY3Rpb25zKHNhdmVFZGl0b3JzLnRvQXJyYXkobmV3IE9iamVjdFtzYXZlRWRpdG9ycwotICAgICAgICAgICAgICAgIC5zaXplKCldKSk7Ci0gICAgICAgIGRsZy5zZXRUaXRsZShJREVXb3JrYmVuY2hNZXNzYWdlcy5FZGl0b3JNYW5hZ2VyX3NhdmVSZXNvdXJjZXNUaXRsZSk7Ci0gICAgICAgIGludCByZXN1bHQgPSBkbGcub3BlbigpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZGxnLmdldFJlc3VsdCgpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdvcmtzcGFjZUFjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZXJhdGlvbk1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5DbG9zZVJlc291cmNlQWN0aW9uX29wZXJhdGlvbk1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXb3Jrc3BhY2VBY3Rpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9ibGVtc01lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5DbG9zZVJlc291cmNlQWN0aW9uX3Byb2JsZW1NZXNzYWdlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV29ya3NwYWNlQWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvYmxlbXNUaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNsb3NlUmVzb3VyY2VBY3Rpb25fdGl0bGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlT3BlcmF0aW9uKElSZXNvdXJjZSByZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCSAgICAoKElQcm9qZWN0KSByZXNvdXJjZSkuY2xvc2UobW9uaXRvcik7Ci0JfQotCi0gICAgLyoqIAotICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPldvcmtzcGFjZUFjdGlvbjwvY29kZT4gbWV0aG9kCi0gICAgICogbWV0aG9kIHNhdmVzIGFuZCBjbG9zZXMgdGhlIHJlc291cmNlJ3MgZGlydHkgZWRpdG9ycyBiZWZvcmUgY2xvc2luZyAKLSAgICAgKiBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGlmICghc2F2ZURpcnR5RWRpdG9ycygpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvL2JlIGNvbnNlcnZhdGl2ZSBhbmQgaW5jbHVkZSBhbGwgcHJvamVjdHMgaW4gdGhlIHNlbGVjdGlvbiAtIHByb2plY3RzCi0gICAgICAgIC8vY2FuIGNoYW5nZSBzdGF0ZSBiZXR3ZWVuIG5vdyBhbmQgd2hlbiB0aGUgam9iIHN0YXJ0cwotICAgIAlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IG51bGw7Ci0gICAgCUlSZXNvdXJjZVJ1bGVGYWN0b3J5IGZhY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKTsKLSAgICAgICAgSXRlcmF0b3IgcmVzb3VyY2VzID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocmVzb3VyY2VzLmhhc05leHQoKSkgewotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2VzLm5leHQoKTsKLSAgICAgICAJCXJ1bGUgPSBNdWx0aVJ1bGUuY29tYmluZShydWxlLCBmYWN0b3J5Lm1vZGlmeVJ1bGUocHJvamVjdCkpOwotICAgICAgICB9Ci0gICAgICAgIHJ1bkluQmFja2dyb3VuZChydWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYXVzZXMgYWxsIGRpcnR5IGVkaXRvcnMgYXNzb2NpYXRlZCB0byB0aGUgcmVzb3VyY2UocykgdG8gYmUgc2F2ZWQsIGlmIHNvCi0gICAgICogc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCBhbmQgY2xvc2VkLgotICAgICAqLwotICAgIGJvb2xlYW4gc2F2ZURpcnR5RWRpdG9ycygpIHsKLSAgICAgICAgLy8gR2V0IHRoZSBpdGVtcyB0byBjbG9zZS4KLSAgICAgICAgTGlzdCBwcm9qZWN0cyA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCk7Ci0gICAgICAgIGlmIChwcm9qZWN0cyA9PSBudWxsIHx8IHByb2plY3RzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIC8vIG5vIGFjdGlvbiBuZWVkcyB0byBiZSB0YWtlbiBzaW5jZSBubyBwcm9qZWN0cyBhcmUgc2VsZWN0ZWQKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBDb2xsZWN0IGFsbCB0aGUgZGlydHkgZWRpdG9ycyB0aGF0IGFyZSBhc3NvY2lhdGVkIHRvIHRoZSBwcm9qZWN0cyB0aGF0IGFyZQotICAgICAgICAvLyB0byBiZSBjbG9zZWQuCi0gICAgICAgIGZpbmFsIExpc3QgZGlydHlFZGl0b3JzID0gZ2V0RGlydHlFZGl0b3JzKHByb2plY3RzKTsKLQotICAgICAgICAvLyBTZWUgd2hpY2ggZWRpdG9ycyBzaG91bGQgYmUgc2F2ZWQuCi0gICAgICAgIGZpbmFsIExpc3Qgc2F2ZUVkaXRvcnMgPSBnZXRFZGl0b3JzVG9TYXZlKGRpcnR5RWRpdG9ycyk7Ci0gICAgICAgIGlmIChzYXZlRWRpdG9ycyA9PSBudWxsKQotICAgICAgICAgICAgLy8gdGhlIG9wZXJhdGlvbiB3YXMgY2FuY2VsbGVkCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8gU2F2ZSBhbmQgY2xvc2UgdGhlIGRpcnR5IGVkaXRvcnMuCi0gICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGRpcnR5RWRpdG9ycy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSAoSUVkaXRvclBhcnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRQYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzYXZlRWRpdG9ycy5jb250YWlucyhlZGl0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBhIGRpcmVjdCBzYXZlIHZzLiB1c2luZyBwYWdlLnNhdmVFZGl0b3IsIHNvIHRoYXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9ncmVzcyBkaWFsb2dzIGRvIG5vdCBmbGFzaCB1cCBvbiB0aGUgc2NyZWVuIG11bHRpcGxlIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGFnZS5jbG9zZUVkaXRvcihlZGl0b3IsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV29ya3NwYWNlQWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHNob3VsZFBlcmZvcm1SZXNvdXJjZVBydW5pbmcoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+Q2xvc2VSZXNvdXJjZUFjdGlvbjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uPC9jb2RlPiBtZXRob2QgZW5zdXJlcyB0aGF0IHRoaXMgYWN0aW9uIGlzCi0gICAgICogZW5hYmxlZCBvbmx5IGlmIG9uZSBvZiB0aGUgc2VsZWN0aW9ucyBpcyBhbiBvcGVuIHByb2plY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsKLSAgICAgICAgLy8gZG9uJ3QgY2FsbCBzdXBlciBzaW5jZSB3ZSB3YW50IHRvIGVuYWJsZSBpZiBvcGVuIHByb2plY3QgaXMgc2VsZWN0ZWQuCi0gICAgICAgIGlmICghc2VsZWN0aW9uSXNPZlR5cGUoSVJlc291cmNlLlBST0pFQ1QpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEl0ZXJhdG9yIHJlc291cmNlcyA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIElQcm9qZWN0IGN1cnJlbnRSZXNvdXJjZSA9IChJUHJvamVjdCkgcmVzb3VyY2VzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50UmVzb3VyY2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIHJlc291cmNlIGNoYW5nZWQgZXZlbnQgYnkgdXBkYXRpbmcgdGhlIGVuYWJsZW1lbnQKLSAgICAgKiBpZiBvbmUgb2YgdGhlIHNlbGVjdGVkIHByb2plY3RzIGlzIG9wZW5lZCBvciBjbG9zZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vIFdhcm5pbmc6IGNvZGUgZHVwbGljYXRlZCBpbiBPcGVuUmVzb3VyY2VBY3Rpb24KLSAgICAgICAgTGlzdCBzZWwgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpOwotICAgICAgICAvLyBkb24ndCBib3RoZXIgbG9va2luZyBhdCBkZWx0YSBpZiBzZWxlY3Rpb24gbm90IGFwcGxpY2FibGUKLSAgICAgICAgaWYgKHNlbGVjdGlvbklzT2ZUeXBlKElSZXNvdXJjZS5QUk9KRUNUKSkgewotICAgICAgICAgICAgSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotICAgICAgICAgICAgaWYgKGRlbHRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VEZWx0YVtdIHByb2pEZWx0YXMgPSBkZWx0YQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFmZmVjdGVkQ2hpbGRyZW4oSVJlc291cmNlRGVsdGEuQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qRGVsdGFzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZURlbHRhIHByb2pEZWx0YSA9IHByb2pEZWx0YXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocHJvakRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsLmNvbnRhaW5zKHByb2pEZWx0YS5nZXRSZXNvdXJjZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkNoYW5nZWQoZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0NvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1NDFiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSUlucHV0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSW5wdXREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lckdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuU3RhdHVzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5JREVSZXNvdXJjZUluZm9VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5GaWxlU3RvcmVTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JbXBvcnRPcGVyYXRpb247Ci0KLS8qKgotICogUGVyZm9ybSB0aGUgY29weSBvZiBmaWxlIGFuZCBmb2xkZXIgcmVzb3VyY2VzIGZyb20gdGhlIGNsaXBib2FyZCB3aGVuIHBhc3RlCi0gKiBhY3Rpb24gaXMgaW52b2tlZC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24gewotCi0JLyoqCi0JICogU3RhdHVzIGNvbnRhaW5pbmcgdGhlIGVycm9ycyBkZXRlY3RlZCB3aGVuIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbiBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGVycm9ycyBkZXRlY3RlZC4KLQkgKi8KLQlwcml2YXRlIE11bHRpU3RhdHVzIGVycm9yU3RhdHVzOwotCi0JLyoqCi0JICogVGhlIHBhcmVudCBzaGVsbCB1c2VkIHRvIHNob3cgYW55IGRpYWxvZ3MuCi0JICovCi0JcHJpdmF0ZSBTaGVsbCBtZXNzYWdlU2hlbGw7Ci0KLQkvKioKLQkgKiBXaGV0aGVyIG9yIG5vdCB0aGUgY29weSBoYXMgYmVlbiBjYW5jZWxlZCBieSB0aGUgdXNlci4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuY2VsZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIE92ZXJ3cml0ZSBhbGwgZmxhZy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYWx3YXlzT3ZlcndyaXRlID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG5hbWUgZm9yIGEgY29weSBvZiB0aGUgcmVzb3VyY2UgYXQgdGhlIGdpdmVuIHBhdGggaW4gdGhlCi0JICogZ2l2ZW4gd29ya3NwYWNlLiBUaGlzIG5hbWUgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LgotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW5hbE5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBmdWxsIHBhdGggb2YgdGhlIHJlc291cmNlCi0JICogQHBhcmFtIHdvcmtzcGFjZQotCSAqICAgICAgICAgICAgdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gdGhlIG5ldyBmdWxsIHBhdGggZm9yIHRoZSBjb3B5Ci0JICovCi0Jc3RhdGljIElQYXRoIGdldEF1dG9OZXdOYW1lRm9yKElQYXRoIG9yaWdpbmFsTmFtZSwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UpIHsKLQkJaW50IGNvdW50ZXIgPSAxOwotCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gb3JpZ2luYWxOYW1lLmxhc3RTZWdtZW50KCk7Ci0JCUlQYXRoIGxlYWR1cFNlZ21lbnQgPSBvcmlnaW5hbE5hbWUucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlTdHJpbmcgbmFtZVNlZ21lbnQ7Ci0KLQkJCWlmIChjb3VudGVyID4gMSkKLQkJCQluYW1lU2VnbWVudCA9IE5MUwotCQkJCQkJLmJpbmQoCi0JCQkJCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fY29weU5hbWVUd29BcmdzLAotCQkJCQkJCQluZXcgSW50ZWdlcihjb3VudGVyKSwgcmVzb3VyY2VOYW1lKTsKLQkJCWVsc2UKLQkJCQluYW1lU2VnbWVudCA9IE5MUwotCQkJCQkJLmJpbmQoCi0JCQkJCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fY29weU5hbWVPbmVBcmcsCi0JCQkJCQkJCXJlc291cmNlTmFtZSk7Ci0KLQkJCUlQYXRoIHBhdGhUb1RyeSA9IGxlYWR1cFNlZ21lbnQuYXBwZW5kKG5hbWVTZWdtZW50KTsKLQotCQkJaWYgKCF3b3Jrc3BhY2UuZ2V0Um9vdCgpLmV4aXN0cyhwYXRoVG9UcnkpKQotCQkJCXJldHVybiBwYXRoVG9Ucnk7Ci0KLQkJCWNvdW50ZXIrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgb3BlcmF0aW9uIGluaXRpYWxpemVkIHdpdGggYSBzaGVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiAgICAgICAgICAgIHBhcmVudCBzaGVsbCBmb3IgZXJyb3IgZGlhbG9ncwotCSAqLwotCXB1YmxpYyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uKFNoZWxsIHNoZWxsKSB7Ci0JCW1lc3NhZ2VTaGVsbCA9IHNoZWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG9wZXJhdGlvbiBpcyBhYmxlIHRvIHBlcmZvcm0gb24tdGhlLWZseQotCSAqIGF1dG8tcmVuYW1pbmcgb2YgcmVzb3VyY2VzIHdpdGggbmFtZSBjb2xsaXNpb25zLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXV0by1yZW5hbWUgaXMgc3VwcG9ydGVkLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5QZXJmb3JtQXV0b1JlbmFtZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZSBmb3IgcXVlcnlpbmcgZGVlcCBjb3B5L21vdmUgb2YgYSBsaW5rZWQgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgcmVzb3VyY2UgdGhlIHF1ZXJ5IGlzIG1hZGUgZm9yCi0JICogQHJldHVybiB0aGUgZGVlcCBxdWVyeSBtZXNzYWdlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWVwQ2hlY2tRdWVzdGlvbihJUmVzb3VyY2Ugc291cmNlKSB7Ci0JCXJldHVybiBOTFMKLQkJCQkuYmluZCgKLQkJCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fZGVlcENvcHlRdWVzdGlvbiwKLQkJCQkJCXNvdXJjZS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgaW5mb3MgZXhpc3QuCi0JICogCi0JICogQHBhcmFtIHN0b3JlcwotCSAqICAgICAgICAgICAgdGhlIGZpbGUgaW5mb3MgdG8gdGVzdAotCSAqIEByZXR1cm4gTXVsdGkgc3RhdHVzIHdpdGggb25lIGVycm9yIG1lc3NhZ2UgZm9yIGVhY2ggbWlzc2luZyBmaWxlLgotCSAqLwotCUlTdGF0dXMgY2hlY2tFeGlzdChJRmlsZVN0b3JlW10gc3RvcmVzKSB7Ci0JCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBsYXRmb3JtVUkuUExVR0lOX0lELAotCQkJCUlTdGF0dXMuT0ssIGdldFByb2JsZW1zTWVzc2FnZSgpLCBudWxsKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0b3Jlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHN0b3Jlc1tpXS5mZXRjaEluZm8oKS5leGlzdHMoKSA9PSBmYWxzZSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCQkuYmluZCgKLQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9yZXNvdXJjZURlbGV0ZWQsCi0JCQkJCQkJCXN0b3Jlc1tpXS5nZXROYW1lKCkpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJUGxhdGZvcm1VSS5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIG51bGwpOwotCQkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtdWx0aVN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgcmVzb3VyY2VzIHdpdGggdGhlIGdpdmVuIG5hbWVzIGV4aXN0LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIElSZXNvdXJjZXMgdG8gY2hlY2wKLQkgKiBAcmV0dXJuIE11bHRpIHN0YXR1cyB3aXRoIG9uZSBlcnJvciBtZXNzYWdlIGZvciBlYWNoIG1pc3NpbmcgZmlsZS4KLQkgKi8KLQlJU3RhdHVzIGNoZWNrRXhpc3QoSVJlc291cmNlW10gcmVzb3VyY2VzKSB7Ci0JCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBsYXRmb3JtVUkuUExVR0lOX0lELAotCQkJCUlTdGF0dXMuT0ssIGdldFByb2JsZW1zTWVzc2FnZSgpLCBudWxsKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlVUkkgbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvblVSSSgpOwotCQkJCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQlJRmlsZUluZm8gaW5mbyA9IElERVJlc291cmNlSW5mb1V0aWxzLmdldEZpbGVJbmZvKGxvY2F0aW9uKTsKLQkJCQkJaWYgKGluZm8gPT0gbnVsbCB8fCBpbmZvLmV4aXN0cygpID09IGZhbHNlKSB7Ci0JCQkJCQlpZiAocmVzb3VyY2UuaXNMaW5rZWQoKSkgewotCQkJCQkJCW1lc3NhZ2UgPSBOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX21pc3NpbmdMaW5rVGFyZ2V0LAotCQkJCQkJCQkJCQlyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQltZXNzYWdlID0gTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9yZXNvdXJjZURlbGV0ZWQsCi0JCQkJCQkJCQkJCXJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlQbGF0Zm9ybVVJLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgbnVsbCk7Ci0JCQkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIHVzZXIgd2lzaGVzIHRvIG92ZXJ3cml0ZSB0aGUgc3VwcGxpZWQgcmVzb3VyY2Ugb3IgYWxsCi0JICogcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgcmVzb3VyY2UKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSB0byBiZSBvdmVyd3JpdHRlbgotCSAqIEByZXR1cm4gb25lIG9mIElEaWFsb2dDb25zdGFudHMuWUVTX0lELCBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQsCi0JICogICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk5PX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCBpbmRpY2F0aW5nCi0JICogICAgICAgICB3aGV0aGVyIHRoZSBjdXJyZW50IHJlc291cmNlIG9yIGFsbCByZXNvdXJjZXMgY2FuIGJlIG92ZXJ3cml0dGVuLAotCSAqICAgICAgICAgb3IgaWYgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FuY2VsZWQuCi0JICovCi0JcHJpdmF0ZSBpbnQgY2hlY2tPdmVyd3JpdGUoZmluYWwgSVJlc291cmNlIHNvdXJjZSwKLQkJCWZpbmFsIElSZXNvdXJjZSBkZXN0aW5hdGlvbikgewotCQlmaW5hbCBpbnRbXSByZXN1bHQgPSBuZXcgaW50WzFdOwotCi0JCS8vIERpYWxvZ3MgbmVlZCB0byBiZSBjcmVhdGVkIGFuZCBvcGVuZWQgaW4gdGhlIFVJIHRocmVhZAotCQlSdW5uYWJsZSBxdWVyeSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZTsKLQkJCQlpbnQgcmVzdWx0SWRbXSA9IHsgSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQsCi0JCQkJCQlJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQsIElEaWFsb2dDb25zdGFudHMuTk9fSUQsCi0JCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCB9OwotCQkJCVN0cmluZyBsYWJlbHNbXSA9IG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLAotCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH07Ci0KLQkJCQlpZiAoZGVzdGluYXRpb24uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLQkJCQkJaWYgKGhvbW9nZW5vdXNSZXNvdXJjZXMoc291cmNlLCBkZXN0aW5hdGlvbikpIHsKLQkJCQkJCW1lc3NhZ2UgPSBOTFMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9vdmVyd3JpdGVNZXJnZVF1ZXN0aW9uLAotCQkJCQkJCQkJCWRlc3RpbmF0aW9uLmdldEZ1bGxQYXRoKCkKLQkJCQkJCQkJCQkJCS5tYWtlUmVsYXRpdmUoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoZGVzdGluYXRpb24uaXNMaW5rZWQoKSkgewotCQkJCQkJCW1lc3NhZ2UgPSBOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX292ZXJ3cml0ZU5vTWVyZ2VMaW5rUXVlc3Rpb24sCi0JCQkJCQkJCQkJCWRlc3RpbmF0aW9uLmdldEZ1bGxQYXRoKCkKLQkJCQkJCQkJCQkJCQkubWFrZVJlbGF0aXZlKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQltZXNzYWdlID0gTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9vdmVyd3JpdGVOb01lcmdlTm9MaW5rUXVlc3Rpb24sCi0JCQkJCQkJCQkJCWRlc3RpbmF0aW9uLmdldEZ1bGxQYXRoKCkKLQkJCQkJCQkJCQkJCQkubWFrZVJlbGF0aXZlKCkpOwotCQkJCQkJfQotCQkJCQkJcmVzdWx0SWQgPSBuZXcgaW50W10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCwKLQkJCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5OT19JRCwKLQkJCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQgfTsKLQkJCQkJCWxhYmVscyA9IG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9OwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nW10gYmluZGluZ3MgPSBuZXcgU3RyaW5nW10gewotCQkJCQkJCUlERVJlc291cmNlSW5mb1V0aWxzLmdldExvY2F0aW9uVGV4dChkZXN0aW5hdGlvbiksCi0JCQkJCQkJSURFUmVzb3VyY2VJbmZvVXRpbHMKLQkJCQkJCQkJCS5nZXREYXRlU3RyaW5nVmFsdWUoZGVzdGluYXRpb24pLAotCQkJCQkJCUlERVJlc291cmNlSW5mb1V0aWxzLmdldExvY2F0aW9uVGV4dChzb3VyY2UpLAotCQkJCQkJCUlERVJlc291cmNlSW5mb1V0aWxzLmdldERhdGVTdHJpbmdWYWx1ZShzb3VyY2UpIH07Ci0JCQkJCW1lc3NhZ2UgPSBOTFMKLQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fb3ZlcndyaXRlV2l0aERldGFpbHNRdWVzdGlvbiwKLQkJCQkJCQkJCWJpbmRpbmdzKTsKLQkJCQl9Ci0JCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZygKLQkJCQkJCW1lc3NhZ2VTaGVsbCwKLQkJCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fcmVzb3VyY2VFeGlzdHMsCi0JCQkJCQludWxsLCBtZXNzYWdlLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBsYWJlbHMsIDApOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gU1dULkRFRkFVTFQpIHsKLQkJCQkJLy8gQSB3aW5kb3cgY2xvc2UgcmV0dXJucyBTV1QuREVGQVVMVCwgd2hpY2ggaGFzIHRvIGJlCi0JCQkJCS8vIG1hcHBlZCB0byBhIGNhbmNlbAotCQkJCQlyZXN1bHRbMF0gPSBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRDsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHRbMF0gPSByZXN1bHRJZFtkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpXTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCW1lc3NhZ2VTaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMocXVlcnkpOwotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCS8qKgotCSAqIFJlY3Vyc2l2ZWx5IGNvbGxlY3RzIGV4aXN0aW5nIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzdGluYXRpb25QYXRoCi0JICogICAgICAgICAgICBkZXN0aW5hdGlvbiBwYXRoIHRvIGNoZWNrIGZvciBleGlzdGluZyBmaWxlcwotCSAqIEBwYXJhbSBjb3B5UmVzb3VyY2VzCi0JICogICAgICAgICAgICByZXNvdXJjZXMgdGhhdCBtYXkgZXhpc3QgaW4gdGhlIGRlc3RpbmF0aW9uCi0JICogQHBhcmFtIGV4aXN0aW5nCi0JICogICAgICAgICAgICBob2xkcyB0aGUgY29sbGVjdGVkIGV4aXN0aW5nIGZpbGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RFeGlzdGluZ1JlYWRvbmx5RmlsZXMoSVBhdGggZGVzdGluYXRpb25QYXRoLAotCQkJSVJlc291cmNlW10gY29weVJlc291cmNlcywgQXJyYXlMaXN0IGV4aXN0aW5nKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29weVJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHNvdXJjZSA9IGNvcHlSZXNvdXJjZXNbaV07Ci0JCQlJUGF0aCBuZXdEZXN0aW5hdGlvblBhdGggPSBkZXN0aW5hdGlvblBhdGguYXBwZW5kKHNvdXJjZS5nZXROYW1lKCkpOwotCQkJSVJlc291cmNlIG5ld0Rlc3RpbmF0aW9uID0gd29ya3NwYWNlUm9vdAotCQkJCQkuZmluZE1lbWJlcihuZXdEZXN0aW5hdGlvblBhdGgpOwotCQkJSUZvbGRlciBmb2xkZXI7Ci0KLQkJCWlmIChuZXdEZXN0aW5hdGlvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlmb2xkZXIgPSBnZXRGb2xkZXIobmV3RGVzdGluYXRpb24pOwotCQkJaWYgKGZvbGRlciAhPSBudWxsKSB7Ci0JCQkJSUZvbGRlciBzb3VyY2VGb2xkZXIgPSBnZXRGb2xkZXIoc291cmNlKTsKLQotCQkJCWlmIChzb3VyY2VGb2xkZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJY29sbGVjdEV4aXN0aW5nUmVhZG9ubHlGaWxlcyhuZXdEZXN0aW5hdGlvblBhdGgsCi0JCQkJCQkJCXNvdXJjZUZvbGRlci5tZW1iZXJzKCksIGV4aXN0aW5nKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJCXJlY29yZEVycm9yKGV4Y2VwdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKG5ld0Rlc3RpbmF0aW9uKTsKLQotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJaWYgKGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQlleGlzdGluZy5hZGQoZmlsZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGdldFZhbGlkYXRlQ29uZmxpY3RTb3VyY2UoKSkgewotCQkJCQkJSUZpbGUgc291cmNlRmlsZSA9IGdldEZpbGUoc291cmNlKTsKLQkJCQkJCWlmIChzb3VyY2VGaWxlICE9IG51bGwpIHsKLQkJCQkJCQlleGlzdGluZy5hZGQoc291cmNlRmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIHJlc291cmNlcyB0byB0aGUgZ2l2ZW4gZGVzdGluYXRpb24uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZAotCSAqIHJlY3Vyc2l2ZWx5IHRvIG1lcmdlIGZvbGRlcnMgZHVyaW5nIGZvbGRlciBjb3B5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZXMgdG8gY29weQotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotCSAqICAgICAgICAgICAgZGVzdGluYXRpb24gdG8gd2hpY2ggcmVzb3VyY2VzIHdpbGwgYmUgY29waWVkCi0JICogQHBhcmFtIHN1Yk1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvciBmb3Igc2hvd2luZyBwcm9ncmVzcyBhbmQgZm9yIGNhbmNlbGF0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weShJUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIGRlc3RpbmF0aW9uLAotCQkJSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJc3ViTW9uaXRvcgotCQkJCS5iZWdpblRhc2soCi0JCQkJCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX0NvcHlSZXNvdXJjZXNUYXNrLAotCQkJCQkJcmVzb3VyY2VzLmxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlSZXNvdXJjZSBzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JCQlJUGF0aCBkZXN0aW5hdGlvblBhdGggPSBkZXN0aW5hdGlvbi5hcHBlbmQoc291cmNlLmdldE5hbWUoKSk7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IHNvdXJjZS5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpOwotCQkJSVJlc291cmNlIGV4aXN0aW5nID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKGRlc3RpbmF0aW9uUGF0aCk7Ci0JCQlpZiAoc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICYmIGV4aXN0aW5nICE9IG51bGwpIHsKLQkJCQkvLyB0aGUgcmVzb3VyY2UgaXMgYSBmb2xkZXIgYW5kIGl0IGV4aXN0cyBpbiB0aGUgZGVzdGluYXRpb24sCi0JCQkJLy8gY29weSB0aGUKLQkJCQkvLyBjaGlsZHJlbiBvZiB0aGUgZm9sZGVyLgotCQkJCWlmIChob21vZ2Vub3VzUmVzb3VyY2VzKHNvdXJjZSwgZXhpc3RpbmcpKSB7Ci0JCQkJCUlSZXNvdXJjZVtdIGNoaWxkcmVuID0gKChJQ29udGFpbmVyKSBzb3VyY2UpLm1lbWJlcnMoKTsKLQkJCQkJY29weShjaGlsZHJlbiwgZGVzdGluYXRpb25QYXRoLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKAotCQkJCQkJCXN1Yk1vbml0b3IsIDEpKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBkZWxldGUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlciwgY29weWluZyBhIGxpbmtlZCBmb2xkZXIKLQkJCQkJLy8gb3ZlciBhbiB1bmxpbmtlZCBvbmUgb3IgdmljZSB2ZXJzYS4gRml4ZXMgYnVnIDI4NzcyLgotCQkJCQlkZWxldGUoZXhpc3RpbmcsIG5ldyBTdWJQcm9ncmVzc01vbml0b3Ioc3ViTW9uaXRvciwgMCkpOwotCQkJCQlzb3VyY2UuY29weShkZXN0aW5hdGlvblBhdGgsIElSZXNvdXJjZS5TSEFMTE9XLAotCQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3Ioc3ViTW9uaXRvciwgMSkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKLQkJCQkJaWYgKGhvbW9nZW5vdXNSZXNvdXJjZXMoc291cmNlLCBleGlzdGluZykpCi0JCQkJCQljb3B5RXhpc3Rpbmcoc291cmNlLCBleGlzdGluZywgbmV3IFN1YlByb2dyZXNzTW9uaXRvcigKLQkJCQkJCQkJc3ViTW9uaXRvciwgMSkpOwotCQkJCQllbHNlIHsKLQkJCQkJCS8vIENvcHlpbmcgYSBsaW5rZWQgcmVzb3VyY2Ugb3ZlciB1bmxpbmtlZCBvciB2aWNlCi0JCQkJCQkvLyB2ZXJzYS4KLQkJCQkJCS8vIENhbid0IHVzZSBzZXRDb250ZW50cyBoZXJlLiBGaXhlcyBidWcgMjg3NzIuCi0JCQkJCQlkZWxldGUoZXhpc3RpbmcsIG5ldyBTdWJQcm9ncmVzc01vbml0b3Ioc3ViTW9uaXRvciwgMCkpOwotCQkJCQkJc291cmNlLmNvcHkoZGVzdGluYXRpb25QYXRoLCBJUmVzb3VyY2UuU0hBTExPVywKLQkJCQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihzdWJNb25pdG9yLCAxKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlzb3VyY2UuY29weShkZXN0aW5hdGlvblBhdGgsIElSZXNvdXJjZS5TSEFMTE9XLAotCQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3Ioc3ViTW9uaXRvciwgMSkpOwotCi0JCQkJfQotCi0JCQkJaWYgKHN1Yk1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGV4aXN0aW5nIGZpbGUgdG8gdGhlIHNvdXJjZSBmaWxlIGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgc291cmNlIGZpbGUgdG8gY29weQotCSAqIEBwYXJhbSBleGlzdGluZwotCSAqICAgICAgICAgICAgZXhpc3RpbmcgZmlsZSB0byBzZXQgdGhlIHNvdXJjZSBjb250ZW50IGluCi0JICogQHBhcmFtIHN1Yk1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvciBmb3Igc2hvd2luZyBwcm9ncmVzcyBhbmQgZm9yIGNhbmNlbGF0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgc2V0Q29udGVudHMgZmFpbGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvcHlFeGlzdGluZyhJUmVzb3VyY2Ugc291cmNlLCBJUmVzb3VyY2UgZXhpc3RpbmcsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZpbGUgZXhpc3RpbmdGaWxlID0gZ2V0RmlsZShleGlzdGluZyk7Ci0KLQkJaWYgKGV4aXN0aW5nRmlsZSAhPSBudWxsKSB7Ci0JCQlJRmlsZSBzb3VyY2VGaWxlID0gZ2V0RmlsZShzb3VyY2UpOwotCi0JCQlpZiAoc291cmNlRmlsZSAhPSBudWxsKSB7Ci0JCQkJZXhpc3RpbmdGaWxlLnNldENvbnRlbnRzKHNvdXJjZUZpbGUuZ2V0Q29udGVudHMoKSwKLQkJCQkJCUlSZXNvdXJjZS5LRUVQX0hJU1RPUlksIG5ldyBTdWJQcm9ncmVzc01vbml0b3IoCi0JCQkJCQkJCXN1Yk1vbml0b3IsIDApKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgZ2l2ZW4gcmVzb3VyY2VzIHRvIHRoZSBkZXN0aW5hdGlvbi4gVGhlIGN1cnJlbnQgVGhyZWFkIGlzCi0JICogaGFsdGVkIHdoaWxlIHRoZSByZXNvdXJjZXMgYXJlIGNvcGllZCB1c2luZyBhIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbi4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIFVJVGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZXMgdG8gY29weQotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotCSAqICAgICAgICAgICAgZGVzdGluYXRpb24gdG8gd2hpY2ggcmVzb3VyY2VzIHdpbGwgYmUgY29waWVkCi0JICogQHJldHVybiBJUmVzb3VyY2VbXSB0aGUgcmVzdWx0aW5nIHtAbGluayBJUmVzb3VyY2V9W10KLQkgKiBAc2VlIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbgotCSAqIEBzZWUgRGlzcGxheSNnZXRUaHJlYWQoKQotCSAqIEBzZWUgVGhyZWFkI2N1cnJlbnRUaHJlYWQoKQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VbXSBjb3B5UmVzb3VyY2VzKGZpbmFsIElSZXNvdXJjZVtdIHJlc291cmNlcywKLQkJCUlDb250YWluZXIgZGVzdGluYXRpb24pIHsKLQkJcmV0dXJuIGNvcHlSZXNvdXJjZXMocmVzb3VyY2VzLCBkZXN0aW5hdGlvbiwgdHJ1ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBnaXZlbiByZXNvdXJjZXMgdG8gdGhlIGRlc3RpbmF0aW9uIGluIHRoZSBjdXJyZW50IFRocmVhZAotCSAqIHdpdGhvdXQgZm9ya2luZyBhIG5ldyBUaHJlYWQgb3IgYmxvY2tpbmcgdXNpbmcgYQotCSAqIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbi4gSXQgcmVjb21tZW5kZWQgdGhhdCB0aGlzIG1ldGhvZCBvbmx5IGJlIGNhbGxlZAotCSAqIGZyb20gYSB7QGxpbmsgV29ya3NwYWNlSm9ifSB0byBhdm9pZCBwb3NzaWJsZSBkZWFkbG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogICAgICAgICAgICB0aGUgcmVzb3VyY2VzIHRvIGNvcHkKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHRvIHdoaWNoIHJlc291cmNlcyB3aWxsIGJlIGNvcGllZAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgbW9uaXRvciB0aGF0IGluZm9ybWF0aW9uIHdpbGwgYmUgc2VudCB0by4KLQkgKiBAcmV0dXJuIElSZXNvdXJjZVtdIHRoZSByZXN1bHRpbmcge0BsaW5rIElSZXNvdXJjZX1bXQotCSAqIEBzZWUgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uCi0JICogQHNlZSBXb3Jrc3BhY2VKb2IKLSAgICAgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIElSZXNvdXJjZVtdIGNvcHlSZXNvdXJjZXNJbkN1cnJlbnRUaHJlYWQoZmluYWwgSVJlc291cmNlW10gcmVzb3VyY2VzLAotCQkJSUNvbnRhaW5lciBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBjb3B5UmVzb3VyY2VzKHJlc291cmNlcywgZGVzdGluYXRpb24sIGZhbHNlLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGdpdmVuIHJlc291cmNlcyB0byB0aGUgZGVzdGluYXRpb24uCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlcyB0byBjb3B5Ci0JICogQHBhcmFtIGRlc3RpbmF0aW9uCi0JICogICAgICAgICAgICBkZXN0aW5hdGlvbiB0byB3aGljaCByZXNvdXJjZXMgd2lsbCBiZSBjb3BpZWQKLQkgKiBAcmV0dXJuIElSZXNvdXJjZVtdIHRoZSByZXN1bHRpbmcge0BsaW5rIElSZXNvdXJjZX1bXQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlW10gY29weVJlc291cmNlcyhmaW5hbCBJUmVzb3VyY2VbXSByZXNvdXJjZXMsCi0JCQlJQ29udGFpbmVyIGRlc3RpbmF0aW9uLCBib29sZWFuIGZvcmssIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBJUGF0aCBkZXN0aW5hdGlvblBhdGggPSBkZXN0aW5hdGlvbi5nZXRGdWxsUGF0aCgpOwotCQlmaW5hbCBJUmVzb3VyY2VbXVtdIGNvcGllZFJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbMV1bMF07Ci0KLQkJLy8gdGVzdCByZXNvdXJjZXMgZm9yIGV4aXN0ZW5jZSBzZXBhcmF0ZSBmcm9tIHZhbGlkYXRlIEFQSS4KLQkJLy8gVmFsaWRhdGUgaXMgcGVyZm9ybWFuY2UgY3JpdGljYWwgYW5kIHJlc291cmNlIGV4aXN0cwotCQkvLyBjaGVjayBpcyBwb3RlbnRpYWxseSBzbG93LiBGaXhlcyBidWdzIDE2MTI5LzI4NjAyLgotCQlJU3RhdHVzIHJlc291cmNlU3RhdHVzID0gY2hlY2tFeGlzdChyZXNvdXJjZXMpOwotCQlpZiAocmVzb3VyY2VTdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LKSB7Ci0JCQlkaXNwbGF5RXJyb3IocmVzb3VyY2VTdGF0dXMpOwotCQkJcmV0dXJuIGNvcGllZFJlc291cmNlc1swXTsKLQkJfQotCQlTdHJpbmcgZXJyb3JNc2cgPSB2YWxpZGF0ZURlc3RpbmF0aW9uKGRlc3RpbmF0aW9uLCByZXNvdXJjZXMpOwotCQlpZiAoZXJyb3JNc2cgIT0gbnVsbCkgewotCQkJZGlzcGxheUVycm9yKGVycm9yTXNnKTsKLQkJCXJldHVybiBjb3BpZWRSZXNvdXJjZXNbMF07Ci0JCX0KLQotCQlpZiAoZm9yaykgewotCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQljb3B5UmVzb3VyY2VzKHJlc291cmNlcywgZGVzdGluYXRpb25QYXRoLCBjb3BpZWRSZXNvdXJjZXMsCi0JCQkJCQkJbW9uaXRvcik7Ci0JCQkJfQotCQkJfTsKLQotCQkJdHJ5IHsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bih0cnVlLCB0cnVlLAotCQkJCQkJb3ApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBjb3BpZWRSZXNvdXJjZXNbMF07Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlkaXNwbGF5KGUpOwotCQkJfQotCQl9Ci0KLQkJZWxzZQotCQkJY29weVJlc291cmNlcyhyZXNvdXJjZXMsIGRlc3RpbmF0aW9uUGF0aCwgY29waWVkUmVzb3VyY2VzLCBtb25pdG9yKTsKLQotCQkvLyBJZiBlcnJvcnMgb2NjdXJyZWQsIG9wZW4gYW4gRXJyb3IgZGlhbG9nCi0JCWlmIChlcnJvclN0YXR1cyAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5RXJyb3IoZXJyb3JTdGF0dXMpOwotCQkJZXJyb3JTdGF0dXMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBjb3BpZWRSZXNvdXJjZXNbMF07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXkoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIENvcmVFeGNlcHRpb25zIGFyZSBjb2xsZWN0ZWQgYWJvdmUsIGJ1dCB1bmV4cGVjdGVkIHJ1bnRpbWUKLQkJLy8gZXhjZXB0aW9ucyBhbmQgZXJyb3JzIG1heSBzdGlsbCBvY2N1ci4KLQkJSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coCi0JCQkJU3RhdHVzVXRpbC5uZXdTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkiRXhjZXB0aW9uIGluIHswfS5wZXJmb3JtQ29weSgpOiB7MX0iLCAvLyROT04tTkxTLTEkCi0JCQkJCQluZXcgT2JqZWN0W10geyBnZXRDbGFzcygpLmdldE5hbWUoKSwKLQkJCQkJCQkJZS5nZXRUYXJnZXRFeGNlcHRpb24oKSB9KSwgbnVsbCkpOwotCQlkaXNwbGF5RXJyb3IoTkxTCi0JCQkJLmJpbmQoCi0JCQkJCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2ludGVybmFsRXJyb3IsCi0JCQkJCQllLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSkpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgZ2l2ZW4gVVJJUyBhbmQgZm9sZGVycyB0byB0aGUgZGVzdGluYXRpb24uIFRoZSBjdXJyZW50IFRocmVhZAotCSAqIGlzIGhhbHRlZCB3aGlsZSB0aGUgcmVzb3VyY2VzIGFyZSBjb3BpZWQgdXNpbmcgYQotCSAqIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbi4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBVSQotCSAqIFRocmVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpcwotCSAqICAgICAgICAgICAgdGhlIFVSSXMgdG8gY29weQotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotCSAqICAgICAgICAgICAgZGVzdGluYXRpb24gdG8gd2hpY2ggZmlsZXMgd2lsbCBiZSBjb3BpZWQKLQkgKiBAc2VlIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbgotCSAqIEBzZWUgRGlzcGxheSNnZXRUaHJlYWQoKQotCSAqIEBzZWUgVGhyZWFkI2N1cnJlbnRUaHJlYWQoKQotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5RmlsZXMoVVJJW10gdXJpcywgSUNvbnRhaW5lciBkZXN0aW5hdGlvbikgewotCQlJRmlsZVN0b3JlW10gc3RvcmVzID0gYnVpbGRGaWxlU3RvcmVzKHVyaXMpOwotCQlpZiAoc3RvcmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29weUZpbGVTdG9yZXMoZGVzdGluYXRpb24sIHN0b3JlcywgdHJ1ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBnaXZlbiBmaWxlcyBhbmQgZm9sZGVycyB0byB0aGUgZGVzdGluYXRpb24gd2l0aG91dCBmb3JraW5nIGEKLQkgKiBuZXcgVGhyZWFkIG9yIGJsb2NraW5nIHVzaW5nIGEgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uLiBJdCBpcwotCSAqIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBtZXRob2Qgb25seSBiZSBjYWxsZWQgZnJvbSBhIHtAbGluayBXb3Jrc3BhY2VKb2J9Ci0JICogdG8gYXZvaWQgcG9zc2libGUgZGVhZGxvY2suCi0JICogCi0JICogQHBhcmFtIHVyaXMKLQkgKiAgICAgICAgICAgIHRoZSBVUklzIHRvIGNvcHkKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHRvIHdoaWNoIFVSSVMgd2lsbCBiZSBjb3BpZWQKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIG1vbml0b3IgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIHNlbnQgdG8uCi0JICogQHNlZSBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24KLQkgKiBAc2VlIFdvcmtzcGFjZUpvYgotICAgICAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5RmlsZXNJbkN1cnJlbnRUaHJlYWQoVVJJW10gdXJpcywgSUNvbnRhaW5lciBkZXN0aW5hdGlvbiwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJRmlsZVN0b3JlW10gc3RvcmVzID0gYnVpbGRGaWxlU3RvcmVzKHVyaXMpOwotCQlpZiAoc3RvcmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29weUZpbGVTdG9yZXMoZGVzdGluYXRpb24sIHN0b3JlcywgZmFsc2UsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBjb2xsZWN0aW9uIG9mIGZpbGVTdG9yZXMgdGhhdCBtYXAgdG8gZmlsZU5hbWVzLiBJZiBhbnkgb2YgdGhlbQotCSAqIGNhbm5vdCBiZSBmb3VuZCB0aGVuIG1hdGNoIHRoZW4gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB1cmlzCi0JICogQHJldHVybiBJRmlsZVN0b3JlW10KLQkgKi8KLQlwcml2YXRlIElGaWxlU3RvcmVbXSBidWlsZEZpbGVTdG9yZXMoVVJJW10gdXJpcykgewotCQlJRmlsZVN0b3JlW10gc3RvcmVzID0gbmV3IElGaWxlU3RvcmVbdXJpcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoOyBpKyspIHsKLQkJCUlGaWxlU3RvcmUgc3RvcmU7Ci0JCQl0cnkgewotCQkJCXN0b3JlID0gRUZTLmdldFN0b3JlKHVyaXNbaV0pOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJSURFV29ya2JlbmNoUGx1Z2luLmxvZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJcmVwb3J0RmlsZUluZm9Ob3RGb3VuZCh1cmlzW2ldLnRvU3RyaW5nKCkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYgKHN0b3JlID09IG51bGwpIHsKLQkJCQlyZXBvcnRGaWxlSW5mb05vdEZvdW5kKHVyaXNbaV0udG9TdHJpbmcoKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlzdG9yZXNbaV0gPSBzdG9yZTsKLQkJfQotCQlyZXR1cm4gc3RvcmVzOwotCi0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBnaXZlbiBmaWxlcyBhbmQgZm9sZGVycyB0byB0aGUgZGVzdGluYXRpb24uIFRoZSBjdXJyZW50IFRocmVhZAotCSAqIGlzIGhhbHRlZCB3aGlsZSB0aGUgcmVzb3VyY2VzIGFyZSBjb3BpZWQgdXNpbmcgYQotCSAqIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbi4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBVSQotCSAqIFRocmVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWVzCi0JICogICAgICAgICAgICBuYW1lcyBvZiB0aGUgZmlsZXMgdG8gY29weQotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotCSAqICAgICAgICAgICAgZGVzdGluYXRpb24gdG8gd2hpY2ggZmlsZXMgd2lsbCBiZSBjb3BpZWQKLQkgKiBAc2VlIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbgotCSAqIEBzZWUgRGlzcGxheSNnZXRUaHJlYWQoKQotCSAqIEBzZWUgVGhyZWFkI2N1cnJlbnRUaHJlYWQoKQotICAgICAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5RmlsZXMoZmluYWwgU3RyaW5nW10gZmlsZU5hbWVzLCBJQ29udGFpbmVyIGRlc3RpbmF0aW9uKSB7Ci0JCUlGaWxlU3RvcmVbXSBzdG9yZXMgPSBidWlsZEZpbGVTdG9yZXMoZmlsZU5hbWVzKTsKLQkJaWYgKHN0b3JlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNvcHlGaWxlU3RvcmVzKGRlc3RpbmF0aW9uLCBzdG9yZXMsIHRydWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgZ2l2ZW4gZmlsZXMgYW5kIGZvbGRlcnMgdG8gdGhlIGRlc3RpbmF0aW9uIHdpdGhvdXQgZm9ya2luZyBhCi0JICogbmV3IFRocmVhZCBvciBibG9ja2luZyB1c2luZyBhIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbi4gSXQgaXMKLQkgKiByZWNvbW1lbmRlZCB0aGF0IHRoaXMgbWV0aG9kIG9ubHkgYmUgY2FsbGVkIGZyb20gYSB7QGxpbmsgV29ya3NwYWNlSm9ifQotCSAqIHRvIGF2b2lkIHBvc3NpYmxlIGRlYWRsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZXMKLQkgKiAgICAgICAgICAgIG5hbWVzIG9mIHRoZSBmaWxlcyB0byBjb3B5Ci0JICogQHBhcmFtIGRlc3RpbmF0aW9uCi0JICogICAgICAgICAgICBkZXN0aW5hdGlvbiB0byB3aGljaCBmaWxlcyB3aWxsIGJlIGNvcGllZAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgbW9uaXRvciB0aGF0IGluZm9ybWF0aW9uIHdpbGwgYmUgc2VudCB0by4KLQkgKiBAc2VlIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbgotCSAqIEBzZWUgV29ya3NwYWNlSm9iCi0gICAgICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlGaWxlc0luQ3VycmVudFRocmVhZChmaW5hbCBTdHJpbmdbXSBmaWxlTmFtZXMsIElDb250YWluZXIgZGVzdGluYXRpb24sCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSUZpbGVTdG9yZVtdIHN0b3JlcyA9IGJ1aWxkRmlsZVN0b3JlcyhmaWxlTmFtZXMpOwotCQlpZiAoc3RvcmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29weUZpbGVTdG9yZXMoZGVzdGluYXRpb24sIHN0b3JlcywgZmFsc2UsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBjb2xsZWN0aW9uIG9mIGZpbGVTdG9yZXMgdGhhdCBtYXAgdG8gZmlsZU5hbWVzLiBJZiBhbnkgb2YgdGhlbQotCSAqIGNhbm5vdCBiZSBmb3VuZCB0aGVuIG1hdGNoIHRoZW4gcmV0dXJuIG51bGwuCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lcwotCSAqIEByZXR1cm4gSUZpbGVTdG9yZVtdCi0JICovCi0JcHJpdmF0ZSBJRmlsZVN0b3JlW10gYnVpbGRGaWxlU3RvcmVzKGZpbmFsIFN0cmluZ1tdIGZpbGVOYW1lcykgewotCQlJRmlsZVN0b3JlW10gc3RvcmVzID0gbmV3IElGaWxlU3RvcmVbZmlsZU5hbWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmlsZVN0b3JlIHN0b3JlID0gSURFUmVzb3VyY2VJbmZvVXRpbHMuZ2V0RmlsZVN0b3JlKGZpbGVOYW1lc1tpXSk7Ci0JCQlpZiAoc3RvcmUgPT0gbnVsbCkgewotCQkJCXJlcG9ydEZpbGVJbmZvTm90Rm91bmQoZmlsZU5hbWVzW2ldKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXN0b3Jlc1tpXSA9IHN0b3JlOwotCQl9Ci0JCXJldHVybiBzdG9yZXM7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoYXQgYSBmaWxlIGluZm8gY291bGQgbm90IGJlIGZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCByZXBvcnRGaWxlSW5mb05vdEZvdW5kKGZpbmFsIFN0cmluZyBmaWxlTmFtZSkgewotCi0JCW1lc3NhZ2VTaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUVycm9yRGlhbG9nCi0JCQkJCQkub3BlbkVycm9yKAotCQkJCQkJCQltZXNzYWdlU2hlbGwsCi0JCQkJCQkJCWdldFByb2JsZW1zVGl0bGUoKSwKLQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2luZm9Ob3RGb3VuZCwKLQkJCQkJCQkJCQkJCWZpbGVOYW1lKSwgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgZ2l2ZW4gZmlsZXMgYW5kIGZvbGRlcnMgdG8gdGhlIGRlc3RpbmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzdG9yZXMKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHN0b3JlcyB0byBjb3B5Ci0JICogQHBhcmFtIGRlc3RpbmF0aW9uCi0JICogICAgICAgICAgICBkZXN0aW5hdGlvbiB0byB3aGljaCBmaWxlcyB3aWxsIGJlIGNvcGllZAotCSAqLwotCXByaXZhdGUgdm9pZCBjb3B5RmlsZVN0b3JlcyhJQ29udGFpbmVyIGRlc3RpbmF0aW9uLAotCQkJZmluYWwgSUZpbGVTdG9yZVtdIHN0b3JlcywgYm9vbGVhbiBmb3JrLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gdGVzdCBmaWxlcyBmb3IgZXhpc3RlbmNlIHNlcGFyYXRlIGZyb20gdmFsaWRhdGUgQVBJCi0JCS8vIGJlY2F1c2UgYW4gZXh0ZXJuYWwgZmlsZSBtYXkgbm90IGV4aXN0IHVudGlsIHRoZSBjb3B5IGFjdHVhbGx5Ci0JCS8vIHRha2VzIHBsYWNlIChlLmcuLCBXaW5aaXAgY29udGVudHMpLgotCQlJU3RhdHVzIGZpbGVTdGF0dXMgPSBjaGVja0V4aXN0KHN0b3Jlcyk7Ci0JCWlmIChmaWxlU3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSykgewotCQkJZGlzcGxheUVycm9yKGZpbGVTdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBlcnJvck1zZyA9IHZhbGlkYXRlSW1wb3J0RGVzdGluYXRpb25JbnRlcm5hbChkZXN0aW5hdGlvbiwgc3RvcmVzKTsKLQkJaWYgKGVycm9yTXNnICE9IG51bGwpIHsKLQkJCWRpc3BsYXlFcnJvcihlcnJvck1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgSVBhdGggZGVzdGluYXRpb25QYXRoID0gZGVzdGluYXRpb24uZ2V0RnVsbFBhdGgoKTsKLQotCQlpZiAoZm9yaykgewotCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQljb3B5RmlsZVN0b3JlcyhzdG9yZXMsIGRlc3RpbmF0aW9uUGF0aCwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSwgdHJ1ZSwKLQkJCQkJCW9wKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm47Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCWRpc3BsYXkoZXhjZXB0aW9uKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQljb3B5RmlsZVN0b3JlcyhzdG9yZXMsIGRlc3RpbmF0aW9uUGF0aCwgbW9uaXRvcik7Ci0KLQkJLy8gSWYgZXJyb3JzIG9jY3VycmVkLCBvcGVuIGFuIEVycm9yIGRpYWxvZwotCQlpZiAoZXJyb3JTdGF0dXMgIT0gbnVsbCkgewotCQkJZGlzcGxheUVycm9yKGVycm9yU3RhdHVzKTsKLQkJCWVycm9yU3RhdHVzID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgdGhlIHN1cHBsaWVkIHN0YXR1cyBpbiBhbiBlcnJvciBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIGZpbGVTdGF0dXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzcGxheUVycm9yKGZpbmFsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCW1lc3NhZ2VTaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihtZXNzYWdlU2hlbGwsIGdldFByb2JsZW1zVGl0bGUoKSwgbnVsbCwKLQkJCQkJCXN0YXR1cyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBmaWxlIG9yIGZvbGRlciBoYW5kbGUgZm9yIHRoZSBzb3VyY2UgcmVzb3VyY2UgYXMgaWYgaXQgd2VyZSB0bwotCSAqIGJlIGNyZWF0ZWQgaW4gdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIHNvdXJjZSByZXNvdXJjZQotCSAqIEByZXR1cm4gSVJlc291cmNlIGZpbGUgb3IgZm9sZGVyIGhhbmRsZSwgZGVwZW5kaW5nIG9uIHRoZSBzb3VyY2UgdHlwZS4KLQkgKi8KLQlJUmVzb3VyY2UgY3JlYXRlTGlua2VkUmVzb3VyY2VIYW5kbGUoSUNvbnRhaW5lciBkZXN0aW5hdGlvbiwKLQkJCUlSZXNvdXJjZSBzb3VyY2UpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBkZXN0aW5hdGlvbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IHdvcmtzcGFjZS5nZXRSb290KCk7Ci0JCUlQYXRoIGxpbmtQYXRoID0gZGVzdGluYXRpb24uZ2V0RnVsbFBhdGgoKS5hcHBlbmQoc291cmNlLmdldE5hbWUoKSk7Ci0JCUlSZXNvdXJjZSBsaW5rSGFuZGxlOwotCi0JCWlmIChzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLQkJCWxpbmtIYW5kbGUgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcihsaW5rUGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlsaW5rSGFuZGxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKGxpbmtQYXRoKTsKLQkJfQotCQlyZXR1cm4gbGlua0hhbmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiByZXNvdXJjZSBmcm9tIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICByZXNvdXJjZSB0byByZW1vdmUgZnJvbSB0aGUgd29ya3NwYWNlCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvciBmb3Igc2hvd2luZyBwcm9ncmVzcyBhbmQgZm9yIGNhbmNlbGF0aW9uCi0JICogQHJldHVybiB0cnVlIHRoZSByZXNvdXJjZSB3YXMgZGVsZXRlZCBzdWNjZXNzZnVsbHkgZmFsc2UgdGhlIHJlc291cmNlIHdhcwotCSAqICAgICAgICAgbm90IGRlbGV0ZWQgYmVjYXVzZSBhIENvcmVFeGNlcHRpb24gb2NjdXJyZWQKLQkgKi8KLQlib29sZWFuIGRlbGV0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlib29sZWFuIGZvcmNlID0gZmFsc2U7IC8vIGRvbid0IGZvcmNlIGRlbGV0aW9uIG9mIG91dC1vZi1zeW5jIHJlc291cmNlcwotCi0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCS8vIGlmIGl0J3MgYSBwcm9qZWN0LCBhc2sgd2hldGhlciBjb250ZW50IHNob3VsZCBiZSBkZWxldGVkIHRvbwotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQl0cnkgewotCQkJCXByb2plY3QuZGVsZXRlKHRydWUsIGZvcmNlLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJlY29yZEVycm9yKGUpOyAvLyBsb2cgZXJyb3IKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiBpdCdzIG5vdCBhIHByb2plY3QsIGp1c3QgZGVsZXRlIGl0Ci0JCQlpbnQgZmxhZ3MgPSBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZOwotCQkJaWYgKGZvcmNlKSB7Ci0JCQkJZmxhZ3MgPSBmbGFncyB8IElSZXNvdXJjZS5GT1JDRTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UuZGVsZXRlKGZsYWdzLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJlY29yZEVycm9yKGUpOyAvLyBsb2cgZXJyb3IKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXJyb3IgZGlhbG9nIHRvIGRpc3BsYXkgdGhlIGdpdmVuIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlIHRvIHNob3cKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzcGxheUVycm9yKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCW1lc3NhZ2VTaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG1lc3NhZ2VTaGVsbCwgZ2V0UHJvYmxlbXNUaXRsZSgpLAotCQkJCQkJbWVzc2FnZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGVpdGhlciBjYXN0ZWQgdG8gb3IgYWRhcHRlZCB0byBhbiBJRmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHJlc291cmNlIHRvIGNhc3QvYWRhcHQKLQkgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBlaXRoZXIgY2FzdGVkIHRvIG9yIGFkYXB0ZWQgdG8gYW4gSUZpbGUuCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzb3VyY2UgZG9lcyBub3QgYWRhcHQgdG8gSUZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCXJldHVybiAoSUZpbGUpIHJlc291cmNlOwotCQl9Ci0JCXJldHVybiAoSUZpbGUpICgoSUFkYXB0YWJsZSkgcmVzb3VyY2UpLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgamF2YS5pby5GaWxlIG9iamVjdHMgZm9yIHRoZSBnaXZlbiBmaWxlIG5hbWVzLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZXMKLQkgKiAgICAgICAgICAgIGZpbGVzIHRvIHJldHVybiBGaWxlIG9iamVjdCBmb3IuCi0JICogQHJldHVybiBqYXZhLmlvLkZpbGUgb2JqZWN0cyBmb3IgdGhlIGdpdmVuIGZpbGUgbmFtZXMuCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm90IGxvbmdlciBpbiB1c2UgYW55d2hlcmUgaW4gdGhpcyBjbGFzcyBhbmQKLQkgKiAgICAgICAgICAgICBpcyBvbmx5IHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSB3aXRoIHN1YmNsYXNzZXMKLQkgKiAgICAgICAgICAgICBvZiB0aGUgcmVjZWl2ZXIuCi0JICovCi0JcHJvdGVjdGVkIEZpbGVbXSBnZXRGaWxlcyhTdHJpbmdbXSBmaWxlTmFtZXMpIHsKLQkJRmlsZVtdIGZpbGVzID0gbmV3IEZpbGVbZmlsZU5hbWVzLmxlbmd0aF07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbGVzW2ldID0gbmV3IEZpbGUoZmlsZU5hbWVzW2ldKTsKLQkJfQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgZWl0aGVyIGNhc3RlZCB0byBvciBhZGFwdGVkIHRvIGFuIElGb2xkZXIuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICByZXNvdXJjZSB0byBjYXN0L2FkYXB0Ci0JICogQHJldHVybiB0aGUgcmVzb3VyY2UgZWl0aGVyIGNhc3RlZCB0byBvciBhZGFwdGVkIHRvIGFuIElGb2xkZXIuCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzb3VyY2UgZG9lcyBub3QgYWRhcHQgdG8gSUZvbGRlcgotCSAqLwotCXByb3RlY3RlZCBJRm9sZGVyIGdldEZvbGRlcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJcmV0dXJuIChJRm9sZGVyKSByZXNvdXJjZTsKLQkJfQotCQlyZXR1cm4gKElGb2xkZXIpICgoSUFkYXB0YWJsZSkgcmVzb3VyY2UpLmdldEFkYXB0ZXIoSUZvbGRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBuYW1lIGZvciBhIGNvcHkgb2YgdGhlIHJlc291cmNlIGF0IHRoZSBnaXZlbiBwYXRoIGluIHRoZQotCSAqIGdpdmVuIHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3JpZ2luYWxOYW1lCi0JICogICAgICAgICAgICB0aGUgZnVsbCBwYXRoIG9mIHRoZSByZXNvdXJjZQotCSAqIEBwYXJhbSB3b3Jrc3BhY2UKLQkgKiAgICAgICAgICAgIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIHRoZSBuZXcgZnVsbCBwYXRoIGZvciB0aGUgY29weSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICByZXNvdXJjZSBzaG91bGQgbm90IGJlIGNvcGllZAotCSAqLwotCXByaXZhdGUgSVBhdGggZ2V0TmV3TmFtZUZvcihmaW5hbCBJUGF0aCBvcmlnaW5hbE5hbWUsCi0JCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSkgewotCQlmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmZpbmRNZW1iZXIob3JpZ2luYWxOYW1lKTsKLQkJZmluYWwgSVBhdGggcHJlZml4ID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCWZpbmFsIFN0cmluZyByZXR1cm5WYWx1ZVtdID0geyAiIiB9OyAvLyROT04tTkxTLTEkCi0KLQkJbWVzc2FnZVNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSUlucHV0VmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgc3RyaW5nKSB7Ci0JCQkJCQlpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhzdHJpbmcpKSB7Ci0JCQkJCQkJcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fbmFtZU11c3RCZURpZmZlcmVudDsKLQkJCQkJCX0KLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShzdHJpbmcsCi0JCQkJCQkJCXJlc291cmNlLmdldFR5cGUoKSk7Ci0JCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlyZXR1cm4gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmV4aXN0cyhwcmVmaXguYXBwZW5kKHN0cmluZykpKSB7Ci0JCQkJCQkJcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fbmFtZUV4aXN0czsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCUlucHV0RGlhbG9nIGRpYWxvZyA9IG5ldyBJbnB1dERpYWxvZygKLQkJCQkJCW1lc3NhZ2VTaGVsbCwKLQkJCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25faW5wdXREaWFsb2dUaXRsZSwKLQkJCQkJCU5MUwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2lucHV0RGlhbG9nTWVzc2FnZSwKLQkJCQkJCQkJCQlyZXNvdXJjZS5nZXROYW1lKCkpLCBnZXRBdXRvTmV3TmFtZUZvcigKLQkJCQkJCQkJb3JpZ2luYWxOYW1lLCB3b3Jrc3BhY2UpLmxhc3RTZWdtZW50KCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksIHZhbGlkYXRvcik7Ci0JCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCQlyZXR1cm5WYWx1ZVswXSA9IG51bGw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuVmFsdWVbMF0gPSBkaWFsb2cuZ2V0VmFsdWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlpZiAocmV0dXJuVmFsdWVbMF0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHByZWZpeC5hcHBlbmQocmV0dXJuVmFsdWVbMF0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhc2sgdGl0bGUgZm9yIHRoaXMgb3BlcmF0aW9uJ3MgcHJvZ3Jlc3MgZGlhbG9nLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRhc2sgdGl0bGUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZXJhdGlvblRpdGxlKCkgewotCQlyZXR1cm4gSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9vcGVyYXRpb25UaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGZvciB0aGlzIG9wZXJhdGlvbidzIHByb2JsZW1zIGRpYWxvZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9ibGVtcyBtZXNzYWdlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9ibGVtc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3Byb2JsZW1NZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIGZvciB0aGlzIG9wZXJhdGlvbidzIHByb2JsZW1zIGRpYWxvZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9ibGVtcyBkaWFsb2cgdGl0bGUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2JsZW1zVGl0bGUoKSB7Ci0JCXJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2NvcHlGYWlsZWRUaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNvdXJjZSBmaWxlIGluIGEgZGVzdGluYXRpb24gY29sbGlzaW9uIHdpbGwgYmUKLQkgKiB2YWxpZGF0ZUVkaXRlZCB0b2dldGhlciB3aXRoIHRoZSBjb2xsaXNpb24gaXRzZWxmLiBSZXR1cm5zIGZhbHNlLiBTaG91bGQKLQkgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlIGZpbGUgaXMgdG8gYmUgZGVsZXRlZCBhZnRlciB0aGUgb3BlcmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc291cmNlIGZpbGUgaW4gYSBkZXN0aW5hdGlvbgotCSAqICAgICAgICAgY29sbGlzaW9uIHNob3VsZCBiZSB2YWxpZGF0ZUVkaXRlZC4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG9ubHkKLQkgKiAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBzaG91bGQgYmUgdmFsaWRhdGVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFZhbGlkYXRlQ29uZmxpY3RTb3VyY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHJlc291cmNlcyBhcmUgZWl0aGVyIGJvdGggbGlua2VkIG9yIGJvdGgKLQkgKiB1bmxpbmtlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICBzb3VyY2UgcmVzb3VyY2UKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHJlc291cmNlCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGJvdGggcmVzb3VyY2VzIGFyZSBlaXRoZXIgbGlua2VkCi0JICogICAgICAgICBvciB1bmxpbmtlZC4gPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBob21vZ2Vub3VzUmVzb3VyY2VzKElSZXNvdXJjZSBzb3VyY2UsCi0JCQlJUmVzb3VyY2UgZGVzdGluYXRpb24pIHsKLQkJYm9vbGVhbiBpc1NvdXJjZUxpbmtlZCA9IHNvdXJjZS5pc0xpbmtlZCgpOwotCQlib29sZWFuIGlzRGVzdGluYXRpb25MaW5rZWQgPSBkZXN0aW5hdGlvbi5pc0xpbmtlZCgpOwotCi0JCXJldHVybiAoaXNTb3VyY2VMaW5rZWQgJiYgaXNEZXN0aW5hdGlvbkxpbmtlZCB8fCBpc1NvdXJjZUxpbmtlZCA9PSBmYWxzZQotCQkJCSYmIGlzRGVzdGluYXRpb25MaW5rZWQgPT0gZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgYWNjZXNzaWJsZS4gRmlsZXMgYW5kIGZvbGRlcnMgYXJlCi0JICogYWx3YXlzIGNvbnNpZGVyZWQgYWNjZXNzaWJsZSBhbmQgYSBwcm9qZWN0IGlzIGFjY2Vzc2libGUgaWYgaXQgaXMgb3Blbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc291cmNlIGlzIGFjY2Vzc2libGUsIGFuZAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIG5vdAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0FjY2Vzc2libGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCWNhc2UgSVJlc291cmNlLkZJTEU6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSOgotCQkJcmV0dXJuIHRydWU7Ci0JCWNhc2UgSVJlc291cmNlLlBST0pFQ1Q6Ci0JCQlyZXR1cm4gKChJUHJvamVjdCkgcmVzb3VyY2UpLmlzT3BlbigpOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIGFueSBvZiB0aGUgZ2l2ZW4gc291cmNlIHJlc291cmNlcyBhcmUgYmVpbmcgcmVjb3BpZWQgdG8KLQkgKiB0aGVpciBjdXJyZW50IGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlUmVzb3VyY2VzCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHJlc291cmNlcwotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotCSAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBnaXZlbiBzb3VyY2UKLQkgKiAgICAgICAgIHJlc291cmNlJ3MgcGFyZW50IGNvbnRhaW5lciBpcyB0aGUgc2FtZSBhcyB0aGUgZGVzdGluYXRpb24KLQkgKi8KLQlib29sZWFuIGlzRGVzdGluYXRpb25TYW1lQXNTb3VyY2UoSVJlc291cmNlW10gc291cmNlUmVzb3VyY2VzLAotCQkJSUNvbnRhaW5lciBkZXN0aW5hdGlvbikgewotCQlJUGF0aCBkZXN0aW5hdGlvbkxvY2F0aW9uID0gZGVzdGluYXRpb24uZ2V0TG9jYXRpb24oKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHNvdXJjZVJlc291cmNlID0gc291cmNlUmVzb3VyY2VzW2ldOwotCQkJaWYgKHNvdXJjZVJlc291cmNlLmdldFBhcmVudCgpLmVxdWFscyhkZXN0aW5hdGlvbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoZGVzdGluYXRpb25Mb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJLy8gZG8gdGhvcm91Z2ggY2hlY2sgdG8gY2F0Y2ggbGlua2VkIHJlc291cmNlcy4gRml4ZXMgYnVnIDI5OTEzLgotCQkJCUlQYXRoIHNvdXJjZUxvY2F0aW9uID0gc291cmNlUmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJCQlJUGF0aCBkZXN0aW5hdGlvblJlc291cmNlID0gZGVzdGluYXRpb25Mb2NhdGlvbgotCQkJCQkJLmFwcGVuZChzb3VyY2VSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCWlmIChzb3VyY2VMb2NhdGlvbiAhPSBudWxsCi0JCQkJCQkmJiBzb3VyY2VMb2NhdGlvbi5pc1ByZWZpeE9mKGRlc3RpbmF0aW9uUmVzb3VyY2UpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBnaXZlbiByZXNvdXJjZXMgdG8gdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciB3aXRoIHRoZSBnaXZlbgotCSAqIG5hbWUuCi0JICogPHA+Ci0JICogTm90ZTogdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciBtYXkgbmVlZCB0byBiZSBjcmVhdGVkIHByaW9yIHRvIGNvcHlpbmcKLQkgKiB0aGUgcmVzb3VyY2VzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogICAgICAgICAgICB0aGUgcmVzb3VyY2VzIHRvIGNvcHkKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIG9mIHRoZSBkZXN0aW5hdGlvbiBjb250YWluZXIKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yIGZvciBzaG93aW5nIHByb2dyZXNzIGFuZCBmb3IgY2FuY2VsYXRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb3B5IG9wZXJhdGlvbiBjb21wbGV0ZWQgd2l0aG91dAotCSAqICAgICAgICAgZXJyb3JzCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1Db3B5KElSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggZGVzdGluYXRpb24sCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUNvbnRhaW5lckdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29udGFpbmVyR2VuZXJhdG9yKGRlc3RpbmF0aW9uKTsKLQkJCWdlbmVyYXRvci5nZW5lcmF0ZUNvbnRhaW5lcihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwKSk7Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDc1KTsKLQkJCWNvcHkocmVzb3VyY2VzLCBkZXN0aW5hdGlvbiwgc3ViTW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmVjb3JkRXJyb3IoZSk7IC8vIGxvZyBlcnJvcgotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogSW5kaXZpZHVhbGx5IGNvcGllcyB0aGUgZ2l2ZW4gcmVzb3VyY2VzIHRvIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24KLQkgKiBjb250YWluZXIgY2hlY2tpbmcgZm9yIG5hbWUgY29sbGlzaW9ucy4gSWYgYSBjb2xsaXNpb24gaXMgZGV0ZWN0ZWQsIGl0IGlzCi0JICogc2F2ZWQgd2l0aCBhIG5ldyBuYW1lLgotCSAqIDxwPgotCSAqIE5vdGU6IHRoZSBkZXN0aW5hdGlvbiBjb250YWluZXIgbWF5IG5lZWQgdG8gYmUgY3JlYXRlZCBwcmlvciB0byBjb3B5aW5nCi0JICogdGhlIHJlc291cmNlcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlcyB0byBjb3B5Ci0JICogQHBhcmFtIGRlc3RpbmF0aW9uCi0JICogICAgICAgICAgICB0aGUgcGF0aCBvZiB0aGUgZGVzdGluYXRpb24gY29udGFpbmVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29weSBvcGVyYXRpb24gY29tcGxldGVkIHdpdGhvdXQKLQkgKiAgICAgICAgIGVycm9ycy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcGVyZm9ybUNvcHlXaXRoQXV0b1JlbmFtZShJUmVzb3VyY2VbXSByZXNvdXJjZXMsCi0JCQlJUGF0aCBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gcmVzb3VyY2VzWzBdLmdldFdvcmtzcGFjZSgpOwotCi0JCXRyeSB7Ci0JCQlDb250YWluZXJHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvbnRhaW5lckdlbmVyYXRvcihkZXN0aW5hdGlvbik7Ci0JCQlnZW5lcmF0b3IuZ2VuZXJhdGVDb250YWluZXIobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMCkpOwotCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDc1KTsKLQkJCXN1Yk1vbml0b3IuYmVnaW5UYXNrKGdldE9wZXJhdGlvblRpdGxlKCksIHJlc291cmNlcy5sZW5ndGgpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCUlSZXNvdXJjZSBzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JCQkJSVBhdGggZGVzdGluYXRpb25QYXRoID0gZGVzdGluYXRpb24uYXBwZW5kKHNvdXJjZS5nZXROYW1lKCkpOwotCi0JCQkJaWYgKHdvcmtzcGFjZS5nZXRSb290KCkuZXhpc3RzKGRlc3RpbmF0aW9uUGF0aCkpIHsKLQkJCQkJZGVzdGluYXRpb25QYXRoID0gZ2V0TmV3TmFtZUZvcihkZXN0aW5hdGlvblBhdGgsIHdvcmtzcGFjZSk7Ci0JCQkJfQotCQkJCWlmIChkZXN0aW5hdGlvblBhdGggIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJc291cmNlLmNvcHkoZGVzdGluYXRpb25QYXRoLCBJUmVzb3VyY2UuU0hBTExPVywKLQkJCQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihzdWJNb25pdG9yLCAwKSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJcmVjb3JkRXJyb3IoZSk7IC8vIGxvZyBlcnJvcgotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXN1Yk1vbml0b3Iud29ya2VkKDEpOwotCQkJCWlmIChzdWJNb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmVjb3JkRXJyb3IoZSk7IC8vIGxvZyBlcnJvcgotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhbiBpbXBvcnQgb2YgdGhlIGdpdmVuIHN0b3JlcyBpbnRvIHRoZSBwcm92aWRlZCBjb250YWluZXIuCi0JICogUmV0dXJucyBhIHN0YXR1cyBpbmRpY2F0aW5nIGlmIHRoZSBpbXBvcnQgd2FzIHN1Y2Nlc3NmdWwuCi0JICogCi0JICogQHBhcmFtIHN0b3JlcwotCSAqICAgICAgICAgICAgc3RvcmVzIHRoYXQgYXJlIHRvIGJlIGltcG9ydGVkCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgY29udGFpbmVyIHRvIHdoaWNoIHRoZSBpbXBvcnQgd2lsbCBiZSBkb25lCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvciBmb3Igc2hvd2luZyBwcm9ncmVzcyBhbmQgZm9yIGNhbmNlbGF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1GaWxlSW1wb3J0KElGaWxlU3RvcmVbXSBzdG9yZXMsIElDb250YWluZXIgdGFyZ2V0LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlPdmVyd3JpdGVRdWVyeSBxdWVyeSA9IG5ldyBJT3ZlcndyaXRlUXVlcnkoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIHF1ZXJ5T3ZlcndyaXRlKFN0cmluZyBwYXRoU3RyaW5nKSB7Ci0JCQkJaWYgKGFsd2F5c092ZXJ3cml0ZSkKLQkJCQkJcmV0dXJuIEFMTDsKLQotCQkJCWZpbmFsIFN0cmluZyByZXR1cm5Db2RlW10gPSB7IENBTkNFTCB9OwotCQkJCWZpbmFsIFN0cmluZyBtc2cgPSBOTFMKLQkJCQkJCS5iaW5kKAotCQkJCQkJCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX292ZXJ3cml0ZVF1ZXN0aW9uLAotCQkJCQkJCQlwYXRoU3RyaW5nKTsKLQkJCQlmaW5hbCBTdHJpbmdbXSBvcHRpb25zID0geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9MQUJFTCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsCi0JCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9OwotCQkJCW1lc3NhZ2VTaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKAotCQkJCQkJCQltZXNzYWdlU2hlbGwsCi0JCQkJCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fcXVlc3Rpb24sCi0JCQkJCQkJCW51bGwsIG1zZywgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgb3B0aW9ucywgMCk7Ci0JCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCQkJaW50IHJldHVyblZhbCA9IGRpYWxvZy5nZXRSZXR1cm5Db2RlKCk7Ci0JCQkJCQlTdHJpbmdbXSByZXR1cm5Db2RlcyA9IHsgWUVTLCBBTEwsIE5PLCBDQU5DRUwgfTsKLQkJCQkJCXJldHVybkNvZGVbMF0gPSByZXR1cm5WYWwgPT0gLTEgPyBDQU5DRUwKLQkJCQkJCQkJOiByZXR1cm5Db2Rlc1tyZXR1cm5WYWxdOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJaWYgKHJldHVybkNvZGVbMF0gPT0gQUxMKSB7Ci0JCQkJCWFsd2F5c092ZXJ3cml0ZSA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChyZXR1cm5Db2RlWzBdID09IENBTkNFTCkgewotCQkJCQljYW5jZWxlZCA9IHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiByZXR1cm5Db2RlWzBdOwotCQkJfQotCQl9OwotCi0JCUltcG9ydE9wZXJhdGlvbiBvcCA9IG5ldyBJbXBvcnRPcGVyYXRpb24odGFyZ2V0LmdldEZ1bGxQYXRoKCksCi0JCQkJc3RvcmVzWzBdLmdldFBhcmVudCgpLCBGaWxlU3RvcmVTdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSwKLQkJCQlxdWVyeSwgQXJyYXlzLmFzTGlzdChzdG9yZXMpKTsKLQkJb3Auc2V0Q29udGV4dChtZXNzYWdlU2hlbGwpOwotCQlvcC5zZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmUoZmFsc2UpOwotCQl0cnkgewotCQkJb3AucnVuKG1vbml0b3IpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJZGlzcGxheUVycm9yKCgoQ29yZUV4Y2VwdGlvbikgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSkKLQkJCQkJCS5nZXRTdGF0dXMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWRpc3BsYXkoZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gU3BlY2lhbCBjYXNlIHNpbmNlIEltcG9ydE9wZXJhdGlvbiBkb2Vzbid0IHRocm93IGEgQ29yZUV4Y2VwdGlvbiBvbgotCQkvLyBmYWlsdXJlLgotCQlJU3RhdHVzIHN0YXR1cyA9IG9wLmdldFN0YXR1cygpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCWlmIChlcnJvclN0YXR1cyA9PSBudWxsKQotCQkJCWVycm9yU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBsYXRmb3JtVUkuUExVR0lOX0lELAotCQkJCQkJSVN0YXR1cy5FUlJPUiwgZ2V0UHJvYmxlbXNNZXNzYWdlKCksIG51bGwpOwotCQkJZXJyb3JTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY29yZHMgdGhlIGNvcmUgZXhjZXB0aW9uIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBvbmNlIHRoZSBhY3Rpb24gaXMKLQkgKiBmaW5pc2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3IKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVjb3JkRXJyb3IoQ29yZUV4Y2VwdGlvbiBlcnJvcikgewotCQlpZiAoZXJyb3JTdGF0dXMgPT0gbnVsbCkKLQkJCWVycm9yU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBsYXRmb3JtVUkuUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLAotCQkJCQlnZXRQcm9ibGVtc01lc3NhZ2UoKSwgZXJyb3IpOwotCi0JCWVycm9yU3RhdHVzLm1lcmdlKGVycm9yLmdldFN0YXR1cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZGVzdGluYXRpb24gaXMgdmFsaWQgZm9yIGNvcHlpbmcgdGhlIHNvdXJjZSByZXNvdXJjZXMuCi0JICogPHA+Ci0JICogTm90ZSB0aGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEl0IGlzIG5vdCBBUEkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotCSAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzb3VyY2VSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgcmVzb3VyY2VzCi0JICogQHJldHVybiBhbiBlcnJvciBtZXNzYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGF0aCBpcyB2YWxpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdmFsaWRhdGVEZXN0aW5hdGlvbihJQ29udGFpbmVyIGRlc3RpbmF0aW9uLAotCQkJSVJlc291cmNlW10gc291cmNlUmVzb3VyY2VzKSB7Ci0JCWlmICghaXNBY2Nlc3NpYmxlKGRlc3RpbmF0aW9uKSkgewotCQkJcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fZGVzdGluYXRpb25BY2Nlc3NFcnJvcjsKLQkJfQotCQlTdHJpbmcgZGVzdGluYXRpb25NZXNzYWdlID0gdmFsaWRhdGVEZXN0aW5hdGlvbkxvY2F0aW9uKGRlc3RpbmF0aW9uKTsKLQkJaWYgKGRlc3RpbmF0aW9uTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVzdGluYXRpb25NZXNzYWdlOwotCQl9Ci0JCUlDb250YWluZXIgZmlyc3RQYXJlbnQgPSBudWxsOwotCQlJUGF0aCBkZXN0aW5hdGlvbkxvY2F0aW9uID0gZGVzdGluYXRpb24uZ2V0TG9jYXRpb24oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlSZXNvdXJjZSBzb3VyY2VSZXNvdXJjZSA9IHNvdXJjZVJlc291cmNlc1tpXTsKLQkJCWlmIChmaXJzdFBhcmVudCA9PSBudWxsKSB7Ci0JCQkJZmlyc3RQYXJlbnQgPSBzb3VyY2VSZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCX0gZWxzZSBpZiAoZmlyc3RQYXJlbnQuZXF1YWxzKHNvdXJjZVJlc291cmNlLmdldFBhcmVudCgpKSA9PSBmYWxzZSkgewotCQkJCS8vIFJlc291cmNlcyBtdXN0IGhhdmUgY29tbW9uIHBhcmVudC4gRml4ZXMgYnVnIDMzMzk4LgotCQkJCXJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3BhcmVudE5vdEVxdWFsOwotCQkJfQotCi0JCQlJUGF0aCBzb3VyY2VMb2NhdGlvbiA9IHNvdXJjZVJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCQlpZiAoc291cmNlTG9jYXRpb24gPT0gbnVsbCkgewotCQkJCWlmIChzb3VyY2VSZXNvdXJjZS5pc0xpbmtlZCgpKSB7Ci0JCQkJCS8vIERvbid0IGFsbG93IGNvcHlpbmcgbGlua2VkIHJlc291cmNlcyB3aXRoIHVuZGVmaW5lZCBwYXRoCi0JCQkJCS8vIHZhcmlhYmxlcy4gU2VlIGJ1ZyAyODc1NC4KLQkJCQkJcmV0dXJuIE5MUwotCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9taXNzaW5nUGF0aFZhcmlhYmxlLAotCQkJCQkJCQkJc291cmNlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIE5MUwotCQkJCQkJLmJpbmQoCi0JCQkJCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fcmVzb3VyY2VEZWxldGVkLAotCQkJCQkJCQlzb3VyY2VSZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCQl9Ci0JCQlpZiAoc291cmNlTG9jYXRpb24uZXF1YWxzKGRlc3RpbmF0aW9uTG9jYXRpb24pKSB7Ci0JCQkJcmV0dXJuIE5MUwotCQkJCQkJLmJpbmQoCi0JCQkJCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fc2FtZVNvdXJjZUFuZERlc3QsCi0JCQkJCQkJCXNvdXJjZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQkvLyBpcyB0aGUgc291cmNlIGEgcGFyZW50IG9mIHRoZSBkZXN0aW5hdGlvbj8KLQkJCWlmIChzb3VyY2VMb2NhdGlvbi5pc1ByZWZpeE9mKGRlc3RpbmF0aW9uTG9jYXRpb24pKSB7Ci0JCQkJcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fZGVzdGluYXRpb25EZXNjZW5kZW50RXJyb3I7Ci0JCQl9Ci0KLQkJCVN0cmluZyBsaW5rZWRSZXNvdXJjZU1lc3NhZ2UgPSB2YWxpZGF0ZUxpbmtlZFJlc291cmNlKGRlc3RpbmF0aW9uLAotCQkJCQlzb3VyY2VSZXNvdXJjZSk7Ci0JCQlpZiAobGlua2VkUmVzb3VyY2VNZXNzYWdlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbGlua2VkUmVzb3VyY2VNZXNzYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbiBleGlzdHMuIExpbmtlZCByZXNvdXJjZXMKLQkgKiBjcmVhdGVkIG9uIHVuZGVmaW5lZCBwYXRoIHZhcmlhYmxlcyBoYXZlIGFuIHVuZGVmaW5lZCBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIGNvbnRhaW5lcgotCSAqIEByZXR1cm4gZXJyb3IgbWVzc2FnZSBvciBudWxsIGlmIGRlc3RpbmF0aW9uIGxvY2F0aW9uIGlzIHZhbGlkIChub24tPGNvZGU+bnVsbDwvY29kZT4pCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGVEZXN0aW5hdGlvbkxvY2F0aW9uKElDb250YWluZXIgZGVzdGluYXRpb24pIHsKLQkJSVBhdGggZGVzdGluYXRpb25Mb2NhdGlvbiA9IGRlc3RpbmF0aW9uLmdldExvY2F0aW9uKCk7Ci0KLQkJaWYgKGRlc3RpbmF0aW9uTG9jYXRpb24gPT0gbnVsbCkgewotCQkJaWYgKGRlc3RpbmF0aW9uLmlzTGlua2VkKCkpIHsKLQkJCQlyZXR1cm4gTkxTCi0JCQkJCQkuYmluZCgKLQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9taXNzaW5nUGF0aFZhcmlhYmxlLAotCQkJCQkJCQlkZXN0aW5hdGlvbi5nZXROYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3Jlc291cmNlRGVsZXRlZCwKLQkJCQkJCQlkZXN0aW5hdGlvbi5nZXROYW1lKCkpOwotCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoYXQgdGhlIGdpdmVuIHNvdXJjZSByZXNvdXJjZXMgY2FuIGJlIGNvcGllZCB0byB0aGUKLQkgKiBkZXN0aW5hdGlvbiBhcyBkZWNpZGVkIGJ5IHRoZSBWQ00gcHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uCi0JICogICAgICAgICAgICBjb3B5IGRlc3RpbmF0aW9uCi0JICogQHBhcmFtIHNvdXJjZVJlc291cmNlcwotCSAqICAgICAgICAgICAgc291cmNlIHJlc291cmNlcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gYWxsIGZpbGVzIHBhc3NlZCB2YWxpZGF0aW9uIG9yIHRoZXJlIHdlcmUgbm8KLQkgKiAgICAgICAgIGZpbGVzIHRvIHZhbGlkYXRlLiA8Y29kZT5mYWxzZTwvY29kZT4gb25lIG9yIG1vcmUgZmlsZXMgZGlkIG5vdAotCSAqICAgICAgICAgcGFzcyB2YWxpZGF0aW9uLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUVkaXQoSUNvbnRhaW5lciBkZXN0aW5hdGlvbiwKLQkJCUlSZXNvdXJjZVtdIHNvdXJjZVJlc291cmNlcykgewotCQlBcnJheUxpc3QgY29weUZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWNvbGxlY3RFeGlzdGluZ1JlYWRvbmx5RmlsZXMoZGVzdGluYXRpb24uZ2V0RnVsbFBhdGgoKSwKLQkJCQlzb3VyY2VSZXNvdXJjZXMsIGNvcHlGaWxlcyk7Ci0JCWlmIChjb3B5RmlsZXMuc2l6ZSgpID4gMCkgewotCQkJSUZpbGVbXSBmaWxlcyA9IChJRmlsZVtdKSBjb3B5RmlsZXMudG9BcnJheShuZXcgSUZpbGVbY29weUZpbGVzCi0JCQkJCS5zaXplKCldKTsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KGZpbGVzLCBtZXNzYWdlU2hlbGwpOwotCi0JCQljYW5jZWxlZCA9IHN0YXR1cy5pc09LKCkgPT0gZmFsc2U7Ci0JCQlyZXR1cm4gc3RhdHVzLmlzT0soKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZGVzdGluYXRpb24gaXMgdmFsaWQgZm9yIGNvcHlpbmcgdGhlIHNvdXJjZSBmaWxlcy4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gSXQgaXMgbm90IEFQSS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uCi0JICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gY29udGFpbmVyCi0JICogQHBhcmFtIHNvdXJjZU5hbWVzCi0JICogICAgICAgICAgICB0aGUgc291cmNlIGZpbGUgbmFtZXMKLQkgKiBAcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwYXRoIGlzIHZhbGlkCi0JICovCi0JcHVibGljIFN0cmluZyB2YWxpZGF0ZUltcG9ydERlc3RpbmF0aW9uKElDb250YWluZXIgZGVzdGluYXRpb24sCi0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcykgewotCi0JCUlGaWxlU3RvcmVbXSBzdG9yZXMgPSBuZXcgSUZpbGVTdG9yZVtzb3VyY2VOYW1lcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmlsZVN0b3JlIHN0b3JlID0gSURFUmVzb3VyY2VJbmZvVXRpbHMKLQkJCQkJLmdldEZpbGVTdG9yZShzb3VyY2VOYW1lc1tpXSk7Ci0JCQlpZiAoc3RvcmUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gTkxTCi0JCQkJCQkuYmluZCgKLQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9pbmZvTm90Rm91bmQsCi0JCQkJCQkJCXNvdXJjZU5hbWVzW2ldKTsKLQkJCXN0b3Jlc1tpXSA9IHN0b3JlOwotCQl9Ci0JCXJldHVybiB2YWxpZGF0ZUltcG9ydERlc3RpbmF0aW9uSW50ZXJuYWwoZGVzdGluYXRpb24sIHN0b3Jlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZGVzdGluYXRpb24gaXMgdmFsaWQgZm9yIGNvcHlpbmcgdGhlIHNvdXJjZSBmaWxlCi0JICogc3RvcmVzLgotCSAqIDxwPgotCSAqIE5vdGUgdGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCBpcyBub3QgQVBJLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUT0RPIEJ1ZyAxMTc4MDQuIFRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gYXZvaWQgYSBidWcgaW4gdGhlCi0JICogRWNsaXBzZSBjb21waWxlciB3aXRoIHJlZ2FyZHMgdG8gdmlzaWJpbGl0eSBhbmQgdHlwZSByZXNvbHV0aW9uIHdoZW4KLQkgKiBsaW5raW5nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBjb250YWluZXIKLQkgKiBAcGFyYW0gc291cmNlU3RvcmVzCi0JICogICAgICAgICAgICB0aGUgc291cmNlIElGaWxlU3RvcmUKLQkgKiBAcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwYXRoIGlzIHZhbGlkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGVJbXBvcnREZXN0aW5hdGlvbkludGVybmFsKElDb250YWluZXIgZGVzdGluYXRpb24sCi0JCQlJRmlsZVN0b3JlW10gc291cmNlU3RvcmVzKSB7Ci0JCWlmICghaXNBY2Nlc3NpYmxlKGRlc3RpbmF0aW9uKSkgewotCQkJcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fZGVzdGluYXRpb25BY2Nlc3NFcnJvcjsKLQkJfQotCQlTdHJpbmcgZGVzdGluYXRpb25NZXNzYWdlID0gdmFsaWRhdGVEZXN0aW5hdGlvbkxvY2F0aW9uKGRlc3RpbmF0aW9uKTsKLQkJaWYgKGRlc3RpbmF0aW9uTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVzdGluYXRpb25NZXNzYWdlOwotCQl9Ci0KLQkJSUZpbGVTdG9yZSBkZXN0aW5hdGlvblN0b3JlOwotCQl0cnkgewotCQkJZGVzdGluYXRpb25TdG9yZSA9IEVGUy5nZXRTdG9yZShkZXN0aW5hdGlvbi5nZXRMb2NhdGlvblVSSSgpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUlERVdvcmtiZW5jaFBsdWdpbi5sb2coZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQkJCXJldHVybiBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9pbnRlcm5hbEVycm9yLAotCQkJCQkJCWV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlU3RvcmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmlsZVN0b3JlIHNvdXJjZVN0b3JlID0gc291cmNlU3RvcmVzW2ldOwotCQkJSUZpbGVTdG9yZSBzb3VyY2VQYXJlbnRTdG9yZSA9IHNvdXJjZVN0b3JlLmdldFBhcmVudCgpOwotCi0JCQlpZiAoc291cmNlU3RvcmUgIT0gbnVsbCkgewotCQkJCWlmIChkZXN0aW5hdGlvblN0b3JlLmVxdWFscyhzb3VyY2VTdG9yZSkKLQkJCQkJCXx8IChzb3VyY2VQYXJlbnRTdG9yZSAhPSBudWxsICYmIGRlc3RpbmF0aW9uU3RvcmUKLQkJCQkJCQkJLmVxdWFscyhzb3VyY2VQYXJlbnRTdG9yZSkpKSB7Ci0JCQkJCXJldHVybiBOTFMKLQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25faW1wb3J0U2FtZVNvdXJjZUFuZERlc3QsCi0JCQkJCQkJCQlzb3VyY2VTdG9yZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQkvLyB3b3JrIGFyb3VuZCBidWcgMTYyMDIuIHJlcGxhY2VtZW50IGZvcgotCQkJCS8vIHNvdXJjZVBhdGguaXNQcmVmaXhPZihkZXN0aW5hdGlvblBhdGgpCi0JCQkJSUZpbGVTdG9yZSBkZXN0aW5hdGlvblBhcmVudCA9IGRlc3RpbmF0aW9uU3RvcmUuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKHNvdXJjZVN0b3JlLmlzUGFyZW50T2YoZGVzdGluYXRpb25QYXJlbnQpKQotCQkJCQlyZXR1cm4gSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9kZXN0aW5hdGlvbkRlc2NlbmRlbnRFcnJvcjsKLQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBkZXN0aW5hdGlvbiBpcyB2YWxpZCBmb3IgdGhlIGdpdmVuIHNvdXJjZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIGNvbnRhaW5lciBvZiB0aGUgb3BlcmF0aW9uCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgc291cmNlIHJlc291cmNlCi0JICogQHJldHVybiBTdHJpbmcgZXJyb3IgbWVzc2FnZSBvciBudWxsIGlmIHRoZSBkZXN0aW5hdGlvbiBpcyB2YWxpZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRlTGlua2VkUmVzb3VyY2UoSUNvbnRhaW5lciBkZXN0aW5hdGlvbiwKLQkJCUlSZXNvdXJjZSBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZS5pc0xpbmtlZCgpID09IGZhbHNlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IGRlc3RpbmF0aW9uLmdldFdvcmtzcGFjZSgpOwotCQlJUmVzb3VyY2UgbGlua0hhbmRsZSA9IGNyZWF0ZUxpbmtlZFJlc291cmNlSGFuZGxlKGRlc3RpbmF0aW9uLCBzb3VyY2UpOwotCQlJU3RhdHVzIGxvY2F0aW9uU3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlTGlua0xvY2F0aW9uKGxpbmtIYW5kbGUsCi0JCQkJc291cmNlLmdldFJhd0xvY2F0aW9uKCkpOwotCi0JCWlmIChsb2NhdGlvblN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCXJldHVybiBsb2NhdGlvblN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJSVBhdGggc291cmNlTG9jYXRpb24gPSBzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKHNvdXJjZS5nZXRQcm9qZWN0KCkuZXF1YWxzKGRlc3RpbmF0aW9uLmdldFByb2plY3QoKSkgPT0gZmFsc2UKLQkJCQkmJiBzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIKLQkJCQkmJiBzb3VyY2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkvLyBwcmV2ZW50IG1lcmdpbmcgbGlua2VkIGZvbGRlcnMgdGhhdCBwb2ludCB0byB0aGUgc2FtZQotCQkJLy8gZmlsZSBzeXN0ZW0gZm9sZGVyCi0JCQl0cnkgewotCQkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBkZXN0aW5hdGlvbi5tZW1iZXJzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZW1iZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChzb3VyY2VMb2NhdGlvbi5lcXVhbHMobWVtYmVyc1tqXS5nZXRMb2NhdGlvbigpKQotCQkJCQkJCSYmIHNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKG1lbWJlcnNbal0uZ2V0TmFtZSgpKSkgewotCQkJCQkJcmV0dXJuIE5MUwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3NhbWVTb3VyY2VBbmREZXN0LAotCQkJCQkJCQkJCXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlkaXNwbGF5RXJyb3IoTkxTCi0JCQkJCQkuYmluZCgKLQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9pbnRlcm5hbEVycm9yLAotCQkJCQkJCQlleGNlcHRpb24uZ2V0TWVzc2FnZSgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG1vdmluZyBhbGwgb2YgdGhlIGdpdmVuIHNvdXJjZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuCi0JICogZGVzdGluYXRpb24gY29udGFpbmVyIGNvdWxkIGJlIGRvbmUgd2l0aG91dCBjYXVzaW5nIG5hbWUgY29sbGlzaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBjb250YWluZXIKLQkgKiBAcGFyYW0gc291cmNlUmVzb3VyY2VzCi0JICogICAgICAgICAgICB0aGUgbGlzdCBvZiByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIHdvdWxkIGJlIG5vIG5hbWUgY29sbGlzaW9ucywgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlcmUgd291bGQKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZVtdIHZhbGlkYXRlTm9OYW1lQ29sbGlzaW9ucyhJQ29udGFpbmVyIGRlc3RpbmF0aW9uLAotCQkJSVJlc291cmNlW10gc291cmNlUmVzb3VyY2VzKSB7Ci0JCUxpc3QgY29weUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gZGVzdGluYXRpb24uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlpbnQgb3ZlcndyaXRlID0gSURpYWxvZ0NvbnN0YW50cy5OT19JRDsKLQotCQkvLyBDaGVjayB0byBzZWUgaWYgd2Ugd291bGQgYmUgb3ZlcndyaXRpbmcgYSBwYXJlbnQgZm9sZGVyLgotCQkvLyBDYW5jZWwgZW50aXJlIGNvcHkgb3BlcmF0aW9uIGlmIHdlIGRvLgotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgSVJlc291cmNlIHNvdXJjZVJlc291cmNlID0gc291cmNlUmVzb3VyY2VzW2ldOwotCQkJZmluYWwgSVBhdGggZGVzdGluYXRpb25QYXRoID0gZGVzdGluYXRpb24uZ2V0RnVsbFBhdGgoKS5hcHBlbmQoCi0JCQkJCXNvdXJjZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQlmaW5hbCBJUGF0aCBzb3VyY2VQYXRoID0gc291cmNlUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQotCQkJSVJlc291cmNlIG5ld1Jlc291cmNlID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKGRlc3RpbmF0aW9uUGF0aCk7Ci0JCQlpZiAobmV3UmVzb3VyY2UgIT0gbnVsbCAmJiBkZXN0aW5hdGlvblBhdGguaXNQcmVmaXhPZihzb3VyY2VQYXRoKSkgewotCQkJCWRpc3BsYXlFcnJvcihOTFMKLQkJCQkJCS5iaW5kKAotCQkJCQkJCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX292ZXJ3cml0ZVByb2JsZW0sCi0JCQkJCQkJCWRlc3RpbmF0aW9uUGF0aCwgc291cmNlUGF0aCkpOwotCi0JCQkJY2FuY2VsZWQgPSB0cnVlOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCS8vIENoZWNrIGZvciBvdmVyd3JpdGUgY29uZmxpY3RzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBJUmVzb3VyY2Ugc291cmNlID0gc291cmNlUmVzb3VyY2VzW2ldOwotCQkJZmluYWwgSVBhdGggZGVzdGluYXRpb25QYXRoID0gZGVzdGluYXRpb24uZ2V0RnVsbFBhdGgoKS5hcHBlbmQoCi0JCQkJCXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCQlJUmVzb3VyY2UgbmV3UmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIoZGVzdGluYXRpb25QYXRoKTsKLQkJCWlmIChuZXdSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG92ZXJ3cml0ZSAhPSBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQKLQkJCQkJCXx8IChuZXdSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiAmJiBob21vZ2Vub3VzUmVzb3VyY2VzKAotCQkJCQkJCQlzb3VyY2UsIGRlc3RpbmF0aW9uKSA9PSBmYWxzZSkpIHsKLQkJCQkJb3ZlcndyaXRlID0gY2hlY2tPdmVyd3JpdGUoc291cmNlLCBuZXdSZXNvdXJjZSk7Ci0JCQkJfQotCQkJCWlmIChvdmVyd3JpdGUgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQKLQkJCQkJCXx8IG92ZXJ3cml0ZSA9PSBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQpIHsKLQkJCQkJY29weUl0ZW1zLmFkZChzb3VyY2UpOwotCQkJCX0gZWxzZSBpZiAob3ZlcndyaXRlID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQkJCWNhbmNlbGVkID0gdHJ1ZTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQljb3B5SXRlbXMuYWRkKHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJUmVzb3VyY2VbXSkgY29weUl0ZW1zLnRvQXJyYXkobmV3IElSZXNvdXJjZVtjb3B5SXRlbXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlSZXNvdXJjZXMoZmluYWwgSVJlc291cmNlW10gcmVzb3VyY2VzLAotCQkJZmluYWwgSVBhdGggZGVzdGluYXRpb25QYXRoLCBmaW5hbCBJUmVzb3VyY2VbXVtdIGNvcGllZFJlc291cmNlcywKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUmVzb3VyY2VbXSBjb3B5UmVzb3VyY2VzID0gcmVzb3VyY2VzOwotCi0JCS8vIEZpeCBmb3IgYnVnIDMxMTE2LiBEbyBub3QgcHJvdmlkZSBhIHRhc2sgbmFtZSB3aGVuCi0JCS8vIGNyZWF0aW5nIHRoZSB0YXNrLgotCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMTAwKTsgLy8kTk9OLU5MUy0xJAotCQltb25pdG9yLnNldFRhc2tOYW1lKGdldE9wZXJhdGlvblRpdGxlKCkpOwotCQltb25pdG9yLndvcmtlZCgxMCk7IC8vIHNob3cgc29tZSBpbml0aWFsIHByb2dyZXNzCi0KLQkJLy8gQ2hlY2tzIG9ubHkgcmVxdWlyZWQgaWYgdGhpcyBpcyBhbiBleGlzaXRpbmcgY29udGFpbmVyIHBhdGguCi0JCWJvb2xlYW4gY29weVdpdGhBdXRvUmVuYW1lID0gZmFsc2U7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlpZiAocm9vdC5leGlzdHMoZGVzdGluYXRpb25QYXRoKSkgewotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcm9vdAotCQkJCQkuZmluZE1lbWJlcihkZXN0aW5hdGlvblBhdGgpOwotCQkJLy8gSWYgd2UncmUgY29weWluZyB0byB0aGUgc291cmNlIGNvbnRhaW5lciB0aGVuIHBlcmZvcm0KLQkJCS8vIGF1dG8tcmVuYW1lcyBvbiBhbGwgcmVzb3VyY2VzIHRvIGF2b2lkIG5hbWUgY29sbGlzaW9ucy4KLQkJCWlmIChpc0Rlc3RpbmF0aW9uU2FtZUFzU291cmNlKGNvcHlSZXNvdXJjZXMsIGNvbnRhaW5lcikKLQkJCQkJJiYgY2FuUGVyZm9ybUF1dG9SZW5hbWUoKSkgewotCQkJCWNvcHlXaXRoQXV0b1JlbmFtZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCS8vIElmIG5vIGF1dG8tcmVuYW1pbmcgd2lsbCBiZSBoYXBwZW5pbmcsIGNoZWNrIGZvcgotCQkJCS8vIHBvdGVudGlhbCBuYW1lIGNvbGxpc2lvbnMgYXQgdGhlIHRhcmdldCByZXNvdXJjZQotCQkJCWNvcHlSZXNvdXJjZXMgPSB2YWxpZGF0ZU5vTmFtZUNvbGxpc2lvbnMoY29udGFpbmVyLAotCQkJCQkJY29weVJlc291cmNlcyk7Ci0JCQkJaWYgKGNvcHlSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCQlpZiAoY2FuY2VsZWQpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWRpc3BsYXlFcnJvcihJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX25hbWVDb2xsaXNpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh2YWxpZGF0ZUVkaXQoY29udGFpbmVyLCBjb3B5UmVzb3VyY2VzKSA9PSBmYWxzZSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJZXJyb3JTdGF0dXMgPSBudWxsOwotCQlpZiAoY29weVJlc291cmNlcy5sZW5ndGggPiAwKSB7Ci0JCQlpZiAoY29weVdpdGhBdXRvUmVuYW1lKQotCQkJCXBlcmZvcm1Db3B5V2l0aEF1dG9SZW5hbWUoY29weVJlc291cmNlcywgZGVzdGluYXRpb25QYXRoLAotCQkJCQkJbW9uaXRvcik7Ci0JCQllbHNlCi0JCQkJcGVyZm9ybUNvcHkoY29weVJlc291cmNlcywgZGVzdGluYXRpb25QYXRoLCBtb25pdG9yKTsKLQkJfQotCQljb3BpZWRSZXNvdXJjZXNbMF0gPSBjb3B5UmVzb3VyY2VzOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5RmlsZVN0b3JlcyhmaW5hbCBJRmlsZVN0b3JlW10gc3RvcmVzLAotCQkJZmluYWwgSVBhdGggZGVzdGluYXRpb25QYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gQ2hlY2tzIG9ubHkgcmVxdWlyZWQgaWYgdGhpcyBpcyBhbiBleGlzaXRpbmcgY29udGFpbmVyIHBhdGguCi0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlpZiAocm9vdC5leGlzdHMoZGVzdGluYXRpb25QYXRoKSkgewotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcm9vdAotCQkJCQkuZmluZE1lbWJlcihkZXN0aW5hdGlvblBhdGgpOwotCi0JCQlwZXJmb3JtRmlsZUltcG9ydChzdG9yZXMsIGNvbnRhaW5lciwgbW9uaXRvcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvQ29weVByb2plY3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9Db3B5UHJvamVjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWYxM2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9Db3B5UHJvamVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb2dyZXNzLlByb2dyZXNzTW9uaXRvckpvYnNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogVGhlIENvcHlQcm9qZWN0QWN0aW9uIGlzIHRoZSBhY3Rpb24gZGVzaWduZWQgdG8gY29weSBwcm9qZWN0cyBzcGVjaWZpY2FsbHkKLSAqIGFzIHRoZXkgaGF2ZSBkaWZmZXJlbnQgc2VtYW50aWNzIGZyb20gb3RoZXIgcmVzb3VyY2VzLgotICogTm90ZSB0aGF0IHRoaXMgYWN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBwcm9qZWN0IGlzIHNlbGVjdGVkIGFuZCBiZWluZwotICogbWFuaXB1bGF0ZWQuIFRoaXMgc2hvdWxkIGJlIGRpc2FibGVkIGZvciBtdWx0aSBzZWxlY3Qgb3Igbm8gc2VsZWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ29weVByb2plY3RBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENPUFlfVE9PTF9USVAgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5UHJvamVjdEFjdGlvbl90b29sVGlwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENPUFlfVElUTEUgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5UHJvamVjdEFjdGlvbl90aXRsZTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBDT1BZX1BST0dSRVNTX1RJVExFID0gSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weVByb2plY3RBY3Rpb25fcHJvZ3Jlc3NUaXRsZTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBQUk9CTEVNU19USVRMRSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlQcm9qZWN0QWN0aW9uX2NvcHlGYWlsZWRUaXRsZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBpZCBvZiB0aGlzIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IFBsYXRmb3JtVUkuUExVR0lOX0lEICsgIi5Db3B5UHJvamVjdEFjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIHNoZWxsIGluIHdoaWNoIHRvIHNob3cgYW55IGRpYWxvZ3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCi0gICAgLyoqCi0gICAgICogU3RhdHVzIGNvbnRhaW5pbmcgdGhlIGVycm9ycyBkZXRlY3RlZCB3aGVuIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbiBvcgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGVycm9ycyBkZXRlY3RlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVN0YXR1cyBlcnJvclN0YXR1czsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdCBjb3B5IGFjdGlvbiB3aXRoIHRoZSBkZWZhdWx0IHRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2hlbGwgdGhlIHNoZWxsIGZvciBhbnkgZGlhbG9ncwotICAgICAqLwotICAgIHB1YmxpYyBDb3B5UHJvamVjdEFjdGlvbihTaGVsbCBzaGVsbCkgewotICAgICAgICB0aGlzKHNoZWxsLCBDT1BZX1RJVExFKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5DT1BZX1BST0pFQ1RfQUNUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHByb2plY3QgY29weSBhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gdGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgZm9yIGFueSBkaWFsb2dzCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHN0cmluZyB1c2VkIGFzIHRoZSB0ZXh0IGZvciB0aGUgYWN0aW9uLCAKLSAgICAgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHRleHQKLSAgICAgKi8KLSAgICBDb3B5UHJvamVjdEFjdGlvbihTaGVsbCBzaGVsbCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KENPUFlfVE9PTF9USVApOwotICAgICAgICBzZXRJZChDb3B5UHJvamVjdEFjdGlvbi5JRCk7Ci0gICAgICAgIGlmIChzaGVsbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zaGVsbCA9IHNoZWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBJUHJvamVjdERlc2NyaXB0aW9uIGZvciB0aGUgY29weSB1c2luZyB0aGUgbmFtZSBhbmQgcGF0aCBzZWxlY3RlZAotICAgICAqIGZyb20gdGhlIGRpYWxvZy4KLSAgICAgKiBAcmV0dXJuIElQcm9qZWN0RGVzY3JpcHRpb24KLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgc291cmNlIHByb2plY3QKLSAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgdGhlIG5hbWUgZm9yIHRoZSBuZXcgcHJvamVjdAotICAgICAqIEBwYXJhbSByb290TG9jYXRpb24gdGhlIHBhdGggdGhlIG5ldyBwcm9qZWN0IHdpbGwgYmUgc3RvcmVkIHVuZGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJUHJvamVjdERlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0aW9uKElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUsIElQYXRoIHJvb3RMb2NhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvL0dldCBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgZGVzY3JpcHRpb24gYW5kIG1vZGlmeSBpdAotICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIG5ld0Rlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBuZXdEZXNjcmlwdGlvbi5zZXROYW1lKHByb2plY3ROYW1lKTsKLQotICAgICAgICAvL0lmIHRoZSBsb2NhdGlvbiBpcyB0aGUgZGVmYXVsdCB0aGVuIHNldCB0aGUgbG9jYXRpb24gdG8gbnVsbAotICAgICAgICBpZiAocm9vdExvY2F0aW9uLmVxdWFscyhQbGF0Zm9ybS5nZXRMb2NhdGlvbigpKSkKLSAgICAgICAgICAgIG5ld0Rlc2NyaXB0aW9uLnNldExvY2F0aW9uKG51bGwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXdEZXNjcmlwdGlvbi5zZXRMb2NhdGlvbihyb290TG9jYXRpb24pOwotCi0gICAgICAgIHJldHVybiBuZXdEZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gbWVzc2FnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgZnJvbSBVSSB0aHJlYWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih0aGlzLnNoZWxsLCBnZXRFcnJvcnNUaXRsZSgpLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRpdGxlIG9mIHRoZSBlcnJvcnMgZGlhbG9nLgotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JzVGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiBQUk9CTEVNU19USVRMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHBsdWdpbiB1c2VkIGJ5IGEgY29weSBhY3Rpb24KLSAgICAgKiBAcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4gZ2V0UGx1Z2luKCkgewotICAgICAgICByZXR1cm4gKEFic3RyYWN0VUlQbHVnaW4pIFBsYXRmb3JtLmdldFBsdWdpbihQbGF0Zm9ybVVJLlBMVUdJTl9JRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBwcm9qZWN0IHRvIHRoZSBuZXcgdmFsdWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gY29weQotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgY29weQotICAgICAqIEBwYXJhbSBuZXdMb2NhdGlvbiBJUGF0aAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvcHkgb3BlcmF0aW9uIGNvbXBsZXRlZCwgYW5kIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHdhcyBhYmFuZG9uZWQgcGFydCB3YXkKLSAgICAgKi8KLSAgICBib29sZWFuIHBlcmZvcm1Db3B5KGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIElQYXRoIG5ld0xvY2F0aW9uKSB7Ci0gICAgICAgIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0gICAgICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soQ09QWV9QUk9HUkVTU19USVRMRSwgMTAwKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgICAgICAgICAvL0dldCBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgZGVzY3JpcHRpb24gYW5kIG1vZGlmeSBpdAotICAgICAgICAgICAgICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIG5ld0Rlc2NyaXB0aW9uID0gY3JlYXRlRGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCwgcHJvamVjdE5hbWUsIG5ld0xvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoNTApOwotCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3QuY29weShuZXdEZXNjcmlwdGlvbiwgSVJlc291cmNlLlNIQUxMT1cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElSZXNvdXJjZS5GT1JDRSwgbW9uaXRvcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoNTApOwotCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29yZEVycm9yKGUpOyAvLyBsb2cgZXJyb3IKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBQcm9ncmVzc01vbml0b3JKb2JzRGlhbG9nKHNoZWxsKS5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZGlzcGxheUVycm9yKE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlQcm9qZWN0QWN0aW9uX2ludGVybmFsRXJyb3IsIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBRdWVyeSBmb3IgYSBuZXcgcHJvamVjdCBuYW1lIGFuZCBkZXN0aW5hdGlvbiB1c2luZyB0aGUgcGFyYW1ldGVycyBpbiB0aGUgZXhpc3RpbmcKLSAgICAgKiBwcm9qZWN0LgotICAgICAqIEByZXR1cm4gT2JqZWN0IFtdICBvciBudWxsIGlmIHRoZSBzZWxlY3Rpb24gaXMgY2FuY2VsbGVkCi0gICAgICogQHBhcmFtIHByb2plY3QgIHRoZSBwcm9qZWN0IHdlIGFyZSBnb2luZyB0byBjb3B5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3RbXSBxdWVyeURlc3RpbmF0aW9uUGFyYW1ldGVycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIFByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgIHNoZWxsLCBwcm9qZWN0KTsKLSAgICAgICAgZGlhbG9nLnNldFRpdGxlKElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlQcm9qZWN0QWN0aW9uX2NvcHlUaXRsZSk7Ci0gICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIHJldHVybiBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjb3JkcyB0aGUgY29yZSBleGNlcHRpb24gdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyCi0gICAgICogb25jZSB0aGUgYWN0aW9uIGlzIGZpbmlzaGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4KLSAgICAgKi8KLSAgICBmaW5hbCB2b2lkIHJlY29yZEVycm9yKENvcmVFeGNlcHRpb24gZXJyb3IpIHsKLSAgICAgICAgdGhpcy5lcnJvclN0YXR1cyA9IGVycm9yLmdldFN0YXR1cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQotICAgICAgICBlcnJvclN0YXR1cyA9IG51bGw7Ci0KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKS5nZXQoMCk7Ci0KLSAgICAgICAgLy9HZXQgdGhlIHByb2plY3QgbmFtZSBhbmQgbG9jYXRpb24gaW4gYSB0d28gZWxlbWVudCBsaXN0Ci0gICAgICAgIE9iamVjdFtdIGRlc3RpbmF0aW9uUGF0aHMgPSBxdWVyeURlc3RpbmF0aW9uUGFyYW1ldGVycyhwcm9qZWN0KTsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uUGF0aHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IChTdHJpbmcpIGRlc3RpbmF0aW9uUGF0aHNbMF07Ci0gICAgICAgIElQYXRoIG5ld0xvY2F0aW9uID0gbmV3IFBhdGgoKFN0cmluZykgZGVzdGluYXRpb25QYXRoc1sxXSk7Ci0KLSAgICAgICAgYm9vbGVhbiBjb21wbGV0ZWQgPSBwZXJmb3JtQ29weShwcm9qZWN0LCBuZXdOYW1lLCBuZXdMb2NhdGlvbik7Ci0KLSAgICAgICAgaWYgKCFjb21wbGV0ZWQpIC8vIGllLi0gY2FuY2VsZWQKLSAgICAgICAgICAgIHJldHVybjsgLy8gbm90IGFwcHJvcHJpYXRlIHRvIHNob3cgZXJyb3JzCi0KLSAgICAgICAgLy8gSWYgZXJyb3JzIG9jY3VycmVkLCBvcGVuIGFuIEVycm9yIGRpYWxvZwotICAgICAgICBpZiAoZXJyb3JTdGF0dXMgIT0gbnVsbCkgewotICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKHRoaXMuc2hlbGwsIGdldEVycm9yc1RpdGxlKCksIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIGVycm9yU3RhdHVzKTsKLSAgICAgICAgICAgIGVycm9yU3RhdHVzID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db3B5UmVzb3VyY2VBY3Rpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjwvY29kZT4gbWV0aG9kIGVuYWJsZXMgdGhpcyBhY3Rpb24gb25seSBpZiAKLSAgICAgKiB0aGVyZSBpcyBhIHNpbmdsZSBzZWxlY3Rpb24gd2hpY2ggaXMgYSBwcm9qZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgaWYgKCFzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRTZWxlY3RlZE5vblJlc291cmNlcygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRvIGVuYWJsZSB0aGlzIGNvbW1hbmQgdGhlcmUgbXVzdCBiZSBvbmUgcHJvamVjdCBzZWxlY3RlZCBhbmQgbm90aGluZyBlbHNlCi0gICAgICAgIExpc3Qgc2VsZWN0ZWRSZXNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpOwotICAgICAgICBpZiAoc2VsZWN0ZWRSZXNvdXJjZXMuc2l6ZSgpICE9IDEpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIElSZXNvdXJjZSBzb3VyY2UgPSAoSVJlc291cmNlKSBzZWxlY3RlZFJlc291cmNlcy5nZXQoMCk7Ci0gICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCAmJiAoKElQcm9qZWN0KSBzb3VyY2UpLmlzT3BlbigpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvQ29weVByb2plY3RPcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9Db3B5UHJvamVjdE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjQ0MDY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9Db3B5UHJvamVjdE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvZ3Jlc3MuUHJvZ3Jlc3NNb25pdG9ySm9ic0RpYWxvZzsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyB0byBwZXJmb3JtIHRoZSBhY3R1YWwgY29weWluZyBvZiBwcm9qZWN0IHJlc291cmNlcyBmcm9tIHRoZSBjbGlwYm9hcmQgCi0gKiB3aGVuIHBhc3RlIGFjdGlvbiBpcyBpbnZva2VkLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ29weVByb2plY3RPcGVyYXRpb24gewotCi0gICAgLyoqCi0gICAgICogU3RhdHVzIGNvbnRhaW5pbmcgdGhlIGVycm9ycyBkZXRlY3RlZCB3aGVuIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbiBvcgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGVycm9ycyBkZXRlY3RlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE11bHRpU3RhdHVzIGVycm9yU3RhdHVzOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBhcmVudCBzaGVsbCB1c2VkIHRvIHNob3cgYW55IGRpYWxvZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTaGVsbCBwYXJlbnRTaGVsbDsKLQotICAgIC8qKiAKLSAgICAgKiBDcmVhdGUgYSBuZXcgb3BlcmF0aW9uIGluaXRpYWxpemVkIHdpdGggYSBzaGVsbC4gCi0gICAgICogCi0gICAgICogQHBhcmFtIHNoZWxsIHBhcmVudCBzaGVsbCBmb3IgZXJyb3IgZGlhbG9ncwotICAgICAqLwotICAgIHB1YmxpYyBDb3B5UHJvamVjdE9wZXJhdGlvbihTaGVsbCBzaGVsbCkgewotICAgICAgICBwYXJlbnRTaGVsbCA9IHNoZWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhc3RlIGEgY29weSBvZiB0aGUgcHJvamVjdCBvbiB0aGUgY2xpcGJvYXJkIHRvIHRoZSB3b3Jrc3BhY2UuCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdGhhdCBpcyBiZWlnbiBjb3BpZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29weVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBlcnJvclN0YXR1cyA9IG51bGw7Ci0KLSAgICAgICAgLy9HZXQgdGhlIHByb2plY3QgbmFtZSBhbmQgbG9jYXRpb24gaW4gYSB0d28gZWxlbWVudCBsaXN0Ci0gICAgICAgIFByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgIHBhcmVudFNoZWxsLCBwcm9qZWN0KTsKLSAgICAgICAgZGlhbG9nLnNldFRpdGxlKElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlQcm9qZWN0T3BlcmF0aW9uX2NvcHlQcm9qZWN0KTsKLSAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIE9iamVjdFtdIGRlc3RpbmF0aW9uUGF0aHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvblBhdGhzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU3RyaW5nIG5ld05hbWUgPSAoU3RyaW5nKSBkZXN0aW5hdGlvblBhdGhzWzBdOwotICAgICAgICBJUGF0aCBuZXdMb2NhdGlvbiA9IG5ldyBQYXRoKChTdHJpbmcpIGRlc3RpbmF0aW9uUGF0aHNbMV0pOwotCi0gICAgICAgIGJvb2xlYW4gY29tcGxldGVkID0gcGVyZm9ybVByb2plY3RDb3B5KHByb2plY3QsIG5ld05hbWUsIG5ld0xvY2F0aW9uKTsKLQotICAgICAgICBpZiAoIWNvbXBsZXRlZCkgLy8gaWUuLSBjYW5jZWxlZAotICAgICAgICAgICAgcmV0dXJuOyAvLyBub3QgYXBwcm9wcmlhdGUgdG8gc2hvdyBlcnJvcnMKLQotICAgICAgICAvLyBJZiBlcnJvcnMgb2NjdXJyZWQsIG9wZW4gYW4gRXJyb3IgZGlhbG9nCi0gICAgICAgIGlmIChlcnJvclN0YXR1cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IocGFyZW50U2hlbGwsIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlQcm9qZWN0T3BlcmF0aW9uX2NvcHlGYWlsZWRUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgZXJyb3JTdGF0dXMpOwotICAgICAgICAgICAgZXJyb3JTdGF0dXMgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBwcm9qZWN0IHRvIHRoZSBuZXcgdmFsdWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gY29weQotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgY29weQotICAgICAqIEBwYXJhbSBuZXdMb2NhdGlvbiBJUGF0aAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvcHkgb3BlcmF0aW9uIGNvbXBsZXRlZCwgYW5kIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHdhcyBhYmFuZG9uZWQgcGFydCB3YXkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcGVyZm9ybVByb2plY3RDb3B5KGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsIGZpbmFsIElQYXRoIG5ld0xvY2F0aW9uKSB7Ci0gICAgICAgIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5zZXRUYXNrTmFtZShJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5UHJvamVjdE9wZXJhdGlvbl9wcm9ncmVzc1RpdGxlKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vR2V0IGEgY29weSBvZiB0aGUgY3VycmVudCBkZXNjcmlwdGlvbiBhbmQgbW9kaWZ5IGl0Ci0gICAgICAgICAgICAgICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gbmV3RGVzY3JpcHRpb24gPSBjcmVhdGVQcm9qZWN0RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCwgcHJvamVjdE5hbWUsIG5ld0xvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5jb3B5KG5ld0Rlc2NyaXB0aW9uLCBJUmVzb3VyY2UuU0hBTExPVwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSVJlc291cmNlLkZPUkNFLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkRXJyb3IoZSk7IC8vIGxvZyBlcnJvcgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3IFByb2dyZXNzTW9uaXRvckpvYnNEaWFsb2cocGFyZW50U2hlbGwpLnJ1bih0cnVlLCB0cnVlLCBvcCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgcGFyZW50U2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHBhcmVudFNoZWxsLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5Db3B5UHJvamVjdE9wZXJhdGlvbl9jb3B5RmFpbGVkVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weVByb2plY3RPcGVyYXRpb25faW50ZXJuYWxFcnJvciwgbWVzc2FnZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IElQcm9qZWN0RGVzY3JpcHRpb24gZm9yIHRoZSBjb3B5IHVzaW5nIHRoZSBhdXRvLWdlbmVyYXRlZAotICAgICAqIG5hbWUgYW5kIHBhdGguCi0gICAgICogCi0gICAgICogQHJldHVybiBJUHJvamVjdERlc2NyaXB0aW9uCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHNvdXJjZSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIGZvciB0aGUgbmV3IHByb2plY3QKLSAgICAgKiBAcGFyYW0gcm9vdExvY2F0aW9uIHRoZSBwYXRoIHRoZSBuZXcgcHJvamVjdCB3aWxsIGJlIHN0b3JlZCB1bmRlci4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIElQcm9qZWN0RGVzY3JpcHRpb24gY3JlYXRlUHJvamVjdERlc2NyaXB0aW9uKElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUsIElQYXRoIHJvb3RMb2NhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvL0dldCBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgZGVzY3JpcHRpb24gYW5kIG1vZGlmeSBpdAotICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIG5ld0Rlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBuZXdEZXNjcmlwdGlvbi5zZXROYW1lKHByb2plY3ROYW1lKTsKLQotICAgICAgICAvL0lmIHRoZSBsb2NhdGlvbiBpcyB0aGUgZGVmYXVsdCB0aGVuIHNldCB0aGUgbG9jYXRpb24gdG8gbnVsbAotICAgICAgICBpZiAocm9vdExvY2F0aW9uLmVxdWFscyhQbGF0Zm9ybS5nZXRMb2NhdGlvbigpKSkKLSAgICAgICAgICAgIG5ld0Rlc2NyaXB0aW9uLnNldExvY2F0aW9uKG51bGwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXdEZXNjcmlwdGlvbi5zZXRMb2NhdGlvbihyb290TG9jYXRpb24pOwotCi0gICAgICAgIHJldHVybiBuZXdEZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvcmRzIHRoZSBjb3JlIGV4Y2VwdGlvbiB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIKLSAgICAgKiBvbmNlIHRoZSBhY3Rpb24gaXMgZmluaXNoZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXJyb3IgYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWNvcmRFcnJvcihDb3JlRXhjZXB0aW9uIGVycm9yKSB7Ci0KLSAgICAgICAgaWYgKGVycm9yU3RhdHVzID09IG51bGwpCi0gICAgICAgICAgICBlcnJvclN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm1VSS5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlQcm9qZWN0T3BlcmF0aW9uX2NvcHlGYWlsZWRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0KLSAgICAgICAgZXJyb3JTdGF0dXMubWVyZ2UoZXJyb3IuZ2V0U3RhdHVzKCkpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0NvcHlSZXNvdXJjZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0NvcHlSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTFjZTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9Db3B5UmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lclNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLQotLyoqCi0gKiBTdGFuZGFyZCBhY3Rpb24gZm9yIGNvcHlpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZXNvdXJjZXMgZWxzZXdoZXJlCi0gKiBpbiB0aGUgd29ya3NwYWNlLiBBbGwgcmVzb3VyY2VzIGJlaW5nIGNvcGllZCBhcyBhIGdyb3VwIG11c3QgYmUgc2libGluZ3MuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5UmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiBpbXBsZW1lbnRzCi0gICAgICAgIElTZWxlY3Rpb25WYWxpZGF0b3IgewotCi0gICAgLyoqCi0gICAgICogVGhlIGlkIG9mIHRoaXMgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gUGxhdGZvcm1VSS5QTFVHSU5fSUQKLSAgICAgICAgICAgICsgIi5Db3B5UmVzb3VyY2VBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgc2hlbGwgaW4gd2hpY2ggdG8gc2hvdyBhbnkgZGlhbG9ncy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIG9wZXJhdGlvbiB0byBydW4uICBUaGlzIGlzIGNyZWF0ZWQgb25seSBkdXJpbmcgdGhlIGxpZmUtY3ljbGUgb2YgdGhlCi0gICAgICogcnVuIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbiBvcGVyYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG5hbWUgZm9yIGEgY29weSBvZiB0aGUgcmVzb3VyY2UgYXQgdGhlIGdpdmVuIHBhdGggaW4gdGhlIGdpdmVuCi0gICAgICogd29ya3NwYWNlLiBUaGlzIG5hbWUgY291bGQgYmUgZGV0ZXJtaW5lZCBlaXRoZXIgYXV0b21hdGljYWxseSBvciBieSBxdWVyeWluZwotICAgICAqIHRoZSB1c2VyLiBUaGlzIG5hbWUgd2lsbCA8Yj5ub3Q8L2I+IGJlIHZlcmlmaWVkIGJ5IHRoZSBjYWxsZXIsIHNvIGl0IG11c3QgYmUKLSAgICAgKiB2YWxpZCBhbmQgdW5pcXVlLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcmlnaW5hbE5hbWUgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgcmVzb3VyY2UKLSAgICAgKiBAcGFyYW0gd29ya3NwYWNlIHRoZSB3b3Jrc3BhY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgZnVsbCBwYXRoIGZvciB0aGUgY29weSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc291cmNlCi0gICAgICogICBzaG91bGQgbm90IGJlIGNvcGllZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0TmV3TmFtZUZvcihJUGF0aCBvcmlnaW5hbE5hbWUsIElXb3Jrc3BhY2Ugd29ya3NwYWNlKSB7Ci0gICAgICAgIHJldHVybiBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uLmdldEF1dG9OZXdOYW1lRm9yKG9yaWdpbmFsTmFtZSwKLSAgICAgICAgICAgICAgICB3b3Jrc3BhY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbCBmb3IgYW55IGRpYWxvZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29weVJlc291cmNlQWN0aW9uKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHRoaXMoc2hlbGwsIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlSZXNvdXJjZUFjdGlvbl90aXRsZSk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlJSURFSGVscENvbnRleHRJZHMuQ09QWV9SRVNPVVJDRV9BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIHdpdGggdGhlIGdpdmVuIHRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2hlbGwgdGhlIHNoZWxsIGZvciBhbnkgZGlhbG9ncwotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBzdHJpbmcgdXNlZCBhcyB0aGUgbmFtZSBmb3IgdGhlIGFjdGlvbiwgCi0gICAgICogICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBuYW1lCi0gICAgICovCi0gICAgQ29weVJlc291cmNlQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weVJlc291cmNlQWN0aW9uX3Rvb2xUaXApOwotICAgICAgICBzZXRJZChDb3B5UmVzb3VyY2VBY3Rpb24uSUQpOwotICAgICAgICBpZiAoc2hlbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2hlbGwgPSBzaGVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSB3aGVuIHRoaXMgYWN0aW9uIHJ1bnMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gd2hlbiB0aGlzIGFjdGlvbiBydW5zLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uKGdldFNoZWxsKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhdGggb2YgdGhlIGNvbnRhaW5lciB0byBpbml0aWFsbHkgc2VsZWN0IGluIHRoZSBjb250YWluZXIKLSAgICAgKiBzZWxlY3Rpb24gZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBpbml0aWFsIHNlbGVjdGlvbgotICAgICAqIEByZXR1cm4gVGhlIGluaXRpYWwgY29udGFpbmVyOyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqLwotICAgIElDb250YWluZXIgZ2V0SW5pdGlhbENvbnRhaW5lcigpIHsKLSAgICAgICAgTGlzdCByZXNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpOwotICAgICAgICBpZiAocmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoMCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiByZXNvdXJjZXMgdG8gdXNlIGZvciB0aGUgb3BlcmF0aW9uIGZyb20gCi0gICAgICogdGhlIHByb3ZpZGVkIGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlTGlzdCBUaGUgbGlzdCBvZiByZXNvdXJjZXMgdG8gY29udmVydGVkIGludG8gYW4gYXJyYXkuCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiByZXNvdXJjZXMgdG8gdXNlIGZvciB0aGUgb3BlcmF0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElSZXNvdXJjZVtdIGdldFJlc291cmNlcyhMaXN0IHJlc291cmNlTGlzdCkgewotICAgICAgICByZXR1cm4gKElSZXNvdXJjZVtdKSByZXNvdXJjZUxpc3QudG9BcnJheShuZXcgSVJlc291cmNlW3Jlc291cmNlTGlzdAotICAgICAgICAgICAgICAgIC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGVsbCBpbiB3aGljaCB0byBzaG93IGFueSBkaWFsb2dzCi0gICAgICogQHJldHVybiBUaGUgc2hlbGwgZm9yIHBhcmVudGluZyBkaWFsb2dzOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgcmV0dXJuIHNoZWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db3B5UmVzb3VyY2VBY3Rpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+SVNlbGVjdGlvblZhbGlkYXRvcjwvY29kZT4gbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoCi0gICAgICogaXMgYSBnb29kIHBsYWNlIHRvIGNvcHkgdGhlIHNlbGVjdGVkIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGRlc3RpbmF0aW9uKSB7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0UGx1Z2luV29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSByb290Ci0gICAgICAgICAgICAgICAgLmZpbmRNZW1iZXIoKElQYXRoKSBkZXN0aW5hdGlvbik7Ci0KLSAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgb3BlcmF0aW9uIGhlcmUuIAotICAgICAgICAgICAgLy8gaXNWYWxpZCBpcyBBUEkgYW5kIG1heSBiZSBjYWxsZWQgaW4gYW55IGNvbnRleHQuCi0gICAgICAgICAgICBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uIG5ld09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbigpOwotICAgICAgICAgICAgTGlzdCBzb3VyY2VzID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IChJUmVzb3VyY2VbXSkgc291cmNlcwotICAgICAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgSVJlc291cmNlW3NvdXJjZXMuc2l6ZSgpXSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3T3BlcmF0aW9uLnZhbGlkYXRlRGVzdGluYXRpb24oY29udGFpbmVyLCByZXNvdXJjZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFza3MgdGhlIHVzZXIgZm9yIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGlzIGFjdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHBhdGggb24gYW4gZXhpc3Rpbmcgb3IgbmV3IHJlc291cmNlIGNvbnRhaW5lciwgb3IgCi0gICAgICogIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIGFiYW5kb25lZAotICAgICAqLwotICAgIElQYXRoIHF1ZXJ5RGVzdGluYXRpb25SZXNvdXJjZSgpIHsKLSAgICAgICAgLy8gc3RhcnQgdHJhdmVyc2FsIGF0IHJvb3QgcmVzb3VyY2UsIHNob3VsZCBwcm9iYWJseSBzdGFydCBhdCBhCi0gICAgICAgIC8vIGJldHRlciBsb2NhdGlvbiBpbiB0aGUgdHJlZQotICAgICAgICBDb250YWluZXJTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZyhzaGVsbCwKLSAgICAgICAgICAgICAgICBnZXRJbml0aWFsQ29udGFpbmVyKCksIHRydWUsIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlSZXNvdXJjZUFjdGlvbl9zZWxlY3REZXN0aW5hdGlvbik7Ci0gICAgICAgIGRpYWxvZy5zZXRWYWxpZGF0b3IodGhpcyk7Ci0gICAgICAgIGRpYWxvZy5zaG93Q2xvc2VkUHJvamVjdHMoZmFsc2UpOwotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiAoSVBhdGgpIHJlc3VsdFswXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIFdBUk5JTkc6IGRvIG5vdCBxdWVyeSB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzIG1vcmUgdGhhbiBvbmNlCi0gICAgICAgICAgICAvLyBzaW5jZSB0aGUgc2VsZWN0aW9uIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBydW4sIAotICAgICAgICAgICAgLy8gZS5nLiBkdWUgdG8gd2luZG93IGFjdGl2YXRpb24gd2hlbiB0aGUgcHJvbXB0IGRpYWxvZyBpcyBkaXNtaXNzZWQuCi0gICAgICAgICAgICAvLyBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgQnVnIDYwNjA2IFtOYXZpZ2F0b3JdIChkYXRhIGxvc3MpIE5hdmlnYXRvciBkZWxldGVzL21vdmVzIHRoZSB3cm9uZyBmaWxlCi0gICAgICAgICAgICBMaXN0IHNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpOwotCi0gICAgICAgICAgICBJUGF0aCBkZXN0aW5hdGlvbiA9IHF1ZXJ5RGVzdGluYXRpb25SZXNvdXJjZSgpOwotICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gSURFV29ya2JlbmNoUGx1Z2luLmdldFBsdWdpbldvcmtzcGFjZSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSb290KCk7Ci0gICAgICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSByb290LmZpbmRNZW1iZXIoZGVzdGluYXRpb24pOwotICAgICAgICAgICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBydW5PcGVyYXRpb24oZ2V0UmVzb3VyY2VzKHNvdXJjZXMpLCBjb250YWluZXIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgb3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIG9wZXJhdGlvbiBjcmVhdGVkIGluIDxjb2RlPmNyZWF0ZU9wZXJhaXRvbjwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIHNvdXJjZSByZXNvdXJjZXMgdG8gcGFzcyB0byB0aGUgb3BlcmF0aW9uCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIGRlc3RpbmF0aW9uIGNvbnRhaW5lciB0byBwYXNzIHRvIHRoZSBvcGVyYXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5PcGVyYXRpb24oSVJlc291cmNlW10gcmVzb3VyY2VzLCBJQ29udGFpbmVyIGRlc3RpbmF0aW9uKSB7Ci0gICAgICAgIG9wZXJhdGlvbi5jb3B5UmVzb3VyY2VzKHJlc291cmNlcywgZGVzdGluYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db3B5UmVzb3VyY2VBY3Rpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjwvY29kZT4gbWV0aG9kIGVuYWJsZXMgdGhpcyBhY3Rpb24gb25seSBpZiAKLSAgICAgKiBhbGwgb2YgdGhlIG9uZSBvciBtb3JlIHNlbGVjdGlvbnMgYXJlIHNpYmxpbmcgcmVzb3VyY2VzIHdoaWNoIGFyZSAKLSAgICAgKiBsb2NhbCAoZGVwdGggaW5maW5pdHkpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgaWYgKCFzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRTZWxlY3RlZE5vblJlc291cmNlcygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRvIGVuYWJsZSB0aGlzIGNvbW1hbmQgYWxsIHNlbGVjdGVkIHJlc291cmNlcyBtdXN0IGJlIHNpYmxpbmdzCi0gICAgICAgIExpc3Qgc2VsZWN0ZWRSZXNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpOwotICAgICAgICBpZiAoc2VsZWN0ZWRSZXNvdXJjZXMuc2l6ZSgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIElDb250YWluZXIgZmlyc3RQYXJlbnQgPSAoKElSZXNvdXJjZSkgc2VsZWN0ZWRSZXNvdXJjZXMuZ2V0KDApKQotICAgICAgICAgICAgICAgIC5nZXRQYXJlbnQoKTsKLSAgICAgICAgaWYgKGZpcnN0UGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvciByZXNvdXJjZXNFbnVtID0gc2VsZWN0ZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHJlc291cmNlc0VudW0uaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgY3VycmVudFJlc291cmNlID0gKElSZXNvdXJjZSkgcmVzb3VyY2VzRW51bS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWN1cnJlbnRSZXNvdXJjZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjdXJyZW50UmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSUNvbnRhaW5lciBwYXJlbnQgPSBjdXJyZW50UmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAoIXBhcmVudC5lcXVhbHMoZmlyc3RQYXJlbnQpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvQ3JlYXRlRmlsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0NyZWF0ZUZpbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1NWVhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvQ3JlYXRlRmlsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld0ZpbGVSZXNvdXJjZVdpemFyZDsKLQotLyoqCi0gKiBTdGFuZGFyZCBhY3Rpb24gZm9yIGNyZWF0aW5nIGEgZmlsZSByZXNvdXJjZSB3aXRoaW4gdGhlIGN1cnJlbnRseQotICogc2VsZWN0ZWQgZm9sZGVyIG9yIHByb2plY3QuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBkZXByZWNhdGVkIHNob3VsZCB1c2UgTmV3V2l6YXJkTWVudSB0byBwb3B1bGF0ZSBhIE5ldyBzdWJtZW51IGluc3RlYWQgKHNlZSBOYXZpZ2F0b3IgdmlldykKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUZpbGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaWQgb2YgdGhpcyBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBQbGF0Zm9ybVVJLlBMVUdJTl9JRCArICIuQ3JlYXRlRmlsZUFjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIHNoZWxsIGluIHdoaWNoIHRvIHNob3cgYW55IGRpYWxvZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIGZvciBjcmVhdGluZyBhIGZpbGUgcmVzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2hlbGwgdGhlIHNoZWxsIGZvciBhbnkgZGlhbG9ncwotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIHNlZSBkZXByZWNhdGVkIHRhZyBvbiBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBDcmVhdGVGaWxlQWN0aW9uKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHN1cGVyKElERVdvcmtiZW5jaE1lc3NhZ2VzLkNyZWF0ZUZpbGVBY3Rpb25fdGV4dCk7Ci0gICAgICAgIGlmIChzaGVsbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zaGVsbCA9IHNoZWxsOwotICAgICAgICBzZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5DcmVhdGVGaWxlQWN0aW9uX3Rvb2xUaXApOwotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKQotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZJTEUpKTsKLSAgICAgICAgc2V0SWQoSUQpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJSUlERUhlbHBDb250ZXh0SWRzLkNSRUFURV9GSUxFX0FDVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkNyZWF0ZUZpbGVBY3Rpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5JQWN0aW9uPC9jb2RlPiBtZXRob2Qgb3BlbnMgYSA8Y29kZT5CYXNpY05ld0ZpbGVSZXNvdXJjZVdpemFyZDwvY29kZT4KLSAgICAgKiBpbiBhIHdpemFyZCBkaWFsb2cgdW5kZXIgdGhlIHNoZWxsIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBCYXNpY05ld0ZpbGVSZXNvdXJjZVdpemFyZCB3aXphcmQgPSBuZXcgQmFzaWNOZXdGaWxlUmVzb3VyY2VXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLSAgICAgICAgd2l6YXJkLnNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KAotICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNyZWF0ZUZpbGVBY3Rpb25fdGl0bGUpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5ORVdfRklMRV9XSVpBUkQpOwotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5DcmVhdGVGaWxlQWN0aW9uPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+U2VsZWN0aW9uTGlzdGVuZXJBY3Rpb248L2NvZGU+IG1ldGhvZCBlbmFibGVzIHRoZSBhY3Rpb24gb25seQotICAgICAqIGlmIHRoZSBzZWxlY3Rpb24gY29udGFpbnMgZm9sZGVycyBhbmQgb3BlbiBwcm9qZWN0cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gcykgewotICAgICAgICBpZiAoIXN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIEl0ZXJhdG9yIHJlc291cmNlcyA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHJlc291cmNlcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIXJlc291cmNlSXNUeXBlKHJlc291cmNlLCBJUmVzb3VyY2UuUFJPSkVDVCB8IElSZXNvdXJjZS5GT0xERVIpCi0gICAgICAgICAgICAgICAgICAgIHx8ICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvQ3JlYXRlRm9sZGVyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvQ3JlYXRlRm9sZGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjM2ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0NyZWF0ZUZvbGRlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld0ZvbGRlclJlc291cmNlV2l6YXJkOwotCi0vKioKLSAqIFN0YW5kYXJkIGFjdGlvbiBmb3IgY3JlYXRpbmcgYSBmb2xkZXIgcmVzb3VyY2Ugd2l0aGluIHRoZSBjdXJyZW50bHkKLSAqIHNlbGVjdGVkIGZvbGRlciBvciBwcm9qZWN0LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogCi0gKiBAZGVwcmVjYXRlZCBzaG91bGQgdXNlIE5ld1dpemFyZE1lbnUgdG8gcG9wdWxhdGUgYSBOZXcgc3VibWVudSBpbnN0ZWFkIChzZWUgTmF2aWdhdG9yIHZpZXcpCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVGb2xkZXJBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaWQgb2YgdGhpcyBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBQbGF0Zm9ybVVJLlBMVUdJTl9JRAotICAgICAgICAgICAgKyAiLkNyZWF0ZUZvbGRlckFjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIHNoZWxsIGluIHdoaWNoIHRvIHNob3cgYW55IGRpYWxvZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIGZvciBjcmVhdGluZyBhIGZvbGRlciByZXNvdXJjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgZm9yIGFueSBkaWFsb2dzCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgc2VlIGRlcHJlY2F0ZWQgdGFnIG9uIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIENyZWF0ZUZvbGRlckFjdGlvbihTaGVsbCBzaGVsbCkgewotICAgICAgICBzdXBlcihJREVXb3JrYmVuY2hNZXNzYWdlcy5DcmVhdGVGb2xkZXJBY3Rpb25fdGV4dCk7Ci0gICAgICAgIGlmIChzaGVsbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zaGVsbCA9IHNoZWxsOwotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKQotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUikpOwotICAgICAgICBzZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5DcmVhdGVGb2xkZXJBY3Rpb25fdG9vbFRpcCk7Ci0gICAgICAgIHNldElkKElEKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5DUkVBVEVfRk9MREVSX0FDVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkNyZWF0ZUZvbGRlckFjdGlvbjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPklBY3Rpb248L2NvZGU+IG1ldGhvZCBvcGVucyBhIDxjb2RlPkJhc2ljTmV3Rm9sZGVyUmVzb3VyY2VXaXphcmQ8L2NvZGU+Ci0gICAgICogaW4gYSB3aXphcmQgZGlhbG9nIHVuZGVyIHRoZSBzaGVsbCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgQmFzaWNOZXdGb2xkZXJSZXNvdXJjZVdpemFyZCB3aXphcmQgPSBuZXcgQmFzaWNOZXdGb2xkZXJSZXNvdXJjZVdpemFyZCgpOwotICAgICAgICB3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotICAgICAgICB3aXphcmQuc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuQ3JlYXRlRm9sZGVyQWN0aW9uX3RpdGxlKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBJSURFSGVscENvbnRleHRJZHMuTkVXX0ZPTERFUl9XSVpBUkQpOwotICAgICAgICBkaWFsb2cub3BlbigpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkNyZWF0ZUZvbGRlckFjdGlvbjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uPC9jb2RlPiBtZXRob2QgZW5hYmxlcyB0aGUgYWN0aW9uIG9ubHkKLSAgICAgKiBpZiB0aGUgc2VsZWN0aW9uIGNvbnRhaW5zIGZvbGRlcnMgYW5kIG9wZW4gcHJvamVjdHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsKLSAgICAgICAgaWYgKCFzdXBlci51cGRhdGVTZWxlY3Rpb24ocykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvciByZXNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChyZXNvdXJjZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSByZXNvdXJjZXMubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFyZXNvdXJjZUlzVHlwZShyZXNvdXJjZSwgSVJlc291cmNlLlBST0pFQ1QgfCBJUmVzb3VyY2UuRk9MREVSKQotICAgICAgICAgICAgICAgICAgICB8fCAhcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0NyZWF0ZVByb2plY3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9DcmVhdGVQcm9qZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMjI4YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0NyZWF0ZVByb2plY3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLk11bHRpU3RlcFdpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5OZXdQcm9qZWN0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeS5DYXBhYmlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeS5DYXBhYmlsaXR5UmVnaXN0cnk7Ci0KLS8qKgotICogU3RhbmRhcmQgYWN0aW9uIGZvciBsYXVuY2hpbmcgdGhlIG5ldyBwcm9qZWN0IGNyZWF0aW9uCi0gKiB3aXphcmQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBhbmQgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICogQGRlcHJlY2F0ZWQgVGhpcyBuZXcgZXhwZXJpbWVudGFsIEFQSSBpcyBiZWluZyB0ZW1wb3JhcnkKLSAqIAkJZGVwcmVjYXRlZCBmb3IgcmVsZWFzZSAyLjAgIE5ldyBwcm9qZWN0IGNyZWF0aW9uIHNob3VsZAotICogCQljb250aW51ZSB0byBtYWtlIHVzZSBvZiBOZXdQcm9qZWN0QWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUHJvamVjdEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0gICAgLyoqCi0gICAgICogVGhlIHdpemFyZCBkaWFsb2cgd2lkdGgKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9XSURUSCA9IDUwMDsKLQotICAgIC8qKgotICAgICAqIFRoZSB3aXphcmQgZGlhbG9nIGhlaWdodAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX0hFSUdIVCA9IDUwMDsKLQotICAgIC8qKgotICAgICAqIFRoZSB3b3JrYmVuY2ggd2luZG93IHRoaXMgYWN0aW9uIHdpbGwgcnVuIGluCi0gICAgICovCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotICAgIC8qKgotICAgICAqIFRoZSBzdWdnZXN0ZWQgbmFtZSBmb3IgdGhlIG5ldyBwcm9qZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5pdGlhbFByb2plY3ROYW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIHN1Z2dlc3RlZCBjYXBhYmlsaXRpZXMgZm9yIHRoZSBuZXcgcHJvamVjdAotICAgICAqLwotICAgIHByaXZhdGUgQ2FwYWJpbGl0eVtdIGluaXRpYWxQcm9qZWN0Q2FwYWJpbGl0aWVzOwotCi0gICAgLyoqCi0gICAgICogVGhlIHN1Z2dlc3RlZCBjYXRlZ29yaWVzIHRvIGJlIHNlbGVjdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBDYXRlZ29yeVtdIGluaXRpYWxTZWxlY3RlZENhdGVnb3JpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBmb3IgbGF1bmNoaW5nIHRoZSBuZXcgcHJvamVjdAotICAgICAqIHNlbGVjdGlvbiB3aXphcmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2luZG93IHRoZSB3b3JrYmVuY2ggd2luZG93IHRvIHF1ZXJ5IHRoZSBjdXJyZW50Ci0gICAgICogCQlzZWxlY3Rpb24gYW5kIHNoZWxsIGZvciBvcGVuaW5nIHRoZSB3aXphcmQuCi0gICAgICovCi0gICAgcHVibGljIENyZWF0ZVByb2plY3RBY3Rpb24oSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgc3VwZXIoSURFV29ya2JlbmNoTWVzc2FnZXMuQ3JlYXRlUHJvamVjdEFjdGlvbl90ZXh0KTsKLSAgICAgICAgaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0gICAgICAgIElTaGFyZWRJbWFnZXMgaW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLSAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlcwotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ORVdfV0laQVJEKSk7Ci0gICAgICAgIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGltYWdlcwotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ORVdfV0laQVJEX0RJU0FCTEVEKSk7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLkNyZWF0ZVByb2plY3RBY3Rpb25fdG9vbFRpcCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoSGVscENvbnRleHRJZHMuTkVXX0FDVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIHRvIGluaXRpYWxpemVkIHRoZSB3aXphcmQgd2l0aAotICAgICAqLwotICAgIHByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRJbml0aWFsU2VsZWN0aW9uKCkgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvblRvUGFzcyA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgICAgIHNlbGVjdGlvblRvUGFzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICByZXR1cm4gc2VsZWN0aW9uVG9QYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGluaXRpYWwgY2F0ZWdvcmllcyB0byBiZSBzZWxlY3RlZC4gSWdub3JlcwotICAgICAqIGFueSBJRHMgd2hpY2ggZG8gbm90IHJlcHJlc2VudCB2YWxpZCBjYXRlZ29yaWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZHMgaW5pdGlhbCBjYXRlZ29yeSBpZHMgdG8gc2VsZWN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGVkQ2F0ZWdvcmllcyhTdHJpbmdbXSBpZHMpIHsKLSAgICAgICAgaWYgKGlkcyA9PSBudWxsIHx8IGlkcy5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgIGluaXRpYWxTZWxlY3RlZENhdGVnb3JpZXMgPSBudWxsOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIENhcGFiaWxpdHlSZWdpc3RyeSByZWcgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDYXBhYmlsaXR5UmVnaXN0cnkoKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdChpZHMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ2F0ZWdvcnkgY2F0ID0gcmVnLmZpbmRDYXRlZ29yeShpZHNbaV0pOwotICAgICAgICAgICAgICAgIGlmIChjYXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoY2F0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXN1bHRzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBpbml0aWFsU2VsZWN0ZWRDYXRlZ29yaWVzID0gbnVsbDsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGluaXRpYWxTZWxlY3RlZENhdGVnb3JpZXMgPSBuZXcgQ2F0ZWdvcnlbcmVzdWx0cy5zaXplKCldOwotICAgICAgICAgICAgICAgIHJlc3VsdHMudG9BcnJheShpbml0aWFsU2VsZWN0ZWRDYXRlZ29yaWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGluaXRpYWwgcHJvamVjdCBjYXBhYmlsaXRpZXMgdG8gYmUgc2VsZWN0ZWQuCi0gICAgICogSWdub3JlcyBhbnkgSURzIHdoaWNoIGRvIG5vdCByZXByZXNlbnQgdmFsaWQgY2FwYWJpbGl0aWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZHMgaW5pdGlhbCBwcm9qZWN0IGNhcGFiaWxpdHkgaWRzIHRvIHNlbGVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxQcm9qZWN0Q2FwYWJpbGl0aWVzKFN0cmluZ1tdIGlkcykgewotICAgICAgICBpZiAoaWRzID09IG51bGwgfHwgaWRzLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgaW5pdGlhbFByb2plY3RDYXBhYmlsaXRpZXMgPSBudWxsOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIENhcGFiaWxpdHlSZWdpc3RyeSByZWcgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDYXBhYmlsaXR5UmVnaXN0cnkoKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdChpZHMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ2FwYWJpbGl0eSBjYXAgPSByZWcuZmluZENhcGFiaWxpdHkoaWRzW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoY2FwICE9IG51bGwgJiYgY2FwLmlzVmFsaWQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoY2FwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXN1bHRzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBpbml0aWFsUHJvamVjdENhcGFiaWxpdGllcyA9IG51bGw7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbml0aWFsUHJvamVjdENhcGFiaWxpdGllcyA9IG5ldyBDYXBhYmlsaXR5W3Jlc3VsdHMuc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICByZXN1bHRzLnRvQXJyYXkoaW5pdGlhbFByb2plY3RDYXBhYmlsaXRpZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW5pdGlhbCBwcm9qZWN0IG5hbWUuIExlYWRpbmcgYW5kIHRyYWlsaW5nCi0gICAgICogc3BhY2VzIGluIHRoZSBuYW1lIGFyZSBpZ25vcmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIGluaXRpYWwgcHJvamVjdCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFByb2plY3ROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICBpbml0aWFsUHJvamVjdE5hbWUgPSBudWxsOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpbml0aWFsUHJvamVjdE5hbWUgPSBuYW1lLnRyaW0oKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcHJvamVjdCB3aXphcmQgCi0gICAgICAgIE5ld1Byb2plY3RXaXphcmQgd2l6YXJkID0gbmV3IE5ld1Byb2plY3RXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkLmluaXQod2luZG93LmdldFdvcmtiZW5jaCgpLCBnZXRJbml0aWFsU2VsZWN0aW9uKCkpOwotICAgICAgICB3aXphcmQuc2V0SW5pdGlhbFByb2plY3ROYW1lKGluaXRpYWxQcm9qZWN0TmFtZSk7Ci0gICAgICAgIHdpemFyZC5zZXRJbml0aWFsUHJvamVjdENhcGFiaWxpdGllcyhpbml0aWFsUHJvamVjdENhcGFiaWxpdGllcyk7Ci0gICAgICAgIHdpemFyZC5zZXRJbml0aWFsU2VsZWN0ZWRDYXRlZ29yaWVzKGluaXRpYWxTZWxlY3RlZENhdGVnb3JpZXMpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIHdpemFyZCBkaWFsb2cuCi0gICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgTXVsdGlTdGVwV2l6YXJkRGlhbG9nKHdpbmRvdy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIHdpemFyZCk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSgKLSAgICAgICAgICAgICAgICBNYXRoLm1heChTSVpJTkdfV0laQVJEX1dJRFRILCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0gICAgICAgICAgICAgICAgU0laSU5HX1dJWkFSRF9IRUlHSFQpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5ORVdfUFJPSkVDVF9XSVpBUkQpOwotCi0gICAgICAgIC8vIE9wZW4gdGhlIHdpemFyZC4KLSAgICAgICAgZGlhbG9nLm9wZW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvRGVsZXRlUmVzb3VyY2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9EZWxldGVSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjdkMWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9EZWxldGVSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUnVsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLQotLyoqCi0gKiBTdGFuZGFyZCBhY3Rpb24gZm9yIGRlbGV0aW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmVzb3VyY2VzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLSAgICBzdGF0aWMgY2xhc3MgRGVsZXRlUHJvamVjdERpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCi0gICAgICAgIHByaXZhdGUgSVJlc291cmNlW10gcHJvamVjdHM7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZUNvbnRlbnQgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb250cm9sIHRlc3RpbmcgbW9kZS4gIEluIHRlc3RpbmcgbW9kZSwgaXQgcmV0dXJucyB0cnVlIHRvCi0gICAgICAgICAqIGRlbGV0ZSBjb250ZW50cyBhbmQgZG9lcyBub3QgcG9wIHVwIHRoZSBkaWFsb2cuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZklzVGVzdGluZyA9IGZhbHNlOwotCi0gICAgICAgIHByaXZhdGUgQnV0dG9uIHJhZGlvMTsKLQotICAgICAgICBwcml2YXRlIEJ1dHRvbiByYWRpbzI7Ci0KLSAgICAgICAgRGVsZXRlUHJvamVjdERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVJlc291cmNlW10gcHJvamVjdHMpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudFNoZWxsLCBnZXRUaXRsZShwcm9qZWN0cyksIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdCB3aW5kb3cgaWNvbgotICAgICAgICAgICAgICAgICAgICBnZXRNZXNzYWdlKHByb2plY3RzKSwgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMIH0sIDApOyAvLyB5ZXMgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIHRoaXMucHJvamVjdHMgPSBwcm9qZWN0czsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBTdHJpbmcgZ2V0VGl0bGUoSVJlc291cmNlW10gcHJvamVjdHMpIHsKLSAgICAgICAgICAgIGlmIChwcm9qZWN0cy5sZW5ndGggPT0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fdGl0bGVQcm9qZWN0MTsKLSAgICAgICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5EZWxldGVSZXNvdXJjZUFjdGlvbl90aXRsZVByb2plY3ROOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKElSZXNvdXJjZVtdIHByb2plY3RzKSB7Ci0gICAgICAgICAgICBpZiAocHJvamVjdHMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBwcm9qZWN0c1swXTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fY29uZmlybVByb2plY3QxLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fY29uZmlybVByb2plY3ROLCBuZXcgSW50ZWdlcihwcm9qZWN0cy5sZW5ndGgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpbmRvdy4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0gICAgICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0gICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5ld1NoZWxsLAotICAgICAgICAgICAgICAgICAgICBJSURFSGVscENvbnRleHRJZHMuREVMRVRFX1BST0pFQ1RfRElBTE9HKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICAgICAgcmFkaW8xID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0gICAgICAgICAgICByYWRpbzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotICAgICAgICAgICAgU3RyaW5nIHRleHQxOwotICAgICAgICAgICAgaWYgKHByb2plY3RzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcHJvamVjdHNbMF07Ci0gICAgICAgICAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCB8fCBwcm9qZWN0LmdldExvY2F0aW9uKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGV4dDEgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5EZWxldGVSZXNvdXJjZUFjdGlvbl9kZWxldGVDb250ZW50c047Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0ZXh0MSA9IE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLkRlbGV0ZVJlc291cmNlQWN0aW9uX2RlbGV0ZUNvbnRlbnRzMSwgcHJvamVjdC5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRleHQxID0gSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fZGVsZXRlQ29udGVudHNOOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmFkaW8xLnNldFRleHQodGV4dDEpOwotICAgICAgICAgICAgcmFkaW8xLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgICAgIHJhZGlvMiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUkFESU8pOwotICAgICAgICAgICAgcmFkaW8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0MiA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLkRlbGV0ZVJlc291cmNlQWN0aW9uX2RvTm90RGVsZXRlQ29udGVudHM7Ci0gICAgICAgICAgICByYWRpbzIuc2V0VGV4dCh0ZXh0Mik7Ci0gICAgICAgICAgICByYWRpbzIuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotICAgICAgICAgICAgLy8gc2V0IGluaXRpYWwgc3RhdGUKLSAgICAgICAgICAgIHJhZGlvMS5zZXRTZWxlY3Rpb24oZGVsZXRlQ29udGVudCk7Ci0gICAgICAgICAgICByYWRpbzIuc2V0U2VsZWN0aW9uKCFkZWxldGVDb250ZW50KTsKLQotICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGVDb250ZW50ID0gKGJ1dHRvbiA9PSByYWRpbzEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBib29sZWFuIGdldERlbGV0ZUNvbnRlbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVsZXRlQ29udGVudDsKLSAgICAgICAgfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I29wZW4oKQotCQkgKi8KLQkJcHVibGljIGludCBvcGVuKCkgewotCQkJLy9PdmVycmlkZSBXaW5kb3cjb3BlbigpIHRvIGFsbG93IGZvciBub24taW50ZXJhY3RpdmUgdGVzdGluZy4KLQkJCWlmIChmSXNUZXN0aW5nKSB7Ci0JCQkJZGVsZXRlQ29udGVudCA9IHRydWU7Ci0JCQkJcmV0dXJuIFdpbmRvdy5PSzsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JCX0KLSAgICAgICAgCi0JCS8qKgotCQkgKiBTZXQgdGhpcyBkZWxldGUgZGlhbG9nIGludG8gdGVzdGluZyBtb2RlLiAgSXQgd29uJ3QgcG9wIHVwLCAKLQkJICogYW5kIGl0IHJldHVybnMgdHJ1ZSBmb3IgZGVsZXRlQ29udGVudC4KLQkJICogCi0JCSAqIEBwYXJhbSB0IHRoZSB0ZXN0aW5nIG1vZGUKLQkJICovCi0gICAgICAgIHZvaWQgc2V0VGVzdGluZ01vZGUoYm9vbGVhbiB0KSB7Ci0gICAgICAgIAlmSXNUZXN0aW5nID0gdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBpZCBvZiB0aGlzIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IFBsYXRmb3JtVUkuUExVR0lOX0lECi0gICAgICAgICAgICArICIuRGVsZXRlUmVzb3VyY2VBY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBzaGVsbCBpbiB3aGljaCB0byBzaG93IGFueSBkaWFsb2dzLgotICAgICAqLwotICAgIHByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgZGVsZXRpbmcgY29udGVudCBmb3IgcHJvamVjdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZUNvbnRlbnQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgb3Igbm90IHRvIGF1dG9tYXRpY2FsbHkgZGVsZXRlIG91dCBvZiBzeW5jIHJlc291cmNlcwotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZU91dE9mU3luY0RlbGV0ZSA9IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIEZsYWcgdGhhdCBhbGxvd3MgdGVzdGluZyBtb2RlIC4uLiBpdCB3b24ndCBwb3AgdXAgdGhlIHByb2plY3QKLSAgICAgKiBkZWxldGUgZGlhbG9nLCBhbmQgd2lsbCByZXR1cm4gImRlbGV0ZSBhbGwgY29udGVudCIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZlRlc3RpbmdNb2RlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGRlbGV0ZSByZXNvdXJjZSBhY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2hlbGwgdGhlIHNoZWxsIGZvciBhbnkgZGlhbG9ncwotICAgICAqLwotICAgIHB1YmxpYyBEZWxldGVSZXNvdXJjZUFjdGlvbihTaGVsbCBzaGVsbCkgewotICAgICAgICBzdXBlcihJREVXb3JrYmVuY2hNZXNzYWdlcy5EZWxldGVSZXNvdXJjZUFjdGlvbl90ZXh0KTsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fdG9vbFRpcCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlJSURFSGVscENvbnRleHRJZHMuREVMRVRFX1JFU09VUkNFX0FDVElPTik7Ci0gICAgICAgIHNldElkKElEKTsKLSAgICAgICAgaWYgKHNoZWxsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNoZWxsID0gc2hlbGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIGRlbGV0ZSBjYW4gYmUgcGVyZm9ybWVkIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZXMgdGhlIHNlbGVjdGVkIHJlc291cmNlcwotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc291cmNlcyBjYW4gYmUgZGVsZXRlZCwgYW5kIAotICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHNlbGVjdGlvbiBjb250YWlucyBub24tcmVzb3VyY2VzIG9yIHBoYW50b20KLSAgICAgKiAgcmVzb3VyY2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhbkRlbGV0ZShJUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKLSAgICAgICAgLy8gYWxsb3cgb25seSBwcm9qZWN0cyBvciBvbmx5IG5vbi1wcm9qZWN0cyB0byBiZSBzZWxlY3RlZDsgCi0gICAgICAgIC8vIG5vdGUgdGhhdCB0aGUgc2VsZWN0aW9uIG1heSBjb250YWluIG11bHRpcGxlIHR5cGVzIG9mIHJlc291cmNlCi0gICAgICAgIGlmICghKGNvbnRhaW5zT25seVByb2plY3RzKHJlc291cmNlcykgfHwgY29udGFpbnNPbmx5Tm9uUHJvamVjdHMocmVzb3VyY2VzKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXNvdXJjZXMubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8vIFJldHVybiB0cnVlIGlmIGV2ZXJ5dGhpbmcgaW4gdGhlIHNlbGVjdGlvbiBleGlzdHMuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UuaXNQaGFudG9tKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gY29udGFpbnMgbGlua2VkIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZXMgdGhlIHNlbGVjdGVkIHJlc291cmNlcwotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc291cmNlcyBjb250YWluIGxpbmtlZCAgIAotICAgICAqICByZXNvdXJjZXMsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zTGlua2VkUmVzb3VyY2UoSVJlc291cmNlW10gcmVzb3VyY2VzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UuaXNMaW5rZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gY29udGFpbnMgb25seSBub24tcHJvamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXNvdXJjZXMgY29udGFpbnMgb25seSBub24tcHJvamVjdHMsIGFuZCAKLSAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc09ubHlOb25Qcm9qZWN0cyhJUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKLSAgICAgICAgaW50IHR5cGVzID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZVR5cGVzKHJlc291cmNlcyk7Ci0gICAgICAgIC8vIGNoZWNrIGZvciBlbXB0eSBzZWxlY3Rpb24KLSAgICAgICAgaWYgKHR5cGVzID09IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8vIG5vdGUgdGhhdCB0aGUgc2VsZWN0aW9uIG1heSBjb250YWluIG11bHRpcGxlIHR5cGVzIG9mIHJlc291cmNlCi0gICAgICAgIHJldHVybiAodHlwZXMgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBjb250YWlucyBvbmx5IHByb2plY3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZXMgdGhlIHNlbGVjdGVkIHJlc291cmNlcwotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc291cmNlcyBjb250YWlucyBvbmx5IHByb2plY3RzLCBhbmQgCi0gICAgICogIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNPbmx5UHJvamVjdHMoSVJlc291cmNlW10gcmVzb3VyY2VzKSB7Ci0gICAgICAgIGludCB0eXBlcyA9IGdldFNlbGVjdGVkUmVzb3VyY2VUeXBlcyhyZXNvdXJjZXMpOwotICAgICAgICAvLyBub3RlIHRoYXQgdGhlIHNlbGVjdGlvbiBtYXkgY29udGFpbiBtdWx0aXBsZSB0eXBlcyBvZiByZXNvdXJjZQotICAgICAgICByZXR1cm4gdHlwZXMgPT0gSVJlc291cmNlLlBST0pFQ1Q7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSByZXN1bHQgc3RhdHVzIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gbGlzdCBvZiBleGNlcHRpb25zLgotICAgICAqIEBwYXJhbSBleGNlcHRpb25zIFRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhhdCBvY2N1cnJlZCAobWF5IGJlIGVtcHR5KQotICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdCBzdGF0dXMgZm9yIHRoZSBkZWxldGlvbgotICAgICAqLwotICAgIHByaXZhdGUgSVN0YXR1cyBjcmVhdGVSZXN1bHQoTGlzdCBleGNlcHRpb25zKSB7Ci0gICAgCWlmIChleGNlcHRpb25zLmlzRW1wdHkoKSkKLSAgICAJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBmaW5hbCBpbnQgZXhjZXB0aW9uQ291bnQgPSBleGNlcHRpb25zLnNpemUoKTsKLSAgICAgICAgaWYgKGV4Y2VwdGlvbkNvdW50ID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiAoKENvcmVFeGNlcHRpb24pIGV4Y2VwdGlvbnMuZ2V0KDApKS5nZXRTdGF0dXMoKTsKLSAgICAgICAgfQotICAgICAgICBDb3JlRXhjZXB0aW9uW10gY2hpbGRyZW4gPSAoQ29yZUV4Y2VwdGlvbltdKSBleGNlcHRpb25zLnRvQXJyYXkobmV3IENvcmVFeGNlcHRpb25bZXhjZXB0aW9uQ291bnRdKTsKLSAgICAgICAgYm9vbGVhbiBvdXRPZlN5bmMgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuT1VUX09GX1NZTkNfTE9DQUwpIHsKLSAgICAgICAgICAgICAgICBvdXRPZlN5bmMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9IG91dE9mU3luYyA/IElERVdvcmtiZW5jaE1lc3NhZ2VzLkRlbGV0ZVJlc291cmNlQWN0aW9uX291dE9mU3luY0Vycm9yIDogSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fZGVsZXRpb25FeGNlcHRpb25NZXNzYWdlOwotICAgICAgICBmaW5hbCBNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cygKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwKLSAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgIHRpdGxlLCBudWxsKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25Db3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBleGNlcHRpb24uZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBtdWx0aS5hZGQobmV3IFN0YXR1cyhzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgc3RhdHVzLmdldFBsdWdpbigpLAotICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0Q29kZSgpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbXVsdGk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNrcyB0aGUgdXNlciB0byBjb25maXJtIGEgZGVsZXRlIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZXMgdGhlIHNlbGVjdGVkIHJlc291cmNlcwotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgc2F5cyB0byBnbyBhaGVhZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICBpZiB0aGUgZGVsZXRpb24gc2hvdWxkIGJlIGFiYW5kb25lZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb25maXJtRGVsZXRlKElSZXNvdXJjZVtdIHJlc291cmNlcykgewotICAgICAgICBpZiAoY29udGFpbnNPbmx5UHJvamVjdHMocmVzb3VyY2VzKSkgewotICAgICAgICAgICAgcmV0dXJuIGNvbmZpcm1EZWxldGVQcm9qZWN0cyhyZXNvdXJjZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb25maXJtRGVsZXRlTm9uUHJvamVjdHMocmVzb3VyY2VzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc2tzIHRoZSB1c2VyIHRvIGNvbmZpcm0gYSBkZWxldGUgb3BlcmF0aW9uLAotICAgICAqIHdoZXJlIHRoZSBzZWxlY3Rpb24gY29udGFpbnMgbm8gcHJvamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHNheXMgdG8gZ28gYWhlYWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgaWYgdGhlIGRlbGV0aW9uIHNob3VsZCBiZSBhYmFuZG9uZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY29uZmlybURlbGV0ZU5vblByb2plY3RzKElSZXNvdXJjZVtdIHJlc291cmNlcykgewotICAgICAgICBTdHJpbmcgdGl0bGU7Ci0gICAgICAgIFN0cmluZyBtc2c7Ci0gICAgICAgIGlmIChyZXNvdXJjZXMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIHRpdGxlID0gSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fdGl0bGUxOwotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzWzBdOwotICAgICAgICAgICAgaWYgKHJlc291cmNlLmlzTGlua2VkKCkpCi0gICAgICAgICAgICAgICAgbXNnID0gTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fY29uZmlybUxpbmtlZFJlc291cmNlMSwgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtc2cgPSBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5EZWxldGVSZXNvdXJjZUFjdGlvbl9jb25maXJtMSwgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRpdGxlID0gSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fdGl0bGVOOwotICAgICAgICAgICAgaWYgKGNvbnRhaW5zTGlua2VkUmVzb3VyY2UocmVzb3VyY2VzKSkKLSAgICAgICAgICAgICAgICBtc2cgPSBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5EZWxldGVSZXNvdXJjZUFjdGlvbl9jb25maXJtTGlua2VkUmVzb3VyY2VOLCBuZXcgSW50ZWdlcihyZXNvdXJjZXMubGVuZ3RoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbXNnID0gTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fY29uZmlybU4sIG5ldyBJbnRlZ2VyKHJlc291cmNlcy5sZW5ndGgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oc2hlbGwsIHRpdGxlLCBtc2cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFza3MgdGhlIHVzZXIgdG8gY29uZmlybSBhIGRlbGV0ZSBvcGVyYXRpb24sCi0gICAgICogd2hlcmUgdGhlIHNlbGVjdGlvbiBjb250YWlucyBvbmx5IHByb2plY3RzLgotICAgICAqIEFsc28gcmVtZW1iZXJzIHdoZXRoZXIgcHJvamVjdCBjb250ZW50IHNob3VsZCBiZSBkZWxldGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlcyB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBzYXlzIHRvIGdvIGFoZWFkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogIGlmIHRoZSBkZWxldGlvbiBzaG91bGQgYmUgYWJhbmRvbmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbmZpcm1EZWxldGVQcm9qZWN0cyhJUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKLSAgICAgICAgRGVsZXRlUHJvamVjdERpYWxvZyBkaWFsb2cgPSBuZXcgRGVsZXRlUHJvamVjdERpYWxvZyhzaGVsbCwgcmVzb3VyY2VzKTsKLSAgICAgICAgZGlhbG9nLnNldFRlc3RpbmdNb2RlKGZUZXN0aW5nTW9kZSk7Ci0gICAgICAgIGludCBjb2RlID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgZGVsZXRlQ29udGVudCA9IGRpYWxvZy5nZXREZWxldGVDb250ZW50KCk7Ci0gICAgICAgIHJldHVybiBjb2RlID09IDA7IC8vIFlFUwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgdGhlIGdpdmVuIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGVsZXRlKElSZXNvdXJjZVtdIHJlc291cmNlc1RvRGVsZXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uewotICAgICAgICBmaW5hbCBMaXN0IGV4Y2VwdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvcmNlT3V0T2ZTeW5jRGVsZXRlID0gZmFsc2U7Ci0gICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCByZXNvdXJjZXNUb0RlbGV0ZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRyeSB7Ci0JICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlc1RvRGVsZXRlLmxlbmd0aDsgKytpKSB7Ci0JICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB0cnkgewotCSAgICAgICAgICAgICAgICBkZWxldGUocmVzb3VyY2VzVG9EZWxldGVbaV0sIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spKTsKLQkgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgICAgICAgICAgZXhjZXB0aW9ucy5hZGQoZSk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgSVN0YXR1cyByZXN1bHQgPSBjcmVhdGVSZXN1bHQoZXhjZXB0aW9ucyk7Ci0JCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24ocmVzdWx0KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgCW1vbml0b3IuZG9uZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZShJUmVzb3VyY2UgcmVzb3VyY2VUb0RlbGV0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGZvcmNlID0gZmFsc2U7IC8vIGRvbid0IGZvcmNlIGRlbGV0aW9uIG9mIG91dC1vZi1zeW5jIHJlc291cmNlcwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHJlc291cmNlVG9EZWxldGUuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgaXQncyBhIHByb2plY3QsIGFzayB3aGV0aGVyIGNvbnRlbnQgc2hvdWxkIGJlIGRlbGV0ZWQgdG9vCi0gICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2VUb0RlbGV0ZTsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmRlbGV0ZShkZWxldGVDb250ZW50LCBmb3JjZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGlmIGl0J3Mgbm90IGEgcHJvamVjdCwganVzdCBkZWxldGUgaXQKLSAgICAgICAgICAgICAgICByZXNvdXJjZVRvRGVsZXRlLmRlbGV0ZShJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCBtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZVRvRGVsZXRlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotICAgICAgICAgICAgICAgIElTdGF0dXNbXSBjaGlsZHJlbiA9IGV4Y2VwdGlvbi5nZXRTdGF0dXMoKS5nZXRDaGlsZHJlbigpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAxCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBjaGlsZHJlblswXS5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLk9VVF9PRl9TWU5DX0xPQ0FMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZU91dE9mU3luY0RlbGV0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VUb0RlbGV0ZS5kZWxldGUoSVJlc291cmNlLktFRVBfSElTVE9SWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElSZXNvdXJjZS5GT1JDRSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gcXVlcnlEZWxldGVPdXRPZlN5bmMocmVzb3VyY2VUb0RlbGV0ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVRvRGVsZXRlLmRlbGV0ZShJUmVzb3VyY2UuS0VFUF9ISVNUT1JZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElSZXNvdXJjZS5GT1JDRSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU91dE9mU3luY0RlbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VUb0RlbGV0ZS5kZWxldGUoSVJlc291cmNlLktFRVBfSElTVE9SWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJUmVzb3VyY2UuRk9SQ0UsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIHJlc291cmNlcwotICAgICAqLwotICAgIHByaXZhdGUgSVJlc291cmNlW10gZ2V0U2VsZWN0ZWRSZXNvdXJjZXNBcnJheSgpIHsKLSAgICAgICAgTGlzdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3RlZFJlc291cmNlcygpOwotICAgICAgICBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW3NlbGVjdGlvbi5zaXplKCldOwotICAgICAgICBzZWxlY3Rpb24udG9BcnJheShyZXNvdXJjZXMpOwotICAgICAgICByZXR1cm4gcmVzb3VyY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBiaXQtbWFzayBjb250YWluaW5nIHRoZSB0eXBlcyBvZiByZXNvdXJjZXMgaW4gdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRTZWxlY3RlZFJlc291cmNlVHlwZXMoSVJlc291cmNlW10gcmVzb3VyY2VzKSB7Ci0gICAgICAgIGludCB0eXBlcyA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0eXBlcyB8PSByZXNvdXJjZXNbaV0uZ2V0VHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0eXBlczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlc0FycmF5KCk7Ci0gICAgICAgIC8vIFdBUk5JTkc6IGRvIG5vdCBxdWVyeSB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzIG1vcmUgdGhhbiBvbmNlCi0gICAgICAgIC8vIHNpbmNlIHRoZSBzZWxlY3Rpb24gbWF5IGNoYW5nZSBkdXJpbmcgdGhlIHJ1biwgCi0gICAgICAgIC8vIGUuZy4gZHVlIHRvIHdpbmRvdyBhY3RpdmF0aW9uIHdoZW4gdGhlIHByb21wdCBkaWFsb2cgaXMgZGlzbWlzc2VkLgotICAgICAgICAvLyBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgQnVnIDYwNjA2IFtOYXZpZ2F0b3JdIChkYXRhIGxvc3MpIE5hdmlnYXRvciBkZWxldGVzL21vdmVzIHRoZSB3cm9uZyBmaWxlCi0gICAgICAgIGlmICghY29uZmlybURlbGV0ZShyZXNvdXJjZXMpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBmaW5hbCBJUmVzb3VyY2VbXSByZXNvdXJjZXNUb0RlbGV0ZSA9IGdldFJlc291cmNlc1RvRGVsZXRlKHJlc291cmNlcyk7Ci0KLSAgICAgICAgaWYgKHJlc291cmNlc1RvRGVsZXRlLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCQkvL3VzZSBhIG5vbi13b3Jrc3BhY2Ugam9iIHdpdGggYSBydW5uYWJsZSBpbnNpZGUgc28gd2UgY2FuIGF2b2lkIHBlcmlvZGljIHVwZGF0ZXMKLSAgICAJSm9iIGRlbGV0ZUpvYiA9IG5ldyBKb2IoSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fam9iTmFtZSkgewotICAgIAkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXRyeSB7Ci0JCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJICAgICAgICBkZWxldGUocmVzb3VyY2VzVG9EZWxldGUsIG1vbml0b3IpOwotCQkJCQkJfQotCQkJCQl9LAludWxsLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBlLmdldFN0YXR1cygpOwotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAJCX0KLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjYmVsb25nc1RvKGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJaWYgKElERVdvcmtiZW5jaE1lc3NhZ2VzLkRlbGV0ZVJlc291cmNlQWN0aW9uX2pvYk5hbWUKLQkJCQkJCS5lcXVhbHMoZmFtaWx5KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmJlbG9uZ3NUbyhmYW1pbHkpOwotCQkJfQotICAgIAkJCi0gICAgCX07Ci0gICAgCWRlbGV0ZUpvYi5zZXRSdWxlKGdldERlbGV0ZVJ1bGUocmVzb3VyY2VzVG9EZWxldGUpKTsKLSAgICAJZGVsZXRlSm9iLnNldFVzZXIodHJ1ZSk7Ci0gICAgCWRlbGV0ZUpvYi5zY2hlZHVsZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBzY2hlZHVsaW5nIHJ1bGUgdGhhdCBlbmNvbXBhc3NlcyB0aGUgZGVsZXRpb24gb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlcwotICAgICAqLwotICAgIHByaXZhdGUgSVNjaGVkdWxpbmdSdWxlIGdldERlbGV0ZVJ1bGUoSVJlc291cmNlW10gcmVzb3VyY2VzVG9EZWxldGUpIHsKLSAgICAgICAgSVJlc291cmNlUnVsZUZhY3RvcnkgcnVsZUZhY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKTsKLSAgICAgICAgSVNjaGVkdWxpbmdSdWxlIGNvbWJpbmVkUnVsZSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzVG9EZWxldGUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1RvRGVsZXRlW2ldOwotICAgICAgICAgICAgSVNjaGVkdWxpbmdSdWxlIGRlbGV0ZVJ1bGUgPSBydWxlRmFjdG9yeS5kZWxldGVSdWxlKHJlc291cmNlKTsKLSAgICAgICAgICAgIGlmIChjb21iaW5lZFJ1bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbWJpbmVkUnVsZSA9IGRlbGV0ZVJ1bGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbWJpbmVkUnVsZSA9IE11bHRpUnVsZS5jb21iaW5lKGNvbWJpbmVkUnVsZSwgZGVsZXRlUnVsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbWJpbmVkUnVsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZXMgdG8gZGVsZXRlIGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24gYW5kIHRoZWlyIHJlYWQtb25seSBzdGF0dXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlcyB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzCi0gICAgICogQHJldHVybiB0aGUgcmVzb3VyY2VzIHRvIGRlbGV0ZQotICAgICAqLwotICAgIHByaXZhdGUgSVJlc291cmNlW10gZ2V0UmVzb3VyY2VzVG9EZWxldGUoSVJlc291cmNlW10gcmVzb3VyY2VzKSB7Ci0KLSAgICAgICAgaWYgKGNvbnRhaW5zT25seVByb2plY3RzKHJlc291cmNlcykgJiYgIWRlbGV0ZUNvbnRlbnQpIHsKLSAgICAgICAgICAgIC8vIFdlIGNhbiBqdXN0IHJldHVybiB0aGUgc2VsZWN0aW9uCi0gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVhZE9ubHlTdGF0ZUNoZWNrZXIgY2hlY2tlciA9IG5ldyBSZWFkT25seVN0YXRlQ2hlY2tlcih0aGlzLnNoZWxsLAotICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLkRlbGV0ZVJlc291cmNlQWN0aW9uX3RpdGxlMSwKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5EZWxldGVSZXNvdXJjZUFjdGlvbl9yZWFkT25seVF1ZXN0aW9uKTsKLSAgICAgICAgY2hlY2tlci5zZXRJZ25vcmVMaW5rZWRSZXNvdXJjZXModHJ1ZSk7Ci0gICAgICAgIHJldHVybiBjaGVja2VyLmNoZWNrUmVhZE9ubHlSZXNvdXJjZXMocmVzb3VyY2VzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+RGVsZXRlUmVzb3VyY2VBY3Rpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjwvY29kZT4gbWV0aG9kIGRpc2FibGVzIHRoZSBhY3Rpb24KLSAgICAgKiBpZiB0aGUgc2VsZWN0aW9uIGNvbnRhaW5zIHBoYW50b20gcmVzb3VyY2VzIG9yIG5vbi1yZXNvdXJjZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKQotICAgICAgICAgICAgICAgICYmIGNhbkRlbGV0ZShnZXRTZWxlY3RlZFJlc291cmNlc0FycmF5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzayB0aGUgdXNlciB3aGV0aGVyIHRoZSBnaXZlbiByZXNvdXJjZSBzaG91bGQgYmUgZGVsZXRlZAotICAgICAqIGRlc3BpdGUgYmVpbmcgb3V0IG9mIHN5bmMgd2l0aCB0aGUgZmlsZSBzeXN0ZW0uCi0gICAgICogQHBhcmFtIHJlc291cmNlIHRoZSBvdXQgb2Ygc3luYyByZXNvdXJjZQotICAgICAqIEByZXR1cm4gT25lIG9mIHRoZSBJRGlhbG9nQ29uc3RhbnRzIGNvbnN0YW50cyBpbmRpY2F0aW5nIHdoaWNoCi0gICAgICogCW9mIHRoZSBZZXMsIFllcyB0byBBbGwsIE5vLCBDYW5jZWwgb3B0aW9ucyBoYXMgYmVlbiBzZWxlY3RlZCBieSAKLSAgICAgKiAJdGhlIHVzZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgcXVlcnlEZWxldGVPdXRPZlN5bmMoSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIGZpbmFsIE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coCi0gICAgICAgICAgICAgICAgc2hlbGwsCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fbWVzc2FnZVRpdGxlLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlUmVzb3VyY2VBY3Rpb25fb3V0T2ZTeW5jUXVlc3Rpb24sIHJlc291cmNlLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOwotICAgICAgICBzaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLmdldFJldHVybkNvZGUoKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIElEaWFsb2dDb25zdGFudHMuWUVTX0lEOwotICAgICAgICBpZiAocmVzdWx0ID09IDEpCi0gICAgICAgICAgICByZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lEOwotICAgICAgICBpZiAocmVzdWx0ID09IDIpCi0gICAgICAgICAgICByZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5OT19JRDsKLSAgICAgICAgcmV0dXJuIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9HbG9iYWxCdWlsZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0dsb2JhbEJ1aWxkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MDM3MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL0dsb2JhbEJ1aWxkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuYWN0aW9ucy5CdWlsZFV0aWxpdGllczsKLQotLyoqCi0gKiBTdGFuZGFyZCBhY3Rpb24gZm9yIGZ1bGwgYW5kIGluY3JlbWVudGFsIGJ1aWxkcyBvZiBhbGwgcHJvamVjdHMgd2l0aGluIHRoZQotICogd29ya3NwYWNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgR2xvYmFsQnVpbGRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cwotICAgICAgICBBY3Rpb25GYWN0b3J5LklXb3JrYmVuY2hBY3Rpb24gewotICAgIC8qKgotICAgICAqIFRoZSB0eXBlIG9mIGJ1aWxkIHBlcmZvcm1lZCBieSB0aGlzIGFjdGlvbi4gQ2FuIGJlIGVpdGhlcgotICAgICAqIDxjb2RlPkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQ8L2NvZGU+IG9yCi0gICAgICogPGNvZGU+SW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxEPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBidWlsZFR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd29ya2JlbmNoIHdpbmRvdzsgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBhY3Rpb24gaGFzIGJlZW4KLSAgICAgKiA8Y29kZT5kaXNwb3NlPC9jb2RlPmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdzsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLiBUaGUgYWN0aW9uIGlkIGlzCi0gICAgICogPGNvZGU+SVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5CVUlMRDwvY29kZT4gZm9yIGluY3JlbWVudGFsIGJ1aWxkcyBhbmQKLSAgICAgKiA8Y29kZT5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlJFQlVJTERfQUxMPC9jb2RlPiBmb3IgZnVsbCBidWlsZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHdvcmtiZW5jaAotICAgICAqICAgICAgICAgICAgdGhlIGFjdGl2ZSB3b3JrYmVuY2gKLSAgICAgKiBAcGFyYW0gc2hlbGwKLSAgICAgKiAgICAgICAgICAgIHRoZSBzaGVsbCBmb3IgYW55IGRpYWxvZ3MKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgYnVpbGQ7IG9uZSBvZgotICAgICAqICAgICAgICAgICAgPGNvZGU+SW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRDwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgR2xvYmFsQnVpbGRBY3Rpb24oSVdvcmtiZW5jaFdpbmRvdywgdHlwZSkgaW5zdGVhZAotICAgICAqLwotICAgIHB1YmxpYyBHbG9iYWxCdWlsZEFjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU2hlbGwgc2hlbGwsIGludCB0eXBlKSB7Ci0gICAgICAgIC8vIGFsd2F5cyB1c2UgYWN0aXZlIHdpbmRvdzsgaWdub3JlIHNoZWxsCi0gICAgICAgIHRoaXMod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLCB0eXBlKTsKLSAgICAgICAgaWYgKHNoZWxsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLiBUaGUgYWN0aW9uIGlkIGlzCi0gICAgICogPGNvZGU+SVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5CVUlMRDwvY29kZT4gZm9yIGluY3JlbWVudGFsIGJ1aWxkcyBhbmQKLSAgICAgKiA8Y29kZT5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlJFQlVJTERfQUxMPC9jb2RlPiBmb3IgZnVsbCBidWlsZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHdpbmRvdwotICAgICAqICAgICAgICAgICAgdGhlIHdpbmRvdyBpbiB3aGljaCB0aGlzIGFjdGlvbiBhcHBlYXJzCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGJ1aWxkOyBvbmUgb2YKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQ8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICA8Y29kZT5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQ8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIEdsb2JhbEJ1aWxkQWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93LCBpbnQgdHlwZSkgewotICAgICAgICBpZiAod2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLndvcmtiZW5jaFdpbmRvdyA9IHdpbmRvdzsKLSAgICAgICAgc2V0QnVpbGRUeXBlKHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJ1aWxkIHR5cGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGJ1aWxkOyBvbmUgb2YKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQ8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICA8Y29kZT5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQ8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEJ1aWxkVHlwZShpbnQgdHlwZSkgewotICAgICAgICAvLyBhbGxvdyBBVVRPX0JVSUxEIGFzIHdlbGwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgdHJlYXQgaXQKLSAgICAgICAgLy8gdGhlIHNhbWUgYXMgSU5DUkVNRU5UQUxfQlVJTEQKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRDoKLSAgICAgICAgY2FzZSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkFVVE9fQlVJTEQ6Ci0gICAgICAgICAgICBzZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLkdsb2JhbEJ1aWxkQWN0aW9uX3RleHQpOwotICAgICAgICAgICAgc2V0VG9vbFRpcFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuR2xvYmFsQnVpbGRBY3Rpb25fdG9vbFRpcCk7Ci0gICAgICAgICAgICBzZXRJZCgiYnVpbGQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgd29ya2JlbmNoV2luZG93LmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5HTE9CQUxfSU5DUkVNRU5UQUxfQlVJTERfQUNUSU9OKTsKLSAgICAgICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcwotICAgICAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19FVE9PTF9CVUlMRF9FWEVDKSk7Ci0gICAgICAgICAgICBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcwotICAgICAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19FVE9PTF9CVUlMRF9FWEVDX0RJU0FCTEVEKSk7Ci0gICAgICAgICAgICBzZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLnVpLnByb2plY3QuYnVpbGRBbGwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxEOgotICAgICAgICAgICAgc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5HbG9iYWxCdWlsZEFjdGlvbl9yZWJ1aWxkVGV4dCk7Ci0gICAgICAgICAgICBzZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5HbG9iYWxCdWlsZEFjdGlvbl9yZWJ1aWxkVG9vbFRpcCk7Ci0gICAgICAgICAgICBzZXRJZCgicmVidWlsZEFsbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB3b3JrYmVuY2hXaW5kb3cuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLSAgICAgICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLkdMT0JBTF9GVUxMX0JVSUxEX0FDVElPTik7Ci0gICAgICAgICAgICBzZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLnVpLnByb2plY3QucmVidWlsZEFsbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYnVpbGQgdHlwZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgdGhpcy5idWlsZFR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoZWxsIHRvIHVzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb3BlcmF0aW9uIG5hbWUgdG8gdXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0T3BlcmF0aW9uTWVzc2FnZSgpIHsKLSAgICAgICAgaWYgKGJ1aWxkVHlwZSA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxEKQotICAgICAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLkdsb2JhbEJ1aWxkQWN0aW9uX2J1aWxkT3BlcmF0aW9uVGl0bGU7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5HbG9iYWxCdWlsZEFjdGlvbl9yZWJ1aWxkQWxsT3BlcmF0aW9uVGl0bGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFsbCBwcm9qZWN0cyB3aXRoaW4gdGhlIHdvcmtzcGFjZS4gRG9lcyBub3Qgc2F2ZSBhbnkgb3BlbiBlZGl0b3JzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvQnVpbGQoKSB7Ci0gICAgICAgIGRvQnVpbGRPcGVyYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIGEgYnVpbGQgb24gYWxsIHByb2plY3RzIHdpdGhpbiB0aGUgd29ya3NwYWNlLiBSZXBvcnRzIGFueSBlcnJvcnMKLSAgICAgKiB3aXRoIHRoZSBidWlsZCB0byB0aGUgdXNlci4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovdm9pZCBkb0J1aWxkT3BlcmF0aW9uKCkgewotICAgICAgICBKb2IgYnVpbGRKb2IgPSBuZXcgSm9iKElERVdvcmtiZW5jaE1lc3NhZ2VzLkdsb2JhbEJ1aWxkQWN0aW9uX2pvYlRpdGxlKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVVJLlBMVUdJTl9JRCwgMCwgSURFV29ya2JlbmNoTWVzc2FnZXMuR2xvYmFsQnVpbGRBY3Rpb25fYnVpbGRQcm9ibGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKGdldE9wZXJhdGlvbk1lc3NhZ2UoKSwgMTAwKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYnVpbGQoYnVpbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI2JlbG9uZ3NUbyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotICAgICAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCA9PSBmYW1pbHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGJ1aWxkSm9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAuYnVpbGRSdWxlKCkpOwotICAgICAgICBidWlsZEpvYi5zZXRVc2VyKHRydWUpOwotICAgICAgICBidWlsZEpvYi5zY2hlZHVsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovSVByb2plY3RbXSBnZXRXb3Jrc3BhY2VQcm9qZWN0cygpIHsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0gICAgICogCi0gICAgICogQnVpbGRzIGFsbCBwcm9qZWN0cyB3aXRoaW4gdGhlIHdvcmtzcGFjZS4gU2F2ZXMgYWxsIGVkaXRvcnMgcHJpb3IgdG8KLSAgICAgKiBidWlsZCBkZXBlbmRpbmcgb24gdXNlcidzIHByZWZlcmVuY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBpZiAod29ya2JlbmNoV2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGFjdGlvbiBoYXMgYmVlbiBkaXNwb3NlZAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlcmUgYXJlIG5vIHByb2plY3RzLi4uCi0gICAgICAgIElQcm9qZWN0W10gcm9vdHMgPSBnZXRXb3Jrc3BhY2VQcm9qZWN0cygpOwotICAgICAgICBpZiAocm9vdHMubGVuZ3RoIDwgMSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlcmUgYXJlIGJ1aWxkZXJzIHJlZ2lzdGVyZWQgb24gYXQKLSAgICAgICAgLy8gbGVhc3Qgb25lIHByb2plY3QKLSAgICAgICAgaWYgKCF2ZXJpZnlCdWlsZGVyc0F2YWlsYWJsZShyb290cykpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmICghdmVyaWZ5Tm9NYW51YWxSdW5uaW5nKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC8vIFNhdmUgYWxsIHJlc291cmNlcyBwcmlvciB0byBkb2luZyBidWlsZAotICAgICAgICBCdWlsZFV0aWxpdGllcy5zYXZlRWRpdG9ycyhudWxsKTsKLSAgICAgICAgLy8gUGVyZm9ybSB0aGUgYnVpbGQgb24gYWxsIHRoZSBwcm9qZWN0cwotICAgICAgICBkb0J1aWxkT3BlcmF0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByb2plY3Qgd2l0aCBhIGJ1aWxkZXIgcmVnaXN0ZXJlZCBvbgotICAgICAqIGl0LgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi9ib29sZWFuIHZlcmlmeUJ1aWxkZXJzQXZhaWxhYmxlKElQcm9qZWN0W10gcm9vdHMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocm9vdHNbaV0uaXNBY2Nlc3NpYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgIGlmIChyb290c1tpXS5nZXREZXNjcmlwdGlvbigpLmdldEJ1aWxkU3BlYygpLmxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4ubG9nKGdldENsYXNzKCksICJ2ZXJpZnlCdWlsZGVyc0F2YWlsYWJsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBFcnJvckRpYWxvZwotICAgICAgICAgICAgICAgICAgICAub3BlbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuR2xvYmFsQnVpbGRBY3Rpb25fYnVpbGRQcm9ibGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5HbG9iYWxCdWlsZEFjdGlvbl9pbnRlcm5hbEVycm9yLCBlLmdldE1lc3NhZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gQWN0aW9uRmFjdG9yeS5JV29ya2JlbmNoQWN0aW9uLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAod29ya2JlbmNoV2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGFjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgd29ya2JlbmNoV2luZG93ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhhdCBubyBtYW51YWwgYnVpbGQgaXMgcnVubmluZy4gSWYgaXQgaXMgdGhlbiBnaXZlIHRoZSB1c2UgdGhlCi0gICAgICogb3B0aW9uIHRvIGNhbmNlbC4gSWYgdGhleSBjYW5jZWwsIGNhbmNlbCB0aGUgam9icyBhbmQgcmV0dXJuIHRydWUsCi0gICAgICogb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGEgbWFudWFsIGJ1aWxkIGpvYiBydW5uaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJpZnlOb01hbnVhbFJ1bm5pbmcoKSB7Ci0gICAgICAgIEpvYltdIGJ1aWxkSm9icyA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5maW5kKAotICAgICAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5GQU1JTFlfTUFOVUFMX0JVSUxEKTsKLSAgICAgICAgaWYgKGJ1aWxkSm9icy5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBib29sZWFuIGNhbmNlbCA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKHdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLkdsb2JhbEJ1aWxkQWN0aW9uX0J1aWxkUnVubmluZ1RpdGxlLAotICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLkdsb2JhbEJ1aWxkQWN0aW9uX0J1aWxkUnVubmluZ01lc3NhZ2UpOwotICAgICAgICBpZiAoY2FuY2VsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1aWxkSm9icy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEpvYiBqb2IgPSBidWlsZEpvYnNbaV07Ci0gICAgICAgICAgICAgICAgam9iLmNhbmNlbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vSWYgdGhleSBjYW5jZWxsZWQgZ2V0IHRoZW0gdG8gZG8gaXQgYWdhaW4uCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvTW92ZUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL01vdmVGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3Mjk1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvTW92ZUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci0KLS8qKgotICogTW92ZXMgZmlsZXMgYW5kIGZvbGRlcnMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE1vdmVGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24gZXh0ZW5kcyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uIHsKLQotICAgIC8qKiAKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG9wZXJhdGlvbiBpbml0aWFsaXplZCB3aXRoIGEgc2hlbGwuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNoZWxsIHBhcmVudCBzaGVsbCBmb3IgZXJyb3IgZGlhbG9ncwotICAgICAqLwotICAgIHB1YmxpYyBNb3ZlRmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHN1cGVyKHNoZWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gaXMgYWJsZSB0byBwZXJmb3JtIG9uLXRoZS1mbHkgCi0gICAgICogYXV0by1yZW5hbWluZyBvZiByZXNvdXJjZXMgd2l0aCBuYW1lIGNvbGxpc2lvbnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF1dG8tcmVuYW1lIGlzIHN1cHBvcnRlZCwgCi0gICAgICogCWFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuUGVyZm9ybUF1dG9SZW5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgcmVzb3VyY2VzIHRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvbi4gIFRoaXMgbWV0aG9kIGlzIAotICAgICAqIGNhbGxlZCByZWN1cnNpdmVseSB0byBtZXJnZSBmb2xkZXJzIGR1cmluZyBmb2xkZXIgbW92ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIHRoZSByZXNvdXJjZXMgdG8gbW92ZQotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBkZXN0aW5hdGlvbiB0byB3aGljaCByZXNvdXJjZXMgd2lsbCBiZSBtb3ZlZAotICAgICAqIEBwYXJhbSBzdWJNb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciBmb3Igc2hvd2luZyBwcm9ncmVzcyBhbmQgZm9yIGNhbmNlbGF0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weShJUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2Ugc291cmNlID0gcmVzb3VyY2VzW2ldOwotICAgICAgICAgICAgSVBhdGggZGVzdGluYXRpb25QYXRoID0gZGVzdGluYXRpb24uYXBwZW5kKHNvdXJjZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBzb3VyY2UuZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgICAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLSAgICAgICAgICAgIElSZXNvdXJjZSBleGlzdGluZyA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihkZXN0aW5hdGlvblBhdGgpOwotICAgICAgICAgICAgaWYgKHNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiAmJiBleGlzdGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlIHJlc291cmNlIGlzIGEgZm9sZGVyIGFuZCBpdCBleGlzdHMgaW4gdGhlIGRlc3RpbmF0aW9uLCBtb3ZlIHRoZQotICAgICAgICAgICAgICAgIC8vIGNoaWxkcmVuIG9mIHRoZSBmb2xkZXIuCi0gICAgICAgICAgICAgICAgaWYgKGhvbW9nZW5vdXNSZXNvdXJjZXMoc291cmNlLCBleGlzdGluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlW10gY2hpbGRyZW4gPSAoKElDb250YWluZXIpIHNvdXJjZSkubWVtYmVycygpOwotICAgICAgICAgICAgICAgICAgICBjb3B5KGNoaWxkcmVuLCBkZXN0aW5hdGlvblBhdGgsIHN1Yk1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUoc291cmNlLCBzdWJNb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlciwgbW92aW5nIGEgbGlua2VkIGZvbGRlcgotICAgICAgICAgICAgICAgICAgICAvLyBvdmVyIGFuIHVubGlua2VkIG9uZSBvciB2aWNlIHZlcnNhLiBGaXhlcyBidWcgMjg3NzIuIAotICAgICAgICAgICAgICAgICAgICBkZWxldGUoZXhpc3RpbmcsIG5ldyBTdWJQcm9ncmVzc01vbml0b3Ioc3ViTW9uaXRvciwgMCkpOwotICAgICAgICAgICAgICAgICAgICBzb3VyY2UubW92ZShkZXN0aW5hdGlvblBhdGgsIElSZXNvdXJjZS5TSEFMTE9XCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vbml0b3IsIDApKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG1lcmdpbmcgZm9sZGVycywgd2UgY291bGQgYmUgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZmlsZQkJCQkKLSAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaG9tb2dlbm91c1Jlc291cmNlcyhzb3VyY2UsIGV4aXN0aW5nKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVFeGlzdGluZyhzb3VyY2UsIGV4aXN0aW5nLCBzdWJNb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZpbmcgYSBsaW5rZWQgcmVzb3VyY2Ugb3ZlciB1bmxpbmtlZCBvciB2aWNlIHZlcnNhLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgdXNlIHNldENvbnRlbnRzIGhlcmUuIEZpeGVzIGJ1ZyAyODc3Mi4KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZShleGlzdGluZywgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihzdWJNb25pdG9yLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubW92ZShkZXN0aW5hdGlvblBhdGgsIElSZXNvdXJjZS5TSEFMTE9XCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihzdWJNb25pdG9yLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzb3VyY2UubW92ZShkZXN0aW5hdGlvblBhdGgsIElSZXNvdXJjZS5TSEFMTE9XCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vbml0b3IsIDApKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3ViTW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN1Yk1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIHF1ZXJ5aW5nIGRlZXAgY29weS9tb3ZlIG9mIGEgbGlua2VkIAotICAgICAqIHJlc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZSByZXNvdXJjZSB0aGUgcXVlcnkgaXMgbWFkZSBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWVwIHF1ZXJ5IG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZXBDaGVja1F1ZXN0aW9uKElSZXNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgcmV0dXJuIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fZGVlcE1vdmVRdWVzdGlvbiwgc291cmNlLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRhc2sgdGl0bGUgZm9yIHRoaXMgb3BlcmF0aW9uJ3MgcHJvZ3Jlc3MgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdGFzayB0aXRsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3BlcmF0aW9uVGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5Nb3ZlRmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX29wZXJhdGlvblRpdGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIHRoaXMgb3BlcmF0aW9uJ3MgcHJvYmxlbXMgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJvYmxlbXMgbWVzc2FnZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvYmxlbXNNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoTWVzc2FnZXMuTW92ZUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9wcm9ibGVtTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aXRsZSBmb3IgdGhpcyBvcGVyYXRpb24ncyBwcm9ibGVtcyBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9ibGVtcyBkaWFsb2cgdGl0bGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2JsZW1zVGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5Nb3ZlRmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX21vdmVGYWlsZWRUaXRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNvdXJjZSBmaWxlIGluIGEgZGVzdGluYXRpb24gY29sbGlzaW9uCi0gICAgICogd2lsbCBiZSB2YWxpZGF0ZUVkaXRlZCB0b2dldGhlciB3aXRoIHRoZSBjb2xsaXNpb24gaXRzZWxmLgotICAgICAqIFJldHVybnMgdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBzb3VyY2UgZmlsZSBpbiBhICAKLSAgICAgKiAJZGVzdGluYXRpb24gY29sbGlzaW9uIHNob3VsZCBiZSB2YWxpZGF0ZUVkaXRlZC4gIAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdldFZhbGlkYXRlQ29uZmxpY3RTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGV4aXN0aW5nIGZpbGUgdG8gdGhlIHNvdXJjZSBmaWxlIGNvbnRlbnQuCi0gICAgICogRGVsZXRlcyB0aGUgc291cmNlIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSBzb3VyY2UgZmlsZSB0byBtb3ZlCi0gICAgICogQHBhcmFtIGV4aXN0aW5nIGV4aXN0aW5nIGZpbGUgdG8gc2V0IHRoZSBzb3VyY2UgY29udGVudCBpbgotICAgICAqIEBwYXJhbSBzdWJNb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciBmb3Igc2hvd2luZyBwcm9ncmVzcyBhbmQgZm9yIGNhbmNlbGF0aW9uCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHNldENvbnRlbnRzIGZhaWxlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtb3ZlRXhpc3RpbmcoSVJlc291cmNlIHNvdXJjZSwgSVJlc291cmNlIGV4aXN0aW5nLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElGaWxlIGV4aXN0aW5nRmlsZSA9IGdldEZpbGUoZXhpc3RpbmcpOwotCi0gICAgICAgIGlmIChleGlzdGluZ0ZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgSUZpbGUgc291cmNlRmlsZSA9IGdldEZpbGUoc291cmNlKTsKLQotICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGV4aXN0aW5nRmlsZS5zZXRDb250ZW50cyhzb3VyY2VGaWxlLmdldENvbnRlbnRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJNb25pdG9yLCAwKSk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlKHNvdXJjZUZpbGUsIHN1Yk1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE92ZXJyaWRlcyBtZXRob2QgaW4gQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbgotICAgICAqCi0gICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEl0IGlzIG5vdCBBUEkuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlRGVzdGluYXRpb24oSUNvbnRhaW5lciBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgIElSZXNvdXJjZVtdIHNvdXJjZVJlc291cmNlcykgewotICAgICAgICBJUGF0aCBkZXN0aW5hdGlvbkxvY2F0aW9uID0gZGVzdGluYXRpb24uZ2V0TG9jYXRpb24oKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVJlc291cmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSVJlc291cmNlIHNvdXJjZVJlc291cmNlID0gc291cmNlUmVzb3VyY2VzW2ldOwotCi0gICAgICAgICAgICAvLyBpcyB0aGUgc291cmNlIGJlaW5nIGNvcGllZCBvbnRvIGl0c2VsZj8KLSAgICAgICAgICAgIGlmIChzb3VyY2VSZXNvdXJjZS5nZXRQYXJlbnQoKS5lcXVhbHMoZGVzdGluYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLk1vdmVGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fc2FtZVNvdXJjZUFuZERlc3QsIHNvdXJjZVJlc291cmNlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB0ZXN0IGlmIGxpbmtlZCBzb3VyY2UgaXMgY29waWVkIG9udG8gaXRzZWxmLiBGaXhlcyBidWcgMjk5MTMuCi0gICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Mb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVBhdGggc291cmNlTG9jYXRpb24gPSBzb3VyY2VSZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIElQYXRoIGRlc3RpbmF0aW9uUmVzb3VyY2UgPSBkZXN0aW5hdGlvbkxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHNvdXJjZVJlc291cmNlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUxvY2F0aW9uICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHNvdXJjZUxvY2F0aW9uLmlzUHJlZml4T2YoZGVzdGluYXRpb25SZXNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLk1vdmVGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fc2FtZVNvdXJjZUFuZERlc3QsIHNvdXJjZVJlc291cmNlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci52YWxpZGF0ZURlc3RpbmF0aW9uKGRlc3RpbmF0aW9uLCBzb3VyY2VSZXNvdXJjZXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9Nb3ZlUHJvamVjdEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL01vdmVQcm9qZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWRjNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL01vdmVQcm9qZWN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb2plY3RMb2NhdGlvbk1vdmVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcm9ncmVzcy5Qcm9ncmVzc01vbml0b3JKb2JzRGlhbG9nOwotCi0vKioKLSAqIFRoZSBNb3ZlUHJvamVjdEFjdGlvbiBpcyB0aGUgYWN0aW9uIGRlc2lnbmVkIHRvIG1vdmUgcHJvamVjdHMgc3BlY2lmaWNhbGx5IGFzCi0gKiB0aGV5IGhhdmUgZGlmZmVyZW50IHNlbWFudGljcyBmcm9tIG90aGVyIHJlc291cmNlcy4KLSAqLwotcHVibGljIGNsYXNzIE1vdmVQcm9qZWN0QWN0aW9uIGV4dGVuZHMgQ29weVByb2plY3RBY3Rpb24gewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNT1ZFX1RPT0xfVElQID0gSURFV29ya2JlbmNoTWVzc2FnZXMuTW92ZVByb2plY3RBY3Rpb25fdG9vbFRpcDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNT1ZFX1RJVExFID0gSURFV29ya2JlbmNoTWVzc2FnZXMuTW92ZVByb2plY3RBY3Rpb25fdGV4dDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQUk9CTEVNU19USVRMRSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLk1vdmVQcm9qZWN0QWN0aW9uX2RpYWxvZ1RpdGxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1PVkVfUFJPR1JFU1NfVElUTEUgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5Nb3ZlUHJvamVjdEFjdGlvbl9wcm9ncmVzc01lc3NhZ2U7Ci0KLQkvKioKLQkgKiBUaGUgaWQgb2YgdGhpcyBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBQbGF0Zm9ybVVJLlBMVUdJTl9JRCArICIuTW92ZVByb2plY3RBY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdCBtb3ZlIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqICAgICAgICAgICAgdGhlIHNoZWxsIGZvciBhbnkgZGlhbG9ncwotCSAqLwotCXB1YmxpYyBNb3ZlUHJvamVjdEFjdGlvbihTaGVsbCBzaGVsbCkgewotCQlzdXBlcihzaGVsbCwgTU9WRV9USVRMRSk7Ci0JCXNldFRvb2xUaXBUZXh0KE1PVkVfVE9PTF9USVApOwotCQlzZXRJZChNb3ZlUHJvamVjdEFjdGlvbi5JRCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlJSURFSGVscENvbnRleHRJZHMuTU9WRV9QUk9KRUNUX0FDVElPTik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0aXRsZSBvZiB0aGUgZXJyb3JzIGRpYWxvZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yc1RpdGxlKCkgewotCQlyZXR1cm4gUFJPQkxFTVNfVElUTEU7Ci0JfQotCi0JLyoqCi0JICogTW92ZXMgdGhlIHByb2plY3QgdG8gdGhlIG5ldyB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRvIGNvcHkKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb3B5Ci0JICogQHBhcmFtIG5ld0xvY2F0aW9uCi0JICogICAgICAgICAgICBJUGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvcHkgb3BlcmF0aW9uIGNvbXBsZXRlZCwgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd2FzIGFiYW5kb25lZCBwYXJ0IHdheQotCSAqLwotCWJvb2xlYW4gcGVyZm9ybU1vdmUoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lLAotCQkJZmluYWwgSVBhdGggbmV3TG9jYXRpb24pIHsKLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJCQotCQkJCQltb25pdG9yLnNldFRhc2tOYW1lKE1PVkVfUFJPR1JFU1NfVElUTEUpOwotCQkJCQkvL0dldCBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgZGVzY3JpcHRpb24gYW5kIG1vZGlmeSBpdAotCQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIG5ld0Rlc2NyaXB0aW9uID0gY3JlYXRlRGVzY3JpcHRpb24oCi0JCQkJCQkJcHJvamVjdCwgcHJvamVjdE5hbWUsIG5ld0xvY2F0aW9uKTsKLQotCQkJCQlwcm9qZWN0Lm1vdmUobmV3RGVzY3JpcHRpb24sIElSZXNvdXJjZS5GT1JDRQotCQkJCQkJCXwgSVJlc291cmNlLlNIQUxMT1csIG1vbml0b3IpOwotCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJlY29yZEVycm9yKGUpOyAvLyBsb2cgZXJyb3IKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCW5ldyBQcm9ncmVzc01vbml0b3JKb2JzRGlhbG9nKHNoZWxsKS5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJLy8gQ29yZUV4Y2VwdGlvbnMgYXJlIGNvbGxlY3RlZCBhYm92ZSwgYnV0IHVuZXhwZWN0ZWQgcnVudGltZQotCQkJLy8gZXhjZXB0aW9ucyBhbmQgZXJyb3JzIG1heSBzdGlsbCBvY2N1ci4KLQkJCUlERVdvcmtiZW5jaFBsdWdpbi5sb2coZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgInBlcmZvcm1Nb3ZlKCkiLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJZGlzcGxheUVycm9yKE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLk1vdmVQcm9qZWN0QWN0aW9uX2ludGVybmFsRXJyb3IsIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBRdWVyeSBmb3IgYSBuZXcgcHJvamVjdCBkZXN0aW5hdGlvbiB1c2luZyB0aGUgcGFyYW1ldGVycyBpbiB0aGUgZXhpc3RpbmcKLQkgKiBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0W10gb3IgbnVsbCBpZiB0aGUgc2VsZWN0aW9uIGlzIGNhbmNlbGxlZAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB3ZSBhcmUgZ29pbmcgdG8gbW92ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gcXVlcnlEZXN0aW5hdGlvblBhcmFtZXRlcnMoSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9qZWN0TG9jYXRpb25Nb3ZlRGlhbG9nIGRpYWxvZyA9IG5ldyBQcm9qZWN0TG9jYXRpb25Nb3ZlRGlhbG9nKHNoZWxsLAotCQkJCXByb2plY3QpOwotCQlkaWFsb2cuc2V0VGl0bGUoSURFV29ya2JlbmNoTWVzc2FnZXMuTW92ZVByb2plY3RBY3Rpb25fbW92ZVRpdGxlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuIGRpYWxvZy5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLQkJZXJyb3JTdGF0dXMgPSBudWxsOwotCi0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGdldFNlbGVjdGVkUmVzb3VyY2VzKCkuZ2V0KDApOwotCi0JCS8vR2V0IHRoZSBwcm9qZWN0IG5hbWUgYW5kIGxvY2F0aW9uIGluIGEgdHdvIGVsZW1lbnQgbGlzdAotCQlPYmplY3RbXSBkZXN0aW5hdGlvblBhdGhzID0gcXVlcnlEZXN0aW5hdGlvblBhcmFtZXRlcnMocHJvamVjdCk7Ci0JCWlmIChkZXN0aW5hdGlvblBhdGhzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgZGVzdGluYXRpb25QYXRoc1swXTsKLQkJSVBhdGggbmV3TG9jYXRpb24gPSBuZXcgUGF0aCgoU3RyaW5nKSBkZXN0aW5hdGlvblBhdGhzWzFdKTsKLQotCQlib29sZWFuIGNvbXBsZXRlZCA9IHBlcmZvcm1Nb3ZlKHByb2plY3QsIHByb2plY3ROYW1lLCBuZXdMb2NhdGlvbik7Ci0KLQkJaWYgKCFjb21wbGV0ZWQpIC8vIGllLi0gY2FuY2VsZWQKLQkJCXJldHVybjsgLy8gbm90IGFwcHJvcHJpYXRlIHRvIHNob3cgZXJyb3JzCi0KLQkJLy8gSWYgZXJyb3JzIG9jY3VycmVkLCBvcGVuIGFuIEVycm9yIGRpYWxvZwotCQlpZiAoZXJyb3JTdGF0dXMgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cKLQkJCQkJLm9wZW5FcnJvcih0aGlzLnNoZWxsLCBQUk9CTEVNU19USVRMRSwgbnVsbCwgZXJyb3JTdGF0dXMpOwotCQkJZXJyb3JTdGF0dXMgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL01vdmVSZXNvdXJjZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL01vdmVSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDNkYWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9Nb3ZlUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci0KLS8qKgotICogU3RhbmRhcmQgYWN0aW9uIGZvciBtb3ZpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZXNvdXJjZXMgZWxzZXdoZXJlCi0gKiBpbiB0aGUgd29ya3NwYWNlLiBBbGwgcmVzb3VyY2VzIGJlaW5nIG1vdmVkIGFzIGEgZ3JvdXAgbXVzdCBiZSBzaWJsaW5ncy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1vdmVSZXNvdXJjZUFjdGlvbiBleHRlbmRzIENvcHlSZXNvdXJjZUFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaWQgb2YgdGhpcyBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBQbGF0Zm9ybVVJLlBMVUdJTl9JRAotICAgICAgICAgICAgKyAiLk1vdmVSZXNvdXJjZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEtlZXAgYSBsaXN0IG9mIGRlc3RpbmF0aW9ucyBzbyB0aGF0IGFueSByZXF1aXJlZCB1cGRhdGUgY2FuIGJlIGRvbmUgYWZ0ZXIgdGhlCi0gICAgICogbW92ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBkZXN0aW5hdGlvbnM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgZm9yIGFueSBkaWFsb2dzCi0gICAgICovCi0gICAgcHVibGljIE1vdmVSZXNvdXJjZUFjdGlvbihTaGVsbCBzaGVsbCkgewotICAgICAgICBzdXBlcihzaGVsbCwgSURFV29ya2JlbmNoTWVzc2FnZXMuTW92ZVJlc291cmNlQWN0aW9uX3RleHQpOwotICAgICAgICBzZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5Nb3ZlUmVzb3VyY2VBY3Rpb25fdG9vbFRpcCk7Ci0gICAgICAgIHNldElkKE1vdmVSZXNvdXJjZUFjdGlvbi5JRCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlJSURFSGVscENvbnRleHRJZHMuTU9WRV9SRVNPVVJDRV9BQ1RJT04pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBPdmVycmlkZXMgbWV0aG9kIGluIENvcHlSZXNvdXJjZUFjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNb3ZlRmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uKGdldFNoZWxsKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlc3RpbmF0aW9uIHJlc291cmNlcyBmb3IgdGhlIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBtb3ZlZCBzbyBmYXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgZGVzdGluYXRpb24gPGNvZGU+SVJlc291cmNlPC9jb2RlPnMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXREZXN0aW5hdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBkZXN0aW5hdGlvbnM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE92ZXJyaWRlcyBtZXRob2QgaW4gQ29weVJlc291cmNlQWN0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElSZXNvdXJjZVtdIGdldFJlc291cmNlcyhMaXN0IHJlc291cmNlTGlzdCkgewotICAgICAgICBSZWFkT25seVN0YXRlQ2hlY2tlciBjaGVja2VyID0gbmV3IFJlYWRPbmx5U3RhdGVDaGVja2VyKGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuTW92ZVJlc291cmNlQWN0aW9uX3RpdGxlLAotICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLk1vdmVSZXNvdXJjZUFjdGlvbl9jaGVja01vdmVNZXNzYWdlKTsKLSAgICAgICAgcmV0dXJuIGNoZWNrZXIuY2hlY2tSZWFkT25seVJlc291cmNlcyhzdXBlci5nZXRSZXNvdXJjZXMocmVzb3VyY2VMaXN0KSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE92ZXJyaWRlcyBtZXRob2QgaW4gQ29weVJlc291cmNlQWN0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuT3BlcmF0aW9uKElSZXNvdXJjZVtdIHJlc291cmNlcywgSUNvbnRhaW5lciBkZXN0aW5hdGlvbikgewotICAgICAgICAvL0luaXRpYWxpemUgdGhlIGRlc3RpbmF0aW9ucwotICAgICAgICBkZXN0aW5hdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIElSZXNvdXJjZVtdIGNvcGllZFJlc291cmNlcyA9IG9wZXJhdGlvbi5jb3B5UmVzb3VyY2VzKHJlc291cmNlcywKLSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3BpZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGRlc3RpbmF0aW9ucy5hZGQoZGVzdGluYXRpb24uZ2V0RnVsbFBhdGgoKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIGNvcGllZFJlc291cmNlc1tpXS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9OZXdFeGFtcGxlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvTmV3RXhhbXBsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjAwMzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9OZXdFeGFtcGxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5OZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5XaXphcmRzUmVnaXN0cnlSZWFkZXI7Ci0KLS8qKgotICogU3RhbmRhcmQgYWN0aW9uIGZvciBsYXVuY2hpbmcgdGhlIGNyZWF0ZSBwcm9qZWN0IHNlbGVjdGlvbgotICogd2l6YXJkLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTmV3RXhhbXBsZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd2l6YXJkIGRpYWxvZyB3aWR0aAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX1dJRFRIID0gNTAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIHdpemFyZCBkaWFsb2cgaGVpZ2h0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfSEVJR0hUID0gNTAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIHdvcmtiZW5jaCB3aW5kb3cgdGhpcyBhY3Rpb24gd2lsbCBydW4gaW4KLSAgICAgKi8KLSAgICBwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0gICAgLyoqCi0gICAgICogVGhpcyBkZWZhdWx0IGNvbnN0cnVjdG9yIGFsbG93cyB0aGUgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWQgZnJvbSB0aGUgd2VsY29tZSBwYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBOZXdFeGFtcGxlQWN0aW9uKCkgewotICAgICAgICB0aGlzKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIGZvciBsYXVuY2hpbmcgdGhlIG5ldyBwcm9qZWN0Ci0gICAgICogc2VsZWN0aW9uIHdpemFyZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3aW5kb3cgdGhlIHdvcmtiZW5jaCB3aW5kb3cgdG8gcXVlcnkgdGhlIGN1cnJlbnQKLSAgICAgKiAJCXNlbGVjdGlvbiBhbmQgc2hlbGwgZm9yIG9wZW5pbmcgdGhlIHdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTmV3RXhhbXBsZUFjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICBzdXBlcihJREVXb3JrYmVuY2hNZXNzYWdlcy5OZXdFeGFtcGxlQWN0aW9uX3RleHQpOwotICAgICAgICBpZiAod2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLndpbmRvdyA9IHdpbmRvdzsKLSAgICAgICAgSVNoYXJlZEltYWdlcyBpbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX05FV19XSVpBUkQpKTsKLSAgICAgICAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX05FV19XSVpBUkRfRElTQUJMRUQpKTsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuTmV3RXhhbXBsZUFjdGlvbl90b29sVGlwKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCW9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5ORVdfQUNUSU9OKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAvLyBDcmVhdGUgd2l6YXJkIHNlbGVjdGlvbiB3aXphcmQuCi0gICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgTmV3V2l6YXJkIHdpemFyZCA9IG5ldyBOZXdXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkCi0gICAgICAgICAgICAgICAgLnNldENhdGVnb3J5SWQoV2l6YXJkc1JlZ2lzdHJ5UmVhZGVyLkZVTExfRVhBTVBMRVNfV0laQVJEX0NBVEVHT1JZKTsKLQotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvblRvUGFzcyA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgICAgIHNlbGVjdGlvblRvUGFzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICB3aXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvblRvUGFzcyk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAuZ2V0U2VjdGlvbigiTmV3V2l6YXJkQWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHdpemFyZFNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzLmFkZE5ld1NlY3Rpb24oIk5ld1dpemFyZEFjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0gICAgICAgIHdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHdpemFyZCBkaWFsb2cuCi0gICAgICAgIFNoZWxsIHBhcmVudCA9IHdpbmRvdy5nZXRTaGVsbCgpOwotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhwYXJlbnQsIHdpemFyZCk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgd2l6YXJkLnNldFdpbmRvd1RpdGxlKElERVdvcmtiZW5jaE1lc3NhZ2VzLk5ld0V4YW1wbGVfdGl0bGUpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEgsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLSAgICAgICAgICAgICAgICBTSVpJTkdfV0laQVJEX0hFSUdIVCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1dJWkFSRCk7Ci0KLSAgICAgICAgLy8gT3BlbiB3aXphcmQuCi0gICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL05ld1Byb2plY3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9OZXdQcm9qZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OWYwM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL05ld1Byb2plY3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotCi0vKioKLSAqIFN0YW5kYXJkIGFjdGlvbiBmb3IgbGF1bmNoaW5nIHRoZSBjcmVhdGUgcHJvamVjdCBzZWxlY3Rpb24KLSAqIHdpemFyZC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE5ld1Byb2plY3RBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogVGhlIHdpemFyZCBkaWFsb2cgd2lkdGgKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9XSURUSCA9IDUwMDsKLQotICAgIC8qKgotICAgICAqIFRoZSB3aXphcmQgZGlhbG9nIGhlaWdodAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX0hFSUdIVCA9IDUwMDsKLQotICAgIC8qKgotICAgICAqIFRoZSB3b3JrYmVuY2ggd2luZG93IHRoaXMgYWN0aW9uIHdpbGwgcnVuIGluCi0gICAgICovCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotICAgIC8qKgotICAgICAqIFRoaXMgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbGxvd3MgdGhlIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkIGZyb20gdGhlIHdlbGNvbWUgcGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTmV3UHJvamVjdEFjdGlvbigpIHsKLSAgICAgICAgdGhpcyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBmb3IgbGF1bmNoaW5nIHRoZSBuZXcgcHJvamVjdAotICAgICAqIHNlbGVjdGlvbiB3aXphcmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2luZG93IHRoZSB3b3JrYmVuY2ggd2luZG93IHRvIHF1ZXJ5IHRoZSBjdXJyZW50Ci0gICAgICogCQlzZWxlY3Rpb24gYW5kIHNoZWxsIGZvciBvcGVuaW5nIHRoZSB3aXphcmQuCi0gICAgICovCi0gICAgcHVibGljIE5ld1Byb2plY3RBY3Rpb24oSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgc3VwZXIoSURFV29ya2JlbmNoTWVzc2FnZXMuTmV3UHJvamVjdEFjdGlvbl90ZXh0KTsKLSAgICAgICAgaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0gICAgICAgIElTaGFyZWRJbWFnZXMgaW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLSAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlcwotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ORVdfV0laQVJEKSk7Ci0gICAgICAgIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGltYWdlcwotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ORVdfV0laQVJEX0RJU0FCTEVEKSk7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLk5ld1Byb2plY3RBY3Rpb25fdG9vbFRpcCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoSGVscENvbnRleHRJZHMuTkVXX0FDVElPTik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgLy8gQ3JlYXRlIHdpemFyZCBzZWxlY3Rpb24gd2l6YXJkLgotICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIE5ld1dpemFyZCB3aXphcmQgPSBuZXcgTmV3V2l6YXJkKCk7Ci0gICAgICAgIHdpemFyZC5zZXRQcm9qZWN0c09ubHkodHJ1ZSk7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uVG9QYXNzID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgICAgc2VsZWN0aW9uVG9QYXNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgIHdpemFyZC5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uVG9QYXNzKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uKCJOZXdXaXphcmRBY3Rpb24iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotICAgICAgICAgICAgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncy5hZGROZXdTZWN0aW9uKCJOZXdXaXphcmRBY3Rpb24iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0gICAgICAgIHdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHdpemFyZCBkaWFsb2cuCi0gICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKG51bGwsIHdpemFyZCk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSgKLSAgICAgICAgICAgICAgICBNYXRoLm1heChTSVpJTkdfV0laQVJEX1dJRFRILCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0gICAgICAgICAgICAgICAgU0laSU5HX1dJWkFSRF9IRUlHSFQpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5ORVdfUFJPSkVDVF9XSVpBUkQpOwotCi0gICAgICAgIC8vIE9wZW4gd2l6YXJkLgotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9OZXdXaXphcmRNZW51LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvTmV3V2l6YXJkTWVudS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRlYTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9OZXdXaXphcmRNZW51LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuV2l6YXJkc1JlZ2lzdHJ5UmVhZGVyOwotCi0vKioKLSAqIEEgPGNvZGU+TmV3V2l6YXJkTWVudTwvY29kZT4gYXVnbWVudHMgPGNvZGU+QmFzZU5ld1dpemFyZE1lbnU8L2NvZGU+IHdpdGggSURFLXNwZWNpZmljCi0gKiBhY3Rpb25zOiBOZXcgUHJvamVjdC4uLiAoYWx3YXlzIHNob3duKSBhbmQgTmV3IEV4YW1wbGUuLi4gKHNob3duIG9ubHkgaWYgdGhlcmUgYXJlIGV4YW1wbGUgd2l6YXJkcyBpbnN0YWxsZWQpLgotICovCi1wdWJsaWMgY2xhc3MgTmV3V2l6YXJkTWVudSBleHRlbmRzIEJhc2VOZXdXaXphcmRNZW51IHsKLQotICAgIHByaXZhdGUgZmluYWwgSUFjdGlvbiBuZXdQcm9qZWN0QWN0aW9uOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBJQWN0aW9uIG5ld0V4YW1wbGVBY3Rpb247Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHdpemFyZCBzaG9ydGN1dCBtZW51IGZvciB0aGUgSURFLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3aW5kb3cKLSAgICAgKiAgICAgICAgICAgIHRoZSB3aW5kb3cgY29udGFpbmluZyB0aGUgbWVudQotICAgICAqLwotICAgIHB1YmxpYyBOZXdXaXphcmRNZW51KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgIHRoaXMod2luZG93LCBudWxsKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgd2l6YXJkIHNob3J0Y3V0IG1lbnUgZm9yIHRoZSBJREUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHdpbmRvdwotICAgICAqICAgICAgICAgICAgdGhlIHdpbmRvdyBjb250YWluaW5nIHRoZSBtZW51Ci0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhpcyBjb250cmlidXRpb24gaXRlbSAKLSAgICAgKi8KLSAgICBwdWJsaWMgTmV3V2l6YXJkTWVudShJV29ya2JlbmNoV2luZG93IHdpbmRvdywgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHN1cGVyKHdpbmRvdywgaWQpOwotICAgICAgICBuZXdQcm9qZWN0QWN0aW9uID0gbmV3IE5ld1Byb2plY3RBY3Rpb24od2luZG93KTsKLSAgICAgICAgbmV3RXhhbXBsZUFjdGlvbiA9IG5ldyBOZXdFeGFtcGxlQWN0aW9uKHdpbmRvdyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IHdpemFyZCBzaG9ydGN1dCBtZW51LiAgCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lbnUgd2lsbCBhcHBlYXIgb24gYSBzZW1pLXBlcm1hbmVudCBiYXNpcywgZm9yIGluc3RhbmNlIHdpdGhpbgotICAgICAqIGEgdG9vbGJhciBvciBtZW51YmFyLCB0aGUgdmFsdWUgcGFzc2VkIGZvciA8Y29kZT5yZWdpc3RlcjwvY29kZT4gc2hvdWxkIGJlIHRydWUuCi0gICAgICogSWYgc2V0LCB0aGUgbWVudSB3aWxsIGxpc3RlbiB0byBwZXJzcGVjdGl2ZSBhY3RpdmF0aW9uIGFuZCB1cGRhdGUgaXRzZWxmCi0gICAgICogdG8gc3VpdC4gIEluIHRoaXMgY2FzZSBjbGllbnRzIGFyZSBleHBlY3RlZCB0byBjYWxsIDxjb2RlPmRlcmVnaXN0ZXI8L2NvZGU+IAotICAgICAqIHdoZW4gdGhlIG1lbnUgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIFRoaXMgd2lsbCB1bmhvb2sgYW55IHBlcnNwZWN0aXZlCi0gICAgICogbGlzdGVuZXJzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbm5lck1nciB0aGUgbG9jYXRpb24gZm9yIHRoZSBzaG9ydGN1dCBtZW51IGNvbnRlbnRzCi0gICAgICogQHBhcmFtIHdpbmRvdyB0aGUgd2luZG93IGNvbnRhaW5pbmcgdGhlIG1lbnUKLSAgICAgKiBAcGFyYW0gcmVnaXN0ZXIgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIG1lbnUgbGlzdGVucyB0byBwZXJzcGVjdGl2ZSBjaGFuZ2VzIGluCi0gICAgICogICAgICB0aGUgd2luZG93Ci0gICAgICogQGRlcHJlY2F0ZWQgdXNlIE5ld1dpemFyZE1lbnUoSVdvcmtiZW5jaFdpbmRvdykgaW5zdGVhZAotICAgICAqLwotICAgIHB1YmxpYyBOZXdXaXphcmRNZW51KElNZW51TWFuYWdlciBpbm5lck1nciwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3csCi0gICAgICAgICAgICBib29sZWFuIHJlZ2lzdGVyKSB7Ci0gICAgICAgIHRoaXMod2luZG93LCBudWxsKTsKLSAgICAgICAgZmlsbE1lbnUoaW5uZXJNZ3IpOwotICAgICAgICAvLyBNdXN0IGJlIGRvbmUgYWZ0ZXIgY29uc3RydWN0b3IgdG8gZW5zdXJlIGZpZWxkIGluaXRpYWxpemF0aW9uLgotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogRmlsbHMgdGhlIG1lbnUgd2l0aCBOZXcgV2l6YXJkcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmlsbE1lbnUoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgaW5uZXJNZ3IpIHsKLSAgICAgICAgLy8gUmVtb3ZlIGFsbC4KLSAgICAgICAgaW5uZXJNZ3IucmVtb3ZlQWxsKCk7Ci0KLSAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IGdldENvbnRyaWJ1dGlvbkl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlubmVyTWdyLmFkZChpdGVtc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnMgZnJvbSB0aGUgY29udGFpbmluZyB3b3JrYmVuY2ggd2luZG93LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgc2hvcnRjdXQgbWVudSBpcyBjcmVhdGVkIHdpdGgKLSAgICAgKiA8Y29kZT5yZWdpc3RlciA9IHRydWU8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCBoYXMgbm8gZWZmZWN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3Rlckxpc3RlbmVycygpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCBhbnkgZXhhbXBsZXMgYXJlIGluIHRoZSBjdXJyZW50IGluc3RhbGwuCi0gICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0V4YW1wbGVzKCkgewotICAgICAgICByZXR1cm4gcmVnaXN0cnlIYXNDYXRlZ29yeShXaXphcmRzUmVnaXN0cnlSZWFkZXIuRlVMTF9FWEFNUExFU19XSVpBUkRfQ0FURUdPUlkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZU5ld1dpemFyZE1lbnUjYWRkSXRlbXMob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zKExpc3QgbGlzdCkgewotICAgICAgICBsaXN0LmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShuZXdQcm9qZWN0QWN0aW9uKSk7IAotICAgICAgICBsaXN0LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBpZiAoYWRkU2hvcnRjdXRzKGxpc3QpKSB7Ci0gICAgICAgIAlsaXN0LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoYXNFeGFtcGxlcygpKSB7Ci0gICAgICAgICAgICBsaXN0LmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShuZXdFeGFtcGxlQWN0aW9uKSk7Ci0gICAgICAgICAgICBsaXN0LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICB9Ci0gICAgICAgIGxpc3QuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGdldFNob3dEaWFsb2dBY3Rpb24oKSkpOwotICAgIH0KLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250cmlidXRpb25JdGVtLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWRWYWx1ZSBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgbWVudSBpcyBlbmFibGVkOyBlbHNlCi0JICogCQlpdCBpcyBkaXNhYmxlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkVmFsdWUpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZFZhbHVlOwotCX0KLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VOZXdXaXphcmRNZW51I2dldENvbnRyaWJ1dGlvbkl0ZW1zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBnZXRDb250cmlidXRpb25JdGVtcygpIHsKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0Q29udHJpYnV0aW9uSXRlbXMoKTsKLQkJfQotCQlyZXR1cm4gbmV3IElDb250cmlidXRpb25JdGVtWzBdOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9PcGVuRmlsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL09wZW5GaWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1Y2YyM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL09wZW5GaWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLk9wZW5TdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLkRpYWxvZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogU3RhbmRhcmQgYWN0aW9uIGZvciBvcGVuaW5nIGFuIGVkaXRvciBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGZpbGUgCi0gKiByZXNvdXJjZShzKS4KLSAqIDxwPgotICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgZGlmZmVyZW50IGFjdGlvbiBmb3Igb3BlbmluZyBjbG9zZWQgcHJvamVjdHM6Ci0gKiA8Y29kZT5PcGVuUmVzb3VyY2VBY3Rpb248L2NvZGU+LgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkZpbGVBY3Rpb24gZXh0ZW5kcyBPcGVuU3lzdGVtRWRpdG9yQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBpZCBvZiB0aGlzIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IFBsYXRmb3JtVUkuUExVR0lOX0lEICsgIi5PcGVuRmlsZUFjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIGVkaXRvciB0byBvcGVuLgotICAgICAqLwotICAgIHByaXZhdGUgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzY3JpcHRvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIHRoYXQgd2lsbCBvcGVuIGVkaXRvcnMgb24gdGhlIHRoZW4tc2VsZWN0ZWQgZmlsZSAKLSAgICAgKiByZXNvdXJjZXMuIEVxdWl2YWxlbnQgdG8gPGNvZGU+T3BlbkZpbGVBY3Rpb24ocGFnZSxudWxsKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFnZSB0aGUgd29ya2JlbmNoIHBhZ2UgaW4gd2hpY2ggdG8gb3BlbiB0aGUgZWRpdG9yCi0gICAgICovCi0gICAgcHVibGljIE9wZW5GaWxlQWN0aW9uKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLSAgICAgICAgdGhpcyhwYWdlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiB0aGF0IHdpbGwgb3BlbiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpZmllZCBlZGl0b3Igb24gCi0gICAgICogdGhlIHRoZW4tc2VsZWN0ZWQgZmlsZSByZXNvdXJjZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFnZSB0aGUgd29ya2JlbmNoIHBhZ2UgaW4gd2hpY2ggdG8gb3BlbiB0aGUgZWRpdG9yCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGVkaXRvciBkZXNjcmlwdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bnNwZWNpZmllZAotICAgICAqLwotICAgIHB1YmxpYyBPcGVuRmlsZUFjdGlvbihJV29ya2JlbmNoUGFnZSBwYWdlLCBJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIHN1cGVyKHBhZ2UpOwotICAgICAgICBzZXRUZXh0KGRlc2NyaXB0b3IgPT0gbnVsbCA/IElERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5GaWxlQWN0aW9uX3RleHQgOiBkZXNjcmlwdG9yLmdldExhYmVsKCkpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJSUlERUhlbHBDb250ZXh0SWRzLk9QRU5fRklMRV9BQ1RJT04pOwotICAgICAgICBzZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5PcGVuRmlsZUFjdGlvbl90b29sVGlwKTsKLSAgICAgICAgc2V0SWQoSUQpOwotICAgICAgICB0aGlzLmVkaXRvckRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGZpbGUgcmVzb3VyY2UgYXJlIGxvY2FsLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlIGlzIGxvY2FsLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmCi0gICAgICogICBpdCBjb3VsZCBub3QgYmUgbWFkZSBsb2NhbCBmb3Igc29tZSByZWFzb24KLSAgICAgKi8KLSAgICBib29sZWFuIGVuc3VyZUZpbGVMb2NhbChmaW5hbCBJRmlsZSBmaWxlKSB7Ci0gICAgICAgIC8vQ3VycmVudGx5IGZhaWxzIGR1ZSB0byBDb3JlIFBSLiAgRG9uJ3QgZG8gaXQgZm9yIG5vdwotICAgICAgICAvLzFHNUk2UFY6IElUUENPUkU6V0lOTlQgLSBJUmVzb3VyY2Uuc2V0TG9jYWwoKSBhdHRlbXB0cyB0byBtb2RpZnkgaW1tdXRhYmxlIHRyZWUKLSAgICAgICAgLy9maWxlLnNldExvY2FsKHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYW4gZWRpdG9yIG9uIHRoZSBnaXZlbiBmaWxlIHJlc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgcmVzb3VyY2UKLSAgICAgKi8KLSAgICB2b2lkIG9wZW5GaWxlKElGaWxlIGZpbGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJvb2xlYW4gYWN0aXZhdGUgPSBPcGVuU3RyYXRlZ3kuYWN0aXZhdGVPbk9wZW4oKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3JEZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJREUub3BlbkVkaXRvcihnZXRXb3JrYmVuY2hQYWdlKCksIGZpbGUsIGFjdGl2YXRlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVuc3VyZUZpbGVMb2NhbChmaWxlKSkgewotICAgICAgICAgICAgICAgICAgICBnZXRXb3JrYmVuY2hQYWdlKCkub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvckRlc2NyaXB0b3IuZ2V0SWQoKSwgYWN0aXZhdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgRGlhbG9nVXRpbC5vcGVuRXJyb3IoZ2V0V29ya2JlbmNoUGFnZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTaGVsbCgpLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5PcGVuRmlsZUFjdGlvbl9vcGVuRmlsZVNoZWxsVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL09wZW5SZXNvdXJjZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL09wZW5SZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjkxYmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9PcGVuUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VSdWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci0KLS8qKgotICogU3RhbmRhcmQgYWN0aW9uIGZvciBvcGVuaW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJvamVjdChzKS4KLSAqIDxwPgotICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgZGlmZmVyZW50IGFjdGlvbiBmb3Igb3BlbmluZyBhbiBlZGl0b3Igb24gZmlsZSByZXNvdXJjZXM6Ci0gKiA8Y29kZT5PcGVuRmlsZUFjdGlvbjwvY29kZT4uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBXb3Jrc3BhY2VBY3Rpb24gaW1wbGVtZW50cwotICAgICAgICBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaWQgb2YgdGhpcyBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBQbGF0Zm9ybVVJLlBMVUdJTl9JRAotICAgICAgICAgICAgKyAiLk9wZW5SZXNvdXJjZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbCBmb3IgYW55IGRpYWxvZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlblJlc291cmNlQWN0aW9uKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHN1cGVyKHNoZWxsLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5PcGVuUmVzb3VyY2VBY3Rpb25fdGV4dCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlJSURFSGVscENvbnRleHRJZHMuT1BFTl9SRVNPVVJDRV9BQ1RJT04pOwotICAgICAgICBzZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5PcGVuUmVzb3VyY2VBY3Rpb25fdG9vbFRpcCk7Ci0gICAgICAgIHNldElkKElEKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdvcmtzcGFjZUFjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZXJhdGlvbk1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5PcGVuUmVzb3VyY2VBY3Rpb25fb3BlcmF0aW9uTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdvcmtzcGFjZUFjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2JsZW1zTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5SZXNvdXJjZUFjdGlvbl9wcm9ibGVtTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdvcmtzcGFjZUFjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2JsZW1zVGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5PcGVuUmVzb3VyY2VBY3Rpb25fZGlhbG9nVGl0bGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlT3BlcmF0aW9uKElSZXNvdXJjZSByZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCSAgICAoKElQcm9qZWN0KSByZXNvdXJjZSkub3Blbihtb25pdG9yKTsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdvcmtzcGFjZUFjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRQZXJmb3JtUmVzb3VyY2VQcnVuaW5nKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPk9wZW5SZXNvdXJjZUFjdGlvbjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uPC9jb2RlPiBtZXRob2QgZW5zdXJlcyB0aGF0IHRoaXMgYWN0aW9uIGlzCi0gICAgICogZW5hYmxlZCBvbmx5IGlmIG9uZSBvZiB0aGUgc2VsZWN0aW9ucyBpcyBhIGNsb3NlZCBwcm9qZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7Ci0gICAgICAgIC8vIGRvbid0IGNhbGwgc3VwZXIgc2luY2Ugd2Ugd2FudCB0byBlbmFibGUgaWYgY2xvc2VkIHByb2plY3QgaXMgc2VsZWN0ZWQuCi0KLSAgICAgICAgaWYgKCFzZWxlY3Rpb25Jc09mVHlwZShJUmVzb3VyY2UuUFJPSkVDVCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgSXRlcmF0b3IgcmVzb3VyY2VzID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocmVzb3VyY2VzLmhhc05leHQoKSkgewotICAgICAgICAgICAgSVByb2plY3QgY3VycmVudFJlc291cmNlID0gKElQcm9qZWN0KSByZXNvdXJjZXMubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFjdXJyZW50UmVzb3VyY2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIHJlc291cmNlIGNoYW5nZWQgZXZlbnQgYnkgdXBkYXRpbmcgdGhlIGVuYWJsZW1lbnQKLSAgICAgKiBpZiBvbmUgb2YgdGhlIHNlbGVjdGVkIHByb2plY3RzIGlzIG9wZW5lZCBvciBjbG9zZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vIFdhcm5pbmc6IGNvZGUgZHVwbGljYXRlZCBpbiBDbG9zZVJlc291cmNlQWN0aW9uCi0gICAgICAgIExpc3Qgc2VsID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLSAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGxvb2tpbmcgYXQgZGVsdGEgaWYgc2VsZWN0aW9uIG5vdCBhcHBsaWNhYmxlCi0gICAgICAgIGlmIChzZWxlY3Rpb25Jc09mVHlwZShJUmVzb3VyY2UuUFJPSkVDVCkpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLSAgICAgICAgICAgIGlmIChkZWx0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlRGVsdGFbXSBwcm9qRGVsdGFzID0gZGVsdGEKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBZmZlY3RlZENoaWxkcmVuKElSZXNvdXJjZURlbHRhLkNIQU5HRUQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvakRlbHRhcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VEZWx0YSBwcm9qRGVsdGEgPSBwcm9qRGVsdGFzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2pEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbC5jb250YWlucyhwcm9qRGVsdGEuZ2V0UmVzb3VyY2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uOyBvdmVycmlkZXMgbWV0aG9kIG9uIFdvcmtzcGFjZUFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgCUlTY2hlZHVsaW5nUnVsZSBydWxlID0gbnVsbDsKLSAgICAgICAgLy9iZSBjb25zZXJ2YXRpdmUgYW5kIGluY2x1ZGUgYWxsIHByb2plY3RzIGluIHRoZSBzZWxlY3Rpb24gLSBwcm9qZWN0cwotICAgICAgICAvL2NhbiBjaGFuZ2Ugc3RhdGUgYmV0d2VlbiBub3cgYW5kIHdoZW4gdGhlIGpvYiBzdGFydHMKLSAgICAJSVJlc291cmNlUnVsZUZhY3RvcnkgZmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOwotICAgICAgICBJdGVyYXRvciByZXNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChyZXNvdXJjZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZXMubmV4dCgpOwotICAgICAgIAkJcnVsZSA9IE11bHRpUnVsZS5jb21iaW5lKHJ1bGUsIGZhY3RvcnkubW9kaWZ5UnVsZShwcm9qZWN0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcnVuSW5CYWNrZ3JvdW5kKHJ1bGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9PcGVuU3lzdGVtRWRpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvT3BlblN5c3RlbUVkaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTk5YzlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9PcGVuU3lzdGVtRWRpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuRGlhbG9nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBTdGFuZGFyZCBhY3Rpb24gZm9yIG9wZW5pbmcgYSBzeXN0ZW0gZWRpdG9yIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZmlsZSAKLSAqIHJlc291cmNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgT3BlblN5c3RlbUVkaXRvckFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBpZCBvZiB0aGlzIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IFBsYXRmb3JtVUkuUExVR0lOX0lECi0gICAgICAgICAgICArICIuT3BlblN5c3RlbUVkaXRvckFjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIHdvcmtiZW5jaCBwYWdlIHRvIG9wZW4gdGhlIGVkaXRvciBpbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiB0aGF0IHdpbGwgb3BlbiBzeXN0ZW0gZWRpdG9ycyBvbiB0aGUgdGhlbi1zZWxlY3RlZCBmaWxlIAotICAgICAqIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlIHRoZSB3b3JrYmVuY2ggcGFnZSBpbiB3aGljaCB0byBvcGVuIHRoZSBlZGl0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlblN5c3RlbUVkaXRvckFjdGlvbihJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0gICAgICAgIHN1cGVyKElERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5TeXN0ZW1FZGl0b3JBY3Rpb25fdGV4dCk7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5TeXN0ZW1FZGl0b3JBY3Rpb25fdG9vbFRpcCk7Ci0gICAgICAgIHNldElkKElEKTsKLSAgICAgICAgcGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5PUEVOX1NZU1RFTV9FRElUT1JfQUNUSU9OKTsKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMud29ya2JlbmNoUGFnZSA9IHBhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB3b3JrYmVuY2ggcGFnZSB0byBvcGVuIHRoZSBlZGl0b3IgaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB3b3JrYmVuY2ggcGFnZSB0byBvcGVuIHRoZSBlZGl0b3IgaW4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovZmluYWwgSVdvcmtiZW5jaFBhZ2UgZ2V0V29ya2JlbmNoUGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIHdvcmtiZW5jaFBhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYSBzeXN0ZW0gZWRpdG9yIG9uIHRoZSBnaXZlbiBmaWxlIHJlc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgcmVzb3VyY2UKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovdm9pZCBvcGVuRmlsZShJRmlsZSBmaWxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRXb3JrYmVuY2hQYWdlKCkub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLAotICAgICAgICAgICAgICAgICAgICBJRWRpdG9yUmVnaXN0cnkuU1lTVEVNX0VYVEVSTkFMX0VESVRPUl9JRCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIERpYWxvZ1V0aWwub3BlbkVycm9yKGdldFdvcmtiZW5jaFBhZ2UoKS5nZXRXb3JrYmVuY2hXaW5kb3coKQotICAgICAgICAgICAgICAgICAgICAuZ2V0U2hlbGwoKSwgSURFV29ya2JlbmNoTWVzc2FnZXMuT3BlblN5c3RlbUVkaXRvckFjdGlvbl9kaWFsb2dUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgSXRlcmF0b3IgaXRyID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaXRyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgICAgICAgICAgIG9wZW5GaWxlKChJRmlsZSkgcmVzb3VyY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPk9wZW5TeXN0ZW1FZGl0b3JBY3Rpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjwvY29kZT4gbWV0aG9kIGVuYWJsZXMgdGhlIGFjdGlvbiBvbmx5Ci0gICAgICogaWYgdGhlIHNlbGVjdGlvbiBjb250YWlucyBqdXN0IGZpbGUgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pCi0gICAgICAgICAgICAgICAgJiYgc2VsZWN0aW9uSXNPZlR5cGUoSVJlc291cmNlLkZJTEUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9PcGVuV2l0aE1lbnUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9PcGVuV2l0aE1lbnUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5Yjc5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvT3BlbldpdGhNZW51LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLkRpYWxvZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5tb2RlbC5Nb2RlbFByb3ZpZGVyQmFzZWRFZGl0b3JPcGVuU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuaWRlLklFZGl0b3JPcGVuU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuaWRlLk9wZW5XaXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuaWRlLk9wZW5XaXRoSW5mbzsKLQotLyoqCi0gKiBBIG1lbnUgZm9yIG9wZW5pbmcgZmlsZXMgaW4gdGhlIHdvcmtiZW5jaC4KLSAqIDxwPgotICogQW4gPGNvZGU+T3BlbldpdGhNZW51PC9jb2RlPiBpcyB1c2VkIHRvIHBvcHVsYXRlIGEgbWVudSB3aXRoICJPcGVuIFdpdGgiCi0gKiBhY3Rpb25zLiBPbmUgYWN0aW9uIGlzIGFkZGVkIGZvciBlYWNoIGVkaXRvciB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIHRoZQotICogc2VsZWN0ZWQgZmlsZS4gSWYgdGhlIHVzZXIgc2VsZWN0cyBvbmUgb2YgdGhlc2UgaXRlbXMsIHRoZSBjb3JyZXNwb25kaW5nCi0gKiBlZGl0b3IgaXMgb3BlbmVkIG9uIHRoZSBmaWxlLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgT3BlbldpdGhNZW51IGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBwYWdlOwotCi0JcHJpdmF0ZSBPYmplY3QgZWxlbWVudDsKLQotCXByaXZhdGUgSUVkaXRvck9wZW5TdHJhdGVneSBzdHJhdGVneSA9IG5ldyBNb2RlbFByb3ZpZGVyQmFzZWRFZGl0b3JPcGVuU3RyYXRlZ3koKTsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBpbWFnZUNhY2hlID0gbmV3IEhhc2h0YWJsZSgxMSk7Ci0KLQkvKioKLQkgKiBUaGUgaWQgb2YgdGhpcyBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBQbGF0Zm9ybVVJLlBMVUdJTl9JRCArICIuT3BlbldpdGhNZW51IjsvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIENvbXBhcmVzIHRoZSBsYWJlbHMgZnJvbSB0d28gSUVkaXRvckRlc2NyaXB0b3Igb2JqZWN0cwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgY29tcGFyZXIgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJcHJpdmF0ZSBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotCQkJU3RyaW5nIHMxID0gKChPcGVuV2l0aEVudHJ5KSBhcmcwKS5nZXRMYWJlbCgpOwotCQkJU3RyaW5nIHMyID0gKChPcGVuV2l0aEVudHJ5KSBhcmcxKS5nZXRMYWJlbCgpOwotCQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUoczEsIHMyKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPk9wZW5XaXRoTWVudTwvY29kZT4uCi0JICogPHA+Ci0JICogSWYgdGhpcyBtZXRob2QgaXMgdXNlZCBiZSBzdXJlIHRvIHNldCB0aGUgc2VsZWN0ZWQgZmlsZSBieSBpbnZva2luZwotCSAqIDxjb2RlPnNldEZpbGU8L2NvZGU+LiBUaGUgZmlsZSBpbnB1dCBpcyByZXF1aXJlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMKLQkgKiBhbiBpdGVtIGluIHRoZSBtZW51LiBBdCB0aGF0IHBvaW50IHRoZSBtZW51IHdpbGwgYXR0ZW1wdCB0byBvcGVuIGFuCi0JICogZWRpdG9yIHdpdGggdGhlIGZpbGUgYXMgaXRzIGlucHV0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZQotCSAqICAgICAgICAgICAgdGhlIHBhZ2Ugd2hlcmUgdGhlIGVkaXRvciBpcyBvcGVuZWQgaWYgYW4gaXRlbSB3aXRoaW4gdGhlIG1lbnUKLQkgKiAgICAgICAgICAgIGlzIHNlbGVjdGVkCi0JICovCi0JcHVibGljIE9wZW5XaXRoTWVudShJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCXRoaXMocGFnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5PcGVuV2l0aE1lbnU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYWdlCi0JICogICAgICAgICAgICB0aGUgcGFnZSB3aGVyZSB0aGUgZWRpdG9yIGlzIG9wZW5lZCBpZiBhbiBpdGVtIHdpdGhpbiB0aGUgbWVudQotCSAqICAgICAgICAgICAgaXMgc2VsZWN0ZWQKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIHNlbGVjdGVkIGZpbGUKLQkgKi8KLQlwdWJsaWMgT3BlbldpdGhNZW51KElXb3JrYmVuY2hQYWdlIHBhZ2UsIElBZGFwdGFibGUgZmlsZSkgewotCQl0aGlzKHBhZ2UsIChPYmplY3QpIGZpbGUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+T3BlbldpdGhNZW51PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZQotCSAqICAgICAgICAgICAgdGhlIHBhZ2Ugd2hlcmUgdGhlIGVkaXRvciBpcyBvcGVuZWQgaWYgYW4gaXRlbSB3aXRoaW4gdGhlIG1lbnUKLQkgKiAgICAgICAgICAgIGlzIHNlbGVjdGVkCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBzZWxlY3RlZCBtb2RlbCBlbGVtZW50Ci0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBPcGVuV2l0aE1lbnUoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIoSUQpOwotCQl0aGlzLnBhZ2UgPSBwYWdlOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIHRvIHNob3cgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5LgotCSAqIAotCSAqIEBwYXJhbSBlbnRyeSB0aGUgb3BlbiB3aXRoIGVudHJ5Ci0JICogQHJldHVybiB0aGUgaW1hZ2Ugb3IgbnVsbAotCSAqLwotCXByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2UoT3BlbldpdGhFbnRyeSBlbnRyeSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjID0gZW50cnkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCWlmIChpbWFnZURlc2MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGltYWdlQ2FjaGUuZ2V0KGltYWdlRGVzYyk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZSA9IGltYWdlRGVzYy5jcmVhdGVJbWFnZSgpOwotCQkJaW1hZ2VDYWNoZS5wdXQoaW1hZ2VEZXNjLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1lbnUgaXRlbSBmb3IgdGhlIGVudHJ5LgotCSAqIAotCSAqIEBwYXJhbSBtZW51Ci0JICogICAgICAgICAgICB0aGUgbWVudSB0byBhZGQgdGhlIGl0ZW0gdG8KLQkgKiBAcGFyYW0gZW50cnkKLQkgKiAgICAgICAgICAgIHRoZSBlbnRyeQotCSAqIEBwYXJhbSBpc1ByZWZlcnJlZCB3aGV0aGVyIHRoZSBlbnRyeSBpcyB0aGUgcHJlZmVycmVkIG9uZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVNZW51SXRlbShNZW51IG1lbnUsIGZpbmFsIE9wZW5XaXRoRW50cnkgZW50cnksCi0JCQlib29sZWFuIGlzUHJlZmVycmVkKSB7Ci0JCS8vIFhYWDogV291bGQgYmUgYmV0dGVyIHRvIHVzZSBib2xkIGhlcmUsIGJ1dCBTV1QgZG9lcyBub3Qgc3VwcG9ydCBpdC4KLQkJZmluYWwgTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQlpZiAoaXNQcmVmZXJyZWQpIHsKLQkJCW1lbnUuc2V0RGVmYXVsdEl0ZW0obWVudUl0ZW0pOwotCQl9Ci0JCW1lbnVJdGVtLnNldFRleHQoZW50cnkuZ2V0TGFiZWwoKSk7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2UoZW50cnkpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJbWVudUl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQl9Ci0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5TZWxlY3Rpb246Ci0JCQkJCW9wZW5FZGl0b3IoZW50cnksIHRydWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCW1lbnVJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZW51IGl0ZW0gZm9yICJEZWZhdWx0Iiwgd2hpY2ggcGlja3MgdGhlIGRlZmF1bHQgYXNzb2NpYXRlZAotCSAqIHdpdGggdGhlIGZpbGUgdHlwZSwgY2xlYXJpbmcgYW55IGVkaXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgaXRzZWxmCi0JICogKGkuZS4gcmVtZW1iZXJlZCBmcm9tIHRoZSBsYXN0IE9wZW4gV2l0aCkuCi0JICogCi0JICogQHBhcmFtIG1lbnUKLQkgKiAgICAgICAgICAgIHRoZSBtZW51IHRvIGFkZCB0aGUgaXRlbSB0bwotCSAqIEBwYXJhbSBlbnRyeSB0aGUgZW50cnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE1lbnVJdGVtKE1lbnUgbWVudSwgZmluYWwgT3BlbldpdGhFbnRyeSBlbnRyeSkgewotCQlmaW5hbCBNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCW1lbnVJdGVtLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuRGVmYXVsdEVkaXRvckRlc2NyaXB0aW9uX25hbWUpOwotCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5TZWxlY3Rpb246Ci0JCQkJCW9wZW5FZGl0b3IoZW50cnksIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCW1lbnVJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgRmlsbHMgdGhlIG1lbnUgd2l0aCBwZXJzcGVjdGl2ZSBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKE1lbnUgbWVudSwgaW50IGluZGV4KSB7Ci0JCU9iamVjdCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlPcGVuV2l0aEluZm8gaW5mbyA9IHN0cmF0ZWd5LmdldE9wZW5XaXRoSW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJT3BlbldpdGhFbnRyeSBwcmVmZXJyZWRFbnRyeSA9IGluZm8uZ2V0UHJlZmVycmVkRW50cnkoKTsgLy8gbWF5IGJlIG51bGwKLQkJT3BlbldpdGhFbnRyeVtdIGVudHJpZXMgPSBpbmZvLmdldEVudHJpZXMoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChBcnJheXMuYXNMaXN0KGVudHJpZXMpLCBjb21wYXJlcik7Ci0KLQkJbWVudS5zZXREZWZhdWx0SXRlbShudWxsKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPcGVuV2l0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCWNyZWF0ZU1lbnVJdGVtKG1lbnUsIGVudHJ5LCBlbnRyeS5lcXVhbHMocHJlZmVycmVkRW50cnkpKTsKLQkJfQotCi0JCS8vIE9ubHkgYWRkIGEgc2VwYXJhdG9yIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0byBzZXBhcmF0ZQotCQlpZiAoZW50cmllcy5sZW5ndGggPiAwKQotCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCi0JCS8vIEFkZCBlbnRyeSBmb3Igc3lzdGVtIGV4dGVybmFsIGVkaXRvciAKLQkJaWYgKGluZm8uZ2V0RXh0ZXJuYWxFbnRyeSgpICE9IG51bGwpIHsKLQkJCWNyZWF0ZU1lbnVJdGVtKG1lbnUsIGluZm8uZ2V0RXh0ZXJuYWxFbnRyeSgpLCBpbmZvLmdldEV4dGVybmFsRW50cnkoKS5lcXVhbHMocHJlZmVycmVkRW50cnkpKTsKLQkJfQotCi0JCS8vIEFkZCBlbnRyeSBmb3Igc3lzdGVtIGluLXBsYWNlIGVkaXRvciAKLQkJaWYgKGluZm8uZ2V0SW5QbGFjZUVudHJ5KCkgIT0gbnVsbCkgewotCQkJY3JlYXRlTWVudUl0ZW0obWVudSwgaW5mby5nZXRJblBsYWNlRW50cnkoKSwgaW5mby5nZXRJblBsYWNlRW50cnkoKS5lcXVhbHMocHJlZmVycmVkRW50cnkpKTsKLQkJfQotCQkKLQkJLy8gQWRkIGVudHJ5IGZvciBkZWZhdWx0IAotCQlpZiAoaW5mby5nZXREZWZhdWx0RW50cnkoKSAhPSBudWxsKSB7Ci0JCQljcmVhdGVEZWZhdWx0TWVudUl0ZW0obWVudSwgaW5mby5nZXREZWZhdWx0RW50cnkoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyB0aGUgbW9kZWwgZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgUmV0dXJucyB3aGV0aGVyIHRoaXMgbWVudSBpcyBkeW5hbWljLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRHluYW1pYygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIGVkaXRvciBmb3IgdGhlIGdpdmVuIGVudHJ5LgotCSAqIAotCSAqIEBwYXJhbSBlbnRyeSB0aGUgZW50cnkKLQkgKiBAcGFyYW0gcmVtZW1iZXJFZGl0b3Igd2hldGhlciB0byByZW1lbWJlciB0aGUgZWRpdG9yIHdpdGggdGhlIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihPcGVuV2l0aEVudHJ5IGVudHJ5LCBib29sZWFuIHJlbWVtYmVyRWRpdG9yKSB7Ci0JCWZpbmFsIGludCBNQVRDSF9CT1RIID0gSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSU5QVVQgfCBJV29ya2JlbmNoUGFnZS5NQVRDSF9JRDsKLQkJdHJ5IHsKLQkJCWVudHJ5Lm9wZW5FZGl0b3IocGFnZSwgdHJ1ZSwgTUFUQ0hfQk9USCwgcmVtZW1iZXJFZGl0b3IpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFsb2dVdGlsLm9wZW5FcnJvcihwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5XaXRoTWVudV9kaWFsb2dUaXRsZSwgZQotCQkJCQkJCS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvUXVpY2tTdGFydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1F1aWNrU3RhcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3Zjc1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvUXVpY2tTdGFydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuUHJvZHVjdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLkFib3V0SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuRmVhdHVyZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLldlbGNvbWVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBUaGUgcXVpY2sgc3RhcnQgKFdlbGNvbWUuLi4pIGFjdGlvbi4KLSAqIAotICogQGRlcHJlY2F0ZWQgdGhlIElERSBub3cgdXNlcyB0aGUgbmV3IGludHJvIG1lY2hhbmlzbQotICovCi1wdWJsaWMgY2xhc3MgUXVpY2tTdGFydEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzCi0gICAgICAgIEFjdGlvbkZhY3RvcnkuSVdvcmtiZW5jaEFjdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLldlbGNvbWVFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgd29ya2JlbmNoIHdpbmRvdzsgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcwotICAgICAqIGFjdGlvbiBoYXMgYmVlbiA8Y29kZT5kaXNwb3NlPC9jb2RlPmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdzsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgY29uc3J1Y3RvciBhZGRlZCB0byBzdXBwb3J0IGNhbGxpbmcgdGhlIGFjdGlvbiBmcm9tIHRoZSB3ZWxjb21lCi0gICAgICogcGFnZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFF1aWNrU3RhcnRBY3Rpb24oKSB7Ci0gICAgICAgIHRoaXMoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGFjdGlvbiwgZm9yIHVzZSBpbiB0aGUgZ2l2ZW4gd2luZG93LgotICAgICAqIEBwYXJhbSB3aW5kb3cgdGhlIHdpbmRvdwotICAgICAqLwotICAgIHB1YmxpYyBRdWlja1N0YXJ0QWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgIHN1cGVyKElERVdvcmtiZW5jaE1lc3NhZ2VzLlF1aWNrU3RhcnRfdGV4dCk7Ci0gICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMud29ya2JlbmNoV2luZG93ID0gd2luZG93OwotICAgICAgICBzZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5RdWlja1N0YXJ0X3Rvb2xUaXApOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJSUlERUhlbHBDb250ZXh0SWRzLlFVSUNLX1NUQVJUX0FDVElPTik7Ci0gICAgICAgIHNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2UudWkuaGVscC5xdWlja1N0YXJ0QWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbi4gIFByb21wdHMgZm9yIGEgZmVhdHVyZSB3aXRoIGEgd2VsY29tZSBwYWdlLCAKLSAgICAgKiB0aGVuIG9wZW5zIHRoZSBjb3JyZXNwb25kaW5nIHdlbGNvbWUgcGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYWN0aW9uIGhhcyBiZWVuIGRpc3Bvc2VkCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFib3V0SW5mbyBmZWF0dXJlID0gcHJvbXB0Rm9yRmVhdHVyZSgpOwotICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9wZW5XZWxjb21lUGFnZShmZWF0dXJlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcih3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuUXVpY2tTdGFydEFjdGlvbl9lcnJvckRpYWxvZ1RpdGxlLAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5RdWlja1N0YXJ0QWN0aW9uX2luZm9SZWFkRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvbXB0cyB0aGUgdXNlciBmb3IgYSBmZWF0dXJlIHRoYXQgaGFzIGEgd2VsY29tZSBwYWdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNob3NlbiBmZWF0dXJlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHdhcyBjaG9zZW4KLSAgICAgKi8KLSAgICBwcml2YXRlIEFib3V0SW5mbyBwcm9tcHRGb3JGZWF0dXJlKCkgdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEFzayB0aGUgdXNlciB0byBzZWxlY3QgYSBmZWF0dXJlCi0gICAgICAgIEFycmF5TGlzdCB3ZWxjb21lRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgVVJMIHByb2R1Y3RVcmwgPSBudWxsOwotICAgICAgICBJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOwotICAgICAgICBpZiAocHJvZHVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9kdWN0VXJsID0gUHJvZHVjdFByb3BlcnRpZXMuZ2V0V2VsY29tZVBhZ2VVcmwocHJvZHVjdCk7Ci0gICAgICAgICAgICB3ZWxjb21lRmVhdHVyZXMuYWRkKG5ldyBBYm91dEluZm8ocHJvZHVjdCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQWJvdXRJbmZvW10gZmVhdHVyZXMgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldEZlYXR1cmVJbmZvcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gZmVhdHVyZXNbaV0uZ2V0V2VsY29tZVBhZ2VVUkwoKTsKLSAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCAmJiAhdXJsLmVxdWFscyhwcm9kdWN0VXJsKSkKLSAgICAgICAgICAgICAgICB3ZWxjb21lRmVhdHVyZXMuYWRkKGZlYXR1cmVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNoZWxsIHNoZWxsID0gd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0KLSAgICAgICAgaWYgKHdlbGNvbWVGZWF0dXJlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIElERVdvcmtiZW5jaE1lc3NhZ2VzLlF1aWNrU3RhcnRNZXNzYWdlRGlhbG9nX3RpdGxlLAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5RdWlja1N0YXJ0TWVzc2FnZURpYWxvZ19tZXNzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgZmVhdHVyZXMgPSBuZXcgQWJvdXRJbmZvW3dlbGNvbWVGZWF0dXJlcy5zaXplKCldOwotICAgICAgICB3ZWxjb21lRmVhdHVyZXMudG9BcnJheShmZWF0dXJlcyk7Ci0KLSAgICAgICAgRmVhdHVyZVNlbGVjdGlvbkRpYWxvZyBkID0gbmV3IEZlYXR1cmVTZWxlY3Rpb25EaWFsb2coc2hlbGwsIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgIHByb2R1Y3QgPT0gbnVsbCA/IG51bGwgOiBwcm9kdWN0LmdldElkKCksIElERVdvcmtiZW5jaE1lc3NhZ2VzLldlbGNvbWVQYWdlU2VsZWN0aW9uRGlhbG9nX3RpdGxlLAotICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLldlbGNvbWVQYWdlU2VsZWN0aW9uRGlhbG9nX21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLldFTENPTUVfUEFHRV9TRUxFQ1RJT05fRElBTE9HKTsKLSAgICAgICAgaWYgKGQub3BlbigpICE9IFdpbmRvdy5PSyB8fCBkLmdldFJlc3VsdCgpLmxlbmd0aCAhPSAxKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoQWJvdXRJbmZvKSBkLmdldFJlc3VsdCgpWzBdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIHRoZSB3ZWxjb21lIHBhZ2UgZm9yIHRoZSBnaXZlbiBmZWF0dXJlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmZWF0dXJlSWQgdGhlIGFib3V0IGluZm8gZm9yIHRoZSBmZWF0dXJlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzZnVsLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogQHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24gCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gb3BlbldlbGNvbWVQYWdlKFN0cmluZyBmZWF0dXJlSWQpIHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24gewotICAgICAgICBBYm91dEluZm8gZmVhdHVyZSA9IGZpbmRGZWF0dXJlKGZlYXR1cmVJZCk7Ci0gICAgICAgIGlmIChmZWF0dXJlID09IG51bGwgfHwgZmVhdHVyZS5nZXRXZWxjb21lUGFnZVVSTCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3BlbldlbGNvbWVQYWdlKGZlYXR1cmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFib3V0IGluZm8gZm9yIHRoZSBmZWF0dXJlIHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZmVhdHVyZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhYm91dCBpbmZvIGZvciB0aGUgZmVhdHVyZSB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAgIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZmVhdHVyZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEFib3V0SW5mbyBmaW5kRmVhdHVyZShTdHJpbmcgZmVhdHVyZUlkKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLSAgICAgICAgQWJvdXRJbmZvW10gZmVhdHVyZXMgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldEZlYXR1cmVJbmZvcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBBYm91dEluZm8gaW5mbyA9IGZlYXR1cmVzW2ldOwotICAgICAgICAgICAgaWYgKGluZm8uZ2V0RmVhdHVyZUlkKCkuZXF1YWxzKGZlYXR1cmVJZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyB0aGUgd2VsY29tZSBwYWdlIGZvciBhIGZlYXR1cmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZlYXR1cmUgdGhlIGFib3V0IGluZm8gZm9yIHRoZSBmZWF0dXJlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzZnVsLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG9wZW5XZWxjb21lUGFnZShBYm91dEluZm8gZmVhdHVyZSkgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gbnVsbDsKLQotICAgICAgICAvLyBTZWUgaWYgdGhlIGZlYXR1cmUgd2FudHMgYSBzcGVjaWZpYyBwZXJzcGVjdGl2ZQotICAgICAgICBTdHJpbmcgcGVyc3BlY3RpdmVJZCA9IGZlYXR1cmUuZ2V0V2VsY29tZVBlcnNwZWN0aXZlSWQoKTsKLQotICAgICAgICBpZiAocGVyc3BlY3RpdmVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBKdXN0IHVzZSB0aGUgY3VycmVudCBwZXJzcGVjdGl2ZSB1bmxlc3Mgb25lIGlzIG5vdCBvcGVuIAotICAgICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB1c2UgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCi0gICAgICAgICAgICBpZiAocGFnZSA9PSBudWxsIHx8IHBhZ2UuZ2V0UGVyc3BlY3RpdmUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGVyc3BlY3RpdmVJZCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGVyc3BlY3RpdmVJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnNob3dQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgd29ya2JlbmNoV2luZG93KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luCi0JCQkJCQkubG9nKCJFcnJvciBvcGVuaW5nIHBlcnNwZWN0aXZlOiAiICsgcGVyc3BlY3RpdmVJZCwgZS5nZXRTdGF0dXMoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFnZSA9PSBudWxsKSB7Ci0gICAgICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHBhZ2Uuc2V0RWRpdG9yQXJlYVZpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGlucHV0Ci0gICAgICAgIFdlbGNvbWVFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBXZWxjb21lRWRpdG9ySW5wdXQoZmVhdHVyZSk7Ci0KLSAgICAgICAgLy8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHdlbGNvbWUgZWRpdG9yegotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmZpbmRFZGl0b3IoaW5wdXQpOwotICAgICAgICBpZiAoZWRpdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUoZWRpdG9yKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgRURJVE9SX0lEKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luCi0gICAgICAgICAgICAgICAgICAgIC5sb2coIkVycm9yIG9wZW5pbmcgd2VsY29tZSBlZGl0b3IgZm9yIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldEZlYXR1cmVJZCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKAotICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwKLSAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuUXVpY2tTdGFydEFjdGlvbl9vcGVuRWRpdG9yRXhjZXB0aW9uLCBlKTsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX29wZW5FZGl0b3JFcnJvckRpYWxvZ1RpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9vcGVuRWRpdG9yRXJyb3JEaWFsb2dNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBY3Rpb25GYWN0b3J5LklXb3JrYmVuY2hBY3Rpb24uCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB3b3JrYmVuY2hXaW5kb3cgPSBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1JlYWRPbmx5U3RhdGVDaGVja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvUmVhZE9ubHlTdGF0ZUNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0N2ZiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvUmVhZE9ubHlTdGF0ZUNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLQotLyoqCi0gKiBUaGUgUmVhZE9ubHlTdGF0ZUNoZWNrZXIgaXMgYSBoZWxwZXIgY2xhc3MgdGhhdCB0YWtlcyBhIHNldCBvZiByZXNvdXJjZQotICogc29tZSBvZiB3aGljaCBtYXkgYmUgcmVhZCBvbmx5IGFuZCBxdWVyaWVzIHRoZSB1c2VyIGFzIHRvIHdoZXRoZXIgb3IKLSAqIG5vdCB0aGV5IHdpc2ggdG8gY29udGludWUgdGhlIG9wZXJhdGlvbiBvbiBpdC4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5U3RhdGVDaGVja2VyIHsKLSAgICBwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGVNZXNzYWdlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFpbk1lc3NhZ2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4geWVzVG9BbGxTZWxlY3RlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhbmNlbFNlbGVjdGVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlTGlua2VkUmVzb3VyY2VzID0gZmFsc2U7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgUkVBRF9PTkxZX0VYQ0VQVElPTl9NRVNTQUdFID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUmVhZE9ubHlDaGVja19wcm9ibGVtczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBjaGVja2VyIHRoYXQgcGFyZW50cyB0aGUgZGlhbG9nIG9mZiBvZiBwYXJlbnQgdXNpbmcgdGhlIHN1cHBsaWVkCi0gICAgICogdGl0bGUgYW5kIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgc2hlbGwgdXNlZCBmb3IgZGlhbG9ncwotICAgICAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUgZm9yIGRpYWxvZ3MKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBmb3IgYSBkaWFsb2cgLSB0aGlzIHdpbGwgYmUgcHJlZmFjZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIFJlYWRPbmx5U3RhdGVDaGVja2VyKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB0aGlzLnNoZWxsID0gcGFyZW50OwotICAgICAgICB0aGlzLnRpdGxlTWVzc2FnZSA9IHRpdGxlOwotICAgICAgICB0aGlzLm1haW5NZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBhbiBpbmRpdmlkdWFsIHJlc291cmNlIHRvIHNlZSBpZiBpdCBwYXNzZWQgdGhlIHJlYWQgb25seSBxdWVyeS4gSWYgaXQgaXMgYSBmaWxlCi0gICAgICoganVzdCBhZGQgaXQsIG90aGVyd2lzZSBpdCBpcyBhIGNvbnRhaW5lciBhbmQgdGhlIGNoaWxkcmVuIG5lZWQgdG8gYmUgY2hlY2tlZCB0b28uCi0gICAgICogUmV0dXJuIHRydWUgaWYgYWxsIGl0ZW1zIGFyZSBzZWxlY3RlZCBhbmQgZmFsc2UgaWYgYW55IGFyZSBza2lwcGVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0FjY2VwdGVkUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlVG9DaGVjaywKLSAgICAgICAgICAgIExpc3Qgc2VsZWN0ZWRDaGlsZHJlbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChyZXNvdXJjZVRvQ2hlY2suZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotICAgICAgICAgICAgc2VsZWN0ZWRDaGlsZHJlbi5hZGQocmVzb3VyY2VUb0NoZWNrKTsKLSAgICAgICAgZWxzZSBpZiAoZ2V0SWdub3JlTGlua2VkUmVzb3VyY2VzKCkgJiYgcmVzb3VyY2VUb0NoZWNrLmlzTGlua2VkKCkpIHsKLSAgICAgICAgICAgIHNlbGVjdGVkQ2hpbGRyZW4uYWRkKHJlc291cmNlVG9DaGVjayk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgIAlJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSByZXNvdXJjZVRvQ2hlY2s7Ci0gICAgICAgIAkvLyBpZiB0aGUgcHJvamVjdCBpcyBjbG9zZWQsIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gY2hlY2tpbmcKLSAgICAgICAgCS8vIGl0J3MgY2hpbGRyZW4uICBidWcgOTk4NTgKLQkJCWlmIChjb250YWluZXIuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkvLyBOb3cgY2hlY2sgYmVsb3cKLQkJCQlpbnQgY2hpbGRDaGVjayA9IGNoZWNrUmVhZE9ubHlSZXNvdXJjZXMoY29udGFpbmVyLm1lbWJlcnMoKSwKLQkJCQkJCXNlbGVjdGVkQ2hpbGRyZW4pOwotCQkJCS8vIEFkZCBpbiB0aGUgcmVzb3VyY2Ugb25seSBpZiBub3RoaW5nIHdhcyBsZWZ0IG91dAotCQkJCWlmIChjaGlsZENoZWNrID09IElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCkKLQkJCQkJc2VsZWN0ZWRDaGlsZHJlbi5hZGQocmVzb3VyY2VUb0NoZWNrKTsKLQkJCQllbHNlCi0JCQkJCS8vIFNvbWV0aGluZyB3YXMgbGVmdCBvdXQgLSByZXR1cm4gZmFsc2UKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RlZENoaWxkcmVuLmFkZChyZXNvdXJjZVRvQ2hlY2spOwotCQkJfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHN1cHBsaWVkIHJlc291cmNlcyB0byBzZWUgaWYgdGhleSBhcmUgcmVhZCBvbmx5LiBJZiBzbyB0aGVuCi0JICogcHJvbXB0IHRoZSB1c2VyIHRvIHNlZSBpZiB0aGV5IGNhbiBiZSBkZWxldGVkLlJldHVybiB0aG9zZSB0aGF0IHdlcmUKLQkgKiBhY2NlcHRlZC4KLQkgKiAKLSAgICAgKiBAcGFyYW0gaXRlbXNUb0NoZWNrCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0aW5nIHNlbGVjdGVkIHJlc291cmNlcwotICAgICAqLwotICAgIHB1YmxpYyBJUmVzb3VyY2VbXSBjaGVja1JlYWRPbmx5UmVzb3VyY2VzKElSZXNvdXJjZVtdIGl0ZW1zVG9DaGVjaykgewotCi0gICAgICAgIExpc3Qgc2VsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gY2hlY2tSZWFkT25seVJlc291cmNlcyhpdGVtc1RvQ2hlY2ssIHNlbGVjdGlvbnMpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgc2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgUkVBRF9PTkxZX0VYQ0VQVElPTl9NRVNTQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzdWx0ID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBJUmVzb3VyY2VbMF07Ci0KLSAgICAgICAgLy9BbGwgd2VyZSBzZWxlY3RlZCBzbyByZXR1cm4gdGhlIG9yaWdpbmFsIGl0ZW1zCi0gICAgICAgIGlmIChyZXN1bHQgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lEKQotICAgICAgICAgICAgcmV0dXJuIGl0ZW1zVG9DaGVjazsKLQotICAgICAgICBJUmVzb3VyY2VbXSByZXR1cm5WYWx1ZSA9IG5ldyBJUmVzb3VyY2Vbc2VsZWN0aW9ucy5zaXplKCldOwotICAgICAgICBzZWxlY3Rpb25zLnRvQXJyYXkocmV0dXJuVmFsdWUpOwotICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIGNoaWxkcmVuIG9mIHRoZSBjb250YWluZXIgdG8gc2VlIGlmIHRoZXkgYXJlIHJlYWQgb25seS4KLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqIG9uZSBvZgotICAgICAqIAlZRVNfVE9fQUxMX0lEIC0gYWxsIGVsZW1lbnRzIHdlcmUgc2VsZWN0ZWQKLSAgICAgKiAJTk9fSUQgLSBObyB3YXMgaGl0IGF0IHNvbWUgcG9pbnQKLSAgICAgKiAJQ0FOQ0VMX0lEIC0gY2FuY2VsIHdhcyBoaXQKLSAgICAgKiBAcGFyYW0gaXRlbXNUb0NoZWNrIElSZXNvdXJjZVtdCi0gICAgICogQHBhcmFtIGFsbFNlbGVjdGVkIHRoZSBMaXN0IG9mIGN1cnJlbnRseSBzZWxlY3RlZCByZXNvdXJjZXMgdG8gYWRkIHRvLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGNoZWNrUmVhZE9ubHlSZXNvdXJjZXMoSVJlc291cmNlW10gaXRlbXNUb0NoZWNrLAotICAgICAgICAgICAgTGlzdCBhbGxTZWxlY3RlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgIC8vU2hvcnRjdXQuIElmIHRoZSB1c2VyIGhhcyBhbHJlYWR5IHNlbGVjdGVkIHllcyB0byBhbGwgdGhlbiBqdXN0IHJldHVybiBpdAotICAgICAgICBpZiAoeWVzVG9BbGxTZWxlY3RlZCkKLSAgICAgICAgICAgIHJldHVybiBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQ7Ci0KLSAgICAgICAgYm9vbGVhbiBub25lU2tpcHBlZCA9IHRydWU7Ci0gICAgICAgIExpc3Qgc2VsZWN0ZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zVG9DaGVjay5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlVG9DaGVjayA9IGl0ZW1zVG9DaGVja1tpXTsKLSAgICAgICAgICAgIFJlc291cmNlQXR0cmlidXRlcyBjaGVja0F0dHJpYnV0ZXMgPSByZXNvdXJjZVRvQ2hlY2suZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBpZiAoIXllc1RvQWxsU2VsZWN0ZWQgJiYgc2hvdWxkQ2hlY2socmVzb3VyY2VUb0NoZWNrKQotICAgICAgICAgICAgCQkmJiBjaGVja0F0dHJpYnV0ZXMhPW51bGwKLSAgICAgICAgICAgIAkJJiYgY2hlY2tBdHRyaWJ1dGVzLmlzUmVhZE9ubHkoKSkgewotICAgICAgICAgICAgICAgIGludCBhY3Rpb24gPSBxdWVyeVllc1RvQWxsTm9DYW5jZWwocmVzb3VyY2VUb0NoZWNrKTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IElEaWFsb2dDb25zdGFudHMuWUVTX0lEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hpbGRSZXN1bHQgPSBjaGVja0FjY2VwdGVkUmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VUb0NoZWNrLCBzZWxlY3RlZENoaWxkcmVuKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZFJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vbmVTa2lwcGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gSURpYWxvZ0NvbnN0YW50cy5OT19JRCkKLSAgICAgICAgICAgICAgICAgICAgbm9uZVNraXBwZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmNlbFNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCkgewotICAgICAgICAgICAgICAgICAgICB5ZXNUb0FsbFNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaGlsZHJlbi5hZGQocmVzb3VyY2VUb0NoZWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hpbGRSZXN1bHQgPSBjaGVja0FjY2VwdGVkUmVzb3VyY2UocmVzb3VyY2VUb0NoZWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaGlsZHJlbik7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbmNlbFNlbGVjdGVkKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQ7Ci0gICAgICAgICAgICAgICAgaWYgKCFjaGlsZFJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgbm9uZVNraXBwZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5vbmVTa2lwcGVkKQotICAgICAgICAgICAgcmV0dXJuIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRDsKLSAgICAgICBhbGxTZWxlY3RlZC5hZGRBbGwoc2VsZWN0ZWRDaGlsZHJlbik7Ci0gICAgICAgcmV0dXJuIElEaWFsb2dDb25zdGFudHMuTk9fSUQ7Ci0KLSAgICB9Ci0KLSAgICAvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHJlc291cmNlIHNob3VsZCBiZSBjaGVja2VkIGZvciByZWFkLW9ubHkgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlVG9DaGVjayB0aGUgcmVzb3VyY2UgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIGNoZWNrIGl0LCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gc2tpcCBpdAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRDaGVjayhJUmVzb3VyY2UgcmVzb3VyY2VUb0NoZWNrKSB7Ci0gICAgICAgIGlmIChpZ25vcmVMaW5rZWRSZXNvdXJjZXMpIHsKLSAgICAgICAgCWlmIChyZXNvdXJjZVRvQ2hlY2suaXNMaW5rZWQoKSkKLSAgICAgICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0JLyoqCi0gICAgICogT3BlbiBhIG1lc3NhZ2UgZGlhbG9nIHdpdGggWWVzIE5vLCBZZXMgVG8gQWxsIGFuZCBDYW5jZWwgYnV0dG9ucy4gUmV0dXJuIHRoZQotICAgICAqIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiBAcmV0dXJuIGludCAKLSAgICAgKglvbmUgb2YKLSAgICAgKgkJWUVTX1RPX0FMTF9JRAotICAgICAqCQlZRVNfSUQKLSAgICAgKgkJTk9fSUQKLSAgICAgKgkJQ0FOQ0VMX0lECi0gICAgICogCQkKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgLSB0aGUgcmVzb3VyY2UgYmVpbmcgcXVlcmllZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBxdWVyeVllc1RvQWxsTm9DYW5jZWwoSVJlc291cmNlIHJlc291cmNlKSB7Ci0KLSAgICAgICAgZmluYWwgTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyh0aGlzLnNoZWxsLAotICAgICAgICAgICAgICAgIHRoaXMudGl0bGVNZXNzYWdlLCBudWxsLCBNZXNzYWdlRm9ybWF0LmZvcm1hdCh0aGlzLm1haW5NZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgcmVzb3VyY2UuZ2V0TmFtZSgpIH0pLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsKLSAgICAgICAgc2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5nZXRSZXR1cm5Db2RlKCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBJRGlhbG9nQ29uc3RhbnRzLllFU19JRDsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAxKQotICAgICAgICAgICAgcmV0dXJuIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRDsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAyKQotICAgICAgICAgICAgcmV0dXJuIElEaWFsb2dDb25zdGFudHMuTk9fSUQ7Ci0gICAgICAgIHJldHVybiBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGlnbm9yZSBsaW5rZWQgcmVzb3VyY2VzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaWdub3JlIGxpbmtlZCByZXNvdXJjZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBjb25zaWRlciB0aGVtCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldElnbm9yZUxpbmtlZFJlc291cmNlcygpIHsKLSAgICAJcmV0dXJuIGlnbm9yZUxpbmtlZFJlc291cmNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gaWdub3JlIGxpbmtlZCByZXNvdXJjZXMuCi0gICAgICogVGhlIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZ25vcmUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaWdub3JlIGxpbmtlZCByZXNvdXJjZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBjb25zaWRlciB0aGVtCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUxpbmtlZFJlc291cmNlcyhib29sZWFuIGlnbm9yZSkgewotICAgIAlpZ25vcmVMaW5rZWRSZXNvdXJjZXMgPSBpZ25vcmU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1JlZnJlc2hBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9SZWZyZXNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDdlZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1JlZnJlc2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUnVsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLklERVJlc291cmNlSW5mb1V0aWxzOwotCi0vKioKLSAqIFN0YW5kYXJkIGFjdGlvbiBmb3IgcmVmcmVzaGluZyB0aGUgd29ya3NwYWNlIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIGZvcgotICogdGhlIHNlbGVjdGVkIHJlc291cmNlcyBhbmQgYWxsIG9mIHRoZWlyIGRlc2NlbmRlbnRzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaEFjdGlvbiBleHRlbmRzIFdvcmtzcGFjZUFjdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgaWQgb2YgdGhpcyBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBQbGF0Zm9ybVVJLlBMVUdJTl9JRCArICIuUmVmcmVzaEFjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogICAgICAgICAgICB0aGUgc2hlbGwgZm9yIGFueSBkaWFsb2dzCi0JICovCi0JcHVibGljIFJlZnJlc2hBY3Rpb24oU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIoc2hlbGwsIElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlZnJlc2hBY3Rpb25fdGV4dCk7Ci0JCXNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlZnJlc2hBY3Rpb25fdG9vbFRpcCk7Ci0JCXNldElkKElEKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5SRUZSRVNIX0FDVElPTik7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHByb2plY3QncyBsb2NhdGlvbiBoYXMgYmVlbiBkZWxldGVkLiBJZiBzbywKLQkgKiBwcm9tcHRzIHRoZSB1c2VyIHdpdGggd2hldGhlciB0byBkZWxldGUgdGhlIHByb2plY3Qgb3Igbm90LgotCSAqLwotCXZvaWQgY2hlY2tMb2NhdGlvbkRlbGV0ZWQoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCUlGaWxlSW5mbyBsb2NhdGlvbiA9IElERVJlc291cmNlSW5mb1V0aWxzLmdldEZpbGVJbmZvKHByb2plY3QKLQkJCQkuZ2V0TG9jYXRpb25VUkkoKSk7Ci0JCWlmICghbG9jYXRpb24uZXhpc3RzKCkpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLlJlZnJlc2hBY3Rpb25fbG9jYXRpb25EZWxldGVkTWVzc2FnZSwKLQkJCQkJcHJvamVjdC5nZXROYW1lKCksIGxvY2F0aW9uLnRvU3RyaW5nKCkpOwotCi0JCQlmaW5hbCBNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksCi0JCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLlJlZnJlc2hBY3Rpb25fZGlhbG9nVGl0bGUsIC8vIGRpYWxvZwotCQkJCQkJCQkJCQkJCQkJCQkvLyB0aXRsZQotCQkJCQludWxsLCAvLyB1c2UgZGVmYXVsdCB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW10gewotCQkJCQkJCUlEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotCQkJCQkJCUlEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwgfSwgMCk7IC8vIHllcyBpcyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkvLyBkZWZhdWx0Ci0KLQkJCS8vIE11c3QgcHJvbXB0IHVzZXIgaW4gVUkgdGhyZWFkICh3ZSdyZSBpbiB0aGUgb3BlcmF0aW9uIHRocmVhZAotCQkJLy8gaGVyZSkuCi0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCX0KLQkJCX0pOwotCi0JCQkvLyBEbyB0aGUgZGVsZXRpb24gYmFjayBpbiB0aGUgb3BlcmF0aW9uIHRocmVhZAotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gMCkgeyAvLyB5ZXMgd2FzIGNob3NlbgotCQkJCXByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBXb3Jrc3BhY2VBY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyYXRpb25NZXNzYWdlKCkgewotCQlyZXR1cm4gSURFV29ya2JlbmNoTWVzc2FnZXMuUmVmcmVzaEFjdGlvbl9wcm9ncmVzc01lc3NhZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBXb3Jrc3BhY2VBY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9ibGVtc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZWZyZXNoQWN0aW9uX3Byb2JsZW1NZXNzYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gV29ya3NwYWNlQWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvYmxlbXNUaXRsZSgpIHsKLQkJcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlZnJlc2hBY3Rpb25fcHJvYmxlbVRpdGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHdvcmtzcGFjZSByb290IGlmIHRoZSBzZWxlY3Rpb24gd291bGQKLQkgKiBvdGhlcndpc2UgYmUgZW1wdHkuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgcmVzb3VyY2VzID0gc3VwZXIuZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLQkJaWYgKHJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCXJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJlc291cmNlcy5hZGQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFdvcmtzcGFjZUFjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnZva2VPcGVyYXRpb24oSVJlc291cmNlIHJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIENoZWNrIGlmIHByb2plY3QncyBsb2NhdGlvbiBoYXMgYmVlbiBkZWxldGVkLAotCQkvLyBhcyBwZXIgMUc4M1VDRTogSVRQVUk6V0lOTlQgLSBSZWZyZXNoIGZyb20gbG9jYWwgZG9lc24ndCBkZXRlY3QgbmV3Ci0JCS8vIG9yIGRlbGV0ZWQgcHJvamVjdHMKLQkJLy8gYW5kIGFsc28gZm9yIGJ1ZyByZXBvcnQgIzE4MjgzCi0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCWNoZWNrTG9jYXRpb25EZWxldGVkKChJUHJvamVjdCkgcmVzb3VyY2UpOwotCQl9IGVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUk9PVCkgewotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9ICgoSVdvcmtzcGFjZVJvb3QpIHJlc291cmNlKS5nZXRQcm9qZWN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCWNoZWNrTG9jYXRpb25EZWxldGVkKHByb2plY3RzW2ldKTsKLQkJCX0KLQkJfQotCQlyZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+UmVmcmVzaEFjdGlvbjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotCSAqIDxjb2RlPlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uPC9jb2RlPiBtZXRob2QgZW5zdXJlcyB0aGF0IHRoaXMgYWN0aW9uIGlzCi0JICogZW5hYmxlZCBpZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5LCBidXQgaXMgZGlzYWJsZWQgaWYgYW55IG9mIHRoZSBzZWxlY3RlZAotCSAqIGVsZW1lbnRzIGFyZSBub3QgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7Ci0JCXJldHVybiAoc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpIHx8IHMuaXNFbXB0eSgpKQotCQkJCSYmIGdldFNlbGVjdGVkTm9uUmVzb3VyY2VzKCkuc2l6ZSgpID09IDA7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBrZXkgcmVsZWFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUtleVJlbGVhc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkY1ICYmIGV2ZW50LnN0YXRlTWFzayA9PSAwKSB7Ci0JCQlyZWZyZXNoQWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEFsbCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJc2VsZWN0aW9uQ2hhbmdlZChTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJcnVuKCk7Ci0JCXNlbGVjdGlvbkNoYW5nZWQoY3VycmVudFNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uOyBvdmVycmlkZXMgbWV0aG9kIG9uCi0JICogV29ya3NwYWNlQWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBudWxsOwotCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBmYWN0b3J5ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpCi0JCQkJLmdldFJ1bGVGYWN0b3J5KCk7Ci0JCUl0ZXJhdG9yIHJlc291cmNlcyA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHJlc291cmNlcy5oYXNOZXh0KCkpIHsKLQkJCXJ1bGUgPSBNdWx0aVJ1bGUuY29tYmluZShydWxlLCBmYWN0b3J5Ci0JCQkJCS5yZWZyZXNoUnVsZSgoSVJlc291cmNlKSByZXNvdXJjZXMubmV4dCgpKSk7Ci0JCX0KLQkJcnVuSW5CYWNrZ3JvdW5kKHJ1bGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9SZW5hbWVSZXNvdXJjZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZDEwMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVHJlZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci0KLS8qKgotICogU3RhbmRhcmQgYWN0aW9uIGZvciByZW5hbWluZyB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVuYW1lUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBXb3Jrc3BhY2VBY3Rpb24gewotCi0gICAgLypUaGUgdHJlZSBlZGl0aW5nIHdpZGdldHMuIElmIHRyZWVFZGl0b3IgaXMgbnVsbCB0aGVuIGVkaXQgdXNpbmcgdGhlCi0gICAgIGRpYWxvZy4gV2Uga2VlcCB0aGUgZWRpdG9yVGV4dCBhcm91bmQgc28gdGhhdCB3ZSBjYW4gY2xvc2UgaXQgaWYKLSAgICAgYSBuZXcgc2VsZWN0aW9uIGlzIG1hZGUuICovCi0gICAgcHJpdmF0ZSBUcmVlRWRpdG9yIHRyZWVFZGl0b3I7Ci0KLSAgICBwcml2YXRlIFRyZWUgbmF2aWdhdG9yVHJlZTsKLQotICAgIHByaXZhdGUgVGV4dCB0ZXh0RWRpdG9yOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgdGV4dEVkaXRvclBhcmVudDsKLQotICAgIHByaXZhdGUgVGV4dEFjdGlvbkhhbmRsZXIgdGV4dEFjdGlvbkhhbmRsZXI7Ci0KLSAgICAvL1RoZSByZXNvdXJjZSBiZWluZyBlZGl0ZWQgaWYgdGhpcyBpcyBiZWluZyBkb25lIGlubGluZQotICAgIHByaXZhdGUgSVJlc291cmNlIGlubGluZWRSZXNvdXJjZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBzYXZpbmcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBpZCBvZiB0aGlzIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IFBsYXRmb3JtVUkuUExVR0lOX0lECi0gICAgICAgICAgICArICIuUmVuYW1lUmVzb3VyY2VBY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBuZXcgcGF0aC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElQYXRoIG5ld1BhdGg7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfUkVOQU1FX1RJVExFID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUmVuYW1lUmVzb3VyY2VBY3Rpb25fY2hlY2tUaXRsZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19SRU5BTUVfTUVTU0FHRSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlbmFtZVJlc291cmNlQWN0aW9uX3JlYWRPbmx5Q2hlY2s7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfRVhJU1RTX1RJVExFID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUmVuYW1lUmVzb3VyY2VBY3Rpb25fcmVzb3VyY2VFeGlzdHM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfRVhJU1RTX01FU1NBR0UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZW5hbWVSZXNvdXJjZUFjdGlvbl9vdmVyd3JpdGVRdWVzdGlvbjsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBSRU5BTUlOR19NRVNTQUdFID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUmVuYW1lUmVzb3VyY2VBY3Rpb25fcHJvZ3Jlc3NNZXNzYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhY3Rpb24uIFVzaW5nIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkgd2lsbCByZW5hbWUgdXNpbmcgYQotICAgICAqIGRpYWxvZyByYXRoZXIgdGhhbiB0aGUgaW5saW5lIGVkaXRvciBvZiBhIFJlc291cmNlTmF2aWdhdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbCBmb3IgYW55IGRpYWxvZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVuYW1lUmVzb3VyY2VBY3Rpb24oU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgc3VwZXIoc2hlbGwsIElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlbmFtZVJlc291cmNlQWN0aW9uX3RleHQpOwotICAgICAgICBzZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5SZW5hbWVSZXNvdXJjZUFjdGlvbl90b29sVGlwKTsKLSAgICAgICAgc2V0SWQoSUQpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJSUlERUhlbHBDb250ZXh0SWRzLlJFTkFNRV9SRVNPVVJDRV9BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbCBmb3IgYW55IGRpYWxvZ3MKLSAgICAgKiBAcGFyYW0gdHJlZSB0aGUgdHJlZQotICAgICAqLwotICAgIHB1YmxpYyBSZW5hbWVSZXNvdXJjZUFjdGlvbihTaGVsbCBzaGVsbCwgVHJlZSB0cmVlKSB7Ci0gICAgICAgIHRoaXMoc2hlbGwpOwotICAgICAgICB0aGlzLm5hdmlnYXRvclRyZWUgPSB0cmVlOwotICAgICAgICB0aGlzLnRyZWVFZGl0b3IgPSBuZXcgVHJlZUVkaXRvcih0cmVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgdXNlciB3aXNoZXMgdG8gb3ZlcndyaXRlIHRoZSBzdXBwbGllZCByZXNvdXJjZQotICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbm8gY29sbGlzaW9uIG9yIGRlbGV0ZSB3YXMgc3VjY2Vzc2Z1bAotICAgICAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgdG8gY3JlYXRlIHRoZSBkaWFsb2cgaW4gCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIC0gdGhlIHJlc291cmNlIHRvIGJlIG92ZXJ3cml0dGVuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrT3ZlcndyaXRlKGZpbmFsIFNoZWxsIHNoZWxsLAotICAgICAgICAgICAgZmluYWwgSVJlc291cmNlIGRlc3RpbmF0aW9uKSB7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuWzFdOwotCi0gICAgICAgIC8vUnVuIGl0IGluc2lkZSBvZiBhIHJ1bm5hYmxlIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgdG8gcGFyZW50IG9mZiBvZiB0aGUgc2hlbGwgYXMgd2UgYXJlIG5vdAotICAgICAgICAvL2luIHRoZSBVSSB0aHJlYWQuCi0KLSAgICAgICAgUnVubmFibGUgcXVlcnkgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGhOYW1lID0gZGVzdGluYXRpb24uZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0WzBdID0gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oc2hlbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRV9FWElTVFNfVElUTEUsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRV9FWElTVFNfTUVTU0FHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgcGF0aE5hbWUgfSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0KLSAgICAgICAgc2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKHF1ZXJ5KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdFswXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgc3VwcGxpZWQgcmVzb3VyY2UgaXMgcmVhZCBvbmx5IG9yIG51bGwuIElmIGl0IGlzIHRoZW4gYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2FudAotICAgICAqIHRvIGNvbnRpbnVlLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaXMgbm90IHJlYWQgb25seSBvciBpZiB0aGUgdXNlciBoYXMgZ2l2ZW4KLSAgICAgKiBwZXJtaXNzaW9uLgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1JlYWRPbmx5QW5kTnVsbChJUmVzb3VyY2UgY3VycmVudFJlc291cmNlKSB7Ci0gICAgICAgIC8vRG8gYSBxdWljayByZWFkIG9ubHkgYW5kIG51bGwgY2hlY2sKLSAgICAgICAgaWYgKGN1cnJlbnRSZXNvdXJjZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vRG8gYSBxdWljayByZWFkIG9ubHkgY2hlY2sKLSAgICAgICAgaWYgKGN1cnJlbnRSZXNvdXJjZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5pc1JlYWRPbmx5KCkpCi0gICAgICAgICAgICByZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0U2hlbGwoKSwgQ0hFQ0tfUkVOQU1FX1RJVExFLAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0LmZvcm1hdChDSEVDS19SRU5BTUVfTUVTU0FHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBjdXJyZW50UmVzb3VyY2UuZ2V0TmFtZSgpIH0pKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIENvbXBvc2l0ZSBjcmVhdGVQYXJlbnQoKSB7Ci0gICAgICAgIFRyZWUgdHJlZSA9IGdldFRyZWUoKTsKLSAgICAgICAgQ29tcG9zaXRlIHJlc3VsdCA9IG5ldyBDb21wb3NpdGUodHJlZSwgU1dULk5PTkUpOwotICAgICAgICBUcmVlSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbigpOwotICAgICAgICB0cmVlRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLSAgICAgICAgdHJlZUVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0gICAgICAgIHRyZWVFZGl0b3Iuc2V0RWRpdG9yKHJlc3VsdCwgc2VsZWN0ZWRJdGVtc1swXSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT24gTWFjIHRoZSB0ZXh0IHdpZGdldCBhbHJlYWR5IHByb3ZpZGVzIGEgYm9yZGVyIHdoZW4gaXQgaGFzIGZvY3VzLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGRyYXcgYW5vdGhlciBvbmUuCi0gICAgICogVGhlIHZhbHVlIG9mIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIHVzZCB0byBjb250cm9sIHRoZSBpbnNldCB3ZSBhcHBseSB0byB0aGUgdGV4dCBmaWVsZCBib3VuZCdzIGluIG9yZGVyIHRvIGdldCBzcGFjZSBmb3IgZHJhd2luZyBhIGJvcmRlci4KLSAgICAgKiBBIHZhbHVlIG9mIDEgbWVhbnMgYSBvbmUtcGl4ZWwgd2lkZSBib3JkZXIgYXJvdW5kIHRoZSB0ZXh0IGZpZWxkLiBBIG5lZ2F0aXZlIHZhbHVlIHN1cHJlc3NlcyB0aGUgYm9yZGVyLgotICAgICAqIEhvd2V2ZXIsIGluIE05IHRoZSBzeXN0ZW0gcHJvcGVydHkgIm9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24ubm9Gb2N1c1JpbmciIGhhcyBiZWVuIGludHJvZHVjZWQKLSAgICAgKiBhcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBidWcgIzI4ODQyLiBUaGUgZXhpc3RlbmNlIG9mIHRoZSBwcm9wZXJ0eSB0dXJucyB0aGUgbmF0aXZlIGZvY3VzIHJpbmcgb2ZmCi0gICAgICogaWYgdGhlIHdpZGdldCBpcyBjb250YWluZWQgaW4gYSBtYWluIHdpbmRvdyAobm90IGRpYWxvZykuCi0gICAgICogVGhlIGNoZWNrIGZvciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgYSBmaW5hbCBmaXggZm9yICMyODg0MiBoYXMgYmVlbiBwcm92aWRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0Q2VsbEVkaXRvckluc2V0KENvbnRyb2wgYykgewotICAgICAgICBpZiAoImNhcmJvbiIuZXF1YWxzKFNXVC5nZXRQbGF0Zm9ybSgpKSkgeyAvLyBzcGVjaWFsIGNhc2UgZm9yIE1hY09TIFggLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKFN5c3RlbQotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24ubm9Gb2N1c1JpbmciKSA9PSBudWxsIHx8IGMuZ2V0U2hlbGwoKS5nZXRQYXJlbnQoKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0yOyAvLyBuYXRpdmUgYm9yZGVyCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7IC8vICBvbmUgcGl4ZWwgd2lkZSBibGFjayBib3JkZXIKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRleHQgZWRpdG9yIHdpZGdldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIHJlbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUZXh0RWRpdG9yKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICAvLyBDcmVhdGUgdGV4dCBlZGl0b3IgcGFyZW50LiAgVGhpcyBkcmF3cyBhIG5pY2UgYm91bmRpbmcgcmVjdC4KLSAgICAgICAgdGV4dEVkaXRvclBhcmVudCA9IGNyZWF0ZVBhcmVudCgpOwotICAgICAgICB0ZXh0RWRpdG9yUGFyZW50LnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICBmaW5hbCBpbnQgaW5zZXQgPSBnZXRDZWxsRWRpdG9ySW5zZXQodGV4dEVkaXRvclBhcmVudCk7Ci0gICAgICAgIGlmIChpbnNldCA+IDApIC8vIG9ubHkgcmVnaXN0ZXIgZm9yIHBhaW50IGV2ZW50cyBpZiB3ZSBoYXZlIGEgYm9yZGVyCi0gICAgICAgICAgICB0ZXh0RWRpdG9yUGFyZW50LmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgdGV4dFNpemUgPSB0ZXh0RWRpdG9yLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgcGFyZW50U2l6ZSA9IHRleHRFZGl0b3JQYXJlbnQuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBlLmdjLmRyYXdSZWN0YW5nbGUoMCwgMCwgTWF0aC5taW4odGV4dFNpemUueCArIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50U2l6ZS54IC0gMSksIHBhcmVudFNpemUueSAtIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAvLyBDcmVhdGUgaW5uZXIgdGV4dCBlZGl0b3IuCi0gICAgICAgIHRleHRFZGl0b3IgPSBuZXcgVGV4dCh0ZXh0RWRpdG9yUGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHRleHRFZGl0b3Iuc2V0Rm9udChuYXZpZ2F0b3JUcmVlLmdldEZvbnQoKSk7Ci0gICAgICAgIHRleHRFZGl0b3JQYXJlbnQuc2V0QmFja2dyb3VuZCh0ZXh0RWRpdG9yLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgIHRleHRFZGl0b3IuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFBvaW50IHRleHRTaXplID0gdGV4dEVkaXRvci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICB0ZXh0U2l6ZS54ICs9IHRleHRTaXplLnk7IC8vIEFkZCBleHRyYSBzcGFjZSBmb3IgbmV3IGNoYXJhY3RlcnMuCi0gICAgICAgICAgICAgICAgUG9pbnQgcGFyZW50U2l6ZSA9IHRleHRFZGl0b3JQYXJlbnQuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIHRleHRFZGl0b3Iuc2V0Qm91bmRzKDIsIGluc2V0LCBNYXRoLm1pbih0ZXh0U2l6ZS54LAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50U2l6ZS54IC0gNCksIHBhcmVudFNpemUueSAtIDIgKiBpbnNldCk7Ci0gICAgICAgICAgICAgICAgdGV4dEVkaXRvclBhcmVudC5yZWRyYXcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRleHRFZGl0b3IuYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCi0gICAgICAgICAgICAgICAgLy9Xb3JrYXJvdW5kIGZvciBCdWcgMjAyMTQgZHVlIHRvIGV4dHJhCi0gICAgICAgICAgICAgICAgLy90cmF2ZXJzZSBldmVudHMKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotICAgICAgICAgICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLSAgICAgICAgICAgICAgICAgICAgLy9EbyBub3RoaW5nIGluIHRoaXMgY2FzZQotICAgICAgICAgICAgICAgICAgICBkaXNwb3NlVGV4dFdpZGdldCgpOwotICAgICAgICAgICAgICAgICAgICBldmVudC5kb2l0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLSAgICAgICAgICAgICAgICAgICAgc2F2ZUNoYW5nZXNBbmREaXNwb3NlKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQuZG9pdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IFNXVC5UUkFWRVJTRV9OT05FOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0ZXh0RWRpdG9yLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGZlKSB7Ci0gICAgICAgICAgICAgICAgc2F2ZUNoYW5nZXNBbmREaXNwb3NlKHJlc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaWYgKHRleHRBY3Rpb25IYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgICB0ZXh0QWN0aW9uSGFuZGxlci5hZGRUZXh0KHRleHRFZGl0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlIHRoZSB0ZXh0IHdpZGdldCBhbmQgcmVzZXQgdGhlIGVkaXRvclRleHQgZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3Bvc2VUZXh0V2lkZ2V0KCkgewotICAgICAgICBpZiAodGV4dEFjdGlvbkhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHRleHRBY3Rpb25IYW5kbGVyLnJlbW92ZVRleHQodGV4dEVkaXRvcik7Ci0KLSAgICAgICAgaWYgKHRleHRFZGl0b3JQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGV4dEVkaXRvclBhcmVudC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB0ZXh0RWRpdG9yUGFyZW50ID0gbnVsbDsKLSAgICAgICAgICAgIHRleHRFZGl0b3IgPSBudWxsOwotICAgICAgICAgICAgdHJlZUVkaXRvci5zZXRFZGl0b3IobnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0aGF0IHRoZSBhY3Rpb24gaXMgdG8gYmUgcGVyZm9ybWVkIG9uLgotICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgY2FjaGVkIGJ5IHRoZSBhY3Rpb24gYXMgd2UgY2Fubm90IHJlbHkKLSAgICAgKiBvbiB0aGUgc2VsZWN0aW9uIGJlaW5nIGNvcnJlY3QgZm9yIGlubGluZWQgdGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbGlzdCBvZiByZXNvdXJjZSBlbGVtZW50cyAoZWxlbWVudCB0eXBlOiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+KQotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldEFjdGlvblJlc291cmNlcygpIHsKLSAgICAgICAgaWYgKGlubGluZWRSZXNvdXJjZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFjdGlvblJlc291cmNlcygpOwotCi0gICAgICAgIExpc3QgYWN0aW9uUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhY3Rpb25SZXNvdXJjZXMuYWRkKGlubGluZWRSZXNvdXJjZSk7Ci0gICAgICAgIHJldHVybiBhY3Rpb25SZXNvdXJjZXM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXb3Jrc3BhY2VBY3Rpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyYXRpb25NZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoTWVzc2FnZXMuUmVuYW1lUmVzb3VyY2VBY3Rpb25fcHJvZ3Jlc3M7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXb3Jrc3BhY2VBY3Rpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9ibGVtc01lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZW5hbWVSZXNvdXJjZUFjdGlvbl9wcm9ibGVtTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdvcmtzcGFjZUFjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2JsZW1zVGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZW5hbWVSZXNvdXJjZUFjdGlvbl9wcm9ibGVtVGl0bGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBUcmVlIGJlaW5nIGVkaXRlZC4KLSAgICAgKiBAcmV0dXJuVHJlZQotICAgICAqLwotICAgIHByaXZhdGUgVHJlZSBnZXRUcmVlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0b3JUcmVlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV29ya3NwYWNlQWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGludm9rZU9wZXJhdGlvbihJUmVzb3VyY2UgcmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICBtb25pdG9yLmJlZ2luVGFzayhSRU5BTUlOR19NRVNTQUdFLCAxMDApOwotICAgICAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gcmVzb3VyY2UuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0gICAgICAgIElSZXNvdXJjZSBuZXdSZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihuZXdQYXRoKTsKLSAgICAgICAgaWYgKG5ld1Jlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjaGVja092ZXJ3cml0ZShnZXRTaGVsbCgpLCBuZXdSZXNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBuZXdSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0gICAgICAgICAgICAgICAgICAgIElGaWxlIG5ld0ZpbGUgPSAoSUZpbGUpIG5ld1Jlc291cmNlOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVFZGl0KGZpbGUsIG5ld0ZpbGUsIGdldFNoZWxsKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLCA1MCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdGaWxlLnNldENvbnRlbnRzKGZpbGUuZ2V0Q29udGVudHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLktFRVBfSElTVE9SWSwgc3ViTW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZShJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCBzdWJNb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxMDApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBuZXdSZXNvdXJjZS5kZWxldGUoSVJlc291cmNlLktFRVBfSElTVE9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNTApKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMTAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0gICAgICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgZGVzY3JpcHRpb24uc2V0TmFtZShuZXdQYXRoLnNlZ21lbnQoMCkpOwotICAgICAgICAgICAgcHJvamVjdC5tb3ZlKGRlc2NyaXB0aW9uLCBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuU0hBTExPVywKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvcik7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcmVzb3VyY2UubW92ZShuZXdQYXRoLCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIHwgSVJlc291cmNlLlNIQUxMT1csCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNTApKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG5ldyBuYW1lIHRvIGJlIGdpdmVuIHRvIHRoZSB0YXJnZXQgcmVzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIHF1ZXJ5IHN0YXR1cyBvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcXVlcnlOZXdSZXNvdXJjZU5hbWUoZmluYWwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gSURFV29ya2JlbmNoUGx1Z2luLmdldFBsdWdpbldvcmtzcGFjZSgpOwotICAgICAgICBmaW5hbCBJUGF0aCBwcmVmaXggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLSAgICAgICAgSUlucHV0VmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIHN0cmluZykgewotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKHN0cmluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlbmFtZVJlc291cmNlQWN0aW9uX25hbWVNdXN0QmVEaWZmZXJlbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElTdGF0dXMgc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShzdHJpbmcsIHJlc291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmV4aXN0cyhwcmVmaXguYXBwZW5kKHN0cmluZykpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZW5hbWVSZXNvdXJjZUFjdGlvbl9uYW1lRXhpc3RzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBJbnB1dERpYWxvZyBkaWFsb2cgPSBuZXcgSW5wdXREaWFsb2coZ2V0U2hlbGwoKSwgSURFV29ya2JlbmNoTWVzc2FnZXMuUmVuYW1lUmVzb3VyY2VBY3Rpb25faW5wdXREaWFsb2dUaXRsZSwKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZW5hbWVSZXNvdXJjZUFjdGlvbl9pbnB1dERpYWxvZ01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0TmFtZSgpLCB2YWxpZGF0b3IpOwotICAgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIHJldHVybiBkaWFsb2cuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG5ldyBuYW1lIHRvIGJlIGdpdmVuIHRvIHRoZSB0YXJnZXQgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDxjb2RlPgotICAgICAqIGlmIHRoZSBxdWVyeSB3YXMgY2FuY2VsZWQuIFJlbmFtZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlc291cmNlIHVzaW5nIHRoZSB0YWJsZSBlZGl0b3IuIAotICAgICAqIENvbnRpbnVlIHRoZSBhY3Rpb24gd2hlbiB0aGUgdXNlciBpcyBkb25lLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0byByZW5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcXVlcnlOZXdSZXNvdXJjZU5hbWVJbmxpbmUoZmluYWwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0ZXh0IGVkaXRvciBpcyBjcmVhdGVkIG9ubHkgb25jZS4gU2ltcGx5IHJlc2V0IHRleHQgCi0gICAgICAgIC8vIGVkaXRvciB3aGVuIGFjdGlvbiBpcyBleGVjdXRlZCBtb3JlIHRoYW4gb25jZS4gRml4ZXMgYnVnIDIyMjY5LgotICAgICAgICBpZiAodGV4dEVkaXRvclBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjcmVhdGVUZXh0RWRpdG9yKHJlc291cmNlKTsKLSAgICAgICAgfQotICAgICAgICB0ZXh0RWRpdG9yLnNldFRleHQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBPcGVuIHRleHQgZWRpdG9yIHdpdGggaW5pdGlhbCBzaXplLgotICAgICAgICB0ZXh0RWRpdG9yUGFyZW50LnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIFBvaW50IHRleHRTaXplID0gdGV4dEVkaXRvci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICB0ZXh0U2l6ZS54ICs9IHRleHRTaXplLnk7IC8vIEFkZCBleHRyYSBzcGFjZSBmb3IgbmV3IGNoYXJhY3RlcnMuCi0gICAgICAgIFBvaW50IHBhcmVudFNpemUgPSB0ZXh0RWRpdG9yUGFyZW50LmdldFNpemUoKTsKLSAgICAgICAgaW50IGluc2V0ID0gZ2V0Q2VsbEVkaXRvckluc2V0KHRleHRFZGl0b3JQYXJlbnQpOwotICAgICAgICB0ZXh0RWRpdG9yLnNldEJvdW5kcygyLCBpbnNldCwgTWF0aC5taW4odGV4dFNpemUueCwgcGFyZW50U2l6ZS54IC0gNCksCi0gICAgICAgICAgICAgICAgcGFyZW50U2l6ZS55IC0gMiAqIGluc2V0KTsKLSAgICAgICAgdGV4dEVkaXRvclBhcmVudC5yZWRyYXcoKTsKLSAgICAgICAgdGV4dEVkaXRvci5zZWxlY3RBbGwoKTsKLSAgICAgICAgdGV4dEVkaXRvci5zZXRGb2N1cygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbjsgb3ZlcnJpZGVzIG1ldGhvZCBvbiBXb3Jrc3BhY2VBY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotCi0gICAgICAgIGlmICh0aGlzLm5hdmlnYXRvclRyZWUgPT0gbnVsbCkgewotICAgICAgICAgICAgSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSA9IGdldEN1cnJlbnRSZXNvdXJjZSgpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRSZXNvdXJjZSA9PSBudWxsIHx8ICFjdXJyZW50UmVzb3VyY2UuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgLy9EbyBhIHF1aWNrIHJlYWQgb25seSBhbmQgbnVsbCBjaGVjawotICAgICAgICAgICAgaWYgKCFjaGVja1JlYWRPbmx5QW5kTnVsbChjdXJyZW50UmVzb3VyY2UpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIFN0cmluZyBuZXdOYW1lID0gcXVlcnlOZXdSZXNvdXJjZU5hbWUoY3VycmVudFJlc291cmNlKTsKLSAgICAgICAgICAgIGlmIChuZXdOYW1lID09IG51bGwgfHwgbmV3TmFtZS5lcXVhbHMoIiIpKS8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBuZXdQYXRoID0gY3VycmVudFJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobmV3TmFtZSk7Ci0gICAgICAgICAgICBzdXBlci5ydW4oKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBydW5XaXRoSW5saW5lRWRpdG9yKCk7Ci0gICAgfQotCi0gICAgLyogCi0gICAgICogUnVuIHRoZSByZWNlaXZlciB1c2luZyBhbiBpbmxpbmUgZWRpdG9yIGZyb20gdGhlIHN1cHBsaWVkIG5hdmlnYXRvci4gVGhlCi0gICAgICogbmF2aWdhdG9yIHdpbGwgdGVsbCB0aGUgYWN0aW9uIHdoZW4gdGhlIHBhdGggaXMgcmVhZHkgdG8gcnVuLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBydW5XaXRoSW5saW5lRWRpdG9yKCkgewotICAgICAgICBJUmVzb3VyY2UgY3VycmVudFJlc291cmNlID0gZ2V0Q3VycmVudFJlc291cmNlKCk7Ci0gICAgICAgIGlmICghY2hlY2tSZWFkT25seUFuZE51bGwoY3VycmVudFJlc291cmNlKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBxdWVyeU5ld1Jlc291cmNlTmFtZUlubGluZShjdXJyZW50UmVzb3VyY2UpOwotCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlc291cmNlLiBPbmx5IHJldHVybgotICAgICAqIGFuIElSZXNvdWNlIGlmIHRoZXJlIGlzIG9uZSBhbmQgb25seSBvbmUgcmVzb3VyY2Ugc2VsZWN0ZWQuCi0gICAgICogQHJldHVybiBJUmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgemVybwotICAgICAqIG9yIG1vcmUgdGhhbiBvbmUgcmVzb3VyY2VzIHNlbGVjdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgSVJlc291cmNlIGdldEN1cnJlbnRSZXNvdXJjZSgpewotICAgIAlMaXN0IHJlc291cmNlcyA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCk7Ci0gICAgCWlmKHJlc291cmNlcy5zaXplKCkgPT0gMSkKLSAgICAJCXJldHVybiAoSVJlc291cmNlKSByZXNvdXJjZXMuZ2V0KDApOwotICAgIAlyZXR1cm4gbnVsbDsKLSAgICAJCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuV2l0aE5ld1BhdGgoSVBhdGggcGF0aCwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIHRoaXMubmV3UGF0aCA9IHBhdGg7Ci0gICAgICAgIHN1cGVyLnJ1bigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgdGhlIGNoYW5nZXMgYW5kIGRpc3Bvc2Ugb2YgdGhlIHRleHQgd2lkZ2V0LgotICAgICAqIEBwYXJhbSByZXNvdXJjZSAtIHRoZSByZXNvdXJjZSB0byBtb3ZlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzYXZlQ2hhbmdlc0FuZERpc3Bvc2UoSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIGlmIChzYXZpbmcgPT0gdHJ1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBzYXZpbmcgPSB0cnVlOwotICAgICAgICAvLyBDYWNoZSB0aGUgcmVzb3VyY2UgdG8gYXZvaWQgc2VsZWN0aW9uIGxvc3Mgc2luY2UgYSBzZWxlY3Rpb24gb2YKLSAgICAgICAgLy8gYW5vdGhlciBpdGVtIGNhbiB0cmlnZ2VyIHRoaXMgbWV0aG9kCi0gICAgICAgIGlubGluZWRSZXNvdXJjZSA9IHJlc291cmNlOwotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3TmFtZSA9IHRleHRFZGl0b3IuZ2V0VGV4dCgpOwotICAgICAgICAvLyBSdW4gdGhpcyBpbiBhbiBhc3luYyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgb3BlcmF0aW9uIHRoYXQgdHJpZ2dlcmVkCi0gICAgICAgIC8vIHRoaXMgYWN0aW9uIGlzIGNvbXBsZXRlZC4gIE90aGVyd2lzZSB0aGlzIGxlYWRzIHRvIHByb2JsZW1zIHdoZW4gdGhlCi0gICAgICAgIC8vIGljb24gb2YgdGhlIGl0ZW0gYmVpbmcgcmVuYW1lZCBpcyBjbGlja2VkIChpLmUuLCB3aGljaCBjYXVzZXMgdGhlIHJlbmFtZQotICAgICAgICAvLyB0ZXh0IHdpZGdldCB0byBsb3NlIGZvY3VzIGFuZCB0cmlnZ2VyIHRoaXMgbWV0aG9kKS4KLSAgICAgICAgUnVubmFibGUgcXVlcnkgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdOYW1lLmVxdWFscyhpbmxpbmVkUmVzb3VyY2UuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBJREVXb3JrYmVuY2hQbHVnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBsdWdpbldvcmtzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKG5ld05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZWRSZXNvdXJjZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUVycm9yKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCBuZXdQYXRoID0gaW5saW5lZFJlc291cmNlLmdldEZ1bGxQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKG5ld05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bldpdGhOZXdQYXRoKG5ld1BhdGgsIGlubGluZWRSZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5saW5lZFJlc291cmNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgLy9EaXNwb3NlIHRoZSB0ZXh0IHdpZGdldCByZWdhcmRsZXNzCi0gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2VUZXh0V2lkZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgTmF2aWdhdG9yIHRyZWUgaGFzIGZvY3VzLCB3aGljaCBpdCBtYXkgbm90IGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IHdpZGdldCBwcmV2aW91c2x5IGhhZCBmb2N1cy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hdmlnYXRvclRyZWUgIT0gbnVsbCAmJiAhbmF2aWdhdG9yVHJlZS5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvclRyZWUuc2V0Rm9jdXMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHNhdmluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgZ2V0VHJlZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhxdWVyeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlJlbmFtZVJlc291cmNlQWN0aW9uPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+U2VsZWN0aW9uTGlzdGVuZXJBY3Rpb248L2NvZGU+IG1ldGhvZCBlbnN1cmVzIHRoYXQgdGhpcyBhY3Rpb24gaXMKLSAgICAgKiBkaXNhYmxlZCBpZiBhbnkgb2YgdGhlIHNlbGVjdGlvbnMgYXJlIG5vdCByZXNvdXJjZXMgb3IgcmVzb3VyY2VzIHRoYXQgYXJlCi0gICAgICogbm90IGxvY2FsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgZGlzcG9zZVRleHRXaWRnZXQoKTsKLQotICAgICAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSA9IGdldEN1cnJlbnRSZXNvdXJjZSgpOwotICAgICAgICBpZiAoY3VycmVudFJlc291cmNlID09IG51bGwgfHwgIWN1cnJlbnRSZXNvdXJjZS5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHRleHQgYWN0aW9uIGhhbmRsZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjdGlvbkhhbmRsZXIgdGhlIGFjdGlvbiBoYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dEFjdGlvbkhhbmRsZXIoVGV4dEFjdGlvbkhhbmRsZXIgYWN0aW9uSGFuZGxlcikgewotICAgICAgICB0ZXh0QWN0aW9uSGFuZGxlciA9IGFjdGlvbkhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGlmIGl0IGlzIHJlYWQtb25seSBhbmQgYWRkaXRpb25hbGx5IAotICAgICAqIHRoZSBzb3VyY2UgZmlsZSBpZiBib3RoIGFyZSByZWFkLW9ubHkuCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGJvdGggZmlsZXMgY291bGQgYmUgbWFkZSB3cml0ZWFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSBzb3VyY2UgZmlsZQotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBkZXN0aW5hdGlvbiBmaWxlCi0gICAgICogQHBhcmFtIHNoZWxsIHVpIGNvbnRleHQgZm9yIHRoZSB2YWxpZGF0aW9uCi0gICAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGJvdGggZmlsZXMgY291bGQgYmUgbWFkZSB3cml0ZWFibGUuCi0gICAgICogCTxjb2RlPmZhbHNlPC9jb2RlPiBlaXRoZXIgb25lIG9yIGJvdGggZmlsZXMgd2VyZSBub3QgbWFkZSB3cml0ZWFibGUgIAotICAgICAqLwotICAgIGJvb2xlYW4gdmFsaWRhdGVFZGl0KElGaWxlIHNvdXJjZSwgSUZpbGUgZGVzdGluYXRpb24sIFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5pc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXM7Ci0gICAgICAgICAgICBpZiAoc291cmNlLmlzUmVhZE9ubHkoKSkKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtdIHsgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gfSwgc2hlbGwpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZUVkaXQobmV3IElGaWxlW10geyBkZXN0aW5hdGlvbiB9LAotICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1cy5pc09LKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvU2NydWJMb2NhbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1NjcnViTG9jYWxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJkM2U3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvU2NydWJMb2NhbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotCi0vKioKLSAqIFN0YW5kYXJkIGFjdGlvbiBmb3Igc2NydWJiaW5nIHRoZSBsb2NhbCBjb250ZW50IGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvZgotICogdGhlIHNlbGVjdGVkIHJlc291cmNlcyBhbmQgYWxsIG9mIHRoZWlyIGRlc2NlbmRlbnRzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBvYnNvbGV0ZTsgdGhlcmUgaXMgbm8gc3VwcG9ydCBpbiB0aGUgd29ya3NwYWNlCi0gKiBmb3Igc2NydWJiaW5nIGxvY2FsIGNvbnRlbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY3J1YkxvY2FsQWN0aW9uIGV4dGVuZHMgV29ya3NwYWNlQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBpZCBvZiB0aGlzIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS51aS5TY3J1YkxvY2FsQWN0aW9uIjsvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgZm9yIGFueSBkaWFsb2dzCi0gICAgICovCi0gICAgcHVibGljIFNjcnViTG9jYWxBY3Rpb24oU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgc3VwZXIoc2hlbGwsIElERVdvcmtiZW5jaE1lc3NhZ2VzLlNjcnViTG9jYWxBY3Rpb25fdGV4dCk7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlNjcnViTG9jYWxBY3Rpb25fdG9vbFRpcCk7Ci0gICAgICAgIHNldElkKElEKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5TQ1JVQl9MT0NBTF9BQ1RJT04pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV29ya3NwYWNlQWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3BlcmF0aW9uTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLlNjcnViTG9jYWxBY3Rpb25fcHJvZ3Jlc3M7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXb3Jrc3BhY2VBY3Rpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9ibGVtc01lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5TY3J1YkxvY2FsQWN0aW9uX3Byb2JsZW1zTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdvcmtzcGFjZUFjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2JsZW1zVGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5TY3J1YkxvY2FsQWN0aW9uX3Byb2JsZW1zVGl0bGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXb3Jrc3BhY2VBY3Rpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlT3BlcmF0aW9uKElSZXNvdXJjZSByZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICByZXNvdXJjZS5zZXRMb2NhbChmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+U2NydWJMb2NhbEFjdGlvbjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uPC9jb2RlPiBtZXRob2QgZW5zdXJlcyB0aGF0IHRoaXMgYWN0aW9uIGlzCi0gICAgICogZGlzYWJsZWQgaWYgYW55IG9mIHRoZSBzZWxlY3Rpb25zIGFyZSBub3QgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24ocykKLSAgICAgICAgICAgICAgICAmJiBnZXRTZWxlY3RlZE5vblJlc291cmNlcygpLnNpemUoKSA9PSAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1NlbGVjdGlvbkxpc3RlbmVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZTQ4YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1NlbGVjdGlvbkxpc3RlbmVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIHJlc291cmNlLWJhc2VkIGFjdGlvbnMgdGhhdCBsaXN0ZW4gdG8gc2VsZWN0aW9uCi0gKiBjaGFuZ2UgZXZlbnRzLiBUaGlzIGltcGxlbWVudGF0aW9uIHRyYWNrcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gKHNlZSAKLSAqIDxjb2RlPmdldFN0cnVjdHVyZWRTZWxlY3Rpb248L2NvZGU+KSBhbmQgcHJvdmlkZXMgYSBjb252ZW5pZW50IHBsYWNlIHRvIAotICogbW9uaXRvciBzZWxlY3Rpb24gY2hhbmdlcyB0aGF0IGNvdWxkIGFmZmVjdCB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBhY3Rpb24uCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyA8Y29kZT5JQWN0aW9uPC9jb2RlPiBtZXRob2Q6Ci0gKiA8dWw+Ci0gKiAgIDxsaT48Y29kZT5ydW48L2NvZGU+IC0gdG8gZG8gdGhlIGFjdGlvbidzIHdvcms8L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoZSA8Y29kZT51cGRhdGVTZWxlY3Rpb248L2NvZGU+IG1ldGhvZCB0byB1cGRhdGUKLSAqIHRoZSBhY3Rpb24gZGV0ZXJtaW5lIGl0cyBhdmFpbGFiaWxpdHkgYmFzZWQgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgb2JqZWN0IGluc3RhbnRpYXRpbmcgdGhlIHN1YmNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZwotICogdGhlIGluc3RhbmNlIHdpdGggYSBzZWxlY3Rpb24gcHJvdmlkZXIuIEFsdGVybmF0aXZlbHksIHRoZSBvYmplY3QgY2FuCi0gKiBub3RpZnkgdGhlIHN1YmNsYXNzIGluc3RhbmNlIGRpcmVjdGx5IG9mIGEgc2VsZWN0aW9uIGNoYW5nZSB1c2luZyB0aGUKLSAqIG1ldGhvZHM6Ci0gKiA8dWw+Ci0gKiAgIDxsaT48Y29kZT5zZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKTwvY29kZT4gLSBwYXNzaW5nIHRoZSBzZWxlY3Rpb248L2xpPgotICogICA8bGk+PGNvZGU+c2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KTwvY29kZT4gLSBwYXNzaW5nIHRoZSBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiBleHRlbmRzCi0gICAgICAgIEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0gICAgLyoqCi0gICAgICogRW1wdHkgbGlzdCB0aGF0IGlzIGltbXV0YWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IEVNUFRZX0xJU1QgPSBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbMF0pOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlcyBzaW5jZSA8Y29kZT5yZXNvdXJjZXM8L2NvZGU+Ci0gICAgICogYW5kIDxjb2RlPm5vblJlc291cmNlczwvY29kZT4gd2VyZSBjb21wdXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2VsZWN0aW9uRGlydHkgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3Qgb2YgcmVzb3VyY2UgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0gICAgICogKGVsZW1lbnQgdHlwZTogPGNvZGU+SVJlc291cmNlPC9jb2RlPik7IG1lYW5pbmdmdWwgb25seSB3aGVuCi0gICAgICogPGNvZGU+c2VsZWN0aW9uRGlydHkgPT0gZmFsc2U8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCByZXNvdXJjZXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGlzdCBvZiBub24tcmVzb3VyY2UgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0gICAgICogKGVsZW1lbnQgdHlwZTogPGNvZGU+T2JqZWN0PC9jb2RlPik7IG1lYW5pbmdmdWwgb25seSB3aGVuCi0gICAgICogPGNvZGU+c2VsZWN0aW9uRGlydHkgPT0gZmFsc2U8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBub25SZXNvdXJjZXM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiB3aXRoIHRoZSBnaXZlbiB0ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB1c2VkIGFzIHRoZSB0ZXh0IGZvciB0aGUgYWN0aW9uLCAKLSAgICAgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHRleHQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24oU3RyaW5nIHRleHQpIHsKLSAgICAgICAgc3VwZXIodGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjwvY29kZT4gbWV0aG9kIGNsZWFycyB0aGUgY2FjaGVkCi0gICAgICogcmVzb3VyY2VzIGFuZCBub24tcmVzb3VyY2VzLiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhckNhY2hlKCkgewotICAgICAgICBzZWxlY3Rpb25EaXJ0eSA9IHRydWU7Ci0gICAgICAgIC8vIGNsZWFyIG91dCB0aGUgbGlzdHMgaW4gY2FzZSBjb21wdXRlUmVzb3VyY2VzIGRvZXMgbm90IGdldCBjYWxsZWQgaW1tZWRpYXRlbHkKLSAgICAgICAgcmVzb3VyY2VzID0gbnVsbDsKLSAgICAgICAgbm9uUmVzb3VyY2VzID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+cyBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhbmQgYWRkcyB0aGVtIHRvCi0gICAgICogdGhlIHJlc291cmNlcyBsaXN0LCBhbmQgdGhlIHJlc3QgaW50byB0aGUgbm9uLXJlc291cmNlcyBsaXN0LgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBjb21wdXRlUmVzb3VyY2VzKCkgewotICAgICAgICByZXNvdXJjZXMgPSBudWxsOwotICAgICAgICBub25SZXNvdXJjZXMgPSBudWxsOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgZSA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBlLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBuZXh0ID0gZS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgc2VsZWN0aW9uIGNvbnRhaW5zIG1vc3RseSByZXNvdXJjZXMgbW9zdCB0aW1lcwotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKS5zaXplKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNvdXJjZXMuYWRkKG5leHQpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHJlc291cmNlID0gKChJQWRhcHRhYmxlKSBuZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBzZWxlY3Rpb24gY29udGFpbnMgbW9zdGx5IHJlc291cmNlcyBtb3N0IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobm9uUmVzb3VyY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBhc3N1bWUgc2VsZWN0aW9uIGNvbnRhaW5zIG1vc3RseSByZXNvdXJjZXMgbW9zdCB0aW1lcwotICAgICAgICAgICAgICAgIG5vblJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub25SZXNvdXJjZXMuYWRkKG5leHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHRoYXQgYXJlIG5vdCAKLSAgICAgKiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbGlzdCBvZiBlbGVtZW50cyAoZWxlbWVudCB0eXBlOiA8Y29kZT5PYmplY3Q8L2NvZGU+KQotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldFNlbGVjdGVkTm9uUmVzb3VyY2VzKCkgewotICAgICAgICAvL3JlY29tcHV0ZSBpZiBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0gICAgICAgIGlmIChzZWxlY3Rpb25EaXJ0eSkgewotICAgICAgICAgICAgY29tcHV0ZVJlc291cmNlcygpOwotICAgICAgICAgICAgc2VsZWN0aW9uRGlydHkgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChub25SZXNvdXJjZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9MSVNUOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbm9uUmVzb3VyY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB0aGF0IGFyZSAKLSAgICAgKiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbGlzdCBvZiByZXNvdXJjZSBlbGVtZW50cyAoZWxlbWVudCB0eXBlOiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+KQotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldFNlbGVjdGVkUmVzb3VyY2VzKCkgewotICAgICAgICAvL3JlY29tcHV0ZSBpZiBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0gICAgICAgIGlmIChzZWxlY3Rpb25EaXJ0eSkgewotICAgICAgICAgICAgY29tcHV0ZVJlc291cmNlcygpOwotICAgICAgICAgICAgc2VsZWN0aW9uRGlydHkgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXNvdXJjZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9MSVNUOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgYW1vbmcgdGhvc2UgaW4gdGhlIGdpdmVuCi0gICAgICogcmVzb3VyY2UgdHlwZSBtYXNrLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VNYXNrIGEgYml0d2lzZSBPUiBvZiByZXNvdXJjZSB0eXBlczogCi0gICAgICogICA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+Lns8Y29kZT5GSUxFPC9jb2RlPiwgPGNvZGU+Rk9MREVSPC9jb2RlPiwKLSAgICAgKiAgIDxjb2RlPlBST0pFQ1Q8L2NvZGU+LCA8Y29kZT5ST09UPC9jb2RlPn0KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXNvdXJjZSB0eXBlIG1hdGNoZXMsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgIG90aGVyd2lzZQotICAgICAqIEBzZWUgSVJlc291cmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VJc1R5cGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQgcmVzb3VyY2VNYXNrKSB7Ci0gICAgICAgIHJldHVybiAocmVzb3VyY2UuZ2V0VHlwZSgpICYgcmVzb3VyY2VNYXNrKSAhPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBzZWxlY3Rpb24gY29uc2lzdHMgZW50aXJlbHkgb2YgcmVzb3VyY2VzIHdob3NlCi0gICAgICogdHlwZXMgYXJlIGFtb25nIHRob3NlIGluIHRoZSBnaXZlbiByZXNvdXJjZSB0eXBlIG1hc2suCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlTWFzayBhIGJpdHdpc2UgT1Igb2YgcmVzb3VyY2UgdHlwZXM6IAotICAgICAqICAgPGNvZGU+SVJlc291cmNlPC9jb2RlPi57PGNvZGU+RklMRTwvY29kZT4sIDxjb2RlPkZPTERFUjwvY29kZT4sCi0gICAgICogICA8Y29kZT5QUk9KRUNUPC9jb2RlPiwgPGNvZGU+Uk9PVDwvY29kZT59Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgcmVzb3VyY2VzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhcmUgb2YgdGhlCi0gICAgICogICBzcGVjaWZpZWQgdHlwZXMgb3IgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGVtcHR5LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHNvbWUKLSAgICAgKiAgIGVsZW1lbnRzIGFyZSByZXNvdXJjZXMgb2YgYSBkaWZmZXJlbnQgdHlwZSBvciBub3QgcmVzb3VyY2VzCi0gICAgICogQHNlZSBJUmVzb3VyY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZWxlY3Rpb25Jc09mVHlwZShpbnQgcmVzb3VyY2VNYXNrKSB7Ci0gICAgICAgIGlmIChnZXRTZWxlY3RlZE5vblJlc291cmNlcygpLnNpemUoKSA+IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBlID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBlLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSBuZXh0ID0gKElSZXNvdXJjZSkgZS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIXJlc291cmNlSXNUeXBlKG5leHQsIHJlc291cmNlTWFzaykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1RleHRBY3Rpb25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvVGV4dEFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ODRiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvVGV4dEFjdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotCi0vKioKLSAqIEhhbmRsZXMgdGhlIHJlZGlyZWN0aW9uIG9mIHRoZSBnbG9iYWwgQ3V0LCBDb3B5LCBQYXN0ZSwgYW5kCi0gKiBTZWxlY3QgQWxsIGFjdGlvbnMgdG8gZWl0aGVyIHRoZSBjdXJyZW50IGlubGluZSB0ZXh0IGNvbnRyb2wKLSAqIG9yIHRoZSBwYXJ0J3Mgc3VwcGxpZWQgYWN0aW9uIGhhbmRsZXIuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+PHA+Ci0gKiBFeGFtcGxlIHVzYWdlOgotICogPHByZT4KLSAqIHRleHRBY3Rpb25IYW5kbGVyID0gbmV3IFRleHRBY3Rpb25IYW5kbGVyKHRoaXMuZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkpOwotICogdGV4dEFjdGlvbkhhbmRsZXIuYWRkVGV4dCgoVGV4dCl0ZXh0Q2VsbEVkaXRvcjEuZ2V0Q29udHJvbCgpKTsKLSAqIHRleHRBY3Rpb25IYW5kbGVyLmFkZFRleHQoKFRleHQpdGV4dENlbGxFZGl0b3IyLmdldENvbnRyb2woKSk7Ci0gKiB0ZXh0QWN0aW9uSGFuZGxlci5zZXRTZWxlY3RBbGxBY3Rpb24oc2VsZWN0QWxsQWN0aW9uKTsKLSAqIDwvcHJlPgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVGV4dEFjdGlvbkhhbmRsZXIgewotICAgIHByaXZhdGUgRGVsZXRlQWN0aW9uSGFuZGxlciB0ZXh0RGVsZXRlQWN0aW9uID0gbmV3IERlbGV0ZUFjdGlvbkhhbmRsZXIoKTsKLQotICAgIHByaXZhdGUgQ3V0QWN0aW9uSGFuZGxlciB0ZXh0Q3V0QWN0aW9uID0gbmV3IEN1dEFjdGlvbkhhbmRsZXIoKTsKLQotICAgIHByaXZhdGUgQ29weUFjdGlvbkhhbmRsZXIgdGV4dENvcHlBY3Rpb24gPSBuZXcgQ29weUFjdGlvbkhhbmRsZXIoKTsKLQotICAgIHByaXZhdGUgUGFzdGVBY3Rpb25IYW5kbGVyIHRleHRQYXN0ZUFjdGlvbiA9IG5ldyBQYXN0ZUFjdGlvbkhhbmRsZXIoKTsKLQotICAgIHByaXZhdGUgU2VsZWN0QWxsQWN0aW9uSGFuZGxlciB0ZXh0U2VsZWN0QWxsQWN0aW9uID0gbmV3IFNlbGVjdEFsbEFjdGlvbkhhbmRsZXIoKTsKLQotICAgIHByaXZhdGUgSUFjdGlvbiBkZWxldGVBY3Rpb247Ci0KLSAgICBwcml2YXRlIElBY3Rpb24gY3V0QWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJQWN0aW9uIGNvcHlBY3Rpb247Ci0KLSAgICBwcml2YXRlIElBY3Rpb24gcGFzdGVBY3Rpb247Ci0KLSAgICBwcml2YXRlIElBY3Rpb24gc2VsZWN0QWxsQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBkZWxldGVBY3Rpb25MaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgdGV4dERlbGV0ZUFjdGlvbik7Ci0KLSAgICBwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGN1dEFjdGlvbkxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICB0ZXh0Q3V0QWN0aW9uKTsKLQotICAgIHByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY29weUFjdGlvbkxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICB0ZXh0Q29weUFjdGlvbik7Ci0KLSAgICBwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBhc3RlQWN0aW9uTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgIHRleHRQYXN0ZUFjdGlvbik7Ci0KLSAgICBwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNlbGVjdEFsbEFjdGlvbkxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICB0ZXh0U2VsZWN0QWxsQWN0aW9uKTsKLQotICAgIHByaXZhdGUgTGlzdGVuZXIgdGV4dENvbnRyb2xMaXN0ZW5lciA9IG5ldyBUZXh0Q29udHJvbExpc3RlbmVyKCk7Ci0KLSAgICBwcml2YXRlIFRleHQgYWN0aXZlVGV4dENvbnRyb2w7Ci0KLSAgICBwcml2YXRlIE1vdXNlQWRhcHRlciBtb3VzZUFkYXB0ZXIgPSBuZXcgTW91c2VBZGFwdGVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgdXBkYXRlQWN0aW9uc0VuYWJsZVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBLZXlBZGFwdGVyIGtleUFkYXB0ZXIgPSBuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgdXBkYXRlQWN0aW9uc0VuYWJsZVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBjbGFzcyBUZXh0Q29udHJvbExpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNXVC5BY3RpdmF0ZToKLSAgICAgICAgICAgICAgICBhY3RpdmVUZXh0Q29udHJvbCA9IChUZXh0KSBldmVudC53aWRnZXQ7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQWN0aW9uc0VuYWJsZVN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNXVC5EZWFjdGl2YXRlOgotICAgICAgICAgICAgICAgIGFjdGl2ZVRleHRDb250cm9sID0gbnVsbDsKLSAgICAgICAgICAgICAgICB1cGRhdGVBY3Rpb25zRW5hYmxlU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgSUFjdGlvbiBhY3Rpb25IYW5kbGVyOwotCi0gICAgICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElBY3Rpb24gYWN0aW9uSGFuZGxlcikgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMuYWN0aW9uSGFuZGxlciA9IGFjdGlvbkhhbmRsZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlVGV4dENvbnRyb2wgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoSUFjdGlvbi5FTkFCTEVEKSkgewotICAgICAgICAgICAgICAgIEJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGFjdGlvbkhhbmRsZXIuc2V0RW5hYmxlZChib29sLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgRGVsZXRlQWN0aW9uSGFuZGxlciBleHRlbmRzIEFjdGlvbiB7Ci0gICAgICAgIHByb3RlY3RlZCBEZWxldGVBY3Rpb25IYW5kbGVyKCkgewotICAgICAgICAgICAgc3VwZXIoSURFV29ya2JlbmNoTWVzc2FnZXMuRGVsZXRlKTsKLSAgICAgICAgICAgIHNldElkKCJUZXh0RGVsZXRlQWN0aW9uSGFuZGxlciIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCQlJSURFSGVscENvbnRleHRJZHMuVEVYVF9ERUxFVEVfQUNUSU9OKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYgKGFjdGl2ZVRleHRDb250cm9sICE9IG51bGwgJiYgIWFjdGl2ZVRleHRDb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgIGFjdGl2ZVRleHRDb250cm9sLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlbGV0ZUFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlQWN0aW9uLnJ1bldpdGhFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVwZGF0ZSBzdGF0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUVuYWJsZWRTdGF0ZSgpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVUZXh0Q29udHJvbCAhPSBudWxsICYmICFhY3RpdmVUZXh0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkKGFjdGl2ZVRleHRDb250cm9sLmdldFNlbGVjdGlvbkNvdW50KCkgPiAwCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBhY3RpdmVUZXh0Q29udHJvbC5nZXRDYXJldFBvc2l0aW9uKCkgPCBhY3RpdmVUZXh0Q29udHJvbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hhckNvdW50KCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZWxldGVBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldEVuYWJsZWQoZGVsZXRlQWN0aW9uLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQ3V0QWN0aW9uSGFuZGxlciBleHRlbmRzIEFjdGlvbiB7Ci0gICAgICAgIHByb3RlY3RlZCBDdXRBY3Rpb25IYW5kbGVyKCkgewotICAgICAgICAgICAgc3VwZXIoSURFV29ya2JlbmNoTWVzc2FnZXMuQ3V0KTsKLSAgICAgICAgICAgIHNldElkKCJUZXh0Q3V0QWN0aW9uSGFuZGxlciIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCQlJSURFSGVscENvbnRleHRJZHMuVEVYVF9DVVRfQUNUSU9OKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYgKGFjdGl2ZVRleHRDb250cm9sICE9IG51bGwgJiYgIWFjdGl2ZVRleHRDb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgIGFjdGl2ZVRleHRDb250cm9sLmN1dCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjdXRBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGN1dEFjdGlvbi5ydW5XaXRoRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVcGRhdGUgc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVFbmFibGVkU3RhdGUoKSB7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlVGV4dENvbnRyb2wgIT0gbnVsbCAmJiAhYWN0aXZlVGV4dENvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZChhY3RpdmVUZXh0Q29udHJvbC5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGN1dEFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZChjdXRBY3Rpb24uaXNFbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBDb3B5QWN0aW9uSGFuZGxlciBleHRlbmRzIEFjdGlvbiB7Ci0gICAgICAgIHByb3RlY3RlZCBDb3B5QWN0aW9uSGFuZGxlcigpIHsKLSAgICAgICAgICAgIHN1cGVyKElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHkpOwotICAgICAgICAgICAgc2V0SWQoIlRleHRDb3B5QWN0aW9uSGFuZGxlciIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCQlJSURFSGVscENvbnRleHRJZHMuVEVYVF9DT1BZX0FDVElPTik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVUZXh0Q29udHJvbCAhPSBudWxsICYmICFhY3RpdmVUZXh0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVUZXh0Q29udHJvbC5jb3B5KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvcHlBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvcHlBY3Rpb24ucnVuV2l0aEV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUVuYWJsZWRTdGF0ZSgpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVUZXh0Q29udHJvbCAhPSBudWxsICYmICFhY3RpdmVUZXh0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkKGFjdGl2ZVRleHRDb250cm9sLmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29weUFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZChjb3B5QWN0aW9uLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUGFzdGVBY3Rpb25IYW5kbGVyIGV4dGVuZHMgQWN0aW9uIHsKLSAgICAgICAgcHJvdGVjdGVkIFBhc3RlQWN0aW9uSGFuZGxlcigpIHsKLSAgICAgICAgICAgIHN1cGVyKElERVdvcmtiZW5jaE1lc3NhZ2VzLlBhc3RlKTsKLSAgICAgICAgICAgIHNldElkKCJUZXh0UGFzdGVBY3Rpb25IYW5kbGVyIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJCUlJREVIZWxwQ29udGV4dElkcy5URVhUX1BBU1RFX0FDVElPTik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVUZXh0Q29udHJvbCAhPSBudWxsICYmICFhY3RpdmVUZXh0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVUZXh0Q29udHJvbC5wYXN0ZSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXN0ZUFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFzdGVBY3Rpb24ucnVuV2l0aEV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlKCkgewotICAgICAgICAgICAgaWYgKGFjdGl2ZVRleHRDb250cm9sICE9IG51bGwgJiYgIWFjdGl2ZVRleHRDb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhc3RlQWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkKHBhc3RlQWN0aW9uLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU2VsZWN0QWxsQWN0aW9uSGFuZGxlciBleHRlbmRzIEFjdGlvbiB7Ci0gICAgICAgIHByb3RlY3RlZCBTZWxlY3RBbGxBY3Rpb25IYW5kbGVyKCkgewotICAgICAgICAgICAgc3VwZXIoSURFV29ya2JlbmNoTWVzc2FnZXMuVGV4dEFjdGlvbl9zZWxlY3RBbGwpOwotICAgICAgICAgICAgc2V0SWQoIlRleHRTZWxlY3RBbGxBY3Rpb25IYW5kbGVyIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJCUlJREVIZWxwQ29udGV4dElkcy5URVhUX1NFTEVDVF9BTExfQUNUSU9OKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYgKGFjdGl2ZVRleHRDb250cm9sICE9IG51bGwgJiYgIWFjdGl2ZVRleHRDb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgIGFjdGl2ZVRleHRDb250cm9sLnNlbGVjdEFsbCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWxlY3RBbGxBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlbGVjdEFsbEFjdGlvbi5ydW5XaXRoRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVcGRhdGUgdGhlIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlKCkgewotICAgICAgICAgICAgaWYgKGFjdGl2ZVRleHRDb250cm9sICE9IG51bGwgJiYgIWFjdGl2ZVRleHRDb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlbGVjdEFsbEFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZChzZWxlY3RBbGxBY3Rpb24uaXNFbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wgYWN0aW9uIGhhbmRsZXIKLSAgICAgKiBmb3IgdGhlIGdsb2JhbCBDdXQsIENvcHksIFBhc3RlLCBEZWxldGUsIGFuZCBTZWxlY3QgQWxsIAotICAgICAqIG9mIHRoZSBhY3Rpb24gYmFyLgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdGlvbkJhciB0aGUgYWN0aW9uIGJhciB0byByZWdpc3RlciBnbG9iYWwKLSAgICAgKiAgICBhY3Rpb24gaGFuZGxlcnMgZm9yIEN1dCwgQ29weSwgUGFzdGUsIERlbGV0ZSwgCi0gICAgICogCSAgYW5kIFNlbGVjdCBBbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgVGV4dEFjdGlvbkhhbmRsZXIoSUFjdGlvbkJhcnMgYWN0aW9uQmFyKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0gICAgICAgICAgICAgICAgdGV4dEN1dEFjdGlvbik7Ci0gICAgICAgIGFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLAotICAgICAgICAgICAgICAgIHRleHRDb3B5QWN0aW9uKTsKLSAgICAgICAgYWN0aW9uQmFyLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLAotICAgICAgICAgICAgICAgIHRleHRQYXN0ZUFjdGlvbik7Ci0gICAgICAgIGFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLAotICAgICAgICAgICAgICAgIHRleHRTZWxlY3RBbGxBY3Rpb24pOwotICAgICAgICBhY3Rpb25CYXIuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLAotICAgICAgICAgICAgICAgIHRleHREZWxldGVBY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wgdG8gdGhlIGhhbmRsZXIKLSAgICAgKiBzbyB0aGF0IHRoZSBDdXQsIENvcHksIFBhc3RlLCBEZWxldGUsIGFuZCBTZWxlY3QgQWxsIAotICAgICAqIGFjdGlvbnMgYXJlIHJlZGlyZWN0ZWQgdG8gaXQgd2hlbiBhY3RpdmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dENvbnRyb2wgdGhlIGlubGluZSA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGV4dChUZXh0IHRleHRDb250cm9sKSB7Ci0gICAgICAgIGlmICh0ZXh0Q29udHJvbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGFjdGl2ZVRleHRDb250cm9sID0gdGV4dENvbnRyb2w7Ci0gICAgICAgIHRleHRDb250cm9sLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgdGV4dENvbnRyb2xMaXN0ZW5lcik7Ci0gICAgICAgIHRleHRDb250cm9sLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCB0ZXh0Q29udHJvbExpc3RlbmVyKTsKLQotICAgICAgICAvLyBXZSByZWFsbHkgd2FudCBhIHNlbGVjdGlvbiBsaXN0ZW5lciBidXQgaXQgaXMgbm90IHN1cHBvcnRlZCBzbyB3ZQotICAgICAgICAvLyB1c2UgYSBrZXkgbGlzdGVuZXIgYW5kIGEgbW91c2UgbGlzdGVuZXIgdG8ga25vdyB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzCi0gICAgICAgIC8vIG1heSBoYXZlIG9jY3VyZWQKLSAgICAgICAgdGV4dENvbnRyb2wuYWRkS2V5TGlzdGVuZXIoa2V5QWRhcHRlcik7Ci0gICAgICAgIHRleHRDb250cm9sLmFkZE1vdXNlTGlzdGVuZXIobW91c2VBZGFwdGVyKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3Bvc2Ugb2YgdGhpcyBhY3Rpb24gaGFuZGxlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHNldEN1dEFjdGlvbihudWxsKTsKLSAgICAgICAgc2V0Q29weUFjdGlvbihudWxsKTsKLSAgICAgICAgc2V0UGFzdGVBY3Rpb24obnVsbCk7Ci0gICAgICAgIHNldFNlbGVjdEFsbEFjdGlvbihudWxsKTsKLSAgICAgICAgc2V0RGVsZXRlQWN0aW9uKG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sIGZyb20gdGhlIGhhbmRsZXIKLSAgICAgKiBzbyB0aGF0IHRoZSBDdXQsIENvcHksIFBhc3RlLCBEZWxldGUsIGFuZCBTZWxlY3QgQWxsIAotICAgICAqIGFjdGlvbnMgYXJlIG5vIGxvbmdlciByZWRpcmVjdGVkIHRvIGl0IHdoZW4gYWN0aXZlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHRDb250cm9sIHRoZSBpbmxpbmUgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRleHQoVGV4dCB0ZXh0Q29udHJvbCkgewotICAgICAgICBpZiAodGV4dENvbnRyb2wgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICB0ZXh0Q29udHJvbC5yZW1vdmVMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIHRleHRDb250cm9sTGlzdGVuZXIpOwotICAgICAgICB0ZXh0Q29udHJvbC5yZW1vdmVMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgdGV4dENvbnRyb2xMaXN0ZW5lcik7Ci0KLSAgICAgICAgdGV4dENvbnRyb2wucmVtb3ZlTW91c2VMaXN0ZW5lcihtb3VzZUFkYXB0ZXIpOwotICAgICAgICB0ZXh0Q29udHJvbC5yZW1vdmVLZXlMaXN0ZW5lcihrZXlBZGFwdGVyKTsKLQotICAgICAgICBhY3RpdmVUZXh0Q29udHJvbCA9IG51bGw7Ci0gICAgICAgIHVwZGF0ZUFjdGlvbnNFbmFibGVTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVmYXVsdCA8Y29kZT5JQWN0aW9uPC9jb2RlPiBoYW5kbGVyIGZvciB0aGUgQ29weQotICAgICAqIGFjdGlvbi4gVGhpcyA8Y29kZT5JQWN0aW9uPC9jb2RlPiBpcyBydW4gb25seSBpZiBubyBhY3RpdmUKLSAgICAgKiBpbmxpbmUgdGV4dCBjb250cm9sLgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdGlvbiB0aGUgPGNvZGU+SUFjdGlvbjwvY29kZT4gdG8gcnVuIGZvciB0aGUKLSAgICAgKiAgICBDb3B5IGFjdGlvbiwgb3IgPGNvZGU+bnVsbDwvbnVsbD4gaWYgbm90IGludGVyZXN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29weUFjdGlvbihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBpZiAoY29weUFjdGlvbiA9PSBhY3Rpb24pCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKGNvcHlBY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIGNvcHlBY3Rpb24ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihjb3B5QWN0aW9uTGlzdGVuZXIpOwotCi0gICAgICAgIGNvcHlBY3Rpb24gPSBhY3Rpb247Ci0KLSAgICAgICAgaWYgKGNvcHlBY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIGNvcHlBY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihjb3B5QWN0aW9uTGlzdGVuZXIpOwotCi0gICAgICAgIHRleHRDb3B5QWN0aW9uLnVwZGF0ZUVuYWJsZWRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVmYXVsdCA8Y29kZT5JQWN0aW9uPC9jb2RlPiBoYW5kbGVyIGZvciB0aGUgQ3V0Ci0gICAgICogYWN0aW9uLiBUaGlzIDxjb2RlPklBY3Rpb248L2NvZGU+IGlzIHJ1biBvbmx5IGlmIG5vIGFjdGl2ZQotICAgICAqIGlubGluZSB0ZXh0IGNvbnRyb2wuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0aW9uIHRoZSA8Y29kZT5JQWN0aW9uPC9jb2RlPiB0byBydW4gZm9yIHRoZQotICAgICAqICAgIEN1dCBhY3Rpb24sIG9yIDxjb2RlPm51bGw8L251bGw+IGlmIG5vdCBpbnRlcmVzdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1dEFjdGlvbihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBpZiAoY3V0QWN0aW9uID09IGFjdGlvbikKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoY3V0QWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBjdXRBY3Rpb24ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihjdXRBY3Rpb25MaXN0ZW5lcik7Ci0KLSAgICAgICAgY3V0QWN0aW9uID0gYWN0aW9uOwotCi0gICAgICAgIGlmIChjdXRBY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIGN1dEFjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGN1dEFjdGlvbkxpc3RlbmVyKTsKLQotICAgICAgICB0ZXh0Q3V0QWN0aW9uLnVwZGF0ZUVuYWJsZWRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVmYXVsdCA8Y29kZT5JQWN0aW9uPC9jb2RlPiBoYW5kbGVyIGZvciB0aGUgUGFzdGUKLSAgICAgKiBhY3Rpb24uIFRoaXMgPGNvZGU+SUFjdGlvbjwvY29kZT4gaXMgcnVuIG9ubHkgaWYgbm8gYWN0aXZlCi0gICAgICogaW5saW5lIHRleHQgY29udHJvbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb24gdGhlIDxjb2RlPklBY3Rpb248L2NvZGU+IHRvIHJ1biBmb3IgdGhlCi0gICAgICogICAgUGFzdGUgYWN0aW9uLCBvciA8Y29kZT5udWxsPC9udWxsPiBpZiBub3QgaW50ZXJlc3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXN0ZUFjdGlvbihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBpZiAocGFzdGVBY3Rpb24gPT0gYWN0aW9uKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChwYXN0ZUFjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgcGFzdGVBY3Rpb24ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwYXN0ZUFjdGlvbkxpc3RlbmVyKTsKLQotICAgICAgICBwYXN0ZUFjdGlvbiA9IGFjdGlvbjsKLQotICAgICAgICBpZiAocGFzdGVBY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHBhc3RlQWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGFzdGVBY3Rpb25MaXN0ZW5lcik7Ci0KLSAgICAgICAgdGV4dFBhc3RlQWN0aW9uLnVwZGF0ZUVuYWJsZWRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVmYXVsdCA8Y29kZT5JQWN0aW9uPC9jb2RlPiBoYW5kbGVyIGZvciB0aGUgU2VsZWN0IEFsbAotICAgICAqIGFjdGlvbi4gVGhpcyA8Y29kZT5JQWN0aW9uPC9jb2RlPiBpcyBydW4gb25seSBpZiBubyBhY3RpdmUKLSAgICAgKiBpbmxpbmUgdGV4dCBjb250cm9sLgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdGlvbiB0aGUgPGNvZGU+SUFjdGlvbjwvY29kZT4gdG8gcnVuIGZvciB0aGUKLSAgICAgKiAgICBTZWxlY3QgQWxsIGFjdGlvbiwgb3IgPGNvZGU+bnVsbDwvbnVsbD4gaWYgbm90IGludGVyZXN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0QWxsQWN0aW9uKElBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgIGlmIChzZWxlY3RBbGxBY3Rpb24gPT0gYWN0aW9uKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChzZWxlY3RBbGxBY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHNlbGVjdEFsbEFjdGlvbgotICAgICAgICAgICAgICAgICAgICAucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihzZWxlY3RBbGxBY3Rpb25MaXN0ZW5lcik7Ci0KLSAgICAgICAgc2VsZWN0QWxsQWN0aW9uID0gYWN0aW9uOwotCi0gICAgICAgIGlmIChzZWxlY3RBbGxBY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHNlbGVjdEFsbEFjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHNlbGVjdEFsbEFjdGlvbkxpc3RlbmVyKTsKLQotICAgICAgICB0ZXh0U2VsZWN0QWxsQWN0aW9uLnVwZGF0ZUVuYWJsZWRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVmYXVsdCA8Y29kZT5JQWN0aW9uPC9jb2RlPiBoYW5kbGVyIGZvciB0aGUgRGVsZXRlCi0gICAgICogYWN0aW9uLiBUaGlzIDxjb2RlPklBY3Rpb248L2NvZGU+IGlzIHJ1biBvbmx5IGlmIG5vIGFjdGl2ZQotICAgICAqIGlubGluZSB0ZXh0IGNvbnRyb2wuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0aW9uIHRoZSA8Y29kZT5JQWN0aW9uPC9jb2RlPiB0byBydW4gZm9yIHRoZQotICAgICAqICAgIERlbGV0ZSBhY3Rpb24sIG9yIDxjb2RlPm51bGw8L251bGw+IGlmIG5vdCBpbnRlcmVzdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlbGV0ZUFjdGlvbihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBpZiAoZGVsZXRlQWN0aW9uID09IGFjdGlvbikKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoZGVsZXRlQWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBkZWxldGVBY3Rpb24ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihkZWxldGVBY3Rpb25MaXN0ZW5lcik7Ci0KLSAgICAgICAgZGVsZXRlQWN0aW9uID0gYWN0aW9uOwotCi0gICAgICAgIGlmIChkZWxldGVBY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIGRlbGV0ZUFjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGRlbGV0ZUFjdGlvbkxpc3RlbmVyKTsKLQotICAgICAgICB0ZXh0RGVsZXRlQWN0aW9uLnVwZGF0ZUVuYWJsZWRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBDdXQsIENvcHksCi0gICAgICogUGFzdGUsIERlbGV0ZSwgYW5kIFNlbGVjdCBBbGwgYWN0aW9uIGhhbmRsZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUFjdGlvbnNFbmFibGVTdGF0ZSgpIHsKLSAgICAgICAgdGV4dEN1dEFjdGlvbi51cGRhdGVFbmFibGVkU3RhdGUoKTsKLSAgICAgICAgdGV4dENvcHlBY3Rpb24udXBkYXRlRW5hYmxlZFN0YXRlKCk7Ci0gICAgICAgIHRleHRQYXN0ZUFjdGlvbi51cGRhdGVFbmFibGVkU3RhdGUoKTsKLSAgICAgICAgdGV4dFNlbGVjdEFsbEFjdGlvbi51cGRhdGVFbmFibGVkU3RhdGUoKTsKLSAgICAgICAgdGV4dERlbGV0ZUFjdGlvbi51cGRhdGVFbmFibGVkU3RhdGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvV29ya3NwYWNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvV29ya3NwYWNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MmU2NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1dvcmtzcGFjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5TdGF0dXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb2dyZXNzLlByb2dyZXNzTW9uaXRvckpvYnNEaWFsb2c7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGFjdGlvbnMgd2hpY2ggaW52b2tlIGNvbW1hbmRzIAotICogaW1wbGVtZW50ZWQgaW4gb3JnLmVjbGlwc2UuY29yZS4qIG9uIGEgc2V0IG9mIHNlbGVjdGVkIHJlc291cmNlcy4KLSAqIAotICogSXQgaXRlcmF0ZXMgb3ZlciBhbGwgc2VsZWN0ZWQgcmVzb3VyY2VzOyBlcnJvcnMgYXJlIGNvbGxlY3RlZCBhbmQKLSAqIGRpc3BsYXllZCB0byB0aGUgdXNlciB2aWEgYSBwcm9ibGVtcyBkaWFsb2cgYXQgdGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uLgotICogVXNlciByZXF1ZXN0cyB0byBjYW5jZWwgdGhlIG9wZXJhdGlvbiBhcmUgcGFzc2VkIGFsb25nIHRvIHRoZSBjb3JlLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPmludm9rZU9wZXJhdGlvbjwvY29kZT4gLSB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24gb24gb25lIG9mIHRoZSAKLSAqICAgICAgc2VsZWN0ZWQgcmVzb3VyY2VzPC9saT4KLSAqICAgPGxpPjxjb2RlPmdldE9wZXJhdGlvbk1lc3NhZ2U8L2NvZGU+IC0gdG8gZnVybmlzaCBhIHRpdGxlIGZvciB0aGUgcHJvZ3Jlc3MKLSAqICAgICAgZGlhbG9nPC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPnNob3VsZFBlcmZvcm1SZXNvdXJjZVBydW5pbmc8L2NvZGU+IC0gcmVpbXBsZW1lbnQgdG8gdHVybiBvZmY8L2xpPgotICogICA8bGk+PGNvZGU+dXBkYXRlU2VsZWN0aW9uPC9jb2RlPiAtIGV4dGVuZCB0byByZWZpbmUgZW5hYmxlbWVudCBjcml0ZXJpYTwvbGk+Ci0gKiAgIDxsaT48Y29kZT5nZXRQcm9ibGVtc1RpdGxlPC9jb2RlPiAtIHJlaW1wbGVtZW50IHRvIGZ1cm5pc2ggYSB0aXRsZSBmb3IgdGhlCi0gKiAgICAgIHByb2JsZW1zIGRpYWxvZzwvbGk+Ci0gKiAgIDxsaT48Y29kZT5nZXRQcm9ibGVtc01lc3NhZ2U8L2NvZGU+IC0gcmVpbXBsZW1lbnQgdG8gZnVybmlzaCBhIG1lc3NhZ2UgZm9yIAotICogICAgICB0aGUgcHJvYmxlbXMgZGlhbG9nPC9saT4KLSAqICAgPGxpPjxjb2RlPnJ1bjwvY29kZT4gLSBleHRlbmQgdG8gPC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXb3Jrc3BhY2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0gICAgLyoqCi0gICAgICogVGhlIHNoZWxsIGluIHdoaWNoIHRvIHNob3cgdGhlIHByb2dyZXNzIGFuZCBwcm9ibGVtcyBkaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTaGVsbCBzaGVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIHdpdGggdGhlIGdpdmVuIHRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2hlbGwgdGhlIHNoZWxsIChmb3IgdGhlIG1vZGFsIHByb2dyZXNzIGRpYWxvZyBhbmQgZXJyb3IgbWVzc2FnZXMpCi0gICAgICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB1c2VkIGFzIHRoZSB0ZXh0IGZvciB0aGUgYWN0aW9uLCAKLSAgICAgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHRleHQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgV29ya3NwYWNlQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCkgewotICAgICAgICBzdXBlcih0ZXh0KTsKLSAgICAgICAgaWYgKHNoZWxsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNoZWxsID0gc2hlbGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYW4gZXJyb3IgZGlhbG9nIHRvIGRpc3BsYXkgdGhlIGdpdmVuIG1lc3NhZ2UuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGZyb20gVUkgdGhyZWFkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaEFjdGlvbl9pbnRlcm5hbEVycm9yOwotICAgICAgICB9Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBnZXRQcm9ibGVtc1RpdGxlKCksIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgPGNvZGU+aW52b2tlT3BlcmF0aW9uPC9jb2RlPiBvbiBlYWNoIG9mIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMsIHJlcG9ydGluZwotICAgICAqIHByb2dyZXNzIGFuZCBmaWVsZGluZyBjYW5jZWwgcmVxdWVzdHMgZnJvbSB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgaWYgYW4gYWN0aW9uIGlzIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQsIHRoZSBzYW1lIGFjdGlvbiBpbnN0YW5jZQotICAgICAqIGNhbiBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lcyBjb25jdXJyZW50bHkuICBUaGlzIG1ldGhvZCBtdXN0IG5vdCBhY2Nlc3MKLSAgICAgKiBvciBtb2RpZnkgYW55IG11dGFibGUgc3RhdGUgb24gYWN0aW9uIGNsYXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0gICAgICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBleGVjdXRpb24KLSAgICAgKi8KLSAgICBmaW5hbCBJU3RhdHVzIGV4ZWN1dGUoTGlzdCByZXNvdXJjZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgIAlNdWx0aVN0YXR1cyBlcnJvcnMgPSBudWxsOwotICAgICAgICAvLzFGVElNUU46IElUUENPUkU6V0lOIC0gY2xpZW50cyByZXF1aXJlZCB0byBkbyB0b28gbXVjaCBpdGVyYXRpb24gd29yawotICAgICAgICBpZiAoc2hvdWxkUGVyZm9ybVJlc291cmNlUHJ1bmluZygpKSB7Ci0gICAgICAgICAgICByZXNvdXJjZXMgPSBwcnVuZVJlc291cmNlcyhyZXNvdXJjZXMpOwotICAgICAgICB9Ci0gICAgICAgIC8vIDFGVjBCM1k6IElUUFVJOkFMTCAtIHN1YiBwcm9ncmVzcyBtb25pdG9ycyBncmFudWxhcml0eSBpc3N1ZXMKLSAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIiIsIHJlc291cmNlcy5zaXplKCkgKiAxMDAwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAvLyBGaXggZm9yIGJ1ZyAzMTc2OCAtIERvbid0IHByb3ZpZGUgYSB0YXNrIG5hbWUgaW4gYmVnaW5UYXNrCi0gICAgICAgIC8vIGFzIGl0IHdpbGwgYmUgYXBwZW5kZWQgdG8gZWFjaCBzdWJUYXNrIG1lc3NhZ2UuIE5lZWQgdG8KLSAgICAgICAgLy8gY2FsbCBzZXRUYXNrTmFtZSBhcyBpdHMgdGhlIG9ubHkgd2FzIHRvIGFzc3VyZSB0aGUgdGFzayBuYW1lIGlzCi0gICAgICAgIC8vIHNldCBpbiB0aGUgbW9uaXRvciAoc2VlIGJ1ZyAzMTgyNCkKLSAgICAgICAgbW9uaXRvci5zZXRUYXNrTmFtZShnZXRPcGVyYXRpb25NZXNzYWdlKCkpOwotICAgICAgICBJdGVyYXRvciByZXNvdXJjZXNFbnVtID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAocmVzb3VyY2VzRW51bS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSByZXNvdXJjZXNFbnVtLm5leHQoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyAxRlYwQjNZOiBJVFBVSTpBTEwgLSBzdWIgcHJvZ3Jlc3MgbW9uaXRvcnMgZ3JhbnVsYXJpdHkgaXNzdWVzCi0gICAgICAgICAgICAgICAgICAgIGludm9rZU9wZXJhdGlvbihyZXNvdXJjZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDApKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gcmVjb3JkRXJyb3IoZXJyb3JzLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlcnJvcnMgPT0gbnVsbCA/IFN0YXR1cy5PS19TVEFUVVMgOiBlcnJvcnM7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB0byBkaXNwbGF5IGZvciB0aGlzIGFjdGlvbidzIG9wZXJhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBob29rIG1ldGhvZCBpcyBpbnZva2VkIGluIGEgbm9uLVVJIHRocmVhZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0T3BlcmF0aW9uTWVzc2FnZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHRvIGRpc3BsYXkgZm9yIHRoaXMgYWN0aW9uJ3MgcHJvYmxlbXMgZGlhbG9nLgotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5Xb3Jrc3BhY2VBY3Rpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgYQotICAgICAqIHZhZ3VlIG1lc3NhZ2UgKGxvY2FsaXplZCBjb3VudGVycGFydCBvZiBzb21ldGhpbmcgbGlrZSAiVGhlIGZvbGxvd2luZyAKLSAgICAgKiBwcm9ibGVtcyBvY2N1cnJlZC4iKS4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdG8gcHJvdmlkZSBzb21ldGhpbmcgbW9yZQotICAgICAqIHN1aXRlZCB0byB0aGUgcGFydGljdWxhciBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJvYmxlbXMgbWVzc2FnZQotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2JsZW1zTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaEFjdGlvbl9wcm9ibGVtc01lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGl0bGUgZm9yIHRoaXMgYWN0aW9uJ3MgcHJvYmxlbXMgZGlhbG9nLgotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5Xb3Jrc3BhY2VBY3Rpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgYQotICAgICAqIGdlbmVyaWMgdGl0bGUgKGxvY2FsaXplZCBjb3VudGVycGFydCBvZiAiUHJvYmxlbXMiKS4gU3ViY2xhc3NlcyBtYXkgCi0gICAgICogcmVpbXBsZW1lbnQgdG8gcHJvdmlkZSBzb21ldGhpbmcgbW9yZSBzdWl0ZWQgdG8gdGhlIHBhcnRpY3VsYXIgYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByb2JsZW1zIGRpYWxvZyB0aXRsZQotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2JsZW1zVGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3Jrc3BhY2VBY3Rpb25fcHJvYmxlbXNUaXRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGVsbCBmb3IgdGhpcyBhY3Rpb24uIFRoaXMgc2hlbGwgaXMgdXNlZCBmb3IgdGhlIG1vZGFsIHByb2dyZXNzCi0gICAgICogYW5kIGVycm9yIGRpYWxvZ3MuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGVsbAotICAgICAqLwotICAgIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gc2hlbGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhpcyBhY3Rpb24ncyBvcGVyYXRpb24gb24gZWFjaCBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzLCByZXBvcnRpbmcKLSAgICAgKiBwcm9ncmVzcyB0bywgYW5kIGZpZWxkaW5nIGNhbmNlbCByZXF1ZXN0cyBmcm9tLCB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgaW52b2tlZCBpbiBhIG5vbi1VSSB0aHJlYWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlIG9uZSBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzCi0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0gICAgICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW52b2tlT3BlcmF0aW9uKElSZXNvdXJjZSByZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHJlc291cmNlIGlzIGEgZGVzY2VuZGVudCBvZiBhbnkgb2YgdGhlIHJlc291cmNlcwotICAgICAqIGluIHRoZSBnaXZlbiBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlcyB0aGUgbGlzdCBvZiByZXNvdXJjZXMgKGVsZW1lbnQgdHlwZTogPGNvZGU+SVJlc291cmNlPC9jb2RlPikKLSAgICAgKiBAcGFyYW0gY2hpbGQgdGhlIHJlc291cmNlIHRvIGNoZWNrCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5jaGlsZDwvY29kZT4gaXMgYSBkZXNjZW5kZW50IG9mIGFueSBvZiB0aGUKLSAgICAgKiAgIGVsZW1lbnRzIG9mIDxjb2RlPnJlc291cmNlczwvY29kZT4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGVzY2VuZGVudChMaXN0IHJlc291cmNlcywgSVJlc291cmNlIGNoaWxkKSB7Ci0gICAgICAgIElSZXNvdXJjZSBwYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnQoKTsKLSAgICAgICAgcmV0dXJuIHBhcmVudCAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgKHJlc291cmNlcy5jb250YWlucyhwYXJlbnQpIHx8IGlzRGVzY2VuZGVudChyZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBwcnVuaW5nIG9uIHRoZSBnaXZlbiBsaXN0IG9mIHJlc291cmNlcywgYXMgZGVzY3JpYmVkIGluIAotICAgICAqIDxjb2RlPnNob3VsZFBlcmZvcm1SZXNvdXJjZVBydW5pbmc8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlQ29sbGVjdGlvbiB0aGUgbGlzdCBvZiByZXNvdXJjZXMgKGVsZW1lbnQgdHlwZTogCi0gICAgICogICAgPGNvZGU+SVJlc291cmNlPC9jb2RlPikKLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHJlc291cmNlcyAoZWxlbWVudCB0eXBlOiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+KQotICAgICAqCQlhZnRlciBwcnVuaW5nLiAKLSAgICAgKiBAc2VlICNzaG91bGRQZXJmb3JtUmVzb3VyY2VQcnVuaW5nCi0gICAgICovCi0gICAgTGlzdCBwcnVuZVJlc291cmNlcyhMaXN0IHJlc291cmNlQ29sbGVjdGlvbikgewotICAgICAgICBMaXN0IHBydW5lZExpc3QgPSBuZXcgQXJyYXlMaXN0KHJlc291cmNlQ29sbGVjdGlvbik7Ci0gICAgICAgIEl0ZXJhdG9yIGVsZW1lbnRzRW51bSA9IHBydW5lZExpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGVsZW1lbnRzRW51bS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UgPSAoSVJlc291cmNlKSBlbGVtZW50c0VudW0ubmV4dCgpOwotICAgICAgICAgICAgaWYgKGlzRGVzY2VuZGVudChwcnVuZWRMaXN0LCBjdXJyZW50UmVzb3VyY2UpKQotICAgICAgICAgICAgICAgIGVsZW1lbnRzRW51bS5yZW1vdmUoKTsgLy9SZW1vdmVzIGN1cnJlbnRSZXNvdXJjZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcnVuZWRMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY29yZHMgdGhlIGNvcmUgZXhjZXB0aW9uIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlcgotICAgICAqIG9uY2UgdGhlIGFjdGlvbiBpcyBmaW5pc2hlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlcnJvciBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+Ci0gICAgICovCi0gICAgTXVsdGlTdGF0dXMgcmVjb3JkRXJyb3IoTXVsdGlTdGF0dXMgZXJyb3JzLCBDb3JlRXhjZXB0aW9uIGVycm9yKSB7Ci0gICAgICAgIGlmIChlcnJvcnMgPT0gbnVsbCkKLSAgICAgICAgCWVycm9ycyA9IG5ldyBNdWx0aVN0YXR1cyhJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwKLSAgICAgICAgICAgICAgICAgICAgSVN0YXR1cy5FUlJPUiwgZ2V0UHJvYmxlbXNNZXNzYWdlKCksIG51bGwpOwotICAgICAgICBlcnJvcnMubWVyZ2UoZXJyb3IuZ2V0U3RhdHVzKCkpOwotICAgICAgICByZXR1cm4gZXJyb3JzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db3JlV3JhcHBlckFjdGlvbjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JQWN0aW9uPC9jb2RlPgotICAgICAqIG1ldGhvZCB1c2VzIGEgPGNvZGU+UHJvZ3Jlc3NNb25pdG9yRGlhbG9nPC9jb2RlPiB0byBydW4gdGhlIG9wZXJhdGlvbi4gVGhlCi0gICAgICogb3BlcmF0aW9uIGNhbGxzIDxjb2RlPmV4ZWN1dGU8L2NvZGU+ICh3aGljaCwgaW4gdHVybiwgY2FsbHMgCi0gICAgICogPGNvZGU+aW52b2tlT3BlcmF0aW9uPC9jb2RlPikuIEFmdGVyd2FyZHMsIGFueSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPnMKLSAgICAgKiBlbmNvdW50ZXJlZCB3aGlsZSBydW5uaW5nIHRoZSBvcGVyYXRpb24gYXJlIHJlcG9ydGVkIHRvIHRoZSB1c2VyIHZpYSBhCi0gICAgICogcHJvYmxlbXMgZGlhbG9nLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgIAlmaW5hbCBJU3RhdHVzW10gZXJyb3JTdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGF0dXNbMF0gPSBXb3Jrc3BhY2VBY3Rpb24udGhpcy5leGVjdXRlKGdldEFjdGlvblJlc291cmNlcygpLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgbmV3IFByb2dyZXNzTW9uaXRvckpvYnNEaWFsb2coc2hlbGwpLnJ1bih0cnVlLCB0cnVlLCBvcCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB3ZSBjYXRjaCBDb3JlRXhjZXB0aW9uIGluIGV4ZWN1dGUoKSwgYnV0IHVuZXhwZWN0ZWQgcnVudGltZSBleGNlcHRpb25zIG9yIGVycm9ycyBtYXkgc3RpbGwgb2NjdXIKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3Jrc3BhY2VBY3Rpb25fbG9nVGl0bGUsIGdldENsYXNzKCkuZ2V0TmFtZSgpLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5sb2cobXNnLCBTdGF0dXNVdGlsLm5ld1N0YXR1cyhJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgICAgICBtc2csIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpKTsKLSAgICAgICAgICAgIGRpc3BsYXlFcnJvcihlLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgZXJyb3JzIG9jY3VycmVkLCBvcGVuIGFuIEVycm9yIGRpYWxvZyAmIGJ1aWxkIGEgbXVsdGkgc3RhdHVzIGVycm9yIGZvciBpdAotICAgICAgICBpZiAoZXJyb3JTdGF0dXNbMF0gIT0gbnVsbCAmJiAhZXJyb3JTdGF0dXNbMF0uaXNPSygpKSB7Ci0gICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIGdldFByb2JsZW1zVGl0bGUoKSwgbnVsbCwgLy8gbm8gc3BlY2lhbCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIGVycm9yU3RhdHVzWzBdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGFjdGlvbiBzaG91bGQgYXR0ZW1wdCB0byBvcHRpbWl6ZSB0aGUgcmVzb3VyY2VzIGJlaW5nCi0gICAgICogb3BlcmF0ZWQgb24uIFRoaXMga2luZCBvZiBwcnVuaW5nIG1ha2VzIHNlbnNlIHdoZW4gdGhlIG9wZXJhdGlvbiBoYXMgZGVwdGgKLSAgICAgKiBpbmZpbml0eSBzZW1hbnRpY3MgKHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBhcHBsaWVkIGV4cGxpY2l0bHkgdG8gYSByZXNvdXJjZQotICAgICAqIHRoZW4gaXQgaXMgYWxzbyBhcHBsaWVkIGltcGxpY2l0bHkgdG8gYWxsIHRoZSByZXNvdXJjZSdzIGRlc2NlbmRlbnRzKS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+V29ya3NwYWNlQWN0aW9uPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4uIFN1YmNsYXNzZXMgc2hvdWxkIHJlaW1wbGVtZW50IHRvIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiBpZiBwcnVuaW5nIGlzIG5vdCByZXF1aXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBydW5pbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCwgCi0gICAgICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHBydW5pbmcgaXMgbm90IGRlc2lyZWQKLSAgICAgKiAgIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRQZXJmb3JtUmVzb3VyY2VQcnVuaW5nKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+V29ya3NwYWNlQWN0aW9uPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+U2VsZWN0aW9uTGlzdGVuZXJBY3Rpb248L2NvZGU+IG1ldGhvZCBlbnN1cmVzIHRoYXQgdGhpcyBhY3Rpb24gaXMKLSAgICAgKiBkaXNhYmxlZCBpZiBhbnkgb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlcyBhcmUgaW5hY2Nlc3NpYmxlLiBTdWJjbGFzc2VzIG1heQotICAgICAqIGV4dGVuZCB0byByZWFjdCB0byBzZWxlY3Rpb24gY2hhbmdlczsgaG93ZXZlciwgaWYgdGhlIHN1cGVyIG1ldGhvZCByZXR1cm5zCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgb3ZlcnJpZGluZyBtZXRob2Qgc2hvdWxkIGFsc28gcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgciA9IChJUmVzb3VyY2UpIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFyLmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRoYXQgdGhlIGFjdGlvbiBpcyB0byBiZSBwZXJmb3JtZWQgb24uCi0gICAgICogQnkgZGVmYXVsdCByZXR1cm4gdGhlIHNlbGVjdGVkIHJlc291cmNlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbGlzdCBvZiByZXNvdXJjZSBlbGVtZW50cyAoZWxlbWVudCB0eXBlOiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+KQotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldEFjdGlvblJlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlbGVjdGVkUmVzb3VyY2VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVuIHRoZSBhY3Rpb24gaW4gdGhlIGJhY2tncm91bmQgcmF0aGVyIHRoYW4gd2l0aCB0aGUKLSAgICAgKiBwcm9ncmVzcyBkaWFsb2cuCi0gICAgICogQHBhcmFtIHJ1bGUgVGhlIHJ1bGUgdG8gYXBwbHkgdG8gdGhlIGJhY2tncm91bmQgam9iIG9yCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXNuJ3Qgb25lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bkluQmFja2dyb3VuZChJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotICAgIAlydW5JbkJhY2tncm91bmQocnVsZSwgKE9iamVjdCBbXSkgbnVsbCk7Ci0gICAgfQotIAotICAgIC8qKgotICAgICAqIFJ1biB0aGUgYWN0aW9uIGluIHRoZSBiYWNrZ3JvdW5kIHJhdGhlciB0aGFuIHdpdGggdGhlCi0gICAgICogcHJvZ3Jlc3MgZGlhbG9nLgotICAgICAqIEBwYXJhbSBydWxlIFRoZSBydWxlIHRvIGFwcGx5IHRvIHRoZSBiYWNrZ3JvdW5kIGpvYiBvcgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzbid0IG9uZS4KLSAgICAgKiBAcGFyYW0gam9iRmFtaWx5IGEgc2luZ2xlIGZhbWlseSB0aGF0IHRoZSBqb2Igc2hvdWxkIAotICAgICAqIGJlbG9uZyB0byBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW5JbkJhY2tncm91bmQoSVNjaGVkdWxpbmdSdWxlIHJ1bGUsIE9iamVjdCBqb2JGYW1pbHkpIHsKLSAgICAJaWYgKGpvYkZhbWlseSA9PSBudWxsKSAKLSAgICAJCXJ1bkluQmFja2dyb3VuZChydWxlLCAoT2JqZWN0IFtdKSBudWxsKTsKLSAgICAJZWxzZQotICAgIAkJcnVuSW5CYWNrZ3JvdW5kKHJ1bGUsIG5ldyBPYmplY3RbXSB7am9iRmFtaWx5fSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJ1biB0aGUgYWN0aW9uIGluIHRoZSBiYWNrZ3JvdW5kIHJhdGhlciB0aGFuIHdpdGggdGhlCi0gICAgICogcHJvZ3Jlc3MgZGlhbG9nLgotICAgICAqIEBwYXJhbSBydWxlIFRoZSBydWxlIHRvIGFwcGx5IHRvIHRoZSBiYWNrZ3JvdW5kIGpvYiBvcgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzbid0IG9uZS4KLSAgICAgKiBAcGFyYW0gam9iRmFtaWxpZXMgdGhlIGZhbWlsaWVzIHRoZSBqb2Igc2hvdWxkIGJlbG9uZyAKLSAgICAgKiB0byBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW5JbkJhY2tncm91bmQoSVNjaGVkdWxpbmdSdWxlIHJ1bGUsIGZpbmFsIE9iamVjdCBbXSBqb2JGYW1pbGllcykgewotICAgIAkvL29idGFpbiBhIGNvcHkgb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlcyBiZWZvcmUgdGhlIGpvYiBpcyBmb3JrZWQKLSAgICAJZmluYWwgTGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KGdldEFjdGlvblJlc291cmNlcygpKTsKLSAgICAgICAgSm9iIGpvYiA9IG5ldyBXb3Jrc3BhY2VKb2IocmVtb3ZlTW5lbW9uaWNzKGdldFRleHQoKSkpIHsKLSAgICAgICAgCQotICAgICAgICAJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjYmVsb25nc1RvKGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJaWYgKGpvYkZhbWlsaWVzID09IG51bGwgfHwgZmFtaWx5ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYkZhbWlsaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChmYW1pbHkuZXF1YWxzKGpvYkZhbWlsaWVzW2ldKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0gICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYiNydW5JbldvcmtzcGFjZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdvcmtzcGFjZUFjdGlvbi50aGlzLmV4ZWN1dGUocmVzb3VyY2VzLCBtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgaWYgKHJ1bGUgIT0gbnVsbCkKLSAgICAgICAgICAgIGpvYi5zZXRSdWxlKHJ1bGUpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1dvcmtzcGFjZU1vZGlmeURlbGVnYXRpbmdPcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvYWN0aW9ucy9Xb3Jrc3BhY2VNb2RpZnlEZWxlZ2F0aW5nT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZDAwYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1dvcmtzcGFjZU1vZGlmeURlbGVnYXRpbmdPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIEFuIG9wZXJhdGlvbiB3aGljaCBkZWxlZ2F0ZXMgaXRzIHdvcmsgdG8gYSBydW5uYWJsZSB0aGF0IG1vZGlmaWVzIHRoZQotICogd29ya3NwYWNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbiBleHRlbmRzCi0gICAgICAgIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcnVubmFibGUgdG8gZGVsZWdhdGUgd29yayB0byBhdCBleGVjdXRpb24gdGltZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBjb250ZW50OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24gd2hpY2ggd2lsbCBkZWxlZ2F0ZSBpdHMgd29yayB0byB0aGUgZ2l2ZW4KLSAgICAgKiBydW5uYWJsZSB1c2luZyB0aGUgcHJvdmlkZWQgc2NoZWR1bGluZyBydWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcnVubmFibGUgdG8gZGVsZWdhdGUgdG8gd2hlbiB0aGlzIG9wZXJhdGlvbiBpcyBleGVjdXRlZAotICAgICAqIEBwYXJhbSBydWxlCi0gICAgICogICAgICAgICAgICBUaGUgSVNjaGVkdWxpbmdSdWxlIHRvIHVzZSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbihJUnVubmFibGVXaXRoUHJvZ3Jlc3MgY29udGVudCwKLSAgICAgICAgICAgIElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0gICAgICAgIHN1cGVyKHJ1bGUpOwotICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgb3BlcmF0aW9uIHdoaWNoIHdpbGwgZGVsZWdhdGUgaXRzIHdvcmsgdG8gdGhlIGdpdmVuCi0gICAgICogcnVubmFibGUuIFNjaGVkdWxlIHVzaW5nIHRoZSBzdXBwbGllZCBzCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBydW5uYWJsZSB0byBkZWxlZ2F0ZSB0byB3aGVuIHRoaXMgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkCi0gICAgICovCi0gICAgcHVibGljIFdvcmtzcGFjZU1vZGlmeURlbGVnYXRpbmdPcGVyYXRpb24oSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGNvbnRlbnQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFdvcmtiZW5jaE1vZGlmeU9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZW50LnJ1bihtb25pdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgdGhyb3cgKENvcmVFeGNlcHRpb24pIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEVycm9yKQotICAgICAgICAgICAgICAgIHRocm93IChFcnJvcikgZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2FjdGlvbnMvV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNzQ3YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9hY3Rpb25zL1dvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JVGhyZWFkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiBBbiBvcGVyYXRpb24gd2hpY2ggcG90ZW50aWFsbHkgbWFrZXMgY2hhbmdlcyB0byB0aGUgd29ya3NwYWNlLiBBbGwgcmVzb3VyY2UgCi0gKiBtb2RpZmljYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCB1c2luZyB0aGlzIG9wZXJhdGlvbi4gVGhlIHByaW1hcnkgCi0gKiBjb25zZXF1ZW5jZSBvZiB1c2luZyB0aGlzIG9wZXJhdGlvbiBpcyB0aGF0IGV2ZW50cyB3aGljaCB0eXBpY2FsbHkgb2NjdXIgYXMgYQotICogcmVzdWx0IG9mIHdvcmtzcGFjZSBjaGFuZ2VzIChzdWNoIGFzIHRoZSBmaXJpbmcgb2YgcmVzb3VyY2UgZGVsdGFzLCAKLSAqIHBlcmZvcm1hbmNlIG9mIGF1dG9idWlsZHMsIGV0Yy4pIGFyZSBkZWZlcnJlZCB1bnRpbCB0aGUgb3V0ZXJtb3N0IG9wZXJhdGlvbgotICogaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCi0gKiA8cD4KLSAqIElmIGEgc2NoZWR1bGluZyBydWxlIGlzIHByb3ZpZGVkLCB0aGUgb3BlcmF0aW9uIHdpbGwgb2J0YWluIHRoYXQgc2NoZWR1bGluZwotICogcnVsZSBmb3IgdGhlIGR1cmF0aW9uIG9mIGl0cyA8Y29kZT5leGVjdXRlPC9jb2RlPiBtZXRob2QuICBJZiBubyBzY2hlZHVsaW5nCi0gKiBydWxlIGlzIHByb3ZpZGVkLCB0aGUgb3BlcmF0aW9uIHdpbGwgb2J0YWluIGEgc2NoZWR1bGluZyBydWxlIHRoYXQgbG9ja3MKLSAqIHRoZSBlbnRpcmUgd29ya3NwYWNlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIG9wZXJhdGlvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCA8Y29kZT5leGVjdXRlPC9jb2RlPiB0byBkbyB0aGUgd29yayBvZiB0aGUKLSAqIG9wZXJhdGlvbi4KLSAqIDwvcD4KLSAqIEBzZWUgSVNjaGVkdWxpbmdSdWxlCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2UjcnVuKElXb3Jrc3BhY2VSdW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvcikKLSAqICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcywgSVRocmVhZExpc3RlbmVyIHsKLSAgICBwcml2YXRlIElTY2hlZHVsaW5nUnVsZSBydWxlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLSAgICAgICAgdGhpcyhJREVXb3JrYmVuY2hQbHVnaW4uZ2V0UGx1Z2luV29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG9wZXJhdGlvbiB0aGF0IHdpbGwgcnVuIHVzaW5nIHRoZSBwcm92aWRlZAotICAgICAqIHNjaGVkdWxpbmcgcnVsZS4KLSAgICAgKiBAcGFyYW0gcnVsZSAgVGhlIElTY2hlZHVsaW5nUnVsZSB0byB1c2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHByb3RlY3RlZCBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLSAgICAgICAgdGhpcy5ydWxlID0gcnVsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGUgc3RlcHMgdGhhdCBhcmUgdG8gYmUgdHJlYXRlZCBhcyBhIHNpbmdsZSBsb2dpY2FsIHdvcmtzcGFjZQotICAgICAqIGNoYW5nZS4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzIGFuZCBmaWVsZAotICAgICAqICAgdXNlciByZXF1ZXN0cyB0byBjYW5jZWwKLSAgICAgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBmYWlscyBkdWUgdG8gYSBDb3JlRXhjZXB0aW9uCi0gICAgICogQGV4Y2VwdGlvbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMgZHVlIHRvIGFuIGV4Y2VwdGlvbiBvdGhlciB0aGFuIENvcmVFeGNlcHRpb24KLSAgICAgKiBAZXhjZXB0aW9uIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZGV0ZWN0cyBhIHJlcXVlc3QgdG8gY2FuY2VsLCAKLSAgICAgKiAgdXNpbmcgPGNvZGU+SVByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk8L2NvZGU+LCBpdCBzaG91bGQgZXhpdCBieSB0aHJvd2luZyAKLSAgICAgKiAgPGNvZGU+SW50ZXJydXB0ZWRFeGNlcHRpb248L2NvZGU+LiAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB0aHJvdyAKLSAgICAgKiAgPGNvZGU+T3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb248L2NvZGU+LCB3aGljaCBnZXRzIG1hcHBlZCB0byA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4KLSAgICAgKiAgYnkgdGhlIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+SVJ1bm5hYmxlV2l0aFByb2dyZXNzPC9jb2RlPiBtZXRob2QgaW5pdGlhdGVzIGEgYmF0Y2ggb2YgY2hhbmdlcyBieSAKLSAgICAgKiBpbnZva2luZyB0aGUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gbWV0aG9kIGFzIGEgd29ya3NwYWNlIHJ1bm5hYmxlIAotICAgICAqICg8Y29kZT5JV29ya3NwYWNlUnVubmFibGU8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGZpbmFsIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb25bXSBpdGVIb2xkZXIgPSBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvblsxXTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElXb3Jrc3BhY2VSdW5uYWJsZSB3b3Jrc3BhY2VSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUocG0pOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgaXQgb3V0c2lkZSB0aGUgd29ya3NwYWNlIHJ1bm5hYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICBpdGVIb2xkZXJbMF0gPSBlOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZS10aHJvdyBhcyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F1Z2h0IGFuZCByZS10aHJvd24gYXMgSW50ZXJydXB0ZWRFeGNlcHRpb24gYmVsb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvcmVFeGNlcHRpb24gYW5kIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGFyZSBwcm9wYWdhdGVkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5nZXRQbHVnaW5Xb3Jrc3BhY2UoKS5ydW4od29ya3NwYWNlUnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgIHJ1bGUsIElSZXNvdXJjZS5OT05FLCBtb25pdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBSZS10aHJvdyB0aGUgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgaWYgYW55IG9jY3VycmVkCi0gICAgICAgIGlmIChpdGVIb2xkZXJbMF0gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgaXRlSG9sZGVyWzBdOwotICAgICAgICB9Ci0gICAgfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElUaHJlYWRMaXN0ZW5lciN0aHJlYWRDaGFuZ2UoVGhyZWFkKTsKLQkgKi8KLQlwdWJsaWMgdm9pZCB0aHJlYWRDaGFuZ2UoVGhyZWFkIHRocmVhZCkgewotCQkvL3dlIG11c3QgbWFrZSBzdXJlIHdlIGFyZW4ndCB0cmFuc2ZlcnJpbmcgY29udHJvbCBhd2F5IGZyb20gYSB0aHJlYWQgdGhhdAotCQkvL2FscmVhZHkgb3ducyBhIHNjaGVkdWxpbmcgcnVsZSBiZWNhdXNlIHRoaXMgaXMgZGVhZGxvY2sgcHJvbmUgKGJ1ZyAxMDU0OTEpCi0JCWlmIChydWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUpvYiBjdXJyZW50Sm9iID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmN1cnJlbnRKb2IoKTsKLQkJaWYgKGN1cnJlbnRKb2IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVNjaGVkdWxpbmdSdWxlIGN1cnJlbnRSdWxlID0gY3VycmVudEpvYi5nZXRSdWxlKCk7Ci0JCWlmIChjdXJyZW50UnVsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgZm9yayBhIHRocmVhZCBmcm9tIGEgdGhyZWFkIG93bmluZyBhIHJ1bGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL0NvbnRhaW5lckdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL0NvbnRhaW5lckdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWMzZWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9Db250YWluZXJHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotCi0vKioKLSAqIEZvciBjcmVhdGluZyBmb2xkZXIgcmVzb3VyY2VzIHRoYXQgY3VycmVudGx5IGRvIG5vdCBleGlzdCwgCi0gKiBhbG9uZyBhIGdpdmVuIHdvcmtzcGFjZSBwYXRoLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogPHA+Ci0gKiBFeGFtcGxlIHVzYWdlOgotICogPHByZT4KLSAqIENvbnRhaW5lckdlbmVyYXRvciBnZW4gPSBuZXcgQ29udGFpbmVyR2VuZXJhdG9yKG5ldyBQYXRoKCIvQS9CIikpOwotICogSUNvbnRhaW5lciByZXMgPSBudWxsOwotICogdHJ5IHsKLSAqICAgcmVzID0gZ2VuLmdldENvbnRhaW5lcihtb25pdG9yKTsgLy8gY3JlYXRlcyBwcm9qZWN0IEEgYW5kIGZvbGRlciBCIGlmIHJlcXVpcmVkCi0gKiB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAqICAgLy8gaGFuZGxlIGZhaWx1cmUKLSAqIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLSAqICAgLy8gaGFuZGxlIGNhbmNlbGF0aW9uCi0gKiB9Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENvbnRhaW5lckdlbmVyYXRvciB7Ci0gICAgcHJpdmF0ZSBJUGF0aCBjb250YWluZXJGdWxsUGF0aDsKLQotICAgIHByaXZhdGUgSUNvbnRhaW5lciBjb250YWluZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZ2VuZXJhdG9yIGZvciB0aGUgY29udGFpbmVyIHJlc291cmNlIChmb2xkZXIgb3IgcHJvamVjdCkgYXQgdGhlCi0gICAgICogZ2l2ZW4gd29ya3NwYWNlIHBhdGguIEFzc3VtZXMgdGhlIHBhdGggaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogQ2FsbCA8Y29kZT5nZXRDb250YWluZXI8L2NvZGU+IHRvIGNyZWF0ZSBhbnkgbWlzc2luZyByZXNvdXJjZXMgYWxvbmcgdGhlCi0gICAgICogcGF0aC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFpbmVyUGF0aCB0aGUgd29ya3NwYWNlIHBhdGggb2YgdGhlIGNvbnRhaW5lcgotICAgICAqLwotICAgIHB1YmxpYyBDb250YWluZXJHZW5lcmF0b3IoSVBhdGggY29udGFpbmVyUGF0aCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmNvbnRhaW5lckZ1bGxQYXRoID0gY29udGFpbmVyUGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZm9sZGVyIHJlc291cmNlIGZvciB0aGUgZ2l2ZW4gZm9sZGVyIGhhbmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmb2xkZXJIYW5kbGUgdGhlIGhhbmRsZSB0byBjcmVhdGUgYSBmb2xkZXIgcmVzb3VyY2UKLSAgICAgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byBzaG93IHZpc3VhbCBwcm9ncmVzcwotICAgICAqIEByZXR1cm4gdGhlIGZvbGRlciBoYW5kbGUgKDxjb2RlPmZvbGRlckhhbmRsZTwvY29kZT4pCi0gICAgICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMKLSAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gaXMgY2FuY2VsZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIElGb2xkZXIgY3JlYXRlRm9sZGVyKElGb2xkZXIgZm9sZGVySGFuZGxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvbGRlckhhbmRsZS5jcmVhdGUoZmFsc2UsIHRydWUsIG1vbml0b3IpOwotCi0gICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCi0gICAgICAgIHJldHVybiBmb2xkZXJIYW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGZvbGRlciByZXNvdXJjZSBoYW5kbGUgZm9yIHRoZSBmb2xkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjcmVhdGUgdGhlIGZvbGRlciByZXNvdXJjZTsgdGhpcyBpcyB0aGUgcmVzcG9uc2liaWxpdHkKLSAgICAgKiBvZiA8Y29kZT5jcmVhdGVGb2xkZXI8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRhaW5lciB0aGUgcmVzb3VyY2UgY29udGFpbmVyCi0gICAgICogQHBhcmFtIGZvbGRlck5hbWUgdGhlIG5hbWUgb2YgdGhlIGZvbGRlcgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBmb2xkZXIgcmVzb3VyY2UgaGFuZGxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBJRm9sZGVyIGNyZWF0ZUZvbGRlckhhbmRsZShJQ29udGFpbmVyIGNvbnRhaW5lciwgU3RyaW5nIGZvbGRlck5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5nZXRGb2xkZXIobmV3IFBhdGgoZm9sZGVyTmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwcm9qZWN0IHJlc291cmNlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCBoYW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvamVjdEhhbmRsZSB0aGUgaGFuZGxlIHRvIGNyZWF0ZSBhIHByb2plY3QgcmVzb3VyY2UKLSAgICAgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byBzaG93IHZpc3VhbCBwcm9ncmVzcwotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgaGFuZGxlICg8Y29kZT5wcm9qZWN0SGFuZGxlPC9jb2RlPikKLSAgICAgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBmYWlscwotICAgICAqIEBleGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyBjYW5jZWxlZAotICAgICAqLwotICAgIHByaXZhdGUgSVByb2plY3QgY3JlYXRlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0SGFuZGxlLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzaygiIiwgMjAwMCk7Ly8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBwcm9qZWN0SGFuZGxlLmNyZWF0ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApKTsKLSAgICAgICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgcHJvamVjdEhhbmRsZS5vcGVuKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvamVjdEhhbmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcHJvamVjdCByZXNvdXJjZSBoYW5kbGUgZm9yIHRoZSBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgY3JlYXRlIHRoZSBwcm9qZWN0IHJlc291cmNlOyB0aGlzIGlzIHRoZSByZXNwb25zaWJpbGl0eQotICAgICAqIG9mIDxjb2RlPmNyZWF0ZVByb2plY3Q8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIHJvb3QgdGhlIHdvcmtzcGFjZSByb290IHJlc291cmNlCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0Ci0gICAgICogQHJldHVybiB0aGUgbmV3IHByb2plY3QgcmVzb3VyY2UgaGFuZGxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBjcmVhdGVQcm9qZWN0SGFuZGxlKElXb3Jrc3BhY2VSb290IHJvb3QsIFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gcm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoYXQgdGhpcyBnZW5lcmF0b3IncyBjb250YWluZXIgcmVzb3VyY2UgZXhpc3RzLiBDcmVhdGVzIGFueSBtaXNzaW5nCi0gICAgICogcmVzb3VyY2UgY29udGFpbmVycyBhbG9uZyB0aGUgcGF0aDsgZG9lcyBub3RoaW5nIGlmIHRoZSBjb250YWluZXIgcmVzb3VyY2UKLSAgICAgKiBhbHJlYWR5IGV4aXN0cy4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdpdGhpbiBhIHdvcmtzcGFjZSBtb2RpZnkgb3BlcmF0aW9uIHNpbmNlCi0gICAgICogaXQgbWF5IGNyZWF0ZSByZXNvdXJjZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0gICAgICogQHJldHVybiB0aGUgY29udGFpbmVyIHJlc291cmNlCi0gICAgICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMKLSAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gaXMgY2FuY2VsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSUNvbnRhaW5lciBnZW5lcmF0ZUNvbnRhaW5lcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5nZXRQbHVnaW5Xb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAuYmVnaW5UYXNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5Db250YWluZXJHZW5lcmF0b3JfcHJvZ3Jlc3NNZXNzYWdlLCAxMDAwICogY29udGFpbmVyRnVsbFBhdGguc2VnbWVudENvdW50KCkpOwotICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgLy8gRG9lcyB0aGUgY29udGFpbmVyIGV4aXN0IGFscmVhZHk/Ci0gICAgICAgICAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IGdldFdvcmtzcGFjZVJvb3QoKTsKLSAgICAgICAgICAgICAgICBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcm9vdC5maW5kTWVtYmVyKGNvbnRhaW5lckZ1bGxQYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29udGFpbmVyIGZvciB0aGUgZ2l2ZW4gcGF0aAotICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHJvb3Q7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXJGdWxsUGF0aC5zZWdtZW50Q291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50U2VnbWVudCA9IGNvbnRhaW5lckZ1bGxQYXRoLnNlZ21lbnQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGNvbnRhaW5lci5maW5kTWVtYmVyKGN1cnJlbnRTZWdtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuQ29udGFpbmVyR2VuZXJhdG9yX3BhdGhPY2N1cGllZCwgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIAkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwgMSwgbXNnLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcmVzb3VyY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0SGFuZGxlID0gY3JlYXRlUHJvamVjdEhhbmRsZShyb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlZ21lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGNyZWF0ZVByb2plY3QocHJvamVjdEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIGZvbGRlckhhbmRsZSA9IGNyZWF0ZUZvbGRlckhhbmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgY3VycmVudFNlZ21lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGNyZWF0ZUZvbGRlcihmb2xkZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgbnVsbCwgSVJlc291cmNlLk5PTkUsIG1vbml0b3IpOwotICAgICAgICByZXR1cm4gY29udGFpbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSByb290IHJlc291cmNlIGhhbmRsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHdvcmtzcGFjZSByb290IHJlc291cmNlIGhhbmRsZQotICAgICAqLwotICAgIHByaXZhdGUgSVdvcmtzcGFjZVJvb3QgZ2V0V29ya3NwYWNlUm9vdCgpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaFBsdWdpbi5nZXRQbHVnaW5Xb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL0NvbnRhaW5lclNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL0NvbnRhaW5lclNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzc0N2U0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9Db250YWluZXJTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqICAgU2ViYXN0aWFuIERhdmlkcyA8c2Rhdmlkc0BnbXguZGU+IC0gRml4IGZvciBidWcgMTkzNDYgLSBEaWFsb2cKLSAqICAgICBmb250IHNob3VsZCBiZSBhY3RpdmF0ZWQgYW5kIHVzZWQgYnkgb3RoZXIgY29tcG9uZW50cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VDb2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1pc2MuQ29udGFpbmVyU2VsZWN0aW9uR3JvdXA7Ci0KLS8qKgotICogQSBzdGFuZGFyZCBzZWxlY3Rpb24gZGlhbG9nIHdoaWNoIHNvbGljaXRzIGEgY29udGFpbmVyIHJlc291cmNlIGZyb20gdGhlIHVzZXIuCi0gKiBUaGUgPGNvZGU+Z2V0UmVzdWx0PC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgc2VsZWN0ZWQgY29udGFpbmVyIHJlc291cmNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogPHA+Ci0gKiBFeGFtcGxlOgotICogPHByZT4KLSAqIENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPQotICogICAgbmV3IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBpbml0aWFsU2VsZWN0aW9uLCBhbGxvd05ld0NvbnRhaW5lck5hbWUoKSwgbXNnKTsKLSAqCWRpYWxvZy5vcGVuKCk7Ci0gKglPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gKiA8L3ByZT4gCQotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uRGlhbG9nIHsKLSAgICAvLyB0aGUgd2lkZ2V0IGdyb3VwOwotICAgIENvbnRhaW5lclNlbGVjdGlvbkdyb3VwIGdyb3VwOwotCi0gICAgLy8gdGhlIHJvb3QgcmVzb3VyY2UgdG8gcG9wdWxhdGUgdGhlIHZpZXdlciB3aXRoCi0gICAgcHJpdmF0ZSBJQ29udGFpbmVyIGluaXRpYWxTZWxlY3Rpb247Ci0KLSAgICAvLyBhbGxvdyB0aGUgdXNlciB0byB0eXBlIGluIGEgbmV3IGNvbnRhaW5lciBuYW1lCi0gICAgcHJpdmF0ZSBib29sZWFuIGFsbG93TmV3Q29udGFpbmVyTmFtZSA9IHRydWU7Ci0KLSAgICAvLyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0gICAgTGFiZWwgc3RhdHVzTWVzc2FnZTsKLQotICAgIC8vZm9yIHZhbGlkYXRpbmcgdGhlIHNlbGVjdGlvbgotICAgIElTZWxlY3Rpb25WYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gICAgLy8gc2hvdyBjbG9zZWQgcHJvamVjdHMgYnkgZGVmYXVsdAotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93Q2xvc2VkUHJvamVjdHMgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlc291cmNlIGNvbnRhaW5lciBzZWxlY3Rpb24gZGlhbG9nIHJvb3RlZCBhdCB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0gICAgICogQWxsIHNlbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgdmFsaWQuIAotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBwYXJlbnQgc2hlbGwKLSAgICAgKiBAcGFyYW0gaW5pdGlhbFJvb3QgdGhlIGluaXRpYWwgc2VsZWN0aW9uIGluIHRoZSB0cmVlCi0gICAgICogQHBhcmFtIGFsbG93TmV3Q29udGFpbmVyTmFtZSA8Y29kZT50cnVlPC9jb2RlPiB0byBlbmFibGUgdGhlIHVzZXIgdG8gdHlwZSBpbgotICAgICAqICBhIG5ldyBjb250YWluZXIgbmFtZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiB0byByZXN0cmljdCB0aGUgdXNlciB0byBqdXN0Ci0gICAgICogIHNlbGVjdGluZyBmcm9tIGV4aXN0aW5nIG9uZXMKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGRpYWxvZywgb3IKLSAgICAgKiAgICA8Y29kZT5udWxsPC9jb2RlPiB0byBkaXNwbGF5IGEgZGVmYXVsdCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUNvbnRhaW5lciBpbml0aWFsUm9vdCwKLSAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dOZXdDb250YWluZXJOYW1lLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgICAgIHNldFRpdGxlKElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvbnRhaW5lclNlbGVjdGlvbkRpYWxvZ190aXRsZSk7Ci0gICAgICAgIHRoaXMuaW5pdGlhbFNlbGVjdGlvbiA9IGluaXRpYWxSb290OwotICAgICAgICB0aGlzLmFsbG93TmV3Q29udGFpbmVyTmFtZSA9IGFsbG93TmV3Q29udGFpbmVyTmFtZTsKLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNldE1lc3NhZ2UoSURFV29ya2JlbmNoTWVzc2FnZXMuQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nX21lc3NhZ2UpOwotICAgICAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkKLSAgICAgICAgICAgICAgICAuc2V0SGVscChzaGVsbCwgSUlERUhlbHBDb250ZXh0SWRzLkNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gY3JlYXRlIGNvbXBvc2l0ZSAKLSAgICAgICAgQ29tcG9zaXRlIGFyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLSAgICAgICAgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXNNZXNzYWdlICE9IG51bGwgJiYgdmFsaWRhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvck1zZyA9PSBudWxsIHx8IGVycm9yTXNnLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T2tCdXR0b24oKS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZS5zZXRGb3JlZ3JvdW5kKEpGYWNlQ29sb3JzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFcnJvclRleHQoc3RhdHVzTWVzc2FnZS5nZXREaXNwbGF5KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2Uuc2V0VGV4dChlcnJvck1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPa0J1dHRvbigpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vIGNvbnRhaW5lciBzZWxlY3Rpb24gZ3JvdXAKLSAgICAgICAgZ3JvdXAgPSBuZXcgQ29udGFpbmVyU2VsZWN0aW9uR3JvdXAoYXJlYSwgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgYWxsb3dOZXdDb250YWluZXJOYW1lLCBnZXRNZXNzYWdlKCksIHNob3dDbG9zZWRQcm9qZWN0cyk7Ci0gICAgICAgIGlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdyb3VwLnNldFNlbGVjdGVkQ29udGFpbmVyKGluaXRpYWxTZWxlY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzTWVzc2FnZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgc3RhdHVzTWVzc2FnZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgc3RhdHVzTWVzc2FnZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIHJldHVybiBkaWFsb2dBcmVhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db250YWluZXJTZWxlY3Rpb25EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+RGlhbG9nPC9jb2RlPiBtZXRob2QgYnVpbGRzIGEgbGlzdCBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgY29udGFpbmVycwotICAgICAqIGZvciBsYXRlciByZXRyaWV2YWwgYnkgdGhlIGNsaWVudCBhbmQgY2xvc2VzIHRoaXMgZGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQotICAgICAgICBMaXN0IGNob3NlbkNvbnRhaW5lclBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJUGF0aCByZXR1cm5WYWx1ZSA9IGdyb3VwLmdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0gICAgICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgY2hvc2VuQ29udGFpbmVyUGF0aExpc3QuYWRkKHJldHVyblZhbHVlKTsKLSAgICAgICAgc2V0UmVzdWx0KGNob3NlbkNvbnRhaW5lclBhdGhMaXN0KTsKLSAgICAgICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsaWRhdG9yIHRvIHVzZS4gIAotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWxpZGF0b3IgQSBzZWxlY3Rpb24gdmFsaWRhdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKElTZWxlY3Rpb25WYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB3aGV0aGVyIG9yIG5vdCBjbG9zZWQgcHJvamVjdHMgc2hvdWxkIGJlIHNob3duCi0gICAgICogaW4gdGhlIHNlbGVjdGlvbiBkaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNob3cgV2hldGhlciBvciBub3QgdG8gc2hvdyBjbG9zZWQgcHJvamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd0Nsb3NlZFByb2plY3RzKGJvb2xlYW4gc2hvdykgewotICAgICAgICB0aGlzLnNob3dDbG9zZWRQcm9qZWN0cyA9IHNob3c7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL0ZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9GaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZTgwYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL0ZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqICAgU2ViYXN0aWFuIERhdmlkcyA8c2Rhdmlkc0BnbXguZGU+IC0gRml4IGZvciBidWcgMTkzNDYgLSBEaWFsb2cKLSAqICAgICAgZm9udCBzaG91bGQgYmUgYWN0aXZhdGVkIGFuZCB1c2VkIGJ5IG90aGVyIGNvbXBvbmVudHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5taXNjLkNoZWNrYm94VHJlZUFuZExpc3RHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hWaWV3ZXJTb3J0ZXI7Ci0KLS8qKgotICogQSBzdGFuZGFyZCBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgd2hpY2ggc29saWNpdHMgYSBsaXN0IG9mIGZpbGVzIGZyb20gdGhlIHVzZXIuCi0gKiBUaGUgPGNvZGU+Z2V0UmVzdWx0PC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgc2VsZWN0ZWQgZmlsZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEV4YW1wbGU6Ci0gKiA8cHJlPgotICoJRmlsZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSAKLSAqCQluZXcgRmlsZVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCByb290RWxlbWVudCwgbXNnKTsKLSAqCWRpYWxvZy5zZXRJbml0aWFsU2VsZWN0aW9ucyhzZWxlY3RlZFJlc291cmNlcyk7Ci0gKglkaWFsb2cub3BlbigpOwotICoJcmV0dXJuIGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAqIDwvcHJlPgotICogPC9wPgotICogQGRlcHJlY2F0ZWQgVXNlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2csCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uRGlhbG9nIHsKLSAgICAvLyB0aGUgcm9vdCBmaWxlIHJlcHJlc2VudGF0aXZlIHRvIHBvcHVsYXRlIHRoZSB2aWV3ZXIgd2l0aAotICAgIHByaXZhdGUgRmlsZVN5c3RlbUVsZW1lbnQgcm9vdDsKLQotICAgIC8vIHRoZSB2aXN1YWwgc2VsZWN0aW9uIHdpZGdldCBncm91cAotICAgIENoZWNrYm94VHJlZUFuZExpc3RHcm91cCBzZWxlY3Rpb25Hcm91cDsKLQotICAgIC8vIGV4cGFuZCBhbGwgaXRlbXMgaW4gdGhlIHRyZWUgdmlldyBvbiBkaWFsb2cgb3BlbgotICAgIHByaXZhdGUgYm9vbGVhbiBleHBhbmRBbGxPbk9wZW4gPSBmYWxzZTsKLQotICAgIC8vIHNpemluZyBjb25zdGFudHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1NFTEVDVElPTl9XSURHRVRfV0lEVEggPSA1MDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1NFTEVDVElPTl9XSURHRVRfSEVJR0hUID0gMjUwOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyByb290ZWQgYXQgdGhlIGdpdmVuIGZpbGUgc3lzdGVtIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhlIHBhcmVudCBzaGVsbAotICAgICAqIEBwYXJhbSBmaWxlU3lzdGVtRWxlbWVudCB0aGUgcm9vdCBlbGVtZW50IHRvIHBvcHVsYXRlIHRoaXMgZGlhbG9nIHdpdGgKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGRpYWxvZywgb3IKLSAgICAgKiAgICA8Y29kZT5udWxsPC9jb2RlPiB0byBkaXNwbGF5IGEgZGVmYXVsdCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIEZpbGVTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgICAgICAgICBGaWxlU3lzdGVtRWxlbWVudCBmaWxlU3lzdGVtRWxlbWVudCwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgICBzZXRUaXRsZShJREVXb3JrYmVuY2hNZXNzYWdlcy5GaWxlU2VsZWN0aW9uRGlhbG9nX3RpdGxlKTsKLSAgICAgICAgcm9vdCA9IGZpbGVTeXN0ZW1FbGVtZW50OwotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2V0TWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5GaWxlU2VsZWN0aW9uRGlhbG9nX21lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCB0aGUgc2VsZWN0aW9uIGFuZCBkZXNlbGVjdGlvbiBidXR0b25zIHRvIHRoZSBkaWFsb2cuCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkU2VsZWN0aW9uQnV0dG9ucyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuUklHSFQpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLSAgICAgICAgY29tcG9zaXRlLnNldERhdGEoZGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIHNlbGVjdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgIHNlbGVjdEJ1dHRvbi5zZXRUZXh0KFNFTEVDVF9BTExfVElUTEUpOwotICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNlbGVjdGlvbkdyb3VwLnNldEFsbFNlbGVjdGlvbnModHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHNlbGVjdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgQnV0dG9uIGRlc2VsZWN0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgICAgZGVzZWxlY3RCdXR0b24uc2V0VGV4dChERVNFTEVDVF9BTExfVElUTEUpOwotICAgICAgICBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNlbGVjdGlvbkdyb3VwLnNldEFsbFNlbGVjdGlvbnMoZmFsc2UpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGRlc2VsZWN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZpc3VhbGx5IGNoZWNrcyB0aGUgcHJldmlvdXNseS1zcGVjaWZpZWQgZWxlbWVudHMgaW4gdGhlIGNvbnRhaW5lciAobGVmdCkKLSAgICAgKiBwb3J0aW9uIG9mIHRoaXMgZGlhbG9nJ3MgZmlsZSBzZWxlY3Rpb24gdmlld2VyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja0luaXRpYWxTZWxlY3Rpb25zKCkgewotICAgICAgICBJdGVyYXRvciBpdGVtc1RvQ2hlY2sgPSBnZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVtc1RvQ2hlY2suaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBGaWxlU3lzdGVtRWxlbWVudCBjdXJyZW50RWxlbWVudCA9IChGaWxlU3lzdGVtRWxlbWVudCkgaXRlbXNUb0NoZWNrCi0gICAgICAgICAgICAgICAgICAgIC5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgICAgIHNlbGVjdGlvbkdyb3VwLmluaXRpYWxDaGVja1RyZWVJdGVtKGN1cnJlbnRFbGVtZW50KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25Hcm91cC5pbml0aWFsQ2hlY2tMaXN0SXRlbShjdXJyZW50RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIGluIFdpbmRvdy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2hlbGwsCi0JCQkJSUlERUhlbHBDb250ZXh0SWRzLkZJTEVfU0VMRUNUSU9OX0RJQUxPRyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlKCkgewotICAgICAgICBzdXBlci5jcmVhdGUoKTsKLSAgICAgICAgaW5pdGlhbGl6ZURpYWxvZygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBwYWdlIGdyb3VwCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLSAgICAgICAgY3JlYXRlTWVzc2FnZUFyZWEoY29tcG9zaXRlKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBmYWtlIHBhcmVudCBvZiB0aGUgcm9vdCB0byBiZSB0aGUgZGlhbG9nIGlucHV0IGVsZW1lbnQuCi0gICAgICAgIC8vIFVzZSBhbiBlbXB0eSBsYWJlbCBzbyB0aGF0IGRpc3BsYXkgb2YgdGhlIGVsZW1lbnQncyBmdWxsIG5hbWUKLSAgICAgICAgLy8gZG9lc24ndCBpbmNsdWRlIGEgY29uZnVzaW5nIGxhYmVsCi0gICAgICAgIEZpbGVTeXN0ZW1FbGVtZW50IGlucHV0ID0gbmV3IEZpbGVTeXN0ZW1FbGVtZW50KCIiLCBudWxsLCB0cnVlKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGlucHV0LmFkZENoaWxkKHJvb3QpOwotICAgICAgICByb290LnNldFBhcmVudChpbnB1dCk7Ci0KLSAgICAgICAgc2VsZWN0aW9uR3JvdXAgPSBuZXcgQ2hlY2tib3hUcmVlQW5kTGlzdEdyb3VwKGNvbXBvc2l0ZSwgaW5wdXQsCi0gICAgICAgICAgICAgICAgZ2V0Rm9sZGVyUHJvdmlkZXIoKSwgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwKLSAgICAgICAgICAgICAgICBnZXRGaWxlUHJvdmlkZXIoKSwgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgU1dULk5PTkUsCi0gICAgICAgICAgICAgICAgU0laSU5HX1NFTEVDVElPTl9XSURHRVRfV0lEVEgsIC8vIHNpbmNlIHRoaXMgcGFnZSBoYXMgbm8gb3RoZXIgc2lnbmlmaWNhbnRseS1zaXplZAotICAgICAgICAgICAgICAgIFNJWklOR19TRUxFQ1RJT05fV0lER0VUX0hFSUdIVCk7IC8vIHdpZGdldHMgd2UgbmVlZCB0byBoYXJkY29kZSB0aGUgY29tYmluZWQgd2lkZ2V0J3MKLSAgICAgICAgLy8gc2l6ZSwgb3RoZXJ3aXNlIGl0IHdpbGwgb3BlbiB0b28gc21hbGwKLQotICAgICAgICBJQ2hlY2tTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgZ2V0T2tCdXR0b24oKS5zZXRFbmFibGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uR3JvdXAuZ2V0Q2hlY2tlZEVsZW1lbnRDb3VudCgpID4gMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgV29ya2JlbmNoVmlld2VyU29ydGVyIHNvcnRlciA9IG5ldyBXb3JrYmVuY2hWaWV3ZXJTb3J0ZXIoKTsKLSAgICAgICAgc2VsZWN0aW9uR3JvdXAuc2V0VHJlZVNvcnRlcihzb3J0ZXIpOwotICAgICAgICBzZWxlY3Rpb25Hcm91cC5zZXRMaXN0U29ydGVyKHNvcnRlcik7Ci0gICAgICAgIHNlbGVjdGlvbkdyb3VwLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgYWRkU2VsZWN0aW9uQnV0dG9ucyhjb21wb3NpdGUpOwotCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB0cmVlIHZpZXcgb2YgdGhlIGZpbGUgc3lzdGVtIGVsZW1lbnQKLSAgICAgKiB3aWxsIGJlIGZ1bGx5IGV4cGFuZGVkIHdoZW4gdGhlIGRpYWxvZyBpcyBvcGVuZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgdG8gZXhwYW5kIGFsbCBvbiBkaWFsb2cgb3BlbiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEV4cGFuZEFsbE9uT3BlbigpIHsKLSAgICAgICAgcmV0dXJuIGV4cGFuZEFsbE9uT3BlbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29udGVudCBwcm92aWRlciBmb3IgPGNvZGU+RmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+cyB0aGF0IHJldHVybnMgCi0gICAgICogb25seSBmaWxlcyBhcyBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIElUcmVlQ29udGVudFByb3ZpZGVyIGdldEZpbGVQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLSAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEZpbGVTeXN0ZW1FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEZpbGVTeXN0ZW1FbGVtZW50KSBvKS5nZXRGaWxlcygpLmdldENoaWxkcmVuKG8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29udGVudCBwcm92aWRlciBmb3IgPGNvZGU+RmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+cyB0aGF0IHJldHVybnMgCi0gICAgICogb25seSBmb2xkZXJzIGFzIGNoaWxkcmVuLgotICAgICAqLwotICAgIHByaXZhdGUgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Rm9sZGVyUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBGaWxlU3lzdGVtRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChGaWxlU3lzdGVtRWxlbWVudCkgbykuZ2V0Rm9sZGVycygpLmdldENoaWxkcmVuKG8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGlzIGRpYWxvZydzIGNvbnRyb2xzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGlhbG9nKCkgewotICAgICAgICAvLyBpbml0aWFsaXplIHBhZ2UJCi0gICAgICAgIGlmIChnZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBnZXRPa0J1dHRvbigpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjaGVja0luaXRpYWxTZWxlY3Rpb25zKCk7Ci0gICAgICAgIHNlbGVjdGlvbkdyb3VwLmFib3V0VG9PcGVuKCk7Ci0gICAgICAgIGlmIChleHBhbmRBbGxPbk9wZW4pCi0gICAgICAgICAgICBzZWxlY3Rpb25Hcm91cC5leHBhbmRBbGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+RmlsZVNlbGVjdGlvbkRpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPkRpYWxvZzwvY29kZT4gbWV0aG9kIGJ1aWxkcyBhIGxpc3Qgb2YgdGhlIHNlbGVjdGVkIGZpbGVzIGZvciBsYXRlciAKLSAgICAgKiByZXRyaWV2YWwgYnkgdGhlIGNsaWVudCBhbmQgY2xvc2VzIHRoaXMgZGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgSXRlcmF0b3IgcmVzdWx0RW51bSA9IHNlbGVjdGlvbkdyb3VwLmdldEFsbENoZWNrZWRMaXN0SXRlbXMoKTsKLSAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChyZXN1bHRFbnVtLmhhc05leHQoKSkKLSAgICAgICAgICAgIGxpc3QuYWRkKHJlc3VsdEVudW0ubmV4dCgpKTsKLSAgICAgICAgc2V0UmVzdWx0KGxpc3QpOwotICAgICAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciB0aGUgdHJlZSB2aWV3IG9mIHRoZSBmaWxlIHN5c3RlbSBlbGVtZW50Ci0gICAgICogd2lsbCBiZSBmdWxseSBleHBhbmRlZCB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4cGFuZEFsbCB0cnVlIHRvIGV4cGFuZCBhbGwgb24gZGlhbG9nIG9wZW4sIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRBbGxPbk9wZW4oYm9vbGVhbiBleHBhbmRBbGwpIHsKLSAgICAgICAgZXhwYW5kQWxsT25PcGVuID0gZXhwYW5kQWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9NYXJrZXJSZXNvbHV0aW9uU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvTWFya2VyUmVzb2x1dGlvblNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzgyYWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9NYXJrZXJSZXNvbHV0aW9uU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKiAgIFNlYmFzdGlhbiBEYXZpZHMgPHNkYXZpZHNAZ214LmRlPiAtIEZpeCBmb3IgYnVnIDE5MzQ2IC0gRGlhbG9nIGZvbnQgc2hvdWxkIGJlIGFjdGl2YXRlZCBhbmQgdXNlZCBieSBvdGhlciBjb21wb25lbnRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLlNpbXBsZUxpc3RDb250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogRGlhbG9nIHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBmcm9tIGEgbGlzdCBvZiBtYXJrZXIKLSAqIHJlc29sdXRpb25zLgotICogPHA+Ci0gKiBUaGlzIGRpYWxvZyBtYXkgYmUgaW5zdGFudGlhdGVkLCBpdCBpcyBub3QgaW50ZW50ZWQgdG8gCi0gKiBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrZXJSZXNvbHV0aW9uU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uRGlhbG9nIHsKLSAgICAvKioKLSAgICAgKiBMaXN0IHdpZHRoIGluIGNoYXJhY3RlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IExJU1RfV0lEVEggPSA2MDsKLQotICAgIC8qKgotICAgICAqIExpc3QgaGVpZ2h0IGluIGNoYXJhY3RlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IExJU1RfSEVJR0hUID0gMTA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWFya2VyIHJlc29sdXRpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgSU1hcmtlclJlc29sdXRpb25bXSByZXNvbHV0aW9uczsKLQotICAgIC8qKgotICAgICAqIExpc3QgdG8gZGlzcGxheSB0aGUgcmVzb2x1dGlvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0Vmlld2VyIGxpc3RWaWV3ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgZGlhbG9nIHRvIGRpc3BsYXkKLSAgICAgKiB0aGUgZ2l2ZW4gcmVzb2x1dGlvbnMuCi0gICAgICogPHA+Ci0gICAgICogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgcmVzb2x1dGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHNoZWxsIHRoZSBwYXJlbnQgc2hlbGwKLSAgICAgKiBAcGFyYW0gbWFya2VyUmVzb2x1dGlvbnMgdGhlIHJlc29sdXRpb25zIHRvIGRpc3BsYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFya2VyUmVzb2x1dGlvblNlbGVjdGlvbkRpYWxvZyhTaGVsbCBzaGVsbCwKLSAgICAgICAgICAgIElNYXJrZXJSZXNvbHV0aW9uW10gbWFya2VyUmVzb2x1dGlvbnMpIHsKLSAgICAgICAgc3VwZXIoc2hlbGwpOwotICAgICAgICBpZiAobWFya2VyUmVzb2x1dGlvbnMgPT0gbnVsbCB8fCBtYXJrZXJSZXNvbHV0aW9ucy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJlc29sdXRpb25zID0gbWFya2VyUmVzb2x1dGlvbnM7Ci0gICAgICAgIHNldFRpdGxlKElERVdvcmtiZW5jaE1lc3NhZ2VzLk1hcmtlclJlc29sdXRpb25TZWxlY3Rpb25EaWFsb2dfdGl0bGUpOwotICAgICAgICBzZXRNZXNzYWdlKElERVdvcmtiZW5jaE1lc3NhZ2VzLk1hcmtlclJlc29sdXRpb25TZWxlY3Rpb25EaWFsb2dfbWVzc2FnZUxhYmVsKTsKLSAgICAgICAgc2V0SW5pdGlhbFNlbGVjdGlvbnMobmV3IE9iamVjdFtdIHsgbWFya2VyUmVzb2x1dGlvbnNbMF0gfSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXaW5kb3cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5ld1NoZWxsLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5NQVJLRVJfUkVTT0xVVElPTl9TRUxFQ1RJT05fRElBTE9HKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotICAgICAgICAvLyBDcmVhdGUgbGFiZWwKLSAgICAgICAgY3JlYXRlTWVzc2FnZUFyZWEoY29tcG9zaXRlKTsKLSAgICAgICAgLy8gQ3JlYXRlIGxpc3Qgdmlld2VyCQotICAgICAgICBsaXN0Vmlld2VyID0gbmV3IExpc3RWaWV3ZXIoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0gICAgICAgICAgICAgICAgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKExJU1RfSEVJR0hUKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoTElTVF9XSURUSCk7Ci0gICAgICAgIGxpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGxpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIC8vIFNldCB0aGUgbGFiZWwgcHJvdmlkZXIJCQotICAgICAgICBsaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHJlc29sdXRpb24ncyBsYWJlbC4KLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudCA9PSBudWxsID8gIiIgOiAoKElNYXJrZXJSZXNvbHV0aW9uKSBlbGVtZW50KS5nZXRMYWJlbCgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIFNldCB0aGUgY29udGVudCBwcm92aWRlcgotICAgICAgICBTaW1wbGVMaXN0Q29udGVudFByb3ZpZGVyIGNwID0gbmV3IFNpbXBsZUxpc3RDb250ZW50UHJvdmlkZXIoKTsKLSAgICAgICAgY3Auc2V0RWxlbWVudHMocmVzb2x1dGlvbnMpOwotICAgICAgICBsaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjcCk7Ci0gICAgICAgIGxpc3RWaWV3ZXIuc2V0SW5wdXQobmV3IE9iamVjdCgpKTsgLy8gaXQgaXMgaWdub3JlZCBidXQgbXVzdCBiZSBub24tbnVsbAotCi0gICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KLSAgICAgICAgbGlzdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0gICAgICAgICAgICAgICAgZ2V0SW5pdGlhbEVsZW1lbnRTZWxlY3Rpb25zKCkpLCB0cnVlKTsKLQotICAgICAgICAvLyBBZGQgYSBzZWxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyCi0gICAgICAgIGxpc3RWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgT0sgYnV0dG9uIGVuYWJsZW1lbnQKLSAgICAgICAgICAgICAgICBnZXRPa0J1dHRvbigpLnNldEVuYWJsZWQoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIEFkZCBkb3VibGUtY2xpY2sgbGlzdGVuZXIKLSAgICAgICAgbGlzdFZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBva1ByZXNzZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGxpc3RWaWV3ZXIKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIHNldFJlc3VsdChzZWxlY3Rpb24udG9MaXN0KCkpOwotICAgICAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvTmV3Rm9sZGVyRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvTmV3Rm9sZGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NDQzYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL05ld0ZvbGRlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBTZWJhc3RpYW4gRGF2aWRzIDxzZGF2aWRzQGdteC5kZT4gLSBGaXggZm9yIGJ1ZyAxOTM0NiAtIERpYWxvZwotICogICAgIGZvbnQgc2hvdWxkIGJlIGFjdGl2YXRlZCBhbmQgdXNlZCBieSBvdGhlciBjb21wb25lbnRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5DcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb2dyZXNzLlByb2dyZXNzTW9uaXRvckpvYnNEaWFsb2c7Ci0KLS8qKgotICogVGhlIE5ld0ZvbGRlckRpYWxvZyBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBmb2xkZXIuCi0gKiBUaGUgZm9sZGVyIGNhbiBvcHRpb25hbGx5IGJlIGxpbmtlZCB0byBhIGZpbGUgc3lzdGVtIGZvbGRlci4KLSAqIDxwPgotICogTk9URTogCi0gKiBBIGxpbmtlZCBmb2xkZXIgY2FuIG9ubHkgYmUgY3JlYXRlZCBhdCB0aGUgcHJvamVjdCAKLSAqIGxldmVsLiBUaGUgd2lkZ2V0cyB1c2VkIHRvIHNwZWNpZnkgYSBsaW5rIHRhcmdldCBhcmUgZGlzYWJsZWQgCi0gKiBpZiB0aGUgc3VwcGxpZWQgY29udGFpbmVyIGlzIG5vdCBhIHByb2plY3QuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXdGb2xkZXJEaWFsb2cgZXh0ZW5kcyBTZWxlY3Rpb25TdGF0dXNEaWFsb2cgewotICAgIC8vIHdpZGdldHMKLSAgICBwcml2YXRlIFRleHQgZm9sZGVyTmFtZUZpZWxkOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gYWR2YW5jZWRCdXR0b247Ci0KLSAgICBwcml2YXRlIENyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXAgbGlua2VkUmVzb3VyY2VHcm91cDsKLQotICAgIHByaXZhdGUgSUNvbnRhaW5lciBjb250YWluZXI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RMaW5rQ2hlY2sgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogUGFyZW50IGNvbXBvc2l0ZSBvZiB0aGUgYWR2YW5jZWQgd2lkZ2V0IGdyb3VwIGZvciBjcmVhdGluZyAKLSAgICAgKiBsaW5rZWQgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGxpbmtlZFJlc291cmNlUGFyZW50OwotCi0gICAgLyoqCi0gICAgICogTGlua2VkIHJlc291cmNlcyB3aWRnZXQgZ3JvdXAuIE51bGwgaWYgYWR2YW5jZWQgc2VjdGlvbiBpcyBub3QgdmlzaWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBsaW5rZWRSZXNvdXJjZUNvbXBvc2l0ZTsKLQotICAgIC8qKgotICAgICAqIEhlaWdodCBvZiB0aGUgZGlhbG9nIHdpdGhvdXQgdGhlICJhZHZhbmNlZCIgbGlua2VkIHJlc291cmNlIGdyb3VwLiAKLSAgICAgKiBTZXQgd2hlbiB0aGUgYWR2YW5jZWQgZ3JvdXAgaXMgZmlyc3QgbWFkZSB2aXNpYmxlLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBiYXNpY1NoZWxsSGVpZ2h0ID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgTmV3Rm9sZGVyRGlhbG9nCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHBhcmVudCBvZiB0aGUgbmV3IGRpYWxvZwotICAgICAqIEBwYXJhbSBjb250YWluZXIgcGFyZW50IG9mIHRoZSBuZXcgZm9sZGVyCi0gICAgICovCi0gICAgcHVibGljIE5ld0ZvbGRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLSAgICAgICAgc2V0VGl0bGUoSURFV29ya2JlbmNoTWVzc2FnZXMuTmV3Rm9sZGVyRGlhbG9nX3RpdGxlKTsKLSAgICAgICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLSAgICAgICAgc2V0U3RhdHVzTGluZUFib3ZlQnV0dG9ucyh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBmb2xkZXIgdXNpbmcgdGhlIG5hbWUgYW5kIGxpbmsgdGFyZ2V0IGVudGVyZWQKLSAgICAgKiBieSB0aGUgdXNlci4KLSAgICAgKiBTZXRzIHRoZSBkaWFsb2cgcmVzdWx0IHRvIHRoZSBjcmVhdGVkIGZvbGRlci4gIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVSZXN1bHQoKSB7Ci0gICAgICAgIC8vRG8gbm90aGluZyBoZXJlIGFzIHdlIAotICAgIAkvL25lZWQgdG8ga25vdyB0aGUgcmVzdWx0Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBpbiBXaW5kb3cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNoZWxsLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5ORVdfRk9MREVSX0RJQUxPRyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NyZWF0ZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlKCkgewotICAgICAgICBzdXBlci5jcmVhdGUoKTsKLSAgICAgICAgLy8gaW5pdGlhbGx5IGRpc2FibGUgdGhlIG9rIGJ1dHRvbiBzaW5jZSB3ZSBkb24ndCBwcmVzZXQgdGhlCi0gICAgICAgIC8vIGZvbGRlciBuYW1lIGZpZWxkCi0gICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB3aWRnZXQgZm9yIGFkdmFuY2VkIG9wdGlvbnMuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBZHZhbmNlZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkKLSAgICAgICAgICAgICAgICAuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotICAgICAgICBpZiAocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihSZXNvdXJjZXNQbHVnaW4uUFJFRl9ESVNBQkxFX0xJTktJTkcpID09IGZhbHNlCi0gICAgICAgICAgICAgICAgJiYgaXNWYWxpZENvbnRhaW5lcigpKSB7Ci0gICAgICAgICAgICBsaW5rZWRSZXNvdXJjZVBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBsaW5rZWRSZXNvdXJjZVBhcmVudC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICAgICAgbGlua2VkUmVzb3VyY2VQYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICAgICAgbGlua2VkUmVzb3VyY2VQYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICAgICAgICAgIGFkdmFuY2VkQnV0dG9uID0gbmV3IEJ1dHRvbihsaW5rZWRSZXNvdXJjZVBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICAgICAgYWR2YW5jZWRCdXR0b24uc2V0Rm9udChsaW5rZWRSZXNvdXJjZVBhcmVudC5nZXRGb250KCkpOwotICAgICAgICAgICAgYWR2YW5jZWRCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5zaG93QWR2YW5jZWQpOwotICAgICAgICAgICAgc2V0QnV0dG9uTGF5b3V0RGF0YShhZHZhbmNlZEJ1dHRvbik7Ci0gICAgICAgICAgICBHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKSBhZHZhbmNlZEJ1dHRvbi5nZXRMYXlvdXREYXRhKCk7Ci0gICAgICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgICAgICAgICBhZHZhbmNlZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAgICAgYWR2YW5jZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVBZHZhbmNlZEJ1dHRvblNlbGVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICAgIGxpbmtlZFJlc291cmNlR3JvdXAgPSBuZXcgQ3JlYXRlTGlua2VkUmVzb3VyY2VHcm91cChJUmVzb3VyY2UuRk9MREVSLAotICAgICAgICAgICAgICAgIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVMaW5rZWRSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RMaW5rQ2hlY2sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgbmV3IENyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXAuSVN0cmluZ1ZhbHVlKCl7Ci0JCQkJCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJCQkJCWZvbGRlck5hbWVGaWVsZC5zZXRUZXh0KHN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQkJCXJldHVybiBmb2xkZXJOYW1lRmllbGQuZ2V0VGV4dCgpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICBjcmVhdGVGb2xkZXJOYW1lR3JvdXAoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlQWR2YW5jZWRDb250cm9scyhjb21wb3NpdGUpOwotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGZvbGRlciBuYW1lIHNwZWNpZmljYXRpb24gY29udHJvbHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvbGRlck5hbWVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgIC8vIHByb2plY3Qgc3BlY2lmaWNhdGlvbiBncm91cAotICAgICAgICBDb21wb3NpdGUgZm9sZGVyR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgZm9sZGVyR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGZvbGRlckdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIC8vIG5ldyBwcm9qZWN0IGxhYmVsCi0gICAgICAgIExhYmVsIGZvbGRlckxhYmVsID0gbmV3IExhYmVsKGZvbGRlckdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGZvbGRlckxhYmVsLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIGZvbGRlckxhYmVsLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuTmV3Rm9sZGVyRGlhbG9nX25hbWVMYWJlbCk7Ci0KLSAgICAgICAgLy8gbmV3IHByb2plY3QgbmFtZSBlbnRyeSBmaWVsZAotICAgICAgICBmb2xkZXJOYW1lRmllbGQgPSBuZXcgVGV4dChmb2xkZXJHcm91cCwgU1dULkJPUkRFUik7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIOwotICAgICAgICBmb2xkZXJOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgZm9sZGVyTmFtZUZpZWxkLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIGZvbGRlck5hbWVGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlTGlua2VkUmVzb3VyY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGZvbGRlciByZXNvdXJjZSBoYW5kbGUgZm9yIHRoZSBmb2xkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBUaGUgZm9sZGVyIGhhbmRsZSBpcyBjcmVhdGVkIHJlbGF0aXZlIHRvIHRoZSBjb250YWluZXIgc3BlY2lmaWVkIGR1cmluZyAKLSAgICAgKiBvYmplY3QgY3JlYXRpb24uIAotICAgICAqCi0gICAgICogQHBhcmFtIGZvbGRlck5hbWUgdGhlIG5hbWUgb2YgdGhlIGZvbGRlciByZXNvdXJjZSB0byBjcmVhdGUgYSBoYW5kbGUgZm9yCi0gICAgICogQHJldHVybiB0aGUgbmV3IGZvbGRlciByZXNvdXJjZSBoYW5kbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIElGb2xkZXIgY3JlYXRlRm9sZGVySGFuZGxlKFN0cmluZyBmb2xkZXJOYW1lKSB7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBjb250YWluZXIuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUGF0aCBmb2xkZXJQYXRoID0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZvbGRlck5hbWUpOwotICAgICAgICBJRm9sZGVyIGZvbGRlckhhbmRsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKGZvbGRlclBhdGgpOwotCi0gICAgICAgIHJldHVybiBmb2xkZXJIYW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmb2xkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgb3B0aW9uYWxseSBsaW5raW5nIHRvCi0gICAgICogdGhlIHNwZWNpZmllZCBsaW5rIHRhcmdldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9sZGVyTmFtZSBuYW1lIG9mIHRoZSBuZXcgZm9sZGVyCi0gICAgICogQHBhcmFtIGxpbmtUYXJnZXROYW1lIG5hbWUgb2YgdGhlIGxpbmsgdGFyZ2V0IGZvbGRlci4gbWF5IGJlIG51bGwuCi0gICAgICogQHJldHVybiBJRm9sZGVyIHRoZSBuZXcgZm9sZGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBJRm9sZGVyIGNyZWF0ZU5ld0ZvbGRlcihTdHJpbmcgZm9sZGVyTmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5rVGFyZ2V0TmFtZSkgewotICAgICAgICBmaW5hbCBJRm9sZGVyIGZvbGRlckhhbmRsZSA9IGNyZWF0ZUZvbGRlckhhbmRsZShmb2xkZXJOYW1lKTsKLQotICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soSURFV29ya2JlbmNoTWVzc2FnZXMuTmV3Rm9sZGVyRGlhbG9nX3Byb2dyZXNzLCAyMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5rVGFyZ2V0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVySGFuZGxlLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlckhhbmRsZS5jcmVhdGVMaW5rKG5ldyBQYXRoKGxpbmtUYXJnZXROYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkFMTE9XX01JU1NJTkdfTE9DQUwsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBQcm9ncmVzc01vbml0b3JKb2JzRGlhbG9nKGdldFNoZWxsKCkpCi0gICAgICAgICAgICAgICAgICAgIC5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgIGlmIChleGNlcHRpb24uZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIElERVdvcmtiZW5jaE1lc3NhZ2VzLk5ld0ZvbGRlckRpYWxvZ19lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gbm8gc3BlY2lhbCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAoKENvcmVFeGNlcHRpb24pIGV4Y2VwdGlvbi5nZXRUYXJnZXRFeGNlcHRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29yZUV4Y2VwdGlvbnMgYXJlIGhhbmRsZWQgYWJvdmUsIGJ1dCB1bmV4cGVjdGVkIHJ1bnRpbWUgZXhjZXB0aW9ucyBhbmQgZXJyb3JzIG1heSBzdGlsbCBvY2N1ci4KLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4ubG9nKGdldENsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiY3JlYXRlTmV3Rm9sZGVyIiwgZXhjZXB0aW9uLmdldFRhcmdldEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIElERVdvcmtiZW5jaE1lc3NhZ2VzLk5ld0ZvbGRlckRpYWxvZ19lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuTmV3Rm9sZGVyRGlhbG9nX2ludGVybmFsRXJyb3IsIGV4Y2VwdGlvbi5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmb2xkZXJIYW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvd3MvaGlkZXMgdGhlIGFkdmFuY2VkIG9wdGlvbiB3aWRnZXRzLiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBZHZhbmNlZEJ1dHRvblNlbGVjdCgpIHsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotICAgICAgICBQb2ludCBzaGVsbFNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBnZXREaWFsb2dBcmVhKCk7Ci0KLSAgICAgICAgaWYgKGxpbmtlZFJlc291cmNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpbmtlZFJlc291cmNlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGxpbmtlZFJlc291cmNlQ29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5sYXlvdXQoKTsKLSAgICAgICAgICAgIHNoZWxsLnNldFNpemUoc2hlbGxTaXplLngsIGJhc2ljU2hlbGxIZWlnaHQpOwotICAgICAgICAgICAgYWR2YW5jZWRCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5zaG93QWR2YW5jZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGJhc2ljU2hlbGxIZWlnaHQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBiYXNpY1NoZWxsSGVpZ2h0ID0gc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkueTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpbmtlZFJlc291cmNlQ29tcG9zaXRlID0gbGlua2VkUmVzb3VyY2VHcm91cAotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29udGVudHMobGlua2VkUmVzb3VyY2VQYXJlbnQpOwotICAgICAgICAgICAgc2hlbGxTaXplID0gc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLSAgICAgICAgICAgIHNoZWxsLnNldFNpemUoc2hlbGxTaXplKTsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5sYXlvdXQoKTsKLSAgICAgICAgICAgIGFkdmFuY2VkQnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuaGlkZUFkdmFuY2VkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY29udGFpbmVyIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IgaXMKLSAgICAgKiBhIHZhbGlkIHBhcmVudCBmb3IgY3JlYXRpbmcgbGlua2VkIHJlc291cmNlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRhaW5lciBzcGVjaWZpZWQgaW4gCi0gICAgICogCXRoZSBjb25zdHJ1Y3RvciBpcyBhIHZhbGlkIHBhcmVudCBmb3IgY3JlYXRpbmcgbGlua2VkIHJlc291cmNlcy4KLSAgICAgKiAJPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vIGxpbmtlZCByZXNvdXJjZXMgbWF5IGJlIGNyZWF0ZWQgd2l0aCB0aGUKLSAgICAgKiAJc3BlY2lmaWVkIGNvbnRhaW5lciBhcyBhIHBhcmVudC4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRDb250YWluZXIoKSB7Ci0gICAgICAgIGlmIChjb250YWluZXIuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5QUk9KRUNUKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXRQbHVnaW5Xb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGNvbnRhaW5lcjsKLSAgICAgICAgICAgIFN0cmluZ1tdIG5hdHVyZUlkcyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXROYXR1cmVJZHMoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYXR1cmVJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJUHJvamVjdE5hdHVyZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHdvcmtzcGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hdHVyZURlc2NyaXB0b3IobmF0dXJlSWRzW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBkZXNjcmlwdG9yLmlzTGlua2luZ0FsbG93ZWQoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgLy8gcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpcyBjbG9zZWQKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIGRpYWxvZydzIHN0YXR1cyBsaW5lIHRvIHJlZmxlY3QgdGhlIGdpdmVuIHN0YXR1cy4gSXQgaXMgc2FmZSB0byBjYWxsCi0gICAgICogdGhpcyBtZXRob2QgYmVmb3JlIHRoZSBkaWFsb2cgaGFzIGJlZW4gb3BlbmVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBpZiAoZmlyc3RMaW5rQ2hlY2sgJiYgc3RhdHVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGRvbid0IHNob3cgdGhlIGZpcnN0IHZhbGlkYXRpb24gcmVzdWx0IGFzIGFuIGVycm9yLgotICAgICAgICAgICAgLy8gZml4ZXMgYnVnIDI5NjU5Ci0gICAgICAgICAgICBTdGF0dXMgbmV3U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBzdGF0dXMuZ2V0UGx1Z2luKCksCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5nZXRDb2RlKCksIHN0YXR1cy5nZXRNZXNzYWdlKCksIHN0YXR1cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICBzdXBlci51cGRhdGVTdGF0dXMobmV3U3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLnVwZGF0ZVN0YXR1cyhzdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBkaWFsb2cncyBzdGF0dXMgbGluZSB0byByZWZsZWN0IHRoZSBnaXZlbiBzdGF0dXMuIEl0IGlzIHNhZmUgdG8gY2FsbAotICAgICAqIHRoaXMgbWV0aG9kIGJlZm9yZSB0aGUgZGlhbG9nIGhhcyBiZWVuIG9wZW5lZC4KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB1cGRhdGVTdGF0dXMobmV3IFN0YXR1cyhzZXZlcml0eSwgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsIHNldmVyaXR5LCBtZXNzYWdlLCBudWxsKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZvbGRlciBuYW1lIGFuZCBsaW5rIGxvY2F0aW9uIGFyZSB2YWxpZC4KLSAgICAgKiBEaXNhYmxlIHRoZSBPSyBidXR0b24gaWYgdGhlIGZvbGRlciBuYW1lIGFuZCBsaW5rIGxvY2F0aW9uIGFyZSB2YWxpZC4KLSAgICAgKiBhIG1lc3NhZ2UgdGhhdCBpbmRpY2F0ZXMgdGhlIHByb2JsZW0gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUxpbmtlZFJlc291cmNlKCkgewotICAgICAgICBib29sZWFuIHZhbGlkID0gdmFsaWRhdGVGb2xkZXJOYW1lKCk7Ci0KLSAgICAgICAgaWYgKHZhbGlkKSB7Ci0gICAgICAgICAgICBJRm9sZGVyIGxpbmtIYW5kbGUgPSBjcmVhdGVGb2xkZXJIYW5kbGUoZm9sZGVyTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0gICAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IGxpbmtlZFJlc291cmNlR3JvdXAKLSAgICAgICAgICAgICAgICAgICAgLnZhbGlkYXRlTGlua0xvY2F0aW9uKGxpbmtIYW5kbGUpOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUikKLSAgICAgICAgICAgICAgICBnZXRPa0J1dHRvbigpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZ2V0T2tCdXR0b24oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cy5pc09LKCkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgZ2V0T2tCdXR0b24oKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIGZvbGRlciBuYW1lIGlzIHZhbGlkLgotICAgICAqCi0gICAgICogQHJldHVybiBudWxsIGlmIHRoZSBuZXcgZm9sZGVyIG5hbWUgaXMgdmFsaWQuCi0gICAgICogCWEgbWVzc2FnZSB0aGF0IGluZGljYXRlcyB0aGUgcHJvYmxlbSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlRm9sZGVyTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBmb2xkZXJOYW1lRmllbGQuZ2V0VGV4dCgpOwotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IGNvbnRhaW5lci5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgSVN0YXR1cyBuYW1lU3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShuYW1lLCBJUmVzb3VyY2UuRk9MREVSKTsKLQotICAgICAgICBpZiAoIiIuZXF1YWxzKG5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5OZXdGb2xkZXJEaWFsb2dfZm9sZGVyTmFtZUVtcHR5KTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZVN0YXR1cy5pc09LKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhuYW1lU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgobmFtZSk7Ci0gICAgICAgIGlmIChjb250YWluZXIuZ2V0Rm9sZGVyKHBhdGgpLmV4aXN0cygpCi0gICAgICAgICAgICAgICAgfHwgY29udGFpbmVyLmdldEZpbGUocGF0aCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5OZXdGb2xkZXJEaWFsb2dfYWxyZWFkeUV4aXN0cywgbmFtZSkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVN0YXR1cyhJU3RhdHVzLk9LLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uU3RhdHVzRGlhbG9nI29rUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlTdHJpbmcgbGlua1RhcmdldCA9IGxpbmtlZFJlc291cmNlR3JvdXAuZ2V0TGlua1RhcmdldCgpOwotICAgICAgICBJRm9sZGVyIGZvbGRlciA9IGNyZWF0ZU5ld0ZvbGRlcihmb2xkZXJOYW1lRmllbGQuZ2V0VGV4dCgpLCBsaW5rVGFyZ2V0KTsKLSAgICAgICAgaWYgKGZvbGRlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHNldFNlbGVjdGlvblJlc3VsdChuZXcgSUZvbGRlcltdIHsgZm9sZGVyIH0pOwotICAgICAgICAKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1Byb2plY3RMb2NhdGlvbk1vdmVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9Qcm9qZWN0TG9jYXRpb25Nb3ZlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZDk1ODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1Byb2plY3RMb2NhdGlvbk1vdmVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKiAgICBTZWJhc3RpYW4gRGF2aWRzIDxzZGF2aWRzQGdteC5kZT4gLSBGaXggZm9yIGJ1ZyAxOTM0NiAtIERpYWxvZwotICogICAgICAgIGZvbnQgc2hvdWxkIGJlIGFjdGl2YXRlZCBhbmQgdXNlZCBieSBvdGhlciBjb21wb25lbnRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VDb2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLlByb2plY3RDb250ZW50c0xvY2F0aW9uQXJlYTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5Qcm9qZWN0Q29udGVudHNMb2NhdGlvbkFyZWEuSUVycm9yTWVzc2FnZVJlcG9ydGVyOwotCi0vKioKLSAqIFRoZSBQcm9qZWN0TG9jYXRpb25Nb3ZlRGlhbG9nIGlzIHRoZSBkaWFsb2cgdXNlZCB0byBzZWxlY3QgdGhlIGxvY2F0aW9uIG9mIGEKLSAqIHByb2plY3QgZm9yIG1vdmluZy4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RMb2NhdGlvbk1vdmVEaWFsb2cgZXh0ZW5kcyBTZWxlY3Rpb25EaWFsb2cgewotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCXByaXZhdGUgTGFiZWwgc3RhdHVzTWVzc2FnZUxhYmVsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfTE9DQVRJT05fU0VMRUNUSU9OX1RJVExFID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nX3NlbGVjdGlvblRpdGxlOwotCi0KLQlwcml2YXRlIFByb2plY3RDb250ZW50c0xvY2F0aW9uQXJlYSBsb2NhdGlvbkFyZWE7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBQcm9qZWN0TG9jYXRpb25Nb3ZlRGlhbG9nIG9uIHRoZSBzdXBwbGllZCBwcm9qZWN0IHBhcmVudGVkIGJ5Ci0JICogdGhlIHBhcmVudFNoZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBleGlzdGluZ1Byb2plY3QKLQkgKi8KLQlwdWJsaWMgUHJvamVjdExvY2F0aW9uTW92ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVByb2plY3QgZXhpc3RpbmdQcm9qZWN0KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0VGl0bGUoUFJPSkVDVF9MT0NBVElPTl9TRUxFQ1RJT05fVElUTEUpOwotCQl0aGlzLnByb2plY3QgPSBleGlzdGluZ1Byb2plY3Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZyNzZXRNZXNzYWdlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlci5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotCQlpZiAoc3RhdHVzTWVzc2FnZUxhYmVsICE9IG51bGwpIHsKLQkJCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCQlzdGF0dXNNZXNzYWdlTGFiZWwuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJCXN0YXR1c01lc3NhZ2VMYWJlbC5zZXRUb29sVGlwVGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJCWdldE9rQnV0dG9uKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoSkZhY2VDb2xvcnMKLQkJCQkJCS5nZXRFcnJvclRleHQoc3RhdHVzTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSkpOwotCQkJCXN0YXR1c01lc3NhZ2VMYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQkJCXN0YXR1c01lc3NhZ2VMYWJlbC5zZXRUb29sVGlwVGV4dChtZXNzYWdlKTsKLQkJCQlnZXRPa0J1dHRvbigpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBXaW5kb3cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNoZWxsLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5QUk9KRUNUX0xPQ0FUSU9OX1NFTEVDVElPTl9ESUFMT0cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250ZW50ID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJZ2V0T2tCdXR0b24oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIHBhZ2UgZ3JvdXAKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJbG9jYXRpb25BcmVhID0gbmV3IFByb2plY3RDb250ZW50c0xvY2F0aW9uQXJlYShnZXRFcnJvclJlcG9ydGVyKCksIGNvbXBvc2l0ZSwKLQkJCQl0aGlzLnByb2plY3QpOwotCi0JCS8vIFNjYWxlIHRoZSBidXR0b24gYmFzZWQgb24gdGhlIHJlc3Qgb2YgdGhlIGRpYWxvZwotCQlzZXRCdXR0b25MYXlvdXREYXRhKGxvY2F0aW9uQXJlYS5nZXRCcm93c2VCdXR0b24oKSk7Ci0KLQkJLy8gQWRkIGluIGEgbGFiZWwgZm9yIHN0YXR1cyBtZXNzYWdlcyBpZiByZXF1aXJlZAotCQlzdGF0dXNNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCXN0YXR1c01lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCS8vIE1ha2UgaXQgdHdvIGxpbmVzLgotCQlzdGF0dXNNZXNzYWdlTGFiZWwuc2V0VGV4dCgiIFxuICIpOyAvLyROT04tTkxTLTEkCi0KLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXQgYW4gZXJyb3IgcmVwb3J0ZXIgZm9yIHRoZSByZWNlaXZlci4KLQkgKiBAcmV0dXJuIElFcnJvck1lc3NhZ2VSZXBvcnRlcgotCSAqLwotCXByaXZhdGUgSUVycm9yTWVzc2FnZVJlcG9ydGVyIGdldEVycm9yUmVwb3J0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSUVycm9yTWVzc2FnZVJlcG9ydGVyKCl7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLlByb2plY3RDb250ZW50c0xvY2F0aW9uQXJlYS5JRXJyb3JNZXNzYWdlUmVwb3J0ZXIjcmVwb3J0RXJyb3IoamF2YS5sYW5nLlN0cmluZykKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQkJCXNldE1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgYmVpbmcgbWFuaXB1bGF0ZWQuCi0JICovCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFRoZSA8Y29kZT5Qcm9qZWN0TG9jYXRpb25Nb3ZlRGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0JICogPGNvZGU+RGlhbG9nPC9jb2RlPiBtZXRob2QgYnVpbGRzIGEgdHdvIGVsZW1lbnQgbGlzdCAtIHRoZSBmaXJzdAotCSAqIGVsZW1lbnQgaXMgdGhlIHByb2plY3QgbmFtZSBhbmQgdGhlIHNlY29uZCBvbmUgaXMgdGhlIGxvY2F0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGQoZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWxpc3QuYWRkKGxvY2F0aW9uQXJlYS5nZXRQcm9qZWN0TG9jYXRpb24oKSk7Ci0JCXNldFJlc3VsdChsaXN0KTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGI3MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1Byb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBTZWJhc3RpYW4gRGF2aWRzIDxzZGF2aWRzQGdteC5kZT4gLSBGaXggZm9yIGJ1ZyAxOTM0NiAtIERpYWxvZyBmb250Ci0gKiAgICAgc2hvdWxkIGJlIGFjdGl2YXRlZCBhbmQgdXNlZCBieSBvdGhlciBjb21wb25lbnRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuUHJvamVjdENvbnRlbnRzTG9jYXRpb25BcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLlByb2plY3RDb250ZW50c0xvY2F0aW9uQXJlYS5JRXJyb3JNZXNzYWdlUmVwb3J0ZXI7Ci0KLS8qKgotICogVGhlIFByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZyBpcyB0aGUgZGlhbG9nIHVzZWQgdG8gc2VsZWN0IHRoZSBuYW1lIGFuZAotICogbG9jYXRpb24gb2YgYSBwcm9qZWN0IGZvciBjb3B5aW5nLgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uU3RhdHVzRGlhbG9nIHsKLQkvLyB3aWRnZXRzCi0JcHJpdmF0ZSBUZXh0IHByb2plY3ROYW1lRmllbGQ7Ci0KLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwcml2YXRlIFByb2plY3RDb250ZW50c0xvY2F0aW9uQXJlYSBsb2NhdGlvbkFyZWE7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9OQU1FX0xBQkVMID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nX25hbWVMYWJlbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQUk9KRUNUX0xPQ0FUSU9OX1NFTEVDVElPTl9USVRMRSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZ19zZWxlY3Rpb25UaXRsZTsKLQotCS8vIGNvbnN0YW50cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSCA9IDI1MDsKLQotCXByaXZhdGUgYm9vbGVhbiBmaXJzdExvY2F0aW9uQ2hlY2s7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBQcm9qZWN0TG9jYXRpb25TZWxlY3Rpb25EaWFsb2cgb24gdGhlIHN1cHBsaWVkIHByb2plY3QgcGFyZW50ZWQKLQkgKiBieSB0aGUgcGFyZW50U2hlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogQHBhcmFtIGV4aXN0aW5nUHJvamVjdAotCSAqLwotCXB1YmxpYyBQcm9qZWN0TG9jYXRpb25TZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsCi0JCQlJUHJvamVjdCBleGlzdGluZ1Byb2plY3QpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQlzZXRUaXRsZShQUk9KRUNUX0xPQ0FUSU9OX1NFTEVDVElPTl9USVRMRSk7Ci0JCXNldFN0YXR1c0xpbmVBYm92ZUJ1dHRvbnModHJ1ZSk7Ci0JCXRoaXMucHJvamVjdCA9IGV4aXN0aW5nUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0aGUgbWVzc2FnZS4gSWYgaXQgaXMgbnVsbCB0aGVuIGNvbnRpbnVlIG90aGVyd2lzZSBpbmZvcm0gdGhlIHVzZXIKLQkgKiB2aWEgdGhlIHN0YXR1cyB2YWx1ZSBhbmQgZGlzYWJsZSB0aGUgT0suCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZSB0byBzaG93IGlmIGl0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBseVZhbGlkYXRpb25SZXN1bHQoU3RyaW5nIGVycm9yTXNnKSB7Ci0JCWludCBjb2RlOwotCQlib29sZWFuIGFsbG93RmluaXNoID0gZmFsc2U7Ci0KLQkJaWYgKGVycm9yTXNnID09IG51bGwpIHsKLQkJCWNvZGUgPSBJU3RhdHVzLk9LOwotCQkJZXJyb3JNc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJYWxsb3dGaW5pc2ggPSB0cnVlOwotCQl9IGVsc2UgaWYgKGZpcnN0TG9jYXRpb25DaGVjaykKLQkJCWNvZGUgPSBJU3RhdHVzLk9LOwotCQllbHNlCi0JCQljb2RlID0gSVN0YXR1cy5FUlJPUjsKLQotCQl1cGRhdGVTdGF0dXMobmV3IFN0YXR1cyhjb2RlLCBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwgY29kZSwKLQkJCQllcnJvck1zZywgbnVsbCkpOwotCQlnZXRPa0J1dHRvbigpLnNldEVuYWJsZWQoYWxsb3dGaW5pc2gpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIGVudHJpZXMgYXJlIHZhbGlkLiBJZiBzbyByZXR1cm4gbnVsbC4gT3RoZXJ3aXNlIHJldHVybgotCSAqIGEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzIHRoZSBwcm9ibGVtLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNoZWNrVmFsaWQoKSB7Ci0JCVN0cmluZyB2YWxpZCA9IGNoZWNrVmFsaWROYW1lKCk7Ci0JCWlmICh2YWxpZCAhPSBudWxsKQotCQkJcmV0dXJuIHZhbGlkOwotCQlyZXR1cm4gbG9jYXRpb25BcmVhLmNoZWNrVmFsaWRMb2NhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBlbnRyaWVzIGluIHRoZSB3aWRnZXQgYXJlIHZhbGlkLiBJZiB0aGV5IGFyZSByZXR1cm4gbnVsbAotCSAqIG90aGVyd2lzZSByZXR1cm4gYSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMgdGhlIHByb2JsZW0uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY2hlY2tWYWxpZE5hbWUoKSB7Ci0KLQkJU3RyaW5nIG5hbWUgPSB0aGlzLnByb2plY3ROYW1lRmllbGQuZ2V0VGV4dCgpOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IGdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKTsKLQkJSVN0YXR1cyBuYW1lU3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShuYW1lLCBJUmVzb3VyY2UuUFJPSkVDVCk7Ci0JCWlmICghbmFtZVN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gbmFtZVN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCUlQcm9qZWN0IG5ld1Byb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JCWlmIChuZXdQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlQcm9qZWN0QWN0aW9uX2FscmVhZHlFeGlzdHMsIG5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIDxjb2RlPlByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotCSAqIDxjb2RlPlNlbGVjdGlvblN0YXR1c0RpYWxvZzwvY29kZT4gbWV0aG9kIGJ1aWxkcyBhIHR3byBlbGVtZW50IGxpc3QgLQotCSAqIHRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBwcm9qZWN0IG5hbWUgYW5kIHRoZSBzZWNvbmQgb25lIGlzIHRoZSBsb2NhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVzdWx0KCkgewotCi0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZCh0aGlzLnByb2plY3ROYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJbGlzdC5hZGQobG9jYXRpb25BcmVhLmdldFByb2plY3RMb2NhdGlvbigpKTsKLQkJc2V0UmVzdWx0KGxpc3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzaGVsbCwKLQkJCQlJSURFSGVscENvbnRleHRJZHMuUFJPSkVDVF9MT0NBVElPTl9TRUxFQ1RJT05fRElBTE9HKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gcGFnZSBncm91cAotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQljcmVhdGVQcm9qZWN0TmFtZUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWxvY2F0aW9uQXJlYSA9IG5ldyBQcm9qZWN0Q29udGVudHNMb2NhdGlvbkFyZWEoZ2V0RXJyb3JSZXBvcnRlcigpLAotCQkJCWNvbXBvc2l0ZSwgcHJvamVjdCk7Ci0JCWxvY2F0aW9uQXJlYS51cGRhdGVQcm9qZWN0TmFtZShwcm9qZWN0TmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBsaXN0ZW5lciB0aGF0IGlzIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGVudHJpZXMgZm9yIHRoZSByZWNlaXZlcgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVOYW1lTGlzdGVuZXIoKSB7Ci0KLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXNldExvY2F0aW9uRm9yU2VsZWN0aW9uKCk7Ci0JCQkJYXBwbHlWYWxpZGF0aW9uUmVzdWx0KGNoZWNrVmFsaWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJdGhpcy5wcm9qZWN0TmFtZUZpZWxkLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwcm9qZWN0IG5hbWUgc3BlY2lmaWNhdGlvbiBjb250cm9scy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJLy8gcHJvamVjdCBzcGVjaWZpY2F0aW9uIGdyb3VwCi0JCUNvbXBvc2l0ZSBwcm9qZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcHJvamVjdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlwcm9qZWN0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gbmV3IHByb2plY3QgbGFiZWwKLQkJTGFiZWwgcHJvamVjdExhYmVsID0gbmV3IExhYmVsKHByb2plY3RHcm91cCwgU1dULk5PTkUpOwotCQlwcm9qZWN0TGFiZWwuc2V0Rm9udChmb250KTsKLQkJcHJvamVjdExhYmVsLnNldFRleHQoUFJPSkVDVF9OQU1FX0xBQkVMKTsKLQotCQkvLyBuZXcgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0JCXByb2plY3ROYW1lRmllbGQgPSBuZXcgVGV4dChwcm9qZWN0R3JvdXAsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCXByb2plY3ROYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcHJvamVjdE5hbWVGaWVsZC5zZXRGb250KGZvbnQpOwotCi0JCS8vIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmaXJzdCBiZWZvcmUgbGlzdGVuZXIKLQkJLy8gdG8gYXZvaWQgaGFuZGxpbmcgYW4gZXZlbnQgZHVyaW5nIHRoZSBjcmVhdGlvbi4KLQkJcHJvamVjdE5hbWVGaWVsZC5zZXRUZXh0KGdldENvcHlOYW1lRm9yKGdldFByb2plY3QoKS5nZXROYW1lKCkpKTsKLQkJcHJvamVjdE5hbWVGaWVsZC5zZWxlY3RBbGwoKTsKLQotCQljcmVhdGVOYW1lTGlzdGVuZXIoKTsKLQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyBhIG5ldyBuYW1lIGZvciB0aGUgcHJvamVjdCB0aGF0IGRvZXMgbm90IGhhdmUgYW55IGNvbGxpc2lvbnMuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29weU5hbWVGb3IoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0KLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBnZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCk7Ci0JCWlmICghd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKS5leGlzdHMoKSkKLQkJCXJldHVybiBwcm9qZWN0TmFtZTsKLQotCQlpbnQgY291bnRlciA9IDE7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlTdHJpbmcgbmFtZVNlZ21lbnQ7Ci0JCQlpZiAoY291bnRlciA+IDEpIHsKLQkJCQluYW1lU2VnbWVudCA9IE5MUy5iaW5kKAotCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuQ29weVByb2plY3RBY3Rpb25fY29weU5hbWVUd29BcmdzLAotCQkJCQkJbmV3IEludGVnZXIoY291bnRlciksIHByb2plY3ROYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZVNlZ21lbnQgPSBOTFMuYmluZCgKLQkJCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkNvcHlQcm9qZWN0QWN0aW9uX2NvcHlOYW1lT25lQXJnLAotCQkJCQkJcHJvamVjdE5hbWUpOwotCQkJfQotCi0JCQlpZiAoIXdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChuYW1lU2VnbWVudCkuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIG5hbWVTZWdtZW50OwotCi0JCQljb3VudGVyKys7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCBiZWluZyBtYW5pcHVsYXRlZC4KLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBsb2NhdGlvbiB0byB0aGUgZGVmYXVsdCBsb2NhdGlvbiBpZiB3ZSBhcmUgc2V0IHRvIHVzZURlZmF1bHRzLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRMb2NhdGlvbkZvclNlbGVjdGlvbigpIHsKLQkJbG9jYXRpb25BcmVhLnVwZGF0ZVByb2plY3ROYW1lKHByb2plY3ROYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gZXJyb3IgcmVwb3J0ZXIgZm9yIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIElFcnJvck1lc3NhZ2VSZXBvcnRlcgotCSAqLwotCXByaXZhdGUgSUVycm9yTWVzc2FnZVJlcG9ydGVyIGdldEVycm9yUmVwb3J0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSUVycm9yTWVzc2FnZVJlcG9ydGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5Qcm9qZWN0Q29udGVudHNMb2NhdGlvbkFyZWEuSUVycm9yTWVzc2FnZVJlcG9ydGVyI3JlcG9ydEVycm9yKGphdmEubGFuZy5TdHJpbmcpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJCQlzZXRNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0KLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvUmVzb3VyY2VMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvUmVzb3VyY2VMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTU0ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1Jlc291cmNlTGlzdFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKiAJU2ViYXN0aWFuIERhdmlkcyA8c2Rhdmlkc0BnbXguZGU+IC0gRml4IGZvciBidWcgMTkzNDYgLSBEaWFsb2cgZm9udAotICogCQlzaG91bGQgYmUgYWN0aXZhdGVkIGFuZCB1c2VkIGJ5IG90aGVyIGNvbXBvbmVudHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLlN0cmluZ01hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBTaG93cyBhIGxpc3Qgb2YgcmVzb3VyY2VzIHRvIHRoZSB1c2VyIHdpdGggYSB0ZXh0IGVudHJ5IGZpZWxkCi0gKiBmb3IgYSBzdHJpbmcgcGF0dGVybiB1c2VkIHRvIGZpbHRlciB0aGUgbGlzdCBvZiByZXNvdXJjZXMuCi0gKiA8cD4KLSAqIAotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VMaXN0U2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uRGlhbG9nIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04gPSAiUmVzb3VyY2VMaXN0U2VsZWN0aW9uRGlhbG9nU2V0dGluZ3MiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgVGV4dCBwYXR0ZXJuOwotCi0gICAgVGFibGUgcmVzb3VyY2VOYW1lczsKLQotICAgIFRhYmxlIGZvbGRlck5hbWVzOwotCi0gICAgU3RyaW5nIHBhdHRlcm5TdHJpbmc7Ci0KLSAgICBJQ29udGFpbmVyIGNvbnRhaW5lcjsKLQotICAgIGludCB0eXBlTWFzazsKLQotICAgIHN0YXRpYyBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0KLSAgICBib29sZWFuIGdhdGhlclJlc291cmNlc0R5bmFtaWNhbGx5ID0gdHJ1ZTsKLQotICAgIFN0cmluZ01hdGNoZXIgc3RyaW5nTWF0Y2hlcjsKLQotICAgIFVwZGF0ZUZpbHRlclRocmVhZCB1cGRhdGVGaWx0ZXJUaHJlYWQ7Ci0KLSAgICBVcGRhdGVHYXRoZXJUaHJlYWQgdXBkYXRlR2F0aGVyVGhyZWFkOwotCi0gICAgUmVzb3VyY2VEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnM7Ci0KLSAgICBpbnQgZGVzY3JpcHRvcnNTaXplOwotCi0gICAgV29ya2JlbmNoTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLSAgICAKLSAgICBib29sZWFuIG9rRW5hYmxlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3dEZXJpdmVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBzaG93RGVyaXZlZEJ1dHRvbjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBhbGxvd1VzZXJUb1RvZ2dsZURlcml2ZWQ7Ci0gICAgCi0gICAgc3RhdGljIGNsYXNzIFJlc291cmNlRGVzY3JpcHRvciBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotICAgICAgICBTdHJpbmcgbGFiZWw7Ci0KLSAgICAgICAgQXJyYXlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBib29sZWFuIHJlc291cmNlc1NvcnRlZCA9IHRydWU7Ci0KLSAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIHJldHVybiBjb2xsYXRvci5jb21wYXJlKGxhYmVsLCAoKFJlc291cmNlRGVzY3JpcHRvcikgbykubGFiZWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgVXBkYXRlRmlsdGVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLSAgICAgICAgYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0KLSAgICAgICAgaW50IGZpcnN0TWF0Y2ggPSAwOwotCi0gICAgICAgIGludCBsYXN0TWF0Y2ggPSBkZXNjcmlwdG9yc1NpemUgLSAxOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IHJlc291cmNlTmFtZXMuZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgZmluYWwgaW50IGl0ZW1JbmRleFtdID0geyAwIH07Ci0gICAgICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50W10gPSB7IDAgfTsKLSAgICAgICAgICAgIC8vS2VlcCB0cmFjayBvZiBpZiB0aGUgd2lkZ2V0IGdvdCBkaXNwb3NlZCAKLSAgICAgICAgICAgIC8vc28gdGhhdCB3ZSBjYW4gYWJvcnQgaWYgcmVxdWlyZWQKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW5bXSBkaXNwb3NlZCA9IHsgZmFsc2UgfTsKLSAgICAgICAgICAgIGRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9CZSBzdXJlIHRoZSB3aWRnZXQgc3RpbGwgZXhpc3RzCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZU5hbWVzLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZWRbMF0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1Db3VudFswXSA9IHJlc291cmNlTmFtZXMuZ2V0SXRlbUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGlmIChkaXNwb3NlZFswXSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGludCBsYXN0OwotICAgICAgICAgICAgaWYgKChwYXR0ZXJuU3RyaW5nLmluZGV4T2YoJz8nKSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBhdHRlcm5TdHJpbmcuZW5kc1dpdGgoIioiKSkgJiYgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAocGF0dGVyblN0cmluZy5pbmRleE9mKCcqJykgPT0gcGF0dGVyblN0cmluZy5sZW5ndGgoKSAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXNlIGEgYmluYXJ5IHNlYXJjaCB0byBnZXQgZmlyc3QgYW5kIGxhc3QgbWF0Y2ggd2hlbiB0aGUgcGF0dGVybgotICAgICAgICAgICAgICAgIC8vIHN0cmluZyBlbmRzIHdpdGggIioiIGFuZCBoYXMgbm8gb3RoZXIgZW1iZWRkZWQgc3BlY2lhbCBjaGFyYWN0ZXJzLiAgCi0gICAgICAgICAgICAgICAgLy8gRm9yIHRoaXMgY2FzZSwgd2UgY2FuIGJlIHNtYXJ0ZXIgYWJvdXQgZ2V0dGluZyB0aGUgZmlyc3QgYW5kIGxhc3QgCi0gICAgICAgICAgICAgICAgLy8gbWF0Y2ggc2luY2UgdGhlIGl0ZW1zIGFyZSBpbiBzb3J0ZWQgb3JkZXIuCi0gICAgICAgICAgICAgICAgZmlyc3RNYXRjaCA9IGdldEZpcnN0TWF0Y2goKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RNYXRjaCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdE1hdGNoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbGFzdE1hdGNoID0gLTE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdE1hdGNoID0gZ2V0TGFzdE1hdGNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxhc3QgPSBsYXN0TWF0Y2g7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0TWF0Y2g7IGkgPD0gbGFzdE1hdGNoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSA1MCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3AgfHwgcmVzb3VyY2VOYW1lcy5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2VkWzBdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCB8fCByZXNvdXJjZU5hbWVzLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaW5kZXgsIGl0ZW1JbmRleFswXSwgaXRlbUNvdW50WzBdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSW5kZXhbMF0rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsYXN0ID0gbGFzdE1hdGNoOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2V0Rmlyc3RNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0TWF0Y2g7IGkgPD0gbGFzdE1hdGNoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSA1MCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3AgfHwgcmVzb3VyY2VOYW1lcy5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2VkWzBdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2goZGVzY3JpcHRvcnNbaW5kZXhdLmxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldEZpcnN0TWF0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJzdE1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RNYXRjaCA9IGluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCB8fCByZXNvdXJjZU5hbWVzLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShpbmRleCwgaXRlbUluZGV4WzBdLCBpdGVtQ291bnRbMF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSW5kZXhbMF0rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRpc3Bvc2VkWzBdKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgbGFzdE1hdGNoID0gbGFzdDsKLSAgICAgICAgICAgIGRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlTmFtZXMuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBpdGVtQ291bnRbMF0gPSByZXNvdXJjZU5hbWVzLmdldEl0ZW1Db3VudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUluZGV4WzBdIDwgaXRlbUNvdW50WzBdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWVzLnNldFJlZHJhdyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWVzLnJlbW92ZShpdGVtSW5kZXhbMF0sIGl0ZW1Db3VudFswXSAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lcy5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm8gcmVzb3VyY2VzLCByZW1vdmUgcmVtYWluaW5nIGZvbGRlciBlbnRyaWVzCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZU5hbWVzLmdldEl0ZW1Db3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlck5hbWVzLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlT0tTdGF0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIFVwZGF0ZUdhdGhlclRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0gICAgICAgIGJvb2xlYW4gc3RvcCA9IGZhbHNlOwotCi0gICAgICAgIGludCBsYXN0TWF0Y2ggPSAtMTsKLQotICAgICAgICBpbnQgZmlyc3RNYXRjaCA9IDA7Ci0KLSAgICAgICAgYm9vbGVhbiByZWZpbHRlciA9IGZhbHNlOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IHJlc291cmNlTmFtZXMuZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgZmluYWwgaW50IGl0ZW1JbmRleFtdID0geyAwIH07Ci0gICAgICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50W10gPSB7IDAgfTsKLSAgICAgICAgICAgIC8vS2VlcCB0cmFjayBvZiBpZiB0aGUgd2lkZ2V0IGdvdCBkaXNwb3NlZCAKLSAgICAgICAgICAgIC8vc28gdGhhdCB3ZSBjYW4gYWJvcnQgaWYgcmVxdWlyZWQKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW5bXSBkaXNwb3NlZCA9IHsgZmFsc2UgfTsKLSAgICAgICAgICAgIGRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9CZSBzdXJlIHRoZSB3aWRnZXQgc3RpbGwgZXhpc3RzCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZU5hbWVzLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZWRbMF0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1Db3VudFswXSA9IHJlc291cmNlTmFtZXMuZ2V0SXRlbUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGlmIChkaXNwb3NlZFswXSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFyZWZpbHRlcikgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RNYXRjaDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpICUgNTAgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdG9wIHx8IHJlc291cmNlTmFtZXMuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwb3NlZFswXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3AgfHwgcmVzb3VyY2VOYW1lcy5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGluZGV4LCBpdGVtSW5kZXhbMF0sIGl0ZW1Db3VudFswXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUluZGV4WzBdKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UncmUgZmlsdGVyaW5nIHRoZSBwcmV2aW91cyBsaXN0Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0TWF0Y2g7IGkgPD0gbGFzdE1hdGNoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSA1MCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3AgfHwgcmVzb3VyY2VOYW1lcy5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2VkWzBdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2goZGVzY3JpcHRvcnNbaW5kZXhdLmxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCB8fCByZXNvdXJjZU5hbWVzLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShpbmRleCwgaXRlbUluZGV4WzBdLCBpdGVtQ291bnRbMF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSW5kZXhbMF0rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRpc3Bvc2VkWzBdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZU5hbWVzLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1Db3VudFswXSA9IHJlc291cmNlTmFtZXMuZ2V0SXRlbUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtSW5kZXhbMF0gPCBpdGVtQ291bnRbMF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZXMuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZXMucmVtb3ZlKGl0ZW1JbmRleFswXSwgaXRlbUNvdW50WzBdIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWVzLnNldFJlZHJhdyh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJZiBubyByZXNvdXJjZXMsIHJlbW92ZSByZW1haW5pbmcgZm9sZGVyIGVudHJpZXMKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlTmFtZXMuZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyTmFtZXMucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVPS1N0YXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHNoZWxsIHRvIHBhcmVudCB0aGUgZGlhbG9nIG9uCi0gICAgICogQHBhcmFtIHJlc291cmNlcyByZXNvdXJjZXMgdG8gZGlzcGxheSBpbiB0aGUgZGlhbG9nCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlTGlzdFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVJlc291cmNlW10gcmVzb3VyY2VzKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICAgICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLSAgICAgICAgZ2F0aGVyUmVzb3VyY2VzRHluYW1pY2FsbHkgPSBmYWxzZTsKLSAgICAgICAgaW5pdERlc2NyaXB0b3JzKHJlc291cmNlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MuICBXaGVuIHRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0bwotICAgICAqIGNyZWF0ZSB0aGUgZGlhbG9nLCByZXNvdXJjZXMgd2lsbCBiZSBnYXRoZXJlZCBkeW5hbWljYWxseSBhcyB0aGUgcGF0dGVybgotICAgICAqIHN0cmluZyBpcyBzcGVjaWZpZWQuICBPbmx5IHJlc291cmNlcyBvZiB0aGUgZ2l2ZW4gdHlwZXMgdGhhdCBtYXRjaCB0aGUgCi0gICAgICogcGF0dGVybiBzdHJpbmcgd2lsbCBiZSBsaXN0ZWQuICBUbyBmdXJ0aGVyIGZpbHRlciB0aGUgbWF0Y2hpbmcgcmVzb3VyY2VzLAotICAgICAqIEBzZWUgI3NlbGVjdChJUmVzb3VyY2UpCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHNoZWxsIHRvIHBhcmVudCB0aGUgZGlhbG9nIG9uCi0gICAgICogQHBhcmFtIGNvbnRhaW5lciBjb250YWluZXIgdG8gZ2V0IHJlc291cmNlcyBmcm9tCi0gICAgICogQHBhcmFtIHR5cGVNYXNrIG1hc2sgY29udGFpbmluZyBJUmVzb3VyY2UgdHlwZXMgdG8gYmUgY29uc2lkZXJlZAotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUxpc3RTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElDb250YWluZXIgY29udGFpbmVyLAotICAgICAgICAgICAgaW50IHR5cGVNYXNrKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0gICAgICAgIHRoaXMudHlwZU1hc2sgPSB0eXBlTWFzazsKLSAgICAgICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGp1c3QgdGhlIHBhdHRlcm4gc3RyaW5nIGZvciBtYXRjaGluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGFkanVzdFBhdHRlcm4oKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gcGF0dGVybi5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICBpZiAodGV4dC5lbmRzV2l0aCgiPCIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIC8vIHRoZSA8IGNoYXJhY3RlciBpbmRpY2F0ZXMgYW4gZXhhY3QgbWF0Y2ggc2VhcmNoCi0gICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGgoKSAtIDEpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdGV4dC5lcXVhbHMoIiIpICYmICF0ZXh0LmVuZHNXaXRoKCIqIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIAlyZXR1cm4gdGV4dCArICIqIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY2FuY2VsUHJlc3NlZCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLSAgICAgICAgc2V0UmVzdWx0KG51bGwpOwotICAgICAgICBzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2Nsb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBzdXBlci5jbG9zZSgpOwotICAgICAgICBsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY3JlYXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZSgpOwotICAgICAgICBwYXR0ZXJuLnNldEZvY3VzKCk7Ci0gICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKG9rRW5hYmxlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgY29udGVudHMgb2YgdGhpcyBkaWFsb2csIGluaXRpYWxpemVzIHRoZQotICAgICAqIGxpc3RlbmVyIGFuZCB0aGUgdXBkYXRlIHRocmVhZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCB0byBjcmVhdGUgdGhlIGRpYWxvZyB3aWRnZXRzIGluCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICAgIExhYmVsIGwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2dfbGFiZWwpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgICBwYXR0ZXJuID0gbmV3IFRleHQoZGlhbG9nQXJlYSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBwYXR0ZXJuLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlU2VsZWN0aW9uRGlhbG9nX21hdGNoaW5nKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHJlc291cmNlTmFtZXMgPSBuZXcgVGFibGUoZGlhbG9nQXJlYSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIKLSAgICAgICAgICAgICAgICB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZGF0YS5oZWlnaHRIaW50ID0gMTIgKiByZXNvdXJjZU5hbWVzLmdldEl0ZW1IZWlnaHQoKTsKLSAgICAgICAgcmVzb3VyY2VOYW1lcy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIGwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2dfZm9sZGVycyk7Ci0gICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIGZvbGRlck5hbWVzID0gbmV3IFRhYmxlKGRpYWxvZ0FyZWEsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSCi0gICAgICAgICAgICAgICAgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gMzAwOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSA0ICogZm9sZGVyTmFtZXMuZ2V0SXRlbUhlaWdodCgpOwotICAgICAgICBmb2xkZXJOYW1lcy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIGlmIChnYXRoZXJSZXNvdXJjZXNEeW5hbWljYWxseSkgewotICAgICAgICAgICAgdXBkYXRlR2F0aGVyVGhyZWFkID0gbmV3IFVwZGF0ZUdhdGhlclRocmVhZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXBkYXRlRmlsdGVyVGhyZWFkID0gbmV3IFVwZGF0ZUZpbHRlclRocmVhZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGF0dGVybi5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKQotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWVzLnNldEZvY3VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBhdHRlcm4uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgcmVmcmVzaChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJlc291cmNlTmFtZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRm9sZGVycygoUmVzb3VyY2VEZXNjcmlwdG9yKSBlLml0ZW0uZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBva1ByZXNzZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZm9sZGVyTmFtZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG9rUHJlc3NlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpZiAoZ2V0QWxsb3dVc2VyVG9Ub2dnbGVEZXJpdmVkKCkpIHsKLSAgICAgICAgICAgIHNob3dEZXJpdmVkQnV0dG9uID0gbmV3IEJ1dHRvbihkaWFsb2dBcmVhLCBTV1QuQ0hFQ0spOwotICAgICAgICAgICAgc2hvd0Rlcml2ZWRCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZ19zaG93RGVyaXZlZCk7Ci0gICAgICAgICAgICBzaG93RGVyaXZlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFNob3dEZXJpdmVkKHNob3dEZXJpdmVkQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVmcmVzaCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHNob3dEZXJpdmVkQnV0dG9uLnNldFNlbGVjdGlvbihnZXRTaG93RGVyaXZlZCgpKTsKLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIGFwcGx5RGlhbG9nRm9udChkaWFsb2dBcmVhKTsKLSAgICAgICAgcmV0dXJuIGRpYWxvZ0FyZWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGluY2x1ZGUgYSAiU2hvdyBkZXJpdmVkIHJlc291cmNlcyIgY2hlY2tib3ggaW4gdGhlIGRpYWxvZy4KLSAgICAgKiBUaGUgZGVmYXVsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBpbmNsdWRlIHRoZSBjaGVja2JveCwgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG9taXQKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dVc2VyVG9Ub2dnbGVEZXJpdmVkKCkgewotICAgICAgICByZXR1cm4gYWxsb3dVc2VyVG9Ub2dnbGVEZXJpdmVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBpbmNsdWRlIGEgIlNob3cgZGVyaXZlZCByZXNvdXJjZXMiIGNoZWNrYm94IGluIHRoZSBkaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFsbG93IDxjb2RlPnRydWU8L2NvZGU+IHRvIGluY2x1ZGUgdGhlIGNoZWNrYm94LCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gb21pdAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd1VzZXJUb1RvZ2dsZURlcml2ZWQoYm9vbGVhbiBhbGxvdykgewotICAgICAgICBhbGxvd1VzZXJUb1RvZ2dsZURlcml2ZWQgPSBhbGxvdzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpbHRlclJlc291cmNlcyhib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIFN0cmluZyBvbGRQYXR0ZXJuID0gZm9yY2UgPyBudWxsIDogcGF0dGVyblN0cmluZzsKLSAgICAgICAgcGF0dGVyblN0cmluZyA9IGFkanVzdFBhdHRlcm4oKTsKLSAgICAgICAgaWYgKCFmb3JjZSAmJiBwYXR0ZXJuU3RyaW5nLmVxdWFscyhvbGRQYXR0ZXJuKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICB1cGRhdGVGaWx0ZXJUaHJlYWQuc3RvcCA9IHRydWU7Ci0gICAgICAgIHN0cmluZ01hdGNoZXIgPSBuZXcgU3RyaW5nTWF0Y2hlcihwYXR0ZXJuU3RyaW5nLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIFVwZGF0ZUZpbHRlclRocmVhZCBvbGRUaHJlYWQgPSB1cGRhdGVGaWx0ZXJUaHJlYWQ7Ci0gICAgICAgIHVwZGF0ZUZpbHRlclRocmVhZCA9IG5ldyBVcGRhdGVGaWx0ZXJUaHJlYWQoKTsKLSAgICAgICAgaWYgKHBhdHRlcm5TdHJpbmcuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB1cGRhdGVGaWx0ZXJUaHJlYWQuZmlyc3RNYXRjaCA9IDA7Ci0gICAgICAgICAgICB1cGRhdGVGaWx0ZXJUaHJlYWQubGFzdE1hdGNoID0gLTE7Ci0gICAgICAgICAgICB1cGRhdGVGaWx0ZXJUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvbGRQYXR0ZXJuICE9IG51bGwgJiYgKG9sZFBhdHRlcm4ubGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgICAgICAgICAmJiBvbGRQYXR0ZXJuLmVuZHNXaXRoKCIqIikgJiYgcGF0dGVyblN0cmluZy5lbmRzV2l0aCgiKiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgaW50IG1hdGNoTGVuZ3RoID0gb2xkUGF0dGVybi5sZW5ndGgoKSAtIDE7Ci0gICAgICAgICAgICBpZiAocGF0dGVyblN0cmluZy5yZWdpb25NYXRjaGVzKDAsIG9sZFBhdHRlcm4sIDAsIG1hdGNoTGVuZ3RoKSkgewotICAgICAgICAgICAgICAgIC8vIGZpbHRlciB0aGUgcHJldmlvdXMgbGlzdCBvZiBpdGVtcywgdGhpcyBpcyBkb25lIHdoZW4gdGhlIAotICAgICAgICAgICAgICAgIC8vIG5ldyBwYXR0ZXJuIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb2xkIHBhdHRlcm4KLSAgICAgICAgICAgICAgICB1cGRhdGVGaWx0ZXJUaHJlYWQuZmlyc3RNYXRjaCA9IG9sZFRocmVhZC5maXJzdE1hdGNoOwotICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlclRocmVhZC5sYXN0TWF0Y2ggPSBvbGRUaHJlYWQubGFzdE1hdGNoOwotICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlclRocmVhZC5zdGFydCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbHRlciB0aGUgZW50aXJlIGxpc3QKLSAgICAgICAgdXBkYXRlRmlsdGVyVGhyZWFkLmZpcnN0TWF0Y2ggPSAwOwotICAgICAgICB1cGRhdGVGaWx0ZXJUaHJlYWQubGFzdE1hdGNoID0gZGVzY3JpcHRvcnNTaXplIC0gMTsKLSAgICAgICAgdXBkYXRlRmlsdGVyVGhyZWFkLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIGEgYmluYXJ5IHNlYXJjaCB0byBnZXQgdGhlIGZpcnN0IG1hdGNoIGZvciB0aGUgcGF0dGVyblN0cmluZy4KLSAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBwYXR0ZXJuU3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYW55ICc/JyAKLSAgICAgKiBjaGFyYWN0ZXJzIGFuZCB0aGF0IGl0IGNvbnRhaW5zIG9ubHkgb25lICcqJyBjaGFyYWN0ZXIgYXQgdGhlIGVuZAotICAgICAqIG9mIHRoZSBzdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Rmlyc3RNYXRjaCgpIHsKLSAgICAgICAgaW50IGhpZ2ggPSBkZXNjcmlwdG9yc1NpemU7Ci0gICAgICAgIGludCBsb3cgPSAtMTsKLSAgICAgICAgYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotICAgICAgICBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IG5ldyBSZXNvdXJjZURlc2NyaXB0b3IoKTsKLSAgICAgICAgZGVzYy5sYWJlbCA9IHBhdHRlcm5TdHJpbmcuc3Vic3RyaW5nKDAsIHBhdHRlcm5TdHJpbmcubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgd2hpbGUgKGhpZ2ggLSBsb3cgPiAxKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAoaGlnaCArIGxvdykgLyAyOwotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gZGVzY3JpcHRvcnNbaW5kZXhdLmxhYmVsOwotICAgICAgICAgICAgaWYgKG1hdGNoKGxhYmVsKSkgewotICAgICAgICAgICAgICAgIGhpZ2ggPSBpbmRleDsKLSAgICAgICAgICAgICAgICBtYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBjb21wYXJlID0gZGVzY3JpcHRvcnNbaW5kZXhdLmNvbXBhcmVUbyhkZXNjKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBsb3cgPSBpbmRleDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBoaWdoID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXRjaCkKLSAgICAgICAgICAgIHJldHVybiBoaWdoOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdhdGhlclJlc291cmNlcyhib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIFN0cmluZyBvbGRQYXR0ZXJuID0gZm9yY2UgPyBudWxsIDogcGF0dGVyblN0cmluZzsKLSAgICAgICAgcGF0dGVyblN0cmluZyA9IGFkanVzdFBhdHRlcm4oKTsKLSAgICAgICAgaWYgKCFmb3JjZSAmJiBwYXR0ZXJuU3RyaW5nLmVxdWFscyhvbGRQYXR0ZXJuKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICB1cGRhdGVHYXRoZXJUaHJlYWQuc3RvcCA9IHRydWU7Ci0gICAgICAgIHVwZGF0ZUdhdGhlclRocmVhZCA9IG5ldyBVcGRhdGVHYXRoZXJUaHJlYWQoKTsKLQotICAgICAgICBpZiAocGF0dGVyblN0cmluZy5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHVwZGF0ZUdhdGhlclRocmVhZC5zdGFydCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN0cmluZ01hdGNoZXIgPSBuZXcgU3RyaW5nTWF0Y2hlcihwYXR0ZXJuU3RyaW5nLCB0cnVlLCBmYWxzZSk7Ci0KLSAgICAgICAgaWYgKG9sZFBhdHRlcm4gIT0gbnVsbCAmJiAob2xkUGF0dGVybi5sZW5ndGgoKSAhPSAwKQotICAgICAgICAgICAgICAgICYmIG9sZFBhdHRlcm4uZW5kc1dpdGgoIioiKSAmJiBwYXR0ZXJuU3RyaW5nLmVuZHNXaXRoKCIqIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAvLyBzZWUgaWYgdGhlIG5ldyBwYXR0ZXJuIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb2xkIHBhdHRlcm4KLSAgICAgICAgICAgIGludCBtYXRjaExlbmd0aCA9IG9sZFBhdHRlcm4ubGVuZ3RoKCkgLSAxOwotICAgICAgICAgICAgaWYgKHBhdHRlcm5TdHJpbmcucmVnaW9uTWF0Y2hlcygwLCBvbGRQYXR0ZXJuLCAwLCBtYXRjaExlbmd0aCkpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVHYXRoZXJUaHJlYWQucmVmaWx0ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgIHVwZGF0ZUdhdGhlclRocmVhZC5maXJzdE1hdGNoID0gMDsKLSAgICAgICAgICAgICAgICB1cGRhdGVHYXRoZXJUaHJlYWQubGFzdE1hdGNoID0gZGVzY3JpcHRvcnNTaXplIC0gMTsKLSAgICAgICAgICAgICAgICB1cGRhdGVHYXRoZXJUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBcnJheUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGdldE1hdGNoaW5nUmVzb3VyY2VzKHJlc291cmNlcyk7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlc0FycmF5W10gPSBuZXcgSVJlc291cmNlW3Jlc291cmNlcy5zaXplKCldOwotICAgICAgICAgICAgICAgIHJlc291cmNlcy50b0FycmF5KHJlc291cmNlc0FycmF5KTsKLSAgICAgICAgICAgICAgICBpbml0RGVzY3JpcHRvcnMocmVzb3VyY2VzQXJyYXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB1cGRhdGVHYXRoZXJUaHJlYWQuZmlyc3RNYXRjaCA9IDA7Ci0gICAgICAgIHVwZGF0ZUdhdGhlclRocmVhZC5sYXN0TWF0Y2ggPSBkZXNjcmlwdG9yc1NpemUgLSAxOwotICAgICAgICB1cGRhdGVHYXRoZXJUaHJlYWQuc3RhcnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gaW1hZ2UgZm9yIGEgcmVzb3VyY2UgZGVzY3JpcHRvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGVzYyByZXNvdXJjZSBkZXNjcmlwdG9yIHRvIHJldHVybiBpbWFnZSBmb3IKLSAgICAgKiBAcmV0dXJuIGFuIGltYWdlIGZvciBhIHJlc291cmNlIGRlc2NyaXB0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJbWFnZSBnZXRJbWFnZShSZXNvdXJjZURlc2NyaXB0b3IgZGVzYykgewotICAgICAgICBJUmVzb3VyY2UgciA9IChJUmVzb3VyY2UpIGRlc2MucmVzb3VyY2VzLmdldCgwKTsKLSAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uocik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIGEgYmluYXJ5IHNlYXJjaCB0byBnZXQgdGhlIGxhc3QgbWF0Y2ggZm9yIHRoZSBwYXR0ZXJuU3RyaW5nLgotICAgICAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlIHBhdHRlcm5TdHJpbmcgZG9lcyBub3QgY29udGFpbiBhbnkgJz8nIAotICAgICAqIGNoYXJhY3RlcnMgYW5kIHRoYXQgaXQgY29udGFpbnMgb25seSBvbmUgJyonIGNoYXJhY3RlciBhdCB0aGUgZW5kCi0gICAgICogb2YgdGhlIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRMYXN0TWF0Y2goKSB7Ci0gICAgICAgIGludCBoaWdoID0gZGVzY3JpcHRvcnNTaXplOwotICAgICAgICBpbnQgbG93ID0gLTE7Ci0gICAgICAgIGJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBuZXcgUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgIGRlc2MubGFiZWwgPSBwYXR0ZXJuU3RyaW5nLnN1YnN0cmluZygwLCBwYXR0ZXJuU3RyaW5nLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgIHdoaWxlIChoaWdoIC0gbG93ID4gMSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gKGhpZ2ggKyBsb3cpIC8gMjsKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGRlc2NyaXB0b3JzW2luZGV4XS5sYWJlbDsKLSAgICAgICAgICAgIGlmIChtYXRjaChsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICBsb3cgPSBpbmRleDsKLSAgICAgICAgICAgICAgICBtYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBjb21wYXJlID0gZGVzY3JpcHRvcnNbaW5kZXhdLmNvbXBhcmVUbyhkZXNjKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBsb3cgPSBpbmRleDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBoaWdoID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXRjaCkKLSAgICAgICAgICAgIHJldHVybiBsb3c7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHYXRoZXIgdGhlIHJlc291cmNlcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCBtYXRjaCB0aGUgY3VycmVudAotICAgICAqIHBhdHRlcm4gc3RyaW5nLiAgR2F0aGVyIHRoZSByZXNvdXJjZXMgdXNpbmcgdGhlIHByb3h5IHZpc2l0b3Igc2luY2UKLSAgICAgKiB0aGlzIGlzIHF1aWNrZXIgdGhhbiBnZXR0aW5nIHRoZSBlbnRpcmUgcmVzb3VyY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlcyByZXNvdXJjZXMgdGhhdCBtYXRjaAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnZXRNYXRjaGluZ1Jlc291cmNlcyhmaW5hbCBBcnJheUxpc3QgcmVzb3VyY2VzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250YWluZXIuYWNjZXB0KG5ldyBJUmVzb3VyY2VQcm94eVZpc2l0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBleGNsdWRlIGRlcml2ZWQgcmVzb3VyY2VzIChidWdzIDM4MDg1IGFuZCA4MTMzMykKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRTaG93RGVyaXZlZCgpICYmIHByb3h5LmlzRGVyaXZlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUgPSBwcm94eS5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodHlwZU1hc2sgJiB0eXBlKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gocHJveHkuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXMgPSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0KHJlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChyZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IElSZXNvdXJjZS5GSUxFKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCBJUmVzb3VyY2UuTk9ORSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEltYWdlIGdldFBhcmVudEltYWdlKElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICBJUmVzb3VyY2UgcGFyZW50ID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0gICAgICAgIHJldHVybiBsYWJlbFByb3ZpZGVyLmdldEltYWdlKHBhcmVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyZW50TGFiZWwoSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIElSZXNvdXJjZSBwYXJlbnQgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgU3RyaW5nIHRleHQ7Ci0gICAgICAgIGlmIChwYXJlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5ST09UKSB7Ci0gICAgICAgICAgICAvLyBHZXQgcmVhZGFibGUgbmFtZSBmb3Igd29ya3NwYWNlIHJvb3QgKCJXb3Jrc3BhY2UiKSwgd2l0aG91dCBkdXBsaWNhdGluZyBsYW5ndWFnZS1zcGVjaWZpYyBzdHJpbmcgaGVyZS4KLSAgICAgICAgICAgIHRleHQgPSBsYWJlbFByb3ZpZGVyLmdldFRleHQocGFyZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRleHQgPSBwYXJlbnQuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHRleHQgPT0gbnVsbCkKLSAgICAgICAgCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgZGVyaXZlZCByZXNvdXJjZXMgc2hvdWxkIGJlIHNob3duIGluIHRoZSBsaXN0LgotICAgICAqIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIHNob3cgZGVyaXZlZCByZXNvdXJjZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBoaWRlIHRoZW0KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U2hvd0Rlcml2ZWQoKSB7Ci0gICAgICAgcmV0dXJuIHNob3dEZXJpdmVkIDsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIGRlcml2ZWQgcmVzb3VyY2VzIHNob3VsZCBiZSBzaG93biBpbiB0aGUgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2hvdyA8Y29kZT50cnVlPC9jb2RlPiB0byBzaG93IGRlcml2ZWQgcmVzb3VyY2VzLCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gaGlkZSB0aGVtCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFNob3dEZXJpdmVkKGJvb2xlYW4gc2hvdykgewotICAgICAgICBzaG93RGVyaXZlZCAgPSBzaG93OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIGVhY2ggSVJlc291cmNlLAotICAgICAqIHNvcnRzIHRoZW0gYW5kIHJlbW92ZXMgdGhlIGR1cGxpY2F0ZWQgb25lcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIHJlc291cmNlcyB0byBjcmVhdGUgcmVzb3VyY2UgZGVzY3JpcHRvcnMgZm9yCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZXNjcmlwdG9ycyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2VzW10pIHsKLSAgICAgICAgQnVzeUluZGljYXRvci5zaG93V2hpbGUobnVsbCwgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzID0gbmV3IFJlc291cmNlRGVzY3JpcHRvcltyZXNvdXJjZXMubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgciA9IHJlc291cmNlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VEZXNjcmlwdG9yIGQgPSBuZXcgUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vVERCOiBTaG91bGQgdXNlIHRoZSBsYWJlbCBwcm92aWRlciBhbmQgY29tcGFyZSBwZXJmb3JtYW5jZS4KLSAgICAgICAgICAgICAgICAgICAgZC5sYWJlbCA9IHIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBkLnJlc291cmNlcy5hZGQocik7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzW2ldID0gZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQXJyYXlzLnNvcnQoZGVzY3JpcHRvcnMpOwotICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzU2l6ZSA9IGRlc2NyaXB0b3JzLmxlbmd0aDsKLQotICAgICAgICAgICAgICAgIC8vTWVyZ2UgdGhlIHJlc291cmNlIGRlc2NyaXB0b3Igd2l0aCB0aGUgc2FtZSBsYWJlbCBhbmQgdHlwZS4KLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yc1NpemUgPCAyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VEZXNjcmlwdG9yIGN1cnJlbnQgPSBkZXNjcmlwdG9yc1tpbmRleF07Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSA9IChJUmVzb3VyY2UpIGN1cnJlbnQucmVzb3VyY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KDApOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZGVzY3JpcHRvcnNTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChJUmVzb3VyY2UpIG5leHQucmVzb3VyY2VzLmdldCgwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRSZXNvdXJjZS5nZXRUeXBlKCkgPT0gY3VycmVudFJlc291cmNlLmdldFR5cGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG5leHQubGFiZWwuZXF1YWxzKGN1cnJlbnQubGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnJlc291cmNlcy5hZGQobmV4dFJlc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBtZXJnaW5nIHJlc291cmNlcyB3aXRoIHRoZSBzYW1lIG5hbWUsIGludG8gYSBzaW5nbGUgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgbXVzdCBtYXJrIHRoZSBkZXNjcmlwdG9yIHVuc29ydGVkIHNvIHRoYXQgd2Ugd2lsbCBzb3J0IHRoZSBmb2xkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWVzLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc2NDk2Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnJlc291cmNlc1NvcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQucmVzb3VyY2VzLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnJlc291cmNlc1NvcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnNbaW5kZXggKyAxXSA9IGRlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBkZXNjcmlwdG9yc1tpbmRleF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2UgPSAoSVJlc291cmNlKSBjdXJyZW50LnJlc291cmNlcy5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRvcnNTaXplID0gaW5kZXggKyAxOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxhYmVsIG1hdGNoZXMgdGhlIGNob3NlbiBwYXR0ZXJuLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsYWJlbCBsYWJlbCB0byBtYXRjaCB3aXRoIHRoZSBjdXJyZW50IHBhdHRlcm4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxhYmVsIG1hdGNoZXMgdGhlIGNob3NlbiBwYXR0ZXJuLiAKLSAgICAgKiAJZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtYXRjaChTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgaWYgKChwYXR0ZXJuU3RyaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgKHBhdHRlcm5TdHJpbmcuZXF1YWxzKCIiKSkgfHwgKHBhdHRlcm5TdHJpbmcuZXF1YWxzKCIqIikpKS8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHN0cmluZ01hdGNoZXIubWF0Y2gobGFiZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB1c2VyIGhhcyBzZWxlY3RlZCBhIHJlc291cmNlIGFuZCB0aGUgZGlhbG9nIGlzIGNsb3NpbmcuCi0gICAgICogU2V0IHRoZSBzZWxlY3RlZCByZXNvdXJjZSBhcyB0aGUgZGlhbG9nIHJlc3VsdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0gICAgICAgIFRhYmxlSXRlbSBpdGVtc1tdID0gZm9sZGVyTmFtZXMuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQoaXRlbXNbMF0uZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgIHNldFJlc3VsdChyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBmdXJ0aGVyIGZpbHRlciByZXNvdXJjZXMuICBBcyByZXNvdXJjZXMgYXJlIGdhdGhlcmVkLAotICAgICAqIGlmIGEgcmVzb3VyY2UgbWF0Y2hlcyB0aGUgY3VycmVudCBwYXR0ZXJuIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCi0gICAgICogSWYgdGhpcyBtZXRob2QgYW5zd2VycyBmYWxzZSwgdGhlIHJlc291cmNlIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0Ci0gICAgICogb2YgbWF0Y2hlcyBhbmQgdGhlIHJlc291cmNlJ3MgY2hpbGRyZW4gd2lsbCBOT1QgYmUgY29uc2lkZXJlZCBmb3IgbWF0Y2hpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2VsZWN0KElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZyZXNoZXMgdGhlIGZpbHRlcmVkIGxpc3Qgb2YgcmVzb3VyY2VzLgotICAgICAqIENhbGxlZCB3aGVuIHRoZSB0ZXh0IGluIHRoZSBwYXR0ZXJuIHRleHQgZW50cnkgaGFzIGNoYW5nZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZvcmNlIGlmIDxjb2RlPnRydWU8L2NvZGU+IGEgcmVmcmVzaCBpcyBmb3JjZWQsIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiBhIHJlZnJlc2ggb25seQotICAgICAqICAgb2NjdXJzIGlmIHRoZSBwYXR0ZXJuIGhhcyBjaGFuZ2VkCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBmb3JjZSkgewotICAgICAgICBpZiAoZ2F0aGVyUmVzb3VyY2VzRHluYW1pY2FsbHkpIHsKLSAgICAgICAgICAgIGdhdGhlclJlc291cmNlcyhmb3JjZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaWx0ZXJSZXNvdXJjZXMoZm9yY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBuZXcgcmVzb3VyY2UgaGFzIGJlZW4gc2VsZWN0ZWQuIENoYW5nZSB0aGUgY29udGVudHMKLSAgICAgKiBvZiB0aGUgZm9sZGVyIG5hbWVzIGxpc3QuCi0gICAgICogCi0gICAgICogQGRlc2MgcmVzb3VyY2UgZGVzY3JpcHRvciBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRm9sZGVycyhmaW5hbCBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYykgewotICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGlmICghZGVzYy5yZXNvdXJjZXNTb3J0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZm9sZGVyIG5hbWVzCi0gICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZGVzYy5yZXNvdXJjZXMsIG5ldyBDb21wYXJhdG9yKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMxID0gZ2V0UGFyZW50TGFiZWwoKElSZXNvdXJjZSkgbzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzMiA9IGdldFBhcmVudExhYmVsKChJUmVzb3VyY2UpIG8yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sbGF0b3IuY29tcGFyZShzMSwgczIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgZGVzYy5yZXNvdXJjZXNTb3J0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb2xkZXJOYW1lcy5yZW1vdmVBbGwoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2MucmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBuZXdJdGVtID0gbmV3IFRhYmxlSXRlbShmb2xkZXJOYW1lcywgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgciA9IChJUmVzb3VyY2UpIGRlc2MucmVzb3VyY2VzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3SXRlbS5zZXRUZXh0KGdldFBhcmVudExhYmVsKHIpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3SXRlbS5zZXRJbWFnZShnZXRQYXJlbnRJbWFnZShyKSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0uc2V0RGF0YShyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9sZGVyTmFtZXMuc2V0U2VsZWN0aW9uKDApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHNwZWNpZmllZCBpdGVtIHdpdGggdGhlIG5ldyBpbmZvIGZyb20gdGhlIHJlc291cmNlIAotICAgICAqIGRlc2NyaXB0b3IuCi0gICAgICogQ3JlYXRlIGEgbmV3IHRhYmxlIGl0ZW0gaWYgdGhlcmUgaXMgbm8gaXRlbS4gCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9yCi0gICAgICogQHBhcmFtIGl0ZW1Qb3MgcG9zaXRpb24gb2YgdGhlIGV4aXN0aW5nIGl0ZW0gdG8gdXBkYXRlCi0gICAgICogQHBhcmFtIGl0ZW1Db3VudCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHJlc291cmNlcyB0YWJsZSB3aWRnZXQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlSXRlbShpbnQgaW5kZXgsIGludCBpdGVtUG9zLCBpbnQgaXRlbUNvdW50KSB7Ci0gICAgICAgIFJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gZGVzY3JpcHRvcnNbaW5kZXhdOwotICAgICAgICBUYWJsZUl0ZW0gaXRlbTsKLSAgICAgICAgaWYgKGl0ZW1Qb3MgPCBpdGVtQ291bnQpIHsKLSAgICAgICAgICAgIGl0ZW0gPSByZXNvdXJjZU5hbWVzLmdldEl0ZW0oaXRlbVBvcyk7Ci0gICAgICAgICAgICBpZiAoaXRlbS5nZXREYXRhKCkgIT0gZGVzYykgewotICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dChkZXNjLmxhYmVsKTsKLSAgICAgICAgICAgICAgICBpdGVtLnNldERhdGEoZGVzYyk7Ci0gICAgICAgICAgICAgICAgaXRlbS5zZXRJbWFnZShnZXRJbWFnZShkZXNjKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1Qb3MgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWVzLnNldFNlbGVjdGlvbigwKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlRm9sZGVycyhkZXNjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpdGVtID0gbmV3IFRhYmxlSXRlbShyZXNvdXJjZU5hbWVzLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBpdGVtLnNldFRleHQoZGVzYy5sYWJlbCk7Ci0gICAgICAgICAgICBpdGVtLnNldERhdGEoZGVzYyk7Ci0gICAgICAgICAgICBpdGVtLnNldEltYWdlKGdldEltYWdlKGRlc2MpKTsKLSAgICAgICAgICAgIGlmIChpdGVtUG9zID09IDApIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWVzLnNldFNlbGVjdGlvbigwKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVGb2xkZXJzKGRlc2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZU9LU3RhdGUodHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgT0sgYnV0dG9uLiAgVG8gYmUgY2FsbGVkIHdoZW4KLSAgICAgKiB0aGUgcmVzb3VyY2UgbGlzdCBpcyB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IGVuYWJsZWQgc3RhdGUgb2YgdGhlIGJ1dHRvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU9LU3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotICAgIAlCdXR0b24gb2tCdXR0b24gPSBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0gICAgCWlmKG9rQnV0dG9uICE9IG51bGwgJiYgIW9rQnV0dG9uLmlzRGlzcG9zZWQoKSAmJiBzdGF0ZSAhPSBva0VuYWJsZWQpIHsKLSAgICAJCW9rQnV0dG9uLnNldEVuYWJsZWQoc3RhdGUpOwotICAgIAkJb2tFbmFibGVkID0gc3RhdGU7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkRpYWxvZyNnZXREaWFsb2dCb3VuZHNTZXR0aW5ncygpCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMgotICAgICAqLwotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKSB7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBzZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HU19TRUNUSU9OKTsKLSAgICAgICAgaWYgKHNlY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04pOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gc2VjdGlvbjsKLQl9Ci19Ci0gICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTY1OWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5taXNjLkNoZWNrYm94VHJlZUFuZExpc3RHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBBIHN0YW5kYXJkIHJlc291cmNlIHNlbGVjdGlvbiBkaWFsb2cgd2hpY2ggc29saWNpdHMgYSBsaXN0IG9mIHJlc291cmNlcyBmcm9tCi0gKiB0aGUgdXNlci4gVGhlIDxjb2RlPmdldFJlc3VsdDwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIHNlbGVjdGVkIHJlc291cmNlcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogRXhhbXBsZToKLSAqIDxwcmU+Ci0gKiAJUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0KLSAqCQluZXcgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgcm9vdFJlc291cmNlLCBtc2cpOwotICoJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb25zKHNlbGVjdGVkUmVzb3VyY2VzKSk7Ci0gKglkaWFsb2cub3BlbigpOwotICoJcmV0dXJuIGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAqIDwvcHJlPgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBTZWxlY3Rpb25EaWFsb2cgewotICAgIC8vIHRoZSByb290IGVsZW1lbnQgdG8gcG9wdWxhdGUgdGhlIHZpZXdlciB3aXRoCi0gICAgcHJpdmF0ZSBJQWRhcHRhYmxlIHJvb3Q7Ci0KLSAgICAvLyB0aGUgdmlzdWFsIHNlbGVjdGlvbiB3aWRnZXQgZ3JvdXAKLSAgICBwcml2YXRlIENoZWNrYm94VHJlZUFuZExpc3RHcm91cCBzZWxlY3Rpb25Hcm91cDsKLQotICAgIC8vIGNvbnN0YW50cwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSVpJTkdfU0VMRUNUSU9OX1dJREdFVF9XSURUSCA9IDQwMDsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSVpJTkdfU0VMRUNUSU9OX1dJREdFVF9IRUlHSFQgPSAzMDA7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcmVzb3VyY2Ugc2VsZWN0aW9uIGRpYWxvZyByb290ZWQgYXQgdGhlIGdpdmVuIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhlIHBhcmVudCBzaGVsbAotICAgICAqIEBwYXJhbSByb290RWxlbWVudCB0aGUgcm9vdCBlbGVtZW50IHRvIHBvcHVsYXRlIHRoaXMgZGlhbG9nIHdpdGgKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGRpYWxvZywgb3IKLSAgICAgKiAgICA8Y29kZT5udWxsPC9jb2RlPiB0byBkaXNwbGF5IGEgZGVmYXVsdCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJQWRhcHRhYmxlIHJvb3RFbGVtZW50LAotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgICBzZXRUaXRsZShJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZ190aXRsZSk7Ci0gICAgICAgIHJvb3QgPSByb290RWxlbWVudDsKLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNldE1lc3NhZ2UoSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2dfbWVzc2FnZSk7Ci0gICAgICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlzdWFsbHkgY2hlY2tzIHRoZSBwcmV2aW91c2x5LXNwZWNpZmllZCBlbGVtZW50cyBpbiB0aGUgY29udGFpbmVyIChsZWZ0KQotICAgICAqIHBvcnRpb24gb2YgdGhpcyBkaWFsb2cncyByZXNvdXJjZSBzZWxlY3Rpb24gdmlld2VyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja0luaXRpYWxTZWxlY3Rpb25zKCkgewotICAgICAgICBJdGVyYXRvciBpdGVtc1RvQ2hlY2sgPSBnZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVtc1RvQ2hlY2suaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgY3VycmVudEVsZW1lbnQgPSAoSVJlc291cmNlKSBpdGVtc1RvQ2hlY2submV4dCgpOwotCi0gICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotICAgICAgICAgICAgICAgIHNlbGVjdGlvbkdyb3VwLmluaXRpYWxDaGVja0xpc3RJdGVtKGN1cnJlbnRFbGVtZW50KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25Hcm91cC5pbml0aWFsQ2hlY2tUcmVlSXRlbShjdXJyZW50RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGdldE9rQnV0dG9uKCkuc2V0RW5hYmxlZChzZWxlY3Rpb25Hcm91cC5nZXRDaGVja2VkRWxlbWVudENvdW50KCkgPiAwKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIGluIFdpbmRvdy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2hlbGwsCi0JCQkJSUlERUhlbHBDb250ZXh0SWRzLlJFU09VUkNFX1NFTEVDVElPTl9ESUFMT0cpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlKCk7Ci0gICAgICAgIGluaXRpYWxpemVEaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gcGFnZSBncm91cAotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0gICAgICAgIC8vY3JlYXRlIHRoZSBpbnB1dCBlbGVtZW50LCB3aGljaCBoYXMgdGhlIHJvb3QgcmVzb3VyY2UKLSAgICAgICAgLy9hcyBpdHMgb25seSBjaGlsZAotICAgICAgICBBcnJheUxpc3QgaW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlucHV0LmFkZChyb290KTsKLQotICAgICAgICBjcmVhdGVNZXNzYWdlQXJlYShjb21wb3NpdGUpOwotICAgICAgICBzZWxlY3Rpb25Hcm91cCA9IG5ldyBDaGVja2JveFRyZWVBbmRMaXN0R3JvdXAoY29tcG9zaXRlLCBpbnB1dCwKLSAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZVByb3ZpZGVyKElSZXNvdXJjZS5GT0xERVIgfCBJUmVzb3VyY2UuUFJPSkVDVAotICAgICAgICAgICAgICAgICAgICAgICAgfCBJUmVzb3VyY2UuUk9PVCksIFdvcmtiZW5jaExhYmVsUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWNvcmF0aW5nV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLAotICAgICAgICAgICAgICAgIGdldFJlc291cmNlUHJvdmlkZXIoSVJlc291cmNlLkZJTEUpLCBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVjb3JhdGluZ1dvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgU1dULk5PTkUsCi0gICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBwYWdlIGhhcyBubyBvdGhlciBzaWduaWZpY2FudGx5LXNpemVkCi0gICAgICAgICAgICAgICAgLy8gd2lkZ2V0cyB3ZSBuZWVkIHRvIGhhcmRjb2RlIHRoZSBjb21iaW5lZCB3aWRnZXQncwotICAgICAgICAgICAgICAgIC8vIHNpemUsIG90aGVyd2lzZSBpdCB3aWxsIG9wZW4gdG9vIHNtYWxsCi0gICAgICAgICAgICAgICAgU0laSU5HX1NFTEVDVElPTl9XSURHRVRfV0lEVEgsIFNJWklOR19TRUxFQ1RJT05fV0lER0VUX0hFSUdIVCk7Ci0KLSAgICAgICAgY29tcG9zaXRlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgLy9BbHNvIHRyeSBhbmQgcmVzZXQgdGhlIHNpemUgb2YgdGhlIGNvbHVtbnMgYXMgYXBwcm9wcmlhdGUKLSAgICAgICAgICAgICAgICBUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSBzZWxlY3Rpb25Hcm91cC5nZXRMaXN0VGFibGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tpXS5wYWNrKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb250ZW50IHByb3ZpZGVyIGZvciA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+cyB0aGF0IHJldHVybnMgCi0gICAgICogb25seSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgdHlwZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElUcmVlQ29udGVudFByb3ZpZGVyIGdldFJlc291cmNlUHJvdmlkZXIoZmluYWwgaW50IHJlc291cmNlVHlwZSkgewotICAgICAgICByZXR1cm4gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VbXSBtZW1iZXJzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnMgPSAoKElDb250YWluZXIpIG8pLm1lbWJlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2p1c3QgcmV0dXJuIGFuIGVtcHR5IHNldCBvZiBjaGlsZHJlbgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvL2ZpbHRlciBvdXQgdGhlIGRlc2lyZWQgcmVzb3VyY2UgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9BbmQgdGhlIHRlc3QgYml0cyB3aXRoIHRoZSByZXNvdXJjZSB0eXBlcyB0byBzZWUgaWYgdGhleSBhcmUgd2hhdCB3ZSB3YW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1lbWJlcnNbaV0uZ2V0VHlwZSgpICYgcmVzb3VyY2VUeXBlKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChtZW1iZXJzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cy50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vaW5wdXQgZWxlbWVudCBjYXNlCi0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBcnJheUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQXJyYXlMaXN0KSBvKS50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGlzIGRpYWxvZydzIGNvbnRyb2xzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGlhbG9nKCkgewotICAgICAgICBzZWxlY3Rpb25Hcm91cC5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgZ2V0T2tCdXR0b24oKS5zZXRFbmFibGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uR3JvdXAuZ2V0Q2hlY2tlZEVsZW1lbnRDb3VudCgpID4gMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmIChnZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBnZXRPa0J1dHRvbigpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjaGVja0luaXRpYWxTZWxlY3Rpb25zKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlJlc291cmNlU2VsZWN0aW9uRGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPkRpYWxvZzwvY29kZT4gbWV0aG9kIGJ1aWxkcyBhIGxpc3Qgb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlcyBmb3IgbGF0ZXIgCi0gICAgICogcmV0cmlldmFsIGJ5IHRoZSBjbGllbnQgYW5kIGNsb3NlcyB0aGlzIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0gICAgICAgIEl0ZXJhdG9yIHJlc3VsdEVudW0gPSBzZWxlY3Rpb25Hcm91cC5nZXRBbGxDaGVja2VkTGlzdEl0ZW1zKCk7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAocmVzdWx0RW51bS5oYXNOZXh0KCkpCi0gICAgICAgICAgICBsaXN0LmFkZChyZXN1bHRFbnVtLm5leHQoKSk7Ci0gICAgICAgIHNldFJlc3VsdChsaXN0KTsKLSAgICAgICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1NhdmVBc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1NhdmVBc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmRhN2YxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9TYXZlQXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKiAgICBCb2IgRm9zdGVyIDxib2JAb2JqZmFjLmNvbT4KLSAqICAgICAtIEZpeCBmb3IgYnVnIDIzMDI1IC0gU2F2ZUFzRGlhbG9nIHNob3VsZCBub3QgYXNzdW1lIHdoYXQgaXMgYmVpbmcgc2F2ZWQgaXMgYW4gSUZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERUludGVybmFsV29ya2JlbmNoSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1pc2MuUmVzb3VyY2VBbmRDb250YWluZXJHcm91cDsKLQotLyoqCi0gKiBBIHN0YW5kYXJkICJTYXZlIEFzIiBkaWFsb2cgd2hpY2ggc29saWNpdHMgYSBwYXRoIGZyb20gdGhlIHVzZXIuIFRoZQotICogPGNvZGU+Z2V0UmVzdWx0PC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgcGF0aC4gTm90ZSB0aGF0IHRoZSBmb2xkZXIKLSAqIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCBtaWdodCBub3QgZXhpc3QgYW5kIG1pZ2h0IG5lZWQgdG8gYmUgY3JlYXRlZC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ29udGFpbmVyR2VuZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlQXNEaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfU0VUVElOR1NfU0VDVElPTiA9ICJTYXZlQXNEaWFsb2dTZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIElGaWxlIG9yaWdpbmFsRmlsZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBvcmlnaW5hbE5hbWUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBJUGF0aCByZXN1bHQ7Ci0KLSAgICAvLyB3aWRnZXRzCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUFuZENvbnRhaW5lckdyb3VwIHJlc291cmNlR3JvdXA7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBva0J1dHRvbjsKLQotICAgIC8qKgotICAgICAqIEltYWdlIGZvciB0aXRsZSBhcmVhCi0gICAgICovCi0gICAgcHJpdmF0ZSBJbWFnZSBkbGdUaXRsZUltYWdlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgU2F2ZSBBcyBkaWFsb2cgZm9yIG5vIHNwZWNpZmljIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhlIHBhcmVudCBzaGVsbAotICAgICAqLwotICAgIHB1YmxpYyBTYXZlQXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICAgICAgc2hlbGwuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5TYXZlQXNEaWFsb2dfdGV4dCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2hlbGwsCi0JCQkJSUlERUhlbHBDb250ZXh0SWRzLlNBVkVfQVNfRElBTE9HKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIGluIFdpbmRvdy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgQ29udHJvbCBjb250ZW50cyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0KLSAgICAgICAgaW5pdGlhbGl6ZUNvbnRyb2xzKCk7Ci0gICAgICAgIHZhbGlkYXRlUGFnZSgpOwotICAgICAgICByZXNvdXJjZUdyb3VwLnNldEZvY3VzKCk7Ci0gICAgICAgIHNldFRpdGxlKElERVdvcmtiZW5jaE1lc3NhZ2VzLlNhdmVBc0RpYWxvZ190aXRsZSk7Ci0gICAgICAgIGRsZ1RpdGxlSW1hZ2UgPSBJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0RMR0JBTl9TQVZFQVNfRExHKS5jcmVhdGVJbWFnZSgpOwotICAgICAgICBzZXRUaXRsZUltYWdlKGRsZ1RpdGxlSW1hZ2UpOwotICAgICAgICBzZXRNZXNzYWdlKElERVdvcmtiZW5jaE1lc3NhZ2VzLlNhdmVBc0RpYWxvZ19tZXNzYWdlKTsKLQotICAgICAgICByZXR1cm4gY29udGVudHM7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRoZSA8Y29kZT5TYXZlQXNEaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+V2luZG93PC9jb2RlPgotICAgICAqIG1ldGhvZCBkaXNwb3NlcyBvZiB0aGUgYmFubmVyIGltYWdlIHdoZW4gdGhlIGRpYWxvZyBpcyBjbG9zZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0gICAgICAgIGlmIChkbGdUaXRsZUltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBkbGdUaXRsZUltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLSAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLSAgICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0gICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gdG9wIGxldmVsIGNvbXBvc2l0ZQotICAgICAgICBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0gICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KHBhcmVudENvbXBvc2l0ZS5nZXRGb250KCkpOwotCi0gICAgICAgIExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzZXREaWFsb2dDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgcmVzb3VyY2VHcm91cCA9IG5ldyBSZXNvdXJjZUFuZENvbnRhaW5lckdyb3VwKAotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSwKLSAgICAgICAgICAgICAgICBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5TYXZlQXNEaWFsb2dfZmlsZUxhYmVsLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5TYXZlQXNEaWFsb2dfZmlsZSk7Ci0gICAgICAgIHJlc291cmNlR3JvdXAuc2V0QWxsb3dFeGlzdGluZ1Jlc291cmNlcyh0cnVlKTsKLQotICAgICAgICByZXR1cm4gcGFyZW50Q29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGwgcGF0aCBlbnRlcmVkIGJ5IHRoZSB1c2VyLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgZmlsZSBhbmQgY29udGFpbmVyIG1pZ2h0IG5vdCBleGlzdCBhbmQgd291bGQgbmVlZCB0byBiZSBjcmVhdGVkLgotICAgICAqIFNlZSB0aGUgPGNvZGU+SUZpbGUuY3JlYXRlPC9jb2RlPiBtZXRob2QgYW5kIHRoZSAKLSAgICAgKiA8Y29kZT5Db250YWluZXJHZW5lcmF0b3I8L2NvZGU+IGNsYXNzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHBhdGgsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIENhbmNlbCB3YXMgcHJlc3NlZAotICAgICAqLwotICAgIHB1YmxpYyBJUGF0aCBnZXRSZXN1bHQoKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2xzIG9mIHRoaXMgZGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29udHJvbHMoKSB7Ci0gICAgICAgIGlmIChvcmlnaW5hbEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzb3VyY2VHcm91cC5zZXRDb250YWluZXJGdWxsUGF0aChvcmlnaW5hbEZpbGUuZ2V0UGFyZW50KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICAgICAgcmVzb3VyY2VHcm91cC5zZXRSZXNvdXJjZShvcmlnaW5hbEZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbE5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc291cmNlR3JvdXAuc2V0UmVzb3VyY2Uob3JpZ2luYWxOYW1lKTsKLSAgICAgICAgc2V0RGlhbG9nQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgLy8gR2V0IG5ldyBwYXRoLgotICAgICAgICBJUGF0aCBwYXRoID0gcmVzb3VyY2VHcm91cC5nZXRDb250YWluZXJGdWxsUGF0aCgpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICByZXNvdXJjZUdyb3VwLmdldFJlc291cmNlKCkpOwotCi0gICAgICAgIC8vSWYgdGhlIHVzZXIgZG9lcyBub3Qgc3VwcGx5IGEgZmlsZSBleHRlbnNpb24gYW5kIGlmIHRoZSBzYXZlIAotICAgICAgICAvL2FzIGRpYWxvZyB3YXMgcHJvdmlkZWQgYSBkZWZhdWx0IGZpbGUgbmFtZSBhcHBlbmQgdGhlIGV4dGVuc2lvbiAKLSAgICAgICAgLy9vZiB0aGUgZGVmYXVsdCBmaWxlbmFtZSB0byB0aGUgbmV3IG5hbWUKLSAgICAgICAgaWYgKHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChvcmlnaW5hbEZpbGUgIT0gbnVsbCAmJiBvcmlnaW5hbEZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguYWRkRmlsZUV4dGVuc2lvbihvcmlnaW5hbEZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG9yaWdpbmFsTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IHBvcyA9IG9yaWdpbmFsTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgICAgIGlmICgrK3BvcyA+IDAgJiYgcG9zIDwgb3JpZ2luYWxOYW1lLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5hZGRGaWxlRXh0ZW5zaW9uKG9yaWdpbmFsTmFtZS5zdWJzdHJpbmcocG9zKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgcGF0aCBhbHJlYWR5IGV4aXN0cyB0aGVuIGNvbmZpcm0gb3ZlcndyaXRlLgotICAgICAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgU3RyaW5nW10gYnV0dG9ucyA9IG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9OwotICAgICAgICAgICAgU3RyaW5nIHF1ZXN0aW9uID0gTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuU2F2ZUFzRGlhbG9nX292ZXJ3cml0ZVF1ZXN0aW9uLCBwYXRoLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICBNZXNzYWdlRGlhbG9nIGQgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5RdWVzdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgcXVlc3Rpb24sIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIGJ1dHRvbnMsIDApOwotICAgICAgICAgICAgaW50IG92ZXJ3cml0ZSA9IGQub3BlbigpOwotICAgICAgICAgICAgc3dpdGNoIChvdmVyd3JpdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDogLy8gWWVzCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6IC8vIE5vCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSAyOiAvLyBDYW5jZWwKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgY2FuY2VsUHJlc3NlZCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN0b3JlIHBhdGggYW5kIGNsb3NlLgotICAgICAgICByZXN1bHQgPSBwYXRoOwotICAgICAgICBjbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbXBsZXRpb24gc3RhdGUgb2YgdGhpcyBkaWFsb2cgYW5kIGFkanVzdHMgdGhlIGVuYWJsZSBzdGF0ZSBvZgotICAgICAqIHRoZSBPayBidXR0b24gYWNjb3JkaW5nbHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBkaWFsb2cgaXMgY29tcGVsZXRlLCBhbmQKLSAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldERpYWxvZ0NvbXBsZXRlKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgb2tCdXR0b24uc2V0RW5hYmxlZCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgb3JpZ2luYWwgZmlsZSB0byB1c2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3JpZ2luYWxGaWxlIHRoZSBvcmlnaW5hbCBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3JpZ2luYWxGaWxlKElGaWxlIG9yaWdpbmFsRmlsZSkgewotICAgICAgICB0aGlzLm9yaWdpbmFsRmlsZSA9IG9yaWdpbmFsRmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSB0byB1c2UuCi0gICAgICogVXNlZCBpbnN0ZWFkIG9mIDxjb2RlPnNldE9yaWdpbmFsRmlsZTwvY29kZT4KLSAgICAgKiB3aGVuIHRoZSBvcmlnaW5hbCByZXNvdXJjZSBpcyBub3QgYW4gSUZpbGUuCi0gICAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIDxjb2RlPmNyZWF0ZTwvY29kZT4uCi0gICAgICogQHBhcmFtIG9yaWdpbmFsTmFtZSBkZWZhdWx0IGZpbGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9yaWdpbmFsTmFtZShTdHJpbmcgb3JpZ2luYWxOYW1lKSB7Ci0gICAgICAgIHRoaXMub3JpZ2luYWxOYW1lID0gb3JpZ2luYWxOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhZ2UncyB2aXN1YWwgY29tcG9uZW50cyBhbGwgY29udGFpbiB2YWxpZCB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHZhbGlkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgICAgICBpZiAoIXJlc291cmNlR3JvdXAuYXJlQWxsVmFsdWVzVmFsaWQoKSkgewotICAgICAgICAgICAgaWYgKCFyZXNvdXJjZUdyb3VwLmdldFJlc291cmNlKCkuZXF1YWxzKCIiKSkgLy8gaWYgYmxhbmsgbmFtZSB0aGVuIGZhaWwgc2lsZW50bHkvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKHJlc291cmNlR3JvdXAuZ2V0UHJvYmxlbU1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0JLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkRpYWxvZyNnZXREaWFsb2dCb3VuZHNTZXR0aW5ncygpCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMgotICAgICAqLwotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKSB7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBzZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HU19TRUNUSU9OKTsKLSAgICAgICAgaWYgKHNlY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04pOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gc2VjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvV2l6YXJkRGF0YVRyYW5zZmVyUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZERhdGFUcmFuc2ZlclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwNDRkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvV2l6YXJkRGF0YVRyYW5zZmVyUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci0KLS8qKgotICogVGhlIGNvbW1vbiBzdXBlcmNsYXNzIGZvciB3aXphcmQgaW1wb3J0IGFuZCBleHBvcnQgcGFnZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgd29ya2JlbmNoLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2l6YXJkRGF0YVRyYW5zZmVyUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cwotICAgICAgICBMaXN0ZW5lciwgSU92ZXJ3cml0ZVF1ZXJ5IHsKLQotICAgIC8vIGNvbnN0YW50cwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIID0gMjUwOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09NQk9fSElTVE9SWV9MRU5HVEggPSA1OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB3aXphcmQgcGFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFnZQotICAgICAqLwotICAgIHByb3RlY3RlZCBXaXphcmREYXRhVHJhbnNmZXJQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotICAgICAgICBzdXBlcihwYWdlTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBlbnRyeSB0byBhIGhpc3RvcnksIHdoaWxlIHRha2luZyBjYXJlIG9mIGR1cGxpY2F0ZSBoaXN0b3J5IGl0ZW1zCi0gICAgICogYW5kIGV4Y2Vzc2l2ZWx5IGxvbmcgaGlzdG9yaWVzLiAgVGhlIGFzc3VtcHRpb24gaXMgbWFkZSB0aGF0IGFsbCBoaXN0b3JpZXMKLSAgICAgKiBzaG91bGQgYmUgb2YgbGVuZ3RoIDxjb2RlPldpemFyZERhdGFUcmFuc2ZlclBhZ2UuQ09NQk9fSElTVE9SWV9MRU5HVEg8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGhpc3RvcnkgdGhlIGN1cnJlbnQgaGlzdG9yeQotICAgICAqIEBwYXJhbSBuZXdFbnRyeSB0aGUgZW50cnkgdG8gYWRkIHRvIHRoZSBoaXN0b3J5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGFkZFRvSGlzdG9yeShTdHJpbmdbXSBoaXN0b3J5LCBTdHJpbmcgbmV3RW50cnkpIHsKLSAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBsID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoQXJyYXlzLmFzTGlzdChoaXN0b3J5KSk7Ci0gICAgICAgIGFkZFRvSGlzdG9yeShsLCBuZXdFbnRyeSk7Ci0gICAgICAgIFN0cmluZ1tdIHIgPSBuZXcgU3RyaW5nW2wuc2l6ZSgpXTsKLSAgICAgICAgbC50b0FycmF5KHIpOwotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGVudHJ5IHRvIGEgaGlzdG9yeSwgd2hpbGUgdGFraW5nIGNhcmUgb2YgZHVwbGljYXRlIGhpc3RvcnkgaXRlbXMKLSAgICAgKiBhbmQgZXhjZXNzaXZlbHkgbG9uZyBoaXN0b3JpZXMuICBUaGUgYXNzdW1wdGlvbiBpcyBtYWRlIHRoYXQgYWxsIGhpc3RvcmllcwotICAgICAqIHNob3VsZCBiZSBvZiBsZW5ndGggPGNvZGU+V2l6YXJkRGF0YVRyYW5zZmVyUGFnZS5DT01CT19ISVNUT1JZX0xFTkdUSDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGlzdG9yeSB0aGUgY3VycmVudCBoaXN0b3J5Ci0gICAgICogQHBhcmFtIG5ld0VudHJ5IHRoZSBlbnRyeSB0byBhZGQgdG8gdGhlIGhpc3RvcnkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb0hpc3RvcnkoTGlzdCBoaXN0b3J5LCBTdHJpbmcgbmV3RW50cnkpIHsKLSAgICAgICAgaGlzdG9yeS5yZW1vdmUobmV3RW50cnkpOwotICAgICAgICBoaXN0b3J5LmFkZCgwLCBuZXdFbnRyeSk7Ci0KLSAgICAgICAgLy8gc2luY2Ugb25seSBvbmUgbmV3IGl0ZW0gd2FzIGFkZGVkLCB3ZSBjYW4gYmUgb3ZlciB0aGUgbGltaXQKLSAgICAgICAgLy8gYnkgYXQgbW9zdCBvbmUgaXRlbQotICAgICAgICBpZiAoaGlzdG9yeS5zaXplKCkgPiBDT01CT19ISVNUT1JZX0xFTkdUSCkKLSAgICAgICAgICAgIGhpc3RvcnkucmVtb3ZlKENPTUJPX0hJU1RPUllfTEVOR1RIKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIGVudGVyIGEgbmV3IGNvbnRhaW5lciBuYW1lIG9yIGp1c3QKLSAgICAgKiBjaG9vc2UgZnJvbSBleGlzdGluZyBvbmVzLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBuZXcgb25lcyBhcmUgb2theSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICBpZiBvbmx5IGV4aXN0aW5nIG9uZXMgYXJlIGFsbG93ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBhbGxvd05ld0NvbnRhaW5lck5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgbGFiZWwgd2l0aCBhIGJvbGQgZm9udC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHBhcmFtIHRleHQgdGhlIGxhYmVsIHRleHQKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgbGFiZWwgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVCb2xkTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgcmV0dXJuIGxhYmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGltcG9ydC9leHBvcnQgb3B0aW9ucyBncm91cCBjb250cm9scy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkRGF0YVRyYW5zZmVyUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcwotICAgICAqIG5vdGhpbmcuIFN1YmNsYXNzZXMgd2lzaGluZyB0byBkZWZpbmUgc3VjaCBjb21wb25lbnRzIHNob3VsZCByZWltcGxlbWVudAotICAgICAqIHRoaXMgaG9vayBtZXRob2QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG9wdGlvbnNHcm91cCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPcHRpb25zR3JvdXBCdXR0b25zKEdyb3VwIG9wdGlvbnNHcm91cCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgbGFiZWwgd2l0aCBhIGJvbGQgZm9udC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHBhcmFtIHRleHQgdGhlIGxhYmVsIHRleHQKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgbGFiZWwgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVQbGFpbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KHRleHQpOwotICAgICAgICBsYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICByZXR1cm4gbGFiZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGhvcml6b250YWwgc3BhY2VyIGxpbmUgdGhhdCBmaWxscyB0aGUgd2lkdGggb2YgaXRzIGNvbnRhaW5lci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3BhY2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgICAgIHNwYWNlci5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhZ2UgaXMgY29tcGxldGUuIFRoaXMgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIGJhc2VkIHVwb24KLSAgICAgKiB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGlzIHBhZ2UncyBjb250cm9scy4gIFN1YmNsYXNzZXMgd2lzaGluZyB0byBpbmNsdWRlCi0gICAgICogdGhlaXIgY29udHJvbHMgaW4gdGhpcyBkZXRlcm1pbmF0aW9uIHNob3VsZCBvdmVycmlkZSB0aGUgaG9vayBtZXRob2RzIAotICAgICAqIDxjb2RlPnZhbGlkYXRlU291cmNlR3JvdXA8L2NvZGU+IGFuZC9vciA8Y29kZT52YWxpZGF0ZU9wdGlvbnNHcm91cDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcGFnZSBpcyBjb21wbGV0ZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZgotICAgICAqICAgaW5jb21wbGV0ZQotICAgICAqIEBzZWUgI3ZhbGlkYXRlU291cmNlR3JvdXAKLSAgICAgKiBAc2VlICN2YWxpZGF0ZU9wdGlvbnNHcm91cAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGRldGVybWluZVBhZ2VDb21wbGV0aW9uKCkgewotICAgICAgICBib29sZWFuIGNvbXBsZXRlID0gdmFsaWRhdGVTb3VyY2VHcm91cCgpICYmIHZhbGlkYXRlRGVzdGluYXRpb25Hcm91cCgpCi0gICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVPcHRpb25zR3JvdXAoKTsKLQotICAgICAgICAvLyBBdm9pZCBkcmF3IGZsaWNrZXIgYnkgbm90IGNsZWFyaW5nIHRoZSBlcnJvcgotICAgICAgICAvLyBtZXNzYWdlIHVubGVzcyBhbGwgaXMgdmFsaWQuCi0gICAgICAgIGlmIChjb21wbGV0ZSkKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgICAgICByZXR1cm4gY29tcGxldGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgcGF0aCBmcm9tIHRoZSBzdXBwbGllZCB0ZXh0IHdpZGdldC4KLSAgICAgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAotICAgICAqLwotICAgIHByb3RlY3RlZCBJUGF0aCBnZXRQYXRoRnJvbVRleHQoVGV4dCB0ZXh0RmllbGQpIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSB0ZXh0RmllbGQuZ2V0VGV4dCgpOwotICAgICAgICAvL0RvIG5vdCBtYWtlIGFuIGVtcHR5IHBhdGggYWJzb2x1dGUgc28gYXMgbm90IHRvIGNvbmZ1c2Ugd2l0aCB0aGUgcm9vdAotICAgICAgICBpZiAodGV4dC5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXRoKHRleHQpOwotICAgICAgIAotICAgICAgICByZXR1cm4gKG5ldyBQYXRoKHRleHQpKS5tYWtlQWJzb2x1dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBRdWVyaWVzIHRoZSB1c2VyIHRvIHN1cHBseSBhIGNvbnRhaW5lciByZXNvdXJjZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHBhdGggdG8gYW4gZXhpc3Rpbmcgb3IgbmV3IGNvbnRhaW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0gICAgICogICAgdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZwotICAgICAqLwotICAgIHByb3RlY3RlZCBJUGF0aCBxdWVyeUZvckNvbnRhaW5lcihJQ29udGFpbmVyIGluaXRpYWxTZWxlY3Rpb24sIFN0cmluZyBtc2cpIHsKLSAgICAgICAgcmV0dXJuIHF1ZXJ5Rm9yQ29udGFpbmVyKGluaXRpYWxTZWxlY3Rpb24sIG1zZywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUXVlcmllcyB0aGUgdXNlciB0byBzdXBwbHkgYSBjb250YWluZXIgcmVzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXRoIHRvIGFuIGV4aXN0aW5nIG9yIG5ldyBjb250YWluZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotICAgICAqICAgIHVzZXIgY2FuY2VsbGVkIHRoZSBkaWFsb2cKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVBhdGggcXVlcnlGb3JDb250YWluZXIoSUNvbnRhaW5lciBpbml0aWFsU2VsZWN0aW9uLCBTdHJpbmcgbXNnLAotICAgICAgICAgICAgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgIGdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBpbml0aWFsU2VsZWN0aW9uLAotICAgICAgICAgICAgICAgIGFsbG93TmV3Q29udGFpbmVyTmFtZSgpLCBtc2cpOwotICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkKLSAgICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZSh0aXRsZSk7Ci0gICAgICAgIGRpYWxvZy5zaG93Q2xvc2VkUHJvamVjdHMoZmFsc2UpOwotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiAoSVBhdGgpIHJlc3VsdFswXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkRGF0YVRyYW5zZmVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPklPdmVyd3JpdGVRdWVyeTwvY29kZT4gbWV0aG9kIGFza3MgdGhlIHVzZXIgd2hldGhlciB0aGUgZXhpc3RpbmcgCi0gICAgICogcmVzb3VyY2UgYXQgdGhlIGdpdmVuIHBhdGggc2hvdWxkIGJlIG92ZXJ3cml0dGVuLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGhTdHJpbmcgCi0gICAgICogQHJldHVybiB0aGUgdXNlcidzIHJlcGx5OiBvbmUgb2YgPGNvZGU+IllFUyI8L2NvZGU+LCA8Y29kZT4iTk8iPC9jb2RlPiwgPGNvZGU+IkFMTCI8L2NvZGU+LCAKLSAgICAgKiAgIG9yIDxjb2RlPiJDQU5DRUwiPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgcXVlcnlPdmVyd3JpdGUoU3RyaW5nIHBhdGhTdHJpbmcpIHsKLQotICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aChwYXRoU3RyaW5nKTsKLQotICAgICAgICBTdHJpbmcgbWVzc2FnZVN0cmluZzsKLSAgICAgICAgLy9CcmVhayB0aGUgbWVzc2FnZSB1cCBpZiB0aGVyZSBpcyBhIGZpbGUgbmFtZSBhbmQgYSBkaXJlY3RvcnkKLSAgICAgICAgLy9hbmQgdGhlcmUgYXJlIGF0IGxlYXN0IDIgc2VnbWVudHMuCi0gICAgICAgIGlmIChwYXRoLmdldEZpbGVFeHRlbnNpb24oKSA9PSBudWxsIHx8IHBhdGguc2VnbWVudENvdW50KCkgPCAyKQotICAgICAgICAgICAgbWVzc2FnZVN0cmluZyA9IE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZERhdGFUcmFuc2Zlcl9leGlzdHNRdWVzdGlvbiwgcGF0aFN0cmluZyk7Ci0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWVzc2FnZVN0cmluZyA9IE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZERhdGFUcmFuc2Zlcl9vdmVyd3JpdGVOYW1lQW5kUGF0aFF1ZXN0aW9uLCBwYXRoLmxhc3RTZWdtZW50KCksCi0JCQlwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b09TU3RyaW5nKCkpOwotCi0gICAgICAgIGZpbmFsIE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0Q29udGFpbmVyKCkKLSAgICAgICAgICAgICAgICAuZ2V0U2hlbGwoKSwgSURFV29ya2JlbmNoTWVzc2FnZXMuUXVlc3Rpb24sCi0gICAgICAgICAgICAgICAgbnVsbCwgbWVzc2FnZVN0cmluZywgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuTk9fVE9fQUxMX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwgfSwgMCk7Ci0gICAgICAgIFN0cmluZ1tdIHJlc3BvbnNlID0gbmV3IFN0cmluZ1tdIHsgWUVTLCBBTEwsIE5PLCBOT19BTEwsIENBTkNFTCB9OwotICAgICAgICAvL3J1biBpbiBzeW5jRXhlYyBiZWNhdXNlIGNhbGxiYWNrIGlzIGZyb20gYW4gb3BlcmF0aW9uLAotICAgICAgICAvL3doaWNoIGlzIHByb2JhYmx5IG5vdCBydW5uaW5nIGluIHRoZSBVSSB0aHJlYWQuCi0gICAgICAgIGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gZGlhbG9nLmdldFJldHVybkNvZGUoKSA8IDAgPyBDQU5DRUwgOiByZXNwb25zZVtkaWFsb2cKLSAgICAgICAgICAgICAgICAuZ2V0UmV0dXJuQ29kZSgpXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5cyBhIFllcy9ObyBxdWVzdGlvbiB0byB0aGUgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgcmV0dXJucwotICAgICAqIHRoZSB1c2VyJ3MgcmVzcG9uc2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgcXVlc3Rpb24gdG8gYXNrCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgWWVzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBObwotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHF1ZXJ5WWVzTm9RdWVzdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuUXVlc3Rpb24sCi0gICAgICAgICAgICAgICAgKEltYWdlKSBudWxsLCBtZXNzYWdlLCBNZXNzYWdlRGlhbG9nLk5PTkUsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMIH0sIDApOwotICAgICAgICAvLyBlbnN1cmUgeWVzIGlzIHRoZSBkZWZhdWx0Ci0KLSAgICAgICAgcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlcyBjb250cm9sIHNldHRpbmdzIHRoYXQgd2VyZSBzYXZlZCBpbiB0aGUgcHJldmlvdXMgaW5zdGFuY2Ugb2YgdGhpcwotICAgICAqIHBhZ2UuICAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkRGF0YVRyYW5zZmVyUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcwotICAgICAqIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgaG9vayBtZXRob2QuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgY29udHJvbCBzZXR0aW5ncyB0aGF0IGFyZSB0byBiZSByZXN0b3JlZCBpbiB0aGUgbmV4dCBpbnN0YW5jZSBvZgotICAgICAqIHRoaXMgcGFnZS4gIAotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5XaXphcmREYXRhVHJhbnNmZXJQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzCi0gICAgICogbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBob29rIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2F2ZVdpZGdldFZhbHVlcygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIHBhZ2UgaXMgY29tcGxldGUgYW5kIHVwZGF0ZSB0aGUgcGFnZSBhcHByb3ByaWF0ZWx5LiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlQ29tcGxldGlvbigpIHsKLSAgICAgICAgYm9vbGVhbiBwYWdlQ29tcGxldGUgPSBkZXRlcm1pbmVQYWdlQ29tcGxldGlvbigpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUocGFnZUNvbXBsZXRlKTsKLSAgICAgICAgaWYgKHBhZ2VDb21wbGV0ZSkgewotICAgICAgICAgICAgc2V0TWVzc2FnZShudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGVuYWJsZSBzdGF0ZSBvZiB0aGlzIHBhZ2UncyBjb250cm9scy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkRGF0YVRyYW5zZmVyUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcwotICAgICAqIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIGhvb2sgbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYWdlJ3MgZGVzdGluYXRpb24gc3BlY2lmaWNhdGlvbiBjb250cm9scyBjdXJyZW50bHkgYWxsCi0gICAgICogY29udGFpbiB2YWxpZCB2YWx1ZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPldpemFyZERhdGFUcmFuc2ZlclBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPi4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdGhpcyBob29rIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluZGljYXRpbmcgdmFsaWRpdHkgb2YgYWxsIGNvbnRyb2xzIGluIHRoZSAKLSAgICAgKiAgIGRlc3RpbmF0aW9uIHNwZWNpZmljYXRpb24gZ3JvdXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZURlc3RpbmF0aW9uR3JvdXAoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhZ2UncyBvcHRpb25zIGdyb3VwJ3MgY29udHJvbHMgY3VycmVudGx5IGFsbCBjb250YWluCi0gICAgICogdmFsaWQgdmFsdWVzLgotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5XaXphcmREYXRhVHJhbnNmZXJQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50IHRoaXMgaG9vayBtZXRob2QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbmRpY2F0aW5nIHZhbGlkaXR5IG9mIGFsbCBjb250cm9scyBpbiB0aGUgb3B0aW9ucwotICAgICAqICAgZ3JvdXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZU9wdGlvbnNHcm91cCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFnZSdzIHNvdXJjZSBzcGVjaWZpY2F0aW9uIGNvbnRyb2xzIGN1cnJlbnRseSBhbGwKLSAgICAgKiBjb250YWluIHZhbGlkIHZhbHVlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkRGF0YVRyYW5zZmVyUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucwotICAgICAqIDxjb2RlPnRydWU8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudCB0aGlzIGhvb2sgbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW5kaWNhdGluZyB2YWxpZGl0eSBvZiBhbGwgY29udHJvbHMgaW4gdGhlIAotICAgICAqICAgc291cmNlIHNwZWNpZmljYXRpb24gZ3JvdXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNvdXJjZUdyb3VwKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglDcmVhdGUgdGhlIG9wdGlvbnMgc3BlY2lmaWNhdGlvbiB3aWRnZXRzLgotICAgICAqCi0gICAgICoJQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPcHRpb25zR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBvcHRpb25zIGdyb3VwCi0gICAgICAgIEdyb3VwIG9wdGlvbnNHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBvcHRpb25zR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIG9wdGlvbnNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotICAgICAgICBvcHRpb25zR3JvdXAuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRFeHBvcnRQYWdlX29wdGlvbnMpOwotICAgICAgICBvcHRpb25zR3JvdXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotICAgICAgICBjcmVhdGVPcHRpb25zR3JvdXBCdXR0b25zKG9wdGlvbnNHcm91cCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5IGFuIGVycm9yIGRpYWxvZyB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGlzcGxheUVycm9yRGlhbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgZ2V0RXJyb3JEaWFsb2dUaXRsZSgpLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5IGFuIGVycm9yIGRpc2xvZyB3aXRoIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZQotICAgICAqIHN1cHBsaWVkIGV4Y2VwdGlvbi4KLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRocm93YWJsZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRpc3BsYXlFcnJvckRpYWxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgLy9Tb21lIHN5c3RlbSBleGNlcHRpb25zIGhhdmUgbm8gbWVzc2FnZQotICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgICAgICAgICAgbWVzc2FnZSA9IE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZERhdGFUcmFuc2Zlcl9leGNlcHRpb25NZXNzYWdlLCBleGNlcHRpb24pOwotICAgICAgICBkaXNwbGF5RXJyb3JEaWFsb2cobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0aXRsZSBmb3IgYW4gZXJyb3IgZGlhbG9nLiBTdWJjbGFzc2VzIHNob3VsZAotICAgICAqIG92ZXJyaWRlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JEaWFsb2dUaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEV4cG9ydFBhZ2VfaW50ZXJuYWxFcnJvclRpdGxlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZEV4cG9ydFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9XaXphcmRFeHBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzY2E3NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZEV4cG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiBBYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBhIHR5cGljYWwgZXhwb3J0IHdpemFyZCdzIG1haW4gcGFnZS4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgc3ViY2xhc3MgdGhpcyBwYWdlIHRvIGluaGVyaXQgaXRzIGNvbW1vbiBkZXN0aW5hdGlvbiByZXNvdXJjZQotICogc2VsZWN0aW9uIGZhY2lsaXRpZXMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgCi0gKiA8dWw+Ci0gKiAgIDxsaT48Y29kZT5jcmVhdGVEZXN0aW5hdGlvbkdyb3VwPC9jb2RlPjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZQotICogPHVsPgotICogICA8bGk+PGNvZGU+YWxsb3dOZXdDb250YWluZXJOYW1lPC9jb2RlPjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG1heSBleHRlbmQKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPmhhbmRsZUV2ZW50PC9jb2RlPjwvbGk+Ci0gKiAgIDxsaT48Y29kZT5pbnRlcm5hbFNhdmVXaWRnZXRWYWx1ZXM8L2NvZGU+PC9saT4KLSAqICAgPGxpPjxjb2RlPnVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzPC9jb2RlPjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogQGRlcHJlY2F0ZWQgdXNlIFdpemFyZEV4cG9ydFJlc291cmNlUGFnZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2l6YXJkRXhwb3J0UGFnZSBleHRlbmRzIFdpemFyZERhdGFUcmFuc2ZlclBhZ2UgewotICAgIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFJlc291cmNlU2VsZWN0aW9uOwotCi0gICAgcHJpdmF0ZSBMaXN0IHNlbGVjdGVkUmVzb3VyY2VzOwotCi0gICAgcHJpdmF0ZSBMaXN0IHNlbGVjdGVkVHlwZXM7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZXhwb3J0Q3VycmVudFNlbGVjdGlvbiA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGV4cG9ydEFsbFJlc291cmNlc1ByZVNldCA9IGZhbHNlOwotCi0gICAgLy8gd2lkZ2V0cwotICAgIHByaXZhdGUgQ29tYm8gdHlwZXNUb0V4cG9ydEZpZWxkOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gdHlwZXNUb0V4cG9ydEVkaXRCdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBleHBvcnRBbGxUeXBlc1JhZGlvOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZXhwb3J0U3BlY2lmaWVkVHlwZXNSYWRpbzsKLQotICAgIHByaXZhdGUgQnV0dG9uIHJlc291cmNlRGV0YWlsc0J1dHRvbjsKLQotICAgIHByaXZhdGUgTGFiZWwgcmVzb3VyY2VEZXRhaWxzRGVzY3JpcHRpb247Ci0KLSAgICBwcml2YXRlIFRleHQgcmVzb3VyY2VOYW1lRmllbGQ7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiByZXNvdXJjZUJyb3dzZUJ1dHRvbjsKLQotICAgIC8vIGluaXRpYWwgdmFsdWUgc3RvcmVzCi0gICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxFeHBvcnRBbGxUeXBlc1ZhbHVlID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGluaXRpYWxFeHBvcnRGaWVsZFZhbHVlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5pdGlhbFR5cGVzRmllbGRWYWx1ZTsKLQotICAgIC8vIGNvbnN0YW50cwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5UX1NFTEVDVElPTiA9ICI8Y3VycmVudCBzZWxlY3Rpb24+IjsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ERUxJTUlURVIgPSAiLCI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLy8gZGlhbG9nIHN0b3JlIGlkIGNvbnN0YW50cwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9TRUxFQ1RFRF9UWVBFU19JRCA9ICJXaXphcmRGaWxlU3lzdGVtRXhwb3J0UGFnZTEuU1RPUkVfU0VMRUNURURfVFlQRVNfSUQuIjsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkVfRVhQT1JUX0FMTF9SRVNPVVJDRVNfSUQgPSAiV2l6YXJkRmlsZVN5c3RlbUV4cG9ydFBhZ2UxLlNUT1JFX0VYUE9SVF9BTExfUkVTT1VSQ0VTX0lELiI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBleHBvcnQgd2l6YXJkIHBhZ2UuIElmIHRoZSBjdXJyZW50IHJlc291cmNlIHNlbGVjdGlvbiAKLSAgICAgKiBpcyBub3QgZW1wdHkgdGhlbiBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGluaXRpYWwgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMKLSAgICAgKiBzZWxlY3RlZCBmb3IgZXhwb3J0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhZ2VOYW1lIHRoZSBuYW1lIG9mIHRoZSBwYWdlCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgY3VycmVudCByZXNvdXJjZSBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgV2l6YXJkRXhwb3J0UGFnZShTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzdXBlcihwYWdlTmFtZSk7Ci0gICAgICAgIHRoaXMuY3VycmVudFJlc291cmNlU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XaXphcmRFeHBvcnRQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPldpemFyZERhdGFUcmFuc2ZlclBhZ2U8L2NvZGU+IG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4gCi0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dOZXdDb250YWluZXJOYW1lKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLSAgICAgICAgY3JlYXRlQm9sZExhYmVsKGNvbXBvc2l0ZSwgSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkRXhwb3J0UGFnZV93aGF0TGFiZWwpOwotICAgICAgICBjcmVhdGVTb3VyY2VHcm91cChjb21wb3NpdGUpOwotCi0gICAgICAgIGNyZWF0ZVNwYWNlcihjb21wb3NpdGUpOwotCi0gICAgICAgIGNyZWF0ZUJvbGRMYWJlbChjb21wb3NpdGUsIElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEV4cG9ydFBhZ2Vfd2hlcmVMYWJlbCk7Ci0gICAgICAgIGNyZWF0ZURlc3RpbmF0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQotICAgICAgICBjcmVhdGVTcGFjZXIoY29tcG9zaXRlKTsKLQotICAgICAgICBjcmVhdGVCb2xkTGFiZWwoY29tcG9zaXRlLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRFeHBvcnRQYWdlX29wdGlvbnMpOwotICAgICAgICBjcmVhdGVPcHRpb25zR3JvdXAoY29tcG9zaXRlKTsKLQotICAgICAgICByZXN0b3JlUmVzb3VyY2VTcGVjaWZpY2F0aW9uV2lkZ2V0VmFsdWVzKCk7IC8vIGllLi0gbG9jYWwKLSAgICAgICAgcmVzdG9yZVdpZGdldFZhbHVlcygpOyAvLyBpZS4tIHN1YmNsYXNzIGhvb2sKLSAgICAgICAgaWYgKGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgc2V0dXBCYXNlZE9uSW5pdGlhbFNlbGVjdGlvbnMoKTsKLQotICAgICAgICB1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUoZGV0ZXJtaW5lUGFnZUNvbXBsZXRpb24oKSk7Ci0KLSAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGV4cG9ydCBkZXN0aW5hdGlvbiBzcGVjaWZpY2F0aW9uIHZpc3VhbCBjb21wb25lbnRzLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVEZXN0aW5hdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZXhwb3J0IHNvdXJjZSByZXNvdXJjZSBzcGVjaWZpY2F0aW9uIGNvbnRyb2xzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjcmVhdGVTb3VyY2VHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIHRvcCBsZXZlbCBncm91cAotICAgICAgICBDb21wb3NpdGUgc291cmNlR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICAgICAgc291cmNlR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHNvdXJjZUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0gICAgICAgIC8vIHJlc291cmNlIGxhYmVsCi0gICAgICAgIG5ldyBMYWJlbChzb3VyY2VHcm91cCwgU1dULk5PTkUpLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkRXhwb3J0UGFnZV9mb2xkZXIpOwotCi0gICAgICAgIC8vIHJlc291cmNlIG5hbWUgZW50cnkgZmllbGQKLSAgICAgICAgcmVzb3VyY2VOYW1lRmllbGQgPSBuZXcgVGV4dChzb3VyY2VHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICByZXNvdXJjZU5hbWVGaWVsZC5hZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgdGhpcyk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotICAgICAgICByZXNvdXJjZU5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIC8vIHJlc291cmNlIGJyb3dzZSBidXR0b24KLSAgICAgICAgcmVzb3VyY2VCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHNvdXJjZUdyb3VwLCBTV1QuUFVTSCk7Ci0gICAgICAgIHJlc291cmNlQnJvd3NlQnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkRXhwb3J0UGFnZV9icm93c2UpOwotICAgICAgICByZXNvdXJjZUJyb3dzZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICAgICAgcmVzb3VyY2VCcm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgLy8gZXhwb3J0IGFsbCB0eXBlcyByYWRpbwkKLSAgICAgICAgZXhwb3J0QWxsVHlwZXNSYWRpbyA9IG5ldyBCdXR0b24oc291cmNlR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgIGV4cG9ydEFsbFR5cGVzUmFkaW8uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRFeHBvcnRQYWdlX2FsbFR5cGVzKTsKLSAgICAgICAgZXhwb3J0QWxsVHlwZXNSYWRpby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBleHBvcnRBbGxUeXBlc1JhZGlvLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgLy8gZXhwb3J0IHNwZWNpZmljIHR5cGVzIHJhZGlvCi0gICAgICAgIGV4cG9ydFNwZWNpZmllZFR5cGVzUmFkaW8gPSBuZXcgQnV0dG9uKHNvdXJjZUdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICBleHBvcnRTcGVjaWZpZWRUeXBlc1JhZGlvLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkRXhwb3J0UGFnZV9zcGVjaWZpY1R5cGVzKTsKLSAgICAgICAgZXhwb3J0U3BlY2lmaWVkVHlwZXNSYWRpby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQotICAgICAgICAvLyB0eXBlcyBjb21ibwotICAgICAgICB0eXBlc1RvRXhwb3J0RmllbGQgPSBuZXcgQ29tYm8oc291cmNlR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0gICAgICAgIHR5cGVzVG9FeHBvcnRGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICB0eXBlc1RvRXhwb3J0RmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLSAgICAgICAgLy8gdHlwZXMgZWRpdCBidXR0b24KLSAgICAgICAgdHlwZXNUb0V4cG9ydEVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKHNvdXJjZUdyb3VwLCBTV1QuUFVTSCk7Ci0gICAgICAgIHR5cGVzVG9FeHBvcnRFZGl0QnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkRXhwb3J0UGFnZV9lZGl0KTsKLSAgICAgICAgdHlwZXNUb0V4cG9ydEVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0VORCkpOwotICAgICAgICB0eXBlc1RvRXhwb3J0RWRpdEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQotICAgICAgICAvLyBkZXRhaWxzIGJ1dHRvbgotICAgICAgICByZXNvdXJjZURldGFpbHNCdXR0b24gPSBuZXcgQnV0dG9uKHNvdXJjZUdyb3VwLCBTV1QuUFVTSCk7Ci0gICAgICAgIHJlc291cmNlRGV0YWlsc0J1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEV4cG9ydFBhZ2VfZGV0YWlscyk7Ci0gICAgICAgIHJlc291cmNlRGV0YWlsc0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQotICAgICAgICAvLyBkZXRhaWxzIGxhYmVsCi0gICAgICAgIHJlc291cmNlRGV0YWlsc0Rlc2NyaXB0aW9uID0gbmV3IExhYmVsKHNvdXJjZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgcmVzb3VyY2VEZXRhaWxzRGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgICAvLyBpbml0aWFsIHNldHVwCi0gICAgICAgIHJlc2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLSAgICAgICAgZXhwb3J0QWxsVHlwZXNSYWRpby5zZXRTZWxlY3Rpb24oaW5pdGlhbEV4cG9ydEFsbFR5cGVzVmFsdWUpOwotICAgICAgICBleHBvcnRTcGVjaWZpZWRUeXBlc1JhZGlvLnNldFNlbGVjdGlvbighaW5pdGlhbEV4cG9ydEFsbFR5cGVzVmFsdWUpOwotICAgICAgICB0eXBlc1RvRXhwb3J0RmllbGQuc2V0RW5hYmxlZCghaW5pdGlhbEV4cG9ydEFsbFR5cGVzVmFsdWUpOwotICAgICAgICB0eXBlc1RvRXhwb3J0RWRpdEJ1dHRvbi5zZXRFbmFibGVkKCFpbml0aWFsRXhwb3J0QWxsVHlwZXNWYWx1ZSk7Ci0KLSAgICAgICAgaWYgKGluaXRpYWxFeHBvcnRGaWVsZFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICByZXNvdXJjZU5hbWVGaWVsZC5zZXRUZXh0KGluaXRpYWxFeHBvcnRGaWVsZFZhbHVlKTsKLSAgICAgICAgaWYgKGluaXRpYWxUeXBlc0ZpZWxkVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHR5cGVzVG9FeHBvcnRGaWVsZC5zZXRUZXh0KGluaXRpYWxUeXBlc0ZpZWxkVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3BsYXkgYW4gZXJyb3IgZGlhbG9nIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5RXJyb3JEaWFsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwgSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkRXhwb3J0UGFnZV9lcnJvckRpYWxvZ1RpdGxlLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5cyBhIGRlc2NyaXB0aW9uIG1lc3NhZ2UgdGhhdCBpbmRpY2F0ZXMgYSBzZWxlY3Rpb24gb2YgcmVzb3VyY2VzCi0gICAgICogb2YgdGhlIHNwZWNpZmllZCBzaXplLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdGVkUmVzb3VyY2VDb3VudCB0aGUgcmVzb3VyY2Ugc2VsZWN0aW9uIHNpemUgdG8gZGlzcGxheQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRpc3BsYXlSZXNvdXJjZXNTZWxlY3RlZENvdW50KGludCBzZWxlY3RlZFJlc291cmNlQ291bnQpIHsKLSAgICAgICAgaWYgKHNlbGVjdGVkUmVzb3VyY2VDb3VudCA9PSAxKQotICAgICAgICAgICAgcmVzb3VyY2VEZXRhaWxzRGVzY3JpcHRpb24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRFeHBvcnRQYWdlX29uZVJlc291cmNlU2VsZWN0ZWQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXNvdXJjZURldGFpbHNEZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAuc2V0VGV4dChOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRFeHBvcnRQYWdlX3Jlc291cmNlQ291bnRNZXNzYWdlLCBuZXcgSW50ZWdlcihzZWxlY3RlZFJlc291cmNlQ291bnQpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT2Jzb2xldGUgbWV0aG9kLiBUaGlzIHdhcyBpbXBsZW1lbnRlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgZW5zdXJlTG9jYWwoKQotICAgICAqIG5lZWRlZCB0byBiZSBjYWxsZWQgYnV0IGl0IGRvZXNuJ3QgdXNlIGl0IGFueSBsb25nZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIHRoZSBsaXN0IG9mIHJlc291cmNlcyB0byBlbnN1cmUgbG9jYWxpdHkgZm9yCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3Igc3VjY2Vzc2Z1bCBjb21wbGV0aW9uCi0gICAgICogQGRlcHJlY2F0ZWQgT25seSByZXRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5zdXJlUmVzb3VyY2VzTG9jYWwoTGlzdCByZXNvdXJjZXMpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBzdWJjb2xsZWN0aW9uIGNvbnRhaW5pbmcgb25seSB0aG9zZSByZXNvdXJjZXMgd2hpY2ggYXJlIG5vdCAKLSAgICAgKiBsb2NhbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcmlnaW5hbExpc3QgdGhlIG9yaWdpbmFsIGxpc3Qgb2YgcmVzb3VyY2VzIChlbGVtZW50IHR5cGU6IAotICAgICAqICAgPGNvZGU+SVJlc291cmNlPC9jb2RlPikKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgbGlzdCBvZiBub24tbG9jYWwgcmVzb3VyY2VzIChlbGVtZW50IHR5cGU6IAotICAgICAqICAgPGNvZGU+SVJlc291cmNlPC9jb2RlPikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBleHRyYWN0Tm9uTG9jYWxSZXNvdXJjZXMoTGlzdCBvcmlnaW5hbExpc3QpIHsKLSAgICAgICAgVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3Iob3JpZ2luYWxMaXN0LnNpemUoKSk7Ci0gICAgICAgIEl0ZXJhdG9yIHJlc291cmNlc0VudW0gPSBvcmlnaW5hbExpc3QuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAocmVzb3VyY2VzRW51bS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UgPSAoSVJlc291cmNlKSByZXNvdXJjZXNFbnVtLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghY3VycmVudFJlc291cmNlLmlzTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8pKQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRFbGVtZW50KGN1cnJlbnRSZXNvdXJjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHZhbHVlIG9mIHRoZSAiRXhwb3J0IGFsbCB0eXBlcyIgcmFkaW8sCi0gICAgICogb3IgaXRzIHNldCBpbml0aWFsIHZhbHVlIGlmIGl0IGRvZXMgbm90IGV4aXN0IHlldC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlICJFeHBvcnQgQWxsIFR5cGVzIiByYWRpbydzIGN1cnJlbnQgdmFsdWUgb3IgYW50aWNpcGF0ZWQgaW5pdGlhbAotICAgICAqICAgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRFeHBvcnRBbGxUeXBlc1ZhbHVlKCkgewotICAgICAgICBpZiAoZXhwb3J0QWxsVHlwZXNSYWRpbyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGluaXRpYWxFeHBvcnRBbGxUeXBlc1ZhbHVlOwotCi0gICAgICAgIHJldHVybiBleHBvcnRBbGxUeXBlc1JhZGlvLmdldFNlbGVjdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIHJlc291cmNlIG5hbWUgZW50cnkgZmllbGQsCi0gICAgICogb3IgaXRzIHNldCBpbml0aWFsIHZhbHVlIGlmIGl0IGRvZXMgbm90IGV4aXN0IHlldCAod2hpY2ggY291bGQKLSAgICAgKiBiZSA8Y29kZT5udWxsPC9jb2RlPikuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBuYW1lIGZpZWxkJ3MgY3VycmVudCB2YWx1ZSBvciBhbnRpY2lwYXRlZCBpbml0aWFsIHZhbHVlLAotICAgICAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlRmllbGRWYWx1ZSgpIHsKLSAgICAgICAgaWYgKHJlc291cmNlTmFtZUZpZWxkID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gaW5pdGlhbEV4cG9ydEZpZWxkVmFsdWU7Ci0KLSAgICAgICAgcmV0dXJuIHJlc291cmNlTmFtZUZpZWxkLmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHBhdGggZm9yIHRoZSByZXNvdXJjZSBmaWVsZC4KLSAgICAgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAotICAgICAqLwotICAgIHByb3RlY3RlZCBJUGF0aCBnZXRSZXNvdXJjZVBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXRoRnJvbVRleHQodGhpcy5yZXNvdXJjZU5hbWVGaWVsZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHBhZ2UncyBjb2xsZWN0aW9uIG9mIGN1cnJlbnRseS1zcGVjaWZpZWQgcmVzb3VyY2VzIHRvIGJlIAotICAgICAqIGV4cG9ydGVkLiBUaGlzIGlzIHRoZSBwcmltYXJ5IHJlc291cmNlIHNlbGVjdGlvbiBmYWNpbGl0eSBhY2Nlc3NvciBmb3IgCi0gICAgICogc3ViY2xhc3Nlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgZXhwb3J0IChlbGVtZW50IAotICAgICAqICAgdHlwZTogPGNvZGU+SVJlc291cmNlPC9jb2RlPikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRTZWxlY3RlZFJlc291cmNlcygpIHsKLSAgICAgICAgaWYgKHNlbGVjdGVkUmVzb3VyY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSBzb3VyY2VSZXNvdXJjZSA9IGdldFNvdXJjZVJlc291cmNlKCk7Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2VSZXNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlbGVjdEFwcHJvcHJpYXRlUmVzb3VyY2VzKHNvdXJjZVJlc291cmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZWxlY3RlZFJlc291cmNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBvYmplY3Qgc3BlY2lmaWVkIGluIHRoZSByZXNvdXJjZSBuYW1lIGVudHJ5IGZpZWxkLAotICAgICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHN1Y2ggYSByZXNvdXJjZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgd29ya2JlbmNoLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkIGluIHRoZSByZXNvdXJjZSBuYW1lIGVudHJ5IGZpZWxkLCBvciAKLSAgICAgKiAgIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRTb3VyY2VSZXNvdXJjZSgpIHsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0UGx1Z2luV29ya3NwYWNlKCk7Ci0gICAgICAgIC8vbWFrZSB0aGUgcGF0aCBhYnNvbHV0ZSB0byBhbGxvdyBmb3Igb3B0aW9uYWwgbGVhZGluZyBzbGFzaAotICAgICAgICBJUGF0aCB0ZXN0UGF0aCA9IGdldFJlc291cmNlUGF0aCgpOwotCi0gICAgICAgIElTdGF0dXMgcmVzdWx0ID0gd29ya3NwYWNlLnZhbGlkYXRlUGF0aCh0ZXN0UGF0aC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ST09UIHwgSVJlc291cmNlLlBST0pFQ1QgfCBJUmVzb3VyY2UuRk9MREVSCi0gICAgICAgICAgICAgICAgICAgICAgICB8IElSZXNvdXJjZS5GSUxFKTsKLQotICAgICAgICBpZiAocmVzdWx0LmlzT0soKSAmJiB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmV4aXN0cyh0ZXN0UGF0aCkpCi0gICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlLmdldFJvb3QoKS5maW5kTWVtYmVyKHRlc3RQYXRoKTsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSB0eXBlcyBlbnRyeSBmaWVsZCwgb3IgaXRzIHNldAotICAgICAqIGluaXRpYWwgdmFsdWUgaWYgaXQgZG9lcyBub3QgZXhpc3QgeWV0ICh3aGljaCBjb3VsZCBiZSA8Y29kZT5udWxsPC9jb2RlPikuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlcyBlbnRyeSBmaWVsZCdzIGN1cnJlbnQgdmFsdWUgb3IgYW50aWNpcGF0ZWQgaW5pdGlhbCB2YWx1ZSwKLSAgICAgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlc0ZpZWxkVmFsdWUoKSB7Ci0gICAgICAgIGlmICh0eXBlc1RvRXhwb3J0RmllbGQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBpbml0aWFsVHlwZXNGaWVsZFZhbHVlOwotCi0gICAgICAgIHJldHVybiB0eXBlc1RvRXhwb3J0RmllbGQuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGV4dGVuc2lvbnMgY3VycmVudGx5IHNwZWNpZmllZCB0byBiZSBleHBvcnRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIGV4dGVuc2lvbnMgY3VycmVudGx5IHNwZWNpZmllZCB0byBiZSBleHBvcnRlZCAoZWxlbWVudCAKLSAgICAgKiAgIHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT4pCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0VHlwZXNUb0V4cG9ydCgpIHsKLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHR5cGVzVG9FeHBvcnRGaWVsZAotICAgICAgICAgICAgICAgIC5nZXRUZXh0KCksIFRZUEVfREVMSU1JVEVSKTsKLQotICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRFeHRlbnNpb24gPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgICAgaWYgKCFjdXJyZW50RXh0ZW5zaW9uLmVxdWFscygiIikpLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY3VycmVudEV4dGVuc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XaXphcmRFeHBvcnRQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPkxpc3RlbmVyPC9jb2RlPiBtZXRob2QgaGFuZGxlcyBhbGwgZXZlbnRzIGFuZCBlbmFibGVtZW50cyBmb3IgY29udHJvbHMKLSAgICAgKiBvbiB0aGlzIHBhZ2UuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICBXaWRnZXQgc291cmNlID0gZXZlbnQud2lkZ2V0OwotCi0gICAgICAgIGlmIChzb3VyY2UgPT0gZXhwb3J0QWxsVHlwZXNSYWRpbyB8fCBzb3VyY2UgPT0gdHlwZXNUb0V4cG9ydEZpZWxkCi0gICAgICAgICAgICAgICAgfHwgc291cmNlID09IHJlc291cmNlTmFtZUZpZWxkKQotICAgICAgICAgICAgcmVzZXRTZWxlY3RlZFJlc291cmNlcygpOwotICAgICAgICBlbHNlIGlmIChzb3VyY2UgPT0gZXhwb3J0U3BlY2lmaWVkVHlwZXNSYWRpbykgewotICAgICAgICAgICAgcmVzZXRTZWxlY3RlZFJlc291cmNlcygpOwotICAgICAgICAgICAgdHlwZXNUb0V4cG9ydEZpZWxkLnNldEZvY3VzKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlID09IHJlc291cmNlRGV0YWlsc0J1dHRvbikKLSAgICAgICAgICAgIGhhbmRsZVJlc291cmNlRGV0YWlsc0J1dHRvblByZXNzZWQoKTsKLSAgICAgICAgZWxzZSBpZiAoc291cmNlID09IHJlc291cmNlQnJvd3NlQnV0dG9uKQotICAgICAgICAgICAgaGFuZGxlUmVzb3VyY2VCcm93c2VCdXR0b25QcmVzc2VkKCk7Ci0gICAgICAgIGVsc2UgaWYgKHNvdXJjZSA9PSB0eXBlc1RvRXhwb3J0RWRpdEJ1dHRvbikKLSAgICAgICAgICAgIGhhbmRsZVR5cGVzRWRpdEJ1dHRvblByZXNzZWQoKTsKLQotICAgICAgICBzZXRQYWdlQ29tcGxldGUoZGV0ZXJtaW5lUGFnZUNvbXBsZXRpb24oKSk7Ci0gICAgICAgIHVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYSBjb250YWluZXIgc2VsZWN0aW9uIGRpYWxvZyBhbmQgZGlzcGxheXMgdGhlIHVzZXIncyBzdWJzZXF1ZW50Ci0gICAgICogY29udGFpbmVyIHNlbGVjdGlvbiBpbiB0aGlzIHBhZ2UncyByZXNvdXJjZSBuYW1lIGZpZWxkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlc291cmNlQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLSAgICAgICAgSVJlc291cmNlIGN1cnJlbnRGb2xkZXIgPSBnZXRTb3VyY2VSZXNvdXJjZSgpOwotICAgICAgICBpZiAoY3VycmVudEZvbGRlciAhPSBudWxsICYmIGN1cnJlbnRGb2xkZXIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotICAgICAgICAgICAgY3VycmVudEZvbGRlciA9IGN1cnJlbnRGb2xkZXIuZ2V0UGFyZW50KCk7Ci0KLSAgICAgICAgSVBhdGggY29udGFpbmVyUGF0aCA9IHF1ZXJ5Rm9yQ29udGFpbmVyKChJQ29udGFpbmVyKSBjdXJyZW50Rm9sZGVyLAotICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEV4cG9ydFBhZ2Vfc2VsZWN0UmVzb3VyY2VzVG9FeHBvcnQpOwotICAgICAgICBpZiAoY29udGFpbmVyUGF0aCAhPSBudWxsKSB7IC8vIG51bGwgbWVhbnMgdXNlciBjYW5jZWxsZWQKLSAgICAgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGggPSBjb250YWluZXJQYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aC50b1N0cmluZygpLmVxdWFscyhyZXNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVzZXRTZWxlY3RlZFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZUZpZWxkLnNldFRleHQocmVsYXRpdmVQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIGEgcmVzb3VyY2Ugc2VsZWN0aW9uIGRpYWxvZyBhbmQgcmVjb3JkcyB0aGUgdXNlcidzIHN1YnNlcXVlbnQKLSAgICAgKiByZXNvdXJjZSBzZWxlY3Rpb25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlc291cmNlRGV0YWlsc0J1dHRvblByZXNzZWQoKSB7Ci0gICAgICAgIElBZGFwdGFibGUgc291cmNlID0gZ2V0U291cmNlUmVzb3VyY2UoKTsKLQotICAgICAgICBpZiAoc291cmNlID09IG51bGwpCi0gICAgICAgICAgICBzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0gICAgICAgIHNlbGVjdEFwcHJvcHJpYXRlUmVzb3VyY2VzKHNvdXJjZSk7Ci0KLSAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICBzb3VyY2UgPSAoKElGaWxlKSBzb3VyY2UpLmdldFBhcmVudCgpOwotICAgICAgICAgICAgc2V0UmVzb3VyY2VUb0Rpc3BsYXkoKElSZXNvdXJjZSkgc291cmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdFtdIG5ld2x5U2VsZWN0ZWRSZXNvdXJjZXMgPSBxdWVyeUluZGl2aWR1YWxSZXNvdXJjZXNUb0V4cG9ydChzb3VyY2UpOwotCi0gICAgICAgIGlmIChuZXdseVNlbGVjdGVkUmVzb3VyY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlbGVjdGVkUmVzb3VyY2VzID0gQXJyYXlzLmFzTGlzdChuZXdseVNlbGVjdGVkUmVzb3VyY2VzKTsKLSAgICAgICAgICAgIGRpc3BsYXlSZXNvdXJjZXNTZWxlY3RlZENvdW50KHNlbGVjdGVkUmVzb3VyY2VzLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBRdWVyaWVzIHRoZSB1c2VyIGZvciB0aGUgdHlwZXMgb2YgcmVzb3VyY2VzIHRvIGJlIGV4cG9ydGVkIGFuZAotICAgICAqIGRpc3BsYXlzIHRoZXNlIHR5cGVzIGluIHRoaXMgcGFnZSdzICJUeXBlcyB0byBleHBvcnQiIGZpZWxkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGVzRWRpdEJ1dHRvblByZXNzZWQoKSB7Ci0gICAgICAgIE9iamVjdFtdIG5ld1NlbGVjdGVkVHlwZXMgPSBxdWVyeVJlc291cmNlVHlwZXNUb0V4cG9ydCgpOwotCi0gICAgICAgIGlmIChuZXdTZWxlY3RlZFR5cGVzICE9IG51bGwpIHsgLy8gaWUuLSBkaWQgbm90IHByZXNzIENhbmNlbAotICAgICAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KG5ld1NlbGVjdGVkVHlwZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2VsZWN0ZWRUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCgoSUZpbGVFZGl0b3JNYXBwaW5nKSBuZXdTZWxlY3RlZFR5cGVzW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEV4dGVuc2lvbigpKTsKLSAgICAgICAgICAgIHNldFR5cGVzVG9FeHBvcnQocmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBnaXZlbiByZXNvdXJjZSBuYW1lIGlzIGFuIGV4dGVuc2lvbiB0aGF0Ci0gICAgICogaGFzIGJlZW4gc3BlY2lmaWVkIGZvciBleHBvcnQgYnkgdGhlIHVzZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIHRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVzb3VyY2UgbmFtZSBpcyBzdWl0YWJsZSBmb3IgZXhwb3J0IGJhc2VkIAotICAgICAqICAgdXBvbiBpdHMgZXh0ZW5zaW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzRXhwb3J0YWJsZUV4dGVuc2lvbihTdHJpbmcgcmVzb3VyY2VOYW1lKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZFR5cGVzID09IG51bGwpIC8vIGllLi0gYWxsIGV4dGVuc2lvbnMgYXJlIGFjY2VwdGFibGUKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGludCBzZXBhcmF0b3JJbmRleCA9IHJlc291cmNlTmFtZS5sYXN0SW5kZXhPZigiLiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHNlcGFyYXRvckluZGV4ID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFN0cmluZyBleHRlbnNpb24gPSByZXNvdXJjZU5hbWUuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBzZWxlY3RlZFR5cGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGlmIChleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSBpdC5uZXh0KCkpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcnNpc3RzIGFkZGl0aW9uYWwgc2V0dGluZyB0aGF0IGFyZSB0byBiZSByZXN0b3JlZCBpbiB0aGUgbmV4dCBpbnN0YW5jZSBvZgotICAgICAqIHRoaXMgcGFnZS4KLSAgICAgKiA8cD4gCi0gICAgICogVGhlIDxjb2RlPldpemFyZEltcG9ydFBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMKLSAgICAgKiBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdG8gcGVyc2lzdCBhZGRpdGlvbmFsIHNldHRpbmdzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFNhdmVXaWRnZXRWYWx1ZXMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUXVlcmllcyB0aGUgdXNlciBmb3IgdGhlIGluZGl2aWR1YWwgcmVzb3VyY2VzIHRoYXQgYXJlIHRvIGJlIGV4cG9ydGVkCi0gICAgICogYW5kIHJldHVybnMgdGhlc2UgcmVzb3VyY2VzIGFzIGEgY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcm9vdFJlc291cmNlIHRoZSByZXNvdXJjZSB0byB1c2UgYXMgdGhlIHJvb3Qgb2YgdGhlIHNlbGVjdGlvbiBxdWVyeQotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlcyBzZWxlY3RlZCBmb3IgZXhwb3J0IChlbGVtZW50IHR5cGU6IAotICAgICAqICAgPGNvZGU+SVJlc291cmNlPC9jb2RlPiksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyIGNhbmNlbGVkIHRoZSAKLSAgICAgKiAgIHNlbGVjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3RbXSBxdWVyeUluZGl2aWR1YWxSZXNvdXJjZXNUb0V4cG9ydChJQWRhcHRhYmxlIHJvb3RSZXNvdXJjZSkgewotICAgICAgICBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwgcm9vdFJlc291cmNlLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRFeHBvcnRQYWdlX3NlbGVjdFJlc291cmNlc1RpdGxlKTsKLSAgICAgICAgZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb25zKHNlbGVjdGVkUmVzb3VyY2VzCi0gICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IE9iamVjdFtzZWxlY3RlZFJlc291cmNlcy5zaXplKCldKSk7Ci0gICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIHJldHVybiBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUXVlcmllcyB0aGUgdXNlciBmb3IgdGhlIHJlc291cmNlIHR5cGVzIHRoYXQgYXJlIHRvIGJlIGV4cG9ydGVkIGFuZCByZXR1cm5zCi0gICAgICogdGhlc2UgdHlwZXMgYXMgYSBjb2xsZWN0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVzb3VyY2UgdHlwZXMgc2VsZWN0ZWQgZm9yIGV4cG9ydCAoZWxlbWVudCB0eXBlOiAKLSAgICAgKiAgIDxjb2RlPlN0cmluZzwvY29kZT4pLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdXNlciBjYW5jZWxlZCB0aGUgCi0gICAgICogICBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0W10gcXVlcnlSZXNvdXJjZVR5cGVzVG9FeHBvcnQoKSB7Ci0gICAgICAgIElGaWxlRWRpdG9yTWFwcGluZyBlZGl0b3JNYXBwaW5nc1tdID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgIC5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldEZpbGVFZGl0b3JNYXBwaW5ncygpOwotCi0gICAgICAgIGludCBtYXBwaW5nc1NpemUgPSBlZGl0b3JNYXBwaW5ncy5sZW5ndGg7Ci0gICAgICAgIExpc3Qgc2VsZWN0ZWRUeXBlcyA9IGdldFR5cGVzVG9FeHBvcnQoKTsKLSAgICAgICAgTGlzdCBpbml0aWFsU2VsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3Qoc2VsZWN0ZWRUeXBlcy5zaXplKCkpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3NTaXplOyBpKyspIHsKLSAgICAgICAgICAgIElGaWxlRWRpdG9yTWFwcGluZyBjdXJyZW50TWFwcGluZyA9IGVkaXRvck1hcHBpbmdzW2ldOwotICAgICAgICAgICAgaWYgKHNlbGVjdGVkVHlwZXMuY29udGFpbnMoY3VycmVudE1hcHBpbmcuZ2V0RXh0ZW5zaW9uKCkpKQotICAgICAgICAgICAgICAgIGluaXRpYWxTZWxlY3Rpb25zLmFkZChjdXJyZW50TWFwcGluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKGdldENvbnRhaW5lcigpCi0gICAgICAgICAgICAgICAgLmdldFNoZWxsKCksIGVkaXRvck1hcHBpbmdzLAotICAgICAgICAgICAgICAgIEZpbGVFZGl0b3JNYXBwaW5nQ29udGVudFByb3ZpZGVyLklOU1RBTkNFLAotICAgICAgICAgICAgICAgIEZpbGVFZGl0b3JNYXBwaW5nTGFiZWxQcm92aWRlci5JTlNUQU5DRSwgSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkRXhwb3J0UGFnZV9zZWxlY3Rpb25EaWFsb2dNZXNzYWdlKTsKLQotICAgICAgICBkaWFsb2cuc2V0VGl0bGUoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkRXhwb3J0UGFnZV9yZXNvdXJjZVR5cGVEaWFsb2cpOwotICAgICAgICBkaWFsb2cub3BlbigpOwotCi0gICAgICAgIHJldHVybiBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoaXMgcGFnZSdzIHNlbGVjdGVkIHJlc291cmNlcyBjb2xsZWN0aW9uIGFuZCB1cGRhdGVzIGl0cyBjb250cm9scwotICAgICAqIGFjY29yZGluZ2x5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0U2VsZWN0ZWRSZXNvdXJjZXMoKSB7Ci0gICAgICAgIHJlc291cmNlRGV0YWlsc0Rlc2NyaXB0aW9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkRXhwb3J0UGFnZV9kZXRhaWxzTWVzc2FnZSk7Ci0gICAgICAgIHNlbGVjdGVkUmVzb3VyY2VzID0gbnVsbDsKLQotICAgICAgICBpZiAoZXhwb3J0Q3VycmVudFNlbGVjdGlvbikgewotICAgICAgICAgICAgZXhwb3J0Q3VycmVudFNlbGVjdGlvbiA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gQ1VSUkVOVF9TRUxFQ1RJT04KLSAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZUZpZWxkLnNldFRleHQocmVzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKENVUlJFTlRfU0VMRUNUSU9OLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lRmllbGQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZXMgcmVzb3VyY2Ugc3BlY2lmaWNhdGlvbiBjb250cm9sIHNldHRpbmdzIHRoYXQgd2VyZSBwZXJzaXN0ZWQKLSAgICAgKiBpbiB0aGUgcHJldmlvdXMgaW5zdGFuY2Ugb2YgdGhpcyBwYWdlLiBTdWJjbGFzc2VzIHdpc2hpbmcgdG8gcmVzdG9yZQotICAgICAqIHBlcnNpc3RlZCB2YWx1ZXMgZm9yIHRoZWlyIGNvbnRyb2xzIG1heSBleHRlbmQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVJlc291cmNlU3BlY2lmaWNhdGlvbldpZGdldFZhbHVlcygpIHsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IGdldE5hbWUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZXhwb3J0QWxsUmVzb3VyY2VzID0gc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgLmdldEJvb2xlYW4oU1RPUkVfRVhQT1JUX0FMTF9SRVNPVVJDRVNfSUQgKyBwYWdlTmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIHJlc3RvcmUgYWxsL3R5cGVkIHJhZGlvIHZhbHVlcyBpZmYgbm90IGFscmVhZHkgZXhwbGljaXRseSBzZXQKLSAgICAgICAgICAgIGlmICghZXhwb3J0QWxsUmVzb3VyY2VzUHJlU2V0KSB7Ci0gICAgICAgICAgICAgICAgZXhwb3J0QWxsVHlwZXNSYWRpby5zZXRTZWxlY3Rpb24oZXhwb3J0QWxsUmVzb3VyY2VzKTsKLSAgICAgICAgICAgICAgICBleHBvcnRTcGVjaWZpZWRUeXBlc1JhZGlvLnNldFNlbGVjdGlvbighZXhwb3J0QWxsUmVzb3VyY2VzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmVzdG9yZSBzZWxlY3RlZCB0eXBlcyBpZmYgbm90IGV4cGxpY2l0bHkgYWxyZWFkeSBzZXQKLSAgICAgICAgICAgIGlmIChpbml0aWFsVHlwZXNGaWVsZFZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3RlZFR5cGVzID0gc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBcnJheShTVE9SRV9TRUxFQ1RFRF9UWVBFU19JRCArIHBhZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUeXBlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFR5cGVzLmxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlc1RvRXhwb3J0RmllbGQuc2V0VGV4dChzZWxlY3RlZFR5cGVzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZFR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXNUb0V4cG9ydEZpZWxkLmFkZChzZWxlY3RlZFR5cGVzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJzaXN0cyByZXNvdXJjZSBzcGVjaWZpY2F0aW9uIGNvbnRyb2wgc2V0dGluZyB0aGF0IGFyZSB0byBiZSByZXN0b3JlZAotICAgICAqIGluIHRoZSBuZXh0IGluc3RhbmNlIG9mIHRoaXMgcGFnZS4gU3ViY2xhc3NlcyB3aXNoaW5nIHRvIHBlcnNpc3QgYWRkaXRpb25hbAotICAgICAqIHNldHRpbmcgZm9yIHRoZWlyIGNvbnRyb2xzIHNob3VsZCBleHRlbmQgaG9vayBtZXRob2QgCi0gICAgICogPGNvZGU+aW50ZXJuYWxTYXZlV2lkZ2V0VmFsdWVzPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlV2lkZ2V0VmFsdWVzKCkgewotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHBhZ2VOYW1lID0gZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAvLyB1cGRhdGUgc3BlY2lmaWMgdHlwZXMgdG8gZXhwb3J0IGhpc3RvcnkKLSAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGVkVHlwZXNOYW1lcyA9IHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBcnJheShTVE9SRV9TRUxFQ1RFRF9UWVBFU19JRCArIHBhZ2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZFR5cGVzTmFtZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGVzTmFtZXMgPSBuZXcgU3RyaW5nWzBdOwotCi0gICAgICAgICAgICBpZiAoZXhwb3J0U3BlY2lmaWVkVHlwZXNSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZXNOYW1lcyA9IGFkZFRvSGlzdG9yeShzZWxlY3RlZFR5cGVzTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlc1RvRXhwb3J0RmllbGQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgLnB1dChTVE9SRV9TRUxFQ1RFRF9UWVBFU19JRCArIHBhZ2VOYW1lLCBzZWxlY3RlZFR5cGVzTmFtZXMpOwotCi0gICAgICAgICAgICAvLyByYWRpbyBidXR0b25zCi0gICAgICAgICAgICBzZXR0aW5ncy5wdXQoU1RPUkVfRVhQT1JUX0FMTF9SRVNPVVJDRVNfSUQgKyBwYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgZXhwb3J0QWxsVHlwZXNSYWRpby5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhbGxvdyBzdWJjbGFzc2VzIHRvIHNhdmUgdmFsdWVzCi0gICAgICAgIGludGVybmFsU2F2ZVdpZGdldFZhbHVlcygpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjb3JkcyBhIGNvbnRhaW5lcidzIHJlY3Vyc2l2ZSBmaWxlIGRlc2NlbmRlbnRzIHdoaWNoIGhhdmUgYW4gZXh0ZW5zaW9uCi0gICAgICogdGhhdCBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIGV4cG9ydCBieSB0aGUgdXNlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcGFyZW50IGNvbnRhaW5lcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdEFwcHJvcHJpYXRlRm9sZGVyQ29udGVudHMoSUNvbnRhaW5lciByZXNvdXJjZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVJlc291cmNlW10gbWVtYmVycyA9IHJlc291cmNlLm1lbWJlcnMoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWJlcnNbaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICAgICAgICAgIElGaWxlIGN1cnJlbnRGaWxlID0gKElGaWxlKSBtZW1iZXJzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRXhwb3J0YWJsZUV4dGVuc2lvbihjdXJyZW50RmlsZS5nZXRGdWxsUGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZXMuYWRkKGN1cnJlbnRGaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWJlcnNbaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0QXBwcm9wcmlhdGVGb2xkZXJDb250ZW50cygoSUNvbnRhaW5lcikgbWVtYmVyc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vZG9uJ3Qgc2hvdyBjaGlsZHJlbiBpZiB0aGVyZSBhcmUgZXJyb3JzIC0tIHNob3VsZCBhdCBsZWFzdCBsb2cgdGhpcwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjb3JkcyBhIHJlc291cmNlJ3MgcmVjdXJzaXZlIGRlc2NlbmRlbnRzIHdoaWNoIGFyZSBhcHByb3ByaWF0ZQotICAgICAqIGZvciBleHBvcnQgYmFzZWQgdXBvbiB0aGlzIHBhZ2UncyBjdXJyZW50IGNvbnRyb2xzIGNvbnRlbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlIHRoZSBwYXJlbnQgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RBcHByb3ByaWF0ZVJlc291cmNlcyhPYmplY3QgcmVzb3VyY2UpIHsKLSAgICAgICAgaWYgKHNlbGVjdGVkUmVzb3VyY2VzID09IG51bGwpIHsKLQotICAgICAgICAgICAgaWYgKGV4cG9ydFNwZWNpZmllZFR5cGVzUmFkaW8uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlcyA9IGdldFR5cGVzVG9FeHBvcnQoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGVzID0gbnVsbDsgLy8gc2VudGluZWwgZm9yIHNlbGVjdCBhbGwgZXh0ZW5zaW9ucwotCi0gICAgICAgICAgICBzZWxlY3RlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSB7Ci0gICAgICAgICAgICAgICAgSVByb2plY3RbXSBwcm9qZWN0cyA9ICgoSVdvcmtzcGFjZVJvb3QpIHJlc291cmNlKS5nZXRQcm9qZWN0cygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0QXBwcm9wcmlhdGVGb2xkZXJDb250ZW50cyhwcm9qZWN0c1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc0V4cG9ydGFibGVFeHRlbnNpb24oZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKQotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJlc291cmNlcy5hZGQoZmlsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNlbGVjdEFwcHJvcHJpYXRlRm9sZGVyQ29udGVudHMoKElDb250YWluZXIpIHJlc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNlbGVjdGlvbiB2YWx1ZSBvZiB0aGlzIHBhZ2UncyAiRXhwb3J0IGFsbCB0eXBlcyIgcmFkaW8sIG9yIHN0b3JlcwotICAgICAqIGl0IGZvciBmdXR1cmUgdXNlIGlmIHRoaXMgdmlzdWFsIGNvbXBvbmVudCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgbmV3IHNlbGVjdGlvbiB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4cG9ydEFsbFR5cGVzVmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBpZiAoZXhwb3J0QWxsVHlwZXNSYWRpbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0aWFsRXhwb3J0QWxsVHlwZXNWYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgZXhwb3J0QWxsUmVzb3VyY2VzUHJlU2V0ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV4cG9ydEFsbFR5cGVzUmFkaW8uc2V0U2VsZWN0aW9uKHZhbHVlKTsKLSAgICAgICAgICAgIGV4cG9ydFNwZWNpZmllZFR5cGVzUmFkaW8uc2V0U2VsZWN0aW9uKCF2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHBhZ2UncyBzb3VyY2UgcmVzb3VyY2UgZmllbGQsIG9yIHN0b3JlcwotICAgICAqIGl0IGZvciBmdXR1cmUgdXNlIGlmIHRoaXMgdmlzdWFsIGNvbXBvbmVudCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgbmV3IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VGaWVsZFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAocmVzb3VyY2VOYW1lRmllbGQgPT0gbnVsbCkKLSAgICAgICAgICAgIGluaXRpYWxFeHBvcnRGaWVsZFZhbHVlID0gdmFsdWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc291cmNlTmFtZUZpZWxkLnNldFRleHQodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcmVzb3VyY2Ugd2hvcyBuYW1lIHdlIHdpbGwgZGlzcGxheS4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXNvdXJjZVRvRGlzcGxheShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgc2V0UmVzb3VyY2VGaWVsZFZhbHVlKHJlc291cmNlLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBwYWdlJ3MgIlR5cGVzIHRvIGV4cG9ydCIgZmllbGQsIG9yIHN0b3JlcwotICAgICAqIGl0IGZvciBmdXR1cmUgdXNlIGlmIHRoaXMgdmlzdWFsIGNvbXBvbmVudCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgbmV3IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZXNGaWVsZFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAodHlwZXNUb0V4cG9ydEZpZWxkID09IG51bGwpCi0gICAgICAgICAgICBpbml0aWFsVHlwZXNGaWVsZFZhbHVlID0gdmFsdWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHR5cGVzVG9FeHBvcnRGaWVsZC5zZXRUZXh0KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHBhZ2UncyAiVHlwZXMgdG8gZXhwb3J0IiBmaWVsZCBiYXNlZCB1cG9uIHRoZQotICAgICAqIGNvbGxlY3Rpb24gb2YgZXh0ZW5zaW9ucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlU3RyaW5ncyB0aGUgY29sbGVjdGlvbiBvZiBleHRlbnNpb25zIHRvIHBvcHVsYXRlIHRoZSAiVHlwZXMgdG8KLSAgICAgKiAgIGV4cG9ydCIgZmllbGQgd2l0aCAoZWxlbWVudCB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFR5cGVzVG9FeHBvcnQoTGlzdCB0eXBlU3RyaW5ncykgewotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBJdGVyYXRvciB0eXBlc0VudW0gPSB0eXBlU3RyaW5ncy5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlICh0eXBlc0VudW0uaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHR5cGVzRW51bS5uZXh0KCkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChUWVBFX0RFTElNSVRFUik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgdHlwZXNUb0V4cG9ydEZpZWxkLnNldFRleHQocmVzdWx0LnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvcHVsYXRlcyB0aGUgcmVzb3VyY2UgbmFtZSBmaWVsZCBiYXNlZCB1cG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwQmFzZWRPbkluaXRpYWxTZWxlY3Rpb25zKCkgewotICAgICAgICBpZiAoaW5pdGlhbEV4cG9ydEZpZWxkVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYSBzb3VyY2UgcmVzb3VyY2UgaGFzIGJlZW4gcHJvZ3JhbWF0aWNhbGx5IHNwZWNpZmllZCwgd2hpY2ggb3ZlcnJpZGVzCi0gICAgICAgICAgICAvLyB0aGUgY3VycmVudCB3b3JrYmVuY2ggcmVzb3VyY2Ugc2VsZWN0aW9uCi0gICAgICAgICAgICBJUmVzb3VyY2Ugc3BlY2lmaWVkU291cmNlUmVzb3VyY2UgPSBnZXRTb3VyY2VSZXNvdXJjZSgpOwotICAgICAgICAgICAgaWYgKHNwZWNpZmllZFNvdXJjZVJlc291cmNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZFNvdXJjZVJlc291cmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBzZXR1cCBuZWVkZWQKLQotICAgICAgICBMaXN0IHNlbGVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gY3VycmVudFJlc291cmNlU2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UgPSAoSVJlc291cmNlKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAvLyBkbyBub3QgYWRkIGluYWNjZXNzaWJsZSBlbGVtZW50cwotICAgICAgICAgICAgaWYgKGN1cnJlbnRSZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25zLmFkZChjdXJyZW50UmVzb3VyY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlbGVjdGlvbnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOyAvLyBzZXR1cCBub3QgbmVlZGVkIGFueW1vcmUKLQotICAgICAgICBpbnQgc2VsZWN0ZWRSZXNvdXJjZUNvdW50ID0gc2VsZWN0aW9ucy5zaXplKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZFJlc291cmNlQ291bnQgPT0gMSkgewotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgc2VsZWN0aW9ucy5nZXQoMCk7Ci0gICAgICAgICAgICBzZXRSZXNvdXJjZVRvRGlzcGxheShyZXNvdXJjZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZWxlY3RlZFJlc291cmNlcyA9IHNlbGVjdGlvbnM7Ci0gICAgICAgICAgICBleHBvcnRBbGxUeXBlc1JhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgIGV4cG9ydFNwZWNpZmllZFR5cGVzUmFkaW8uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgIHJlc291cmNlTmFtZUZpZWxkLnNldFRleHQoQ1VSUkVOVF9TRUxFQ1RJT04pOwotICAgICAgICAgICAgZXhwb3J0Q3VycmVudFNlbGVjdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICBkaXNwbGF5UmVzb3VyY2VzU2VsZWN0ZWRDb3VudChzZWxlY3RlZFJlc291cmNlQ291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgZW5hYmxlbWVudHMgb2YgdGhpcyBwYWdlJ3MgY29udHJvbHMuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpIHsKLSAgICAgICAgaWYgKGV4cG9ydEN1cnJlbnRTZWxlY3Rpb24pCi0gICAgICAgICAgICByZXNvdXJjZURldGFpbHNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRTb3VyY2VSZXNvdXJjZSgpOwotICAgICAgICAgICAgcmVzb3VyY2VEZXRhaWxzQnV0dG9uLnNldEVuYWJsZWQocmVzb3VyY2UgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBleHBvcnRTcGVjaWZpZWRUeXBlc1JhZGlvLnNldEVuYWJsZWQoIWV4cG9ydEN1cnJlbnRTZWxlY3Rpb24pOwotICAgICAgICB0eXBlc1RvRXhwb3J0RmllbGQuc2V0RW5hYmxlZChleHBvcnRTcGVjaWZpZWRUeXBlc1JhZGlvLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgdHlwZXNUb0V4cG9ydEVkaXRCdXR0b24uc2V0RW5hYmxlZChleHBvcnRTcGVjaWZpZWRUeXBlc1JhZGlvCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpemFyZERhdGFUcmFuc2ZlclBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gdmFsaWRhdGVTb3VyY2VHcm91cCgpIHsKLSAgICAgICAgaWYgKGV4cG9ydEN1cnJlbnRTZWxlY3Rpb24pIC8vIGllLi0gbm8gbW9yZSBjaGVja2luZyBuZWVkZWQKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIFN0cmluZyBzb3VyY2VTdHJpbmcgPSByZXNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICAgIGlmIChzb3VyY2VTdHJpbmcuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFNvdXJjZVJlc291cmNlKCk7Ci0KLSAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRFeHBvcnRQYWdlX211c3RFeGlzdE1lc3NhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEV4cG9ydFBhZ2VfbXVzdEJlQWNjZXNzaWJsZU1lc3NhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZEV4cG9ydFJlc291cmNlc1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9XaXphcmRFeHBvcnRSZXNvdXJjZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MmJlM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZEV4cG9ydFJlc291cmNlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLkRpYWxvZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuUmVzb3VyY2VUcmVlQW5kTGlzdEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIEFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGEgdHlwaWNhbCBleHBvcnQgd2l6YXJkJ3MgbWFpbiBwYWdlLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBzdWJjbGFzcyB0aGlzIHBhZ2UgdG8gaW5oZXJpdCBpdHMgY29tbW9uIGRlc3RpbmF0aW9uIHJlc291cmNlCi0gKiBzZWxlY3Rpb24gZmFjaWxpdGllcy4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCAKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPmNyZWF0ZURlc3RpbmF0aW9uR3JvdXA8L2NvZGU+PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0gKiA8dWw+Ci0gKiAgIDxsaT48Y29kZT5hbGxvd05ld0NvbnRhaW5lck5hbWU8L2NvZGU+PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZAotICogPHVsPgotICogICA8bGk+PGNvZGU+aGFuZGxlRXZlbnQ8L2NvZGU+PC9saT4KLSAqICAgPGxpPjxjb2RlPmludGVybmFsU2F2ZVdpZGdldFZhbHVlczwvY29kZT48L2xpPgotICogICA8bGk+PGNvZGU+dXBkYXRlV2lkZ2V0RW5hYmxlbWVudHM8L2NvZGU+PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXaXphcmRFeHBvcnRSZXNvdXJjZXNQYWdlIGV4dGVuZHMgV2l6YXJkRGF0YVRyYW5zZmVyUGFnZSB7Ci0gICAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsUmVzb3VyY2VTZWxlY3Rpb247Ci0KLSAgICBwcml2YXRlIExpc3Qgc2VsZWN0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8vIHdpZGdldHMKLSAgICBwcml2YXRlIFJlc291cmNlVHJlZUFuZExpc3RHcm91cCByZXNvdXJjZUdyb3VwOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFTEVDVF9UWVBFU19USVRMRSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZFRyYW5zZmVyUGFnZV9zZWxlY3RUeXBlczsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTRUxFQ1RfQUxMX1RJVExFID0gSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkVHJhbnNmZXJQYWdlX3NlbGVjdEFsbDsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERVNFTEVDVF9BTExfVElUTEUgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRUcmFuc2ZlclBhZ2VfZGVzZWxlY3RBbGw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGV4cG9ydCB3aXphcmQgcGFnZS4gSWYgdGhlIGN1cnJlbnQgcmVzb3VyY2Ugc2VsZWN0aW9uIAotICAgICAqIGlzIG5vdCBlbXB0eSB0aGVuIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaW5pdGlhbCBjb2xsZWN0aW9uIG9mIHJlc291cmNlcwotICAgICAqIHNlbGVjdGVkIGZvciBleHBvcnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFnZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhZ2UKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHJlc291cmNlIHNlbGVjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBXaXphcmRFeHBvcnRSZXNvdXJjZXNQYWdlKFN0cmluZyBwYWdlTmFtZSwKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzdXBlcihwYWdlTmFtZSk7Ci0gICAgICAgIHRoaXMuaW5pdGlhbFJlc291cmNlU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5hZGRUb0hpZXJhcmNoeVRvQ2hlY2tlZFN0b3JlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPldpemFyZERhdGFUcmFuc2ZlclBhZ2U8L2NvZGU+IG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4gCi0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dOZXdDb250YWluZXJOYW1lKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBidXR0b24gd2l0aCB0aGUgZ2l2ZW4gaWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPkRpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kCi0gICAgICogY3JlYXRlcyBhIHN0YW5kYXJkIHB1c2ggYnV0dG9uLCByZWdpc3RlcnMgZm9yIHNlbGVjdGlvbiBldmVudHMKLSAgICAgKiBpbmNsdWRpbmcgYnV0dG9uIHByZXNzZXMgYW5kIHJlZ2lzdGVycwotICAgICAqIGRlZmF1bHQgYnV0dG9ucyB3aXRoIGl0cyBzaGVsbC4KLSAgICAgKiBUaGUgYnV0dG9uIGlkIGlzIHN0b3JlZCBhcyB0aGUgYnV0dG9ucyBjbGllbnQgZGF0YS4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHBhcmVudCdzIGxheW91dCBpcyBhc3N1bWVkIHRvIGJlIGEgR3JpZExheW91dCBhbmQgCi0gICAgICogdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoaXMgbGF5b3V0IGlzIGluY3JlbWVudGVkLgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoZSBidXR0b24gKHNlZQotICAgICAqICA8Y29kZT5JRGlhbG9nQ29uc3RhbnRzLipfSUQ8L2NvZGU+IGNvbnN0YW50cyAKLSAgICAgKiAgZm9yIHN0YW5kYXJkIGRpYWxvZyBidXR0b24gaWRzKQotICAgICAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwgZnJvbSB0aGUgYnV0dG9uCi0gICAgICogQHBhcmFtIGRlZmF1bHRCdXR0b24gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGJ1dHRvbiBpcyB0byBiZSB0aGUKLSAgICAgKiAgIGRlZmF1bHQgYnV0dG9uLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBpZCwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0QnV0dG9uKSB7Ci0gICAgICAgIC8vIGluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGJ1dHRvbiBiYXIKLSAgICAgICAgKChHcmlkTGF5b3V0KSBwYXJlbnQuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMrKzsKLQotICAgICAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQotICAgICAgICBHcmlkRGF0YSBidXR0b25EYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkRhdGEpOwotCi0gICAgICAgIGJ1dHRvbi5zZXREYXRhKG5ldyBJbnRlZ2VyKGlkKSk7Ci0gICAgICAgIGJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLSAgICAgICAgYnV0dG9uLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgaWYgKGRlZmF1bHRCdXR0b24pIHsKLSAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0gICAgICAgICAgICBpZiAoc2hlbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1dHRvbi5zZXRGb2N1cygpOwotICAgICAgICB9Ci0gICAgICAgIGJ1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBzZXRCdXR0b25MYXlvdXREYXRhKGJ1dHRvbik7Ci0gICAgICAgIHJldHVybiBidXR0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYnV0dG9ucyBmb3Igc2VsZWN0aW5nIHNwZWNpZmljIHR5cGVzIG9yIHNlbGVjdGluZyBhbGwgb3Igbm9uZSBvZiB0aGUKLSAgICAgKiBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlQnV0dG9uc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICBGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCi0gICAgICAgIC8vIHRvcCBsZXZlbCBncm91cAotICAgICAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgICAgIGxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgICAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMCi0gICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotICAgICAgICAvLyB0eXBlcyBlZGl0IGJ1dHRvbgotICAgICAgICBCdXR0b24gc2VsZWN0VHlwZXNCdXR0b24gPSBjcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0VMRUNUX1RZUEVTX0lELCBTRUxFQ1RfVFlQRVNfVElUTEUsIGZhbHNlKTsKLQotICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZVR5cGVzRWRpdEJ1dHRvblByZXNzZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgc2VsZWN0VHlwZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBzZWxlY3RUeXBlc0J1dHRvbi5zZXRGb250KGZvbnQpOwotICAgICAgICBzZXRCdXR0b25MYXlvdXREYXRhKHNlbGVjdFR5cGVzQnV0dG9uKTsKLQotICAgICAgICBCdXR0b24gc2VsZWN0QnV0dG9uID0gY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwKLSAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNFTEVDVF9BTExfSUQsIFNFTEVDVF9BTExfVElUTEUsIGZhbHNlKTsKLQotICAgICAgICBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHJlc291cmNlR3JvdXAuc2V0QWxsU2VsZWN0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgc2VsZWN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgc2VsZWN0QnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIHNldEJ1dHRvbkxheW91dERhdGEoc2VsZWN0QnV0dG9uKTsKLQotICAgICAgICBCdXR0b24gZGVzZWxlY3RCdXR0b24gPSBjcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuREVTRUxFQ1RfQUxMX0lELCBERVNFTEVDVF9BTExfVElUTEUsIGZhbHNlKTsKLQotICAgICAgICBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHJlc291cmNlR3JvdXAuc2V0QWxsU2VsZWN0aW9ucyhmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGRlc2VsZWN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgZGVzZWxlY3RCdXR0b24uc2V0Rm9udChmb250KTsKLSAgICAgICAgc2V0QnV0dG9uTGF5b3V0RGF0YShkZXNlbGVjdEJ1dHRvbik7Ci0KLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICBpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotICAgICAgICBjcmVhdGVSZXNvdXJjZXNHcm91cChjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVCdXR0b25zR3JvdXAoY29tcG9zaXRlKTsKLQotICAgICAgICBjcmVhdGVEZXN0aW5hdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgY3JlYXRlT3B0aW9uc0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgcmVzdG9yZVJlc291cmNlU3BlY2lmaWNhdGlvbldpZGdldFZhbHVlcygpOyAvLyBpZS4tIGxvY2FsCi0gICAgICAgIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKTsgLy8gaWUuLSBzdWJjbGFzcyBob29rCi0gICAgICAgIGlmIChpbml0aWFsUmVzb3VyY2VTZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHNldHVwQmFzZWRPbkluaXRpYWxTZWxlY3Rpb25zKCk7Ci0KLSAgICAgICAgdXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGRldGVybWluZVBhZ2VDb21wbGV0aW9uKCkpOwotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7CS8vIHNob3VsZCBub3QgaW5pdGlhbGx5IGhhdmUgZXJyb3IgbWVzc2FnZQotICAgICAgICAKLSAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGV4cG9ydCBkZXN0aW5hdGlvbiBzcGVjaWZpY2F0aW9uIHZpc3VhbCBjb21wb25lbnRzLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVEZXN0aW5hdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgY2hlY2tib3ggdHJlZSBhbmQgbGlzdCBmb3Igc2VsZWN0aW5nIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlUmVzb3VyY2VzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIC8vY3JlYXRlIHRoZSBpbnB1dCBlbGVtZW50LCB3aGljaCBoYXMgdGhlIHJvb3QgcmVzb3VyY2UKLSAgICAgICAgLy9hcyBpdHMgb25seSBjaGlsZAotICAgICAgICBMaXN0IGlucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQotICAgICAgICAgICAgICAgIC5nZXRQcm9qZWN0cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocHJvamVjdHNbaV0uaXNPcGVuKCkpCi0gICAgICAgICAgICAgICAgaW5wdXQuYWRkKHByb2plY3RzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMucmVzb3VyY2VHcm91cCA9IG5ldyBSZXNvdXJjZVRyZWVBbmRMaXN0R3JvdXAocGFyZW50LCBpbnB1dCwKLSAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZVByb3ZpZGVyKElSZXNvdXJjZS5GT0xERVIgfCBJUmVzb3VyY2UuUFJPSkVDVCksCi0gICAgICAgICAgICAgICAgV29ya2JlbmNoTGFiZWxQcm92aWRlci5nZXREZWNvcmF0aW5nV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLAotICAgICAgICAgICAgICAgIGdldFJlc291cmNlUHJvdmlkZXIoSVJlc291cmNlLkZJTEUpLCBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVjb3JhdGluZ1dvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgU1dULk5PTkUsCi0gICAgICAgICAgICAgICAgRGlhbG9nVXRpbC5pblJlZ3VsYXJGb250TW9kZShwYXJlbnQpKTsKLSAgICAgICAgCi0gICAgICAgIElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgdGhpcy5yZXNvdXJjZUdyb3VwLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIFdpemFyZERhdGFUcmFuc2ZlclBhZ2UuZ2V0RXJyb3JEaWFsb2dUaXRsZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvckRpYWxvZ1RpdGxlKCkgewotICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkRXhwb3J0UGFnZV9lcnJvckRpYWxvZ1RpdGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9ic29sZXRlIG1ldGhvZC4gVGhpcyB3YXMgaW1wbGVtZW50ZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGVuc3VyZUxvY2FsKCkKLSAgICAgKiBuZWVkZWQgdG8gYmUgY2FsbGVkIGJ1dCBpdCBkb2Vzbid0IHVzZSBpdCBhbnkgbG9uZ2VyLgotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQgT25seSByZXRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5zdXJlUmVzb3VyY2VzTG9jYWwoTGlzdCByZXNvdXJjZXMpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBzdWJjb2xsZWN0aW9uIGNvbnRhaW5pbmcgb25seSB0aG9zZSByZXNvdXJjZXMgd2hpY2ggYXJlIG5vdCAKLSAgICAgKiBsb2NhbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcmlnaW5hbExpc3QgdGhlIG9yaWdpbmFsIGxpc3Qgb2YgcmVzb3VyY2VzIChlbGVtZW50IHR5cGU6IAotICAgICAqICAgPGNvZGU+SVJlc291cmNlPC9jb2RlPikKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgbGlzdCBvZiBub24tbG9jYWwgcmVzb3VyY2VzIChlbGVtZW50IHR5cGU6IAotICAgICAqICAgPGNvZGU+SVJlc291cmNlPC9jb2RlPikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBleHRyYWN0Tm9uTG9jYWxSZXNvdXJjZXMoTGlzdCBvcmlnaW5hbExpc3QpIHsKLSAgICAgICAgVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3Iob3JpZ2luYWxMaXN0LnNpemUoKSk7Ci0gICAgICAgIEl0ZXJhdG9yIHJlc291cmNlc0VudW0gPSBvcmlnaW5hbExpc3QuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAocmVzb3VyY2VzRW51bS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UgPSAoSVJlc291cmNlKSByZXNvdXJjZXNFbnVtLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghY3VycmVudFJlc291cmNlLmlzTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8pKQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRFbGVtZW50KGN1cnJlbnRSZXNvdXJjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb250ZW50IHByb3ZpZGVyIGZvciA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+cyB0aGF0IHJldHVybnMgCi0gICAgICogb25seSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgdHlwZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElUcmVlQ29udGVudFByb3ZpZGVyIGdldFJlc291cmNlUHJvdmlkZXIoZmluYWwgaW50IHJlc291cmNlVHlwZSkgewotICAgICAgICByZXR1cm4gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VbXSBtZW1iZXJzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnMgPSAoKElDb250YWluZXIpIG8pLm1lbWJlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2p1c3QgcmV0dXJuIGFuIGVtcHR5IHNldCBvZiBjaGlsZHJlbgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvL2ZpbHRlciBvdXQgdGhlIGRlc2lyZWQgcmVzb3VyY2UgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9BbmQgdGhlIHRlc3QgYml0cyB3aXRoIHRoZSByZXNvdXJjZSB0eXBlcyB0byBzZWUgaWYgdGhleSBhcmUgd2hhdCB3ZSB3YW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1lbWJlcnNbaV0uZ2V0VHlwZSgpICYgcmVzb3VyY2VUeXBlKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChtZW1iZXJzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cy50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAvL2lucHV0IGVsZW1lbnQgY2FzZQotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgQXJyYXlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEFycmF5TGlzdCkgbykudG9BcnJheSgpOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHBhZ2UncyBjb2xsZWN0aW9uIG9mIGN1cnJlbnRseS1zcGVjaWZpZWQgcmVzb3VyY2VzIHRvIGJlIAotICAgICAqIGV4cG9ydGVkLiBUaGlzIGlzIHRoZSBwcmltYXJ5IHJlc291cmNlIHNlbGVjdGlvbiBmYWNpbGl0eSBhY2Nlc3NvciBmb3IgCi0gICAgICogc3ViY2xhc3Nlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcyBjdXJyZW50bHkgc2VsZWN0ZWQgCi0gICAgICogZm9yIGV4cG9ydCAoZWxlbWVudCB0eXBlOiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+KQotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldFNlbGVjdGVkUmVzb3VyY2VzKCkgewotICAgICAgICBJdGVyYXRvciByZXNvdXJjZXNUb0V4cG9ydEl0ZXJhdG9yID0gdGhpcwotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3RlZFJlc291cmNlc0l0ZXJhdG9yKCk7Ci0gICAgICAgIExpc3QgcmVzb3VyY2VzVG9FeHBvcnQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChyZXNvdXJjZXNUb0V4cG9ydEl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgIHJlc291cmNlc1RvRXhwb3J0LmFkZChyZXNvdXJjZXNUb0V4cG9ydEl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZXNUb0V4cG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgcGFnZSdzIGNvbGxlY3Rpb24gb2YgY3VycmVudGx5LXNwZWNpZmllZCByZXNvdXJjZXMgdG8gYmUgCi0gICAgICogZXhwb3J0ZWQuIFRoaXMgaXMgdGhlIHByaW1hcnkgcmVzb3VyY2Ugc2VsZWN0aW9uIGZhY2lsaXR5IGFjY2Vzc29yIGZvciAKLSAgICAgKiBzdWJjbGFzc2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcyBjdXJyZW50bHkgc2VsZWN0ZWQgCi0gICAgICogZm9yIGV4cG9ydCAoZWxlbWVudCB0eXBlOiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+KS4gVGhpcyB3aWxsIGluY2x1ZGUKLSAgICAgKiB3aGl0ZSBjaGVja2VkIGZvbGRlcnMgYW5kIGluZGl2aWR1YWxseSBjaGVja2VkIGZpbGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVyYXRvciBnZXRTZWxlY3RlZFJlc291cmNlc0l0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUdyb3VwLmdldEFsbENoZWNrZWRMaXN0SXRlbXMoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGV4dGVuc2lvbnMgY3VycmVudGx5IHNwZWNpZmllZCB0byBiZSBleHBvcnRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIGV4dGVuc2lvbnMgY3VycmVudGx5IHNwZWNpZmllZCB0byBiZSBleHBvcnRlZCAoZWxlbWVudCAKLSAgICAgKiAgIHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT4pCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0VHlwZXNUb0V4cG9ydCgpIHsKLQotICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgcGFnZSdzIGNvbGxlY3Rpb24gb2YgY3VycmVudGx5LXNwZWNpZmllZCByZXNvdXJjZXMgdG8gYmUgCi0gICAgICogZXhwb3J0ZWQuIFRoaXMgcmV0dXJucyBib3RoIGZvbGRlcnMgYW5kIGZpbGVzIC0gZm9yIGp1c3QgdGhlIGZpbGVzIHVzZQotICAgICAqIGdldFNlbGVjdGVkUmVzb3VyY2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIGN1cnJlbnRseSBzZWxlY3RlZCAKLSAgICAgKiBmb3IgZXhwb3J0IChlbGVtZW50IHR5cGU6IDxjb2RlPklSZXNvdXJjZTwvY29kZT4pCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0V2hpdGVDaGVja2VkUmVzb3VyY2VzKCkgewotCi0gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlR3JvdXAuZ2V0QWxsV2hpdGVDaGVja2VkSXRlbXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBRdWVyaWVzIHRoZSB1c2VyIGZvciB0aGUgdHlwZXMgb2YgcmVzb3VyY2VzIHRvIGJlIGV4cG9ydGVkIGFuZCBzZWxlY3RzCi0gICAgICogdGhlbSBpbiB0aGUgY2hlY2tib3ggZ3JvdXAuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlVHlwZXNFZGl0QnV0dG9uUHJlc3NlZCgpIHsKLSAgICAgICAgT2JqZWN0W10gbmV3U2VsZWN0ZWRUeXBlcyA9IHF1ZXJ5UmVzb3VyY2VUeXBlc1RvRXhwb3J0KCk7Ci0KLSAgICAgICAgaWYgKG5ld1NlbGVjdGVkVHlwZXMgIT0gbnVsbCkgeyAvLyBpZS4tIGRpZCBub3QgcHJlc3MgQ2FuY2VsCi0gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KG5ld1NlbGVjdGVkVHlwZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2VsZWN0ZWRUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUeXBlcy5hZGQobmV3U2VsZWN0ZWRUeXBlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXR1cFNlbGVjdGlvbnNCYXNlZE9uU2VsZWN0ZWRUeXBlcygpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGV4dGVuc2lvbiBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgbmFtZSBpcyBhbiBleHRlbnNpb24gdGhhdAotICAgICAqIGhhcyBiZWVuIHNwZWNpZmllZCBmb3IgZXhwb3J0IGJ5IHRoZSB1c2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlTmFtZSB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc291cmNlIG5hbWUgaXMgc3VpdGFibGUgZm9yIGV4cG9ydCBiYXNlZCAKLSAgICAgKiAgIHVwb24gaXRzIGV4dGVuc2lvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc0V4cG9ydGFibGVFeHRlbnNpb24oU3RyaW5nIHJlc291cmNlTmFtZSkgewotICAgICAgICBpZiAoc2VsZWN0ZWRUeXBlcyA9PSBudWxsKSAvLyBpZS4tIGFsbCBleHRlbnNpb25zIGFyZSBhY2NlcHRhYmxlCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBpbnQgc2VwYXJhdG9ySW5kZXggPSByZXNvdXJjZU5hbWUubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoc2VwYXJhdG9ySW5kZXggPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IHJlc291cmNlTmFtZS5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKTsKLQotICAgICAgICBJdGVyYXRvciBpdCA9IHNlbGVjdGVkVHlwZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGl0Lm5leHQoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyc2lzdHMgYWRkaXRpb25hbCBzZXR0aW5nIHRoYXQgYXJlIHRvIGJlIHJlc3RvcmVkIGluIHRoZSBuZXh0IGluc3RhbmNlIG9mCi0gICAgICogdGhpcyBwYWdlLgotICAgICAqIDxwPiAKLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkSW1wb3J0UGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcwotICAgICAqIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0byBwZXJzaXN0IGFkZGl0aW9uYWwgc2V0dGluZ3MuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGludGVybmFsU2F2ZVdpZGdldFZhbHVlcygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBRdWVyaWVzIHRoZSB1c2VyIGZvciB0aGUgcmVzb3VyY2UgdHlwZXMgdGhhdCBhcmUgdG8gYmUgZXhwb3J0ZWQgYW5kIHJldHVybnMKLSAgICAgKiB0aGVzZSB0eXBlcyBhcyBhbiBhcnJheS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIHR5cGVzIHNlbGVjdGVkIGZvciBleHBvcnQgKGVsZW1lbnQgdHlwZTogCi0gICAgICogICA8Y29kZT5TdHJpbmc8L2NvZGU+KSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHVzZXIgY2FuY2VsZWQgdGhlIAotICAgICAqICAgc2VsZWN0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdFtdIHF1ZXJ5UmVzb3VyY2VUeXBlc1RvRXhwb3J0KCkgewotCi0gICAgICAgIFR5cGVGaWx0ZXJpbmdEaWFsb2cgZGlhbG9nID0gbmV3IFR5cGVGaWx0ZXJpbmdEaWFsb2coZ2V0Q29udGFpbmVyKCkKLSAgICAgICAgICAgICAgICAuZ2V0U2hlbGwoKSwgZ2V0VHlwZXNUb0V4cG9ydCgpKTsKLQotICAgICAgICBkaWFsb2cub3BlbigpOwotCi0gICAgICAgIHJldHVybiBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZXMgcmVzb3VyY2Ugc3BlY2lmaWNhdGlvbiBjb250cm9sIHNldHRpbmdzIHRoYXQgd2VyZSBwZXJzaXN0ZWQKLSAgICAgKiBpbiB0aGUgcHJldmlvdXMgaW5zdGFuY2Ugb2YgdGhpcyBwYWdlLiBTdWJjbGFzc2VzIHdpc2hpbmcgdG8gcmVzdG9yZQotICAgICAqIHBlcnNpc3RlZCB2YWx1ZXMgZm9yIHRoZWlyIGNvbnRyb2xzIG1heSBleHRlbmQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVJlc291cmNlU3BlY2lmaWNhdGlvbldpZGdldFZhbHVlcygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJzaXN0cyByZXNvdXJjZSBzcGVjaWZpY2F0aW9uIGNvbnRyb2wgc2V0dGluZyB0aGF0IGFyZSB0byBiZSByZXN0b3JlZAotICAgICAqIGluIHRoZSBuZXh0IGluc3RhbmNlIG9mIHRoaXMgcGFnZS4gU3ViY2xhc3NlcyB3aXNoaW5nIHRvIHBlcnNpc3QgYWRkaXRpb25hbAotICAgICAqIHNldHRpbmcgZm9yIHRoZWlyIGNvbnRyb2xzIHNob3VsZCBleHRlbmQgaG9vayBtZXRob2QgCi0gICAgICogPGNvZGU+aW50ZXJuYWxTYXZlV2lkZ2V0VmFsdWVzPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlV2lkZ2V0VmFsdWVzKCkgewotCi0gICAgICAgIC8vIGFsbG93IHN1YmNsYXNzZXMgdG8gc2F2ZSB2YWx1ZXMKLSAgICAgICAgaW50ZXJuYWxTYXZlV2lkZ2V0VmFsdWVzKCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGluaXRpYWwgc2VsZWN0aW9ucyBpbiB0aGUgcmVzb3VyY2UgZ3JvdXAuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBCYXNlZE9uSW5pdGlhbFNlbGVjdGlvbnMoKSB7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSB0aGlzLmluaXRpYWxSZXNvdXJjZVNlbGVjdGlvbi5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgY3VycmVudFJlc291cmNlID0gKElSZXNvdXJjZSkgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZUdyb3VwLmluaXRpYWxDaGVja0xpc3RJdGVtKGN1cnJlbnRSZXNvdXJjZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZUdyb3VwLmluaXRpYWxDaGVja1RyZWVJdGVtKGN1cnJlbnRSZXNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHRyZWUgdG8gb25seSBzZWxlY3QgdGhvc2UgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgc2VsZWN0ZWQgdHlwZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTZWxlY3Rpb25zQmFzZWRPblNlbGVjdGVkVHlwZXMoKSB7Ci0KLSAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTWFwIHNlbGVjdGlvbk1hcCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgICAgICAgICAvL09ubHkgZ2V0IHRoZSB3aGl0ZSBzZWxlY3RlZCBvbmVzCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgcmVzb3VyY2VJdGVyYXRvciA9IHJlc291cmNlR3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBbGxXaGl0ZUNoZWNrZWRJdGVtcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHJlc291cmNlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vaGFuZGxlIHRoZSBmaWxlcyBoZXJlIC0gd2hpdGUgY2hlY2tlZCBjb250YWluZXJzIHJlcXVpcmUgcmVjdXJzaW9uCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHJlc291cmNlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRXhwb3J0YWJsZUV4dGVuc2lvbihyZXNvdXJjZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCByZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNvbnRhaW5lciBwYXJlbnQgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uTWFwLmNvbnRhaW5zS2V5KHBhcmVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTGlzdCA9IChMaXN0KSBzZWxlY3Rpb25NYXAuZ2V0KHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VMaXN0LmFkZChyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uTWFwLnB1dChwYXJlbnQsIHJlc291cmNlTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXBTZWxlY3Rpb25zQmFzZWRPblNlbGVjdGVkVHlwZXMoc2VsZWN0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSUNvbnRhaW5lcikgcmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNvdXJjZUdyb3VwLnVwZGF0ZVNlbGVjdGlvbnMoc2VsZWN0aW9uTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgcnVubmFibGUpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHVwIHRoZSBzZWxlY3Rpb24gdmFsdWVzIGZvciB0aGUgcmVzb3VyY2VzIGFuZCBwdXQgdGhlbSBpbiB0aGUgc2VsZWN0aW9uTWFwLgotICAgICAqIElmIGEgcmVzb3VyY2UgaXMgYSBmaWxlIHNlZSBpZiBpdCBtYXRjaGVzIG9uZSBvZiB0aGUgc2VsZWN0ZWQgZXh0ZW5zaW9ucy4gSWYgbm90Ci0gICAgICogdGhlbiBjaGVjayB0aGUgY2hpbGRyZW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU2VsZWN0aW9uc0Jhc2VkT25TZWxlY3RlZFR5cGVzKE1hcCBzZWxlY3Rpb25NYXAsCi0gICAgICAgICAgICBJQ29udGFpbmVyIHBhcmVudCkgewotCi0gICAgICAgIExpc3Qgc2VsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSVJlc291cmNlW10gcmVzb3VyY2VzOwotICAgICAgICBib29sZWFuIGhhc0ZpbGVzID0gZmFsc2U7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc291cmNlcyA9IHBhcmVudC5tZW1iZXJzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAvL0p1c3QgcmV0dXJuIGlmIHdlIGNhbid0IGdldCBhbnkgaW5mbwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLSAgICAgICAgICAgICAgICBpZiAoaGFzRXhwb3J0YWJsZUV4dGVuc2lvbihyZXNvdXJjZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc0ZpbGVzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9ucy5hZGQocmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0dXBTZWxlY3Rpb25zQmFzZWRPblNlbGVjdGVkVHlwZXMoc2VsZWN0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgKElDb250YWluZXIpIHJlc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vT25seSBhZGQgaXQgdG8gdGhlIGxpc3QgaWYgdGhlcmUgYXJlIGZpbGVzIGluIHRoaXMgZm9sZGVyCi0gICAgICAgIGlmIChoYXNGaWxlcykKLSAgICAgICAgICAgIHNlbGVjdGlvbk1hcC5wdXQocGFyZW50LCBzZWxlY3Rpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGFueSBlZGl0b3JzIHRoYXQgdGhlIHVzZXIgd2FudHMgdG8gc2F2ZSBiZWZvcmUgZXhwb3J0LgotICAgICAqIEByZXR1cm4gYm9vbGVhbiBpZiB0aGUgc2F2ZSB3YXMgc3VjY2Vzc2Z1bC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzYXZlRGlydHlFZGl0b3JzKCkgewotICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5zYXZlQWxsRWRpdG9ycygKLSAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgd2lkZ2V0cyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZCBieSBhIGNoYW5nZSBpbiB0aGUgZGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCkgewotCi0gICAgICAgIGJvb2xlYW4gcGFnZUNvbXBsZXRlID0gZGV0ZXJtaW5lUGFnZUNvbXBsZXRpb24oKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHBhZ2VDb21wbGV0ZSk7Ci0gICAgICAgIGlmIChwYWdlQ29tcGxldGUpCi0gICAgICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotICAgICAgICBzdXBlci51cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9XaXphcmRJbXBvcnRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvV2l6YXJkSW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzEyMTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9XaXphcmRJbXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGEgdHlwaWNhbCBpbXBvcnQgd2l6YXJkJ3MgbWFpbiBwYWdlLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBzdWJjbGFzcyB0aGlzIHBhZ2UgdG8gaW5oZXJpdCBpdHMgY29tbW9uIGRlc3RpbmF0aW9uIHJlc291cmNlCi0gKiBzZWxlY3Rpb24gZmFjaWxpdGllcy4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCAKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPmNyZWF0ZVNvdXJjZUdyb3VwPC9jb2RlPjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZQotICogPHVsPgotICogICA8bGk+PGNvZGU+YWxsb3dOZXdDb250YWluZXJOYW1lPC9jb2RlPjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG1heSBleHRlbmQKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPmhhbmRsZUV2ZW50PC9jb2RlPjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogQGRlcHJlY2F0ZWQgdXNlIFdpemFyZFJlc291cmNlSW1wb3J0UGFnZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2l6YXJkSW1wb3J0UGFnZSBleHRlbmRzIFdpemFyZERhdGFUcmFuc2ZlclBhZ2UgewotICAgIHByaXZhdGUgSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbjsKLQotICAgIC8vIGluaXRpYWwgdmFsdWUgc3RvcmVzCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5pdGlhbENvbnRhaW5lckZpZWxkVmFsdWU7Ci0KLSAgICAvLyB3aWRnZXRzCi0gICAgcHJpdmF0ZSBUZXh0IGNvbnRhaW5lck5hbWVGaWVsZDsKLQotICAgIHByaXZhdGUgQnV0dG9uIGNvbnRhaW5lckJyb3dzZUJ1dHRvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW1wb3J0IHdpemFyZCBwYWdlLiBJZiB0aGUgaW5pdGlhbCByZXNvdXJjZSBzZWxlY3Rpb24gCi0gICAgICogY29udGFpbnMgZXhhY3RseSBvbmUgY29udGFpbmVyIHJlc291cmNlIHRoZW4gaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0Ci0gICAgICogaW1wb3J0IGRlc3RpbmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhZ2UKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHJlc291cmNlIHNlbGVjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBXaXphcmRJbXBvcnRQYWdlKFN0cmluZyBuYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkKLSAgICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbiA9IChJUmVzb3VyY2UpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY3VycmVudFJlc291cmNlU2VsZWN0aW9uID0gbnVsbDsKLQotICAgICAgICBpZiAoY3VycmVudFJlc291cmNlU2VsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbiA9IGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbi5nZXRQYXJlbnQoKTsKLQotICAgICAgICAgICAgaWYgKCFjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uaXNBY2Nlc3NpYmxlKCkpCi0gICAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlU2VsZWN0aW9uID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPldpemFyZEltcG9ydFBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+V2l6YXJkRGF0YVRyYW5zZmVyUGFnZTwvY29kZT4gbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uIAotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGFsbG93TmV3Q29udGFpbmVyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRTaXplKGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQotICAgICAgICBjcmVhdGVTb3VyY2VHcm91cChjb21wb3NpdGUpOwotCi0gICAgICAgIGNyZWF0ZVNwYWNlcihjb21wb3NpdGUpOwotCi0gICAgICAgIGNyZWF0ZUJvbGRMYWJlbChjb21wb3NpdGUsIElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEltcG9ydFBhZ2VfZGVzdGluYXRpb25MYWJlbCk7Ci0gICAgICAgIGNyZWF0ZURlc3RpbmF0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQotICAgICAgICBjcmVhdGVTcGFjZXIoY29tcG9zaXRlKTsKLQotICAgICAgICBjcmVhdGVCb2xkTGFiZWwoY29tcG9zaXRlLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRJbXBvcnRQYWdlX29wdGlvbnMpOwotICAgICAgICBjcmVhdGVPcHRpb25zR3JvdXAoY29tcG9zaXRlKTsKLQotICAgICAgICByZXN0b3JlV2lkZ2V0VmFsdWVzKCk7Ci0gICAgICAgIHVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShkZXRlcm1pbmVQYWdlQ29tcGxldGlvbigpKTsKLQotICAgICAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgaW1wb3J0IGRlc3RpbmF0aW9uIHNwZWNpZmljYXRpb24gY29udHJvbHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNyZWF0ZURlc3RpbmF0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBjb250YWluZXIgc3BlY2lmaWNhdGlvbiBncm91cAotICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICAgICAgY29udGFpbmVyR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbnRhaW5lckdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotICAgICAgICAgICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIC8vIGNvbnRhaW5lciBsYWJlbAotICAgICAgICBMYWJlbCByZXNvdXJjZXNMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXJHcm91cCwgU1dULk5PTkUpOwotICAgICAgICByZXNvdXJjZXNMYWJlbC5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEltcG9ydFBhZ2VfZm9sZGVyKTsKLQotICAgICAgICAvLyBjb250YWluZXIgbmFtZSBlbnRyeSBmaWVsZAotICAgICAgICBjb250YWluZXJOYW1lRmllbGQgPSBuZXcgVGV4dChjb250YWluZXJHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBjb250YWluZXJOYW1lRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotICAgICAgICBjb250YWluZXJOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgICAvLyBjb250YWluZXIgYnJvd3NlIGJ1dHRvbgotICAgICAgICBjb250YWluZXJCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lckdyb3VwLCBTV1QuUFVTSCk7Ci0gICAgICAgIGNvbnRhaW5lckJyb3dzZUJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEltcG9ydFBhZ2VfYnJvd3NlTGFiZWwpOwotICAgICAgICBjb250YWluZXJCcm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgICAgIGNvbnRhaW5lckJyb3dzZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQotICAgICAgICBpbml0aWFsUG9wdWxhdGVDb250YWluZXJGaWVsZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGltcG9ydCBzb3VyY2Ugc3BlY2lmaWNhdGlvbiBjb250cm9scy4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlU291cmNlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5IGFuIGVycm9yIGRpYWxvZyB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGlzcGxheUVycm9yRGlhbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksIElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEltcG9ydFBhZ2VfZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgY29udGFpbmVyIHJlc291cmNlIHNwZWNpZmllZCBpbiB0aGUgY29udGFpbmVyCi0gICAgICogbmFtZSBlbnRyeSBmaWVsZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbmFtZSBoYXMgYmVlbiB0eXBlZCBpbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29udGFpbmVyIHNwZWNpZmllZCBieSB0aGUgZnVsbCBwYXRoIG1pZ2h0IG5vdCBleGlzdCBhbmQgd291bGQgbmVlZCB0bwotICAgICAqIGJlIGNyZWF0ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZnVsbCBwYXRoIG9mIHRoZSBjb250YWluZXIgcmVzb3VyY2Ugc3BlY2lmaWVkIGluCi0gICAgICogICB0aGUgY29udGFpbmVyIG5hbWUgZW50cnkgZmllbGQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIElQYXRoIGdldENvbnRhaW5lckZ1bGxQYXRoKCkgewotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXRQbHVnaW5Xb3Jrc3BhY2UoKTsKLQotICAgICAgICAvL21ha2UgdGhlIHBhdGggYWJzb2x1dGUgdG8gYWxsb3cgZm9yIG9wdGlvbmFsIGxlYWRpbmcgc2xhc2gKLSAgICAgICAgSVBhdGggdGVzdFBhdGggPSBnZXRSZXNvdXJjZVBhdGgoKTsKLQotICAgICAgICBJU3RhdHVzIHJlc3VsdCA9IHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgodGVzdFBhdGgudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UuUFJPSkVDVCB8IElSZXNvdXJjZS5GT0xERVIpOwotICAgICAgICBpZiAocmVzdWx0LmlzT0soKSkgewotICAgICAgICAgICAgcmV0dXJuIHRlc3RQYXRoOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBwYXRoIGZvciB0aGUgcmVzb3VyY2UgZmllbGQuCi0gICAgICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVBhdGggZ2V0UmVzb3VyY2VQYXRoKCkgewotICAgICAgICByZXR1cm4gZ2V0UGF0aEZyb21UZXh0KHRoaXMuY29udGFpbmVyTmFtZUZpZWxkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250YWluZXIgcmVzb3VyY2Ugc3BlY2lmaWVkIGluIHRoZSBjb250YWluZXIgbmFtZSBlbnRyeSBmaWVsZCwKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBzdWNoIGEgY29udGFpbmVyIGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYmVuY2guCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250YWluZXIgcmVzb3VyY2Ugc3BlY2lmaWVkIGluIHRoZSBjb250YWluZXIgbmFtZSBlbnRyeSBmaWVsZCwKLSAgICAgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIElDb250YWluZXIgZ2V0U3BlY2lmaWVkQ29udGFpbmVyKCkgewotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXRQbHVnaW5Xb3Jrc3BhY2UoKTsKLSAgICAgICAgSVBhdGggcGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0gICAgICAgIGlmICh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmV4aXN0cyhwYXRoKSkKLSAgICAgICAgICAgIHJldHVybiAoSUNvbnRhaW5lcikgd29ya3NwYWNlLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOwotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIGEgY29udGFpbmVyIHNlbGVjdGlvbiBkaWFsb2cgYW5kIGRpc3BsYXlzIHRoZSB1c2VyJ3Mgc3Vic2VxdWVudAotICAgICAqIGNvbnRhaW5lciByZXNvdXJjZSBzZWxlY3Rpb24gaW4gdGhpcyBwYWdlJ3MgY29udGFpbmVyIG5hbWUgZmllbGQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ29udGFpbmVyQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLSAgICAgICAgLy8gc2VlIGlmIHRoZSB1c2VyIHdpc2hlcyB0byBtb2RpZnkgdGhpcyBjb250YWluZXIgc2VsZWN0aW9uCi0gICAgICAgIElQYXRoIGNvbnRhaW5lclBhdGggPSBxdWVyeUZvckNvbnRhaW5lcihnZXRTcGVjaWZpZWRDb250YWluZXIoKSwKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRJbXBvcnRQYWdlX3NlbGVjdEZvbGRlckxhYmVsKTsKLQotICAgICAgICAvLyBpZiBhIGNvbnRhaW5lciB3YXMgc2VsZWN0ZWQgdGhlbiBwdXQgaXRzIG5hbWUgaW4gdGhlIGNvbnRhaW5lciBuYW1lIGZpZWxkCi0gICAgICAgIGlmIChjb250YWluZXJQYXRoICE9IG51bGwpIC8vIG51bGwgbWVhbnMgdXNlciBjYW5jZWxsZWQKLSAgICAgICAgICAgIGNvbnRhaW5lck5hbWVGaWVsZC5zZXRUZXh0KGNvbnRhaW5lclBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPldpemFyZEltcG9ydFBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+TGlzdGVuZXI8L2NvZGU+IG1ldGhvZCBoYW5kbGVzIGFsbCBldmVudHMgYW5kIGVuYWJsZW1lbnRzIGZvciBjb250cm9scwotICAgICAqIG9uIHRoaXMgcGFnZS4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFdpZGdldCBzb3VyY2UgPSBldmVudC53aWRnZXQ7Ci0KLSAgICAgICAgaWYgKHNvdXJjZSA9PSBjb250YWluZXJCcm93c2VCdXR0b24pCi0gICAgICAgICAgICBoYW5kbGVDb250YWluZXJCcm93c2VCdXR0b25QcmVzc2VkKCk7Ci0KLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGRldGVybWluZVBhZ2VDb21wbGV0aW9uKCkpOwotICAgICAgICB1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGluaXRpYWwgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lciBuYW1lIGZpZWxkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lckZpZWxkKCkgewotICAgICAgICBpZiAoaW5pdGlhbENvbnRhaW5lckZpZWxkVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIGNvbnRhaW5lck5hbWVGaWVsZC5zZXRUZXh0KGluaXRpYWxDb250YWluZXJGaWVsZFZhbHVlKTsKLSAgICAgICAgZWxzZSBpZiAoY3VycmVudFJlc291cmNlU2VsZWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBjb250YWluZXJOYW1lRmllbGQuc2V0VGV4dChjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uZ2V0RnVsbFBhdGgoKQotICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBwYWdlJ3MgY29udGFpbmVyIHJlc291cmNlIGZpZWxkLCBvciBzdG9yZXMKLSAgICAgKiBpdCBmb3IgZnV0dXJlIHVzZSBpZiB0aGlzIHBhZ2UncyBjb250cm9scyBkbyBub3QgZXhpc3QgeWV0LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIG5ldyB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lckZpZWxkVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChjb250YWluZXJOYW1lRmllbGQgPT0gbnVsbCkKLSAgICAgICAgICAgIGluaXRpYWxDb250YWluZXJGaWVsZFZhbHVlID0gdmFsdWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRhaW5lck5hbWVGaWVsZC5zZXRUZXh0KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpemFyZERhdGFUcmFuc2ZlclBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gdmFsaWRhdGVEZXN0aW5hdGlvbkdyb3VwKCkgewotICAgICAgICBpZiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vIElmIHRoZSBjb250YWluZXIgZXhpc3QsIHZhbGlkYXRlIGl0Ci0gICAgICAgIElDb250YWluZXIgY29udGFpbmVyID0gZ2V0U3BlY2lmaWVkQ29udGFpbmVyKCk7Ci0gICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFjb250YWluZXIuaXNBY2Nlc3NpYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkSW1wb3J0UGFnZV9mb2xkZXJNdXN0RXhpc3QpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZTk3MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLkNyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1pc2MuUmVzb3VyY2VBbmRDb250YWluZXJHcm91cDsKLQotLyoqCi0gKiBTdGFuZGFyZCBtYWluIHBhZ2UgZm9yIGEgd2l6YXJkIHRoYXQgY3JlYXRlcyBhIGZpbGUgcmVzb3VyY2UuCi0gKiA8cD4KLSAqIFRoaXMgcGFnZSBtYXkgYmUgdXNlZCBieSBjbGllbnRzIGFzLWlzOyBpdCBtYXkgYmUgYWxzbyBiZSBzdWJjbGFzc2VkIHRvIHN1aXQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0gKiA8dWw+Ci0gKiAgIDxsaT48Y29kZT5nZXRJbml0aWFsQ29udGVudHM8L2NvZGU+PC9saT4KLSAqICAgPGxpPjxjb2RlPmdldE5ld0ZpbGVMYWJlbDwvY29kZT48L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kCi0gKiA8dWw+Ci0gKiAgIDxsaT48Y29kZT5oYW5kbGVFdmVudDwvY29kZT48L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfQ09OVEFJTkVSX0dST1VQX0hFSUdIVCA9IDI1MDsKLQotICAgIC8vIHRoZSBjdXJyZW50IHJlc291cmNlIHNlbGVjdGlvbgotICAgIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQotICAgIC8vIGNhY2hlIG9mIG5ld2x5LWNyZWF0ZWQgZmlsZQotICAgIHByaXZhdGUgSUZpbGUgbmV3RmlsZTsKLQotICAgIHByaXZhdGUgSVBhdGggbGlua1RhcmdldFBhdGg7Ci0KLSAgICAvLyB3aWRnZXRzCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUFuZENvbnRhaW5lckdyb3VwIHJlc291cmNlR3JvdXA7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBhZHZhbmNlZEJ1dHRvbjsKLQotICAgIHByaXZhdGUgQ3JlYXRlTGlua2VkUmVzb3VyY2VHcm91cCBsaW5rZWRSZXNvdXJjZUdyb3VwOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbGlua2VkUmVzb3VyY2VQYXJlbnQ7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBsaW5rZWRSZXNvdXJjZUNvbXBvc2l0ZTsKLQotICAgIC8vIGluaXRpYWwgdmFsdWUgc3RvcmVzCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5pdGlhbEZpbGVOYW1lOwotCi0gICAgcHJpdmF0ZSBJUGF0aCBpbml0aWFsQ29udGFpbmVyRnVsbFBhdGg7Ci0KLSAgICAvKioKLSAgICAgKiBIZWlnaHQgb2YgdGhlICJhZHZhbmNlZCIgbGlua2VkIHJlc291cmNlIGdyb3VwLiBTZXQgd2hlbiB0aGUKLSAgICAgKiBhZHZhbmNlZCBncm91cCBpcyBmaXJzdCBtYWRlIHZpc2libGUuIAotICAgICAqLwotICAgIHByaXZhdGUgaW50IGxpbmtlZFJlc291cmNlR3JvdXBIZWlnaHQgPSAtMTsKLQotICAgIC8qKgotICAgICAqIEZpcnN0IHRpbWUgdGhlIGFkdmFuY2VkIGdyb3VwIGlzIHZhbGlkYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RMaW5rQ2hlY2sgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmaWxlIGNyZWF0aW9uIHdpemFyZCBwYWdlLiBJZiB0aGUgaW5pdGlhbCByZXNvdXJjZSBzZWxlY3Rpb24gCi0gICAgICogY29udGFpbnMgZXhhY3RseSBvbmUgY29udGFpbmVyIHJlc291cmNlIHRoZW4gaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0Ci0gICAgICogY29udGFpbmVyIHJlc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhZ2VOYW1lIHRoZSBuYW1lIG9mIHRoZSBwYWdlCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgY3VycmVudCByZXNvdXJjZSBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgd2lkZ2V0IGZvciBhZHZhbmNlZCBvcHRpb25zLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWR2YW5jZWRDb250cm9scyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpCi0gICAgICAgICAgICAgICAgLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLSAgICAgICAgaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oUmVzb3VyY2VzUGx1Z2luLlBSRUZfRElTQUJMRV9MSU5LSU5HKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgbGlua2VkUmVzb3VyY2VQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICAgICAgbGlua2VkUmVzb3VyY2VQYXJlbnQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgICAgIGxpbmtlZFJlc291cmNlUGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotICAgICAgICAgICAgICAgICAgICBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgICAgIGxpbmtlZFJlc291cmNlUGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgICAgICBhZHZhbmNlZEJ1dHRvbiA9IG5ldyBCdXR0b24obGlua2VkUmVzb3VyY2VQYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgIGFkdmFuY2VkQnV0dG9uLnNldEZvbnQobGlua2VkUmVzb3VyY2VQYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgICAgIGFkdmFuY2VkQnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuc2hvd0FkdmFuY2VkKTsKLSAgICAgICAgICAgIEdyaWREYXRhIGRhdGEgPSBzZXRCdXR0b25MYXlvdXREYXRhKGFkdmFuY2VkQnV0dG9uKTsKLSAgICAgICAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLSAgICAgICAgICAgIGFkdmFuY2VkQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgICAgICBhZHZhbmNlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUFkdmFuY2VkQnV0dG9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgbGlua2VkUmVzb3VyY2VHcm91cCA9IG5ldyBDcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwKElSZXNvdXJjZS5GSUxFLAotICAgICAgICAgICAgICAgIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0TGlua0NoZWNrID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIG5ldyBDcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwLklTdHJpbmdWYWx1ZSgpewotCQkJCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCQkJCQlyZXNvdXJjZUdyb3VwLnNldFJlc291cmNlKHN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQkJCXJldHVybiByZXNvdXJjZUdyb3VwLmdldFJlc291cmNlKCk7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0gICAgICAgIC8vIHRvcCBsZXZlbCBncm91cAotICAgICAgICBDb21wb3NpdGUgdG9wTGV2ZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICB0b3BMZXZlbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIHRvcExldmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgICAgICB0b3BMZXZlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRvcExldmVsLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5ORVdfRklMRV9XSVpBUkRfUEFHRSk7Ci0KLSAgICAgICAgLy8gcmVzb3VyY2UgYW5kIGNvbnRhaW5lciBncm91cAotICAgICAgICByZXNvdXJjZUdyb3VwID0gbmV3IFJlc291cmNlQW5kQ29udGFpbmVyR3JvdXAoCi0gICAgICAgICAgICAgICAgdG9wTGV2ZWwsCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBnZXROZXdGaWxlTGFiZWwoKSwKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlX2ZpbGUsIGZhbHNlLCBTSVpJTkdfQ09OVEFJTkVSX0dST1VQX0hFSUdIVCk7Ci0gICAgICAgIHJlc291cmNlR3JvdXAuc2V0QWxsb3dFeGlzdGluZ1Jlc291cmNlcyhmYWxzZSk7Ci0gICAgICAgIGluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lck5hbWVGaWVsZCgpOwotICAgICAgICBjcmVhdGVBZHZhbmNlZENvbnRyb2xzKHRvcExldmVsKTsKLSAgICAgICAgaWYgKGluaXRpYWxGaWxlTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgcmVzb3VyY2VHcm91cC5zZXRSZXNvdXJjZShpbml0aWFsRmlsZU5hbWUpOwotICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICAgICAgLy8gU2hvdyBkZXNjcmlwdGlvbiBvbiBvcGVuaW5nCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgc2V0TWVzc2FnZShudWxsKTsKLSAgICAgICAgc2V0Q29udHJvbCh0b3BMZXZlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGZpbGUgcmVzb3VyY2UgZ2l2ZW4gdGhlIGZpbGUgaGFuZGxlIGFuZCBjb250ZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlSGFuZGxlIHRoZSBmaWxlIGhhbmRsZSB0byBjcmVhdGUgYSBmaWxlIHJlc291cmNlIHdpdGgKLSAgICAgKiBAcGFyYW0gY29udGVudHMgdGhlIGluaXRpYWwgY29udGVudHMgb2YgdGhlIG5ldyBmaWxlIHJlc291cmNlLCBvcgotICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSAoZXF1aXZhbGVudCB0byBhbiBlbXB0eSBzdHJlYW0pCi0gICAgICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gc2hvdyB2aXN1YWwgcHJvZ3Jlc3Mgd2l0aAotICAgICAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzCi0gICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIGNhbmNlbGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsZShJRmlsZSBmaWxlSGFuZGxlLCBJbnB1dFN0cmVhbSBjb250ZW50cywKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAoY29udGVudHMgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbnRlbnRzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGZpbGUgcmVzb3VyY2UgaW4gdGhlIHdvcmtzcGFjZQotICAgICAgICAgICAgaWYgKGxpbmtUYXJnZXRQYXRoICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZmlsZUhhbmRsZS5jcmVhdGVMaW5rKGxpbmtUYXJnZXRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkFMTE9XX01JU1NJTkdfTE9DQUwsIG1vbml0b3IpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgSVBhdGggcGF0aCA9IGZpbGVIYW5kbGUuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgICAgICAgICBpbnQgbnVtU2VnbWVudHM9IHBhdGguc2VnbWVudENvdW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bVNlZ21lbnRzID4gMiAmJiAhcm9vdC5nZXRGb2xkZXIocGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkaXJlY3QgcGFyZW50IG9mIHRoZSBwYXRoIGRvZXNuJ3QgZXhpc3QsIHRyeSB0byBjcmVhdGUgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIG5lY2Vzc2FyeSBkaXJlY3Rvcmllcy4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0gbnVtU2VnbWVudHMgLSAyOyBpID4gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIGZvbGRlciA9IHJvb3QuZ2V0Rm9sZGVyKHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlsZUhhbmRsZS5jcmVhdGUoY29udGVudHMsIGZhbHNlLCBtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0ZWQgbG9jYWxseSwganVzdCByZWZyZXNoIHRvIGdldCBjb250ZW50cwotICAgICAgICAgICAgaWYgKGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5QQVRIX09DQ1VQSUVEKQotICAgICAgICAgICAgICAgIGZpbGVIYW5kbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGZpbGUgcmVzb3VyY2UgaGFuZGxlIGZvciB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiB3b3Jrc3BhY2UgcGF0aC4KLSAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjcmVhdGUgdGhlIGZpbGUgcmVzb3VyY2U7IHRoaXMgaXMgdGhlIHJlc3BvbnNpYmlsaXR5Ci0gICAgICogb2YgPGNvZGU+Y3JlYXRlRmlsZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZVBhdGggdGhlIHBhdGggb2YgdGhlIGZpbGUgcmVzb3VyY2UgdG8gY3JlYXRlIGEgaGFuZGxlIGZvcgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBmaWxlIHJlc291cmNlIGhhbmRsZQotICAgICAqIEBzZWUgI2NyZWF0ZUZpbGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSUZpbGUgY3JlYXRlRmlsZUhhbmRsZShJUGF0aCBmaWxlUGF0aCkgewotICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoUGx1Z2luLmdldFBsdWdpbldvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKAotICAgICAgICAgICAgICAgIGZpbGVQYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBsaW5rIHRhcmdldCBwYXRoIGlmIGEgbGluayB0YXJnZXQgaGFzIGJlZW4gc3BlY2lmaWVkLiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaW5rVGFyZ2V0KCkgewotICAgICAgICBTdHJpbmcgbGlua1RhcmdldCA9IGxpbmtlZFJlc291cmNlR3JvdXAuZ2V0TGlua1RhcmdldCgpOwotICAgICAgICBpZiAobGlua1RhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rVGFyZ2V0UGF0aCA9IG5ldyBQYXRoKGxpbmtUYXJnZXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGlua1RhcmdldFBhdGggPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmaWxlIHJlc291cmNlIGluIHRoZSBzZWxlY3RlZCBjb250YWluZXIgYW5kIHdpdGggdGhlIHNlbGVjdGVkCi0gICAgICogbmFtZS4gQ3JlYXRlcyBhbnkgbWlzc2luZyByZXNvdXJjZSBjb250YWluZXJzIGFsb25nIHRoZSBwYXRoOyBkb2VzIG5vdGhpbmcgaWYKLSAgICAgKiB0aGUgY29udGFpbmVyIHJlc291cmNlcyBhbHJlYWR5IGV4aXN0LgotICAgICAqIDxwPgotICAgICAqIEluIG5vcm1hbCB1c2FnZSwgdGhpcyBtZXRob2QgaXMgaW52b2tlZCBhZnRlciB0aGUgdXNlciBoYXMgcHJlc3NlZCBGaW5pc2ggb24KLSAgICAgKiB0aGUgd2l6YXJkOyB0aGUgZW5hYmxlbWVudCBvZiB0aGUgRmluaXNoIGJ1dHRvbiBpbXBsaWVzIHRoYXQgYWxsIGNvbnRyb2xzIG9uIAotICAgICAqIG9uIHRoaXMgcGFnZSBjdXJyZW50bHkgY29udGFpbiB2YWxpZCB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGlzIHBhZ2UgY2FjaGVzIHRoZSBuZXcgZmlsZSBvbmNlIGl0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQotICAgICAqIGNyZWF0ZWQ7IHN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YgdGhpcyBtZXRob2Qgd2lsbCBhbnN3ZXIgdGhlIHNhbWUKLSAgICAgKiBmaWxlIHJlc291cmNlIHdpdGhvdXQgYXR0ZW1wdGluZyB0byBjcmVhdGUgaXQgYWdhaW4uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UKLSAgICAgKiBpdCBjcmVhdGVzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGZpbGUgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBmaWxlCi0gICAgICogICAgd2FzIG5vdCBjcmVhdGVkCi0gICAgICovCi0gICAgcHVibGljIElGaWxlIGNyZWF0ZU5ld0ZpbGUoKSB7Ci0gICAgICAgIGlmIChuZXdGaWxlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV3RmlsZTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIG5ldyBmaWxlIGFuZCBjYWNoZSBpdCBpZiBzdWNjZXNzZnVsCi0KLSAgICAgICAgZmluYWwgSVBhdGggY29udGFpbmVyUGF0aCA9IHJlc291cmNlR3JvdXAuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLSAgICAgICAgSVBhdGggbmV3RmlsZVBhdGggPSBjb250YWluZXJQYXRoLmFwcGVuZChyZXNvdXJjZUdyb3VwLmdldFJlc291cmNlKCkpOwotICAgICAgICBmaW5hbCBJRmlsZSBuZXdGaWxlSGFuZGxlID0gY3JlYXRlRmlsZUhhbmRsZShuZXdGaWxlUGF0aCk7Ci0gICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGluaXRpYWxDb250ZW50cyA9IGdldEluaXRpYWxDb250ZW50cygpOwotCi0gICAgICAgIGNyZWF0ZUxpbmtUYXJnZXQoKTsKLSAgICAgICAgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihjcmVhdGVSdWxlKG5ld0ZpbGVIYW5kbGUpKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2VfcHJvZ3Jlc3MsIDIwMDApOwotICAgICAgICAgICAgICAgICAgICBDb250YWluZXJHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvbnRhaW5lckdlbmVyYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlQ29udGFpbmVyKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZpbGUobmV3RmlsZUhhbmRsZSwgaW5pdGlhbENvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgRXJyb3JEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksIC8vIFdhcyBVdGlsaXRpZXMuZ2V0Rm9jdXNTaGVsbCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2VfZXJyb3JUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gbm8gc3BlY2lhbCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ29yZUV4Y2VwdGlvbikgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBDb3JlRXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBhYm92ZSwgYnV0IHVuZXhwZWN0ZWQgcnVudGltZSBleGNlcHRpb25zIGFuZCBlcnJvcnMgbWF5IHN0aWxsIG9jY3VyLgotICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5sb2coZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVOZXdGaWxlKCkiLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2VfaW50ZXJuYWxFcnJvclRpdGxlLCBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlX2ludGVybmFsRXJyb3JNZXNzYWdlLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBuZXdGaWxlID0gbmV3RmlsZUhhbmRsZTsKLQotICAgICAgICByZXR1cm4gbmV3RmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzY2hlZHVsaW5nIHJ1bGUgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIHJlc291cmNlIGF0Ci0gICAgICogdGhlIGdpdmVuIGNvbnRhaW5lciBwYXRoLiBUaGUgcnVsZSBzaG91bGQgYmUgdGhlIGNyZWF0aW9uIHJ1bGUgZm9yCi0gICAgICogdGhlIHRvcC1tb3N0IG5vbi1leGlzdGluZyBwYXJlbnQuCi0gICAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSBiZWluZyBjcmVhdGVkCi0gICAgICogQHJldHVybiBUaGUgc2NoZWR1bGluZyBydWxlIGZvciBjcmVhdGluZyB0aGUgZ2l2ZW4gcmVzb3VyY2UKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBjcmVhdGVSdWxlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJUmVzb3VyY2UgcGFyZW50ID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0gICAgCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotICAgIAkJaWYgKHBhcmVudC5leGlzdHMoKSkKLSAgICAJCQlyZXR1cm4gcmVzb3VyY2UuZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5jcmVhdGVSdWxlKHJlc291cmNlKTsKLSAgICAJCXJlc291cmNlID0gcGFyZW50OwotICAgIAkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotICAgIAl9Ci0JCXJldHVybiByZXNvdXJjZS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JfQotCi0JLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBmdWxsIHBhdGggb2YgdGhlIGNvbnRhaW5pbmcgcmVzb3VyY2UgYXMgZW50ZXJlZCBvciAKLSAgICAgKiBzZWxlY3RlZCBieSB0aGUgdXNlciwgb3IgaXRzIGFudGljaXBhdGVkIGluaXRpYWwgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250YWluZXIncyBmdWxsIHBhdGgsIGFudGljaXBhdGVkIGluaXRpYWwgdmFsdWUsIAotICAgICAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGF0aCBpcyBrbm93bgotICAgICAqLwotICAgIHB1YmxpYyBJUGF0aCBnZXRDb250YWluZXJGdWxsUGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlR3JvdXAuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGZpbGUgbmFtZSBhcyBlbnRlcmVkIGJ5IHRoZSB1c2VyLCBvciBpdHMgYW50aWNpcGF0ZWQKLSAgICAgKiBpbml0aWFsIHZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZmlsZSBuYW1lLCBpdHMgYW50aWNpcGF0ZWQgaW5pdGlhbCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAgIGlmIG5vIGZpbGUgbmFtZSBpcyBrbm93bgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0gICAgICAgIGlmIChyZXNvdXJjZUdyb3VwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gaW5pdGlhbEZpbGVOYW1lOwotCi0gICAgICAgIHJldHVybiByZXNvdXJjZUdyb3VwLmdldFJlc291cmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmVhbSBjb250YWluaW5nIHRoZSBpbml0aWFsIGNvbnRlbnRzIHRvIGJlIGdpdmVuIHRvIG5ldyBmaWxlIHJlc291cmNlCi0gICAgICogaW5zdGFuY2VzLiAgPGI+U3ViY2xhc3NlczwvYj4gbWF5IHdpc2ggdG8gb3ZlcnJpZGUuICBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAgKiBwcm92aWRlcyBubyBpbml0aWFsIGNvbnRlbnRzLgotICAgICAqCi0gICAgICogQHJldHVybiBpbml0aWFsIGNvbnRlbnRzIHRvIGJlIGdpdmVuIHRvIG5ldyBmaWxlIHJlc291cmNlIGluc3RhbmNlcwotICAgICAqLwotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRJbml0aWFsQ29udGVudHMoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhYmVsIHRvIGRpc3BsYXkgaW4gdGhlIGZpbGUgbmFtZSBzcGVjaWZpY2F0aW9uIHZpc3VhbAotICAgICAqIGNvbXBvbmVudCBncm91cC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsYWJlbCB0byBkaXNwbGF5IGluIHRoZSBmaWxlIG5hbWUgc3BlY2lmaWNhdGlvbiB2aXN1YWwKLSAgICAgKiAgICAgY29tcG9uZW50IGdyb3VwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdGaWxlTGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlX2ZpbGVMYWJlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93cy9oaWRlcyB0aGUgYWR2YW5jZWQgb3B0aW9uIHdpZGdldHMuIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFkdmFuY2VkQnV0dG9uU2VsZWN0KCkgewotICAgICAgICBTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0gICAgICAgIFBvaW50IHNoZWxsU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIGdldENvbnRyb2woKTsKLQotICAgICAgICBpZiAobGlua2VkUmVzb3VyY2VDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbGlua2VkUmVzb3VyY2VDb21wb3NpdGUuZGlzcG9zZSgpOwotICAgICAgICAgICAgbGlua2VkUmVzb3VyY2VDb21wb3NpdGUgPSBudWxsOwotICAgICAgICAgICAgY29tcG9zaXRlLmxheW91dCgpOwotICAgICAgICAgICAgc2hlbGwuc2V0U2l6ZShzaGVsbFNpemUueCwgc2hlbGxTaXplLnkgLSBsaW5rZWRSZXNvdXJjZUdyb3VwSGVpZ2h0KTsKLSAgICAgICAgICAgIGFkdmFuY2VkQnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuc2hvd0FkdmFuY2VkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbmtlZFJlc291cmNlQ29tcG9zaXRlID0gbGlua2VkUmVzb3VyY2VHcm91cAotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29udGVudHMobGlua2VkUmVzb3VyY2VQYXJlbnQpOwotICAgICAgICAgICAgaWYgKGxpbmtlZFJlc291cmNlR3JvdXBIZWlnaHQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBQb2ludCBncm91cFNpemUgPSBsaW5rZWRSZXNvdXJjZUNvbXBvc2l0ZS5jb21wdXRlU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbGlua2VkUmVzb3VyY2VHcm91cEhlaWdodCA9IGdyb3VwU2l6ZS55OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hlbGwuc2V0U2l6ZShzaGVsbFNpemUueCwgc2hlbGxTaXplLnkgKyBsaW5rZWRSZXNvdXJjZUdyb3VwSGVpZ2h0KTsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5sYXlvdXQoKTsKLSAgICAgICAgICAgIGFkdmFuY2VkQnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuaGlkZUFkdmFuY2VkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPkxpc3RlbmVyPC9jb2RlPiBtZXRob2QgaGFuZGxlcyBhbGwgZXZlbnRzIGFuZCBlbmFibGVtZW50cyBmb3IgY29udHJvbHMKLSAgICAgKiBvbiB0aGlzIHBhZ2UuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICBzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGluaXRpYWwgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lciBuYW1lIGVudHJ5IGZpZWxkLCBiYXNlZCB1cG9uCi0gICAgICogZWl0aGVyIGEgcHJldmlvdXNseS1zcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZSBvciB0aGUgYWJpbGl0eSB0byBkZXRlcm1pbmUKLSAgICAgKiBzdWNoIGEgdmFsdWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCkgewotICAgICAgICBpZiAoaW5pdGlhbENvbnRhaW5lckZ1bGxQYXRoICE9IG51bGwpCi0gICAgICAgICAgICByZXNvdXJjZUdyb3VwLnNldENvbnRhaW5lckZ1bGxQYXRoKGluaXRpYWxDb250YWluZXJGdWxsUGF0aCk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBjdXJyZW50U2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2Ugc2VsZWN0ZWRSZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSkgb2JqZWN0OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBvYmplY3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkUmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJlc291cmNlID0gc2VsZWN0ZWRSZXNvdXJjZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkUmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUdyb3VwLnNldENvbnRhaW5lckZ1bGxQYXRoKHNlbGVjdGVkUmVzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgcGFnZSdzIGNvbnRhaW5lciBuYW1lIGZpZWxkLCBvciBzdG9yZXMKLSAgICAgKiBpdCBmb3IgZnV0dXJlIHVzZSBpZiB0aGlzIHBhZ2UncyBjb250cm9scyBkbyBub3QgZXhpc3QgeWV0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGggdGhlIGZ1bGwgcGF0aCB0byB0aGUgY29udGFpbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyRnVsbFBhdGgoSVBhdGggcGF0aCkgewotICAgICAgICBpZiAocmVzb3VyY2VHcm91cCA9PSBudWxsKQotICAgICAgICAgICAgaW5pdGlhbENvbnRhaW5lckZ1bGxQYXRoID0gcGF0aDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzb3VyY2VHcm91cC5zZXRDb250YWluZXJGdWxsUGF0aChwYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHBhZ2UncyBmaWxlIG5hbWUgZmllbGQsIG9yIHN0b3JlcwotICAgICAqIGl0IGZvciBmdXR1cmUgdXNlIGlmIHRoaXMgcGFnZSdzIGNvbnRyb2xzIGRvIG5vdCBleGlzdCB5ZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgbmV3IGZpbGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAocmVzb3VyY2VHcm91cCA9PSBudWxsKQotICAgICAgICAgICAgaW5pdGlhbEZpbGVOYW1lID0gdmFsdWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc291cmNlR3JvdXAuc2V0UmVzb3VyY2UodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBsaW5rZWQgcmVzb3VyY2UgdGFyZ2V0IGlzIHZhbGlkLgotICAgICAqIFNldHMgdGhlIGVycm9yIG1lc3NhZ2UgYWNjb3JkaW5nbHkgYW5kIHJldHVybnMgdGhlIHN0YXR1cy4KLSAgICAgKiAgCi0gICAgICogQHJldHVybiBJU3RhdHVzIHZhbGlkYXRpb24gcmVzdWx0IGZyb20gdGhlIENyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUxpbmtlZFJlc291cmNlKCkgewotICAgICAgICBJUGF0aCBjb250YWluZXJQYXRoID0gcmVzb3VyY2VHcm91cC5nZXRDb250YWluZXJGdWxsUGF0aCgpOwotICAgICAgICBJUGF0aCBuZXdGaWxlUGF0aCA9IGNvbnRhaW5lclBhdGguYXBwZW5kKHJlc291cmNlR3JvdXAuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIElGaWxlIG5ld0ZpbGVIYW5kbGUgPSBjcmVhdGVGaWxlSGFuZGxlKG5ld0ZpbGVQYXRoKTsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBsaW5rZWRSZXNvdXJjZUdyb3VwCi0gICAgICAgICAgICAgICAgLnZhbGlkYXRlTGlua0xvY2F0aW9uKG5ld0ZpbGVIYW5kbGUpOwotCi0gICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3RMaW5rQ2hlY2spCi0gICAgICAgICAgICAgICAgc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIFdBUk5JTkcpOwotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFnZSdzIGNvbnRyb2xzIGN1cnJlbnRseSBhbGwgY29udGFpbiB2YWxpZCAKLSAgICAgKiB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBjb250cm9scyBhcmUgdmFsaWQsIGFuZAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGF0IGxlYXN0IG9uZSBpcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotICAgICAgICBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQotICAgICAgICBpZiAoIXJlc291cmNlR3JvdXAuYXJlQWxsVmFsdWVzVmFsaWQoKSkgewotICAgICAgICAgICAgLy8gaWYgYmxhbmsgbmFtZSB0aGVuIGZhaWwgc2lsZW50bHkKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUdyb3VwLmdldFByb2JsZW1UeXBlKCkgPT0gUmVzb3VyY2VBbmRDb250YWluZXJHcm91cC5QUk9CTEVNX1JFU09VUkNFX0VNUFRZCi0gICAgICAgICAgICAgICAgICAgIHx8IHJlc291cmNlR3JvdXAuZ2V0UHJvYmxlbVR5cGUoKSA9PSBSZXNvdXJjZUFuZENvbnRhaW5lckdyb3VwLlBST0JMRU1fQ09OVEFJTkVSX0VNUFRZKSB7Ci0gICAgICAgICAgICAgICAgc2V0TWVzc2FnZShyZXNvdXJjZUdyb3VwLmdldFByb2JsZW1NZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShyZXNvdXJjZUdyb3VwLmdldFByb2JsZW1NZXNzYWdlKCkpOwotICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIElTdGF0dXMgbGlua2VkUmVzb3VyY2VTdGF0dXMgPSBudWxsOwotICAgICAgICBpZiAodmFsaWQpIHsKLSAgICAgICAgICAgIGxpbmtlZFJlc291cmNlU3RhdHVzID0gdmFsaWRhdGVMaW5rZWRSZXNvdXJjZSgpOwotICAgICAgICAgICAgaWYgKGxpbmtlZFJlc291cmNlU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLSAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIHZhbGlkYXRlTGlua2VkUmVzb3VyY2Ugc2V0cyBtZXNzYWdlcyBpdHNlbGYKLSAgICAgICAgaWYgKHZhbGlkCi0gICAgICAgICAgICAgICAgJiYgKGxpbmtlZFJlc291cmNlU3RhdHVzID09IG51bGwgfHwgbGlua2VkUmVzb3VyY2VTdGF0dXMuaXNPSygpKSkgewotICAgICAgICAgICAgc2V0TWVzc2FnZShudWxsKTsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsaWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIERpYWxvZ1BhZ2Uuc2V0VmlzaWJsZShib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgIGlmICh2aXNpYmxlKQotICAgICAgICAgICAgcmVzb3VyY2VHcm91cC5zZXRGb2N1cygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9XaXphcmROZXdGb2xkZXJNYWluUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZE5ld0ZvbGRlck1haW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZmFkMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZE5ld0ZvbGRlck1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIExlb24gSi4gQnJlZWR0IC0gQWRkZWQgbXVsdGlwbGUgZm9sZGVyIGNyZWF0aW9uIHN1cHBvcnQgKGluIFdpemFyZE5ld0ZvbGRlck1haW5QYWdlKQotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLkNyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1pc2MuUmVzb3VyY2VBbmRDb250YWluZXJHcm91cDsKLQotLyoqCi0gKiBTdGFuZGFyZCBtYWluIHBhZ2UgZm9yIGEgd2l6YXJkIHRoYXQgY3JlYXRlcyBhIGZvbGRlciByZXNvdXJjZS4KLSAqIDxwPgotICogVGhpcyBwYWdlIG1heSBiZSB1c2VkIGJ5IGNsaWVudHMgYXMtaXM7IGl0IG1heSBiZSBhbHNvIGJlIHN1YmNsYXNzZWQgdG8gc3VpdC4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kCi0gKiA8dWw+Ci0gKiAgIDxsaT48Y29kZT5oYW5kbGVFdmVudDwvY29kZT48L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdpemFyZE5ld0ZvbGRlck1haW5QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX0NPTlRBSU5FUl9HUk9VUF9IRUlHSFQgPSAyNTA7Ci0KLSAgICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0KLSAgICBwcml2YXRlIElGb2xkZXIgbmV3Rm9sZGVyOwotCi0gICAgLy8gbGluayB0YXJnZXQgbG9jYXRpb24KLSAgICBwcml2YXRlIElQYXRoIGxpbmtUYXJnZXRQYXRoOwotCi0gICAgLy8gd2lkZ2V0cwotICAgIHByaXZhdGUgUmVzb3VyY2VBbmRDb250YWluZXJHcm91cCByZXNvdXJjZUdyb3VwOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gYWR2YW5jZWRCdXR0b247Ci0KLSAgICBwcml2YXRlIENyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXAgbGlua2VkUmVzb3VyY2VHcm91cDsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIGxpbmtlZFJlc291cmNlUGFyZW50OwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbGlua2VkUmVzb3VyY2VDb21wb3NpdGU7Ci0KLSAgICAvKioKLSAgICAgKiBIZWlnaHQgb2YgdGhlICJhZHZhbmNlZCIgbGlua2VkIHJlc291cmNlIGdyb3VwLiBTZXQgd2hlbiB0aGUKLSAgICAgKiBhZHZhbmNlZCBncm91cCBpcyBmaXJzdCBtYWRlIHZpc2libGUuIAotICAgICAqLwotICAgIHByaXZhdGUgaW50IGxpbmtlZFJlc291cmNlR3JvdXBIZWlnaHQgPSAtMTsKLQotICAgIC8qKgotICAgICAqIEZpcnN0IHRpbWUgdGhlIGFkdmFuY2VkIGdyb3VwIGlzIHZhbGlkYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RMaW5rQ2hlY2sgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmb2xkZXIgY3JlYXRpb24gd2l6YXJkIHBhZ2UuIElmIHRoZSBpbml0aWFsIHJlc291cmNlIHNlbGVjdGlvbiAKLSAgICAgKiBjb250YWlucyBleGFjdGx5IG9uZSBjb250YWluZXIgcmVzb3VyY2UgdGhlbiBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQKLSAgICAgKiBjb250YWluZXIgcmVzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFnZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhZ2UKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHJlc291cmNlIHNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBXaXphcmROZXdGb2xkZXJNYWluUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIoIm5ld0ZvbGRlclBhZ2UxIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBzZXRUaXRsZShwYWdlTmFtZSk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld0ZvbGRlck1haW5QYWdlX2Rlc2NyaXB0aW9uKTsKLSAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHdpZGdldCBmb3IgYWR2YW5jZWQgb3B0aW9ucy4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFkdmFuY2VkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKQotICAgICAgICAgICAgICAgIC5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0gICAgICAgIGlmIChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFJlc291cmNlc1BsdWdpbi5QUkVGX0RJU0FCTEVfTElOS0lORykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGxpbmtlZFJlc291cmNlUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIGxpbmtlZFJlc291cmNlUGFyZW50LnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgICAgICBsaW5rZWRSZXNvdXJjZVBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgICAgICBsaW5rZWRSZXNvdXJjZVBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgICAgICAgICAgYWR2YW5jZWRCdXR0b24gPSBuZXcgQnV0dG9uKGxpbmtlZFJlc291cmNlUGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgICAgICBhZHZhbmNlZEJ1dHRvbi5zZXRGb250KGxpbmtlZFJlc291cmNlUGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgICAgICBhZHZhbmNlZEJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLnNob3dBZHZhbmNlZCk7Ci0gICAgICAgICAgICBHcmlkRGF0YSBkYXRhID0gc2V0QnV0dG9uTGF5b3V0RGF0YShhZHZhbmNlZEJ1dHRvbik7Ci0gICAgICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgICAgICAgICBhZHZhbmNlZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAgICAgYWR2YW5jZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVBZHZhbmNlZEJ1dHRvblNlbGVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICAgIGxpbmtlZFJlc291cmNlR3JvdXAgPSBuZXcgQ3JlYXRlTGlua2VkUmVzb3VyY2VHcm91cChJUmVzb3VyY2UuRk9MREVSLAotICAgICAgICAgICAgICAgIG5ldyBMaXN0ZW5lcigpIHsKLQkJICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQkJICAgICAgICAgICAgICAgIGZpcnN0TGlua0NoZWNrID0gZmFsc2U7Ci0JCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIG5ldyBDcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwLklTdHJpbmdWYWx1ZSgpIHsKLSAgICAgICAgICAgICAgICAJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgICAgICAJCXJldHVybiByZXNvdXJjZUdyb3VwLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHN0cmluZykgewotICAgICAgICAgICAgICAgIAkJcmVzb3VyY2VHcm91cC5zZXRSZXNvdXJjZShzdHJpbmcpOwotICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotICAgICAgICAvLyB0b3AgbGV2ZWwgZ3JvdXAKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkKLSAgICAgICAgICAgICAgICAuc2V0SGVscChjb21wb3NpdGUsIElJREVIZWxwQ29udGV4dElkcy5ORVdfRk9MREVSX1dJWkFSRF9QQUdFKTsKLQotICAgICAgICByZXNvdXJjZUdyb3VwID0gbmV3IFJlc291cmNlQW5kQ29udGFpbmVyR3JvdXAoCi0gICAgICAgICAgICAgICAgY29tcG9zaXRlLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3Rm9sZGVyTWFpblBhZ2VfZm9sZGVyTmFtZSwgSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3Rm9sZGVyTWFpblBhZ2VfZm9sZGVyTGFiZWwsIGZhbHNlLCBTSVpJTkdfQ09OVEFJTkVSX0dST1VQX0hFSUdIVCk7Ci0gICAgICAgIHJlc291cmNlR3JvdXAuc2V0QWxsb3dFeGlzdGluZ1Jlc291cmNlcyhmYWxzZSk7Ci0gICAgICAgIGNyZWF0ZUFkdmFuY2VkQ29udHJvbHMoY29tcG9zaXRlKTsKLSAgICAgICAgaW5pdGlhbGl6ZVBhZ2UoKTsKLSAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgIC8vIFNob3cgZGVzY3JpcHRpb24gb24gb3BlbmluZwotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZm9sZGVyIHJlc291cmNlIGdpdmVuIHRoZSBmb2xkZXIgaGFuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvbGRlckhhbmRsZSB0aGUgZm9sZGVyIGhhbmRsZSB0byBjcmVhdGUgYSBmb2xkZXIgcmVzb3VyY2UgZm9yCi0gICAgICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gc2hvdyB2aXN1YWwgcHJvZ3Jlc3Mgd2l0aAotICAgICAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzCi0gICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIGNhbmNlbGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9sZGVyKElGb2xkZXIgZm9sZGVySGFuZGxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGZvbGRlciByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlCi0gICAgICAgICAgICAvLyBVcGRhdGU6IFJlY3Vyc2l2ZSB0byBjcmVhdGUgYW55IGZvbGRlcnMgd2hpY2ggZG8gbm90IGV4aXN0IGFscmVhZHkKLSAgICAgICAgICAgIGlmICghZm9sZGVySGFuZGxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmtUYXJnZXRQYXRoICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGZvbGRlckhhbmRsZS5jcmVhdGVMaW5rKGxpbmtUYXJnZXRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5BTExPV19NSVNTSU5HX0xPQ0FMLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLQkgICAgICAgICAgICAgICAgSVBhdGggcGF0aCA9IGZvbGRlckhhbmRsZS5nZXRGdWxsUGF0aCgpOwotCSAgICAgICAgICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkgICAgICAgICAgICAgICAgaW50IG51bVNlZ21lbnRzPSBwYXRoLnNlZ21lbnRDb3VudCgpOwotCSAgICAgICAgICAgICAgICBpZiAobnVtU2VnbWVudHMgPiAyICYmICFyb290LmdldEZvbGRlcihwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSkuZXhpc3RzKCkpIHsKLQkgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkaXJlY3QgcGFyZW50IG9mIHRoZSBwYXRoIGRvZXNuJ3QgZXhpc3QsIHRyeSB0byBjcmVhdGUgdGhlCi0JICAgICAgICAgICAgICAgICAgICAvLyBuZWNlc3NhcnkgZGlyZWN0b3JpZXMuCi0JICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPSBudW1TZWdtZW50cyAtIDI7IGkgPiAwOyBpLS0pIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIGZvbGRlciA9IHJvb3QuZ2V0Rm9sZGVyKHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKGkpKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXIuY3JlYXRlKGZhbHNlLCB0cnVlLCBtb25pdG9yKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9sZGVySGFuZGxlLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBmb2xkZXIgYWxyZWFkeSBleGlzdGVkIGxvY2FsbHksIGp1c3QgcmVmcmVzaCB0byBnZXQgY29udGVudHMKLSAgICAgICAgICAgIGlmIChlLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuUEFUSF9PQ0NVUElFRCkKLSAgICAgICAgICAgICAgICBmb2xkZXJIYW5kbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNTAwKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBmb2xkZXIgcmVzb3VyY2UgaGFuZGxlIGZvciB0aGUgZm9sZGVyIHdpdGggdGhlIGdpdmVuIHdvcmtzcGFjZSBwYXRoLgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNyZWF0ZSB0aGUgZm9sZGVyIHJlc291cmNlOyB0aGlzIGlzIHRoZSByZXNwb25zaWJpbGl0eQotICAgICAqIG9mIDxjb2RlPmNyZWF0ZUZvbGRlcjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9sZGVyUGF0aCB0aGUgcGF0aCBvZiB0aGUgZm9sZGVyIHJlc291cmNlIHRvIGNyZWF0ZSBhIGhhbmRsZSBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgZm9sZGVyIHJlc291cmNlIGhhbmRsZQotICAgICAqIEBzZWUgI2NyZWF0ZUZvbGRlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBJRm9sZGVyIGNyZWF0ZUZvbGRlckhhbmRsZShJUGF0aCBmb2xkZXJQYXRoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0UGx1Z2luV29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcigKLSAgICAgICAgICAgICAgICBmb2xkZXJQYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBsaW5rIHRhcmdldCBwYXRoIGlmIGEgbGluayB0YXJnZXQgaGFzIGJlZW4gc3BlY2lmaWVkLiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaW5rVGFyZ2V0KCkgewotICAgICAgICBTdHJpbmcgbGlua1RhcmdldCA9IGxpbmtlZFJlc291cmNlR3JvdXAuZ2V0TGlua1RhcmdldCgpOwotICAgICAgICBpZiAobGlua1RhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rVGFyZ2V0UGF0aCA9IG5ldyBQYXRoKGxpbmtUYXJnZXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGlua1RhcmdldFBhdGggPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmb2xkZXIgcmVzb3VyY2UgaW4gdGhlIHNlbGVjdGVkIGNvbnRhaW5lciBhbmQgd2l0aCB0aGUgc2VsZWN0ZWQKLSAgICAgKiBuYW1lLiBDcmVhdGVzIGFueSBtaXNzaW5nIHJlc291cmNlIGNvbnRhaW5lcnMgYWxvbmcgdGhlIHBhdGg7IGRvZXMgbm90aGluZyBpZgotICAgICAqIHRoZSBjb250YWluZXIgcmVzb3VyY2VzIGFscmVhZHkgZXhpc3QuCi0gICAgICogPHA+Ci0gICAgICogSW4gbm9ybWFsIHVzYWdlLCB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIGFmdGVyIHRoZSB1c2VyIGhhcyBwcmVzc2VkIEZpbmlzaCBvbgotICAgICAqIHRoZSB3aXphcmQ7IHRoZSBlbmFibGVtZW50IG9mIHRoZSBGaW5pc2ggYnV0dG9uIGltcGxpZXMgdGhhdCBhbGwgY29udHJvbHMgb24KLSAgICAgKiB0aGlzIHBhZ2UgY3VycmVudGx5IGNvbnRhaW4gdmFsaWQgdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBwYWdlIGNhY2hlcyB0aGUgbmV3IGZvbGRlciBvbmNlIGl0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQotICAgICAqIGNyZWF0ZWQ7IHN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YgdGhpcyBtZXRob2Qgd2lsbCBhbnN3ZXIgdGhlIHNhbWUKLSAgICAgKiBmb2xkZXIgcmVzb3VyY2Ugd2l0aG91dCBhdHRlbXB0aW5nIHRvIGNyZWF0ZSBpdCBhZ2Fpbi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aXRoaW4gYSB3b3Jrc3BhY2UgbW9kaWZ5IG9wZXJhdGlvbiBzaW5jZQotICAgICAqIGl0IGNyZWF0ZXMgcmVzb3VyY2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZm9sZGVyIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZm9sZGVyCi0gICAgICogICAgd2FzIG5vdCBjcmVhdGVkCi0gICAgICovCi0gICAgcHVibGljIElGb2xkZXIgY3JlYXRlTmV3Rm9sZGVyKCkgewotICAgICAgICBpZiAobmV3Rm9sZGVyICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV3Rm9sZGVyOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgbmV3IGZvbGRlciBhbmQgY2FjaGUgaXQgaWYgc3VjY2Vzc2Z1bAotICAgICAgICBmaW5hbCBJUGF0aCBjb250YWluZXJQYXRoID0gcmVzb3VyY2VHcm91cC5nZXRDb250YWluZXJGdWxsUGF0aCgpOwotICAgICAgICBJUGF0aCBuZXdGb2xkZXJQYXRoID0gY29udGFpbmVyUGF0aC5hcHBlbmQocmVzb3VyY2VHcm91cC5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgZmluYWwgSUZvbGRlciBuZXdGb2xkZXJIYW5kbGUgPSBjcmVhdGVGb2xkZXJIYW5kbGUobmV3Rm9sZGVyUGF0aCk7Ci0KLSAgICAgICAgY3JlYXRlTGlua1RhcmdldCgpOwotICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGNyZWF0ZVJ1bGUobmV3Rm9sZGVySGFuZGxlKSkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayhJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdGb2xkZXJDcmVhdGlvblBhZ2VfcHJvZ3Jlc3MsIDIwMDApOwotICAgICAgICAgICAgICAgICAgICBDb250YWluZXJHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvbnRhaW5lckdlbmVyYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlQ29udGFpbmVyKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlcihuZXdGb2xkZXJIYW5kbGUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvciwgMTAwMCkpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgRXJyb3JEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksIC8vIFdhcyBVdGlsaXRpZXMuZ2V0Rm9jdXNTaGVsbCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld0ZvbGRlckNyZWF0aW9uUGFnZV9lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBubyBzcGVjaWFsIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDb3JlRXhjZXB0aW9uKSBlLmdldFRhcmdldEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIENvcmVFeGNlcHRpb25zIGFyZSBoYW5kbGVkIGFib3ZlLCBidXQgdW5leHBlY3RlZCBydW50aW1lIGV4Y2VwdGlvbnMgYW5kIGVycm9ycyBtYXkgc3RpbGwgb2NjdXIuCi0KLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4ubG9nKGdldENsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiY3JlYXRlTmV3Rm9sZGVyKCkiLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld0ZvbGRlckNyZWF0aW9uUGFnZV9pbnRlcm5hbEVycm9yVGl0bGUsIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld0ZvbGRlcl9pbnRlcm5hbEVycm9yLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGllLi0gb25lIG9mIHRoZSBzdGVwcyByZXN1bHRlZCBpbiBhIGNvcmUgZXhjZXB0aW9uCi0gICAgICAgIH0KLQotICAgICAgICBuZXdGb2xkZXIgPSBuZXdGb2xkZXJIYW5kbGU7Ci0KLSAgICAgICAgcmV0dXJuIG5ld0ZvbGRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzY2hlZHVsaW5nIHJ1bGUgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIHJlc291cmNlIGF0Ci0gICAgICogdGhlIGdpdmVuIGNvbnRhaW5lciBwYXRoLiBUaGUgcnVsZSBzaG91bGQgYmUgdGhlIGNyZWF0aW9uIHJ1bGUgZm9yCi0gICAgICogdGhlIHRvcC1tb3N0IG5vbi1leGlzdGluZyBwYXJlbnQuCi0gICAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSBiZWluZyBjcmVhdGVkCi0gICAgICogQHJldHVybiBUaGUgc2NoZWR1bGluZyBydWxlIGZvciBjcmVhdGluZyB0aGUgZ2l2ZW4gcmVzb3VyY2UKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBJU2NoZWR1bGluZ1J1bGUgY3JlYXRlUnVsZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSVJlc291cmNlIHBhcmVudCA9IHJlc291cmNlLmdldFBhcmVudCgpOwotICAgIAl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLSAgICAJCWlmIChwYXJlbnQuZXhpc3RzKCkpCi0gICAgCQkJcmV0dXJuIHJlc291cmNlLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkuY3JlYXRlUnVsZShyZXNvdXJjZSk7Ci0gICAgCQlyZXNvdXJjZSA9IHBhcmVudDsKLSAgICAJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLSAgICAJfQotCQlyZXR1cm4gcmVzb3VyY2UuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KLQotICAgIC8qKgotICAgICAqIFNob3dzL2hpZGVzIHRoZSBhZHZhbmNlZCBvcHRpb24gd2lkZ2V0cy4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWR2YW5jZWRCdXR0b25TZWxlY3QoKSB7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLSAgICAgICAgUG9pbnQgc2hlbGxTaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgZ2V0Q29udHJvbCgpOwotCi0gICAgICAgIGlmIChsaW5rZWRSZXNvdXJjZUNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rZWRSZXNvdXJjZUNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBsaW5rZWRSZXNvdXJjZUNvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgICAgICBjb21wb3NpdGUubGF5b3V0KCk7Ci0gICAgICAgICAgICBzaGVsbC5zZXRTaXplKHNoZWxsU2l6ZS54LCBzaGVsbFNpemUueSAtIGxpbmtlZFJlc291cmNlR3JvdXBIZWlnaHQpOwotICAgICAgICAgICAgYWR2YW5jZWRCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5zaG93QWR2YW5jZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGlua2VkUmVzb3VyY2VDb21wb3NpdGUgPSBsaW5rZWRSZXNvdXJjZUdyb3VwCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb250ZW50cyhsaW5rZWRSZXNvdXJjZVBhcmVudCk7Ci0gICAgICAgICAgICBpZiAobGlua2VkUmVzb3VyY2VHcm91cEhlaWdodCA9PSAtMSkgewotICAgICAgICAgICAgICAgIFBvaW50IGdyb3VwU2l6ZSA9IGxpbmtlZFJlc291cmNlQ29tcG9zaXRlLmNvbXB1dGVTaXplKAotICAgICAgICAgICAgICAgICAgICAgICAgU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLSAgICAgICAgICAgICAgICBsaW5rZWRSZXNvdXJjZUdyb3VwSGVpZ2h0ID0gZ3JvdXBTaXplLnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaGVsbC5zZXRTaXplKHNoZWxsU2l6ZS54LCBzaGVsbFNpemUueSArIGxpbmtlZFJlc291cmNlR3JvdXBIZWlnaHQpOwotICAgICAgICAgICAgY29tcG9zaXRlLmxheW91dCgpOwotICAgICAgICAgICAgYWR2YW5jZWRCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5oaWRlQWR2YW5jZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPldpemFyZE5ld0ZvbGRlckNyZWF0aW9uUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5MaXN0ZW5lcjwvY29kZT4gbWV0aG9kIGhhbmRsZXMgYWxsIGV2ZW50cyBhbmQgZW5hYmxlbWVudHMgZm9yIGNvbnRyb2xzCi0gICAgICogb24gdGhpcyBwYWdlLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXYpIHsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGlzIHBhZ2UncyBjb250cm9scy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUGFnZSgpIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBjdXJyZW50U2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBuZXh0ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgSVJlc291cmNlIHNlbGVjdGVkUmVzb3VyY2UgPSBudWxsOwotICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSkgbmV4dDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBuZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWxlY3RlZFJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUmVzb3VyY2UgPSBzZWxlY3RlZFJlc291cmNlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFJlc291cmNlLmlzQWNjZXNzaWJsZSgpKQotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUdyb3VwLnNldENvbnRhaW5lckZ1bGxQYXRoKHNlbGVjdGVkUmVzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBEaWFsb2dQYWdlLnNldFZpc2libGUoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgICAgICBpZiAodmlzaWJsZSkKLSAgICAgICAgICAgIHJlc291cmNlR3JvdXAuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbGlua2VkIHJlc291cmNlIHRhcmdldCBpcyB2YWxpZC4KLSAgICAgKiBTZXRzIHRoZSBlcnJvciBtZXNzYWdlIGFjY29yZGluZ2x5IGFuZCByZXR1cm5zIHRoZSBzdGF0dXMuCi0gICAgICogIAotICAgICAqIEByZXR1cm4gSVN0YXR1cyB2YWxpZGF0aW9uIHJlc3VsdCBmcm9tIHRoZSBDcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVMaW5rZWRSZXNvdXJjZSgpIHsKLSAgICAgICAgSVBhdGggY29udGFpbmVyUGF0aCA9IHJlc291cmNlR3JvdXAuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLSAgICAgICAgSVBhdGggbmV3Rm9sZGVyUGF0aCA9IGNvbnRhaW5lclBhdGguYXBwZW5kKHJlc291cmNlR3JvdXAuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIElGb2xkZXIgbmV3Rm9sZGVySGFuZGxlID0gY3JlYXRlRm9sZGVySGFuZGxlKG5ld0ZvbGRlclBhdGgpOwotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IGxpbmtlZFJlc291cmNlR3JvdXAKLSAgICAgICAgICAgICAgICAudmFsaWRhdGVMaW5rTG9jYXRpb24obmV3Rm9sZGVySGFuZGxlKTsKLQotICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotICAgICAgICAgICAgaWYgKGZpcnN0TGlua0NoZWNrKQotICAgICAgICAgICAgICAgIHNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgewotICAgICAgICAgICAgc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBXQVJOSU5HKTsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhZ2UncyBjb250cm9scyBjdXJyZW50bHkgYWxsIGNvbnRhaW4gdmFsaWQgCi0gICAgICogdmFsdWVzLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgY29udHJvbHMgYXJlIHZhbGlkLCBhbmQKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgaXMgaW52YWxpZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLSAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0KLSAgICAgICAgaWYgKCFyZXNvdXJjZUdyb3VwLmFyZUFsbFZhbHVlc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIC8vIGlmIGJsYW5rIG5hbWUgdGhlbiBmYWlsIHNpbGVudGx5Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VHcm91cC5nZXRQcm9ibGVtVHlwZSgpID09IFJlc291cmNlQW5kQ29udGFpbmVyR3JvdXAuUFJPQkxFTV9SRVNPVVJDRV9FTVBUWQotICAgICAgICAgICAgICAgICAgICB8fCByZXNvdXJjZUdyb3VwLmdldFByb2JsZW1UeXBlKCkgPT0gUmVzb3VyY2VBbmRDb250YWluZXJHcm91cC5QUk9CTEVNX0NPTlRBSU5FUl9FTVBUWSkgewotICAgICAgICAgICAgICAgIHNldE1lc3NhZ2UocmVzb3VyY2VHcm91cC5nZXRQcm9ibGVtTWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShyZXNvdXJjZUdyb3VwLmdldFByb2JsZW1NZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIElTdGF0dXMgbGlua2VkUmVzb3VyY2VTdGF0dXMgPSBudWxsOwotICAgICAgICBpZiAodmFsaWQpIHsKLSAgICAgICAgICAgIGxpbmtlZFJlc291cmNlU3RhdHVzID0gdmFsaWRhdGVMaW5rZWRSZXNvdXJjZSgpOwotICAgICAgICAgICAgaWYgKGxpbmtlZFJlc291cmNlU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLSAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIHZhbGlkYXRlTGlua2VkUmVzb3VyY2Ugc2V0cyBtZXNzYWdlcyBpdHNlbGYKLSAgICAgICAgaWYgKHZhbGlkCi0gICAgICAgICAgICAgICAgJiYgKGxpbmtlZFJlc291cmNlU3RhdHVzID09IG51bGwgfHwgbGlua2VkUmVzb3VyY2VTdGF0dXMuaXNPSygpKSkgewotICAgICAgICAgICAgc2V0TWVzc2FnZShudWxsKTsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsaWQ7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvZGlhbG9ncy9XaXphcmROZXdMaW5rUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZE5ld0xpbmtQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkM2VhNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZE5ld0xpbmtQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKiAgIFNlYmFzdGlhbiBEYXZpZHMgPHNkYXZpZHNAZ214LmRlPiAtIEZpeCBmb3IgYnVnIDE5MzQ2IC0gRGlhbG9nCi0gKiAJIAlmb250IHNob3VsZCBiZSBhY3RpdmF0ZWQgYW5kIHVzZWQgYnkgb3RoZXIgY29tcG9uZW50cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQYXRoVmFyaWFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLmRpYWxvZ3MuUGF0aFZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuSURFUmVzb3VyY2VJbmZvVXRpbHM7Ci0KLS8qKgotICogU3RhbmRhcmQgcmVzb3VyY2UgbGluayBwYWdlIGZvciBhIHdpemFyZCB0aGF0IGNyZWF0ZXMgYSBmaWxlIG9yIAotICogZm9sZGVyIHJlc291cmNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkTmV3TGlua1BhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLSAgICBwcml2YXRlIFN0cmluZyBpbml0aWFsTGlua1RhcmdldDsKLQotICAgIHByaXZhdGUgaW50IHR5cGU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlTGluayA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBJQ29udGFpbmVyIGNvbnRhaW5lcjsKLQotICAgIC8vIHdpZGdldHMKLSAgICBwcml2YXRlIFRleHQgbGlua1RhcmdldEZpZWxkOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gdmFyaWFibGVzQnV0dG9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvdXJjZSBsaW5rIHdpemFyZCBwYWdlLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFnZQotICAgICAqIEBwYXJhbSB0eXBlIHNwZWNpZmllcyB0aGUgdHlwZSBvZiByZXNvdXJjZSB0byBsaW5rIHRvLiAKLSAgICAgKiAJPGNvZGU+SVJlc291cmNlLkZJTEU8L2NvZGU+IG9yIDxjb2RlPklSZXNvdXJjZS5GT0xERVI8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFdpemFyZE5ld0xpbmtQYWdlKFN0cmluZyBwYWdlTmFtZSwgaW50IHR5cGUpIHsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUpOwotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0gICAgICAgIC8vIHRvcCBsZXZlbCBncm91cAotICAgICAgICBDb21wb3NpdGUgdG9wTGV2ZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICAgICAgdG9wTGV2ZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHRvcExldmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgICAgICB0b3BMZXZlbC5zZXRGb250KGZvbnQpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRvcExldmVsLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5ORVdfTElOS19XSVpBUkRfUEFHRSk7Ci0KLSAgICAgICAgZmluYWwgQnV0dG9uIGNyZWF0ZUxpbmtCdXR0b24gPSBuZXcgQnV0dG9uKHRvcExldmVsLCBTV1QuQ0hFQ0spOwotICAgICAgICBpZiAodHlwZSA9PSBJUmVzb3VyY2UuRklMRSkKLSAgICAgICAgICAgIGNyZWF0ZUxpbmtCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdMaW5rUGFnZV9saW5rRmlsZUJ1dHRvbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNyZWF0ZUxpbmtCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdMaW5rUGFnZV9saW5rRm9sZGVyQnV0dG9uKTsKLSAgICAgICAgY3JlYXRlTGlua0J1dHRvbi5zZXRTZWxlY3Rpb24oY3JlYXRlTGluayk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGNyZWF0ZUxpbmtCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgY3JlYXRlTGlua0J1dHRvbi5zZXRGb250KGZvbnQpOwotICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmsgPSBjcmVhdGVMaW5rQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGNyZWF0ZUxpbmspOwotICAgICAgICAgICAgICAgIHZhcmlhYmxlc0J1dHRvbi5zZXRFbmFibGVkKGNyZWF0ZUxpbmspOwotICAgICAgICAgICAgICAgIGxpbmtUYXJnZXRGaWVsZC5zZXRFbmFibGVkKGNyZWF0ZUxpbmspOwotICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGNyZWF0ZUxpbmtCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIGNyZWF0ZUxpbmtMb2NhdGlvbkdyb3VwKHRvcExldmVsLCBjcmVhdGVMaW5rKTsKLSAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0KLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotICAgICAgICBzZXRDb250cm9sKHRvcExldmVsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBsaW5rIHRhcmdldCBsb2NhdGlvbiB3aWRnZXRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGxvY2F0aW9uR3JvdXAgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKiBAcGFyYW0gZW5hYmxlZCBzZXRzIHRoZSBpbml0aWFsIGVuYWJsZWQgc3RhdGUgb2YgdGhlIHdpZGdldHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlTGlua0xvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIGxvY2F0aW9uR3JvdXAsCi0gICAgICAgICAgICBib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgRm9udCBmb250ID0gbG9jYXRpb25Hcm91cC5nZXRGb250KCk7Ci0gICAgICAgIExhYmVsIGZpbGwgPSBuZXcgTGFiZWwobG9jYXRpb25Hcm91cCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGxvY2F0aW9uR3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLSAgICAgICAgYnV0dG9uLmRpc3Bvc2UoKTsKLSAgICAgICAgZmlsbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIC8vIGxpbmsgdGFyZ2V0IGxvY2F0aW9uIGVudHJ5IGZpZWxkCi0gICAgICAgIGxpbmtUYXJnZXRGaWVsZCA9IG5ldyBUZXh0KGxvY2F0aW9uR3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGxpbmtUYXJnZXRGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBsaW5rVGFyZ2V0RmllbGQuc2V0Rm9udChmb250KTsKLSAgICAgICAgbGlua1RhcmdldEZpZWxkLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIGxpbmtUYXJnZXRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaWYgKGluaXRpYWxMaW5rVGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpbmtUYXJnZXRGaWVsZC5zZXRUZXh0KGluaXRpYWxMaW5rVGFyZ2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJyb3dzZSBidXR0b24KLSAgICAgICAgYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihsb2NhdGlvbkdyb3VwLCBTV1QuUFVTSCk7Ci0gICAgICAgIHNldEJ1dHRvbkxheW91dERhdGEoYnJvd3NlQnV0dG9uKTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld0xpbmtQYWdlX2Jyb3dzZUJ1dHRvbik7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlTGlua1RhcmdldEJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0gICAgICAgIGZpbGwgPSBuZXcgTGFiZWwobG9jYXRpb25Hcm91cCwgU1dULk5PTkUpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBmaWxsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgLy8gdmFyaWFibGVzIGJ1dHRvbgotICAgICAgICB2YXJpYWJsZXNCdXR0b24gPSBuZXcgQnV0dG9uKGxvY2F0aW9uR3JvdXAsIFNXVC5QVVNIKTsKLSAgICAgICAgc2V0QnV0dG9uTGF5b3V0RGF0YSh2YXJpYWJsZXNCdXR0b24pOwotICAgICAgICB2YXJpYWJsZXNCdXR0b24uc2V0Rm9udChmb250KTsKLSAgICAgICAgdmFyaWFibGVzQnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3TGlua1BhZ2VfdmFyaWFibGVzQnV0dG9uKTsKLSAgICAgICAgdmFyaWFibGVzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVWYXJpYWJsZXNCdXR0b25QcmVzc2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB2YXJpYWJsZXNCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaW5rIHRhcmdldCBsb2NhdGlvbiBlbnRlcmVkIGJ5IHRoZSB1c2VyLiAKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxpbmsgdGFyZ2V0IGxvY2F0aW9uIGVudGVyZWQgYnkgdGhlIHVzZXIuIG51bGwgaWYgdGhlIHVzZXIKLSAgICAgKiAJY2hvb3NlIG5vdCB0byBjcmVhdGUgYSBsaW5rLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGlua1RhcmdldCgpIHsKLSAgICAgICAgaWYgKGNyZWF0ZUxpbmsgJiYgbGlua1RhcmdldEZpZWxkICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBsaW5rVGFyZ2V0RmllbGQuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlua1RhcmdldEZpZWxkLmdldFRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhIGZpbGUgb3IgZGlyZWN0b3J5IGJyb3dzZXIgZGVwZW5kaW5nIG9uIHRoZSBsaW5rIHR5cGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUxpbmtUYXJnZXRCcm93c2VCdXR0b25QcmVzc2VkKCkgewotICAgICAgICBTdHJpbmcgbGlua1RhcmdldE5hbWUgPSBsaW5rVGFyZ2V0RmllbGQuZ2V0VGV4dCgpOwotICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IG51bGw7Ci0gICAgICAgICBJRmlsZVN0b3JlIHN0b3JlID0gbnVsbDsKLSAgICAgICAgaWYgKGxpbmtUYXJnZXROYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgc3RvcmUgPSBJREVSZXNvdXJjZUluZm9VdGlscy5nZXRGaWxlU3RvcmUobGlua1RhcmdldE5hbWUpOwotICAgICAgICAgICAgaWYgKHN0b3JlID09IG51bGwgfHwgIXN0b3JlLmZldGNoSW5mbygpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAJc3RvcmUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICBGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgICAgICAgaWYgKHN0b3JlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RvcmUuZmV0Y2hJbmZvKCkuaXNEaXJlY3RvcnkoKSkgCi0gICAgICAgICAgICAgICAgCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGxpbmtUYXJnZXROYW1lKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRGaWxlTmFtZShsaW5rVGFyZ2V0TmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZWxlY3Rpb24gPSBkaWFsb2cub3BlbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICBpZiAoc3RvcmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghc3RvcmUuZmV0Y2hJbmZvKCkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICBsaW5rVGFyZ2V0TmFtZSA9IHN0b3JlLmdldFBhcmVudCgpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmtUYXJnZXROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlhbG9nLnNldEZpbHRlclBhdGgobGlua1RhcmdldE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld0xpbmtQYWdlX3RhcmdldFNlbGVjdGlvbkxhYmVsKTsKLSAgICAgICAgICAgIHNlbGVjdGlvbiA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rVGFyZ2V0RmllbGQuc2V0VGV4dChzZWxlY3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYSBwYXRoIHZhcmlhYmxlIHNlbGVjdGlvbiBkaWFsb2cKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlVmFyaWFibGVzQnV0dG9uUHJlc3NlZCgpIHsKLSAgICAgICAgUGF0aFZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBQYXRoVmFyaWFibGVTZWxlY3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSwgdHlwZSk7Ci0KLSAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotICAgICAgICAgICAgU3RyaW5nW10gdmFyaWFibGVOYW1lcyA9IChTdHJpbmdbXSkgZGlhbG9nLmdldFJlc3VsdCgpOwotCi0gICAgICAgICAgICBpZiAodmFyaWFibGVOYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVBhdGhWYXJpYWJsZU1hbmFnZXIgcGF0aFZhcmlhYmxlTWFuYWdlciA9IFJlc291cmNlc1BsdWdpbgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtzcGFjZSgpLmdldFBhdGhWYXJpYWJsZU1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gcGF0aFZhcmlhYmxlTWFuYWdlci5nZXRWYWx1ZSh2YXJpYWJsZU5hbWVzWzBdKTsKLQotICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlua1RhcmdldEZpZWxkLnNldFRleHQocGF0aC50b09TU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbnRhaW5lciB0byB1c2UgZm9yIGxpbmsgdmFsaWRhdGlvbi4KLSAgICAgKiBUaGlzIHNob3VsZCBiZSB0aGUgcGFyZW50IG9mIHRoZSBuZXcgcmVzb3VyY2UgdGhhdCBpcyBiZWluZyAKLSAgICAgKiBsaW5rZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBjb250YWluZXIgdG8gdXNlIGZvciBsaW5rIHZhbGlkYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKElDb250YWluZXIgY29udGFpbmVyKSB7Ci0gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsaW5rIHRhcmdldCBmaWVsZAotICAgICAqIAotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHZhbHVlIG9mIHRoZSBsaW5rIHRhcmdldCBmaWVsZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExpbmtUYXJnZXQoU3RyaW5nIHRhcmdldCkgewotICAgICAgICBpbml0aWFsTGlua1RhcmdldCA9IHRhcmdldDsKLSAgICAgICAgaWYgKGxpbmtUYXJnZXRGaWVsZCAhPSBudWxsICYmIGxpbmtUYXJnZXRGaWVsZC5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGxpbmtUYXJnZXRGaWVsZC5zZXRUZXh0KHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIGZpbGUgYWdhaW5zdCB0aGUgbGluayB0eXBlIHNwZWNpZmllZAotICAgICAqIGR1cmluZyBwYWdlIGNyZWF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaW5rVGFyZ2V0U3RvcmUgZmlsZSB0byB2YWxpZGF0ZQotICAgICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGluayB0YXJnZXQgdHlwZSBpcyB2YWxpZAotICAgICAqIAlhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVGaWxlVHlwZShJRmlsZVN0b3JlIGxpbmtUYXJnZXRTdG9yZSkgewotICAgICAgICBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQotICAgICAgICBpZiAodHlwZSA9PSBJUmVzb3VyY2UuRklMRSAmJiBsaW5rVGFyZ2V0U3RvcmUuZmV0Y2hJbmZvKCkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld0xpbmtQYWdlX2xpbmtUYXJnZXROb3RGaWxlKTsKLSAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBJUmVzb3VyY2UuRk9MREVSCi0gICAgICAgICAgICAgICAgJiYgIWxpbmtUYXJnZXRTdG9yZS5mZXRjaEluZm8oKS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3TGlua1BhZ2VfbGlua1RhcmdldE5vdEZvbGRlcik7Ci0gICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWxpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIG5hbWUgb2YgdGhlIGxpbmsgdGFyZ2V0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlua1RhcmdldE5hbWUgbGluayB0YXJnZXQgbmFtZSB0byB2YWxpZGF0ZQotICAgICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGluayB0YXJnZXQgbmFtZSBpcyB2YWxpZAotICAgICAqIAlhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVMaW5rVGFyZ2V0TmFtZShTdHJpbmcgbGlua1RhcmdldE5hbWUpIHsKLSAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0KLSAgICAgICAgaWYgKCIiLmVxdWFscyhsaW5rVGFyZ2V0TmFtZSkpIHsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3TGlua1BhZ2VfbGlua1RhcmdldEVtcHR5KTsKLSAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoIiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChwYXRoLmlzVmFsaWRQYXRoKGxpbmtUYXJnZXROYW1lKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdMaW5rUGFnZV9saW5rVGFyZ2V0SW52YWxpZCk7Ci0gICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFnZSdzIGNvbnRyb2xzIGN1cnJlbnRseSBhbGwgY29udGFpbiB2YWxpZCAKLSAgICAgKiB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBjb250cm9scyBhcmUgdmFsaWQsIGFuZAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGF0IGxlYXN0IG9uZSBpcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLSAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gSURFV29ya2JlbmNoUGx1Z2luLmdldFBsdWdpbldvcmtzcGFjZSgpOwotCi0gICAgICAgIGlmIChjcmVhdGVMaW5rKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGlua1RhcmdldE5hbWUgPSBsaW5rVGFyZ2V0RmllbGQuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICB2YWxpZCA9IHZhbGlkYXRlTGlua1RhcmdldE5hbWUobGlua1RhcmdldE5hbWUpOwotICAgICAgICAgICAgaWYgKHZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgSUZpbGVTdG9yZSBsaW5rVGFyZ2V0RmlsZSA9IElERVJlc291cmNlSW5mb1V0aWxzLmdldEZpbGVTdG9yZShsaW5rVGFyZ2V0TmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmtUYXJnZXRGaWxlID09IG51bGwgfHwgIWxpbmtUYXJnZXRGaWxlLmZldGNoSW5mbygpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdMaW5rUGFnZV9saW5rVGFyZ2V0Tm9uRXhpc3RlbnQpOwotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIElTdGF0dXMgbG9jYXRpb25TdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVMaW5rTG9jYXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLCBuZXcgUGF0aChsaW5rVGFyZ2V0TmFtZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvblN0YXR1cy5pc09LKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdMaW5rUGFnZV9saW5rVGFyZ2V0TG9jYXRpb25JbnZhbGlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkYXRlRmlsZVR5cGUobGlua1RhcmdldEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEF2b2lkIGRyYXcgZmxpY2tlciBieSBjbGVhcmluZyBlcnJvciBtZXNzYWdlCi0gICAgICAgIC8vIGlmIGFsbCBpcyB2YWxpZC4KLSAgICAgICAgaWYgKHZhbGlkKSB7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWxpZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwYjllZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5Qcm9qZWN0Q29udGVudHNMb2NhdGlvbkFyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuUHJvamVjdENvbnRlbnRzTG9jYXRpb25BcmVhLklFcnJvck1lc3NhZ2VSZXBvcnRlcjsKLQotLyoqCi0gKiBTdGFuZGFyZCBtYWluIHBhZ2UgZm9yIGEgd2l6YXJkIHRoYXQgaXMgY3JlYXRlcyBhIHByb2plY3QgcmVzb3VyY2UuCi0gKiA8cD4KLSAqIFRoaXMgcGFnZSBtYXkgYmUgdXNlZCBieSBjbGllbnRzIGFzLWlzOyBpdCBtYXkgYmUgYWxzbyBiZSBzdWJjbGFzc2VkIHRvIHN1aXQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEV4YW1wbGUgdXNhZ2U6Ci0gKiA8cHJlPgotICogbWFpblBhZ2UgPSBuZXcgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSgiYmFzaWNOZXdQcm9qZWN0UGFnZSIpOwotICogbWFpblBhZ2Uuc2V0VGl0bGUoIlByb2plY3QiKTsKLSAqIG1haW5QYWdlLnNldERlc2NyaXB0aW9uKCJDcmVhdGUgYSBuZXcgcHJvamVjdCByZXNvdXJjZS4iKTsKLSAqIDwvcHJlPgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0gICAgICAgLy8gaW5pdGlhbCB2YWx1ZSBzdG9yZXMKLSAgICBwcml2YXRlIFN0cmluZyBpbml0aWFsUHJvamVjdEZpZWxkVmFsdWU7Ci0KLSAgICAvLyB3aWRnZXRzCi0gICAgVGV4dCBwcm9qZWN0TmFtZUZpZWxkOwotCi0gICAgcHJpdmF0ZSBMaXN0ZW5lciBuYW1lTW9kaWZ5TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgCXNldExvY2F0aW9uRm9yU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBib29sZWFuIHZhbGlkID0gdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUodmFsaWQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfTsKLQotCXByaXZhdGUgUHJvamVjdENvbnRlbnRzTG9jYXRpb25BcmVhIGxvY2F0aW9uQXJlYTsKLQotICAgIC8vIGNvbnN0YW50cwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSCA9IDI1MDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdCBjcmVhdGlvbiB3aXphcmQgcGFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGlzIHBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1dJWkFSRF9QQUdFKTsKLQotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgY3JlYXRlUHJvamVjdE5hbWVHcm91cChjb21wb3NpdGUpOwotICAgICAgICBsb2NhdGlvbkFyZWEgPSBuZXcgUHJvamVjdENvbnRlbnRzTG9jYXRpb25BcmVhKGdldEVycm9yUmVwb3J0ZXIoKSwgY29tcG9zaXRlKTsKLSAgICAgICAgaWYoaW5pdGlhbFByb2plY3RGaWVsZFZhbHVlICE9IG51bGwpCi0gICAgICAgIAlsb2NhdGlvbkFyZWEudXBkYXRlUHJvamVjdE5hbWUoaW5pdGlhbFByb2plY3RGaWVsZFZhbHVlKTsKLQotCQkvLyBTY2FsZSB0aGUgYnV0dG9uIGJhc2VkIG9uIHRoZSByZXN0IG9mIHRoZSBkaWFsb2cKLQkJc2V0QnV0dG9uTGF5b3V0RGF0YShsb2NhdGlvbkFyZWEuZ2V0QnJvd3NlQnV0dG9uKCkpOwotCQkKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLSAgICAgICAgLy8gU2hvdyBkZXNjcmlwdGlvbiBvbiBvcGVuaW5nCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgc2V0TWVzc2FnZShudWxsKTsKLSAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBHZXQgYW4gZXJyb3IgcmVwb3J0ZXIgZm9yIHRoZSByZWNlaXZlci4KLQkgKiBAcmV0dXJuIElFcnJvck1lc3NhZ2VSZXBvcnRlcgotCSAqLwotCXByaXZhdGUgSUVycm9yTWVzc2FnZVJlcG9ydGVyIGdldEVycm9yUmVwb3J0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSUVycm9yTWVzc2FnZVJlcG9ydGVyKCl7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLlByb2plY3RDb250ZW50c0xvY2F0aW9uQXJlYS5JRXJyb3JNZXNzYWdlUmVwb3J0ZXIjcmVwb3J0RXJyb3IoamF2YS5sYW5nLlN0cmluZykKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQkJCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQkJCWJvb2xlYW4gdmFsaWQgPSBlcnJvck1lc3NhZ2UgPT0gbnVsbDsKLQkJCQlpZih2YWxpZCkKLQkJCQkJdmFsaWQgPSB2YWxpZGF0ZVBhZ2UoKTsKLQkJCQkKLQkJCQlzZXRQYWdlQ29tcGxldGUodmFsaWQpOwotCQkJfQotCQl9OwotCX0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHByb2plY3QgbmFtZSBzcGVjaWZpY2F0aW9uIGNvbnRyb2xzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gcHJvamVjdCBzcGVjaWZpY2F0aW9uIGdyb3VwCi0gICAgICAgIENvbXBvc2l0ZSBwcm9qZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgcHJvamVjdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBwcm9qZWN0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgLy8gbmV3IHByb2plY3QgbGFiZWwKLSAgICAgICAgTGFiZWwgcHJvamVjdExhYmVsID0gbmV3IExhYmVsKHByb2plY3RHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBwcm9qZWN0TGFiZWwuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX25hbWVMYWJlbCk7Ci0gICAgICAgIHByb2plY3RMYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIC8vIG5ldyBwcm9qZWN0IG5hbWUgZW50cnkgZmllbGQKLSAgICAgICAgcHJvamVjdE5hbWVGaWVsZCA9IG5ldyBUZXh0KHByb2plY3RHcm91cCwgU1dULkJPUkRFUik7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLSAgICAgICAgcHJvamVjdE5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBwcm9qZWN0TmFtZUZpZWxkLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIHZhbHVlIGZpcnN0IGJlZm9yZSBsaXN0ZW5lcgotICAgICAgICAvLyB0byBhdm9pZCBoYW5kbGluZyBhbiBldmVudCBkdXJpbmcgdGhlIGNyZWF0aW9uLgotICAgICAgICBpZiAoaW5pdGlhbFByb2plY3RGaWVsZFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICBwcm9qZWN0TmFtZUZpZWxkLnNldFRleHQoaW5pdGlhbFByb2plY3RGaWVsZFZhbHVlKTsKLSAgICAgICAgcHJvamVjdE5hbWVGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuYW1lTW9kaWZ5TGlzdGVuZXIpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwcm9qZWN0IGxvY2F0aW9uIHBhdGggYXMgZW50ZXJlZCBieSAKLSAgICAgKiB0aGUgdXNlciwgb3IgaXRzIGFudGljaXBhdGVkIGluaXRpYWwgdmFsdWUuCi0gICAgICogTm90ZSB0aGF0IGlmIHRoZSBkZWZhdWx0IGhhcyBiZWVuIHJldHVybmVkIHRoZSBwYXRoCi0gICAgICogaW4gYSBwcm9qZWN0IGRlc2NyaXB0aW9uIHVzZWQgdG8gY3JlYXRlIGEgcHJvamVjdAotICAgICAqIHNob3VsZCBub3QgYmUgc2V0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBsb2NhdGlvbiBwYXRoIG9yIGl0cyBhbnRpY2lwYXRlZCBpbml0aWFsIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvblBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUGF0aChsb2NhdGlvbkFyZWEuZ2V0UHJvamVjdExvY2F0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwcm9qZWN0IHJlc291cmNlIGhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCBuYW1lIGZpZWxkIHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNyZWF0ZSB0aGUgcHJvamVjdCByZXNvdXJjZTsgdGhpcyBpcyB0aGUgcmVzcG9uc2liaWxpdHkKLSAgICAgKiBvZiA8Y29kZT5JUHJvamVjdDo6Y3JlYXRlPC9jb2RlPiBpbnZva2VkIGJ5IHRoZSBuZXcgcHJvamVjdCByZXNvdXJjZSB3aXphcmQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3IHByb2plY3QgcmVzb3VyY2UgaGFuZGxlCi0gICAgICovCi0gICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3RIYW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoCi0gICAgICAgICAgICAgICAgZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwcm9qZWN0IG5hbWUgYXMgZW50ZXJlZCBieSB0aGUgdXNlciwgb3IgaXRzIGFudGljaXBhdGVkCi0gICAgICogaW5pdGlhbCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgbmFtZSwgaXRzIGFudGljaXBhdGVkIGluaXRpYWwgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogICBpZiBubyBwcm9qZWN0IG5hbWUgaXMga25vd24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotICAgICAgICBpZiAocHJvamVjdE5hbWVGaWVsZCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGluaXRpYWxQcm9qZWN0RmllbGRWYWx1ZTsKLQotICAgICAgICByZXR1cm4gZ2V0UHJvamVjdE5hbWVGaWVsZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb2plY3QgbmFtZSBmaWVsZAotICAgICAqIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIHJlbW92ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBuYW1lIGluIHRoZSBmaWVsZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb2plY3ROYW1lRmllbGRWYWx1ZSgpIHsKLSAgICAgICAgaWYgKHByb2plY3ROYW1lRmllbGQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHJldHVybiBwcm9qZWN0TmFtZUZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW5pdGlhbCBwcm9qZWN0IG5hbWUgdGhhdCB0aGlzIHBhZ2Ugd2lsbCB1c2Ugd2hlbgotICAgICAqIGNyZWF0ZWQuIFRoZSBuYW1lIGlzIGlnbm9yZWQgaWYgdGhlIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotICAgICAqIG1ldGhvZCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4gTGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzCi0gICAgICogaW4gdGhlIG5hbWUgYXJlIGlnbm9yZWQuCi0gICAgICogUHJvdmlkaW5nIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIHByb2plY3Qgd2lsbCBub3QgbmVjZXNzYXJpbHkgCi0gICAgICogY2F1c2UgdGhlIHdpemFyZCB0byB3YXJuIHRoZSB1c2VyLiAgQ2FsbGVycyBvZiB0aGlzIG1ldGhvZCAKLSAgICAgKiBzaG91bGQgZmlyc3QgY2hlY2sgaWYgdGhlIHByb2plY3QgbmFtZSBwYXNzZWQgYWxyZWFkeSBleGlzdHMgCi0gICAgICogaW4gdGhlIHdvcmtzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSBpbml0aWFsIHByb2plY3QgbmFtZSBmb3IgdGhpcyBwYWdlCi0gICAgICogCi0gICAgICogQHNlZSBJV29ya3NwYWNlI3ZhbGlkYXRlTmFtZShTdHJpbmcsIGludCkKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsUHJvamVjdE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIGluaXRpYWxQcm9qZWN0RmllbGRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaW5pdGlhbFByb2plY3RGaWVsZFZhbHVlID0gbmFtZS50cmltKCk7Ci0gICAgICAgICAgICBpZihsb2NhdGlvbkFyZWEgIT0gbnVsbCkKLSAgICAgICAgICAgIAlsb2NhdGlvbkFyZWEudXBkYXRlUHJvamVjdE5hbWUobmFtZS50cmltKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBsb2NhdGlvbiB0byB0aGUgZGVmYXVsdCBsb2NhdGlvbiBpZiB3ZSBhcmUgc2V0IHRvIHVzZURlZmF1bHRzLgotICAgICAqLwotICAgIHZvaWQgc2V0TG9jYXRpb25Gb3JTZWxlY3Rpb24oKSB7Ci0gICAgCWxvY2F0aW9uQXJlYS51cGRhdGVQcm9qZWN0TmFtZShnZXRQcm9qZWN0TmFtZUZpZWxkVmFsdWUoKSk7Ci0gICAgfQotCi0gIAotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhZ2UncyBjb250cm9scyBjdXJyZW50bHkgYWxsIGNvbnRhaW4gdmFsaWQgCi0gICAgICogdmFsdWVzLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgY29udHJvbHMgYXJlIHZhbGlkLCBhbmQKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgaXMgaW52YWxpZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0UGx1Z2luV29ya3NwYWNlKCk7Ci0KLSAgICAgICAgU3RyaW5nIHByb2plY3RGaWVsZENvbnRlbnRzID0gZ2V0UHJvamVjdE5hbWVGaWVsZFZhbHVlKCk7Ci0gICAgICAgIGlmIChwcm9qZWN0RmllbGRDb250ZW50cy5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgICAgIHNldE1lc3NhZ2UoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9wcm9qZWN0TmFtZUVtcHR5KTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIElTdGF0dXMgbmFtZVN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZU5hbWUocHJvamVjdEZpZWxkQ29udGVudHMsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlLlBST0pFQ1QpOwotICAgICAgICBpZiAoIW5hbWVTdGF0dXMuaXNPSygpKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobmFtZVN0YXR1cy5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uVmFsaWRhdGlvbiA9IGxvY2F0aW9uQXJlYS5jaGVja1ZhbGlkTG9jYXRpb24oKTsKLSAgICAgICAgaWYobG9jYXRpb25WYWxpZGF0aW9uICE9IG51bGwpewotICAgICAgICAJc2V0RXJyb3JNZXNzYWdlKGxvY2F0aW9uVmFsaWRhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBJUHJvamVjdCBoYW5kbGUgPSBnZXRQcm9qZWN0SGFuZGxlKCk7Ci0gICAgICAgIGlmIChoYW5kbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3RFeGlzdHNNZXNzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgbm90IHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlIHZhbGlkYXRlIHRoZSBsb2NhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghbG9jYXRpb25BcmVhLmlzRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICBJU3RhdHVzIGxvY2F0aW9uU3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlUHJvamVjdExvY2F0aW9uKGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFBhdGgobG9jYXRpb25BcmVhLmdldFByb2plY3RMb2NhdGlvbigpKSk7Ci0gICAgICAgICAgICBpZiAoIWxvY2F0aW9uU3RhdHVzLmlzT0soKSkgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShsb2NhdGlvblN0YXR1cy5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgc2V0TWVzc2FnZShudWxsKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBzZWUgQERpYWxvZ1BhZ2Uuc2V0VmlzaWJsZShib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgIGlmICh2aXNpYmxlKQotICAgICAgICAgICAgcHJvamVjdE5hbWVGaWVsZC5zZXRGb2N1cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzZURlZmF1bHRzLgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVzZURlZmF1bHRzKCkgewotICAgICAgICByZXR1cm4gbG9jYXRpb25BcmVhLmlzRGVmYXVsdCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZE5ld1Byb2plY3RSZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhNGY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogU3RhbmRhcmQgcHJvamVjdCByZWZlcmVuY2UgcGFnZSBmb3IgYSB3aXphcmQgdGhhdCBjcmVhdGVzIGEgCi0gKiBwcm9qZWN0IHJlc291cmNlLgotICogPHA+Ci0gKiBUaGlzIHBhZ2UgbWF5IGJlIHVzZWQgYnkgY2xpZW50cyBhcy1pczsgaXQgbWF5IGJlIGFsc28gYmUKLSAqIHN1YmNsYXNzZWQgdG8gc3VpdC4KLSAqIDwvcD4KLSAqIDxwPgotICogRXhhbXBsZSB1c2FnZToKLSAqIDxwcmU+Ci0gKiByZWZlcmVuY2VQYWdlID0gbmV3IFdpemFyZE5ld1Byb2plY3RSZWZlcmVuY2VQYWdlKCJiYXNpY1JlZmVyZW5jZVByb2plY3RQYWdlIik7Ci0gKiByZWZlcmVuY2VQYWdlLnNldFRpdGxlKCJQcm9qZWN0Iik7Ci0gKiByZWZlcmVuY2VQYWdlLnNldERlc2NyaXB0aW9uKCJTZWxlY3QgcmVmZXJlbmNlZCBwcm9qZWN0cy4iKTsKLSAqIDwvcHJlPgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLSAgICAvLyB3aWRnZXRzCi0gICAgcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHJlZmVyZW5jZVByb2plY3RzVmlld2VyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfUFJPSkVDVFNfVElUTEUgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0UmVmZXJlbmNlc190aXRsZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9KRUNUX0xJU1RfTVVMVElQTElFUiA9IDE1OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0IHJlZmVyZW5jZSB3aXphcmQgcGFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGlzIHBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZVBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHBhZ2VOYW1lKTsKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICBGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5ORVdfUFJPSkVDVF9SRUZFUkVOQ0VfV0laQVJEX1BBR0UpOwotCi0gICAgICAgIExhYmVsIHJlZmVyZW5jZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICByZWZlcmVuY2VMYWJlbC5zZXRUZXh0KFJFRkVSRU5DRURfUFJPSkVDVFNfVElUTEUpOwotICAgICAgICByZWZlcmVuY2VMYWJlbC5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIHJlZmVyZW5jZVByb2plY3RzVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29tcG9zaXRlLAotICAgICAgICAgICAgICAgIFNXVC5CT1JERVIpOwotICAgICAgICByZWZlcmVuY2VQcm9qZWN0c1ZpZXdlci5nZXRUYWJsZSgpLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSBnZXREZWZhdWx0Rm9udEhlaWdodChyZWZlcmVuY2VQcm9qZWN0c1ZpZXdlcgotICAgICAgICAgICAgICAgIC5nZXRUYWJsZSgpLCBQUk9KRUNUX0xJU1RfTVVMVElQTElFUik7Ci0gICAgICAgIHJlZmVyZW5jZVByb2plY3RzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgcmVmZXJlbmNlUHJvamVjdHNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihXb3JrYmVuY2hMYWJlbFByb3ZpZGVyCi0gICAgICAgICAgICAgICAgLmdldERlY29yYXRpbmdXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICByZWZlcmVuY2VQcm9qZWN0c1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZ2V0Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICByZWZlcmVuY2VQcm9qZWN0c1ZpZXdlci5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkpOwotCi0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29udGVudCBwcm92aWRlciBmb3IgdGhlIHJlZmVyZW5jZSBwcm9qZWN0Ci0gICAgICogdmlld2VyLiBJdCB3aWxsIHJldHVybiBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgcHJvdmlkZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya3NwYWNlKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgICAgICAgICAgICAgSVByb2plY3RbXSBwcm9qZWN0cyA9ICgoSVdvcmtzcGFjZSkgZWxlbWVudCkuZ2V0Um9vdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvamVjdHMoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvamVjdHMgPT0gbnVsbCA/IG5ldyBPYmplY3RbMF0gOiBwcm9qZWN0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRlZnVhbHQgd2lkZ2V0IGhlaWdodCBmb3IgdGhlIHN1cHBsaWVkIGNvbnRyb2wuCi0gICAgICogQHJldHVybiBpbnQKLSAgICAgKiBAcGFyYW0gY29udHJvbCAtIHRoZSBjb250cm9sIGJlaW5nIHF1ZXJpZWQgYWJvdXQgZm9udHMKLSAgICAgKiBAcGFyYW0gbGluZXMgLSB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHNob3duIG9uIHRoZSB0YWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdEZvbnRIZWlnaHQoQ29udHJvbCBjb250cm9sLCBpbnQgbGluZXMpIHsKLSAgICAgICAgRm9udERhdGFbXSB2aWV3ZXJGb250RGF0YSA9IGNvbnRyb2wuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0gICAgICAgIGludCBmb250SGVpZ2h0ID0gMTA7Ci0KLSAgICAgICAgLy9JZiB3ZSBoYXZlIG5vIGZvbnQgZGF0YSB1c2Ugb3VyIGd1ZXNzCi0gICAgICAgIGlmICh2aWV3ZXJGb250RGF0YS5sZW5ndGggPiAwKQotICAgICAgICAgICAgZm9udEhlaWdodCA9IHZpZXdlckZvbnREYXRhWzBdLmdldEhlaWdodCgpOwotICAgICAgICByZXR1cm4gbGluZXMgKiBmb250SGVpZ2h0OwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBwcm9qZWN0cyBzZWxlY3RlZCBieSB0aGUgdXNlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgcHJvamVjdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgSVByb2plY3RbXSBnZXRSZWZlcmVuY2VkUHJvamVjdHMoKSB7Ci0gICAgICAgIE9iamVjdFtdIGVsZW1lbnRzID0gcmVmZXJlbmNlUHJvamVjdHNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0gICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSVByb2plY3RbZWxlbWVudHMubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShlbGVtZW50cywgMCwgcHJvamVjdHMsIDAsIGVsZW1lbnRzLmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvV2l6YXJkUmVzb3VyY2VJbXBvcnRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL2RpYWxvZ3MvV2l6YXJkUmVzb3VyY2VJbXBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OWI3MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9kaWFsb2dzL1dpemFyZFJlc291cmNlSW1wb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuRGlhbG9nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5JRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5SZXNvdXJjZVRyZWVBbmRMaXN0R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hWaWV3ZXJTb3J0ZXI7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGEgdHlwaWNhbCBpbXBvcnQgd2l6YXJkJ3MgbWFpbiBwYWdlLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBzdWJjbGFzcyB0aGlzIHBhZ2UgdG8gaW5oZXJpdCBpdHMgY29tbW9uIGRlc3RpbmF0aW9uIHJlc291cmNlCi0gKiBzZWxlY3Rpb24gZmFjaWxpdGllcy4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCAKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPmNyZWF0ZVNvdXJjZUdyb3VwPC9jb2RlPjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZQotICogPHVsPgotICogICA8bGk+PGNvZGU+YWxsb3dOZXdDb250YWluZXJOYW1lPC9jb2RlPjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG1heSBleHRlbmQKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPmhhbmRsZUV2ZW50PC9jb2RlPjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2l6YXJkUmVzb3VyY2VJbXBvcnRQYWdlIGV4dGVuZHMgV2l6YXJkRGF0YVRyYW5zZmVyUGFnZSB7Ci0gICAgcHJpdmF0ZSBJUmVzb3VyY2UgY3VycmVudFJlc291cmNlU2VsZWN0aW9uOwotCi0gICAgLy8gaW5pdGlhbCB2YWx1ZSBzdG9yZXMKLSAgICBwcml2YXRlIFN0cmluZyBpbml0aWFsQ29udGFpbmVyRmllbGRWYWx1ZTsKLQotICAgIHByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBzZWxlY3RlZFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLy8gd2lkZ2V0cwotICAgIHByaXZhdGUgVGV4dCBjb250YWluZXJOYW1lRmllbGQ7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBjb250YWluZXJCcm93c2VCdXR0b247Ci0KLSAgICBwcm90ZWN0ZWQgUmVzb3VyY2VUcmVlQW5kTGlzdEdyb3VwIHNlbGVjdGlvbkdyb3VwOwotCi0gICAgLy9tZXNzYWdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9GT0xERVJfTUVTU0FHRSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEltcG9ydFBhZ2Vfc3BlY2lmeUZvbGRlcjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9QUk9KRUNUX01FU1NBR0UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRJbXBvcnRQYWdlX3NwZWNpZnlQcm9qZWN0OwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkFDQ0VTU0FCTEVfRk9MREVSX01FU1NBR0UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRJbXBvcnRQYWdlX2ZvbGRlck11c3RFeGlzdDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW1wb3J0IHdpemFyZCBwYWdlLiBJZiB0aGUgaW5pdGlhbCByZXNvdXJjZSBzZWxlY3Rpb24gCi0gICAgICogY29udGFpbnMgZXhhY3RseSBvbmUgY29udGFpbmVyIHJlc291cmNlIHRoZW4gaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0Ci0gICAgICogaW1wb3J0IGRlc3RpbmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhZ2UKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHJlc291cmNlIHNlbGVjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBXaXphcmRSZXNvdXJjZUltcG9ydFBhZ2UoU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0KLSAgICAgICAgLy9Jbml0aWFsaXplIHRvIG51bGwKLSAgICAgICAgY3VycmVudFJlc291cmNlU2VsZWN0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHJlc291cmNlID0gKChJQWRhcHRhYmxlKSBmaXJzdEVsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24gPSAoSVJlc291cmNlKSByZXNvdXJjZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbi5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlU2VsZWN0aW9uID0gY3VycmVudFJlc291cmNlU2VsZWN0aW9uLmdldFBhcmVudCgpOwotCi0gICAgICAgICAgICBpZiAoIWN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbi5pc0FjY2Vzc2libGUoKSkKLSAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkUmVzb3VyY2VJbXBvcnRQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPldpemFyZERhdGFUcmFuc2ZlclBhZ2U8L2NvZGU+IG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LiAKLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd05ld0NvbnRhaW5lck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIGluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRTaXplKGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgY3JlYXRlU291cmNlR3JvdXAoY29tcG9zaXRlKTsKLQotICAgICAgICBjcmVhdGVEZXN0aW5hdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgY3JlYXRlT3B0aW9uc0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgcmVzdG9yZVdpZGdldFZhbHVlcygpOwotICAgICAgICB1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUoZGV0ZXJtaW5lUGFnZUNvbXBsZXRpb24oKSk7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsJLy8gc2hvdWxkIG5vdCBpbml0aWFsbHkgaGF2ZSBlcnJvciBtZXNzYWdlCi0KLSAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGltcG9ydCBkZXN0aW5hdGlvbiBzcGVjaWZpY2F0aW9uIGNvbnRyb2xzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjcmVhdGVEZXN0aW5hdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gY29udGFpbmVyIHNwZWNpZmljYXRpb24gZ3JvdXAKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lckdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgICAgIGNvbnRhaW5lckdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb250YWluZXJHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICAgICAgICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLSAgICAgICAgY29udGFpbmVyR3JvdXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotICAgICAgICAvLyBjb250YWluZXIgbGFiZWwKLSAgICAgICAgTGFiZWwgcmVzb3VyY2VzTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgcmVzb3VyY2VzTGFiZWwuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRJbXBvcnRQYWdlX2ZvbGRlcik7Ci0gICAgICAgIHJlc291cmNlc0xhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgLy8gY29udGFpbmVyIG5hbWUgZW50cnkgZmllbGQKLSAgICAgICAgY29udGFpbmVyTmFtZUZpZWxkID0gbmV3IFRleHQoY29udGFpbmVyR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgY29udGFpbmVyTmFtZUZpZWxkLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLSAgICAgICAgY29udGFpbmVyTmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGNvbnRhaW5lck5hbWVGaWVsZC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIC8vIGNvbnRhaW5lciBicm93c2UgYnV0dG9uCi0gICAgICAgIGNvbnRhaW5lckJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyR3JvdXAsIFNXVC5QVVNIKTsKLSAgICAgICAgY29udGFpbmVyQnJvd3NlQnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkSW1wb3J0UGFnZV9icm93c2UyKTsKLSAgICAgICAgY29udGFpbmVyQnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotICAgICAgICAgICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgICAgICBjb250YWluZXJCcm93c2VCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgICAgIGNvbnRhaW5lckJyb3dzZUJ1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBzZXRCdXR0b25MYXlvdXREYXRhKGNvbnRhaW5lckJyb3dzZUJ1dHRvbik7Ci0KLSAgICAgICAgaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyRmllbGQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglDcmVhdGUgdGhlIGltcG9ydCBzb3VyY2Ugc2VsZWN0aW9uIHdpZGdldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbGVTZWxlY3Rpb25Hcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgLy9KdXN0IGNyZWF0ZSB3aXRoIGEgZHVtbXkgcm9vdC4KLSAgICAgICAgdGhpcy5zZWxlY3Rpb25Hcm91cCA9IG5ldyBSZXNvdXJjZVRyZWVBbmRMaXN0R3JvdXAocGFyZW50LAotICAgICAgICAgICAgICAgIG5ldyBGaWxlU3lzdGVtRWxlbWVudCgiRHVtbXkiLCBudWxsLCB0cnVlKSwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgZ2V0Rm9sZGVyUHJvdmlkZXIoKSwgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwKLSAgICAgICAgICAgICAgICBnZXRGaWxlUHJvdmlkZXIoKSwgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgU1dULk5PTkUsCi0gICAgICAgICAgICAgICAgRGlhbG9nVXRpbC5pblJlZ3VsYXJGb250TW9kZShwYXJlbnQpKTsKLQotICAgICAgICBJQ2hlY2tTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBXb3JrYmVuY2hWaWV3ZXJTb3J0ZXIgc29ydGVyID0gbmV3IFdvcmtiZW5jaFZpZXdlclNvcnRlcigpOwotICAgICAgICB0aGlzLnNlbGVjdGlvbkdyb3VwLnNldFRyZWVTb3J0ZXIoc29ydGVyKTsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb25Hcm91cC5zZXRMaXN0U29ydGVyKHNvcnRlcik7Ci0gICAgICAgIHRoaXMuc2VsZWN0aW9uR3JvdXAuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGltcG9ydCBzb3VyY2Ugc3BlY2lmaWNhdGlvbiBjb250cm9scy4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlU291cmNlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLSAgICAvKgotICAgICAqIEBzZWUgV2l6YXJkRGF0YVRyYW5zZmVyUGFnZS5nZXRFcnJvckRpYWxvZ1RpdGxlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yRGlhbG9nVGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRJbXBvcnRQYWdlX2Vycm9yRGlhbG9nVGl0bGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgY29udGFpbmVyIHJlc291cmNlIHNwZWNpZmllZCBpbiB0aGUgY29udGFpbmVyCi0gICAgICogbmFtZSBlbnRyeSBmaWVsZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbmFtZSBoYXMgYmVlbiB0eXBlZCBpbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29udGFpbmVyIHNwZWNpZmllZCBieSB0aGUgZnVsbCBwYXRoIG1pZ2h0IG5vdCBleGlzdCBhbmQgd291bGQgbmVlZCB0bwotICAgICAqIGJlIGNyZWF0ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZnVsbCBwYXRoIG9mIHRoZSBjb250YWluZXIgcmVzb3VyY2Ugc3BlY2lmaWVkIGluCi0gICAgICogICB0aGUgY29udGFpbmVyIG5hbWUgZW50cnkgZmllbGQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIElQYXRoIGdldENvbnRhaW5lckZ1bGxQYXRoKCkgewotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXRQbHVnaW5Xb3Jrc3BhY2UoKTsKLQotICAgICAgICAvL21ha2UgdGhlIHBhdGggYWJzb2x1dGUgdG8gYWxsb3cgZm9yIG9wdGlvbmFsIGxlYWRpbmcgc2xhc2gKLSAgICAgICAgSVBhdGggdGVzdFBhdGggPSBnZXRSZXNvdXJjZVBhdGgoKTsKLQotICAgICAgICBpZiAodGVzdFBhdGguZXF1YWxzKHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RnVsbFBhdGgoKSkpCi0gICAgICAgICAgICByZXR1cm4gdGVzdFBhdGg7Ci0KLSAgICAgICAgSVN0YXR1cyByZXN1bHQgPSB3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHRlc3RQYXRoLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgSVJlc291cmNlLlBST0pFQ1QgfCBJUmVzb3VyY2UuRk9MREVSIHwgSVJlc291cmNlLlJPT1QpOwotICAgICAgICBpZiAocmVzdWx0LmlzT0soKSkgewotICAgICAgICAgICAgcmV0dXJuIHRlc3RQYXRoOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbnRlbnQgcHJvdmlkZXIgZm9yIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPnMgdGhhdCByZXR1cm5zIAotICAgICAqIG9ubHkgZmlsZXMgYXMgY2hpbGRyZW4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IElUcmVlQ29udGVudFByb3ZpZGVyIGdldEZpbGVQcm92aWRlcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbnRlbnQgcHJvdmlkZXIgZm9yIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPnMgdGhhdCByZXR1cm5zIAotICAgICAqIG9ubHkgZm9sZGVycyBhcyBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Rm9sZGVyUHJvdmlkZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcGF0aCBmb3IgdGhlIHJlc291cmNlIGZpZWxkLgotICAgICAqIEByZXR1cm4gSVBhdGgKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVBhdGggZ2V0UmVzb3VyY2VQYXRoKCkgewotICAgICAgICByZXR1cm4gZ2V0UGF0aEZyb21UZXh0KHRoaXMuY29udGFpbmVyTmFtZUZpZWxkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgcGFnZSdzIGxpc3Qgb2YgY3VycmVudGx5LXNwZWNpZmllZCByZXNvdXJjZXMgdG8gYmUgCi0gICAgICogaW1wb3J0ZWQuIFRoaXMgaXMgdGhlIHByaW1hcnkgcmVzb3VyY2Ugc2VsZWN0aW9uIGZhY2lsaXR5IGFjY2Vzc29yIGZvciAKLSAgICAgKiBzdWJjbGFzc2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgcmVzb3VyY2VzIGN1cnJlbnRseSBzZWxlY3RlZCAKLSAgICAgKiBmb3IgZXhwb3J0IChlbGVtZW50IHR5cGU6IDxjb2RlPklSZXNvdXJjZTwvY29kZT4pCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNlbGVjdGVkUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Hcm91cC5nZXRBbGxDaGVja2VkTGlzdEl0ZW1zKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHBhZ2UncyBsaXN0IG9mIGN1cnJlbnRseS1zcGVjaWZpZWQgcmVzb3VyY2VzIHRvIGJlIAotICAgICAqIGltcG9ydGVkIGZpbHRlcmVkIGJ5IHRoZSBJRWxlbWVudEZpbHRlci4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdldFNlbGVjdGVkUmVzb3VyY2VzKElFbGVtZW50RmlsdGVyIGZpbHRlciwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb25Hcm91cC5nZXRBbGxDaGVja2VkTGlzdEl0ZW1zKGZpbHRlciwgbW9uaXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGFpbmVyIHJlc291cmNlIHNwZWNpZmllZCBpbiB0aGUgY29udGFpbmVyIG5hbWUgZW50cnkgZmllbGQsCi0gICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgc3VjaCBhIGNvbnRhaW5lciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgd29ya2JlbmNoLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY29udGFpbmVyIHJlc291cmNlIHNwZWNpZmllZCBpbiB0aGUgY29udGFpbmVyIG5hbWUgZW50cnkgZmllbGQsCi0gICAgICogICBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCBJQ29udGFpbmVyIGdldFNwZWNpZmllZENvbnRhaW5lcigpIHsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0UGx1Z2luV29ya3NwYWNlKCk7Ci0gICAgICAgIElQYXRoIHBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotICAgICAgICBpZiAod29ya3NwYWNlLmdldFJvb3QoKS5leGlzdHMocGF0aCkpewotICAgICAgICAJSVJlc291cmNlIHJlc291cmNlID0gd29ya3NwYWNlLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOwotICAgICAgICAJaWYocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotICAgICAgICAJCXJldHVybiBudWxsOwotICAgICAgICAJcmV0dXJuIChJQ29udGFpbmVyKSByZXNvdXJjZTsKLSAgICAgICAgCQotICAgICAgICB9Ci0gICAgICAgICAgICAKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGUgY3VycmVudGx5LXNwZWNpZmllZCByZXNvdXJjZSB0eXBlcyBmb3IKLSAgICAgKiB1c2UgYnkgdGhlIHR5cGUgc2VsZWN0aW9uIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0VHlwZXNUb0ltcG9ydCgpIHsKLQotICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhIGNvbnRhaW5lciBzZWxlY3Rpb24gZGlhbG9nIGFuZCBkaXNwbGF5cyB0aGUgdXNlcidzIHN1YnNlcXVlbnQKLSAgICAgKiBjb250YWluZXIgcmVzb3VyY2Ugc2VsZWN0aW9uIGluIHRoaXMgcGFnZSdzIGNvbnRhaW5lciBuYW1lIGZpZWxkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUNvbnRhaW5lckJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0gICAgICAgIC8vIHNlZSBpZiB0aGUgdXNlciB3aXNoZXMgdG8gbW9kaWZ5IHRoaXMgY29udGFpbmVyIHNlbGVjdGlvbgotICAgICAgICBJUGF0aCBjb250YWluZXJQYXRoID0gcXVlcnlGb3JDb250YWluZXIoZ2V0U3BlY2lmaWVkQ29udGFpbmVyKCksCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkSW1wb3J0UGFnZV9zZWxlY3RGb2xkZXJMYWJlbCwKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRJbXBvcnRQYWdlX3NlbGVjdEZvbGRlclRpdGxlKTsKLQotICAgICAgICAvLyBpZiBhIGNvbnRhaW5lciB3YXMgc2VsZWN0ZWQgdGhlbiBwdXQgaXRzIG5hbWUgaW4gdGhlIGNvbnRhaW5lciBuYW1lIGZpZWxkCi0gICAgICAgIGlmIChjb250YWluZXJQYXRoICE9IG51bGwpIHsgLy8gbnVsbCBtZWFucyB1c2VyIGNhbmNlbGxlZAotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICAgICAgY29udGFpbmVyTmFtZUZpZWxkLnNldFRleHQoY29udGFpbmVyUGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XaXphcmRSZXNvdXJjZUltcG9ydFBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+TGlzdGVuZXI8L2NvZGU+IG1ldGhvZCBoYW5kbGVzIGFsbCBldmVudHMgYW5kIGVuYWJsZW1lbnRzIGZvciBjb250cm9scwotICAgICAqIG9uIHRoaXMgcGFnZS4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotICAgICAqIEBwYXJhbSBldmVudCBFdmVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFdpZGdldCBzb3VyY2UgPSBldmVudC53aWRnZXQ7Ci0KLSAgICAgICAgaWYgKHNvdXJjZSA9PSBjb250YWluZXJCcm93c2VCdXR0b24pCi0gICAgICAgICAgICBoYW5kbGVDb250YWluZXJCcm93c2VCdXR0b25QcmVzc2VkKCk7Ci0KLSAgICAgICAgdXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglPcGVuIGEgcmVnaXN0ZXJlZCB0eXBlIHNlbGVjdGlvbiBkaWFsb2cgYW5kIG5vdGUgdGhlIHNlbGVjdGlvbnMKLSAgICAgKglpbiB0aGUgcmVjZWl2ZXJzIHR5cGVzLXRvLWV4cG9ydCBmaWVsZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGVzRWRpdEJ1dHRvblByZXNzZWQoKSB7Ci0KLSAgICAgICAgVHlwZUZpbHRlcmluZ0RpYWxvZyBkaWFsb2cgPSBuZXcgVHlwZUZpbHRlcmluZ0RpYWxvZyhnZXRDb250YWluZXIoKQotICAgICAgICAgICAgICAgIC5nZXRTaGVsbCgpLCBnZXRUeXBlc1RvSW1wb3J0KCkpOwotCi0gICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgT2JqZWN0W10gbmV3U2VsZWN0ZWRUeXBlcyA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgaWYgKG5ld1NlbGVjdGVkVHlwZXMgIT0gbnVsbCkgeyAvLyBpZS4tIGRpZCBub3QgcHJlc3MgQ2FuY2VsCi0gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KG5ld1NlbGVjdGVkVHlwZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2VsZWN0ZWRUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVHlwZXMuYWRkKG5ld1NlbGVjdGVkVHlwZXNbaV0pOwotCi0gICAgICAgICAgICBzZXR1cFNlbGVjdGlvbnNCYXNlZE9uU2VsZWN0ZWRUeXBlcygpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbml0aWFsIGNvbnRlbnRzIG9mIHRoZSBjb250YWluZXIgbmFtZSBmaWVsZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0aWFsUG9wdWxhdGVDb250YWluZXJGaWVsZCgpIHsKLSAgICAgICAgaWYgKGluaXRpYWxDb250YWluZXJGaWVsZFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICBjb250YWluZXJOYW1lRmllbGQuc2V0VGV4dChpbml0aWFsQ29udGFpbmVyRmllbGRWYWx1ZSk7Ci0gICAgICAgIGVsc2UgaWYgKGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgY29udGFpbmVyTmFtZUZpZWxkLnNldFRleHQoY3VycmVudFJlc291cmNlU2VsZWN0aW9uLmdldEZ1bGxQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBhbGwgb2YgdGhlIHNlbGVjdGlvbnMgaW4gdGhlIHNlbGVjdGlvbiBncm91cCB0byB2YWx1ZQotICAgICAqIEBwYXJhbSB2YWx1ZSBib29sZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QWxsU2VsZWN0aW9ucyhib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIHNlbGVjdGlvbkdyb3VwLnNldEFsbFNlbGVjdGlvbnModmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgcGFnZSdzIGNvbnRhaW5lciByZXNvdXJjZSBmaWVsZCwgb3Igc3RvcmVzCi0gICAgICogaXQgZm9yIGZ1dHVyZSB1c2UgaWYgdGhpcyBwYWdlJ3MgY29udHJvbHMgZG8gbm90IGV4aXN0IHlldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXJGaWVsZFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAoY29udGFpbmVyTmFtZUZpZWxkID09IG51bGwpCi0gICAgICAgICAgICBpbml0aWFsQ29udGFpbmVyRmllbGRWYWx1ZSA9IHZhbHVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250YWluZXJOYW1lRmllbGQuc2V0VGV4dCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSB0cmVlIHRvIG9ubHkgc2VsZWN0IHRob3NlIGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdGVkIHR5cGVzLgotICAgICAqIERvIG5vdGhpbmcgYnkgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFNlbGVjdGlvbnNCYXNlZE9uU2VsZWN0ZWRUeXBlcygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHNlbGVjdGlvbnMgd2l0aCB0aG9zZSBpbiBtYXAgLgotICAgICAqIEBwYXJhbSBtYXAgTWFwIC0ga2V5IHRyZWUgZWxlbWVudHMsIHZhbHVlcyBMaXN0cyBvZiBsaXN0IGVsZW1lbnRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9ucyhmaW5hbCBNYXAgbWFwKSB7Ci0KLSAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uR3JvdXAudXBkYXRlU2VsZWN0aW9ucyhtYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBydW5uYWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgd2lkZ2V0cyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZCBieSBhIGNoYW5nZSBpbiB0aGUgZGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCkgewotCi0gICAgICAgIGJvb2xlYW4gcGFnZUNvbXBsZXRlID0gZGV0ZXJtaW5lUGFnZUNvbXBsZXRpb24oKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHBhZ2VDb21wbGV0ZSk7Ci0gICAgICAgIGlmIChwYWdlQ29tcGxldGUpCi0gICAgICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotICAgICAgICBzdXBlci51cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV2l6YXJkRGF0YVRyYW5zZmVyUGFnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB2YWxpZGF0ZURlc3RpbmF0aW9uR3JvdXAoKSB7Ci0KLSAgICAgICAgSVBhdGggY29udGFpbmVyUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0gICAgICAgIGlmIChjb250YWluZXJQYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldE1lc3NhZ2UoRU1QVFlfRk9MREVSX01FU1NBR0UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIGNvbnRhaW5lciBleGlzdCwgdmFsaWRhdGUgaXQKLSAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSBnZXRTcGVjaWZpZWRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0gICAgICAgIAkvL0lmIGl0IGV4aXN0cyBidXQgaXMgbm90IHZhbGlkIHRoZW4gYWJvcnQKLSAgICAgICAgCWlmKElERVdvcmtiZW5jaFBsdWdpbi5nZXRQbHVnaW5Xb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKGdldENvbnRhaW5lckZ1bGxQYXRoKCkpKQotICAgICAgICAJCXJldHVybiBmYWxzZTsKLSAgICAgICAgCQotICAgICAgICAgICAgLy9pZiBpdCBpcyBkb2VzIG5vdCBleGlzdCBiZSBzdXJlIHRoZSBwcm9qZWN0IGRvZXMKLSAgICAgICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gSURFV29ya2JlbmNoUGx1Z2luLmdldFBsdWdpbldvcmtzcGFjZSgpOwotICAgICAgICAgICAgSVBhdGggcHJvamVjdFBhdGggPSBjb250YWluZXJQYXRoLnJlbW92ZUxhc3RTZWdtZW50cyhjb250YWluZXJQYXRoCi0gICAgICAgICAgICAgICAgICAgIC5zZWdtZW50Q291bnQoKSAtIDEpOwotCi0gICAgICAgICAgICBpZiAod29ya3NwYWNlLmdldFJvb3QoKS5leGlzdHMocHJvamVjdFBhdGgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEltcG9ydFBhZ2VfcHJvamVjdE5vdEV4aXN0KTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSAKLSAgICAgICAgaWYgKCFjb250YWluZXIuaXNBY2Nlc3NpYmxlKCkpIHsKLSAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoSU5BQ0NFU1NBQkxFX0ZPTERFUl9NRVNTQUdFKTsKLSAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2NhdGlvbigpID09IG51bGwpIHsKLSAgICAgICAgICBpZiAoY29udGFpbmVyLmlzTGlua2VkKCkpIHsKLSAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRJbXBvcnRQYWdlX3VuZGVmaW5lZFBhdGhWYXJpYWJsZSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRJbXBvcnRQYWdlX2NvbnRhaW5lck5vdEV4aXN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgaWYgKHNvdXJjZUNvbmZsaWN0c1dpdGhEZXN0aW5hdGlvbihjb250YWluZXJQYXRoKSkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKGdldFNvdXJjZUNvbmZsaWN0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCl7Ci0gICAgICAgIAlzZXRFcnJvck1lc3NhZ2UoRU1QVFlfUFJPSkVDVF9NRVNTQUdFKTsKLSAgICAgICAgCXJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHdoZW4gdGhlIHNvdXJjZSBjb25mbGljdHMKLSAgICAgKiB3aXRoIHRoZSBkZXN0aW5hdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFNvdXJjZUNvbmZsaWN0TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIChJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRJbXBvcnRQYWdlX2ltcG9ydE9uUmVjZWl2ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHNvdXJjZSBsb2NhdGlvbiBjb25mbGljdHMKLSAgICAgKiB3aXRoIHRoZSBkZXN0aW5hdGlvbiByZXNvdXJjZS4gQnkgZGVmYXVsdCB0aGlzIGlzIG5vdAotICAgICAqIGNoZWNrZWQsIHNvIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlUGF0aCB0aGUgcGF0aCBiZWluZyBjaGVja2VkCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc291cmNlIGxvY2F0aW9uIGNvbmZsaWN0cyB3aXRoIHRoZQotICAgICAqICAgZGVzdGluYXRpb24gcmVzb3VyY2UsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzb3VyY2VDb25mbGljdHNXaXRoRGVzdGluYXRpb24oSVBhdGggc291cmNlUGF0aCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIFdpemFyZERhdGFUcmFuc2ZlclBhZ2UuZGV0ZXJtaW5lUGFnZUNvbXBsZXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZGV0ZXJtaW5lUGFnZUNvbXBsZXRpb24oKSB7Ci0gICAgICAgIC8vQ2hlY2sgZm9yIHZhbGlkIHByb2plY3RzIGJlZm9yZSBtYWtpbmcgdGhlIHVzZXIgZG8gYW55dGhpbmcgCi0gICAgICAgIGlmIChub09wZW5Qcm9qZWN0cygpKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkSW1wb3J0UGFnZV9ub09wZW5Qcm9qZWN0cyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmRldGVybWluZVBhZ2VDb21wbGV0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcGFzc2VkIHdvcmtzcGFjZSBoYXMgYW55IAotICAgICAqIG9wZW4gcHJvamVjdHMKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbm9PcGVuUHJvamVjdHMoKSB7Ci0gICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0UGx1Z2luV29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0gICAgICAgICAgICAgICAgLmdldFByb2plY3RzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwcm9qZWN0c1tpXS5pc09wZW4oKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9tb2RlbC9Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvbW9kZWwvV29ya2JlbmNoQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmFlNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9tb2RlbC9Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVHJlZSBjb250ZW50IHByb3ZpZGVyIGZvciByZXNvdXJjZSBvYmplY3RzIHRoYXQgY2FuIGJlIGFkYXB0ZWQgdG8gdGhlCi0gKiBpbnRlcmZhY2Uge0BsaW5rIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyIElXb3JrYmVuY2hBZGFwdGVyfS4KLSAqIFRoaXMgcHJvdmlkZXIgd2lsbCBsaXN0ZW4gZm9yIHJlc291cmNlIGNoYW5nZXMgd2l0aGluIHRoZSB3b3Jrc3BhY2UgYW5kCi0gKiB1cGRhdGUgdGhlIHZpZXdlciBhcyBuZWNlc3NhcnkuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCwgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQmFzZVdvcmtiZW5jaENvbnRlbnRQcm92aWRlcgotCQlpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQlwcml2YXRlIFZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSByZXNvdXJjZSBjb250ZW50IHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udGVudFByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBudWxsOwotCQkJT2JqZWN0IG9iaiA9IHZpZXdlci5nZXRJbnB1dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpIHsKLQkJCQl3b3Jrc3BhY2UgPSAoSVdvcmtzcGFjZSkgb2JqOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJd29ya3NwYWNlID0gKChJQ29udGFpbmVyKSBvYmopLmdldFdvcmtzcGFjZSgpOwotCQkJfQotCQkJaWYgKHdvcmtzcGFjZSAhPSBudWxsKSB7Ci0JCQkJd29ya3NwYWNlLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udGVudFByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlzdXBlci5pbnB1dENoYW5nZWQodmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCi0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCQlJV29ya3NwYWNlIG9sZFdvcmtzcGFjZSA9IG51bGw7Ci0JCUlXb3Jrc3BhY2UgbmV3V29ya3NwYWNlID0gbnVsbDsKLQotCQlpZiAob2xkSW5wdXQgaW5zdGFuY2VvZiBJV29ya3NwYWNlKSB7Ci0JCQlvbGRXb3Jrc3BhY2UgPSAoSVdvcmtzcGFjZSkgb2xkSW5wdXQ7Ci0JCX0gZWxzZSBpZiAob2xkSW5wdXQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQlvbGRXb3Jrc3BhY2UgPSAoKElDb250YWluZXIpIG9sZElucHV0KS5nZXRXb3Jrc3BhY2UoKTsKLQkJfQotCi0JCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpIHsKLQkJCW5ld1dvcmtzcGFjZSA9IChJV29ya3NwYWNlKSBuZXdJbnB1dDsKLQkJfSBlbHNlIGlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCW5ld1dvcmtzcGFjZSA9ICgoSUNvbnRhaW5lcikgbmV3SW5wdXQpLmdldFdvcmtzcGFjZSgpOwotCQl9Ci0KLQkJaWYgKG9sZFdvcmtzcGFjZSAhPSBuZXdXb3Jrc3BhY2UpIHsKLQkJCWlmIChvbGRXb3Jrc3BhY2UgIT0gbnVsbCkgewotCQkJCW9sZFdvcmtzcGFjZS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQkJaWYgKG5ld1dvcmtzcGFjZSAhPSBudWxsKSB7Ci0JCQkJbmV3V29ya3NwYWNlLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywKLQkJCQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKGZpbmFsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLQkJcHJvY2Vzc0RlbHRhKGV2ZW50LmdldERlbHRhKCkpOwotCi0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgcmVzb3VyY2UgZGVsdGEuCi0JICogCi0JICogQHBhcmFtIGRlbHRhCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CQkKLQotCQlDb250cm9sIGN0cmwgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQkKLQkJCi0JCWZpbmFsIENvbGxlY3Rpb24gcnVubmFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcm9jZXNzRGVsdGEoZGVsdGEsIHJ1bm5hYmxlcyk7Ci0KLQkJaWYgKHJ1bm5hYmxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJLy9BcmUgd2UgaW4gdGhlIFVJVGhyZWFkPyBJZiBzbyBzcGluIGl0IHVudGlsIHdlIGFyZSBkb25lCi0JCWlmIChjdHJsLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQlydW5VcGRhdGVzKHJ1bm5hYmxlcyk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvL0Fib3J0IGlmIHRoaXMgaGFwcGVucyBhZnRlciBkaXNwb3NlcwotCQkJCQlDb250cm9sIGN0cmwgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQkJCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJCQkJcmV0dXJuOwotCQkJCQkKLQkJCQkJcnVuVXBkYXRlcyhydW5uYWJsZXMpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSdW4gYWxsIG9mIHRoZSBydW5uYWJsZXMgdGhhdCBhcmUgdGhlIHdpZGdldCB1cGRhdGVzCi0JICogQHBhcmFtIHJ1bm5hYmxlcwotCSAqLwotCXByaXZhdGUgdm9pZCBydW5VcGRhdGVzKENvbGxlY3Rpb24gcnVubmFibGVzKSB7Ci0JCUl0ZXJhdG9yIHJ1bm5hYmxlSXRlcmF0b3IgPSBydW5uYWJsZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUocnVubmFibGVJdGVyYXRvci5oYXNOZXh0KCkpewotCQkJKChSdW5uYWJsZSlydW5uYWJsZUl0ZXJhdG9yLm5leHQoKSkucnVuKCk7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogUHJvY2VzcyBhIHJlc291cmNlIGRlbHRhLiBBZGQgYW55IHJ1bm5hYmxlcwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEsIENvbGxlY3Rpb24gcnVubmFibGVzKSB7Ci0JCS8vaGUgd2lkZ2V0IG1heSBoYXZlIGJlZW4gZGVzdHJveWVkCi0JCS8vIGJ5IHRoZSB0aW1lIHRoaXMgaXMgcnVuLiBDaGVjayBmb3IgdGhpcyBhbmQgZG8gbm90aGluZyBpZiBzby4KLQkJQ29udHJvbCBjdHJsID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCQkvLyBHZXQgdGhlIGFmZmVjdGVkIHJlc291cmNlCi0JCWZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCi0JCS8vIElmIGFueSBjaGlsZHJlbiBoYXZlIGNoYW5nZWQgdHlwZSwganVzdCBkbyBhIGZ1bGwgcmVmcmVzaCBvZiB0aGlzCi0JCS8vIHBhcmVudCwKLQkJLy8gc2luY2UgYSBzaW1wbGUgdXBkYXRlIG9uIHN1Y2ggY2hpbGRyZW4gd29uJ3Qgd29yaywKLQkJLy8gYW5kIHRyeWluZyB0byBtYXAgdGhlIGNoYW5nZSB0byBhIHJlbW92ZSBhbmQgYWRkIGlzIHRvbyBkaWNleS4KLQkJLy8gVGhlIGNhc2UgaXM6IGZvbGRlciBBIHJlbmFtZWQgdG8gZXhpc3RpbmcgZmlsZSBCLCBhbnN3ZXJpbmcgeWVzIHRvCi0JCS8vIG92ZXJ3cml0ZSBCLgotCQlJUmVzb3VyY2VEZWx0YVtdIGFmZmVjdGVkQ2hpbGRyZW4gPSBkZWx0YQotCQkJCS5nZXRBZmZlY3RlZENoaWxkcmVuKElSZXNvdXJjZURlbHRhLkNIQU5HRUQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgoYWZmZWN0ZWRDaGlsZHJlbltpXS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuVFlQRSkgIT0gMCkgewotCQkJCXJ1bm5hYmxlcy5hZGQoZ2V0UmVmcmVzaFJ1bm5hYmxlKHJlc291cmNlKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gQ2hlY2sgdGhlIGZsYWdzIGZvciBjaGFuZ2VzIHRoZSBOYXZpZ2F0b3IgY2FyZXMgYWJvdXQuCi0JCS8vIFNlZSBSZXNvdXJjZUxhYmVsUHJvdmlkZXIgZm9yIHRoZSBhc3BlY3RzIGl0IGNhcmVzIGFib3V0LgotCQkvLyBOb3RpY2Ugd2UgZG9uJ3QgY2FyZSBhYm91dCBGX0NPTlRFTlQgb3IgRl9NQVJLRVJTIGN1cnJlbnRseS4KLQkJaW50IGNoYW5nZUZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJaWYgKChjaGFuZ2VGbGFncyAmIChJUmVzb3VyY2VEZWx0YS5PUEVOIHwgSVJlc291cmNlRGVsdGEuU1lOQwotCQkJCXwgSVJlc291cmNlRGVsdGEuVFlQRSB8IElSZXNvdXJjZURlbHRhLkRFU0NSSVBUSU9OKSkgIT0gMCkgewotCQkJUnVubmFibGUgdXBkYXRlUnVubmFibGUgPSAgbmV3IFJ1bm5hYmxlKCl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcikudXBkYXRlKHJlc291cmNlLCBudWxsKTsKLQkJCQl9Ci0JCQl9OwotCQkJcnVubmFibGVzLmFkZCh1cGRhdGVSdW5uYWJsZSk7Ci0JCX0KLQkJLy8gUmVwbGFjaW5nIGEgcmVzb3VyY2UgbWF5IGFmZmVjdCBpdHMgbGFiZWwgYW5kIGl0cyBjaGlsZHJlbgotCQlpZiAoKGNoYW5nZUZsYWdzICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpICE9IDApIHsKLQkJCXJ1bm5hYmxlcy5hZGQoZ2V0UmVmcmVzaFJ1bm5hYmxlKHJlc291cmNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCi0JCS8vIEhhbmRsZSBjaGFuZ2VkIGNoaWxkcmVuIC4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZmZlY3RlZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9jZXNzRGVsdGEoYWZmZWN0ZWRDaGlsZHJlbltpXSwgcnVubmFibGVzKTsKLQkJfQotCi0JCS8vIEBpc3N1ZSBzZXZlcmFsIHByb2JsZW1zIGhlcmU6Ci0JCS8vICAtIHNob3VsZCBwcm9jZXNzIHJlbW92YWxzIGJlZm9yZSBhZGRpdGlvbnMsIHRvIGF2b2lkIG11bHRpcGxlIGVxdWFsCi0JCS8vIGVsZW1lbnRzIGluIHZpZXdlcgotCQkvLyAgIC0gS2ltOiBwcm9jZXNzaW5nIHJlbW92YWxzIGJlZm9yZSBhZGRpdGlvbnMgd2FzIHRoZSBpbmRpcmVjdCBjYXVzZSBvZgotCQkvLyA0NDA4MSBhbmQgaXRzIHZhcmllbnRzCi0JCS8vICAgLSBOaWNrOiBubyBkZWx0YSBzaG91bGQgaGF2ZSBhbiBhZGQgYW5kIGEgcmVtb3ZlIG9uIHRoZSBzYW1lIGVsZW1lbnQsCi0JCS8vIHNvIHByb2Nlc3NpbmcgYWRkcyBmaXJzdCBpcyBwcm9iYWJseSBPSwotCQkvLyAgLSB1c2luZyBzZXRSZWRyYXcgd2lsbCBjYXVzZSBleHRyYSBmbGFzaGluZXNzCi0JCS8vICAtIHNldFJlZHJhdyBpcyB1c2VkIGV2ZW4gZm9yIHNpbXBsZSBjaGFuZ2VzCi0JCS8vICAtIHRvIGF2b2lkIHNlZWluZyBhIHJlbmFtZSBpbiB0d28gc3RhZ2VzLCBzaG91bGQgdHVybiByZWRyYXcgb24vb2ZmCi0JCS8vIGFyb3VuZCBjb21iaW5lZCByZW1vdmFsIGFuZCBhZGRpdGlvbgotCQkvLyAgIC0gS2ltOiBkb25lLCBhbmQgb25seSBpbiB0aGUgY2FzZSBvZiBhIHJlbmFtZSAoYm90aCByZW1vdmUgYW5kIGFkZAotCQkvLyBjaGFuZ2VzIGluIG9uZSBkZWx0YSkuCi0KLQkJSVJlc291cmNlRGVsdGFbXSBhZGRlZENoaWxkcmVuID0gZGVsdGEKLQkJCQkuZ2V0QWZmZWN0ZWRDaGlsZHJlbihJUmVzb3VyY2VEZWx0YS5BRERFRCk7Ci0JCUlSZXNvdXJjZURlbHRhW10gcmVtb3ZlZENoaWxkcmVuID0gZGVsdGEKLQkJCQkuZ2V0QWZmZWN0ZWRDaGlsZHJlbihJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKTsKLQotCQlpZiAoYWRkZWRDaGlsZHJlbi5sZW5ndGggPT0gMCAmJiByZW1vdmVkQ2hpbGRyZW4ubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJZmluYWwgT2JqZWN0W10gYWRkZWRPYmplY3RzOwotCQlmaW5hbCBPYmplY3RbXSByZW1vdmVkT2JqZWN0czsKLQotCQkvLyBQcm9jZXNzIGFkZGl0aW9ucyBiZWZvcmUgcmVtb3ZhbHMgYXMgdG8gbm90IGNhdXNlIHNlbGVjdGlvbgotCQkvLyBwcmVzZXJ2YXRpb24gcHJpb3IgdG8gbmV3IG9iamVjdHMgYmVpbmcgYWRkZWQKLQkJLy8gSGFuZGxlIGFkZGVkIGNoaWxkcmVuLiBJc3N1ZSBvbmUgdXBkYXRlIGZvciBhbGwgaW5zZXJ0aW9ucy4KLQkJaW50IG51bU1vdmVkRnJvbSA9IDA7Ci0JCWludCBudW1Nb3ZlZFRvID0gMDsKLQkJaWYgKGFkZGVkQ2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJYWRkZWRPYmplY3RzID0gbmV3IE9iamVjdFthZGRlZENoaWxkcmVuLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZGVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlhZGRlZE9iamVjdHNbaV0gPSBhZGRlZENoaWxkcmVuW2ldLmdldFJlc291cmNlKCk7Ci0JCQkJaWYgKChhZGRlZENoaWxkcmVuW2ldLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwKSB7Ci0JCQkJCSsrbnVtTW92ZWRGcm9tOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlCi0JCQlhZGRlZE9iamVjdHMgPSBuZXcgT2JqZWN0WzBdOwotCi0JCS8vIEhhbmRsZSByZW1vdmVkIGNoaWxkcmVuLiBJc3N1ZSBvbmUgdXBkYXRlIGZvciBhbGwgcmVtb3ZhbHMuCi0JCWlmIChyZW1vdmVkQ2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJcmVtb3ZlZE9iamVjdHMgPSBuZXcgT2JqZWN0W3JlbW92ZWRDaGlsZHJlbi5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlyZW1vdmVkT2JqZWN0c1tpXSA9IHJlbW92ZWRDaGlsZHJlbltpXS5nZXRSZXNvdXJjZSgpOwotCQkJCWlmICgocmVtb3ZlZENoaWxkcmVuW2ldLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkgewotCQkJCQkrK251bU1vdmVkVG87Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVtb3ZlZE9iamVjdHMgPSBuZXcgT2JqZWN0WzBdOwotCQl9Ci0JCS8vIGhldXJpc3RpYyB0ZXN0IGZvciBpdGVtcyBtb3Zpbmcgd2l0aGluIHNhbWUgZm9sZGVyIChpLmUuIHJlbmFtZXMpCi0JCWZpbmFsIGJvb2xlYW4gaGFzUmVuYW1lID0gbnVtTW92ZWRGcm9tID4gMCAmJiBudW1Nb3ZlZFRvID4gMDsKLQkJCi0JCVJ1bm5hYmxlIGFkZEFuZFJlbW92ZSA9IG5ldyBSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpIHsKLQkJCQkJQWJzdHJhY3RUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAoQWJzdHJhY3RUcmVlVmlld2VyKSB2aWV3ZXI7Ci0JCQkJCS8vIERpc2FibGUgcmVkcmF3IHVudGlsIHRoZSBvcGVyYXRpb24gaXMgZmluaXNoZWQgc28gd2UgZG9uJ3QKLQkJCQkJLy8gZ2V0IGEgZmxhc2ggb2YgYm90aCB0aGUgbmV3IGFuZCBvbGQgaXRlbSAoaW4gdGhlIGNhc2Ugb2YKLQkJCQkJLy8gcmVuYW1lKQotCQkJCQkvLyBPbmx5IGRvIHRoaXMgaWYgd2UncmUgYm90aCBhZGRpbmcgYW5kIHJlbW92aW5nIGZpbGVzICh0aGUKLQkJCQkJLy8gcmVuYW1lIGNhc2UpCi0JCQkJCWlmIChoYXNSZW5hbWUpIHsKLQkJCQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChhZGRlZE9iamVjdHMubGVuZ3RoID4gMCkKLQkJCQkJCQl0cmVlVmlld2VyLmFkZChyZXNvdXJjZSwgYWRkZWRPYmplY3RzKTsKLQkJCQkJCWlmIChyZW1vdmVkT2JqZWN0cy5sZW5ndGggPiAwKQotCQkJCQkJCXRyZWVWaWV3ZXIucmVtb3ZlKHJlbW92ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCWlmIChoYXNSZW5hbWUpIHsKLQkJCQkJCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcikucmVmcmVzaChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlydW5uYWJsZXMuYWRkKGFkZEFuZFJlbW92ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcnVubmFibGUgZm9yIHJlZnJlc2hpbmcgYSByZXNvdXJjZS4KLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIFJ1bm5hYmxlCi0JICovCi0JcHJpdmF0ZSBSdW5uYWJsZSBnZXRSZWZyZXNoUnVubmFibGUoZmluYWwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcikucmVmcmVzaChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9wYXJ0L0ZpbGVFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9wYXJ0L0ZpbGVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTdlOGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvcGFydC9GaWxlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBBZGFwdGVyIGZvciBtYWtpbmcgYSBmaWxlIHJlc291cmNlIGEgc3VpdGFibGUgaW5wdXQgZm9yIGFuIGVkaXRvci4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElGaWxlRWRpdG9ySW5wdXQsIElQYXRoRWRpdG9ySW5wdXQsCi0gICAgICAgIElQZXJzaXN0YWJsZUVsZW1lbnQgewotICAgIHByaXZhdGUgSUZpbGUgZmlsZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZWRpdG9yIGlucHV0IGJhc2VkIG9mIHRoZSBnaXZlbiBmaWxlIHJlc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZUVkaXRvcklucHV0KElGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLSAgICAgKgotICAgICAqIFRoZSA8Y29kZT5GaWxlRWRpdG9ySW5wdXQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+T2JqZWN0PC9jb2RlPgotICAgICAqIG1ldGhvZCBiYXNlcyB0aGUgZXF1YWxpdHkgb2YgdHdvIDxjb2RlPkZpbGVFZGl0b3JJbnB1dDwvY29kZT4gb2JqZWN0cyBvbiB0aGUKLSAgICAgKiBlcXVhbGl0eSBvZiB0aGVpciB1bmRlcmx5aW5nIDxjb2RlPklGaWxlPC9jb2RlPiByZXNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBJRmlsZUVkaXRvcklucHV0IG90aGVyID0gKElGaWxlRWRpdG9ySW5wdXQpIG9iajsKLSAgICAgICAgcmV0dXJuIGZpbGUuZXF1YWxzKG90aGVyLmdldEZpbGUoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotICAgICAgICByZXR1cm4gZmlsZS5leGlzdHMoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElBZGFwdGFibGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKGFkYXB0ZXIgPT0gSUZpbGUuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgcmV0dXJuIGZpbGUuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQZXJzaXN0YWJsZUVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0gICAgICAgIHJldHVybiBGaWxlRWRpdG9ySW5wdXRGYWN0b3J5LmdldEZhY3RvcnlJZCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUZpbGVFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIElDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKQotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoZmlsZS5nZXROYW1lKCksIGNvbnRlbnRUeXBlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU3RvcmFnZUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotICAgICAgICByZXR1cm4gZmlsZS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUGVyc2lzdGFibGVFbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIEZpbGVFZGl0b3JJbnB1dEZhY3Rvcnkuc2F2ZVN0YXRlKG1lbWVudG8sIHRoaXMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVBhdGhFZGl0b3JJbnB1dAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKiBAaXNzdWUgY29uc2lkZXIgdXNpbmcgYW4gaW50ZXJuYWwgYWRhcHRlciBmb3IgSVBhdGhFZGl0b3JJbnB1dCByYXRoZXIgdGhhbiBhZGRpbmcgdGhpcyBhcyBBUEkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIigiICsgZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvcGFydC9GaWxlRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL3BhcnQvRmlsZUVkaXRvcklucHV0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmZiMmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvcGFydC9GaWxlRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci0KLS8qKgotICogRmFjdG9yeSBmb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgYSA8Y29kZT5GaWxlRWRpdG9ySW5wdXQ8L2NvZGU+LiAKLSAqIFRoZSBzdG9yZWQgcmVwcmVzZW50YXRpb24gb2YgYSA8Y29kZT5GaWxlRWRpdG9ySW5wdXQ8L2NvZGU+IHJlbWVtYmVycwotICogdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlsZSAodGhhdCBpcywgPGNvZGU+SUZpbGUuZ2V0RnVsbFBhdGg8L2NvZGU+KS4KLSAqIDxwPgotICogVGhlIHdvcmtiZW5jaCB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFzIHJlcXVpcmVkLgotICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IHRoZSBjbGllbnQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlRWRpdG9ySW5wdXRGYWN0b3J5IGltcGxlbWVudHMgSUVsZW1lbnRGYWN0b3J5IHsKLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IGlkLiBUaGUgd29ya2JlbmNoIHBsdWctaW4gcmVnaXN0ZXJzIGEgZmFjdG9yeSBieSB0aGlzIG5hbWUKLSAgICAgKiB3aXRoIHRoZSAib3JnLmVjbGlwc2UudWkuZWxlbWVudEZhY3RvcmllcyIgZXh0ZW5zaW9uIHBvaW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9GQUNUT1JZID0gIm9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0RmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRhZyBmb3IgdGhlIElGaWxlLmZ1bGxQYXRoIG9mIHRoZSBmaWxlIHJlc291cmNlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmYWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlRWRpdG9ySW5wdXRGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUVsZW1lbnRGYWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBJQWRhcHRhYmxlIGNyZWF0ZUVsZW1lbnQoSU1lbWVudG8gbWVtZW50bykgewotICAgICAgICAvLyBHZXQgdGhlIGZpbGUgbmFtZS4KLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX1BBVEgpOwotICAgICAgICBpZiAoZmlsZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIC8vIEdldCBhIGhhbmRsZSB0byB0aGUgSUZpbGUuLi53aGljaCBjYW4gYmUgYSBoYW5kbGUKLSAgICAgICAgLy8gdG8gYSByZXNvdXJjZSB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHdvcmtzcGFjZQotICAgICAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKAotICAgICAgICAgICAgICAgIG5ldyBQYXRoKGZpbGVOYW1lKSk7Ci0gICAgICAgIGlmIChmaWxlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudCBmYWN0b3J5IGlkIGZvciB0aGlzIGNsYXNzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgZmFjdG9yeSBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZhY3RvcnlJZCgpIHsKLSAgICAgICAgcmV0dXJuIElEX0ZBQ1RPUlk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBmaWxlIGVkaXRvciBpbnB1dCBpbnRvIHRoZSBnaXZlbiBtZW1lbnRvLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWVudG8gdGhlIHN0b3JhZ2UgYXJlYSBmb3IgZWxlbWVudCBzdGF0ZQotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgZmlsZSBlZGl0b3IgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8sIEZpbGVFZGl0b3JJbnB1dCBpbnB1dCkgewotICAgICAgICBJRmlsZSBmaWxlID0gaW5wdXQuZ2V0RmlsZSgpOwotICAgICAgICBtZW1lbnRvLnB1dFN0cmluZyhUQUdfUEFUSCwgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvcGFydC9GaWxlSW5QbGFjZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL3BhcnQvRmlsZUluUGxhY2VFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2IwMGUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvcGFydC9GaWxlSW5QbGFjZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUluUGxhY2VFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUluUGxhY2VFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBBZGFwdGVyIGZvciBtYWtpbmcgYSBmaWxlIHJlc291cmNlIGEgc3VpdGFibGUgaW5wdXQgZm9yIGFuIGluLXBsYWNlIGVkaXRvci4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsZUluUGxhY2VFZGl0b3JJbnB1dCBleHRlbmRzIEZpbGVFZGl0b3JJbnB1dCBpbXBsZW1lbnRzCi0gICAgICAgIElJblBsYWNlRWRpdG9ySW5wdXQgewotICAgIElJblBsYWNlRWRpdG9yIGVtYmVkZGVkRWRpdG9yOwotCi0gICAgLyoqCi0gICAgICogQSByZXNvdXJjZSBsaXN0ZW5lciB0byB1cGRhdGUgdGhlIGlucHV0IGFuZCBpbi1wbGFjZQotICAgICAqIGVkaXRvciBpZiB0aGUgaW5wdXQncyBmaWxlIHJlc291cmNlIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUxpc3RlbmVyID0gbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZURlbHRhIG1haW5EZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0gICAgICAgICAgICBpZiAobWFpbkRlbHRhICE9IG51bGwgJiYgZW1iZWRkZWRFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElSZXNvdXJjZURlbHRhIGFmZmVjdGVkRWxlbWVudCA9IG1haW5EZWx0YS5maW5kTWVtYmVyKGdldEZpbGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICAgICAgICAgIGlmIChhZmZlY3RlZEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlbHRhKGFmZmVjdGVkRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsZWQgc28gY2xvc2UgdGhlIHJlY2VpdmVyCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1iZWRkZWRFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkRWRpdG9yLmdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZEVkaXRvciwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0RlbHRhKGZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhKQotICAgICAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFJ1bm5hYmxlIGNoYW5nZVJ1bm5hYmxlID0gbnVsbDsKLQotICAgICAgICAgICAgc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLSAgICAgICAgICAgIGNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICBpZiAoKElSZXNvdXJjZURlbHRhLk1PVkVEX1RPICYgZGVsdGEuZ2V0RmxhZ3MoKSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gZGVsdGEuZ2V0TW92ZWRUb1BhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmlsZSBuZXdGaWxlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRXb3Jrc3BhY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdGaWxlICE9IG51bGwgJiYgZW1iZWRkZWRFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZEVkaXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3VyY2VDaGFuZ2VkKG5ldyBGaWxlSW5QbGFjZUVkaXRvcklucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RmlsZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1iZWRkZWRFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZEVkaXRvci5zb3VyY2VEZWxldGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkRWRpdG9yLmdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZWRFZGl0b3IsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hhbmdlUnVubmFibGUgIT0gbnVsbCAmJiBlbWJlZGRlZEVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW1iZWRkZWRFZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYygKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJ1bm5hYmxlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGJlY2F1c2Ugd2UgYXJlIHNpdHRpbmcgb24gZmlsZXMgYW55d2F5Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbi1wbGFjZSBlZGl0b3IgaW5wdXQgYmFzZWQgb24gYSBmaWxlIHJlc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZUluUGxhY2VFZGl0b3JJbnB1dChJRmlsZSBmaWxlKSB7Ci0gICAgICAgIHN1cGVyKGZpbGUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklJblBsYWNlRWRpdG9ySW5wdXQjc2V0SW5QbGFjZUVkaXRvcihvcmcuZWNsaXBzZS51aS5JSW5QbGFjZUVkaXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJblBsYWNlRWRpdG9yKElJblBsYWNlRWRpdG9yIGVkaXRvcikgewotICAgICAgICBpZiAoZW1iZWRkZWRFZGl0b3IgIT0gZWRpdG9yKSB7Ci0gICAgICAgICAgICBpZiAoZW1iZWRkZWRFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdldEZpbGUoKS5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVtYmVkZGVkRWRpdG9yID0gZWRpdG9yOwotCi0gICAgICAgICAgICBpZiAoZW1iZWRkZWRFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdldEZpbGUoKS5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9leHRlbnNpb25zL29yZy9lY2xpcHNlL3VpL3BhcnQvTWFya2VyVHJhbnNmZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvcGFydC9NYXJrZXJUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2EzM2RhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvcGFydC9NYXJrZXJUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLQotLyoqCi0gKiBBIDxjb2RlPk1hcmtlclRyYW5zZmVyPC9jb2RlPiBpcyB1c2VkIHRvIHRyYW5zZmVyIGFuIGFycmF5IG9mIAotICogPGNvZGU+SU1hcmtlcjwvY29kZT5zIGZyb20gb25lIHBhcnQgdG8gYW5vdGhlciBpbiBhIGRyYWcgYW5kIGRyb3AgCi0gKiBvcGVyYXRpb24uCi0gKiA8cD4KLSAqIEluIGV2ZXJ5IGRyYWcgYW5kIGRyb3Agb3BlcmF0aW9uIHRoZXJlIGlzIGEgPGNvZGU+RHJhZ1NvdXJjZTwvY29kZT4gYW5kIAotICogYSA8Y29kZT5Ecm9wVGFyZ2V0PC9jb2RlPi4gIFdoZW4gYSBkcmFnIG9jY3VycyBhIDxjb2RlPlRyYW5zZmVyPC9jb2RlPiBpcyAKLSAqIHVzZWQgdG8gbWFyc2hhbGwgdGhlIGRyYWcgZGF0YSBmcm9tIHRoZSBzb3VyY2UgaW50byBhIGJ5dGUgYXJyYXkuICBJZiBhIGRyb3AgCi0gKiBvY2N1cnMgYW5vdGhlciA8Y29kZT5UcmFuc2ZlcjwvY29kZT4gaXMgdXNlZCB0byBtYXJzaGFsbCB0aGUgYnl0ZSBhcnJheSBpbnRvCi0gKiBkcm9wIGRhdGEgZm9yIHRoZSB0YXJnZXQuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGZvciBhIDxjb2RlPlZpZXdlcjxjb2RlPiBvciBhbiBTV1QgY29tcG9uZW50IGRpcmVjdGx5LgotICogQSBzaW5nbGV0b24gaXMgcHJvdmlkZWQgd2hpY2ggbWF5IGJlIHNlcmlhbGx5IHJldXNlZCAoc2VlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPikuICAKLSAqIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldAotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2UKLSAqLwotcHVibGljIGNsYXNzIE1hcmtlclRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCi0gICAgLyoqCi0gICAgICogU2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcmtlclRyYW5zZmVyIGluc3RhbmNlID0gbmV3IE1hcmtlclRyYW5zZmVyKCk7Ci0KLSAgICAvLyBDcmVhdGUgYSB1bmlxdWUgSUQgdG8gbWFrZSBzdXJlIHRoYXQgZGlmZmVyZW50IEVjbGlwc2UKLSAgICAvLyBhcHBsaWNhdGlvbnMgdXNlIGRpZmZlcmVudCAidHlwZXMiIG9mIDxjb2RlPk1hcmtlclRyYW5zZmVyPC9jb2RlPgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05BTUUgPSAibWFya2VyLXRyYW5zZmVyLWZvcm1hdCIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICI6IiArIGluc3RhbmNlLmhhc2hDb2RlKCk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFSUQgPSByZWdpc3RlclR5cGUoVFlQRV9OQU1FKTsKLQotICAgIHByaXZhdGUgSVdvcmtzcGFjZSB3b3Jrc3BhY2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHRyYW5zZmVyIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcmtlclRyYW5zZmVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvY2F0ZXMgYW5kIHJldHVybnMgdGhlIG1hcmtlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0aFN0cmluZyB0aGUgcmVzb3VyY2UgcGF0aAotICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIG1hcmtlciB0byBnZXQgKGFzIHBlciB7QGxpbmsgSVJlc291cmNlI2dldE1hcmtlcgotICAgICAqICAgIElSZXNvdXJjZS5nZXRNYXJrZXJ9KQotICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmllZCBtYXJrZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIElNYXJrZXIgZmluZE1hcmtlcihTdHJpbmcgcGF0aFN0cmluZywgbG9uZyBpZCkgewotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aFN0cmluZyk7Ci0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZmluZE1lbWJlcihwYXRoKTsKLSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZXNvdXJjZS5nZXRNYXJrZXIoaWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFya2VyVHJhbnNmZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFRyYW5zZmVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgewotICAgICAgICByZXR1cm4gbmV3IGludFtdIHsgVFlQRUlEIH07Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIFJldHVybnMgdGhlIHR5cGUgbmFtZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHR5cGUgbmFtZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgVFlQRV9OQU1FIH07Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBUcmFuc2Zlci4KLSAgICAgKiBPbiBhIHN1Y2Nlc3NmdWwgY29udmVyc2lvbiwgdGhlIHRyYW5zZmVyRGF0YS5yZXN1bHQgZmllbGQgd2lsbCBiZSBzZXQgdG8KLSAgICAgKiBPTEUuU19PSy4gSWYgdGhpcyB0cmFuc2ZlciBhZ2VudCBpcyB1bmFibGUgdG8gcGVyZm9ybSB0aGUgY29udmVyc2lvbiwgdGhlCi0gICAgICogdHJhbnNmZXJEYXRhLnJlc3VsdCBmaWVsZCB3aWxsIGJlIHNldCB0byB0aGUgZmFpbHVyZSB2YWx1ZSBvZiBPTEUuRFZfRV9UWU1FRC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotICAgICAgICAvKioKLSAgICAgICAgICogVHJhbnNmZXIgZGF0YSBpcyBhbiBhcnJheSBvZiBtYXJrZXJzLiAgU2VyaWFsaXplZCB2ZXJzaW9uIGlzOgotICAgICAgICAgKiAoaW50KSBudW1iZXIgb2YgbWFya2VycwotICAgICAgICAgKiAoTWFya2VyKSBtYXJrZXIgMQotICAgICAgICAgKiAoTWFya2VyKSBtYXJrZXIgMgotICAgICAgICAgKiAuLi4gcmVwZWF0IGxhc3QgZm91ciBmb3IgZWFjaCBzdWJzZXF1ZW50IG1hcmtlcgotICAgICAgICAgKiBzZWUgd3JpdGVNYXJrZXIgZm9yIHRoZSAoTWFya2VyKSBmb3JtYXQuCi0gICAgICAgICAqLwotICAgICAgICBPYmplY3RbXSBtYXJrZXJzID0gKE9iamVjdFtdKSBvYmplY3Q7Ci0gICAgICAgIGxhenlJbml0KG1hcmtlcnMpOwotCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlT3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJ5dGVPdXQpOwotCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8qIHdyaXRlIG51bWJlciBvZiBtYXJrZXJzICovCi0gICAgICAgICAgICBvdXQud3JpdGVJbnQobWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICAvKiB3cml0ZSBtYXJrZXJzICovCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB3cml0ZU1hcmtlcigoSU1hcmtlcikgbWFya2Vyc1tpXSwgb3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgYnl0ZXMgPSBieXRlT3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vd2hlbiBpbiBkb3VidCBzZW5kIG5vdGhpbmcKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChieXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdXBlci5qYXZhVG9OYXRpdmUoYnl0ZXMsIHRyYW5zZmVyRGF0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgdHJhbnNmZXIgbWVjaGFuaXNtIGlmIG5lY2Vzc2FyeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbGF6eUluaXQoT2JqZWN0W10gbWFya2VycykgewotICAgICAgICBpZiAod29ya3NwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtYXJrZXJzICE9IG51bGwgJiYgbWFya2Vycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy53b3Jrc3BhY2UgPSAoKElNYXJrZXIpIG1hcmtlcnNbMF0pLmdldFJlc291cmNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gVHJhbnNmZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotICAgICAgICBieXRlW10gYnl0ZXMgPSAoYnl0ZVtdKSBzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKTsKLSAgICAgICAgRGF0YUlucHV0U3RyZWFtIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLyogcmVhZCBudW1iZXIgb2YgbWFya2VycyAqLwotICAgICAgICAgICAgaW50IG4gPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgICAgIC8qIHJlYWQgbWFya2VycyAqLwotICAgICAgICAgICAgSU1hcmtlcltdIG1hcmtlcnMgPSBuZXcgSU1hcmtlcltuXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSByZWFkTWFya2VyKGluKTsKLSAgICAgICAgICAgICAgICBpZiAobWFya2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hcmtlcnNbaV0gPSBtYXJrZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWFya2VyczsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyBhbmQgcmV0dXJucyBhIHNpbmdsZSBtYXJrZXIgZnJvbSB0aGUgZ2l2ZW4gc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGFJbiB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICogQHJldHVybiB0aGUgbWFya2VyCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyBmcm9tIHRoZSBzdHJlYW0KLSAgICAgKi8KLSAgICBwcml2YXRlIElNYXJrZXIgcmVhZE1hcmtlcihEYXRhSW5wdXRTdHJlYW0gZGF0YUluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvKioKLSAgICAgICAgICogTWFya2VyIHNlcmlhbGl6YXRpb24gZm9ybWF0IGlzIGFzIGZvbGxvd3M6Ci0gICAgICAgICAqIChTdHJpbmcpIHBhdGggb2YgcmVzb3VyY2UgZm9yIG1hcmtlcgotICAgICAgICAgKiAoaW50KSBtYXJrZXIgSUQKLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBwYXRoID0gZGF0YUluLnJlYWRVVEYoKTsKLSAgICAgICAgbG9uZyBpZCA9IGRhdGFJbi5yZWFkTG9uZygpOwotICAgICAgICByZXR1cm4gZmluZE1hcmtlcihwYXRoLCBpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBnaXZlbiBtYXJrZXIgdG8gdGhlIGdpdmVuIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXJrZXIgdGhlIG1hcmtlcgotICAgICAqIEBwYXJhbSBkYXRhT3V0IHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gd3JpdGluZyB0byB0aGUgc3RyZWFtCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlTWFya2VyKElNYXJrZXIgbWFya2VyLCBEYXRhT3V0cHV0U3RyZWFtIGRhdGFPdXQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvKioKLSAgICAgICAgICogTWFya2VyIHNlcmlhbGl6YXRpb24gZm9ybWF0IGlzIGFzIGZvbGxvd3M6Ci0gICAgICAgICAqIChTdHJpbmcpIHBhdGggb2YgcmVzb3VyY2UgZm9yIG1hcmtlcgotICAgICAgICAgKiAoaW50KSBtYXJrZXIgSUQKLSAgICAgICAgICovCi0KLSAgICAgICAgZGF0YU91dC53cml0ZVVURihtYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotICAgICAgICBkYXRhT3V0LndyaXRlTG9uZyhtYXJrZXIuZ2V0SWQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9wYXJ0L1Jlc291cmNlVHJhbnNmZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2V4dGVuc2lvbnMvb3JnL2VjbGlwc2UvdWkvcGFydC9SZXNvdXJjZVRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYjkwYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS91aS9wYXJ0L1Jlc291cmNlVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkucGFydDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLQotLyoqCi0gKiBUaGUgPGNvZGU+UmVzb3VyY2VUcmFuc2ZlcjwvY29kZT4gY2xhc3MgaXMgdXNlZCB0byB0cmFuc2ZlciBhbgotICogYXJyYXkgb2YgPGNvZGU+SVJlc291cmNlczwvY29kZT5zIGZyb20gb25lIHBhcnQgdG8gYW5vdGhlciBpbiBhIAotICogZHJhZyBhbmQgZHJvcCBvcGVyYXRpb24gb3IgYSBjdXQsIGNvcHksIHBhc3RlIGFjdGlvbi4KLSAqIDxwPgotICogSW4gZXZlcnkgZHJhZyBhbmQgZHJvcCBvcGVyYXRpb24gdGhlcmUgaXMgYSA8Y29kZT5EcmFnU291cmNlPC9jb2RlPiBhbmQgCi0gKiBhIDxjb2RlPkRyb3BUYXJnZXQ8L2NvZGU+LiAgV2hlbiBhIGRyYWcgb2NjdXJzIGEgPGNvZGU+VHJhbnNmZXI8L2NvZGU+IGlzIAotICogdXNlZCB0byBtYXJzaGFsbCB0aGUgZHJhZyBkYXRhIGZyb20gdGhlIHNvdXJjZSBpbnRvIGEgYnl0ZSBhcnJheS4gIElmIGEgZHJvcCAKLSAqIG9jY3VycyBhbm90aGVyIDxjb2RlPlRyYW5zZmVyPC9jb2RlPiBpcyB1c2VkIHRvIG1hcnNoYWxsIHRoZSBieXRlIGFycmF5IGludG8KLSAqIGRyb3AgZGF0YSBmb3IgdGhlIHRhcmdldC4gIAotICogPC9wPgotICogPHA+Ci0gKiBXaGVuIGEgPGNvZGU+Q3V0QWN0aW9uPC9jb2RlPiBvciBhIDxjb2RlPkNvcHlBY3Rpb248L2NvZGU+IGlzIHBlcmZvcm1lZCwgCi0gKiB0aGlzIHRyYW5zZmVyIGlzIHVzZWQgdG8gcGxhY2UgcmVmZXJlbmNlcyB0byB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzIAotICogb24gdGhlIDxjb2RlPkNsaXBib2FyZDwvY29kZT4uICBXaGVuIGEgPGNvZGU+UGFzdGVBY3Rpb248L2NvZGU+IGlzIHBlcmZvcm1lZCwgdGhlIAotICogcmVmZXJlbmNlcyBvbiB0aGUgY2xpcGJvYXJkIGFyZSB1c2VkIHRvIG1vdmUgb3IgY29weSB0aGUgcmVzb3VyY2VzCi0gKiB0byB0aGUgc2VsZWN0ZWQgZGVzdGluYXRpb24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgZm9yIGEgPGNvZGU+Vmlld2VyPGNvZGU+IG9yIGFuIFNXVCBjb21wb25lbnQgZGlyZWN0bHkuCi0gKiBBIHNpbmdsZXRvbiBpcyBwcm92aWRlZCB3aGljaCBtYXkgYmUgc2VyaWFsbHkgcmV1c2VkIChzZWUgPGNvZGU+Z2V0SW5zdGFuY2U8L2NvZGU+KS4gIAotICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZQotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VUcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotICAgIC8qKgotICAgICAqIFNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVRyYW5zZmVyIGluc3RhbmNlID0gbmV3IFJlc291cmNlVHJhbnNmZXIoKTsKLQotICAgIC8vIENyZWF0ZSBhIHVuaXF1ZSBJRCB0byBtYWtlIHN1cmUgdGhhdCBkaWZmZXJlbnQgRWNsaXBzZQotICAgIC8vIGFwcGxpY2F0aW9ucyB1c2UgZGlmZmVyZW50ICJ0eXBlcyIgb2YgPGNvZGU+UmVzb3VyY2VUcmFuc2ZlcjwvY29kZT4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FID0gInJlc291cmNlLXRyYW5zZmVyLWZvcm1hdDoiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiOiIgKyBpbnN0YW5jZS5oYXNoQ29kZSgpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRUlEID0gcmVnaXN0ZXJUeXBlKFRZUEVfTkFNRSk7Ci0KLSAgICBwcml2YXRlIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB0cmFuc2ZlciBvYmplY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBSZXNvdXJjZVRyYW5zZmVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VUcmFuc2ZlciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gVHJhbnNmZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgaW50W10geyBUWVBFSUQgfTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBuYW1lcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdHlwZSBuYW1lcwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBUWVBFX05BTUUgfTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFRyYW5zZmVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGphdmFUb05hdGl2ZShPYmplY3QgZGF0YSwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotICAgICAgICBpZiAoIShkYXRhIGluc3RhbmNlb2YgSVJlc291cmNlW10pKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSAoSVJlc291cmNlW10pIGRhdGE7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcmVzb3VyY2Ugc2VyaWFsaXphdGlvbiBmb3JtYXQgaXM6Ci0gICAgICAgICAqICAoaW50KSBudW1iZXIgb2YgcmVzb3VyY2VzCi0gICAgICAgICAqIFRoZW4sIHRoZSBmb2xsb3dpbmcgZm9yIGVhY2ggcmVzb3VyY2U6Ci0gICAgICAgICAqICAoaW50KSByZXNvdXJjZSB0eXBlCi0gICAgICAgICAqICAoU3RyaW5nKSBwYXRoIG9mIHJlc291cmNlCi0gICAgICAgICAqLwotCi0gICAgICAgIGludCByZXNvdXJjZUNvdW50ID0gcmVzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0gZGF0YU91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dCk7Ci0KLSAgICAgICAgICAgIC8vd3JpdGUgdGhlIG51bWJlciBvZiByZXNvdXJjZXMKLSAgICAgICAgICAgIGRhdGFPdXQud3JpdGVJbnQocmVzb3VyY2VDb3VudCk7Ci0KLSAgICAgICAgICAgIC8vd3JpdGUgZWFjaCByZXNvdXJjZQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB3cml0ZVJlc291cmNlKGRhdGFPdXQsIHJlc291cmNlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vY2xlYW51cAotICAgICAgICAgICAgZGF0YU91dC5jbG9zZSgpOwotICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBvdXQudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIHN1cGVyLmphdmFUb05hdGl2ZShieXRlcywgdHJhbnNmZXJEYXRhKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9pdCdzIGJlc3QgdG8gc2VuZCBub3RoaW5nIGlmIHRoZXJlIHdlcmUgcHJvYmxlbXMKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gVHJhbnNmZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHJlc291cmNlIHNlcmlhbGl6YXRpb24gZm9ybWF0IGlzOgotICAgICAgICAgKiAgKGludCkgbnVtYmVyIG9mIHJlc291cmNlcwotICAgICAgICAgKiBUaGVuLCB0aGUgZm9sbG93aW5nIGZvciBlYWNoIHJlc291cmNlOgotICAgICAgICAgKiAgKGludCkgcmVzb3VyY2UgdHlwZQotICAgICAgICAgKiAgKFN0cmluZykgcGF0aCBvZiByZXNvdXJjZQotICAgICAgICAgKi8KLQotICAgICAgICBieXRlW10gYnl0ZXMgPSAoYnl0ZVtdKSBzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKTsKLSAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgRGF0YUlucHV0U3RyZWFtIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgICAgIElSZXNvdXJjZVtdIHJlc3VsdHMgPSBuZXcgSVJlc291cmNlW2NvdW50XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSByZWFkUmVzb3VyY2UoaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYSByZXNvdXJjZSBmcm9tIHRoZSBnaXZlbiBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YUluIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZQotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgZnJvbSB0aGUgc3RyZWFtCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2UgcmVhZFJlc291cmNlKERhdGFJbnB1dFN0cmVhbSBkYXRhSW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCB0eXBlID0gZGF0YUluLnJlYWRJbnQoKTsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBkYXRhSW4ucmVhZFVURigpOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBJUmVzb3VyY2UuRk9MREVSOgotICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKG5ldyBQYXRoKHBhdGgpKTsKLSAgICAgICAgY2FzZSBJUmVzb3VyY2UuRklMRToKLSAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgocGF0aCkpOwotICAgICAgICBjYXNlIElSZXNvdXJjZS5QUk9KRUNUOgotICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJVbmtub3duIHJlc291cmNlIHR5cGUgaW4gUmVzb3VyY2VUcmFuc2Zlci5yZWFkUmVzb3VyY2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgZ2l2ZW4gcmVzb3VyY2UgdG8gdGhlIGdpdmVuIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhT3V0IHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZQotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdyaXRpbmcgdG8gdGhlIHN0cmVhbQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZVJlc291cmNlKERhdGFPdXRwdXRTdHJlYW0gZGF0YU91dCwgSVJlc291cmNlIHJlc291cmNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZGF0YU91dC53cml0ZUludChyZXNvdXJjZS5nZXRUeXBlKCkpOwotICAgICAgICBkYXRhT3V0LndyaXRlVVRGKHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvYWRkdHNrX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9hZGR0c2tfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlNmNjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9hZGR0c2tfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjMGRlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9jb2xsYXBzZWFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9jb25maWdzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L2NvbmZpZ3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTM5ZWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L2NvbmZpZ3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L2ZpbHRlcl9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNmQ4OTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L2dvdG9vYmpfdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L2dvdG9vYmpfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1NzEyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9nb3Rvb2JqX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YzcwZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvcmVmcmVzaF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvc2VsZWN0ZWRfbW9kZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9zZWxlY3RlZF9tb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhYjliMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9zZWxlY3RlZF9tb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3djaGlsZF9tb2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3djaGlsZF9tb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM5MmU0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9zaG93Y2hpbGRfbW9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9zaG93Y29tcGxldGVfdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3djb21wbGV0ZV90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTgzZGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3djb21wbGV0ZV90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvc2hvd2Vycl90c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvc2hvd2Vycl90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIzMzE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3dlcnJfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3d0c2tfdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3d0c2tfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmNjhmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9zaG93dHNrX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9zaG93d2Fybl90c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvc2hvd3dhcm5fdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwN2U3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9zaG93d2Fybl90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvc3RlcF9jdXJyZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L3N0ZXBfY3VycmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOWZlOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvc3RlcF9jdXJyZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L3N0ZXBfZG9uZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9zdGVwX2RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTgzZGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L3N0ZXBfZG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9zeW5jZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvc3luY2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2ZTQzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2RsY2wxNi9zeW5jZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvdXNlYXJjaF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kbGNsMTYvdXNlYXJjaF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWZhMzY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZGxjbDE2L3VzZWFyY2hfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9idWlsZF9leGVjLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9idWlsZF9leGVjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0YjFjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvYnVpbGRfZXhlYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvZXhwb3J0X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvZXhwb3J0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODljZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cG9ydGRpcl93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cG9ydGRpcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2Q4ZGY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBvcnRkaXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBvcnR6aXBfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBvcnR6aXBfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4NWQ4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvZXhwb3J0emlwX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvaW1wb3J0X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvaW1wb3J0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNDQ3NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kdG9vbDE2L2ltcG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kdG9vbDE2L2ltcG9ydGRpcl93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kdG9vbDE2L2ltcG9ydGRpcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjViOTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9pbXBvcnRkaXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9pbXBvcnR6aXBfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9pbXBvcnR6aXBfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EwMGQ4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvaW1wb3J0emlwX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3ZmlsZV93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2ZpbGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2ODJjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3ZmlsZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2ZvbGRlcl93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2ZvbGRlcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODIxZjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdmb2xkZXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdwcmpfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdwcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0YjI0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3cHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvbmV4dF9uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kdG9vbDE2L25leHRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU0YTgzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvbmV4dF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kdG9vbDE2L3ByZXZfbmF2LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9wcmV2X25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NzJlZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9kdG9vbDE2L3ByZXZfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9zZWFyY2hfc3JjLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZHRvb2wxNi9zZWFyY2hfc3JjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmODg3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2R0b29sMTYvc2VhcmNoX3NyYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9hZGR0c2tfdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L2FkZHRza190c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFjMjhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L2FkZHRza190c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmQ4MGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L2NvbmZpZ3MuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvY29uZmlncy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODRmYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvY29uZmlncy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlNmYwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvZmxhdExheW91dC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9mbGF0TGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVmNzRjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9mbGF0TGF5b3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L2dvdG9vYmpfdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L2dvdG9vYmpfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2MmI2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9nb3Rvb2JqX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NDg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvcmVmcmVzaF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDljYWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L3JlZnJlc2hfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L3NlbGVjdGVkX21vZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvc2VsZWN0ZWRfbW9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNDI0MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvc2VsZWN0ZWRfbW9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9zaG93Y2hpbGRfbW9kZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9zaG93Y2hpbGRfbW9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MTRmN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd2NoaWxkX21vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd2NvbXBsZXRlX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9zaG93Y29tcGxldGVfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9zaG93Y29tcGxldGVfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L3Nob3dlcnJfdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L3Nob3dlcnJfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmNjY3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9zaG93ZXJyX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9zaG93dHNrX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9zaG93dHNrX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MDI4YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd3Rza190c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd3dhcm5fdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L3Nob3d3YXJuX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNmJkNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd3dhcm5fdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L3N0ZXBfY3VycmVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9zdGVwX2N1cnJlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2E3Y2M3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L3N0ZXBfY3VycmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9zdGVwX2RvbmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvc3RlcF9kb25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi9zdGVwX2RvbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MDkzNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L3VzZWFyY2hfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZWxjbDE2L3VzZWFyY2hfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4MDU5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi91c2VhcmNoX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi93b3JraW5nc2V0cy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2VsY2wxNi93b3JraW5nc2V0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOGM5ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9lbGNsMTYvd29ya2luZ3NldHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L2J1aWxkX2V4ZWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L2J1aWxkX2V4ZWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWVlNTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9idWlsZF9leGVjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBvcnRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwODM3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvZXhwb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvZXhwb3J0ZGlyX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvZXhwb3J0ZGlyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjM2IyYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cG9ydGRpcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cG9ydHppcF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cG9ydHppcF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2E0OTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBvcnR6aXBfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9pbXBvcnRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9pbXBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4MDg1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvaW1wb3J0ZGlyX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvaW1wb3J0ZGlyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZDU2NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L2ltcG9ydGRpcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L2ltcG9ydHppcF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L2ltcG9ydHppcF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTU5NjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9pbXBvcnR6aXBfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdmaWxlX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3ZmlsZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDA1MDg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdmaWxlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Zm9sZGVyX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Zm9sZGVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMGViMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2ZvbGRlcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld3Byal93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld3Byal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmJhYzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXh0X25hdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvbmV4dF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTFlMDJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXh0X25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvcHJldl9uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L3ByZXZfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhkMTczZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvcHJldl9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L3Byb2JsZW1fY2F0ZWdvcnkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldG9vbDE2L3Byb2JsZW1fY2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ0ODYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9wcm9ibGVtX2NhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9zZWFyY2hfc3JjLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXRvb2wxNi9zZWFyY2hfc3JjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0MGEwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V0b29sMTYvc2VhcmNoX3NyYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V2aWV3MTYvYmttcmtfbmF2LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXZpZXcxNi9ia21ya19uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWVmYWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXZpZXcxNi9ia21ya19uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldmlldzE2L2ZpbGVuYXZfbmF2LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXZpZXcxNi9maWxlbmF2X25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOThhNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldmlldzE2L2ZpbGVuYXZfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXZpZXcxNi9wcm9ibGVtc192aWV3LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXZpZXcxNi9wcm9ibGVtc192aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA3YjI4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V2aWV3MTYvcHJvYmxlbXNfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V2aWV3MTYvcHZpZXcuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldmlldzE2L3B2aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhNTRhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL2V2aWV3MTYvcHZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldmlldzE2L3Jlc291cmNlX3BlcnNwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXZpZXcxNi9yZXNvdXJjZV9wZXJzcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOGZlMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldmlldzE2L3Jlc291cmNlX3BlcnNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvZXZpZXcxNi90YXNrc190c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldmlldzE2L3Rhc2tzX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZDEwZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9ldmlldzE2L3Rhc2tzX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2JrbXJrX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2JrbXJrX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzdmYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9ia21ya190c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9jb21wbGV0ZV90c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9jb21wbGV0ZV90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FjYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvY29tcGxldGVfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvY3Byal9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9jcHJqX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTJhODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9jcHJqX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2Vycm9yX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2Vycm9yX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMDQ4ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9lcnJvcl90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9leHBvcnRwcmVmX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2V4cG9ydHByZWZfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmMjM1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2V4cG9ydHByZWZfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvaGVhZGVyX2NvbXBsZXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvaGVhZGVyX2NvbXBsZXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzNjUxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2hlYWRlcl9jb21wbGV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2hlYWRlcl9wcmlvcml0eS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2hlYWRlcl9wcmlvcml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTc5MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9oZWFkZXJfcHJpb3JpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9ocHJpb190c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9ocHJpb190c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDlkYmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvaHByaW9fdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvaW1wb3J0cHJlZl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9pbXBvcnRwcmVmX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3Y2VhMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9pbXBvcnRwcmVmX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2luY29tcGxldGVfdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvaW5jb21wbGV0ZV90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmI5ZjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvaW5jb21wbGV0ZV90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9pbmZvX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2luZm9fdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhMDAxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2luZm9fdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYva2V5c3ByZWZfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYva2V5c3ByZWZfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmMjdhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2tleXNwcmVmX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2xwcmlvX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L2xwcmlvX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ODE1YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9scHJpb190c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9wcmpfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvcHJqX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZWE1ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi9wcmpfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvdGFza21ya190c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi90YXNrbXJrX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3M2UzMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi90YXNrbXJrX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L3dhcm5fdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvd2Fybl90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDAwOWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvd2Fybl90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvd2FybmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMWM1YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvd2VsY29tZV9iYW5uZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi93ZWxjb21lX2Jhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjQ0MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi93ZWxjb21lX2Jhbm5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L3dlbGNvbWVfZWRpdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvd2VsY29tZV9lZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjI2ZTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvd2VsY29tZV9lZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi93ZWxjb21lX2l0ZW0uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vYmoxNi93ZWxjb21lX2l0ZW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTZhYzgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvd2VsY29tZV9pdGVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvd29ya3NldC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL29iajE2L3dvcmtzZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTRkZTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb2JqMTYvd29ya3NldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL292cjE2L2xpbmtfb3ZyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb3ZyMTYvbGlua19vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjE0NDBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb3ZyMTYvbGlua19vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vdnIxNi9saW5rd2Fybl9vdnIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC9vdnIxNi9saW5rd2Fybl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2MwY2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvb3ZyMTYvbGlua3dhcm5fb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydGRpcl93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0ZGlyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ODE4OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0ZGlyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnR6aXBfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydHppcF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2JjOWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydHppcF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0ZGlyX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRkaXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwNDVlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRkaXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydHByb2pfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydHByb2pfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyNWZhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRwcm9qX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnR6aXBfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydHppcF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjExNGM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydHppcF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vbmV3X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi9uZXdfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkNzVmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi9uZXdfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuL25ld193aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vbmV3X3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Zjg1ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vbmV3X3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi9uZXdmaWxlX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi9uZXdmaWxlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNmU5NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZmlsZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vbmV3Zm9sZGVyX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi9uZXdmb2xkZXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4OGRjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi9uZXdmb2xkZXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuL25ld3Byal93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vbmV3cHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjN2QzYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vbmV3cHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi9zYXZlYXNfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuL3NhdmVhc193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDc0NTQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuL3NhdmVhc193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vd29ya3NldF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vd29ya3NldF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmJlYWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuL3dvcmtzZXRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjIwMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUGx1Z2luLm5hbWUgPSBFY2xpcHNlIElERSBVSQotUGx1Z2luLnByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KLUV4dFBvaW50Lm1hcmtlckhlbHAgPSBNYXJrZXIgSGVscAotRXh0UG9pbnQubWFya2VySW1hZ2VQcm92aWRlcnMgPSBNYXJrZXIgSW1hZ2UgUHJvdmlkZXJzCi1FeHRQb2ludC5tYXJrZXJSZXNvbHV0aW9uID0gTWFya2VyIFJlc29sdXRpb24KLUV4dFBvaW50LnByb2plY3ROYXR1cmVJbWFnZXMgPSBQcm9qZWN0IE5hdHVyZSBJbWFnZXMKLUV4dFBvaW50LnJlc291cmNlRmlsdGVycyA9IFJlc291cmNlIEZpbHRlcnMKLUV4dFBvaW50Lm1hcmtlclN1cHBvcnQgPSBNYXJrZXIgU3VwcG9ydAotCi1LZXlzUHJlZmVyZW5jZS5OYW1lID0gS2V5cyBQcmVmZXJlbmNlcwotS2V5c1ByZWZlcmVuY2UuRGVzY3JpcHRpb24gPSBQcmVmZXJlbmNlcyByZWxhdGVkIHRvIGtleXMsIGFjY2VsZXJhdG9yIGtleSBiaW5kaW5ncywga2V5IGNvbmZpZ3VyYXRpb25zIGFuZCBjb21tYW5kcy4KLQotRWRpdG9ycy5XZWxjb21lRWRpdG9yID0gV2VsY29tZQotSW1wb3J0RXhwb3J0V2l6YXJkcy5DYXRlZ29yeS5CYXNpYyA9IEdlbmVyYWwKLUV4cG9ydFdpemFyZHMuRmlsZVN5c3RlbSA9IEZpbGUgU3lzdGVtCi1FeHBvcnRXaXphcmRzLlByZWZlcmVuY2VzID0gUHJlZmVyZW5jZXMKLUV4cG9ydFdpemFyZHMuWmlwRmlsZSA9IEFyY2hpdmUgRmlsZQotRXhwb3J0V2l6YXJkcy5GaWxlU3lzdGVtRGVzY3JpcHRpb24gPSBFeHBvcnQgcmVzb3VyY2VzIHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KLUV4cG9ydFdpemFyZHMuUHJlZmVyZW5jZXNEZXNjcmlwdGlvbiA9IEV4cG9ydCBwcmVmZXJlbmNlcyB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi1FeHBvcnRXaXphcmRzLlppcEZpbGVEZXNjcmlwdGlvbiA9IEV4cG9ydCByZXNvdXJjZXMgdG8gYW4gYXJjaGl2ZSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KLUltcG9ydFdpemFyZHMuRmlsZVN5c3RlbSA9IEZpbGUgU3lzdGVtCi1JbXBvcnRXaXphcmRzLlByZWZlcmVuY2VzID0gUHJlZmVyZW5jZXMKLUltcG9ydFdpemFyZHMuWmlwRmlsZSA9IEFyY2hpdmUgRmlsZQotSW1wb3J0V2l6YXJkcy5FeHRlcm5hbFByb2plY3QgPSBFeGlzdGluZyBQcm9qZWN0cyBpbnRvIFdvcmtzcGFjZQotSW1wb3J0V2l6YXJkcy5GaWxlU3lzdGVtRGVzY3JpcHRpb24gPSBJbXBvcnQgcmVzb3VyY2VzIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIGludG8gYW4gZXhpc3RpbmcgcHJvamVjdC4KLUltcG9ydFdpemFyZHMuUHJlZmVyZW5jZXNEZXNjcmlwdGlvbiA9IEltcG9ydCBwcmVmZXJlbmNlcyBmcm9tIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KLUltcG9ydFdpemFyZHMuWmlwRmlsZURlc2NyaXB0aW9uID0gSW1wb3J0IHJlc291cmNlcyBmcm9tIGFuIGFyY2hpdmUgZmlsZSBpbnRvIGFuIGV4aXN0aW5nIHByb2plY3QuCi1JbXBvcnRXaXphcmRzLkV4dGVybmFsUHJvamVjdERlc2NyaXB0aW9uID0gQ3JlYXRlIG5ldyBwcm9qZWN0cyBmcm9tIGFuIGFyY2hpdmUgZmlsZSBvciBkaXJlY3RvcnkuIAotTmV3V2l6YXJkcy5DYXRlZ29yeS5FeGFtcGxlcyA9IEV4YW1wbGVzCi1OZXdXaXphcmRzLkNhdGVnb3J5LkJhc2ljID0gR2VuZXJhbAotTmV3V2l6YXJkcy5wcm9qZWN0ID0gUHJvamVjdAotTmV3V2l6YXJkcy5wcm9qZWN0LmRlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IHByb2plY3QgcmVzb3VyY2UKLU5ld1dpemFyZHMuZm9sZGVyID0gRm9sZGVyCi1OZXdXaXphcmRzLmZvbGRlci5kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBmb2xkZXIgcmVzb3VyY2UKLU5ld1dpemFyZHMuZmlsZSA9IEZpbGUKLU5ld1dpemFyZHMuZmlsZS5kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBmaWxlIHJlc291cmNlCi1QZXJzcGVjdGl2ZS5yZXNvdXJjZVBlcnNwZWN0aXZlID0gUmVzb3VyY2UKLVByZWZlcmVuY2VQYWdlcy5Xb3JrYmVuY2ggPSBHZW5lcmFsCi1QcmVmZXJlbmNlUGFnZXMuRWRpdG9ycyA9IEVkaXRvcnMKLVByZWZlcmVuY2VQYWdlcy5MaW5rZWRSZXNvdXJjZXMgPSBMaW5rZWQgUmVzb3VyY2VzCi1QcmVmZXJlbmNlUGFnZXMuRmlsZUVkaXRvcnMgPSBGaWxlIEFzc29jaWF0aW9ucwotUHJlZmVyZW5jZVBhZ2VzLkZpbGVTdGF0ZXMgPSBMb2NhbCBIaXN0b3J5Ci1QcmVmZXJlbmNlUGFnZXMuUGVyc3BlY3RpdmVzID0gUGVyc3BlY3RpdmVzCi1QcmVmZXJlbmNlUGFnZXMuVmlld3MgPSBBcHBlYXJhbmNlCi1QcmVmZXJlbmNlUGFnZXMuV29ya3NwYWNlPVdvcmtzcGFjZQotUHJlZmVyZW5jZVBhZ2VzLkJ1aWxkT3JkZXIgPSBCdWlsZCBPcmRlcgotUHJlZmVyZW5jZVBhZ2VzLkNvbG9yc0FuZEZvbnRzID0gQ29sb3JzIGFuZCBGb250cwotUHJlZmVyZW5jZVBhZ2VzLkRlY29yYXRvcnMgPSBMYWJlbCBEZWNvcmF0aW9ucwotUHJlZmVyZW5jZVBhZ2VzLlN0YXJ0dXAgPSBTdGFydHVwIGFuZCBTaHV0ZG93bgotUHJlZmVyZW5jZVBhZ2VzLktleXMgPSBLZXlzCi1QcmVmZXJlbmNlUGFnZXMuTmV3S2V5cyA9IEtleXMgKEV4cGVyaW1lbnRhbCkKLVByZWZlcmVuY2VQYWdlcy5BY3Rpdml0aWVzID0gQ2FwYWJpbGl0aWVzCi1QcmVmZXJlbmNlUGFnZXMuQ29udGVudFR5cGVzID0gQ29udGVudCBUeXBlcwotUHJlZmVyZW5jZVBhZ2VzLlBlcmZvcm1hbmNlID0gUGVyZm9ybWFuY2UKLVByZWZlcmVuY2VQYWdlcy5Db250ZW50VHlwZXMgPSBDb250ZW50IFR5cGVzCi1QcmVmZXJlbmNlUGFnZXMuUGVyZm9ybWFuY2UgPSBQZXJmb3JtYW5jZQotUHJvcGVydHlQYWdlcy5wcm9qZWN0LnJlZmVyZW5jZSA9IFByb2plY3QgUmVmZXJlbmNlcwotUHJvcGVydHlQYWdlcy5pbmZvLmZpbGUgPSBJbmZvCi0KLVZpZXdzLlJlc291cmNlTmF2aWdhdG9yID0gTmF2aWdhdG9yCi1WaWV3cy5Cb29rbWFyayA9IEJvb2ttYXJrcwotVmlld3MuVGFzayA9IFRhc2tzCi1WaWV3cy5Qcm9ibGVtID0gUHJvYmxlbXMKLVZpZXdzLlByb2dyZXNzID0gUHJvZ3Jlc3MKLVZpZXdzLlByb2dyZXNzLk5ldyA9IE5ldyBQcm9ncmVzcwotCi1Xb3JraW5nU2V0cy5yZXNvdXJjZSA9IFJlc291cmNlCi1OYXZpZ2F0ZUFjdGlvblNldC5sYWJlbCA9IFJlc291cmNlIE5hdmlnYXRpb24KLU5hdmlnYXRlQWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gQWN0aW9uIHNldCBjb250YWluaW5nIHJlc291cmNlIG5hdmlnYXRpb24gYWN0aW9ucwotCi1Xb3JraW5nU2V0c0FjdGlvblNldC5sYWJlbCA9IFdvcmtpbmcgU2V0cwotV29ya2luZ1NldHNBY3Rpb25TZXQuZGVzY3JpcHRpb24gPSBXb3JraW5nIHNldCBtYW5pcHVsYXRpb24gYWN0aW9ucwotV29ya2luZ1NldHNBY3Rpb25TZXQudG9vbHRpcCA9IFNlbGVjdCBXb3JraW5nIFNldHMKLQotR29Ub1Jlc291cmNlQWN0aW9uLmxhYmVsID0gJlJlc291cmNlLi4uCi1EZWNvcmF0b3JMaW5rZWRSZXNvdXJjZS5sYWJlbCA9IExpbmtlZCBSZXNvdXJjZXMKLURlY29yYXRvckxpbmtlZFJlc291cmNlLmRlc2NyaXB0aW9uID0gQWRkcyBhbiBpY29uIGRlY29yYXRpb24gdG8gbGlua2VkIHJlc291cmNlcy4KLU9wZW5Xb3Jrc3BhY2VGaWxlQWN0aW9uLmxhYmVsID0gT3BlbiBSZXNvJnVyY2UuLi4KLVNlbGVjdFdvcmtpbmdTZXRzQWN0aW9uLmxhYmVsID0gJldvcmtpbmcgU2V0cwotCi1BYm91dC51cGRhdGVTdW1tYXJ5VGl0bGUgPSBDdXJyZW50IEluc3RhbGwgQ29uZmlndXJhdGlvbgotCi1jYXRlZ29yeS5wZXJzcGVjdGl2ZS5uYW1lPVBlcnNwZWN0aXZlcwotY2F0ZWdvcnkucGVyc3BlY3RpdmUuZGVzY3JpcHRpb249Q29tbWFuZHMgZm9yIG9wZW5pbmcgcGVyc3BlY3RpdmVzCi1jYXRlZ29yeS5wcm9qZWN0Lm5hbWU9UHJvamVjdAotY2F0ZWdvcnkucHJvamVjdC5kZXNjcmlwdGlvbj0KLQotY29tbWFuZC5hZGRUYXNrLmRlc2NyaXB0aW9uID0gQWRkIGEgdGFzawotY29tbWFuZC5hZGRUYXNrLm5hbWUgPSBBZGQgVGFzawotY29tbWFuZC5idWlsZEFsbC5kZXNjcmlwdGlvbiA9IEJ1aWxkIGFsbCBwcm9qZWN0cwotY29tbWFuZC5idWlsZEFsbC5uYW1lID0gQnVpbGQgQWxsCi1jb21tYW5kLmJ1aWxkQ2xlYW4uZGVzY3JpcHRpb24gPSBEaXNjYXJkIG9sZCBidWlsdCBzdGF0ZQotY29tbWFuZC5idWlsZENsZWFuLm5hbWUgPSBCdWlsZCBDbGVhbgotY29tbWFuZC5idWlsZExhc3QuZGVzY3JpcHRpb24gPSBSZXBlYXQgdGhlIGxhc3Qgd29ya2luZyBzZXQgYnVpbGQKLWNvbW1hbmQuYnVpbGRMYXN0Lm5hbWUgPSBSZXBlYXQgV29ya2luZyBTZXQgQnVpbGQKLWNvbW1hbmQuYnVpbGRQcm9qZWN0LmRlc2NyaXB0aW9uID0gQnVpbGQgdGhlIHNlbGVjdGVkIHByb2plY3QKLWNvbW1hbmQuYnVpbGRQcm9qZWN0Lm5hbWUgPSBCdWlsZCBQcm9qZWN0Ci1jb21tYW5kLmNsb3NlUHJvamVjdC5kZXNjcmlwdGlvbiA9IENsb3NlIHRoZSBzZWxlY3RlZCBwcm9qZWN0Ci1jb21tYW5kLmNsb3NlUHJvamVjdC5uYW1lID0gQ2xvc2UgUHJvamVjdAotY29tbWFuZC5jb3JyZWN0aW9uQXNzaXN0UHJvcG9zYWxzLmRlc2NyaXB0aW9uID0gU3VnZ2VzdCBwb3NzaWJsZSBmaXhlcyBmb3IgYSBwcm9ibGVtCi1jb21tYW5kLmNvcnJlY3Rpb25Bc3Npc3RQcm9wb3NhbHMubmFtZSA9IFF1aWNrIEZpeAotY29tbWFuZC5nb1RvUmVzb3VyY2UuZGVzY3JpcHRpb24gPSBHbyB0byBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgaW4gdGhlIGFjdGl2ZSB2aWV3Ci1jb21tYW5kLmdvVG9SZXNvdXJjZS5uYW1lID0gR28gdG8gUmVzb3VyY2UKLWNvbW1hbmQub3BlblByb2plY3QuZGVzY3JpcHRpb24gPSBPcGVuIGEgcHJvamVjdAotY29tbWFuZC5vcGVuUHJvamVjdC5uYW1lID0gT3BlbiBQcm9qZWN0Ci1jb21tYW5kLm9wZW5SZXNvdXJjZS5kZXNjcmlwdGlvbiA9IE9wZW4gYW4gZWRpdG9yIG9uIGEgcGFydGljdWxhciByZXNvdXJjZQotY29tbWFuZC5vcGVuUmVzb3VyY2UubmFtZSA9IE9wZW4gUmVzb3VyY2UKLWNvbW1hbmQub3BlblJlc291cmNlUGVyc3BlY3RpdmUuZGVzY3JpcHRpb24gPSBPcGVuIHRoZSByZXNvdXJjZSBwZXJzcGVjdGl2ZQotY29tbWFuZC5vcGVuV29ya3NwYWNlLmRlc2NyaXB0aW9uID0gT3BlbiB0aGUgd29ya3NwYWNlIHNlbGVjdGlvbiBkaWFsb2cKLWNvbW1hbmQub3BlbldvcmtzcGFjZS5uYW1lID0gT3BlbiBXb3Jrc3BhY2UKLWNvbW1hbmQucHJvamVjdFByb3BlcnRpZXMuZGVzY3JpcHRpb24gPSBEaXNwbGF5IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzZWxlY3RlZCBpdGVtJ3MgcHJvamVjdCAKLWNvbW1hbmQucHJvamVjdFByb3BlcnRpZXMubmFtZSA9IFByb3BlcnRpZXMKLWNvbW1hbmQucmVidWlsZEFsbC5kZXNjcmlwdGlvbiA9IFJlYnVpbGQgYWxsIHByb2plY3RzCi1jb21tYW5kLnJlYnVpbGRBbGwubmFtZSA9IFJlYnVpbGQgQWxsCi1jb21tYW5kLnJlYnVpbGRQcm9qZWN0LmRlc2NyaXB0aW9uID0gUmVidWlsZCB0aGUgc2VsZWN0ZWQgcHJvamVjdHMKLWNvbW1hbmQucmVidWlsZFByb2plY3QubmFtZSA9IFJlYnVpbGQgUHJvamVjdAotY29tbWFuZC5zaG93UGVyc3BlY3RpdmUubmFtZSA9IFNob3cgUGVyc3BlY3RpdmUKLWNvbW1hbmQuc2hvd1BlcnNwZWN0aXZlLmRlc2NyaXB0aW9uID0gU2hvdyBhIHBhcnRpY3VsYXIgcGVyc3BlY3RpdmUKLWNvbW1hbmQuc2hvd1BlcnNwZWN0aXZlLnBlcnNwZWN0aXZlSWRQYXJhbWV0ZXIgPSBQYXJhbWV0ZXIKLWNvbW1hbmQuc2VsZWN0V29ya2luZ1NldHMubmFtZSA9IFNlbGVjdCBXb3JraW5nIFNldHMKLWNvbW1hbmQuc2VsZWN0V29ya2luZ1NldHMuZGVzY3JpcHRpb24gPSBTZWxlY3QgdGhlIHdvcmtpbmcgc2V0cyB0aGF0IGFyZSBhcHBsaWNhYmxlIGZvciB0aGlzIHdpbmRvdy4KLQotY29tbWFuZC5zaG93SW5RdWlja01lbnUubmFtZT0gU2hvdyBJbiBtZW51Ci1jb21tYW5kLnNob3dJblF1aWNrTWVudS5kZXNjcmlwdGlvbiA9IE9wZW4gdGhlIFNob3cgSW4gbWVudQotCi1jb21tYW5kLm5ld1F1aWNrTWVudS5uYW1lPSBOZXcgbWVudQotY29tbWFuZC5uZXdRdWlja01lbnUuZGVzY3JpcHRpb249IE9wZW4gdGhlIE5ldyBtZW51Ci0KLVVwZGF0ZUFjdGlvblNldC5sYWJlbCA9IFNvZnR3YXJlIFVwZGF0ZXMKLVVwZGF0ZUFjdGlvblNldC5tZW51LmxhYmVsID0gJlNvZnR3YXJlIFVwZGF0ZXMKLVVwZGF0ZUFjdGlvblNldC51cGRhdGVzLmxhYmVsID0gJkZpbmQgYW5kIEluc3RhbGwuLi4KLVVwZGF0ZUFjdGlvblNldC5jb25maWdNYW5hZ2VyLmxhYmVsID0gJk1hbmFnZSBDb25maWd1cmF0aW9uCi0KLUtleUJpbmRpbmdBY3Rpb25TZXQubGFiZWwgPSBLZXlib2FyZCBTaG9ydGN1dHMKLUtleUJpbmRpbmdBY3Rpb25TZXQuc2hvd0tleUFzc2lzdC5sYWJlbCA9ICZLZXkgQXNzaXN0Li4uCi0KLVByZWZlcmVuY2VLZXl3b3Jkcy5FZGl0aW5nID0gZWRpdGluZwotUHJlZmVyZW5jZUtleXdvcmRzLkFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlCi1QcmVmZXJlbmNlS2V5d29yZHMuR2VuZXJhbCA9IGNsaWNrIGJhY2tncm91bmQKLVByZWZlcmVuY2VLZXl3b3Jkcy5UaGVtZXMgPSB0aGVtZXMKLVByZWZlcmVuY2VLZXl3b3Jkcy5BcHBlYXJhbmNlUGFnZSA9IHByZXNlbnRhdGlvbgotUHJlZmVyZW5jZUtleXdvcmRzLlRhYnMgPSB0YWIKLVByZWZlcmVuY2VLZXl3b3Jkcy5FZGl0b3JzID0gZWRpdG9yIGVuY29kaW5nIG1ydQotUHJlZmVyZW5jZUtleXdvcmRzLktleXMgPSBiaW5kaW5nIGNvbW1hbmQgc2NoZW1lCi1QcmVmZXJlbmNlS2V5d29yZHMuUGVyc3BlY3RpdmVzID0gb3BlbiB2aWV3IHN3aXRjaAotUHJlZmVyZW5jZUtleXdvcmRzLlN0YXJ0dXBBbmRTaHV0ZG93biA9IHdvcmtiZW5jaCBwbHVnLWluIHBsdWdpbgotUHJlZmVyZW5jZUtleXdvcmRzLldvcmtzcGFjZSA9IGJ1aWxkIHJlZnJlc2gKLVByZWZlcmVuY2VLZXl3b3Jkcy5MaW5rZWRSZXNvdXJjZXMgPSBwYXRoCi0KLSMgVE9ETyBUaGlzIHN0dWZmIGlzIGp1c3QgdG8gaGVscCBtZSB3b3JrIG9uIHRoZSBwYXJzaW5nIG9mIHRoZSBtZW51cyBleHRlbnNpb24KLSMgcG9pbnQuICBJdCBpcyBsaWtlbHkgbm90IGluIGl0cyBmaW5hbCBmb3JtIHlldC4KLUdvVG9SZXNvdXJjZUl0ZW0ubW5lbW9uaWMgPSBSCi1PcGVuUmVzb3VyY2VJdGVtLm1uZW1vbmljID0gVQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTEwMzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAKLTwhLS0gSURFIGV4dGVuc2lvbiBwb2ludHMgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtYXJrZXJIZWxwIiBuYW1lPSIlRXh0UG9pbnQubWFya2VySGVscCIgc2NoZW1hPSJzY2hlbWEvbWFya2VySGVscC5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtYXJrZXJJbWFnZVByb3ZpZGVycyIgbmFtZT0iJUV4dFBvaW50Lm1hcmtlckltYWdlUHJvdmlkZXJzIiBzY2hlbWE9InNjaGVtYS9tYXJrZXJJbWFnZVByb3ZpZGVycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtYXJrZXJSZXNvbHV0aW9uIiBuYW1lPSIlRXh0UG9pbnQubWFya2VyUmVzb2x1dGlvbiIgc2NoZW1hPSJzY2hlbWEvbWFya2VyUmVzb2x1dGlvbi5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwcm9qZWN0TmF0dXJlSW1hZ2VzIiBuYW1lPSIlRXh0UG9pbnQucHJvamVjdE5hdHVyZUltYWdlcyIgc2NoZW1hPSJzY2hlbWEvcHJvamVjdE5hdHVyZUltYWdlcy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJyZXNvdXJjZUZpbHRlcnMiIG5hbWU9IiVFeHRQb2ludC5yZXNvdXJjZUZpbHRlcnMiIHNjaGVtYT0ic2NoZW1hL3Jlc291cmNlRmlsdGVycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtYXJrZXJTdXBwb3J0IiBuYW1lPSIlRXh0UG9pbnQubWFya2VyU3VwcG9ydCIgc2NoZW1hPSJzY2hlbWEvbWFya2VyU3VwcG9ydC5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ3b3JrYmVuY2giCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERUFwcGxpY2F0aW9uIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9hcHBsaWNhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+Ci0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIG5hbWU9IiVQZXJzcGVjdGl2ZS5yZXNvdXJjZVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldmlldzE2L3Jlc291cmNlX3BlcnNwLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuUmVzb3VyY2VQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIj4KLSAgICAgIDwvcGVyc3BlY3RpdmU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMiPgotICAgICAgPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkucmVzb3VyY2VQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICA8c2hvd0luUGFydAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlJlc291cmNlTmF2aWdhdG9yIj4KLSAgICAgICAgIDwvc2hvd0luUGFydD4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLQotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlSW1wb3J0RXhwb3J0V2l6YXJkcy5DYXRlZ29yeS5CYXNpYyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5CYXNpYyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgCi0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlSW1wb3J0V2l6YXJkcy5QcmVmZXJlbmNlcyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvaW1wb3J0cHJlZl9vYmouZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMuaW1wb3J0LlByZWZlcmVuY2VzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkJhc2ljIiAgICAgICAgICAgIAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLkV4dGVuc2lvbkZhY3Rvcnk6cHJlZmVyZW5jZXNJbXBvcnRXaXphcmQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUltcG9ydFdpemFyZHMuUHJlZmVyZW5jZXNEZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJUltcG9ydFdpemFyZHMuRmlsZVN5c3RlbSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9pbXBvcnRkaXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5CYXNpYyIgICAgICAgICAgICAKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5GaWxlU3lzdGVtSW1wb3J0V2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMuaW1wb3J0LkZpbGVTeXN0ZW0iPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUltcG9ydFdpemFyZHMuRmlsZVN5c3RlbURlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJUltcG9ydFdpemFyZHMuRXh0ZXJuYWxQcm9qZWN0IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld3Byal93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkJhc2ljIiAgICAgICAgICAgIAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkV4dGVybmFsUHJvamVjdEltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLmltcG9ydC5FeHRlcm5hbFByb2plY3QiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUltcG9ydFdpemFyZHMuRXh0ZXJuYWxQcm9qZWN0RGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVJbXBvcnRXaXphcmRzLlppcEZpbGUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvaW1wb3J0emlwX3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuQmFzaWMiICAgICAgICAgICAgCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuWmlwRmlsZUltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLmltcG9ydC5aaXBGaWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVJbXBvcnRXaXphcmRzLlppcEZpbGVEZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotCi0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVJbXBvcnRFeHBvcnRXaXphcmRzLkNhdGVnb3J5LkJhc2ljIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLkJhc2ljIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICAgICAgICAgICAKLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVFeHBvcnRXaXphcmRzLlByZWZlcmVuY2VzIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9leHBvcnRwcmVmX29iai5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuQmFzaWMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuRXh0ZW5zaW9uRmFjdG9yeTpwcmVmZXJlbmNlc0V4cG9ydFdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLmV4cG9ydC5QcmVmZXJlbmNlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlRXhwb3J0V2l6YXJkcy5QcmVmZXJlbmNlc0Rlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+ICAgICAgICAgCi0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlRXhwb3J0V2l6YXJkcy5GaWxlU3lzdGVtIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L2V4cG9ydGRpcl93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkJhc2ljIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkZpbGVTeXN0ZW1FeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5leHBvcnQuRmlsZVN5c3RlbSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlRXhwb3J0V2l6YXJkcy5GaWxlU3lzdGVtRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlRXhwb3J0V2l6YXJkcy5aaXBGaWxlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L2V4cG9ydHppcF93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkJhc2ljIiAgICAgICAgICAgIAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLlppcEZpbGVFeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5leHBvcnQuWmlwRmlsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlRXhwb3J0V2l6YXJkcy5aaXBGaWxlRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VySW1hZ2VQcm92aWRlcnMiPgotICAgICAgPGltYWdlcHJvdmlkZXIKLSAgICAgICAgICAgIG1hcmtlcnR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRhc2ttYXJrZXIiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V2aWV3MTYvdGFza3NfdHNrLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50YXNrTWFya2VyUHJvdmlkZXIiPgotICAgICAgPC9pbWFnZXByb3ZpZGVyPgotICAgICAgPGltYWdlcHJvdmlkZXIKLSAgICAgICAgICAgIG1hcmtlcnR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2JsZW1tYXJrZXIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLlByb2JsZW1JbWFnZVByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnByb2JsZW1NYXJrZXJQcm92aWRlciI+Ci0gICAgICA8L2ltYWdlcHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJU5ld1dpemFyZHMuQ2F0ZWdvcnkuRXhhbXBsZXMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuRXhhbXBsZXMiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJU5ld1dpemFyZHMuQ2F0ZWdvcnkuQmFzaWMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuQmFzaWMiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVOZXdXaXphcmRzLnByb2plY3QiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvbmV3cHJqX3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuQmFzaWMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZCIKLSAgICAgICAgICAgIHByb2plY3Q9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXcucHJvamVjdCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlTmV3V2l6YXJkcy5wcm9qZWN0LmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlTmV3V2l6YXJkcy5mb2xkZXIiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvbmV3Zm9sZGVyX3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuQmFzaWMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld0ZvbGRlclJlc291cmNlV2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZvbGRlciI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlTmV3V2l6YXJkcy5mb2xkZXIuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlTmV3V2l6YXJkcy5maWxlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld2ZpbGVfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5CYXNpYyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlLkJhc2ljTmV3RmlsZVJlc291cmNlV2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZpbGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJU5ld1dpemFyZHMuZmlsZS5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgbmFtZT0iJUVkaXRvcnMuV2VsY29tZUVkaXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvd2VsY29tZV9lZGl0b3IuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLldlbGNvbWVFZGl0b3IiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5XZWxjb21lRWRpdG9yQWN0aW9uQ29udHJpYnV0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuV2VsY29tZUVkaXRvciI+Ci0gICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVsZW1lbnRGYWN0b3JpZXMiPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWwuUmVzb3VyY2VGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSI+Ci0gICAgICA8L2ZhY3Rvcnk+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5tb2RlbC5Xb3Jrc3BhY2VGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLldvcmtzcGFjZUZhY3RvcnkiPgotICAgICAgPC9mYWN0b3J5PgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dEZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXRGYWN0b3J5Ij4KLSAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuV2VsY29tZUVkaXRvcklucHV0RmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLldlbGNvbWVFZGl0b3JJbnB1dEZhY3RvcnkiPgotICAgICAgPC9mYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2luZ1NldHMiPgotICAgICAgPHdvcmtpbmdTZXQKLSAgICAgICAgICAgIG5hbWU9IiVXb3JraW5nU2V0cy5yZXNvdXJjZSIKLSAgICAgICAgICAgIHBhZ2VDbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuUmVzb3VyY2VXb3JraW5nU2V0UGFnZSIKLSAgICAgICAgICAgIHVwZGF0ZXJDbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLlJlc291cmNlV29ya2luZ1NldFVwZGF0ZXIiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L3dvcmtzZXQuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UiPgotICAgICAgPC93b3JraW5nU2V0PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBsYWJlbD0iJU5hdmlnYXRlQWN0aW9uU2V0LmxhYmVsIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVOYXZpZ2F0ZUFjdGlvblNldC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIHZpc2libGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdGUuZ29Ub1Jlc291cmNlIgotICAgICAgICAgICAgICAgbGFiZWw9IiVHb1RvUmVzb3VyY2VBY3Rpb24ubGFiZWwiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2VsY2wxNi9nb3Rvb2JqX3Rzay5naWYiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ibmF2aWdhdGUvZ29Uby8iCi0gICAgICAgICAgICAgICByZXRhcmdldD0idHJ1ZSIKLSAgICAgICAgICAgICAgIGlkPSJnb1RvUmVzb3VyY2UiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLm9wZW5SZXNvdXJjZSIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlT3BlbldvcmtzcGFjZUZpbGVBY3Rpb24ubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5vcGVuX3dvcmtzcGFjZV9maWxlX2FjdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5hY3Rpb25zLk9wZW5Xb3Jrc3BhY2VGaWxlQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im5hdmlnYXRlL29wZW4uZXh0MiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5PcGVuV29ya3NwYWNlRmlsZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IiVLZXlCaW5kaW5nQWN0aW9uU2V0LmxhYmVsIgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXQua2V5QmluZGluZ3MiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVLZXlCaW5kaW5nQWN0aW9uU2V0LnNob3dLZXlBc3Npc3QubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuU2hvd0tleUFzc2lzdEhhbmRsZXIiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iaGVscC9ncm91cC5hc3Npc3QiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYWN0aW9ucy5zaG93S2V5QXNzaXN0SGFuZGxlciIKLSAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UudWkud2luZG93LnNob3dLZXlBc3Npc3QiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlV29ya2luZ1NldHNBY3Rpb25TZXQubGFiZWwiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJVdvcmtpbmdTZXRzQWN0aW9uU2V0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5Xb3JraW5nU2V0QWN0aW9uU2V0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlNlbGVjdFdvcmtpbmdTZXRzQWN0aW9uIgotICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0ZS5zZWxlY3RXb3JraW5nU2V0cyIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZWxjbDE2L3dvcmtpbmdzZXRzLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJzZWxlY3RXb3JraW5nU2V0cyIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0V29ya2luZ1NldHNBY3Rpb24ubGFiZWwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0id2luZG93L2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdWxsZG93biIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJ3b3JraW5nU2V0cyIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVXb3JraW5nU2V0c0FjdGlvblNldC50b29sdGlwIi8+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAKLSAgIDwhLS0gVE9ETyBSZXBsYWNlbWVudCBmb3IgdGhlIGFib3ZlIGFjdGlvblNldCBleHRlbnNpb24gcG9pbnQuICBUaGlzIGlzIGp1c3QKLSAgIHRvIGhlbHAgbWUgd2l0aCB3cml0aW5nIHRoZSBwYXJzZXIgZm9yIHRoZSBtZW51cyBleHRlbnNpb24gcG9pbnQuICBUaGlzIGlzCi0gICBsaWtlbHkgbm90IGluIGl0cyBmaW5hbCBmb3JtLiAgKE5vdGU6IHRoZSBoYW5kbGVycyBhcmUgbWlzc2luZykgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kSW1hZ2VzIj4KLSAgIAkJPGltYWdlCi0gICAJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLmdvVG9SZXNvdXJjZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZWxjbDE2L2dvdG9vYmpfdHNrLmdpZiIgLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlTmF2aWdhdGVBY3Rpb25TZXQubGFiZWwiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJU5hdmlnYXRlQWN0aW9uU2V0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotICAgICAgICAgICAgPHJlZmVyZW5jZSBpZD0iZ29Ub1Jlc291cmNlIiB0eXBlPSJpdGVtIiAvPgotICAgICAgICAgICAgPHJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UudWkuT3BlbldvcmtzcGFjZUZpbGUiIHR5cGU9Iml0ZW0iIC8+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgICAgIAotICAgICAgPGl0ZW0KLSAgICAgIAkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0ZS5nb1RvUmVzb3VyY2UiCi0gICAgICAgICAgICBpZD0iZ29Ub1Jlc291cmNlIj4KLSAgICAgICAgICAgIDxsb2NhdGlvbiBtbmVtb25pYz0iJUdvVG9SZXNvdXJjZUl0ZW0ubW5lbW9uaWMiPgotICAgICAgICAgICAgCTxiYXIgdHlwZT0ibWVudSIgcGF0aD0ibmF2aWdhdGUvZ29UbyIgLz4KLSAgICAgICAgICAgIDwvbG9jYXRpb24+Ci0gICAgICA8L2l0ZW0+Ci0gICAgICA8aXRlbQotICAgICAgCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLm9wZW5SZXNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5PcGVuV29ya3NwYWNlRmlsZSI+Ci0JCQk8bG9jYXRpb24gbW5lbW9uaWM9IiVPcGVuUmVzb3VyY2VJdGVtLm1uZW1vbmljIj4KLQkJCQk8YmFyIHR5cGU9Im1lbnUiIHBhdGg9Im5hdmlnYXRlL29wZW4uZXh0MiIgLz4KLQkJCTwvbG9jYXRpb24+Ci0JICA8L2l0ZW0+Ci0JICAKLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlS2V5QmluZGluZ0FjdGlvblNldC5sYWJlbCIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0LmtleUJpbmRpbmdzIj4KLSAgICAgICAgICAgIDxyZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuc2hvd0tleUFzc2lzdEhhbmRsZXIiIHR5cGU9Iml0ZW0iIC8+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgICAgIAotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5hY3Rpb25zLnNob3dLZXlBc3Npc3RIYW5kbGVyIgotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cuc2hvd0tleUFzc2lzdCI+Ci0gICAgICAgICAgICA8bG9jYXRpb24+Ci0JCQkJPGJhciB0eXBlPSJtZW51IiBwYXRoPSJoZWxwL2dyb3VwLmFzc2lzdCIgLz4KLSAgICAgICAgICAgIDwvbG9jYXRpb24+Ci0gICAgICA8L2l0ZW0+Ci0gICAgICAKLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlV29ya2luZ1NldHNBY3Rpb25TZXQubGFiZWwiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJVdvcmtpbmdTZXRzQWN0aW9uU2V0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuV29ya2luZ1NldEFjdGlvblNldCI+Ci0gICAgICAgICAgICA8cmVmZXJlbmNlIGlkPSJzZWxlY3RXb3JraW5nU2V0cyIgdHlwZT0iaXRlbSIgLz4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgICAgCi0gICAgICA8aXRlbQotICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLnNlbGVjdFdvcmtpbmdTZXRzIgotICAgICAgICAgICBpZD0ic2VsZWN0V29ya2luZ1NldHMiCi0gICAgICAgICAgIG1lbnVJZD0ic2VsZWN0V29ya2luZ1NldHMucHVsbGRvd24iPgotICAgICAgICAgICA8bG9jYXRpb24+Ci0gICAgICAgICAgIAkJPGJhciB0eXBlPSJtZW51IiBwYXRoPSJ3aW5kb3cvYWRkaXRpb25zIiAvPgotICAgICAgICAgICA8L2xvY2F0aW9uPgotICAgICAgICAgICA8bG9jYXRpb24+Ci0gICAgICAgICAgIAkJPGJhciB0eXBlPSJ0b29sIiBwYXRoPSJ3b3JraW5nU2V0cyIgLz4KLSAgICAgICAgICAgPC9sb2NhdGlvbj4KLSAgICAgIDwvaXRlbT4KLSAgICAgIAotICAgICAgPG1lbnUKLSAgICAgIAkJaWQ9InNlbGVjdFdvcmtpbmdTZXRzLnB1bGxkb3duIj4KLSAgICAgIAkJPGR5bmFtaWMgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLm1lbnVzLkR5bmFtaWNBY3Rpb25NZW51Om9yZy5lY2xpcHNlLnVpLmludGVybmFsLmFjdGlvbnMuU2VsZWN0V29ya2luZ1NldHNBY3Rpb24iIC8+Ci0gICAgICA8L21lbnU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBsaWdodHdlaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGxvY2F0aW9uPSJCT1RUT01fUklHSFQiCi0gICAgICAgICAgICBsYWJlbD0iJURlY29yYXRvckxpbmtlZFJlc291cmNlLmxhYmVsIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5MaW5rZWRSZXNvdXJjZURlY29yYXRvciIKLSAgICAgICAgICAgIHN0YXRlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLkxpbmtlZFJlc291cmNlRGVjb3JhdG9yIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVEZWNvcmF0b3JMaW5rZWRSZXNvdXJjZS5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+Ci0gICAgPGtleXdvcmQKLSAgICAgICAgICAgIGxhYmVsPSIlUHJlZmVyZW5jZUtleXdvcmRzLkVkaXRpbmciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaWRlLmVkaXRpbmciLz4KLSAgICAgIDxrZXl3b3JkCi0gICAgICAgICAgICBsYWJlbD0iJVByZWZlcmVuY2VLZXl3b3Jkcy5BcHBlYXJhbmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5hcHBlYXJhbmNlIi8+Ci0gICAgICA8a2V5d29yZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5nZW5lcmFsIgotICAgICAgICAgICAgbGFiZWw9IiVQcmVmZXJlbmNlS2V5d29yZHMuR2VuZXJhbCIvPgotICAgICAgPGtleXdvcmQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUudGhlbWVzIgotICAgICAgICAgICAgbGFiZWw9IiVQcmVmZXJlbmNlS2V5d29yZHMuVGhlbWVzIi8+Ci0gICAgICA8a2V5d29yZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5hcGVhcmFuY2VwYWdlIgotICAgICAgICAgICAgbGFiZWw9IiVQcmVmZXJlbmNlS2V5d29yZHMuQXBwZWFyYW5jZVBhZ2UiLz4KLSAgICAgIDxrZXl3b3JkCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaWRlLnRhYnMiCi0gICAgICAgICAgICBsYWJlbD0iJVByZWZlcmVuY2VLZXl3b3Jkcy5UYWJzIi8+Ci0gICAgICA8a2V5d29yZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5lZGl0b3JzIgotICAgICAgICAgICAgbGFiZWw9IiVQcmVmZXJlbmNlS2V5d29yZHMuRWRpdG9ycyAiLz4KLSAgICAgIDxrZXl3b3JkCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaWRlLmtleXMiCi0gICAgICAgICAgICBsYWJlbD0iJVByZWZlcmVuY2VLZXl3b3Jkcy5LZXlzIi8+Ci0gICAgICA8a2V5d29yZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5wZXJzcGVjdGl2ZXMiCi0gICAgICAgICAgICBsYWJlbD0iJVByZWZlcmVuY2VLZXl3b3Jkcy5QZXJzcGVjdGl2ZXMiLz4KLSAgICAgIDxrZXl3b3JkCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaWRlLnN0YXJ0dXBBbmRTaHV0ZG93biIKLSAgICAgICAgICAgIGxhYmVsPSIlUHJlZmVyZW5jZUtleXdvcmRzLlN0YXJ0dXBBbmRTaHV0ZG93biIvPgotICAgICAgPGtleXdvcmQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUud29ya3NwYWNlIgotICAgICAgICAgICAgbGFiZWw9IiVQcmVmZXJlbmNlS2V5d29yZHMuV29ya3NwYWNlIi8+Ci0gICAgICA8a2V5d29yZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5saW5rZWQiCi0gICAgICAgICAgICBsYWJlbD0iJVByZWZlcmVuY2VLZXl3b3Jkcy5MaW5rZWRSZXNvdXJjZXMiLz4KLSAgIDwvZXh0ZW5zaW9uPiAgICAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVByZWZlcmVuY2VQYWdlcy5Xb3JrYmVuY2giCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuSURFV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLldvcmtiZW5jaCI+Ci0gICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UudWkuaWRlLmdlbmVyYWwiLz4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUHJlZmVyZW5jZVBhZ2VzLkVkaXRvcnMiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLldvcmtiZW5jaCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5JREVFZGl0b3JzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkVkaXRvcnMiPgotICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5lZGl0aW5nIi8+Ci0gICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UudWkuaWRlLnRhYnMiLz4KLSAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUuZWRpdG9ycyIvPgotICAgICAgPC9wYWdlPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQcmVmZXJlbmNlUGFnZXMuUGVyc3BlY3RpdmVzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5Xb3JrYmVuY2giCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuSURFUGVyc3BlY3RpdmVzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLlBlcnNwZWN0aXZlcyI+Ci0gICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UudWkuaWRlLmFwcGVhcmFuY2UiLz4KLSAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUucGVyc3BlY3RpdmVzIi8+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVByZWZlcmVuY2VQYWdlcy5GaWxlRWRpdG9ycyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuRWRpdG9ycyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5FeHRlbnNpb25GYWN0b3J5OmZpbGVBc3NvY2lhdGlvbnNQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuRmlsZUVkaXRvcnMiPgotICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5lZGl0aW5nIi8+Ci0gICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UudWkuaWRlLmVkaXRvcnMiLz4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUHJlZmVyZW5jZVBhZ2VzLlZpZXdzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5Xb3JrYmVuY2giCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuRXh0ZW5zaW9uRmFjdG9yeTphcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLlZpZXdzIj4KLSAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUuYXBwZWFyYW5jZSIvPgotICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS50aGVtZXMiLz4KLSAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUudGFicyIvPgotICAgICAgPC9wYWdlPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQcmVmZXJlbmNlUGFnZXMuQ29sb3JzQW5kRm9udHMiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLlZpZXdzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLkV4dGVuc2lvbkZhY3Rvcnk6Y29sb3JzQW5kRm9udHNQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuQ29sb3JzQW5kRm9udHMiPgotICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5hcHBlYXJhbmNlIi8+Ci0gICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UudWkuaWRlLnRoZW1lcyIvPgotICAgICAgPC9wYWdlPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQcmVmZXJlbmNlUGFnZXMuRGVjb3JhdG9ycyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuVmlld3MiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuRXh0ZW5zaW9uRmFjdG9yeTpkZWNvcmF0b3JzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkRlY29yYXRvcnMiPgotICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5hcHBlYXJhbmNlIi8+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5Xb3JrYmVuY2giCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuSURFV29ya3NwYWNlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLldvcmtzcGFjZSIKLSAgICAgICAgICAgIG5hbWU9IiVQcmVmZXJlbmNlUGFnZXMuV29ya3NwYWNlIj4KLSAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUud29ya3NwYWNlIi8+ICAgICAgICAgCi0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLldvcmtzcGFjZSIKLSAgICAgICAgICAgIG5hbWU9IiVQcmVmZXJlbmNlUGFnZXMuQnVpbGRPcmRlciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5CdWlsZE9yZGVyUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkJ1aWxkT3JkZXIiPgotICAgICAgPC9wYWdlPgotICAgICAgCi0gICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQcmVmZXJlbmNlUGFnZXMuRmlsZVN0YXRlcyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuV29ya3NwYWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLkZpbGVTdGF0ZXNQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5GaWxlU3RhdGVzIj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIAotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQcmVmZXJlbmNlUGFnZXMuTGlua2VkUmVzb3VyY2VzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5Xb3Jrc3BhY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuTGlua2VkUmVzb3VyY2VzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkxpbmtlZFJlc291cmNlcyI+Ci0gICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UudWkuaWRlLmxpbmtlZCIvPgotICAgICAgPC9wYWdlPgotICAgICAgCi0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVByZWZlcmVuY2VQYWdlcy5TdGFydHVwIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5Xb3JrYmVuY2giCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuSURFU3RhcnR1cFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5TdGFydHVwIj4KLSAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUuc3RhcnR1cEFuZFNodXRkb3duIi8+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVByZWZlcmVuY2VQYWdlcy5LZXlzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5Xb3JrYmVuY2giCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuRXh0ZW5zaW9uRmFjdG9yeTprZXlzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLktleXMiPgotICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5rZXlzIi8+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVByZWZlcmVuY2VQYWdlcy5OZXdLZXlzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5Xb3JrYmVuY2giCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuRXh0ZW5zaW9uRmFjdG9yeTpuZXdLZXlzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLk5ld0tleXMiPgotICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5rZXlzIi8+Ci0gICAgICA8L3BhZ2U+Ci0gICAgCi0gICAgICA8cGFnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLkV4dGVuc2lvbkZhY3Rvcnk6Y29udGVudFR5cGVzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkNvbnRlbnRUeXBlcyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuV29ya2JlbmNoIgotICAgICAgICAgICAgbmFtZT0iJVByZWZlcmVuY2VQYWdlcy5Db250ZW50VHlwZXMiPgotICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5lZGl0aW5nIi8+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJVZpZXdzLlByb2dyZXNzIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldmlldzE2L3B2aWV3LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcm9ncmVzcy5Qcm9ncmVzc1ZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MuUHJvZ3Jlc3NWaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIlVmlld3MuUmVzb3VyY2VOYXZpZ2F0b3IiCi0gICAgICAgICAgICBpY29uPSIkbmwkL2ljb25zL2Z1bGwvZXZpZXcxNi9maWxlbmF2X25hdi5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlJlc291cmNlTmF2aWdhdG9yIj4KLSAgICAgIDwvdmlldz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIlVmlld3MuQm9va21hcmsiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V2aWV3MTYvYmttcmtfbmF2LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLkJvb2ttYXJrVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Cb29rbWFya1ZpZXciPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiVWaWV3cy5UYXNrIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldmlldzE2L3Rhc2tzX3Rzay5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5UYXNrVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5UYXNrTGlzdCI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJVZpZXdzLlByb2JsZW0iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V2aWV3MTYvcHJvYmxlbXNfdmlldy5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5Qcm9ibGVtVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUucmVzb3VyY2VGaWx0ZXJzIj4KLSAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgIHNlbGVjdGVkPSJmYWxzZSIKLSAgICAgICAgICAgIHBhdHRlcm49Ii4qIj4KLSAgICAgIDwvZmlsdGVyPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgbmFtZT0iJVByb3BlcnR5UGFnZXMucHJvamVjdC5yZWZlcmVuY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuUHJvamVjdFJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlwYWdlcy5wcm9qZWN0LnJlZmVyZW5jZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIKLSAgICAgICAgICAgIG5hbWU9IiVQcm9wZXJ0eVBhZ2VzLmluZm8uZmlsZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5SZXNvdXJjZUluZm9QYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5cGFnZXMuaW5mby5maWxlIj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWNhdGVnb3J5LnByb2plY3QubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY2F0ZWdvcnkucHJvamVjdC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5wcm9qZWN0Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVjYXRlZ29yeS5wZXJzcGVjdGl2ZS5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjYXRlZ29yeS5wZXJzcGVjdGl2ZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5wZXJzcGVjdGl2ZXMiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgCQluYW1lPSIlY29tbWFuZC5zaG93UGVyc3BlY3RpdmUubmFtZSIKLSAgICAgIAkJZGVzY3JpcHRpb249IiVjb21tYW5kLnNob3dQZXJzcGVjdGl2ZS5kZXNjcmlwdGlvbiIKLSAgICAgIAkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkucGVyc3BlY3RpdmVzIgotICAgICAgCQlpZD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZSIKLSAgICAgIAkJZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLlNob3dQZXJzcGVjdGl2ZUhhbmRsZXIiPgotICAgICAgCQk8Y29tbWFuZFBhcmFtZXRlcgotICAgICAgCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUucGVyc3BlY3RpdmVJZCIKLSAgICAgIAkJCW5hbWU9IiVjb21tYW5kLnNob3dQZXJzcGVjdGl2ZS5wZXJzcGVjdGl2ZUlkUGFyYW1ldGVyIgotICAgICAgCQkJdmFsdWVzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnkuUGVyc3BlY3RpdmVQYXJhbWV0ZXJWYWx1ZXMiIC8+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQub3BlbldvcmtzcGFjZS5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLm9wZW5Xb3Jrc3BhY2UuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5maWxlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZpbGUub3BlbldvcmtzcGFjZSI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQubmV3UXVpY2tNZW51Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQubmV3UXVpY2tNZW51LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZmlsZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5maWxlLm5ld1F1aWNrTWVudSI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLnNob3dJblF1aWNrTWVudS5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLnNob3dJblF1aWNrTWVudS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5Lm5hdmlnYXRlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLnNob3dJblF1aWNrTWVudSI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuZ29Ub1Jlc291cmNlLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuZ29Ub1Jlc291cmNlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkubmF2aWdhdGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdGUuZ29Ub1Jlc291cmNlIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgICAgIAotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLm9wZW5SZXNvdXJjZS5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLm9wZW5SZXNvdXJjZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5Lm5hdmlnYXRlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLm9wZW5SZXNvdXJjZSI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQub3BlblByb2plY3QubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5vcGVuUHJvamVjdC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LnByb2plY3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJvamVjdC5vcGVuUHJvamVjdCI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuY2xvc2VQcm9qZWN0Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuY2xvc2VQcm9qZWN0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkucHJvamVjdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5wcm9qZWN0LmNsb3NlUHJvamVjdCI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuYnVpbGRQcm9qZWN0Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuYnVpbGRQcm9qZWN0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkucHJvamVjdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5wcm9qZWN0LmJ1aWxkUHJvamVjdCI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQucmVidWlsZFByb2plY3QubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5yZWJ1aWxkUHJvamVjdC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LnByb2plY3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJvamVjdC5yZWJ1aWxkUHJvamVjdCI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuYnVpbGRBbGwubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5idWlsZEFsbC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LnByb2plY3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJvamVjdC5idWlsZEFsbCI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQucmVidWlsZEFsbC5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLnJlYnVpbGRBbGwuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5wcm9qZWN0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnByb2plY3QucmVidWlsZEFsbCI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuYnVpbGRMYXN0Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuYnVpbGRMYXN0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkucHJvamVjdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5wcm9qZWN0LmJ1aWxkTGFzdCI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuYnVpbGRDbGVhbi5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLmJ1aWxkQ2xlYW4uZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5wcm9qZWN0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnByb2plY3QuY2xlYW5BY3Rpb24iPgotICAgICAgPC9jb21tYW5kPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLnByb2plY3RQcm9wZXJ0aWVzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQucHJvamVjdFByb3BlcnRpZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5wcm9qZWN0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnByb2plY3QucHJvcGVydGllcyI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuYWRkVGFzay5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLmFkZFRhc2suZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuYWRkVGFzayI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuY29ycmVjdGlvbkFzc2lzdFByb3Bvc2Fscy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLmNvcnJlY3Rpb25Bc3Npc3RQcm9wb3NhbHMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5lZGl0LnRleHQuamF2YS5jb3JyZWN0aW9uLmFzc2lzdC5wcm9wb3NhbHMiPgotICAgICAgPC9jb21tYW5kPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLnNlbGVjdFdvcmtpbmdTZXRzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuc2VsZWN0V29ya2luZ1NldHMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS53aW5kb3ciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdGUuc2VsZWN0V29ya2luZ1NldHMiPgotICAgICAgPC9jb21tYW5kPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kSW1hZ2VzIj4KLSAgICAgIDxpbWFnZQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0ZS5nb1RvUmVzb3VyY2UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2VsY2wxNi9nb3Rvb2JqX3Rzay5naWYiIC8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgCQkgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmJpbmRpbmdzIj4KLSAgICAgIDxrZXkKLSAgICAgIAkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cuc2hvd0tleUFzc2lzdCIKLSAgICAgIAkJY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5kaWFsb2dBbmRXaW5kb3ciCi0gICAgICAJCXNlcXVlbmNlPSJNMStNMitMIgotICAgICAgCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuamR0LnVpLmVkaXQudGV4dC5qYXZhLmNvcnJlY3Rpb24uYXNzaXN0LnByb3Bvc2FscyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMSsxIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLm9wZW5SZXNvdXJjZSIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMStNMitSIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLm9wZW5SZXNvdXJjZSIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJDVFJMK1ggQ1RSTCtGIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmVtYWNzQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5wcm9qZWN0LmJ1aWxkQWxsIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK0IiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdGUuc2hvd0luUXVpY2tNZW51IgotICAgICAgICAgICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy53aW5kb3ciCi0gICAgICAgICAgICBzZXF1ZW5jZT0iTTIrTTMrVyIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgcGxhdGZvcm09ImNhcmJvbiIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93IgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0yK00zK1ciCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIHBsYXRmb3JtPSJjYXJib24iCi0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLnNob3dJblF1aWNrTWVudSIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93IgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK00zK1ciCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5uZXdRdWlja01lbnUiCi0gICAgICAgICAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLndpbmRvdyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMitNMytOIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBwbGF0Zm9ybT0iY2FyYm9uIgotICAgICAgICAgICAgY29tbWFuZElkPSIiCi0gICAgICAgICAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLndpbmRvdyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMitNMytOIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBwbGF0Zm9ybT0iY2FyYm9uIgotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5maWxlLm5ld1F1aWNrTWVudSIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93IgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0yK00zK04iCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMitNMytRIFgiCi0gICAgICAgICAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLndpbmRvdyIKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkudmlld3Muc2hvd1ZpZXciCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIAotICAgICAgICAgICAgCWlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93Vmlldy52aWV3SWQiCi0gICAgICAgICAgICAJdmFsdWU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3IiAvPgotICAgICAgPC9rZXk+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBwbGF0Zm9ybT0iY2FyYm9uIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0yK00zK1EgWCIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBwbGF0Zm9ybT0iY2FyYm9uIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK00zK1EgWCIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93IgotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93VmlldyIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgCi0gICAgICAgICAgICAJaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnNob3dWaWV3LnZpZXdJZCIgCi0gICAgICAgICAgICAJdmFsdWU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3IiAvPgotICAgICAgPC9rZXk+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBzZXF1ZW5jZT0iTTIrTTMrUSBPIgotICAgICAgICAgICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy53aW5kb3ciCi0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnNob3dWaWV3IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotICAgICAgICAgICAgPHBhcmFtZXRlcgotICAgICAgICAgICAgCWlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93Vmlldy52aWV3SWQiCi0gICAgICAgICAgICAJdmFsdWU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLkNvbnRlbnRPdXRsaW5lIiAvPgotICAgICAgPC9rZXk+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBwbGF0Zm9ybT0iY2FyYm9uIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0yK00zK1EgTyIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBwbGF0Zm9ybT0iY2FyYm9uIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK00zK1EgTyIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93IgotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93VmlldyIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIKLSAgICAgICAgICAgIAlpZD0ib3JnLmVjbGlwc2UudWkudmlld3Muc2hvd1ZpZXcudmlld0lkIiAKLSAgICAgICAgICAgIAl2YWx1ZT0ib3JnLmVjbGlwc2UudWkudmlld3MuQ29udGVudE91dGxpbmUiIC8+Ci0gICAgICA8L2tleT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3lzdGVtU3VtbWFyeVNlY3Rpb25zIj4KLSAgICAgIDxzZWN0aW9uCi0gICAgICAJCWlkPSIxNS5VcGRhdGVTZWN0aW9uIgotICAgICAgICAgICAgc2VjdGlvblRpdGxlPSIlQWJvdXQudXBkYXRlU3VtbWFyeVRpdGxlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLkNvbmZpZ3VyYXRpb25Mb2dVcGRhdGVTZWN0aW9uIj4KLSAgICAgIDwvc2VjdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08IS0tIFVwZGF0ZSBBY3Rpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IiVVcGRhdGVBY3Rpb25TZXQubGFiZWwiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5zb2Z0d2FyZVVwZGF0ZXMiPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGxhYmVsPSIlVXBkYXRlQWN0aW9uU2V0Lm1lbnUubGFiZWwiCi0gICAgICAgICAgICAgICBwYXRoPSJoZWxwL2dyb3VwLnVwZGF0ZXMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLnVwZGF0ZU1lbnUiPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgbmFtZT0iZ3JvdXAwIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgbmFtZT0iZ3JvdXAxIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVVcGRhdGVBY3Rpb25TZXQuY29uZmlnTWFuYWdlci5sYWJlbCIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZWxjbDE2L2NvbmZpZ3MuZ2lmIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLm5ld1VwZGF0ZXMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLnVwZGF0ZS5Db25maWd1cmF0aW9uTWFuYWdlckFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJoZWxwL29yZy5lY2xpcHNlLnVwZGF0ZS51aS51cGRhdGVNZW51L2dyb3VwMCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuY29uZmlnTWFuYWdlciI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlVXBkYXRlQWN0aW9uU2V0LnVwZGF0ZXMubGFiZWwiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2VsY2wxNi91c2VhcmNoX29iai5naWYiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkubmV3VXBkYXRlcyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUudXBkYXRlLkluc3RhbGxXaXphcmRBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iaGVscC9vcmcuZWNsaXBzZS51cGRhdGUudWkudXBkYXRlTWVudS9ncm91cDAiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLm5ld1VwZGF0ZXMiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgICA8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSBFbmQgVXBkYXRlIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLSAgICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aS5pZGUiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlTWFwcGluZyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWwuUHJvamVjdFBlcnNpc3RlbnRQcm9wZXJ0eVRlc3RlciIKLSAgICAgICAgICAgIHByb3BlcnRpZXM9InByb2plY3RQZXJzaXN0ZW50UHJvcGVydHkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaWRlLm1hcHBpbmdQcm9qZWN0UGVyc2lzdGVudFByb3BlcnR5VGVzdGVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0gICAgICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgICAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkuaWRlIgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5tb2RlbC5Qcm9qZWN0UGVyc2lzdGVudFByb3BlcnR5VGVzdGVyIgotICAgICAgICAgICAgcHJvcGVydGllcz0icHJvamVjdFBlcnNpc3RlbnRQcm9wZXJ0eSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUucHJvamVjdFBlcnNpc3RlbnRQcm9wZXJ0eVRlc3RlciIvPgotICAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlVHJhbnNmZXIiPgotICAgICAgIDx0cmFuc2ZlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS50cmFuc2Zlci5rZXlzIgotICAgICAgICAgICAgaWNvbj0iXGljb25zXGZ1bGxcb2JqMTZca2V5c3ByZWZfb2JqLmdpZiIKLSAgICAgICAgICAgIG5hbWU9IiVLZXlzUHJlZmVyZW5jZS5OYW1lIj4KLSAgICAgICAgICAgIDxtYXBwaW5nIHNjb3BlPSJpbnN0YW5jZSI+Ci0gICAgICAgICAgICAJPGVudHJ5IG5vZGU9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCI+Ci0gICAgICAgICAgICAJICAgPGtleSBuYW1lPSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyIvPgotICAgICAgICAgICAgCTwvZW50cnk+Ci0gICAgICAgICAgICAJPGVudHJ5IG5vZGU9Im9yZy5lY2xpcHNlLnVpIj4KLSAgICAgICAgICAgIAkgICA8a2V5IG5hbWU9IktFWV9DT05GSUdVUkFUSU9OX0lEIi8+Ci0gICAgICAgICAgICAJPC9lbnRyeT4KLSAgICAgICAgICAgIDwvbWFwcGluZz4KLQkJCTxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIAklS2V5c1ByZWZlcmVuY2UuRGVzY3JpcHRpb24KLQkJICAgIDwvZGVzY3JpcHRpb24+Ci0JICAgPC90cmFuc2Zlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tIEFkYXB0b3IgZmFjdG9yeSBmb3IgSVdvcmtpbmdTZXQgdG8gSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyLCBJV29ya2JlbmNoQWRhcHRlciwgUmVzb3VyY2VNYXBwaW5nIC0tPgotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5yZXNvdXJjZU1hcHBpbmdBZGFwdGVycyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsLldvcmtpbmdTZXRBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0Ij4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLnVpLklDb250cmlidXRvclJlc291cmNlQWRhcHRlciIvPgotICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5tb2RlbC5Xb3JraW5nU2V0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldCI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciIvPgotICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5tb2RlbC5Xb3JraW5nU2V0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldCI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlTWFwcGluZyIvPgotICAgICAgIDwvZmFjdG9yeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aXZpdHlTdXBwb3J0Ij4KLSAgICAgIDx0cmlnZ2VyUG9pbnQgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5uYXR1cmVzIj4KLSAgICAgICAgIDxoaW50Ci0gICAgICAgICAgICAgICBpZD0iaW50ZXJhY3RpdmUiCi0gICAgICAgICAgICAgICB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwvdHJpZ2dlclBvaW50PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLm1hcmtlclN1cHBvcnQiPgotICAgICAgPGhpZXJhcmNoeT4KLSAgICAgICAgIDxtYXJrZXJUeXBlUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIi8+Ci0gICAgICAgICA8aGllcmFyY2h5UmVmZXJlbmNlIHR5cGU9IlNFVkVSSVRZIi8+Ci0gICAgICAgICA8aGllcmFyY2h5UmVmZXJlbmNlIHR5cGU9IlJFU09VUkNFIi8+Ci0gICAgICA8L2hpZXJhcmNoeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsLk1vZGVsUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNb2RlbFByb3ZpZGVyIj4KLSAgICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmlkZS5JRWRpdG9yT3BlblN0cmF0ZWd5Ii8+Ci0gICAgICA8L2ZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zY2hlbWEvbWFya2VySGVscC5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc2NoZW1hL21hcmtlckhlbHAuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5N2E0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zY2hlbWEvbWFya2VySGVscC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpLmlkZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIiBpZD0ibWFya2VySGVscCIgbmFtZT0iTWFya2VyIEhlbHAiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSBoZWxwIGNvbnRleHQgaWQgd2l0aCBhIHNwZWNpZmljICZxdW90O2tpbmQmcXVvdDsgb2YgbWFya2VyIChhIG1hcmtlciBvZiBhIGNlcnRhaW4gdHlwZSBvciBoYXZpbmcgY2VydGFpbiBhdHRyaWJ1dGUgdmFsdWVzKS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWFya2VySGVscCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibWFya2VySGVscCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFya2VyVHlwZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdW5pcXVlIHR5cGUgb2YgdGhlIG1hcmtlciBmb3Igd2hpY2ggdGhlIGhlbHAgY29udGV4dCBhcHBsaWVzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhlbHBDb250ZXh0SWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgaGVscCBjb250ZXh0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdob3NlIHZhbHVlIGlzIGJlaW5nIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMCAob3JpZ2luYWxseSBhZGRlZCBpbiByZWxlYXNlIDIuMCBhcyBvcmcuZWNsaXBzZS51aS5tYXJrZXJIZWxwKQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBtYXJrZXIgaGVscCBleHRlbnNpb24gKG5vdGUgdGhlIHN1Yi1lbGVtZW50IGFuZCB0aGUgd2F5IGF0dHJpYnV0ZXMgYXJlIHVzZWQpOgotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pZGUubWFya2VySGVscCZxdW90OyZndDsKLSAgJmx0O21hcmtlckhlbHAKLSAgIG1hcmtlclR5cGU9JnF1b3Q7b3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5yZWFkbWVtYXJrZXImcXVvdDsKLSAgIGhlbHBDb250ZXh0SWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5tYXJrZXJfZXhhbXBsZTFfY29udGV4dCZxdW90OyZndDsKLSAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLmlkJnF1b3Q7IHZhbHVlPSZxdW90OzEyMzQmcXVvdDsvJmd0OwotICAmbHQ7L21hcmtlckhlbHAmZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLQotSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGEgaGVscCBjb250ZXh0IGlkIGlzIGFzc29jaWF0ZWQgd2l0aCBtYXJrZXJzIG9mIHR5cGUgb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5yZWFkbWVtYXJrZXIKLXdob3NlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wuaWQgYXR0cmlidXRlIGhhcyBhIHZhbHVlIG9mIDEyMzQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgSXQgaXMgdXAgdG8gdGhlIGRldmVsb3BlciB0byBlbnN1cmUgdGhhdCBvbmx5IGEgc2luZ2xlIGhlbHAgY29udGV4dCBpZCBpcyBzdXBwbGllZCBmb3IgYSBnaXZlbiBtYXJrZXIuCi1JZiB0d28gb3IgbW9yZSBoZWxwIGNvbnRleHQgaWRzIGFyZSBzdXBwbGllZCBmb3IgYSBnaXZlbiBraW5kIG9mIG1hcmtlciwgdGhlIHdvcmtiZW5jaCBkb2VzIG5vdCBkZWZpbmUgd2hpY2ggd2lsbCBiZSByZXR1cm5lZC4KLUhvd2V2ZXIgdGhlIHdvcmtiZW5jaCBkb2VzIGRlZmluZSB0aGF0IHRoZSAmcXVvdDttb3N0IHNwZWNpZmljJnF1b3Q7IGNvbnRleHQgaWQgd2lsbCBhbHdheXMgYmUgcmV0dXJuZWQgZm9yIGEgZ2l2ZW4gbWFya2VyLgotVGhhdCBpcywgYSBjb250ZXh0IGlkIGFzc29jaWF0ZWQgd2l0aCB0aHJlZSBtYXRjaGluZyBhdHRyaWJ1dGUgdmFsdWVzIHdpbGwgYmUgcmV0dXJuZWQgYmVmb3JlIGEgY29udGV4dCBpZCBhc3NvY2lhdGVkIHdpdGggb25seSB0d28uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NjaGVtYS9tYXJrZXJJbWFnZVByb3ZpZGVycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc2NoZW1hL21hcmtlckltYWdlUHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNGJhMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc2NoZW1hL21hcmtlckltYWdlUHJvdmlkZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkuaWRlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiIGlkPSJtYXJrZXJJbWFnZVByb3ZpZGVycyIgbmFtZT0iTWFya2VyIEltYWdlIFByb3ZpZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgbWFya2VySW1hZ2VQcm92aWRlciBleHRlbnNpb24gcG9pbnQgaXMgdGhlIHBvaW50IGZvciBzcGVjaWZ5aW5nIHRoZSBpbWFnZXMgZm9yIG1hcmtlciB0eXBlcyBpbiB0aGUgZGVmaW5pbmcgcGx1Zy1pbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW1hZ2Vwcm92aWRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpbWFnZXByb3ZpZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgbWFya2VySW1hZ2VQcm92aWRlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXJrZXJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBtYXJrZXJ0eXBlIGlzIHRoZSBpZCBvZiB0aGUgdHlwZSBkZWZpbmVkIGluICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXImbHQ7L2NvZGUmZ3Q7IHRoYXQgdGhpcyBkZWZpbml0aW9uIGlzIGFwcGxpZWQgdG8uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBubyBjbGFzcyBkZWZpbmVkIHRoZSBpY29uIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgaWNvbiB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGlzIHR5cGUgb2YgbWFya2VyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyBpcyB0aGUgZnVsbHkgcXVhbGlmZWQgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbG9vayB1cCBhbiBpbWFnZS4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtJTWFya2VySW1hZ2VQcm92aWRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMCAob3JpZ2luYWxseSBhZGRlZCBpbiByZWxlYXNlIDIuMSBhcyBvcmcuZWNsaXBzZS51aS5tYXJrZXJJbWFnZVByb3ZpZGVycykKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBhbiBleGFtcGxlIG9mIHRoZSB0d28gZm9ybXMgb2YgbWFya2VyIGltYWdlIHByb3ZpZGVycy4gVGhlIGZpcnN0IG9uZSBpcyBvbmUgd2hlcmUgdGhlIGltYWdlIGRvZXMgbm90IGNoYW5nZSBhbmQgaXMgZGVjbGFyZWQgZGlyZWN0bHkuIEZvciB0aGUgc2Vjb25kIG9uZSB0aGUgaW1hZ2UgbXVzdCBiZSBkZXRlcm1pbmVkIGJ5IGFuIGluc3RhbmNlIG9mIElNYXJrZXJJbWFnZVByb3ZpZGVyLgotIAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pZGUubWFya2VySW1hZ2VQcm92aWRlcnMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7aW1hZ2Vwcm92aWRlcgotICAgICAgICBtYXJrZXJ0eXBlPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRhc2ttYXJrZXImcXVvdDsKLSAgICAgICAgICAgIGljb249JnF1b3Q7dGFza2ljb24uZ2lmJnF1b3Q7Ci0gICAgICAgICAgICBpZD0mcXVvdDtteVBsdWdpbi5kZWNsYXJhdGl2ZU1hcmtlclByb3ZpZGVyJnF1b3Q7Jmd0OwotICAgICAgJmx0Oy9pbWFnZXByb3ZpZGVyJmd0OwotICAgICAgJmx0O2ltYWdlcHJvdmlkZXIKLSAgICAgICAgICAgIG1hcmtlcnR5cGU9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciZxdW90OwotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7bXlQbHVnaW4uTXlJTWFya2VySW1hZ2VQcm92aWRlciZxdW90OwotICAgICAgICAgICAgaWQ9JnF1b3Q7bXlQbHVnaW4uaW1wbGVtZW50ZWRNYXJrZXJQcm92aWRlciZxdW90OyZndDsKLSAgICAgICZsdDsvaW1hZ2Vwcm92aWRlciZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zY2hlbWEvbWFya2VyUmVzb2x1dGlvbi5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc2NoZW1hL21hcmtlclJlc29sdXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJjNGIzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zY2hlbWEvbWFya2VyUmVzb2x1dGlvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpLmlkZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIiBpZD0ibWFya2VyUmVzb2x1dGlvbiIgbmFtZT0iTWFya2VyIFJlc29sdXRpb25zIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gYXNzb2NpYXRlIGEgbWFya2VyIHJlc29sdXRpb24gZ2VuZXJhdG9yIHdpdGggYSBzcGVjaWZpYyAmcXVvdDtraW5kJnF1b3Q7IG9mIG1hcmtlci4KLShhIG1hcmtlciBvZiBhIGNlcnRhaW4gdHlwZSBvciBoYXZpbmcgY2VydGFpbiBhdHRyaWJ1dGUgdmFsdWVzKS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpbXBsZW1lbnRpbmcgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFya2VyVHlwZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdHlwZSBvZiBtYXJrZXIgZm9yIHdoaWNoIHRoZSBoZWxwIGNvbnRleHQgYXBwbGllcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSBpcyBiZWluZyBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHNwZWNpZmllZCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjAgKG9yaWdpbmFsbHkgYWRkZWQgaW4gcmVsZWFzZSAyLjAgYXMgb3JnLmVjbGlwc2UudWkubWFya2VyUmVzb2x1dGlvbikKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgbWFya2VyIHJlc29sdXRpb24gZ2VuZXJhdG9yIGV4dGVuc2lvbiAobm90ZSB0aGUgc3ViLWVsZW1lbnQgYW5kIHRoZSB3YXkgYXR0cmlidXRlcyBhcmUgdXNlZCk6Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uJnF1b3Q7Jmd0OwotICAmbHQ7bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgotICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5SZWFkbWVNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yJnF1b3Q7Ci0gICBtYXJrZXJUeXBlPSZxdW90O29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wucmVhZG1lbWFya2VyJnF1b3Q7Jmd0OwotICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wuaWQmcXVvdDsgdmFsdWU9JnF1b3Q7MTIzNCZxdW90Oy8mZ3Q7Ci0gICZsdDsvbWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotCi1JbiB0aGUgZXhhbXBsZSBhYm92ZSwgYSBtYXJrZXIgcmVzb2x1dGlvbiBnZW5lcmF0b3IgaXMgYXNzb2NpYXRlZCB3aXRoIG1hcmtlcnMgb2YgdHlwZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLnJlYWRtZW1hcmtlcgotd2hvc2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVkbWV0b29sLmlkIGF0dHJpYnV0ZSBoYXMgYSB2YWx1ZSBvZiAxMjM0LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIE1vcmUgdGhhbiBvbmUgbWFya2VyIGhlbHAgZ2VuZXJhdG9yIG1heSBiZSBzdXBwbGllZCBmb3IgYSBnaXZlbiBtYXJrZXIuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NjaGVtYS9tYXJrZXJTdXBwb3J0LmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zY2hlbWEvbWFya2VyU3VwcG9ydC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGI5YWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NjaGVtYS9tYXJrZXJTdXBwb3J0LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkuaWRlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiIGlkPSJtYXJrZXJTdXBwb3J0IiBuYW1lPSJNYXJrZXIgU3VwcG9ydCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgTWFya2VyIFN1cHBvcnQgZXh0ZW5zaW9uIHBvaW50IGRlZmluZXMgZXh0ZW5zaW9ucyB0byB0aGUgd29ya2JlbmNoIHRvb2xzIHRoYXQgc2hvdyBtYXJrZXJzIHN1Y2ggYXMgdGhlIHByb2JsZW1zLCBib29rbWFya3MgYW5kIHRhc2tzIHZpZXdzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9ibGVtRmlsdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1hcmtlclR5cGVDYXRlZ29yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtYXJrZXJHcm91cGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9ibGVtRmlsdGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIHByb2JsZW0gZmlsdGVyIGlzIGEgZmlsdGVyIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gcHJvYmxlbXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlbGVjdGVkVHlwZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgV2hldGhlciBvciBub3QgdGhpcyBmaWx0ZXIgaXMgZW5hYmxlZCBieSBkZWZhdWx0LiBJZiB0aGlzIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgdGhlIHZhbHVlIGlzIHRydWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NvcGUiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBzY29wZSBvZiB0aGUgZmlsdGVyLiBPbmUgb2YgCi1PTl9BTlk6IGFueSBpdGVtIGluIHRoZSB3b3JrYmVuY2gKLU9OX1NFTEVDVEVEX09OTFk6IG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbQotT05fU0VMRUNURURfQU5EX0NISUxEUkVOOiBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gYW5kIGl0JmFwb3M7cyBjaGlsZHJlbgotT05fQU5ZX0lOX1NBTUVfQ09OVEFJTkVSOiBvbiBhbnkgaXRlbSB3aXRoIHRoZSBzYW1lIHRvcCBsZXZlbCBjb250YWluZXIgYXMgdGhlIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iT05fQU5ZIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik9OX1NFTEVDVEVEX09OTFkiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iT05fU0VMRUNURURfQU5EX0NISUxEUkVOIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik9OX0FOWV9JTl9TQU1FX0NPTlRBSU5FUiI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvbkRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0byBjaGVjayBhZ2FpbnN0LiBJZiB0aGlzIHZhbHVlIGlzIHByZWNlZGVkIHdpdGggYSAhIHRoZSBjaGVjayB3aWxsIGNoZWNrIHRoYXQgdGhlIGRlc2NyaXB0aW9uIGRvZXMgbm90IGNvbnRhaW4gdGhpcyBzdHJpbmcuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2V2ZXJpdHkiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBzZXZlcml0eSBvZiBwcm9ibGVtIHRoaXMgZmlsdGVyIGlzIGVuYWJsZWQgZm9yLiBJZiB0aGlzIHZhbHVlIGlzIG5vdCBzZXQgdGhlbiBubyBmaWx0ZXJpbmcgYnkgc2V2ZXJpdHkgd2lsbCBvY2N1ci4gU2V2ZXJpdHkgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogRVJST1IsIFdBUk5JTkcgb3IgSU5GTy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkVSUk9SIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IldBUk5JTkciPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5GTyI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBodW1hbiByZWFkYWJsZSBuYW1lIG9mIHRoZSBmaWx0ZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgZmlsdGVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZWxlY3RlZFR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBzZWxlY3RlZFR5cGVzIGFyZSB0aGUgaWRzIG9mIHRoZSBtYXJrZXIgdHlwZXMgc2VsZWN0ZWQgYnkgZGVmYXVsdCBpbiB0aGlzIGZpbHRlci4gSWYgdGhlcmUgYXJlIG5vIHNlbGVjdGVkIHR5cGVzIGFsbCBtYXJrZXIgdHlwZXMgYXJlIGVuYWJsZWQuIEFsbCB0eXBlcyBub3Qgc3BlY2lmaWVkIGluIHRoaXMgZmlsdGVyIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXJrZXJJZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgYSBtYXJrZXIgdGhhdCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1hcmtlclR5cGVDYXRlZ29yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIG1hcmtlclR5cGVDYXRlZ29yeSBpcyBhbiBlbGVtZW50IGZvciBncm91cGluZyBtYXJrZXIgdHlwZXMgaW50byBhIHNpbmdsZSBjYXRlZ29yeS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWFya2VyVHlwZVJlZmVyZW5jZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbGFiZWwgaXMgdGhlIGh1bWFuIHJlYWRhYmxlIG5hbWUgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtYXJrZXJUeXBlUmVmZXJlbmNlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgbWFya2VyVHlwZVJlZmVyZW5jZSBpcyBhIHJlZmVyZW5jZSB0byBhIG1hcmtlclR5cGUgZGVmaW5lZCB1c2luZyB0aGUgZXh0ZW5zaW9uIHBvaW50IGluIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIG1hcmtlclR5cGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibWFya2VyR3JvdXBpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImxhYmVsIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgbWFya2VyR3JvdXBpbmcgaXMgYSBkZWZpbml0aW9uIG9mIGEgZ3JvdXBpbmcgY3JpdGVyZWEgZm9yIHRoZSBtYXJrZXIgdmlld3MgdGhhdCBzdXBwb3J0IGl0IChjdXJyZW50bHkgb25seSB0aGUgcHJvYmxlbXMgdmlldykuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1hcmtlclR5cGVSZWZlcmVuY2UiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWFya2VyQXR0cmlidXRlTWFwcGluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGUgaXMgdGhlIG5hbWUgb2YgdGhlIG1hcmtlciBhdHRyaWJ1dGUgdG8gdGVzdCBmb3IgdGhpcyBjYXRlZ29yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBsYWJlbCBpcyB0aGUgaHVtYW4gcmVhZGFibGUgU3RyaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgZW50cnkgaW4gdGhlIEdyb3VwIEJ5LSZndDsgbWVudSBmb3IgdGhpcyBtYXJrZXIgZ3JvdXBpbmcuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1hcmtlckF0dHJpYnV0ZU1hcHBpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgbWFya2VyQXR0cmlidXRlTWFwcGluZyBtYXBzIGEgbWFya2VyIGF0dHJpYnV0ZSB0byBhIG5hbWUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBpcyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IGlzIHVzZWQgaW4gdGhpcyBtYXBwaW5nLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNhdGVnb3J5IHRoYXQgdGhpcyBhdHRyaWJ1dGUgdmFsdWUgaW5kaWNhdGVzCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcHJvYmxlbSBmaWx0ZXIgZGVmaW5pdGlvbiBpbiB0aGUgbWFya2VyIHN1cHBvcnQuIFRoaXMgZXhhbXBsZSBvbmx5IHNob3dzIGphdmEgd2FybmluZ3Mgb24gdGhlIHNlbGVjdGVkIGVsZW1lbnQgYW5kIGl0JmFwb3M7cyBjaGlsZHJlbiBhbmQgZmlsdGVycyBvdXQgdGhvc2Ugd2l0aCB0aGUgU3RyaW5nIE5PTi1OTFMKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJTdXBwb3J0JnF1b3Q7Jmd0OwotICAmbHQ7cHJvYmxlbUZpbHRlcgotICAgIG5hbWUgPSAmcXVvdDtXYXJuaW5ncyZxdW90OwotICAgIGlkID0gJnF1b3Q7b3JnLmVjbGlwc2UuZXhhbXBsZS53YXJuaW5nRmlsdGVyJnF1b3Q7Ci0gICAgZW5hYmxlZCA9ICZxdW90O3RydWUmcXVvdDsKLSAgICBzY29wZT0mcXVvdDtPTl9TRUxFQ1RFRF9BTkRfQ0hJTERSRU4mcXVvdDsKLSAgICBvbkRlc2NyaXB0aW9uPSZxdW90OyFOT04tTkxTJnF1b3Q7Ci0gICAgc2V2ZXJpdHk9JnF1b3Q7V0FSTklORyZxdW90OwotICAmZ3Q7Ci0gICZsdDtzZWxlY3RlZFR5cGUKLSAgICBtYXJrZXJJZD0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyJnF1b3Q7LyZndDsKLSAgJmx0Oy9wcm9ibGVtRmlsdGVyJmd0OwotICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NjaGVtYS9wcm9qZWN0TmF0dXJlSW1hZ2VzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zY2hlbWEvcHJvamVjdE5hdHVyZUltYWdlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGUyNDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NjaGVtYS9wcm9qZWN0TmF0dXJlSW1hZ2VzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkuaWRlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiIGlkPSJwcm9qZWN0TmF0dXJlSW1hZ2VzIiBuYW1lPSJQcm9qZWN0IE5hdHVyZSBJbWFnZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhc3NvY2lhdGUgYW4gaW1hZ2Ugd2l0aCBhIHByb2plY3QgbmF0dXJlLgotVGhlIHN1cHBsaWVkIGltYWdlIGlzIHVzZWQgdG8gZm9ybSBhIGNvbXBvc2l0ZSBpbWFnZSBjb25zaXN0aW5nIG9mIHRoZSBzdGFuZGFyZCBwcm9qZWN0IGltYWdlIGNvbWJpbmVkIHdpdGggdGhlIGltYWdlIG9mIGl0cyBuYXR1cmUuCi1UaGUgc3VwcGxpZWQgaW1hZ2UgaXMgZHJhd24gb3ZlciB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgYmFzZSBpbWFnZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW1hZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImltYWdlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgbmF0dXJlIGltYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hdHVyZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgbmF0dXJlIGZvciB3aGljaCB0aGUgaW1hZ2UgaXMgYmVpbmcgc3VwcGxpZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHJlbGF0aXZlIG5hbWUgb2YgdGhlIGltYWdlIHRoYXQgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwZXJzcGVjdGl2ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIGEgc2hvcnQgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGlzIGltYWdlIHJlcHJlc2VudHMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMCAob3JpZ2luYWxseSBhZGRlZCBpbiByZWxlYXNlIDEuMCBhcyBvcmcuZWNsaXBzZS51aS5wcm9qZWN0TmF0dXJlSW1hZ2VzKQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBuYXR1cmUgaW1hZ2UgZXh0ZW5zaW9uOgotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pZGUucHJvamVjdE5hdHVyZUltYWdlcyZxdW90OyZndDsKLSAgJmx0O2ltYWdlIAotICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLnVpLmphdmFOYXR1cmVJbWFnZSZxdW90OwotICAgIG5hdHVyZUlkPSZxdW90O1Jlc291cmNlJnF1b3Q7Ci0gICAgaWNvbj0mcXVvdDtpY29ucy9qYXZhTmF0dXJlLmdpZiZxdW90OyZndDsKLSAgJmx0Oy9pbWFnZSZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgJmx0O3NhbXAmZ3Q7bmF0dXJlSWQmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBpcyB0aGUgbmF0dXJlIGlkIGFzIGRlZmluZWQgYnkgdGhlIHBsdWdpbiBjcmVhdGluZyB0aGUgcHJvamVjdC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc2NoZW1hL3Jlc291cmNlRmlsdGVycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc2NoZW1hL3Jlc291cmNlRmlsdGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTQ2YzI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NjaGVtYS9yZXNvdXJjZUZpbHRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aS5pZGUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIgaWQ9InJlc291cmNlRmlsdGVycyIgbmFtZT0iUmVzb3VyY2UgRmlsdGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCBwcmVkZWZpbmVkIGZpbHRlcnMgdG8gdmlld3Mgd2hpY2ggc2hvdyByZXNvdXJjZXMsIHN1Y2ggYXMgdGhlIE5hdmlnYXRvciB2aWV3LgotVGhlc2UgZmlsdGVycyBjYW4gYmUgc2VsZWN0ZWQgdG8gaGlkZSByZXNvdXJjZXMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlIGZpbHRlciZhcG9zO3MgcGF0dGVybi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmlsdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdHRlcm4iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHBhdHRlcm4gdG8gbWF0Y2guICBNYXkgY29udGFpbiAqIGFuZCA/IHdpbGRjYXJkcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZWxlY3RlZCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0iZmFsc2UiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICZxdW90O3RydWUmcXVvdDsgaWYgdGhlIHBhdHRlcm4gc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQsICZxdW90O2ZhbHNlJnF1b3Q7IG9yIHVuZGVmaW5lZCBpZiBub3QuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcHVycG9zZSBvZiB0aGlzIGZpbHRlci4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4wIChvcmlnaW5hbGx5IGFkZGVkIGluIHJlbGVhc2UgMS4wIGFzIG9yZy5lY2xpcHNlLnVpLnJlc291cmNlRmlsdGVycykKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcmVzb3VyY2UgZmlsdGVyIGV4dGVuc2lvbiwgd2hpY2ggZmlsdGVycyBvdXQgY2xhc3MgZmlsZXMsIGFuZCBpcyBzZWxlY3RlZCBieSBkZWZhdWx0OgotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pZGUucmVzb3VyY2VGaWx0ZXJzJnF1b3Q7Jmd0OwotICAmbHQ7ZmlsdGVyIHBhdHRlcm49JnF1b3Q7Ki5jbGFzcyZxdW90OyBzZWxlY3RlZD0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaWRlL0lDb250cmlidXRvclJlc291cmNlQWRhcHRlcjIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjJmNjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmlkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklDb250cmlidXRvclJlc291cmNlQWRhcHRlcjsKLQotLyoqCi0gKiBBbiBleHRlbnNpb24gdG8gdGhlIDxjb2RlPklDb250cmlidXRvclJlc291cmNlQWRhcHRlcjwvY29kZT4gdGhhdCBhZGFwdHMgCi0gKiBhIG1vZGVsIG9iamVjdCB0byBhIDxjb2RlPlJlc291cmNlTWFwcGluZzwvY29kZT4uCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIyIGV4dGVuZHMgSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgbWFwcGluZyB0aGF0IHRoZSBzdXBwbGllZCBhZGFwdGFibGUgCi0gICAgICogYWRhcHRzIHRvLiBBbiA8Y29kZT5JQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIyPC9jb2RlPiBhc3N1bWVzCi0gICAgICogdGhhdCBhbnkgb2JqZWN0IHBhc3NlZCB0byBpdCBhZGFwdHMgdG8gb25lIGVxdWl2YWxlbnQKLSAgICAgKiByZXNvdXJjZSBtYXBwaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhZGFwdGFibGUgdGhlIGFkYXB0YWJsZSBiZWluZyBxdWVyaWVkCi0gICAgICogQHJldHVybiBhIHJlc291cmNlIG1hcHBpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlCi0gICAgICogIGlzIG5vIGFkYXB0ZWQgcmVzb3VyY2UgbWFwcGluZyBmb3IgdGhpcyB0eXBlCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlTWFwcGluZyBnZXRBZGFwdGVkUmVzb3VyY2VNYXBwaW5nKElBZGFwdGFibGUgYWRhcHRhYmxlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvSURFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaWRlL0lERS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjMwZGY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvSURFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmlkZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VySGVscFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5FZGl0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnkuTWFya2VySGVscFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeS5NYXJrZXJIZWxwUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubWlzYy5VSVN0YXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi0vKioKLSAqIENvbGxlY3Rpb24gb2YgSURFLXNwZWNpZmljIEFQSXMgZmFjdG9yZWQgb3V0IG9mIGV4aXN0aW5nIHdvcmtiZW5jaC4KLSAqIFRoaXMgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZDsgYWxsIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQgYnkgCi0gKiBzdGF0aWMgbWV0aG9kcyBhbmQgZmllbGRzLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJREUgewotICAgIC8qKgotICAgICAqIFRoZSBwZXJzaXN0ZW50IHByb3BlcnR5IGtleSB1c2VkIG9uIElGaWxlIHJlc291cmNlcyB0byBjb250YWluCi0gICAgICogdGhlIHByZWZlcnJlZCBlZGl0b3IgSUQgdG8gdXNlLgotICAgICAqIDxwPgotICAgICAqIEV4YW1wbGUgb2YgcmV0cmlldmluZyB0aGUgcGVyc2lzdGVkIGVkaXRvciBpZDoKLSAgICAgKiA8cHJlPjxjb2RlPgotICAgICAqIElGaWxlIGZpbGUgPSAuLi4KLSAgICAgKiBJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3JEZXNjID0gbnVsbDsKLSAgICAgKiB0cnkgewotICAgICAqIAlTdHJpbmcgZWRpdG9ySUQgPSBmaWxlLmdldFBlcnNpc3RlbnRQcm9wZXJ0eShFRElUT1JfS0VZKTsKLSAgICAgKiAJaWYgKGVkaXRvcklEICE9IG51bGwpIHsKLSAgICAgKiAJCWVkaXRvckRlc2MgPSBlZGl0b3JSZWcuZmluZEVkaXRvcihlZGl0b3JJRCk7Ci0gICAgICogCX0KLSAgICAgKiB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgKiAJLy8gaGFuZGxlIHByb2JsZW0gYWNjZXNzaW5nIHBlcnNpc3RlbnQgcHJvcGVydHkgaGVyZQotICAgICAqIH0KLSAgICAgKiA8L2NvZGU+PC9wcmU+Ci0gICAgICogPC9wPjxwPgotICAgICAqIEV4YW1wbGUgb2YgcGVyc2lzdGluZyB0aGUgZWRpdG9yIGlkOgotICAgICAqIDxwcmU+PGNvZGU+Ci0gICAgICogSUZpbGUgZmlsZSA9IC4uLgotICAgICAqIHRyeSB7Ci0gICAgICogCWZpbGUuc2V0UGVyc2lzdGVudFByb3BlcnR5KEVESVRPUl9LRVksIGVkaXRvckRlc2MuZ2V0SWQoKSk7Ci0gICAgICogfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICogCS8vIGhhbmRsZSBwcm9ibGVtIHNldHRpbmcgcGVyc2lzdGVudCBwcm9wZXJ0eSBoZXJlCi0gICAgICogfQotICAgICAqIDwvY29kZT48L3ByZT4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIEVESVRPUl9LRVkgPSBuZXcgUXVhbGlmaWVkTmFtZSgKLSAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5SZXNvdXJjZUVkaXRvclJlZ2lzdHJ5IiwgIkVkaXRvclByb3BlcnR5Iik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEFuIG9wdGlvbmFsIGF0dHJpYnV0ZSB3aXRoaW4gYSB3b3Jrc3BhY2UgbWFya2VyICg8Y29kZT5JTWFya2VyPC9jb2RlPikgd2hpY2gKLSAgICAgKiBpZGVudGlmaWVzIHRoZSBwcmVmZXJyZWQgZWRpdG9yIHR5cGUgdG8gYmUgb3BlbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRF9BVFRSID0gIm9yZy5lY2xpcHNlLnVpLmVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIHJlc291cmNlIGJhc2VkIHBlcnNwZWN0aXZlIGlkZW50aWZpZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfUEVSU1BFQ1RJVkVfSUQgPSAib3JnLmVjbGlwc2UudWkucmVzb3VyY2VQZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIE1hcmtlciBoZWxwIHJlZ2lzdHJ5IG1hcHBpbmcgbWFya2VycyB0byBoZWxwIGNvbnRleHQgaWRzIGFuZCByZXNvbHV0aW9uczsKLSAgICAgKiBsYXppbHkgaW5pdGlhbGl6ZWQgb24gZmlzdCBhY2Nlc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFya2VySGVscFJlZ2lzdHJ5IG1hcmtlckhlbHBSZWdpc3RyeSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFuZGFyZCBzaGFyZWQgaW1hZ2VzIGRlZmluZWQgYnkgdGhlIElERS4gVGhlc2UgYXJlIG92ZXIgYW5kIGFib3ZlIHRoZQotICAgICAqIHN0YW5kYXJkIHdvcmtiZW5jaCBpbWFnZXMgZGVjbGFyZWQgaW4ge0BsaW5rIG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXMKLSAgICAgKiBJU2hhcmVkSW1hZ2VzfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBTaGFyZWRJbWFnZXMgewotICAgICAgICAvKioKLSAgICAgICAgICogSWRlbnRpZmllcyBhIHByb2plY3QgaW1hZ2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfT0JKX1BST0pFQ1QgPSAiSU1HX09CSl9QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZGVudGlmaWVzIGEgY2xvc2VkIHByb2plY3QgaW1hZ2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfT0JKX1BST0pFQ1RfQ0xPU0VEID0gIklNR19PQkpfUFJPSkVDVF9DTE9TRUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElkZW50aWZpZXMgdGhlIGltYWdlIHVzZWQgZm9yICJvcGVuIG1hcmtlciIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfT1BFTl9NQVJLRVIgPSAiSU1HX09QRU5fTUFSS0VSIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZGVudGlmaWVzIHRoZSBkZWZhdWx0IGltYWdlIHVzZWQgdG8gaW5kaWNhdGUgYSB0YXNrLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX09CSlNfVEFTS19UU0sgPSAiSU1HX09CSlNfVEFTS19UU0siOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElkZW50aWZpZXMgdGhlIGRlZmF1bHQgaW1hZ2UgdXNlZCB0byBpbmRpY2F0ZSBhIGJvb2ttYXJrLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX09CSlNfQktNUktfVFNLID0gIklNR19PQkpTX0JLTVJLX1RTSyI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmVmZXJlbmNlcyBkZWZpbmVkIGJ5IHRoZSBJREUgd29ya2JlbmNoLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFByZWZlcmVuY2VzIHsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIG5hbWVkIHByZWZlcmVuY2UgZm9yIGhvdyBhIG5ldyBwZXJzcGVjdGl2ZSBzaG91bGQgYmUgb3BlbmVkCi0gICAgICAgICAqIHdoZW4gYSBuZXcgcHJvamVjdCBpcyBjcmVhdGVkLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LiAgVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmUgZGVmaW5lZCAKLSAgICAgICAgICogYnkgdGhlIGNvbnN0YW50cyA8Y29kZT5PUEVOX1BFUlNQRUNUSVZFX1dJTkRPVywgT1BFTl9QRVJTUEVDVElWRV9QQUdFLCAKLSAgICAgICAgICogT1BFTl9QRVJTUEVDVElWRV9SRVBMQUNFLCBhbmQgTk9fTkVXX1BFUlNQRUNUSVZFPC9jb2RlPi4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cyNPUEVOX1BFUlNQRUNUSVZFX1dJTkRPVwotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzI09QRU5fUEVSU1BFQ1RJVkVfUEFHRQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzI09QRU5fUEVSU1BFQ1RJVkVfUkVQTEFDRQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzI05PX05FV19QRVJTUEVDVElWRQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9PUEVOX05FV19QRVJTUEVDVElWRSA9ICJQUk9KRUNUX09QRU5fTkVXX1BFUlNQRUNUSVZFIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIHdvcmtzcGFjZSBzZWxlY3Rpb24gZGlhbG9nIHNob3VsZCBiZSBzaG93biBvbiBzdGFydHVwLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwcmVmZXJlbmNlIGlzIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAc2luY2UgMy4xCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX1dPUktTUEFDRV9TRUxFQ1RJT05fRElBTE9HID0gIlNIT1dfV09SS1NQQUNFX1NFTEVDVElPTl9ESUFMT0ciOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBTdG9yZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHdvcmtzcGFjZXMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZQotICAgICAgICAgKiBDaG9vc2VXb3Jrc3BhY2VEaWFsb2cuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzaW5jZSAzLjEKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9SRUNFTlRfV09SS1NQQUNFUyA9ICJNQVhfUkVDRU5UX1dPUktTUEFDRVMiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBTdG9yZXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgcmVjZW50bHkgdXNlZCB3b3Jrc3BhY2UgcGF0aHMuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzaW5jZSAzLjEKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ0VOVF9XT1JLU1BBQ0VTID0gIlJFQ0VOVF9XT1JLU1BBQ0VTIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogU3RvcmVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbCB1c2VkIHRvIGRlY29kZS9lbmNvZGUgdGhlIGxpc3Qgb2YgcmVjZW50IHdvcmtzcGFjZXMuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzaW5jZSAzLjEKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ0VOVF9XT1JLU1BBQ0VTX1BST1RPQ09MID0gIlJFQ0VOVF9XT1JLU1BBQ0VTX1BST1RPQ09MIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCbG9jayBpbnN0YW50aWF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgSURFKCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFya2VyIGhlbHAgcmVnaXN0cnkgZm9yIHRoZSB3b3JrYmVuY2guCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWFya2VyIGhlbHAgcmVnaXN0cnkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElNYXJrZXJIZWxwUmVnaXN0cnkgZ2V0TWFya2VySGVscFJlZ2lzdHJ5KCkgewotICAgICAgICBpZiAobWFya2VySGVscFJlZ2lzdHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1hcmtlckhlbHBSZWdpc3RyeSA9IG5ldyBNYXJrZXJIZWxwUmVnaXN0cnkoKTsKLSAgICAgICAgICAgIG5ldyBNYXJrZXJIZWxwUmVnaXN0cnlSZWFkZXIoKS5hZGRIZWxwKG1hcmtlckhlbHBSZWdpc3RyeSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcmtlckhlbHBSZWdpc3RyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJzb3IgYW5kIHNlbGVjdGlvbiBzdGF0ZSBmb3IgdGhlIGdpdmVuIGVkaXRvciB0byAKLSAgICAgKiByZXZlYWwgdGhlIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBtYXJrZXIuCi0gICAgICogVGhpcyBpcyBkb25lIG9uIGEgYmVzdCBlZmZvcnQgYmFzaXMuICBJZiB0aGUgZWRpdG9yIGRvZXMgbm90Ci0gICAgICogcHJvdmlkZSBhbiA8Y29kZT5JR290b01hcmtlcjwvY29kZT4gaW50ZXJmYWNlIChlaXRoZXIgZGlyZWN0bHkKLSAgICAgKiBvciB2aWEgPGNvZGU+SUFkYXB0YWJsZS5nZXRBZGFwdGVyPC9jb2RlPiksIHRoaXMgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWRpdG9yIHRoZSBlZGl0b3IKLSAgICAgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ290b01hcmtlcihJRWRpdG9yUGFydCBlZGl0b3IsIElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIElHb3RvTWFya2VyIGdvdG9NYXJrZXIgPSBudWxsOwotICAgICAgICBpZiAoZWRpdG9yIGluc3RhbmNlb2YgSUdvdG9NYXJrZXIpIHsKLSAgICAgICAgICAgIGdvdG9NYXJrZXIgPSAoSUdvdG9NYXJrZXIpIGVkaXRvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdvdG9NYXJrZXIgPSAoSUdvdG9NYXJrZXIpIGVkaXRvci5nZXRBZGFwdGVyKElHb3RvTWFya2VyLmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ290b01hcmtlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnb3RvTWFya2VyLmdvdG9NYXJrZXIobWFya2VyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIGFuIGVkaXRvciBvbiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBwYWdlIGFscmVhZHkgaGFzIGFuIGVkaXRvciBvcGVuIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRoZW4gdGhhdAotICAgICAqIGVkaXRvciBpcyBicm91Z2h0IHRvIGZyb250OyBvdGhlcndpc2UsIGEgbmV3IGVkaXRvciBpcyBvcGVuZWQuCi0gICAgICogPHA+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHBhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYWdlIGluIHdoaWNoIHRoZSBlZGl0b3Igd2lsbCBiZSBvcGVuZWQKLSAgICAgKiBAcGFyYW0gaW5wdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBlZGl0b3IgaW5wdXQKLSAgICAgKiBAcGFyYW0gZWRpdG9ySWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgZWRpdG9yIGV4dGVuc2lvbiB0byB1c2UKLSAgICAgKiBAcmV0dXJuIGFuIG9wZW4gZWRpdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFuIGV4dGVybmFsIGVkaXRvciB3YXMKLSAgICAgKiAgICAgICAgIG9wZW5lZAotICAgICAqIEBleGNlcHRpb24gUGFydEluaXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZWRpdG9yIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2Ujb3BlbkVkaXRvcihJRWRpdG9ySW5wdXQsIFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5FZGl0b3IoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLSAgICAgICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCwgU3RyaW5nIGVkaXRvcklkKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICAvL3Nhbml0eSBjaGVja3MKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICAvLyBvcGVuIHRoZSBlZGl0b3Igb24gdGhlIGZpbGUKLSAgICAgICAgcmV0dXJuIHBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgZWRpdG9ySWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIGFuIGVkaXRvciBvbiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBwYWdlIGFscmVhZHkgaGFzIGFuIGVkaXRvciBvcGVuIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRoZW4gdGhhdAotICAgICAqIGVkaXRvciBpcyBicm91Z2h0IHRvIGZyb250OyBvdGhlcndpc2UsIGEgbmV3IGVkaXRvciBpcyBvcGVuZWQuIElmCi0gICAgICogPGNvZGU+YWN0aXZhdGUgPT0gdHJ1ZTwvY29kZT4gdGhlIGVkaXRvciB3aWxsIGJlIGFjdGl2YXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBAcGFyYW0gcGFnZQotICAgICAqICAgICAgICAgICAgdGhlIHBhZ2UgaW4gd2hpY2ggdGhlIGVkaXRvciB3aWxsIGJlIG9wZW5lZAotICAgICAqIEBwYXJhbSBpbnB1dAotICAgICAqICAgICAgICAgICAgdGhlIGVkaXRvciBpbnB1dAotICAgICAqIEBwYXJhbSBlZGl0b3JJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBlZGl0b3IgZXh0ZW5zaW9uIHRvIHVzZQotICAgICAqIEBwYXJhbSBhY3RpdmF0ZQotICAgICAqIAkJCSAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGVkaXRvciB3aWxsIGJlIGFjdGl2YXRlZAotICAgICAqIEByZXR1cm4gYW4gb3BlbiBlZGl0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYW4gZXh0ZXJuYWwgZWRpdG9yIHdhcwotICAgICAqICAgICAgICAgb3BlbmVkCi0gICAgICogQGV4Y2VwdGlvbiBQYXJ0SW5pdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBlZGl0b3IgY291bGQgbm90IGJlIGluaXRpYWxpemVkCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZSNvcGVuRWRpdG9yKElFZGl0b3JJbnB1dCwgU3RyaW5nLCBib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkVkaXRvcihJV29ya2JlbmNoUGFnZSBwYWdlLAotICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0LCBTdHJpbmcgZWRpdG9ySWQsIGJvb2xlYW4gYWN0aXZhdGUpCi0gICAgICAgICAgICB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICAvL3Nhbml0eSBjaGVja3MKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICAvLyBvcGVuIHRoZSBlZGl0b3Igb24gdGhlIGZpbGUKLSAgICAgICAgcmV0dXJuIHBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgZWRpdG9ySWQsIGFjdGl2YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlZGl0b3Igb24gdGhlIGdpdmVuIGZpbGUgcmVzb3VyY2UuICBUaGlzIG1ldGhvZCB3aWxsIGF0dGVtcHQgdG8KLQkgKiByZXNvbHZlIHRoZSBlZGl0b3IgYmFzZWQgb24gY29udGVudC10eXBlIGJpbmRpbmdzIGFzIHdlbGwgYXMgdHJhZGl0aW9uYWwKLQkgKiBuYW1lL2V4dGVuc2lvbiBiaW5kaW5ncy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcGFnZSBhbHJlYWR5IGhhcyBhbiBlZGl0b3Igb3BlbiBvbiB0aGUgdGFyZ2V0IG9iamVjdCB0aGVuIHRoYXQKLSAgICAgKiBlZGl0b3IgaXMgYnJvdWdodCB0byBmcm9udDsgb3RoZXJ3aXNlLCBhIG5ldyBlZGl0b3IgaXMgb3BlbmVkLiBJZgotICAgICAqIDxjb2RlPmFjdGl2YXRlID09IHRydWU8L2NvZGU+IHRoZSBlZGl0b3Igd2lsbCBiZSBhY3RpdmF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogQHBhcmFtIHBhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYWdlIGluIHdoaWNoIHRoZSBlZGl0b3Igd2lsbCBiZSBvcGVuZWQKLSAgICAgKiBAcGFyYW0gaW5wdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBlZGl0b3IgaW5wdXQKLSAgICAgKiBAcGFyYW0gYWN0aXZhdGUKLSAgICAgKiAJCQkgIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBlZGl0b3Igd2lsbCBiZSBhY3RpdmF0ZWQKLSAgICAgKiBAcmV0dXJuIGFuIG9wZW4gZWRpdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFuIGV4dGVybmFsIGVkaXRvciB3YXMKLSAgICAgKiAgICAgICAgIG9wZW5lZAotICAgICAqIEBleGNlcHRpb24gUGFydEluaXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZWRpdG9yIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2Ujb3BlbkVkaXRvcihvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQsCi0gICAgICogICAgICBTdHJpbmcsIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIElGaWxlIGlucHV0LAotICAgICAgICAgICAgYm9vbGVhbiBhY3RpdmF0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIG9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGFjdGl2YXRlLCB0cnVlKTsKLSAgICB9Ci0JCi0JLyoqCi0gICAgICogT3BlbnMgYW4gZWRpdG9yIG9uIHRoZSBnaXZlbiBmaWxlIHJlc291cmNlLiAgVGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCi0JICogcmVzb2x2ZSB0aGUgZWRpdG9yIGJhc2VkIG9uIGNvbnRlbnQtdHlwZSBiaW5kaW5ncyBhcyB3ZWxsIGFzIHRyYWRpdGlvbmFsCi0JICogbmFtZS9leHRlbnNpb24gYmluZGluZ3MgaWYgPGNvZGU+ZGV0ZXJtaW5lQ29udGVudFR5cGU8L2NvZGU+IGlzCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHBhZ2UgYWxyZWFkeSBoYXMgYW4gZWRpdG9yIG9wZW4gb24gdGhlIHRhcmdldCBvYmplY3QgdGhlbiB0aGF0Ci0gICAgICogZWRpdG9yIGlzIGJyb3VnaHQgdG8gZnJvbnQ7IG90aGVyd2lzZSwgYSBuZXcgZWRpdG9yIGlzIG9wZW5lZC4gSWYKLSAgICAgKiA8Y29kZT5hY3RpdmF0ZSA9PSB0cnVlPC9jb2RlPiB0aGUgZWRpdG9yIHdpbGwgYmUgYWN0aXZhdGVkLgotICAgICAqIDxwPgotICAgICAqIEBwYXJhbSBwYWdlCi0gICAgICogICAgICAgICAgICB0aGUgcGFnZSBpbiB3aGljaCB0aGUgZWRpdG9yIHdpbGwgYmUgb3BlbmVkCi0gICAgICogQHBhcmFtIGlucHV0Ci0gICAgICogICAgICAgICAgICB0aGUgZWRpdG9yIGlucHV0Ci0gICAgICogQHBhcmFtIGFjdGl2YXRlCi0gICAgICogCQkJICBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgZWRpdG9yIHdpbGwgYmUgYWN0aXZhdGVkCi0gICAgICogQHBhcmFtIGRldGVybWluZUNvbnRlbnRUeXBlCi0gICAgICogCQkJICBhdHRlbXB0IHRvIHJlc29sdmUgdGhlIGNvbnRlbnQgdHlwZSBmb3IgdGhpcyBmaWxlCi0gICAgICogQHJldHVybiBhbiBvcGVuIGVkaXRvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbiBleHRlcm5hbCBlZGl0b3Igd2FzCi0gICAgICogICAgICAgICBvcGVuZWQKLSAgICAgKiBAZXhjZXB0aW9uIFBhcnRJbml0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGVkaXRvciBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlI29wZW5FZGl0b3Iob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0LAotICAgICAqICAgICAgU3RyaW5nLCBib29sZWFuKQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5FZGl0b3IoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgSUZpbGUgaW5wdXQsCi0gICAgICAgICAgICBib29sZWFuIGFjdGl2YXRlLCBib29sZWFuIGRldGVybWluZUNvbnRlbnRUeXBlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICAvL3Nhbml0eSBjaGVja3MKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICAvLyBvcGVuIHRoZSBlZGl0b3Igb24gdGhlIGZpbGUKLSAgICAgICAgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzYyA9IGdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQsIGRldGVybWluZUNvbnRlbnRUeXBlKTsKLSAgICAgICAgcmV0dXJuIHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGlucHV0KSwgZWRpdG9yRGVzYy5nZXRJZCgpLAotICAgICAgICAgICAgICAgIGFjdGl2YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlZGl0b3Igb24gdGhlIGdpdmVuIGZpbGUgcmVzb3VyY2UuICBUaGlzIG1ldGhvZCB3aWxsIGF0dGVtcHQgdG8KLQkgKiByZXNvbHZlIHRoZSBlZGl0b3IgYmFzZWQgb24gY29udGVudC10eXBlIGJpbmRpbmdzIGFzIHdlbGwgYXMgdHJhZGl0aW9uYWwKLQkgKiBuYW1lL2V4dGVuc2lvbiBiaW5kaW5ncy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcGFnZSBhbHJlYWR5IGhhcyBhbiBlZGl0b3Igb3BlbiBvbiB0aGUgdGFyZ2V0IG9iamVjdCB0aGVuIHRoYXQKLSAgICAgKiBlZGl0b3IgaXMgYnJvdWdodCB0byBmcm9udDsgb3RoZXJ3aXNlLCBhIG5ldyBlZGl0b3IgaXMgb3BlbmVkLgotICAgICAqIDxwPgotICAgICAqIEBwYXJhbSBwYWdlCi0gICAgICogICAgICAgICAgICB0aGUgcGFnZSBpbiB3aGljaCB0aGUgZWRpdG9yIHdpbGwgYmUgb3BlbmVkCi0gICAgICogQHBhcmFtIGlucHV0Ci0gICAgICogICAgICAgICAgICB0aGUgZWRpdG9yIGlucHV0Ci0gICAgICogQHJldHVybiBhbiBvcGVuIGVkaXRvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbiBleHRlcm5hbCBlZGl0b3Igd2FzCi0gICAgICogICAgICAgICBvcGVuZWQKLSAgICAgKiBAZXhjZXB0aW9uIFBhcnRJbml0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGVkaXRvciBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlI29wZW5FZGl0b3IoSUVkaXRvcklucHV0LCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIElGaWxlIGlucHV0KQotICAgICAgICAgICAgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgLy9zYW5pdHkgY2hlY2tzCi0gICAgICAgIGlmIChwYWdlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gb3BlbiB0aGUgZWRpdG9yIG9uIHRoZSBmaWxlCi0gICAgICAgIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2MgPSBnZXRFZGl0b3JEZXNjcmlwdG9yKGlucHV0KTsKLSAgICAgICAgcmV0dXJuIHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGlucHV0KSwgZWRpdG9yRGVzYy5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlZGl0b3Igb24gdGhlIGdpdmVuIGZpbGUgcmVzb3VyY2UuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHBhZ2UgYWxyZWFkeSBoYXMgYW4gZWRpdG9yIG9wZW4gb24gdGhlIHRhcmdldCBvYmplY3QgdGhlbiB0aGF0Ci0gICAgICogZWRpdG9yIGlzIGJyb3VnaHQgdG8gZnJvbnQ7IG90aGVyd2lzZSwgYSBuZXcgZWRpdG9yIGlzIG9wZW5lZC4KLSAgICAgKiA8cD4KLSAgICAgKiBAcGFyYW0gcGFnZQotICAgICAqICAgICAgICAgICAgdGhlIHBhZ2UgaW4gd2hpY2ggdGhlIGVkaXRvciB3aWxsIGJlIG9wZW5lZAotICAgICAqIEBwYXJhbSBpbnB1dAotICAgICAqICAgICAgICAgICAgdGhlIGVkaXRvciBpbnB1dAotICAgICAqIEBwYXJhbSBlZGl0b3JJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBlZGl0b3IgZXh0ZW5zaW9uIHRvIHVzZQotICAgICAqIEByZXR1cm4gYW4gb3BlbiBlZGl0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYW4gZXh0ZXJuYWwgZWRpdG9yIHdhcwotICAgICAqICAgICAgICAgb3BlbmVkCi0gICAgICogQGV4Y2VwdGlvbiBQYXJ0SW5pdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBlZGl0b3IgY291bGQgbm90IGJlIGluaXRpYWxpemVkCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZSNvcGVuRWRpdG9yKElFZGl0b3JJbnB1dCwgU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkVkaXRvcihJV29ya2JlbmNoUGFnZSBwYWdlLCBJRmlsZSBpbnB1dCwKLSAgICAgICAgICAgIFN0cmluZyBlZGl0b3JJZCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgLy9zYW5pdHkgY2hlY2tzCi0gICAgICAgIGlmIChwYWdlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gb3BlbiB0aGUgZWRpdG9yIG9uIHRoZSBmaWxlCi0gICAgICAgIHJldHVybiBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChpbnB1dCksIGVkaXRvcklkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlZGl0b3Igb24gdGhlIGdpdmVuIGZpbGUgcmVzb3VyY2UuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHBhZ2UgYWxyZWFkeSBoYXMgYW4gZWRpdG9yIG9wZW4gb24gdGhlIHRhcmdldCBvYmplY3QgdGhlbiB0aGF0Ci0gICAgICogZWRpdG9yIGlzIGJyb3VnaHQgdG8gZnJvbnQ7IG90aGVyd2lzZSwgYSBuZXcgZWRpdG9yIGlzIG9wZW5lZC4gSWYKLSAgICAgKiA8Y29kZT5hY3RpdmF0ZSA9PSB0cnVlPC9jb2RlPiB0aGUgZWRpdG9yIHdpbGwgYmUgYWN0aXZhdGVkLgotICAgICAqIDxwPgotICAgICAqIEBwYXJhbSBwYWdlCi0gICAgICogICAgICAgICAgICB0aGUgcGFnZSBpbiB3aGljaCB0aGUgZWRpdG9yIHdpbGwgYmUgb3BlbmVkCi0gICAgICogQHBhcmFtIGlucHV0Ci0gICAgICogICAgICAgICAgICB0aGUgZWRpdG9yIGlucHV0Ci0gICAgICogQHBhcmFtIGVkaXRvcklkCi0gICAgICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGVkaXRvciBleHRlbnNpb24gdG8gdXNlCi0gICAgICogQHBhcmFtIGFjdGl2YXRlCi0gICAgICogCQkJICBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgZWRpdG9yIHdpbGwgYmUgYWN0aXZhdGVkCi0gICAgICogQHJldHVybiBhbiBvcGVuIGVkaXRvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbiBleHRlcm5hbCBlZGl0b3Igd2FzCi0gICAgICogICAgICAgICBvcGVuZWQKLSAgICAgKiBAZXhjZXB0aW9uIFBhcnRJbml0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGVkaXRvciBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlI29wZW5FZGl0b3IoSUVkaXRvcklucHV0LCBTdHJpbmcsIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIElGaWxlIGlucHV0LAotICAgICAgICAgICAgU3RyaW5nIGVkaXRvcklkLCBib29sZWFuIGFjdGl2YXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICAvL3Nhbml0eSBjaGVja3MKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICAvLyBvcGVuIHRoZSBlZGl0b3Igb24gdGhlIGZpbGUKLSAgICAgICAgcmV0dXJuIHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGlucHV0KSwgZWRpdG9ySWQsIGFjdGl2YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBSZXR1cm5zIGFuIGVkaXRvciBkZXNjcmlwdG9yIGFwcHJvcHJpYXRlIGZvciBvcGVuaW5nIHRoZSBnaXZlbiBmaWxlCi0JICogcmVzb3VyY2UuICAKLQkgKiA8cD4KLQkgKiBUaGUgZWRpdG9yIGRlc2NyaXB0b3IgaXMgZGV0ZXJtaW5lZCB1c2luZyBhIG11bHRpc3RlcCBwcm9jZXNzLiBUaGlzCi0JICogbWV0aG9kIHdpbGwgYXR0ZW1wdCB0byByZXNvbHZlIHRoZSBlZGl0b3IgYmFzZWQgb24gY29udGVudC10eXBlIGJpbmRpbmdzCi0JICogYXMgd2VsbCBhcyB0cmFkaXRpb25hbCBuYW1lL2V4dGVuc2lvbiBiaW5kaW5ncy4KLQkgKiA8L3A+Ci0JICogPG9sPgotCSAqIDxsaT5UaGUgZmlsZSBpcyBjb25zdWx0ZWQgZm9yIGEgcGVyc2lzdGVudCBwcm9wZXJ0eSBuYW1lZAotCSAqIDxjb2RlPklERS5FRElUT1JfS0VZPC9jb2RlPiBjb250YWluaW5nIHRoZSBwcmVmZXJyZWQgZWRpdG9yIGlkIHRvIGJlCi0JICogdXNlZC48L2xpPgotCSAqIDxsaT5UaGUgd29ya2JlbmNoIGVkaXRvciByZWdpc3RyeSBpcyBjb25zdWx0ZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGVkaXRvcgotCSAqIGV4dGVuc2lvbiBoYXMgYmVlbiByZWdpc3RlcmVkIGZvciB0aGUgZmlsZSB0eXBlLiBJZiBzbywgYW4gaW5zdGFuY2Ugb2YKLQkgKiB0aGUgZWRpdG9yIGV4dGVuc2lvbiBpcyBvcGVuZWQgb24gdGhlIGZpbGUuIFNlZQotCSAqIDxjb2RlPklFZGl0b3JSZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKFN0cmluZyk8L2NvZGU+LjwvbGk+Ci0JICogPGxpPlRoZSBvcGVyYXRpbmcgc3lzdGVtIGlzIGNvbnN1bHRlZCB0byBkZXRlcm1pbmUgaWYgYW4gaW4tcGxhY2UKLQkgKiBjb21wb25lbnQgZWRpdG9yIGlzIGF2YWlsYWJsZSAoZS5nLiBPTEUgZWRpdG9yIG9uIFdpbjMyIHBsYXRmb3JtcykuPC9saT4KLQkgKiA8bGk+VGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgY29uc3VsdGVkIHRvIGRldGVybWluZSBpZiBhbiBleHRlcm5hbCBlZGl0b3IKLQkgKiBpcyBhdmFpbGFibGUuPC9saT4KLQkgKiA8L29sPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUKLQkgKiBAcmV0dXJuIGFuIGVkaXRvciBkZXNjcmlwdG9yLCBhcHByb3ByaWF0ZSBmb3Igb3BlbmluZyB0aGUgZmlsZQotCSAqIEB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBubyBlZGl0b3IgY2FuIGJlIGZvdW5kCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBJRWRpdG9yRGVzY3JpcHRvciBnZXRFZGl0b3JEZXNjcmlwdG9yKElGaWxlIGZpbGUpCi0gICAgICAgICAgICB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RWRpdG9yRGVzY3JpcHRvcihmaWxlLCB0cnVlKTsKLQl9Ci0KLSAgICAvKioKLQkgKiBSZXR1cm5zIGFuIGVkaXRvciBkZXNjcmlwdG9yIGFwcHJvcHJpYXRlIGZvciBvcGVuaW5nIHRoZSBnaXZlbiBmaWxlCi0JICogcmVzb3VyY2UuCi0JICogPHA+Ci0JICogVGhlIGVkaXRvciBkZXNjcmlwdG9yIGlzIGRldGVybWluZWQgdXNpbmcgYSBtdWx0aXN0ZXAgcHJvY2Vzcy4gVGhpcwotCSAqIG1ldGhvZCB3aWxsIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgZWRpdG9yIGJhc2VkIG9uIGNvbnRlbnQtdHlwZSBiaW5kaW5ncwotCSAqIGFzIHdlbGwgYXMgdHJhZGl0aW9uYWwgbmFtZS9leHRlbnNpb24gYmluZGluZ3MgaWYKLQkgKiA8Y29kZT5kZXRlcm1pbmVDb250ZW50VHlwZTwvY29kZT5pcyA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogPG9sPgotCSAqIDxsaT5UaGUgZmlsZSBpcyBjb25zdWx0ZWQgZm9yIGEgcGVyc2lzdGVudCBwcm9wZXJ0eSBuYW1lZAotCSAqIDxjb2RlPklERS5FRElUT1JfS0VZPC9jb2RlPiBjb250YWluaW5nIHRoZSBwcmVmZXJyZWQgZWRpdG9yIGlkIHRvIGJlCi0JICogdXNlZC48L2xpPgotCSAqIDxsaT5UaGUgd29ya2JlbmNoIGVkaXRvciByZWdpc3RyeSBpcyBjb25zdWx0ZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGVkaXRvcgotCSAqIGV4dGVuc2lvbiBoYXMgYmVlbiByZWdpc3RlcmVkIGZvciB0aGUgZmlsZSB0eXBlLiBJZiBzbywgYW4gaW5zdGFuY2Ugb2YKLQkgKiB0aGUgZWRpdG9yIGV4dGVuc2lvbiBpcyBvcGVuZWQgb24gdGhlIGZpbGUuIFNlZQotCSAqIDxjb2RlPklFZGl0b3JSZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKFN0cmluZyk8L2NvZGU+LjwvbGk+Ci0JICogPGxpPlRoZSBvcGVyYXRpbmcgc3lzdGVtIGlzIGNvbnN1bHRlZCB0byBkZXRlcm1pbmUgaWYgYW4gaW4tcGxhY2UKLQkgKiBjb21wb25lbnQgZWRpdG9yIGlzIGF2YWlsYWJsZSAoZS5nLiBPTEUgZWRpdG9yIG9uIFdpbjMyIHBsYXRmb3JtcykuPC9saT4KLQkgKiA8bGk+VGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgY29uc3VsdGVkIHRvIGRldGVybWluZSBpZiBhbiBleHRlcm5hbCBlZGl0b3IKLQkgKiBpcyBhdmFpbGFibGUuPC9saT4KLQkgKiA8L29sPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUKLQkgKiBAcGFyYW0gZGV0ZXJtaW5lQ29udGVudFR5cGUKLQkgKiAgICAgICAgICAgIHF1ZXJ5IHRoZSBjb250ZW50IHR5cGUgc3lzdGVtIGZvciB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBmaWxlCi0JICogQHJldHVybiBhbiBlZGl0b3IgZGVzY3JpcHRvciwgYXBwcm9wcmlhdGUgZm9yIG9wZW5pbmcgdGhlIGZpbGUKLQkgKiBAdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgbm8gZWRpdG9yIGNhbiBiZSBmb3VuZAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIElFZGl0b3JEZXNjcmlwdG9yIGdldEVkaXRvckRlc2NyaXB0b3IoSUZpbGUgZmlsZSwgYm9vbGVhbiBkZXRlcm1pbmVDb250ZW50VHlwZSkKLSAgICAgICAgICAgIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcmV0dXJuIGdldEVkaXRvckRlc2NyaXB0b3IoZmlsZS5nZXROYW1lKCksIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKSwgZ2V0RGVmYXVsdEVkaXRvcihmaWxlLCBkZXRlcm1pbmVDb250ZW50VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZWRpdG9yIGRlc2NyaXB0b3IgYXBwcm9wcmlhdGUgZm9yIG9wZW5pbmcgYSBmaWxlIHJlc291cmNlIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8cD4KLQkgKiBUaGUgZWRpdG9yIGRlc2NyaXB0b3IgaXMgZGV0ZXJtaW5lZCB1c2luZyBhIG11bHRpc3RlcCBwcm9jZXNzLiBUaGlzCi0JICogbWV0aG9kIHdpbGwgYXR0ZW1wdCB0byBpbmZlciBjb250ZW50IHR5cGUgZnJvbSB0aGUgZmlsZSBuYW1lLgotCSAqIDwvcD4KLQkgKiA8b2w+Ci0JICogPGxpPlRoZSBmaWxlIGlzIGNvbnN1bHRlZCBmb3IgYSBwZXJzaXN0ZW50IHByb3BlcnR5IG5hbWVkCi0JICogPGNvZGU+SURFLkVESVRPUl9LRVk8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIHByZWZlcnJlZCBlZGl0b3IgaWQgdG8gYmUKLQkgKiB1c2VkLjwvbGk+Ci0JICogPGxpPlRoZSB3b3JrYmVuY2ggZWRpdG9yIHJlZ2lzdHJ5IGlzIGNvbnN1bHRlZCB0byBkZXRlcm1pbmUgaWYgYW4gZWRpdG9yCi0JICogZXh0ZW5zaW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoZSBmaWxlIHR5cGUuIElmIHNvLCBhbiBpbnN0YW5jZSBvZgotCSAqIHRoZSBlZGl0b3IgZXh0ZW5zaW9uIGlzIG9wZW5lZCBvbiB0aGUgZmlsZS4gU2VlCi0JICogPGNvZGU+SUVkaXRvclJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoU3RyaW5nKTwvY29kZT4uPC9saT4KLQkgKiA8bGk+VGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgY29uc3VsdGVkIHRvIGRldGVybWluZSBpZiBhbiBpbi1wbGFjZQotCSAqIGNvbXBvbmVudCBlZGl0b3IgaXMgYXZhaWxhYmxlIChlLmcuIE9MRSBlZGl0b3Igb24gV2luMzIgcGxhdGZvcm1zKS48L2xpPgotCSAqIDxsaT5UaGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBjb25zdWx0ZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGV4dGVybmFsIGVkaXRvcgotCSAqIGlzIGF2YWlsYWJsZS48L2xpPgotCSAqIDwvb2w+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgZmlsZSBuYW1lCi0JICogQHJldHVybiBhbiBlZGl0b3IgZGVzY3JpcHRvciwgYXBwcm9wcmlhdGUgZm9yIG9wZW5pbmcgdGhlIGZpbGUKLQkgKiBAdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgbm8gZWRpdG9yIGNhbiBiZSBmb3VuZAotICAgICAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JEZXNjcmlwdG9yIGdldEVkaXRvckRlc2NyaXB0b3IoU3RyaW5nIG5hbWUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRFZGl0b3JEZXNjcmlwdG9yKG5hbWUsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVkaXRvciBkZXNjcmlwdG9yIGFwcHJvcHJpYXRlIGZvciBvcGVuaW5nIGEgZmlsZSByZXNvdXJjZSB3aXRoCi0JICogdGhlIGdpdmVuIG5hbWUuCi0JICogPHA+Ci0JICogVGhlIGVkaXRvciBkZXNjcmlwdG9yIGlzIGRldGVybWluZWQgdXNpbmcgYSBtdWx0aXN0ZXAgcHJvY2Vzcy4gVGhpcwotCSAqIG1ldGhvZCB3aWxsIGF0dGVtcHQgdG8gaW5mZXIgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgZmlsZSBpZgotCSAqIDxjb2RlPmluZmVyQ29udGVudFR5cGU8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiA8b2w+Ci0JICogPGxpPlRoZSBmaWxlIGlzIGNvbnN1bHRlZCBmb3IgYSBwZXJzaXN0ZW50IHByb3BlcnR5IG5hbWVkCi0JICogPGNvZGU+SURFLkVESVRPUl9LRVk8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIHByZWZlcnJlZCBlZGl0b3IgaWQgdG8gYmUKLQkgKiB1c2VkLjwvbGk+Ci0JICogPGxpPlRoZSB3b3JrYmVuY2ggZWRpdG9yIHJlZ2lzdHJ5IGlzIGNvbnN1bHRlZCB0byBkZXRlcm1pbmUgaWYgYW4gZWRpdG9yCi0JICogZXh0ZW5zaW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoZSBmaWxlIHR5cGUuIElmIHNvLCBhbiBpbnN0YW5jZSBvZgotCSAqIHRoZSBlZGl0b3IgZXh0ZW5zaW9uIGlzIG9wZW5lZCBvbiB0aGUgZmlsZS4gU2VlCi0JICogPGNvZGU+SUVkaXRvclJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoU3RyaW5nKTwvY29kZT4uPC9saT4KLQkgKiA8bGk+VGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgY29uc3VsdGVkIHRvIGRldGVybWluZSBpZiBhbiBpbi1wbGFjZQotCSAqIGNvbXBvbmVudCBlZGl0b3IgaXMgYXZhaWxhYmxlIChlLmcuIE9MRSBlZGl0b3Igb24gV2luMzIgcGxhdGZvcm1zKS48L2xpPgotCSAqIDxsaT5UaGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBjb25zdWx0ZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGV4dGVybmFsIGVkaXRvcgotCSAqIGlzIGF2YWlsYWJsZS48L2xpPgotCSAqIDwvb2w+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgZmlsZSBuYW1lCi0JICogQHBhcmFtIGluZmVyQ29udGVudFR5cGUKLQkgKiAgICAgICAgICAgIGF0dGVtcHQgdG8gaW5mZXIgdGhlIGNvbnRlbnQgdHlwZSBmcm9tIHRoZSBmaWxlIG5hbWUgaWYgdGhpcwotCSAqICAgICAgICAgICAgaXMgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBAcmV0dXJuIGFuIGVkaXRvciBkZXNjcmlwdG9yLCBhcHByb3ByaWF0ZSBmb3Igb3BlbmluZyB0aGUgZmlsZQotCSAqIEB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBubyBlZGl0b3IgY2FuIGJlIGZvdW5kCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvckRlc2NyaXB0b3IgZ2V0RWRpdG9yRGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpbmZlckNvbnRlbnRUeXBlKQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBpbmZlckNvbnRlbnRUeXBlID8gUGxhdGZvcm0KLQkJCQkuZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKG5hbWUpIDogbnVsbDsKLQkJSUVkaXRvclJlZ2lzdHJ5IGVkaXRvclJlZyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQotCQlyZXR1cm4gZ2V0RWRpdG9yRGVzY3JpcHRvcihuYW1lLCBlZGl0b3JSZWcsIGVkaXRvclJlZwotCQkJCS5nZXREZWZhdWx0RWRpdG9yKG5hbWUsIGNvbnRlbnRUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBlZGl0b3IgZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBuYW1lIHVzaW5nIHRoZSBlZGl0b3JEZXNjcmlwdG9yCi0JICogcGFzc2VkIGluIGFzIGEgZGVmYXVsdCBhcyBhIHN0YXJ0aW5nIHBvaW50LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBvcGVuLgotCSAqIEBwYXJhbSBlZGl0b3JSZWcKLQkgKiAgICAgICAgICAgIFRoZSBlZGl0b3IgcmVnaXN0cnkgdG8gZG8gdGhlIGxvb2t1cHMgZnJvbS4KLQkgKiBAcGFyYW0gZGVmYXVsdERlc2NyaXB0b3IKLQkgKiAgICAgICAgICAgIElFZGl0b3JEZXNjcmlwdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBJRWRpdG9yRGVzY3JpcHRvcgotCSAqIEB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBubyB2YWxpZCBlZGl0b3IgY2FuIGJlIGZvdW5kCi0gICAgICogICAgICAgICAgICAgCi0gICAgICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgc3RhdGljIElFZGl0b3JEZXNjcmlwdG9yIGdldEVkaXRvckRlc2NyaXB0b3IoU3RyaW5nIG5hbWUsCi0JCQlJRWRpdG9yUmVnaXN0cnkgZWRpdG9yUmVnLCBJRWRpdG9yRGVzY3JpcHRvciBkZWZhdWx0RGVzY3JpcHRvcikKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGRlZmF1bHREZXNjcmlwdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gZGVmYXVsdERlc2NyaXB0b3I7Ci0KLQkJSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzYyA9IGRlZmF1bHREZXNjcmlwdG9yOwotCi0JCS8vIG5leHQgY2hlY2sgdGhlIE9TIGZvciBpbi1wbGFjZSBlZGl0b3IgKE9MRSBvbiBXaW4zMikKLQkJaWYgKGVkaXRvclJlZy5pc1N5c3RlbUluUGxhY2VFZGl0b3JBdmFpbGFibGUobmFtZSkpCi0JCQllZGl0b3JEZXNjID0gZWRpdG9yUmVnCi0JCQkJCS5maW5kRWRpdG9yKElFZGl0b3JSZWdpc3RyeS5TWVNURU1fSU5QTEFDRV9FRElUT1JfSUQpOwotCi0JCS8vIG5leHQgY2hlY2sgd2l0aCB0aGUgT1MgZm9yIGFuIGV4dGVybmFsIGVkaXRvcgotCQlpZiAoZWRpdG9yRGVzYyA9PSBudWxsCi0JCQkJJiYgZWRpdG9yUmVnLmlzU3lzdGVtRXh0ZXJuYWxFZGl0b3JBdmFpbGFibGUobmFtZSkpCi0JCQllZGl0b3JEZXNjID0gZWRpdG9yUmVnCi0JCQkJCS5maW5kRWRpdG9yKElFZGl0b3JSZWdpc3RyeS5TWVNURU1fRVhURVJOQUxfRURJVE9SX0lEKTsKLQotCQkvLyBuZXh0IGxvb2t1cCB0aGUgZGVmYXVsdCB0ZXh0IGVkaXRvcgotCQlpZiAoZWRpdG9yRGVzYyA9PSBudWxsKQotCQkJZWRpdG9yRGVzYyA9IGVkaXRvclJlZwotCQkJCQkuZmluZEVkaXRvcihJREVXb3JrYmVuY2hQbHVnaW4uREVGQVVMVF9URVhUX0VESVRPUl9JRCk7Ci0KLQkJLy8gaWYgbm8gdmFsaWQgZWRpdG9yIGZvdW5kLCBiYWlsIG91dAotCQlpZiAoZWRpdG9yRGVzYyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKElERVdvcmtiZW5jaE1lc3NhZ2VzLklERV9ub0ZpbGVFZGl0b3JGb3VuZCk7Ci0KLQkJcmV0dXJuIGVkaXRvckRlc2M7Ci0JfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYW4gZWRpdG9yIG9uIHRoZSBmaWxlIHJlc291cmNlIG9mIHRoZSBnaXZlbiBtYXJrZXIuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBwYWdlIGFscmVhZHkgaGFzIGFuIGVkaXRvciBvcGVuIG9uIHRoZSBtYXJrZXIgcmVzb3VyY2UgZmlsZSB0aGF0Ci0gICAgICogZWRpdG9yIGlzIGJyb3VnaHQgdG8gZnJvbnQ7IG90aGVyd2lzZSwgYSBuZXcgZWRpdG9yIGlzIG9wZW5lZC5UaGUgY3Vyc29yCi0gICAgICogYW5kIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGUgZWRpdG9yIGFyZSB0aGVuIHVwZGF0ZWQgZnJvbSBpbmZvcm1hdGlvbgotICAgICAqIHJlY29yZGVkIGluIHRoZSBtYXJrZXIuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtYXJrZXIgY29udGFpbnMgYW4gPGNvZGU+RURJVE9SX0lEX0FUVFI8L2NvZGU+IGF0dHJpYnV0ZSB0aGUKLSAgICAgKiBhdHRyaWJ1dGUgdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgZWRpdG9yIHR5cGUgdG8gYmUgb3BlbmVkLgotICAgICAqIElmIG5vdCwgdGhlIHJlZ2lzdGVyZWQgZWRpdG9yIGZvciB0aGUgbWFya2VyIHJlc291cmNlIGZpbGUgd2lsbCBiZSB1c2VkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFnZQotICAgICAqICAgICAgICAgICAgdGhlIHdvcmtiZW5jaCBwYWdlIHRvIG9wZW4gdGhlIGVkaXRvciBpbgotICAgICAqIEBwYXJhbSBtYXJrZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXJrZXIgdG8gb3BlbgotICAgICAqIEByZXR1cm4gYW4gb3BlbiBlZGl0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gbm90IHBvc3NpYmxlCi0gICAgICogQGV4Y2VwdGlvbiBQYXJ0SW5pdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBlZGl0b3IgY291bGQgbm90IGJlIGluaXRpYWxpemVkCi0gICAgICogQHNlZSAjb3BlbkVkaXRvcihvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZSwKLSAgICAgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIsIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIElNYXJrZXIgbWFya2VyKQotICAgICAgICAgICAgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG9wZW5FZGl0b3IocGFnZSwgbWFya2VyLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlZGl0b3Igb24gdGhlIGZpbGUgcmVzb3VyY2Ugb2YgdGhlIGdpdmVuIG1hcmtlci4gCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBwYWdlIGFscmVhZHkgaGFzIGFuIGVkaXRvciBvcGVuIG9uIHRoZSBtYXJrZXIgcmVzb3VyY2UgZmlsZSB0aGF0IAotICAgICAqIGVkaXRvciBpcyBicm91Z2h0IHRvIGZyb250OyBvdGhlcndpc2UsIGEgbmV3IGVkaXRvciBpcyBvcGVuZWQuIElmIAotICAgICAqIDxjb2RlPmFjdGl2YXRlID09IHRydWU8L2NvZGU+IHRoZSBlZGl0b3Igd2lsbCBiZSBhY3RpdmF0ZWQuICBUaGUgY3Vyc29yIGFuZCAKLSAgICAgKiBzZWxlY3Rpb24gc3RhdGUgb2YgdGhlIGVkaXRvciBhcmUgdGhlbiB1cGRhdGVkIGZyb20gaW5mb3JtYXRpb24gcmVjb3JkZWQgaW4gCi0gICAgICogdGhlIG1hcmtlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhlIG1hcmtlciBjb250YWlucyBhbiA8Y29kZT5FRElUT1JfSURfQVRUUjwvY29kZT4gYXR0cmlidXRlIAotICAgICAqIHRoZSBhdHRyaWJ1dGUgdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgZWRpdG9yIHR5cGUgdG8gYmUgb3BlbmVkLiAKLSAgICAgKiBJZiBub3QsIHRoZSByZWdpc3RlcmVkIGVkaXRvciBmb3IgdGhlIG1hcmtlciByZXNvdXJjZSBmaWxlIHdpbGwgYmUgdXNlZC4gCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBhZ2UgdGhlIHdvcmtiZW5jaCBwYWdlIHRvIG9wZW4gdGhlIGVkaXRvciBpbgotICAgICAqIEBwYXJhbSBtYXJrZXIgdGhlIG1hcmtlciB0byBvcGVuCi0gICAgICogQHBhcmFtIGFjdGl2YXRlIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBlZGl0b3Igd2lsbCBiZSBhY3RpdmF0ZWQKLSAgICAgKiBAcmV0dXJuIGFuIG9wZW4gZWRpdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IG5vdCBwb3NzaWJsZQotICAgICAqIEBleGNlcHRpb24gUGFydEluaXRFeGNlcHRpb24gaWYgdGhlIGVkaXRvciBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5FZGl0b3IoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgSU1hcmtlciBtYXJrZXIsCi0gICAgICAgICAgICBib29sZWFuIGFjdGl2YXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICAvLyBzYW5pdHkgY2hlY2tzCi0gICAgICAgIGlmIChwYWdlID09IG51bGwgfHwgbWFya2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgbWFya2VyIHJlc291cmNlIGZpbGUKLSAgICAgICAgaWYgKCEobWFya2VyLmdldFJlc291cmNlKCkgaW5zdGFuY2VvZiBJRmlsZSkpIHsKLSAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAubG9nKCJPcGVuIGVkaXRvciBvbiBtYXJrZXIgZmFpbGVkOyBtYXJrZXIgcmVzb3VyY2Ugbm90IGFuIElGaWxlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIG1hcmtlci5nZXRSZXNvdXJjZSgpOwotCi0gICAgICAgIC8vIGdldCB0aGUgcHJlZmVycmVkIGVkaXRvciBpZCBmcm9tIHRoZSBtYXJrZXIKLSAgICAgICAgSUVkaXRvclJlZ2lzdHJ5IGVkaXRvclJlZyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLSAgICAgICAgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzYyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZWRpdG9ySUQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEVESVRPUl9JRF9BVFRSKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3JJRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZWRpdG9yRGVzYyA9IGVkaXRvclJlZy5maW5kRWRpdG9yKGVkaXRvcklEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgdGhpcwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb3BlbiB0aGUgZWRpdG9yIG9uIHRoZSBtYXJrZXIgcmVzb3VyY2UgZmlsZQotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotICAgICAgICBpZiAoZWRpdG9yRGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlZGl0b3IgPSBvcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIGFjdGl2YXRlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVkaXRvciA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBlZGl0b3JEZXNjCi0gICAgICAgICAgICAgICAgICAgIC5nZXRJZCgpLCBhY3RpdmF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIGVkaXRvciB0byB1cGRhdGUgaXRzIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBtYXJrZXIKLSAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnb3RvTWFya2VyKGVkaXRvciwgbWFya2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlZGl0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBhbGwgZGlydHkgZWRpdG9ycyBpbiB0aGUgd29ya2JlbmNoIHdob3NlIGVkaXRvciBpbnB1dCBpcyAgCi0gICAgICogYSBjaGlsZCByZXNvdXJjZSBvZiBvbmUgb2YgdGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4ncyBwcm92aWRlZC4KLSAgICAgKiBPcGVucyBhIGRpYWxvZyB0byBwcm9tcHQgdGhlIHVzZXIgaWYgPGNvZGU+Y29uZmlybTwvY29kZT4gaXMgdHJ1ZS4gCi0gICAgICogUmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bC4gUmV0dXJuIGZhbHNlIGlmIHRoZSB1c2VyIGhhcyBjYW5jZWxsZWQgCi0gICAgICogdGhlIGNvbW1hbmQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZVJvb3RzCi0gICAgICogICAgICAgICAgICB0aGUgcmVzb3VyY2Ugcm9vdHMgdW5kZXIgd2hpY2ggZWRpdG9yIGlucHV0IHNob3VsZCBiZSBzYXZlZCwKLSAgICAgKiAgICAgICAgICAgIG90aGVyIHdpbGwgYmUgbGVmdCBkaXJ0eQotICAgICAqIEBwYXJhbSBjb25maXJtCi0gICAgICogICAgICAgICAgICBwcm9tcHQgdGhlIHVzZXIgaWYgdHJ1ZQotICAgICAqIEByZXR1cm4gYm9vbGVhbiBmYWxzZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNhdmVBbGxFZGl0b3JzKElSZXNvdXJjZVtdIHJlc291cmNlUm9vdHMsCi0gICAgICAgICAgICBib29sZWFuIGNvbmZpcm0pIHsKLSAgICAgICAgZmluYWwgSVJlc291cmNlW10gZmluYWxSZXNvdXJjZXMgPSByZXNvdXJjZVJvb3RzOwotICAgICAgICBmaW5hbCBib29sZWFuIGZpbmFsQ29uZmlybSA9IGNvbmZpcm07Ci0gICAgICAgIGZpbmFsIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhblsxXTsKLSAgICAgICAgcmVzdWx0WzBdID0gdHJ1ZTsKLQotICAgICAgICBpZiAocmVzb3VyY2VSb290cy5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHRbMF07Ci0KLSAgICAgICAgUGxhdGZvcm0ucnVuKG5ldyBTYWZlUnVubmFibGUoSURFV29ya2JlbmNoTWVzc2FnZXMuRXJyb3JDbG9zaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vQ29sbGVjdCBkaXJ0eUVkaXRvcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBkaXJ0eUVkaXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V29ya2JlbmNoV2luZG93cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSB3aW5kb3dzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSB3aW5kb3cuZ2V0UGFnZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhZ2VzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBwYWdlc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVkaXRvclBhcnRbXSBkaXJ0eSA9IHBhZ2UuZ2V0RGlydHlFZGl0b3JzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZGlydHkubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFZGl0b3JQYXJ0IHBhcnQgPSBkaXJ0eVtrXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSBSZXNvdXJjZVV0aWwuZ2V0RmlsZShwYXJ0LmdldEVkaXRvcklucHV0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgZmluYWxSZXNvdXJjZXMubGVuZ3RoOyBsKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZmluYWxSZXNvdXJjZXNbbF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzUHJlZml4T2YoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldEZ1bGxQYXRoKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJ0eUVkaXRvcnMuYWRkKHBhcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXJ0eUVkaXRvcnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgdyA9IFdvcmtiZW5jaC5nZXRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHdpbmRvd3NbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WzBdID0gRWRpdG9yTWFuYWdlci5zYXZlQWxsKGRpcnR5RWRpdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlybSwgdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdFswXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IGVkaXRvciBpZCBmb3IgYSBnaXZlbiBmaWxlLiAgVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQKLSAgICAgKiB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZWRpdG9yIGRlc2NyaXB0b3IgZm9yIHRoZSBmaWxlIGluIGZ1dHVyZSBjYWxscyB0bwotICAgICAqIDxjb2RlPmdldERlZmF1bHRFZGl0b3IoSUZpbGUpPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlCi0gICAgICogQHBhcmFtIGVkaXRvcklEIHRoZSBlZGl0b3IgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEVkaXRvcihJRmlsZSBmaWxlLCBTdHJpbmcgZWRpdG9ySUQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbGUuc2V0UGVyc2lzdGVudFByb3BlcnR5KEVESVRPUl9LRVksIGVkaXRvcklEKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGVkaXRvciBmb3IgYSBnaXZlbiBmaWxlLiBUaGlzIG1ldGhvZCB3aWxsIGF0dGVtcHQgdG8KLQkgKiByZXNvbHZlIHRoZSBlZGl0b3IgYmFzZWQgb24gY29udGVudC10eXBlIGJpbmRpbmdzIGFzIHdlbGwgYXMgdHJhZGl0aW9uYWwKLQkgKiBuYW1lL2V4dGVuc2lvbiBiaW5kaW5ncy4KLQkgKiA8cD4KLQkgKiBBIGRlZmF1bHQgZWRpdG9yIGlkIG1heSBiZSByZWdpc3RlcmVkIGZvciBhIHNwZWNpZmljIGZpbGUgdXNpbmcKLQkgKiA8Y29kZT5zZXREZWZhdWx0RWRpdG9yPC9jb2RlPi4gSWYgdGhlIGdpdmVuIGZpbGUgaGFzIGEgcmVnaXN0ZXJlZAotCSAqIGRlZmF1bHQgZWRpdG9yIGlkIHRoZSBkZWZhdWx0IGVkaXRvciB3aWxsIGRlcml2ZWQgZnJvbSBpdC4gSWYgbm90LCB0aGUKLQkgKiBkZWZhdWx0IGVkaXRvciBpcyBkZXRlcm1pbmVkIGJ5IHRha2luZyB0aGUgZmlsZSBuYW1lIGZvciB0aGUgZmlsZSBhbmQKLQkgKiBvYnRhaW5pbmcgdGhlIGRlZmF1bHQgZWRpdG9yIGZvciB0aGF0IG5hbWUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICB0aGUgZmlsZQotCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGRlZmF1bHQgZWRpdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgbm90IGZvdW5kCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBJRWRpdG9yRGVzY3JpcHRvciBnZXREZWZhdWx0RWRpdG9yKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRFZGl0b3IoZmlsZSwgdHJ1ZSk7Ci0gICAgfQotCQotICAgIC8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgZWRpdG9yIGZvciBhIGdpdmVuIGZpbGUuIFRoaXMgbWV0aG9kIHdpbGwgYXR0ZW1wdCB0bwotCSAqIHJlc29sdmUgdGhlIGVkaXRvciBiYXNlZCBvbiBjb250ZW50LXR5cGUgYmluZGluZ3MgYXMgd2VsbCBhcyB0cmFkaXRpb25hbAotCSAqIG5hbWUvZXh0ZW5zaW9uIGJpbmRpbmdzIGlmIDxjb2RlPmRldGVybWluZUNvbnRlbnRUeXBlPC9jb2RlPiBpcwotCSAqIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBlZGl0b3IgaWQgbWF5IGJlIHJlZ2lzdGVyZWQgZm9yIGEgc3BlY2lmaWMgZmlsZSB1c2luZwotCSAqIDxjb2RlPnNldERlZmF1bHRFZGl0b3I8L2NvZGU+LiBJZiB0aGUgZ2l2ZW4gZmlsZSBoYXMgYSByZWdpc3RlcmVkCi0JICogZGVmYXVsdCBlZGl0b3IgaWQgdGhlIGRlZmF1bHQgZWRpdG9yIHdpbGwgZGVyaXZlZCBmcm9tIGl0LiBJZiBub3QsIHRoZQotCSAqIGRlZmF1bHQgZWRpdG9yIGlzIGRldGVybWluZWQgYnkgdGFraW5nIHRoZSBmaWxlIG5hbWUgZm9yIHRoZSBmaWxlIGFuZAotCSAqIG9idGFpbmluZyB0aGUgZGVmYXVsdCBlZGl0b3IgZm9yIHRoYXQgbmFtZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlCi0JICogQHBhcmFtIGRldGVybWluZUNvbnRlbnRUeXBlCi0JICogICAgICAgICAgICBkZXRlcm1pbmUgdGhlIGNvbnRlbnQgdHlwZSBmb3IgdGhlIGdpdmVuIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBkZWZhdWx0IGVkaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIG5vdCBmb3VuZAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIElFZGl0b3JEZXNjcmlwdG9yIGdldERlZmF1bHRFZGl0b3IoSUZpbGUgZmlsZSwgYm9vbGVhbiBkZXRlcm1pbmVDb250ZW50VHlwZSkgewotICAgICAgICAvLyBUcnkgZmlsZSBzcGVjaWZpYyBlZGl0b3IuCi0gICAgICAgIElFZGl0b3JSZWdpc3RyeSBlZGl0b3JSZWcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZWRpdG9ySUQgPSBmaWxlLmdldFBlcnNpc3RlbnRQcm9wZXJ0eShFRElUT1JfS0VZKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3JJRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUVkaXRvckRlc2NyaXB0b3IgZGVzYyA9IGVkaXRvclJlZy5maW5kRWRpdG9yKGVkaXRvcklEKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVzYyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgIH0KLSAgICAgICAgCi0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG51bGw7Ci0JCWlmIChkZXRlcm1pbmVDb250ZW50VHlwZSkKLQkJCWNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUoZmlsZSk7ICAgIAotICAgICAgICAvLyBUcnkgbG9va3VwIHdpdGggZmlsZW5hbWUKLSAgICAgICAgcmV0dXJuIGVkaXRvclJlZy5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpLCBjb250ZW50VHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdHMgYW5kIHJldHVybnMgdGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT5zIGluIHRoZSBnaXZlbgotICAgICAqIHNlbGVjdGlvbiBvciB0aGUgcmVzb3VyY2Ugb2JqZWN0cyB0aGV5IGFkYXB0cyB0by4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3JpZ2luYWxTZWxlY3Rpb24gdGhlIG9yaWdpbmFsIHNlbGVjdGlvbiwgcG9zc2libHkgZW1wdHkKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgcmVzb3VyY2VzIChlbGVtZW50IHR5cGU6IDxjb2RlPklSZXNvdXJjZTwvY29kZT4pLCAKLSAgICAgKiAgICBwb3NzaWJseSBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBjb21wdXRlU2VsZWN0ZWRSZXNvdXJjZXMoCi0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBvcmlnaW5hbFNlbGVjdGlvbikgewotICAgICAgICBMaXN0IHJlc291cmNlcyA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgZSA9IG9yaWdpbmFsU2VsZWN0aW9uLml0ZXJhdG9yKCk7IGUuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBlLm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCByZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgICAgIHJlc291cmNlID0gbmV4dDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZSA9ICgoSUFkYXB0YWJsZSkgbmV4dCkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbGF6eSBpbml0IHRvIGF2b2lkIGNyZWF0aW5nIGVtcHR5IGxpc3RzCi0gICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBzZWxlY3Rpb24gY29udGFpbnMgbW9zdGx5IHJlc291cmNlcyBtb3N0IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Qob3JpZ2luYWxTZWxlY3Rpb24uc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc291cmNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzb3VyY2VzOwotICAgICAgICAKLSAgICB9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSBmb3IgdGhlIGdpdmVuIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gdGVzdAotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKElGaWxlIGZpbGUpIHsKLQkJdHJ5IHsKLQkJCVVJU3RhdHMuc3RhcnQoVUlTdGF0cy5DT05URU5UX1RZUEVfTE9PS1VQLCBmaWxlLmdldE5hbWUoKSk7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7CQkKLQkJfSBmaW5hbGx5IHsKLQkJCVVJU3RhdHMuZW5kKFVJU3RhdHMuQ09OVEVOVF9UWVBFX0xPT0tVUCwgZmlsZSwgZmlsZS5nZXROYW1lKCkpOwotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIEd1ZXNzIGF0IHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGdpdmVuIGZpbGUgYmFzZWQgb24gdGhlIGZpbGVuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRvIHRlc3QKLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250ZW50VHlwZSBndWVzc0NvbnRlbnRUeXBlKElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCXRyeSB7Ci0JCQlVSVN0YXRzLnN0YXJ0KFVJU3RhdHMuQ09OVEVOVF9UWVBFX0xPT0tVUCwgZmlsZU5hbWUpOwotCQkJSUNvbnRlbnRUeXBlTWF0Y2hlciBtYXRjaGVyID0gZmlsZS5nZXRQcm9qZWN0KCkuZ2V0Q29udGVudFR5cGVNYXRjaGVyKCk7Ci0JCQlyZXR1cm4gbWF0Y2hlci5maW5kQ29udGVudFR5cGVGb3IoZmlsZU5hbWUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwkJCi0JCX0gZmluYWxseSB7Ci0JCQlVSVN0YXRzLmVuZChVSVN0YXRzLkNPTlRFTlRfVFlQRV9MT09LVVAsIGZpbGUsIGZpbGVOYW1lKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvSURFQWN0aW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2lkZS9JREVBY3Rpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZGViYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2lkZS9JREVBY3Rpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmlkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5HbG9iYWxCdWlsZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLk5ld1dpemFyZERyb3BEb3duQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuTmV3V2l6YXJkTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlF1aWNrU3RhcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZXRhcmdldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLlRpcHNBbmRUcmlja3NBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmFjdGlvbnMuQnVpbGRDbGVhbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuYWN0aW9ucy5PcGVuV29ya3NwYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5hY3Rpb25zLlByb2plY3RQcm9wZXJ0eURpYWxvZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuYWN0aW9ucy5SZXRhcmdldEFjdGlvbldpdGhEZWZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5hY3Rpb25zLlRvZ2dsZUF1dG9CdWlsZEFjdGlvbjsKLQotLyoqCi0gKiBBY2Nlc3MgdG8gc3RhbmRhcmQgYWN0aW9ucyBwcm92aWRlZCBieSB0aGUgSURFIHdvcmtiZW5jaCAoaW5jbHVkaW5nCi0gKiB0aG9zZSBvZiB0aGUgZ2VuZXJpYyB3b3JrYmVuY2gpLgotICogPHA+Ci0gKiBUaGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGNsYXNzIGlzIHByb3ZpZGVkIGJ5IHN0YXRpYyBmaWVsZHMuCi0gKiBFeGFtcGxlIHVzYWdlOgotICogPHByZT4KLSAqIE1lbnVNYW5hZ2VyIG1lbnUgPSAuLi47Ci0gKiBBY3Rpb25GYWN0b3J5LklXb3JrYmVuY2hBY3Rpb24gY2xvc2VQcm9qZWN0QWN0aW9uCi0gKiAJICA9IElERUFjdGlvbkZhY3RvcnkuQ0xPU0VfUFJPSkVDVC5jcmVhdGUod2luZG93KTsKLSAqIG1lbnUuYWRkKGNsb3NlUHJvamVjdEFjdGlvbik7Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSURFQWN0aW9uRmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiBQcmV2ZW50cyBpbnN0YW50aWF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgSURFQWN0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElERS1zcGVjaWZpYyB3b3JrYmVuY2ggYWN0aW9uOiBBZGQgdGFzay4KLSAgICAgKiBUaGlzIGFjdGlvbiBpcyBhIHtAbGluayBSZXRhcmdldEFjdGlvbn0gd2l0aCAKLSAgICAgKiBpZCAiYWRkVGFzayIuIFRoaXMgYWN0aW9uIG1haW50YWlucyBpdHMgZW5hYmxlbWVudCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgQUREX1RBU0sgPSBuZXcgQWN0aW9uRmFjdG9yeSgiYWRkVGFzayIpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAvKiAobm9uLWphdmFkb2MpIG1ldGhvZCBkZWNsYXJlZCBvbiBBY3Rpb25GYWN0b3J5ICovCi0gICAgICAgIHB1YmxpYyBJV29ya2JlbmNoQWN0aW9uIGNyZWF0ZShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICAgICAgaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUmV0YXJnZXRBY3Rpb24gYWN0aW9uID0gbmV3IFJldGFyZ2V0QWN0aW9uKGdldElkKCksIElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9hZGRUYXNrKTsKLSAgICAgICAgICAgIGFjdGlvbi5zZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hfYWRkVGFza1Rvb2xUaXApOwotICAgICAgICAgICAgd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKGFjdGlvbik7Ci0gICAgICAgICAgICBhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS51aS5lZGl0LmFkZFRhc2siKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBJREUtc3BlY2lmaWMgd29ya2JlbmNoIGFjdGlvbjogQWRkIGJvb2ttYXJrLgotICAgICAqIFRoaXMgYWN0aW9uIGlzIGEge0BsaW5rIFJldGFyZ2V0QWN0aW9ufSB3aXRoIAotICAgICAqIGlkICJib29rbWFyayIuIFRoaXMgYWN0aW9uIG1haW50YWlucyBpdHMgZW5hYmxlbWVudCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgQk9PS01BUksgPSBuZXcgQWN0aW9uRmFjdG9yeSgiYm9va21hcmsiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLyogKG5vbi1qYXZhZG9jKSBtZXRob2QgZGVjbGFyZWQgb24gQWN0aW9uRmFjdG9yeSAqLwotICAgICAgICBwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJldGFyZ2V0QWN0aW9uIGFjdGlvbiA9IG5ldyBSZXRhcmdldEFjdGlvbihnZXRJZCgpLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hfYWRkQm9va21hcmspOwotICAgICAgICAgICAgYWN0aW9uLnNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9hZGRCb29rbWFya1Rvb2xUaXApOwotICAgICAgICAgICAgd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKGFjdGlvbik7Ci0gICAgICAgICAgICBhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS51aS5lZGl0LmFkZEJvb2ttYXJrIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogSURFLXNwZWNpZmljIHdvcmtiZW5jaCBhY3Rpb246IEluY3JlbWVudGFsIGJ1aWxkLgotICAgICAqIFRoaXMgYWN0aW9uIG1haW50YWlucyBpdHMgZW5hYmxlbWVudCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgQlVJTEQgPSBuZXcgQWN0aW9uRmFjdG9yeSgiYnVpbGQiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLyogKG5vbi1qYXZhZG9jKSBtZXRob2QgZGVjbGFyZWQgb24gQWN0aW9uRmFjdG9yeSAqLwotICAgICAgICBwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgR2xvYmFsQnVpbGRBY3Rpb24od2luZG93LAotICAgICAgICAgICAgICAgICAgICBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxEKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBJREUtc3BlY2lmaWMgd29ya2JlbmNoIGFjdGlvbjogQnVpbGQgY2xlYW4KLSAgICAgKiBUaGlzIGFjdGlvbiBtYWludGFpbnMgaXRzIGVuYWJsZW1lbnQgc3RhdGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBY3Rpb25GYWN0b3J5IEJVSUxEX0NMRUFOID0gbmV3IEFjdGlvbkZhY3RvcnkoCi0gICAgICAgICAgICAiYnVpbGRDbGVhbiIpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAvKiAobm9uLWphdmFkb2MpIG1ldGhvZCBkZWNsYXJlZCBvbiBBY3Rpb25GYWN0b3J5ICovCi0gICAgICAgIHB1YmxpYyBJV29ya2JlbmNoQWN0aW9uIGNyZWF0ZShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICAgICAgaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSVdvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgQnVpbGRDbGVhbkFjdGlvbih3aW5kb3cpOwotICAgICAgICAgICAgYWN0aW9uLnNldElkKGdldElkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBJREUtc3BlY2lmaWMgd29ya2JlbmNoIGFjdGlvbjogQnVpbGQgYXV0b21hdGljYWx5Ci0gICAgICogVGhpcyBhY3Rpb24gbWFpbnRhaW5zIGl0cyBlbmFibGVtZW50IHN0YXRlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWN0aW9uRmFjdG9yeSBCVUlMRF9BVVRPTUFUSUNBTExZID0gbmV3IEFjdGlvbkZhY3RvcnkoCi0gICAgICAgICAgICAiYnVpbGRBdXRvbWF0aWNhbGx5IikgeyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8qIChub24tamF2YWRvYykgbWV0aG9kIGRlY2xhcmVkIG9uIEFjdGlvbkZhY3RvcnkgKi8KLSAgICAgICAgcHVibGljIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgICAgICBpZiAod2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IG5ldyBUb2dnbGVBdXRvQnVpbGRBY3Rpb24od2luZG93KTsKLSAgICAgICAgICAgIGFjdGlvbi5zZXRJZChnZXRJZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogSURFLXNwZWNpZmljIHdvcmtiZW5jaCBhY3Rpb246IEluY3JlbWVudGFsIGJ1aWxkLgotICAgICAqIFRoaXMgYWN0aW9uIGlzIGEge0BsaW5rIFJldGFyZ2V0QWN0aW9ufSB3aXRoIAotICAgICAqIGlkICJidWlsZFByb2plY3QiLiBUaGlzIGFjdGlvbiBtYWludGFpbnMgaXRzIGVuYWJsZW1lbnQgc3RhdGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBY3Rpb25GYWN0b3J5IEJVSUxEX1BST0pFQ1QgPSBuZXcgQWN0aW9uRmFjdG9yeSgKLSAgICAgICAgICAgICJidWlsZFByb2plY3QiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLyogKG5vbi1qYXZhZG9jKSBtZXRob2QgZGVjbGFyZWQgb24gQWN0aW9uRmFjdG9yeSAqLwotICAgICAgICBwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJldGFyZ2V0QWN0aW9uIGFjdGlvbiA9IG5ldyBSZXRhcmdldEFjdGlvbldpdGhEZWZhdWx0KGdldElkKCksCi0gICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9idWlsZFByb2plY3QpOwotICAgICAgICAgICAgYWN0aW9uLnNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9idWlsZFByb2plY3RUb29sVGlwKTsKLSAgICAgICAgICAgIHdpbmRvdy5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcihhY3Rpb24pOwotICAgICAgICAgICAgYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2UudWkucHJvamVjdC5idWlsZFByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBJREUtc3BlY2lmaWMgd29ya2JlbmNoIGFjdGlvbjogQ2xvc2UgcHJvamVjdC4KLSAgICAgKiBUaGlzIGFjdGlvbiBpcyBhIHtAbGluayBSZXRhcmdldEFjdGlvbn0gd2l0aCAKLSAgICAgKiBpZCAiY2xvc2VQcm9qZWN0Ii4gVGhpcyBhY3Rpb24gbWFpbnRhaW5zIGl0cyBlbmFibGVtZW50IHN0YXRlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWN0aW9uRmFjdG9yeSBDTE9TRV9QUk9KRUNUID0gbmV3IEFjdGlvbkZhY3RvcnkoCi0gICAgICAgICAgICAiY2xvc2VQcm9qZWN0IikgeyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8qIChub24tamF2YWRvYykgbWV0aG9kIGRlY2xhcmVkIG9uIEFjdGlvbkZhY3RvcnkgKi8KLSAgICAgICAgcHVibGljIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgICAgICBpZiAod2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSZXRhcmdldEFjdGlvbiBhY3Rpb24gPSBuZXcgUmV0YXJnZXRBY3Rpb24oZ2V0SWQoKSwgSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX2Nsb3NlUHJvamVjdCk7Ci0gICAgICAgICAgICBhY3Rpb24uc2V0VG9vbFRpcFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX2Nsb3NlUHJvamVjdFRvb2xUaXApOwotICAgICAgICAgICAgd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKGFjdGlvbik7Ci0gICAgICAgICAgICBhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS51aS5wcm9qZWN0LmNsb3NlUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIElERS1zcGVjaWZpYyB3b3JrYmVuY2ggYWN0aW9uOiBPcGVucyB0aGUgIm5ldyIgd2l6YXJkIGRyb3AgZG93biwgaW5jbHVkaW5nCi0gICAgICogcmVzb3VyY2Utc3BlY2lmaWMgaXRlbXMgZm9yIFByb2plY3QuLi4gYW5kIEV4YW1wbGUuLi4KLSAgICAgKiBUaGlzIGFjdGlvbiBtYWludGFpbnMgaXRzIGVuYWJsZW1lbnQgc3RhdGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBY3Rpb25GYWN0b3J5IE5FV19XSVpBUkRfRFJPUF9ET1dOID0gbmV3IEFjdGlvbkZhY3RvcnkoCi0gICAgICAgICAgICAibmV3V2l6YXJkRHJvcERvd24iKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLyogKG5vbi1qYXZhZG9jKSBtZXRob2QgZGVjbGFyZWQgb24gQWN0aW9uRmFjdG9yeSAqLwotICAgICAgICBwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEBpc3N1ZSB3ZSBhcmUgY3JlYXRpbmcgYSBORVcgYWN0aW9uIGp1c3QgdG8gcGFzcyB0byBOZXdXaXphcmREcm9wRG93bkFjdGlvbgotICAgICAgICAgICAgSVdvcmtiZW5jaEFjdGlvbiBpbm5lckFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVXLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICAgICAgTmV3V2l6YXJkTWVudSBuZXdXaXphcmRNZW51ID0gbmV3IE5ld1dpemFyZE1lbnUod2luZG93KTsKLSAgICAgICAgICAgIElXb3JrYmVuY2hBY3Rpb24gYWN0aW9uID0gbmV3IE5ld1dpemFyZERyb3BEb3duQWN0aW9uKHdpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgaW5uZXJBY3Rpb24sIG5ld1dpemFyZE1lbnUpOwotICAgICAgICAgICAgYWN0aW9uLnNldElkKGdldElkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBJREUtc3BlY2lmaWMgd29ya2JlbmNoIGFjdGlvbjogT3BlbiBwcm9qZWN0LgotICAgICAqIFRoaXMgYWN0aW9uIGlzIGEge0BsaW5rIFJldGFyZ2V0QWN0aW9ufSB3aXRoIAotICAgICAqIGlkICJvcGVuUHJvamVjdCIuIFRoaXMgYWN0aW9uIG1haW50YWlucyBpdHMgZW5hYmxlbWVudCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgT1BFTl9QUk9KRUNUID0gbmV3IEFjdGlvbkZhY3RvcnkoCi0gICAgICAgICAgICAib3BlblByb2plY3QiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLyogKG5vbi1qYXZhZG9jKSBtZXRob2QgZGVjbGFyZWQgb24gQWN0aW9uRmFjdG9yeSAqLwotICAgICAgICBwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJldGFyZ2V0QWN0aW9uIGFjdGlvbiA9IG5ldyBSZXRhcmdldEFjdGlvbihnZXRJZCgpLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hfb3BlblByb2plY3QpOwotICAgICAgICAgICAgYWN0aW9uLnNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9vcGVuUHJvamVjdFRvb2xUaXApOwotICAgICAgICAgICAgd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKGFjdGlvbik7Ci0gICAgICAgICAgICBhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS51aS5wcm9qZWN0Lm9wZW5Qcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogSURFLXNwZWNpZmljIHdvcmtiZW5jaCBhY3Rpb246IE9wZW4gd29ya3NwYWNlLgotICAgICAqIFRoaXMgYWN0aW9uIG1haW50YWlucyBpdHMgZW5hYmxlbWVudCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgT1BFTl9XT1JLU1BBQ0UgPSBuZXcgQWN0aW9uRmFjdG9yeSgKLSAgICAgICAgICAgICJvcGVuV29ya3NwYWNlIikgeyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8qIChub24tamF2YWRvYykgbWV0aG9kIGRlY2xhcmVkIG9uIEFjdGlvbkZhY3RvcnkgKi8KLSAgICAgICAgcHVibGljIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgICAgICBpZiAod2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IG5ldyBPcGVuV29ya3NwYWNlQWN0aW9uKHdpbmRvdyk7Ci0gICAgICAgICAgICBhY3Rpb24uc2V0SWQoZ2V0SWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIElERS1zcGVjaWZpYyB3b3JrYmVuY2ggYWN0aW9uOiBPcGVuIHByb2plY3QgcHJvcGVydGllcy4KLSAgICAgKiBUaGlzIGFjdGlvbiBtYWludGFpbnMgaXRzIGVuYWJsZW1lbnQgc3RhdGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBY3Rpb25GYWN0b3J5IE9QRU5fUFJPSkVDVF9QUk9QRVJUSUVTID0gbmV3IEFjdGlvbkZhY3RvcnkoCi0gICAgICAgICAgICAicHJvamVjdFByb3BlcnRpZXMiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLyogKG5vbi1qYXZhZG9jKSBtZXRob2QgZGVjbGFyZWQgb24gQWN0aW9uRmFjdG9yeSAqLwotICAgICAgICBwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElXb3JrYmVuY2hBY3Rpb24gYWN0aW9uID0gbmV3IFByb2plY3RQcm9wZXJ0eURpYWxvZ0FjdGlvbih3aW5kb3cpOwotICAgICAgICAgICAgYWN0aW9uLnNldElkKGdldElkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBJREUtc3BlY2lmaWMgd29ya2JlbmNoIGFjdGlvbjogUXVpY2sgc3RhcnQuCi0gICAgICogVGhpcyBhY3Rpb24gbWFpbnRhaW5zIGl0cyBlbmFibGVtZW50IHN0YXRlLgotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIHRoZSBJREUgbm93IHVzZXMgdGhlIG5ldyBpbnRybyBtZWNoYW5pc20KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgUVVJQ0tfU1RBUlQgPSBuZXcgQWN0aW9uRmFjdG9yeSgKLSAgICAgICAgICAgICJxdWlja1N0YXJ0IikgeyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8qIChub24tamF2YWRvYykgbWV0aG9kIGRlY2xhcmVkIG9uIEFjdGlvbkZhY3RvcnkgKi8KLSAgICAgICAgcHVibGljIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgICAgICBpZiAod2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IG5ldyBRdWlja1N0YXJ0QWN0aW9uKHdpbmRvdyk7Ci0gICAgICAgICAgICBhY3Rpb24uc2V0SWQoZ2V0SWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIElERS1zcGVjaWZpYyB3b3JrYmVuY2ggYWN0aW9uOiBGdWxsIGJ1aWxkLgotICAgICAqIFRoaXMgYWN0aW9uIG1haW50YWlucyBpdHMgZW5hYmxlbWVudCBzdGF0ZS4KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCBhcyBvZiAzLjAsIHRoaXMgYWN0aW9uIG5vIGxvbmdlciBhcHBlYXJzIGluIHRoZSBVSSAod2FzIGRlcHJlY2F0ZWQgaW4gMy4xKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWN0aW9uRmFjdG9yeSBSRUJVSUxEX0FMTCA9IG5ldyBBY3Rpb25GYWN0b3J5KAotICAgICAgICAgICAgInJlYnVpbGRBbGwiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLyogKG5vbi1qYXZhZG9jKSBtZXRob2QgZGVjbGFyZWQgb24gQWN0aW9uRmFjdG9yeSAqLwotICAgICAgICBwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElXb3JrYmVuY2hBY3Rpb24gYWN0aW9uID0gbmV3IEdsb2JhbEJ1aWxkQWN0aW9uKHdpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxEKTsKLSAgICAgICAgICAgIGFjdGlvbi5zZXRJZChnZXRJZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogSURFLXNwZWNpZmljIHdvcmtiZW5jaCBhY3Rpb246IFJlYnVpbGQgcHJvamVjdC4KLSAgICAgKiBUaGlzIGFjdGlvbiBpcyBhIHtAbGluayBSZXRhcmdldEFjdGlvbn0gd2l0aCAKLSAgICAgKiBpZCAicmVidWlsZFByb2plY3QiLiBUaGlzIGFjdGlvbiBtYWludGFpbnMgaXRzIGVuYWJsZW1lbnQgc3RhdGUuCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgYXMgb2YgMy4wLCB0aGlzIGFjdGlvbiBubyBsb25nZXIgYXBwZWFycyBpbiB0aGUgVUkgKHdhcyBkZXByZWNhdGVkIGluIDMuMSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgUkVCVUlMRF9QUk9KRUNUID0gbmV3IEFjdGlvbkZhY3RvcnkoCi0gICAgICAgICAgICAicmVidWlsZFByb2plY3QiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLyogKG5vbi1qYXZhZG9jKSBtZXRob2QgZGVjbGFyZWQgb24gQWN0aW9uRmFjdG9yeSAqLwotICAgICAgICBwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJldGFyZ2V0QWN0aW9uIGFjdGlvbiA9IG5ldyBSZXRhcmdldEFjdGlvbihnZXRJZCgpLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hfcmVidWlsZFByb2plY3QpOwotICAgICAgICAgICAgYWN0aW9uLnNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9yZWJ1aWxkUHJvamVjdFRvb2xUaXApOwotICAgICAgICAgICAgd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKGFjdGlvbik7Ci0gICAgICAgICAgICBhY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgLnNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2UudWkucHJvamVjdC5yZWJ1aWxkUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIElERS1zcGVjaWZpYyB3b3JrYmVuY2ggYWN0aW9uOiBUaXBzIGFuZCB0cmlja3MuCi0gICAgICogVGhpcyBhY3Rpb24gbWFpbnRhaW5zIGl0cyBlbmFibGVtZW50IHN0YXRlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWN0aW9uRmFjdG9yeSBUSVBTX0FORF9UUklDS1MgPSBuZXcgQWN0aW9uRmFjdG9yeSgKLSAgICAgICAgICAgICJ0aXBzQW5kVHJpY2tzIikgeyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8qIChub24tamF2YWRvYykgbWV0aG9kIGRlY2xhcmVkIG9uIEFjdGlvbkZhY3RvcnkgKi8KLSAgICAgICAgcHVibGljIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgICAgICBpZiAod2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IG5ldyBUaXBzQW5kVHJpY2tzQWN0aW9uKHdpbmRvdyk7Ci0gICAgICAgICAgICBhY3Rpb24uc2V0SWQoZ2V0SWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgICAgICB9Ci0gICAgfTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2lkZS9JREVFbmNvZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2lkZS9JREVFbmNvZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFjNTZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvSURFRW5jb2RpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaWRlOwotCi1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFbmNvZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogSURFRW5jb2RpbmcgaXMgYSB1dGlsaXR5IGNsYXNzIGZvciBtYW5hZ2luZyBlbmNvZGluZyBpbmZvcm1hdGlvbiB0aGF0Ci0gKiBpbmNsdWRlcyB1c2VyIHByZWZlcmVuY2VzIGZyb20gdGhlIElERSBhbmQgY29yZSByZXNvdXJjZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGl0cyBmdW5jdGlvbmFsaXR5IHZpYSBzdGF0aWMgbWV0aG9kcy4KLSAqIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFbmNvZGluZwotICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW4KLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIElERUVuY29kaW5nIHsKLQkKLQlwcml2YXRlIElERUVuY29kaW5nICgpIHsKLSAgICAgICAgLy8gcHJldmVudCBpbnN0YW50aWF0aW9uCi0JfQotCi0JLy9UaGUgcHJlZmVyZW5jZSBmb3IgdGhlIHVzZXIgZW50ZXJlZCBlbmNvZGluZ3MuCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElERV9FTkNPRElOR1NfUFJFRkVSRU5DRSA9ICJJREVfRU5DT0RJTkdTX1BSRUZFUkVOQ0UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJFRkVSRU5DRV9TRVBBUkFUT1IgPSAiJyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERpc3BsYXkgY29uc3RhbnQgZm9yIHRoZSBVVEYgOCBieXRlIG9yZGVyIG1hcmtlciBmb3IgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJPTV9VVEZfOCA9ICJVVEYtOCAoQk9NKSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRGlzcGxheSBjb25zdGFudCBmb3IgdGhlIFVURiAxNiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIgbWFya2VyIGZvcgotCSAqIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCT01fVVRGXzE2QkUgPSAiVVRGLTE2IEJpZy1FbmRpYW4gKEJPTSkiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERpc3BsYXkgY29uc3RhbnQgZm9yIHRoZSBVVEYgMTYgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyIG1hcmtlciBmb3IKLQkgKiByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQk9NX1VURl8xNkxFID0gIlVURi0xNiBMaXR0bGUtRW5kaWFuIChCT00pIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHZXQgYWxsIG9mIHRoZSBhdmFpbGFibGUgZW5jb2RpbmdzIGluY2x1ZGluZyBhbnkgdGhhdCB3ZXJlIHNhdmVkIGFzIGEKLQkgKiBwcmVmZXJlbmNlIGluIHRoZSBJREUgb3IgaW4gY29yZSByZXNvdXJjZXMuCi0JICogCi0JICogQHJldHVybiBMaXN0IG9mIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRJREVFbmNvZGluZ3MoKSB7Ci0JCUxpc3QgZW5jb2RpbmdzID0gZ2V0SURFRW5jb2RpbmdzUHJlZmVyZW5jZSgpOwotCQllbmNvZGluZ3MuYWRkQWxsKFdvcmtiZW5jaEVuY29kaW5nLmdldERlZmluZWRFbmNvZGluZ3MoKSk7Ci0KLQkJU3RyaW5nIGVuYyA9IGdldFJlc291cmNlRW5jb2RpbmcoKTsKLQotCQlpZiAoIShlbmMgPT0gbnVsbCB8fCBlbmNvZGluZ3MuY29udGFpbnMoZW5jKSkpCi0JCQllbmNvZGluZ3MuYWRkKGVuYyk7Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChlbmNvZGluZ3MpOwotCQlyZXR1cm4gZW5jb2RpbmdzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZW5jb2RpbmcgcHJlZmVyZW5jZS4gSWYgdGhlIHZhbHVlIGlzIG5vdCBzZXQKLQkgKiByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZUVuY29kaW5nKCkgewotCQlTdHJpbmcgcHJlZmVyZW5jZSA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZygKLQkJCQlSZXNvdXJjZXNQbHVnaW4uUFJFRl9FTkNPRElORyk7Ci0JCWlmIChwcmVmZXJlbmNlID09IG51bGwgfHwgcHJlZmVyZW5jZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcmVzb3VyY2UgZW5jb2RpbmcgdG8gYmUgdmFsdWUuIEFkZCB0aGUgZW5jb2RpbmcgdG8gdGhlIGxpc3Qgb2YKLQkgKiBlbmNvZGluZ3Mgc3RvcmVkIGJ5IHRoZSB3b3JrYmVuY2guCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBTdHJpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgdG8gYmUgcmVzZXQKLQkgKiAgICAgICAgICAgIHRvIHRoZSBkZWZhdWx0LgotCSAqIEBkZXByZWNhdGVkIFVzZSBJV29ya3NwYWNlUm9vdCNzZXREZWZhdWx0Q2hhcnNldCBhbmQgCi0JICogYWRkIHRoZSBlbmNvZGluZyB1c2luZyAjYWRkRW5jb2RpbmcuCi0JICogVGhpcyBBUEkgd2lsbCBiZSBkZWxldGVkIGJlZm9yZSAzLjEgTTMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJlc291cmNlRW5jb2RpbmcoU3RyaW5nIHZhbHVlKSB7Ci0KLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQlhZGRJREVFbmNvZGluZyh2YWx1ZSk7Ci0KLQkJZmluYWwgU3RyaW5nIGZpbmFsVmFsdWUgPSB2YWx1ZTsKLQkJSm9iIGNoYXJzZXRKb2IgPSBuZXcgSm9iKElERVdvcmtiZW5jaE1lc3NhZ2VzLklERUVuY29kaW5nX0VuY29kaW5nSm9iKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQl0cnkgewotCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLnNldERlZmF1bHRDaGFyc2V0KGZpbmFsVmFsdWUsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCXJldHVybiBleGNlcHRpb24uZ2V0U3RhdHVzKCk7Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCQl9Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIHNob3VsZFJ1bigpIHsKLQkJCQkvL0RvIG5vdCBydW4gYWZ0ZXIgc2h1dGRvd24KLQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5pc1dvcmtiZW5jaFJ1bm5pbmcoKTsKLQkJCX0KLQkJfTsKLQkJY2hhcnNldEpvYi5zY2hlZHVsZSgpOwotCi0JfQotCi0JLyoqCi0JICogQWRkIHZhbHVlIHRvIHRoZSBsaXN0IG9mIHdvcmtiZW5jaCBlbmNvZGluZ3MuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZElERUVuY29kaW5nKFN0cmluZyB2YWx1ZSkgewotCi0JCWlmIChXb3JrYmVuY2hFbmNvZGluZy5nZXREZWZpbmVkRW5jb2RpbmdzKCkuY29udGFpbnModmFsdWUpKQotCQkJcmV0dXJuOwotCi0JCXdyaXRlRW5jb2RpbmdzUHJlZmVyZW5jZSh2YWx1ZSwgZ2V0SURFRW5jb2RpbmdzUHJlZmVyZW5jZSgpKTsKLQotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBlbmNvZGluZ3MgcHJlZmVyZW5jZS4gSWYgdmFsdWUgaXMgbm90IG51bGwKLQkgKiBhbmQgbm90IGFscmVhZHkgaW4gdGhlIGxpc3Qgb2YgY3VycmVudEVuY29kaW5ncyBhZGQKLQkgKiBpdCB0byB0aGUgbGlzdC4KLQkgKiBAcGFyYW0gdmFsdWUgU3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGVuY29kaW5ncyBUaGUgbGlzdCBvZiBlbmNvZGluZ3MgdG8gd3JpdGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlRW5jb2RpbmdzUHJlZmVyZW5jZShTdHJpbmcgdmFsdWUsIENvbGxlY3Rpb24gZW5jb2RpbmdzKSB7Ci0JCWJvb2xlYW4gYWRkVmFsdWUgPSAodmFsdWUgIT0gbnVsbCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlJdGVyYXRvciBjdXJyZW50RW5jb2RpbmdzID0gZW5jb2RpbmdzLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGN1cnJlbnRFbmNvZGluZ3MuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gKFN0cmluZykgY3VycmVudEVuY29kaW5ncy5uZXh0KCk7Ci0JCQlyZXN1bHQuYXBwZW5kKHN0cmluZyk7Ci0JCQlyZXN1bHQuYXBwZW5kKFBSRUZFUkVOQ0VfU0VQQVJBVE9SKTsKLQkJCWlmIChhZGRWYWx1ZSAmJiBzdHJpbmcuZXF1YWxzKHZhbHVlKSkvL0lmIHdlIHN0aWxsIHRoaW5rIHdlIGFyZSBnb2luZyB0byBhZGQgaXQgY2hlY2sgZmlyc3QKLQkJCQlhZGRWYWx1ZSA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKGFkZFZhbHVlKQotCQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0KLQkJSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShJREVfRU5DT0RJTkdTX1BSRUZFUkVOQ0UsCi0JCQkJcmVzdWx0LnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGVuY29kaW5ncyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0SURFRW5jb2RpbmdzUHJlZmVyZW5jZSgpIHsKLQkJCi0JCWJvb2xlYW4gdXBkYXRlUmVxdWlyZWQgPSBmYWxzZTsKLQkJCi0JCVN0cmluZyBlbmNvZGluZ3MgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlJREVfRU5DT0RJTkdTX1BSRUZFUkVOQ0UpOwotCi0JCWlmIChlbmNvZGluZ3MgPT0gbnVsbCB8fCBlbmNvZGluZ3MubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJU3RyaW5nW10gcHJlZmVyZW5jZUVuY29kaW5ncyA9IGVuY29kaW5ncy5zcGxpdChQUkVGRVJFTkNFX1NFUEFSQVRPUik7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy9Ecm9wIGFueSBlbmNvZGluZ3MgdGhhdCBhcmUgbm90IHZhbGlkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlZmVyZW5jZUVuY29kaW5ncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHN0cmluZyA9IHByZWZlcmVuY2VFbmNvZGluZ3NbaV07Ci0JCQlib29sZWFuIGlzU3VwcG9ydGVkOwotCQkJdHJ5IHsKLQkJCQlpc1N1cHBvcnRlZCA9IENoYXJzZXQuaXNTdXBwb3J0ZWQoc3RyaW5nKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaXNTdXBwb3J0ZWQgPSBmYWxzZTsKLQkJCX0KLQkJCWlmIChpc1N1cHBvcnRlZCkKLQkJCQlyZXN1bHQuYWRkKHN0cmluZyk7Ci0JCQllbHNlewotCQkJCVdvcmtiZW5jaFBsdWdpbi5sb2coTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoRW5jb2RpbmdfaW52YWxpZENoYXJzZXQsIHN0cmluZykpOwotCQkJCXVwZGF0ZVJlcXVpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJCQkKLQkJfQotCQkKLQkJaWYodXBkYXRlUmVxdWlyZWQpLy9JZiB3ZSBsb2dnZWQgYSBwcm9ibGVtIHRoZW4gY2xlYXIgdGhlIHByZWZlcmVuY2UKLQkJCXdyaXRlRW5jb2RpbmdzUHJlZmVyZW5jZShudWxsLCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIElERSBlbmNvZGluZ3MgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJVc2VyRW5jb2RpbmdzKCkgewotCQlJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFRvRGVmYXVsdChJREVfRU5DT0RJTkdTX1BSRUZFUkVOQ0UpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZGlzcGxheWFibGUgc3RyaW5nIGZvciB0aGUgYnl0ZSBvcmRlciBtYXJraW5nIGZyb20gdGhlIHN1cHBsaWVkCi0JICogZmlsZSBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiB0byBxdWVyeS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gU3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBieXRlIG9yZGVyIG1hcmsgY2Fubm90IGJlCi0JICogICAgICAgICBmb3VuZCBvciB0aGUgZGVzY3JpcHRpb24gaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNlZSBJQ29udGVudERlc2NyaXB0aW9uI2dldFByb3BlcnR5KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJ5dGVPcmRlck1hcmtMYWJlbChJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlieXRlW10gYm9tID0gKGJ5dGVbXSkgZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQlpZiAoYm9tID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGJvbSA9PSBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfOCkKLQkJCXJldHVybiBJREVFbmNvZGluZy5CT01fVVRGXzg7Ci0JCWlmIChib20gPT0gSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzE2QkUpCi0JCQlyZXR1cm4gSURFRW5jb2RpbmcuQk9NX1VURl8xNkJFOwotCQlpZiAoYm9tID09IElDb250ZW50RGVzY3JpcHRpb24uQk9NX1VURl8xNkxFKQotCQkJcmV0dXJuIElERUVuY29kaW5nLkJPTV9VVEZfMTZMRTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvSUdvdG9NYXJrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvSUdvdG9NYXJrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1OGMwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaWRlL0lHb3RvTWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIGludGVyZmFjZSBmb3IgZWRpdG9ycywgd2hpY2ggYWxsb3dzIHRoZSBlZGl0b3IKLSAqIHRvIHJldmVhbCB0aGUgcG9zaXRpb24gb2YgYSBnaXZlbiBtYXJrZXIuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJR290b01hcmtlciB7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3Vyc29yIGFuZCBzZWxlY3Rpb24gc3RhdGUgZm9yIGFuIGVkaXRvciB0byAKLSAgICAgKiByZXZlYWwgdGhlIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBtYXJrZXIuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBtYXJrZXIgdGhlIG1hcmtlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2lkZS9JSURFQWN0aW9uQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaWRlL0lJREVBY3Rpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0ZmFkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaWRlL0lJREVBY3Rpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaWRlOwotCi0vKioKLSAqIElkZW50aWZpZXJzIGZvciBJREUgbWVudXMsIHRvb2xiYXJzIGFuZCBncm91cHMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQKLSAqIG9yIGV4dGVuZGVkLgotICogPC9wPgotICogCi0gKiBOb3RlOiB3YW50IHRvIG1vdmUgSURFLXNwZWNpZmljIHN0dWZmIG91dCBvZiBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLgotICogICBUaGVyZSdzIHN0aWxsIHNvbWUgY2xlYW51cCB0byBiZSBkb25lIGhlcmUgKGFuZCB0aGVyZSkuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSURFQWN0aW9uQ29uc3RhbnRzIHsKLQotICAgIC8qKgotICAgICAqIE5hbWUgb2Ygc3RhbmRhcmQgRmlsZSBtZW51ICh2YWx1ZSA8Y29kZT4iZmlsZSI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX0ZJTEUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIE5hbWUgb2Ygc3RhbmRhcmQgRWRpdCBtZW51ICh2YWx1ZSA8Y29kZT4iZWRpdCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX0VESVQgPSAiZWRpdCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIE5hbWUgb2Ygc3RhbmRhcmQgTmF2aWdhdGUgbWVudSAodmFsdWUgPGNvZGU+Im5hdmlnYXRlIjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1fTkFWSUdBVEUgPSAibmF2aWdhdGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHN0YW5kYXJkIFByb2plY3QgbWVudSAodmFsdWUgPGNvZGU+InByb2plY3QiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTV9QUk9KRUNUID0gInByb2plY3QiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHN0YW5kYXJkIFdpbmRvdyBtZW51ICh2YWx1ZSA8Y29kZT4id2luZG93IjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1fV0lORE9XID0gIndpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIE5hbWUgb2Ygc3RhbmRhcmQgSGVscCBtZW51ICh2YWx1ZSA8Y29kZT4iaGVscCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX0hFTFAgPSAiaGVscCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEZpbGUgbWVudTogbmFtZSBvZiBncm91cCBmb3Igc3RhcnQgb2YgbWVudSAodmFsdWUgPGNvZGU+ImZpbGVTdGFydCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1NUQVJUID0gImZpbGVTdGFydCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEZpbGUgbWVudTogbmFtZSBvZiBncm91cCBmb3IgZW5kIG9mIG1lbnUgKHZhbHVlIDxjb2RlPiJmaWxlRW5kIjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfRU5EID0gImZpbGVFbmQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBGaWxlIG1lbnU6IG5hbWUgb2YgZ3JvdXAgZm9yIGV4dHJhIE5ldy1saWtlIGFjdGlvbnMgKHZhbHVlIDxjb2RlPiJuZXcuZXh0IjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FWFQgPSAibmV3LmV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEZpbGUgbWVudTogbmFtZSBvZiBncm91cCBmb3IgZXh0cmEgQ2xvc2UtbGlrZSBhY3Rpb25zICh2YWx1ZSA8Y29kZT4iY2xvc2UuZXh0IjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NFX0VYVCA9ICJjbG9zZS5leHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBGaWxlIG1lbnU6IG5hbWUgb2YgZ3JvdXAgZm9yIGV4dHJhIFNhdmUtbGlrZSBhY3Rpb25zICh2YWx1ZSA8Y29kZT4ic2F2ZS5leHQiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9FWFQgPSAic2F2ZS5leHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBGaWxlIG1lbnU6IG5hbWUgb2YgZ3JvdXAgZm9yIGV4dHJhIFByaW50LWxpa2UgYWN0aW9ucyAodmFsdWUgPGNvZGU+InByaW50LmV4dCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOVF9FWFQgPSAicHJpbnQuZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogRmlsZSBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBleHRyYSBJbXBvcnQtbGlrZSBhY3Rpb25zICh2YWx1ZSA8Y29kZT4iaW1wb3J0LmV4dCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfRVhUID0gImltcG9ydC5leHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBGaWxlIG1lbnU6IG5hbWUgb2YgIk1vc3QgUmVjZW50bHkgVXNlZCBGaWxlIiBncm91cC4KLSAgICAgKiAodmFsdWUgPGNvZGU+Im1ydSI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNUlUgPSAibXJ1IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogRWRpdCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBzdGFydCBvZiBtZW51ICh2YWx1ZSA8Y29kZT4iZWRpdFN0YXJ0IjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfU1RBUlQgPSAiZWRpdFN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogRWRpdCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBlbmQgb2YgbWVudSAodmFsdWUgPGNvZGU+ImVkaXRFbmQiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9FTkQgPSAiZWRpdEVuZCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEVkaXQgbWVudTogbmFtZSBvZiBncm91cCBmb3IgZXh0cmEgVW5kby1saWtlIGFjdGlvbnMgKHZhbHVlIDxjb2RlPiJ1bmRvLmV4dCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRPX0VYVCA9ICJ1bmRvLmV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEVkaXQgbWVudTogbmFtZSBvZiBncm91cCBmb3IgZXh0cmEgQ3V0LWxpa2UgYWN0aW9ucyAodmFsdWUgPGNvZGU+ImN1dC5leHQiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VUX0VYVCA9ICJjdXQuZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogRWRpdCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBleHRyYSBGaW5kLWxpa2UgYWN0aW9ucyAodmFsdWUgPGNvZGU+ImZpbmQuZXh0IjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkRfRVhUID0gImN1dC5leHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBFZGl0IG1lbnU6IG5hbWUgb2YgZ3JvdXAgZm9yIGV4dHJhIEFkZC1saWtlIGFjdGlvbnMgKHZhbHVlIDxjb2RlPiJhZGQuZXh0IjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9FWFQgPSAiYWRkLmV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFdvcmtiZW5jaCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBleHRyYSBCdWlsZC1saWtlIGFjdGlvbnMKLSAgICAgKiAodmFsdWUgPGNvZGU+ImJ1aWxkLmV4dCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9FWFQgPSAiYnVpbGQuZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogV29ya2JlbmNoIHRvb2xiYXIgaWQgZm9yIGZpbGUgdG9vbGJhciBncm91cC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTEJBUl9GSUxFID0gIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5maWxlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogV29ya2JlbmNoIHRvb2xiYXIgaWQgZm9yIG5hdmlnYXRlIHRvb2xiYXIgZ3JvdXAuCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xCQVJfTkFWSUdBVEUgPSAib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLm5hdmlnYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gV29ya2JlbmNoIHRvb2xiYXIgZ3JvdXAgaWRzLiAgVG8gYWRkIGFuIGl0ZW0gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ3JvdXAsIAotICAgIC8vIHVzZSB0aGUgR1JPVVAgaWQuICBUbyBhZGQgYW4gaXRlbSBhdCB0aGUgZW5kIG9mIHRoZSBncm91cCwgdXNlIHRoZSBFWFQgaWQuCi0KLSAgICAvKioKLSAgICAgKiBHcm91cCBpZCBmb3IgcGluIHRvb2xiYXIgZ3JvdXAuCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTl9HUk9VUCA9ICJwaW4uZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBHcm91cCBpZHMgZm9yIGhpc3RvcnkgdG9vbGJhciBncm91cC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElTVE9SWV9HUk9VUCA9ICJoaXN0b3J5Lmdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogR3JvdXAgaWRzIGZvciBuZXcgdG9vbGJhciBncm91cC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0dST1VQID0gIm5ldy5ncm91cCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEdyb3VwIGlkcyBmb3Igc2F2ZSB0b29sYmFyIGdyb3VwLgotICAgICAqIAotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0dST1VQID0gInNhdmUuZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBHcm91cCBpZHMgZm9yIGJ1aWxkIHRvb2xiYXIgZ3JvdXAuCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX0dST1VQID0gImJ1aWxkLmdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gUG9wLXVwIG1lbnUgZ3JvdXBzOgotICAgIC8qKgotICAgICAqIFBvcC11cCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBBZGQgYWN0aW9ucyAodmFsdWUgPGNvZGU+Imdyb3VwLmFkZCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9BREQgPSAiZ3JvdXAuYWRkIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogUG9wLXVwIG1lbnUgYW5kIGNvb2wgYmFyOiBuYW1lIG9mIGdyb3VwIGZvciBGaWxlIGFjdGlvbnMgKHZhbHVlIDxjb2RlPiJncm91cC5maWxlIjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0ZJTEUgPSAiZ3JvdXAuZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIENvb2xiYXI6IG5hbWUgb2YgZ3JvdXAgZm9yIE5hdmlnYXRlIGFjdGlvbnMgKHZhbHVlIDxjb2RlPiJncm91cC5uYXYiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfTkFWID0gImdyb3VwLm5hdiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFBvcC11cCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBTaG93IEluIGFjdGlvbnMgKHZhbHVlIDxjb2RlPiJncm91cC5zaG93SW4iPC9jb2RlPikuCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX1NIT1dfSU4gPSAiZ3JvdXAuc2hvd0luIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogTmF2aWdhdGUgbWVudTogbmFtZSBvZiBncm91cCBmb3Igc3RhcnQgb2YgbWVudQotICAgICAqICh2YWx1ZSA8Y29kZT4ibmF2U3RhcnQiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFWX1NUQVJUID0gIm5hdlN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogTmF2aWdhdGUgbWVudTogbmFtZSBvZiBncm91cCBmb3IgZW5kIG9mIG1lbnUKLSAgICAgKiAodmFsdWUgPGNvZGU+Im5hdkVuZCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVZfRU5EID0gIm5hdkVuZCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIE5hdmlnYXRlIG1lbnU6IG5hbWUgb2YgZ3JvdXAgZm9yIGV4dHJhIE9wZW4gYWN0aW9ucwotICAgICAqICh2YWx1ZSA8Y29kZT4ib3Blbi5leHQiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9FWFQgPSAib3Blbi5leHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBOYXZpZ2F0ZSBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBleHRyYSBTaG93IGFjdGlvbnMKLSAgICAgKiAodmFsdWUgPGNvZGU+InNob3cuZXh0IjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfRVhUID0gInNob3cuZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogTmF2aWdhdGUgbWVudTogbmFtZSBvZiBzdGFuZGFyZCBHbyBJbnRvIGdsb2JhbCBhY3Rpb24KLSAgICAgKiAodmFsdWUgPGNvZGU+ImdvSW50byI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT19JTlRPID0gImdvSW50byI7IC8vIEdsb2JhbCBhY3Rpb24uIC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIE5hdmlnYXRlIG1lbnU6IG5hbWUgb2Ygc3RhbmRhcmQgR28gVG8gc3VibWVudQotICAgICAqICh2YWx1ZSA8Y29kZT4iZ29UbyI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT19UTyA9ICJnb1RvIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogTmF2aWdhdGUgbWVudTogbmFtZSBvZiBzdGFuZGFyZCBHbyBUbyBSZXNvdXJjZSBnbG9iYWwgYWN0aW9uCi0gICAgICogKHZhbHVlIDxjb2RlPiJnb1RvUmVzb3VyY2UiPC9jb2RlPikuCi0gICAgICogCi0gICAgICogTm90ZTpzaG91bGQgYmUgaW4gYW4gYWN0aW9uIGZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT19UT19SRVNPVVJDRSA9ICJnb1RvUmVzb3VyY2UiOyAvLyBHbG9iYWwgYWN0aW9uLiAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBQcm9qZWN0IG1lbnU6IG5hbWUgb2YgZ3JvdXAgZm9yIHN0YXJ0IG9mIG1lbnUKLSAgICAgKiAodmFsdWUgPGNvZGU+InByb2pTdGFydCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KX1NUQVJUID0gInByb2pTdGFydCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFByb2plY3QgbWVudTogbmFtZSBvZiBncm91cCBmb3Igc3RhcnQgb2YgbWVudQotICAgICAqICh2YWx1ZSA8Y29kZT4icHJvakVuZCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KX0VORCA9ICJwcm9qRW5kIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogSGVscCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBzdGFydCBvZiBtZW51Ci0gICAgICogKHZhbHVlIDxjb2RlPiJoZWxwU3RhcnQiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMUF9TVEFSVCA9ICJoZWxwU3RhcnQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBIZWxwIG1lbnU6IG5hbWUgb2YgZ3JvdXAgZm9yIGVuZCBvZiBtZW51Ci0gICAgICogKHZhbHVlIDxjb2RlPiJoZWxwRW5kIjwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFTFBfRU5EID0gImhlbHBFbmQiOyAvLyROT04tTkxTLTEkCi0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2lkZS9SZXNvdXJjZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvUmVzb3VyY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2Y4YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2lkZS9SZXNvdXJjZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmlkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIG1hbmlwdWxhdGluZyByZXNvdXJjZXMgYW5kIGRldGVybWluaW5nIGNvcnJlc3BvbmRlbmNlcyAKLSAqIGJldHdlZW4gcmVzb3VyY2VzIGFuZCB3b3JrYmVuY2ggb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9uYWxpdHkgdmlhIHN0YXRpYyBtZXRob2RzLgotICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkLgotICogPC9wPgotICoKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJlc291cmNlVXRpbCB7Ci0KLSAgICBwcml2YXRlIFJlc291cmNlVXRpbCgpIHsKLSAgICAgICAgLy8gcHJldmVudCBpbnN0YW50aWF0aW9uCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBlZGl0b3IgaW5wdXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgdGhlcmUgaXMgbm8gYXBwbGljYWJsZSBmaWxlLiAgCi0gICAgICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZWRpdG9yIGlucHV0IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBlZGl0b3JJbnB1dCB0aGUgZWRpdG9yIGlucHV0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgZWRpdG9yIGlucHV0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0RmlsZShJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKLQkJaWYgKGVkaXRvcklucHV0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0gICAgICAgIC8vIE5vdGU6IGRvIG5vdCB0cmVhdCBJRmlsZUVkaXRvcklucHV0IGFzIGEgc3BlY2lhbCBjYXNlLiAgVXNlIHRoZSBhZGFwdGVyIG1lY2hhbmlzbSBpbnN0ZWFkLgotICAgICAgICAvLyBTZWUgQnVnIDg3Mjg4IFtJREVdIFtFZGl0b3JNZ210XSBTaG91bGQgYXZvaWQgZXhwbGljaXQgY2hlY2tzIGZvciBbSV1GaWxlRWRpdG9ySW5wdXQKLSAgICAgICAgT2JqZWN0IG8gPSBlZGl0b3JJbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgICAgICAgIHJldHVybiAoSUZpbGUpIG87Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVkaXRvciBpbnB1dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBpZiB0aGVyZSBpcyBubyBhcHBsaWNhYmxlIHJlc291cmNlLgotICAgICAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGdpdmVuIGVkaXRvciBpbnB1dCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWRpdG9ySW5wdXQgdGhlIGVkaXRvciBpbnB1dAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgZWRpdG9yIGlucHV0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgewotCQlpZiAoZWRpdG9ySW5wdXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLSAgICAgICAgLy8gTm90ZTogZG8gbm90IHRyZWF0IElGaWxlRWRpdG9ySW5wdXQgYXMgYSBzcGVjaWFsIGNhc2UuICBVc2UgdGhlIGFkYXB0ZXIgbWVjaGFuaXNtIGluc3RlYWQuCi0gICAgICAgIC8vIFNlZSBCdWcgODcyODggW0lERV0gW0VkaXRvck1nbXRdIFNob3VsZCBhdm9pZCBleHBsaWNpdCBjaGVja3MgZm9yIFtJXUZpbGVFZGl0b3JJbnB1dAotICAgICAgICBPYmplY3QgbyA9IGVkaXRvcklucHV0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICAgICAgICByZXR1cm4gKElSZXNvdXJjZSkgbzsKLSAgICAgICAgLy8gdGhlIGlucHV0IG1heSBhZGFwdCB0byBJRmlsZSBidXQgbm90IElSZXNvdXJjZQotICAgICAgICByZXR1cm4gZ2V0RmlsZShlZGl0b3JJbnB1dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWRpdG9yIGluIHRoZSBnaXZlbiBwYWdlIHdob3NlIGlucHV0IHJlcHJlc2VudHMgdGhlIGdpdmVuIGZpbGUsCi0gICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBlZGl0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhZ2UgdGhlIHdvcmtiZW5jaCBwYWdlCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXRjaGluZyBlZGl0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBmaW5kRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIElGaWxlIGZpbGUpIHsKLSAgICAgICAgLy8gaGFuZGxlIHRoZSBjb21tb24gY2FzZSB3aGVyZSB0aGUgZWRpdG9yIGlucHV0IGlzIGEgRmlsZUVkaXRvcklucHV0Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZmluZEVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpKTsKLSAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZWRpdG9yOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNoZWNrIGZvciBlZGl0b3JzIHRoYXQgaGF2ZSB0aGVpciBvd24ga2luZCBvZiBpbnB1dCB0aGF0IGFkYXB0cyB0byBJRmlsZSwKLSAgICAgICAgLy8gYmVpbmcgY2FyZWZ1bCBub3QgdG8gZm9yY2UgbG9hZGluZyBvZiB0aGUgZWRpdG9yCi0gICAgICAgIElFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSUVkaXRvclJlZmVyZW5jZSByZWYgPSByZWZzW2ldOwotICAgICAgICAgICAgSUVkaXRvclBhcnQgcGFydCA9IHJlZi5nZXRFZGl0b3IoZmFsc2UpOwotICAgICAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElGaWxlIGVkaXRvckZpbGUgPSBnZXRGaWxlKHBhcnQuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVkaXRvckZpbGUgIT0gbnVsbCAmJiBmaWxlLmVxdWFscyhlZGl0b3JGaWxlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG1vZGVsIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgdGhlcmUgaXMgbm8gYXBwbGljYWJsZSByZXNvdXJjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgbW9kZWwgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtb2RlbCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEBzaW5jZSAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmV0dXJuIChJUmVzb3VyY2UpIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIChJUmVzb3VyY2UpIGdldEFkYXB0ZXIoZWxlbWVudCwgSVJlc291cmNlLmNsYXNzLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG1vZGVsIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgdGhlcmUgaXMgbm8gYXBwbGljYWJsZSBmaWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBtb2RlbCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZGVsIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogQHNpbmNlIDMuMgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0RmlsZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLy8gdHJ5IGRpcmVjdCBpbnN0YW5jZW9mIGNoZWNrCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCXJldHVybiAoSUZpbGUpIGVsZW1lbnQ7Ci0JCX0KLQkJCi0JCS8vIHRyeSBmb3IgUmVzb3VyY2VNYXBwaW5nCi0JCVJlc291cmNlTWFwcGluZyBtYXBwaW5nID0gZ2V0UmVzb3VyY2VNYXBwaW5nKGVsZW1lbnQpOwotCQlpZiAobWFwcGluZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RmlsZUZyb21SZXNvdXJjZU1hcHBpbmcobWFwcGluZyk7Ci0JCX0KLQkJCi0JCS8vIHRyeSBmb3IgSUZpbGUgYWRhcHRlciAoYmVmb3JlIElSZXNvdXJjZSBhZGFwdGVyLCBzaW5jZSBpdCdzIG1vcmUgc3BlY2lmaWMpCi0JCU9iamVjdCBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbGVtZW50LCBJRmlsZS5jbGFzcywgdHJ1ZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCXJldHVybiAoSUZpbGUpIGFkYXB0ZXI7Ci0JCX0KLQkJCi0JCS8vIHRyeSBmb3IgSVJlc291cmNlIGFkYXB0ZXIKLQkJYWRhcHRlciA9IGdldEFkYXB0ZXIoZWxlbWVudCwgSVJlc291cmNlLmNsYXNzLCB0cnVlKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJcmV0dXJuIChJRmlsZSkgYWRhcHRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQkvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBtYXBwaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG1vZGVsIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgdGhlcmUgaXMgbm8gYXBwbGljYWJsZSByZXNvdXJjZSBtYXBwaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBtb2RlbCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIG1hcHBpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgbW9kZWwgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAc2luY2UgMy4yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZU1hcHBpbmcgZ2V0UmVzb3VyY2VNYXBwaW5nKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvLyB0cnkgZGlyZWN0IGluc3RhbmNlb2YgY2hlY2sKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNvdXJjZU1hcHBpbmcpIHsKLQkJCXJldHVybiAoUmVzb3VyY2VNYXBwaW5nKSBlbGVtZW50OwotCQl9Ci0JCQotCQkvLyB0cnkgZm9yIFJlc291cmNlTWFwcGluZyBhZGFwdGVyCi0JCU9iamVjdCBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbGVtZW50LCBSZXNvdXJjZU1hcHBpbmcuY2xhc3MsIHRydWUpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFJlc291cmNlTWFwcGluZykgewotCQkJcmV0dXJuIChSZXNvdXJjZU1hcHBpbmcpIGFkYXB0ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIFRyaWVzIHRvIGV4dHJhIGEgc2luZ2xlIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFwcGluZy4KLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIGlmIHRoZSBtYXBwaW5nIG1hcHMgdG8gYSBzaW5nbGUgZmlsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBpZiBpdCBtYXBzIHRvIHplcm8gb3IgbXVsdGlwbGUgZmlsZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcHBpbmcgdGhlIHJlc291cmNlIG1hcHBpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIElGaWxlIGdldEZpbGVGcm9tUmVzb3VyY2VNYXBwaW5nKFJlc291cmNlTWFwcGluZyBtYXBwaW5nKSB7Ci0gICAgCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlRnJvbVJlc291cmNlTWFwcGluZyhtYXBwaW5nKTsKLSAgICAJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAJCXJldHVybiAoSUZpbGUpIHJlc291cmNlOwotICAgIAl9Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUcmllcyB0byBleHRyYSBhIHNpbmdsZSByZXNvdXJjZSBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZSBtYXBwaW5nLgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGlmIHRoZSBtYXBwaW5nIG1hcHMgdG8gYSBzaW5nbGUgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgaXQgbWFwcyB0byB6ZXJvIG9yIG11bHRpcGxlIHJlc291cmNlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwcGluZyB0aGUgcmVzb3VyY2UgbWFwcGluZwotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZUZyb21SZXNvdXJjZU1hcHBpbmcoUmVzb3VyY2VNYXBwaW5nIG1hcHBpbmcpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlVHJhdmVyc2FsW10gdHJhdmVyc2FscyA9IG1hcHBpbmcuZ2V0VHJhdmVyc2FscyhudWxsLCBudWxsKTsKLQkgICAgCWlmICh0cmF2ZXJzYWxzLmxlbmd0aCAhPSAxKSB7Ci0JICAgIAkJcmV0dXJuIG51bGw7Ci0JICAgIAl9Ci0JICAgIAlSZXNvdXJjZVRyYXZlcnNhbCB0cmF2ZXJzYWwgPSB0cmF2ZXJzYWxzWzBdOwotCSAgICAJLy8gVE9ETzogbmVlZCB0byBob25vdXIgdHJhdmVyc2FsIGZsYWdzCi0JICAgIAlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSB0cmF2ZXJzYWwuZ2V0UmVzb3VyY2VzKCk7Ci0JICAgIAlpZiAocmVzb3VyY2VzLmxlbmd0aCAhPSAxKSB7Ci0JICAgIAkJcmV0dXJuIG51bGw7Ci0JICAgIAl9Ci0JICAgIAlyZXR1cm4gcmVzb3VyY2VzWzBdOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUlERVdvcmtiZW5jaFBsdWdpbi5sb2coIkVycm9yIGluIFJlc291cmNlVXRpbC5nZXRGaWxlRnJvbVJlc291cmNlTWFwcGluZyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCi0JLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIGlmIG5vIHN1Y2ggYWRhcHRlciB3YXMgZm91bmQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIG1vZGVsIGVsZW1lbnQKLQkgKiBAcGFyYW0gYWRhcHRlclR5cGUgdGhlIHR5cGUgb2YgYWRhcHRlciB0byBsb29rIHVwCi0JICogQHBhcmFtIGZvcmNlTG9hZCA8Y29kZT50cnVlPC9jb2RlPiB0byBmb3JjZSBsb2FkaW5nIG9mIHRoZSBwbHVnLWluIHByb3ZpZGluZyB0aGUgYWRhcHRlciwgCi0JICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogQHJldHVybiB0aGUgYWRhcHRlcgotICAgICAqIEBzaW5jZSAzLjIKLSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBlbGVtZW50LCBDbGFzcyBhZGFwdGVyVHlwZSwgYm9vbGVhbiBmb3JjZUxvYWQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlJQWRhcHRhYmxlIGFkYXB0YWJsZSA9IChJQWRhcHRhYmxlKSBlbGVtZW50OwotCSAgICAgICAgT2JqZWN0IG8gPSBhZGFwdGFibGUuZ2V0QWRhcHRlcihhZGFwdGVyVHlwZSk7Ci0JICAgICAgICBpZiAobyAhPSBudWxsKSB7Ci0JICAgICAgICAJcmV0dXJuIG87Ci0JICAgICAgICB9Ci0JCX0KLQkJaWYgKGZvcmNlTG9hZCkgewotCQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIoZWxlbWVudCwgYWRhcHRlclR5cGUuZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKGVsZW1lbnQsIGFkYXB0ZXJUeXBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvZGlhbG9ncy9BYnN0cmFjdEVuY29kaW5nRmllbGRFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvZGlhbG9ncy9BYnN0cmFjdEVuY29kaW5nRmllbGRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3ZmUzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaWRlL2RpYWxvZ3MvQWJzdHJhY3RFbmNvZGluZ0ZpZWxkRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRW5jb2Rpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERUVuY29kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBmaWVsZCBlZGl0b3JzIHVzZWQgdG8gc2V0IGFuIGVuY29kaW5nLiAKLSAqIEFueSB1c2VyIGVudGVyZWQgZW5jb2RpbmdzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgZW5jb2RpbmdzIGF2YWlsYWJsZSB2aWEge0BsaW5rIG9yZy5lY2xpcHNlLnVpLmlkZS5JREVFbmNvZGluZ30uCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCwgYnV0IG11c3QgY2FsbCA8Y29kZT5jcmVhdGVFbmNvZGluZ0dyb3VwPC9jb2RlPiBkdXJpbmcgPGNvZGU+ZG9GaWxsSW50b0dyaWQ8L2NvZGU+LgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmlkZS5JREVFbmNvZGluZwotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbmNvZGluZ0ZpZWxkRWRpdG9yIGV4dGVuZHMgRmllbGRFZGl0b3IgewotICAgIAotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQotCXByaXZhdGUgQnV0dG9uIGRlZmF1bHRFbmNvZGluZ0J1dHRvbjsKLQotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRFbmM7Ci0KLQlwcml2YXRlIEJ1dHRvbiBvdGhlckVuY29kaW5nQnV0dG9uOwotCi0JcHJpdmF0ZSBDb21ibyBlbmNvZGluZ0NvbWJvOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCi0JcHJpdmF0ZSBTdHJpbmcgb2xkU2VsZWN0ZWRFbmNvZGluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZW5jb2RpbmcgZmllbGQgZWRpdG9yIHdpdGggbm8gc2V0dGluZ3Mgc2V0LgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEVuY29kaW5nRmllbGRFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlbmNvZGluZyBmaWVsZCBlZGl0b3Igd2l0aCB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSBuYW1lLCBsYWJlbCBhbmQgcGFyZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHRoaXMgZmllbGQgZWRpdG9yIHdvcmtzIG9uCi0gICAgICogQHBhcmFtIGxhYmVsVGV4dCB0aGUgbGFiZWwgdGV4dCBvZiB0aGUgZmllbGQgZWRpdG9yCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG9mIHRoZSBmaWVsZCBlZGl0b3IncyBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RW5jb2RpbmdGaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsVGV4dCwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihuYW1lLCBsYWJlbFRleHQsIHBhcmVudCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvciNhZGp1c3RGb3JOdW1Db2x1bW5zKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGp1c3RGb3JOdW1Db2x1bW5zKGludCBudW1Db2x1bW5zKSB7Ci0JCSgoR3JpZERhdGEpIGdldENvbnRhaW5lcigpLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3IjZG9GaWxsSW50b0dyaWQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9GaWxsSW50b0dyaWQoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJY29udGFpbmVyID0gY3JlYXRlRW5jb2RpbmdHcm91cChwYXJlbnQsIG51bUNvbHVtbnMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3IjZG9Mb2FkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0xvYWQoKSB7Ci0JCWlmIChlbmNvZGluZ0NvbWJvICE9IG51bGwpIHsKLQkJCUxpc3QgZW5jb2RpbmdzID0gSURFRW5jb2RpbmcuZ2V0SURFRW5jb2RpbmdzKCk7Ci0JCQlTdHJpbmcgcmVzb3VyY2VQcmVmZXJlbmNlID0gZ2V0U3RvcmVkVmFsdWUoKTsKLQkJCXBvcHVsYXRlRW5jb2RpbmdzQ29tYm8oZW5jb2RpbmdzLCByZXNvdXJjZVByZWZlcmVuY2UpOwotCQkJdXBkYXRlRW5jb2RpbmdTdGF0ZShyZXNvdXJjZVByZWZlcmVuY2UgPT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IGlzIGN1cnJlbnRseSBzdG9yZWQgZm9yIHRoZSBlbmNvZGluZy4KLSAgICAgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50bHkgc3RvcmVkIGVuY29kaW5nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRTdG9yZWRWYWx1ZSgpOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvciNkb0xvYWREZWZhdWx0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0xvYWREZWZhdWx0KCkgewotCQl1cGRhdGVFbmNvZGluZ1N0YXRlKHRydWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3IjZ2V0TnVtYmVyT2ZDb250cm9scygpCi0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkNvbnRyb2xzKCkgewotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yI2lzVmFsaWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBpc1ZhbGlkOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3IjcmVmcmVzaFZhbGlkU3RhdGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWYWxpZFN0YXRlKCkgewotCQl1cGRhdGVWYWxpZFN0YXRlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvciNzZXRQcmVmZXJlbmNlU3RvcmUob3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VTdG9yZShJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCXN1cGVyLnNldFByZWZlcmVuY2VTdG9yZShzdG9yZSk7Ci0JCWRlZmF1bHRFbmMgPSBzdG9yZS5nZXREZWZhdWx0U3RyaW5nKGdldFByZWZlcmVuY2VOYW1lKCkpOwotCQl1cGRhdGVEZWZhdWx0RW5jb2RpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRGVmYXVsdEVuY29kaW5nKCkgewotCQlkZWZhdWx0RW5jb2RpbmdCdXR0b24uc2V0VGV4dChkZWZhdWx0QnV0dG9uVGV4dCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSB3aXRoIGFsbCB0aGUgZW5jb2RpbmcgY29udHJvbHMuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotICAgICAqIDwvcD4KLSAgICAgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgd2lkZ2V0Ci0JICogQHBhcmFtIG51bUNvbHVtbnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBwYXJlbnQKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVFbmNvZGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0KLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlncm91cC5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaFByZWZlcmVuY2VfZW5jb2RpbmcpOwotCQlncm91cC5zZXRGb250KGZvbnQpOwotCi0JCVNlbGVjdGlvbkFkYXB0ZXIgYnV0dG9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVFbmNvZGluZ1N0YXRlKGRlZmF1bHRFbmNvZGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdXBkYXRlVmFsaWRTdGF0ZSgpOwotCQkJfQotCQl9OwotCi0JCWRlZmF1bHRFbmNvZGluZ0J1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCWRlZmF1bHRFbmMgPSBmaW5kRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWRlZmF1bHRFbmNvZGluZ0J1dHRvbi5zZXRUZXh0KGRlZmF1bHRCdXR0b25UZXh0KCkpOyAKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGVmYXVsdEVuY29kaW5nQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRlZmF1bHRFbmNvZGluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidXR0b25MaXN0ZW5lcik7Ci0JCWRlZmF1bHRFbmNvZGluZ0J1dHRvbi5zZXRGb250KGZvbnQpOwotCi0JCW90aGVyRW5jb2RpbmdCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQlvdGhlckVuY29kaW5nQnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoUHJlZmVyZW5jZV9vdGhlckVuY29kaW5nKTsKLQkJb3RoZXJFbmNvZGluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidXR0b25MaXN0ZW5lcik7Ci0JCW90aGVyRW5jb2RpbmdCdXR0b24uc2V0Rm9udChmb250KTsKLQotCQllbmNvZGluZ0NvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZW5jb2RpbmdDb21iby5zZXRGb250KGZvbnQpOwotCQllbmNvZGluZ0NvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWVuY29kaW5nQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmFsaWRTdGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJZW5jb2RpbmdDb21iby5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyI2tleVJlbGVhc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQl1cGRhdGVWYWxpZFN0YXRlKCk7Ci0JCQl9Ci0JCX0pOwotCi0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoZSBvYmplY3QgYmVpbmcgc2hvd24uCi0gICAgICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhlIG9iamVjdCBiZWluZyBzaG93bgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmluZERlZmF1bHRFbmNvZGluZygpIHsKLQkJcmV0dXJuIFdvcmtiZW5jaEVuY29kaW5nLmdldFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBkZWZhdWx0IGVuY29kaW5nIGJ1dHRvbi4KLSAgICAgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGZvciB0aGUgZGVmYXVsdCBlbmNvZGluZyBidXR0b24gCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0QnV0dG9uVGV4dCgpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaFByZWZlcmVuY2VfZGVmYXVsdEVuY29kaW5nLCBkZWZhdWx0RW5jKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGVuY29kaW5ncyBjb21iby4gU2V0cyB0aGUgdGV4dCBiYXNlZCBvbiB0aGUKLQkgKiBzZWxlY3RlZCBlbmNvZGluZy4gSWYgdGhlcmUgaXMgbm8gc2VsZWN0ZWQgZW5jb2RpbmcsIHRoZSB0ZXh0IGlzIHNldCB0byB0aGUgZGVmYXVsdCBlbmNvZGluZy4KLSAgICAgKiAKLQkgKiBAcGFyYW0gZW5jb2RpbmdzIHRoZSBsaXN0IG9mIGVuY29kaW5ncyAobGlzdCBvZiBTdHJpbmcpCi0JICogQHBhcmFtIHNlbGVjdGVkRW5jb2RpbmcgdGhlIHNlbGVjdGVkIGVuY29kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUVuY29kaW5nc0NvbWJvKExpc3QgZW5jb2RpbmdzLCBTdHJpbmcgc2VsZWN0ZWRFbmNvZGluZykgewotCQlTdHJpbmdbXSBlbmNvZGluZ1N0cmluZ3MgPSBuZXcgU3RyaW5nW2VuY29kaW5ncy5zaXplKCldOwotCQllbmNvZGluZ3MudG9BcnJheShlbmNvZGluZ1N0cmluZ3MpOwotCQllbmNvZGluZ0NvbWJvLnNldEl0ZW1zKGVuY29kaW5nU3RyaW5ncyk7Ci0KLQkJaWYgKHNlbGVjdGVkRW5jb2RpbmcgPT0gbnVsbCkKLQkJCWVuY29kaW5nQ29tYm8uc2V0VGV4dChnZXREZWZhdWx0RW5jKCkpOwotCQllbHNlCi0JCQllbmNvZGluZ0NvbWJvLnNldFRleHQoc2VsZWN0ZWRFbmNvZGluZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVuY29kaW5nU3RhdGUoYm9vbGVhbiB1c2VEZWZhdWx0KSB7Ci0JCWRlZmF1bHRFbmNvZGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24odXNlRGVmYXVsdCk7Ci0JCW90aGVyRW5jb2RpbmdCdXR0b24uc2V0U2VsZWN0aW9uKCF1c2VEZWZhdWx0KTsKLQkJaWYodXNlRGVmYXVsdCkKLQkJCWVuY29kaW5nQ29tYm8uc2V0VGV4dChnZXREZWZhdWx0RW5jKCkpOwotCQllbmNvZGluZ0NvbWJvLnNldEVuYWJsZWQoIXVzZURlZmF1bHQpOwotCQl1cGRhdGVWYWxpZFN0YXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVZhbGlkU3RhdGUoKSB7Ci0JCWJvb2xlYW4gaXNWYWxpZE5vdyA9IGlzRW5jb2RpbmdWYWxpZCgpOwotCQlpZiAoaXNWYWxpZE5vdyAhPSBpc1ZhbGlkKSB7Ci0JCQlpc1ZhbGlkID0gaXNWYWxpZE5vdzsKLQkJCWlmIChpc1ZhbGlkKSB7Ci0JCQkJY2xlYXJFcnJvck1lc3NhZ2UoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2hvd0Vycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hQcmVmZXJlbmNlX3Vuc3VwcG9ydGVkRW5jb2RpbmcpOwotCQkJfQotCQkJZmlyZVN0YXRlQ2hhbmdlZChJU19WQUxJRCwgIWlzVmFsaWQsIGlzVmFsaWQpOwotCi0JCQlTdHJpbmcgbmV3VmFsdWUgPSBnZXRTZWxlY3RlZEVuY29kaW5nKCk7Ci0JCQlpZiAoaXNWYWxpZCAmJiAhbmV3VmFsdWUuZXF1YWxzKG9sZFNlbGVjdGVkRW5jb2RpbmcpKSB7Ci0JCQkJZmlyZVZhbHVlQ2hhbmdlZChWQUxVRSwgb2xkU2VsZWN0ZWRFbmNvZGluZywgbmV3VmFsdWUpOwotCQkJCW9sZFNlbGVjdGVkRW5jb2RpbmcgPSBuZXdWYWx1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbmNvZGluZy4KLSAgICAgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZW5jb2RpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkRW5jb2RpbmcoKSB7Ci0JCWlmIChkZWZhdWx0RW5jb2RpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJldHVybiBkZWZhdWx0RW5jOwotCQl9Ci0JCXJldHVybiBlbmNvZGluZ0NvbWJvLmdldFRleHQoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmNvZGluZ1ZhbGlkKCkgewotCQlyZXR1cm4gZGVmYXVsdEVuY29kaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IGlzVmFsaWRFbmNvZGluZyhlbmNvZGluZ0NvbWJvLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gZW5jb2RpbmcgaXMgdmFsaWQuCi0gICAgICogCi0JICogQHBhcmFtIGVuYyB0aGUgZW5jb2RpbmcgdG8gdmFsaWRhdGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbmNvZGluZyBpcyB2YWxpZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkRW5jb2RpbmcoU3RyaW5nIGVuYykgewotCQl0cnkgewotCQkJcmV0dXJuIENoYXJzZXQuaXNTdXBwb3J0ZWQoZW5jKTsKLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vVGhpcyBpcyBhIHZhbGlkIGV4Y2VwdGlvbgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgZW5jb2RpbmcuCi0gICAgICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBlbmNvZGluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEVuYygpIHsKLQkJcmV0dXJuIGRlZmF1bHRFbmM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZW5jb2Rpbmcgc2V0dGluZyBjaGFuZ2VkLgotICAgICAqIAotCSAqIEBwYXJhbSBlbmNvZGluZ1NldHRpbmcgdGhlIHNldHRpbmcgZnJvbSB0aGUgcGFnZS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc291cmNlIGVuY29kaW5nCi0JICogICBpcyB0aGUgc2FtZSBhcyBiZWZvcmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzU2FtZUVuY29kaW5nKFN0cmluZyBlbmNvZGluZ1NldHRpbmcpIHsKLQotCQlTdHJpbmcgY3VycmVudCA9IGdldFN0b3JlZFZhbHVlKCk7Ci0KLQkJaWYgKGVuY29kaW5nU2V0dGluZyA9PSBudWxsKSB7Ci0JCQkvL0NoYW5nZWQgaWYgZGVmYXVsdCBpcyBzZWxlY3RlZCBhbmQgdGhlcmUgaXMgbm8gc2V0dGluZwotCQkJcmV0dXJuIGN1cnJlbnQgPT0gbnVsbCB8fCBjdXJyZW50Lmxlbmd0aCgpID09IDA7Ci0JCX0KLQkJcmV0dXJuIGVuY29kaW5nU2V0dGluZy5lcXVhbHMoY3VycmVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBkZWZhdWx0IGhhcyBiZWVuIHNlbGVjdGVkLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRlZmF1bHQgYnV0dG9uIGhhcyBiZWVuCi0JICogc2VsZWN0ZWQuCi0JICovCi0JYm9vbGVhbiBpc0RlZmF1bHRTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRFbmNvZGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvZGlhbG9ncy9FbmNvZGluZ0ZpZWxkRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaWRlL2RpYWxvZ3MvRW5jb2RpbmdGaWVsZEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzM1MzA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvZGlhbG9ncy9FbmNvZGluZ0ZpZWxkRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFRW5jb2Rpbmc7Ci0KLS8qKgotICogVGhlIEVuY29kaW5nRmllbGRFZGl0b3IgaXMgYSBmaWVsZCBlZGl0b3IgdGhhdCBhbGxvd3MgdGhlIAotICogdXNlciB0byBzZXQgYW4gZW5jb2Rpbmcgb24gYSBwcmVmZXJlbmNlIGluIGEgcHJlZmVyZW5jZQotICogc3RvcmUuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVuY29kaW5nRmllbGRFZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdEVuY29kaW5nRmllbGRFZGl0b3IgewotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciBvbiB0aGUgcHJlZmVyZW5jZSBjYWxsZWQgbmFtZQotCSAqIHdpdGggYSBsYWJlbCBvZiBsYWJlbFRleHQuCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBFbmNvZGluZ0ZpZWxkRWRpdG9yKFN0cmluZyBuYW1lLCBTdHJpbmcgbGFiZWxUZXh0LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKG5hbWUsIGxhYmVsVGV4dCwgcGFyZW50KTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuQWJzdHJhY3RFbmNvZGluZ0ZpZWxkRWRpdG9yI2dldFN0b3JlZFZhbHVlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0b3JlZFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGdldFByZWZlcmVuY2VOYW1lKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yI2RvU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU3RvcmUoKSB7Ci0JCVN0cmluZyBlbmNvZGluZyA9IGdldFNlbGVjdGVkRW5jb2RpbmcoKTsKLQkJCi0JCWlmKGhhc1NhbWVFbmNvZGluZyhlbmNvZGluZykpCi0JCQlyZXR1cm47Ci0JCQotCQlJREVFbmNvZGluZy5hZGRJREVFbmNvZGluZyhlbmNvZGluZyk7CQotCQkKLQkJaWYgKGVuY29kaW5nLmVxdWFscyhnZXREZWZhdWx0RW5jKCkpKSB7Ci0JCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRUb0RlZmF1bHQoZ2V0UHJlZmVyZW5jZU5hbWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShnZXRQcmVmZXJlbmNlTmFtZSgpLCBlbmNvZGluZyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvZGlhbG9ncy9QYXRoVmFyaWFibGVTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvZGlhbG9ncy9QYXRoVmFyaWFibGVTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzNTdkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaWRlL2RpYWxvZ3MvUGF0aFZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuRmlsZUZvbGRlclNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5JREVSZXNvdXJjZUluZm9VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5QYXRoVmFyaWFibGVzR3JvdXA7Ci0KLS8qKgotICogQSBzZWxlY3Rpb24gZGlhbG9nIHdoaWNoIHNob3dzIHRoZSBwYXRoIHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSAKLSAqIHdvcmtzcGFjZS4KLSAqIFRoZSA8Y29kZT5nZXRSZXN1bHQ8L2NvZGU+IG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lKHMpIG9mIHRoZSAKLSAqIHNlbGVjdGVkIHBhdGggdmFyaWFibGUocykuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEV4YW1wbGU6Ci0gKiA8cHJlPgotICogIFBhdGhWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPQotICogICAgbmV3IFBhdGhWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBJUmVzb3VyY2UuRk9MREVSKTsKLSAqCWRpYWxvZy5vcGVuKCk7Ci0gKglTdHJpbmdbXSByZXN1bHQgPSAoU3RyaW5nW10pIGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAqIDwvcHJlPiAJCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBhdGhWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIFNlbGVjdGlvbkRpYWxvZyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYVEVORF9JRCA9IElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMTsKLQotICAgIHByaXZhdGUgUGF0aFZhcmlhYmxlc0dyb3VwIHBhdGhWYXJpYWJsZXNHcm91cDsKLQotICAgIHByaXZhdGUgaW50IHZhcmlhYmxlVHlwZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwYXRoIHZhcmlhYmxlIHNlbGVjdGlvbiBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhlIHBhcmVudCBzaGVsbAotICAgICAqIEBwYXJhbSB2YXJpYWJsZVR5cGUgdGhlIHR5cGUgb2YgdmFyaWFibGVzIHRoYXQgYXJlIGRpc3BsYXllZCBpbiAKLSAgICAgKiAJdGhpcyBkaWFsb2cuIDxjb2RlPklSZXNvdXJjZS5GSUxFPC9jb2RlPiBhbmQvb3IgPGNvZGU+SVJlc291cmNlLkZPTERFUjwvY29kZT4KLSAgICAgKiAJbG9naWNhbGx5IE9SZWQgdG9nZXRoZXIuCi0gICAgICovCi0gICAgcHVibGljIFBhdGhWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgaW50IHZhcmlhYmxlVHlwZSkgewotICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgICAgIHNldFRpdGxlKElERVdvcmtiZW5jaE1lc3NhZ2VzLlBhdGhWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZ190aXRsZSk7Ci0gICAgICAgIHRoaXMudmFyaWFibGVUeXBlID0gdmFyaWFibGVUeXBlOwotICAgICAgICBwYXRoVmFyaWFibGVzR3JvdXAgPSBuZXcgUGF0aFZhcmlhYmxlc0dyb3VwKGZhbHNlLCB2YXJpYWJsZVR5cGUsCi0gICAgICAgICAgICAgICAgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRXh0ZW5kQnV0dG9uU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjYnV0dG9uUHJlc3NlZChpbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLSAgICAgICAgaWYgKGJ1dHRvbklkID09IEVYVEVORF9JRCkgewotICAgICAgICAgICAgRmlsZUZvbGRlclNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZUZvbGRlclNlbGVjdGlvbkRpYWxvZygKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSwgZmFsc2UsIHZhcmlhYmxlVHlwZSk7Ci0gICAgICAgICAgICBQYXRoVmFyaWFibGVzR3JvdXAuUGF0aFZhcmlhYmxlRWxlbWVudCBzZWxlY3Rpb24gPSBwYXRoVmFyaWFibGVzR3JvdXAKLSAgICAgICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpWzBdOwotICAgICAgICAgICAgZGlhbG9nLnNldFRpdGxlKElERVdvcmtiZW5jaE1lc3NhZ2VzLlBhdGhWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZ19FeHRlbnNpb25EaWFsb2dfdGl0bGUpOwotICAgICAgICAgICAgZGlhbG9nLnNldE1lc3NhZ2UoTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuUGF0aFZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nX0V4dGVuc2lvbkRpYWxvZ19kZXNjcmlwdGlvbiwgc2VsZWN0aW9uLm5hbWUpKTsKLSAgICAgICAgICAgIGRpYWxvZy5zZXRJbnB1dChzZWxlY3Rpb24ucGF0aC50b0ZpbGUoKSk7Ci0gICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0sKLSAgICAgICAgICAgICAgICAgICAgJiYgcGF0aFZhcmlhYmxlc0dyb3VwLnBlcmZvcm1PaygpKSB7Ci0gICAgICAgICAgICAgICAgc2V0RXh0ZW5zaW9uUmVzdWx0KHNlbGVjdGlvbiwgKElGaWxlU3RvcmUpIGRpYWxvZy5nZXRSZXN1bHQoKVswXSk7Ci0gICAgICAgICAgICAgICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2hlbGwsCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLlBBVEhfVkFSSUFCTEVfU0VMRUNUSU9OX0RJQUxPRyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIEVYVEVORF9JRCwgSURFV29ya2JlbmNoTWVzc2FnZXMuUGF0aFZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nX2V4dGVuZEJ1dHRvbiwgZmFsc2UpOwotICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLSAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotICAgICAgICB1cGRhdGVFeHRlbmRCdXR0b25TdGF0ZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBjcmVhdGUgY29tcG9zaXRlIAotICAgICAgICBDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotICAgICAgICBwYXRoVmFyaWFibGVzR3JvdXAuY3JlYXRlQ29udGVudHMoZGlhbG9nQXJlYSk7Ci0gICAgICAgIHJldHVybiBkaWFsb2dBcmVhOwotICAgIH0KLQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY2xvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotICAgICAgICBwYXRoVmFyaWFibGVzR3JvdXAuZGlzcG9zZSgpOwotICAgICAgICByZXR1cm4gc3VwZXIuY2xvc2UoKTsKLSAgICB9Ci0KLSAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCS8vU2V0cyB0aGUgZGlhbG9nIHJlc3VsdCB0byB0aGUgc2VsZWN0ZWQgcGF0aCB2YXJpYWJsZSBuYW1lKHMpLiAKLSAgICAgICAgaWYgKHBhdGhWYXJpYWJsZXNHcm91cC5wZXJmb3JtT2soKSkgewotICAgICAgICAgICAgUGF0aFZhcmlhYmxlc0dyb3VwLlBhdGhWYXJpYWJsZUVsZW1lbnRbXSBzZWxlY3Rpb24gPSBwYXRoVmFyaWFibGVzR3JvdXAKLSAgICAgICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgU3RyaW5nW10gdmFyaWFibGVOYW1lcyA9IG5ldyBTdHJpbmdbc2VsZWN0aW9uLmxlbmd0aF07Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZXNbaV0gPSBzZWxlY3Rpb25baV0ubmFtZTsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvblJlc3VsdCh2YXJpYWJsZU5hbWVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvblJlc3VsdChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkaWFsb2cgcmVzdWx0IHRvIHRoZSBjb25jYXRlbmF0ZWQgdmFyaWFibGUgbmFtZSBhbmQgZXh0ZW5zaW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YXJpYWJsZSB2YXJpYWJsZSBzZWxlY3RlZCBpbiB0aGUgdmFyaWFibGVzIGxpc3QgYW5kIGV4dGVuZGVkCi0gICAgICogCWJ5IDxjb2RlPmV4dGVuc2lvbkZpbGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIGV4dGVuc2lvbkZpbGUgZmlsZSBzZWxlY3RlZCB0byBleHRlbmQgdGhlIHZhcmlhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRFeHRlbnNpb25SZXN1bHQoCi0gICAgICAgICAgICBQYXRoVmFyaWFibGVzR3JvdXAuUGF0aFZhcmlhYmxlRWxlbWVudCB2YXJpYWJsZSwgSUZpbGVTdG9yZSBleHRlbnNpb25GaWxlKSB7Ci0gICAgICAgIElQYXRoIGV4dGVuc2lvblBhdGggPSBuZXcgUGF0aChleHRlbnNpb25GaWxlLnRvU3RyaW5nKCkpOwotICAgICAgICBpbnQgbWF0Y2hDb3VudCA9IGV4dGVuc2lvblBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHZhcmlhYmxlLnBhdGgpOwotICAgICAgICBJUGF0aCByZXN1bHRQYXRoID0gbmV3IFBhdGgodmFyaWFibGUubmFtZSk7Ci0KLSAgICAgICAgZXh0ZW5zaW9uUGF0aCA9IGV4dGVuc2lvblBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhtYXRjaENvdW50KTsKLSAgICAgICAgcmVzdWx0UGF0aCA9IHJlc3VsdFBhdGguYXBwZW5kKGV4dGVuc2lvblBhdGgpOwotICAgICAgICBzZXRTZWxlY3Rpb25SZXN1bHQobmV3IFN0cmluZ1tdIHsgcmVzdWx0UGF0aC50b09TU3RyaW5nKCkgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgRXh0ZW5kIGJ1dHRvbiBiYXNlZCBvbiB0aGUgCi0gICAgICogY3VycmVudCB2YXJpYWJsZSBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUV4dGVuZEJ1dHRvblN0YXRlKCkgewotICAgICAgICBQYXRoVmFyaWFibGVzR3JvdXAuUGF0aFZhcmlhYmxlRWxlbWVudFtdIHNlbGVjdGlvbiA9IHBhdGhWYXJpYWJsZXNHcm91cAotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgQnV0dG9uIGV4dGVuZEJ1dHRvbiA9IGdldEJ1dHRvbihFWFRFTkRfSUQpOwotCi0gICAgICAgIGlmIChleHRlbmRCdXR0b24gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgSUZpbGVJbmZvIGluZm8gPSBJREVSZXNvdXJjZUluZm9VdGlscy5nZXRGaWxlSW5mbyhzZWxlY3Rpb25bMF0ucGF0aCk7Ci0gICAgICAgICAgICBpZiAoaW5mby5leGlzdHMoKSAmJiBpbmZvLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICAJZXh0ZW5kQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZXh0ZW5kQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGV4dGVuZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvZGlhbG9ncy9SZXNvdXJjZUVuY29kaW5nRmllbGRFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvZGlhbG9ncy9SZXNvdXJjZUVuY29kaW5nRmllbGRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2NjZiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaWRlL2RpYWxvZ3MvUmVzb3VyY2VFbmNvZGluZ0ZpZWxkRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRW5jb2Rpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERUVuY29kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotCi0vKioKLSAqIFRoZSBSZXNvdXJjZUVuY29kaW5nRmllbGRFZGl0b3IgaXMgYSBmaWVsZCBlZGl0b3IgZm9yIGVkaXRpbmcgdGhlIGVuY29kaW5nIG9mCi0gKiBhIHJlc291cmNlIGFuZCBkb2VzIG5vdCB1c2UgYSBwcmVmZXJlbmNlIHN0b3JlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZUVuY29kaW5nRmllbGRFZGl0b3IgZXh0ZW5kcwotCQlBYnN0cmFjdEVuY29kaW5nRmllbGRFZGl0b3IgewotCi0JLyoqCi0JICogVGhlIHJlc291cmNlIGJlaW5nIGVkaXRlZC4KLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSByZXNvdXJjZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZW5jb2RpbmcgZmllbGQgZWRpdG9yIGZvciBzZXR0aW5nIHRoZSBlbmNvZGluZyBvbiB0aGUgZ2l2ZW4KLQkgKiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICB0aGUgbGFiZWwgdGV4dCBvZiB0aGUgZmllbGQgZWRpdG9yCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvZiB0aGUgZmllbGQgZWRpdG9yJ3MgY29udHJvbAotCSAqIEBwYXJhbSBjaGFyc2V0UmVzb3VyY2UKLQkgKiAgICAgICAgICAgIG11c3QgYmUgYW4gPGNvZGU+SUNvbnRhaW5lcjwvY29kZT4gb3IgYW4gPGNvZGU+SUZpbGU8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lciNnZXREZWZhdWx0Q2hhcnNldCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSNnZXRDaGFyc2V0KCkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VFbmNvZGluZ0ZpZWxkRWRpdG9yKFN0cmluZyBsYWJlbFRleHQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlJUmVzb3VyY2UgY2hhcnNldFJlc291cmNlKSB7Ci0JCXN1cGVyKCk7Ci0JCUFzc2VydC5pc1RydWUoY2hhcnNldFJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcgotCQkJCXx8IGNoYXJzZXRSZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKTsKLQkJc2V0TGFiZWxUZXh0KGxhYmVsVGV4dCk7Ci0JCXRoaXMucmVzb3VyY2UgPSBjaGFyc2V0UmVzb3VyY2U7Ci0JCWNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLkFic3RyYWN0RW5jb2RpbmdGaWVsZEVkaXRvciNnZXRTdG9yZWRWYWx1ZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdG9yZWRWYWx1ZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpCi0JCQkJcmV0dXJuICgoSUNvbnRhaW5lcikgcmVzb3VyY2UpLmdldERlZmF1bHRDaGFyc2V0KGZhbHNlKTsKLQkJCXJldHVybiAoKElGaWxlKSByZXNvdXJjZSkuZ2V0Q2hhcnNldChmYWxzZSk7Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ly8gSWYgdGhlcmUgaXMgYW4gZXJyb3IgcmV0dXJuIHRoZSBkZWZhdWx0Ci0JCQlJREVXb3JrYmVuY2hQbHVnaW4KLQkJCQkJLmxvZygKLQkJCQkJCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUVuY29kaW5nRmllbGRFZGl0b3JfRXJyb3JMb2FkaW5nTWVzc2FnZSwKLQkJCQkJCQllLmdldFN0YXR1cygpKTsKLQkJCXJldHVybiBXb3JrYmVuY2hFbmNvZGluZy5nZXRXb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmcoKTsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yI2RvU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU3RvcmUoKSB7Ci0KLQkJU3RyaW5nIGVuY29kaW5nID0gZ2V0U2VsZWN0ZWRFbmNvZGluZygpOwotCi0JCS8vIENsZWFyIHRoZSB2YWx1ZSBpZiBub3RoaW5nIGlzIHNlbGVjdGVkCi0JCWlmIChpc0RlZmF1bHRTZWxlY3RlZCgpKQotCQkJZW5jb2RpbmcgPSBudWxsOwotCQkvLyBEb24ndCB1cGRhdGUgaWYgdGhlIHNhbWUgdGhpbmcgaXMgc2VsZWN0ZWQKLQkJaWYgKGhhc1NhbWVFbmNvZGluZyhlbmNvZGluZykpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uQ2hhcnNldCA9IGdldENoYXJzZXRGcm9tRGVzY3JpcHRpb24oKTsKLQkJaWYgKGRlc2NyaXB0aW9uQ2hhcnNldCAhPSBudWxsCi0JCQkJJiYgIShkZXNjcmlwdGlvbkNoYXJzZXQuZXF1YWxzKGVuY29kaW5nKSkgJiYgZW5jb2RpbmcgIT0gbnVsbCkgewotCQkJU2hlbGwgc2hlbGwgPSBudWxsOwotCQkJRGlhbG9nUGFnZSBwYWdlID0gZ2V0UGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkKLQkJCQlzaGVsbCA9IHBhZ2UuZ2V0U2hlbGwoKTsKLQotCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZygKLQkJCQkJc2hlbGwsCi0JCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlRW5jb2RpbmdGaWVsZEVkaXRvcl9FbmNvZGluZ0NvbmZsaWN0VGl0bGUsCi0JCQkJCW51bGwsCi0JCQkJCU5MUwotCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VFbmNvZGluZ0ZpZWxkRWRpdG9yX0VuY29kaW5nQ29uZmxpY3RNZXNzYWdlLAotCQkJCQkJCQkJZW5jb2RpbmcsIGRlc2NyaXB0aW9uQ2hhcnNldCksCi0JCQkJCU1lc3NhZ2VEaWFsb2cuV0FSTklORywgbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMIH0sIDApOyAvLyB5ZXMgaXMgdGhlCi0JCQkJCQkJCQkJCQkJCQkJLy8gZGVmYXVsdAotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPiAwKQotCQkJCXJldHVybjsKLQkJfQotCi0JCUlERUVuY29kaW5nLmFkZElERUVuY29kaW5nKGVuY29kaW5nKTsKLQotCQlmaW5hbCBTdHJpbmcgZmluYWxFbmNvZGluZyA9IGVuY29kaW5nOwotCi0JCUpvYiBjaGFyc2V0Sm9iID0gbmV3IEpvYihJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVFbmNvZGluZ19FbmNvZGluZ0pvYikgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCQkJICovCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLQkJCQkJCSgoSUNvbnRhaW5lcikgcmVzb3VyY2UpLnNldERlZmF1bHRDaGFyc2V0KAotCQkJCQkJCQlmaW5hbEVuY29kaW5nLCBtb25pdG9yKTsKLQkJCQkJZWxzZQotCQkJCQkJKChJRmlsZSkgcmVzb3VyY2UpLnNldENoYXJzZXQoZmluYWxFbmNvZGluZywgbW9uaXRvcik7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgey8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHJldHVybiB0aGUKLQkJCQkJCQkJCQkJLy8gZGVmYXVsdAotCQkJCQlJREVXb3JrYmVuY2hQbHVnaW4KLQkJCQkJCQkubG9nKAotCQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VFbmNvZGluZ0ZpZWxkRWRpdG9yX0Vycm9yU3RvcmluZ01lc3NhZ2UsCi0JCQkJCQkJCQllLmdldFN0YXR1cygpKTsKLQkJCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCWNoYXJzZXRKb2Iuc2NoZWR1bGUoKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvciNzdG9yZSgpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcmUoKSB7Ly8gT3ZlcnJpZGUgdGhlIHN0b3JlIG1ldGhvZCBhcyB3ZSBhcmUgbm90IHVzaW5nIGEKLQkJCQkJCQkvLyBwcmVmZXJlbmNlIHN0b3JlCi0JCWRvU3RvcmUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3IjbG9hZCgpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZCgpIHsvLyBPdmVycmlkZSB0aGUgbG9hZCBtZXRob2QgYXMgd2UgYXJlIG5vdCB1c2luZyBhCi0JCQkJCQkvLyBwcmVmZXJlbmNlIHN0b3JlCi0JCXNldFByZXNlbnRzRGVmYXVsdFZhbHVlKGZhbHNlKTsKLQkJZG9Mb2FkKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yI2xvYWREZWZhdWx0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRGVmYXVsdCgpIHsKLQkJc2V0UHJlc2VudHNEZWZhdWx0VmFsdWUodHJ1ZSk7Ci0JCWRvTG9hZERlZmF1bHQoKTsKLQkJcmVmcmVzaFZhbGlkU3RhdGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmlkZS5kaWFsb2dzLkFic3RyYWN0RW5jb2RpbmdGaWVsZEVkaXRvciNmaW5kRGVmYXVsdEVuY29kaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbmREZWZhdWx0RW5jb2RpbmcoKSB7Ci0KLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVdvcmtzcGFjZVJvb3QpCi0JCQlyZXR1cm4gc3VwZXIuZmluZERlZmF1bHRFbmNvZGluZygpOwotCi0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IGdldENoYXJzZXRGcm9tRGVzY3JpcHRpb24oKTsKLQkJZGVmYXVsdENoYXJzZXQgPSBnZXRDaGFyc2V0RnJvbURlc2NyaXB0aW9uKCk7Ci0KLQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwgJiYgZGVmYXVsdENoYXJzZXQubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIGRlZmF1bHRDaGFyc2V0OwotCQl0cnkgewotCQkJLy8gUXVlcnkgdXAgdGhlIHdob2xlIGhpZXJhcmNoeQotCQkJZGVmYXVsdENoYXJzZXQgPSByZXNvdXJjZS5nZXRQYXJlbnQoKS5nZXREZWZhdWx0Q2hhcnNldCh0cnVlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIElmIHRoZXJlIGlzIGFuIGV4Y2VwdGlvbiB0cnkgYWdhaW4KLQkJfQotCi0JCWlmIChkZWZhdWx0Q2hhcnNldCAhPSBudWxsICYmIGRlZmF1bHRDaGFyc2V0Lmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBkZWZhdWx0Q2hhcnNldDsKLQotCQlyZXR1cm4gc3VwZXIuZmluZERlZmF1bHRFbmNvZGluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJzZXQgZnJvbSB0aGUgY29udGVudCBkZXNjcmlwdGlvbiBpZiB0aGVyZSBpcyBvbmUuCi0JICogCi0JICogQHJldHVybiB0aGUgY2hhcnNldCBmcm9tIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENoYXJzZXRGcm9tRGVzY3JpcHRpb24oKSB7Ci0JCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBnZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZGVzY3JpcHRpb24uZ2V0Q2hhcnNldCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmlkZS5kaWFsb2dzLkFic3RyYWN0RW5jb2RpbmdGaWVsZEVkaXRvciNkZWZhdWx0QnV0dG9uVGV4dCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0QnV0dG9uVGV4dCgpIHsKLQotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkKLQkJCXJldHVybiBzdXBlci5kZWZhdWx0QnV0dG9uVGV4dCgpOwotCi0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQl0cnkgewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoKElGaWxlKSByZXNvdXJjZSkKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkvLyBJZiB3ZSBjYW4gZmluZCBhIGNoYXJzZXQgZnJvbSB0aGUgZGVzY3JpcHRpb24gdGhlbiBkZXJpdmUKLQkJCQkvLyBmcm9tIHRoYXQKLQkJCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCB8fCBkZXNjcmlwdGlvbi5nZXRDaGFyc2V0KCkgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIE5MUwotCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VJbmZvX2ZpbGVDb250YWluZXJFbmNvZGluZ0Zvcm1hdCwKLQkJCQkJCQkJCWdldERlZmF1bHRFbmMoKSk7Ci0KLQkJCQlyZXR1cm4gTkxTCi0JCQkJCQkuYmluZCgKLQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VJbmZvX2ZpbGVDb250ZW50RW5jb2RpbmdGb3JtYXQsCi0JCQkJCQkJCWdldERlZmF1bHRFbmMoKSk7Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJLy8gRG8gbm90aGluZyBoZXJlIGFzIHdlIHdpbGwganVzdCB0cnkgdG8gZGVyaXZlIGZyb20gdGhlCi0JCQkJLy8gY29udGFpbmVyCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VJbmZvX2NvbnRhaW5lckVuY29kaW5nRm9ybWF0LAotCQkJCWdldERlZmF1bHRFbmMoKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmlkZS5kaWFsb2dzLkFic3RyYWN0RW5jb2RpbmdGaWVsZEVkaXRvciNjcmVhdGVFbmNvZGluZ0dyb3VwKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUVuY29kaW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGdyb3VwID0gc3VwZXIuY3JlYXRlRW5jb2RpbmdHcm91cChwYXJlbnQsIG51bUNvbHVtbnMpOwotCQlTdHJpbmcgYnl0ZU9yZGVyTGFiZWwgPSBJREVFbmNvZGluZwotCQkJCS5nZXRCeXRlT3JkZXJNYXJrTGFiZWwoZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlpZiAoYnl0ZU9yZGVyTGFiZWwgIT0gbnVsbCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCWxhYmVsCi0JCQkJCS5zZXRUZXh0KE5MUwotCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoUHJlZmVyZW5jZV9lbmNvZGluZ19lbmNvZGluZ01lc3NhZ2UsCi0JCQkJCQkJCQlieXRlT3JkZXJMYWJlbCkpOwotCQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHVtbnMgKyAxOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQotCQl9Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIG9mIHRoZSByZXNvdXJjZSBpZiBpdCBpcyBhIGZpbGUgYW5kIGl0Ci0JICogaGFzIGEgY29udGVudCBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHJlc291cmNlIGlzIG5vdAotCSAqICAgICAgICAgYW4gPGNvZGU+SUZpbGU8L2NvZGU+IG9yIGl0IGRvZXMgbm90IGhhdmUgYSBkZXNjcmlwdGlvbgotCSAqLwotCXByaXZhdGUgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXRDb250ZW50RGVzY3JpcHRpb24oKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLQkJCQlyZXR1cm4gKCgoSUZpbGUpIHJlc291cmNlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvLyBJZiB3ZSBjYW5ub3QgZmluZCBpdCByZXR1cm4gbnVsbAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2lkZS9kaWFsb2dzL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvZGlhbG9ncy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NGY2OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2lkZS9kaWFsb2dzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLTxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTWljcm9zb2Z0IEZyb250UGFnZSA0LjAiPgotPG1ldGEgbmFtZT0iUHJvZ0lkIiBjb250ZW50PSJGcm9udFBhZ2UuRWRpdG9yLkRvY3VtZW50Ij4KLTx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLUFQSXMgZm9yIGRpYWxvZ3MgaW4gdGhlIElERS1zcGVjaWZpYyBwb3J0aW9uIG9mIHRoZSBFY2xpcHNlIFBsYXRmb3JtIFVzZXIgSW50ZXJmYWNlLiAKLTxoMj5QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotVGhpcyBwYWNrYWdlIGNvbnRhaW5zdGhlIGRpYWxvZyBBUElzIGZvciB0aGUgRWNsaXBzZSBQbGF0Zm9ybSBVc2VyIEludGVyZmFjZSB0aGF0IAotYXJlIElERSBzcGVjaWZpYy4gCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pZGUvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2lkZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDdlNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2lkZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci08bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1pY3Jvc29mdCBGcm9udFBhZ2UgNC4wIj4KLTxtZXRhIG5hbWU9IlByb2dJZCIgY29udGVudD0iRnJvbnRQYWdlLkVkaXRvci5Eb2N1bWVudCI+Ci08dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLUFQSXMgZm9yIHRoZSBJREUtc3BlY2lmaWMgcG9ydGlvbiBvZiB0aGUgRWNsaXBzZSBQbGF0Zm9ybSBVc2VyIEludGVyZmFjZS4KLTxoMj5QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotVGhpcyBwYWNrYWdlIGNvbnRhaW5zIEFQSXMgZm9yIHRoZSBFY2xpcHNlIFBsYXRmb3JtIFVzZXIgSW50ZXJmYWNlIHRoYXQgYXJlIElERQotc3BlY2lmaWMuCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9BYm91dEluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvQWJvdXRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MzczODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9BYm91dEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ2hlY2tlZElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklCdW5kbGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUJ1bmRsZUdyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuQnVuZGxlR3JvdXBQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlByb2R1Y3RQcm9wZXJ0aWVzOwotCi0vKioKLSAqIFRoZSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhpcyBvYmplY3QgaXMgb2J0YWluZWQgZnJvbSB0aGUgYWJvdXQgSU5JIGZpbGUuCi0gKiBUaGlzIGZpbGUgcmVzaWRlcyB3aXRoaW4gYW4gaW5zdGFsbCBjb25maWd1cmF0aW9ucyBkaXJlY3RvcnkgYW5kIG11c3QgYmUgYSAKLSAqIHN0YW5kYXJkIGphdmEgcHJvcGVydHkgZmlsZS4gIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQWJvdXRJbmZvIHsKLSAgICBwcml2YXRlIFByb2R1Y3RQcm9wZXJ0aWVzIHByb2R1Y3RQcm9wZXJ0aWVzOwotCi0gICAgcHJpdmF0ZSBCdW5kbGVHcm91cFByb3BlcnRpZXMgYnVuZGxlR3JvdXBQcm9wZXJ0aWVzOwotCi0gICAgcHJpdmF0ZSBMb25nIGZlYXR1cmVJbWFnZUNSQzsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYWxjdWxhdGVkSW1hZ2VDUkMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhpcyBpbmZvIHdpbGwgYXBwbHkgdG8gb25seSB0aGUgYXJndW1lbnQgcHJvZHVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJvdXRJbmZvKElQcm9kdWN0IHByb2R1Y3QpIHsKLSAgICAgICAgdGhpcy5wcm9kdWN0UHJvcGVydGllcyA9IG5ldyBQcm9kdWN0UHJvcGVydGllcyhwcm9kdWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGluZm8gb2JqZWN0IHdpbGwgYXBwbHkgdG8gdGhlIGFyZ3VtZW50IGJ1bmRsZSBncm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJvdXRJbmZvKElCdW5kbGVHcm91cCBidW5kbGVHcm91cCkgewotICAgICAgICB0aGlzLmJ1bmRsZUdyb3VwUHJvcGVydGllcyA9IG5ldyBCdW5kbGVHcm91cFByb3BlcnRpZXMoYnVuZGxlR3JvdXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBmZWF0dXJlIHdpdGggdGhlIGdpdmVuIGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmZWF0dXJlSWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIGlkCi0gICAgICogQHBhcmFtIHZlcnNpb25JZAotICAgICAqICAgICAgICAgICAgdGhlIHZlcnNpb24gaWQgKG9mIHRoZSBmZWF0dXJlKQotICAgICAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBmZWF0dXJlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBYm91dEluZm8gcmVhZEZlYXR1cmVJbmZvKFN0cmluZyBmZWF0dXJlSWQsIFN0cmluZyB2ZXJzaW9uSWQpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChmZWF0dXJlSWQpOwotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHZlcnNpb25JZCk7Ci0KLSAgICAgICAgLy8gZmlyc3Qgc2VlIGlmIHRoZSBpZCBtYXRjaGVzIHRoZSBwcm9kdWN0Ci0gICAgICAgIElQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0gICAgICAgIGlmIChwcm9kdWN0ICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBmZWF0dXJlSWQuZXF1YWxzKFByb2R1Y3RQcm9wZXJ0aWVzLmdldFByb2R1Y3RJZChwcm9kdWN0KSkpCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFib3V0SW5mbyhwcm9kdWN0KTsKLQotICAgICAgICAvLyB0aGVuIGNoZWNrIHRoZSBidW5kbGUgZ3JvdXBzCi0gICAgICAgIElCdW5kbGVHcm91cCBidW5kbGVHcm91cCA9IGdldEJ1bmRsZUdyb3VwKGZlYXR1cmVJZCwgdmVyc2lvbklkKTsKLSAgICAgICAgaWYgKGJ1bmRsZUdyb3VwICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFib3V0SW5mbyhidW5kbGVHcm91cCk7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUJ1bmRsZUdyb3VwIGdldEJ1bmRsZUdyb3VwKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb25JZCkgewotICAgICAgICBpZiAoaWQgPT0gbnVsbCB8fCB2ZXJzaW9uSWQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIElCdW5kbGVHcm91cFByb3ZpZGVyW10gcHJvdmlkZXJzID0gUGxhdGZvcm0uZ2V0QnVuZGxlR3JvdXBQcm92aWRlcnMoKTsKLSAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBwcm92aWRlcnMubGVuZ3RoOyArK3ApIHsKLSAgICAgICAgICAgIElCdW5kbGVHcm91cFtdIGdyb3VwcyA9IHByb3ZpZGVyc1twXS5nZXRCdW5kbGVHcm91cHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGcgPSAwOyBnIDwgZ3JvdXBzLmxlbmd0aDsgKytnKQotICAgICAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoZ3JvdXBzW2ddLmdldElkZW50aWZpZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHZlcnNpb25JZC5lcXVhbHMoZ3JvdXBzW2ddLmdldFZlcnNpb24oKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cHNbZ107Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBpbWFnZSB3aGljaCBjYW4gYmUgc2hvd24gaW4gYW4gImFib3V0IiBkaWFsb2cgCi0gICAgICogZm9yIHRoaXMgcHJvZHVjdC4gUHJvZHVjdHMgZGVzaWduZWQgdG8gcnVuICJoZWFkbGVzcyIgdHlwaWNhbGx5IHdvdWxkIG5vdCAKLSAgICAgKiBoYXZlIHN1Y2ggYW4gaW1hZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRvciBmb3IgYW4gYWJvdXQgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEFib3V0SW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBwcm9kdWN0UHJvcGVydGllcyA9PSBudWxsID8gbnVsbCA6IHByb2R1Y3RQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgLmdldEFib3V0SW1hZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBpbWFnZSB3aGljaCBjYW4gYmUgc2hvd24gaW4gYW4gImFib3V0IGZlYXR1cmVzIiAKLSAgICAgKiBkaWFsb2cuIFByb2R1Y3RzIGRlc2lnbmVkIHRvIHJ1biAiaGVhZGxlc3MiIHR5cGljYWxseSB3b3VsZCBub3QgaGF2ZSBzdWNoIGFuIGltYWdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3IgZm9yIGEgZmVhdHVyZSBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RmVhdHVyZUltYWdlKCkgewotICAgICAgICByZXR1cm4gYnVuZGxlR3JvdXBQcm9wZXJ0aWVzID09IG51bGwgPyBudWxsIDogYnVuZGxlR3JvdXBQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgLmdldEZlYXR1cmVJbWFnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBmZWF0dXJlIGltYWdlIGZpbGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIGZlYXR1cmUgaW1hZ2UgZmlsZSwKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGZWF0dXJlSW1hZ2VOYW1lKCkgewotICAgICAgICBpZiAoYnVuZGxlR3JvdXBQcm9wZXJ0aWVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBVUkwgdXJsID0gYnVuZGxlR3JvdXBQcm9wZXJ0aWVzLmdldEZlYXR1cmVJbWFnZVVybCgpOwotICAgICAgICByZXR1cm4gdXJsID09IG51bGwgPyBudWxsIDogbmV3IFBhdGgodXJsLmdldFBhdGgoKSkubGFzdFNlZ21lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDUkMgb2YgdGhlIGZlYXR1cmUgaW1hZ2UgYXMgc3VwcGxpZWQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBDUkMgb2YgdGhlIGZlYXR1cmUgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgTG9uZyBnZXRGZWF0dXJlSW1hZ2VDUkMoKSB7Ci0gICAgICAgIGlmIChidW5kbGVHcm91cFByb3BlcnRpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGlmICghY2FsY3VsYXRlZEltYWdlQ1JDKSB7Ci0gICAgICAgICAgICBmZWF0dXJlSW1hZ2VDUkMgPSBjYWxjdWxhdGVJbWFnZUNSQyhidW5kbGVHcm91cFByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldEZlYXR1cmVJbWFnZVVybCgpKTsKLSAgICAgICAgICAgIGNhbGN1bGF0ZWRJbWFnZUNSQyA9IGZlYXR1cmVJbWFnZUNSQyAhPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZlYXR1cmVJbWFnZUNSQzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxjdWxhdGUgYSBDUkMgZm9yIHRoZSBmZWF0dXJlIGltYWdlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9uZyBjYWxjdWxhdGVJbWFnZUNSQyhVUkwgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENSQzMyIGNoZWNrc3VtID0gbmV3IENSQzMyKCk7Ci0gICAgICAgICAgICBpbiA9IG5ldyBDaGVja2VkSW5wdXRTdHJlYW0odXJsLm9wZW5TdHJlYW0oKSwgY2hlY2tzdW0pOwotCi0gICAgICAgICAgICAvLyB0aGUgY29udGVudHMgZG9uJ3QgbWF0dGVyLCB0aGUgcmVhZCBqdXN0IG5lZWRzIGEgcGxhY2UgdG8gZ28KLSAgICAgICAgICAgIGJ5dGVbXSBzaW5rID0gbmV3IGJ5dGVbMjA0OF07Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgICAgICBpZiAoaW4ucmVhZChzaW5rKSA8PSAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKGNoZWNrc3VtLmdldFZhbHVlKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxhYmVsIGZvciB0aGUgZmVhdHVyZSBwbHVnbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGZWF0dXJlTGFiZWwoKSB7Ci0gICAgICAgIGlmIChwcm9kdWN0UHJvcGVydGllcyAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3RQcm9wZXJ0aWVzLmdldFByb2R1Y3ROYW1lKCk7Ci0gICAgICAgIGlmIChidW5kbGVHcm91cFByb3BlcnRpZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBidW5kbGVHcm91cFByb3BlcnRpZXMuZ2V0RmVhdHVyZUxhYmVsKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlkIGZvciB0aGlzIGZlYXR1cmUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmVhdHVyZSBpZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZUlkKCkgewotICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotICAgICAgICBpZiAocHJvZHVjdFByb3BlcnRpZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIGlkID0gcHJvZHVjdFByb3BlcnRpZXMuZ2V0UHJvZHVjdElkKCk7Ci0gICAgICAgIGVsc2UgaWYgKGJ1bmRsZUdyb3VwUHJvcGVydGllcyAhPSBudWxsKQotICAgICAgICAgICAgaWQgPSBidW5kbGVHcm91cFByb3BlcnRpZXMuZ2V0RmVhdHVyZUlkKCk7Ci0gICAgICAgIHJldHVybiBpZCAhPSBudWxsID8gaWQgOiAiIjsgLy8kTk9OLU5MUy0xJCAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHRvIHNob3cgaW4gYW4gImFib3V0IiBkaWFsb2cgZm9yIHRoaXMgcHJvZHVjdC4KLSAgICAgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCB0ZXh0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFib3V0IHRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFib3V0VGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHByb2R1Y3RQcm9wZXJ0aWVzID09IG51bGwgPyBudWxsIDogcHJvZHVjdFByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAuZ2V0QWJvdXRUZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXBwbGljYXRpb24gbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBOb3RlIHRoaXMgaXMgbmV2ZXIgc2hvd24gdG8gdGhlIHVzZXIuCi0gICAgICogSXQgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBTV1QgRGlzcGxheS4KLSAgICAgKiA8cD4KLSAgICAgKiBPbiBNb3RpZiwgZm9yIGV4YW1wbGUsIHRoaXMgY2FuIGJlIHVzZWQKLSAgICAgKiB0byBzZXQgdGhlIG5hbWUgdXNlZCBmb3IgcmVzb3VyY2UgbG9va3VwLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGFwcGxpY2F0aW9uIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5I3NldEFwcE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFwcE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwcm9kdWN0UHJvcGVydGllcyA9PSBudWxsID8gbnVsbCA6IHByb2R1Y3RQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgLmdldEFwcE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogVGhpcyBpcyBzaG93biBpbiB0aGUgd2luZG93IHRpdGxlIGFuZCB0aGUgQWJvdXQgYWN0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJvZHVjdCBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwcm9kdWN0UHJvcGVydGllcyA9PSBudWxsID8gbnVsbCA6IHByb2R1Y3RQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgLmdldFByb2R1Y3ROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvdmlkZXIgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm92aWRlck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGVHcm91cFByb3BlcnRpZXMgPT0gbnVsbCA/IG51bGwgOiBidW5kbGVHcm91cFByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAuZ2V0UHJvdmlkZXJOYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmVhdHVyZSB2ZXJzaW9uIGlkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBpZCBvZiB0aGUgZmVhdHVyZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbklkKCkgewotICAgICAgICByZXR1cm4gYnVuZGxlR3JvdXBQcm9wZXJ0aWVzID09IG51bGwgPyAiIiA6IGJ1bmRsZUdyb3VwUHJvcGVydGllcy5nZXRGZWF0dXJlVmVyc2lvbigpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPlVSTDwvY29kZT4gZm9yIHRoZSB3ZWxjb21lIHBhZ2UuCi0gICAgICogUHJvZHVjdHMgZGVzaWduZWQgdG8gcnVuICJoZWFkbGVzcyIgdHlwaWNhbGx5IHdvdWxkIG5vdCBoYXZlIHN1Y2ggYW4gcGFnZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB3ZWxjb21lIHBhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGdldFdlbGNvbWVQYWdlVVJMKCkgewotICAgICAgICBpZiAocHJvZHVjdFByb3BlcnRpZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwcm9kdWN0UHJvcGVydGllcy5nZXRXZWxjb21lUGFnZVVybCgpOwotICAgICAgICBpZiAoYnVuZGxlR3JvdXBQcm9wZXJ0aWVzICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gYnVuZGxlR3JvdXBQcm9wZXJ0aWVzLmdldFdlbGNvbWVQYWdlVXJsKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIElEIG9mIGEgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdG8gc2hvdyB0aGUgd2VsY29tZSBwYWdlLgotICAgICAqIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB3ZWxjb21lIHBhZ2UgcGVyc3BlY3RpdmUgaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdlbGNvbWVQZXJzcGVjdGl2ZUlkKCkgewotICAgICAgICByZXR1cm4gYnVuZGxlR3JvdXBQcm9wZXJ0aWVzID09IG51bGwgPyBudWxsIDogYnVuZGxlR3JvdXBQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgLmdldFdlbGNvbWVQZXJzcGVjdGl2ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGZvciB0aGUgdGlwcyBhbmQgdHJpY2sgaHJlZi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aXBzIGFuZCB0cmlja3MgaHJlZiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGlwc0FuZFRyaWNrc0hyZWYoKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGVHcm91cFByb3BlcnRpZXMgPT0gbnVsbCA/IG51bGwgOiBidW5kbGVHcm91cFByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAuZ2V0VGlwc0FuZFRyaWNrc0hyZWYoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgaW1hZ2UgZGVzY3JpcHRvcnMgZm9yIHRoZSB3aW5kb3cgaW1hZ2VzIHRvIHVzZSBmb3IKLSAgICAgKiB0aGlzIHByb2R1Y3QuIFRoZSBleHBlY3RhdGlvbnMgaXMgdGhhdCB0aGUgZWxlbWVudHMgd2lsbCBiZSB0aGUgc2FtZQotICAgICAqIGltYWdlIHJlbmRlcmVkIGF0IGRpZmZlcmVudCBzaXplcy4gUHJvZHVjdHMgZGVzaWduZWQgdG8gcnVuICJoZWFkbGVzcyIKLSAgICAgKiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBpbWFnZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgaW1hZ2UgZGVzY3JpcHRvcnMgZm9yIHRoZSB3aW5kb3cgaW1hZ2VzLCBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yW10gZ2V0V2luZG93SW1hZ2VzKCkgewotICAgICAgICByZXR1cm4gcHJvZHVjdFByb3BlcnRpZXMgPT0gbnVsbCA/IG51bGwgOiBwcm9kdWN0UHJvcGVydGllcwotICAgICAgICAgICAgICAgIC5nZXRXaW5kb3dJbWFnZXMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0NhdGVnb3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0NhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDc3MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9DYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogQ2F0ZWdvcnkgcHJvdmlkZXMgZm9yIGhpZXJhcmNoaWNhbCBncm91cGluZyBvZiBlbGVtZW50cwotICogcmVnaXN0ZXJlZCBpbiB0aGUgcmVnaXN0cnkuIE9uZSBleHRlbnNpb24gbm9ybWFsbHkgZGVmaW5lcwotICogYSBjYXRlZ29yeSwgYW5kIG90aGVyIHJlZmVyZW5jZSBpdCB2aWEgaXRzIElELgotICogPHA+Ci0gKiBBIGNhdGVnb3J5IG1heSBzcGVjaWZ5IGl0cyBwYXJlbnQgY2F0ZWdvcnkgaW4gb3JkZXIgdG8KLSAqIGFjaGlldmUgaGllcmFyY2h5LgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnkgZXh0ZW5kcyBXb3JrYmVuY2hBZGFwdGVyIHsKLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHRoZSBtaXNjZWxsYW5lb3VzIGNhdGVnb3J5Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUlTQ19OQU1FID0gSURFV29ya2JlbmNoTWVzc2FnZXMuSUNhdGVnb3J5X290aGVyOwotCi0gICAgLyoqCi0gICAgICogSWRlbnRpZmllciBvZiB0aGUgbWlzY2VsbGFuZW91cyBjYXRlZ29yeQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JU0NfSUQgPSAib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwub3RoZXJDYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BBUkVOVCA9ICJwYXJlbnRDYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBwYXJlbnRQYXRoOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdW5wYXJzZWRQYXRoOwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZWxlbWVudHM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPkNhdGVnb3J5PC9jb2RlPiBhcyBhCi0gICAgICogbWlzY2VsbGFuZW91cyBjYXRlZ29yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2F0ZWdvcnkoKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBNSVNDX0lEOwotICAgICAgICB0aGlzLm5hbWUgPSBNSVNDX05BTUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5DYXRlZ29yeTwvY29kZT4gd2l0aAotICAgICAqIGFuIElEIGFuZCBsYWJlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY2F0ZWdvcnkKLSAgICAgKiBAcGFyYW0gbGFiZWwgdGhlIHByZXNlbnRhdGlvbiBsYWJlbCBmb3IgdGhpcyBjYXRlZ29yeQotICAgICAqLwotICAgIHB1YmxpYyBDYXRlZ29yeShTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgIHRoaXMubmFtZSA9IGxhYmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+Q2F0ZWdvcnk8L2NvZGU+IHVzaW5nIHRoZQotICAgICAqIGluZm9ybWF0aW9uIGZyb20gdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbmZpZ0VsZW1lbnQgdGhlIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDxjb2RlPiBjb250YWluaW5nCi0gICAgICogCQl0aGUgSUQsIGxhYmVsLCBhbmQgb3B0aW9uYWwgcGFyZW50IGNhdGVnb3J5IHBhdGguCi0gICAgICogQHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24gaWYgdGhlIElEIG9yIGxhYmVsIGlzIDxjb2RlPm51bGw8L2NvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2F0ZWdvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLSAgICAgICAgaWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotICAgICAgICBuYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotICAgICAgICB1bnBhcnNlZFBhdGggPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUEFSRU5UKTsKLQotICAgICAgICBpZiAoaWQgPT0gbnVsbCB8fCBuYW1lID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2JlbmNoRXhjZXB0aW9uKCJJbnZhbGlkIGNhdGVnb3J5OiAiICsgaWQpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ2F0ZWdvcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRWxlbWVudChPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudHMgPT0gbnVsbCkKLSAgICAgICAgICAgIGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCg1KTsKLSAgICAgICAgZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUFkYXB0YWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotICAgICAgICBpZiAoYWRhcHRlciA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hBZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudHMoKS50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoQWRhcHRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICBJU2hhcmVkSW1hZ2VzLklNR19PQkpfRk9MREVSKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hBZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIGdldExhYmVsKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ2F0ZWdvcnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNhdGVnb3J5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNhdGVnb3J5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJlbnRQYXRoKCkgewotICAgICAgICBpZiAodW5wYXJzZWRQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih1bnBhcnNlZFBhdGgsICIvIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHBhcmVudFBhdGggPSBuZXcgU3RyaW5nW3N0b2suY291bnRUb2tlbnMoKV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgc3Rvay5oYXNNb3JlVG9rZW5zKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHBhcmVudFBhdGhbaV0gPSBzdG9rLm5leHRUb2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5wYXJzZWRQYXRoID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXJlbnRQYXRoOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNhdGVnb3J5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9vdFBhdGgoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHBhdGggPSBnZXRQYXJlbnRQYXRoKCk7Ci0gICAgICAgIGlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGggPiAwKQotICAgICAgICAgICAgcmV0dXJuIHBhdGhbMF07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDYXRlZ29yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldEVsZW1lbnRzKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudHM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ2F0ZWdvcnkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRWxlbWVudHMoKSB7Ci0gICAgICAgIGlmIChlbGVtZW50cyAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50cy5pc0VtcHR5KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0Nob29zZVdvcmtzcGFjZURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvQ2hvb3NlV29ya3NwYWNlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDdkNGU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvQ2hvb3NlV29ya3NwYWNlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkNvbmZpZ3VyYXRpb25TY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuWE1MTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLlNjb3BlZFByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIHRoZSBpbmZvcm1hdGlvbiBiZWhpbmQgdGhlICJMYXVuY2ggV29ya3NwYWNlIiBkaWFsb2cuIFRoZQotICogY2xhc3MgaXMgYWJsZSB0byByZWFkIGFuZCB3cml0ZSBpdHNlbGYgdG8gYSB3ZWxsIGtub3duIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIENob29zZVdvcmtzcGFjZURhdGEgewotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IG1heCBsZW5ndGggb2YgdGhlIHJlY2VudCB3b3Jrc3BhY2UgbXJ1IGxpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQ0VOVF9NQVhfTEVOR1RIID0gNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBjb25maWcgYXJlYSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlCi0gICAgICogcmVjZWl2ZXIncyBwZXJzaXN0ZWQgZGF0YS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU19GT0xERVIgPSAib3JnLmVjbGlwc2UudWkuaWRlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgd2l0aGluIHRoZSBjb25maWcgYXJlYSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IKLSAgICAgKiB0aGUgcmVjZXZlcidzIHBlcnNpc3RlZCBkYXRhLgotICAgICAqIEBzZWUgUEVSU19GT0xERVIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU19GSUxFTkFNRSA9ICJyZWNlbnRXb3Jrc3BhY2VzLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEluIHRoZSBwYXN0IGEgZmlsZSB3YXMgdXNlZCB0byBzdG9yZSBwZXJzaXN0IHRoZXNlIHZhbHVlcy4gIFRoaXMgZmlsZSB3YXMgd3JpdHRlbgotICAgICAqIHdpdGggdGhpcyB2YWx1ZSBhcyBpdHMgcHJvdG9jb2wgaWRlbnRpZmllci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEVSU19FTkNPRElOR19WRVJTSU9OID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gb2YgdGhlIGVuY29kZS9kZWNvZGUgcHJvdG9jb2wgdGhhdCB1c2VzIHRoZSBjb25maWcgYXJlYQotICAgICAqIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHBlcnNpc3RlbmNlLiAgVGhlIG9ubHkgZW5jb2RpbmcgZG9uZSBpcyB0byBjb252ZXJ0IHRoZSByZWNlbnQKLSAgICAgKiB3b3Jrc3BhY2UgbGlzdCBpbnRvIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBFUlNfRU5DT0RJTkdfVkVSU0lPTl9DT05GSUdfUFJFRlMgPSAyOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3dEaWFsb2cgPSB0cnVlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5pdGlhbERlZmF1bHQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzZWxlY3Rpb247Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIHJlY2VudFdvcmtzcGFjZXM7Ci0KLSAgICAvLyB4bWwgdGFncwotICAgIHByaXZhdGUgc3RhdGljIGludGVyZmFjZSBYTUwgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTCA9ICJwcm90b2NvbCI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxXQVlTX0FTSyA9ICJhbHdheXNBc2siOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19ESUFMT0cgPSAic2hvd0RpYWxvZyI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLU1BBQ0UgPSAid29ya3NwYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ0VOVF9XT1JLU1BBQ0VTID0gInJlY2VudFdvcmtzcGFjZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0xFTkdUSCA9ICJtYXhMZW5ndGgiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UsIGxvYWRpbmcgcGVyc2lzdGVudCBkYXRhIGlmIGl0cyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hvb3NlV29ya3NwYWNlRGF0YShTdHJpbmcgaW5pdGlhbERlZmF1bHQpIHsKLSAgICAgICAgcmVhZFBlcnNpc3RlZERhdGEoKTsKLSAgICAgICAgc2V0SW5pdGlhbERlZmF1bHQoaW5pdGlhbERlZmF1bHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UsIGxvYWRpbmcgcGVyc2lzdGVudCBkYXRhIGlmIGl0cyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hvb3NlV29ya3NwYWNlRGF0YShVUkwgaW5zdGFuY2VVcmwpIHsKLSAgICAgICAgcmVhZFBlcnNpc3RlZERhdGEoKTsKLSAgICAgICAgaWYgKGluc3RhbmNlVXJsICE9IG51bGwpCi0gICAgICAgICAgICBzZXRJbml0aWFsRGVmYXVsdChuZXcgRmlsZShpbnN0YW5jZVVybC5nZXRGaWxlKCkpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZm9sZGVyIHRvIGJlIHVzZWQgYXMgYSBkZWZhdWx0IGlmIG5vIG90aGVyIGluZm9ybWF0aW9uCi0gICAgICogZXhpc3RzLiBEb2VzIG5vdCByZXR1cm4gbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxEZWZhdWx0KCkgewotICAgICAgICBpZiAoaW5pdGlhbERlZmF1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHNldEluaXRpYWxEZWZhdWx0KFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAid29ya3NwYWNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIGluaXRpYWxEZWZhdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIGRhdGEncyBpbml0aWFsRGVmYXVsdCBwYXJhbWV0ZXIgdG8gYSBwcm9wZXJseSBmb3JtYXR0ZWQgdmVyc2lvbgotICAgICAqIG9mIHRoZSBhcmd1bWVudCBkaXJlY3Rvcnkgc3RyaW5nLiBUaGUgcHJvcGVyIGZvcm1hdCBpcyB0byB0aGUgcGxhdGZvcm0KLSAgICAgKiBhcHByb3ByaWF0ZSBzZXBhcmF0b3IgY2hhcmFjdGVyIHdpdGhvdXQgbWVhbmluZ2xlc3MgbGVhZGluZyBvciB0cmFpbGluZwotICAgICAqIHNlcGFyYXRvciBjaGFyYWN0ZXJzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRJbml0aWFsRGVmYXVsdChTdHJpbmcgZGlyKSB7Ci0gICAgICAgIGlmIChkaXIgPT0gbnVsbCB8fCBkaXIubGVuZ3RoKCkgPD0gMCkgewotICAgICAgICAgICAgaW5pdGlhbERlZmF1bHQgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZGlyID0gbmV3IFBhdGgoZGlyKS50b09TU3RyaW5nKCk7Ci0gICAgICAgIHdoaWxlIChkaXIuY2hhckF0KGRpci5sZW5ndGgoKSAtIDEpID09IEZpbGUuc2VwYXJhdG9yQ2hhcikKLSAgICAgICAgICAgIGRpciA9IGRpci5zdWJzdHJpbmcoMCwgZGlyLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgIGluaXRpYWxEZWZhdWx0ID0gZGlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHdvcmtzcGFjZSBvciBudWxsIGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgd29ya3NwYWNlIG9yIG51bGwgaWYgbm90aGluZyBpcyBzZWxlY3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93RGlhbG9nKCkgewotICAgICAgICByZXR1cm4gc2hvd0RpYWxvZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgcmVjZW50IHdvcmtzcGFjZXMgc29ydGVkIHdpdGggdGhlIG1vc3QgcmVjZW50bHkgdXNlZCBhdAotICAgICAqIHRoZSBzdGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVjZW50V29ya3NwYWNlcygpIHsKLSAgICAgICAgcmV0dXJuIHJlY2VudFdvcmtzcGFjZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGFyZ3VtZW50IHdvcmtzcGFjZSBoYXMgYmVlbiBzZWxlY3RlZCwgdXBkYXRlIHRoZSByZWNlaXZlci4gIERvZXMgbm90Ci0gICAgICogcGVyc2lzdCB0aGUgbmV3IHZhbHVlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3b3Jrc3BhY2VTZWxlY3RlZChTdHJpbmcgZGlyKSB7Ci0gICAgICAgIC8vIHRoaXMganVzdCBzdG9yZXMgdGhlIHNlbGVjdGlvbiwgaXQgaXMgbm90IGluc2VydGVkIGFuZCBwZXJzaXN0ZWQKLSAgICAgICAgLy8gdW50aWwgdGhlIHdvcmtzcGFjZSBpcyBhY3R1YWxseSBzZWxlY3RlZAotICAgICAgICBzZWxlY3Rpb24gPSBkaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG9nZ2xlIHZhbHVlIG9mIHRoZSBzaG93RGlhbG9nIHBlcnNpc3RlbnQgc2V0dGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0b2dnbGVTaG93RGlhbG9nKCkgewotICAgICAgICBzaG93RGlhbG9nID0gIXNob3dEaWFsb2c7Ci0gICAgfQotCi0gICAgLyoqCi0JICogVXBkYXRlIHRoZSBwZXJzaXN0ZW50IHN0b3JlLiBDYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgdGhlIGN1cnJlbnRseQotCSAqIHNlbGVjdGVkIHZhbHVlIGhhcyBiZWVuIGZvdW5kIHRvIGJlIG9rLgotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlUGVyc2lzdGVkRGF0YSgpIHsKLQkJLy8gMS4gZ2V0IGNvbmZpZyBwcmVmIG5vZGUKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBDb25maWd1cmF0aW9uU2NvcGUoKS5nZXROb2RlKElERVdvcmtiZW5jaFBsdWdpbi5JREVfV09SS0JFTkNIKTsKLQotCQkvLyAyLiBnZXQgdmFsdWUgZm9yIHNob3dEaWFsb2cKLQkJbm9kZS5wdXRCb29sZWFuKAotCQkJCUlERS5QcmVmZXJlbmNlcy5TSE9XX1dPUktTUEFDRV9TRUxFQ1RJT05fRElBTE9HLAotCQkJCXNob3dEaWFsb2cpOwotCi0JCS8vIDMuIHVzZSB2YWx1ZSBvZiBudW1SZWNlbnQgdG8gY3JlYXRlIHByb3BlciBsZW5ndGggYXJyYXkKLQkJbm9kZS5wdXRJbnQoSURFLlByZWZlcmVuY2VzLk1BWF9SRUNFTlRfV09SS1NQQUNFUywKLQkJCQlyZWNlbnRXb3Jrc3BhY2VzLmxlbmd0aCk7Ci0KLQkJLy8gbW92ZSB0aGUgbmV3IHNlbGVjdGlvbiB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgb2xkRW50cnkgPSByZWNlbnRXb3Jrc3BhY2VzWzBdOwotCQkJcmVjZW50V29ya3NwYWNlc1swXSA9IHNlbGVjdGlvbjsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgcmVjZW50V29ya3NwYWNlcy5sZW5ndGggJiYgb2xkRW50cnkgIT0gbnVsbDsgKytpKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbi5lcXVhbHMob2xkRW50cnkpKQotCQkJCQlicmVhazsKLQkJCQlTdHJpbmcgdG1wID0gcmVjZW50V29ya3NwYWNlc1tpXTsKLQkJCQlyZWNlbnRXb3Jrc3BhY2VzW2ldID0gb2xkRW50cnk7Ci0JCQkJb2xkRW50cnkgPSB0bXA7Ci0JCQl9Ci0JCX0KLQotCQkvLyA0LiBzdG9yZSB2YWx1ZXMgb2YgcmVjZW50IHdvcmtzcGFjZXMgaW50byBhcnJheQotCQlTdHJpbmcgZW5jb2RlZFJlY2VudFdvcmtzcGFjZXMgPSBlbmNvZGVTdG9yZWRXb3Jrc3BhY2VQYXRocyhyZWNlbnRXb3Jrc3BhY2VzKTsKLQkJbm9kZS5wdXQoSURFLlByZWZlcmVuY2VzLlJFQ0VOVF9XT1JLU1BBQ0VTLAotCQkJCWVuY29kZWRSZWNlbnRXb3Jrc3BhY2VzKTsKLQotCQkvLyA1LiBzdG9yZSB0aGUgcHJvdG9jb2wgdmVyc2lvbiB1c2VkIHRvIGVuY29kZSB0aGUgbGlzdAotCQlub2RlLnB1dEludChJREUuUHJlZmVyZW5jZXMuUkVDRU5UX1dPUktTUEFDRVNfUFJPVE9DT0wsCi0JCQkJUEVSU19FTkNPRElOR19WRVJTSU9OX0NPTkZJR19QUkVGUyk7Ci0KLQkJLy8gNi4gc3RvcmUgdGhlIG5vZGUKLQkJdHJ5IHsKLQkJCW5vZGUuZmx1c2goKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotICAgIC8qKgotCSAqIExvb2sgZm9yIGFuZCByZWFkIGRhdGEgdGhhdCBtaWdodCBoYXZlIGJlZW4gcGVyc2lzdGVkIGZyb20gc29tZSBwcmV2aW91cwotCSAqIHJ1bi4gTGVhdmUgdGhlIHJlY2VpdmVyIGluIGEgZGVmYXVsdCBzdGF0ZSBpZiBubyBwZXJzaXN0ZW50IGRhdGEgaXMKLQkgKiBmb3VuZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgYSBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgcmVhZCBhbmQgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlYWRQZXJzaXN0ZWREYXRhX2ZpbGUoKSB7Ci0JICAgIFVSTCBwZXJzVXJsID0gbnVsbDsKLQotCSAgICBMb2NhdGlvbiBjb25maWdMb2MgPSBQbGF0Zm9ybS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLQkgICAgaWYgKGNvbmZpZ0xvYyAhPSBudWxsKQotCSAgICAgICAgcGVyc1VybCA9IGdldFBlcnNpc3RlbmNlVXJsKGNvbmZpZ0xvYy5nZXRVUkwoKSwgZmFsc2UpOwotCi0JICAgIHRyeSB7Ci0JICAgICAgICAvLyBpbnNpZGUgdHJ5IHRvIGdldCB0aGUgc2FmZSBkZWZhdWx0IGNyZWF0aW9uIGluIHRoZSBmaW5hbGx5Ci0JICAgICAgICAvLyBjbGF1c2UKLQkgICAgICAgIGlmIChwZXJzVXJsID09IG51bGwpCi0JICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgICAgICAvLyBFLmcuLAotCSAgICAgICAgLy8JPGxhdW5jaFdvcmtzcGFjZURhdGE+Ci0JICAgICAgICAvLwkJPHByb3RvY29sIHZlcnNpb249IjEiLz4KLQkgICAgICAgIC8vICAgICAgPGFsd2F5c0FzayBzaG93RGlhbG9nPSIxIi8+Ci0JICAgICAgICAvLyAJCTxyZWNlbnRXb3Jrc3BhY2VzIG1heExlbmd0aD0iNSI+Ci0JICAgICAgICAvLwkJCTx3b3Jrc3BhY2UgcGF0aD0iQzpcZWNsaXBzZVx3b3Jrc3BhY2UwIi8+Ci0JICAgICAgICAvLwkJCTx3b3Jrc3BhY2UgcGF0aD0iQzpcZWNsaXBzZVx3b3Jrc3BhY2UxIi8+Ci0JICAgICAgICAvLwkJPC9yZWNlbnRXb3Jrc3BhY2VzPgotCSAgICAgICAgLy8JPC9sYXVuY2hXb3Jrc3BhY2VEYXRhPgotCi0JICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIocGVyc1VybC5nZXRGaWxlKCkpOwotCSAgICAgICAgWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVSZWFkUm9vdChyZWFkZXIpOwotCSAgICAgICAgaWYgKG1lbWVudG8gPT0gbnVsbCB8fCAhY29tcGF0aWJsZUZpbGVQcm90b2NvbChtZW1lbnRvKSkKLQkgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAgIElNZW1lbnRvIGFsd2F5c0Fza1RhZyA9IG1lbWVudG8uZ2V0Q2hpbGQoWE1MLkFMV0FZU19BU0spOwotCSAgICAgICAgc2hvd0RpYWxvZyA9IGFsd2F5c0Fza1RhZyA9PSBudWxsID8gdHJ1ZSA6IGFsd2F5c0Fza1RhZy5nZXRJbnRlZ2VyKAotCSAgICAgICAgICAgICAgICBYTUwuU0hPV19ESUFMT0cpLmludFZhbHVlKCkgPT0gMTsKLQotCSAgICAgICAgSU1lbWVudG8gcmVjZW50ID0gbWVtZW50by5nZXRDaGlsZChYTUwuUkVDRU5UX1dPUktTUEFDRVMpOwotCSAgICAgICAgaWYgKHJlY2VudCA9PSBudWxsKQotCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICAgICAgSW50ZWdlciBtYXhMZW5ndGggPSByZWNlbnQuZ2V0SW50ZWdlcihYTUwuTUFYX0xFTkdUSCk7Ci0JICAgICAgICBpbnQgbWF4ID0gUkVDRU5UX01BWF9MRU5HVEg7Ci0JICAgICAgICBpZiAobWF4TGVuZ3RoICE9IG51bGwpCi0JICAgICAgICAgICAgbWF4ID0gbWF4TGVuZ3RoLmludFZhbHVlKCk7Ci0KLQkgICAgICAgIElNZW1lbnRvIGluZGljZXNbXSA9IHJlY2VudC5nZXRDaGlsZHJlbihYTUwuV09SS1NQQUNFKTsKLQkgICAgICAgIGlmIChpbmRpY2VzID09IG51bGwgfHwgaW5kaWNlcy5sZW5ndGggPD0gMCkKLQkgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAgIC8vIGlmIGEgdXNlciBoYXMgZWRpdGVkIG1heExlbmd0aCB0byBiZSBzaG9ydGVyIHRoYW4gdGhlIGxpc3RlZAotCSAgICAgICAgLy8gaW5kaWNlcywgYWNjZXB0IHRoZSBsaXN0IChpdHMgdG91Z2hlciBmb3IgdGhlbSB0byByZXR5cGUgYSBsb25nCi0JICAgICAgICAvLyBsaXN0IG9mIHBhdGhzIHRoYW4gdG8gdXBkYXRlIGEgbWF4IG51bWJlcikKLQkgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgaW5kaWNlcy5sZW5ndGgpOwotCi0JICAgICAgICByZWNlbnRXb3Jrc3BhY2VzID0gbmV3IFN0cmluZ1ttYXhdOwotCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgKytpKSB7Ci0JICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBpbmRpY2VzW2ldLmdldFN0cmluZyhYTUwuUEFUSCk7Ci0JICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKLQkgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgICAgICAgICAgcmVjZW50V29ya3NwYWNlc1tpXSA9IHBhdGg7Ci0JICAgICAgICB9Ci0JICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIC8vIGNhbm5vdCBsb2cgYmVjYXVzZSBpbnN0YW5jZSBhcmVhIGhhcyBub3QgYmVlbiBzZXQKLQkgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIC8vIGNhbm5vdCBsb2cgYmVjYXVzZSBpbnN0YW5jZSBhcmVhIGhhcyBub3QgYmVlbiBzZXQKLQkgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfSBmaW5hbGx5IHsKLQkgICAgICAgIC8vIGNyZWF0ZSBzYWZlIGRlZmF1bHQgaWYgbmVlZGVkCi0JICAgICAgICBpZiAocmVjZW50V29ya3NwYWNlcyA9PSBudWxsKQotCSAgICAgICAgICAgIHJlY2VudFdvcmtzcGFjZXMgPSBuZXcgU3RyaW5nW1JFQ0VOVF9NQVhfTEVOR1RIXTsKLQkgICAgfQotCi0JICAgIHJldHVybiB0cnVlOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY3VycmVudCAocGVyc2lzdGVkKSB2YWx1ZSBvZiB0aGUgInNob3dEaWFsb2cgb24gc3RhcnR1cCIKLSAgICAgKiBwcmVmZXJlbmNlLiBSZXR1cm4gdGhlIGdsb2JhbCBkZWZhdWx0IGlmIHRoZSBmaWxlIGNhbm5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd0RpYWxvZ1ZhbHVlKCkgewotICAgIAkvLyBUT0RPIFNlZSB0aGUgbG9uZyBjb21tZW50IGluICNyZWFkUGVyc2lzdGVkRGF0YSAtLSB3aGVuIHRoZQotCQkvLyAgICAgIHRyYW5zaXRpb24gdGltZSBpcyBvdmVyIHRoaXMgbWV0aG9kIGNhbiBiZSBjaGFuZ2VkIHRvCi0gICAgCS8vICAgICAgcmVhZCB0aGUgcHJlZmVyZW5jZSBkaXJlY3RseS4KLQotICAgICAgICBDaG9vc2VXb3Jrc3BhY2VEYXRhIGRhdGEgPSBuZXcgQ2hvb3NlV29ya3NwYWNlRGF0YSgiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyByZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSBpbiB0aGUgZmlsZSBvciB0cnVlLCB3aGljaCBpcyB0aGUgZ2xvYmFsCi0gICAgICAgIC8vIGRlZmF1bHQKLSAgICAgICAgcmV0dXJuIGRhdGEucmVhZFBlcnNpc3RlZERhdGEoKSA/IGRhdGEuc2hvd0RpYWxvZyA6IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IChwZXJzaXN0ZWQpIHZhbHVlIG9mIHRoZSAic2hvd0RpYWxvZyBvbiBzdGFydHVwIgotCSAqIHByZWZlcmVuY2UuIFJldHVybiB0aGUgZ2xvYmFsIGRlZmF1bHQgaWYgdGhlIGZpbGUgY2Fubm90IGJlIGFjY2Vzc2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG93RGlhbG9nVmFsdWUoYm9vbGVhbiBzaG93RGlhbG9nKSB7Ci0JCS8vIFRPRE8gU2VlIHRoZSBsb25nIGNvbW1lbnQgaW4gI3JlYWRQZXJzaXN0ZWREYXRhIC0tIHdoZW4gdGhlCi0JCS8vICAgICAgdHJhbnNpdGlvbiB0aW1lIGlzIG92ZXIgdGhpcyBtZXRob2QgY2FuIGJlIGNoYW5nZWQgdG8KLQkJLy8gICAgICByZWFkIHRoZSBwcmVmZXJlbmNlIGRpcmVjdGx5LgotCi0JCUNob29zZVdvcmtzcGFjZURhdGEgZGF0YSA9IG5ldyBDaG9vc2VXb3Jrc3BhY2VEYXRhKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHVwZGF0ZSB0aGUgdmFsdWUgYW5kIHdyaXRlIHRoZSBuZXcgc2V0dGluZ3MKLQkJZGF0YS5zaG93RGlhbG9nID0gc2hvd0RpYWxvZzsKLQkJZGF0YS53cml0ZVBlcnNpc3RlZERhdGEoKTsKLQl9Ci0KLSAgICAvKioKLQkgKiBMb29rIGluIHRoZSBjb25maWcgYXJlYSBwcmVmZXJlbmNlIHN0b3JlIGZvciB0aGUgbGlzdCBvZiByZWNlbnRseSB1c2VkCi0JICogd29ya3NwYWNlcy4KLQkgKiAKLQkgKiBOT1RFOiBEdXJpbmcgdGhlIHRyYW5zaXRpb24gcGhhc2UgdGhlIGZpbGUgd2lsbCBiZSBjaGVja2VkIGlmIG5vIGNvbmZpZwotCSAqIHByZWZlcmVuY2VzIGFyZSBmb3VuZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyB3ZXJlIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgYW5kIGZhbHNlCi0JICogICAgICAgICBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkUGVyc2lzdGVkRGF0YSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IG5ldyBTY29wZWRQcmVmZXJlbmNlU3RvcmUoCi0JCQkJbmV3IENvbmZpZ3VyYXRpb25TY29wZSgpLCBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCk7Ci0KLQkJLy8gVGhlIG9sZCB3YXkgd2FzIHRvIHN0b3JlIHRoaXMgaW5mb3JtYXRpb24gaW4gYSBmaWxlLCB0aGUgbmV3IGlzIHRvCi0JCS8vIHVzZSB0aGUgY29uZmlndXJhdGlvbiBhcmVhIHByZWZlcmVuY2Ugc3RvcmUuIFRvIGhlbHAgdXNlcnMgd2l0aCB0aGUKLQkJLy8gdHJhbnNpdGlvbiwgdGhpcyBjb2RlIGFsd2F5cyBsb29rcyBmb3IgdmFsdWVzIGluIHRoZSBwcmVmZXJlbmNlCi0JCS8vIHN0b3JlOyB0aGV5IGFyZSB1c2VkIGlmIGZvdW5kLiBJZiB0aGVyZSBhcmVuJ3QgYW55IHJlbGF0ZWQKLQkJLy8gcHJlZmVyZW5jZXMsIHRoZW4gdGhlIGZpbGUgbWV0aG9kIGlzIHVzZWQgaW5zdGVhZC4gVGhpcyBjbGFzcyBhbHdheXMKLQkJLy8gd3JpdGVzIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLCBzbyB0aGUgZmFsbC1iYWNrIHNob3VsZCBiZSBuZWVkZWQgbm8KLQkJLy8gbW9yZSB0aGFuIG9uY2UgcGVyLXVzZXIsIHBlci1jb25maWd1cmF0aW9uLgotCi0JCS8vIFRoaXMgY29kZSBhbHdheXMgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIHByb3RvY29sIHRvIGEgbm9uLXplcm8gdmFsdWUKLQkJLy8gKGN1cnJlbnRseSBhdCAyKS4gIElmIHRoZSB2YWx1ZSBjb21lcyBiYWNrIGFzIHRoZSBkZWZhdWx0ICgwKSwgdGhlbgotCQkvLyBub25lIG9mIHRoZSBwcmVmZXJlbmNlcyB3ZXJlIHNldCwgcmV2ZXJ0IHRvIHRoZSBmaWxlIG1ldGhvZC4KLQotCQlpbnQgcHJvdG9jb2wgPSBzdG9yZQotCQkJCS5nZXRJbnQoSURFLlByZWZlcmVuY2VzLlJFQ0VOVF9XT1JLU1BBQ0VTX1BST1RPQ09MKTsKLQkJaWYgKHByb3RvY29sID09IElQcmVmZXJlbmNlU3RvcmUuSU5UX0RFRkFVTFRfREVGQVVMVAotCQkJCSYmIHJlYWRQZXJzaXN0ZWREYXRhX2ZpbGUoKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIDIuIGdldCB2YWx1ZSBmb3Igc2hvd0RpYWxvZwotCQlzaG93RGlhbG9nID0gc3RvcmUKLQkJCQkuZ2V0Qm9vbGVhbihJREUuUHJlZmVyZW5jZXMuU0hPV19XT1JLU1BBQ0VfU0VMRUNUSU9OX0RJQUxPRyk7Ci0KLQkJLy8gMy4gdXNlIHZhbHVlIG9mIG51bVJlY2VudCB0byBjcmVhdGUgcHJvcGVyIGxlbmd0aCBhcnJheQotCQlpbnQgbWF4ID0gc3RvcmUKLQkJCQkuZ2V0SW50KElERS5QcmVmZXJlbmNlcy5NQVhfUkVDRU5UX1dPUktTUEFDRVMpOwotCQltYXggPSBNYXRoLm1heChtYXgsIFJFQ0VOVF9NQVhfTEVOR1RIKTsKLQotCQkvLyA0LiBsb2FkIHZhbHVlcyBvZiByZWNlbnQgd29ya3NwYWNlcyBpbnRvIGFycmF5Ci0JCVN0cmluZyB3b3Jrc3BhY2VQYXRoUHJlZiA9IHN0b3JlCi0JCQkJLmdldFN0cmluZyhJREUuUHJlZmVyZW5jZXMuUkVDRU5UX1dPUktTUEFDRVMpOwotCQlyZWNlbnRXb3Jrc3BhY2VzID0gZGVjb2RlU3RvcmVkV29ya3NwYWNlUGF0aHMobWF4LCB3b3Jrc3BhY2VQYXRoUHJlZik7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHRoZSBsaXN0IG9mIHJlY2VudCB3b3Jrc3BhY2VzIG11c3QgYmUgc3RvcmVkIGFzIGEgc3RyaW5nIGluIHRoZSBwcmVmZXJlbmNlIG5vZGUuCi0JICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZVN0b3JlZFdvcmtzcGFjZVBhdGhzKFN0cmluZ1tdIHJlY2VudCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjZW50Lmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAocmVjZW50W2ldID09IG51bGwpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJYnVmZi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlwYXRoID0gcmVjZW50W2ldOwotCQkJYnVmZi5hcHBlbmQocGF0aCk7Ci0JCX0KLQotCQlyZXR1cm4gYnVmZi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFRoZSB0aGUgcHJlZmVyZW5jZSBmb3IgcmVjZW50IHdvcmtzcGFjZXMgbXVzdCBiZSBjb252ZXJ0ZWQgZnJvbSB0aGUKLQkgKiBzdG9yYWdlIHN0cmluZyBpbnRvIGFuIGFycmF5LgotCSAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGRlY29kZVN0b3JlZFdvcmtzcGFjZVBhdGhzKGludCBtYXgsIFN0cmluZyBwcmVmVmFsdWUpIHsKLQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW21heF07Ci0JCWlmIChwcmVmVmFsdWUgPT0gbnVsbCB8fCBwcmVmVmFsdWUubGVuZ3RoKCkgPD0gMCkKLQkJCXJldHVybiBwYXRoczsKLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcmVmVmFsdWUsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGggJiYgdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKytpKQotCQkJcGF0aHNbaV0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0KLQkJcmV0dXJuIHBhdGhzOwotCX0KLQotICAgIC8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBwcm90b2NvbCB1c2VkIHRvIGVuY29kZSB0aGUgYXJndW1lbnQgbWVtZW50byBpcwotCSAqIGNvbXBhdGlibGUgd2l0aCB0aGUgcmVjZWl2ZXIncyBpbXBsZW1lbnRhdGlvbiBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29tcGF0aWJsZUZpbGVQcm90b2NvbChJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIElNZW1lbnRvIHByb3RvY29sTWVtZW50byA9IG1lbWVudG8uZ2V0Q2hpbGQoWE1MLlBST1RPQ09MKTsKLSAgICAgICAgaWYgKHByb3RvY29sTWVtZW50byA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEludGVnZXIgdmVyc2lvbiA9IHByb3RvY29sTWVtZW50by5nZXRJbnRlZ2VyKFhNTC5WRVJTSU9OKTsKLSAgICAgICAgcmV0dXJuIHZlcnNpb24gIT0gbnVsbCAmJiB2ZXJzaW9uLmludFZhbHVlKCkgPT0gUEVSU19FTkNPRElOR19WRVJTSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB3b3Jrc3BhY2UgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIHdlbGwga25vd24gZmlsZSBwb2ludGVkIHRvIGJ5IHRoZSByZXN1bHQKLSAgICAgKiBvZiB0aGlzIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gY3JlYXRlIElmIHRoZSBkaXJlY3RvcnkgYW5kIGZpbGUgZG9lcyBub3QgZXhpc3QgdGhpcyBwYXJhbWV0ZXIKLSAgICAgKiAgICAgICAgICAgICAgIGNvbnRyb2xzIHdoZXRoZXIgaXQgd2lsbCBiZSBjcmVhdGVkLgotICAgICAqIEByZXR1cm4gQW4gdXJsIHRvIHRoZSBmaWxlIGFuZCBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0IG9yIGNvdWxkIG5vdAotICAgICAqICAgICAgICAgYmUgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBVUkwgZ2V0UGVyc2lzdGVuY2VVcmwoVVJMIGJhc2VVcmwsIGJvb2xlYW4gY3JlYXRlKSB7Ci0gICAgICAgIGlmIChiYXNlVXJsID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzCi0gICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChiYXNlVXJsLCBQRVJTX0ZPTERFUik7Ci0gICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotICAgICAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkgJiYgKCFjcmVhdGUgfHwgIWRpci5ta2RpcigpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBmaWxlIGV4aXN0cwotICAgICAgICAgICAgdXJsID0gbmV3IFVSTChkaXIudG9VUkwoKSwgUEVSU19GSUxFTkFNRSk7Ci0gICAgICAgICAgICBGaWxlIHBlcnNGaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0gICAgICAgICAgICBpZiAoIXBlcnNGaWxlLmV4aXN0cygpICYmICghY3JlYXRlIHx8ICFwZXJzRmlsZS5jcmVhdGVOZXdGaWxlKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICByZXR1cm4gcGVyc0ZpbGUudG9VUkwoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gY2Fubm90IGxvZyBiZWNhdXNlIGluc3RhbmNlIGFyZWEgaGFzIG5vdCBiZWVuIHNldAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0Nob29zZVdvcmtzcGFjZURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9DaG9vc2VXb3Jrc3BhY2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE3MjIxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0Nob29zZVdvcmtzcGFjZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkdlb21ldHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSBkaWFsb2cgdGhhdCBwcm9tcHRzIGZvciBhIGRpcmVjdG9yeSB0byB1c2UgYXMgYSB3b3Jrc3BhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBDaG9vc2VXb3Jrc3BhY2VEaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfU0VUVElOR1NfU0VDVElPTiA9ICJDaG9vc2VXb3Jrc3BhY2VEaWFsb2dTZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIENob29zZVdvcmtzcGFjZURhdGEgbGF1bmNoRGF0YTsKLQotICAgIHByaXZhdGUgQ29tYm8gdGV4dDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc0Fza0FnYWluID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2VudGVyT25Nb25pdG9yID0gZmFsc2U7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbW9kYWwgZGlhbG9nIG9uIHRoZSBhcnVnbWVudCBzaGVsbCwgdXNpbmcgYW5kIHVwZGF0aW5nIHRoZQotICAgICAqIGFyZ3VtZW50IGRhdGEgb2JqZWN0LgotICAgICAqIEBwYXJhbSBwYXJlbnRTaGVsbCB0aGUgcGFyZW50IHNoZWxsIGZvciB0aGlzIGRpYWxvZwotICAgICAqIEBwYXJhbSBsYXVuY2hEYXRhIHRoZSBsYXVuY2ggZGF0YSBmcm9tIHBhc3QgbGF1bmNoZXMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3VwcHJlc3NBc2tBZ2FpbgotICAgICAqICAgICAgICAgICAgdHJ1ZSBtZWFucyB0aGUgZGlhbG9nIHdpbGwgbm90IGhhdmUgYSAiZG9uJ3QgYXNrIGFnYWluIiBidXR0b24KLSAgICAgKiBAcGFyYW0gY2VudGVyT25Nb25pdG9yIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkaWFsb2cgc2hvdWxkIGJlIGNlbnRlcmVkIG9uIAotICAgICAqIHRoZSBtb25pdG9yIG9yIGFjY29yZGluZyB0byBpdCdzIHBhcmVudCBpZiB0aGVyZSBpcyBvbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hvb3NlV29ya3NwYWNlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLAotICAgICAgICAgICAgQ2hvb3NlV29ya3NwYWNlRGF0YSBsYXVuY2hEYXRhLCBib29sZWFuIHN1cHByZXNzQXNrQWdhaW4sIGJvb2xlYW4gY2VudGVyT25Nb25pdG9yKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICAgICAgdGhpcy5sYXVuY2hEYXRhID0gbGF1bmNoRGF0YTsKLSAgICAgICAgdGhpcy5zdXBwcmVzc0Fza0FnYWluID0gc3VwcHJlc3NBc2tBZ2FpbjsKLSAgICAgICAgdGhpcy5jZW50ZXJPbk1vbml0b3IgPSBjZW50ZXJPbk1vbml0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyB0aGUgZGlhbG9nIHRvIHRoZSB1c2VyIChpZiBuZWVkZWQpLiBXaGVuIHRoaXMgbWV0aG9kIGZpbmlzaGVzLAotICAgICAqICNnZXRTZWxlY3Rpb24gd2lsbCByZXR1cm4gdGhlIHdvcmtzcGFjZSB0aGF0IHNob3VsZCBiZSB1c2VkICh3aGV0aGVyIGl0Ci0gICAgICogd2FzIGp1c3Qgc2VsZWN0ZWQgYnkgdGhlIHVzZXIgb3Igc29tZSBwcmV2aW91cyBkZWZhdWx0IGhhcyBiZWVuIHVzZWQuCi0gICAgICogVGhlIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgdXNlcnMgcHJlZmVyZW5jZS4gIEZvciBleGFtcGxlLAotICAgICAqIHRoaXMgaXMgaW1wb3J0YW50IGluIGNhc2VzIHdoZXJlIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBpcyBhbHJlYWR5IGluIHVzZQotICAgICAqIGFuZCB0aGUgdXNlciBpcyBmb3JjZWQgdG8gY2hvb3NlIGEgZGlmZmVyZW50IG9uZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9yY2UKLSAgICAgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGRpYWxvZyBzaG91bGQgYmUgb3BlbmVkIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mCi0gICAgICogICAgICAgICAgICB0aGUgc2hvdyBkaWFsb2cgY2hlY2tib3gKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9tcHQoYm9vbGVhbiBmb3JjZSkgewotICAgICAgICBpZiAoZm9yY2UgfHwgbGF1bmNoRGF0YS5nZXRTaG93RGlhbG9nKCkpIHsKLSAgICAgICAgICAgIG9wZW4oKTsKLQotICAgICAgICAgICAgLy8gNzA1NzY6IG1ha2Ugc3VyZSBkaWFsb2cgZ2V0cyBkaXNtaXNzZWQgb24gRVNDIHRvbwotICAgICAgICAgICAgaWYgKGdldFJldHVybkNvZGUoKSA9PSBDQU5DRUwpCi0gICAgICAgICAgICAgICAgbGF1bmNoRGF0YS53b3Jrc3BhY2VTZWxlY3RlZChudWxsKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcmVjZW50ID0gbGF1bmNoRGF0YS5nZXRSZWNlbnRXb3Jrc3BhY2VzKCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBkaWFsb2cgd2FzIG5vdCB1c2VkIHRoZW4gdGhlIHdvcmtzcGFjZSB0byB1c2UgaXMgZWl0aGVyIHRoZQotICAgICAgICAvLyBtb3N0IHJlY2VudCBzZWxlY3Rpb24gb3IgdGhlIGluaXRpYWxEZWZhdWx0IChpZiB0aGVyZSBpcyBubyBoaXN0b3J5KS4KLSAgICAgICAgU3RyaW5nIHdvcmtzcGFjZSA9IG51bGw7Ci0gICAgICAgIGlmIChyZWNlbnQgIT0gbnVsbCAmJiByZWNlbnQubGVuZ3RoID4gMCkKLSAgICAgICAgCXdvcmtzcGFjZSA9IHJlY2VudFswXTsKLSAgICAgICAgaWYgKHdvcmtzcGFjZSA9PSBudWxsIHx8IHdvcmtzcGFjZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAJd29ya3NwYWNlID0gbGF1bmNoRGF0YS5nZXRJbml0aWFsRGVmYXVsdCgpOwotICAgICAgICBsYXVuY2hEYXRhLndvcmtzcGFjZVNlbGVjdGVkKHdvcmtzcGFjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIHVwcGVyIHBhcnQgb2YgdGhpcyBkaWFsb2cgKGFib3ZlCi0gICAgICogdGhlIGJ1dHRvbiBiYXIpLgotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCBjcmVhdGVzCi0gICAgICogYW5kIHJldHVybnMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoIG5vIG1hcmdpbnMgYW5kIHNwYWNpbmcuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBkaWFsb2cgYXJlYQotICAgICAqIEByZXR1cm4gdGhlIGRpYWxvZyBhcmVhIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgU3RyaW5nIHByb2R1Y3ROYW1lID0gbnVsbDsKLSAgICAgICAgSVByb2R1Y3QgcHJvZHVjdCA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKTsKLSAgICAgICAgaWYgKHByb2R1Y3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvZHVjdE5hbWUgPSBwcm9kdWN0LmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvZHVjdE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvZHVjdE5hbWUgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5DaG9vc2VXb3Jrc3BhY2VEaWFsb2dfZGVmYXVsdFByb2R1Y3ROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAgICAgc2V0VGl0bGUoSURFV29ya2JlbmNoTWVzc2FnZXMuQ2hvb3NlV29ya3NwYWNlRGlhbG9nX2RpYWxvZ1RpdGxlKTsKLSAgICAgICAgc2V0TWVzc2FnZShOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5DaG9vc2VXb3Jrc3BhY2VEaWFsb2dfZGlhbG9nTWVzc2FnZSwgcHJvZHVjdE5hbWUpKTsKLQotICAgICAgICAvLyBidWcgNTk5MzQ6IGxvYWQgdGl0bGUgaW1hZ2UgZm9yIHNpemluZywgYnV0IHNldCBpdCBub24tdmlzaWJsZSBzbyB0aGUKLSAgICAgICAgLy8gICAgICAgICAgICB3aGl0ZSBiYWNrZ3JvdW5kIGlzIGRpc3BsYXllZAotICAgICAgICBpZiAoZ2V0VGl0bGVJbWFnZUxhYmVsKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIGdldFRpdGxlSW1hZ2VMYWJlbCgpLnNldFZpc2libGUoZmFsc2UpOwotCi0gICAgICAgIGNyZWF0ZVdvcmtzcGFjZUJyb3dzZVJvdyhjb21wb3NpdGUpOwotICAgICAgICBpZiAoIXN1cHByZXNzQXNrQWdhaW4pCi0gICAgICAgICAgICBjcmVhdGVTaG93RGlhbG9nQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIHRoZSBnaXZlbiBzaGVsbCBpbiBwcmVwYXJhdGlvbiBmb3Igb3BlbmluZyB0aGlzIHdpbmRvdwotICAgICAqIGluIGl0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZAotICAgICAqIHNldHMgdGhlIHNoZWxsJ3MgaW1hZ2UgYW5kIGdpdmVzIGl0IGEgZ3JpZCBsYXlvdXQuIAotICAgICAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCBvciByZWltcGxlbWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICAgICAgc2hlbGwuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5DaG9vc2VXb3Jrc3BhY2VEaWFsb2dfZGlhbG9nTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhhdCB0aGUgb2sgYnV0dG9uIG9mIHRoaXMgZGlhbG9nIGhhcyBiZWVuIHByZXNzZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPkRpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIHNldHMKLSAgICAgKiB0aGlzIGRpYWxvZydzIHJldHVybiBjb2RlIHRvIDxjb2RlPldpbmRvdy5PSzwvY29kZT4KLSAgICAgKiBhbmQgY2xvc2VzIHRoZSBkaWFsb2cuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0gICAgICAgIGxhdW5jaERhdGEud29ya3NwYWNlU2VsZWN0ZWQodGV4dC5nZXRUZXh0KCkpOwotICAgICAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGF0IHRoZSBjYW5jZWwgYnV0dG9uIG9mIHRoaXMgZGlhbG9nIGhhcyBiZWVuIHByZXNzZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPkRpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIHNldHMKLSAgICAgKiB0aGlzIGRpYWxvZydzIHJldHVybiBjb2RlIHRvIDxjb2RlPldpbmRvdy5DQU5DRUw8L2NvZGU+Ci0gICAgICogYW5kIGNsb3NlcyB0aGUgZGlhbG9nLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBpZiBkZXNpcmVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotICAgICAgICBsYXVuY2hEYXRhLndvcmtzcGFjZVNlbGVjdGVkKG51bGwpOwotICAgICAgICBzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG1haW4gYXJlYSBvZiB0aGUgZGlhbG9nIGlzIGp1c3QgYSByb3cgd2l0aCB0aGUgY3VycmVudCBzZWxlY3Rpb24KLSAgICAgKiBpbmZvcm1hdGlvbiBhbmQgYSBkcm9wLWRvd24gb2YgdGhlIG1vc3QgcmVjZW50bHkgdXNlZCB3b3Jrc3BhY2VzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXb3Jrc3BhY2VCcm93c2VSb3coQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLSAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotICAgICAgICBwYW5lbC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIHBhbmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5DaG9vc2VXb3Jrc3BhY2VEaWFsb2dfd29ya3NwYWNlRW50cnlMYWJlbCk7Ci0KLSAgICAgICAgdGV4dCA9IG5ldyBDb21ibyhwYW5lbCwgU1dULkJPUkRFUiB8IFNXVC5MRUFEIHwgU1dULkRST1BfRE9XTik7Ci0gICAgICAgIHRleHQuc2V0Rm9jdXMoKTsKLSAgICAgICAgdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICB0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotICAgICAgICAJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgIAkJQnV0dG9uIG9rQnV0dG9uID0gZ2V0QnV0dG9uKFdpbmRvdy5PSyk7Ci0gICAgICAgIAkJaWYob2tCdXR0b24gIT0gbnVsbCAmJiAhb2tCdXR0b24uaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgIAkJCW9rQnV0dG9uLnNldEVuYWJsZWQoISIiLmVxdWFscyh0ZXh0LmdldFRleHQoKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICB9KTsKLSAgICAgICAgc2V0SW5pdGlhbFRleHRWYWx1ZXModGV4dCk7Ci0KLSAgICAgICAgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZWwsIFNXVC5QVVNIKTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuQ2hvb3NlV29ya3NwYWNlRGlhbG9nX2Jyb3dzZUxhYmVsKTsKLSAgICAgICAgc2V0QnV0dG9uTGF5b3V0RGF0YShicm93c2VCdXR0b24pOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKSBicm93c2VCdXR0b24uZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORDsKLSAgICAgICAgYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaGVsbCgpKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5DaG9vc2VXb3Jrc3BhY2VEaWFsb2dfZGlyZWN0b3J5QnJvd3NlclRpdGxlKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5DaG9vc2VXb3Jrc3BhY2VEaWFsb2dfZGlyZWN0b3J5QnJvd3Nlck1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJQYXRoKGdldEluaXRpYWxCcm93c2VQYXRoKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPSBkaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgIGlmIChkaXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRUZXh0KGRpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBwYXRoIHRoYXQgaXMgY2xvc2VzdCB0byB0aGUgY3VycmVudAotICAgICAqIHNlbGVjdGlvbiBpbiB0aGUgdGV4dCB3aWRnZXQuIFRoaXMgc3RhcnRzIHdpdGggdGhlIGN1cnJlbnQgdmFsdWUgYW5kCi0gICAgICogd29ya3MgdG93YXJkIHRoZSByb290IHVudGlsIHRoZXJlIGlzIGEgZGlyZWN0b3J5IGZvciB3aGljaCBGaWxlLmV4aXN0cwotICAgICAqIHJldHVybnMgdHJ1ZS4gUmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyIGlmIHRoZSB0ZXh0IGJveCBkb2VzIG5vdAotICAgICAqIGNvbnRhaW4gYSB2YWxpZCBwYXRoLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY2xvc2VzdCBwYXJlbnQgdGhhdCBleGlzdHMgb3IgYW4gZW1wdHkgc3RyaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5pdGlhbEJyb3dzZVBhdGgoKSB7Ci0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUodGV4dC5nZXRUZXh0KCkpOwotICAgICAgICB3aGlsZSAoZGlyICE9IG51bGwgJiYgIWRpci5leGlzdHMoKSkKLSAgICAgICAgICAgIGRpciA9IGRpci5nZXRQYXJlbnRGaWxlKCk7Ci0KLSAgICAgICAgcmV0dXJuIGRpciAhPSBudWxsID8gZGlyLmdldEFic29sdXRlUGF0aCgpIDogU3lzdGVtCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0JLyoKLQkgKiBzZWUgb3JnLmVjbGlwc2UuamZhY2UuV2luZG93LmdldEluaXRpYWxMb2NhdGlvbigpIAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsTG9jYXRpb24oUG9pbnQgaW5pdGlhbFNpemUpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IGdldFNoZWxsKCkuZ2V0UGFyZW50KCk7Ci0JCQotCQlpZiAoIWNlbnRlck9uTW9uaXRvciB8fCBwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5nZXRJbml0aWFsTG9jYXRpb24oaW5pdGlhbFNpemUpOwotCi0JCU1vbml0b3IgbW9uaXRvciA9IHBhcmVudC5nZXRNb25pdG9yKCk7Ci0JCVJlY3RhbmdsZSBtb25pdG9yQm91bmRzID0gbW9uaXRvci5nZXRDbGllbnRBcmVhKCk7Ci0JCVBvaW50IGNlbnRlclBvaW50ID0gR2VvbWV0cnkuY2VudGVyUG9pbnQobW9uaXRvckJvdW5kcyk7Ci0KLQkJcmV0dXJuIG5ldyBQb2ludChjZW50ZXJQb2ludC54IC0gKGluaXRpYWxTaXplLnggLyAyKSwgTWF0aC5tYXgoCi0JCQkJbW9uaXRvckJvdW5kcy55LCBNYXRoLm1pbihjZW50ZXJQb2ludC55Ci0JCQkJCQktIChpbml0aWFsU2l6ZS55ICogMiAvIDMpLCBtb25pdG9yQm91bmRzLnkKLQkJCQkJCSsgbW9uaXRvckJvdW5kcy5oZWlnaHQgLSBpbml0aWFsU2l6ZS55KSkpOwotCX0KLQotICAgIC8qKgotICAgICAqIFRoZSBzaG93IGRpYWxvZyBidXR0b24gYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSB0byBuZXZlbiBiZSBuYWdnZWQgYWdhaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNob3dEaWFsb2dCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBwYW5lbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLSAgICAgICAgcGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotICAgICAgICBwYW5lbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmVsLCBTV1QuQ0hFQ0spOwotICAgICAgICBidXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5DaG9vc2VXb3Jrc3BhY2VEaWFsb2dfdXNlRGVmYXVsdE1lc3NhZ2UpOwotICAgICAgICBidXR0b24uc2V0U2VsZWN0aW9uKCFsYXVuY2hEYXRhLmdldFNob3dEaWFsb2coKSk7Ci0gICAgICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBsYXVuY2hEYXRhLnRvZ2dsZVNob3dEaWFsb2coKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxUZXh0VmFsdWVzKENvbWJvIHRleHQpIHsKLSAgICAgICAgU3RyaW5nW10gcmVjZW50V29ya3NwYWNlcyA9IGxhdW5jaERhdGEuZ2V0UmVjZW50V29ya3NwYWNlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY2VudFdvcmtzcGFjZXMubGVuZ3RoOyArK2kpCi0gICAgICAgICAgICBpZiAocmVjZW50V29ya3NwYWNlc1tpXSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRleHQuYWRkKHJlY2VudFdvcmtzcGFjZXNbaV0pOwotCi0gICAgICAgIHRleHQuc2V0VGV4dCh0ZXh0LmdldEl0ZW1Db3VudCgpID4gMCA/IHRleHQuZ2V0SXRlbSgwKSA6IGxhdW5jaERhdGEKLSAgICAgICAgICAgICAgICAuZ2V0SW5pdGlhbERlZmF1bHQoKSk7Ci0gICAgfQotICAgIAotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5EaWFsb2cjZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKQotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjIKLSAgICAgKi8KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ0JvdW5kc1NldHRpbmdzKCkgewotCQkvLyBJZiB3ZSB3ZXJlIGV4cGxpY2l0bHkgaW5zdHJ1Y3RlZCB0byBjZW50ZXIgb24gdGhlIG1vbml0b3IsIHRoZW4KLQkJLy8gZG8gbm90IHByb3ZpZGUgYW55IHNldHRpbmdzIGZvciByZXRyaWV2aW5nIGEgZGlmZmVyZW50IGxvY2F0aW9uIG9yLCB3b3JzZSwKLQkJLy8gc2F2aW5nIHRoZSBjZW50ZXJlZCBsb2NhdGlvbi4KLQkJaWYgKGNlbnRlck9uTW9uaXRvcikgCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBzZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HU19TRUNUSU9OKTsKLSAgICAgICAgaWYgKHNlY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04pOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvRGVmYXVsdENvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0RlZmF1bHRDb250cmlidXRvclJlc291cmNlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTYwM2VkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvRGVmYXVsdENvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklDb250cmlidXRvclJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyMjsKLQotLyoqCi0gKiBUaGUgRGVmYXVsdENvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyIGlzIHRoZSBkZWZhdWx0Ci0gKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyIHVzZWQgZm9yIAotICogb25lIHRvIG9uZSByZXNvdXJjZSBhZGFwdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRDb250cmlidXRvclJlc291cmNlQWRhcHRlciBpbXBsZW1lbnRzCi0gICAgICAgIElDb250cmlidXRvclJlc291cmNlQWRhcHRlcjIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyIHNpbmdsZXRvbjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBEZWZhdWx0Q29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIuCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRDb250cmlidXRvclJlc291cmNlQWRhcHRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgaW5zdGFuY2UgdXNlZCBmb3IgVGFza0xpc3QgYWRhcHRpbmcuCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBpbnN0YW5jZSB1c2VkIGZvciBUYXNrTGlzdCBhZGFwdGluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIGlmIChzaW5nbGV0b24gPT0gbnVsbCkKLSAgICAgICAgICAgIHNpbmdsZXRvbiA9IG5ldyBEZWZhdWx0Q29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIoKTsKLSAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyI2dldEFkYXB0ZWRSZXNvdXJjZShJQWRhcHRhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyBJUmVzb3VyY2UgZ2V0QWRhcHRlZFJlc291cmNlKElBZGFwdGFibGUgYWRhcHRhYmxlKSB7Ci0gICAgICAgIHJldHVybiAoSVJlc291cmNlKSBhZGFwdGFibGUuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNvdXJjZU1hcHBpbmcgZ2V0QWRhcHRlZFJlc291cmNlTWFwcGluZyhJQWRhcHRhYmxlIGFkYXB0YWJsZSkgewotICAgICAgICByZXR1cm4gKFJlc291cmNlTWFwcGluZykgYWRhcHRhYmxlLmdldEFkYXB0ZXIoUmVzb3VyY2VNYXBwaW5nLmNsYXNzKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvRGlhbG9nVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9EaWFsb2dVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YTNhNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9EaWFsb2dVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGhlbHAgd2l0aCBkaWFsb2dzLgotICogPHA+Ci0gKiBOb3RlIHRoYXQgYSBjb3B5IG9mIHRoaXMgY2xhc3MgZXhpc3RzIGluIHRoZQotICogb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwgcGFja2FnZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIERpYWxvZ1V0aWwgewotCi0gICAgLyoqCi0gICAgICogUHJldmVudCBpbnN0YW50aWF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgRGlhbG9nVXRpbCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVuIGFuIGVycm9yIHN0eWxlIGRpYWxvZyBmb3IgUGFydEluaXRFeGNlcHRpb24gYnkKLSAgICAgKiBpbmNsdWRpbmcgYW55IGV4dHJhIGluZm9ybWF0aW9uIGZyb20gdGhlIG5lc3RlZAotICAgICAqIENvcmVFeGNlcHRpb24gaWYgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgICAgICAgIFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAvLyBDaGVjayBmb3IgYSBuZXN0ZWQgQ29yZUV4Y2VwdGlvbgotICAgICAgICBDb3JlRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gZXhjZXB0aW9uLmdldFN0YXR1cygpOwotICAgICAgICBpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLSAgICAgICAgICAgIG5lc3RlZEV4Y2VwdGlvbiA9IChDb3JlRXhjZXB0aW9uKSBzdGF0dXMuZ2V0RXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgaWYgKG5lc3RlZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBPcGVuIGFuIGVycm9yIGRpYWxvZyBhbmQgaW5jbHVkZSB0aGUgZXh0cmEKLSAgICAgICAgICAgIC8vIHN0YXR1cyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBuZXN0ZWQgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UsIG5lc3RlZEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gT3BlbiBhIHJlZ3VsYXIgZXJyb3IgZGlhbG9nIHNpbmNlIHRoZXJlIGlzIG5vCi0gICAgICAgICAgICAvLyBleHRyYSBpbmZvcm1hdGlvbiB0byBkaXNwbGF5Ci0gICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihwYXJlbnQsIHRpdGxlLCBtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlICcmJyBhY2NlbGVyYXRvciBpbmRpY2F0b3IgZnJvbSBhIGxhYmVsLCBpZiBhbnkuCi0gICAgICogQWxzbyByZW1vdmVzIHRoZSAoKSBhY2NlbGVyYXRvcnMgd2hpY2ggYXJlIHVzZWQgaW4gQXNpYW4KLSAgICAgKiBsYW5ndWFnZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWNjZWwoU3RyaW5nIGxhYmVsKSB7Ci0KLSAgICAgICAgaW50IHN0YXJ0QnJhY2tldCA9IGxhYmVsLmluZGV4T2YoIigmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLy9Ob24gbGF0aW4gYWNjZWxlcmF0b3I/Ci0gICAgICAgIGlmIChzdGFydEJyYWNrZXQgPj0gMCkgewotICAgICAgICAgICAgaW50IGVuZEJyYWNrZXQgPSBsYWJlbC5pbmRleE9mKCcpJyk7Ci0KLSAgICAgICAgICAgIC8vSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgaXQgaXMgbm90IGFuIGFjY2VsZXJhdG9yCi0gICAgICAgICAgICBpZiAoKGVuZEJyYWNrZXQgLSBzdGFydEJyYWNrZXQpID09IDMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnN1YnN0cmluZygwLCBzdGFydEJyYWNrZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsLnN1YnN0cmluZyhlbmRCcmFja2V0ICsgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaSA9IGxhYmVsLmluZGV4T2YoJyYnKTsKLSAgICAgICAgaWYgKGkgPj0gMCkKLSAgICAgICAgICAgIGxhYmVsID0gbGFiZWwuc3Vic3RyaW5nKDAsIGkpICsgbGFiZWwuc3Vic3RyaW5nKGkgKyAxKTsKLQotICAgICAgICByZXR1cm4gbGFiZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygcm93cyBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgZGlzcGxheSB1c2luZyB0aGUKLSAgICAgKiBjdXJyZW50IGZvbnQuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgQ29tcG9zaXRlIHdob3NlIEZvbnQgd2lsbCBiZSBxdWVyaWVkLgotICAgICAqIEByZXR1cm4gaW50IFRoZSByZXN1bHQgb2YgdGhlIGRpc3BsYXkgc2l6ZSBkaXZpZGVkIGJ5IHRoZSBmb250IHNpemUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgYXZhaWxhYmxlUm93cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgaW50IGZvbnRIZWlnaHQgPSAocGFyZW50LmdldEZvbnQoKS5nZXRGb250RGF0YSgpKVswXS5nZXRIZWlnaHQoKTsKLSAgICAgICAgaW50IGRpc3BsYXlIZWlnaHQgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKS5oZWlnaHQ7Ci0KLSAgICAgICAgcmV0dXJuIGRpc3BsYXlIZWlnaHQgLyBmb250SGVpZ2h0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgZm9udCBpbiB0aGUgcGFyZW50IGlzIHRoZSBzaXplIG9mIGEgcmVndWxhcgotICAgICAqIGZvbnQuICBUeXBpY2FsbHkgdXNlZCB0byBrbm93IGlmIGEgZm9udCBpcyBzbWFsbGVyIHRoYW4gdGhlIEhpZ2ggQ29udHJhc3QgCi0gICAgICogRm9udC4gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBtYWtlIGxheW91dCBkZWNpc2lvbnMgYmFzZWQgb24gc2NyZWVuIHNwYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIENvbXBvc2l0ZSB3aG9zZSBGb250IHdpbGwgYmUgcXVlcmllZC4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4uIFRydWUgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiA1MCBsaW5lcyBvZiBwb3NzaWJsZQotICAgICAqIHRleHQgaW4gdGhlIGRpc3BsYXkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGluUmVndWxhckZvbnRNb2RlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICByZXR1cm4gYXZhaWxhYmxlUm93cyhwYXJlbnQpID4gNTA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9FZGl0b3JBcmVhRHJvcEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvRWRpdG9yQXJlYURyb3BBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjlkODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9FZGl0b3JBcmVhRHJvcEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvcklucHV0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NYXJrZXJUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlJlc291cmNlVHJhbnNmZXI7Ci0KLS8qKgotICogQW4gZWRpdG9yIGFyZWEgZHJvcCBhZGFwdGVyIHRvIGhhbmRsZSB0cmFuc2ZlciB0eXBlcwotICogPGNvZGU+RWRpdG9ySW5wdXRUcmFuc2ZlcjwvY29kZT4sIDxjb2RlPk1hcmtlclRyYW5zZmVyPC9jb2RlPiwKLSAqIGFuZCA8Y29kZT5SZXNvdXJjZVRyYW5zZmVyPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIEVkaXRvckFyZWFEcm9wQWRhcHRlciBleHRlbmRzIERyb3BUYXJnZXRBZGFwdGVyIHsKLSAgICBwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBFZGl0b3JBcmVhRHJvcEFkYXB0ZXIuCi0gICAgICogQHBhcmFtIHdpbmRvdyB0aGUgd29ya2JlbmNoIHdpbmRvdwotICAgICAqLwotICAgIHB1YmxpYyBFZGl0b3JBcmVhRHJvcEFkYXB0ZXIoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotICAgICAgICAvLyBhbHdheXMgaW5kaWNhdGUgYSBjb3B5Ci0gICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vIGFsd2F5cyBpbmRpY2F0ZSBhIGNvcHkKLSAgICAgICAgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkcm9wKGZpbmFsIERyb3BUYXJnZXRFdmVudCBldmVudCkgewotICAgICAgICBEaXNwbGF5IGQgPSB3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0gICAgICAgIGZpbmFsIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBpZiAocGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBhc3luY0Ryb3AoZXZlbnQsIHBhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzeW5jRHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQotICAgICAgICAvKiBPcGVuIEVkaXRvciBmb3IgZ2VuZXJpYyBJRWRpdG9ySW5wdXQgKi8KLSAgICAgICAgaWYgKEVkaXRvcklucHV0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoCi0gICAgICAgICAgICAgICAgZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotICAgICAgICAgICAgLyogZXZlbnQuZGF0YSBpcyBhbiBhcnJheSBvZiBFZGl0b3JJbnB1dERhdGEsIHdoaWNoIGNvbnRhaW5zIGFuIElFZGl0b3JJbnB1dCBhbmQgCi0gICAgICAgICAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBlZGl0b3JJZCAqLwotICAgICAgICAgICAgQXNzZXJ0Ci0gICAgICAgICAgICAgICAgICAgIC5pc1RydWUoZXZlbnQuZGF0YSBpbnN0YW5jZW9mIEVkaXRvcklucHV0VHJhbnNmZXIuRWRpdG9ySW5wdXREYXRhW10pOwotICAgICAgICAgICAgRWRpdG9ySW5wdXRUcmFuc2Zlci5FZGl0b3JJbnB1dERhdGFbXSBlZGl0b3JJbnB1dHMgPSAoRWRpdG9ySW5wdXRUcmFuc2Zlci5FZGl0b3JJbnB1dERhdGEgW10pIGV2ZW50LmRhdGE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvcklucHV0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvcklucHV0c1tpXS5pbnB1dDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZWRpdG9ySWQgPSBlZGl0b3JJbnB1dHNbaV0uZWRpdG9ySWQ7Ci0gICAgICAgICAgICAgICAgb3Blbk5vbkV4dGVybmFsRWRpdG9yKHBhZ2UsIGVkaXRvcklucHV0LCBlZGl0b3JJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBPcGVuIEVkaXRvciBmb3IgTWFya2VyIChlLmcuIFRhc2tzLCBCb29rbWFya3MsIGV0YykgKi8KLSAgICAgICAgZWxzZSBpZiAoTWFya2VyVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoCi0gICAgICAgICAgICAgICAgZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotICAgICAgICAgICAgQXNzZXJ0LmlzVHJ1ZShldmVudC5kYXRhIGluc3RhbmNlb2YgSU1hcmtlcltdKTsKLSAgICAgICAgICAgIElNYXJrZXJbXSBtYXJrZXJzID0gKElNYXJrZXJbXSkgZXZlbnQuZGF0YTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIG9wZW5Ob25FeHRlcm5hbEVkaXRvcihwYWdlLCBtYXJrZXJzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIE9wZW4gRWRpdG9yIGZvciByZXNvdXJjZSAqLwotICAgICAgICBlbHNlIGlmIChSZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKAotICAgICAgICAgICAgICAgIGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUoZXZlbnQuZGF0YSBpbnN0YW5jZW9mIElSZXNvdXJjZVtdKTsKLSAgICAgICAgICAgIElSZXNvdXJjZVtdIGZpbGVzID0gKElSZXNvdXJjZVtdKSBldmVudC5kYXRhOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChmaWxlc1tpXSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIGZpbGVzW2ldOwotICAgICAgICAgICAgICAgICAgICBvcGVuTm9uRXh0ZXJuYWxFZGl0b3IocGFnZSwgZmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlZGl0b3IgZm9yIHRoZSBnaXZlbiBmaWxlIG9uIHRoZSBnaXZlbiB3b3JrYmVuY2ggcGFnZSBpbiByZXNwb25zZQotICAgICAqIHRvIGEgZHJvcCBvbiB0aGUgd29ya2JlbmNoIGVkaXRvciBhcmVhLiBJbiBjb250cmFzdCB0byBvdGhlciB3YXlzIG9mIG9wZW5pbmcKLSAgICAgKiBhbiBlZGl0b3IsIHdlIG5ldmVyIG9wZW4gYW4gZXh0ZXJuYWwgZWRpdG9yIGluIHRoaXMgY2FzZSAoc2luY2UgZXh0ZXJuYWwKLSAgICAgKiBlZGl0b3JzIGFwcGVhciBpbiB0aGVpciBvd24gd2luZG93IGFuZCBub3QgaW4gdGhlIGVkaXRvciBhcmVhKS4KLSAgICAgKiBUaGUgb3BlcmF0aW9uIGZhaWxzIHNpbGVudGx5IGlmIHRoZXJlIGlzIG5vIHN1aXRhYmxlIGVkaXRvciB0byBvcGVuLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWdlIHRoZSB3b3JrYmVuY2ggcGFnZQotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRvIG9wZW4KLSAgICAgKiBAcmV0dXJuIHRoZSBlZGl0b3IgcGFydCB0aGF0IHdhcyBvcGVuZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGVkaXRvcgotICAgICAqIHdhcyBvcGVuZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIElFZGl0b3JQYXJ0IG9wZW5Ob25FeHRlcm5hbEVkaXRvcihJV29ya2JlbmNoUGFnZSBwYWdlLCBJRmlsZSBmaWxlKSB7Ci0gICAgICAgIElFZGl0b3JQYXJ0IHJlc3VsdDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpbmQgb3V0IHdoaWNoIGVkaXRvciB3ZSB3b3VsZCBub3JtYWwgb3BlbgotICAgICAgICAgICAgSUVkaXRvckRlc2NyaXB0b3IgZGVmYXVsdEVkaXRvckRlc2MgPSBJREUuZ2V0RGVmYXVsdEVkaXRvcihmaWxlKTsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0RWRpdG9yRGVzYyAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFkZWZhdWx0RWRpdG9yRGVzYy5pc09wZW5FeHRlcm5hbCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gb3BlbiBhbiBpbnRlcm5hbCBvciBpbi1wbGFjZSBlZGl0b3IKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbmV2ZXIgb3BlbiBhbiBleHRlcm5hbCBlZGl0b3IgaW4gcmVzcG9uc2UgdG8gYSBkcm9wCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIE9TIGZvciBpbi1wbGFjZSBlZGl0b3IgKE9MRSBvbiBXaW4zMikKLSAgICAgICAgICAgICAgICBJRWRpdG9yUmVnaXN0cnkgZWRpdG9yUmVnID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICAgICAgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzYyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGVkaXRvclJlZy5pc1N5c3RlbUluUGxhY2VFZGl0b3JBdmFpbGFibGUoZmlsZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVkaXRvckRlc2MgPSBlZGl0b3JSZWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZEVkaXRvcihJRWRpdG9yUmVnaXN0cnkuU1lTVEVNX0lOUExBQ0VfRURJVE9SX0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb2t1cCB0aGUgZGVmYXVsdCB0ZXh0IGVkaXRvcgotICAgICAgICAgICAgICAgIGlmIChlZGl0b3JEZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZWRpdG9yRGVzYyA9IGVkaXRvclJlZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kRWRpdG9yKElERVdvcmtiZW5jaFBsdWdpbi5ERUZBVUxUX1RFWFRfRURJVE9SX0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiBubyB2YWxpZCBlZGl0b3IgZm91bmQsIGJhaWwgb3V0Ci0gICAgICAgICAgICAgICAgaWYgKGVkaXRvckRlc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oSURFV29ya2JlbmNoTWVzc2FnZXMuSURFX25vRmlsZUVkaXRvckZvdW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBvcGVuIHRoZSBlZGl0b3Igb24gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZWRpdG9yRGVzYwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldElkKCksIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBzaWxlbnRseSBpZ25vcmUgcHJvYmxlbXMgb3BlbmluZyB0aGUgZWRpdG9yCi0gICAgICAgICAgICByZXN1bHQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYW4gZWRpdG9yIGZvciB0aGUgZ2l2ZW4gbWFya2VyIG9uIHRoZSBnaXZlbiB3b3JrYmVuY2ggcGFnZSBpbiByZXNwb25zZQotICAgICAqIHRvIGEgZHJvcCBvbiB0aGUgd29ya2JlbmNoIGVkaXRvciBhcmVhLiBJbiBjb250cmFzdCB0byBvdGhlciB3YXlzIG9mIG9wZW5pbmcKLSAgICAgKiBhbiBlZGl0b3IsIHdlIG5ldmVyIG9wZW4gYW4gZXh0ZXJuYWwgZWRpdG9yIGluIHRoaXMgY2FzZSAoc2luY2UgZXh0ZXJuYWwKLSAgICAgKiBlZGl0b3JzIGFwcGVhciBpbiB0aGVpciBvd24gd2luZG93IGFuZCBub3QgaW4gdGhlIGVkaXRvciBhcmVhKS4KLSAgICAgKiBUaGUgb3BlcmF0aW9uIGZhaWxzIHNpbGVudGx5IGlmIHRoZXJlIGlzIG5vIHN1aXRhYmxlIGVkaXRvciB0byBvcGVuLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWdlIHRoZSB3b3JrYmVuY2ggcGFnZQotICAgICAqIEBwYXJhbSBtYXJrZXIgdGhlIG1hcmtlciB0byBvcGVuCi0gICAgICogQHJldHVybiB0aGUgZWRpdG9yIHBhcnQgdGhhdCB3YXMgb3BlbmVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBlZGl0b3IKLSAgICAgKiB3YXMgb3BlbmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBJRWRpdG9yUGFydCBvcGVuTm9uRXh0ZXJuYWxFZGl0b3IoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLSAgICAgICAgICAgIElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIElFZGl0b3JQYXJ0IHJlc3VsdDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbWFya2VyIHJlc291cmNlIGZpbGUKLSAgICAgICAgICAgIGlmICghKG1hcmtlci5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSUZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcmVmZXJyZWQgZWRpdG9yIGlkIGZyb20gdGhlIG1hcmtlcgotICAgICAgICAgICAgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzYyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlZGl0b3JJRCA9IChTdHJpbmcpIG1hcmtlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShJREUuRURJVE9SX0lEX0FUVFIpOwotICAgICAgICAgICAgICAgIGlmIChlZGl0b3JJRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIElFZGl0b3JSZWdpc3RyeSBlZGl0b3JSZWcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGVkaXRvckRlc2MgPSBlZGl0b3JSZWcuZmluZEVkaXRvcihlZGl0b3JJRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIHByb2JsZW1zIHdpdGggZ2V0dGluZyB0aGUgbWFya2VyCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG9wZW4gdGhlIGVkaXRvciBvbiB0aGUgbWFya2VyIHJlc291cmNlIGZpbGUKLSAgICAgICAgICAgIGlmIChlZGl0b3JEZXNjICE9IG51bGwgJiYgIWVkaXRvckRlc2MuaXNPcGVuRXh0ZXJuYWwoKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBlZGl0b3JEZXNjCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SWQoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9wZW5Ob25FeHRlcm5hbEVkaXRvcihwYWdlLCBmaWxlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBlZGl0b3IgdG8gdXBkYXRlIGl0cyBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgbWFya2VyCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJREUuZ290b01hcmtlcihyZXN1bHQsIG1hcmtlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gc2lsZW50bHkgaWdub3JlIHByb2JsZW1zIG9wZW5pbmcgdGhlIGVkaXRvcgotICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIGFuIGVkaXRvciBmb3IgdGhlIGdpdmVuIGVkaXRvciBpbnB1dCBhbmQgZWRpdG9yIGlkIGNvbWJpbmF0aW9uIG9uIHRoZQotICAgICAqIGdpdmVuIHdvcmtiZW5jaCBwYWdlIGluIHJlc3BvbnNlIHRvIGEgZHJvcCBvbiB0aGUgd29ya2JlbmNoIGVkaXRvciBhcmVhLgotICAgICAqIEluIGNvbnRyYXN0IHRvIG90aGVyIHdheXMgb2Ygb3BlbmluZyBhbiBlZGl0b3IsIHdlIG5ldmVyIG9wZW4gYW4gZXh0ZXJuYWwKLSAgICAgKiBlZGl0b3IgaW4gdGhpcyBjYXNlIChzaW5jZSBleHRlcm5hbCBlZGl0b3JzIGFwcGVhciBpbiB0aGVpciBvd24gd2luZG93IGFuZAotICAgICAqIG5vdCBpbiB0aGUgZWRpdG9yIGFyZWEpLiBUaGUgb3BlcmF0aW9uIGZhaWxzIHNpbGVudGx5IGlmIHRoZSBlZGl0b3IKLSAgICAgKiBjYW5ub3QgYmUgb3BlbmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWdlIHRoZSB3b3JrYmVuY2ggcGFnZQotICAgICAqIEBwYXJhbSBlZGl0b3JJbnB1dCB0aGUgZWRpdG9yIGlucHV0Ci0gICAgICogQHBhcmFtIGVkaXRvcklkIHRoZSBlZGl0b3IgaWQKLSAgICAgKiBAcmV0dXJuIHRoZSBlZGl0b3IgcGFydCB0aGF0IHdhcyBvcGVuZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGVkaXRvcgotICAgICAqIHdhcyBvcGVuZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIElFZGl0b3JQYXJ0IG9wZW5Ob25FeHRlcm5hbEVkaXRvcihJV29ya2JlbmNoUGFnZSBwYWdlLAotICAgICAgICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBTdHJpbmcgZWRpdG9ySWQpIHsKLSAgICAgICAgSUVkaXRvclBhcnQgcmVzdWx0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUVkaXRvclJlZ2lzdHJ5IGVkaXRvclJlZyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICBJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3JEZXNjID0gZWRpdG9yUmVnLmZpbmRFZGl0b3IoZWRpdG9ySWQpOwotICAgICAgICAgICAgaWYgKGVkaXRvckRlc2MgIT0gbnVsbCAmJiAhZWRpdG9yRGVzYy5pc09wZW5FeHRlcm5hbCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcGFnZS5vcGVuRWRpdG9yKGVkaXRvcklucHV0LCBlZGl0b3JJZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHNpbGVudGx5IGlnbm9yZSBwcm9ibGVtcyBvcGVuaW5nIHRoZSBlZGl0b3IKLSAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvRmVhdHVyZVNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9GZWF0dXJlU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzYxMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9GZWF0dXJlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLlNpbXBsZUxpc3RDb250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogRGlhbG9nIHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZlYXR1cmUgZnJvbSBhIGxpc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uRGlhbG9nIHsKLSAgICAvKioKLSAgICAgKiBMaXN0IHdpZHRoIGluIGNoYXJhY3RlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IExJU1RfV0lEVEggPSA2MDsKLQotICAgIC8qKgotICAgICAqIExpc3QgaGVpZ2h0IGluIGNoYXJhY3RlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IExJU1RfSEVJR0hUID0gMTA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBhYm91dCBpbmZvcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEFib3V0SW5mb1tdIGZlYXR1cmVzOwotCi0gICAgLyoqCi0gICAgICogTGlzdCB0byBkaXNwbGF5IHRoZSByZXNvbHV0aW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3RWaWV3ZXIgbGlzdFZpZXdlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBoZWxwIGNvbnRleHQgaWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBoZWxwQ29udGV4dElkOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGRpYWxvZyB0byBkaXNwbGF5Ci0gICAgICogdGhlIGdpdmVuIGZlYXR1cmVzLgotICAgICAqIDxwPgotICAgICAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGZlYXR1cmUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaGVsbCAgdGhlIHBhcmVudCBzaGVsbAotICAgICAqIEBwYXJhbSBmZWF0dXJlcyAgdGhlIGZlYXR1cmVzIHRvIGRpc3BsYXkKLSAgICAgKiBAcGFyYW0gcHJpbWFyeUZlYXR1cmVJZCAgdGhlIGlkIG9mIHRoZSBwcmltYXJ5IGZlYXR1cmUgb3IgbnVsbCBpZiBub25lCi0gICAgICogQHBhcmFtIHNoZWxsVGl0bGUgIHNoZWxsIHRpdGxlCi0gICAgICogQHBhcmFtIHNoZWxsTWVzc2FnZSAgc2hlbGwgbWVzc2FnZQotICAgICAqIEBwYXJhbSBoZWxwQ29udGV4dElkICBoZWxwIGNvbnRleHQgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRmVhdHVyZVNlbGVjdGlvbkRpYWxvZyhTaGVsbCBzaGVsbCwgQWJvdXRJbmZvW10gZmVhdHVyZXMsCi0gICAgICAgICAgICBTdHJpbmcgcHJpbWFyeUZlYXR1cmVJZCwgU3RyaW5nIHNoZWxsVGl0bGUsIFN0cmluZyBzaGVsbE1lc3NhZ2UsCi0gICAgICAgICAgICBTdHJpbmcgaGVscENvbnRleHRJZCkgewotCi0gICAgICAgIHN1cGVyKHNoZWxsKTsKLSAgICAgICAgaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0gICAgICAgIHRoaXMuaGVscENvbnRleHRJZCA9IGhlbHBDb250ZXh0SWQ7Ci0gICAgICAgIHNldFRpdGxlKHNoZWxsVGl0bGUpOwotICAgICAgICBzZXRNZXNzYWdlKHNoZWxsTWVzc2FnZSk7Ci0KLSAgICAgICAgLy8gU29ydCBhc2NlbmRpbmcKLSAgICAgICAgQXJyYXlzLnNvcnQoZmVhdHVyZXMsIG5ldyBDb21wYXJhdG9yKCkgewotICAgICAgICAgICAgQ29sbGF0b3IgY29sbCA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5nZXREZWZhdWx0KCkpOwotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0gICAgICAgICAgICAgICAgQWJvdXRJbmZvIGkxLCBpMjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTEsIG5hbWUyOwotICAgICAgICAgICAgICAgIGkxID0gKEFib3V0SW5mbykgYTsKLSAgICAgICAgICAgICAgICBuYW1lMSA9IGkxLmdldEZlYXR1cmVMYWJlbCgpOwotICAgICAgICAgICAgICAgIGkyID0gKEFib3V0SW5mbykgYjsKLSAgICAgICAgICAgICAgICBuYW1lMiA9IGkyLmdldEZlYXR1cmVMYWJlbCgpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lMSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBuYW1lMSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIG5hbWUyID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm4gY29sbC5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIEZpbmQgcHJpbWFyeSBmZWF0dXJlCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmZWF0dXJlc1tpXS5nZXRGZWF0dXJlSWQoKS5lcXVhbHMocHJpbWFyeUZlYXR1cmVJZCkpIHsKLSAgICAgICAgICAgICAgICBzZXRJbml0aWFsU2VsZWN0aW9ucyhuZXcgT2JqZWN0W10geyBmZWF0dXJlc1tpXSB9KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgYSBzYWZlIGRlZmF1bHQJCQotICAgICAgICBzZXRJbml0aWFsU2VsZWN0aW9ucyhuZXcgT2JqZWN0WzBdKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpbmRvdy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmV3U2hlbGwsCi0JCQkJaGVscENvbnRleHRJZCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGxhYmVsCi0gICAgICAgIGNyZWF0ZU1lc3NhZ2VBcmVhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIC8vIENyZWF0ZSBsaXN0IHZpZXdlcgkKLSAgICAgICAgbGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotICAgICAgICAgICAgICAgIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyhMSVNUX0hFSUdIVCk7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKExJU1RfV0lEVEgpOwotICAgICAgICBsaXN0Vmlld2VyLmdldExpc3QoKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBsaXN0Vmlld2VyLmdldExpc3QoKS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICAvLyBTZXQgdGhlIGxhYmVsIHByb3ZpZGVyCQkKLSAgICAgICAgbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBmZWF0dXJlcydzIGxhYmVsLgotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50ID09IG51bGwgPyAiIiA6ICgoQWJvdXRJbmZvKSBlbGVtZW50KS5nZXRGZWF0dXJlTGFiZWwoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBTZXQgdGhlIGNvbnRlbnQgcHJvdmlkZXIKLSAgICAgICAgU2ltcGxlTGlzdENvbnRlbnRQcm92aWRlciBjcCA9IG5ldyBTaW1wbGVMaXN0Q29udGVudFByb3ZpZGVyKCk7Ci0gICAgICAgIGNwLnNldEVsZW1lbnRzKGZlYXR1cmVzKTsKLSAgICAgICAgbGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY3ApOwotICAgICAgICBsaXN0Vmlld2VyLnNldElucHV0KG5ldyBPYmplY3QoKSk7Ci0gICAgICAgIC8vIGl0IGlzIGlnbm9yZWQgYnV0IG11c3QgYmUgbm9uLW51bGwKLQotICAgICAgICAvLyBTZXQgdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0gICAgICAgIGxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotICAgICAgICAgICAgICAgIGdldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucygpKSwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gQWRkIGEgc2VsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lcgotICAgICAgICBsaXN0Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIE9LIGJ1dHRvbiBlbmFibGVtZW50Ci0gICAgICAgICAgICAgICAgZ2V0T2tCdXR0b24oKS5zZXRFbmFibGVkKCFldmVudC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBBZGQgZG91YmxlLWNsaWNrIGxpc3RlbmVyCi0gICAgICAgIGxpc3RWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgb2tQcmVzc2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBsaXN0Vmlld2VyCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICBzZXRSZXN1bHQoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLSAgICAgICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JREVBcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JREVBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDVmYTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvSURFQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGxhdGZvcm1SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhlICJtYWluIHByb2dyYW0iIGZvciB0aGUgRWNsaXBzZSBJREUuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIElERUFwcGxpY2F0aW9uIGltcGxlbWVudHMgSVBsYXRmb3JtUnVubmFibGUsIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgY29udGFpbmluZyBtZXRhZGF0YSBpbmZvcm1hdGlvbiBmb3IgdGhlIHdvcmtzcGFjZS4KLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9GT0xERVIgPSAiLm1ldGFkYXRhIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRklMRU5BTUUgPSAidmVyc2lvbi5pbmkiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS1NQQUNFX1ZFUlNJT05fS0VZID0gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLU1BBQ0VfVkVSU0lPTl9WQUxVRSA9ICIxIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRVhJVF9DT0RFID0gImVjbGlwc2UuZXhpdGNvZGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBBIHNwZWNpYWwgcmV0dXJuIGNvZGUgdGhhdCB3aWxsIGJlIHJlY29nbml6ZWQgYnkgdGhlIGxhdW5jaGVyIGFuZCB1c2VkIHRvCi0gICAgICogcmVzdGFydCB0aGUgd29ya2JlbmNoLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgRVhJVF9SRUxBVU5DSCA9IG5ldyBJbnRlZ2VyKDI0KTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fSlZNX1ZFUlNJT05fTUFKT1IgPSAxOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9KVk1fVkVSU0lPTl9NSU5PUiA9IDQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0pWTV9WRVJTSU9OX1NFUlZJQ0UgPSAxOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBJREUgYXBwbGljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIElERUFwcGxpY2F0aW9uKCkgewotICAgICAgICAvLyBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGZvciBJREVBcHBsaWNhdGlvbgotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuYm9vdC5JUGxhdGZvcm1SdW5uYWJsZSNydW4oamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJ1bihPYmplY3QgYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IGNyZWF0ZURpc3BsYXkoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULk9OX1RPUCk7Ci0KLSAgICAgICAgICAgIGlmICghY2hlY2tKYXZhUnVudGltZVZlcnNpb24oc2hlbGwpKSB7Ci0gICAgICAgICAgICAgICAgUGxhdGZvcm0uZW5kU3BsYXNoKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfT0s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjaGVja0luc3RhbmNlTG9jYXRpb24oc2hlbGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBsYXRmb3JtLmVuZFNwbGFzaCgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9PSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChzaGVsbCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzaGVsbC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgd29ya2JlbmNoIHdpdGggdGhpcyBhZHZpc29yIGFuZCBydW4gaXQgdW50aWwgaXQgZXhpdHMKLSAgICAgICAgICAgIC8vIE4uQi4gY3JlYXRlV29ya2JlbmNoIHJlbWVtYmVycyB0aGUgYWR2aXNvciwgYW5kIGFsc28gcmVnaXN0ZXJzCi0gICAgICAgICAgICAvLyB0aGUgd29ya2JlbmNoIGdsb2JhbGx5IHNvIHRoYXQgYWxsIFVJIHBsdWctaW5zIGNhbiBmaW5kIGl0IHVzaW5nCi0gICAgICAgICAgICAvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpIG9yIEFic3RyYWN0VUlQbHVnaW4uZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IElERVdvcmtiZW5jaEFkdmlzb3IoKSk7Ci0KLSAgICAgICAgICAgIC8vIHRoZSB3b3JrYmVuY2ggZG9lc24ndCBzdXBwb3J0IHJlbGF1bmNoIHlldCAoYnVnIDYxODA5KSBzbwotICAgICAgICAgICAgLy8gZm9yIG5vdyByZXN0YXJ0IGlzIHVzZWQsIGFuZCBleGl0IGRhdGEgcHJvcGVydGllcyBhcmUgY2hlY2tlZAotICAgICAgICAgICAgLy8gaGVyZSB0byBzdWJzdGl0dXRlIGluIHRoZSByZWxhdW5jaCByZXR1cm4gY29kZSBpZiBuZWVkZWQKLSAgICAgICAgICAgIGlmIChyZXR1cm5Db2RlICE9IFBsYXRmb3JtVUkuUkVUVVJOX1JFU1RBUlQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfT0s7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSBleGl0IGNvZGUgcHJvcGVydHkgaGFzIGJlZW4gc2V0IHRvIHRoZSByZWxhdW5jaCBjb2RlLCB0aGVuCi0gICAgICAgICAgICAvLyByZXR1cm4gdGhhdCBjb2RlIG5vdywgb3RoZXJ3aXNlIHRoaXMgaXMgYSBub3JtYWwgcmVzdGFydAotICAgICAgICAgICAgcmV0dXJuIEVYSVRfUkVMQVVOQ0guZXF1YWxzKEludGVnZXIuZ2V0SW50ZWdlcihQUk9QX0VYSVRfQ09ERSkpID8gRVhJVF9SRUxBVU5DSAotICAgICAgICAgICAgICAgICAgICA6IEVYSVRfUkVTVEFSVDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChkaXNwbGF5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZGlzcGxheS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkaXNwbGF5IHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRpc3BsYXkgdXNlZCBieSB0aGUgYXBwbGljYXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGlzcGxheSBjcmVhdGVEaXNwbGF5KCkgewotICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5jcmVhdGVEaXNwbGF5KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLAotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGhlcmUgaXMgbm90aGluZyB0byBkbyBmb3IgSURFQXBwbGljYXRpb24KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHZlcnNpb24gb2YgdGhlIEphdmEgcnVudGltZQotICAgICAqICgiamF2YS52ZXJzaW9uIiBzeXN0ZW0gcHJvcGVydHkpIGlzIGRlZW1lZCB0byBiZSBjb21wYXRpYmxlIHdpdGggRWNsaXBzZS4gIAotICAgICAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGNvbXBhcmVzIG9ubHkgdGhlIHZlcnNpb24gKGFuZCBub3QgdGhpbmdzIGxpa2UgdmVuZG9yIG5hbWUpLCAKLSAgICAgKiB3aGljaCBtYXRjaGVzIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZWQgdG8gYmUgaW4gdGhlIHJ1bnRpbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrSmF2YVJ1bnRpbWVWZXJzaW9uKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlVmVyc2lvbihTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAvLyBidWlsZCB0aGUgcmVxdWlyZW1lbnQgaW50byBhIHZlcnNpb24gc3RyaW5nCi0gICAgICAgICAgICBTdHJpbmcgcmVxVmVyc2lvbiA9IEludGVnZXIudG9TdHJpbmcoTUlOX0pWTV9WRVJTSU9OX01BSk9SKSArICcuJwotICAgICAgICAgICAgICAgICAgICArIE1JTl9KVk1fVkVSU0lPTl9NSU5PUiArICcuJyArIE1JTl9KVk1fVkVSU0lPTl9TRVJWSUNFOwotCi0gICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgSURFV29ya2JlbmNoTWVzc2FnZXMuSURFQXBwbGljYXRpb25faW5jb21wYXRpYmxlSlZNVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX2luY29tcGF0aWJsZUpWTU1lc3NhZ2UsIHJlcVZlcnNpb24pKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHNlY3VyaXR5IG1hbmFnZXIgd29uJ3QgYWxsb3cgdXMgdG8gZ2V0IHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIC8vIHByb3BlcnR5LCBjb250aW51ZSBmb3Igbm93IGFuZCBsZXQgdGhpbmdzIGZhaWwgbGF0ZXIgb24KLSAgICAgICAgICAgIC8vIHRoZWlyIG93biBpZiBuZWNlc3NhcnkuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSB2ZXJzaW9uIHN0cmluZyB3YXMgaW4gYSBmb3JtYXQgdGhhdCB3ZSBkb24ndCB1bmRlcnN0YW5kLAotICAgICAgICAgICAgLy8gY29udGludWUgYW5kIGxldCB0aGluZ3MgZmFpbCBsYXRlciBvbiB0aGVpciBvd24gaWYgbmVjZXNzYXJ5LgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhIHZhbGlkIHdvcmtzcGFjZSBwYXRoIGhhcyBiZWVuIHNldCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIFByb21wdCBmb3IgYW5kIHNldCB0aGUgcGF0aCBpZiBwb3NzaWJsZSBhbmQgcmVxdWlyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgdmFsaWQgaW5zdGFuY2UgbG9jYXRpb24gaGFzIGJlZW4gc2V0IGFuZCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrSW5zdGFuY2VMb2NhdGlvbihTaGVsbCBzaGVsbCkgewotICAgICAgICAvLyAtZGF0YSBAbm9uZSB3YXMgc3BlY2lmaWVkIGJ1dCBhbiBpZGUgcmVxdWlyZXMgd29ya3NwYWNlCi0gICAgICAgIExvY2F0aW9uIGluc3RhbmNlTG9jID0gUGxhdGZvcm0uZ2V0SW5zdGFuY2VMb2NhdGlvbigpOwotICAgICAgICBpZiAoaW5zdGFuY2VMb2MgPT0gbnVsbCkgewotICAgICAgICAgICAgTWVzc2FnZURpYWxvZwotICAgICAgICAgICAgICAgICAgICAub3BlbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3dvcmtzcGFjZU1hbmRhdG9yeVRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3dvcmtzcGFjZU1hbmRhdG9yeU1lc3NhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gLWRhdGEgIi92YWxpZC9wYXRoIiwgd29ya3NwYWNlIGFscmVhZHkgc2V0Ci0gICAgICAgIGlmIChpbnN0YW5jZUxvYy5pc1NldCgpKSB7Ci0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG1ldGEgZGF0YSB2ZXJzaW9uIGlzIGNvbXBhdGlibGUgKG9yIHRoZSB1c2VyIGhhcwotICAgICAgICAgICAgLy8gY2hvc2VuIHRvIG92ZXJ3cml0ZSBpdCkuCi0gICAgICAgICAgICBpZiAoIWNoZWNrVmFsaWRXb3Jrc3BhY2Uoc2hlbGwsIGluc3RhbmNlTG9jLmdldFVSTCgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgaXRzIHZhbGlkLCBzbyB0cnkgdG8gbG9jayBpdCBhbmQgdXBkYXRlIHRoZQotICAgICAgICAgICAgLy8gbWV0YWRhdGEgdmVyc2lvbiBpbmZvcm1hdGlvbiBpZiBzdWNjZXNzZnVsCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZUxvYy5sb2NrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVXb3Jrc3BhY2VWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgICAgLm9wZW5FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuSURFQXBwbGljYXRpb25fd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuSURFQXBwbGljYXRpb25fd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5sb2coIkNvdWxkIG5vdCBvYnRhaW4gbG9jayBmb3Igd29ya3NwYWNlIGxvY2F0aW9uIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgZSk7ICAgICAgICAgICAgCQotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgICAub3BlbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5JbnRlcm5hbEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIC1kYXRhIEBub0RlZmF1bHQgb3IgLWRhdGEgbm90IHNwZWNpZmllZCwgcHJvbXB0IGFuZCBzZXQKLSAgICAgICAgQ2hvb3NlV29ya3NwYWNlRGF0YSBsYXVuY2hEYXRhID0gbmV3IENob29zZVdvcmtzcGFjZURhdGEoaW5zdGFuY2VMb2MKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdCgpKTsKLQotICAgICAgICBib29sZWFuIGZvcmNlID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBVUkwgd29ya3NwYWNlVXJsID0gcHJvbXB0Rm9yV29ya3NwYWNlKHNoZWxsLCBsYXVuY2hEYXRhLCBmb3JjZSk7Ci0gICAgICAgICAgICBpZiAod29ya3NwYWNlVXJsID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aXRoIHRoZSBmaXJzdCBzZWxlY3Rpb24sIHRoZW4gZm9yY2UgdGhlCi0gICAgICAgICAgICAvLyBkaWFsb2cgdG8gb3BlbiB0byBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGNvcnJlY3QKLSAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgdXJsIGlzIG5vdCBhIHZhbGlkCi0gICAgICAgICAgICAgICAgLy8gaW5zdGFuY2UgZGF0YSBhcmVhLCBzbyBvdGhlciBjaGVja2luZyBpcyB1bm5lZWRlZAotICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZUxvYy5zZXRVUkwod29ya3NwYWNlVXJsLCB0cnVlKSkgewotICAgICAgICAgICAgICAgICAgICBsYXVuY2hEYXRhLndyaXRlUGVyc2lzdGVkRGF0YSgpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVdvcmtzcGFjZVZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgICAgICAub3BlbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuSURFQXBwbGljYXRpb25fd29ya3NwYWNlQ2Fubm90QmVTZXRUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuSURFQXBwbGljYXRpb25fd29ya3NwYWNlQ2Fubm90QmVTZXRNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGJ5IHRoaXMgcG9pbnQgaXQgaGFzIGJlZW4gZGV0ZXJtaW5lZCB0aGF0IHRoZSB3b3Jrc3BhY2UgaXMKLSAgICAgICAgICAgIC8vIGFscmVhZHkgaW4gdXNlIC0tIGZvcmNlIHRoZSB1c2VyIHRvIGNob29zZSBhZ2FpbgotICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIElERVdvcmtiZW5jaE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUluVXNlVGl0bGUsIAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VJblVzZU1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGFyZ3VtZW50IHZlcnNpb24gaXMgPj0gdGhlIHByb2R1Y3QncyByZXF1aXJlbWVudCBhbmQKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuIFRoaXMgYWxnb3JpdGhtIChpbmNsdWRpbmcgYmVoYXZpb3VyIGluIGVycm9yIGNhc2VzKSB3YXMKLSAgICAgKiBjb3BpZWQgZnJvbSB0aGUgb2xkIGNvZGUgaW4gdGhlIHJ1bnRpbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbXBhdGlibGVWZXJzaW9uKFN0cmluZyB2bVZlcnNpb24pIHsKLSAgICAgICAgaWYgKHZtVmVyc2lvbiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZtVmVyc2lvbiwgIiAuXyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHJ1bm5pbmcgdm0ncyBtYWpvciBpcyA+PSB0aGUgcmVxdWlyZW1lbnQKLSAgICAgICAgICAgIGlmICghdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGludCBtYWpvciA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICAgICAgICAgIGlmIChtYWpvciAhPSBNSU5fSlZNX1ZFUlNJT05fTUFKT1IpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ham9yID4gTUlOX0pWTV9WRVJTSU9OX01BSk9SOwotCi0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHJ1bm5pbmcgdm0ncyBtaW5vciBpcyA+PSB0aGUgcmVxdWlyZW1lbnQKLSAgICAgICAgICAgIGlmICghdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGludCBtaW5vciA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICAgICAgICAgIGlmIChtaW5vciAhPSBNSU5fSlZNX1ZFUlNJT05fTUlOT1IpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1pbm9yID4gTUlOX0pWTV9WRVJTSU9OX01JTk9SOwotCi0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHJ1bm5pbmcgdm0ncyBzZXJ2aWNlIGlzID49IHRoZSByZXF1aXJlbWVudAotICAgICAgICAgICAgaWYgKCF0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaW50IHNlcnZpY2UgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZSA+PSBNSU5fSlZNX1ZFUlNJT05fU0VSVklDRTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHNlY3VyaXR5IG1hbmFnZXIgd29uJ3QgYWxsb3cgdXMgdG8gZ2V0IHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIC8vIHByb3BlcnR5LCBjb250aW51ZSBmb3Igbm93IGFuZCBsZXQgdGhpbmdzIGZhaWwgbGF0ZXIgb24KLSAgICAgICAgICAgIC8vIHRoZWlyIG93biBpZiBuZWNlc3NhcnkuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSB2ZXJzaW9uIHN0cmluZyB3YXMgaW4gYSBmb3JtYXQgdGhhdCB3ZSBkb24ndCB1bmRlcnN0YW5kLAotICAgICAgICAgICAgLy8gY29udGludWUgYW5kIGxldCB0aGluZ3MgZmFpbCBsYXRlciBvbiB0aGVpciBvd24gaWYgbmVjZXNzYXJ5LgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVuIGEgd29ya3NwYWNlIHNlbGVjdGlvbiBkaWFsb2cgb24gdGhlIGFyZ3VtZW50IHNoZWxsLCBwb3B1bGF0aW5nIHRoZQotICAgICAqIGFyZ3VtZW50IGRhdGEgd2l0aCB0aGUgdXNlcidzIHNlbGVjdGlvbi4gUGVyZm9ybSBmaXJzdCBsZXZlbCB2YWxpZGF0aW9uCi0gICAgICogb24gdGhlIHNlbGVjdGlvbiBieSBjb21wYXJpbmcgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24uIFRoaXMgbWV0aG9kIGRvZXMKLSAgICAgKiBub3QgZXhhbWluZSB0aGUgcnVudGltZSBzdGF0ZSAoZS5nLiwgaXMgdGhlIHdvcmtzcGFjZSBhbHJlYWR5IGxvY2tlZD8pLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaGVsbAotICAgICAqIEBwYXJhbSBsYXVuY2hEYXRhCi0gICAgICogQHBhcmFtIGZvcmNlCi0gICAgICogICAgICAgICAgICBzZXR0aW5nIHRvIHRydWUgbWFrZXMgdGhlIGRpYWxvZyBvcGVuIHJlZ2FyZGxlc3Mgb2YgdGhlCi0gICAgICogICAgICAgICAgICBzaG93RGlhbG9nIHZhbHVlCi0gICAgICogQHJldHVybiBBbiBVUkwgc3RvcmluZyB0aGUgc2VsZWN0ZWQgd29ya3NwYWNlIG9yIG51bGwgaWYgdGhlIHVzZXIgaGFzCi0gICAgICogICAgICAgICBjYW5jZWxlZCB0aGUgbGF1bmNoIG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIFVSTCBwcm9tcHRGb3JXb3Jrc3BhY2UoU2hlbGwgc2hlbGwsIENob29zZVdvcmtzcGFjZURhdGEgbGF1bmNoRGF0YSwKLSAgICAgICAgICAgIGJvb2xlYW4gZm9yY2UpIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgCS8vIGRvbid0IHVzZSB0aGUgcGFyZW50IHNoZWxsIHRvIG1ha2UgdGhlIGRpYWxvZyBhIHRvcC1sZXZlbAotICAgICAgICAJLy8gc2hlbGwuIFNlZSBidWcgODQ4ODEuCi0gICAgICAgICAgICBuZXcgQ2hvb3NlV29ya3NwYWNlRGlhbG9nKG51bGwsIGxhdW5jaERhdGEsIGZhbHNlLCB0cnVlKS5wcm9tcHQoZm9yY2UpOwotICAgICAgICAgICAgU3RyaW5nIGluc3RhbmNlUGF0aCA9IGxhdW5jaERhdGEuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoaW5zdGFuY2VQYXRoID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIC8vIHRoZSBkaWFsb2cgaXMgbm90IGZvcmNlZCBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCBidXQgaXMgb24gZXZlcnkKLSAgICAgICAgICAgIC8vIHN1YnNlcXVlbnQgb25lIC0tIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB0aGVuIHRoZSB1c2VyIG5lZWRzIHRvIGJlCi0gICAgICAgICAgICAvLyBhbGxvd2VkIHRvIGZpeCBpdAotICAgICAgICAgICAgZm9yY2UgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyA3MDU3NjogZG9uJ3QgYWNjZXB0IGVtcHR5IGlucHV0Ci0gICAgICAgICAgICBpZiAoaW5zdGFuY2VQYXRoLmxlbmd0aCgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgICAgLm9wZW5FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuSURFQXBwbGljYXRpb25fd29ya3NwYWNlRW1wdHlUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUVtcHR5TWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgd29ya3NwYWNlIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QKLSAgICAgICAgICAgIEZpbGUgd29ya3NwYWNlID0gbmV3IEZpbGUoaW5zdGFuY2VQYXRoKTsKLSAgICAgICAgICAgIGlmICghd29ya3NwYWNlLmV4aXN0cygpKQotICAgICAgICAgICAgICAgIHdvcmtzcGFjZS5ta2RpcigpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSBGaWxlLnRvVVJMKCkgc2luY2UgaXQgYWRkcyBhIGxlYWRpbmcgc2xhc2ggdGhhdCBQbGF0Zm9ybSBkb2VzIG5vdAotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBwcm9wZXJseS4gIFNlZSBidWcgNTQwODEgZm9yIG1vcmUgZGV0YWlscy4gIAotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gd29ya3NwYWNlLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0gICAgICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZSIsIG51bGwsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VJbnZhbGlkVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUludmFsaWRNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoIWNoZWNrVmFsaWRXb3Jrc3BhY2Uoc2hlbGwsIHVybCkpOwotCi0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGFyZ3VtZW50IGRpcmVjdG9yeSBpcyBvayB0byB1c2UgYXMgYSB3b3Jrc3BhY2UgYW5kCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLiBBIHZlcnNpb24gY2hlY2sgd2lsbCBiZSBwZXJmb3JtZWQsIGFuZCBhIGNvbmZpcm1hdGlvbgotICAgICAqIGJveCBtYXkgYmUgZGlzcGxheWVkIG9uIHRoZSBhcmd1bWVudCBzaGVsbCBpZiBhbiBvbGRlciB2ZXJzaW9uIGlzCi0gICAgICogZGV0ZWN0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudCBVUkwgaXMgb2sgdG8gdXNlIGFzIGEgd29ya3NwYWNlIGFuZCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1ZhbGlkV29ya3NwYWNlKFNoZWxsIHNoZWxsLCBVUkwgdXJsKSB7Ci0gICAgICAgIC8vIGEgbnVsbCB1cmwgaXMgbm90IGEgdmFsaWQgd29ya3NwYWNlCi0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IHJlYWRXb3Jrc3BhY2VWZXJzaW9uKHVybCk7Ci0KLSAgICAgICAgLy8gaWYgdGhlIHZlcnNpb24gY291bGQgbm90IGJlIHJlYWQsIHRoZW4gdGhlcmUgaXMgbm90IGFueSBleGlzdGluZwotICAgICAgICAvLyB3b3Jrc3BhY2UgZGF0YSB0byB0cmFtcGxlLCBlLmcuLCBwZXJoYXBzIGl0cyBhIG5ldyBkaXJlY3RvcnkgdGhhdAotICAgICAgICAvLyBpcyBqdXN0IHN0YXJ0aW5nIHRvIGJlIHVzZWQgYXMgYSB3b3Jrc3BhY2UKLSAgICAgICAgaWYgKHZlcnNpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGZpbmFsIGludCBpZGVfdmVyc2lvbiA9IEludGVnZXIucGFyc2VJbnQoV09SS1NQQUNFX1ZFUlNJT05fVkFMVUUpOwotICAgICAgICBpbnQgd29ya3NwYWNlX3ZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KHZlcnNpb24pOwotCi0gICAgICAgIC8vIGVxdWFsaXR5IHRlc3QgaXMgcmVxdWlyZWQgc2luY2UgYW55IHZlcnNpb24gZGlmZmVyZW5jZSAobmV3ZXIKLSAgICAgICAgLy8gb3Igb2xkZXIpIG1heSByZXN1bHQgaW4gZGF0YSBiZWluZyB0cmFtcGxlZAotICAgICAgICBpZiAod29ya3NwYWNlX3ZlcnNpb24gPT0gaWRlX3ZlcnNpb24pCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdvcmtzcGFjZSBoYXMgYmVlbiBkZXRlY3RlZCB0byBiZSBmcm9tIGEgdmVyc2lvbgotICAgICAgICAvLyBvdGhlciB0aGFuIHRoZSBjdXJyZW50IGlkZSB2ZXJzaW9uIC0tIGZpbmQgb3V0IGlmIHRoZSB1c2VyIHdhbnRzCi0gICAgICAgIC8vIHRvIHVzZSBpdCBhbnlob3cuCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3ZlcnNpb25UaXRsZTsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVBcHBsaWNhdGlvbl92ZXJzaW9uTWVzc2FnZSwgdXJsLmdldEZpbGUoKSk7Ci0KLSAgICAgICAgTWVzc2FnZUJveCBtYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5PSyB8IFNXVC5DQU5DRUwKLSAgICAgICAgICAgICAgICB8IFNXVC5JQ09OX1dBUk5JTkcgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotICAgICAgICBtYm94LnNldFRleHQodGl0bGUpOwotICAgICAgICBtYm94LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIHJldHVybiBtYm94Lm9wZW4oKSA9PSBTV1QuT0s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9vayBhdCB0aGUgYXJndW1lbnQgVVJMIGZvciB0aGUgd29ya3NwYWNlJ3MgdmVyc2lvbiBpbmZvcm1hdGlvbi4gUmV0dXJuCi0gICAgICogdGhhdCB2ZXJzaW9uIGlmIGZvdW5kIGFuZCBudWxsIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFdvcmtzcGFjZVZlcnNpb24oVVJMIHdvcmtzcGFjZSkgewotICAgICAgICBGaWxlIHZlcnNpb25GaWxlID0gZ2V0VmVyc2lvbkZpbGUod29ya3NwYWNlLCBmYWxzZSk7Ci0gICAgICAgIGlmICh2ZXJzaW9uRmlsZSA9PSBudWxsIHx8ICF2ZXJzaW9uRmlsZS5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBBbHRob3VnaCB0aGUgdmVyc2lvbiBmaWxlIGlzIG5vdCBzcGVjJ2VkIHRvIGJlIGEgSmF2YSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAvLyBmaWxlLCBpdCBoYXBwZW5zIHRvIGZvbGxvdyB0aGUgc2FtZSBmb3JtYXQgY3VycmVudGx5LCBzbyB1c2luZwotICAgICAgICAgICAgLy8gUHJvcGVydGllcyB0byByZWFkIGl0IGlzIGNvbnZlbmllbnQuCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odmVyc2lvbkZpbGUpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKGlzKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KFdPUktTUEFDRV9WRVJTSU9OX0tFWSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5sb2coIkNvdWxkIG5vdCByZWFkIHZlcnNpb24gZmlsZSIsIG5ldyBTdGF0dXMoIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgSVN0YXR1cy5FUlJPUiwgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsCi0gICAgICAgICAgICAgICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpID09IG51bGwgPyAiIiA6IGUuZ2V0TWVzc2FnZSgpLCAvLyROT04tTkxTLTEkLCAKLSAgICAgICAgICAgICAgICAgICAgZSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgbWV0YWRhdGEgaW50byBhIGtub3duIGZpbGUgb3ZlcndyaXRpbmcgYW55Ci0gICAgICogZXhpc3RpbmcgZmlsZSBjb250ZW50cy4gV3JpdGluZyB0aGUgdmVyc2lvbiBmaWxlIGlzbid0IHJlYWxseSBjcnVjaWFsLAotICAgICAqIHNvIHRoZSBmdW5jdGlvbiBpcyBzaWxlbnQgYWJvdXQgZmFpbHVyZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVXb3Jrc3BhY2VWZXJzaW9uKCkgewotICAgICAgICBMb2NhdGlvbiBpbnN0YW5jZUxvYyA9IFBsYXRmb3JtLmdldEluc3RhbmNlTG9jYXRpb24oKTsKLSAgICAgICAgaWYgKGluc3RhbmNlTG9jID09IG51bGwgfHwgaW5zdGFuY2VMb2MuaXNSZWFkT25seSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEZpbGUgdmVyc2lvbkZpbGUgPSBnZXRWZXJzaW9uRmlsZShpbnN0YW5jZUxvYy5nZXRVUkwoKSwgdHJ1ZSk7Ci0gICAgICAgIGlmICh2ZXJzaW9uRmlsZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25MaW5lID0gV09SS1NQQUNFX1ZFUlNJT05fS0VZICsgJz0nCi0gICAgICAgICAgICAgICAgICAgICsgV09SS1NQQUNFX1ZFUlNJT05fVkFMVUU7Ci0KLSAgICAgICAgICAgIG91dHB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHZlcnNpb25GaWxlKTsKLSAgICAgICAgICAgIG91dHB1dC53cml0ZSh2ZXJzaW9uTGluZS5nZXRCeXRlcygiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmxvZygiQ291bGQgbm90IHdyaXRlIHZlcnNpb24gZmlsZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzVXRpbC5uZXdTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmVyc2lvbiBmaWxlIGlzIHN0b3JlZCBpbiB0aGUgbWV0YWRhdGEgYXJlYSBvZiB0aGUgd29ya3NwYWNlLiBUaGlzCi0gICAgICogbWV0aG9kIHJldHVybnMgYW4gVVJMIHRvIHRoZSBmaWxlIG9yIG51bGwgaWYgdGhlIGRpcmVjdG9yeSBvciBmaWxlIGRvZXMKLSAgICAgKiBub3QgZXhpc3QgKGFuZCB0aGUgY3JlYXRlIHBhcmFtZXRlciBpcyBmYWxzZSkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNyZWF0ZQotICAgICAqICAgICAgICAgICAgSWYgdGhlIGRpcmVjdG9yeSBhbmQgZmlsZSBkb2VzIG5vdCBleGlzdCB0aGlzIHBhcmFtZXRlcgotICAgICAqICAgICAgICAgICAgY29udHJvbHMgd2hldGhlciBpdCB3aWxsIGJlIGNyZWF0ZWQuCi0gICAgICogQHJldHVybiBBbiB1cmwgdG8gdGhlIGZpbGUgb3IgbnVsbCBpZiB0aGUgdmVyc2lvbiBmaWxlIGRvZXMgbm90IGV4aXN0IG9yCi0gICAgICogICAgICAgICBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGdldFZlcnNpb25GaWxlKFVSTCB3b3Jrc3BhY2VVcmwsIGJvb2xlYW4gY3JlYXRlKSB7Ci0gICAgICAgIGlmICh3b3Jrc3BhY2VVcmwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMKLSAgICAgICAgICAgIEZpbGUgbWV0YURpciA9IG5ldyBGaWxlKHdvcmtzcGFjZVVybC5nZXRQYXRoKCksIE1FVEFEQVRBX0ZPTERFUik7Ci0gICAgICAgICAgICBpZiAoIW1ldGFEaXIuZXhpc3RzKCkgJiYgKCFjcmVhdGUgfHwgIW1ldGFEaXIubWtkaXIoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgZmlsZSBleGlzdHMKLSAgICAgICAgICAgIEZpbGUgdmVyc2lvbkZpbGUgPSBuZXcgRmlsZShtZXRhRGlyLCBWRVJTSU9OX0ZJTEVOQU1FKTsKLSAgICAgICAgICAgIGlmICghdmVyc2lvbkZpbGUuZXhpc3RzKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKCFjcmVhdGUgfHwgIXZlcnNpb25GaWxlLmNyZWF0ZU5ld0ZpbGUoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uRmlsZTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gY2Fubm90IGxvZyBiZWNhdXNlIGluc3RhbmNlIGFyZWEgaGFzIG5vdCBiZWVuIHNldAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERUV4Y2VwdGlvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvSURFRXhjZXB0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTVjYzA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvSURFRXhjZXB0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaENvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuSW50ZXJuYWxFcnJvckRpYWxvZzsKLQotLyoqCi0gKiBIYW5kbGVzIGV4Y2VwdGlvbiB3aGlsZSBydW5uaW5nIHRoZSBldmVudCBsb29wLgotICogPHA+Ci0gKiBJbiBjYXNlIG9mIGEgInNpbXBsZXIiIGV4Y2VwdGlvbiBzdWNoIGFzIE5QRSwgbG9nIHRoZSBleGNlcHRpb24sCi0gKiBvcGVuIGEgZGlhbG9nIHRvIGluZm9ybSB0aGUgdXNlciBhbmQgdHJ5IHRvIGtlZXAgcnVubmluZy4KLSAqIEluIGNhc2Ugb2YgYSBleGNlcHRpb24gbGlrZSBPdXRPZk1lbW9yeSBhbmQgU1dURXJyb3IsIGxvZyB0aGUgZXhjZXB0aW9uLAotICogb3BlbiBhIGRpYWxvZyB0byBhc2sgdGhlIHVzZXIgdG8gZGVjaWRlIGlmIHRoZSB3b3JrYmVuY2ggc2hvdWxkIAotICogYmUgdGVybWluYXRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIElERUV4Y2VwdGlvbkhhbmRsZXIgewotCi0gICAgcHJpdmF0ZSBpbnQgZXhjZXB0aW9uQ291bnQgPSAwOwotCi0gICAgcHJpdmF0ZSBJbnRlcm5hbEVycm9yRGlhbG9nIGRpYWxvZzsKLQotICAgIHByaXZhdGUgU2hlbGwgZGVmYXVsdFBhcmVudCA9IG5ldyBTaGVsbCgpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNsb3NpbmcgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaENvbmZpZ3VyZXIgd29ya2JlbmNoQ29uZmlndXJlcjsKLQotICAgIC8vUHJlLWxvYWQgYWxsIFN0cmluZ3MgdHJ5aW5nIHRvIHJ1biBhcyBsaWdodCBhcyBwb3NzaWJsZSBpbiBjYXNlIG9mIGZhdGFsIGVycm9ycy4KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTVNHX091dE9mTWVtb3J5RXJyb3IgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5GYXRhbEVycm9yX091dE9mTWVtb3J5RXJyb3I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTVNHX1N0YWNrT3ZlcmZsb3dFcnJvciA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLkZhdGFsRXJyb3JfU3RhY2tPdmVyZmxvd0Vycm9yOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1TR19WaXJ0dWFsTWFjaGluZUVycm9yID0gSURFV29ya2JlbmNoTWVzc2FnZXMuRmF0YWxFcnJvcl9WaXJ0dWFsTWFjaGluZUVycm9yOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1TR19TV1RFcnJvciA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLkZhdGFsRXJyb3JfU1dURXJyb3I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTVNHX0ZBVEFMX0VSUk9SID0gSURFV29ya2JlbmNoTWVzc2FnZXMuRmF0YWxFcnJvcjsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBNU0dfRkFUQUxfRVJST1JfUmVjdXJzaXZlID0gSURFV29ya2JlbmNoTWVzc2FnZXMuRmF0YWxFcnJvcl9SZWN1cnNpdmVFcnJvcjsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBNU0dfRkFUQUxfRVJST1JfUmVjdXJzaXZlVGl0bGUgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5JbnRlcm5hbF9lcnJvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGV4Y2VwdGlvbiBoYW5kbGUgZm9yIHRoZSBJREUgYXBwbGljYXRpb24KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uZmlndXJlciBhbiBvYmplY3QgZm9yIGNvbmZpZ3VyaW5nIHRoZSB3b3JrYmVuY2gKLSAgICAgKi8KLSAgICBwdWJsaWMgSURFRXhjZXB0aW9uSGFuZGxlcihJV29ya2JlbmNoQ29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHdvcmtiZW5jaENvbmZpZ3VyZXIgPSBjb25maWd1cmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYW4gZXZlbnQgbG9vcCBleGNlcHRpb24KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgZXhjZXB0aW9uIHRvIGhhbmRsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhjZXB0aW9uQ291bnQrKzsKLSAgICAgICAgICAgIGlmIChleGNlcHRpb25Db3VudCA+IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2xvc2luZykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNoZWxsIHBhcmVudCA9IGRlZmF1bHRQYXJlbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGRpYWxvZyAhPSBudWxsICYmIGRpYWxvZy5nZXRTaGVsbCgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFkaWFsb2cuZ2V0U2hlbGwoKS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IGRpYWxvZy5nZXRTaGVsbCgpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3gocGFyZW50LCBTV1QuSUNPTl9FUlJPUgotICAgICAgICAgICAgICAgICAgICAgICAgfCBTV1QuWUVTIHwgU1dULk5PIHwgU1dULlNZU1RFTV9NT0RBTCk7Ci0gICAgICAgICAgICAgICAgYm94LnNldFRleHQoTVNHX0ZBVEFMX0VSUk9SX1JlY3Vyc2l2ZVRpdGxlKTsKLSAgICAgICAgICAgICAgICBib3guc2V0TWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChNU0dfRkFUQUxfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBNU0dfRkFUQUxfRVJST1JfUmVjdXJzaXZlIH0pKTsKLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gYm94Lm9wZW4oKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFNXVC5ZRVMpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VXb3JrYmVuY2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChvcGVuUXVlc3Rpb25EaWFsb2codCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VXb3JrYmVuY2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBleGNlcHRpb25Db3VudC0tOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIHdvcmtiZW5jaCBhbmQgbWFrZSBzdXJlIGFsbCBleGNlcHRpb25zIGFyZSBoYW5kbGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjbG9zZVdvcmtiZW5jaCgpIHsKLSAgICAgICAgaWYgKGNsb3NpbmcpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbG9zaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCAmJiBkaWFsb2cuZ2V0U2hlbGwoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFkaWFsb2cuZ2V0U2hlbGwoKS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICAgICAgZGlhbG9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB3b3JrYmVuY2hDb25maWd1cmVyLmVtZXJnZW5jeUNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgIC8vIFdvcmtiZW5jaCBtYXkgYmUgaW4gc3VjaCBiYWQgc2hhcGUgKG5vIE9TIGhhbmRsZXMgbGVmdCwgb3V0IG9mIG1lbW9yeSwgZXRjKQotICAgICAgICAgICAgLy8gdGhhdCBpcyBjYW5ub3QgZXZlbiBjbG9zZS4gSnVzdCBiYWlsIG91dCBub3cuCi0gICAgICAgICAgICBTeXN0ZW0uZXJyCi0gICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJGYXRhbCBydW50aW1lIGVycm9yIGhhcHBlbmVkIGR1cmluZyB3b3JrYmVuY2ggZW1lcmdlbmN5IGNsb3NlLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IHJlOwotICAgICAgICB9IGNhdGNoIChFcnJvciBlKSB7Ci0gICAgICAgICAgICAvLyBXb3JrYmVuY2ggbWF5IGJlIGluIHN1Y2ggYmFkIHNoYXBlIChubyBPUyBoYW5kbGVzIGxlZnQsIG91dCBvZiBtZW1vcnksIGV0YykKLSAgICAgICAgICAgIC8vIHRoYXQgaXMgY2Fubm90IGV2ZW4gY2xvc2UuIEp1c3QgYmFpbCBvdXQgbm93LgotICAgICAgICAgICAgU3lzdGVtLmVycgotICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiRmF0YWwgZXJyb3IgaGFwcGVuZWQgZHVyaW5nIHdvcmtiZW5jaCBlbWVyZ2VuY3kgY2xvc2UuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtIHRoZSB1c2VyIGFib3V0IGEgZmF0YWwgZXJyb3IuIFJldHVybiB0cnVlIGlmIHRoZSB1c2VyIGRlY2lkZSB0byAKLSAgICAgKiBleGl0IHdvcmtiZW5jaCBvciBpZiBhbm90aGVyIGZhdGFsIGVycm9yIGhhcHBlbnMgd2hpbGUgcmVwb3J0aW5nIGl0LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBvcGVuUXVlc3Rpb25EaWFsb2coVGhyb3dhYmxlIGludGVybmFsRXJyb3IpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwotICAgICAgICAgICAgaWYgKGludGVybmFsRXJyb3IgaW5zdGFuY2VvZiBPdXRPZk1lbW9yeUVycm9yKSB7Ci0gICAgICAgICAgICAgICAgbXNnID0gTVNHX091dE9mTWVtb3J5RXJyb3I7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGludGVybmFsRXJyb3IgaW5zdGFuY2VvZiBTdGFja092ZXJmbG93RXJyb3IpIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBNU0dfU3RhY2tPdmVyZmxvd0Vycm9yOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlcm5hbEVycm9yIGluc3RhbmNlb2YgVmlydHVhbE1hY2hpbmVFcnJvcikgewotICAgICAgICAgICAgICAgIG1zZyA9IE1TR19WaXJ0dWFsTWFjaGluZUVycm9yOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlcm5hbEVycm9yIGluc3RhbmNlb2YgU1dURXJyb3IpIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBNU0dfU1dURXJyb3I7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbEVycm9yLmdldE1lc3NhZ2UoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZyA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLkludGVybmFsRXJyb3JOb0FyZzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtc2cgPSBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5JbnRlcm5hbEVycm9yT25lQXJnLCBpbnRlcm5hbEVycm9yLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChQb2xpY3kuREVCVUdfT1BFTl9FUlJPUl9ESUFMT0cpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVuUXVlc3Rpb24obnVsbCwgSURFV29ya2JlbmNoTWVzc2FnZXMuSW50ZXJuYWxfZXJyb3IsIG1zZywgaW50ZXJuYWxFcnJvciwgMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQWx3YXlzIG9wZW4gdGhlIGRpYWxvZyBpbiBjYXNlIG9mIG1ham9yIGVycm9yIGJ1dCBkbyBub3Qgc2hvdyB0aGUKLSAgICAgICAgICAgIC8vIGRldGFpbCBidXR0b24gaWYgbm90IGluIGRlYnVnIG1vZGUuCi0gICAgICAgICAgICBUaHJvd2FibGUgZGV0YWlsID0gaW50ZXJuYWxFcnJvcjsKLSAgICAgICAgICAgIGlmICghUG9saWN5LkRFQlVHX09QRU5fRVJST1JfRElBTE9HKQotICAgICAgICAgICAgICAgIGRldGFpbCA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gSW50ZXJuYWxFcnJvckRpYWxvZwotICAgICAgICAgICAgICAgICAgICAub3BlblF1ZXN0aW9uKG51bGwsIElERVdvcmtiZW5jaE1lc3NhZ2VzLkludGVybmFsX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1TR19GQVRBTF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IG1zZyB9KSwgZGV0YWlsLCAxKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7Ci0gICAgICAgICAgICAvLyBXb3JrYmVuY2ggbWF5IGJlIGluIHN1Y2ggYmFkIHNoYXBlIChubyBPUyBoYW5kbGVzIGxlZnQsIG91dCBvZiBtZW1vcnksIGV0YykKLSAgICAgICAgICAgIC8vIHRoYXQgaXMgY2Fubm90IHNob3cgYSBtZXNzYWdlIHRvIHRoZSB1c2VyLiBKdXN0IGJhaWwgb3V0IG5vdy4KLSAgICAgICAgICAgIFN5c3RlbS5lcnIKLSAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIkVycm9yIHdoaWxlIGluZm9ybWluZyB1c2VyIGFib3V0IGV2ZW50IGxvb3AgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpbnRlcm5hbEVycm9yLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEaWFsb2cgb3BlbiBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHRoLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gb3BlblF1ZXN0aW9uKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgICAgICAgIFRocm93YWJsZSBkZXRhaWwsIGludCBkZWZhdWx0SW5kZXgpIHsKLSAgICAgICAgU3RyaW5nW10gbGFiZWxzOwotICAgICAgICBpZiAoZGV0YWlsID09IG51bGwpCi0gICAgICAgICAgICBsYWJlbHMgPSBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCB9OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsYWJlbHMgPSBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwgfTsKLQotICAgICAgICBkaWFsb2cgPSBuZXcgSW50ZXJuYWxFcnJvckRpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCBtZXNzYWdlLCBkZXRhaWwsCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotCi0gICAgICAgIGlmIChkZXRhaWwgIT0gbnVsbCkKLSAgICAgICAgICAgIGRpYWxvZy5zZXREZXRhaWxCdXR0b24oMik7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0s7Ci0gICAgICAgIGRpYWxvZyA9IG51bGw7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JREVJZGxlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERUlkbGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyMmQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERUlkbGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcjsKLQotLyoqCi0gKiBUaGUgaWRsZSBoZWxwZXIgZGV0ZWN0cyB3aGVuIHRoZSBzeXN0ZW0gaXMgaWRsZSBpbiBvcmRlciB0byBwZXJmb3JtIGdhcmJhZ2UgCi0gKiBjb2xsZWN0aW9uIGluIGEgd2F5IHRoYXQgbWluaW1pemVzIGltcGFjdCBvbiByZXNwb25zaXZlbmVzcyBvZiB0aGUgVUkuCi0gKiBUaGUgYWxnb3JpdGhtIGZvciBkZXRlcm1pbmluZyB3aGVuIHRvIHBlcmZvcm0gYSBnYXJiYWdlIGNvbGxlY3Rpb24KLSAqIGlzIGFzIGZvbGxvd3M6Ci0gKiAKLSAqICAtIE5ldmVyIGdjIGlmIHRoZXJlIGlzIGEgdGVzdCBoYXJuZXNzIHByZXNlbnQKLSAqICAtIERvbid0IGdjIGlmIGJhY2tncm91bmQgam9icyBhcmUgcnVubmluZwotICogIC0gRG9uJ3QgZ2MgaWYgdGhlIGtleWJvYXJkIG9yIG1vdXNlIGhhdmUgYmVlbiBhY3RpdmUgd2l0aGluIElETEVfSU5URVJWQUwKLSAqICAtIERvbid0IGdjIGlmIHRoZXJlIGhhcyBiZWVuIGEgR0Mgd2l0aGluIHRoZSBtaW5pbXVtIGdjIGludGVydmFsIChzeXN0ZW0gcHJvcGVydHkgUFJPUF9HQ19JTlRFUlZBTCkKLSAqICAtIEFmdGVyIGEgZ2MsIGRvbid0IGdjIGFnYWluIHVudGlsIChkdXJhdGlvbiAqIEdDX0RFTEFZX01VTFRJUExJRVIpIGhhcyBlbGFwc2VkLgotICogICAgRm9yIGV4YW1wbGUsIGlmIGEgR0MgdGFrZXMgMTAwbXMgYW5kIHRoZSBtdWx0aXBsaWVyIGlzIDYwLCBkb24ndCBnYyBmb3IgYXQgbGVhc3QgZml2ZSBzZWNvbmRzCi0gKiAgLSBOZXZlciBnYyBhZ2FpbiBpZiBhbnkgc2luZ2xlIGdjIHRha2VzIGxvbmdlciB0aGFuIHN5c3RlbSBwcm9wZXJ0eSBQUk9QX0dDX01BWAotICovCi1jbGFzcyBJREVJZGxlSGVscGVyIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IG1pbmltdW0gdGltZSBiZXR3ZWVuIGdhcmJhZ2UgY29sbGVjdGlvbnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfR0NfSU5URVJWQUwgPSA2MDAwMDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IG1heGltdW0gZHVyYXRpb24gZm9yIGEgZ2FyYmFnZSBjb2xsZWN0aW9uLCBiZXlvbmQgd2hpY2gKLQkgKiB0aGUgZXhwbGljaXQgZ2MgbWVjaGFuaXNtIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfR0NfTUFYID0gODAwMDsKLQotCS8qKgotCSAqIFRoZSBtdWx0aXBsZSBvZiB0aGUgbGFzdCBnYyBkdXJhdGlvbiBiZWZvcmUgd2Ugd2lsbCBjb25zaWRlciBkb2luZwotCSAqIGFub3RoZXIgb25lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHQ19ERUxBWV9NVUxUSVBMSUVSID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgdGltZSBpbnRlcnZhbCBvZiBubyBrZXlib2FyZCBvciBtb3VzZSBldmVudHMgYWZ0ZXIgd2hpY2ggdGhlIHN5c3RlbSAKLQkgKiBpcyBjb25zaWRlcmVkIGlkbGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElETEVfSU5URVJWQUwgPSA1MDAwOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGJvb2xlYW4gc3lzdGVtIHByb3BlcnR5IHRoYXQgc3BlY2lmaWVzIHdoZXRoZXIgZXhwbGljaXQKLQkgKiBnYXJiYWdlIGNvbGxlY3Rpb24gaXMgZW5hYmxlZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9HQyA9ICJpZGUuZ2MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgaW50ZWdlciBzeXN0ZW0gcHJvcGVydHkgdGhhdCBzcGVjaWZpZXMgdGhlIG1pbmltdW0gdGltZSAKLQkgKiBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBnYXJiYWdlIGNvbGxlY3Rpb25zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0dDX0lOVEVSVkFMID0gImlkZS5nYy5pbnRlcnZhbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBpbnRlZ2VyIHN5c3RlbSBwcm9wZXJ0eSB0aGF0IHNwZWNpZmllcyB0aGUgbWF4aW11bSAKLQkgKiBkdXJhdGlvbiBmb3IgYSBnYXJiYWdlIGNvbGxlY3Rpb24uIElmIHRoaXMgZHVyYXRpb24gaXMgZXZlciBleGNlZWRlZCwgdGhlIAotCSAqIGV4cGxpY2l0IGdjIG1lY2hhbmlzbSBpcyBkaXNhYmxlZCBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2Vzc2lvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9HQ19NQVggPSAiaWRlLmdjLm1heCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQ29uZmlndXJlciBjb25maWd1cmVyOwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBpZGxlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgbGFzdCB0aW1lIHdlIGdhcmJhZ2UgY29sbGVjdGVkLgotCSAqLwotCXByaXZhdGUgbG9uZyBsYXN0R0MgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCS8qKgotCSAqIFRoZSBtYXhpbXVtIGdjIGR1cmF0aW9uLiBJZiB0aGlzIHZhbHVlIGlzIGV4Y2VlZGVkLCB0aGUKLQkgKiBlbnRpcmUgZXhwbGljaXQgZ2MgbWVjaGFuaXNtIGlzIGRpc2FibGVkLgotCSAqLwotCXByaXZhdGUgaW50IG1heEdDID0gREVGQVVMVF9HQ19NQVg7Ci0JLyoqCi0JICogVGhlIG1pbmltdW0gdGltZSBpbnRlcnZhbCB1bnRpbCB0aGUgbmV4dCBnYXJiYWdlIGNvbGxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIGludCBtaW5HQ0ludGVydmFsID0gREVGQVVMVF9HQ19JTlRFUlZBTDsKLQotCS8qKgotCSAqIFRoZSB0aW1lIGludGVydmFsIHVudGlsIHRoZSBuZXh0IGdhcmJhZ2UgY29sbGVjdGlvbgotCSAqLwotCXByaXZhdGUgaW50IG5leHRHQ0ludGVydmFsID0gREVGQVVMVF9HQ19JTlRFUlZBTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBpZGxlIGhhbmRsZXIKLQkgKiBAcGFyYW0gYUNvbmZpZ3VyZXIgVGhlIHdvcmtiZW5jaCBjb25maWd1cmVyLgotCSAqLwotCUlERUlkbGVIZWxwZXIoSVdvcmtiZW5jaENvbmZpZ3VyZXIgYUNvbmZpZ3VyZXIpIHsKLQkJdGhpcy5jb25maWd1cmVyID0gYUNvbmZpZ3VyZXI7Ci0JCS8vZG9uJ3QgZ2Mgd2hpbGUgcnVubmluZyB0ZXN0cyBiZWNhdXNlIHBlcmZvcm1hbmNlIHRlc3RzIGFyZSBzZW5zaXRpdmUgdG8gdGltaW5nIChzZWUgYnVnIDEyMTU2MikKLQkJaWYgKFBsYXRmb3JtVUkuZ2V0VGVzdGFibGVPYmplY3QoKS5nZXRUZXN0SGFybmVzcygpICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBlbmFibGVkID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfR0MpOwotCQkvL2djIGlzIHR1cm5lZCBvbiBieSBkZWZhdWx0IGlmIHByb3BlcnR5IGlzIG1pc3NpbmcKLQkJaWYgKGVuYWJsZWQgIT0gbnVsbCAmJiBlbmFibGVkLmVxdWFsc0lnbm9yZUNhc2UoQm9vbGVhbi5GQUxTRS50b1N0cmluZygpKSkKLQkJCXJldHVybjsKLQkJLy9pbml0IGdjIGludGVydmFsCi0JCUludGVnZXIgcHJvcCA9IEludGVnZXIuZ2V0SW50ZWdlcihQUk9QX0dDX0lOVEVSVkFMKTsKLQkJaWYgKHByb3AgIT0gbnVsbCAmJiBwcm9wLmludFZhbHVlKCkgPj0gMCkKLQkJCW1pbkdDSW50ZXJ2YWwgPSBuZXh0R0NJbnRlcnZhbCA9IHByb3AuaW50VmFsdWUoKTsKLQotCQkvL2luaXQgbWF4IGdjIGludGVydmFsCi0JCXByb3AgPSBJbnRlZ2VyLmdldEludGVnZXIoUFJPUF9HQ19NQVgpOwotCQlpZiAocHJvcCAhPSBudWxsKQotCQkJbWF4R0MgPSBwcm9wLmludFZhbHVlKCk7Ci0KLQkJLy9ob29rIGlkbGUgaGFuZGxlcgotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBjb25maWd1cmVyLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQkJZmluYWwgUnVubmFibGUgaGFuZGxlciA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWNvbmZpZ3VyZXIuZ2V0V29ya2JlbmNoKCkuaXNDbG9zaW5nKCkpCi0JCQkJCWRpc3BsYXkudGltZXJFeGVjKHBlcmZvcm1HQygpLCB0aGlzKTsKLQkJCX0KLQkJfTsKLQkJaWRsZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlkaXNwbGF5LnRpbWVyRXhlYyhJRExFX0lOVEVSVkFMLCBoYW5kbGVyKTsKLQkJCX0KLQkJfTsKLQkJZGlzcGxheS5hZGRGaWx0ZXIoU1dULktleVVwLCBpZGxlTGlzdGVuZXIpOwotCQlkaXNwbGF5LmFkZEZpbHRlcihTV1QuTW91c2VVcCwgaWRsZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaWRsZSBoYW5kbGVyIGhhcyBkZXRlY3RlZCB0aGF0IHRoZSBzeXN0ZW0gaXMgaWRsZS4gUGVyZm9ybQotCSAqIGlkbGUgcHJvY2Vzc2luZy4gUmV0dXJucyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCBzaG91bGQgcGFzcyBiZWZvcmUKLQkgKiB0aGUgbmV4dCBHQy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHBlcmZvcm1HQygpIHsKLQkJLy9kb24ndCBnYXJiYWdlIGNvbGxlY3QgaWYgYmFja2dyb3VuZCBqb2JzIGFyZSBydW5uaW5nCi0JCWlmICghUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmlzSWRsZSgpKQotCQkJcmV0dXJuIElETEVfSU5URVJWQUw7Ci0JCWZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy9kb24ndCBnYXJiYWdlIGNvbGxlY3QgaWYgd2UgaGF2ZSBjb2xsZWN0ZWQgd2l0aGluIHRoZSBzcGVjaWZpYyBpbnRlcnZhbAotCQlpZiAoKHN0YXJ0IC0gbGFzdEdDKSA8IG5leHRHQ0ludGVydmFsKQotCQkJcmV0dXJuIG5leHRHQ0ludGVydmFsIC0gKGludCkgKHN0YXJ0IC0gbGFzdEdDKTsKLQkJU3lzdGVtLmdjKCk7Ci0JCVN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKLQkJbGFzdEdDID0gc3RhcnQ7Ci0JCWZpbmFsIGludCBkdXJhdGlvbiA9IChpbnQpIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KTsKLQkJaWYgKFBvbGljeS5ERUJVR19HQykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXQgR0MgdG9vazogIiArIGR1cmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZHVyYXRpb24gPiBtYXhHQykgewotCQkJaWYgKFBvbGljeS5ERUJVR19HQykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZ1cnRoZXIgZXhwbGljaXQgR0NzIGRpc2FibGVkIGR1ZSB0byBsb25nIEdDIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNodXRkb3duKCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJLy9pZiB0aGUgZ2MgdG9vayBhIGxvbmcgdGltZSwgZW5zdXJlIHRoZSBuZXh0IGdjIGRvZXNuJ3QgaGFwcGVuIGZvciBhd2hpbGUKLQkJbmV4dEdDSW50ZXJ2YWwgPSBNYXRoLm1heChtaW5HQ0ludGVydmFsLCBHQ19ERUxBWV9NVUxUSVBMSUVSICogZHVyYXRpb24pOwotCQlpZiAoUG9saWN5LkRFQlVHX0dDKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOZXh0IEdDIHRvIHJ1biBpbjogIiArIG5leHRHQ0ludGVydmFsKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV4dEdDSW50ZXJ2YWw7Ci0JfQotCi0JLyoqCi0JICogU2h1dHMgZG93biB0aGUgaWRsZSBoZWxwZXIsIHJlbW92aW5nIGFueSBpbnN0YWxsZWQgbGlzdGVuZXJzLCBldGMuCi0JICovCi0Jdm9pZCBzaHV0ZG93bigpIHsKLQkJaWYgKGlkbGVMaXN0ZW5lciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBjb25maWd1cmVyLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWRpc3BsYXkucmVtb3ZlRmlsdGVyKFNXVC5LZXlVcCwgaWRsZUxpc3RlbmVyKTsKLQkJCWRpc3BsYXkucmVtb3ZlRmlsdGVyKFNXVC5Nb3VzZVVwLCBpZGxlTGlzdGVuZXIpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JREVJbnRlcm5hbFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDBlZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JREVJbnRlcm5hbFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotCi0vKioKLSAqIFRoZSBJREVJbnRlcm5hbFByZWZlcmVuY2VzIGFyZSB0aGUgaW50ZXJuYWwgY29uc3RhbnRzIHVzZWQgYnkgdGhlIFdvcmtiZW5jaC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJREVJbnRlcm5hbFByZWZlcmVuY2VzIHsKLSAgICAvLyAoYm9vbGVhbikgU2F2ZSBhbGwgZGlydHkgZWRpdG9ycyBiZWZvcmUgcnVubmluZyBhIGZ1bGwgb3IgaW5jcmVtZW50YWwgYnVpbGQgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BTExfQkVGT1JFX0JVSUxEID0gIlNBVkVfQUxMX0JFRk9SRV9CVUlMRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIChib29sZWFuKSBSZWZyZXNoIHdvcmtzcGFjZSBvbiBzdGFydHVwIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfV09SS1NQQUNFX09OX1NUQVJUVVAgPSAiUkVGUkVTSF9XT1JLU1BBQ0VfT05fU1RBUlRVUCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIChpbnQpIFdvcmtzcGFjZSBzYXZlIGludGVydmFsIGluIG1pbnV0ZXMKLSAgICAvLyBAaXNzdWUgd2Ugc2hvdWxkIGRyb3AgdGhpcyBhbmQgaGF2ZSBjbGllbnRzIHJlZmVyIHRvIHRoZSBjb3JlIHByZWZlcmVuY2UgaW5zdGVhZC4gaXRzIG5vdCBldmVuIGtlcHQgdXAtdG8tZGF0ZSBpZiBjbGllbnQgdXNlcyBjb3JlIGFwaSBkaXJlY3RseQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNBVkVfSU5URVJWQUwgPSAic2F2ZUludGVydmFsIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NBVkVfSU5URVJWQUwgPSA5OTk5OwotCi0gICAgLy8gKGJvb2xlYW4pIFNob3cgUHJvYmxlbXMgdmlldyB0byB1c2VycyB3aGVuIGJ1aWxkIGNvbnRhaW5zIGVycm9ycwotICAgIC8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19UQVNLU19PTl9CVUlMRCA9ICJTSE9XX1RBU0tTX09OX0JVSUxEIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gKGJvb2xlYW4pIFByb21wdCBmb3IgZXhpdCBjb25maXJtYXRpb24gd2hlbiBsYXN0IHdpbmRvdyBjbG9zZWQuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhJVF9QUk9NUFRfT05fQ0xPU0VfTEFTVF9XSU5ET1cgPSAiRVhJVF9QUk9NUFRfT05fQ0xPU0VfTEFTVF9XSU5ET1ciOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyAoU3RyaW5nKSBXaGV0aGVyIHRvIG9wZW4gdGhlIHByZWZlcnJlZCBwZXJzcGVjdGl2ZSB3aGVuIGNyZWF0aW5nIGEgbmV3IHByb2plY3QKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX1NXSVRDSF9QRVJTUF9NT0RFID0gIlNXSVRDSF9QRVJTUEVDVElWRV9PTl9QUk9KRUNUX0NSRUFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFNQTV9QUk9NUFQgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQU1BNX0FMV0FZUyA9IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLkFMV0FZUzsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBTUE1fTkVWRVIgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5ORVZFUjsKLQotICAgIC8vIChib29sZWFuKSBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IHRoZSBXZWxjb21lIGRpYWxvZyBvbiBzdGFydHVwLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFTENPTUVfRElBTE9HID0gIldFTENPTUVfRElBTE9HIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vV2hldGhlciBvciBub3QgdG8gbGltaXQgcHJvYmxlbXMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU1JVF9QUk9CTEVNUyA9ICJMSU1JVF9QUk9CTEVNUyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvL1RoZSBsaXN0IG9mIGRlZmluZWQgcHJvYmxlbXMgZmlsdGVycwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1TX0ZJTFRFUlMgPSAiUFJPQkxFTVNfRklMVEVSUyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvL3Byb2JsZW0gbGltaXRzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTVNfTElNSVQgPSAiUFJPQkxFTVNfTElNSVQiOyAvLyROT04tTkxTLTEkCi0gICAgCi0vLyAgcHJvYmxlbSBsaW1pdHMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNU19HUk9VUElORyA9ICJQUk9CTEVNU19HUk9VUElORyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvL1doZXRoZXIgb3Igbm90IHRvIGxpbWl0IHRhc2tzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElNSVRfVEFTS1MgPSAiTElNSVRfVEFTS1MiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLy90YXNrcyBsaW1pdHMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19MSU1JVCA9ICJUQVNLU19MSU1JVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvL1RoZSBsaXN0IG9mIGRlZmluZWQgdGFza3MgZmlsdGVycwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tTX0ZJTFRFUlMgPSAiVEFTS1NfRklMVEVSUyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvL1doZXRoZXIgb3Igbm90IHRvIGxpbWl0IGJvb2ttYXJrcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTUlUX0JPT0tNQVJLUyA9ICJMSU1JVF9CT09LTUFSS1MiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLy9ib29rbWFyayBsaW1pdHMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS1NfTElNSVQgPSAiQk9PS01BUktTX0xJTUlUIjsgLy8kTk9OLU5MUy0xJAotICAgIAotLy8gIFRoZSBsaXN0IG9mIGRlZmluZWQgdGFza3MgZmlsdGVycwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLU19GSUxURVJTID0gIkJPT0tNQVJLU19GSUxURVJTIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmJmMjg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIGludGVybmFsIGNvbnN0YW50cyBmb3IgaW1hZ2VzIHRoYXQgaW50ZW5kZWQgdG8gYmUgCi0gKiBhdmFpbGFibGUgb25seSB3aXRoaW4gdGhlIElERSBVSSBwcm9wZXIuIFVzZSAKLSAqIDxjb2RlPklERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcn0gdG8gcmV0cmlldmUgaW1hZ2UKLSAqIGRlc2NyaXB0b3JzIGZvciBhbnkgb2YgdGhlIGltYWdlcyBuYW1lZCBpbiB0aGlzIGNsYXNzLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhlIGV4aXN0ZW5jZSBvZiB0aGVzZSBpbWFnZXMgaXMgbm90IG1hZGUgcHVibGljYWxseSBhdmFpbGFibGUKLSAqIGJlY2F1c2Ugc3VjaCBpbWFnZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIGFzIHRoZSBkaWFsb2dzIGV2b2x2ZSB0aHJvdWdoCi0gKiBzdWNjZXNzaXZlIHJlbGVhc2VzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMgewotCi0gICAgLyoqIEJsb2NrIGluc3RhbnRpYXRpb24uICovCi0gICAgcHJpdmF0ZSBJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcygpIHsKLSAgICB9Ci0KLSAgICAvKioqIENvbnN0YW50cyBmb3IgSW1hZ2VzICoqKi8KLQotICAgIC8vIG90aGVyIHRvb2xiYXIgYnV0dG9ucwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9CVUlMRF9FWEVDID0gIklNR19FVE9PTF9CVUlMRF9FWEVDIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0VUT09MX0JVSUxEX0VYRUNfSE9WRVIgPSAiSU1HX0VUT09MX0JVSUxEX0VYRUNfSE9WRVIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfQlVJTERfRVhFQ19ESVNBQkxFRCA9ICJJTUdfRVRPT0xfQlVJTERfRVhFQ19ESVNBQkxFRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9DTE9TRV9FRElUID0gIklNR19FVE9PTF9DTE9TRV9FRElUIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0VUT09MX0NMT1NFX0VESVRfSE9WRVIgPSAiSU1HX0VUT09MX0NMT1NFX0VESVRfSE9WRVIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfQ0xPU0VfRURJVF9ESVNBQkxFRCA9ICJJTUdfRVRPT0xfQ0xPU0VfRURJVF9ESVNBQkxFRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9TQVZFX0VESVQgPSAiSU1HX0VUT09MX1NBVkVfRURJVCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9TQVZFX0VESVRfSE9WRVIgPSAiSU1HX0VUT09MX1NBVkVfRURJVF9IT1ZFUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9TQVZFX0VESVRfRElTQUJMRUQgPSAiSU1HX0VUT09MX1NBVkVfRURJVF9ESVNBQkxFRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9TQVZFQVNfRURJVCA9ICJJTUdfRVRPT0xfU0FWRUFTX0VESVQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfU0FWRUFTX0VESVRfSE9WRVIgPSAiSU1HX0VUT09MX1NBVkVBU19FRElUX0hPVkVSIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0VUT09MX1NBVkVBU19FRElUX0RJU0FCTEVEID0gIklNR19FVE9PTF9TQVZFQVNfRURJVF9ESVNBQkxFRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9TQVZFQUxMX0VESVQgPSAiSU1HX0VUT09MX1NBVkVBTExfRURJVCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9TQVZFQUxMX0VESVRfSE9WRVIgPSAiSU1HX0VUT09MX1NBVkVBTExfRURJVF9IT1ZFUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9TQVZFQUxMX0VESVRfRElTQUJMRUQgPSAiSU1HX0VUT09MX1NBVkVBTExfRURJVF9ESVNBQkxFRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9QUklOVF9FRElUID0gIklNR19FVE9PTF9QUklOVF9FRElUIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0VUT09MX1BSSU5UX0VESVRfSE9WRVIgPSAiSU1HX0VUT09MX1BSSU5UX0VESVRfSE9WRVIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfUFJJTlRfRURJVF9ESVNBQkxFRCA9ICJJTUdfRVRPT0xfUFJJTlRfRURJVF9ESVNBQkxFRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9TRUFSQ0hfU1JDID0gIklNR19FVE9PTF9TRUFSQ0hfU1JDIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0VUT09MX1NFQVJDSF9TUkNfSE9WRVIgPSAiSU1HX0VUT09MX1NFQVJDSF9TUkNfSE9WRVIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfU0VBUkNIX1NSQ19ESVNBQkxFRCA9ICJJTUdfRVRPT0xfU0VBUkNIX1NSQ19ESVNBQkxFRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9SRUZSRVNIX05BViA9ICJJTUdfRVRPT0xfUkVGUkVTSF9OQVYiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfUkVGUkVTSF9OQVZfSE9WRVIgPSAiSU1HX0VUT09MX1JFRlJFU0hfTkFWX0hPVkVSIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0VUT09MX1JFRlJFU0hfTkFWX0RJU0FCTEVEID0gIklNR19FVE9PTF9SRUZSRVNIX05BVl9ESVNBQkxFRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9TVE9QX05BViA9ICJJTUdfRVRPT0xfU1RPUF9OQVYiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfU1RPUF9OQVZfSE9WRVIgPSAiSU1HX0VUT09MX1NUT1BfTkFWX0hPVkVSIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0VUT09MX1NUT1BfTkFWX0RJU0FCTEVEID0gIklNR19FVE9PTF9TVE9QX05BVl9ESVNBQkxFRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9ORVhUX05BViA9ICJJTUdfRVRPT0xfTkVYVF9OQVYiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfUFJFVklPVVNfTkFWID0gIklNR19FVE9PTF9QUkVWSU9VU19OQVYiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfTkVXX1BBR0UgPSAiSU1HX0VUT09MX05FV19QQUdFIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0VUT09MX05FV19QQUdFX0hPVkVSID0gIklNR19FVE9PTF9ORVdfUEFHRV9IT1ZFUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9ORVdfUEFHRV9ESVNBQkxFRCA9ICJJTUdfRVRPT0xfTkVXX1BBR0VfRElTQUJMRUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfU0VUX1BBR0UgPSAiSU1HX0VUT09MX1NFVF9QQUdFIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0VUT09MX1NFVF9QQUdFX0hPVkVSID0gIklNR19FVE9PTF9TRVRfUEFHRV9IT1ZFUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9TRVRfUEFHRV9ESVNBQkxFRCA9ICJJTUdfRVRPT0xfU0VUX1BBR0VfRElTQUJMRUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfTkVXX1dORCA9ICJJTUdfRVRPT0xfTkVXX1dORCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9ORVdfV05EX0hPVkVSID0gIklNR19FVE9PTF9ORVdfV05EX0hPVkVSIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0VUT09MX05FV19XTkRfRElTQUJMRUQgPSAiSU1HX0VUT09MX05FV19XTkRfRElTQUJMRUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfUElOX0VESVRPUiA9ICJJTUdfRVRPT0xfUElOX0VESVRPUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FVE9PTF9QSU5fRURJVE9SX0hPVkVSID0gIklNR19FVE9PTF9QSU5fRURJVE9SX0hPVkVSIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0VUT09MX1BJTl9FRElUT1JfRElTQUJMRUQgPSAiSU1HX0VUT09MX1BJTl9FRElUT1JfRElTQUJMRUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfREVGX1BFUlNQRUNUSVZFID0gIklNR19FVE9PTF9ERUZfUEVSU1BFQ1RJVkUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRVRPT0xfREVGX1BFUlNQRUNUSVZFX0hPVkVSID0gIklNR19FVE9PTF9ERUZfUEVSU1BFQ1RJVkVfSE9WRVIiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0VUT09MX1BST0JMRU1fQ0FURUdPUlkgPSAiSU1HX0VUT09MX1BST0JMRU1fQ0FURUdPUlkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBsb2NhbCB0b29sYmFycwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19MQ0xfQ0xPU0VfVklFVyA9ICJJTUdfTENMX0NMT1NFX1ZJRVciOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfTENMX0NMT1NFX1ZJRVdfSE9WRVIgPSAiSU1HX0xDTF9DTE9TRV9WSUVXX0hPVkVSIjsgLy8kTk9OLU5MUy0xJAkKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19MQ0xfUElOX1ZJRVcgPSAiSU1HX0xDTF9QSU5fVklFVyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19MQ0xfUElOX1ZJRVdfSE9WRVIgPSAiSU1HX0xDTF9QSU5fVklFV19IT1ZFUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19MQ0xfTUlOX1ZJRVcgPSAiSU1HX0xDTF9NSU5fVklFVyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19MQ0xfTUlOX1ZJRVdfSE9WRVIgPSAiSU1HX0xDTF9NSU5fVklFV19IT1ZFUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19MQ0xfR09UT09CSl9UU0sgPSAiSU1HX0xDTF9HT1RPT0JKX1RTSyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19MQ0xfQUREVFNLX1RTSyA9ICJJTUdfTENMX0FERFRTS19UU0siOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfTENMX1JFTVRTS19UU0sgPSAiSU1HX0xDTF9SRU1UU0tfVFNLIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0xDTF9TSE9XQ09NUExFVEVfVFNLID0gIklNR19MQ0xfU0hPV0NPTVBMRVRFX1RTSyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19MQ0xfVklFV19NRU5VID0gIklNR19MQ0xfVklFV19NRU5VIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0xDTF9WSUVXX01FTlVfSE9WRVIgPSAiSU1HX0xDTF9WSUVXX01FTlVfSE9WRVIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfTENMX1NFTEVDVEVEX01PREUgPSAiSU1HX0xDTF9TRUxFQ1RFRF9NT0RFIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0xDTF9TSE9XQ0hJTERfTU9ERSA9ICJJTUdfTENMX1NIT1dDSElMRF9NT0RFIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0xDTF9UUkVFX01PREUgPSAiSU1HX0xDTF9UUkVFX01PREUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfTENMX0RFRkFVTFRTX1BTID0gIklNR19MQ0xfREVGQVVMVFNfUFMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfTENMX0ZJTFRFUl9QUyA9ICJJTUdfTENMX0ZJTFRFUl9QUyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19MQ0xfUkVNQktNUktfVFNLID0gIklNR19MQ0xfUkVNQktNUktfVFNLIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX0xDTF9TSE9XU1lOQ19STiA9ICJJTUdfTENMX1NIT1dTWU5DX1JOIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19MQ0xfRkxBVF9MQVlPVVQgPSAiSU1HX0xDTF9GTEFUX0xBWU9VVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfTENMX0hJRVJBUkNISUNBTF9MQVlPVVQgPSAiSU1HX0xDTF9ISUVSQVJDSElDQUxfTEFZT1VUIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy93aXphcmQgaW1hZ2VzCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX1dJWkJBTl9ORVdQUkpfV0laID0gIklNR19XSVpCQU5fTkVXUFJKX1dJWiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19XSVpCQU5fTkVXRk9MREVSX1dJWiA9ICJJTUdfV0laQkFOX05FV0ZPTERFUl9XSVoiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfV0laQkFOX05FV0ZJTEVfV0laID0gIklNR19XSVpCQU5fTkVXRklMRV9XSVoiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfV0laQkFOX0lNUE9SVERJUl9XSVogPSAiSU1HX1dJWkJBTl9JTVBPUlRESVJfV0laIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX1dJWkJBTl9JTVBPUlRaSVBfV0laID0gIklNR19XSVpCQU5fSU1QT1JUWklQX1dJWiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19XSVpCQU5fRVhQT1JURElSX1dJWiA9ICJJTUdfV0laQkFOX0VYUE9SVERJUl9XSVoiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfV0laQkFOX0VYUE9SVFpJUF9XSVogPSAiSU1HX1dJWkJBTl9FWFBPUlRaSVBfV0laIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX1dJWkJBTl9SRVNPVVJDRVdPUktJTkdTRVRfV0laID0gIklNR19XSVpCQU5fRVhQT1JUWklQX1dJWiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfRExHQkFOX1NBVkVBU19ETEcgPSAiSU1HX0RMR0JBTl9TQVZFQVNfRExHIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX1ZJRVdfREVGQVVMVFZJRVdfTUlTQyA9ICJJTUdfVklFV19ERUZBVUxUVklFV19NSVNDIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gdGFzayBvYmplY3RzCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX09CSlNfSFBSSU9fVFNLID0gIklNR19PQkpTX0hQUklPX1RTSyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19PQkpTX01QUklPX1RTSyA9ICJJTUdfT0JKU19NUFJJT19UU0siOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfT0JKU19MUFJJT19UU0sgPSAiSU1HX09CSlNfTFBSSU9fVFNLIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX09CSlNfQ09NUExFVEVfVFNLID0gIklNR19PQkpTX0NPTVBMRVRFX1RTSyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19PQkpTX0lOQ09NUExFVEVfVFNLID0gIklNR19PQkpTX0lOQ09NUExFVEVfVFNLIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX09CSlNfQlJLUFRfVFNLID0gIklNR19PQkpTX0JSS1BUX1RTSyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIHByb2R1Y3QKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfT0JKU19ERUZBVUxUX1BST0QgPSAiSU1HX09CSlNfREVGQVVMVF9QUk9EIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gd2VsY29tZQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19PQkpTX1dFTENPTUVfSVRFTSA9ICJJTUdfT0JKU19XRUxDT01FX0lURU0iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfT0JKU19XRUxDT01FX0JBTk5FUiA9ICJJTUdfT0JKU19XRUxDT01FX0JBTk5FUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIHN5bmNocm9uaXphdGlvbiBpbmRpY2F0b3Igb2JqZWN0cwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19PQkpTX1dCRVRfU1RBVCA9ICJJTUdfT0JKU19XQkVUX1NUQVQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfT0JKU19TQkVUX1NUQVQgPSAiSU1HX09CSlNfU0JFVF9TVEFUIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX09CSlNfQ09ORkxJQ1RfU1RBVCA9ICJJTUdfT0JKU19DT05GTElDVF9TVEFUIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gbG9jYWwgY29udGVudCBpbmRpY2F0b3Igb2JqZWN0cwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19PQkpTX05PVExPQ0FMX1NUQVQgPSAiSU1HX09CSlNfTk9UTE9DQUxfU1RBVCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19PQkpTX0xPQ0FMX1NUQVQgPSAiSU1HX09CSlNfTE9DQUxfU1RBVCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19PQkpTX0ZJTExMT0NBTF9TVEFUID0gIklNR19PQkpTX0ZJTExMT0NBTF9TVEFUIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gcGFydCBkaXJlY3QgbWFuaXB1bGF0aW9uIG9iamVjdHMKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfT0JKU19ETkRfTEVGVF9TT1VSQ0UgPSAiSU1HX09CSlNfRE5EX0xFRlRfU09VUkNFIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX09CSlNfRE5EX0xFRlRfTUFTSyA9ICJJTUdfT0JKU19ETkRfTEVGVF9NQVNLIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX09CSlNfRE5EX1JJR0hUX1NPVVJDRSA9ICJJTUdfT0JKU19ETkRfUklHSFRfU09VUkNFIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX09CSlNfRE5EX1JJR0hUX01BU0sgPSAiSU1HX09CSlNfRE5EX1JJR0hUX01BU0siOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfT0JKU19ETkRfVE9QX1NPVVJDRSA9ICJJTUdfT0JKU19ETkRfVE9QX1NPVVJDRSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19PQkpTX0RORF9UT1BfTUFTSyA9ICJJTUdfT0JKU19ETkRfVE9QX01BU0siOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfT0JKU19ETkRfQk9UVE9NX1NPVVJDRSA9ICJJTUdfT0JKU19ETkRfQk9UVE9NX1NPVVJDRSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19PQkpTX0RORF9CT1RUT01fTUFTSyA9ICJJTUdfT0JKU19ETkRfQk9UVE9NX01BU0siOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfT0JKU19ETkRfSU5WQUxJRF9TT1VSQ0UgPSAiSU1HX09CSlNfRE5EX0lOVkFMSURfU09VUkNFIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX09CSlNfRE5EX0lOVkFMSURfTUFTSyA9ICJJTUdfT0JKU19ETkRfSU5WQUxJRF9NQVNLIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX09CSlNfRE5EX1NUQUNLX1NPVVJDRSA9ICJJTUdfT0JKU19ETkRfU1RBQ0tfU09VUkNFIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1HX09CSlNfRE5EX1NUQUNLX01BU0sgPSAiSU1HX09CSlNfRE5EX1NUQUNLX01BU0siOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTUdfT0JKU19ETkRfT0ZGU0NSRUVOX1NPVVJDRSA9ICJJTUdfT0JKU19ETkRfT0ZGU0NSRUVOX1NPVVJDRSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19PQkpTX0RORF9PRkZTQ1JFRU5fTUFTSyA9ICJJTUdfT0JKU19ETkRfT0ZGU0NSRUVOX01BU0siOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgd29ya2JlbmNoIGltYWdlIHdpdGggdGhlIGdpdmVuCi0gICAgICogc3ltYm9saWMgbmFtZS4gVXNlIHRoaXMgbWV0aG9kIHRvIHJldHJpZXZlIGltYWdlIGRlc2NyaXB0b3JzIGZvciBhbnkKLSAgICAgKiBvZiB0aGUgaW1hZ2VzIG5hbWVkIGluIHRoaXMgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3ltYm9saWNOYW1lIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoZSBpbWFnZQotICAgICAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgc3ltYm9saWNOYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JREVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1YzI2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBUaGUgSURFUHJlZmVyZW5jZUluaXRpYWxpemVyIGlzIHRoZSBwcmVmZXJlbmNlIGluaXRpYWxpemVyIGZvciAKLSAqIHRoZSBJREUgcHJlZmVyZW5jZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJCi0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCi0gICAgICAgIC8vIEFQSSBwcmVmZXJlbmNlcwotCi0gICAgICAgIG5vZGUucHV0KElERS5QcmVmZXJlbmNlcy5QUk9KRUNUX09QRU5fTkVXX1BFUlNQRUNUSVZFLAotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLk9QRU5fUEVSU1BFQ1RJVkVfUkVQTEFDRSk7Ci0gICAgCi0gICAgICAgIC8vIFNldCB0aGUgd29ya3NwYWNlIHNlbGVjdGlvbiBkaWFsb2cgdG8gb3BlbiBieSBkZWZhdWx0Ci0gICAgICAgIG5vZGUucHV0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICBJREUuUHJlZmVyZW5jZXMuU0hPV19XT1JLU1BBQ0VfU0VMRUNUSU9OX0RJQUxPRywgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gSW50ZXJuYWwgcHJlZmVyZW5jZXMKLSAgICAgICAgCi0JCW5vZGUucHV0Qm9vbGVhbihJREVJbnRlcm5hbFByZWZlcmVuY2VzLlNBVkVfQUxMX0JFRk9SRV9CVUlMRCwgZmFsc2UpOwotCQlub2RlLnB1dEludChJREVJbnRlcm5hbFByZWZlcmVuY2VzLlNBVkVfSU5URVJWQUwsIDUpOyAvLzUgbWludXRlcwotCQlub2RlLnB1dEJvb2xlYW4oSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5XRUxDT01FX0RJQUxPRywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihJREVJbnRlcm5hbFByZWZlcmVuY2VzLlJFRlJFU0hfV09SS1NQQUNFX09OX1NUQVJUVVAsCi0gICAgICAgICAgICAgICAgZmFsc2UpOwotCQlub2RlLnB1dEJvb2xlYW4oCi0gICAgICAgICAgICAgICAgSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5FWElUX1BST01QVF9PTl9DTE9TRV9MQVNUX1dJTkRPVywgdHJ1ZSk7Ci0JCW5vZGUucHV0KElERUludGVybmFsUHJlZmVyZW5jZXMuUFJPSkVDVF9TV0lUQ0hfUEVSU1BfTU9ERSwKLSAgICAgICAgICAgICAgICBJREVJbnRlcm5hbFByZWZlcmVuY2VzLlBTUE1fUFJPTVBUKTsKLQkJCi0JCS8vIFR1cm5pbmcgc29tZSBIZWxwIE1lbnUgc2VwYXJhdG9ycyBvbgotCQlub2RlLnB1dEJvb2xlYW4oZ2V0SGVscFNlcGFyYXRvcktleSgiZ3JvdXAubWFpbiIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLnB1dEJvb2xlYW4oZ2V0SGVscFNlcGFyYXRvcktleSgiZ3JvdXAuYXNzaXN0IiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUucHV0Qm9vbGVhbihnZXRIZWxwU2VwYXJhdG9yS2V5KCJncm91cC51cGRhdGVzIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvL1NldCB1cCBtYXJrZXIgbGltaXRzCi0JCW5vZGUucHV0Qm9vbGVhbihJREVJbnRlcm5hbFByZWZlcmVuY2VzLkxJTUlUX1BST0JMRU1TLCB0cnVlKTsKLQkJbm9kZS5wdXRJbnQoSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5QUk9CTEVNU19MSU1JVCwgMTAwKTsKLQkJbm9kZS5wdXQoSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5QUk9CTEVNU19HUk9VUElORywgIiIpOy8vJE5PTi1OTFMtMSQKLQkJCi0JCW5vZGUucHV0Qm9vbGVhbihJREVJbnRlcm5hbFByZWZlcmVuY2VzLkxJTUlUX0JPT0tNQVJLUywgdHJ1ZSk7Ci0JCW5vZGUucHV0SW50KElERUludGVybmFsUHJlZmVyZW5jZXMuQk9PS01BUktTX0xJTUlULCAxMDApOwotCQkKLQkJbm9kZS5wdXRCb29sZWFuKElERUludGVybmFsUHJlZmVyZW5jZXMuTElNSVRfVEFTS1MsIHRydWUpOwotCQlub2RlLnB1dEludChJREVJbnRlcm5hbFByZWZlcmVuY2VzLlRBU0tTX0xJTUlULCAxMDApOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRIZWxwU2VwYXJhdG9yS2V5KFN0cmluZyBncm91cElkKSB7Ci0JCXJldHVybiAidXNlU2VwYXJhdG9yLiIrSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0hFTFArIi4iK2dyb3VwSWQ7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvSURFV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvSURFV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlYjg3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERVdvcmtiZW5jaEFjdGl2aXR5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklSZWdpc3RyeUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBsdWdpbkNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSVRyaWdnZXJQb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5Xb3JrYmVuY2hBY3Rpdml0eUhlbHBlcjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRoYXQgbWFuYWdlcyBwcm9tb3Rpb24gb2YgYWN0aXZpdGVzIGluIHJlc3BvbnNlIHRvIHdvcmtzcGFjZSBjaGFuZ2VzLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVXb3JrYmVuY2hBY3Rpdml0eUhlbHBlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX1BPSU5UID0gIm9yZy5lY2xpcHNlLnVpLmlkZS5uYXR1cmVzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIFJlc291cmNlIGxpc3RlbmVyIHRoYXQgcmVhY3RzIHRvIG5ldyBwcm9qZWN0cyAoYW5kIGFzc29jaWF0ZWQgbmF0dXJlcykgCi0gICAgICogY29taW5nIGludG8gdGhlIHdvcmtzcGFjZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogTWFwcGluZyBmcm9tIGNvbXBvc2l0ZSBuYXR1cmUgSUQgdG8gSVBsdWdpbkNvbnRyaWJ1dGlvbi4gIFVzZWQgZm9yIHByb3BlcgotICAgICAqIGFjdGl2aXR5IG1hcHBpbmcgb2YgbmF0dXJlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBuYXR1cmVNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSURFV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIgc2luZ2xldG9uOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJREVXb3JrYmVuY2hBY3Rpdml0eUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgaWYgKHNpbmdsZXRvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzaW5nbGV0b24gPSBuZXcgSURFV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyA8Y29kZT5JREVXb3JrYmVuY2hBY3Rpdml0eUhlbHBlcjwvY29kZT4gd2hpY2ggd2lsbCBsaXN0ZW4gCi0gICAgICogZm9yIHdvcmtzcGFjZSBjaGFuZ2VzIGFuZCBwcm9tb3RlIGFjdGl2aXRpZXMgYWNjb3JkaW5nbHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJREVXb3JrYmVuY2hBY3Rpdml0eUhlbHBlcigpIHsKLSAgICAgICAgbmF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgLy8gZm9yIGR5bmFtaWMgVUkKLSAgICAgICAgUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5hZGRSZWdpc3RyeUNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG5ldyBJUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0cnlDaGFuZ2VkKElSZWdpc3RyeUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0RXh0ZW5zaW9uRGVsdGFzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLCAibmF0dXJlcyIpLmxlbmd0aCA+IDApIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWROYXR1cmVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9LCAib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBsb2FkTmF0dXJlcygpOwotICAgICAgICBsaXN0ZW5lciA9IGdldENoYW5nZUxpc3RlbmVyKCk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgLy8gY3Jhd2wgdGhlIGluaXRpYWwgcHJvamVjdHMgdG8gc2V0IHVwIG5hdHVyZSBiaW5kaW5ncwotICAgICAgICBJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQotICAgICAgICAgICAgICAgIC5nZXRQcm9qZWN0cygpOwotICAgICAgICBJV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0IHdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCA9IFBsYXRmb3JtVUkKLSAgICAgICAgICAgICAgICAuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1Byb2plY3QocHJvamVjdHNbaV0sIHdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgZHluYW1pYyBVSS4gIENsZWFycyB0aGUgY2FjaGUgb2Yga25vd24gbmF0dXJlcyBhbmQgcmVjcmVhdGVzIGl0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxvYWROYXR1cmVzKCkgewotICAgICAgICBuYXR1cmVNYXAuY2xlYXIoKTsKLSAgICAgICAgSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKQotICAgICAgICAgICAgICAgIC5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmF0dXJlcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIElFeHRlbnNpb25bXSBleHRlbnNpb25zID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbElkID0gZXh0ZW5zaW9uLmdldFNpbXBsZUlkZW50aWZpZXIoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYXR1cmVJZCA9IGV4dGVuc2lvbi5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgICBuYXR1cmVNYXAucHV0KG5hdHVyZUlkLCBuZXcgSVBsdWdpbkNvbnRyaWJ1dGlvbigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsSWQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbElkOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwbHVnaW5JZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIGNoYW5nZSBsaXN0ZW5lciBmb3IgbGlzdGVuaW5nIHRvIHJlc291cmNlIGNoYW5nZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVycwotICAgICAqLwotICAgIHByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogKG5vbi1KYXZhZG9jKSBAc2VlCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmICghV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuaXNGaWx0ZXJpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIElSZXNvdXJjZURlbHRhIG1haW5EZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWFpbkRlbHRhID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAvL0hhcyB0aGUgcm9vdCBjaGFuZ2VkPwotICAgICAgICAgICAgICAgIGlmIChtYWluRGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1haW5EZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUk9PVCkgewotCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gbWFpbkRlbHRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0IHdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCA9IFBsYXRmb3JtVUkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2aXR5U3VwcG9ydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZURlbHRhIGRlbHRhID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGRlbHRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9qZWN0KHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0RvIG5vdGhpbmcgaWYgdGhlcmUgaXMgYSBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlIG5hdHVyZXMgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIHdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCB0aGUgYWN0aXZpdHkgc3VwcG9ydAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICBJV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0IHdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCkKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFwcm9qZWN0LmlzT3BlbigpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBTdHJpbmdbXSBpZHMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7Ci0gICAgICAgIGlmIChpZHMubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGlkcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgSVBsdWdpbkNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSAoSVBsdWdpbkNvbnRyaWJ1dGlvbikgbmF0dXJlTWFwCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoaWRzW2pdKTsKLSAgICAgICAgICAgIGlmIChjb250cmlidXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsgLy9iYWQgbmF0dXJlIElELgotICAgICAgICAgICAgSVRyaWdnZXJQb2ludCB0cmlnZ2VyUG9pbnQgPSB3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgLmdldFRyaWdnZXJQb2ludE1hbmFnZXIoKS5nZXRUcmlnZ2VyUG9pbnQoTkFUVVJFX1BPSU5UKTsgCi0gICAgICAgICAgICAvL2NvbnN1bHQgdGhlIGFkdmlzb3IgLSBpZiB0aGUgYWN0aXZpdGllcyBuZWVkIGVuYWJsaW5nLCB0aGV5IHdpbGwgYmUKLSAgICAgICAgICAgIFdvcmtiZW5jaEFjdGl2aXR5SGVscGVyLmFsbG93VXNlT2YodHJpZ2dlclBvaW50LCBjb250cmlidXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5ob29rcyB0aGUgPGNvZGU+SVJlc291cmNlQ2hhbmdlTGlzdGVuZXI8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JREVXb3JrYmVuY2hBZHZpc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERVdvcmtiZW5jaEFkdmlzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwNWQxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERVdvcmtiZW5jaEFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklCdW5kbGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUJ1bmRsZUdyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luVmVyc2lvbklkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaFdpbmRvd0Fkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWwuV29ya2JlbmNoQWRhcHRlckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvZ3Jlc3MuUHJvZ3Jlc3NNb25pdG9ySm9ic0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogSURFLXNwZWNpZmllZCB3b3JrYmVuY2ggYWR2aXNvciB3aGljaCBjb25maWd1cmVzIHRoZSB3b3JrYmVuY2ggZm9yIHVzZSBhcwotICogYW4gSURFLgotICogPHA+Ci0gKiBOb3RlOiBUaGlzIGNsYXNzIHJlcGxhY2VzIDxjb2RlPm9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaDwvY29kZT4uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIElERVdvcmtiZW5jaEFkdmlzb3IgZXh0ZW5kcyBXb3JrYmVuY2hBZHZpc29yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLQkVOQ0hfUFJFRkVSRU5DRV9DQVRFR09SWV9JRCA9ICJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuV29ya2JlbmNoIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBkaWFsb2cgc2V0dGluZyBrZXkgdG8gYWNjZXNzIHRoZSBrbm93biBpbnN0YWxsZWQgZmVhdHVyZXMKLSAgICAgKiBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSB3b3JrYmVuY2ggd2FzIHJ1bi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTEVEX0ZFQVRVUkVTID0gImluc3RhbGxlZEZlYXR1cmVzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSURFV29ya2JlbmNoQWR2aXNvciB3b3JrYmVuY2hBZHZpc29yID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEV2ZW50IGxvb3AgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIHRoZSBhZHZpc29yLgotICAgICAqLwotICAgIHByaXZhdGUgSURFRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnRhaW5zIHRoZSB3b3Jrc3BhY2UgbG9jYXRpb24gaWYgdGhlIC1zaG93bG9jYXRpb24gY29tbWFuZCBsaW5lCi0gICAgICogYXJndW1lbnQgaXMgc3BlY2lmaWVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc3BlY2lmaWVkLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHdvcmtzcGFjZUxvY2F0aW9uID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIE9yZGVyZWQgbWFwIG9mIHZlcnNpb25lZCBmZWF0dXJlIGlkcyAtPiBpbmZvIHRoYXQgYXJlIG5ldyBmb3IgdGhpcwotICAgICAqIHNlc3Npb247IDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuaW5pdGlhbGl6ZWQuIEtleSB0eXBlOgotICAgICAqIDxjb2RlPlN0cmluZzwvY29kZT4sIFZhbHVlIHR5cGU6IDxjb2RlPkFib3V0SW5mbzwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgbmV3bHlBZGRlZEJ1bmRsZUdyb3VwczsKLQotICAgIC8qKgotICAgICAqIEFycmF5IG9mIDxjb2RlPkFib3V0SW5mbzwvY29kZT4gZm9yIGFsbCBuZXcgaW5zdGFsbGVkCi0gICAgICogZmVhdHVyZXMgdGhhdCBzcGVjaWZ5IGEgd2VsY29tZSBwZXJzcGVjdGl2ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEFib3V0SW5mb1tdIHdlbGNvbWVQZXJzcGVjdGl2ZUluZm9zID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEhlbHBlciBmb3IgbWFuYWdpbmcgYWN0aXZpdGVzIGluIHJlc3BvbnNlIHRvIHdvcmtzcGFjZSBjaGFuZ2VzLgotICAgICAqLwotICAgIHByaXZhdGUgSURFV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIgYWN0aXZpdHlIZWxwZXIgPSBudWxsOwotICAgIAotICAgIC8qKgotICAgICAqIEhlbHBlciBmb3IgbWFuYWdpbmcgd29yayB0aGF0IGlzIHBlcmZvcm1lZCB3aGVuIHRoZSBzeXN0ZW0gaXMKLSAgICAgKiBvdGhlcndpc2UgaWRsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElERUlkbGVIZWxwZXIgaWRsZUhlbHBlcjsKLQotCS8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgd29ya2JlbmNoIGFkdmlzb3IgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIElERVdvcmtiZW5jaEFkdmlzb3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlmICh3b3JrYmVuY2hBZHZpc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB3b3JrYmVuY2hBZHZpc29yID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI2luaXRpYWxpemUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKElXb3JrYmVuY2hDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgd2UgYWx3YXlzIHNhdmUgYW5kIHJlc3RvcmUgd29ya3NwYWNlIHN0YXRlCi0gICAgICAgIGNvbmZpZ3VyZXIuc2V0U2F2ZUFuZFJlc3RvcmUodHJ1ZSk7Ci0KLSAgICAgICAgLy8gc2V0dXAgdGhlIGV2ZW50IGxvb3AgZXhjZXB0aW9uIGhhbmRsZXIKLSAgICAgICAgZXhjZXB0aW9uSGFuZGxlciA9IG5ldyBJREVFeGNlcHRpb25IYW5kbGVyKGNvbmZpZ3VyZXIpOwotCi0gICAgICAgIC8vIHJlZ2lzdGVyIHdvcmtzcGFjZSBhZGFwdGVycwotICAgICAgICBXb3JrYmVuY2hBZGFwdGVyQnVpbGRlci5yZWdpc3RlckFkYXB0ZXJzKCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gICAgICAgIFN0cmluZ1tdIGNtZExpbmVBcmdzID0gUGxhdGZvcm0uZ2V0Q29tbWFuZExpbmVBcmdzKCk7Ci0KLSAgICAgICAgLy8gaW5jbHVkZSB0aGUgd29ya3NwYWNlIGxvY2F0aW9uIGluIHRoZSB0aXRsZSAKLSAgICAgICAgLy8gaWYgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gLXNob3dsb2NhdGlvbiBpcyBzcGVjaWZpZWQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbWRMaW5lQXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCItc2hvd2xvY2F0aW9uIi5lcXVhbHNJZ25vcmVDYXNlKGNtZExpbmVBcmdzW2ldKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAJU3RyaW5nIG5hbWUgPSBudWxsOwotICAgICAgICAgICAgCWlmIChjbWRMaW5lQXJncy5sZW5ndGggPiBpICsgMSkKLSAgICAgICAgICAgIAkJbmFtZSA9IGNtZExpbmVBcmdzW2krMV07Ci0gICAgICAgICAgICAJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmluZGV4T2YoIi0iKSA9PSAtMSkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIAkJd29ya3NwYWNlTG9jYXRpb24gPSBuYW1lOwotICAgICAgICAgICAgCWVsc2UKLSAgICAgICAgICAgIAkJd29ya3NwYWNlTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gcmVnaXN0ZXIgc2hhcmVkIGltYWdlcwotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2VzKCk7Ci0KLSAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgYWN0aXZpdHkgaGVscGVyCi0gICAgICAgIGFjdGl2aXR5SGVscGVyID0gSURFV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICAvL2luaXRpYWxpemUgaWRsZSBoYW5kbGVyCi0gICAgICAgIGlkbGVIZWxwZXIgPSBuZXcgSURFSWRsZUhlbHBlcihjb25maWd1cmVyKTsKLSAgICB9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI3ByZVN0YXJ0dXAoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByZVN0YXJ0dXAoKSB7Ci0KLSAgICAgICAgLy9TdXNwZW5kIGJhY2tncm91bmQgam9icyB3aGlsZSB3ZSBzdGFydHVwCi0gICAgICAgIFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5zdXNwZW5kKCk7Ci0KLSAgICAgICAgLy9SZWdpc3RlciB0aGUgYnVpbGQgYWN0aW9ucwotICAgICAgICBJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgLmdldFByb2dyZXNzU2VydmljZSgpOwotICAgICAgICBJbWFnZURlc2NyaXB0b3IgbmV3SW1hZ2UgPSBJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcwotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0VUT09MX0JVSUxEX0VYRUMpOwotICAgICAgICBzZXJ2aWNlLnJlZ2lzdGVySWNvbkZvckZhbWlseShuZXdJbWFnZSwKLSAgICAgICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCk7Ci0gICAgICAgIHNlcnZpY2UucmVnaXN0ZXJJY29uRm9yRmFtaWx5KG5ld0ltYWdlLAotICAgICAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjcG9zdFN0YXJ0dXAoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBvc3RTdGFydHVwKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVmcmVzaEZyb21Mb2NhbCgpOwotICAgICAgICAgICAgY2hlY2tVcGRhdGVzKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ly9SZXN1bWUgYmFja2dyb3VuZCBqb2JzIGFmdGVyIHdlIHN0YXJ0dXAKLSAgICAgICAgICAgIFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5yZXN1bWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjcG9zdFNodXRkb3duCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcG9zdFNodXRkb3duKCkgewotICAgICAgICBpZiAoYWN0aXZpdHlIZWxwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgYWN0aXZpdHlIZWxwZXIuc2h1dGRvd24oKTsKLSAgICAgICAgICAgIGFjdGl2aXR5SGVscGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaWRsZUhlbHBlciAhPSBudWxsKSB7Ci0gICAgICAgIAlpZGxlSGVscGVyLnNodXRkb3duKCk7Ci0gICAgICAgIAlpZGxlSGVscGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoSURFV29ya2JlbmNoUGx1Z2luLmdldFBsdWdpbldvcmtzcGFjZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRpc2Nvbm5lY3RGcm9tV29ya3NwYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI2V2ZW50TG9vcEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV2ZW50TG9vcEV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIHN1cGVyLmV2ZW50TG9vcEV4Y2VwdGlvbihleGNlcHRpb24pOwotICAgICAgICBpZiAoZXhjZXB0aW9uSGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25IYW5kbGVyLmhhbmRsZUV4Y2VwdGlvbihleGNlcHRpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldFdvcmtiZW5jaENvbmZpZ3VyZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0V29ya2JlbmNoQ29uZmlndXJlcigpLmVtZXJnZW5jeUNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI2NyZWF0ZVdvcmtiZW5jaFdpbmRvd0Fkdmlzb3Iob3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIpCi0gICAgICovCi0gICAgcHVibGljIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IgY3JlYXRlV29ya2JlbmNoV2luZG93QWR2aXNvcihJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0gICAgICAgIHJldHVybiAgbmV3IElERVdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IodGhpcywgY29uZmlndXJlcik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBpbnRybyBwbHVnaW4gaXMgcHJlc2VudCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0ludHJvKCkgewotICAgICAgICByZXR1cm4gZ2V0V29ya2JlbmNoQ29uZmlndXJlcigpLmdldFdvcmtiZW5jaCgpLmdldEludHJvTWFuYWdlcigpCi0gICAgICAgICAgICAgICAgLmhhc0ludHJvKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hGcm9tTG9jYWwoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGNvbW1hbmRMaW5lQXJncyA9IFBsYXRmb3JtLmdldENvbW1hbmRMaW5lQXJncygpOwotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgYm9vbGVhbiByZWZyZXNoID0gc3RvcmUKLSAgICAgICAgICAgICAgICAuZ2V0Qm9vbGVhbihJREVJbnRlcm5hbFByZWZlcmVuY2VzLlJFRlJFU0hfV09SS1NQQUNFX09OX1NUQVJUVVApOwotICAgICAgICBpZiAoIXJlZnJlc2gpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy9EbyBub3QgcmVmcmVzaCBpZiBpdCB3YXMgYWxyZWFkeSBkb25lIGJ5IGNvcmUgb24gc3RhcnR1cC4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kTGluZUFyZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBpZiAoY29tbWFuZExpbmVBcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1yZWZyZXNoIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQkJZmluYWwgSUNvbnRhaW5lciByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSm9iIGpvYiA9IG5ldyBXb3Jrc3BhY2VKb2IoSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya3NwYWNlX3JlZnJlc2hpbmcpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXJvb3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCWpvYi5zZXRSdWxlKHJvb3QpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNjb25uZWN0IGZyb20gdGhlIGNvcmUgd29ya3NwYWNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkaXNjb25uZWN0RnJvbVdvcmtzcGFjZSgpIHsKLSAgICAgICAgLy8gc2F2ZSB0aGUgd29ya3NwYWNlCi0gICAgICAgIGZpbmFsIE11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwgMSwgSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvYmxlbVNhdmluZ1dvcmtiZW5jaCwgbnVsbCk7Ci0gICAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzLm1lcmdlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zYXZlKHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvcikpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMubWVyZ2UoZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3IFByb2dyZXNzTW9uaXRvckpvYnNEaWFsb2cobnVsbCkucnVuKHRydWUsIGZhbHNlLCBydW5uYWJsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgc3RhdHVzCi0gICAgICAgICAgICAgICAgICAgIC5tZXJnZShuZXcgU3RhdHVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5JbnRlcm5hbEVycm9yLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHN0YXR1cy5tZXJnZShuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5JREVfV09SS0JFTkNILCAxLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5JbnRlcm5hbEVycm9yLCBlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKG51bGwsIElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2JsZW1zU2F2aW5nV29ya3NwYWNlLAotICAgICAgICAgICAgICAgIG51bGwsIHN0YXR1cywgSVN0YXR1cy5FUlJPUiB8IElTdGF0dXMuV0FSTklORyk7Ci0gICAgICAgIGlmICghc3RhdHVzLmlzT0soKSkgewotICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmxvZyhJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9ibGVtc1NhdmluZ1dvcmtzcGFjZSwgc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgLW5ld1VwZGF0ZXMgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGlzIHByZXNlbnQKLSAgICAgKiBhbmQgaWYgc28sIG9wZW5zIHRoZSB1cGRhdGUgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tVcGRhdGVzKCkgewotICAgICAgICBib29sZWFuIG5ld1VwZGF0ZXMgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nW10gY29tbWFuZExpbmVBcmdzID0gUGxhdGZvcm0uZ2V0Q29tbWFuZExpbmVBcmdzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZExpbmVBcmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZExpbmVBcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1uZXdVcGRhdGVzIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG5ld1VwZGF0ZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5ld1VwZGF0ZXMpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU2l0ZU1hbmFnZXIuaGFuZGxlTmV3Q2hhbmdlcygpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmxvZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJQcm9ibGVtIG9wZW5pbmcgdXBkYXRlIG1hbmFnZXIiLCBlLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNnZXREZWZhdWx0UGFnZUlucHV0Ci0gICAgICovCi0gICAgcHVibGljIElBZGFwdGFibGUgZ2V0RGVmYXVsdFBhZ2VJbnB1dCgpIHsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvcgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbFdpbmRvd1BlcnNwZWN0aXZlSWQoKSB7Ci0gICAgICAgIGludCBpbmRleCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2JlbmNoV2luZG93Q291bnQoKSAtIDE7Ci0KLSAgICAgICAgU3RyaW5nIHBlcnNwZWN0aXZlSWQgPSBudWxsOwotICAgICAgICBBYm91dEluZm9bXSB3ZWxjb21lSW5mb3MgPSBnZXRXZWxjb21lUGVyc3BlY3RpdmVJbmZvcygpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiB3ZWxjb21lSW5mb3MgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGluZGV4IDwgd2VsY29tZUluZm9zLmxlbmd0aCkgewotICAgICAgICAgICAgcGVyc3BlY3RpdmVJZCA9IHdlbGNvbWVJbmZvc1tpbmRleF0uZ2V0V2VsY29tZVBlcnNwZWN0aXZlSWQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGVyc3BlY3RpdmVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwZXJzcGVjdGl2ZUlkID0gSURFLlJFU09VUkNFX1BFUlNQRUNUSVZFX0lEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwZXJzcGVjdGl2ZUlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1hcCBvZiB2ZXJzaW9uZWQgZmVhdHVyZSBpZHMgLT4gaW5mbyBvYmplY3QgZm9yIGFsbCBpbnN0YWxsZWQKLSAgICAgKiBmZWF0dXJlcy4gVGhlIGZvcm1hdCBvZiB0aGUgdmVyc2lvbmVkIGZlYXR1cmUgaWQgKHRoZSBrZXkgb2YgdGhlIG1hcCkgaXMKLSAgICAgKiBmZWF0dXJlSWQgKyAiOiIgKyB2ZXJzaW9uSWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBtYXAgb2YgdmVyc2lvbmVkIGZlYXR1cmUgaWRzIC0+IGluZm8gb2JqZWN0IChrZXkgdHlwZToKLSAgICAgKiAgICAgICAgIDxjb2RlPlN0cmluZzwvY29kZT4sIHZhbHVlIHR5cGU6IDxjb2RlPkFib3V0SW5mbzwvY29kZT4pCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHByaXZhdGUgTWFwIGNvbXB1dGVCdW5kbGVHcm91cE1hcCgpIHsKLSAgICAgICAgLy8gdXNlIHRyZWUgbWFwIHRvIGdldCBwcmVkaWNhYmxlIG9yZGVyCi0gICAgICAgIE1hcCBpZHMgPSBuZXcgVHJlZU1hcCgpOwotCi0gICAgICAgIElCdW5kbGVHcm91cFByb3ZpZGVyW10gcHJvdmlkZXJzID0gUGxhdGZvcm0uZ2V0QnVuZGxlR3JvdXBQcm92aWRlcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIElCdW5kbGVHcm91cFtdIGdyb3VwcyA9IHByb3ZpZGVyc1tpXS5nZXRCdW5kbGVHcm91cHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZ3JvdXBzLmxlbmd0aDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgSUJ1bmRsZUdyb3VwIGdyb3VwID0gZ3JvdXBzW2pdOwotICAgICAgICAgICAgICAgIEFib3V0SW5mbyBpbmZvID0gbmV3IEFib3V0SW5mbyhncm91cCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IGluZm8uZ2V0VmVyc2lvbklkKCk7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gPT0gbnVsbCA/ICIwLjAuMCIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUGx1Z2luVmVyc2lvbklkZW50aWZpZXIodmVyc2lvbikudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbmVkRmVhdHVyZSA9IGdyb3VwLmdldElkZW50aWZpZXIoKSArICI6IiArIHZlcnNpb247IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIGlkcy5wdXQodmVyc2lvbmVkRmVhdHVyZSwgaW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaWRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9yZGVyZWQgbWFwIG9mIHZlcnNpb25lZCBmZWF0dXJlIGlkcyAtPiBBYm91dEluZm8gdGhhdCBhcmUKLSAgICAgKiBuZXcgZm9yIHRoaXMgc2Vzc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG9yZGVyZWQgbWFwIG9mIHZlcnNpb25lZCBmZWF0dXJlIGlkcyAoa2V5IHR5cGU6Ci0gICAgICogICAgICAgICA8Y29kZT5TdHJpbmc8L2NvZGU+KSAtPiBpbmZvcyAodmFsdWUgdHlwZToKLSAgICAgKiAgICAgICAgIDxjb2RlPkFib3V0SW5mbzwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0TmV3bHlBZGRlZEJ1bmRsZUdyb3VwcygpIHsKLSAgICAgICAgaWYgKG5ld2x5QWRkZWRCdW5kbGVHcm91cHMgPT0gbnVsbCkKLSAgICAgICAgICAgIG5ld2x5QWRkZWRCdW5kbGVHcm91cHMgPSBjcmVhdGVOZXdCdW5kbGVHcm91cHNNYXAoKTsKLSAgICAgICAgcmV0dXJuIG5ld2x5QWRkZWRCdW5kbGVHcm91cHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgb2xkIGZlYXR1cmVzIHNldHRpbmcgYW5kIHJldHVybnMgYSBtYXAgb2YgbmV3IGZlYXR1cmVzLgotICAgICAqLwotICAgIHByaXZhdGUgTWFwIGNyZWF0ZU5ld0J1bmRsZUdyb3Vwc01hcCgpIHsKLSAgICAgICAgLy8gcmV0cmlldmUgbGlzdCBvZiBpbnN0YWxsZWQgYnVuZGxlIGdyb3VwcyBmcm9tIGxhc3Qgc2Vzc2lvbgkKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBTdHJpbmdbXSBwcmV2aW91c0ZlYXR1cmVzQXJyYXkgPSBzZXR0aW5ncy5nZXRBcnJheShJTlNUQUxMRURfRkVBVFVSRVMpOwotCi0gICAgICAgIC8vIGdldCBhIG1hcCBvZiBjdXJyZW50bHkgaW5zdGFsbGVkIGJ1bmRsZSBncm91cHMgYW5kIHN0b3JlIGl0IGZvciBuZXh0IHNlc3Npb24KLSAgICAgICAgTWFwIGJ1bmRsZUdyb3VwcyA9IGNvbXB1dGVCdW5kbGVHcm91cE1hcCgpOwotICAgICAgICBTdHJpbmdbXSBjdXJyZW50RmVhdHVyZXNBcnJheSA9IG5ldyBTdHJpbmdbYnVuZGxlR3JvdXBzLnNpemUoKV07Ci0gICAgICAgIGJ1bmRsZUdyb3Vwcy5rZXlTZXQoKS50b0FycmF5KGN1cnJlbnRGZWF0dXJlc0FycmF5KTsKLSAgICAgICAgc2V0dGluZ3MucHV0KElOU1RBTExFRF9GRUFUVVJFUywgY3VycmVudEZlYXR1cmVzQXJyYXkpOwotCi0gICAgICAgIC8vIHJlbW92ZSB0aGUgcHJldmlvdXNseSBrbm93biBmcm9tIHRoZSBjdXJyZW50IHNldAotICAgICAgICBpZiAocHJldmlvdXNGZWF0dXJlc0FycmF5ICE9IG51bGwpCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByZXZpb3VzRmVhdHVyZXNBcnJheS5sZW5ndGg7ICsraSkKLSAgICAgICAgICAgICAgICBidW5kbGVHcm91cHMucmVtb3ZlKHByZXZpb3VzRmVhdHVyZXNBcnJheVtpXSk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1bmRsZUdyb3VwczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWNsYXJlcyBhbGwgSURFLXNwZWNpZmljIHdvcmtiZW5jaCBpbWFnZXMuIFRoaXMgaW5jbHVkZXMgYm90aCAic2hhcmVkIgotICAgICAqIGltYWdlcyAobmFtZWQgaW4ge0BsaW5rIElERS5TaGFyZWRJbWFnZXN9KSBhbmQKLSAgICAgKiBpbnRlcm5hbCBpbWFnZXMgKG5hbWVkIGluCi0gICAgICoge0BsaW5rIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlc30pLgotICAgICAqIAotICAgICAqIEBzZWUgSVdvcmtiZW5jaENvbmZpZ3VyZXIjZGVjbGFyZUltYWdlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlY2xhcmVXb3JrYmVuY2hJbWFnZXMoKSB7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIElDT05TX1BBVEggPSAiJG5sJC9pY29ucy9mdWxsLyI7Ly8kTk9OLU5MUy0xJAotICAgICAgICBmaW5hbCBTdHJpbmcgUEFUSF9FTE9DQUxUT09MID0gSUNPTlNfUEFUSCArICJlbGNsMTYvIjsgLy9FbmFibGVkIHRvb2xiYXIgaWNvbnMuLy8kTk9OLU5MUy0xJAotICAgICAgICBmaW5hbCBTdHJpbmcgUEFUSF9FVE9PTCA9IElDT05TX1BBVEggKyAiZXRvb2wxNi8iOyAvL0VuYWJsZWQgdG9vbGJhciBpY29ucy4vLyROT04tTkxTLTEkCi0gICAgICAgIGZpbmFsIFN0cmluZyBQQVRIX0RUT09MID0gSUNPTlNfUEFUSCArICJkdG9vbDE2LyI7IC8vRGlzYWJsZWQgdG9vbGJhciBpY29ucy4vLyROT04tTkxTLTEkCi0gICAgICAgIGZpbmFsIFN0cmluZyBQQVRIX09CSkVDVCA9IElDT05TX1BBVEggKyAib2JqMTYvIjsgLy9Nb2RlbCBvYmplY3QgaWNvbnMvLyROT04tTkxTLTEkCi0gICAgICAgIGZpbmFsIFN0cmluZyBQQVRIX1dJWkJBTiA9IElDT05TX1BBVEggKyAid2l6YmFuLyI7IC8vV2l6YXJkIGljb25zLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEJ1bmRsZSBpZGVCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gpOwotCi0gICAgICAgIGRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0gICAgICAgICAgICAgICAgSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0VUT09MX0JVSUxEX0VYRUMsIFBBVEhfRVRPT0wKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImJ1aWxkX2V4ZWMuZ2lmIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0gICAgICAgICAgICAgICAgSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0VUT09MX0JVSUxEX0VYRUNfSE9WRVIsCi0gICAgICAgICAgICAgICAgUEFUSF9FVE9PTCArICJidWlsZF9leGVjLmdpZiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19FVE9PTF9CVUlMRF9FWEVDX0RJU0FCTEVELAotICAgICAgICAgICAgICAgIFBBVEhfRFRPT0wgKyAiYnVpbGRfZXhlYy5naWYiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19FVE9PTF9TRUFSQ0hfU1JDLCBQQVRIX0VUT09MCi0gICAgICAgICAgICAgICAgICAgICAgICArICJzZWFyY2hfc3JjLmdpZiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19FVE9PTF9TRUFSQ0hfU1JDX0hPVkVSLAotICAgICAgICAgICAgICAgIFBBVEhfRVRPT0wgKyAic2VhcmNoX3NyYy5naWYiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKLSAgICAgICAgICAgICAgICBJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfRVRPT0xfU0VBUkNIX1NSQ19ESVNBQkxFRCwKLSAgICAgICAgICAgICAgICBQQVRIX0RUT09MICsgInNlYXJjaF9zcmMuZ2lmIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKLSAgICAgICAgICAgICAgICBJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfRVRPT0xfTkVYVF9OQVYsIFBBVEhfRVRPT0wKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIm5leHRfbmF2LmdpZiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0gICAgICAgICAgICAgICAgSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0VUT09MX1BSRVZJT1VTX05BViwgUEFUSF9FVE9PTAotICAgICAgICAgICAgICAgICAgICAgICAgKyAicHJldl9uYXYuZ2lmIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKLSAgICAgICAgICAgICAgICBJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfV0laQkFOX05FV1BSSl9XSVosIFBBVEhfV0laQkFOCi0gICAgICAgICAgICAgICAgICAgICAgICArICJuZXdwcmpfd2l6LmdpZiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19XSVpCQU5fTkVXRk9MREVSX1dJWiwKLSAgICAgICAgICAgICAgICBQQVRIX1dJWkJBTiArICJuZXdmb2xkZXJfd2l6LmdpZiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19XSVpCQU5fTkVXRklMRV9XSVosIFBBVEhfV0laQkFOCi0gICAgICAgICAgICAgICAgICAgICAgICArICJuZXdmaWxlX3dpei5naWYiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19XSVpCQU5fSU1QT1JURElSX1dJWiwKLSAgICAgICAgICAgICAgICBQQVRIX1dJWkJBTiArICJpbXBvcnRkaXJfd2l6LmdpZiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19XSVpCQU5fSU1QT1JUWklQX1dJWiwKLSAgICAgICAgICAgICAgICBQQVRIX1dJWkJBTiArICJpbXBvcnR6aXBfd2l6LmdpZiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0gICAgICAgICAgICAgICAgSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX1dJWkJBTl9FWFBPUlRESVJfV0laLAotICAgICAgICAgICAgICAgIFBBVEhfV0laQkFOICsgImV4cG9ydGRpcl93aXouZ2lmIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0gICAgICAgICAgICAgICAgSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX1dJWkJBTl9FWFBPUlRaSVBfV0laLAotICAgICAgICAgICAgICAgIFBBVEhfV0laQkFOICsgImV4cG9ydHppcF93aXouZ2lmIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKLSAgICAgICAgICAgICAgICBJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfV0laQkFOX1JFU09VUkNFV09SS0lOR1NFVF9XSVosCi0gICAgICAgICAgICAgICAgUEFUSF9XSVpCQU4gKyAid29ya3NldF93aXouZ2lmIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19ETEdCQU5fU0FWRUFTX0RMRywKLSAgICAgICAgICAgICAgICBQQVRIX1dJWkJBTiArICJzYXZlYXNfd2l6LmdpZiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsIElERS5TaGFyZWRJbWFnZXMuSU1HX09CSl9QUk9KRUNULAotICAgICAgICAgICAgICAgIFBBVEhfT0JKRUNUICsgInByal9vYmouZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKLSAgICAgICAgICAgICAgICBJREUuU2hhcmVkSW1hZ2VzLklNR19PQkpfUFJPSkVDVF9DTE9TRUQsIFBBVEhfT0JKRUNUCi0gICAgICAgICAgICAgICAgICAgICAgICArICJjcHJqX29iai5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLCBJREUuU2hhcmVkSW1hZ2VzLklNR19PUEVOX01BUktFUiwKLSAgICAgICAgICAgICAgICBQQVRIX0VMT0NBTFRPT0wgKyAiZ290b29ial90c2suZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyB0YXNrIG9iamVjdHMKLSAgICAgICAgLy9kZWNsYXJlUmVnaXN0cnlJbWFnZShJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19IUFJJT19UU0ssIFBBVEhfT0JKRUNUKyJocHJpb190c2suZ2lmIik7Ci0gICAgICAgIC8vZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX09CSlNfTVBSSU9fVFNLLCBQQVRIX09CSkVDVCsibXByaW9fdHNrLmdpZiIpOwotICAgICAgICAvL2RlY2xhcmVSZWdpc3RyeUltYWdlKElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX0xQUklPX1RTSywgUEFUSF9PQkpFQ1QrImxwcmlvX3Rzay5naWYiKTsKLQotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLCBJREUuU2hhcmVkSW1hZ2VzLklNR19PQkpTX1RBU0tfVFNLLAotICAgICAgICAgICAgICAgIFBBVEhfT0JKRUNUICsgInRhc2ttcmtfdHNrLmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsIElERS5TaGFyZWRJbWFnZXMuSU1HX09CSlNfQktNUktfVFNLLAotICAgICAgICAgICAgICAgIFBBVEhfT0JKRUNUICsgImJrbXJrX3Rzay5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0gICAgICAgICAgICAgICAgSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX09CSlNfQ09NUExFVEVfVFNLLCBQQVRIX09CSkVDVAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29tcGxldGVfdHNrLmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0gICAgICAgICAgICAgICAgSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX09CSlNfSU5DT01QTEVURV9UU0ssIFBBVEhfT0JKRUNUCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpbmNvbXBsZXRlX3Rzay5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX1dFTENPTUVfSVRFTSwgUEFUSF9PQkpFQ1QKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIndlbGNvbWVfaXRlbS5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX1dFTENPTUVfQkFOTkVSLCBQQVRIX09CSkVDVAotICAgICAgICAgICAgICAgICAgICAgICAgKyAid2VsY29tZV9iYW5uZXIuZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIGRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0gICAgICAgICAgICAgICAgSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0xDTF9GTEFUX0xBWU9VVCwgUEFUSF9FTE9DQUxUT09MCi0gICAgICAgICAgICAgICAgICAgICAgICArICJmbGF0TGF5b3V0LmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0gICAgICAgICAgICAgICAgSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0xDTF9ISUVSQVJDSElDQUxfTEFZT1VULCBQQVRIX0VMT0NBTFRPT0wKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImhpZXJhcmNoaWNhbExheW91dC5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19FVE9PTF9QUk9CTEVNX0NBVEVHT1JZLCBQQVRIX0VUT09MCi0gICAgICAgICAgICAgICAgICAgICAgICArICJwcm9ibGVtX2NhdGVnb3J5LmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy8gc3luY2hyb25pemF0aW9uIGluZGljYXRvciBvYmplY3RzCi0gICAgICAgIC8vZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX09CSlNfV0JFVF9TVEFULCBQQVRIX09WRVJMQVkrIndiZXRfc3RhdC5naWYiKTsKLSAgICAgICAgLy9kZWNsYXJlUmVnaXN0cnlJbWFnZShJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19TQkVUX1NUQVQsIFBBVEhfT1ZFUkxBWSsic2JldF9zdGF0LmdpZiIpOwotICAgICAgICAvL2RlY2xhcmVSZWdpc3RyeUltYWdlKElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX0NPTkZMSUNUX1NUQVQsIFBBVEhfT1ZFUkxBWSsiY29uZmxpY3Rfc3RhdC5naWYiKTsKLQotICAgICAgICAvLyBjb250ZW50IGxvY2FsaXR5IGluZGljYXRvciBvYmplY3RzCi0gICAgICAgIC8vZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX09CSlNfTk9UTE9DQUxfU1RBVCwgUEFUSF9TVEFUKyJub3Rsb2NhbF9zdGF0LmdpZiIpOwotICAgICAgICAvL2RlY2xhcmVSZWdpc3RyeUltYWdlKElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX0xPQ0FMX1NUQVQsIFBBVEhfU1RBVCsibG9jYWxfc3RhdC5naWYiKTsKLSAgICAgICAgLy9kZWNsYXJlUmVnaXN0cnlJbWFnZShJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19GSUxMTE9DQUxfU1RBVCwgUEFUSF9TVEFUKyJmaWxsbG9jYWxfc3RhdC5naWYiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWNsYXJlcyBhbiBJREUtc3BlY2lmaWMgd29ya2JlbmNoIGltYWdlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzeW1ib2xpY05hbWUgdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhlIGltYWdlCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggb2YgdGhlIGltYWdlIGZpbGU7IHRoaXMgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgYmFzZQotICAgICAqIG9mIHRoZSBJREUgcGx1Zy1pbgotICAgICAqIEBwYXJhbSBzaGFyZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHNoYXJlZCBpbWFnZSwgYW5kCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgaXMgbm90IGEgc2hhcmVkIGltYWdlCi0gICAgICogQHNlZSBJV29ya2JlbmNoQ29uZmlndXJlciNkZWNsYXJlSW1hZ2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGVjbGFyZVdvcmtiZW5jaEltYWdlKEJ1bmRsZSBpZGVCdW5kbGUsIFN0cmluZyBzeW1ib2xpY05hbWUsCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCwgYm9vbGVhbiBzaGFyZWQpIHsKLQkJVVJMIHVybCA9IFBsYXRmb3JtLmZpbmQoaWRlQnVuZGxlLCBuZXcgUGF0aChwYXRoKSk7Ci0gICAgICAgIEltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLSAgICAgICAgZ2V0V29ya2JlbmNoQ29uZmlndXJlcigpLmRlY2xhcmVJbWFnZShzeW1ib2xpY05hbWUsIGRlc2MsIHNoYXJlZCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNnZXRNYWluUHJlZmVyZW5jZVBhZ2VJZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblByZWZlcmVuY2VQYWdlSWQoKSB7Ci0gICAgICAgIC8vIGluZGljYXRlIHRoYXQgd2Ugd2FudCB0aGUgV29ya2VuY2ggcHJlZmVyZW5jZSBwYWdlIHRvIGJlIHByb21pbmVudAotICAgICAgICByZXR1cm4gV09SS0JFTkNIX1BSRUZFUkVOQ0VfQ0FURUdPUllfSUQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHdvcmtzcGFjZSBsb2NhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0gICAgICogdGhlIGxvY2F0aW9uIGlzIG5vdCBiZWluZyBzaG93bgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V29ya3NwYWNlTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB3b3Jrc3BhY2VMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB3ZWxjb21lIHBlcnNwZWN0aXZlIGluZm9zLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogb3IgaWYgdGhleSBzaG91bGQgYmUgaWdub3JlZCBkdWUgdG8gdGhlIG5ldyBpbnRybyBiZWluZyBwcmVzZW50Ci0gICAgICovCi0gICAgcHVibGljIEFib3V0SW5mb1tdIGdldFdlbGNvbWVQZXJzcGVjdGl2ZUluZm9zKCkgewotICAgICAgICBpZiAod2VsY29tZVBlcnNwZWN0aXZlSW5mb3MgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gc3VwcG9ydCBvbGQgd2VsY29tZSBwZXJzcGVjdGl2ZXMgaWYgaW50cm8gcGx1Z2luIGlzIG5vdCBwcmVzZW50Ci0gICAgICAgICAgICBpZiAoIWhhc0ludHJvKCkpIHsKLSAgICAgICAgICAgICAgICBNYXAgbSA9IGdldE5ld2x5QWRkZWRCdW5kbGVHcm91cHMoKTsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QobS5zaXplKCkpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG0udmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFib3V0SW5mbyBpbmZvID0gKEFib3V0SW5mbykgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwgJiYgaW5mby5nZXRXZWxjb21lUGVyc3BlY3RpdmVJZCgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmZvLmdldFdlbGNvbWVQYWdlVVJMKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3ZWxjb21lUGVyc3BlY3RpdmVJbmZvcyA9IG5ldyBBYm91dEluZm9bbGlzdC5zaXplKCldOwotICAgICAgICAgICAgICAgIGxpc3QudG9BcnJheSh3ZWxjb21lUGVyc3BlY3RpdmVJbmZvcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlbGNvbWVQZXJzcGVjdGl2ZUluZm9zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvSURFV29ya2JlbmNoTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvSURFV29ya2JlbmNoTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJlOGVjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERVdvcmtiZW5jaE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIElERVdvcmtiZW5jaE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0JLy8gcGFja2FnZTogb3JnLmVjbGlwc2UudWkuaWRlCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVXb3JrYmVuY2hBZHZpc29yX25vUGVyc3BlY3RpdmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVfbm9GaWxlRWRpdG9yRm91bmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja1N0YXJ0QWN0aW9uX2Vycm9yRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tTdGFydEFjdGlvbl9pbmZvUmVhZEVycm9yOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25Mb2dVcGRhdGVTZWN0aW9uX2luc3RhbGxDb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25Mb2dVcGRhdGVTZWN0aW9uX2xhc3RDaGFuZ2VkT247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkxvZ1VwZGF0ZVNlY3Rpb25fbG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkxvZ1VwZGF0ZVNlY3Rpb25fY29uZmlndXJhdGlvblNpdGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25Mb2dVcGRhdGVTZWN0aW9uX2NvbmZpZ3VyYXRpb25GZWF0dXJlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uTG9nVXBkYXRlU2VjdGlvbl9mZWF0dXJlSWRBbmRWZXJzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25Mb2dVcGRhdGVTZWN0aW9uX3BsdWdpbnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvckNsb3Npbmc7Ci0KLQotCS8vCi0JLy8KLQkvLyBDb3BpZXMgZnJvbSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gKLQkvLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3dBZHZhbmNlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBoaWRlQWR2YW5jZWQ7Ci0KLQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBXb3JrYmVuY2ggQWN0aW9ucwotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JLy8gLS0tIEZpbGUgTWVudSAtLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfbmV3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5Xb3Jrc3BhY2VBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuV29ya3NwYWNlQWN0aW9uX3Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbldvcmtzcGFjZUFjdGlvbl9lcnJvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5Xb3Jrc3BhY2VBY3Rpb25fZXJyb3JNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZVByb2plY3RBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVQcm9qZWN0QWN0aW9uX3Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UHJvamVjdEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1Byb2plY3RBY3Rpb25fdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdFeGFtcGxlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RXhhbXBsZUFjdGlvbl90b29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVBc0RpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlQXNEaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlQXNEaWFsb2dfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlQXNEaWFsb2dfZmlsZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVBc0RpYWxvZ19maWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVBc0RpYWxvZ19vdmVyd3JpdGVRdWVzdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfcHJvamVjdFByb3BlcnRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoX3Byb2plY3RQcm9wZXJ0aWVzVG9vbFRpcDsKLQotCi0JLy8gLS0tIEVkaXQgTWVudSAtLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfZWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfYWRkQm9va21hcms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoX2FkZEJvb2ttYXJrVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfYWRkVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfYWRkVGFza1Rvb2xUaXA7Ci0KLQotCS8vIC0tLSBOYXZpZ2F0ZSBNZW51IC0tLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtiZW5jaF9uYXZpZ2F0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfZ29UbzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5Xb3Jrc3BhY2VGaWxlQWN0aW9uX2Vycm9yVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbldvcmtzcGFjZUZpbGVBY3Rpb25fZXJyb3JNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoX3Nob3dJbjsKLQotCS8vIC0tLSBQcm9qZWN0IE1lbnUgLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoX3Byb2plY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfb3BlblByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoX29wZW5Qcm9qZWN0VG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfY2xvc2VQcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtiZW5jaF9jbG9zZVByb2plY3RUb29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoX2J1aWxkUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfYnVpbGRQcm9qZWN0VG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfcmVidWlsZFByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoX3JlYnVpbGRQcm9qZWN0VG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfYnVpbGRDbGVhbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfYnVpbGRTZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoX2J1aWxkQXV0b21hdGljYWxseTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdsb2JhbEJ1aWxkQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2xvYmFsQnVpbGRBY3Rpb25fdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHbG9iYWxCdWlsZEFjdGlvbl9yZWJ1aWxkVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHbG9iYWxCdWlsZEFjdGlvbl9yZWJ1aWxkVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHbG9iYWxCdWlsZEFjdGlvbl9idWlsZFByb2JsZW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdsb2JhbEJ1aWxkQWN0aW9uX2ludGVybmFsRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2xvYmFsQnVpbGRBY3Rpb25fYnVpbGRPcGVyYXRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHbG9iYWxCdWlsZEFjdGlvbl9yZWJ1aWxkQWxsT3BlcmF0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2xvYmFsQnVpbGRBY3Rpb25fam9iVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZFNldEFjdGlvbl9ub0J1aWxkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRTZXRBY3Rpb25fbm9Qcm9qZWN0czsKLQotCQotCS8vIC0tLSBXaW5kb3cgTWVudSAtLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfd2luZG93OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtiZW5jaF9vcGVuUGVyc3BlY3RpdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoX3Nob3dWaWV3OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvbXB0T25FeGl0RGlhbG9nX3NoZWxsVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvbXB0T25FeGl0RGlhbG9nX21lc3NhZ2UwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb21wdE9uRXhpdERpYWxvZ19tZXNzYWdlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9tcHRPbkV4aXREaWFsb2dfY2hvaWNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoX3Nob3J0Y3V0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfb3Blbk5ld1dpbmRvdzsKLQotCi0JLy8gLS0tIEhlbHAgTWVudSAtLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfaGVscDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja1N0YXJ0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tTdGFydF90b29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrU3RhcnRNZXNzYWdlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrU3RhcnRNZXNzYWdlRGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2VsY29tZVBhZ2VTZWxlY3Rpb25EaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2VsY29tZVBhZ2VTZWxlY3Rpb25EaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaXBzQW5kVHJpY2tzX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGlwc0FuZFRyaWNrc190b29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpcHNBbmRUcmlja3NNZXNzYWdlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpcHNBbmRUcmlja3NNZXNzYWdlRGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGlwc0FuZFRyaWNrc1BhZ2VTZWxlY3Rpb25EaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGlwc0FuZFRyaWNrc1BhZ2VTZWxlY3Rpb25EaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaXBzQW5kVHJpY2tzRXJyb3JEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGlwc0FuZFRyaWNrc0Vycm9yRGlhbG9nX25vSHJlZjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaXBzQW5kVHJpY2tzRXJyb3JEaWFsb2dfbm9GZWF0dXJlczsKLQotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIE5hdmlnYXRvciBBY3Rpb25zCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbldpdGhNZW51X2RpYWxvZ1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weVByb2plY3RBY3Rpb25fdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weVByb2plY3RBY3Rpb25fdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5UHJvamVjdEFjdGlvbl9wcm9ncmVzc1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlQcm9qZWN0QWN0aW9uX2NvcHlUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5UHJvamVjdEFjdGlvbl9jb3B5TmFtZU9uZUFyZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5UHJvamVjdEFjdGlvbl9jb3B5TmFtZVR3b0FyZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weVByb2plY3RBY3Rpb25fYWxyZWFkeUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5UHJvamVjdEFjdGlvbl9jb3B5RmFpbGVkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weVByb2plY3RBY3Rpb25faW50ZXJuYWxFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlSZXNvdXJjZUFjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5UmVzb3VyY2VBY3Rpb25fdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5UmVzb3VyY2VBY3Rpb25fc2VsZWN0RGVzdGluYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlUHJvamVjdEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVQcm9qZWN0QWN0aW9uX3Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZVByb2plY3RBY3Rpb25fbW92ZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVQcm9qZWN0QWN0aW9uX3Byb2dyZXNzTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlUHJvamVjdEFjdGlvbl9kaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlUHJvamVjdEFjdGlvbl9pbnRlcm5hbEVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZVJlc291cmNlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZVJlc291cmNlQWN0aW9uX3Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZVJlc291cmNlQWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVSZXNvdXJjZUFjdGlvbl9jaGVja01vdmVNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVhZE9ubHlDaGVja19wcm9ibGVtczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlc291cmNlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVzb3VyY2VBY3Rpb25fdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVSZXNvdXJjZUFjdGlvbl9pbnB1dERpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlc291cmNlQWN0aW9uX2lucHV0RGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVSZXNvdXJjZUFjdGlvbl9jaGVja1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlc291cmNlQWN0aW9uX3JlYWRPbmx5Q2hlY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVzb3VyY2VBY3Rpb25fcmVzb3VyY2VFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVzb3VyY2VBY3Rpb25fbmFtZUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVSZXNvdXJjZUFjdGlvbl9vdmVyd3JpdGVRdWVzdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVSZXNvdXJjZUFjdGlvbl9wcm9ncmVzc01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVzb3VyY2VBY3Rpb25fcHJvYmxlbVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlc291cmNlQWN0aW9uX3Byb2dyZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlc291cmNlQWN0aW9uX25hbWVNdXN0QmVEaWZmZXJlbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVzb3VyY2VBY3Rpb25fcHJvYmxlbU1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVSZXNvdXJjZUFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZVJlc291cmNlQWN0aW9uX3Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlUmVzb3VyY2VBY3Rpb25fdGl0bGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZVJlc291cmNlQWN0aW9uX3RpdGxlTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVSZXNvdXJjZUFjdGlvbl9jb25maXJtMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVSZXNvdXJjZUFjdGlvbl9jb25maXJtTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVSZXNvdXJjZUFjdGlvbl90aXRsZVByb2plY3QxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZVJlc291cmNlQWN0aW9uX3RpdGxlUHJvamVjdE47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlUmVzb3VyY2VBY3Rpb25fY29uZmlybVByb2plY3QxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZVJlc291cmNlQWN0aW9uX2NvbmZpcm1Qcm9qZWN0TjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVSZXNvdXJjZUFjdGlvbl9kZWxldGVDb250ZW50czE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlUmVzb3VyY2VBY3Rpb25fZGVsZXRlQ29udGVudHNOOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZVJlc291cmNlQWN0aW9uX2RvTm90RGVsZXRlQ29udGVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlUmVzb3VyY2VBY3Rpb25fY29uZmlybUxpbmtlZFJlc291cmNlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVSZXNvdXJjZUFjdGlvbl9jb25maXJtTGlua2VkUmVzb3VyY2VOOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZVJlc291cmNlQWN0aW9uX3JlYWRPbmx5UXVlc3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlUmVzb3VyY2VBY3Rpb25fbWVzc2FnZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZVJlc291cmNlQWN0aW9uX291dE9mU3luY0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZVJlc291cmNlQWN0aW9uX291dE9mU3luY1F1ZXN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZVJlc291cmNlQWN0aW9uX2RlbGV0aW9uRXhjZXB0aW9uTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVSZXNvdXJjZUFjdGlvbl9qb2JOYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQm9va21hcmtMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCb29rbWFya1Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQm9va21hcmtEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQm9va21hcmtEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFRhc2tMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRUYXNrVG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5GaWxlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVBY3Rpb25fdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuRmlsZUFjdGlvbl9vcGVuRmlsZVNoZWxsVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuUmVzb3VyY2VBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuUmVzb3VyY2VBY3Rpb25fdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuUmVzb3VyY2VBY3Rpb25fZGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlblJlc291cmNlQWN0aW9uX3Byb2JsZW1NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5SZXNvdXJjZUFjdGlvbl9vcGVyYXRpb25NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xvc2VSZXNvdXJjZUFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsb3NlUmVzb3VyY2VBY3Rpb25fdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbG9zZVJlc291cmNlQWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsb3NlUmVzb3VyY2VBY3Rpb25fcHJvYmxlbU1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xvc2VSZXNvdXJjZUFjdGlvbl9vcGVyYXRpb25NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZEFjdGlvbl90b29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkQWN0aW9uX3Byb2JsZW1NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkQWN0aW9uX3Byb2JsZW1UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZEFjdGlvbl9vcGVyYXRpb25NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVidWlsZEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlYnVpbGRBY3Rpb25fdG9vbHRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZnJlc2hBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWZyZXNoQWN0aW9uX3Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmcmVzaEFjdGlvbl9wcm9ncmVzc01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmcmVzaEFjdGlvbl9wcm9ibGVtVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmcmVzaEFjdGlvbl9wcm9ibGVtTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWZyZXNoQWN0aW9uX2xvY2F0aW9uRGVsZXRlZE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmcmVzaEFjdGlvbl9kaWFsb2dUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFdvcmtpbmdTZXRBY3Rpb25fdGV4dDsKLQotCS8vIC0tLSBPcGVyYXRpb25zIC0tLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlQcm9qZWN0T3BlcmF0aW9uX3Byb2dyZXNzVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weVByb2plY3RPcGVyYXRpb25fY29weUZhaWxlZE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weVByb2plY3RPcGVyYXRpb25fY29weUZhaWxlZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlQcm9qZWN0T3BlcmF0aW9uX2ludGVybmFsRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weVByb2plY3RPcGVyYXRpb25fY29weVByb2plY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2NvcHlGYWlsZWRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3Byb2JsZW1NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fb3BlcmF0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9uYW1lQ29sbGlzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25faW50ZXJuYWxFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3Jlc291cmNlRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fb3ZlcndyaXRlUXVlc3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9vdmVyd3JpdGVXaXRoRGV0YWlsc1F1ZXN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fb3ZlcndyaXRlTWVyZ2VRdWVzdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX292ZXJ3cml0ZU5vTWVyZ2VMaW5rUXVlc3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9vdmVyd3JpdGVOb01lcmdlTm9MaW5rUXVlc3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9kZWVwQ29weVF1ZXN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fZGVlcE1vdmVRdWVzdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2NvcHlOYW1lVHdvQXJnczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2NvcHlOYW1lT25lQXJnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fZGVzdGluYXRpb25BY2Nlc3NFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2Rlc3RpbmF0aW9uRGVzY2VuZGVudEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fb3ZlcndyaXRlUHJvYmxlbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX292ZXJ3cml0ZVByb2JsZW1UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3F1ZXN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25faW1wb3J0RXJyb3JEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2lucHV0RGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9pbnB1dERpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9uYW1lRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fbmFtZU11c3RCZURpZmZlcmVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3NhbWVTb3VyY2VBbmREZXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25faW1wb3J0U2FtZVNvdXJjZUFuZERlc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9yZXNvdXJjZURlbGV0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9taXNzaW5nUGF0aFZhcmlhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fbWlzc2luZ0xpbmtUYXJnZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9Db3B5UmVzb3VyY2VzVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3BhcmVudE5vdEVxdWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25faW5mb05vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fY29weV9leGNlcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3NhbWVTb3VyY2VBbmREZXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fbW92ZUZhaWxlZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fcHJvYmxlbU1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9vcGVyYXRpb25UaXRsZTsKLQotCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gQ2FwYWJpbGl0eSBzZWxlY3Rpb24gZ3JvdXAKLQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwX2NhdGVnb3JpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9jYXBhYmlsaXRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwX2dyYXlJdGVtczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwX2Rpc2FibGVkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9lcnJvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfZGlzYWJsZWRDYXBhYmlsaXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfaW52YWxpZENhcGFiaWxpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9taXNzaW5nUHJlcmVxczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwX3JlcXVpcmVkUHJlcmVxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfcmVxdWlyZWRQcmVyZXFzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfbWVtYmVyc2hpcENvbmZsaWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfbWVtYmVyc2hpcFByZXJlcUNvbmZsaWN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FwYWJpbGl0eV9uYW1lTWlzc2luZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElDYXRlZ29yeV9vdGhlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZERhdGFUcmFuc2Zlcl9leGlzdHNRdWVzdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmREYXRhVHJhbnNmZXJfb3ZlcndyaXRlTmFtZUFuZFBhdGhRdWVzdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmREYXRhVHJhbnNmZXJfZXhjZXB0aW9uTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRUcmFuc2ZlclBhZ2Vfc2VsZWN0VHlwZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkVHJhbnNmZXJQYWdlX3NlbGVjdEFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRUcmFuc2ZlclBhZ2VfZGVzZWxlY3RBbGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQcm9qZWN0V2l6YXJkX3dpbmRvd1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1Byb2plY3RXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UHJvamVjdFdpemFyZF9lcnJvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1Byb2plY3RXaXphcmRfaW52YWxpZENhcGFiaWxpdGllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQcm9qZWN0V2l6YXJkX25vV2l6YXJkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlUHJvamVjdFdpemFyZF9lcnJvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZVByb2plY3RXaXphcmRfaW50ZXJuYWxFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVQcm9qZWN0V2l6YXJkX2Nhc2VWYXJpYW50RXhpc3RzRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVDYXBhYmlsaXR5V2l6YXJkX2Vycm9yTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVDYXBhYmlsaXR5V2l6YXJkX2ludGVybmFsRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdQcm9qZWN0Q2FwYWJpbGl0eVBhZ2VfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3UHJvamVjdENhcGFiaWxpdHlQYWdlX25vQ2FwYWJpbGl0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFByb2plY3RSZXZpZXdQYWdlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFByb2plY3RDb25maWd1cmVQYWdlX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlUHJvamVjdENhcGFiaWxpdHlXaXphcmRfd2luZG93VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlUHJvamVjdENhcGFiaWxpdHlXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlUHJvamVjdENhcGFiaWxpdHlXaXphcmRfZXJyb3JUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVQcm9qZWN0Q2FwYWJpbGl0eVdpemFyZF9ub1dpemFyZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFN0ZXBHcm91cF9zdGVwc0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpU3RlcFJldmlld1dpemFyZFBhZ2VfZGV0YWlsc0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpU3RlcFJldmlld1dpemFyZFBhZ2VfaW5zdHJ1Y3Rpb25OZXh0TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlTdGVwUmV2aWV3V2l6YXJkUGFnZV9pbnN0cnVjdGlvbkZpbmlzaExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlTdGVwV2l6YXJkX2ZpbmlzaExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlUHJvamVjdFN0ZXBfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlUHJvamVjdFN0ZXBfZGV0YWlsczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxDYXBhYmlsaXR5U3RlcF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUNhcGFiaWxpdHlTdGVwX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUNhcGFiaWxpdHlTdGVwX2RlZmF1bHREZXNjcmlwdGlvbjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQ2FwYWJpbGl0eVN0ZXBfZGVmYXVsdERlc2NyaXB0aW9uMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVDYXBhYmlsaXR5U3RlcF9kZWZhdWx0RGVzY3JpcHRpb24yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdENhcGFiaWxpdHlTaW1wbGVTZWxlY3Rpb25QYWdlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RDYXBhYmlsaXR5U2ltcGxlU2VsZWN0aW9uUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2Vfd2luZG93VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdENhcGFiaWxpdHlTaW1wbGVTZWxlY3Rpb25QYWdlX2NhcGFiaWxpdHlFeGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2VfY2FwYWJpbGl0eVJlcXVpcmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RDYXBhYmlsaXR5U2ltcGxlU2VsZWN0aW9uUGFnZV9jYXBhYmlsaXR5TWlzc2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2VfY2FwYWJpbGl0eVNldDsKLQotCS8vIC0tLSBJbXBvcnQgLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkSW1wb3J0UGFnZV9zcGVjaWZ5Rm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEltcG9ydFBhZ2Vfc3BlY2lmeVByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkSW1wb3J0UGFnZV9mb2xkZXJNdXN0RXhpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkSW1wb3J0UGFnZV9lcnJvckRpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEltcG9ydFBhZ2VfZm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEltcG9ydFBhZ2VfYnJvd3NlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkSW1wb3J0UGFnZV9icm93c2UyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEltcG9ydFBhZ2Vfc2VsZWN0Rm9sZGVyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkSW1wb3J0UGFnZV9zZWxlY3RGb2xkZXJUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRJbXBvcnRQYWdlX2Rlc3RpbmF0aW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkSW1wb3J0UGFnZV9vcHRpb25zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEltcG9ydFBhZ2VfcHJvamVjdE5vdEV4aXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEltcG9ydFBhZ2VfaW1wb3J0T25SZWNlaXZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRJbXBvcnRQYWdlX25vT3BlblByb2plY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEltcG9ydFBhZ2VfdW5kZWZpbmVkUGF0aFZhcmlhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEltcG9ydFBhZ2VfY29udGFpbmVyTm90RXhpc3Q7Ci0KLQkvLyAtLS0gRXhwb3J0IC0tLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEV4cG9ydFBhZ2VfZXJyb3JEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRFeHBvcnRQYWdlX211c3RFeGlzdE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkRXhwb3J0UGFnZV9tdXN0QmVBY2Nlc3NpYmxlTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRFeHBvcnRQYWdlX2RldGFpbHNNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEV4cG9ydFBhZ2Vfd2hhdExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEV4cG9ydFBhZ2Vfd2hlcmVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRFeHBvcnRQYWdlX29wdGlvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkRXhwb3J0UGFnZV9zZWxlY3Rpb25EaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEV4cG9ydFBhZ2VfcmVzb3VyY2VUeXBlRGlhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEV4cG9ydFBhZ2VfZm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEV4cG9ydFBhZ2VfYnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEV4cG9ydFBhZ2VfYWxsVHlwZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkRXhwb3J0UGFnZV9zcGVjaWZpY1R5cGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEV4cG9ydFBhZ2VfZWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRFeHBvcnRQYWdlX2RldGFpbHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkRXhwb3J0UGFnZV9zZWxlY3RSZXNvdXJjZXNUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRFeHBvcnRQYWdlX29uZVJlc291cmNlU2VsZWN0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkRXhwb3J0UGFnZV9zZWxlY3RSZXNvdXJjZXNUb0V4cG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRFeHBvcnRQYWdlX2ludGVybmFsRXJyb3JUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRFeHBvcnRQYWdlX3Jlc291cmNlQ291bnRNZXNzYWdlOwotCi0JLy8gLS0tIE5ldyBFeGFtcGxlIC0tLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0V4YW1wbGVfdGl0bGU7Ci0KLQkvLyAtLS0gTmV3IFByb2plY3QgLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2xvY2F0aW9uRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9kZWZhdWx0TG9jYXRpb25FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3ROYW1lRW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9wcm9qZWN0TG9jYXRpb25FbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3RFeGlzdHNNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfcHJvamVjdExvY2F0aW9uRXhpc3RzTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3RDb250ZW50c0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfcHJvamVjdENvbnRlbnRzR3JvdXBMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3VzZURlZmF1bHRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX25hbWVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2RpcmVjdG9yeUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfbG9jYXRpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2Jyb3dzZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld1Byb2plY3RSZWZlcmVuY2VzX3RpdGxlOwotCi0JLy8gLS0tIE5ldyBGb2xkZXIgLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3Rm9sZGVyTWFpblBhZ2VfZm9sZGVyTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdGb2xkZXJNYWluUGFnZV9mb2xkZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdGb2xkZXJNYWluUGFnZV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdGb2xkZXJDcmVhdGlvblBhZ2VfcHJvZ3Jlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3Rm9sZGVyQ3JlYXRpb25QYWdlX2Vycm9yVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3Rm9sZGVyQ3JlYXRpb25QYWdlX2ludGVybmFsRXJyb3JUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdGb2xkZXJfaW50ZXJuYWxFcnJvcjsKLQotCS8vIC0tLSBOZXcgRmlsZSAtLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlX3Byb2dyZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2VfZXJyb3JUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlX2ZpbGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlX2ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZV9pbnRlcm5hbEVycm9yVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZV9pbnRlcm5hbEVycm9yTWVzc2FnZTsKLQotCS8vIC0tLSBMaW5rZWQgUmVzb3VyY2UgLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3TGlua1BhZ2VfbGlua0ZpbGVCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3TGlua1BhZ2VfbGlua0ZvbGRlckJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdMaW5rUGFnZV9icm93c2VCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3TGlua1BhZ2VfdmFyaWFibGVzQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld0xpbmtQYWdlX3RhcmdldFNlbGVjdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld0xpbmtQYWdlX2xpbmtUYXJnZXRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdMaW5rUGFnZV9saW5rVGFyZ2V0SW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdMaW5rUGFnZV9saW5rVGFyZ2V0TG9jYXRpb25JbnZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld0xpbmtQYWdlX2xpbmtUYXJnZXROb25FeGlzdGVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdMaW5rUGFnZV9saW5rVGFyZ2V0Tm90RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdMaW5rUGFnZV9saW5rVGFyZ2V0Tm90Rm9sZGVyOwotCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gUHJlZmVyZW5jZSBQYWdlcwotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZlcmVuY2Vfbm90ZTsKLQotCS8vIC0tLSBXb3JrYmVuY2ggLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoUHJlZmVyZW5jZV9lbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hQcmVmZXJlbmNlX2RlZmF1bHRFbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hQcmVmZXJlbmNlX290aGVyRW5jb2Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoUHJlZmVyZW5jZV91bnN1cHBvcnRlZEVuY29kaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtiZW5jaFByZWZlcmVuY2VfZW5jb2RpbmdfZW5jb2RpbmdNZXNzYWdlOwotCQotCS8vIC0tLXdvcmtzcGFjZSAtLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVXb3Jrc3BhY2VQcmVmZXJlbmNlX2F1dG9idWlsZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVXb3Jrc3BhY2VQcmVmZXJlbmNlX2F1dG9idWlsZFRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURFV29ya3NwYWNlUHJlZmVyZW5jZV9zYXZlUHJpb3JUb0J1aWxkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERVdvcmtzcGFjZVByZWZlcmVuY2Vfc2F2ZVByaW9yVG9CdWlsZGluZ1Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURFV29ya3NwYWNlUHJlZmVyZW5jZV9SZWZyZXNoQnV0dG9uVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVXb3Jrc3BhY2VQcmVmZXJlbmNlX1JlZnJlc2hCdXR0b25Ub29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERVdvcmtzcGFjZVByZWZlcmVuY2VfZmlsZUxpbmVEZWxpbWl0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURFV29ya3NwYWNlUHJlZmVyZW5jZV9kZWZhdWx0TGluZURlbGltOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERVdvcmtzcGFjZVByZWZlcmVuY2VfZGVmYXVsdExpbmVEZWxpbVByb2o7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURFV29ya3NwYWNlUHJlZmVyZW5jZV9vdGhlckxpbmVEZWxpbTsKLQotCS8vIC0tLSBMaW5rZWQgUmVzb3VyY2VzIC0tLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpbmtlZFJlc291cmNlc1ByZWZlcmVuY2VfZXhwbGFuYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGlua2VkUmVzb3VyY2VzUHJlZmVyZW5jZV9lbmFibGVMaW5rZWRSZXNvdXJjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGlua2VkUmVzb3VyY2VzUHJlZmVyZW5jZV9saW5rZWRSZXNvdXJjZXNXYXJuaW5nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGlua2VkUmVzb3VyY2VzUHJlZmVyZW5jZV9saW5rZWRSZXNvdXJjZXNXYXJuaW5nTWVzc2FnZTsKLQotCS8vIFRoZSBmb2xsb3dpbmcgc2l4IGtleXMgYXJlIG1hcmtlZCBhcyB1bnVzZWQgYnkgdGhlIE5MUyBzZWFyY2gsIGJ1dCB0aGV5IGFyZSBpbmRpcmVjdGx5IHVzZWQKLQkvLyBhbmQgc2hvdWxkIGJlIHJlbW92ZWQuCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlRGlhbG9nX3NoZWxsVGl0bGVfbmV3VmFyaWFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlRGlhbG9nX3NoZWxsVGl0bGVfZXhpc3RpbmdWYXJpYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXRoVmFyaWFibGVEaWFsb2dfZGlhbG9nVGl0bGVfbmV3VmFyaWFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlRGlhbG9nX2RpYWxvZ1RpdGxlX2V4aXN0aW5nVmFyaWFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlRGlhbG9nX21lc3NhZ2VfbmV3VmFyaWFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlRGlhbG9nX21lc3NhZ2VfZXhpc3RpbmdWYXJpYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhdGhWYXJpYWJsZURpYWxvZ192YXJpYWJsZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlRGlhbG9nX3ZhcmlhYmxlVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlRGlhbG9nX3ZhcmlhYmxlTmFtZUVtcHR5TWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXRoVmFyaWFibGVEaWFsb2dfdmFyaWFibGVWYWx1ZUVtcHR5TWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXRoVmFyaWFibGVEaWFsb2dfdmFyaWFibGVWYWx1ZUludmFsaWRNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhdGhWYXJpYWJsZURpYWxvZ19maWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhdGhWYXJpYWJsZURpYWxvZ19mb2xkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlRGlhbG9nX3NlbGVjdEZpbGVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXRoVmFyaWFibGVEaWFsb2dfc2VsZWN0Rm9sZGVyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlRGlhbG9nX3NlbGVjdEZvbGRlck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlRGlhbG9nX3ZhcmlhYmxlQWxyZWFkeUV4aXN0c01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlRGlhbG9nX3BhdGhJc1JlbGF0aXZlTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXRoVmFyaWFibGVEaWFsb2dfcGF0aERvZXNOb3RFeGlzdE1lc3NhZ2U7Ci0KLQkvLyAtLS0gTG9jYWwgSGlzdG9yeSAtLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlSGlzdG9yeV9sb25nZXZpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUhpc3RvcnlfZW50cmllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlSGlzdG9yeV9kaXNrU3BhY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUhpc3RvcnlfbXVzdEJlUG9zaXRpdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUhpc3RvcnlfaW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlSGlzdG9yeV9leGNlcHRpb25TYXZpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUhpc3RvcnlfYWJvdmVNYXhFbnRyaWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVIaXN0b3J5X2Fib3ZlTWF4RmlsZVNpemU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUhpc3RvcnlfcmVzdGFydE5vdGU7Ci0KLQkvLyAtLS0gUGVyc3BlY3RpdmVzIC0tLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RTd2l0Y2hQZXJzcGVjdGl2ZU1vZGVfb3B0aW9uc1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RTd2l0Y2hQZXJzcGVjdGl2ZU1vZGVfYWx3YXlzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RTd2l0Y2hQZXJzcGVjdGl2ZU1vZGVfbmV2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdFN3aXRjaFBlcnNwZWN0aXZlTW9kZV9wcm9tcHQ7Ci0KLQkvLyAtLS0gQnVpbGQgT3JkZXIgLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRPcmRlclByZWZlcmVuY2VfdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRPcmRlclByZWZlcmVuY2VfZG93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZE9yZGVyUHJlZmVyZW5jZV9hZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRPcmRlclByZWZlcmVuY2VfcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkT3JkZXJQcmVmZXJlbmNlX3NlbGVjdE90aGVyUHJvamVjdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRPcmRlclByZWZlcmVuY2VfdXNlRGVmYXVsdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRPcmRlclByZWZlcmVuY2VfcHJvamVjdEJ1aWxkT3JkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRPcmRlclByZWZlcmVuY2VfcmVtb3ZlTm90ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZE9yZGVyUHJlZmVyZW5jZV9tYXhJdGVyYXRpb25zTGFiZWw7Ci0KLQkvLyAtLS0gU3RhcnR1cCBwcmVmZXJlbmNlcyAtLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFydHVwUHJlZmVyZW5jZVBhZ2VfcmVmcmVzaEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFydHVwUHJlZmVyZW5jZVBhZ2VfbGF1bmNoUHJvbXB0QnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YXJ0dXBQcmVmZXJlbmNlUGFnZV9leGl0UHJvbXB0QnV0dG9uOwotCi0JLy8gLS0tIEluZm8gLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VJbmZvX3JlYWRPbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlSW5mb19leGVjdXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlSW5mb19hcmNoaXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlSW5mb19kZXJpdmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlSW5mb190eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlSW5mb19sb2NhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUluZm9fcmVzb2x2ZWRMb2NhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUluZm9fc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUluZm9fYnl0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VJbmZvX2ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VJbmZvX2ZpbGVUeXBlRm9ybWF0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlSW5mb19mb2xkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VJbmZvX3Byb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VJbmZvX2xpbmtlZEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VJbmZvX2xpbmtlZEZvbGRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUluZm9fdW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUluZm9fbm90TG9jYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VJbmZvX3VuZGVmaW5lZFBhdGhWYXJpYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUluZm9fbm90RXhpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VJbmZvX2ZpbGVOb3RFeGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUluZm9fcGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUluZm9fbGFzdE1vZGlmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlSW5mb19maWxlRW5jb2RpbmdUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUluZm9fZmlsZUNvbnRlbnRFbmNvZGluZ0Zvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUluZm9fZmlsZUNvbnRhaW5lckVuY29kaW5nRm9ybWF0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlSW5mb19jb250YWluZXJFbmNvZGluZ0Zvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUluZm9fZXhXYXJuaW5nOwotCi0JLy8gLS0tIFByb2plY3QgUmVmZXJlbmNlcyAtLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0UmVmZXJlbmNlc1BhZ2VfbGFiZWw7Ci0KLQkvLyAtLS0gUHJvamVjdCBDYXBhYmlsaXRpZXMgLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdENhcGFiaWxpdHlQcm9wZXJ0eVBhZ2VfY2hvb3NlQ2FwYWJpbGl0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RDYXBhYmlsaXR5UHJvcGVydHlQYWdlX25vQ2FwYWJpbGl0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RDYXBhYmlsaXR5UHJvcGVydHlQYWdlX2Vycm9yVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdENhcGFiaWxpdHlQcm9wZXJ0eVBhZ2VfaW50ZXJuYWxFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0Q2FwYWJpbGl0eVByb3BlcnR5UGFnZV9pbnZhbGlkU2VsZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdENhcGFiaWxpdHlFZGl0aW5nUHJvcGVydHlQYWdlX2FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0Q2FwYWJpbGl0eUVkaXRpbmdQcm9wZXJ0eVBhZ2VfcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RDYXBhYmlsaXR5UHJvcGVydHlQYWdlX2NhcGFiaWxpdHlSZXF1aXJlZDsKLQotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIEVkaXRvcnMKLQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RWRpdG9yRGVzY3JpcHRpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlbGNvbWVFZGl0b3JfYWNjZXNzRXhjZXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlbGNvbWVFZGl0b3JfcmVhZEZpbGVFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWxjb21lRWRpdG9yX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlbGNvbWVFZGl0b3JfdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWxjb21lRWRpdG9yX2NvcHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlbGNvbWVJdGVtX3VuYWJsZVRvTG9hZENsYXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlbGNvbWVQYXJzZXJfcGFyc2VFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWxjb21lUGFyc2VyX3BhcnNlRXhjZXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtiZW5jaF9vcGVuRWRpdG9yRXJyb3JEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hfb3BlbkVkaXRvckVycm9yRGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja1N0YXJ0QWN0aW9uX29wZW5FZGl0b3JFeGNlcHRpb247Ci0KLQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBEaWFsb2dzCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlc3Rpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250YWluZXJTZWxlY3Rpb25EaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250YWluZXJHcm91cF9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRhaW5lckdyb3VwX3NlbGVjdEZvbGRlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRhaW5lckdlbmVyYXRvcl9wcm9ncmVzc01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGFpbmVyR2VuZXJhdG9yX3BhdGhPY2N1cGllZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlR3JvdXBfcmVzb3VyY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlR3JvdXBfZm9sZGVyRW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9ub1Byb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9lbXB0eU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9pbnZhbGlkRmlsZW5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9wYXRoT2NjdXBpZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2VsZWN0aW9uRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVTZWxlY3Rpb25EaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZ19uYW1lTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nX2xvY2F0aW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nX2Jyb3dzZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZ19kaXJlY3RvcnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0TG9jYXRpb25TZWxlY3Rpb25EaWFsb2dfbG9jYXRpb25FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0TG9jYXRpb25TZWxlY3Rpb25EaWFsb2dfc2VsZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nX3VzZURlZmF1bHRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RQZXJzcGVjdGl2ZUNob2ljZURpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2dfY2hvb3NlUGVyc3BlY3RpdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdFBlcnNwZWN0aXZlQ2hvaWNlRGlhbG9nX29wdGlvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdFBlcnNwZWN0aXZlQ2hvaWNlRGlhbG9nX25ld1dpbmRvdzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2dfc2FtZVdpbmRvdzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2dfZXJyb3JUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2dfZXJyb3JNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclJlc29sdXRpb25TZWxlY3Rpb25EaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyUmVzb2x1dGlvblNlbGVjdGlvbkRpYWxvZ19tZXNzYWdlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZ19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZ19tYXRjaGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZ19mb2xkZXJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nX3Nob3dEZXJpdmVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlblJlc291cmNlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Rm9sZGVyRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0ZvbGRlckRpYWxvZ19uYW1lTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Rm9sZGVyRGlhbG9nX2FscmVhZHlFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Rm9sZGVyRGlhbG9nX2ZvbGRlck5hbWVFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdGb2xkZXJEaWFsb2dfcHJvZ3Jlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Rm9sZGVyRGlhbG9nX2Vycm9yVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Rm9sZGVyRGlhbG9nX2ludGVybmFsRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwX2xpbmtGaWxlQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXBfbGlua0ZvbGRlckJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwX2Jyb3dzZUJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwX3ZhcmlhYmxlc0J1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwX3Jlc29sdmVkUGF0aExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXBfdGFyZ2V0U2VsZWN0aW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlTGlua2VkUmVzb3VyY2VHcm91cF9saW5rVGFyZ2V0Tm90RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwX2xpbmtUYXJnZXROb3RGb2xkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlTGlua2VkUmVzb3VyY2VHcm91cF9saW5rVGFyZ2V0Tm9uRXhpc3RlbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlTGlua2VkUmVzb3VyY2VHcm91cF91bmFibGVUb1ZhbGlkYXRlTGlua1RhcmdldDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhdGhWYXJpYWJsZXNCbG9ja192YXJpYWJsZXNMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXRoVmFyaWFibGVzQmxvY2tfYWRkVmFyaWFibGVCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlc0Jsb2NrX2VkaXRWYXJpYWJsZUJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXRoVmFyaWFibGVzQmxvY2tfcmVtb3ZlVmFyaWFibGVCdXR0b247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXRoVmFyaWFibGVTZWxlY3Rpb25EaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nX2V4dGVuZEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXRoVmFyaWFibGVTZWxlY3Rpb25EaWFsb2dfRXh0ZW5zaW9uRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhdGhWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZ19FeHRlbnNpb25EaWFsb2dfZGVzY3JpcHRpb247Ci0KLQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBFZGl0b3IgRnJhbWV3b3JrCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yTWFuYWdlcl9zYXZlUmVzb3VyY2VzTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JNYW5hZ2VyX3NhdmVSZXNvdXJjZXNUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5TeXN0ZW1FZGl0b3JBY3Rpb25fZGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlblN5c3RlbUVkaXRvckFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5TeXN0ZW1FZGl0b3JBY3Rpb25fdG9vbFRpcDsKLQotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIFdvcmtzcGFjZQotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtzcGFjZUFjdGlvbl9wcm9ibGVtc1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtzcGFjZUFjdGlvbl9sb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hBY3Rpb25fcHJvYmxlbXNNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtiZW5jaEFjdGlvbl9pbnRlcm5hbEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtzcGFjZTsKLQotCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gV29ya2JlbmNoCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoV2luZG93X3NoZWxsVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlcm5hbF9lcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlcm5hbEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludGVybmFsRXJyb3JOb0FyZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlcm5hbEVycm9yT25lQXJnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmF0YWxFcnJvcl9SZWN1cnNpdmVFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGYXRhbEVycm9yX091dE9mTWVtb3J5RXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmF0YWxFcnJvcl9TdGFja092ZXJmbG93RXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmF0YWxFcnJvcl9WaXJ0dWFsTWFjaGluZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZhdGFsRXJyb3JfU1dURXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmF0YWxFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2JsZW1TYXZpbmdXb3JrYmVuY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvYmxlbXNTYXZpbmdXb3Jrc3BhY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ibGVtc19PcGVuaW5nX1BhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3Jrc3BhY2VfcmVmcmVzaGluZzsKLQotCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gS2V5cyB3aXRoIHJlZmVyZW5jZXMgYnV0IGRvbid0IHNob3cgaW4gdGhlIFVJCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlRmlsZUFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZUZpbGVBY3Rpb25fdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVGaWxlQWN0aW9uX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlRm9sZGVyQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlRm9sZGVyQWN0aW9uX3Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlRm9sZGVyQWN0aW9uX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NydWJMb2NhbEFjdGlvbl9wcm9ibGVtc01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NydWJMb2NhbEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjcnViTG9jYWxBY3Rpb25fdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY3J1YkxvY2FsQWN0aW9uX3Byb2JsZW1zVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NydWJMb2NhbEFjdGlvbl9wcm9ncmVzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRBY3Rpb25fc2VsZWN0QWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEN1dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhc3RlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZTsKLQotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIEtleXMgdXNlZCBpbiB0aGUgcmV1c2UgZWRpdG9yIHdoaWNoIGlzIHJlbGVhc2VkIGFzIGV4cGVyaW1lbnRhbC4KLQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hQcmVmZXJlbmNlX3NhdmVJbnRlcnZhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hQcmVmZXJlbmNlX3NhdmVJbnRlcnZhbEVycm9yOwotCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gV29ya2luZyBTZXQgRnJhbWV3b3JrLgotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlV29ya2luZ1NldFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VXb3JraW5nU2V0UGFnZV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZVdvcmtpbmdTZXRQYWdlX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VXb3JraW5nU2V0UGFnZV9sYWJlbF90cmVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlV29ya2luZ1NldFBhZ2Vfd2FybmluZ19uYW1lTXVzdE5vdEJlRW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VXb3JraW5nU2V0UGFnZV93YXJuaW5nX25hbWVXaGl0ZXNwYWNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlV29ya2luZ1NldFBhZ2Vfd2FybmluZ193b3JraW5nU2V0RXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlV29ya2luZ1NldFBhZ2Vfd2FybmluZ19yZXNvdXJjZU11c3RCZUNoZWNrZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VXb3JraW5nU2V0UGFnZV9lcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZVdvcmtpbmdTZXRQYWdlX2Vycm9yX3VwZGF0ZUNoZWNrZWRTdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZVdvcmtpbmdTZXRQYWdlX3NlbGVjdEFsbF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZVdvcmtpbmdTZXRQYWdlX3NlbGVjdEFsbF90b29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlV29ya2luZ1NldFBhZ2VfZGVzZWxlY3RBbGxfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VXb3JraW5nU2V0UGFnZV9kZXNlbGVjdEFsbF90b29sVGlwOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlRW5jb2RpbmdGaWVsZEVkaXRvcl9FcnJvckxvYWRpbmdNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlRW5jb2RpbmdGaWVsZEVkaXRvcl9FcnJvclN0b3JpbmdNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlRW5jb2RpbmdGaWVsZEVkaXRvcl9FbmNvZGluZ0NvbmZsaWN0VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VFbmNvZGluZ0ZpZWxkRWRpdG9yX0VuY29kaW5nQ29uZmxpY3RNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hvb3NlV29ya3NwYWNlRGlhbG9nX2RpYWxvZ05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hvb3NlV29ya3NwYWNlRGlhbG9nX2RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENob29zZVdvcmtzcGFjZURpYWxvZ19kaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENob29zZVdvcmtzcGFjZURpYWxvZ19kZWZhdWx0UHJvZHVjdE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hvb3NlV29ya3NwYWNlRGlhbG9nX3dvcmtzcGFjZUVudHJ5TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hvb3NlV29ya3NwYWNlRGlhbG9nX2Jyb3dzZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENob29zZVdvcmtzcGFjZURpYWxvZ19kaXJlY3RvcnlCcm93c2VyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hvb3NlV29ya3NwYWNlRGlhbG9nX2RpcmVjdG9yeUJyb3dzZXJNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENob29zZVdvcmtzcGFjZURpYWxvZ191c2VEZWZhdWx0TWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VNYW5kYXRvcnlUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VNYW5kYXRvcnlNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUluVXNlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURFQXBwbGljYXRpb25fd29ya3NwYWNlSW5Vc2VNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUVtcHR5VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURFQXBwbGljYXRpb25fd29ya3NwYWNlRW1wdHlNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUludmFsaWRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VJbnZhbGlkTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VDYW5ub3RCZVNldFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUNhbm5vdEJlU2V0TWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VDYW5ub3RMb2NrVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURFQXBwbGljYXRpb25fd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURFQXBwbGljYXRpb25fdmVyc2lvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERUFwcGxpY2F0aW9uX3ZlcnNpb25NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERUFwcGxpY2F0aW9uX2luY29tcGF0aWJsZUpWTVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERUFwcGxpY2F0aW9uX2luY29tcGF0aWJsZUpWTU1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2xvYmFsQnVpbGRBY3Rpb25fQnVpbGRSdW5uaW5nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2xvYmFsQnVpbGRBY3Rpb25fQnVpbGRSdW5uaW5nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbkRpYWxvZ19idWlsZENsZWFuQXV0bzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbkRpYWxvZ19idWlsZENsZWFuTWFudWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFuRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFuRGlhbG9nX2NsZWFuQWxsQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFuRGlhbG9nX2NsZWFuU2VsZWN0ZWRCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW5EaWFsb2dfYnVpbGROb3dCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW5EaWFsb2dfdGFza05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURFRW5jb2RpbmdfRW5jb2RpbmdKb2I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURFRWRpdG9yc1ByZWZlcmVuY2VQYWdlX1dvcmtiZW5jaFByZWZlcmVuY2Vfdmlld3NSZWxhdGVkTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVFZGl0b3JzUHJlZmVyZW5jZVBhZ2VfV29ya2JlbmNoUHJlZmVyZW5jZV9GaWxlRWRpdG9yc1JlbGF0ZWRMaW5rOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElERUVkaXRvcnNQcmVmZXJlbmNlUGFnZV9Xb3JrYmVuY2hQcmVmZXJlbmNlX2NvbnRlbnRUeXBlc1JlbGF0ZWRMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERVdvcmtzcGFjZVByZWZlcmVuY2VQYWdlX1dvcmtiZW5jaFByZWZlcmVuY2VfcmVsYXRlZExpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoRW5jb2RpbmdfaW52YWxpZENoYXJzZXQ7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSURFV29ya2JlbmNoTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERVdvcmtiZW5jaFBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JREVXb3JrYmVuY2hQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4MDJiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERVdvcmtiZW5jaFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUJ1bmRsZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQnVuZGxlR3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnkuQ2FwYWJpbGl0eVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeS5NYXJrZXJJbWFnZVByb3ZpZGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLnJlZ2lzdHJ5LlByb2plY3RJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcm5hbCBjbGFzcyByZXByZXNlbnRzIHRoZSB0b3Agb2YgdGhlIElERSB3b3JrYmVuY2guCi0gKgotICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgdHJhY2tpbmcgdmFyaW91cyByZWdpc3RyaWVzCi0gKiBmb250LCBwcmVmZXJlbmNlLCBncmFwaGljcywgZGlhbG9nIHN0b3JlLgotICoKLSAqIFRoaXMgY2xhc3MgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkIGJ5IHRoZSAKLSAqIElERSB3b3JrYmVuY2ggcGx1Zy1pbidzICAicGx1Z2luLnhtbCIKLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgSURFV29ya2JlbmNoUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0gICAgLy8gRGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIKLSAgICBwcml2YXRlIHN0YXRpYyBJREVXb3JrYmVuY2hQbHVnaW4gaW5zdDsKLQotICAgIC8vIEdsb2JhbCB3b3JrYmVuY2ggdWkgcGx1Z2luIGZsYWcuIE9ubHkgd29ya2JlbmNoIGltcGxlbWVudGF0aW9uIGlzIGFsbG93ZWQgdG8gdXNlIHRoaXMgZmxhZwotICAgIC8vIEFsbCBvdGhlciBwbHVnaW5zLCBleGFtcGxlcywgb3IgdGVzdCBjYXNlcyBtdXN0ICpub3QqIHVzZSB0aGlzIGZsYWcuCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSURFIHdvcmtiZW5jaCBwbHVnaW4gSUQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFX1dPUktCRU5DSCA9ICJvcmcuZWNsaXBzZS51aS5pZGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgSUQgb2YgdGhlIGRlZmF1bHQgdGV4dCBlZGl0b3IuCi0gICAgICogVGhpcyBtdXN0IGNvcnJlc3BvbmQgdG8gRWRpdG9yc1VJLkRFRkFVTFRfVEVYVF9FRElUT1JfSUQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9URVhUX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS51aS5EZWZhdWx0VGV4dEVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIElERSB3b3JrYmVuY2ggZXh0ZW5zaW9uIHBvaW50IG5hbWVzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfTUFSS0VSX0lNQUdFX1BST1ZJREVSID0gIm1hcmtlckltYWdlUHJvdmlkZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfTUFSS0VSX0hFTFAgPSAibWFya2VySGVscCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMX01BUktFUl9SRVNPTFVUSU9OID0gIm1hcmtlclJlc29sdXRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTF9DQVBBQklMSVRJRVMgPSAiY2FwYWJpbGl0aWVzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfUFJPSkVDVF9OQVRVUkVfSU1BR0VTID0gInByb2plY3ROYXR1cmVJbWFnZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElDT05TX1BBVEggPSAiJG5sJC9pY29ucy9mdWxsLyI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogUHJvamVjdCBpbWFnZSByZWdpc3RyeTsgbGF6aWx5IGluaXRpYWxpemVkLgotICAgICAqLwotICAgIHByaXZhdGUgUHJvamVjdEltYWdlUmVnaXN0cnkgcHJvamVjdEltYWdlUmVnaXN0cnkgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogTWFya2VyIGltYWdlIHJlZ2lzdHJ5OyBsYXppbHkgaW5pdGlhbGl6ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXJrZXJJbWFnZVByb3ZpZGVyUmVnaXN0cnkgbWFya2VySW1hZ2VQcm92aWRlclJlZ2lzdHJ5ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENhcGFiaWxpdHkgcmVnaXN0cnk7IGxhemlseSBpbml0aWFsaXplZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIENhcGFiaWxpdHlSZWdpc3RyeSBjYXBhYmlsaXR5UmVnaXN0cnk7Ci0KLSAgIAotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICovCi0JcHVibGljIElERVdvcmtiZW5jaFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdCA9IHRoaXM7Ci0JfQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZXh0ZW5zaW9uLiAgSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdAotICAgICAqIGJlZW4gbG9hZGVkIGEgYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZgotICAgICAqIHRoZSBsb2FkLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGNvbmZpZyBlbGVtZW50IGRlZmluaW5nIHRoZSBleHRlbnNpb24KLSAgICAgKiBAcGFyYW0gY2xhc3NBdHRyaWJ1dGUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBjYXJyeWluZyB0aGUgY2xhc3MKLSAgICAgKiBAcmV0dXJuIE9iamVjdCB0aGUgZXh0ZW5zaW9uIG9iamVjdAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwKLQkJCWZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBJZiBwbHVnaW4gaGFzIGJlZW4gbG9hZGVkIGNyZWF0ZSBleHRlbnNpb24uCi0JCS8vIE90aGVyd2lzZSwgc2hvdyBidXN5IGN1cnNvciB0aGVuIGNyZWF0ZSBleHRlbnNpb24uCi0JCUJ1bmRsZSBwbHVnaW4gPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXROYW1lc3BhY2UoKSk7Ci0JCWlmIChwbHVnaW4uZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIHJldCA9IG5ldyBPYmplY3RbMV07Ci0gICAgICAgICAgICBmaW5hbCBDb3JlRXhjZXB0aW9uW10gZXhjID0gbmV3IENvcmVFeGNlcHRpb25bMV07Ci0gICAgICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShudWxsLCBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0WzBdID0gZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihjbGFzc0F0dHJpYnV0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhjWzBdID0gZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaWYgKGV4Y1swXSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IGV4Y1swXTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0WzBdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogUmV0dXJuIHRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4gVGhpcyByZXByZXNlbnRzIHRoZSBydW50aW1lIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEBzZWUgQWJzdHJhY3RQbHVnaW4gZm9yIHRoZSB0eXBpY2FsIGltcGxlbWVudGF0aW9uIHBhdHRlcm4gZm9yIHBsdWdpbiBjbGFzc2VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSURFV29ya2JlbmNoUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBpbnN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgd29ya3NwYWNlIHVzZWQgYnkgdGhlIHdvcmtiZW5jaAotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW50ZXJuYWwgdG8gdGhlIHdvcmtiZW5jaCBhbmQgbXVzdCBub3QgYmUgY2FsbGVkCi0gICAgICogYnkgYW55IHBsdWdpbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFBsdWdpbldvcmtzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2dzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIHRoZSBwbGF0Zm9ybSBsb2cuCi0gICAgICogCi0gICAgICogSWYgeW91IGhhdmUgYW4gZXhjZXB0aW9uIGluIGhhbmQsIGNhbGwgbG9nKFN0cmluZywgVGhyb3dhYmxlKSBpbnN0ZWFkLgotICAgICAqIAotICAgICAqIElmIHlvdSBoYXZlIGEgc3RhdHVzIG9iamVjdCBpbiBoYW5kIGNhbGwgbG9nKFN0cmluZywgSVN0YXR1cykgaW5zdGVhZC4KLSAgICAgKiAKLSAgICAgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBJREUgV29ya2JlbmNoIG9ubHkgYW5kCi0gICAgICogbXVzdCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhlIElERSBXb3JrYmVuY2guCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIEEgaGlnaCBsZXZlbCBVSSBtZXNzYWdlIGRlc2NyaWJpbmcgd2hlbiB0aGUgcHJvYmxlbSBoYXBwZW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coCi0gICAgICAgICAgICAgICAgU3RhdHVzVXRpbC5uZXdTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgbnVsbCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvZ3MgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIHRocm93YWJsZSB0byB0aGUgcGxhdGZvcm0gbG9nLgotICAgICAqIAotICAgICAqIElmIHlvdSBoYXZlIGEgc3RhdHVzIG9iamVjdCBpbiBoYW5kIGNhbGwgbG9nKFN0cmluZywgSVN0YXR1cykgaW5zdGVhZC4KLSAgICAgKiAKLSAgICAgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBJREUgV29ya2JlbmNoIG9ubHkgYW5kCi0gICAgICogbXVzdCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhlIElERSBXb3JrYmVuY2guCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIEEgaGlnaCBsZXZlbCBVSSBtZXNzYWdlIGRlc2NyaWJpbmcgd2hlbiB0aGUgcHJvYmxlbSBoYXBwZW5lZC4KLSAgICAgKiBAcGFyYW0gdAotICAgICAqICAgICAgICAgICAgVGhlIHRocm93YWJsZSBmcm9tIHdoZXJlIHRoZSBwcm9ibGVtIGFjdHVhbGx5IG9jY3VycmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzVXRpbC5uZXdTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgdCk7Ci0gICAgICAgIGxvZyhtZXNzYWdlLCBzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBMb2dzIHRoZSBnaXZlbiB0aHJvd2FibGUgdG8gdGhlIHBsYXRmb3JtIGxvZywgaW5kaWNhdGluZyB0aGUgY2xhc3MgYW5kCi0gICAgICogbWV0aG9kIGZyb20gd2hlcmUgaXQgaXMgYmVpbmcgbG9nZ2VkICh0aGlzIGlzIG5vdCBuZWNlc3NhcmlseSB3aGVyZSBpdAotICAgICAqIG9jY3VycmVkKS4KLSAgICAgKiAKLSAgICAgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBJREUgV29ya2JlbmNoIG9ubHkgYW5kCi0gICAgICogbXVzdCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhlIElERSBXb3JrYmVuY2guCi0gICAgICogCi0gICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogICAgICAgICAgICBUaGUgY2FsbGluZyBjbGFzcy4KLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZQotICAgICAqICAgICAgICAgICAgVGhlIGNhbGxpbmcgbWV0aG9kIG5hbWUuCi0gICAgICogQHBhcmFtIHQKLSAgICAgKiAgICAgICAgICAgIFRoZSB0aHJvd2FibGUgZnJvbSB3aGVyZSB0aGUgcHJvYmxlbSBhY3R1YWxseSBvY2N1cnJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKENsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJFeGNlcHRpb24gaW4gezB9LnsxfTogezJ9IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGNsYXp6LmdldE5hbWUoKSwgbWV0aG9kTmFtZSwgdCB9KTsKLSAgICAgICAgbG9nKG1zZywgdCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIExvZ3MgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIHN0YXR1cyB0byB0aGUgcGxhdGZvcm0gbG9nLgotICAgICAqIAotICAgICAqIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIElERSBXb3JrYmVuY2ggb25seSBhbmQKLSAgICAgKiBtdXN0IG5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgSURFIFdvcmtiZW5jaC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgQSBoaWdoIGxldmVsIFVJIG1lc3NhZ2UgZGVzY3JpYmluZyB3aGVuIHRoZSBwcm9ibGVtIGhhcHBlbmVkLgotICAgICAqICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBzdGF0dXMKLSAgICAgKiAgICAgICAgICAgIFRoZSBzdGF0dXMgZGVzY3JpYmluZyB0aGUgcHJvYmxlbS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBJU3RhdHVzIHN0YXR1cykgewotCi0gICAgICAgIC8vMUZUVUhFMDogSVRQQ09SRTpBTEwgLSBBUEkgLSBTdGF0dXMgJiBsb2dnaW5nIC0gbG9zcyBvZiBzZW1hbnRpYyBpbmZvCi0KLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZygKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzVXRpbC5uZXdTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgbnVsbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotICAgIC8qIChub24tamF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQWJzdHJhY3RVSVBsdWdpbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hQbHVnaW5BY3Rpb25zKCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG1hbmFnZXIgdGhhdCBtYXBzIHByb2plY3QgbmF0dXJlIGlkcyB0byBpbWFnZXMuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3RJbWFnZVJlZ2lzdHJ5IGdldFByb2plY3RJbWFnZVJlZ2lzdHJ5KCkgewotICAgICAgICBpZiAocHJvamVjdEltYWdlUmVnaXN0cnkgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvamVjdEltYWdlUmVnaXN0cnkgPSBuZXcgUHJvamVjdEltYWdlUmVnaXN0cnkoKTsKLSAgICAgICAgICAgIHByb2plY3RJbWFnZVJlZ2lzdHJ5LmxvYWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvamVjdEltYWdlUmVnaXN0cnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFya2VyIGltYWdlIHByb3ZpZGVyIHJlZ2lzdHJ5IGZvciB0aGUgd29ya2JlbmNoLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWFya2VyIGltYWdlIHByb3ZpZGVyIHJlZ2lzdHJ5Ci0gICAgICovCi0gICAgcHVibGljIE1hcmtlckltYWdlUHJvdmlkZXJSZWdpc3RyeSBnZXRNYXJrZXJJbWFnZVByb3ZpZGVyUmVnaXN0cnkoKSB7Ci0gICAgICAgIGlmIChtYXJrZXJJbWFnZVByb3ZpZGVyUmVnaXN0cnkgPT0gbnVsbCkgewotICAgICAgICAgICAgbWFya2VySW1hZ2VQcm92aWRlclJlZ2lzdHJ5ID0gbmV3IE1hcmtlckltYWdlUHJvdmlkZXJSZWdpc3RyeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXJrZXJJbWFnZVByb3ZpZGVyUmVnaXN0cnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2FwYWJpbGl0eSByZWdpc3RyeSBmb3IgdGhlIHdvcmtiZW5jaC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjYXBhYmlsaXR5IHJlZ2lzdHJ5Ci0gICAgICovCi0gICAgcHVibGljIENhcGFiaWxpdHlSZWdpc3RyeSBnZXRDYXBhYmlsaXR5UmVnaXN0cnkoKSB7Ci0gICAgICAgIGlmIChjYXBhYmlsaXR5UmVnaXN0cnkgPT0gbnVsbCkgewotICAgICAgICAgICAgY2FwYWJpbGl0eVJlZ2lzdHJ5ID0gbmV3IENhcGFiaWxpdHlSZWdpc3RyeSgpOwotICAgICAgICAgICAgY2FwYWJpbGl0eVJlZ2lzdHJ5LmxvYWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FwYWJpbGl0eVJlZ2lzdHJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFib3V0IGluZm9ybWF0aW9uIG9mIGFsbCBrbm93biBmZWF0dXJlcywKLSAgICAgKiBvbWl0dGluZyBhbnkgZmVhdHVyZXMgd2hpY2ggYXJlIG1pc3NpbmcgdGhpcyBpbmZvcm1hdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgbGlzdCBvZiBhYm91dCBpbmZvcwotICAgICAqLwotICAgIHB1YmxpYyBBYm91dEluZm9bXSBnZXRGZWF0dXJlSW5mb3MoKSB7Ci0gICAgICAgIC8vIGNhbm5vdCBiZSBjYWNoZWQgc2luY2UgYnVuZGxlIGdyb3VwcyBjb21lIGFuZCBnbwotICAgICAgICBMaXN0IGluZm9zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIC8vIGFkZCBhbiBlbnRyeSBmb3IgZWFjaCBidW5kbGUgZ3JvdXAKLSAgICAgICAgSUJ1bmRsZUdyb3VwUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBQbGF0Zm9ybS5nZXRCdW5kbGVHcm91cFByb3ZpZGVycygpOwotICAgICAgICBpZiAocHJvdmlkZXJzICE9IG51bGwpCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3ZpZGVycy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIElCdW5kbGVHcm91cFtdIGJ1bmRsZUdyb3VwcyA9IHByb3ZpZGVyc1tpXS5nZXRCdW5kbGVHcm91cHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJ1bmRsZUdyb3Vwcy5sZW5ndGg7ICsraikKLSAgICAgICAgICAgICAgICAgICAgaW5mb3MuYWRkKG5ldyBBYm91dEluZm8oYnVuZGxlR3JvdXBzW2pdKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChBYm91dEluZm9bXSkgaW5mb3MudG9BcnJheShuZXcgQWJvdXRJbmZvW2luZm9zLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFib3V0IGluZm9ybWF0aW9uIG9mIHRoZSBwcmltYXJ5IGZlYXR1cmUuCi0gICAgICogCi0gICAgICogQHJldHVybiBpbmZvIGFib3V0IHRoZSBwcmltYXJ5IGZlYXR1cmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIAotICAgICAqIGlzIG5vIHByaW1hcnkgZmVhdHVyZSBvciBpZiB0aGlzIGluZm9ybWF0aW9uIGlzIHVuYXZhaWxhYmxlCi0gICAgICovCi0gICAgcHVibGljIEFib3V0SW5mbyBnZXRQcmltYXJ5SW5mbygpIHsKLSAgICAgICAgSVByb2R1Y3QgcHJvZHVjdCA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKTsKLSAgICAgICAgcmV0dXJuIHByb2R1Y3QgPT0gbnVsbCA/IG51bGwgOiBuZXcgQWJvdXRJbmZvKHByb2R1Y3QpOwotICAgIH0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHdvcmtiZW5jaCBpbWFnZSB3aXRoIHRoZSBnaXZlbiBwYXRoIHJlbGF0aXZlIHRvCi0JICogSUNPTl9QQVRILgotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldElERUltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVsYXRpdmVQYXRoKXsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oSURFX1dPUktCRU5DSCwgSUNPTlNfUEFUSCArIHJlbGF0aXZlUGF0aCk7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JREVXb3JrYmVuY2hXaW5kb3dBZHZpc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERVdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxMjcwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lERVdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBlcnNwZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLkFjdGlvbkJhckFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSUFjdGlvbkJhckNvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5XZWxjb21lRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JJbnB1dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTWFya2VyVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBXaW5kb3ctbGV2ZWwgYWR2aXNvciBmb3IgdGhlIElERS4KLSAqLwotcHVibGljIGNsYXNzIElERVdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IgZXh0ZW5kcyBXb3JrYmVuY2hXaW5kb3dBZHZpc29yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUxDT01FX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5XZWxjb21lRWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBJREVXb3JrYmVuY2hBZHZpc29yIHdiQWR2aXNvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gZWRpdG9yc0FuZEludHJvc09wZW5lZCA9IGZhbHNlOwotICAgIHByaXZhdGUgSUVkaXRvclBhcnQgbGFzdEFjdGl2ZUVkaXRvciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGxhc3RQZXJzcGVjdGl2ZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYWdlIGxhc3RBY3RpdmVQYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIGxhc3RFZGl0b3JUaXRsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBJUHJvcGVydHlMaXN0ZW5lciBlZGl0b3JQcm9wZXJ0eUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUxpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkgewotICAgICAgICAgICAgaWYgKHByb3BJZCA9PSBJV29ya2JlbmNoUGFydENvbnN0YW50cy5QUk9QX1RJVExFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RBY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3VGl0bGUgPSBsYXN0QWN0aXZlRWRpdG9yLmdldFRpdGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbGFzdEVkaXRvclRpdGxlLmVxdWFscyhuZXdUaXRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY29tcHV0ZVRpdGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBJQWRhcHRhYmxlIGxhc3RJbnB1dDsKLQotICAgIC8qKgotICAgICAqIENyYXRlcyBhIG5ldyBJREUgd29ya2JlbmNoIHdpbmRvdyBhZHZpc29yLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gd2JBZHZpc29yIHRoZSB3b3JrYmVuY2ggYWR2aXNvcgotICAgICAqIEBwYXJhbSBjb25maWd1cmVyIHRoZSB3aW5kb3cgY29uZmlndXJlcgotICAgICAqLwotICAgIHB1YmxpYyBJREVXb3JrYmVuY2hXaW5kb3dBZHZpc29yKElERVdvcmtiZW5jaEFkdmlzb3Igd2JBZHZpc29yLCBJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0gICAgICAgIHN1cGVyKGNvbmZpZ3VyZXIpOwotICAgICAgICB0aGlzLndiQWR2aXNvciA9IHdiQWR2aXNvcjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yI2NyZWF0ZUFjdGlvbkJhckFkdmlzb3Iob3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSUFjdGlvbkJhckNvbmZpZ3VyZXIpCi0gICAgICovCi0gICAgcHVibGljIEFjdGlvbkJhckFkdmlzb3IgY3JlYXRlQWN0aW9uQmFyQWR2aXNvcihJQWN0aW9uQmFyQ29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV29ya2JlbmNoQWN0aW9uQnVpbGRlcihjb25maWd1cmVyKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd29ya2JlbmNoLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHdvcmtiZW5jaAotICAgICAqLwotICAgIHByaXZhdGUgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0gICAgICAgIHJldHVybiBnZXRXaW5kb3dDb25maWd1cmVyKCkuZ2V0V29ya2JlbmNoQ29uZmlndXJlcigpLmdldFdvcmtiZW5jaCgpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjcHJlV2luZG93U2hlbGxDbG9zZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHByZVdpbmRvd1NoZWxsQ2xvc2UoKSB7Ci0gICAgICAgIGlmIChnZXRXb3JrYmVuY2goKS5nZXRXb3JrYmVuY2hXaW5kb3dDb3VudCgpID4gMSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdGhlIHVzZXIgaGFzIGFza2VkIHRvIGNsb3NlIHRoZSBsYXN0IHdpbmRvdywgd2hpbGUgd2lsbCBjYXVzZSB0aGUKLSAgICAgICAgLy8gd29ya2JlbmNoIHRvIGNsb3NlIGluIGR1ZSBjb3Vyc2UgLSBwcm9tcHQgdGhlIHVzZXIgZm9yIGNvbmZpcm1hdGlvbgotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgYm9vbGVhbiBwcm9tcHRPbkV4aXQgPSBzdG9yZQotICAgICAgICAgICAgICAgIC5nZXRCb29sZWFuKElERUludGVybmFsUHJlZmVyZW5jZXMuRVhJVF9QUk9NUFRfT05fQ0xPU0VfTEFTVF9XSU5ET1cpOwotCi0gICAgICAgIGlmIChwcm9tcHRPbkV4aXQpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlOwotCi0gICAgICAgICAgICBTdHJpbmcgcHJvZHVjdE5hbWUgPSBudWxsOwotICAgICAgICAgICAgSVByb2R1Y3QgcHJvZHVjdCA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKTsKLSAgICAgICAgICAgIGlmIChwcm9kdWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9kdWN0TmFtZSA9IHByb2R1Y3QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByb2R1Y3ROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvbXB0T25FeGl0RGlhbG9nX21lc3NhZ2UwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvbXB0T25FeGl0RGlhbG9nX21lc3NhZ2UxLCBwcm9kdWN0TmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlIGRsZyA9IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlCi0gICAgICAgICAgICAgICAgICAgIC5vcGVuT2tDYW5jZWxDb25maXJtKGdldFdpbmRvd0NvbmZpZ3VyZXIoKS5nZXRXaW5kb3coKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTaGVsbCgpLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9tcHRPbkV4aXREaWFsb2dfc2hlbGxUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9tcHRPbkV4aXREaWFsb2dfY2hvaWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGlmIChkbGcuZ2V0UmV0dXJuQ29kZSgpICE9IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGxnLmdldFRvZ2dsZVN0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICBzdG9yZQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVJbnRlcm5hbFByZWZlcmVuY2VzLkVYSVRfUFJPTVBUX09OX0NMT1NFX0xBU1RfV0lORE9XLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjcHJlV2luZG93T3BlbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByZVdpbmRvd09wZW4oKSB7Ci0gICAgICAgIElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIgPSBnZXRXaW5kb3dDb25maWd1cmVyKCk7Ci0KLSAgICAgICAgLy8gc2hvdyB0aGUgc2hvcnRjdXQgYmFyIGFuZCBwcm9ncmVzcyBpbmRpY2F0b3IsIHdoaWNoIGFyZSBoaWRkZW4gYnkgZGVmYXVsdAotICAgICAgICBjb25maWd1cmVyLnNldFNob3dQZXJzcGVjdGl2ZUJhcih0cnVlKTsKLSAgICAgICAgY29uZmlndXJlci5zZXRTaG93RmFzdFZpZXdCYXJzKHRydWUpOwotICAgICAgICBjb25maWd1cmVyLnNldFNob3dQcm9ncmVzc0luZGljYXRvcih0cnVlKTsKLQotICAgICAgICAvLyBhZGQgdGhlIGRyYWcgYW5kIGRyb3Agc3VwcG9ydCBmb3IgdGhlIGVkaXRvciBhcmVhCi0gICAgICAgIGNvbmZpZ3VyZXIuYWRkRWRpdG9yQXJlYVRyYW5zZmVyKEVkaXRvcklucHV0VHJhbnNmZXIKLSAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgICAgIGNvbmZpZ3VyZXIuYWRkRWRpdG9yQXJlYVRyYW5zZmVyKFJlc291cmNlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgICAgIGNvbmZpZ3VyZXIuYWRkRWRpdG9yQXJlYVRyYW5zZmVyKE1hcmtlclRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotICAgICAgICBjb25maWd1cmVyCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZUVkaXRvckFyZWFEcm9wTGlzdGVuZXIobmV3IEVkaXRvckFyZWFEcm9wQWRhcHRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZXIuZ2V0V2luZG93KCkpKTsKLQotICAgICAgICBob29rVGl0bGVVcGRhdGVMaXN0ZW5lcnMoY29uZmlndXJlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSG9va3MgdGhlIGxpc3RlbmVycyBuZWVkZWQgb24gdGhlIHdpbmRvdwotICAgICAqIEBwYXJhbSBjb25maWd1cmVyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhvb2tUaXRsZVVwZGF0ZUxpc3RlbmVycyhJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0gICAgICAgIC8vIGhvb2sgdXAgdGhlIGxpc3RlbmVycyB0byB1cGRhdGUgdGhlIHdpbmRvdyB0aXRsZQotICAgICAgICBjb25maWd1cmVyLmdldFdpbmRvdygpLmFkZFBhZ2VMaXN0ZW5lcihuZXcgSVBhZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhZ2VBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhZ2VDbG9zZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhZ2VPcGVuZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGNvbmZpZ3VyZXIuZ2V0V2luZG93KCkuYWRkUGVyc3BlY3RpdmVMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICBuZXcgUGVyc3BlY3RpdmVBZGFwdGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyc3BlY3RpdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJCQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVTYXZlZEFzKElXb3JrYmVuY2hQYWdlIHBhZ2UsSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBvbGRQZXJzcGVjdGl2ZSxJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIG5ld1BlcnNwZWN0aXZlKXsKLQkJCQkJCXVwZGF0ZVRpdGxlKCk7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGVyc3BlY3RpdmVEZWFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSBwYWdlLCBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnNwZWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVUaXRsZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIGNvbmZpZ3VyZXIuZ2V0V2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbmV3IElQYXJ0TGlzdGVuZXIyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIElFZGl0b3JSZWZlcmVuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVUaXRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBJRWRpdG9yUmVmZXJlbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcmVmKSB7Ci0JCQkJCQl1cGRhdGVUaXRsZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhcnRIaWRkZW4oSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0VmlzaWJsZShJV29ya2JlbmNoUGFydFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhcnRJbnB1dENoYW5nZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IAotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZVRpdGxlKCkgewotICAgICAgICBJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyID0gZ2V0V2luZG93Q29uZmlndXJlcigpOwotICAgICAgICBJV29ya2JlbmNoUGFnZSBjdXJyZW50UGFnZSA9IGNvbmZpZ3VyZXIuZ2V0V2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IgPSBudWxsOwotICAgICAgICBpZiAoY3VycmVudFBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgYWN0aXZlRWRpdG9yID0gY3VycmVudFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG51bGw7Ci0gICAgICAgIElQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0gICAgICAgIGlmIChwcm9kdWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRpdGxlID0gcHJvZHVjdC5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRpdGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRpdGxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJyZW50UGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsYXN0RWRpdG9yVGl0bGUgPSBhY3RpdmVFZGl0b3IuZ2V0VGl0bGUoKTsKLSAgICAgICAgICAgICAgICB0aXRsZSA9IE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaFdpbmRvd19zaGVsbFRpdGxlLCBsYXN0RWRpdG9yVGl0bGUsIHRpdGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyc3AgPSBjdXJyZW50UGFnZS5nZXRQZXJzcGVjdGl2ZSgpOwotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChwZXJzcCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGxhYmVsID0gcGVyc3AuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgIElBZGFwdGFibGUgaW5wdXQgPSBjdXJyZW50UGFnZS5nZXRJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgIWlucHV0LmVxdWFscyh3YkFkdmlzb3IuZ2V0RGVmYXVsdFBhZ2VJbnB1dCgpKSkgewotICAgICAgICAgICAgICAgIGxhYmVsID0gY3VycmVudFBhZ2UuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsYWJlbCAhPSBudWxsICYmICFsYWJlbC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgICAgICAgdGl0bGUgPSBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hXaW5kb3dfc2hlbGxUaXRsZSwgbGFiZWwsIHRpdGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB3b3Jrc3BhY2VMb2NhdGlvbiA9IHdiQWR2aXNvci5nZXRXb3Jrc3BhY2VMb2NhdGlvbigpOwotICAgICAgICBpZiAod29ya3NwYWNlTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdGl0bGUgPSBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hXaW5kb3dfc2hlbGxUaXRsZSwgdGl0bGUsIHdvcmtzcGFjZUxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRpdGxlOyAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWNvbXB1dGVUaXRsZSgpIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlciA9IGdldFdpbmRvd0NvbmZpZ3VyZXIoKTsKLSAgICAgICAgU3RyaW5nIG9sZFRpdGxlID0gY29uZmlndXJlci5nZXRUaXRsZSgpOwotICAgICAgICBTdHJpbmcgbmV3VGl0bGUgPSBjb21wdXRlVGl0bGUoKTsKLSAgICAgICAgaWYgKCFuZXdUaXRsZS5lcXVhbHMob2xkVGl0bGUpKSB7Ci0gICAgICAgICAgICBjb25maWd1cmVyLnNldFRpdGxlKG5ld1RpdGxlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgd2luZG93IHRpdGxlLiBGb3JtYXQgd2lsbCBiZToKLSAgICAgKiBbcGFnZUlucHV0IC1dIFtjdXJyZW50UGVyc3BlY3RpdmUgLV0gW2VkaXRvcklucHV0IC1dIFt3b3Jrc3BhY2VMb2NhdGlvbiAtXSBwcm9kdWN0TmFtZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUaXRsZSgpIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlciA9IGdldFdpbmRvd0NvbmZpZ3VyZXIoKTsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBjb25maWd1cmVyLmdldFdpbmRvdygpOwotICAgICAgICBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IgPSBudWxsOwotICAgICAgICBJV29ya2JlbmNoUGFnZSBjdXJyZW50UGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyc3AgPSBudWxsOwotICAgICAgICBJQWRhcHRhYmxlIGlucHV0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmIChjdXJyZW50UGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhY3RpdmVFZGl0b3IgPSBjdXJyZW50UGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIHBlcnNwID0gY3VycmVudFBhZ2UuZ2V0UGVyc3BlY3RpdmUoKTsKLSAgICAgICAgICAgIGlucHV0ID0gY3VycmVudFBhZ2UuZ2V0SW5wdXQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gTm90aGluZyB0byBkbyBpZiB0aGUgZWRpdG9yIGhhc24ndCBjaGFuZ2VkCi0gICAgICAgIGlmIChhY3RpdmVFZGl0b3IgPT0gbGFzdEFjdGl2ZUVkaXRvciAmJiBjdXJyZW50UGFnZSA9PSBsYXN0QWN0aXZlUGFnZSAKLSAgICAgICAgICAgICAgICAmJiBwZXJzcCA9PSBsYXN0UGVyc3BlY3RpdmUgJiYgaW5wdXQgPT0gbGFzdElucHV0KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChsYXN0QWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxhc3RBY3RpdmVFZGl0b3IucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcihlZGl0b3JQcm9wZXJ0eUxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGxhc3RBY3RpdmVFZGl0b3IgPSBhY3RpdmVFZGl0b3I7Ci0gICAgICAgIGxhc3RBY3RpdmVQYWdlID0gY3VycmVudFBhZ2U7Ci0gICAgICAgIGxhc3RQZXJzcGVjdGl2ZSA9IHBlcnNwOwotICAgICAgICBsYXN0SW5wdXQgPSBpbnB1dDsKLSAgICAgICAgCi0gICAgICAgIGlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgYWN0aXZlRWRpdG9yLmFkZFByb3BlcnR5TGlzdGVuZXIoZWRpdG9yUHJvcGVydHlMaXN0ZW5lcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZWNvbXB1dGVUaXRsZSgpOwotICAgIH0KLQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjcG9zdFdpbmRvd1Jlc3RvcmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwb3N0V2luZG93UmVzdG9yZSgpCi0gICAgICAgICAgICB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlciA9IGdldFdpbmRvd0NvbmZpZ3VyZXIoKTsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBjb25maWd1cmVyLmdldFdpbmRvdygpOwotICAgICAgICAKLSAgICAgICAgaW50IGluZGV4ID0gZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2JlbmNoV2luZG93Q291bnQoKSAtIDE7Ci0KLSAgICAgICAgQWJvdXRJbmZvW10gd2VsY29tZVBlcnNwZWN0aXZlSW5mb3MgPSB3YkFkdmlzb3IuZ2V0V2VsY29tZVBlcnNwZWN0aXZlSW5mb3MoKTsgCi0gICAgICAgIGlmIChpbmRleCA+PSAwICYmIHdlbGNvbWVQZXJzcGVjdGl2ZUluZm9zICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBpbmRleCA8IHdlbGNvbWVQZXJzcGVjdGl2ZUluZm9zLmxlbmd0aCkgewotICAgICAgICAgICAgLy8gZmluZCBhIHBhZ2UgdGhhdCBleGlzdCBpbiB0aGUgd2luZG93Ci0gICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgIGlmIChwYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZVtdIHBhZ2VzID0gd2luZG93LmdldFBhZ2VzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2VzICE9IG51bGwgJiYgcGFnZXMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgcGFnZSA9IHBhZ2VzWzBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpZiB0aGUgd2luZG93IGRvZXMgbm90IGNvbnRhaW4gYSBwYWdlLCBjcmVhdGUgb25lCi0gICAgICAgICAgICBTdHJpbmcgcGVyc3BlY3RpdmVJZCA9IHdlbGNvbWVQZXJzcGVjdGl2ZUluZm9zW2luZGV4XS5nZXRXZWxjb21lUGVyc3BlY3RpdmVJZCgpOwotICAgICAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElBZGFwdGFibGUgcm9vdCA9IHdiQWR2aXNvci5nZXREZWZhdWx0UGFnZUlucHV0KCk7Ci0gICAgICAgICAgICAgICAgcGFnZSA9IHdpbmRvdy5vcGVuUGFnZShwZXJzcGVjdGl2ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIElQZXJzcGVjdGl2ZVJlZ2lzdHJ5IHJlZyA9IGdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpOwotICAgICAgICAgICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYyA9IHJlZwotICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChwZXJzcGVjdGl2ZUlkKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhZ2Uuc2V0UGVyc3BlY3RpdmUoZGVzYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgdGhlIGFjdGl2ZSBwYWdlIGFuZCBvcGVuIHRoZSB3ZWxjb21lIGVkaXRvcgotICAgICAgICAgICAgd2luZG93LnNldEFjdGl2ZVBhZ2UocGFnZSk7Ci0gICAgICAgICAgICBwYWdlLm9wZW5FZGl0b3IobmV3IFdlbGNvbWVFZGl0b3JJbnB1dCgKLSAgICAgICAgICAgICAgICAgICAgd2VsY29tZVBlcnNwZWN0aXZlSW5mb3NbaW5kZXhdKSwKLSAgICAgICAgICAgICAgICAgICAgV0VMQ09NRV9FRElUT1JfSUQsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gb3BlbiB0aGUgaW50cm8sIGlmIG9uZSBleGlzdHMgYW5kIG90aGVyd2lzZSB3aWxsIG9wZW4gdGhlIGxlZ2FjeSAKLSAgICAgKiBXZWxjb21lIHBhZ2VzLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvciNvcGVuSW50cm8oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9wZW5JbnRybygpIHsKLSAgICAgICAgaWYgKGVkaXRvcnNBbmRJbnRyb3NPcGVuZWQgKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGVkaXRvcnNBbmRJbnRyb3NPcGVuZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIGRvbid0IHRyeSB0byBvcGVuIHRoZSB3ZWxjb21lIGVkaXRvcnMgaWYgdGhlcmUgaXMgYW4gaW50cm8KLSAgICAgICAgaWYgKHdiQWR2aXNvci5oYXNJbnRybygpKQotICAgICAgICAgICAgc3VwZXIub3BlbkludHJvKCk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgb3BlbldlbGNvbWVFZGl0b3JzKGdldFdpbmRvd0NvbmZpZ3VyZXIoKS5nZXRXaW5kb3coKSk7Ci0gICAgICAgICAgICAvLyBzYXZlIGFueSBwcmVmZXJlbmNlcyBjaGFuZ2VzIGNhdXNlZCBieSB0aGUgYWJvdmUgYWN0aW9ucwotICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogT3BlbiB0aGUgd2VsY29tZSBlZGl0b3IgZm9yIHRoZSBwcmltYXJ5IGZlYXR1cmUgYW5kCi0gICAgICogZm9yIGFueSBuZXdseSBpbnN0YWxsZWQgZmVhdHVyZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5XZWxjb21lRWRpdG9ycyhJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICBpZiAoSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotICAgICAgICAgICAgICAgIElERUludGVybmFsUHJlZmVyZW5jZXMuV0VMQ09NRV9ESUFMT0cpKSB7Ci0gICAgICAgICAgICAvLyBzaG93IHRoZSB3ZWxjb21lIHBhZ2UgZm9yIHRoZSBwcm9kdWN0IHRoZSBmaXJzdCB0aW1lIHRoZSB3b3JrYmVuY2ggb3BlbnMKLSAgICAgICAgICAgIElQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0gICAgICAgICAgICBpZiAocHJvZHVjdCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgQWJvdXRJbmZvIHByb2R1Y3RJbmZvID0gbmV3IEFib3V0SW5mbyhwcm9kdWN0KTsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBwcm9kdWN0SW5mby5nZXRXZWxjb21lUGFnZVVSTCgpOwotICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5XRUxDT01FX0RJQUxPRywgZmFsc2UpOwotICAgICAgICAgICAgb3BlbldlbGNvbWVFZGl0b3Iod2luZG93LCBuZXcgV2VsY29tZUVkaXRvcklucHV0KHByb2R1Y3RJbmZvKSwgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTaG93IHRoZSB3ZWxjb21lIHBhZ2UgZm9yIGFueSBuZXdseSBpbnN0YWxsZWQgZmVhdHVyZXMKLSAgICAgICAgICAgIExpc3Qgd2VsY29tZUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHdiQWR2aXNvci5nZXROZXdseUFkZGVkQnVuZGxlR3JvdXBzKCkuZW50cnlTZXQoKQotICAgICAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbmVkSWQgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmVhdHVyZUlkID0gdmVyc2lvbmVkSWQuc3Vic3RyaW5nKDAsIHZlcnNpb25lZElkCi0gICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZignOicpKTsKLSAgICAgICAgICAgICAgICBBYm91dEluZm8gaW5mbyA9IChBYm91dEluZm8pIGVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uZ2V0V2VsY29tZVBhZ2VVUkwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdlbGNvbWVGZWF0dXJlcy5hZGQoaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFjdGl2YXRlIHRoZSBmZWF0dXJlIHBsdWctaW4gc28gaXQgY2FuIHJ1biBzb21lIGluc3RhbGwgY29kZQotICAgICAgICAgICAgICAgICAgICBJUGxhdGZvcm1Db25maWd1cmF0aW9uIHBsYXRmb3JtQ29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRvclV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JRmVhdHVyZUVudHJ5IGZlYXR1cmUgPSBwbGF0Zm9ybUNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZENvbmZpZ3VyZWRGZWF0dXJlRW50cnkoZmVhdHVyZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBpID0gZmVhdHVyZS5nZXRGZWF0dXJlUGx1Z2luSWRlbnRpZmllcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0YXJ0IHRoZSBidW5kbGUgaWYgdGhlcmUgaXMgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYnVuZGxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKEJ1bmRsZUV4Y2VwdGlvbiBleGNlcHRpb24pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmxvZygiRmFpbGVkIHRvIGxvYWQgZmVhdHVyZSIsIGV4Y2VwdGlvbik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCB3Q291bnQgPSBnZXRXb3JrYmVuY2goKS5nZXRXb3JrYmVuY2hXaW5kb3dDb3VudCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWxjb21lRmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBYm91dEluZm8gbmV3SW5mbyA9IChBYm91dEluZm8pIHdlbGNvbWVGZWF0dXJlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gbmV3SW5mby5nZXRXZWxjb21lUGVyc3BlY3RpdmVJZCgpOwotICAgICAgICAgICAgICAgIC8vIE90aGVyIGVkaXRvcnMgd2VyZSBhbHJlYWR5IG9wZW5lZCBpbiBwb3N0V2luZG93UmVzdG9yZSguLikKLSAgICAgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCB8fCBpID49IHdDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBvcGVuV2VsY29tZUVkaXRvcih3aW5kb3csIG5ldyBXZWxjb21lRWRpdG9ySW5wdXQobmV3SW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW4gYSB3ZWxjb21lIGVkaXRvciBmb3IgdGhlIGdpdmVuIGlucHV0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5XZWxjb21lRWRpdG9yKElXb3JrYmVuY2hXaW5kb3cgd2luZG93LAotICAgICAgICAgICAgV2VsY29tZUVkaXRvcklucHV0IGlucHV0LCBTdHJpbmcgcGVyc3BlY3RpdmVJZCkgewotICAgICAgICBpZiAoZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2JlbmNoV2luZG93Q291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBTb21ldGhpbmcgaXMgd3JvbmcsIHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdAotICAgICAgICAgICAgLy8gb25lIHdvcmtiZW5jaCB3aW5kb3cgb3BlbiBieSBub3cuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbiA9IHdpbmRvdzsKLSAgICAgICAgaWYgKHBlcnNwZWN0aXZlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3aW4gPSBnZXRXb3JrYmVuY2goKS5vcGVuV29ya2JlbmNoV2luZG93KHBlcnNwZWN0aXZlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICB3YkFkdmlzb3IuZ2V0RGVmYXVsdFBhZ2VJbnB1dCgpKTsKLSAgICAgICAgICAgICAgICBpZiAod2luID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd2luID0gd2luZG93OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luCi0gICAgICAgICAgICAgICAgICAgICAgICAubG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb3BlbmluZyB3aW5kb3cgd2l0aCB3ZWxjb21lIHBlcnNwZWN0aXZlLiIsIGUuZ2V0U3RhdHVzKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3aW4gPSBnZXRXb3JrYmVuY2goKS5nZXRXb3JrYmVuY2hXaW5kb3dzKClbMF07Ci0gICAgICAgIH0KLQotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgU3RyaW5nIGlkID0gcGVyc3BlY3RpdmVJZDsKLSAgICAgICAgaWYgKGlkID09IG51bGwpIHsKLSAgICAgICAgICAgIGlkID0gZ2V0V29ya2JlbmNoKCkuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0UGVyc3BlY3RpdmUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFnZSA9IHdpbi5vcGVuUGFnZShpZCwgd2JBZHZpc29yLmdldERlZmF1bHRQYWdlSW5wdXQoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcih3aW4uZ2V0U2hlbGwoKSwgSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvYmxlbXNfT3BlbmluZ19QYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCksIGUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwYWdlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHBhZ2UuZ2V0UGVyc3BlY3RpdmUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhZ2UgPSBnZXRXb3JrYmVuY2goKS5zaG93UGVyc3BlY3RpdmUoaWQsIHdpbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgICAgICAub3BlbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW4uZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX29wZW5FZGl0b3JFcnJvckRpYWxvZ1RpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hfb3BlbkVkaXRvckVycm9yRGlhbG9nTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGFnZS5zZXRFZGl0b3JBcmVhVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICAvLyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGVkaXRvcgotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmZpbmRFZGl0b3IoaW5wdXQpOwotICAgICAgICBpZiAoZWRpdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUoZWRpdG9yKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYWdlLm9wZW5FZGl0b3IoaW5wdXQsIFdFTENPTUVfRURJVE9SX0lEKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgRXJyb3JEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgLm9wZW5FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW4uZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hfb3BlbkVkaXRvckVycm9yRGlhbG9nVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX29wZW5FZGl0b3JFcnJvckRpYWxvZ01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjY3JlYXRlRW1wdHlXaW5kb3dDb250ZW50cyhvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlciwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZUVtcHR5V2luZG93Q29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldFdpbmRvd0NvbmZpZ3VyZXIoKS5nZXRXaW5kb3coKTsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gY29tcG9zaXRlLmdldERpc3BsYXkoKTsKLSAgICAgICAgQ29sb3IgYmdDb2wgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9CQUNLR1JPVU5EKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEJhY2tncm91bmQoYmdDb2wpOwotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9GT1JFR1JPVU5EKSk7Ci0gICAgICAgIGxhYmVsLnNldEJhY2tncm91bmQoYmdDb2wpOwotICAgICAgICBsYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldEJvbGQoSkZhY2VSZXNvdXJjZXMuREVGQVVMVF9GT05UKSk7Ci0gICAgICAgIFN0cmluZyBtc2cgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVXb3JrYmVuY2hBZHZpc29yX25vUGVyc3BlY3RpdmU7Ci0gICAgICAgIGxhYmVsLnNldFRleHQobXNnKTsKLSAgICAgICAgVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIgPSBuZXcgVG9vbEJhck1hbmFnZXIoKTsKLSAgICAgICAgLy8gVE9ETzogc2hvdWxkIG9idGFpbiB0aGUgb3BlbiBwZXJzcGVjdGl2ZSBhY3Rpb24gZnJvbSBBY3Rpb25GYWN0b3J5Ci0gICAgICAgIElBY3Rpb24gb3BlblBlcnNwZWN0aXZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5PUEVOX1BFUlNQRUNUSVZFX0RJQUxPRy5jcmVhdGUod2luZG93KTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG9wZW5QZXJzcGVjdGl2ZUFjdGlvbik7Ci0gICAgICAgIFRvb2xCYXIgdG9vbEJhciA9IHRvb2xCYXJNYW5hZ2VyLmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLSAgICAgICAgdG9vbEJhci5zZXRCYWNrZ3JvdW5kKGJnQ29sKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvSUlERUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0lJREVIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQ3OThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvSUlERUhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSB3b3JrYmVuY2guCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQKLSAqIG9yIGV4dGVuZGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUlERUhlbHBDb250ZXh0SWRzIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gQWN0aW9ucwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9CT09LTUFSS19BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgImFkZF9ib29rbWFya19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9UQVNLX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiYWRkX3Rhc2tfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DUkVNRU5UQUxfQlVJTERfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJpbmNyZW1lbnRhbF9idWlsZF9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExfQlVJTERfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJmdWxsX2J1aWxkX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfUkVTT1VSQ0VfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJjbG9zZV9yZXNvdXJjZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fUkVTT1VSQ0VfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJvcGVuX3Jlc291cmNlX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9GSUxFX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAib3Blbl9maWxlX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9TWVNURU1fRURJVE9SX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAib3Blbl9zeXN0ZW1fZWRpdG9yX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGUkVTSF9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInJlZnJlc2hfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFX1JFU09VUkNFX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAibW92ZV9yZXNvdXJjZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFlfUkVTT1VSQ0VfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJjb3B5X3Jlc291cmNlX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRV9QUk9KRUNUX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAibW92ZV9wcm9qZWN0X2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWV9QUk9KRUNUX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiY29weV9wcm9qZWN0X2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FX1JFU09VUkNFX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAicmVuYW1lX3Jlc291cmNlX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX1JFU09VUkNFX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiZGVsZXRlX3Jlc291cmNlX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9QUk9QRVJUWV9ESUFMT0dfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJwcm9qZWN0X3Byb3BlcnR5X2RpYWxvZ19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GT0xERVJfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJjcmVhdGVfZm9sZGVyX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0ZJTEVfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJjcmVhdGVfZmlsZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUlVCX0xPQ0FMX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAic2NydWJfbG9jYWxfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfUEFHRV9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInNldF9wYWdlX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJPVVRfQUNUSU9OID0gUFJFRklYICsgImFib3V0X2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfQUxMX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiY2xvc2VfYWxsX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19UT09MQkFSX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAibG9ja190b29sYmFyX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfUEFHRV9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgImNsb3NlX3BhZ2VfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTE9TRV9QQVJUX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiY2xvc2VfcGFydF9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfQUNUSU9OX1NFVFNfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJlZGl0X2FjdGlvbl9zZXRzX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9QRVJTUEVDVElWRVNfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJlZGl0X3BlcnNwZWN0aXZlc19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT0JBTF9JTkNSRU1FTlRBTF9CVUlMRF9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgImdsb2JhbF9pbmNyZW1lbnRhbF9idWlsZF9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT0JBTF9GVUxMX0JVSUxEX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiZ2xvYmFsX2Z1bGxfYnVpbGRfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfUkVUQVJHRVRfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJkZWxldGVfcmV0YXJnZXRfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTE9TRV9BTExfUEFHRVNfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJjbG9zZV9hbGxfcGFnZXNfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX05FV19QQUdFX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAib3Blbl9uZXdfcGFnZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fTkVXX1dJTkRPV19BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgIm9wZW5fbmV3X3dpbmRvd19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fUFJFRkVSRU5DRVNfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJvcGVuX3ByZWZlcmVuY2VzX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9ORVdfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJvcGVuX25ld19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FWFRfUEFHRV9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgIm5leHRfcGFnZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVSUNLX1NUQVJUX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAicXVpY2tfc3RhcnRfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSVBTX0FORF9UUklDS1NfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJ0aXBzX2FuZF90cmlja3NfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUlUX0FDVElPTiA9IFBSRUZJWCArICJxdWl0X2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRVRfUEVSU1BFQ1RJVkVfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJyZXNldF9wZXJzcGVjdGl2ZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPR0dMRV9FRElUT1JTX1ZJU0lCSUxJVFlfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJ0YXJnZXRfZWRpdG9yc192aXNpYmlsaXR5X2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX1RPX1BFUlNQRUNUSVZFX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAic3dpdGNoX3RvX3BlcnNwZWN0aXZlX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19WSUVXX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAic2hvd192aWV3X2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19WSUVXX09USEVSX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAic2hvd192aWV3X290aGVyX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9QRVJTUEVDVElWRV9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgIm9wZW5fcGVyc3BlY3RpdmVfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX1BFUlNQRUNUSVZFX09USEVSX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAib3Blbl9wZXJzcGVjdGl2ZV9vdGhlcl9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NFX0FMTF9TQVZFRF9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgImNsb3NlX2FsbF9zYXZlZF9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfVklFV19NRU5VX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAic2hvd192aWV3X21lbnVfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLQkVOQ0hfRURJVE9SU19BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgIndvcmtiZW5jaF9lZGl0b3JzX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1dJWkFSRF9TSE9SVENVVF9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgIm5ld193aXphcmRfc2hvcnRjdXRfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NVVF9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInRleHRfY3V0X2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DT1BZX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAidGV4dF9jb3B5X2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QQVNURV9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInRleHRfcGFzdGVfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RFTEVURV9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInRleHRfZGVsZXRlX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TRUxFQ1RfQUxMX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAidGV4dF9zZWxlY3RfYWxsX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9XT1JLU1BBQ0VfRklMRV9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgIm9wZW5fd29ya3NwYWNlX2ZpbGVfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBEaWFsb2dzCi0gICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0xPQ0FUSU9OX1NFTEVDVElPTl9ESUFMT0cgPSBQUkVGSVgKLSAgICAgICAgICAgICsgInByb2plY3RfbG9jYXRpb25fc2VsZWN0aW9uX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19QUk9KRUNUX1BFUlNQRUNUSVZFX0RJQUxPRyA9IFBSRUZJWAotICAgICAgICAgICAgKyAic2hvd19wcm9qZWN0X3BlcnNwZWN0aXZlX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0cgPSBQUkVGSVgKLSAgICAgICAgICAgICsgImNvbnRhaW5lcl9zZWxlY3Rpb25fZGlhbG9nX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1NFTEVDVElPTl9ESUFMT0cgPSBQUkVGSVgKLSAgICAgICAgICAgICsgImZpbGVfc2VsZWN0aW9uX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfU0VMRUNUSU9OX0RJQUxPRyA9IFBSRUZJWAotICAgICAgICAgICAgKyAicmVzb3VyY2Vfc2VsZWN0aW9uX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09UT19MSU5FX0RJQUxPRyA9IFBSRUZJWAotICAgICAgICAgICAgKyAiZ290b19saW5lX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAkKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9QUk9KRUNUX0RJQUxPRyA9IFBSRUZJWAotICAgICAgICAgICAgKyAiZGVsZXRlX3Byb2plY3RfZGlhbG9nX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfRElBTE9HID0gUFJFRklYICsgImZpbHRlcl9kaWFsb2dfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9SRVNPTFVUSU9OX1NFTEVDVElPTl9ESUFMT0cgPSBQUkVGSVgKLSAgICAgICAgICAgICsgIm1hcmtlcl9yZXNvbHV0aW9uX3NlbGVjdGlvbl9kaWFsb2dfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUxDT01FX1BBR0VfU0VMRUNUSU9OX0RJQUxPRyA9IFBSRUZJWAotICAgICAgICAgICAgKyAid2VsY29tZV9wYWdlX3NlbGVjdGlvbl9kaWFsb2ciOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSVBTX0FORF9UUklDS1NfUEFHRV9TRUxFQ1RJT05fRElBTE9HID0gUFJFRklYCi0gICAgICAgICAgICArICJ0aXBzX2FuZF90cmlja3NfcGFnZV9zZWxlY3Rpb25fZGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9SRVNPVVJDRV9ESUFMT0cgPSBQUkVGSVgKLSAgICAgICAgICAgICsgIm9wZW5fcmVzb3VyY2VfZGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZPTERFUl9ESUFMT0cgPSBQUkVGSVggKyAibmV3X2ZvbGRlcl9kaWFsb2ciOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1ZBUklBQkxFX1NFTEVDVElPTl9ESUFMT0cgPSBQUkVGSVgKLSAgICAgICAgICAgICsgInBhdGhfdmFyaWFibGVfc2VsZWN0aW9uX2RpYWxvZyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYSVRfUFJPTVBUX09OX0NMT1NFX0xBU1RfV0lORE9XID0gUFJFRklYCi0gICAgICAgICAgICArICJleGl0X3Byb21wdF9vbl9jbG9zZV9sYXN0X3dpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQVNfRElBTE9HID0gUFJFRklYCi0gICAgKyAic2F2ZV9hc19kaWFsb2dfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCi0gICAgLy8gRWRpdG9ycwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFTENPTUVfRURJVE9SID0gUFJFRklYCi0gICAgICAgICAgICArICJ3ZWxjb21lX2VkaXRvcl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gUHJlZmVyZW5jZSBwYWdlcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX09SREVSX1BSRUZFUkVOQ0VfUEFHRSA9IFBSRUZJWAotICAgICAgICAgICAgKyAiYnVpbGRfb3JkZXJfcHJlZmVyZW5jZV9wYWdlX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1NUQVRFU19QUkVGRVJFTkNFX1BBR0UgPSBQUkVGSVgKLSAgICAgICAgICAgICsgImZpbGVfc3RhdGVzX3ByZWZlcmVuY2VfcGFnZV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSRV9WSUVXRVJTX1BSRUZFUkVOQ0VfUEFHRSA9IFBSRUZJWAotICAgICAgICAgICAgKyAiY29tcGFyZV92aWV3ZXJzX3ByZWZlcmVuY2VfcGFnZV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT05UX1BSRUZFUkVOQ0VfUEFHRSA9IFBSRUZJWAotICAgICAgICAgICAgKyAiZm9udF9wcmVmZXJlbmNlX3BhZ2VfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktFRF9SRVNPVVJDRV9QUkVGRVJFTkNFX1BBR0UgPSBQUkVGSVgKLSAgICAgICAgICAgICsgImxpbmtlZF9yZXNvdXJjZV9wcmVmZXJlbmNlX3BhZ2VfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFByb3BlcnR5IHBhZ2VzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9SRUZFUkVOQ0VfUFJPUEVSVFlfUEFHRSA9IFBSRUZJWAotICAgICAgICAgICAgKyAicHJvamVjdF9yZWZlcmVuY2VfcHJvcGVydHlfcGFnZV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9DQVBBQklMSVRZX1BST1BFUlRZX1BBR0UgPSBQUkVGSVgKLSAgICAgICAgICAgICsgInByb2plY3RfY2FwYWJpbGl0eV9wcm9wZXJ0eV9wYWdlX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9JTkZPX1BST1BFUlRZX1BBR0UgPSBQUkVGSVgKLSAgICAgICAgICAgICsgInJlc291cmNlX2luZm9fcHJvcGVydHlfcGFnZV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gV2l6YXJkIHBhZ2VzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BST0pFQ1RfV0laQVJEX1BBR0UgPSBQUkVGSVgKLSAgICAgICAgICAgICsgIm5ld19wcm9qZWN0X3dpemFyZF9wYWdlX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUFJPSkVDVF9SRUZFUkVOQ0VfV0laQVJEX1BBR0UgPSBQUkVGSVgKLSAgICAgICAgICAgICsgIm5ld19wcm9qZWN0X3JlZmVyZW5jZV93aXphcmRfcGFnZV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BST0pFQ1RfQ0FQQUJJTElUWV9XSVpBUkRfUEFHRSA9IFBSRUZJWAotICAgICAgICAgICAgKyAibmV3X3Byb2plY3RfY2FwYWJpbGl0eV93aXphcmRfcGFnZV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BST0pFQ1RfUkVWSUVXX1dJWkFSRF9QQUdFID0gUFJFRklYCi0gICAgICAgICAgICArICJuZXdfcHJvamVjdF9yZXZpZXdfd2l6YXJkX3BhZ2VfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19QUk9KRUNUX0NPTkZJR1VSRV9XSVpBUkRfUEFHRSA9IFBSRUZJWAotICAgICAgICAgICAgKyAibmV3X3Byb2plY3RfY29uZmlndXJlX3dpemFyZF9wYWdlX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRk9MREVSX1dJWkFSRF9QQUdFID0gUFJFRklYCi0gICAgICAgICAgICArICJuZXdfZm9sZGVyX3dpemFyZF9wYWdlX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRklMRV9XSVpBUkRfUEFHRSA9IFBSRUZJWAotICAgICAgICAgICAgKyAibmV3X2ZpbGVfd2l6YXJkX3BhZ2VfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xJTktfV0laQVJEX1BBR0UgPSBQUkVGSVgKLSAgICAgICAgICAgICsgIm5ld19saW5rX3dpemFyZF9wYWdlX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktJTkdfU0VUX1JFU09VUkNFX1BBR0UgPSBQUkVGSVgKLSAgIAkJCSsgIndvcmtpbmdfc2V0X3Jlc291cmNlX3BhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0gICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLU1BBQ0VfUFJFRkVSRU5DRV9QQUdFID0gUFJFRklYCi0gICAJCQkrICJ3b3Jrc3BhY2VfcHJlZmVyZW5jZV9wYWdlX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBXaXphcmRzCi0gICAKLSAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19GSUxFX1dJWkFSRCA9IFBSRUZJWAotICAgKyAibmV3X2ZpbGVfd2l6YXJkX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19GT0xERVJfV0laQVJEID0gUFJFRklYCi0gICAJKyAibmV3X2ZvbGRlcl93aXphcmRfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BST0pFQ1RfV0laQVJEID0gUFJFRklYCi0gICAJKyAibmV3X3Byb2plY3Rfd2l6YXJkX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEVfQ0FQQUJJTElUWV9XSVpBUkQgPSBQUkVGSVgKLSAgICAgICAgICAgICsgInVwZGF0ZV9jYXBhYmlsaXR5X3dpemFyZF9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JTWFya2VySW1hZ2VQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9JTWFya2VySW1hZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTMxMzdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvSU1hcmtlckltYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotCi0vKioKLSAqIENsaWVudHMgc2hvdWxkIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB3aGVuIGNyZWF0aW5nIGFuCi0gKiBleHRlbnNpb24gdG8gZGVmaW5lIGltYWdlcyBmb3IgbWFya2VyIGR5bmFtaWNhbGx5LgotICogPHA+Ci0gKiBUaGUgbmFtZSBvZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIHNwZWNpZmllZCBpbiB0aGUgZXh0ZW5zaW9uIGNvbnRyaWJ1dGVkIAotICogdG8gdGhlIHdvcmtiZW5jaCdzIG1ha2VyIGltYWdlIHByb3ZpZGVyIGV4dGVuc2lvbiBwb2ludCAKLSAqIChuYW1lZCA8Y29kZT4ib3JnLmVjbGlwc2UudWkubWFrZXJJbWFnZVByb3ZpZGVyIjwvY29kZT4pLgotICogRm9yIGV4YW1wbGUsIHRoZSBwbHVnLWluJ3MgWE1MIG1hcmt1cCBtaWdodCBjb250YWluOgotICogPHByZT4KLSAqICZMVDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1ha2VySW1hZ2VQcm92aWRlciImR1Q7Ci0gKiAgICAgICZMVDtpbWFnZXByb3ZpZGVyIAotICoJCSAgIGlkPSJjb20uZXhhbXBsZS5teXBsdWdpbi5teXByb2ZpZGVySUQiCi0gKiAgICAgICAgIG1ha2VydHlwZT0iY29tLmV4YW1wbGUubXlNYXJrZXJUeXBlIgotICogICAgICAgICBpY29uPSJpY29ucy9iYXNpYy92aWV3MTYvbXlHSUYuZ2lmIi8mR1Q7Ci0gKiAmTFQ7L2V4dGVuc2lvbiZHVDsKLSAqIDwvcHJlPgotICogSXQgY2FuIGFsc28gZGVmaW5lIHRoZSBpbWFnZSBwcm92aWRlciB1c2luZyB0aGUgdGFnIDxjb2RlPmNsYXNzPC9jb2RlPgotICogaW5zdGVhZCBvZiBpY29uLgotICogPC9wPgotICogRWl0aGVyIHRoZSBpbWFnZSBwYXRoIHNwZWNpZmllZCBieSB0aGUgdGFnIDxjb2RlPmljb248L2NvZGU+IG9yCi0gKiB0aGUgcGF0aCByZXR1cm5lZCBmcm9tIDxjb2RlPmdldEltYWdlUGF0aDwvY29kZT4gd2lsbCBiZSB1c2VkCi0gKiB0byBjcmVhdGUgdGhlIGltYWdlIHdoZW4gdGhlIGZvbGxvd2luZyBjb2RlIGlzIGV4ZWN1dGVkOgotICogPHA+PGNvZGU+bXlNYXJrZXIuZ2V0QWRhcHRlcihJV29ya2JlbmNoQWRhcHRlcikuZ2V0SW1hZ2VEZXNjcmlwdG9yKG15TWFya2VyKTs8L2NvZGU+PC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNYXJrZXJJbWFnZVByb3ZpZGVyIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBwYXRoIGZvciB0aGUgaW1hZ2UKLSAgICAgKiB0byBiZSB1c2VkIGZvciBkaXNwbGF5aW5nIGFuIG1hcmtlciBpbiB0aGUgd29ya2JlbmNoLgotICAgICAqIFRoaXMgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGxvY2F0aW9uCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGFwcHJvcHJpYXRlIGltYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcmtlciBUaGUgbWFya2VyIHRvIGdldCBhbiBpbWFnZSBwYXRoIGZvci4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJbWFnZVBhdGgoSU1hcmtlciBtYXJrZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9MaW5lRGVsaW1pdGVyRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0xpbmVEZWxpbWl0ZXJFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViZmNkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL0xpbmVEZWxpbWl0ZXJFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgY2xhc3MgdG8gaGFuZGxlIGVkaXRpbmcgb2YgdGhlIExpbmUgZGVsaW1pdGVyIHByZWZlcmVuY2VzIGluIGNvcmUuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIExpbmVEZWxpbWl0ZXJFZGl0b3IgewotCi0JcHJpdmF0ZSBCdXR0b24gZGVmYXVsdEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIG90aGVyQnV0dG9uOwotCi0JcHJpdmF0ZSBDb21ibyBjaG9pY2VDb21ibzsKLQotCS8qCi0JICogVGhlIHByb2plY3Qgd2hvc2UgcHJlZmVyZW5jZXMgc2hvdWxkIGJlIHNldC4gSW4gc29tZSBjYXNlcyB0aGlzIGNsYXNzCi0JICogd2lsbCBiZSB1c2VkIHRvIGVkaXQgcHJvamVjdCBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVuY29kaW5nIGZpZWxkIGVkaXRvciB3aXRoIHRoZSBnaXZlbiBwcmVmZXJlbmNlIG5hbWUsIGxhYmVsCi0JICogYW5kIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9mIHRoZSBmaWVsZCBlZGl0b3IncyBjb250cm9sCi0JICovCi0JcHVibGljIExpbmVEZWxpbWl0ZXJFZGl0b3IoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQl0aGlzKGNvbXBvc2l0ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlbmNvZGluZyBmaWVsZCBlZGl0b3Igd2l0aCB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSBuYW1lLCBsYWJlbAotCSAqIGFuZCBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvZiB0aGUgZmllbGQgZWRpdG9yJ3MgY29udHJvbAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0byBzZXQgcHJlZmVyZW5jZXMgb24KLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGluZURlbGltaXRlckVkaXRvcihDb21wb3NpdGUgY29tcG9zaXRlLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCWNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoaXMgZmllbGQgZWRpdG9yJ3MgbWFpbiBjb250cm9sIGNvbnRhaW5pbmcgYWxsIG9mIGl0cyBiYXNpYwotCSAqIGNvbnRyb2xzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdyb3VwLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuSURFV29ya3NwYWNlUHJlZmVyZW5jZV9maWxlTGluZURlbGltaXRlcik7Ci0JCWdyb3VwLnNldEZvbnQoZm9udCk7Ci0KLQkJU2VsZWN0aW9uQWRhcHRlciBidXR0b25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldC5lcXVhbHMoZGVmYXVsdEJ1dHRvbikpCi0JCQkJCXVwZGF0ZVN0YXRlKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJdXBkYXRlU3RhdGUoZmFsc2UpOwotCQkJfQotCQl9OwotCi0JCWRlZmF1bHRCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJZGVmYXVsdEJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLklERVdvcmtzcGFjZVByZWZlcmVuY2VfZGVmYXVsdExpbmVEZWxpbSk7Ci0JCWVsc2UKLQkJCWRlZmF1bHRCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVXb3Jrc3BhY2VQcmVmZXJlbmNlX2RlZmF1bHRMaW5lRGVsaW1Qcm9qKTsKLQkJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRlZmF1bHRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGVmYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidXR0b25MaXN0ZW5lcik7Ci0JCWRlZmF1bHRCdXR0b24uc2V0Rm9udChmb250KTsKLQotCQlvdGhlckJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCW90aGVyQnV0dG9uCi0JCQkJLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuSURFV29ya3NwYWNlUHJlZmVyZW5jZV9vdGhlckxpbmVEZWxpbSk7Ci0JCW90aGVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1dHRvbkxpc3RlbmVyKTsKLQkJb3RoZXJCdXR0b24uc2V0Rm9udChmb250KTsKLQotCQljaG9pY2VDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULk5PTkUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQljaG9pY2VDb21iby5zZXRGb250KGZvbnQpOwotCQljaG9pY2VDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwb3B1bGF0ZUNob2ljZUNvbWJvKGdldENob2ljZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgbGlzdCBpdGVtcyBmcm9tIGNvcmUgYW5kIHVwZGF0ZSB0aGUgc3RhdGUgb2YgdGhlIGJ1dHRvbnMgdG8KLQkgKiBtYXRjaCB3aGF0IHRoZSBwcmVmZXJlbmNlIGlzIGN1cnJlbnRseSBzZXQgdG8uCi0JICovCi0JcHVibGljIHZvaWQgZG9Mb2FkKCkgewotCQlpZiAoY2hvaWNlQ29tYm8gIT0gbnVsbCkgewotCQkJcG9wdWxhdGVDaG9pY2VDb21ibyhnZXRDaG9pY2VzKCkpOwotCQkJU3RyaW5nIHJlc291cmNlUHJlZmVyZW5jZSA9IGdldFN0b3JlZFZhbHVlKCk7Ci0JCQl1cGRhdGVTdGF0ZShyZXNvdXJjZVByZWZlcmVuY2UgPT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIGZpZWxkIGVkaXRvciB3aXRoIHRoZSBwcmVmZXJlbmNlIHZhbHVlIGZyb20gdGhlCi0JICogcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRGVmYXVsdCgpIHsKLQkJZG9Mb2FkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgdGhhdCBpcyBjdXJyZW50bHkgc3RvcmVkIGZvciB0aGUgZW5jb2RpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudGx5IHN0b3JlZCBlbmNvZGluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RvcmVkVmFsdWUoKSB7Ci0JCUlTY29wZUNvbnRleHRbXSBzY29wZUNvbnRleHQgPSBuZXcgSVNjb3BlQ29udGV4dFtdIHsgZ2V0U2NvcGVDb250ZXh0KCkgfTsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gc2NvcGVDb250ZXh0WzBdLmdldE5vZGUoUGxhdGZvcm0uUElfUlVOVElNRSk7Ci0JCXJldHVybiBub2RlLmdldChQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIDxjb2RlPklTY29wZUNvbnRleHQ8L2NvZGU+IGZvciB0aGUgcmVjZWl2ZXIsIHRoaXMgd2lsbCBiZSBhCi0JICogcHJvamVjdCBzY29wZSBpZiB0aGUgcmVjZWl2ZXIgaXMgZWRpdGluZyBwcm9qZWN0IHByZWZlcmVuY2VzLCBvdGhlcndpc2UKLQkgKiBpbnN0YW5jZSBzY29wZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzY29wZSBjb250ZXh0Ci0JICovCi0JcHJpdmF0ZSBJU2NvcGVDb250ZXh0IGdldFNjb3BlQ29udGV4dCgpIHsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpOwotCi0JCXJldHVybiBuZXcgSW5zdGFuY2VTY29wZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIG9iamVjdCBiZWluZyBzaG93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoZSBvYmplY3QgYmVpbmcgc2hvd24KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q2hvaWNlcygpIHsKLQkJU2V0IGtleXMgPSBQbGF0Zm9ybS5rbm93blBsYXRmb3JtTGluZVNlcGFyYXRvcnMoKS5rZXlTZXQoKTsKLQkJU3RyaW5nW10ga2V5QXJyYXkgPSBuZXcgU3RyaW5nW2tleXMuc2l6ZSgpXTsKLQkJa2V5cy50b0FycmF5KGtleUFycmF5KTsKLQkJcmV0dXJuIGtleUFycmF5OwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgbGlzdCBvZiBjaG9pY2VzIGNvbWJvLgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNob2ljZUNvbWJvKFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCWNob2ljZUNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQotCQlpZiAoZ2V0U3RvcmVkVmFsdWUoKSA9PSBudWxsKSB7Ci0JCQljaG9pY2VDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJc2VsZWN0Q2hvaWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU3RhdGUoYm9vbGVhbiB1c2VEZWZhdWx0KSB7Ci0JCWlmICh1c2VEZWZhdWx0KSB7Ci0JCQlkZWZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCW90aGVyQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQljaG9pY2VDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWRlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCW90aGVyQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWNob2ljZUNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlzZWxlY3RDaG9pY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbGVjdCB0aGUgaXRlbSBpbiB0aGUgY29tYm8gdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHByZWZlcmVuY2VzCi0JICogc2V0dGluZy4gTk9URTogbm90IGhhbmRsaW5nIHRoZSBjYXNlIHdoZXJlIHR3byBwbGF0Zm9ybSBsaW5lIHNlcGFyYXRvcnMKLQkgKiBhcmUgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIHZhbHVlLiBBc3N1bXB0aW9uIGlzIHRoYXQgdGhleSBhcmUgdW5pcXVlIGFuZAotCSAqIHRoZSBrZXkgd2lsbCBiZSBtb2RpZmllZCB0byByZXByZXNlbnQgdGhhdC4gRS5nLiBhIGtleSBtaWdodCBiZSBNYWMgT1MKLQkgKiAxMC9MaW51eCBpZiB0aGUgc2FtZSB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgdHdvIHBsYXRmb3Jtcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0Q2hvaWNlKCkgewotCQlTdHJpbmcgc2VsZWN0aW9uID0gbnVsbDsKLQkJTWFwIGtub3duVmFsdWVzID0gUGxhdGZvcm0ua25vd25QbGF0Zm9ybUxpbmVTZXBhcmF0b3JzKCk7Ci0JCVNldCBrZXlzID0ga25vd25WYWx1ZXMua2V5U2V0KCk7Ci0JCVN0cmluZyBjdXJyZW50ID0gZ2V0U3RvcmVkVmFsdWUoKTsKLQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0ga2V5cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZWxlbWVudCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChrbm93blZhbHVlcy5nZXQoZWxlbWVudCkuZXF1YWxzKGN1cnJlbnQpKSB7Ci0JCQkJCXNlbGVjdGlvbiA9IGVsZW1lbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmdbXSBpdGVtcyA9IGNob2ljZUNvbWJvLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBpdGVtID0gaXRlbXNbaV07Ci0JCQlpZiAoaXRlbS5lcXVhbHMoc2VsZWN0aW9uKSkgewotCQkJCWNob2ljZUNvbWJvLnNlbGVjdChpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3JlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGluZSBkZWxpbWl0ZXIgdmFsdWUgaW4gdGhlIHByZWZlcmVuY2UKLQkgKiBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZSgpIHsKLQkJU3RyaW5nIHZhbDsKLQkJaWYgKGRlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkgfHwgY2hvaWNlQ29tYm8uZ2V0VGV4dCgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXZhbCA9IG51bGw7Ci0JCWVsc2UgewotCQkJTWFwIGxpbmVTZXBhcmF0b3JzID0gUGxhdGZvcm0ua25vd25QbGF0Zm9ybUxpbmVTZXBhcmF0b3JzKCk7Ci0JCQl2YWwgPSAoU3RyaW5nKSBsaW5lU2VwYXJhdG9ycy5nZXQoY2hvaWNlQ29tYm8uZ2V0VGV4dCgpKTsKLQkJfQotCi0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IGdldFNjb3BlQ29udGV4dCgpLmdldE5vZGUoCi0JCQkJUGxhdGZvcm0uUElfUlVOVElNRSk7Ci0JCWlmICh2YWwgPT0gbnVsbCkKLQkJCW5vZGUucmVtb3ZlKFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IpOwotCQllbHNlCi0JCQlub2RlLnB1dChQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCB2YWwpOwotCQl0cnkgewotCQkJbm9kZS5mbHVzaCgpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJSURFV29ya2JlbmNoUGx1Z2luLmxvZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9MaW5rZWRSZXNvdXJjZURlY29yYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9MaW5rZWRSZXNvdXJjZURlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmNhYTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvTGlua2VkUmVzb3VyY2VEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIEEgTGlua2VkUmVzb3VyY2VEZWNvcmF0b3IgZGVjb3JhdGVzIGFuIGVsZW1lbnQncyBpbWFnZSB3aXRoIGEgbGlua2VkIAotICogcmVzb3VyY2Ugb3ZlcmxheS4gCi0gKiAKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIExpbmtlZFJlc291cmNlRGVjb3JhdG9yIGltcGxlbWVudHMgSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBMSU5LOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIExJTktfV0FSTklORzsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIExJTksgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsCi0gICAgICAgICAgICAgICAgIiRubCQvaWNvbnMvZnVsbC9vdnIxNi9saW5rX292ci5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBMSU5LX1dBUk5JTkcgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsCi0gICAgICAgICAgICAgICAgIiRubCQvaWNvbnMvZnVsbC9vdnIxNi9saW5rd2Fybl9vdnIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxpbmtlZFJlc291cmNlRGVjb3JhdG9yPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlua2VkUmVzb3VyY2VEZWNvcmF0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIG5vIHJlc291cmNlcyB0byBkaXNwb3NlCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBsaW5rZWQgcmVzb3VyY2Ugb3ZlcmxheSBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBhIGxpbmtlZAotICAgICAqIHJlc291cmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IGVsZW1lbnQgdG8gZGVjb3JhdGUKLSAgICAgKiBAcGFyYW0gZGVjb3JhdGlvbiAgVGhlIGRlY29yYXRpb24gd2UgYXJlIGFkZGluZyB0bwotICAgICAqIEByZXR1cm4gdGhlIGxpbmtlZCByZXNvdXJjZSBvdmVybGF5IG9yIG51bGwgaWYgZWxlbWVudCBpcyBub3QgYSAKLSAgICAgKiAJbGlua2VkIHJlc291cmNlLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciNkZWNvcmF0ZShPYmplY3QsIElEZWNvcmF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7Ci0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UgPT0gZmFsc2UpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGVsZW1lbnQ7Ci0gICAgICAgIGlmIChyZXNvdXJjZS5pc0xpbmtlZCgpKSB7Ci0gICAgICAgICAgICBJUGF0aCBsb2NhdGlvbiA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0KLSAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsICYmIGxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKQotICAgICAgICAgICAgICAgIGRlY29yYXRpb24uYWRkT3ZlcmxheShMSU5LKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkZWNvcmF0aW9uLmFkZE92ZXJsYXkoTElOS19XQVJOSU5HKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL1BvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9Qb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJlZjU0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL1BvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotcHVibGljIGNsYXNzIFBvbGljeSB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19PUEVOX0VSUk9SX0RJQUxPRyA9IERFRkFVTFQ7Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX0dDID0gREVGQVVMVDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGlmIChnZXREZWJ1Z09wdGlvbigiL2RlYnVnIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgREVCVUdfT1BFTl9FUlJPUl9ESUFMT0cgPSBnZXREZWJ1Z09wdGlvbigiL2RlYnVnL2ludGVybmFsZXJyb3Ivb3BlbkRpYWxvZyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBERUJVR19HQyA9IGdldERlYnVnT3B0aW9uKCIvZGVidWcvZ2MiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBnZXREZWJ1Z09wdGlvbihTdHJpbmcgb3B0aW9uKSB7Ci0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCArIG9wdGlvbikpOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9Qcm9ibGVtSW1hZ2VQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9Qcm9ibGVtSW1hZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzAxNTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvUHJvYmxlbUltYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIElNYXJrZXJJbWFnZVByb3ZpZGVyIHRvIHByb3ZpZGUgdGhlIGltYWdlCi0gKiBwYXRoIG5hbWVzIGZvciBwcm9ibGVtIG1hcmtlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ibGVtSW1hZ2VQcm92aWRlciBpbXBsZW1lbnRzIElNYXJrZXJJbWFnZVByb3ZpZGVyIHsKLSAgICAvKioKLSAgICAgKiBUYXNrSW1hZ2VQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICAgICAqLwotICAgIHB1YmxpYyBQcm9ibGVtSW1hZ2VQcm92aWRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBwYXRoIGZvciB0aGUgaW1hZ2UKLSAgICAgKiB0byBiZSB1c2VkIGZvciBkaXNwbGF5aW5nIGFuIG1hcmtlciBpbiB0aGUgd29ya2JlbmNoLgotICAgICAqIFRoaXMgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGxvY2F0aW9uCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGFwcHJvcHJpYXRlIGltYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcmtlciBUaGUgbWFya2VyIHRvIGdldCBhbiBpbWFnZSBwYXRoIGZvci4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW1hZ2VQYXRoKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIFN0cmluZyBpY29uUGF0aCA9ICIvaWNvbnMvZnVsbC8iOy8vJE5PTi1OTFMtMSQJCQotICAgICAgICBpZiAoaXNNYXJrZXJUeXBlKG1hcmtlciwgSU1hcmtlci5QUk9CTEVNKSkgewotICAgICAgICAgICAgc3dpdGNoIChtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksCi0gICAgICAgICAgICAgICAgICAgIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORykpIHsKLSAgICAgICAgICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9FUlJPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaWNvblBhdGggKyAib2JqMTYvZXJyb3JfdHNrLmdpZiI7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGljb25QYXRoICsgIm9iajE2L3dhcm5fdHNrLmdpZiI7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX0lORk86Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGljb25QYXRoICsgIm9iajE2L2luZm9fdHNrLmdpZiI7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbWFya2VyIGlzIG9mIHRoZSBnaXZlbiB0eXBlIChlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWFya2VyVHlwZShJTWFya2VyIG1hcmtlciwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtYXJrZXIuaXNTdWJ0eXBlT2YodHlwZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9SZXNvdXJjZVBlcnNwZWN0aXZlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL1Jlc291cmNlUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiZjYwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL1Jlc291cmNlUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRm9sZGVyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRGVmYXVsdCBsYXlvdXQgZW5naW5lLgotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZVBlcnNwZWN0aXZlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGluaXRpYWwgbGF5b3V0IGZvciBhIHBlcnNwZWN0aXZlLiAgCi0gICAgICoKLSAgICAgKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBtZXRob2QgbWF5IGFkZCBhZGRpdGlvbmFsIHZpZXdzIHRvIGEKLSAgICAgKiBwZXJzcGVjdGl2ZS4gIFRoZSBwZXJzcGVjdGl2ZSBhbHJlYWR5IGNvbnRhaW5zIGFuIGVkaXRvciBmb2xkZXIKLSAgICAgKiB3aXRoIDxjb2RlPklEID0gSUxheW91dEZhY3RvcnkuSURfRURJVE9SUzwvY29kZT4uICBBZGQgYWRkaXRpb25hbCB2aWV3cwotICAgICAqIHRvIHRoZSBwZXJzcGVjdGl2ZSBpbiByZWZlcmVuY2UgdG8gdGhlIGVkaXRvciBmb2xkZXIuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGVuIGEgbmV3IHBlcnNwZWN0aXZlIGlzIGNyZWF0ZWQuICBJZgotICAgICAqIGFuIG9sZCBwZXJzcGVjdGl2ZSBpcyByZXN0b3JlZCBmcm9tIGEgcGVyc2lzdGVuY2UgZmlsZSB0aGVuCi0gICAgICogdGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsYXlvdXQgdGhlIGZhY3RvcnkgdXNlZCB0byBhZGQgdmlld3MgdG8gdGhlIHBlcnNwZWN0aXZlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLSAgICAgICAgZGVmaW5lQWN0aW9ucyhsYXlvdXQpOwotICAgICAgICBkZWZpbmVMYXlvdXQobGF5b3V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBpbml0aWFsIGFjdGlvbnMgZm9yIGEgcGFnZS4gIAotICAgICAqIEBwYXJhbSBsYXlvdXQgVGhlIGxheW91dCB3ZSBhcmUgZmlsbGluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlZmluZUFjdGlvbnMoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0gICAgICAgIC8vIEFkZCAibmV3IHdpemFyZHMiLgotICAgICAgICBsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZvbGRlciIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5maWxlIik7Ly8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIEFkZCAic2hvdyB2aWV3cyIuCi0gICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotICAgICAgICBsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotICAgICAgICBsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9PVVRMSU5FKTsKLSAgICAgICAgbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfUFJPUF9TSEVFVCk7Ci0gICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0gICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1RBU0tfTElTVCk7Ci0KLSAgICAgICAgbGF5b3V0LmFkZEFjdGlvblNldChJUGFnZUxheW91dC5JRF9OQVZJR0FURV9BQ1RJT05fU0VUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBpbml0aWFsIGxheW91dCBmb3IgYSBwYWdlLiAgCi0gICAgICogQHBhcmFtIGxheW91dCBUaGUgbGF5b3V0IHdlIGFyZSBmaWxsaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVmaW5lTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotICAgICAgICAvLyBFZGl0b3JzIGFyZSBwbGFjZWQgZm9yIGZyZWUuCi0gICAgICAgIFN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLQotICAgICAgICAvLyBUb3AgbGVmdC4KLSAgICAgICAgSUZvbGRlckxheW91dCB0b3BMZWZ0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigKLSAgICAgICAgICAgICAgICAidG9wTGVmdCIsIElQYWdlTGF5b3V0LkxFRlQsIChmbG9hdCkgMC4yNiwgZWRpdG9yQXJlYSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICB0b3BMZWZ0LmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfUkVTX05BVik7Ci0gICAgICAgIHRvcExlZnQuYWRkUGxhY2Vob2xkZXIoSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTKTsKLQotICAgICAgICAvLyBCb3R0b20gbGVmdC4KLSAgICAgICAgSUZvbGRlckxheW91dCBib3R0b21MZWZ0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigKLSAgICAgICAgICAgICAgICAiYm90dG9tTGVmdCIsIElQYWdlTGF5b3V0LkJPVFRPTSwgKGZsb2F0KSAwLjUwLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAidG9wTGVmdCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgYm90dG9tTGVmdC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX09VVExJTkUpOwotCi0gICAgICAgIC8vIEJvdHRvbSByaWdodC4KLQkJSUZvbGRlckxheW91dCBib3R0b21SaWdodCA9IGxheW91dC5jcmVhdGVGb2xkZXIoCi0gICAgICAgICAgICAgICAgImJvdHRvbVJpZ2h0IiwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAoZmxvYXQpIDAuNjYsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGVkaXRvckFyZWEpOwotCQkKLQkJYm90dG9tUmlnaHQuYWRkVmlldyhJUGFnZUxheW91dC5JRF9UQVNLX0xJU1QpOwotCQkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL1Jlc291cmNlV29ya2luZ1NldFVwZGF0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvUmVzb3VyY2VXb3JraW5nU2V0VXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzQ5MjZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvUmVzb3VyY2VXb3JraW5nU2V0VXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXRVcGRhdGVyOwotCi0vKioKLSAqIEEgd29ya2luZyBzZXQgdXBkYXRlciB0aGF0IHVwZGF0ZXMgcmVzb3VyY2Ugd29ya2luZyBzZXRzIG9uIHJlc291cmNlIGRlbHRhcwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVdvcmtpbmdTZXRVcGRhdGVyIGltcGxlbWVudHMgSVdvcmtpbmdTZXRVcGRhdGVyLAotCQlJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IGNsYXNzIHVzZWQgdG8gaGVscCBwcm9jZXNzIGluY29taW5nIHJlc291cmNlIGRlbHRhcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBXb3JraW5nU2V0RGVsdGEgewotCQlwcml2YXRlIElXb3JraW5nU2V0IGZXb3JraW5nU2V0OwotCi0JCXByaXZhdGUgTGlzdCBmRWxlbWVudHM7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGZDaGFuZ2VkOwotCi0JCS8qKgotCQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLQkJICogCi0JCSAqIEBwYXJhbSB3b3JraW5nU2V0Ci0JCSAqICAgICAgICAgICAgdGhlIHdvcmtpbmcgc2V0IHRvIHRyYWNrLgotCQkgKi8KLQkJcHVibGljIFdvcmtpbmdTZXREZWx0YShJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0JCQlmV29ya2luZ1NldCA9IHdvcmtpbmdTZXQ7Ci0JCQlmRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3Qod29ya2luZ1NldC5nZXRFbGVtZW50cygpKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBlbGVtZW50IGluIHRoZSBsaXN0IG9mIGtub3duIGVsZW1lbnRzLgotCQkgKiAKLQkJICogQHBhcmFtIGVsZW1lbnQKLQkJICogICAgICAgICAgICB0aGUgZWxlbWVudCB0byBzZWFyY2ggZm9yCi0JCSAqIEByZXR1cm4gdGhlIGluZGV4LCBvciAtMSBpZiB1bmtub3duLgotCQkgKi8KLQkJcHVibGljIGludCBpbmRleE9mKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZkVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIGxpc3Qgb2Yga25vd24gZWxlbWVudHMuCi0JCSAqIAotCQkgKiBAcGFyYW0gaW5kZXgKLQkJICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gcGxhY2UgdGhlIGVsZW1lbnQKLQkJICogQHBhcmFtIGVsZW1lbnQKLQkJICogICAgICAgICAgICB0aGUgZWxlbWVudCB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQlmRWxlbWVudHMuc2V0KGluZGV4LCBlbGVtZW50KTsKLQkJCWZDaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZW1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBsaXN0IG9mIGtub3duIGVsZW1lbnRzLgotCQkgKiAKLQkJICogQHBhcmFtIGluZGV4Ci0JCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJlbW92ZQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQkJaWYgKGZFbGVtZW50cy5yZW1vdmUoaW5kZXgpICE9IG51bGwpIHsKLQkJCQlmQ2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUHJvY2VzcyB0aGUgY2hhbmdlcyB0byB0aGlzIGRlbHRhIGFuZCB1cGRhdGUgdGhlIHdvcmtpbmcgc2V0IGlmCi0JCSAqIG5lY2Vzc2FyeS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0JCQlpZiAoZkNoYW5nZWQpIHsKLQkJCQlmV29ya2luZ1NldC5zZXRFbGVtZW50cygoSUFkYXB0YWJsZVtdKSBmRWxlbWVudHMKLQkJCQkJCS50b0FycmF5KG5ldyBJQWRhcHRhYmxlW2ZFbGVtZW50cy5zaXplKCldKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZldvcmtpbmdTZXRzOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgdXBkYXRlci4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VXb3JraW5nU2V0VXBkYXRlcigpIHsKLQkJZldvcmtpbmdTZXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLAotCQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoSVdvcmtpbmdTZXQgd29ya2luZ1NldCkgewotCQljaGVja0VsZW1lbnRFeGlzdGVuY2Uod29ya2luZ1NldCk7Ci0JCXN5bmNocm9uaXplZCAoZldvcmtpbmdTZXRzKSB7Ci0JCQlmV29ya2luZ1NldHMuYWRkKHdvcmtpbmdTZXQpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKElXb3JraW5nU2V0IHdvcmtpbmdTZXQpIHsKLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCXN5bmNocm9uaXplZCAoZldvcmtpbmdTZXRzKSB7Ci0JCQlyZXN1bHQgPSBmV29ya2luZ1NldHMucmVtb3ZlKHdvcmtpbmdTZXQpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0JCXN5bmNocm9uaXplZCAoZldvcmtpbmdTZXRzKSB7Ci0JCQlyZXR1cm4gZldvcmtpbmdTZXRzLmNvbnRhaW5zKHdvcmtpbmdTZXQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3luY2hyb25pemVkIChmV29ya2luZ1NldHMpIHsKLQkJCWZXb3JraW5nU2V0cy5jbGVhcigpOwotCQl9Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCWlmIChkZWx0YSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzOwotCQlzeW5jaHJvbml6ZWQgKGZXb3JraW5nU2V0cykgewotCQkJd29ya2luZ1NldHMgPSAoSVdvcmtpbmdTZXRbXSkgZldvcmtpbmdTZXRzCi0JCQkJCS50b0FycmF5KG5ldyBJV29ya2luZ1NldFtmV29ya2luZ1NldHMuc2l6ZSgpXSk7Ci0JCX0KLQkJZm9yIChpbnQgdyA9IDA7IHcgPCB3b3JraW5nU2V0cy5sZW5ndGg7IHcrKykgewotCQkJV29ya2luZ1NldERlbHRhIHdvcmtpbmdTZXREZWx0YSA9IG5ldyBXb3JraW5nU2V0RGVsdGEoCi0JCQkJCXdvcmtpbmdTZXRzW3ddKTsKLQkJCXByb2Nlc3NSZXNvdXJjZURlbHRhKHdvcmtpbmdTZXREZWx0YSwgZGVsdGEpOwotCQkJd29ya2luZ1NldERlbHRhLnByb2Nlc3MoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzUmVzb3VyY2VEZWx0YShXb3JraW5nU2V0RGVsdGEgcmVzdWx0LAotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJaW50IHR5cGUgPSByZXNvdXJjZS5nZXRUeXBlKCk7Ci0JCWludCBpbmRleCA9IHJlc3VsdC5pbmRleE9mKHJlc291cmNlKTsKLQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCWlmIChraW5kID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgdHlwZSA9PSBJUmVzb3VyY2UuUFJPSkVDVAotCQkJCSYmIGluZGV4ICE9IC0xKSB7Ci0JCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCkgewotCQkJCXJlc3VsdC5zZXQoaW5kZXgsIHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlpZiAoaW5kZXggIT0gLTEgJiYga2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApIHsKLQkJCQlyZXN1bHQuc2V0KGluZGV4LCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0JCQkJCQkuZmluZE1lbWJlcihkZWx0YS5nZXRNb3ZlZFRvUGF0aCgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdC5yZW1vdmUoaW5kZXgpOwotCQkJfQotCQl9Ci0KLQkJLy8gRG9uJ3QgZGl2ZSBpbnRvIGNsb3NlZCBvciBvcGVuZWQgcHJvamVjdHMKLQkJaWYgKHByb2plY3RHb3RDbG9zZWRPck9wZW5lZChyZXNvdXJjZSwga2luZCwgZmxhZ3MpKQotCQkJcmV0dXJuOwotCi0JCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXByb2Nlc3NSZXNvdXJjZURlbHRhKHJlc3VsdCwgY2hpbGRyZW5baV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByb2plY3RHb3RDbG9zZWRPck9wZW5lZChJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLAotCQkJaW50IGZsYWdzKSB7Ci0JCXJldHVybiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QKLQkJCQkmJiBraW5kID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQKLQkJCQkmJiAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSAhPSAwOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0VsZW1lbnRFeGlzdGVuY2UoSVdvcmtpbmdTZXQgd29ya2luZ1NldCkgewotCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHdvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKSkpOwotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJQWRhcHRhYmxlIGVsZW1lbnQgPSAoSUFkYXB0YWJsZSkgaXRlci5uZXh0KCk7Ci0JCQlib29sZWFuIHJlbW92ZSA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBlbGVtZW50OwotCQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQkJcmVtb3ZlID0gKHByb2plY3QgIT0gbnVsbCA/IHByb2plY3QuaXNPcGVuKCkgOiB0cnVlKQotCQkJCQkJJiYgIXJlc291cmNlLmV4aXN0cygpOwotCQkJfQotCQkJaWYgKHJlbW92ZSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoYW5nZWQpIHsKLQkJCXdvcmtpbmdTZXQuc2V0RWxlbWVudHMoKElBZGFwdGFibGVbXSkgZWxlbWVudHMKLQkJCQkJLnRvQXJyYXkobmV3IElBZGFwdGFibGVbZWxlbWVudHMuc2l6ZSgpXSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9TdGF0dXNVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL1N0YXR1c1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiOGYwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL1N0YXR1c1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGNyZWF0ZSBzdGF0dXMgb2JqZWN0cy4KLSAqCi0gKiBQUklWQVRFCi0gKiAgIFRoaXMgY2xhc3MgaXMgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gY2xhc3MgYW5kIHNob3VsZAotICogICBub3QgYmUgcmVmZXJlbmNlZCBvciBzdWJjbGFzc2VkIG91dHNpZGUgb2YgdGhlIHdvcmtiZW5jaAotICoKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFN0YXR1c1V0aWwgewotCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIGEgZmxhdCBjb2xsZWN0aW9uIG9mIHRoZSBwYXNzZWQgc3RhdHVzIGFuZCBpdHMgcmVjdXJzaXZlIGNoaWxkcmVuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGZsYXR0ZW4oSVN0YXR1cyBhU3RhdHVzKSB7Ci0gICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGlmIChhU3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotICAgICAgICAgICAgSVN0YXR1c1tdIGNoaWxkcmVuID0gYVN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElTdGF0dXMgY3VycmVudENoaWxkID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGlsZC5pc011bHRpU3RhdHVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgY2hpbGRTdGF0aWlFbnVtID0gZmxhdHRlbihjdXJyZW50Q2hpbGQpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZFN0YXRpaUVudW0uaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjaGlsZFN0YXRpaUVudW0ubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjdXJyZW50Q2hpbGQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJlc3VsdC5hZGQoYVN0YXR1cyk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgd29ya2JlbmNoLgotICAgICAqCi0gICAgICogVXRpbGl0eSBtZXRob2QgZm9yIGNyZWF0aW5nIHN0YXR1cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIElTdGF0dXMgbmV3U3RhdHVzKElTdGF0dXNbXSBzdGF0aSwgU3RyaW5nIG1lc3NhZ2UsCi0gICAgICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVN0YXR1cyhJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICBzdGF0aSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgd29ya2JlbmNoLgotICAgICAqCi0gICAgICogVXRpbGl0eSBtZXRob2QgZm9yIGNyZWF0aW5nIHN0YXR1cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElTdGF0dXMgbmV3U3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsCi0gICAgICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0KLSAgICAgICAgU3RyaW5nIHN0YXR1c01lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsIHx8IG1lc3NhZ2UudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGlmIChleGNlcHRpb24uZ2V0TWVzc2FnZSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZSA9IGV4Y2VwdGlvbi50b1N0cmluZygpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2UgPSBleGNlcHRpb24uZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIElERVdvcmtiZW5jaFBsdWdpbi5JREVfV09SS0JFTkNILCBzZXZlcml0eSwKLSAgICAgICAgICAgICAgICBzdGF0dXNNZXNzYWdlLCBleGNlcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGNhbGxlZCBvdXRzaWRlIHRoZSB3b3JrYmVuY2guCi0gICAgICoKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY3JlYXRpbmcgc3RhdHVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBuZXdTdGF0dXMoTGlzdCBjaGlsZHJlbiwgU3RyaW5nIG1lc3NhZ2UsCi0gICAgICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0KLSAgICAgICAgTGlzdCBmbGF0U3RhdHVzQ29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgSVN0YXR1cyBjdXJyZW50U3RhdHVzID0gKElTdGF0dXMpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgSXRlcmF0b3IgY2hpbGRyZW5JdGVyID0gZmxhdHRlbihjdXJyZW50U3RhdHVzKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuSXRlci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgZmxhdFN0YXR1c0NvbGxlY3Rpb24uYWRkKGNoaWxkcmVuSXRlci5uZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgSVN0YXR1c1tdIHN0YXRpID0gbmV3IElTdGF0dXNbZmxhdFN0YXR1c0NvbGxlY3Rpb24uc2l6ZSgpXTsKLSAgICAgICAgZmxhdFN0YXR1c0NvbGxlY3Rpb24udG9BcnJheShzdGF0aSk7Ci0gICAgICAgIHJldHVybiBuZXdTdGF0dXMoc3RhdGksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9TdHJpbmdNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL1N0cmluZ01hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1ZThkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL1N0cmluZ01hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBBIHN0cmluZyBwYXR0ZXJuIG1hdGNoZXIgc3VwcHBvcnRpbmcgJiMzOTsqJiMzOTsgYW5kICYjMzk7JiM2MzsmIzM5OyB3aWxkY2FyZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdNYXRjaGVyIHsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZQYXR0ZXJuOwotCi0gICAgcHJvdGVjdGVkIGludCBmTGVuZ3RoOyAvLyBwYXR0ZXJuIGxlbmd0aAotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZklnbm9yZVdpbGRDYXJkczsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGZJZ25vcmVDYXNlOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZkhhc0xlYWRpbmdTdGFyOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZkhhc1RyYWlsaW5nU3RhcjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZlNlZ21lbnRzW107IC8vdGhlIGdpdmVuIHBhdHRlcm4gaXMgc3BsaXQgaW50byAqIHNlcGFyYXRlZCBzZWdtZW50cwotCi0gICAgLyogYm91bmRhcnkgdmFsdWUgYmV5b25kIHdoaWNoIHdlIGRvbid0IG5lZWQgdG8gc2VhcmNoIGluIHRoZSB0ZXh0ICovCi0gICAgcHJvdGVjdGVkIGludCBmQm91bmQgPSAwOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIGZTaW5nbGVXaWxkQ2FyZCA9ICdcdTAwMDAnOwotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb3NpdGlvbiB7Ci0gICAgICAgIGludCBzdGFydDsgLy9pbmNsdXNpdmUKLQotICAgICAgICBpbnQgZW5kOyAvL2V4Y2x1c2l2ZQotCi0gICAgICAgIHB1YmxpYyBQb3NpdGlvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIHRoaXMuZW5kID0gZW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTdGFydCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RW5kKCkgewotICAgICAgICAgICAgcmV0dXJuIGVuZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmluZ01hdGNoZXIgY29uc3RydWN0b3IgdGFrZXMgaW4gYSBTdHJpbmcgb2JqZWN0IHRoYXQgaXMgYSBzaW1wbGUgCi0gICAgICogcGF0dGVybiB3aGljaCBtYXkgY29udGFpbiAmIzM5KiYjMzkgZm9yIDAgYW5kIG1hbnkgY2hhcmFjdGVycyBhbmQKLSAgICAgKiAmIzM5OyYjNjM7JiMzOTsgZm9yIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4gIAotICAgICAqCi0gICAgICogTGl0ZXJhbCAmIzM5OyomIzM5OyBhbmQgJiMzOTsqJiMzOTsgY2hhcmFjdGVycyBtdXN0IGJlIGVzY2FwZWQgaW4gdGhlIHBhdHRlcm4gCi0gICAgICogZS5nLiAmcXVvdDsmIzkyOyomcXVvdDsgbWVhbnMgbGl0ZXJhbCAmcXVvdDsqJnF1b3Q7LCBldGMuCi0gICAgICoKLSAgICAgKiBFc2NhcGluZyBhbnkgb3RoZXIgY2hhcmFjdGVyIChpbmNsdWRpbmcgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgaXRzZWxmKSwgCi0gICAgICoganVzdCByZXN1bHRzIGluIHRoYXQgY2hhcmFjdGVyIGluIHRoZSBwYXR0ZXJuLgotICAgICAqIGUuZy4gJnF1b3Q7JiM5MjthJnF1b3Q7IG1lYW5zICZxdW90O2EmcXVvdDsgYW5kICZxdW90OyYjOTI7JiM5MjsmcXVvdDsgbWVhbnMgJnF1b3Q7JiM5MjsmcXVvdDsKLSAgICAgKgotICAgICAqIElmIGludm9raW5nIHRoZSBTdHJpbmdNYXRjaGVyIHdpdGggc3RyaW5nIGxpdGVyYWxzIGluIEphdmEsIGRvbid0IGZvcmdldAotICAgICAqIGVzY2FwZSBjaGFyYWN0ZXJzIGFyZSByZXByZXNlbnRlZCBieSAmcXVvdDsmIzkyOyYjOTI7JnF1b3Q7LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4gdG8gbWF0Y2ggdGV4dCBhZ2FpbnN0Ci0gICAgICogQHBhcmFtIGlnbm9yZUNhc2UgaWYgdHJ1ZSwgY2FzZSBpcyBpZ25vcmVkCi0gICAgICogQHBhcmFtIGlnbm9yZVdpbGRDYXJkcyBpZiB0cnVlLCB3aWxkIGNhcmRzIGFuZCB0aGVpciBlc2NhcGUgc2VxdWVuY2VzIGFyZSBpZ25vcmVkCi0gICAgICogCQkgIChldmVyeXRoaW5nIGlzIHRha2VuIGxpdGVyYWxseSkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ01hdGNoZXIoU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gaWdub3JlQ2FzZSwKLSAgICAgICAgICAgIGJvb2xlYW4gaWdub3JlV2lsZENhcmRzKSB7Ci0gICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIGZJZ25vcmVDYXNlID0gaWdub3JlQ2FzZTsKLSAgICAgICAgZklnbm9yZVdpbGRDYXJkcyA9IGlnbm9yZVdpbGRDYXJkczsKLSAgICAgICAgZlBhdHRlcm4gPSBwYXR0ZXJuOwotICAgICAgICBmTGVuZ3RoID0gcGF0dGVybi5sZW5ndGgoKTsKLQotICAgICAgICBpZiAoZklnbm9yZVdpbGRDYXJkcykgewotICAgICAgICAgICAgcGFyc2VOb1dpbGRDYXJkcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyc2VXaWxkQ2FyZHMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHBhdHRlcm4gYmV0d2VlbiA8Y29kZT5zdGFydDwvY29kZSkoaW5jbHVzaXZlKSAKLSAgICAgKiBhbmQgPGNvZGU+ZW5kPC9jb2RlPihleGNsdXNpdmUpLiAgCi0gICAgICogQHBhcmFtIHRleHQgIHRoZSBTdHJpbmcgb2JqZWN0IHRvIHNlYXJjaCBpbiAKLSAgICAgKiBAcGFyYW0gc3RhcnQgIHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgc2VhcmNoIHJhbmdlLCBpbmNsdXNpdmUKLSAgICAgKiBAcGFyYW0gZW5kICB0aGUgZW5kaW5nIGluZGV4IG9mIHRoZSBzZWFyY2ggcmFuZ2UsIGV4Y2x1c2l2ZQotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+U3RyaW5nTWF0Y2hlci5Qb3NpdGlvbjwvY29kZT4gb2JqZWN0IHRoYXQga2VlcHMgdGhlIHN0YXJ0aW5nIAotICAgICAqIChpbmNsdXNpdmUpIGFuZCBlbmRpbmcgcG9zaXRpb25zIChleGNsdXNpdmUpIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSAKLSAgICAgKiBwYXR0ZXJuIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhlIHRleHQ7IHJldHVybiBudWxsIGlmIG5vdCBmb3VuZCBvciBzdWJ0ZXh0Ci0gICAgICogaXMgZW1wdHkgKHN0YXJ0PT1lbmQpLiBBIHBhaXIgb2YgemVyb3MgaXMgcmV0dXJuZWQgaWYgcGF0dGVybiBpcyBlbXB0eSBzdHJpbmcKLSAgICAgKiBOb3RlIHRoYXQgZm9yIHBhdHRlcm4gbGlrZSAmcXVvdDsqYWJjKiZxdW90OyB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHN0YXJzLCBwb3NpdGlvbiBvZiAmcXVvdDthYmMmcXVvdDsKLSAgICAgKiBpcyByZXR1cm5lZC4gRm9yIGEgcGF0dGVybiBsaWtlJnF1b3Q7KiYjNjM7JiM2MzsqJnF1b3Q7IGluIHRleHQgJnF1b3Q7YWJjZGYmcXVvdDssICgxLDMpIGlzIHJldHVybmVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ01hdGNoZXIuUG9zaXRpb24gZmluZChTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgaW50IHRsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICBpZiAoc3RhcnQgPCAwKQotICAgICAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICBpZiAoZW5kID4gdGxlbikKLSAgICAgICAgICAgIGVuZCA9IHRsZW47Ci0gICAgICAgIGlmIChlbmQgPCAwIHx8IHN0YXJ0ID49IGVuZCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpZiAoZkxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbihzdGFydCwgc3RhcnQpOwotICAgICAgICBpZiAoZklnbm9yZVdpbGRDYXJkcykgewotICAgICAgICAgICAgaW50IHggPSBwb3NJbih0ZXh0LCBzdGFydCwgZW5kKTsKLSAgICAgICAgICAgIGlmICh4IDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24oeCwgeCArIGZMZW5ndGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHNlZ0NvdW50ID0gZlNlZ21lbnRzLmxlbmd0aDsKLSAgICAgICAgaWYgKHNlZ0NvdW50ID09IDApLy9wYXR0ZXJuIGNvbnRhaW5zIG9ubHkgJyonKHMpCi0gICAgICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHN0YXJ0LCBlbmQpOwotCi0gICAgICAgIGludCBjdXJQb3MgPSBzdGFydDsKLSAgICAgICAgaW50IG1hdGNoU3RhcnQgPSAtMTsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudCAmJiBjdXJQb3MgPCBlbmQ7ICsraSkgewotICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBmU2VnbWVudHNbaV07Ci0gICAgICAgICAgICBpbnQgbmV4dE1hdGNoID0gcmVnRXhwUG9zSW4odGV4dCwgY3VyUG9zLCBlbmQsIGN1cnJlbnQpOwotICAgICAgICAgICAgaWYgKG5leHRNYXRjaCA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQgPSBuZXh0TWF0Y2g7Ci0gICAgICAgICAgICBjdXJQb3MgPSBuZXh0TWF0Y2ggKyBjdXJyZW50Lmxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpIDwgc2VnQ291bnQpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbihtYXRjaFN0YXJ0LCBjdXJQb3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG1hdGNoIHRoZSBnaXZlbiA8Y29kZT50ZXh0PC9jb2RlPiB3aXRoIHRoZSBwYXR0ZXJuIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBtYXRjaGVkIGVpdGhlcndpc2UgZmFsc2UKLSAgICAgKiBAcGFyYW0gdGV4dCAgYSBTdHJpbmcgb2JqZWN0IAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiBtYXRjaCh0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiB0aGUgc3RhcnRpbmcgKGluY2x1c2l2ZSkgYW5kIHRoZSBlbmRpbmcgKGV4Y2x1c2l2ZSkgcG9zaXRpb25zIGluIHRoZSAgIAotICAgICAqIDxjb2RlPnRleHQ8L2NvZGU+LCBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHN1YnN0cmluZyBtYXRjaGVzIHdpdGggYVBhdHRlcm4gIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhlIHRleHQgbWF0Y2hlcyB0aGUgcGF0dGVybgotICAgICAqIEBwYXJhbSB0ZXh0ICBhIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHN1YnN0cmluZyB0byBtYXRjaCAKLSAgICAgKiBAcGFyYW0gc3RhcnQgIG1hcmtzIHRoZSBzdGFydGluZyBwb3NpdGlvbiAoaW5jbHVzaXZlKSBvZiB0aGUgc3Vic3RyaW5nCi0gICAgICogQHBhcmFtIGVuZCAgbWFya3MgdGhlIGVuZGluZyBpbmRleCAoZXhjbHVzaXZlKSBvZiB0aGUgc3Vic3RyaW5nIAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gdGV4dCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICBpZiAoc3RhcnQgPiBlbmQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGZJZ25vcmVXaWxkQ2FyZHMpCi0gICAgICAgICAgICByZXR1cm4gKGVuZCAtIHN0YXJ0ID09IGZMZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICYmIGZQYXR0ZXJuLnJlZ2lvbk1hdGNoZXMoZklnbm9yZUNhc2UsIDAsIHRleHQsIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZMZW5ndGgpOwotICAgICAgICBpbnQgc2VnQ291bnQgPSBmU2VnbWVudHMubGVuZ3RoOwotICAgICAgICBpZiAoc2VnQ291bnQgPT0gMCAmJiAoZkhhc0xlYWRpbmdTdGFyIHx8IGZIYXNUcmFpbGluZ1N0YXIpKSAvLyBwYXR0ZXJuIGNvbnRhaW5zIG9ubHkgJyonKHMpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkKLSAgICAgICAgICAgIHJldHVybiBmTGVuZ3RoID09IDA7Ci0gICAgICAgIGlmIChmTGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gc3RhcnQgPT0gZW5kOwotCi0gICAgICAgIGludCB0bGVuID0gdGV4dC5sZW5ndGgoKTsKLSAgICAgICAgaWYgKHN0YXJ0IDwgMCkKLSAgICAgICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgICAgaWYgKGVuZCA+IHRsZW4pCi0gICAgICAgICAgICBlbmQgPSB0bGVuOwotCi0gICAgICAgIGludCB0Q3VyUG9zID0gc3RhcnQ7Ci0gICAgICAgIGludCBib3VuZCA9IGVuZCAtIGZCb3VuZDsKLSAgICAgICAgaWYgKGJvdW5kIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBTdHJpbmcgY3VycmVudCA9IGZTZWdtZW50c1tpXTsKLSAgICAgICAgaW50IHNlZ0xlbmd0aCA9IGN1cnJlbnQubGVuZ3RoKCk7Ci0KLSAgICAgICAgLyogcHJvY2VzcyBmaXJzdCBzZWdtZW50ICovCi0gICAgICAgIGlmICghZkhhc0xlYWRpbmdTdGFyKSB7Ci0gICAgICAgICAgICBpZiAoIXJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgc3RhcnQsIGN1cnJlbnQsIDAsIHNlZ0xlbmd0aCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgICAgICB0Q3VyUG9zID0gdEN1clBvcyArIHNlZ0xlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGZTZWdtZW50cy5sZW5ndGggPT0gMSkgJiYgKCFmSGFzTGVhZGluZ1N0YXIpCi0gICAgICAgICAgICAgICAgJiYgKCFmSGFzVHJhaWxpbmdTdGFyKSkgewotICAgICAgICAgICAgLy8gb25seSBvbmUgc2VnbWVudCB0byBtYXRjaCwgbm8gd2lsZGNhcmRzIHNwZWNpZmllZAotICAgICAgICAgICAgcmV0dXJuIHRDdXJQb3MgPT0gZW5kOwotICAgICAgICB9Ci0gICAgICAgIC8qIHByb2Nlc3MgbWlkZGxlIHNlZ21lbnRzICovCi0gICAgICAgIHdoaWxlIChpIDwgc2VnQ291bnQpIHsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBmU2VnbWVudHNbaV07Ci0gICAgICAgICAgICBpbnQgY3VycmVudE1hdGNoOwotICAgICAgICAgICAgaW50IGsgPSBjdXJyZW50LmluZGV4T2YoZlNpbmdsZVdpbGRDYXJkKTsKLSAgICAgICAgICAgIGlmIChrIDwgMCkgewotICAgICAgICAgICAgICAgIGN1cnJlbnRNYXRjaCA9IHRleHRQb3NJbih0ZXh0LCB0Q3VyUG9zLCBlbmQsIGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TWF0Y2ggPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGN1cnJlbnRNYXRjaCA9IHJlZ0V4cFBvc0luKHRleHQsIHRDdXJQb3MsIGVuZCwgY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRNYXRjaCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRDdXJQb3MgPSBjdXJyZW50TWF0Y2ggKyBjdXJyZW50Lmxlbmd0aCgpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcHJvY2VzcyBmaW5hbCBzZWdtZW50ICovCi0gICAgICAgIGlmICghZkhhc1RyYWlsaW5nU3RhciAmJiB0Q3VyUG9zICE9IGVuZCkgewotICAgICAgICAgICAgaW50IGNsZW4gPSBjdXJyZW50Lmxlbmd0aCgpOwotICAgICAgICAgICAgcmV0dXJuIHJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgZW5kIC0gY2xlbiwgY3VycmVudCwgMCwgY2xlbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGkgPT0gc2VnQ291bnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBnaXZlbiBwYXR0ZXJuIGludG8gc2VnbWVudHMgc2VwZXJhdGVkIGJ5IHdpbGRjYXJkICcqJyBjaGFyYWN0ZXJzLgotICAgICAqIFNpbmNlIHdpbGRjYXJkcyBhcmUgbm90IGJlaW5nIHVzZWQgaW4gdGhpcyBjYXNlLCB0aGUgcGF0dGVybiBjb25zaXN0cyBvZiBhIHNpbmdsZSBzZWdtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwYXJzZU5vV2lsZENhcmRzKCkgewotICAgICAgICBmU2VnbWVudHMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgICBmU2VnbWVudHNbMF0gPSBmUGF0dGVybjsKLSAgICAgICAgZkJvdW5kID0gZkxlbmd0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHBhdHRlcm4gaW50byBzZWdtZW50cyBzZXBlcmF0ZWQgYnkgd2lsZGNhcmQgJiMzOTsqJiMzOTsgY2hhcmFjdGVycy4KLSAgICAgKiBAcGFyYW0gcCwgYSBTdHJpbmcgb2JqZWN0IHRoYXQgaXMgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHdpdGggPyo/IGFuZC9vciAmIzM5OyYjNjM7JiMzOTsKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VXaWxkQ2FyZHMoKSB7Ci0gICAgICAgIGlmIChmUGF0dGVybi5zdGFydHNXaXRoKCIqIikpLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgZkhhc0xlYWRpbmdTdGFyID0gdHJ1ZTsKLSAgICAgICAgaWYgKGZQYXR0ZXJuLmVuZHNXaXRoKCIqIikpIHsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAvKiBtYWtlIHN1cmUgaXQncyBub3QgYW4gZXNjYXBlZCB3aWxkY2FyZCAqLwotICAgICAgICAgICAgaWYgKGZMZW5ndGggPiAxICYmIGZQYXR0ZXJuLmNoYXJBdChmTGVuZ3RoIC0gMikgIT0gJ1xcJykgewotICAgICAgICAgICAgICAgIGZIYXNUcmFpbGluZ1N0YXIgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgVmVjdG9yIHRlbXAgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAgICAgaW50IHBvcyA9IDA7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHdoaWxlIChwb3MgPCBmTGVuZ3RoKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBmUGF0dGVybi5jaGFyQXQocG9zKyspOwotICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBmTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0ID0gZlBhdHRlcm4uY2hhckF0KHBvcysrKTsKLSAgICAgICAgICAgICAgICAgICAgLyogaWYgaXQncyBhbiBlc2NhcGUgc2VxdWVuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gJyonIHx8IG5leHQgPT0gJz8nIHx8IG5leHQgPT0gJ1xcJykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChuZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBhbiBlc2NhcGUgc2VxdWVuY2UsIGp1c3QgaW5zZXJ0IGxpdGVyYWxseSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobmV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICcqJzoKLSAgICAgICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvKiBuZXcgc2VnbWVudCAqLwotICAgICAgICAgICAgICAgICAgICB0ZW1wLmFkZEVsZW1lbnQoYnVmLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBmQm91bmQgKz0gYnVmLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBidWYuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgICAgICAgIC8qIGFwcGVuZCBzcGVjaWFsIGNoYXJhY3RlciByZXByZXNlbnRpbmcgc2luZ2xlIG1hdGNoIHdpbGRjYXJkICovCi0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChmU2luZ2xlV2lsZENhcmQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogYWRkIGxhc3QgYnVmZmVyIHRvIHNlZ21lbnQgbGlzdCAqLwotICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgdGVtcC5hZGRFbGVtZW50KGJ1Zi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGZCb3VuZCArPSBidWYubGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmU2VnbWVudHMgPSBuZXcgU3RyaW5nW3RlbXAuc2l6ZSgpXTsKLSAgICAgICAgdGVtcC5jb3B5SW50byhmU2VnbWVudHMpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBAcGFyYW0gdGV4dCAgYSBzdHJpbmcgd2hpY2ggY29udGFpbnMgbm8gd2lsZGNhcmQKLSAgICAgKiBAcGFyYW0gc3RhcnQgIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBmb3Igc2VhcmNoLCBpbmNsdXNpdmUKLSAgICAgKiBAcGFyYW0gZW5kICB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBvZiB0aGUgcGF0dGVybiAsIG9yIC0xIGlmIG5vdCBmb3VuZCAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IHBvc0luKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsvL25vIHdpbGQgY2FyZCBpbiBwYXR0ZXJuCi0gICAgICAgIGludCBtYXggPSBlbmQgLSBmTGVuZ3RoOwotCi0gICAgICAgIGlmICghZklnbm9yZUNhc2UpIHsKLSAgICAgICAgICAgIGludCBpID0gdGV4dC5pbmRleE9mKGZQYXR0ZXJuLCBzdGFydCk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAtMSB8fCBpID4gbWF4KQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IG1heDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAodGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIGksIGZQYXR0ZXJuLCAwLCBmTGVuZ3RoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQHBhcmFtIHRleHQgIGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1heSBvbmx5IGNvbnRhaW4gJyYjNjM7JyhzKQotICAgICAqIEBwYXJhbSBzdGFydCAgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IGZvciBzZWFyY2gsIGluY2x1c2l2ZQotICAgICAqIEBwYXJhbSBlbmQgIHRoZSBzdG9wcGluZyBwb2ludCBvZiBzZWFyY2gsIGV4Y2x1c2l2ZQotICAgICAqIEBwYXJhbSBwICBhIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXkgY29udGFpbnMgJyYjNjM7JwotICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYgbm90IGZvdW5kIAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgcmVnRXhwUG9zSW4oU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIHApIHsKLSAgICAgICAgaW50IHBsZW4gPSBwLmxlbmd0aCgpOwotCi0gICAgICAgIGludCBtYXggPSBlbmQgLSBwbGVuOwotICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gbWF4OyArK2kpIHsKLSAgICAgICAgICAgIGlmIChyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGksIHAsIDAsIHBsZW4pKQotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKiBAcGFyYW0gIHRleHQgIGEgU3RyaW5nIHRvIG1hdGNoCi0gICAgICogQHBhcmFtIHRTdGFydCAgaW50IHRoYXQgaW5kaWNhdGVzIHRoZSBzdGFydGluZyBpbmRleCBvZiBtYXRjaCwgaW5jbHVzaXZlCi0gICAgICogQHBhcmFtIHAgIFN0cmluZywgIFN0cmluZywgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IGNvbnRhaW4gJyYjNjM7JwotICAgICAqIEBwYXJhbSBwU3RhcnQKLSAgICAgKiBAcGFyYW0gcGxlbiAJCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVnRXhwUmVnaW9uTWF0Y2hlcyhTdHJpbmcgdGV4dCwgaW50IHRTdGFydCwgU3RyaW5nIHAsCi0gICAgICAgICAgICBpbnQgcFN0YXJ0LCBpbnQgcGxlbikgewotICAgICAgICB3aGlsZSAocGxlbi0tID4gMCkgewotICAgICAgICAgICAgY2hhciB0Y2hhciA9IHRleHQuY2hhckF0KHRTdGFydCsrKTsKLSAgICAgICAgICAgIGNoYXIgcGNoYXIgPSBwLmNoYXJBdChwU3RhcnQrKyk7Ci0KLSAgICAgICAgICAgIC8qIHByb2Nlc3Mgd2lsZCBjYXJkcyAqLwotICAgICAgICAgICAgaWYgKCFmSWdub3JlV2lsZENhcmRzKSB7Ci0gICAgICAgICAgICAgICAgLyogc2tpcCBzaW5nbGUgd2lsZCBjYXJkcyAqLwotICAgICAgICAgICAgICAgIGlmIChwY2hhciA9PSBmU2luZ2xlV2lsZENhcmQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBjaGFyID09IHRjaGFyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGZJZ25vcmVDYXNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b1VwcGVyQ2FzZSh0Y2hhcikgPT0gQ2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAudG9VcHBlckNhc2UocGNoYXIpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAvLyBjb21wYXJpbmcgYWZ0ZXIgY29udmVydGluZyB0byB1cHBlciBjYXNlIGRvZXNuJ3QgaGFuZGxlIGFsbCBjYXNlczsKLSAgICAgICAgICAgICAgICAvLyBhbHNvIGNvbXBhcmUgYWZ0ZXIgY29udmVydGluZyB0byBsb3dlciBjYXNlCi0gICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh0Y2hhcikgPT0gQ2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UocGNoYXIpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQHBhcmFtIHRleHQgIHRoZSBzdHJpbmcgdG8gbWF0Y2gKLSAgICAgKiBAcGFyYW0gc3RhcnQgIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBmb3Igc2VhcmNoLCBpbmNsdXNpdmUKLSAgICAgKiBAcGFyYW0gZW5kICB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKLSAgICAgKiBAcGFyYW0gcCAgYSBzdHJpbmcgdGhhdCBoYXMgbm8gd2lsZGNhcmQKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBvZiB0aGUgcGF0dGVybiAsIG9yIC0xIGlmIG5vdCBmb3VuZCAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IHRleHRQb3NJbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgcCkgewotCi0gICAgICAgIGludCBwbGVuID0gcC5sZW5ndGgoKTsKLSAgICAgICAgaW50IG1heCA9IGVuZCAtIHBsZW47Ci0KLSAgICAgICAgaWYgKCFmSWdub3JlQ2FzZSkgewotICAgICAgICAgICAgaW50IGkgPSB0ZXh0LmluZGV4T2YocCwgc3RhcnQpOwotICAgICAgICAgICAgaWYgKGkgPT0gLTEgfHwgaSA+IG1heCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBtYXg7ICsraSkgewotICAgICAgICAgICAgaWYgKHRleHQucmVnaW9uTWF0Y2hlcyh0cnVlLCBpLCBwLCAwLCBwbGVuKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL1RpcHNBbmRUcmlja3NBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvVGlwc0FuZFRyaWNrc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdhMDg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvVGlwc0FuZFRyaWNrc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuUGFydEV2ZW50QWN0aW9uOwotCi0vKioKLSAqIExhdW5jaCB0aGUgdGlwcyBhbmQgdHJpY2tzIGFjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRpcHNBbmRUcmlja3NBY3Rpb24gZXh0ZW5kcyBQYXJ0RXZlbnRBY3Rpb24gaW1wbGVtZW50cwotICAgICAgICBBY3Rpb25GYWN0b3J5LklXb3JrYmVuY2hBY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogVGhlIHdvcmtiZW5jaCB3aW5kb3cgdGhpcyBhY3Rpb24gaXMgcmVnaXN0ZXJlZCB3aXRoLgotICAgICAqLwotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3c7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2luZG93IHRoZSB3aW5kb3cKLSAgICAgKi8KLSAgICBwdWJsaWMgVGlwc0FuZFRyaWNrc0FjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICBzdXBlcihJREVXb3JrYmVuY2hNZXNzYWdlcy5UaXBzQW5kVHJpY2tzX3RleHQpOwotICAgICAgICBpZiAod2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLndvcmtiZW5jaFdpbmRvdyA9IHdpbmRvdzsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuVGlwc0FuZFRyaWNrc190b29sVGlwKTsKLSAgICAgICAgd2luZG93LmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJSUlERUhlbHBDb250ZXh0SWRzLlRJUFNfQU5EX1RSSUNLU19BQ1RJT04pOwotICAgICAgICBzZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLnVpLmhlbHAudGlwc0FuZFRyaWNrc0FjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHdvcmtiZW5jaFdpbmRvdy5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBhY3Rpb24gaGFzIGJlZW4gZGlzcG9zZWQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBBc2sgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZmVhdHVyZQotICAgICAgICBBYm91dEluZm9bXSBmZWF0dXJlSW5mb3MgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldEZlYXR1cmVJbmZvcygpOwotICAgICAgICBBcnJheUxpc3QgdGlwc0FuZFRyaWNrc0ZlYXR1cmVzID0gbmV3IEFycmF5TGlzdChmZWF0dXJlSW5mb3MubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlSW5mb3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmZWF0dXJlSW5mb3NbaV0uZ2V0VGlwc0FuZFRyaWNrc0hyZWYoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRpcHNBbmRUcmlja3NGZWF0dXJlcy5hZGQoZmVhdHVyZUluZm9zW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNoZWxsIHNoZWxsID0gd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0KLSAgICAgICAgaWYgKHRpcHNBbmRUcmlja3NGZWF0dXJlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIElERVdvcmtiZW5jaE1lc3NhZ2VzLlRpcHNBbmRUcmlja3NNZXNzYWdlRGlhbG9nX3RpdGxlLAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5UaXBzQW5kVHJpY2tzTWVzc2FnZURpYWxvZ19tZXNzYWdlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEFib3V0SW5mb1tdIGZlYXR1cmVzID0gbmV3IEFib3V0SW5mb1t0aXBzQW5kVHJpY2tzRmVhdHVyZXMuc2l6ZSgpXTsKLSAgICAgICAgdGlwc0FuZFRyaWNrc0ZlYXR1cmVzLnRvQXJyYXkoZmVhdHVyZXMpOwotCi0gICAgICAgIElQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0gICAgICAgIEZlYXR1cmVTZWxlY3Rpb25EaWFsb2cgZCA9IG5ldyBGZWF0dXJlU2VsZWN0aW9uRGlhbG9nKHNoZWxsLCBmZWF0dXJlcywKLSAgICAgICAgICAgICAgICBwcm9kdWN0ID09IG51bGwgPyBudWxsIDogcHJvZHVjdC5nZXRJZCgpLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5UaXBzQW5kVHJpY2tzUGFnZVNlbGVjdGlvbkRpYWxvZ190aXRsZSwKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5UaXBzQW5kVHJpY2tzUGFnZVNlbGVjdGlvbkRpYWxvZ19tZXNzYWdlLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5USVBTX0FORF9UUklDS1NfUEFHRV9TRUxFQ1RJT05fRElBTE9HKTsKLQotICAgICAgICBpZiAoZC5vcGVuKCkgIT0gV2luZG93Lk9LIHx8IGQuZ2V0UmVzdWx0KCkubGVuZ3RoICE9IDEpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQWJvdXRJbmZvIGZlYXR1cmUgPSAoQWJvdXRJbmZvKSBkLmdldFJlc3VsdCgpWzBdOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBPcGVuIHRoZSB0aXBzIGFuZCB0cmljayBoZWxwIHRvcGljCi0gICAgICAgICAqLwotICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgaHJlZiA9IGZlYXR1cmUuZ2V0VGlwc0FuZFRyaWNrc0hyZWYoKTsKLSAgICAgICAgICAgIGlmIChocmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShzaGVsbC5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgd29ya2JlbmNoV2luZG93LmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkJCQkuZGlzcGxheUhlbHBSZXNvdXJjZShocmVmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuVGlwc0FuZFRyaWNrc0Vycm9yRGlhbG9nX25vSHJlZiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5UaXBzQW5kVHJpY2tzRXJyb3JEaWFsb2dfdGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5UaXBzQW5kVHJpY2tzRXJyb3JEaWFsb2dfbm9IcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIElTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwgMSwgSURFV29ya2JlbmNoTWVzc2FnZXMuVGlwc0FuZFRyaWNrc0Vycm9yRGlhbG9nX25vSHJlZiwgbnVsbCk7Ci0gICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIElERVdvcmtiZW5jaE1lc3NhZ2VzLlRpcHNBbmRUcmlja3NFcnJvckRpYWxvZ190aXRsZSwKLSAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuVGlwc0FuZFRyaWNrc0Vycm9yRGlhbG9nX25vRmVhdHVyZXMsIAotICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBY3Rpb25GYWN0b3J5LklXb3JrYmVuY2hBY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBhY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHdvcmtiZW5jaFdpbmRvdy5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgd29ya2JlbmNoV2luZG93ID0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL1dvcmtiZW5jaEFjdGlvbkJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvV29ya2JlbmNoQWN0aW9uQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTVkY2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvV29ya2JlbmNoQWN0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CdWlsZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkNvbnRyaWJ1dGlvbkl0ZW1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuTmV3V2l6YXJkTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3RvcnkuSVdvcmtiZW5jaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREVBY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JSURFQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuYWN0aW9ucy5CdWlsZFNldE1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmFjdGlvbnMuQnVpbGRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmFjdGlvbnMuUXVpY2tNZW51QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5hY3Rpb25zLlJldGFyZ2V0QWN0aW9uV2l0aERlZmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudXRpbC5TdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbTsKLQotLyoqCi0gKiBBZGRzIGFjdGlvbnMgdG8gYSB3b3JrYmVuY2ggd2luZG93LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV29ya2JlbmNoQWN0aW9uQnVpbGRlciBleHRlbmRzIEFjdGlvbkJhckFkdmlzb3IgewotICAgIHByaXZhdGUgZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLSAgICAvLyBnZW5lcmljIGFjdGlvbnMKLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gY2xvc2VBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gY2xvc2VBbGxBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gY2xvc2VBbGxTYXZlZEFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBzYXZlQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIHNhdmVBbGxBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gbmV3V2luZG93QWN0aW9uOwotICAgIAotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBuZXdFZGl0b3JBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gaGVscENvbnRlbnRzQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIGhlbHBTZWFyY2hBY3Rpb247Ci0JCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIGR5bmFtaWNIZWxwQWN0aW9uOwotICAgIAotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBhYm91dEFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBvcGVuUHJlZmVyZW5jZXNBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gc2F2ZUFzQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIGhpZGVTaG93RWRpdG9yQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIHNhdmVQZXJzcGVjdGl2ZUFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiByZXNldFBlcnNwZWN0aXZlQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIGVkaXRBY3Rpb25TZXRBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gY2xvc2VQZXJzcEFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBsb2NrVG9vbEJhckFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBjbG9zZUFsbFBlcnNwc0FjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBzaG93Vmlld01lbnVBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gc2hvd1BhcnRQYW5lTWVudUFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBuZXh0UGFydEFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBwcmV2UGFydEFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBuZXh0RWRpdG9yQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIHByZXZFZGl0b3JBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gbmV4dFBlcnNwZWN0aXZlQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIHByZXZQZXJzcGVjdGl2ZUFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBhY3RpdmF0ZUVkaXRvckFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBtYXhpbWl6ZVBhcnRBY3Rpb247Ci0gICAgCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIG1pbmltaXplUGFydEFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBzd2l0Y2hUb0VkaXRvckFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBvcGVuRWRpdG9yRHJvcERvd25BY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gYmFja3dhcmRIaXN0b3J5QWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIGZvcndhcmRIaXN0b3J5QWN0aW9uOwotCi0gICAgLy8gZ2VuZXJpYyByZXRhcmdldCBhY3Rpb25zCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIHVuZG9BY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gcmVkb0FjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBjdXRBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gY29weUFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBwYXN0ZUFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBkZWxldGVBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gc2VsZWN0QWxsQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIGZpbmRBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gcHJpbnRBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gcmV2ZXJ0QWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIHJlZnJlc2hBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gcHJvcGVydGllc0FjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBxdWl0QWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIG1vdmVBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gcmVuYW1lQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIGdvSW50b0FjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBiYWNrQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIGZvcndhcmRBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gdXBBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gbmV4dEFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBwcmV2aW91c0FjdGlvbjsKLQotICAgIC8vIElERS1zcGVjaWZpYyBhY3Rpb25zCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIG9wZW5Xb3Jrc3BhY2VBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gcHJvamVjdFByb3BlcnR5RGlhbG9nQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIG5ld1dpemFyZEFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBuZXdXaXphcmREcm9wRG93bkFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiBpbXBvcnRSZXNvdXJjZXNBY3Rpb247Ci0gICAgCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIGV4cG9ydFJlc291cmNlc0FjdGlvbjsKLQotICAgIElXb3JrYmVuY2hBY3Rpb24gYnVpbGRBbGxBY3Rpb247IC8vIEluY3JlbWVudGFsIHdvcmtzcGFjZSBidWlsZAotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIGNsZWFuQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIHRvZ2dsZUF1dG9CdWlsZEFjdGlvbjsKLQotICAgIE1lbnVNYW5hZ2VyIGJ1aWxkV29ya2luZ1NldE1lbnU7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gcXVpY2tTdGFydEFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFjdGlvbiB0aXBzQW5kVHJpY2tzQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBRdWlja01lbnVBY3Rpb24gc2hvd0luUXVpY2tNZW51OwotCi0gICAgcHJpdmF0ZSBRdWlja01lbnVBY3Rpb24gbmV3UXVpY2tNZW51OwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIGludHJvQWN0aW9uOwotCi0gICAgLy8gSURFLXNwZWNpZmljIHJldGFyZ2V0IGFjdGlvbnMKLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gYWRkQm9va21hcmtBY3Rpb247Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hBY3Rpb24gYWRkVGFza0FjdGlvbjsKLQotICAgIElXb3JrYmVuY2hBY3Rpb24gYnVpbGRQcm9qZWN0QWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIG9wZW5Qcm9qZWN0QWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQWN0aW9uIGNsb3NlUHJvamVjdEFjdGlvbjsKLQotICAgIC8vIGNvbnRyaWJ1dGlvbiBpdGVtcwotICAgIC8vIEBpc3N1ZSBzaG91bGQgb2J0YWluIGZyb20gQ29udHJpYnV0aW9uSXRlbUZhY3RvcnkKLSAgICBwcml2YXRlIE5ld1dpemFyZE1lbnUgbmV3V2l6YXJkTWVudTsKLQotICAgIHByaXZhdGUgSUNvbnRyaWJ1dGlvbkl0ZW0gcGluRWRpdG9yQ29udHJpYnV0aW9uSXRlbTsKLQotLy8gICAgcHJpdmF0ZSBJQ29udHJpYnV0aW9uSXRlbSBzZWFyY2hDb21ib0l0ZW07Ci0gICAgCi0gICAgLy8gQGlzc3VlIGNsYXNzIGlzIHdvcmtiZW5jaCBpbnRlcm5hbAotICAgIHByaXZhdGUgU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0gc3RhdHVzTGluZUl0ZW07Ci0KLSAgICBwcml2YXRlIFByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByZWZMaXN0ZW5lcjsKLQotICAgIC8vIGxpc3RlbmVyIGZvciB0aGUgImNsb3NlIGVkaXRvcnMgYXV0b21hdGljYWxseSIKLSAgICAvLyBwcmVmZXJlbmNlIGNoYW5nZQotICAgIHByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcFByZWZMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgSVBhZ2VMaXN0ZW5lciBwYWdlTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlTGlzdGVuZXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIGlmIHRoZSBhY3Rpb24gYnVpbGRlciBoYXMgYmVlbiBkaXNwb3NlZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0Rpc3Bvc2VkID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBhY3Rpb24gYnVpbGRlciB3aGljaCBjb250cmlidXRlcyBhY3Rpb25zCi0gICAgICogdG8gdGhlIGdpdmVuIHdpbmRvdy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uZmlndXJlciB0aGUgYWN0aW9uIGJhciBjb25maWd1cmVyIGZvciB0aGUgd2luZG93Ci0gICAgICovCi0gICAgcHVibGljIFdvcmtiZW5jaEFjdGlvbkJ1aWxkZXIoSUFjdGlvbkJhckNvbmZpZ3VyZXIgY29uZmlndXJlcikgewotICAgICAgICBzdXBlcihjb25maWd1cmVyKTsKLSAgICAgICAgd2luZG93ID0gY29uZmlndXJlci5nZXRXaW5kb3dDb25maWd1cmVyKCkuZ2V0V2luZG93KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd2luZG93IHRvIHdoaWNoIHRoaXMgYWN0aW9uIGJ1aWxkZXIgaXMgY29udHJpYnV0aW5nLgotICAgICAqLwotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyBnZXRXaW5kb3coKSB7Ci0gICAgICAgIHJldHVybiB3aW5kb3c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSG9va3MgbGlzdGVuZXJzIG9uIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFuZCB0aGUgd2luZG93J3MgcGFnZSwgcGVyc3BlY3RpdmUgYW5kIHNlbGVjdGlvbiBzZXJ2aWNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaG9va0xpc3RlbmVycygpIHsKLQotICAgICAgICBwYWdlTGlzdGVuZXIgPSBuZXcgSVBhZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhZ2VBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcGFnZUNsb3NlZChJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwYWdlT3BlbmVkKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCBidWlsZCBoYW5kbGVyIC0tIGNhbid0IGJlIGRvbmUgdW50aWwgdGhlIHNoZWxsIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgIElBY3Rpb24gYnVpbGRIYW5kbGVyID0gbmV3IEJ1aWxkQWN0aW9uKHBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCk7Ci0gICAgICAgICAgICAJKChSZXRhcmdldEFjdGlvbldpdGhEZWZhdWx0KWJ1aWxkUHJvamVjdEFjdGlvbikuc2V0RGVmYXVsdEhhbmRsZXIoYnVpbGRIYW5kbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgZ2V0V2luZG93KCkuYWRkUGFnZUxpc3RlbmVyKHBhZ2VMaXN0ZW5lcik7Ci0KLSAgICAgICAgcHJlZkxpc3RlbmVyID0gbmV3IFByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5QUkVGX0FVVE9fQlVJTERJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgCXVwZGF0ZUJ1aWxkQWN0aW9ucyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKQotICAgICAgICAgICAgICAgIC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZMaXN0ZW5lcik7Ci0KLSAgICAgICAgLy8gbGlzdGVuZXIgZm9yIHRoZSAiY2xvc2UgZWRpdG9ycyBhdXRvbWF0aWNhbGx5IgotICAgICAgICAvLyBwcmVmZXJlbmNlIGNoYW5nZQotICAgICAgICBwcm9wUHJlZkxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgIElQcmVmZXJlbmNlQ29uc3RhbnRzLlJFVVNFX0VESVRPUlNfQk9PTEVBTikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRTaGVsbCgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhd2luZG93LmdldFNoZWxsKCkuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb24gY291bGQgYmUgZnJvbSBhIG5vbi11aSB0aHJlYWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQaW5BY3Rpb25Ub29sYmFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBwaW4gYWN0aW9uIHRvb2xiYXIgc2V0cyBpdHMgc2l6ZSAKLSAgICAgICAgICogY29ycmVjdGx5LCB0aGUgcGluIGFjdGlvbiBzaG91bGQgc2V0IGl0cyB2aXNpYmxpdHkgYmVmb3JlIHdlIGNhbGwgdXBkYXRlUGluQWN0aW9uVG9vbGJhcigpLgotICAgICAgICAgKiAKLSAgICAgICAgICogSW4gb3RoZXIgd29yZHMgd2UgYWx3YXlzIHdhbnQgdGhlIFBpbkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gdG8gYmUgbm90aWZpZWQgYmVmb3JlIHRoZSAKLSAgICAgICAgICogV29ya2JlbmNoQWN0aW9uQnVpbGRlci4KLSAgICAgICAgICovCi0gICAgICAgIFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLSAgICAgICAgICAgICAgICAuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wUHJlZkxpc3RlbmVyKTsKLSAgICAgICAgLy9saXN0ZW4gZm9yIHByb2plY3QgZGVzY3JpcHRpb24gY2hhbmdlcywgd2hpY2ggY2FuIGFmZmVjdCBlbmFibGVtZW50IG9mIGJ1aWxkIGFjdGlvbnMKLSAgICAgICAgcmVzb3VyY2VMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCUlSZXNvdXJjZURlbHRhW10gcHJvamVjdERlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3REZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IGtpbmQgPSBwcm9qZWN0RGVsdGFzW2ldLmdldEtpbmQoKTsKLQkJCQkJLy9hZmZlY3RlZCBieSBwcm9qZWN0cyBiZWluZyBvcGVuZWQvY2xvc2VkIG9yIGRlc2NyaXB0aW9uIGNoYW5nZXMKLQkJCQkJYm9vbGVhbiBjaGFuZ2VkID0gKHByb2plY3REZWx0YXNbaV0uZ2V0RmxhZ3MoKSAmIChJUmVzb3VyY2VEZWx0YS5ERVNDUklQVElPTiB8IElSZXNvdXJjZURlbHRhLk9QRU4pKSAhPSAwOwotCQkJCQlpZiAoa2luZCAhPSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIHx8IGNoYW5nZWQpIHsKLQkJCQkJCXVwZGF0ZUJ1aWxkQWN0aW9ucyhmYWxzZSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhpbnQgZmxhZ3MpIHsKLSAgICAgICAgc3VwZXIuZmlsbEFjdGlvbkJhcnMoZmxhZ3MpOwotICAgICAgICBpZiAoKGZsYWdzICYgRklMTF9QUk9YWSkgPT0gMCkgewotICAgICAgICAgICAgdXBkYXRlQnVpbGRBY3Rpb25zKHRydWUpOwotICAgICAgICAgICAgaG9va0xpc3RlbmVycygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbHMgdGhlIGNvb2xiYXIgd2l0aCB0aGUgd29ya2JlbmNoIGFjdGlvbnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbENvb2xCYXIoSUNvb2xCYXJNYW5hZ2VyIGNvb2xCYXIpIHsKLQotICAgICAgICB7IC8vIFNldCB1cCB0aGUgY29udGV4dCBNZW51Ci0gICAgICAgICAgICBJTWVudU1hbmFnZXIgcG9wVXBNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBwb3BVcE1lbnUuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGxvY2tUb29sQmFyQWN0aW9uKSk7Ci0gICAgICAgICAgICBwb3BVcE1lbnUuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGVkaXRBY3Rpb25TZXRBY3Rpb24pKTsKLSAgICAgICAgICAgIGNvb2xCYXIuc2V0Q29udGV4dE1lbnVNYW5hZ2VyKHBvcFVwTWVudSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29vbEJhci5hZGQobmV3IEdyb3VwTWFya2VyKElJREVBY3Rpb25Db25zdGFudHMuR1JPVVBfRklMRSkpOwotICAgICAgICB7IC8vIEZpbGUgR3JvdXAKLSAgICAgICAgICAgIElUb29sQmFyTWFuYWdlciBmaWxlVG9vbEJhciA9IG5ldyBUb29sQmFyTWFuYWdlcihjb29sQmFyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHlsZSgpKTsKLSAgICAgICAgICAgIGZpbGVUb29sQmFyLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTkVXX0dST1VQKSk7Ci0gICAgICAgICAgICBmaWxlVG9vbEJhci5hZGQobmV3V2l6YXJkRHJvcERvd25BY3Rpb24pOwotICAgICAgICAgICAgZmlsZVRvb2xCYXIuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk5FV19FWFQpKTsKLSAgICAgICAgICAgIGZpbGVUb29sQmFyLmFkZChuZXcgR3JvdXBNYXJrZXIoCi0gICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuU0FWRV9HUk9VUCkpOwotICAgICAgICAgICAgZmlsZVRvb2xCYXIuYWRkKHNhdmVBY3Rpb24pOwotICAgICAgICAgICAgZmlsZVRvb2xCYXIKLSAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5TQVZFX0VYVCkpOwotICAgICAgICAgICAgZmlsZVRvb2xCYXIuYWRkKHByaW50QWN0aW9uKTsKLSAgICAgICAgICAgIGZpbGVUb29sQmFyCi0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuUFJJTlRfRVhUKSk7Ci0KLSAgICAgICAgICAgIGZpbGVUb29sQmFyCi0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkJVSUxEX0dST1VQKSk7Ci0gICAgICAgICAgICBmaWxlVG9vbEJhcgotICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkJVSUxEX0VYVCkpOwotICAgICAgICAgICAgZmlsZVRvb2xCYXIuYWRkKG5ldyBTZXBhcmF0b3IoCi0gICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCB0byB0aGUgY29vbCBiYXIgbWFuYWdlcgotICAgICAgICAgICAgY29vbEJhci5hZGQobmV3IFRvb2xCYXJDb250cmlidXRpb25JdGVtKGZpbGVUb29sQmFyLAotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlRPT0xCQVJfRklMRSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29vbEJhci5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLSAgICAgICAgY29vbEJhci5hZGQobmV3IEdyb3VwTWFya2VyKElJREVBY3Rpb25Db25zdGFudHMuR1JPVVBfTkFWKSk7Ci0gICAgICAgIHsgLy8gTmF2aWdhdGUgZ3JvdXAKLSAgICAgICAgICAgIElUb29sQmFyTWFuYWdlciBuYXZUb29sQmFyID0gbmV3IFRvb2xCYXJNYW5hZ2VyKGNvb2xCYXIKLSAgICAgICAgICAgICAgICAgICAgLmdldFN0eWxlKCkpOwotICAgICAgICAgICAgbmF2VG9vbEJhci5hZGQobmV3IFNlcGFyYXRvcigKLSAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5ISVNUT1JZX0dST1VQKSk7Ci0gICAgICAgICAgICBuYXZUb29sQmFyCi0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR1JPVVBfQVBQKSk7Ci0gICAgICAgICAgICBuYXZUb29sQmFyLmFkZChiYWNrd2FyZEhpc3RvcnlBY3Rpb24pOwotICAgICAgICAgICAgbmF2VG9vbEJhci5hZGQoZm9yd2FyZEhpc3RvcnlBY3Rpb24pOwotICAgICAgICAgICAgbmF2VG9vbEJhci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlBJTl9HUk9VUCkpOwotICAgICAgICAgICAgbmF2VG9vbEJhci5hZGQocGluRWRpdG9yQ29udHJpYnV0aW9uSXRlbSk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCB0byB0aGUgY29vbCBiYXIgbWFuYWdlcgotICAgICAgICAgICAgY29vbEJhci5hZGQobmV3IFRvb2xCYXJDb250cmlidXRpb25JdGVtKG5hdlRvb2xCYXIsCi0gICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuVE9PTEJBUl9OQVZJR0FURSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29vbEJhci5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR1JPVVBfRURJVE9SKSk7Ci0gICAgIAotICAgICAgICBjb29sQmFyLmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5HUk9VUF9IRUxQKSk7Ci0gICAgICAgIAotICAgICAgICB7IC8vIEhlbHAgZ3JvdXAKLSAgICAgICAgICAgIElUb29sQmFyTWFuYWdlciBoZWxwVG9vbEJhciA9IG5ldyBUb29sQmFyTWFuYWdlcihjb29sQmFyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHlsZSgpKTsKLSAgICAgICAgICAgIGhlbHBUb29sQmFyLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR1JPVVBfSEVMUCkpOwotLy8gICAgICAgICAgICBoZWxwVG9vbEJhci5hZGQoc2VhcmNoQ29tYm9JdGVtKTsKLSAgICAgICAgICAgICAgLy8gQWRkIHRoZSBncm91cCBmb3IgYXBwbGljYXRpb25zIHRvIGNvbnRyaWJ1dGUKLSAgICAgICAgICAgIGhlbHBUb29sQmFyLmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5HUk9VUF9BUFApKTsgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQWRkIHRvIHRoZSBjb29sIGJhciBtYW5hZ2VyCi0gICAgICAgICAgICBjb29sQmFyLmFkZChuZXcgVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0oaGVscFRvb2xCYXIsCi0gICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuVE9PTEJBUl9IRUxQKSk7Ci0gICAgICAgIH0gICAgICAgIAotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbHMgdGhlIG1lbnUgYmFyIHdpdGggdGhlIHdvcmtiZW5jaCBhY3Rpb25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbGxNZW51QmFyKElNZW51TWFuYWdlciBtZW51QmFyKSB7Ci0gICAgICAgIG1lbnVCYXIuYWRkKGNyZWF0ZUZpbGVNZW51KCkpOwotICAgICAgICBtZW51QmFyLmFkZChjcmVhdGVFZGl0TWVudSgpKTsKLSAgICAgICAgbWVudUJhci5hZGQoY3JlYXRlTmF2aWdhdGVNZW51KCkpOwotICAgICAgICBtZW51QmFyLmFkZChjcmVhdGVQcm9qZWN0TWVudSgpKTsKLSAgICAgICAgbWVudUJhci5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0gICAgICAgIG1lbnVCYXIuYWRkKGNyZWF0ZVdpbmRvd01lbnUoKSk7Ci0gICAgICAgIG1lbnVCYXIuYWRkKGNyZWF0ZUhlbHBNZW51KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIEZpbGUgbWVudS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1lbnVNYW5hZ2VyIGNyZWF0ZUZpbGVNZW51KCkgewotICAgICAgICBNZW51TWFuYWdlciBtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9maWxlLCBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRklMRSk7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkZJTEVfU1RBUlQpKTsKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBOZXcgc3VibWVudSwgdXNpbmcgdGhlIHNhbWUgaWQgZm9yIGl0IGFzIHRoZSBOZXcgYWN0aW9uCi0gICAgICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9uZXc7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3SWQgPSBBY3Rpb25GYWN0b3J5Lk5FVy5nZXRJZCgpOwotICAgICAgICAgICAgTWVudU1hbmFnZXIgbmV3TWVudSA9IG5ldyBNZW51TWFuYWdlcihuZXdUZXh0LCBuZXdJZCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVudVRleHQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5nZXRNZW51VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3UXVpY2tNZW51ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2hvcnRDdXQgPSBuZXdRdWlja01lbnUuZ2V0U2hvcnRDdXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNob3J0Q3V0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIlx0IiArIHNob3J0Q3V0OyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIG5ld01lbnUuYWRkKG5ldyBTZXBhcmF0b3IobmV3SWQpKTsKLSAgICAgICAgICAgIHRoaXMubmV3V2l6YXJkTWVudSA9IG5ldyBOZXdXaXphcmRNZW51KGdldFdpbmRvdygpKTsKLSAgICAgICAgICAgIG5ld01lbnUuYWRkKHRoaXMubmV3V2l6YXJkTWVudSk7Ci0gICAgICAgICAgICBuZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXdNZW51KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk5FV19FWFQpKTsKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotICAgICAgICBtZW51LmFkZChjbG9zZUFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKGNsb3NlQWxsQWN0aW9uKTsKLSAgICAgICAgLy8JCW1lbnUuYWRkKGNsb3NlQWxsU2F2ZWRBY3Rpb24pOwotICAgICAgICBtZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DTE9TRV9FWFQpKTsKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgbWVudS5hZGQoc2F2ZUFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKHNhdmVBc0FjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKHNhdmVBbGxBY3Rpb24pOwotICAgICAgICBtZW51LmFkZChyZXZlcnRBY3Rpb24pOwotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBtZW51LmFkZChtb3ZlQWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQocmVuYW1lQWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQocmVmcmVzaEFjdGlvbik7Ci0KLSAgICAgICAgbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuU0FWRV9FWFQpKTsKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgbWVudS5hZGQocHJpbnRBY3Rpb24pOwotICAgICAgICBtZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5QUklOVF9FWFQpKTsKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgbWVudS5hZGQob3BlbldvcmtzcGFjZUFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk9QRU5fRVhUKSk7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIG1lbnUuYWRkKGltcG9ydFJlc291cmNlc0FjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKGV4cG9ydFJlc291cmNlc0FjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLklNUE9SVF9FWFQpKTsKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCi0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIG1lbnUuYWRkKHByb3BlcnRpZXNBY3Rpb24pOwotCi0gICAgICAgIG1lbnUuYWRkKENvbnRyaWJ1dGlvbkl0ZW1GYWN0b3J5LlJFT1BFTl9FRElUT1JTLmNyZWF0ZShnZXRXaW5kb3coKSkpOwotICAgICAgICBtZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NUlUpKTsKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgbWVudS5hZGQocXVpdEFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkZJTEVfRU5EKSk7Ci0gICAgICAgIHJldHVybiBtZW51OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIEVkaXQgbWVudS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1lbnVNYW5hZ2VyIGNyZWF0ZUVkaXRNZW51KCkgewotICAgICAgICBNZW51TWFuYWdlciBtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9lZGl0LCBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkVESVRfU1RBUlQpKTsKLQotICAgICAgICBtZW51LmFkZCh1bmRvQWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQocmVkb0FjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlVORE9fRVhUKSk7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLSAgICAgICAgbWVudS5hZGQoY3V0QWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQoY29weUFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKHBhc3RlQWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ1VUX0VYVCkpOwotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgICAgIG1lbnUuYWRkKGRlbGV0ZUFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKHNlbGVjdEFsbEFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLSAgICAgICAgbWVudS5hZGQoZmluZEFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkZJTkRfRVhUKSk7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLSAgICAgICAgbWVudS5hZGQoYWRkQm9va21hcmtBY3Rpb24pOwotICAgICAgICBtZW51LmFkZChhZGRUYXNrQWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQUREX0VYVCkpOwotCi0gICAgICAgIG1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkVESVRfRU5EKSk7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLSAgICAgICAgcmV0dXJuIG1lbnU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgTmF2aWdhdGUgbWVudS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1lbnVNYW5hZ2VyIGNyZWF0ZU5hdmlnYXRlTWVudSgpIHsKLSAgICAgICAgTWVudU1hbmFnZXIgbWVudSA9IG5ldyBNZW51TWFuYWdlcigKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hfbmF2aWdhdGUsIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9OQVZJR0FURSk7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk5BVl9TVEFSVCkpOwotICAgICAgICBtZW51LmFkZChnb0ludG9BY3Rpb24pOwotCi0gICAgICAgIE1lbnVNYW5hZ2VyIGdvVG9TdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9nb1RvLCBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdPX1RPKTsKLSAgICAgICAgbWVudS5hZGQoZ29Ub1N1Yk1lbnUpOwotICAgICAgICBnb1RvU3ViTWVudS5hZGQoYmFja0FjdGlvbik7Ci0gICAgICAgIGdvVG9TdWJNZW51LmFkZChmb3J3YXJkQWN0aW9uKTsKLSAgICAgICAgZ29Ub1N1Yk1lbnUuYWRkKHVwQWN0aW9uKTsKLSAgICAgICAgZ29Ub1N1Yk1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuT1BFTl9FWFQpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCA1OyArK2kpIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5PUEVOX0VYVCArIGkpKTsKLSAgICAgICAgfQotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuU0hPV19FWFQpKTsKLSAgICAgICAgewotCi0gICAgICAgICAgICBNZW51TWFuYWdlciBzaG93SW5TdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9zaG93SW4sICJzaG93SW4iKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lbnVUZXh0KCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIuZ2V0TWVudVRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dJblF1aWNrTWVudSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaG9ydEN1dCA9IHNob3dJblF1aWNrTWVudS5nZXRTaG9ydEN1dFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2hvcnRDdXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiXHQiICsgc2hvcnRDdXQ7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgc2hvd0luU3ViTWVudS5hZGQoQ29udHJpYnV0aW9uSXRlbUZhY3RvcnkuVklFV1NfU0hPV19JTgotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKGdldFdpbmRvdygpKSk7Ci0gICAgICAgICAgICBtZW51LmFkZChzaG93SW5TdWJNZW51KTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IDU7ICsraSkgewotICAgICAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlNIT1dfRVhUICsgaSkpOwotICAgICAgICB9Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIG1lbnUuYWRkKG5leHRBY3Rpb24pOwotICAgICAgICBtZW51LmFkZChwcmV2aW91c0FjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLSAgICAgICAgbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTkFWX0VORCkpOwotCi0gICAgICAgIC8vVEJEOiBMb2NhdGlvbiBvZiB0aGlzIGFjdGlvbnMKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgbWVudS5hZGQoYmFja3dhcmRIaXN0b3J5QWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQoZm9yd2FyZEhpc3RvcnlBY3Rpb24pOwotICAgICAgICByZXR1cm4gbWVudTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBQcm9qZWN0IG1lbnUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZW51TWFuYWdlciBjcmVhdGVQcm9qZWN0TWVudSgpIHsKLSAgICAgICAgTWVudU1hbmFnZXIgbWVudSA9IG5ldyBNZW51TWFuYWdlcigKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hfcHJvamVjdCwgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX1BST0pFQ1QpOwotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuUFJPSl9TVEFSVCkpOwotCi0gICAgICAgIG1lbnUuYWRkKG9wZW5Qcm9qZWN0QWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQoY2xvc2VQcm9qZWN0QWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuT1BFTl9FWFQpKTsKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgbWVudS5hZGQoYnVpbGRBbGxBY3Rpb24pOwotICAgICAgICBtZW51LmFkZChidWlsZFByb2plY3RBY3Rpb24pOwotICAgICAgICBhZGRXb3JraW5nU2V0QnVpbGRBY3Rpb25zKG1lbnUpOwotICAgICAgICBtZW51LmFkZChjbGVhbkFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKHRvZ2dsZUF1dG9CdWlsZEFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkJVSUxEX0VYVCkpOwotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgICAgIG1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotICAgICAgICBtZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5QUk9KX0VORCkpOwotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBtZW51LmFkZChwcm9qZWN0UHJvcGVydHlEaWFsb2dBY3Rpb24pOwotICAgICAgICByZXR1cm4gbWVudTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBXaW5kb3cgbWVudS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1lbnVNYW5hZ2VyIGNyZWF0ZVdpbmRvd01lbnUoKSB7Ci0gICAgICAgIE1lbnVNYW5hZ2VyIG1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX3dpbmRvdywgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX1dJTkRPVyk7Ci0KLSAgICAgICAgbWVudS5hZGQobmV3V2luZG93QWN0aW9uKTsKLQkJbWVudS5hZGQobmV3RWRpdG9yQWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgYWRkUGVyc3BlY3RpdmVBY3Rpb25zKG1lbnUpOwotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBhZGRLZXlib2FyZFNob3J0Y3V0cyhtZW51KTsKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TICsgImVuZCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZW51LmFkZChvcGVuUHJlZmVyZW5jZXNBY3Rpb24pOwotCi0gICAgICAgIG1lbnUuYWRkKENvbnRyaWJ1dGlvbkl0ZW1GYWN0b3J5Lk9QRU5fV0lORE9XUy5jcmVhdGUoZ2V0V2luZG93KCkpKTsKLSAgICAgICAgcmV0dXJuIG1lbnU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgcGVyc3BlY3RpdmUgYWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIG1lbnUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBlcnNwZWN0aXZlQWN0aW9ucyhNZW51TWFuYWdlciBtZW51KSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBvcGVuVGV4dCA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9vcGVuUGVyc3BlY3RpdmU7Ci0gICAgICAgICAgICBNZW51TWFuYWdlciBjaGFuZ2VQZXJzcE1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIob3BlblRleHQsCi0gICAgICAgICAgICAgICAgICAgICJvcGVuUGVyc3BlY3RpdmUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gY2hhbmdlUGVyc3BNZW51SXRlbSA9IENvbnRyaWJ1dGlvbkl0ZW1GYWN0b3J5LlBFUlNQRUNUSVZFU19TSE9SVExJU1QKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZShnZXRXaW5kb3coKSk7Ci0gICAgICAgICAgICBjaGFuZ2VQZXJzcE1lbnVNZ3IuYWRkKGNoYW5nZVBlcnNwTWVudUl0ZW0pOwotICAgICAgICAgICAgbWVudS5hZGQoY2hhbmdlUGVyc3BNZW51TWdyKTsKLSAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBNZW51TWFuYWdlciBzaG93Vmlld01lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX3Nob3dWaWV3LCAic2hvd1ZpZXciKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gc2hvd1ZpZXdNZW51ID0gQ29udHJpYnV0aW9uSXRlbUZhY3RvcnkuVklFV1NfU0hPUlRMSVNUCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGUoZ2V0V2luZG93KCkpOwotICAgICAgICAgICAgc2hvd1ZpZXdNZW51TWdyLmFkZChzaG93Vmlld01lbnUpOwotICAgICAgICAgICAgbWVudS5hZGQoc2hvd1ZpZXdNZW51TWdyKTsKLSAgICAgICAgfQotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBtZW51LmFkZChlZGl0QWN0aW9uU2V0QWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQoc2F2ZVBlcnNwZWN0aXZlQWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQocmVzZXRQZXJzcGVjdGl2ZUFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKGNsb3NlUGVyc3BBY3Rpb24pOwotICAgICAgICBtZW51LmFkZChjbG9zZUFsbFBlcnNwc0FjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUga2V5Ym9hcmQgbmF2aWdhdGlvbiBzdWJtZW51IHRvIHRoZSBzcGVjaWZpZWQgbWVudS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkV29ya2luZ1NldEJ1aWxkQWN0aW9ucyhNZW51TWFuYWdlciBtZW51KSB7Ci0gICAgICAgIGJ1aWxkV29ya2luZ1NldE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX2J1aWxkU2V0KTsKLSAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gd29ya2luZ1NldEJ1aWxkcyA9IG5ldyBCdWlsZFNldE1lbnUod2luZG93LAotICAgICAgICAgICAgICAgIGdldEFjdGlvbkJhckNvbmZpZ3VyZXIoKSk7Ci0gICAgICAgIGJ1aWxkV29ya2luZ1NldE1lbnUuYWRkKHdvcmtpbmdTZXRCdWlsZHMpOwotICAgICAgICBtZW51LmFkZChidWlsZFdvcmtpbmdTZXRNZW51KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBrZXlib2FyZCBuYXZpZ2F0aW9uIHN1Ym1lbnUgdG8gdGhlIHNwZWNpZmllZCBtZW51LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRLZXlib2FyZFNob3J0Y3V0cyhNZW51TWFuYWdlciBtZW51KSB7Ci0gICAgICAgIE1lbnVNYW5hZ2VyIHN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX3Nob3J0Y3V0cywgInNob3J0Y3V0cyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1lbnUuYWRkKHN1Yk1lbnUpOwotICAgICAgICBzdWJNZW51LmFkZChzaG93UGFydFBhbmVNZW51QWN0aW9uKTsKLSAgICAgICAgc3ViTWVudS5hZGQoc2hvd1ZpZXdNZW51QWN0aW9uKTsKLSAgICAgICAgc3ViTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgc3ViTWVudS5hZGQobWF4aW1pemVQYXJ0QWN0aW9uKTsKLSAgICAgICAgc3ViTWVudS5hZGQobWluaW1pemVQYXJ0QWN0aW9uKTsKLSAgICAgICAgc3ViTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgc3ViTWVudS5hZGQoYWN0aXZhdGVFZGl0b3JBY3Rpb24pOwotICAgICAgICBzdWJNZW51LmFkZChuZXh0RWRpdG9yQWN0aW9uKTsKLSAgICAgICAgc3ViTWVudS5hZGQocHJldkVkaXRvckFjdGlvbik7Ci0gICAgICAgIHN1Yk1lbnUuYWRkKHN3aXRjaFRvRWRpdG9yQWN0aW9uKTsKLSAgICAgICAgc3ViTWVudS5hZGQob3BlbkVkaXRvckRyb3BEb3duQWN0aW9uKTsKLSAgICAgICAgc3ViTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgc3ViTWVudS5hZGQobmV4dFBhcnRBY3Rpb24pOwotICAgICAgICBzdWJNZW51LmFkZChwcmV2UGFydEFjdGlvbik7Ci0gICAgICAgIHN1Yk1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIHN1Yk1lbnUuYWRkKG5leHRQZXJzcGVjdGl2ZUFjdGlvbik7Ci0gICAgICAgIHN1Yk1lbnUuYWRkKHByZXZQZXJzcGVjdGl2ZUFjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgSGVscCBtZW51LgotCSAqLwotCXByaXZhdGUgTWVudU1hbmFnZXIgY3JlYXRlSGVscE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnUgPSBuZXcgTWVudU1hbmFnZXIoSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX2hlbHAsIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9IRUxQKTsKLQkJYWRkU2VwYXJhdG9yT3JHcm91cE1hcmtlcihtZW51LCAiZ3JvdXAuaW50cm8iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBTZWUgaWYgYSB3ZWxjb21lIG9yIGludHJvIHBhZ2UgaXMgc3BlY2lmaWVkCi0JCWlmIChpbnRyb0FjdGlvbiAhPSBudWxsKQotCQkJbWVudS5hZGQoaW50cm9BY3Rpb24pOwotCQllbHNlIGlmIChxdWlja1N0YXJ0QWN0aW9uICE9IG51bGwpCi0JCQltZW51LmFkZChxdWlja1N0YXJ0QWN0aW9uKTsKLQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKCJncm91cC5pbnRyby5leHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkU2VwYXJhdG9yT3JHcm91cE1hcmtlcihtZW51LCAiZ3JvdXAubWFpbiIpOyAvLyROT04tTkxTLTEkCi0JCW1lbnUuYWRkKGhlbHBDb250ZW50c0FjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKGhlbHBTZWFyY2hBY3Rpb24pOwotCQltZW51LmFkZChkeW5hbWljSGVscEFjdGlvbik7Ci0JCWFkZFNlcGFyYXRvck9yR3JvdXBNYXJrZXIobWVudSwgImdyb3VwLmFzc2lzdCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFNlZSBpZiBhIHRpcHMgYW5kIHRyaWNrcyBwYWdlIGlzIHNwZWNpZmllZAotCQlpZiAodGlwc0FuZFRyaWNrc0FjdGlvbiAhPSBudWxsKQotCQkJbWVudS5hZGQodGlwc0FuZFRyaWNrc0FjdGlvbik7Ci0JCS8vIEhFTFBfU1RBUlQgc2hvdWxkIHJlYWxseSBiZSB0aGUgZmlyc3QgaXRlbSwgYnV0IGl0IHdhcyBhZnRlcgotCQkvLyBxdWlja1N0YXJ0QWN0aW9uIGFuZCB0aXBzQW5kVHJpY2tzQWN0aW9uIGluIDIuMS4KLQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuSEVMUF9TVEFSVCkpOwotCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoImdyb3VwLm1haW4uZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWFkZFNlcGFyYXRvck9yR3JvdXBNYXJrZXIobWVudSwgImdyb3VwLnR1dG9yaWFscyIpOyAvLyROT04tTkxTLTEkCi0JCWFkZFNlcGFyYXRvck9yR3JvdXBNYXJrZXIobWVudSwgImdyb3VwLnRvb2xzIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkU2VwYXJhdG9yT3JHcm91cE1hcmtlcihtZW51LCAiZ3JvdXAudXBkYXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkhFTFBfRU5EKSk7Ci0JCWFkZFNlcGFyYXRvck9yR3JvdXBNYXJrZXIobWVudSwgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpOwotCQkvLyBhYm91dCBzaG91bGQgYWx3YXlzIGJlIGF0IHRoZSBib3R0b20KLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigiZ3JvdXAuYWJvdXQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbWVudS5hZGQoYWJvdXRBY3Rpb24pOwotCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoImdyb3VwLmFib3V0LmV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8qCQkKLSAgICAgICAgIGZpbmFsIElNdXRhYmxlQ29udGV4dEFjdGl2YXRpb25TZXJ2aWNlIGNvbnRleHRBY3RpdmF0aW9uU2VydmljZUEgPSBDb250ZXh0QWN0aXZhdGlvblNlcnZpY2VGYWN0b3J5LmdldE11dGFibGVDb250ZXh0QWN0aXZhdGlvblNlcnZpY2UoKTsKLSAgICAgICAgIGNvbnRleHRBY3RpdmF0aW9uU2VydmljZUEuc2V0QWN0aXZlQ29udGV4dElkcyhuZXcgSGFzaFNldChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJBIikpKTsKLQotICAgICAgICAgZmluYWwgSU11dGFibGVDb250ZXh0QWN0aXZhdGlvblNlcnZpY2UgY29udGV4dEFjdGl2YXRpb25TZXJ2aWNlQiA9IENvbnRleHRBY3RpdmF0aW9uU2VydmljZUZhY3RvcnkuZ2V0TXV0YWJsZUNvbnRleHRBY3RpdmF0aW9uU2VydmljZSgpOwotICAgICAgICAgY29udGV4dEFjdGl2YXRpb25TZXJ2aWNlQi5zZXRBY3RpdmVDb250ZXh0SWRzKG5ldyBIYXNoU2V0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIkIiKSkpOwkJCQkKLSAgICAgICAgIAotICAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgIAotICAgICAgICAgbWVudS5hZGQobmV3IEFjdGlvbigiQWRkIGNvbnRleHQgQSB0byB0aGUgd29ya2JlbmNoIikgewotICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgSVdvcmtiZW5jaENvbnRleHRTdXBwb3J0IHdvcmtiZW5jaENvbnRleHRTdXBwb3J0ID0gKElXb3JrYmVuY2hDb250ZXh0U3VwcG9ydCkgd29ya2JlbmNoLmdldENvbnRleHRTdXBwb3J0KCk7Ci0gICAgICAgICB3b3JrYmVuY2hDb250ZXh0U3VwcG9ydC5nZXRDb21wb3VuZENvbnRleHRBY3RpdmF0aW9uU2VydmljZSgpLmFkZENvbnRleHRBY3RpdmF0aW9uU2VydmljZShjb250ZXh0QWN0aXZhdGlvblNlcnZpY2VBKTsKLSAgICAgICAgIH0KLSAgICAgICAgIH0pOwotCi0gICAgICAgICBtZW51LmFkZChuZXcgQWN0aW9uKCJSZW1vdmUgY29udGV4dCBBIGZyb20gdGhlIHdvcmtiZW5jaCIpIHsKLSAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgIElXb3JrYmVuY2hDb250ZXh0U3VwcG9ydCB3b3JrYmVuY2hDb250ZXh0U3VwcG9ydCA9IChJV29ya2JlbmNoQ29udGV4dFN1cHBvcnQpIHdvcmtiZW5jaC5nZXRDb250ZXh0U3VwcG9ydCgpOwotICAgICAgICAgd29ya2JlbmNoQ29udGV4dFN1cHBvcnQuZ2V0Q29tcG91bmRDb250ZXh0QWN0aXZhdGlvblNlcnZpY2UoKS5yZW1vdmVDb250ZXh0QWN0aXZhdGlvblNlcnZpY2UoY29udGV4dEFjdGl2YXRpb25TZXJ2aWNlQSk7Ci0gICAgICAgICB9Ci0gICAgICAgICB9KTsKLSAgICAgICAgIAotICAgICAgICAgbWVudS5hZGQobmV3IEFjdGlvbigiQWRkIGNvbnRleHQgQiB0byB0aGUgd29ya2JlbmNoIikgewotICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgSVdvcmtiZW5jaENvbnRleHRTdXBwb3J0IHdvcmtiZW5jaENvbnRleHRTdXBwb3J0ID0gKElXb3JrYmVuY2hDb250ZXh0U3VwcG9ydCkgd29ya2JlbmNoLmdldENvbnRleHRTdXBwb3J0KCk7Ci0gICAgICAgICB3b3JrYmVuY2hDb250ZXh0U3VwcG9ydC5nZXRDb21wb3VuZENvbnRleHRBY3RpdmF0aW9uU2VydmljZSgpLmFkZENvbnRleHRBY3RpdmF0aW9uU2VydmljZShjb250ZXh0QWN0aXZhdGlvblNlcnZpY2VCKTsKLSAgICAgICAgIH0KLSAgICAgICAgIH0pOwotCi0gICAgICAgICBtZW51LmFkZChuZXcgQWN0aW9uKCJSZW1vdmUgY29udGV4dCBCIGZyb20gdGhlIHdvcmtiZW5jaCIpIHsKLSAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgIElXb3JrYmVuY2hDb250ZXh0U3VwcG9ydCB3b3JrYmVuY2hDb250ZXh0U3VwcG9ydCA9IChJV29ya2JlbmNoQ29udGV4dFN1cHBvcnQpIHdvcmtiZW5jaC5nZXRDb250ZXh0U3VwcG9ydCgpOwotICAgICAgICAgd29ya2JlbmNoQ29udGV4dFN1cHBvcnQuZ2V0Q29tcG91bmRDb250ZXh0QWN0aXZhdGlvblNlcnZpY2UoKS5yZW1vdmVDb250ZXh0QWN0aXZhdGlvblNlcnZpY2UoY29udGV4dEFjdGl2YXRpb25TZXJ2aWNlQik7Ci0gICAgICAgICB9Ci0gICAgICAgICB9KTsKLSAgICAgICAgIAotICAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgIAotICAgICAgICAgbWVudS5hZGQobmV3IEFjdGlvbigiQWRkIGNvbnRleHQgQSB0byB0aGUgd29ya2JlbmNoIHBhZ2UiKSB7Ci0gICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQotICAgICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKSB7Ci0gICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgIAotICAgICAgICAgaWYgKHdvcmtiZW5jaFBhZ2UgIT0gbnVsbCkgewkJCQkJCi0gICAgICAgICBJV29ya2JlbmNoUGFnZUNvbnRleHRTdXBwb3J0IHdvcmtiZW5jaFBhZ2VDb250ZXh0U3VwcG9ydCA9IChJV29ya2JlbmNoUGFnZUNvbnRleHRTdXBwb3J0KSB3b3JrYmVuY2hQYWdlLmdldENvbnRleHRTdXBwb3J0KCk7Ci0gICAgICAgICB3b3JrYmVuY2hQYWdlQ29udGV4dFN1cHBvcnQuZ2V0Q29tcG91bmRDb250ZXh0QWN0aXZhdGlvblNlcnZpY2UoKS5hZGRDb250ZXh0QWN0aXZhdGlvblNlcnZpY2UoY29udGV4dEFjdGl2YXRpb25TZXJ2aWNlQSk7Ci0gICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICB9KTsKLSAgICAgICAgIAotICAgICAgICAgbWVudS5hZGQobmV3IEFjdGlvbigiUmVtb3ZlIGNvbnRleHQgQSBmcm9tIHRoZSB3b3JrYmVuY2ggcGFnZSIpIHsKLSAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0gICAgICAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLSAgICAgICAgIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgCi0gICAgICAgICBpZiAod29ya2JlbmNoUGFnZSAhPSBudWxsKSB7CQkJCQkKLSAgICAgICAgIElXb3JrYmVuY2hQYWdlQ29udGV4dFN1cHBvcnQgd29ya2JlbmNoUGFnZUNvbnRleHRTdXBwb3J0ID0gKElXb3JrYmVuY2hQYWdlQ29udGV4dFN1cHBvcnQpIHdvcmtiZW5jaFBhZ2UuZ2V0Q29udGV4dFN1cHBvcnQoKTsKLSAgICAgICAgIHdvcmtiZW5jaFBhZ2VDb250ZXh0U3VwcG9ydC5nZXRDb21wb3VuZENvbnRleHRBY3RpdmF0aW9uU2VydmljZSgpLnJlbW92ZUNvbnRleHRBY3RpdmF0aW9uU2VydmljZShjb250ZXh0QWN0aXZhdGlvblNlcnZpY2VBKTsKLSAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIH0pOwkJCi0gICAgICAgICAKLSAgICAgICAgIG1lbnUuYWRkKG5ldyBBY3Rpb24oIkFkZCBjb250ZXh0IEIgdG8gdGhlIHdvcmtiZW5jaCBwYWdlIikgewotICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0KLSAgICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotICAgICAgICAgSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgICAKLSAgICAgICAgIGlmICh3b3JrYmVuY2hQYWdlICE9IG51bGwpIHsJCQkJCQotICAgICAgICAgSVdvcmtiZW5jaFBhZ2VDb250ZXh0U3VwcG9ydCB3b3JrYmVuY2hQYWdlQ29udGV4dFN1cHBvcnQgPSAoSVdvcmtiZW5jaFBhZ2VDb250ZXh0U3VwcG9ydCkgd29ya2JlbmNoUGFnZS5nZXRDb250ZXh0U3VwcG9ydCgpOwotICAgICAgICAgd29ya2JlbmNoUGFnZUNvbnRleHRTdXBwb3J0LmdldENvbXBvdW5kQ29udGV4dEFjdGl2YXRpb25TZXJ2aWNlKCkuYWRkQ29udGV4dEFjdGl2YXRpb25TZXJ2aWNlKGNvbnRleHRBY3RpdmF0aW9uU2VydmljZUIpOwotICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgfSk7Ci0KLSAgICAgICAgIG1lbnUuYWRkKG5ldyBBY3Rpb24oIlJlbW92ZSBjb250ZXh0IEIgZnJvbSB0aGUgd29ya2JlbmNoIHBhZ2UiKSB7Ci0gICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQotICAgICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKSB7Ci0gICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgIAotICAgICAgICAgaWYgKHdvcmtiZW5jaFBhZ2UgIT0gbnVsbCkgewkJCQkJCi0gICAgICAgICBJV29ya2JlbmNoUGFnZUNvbnRleHRTdXBwb3J0IHdvcmtiZW5jaFBhZ2VDb250ZXh0U3VwcG9ydCA9IChJV29ya2JlbmNoUGFnZUNvbnRleHRTdXBwb3J0KSB3b3JrYmVuY2hQYWdlLmdldENvbnRleHRTdXBwb3J0KCk7Ci0gICAgICAgICB3b3JrYmVuY2hQYWdlQ29udGV4dFN1cHBvcnQuZ2V0Q29tcG91bmRDb250ZXh0QWN0aXZhdGlvblNlcnZpY2UoKS5yZW1vdmVDb250ZXh0QWN0aXZhdGlvblNlcnZpY2UoY29udGV4dEFjdGl2YXRpb25TZXJ2aWNlQik7Ci0gICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICB9KTsKLSAgICAgICAgIAotICAgICAgICAgSUhhbmRsZXIgaGFuZGxlckEgPSBuZXcgSUhhbmRsZXIoKSB7Ci0gICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgICAgICAgfQotICAgICAgICAgCi0gICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICB9Ci0gICAgICAgICAKLSAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIH0KLSAgICAgICAgIH07Ci0gICAgICAgICAKLSAgICAgICAgIElIYW5kbGVyIGhhbmRsZXJCID0gbmV3IElIYW5kbGVyKCkgewotICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAgICAgIH0KLSAgICAgICAgIAotICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShFdmVudCBldmVudCkgewotICAgICAgICAgfQotICAgICAgICAgCi0gICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICB9Ci0gICAgICAgICB9OwkJCi0gICAgICAgICAKLSAgICAgICAgIGZpbmFsIElNdXRhYmxlQ29tbWFuZEhhbmRsZXJTZXJ2aWNlIGNvbW1hbmRIYW5kbGVyU2VydmljZUEgPSBDb21tYW5kSGFuZGxlclNlcnZpY2VGYWN0b3J5LmdldE11dGFibGVDb21tYW5kSGFuZGxlclNlcnZpY2UoKTsKLSAgICAgICAgIGNvbW1hbmRIYW5kbGVyU2VydmljZUEuc2V0SGFuZGxlcnNCeUNvbW1hbmRJZChuZXcgSGFzaE1hcChDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoImNvbW1hbmQiLCBoYW5kbGVyQSkpKTsKLQotICAgICAgICAgZmluYWwgSU11dGFibGVDb21tYW5kSGFuZGxlclNlcnZpY2UgY29tbWFuZEhhbmRsZXJTZXJ2aWNlQiA9IENvbW1hbmRIYW5kbGVyU2VydmljZUZhY3RvcnkuZ2V0TXV0YWJsZUNvbW1hbmRIYW5kbGVyU2VydmljZSgpOwotICAgICAgICAgY29tbWFuZEhhbmRsZXJTZXJ2aWNlQi5zZXRIYW5kbGVyc0J5Q29tbWFuZElkKG5ldyBIYXNoTWFwKENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcCgiY29tbWFuZCIsIGhhbmRsZXJCKSkpOwkJCQkKLSAgICAgICAgIAotICAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgIAotICAgICAgICAgbWVudS5hZGQobmV3IEFjdGlvbigiQWRkIGhhbmRsZXIgQSB0byB0aGUgd29ya2JlbmNoIikgewotICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgSVdvcmtiZW5jaENvbW1hbmRTdXBwb3J0IHdvcmtiZW5jaENvbW1hbmRTdXBwb3J0ID0gKElXb3JrYmVuY2hDb21tYW5kU3VwcG9ydCkgd29ya2JlbmNoLmdldENvbW1hbmRTdXBwb3J0KCk7Ci0gICAgICAgICB3b3JrYmVuY2hDb21tYW5kU3VwcG9ydC5nZXRDb21wb3VuZENvbW1hbmRIYW5kbGVyU2VydmljZSgpLmFkZENvbW1hbmRIYW5kbGVyU2VydmljZShjb21tYW5kSGFuZGxlclNlcnZpY2VBKTsKLSAgICAgICAgIH0KLSAgICAgICAgIH0pOwotCi0gICAgICAgICBtZW51LmFkZChuZXcgQWN0aW9uKCJSZW1vdmUgaGFuZGxlciBBIGZyb20gdGhlIHdvcmtiZW5jaCIpIHsKLSAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgIElXb3JrYmVuY2hDb21tYW5kU3VwcG9ydCB3b3JrYmVuY2hDb21tYW5kU3VwcG9ydCA9IChJV29ya2JlbmNoQ29tbWFuZFN1cHBvcnQpIHdvcmtiZW5jaC5nZXRDb21tYW5kU3VwcG9ydCgpOwotICAgICAgICAgd29ya2JlbmNoQ29tbWFuZFN1cHBvcnQuZ2V0Q29tcG91bmRDb21tYW5kSGFuZGxlclNlcnZpY2UoKS5yZW1vdmVDb21tYW5kSGFuZGxlclNlcnZpY2UoY29tbWFuZEhhbmRsZXJTZXJ2aWNlQSk7Ci0gICAgICAgICB9Ci0gICAgICAgICB9KTsKLSAgICAgICAgIAotICAgICAgICAgbWVudS5hZGQobmV3IEFjdGlvbigiQWRkIGhhbmRsZXIgQiB0byB0aGUgd29ya2JlbmNoIikgewotICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgSVdvcmtiZW5jaENvbW1hbmRTdXBwb3J0IHdvcmtiZW5jaENvbW1hbmRTdXBwb3J0ID0gKElXb3JrYmVuY2hDb21tYW5kU3VwcG9ydCkgd29ya2JlbmNoLmdldENvbW1hbmRTdXBwb3J0KCk7Ci0gICAgICAgICB3b3JrYmVuY2hDb21tYW5kU3VwcG9ydC5nZXRDb21wb3VuZENvbW1hbmRIYW5kbGVyU2VydmljZSgpLmFkZENvbW1hbmRIYW5kbGVyU2VydmljZShjb21tYW5kSGFuZGxlclNlcnZpY2VCKTsKLSAgICAgICAgIH0KLSAgICAgICAgIH0pOwotCi0gICAgICAgICBtZW51LmFkZChuZXcgQWN0aW9uKCJSZW1vdmUgaGFuZGxlciBCIGZyb20gdGhlIHdvcmtiZW5jaCIpIHsKLSAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgIElXb3JrYmVuY2hDb21tYW5kU3VwcG9ydCB3b3JrYmVuY2hDb21tYW5kU3VwcG9ydCA9IChJV29ya2JlbmNoQ29tbWFuZFN1cHBvcnQpIHdvcmtiZW5jaC5nZXRDb21tYW5kU3VwcG9ydCgpOwotICAgICAgICAgd29ya2JlbmNoQ29tbWFuZFN1cHBvcnQuZ2V0Q29tcG91bmRDb21tYW5kSGFuZGxlclNlcnZpY2UoKS5yZW1vdmVDb21tYW5kSGFuZGxlclNlcnZpY2UoY29tbWFuZEhhbmRsZXJTZXJ2aWNlQik7Ci0gICAgICAgICB9Ci0gICAgICAgICB9KTsKLQotICAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgIAotICAgICAgICAgbWVudS5hZGQobmV3IEFjdGlvbigiQWRkIGhhbmRsZXIgQSB0byB0aGUgd29ya2JlbmNoIHBhZ2UiKSB7Ci0gICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQotICAgICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKSB7Ci0gICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgIAotICAgICAgICAgaWYgKHdvcmtiZW5jaFBhZ2UgIT0gbnVsbCkgewkJCQkJCi0gICAgICAgICBJV29ya2JlbmNoUGFnZUNvbW1hbmRTdXBwb3J0IHdvcmtiZW5jaFBhZ2VDb21tYW5kU3VwcG9ydCA9IChJV29ya2JlbmNoUGFnZUNvbW1hbmRTdXBwb3J0KSB3b3JrYmVuY2hQYWdlLmdldENvbW1hbmRTdXBwb3J0KCk7Ci0gICAgICAgICB3b3JrYmVuY2hQYWdlQ29tbWFuZFN1cHBvcnQuZ2V0Q29tcG91bmRDb21tYW5kSGFuZGxlclNlcnZpY2UoKS5hZGRDb21tYW5kSGFuZGxlclNlcnZpY2UoY29tbWFuZEhhbmRsZXJTZXJ2aWNlQSk7Ci0gICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICB9KTsKLQotICAgICAgICAgbWVudS5hZGQobmV3IEFjdGlvbigiUmVtb3ZlIGhhbmRsZXIgQSBmcm9tIHRoZSB3b3JrYmVuY2ggcGFnZSIpIHsKLSAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0gICAgICAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLSAgICAgICAgIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgCi0gICAgICAgICBpZiAod29ya2JlbmNoUGFnZSAhPSBudWxsKSB7CQkJCQkKLSAgICAgICAgIElXb3JrYmVuY2hQYWdlQ29tbWFuZFN1cHBvcnQgd29ya2JlbmNoUGFnZUNvbW1hbmRTdXBwb3J0ID0gKElXb3JrYmVuY2hQYWdlQ29tbWFuZFN1cHBvcnQpIHdvcmtiZW5jaFBhZ2UuZ2V0Q29tbWFuZFN1cHBvcnQoKTsKLSAgICAgICAgIHdvcmtiZW5jaFBhZ2VDb21tYW5kU3VwcG9ydC5nZXRDb21wb3VuZENvbW1hbmRIYW5kbGVyU2VydmljZSgpLnJlbW92ZUNvbW1hbmRIYW5kbGVyU2VydmljZShjb21tYW5kSGFuZGxlclNlcnZpY2VBKTsKLSAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIH0pOwotICAgICAgICAgCi0gICAgICAgICBtZW51LmFkZChuZXcgQWN0aW9uKCJBZGQgaGFuZGxlciBCIHRvIHRoZSB3b3JrYmVuY2ggcGFnZSIpIHsKLSAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0gICAgICAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLSAgICAgICAgIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgCi0gICAgICAgICBpZiAod29ya2JlbmNoUGFnZSAhPSBudWxsKSB7CQkJCQkKLSAgICAgICAgIElXb3JrYmVuY2hQYWdlQ29tbWFuZFN1cHBvcnQgd29ya2JlbmNoUGFnZUNvbW1hbmRTdXBwb3J0ID0gKElXb3JrYmVuY2hQYWdlQ29tbWFuZFN1cHBvcnQpIHdvcmtiZW5jaFBhZ2UuZ2V0Q29tbWFuZFN1cHBvcnQoKTsKLSAgICAgICAgIHdvcmtiZW5jaFBhZ2VDb21tYW5kU3VwcG9ydC5nZXRDb21wb3VuZENvbW1hbmRIYW5kbGVyU2VydmljZSgpLmFkZENvbW1hbmRIYW5kbGVyU2VydmljZShjb21tYW5kSGFuZGxlclNlcnZpY2VCKTsKLSAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIH0pOwotCi0gICAgICAgICBtZW51LmFkZChuZXcgQWN0aW9uKCJSZW1vdmUgaGFuZGxlciBCIGZyb20gdGhlIHdvcmtiZW5jaCBwYWdlIikgewotICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0KLSAgICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotICAgICAgICAgSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgICAKLSAgICAgICAgIGlmICh3b3JrYmVuY2hQYWdlICE9IG51bGwpIHsJCQkJCQotICAgICAgICAgSVdvcmtiZW5jaFBhZ2VDb21tYW5kU3VwcG9ydCB3b3JrYmVuY2hQYWdlQ29tbWFuZFN1cHBvcnQgPSAoSVdvcmtiZW5jaFBhZ2VDb21tYW5kU3VwcG9ydCkgd29ya2JlbmNoUGFnZS5nZXRDb21tYW5kU3VwcG9ydCgpOwotICAgICAgICAgd29ya2JlbmNoUGFnZUNvbW1hbmRTdXBwb3J0LmdldENvbXBvdW5kQ29tbWFuZEhhbmRsZXJTZXJ2aWNlKCkucmVtb3ZlQ29tbWFuZEhhbmRsZXJTZXJ2aWNlKGNvbW1hbmRIYW5kbGVyU2VydmljZUIpOwotICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgfSk7Ci0gICAgICAgICAqLwotCi0gICAgICAgIHJldHVybiBtZW51OwotICAgIH0KLQotICAgIC8qKgotCSAqIEFkZHMgYSA8Y29kZT5Hcm91cE1hcmtlcjwvY29kZT4gb3IgPGNvZGU+U2VwYXJhdG9yPC9jb2RlPiB0byBhIG1lbnUuCi0JICogVGhlIHRlc3QgZm9yIHdoZXRoZXIgYSBzZXBhcmF0b3Igc2hvdWxkIGJlIGFkZGVkIGlzIGRvbmUgYnkgY2hlY2tpbmcgZm9yCi0JICogdGhlIGV4aXN0ZW5jZSBvZiBhIHByZWZlcmVuY2UgbWF0Y2hpbmcgdGhlIHN0cmluZwotCSAqIHVzZVNlcGFyYXRvci5NRU5VSUQuR1JPVVBJRCB0aGF0IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVudQotCSAqICAgICAgICAgICAgdGhlIG1lbnUgdG8gYWRkIHRvCi0JICogQHBhcmFtIGdyb3VwSWQKLQkgKiAgICAgICAgICAgIHRoZSBncm91cCBpZCBmb3IgdGhlIGFkZGVkIHNlcGFyYXRvciBvciBncm91cCBtYXJrZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU2VwYXJhdG9yT3JHcm91cE1hcmtlcihNZW51TWFuYWdlciBtZW51LCBTdHJpbmcgZ3JvdXBJZCkgewotCQlTdHJpbmcgcHJlZklkID0gInVzZVNlcGFyYXRvci4iICsgbWVudS5nZXRJZCgpICsgIi4iICsgZ3JvdXBJZDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJvb2xlYW4gYWRkRXh0cmFTZXBhcmF0b3JzID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKHByZWZJZCk7Ci0JCWlmIChhZGRFeHRyYVNlcGFyYXRvcnMpIHsKLQkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoZ3JvdXBJZCkpOwotCQl9IGVsc2UgewotCQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKGdyb3VwSWQpKTsKLQkJfQotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEaXNwb3NlcyBhbnkgcmVzb3VyY2VzIGFuZCB1bmhvb2tzIGFueSBsaXN0ZW5lcnMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2luZG93IGlzIGNsb3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAoaXNEaXNwb3NlZCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAJaXNEaXNwb3NlZCA9IHRydWU7Ci0gICAgICAgIGdldEFjdGlvbkJhckNvbmZpZ3VyZXIoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLnJlbW92ZShzdGF0dXNMaW5lSXRlbSk7Ci0gICAgICAgIGlmIChwYWdlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgd2luZG93LnJlbW92ZVBhZ2VMaXN0ZW5lcihwYWdlTGlzdGVuZXIpOwotICAgICAgICAgICAgcGFnZUxpc3RlbmVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJlZkxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpCi0gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZMaXN0ZW5lcik7Ci0gICAgICAgICAgICBwcmVmTGlzdGVuZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wUHJlZkxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLSAgICAgICAgICAgICAgICAgICAgLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcFByZWZMaXN0ZW5lcik7Ci0gICAgICAgICAgICBwcm9wUHJlZkxpc3RlbmVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzb3VyY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIHJlc291cmNlTGlzdGVuZXIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcGluRWRpdG9yQ29udHJpYnV0aW9uSXRlbS5kaXNwb3NlKCk7Ci0gICAgICAgIHNob3dJblF1aWNrTWVudS5kaXNwb3NlKCk7Ci0gICAgICAgIG5ld1F1aWNrTWVudS5kaXNwb3NlKCk7Ci0vLyAgICAgICAgc2VhcmNoQ29tYm9JdGVtLmRpc3Bvc2UoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIG51bGwgb3V0IGFjdGlvbnMgdG8gbWFrZSBsZWFrIGRlYnVnZ2luZyBlYXNpZXIKLSAgICAgICAgY2xvc2VBY3Rpb24gPSBudWxsOwotICAgICAgICBjbG9zZUFsbEFjdGlvbiA9IG51bGw7Ci0gICAgICAgIGNsb3NlQWxsU2F2ZWRBY3Rpb24gPSBudWxsOwotICAgICAgICBzYXZlQWN0aW9uID0gbnVsbDsKLSAgICAgICAgc2F2ZUFsbEFjdGlvbiA9IG51bGw7Ci0gICAgICAgIG5ld1dpbmRvd0FjdGlvbiA9IG51bGw7Ci0JCW5ld0VkaXRvckFjdGlvbiA9IG51bGw7Ci0gICAgICAgIGhlbHBDb250ZW50c0FjdGlvbiA9IG51bGw7Ci0gICAgICAgIGhlbHBTZWFyY2hBY3Rpb24gPSBudWxsOwotCQlkeW5hbWljSGVscEFjdGlvbiA9IG51bGw7Ci0gICAgICAgIGFib3V0QWN0aW9uID0gbnVsbDsKLSAgICAgICAgb3BlblByZWZlcmVuY2VzQWN0aW9uID0gbnVsbDsKLSAgICAgICAgc2F2ZUFzQWN0aW9uID0gbnVsbDsKLSAgICAgICAgaGlkZVNob3dFZGl0b3JBY3Rpb24gPSBudWxsOwotICAgICAgICBzYXZlUGVyc3BlY3RpdmVBY3Rpb24gPSBudWxsOwotICAgICAgICByZXNldFBlcnNwZWN0aXZlQWN0aW9uID0gbnVsbDsKLSAgICAgICAgZWRpdEFjdGlvblNldEFjdGlvbiA9IG51bGw7Ci0gICAgICAgIGNsb3NlUGVyc3BBY3Rpb24gPSBudWxsOwotICAgICAgICBsb2NrVG9vbEJhckFjdGlvbiA9IG51bGw7Ci0gICAgICAgIGNsb3NlQWxsUGVyc3BzQWN0aW9uID0gbnVsbDsKLSAgICAgICAgc2hvd1ZpZXdNZW51QWN0aW9uID0gbnVsbDsKLSAgICAgICAgc2hvd1BhcnRQYW5lTWVudUFjdGlvbiA9IG51bGw7Ci0gICAgICAgIG5leHRQYXJ0QWN0aW9uID0gbnVsbDsKLSAgICAgICAgcHJldlBhcnRBY3Rpb24gPSBudWxsOwotICAgICAgICBuZXh0RWRpdG9yQWN0aW9uID0gbnVsbDsKLSAgICAgICAgcHJldkVkaXRvckFjdGlvbiA9IG51bGw7Ci0gICAgICAgIG5leHRQZXJzcGVjdGl2ZUFjdGlvbiA9IG51bGw7Ci0gICAgICAgIHByZXZQZXJzcGVjdGl2ZUFjdGlvbiA9IG51bGw7Ci0gICAgICAgIGFjdGl2YXRlRWRpdG9yQWN0aW9uID0gbnVsbDsKLSAgICAgICAgbWF4aW1pemVQYXJ0QWN0aW9uID0gbnVsbDsKLSAgICAgICAgbWluaW1pemVQYXJ0QWN0aW9uID0gbnVsbDsKLSAgICAgICAgc3dpdGNoVG9FZGl0b3JBY3Rpb24gPSBudWxsOwotICAgICAgICBvcGVuRWRpdG9yRHJvcERvd25BY3Rpb24gPSBudWxsOwotICAgICAgICBiYWNrd2FyZEhpc3RvcnlBY3Rpb24gPSBudWxsOwotICAgICAgICBmb3J3YXJkSGlzdG9yeUFjdGlvbiA9IG51bGw7Ci0gICAgICAgIHVuZG9BY3Rpb24gPSBudWxsOwotICAgICAgICByZWRvQWN0aW9uID0gbnVsbDsKLSAgICAgICAgY3V0QWN0aW9uID0gbnVsbDsKLSAgICAgICAgY29weUFjdGlvbiA9IG51bGw7Ci0gICAgICAgIHBhc3RlQWN0aW9uID0gbnVsbDsKLSAgICAgICAgZGVsZXRlQWN0aW9uID0gbnVsbDsKLSAgICAgICAgc2VsZWN0QWxsQWN0aW9uID0gbnVsbDsKLSAgICAgICAgZmluZEFjdGlvbiA9IG51bGw7Ci0gICAgICAgIHByaW50QWN0aW9uID0gbnVsbDsKLSAgICAgICAgcmV2ZXJ0QWN0aW9uID0gbnVsbDsKLSAgICAgICAgcmVmcmVzaEFjdGlvbiA9IG51bGw7Ci0gICAgICAgIHByb3BlcnRpZXNBY3Rpb24gPSBudWxsOwotICAgICAgICBxdWl0QWN0aW9uID0gbnVsbDsKLSAgICAgICAgbW92ZUFjdGlvbiA9IG51bGw7Ci0gICAgICAgIHJlbmFtZUFjdGlvbiA9IG51bGw7Ci0gICAgICAgIGdvSW50b0FjdGlvbiA9IG51bGw7Ci0gICAgICAgIGJhY2tBY3Rpb24gPSBudWxsOwotICAgICAgICBmb3J3YXJkQWN0aW9uID0gbnVsbDsKLSAgICAgICAgdXBBY3Rpb24gPSBudWxsOwotICAgICAgICBuZXh0QWN0aW9uID0gbnVsbDsKLSAgICAgICAgcHJldmlvdXNBY3Rpb24gPSBudWxsOwotICAgICAgICBvcGVuV29ya3NwYWNlQWN0aW9uID0gbnVsbDsKLSAgICAgICAgcHJvamVjdFByb3BlcnR5RGlhbG9nQWN0aW9uID0gbnVsbDsKLSAgICAgICAgbmV3V2l6YXJkQWN0aW9uID0gbnVsbDsKLSAgICAgICAgbmV3V2l6YXJkRHJvcERvd25BY3Rpb24gPSBudWxsOwotICAgICAgICBpbXBvcnRSZXNvdXJjZXNBY3Rpb24gPSBudWxsOwotICAgICAgICBleHBvcnRSZXNvdXJjZXNBY3Rpb24gPSBudWxsOwotICAgICAgICBidWlsZEFsbEFjdGlvbiA9IG51bGw7Ci0gICAgICAgIGNsZWFuQWN0aW9uID0gbnVsbDsKLSAgICAgICAgdG9nZ2xlQXV0b0J1aWxkQWN0aW9uID0gbnVsbDsKLSAgICAgICAgYnVpbGRXb3JraW5nU2V0TWVudSA9IG51bGw7Ci0gICAgICAgIHF1aWNrU3RhcnRBY3Rpb24gPSBudWxsOwotICAgICAgICB0aXBzQW5kVHJpY2tzQWN0aW9uID0gbnVsbDsKLSAgICAgICAgc2hvd0luUXVpY2tNZW51ID0gbnVsbDsKLSAgICAgICAgbmV3UXVpY2tNZW51ID0gbnVsbDsKLSAgICAgICAgYWRkQm9va21hcmtBY3Rpb24gPSBudWxsOwotICAgICAgICBhZGRUYXNrQWN0aW9uID0gbnVsbDsKLSAgICAgICAgYnVpbGRQcm9qZWN0QWN0aW9uID0gbnVsbDsKLSAgICAgICAgb3BlblByb2plY3RBY3Rpb24gPSBudWxsOwotICAgICAgICBjbG9zZVByb2plY3RBY3Rpb24gPSBudWxsOwotICAgICAgICBuZXdXaXphcmRNZW51ID0gbnVsbDsKLSAgICAgICAgcGluRWRpdG9yQ29udHJpYnV0aW9uSXRlbSA9IG51bGw7Ci0vLyAgICAgICAgc2VhcmNoQ29tYm9JdGVtID0gbnVsbDsKLSAgICAgICAgc3RhdHVzTGluZUl0ZW0gPSBudWxsOwotICAgICAgICBwcmVmTGlzdGVuZXIgPSBudWxsOwotICAgICAgICBwcm9wUHJlZkxpc3RlbmVyID0gbnVsbDsKLSAgICAgICAgaW50cm9BY3Rpb24gPSBudWxsOwotICAgICAgICAKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlTW9kZUxpbmUoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgc3RhdHVzTGluZUl0ZW0uc2V0VGV4dCh0ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1lbnUgd2l0aCB0aGUgZ2l2ZW4gSUQgc2hvdWxkCi0gICAgICogYmUgY29uc2lkZXJlZCBhcyBhbiBPTEUgY29udGFpbmVyIG1lbnUuIENvbnRhaW5lciBtZW51cwotICAgICAqIGFyZSBwcmVzZXJ2ZWQgaW4gT0xFIG1lbnUgbWVyZ2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uTWVudShTdHJpbmcgbWVudUlkKSB7Ci0gICAgICAgIGlmIChtZW51SWQuZXF1YWxzKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9GSUxFKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAobWVudUlkLmVxdWFscyhJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fV0lORE9XKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IGdpdmVuIGlkIG1hdGNoZXMgdGhlIGlkIG9mIHRoZSBjb29saXRlbXMgdGhhdAotICAgICAqIHRoZSB3b3JrYmVuY2ggY3JlYXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dvcmtiZW5jaENvb2xJdGVtSWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGlmIChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlRPT0xCQVJfRklMRS5lcXVhbHNJZ25vcmVDYXNlKGlkKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5UT09MQkFSX05BVklHQVRFLmVxdWFsc0lnbm9yZUNhc2UoaWQpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxscyB0aGUgc3RhdHVzIGxpbmUgd2l0aCB0aGUgd29ya2JlbmNoIGNvbnRyaWJ1dGlvbiBpdGVtcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZSkgewotICAgICAgICBzdGF0dXNMaW5lLmFkZChzdGF0dXNMaW5lSXRlbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhY3Rpb25zIChhbmQgY29udHJpYnV0aW9uIGl0ZW1zKSBmb3IgdGhlIG1lbnUgYmFyLCB0b29sYmFyIGFuZCBzdGF0dXMgbGluZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucyhmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCi0gICAgICAgIC8vIEBpc3N1ZSBzaG91bGQgb2J0YWluIGZyb20gQ29uZmlndXJhdGlvbkl0ZW1GYWN0b3J5Ci0gICAgICAgIHN0YXR1c0xpbmVJdGVtID0gbmV3IFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtKCJNb2RlQ29udHJpYnV0aW9uSXRlbSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgbmV3V2l6YXJkQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5ORVcuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKG5ld1dpemFyZEFjdGlvbik7Ci0KLSAgICAgICAgbmV3V2l6YXJkRHJvcERvd25BY3Rpb24gPSBJREVBY3Rpb25GYWN0b3J5Lk5FV19XSVpBUkRfRFJPUF9ET1dOCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihuZXdXaXphcmREcm9wRG93bkFjdGlvbik7Ci0KLSAgICAgICAgaW1wb3J0UmVzb3VyY2VzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5JTVBPUlQuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGltcG9ydFJlc291cmNlc0FjdGlvbik7Ci0KLSAgICAgICAgZXhwb3J0UmVzb3VyY2VzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5FWFBPUlQuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGV4cG9ydFJlc291cmNlc0FjdGlvbik7Ci0gICAgICAgIAotICAgICAgICBidWlsZEFsbEFjdGlvbiA9IElERUFjdGlvbkZhY3RvcnkuQlVJTEQuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGJ1aWxkQWxsQWN0aW9uKTsKLQotICAgICAgICBjbGVhbkFjdGlvbiA9IElERUFjdGlvbkZhY3RvcnkuQlVJTERfQ0xFQU4uY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGNsZWFuQWN0aW9uKTsKLQotICAgICAgICB0b2dnbGVBdXRvQnVpbGRBY3Rpb24gPSBJREVBY3Rpb25GYWN0b3J5LkJVSUxEX0FVVE9NQVRJQ0FMTFkKLSAgICAgICAgICAgICAgICAuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKHRvZ2dsZUF1dG9CdWlsZEFjdGlvbik7Ci0KLSAgICAgICAgc2F2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuU0FWRS5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIoc2F2ZUFjdGlvbik7Ci0KLSAgICAgICAgc2F2ZUFzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5TQVZFX0FTLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihzYXZlQXNBY3Rpb24pOwotCi0gICAgICAgIHNhdmVBbGxBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlNBVkVfQUxMLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihzYXZlQWxsQWN0aW9uKTsKLQkJCi0gICAgICAgIG5ld1dpbmRvd0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuT1BFTl9ORVdfV0lORE9XLmNyZWF0ZShnZXRXaW5kb3coKSk7Ci0gICAgICAgIG5ld1dpbmRvd0FjdGlvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9vcGVuTmV3V2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIobmV3V2luZG93QWN0aW9uKTsKLQotCQluZXdFZGl0b3JBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk5FV19FRElUT1IuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG5ld0VkaXRvckFjdGlvbik7Ci0KLSAgICAgICAgdW5kb0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuVU5ETy5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIodW5kb0FjdGlvbik7Ci0KLSAgICAgICAgcmVkb0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUkVETy5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIocmVkb0FjdGlvbik7Ci0KLSAgICAgICAgY3V0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DVVQuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGN1dEFjdGlvbik7Ci0KLSAgICAgICAgY29weUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQ09QWS5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIoY29weUFjdGlvbik7Ci0KLSAgICAgICAgcGFzdGVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlBBU1RFLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihwYXN0ZUFjdGlvbik7Ci0KLSAgICAgICAgcHJpbnRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlBSSU5ULmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihwcmludEFjdGlvbik7Ci0KLSAgICAgICAgc2VsZWN0QWxsQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihzZWxlY3RBbGxBY3Rpb24pOwotCi0gICAgICAgIGZpbmRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkZJTkQuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGZpbmRBY3Rpb24pOwotCi0gICAgICAgIGNsb3NlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DTE9TRS5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIoY2xvc2VBY3Rpb24pOwotCi0gICAgICAgIGNsb3NlQWxsQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DTE9TRV9BTEwuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGNsb3NlQWxsQWN0aW9uKTsKLQotICAgICAgICBjbG9zZUFsbFNhdmVkQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DTE9TRV9BTExfU0FWRUQuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGNsb3NlQWxsU2F2ZWRBY3Rpb24pOwotCi0gICAgICAgIGhlbHBDb250ZW50c0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuSEVMUF9DT05URU5UUy5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIoaGVscENvbnRlbnRzQWN0aW9uKTsKLQotICAgICAgICBoZWxwU2VhcmNoQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5IRUxQX1NFQVJDSC5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIoaGVscFNlYXJjaEFjdGlvbik7Ci0JCQotICAgICAgICBkeW5hbWljSGVscEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuRFlOQU1JQ19IRUxQLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihkeW5hbWljSGVscEFjdGlvbik7Ci0gICAgICAgIAotICAgICAgICBhYm91dEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQUJPVVQuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIGFib3V0QWN0aW9uCi0gICAgICAgICAgICAgICAgLnNldEltYWdlRGVzY3JpcHRvcihJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19ERUZBVUxUX1BST0QpKTsKLSAgICAgICAgcmVnaXN0ZXIoYWJvdXRBY3Rpb24pOwotCi0gICAgICAgIG9wZW5QcmVmZXJlbmNlc0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUFJFRkVSRU5DRVMuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKG9wZW5QcmVmZXJlbmNlc0FjdGlvbik7Ci0KLSAgICAgICAgYWRkQm9va21hcmtBY3Rpb24gPSBJREVBY3Rpb25GYWN0b3J5LkJPT0tNQVJLLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihhZGRCb29rbWFya0FjdGlvbik7Ci0KLSAgICAgICAgYWRkVGFza0FjdGlvbiA9IElERUFjdGlvbkZhY3RvcnkuQUREX1RBU0suY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGFkZFRhc2tBY3Rpb24pOwotCi0gICAgICAgIGRlbGV0ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuREVMRVRFLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihkZWxldGVBY3Rpb24pOwotCi0gICAgICAgIG1ha2VGZWF0dXJlRGVwZW5kZW50QWN0aW9ucyh3aW5kb3cpOwotCi0gICAgICAgIC8vIEFjdGlvbnMgZm9yIGludmlzaWJsZSBhY2NlbGVyYXRvcnMKLSAgICAgICAgc2hvd1ZpZXdNZW51QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5TSE9XX1ZJRVdfTUVOVS5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIoc2hvd1ZpZXdNZW51QWN0aW9uKTsKLQotICAgICAgICBzaG93UGFydFBhbmVNZW51QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5TSE9XX1BBUlRfUEFORV9NRU5VCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihzaG93UGFydFBhbmVNZW51QWN0aW9uKTsKLQotICAgICAgICBuZXh0RWRpdG9yQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5ORVhUX0VESVRPUi5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIobmV4dEVkaXRvckFjdGlvbik7Ci0gICAgICAgIHByZXZFZGl0b3JBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlBSRVZJT1VTX0VESVRPUi5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIocHJldkVkaXRvckFjdGlvbik7Ci0gICAgICAgIEFjdGlvbkZhY3RvcnkubGlua0N5Y2xlQWN0aW9uUGFpcihuZXh0RWRpdG9yQWN0aW9uLCBwcmV2RWRpdG9yQWN0aW9uKTsKLQotICAgICAgICBuZXh0UGFydEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVYVF9QQVJULmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihuZXh0UGFydEFjdGlvbik7Ci0gICAgICAgIHByZXZQYXJ0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VU19QQVJULmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihwcmV2UGFydEFjdGlvbik7Ci0gICAgICAgIEFjdGlvbkZhY3RvcnkubGlua0N5Y2xlQWN0aW9uUGFpcihuZXh0UGFydEFjdGlvbiwgcHJldlBhcnRBY3Rpb24pOwotCi0gICAgICAgIG5leHRQZXJzcGVjdGl2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVYVF9QRVJTUEVDVElWRQotICAgICAgICAgICAgICAgIC5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIobmV4dFBlcnNwZWN0aXZlQWN0aW9uKTsKLSAgICAgICAgcHJldlBlcnNwZWN0aXZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VU19QRVJTUEVDVElWRQotICAgICAgICAgICAgICAgIC5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIocHJldlBlcnNwZWN0aXZlQWN0aW9uKTsKLSAgICAgICAgQWN0aW9uRmFjdG9yeS5saW5rQ3ljbGVBY3Rpb25QYWlyKG5leHRQZXJzcGVjdGl2ZUFjdGlvbiwKLSAgICAgICAgICAgICAgICBwcmV2UGVyc3BlY3RpdmVBY3Rpb24pOwotCi0gICAgICAgIGFjdGl2YXRlRWRpdG9yQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5BQ1RJVkFURV9FRElUT1IKLSAgICAgICAgICAgICAgICAuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGFjdGl2YXRlRWRpdG9yQWN0aW9uKTsKLQotICAgICAgICBtYXhpbWl6ZVBhcnRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk1BWElNSVpFLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihtYXhpbWl6ZVBhcnRBY3Rpb24pOwotCi0JCW1pbmltaXplUGFydEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTUlOSU1JWkUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG1pbmltaXplUGFydEFjdGlvbik7Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2hUb0VkaXRvckFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuU0hPV19PUEVOX0VESVRPUlMKLSAgICAgICAgICAgICAgICAuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKHN3aXRjaFRvRWRpdG9yQWN0aW9uKTsKLQotICAgICAgICBvcGVuRWRpdG9yRHJvcERvd25BY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlNIT1dfV09SS0JPT0tfRURJVE9SUwotICAgICAgICAgICAgICAgIC5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIob3BlbkVkaXRvckRyb3BEb3duQWN0aW9uKTsKLQotICAgICAgICBoaWRlU2hvd0VkaXRvckFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuU0hPV19FRElUT1IuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGhpZGVTaG93RWRpdG9yQWN0aW9uKTsKLSAgICAgICAgc2F2ZVBlcnNwZWN0aXZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5TQVZFX1BFUlNQRUNUSVZFCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihzYXZlUGVyc3BlY3RpdmVBY3Rpb24pOwotICAgICAgICBlZGl0QWN0aW9uU2V0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5FRElUX0FDVElPTl9TRVRTCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihlZGl0QWN0aW9uU2V0QWN0aW9uKTsKLSAgICAgICAgbG9ja1Rvb2xCYXJBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkxPQ0tfVE9PTF9CQVIuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGxvY2tUb29sQmFyQWN0aW9uKTsKLSAgICAgICAgcmVzZXRQZXJzcGVjdGl2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUkVTRVRfUEVSU1BFQ1RJVkUKLSAgICAgICAgICAgICAgICAuY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKHJlc2V0UGVyc3BlY3RpdmVBY3Rpb24pOwotICAgICAgICBjbG9zZVBlcnNwQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DTE9TRV9QRVJTUEVDVElWRS5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIoY2xvc2VQZXJzcEFjdGlvbik7Ci0gICAgICAgIGNsb3NlQWxsUGVyc3BzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DTE9TRV9BTExfUEVSU1BFQ1RJVkVTCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihjbG9zZUFsbFBlcnNwc0FjdGlvbik7Ci0KLSAgICAgICAgZm9yd2FyZEhpc3RvcnlBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkZPUldBUkRfSElTVE9SWQotICAgICAgICAgICAgICAgIC5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIoZm9yd2FyZEhpc3RvcnlBY3Rpb24pOwotCi0gICAgICAgIGJhY2t3YXJkSGlzdG9yeUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQkFDS1dBUkRfSElTVE9SWQotICAgICAgICAgICAgICAgIC5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIoYmFja3dhcmRIaXN0b3J5QWN0aW9uKTsKLQotICAgICAgICByZXZlcnRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlJFVkVSVC5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIocmV2ZXJ0QWN0aW9uKTsKLQotICAgICAgICByZWZyZXNoQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5SRUZSRVNILmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihyZWZyZXNoQWN0aW9uKTsKLQotICAgICAgICBwcm9wZXJ0aWVzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUk9QRVJUSUVTLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3Rlcihwcm9wZXJ0aWVzQWN0aW9uKTsKLQotICAgICAgICBxdWl0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5RVUlULmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihxdWl0QWN0aW9uKTsKLQotICAgICAgICBtb3ZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5NT1ZFLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3Rlcihtb3ZlQWN0aW9uKTsKLQotICAgICAgICByZW5hbWVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlJFTkFNRS5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIocmVuYW1lQWN0aW9uKTsKLQotICAgICAgICBnb0ludG9BY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkdPX0lOVE8uY3JlYXRlKHdpbmRvdyk7Ci0gICAgICAgIHJlZ2lzdGVyKGdvSW50b0FjdGlvbik7Ci0KLSAgICAgICAgYmFja0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQkFDSy5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIoYmFja0FjdGlvbik7Ci0KLSAgICAgICAgZm9yd2FyZEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuRk9SV0FSRC5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIoZm9yd2FyZEFjdGlvbik7Ci0KLSAgICAgICAgdXBBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlVQLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3Rlcih1cEFjdGlvbik7Ci0KLSAgICAgICAgbmV4dEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVYVC5jcmVhdGUod2luZG93KTsKLSAgICAgICAgbmV4dEFjdGlvbgotICAgICAgICAgICAgICAgIC5zZXRJbWFnZURlc2NyaXB0b3IoSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0VUT09MX05FWFRfTkFWKSk7Ci0gICAgICAgIHJlZ2lzdGVyKG5leHRBY3Rpb24pOwotCi0gICAgICAgIHByZXZpb3VzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VUy5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcHJldmlvdXNBY3Rpb24KLSAgICAgICAgICAgICAgICAuc2V0SW1hZ2VEZXNjcmlwdG9yKElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19FVE9PTF9QUkVWSU9VU19OQVYpKTsKLSAgICAgICAgcmVnaXN0ZXIocHJldmlvdXNBY3Rpb24pOwotCi0gICAgICAgIGJ1aWxkUHJvamVjdEFjdGlvbiA9IElERUFjdGlvbkZhY3RvcnkuQlVJTERfUFJPSkVDVC5jcmVhdGUod2luZG93KTsKLSAgICAgICAgcmVnaXN0ZXIoYnVpbGRQcm9qZWN0QWN0aW9uKTsKLQotICAgICAgICBvcGVuUHJvamVjdEFjdGlvbiA9IElERUFjdGlvbkZhY3RvcnkuT1BFTl9QUk9KRUNULmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihvcGVuUHJvamVjdEFjdGlvbik7Ci0KLSAgICAgICAgY2xvc2VQcm9qZWN0QWN0aW9uID0gSURFQWN0aW9uRmFjdG9yeS5DTE9TRV9QUk9KRUNULmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihjbG9zZVByb2plY3RBY3Rpb24pOwotCi0gICAgICAgIG9wZW5Xb3Jrc3BhY2VBY3Rpb24gPSBJREVBY3Rpb25GYWN0b3J5Lk9QRU5fV09SS1NQQUNFCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihvcGVuV29ya3NwYWNlQWN0aW9uKTsKLQotICAgICAgICBwcm9qZWN0UHJvcGVydHlEaWFsb2dBY3Rpb24gPSBJREVBY3Rpb25GYWN0b3J5Lk9QRU5fUFJPSkVDVF9QUk9QRVJUSUVTCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3Rlcihwcm9qZWN0UHJvcGVydHlEaWFsb2dBY3Rpb24pOwotCi0gICAgICAgIGlmICh3aW5kb3cuZ2V0V29ya2JlbmNoKCkuZ2V0SW50cm9NYW5hZ2VyKCkuaGFzSW50cm8oKSkgewotICAgICAgICAgICAgaW50cm9BY3Rpb24gPSBBY3Rpb25GYWN0b3J5LklOVFJPLmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICAgICAgcmVnaXN0ZXIoaW50cm9BY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNob3dJblF1aWNrTWVudUlkID0gIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLnNob3dJblF1aWNrTWVudSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2hvd0luUXVpY2tNZW51ID0gbmV3IFF1aWNrTWVudUFjdGlvbihzaG93SW5RdWlja01lbnVJZCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZChDb250cmlidXRpb25JdGVtRmFjdG9yeS5WSUVXU19TSE9XX0lOCi0gICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKHdpbmRvdykpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICByZWdpc3RlcihzaG93SW5RdWlja01lbnUpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdRdWlja01lbnVJZCA9ICJvcmcuZWNsaXBzZS51aS5maWxlLm5ld1F1aWNrTWVudSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbmV3UXVpY2tNZW51ID0gbmV3IFF1aWNrTWVudUFjdGlvbihuZXdRdWlja01lbnVJZCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZChuZXcgTmV3V2l6YXJkTWVudSh3aW5kb3cpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgcmVnaXN0ZXIobmV3UXVpY2tNZW51KTsKLQotICAgICAgICBwaW5FZGl0b3JDb250cmlidXRpb25JdGVtID0gQ29udHJpYnV0aW9uSXRlbUZhY3RvcnkuUElOX0VESVRPUgotICAgICAgICAgICAgICAgIC5jcmVhdGUod2luZG93KTsKLSAgICAgICAgCi0vLyAgICAgICAgc2VhcmNoQ29tYm9JdGVtID0gQ29udHJpYnV0aW9uSXRlbUZhY3RvcnkuSEVMUF9TRUFSQ0guY3JlYXRlKHdpbmRvdyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZmVhdHVyZS1kZXBlbmRlbnQgYWN0aW9ucyBmb3IgdGhlIG1lbnUgYmFyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtYWtlRmVhdHVyZURlcGVuZGVudEFjdGlvbnMoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgQWJvdXRJbmZvW10gaW5mb3MgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBwcmVmcyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBhdm9pZCBvYnRhaW5pbmcgdGhlIGFib3V0IGluZm9zIGlmIHRoZSBwbGF0Zm9ybSBzdGF0ZSBpcwotICAgICAgICAvLyB1bmNoYW5nZWQgZnJvbSBsYXN0IHRpbWUuICBTZWUgYnVnIDc1MTMwIGZvciBkZXRhaWxzLgotICAgICAgICBTdHJpbmcgc3RhdGVLZXkgPSAicGxhdGZvcm1TdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIHByZXZTdGF0ZSA9IHByZWZzLmdldFN0cmluZyhzdGF0ZUtleSk7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50U3RhdGUgPSBTdHJpbmcudmFsdWVPZihQbGF0Zm9ybS5nZXRTdGF0ZVN0YW1wKCkpOwotICAgICAgICBib29sZWFuIHNhbWVTdGF0ZSA9IGN1cnJlbnRTdGF0ZS5lcXVhbHMocHJldlN0YXRlKTsKLSAgICAgICAgaWYgKCFzYW1lU3RhdGUpIHsKLSAgICAgICAgCXByZWZzLnB1dFZhbHVlKHN0YXRlS2V5LCBjdXJyZW50U3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBTZWUgaWYgYSB3ZWxjb21lIHBhZ2UgaXMgc3BlY2lmaWVkLgotICAgICAgICAvLyBPcHRpbWl6YXRpb246IGlmIHdlbGNvbWUgcGFnZXMgd2VyZSBmb3VuZCBvbiBhIHByZXZpb3VzIHJ1biwgdGhlbiBqdXN0IGFkZCB0aGUgYWN0aW9uLgotICAgICAgICBTdHJpbmcgcXVpY2tTdGFydEtleSA9IElERUFjdGlvbkZhY3RvcnkuUVVJQ0tfU1RBUlQuZ2V0SWQoKTsgCi0gICAgICAgIFN0cmluZyBzaG93UXVpY2tTdGFydCA9IHByZWZzLmdldFN0cmluZyhxdWlja1N0YXJ0S2V5KTsKLSAgICAgICAgaWYgKHNhbWVTdGF0ZSAmJiAidHJ1ZSIuZXF1YWxzKHNob3dRdWlja1N0YXJ0KSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBxdWlja1N0YXJ0QWN0aW9uID0gSURFQWN0aW9uRmFjdG9yeS5RVUlDS19TVEFSVC5jcmVhdGUod2luZG93KTsKLQkJCXJlZ2lzdGVyKHF1aWNrU3RhcnRBY3Rpb24pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNhbWVTdGF0ZSAmJiAiZmFsc2UiLmVxdWFscyhzaG93UXVpY2tTdGFydCkpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAJLy8gZG8gbm90aGluZwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAJLy8gZG8gdGhlIHdvcmsKLSAgICAJCWluZm9zID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRGZWF0dXJlSW5mb3MoKTsKLSAgICAgICAgCWJvb2xlYW4gZm91bmQgPSBoYXNXZWxjb21lUGFnZShpbmZvcyk7Ci0gICAgICAgICAgICBwcmVmcy5zZXRWYWx1ZShxdWlja1N0YXJ0S2V5LCBmb3VuZCk7Ci0gICAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgICAgICBxdWlja1N0YXJ0QWN0aW9uID0gSURFQWN0aW9uRmFjdG9yeS5RVUlDS19TVEFSVC5jcmVhdGUod2luZG93KTsKLSAgICAgICAgICAgICAgICByZWdpc3RlcihxdWlja1N0YXJ0QWN0aW9uKTsKLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU2VlIGlmIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgaXMgc3BlY2lmaWVkLgotICAgICAgICAvLyBPcHRpbWl6YXRpb246IGlmIHRpcHMgYW5kIHRyaWNrcyB3ZXJlIGZvdW5kIG9uIGEgcHJldmlvdXMgcnVuLCB0aGVuIGp1c3QgYWRkIHRoZSBhY3Rpb24uCi0gICAgICAgIFN0cmluZyB0aXBzQW5kVHJpY2tzS2V5ID0gSURFQWN0aW9uRmFjdG9yeS5USVBTX0FORF9UUklDS1MuZ2V0SWQoKTsKLSAgICAgICAgU3RyaW5nIHNob3dUaXBzQW5kVHJpY2tzID0gcHJlZnMuZ2V0U3RyaW5nKHRpcHNBbmRUcmlja3NLZXkpOwotICAgICAgICBpZiAoc2FtZVN0YXRlICYmICJ0cnVlIi5lcXVhbHMoc2hvd1RpcHNBbmRUcmlja3MpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHRpcHNBbmRUcmlja3NBY3Rpb24gPSBJREVBY3Rpb25GYWN0b3J5LlRJUFNfQU5EX1RSSUNLUwotCQkJCQkuY3JlYXRlKHdpbmRvdyk7Ci0JCQlyZWdpc3Rlcih0aXBzQW5kVHJpY2tzQWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzYW1lU3RhdGUgJiYgImZhbHNlIi5lcXVhbHMoc2hvd1RpcHNBbmRUcmlja3MpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCS8vIGRvIG5vdGhpbmcKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgCS8vIGRvIHRoZSB3b3JrCi0JICAgIAlpZiAoaW5mb3MgPT0gbnVsbCkgewotCSAgICAJCWluZm9zID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRGZWF0dXJlSW5mb3MoKTsKLQkgICAgCX0KLQkgICAgCWJvb2xlYW4gZm91bmQgPSBoYXNUaXBzQW5kVHJpY2tzKGluZm9zKTsKLQkgICAgCXByZWZzLnNldFZhbHVlKHRpcHNBbmRUcmlja3NLZXksIGZvdW5kKTsKLQkgICAgCWlmIChmb3VuZCkgewotCSAgICAgICAgICAgIHRpcHNBbmRUcmlja3NBY3Rpb24gPSBJREVBY3Rpb25GYWN0b3J5LlRJUFNfQU5EX1RSSUNLUwotCQkJCQkJLmNyZWF0ZSh3aW5kb3cpOwotCQkJCXJlZ2lzdGVyKHRpcHNBbmRUcmlja3NBY3Rpb24pOwotCQkgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIGFueSBvZiB0aGUgZ2l2ZW4gaW5mb3MgaGF2ZSBhIHdlbGNvbWUgcGFnZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5mb3MgdGhlIGluZm9zCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHdlbGNvbWUgcGFnZSB3YXMgZm91bmQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzV2VsY29tZVBhZ2UoQWJvdXRJbmZvW10gaW5mb3MpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGluZm9zW2ldLmdldFdlbGNvbWVQYWdlVVJMKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgCXJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYW55IG9mIHRoZSBnaXZlbiBpbmZvcyBoYXZlIHRpcHMgYW5kIHRyaWNrcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5mb3MgdGhlIGluZm9zCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aXBzIGFuZCB0cmlja3Mgd2VyZSBmb3VuZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNUaXBzQW5kVHJpY2tzKEFib3V0SW5mb1tdIGluZm9zKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpbmZvc1tpXS5nZXRUaXBzQW5kVHJpY2tzSHJlZigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBidWlsZCBhY3Rpb25zIG9uIHRoZSB0b29sYmFyIGFuZCBtZW51IGJhciBiYXNlZCBvbiB0aGUgY3VycmVudAotCSAqIHN0YXRlIG9mIGF1dG9idWlsZC4gVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQuCi0JICogCi0JICogQHBhcmFtIGltbWVkaWF0ZWx5Ci0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byB1cGRhdGUgdGhlIGFjdGlvbnMgaW1tZWRpYXRlbHksCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gcXVldWUgdGhlIHVwZGF0ZSB0byBiZSBydW4gaW4gdGhlCi0JICogICAgICAgICAgICBldmVudCBsb29wCi0JICovCi0gICAgdm9pZCB1cGRhdGVCdWlsZEFjdGlvbnMoYm9vbGVhbiBpbW1lZGlhdGVseSkgewotICAgICAgICAvLyB0aGlzIGNhbiBiZSB0cmlnZ2VyZWQgYnkgcHJvcGVydHkgb3IgcmVzb3VyY2UgY2hhbmdlIG5vdGlmaWNhdGlvbnMKLSAgICAgICAgUnVubmFibGUgdXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGlmIChpc0Rpc3Bvc2VkKQotICAgICAgICAgICAgICAgIAlyZXR1cm47Ci0JCSAgICAJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJICAgIAlib29sZWFuIGVuYWJsZWQgPSBCdWlsZFV0aWxpdGllcy5pc0VuYWJsZWQocHJvamVjdHMsIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQpOwotCQkgICAgICAgIC8vdXBkYXRlIG1lbnUgYmFyIGFjdGlvbnMgaW4gcHJvamVjdCBtZW51Ci0JCSAgICAgICAgYnVpbGRBbGxBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJICAgICAgICBidWlsZFByb2plY3RBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJICAgICAgICB0b2dnbGVBdXRvQnVpbGRBY3Rpb24uc2V0Q2hlY2tlZCh3b3Jrc3BhY2UuaXNBdXRvQnVpbGRpbmcoKSk7Ci0JCSAgICAgICAgY2xlYW5BY3Rpb24uc2V0RW5hYmxlZChCdWlsZFV0aWxpdGllcy5pc0VuYWJsZWQocHJvamVjdHMsIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQpKTsKLQkJCi0JCSAgICAgICAgLy91cGRhdGUgdGhlIGNvb2wgYmFyIGJ1aWxkIGJ1dHRvbgotCQkgICAgICAgIElDb29sQmFyTWFuYWdlciBjb29sQmFyTWFuYWdlciA9IGdldEFjdGlvbkJhckNvbmZpZ3VyZXIoKQotCQkgICAgICAgICAgICAgICAgLmdldENvb2xCYXJNYW5hZ2VyKCk7Ci0JCSAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gY2JJdGVtID0gY29vbEJhck1hbmFnZXIKLQkJICAgICAgICAgICAgICAgIC5maW5kKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuVE9PTEJBUl9GSUxFKTsKLQkJICAgICAgICBpZiAoIShjYkl0ZW0gaW5zdGFuY2VvZiBUb29sQmFyQ29udHJpYnV0aW9uSXRlbSkpIHsKLQkJICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbgotCQkgICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4ubG9nKCJGaWxlIHRvb2xiYXIgY29udHJpYnV0aW9uIGl0ZW0gaXMgbWlzc2luZyIpOyAvLyROT04tTkxTLTEkCi0JCSAgICAgICAgICAgIHJldHVybjsKLQkJICAgICAgICB9Ci0JCSAgICAgICAgVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0gdG9vbEJhckl0ZW0gPSAoVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0pIGNiSXRlbTsKLQkJICAgICAgICBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIgPSB0b29sQmFySXRlbS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQkgICAgICAgIGlmICh0b29sQmFyTWFuYWdlciA9PSBudWxsKSB7Ci0JCSAgICAgICAgICAgIC8vIGVycm9yIGlmIHRoaXMgaGFwcGVucywgZmlsZSB0b29sYmFyIGFzc3VtZWQgdG8gYWx3YXlzIGV4aXN0Ci0JCSAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5sb2coIkZpbGUgdG9vbGJhciBpcyBtaXNzaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJICAgICAgICAgICAgcmV0dXJuOwotCQkgICAgICAgIH0KLQkJICAgICAgICAvL2FkZCB0aGUgYnVpbGQgYnV0dG9uIGlmIGJ1aWxkIGFjdGlvbnMgYXJlIGVuYWJsZWQsIGFuZCByZW1vdmUgaXQgb3RoZXJ3aXNlCi0JCSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IHRvb2xCYXJNYW5hZ2VyLmZpbmQoYnVpbGRBbGxBY3Rpb24uZ2V0SWQoKSkgIT0gbnVsbDsKLQkJICAgICAgICBpZiAoZW5hYmxlZCAmJiAhZm91bmQpIHsKLQkJICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIuYXBwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkJVSUxEX0dST1VQLAotCQkgICAgICAgICAgICAgICAgICAgIGJ1aWxkQWxsQWN0aW9uKTsKLQkJICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIudXBkYXRlKGZhbHNlKTsKLQkJICAgICAgICAgICAgdG9vbEJhckl0ZW0udXBkYXRlKElDb29sQmFyTWFuYWdlci5TSVpFKTsKLQkJICAgICAgICB9IGVsc2UgaWYgKGJ1aWxkQWxsQWN0aW9uICE9IG51bGwgJiYgZm91bmQgJiYgIWVuYWJsZWQpIHsKLQkJICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIucmVtb3ZlKGJ1aWxkQWxsQWN0aW9uLmdldElkKCkpOwotCQkgICAgICAgICAgICB0b29sQmFyTWFuYWdlci51cGRhdGUoZmFsc2UpOwotCQkgICAgICAgICAgICB0b29sQmFySXRlbS51cGRhdGUoSUNvb2xCYXJNYW5hZ2VyLlNJWkUpOwotCQkgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgaWYgKGltbWVkaWF0ZWx5KSB7Ci0gICAgICAgIAl1cGRhdGUucnVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0JICAgICAgICAvLyBEaXNwYXRjaCB0aGUgdXBkYXRlIHRvIGJlIHJ1biBsYXRlciBpbiB0aGUgVUkgdGhyZWFkLgotCSAgICAgICAgLy8gVGhpcyBoZWxwcyB0byByZWR1Y2UgZmxpY2tlciBpZiBhdXRvYnVpbGQgaXMgYmVpbmcgdGVtcG9yYXJpbHkgZGlzYWJsZWQgcHJvZ3JhbW1hdGljYWxseS4KLQkgICAgICAgIFNoZWxsIHNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7Ci0JICAgICAgICBpZiAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgIAkJc2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyh1cGRhdGUpOwotCSAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0JLyoqCi0gICAgICogVXBkYXRlIHRoZSBwaW4gYWN0aW9uJ3MgdG9vbCBiYXIKLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVBpbkFjdGlvblRvb2xiYXIoKSB7Ci0KLSAgICAgICAgSUNvb2xCYXJNYW5hZ2VyIGNvb2xCYXJNYW5hZ2VyID0gZ2V0QWN0aW9uQmFyQ29uZmlndXJlcigpCi0gICAgICAgICAgICAgICAgLmdldENvb2xCYXJNYW5hZ2VyKCk7Ci0gICAgICAgIElDb250cmlidXRpb25JdGVtIGNiSXRlbSA9IGNvb2xCYXJNYW5hZ2VyCi0gICAgICAgICAgICAgICAgLmZpbmQoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5UT09MQkFSX05BVklHQVRFKTsKLSAgICAgICAgaWYgKCEoY2JJdGVtIGluc3RhbmNlb2YgVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0pKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCi0gICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4KLSAgICAgICAgICAgICAgICAgICAgLmxvZygiTmF2aWdhdGlvbiB0b29sYmFyIGNvbnRyaWJ1dGlvbiBpdGVtIGlzIG1pc3NpbmciKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFRvb2xCYXJDb250cmlidXRpb25JdGVtIHRvb2xCYXJJdGVtID0gKFRvb2xCYXJDb250cmlidXRpb25JdGVtKSBjYkl0ZW07Ci0gICAgICAgIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciA9IHRvb2xCYXJJdGVtLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0gICAgICAgIGlmICh0b29sQmFyTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBlcnJvciBpZiB0aGlzIGhhcHBlbnMsIG5hdmlnYXRpb24gdG9vbGJhciBhc3N1bWVkIHRvIGFsd2F5cyBleGlzdAotICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmxvZygiTmF2aWdhdGUgdG9vbGJhciBpcyBtaXNzaW5nIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLnVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIHRvb2xCYXJJdGVtLnVwZGF0ZShJQ29vbEJhck1hbmFnZXIuU0laRSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9hY3Rpb25zL0J1aWxkQ2xlYW5BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvYWN0aW9ucy9CdWlsZENsZWFuQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjE0ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9hY3Rpb25zL0J1aWxkQ2xlYW5BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuQ2xlYW5EaWFsb2c7Ci0KLS8qKgotICogVGhlIGNsZWFuIGFjdGlvbiByZXBsYWNlcyB0aGUgcmVidWlsZCBhY3Rpb25zLiBDbGVhbiB3aWxsIGRpc2NhcmQgYWxsIGJ1aWx0Ci0gKiBzdGF0ZSBmb3IgYWxsIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UsIGFuZCBkZWxldGVzIGFsbCBwcm9ibGVtIG1hcmtlcnMuCi0gKiBUaGUgbmV4dCB0aW1lIGEgYnVpbGQgaXMgcnVuLCBwcm9qZWN0cyB3aWxsIGhhdmUgdG8gYmUgYnVpbHQgZnJvbSBzY3JhdGNoLgotICogVGVjaG5pY2FsbHkgdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBhbiBpbmNyZW1lbnRhbCBidWlsZGVyIG1pc2JlaGF2ZXMuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEJ1aWxkQ2xlYW5BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb25GYWN0b3J5LklXb3JrYmVuY2hBY3Rpb24gewotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEJ1aWxkQ2xlYW5BY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gd2luZG93IFRoZSB3aW5kb3cgZm9yIHBhcmVudGluZyB0aGlzIGFjdGlvbgotCSAqLwotCXB1YmxpYyBCdWlsZENsZWFuQWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXN1cGVyKElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9idWlsZENsZWFuKTsKLQkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS51aS5wcm9qZWN0LmNsZWFuQWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5LklXb3JrYmVuY2hBY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9ub3RoaW5nIHRvIGRpc3Bvc2UKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUlQcm9qZWN0W10gc2VsZWN0ZWQgPSBCdWlsZFV0aWxpdGllcy5maW5kU2VsZWN0ZWRQcm9qZWN0cyh3aW5kb3cpOwotCQluZXcgQ2xlYW5EaWFsb2cod2luZG93LCBzZWxlY3RlZCkub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvYWN0aW9ucy9CdWlsZFNldEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9hY3Rpb25zL0J1aWxkU2V0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1M2Y3M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9hY3Rpb25zL0J1aWxkU2V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CdWlsZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB3aWxsIHBlcmZvcm0gYW4gaW5jcmVtZW50YWwgYnVpbGQgb24gYSB3b3JraW5nIHNldC4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQnVpbGRTZXRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgQnVpbGRTZXRBY3Rpb24gbGFzdEJ1aWx0OwotCi0JcHJpdmF0ZSBJV29ya2luZ1NldCB3b3JraW5nU2V0OwotCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCXByaXZhdGUgSUFjdGlvbkJhckNvbmZpZ3VyZXIgYWN0aW9uQmFyczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIHRoYXQgYnVpbGRzIHRoZSBwcm92aWRlZCB3b3JraW5nIHNldCB3aGVuIHJ1bgotCSAqLwotCXB1YmxpYyBCdWlsZFNldEFjdGlvbihJV29ya2luZ1NldCBzZXQsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93LCBJQWN0aW9uQmFyQ29uZmlndXJlciBhY3Rpb25CYXJzKSB7Ci0JCXN1cGVyKHNldCA9PSBudWxsID8gIiIgOiBzZXQuZ2V0TGFiZWwoKSwgQVNfUkFESU9fQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQkJdGhpcy5hY3Rpb25CYXJzID0gYWN0aW9uQmFyczsKLQkJdGhpcy53b3JraW5nU2V0ID0gc2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgc2V0IHRoYXQgdGhpcyBpbnN0YW5jZSBpcyBidWlsZGluZwotCSAqLwotCXB1YmxpYyBJV29ya2luZ1NldCBnZXRXb3JraW5nU2V0KCkgewotCQlyZXR1cm4gd29ya2luZ1NldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vcmVnaXN0ZXIgdGhpcyBhY3Rpb24gaW5zdGFuY2UgYXMgdGhlIGdsb2JhbCBoYW5kbGVyIGZvciB0aGUgYnVpbGQgbGFzdCBhY3Rpb24KLQkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS51aS5wcm9qZWN0LmJ1aWxkTGFzdCIpOyAvLyROT04tTkxTLTEkCi0JCWFjdGlvbkJhcnMucmVnaXN0ZXJHbG9iYWxBY3Rpb24odGhpcyk7Ci0KLQkJd2luZG93LmdldFdvcmtiZW5jaCgpLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCkuYWRkUmVjZW50V29ya2luZ1NldCh3b3JraW5nU2V0KTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IEJ1aWxkVXRpbGl0aWVzLmV4dHJhY3RQcm9qZWN0cyh3b3JraW5nU2V0LmdldEVsZW1lbnRzKCkpOwotCQlpZiAocHJvamVjdHMubGVuZ3RoID09IDApIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHdpbmRvdy5nZXRTaGVsbCgpLCAKLQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuQnVpbGRTZXRBY3Rpb25fbm9CdWlsZFRpdGxlLCAKLQkJCQkJSURFV29ya2JlbmNoTWVzc2FnZXMuQnVpbGRTZXRBY3Rpb25fbm9Qcm9qZWN0cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbGFzdEJ1aWx0ID0gdGhpczsKLQkJQnVpbGRBY3Rpb24gYnVpbGQgPSBuZXcgQnVpbGRBY3Rpb24od2luZG93LmdldFNoZWxsKCksIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQpOwotCQlidWlsZC5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHByb2plY3RzKSk7Ci0JCWJ1aWxkLnJ1bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotCQkvL3JhZGlvIGJ1dHRvbnMgcmVjZWl2ZSBhbiBldmVudCB3aGVuIHRoZXkgYmVjb21lIHVuc2VsZWN0ZWQsCi0JCS8vc28gd2UgbXVzdCBub3QgcnVuIHRoZSBhY3Rpb24gaW4gdGhpcyBjYXNlCi0JCWlmIChldmVudC53aWRnZXQgaW5zdGFuY2VvZiBNZW51SXRlbSkgewotCQkJaWYgKCEoKE1lbnVJdGVtKSBldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbigpKQotCQkJCXJldHVybjsKLQkJfQotCQlydW4oKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogRm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQnVpbGRTZXRBY3Rpb24oIiArIHdvcmtpbmdTZXQuZ2V0TmFtZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2FjdGlvbnMvQnVpbGRTZXRNZW51LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2FjdGlvbnMvQnVpbGRTZXRNZW51LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYjFjM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9hY3Rpb25zL0J1aWxkU2V0TWVudS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogaHpob3VAYWN0dWF0ZS5jb20gLSBGaXggZm9yICBCdWcgNzE2OTUgLSAKLSAqIFtXb3JraW5nU2V0c11SZW1vdmVkIFdvcmtpbmcgU2V0IGlzIHN0aWxsIHNob3duIHVuZGVyIHRoZSBtZW51IGl0ZW0gCi0gKiB3aGVuIGl0IGlzIHRoZSByZWNlbnRseSB1c2VkIHdvcmtpbmcgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSUFjdGlvbkJhckNvbmZpZ3VyZXI7Ci0KLS8qKgotICogU3ViLW1lbnUgb2ZmIHByb2plY3QgbWVudSBmb3Igc2hvd2luZyBNUlUgbGlzdCBvZiB3b3JraW5nIHNldCBidWlsZHMuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEJ1aWxkU2V0TWVudSBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0gewotICAgIHByaXZhdGUgSUFjdGlvbkJhckNvbmZpZ3VyZXIgYWN0aW9uQmFyczsKLQotICAgIGJvb2xlYW4gZGlydHkgPSB0cnVlOwotCi0gICAgcHJpdmF0ZSBJTWVudUxpc3RlbmVyIG1lbnVMaXN0ZW5lciA9IG5ldyBJTWVudUxpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgICAgIG1hbmFnZXIubWFya0RpcnR5KCk7Ci0gICAgICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBJQWN0aW9uIHNlbGVjdEJ1aWxkV29ya2luZ1NldEFjdGlvbjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotICAgICAqIEBwYXJhbSB3aW5kb3cKLSAgICAgKiBAcGFyYW0gYWN0aW9uQmFycwotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZFNldE1lbnUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3csIElBY3Rpb25CYXJDb25maWd1cmVyIGFjdGlvbkJhcnMpIHsKLSAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0gICAgICAgIHRoaXMuYWN0aW9uQmFycyA9IGFjdGlvbkJhcnM7Ci0gICAgICAgIHNlbGVjdEJ1aWxkV29ya2luZ1NldEFjdGlvbiA9IG5ldyBTZWxlY3RCdWlsZFdvcmtpbmdTZXRBY3Rpb24od2luZG93LAotICAgICAgICAgICAgICAgIGFjdGlvbkJhcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBtbmVtb25pYyBhY2NlbGVyYXRvciB0byBhY3Rpb25zIGluIHRoZSBNUlUgbGlzdCBvZgotICAgICAqIHJlY2VudGx5IGJ1aWx0IHdvcmtpbmcgc2V0cy4KLSAgICAgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gdG8gYWRkCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCB0byBhZGQgaXQgYXQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkTW5lbW9uaWMoQnVpbGRTZXRBY3Rpb24gYWN0aW9uLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGxhYmVsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAvL2FkZCB0aGUgbnVtZXJpY2FsIGFjY2VsZXJhdG9yCi0gICAgICAgIGlmIChpbmRleCA8IDkpIHsKLSAgICAgICAgICAgIGxhYmVsLmFwcGVuZCgnJicpOwotICAgICAgICAgICAgbGFiZWwuYXBwZW5kKGluZGV4KTsKLSAgICAgICAgICAgIGxhYmVsLmFwcGVuZCgnICcpOwotICAgICAgICB9Ci0gICAgICAgIGxhYmVsLmFwcGVuZChhY3Rpb24uZ2V0V29ya2luZ1NldCgpLmdldExhYmVsKCkpOwotICAgICAgICBhY3Rpb24uc2V0VGV4dChsYWJlbC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51LCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbChNZW51IG1lbnUsIGludCBpbmRleCkgewotICAgICAgICBpZiAoZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBNZW51TWFuYWdlcikKLSAgICAgICAgICAgICgoTWVudU1hbmFnZXIpIGdldFBhcmVudCgpKS5hZGRNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLSAgICAgICAgaWYgKCFkaXJ0eSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZmlsbE1lbnUobWVudSk7Ci0gICAgICAgIGRpcnR5ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbHMgdGhlIG1lbnUgd2l0aCBTaG93IFZpZXcgYWN0aW9ucy4KLSAgICAgKiBAcGFyYW0gbWVudSBUaGUgbWVudSBiZWluZyBmaWxsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxNZW51KE1lbnUgbWVudSkgewotICAgICAgICBib29sZWFuIGlzQXV0b0J1aWxkaW5nID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpCi0gICAgICAgICAgICAgICAgLmlzQXV0b0J1aWxkaW5nKCk7Ci0KLSAgICAgICAgLy9idWlsZCBNUlUgbGlzdCBvZiByZWNlbnRseSBidWlsdCB3b3JraW5nIHNldHM6Ci0gICAgICAgIElXb3JraW5nU2V0W10gc2V0cyA9IHdpbmRvdy5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpCi0gICAgICAgICAgICAgICAgLmdldFJlY2VudFdvcmtpbmdTZXRzKCk7Ci0gICAgICAgIEJ1aWxkU2V0QWN0aW9uIGxhc3QgPSBCdWlsZFNldEFjdGlvbi5sYXN0QnVpbHQ7Ci0gICAgICAgIElXb3JraW5nU2V0IGxhc3RTZXQgPSBudWxsOwotICAgICAgICAvL2FkZCBidWlsZCBhY3Rpb24gZm9yIHRoZSBsYXN0IHdvcmtpbmcgc2V0IHRoYXQgd2FzIGJ1aWx0Ci0gICAgICAgIGludCBhY2NlbCA9IDE7Ci0gICAgICAgIGlmIChsYXN0ICE9IG51bGwpIHsKLQkJCS8vIGFkZCBpdCBvbmx5IGlmIGl0IGhhcyBub3QgYmVlbiByZW1vdmVkCi0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNldHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc2V0c1tpXS5lcXVhbHMobGFzdC5nZXRXb3JraW5nU2V0KCkpKXsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZm91bmQpIHsKLQkgICAgICAgICAgICBsYXN0LnNldENoZWNrZWQodHJ1ZSk7Ci0JICAgICAgICAgICAgbGFzdC5zZXRFbmFibGVkKCFpc0F1dG9CdWlsZGluZyk7Ci0JICAgICAgICAgICAgbGFzdC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLnVpLnByb2plY3QuYnVpbGRMYXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgICAgICBhZGRNbmVtb25pYyhsYXN0LCBhY2NlbCsrKTsKLQkgICAgICAgICAgICBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShsYXN0KS5maWxsKG1lbnUsIC0xKTsKLQkgICAgICAgICAgICBsYXN0U2V0ID0gbGFzdC5nZXRXb3JraW5nU2V0KCk7Ci0JCQl9Ci0JCQllbHNlIC8vQ2xlYXIgdGhlIGxhc3QgYnVpbHQgaWYgaXQgaXMgbm90IHRoZXJlCi0JCQkJQnVpbGRTZXRBY3Rpb24ubGFzdEJ1aWx0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvL2FkZCBidWlsZCBhY3Rpb25zIGZvciB0aGUgbW9zdCByZWNlbnRseSB1c2VkIHdvcmtpbmcgc2V0cwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChsYXN0U2V0ICE9IG51bGwgJiYgbGFzdFNldC5lcXVhbHMoc2V0c1tpXSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBCdWlsZFNldEFjdGlvbiBhY3Rpb24gPSBuZXcgQnVpbGRTZXRBY3Rpb24oc2V0c1tpXSwgd2luZG93LAotICAgICAgICAgICAgICAgICAgICBhY3Rpb25CYXJzKTsKLSAgICAgICAgICAgIGFkZE1uZW1vbmljKGFjdGlvbiwgYWNjZWwrKyk7Ci0gICAgICAgICAgICBhY3Rpb24uc2V0RW5hYmxlZCghaXNBdXRvQnVpbGRpbmcpOwotICAgICAgICAgICAgbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKS5maWxsKG1lbnUsIC0xKTsKLSAgICAgICAgfQotICAgICAgICAvL2FkZCB0aGUgYWN0aW9uIHRvIHNlbGVjdCBhIGRpZmZlcmVudCB3b3JraW5nIHNldAotICAgICAgICBpZiAoc2V0cy5sZW5ndGggPiAwKQotICAgICAgICAJbmV3IFNlcGFyYXRvcigpLmZpbGwobWVudSwgLTEpOwotICAgICAgICBzZWxlY3RCdWlsZFdvcmtpbmdTZXRBY3Rpb24uc2V0RW5hYmxlZCghaXNBdXRvQnVpbGRpbmcpOwotICAgICAgICBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShzZWxlY3RCdWlsZFdvcmtpbmdTZXRBY3Rpb24pLmZpbGwobWVudSwgLTEpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgICAgIHJldHVybiBkaXJ0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZGVuIHRvIGFsd2F5cyByZXR1cm4gdHJ1ZSBhbmQgZm9yY2UgZHluYW1pYyBtZW51IGJ1aWxkaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRHluYW1pYygpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9hY3Rpb25zL0J1aWxkVXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2FjdGlvbnMvQnVpbGRVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkZjY2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2FjdGlvbnMvQnVpbGRVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJ1aWxkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5SZXNvdXJjZVV0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBjb252ZW5pZW5jZSBtZXRob2RzIHVzZWQgYnkgdGhlIHZhcmlvdXMgYnVpbGQgY29tbWFuZHMKLSAqIHRvIGRldGVybWluZSBlbmFibGVtZW50LiAgVGhlc2UgdXRpbGl0aWVzIGNhbm5vdCBiZSBmYWN0b3JlZCBpbnRvIGEgY29tbW9uCi0gKiBjbGFzcyBiZWNhdXNlIHNvbWUgYnVpbGQgYWN0aW9ucyBhcmUgQVBJIGFuZCBzb21lIGFyZSBub3QuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIEJ1aWxkVXRpbGl0aWVzIHsKLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgc2VsZWN0ZWQgcHJvamVjdHMgZnJvbSBhIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIFRoZSBzZWxlY3Rpb24gdG8gYW5hbHl6ZQotCSAqIEByZXR1cm4gVGhlIHNlbGVjdGVkIHByb2plY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGV4dHJhY3RQcm9qZWN0cyhPYmplY3RbXSBzZWxlY3Rpb24pIHsKLQkJSGFzaFNldCBwcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2VsZWN0aW9uW2ldIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcHJvamVjdHMuYWRkKCgoSVJlc291cmNlKSBzZWxlY3Rpb25baV0pLmdldFByb2plY3QoKSk7Ci0JCQl9IGVsc2UgaWYgKHNlbGVjdGlvbltpXSBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCQlJQWRhcHRhYmxlIGFkYXB0YWJsZSA9IChJQWRhcHRhYmxlKSBzZWxlY3Rpb25baV07Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgYWRhcHRhYmxlLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkJCQkJcHJvamVjdHMuYWRkKHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSBwcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFtwcm9qZWN0cy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhbmQgcmV0dXJucyB0aGUgc2VsZWN0ZWQgcHJvamVjdHMgaW4gdGhlIGdpdmVuIHdpbmRvdwotCSAqIAotCSAqIEBwYXJhbSB3aW5kb3cgVGhlIHdpbmRvdyB0byBmaW5kIHRoZSBzZWxlY3Rpb24gaW4KLQkgKiBAcmV0dXJuIFRoZSBzZWxlY3RlZCBwcm9qZWN0cywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gc2VsZWN0aW9uIGNvdWxkIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBmaW5kU2VsZWN0ZWRQcm9qZWN0cyhJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlpZiAod2luZG93ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElQcm9qZWN0WzBdOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCUlQcm9qZWN0W10gc2VsZWN0ZWQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGVkID0gZXh0cmFjdFByb2plY3RzKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9BcnJheSgpKTsKLQkJfSBlbHNlIHsKLQkJCS8vc2VlIGlmIHdlIGNhbiBleHRyYWN0IGEgc2VsZWN0ZWQgcHJvamVjdCBmcm9tIHRoZSBhY3RpdmUgZWRpdG9yCi0JCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuZ2V0QWN0aXZlUGFydCgpOwotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IChJRWRpdG9yUGFydCkgcGFydDsKLQkJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VVdGlsLmdldEZpbGUoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0ZWQgPSBuZXcgSVByb2plY3RbXSB7ZmlsZS5nZXRQcm9qZWN0KCl9OwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0ZWQgPT0gbnVsbCkKLQkJCXNlbGVjdGVkID0gbmV3IElQcm9qZWN0WzBdOwotCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIGEgYnVpbGQgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiB0cmlnZ2VyIHNob3VsZAotCSAqIGJlIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICogQHBhcmFtIHByb2plY3RzIFRoZSBwcm9qZWN0cyB0byB1c2UgdG8gZGV0ZXJtaW5lIGVuYWJsZW1lbnQKLQkgKiBAcGFyYW0gdHJpZ2dlciBUaGUgYnVpbGQgdHJpZ2dlciAoPGNvZGU+SW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci4qX0JVSUxEPC9jb2RlPiBjb25zdGFudHMpLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgZW5hYmxlZCwgYW5kCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkKElQcm9qZWN0W10gcHJvamVjdHMsIGludCB0cmlnZ2VyKSB7Ci0JCS8vaW5jcmVtZW50YWwgYnVpbGQgaXMgb25seSBlbmFibGVkIGlmIGFsbCBwcm9qZWN0cyBhcmUgbm90IGF1dG9idWlsZGluZwotCQlpZiAodHJpZ2dlciA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxEICYmIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc0F1dG9CdWlsZGluZygpKSB7Ci0JCQlpZiAoIW1hdGNoaW5nVHJpZ2dlcihwcm9qZWN0cywgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5BVVRPX0JVSUxELCBmYWxzZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vZmluYWxseSB3ZSBhcmUgYnVpbGRpbmcgb25seSBpZiB0aGVyZSBpcyBhIGJ1aWxkZXIgdGhhdCBhY2NlcHRzIHRoZSB0cmlnZ2VyCi0JCXJldHVybiBtYXRjaGluZ1RyaWdnZXIocHJvamVjdHMsIHRyaWdnZXIsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBvbmUgb2YgdGhlIHByb2plY3RzIGhhcyBhIGJ1aWxkZXIgd2hvc2UgdHJpZ2dlciBzZXR0aW5nCi0JICogZm9yIHRoZSBnaXZlbiB0cmlnZ2VyIG1hdGNoZXMgdGhlIGdpdmVuIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0cyBUaGUgcHJvamVjdHMgdG8gY2hlY2sKLQkgKiBAcGFyYW0gdHJpZ2dlciBUaGUgdHJpZ2dlciB0byBsb29rIGZvcgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdHJpZ2dlciB2YWx1ZSB0byBsb29rIGZvcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgb25lIG9mIHRoZSBwcm9qZWN0cyBoYXMgYSBidWlsZGVyIHdob3NlCi0JICogdHJpZ2dlciBhY3RpdmF0aW9uIG1hdGNoZXMgdGhlIHByb3ZpZGVkIHZhbHVlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoaW5nVHJpZ2dlcihJUHJvamVjdFtdIHByb2plY3RzLCBpbnQgdHJpZ2dlciwgYm9vbGVhbiB2YWx1ZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpKQotCQkJCWNvbnRpbnVlOwotCQkJdHJ5IHsKLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdHNbaV0uZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlJQ29tbWFuZFtdIGJ1aWxkU3BlYyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYnVpbGRTcGVjLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChidWlsZFNwZWNbal0uaXNCdWlsZGluZyh0cmlnZ2VyKSA9PSB2YWx1ZSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlIHByb2plY3RzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2F1c2VzIGFsbCBlZGl0b3JzIHRvIHNhdmUgYW55IG1vZGlmaWVkIHJlc291cmNlcyBpbiB0aGUgcHJvdmlkZWQgY29sbGVjdGlvbgotCSAqIG9mIHByb2plY3RzIGRlcGVuZGluZyBvbiB0aGUgdXNlcidzIHByZWZlcmVuY2UuCi0JICogQHBhcmFtIHByb2plY3RzIFRoZSBwcm9qZWN0cyBpbiB3aGljaCB0byBzYXZlIGVkaXRvcnMsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogdG8gc2F2ZSBlZGl0b3JzIGluIGFsbCBwcm9qZWN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUVkaXRvcnMoQ29sbGVjdGlvbiBwcm9qZWN0cykgewotCQlpZiAoIUJ1aWxkQWN0aW9uLmlzU2F2ZUFsbFNldCgpKQotCQkJcmV0dXJuOwotCQlJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLQkJCUlXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSB3aW5kb3dzW2ldLmdldFBhZ2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBhZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHBhZ2VzW2pdOwotCQkJCWlmIChwcm9qZWN0cyA9PSBudWxsKSB7Ci0JCQkJCXBhZ2Uuc2F2ZUFsbEVkaXRvcnMoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUlFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IHBhZ2UuZ2V0RGlydHlFZGl0b3JzKCk7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgZWRpdG9ycy5sZW5ndGg7IGsrKykgewotCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZWRpdG9yc1trXTsKLQkJCQkJCUlGaWxlIGlucHV0RmlsZSA9IFJlc291cmNlVXRpbC5nZXRGaWxlKGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJCWlmIChpbnB1dEZpbGUgIT0gbnVsbCkgewotCQkJCQkJCWlmIChwcm9qZWN0cy5jb250YWlucyhpbnB1dEZpbGUuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJCQlwYWdlLnNhdmVFZGl0b3IoZWRpdG9yLCBmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRG9lc24ndCBuZWVkIHRvIGJlIGluc3RhbnRpYXRlZAotCSAqLwotCXByaXZhdGUgQnVpbGRVdGlsaXRpZXMoKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvYWN0aW9ucy9PcGVuV29ya3NwYWNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2FjdGlvbnMvT3BlbldvcmtzcGFjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWE4MzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvYWN0aW9ucy9PcGVuV29ya3NwYWNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLkNob29zZVdvcmtzcGFjZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLkNob29zZVdvcmtzcGFjZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci0KLS8qKgotICogSW1wbGVtZW50cyB0aGUgb3BlbiB3b3Jrc3BhY2UgYWN0aW9uLiBPcGVucyBhIGRpYWxvZyBwcm9tcHRpbmcgZm9yIGEKLSAqIGRpcmVjdG9yeSBhbmQgdGhlbiByZXN0YXJ0cyB0aGUgSURFIG9uIHRoYXQgd29ya3NwYWNlLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuV29ya3NwYWNlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMKLSAgICAgICAgQWN0aW9uRmFjdG9yeS5JV29ya2JlbmNoQWN0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZNID0gImVjbGlwc2Uudm0iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTUFSR1MgPSAiZWNsaXBzZS52bWFyZ3MiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9DT01NQU5EUyA9ICJlY2xpcHNlLmNvbW1hbmRzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRVhJVF9DT0RFID0gImVjbGlwc2UuZXhpdGNvZGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9FWElUX0RBVEEgPSAiZWNsaXBzZS5leGl0ZGF0YSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTURfREFUQSA9ICItZGF0YSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTURfVk1BUkdTID0gIi12bWFyZ3MiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xJTkUgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0gICAgLyoqCi0gICAgICogU2V0IGRlZmluaXRpb24gZm9yIHRoaXMgYWN0aW9uIGFuZCB0ZXh0IHNvIHRoYXQgaXQgd2lsbCBiZSB1c2VkIGZvcgotICAgICAqIEZpbGUgLSZndDsgT3BlbiBXb3Jrc3BhY2UgaW4gdGhlIGFyZ3VtZW50IHdpbmRvdy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2luZG93Ci0gICAgICogICAgICAgICAgICB0aGUgd2luZG93IGluIHdoaWNoIHRoaXMgYWN0aW9uIHNob3VsZCBhcHBlYXIKLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlbldvcmtzcGFjZUFjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICBzdXBlcihJREVXb3JrYmVuY2hNZXNzYWdlcy5PcGVuV29ya3NwYWNlQWN0aW9uX3RleHQpOwotCi0gICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICAvLyBUT0RPIGhlbHA/Ci0KLSAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5Xb3Jrc3BhY2VBY3Rpb25fdG9vbFRpcCk7Ci0gICAgICAgIHNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2UudWkuZmlsZS5vcGVuV29ya3NwYWNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBTdHJpbmcgcGF0aCA9IHByb21wdEZvcldvcmtzcGFjZSgpOwotICAgICAgICBpZiAocGF0aCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFN0cmluZyBjb21tYW5kX2xpbmUgPSBidWlsZENvbW1hbmRMaW5lKHBhdGgpOwotICAgICAgICBpZiAoY29tbWFuZF9saW5lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFBST1BfRVhJVF9DT0RFLCBJbnRlZ2VyLnRvU3RyaW5nKDI0KSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShQUk9QX0VYSVRfREFUQSwgY29tbWFuZF9saW5lKTsKLSAgICAgICAgd2luZG93LmdldFdvcmtiZW5jaCgpLnJlc3RhcnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhlIENob29zZVdvcmtzcGFjZURpYWxvZyB0byBnZXQgdGhlIG5ldyB3b3Jrc3BhY2UgZnJvbSB0aGUgdXNlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIG5hbWluZyB0aGUgbmV3IHdvcmtzcGFjZSBhbmQgbnVsbCBpZiBjYW5jZWwgd2FzIHNlbGVjdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvbXB0Rm9yV29ya3NwYWNlKCkgewotICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgd29ya3NwYWNlIGFzIHRoZSBkZWZhdWx0Ci0gICAgICAgIENob29zZVdvcmtzcGFjZURhdGEgZGF0YSA9IG5ldyBDaG9vc2VXb3Jrc3BhY2VEYXRhKFBsYXRmb3JtCi0gICAgICAgICAgICAgICAgLmdldEluc3RhbmNlTG9jYXRpb24oKS5nZXRVUkwoKSk7Ci0gICAgICAgIENob29zZVdvcmtzcGFjZURpYWxvZyBkaWFsb2cgPSBuZXcgQ2hvb3NlV29ya3NwYWNlRGlhbG9nKHdpbmRvdwotICAgICAgICAgICAgICAgIC5nZXRTaGVsbCgpLCBkYXRhLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGRpYWxvZy5wcm9tcHQodHJ1ZSk7Ci0KLSAgICAgICAgLy8gcmV0dXJuIG51bGwgaWYgdGhlIHVzZXIgY2hhbmdlZCB0aGVpciBtaW5kCi0gICAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBkYXRhLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAvLyBvdGhlcndpc2Ugc3RvcmUgdGhlIG5ldyBzZWxlY3Rpb24gYW5kIHJldHVybiB0aGUgc2VsZWN0aW9uCi0gICAgICAgIGRhdGEud3JpdGVQZXJzaXN0ZWREYXRhKCk7Ci0gICAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBzdHJpbmcgd2l0aCBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgZWNsaXBzZS5leGUgdGhhdAotICAgICAqIHdpbGwgbGF1bmNoIGEgbmV3IHdvcmtiZW5jaCB0aGF0IGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50bHkgcnVubmluZwotICAgICAqIG9uZSwgYnV0IHVzaW5nIHRoZSBhcmd1bWVudCBkaXJlY3RvcnkgYXMgaXRzIHdvcmtzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd29ya3NwYWNlCi0gICAgICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IHRvIHVzZSBhcyB0aGUgbmV3IHdvcmtzcGFjZQotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgb2YgY29tbWFuZCBsaW5lIG9wdGlvbnMgb3IgbnVsbCBvbiBlcnJvcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGJ1aWxkQ29tbWFuZExpbmUoU3RyaW5nIHdvcmtzcGFjZSkgewotICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9WTSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuT3BlbldvcmtzcGFjZUFjdGlvbl9lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5Xb3Jrc3BhY2VBY3Rpb25fZXJyb3JNZXNzYWdlLCBQUk9QX1ZNKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKDUxMik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQocHJvcGVydHkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKE5FV19MSU5FKTsKLQotICAgICAgICAvLyBhcHBlbmQgdGhlIHZtYXJncyBhbmQgY29tbWFuZHMuIEFzc3VtZSB0aGF0IHRoZXNlIGFscmVhZHkgZW5kIGluIFxuCi0gICAgICAgIFN0cmluZyB2bWFyZ3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9WTUFSR1MpOwotICAgICAgICBpZiAodm1hcmdzICE9IG51bGwpCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHZtYXJncyk7Ci0KLSAgICAgICAgLy8gYXBwZW5kIHRoZSByZXN0IG9mIHRoZSBhcmdzLCByZXBsYWNpbmcgb3IgYWRkaW5nIC1kYXRhIGFzIHJlcXVpcmVkCi0gICAgICAgIHByb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfQ09NTUFORFMpOwotICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChDTURfREFUQSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKE5FV19MSU5FKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQod29ya3NwYWNlKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoTkVXX0xJTkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5kZXggb2YgdGhlIGFyZyB0byByZXBsYWNlIGl0cyB2YWx1ZQotICAgICAgICAgICAgaW50IGNtZF9kYXRhX3BvcyA9IHByb3BlcnR5Lmxhc3RJbmRleE9mKENNRF9EQVRBKTsKLSAgICAgICAgICAgIGlmIChjbWRfZGF0YV9wb3MgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBjbWRfZGF0YV9wb3MgKz0gQ01EX0RBVEEubGVuZ3RoKCkgKyAxOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJvcGVydHkuc3Vic3RyaW5nKDAsIGNtZF9kYXRhX3BvcykpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQod29ya3NwYWNlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByb3BlcnR5LnN1YnN0cmluZyhwcm9wZXJ0eS5pbmRleE9mKCdcbicsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbWRfZGF0YV9wb3MpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoQ01EX0RBVEEpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoTkVXX0xJTkUpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQod29ya3NwYWNlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKE5FV19MSU5FKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHB1dCB0aGUgdm1hcmdzIGJhY2sgYXQgdGhlIHZlcnkgZW5kICh0aGUgZWNsaXBzZS5jb21tYW5kcyBwcm9wZXJ0eQotICAgICAgICAvLyBhbHJlYWR5IGNvbnRhaW5zIHRoZSAtdm0gYXJnKQotICAgICAgICBpZiAodm1hcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoQ01EX1ZNQVJHUyk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKE5FV19MSU5FKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodm1hcmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgd2luZG93ID0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2FjdGlvbnMvT3BlbldvcmtzcGFjZUZpbGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvYWN0aW9ucy9PcGVuV29ya3NwYWNlRmlsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGM0MjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvYWN0aW9ucy9PcGVuV29ya3NwYWNlRmlsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLk9wZW5SZXNvdXJjZURpYWxvZzsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBvcGVuIHJlc291cmNlIGFjdGlvbi4gCi0gKiBPcGVucyBhIGRpYWxvZyBwcm9tcHRpbmcgZm9yIGEgZmlsZSBhbmQgb3BlbnMgdGhlIHNlbGVjdGVkIGZpbGUgaW4gYW4gZWRpdG9yLgotICogCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuV29ya3NwYWNlRmlsZUFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzCi0gICAgICAgIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3c7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlbldvcmtzcGFjZUZpbGVBY3Rpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlJSURFSGVscENvbnRleHRJZHMuT1BFTl9XT1JLU1BBQ0VfRklMRV9BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICB3b3JrYmVuY2hXaW5kb3cgPSB3aW5kb3c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUXVlcnkgdGhlIHVzZXIgZm9yIHRoZSByZXNvdXJjZSB0aGF0IHNob3VsZCBiZSBvcGVuZWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSB0aGF0IHNob3VsZCBiZSBvcGVuZWQgb3IgbnVsbCBpZiB0aGUgCi0gICAgICogCXJlc291cmNlIHNlbGVjdGlvbiBkaWFsb2cgd2FzIGNhbmNlbGxlZC4KLSAgICAgKi8KLSAgICBJRmlsZSBxdWVyeUZpbGVSZXNvdXJjZSgpIHsKLSAgICAgICAgU2hlbGwgcGFyZW50ID0gd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0gICAgICAgIElDb250YWluZXIgaW5wdXQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0gICAgICAgIE9wZW5SZXNvdXJjZURpYWxvZyBkaWFsb2cgPSBuZXcgT3BlblJlc291cmNlRGlhbG9nKHBhcmVudCwgaW5wdXQsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlLkZJTEUpOwotICAgICAgICBpbnQgcmVzdWx0Q29kZSA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIGlmIChyZXN1bHRDb2RlICE9IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQubGVuZ3RoID09IDAKLSAgICAgICAgICAgICAgICB8fCByZXN1bHRbMF0gaW5zdGFuY2VvZiBJRmlsZSA9PSBmYWxzZSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiAoSUZpbGUpIHJlc3VsdFswXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb2xsZWN0IGFsbCByZXNvdXJjZXMgaW4gdGhlIHdvcmtiZW5jaCwgb3BlbiBhIGRpYWxvZyBhc2tpbmcgdGhlIHVzZXIgdG8KLSAgICAgKiBzZWxlY3QgYSBmaWxlIGFuZCBvcGVuIHRoZSBmaWxlIGluIGFuIGVkaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgSUZpbGUgZmlsZSA9IHF1ZXJ5RmlsZVJlc291cmNlKCk7Ci0KLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5Xb3Jrc3BhY2VGaWxlQWN0aW9uX2Vycm9yVGl0bGU7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5Xb3Jrc3BhY2VGaWxlQWN0aW9uX2Vycm9yTWVzc2FnZTsKLSAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5sb2codGl0bGUsIHguZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKHdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSwgeAotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvYWN0aW9ucy9Qcm9qZWN0UHJvcGVydHlEaWFsb2dBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvYWN0aW9ucy9Qcm9qZWN0UHJvcGVydHlEaWFsb2dBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhZjFlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2FjdGlvbnMvUHJvamVjdFByb3BlcnR5RGlhbG9nQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU51bGxTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuUGFydEV2ZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlEaWFsb2dBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gZm9yIHRoZSBhY3Rpb24gUHJvcGVydHkgb24gdGhlIFByb2plY3QgbWVudS4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RQcm9wZXJ0eURpYWxvZ0FjdGlvbiBleHRlbmRzIFBhcnRFdmVudEFjdGlvbiBpbXBsZW1lbnRzCi0gICAgICAgIElOdWxsU2VsZWN0aW9uTGlzdGVuZXIsIEFjdGlvbkZhY3RvcnkuSVdvcmtiZW5jaEFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd29ya2JlbmNoIHdpbmRvdzsgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcwotICAgICAqIGFjdGlvbiBoYXMgYmVlbiA8Y29kZT5kaXNwb3NlPC9jb2RlPmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdzsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBkaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHdpbmRvdyB0aGUgd2luZG93Ci0gICAgICovCi0gICAgcHVibGljIFByb2plY3RQcm9wZXJ0eURpYWxvZ0FjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICBzdXBlcihuZXcgU3RyaW5nKCkpOwotICAgICAgICBpZiAod2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLndvcmtiZW5jaFdpbmRvdyA9IHdpbmRvdzsKLSAgICAgICAgc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hfcHJvamVjdFByb3BlcnRpZXMpOwotICAgICAgICBzZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hfcHJvamVjdFByb3BlcnRpZXNUb29sVGlwKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5QUk9KRUNUX1BST1BFUlRZX0RJQUxPR19BQ1RJT04pOwotICAgICAgICB3b3JrYmVuY2hXaW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICB3b3JrYmVuY2hXaW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIHNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2UudWkucHJvamVjdC5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU2VsUHJvdmlkZXIgc2VsUHJvdmlkZXIgPSBuZXcgU2VsUHJvdmlkZXIoKTsKLSAgICAgICAgc2VsUHJvdmlkZXIucHJvamVjdFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHByb2plY3QpOwotICAgICAgICBQcm9wZXJ0eURpYWxvZ0FjdGlvbiBwcm9wQWN0aW9uID0gbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKAotICAgICAgICAgICAgICAgIHdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpLCBzZWxQcm92aWRlcik7Ci0gICAgICAgIHByb3BBY3Rpb24ucnVuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBlbmFibGVtZW50IHN0YXRlIHdoZW4gYSB0aGUgc2VsZWN0aW9uIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbCkgewotICAgICAgICBzZXRFbmFibGVkKGdldFByb2plY3QoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIGVuYWJsZW1lbnQgc3RhdGUgd2hlbiBhIG5ldyBwYXJ0IGlzIGFjdGl2YXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgc3VwZXIucGFydEFjdGl2YXRlZChwYXJ0KTsKLSAgICAgICAgc2V0RW5hYmxlZChnZXRQcm9qZWN0KCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHByb2plY3QgZnJvbSB0aGUgc2VsZWN0aW9uIG9mIHRoZSBhY3RpdmUgcGFydC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHBhcnQgPSBnZXRBY3RpdmVQYXJ0KCk7Ci0gICAgICAgIE9iamVjdCBzZWxlY3Rpb24gPSBudWxsOwotICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0gICAgICAgICAgICBzZWxlY3Rpb24gPSAoKElFZGl0b3JQYXJ0KSBwYXJ0KS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWwgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGlmICgoc2VsICE9IG51bGwpICYmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0gICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0aW9uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBzZWxlY3Rpb24pCi0gICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlLmdldFByb2plY3QoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLWphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEFjdGlvbkZhY3RvcnkuSVdvcmtiZW5jaEFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB3b3JrYmVuY2hXaW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICB3b3JrYmVuY2hXaW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIHdvcmtiZW5jaFdpbmRvdyA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBIZWxwZXIgY2xhc3MgdG8gc2ltdWxhdGUgYSBzZWxlY3Rpb24gcHJvdmlkZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTZWxQcm92aWRlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlciB7Ci0gICAgICAgIHByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBwcm9qZWN0U2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIHByb2plY3RTZWxlY3Rpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2FjdGlvbnMvUXVpY2tNZW51QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2FjdGlvbnMvUXVpY2tNZW51QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNWRmZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9hY3Rpb25zL1F1aWNrTWVudUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5rZXlzLklCaW5kaW5nU2VydmljZTsKLQotLyoqCi0gKiBBIHF1aWNrIG1lbnUgYWN0aW9ucyBwcm92aWRlcyBzdXBwb3J0IHRvIGFzc2lnbiBzaG9ydCBjdXRzCi0gKiB0byBzdWIgbWVudXMuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFF1aWNrTWVudUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9JTkRFTlQgPSAzOwotCi0gICAgcHJpdmF0ZSBNZW51IHF1aWNrTWVudTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcXVpY2sgbWVudSBhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZCBpZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tbWFuZElkIHRoZSBjb21tYW5kIGlkIG9mIHRoZSBzaG9ydCBjdXQgdXNlZCB0byBvcGVuCi0gICAgICogIHRoZSBzdWIgbWVudSAKLSAgICAgKi8KLSAgICBwdWJsaWMgUXVpY2tNZW51QWN0aW9uKFN0cmluZyBjb21tYW5kSWQpIHsKLSAgICAgICAgc2V0SWQoY29tbWFuZElkKTsKLSAgICAgICAgc2V0QWN0aW9uRGVmaW5pdGlvbklkKGNvbW1hbmRJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAgIGlmIChkaXNwbGF5ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIENvbnRyb2wgZm9jdXMgPSBkaXNwbGF5LmdldEZvY3VzQ29udHJvbCgpOwotICAgICAgICBpZiAoZm9jdXMgPT0gbnVsbCB8fCBmb2N1cy5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgTWVudU1hbmFnZXIgbWVudSA9IG5ldyBNZW51TWFuYWdlcigpOwotICAgICAgICBmaWxsTWVudShtZW51KTsKLSAgICAgICAgaWYgKHF1aWNrTWVudSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBxdWlja01lbnUuZGlzcG9zZSgpOwotICAgICAgICAgICAgcXVpY2tNZW51ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBxdWlja01lbnUgPSBtZW51LmNyZWF0ZUNvbnRleHRNZW51KGZvY3VzLmdldFNoZWxsKCkpOwotICAgICAgICBQb2ludCBsb2NhdGlvbiA9IGNvbXB1dGVNZW51TG9jYXRpb24oZm9jdXMsIHF1aWNrTWVudSk7Ci0gICAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBxdWlja01lbnUuc2V0TG9jYXRpb24obG9jYXRpb24pOwotICAgICAgICBxdWlja01lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAocXVpY2tNZW51ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHF1aWNrTWVudS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBxdWlja01lbnUgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSG9vayB0byBmaWxsIGEgbWVudSBtYW5hZ2VyIHdpdGggdGhlIGl0ZW1zIG9mIHRoZSBzdWIgbWVudS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVudSB0aGUgc3ViIG1lbnUgdG8gZmlsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpbGxNZW51KElNZW51TWFuYWdlciBtZW51KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNob3J0IGN1dCBhc3NpZ25lZCB0byB0aGUgc3ViIG1lbnUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAgKiBubyBzaG9ydCBjdXQgaXMgYXNzaWduZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hvcnQgY3V0IGFzIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydEN1dFN0cmluZygpIHsKLQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlmaW5hbCBJQmluZGluZ1NlcnZpY2UgYmluZGluZ1NlcnZpY2UgPSAoSUJpbmRpbmdTZXJ2aWNlKSB3b3JrYmVuY2gKLQkJCQkuZ2V0QWRhcHRlcihJQmluZGluZ1NlcnZpY2UuY2xhc3MpOwotCQlmaW5hbCBUcmlnZ2VyU2VxdWVuY2VbXSBhY3RpdmVCaW5kaW5ncyA9IGJpbmRpbmdTZXJ2aWNlCi0JCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKGdldEFjdGlvbkRlZmluaXRpb25JZCgpKTsKLQkJaWYgKGFjdGl2ZUJpbmRpbmdzLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiBhY3RpdmVCaW5kaW5nc1swXS5mb3JtYXQoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgUG9pbnQgY29tcHV0ZU1lbnVMb2NhdGlvbihDb250cm9sIGZvY3VzLCBNZW51IG1lbnUpIHsKLSAgICAgICAgUG9pbnQgY3Vyc29yTG9jYXRpb24gPSBmb2N1cy5nZXREaXNwbGF5KCkuZ2V0Q3Vyc29yTG9jYXRpb24oKTsKLSAgICAgICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBudWxsOwotICAgICAgICBQb2ludCByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoZm9jdXMgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0gICAgICAgICAgICBTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSAoU3R5bGVkVGV4dCkgZm9jdXM7Ci0gICAgICAgICAgICBjbGllbnRBcmVhID0gc3R5bGVkVGV4dC5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICByZXN1bHQgPSBjb21wdXRlTWVudUxvY2F0aW9uKHN0eWxlZFRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKGZvY3VzIGluc3RhbmNlb2YgVHJlZSkgewotICAgICAgICAgICAgVHJlZSB0cmVlID0gKFRyZWUpIGZvY3VzOwotICAgICAgICAgICAgY2xpZW50QXJlYSA9IHRyZWUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZU1lbnVMb2NhdGlvbih0cmVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChmb2N1cyBpbnN0YW5jZW9mIFRhYmxlKSB7Ci0gICAgICAgICAgICBUYWJsZSB0YWJsZSA9IChUYWJsZSkgZm9jdXM7Ci0gICAgICAgICAgICBjbGllbnRBcmVhID0gdGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZU1lbnVMb2NhdGlvbih0YWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBmb2N1cy50b0NvbnRyb2woY3Vyc29yTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbGllbnRBcmVhICE9IG51bGwgJiYgIWNsaWVudEFyZWEuY29udGFpbnMocmVzdWx0KSkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBvaW50KGNsaWVudEFyZWEueCArIGNsaWVudEFyZWEud2lkdGggLyAyLAotICAgICAgICAgICAgICAgICAgICBjbGllbnRBcmVhLnkgKyBjbGllbnRBcmVhLmhlaWdodCAvIDIpOwotICAgICAgICB9Ci0gICAgICAgIFJlY3RhbmdsZSBzaGVsbEFyZWEgPSBmb2N1cy5nZXRTaGVsbCgpLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgaWYgKCFzaGVsbEFyZWEuY29udGFpbnMoZm9jdXMuZ2V0U2hlbGwoKS50b0NvbnRyb2woCi0gICAgICAgICAgICAgICAgZm9jdXMudG9EaXNwbGF5KHJlc3VsdCkpKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBvaW50KHNoZWxsQXJlYS54ICsgc2hlbGxBcmVhLndpZHRoIC8gMiwgc2hlbGxBcmVhLnkKLSAgICAgICAgICAgICAgICAgICAgKyBzaGVsbEFyZWEuaGVpZ2h0IC8gMik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZvY3VzLnRvRGlzcGxheShyZXN1bHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhvb2sgdG8gY29tcHV0ZSB0aGUgbWVudSBsb2NhdGlvbiBpZiB0aGUgZm9jdXMgd2lkZ2V0IGlzCi0gICAgICogYSBzdHlsZWQgdGV4dCB3aWRnZXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRleHQgdGhlIHN0eWxlZCB0ZXh0IHdpZGdldCB0aGF0IGhhcyB0aGUgZm9jdXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgd2lkZ2V0IHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSBtZW51IHRvIHBvcCB1cCBvcgotICAgICAqICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3cgcG9zaXRpb24gaW5zaWRlIHRoZSB3aWRnZXQgY2FuCi0gICAgICogIGJlIGNvbXB1dGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVNZW51TG9jYXRpb24oU3R5bGVkVGV4dCB0ZXh0KSB7Ci0gICAgICAgIFBvaW50IHJlc3VsdCA9IHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCh0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotICAgICAgICByZXN1bHQueSArPSB0ZXh0LmdldExpbmVIZWlnaHQoKTsKLSAgICAgICAgaWYgKCF0ZXh0LmdldENsaWVudEFyZWEoKS5jb250YWlucyhyZXN1bHQpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSG9vayB0byBjb21wdXRlIHRoZSBtZW51IGxvY2F0aW9uIGlmIHRoZSBmb2N1cyB3aWRnZXQgaXMKLSAgICAgKiBhIHRyZWUgd2lkZ2V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSB0cmVlIHRoZSB0cmVlIHdpZGdldCB0aGF0IGhhcyB0aGUgZm9jdXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgd2lkZ2V0IHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSBtZW51IHRvIHBvcCB1cCBvcgotICAgICAqICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3cgcG9zaXRpb24gaW5zaWRlIHRoZSB3aWRnZXQgY2FuCi0gICAgICogIGJlIGNvbXB1dGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVNZW51TG9jYXRpb24oVHJlZSB0cmVlKSB7Ci0gICAgICAgIFRyZWVJdGVtW10gaXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbigpOwotICAgICAgICBSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHRyZWUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICBzd2l0Y2ggKGl0ZW1zLmxlbmd0aCkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW1zWzBdLmdldEJvdW5kcygpOwotICAgICAgICAgICAgUmVjdGFuZ2xlIGludGVyc2VjdCA9IGNsaWVudEFyZWEuaW50ZXJzZWN0aW9uKGJvdW5kcyk7Ci0gICAgICAgICAgICBpZiAoaW50ZXJzZWN0ICE9IG51bGwgJiYgaW50ZXJzZWN0LmhlaWdodCA9PSBib3VuZHMuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChNYXRoLm1heCgwLCBib3VuZHMueAotICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRBdmFyYWdlQ2hhcldpdGgodHJlZSkgKiBDSEFSX0lOREVOVCksIGJvdW5kcy55Ci0gICAgICAgICAgICAgICAgICAgICAgICArIGJvdW5kcy5oZWlnaHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFJlY3RhbmdsZVtdIHJlY3RhbmdsZXMgPSBuZXcgUmVjdGFuZ2xlW2l0ZW1zLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY3RhbmdsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICByZWN0YW5nbGVzW2ldID0gaXRlbXNbaV0uZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQb2ludCBjdXJzb3JMb2NhdGlvbiA9IHRyZWUuZ2V0RGlzcGxheSgpLmdldEN1cnNvckxvY2F0aW9uKCk7Ci0gICAgICAgICAgICBQb2ludCByZXN1bHQgPSBmaW5kQmVzdExvY2F0aW9uKGdldEluY2x1ZGVkUG9zaXRpb25zKHJlY3RhbmdsZXMsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudEFyZWEpLCB0cmVlLnRvQ29udHJvbChjdXJzb3JMb2NhdGlvbikpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJlc3VsdC54ID0gcmVzdWx0LnggKyBnZXRBdmFyYWdlQ2hhcldpdGgodHJlZSkgKiBDSEFSX0lOREVOVDsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIb29rIHRvIGNvbXB1dGUgdGhlIG1lbnUgbG9jYXRpb24gaWYgdGhlIGZvY3VzIHdpZGdldCBpcwotICAgICAqIGEgdGFibGUgd2lkZ2V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgd2lkZ2V0IHRoYXQgaGFzIHRoZSBmb2N1cwotICAgICAqIAotICAgICAqIEByZXR1cm4gYSB3aWRnZXQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIG1lbnUgdG8gcG9wIHVwIG9yCi0gICAgICogIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdyBwb3NpdGlvbiBpbnNpZGUgdGhlIHdpZGdldCBjYW4KLSAgICAgKiAgYmUgY29tcHV0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZU1lbnVMb2NhdGlvbihUYWJsZSB0YWJsZSkgewotICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotICAgICAgICBSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHRhYmxlLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgc3dpdGNoIChpdGVtcy5sZW5ndGgpIHsKLSAgICAgICAgY2FzZSAwOiB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBpdGVtc1swXS5nZXRCb3VuZHMoMCk7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgaUJvdW5kcyA9IGl0ZW1zWzBdLmdldEltYWdlQm91bmRzKDApOwotICAgICAgICAgICAgUmVjdGFuZ2xlIGludGVyc2VjdCA9IGNsaWVudEFyZWEuaW50ZXJzZWN0aW9uKGJvdW5kcyk7Ci0gICAgICAgICAgICBpZiAoaW50ZXJzZWN0ICE9IG51bGwgJiYgaW50ZXJzZWN0LmhlaWdodCA9PSBib3VuZHMuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChNYXRoLm1heCgwLCBib3VuZHMueCArIGlCb3VuZHMud2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0QXZhcmFnZUNoYXJXaXRoKHRhYmxlKSAqIENIQVJfSU5ERU5UKSwgYm91bmRzLnkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgYm91bmRzLmhlaWdodCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIFJlY3RhbmdsZVtdIHJlY3RhbmdsZXMgPSBuZXcgUmVjdGFuZ2xlW2l0ZW1zLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY3RhbmdsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICByZWN0YW5nbGVzW2ldID0gaXRlbXNbaV0uZ2V0Qm91bmRzKDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUmVjdGFuZ2xlIGlCb3VuZHMgPSBpdGVtc1swXS5nZXRJbWFnZUJvdW5kcygwKTsKLSAgICAgICAgICAgIFBvaW50IGN1cnNvckxvY2F0aW9uID0gdGFibGUuZ2V0RGlzcGxheSgpLmdldEN1cnNvckxvY2F0aW9uKCk7Ci0gICAgICAgICAgICBQb2ludCByZXN1bHQgPSBmaW5kQmVzdExvY2F0aW9uKGdldEluY2x1ZGVkUG9zaXRpb25zKHJlY3RhbmdsZXMsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudEFyZWEpLCB0YWJsZS50b0NvbnRyb2woY3Vyc29yTG9jYXRpb24pKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXN1bHQueCA9IHJlc3VsdC54ICsgaUJvdW5kcy53aWR0aCArIGdldEF2YXJhZ2VDaGFyV2l0aCh0YWJsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICogQ0hBUl9JTkRFTlQ7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFBvaW50W10gZ2V0SW5jbHVkZWRQb3NpdGlvbnMoUmVjdGFuZ2xlW10gcmVjdGFuZ2xlcywKLSAgICAgICAgICAgIFJlY3RhbmdsZSB3aWRnZXRCb3VuZHMpIHsKLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjdGFuZ2xlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3RhbmdsZSA9IHJlY3RhbmdsZXNbaV07Ci0gICAgICAgICAgICBSZWN0YW5nbGUgaW50ZXJzZWN0ID0gd2lkZ2V0Qm91bmRzLmludGVyc2VjdGlvbihyZWN0YW5nbGUpOwotICAgICAgICAgICAgaWYgKGludGVyc2VjdCAhPSBudWxsICYmIGludGVyc2VjdC5oZWlnaHQgPT0gcmVjdGFuZ2xlLmhlaWdodCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IFBvaW50KGludGVyc2VjdC54LCBpbnRlcnNlY3QueQotICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlcnNlY3QuaGVpZ2h0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChQb2ludFtdKSByZXN1bHQudG9BcnJheShuZXcgUG9pbnRbcmVzdWx0LnNpemUoKV0pOwotICAgIH0KLQotICAgIHByaXZhdGUgUG9pbnQgZmluZEJlc3RMb2NhdGlvbihQb2ludFtdIHBvaW50cywgUG9pbnQgcmVsYXRpdmVDdXJzb3IpIHsKLSAgICAgICAgUG9pbnQgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgZG91YmxlIGJlc3REaXN0ID0gRG91YmxlLk1BWF9WQUxVRTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFBvaW50IHBvaW50ID0gcG9pbnRzW2ldOwotICAgICAgICAgICAgaW50IGEgPSAwOwotICAgICAgICAgICAgaW50IGIgPSAwOwotICAgICAgICAgICAgaWYgKHBvaW50LnggPiByZWxhdGl2ZUN1cnNvci54KSB7Ci0gICAgICAgICAgICAgICAgYSA9IHBvaW50LnggLSByZWxhdGl2ZUN1cnNvci54OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhID0gcmVsYXRpdmVDdXJzb3IueCAtIHBvaW50Lng7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocG9pbnQueSA+IHJlbGF0aXZlQ3Vyc29yLnkpIHsKLSAgICAgICAgICAgICAgICBiID0gcG9pbnQueSAtIHJlbGF0aXZlQ3Vyc29yLnk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGIgPSByZWxhdGl2ZUN1cnNvci55IC0gcG9pbnQueTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvdWJsZSBkaXN0ID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpOwotICAgICAgICAgICAgaWYgKGRpc3QgPCBiZXN0RGlzdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBvaW50OwotICAgICAgICAgICAgICAgIGJlc3REaXN0ID0gZGlzdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEF2YXJhZ2VDaGFyV2l0aChDb250cm9sIGNvbnRyb2wpIHsKLSAgICAgICAgR0MgZ2MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2MgPSBuZXcgR0MoY29udHJvbCk7Ci0gICAgICAgICAgICByZXR1cm4gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZ2MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBnYy5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2FjdGlvbnMvUmV0YXJnZXRBY3Rpb25XaXRoRGVmYXVsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9hY3Rpb25zL1JldGFyZ2V0QWN0aW9uV2l0aERlZmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyMDg1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2FjdGlvbnMvUmV0YXJnZXRBY3Rpb25XaXRoRGVmYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlJldGFyZ2V0QWN0aW9uOwotCi0vKioKLSAqIEEgc3BlY2lhbGl6YXRpb24gb2YgUmV0YXJnZXRBY3Rpb24gdGhhdCBhbGxvd3MgZm9yIHNwZWNpZmljYXRpb24gb2YgYSBkZWZhdWx0Ci0gKiBoYW5kbGVyIHdoZW4gdGhlIGFjdGl2ZSBwYXJ0IGRvZXMgbm90IHN1cHBseSBvbmUuICBFbmFibGVtZW50IG9mIHRoaXMKLSAqIGFjdGlvbiBpcyBiYXNlZCBvbiBlbmFibGVtZW50IG9mIHRoZSBoYW5kbGVyLCBvciBlbmFibGVtZW50IG9mIHRoZSBkZWZhdWx0Ci0gKiBoYW5kbGVyIGlmIG5vIGV4cGxpY2l0IGhhbmRsZXIgaXMgYXZhaWxhYmxlLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXRhcmdldEFjdGlvbldpdGhEZWZhdWx0IGV4dGVuZHMgUmV0YXJnZXRBY3Rpb24gewotCi0JcHJpdmF0ZSBJQWN0aW9uIGRlZmF1bHRIYW5kbGVyOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFJldGFyZ2V0QWN0aW9uV2l0aERlZmF1bHQgd2l0aCB0aGUgZ2l2ZW4gYWN0aW9uIGlkIGFuZCB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25JRCB0aGUgcmV0YXJnZXRhYmxlIGFjdGlvbiBpZAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBhY3Rpb24ncyB0ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyB0ZXh0Ci0JICovCi0JcHVibGljIFJldGFyZ2V0QWN0aW9uV2l0aERlZmF1bHQoU3RyaW5nIGFjdGlvbklELCBTdHJpbmcgdGV4dCkgewotCQlzdXBlcihhY3Rpb25JRCwgdGV4dCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBSZXRhcmdldEFjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBY3Rpb25IYW5kbGVyKElBY3Rpb24gbmV3SGFuZGxlcikgewotCQlzdXBlci5zZXRBY3Rpb25IYW5kbGVyKG5ld0hhbmRsZXIpOwotCQkvLyBPbmx5IHNldCB0aGUgZGVmYXVsdCBoYW5kbGVyIGFmdGVyIGNsZWFyaW5nIHRoZSBvbGQgaGFuZGxlciBhYm92ZS4KLQkJLy8gVGhpcyB0cmlnZ2VycyBlbmFibGVtZW50IHVwZGF0aW5nIG9uIHRoZSBkZWZhdWx0IGhhbmRsZXIgd2hpY2ggCi0JCS8vIG1pZ2h0IGJlIG5lZWRlZCBzaW5jZSB0aGUgYWN0aXZlIHBhcnQgaGFzIGNoYW5nZWQuCi0JCWlmIChuZXdIYW5kbGVyID09IG51bGwpCi0JCQlzdXBlci5zZXRBY3Rpb25IYW5kbGVyKGRlZmF1bHRIYW5kbGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IGhhbmRsZXIgZm9yIHRoaXMgYWN0aW9uLgotCSAqIEBwYXJhbSBoYW5kbGVyIEFuIGFjdGlvbiBoYW5kbGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRIYW5kbGVyKElBY3Rpb24gaGFuZGxlcikgewotCQl0aGlzLmRlZmF1bHRIYW5kbGVyID0gaGFuZGxlcjsKLQkJaWYgKGdldEFjdGlvbkhhbmRsZXIoKSA9PSBudWxsICYmIGhhbmRsZXIgIT0gbnVsbCkKLQkJCXN1cGVyLnNldEFjdGlvbkhhbmRsZXIoaGFuZGxlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9hY3Rpb25zL1NlbGVjdEJ1aWxkV29ya2luZ1NldEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9hY3Rpb25zL1NlbGVjdEJ1aWxkV29ya2luZ1NldEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzc5ZjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvYWN0aW9ucy9TZWxlY3RCdWlsZFdvcmtpbmdTZXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSUFjdGlvbkJhckNvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci0KLS8qKgotICogVGhpcyBhY3Rpb24gYXNrcyB0aGUgdXNlciB0byBzZWxlY3QgYSB3b3JraW5nIHNldCwgYW5kIHRoZW4gY3JlYXRlcwotICogYW5kIHJ1bnMgYSBjb3JyZXNwb25kaW5nIEJ1aWxkU2V0QWN0aW9uLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RCdWlsZFdvcmtpbmdTZXRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cwotICAgICAgICBBY3Rpb25GYWN0b3J5LklXb3JrYmVuY2hBY3Rpb24gewotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLSAgICBwcml2YXRlIElBY3Rpb25CYXJDb25maWd1cmVyIGFjdGlvbkJhcnM7Ci0KLSAgICBwdWJsaWMgU2VsZWN0QnVpbGRXb3JraW5nU2V0QWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93LAotICAgICAgICAgICAgSUFjdGlvbkJhckNvbmZpZ3VyZXIgYWN0aW9uQmFycykgewotICAgICAgICBzdXBlcihJREVXb3JrYmVuY2hNZXNzYWdlcy5TZWxlY3RXb3JraW5nU2V0QWN0aW9uX3RleHQpOwotICAgICAgICB0aGlzLndpbmRvdyA9IHdpbmRvdzsKLSAgICAgICAgdGhpcy5hY3Rpb25CYXJzID0gYWN0aW9uQmFyczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElXb3JraW5nU2V0IHF1ZXJ5Rm9yV29ya2luZ1NldCgpIHsKLSAgICAgICAgSVdvcmtpbmdTZXRNYW5hZ2VyIG1hbmFnZXIgPSB3aW5kb3cuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0V29ya2luZ1NldE1hbmFnZXIoKTsKLSAgICAgICAgSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbWFuYWdlcgotICAgICAgICAgICAgICAgIC5jcmVhdGVXb3JraW5nU2V0U2VsZWN0aW9uRGlhbG9nKHdpbmRvdy5nZXRTaGVsbCgpLCBmYWxzZSk7Ci0gICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIElXb3JraW5nU2V0W10gc2V0cyA9IGRpYWxvZy5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgLy9jaGVjayBmb3IgY2FuY2VsCi0gICAgICAgIGlmIChzZXRzID09IG51bGwgfHwgc2V0cy5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gc2V0c1swXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIElXb3JraW5nU2V0IHNldCA9IHF1ZXJ5Rm9yV29ya2luZ1NldCgpOwotICAgICAgICBpZiAoc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5ldyBCdWlsZFNldEFjdGlvbihzZXQsIHdpbmRvdywgYWN0aW9uQmFycykucnVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhckNvbmZpZ3VyZXIgYWN0aW9uQmFycykgewotICAgICAgICB0aGlzLmFjdGlvbkJhcnMgPSBhY3Rpb25CYXJzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvYWN0aW9ucy9Ub2dnbGVBdXRvQnVpbGRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvYWN0aW9ucy9Ub2dnbGVBdXRvQnVpbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1MDc4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2FjdGlvbnMvVG9nZ2xlQXV0b0J1aWxkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotCi0vKioKLSAqIEFjdGlvbiBmb3IgdG9nZ2xpbmcgYXV0b2J1aWxkIG9uIG9yIG9mZi4KLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUF1dG9CdWlsZEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzCi0gICAgICAgIEFjdGlvbkZhY3RvcnkuSVdvcmtiZW5jaEFjdGlvbiB7Ci0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgVG9nZ2xlQXV0b0J1aWxkQWN0aW9uCi0gICAgICogQHBhcmFtIHdpbmRvdyBUaGUgd2luZG93IGZvciBwYXJlbnRpbmcgZGlhbG9ncyBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgVG9nZ2xlQXV0b0J1aWxkQWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgIHN1cGVyKElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9idWlsZEF1dG9tYXRpY2FsbHkpOwotICAgICAgICB0aGlzLndpbmRvdyA9IHdpbmRvdzsKLSAgICAgICAgc2V0Q2hlY2tlZChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5LklXb3JrYmVuY2hBY3Rpb24jZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgLy9ub3RoaW5nIHRvIGRpc3Bvc2UKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIElXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcoIWRlc2NyaXB0aW9uLmlzQXV0b0J1aWxkaW5nKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3Iod2luZG93LmdldFNoZWxsKCksIG51bGwsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0J1aWxkT3JkZXJQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0J1aWxkT3JkZXJQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjRkOTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9CdWlsZE9yZGVyUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkludGVnZXJGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkdsb2JhbEJ1aWxkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC51dGlsLlByZWZVdGlsOwotCi0vKioJCi0gKiBQYWdlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgb3JkZXIgcHJvamVjdHMgd2lsbCBiZSBidWlsdCBpbiAKLSAqIGJ5IHRoZSB3b3Jrc3BhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsZE9yZGVyUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0gICAgICAgIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZGVmYXVsdE9yZGVyQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBMYWJlbCBidWlsZExhYmVsOwotCi0gICAgcHJpdmF0ZSBMaXN0IGJ1aWxkTGlzdDsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgSW50ZWdlckZpZWxkRWRpdG9yIG1heEl0ZXJzRmllbGQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGRlZmF1bHRCdWlsZE9yZGVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBjdXN0b21CdWlsZE9yZGVyOwotCi0gICAgLy9Cb29sZWFuIHRvIGluZGljYXRlIGlmIHdlIGhhdmUgbG9va2VkIGl0IHVwCi0gICAgcHJpdmF0ZSBib29sZWFuIG5vdENoZWNrZWRCdWlsZE9yZGVyID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFVQX0xBQkVMID0gSURFV29ya2JlbmNoTWVzc2FnZXMuQnVpbGRPcmRlclByZWZlcmVuY2VfdXA7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBET1dOX0xBQkVMID0gSURFV29ya2JlbmNoTWVzc2FnZXMuQnVpbGRPcmRlclByZWZlcmVuY2VfZG93bjsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEFERF9MQUJFTCA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLkJ1aWxkT3JkZXJQcmVmZXJlbmNlX2FkZDsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFJFTU9WRV9MQUJFTCA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLkJ1aWxkT3JkZXJQcmVmZXJlbmNlX3JlbW92ZTsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFBST0pFQ1RfU0VMRUNUSU9OX01FU1NBR0UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5CdWlsZE9yZGVyUHJlZmVyZW5jZV9zZWxlY3RPdGhlclByb2plY3RzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVFNfTEFCRUwgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5CdWlsZE9yZGVyUHJlZmVyZW5jZV91c2VEZWZhdWx0czsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIExJU1RfTEFCRUwgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5CdWlsZE9yZGVyUHJlZmVyZW5jZV9wcm9qZWN0QnVpbGRPcmRlcjsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIE5PVEVfTEFCRUwgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5QcmVmZXJlbmNlX25vdGU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBSRU1PVkVfTUVTU0FHRSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLkJ1aWxkT3JkZXJQcmVmZXJlbmNlX3JlbW92ZU5vdGU7Ci0KLSAgICAvLyB3aGV0aGVyIG9yIG5vdCB0aGUgdXNlIGRlZmF1bHRzIG9wdGlvbiB3YXMgc2VsZWN0ZWQgd2hlbiBBcHBseSAob3IgT0spIHdhcyBsYXN0IHByZXNzZWQKLSAgICAvLyAob3Igd2hlbiB0aGUgcHJlZmVyZW5jZSBwYWdlIHdhcyBvcGVuZWQpLiBUaGlzIHJlcHJlc2VudHMgdGhlIG1vc3QgcmVjZW50IGFwcGxpZWQgc3RhdGUuCi0gICAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRPcmRlckluaXRpYWxseVNlbGVjdGVkOwotCi0gICAgcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWxpZGl0eUNoYW5nZUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoRmllbGRFZGl0b3IuSVNfVkFMSUQpKQotICAgICAgICAgICAgICAgIHVwZGF0ZVZhbGlkU3RhdGUoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYW5vdGhlciBwcm9qZWN0IHRvIHRoZSBsaXN0IGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb2plY3QoKSB7Ci0KLSAgICAgICAgU3RyaW5nW10gY3VycmVudEl0ZW1zID0gdGhpcy5idWlsZExpc3QuZ2V0SXRlbXMoKTsKLQotICAgICAgICBJUHJvamVjdFtdIGFsbFByb2plY3RzID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0KLSAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGVsZW1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgU2ltcGxlTGlzdENvbnRlbnRQcm92aWRlciBjb250ZW50c1Byb3ZpZGVyID0gbmV3IFNpbXBsZUxpc3RDb250ZW50UHJvdmlkZXIoKTsKLSAgICAgICAgY29udGVudHNQcm92aWRlcgotICAgICAgICAgICAgICAgIC5zZXRFbGVtZW50cyhzb3J0ZWREaWZmZXJlbmNlKGFsbFByb2plY3RzLCBjdXJyZW50SXRlbXMpKTsKLQotICAgICAgICBMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICB0aGlzLCBjb250ZW50c1Byb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLAotICAgICAgICAgICAgICAgIFBST0pFQ1RfU0VMRUNUSU9OX01FU1NBR0UpOwotCi0gICAgICAgIGlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5PSykKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0KLSAgICAgICAgaW50IGN1cnJlbnRJdGVtc0xlbmd0aCA9IGN1cnJlbnRJdGVtcy5sZW5ndGg7Ci0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotICAgICAgICBTdHJpbmdbXSBuZXdJdGVtcyA9IG5ldyBTdHJpbmdbY3VycmVudEl0ZW1zTGVuZ3RoICsgcmVzdWx0TGVuZ3RoXTsKLQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnRJdGVtcywgMCwgbmV3SXRlbXMsIDAsIGN1cnJlbnRJdGVtc0xlbmd0aCk7Ci0gICAgICAgIFN5c3RlbQotICAgICAgICAgICAgICAgIC5hcnJheWNvcHkocmVzdWx0LCAwLCBuZXdJdGVtcywgY3VycmVudEl0ZW1zTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIHRoaXMuYnVpbGRMaXN0LnNldEl0ZW1zKG5ld0l0ZW1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWxpZCBzdGF0ZSBvZiB0aGUgcGFnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVmFsaWRTdGF0ZSgpIHsKLSAgICAgICAgc2V0VmFsaWQobWF4SXRlcnNGaWVsZC5pc1ZhbGlkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgbGlzdCBvZiBidWlsZCBwYXRocy4gSWYgdGhlIGN1cnJlbnQgYnVpbGQgb3JkZXIgaXMgZW1wdHkgbWFrZSB0aGUgbGlzdCBlbXB0eQotICAgICAqIGFuZCBkaXNhYmxlIGl0LgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgLSB0aGUgcGFyZW50IHRvIGNyZWF0ZSB0aGUgbGlzdCBpbgotICAgICAqIEBwYXJhbSBlbmFibGVkIC0gdGhlIGJvb2xlYW4gdGhhdCBpbmRjYXRlcyBpZiB0aGUgbGlzdCB3aWxsIGJlIHNlbnNpdGl2ZSBpbml0aWFsbHkgb3Igbm90Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1aWxkT3JkZXJMaXN0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZW5hYmxlZCkgewotCi0gICAgICAgIEZvbnQgZm9udCA9IGNvbXBvc2l0ZS5nZXRGb250KCk7Ci0KLSAgICAgICAgdGhpcy5idWlsZExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICB0aGlzLmJ1aWxkTGFiZWwuc2V0VGV4dChMSVNUX0xBQkVMKTsKLSAgICAgICAgdGhpcy5idWlsZExhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHRoaXMuYnVpbGRMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgdGhpcy5idWlsZExhYmVsLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgdGhpcy5idWlsZExpc3QgPSBuZXcgTGlzdChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkKLSAgICAgICAgICAgICAgICB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgICAgIHRoaXMuYnVpbGRMaXN0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgLy9TZXQgaGVpZ2h0SGludCB3aXRoIGEgc21hbGwgdmFsdWUgc28gdGhlIGxpc3Qgc2l6ZSB3aWxsIGJlIGRlZmluZWQgYnkgCi0gICAgICAgIC8vdGhlIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGUgZGlhbG9nIGluc3RlYWQgb2YgcmVzaXppbmcgdGhlIGRpYWxvZyB0bwotICAgICAgICAvL2ZpdCBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LgotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSBidWlsZExpc3QuZ2V0SXRlbUhlaWdodCgpOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIHRoaXMuYnVpbGRMaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHRoaXMuYnVpbGRMaXN0LnNldEZvbnQoZm9udCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB3aWRnZXRzIHRoYXQgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBidWlsZCBvcmRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgIAlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwKLSAgICAgICAgICAgICAgICBJSURFSGVscENvbnRleHRJZHMuQlVJTERfT1JERVJfUFJFRkVSRU5DRV9QQUdFKTsKLQotICAgICAgICBGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCi0gICAgICAgIC8vVGhlIG1haW4gY29tcG9zaXRlCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIFN0cmluZ1tdIGJ1aWxkT3JkZXIgPSBnZXRDdXJyZW50QnVpbGRPcmRlcigpOwotICAgICAgICBib29sZWFuIHVzZURlZmF1bHQgPSAoYnVpbGRPcmRlciA9PSBudWxsKTsKLQotICAgICAgICBjcmVhdGVEZWZhdWx0UGF0aEJ1dHRvbihjb21wb3NpdGUsIHVzZURlZmF1bHQpOwotICAgICAgICAvLyBMaXN0IGFsd2F5cyBlbmFibGVkIHNvIHVzZXIgY2FuIHNjcm9sbCBsaXN0LgotICAgICAgICAvLyBPbmx5IHRoZSBidXR0b25zIG5lZWQgdG8gYmUgZGlzYWJsZWQuCi0gICAgICAgIGNyZWF0ZUJ1aWxkT3JkZXJMaXN0KGNvbXBvc2l0ZSwgdHJ1ZSk7Ci0gICAgICAgIGNyZWF0ZUxpc3RCdXR0b25zKGNvbXBvc2l0ZSwgIXVzZURlZmF1bHQpOwotCi0gICAgICAgIENvbXBvc2l0ZSBub3RlQ29tcG9zaXRlID0gY3JlYXRlTm90ZUNvbXBvc2l0ZShmb250LCBjb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgTk9URV9MQUJFTCwgUkVNT1ZFX01FU1NBR0UpOwotICAgICAgICBHcmlkRGF0YSBub3RlRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBub3RlRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG5vdGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShub3RlRGF0YSk7Ci0KLSAgICAgICAgY3JlYXRlU3BhY2VyKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgY3JlYXRlTWF4SXRlcmF0aW9uc0ZpZWxkKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgY3JlYXRlU3BhY2VyKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgaWYgKHVzZURlZmF1bHQpIHsKLSAgICAgICAgICAgIHRoaXMuYnVpbGRMaXN0LnNldEl0ZW1zKGdldERlZmF1bHRQcm9qZWN0T3JkZXIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmJ1aWxkTGlzdC5zZXRJdGVtcyhidWlsZE9yZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGluIGEgc3BhY2VyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU3BhY2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBzcGFjZXJEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIHNwYWNlckRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBzcGFjZXIuc2V0TGF5b3V0RGF0YShzcGFjZXJEYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGRlZmF1bHQgcGF0aCBidXR0b24uIFNldCBpdCB0byBzZWxlY3RlZCBiYXNlZCBvbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UKLSAgICAgKiBidWlsZCBwYXRoLgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0gICAgICogQHBhcmFtIHNlbGVjdGVkIC0gdGhlIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgdGhlIGJ1dHRvbnMgaW5pdGlhbCBzdGF0ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0UGF0aEJ1dHRvbihDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIHNlbGVjdGVkKSB7Ci0KLSAgICAgICAgZGVmYXVsdE9yZGVySW5pdGlhbGx5U2VsZWN0ZWQgPSBzZWxlY3RlZDsKLQotICAgICAgICB0aGlzLmRlZmF1bHRPcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTEVGVCB8IFNXVC5DSEVDSyk7Ci0gICAgICAgIHRoaXMuZGVmYXVsdE9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbihzZWxlY3RlZCk7Ci0gICAgICAgIHRoaXMuZGVmYXVsdE9yZGVyQnV0dG9uLnNldFRleHQoREVGQVVMVFNfTEFCRUwpOwotICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGRlZmF1bHRzQnV0dG9uU2VsZWN0ZWQoZGVmYXVsdE9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgdGhpcy5kZWZhdWx0T3JkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHRoaXMuZGVmYXVsdE9yZGVyQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICB0aGlzLmRlZmF1bHRPcmRlckJ1dHRvbi5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgYnV0dG9ucyB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGxpc3QuIFRoZXNlIEFkZCwgUmVtb3ZlIGFuZCBNb3ZlIFVwIG9yIERvd24KLSAgICAgKiB0aGUgbGlzdCBpdGVtcy4KLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlIHRoZSBwYXJlbnQgb2YgdGhlIGJ1dHRvbnMKLSAgICAgKiBAcGFyYW0gZW5hYmxlQ29tcG9zaXRlIC0gYm9vbGVhbiB0aGF0IGluZGljYXRlcyBpZiBhIGNvbXBvc2l0ZSBzaG91bGQgYmUgZW5hYmxlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVMaXN0QnV0dG9ucyhDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGVuYWJsZUNvbXBvc2l0ZSkgewotCi0gICAgICAgIEZvbnQgZm9udCA9IGNvbXBvc2l0ZS5nZXRGb250KCk7Ci0KLSAgICAgICAgLy9DcmVhdGUgYW4gaW50ZXJtZWRpdGF0ZSBjb21wb3NpdGUgdG8ga2VlcCB0aGUgYnV0dG9ucyBpbiB0aGUgc2FtZSBjb2x1bW4KLSAgICAgICAgdGhpcy5idXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULlJJR0hUKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgdGhpcy5idXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIHRoaXMuYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICB0aGlzLmJ1dHRvbkNvbXBvc2l0ZS5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIEJ1dHRvbiB1cEJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcy5idXR0b25Db21wb3NpdGUsIFNXVC5DRU5URVIKLSAgICAgICAgICAgICAgICB8IFNXVC5QVVNIKTsKLSAgICAgICAgdXBCdXR0b24uc2V0VGV4dChVUF9MQUJFTCk7Ci0gICAgICAgIHVwQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlQ29tcG9zaXRlKTsKLSAgICAgICAgdXBCdXR0b24uc2V0Rm9udChmb250KTsKLSAgICAgICAgc2V0QnV0dG9uTGF5b3V0RGF0YSh1cEJ1dHRvbik7Ci0KLSAgICAgICAgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb3ZlU2VsZWN0aW9uVXAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgdXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIEJ1dHRvbiBkb3duQnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLmJ1dHRvbkNvbXBvc2l0ZSwgU1dULkNFTlRFUgotICAgICAgICAgICAgICAgIHwgU1dULlBVU0gpOwotICAgICAgICBkb3duQnV0dG9uLnNldFRleHQoRE9XTl9MQUJFTCk7Ci0gICAgICAgIGRvd25CdXR0b24uc2V0RW5hYmxlZChlbmFibGVDb21wb3NpdGUpOwotICAgICAgICBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vdmVTZWxlY3Rpb25Eb3duKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGRvd25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBkb3duQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIHNldEJ1dHRvbkxheW91dERhdGEoZG93bkJ1dHRvbik7Ci0KLSAgICAgICAgQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcy5idXR0b25Db21wb3NpdGUsIFNXVC5DRU5URVIKLSAgICAgICAgICAgICAgICB8IFNXVC5QVVNIKTsKLSAgICAgICAgYWRkQnV0dG9uLnNldFRleHQoQUREX0xBQkVMKTsKLSAgICAgICAgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBhZGRQcm9qZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZUNvbXBvc2l0ZSk7Ci0gICAgICAgIGFkZEJ1dHRvbi5zZXRGb250KGZvbnQpOwotICAgICAgICBzZXRCdXR0b25MYXlvdXREYXRhKGFkZEJ1dHRvbik7Ci0KLSAgICAgICAgQnV0dG9uIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcy5idXR0b25Db21wb3NpdGUsIFNXVC5DRU5URVIKLSAgICAgICAgICAgICAgICB8IFNXVC5QVVNIKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldFRleHQoUkVNT1ZFX0xBQkVMKTsKLSAgICAgICAgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlQ29tcG9zaXRlKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIHNldEJ1dHRvbkxheW91dERhdGEocmVtb3ZlQnV0dG9uKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgZmllbGQgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIGluIHRoZSBwcmVzZW5jZQotICAgICAqIG9mIGN5Y2xlcy4gCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU1heEl0ZXJhdGlvbnNGaWVsZChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIENvbXBvc2l0ZSBtYXhJdGVyc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIG1heEl0ZXJzQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBtYXhJdGVyc0NvbXBvc2l0ZS5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCi0gICAgICAgIG1heEl0ZXJzRmllbGQgPSBuZXcgSW50ZWdlckZpZWxkRWRpdG9yKAotICAgICAgICAgICAgICAgICIiLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5CdWlsZE9yZGVyUHJlZmVyZW5jZV9tYXhJdGVyYXRpb25zTGFiZWwsIG1heEl0ZXJzQ29tcG9zaXRlKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvTG9hZCgpIHsKLSAgICAgICAgICAgICAgICBUZXh0IHRleHQgPSBnZXRUZXh0Q29udHJvbCgpOwotICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNYXhCdWlsZEl0ZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcodmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvTG9hZERlZmF1bHQoKSB7Ci0gICAgICAgICAgICAgICAgVGV4dCB0ZXh0ID0gZ2V0VGV4dENvbnRyb2woKTsKLSAgICAgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uUFJFRl9NQVhfQlVJTERfSVRFUkFUSU9OUyk7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbHVlQ2hhbmdlZCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb1N0b3JlKCkgewotICAgICAgICAgICAgICAgIC8vIGhhbmRsZWQgc3BlY2lhbGx5IGluIHBlcmZvcm1PSygpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1heEl0ZXJzRmllbGQuc2V0VmFsaWRSYW5nZSgxLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgICAgIG1heEl0ZXJzRmllbGQuc2V0UGFnZSh0aGlzKTsKLSAgICAgICAgbWF4SXRlcnNGaWVsZC5zZXRQcmVmZXJlbmNlU3RvcmUoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotICAgICAgICBtYXhJdGVyc0ZpZWxkLnNldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodmFsaWRpdHlDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgIG1heEl0ZXJzRmllbGQubG9hZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0cyBidXR0b24gaGFzIGJlZW4gc2VsZWN0ZWQgLSB1cGRhdGUgdGhlIG90aGVyIHdpZGdldHMgYXMgcmVxdWlyZWQuCi0gICAgICogQHBhcmFtIHNlbGVjdGVkIC0gd2hldGhlciBvciBub3QgdGhlIGRlZmF1bHRzIGJ1dHRvbiBnb3Qgc2VsZWN0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGVmYXVsdHNCdXR0b25TZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZCkgewotICAgICAgICAgICAgc2V0QnVpbGRPcmRlcldpZGdldHNFbmFibGVtZW50KGZhbHNlKTsKLSAgICAgICAgICAgIC8vQ2FjaGUgdGhlIGN1cnJlbnQgdmFsdWUgYXMgdGhlIGN1c3RvbSBvcmRlcgotICAgICAgICAgICAgY3VzdG9tQnVpbGRPcmRlciA9IGJ1aWxkTGlzdC5nZXRJdGVtcygpOwotICAgICAgICAgICAgYnVpbGRMaXN0LnNldEl0ZW1zKGdldERlZmF1bHRQcm9qZWN0T3JkZXIoKSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldEJ1aWxkT3JkZXJXaWRnZXRzRW5hYmxlbWVudCh0cnVlKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGJ1aWxkT3JkZXIgPSBnZXRDdXJyZW50QnVpbGRPcmRlcigpOwotICAgICAgICAgICAgaWYgKGJ1aWxkT3JkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBidWlsZExpc3Quc2V0SXRlbXMoZ2V0RGVmYXVsdFByb2plY3RPcmRlcigpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBidWlsZExpc3Quc2V0SXRlbXMoYnVpbGRPcmRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByb2plY3QgbmFtZXMgZm9yIHRoZSBjdXJyZW50IGN1c3RvbSBidWlsZAotICAgICAqIG9yZGVyIHN0b3JlZCBpbiB0aGUgd29ya3NwYWNlIGRlc2NyaXB0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc2V0dGluZwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0Q3VycmVudEJ1aWxkT3JkZXIoKSB7Ci0gICAgICAgIGlmIChub3RDaGVja2VkQnVpbGRPcmRlcikgewotICAgICAgICAgICAgY3VzdG9tQnVpbGRPcmRlciA9IGdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCkuZ2V0QnVpbGRPcmRlcigpOwotICAgICAgICAgICAgbm90Q2hlY2tlZEJ1aWxkT3JkZXIgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjdXN0b21CdWlsZE9yZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJvamVjdCBuYW1lcyBpbiB0aGUgZGVmYXVsdCBidWlsZCBvcmRlcgotICAgICAqIGJhc2VkIG9uIHRoZSBjdXJyZW50IFdvcmtzcGFjZSBzZXR0aW5ncy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0RGVmYXVsdFByb2plY3RPcmRlcigpIHsKLSAgICAgICAgaWYgKGRlZmF1bHRCdWlsZE9yZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgICAgICBJV29ya3NwYWNlLlByb2plY3RPcmRlciBwcm9qZWN0T3JkZXIgPSBnZXRXb3Jrc3BhY2UoKQotICAgICAgICAgICAgICAgICAgICAuY29tcHV0ZVByb2plY3RPcmRlcih3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkpOwotICAgICAgICAgICAgSVByb2plY3RbXSBmb3VuZFByb2plY3RzID0gcHJvamVjdE9yZGVyLnByb2plY3RzOwotICAgICAgICAgICAgZGVmYXVsdEJ1aWxkT3JkZXIgPSBuZXcgU3RyaW5nW2ZvdW5kUHJvamVjdHMubGVuZ3RoXTsKLSAgICAgICAgICAgIGludCBmb3VuZFNpemUgPSBmb3VuZFByb2plY3RzLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm91bmRTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0QnVpbGRPcmRlcltpXSA9IGZvdW5kUHJvamVjdHNbaV0uZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRCdWlsZE9yZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgV29ya3NwYWNlIHRoZSBidWlsZCBvcmRlciBpcyBmcm9tLgotICAgICAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZQotICAgICAqLwotICAgIHByaXZhdGUgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHNlYXJjaEVsZW1lbnQgaXMgaW4gdGVzdEFycmF5LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlcyhTdHJpbmdbXSB0ZXN0QXJyYXksIFN0cmluZyBzZWFyY2hFbGVtZW50KSB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0QXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChzZWFyY2hFbGVtZW50LmVxdWFscyh0ZXN0QXJyYXlbaV0pKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UuIFRoaXMgY2xhc3MgZG9lcyBub3RoaW5nIHdpdGggaGUgV29ya2JlbmNoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLSAgICAgICAgdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0gICAgICAgIHNldFByZWZlcmVuY2VTdG9yZShQcmVmVXRpbC5nZXRJbnRlcm5hbFByZWZlcmVuY2VTdG9yZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgYnVpbGQgbGlzdCBkb3duLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtb3ZlU2VsZWN0aW9uRG93bigpIHsKLQotICAgICAgICAvL09ubHkgZG8gdGhpcyBvcGVyYXRpb24gb24gYSBzaW5nbGUgc2VsZWN0aW9uCi0gICAgICAgIGlmICh0aGlzLmJ1aWxkTGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpID09IDEpIHsKLSAgICAgICAgICAgIGludCBjdXJyZW50SW5kZXggPSB0aGlzLmJ1aWxkTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IHRoaXMuYnVpbGRMaXN0LmdldEl0ZW1Db3VudCgpIC0gMSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50VG9Nb3ZlID0gdGhpcy5idWlsZExpc3QuZ2V0SXRlbShjdXJyZW50SW5kZXgpOwotICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRMaXN0LnJlbW92ZShjdXJyZW50SW5kZXgpOwotICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRMaXN0LmFkZChlbGVtZW50VG9Nb3ZlLCBjdXJyZW50SW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkTGlzdC5zZWxlY3QoY3VycmVudEluZGV4ICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgYnVpbGQgbGlzdCB1cC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbW92ZVNlbGVjdGlvblVwKCkgewotCi0gICAgICAgIGludCBjdXJyZW50SW5kZXggPSB0aGlzLmJ1aWxkTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCi0gICAgICAgIC8vT25seSBkbyB0aGlzIG9wZXJhdGlvbiBvbiBhIHNpbmdsZSBzZWxlY3Rpb24KLSAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDAgJiYgdGhpcy5idWlsZExpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSA9PSAxKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudFRvTW92ZSA9IHRoaXMuYnVpbGRMaXN0LmdldEl0ZW0oY3VycmVudEluZGV4KTsKLSAgICAgICAgICAgIHRoaXMuYnVpbGRMaXN0LnJlbW92ZShjdXJyZW50SW5kZXgpOwotICAgICAgICAgICAgdGhpcy5idWlsZExpc3QuYWRkKGVsZW1lbnRUb01vdmUsIGN1cnJlbnRJbmRleCAtIDEpOwotICAgICAgICAgICAgdGhpcy5idWlsZExpc3Quc2VsZWN0KGN1cnJlbnRJbmRleCAtIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAgICogSW4gdGhpcyBjYXNlIGNoYW5nZSB0aGUgZGVmYXVsdE9yZGVyQnV0dG9uIHRvIGhhdmUgaXQncyBzZWxlY3Rpb24gc2V0IHRvIHRydWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotICAgICAgICB0aGlzLmRlZmF1bHRPcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIGRlZmF1bHRzQnV0dG9uU2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIG1heEl0ZXJzRmllbGQubG9hZERlZmF1bHQoKTsKLSAgICAgICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIE9LIGhhcyBiZWVuIHByZXNzZWQuIElmIHRoZSBkZWZ1YWx0IGJ1dHRvbiBpcyBwcmVzc2VkIHRoZW4gcmVzZXQgdGhlIGJ1aWxkIG9yZGVyIHRvIGZhbHNlOwotICAgICAqIG90aGVyd2lzZSBzZXQgaXQgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQotICAgICAgICBTdHJpbmdbXSBidWlsZE9yZGVyID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiB1c2VEZWZhdWx0ID0gZGVmYXVsdE9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgIC8vIGlmIHVzZSBkZWZhdWx0cyBpcyB0dXJuZWQgb2ZmCi0gICAgICAgIGlmICghdXNlRGVmYXVsdCkKLSAgICAgICAgICAgIGJ1aWxkT3JkZXIgPSBidWlsZExpc3QuZ2V0SXRlbXMoKTsKLQotICAgICAgICAvL0dldCBhIGNvcHkgb2YgdGhlIGRlc2NyaXB0aW9uIGZyb20gdGhlIHdvcmtzcGFjZSwgc2V0IHRoZSBidWlsZCBvcmRlciBhbmQgdGhlbgotICAgICAgICAvL2FwcGx5IGl0IHRvIHRoZSB3b3Jrc3BhY2UuCi0gICAgICAgIElXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uLnNldEJ1aWxkT3JkZXIoYnVpbGRPcmRlcik7Ci0gICAgICAgIGRlc2NyaXB0aW9uLnNldE1heEJ1aWxkSXRlcmF0aW9ucyhtYXhJdGVyc0ZpZWxkLmdldEludFZhbHVlKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgLy9mYWlsZWQgLSByZXR1cm4gZmFsc2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFBlcmZvcm0gYXV0by1idWlsZCBpZiB1c2UgZGVmYXVsdCBpcyBvZmYgKGJlY2F1c2UKLSAgICAgICAgLy8gb3JkZXIgY291bGQgaGF2ZSBjaGFuZ2VkKSBvciBpZiB1c2UgZGVmYXVsdCBzZXR0aW5nCi0gICAgICAgIC8vIHdhcyBjaGFuZ2VkLgotICAgICAgICBpZiAoIXVzZURlZmF1bHQgfHwgKHVzZURlZmF1bHQgIT0gZGVmYXVsdE9yZGVySW5pdGlhbGx5U2VsZWN0ZWQpKSB7Ci0gICAgICAgICAgICBkZWZhdWx0T3JkZXJJbml0aWFsbHlTZWxlY3RlZCA9IHVzZURlZmF1bHQ7Ci0gICAgICAgICAgICAvLyBJZiBhdXRvIGJ1aWxkIGlzIHR1cm5lZCBvbiwgdGhlbiBkbyBhIGdsb2JhbCBpbmNyZW1lbnRhbAotICAgICAgICAgICAgLy8gYnVpbGQgb24gYWxsIHRoZSBwcm9qZWN0cy4KLSAgICAgICAgICAgIGlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKSkgewotICAgICAgICAgICAgICAgIEdsb2JhbEJ1aWxkQWN0aW9uIGFjdGlvbiA9IG5ldyBHbG9iYWxCdWlsZEFjdGlvbih3b3JrYmVuY2gKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQpOwotICAgICAgICAgICAgICAgIGFjdGlvbi5kb0J1aWxkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDbGVhciB0aGUgY3VzdG9tIGJ1aWxkIG9yZGVyIGNhY2hlCi0gICAgICAgIGN1c3RvbUJ1aWxkT3JkZXIgPSBudWxsOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIGJ1aWxkIGxpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVNlbGVjdGlvbigpIHsKLQotICAgICAgICB0aGlzLmJ1aWxkTGlzdC5yZW1vdmUodGhpcy5idWlsZExpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHdpZGdldHMgdGhhdCBzZWxlY3QgYnVpbGQgb3JkZXIgdG8gYmUgZW5hYmxlZCBvciBkaWFibGVkLgotICAgICAqIEBwYXJhbSB2YWx1ZSBib29sZWFuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEJ1aWxkT3JkZXJXaWRnZXRzRW5hYmxlbWVudChib29sZWFuIHZhbHVlKSB7Ci0KLSAgICAgICAgLy8gT25seSBjaGFuZ2UgZW5hYmxlbWVudCBvZiBidXR0b25zLiBMZWF2ZSBsaXN0IGFsb25lCi0gICAgICAgIC8vIGJlY2F1c2UgeW91IGNhbid0IHNjcm9sbCBpdCB3aGVuIGRpc2FibGVkLgotICAgICAgICBDb250cm9sW10gY2hpbGRyZW4gPSB0aGlzLmJ1dHRvbkNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbltpXS5zZXRFbmFibGVkKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHNvcnRlZCBhcnJheSBvZiB0aGUgbmFtZXMgb2YgdGhlIHByb2plY3RzIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIGN1cnJlbnRseSAKLSAgICAgKiBkaXNwbGF5ZWQgbmFtZXMuCi0gICAgICogQHJldHVybiBTdHJpbmdbXQotICAgICAqIEBwYXJhbSBhbGxQcm9qZWN0cyAtIGFsbCBvZiB0aGUgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSAKLSAgICAgKiBAcGFyYW0gY3VycmVudGx5RGlzcGxheWVkIC0gdGhlIG5hbWVzIG9mIHRoZSBwcm9qZWN0cyBhbHJlYWR5IGJlaW5nIGRpc3BsYXllZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gc29ydGVkRGlmZmVyZW5jZShJUHJvamVjdFtdIGFsbFByb2plY3RzLAotICAgICAgICAgICAgU3RyaW5nW10gY3VycmVudGx5RGlzcGxheWVkKSB7Ci0KLSAgICAgICAgVHJlZVNldCBkaWZmZXJlbmNlID0gbmV3IFRyZWVTZXQoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbFByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWluY2x1ZGVzKGN1cnJlbnRseURpc3BsYXllZCwgYWxsUHJvamVjdHNbaV0uZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICBkaWZmZXJlbmNlLmFkZChhbGxQcm9qZWN0c1tpXS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcmV0dXJuVmFsdWUgPSBuZXcgU3RyaW5nW2RpZmZlcmVuY2Uuc2l6ZSgpXTsKLSAgICAgICAgZGlmZmVyZW5jZS50b0FycmF5KHJldHVyblZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9DbGVhbkRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0NsZWFuRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzM0MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0NsZWFuRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkdsb2JhbEJ1aWxkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5hY3Rpb25zLkJ1aWxkVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIERpYWxvZyB0aGF0IGFza3MgdGhlIHVzZXIgdG8gY29uZmlybSBhIGNsZWFuIG9wZXJhdGlvbiwgYW5kIHRvIGNvbmZpZ3VyZQotICogc2V0dGluZ3MgaW4gcmVsYXRpb24gdG8gdGhlIGNsZWFuLiBDbGlja2luZyBvayBpbiB0aGUgZGlhbG9nIHdpbGwgcGVyZm9ybSB0aGUKLSAqIGNsZWFuIG9wZXJhdGlvbi4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xlYW5EaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04gPSAiQ2xlYW5EaWFsb2dTZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX09SSUdJTl9YID0gIkRJQUxPR19YX09SSUdJTiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX09SSUdJTl9ZID0gIkRJQUxPR19ZX09SSUdJTiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX1dJRFRIID0gIkRJQUxPR19XSURUSCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0hFSUdIVCA9ICJESUFMT0dfSEVJR0hUIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT0dHTEVfU0VMRUNURUQgPSAiVE9HR0xFX1NFTEVDVEVEIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9OT1cgPSAiQlVJTERfTk9XIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgQnV0dG9uIGFsbEJ1dHRvbiwgc2VsZWN0ZWRCdXR0b24sIGJ1aWxkTm93QnV0dG9uOwotCi0gICAgcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHByb2plY3ROYW1lczsKLQotICAgIHByaXZhdGUgT2JqZWN0W10gc2VsZWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRleHQgb2YgdGhlIGNsZWFuIGRpYWxvZywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlCi0gICAgICogd29ya3NwYWNlIGlzIGN1cnJlbnRseSBpbiBhdXRvYnVpbGQgbW9kZS4KLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgcXVlc3Rpb24gdGhlIHVzZXIgd2lsbCBiZSBhc2tlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UXVlc3Rpb24oKSB7Ci0gICAgICAgIGJvb2xlYW4gYXV0b0J1aWxkaW5nID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzQXV0b0J1aWxkaW5nKCk7Ci0gICAgICAgIGlmIChhdXRvQnVpbGRpbmcpCi0gICAgICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoTWVzc2FnZXMuQ2xlYW5EaWFsb2dfYnVpbGRDbGVhbkF1dG87Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5DbGVhbkRpYWxvZ19idWlsZENsZWFuTWFudWFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY2xlYW4gZGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3aW5kb3cgdGhlIHdpbmRvdyB0byBjcmVhdGUgaXQgaW4KLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJvamVjdHMgKG1heSBiZSBlbXB0eSkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xlYW5EaWFsb2coSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3csIElQcm9qZWN0W10gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHN1cGVyKAotICAgICAgICAgICAgICAgIHdpbmRvdy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNsZWFuRGlhbG9nX3RpdGxlLCBudWxsLCBnZXRRdWVzdGlvbigpLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsKLSAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IE9iamVjdFswXTsKLSAgICAgICAgc2V0U2hlbGxTdHlsZShTV1QuUkVTSVpFIHwgZ2V0U2hlbGxTdHlsZSgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2J1dHRvblByZXNzZWQoaW50KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gY2xlYW5BbGwgPSBhbGxCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gYnVpbGRBbGwgPSBidWlsZE5vd0J1dHRvbiAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgYnVpbGROb3dCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotICAgICAgICBpZiAoYnV0dG9uSWQgIT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLSAgICAgICAgCXJldHVybjsKLSAgICAgICAgLy9zYXZlIGFsbCBkaXJ0eSBlZGl0b3JzCi0gICAgICAgIEJ1aWxkVXRpbGl0aWVzLnNhdmVFZGl0b3JzKG51bGwpOwotICAgICAgICAvL2JhdGNoaW5nIGNoYW5nZXMgZW5zdXJlcyB0aGF0IGF1dG9idWlsZCBydW5zIGFmdGVyIGNsZWFuaW5nCi0gICAgCVdvcmtzcGFjZUpvYiBjbGVhbkpvYiA9IG5ldyBXb3Jrc3BhY2VKb2IoSURFV29ya2JlbmNoTWVzc2FnZXMuQ2xlYW5EaWFsb2dfdGFza05hbWUpIHsKLSAgICAJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0gICAgCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5GQU1JTFlfTUFOVUFMX0JVSUxELmVxdWFscyhmYW1pbHkpOwotICAgIAkJfQotCQkJcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZG9DbGVhbihjbGVhbkFsbCwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgLy9zZWUgaWYgYSBidWlsZCB3YXMgcmVxdWVzdGVkCi0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkQWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vc3RhcnQgYW4gaW1tZWRpYXRlIHdvcmtzcGFjZSBidWlsZAotICAgICAgICAgICAgICAgICAgICBHbG9iYWxCdWlsZEFjdGlvbiBidWlsZCA9IG5ldyBHbG9iYWxCdWlsZEFjdGlvbih3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkLmRvQnVpbGQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgCQl9Ci0gICAgCX07Ci0gICAgICAgIGNsZWFuSm9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAuYnVpbGRSdWxlKCkpOwotICAgICAgICBjbGVhbkpvYi5zZXRVc2VyKHRydWUpOwotICAgICAgICBjbGVhbkpvYi5zY2hlZHVsZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZyNjcmVhdGVDdXN0b21BcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGFyZWEgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgICAgICBhcmVhLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBhcmVhLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciB1cGRhdGVFbmFibGVtZW50ID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRW5hYmxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKERJQUxPR19TRVRUSU5HU19TRUNUSU9OKTsKLSAgICAgICAgYm9vbGVhbiBzZWxlY3RTZWxlY3RlZEJ1dHRvbj0gc2V0dGluZ3MuZ2V0Qm9vbGVhbihUT0dHTEVfU0VMRUNURUQpOwotICAgICAgICAvL2ZpcnN0IHJvdwotICAgICAgICBhbGxCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5SQURJTyk7Ci0gICAgICAgIGFsbEJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLkNsZWFuRGlhbG9nX2NsZWFuQWxsQnV0dG9uKTsKLSAgICAgICAgYWxsQnV0dG9uLnNldFNlbGVjdGlvbighc2VsZWN0U2VsZWN0ZWRCdXR0b24pOwotICAgICAgICBhbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodXBkYXRlRW5hYmxlbWVudCk7Ci0gICAgICAgIHNlbGVjdGVkQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuUkFESU8pOwotICAgICAgICBzZWxlY3RlZEJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLkNsZWFuRGlhbG9nX2NsZWFuU2VsZWN0ZWRCdXR0b24pOwotICAgICAgICBzZWxlY3RlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oc2VsZWN0U2VsZWN0ZWRCdXR0b24pOwotICAgICAgICBzZWxlY3RlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih1cGRhdGVFbmFibGVtZW50KTsKLQotICAgICAgICAvL3NlY29uZCByb3cKLSAgICAgICAgY3JlYXRlUHJvamVjdFNlbGVjdGlvblRhYmxlKGFyZWEpOwotICAgICAgICAKLSAgICAgICAgLy90aGlyZCByb3cKLSAgICAgICAgLy9vbmx5IHByb21wdCBmb3IgaW1tZWRpYXRlIGJ1aWxkIGlmIGF1dG9idWlsZCBpcyBvZmYKLSAgICAgICAgaWYgKCFSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKSkgewotICAgICAgICAgICAgYnVpbGROb3dCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgICAgIGJ1aWxkTm93QnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuQ2xlYW5EaWFsb2dfYnVpbGROb3dCdXR0b24pOwotICAgICAgICAgICAgU3RyaW5nIGJ1aWxkTm93ID0gc2V0dGluZ3MuZ2V0KEJVSUxEX05PVyk7Ci0gICAgICAgICAgICBidWlsZE5vd0J1dHRvbi5zZXRTZWxlY3Rpb24oYnVpbGROb3cgPT0gbnVsbCB8fCBCb29sZWFuLnZhbHVlT2YoYnVpbGROb3cpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgIGJ1aWxkTm93QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotICAgICAgICAgICAgICAgICAgICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotICAgICAgICB9Ci0gICAgICAgIHByb2plY3ROYW1lcy5nZXRUYWJsZSgpLnNldEVuYWJsZWQoc2VsZWN0U2VsZWN0ZWRCdXR0b24pOwotICAgICAgICByZXR1cm4gYXJlYTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdFNlbGVjdGlvblRhYmxlKENvbXBvc2l0ZSByYWRpb0dyb3VwKSB7Ci0gICAgCXByb2plY3ROYW1lcyA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KHJhZGlvR3JvdXAsIFNXVC5CT1JERVIpOwotICAgIAlwcm9qZWN0TmFtZXMuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgCXByb2plY3ROYW1lcy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkpOwotICAgIAlwcm9qZWN0TmFtZXMuc2V0U29ydGVyKG5ldyBSZXNvdXJjZVNvcnRlcihSZXNvdXJjZVNvcnRlci5OQU1FKSk7Ci0gICAgCXByb2plY3ROYW1lcy5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsKLSAgICAJCXByaXZhdGUgZmluYWwgSVByb2plY3RbXSBwcm9qZWN0SG9sZGVyID0gbmV3IElQcm9qZWN0WzFdOwotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBlbGVtZW50OwotCQkJCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCXByb2plY3RIb2xkZXJbMF0gPSBwcm9qZWN0OwotCQkJCXJldHVybiBCdWlsZFV0aWxpdGllcy5pc0VuYWJsZWQocHJvamVjdEhvbGRlciwgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCk7Ci0JCQl9Ci0JCX0pOwotICAgIAlwcm9qZWN0TmFtZXMuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0gICAgCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgCWRhdGEud2lkdGhIaW50ID0gSURpYWxvZ0NvbnN0YW50cy5FTlRSWV9GSUVMRF9XSURUSDsKLSAgICAJZGF0YS5oZWlnaHRIaW50ID0gSURpYWxvZ0NvbnN0YW50cy5FTlRSWV9GSUVMRF9XSURUSDsKLSAgICAJcHJvamVjdE5hbWVzLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAJcHJvamVjdE5hbWVzLnNldENoZWNrZWRFbGVtZW50cyhzZWxlY3Rpb24pOwotICAgIAkvL3RhYmxlIGlzIGRpc2FibGVkIHRvIHN0YXJ0IGJlY2F1c2UgYWxsIGJ1dHRvbiBpcyBzZWxlY3RlZAotICAgIAlwcm9qZWN0TmFtZXMuZ2V0VGFibGUoKS5zZXRFbmFibGVkKHNlbGVjdGVkQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAJcHJvamVjdE5hbWVzLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlzZWxlY3Rpb24gPSBwcm9qZWN0TmFtZXMuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCQkJdXBkYXRlRW5hYmxlbWVudCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgYWN0dWFsIGNsZWFuIG9wZXJhdGlvbi4KLQkgKiBAcGFyYW0gY2xlYW5BbGwgaWYgPGNvZGU+dHJ1ZTwvdHJ1ZT4gY2xlYW4gYWxsIHByb2plY3RzCi0JICogQHBhcmFtIG1vbml0b3IgVGhlIG1vbml0b3IgdGhhdCB0aGUgYnVpbGQgd2lsbCByZXBvcnQgdG8KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gdGhyb3duIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBmcm9tIHRoZQotCSAqIGNvcmUgYnVpbGRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0NsZWFuKGJvb2xlYW4gY2xlYW5BbGwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgICAgaWYgKGNsZWFuQWxsKQotCSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmJ1aWxkKAotCSAgICAgICAgICAgICAgICBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBtb25pdG9yKTsKLQkgICAgZWxzZSB7Ci0JICAgICAgICB0cnkgewotCSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKElERVdvcmtiZW5jaE1lc3NhZ2VzLkNsZWFuRGlhbG9nX3Rhc2tOYW1lLCBzZWxlY3Rpb24ubGVuZ3RoKTsKLQkgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykKLQkgICAgICAgICAgICAgICAgKChJUHJvamVjdCkgc2VsZWN0aW9uW2ldKS5idWlsZCgKLQkgICAgICAgICAgICAgICAgICAgICAgICBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELAotCSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCSAgICAgICAgfSBmaW5hbGx5IHsKLQkgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLQkgICAgICAgIH0KLQkgICAgfQotCX0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGVuYWJsZW1lbnQgb2YgdGhlIGRpYWxvZydzIG9rIGJ1dHRvbiBiYXNlZAotICAgICAqIG9uIHRoZSBjdXJyZW50IGNob2ljZXMgaW4gdGhlIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbmFibGVtZW50KCkgewotICAgIAlwcm9qZWN0TmFtZXMuZ2V0VGFibGUoKS5zZXRFbmFibGVkKHNlbGVjdGVkQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gYWxsQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IHNlbGVjdGlvbi5sZW5ndGggPiAwOwotICAgICAgICBnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY2xvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotICAgICAgICBwZXJzaXN0RGlhbG9nU2V0dGluZ3MoZ2V0U2hlbGwoKSwgRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04pOwotICAgICAgICByZXR1cm4gc3VwZXIuY2xvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNnZXRJbml0aWFsTG9jYXRpb24ob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50KQotICAgICAqLwotICAgIHByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsTG9jYXRpb24oUG9pbnQgaW5pdGlhbFNpemUpIHsKLSAgICAgICAgUG9pbnQgcCA9IGdldEluaXRpYWxMb2NhdGlvbihESUFMT0dfU0VUVElOR1NfU0VDVElPTik7Ci0gICAgICAgIHJldHVybiBwICE9IG51bGwgPyBwIDogc3VwZXIuZ2V0SW5pdGlhbExvY2F0aW9uKGluaXRpYWxTaXplKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNnZXRJbml0aWFsU2l6ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxTaXplKCkgewotICAgICAgICBQb2ludCBwID0gc3VwZXIuZ2V0SW5pdGlhbFNpemUoKTsKLSAgICAgICAgcmV0dXJuIGdldEluaXRpYWxTaXplKERJQUxPR19TRVRUSU5HU19TRUNUSU9OLCBwKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5pdGlhbCBsb2NhdGlvbiB3aGljaCBpcyBwZXJzaXN0ZWQgaW4gdGhlIEFudCBVSSBQbHVnaW4gZGlhbG9nIHNldHRpbmdzCi0gICAgICogdW5kZXIgdGhlIHByb3ZpZGVkIGRpYWxvZyBzZXR0dGluZ3Mgc2VjdGlvbiBuYW1lLgotICAgICAqIElmIGxvY2F0aW9uIGlzIG5vdCBwZXJzaXN0ZWQgaW4gdGhlIHNldHRpbmdzLCB0aGUgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBkaWFsb2dTZXR0aW5nc1NlY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBkaWFsb2cgc2V0dGluZ3Mgc2VjdGlvbgotICAgICAqIEByZXR1cm4gVGhlIGluaXRpYWwgbG9jYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgUG9pbnQgZ2V0SW5pdGlhbExvY2F0aW9uKFN0cmluZyBkaWFsb2dTZXR0aW5nc1NlY3Rpb25OYW1lKSB7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKGRpYWxvZ1NldHRpbmdzU2VjdGlvbk5hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHg9IHNldHRpbmdzLmdldEludChESUFMT0dfT1JJR0lOX1gpOwotICAgICAgICAgICAgaW50IHk9IHNldHRpbmdzLmdldEludChESUFMT0dfT1JJR0lOX1kpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh4LHkpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncyhTdHJpbmcgZGlhbG9nU2V0dGluZ3NTZWN0aW9uTmFtZSkgewotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gc2V0dGluZ3MuZ2V0U2VjdGlvbihkaWFsb2dTZXR0aW5nc1NlY3Rpb25OYW1lKTsKLSAgICAgICAgaWYgKHNlY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oZGlhbG9nU2V0dGluZ3NTZWN0aW9uTmFtZSk7Ci0gICAgICAgIH0gCi0gICAgICAgIHJldHVybiBzZWN0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQZXJzaXN0cyB0aGUgbG9jYXRpb24gYW5kIGRpbWVuc2lvbnMgb2YgdGhlIHNoZWxsIGFuZCBvdGhlciB1c2VyIHNldHRpbmdzIGluIHRoZQotICAgICAqIHBsdWdpbidzIGRpYWxvZyBzZXR0aW5ncyB1bmRlciB0aGUgcHJvdmlkZWQgZGlhbG9nIHNldHRpbmdzIHNlY3Rpb24gbmFtZQotICAgICAqIAotICAgICAqIEBwYXJhbSBzaGVsbCBUaGUgc2hlbGwgd2hvc2UgZ2VvbWV0cnkgaXMgdG8gYmUgc3RvcmVkCi0gICAgICogQHBhcmFtIGRpYWxvZ1NldHRpbmdzU2VjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRpYWxvZyBzZXR0aW5ncyBzZWN0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBlcnNpc3REaWFsb2dTZXR0aW5ncyhTaGVsbCBzaGVsbCwgU3RyaW5nIGRpYWxvZ1NldHRpbmdzU2VjdGlvbk5hbWUpIHsKLSAgICAgICAgUG9pbnQgc2hlbGxMb2NhdGlvbiA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIFBvaW50IHNoZWxsU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoZGlhbG9nU2V0dGluZ3NTZWN0aW9uTmFtZSk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChESUFMT0dfT1JJR0lOX1gsIHNoZWxsTG9jYXRpb24ueCk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChESUFMT0dfT1JJR0lOX1ksIHNoZWxsTG9jYXRpb24ueSk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChESUFMT0dfV0lEVEgsIHNoZWxsU2l6ZS54KTsKLSAgICAgICAgc2V0dGluZ3MucHV0KERJQUxPR19IRUlHSFQsIHNoZWxsU2l6ZS55KTsKLSAgICAgICAgCi0gICAgICAgIGlmIChidWlsZE5vd0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXR0aW5ncy5wdXQoQlVJTERfTk9XLCBidWlsZE5vd0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0dGluZ3MucHV0KFRPR0dMRV9TRUxFQ1RFRCwgc2VsZWN0ZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbml0aWFsIHNpemUgd2hpY2ggaXMgdGhlIGxhcmdlciBvZiB0aGUgPGNvZGU+aW5pdGlhbFNpemU8L2NvZGU+IG9yCi0gICAgICogdGhlIHNpemUgcGVyc2lzdGVkIGluIHRoZSBBbnQgVUkgUGx1Z2luIGRpYWxvZyBzZXR0aW5ncyB1bmRlciB0aGUgcHJvdmlkZWQgZGlhbG9nIHNldHR0aW5ncyBzZWN0aW9uIG5hbWUuCi0gICAgICogSWYgbm8gc2l6ZSBpcyBwZXJzaXN0ZWQgaW4gdGhlIHNldHRpbmdzLCB0aGUgPGNvZGU+aW5pdGlhbFNpemU8L2NvZGU+IGlzIHJldHVybmVkLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5pdGlhbFNpemUgVGhlIGluaXRpYWxTaXplIHRvIGNvbXBhcmUgYWdhaW5zdAotICAgICAqIEBwYXJhbSBkaWFsb2dTZXR0aW5nc1NlY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBkaWFsb2cgc2V0dGluZ3Mgc2VjdGlvbgotICAgICAqIEByZXR1cm4gdGhlIGluaXRpYWwgc2l6ZQotICAgICAqLwotICAgIHByaXZhdGUgUG9pbnQgZ2V0SW5pdGlhbFNpemUoU3RyaW5nIGRpYWxvZ1NldHRpbmdzU2VjdGlvbk5hbWUsIFBvaW50IGluaXRpYWxTaXplKSB7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKGRpYWxvZ1NldHRpbmdzU2VjdGlvbk5hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHgsIHk7Ci0gICAgICAgICAgICB4ID0gc2V0dGluZ3MuZ2V0SW50KERJQUxPR19XSURUSCk7Ci0gICAgICAgICAgICB5ID0gc2V0dGluZ3MuZ2V0SW50KERJQUxPR19IRUlHSFQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChNYXRoLm1heCh4LCBpbml0aWFsU2l6ZS54KSwgTWF0aC5tYXgoeSwgaW5pdGlhbFNpemUueSkpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbml0aWFsU2l6ZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvQ29uZmlndXJhdGlvbkxvZ1VwZGF0ZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9Db25maWd1cmF0aW9uTG9nVXBkYXRlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODkwNmE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9Db25maWd1cmF0aW9uTG9nVXBkYXRlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFib3V0LklTeXN0ZW1TdW1tYXJ5U2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uLklGZWF0dXJlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnk7Ci0KLS8qKgotICogV3JpdGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1cGRhdGUgY29uZmlndXJlciBpbnRvIHRoZSBzeXN0ZW0gc3VtbWFyeS4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkxvZ1VwZGF0ZVNlY3Rpb24gaW1wbGVtZW50cyBJU3lzdGVtU3VtbWFyeVNlY3Rpb24gewotICAgIHB1YmxpYyB2b2lkIHdyaXRlKFByaW50V3JpdGVyIHdyaXRlcikgewotICAgIAkKLSAgICAJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmYgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0gICAgCXdyaXRlci5wcmludGxuKElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25Mb2dVcGRhdGVTZWN0aW9uX2luc3RhbGxDb25maWd1cmF0aW9uKTsgCi0gICAgCXdyaXRlci5wcmludGxuKCIgIiArIE5MUy5iaW5kKCBJREVXb3JrYmVuY2hNZXNzYWdlcy5Db25maWd1cmF0aW9uTG9nVXBkYXRlU2VjdGlvbl9sYXN0Q2hhbmdlZE9uLCBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpLmZvcm1hdChuZXcgRGF0ZShwbGF0Zm9ybUNvbmYuZ2V0Q2hhbmdlU3RhbXAoKSkpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAJd3JpdGVyLnByaW50bG4oIiAiICsgTkxTLmJpbmQoIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25Mb2dVcGRhdGVTZWN0aW9uX2xvY2F0aW9uLCBwbGF0Zm9ybUNvbmYuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAJCi0gICAgICAgCUlTaXRlRW50cnlbXSBzaXRlcyA9IHBsYXRmb3JtQ29uZi5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLSAgICAgICAJd3JpdGVyLnByaW50bG4oKTsKLSAgICAgICAJd3JpdGVyLnByaW50bG4oIiAiICsgSURFV29ya2JlbmNoTWVzc2FnZXMuQ29uZmlndXJhdGlvbkxvZ1VwZGF0ZVNlY3Rpb25fY29uZmlndXJhdGlvblNpdGVzKTsgICAvLyROT04tTkxTLTEkCi0gICAgICAgCWZvcihpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKyl7Ci0gICAgICAgCQl3cml0ZXIucHJpbnRsbigiICAiICsgc2l0ZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAJfQotICAgICAgIAkKLSAgICAgICAJd3JpdGVyLnByaW50bG4oKTsKLSAgICAgICAJd3JpdGVyLnByaW50bG4oIiAiICsgSURFV29ya2JlbmNoTWVzc2FnZXMuQ29uZmlndXJhdGlvbkxvZ1VwZGF0ZVNlY3Rpb25fY29uZmlndXJhdGlvbkZlYXR1cmVzKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAJSUZlYXR1cmVFbnRyeVtdIGZlYXR1cmVzID0gcGxhdGZvcm1Db25mLmdldENvbmZpZ3VyZWRGZWF0dXJlRW50cmllcygpOyAgICAgCi0gICAgICAgCWZvcihpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKyl7Ci0gICAgICAgCQl3cml0ZXIucHJpbnRsbigiICAiICsgTkxTLmJpbmQoIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25Mb2dVcGRhdGVTZWN0aW9uX2ZlYXR1cmVJZEFuZFZlcnNpb24sIGZlYXR1cmVzW2ldLmdldEZlYXR1cmVQbHVnaW5JZGVudGlmaWVyKCksIGZlYXR1cmVzW2ldLmdldEZlYXR1cmVQbHVnaW5WZXJzaW9uKCkpKTsgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAJfQotICAgICAgIAkKLSAgICAgICAJd3JpdGVyLnByaW50bG4oKTsKLSAgCQlVUkxbXSB1cmxzID0gcGxhdGZvcm1Db25mLmdldFBsdWdpblBhdGgoKTsKLSAgCQl3cml0ZXIucHJpbnRsbigiICIgKyBJREVXb3JrYmVuY2hNZXNzYWdlcy5Db25maWd1cmF0aW9uTG9nVXBkYXRlU2VjdGlvbl9wbHVnaW5zKTsgLy8kTk9OLU5MUy0xJAotICAgCQlmb3IoaW50IGogPSAwOyBqIDwgdXJscy5sZW5ndGg7IGorKyl7Ci0gICAJCQl3cml0ZXIucHJpbnRsbigiICAiICsgdXJsc1tqXS50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotICAgCQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0NyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9DcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYmU4YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0NyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVBhdGhWYXJpYWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLmRpYWxvZ3MuUGF0aFZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotCi0vKioKLSAqIFdpZGdldCBncm91cCBmb3Igc3BlY2lmeWluZyBhIGxpbmtlZCBmaWxlIG9yIGZvbGRlciB0YXJnZXQuCi0gKiAKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXAgewotICAgIHByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsaW5rVGFyZ2V0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgaW50IHR5cGU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlTGluayA9IGZhbHNlOwotCi0gICAgLy8gdXNlZCB0byBjb21wdXRlIGxheW91dCBzaXplcwotICAgIHByaXZhdGUgRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7Ci0KLSAgICAvLyB3aWRnZXRzCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgZ3JvdXBDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIFRleHQgbGlua1RhcmdldEZpZWxkOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gdmFyaWFibGVzQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBMYWJlbCByZXNvbHZlZFBhdGhMYWJlbFRleHQ7Ci0KLSAgICBwcml2YXRlIExhYmVsIHJlc29sdmVkUGF0aExhYmVsRGF0YTsKLQotCXByaXZhdGUgZmluYWwgSVN0cmluZ1ZhbHVlIHVwZGF0YWJsZVJlc291cmNlTmFtZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBIZWxwZXIgaW50ZXJmYWNlIGludGVuZGVkIGZvciB1cGRhdGluZyBhIHN0cmluZyB2YWx1ZSBiYXNlZCBvbiB0aGUKLSAgICAgKiBjdXJyZW50bHkgc2VsZWN0ZWQgbGluayB0YXJnZXQuCi0gICAgICogQHNpbmNlIDMuMgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElTdHJpbmdWYWx1ZSB7Ci0gICAgCS8qKgotICAgIAkgKiBTZXRzIHRoZSBTdHJpbmcgdmFsdWUuCi0gICAgCSAqIEBwYXJhbSBzdHJpbmcgYSBub24tbnVsbCBTdHJpbmcKLSAgICAJICovCi0gICAgCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHN0cmluZyk7Ci0gICAgCS8qKgotICAgIAkgKiBHZXRzIHRoZSBTdHJpbmcgdmFsdWUuCi0gICAgCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgCSAqLwotICAgIAlTdHJpbmcgZ2V0VmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdFVwZGF0ZWRWYWx1ZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBsaW5rIHRhcmdldCBncm91cCAKLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIHNwZWNpZmllcyB0aGUgdHlwZSBvZiByZXNvdXJjZSB0byBsaW5rIHRvLiAKLSAgICAgKiAJPGNvZGU+SVJlc291cmNlLkZJTEU8L2NvZGU+IG9yIDxjb2RlPklSZXNvdXJjZS5GT0xERVI8L2NvZGU+Ci0gICAgICogQHBhcmFtIGxpc3RlbmVyIGxpc3RlbmVyIHRvIG5vdGlmeSB3aGVuIG9uZSBvZiB0aGUgd2lkZ2V0cycKLSAgICAgKiAJdmFsdWUgaXMgY2hhbmdlZC4KLSAgICAgKiBAcGFyYW0gdXBkYXRhYmxlUmVzb3VyY2VOYW1lIGFuIHVwZGF0YWJsZSBzdHJpbmcgdmFsdWUgdGhhdCB3aWxsIGJlCi0gICAgICogIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbGluayB0YXJnZXQncyBsYXN0IHNlZ21lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqICBVcGRhdGluZyB3aWxsIG9ubHkgaGFwcGVuIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoYXQgc3RyaW5nIGlzIG51bGwKLSAgICAgKiAgb3IgdGhlIGVtcHR5IHN0cmluZywgb3IgaWYgaXQgaGFzIG5vdCBiZWVuIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZQotICAgICAqICBpdCB3YXMgdXBkYXRlZC4gCi0gICAgICovCi0gICAgcHVibGljIENyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXAoaW50IHR5cGUsIExpc3RlbmVyIGxpc3RlbmVyLCBJU3RyaW5nVmFsdWUgdXBkYXRhYmxlUmVzb3VyY2VOYW1lKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQkJdGhpcy51cGRhdGFibGVSZXNvdXJjZU5hbWUgPSB1cGRhdGFibGVSZXNvdXJjZU5hbWU7Ci0JCWlmICh1cGRhdGFibGVSZXNvdXJjZU5hbWUgIT0gbnVsbCkgewotCQkJbGFzdFVwZGF0ZWRWYWx1ZSA9IHVwZGF0YWJsZVJlc291cmNlTmFtZS5nZXRWYWx1ZSgpOwotCQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjb21wb3NpdGUgb2YgdGhlIHdpZGdldCBncm91cAotICAgICAqIEByZXR1cm4gdGhlIHdpZGdldCBncm91cAotICAgICAqLwotICAgIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotICAgICAgICBpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLSAgICAgICAgLy8gdG9wIGxldmVsIGdyb3VwCi0gICAgICAgIGdyb3VwQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBncm91cENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgZ3JvdXBDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGdyb3VwQ29tcG9zaXRlLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgZmluYWwgQnV0dG9uIGNyZWF0ZUxpbmtCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotICAgICAgICBpZiAodHlwZSA9PSBJUmVzb3VyY2UuRklMRSkKLSAgICAgICAgICAgIGNyZWF0ZUxpbmtCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5DcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwX2xpbmtGaWxlQnV0dG9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY3JlYXRlTGlua0J1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLkNyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXBfbGlua0ZvbGRlckJ1dHRvbik7Ci0gICAgICAgIGNyZWF0ZUxpbmtCdXR0b24uc2V0U2VsZWN0aW9uKGNyZWF0ZUxpbmspOwotICAgICAgICBjcmVhdGVMaW5rQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY3JlYXRlTGluayA9IGNyZWF0ZUxpbmtCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoY3JlYXRlTGluayk7Ci0gICAgICAgICAgICAgICAgdmFyaWFibGVzQnV0dG9uLnNldEVuYWJsZWQoY3JlYXRlTGluayk7Ci0gICAgICAgICAgICAgICAgbGlua1RhcmdldEZpZWxkLnNldEVuYWJsZWQoY3JlYXRlTGluayk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KG5ldyBFdmVudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgY3JlYXRlTGlua0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLSAgICAgICAgY3JlYXRlTGlua0xvY2F0aW9uR3JvdXAoZ3JvdXBDb21wb3NpdGUsIGNyZWF0ZUxpbmspOwotICAgICAgICByZXR1cm4gZ3JvdXBDb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbGluayB0YXJnZXQgbG9jYXRpb24gd2lkZ2V0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhdGlvbkdyb3VwIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICogQHBhcmFtIGVuYWJsZWQgc2V0cyB0aGUgaW5pdGlhbCBlbmFibGVkIHN0YXRlIG9mIHRoZSB3aWRnZXRzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpbmtMb2NhdGlvbkdyb3VwKENvbXBvc2l0ZSBsb2NhdGlvbkdyb3VwLAotICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IGxvY2F0aW9uR3JvdXAuZ2V0Rm9udCgpOwotICAgICAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihsb2NhdGlvbkdyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBpbnQgaW5kZW50ID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQotICAgICAgICBidXR0b24uZGlzcG9zZSgpOwotCi0gICAgICAgIC8vIGxpbmtUYXJnZXRHcm91cCBpcyBuZWNlc3NhcnkgdG8gZGVjb3VwbGUgbGF5b3V0IGZyb20gCi0gICAgICAgIC8vIHJlc29sdmVkUGF0aEdyb3VwIGxheW91dAotICAgICAgICBDb21wb3NpdGUgbGlua1RhcmdldEdyb3VwID0gbmV3IENvbXBvc2l0ZShsb2NhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGlua1RhcmdldEdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbEluZGVudCA9IGluZGVudDsKLSAgICAgICAgbGlua1RhcmdldEdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGxpbmtUYXJnZXRHcm91cC5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIC8vIGxpbmsgdGFyZ2V0IGxvY2F0aW9uIGVudHJ5IGZpZWxkCi0gICAgICAgIGxpbmtUYXJnZXRGaWVsZCA9IG5ldyBUZXh0KGxpbmtUYXJnZXRHcm91cCwgU1dULkJPUkRFUik7Ci0gICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIOwotICAgICAgICBsaW5rVGFyZ2V0RmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgbGlua1RhcmdldEZpZWxkLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIGxpbmtUYXJnZXRGaWVsZC5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICBsaW5rVGFyZ2V0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbGlua1RhcmdldCA9IGxpbmtUYXJnZXRGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZVZhcmlhYmxlKCk7Ci0gICAgICAgICAgICAgICAgaWYodXBkYXRhYmxlUmVzb3VyY2VOYW1lIT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgCVN0cmluZyB2YWx1ZSA9IHVwZGF0YWJsZVJlc291cmNlTmFtZS5nZXRWYWx1ZSgpOwotCQkJCQlpZih2YWx1ZT09bnVsbCB8fCB2YWx1ZS5lcXVhbHMoIiIpIHx8IHZhbHVlLmVxdWFscyhsYXN0VXBkYXRlZFZhbHVlKSkgeyAvLyROT04tTkxTLTEkCi0JICAgICAgICAgICAgICAgIAlJUGF0aCBsaW5rVGFyZ2V0UGF0aCA9IG5ldyBQYXRoKGxpbmtUYXJnZXQpOwotCSAgICAgICAgICAgICAgICAJU3RyaW5nIGxhc3RTZWdtZW50ID0gbGlua1RhcmdldFBhdGgubGFzdFNlZ21lbnQoKTsKLQkgICAgICAgICAgICAgICAgCWlmIChsYXN0U2VnbWVudCAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgIAkJbGFzdFVwZGF0ZWRWYWx1ZSA9IGxhc3RTZWdtZW50OwotCSAgICAgICAgICAgICAgICAJCXVwZGF0YWJsZVJlc291cmNlTmFtZS5zZXRWYWx1ZShsYXN0U2VnbWVudCk7Ci0JICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KG5ldyBFdmVudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIC8vIGJyb3dzZSBidXR0b24KLSAgICAgICAgYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihsaW5rVGFyZ2V0R3JvdXAsIFNXVC5QVVNIKTsgICAgICAKLSAgICAgICAgYnJvd3NlQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLkNyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXBfYnJvd3NlQnV0dG9uKTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVMaW5rVGFyZ2V0QnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIHNldEJ1dHRvbkxheW91dERhdGEoYnJvd3NlQnV0dG9uKTsKLQotICAgICAgICAvLyB2YXJpYWJsZXMgYnV0dG9uCi0gICAgICAgIHZhcmlhYmxlc0J1dHRvbiA9IG5ldyBCdXR0b24obGlua1RhcmdldEdyb3VwLCBTV1QuUFVTSCk7Ci0gICAgICAgIHZhcmlhYmxlc0J1dHRvbi5zZXRGb250KGZvbnQpOwotICAgICAgICB2YXJpYWJsZXNCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5DcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwX3ZhcmlhYmxlc0J1dHRvbik7Ci0gICAgICAgIHZhcmlhYmxlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVmFyaWFibGVzQnV0dG9uUHJlc3NlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdmFyaWFibGVzQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIHNldEJ1dHRvbkxheW91dERhdGEodmFyaWFibGVzQnV0dG9uKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBvc2l0ZSByZXNvbHZlZFBhdGhHcm91cCA9IG5ldyBDb21wb3NpdGUobG9jYXRpb25Hcm91cCwgU1dULk5PTkUpOwotICAgICAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICByZXNvbHZlZFBhdGhHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBkYXRhLmhvcml6b250YWxJbmRlbnQgPSBpbmRlbnQ7Ci0gICAgICAgIHJlc29sdmVkUGF0aEdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHJlc29sdmVkUGF0aEdyb3VwLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgcmVzb2x2ZWRQYXRoTGFiZWxUZXh0ID0gbmV3IExhYmVsKHJlc29sdmVkUGF0aEdyb3VwLCBTV1QuU0lOR0xFKTsKLSAgICAgICAgcmVzb2x2ZWRQYXRoTGFiZWxUZXh0LnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuQ3JlYXRlTGlua2VkUmVzb3VyY2VHcm91cF9yZXNvbHZlZFBhdGhMYWJlbCk7Ci0gICAgICAgIHJlc29sdmVkUGF0aExhYmVsVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgcmVzb2x2ZWRQYXRoTGFiZWxUZXh0LnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgcmVzb2x2ZWRQYXRoTGFiZWxEYXRhID0gbmV3IExhYmVsKHJlc29sdmVkUGF0aEdyb3VwLCBTV1QuU0lOR0xFKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICByZXNvbHZlZFBhdGhMYWJlbERhdGEuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgcmVzb2x2ZWRQYXRoTGFiZWxEYXRhLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICByZXNvbHZlZFBhdGhMYWJlbERhdGEuc2V0Rm9udChmb250KTsKLQotICAgICAgICBpZiAobGlua1RhcmdldCAhPSBudWxsKQotICAgICAgICAgICAgbGlua1RhcmdldEZpZWxkLnNldFRleHQobGlua1RhcmdldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHNldmVyaXR5IGFuZCBtZXNzYWdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBhbmQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIHNldmVyaXR5LCBtZXNzYWdlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlcyB0aGUgZ3JvdXAncyB3aWRnZXRzLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAoZ3JvdXBDb21wb3NpdGUgIT0gbnVsbCAmJiBncm91cENvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpCi0gICAgICAgICAgICBncm91cENvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGluayB0YXJnZXQgbG9jYXRpb24gZW50ZXJlZCBieSB0aGUgdXNlci4gCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsaW5rIHRhcmdldCBsb2NhdGlvbiBlbnRlcmVkIGJ5IHRoZSB1c2VyLiBudWxsIGlmIHRoZSB1c2VyCi0gICAgICogCWNob3NlIG5vdCB0byBjcmVhdGUgYSBsaW5rLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGlua1RhcmdldCgpIHsKLSAgICAgICAgaWYgKGNyZWF0ZUxpbmspCi0gICAgICAgICAgICByZXR1cm4gbGlua1RhcmdldDsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhIGZpbGUgb3IgZGlyZWN0b3J5IGJyb3dzZXIgZGVwZW5kaW5nIG9uIHRoZSBsaW5rIHR5cGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUxpbmtUYXJnZXRCcm93c2VCdXR0b25QcmVzc2VkKCkgewotICAgICAgICBJRmlsZVN0b3JlIHN0b3JlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGxpbmtUYXJnZXQubGVuZ3RoKCkgPiAwKSB7IAotICAgICAgICAgICAgc3RvcmUgPSBJREVSZXNvdXJjZUluZm9VdGlscy5nZXRGaWxlU3RvcmUobGlua1RhcmdldCk7Ci0gICAgICAgICAgICBpZiAoIXN0b3JlLmZldGNoSW5mbygpLmV4aXN0cygpKQotICAgICAgICAgICAgICAgIHN0b3JlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA9PSBJUmVzb3VyY2UuRklMRSkgewotICAgICAgICAgICAgRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhsaW5rVGFyZ2V0RmllbGQuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICBpZiAoc3RvcmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzdG9yZS5mZXRjaEluZm8oKS5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgICAgIAlkaWFsb2cuc2V0RmlsdGVyUGF0aChsaW5rVGFyZ2V0KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRGaWxlTmFtZShsaW5rVGFyZ2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbGVjdGlvbiA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhsaW5rVGFyZ2V0RmllbGQKLSAgICAgICAgICAgICAgICAgICAgLmdldFNoZWxsKCkpOwotICAgICAgICAgICAgaWYgKHN0b3JlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJRmlsZVN0b3JlIHBhdGggPSBzdG9yZTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0b3JlLmZldGNoSW5mbygpLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICAgICAgICAgIHBhdGggPSBzdG9yZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkaWFsb2cuc2V0RmlsdGVyUGF0aChzdG9yZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpYWxvZwotICAgICAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5DcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwX3RhcmdldFNlbGVjdGlvbkxhYmVsKTsKLSAgICAgICAgICAgIHNlbGVjdGlvbiA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgbGlua1RhcmdldEZpZWxkLnNldFRleHQoc2VsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhIHBhdGggdmFyaWFibGUgc2VsZWN0aW9uIGRpYWxvZwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVWYXJpYWJsZXNCdXR0b25QcmVzc2VkKCkgewotICAgICAgICBpbnQgdmFyaWFibGVUeXBlcyA9IElSZXNvdXJjZS5GT0xERVI7Ci0KLSAgICAgICAgLy8gYWxsb3cgc2VsZWN0aW5nIGZpbGUgYW5kIGZvbGRlciB2YXJpYWJsZXMgd2hlbiBjcmVhdGluZyBhIAotICAgICAgICAvLyBsaW5rZWQgZmlsZQotICAgICAgICBpZiAodHlwZSA9PSBJUmVzb3VyY2UuRklMRSkKLSAgICAgICAgICAgIHZhcmlhYmxlVHlwZXMgfD0gSVJlc291cmNlLkZJTEU7Ci0KLSAgICAgICAgUGF0aFZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBQYXRoVmFyaWFibGVTZWxlY3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgbGlua1RhcmdldEZpZWxkLmdldFNoZWxsKCksIHZhcmlhYmxlVHlwZXMpOwotICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YXJpYWJsZU5hbWVzID0gKFN0cmluZ1tdKSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgICAgICAgICBpZiAodmFyaWFibGVOYW1lcyAhPSBudWxsICYmIHZhcmlhYmxlTmFtZXMubGVuZ3RoID09IDEpCi0gICAgICAgICAgICAgICAgbGlua1RhcmdldEZpZWxkLnNldFRleHQodmFyaWFibGVOYW1lc1swXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgY29tcHV0YXRpb24gb2YgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGlhbG9nIHVuaXRzCi0gICAgICogYmFzZWQgb24gdGhlIHNpemUgb2YgY3VycmVudCBmb250LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSA8Y29kZT5zZXRCdXR0b25MYXlvdXREYXRhPC9jb2RlPiAKLSAgICAgKiBpcyBjYWxsZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRyb2wgYSBjb250cm9sIGZyb20gd2hpY2ggdG8gb2J0YWluIHRoZSBjdXJyZW50IGZvbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCBjb250cm9sKSB7Ci0gICAgICAgIC8vIENvbXB1dGUgYW5kIHN0b3JlIGEgZm9udCBtZXRyaWMKLSAgICAgICAgR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7Ci0gICAgICAgIGdjLnNldEZvbnQoY29udHJvbC5nZXRGb250KCkpOwotICAgICAgICBmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0gICAgICAgIGdjLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyB0byByZXNvbHZlIHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZSBsaW5rIHRhcmdldCBmaWVsZCBhcyAKLSAgICAgKiBhIHZhcmlhYmxlLCBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBwYXRoLgotICAgICAqIERpc3BsYXlzIHRoZSByZXNvbHZlZCB2YWx1ZSBpZiB0aGUgZW50ZXJlZCB2YWx1ZSBpcyBhIHZhcmlhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXNvbHZlVmFyaWFibGUoKSB7Ci0gICAgICAgIElQYXRoVmFyaWFibGVNYW5hZ2VyIHBhdGhWYXJpYWJsZU1hbmFnZXIgPSBSZXNvdXJjZXNQbHVnaW4KLSAgICAgICAgICAgICAgICAuZ2V0V29ya3NwYWNlKCkuZ2V0UGF0aFZhcmlhYmxlTWFuYWdlcigpOwotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgobGlua1RhcmdldCk7Ci0gICAgICAgIElQYXRoIHJlc29sdmVkUGF0aCA9IHBhdGhWYXJpYWJsZU1hbmFnZXIucmVzb2x2ZVBhdGgocGF0aCk7Ci0KLSAgICAgICAgaWYgKHBhdGguZXF1YWxzKHJlc29sdmVkUGF0aCkpIHsKLSAgICAgICAgICAgIHJlc29sdmVkUGF0aExhYmVsVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIHJlc29sdmVkUGF0aExhYmVsRGF0YS5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc29sdmVkUGF0aExhYmVsVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgcmVzb2x2ZWRQYXRoTGFiZWxEYXRhLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzb2x2ZWRQYXRoTGFiZWxEYXRhLnNldFRleHQocmVzb2x2ZWRQYXRoLnRvT1NTdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgPGNvZGU+R3JpZERhdGE8L2NvZGU+IG9uIHRoZSBzcGVjaWZpZWQgYnV0dG9uIHRvCi0gICAgICogYmUgb25lIHRoYXQgaXMgc3BhY2VkIGZvciB0aGUgY3VycmVudCBkaWFsb2cgcGFnZSB1bml0cy4gVGhlCi0gICAgICogbWV0aG9kIDxjb2RlPmluaXRpYWxpemVEaWFsb2dVbml0czwvY29kZT4gbXVzdCBiZSBjYWxsZWQgb25jZQotICAgICAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kIGZvciB0aGUgZmlyc3QgdGltZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidXR0b24gdGhlIGJ1dHRvbiB0byBzZXQgdGhlIDxjb2RlPkdyaWREYXRhPC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkdyaWREYXRhPC9jb2RlPiBzZXQgb24gdGhlIHNwZWNpZmllZCBidXR0b24KLSAgICAgKi8KLSAgICBwcml2YXRlIEdyaWREYXRhIHNldEJ1dHRvbkxheW91dERhdGEoQnV0dG9uIGJ1dHRvbikgewotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgICAgIGludCB3aWR0aEhpbnQgPSBEaWFsb2cuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsCi0gICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IE1hdGgubWF4KHdpZHRoSGludCwgYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotICAgICAgICAgICAgICAgIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKLSAgICAgICAgYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsaW5rIHRhcmdldCBmaWVsZAotICAgICAqIAotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHZhbHVlIG9mIHRoZSBsaW5rIHRhcmdldCBmaWVsZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExpbmtUYXJnZXQoU3RyaW5nIHRhcmdldCkgewotICAgICAgICBsaW5rVGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICBpZiAobGlua1RhcmdldEZpZWxkICE9IG51bGwgJiYgbGlua1RhcmdldEZpZWxkLmlzRGlzcG9zZWQoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgIGxpbmtUYXJnZXRGaWVsZC5zZXRUZXh0KHRhcmdldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBmaWxlIGFnYWluc3QgdGhlIGxpbmsgdHlwZSBzcGVjaWZpZWQKLSAgICAgKiBpbiB0aGUgY29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpbmtUYXJnZXRGaWxlIGZpbGUgdG8gdmFsaWRhdGUKLSAgICAgKiBAcmV0dXJuIElTdGF0dXMgaW5kaWNhdGluZyB0aGUgdmFsaWRhdGlvbiByZXN1bHQuIElTdGF0dXMuT0sgaWYgdGhlIAotICAgICAqIAlnaXZlbiBmaWxlIGlzIHZhbGlkLgotICAgICAqLwotICAgIHByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUZpbGVUeXBlKElGaWxlSW5mbyBsaW5rVGFyZ2V0RmlsZSkgewotICAgICAgICBpZiAodHlwZSA9PSBJUmVzb3VyY2UuRklMRSAmJiBsaW5rVGFyZ2V0RmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXBfbGlua1RhcmdldE5vdEZpbGUpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gSVJlc291cmNlLkZPTERFUgotICAgICAgICAgICAgICAgICYmICFsaW5rVGFyZ2V0RmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXBfbGlua1RhcmdldE5vdEZvbGRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoaXMgcGFnZSdzIGNvbnRyb2xzLgotICAgICAqIEBwYXJhbSBsaW5rSGFuZGxlIFRoZSB0YXJnZXQgdG8gY2hlY2sKLSAgICAgKgotICAgICAqIEByZXR1cm4gSVN0YXR1cyBpbmRpY2F0aW5nIHRoZSB2YWxpZGF0aW9uIHJlc3VsdC4gSVN0YXR1cy5PSyBpZiB0aGUgCi0gICAgICogCXNwZWNpZmllZCBsaW5rIHRhcmdldCBpcyB2YWxpZCBnaXZlbiB0aGUgbGlua0hhbmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUxpbmtMb2NhdGlvbihJUmVzb3VyY2UgbGlua0hhbmRsZSkgewotICAgICAgICBpZiAobGlua1RhcmdldEZpZWxkID09IG51bGwgfHwgbGlua1RhcmdldEZpZWxkLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0UGx1Z2luV29ya3NwYWNlKCk7Ci0gICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChsaW5rVGFyZ2V0KTsKLQotICAgICAgICBpZiAoY3JlYXRlTGluayA9PSBmYWxzZSkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBpZiAocGF0aC5pc1VOQygpKSB7Ci0gICAgICAgICAgICAvLyBwcmludCB0aGF0IHBhdGggaXMgbm90IHZhbGlkLCBidXQgZG9uJ3QgZG8gY29yZSB2YWxpZGF0aW9uLiBTZWUgYnVnIDkwODI1LgotICAgICAgICAJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXBfdW5hYmxlVG9WYWxpZGF0ZUxpbmtUYXJnZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgSVN0YXR1cyBsb2NhdGlvblN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZUxpbmtMb2NhdGlvbihsaW5rSGFuZGxlLAotICAgICAgICAgICAgICAgIHBhdGgpOwotICAgICAgICBpZiAobG9jYXRpb25TdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uU3RhdHVzOwotCi0gICAgICAgIC8vIHVzZSB0aGUgcmVzb2x2ZWQgbGluayB0YXJnZXQgbmFtZQotICAgICAgICBTdHJpbmcgcmVzb2x2ZWRMaW5rVGFyZ2V0ID0gcmVzb2x2ZWRQYXRoTGFiZWxEYXRhLmdldFRleHQoKTsKLSAgICAgICAgcGF0aCA9IG5ldyBQYXRoKHJlc29sdmVkTGlua1RhcmdldCk7Ci0gICAgICAgIElGaWxlSW5mbyBsaW5rVGFyZ2V0RmlsZSA9IElERVJlc291cmNlSW5mb1V0aWxzLmdldEZpbGVJbmZvKHJlc29sdmVkTGlua1RhcmdldCk7Ci0gICAgICAgIGlmIChsaW5rVGFyZ2V0RmlsZSAhPSBudWxsICYmIGxpbmtUYXJnZXRGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBJU3RhdHVzIGZpbGVUeXBlU3RhdHVzID0gdmFsaWRhdGVGaWxlVHlwZShsaW5rVGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICBpZiAoZmlsZVR5cGVTdGF0dXMuaXNPSygpID09IGZhbHNlKQotICAgICAgICAgICAgICAgIHJldHVybiBmaWxlVHlwZVN0YXR1czsKLSAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvblN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spIHsKLSAgICAgICAgICAgIC8vIGxvY2F0aW9uU3RhdHVzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBtaXNzaW5nIGxvY2F0aW9uIHdhcm5pbmcuCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlU3RhdHVzKAotICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLldBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXBfbGlua1RhcmdldE5vbkV4aXN0ZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbG9jYXRpb25TdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0NyZWF0ZVByb2plY3RTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvQ3JlYXRlUHJvamVjdFN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwMWZjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvQ3JlYXRlUHJvamVjdFN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIGNyZWF0ZSBwcm9qZWN0IHN0ZXAgaW4gYSBtdWx0aS1zdGVwCi0gKiB3aXphcmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVQcm9qZWN0U3RlcCBleHRlbmRzIFdpemFyZFN0ZXAgewotICAgIHByaXZhdGUgQ3JlYXRlUHJvamVjdFdpemFyZCBzdGVwV2l6YXJkOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgcHJvamVjdCBjcmVhdGlvbiBzdGVwCi0gICAgICogCi0gICAgICogQHBhcmFtIG51bWJlciB0aGUgc3RlcCBvcmRlciBudW1iZXIKLSAgICAgKiBAcGFyYW0gcGFnZSB0aGUgd2l6YXJkIHBhZ2UgY29udGFpbmluZyB0aGUgbmV3IHByb2plY3QgbmFtZSBhbmQgbG9jYXRpb24KLSAgICAgKiBAcGFyYW0gd2l6YXJkIHRoZSBtdWx0aS1zdGVwIHdpemFyZCBmb3IgY29sbGVjdGluZyBuZXcgcHJvamVjdCBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDcmVhdGVQcm9qZWN0U3RlcChpbnQgbnVtYmVyLAotICAgICAgICAgICAgV2l6YXJkTmV3UHJvamVjdE5hbWVBbmRMb2NhdGlvblBhZ2UgcGFnZSwgTmV3UHJvamVjdFdpemFyZCB3aXphcmQpIHsKLSAgICAgICAgc3VwZXIobnVtYmVyKTsKLSAgICAgICAgc3RlcFdpemFyZCA9IG5ldyBDcmVhdGVQcm9qZWN0V2l6YXJkKHBhZ2UsIHdpemFyZCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXaXphcmRTdGVwLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5DcmVhdGVQcm9qZWN0U3RlcF9sYWJlbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpemFyZFN0ZXAuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXRhaWxzKCkgewotICAgICAgICByZXR1cm4gTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuQ3JlYXRlUHJvamVjdFN0ZXBfZGV0YWlscywgc3RlcFdpemFyZC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpemFyZFN0ZXAuCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmQgZ2V0V2l6YXJkKCkgewotICAgICAgICByZXR1cm4gc3RlcFdpemFyZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvQ3JlYXRlUHJvamVjdFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0NyZWF0ZVByb2plY3RXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1NDUwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvQ3JlYXRlUHJvamVjdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotCi0vKioKLSAqIEludGVybmFsIHdvcmtiZW5jaCB3aXphcmQgdG8gY3JlYXRlIGEgcHJvamVjdAotICogcmVzb3VyY2UgaW4gdGhlIHdvcmtzcGFjZS4gVGhpcyBwcm9qZWN0IHdpbGwgaGF2ZQotICogbm8gY2FwYWJpbGl0aWVzIHdoZW4gY3JlYXRlZC4gVGhpcyB3aXphcmQgaXMgaW50ZW5kZWQKLSAqIHRvIGJlIHVzZWQgYnkgdGhlIENyZWF0ZVByb2plY3RTdGVwIGNsYXNzIG9ubHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVQcm9qZWN0V2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKLSAgICBwcml2YXRlIE5ld1Byb2plY3RXaXphcmQgd2l6YXJkOwotCi0gICAgcHJpdmF0ZSBXaXphcmROZXdQcm9qZWN0TmFtZUFuZExvY2F0aW9uUGFnZSBwYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbXB0eSB3aXphcmQgZm9yIGNyZWF0aW5nIGEgbmV3IHByb2plY3QKLSAgICAgKiBpbiB0aGUgd29ya3NwYWNlLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi9DcmVhdGVQcm9qZWN0V2l6YXJkKFdpemFyZE5ld1Byb2plY3ROYW1lQW5kTG9jYXRpb25QYWdlIHBhZ2UsCi0gICAgICAgICAgICBOZXdQcm9qZWN0V2l6YXJkIHdpemFyZCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlOwotICAgICAgICB0aGlzLndpemFyZCA9IHdpemFyZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHByb2plY3QgcmVzb3VyY2Ugd2l0aCB0aGUgZW50ZXJlZCBuYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBwcm9qZWN0IHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvamVjdAotICAgICAqICAgIHdhcyBub3QgY3JlYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgSVByb2plY3QgY3JlYXRlTmV3UHJvamVjdCgpIHsKLSAgICAgICAgLy8gZ2V0IGEgcHJvamVjdCBoYW5kbGUKLSAgICAgICAgZmluYWwgSVByb2plY3QgbmV3UHJvamVjdEhhbmRsZSA9IHBhZ2UuZ2V0UHJvamVjdEhhbmRsZSgpOwotCi0gICAgICAgIC8vIGdldCBhIHByb2plY3QgZGVzY3JpcHRvcgotICAgICAgICBJUGF0aCBkZWZhdWx0UGF0aCA9IFBsYXRmb3JtLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIElQYXRoIG5ld1BhdGggPSBwYWdlLmdldExvY2F0aW9uUGF0aCgpOwotICAgICAgICBpZiAoZGVmYXVsdFBhdGguZXF1YWxzKG5ld1BhdGgpKQotICAgICAgICAgICAgbmV3UGF0aCA9IG51bGw7Ci0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBmaW5hbCBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gd29ya3NwYWNlCi0gICAgICAgICAgICAgICAgLm5ld1Byb2plY3REZXNjcmlwdGlvbihuZXdQcm9qZWN0SGFuZGxlLmdldE5hbWUoKSk7Ci0gICAgICAgIGRlc2NyaXB0aW9uLnNldExvY2F0aW9uKG5ld1BhdGgpOwotCi0gICAgICAgIC8vIGRlZmluZSB0aGUgb3BlcmF0aW9uIHRvIGNyZWF0ZSBhIG5ldyBwcm9qZWN0Ci0gICAgICAgIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGNyZWF0ZVByb2plY3QoZGVzY3JpcHRpb24sIG5ld1Byb2plY3RIYW5kbGUsIG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vIHJ1biB0aGUgb3BlcmF0aW9uIHRvIGNyZWF0ZSBhIG5ldyBwcm9qZWN0Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoKChDb3JlRXhjZXB0aW9uKSB0KS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLkNBU0VfVkFSSUFOVF9FWElTVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuQ3JlYXRlUHJvamVjdFdpemFyZF9lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuQ3JlYXRlUHJvamVjdFdpemFyZF9jYXNlVmFyaWFudEV4aXN0c0Vycm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgSURFV29ya2JlbmNoTWVzc2FnZXMuQ3JlYXRlUHJvamVjdFdpemFyZF9lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIG5vIHNwZWNpYWwgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ29yZUV4Y2VwdGlvbikgdCkuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVW5leHBlY3RlZCBydW50aW1lIGV4Y2VwdGlvbnMgYW5kIGVycm9ycyBtYXkgc3RpbGwgb2NjdXIuCi0gICAgICAgICAgICAJIElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQbGF0Zm9ybVVJLlBMVUdJTl9JRCwgMCwgdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSwgdCkpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLkNyZWF0ZVByb2plY3RXaXphcmRfZXJyb3JUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuQ3JlYXRlUHJvamVjdFdpemFyZF9pbnRlcm5hbEVycm9yLCB0LmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3UHJvamVjdEhhbmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcHJvamVjdCByZXNvdXJjZSBnaXZlbiB0aGUgcHJvamVjdCBoYW5kbGUgYW5kIGRlc2NyaXB0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIHRoZSBwcm9qZWN0IGRlc2NyaXB0aW9uIHRvIGNyZWF0ZSBhIHByb2plY3QgcmVzb3VyY2UgZm9yCi0gICAgICogQHBhcmFtIHByb2plY3RIYW5kbGUgdGhlIHByb2plY3QgaGFuZGxlIHRvIGNyZWF0ZSBhIHByb2plY3QgcmVzb3VyY2UgZm9yCi0gICAgICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gc2hvdyB2aXN1YWwgcHJvZ3Jlc3Mgd2l0aAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMKLSAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gaXMgY2FuY2VsZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdChJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdEhhbmRsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCAyMDAwKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBwcm9qZWN0SGFuZGxlLmNyZWF0ZShkZXNjcmlwdGlvbiwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAxMDAwKSk7Ci0KLSAgICAgICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgcHJvamVjdEhhbmRsZS5vcGVuKElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcHJvamVjdCBuYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogICBpZiBubyBwcm9qZWN0IG5hbWUgaXMga25vd24KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotICAgICAgICByZXR1cm4gcGFnZS5nZXRQcm9qZWN0TmFtZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotICAgICAgICBpZiAod2l6YXJkLmdldE5ld1Byb2plY3QoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGNyZWF0ZU5ld1Byb2plY3QoKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgd2l6YXJkLnNldE5ld1Byb2plY3QocHJvamVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9GaWxlRm9sZGVyU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvRmlsZUZvbGRlclNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmFlOTA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9GaWxlRm9sZGVyU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotCi0vKioKLSAqIFNlbGVjdGlvbiBkaWFsb2cgdG8gc2VsZWN0IGZpbGVzIGFuZC9vciBmb2xkZXJzIG9uIHRoZSBmaWxlIHN5c3RlbS4gVXNlCi0gKiBzZXRJbnB1dCB0byBzZXQgaW5wdXQgdG8gYSBqYXZhLmlvLkZpbGUgdGhhdCBwb2ludHMgdG8gYSBmb2xkZXIuCi0gKiAKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEZpbGVGb2xkZXJTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyB7Ci0KLQkvKioKLQkgKiBMYWJlbCBwcm92aWRlciBmb3IgamF2YS5pby5GaWxlIG9iamVjdHMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0ZPTERFUiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUik7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0ZJTEUgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GSUxFKTsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlU3RvcmUpIHsKLQkJCQlJRmlsZVN0b3JlIGN1cnIgPSAoSUZpbGVTdG9yZSkgZWxlbWVudDsKLQkJCQlpZiAoY3Vyci5mZXRjaEluZm8oKS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCXJldHVybiBJTUdfRk9MREVSOwotCQkJCX0KLQkJCQlyZXR1cm4gSU1HX0ZJTEU7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZVN0b3JlKSB7Ci0JCQkJcmV0dXJuICgoSUZpbGVTdG9yZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciBqYXZhLmlvLkZpbGUgb2JqZWN0cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWSA9IG5ldyBPYmplY3RbMF07Ci0KLQkJcHJpdmF0ZSBJRmlsZVN0b3JlRmlsdGVyIGZpbGVGaWx0ZXI7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotCQkgKiAKLQkJICogQHBhcmFtIHNob3dGaWxlcwotCQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGZpbGVzIGFuZCBmb2xkZXJzIGFyZSByZXR1cm5lZCBieSB0aGUKLQkJICogICAgICAgICAgICByZWNlaXZlci4gPGNvZGU+ZmFsc2U8L2NvZGU+IG9ubHkgZm9sZGVycyBhcmUgcmV0dXJuZWQuCi0JCSAqLwotCQlwdWJsaWMgRmlsZUNvbnRlbnRQcm92aWRlcihmaW5hbCBib29sZWFuIHNob3dGaWxlcykgewotCQkJZmlsZUZpbHRlciA9IG5ldyBJRmlsZVN0b3JlRmlsdGVyKCkgewotCi0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5JRmlsZVN0b3JlRmlsdGVyI2FjY2VwdChvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZSkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSUZpbGVTdG9yZSBmaWxlKSB7Ci0JCQkJCWlmICghZmlsZS5mZXRjaEluZm8oKS5pc0RpcmVjdG9yeSgpICYmIHNob3dGaWxlcyA9PSBmYWxzZSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZVN0b3JlKSB7Ci0JCQkJSUZpbGVTdG9yZVtdIGNoaWxkcmVuID0gSURFUmVzb3VyY2VJbmZvVXRpbHMubGlzdEZpbGVTdG9yZXMoCi0JCQkJCQkoSUZpbGVTdG9yZSkgcGFyZW50RWxlbWVudCwgZmlsZUZpbHRlciwKLQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gRU1QVFk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZVN0b3JlKSB7Ci0JCQkJcmV0dXJuICgoSUZpbGVTdG9yZSkgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogVmlld2VyIHNvcnRlciB0aGF0IHBsYWNlcyBmb2xkZXJzIGZpcnN0LCB0aGVuIGZpbGVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZpbGVWaWV3ZXJTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyI2NhdGVnb3J5KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlU3RvcmUKLQkJCQkJJiYgISgoSUZpbGVTdG9yZSkgZWxlbWVudCkuZmV0Y2hJbmZvKCkuaXNEaXJlY3RvcnkoKSkKLQkJCQlyZXR1cm4gMTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIG11bHRpIHNlbGVjdCBhbmQgZm9sZGVyIHNldHRpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZVNlbGVjdGlvblZhbGlkYXRvciBpbXBsZW1lbnRzCi0JCQlJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIHsKLQkJcHJpdmF0ZSBib29sZWFuIG11bHRpU2VsZWN0OwotCi0JCXByaXZhdGUgYm9vbGVhbiBhY2NlcHRGb2xkZXJzOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkJICogCi0JCSAqIEBwYXJhbSBtdWx0aVNlbGVjdAotCQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIG11bHRpIHNlbGVjdGlvbiBpcyBhbGxvd2VkLgotCQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBvbmx5IHNpbmdsZSBzZWxlY3Rpb24gaXMgYWxsb3dlZC4KLQkJICogQHBhcmFtIGFjY2VwdEZvbGRlcnMKLQkJICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiBmb2xkZXJzIGNhbiBiZSBzZWxlY3RlZCBpbiB0aGUKLQkJICogICAgICAgICAgICBkaWFsb2cuIDxjb2RlPmZhbHNlPC9jb2RlPiBvbmx5IGZpbGVzIGFuZCBiZSBzZWxlY3RlZC4KLQkJICovCi0JCXB1YmxpYyBGaWxlU2VsZWN0aW9uVmFsaWRhdG9yKGJvb2xlYW4gbXVsdGlTZWxlY3QsIGJvb2xlYW4gYWNjZXB0Rm9sZGVycykgewotCQkJdGhpcy5tdWx0aVNlbGVjdCA9IG11bHRpU2VsZWN0OwotCQkJdGhpcy5hY2NlcHRGb2xkZXJzID0gYWNjZXB0Rm9sZGVyczsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5PYmplY3RbXSkKLQkJICovCi0JCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotCQkJaW50IG5TZWxlY3RlZCA9IHNlbGVjdGlvbi5sZW5ndGg7Ci0JCQlTdHJpbmcgcGx1Z2luSWQgPSBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSDsKLQotCQkJaWYgKG5TZWxlY3RlZCA9PSAwIHx8IChuU2VsZWN0ZWQgPiAxICYmIG11bHRpU2VsZWN0ID09IGZhbHNlKSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklkLCBJU3RhdHVzLkVSUk9SLAotCQkJCQkJSURFUmVzb3VyY2VJbmZvVXRpbHMuRU1QVFlfU1RSSU5HLCBudWxsKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IGN1cnIgPSBzZWxlY3Rpb25baV07Ci0JCQkJaWYgKGN1cnIgaW5zdGFuY2VvZiBJRmlsZVN0b3JlKSB7Ci0JCQkJCUlGaWxlU3RvcmUgZmlsZSA9IChJRmlsZVN0b3JlKSBjdXJyOwotCQkJCQlpZiAoYWNjZXB0Rm9sZGVycyA9PSBmYWxzZQotCQkJCQkJCSYmIGZpbGUuZmV0Y2hJbmZvKCkuaXNEaXJlY3RvcnkoKSkKLQkJCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklkLAotCQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlJREVSZXNvdXJjZUluZm9VdGlscy5FTVBUWV9TVFJJTkcsIG51bGwpOwotCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIG11bHRpU2VsZWN0Ci0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiBtdWx0aSBzZWxlY3Rpb24gaXMgYWxsb3dlZC4KLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBvbmx5IHNpbmdsZSBzZWxlY3Rpb24gaXMgYWxsb3dlZC4KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgb25lIG9yIGJvdGggb2YgPGNvZGU+SVJlc291cmNlLkZJTEU8L2NvZGU+IGFuZAotCSAqICAgICAgICAgICAgPGNvZGU+SVJlc291cmNlLkZPTERFUjwvY29kZT4sIE9SZWQgdG9nZXRoZXIuIElmCi0JICogICAgICAgICAgICA8Y29kZT5JUmVzb3VyY2UuRklMRTwvY29kZT4gaXMgc3BlY2lmaWVkIGZpbGVzIGFuZCBmb2xkZXJzCi0JICogICAgICAgICAgICBhcmUgZGlzcGxheWVkIGluIHRoZSBkaWFsb2cuIE90aGVyd2lzZSBvbmx5IGZvbGRlcnMgYXJlCi0JICogICAgICAgICAgICBkaXNwbGF5ZWQuIElmIDxjb2RlPklSZXNvdXJjZS5GT0xERVI8L2NvZGU+IGlzIHNwZWNpZmllZAotCSAqICAgICAgICAgICAgZm9sZGVycyBjYW4gYmUgc2VsZWN0ZWQgaW4gYWRkaXRpb24gdG8gZmlsZXMuCi0JICovCi0JcHVibGljIEZpbGVGb2xkZXJTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBib29sZWFuIG11bHRpU2VsZWN0LCBpbnQgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIG5ldyBGaWxlTGFiZWxQcm92aWRlcigpLCBuZXcgRmlsZUNvbnRlbnRQcm92aWRlcigKLQkJCQkodHlwZSAmIElSZXNvdXJjZS5GSUxFKSAhPSAwKSk7Ci0JCXNldFNvcnRlcihuZXcgRmlsZVZpZXdlclNvcnRlcigpKTsKLQkJc2V0VmFsaWRhdG9yKG5ldyBGaWxlU2VsZWN0aW9uVmFsaWRhdG9yKG11bHRpU2VsZWN0LAotCQkJCSh0eXBlICYgSVJlc291cmNlLkZPTERFUikgIT0gMCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9GaWxlU3RhdGVzUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0ZpbGVTdGF0ZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNjU0YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0ZpbGVTdGF0ZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci0KLS8qKgotICogVGhlIEZpbGVTdGF0ZXNQYWdlIGlzIHRoZSBwYWdlIHVzZWQgdG8gc2V0IHRoZSBmaWxlIHN0YXRlcyBzaXplcyBmb3IgdGhlIHdvcmtiZW5jaC4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVTdGF0ZXNQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotICAgICAgICBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIExpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGQUlMRURfVkFMVUUgPSAtMTsKLQotICAgIC8vU2V0IHRoZSBsZW5ndGggb2YgdGhlIGRheSBhcyB3ZSBoYXZlIHRvIGNvbnZlcnQgYmFjayBhbmQgZm9ydGgKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERBWV9MRU5HVEggPSA4NjQwMDAwMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUVHQUJZVEVTID0gMTAyNCAqIDEwMjQ7Ci0KLSAgICBwcml2YXRlIFRleHQgbG9uZ2V2aXR5VGV4dDsKLQotICAgIHByaXZhdGUgVGV4dCBtYXhTdGF0ZXNUZXh0OwotCi0gICAgcHJpdmF0ZSBUZXh0IG1heFN0YXRlU2l6ZVRleHQ7Ci0KLSAgICAvL0Nob29zZSBhIG1heGltdW0gdG8gcHJldmVudCBPdXRPZk1lbW9yeUVycm9ycwotICAgIHByaXZhdGUgaW50IEZJTEVfU1RBVEVTX01BWElNVU0gPSAxMDAwMDsKLQotICAgIHByaXZhdGUgbG9uZyBTVEFURV9TSVpFX01BWElNVU0gPSAxMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc3RyaW5nIGZvciB0aGUgdGl0bGUgb2YgYSB0ZXh0IGZpZWxkIGFuZCB0aGUgdmFsdWUgZm9yIHRoZQotICAgICAqIHRleHQgb2YgdGhlIGZpZWxkLgotICAgICAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dAotICAgICAqIEBwYXJhbSBsYWJlbFN0cmluZyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICogQHBhcmFtIHRleHRWYWx1ZSBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICogQHBhcmFtIHBhcmVudCBDb21wb3NpdGUgCi0gICAgICovCi0gICAgcHJpdmF0ZSBUZXh0IGFkZExhYmVsQW5kVGV4dChTdHJpbmcgbGFiZWxTdHJpbmcsIFN0cmluZyB0ZXh0VmFsdWUsCi0gICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KGxhYmVsU3RyaW5nKTsKLQotICAgICAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5MRUZUIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgdGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICAgICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotICAgICAgICB0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHRleHQuc2V0VGV4dCh0ZXh0VmFsdWUpOwotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvbXB1dGVzIHRoZSBwYWdlJ3MgZXJyb3Igc3RhdGUgYnkgdmFsaWRhdGluZyBhbGwKLSAgICAgKiB0aGUgZmllbGRzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja1N0YXRlKCkgewotICAgICAgICAvLyBBc3N1bWUgaW52YWxpZCBpZiB0aGUgY29udHJvbHMgbm90IGNyZWF0ZWQgeWV0Ci0gICAgICAgIGlmIChsb25nZXZpdHlUZXh0ID09IG51bGwgfHwgbWF4U3RhdGVzVGV4dCA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgbWF4U3RhdGVTaXplVGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRWYWxpZChmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsaWRhdGVMb25nVGV4dEVudHJ5KGxvbmdldml0eVRleHQpID09IEZBSUxFRF9WQUxVRSkgewotICAgICAgICAgICAgc2V0VmFsaWQoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbGlkYXRlTWF4RmlsZVN0YXRlcygpID09IEZBSUxFRF9WQUxVRSkgewotICAgICAgICAgICAgc2V0VmFsaWQoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbGlkYXRlTWF4RmlsZVN0YXRlU2l6ZSgpID09IEZBSUxFRF9WQUxVRSkgewotICAgICAgICAgICAgc2V0VmFsaWQoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VmFsaWQodHJ1ZSk7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBDcmVhdGUgdGhlIGNvbnRlbnRzIGNvbnRyb2wgZm9yIHRoZSB3b3Jrc3BhY2UgZmlsZSBzdGF0ZXMuCi0gICAgICogQHJldHVybnMgQ29udHJvbAotICAgICAqIEBwYXJhbSBwYXJlbnQgQ29tcG9zaXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5GSUxFX1NUQVRFU19QUkVGRVJFTkNFX1BBR0UpOwotCi0gICAgICAgIC8vIGJ1dHRvbiBncm91cAotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgICAgICBJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBnZXRXb3Jrc3BhY2VEZXNjcmlwdGlvbigpOwotCi0gICAgICAgIC8vR2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IGF0IGxlYXN0IG9uZSBkYXkgb3V0IG9mIGl0LgotICAgICAgICBsb25nIGRheXMgPSBkZXNjcmlwdGlvbi5nZXRGaWxlU3RhdGVMb25nZXZpdHkoKSAvIERBWV9MRU5HVEg7Ci0gICAgICAgIGlmIChkYXlzIDwgMSkKLSAgICAgICAgICAgIGRheXMgPSAxOwotCi0gICAgICAgIGxvbmcgbWVnYWJ5dGVzID0gZGVzY3JpcHRpb24uZ2V0TWF4RmlsZVN0YXRlU2l6ZSgpIC8gTUVHQUJZVEVTOwotICAgICAgICBpZiAobWVnYWJ5dGVzIDwgMSkKLSAgICAgICAgICAgIG1lZ2FieXRlcyA9IDE7Ci0KLSAgICAgICAgdGhpcy5sb25nZXZpdHlUZXh0ID0gYWRkTGFiZWxBbmRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLkZpbGVIaXN0b3J5X2xvbmdldml0eSwgU3RyaW5nCi0gICAgICAgICAgICAgICAgLnZhbHVlT2YoZGF5cyksIGNvbXBvc2l0ZSk7Ci0gICAgICAgIHRoaXMubWF4U3RhdGVzVGV4dCA9IGFkZExhYmVsQW5kVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5GaWxlSGlzdG9yeV9lbnRyaWVzLCBTdHJpbmcKLSAgICAgICAgICAgICAgICAudmFsdWVPZihkZXNjcmlwdGlvbi5nZXRNYXhGaWxlU3RhdGVzKCkpLCBjb21wb3NpdGUpOwotICAgICAgICB0aGlzLm1heFN0YXRlU2l6ZVRleHQgPSBhZGRMYWJlbEFuZFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuRmlsZUhpc3RvcnlfZGlza1NwYWNlLAotICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKG1lZ2FieXRlcyksIGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgY2hlY2tTdGF0ZSgpOwotCi0gICAgICAgIC8vQ3JlYXRlIGEgc3BhY2luZyBsYWJlbCB0byBicmVha3VwIHRoZSBub3RlIGZyb20gdGhlIGZpZWxkcwotICAgICAgICBMYWJlbCBzcGFjZXIgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWREYXRhIHNwYWNlckRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgc3BhY2VyRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHNwYWNlci5zZXRMYXlvdXREYXRhKHNwYWNlckRhdGEpOwotCi0gICAgICAgIENvbXBvc2l0ZSBub3RlQ29tcG9zaXRlID0gY3JlYXRlTm90ZUNvbXBvc2l0ZShwYXJlbnQuZ2V0Rm9udCgpLAotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSwgSURFV29ya2JlbmNoTWVzc2FnZXMuUHJlZmVyZW5jZV9ub3RlLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5GaWxlSGlzdG9yeV9yZXN0YXJ0Tm90ZSk7Ci0gICAgICAgIEdyaWREYXRhIG5vdGVEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIG5vdGVEYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgbm90ZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5vdGVEYXRhKTsKLQotICAgICAgICBhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgV29ya3NwYWNlIERlc2NyaXB0aW9uIHRoaXMgcGFnZSBpcyBvcGVyYXRpbmcgb24uCi0gICAgICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIElXb3Jrc3BhY2VEZXNjcmlwdGlvbiBnZXRXb3Jrc3BhY2VEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiBhbiBldmVudCB0aGF0IHRoZSByZWNlaXZlciBoYXMgcmVnaXN0ZXJlZCBmb3Igb2NjdXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB3aGljaCBvY2N1cnJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGNoZWNrU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSBmb3IgdGhlIGdpdmVuIHdvcmtiZW5jaC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBhcyB0aGUgcHJlZmVyZW5jZSBwYWdlIGlzIGJlaW5nIGNyZWF0ZWQKLSAgICAgKiBhbmQgaW5pdGlhbGl6ZWQuIENsaWVudHMgbXVzdCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gd29ya2JlbmNoIHRoZSB3b3JrYmVuY2gKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAgICogUmVzZXQgdGhlIGVudHJpZXMgdG8gdGhpZXIgZGVmYXVsdCB2YWx1ZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotICAgICAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotICAgICAgICBQcmVmZXJlbmNlcyBwcmVmcyA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0gICAgICAgIGxvbmcgZGF5cyA9IHByZWZzCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRMb25nKFJlc291cmNlc1BsdWdpbi5QUkVGX0ZJTEVfU1RBVEVfTE9OR0VWSVRZKQotICAgICAgICAgICAgICAgIC8gREFZX0xFTkdUSDsKLSAgICAgICAgbG9uZyBtZWdhYnl0ZXMgPSBwcmVmcwotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0TG9uZyhSZXNvdXJjZXNQbHVnaW4uUFJFRl9NQVhfRklMRV9TVEFURV9TSVpFKQotICAgICAgICAgICAgICAgIC8gTUVHQUJZVEVTOwotICAgICAgICB0aGlzLmxvbmdldml0eVRleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihkYXlzKSk7Ci0gICAgICAgIHRoaXMubWF4U3RhdGVzVGV4dC5zZXRUZXh0KHByZWZzCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRTdHJpbmcoUmVzb3VyY2VzUGx1Z2luLlBSRUZfTUFYX0ZJTEVfU1RBVEVTKSk7Ci0gICAgICAgIHRoaXMubWF4U3RhdGVTaXplVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKG1lZ2FieXRlcykpOwotICAgICAgICBjaGVja1N0YXRlKCk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFBlcmZvcm0gdGhlIHJlc3VsdCBvZiB0aGUgT0sgZnJvbSB0aGUgcmVjZWl2ZXIuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCi0gICAgICAgIGxvbmcgbG9uZ2V2aXR5VmFsdWUgPSB2YWxpZGF0ZUxvbmdUZXh0RW50cnkobG9uZ2V2aXR5VGV4dCk7Ci0gICAgICAgIGludCBtYXhGaWxlU3RhdGVzID0gdmFsaWRhdGVNYXhGaWxlU3RhdGVzKCk7Ci0gICAgICAgIGxvbmcgbWF4U3RhdGVTaXplID0gdmFsaWRhdGVNYXhGaWxlU3RhdGVTaXplKCk7Ci0gICAgICAgIGlmIChsb25nZXZpdHlWYWx1ZSA9PSBGQUlMRURfVkFMVUUgfHwgbWF4RmlsZVN0YXRlcyA9PSBGQUlMRURfVkFMVUUKLSAgICAgICAgICAgICAgICB8fCBtYXhTdGF0ZVNpemUgPT0gRkFJTEVEX1ZBTFVFKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIElXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGdldFdvcmtzcGFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uLnNldEZpbGVTdGF0ZUxvbmdldml0eShsb25nZXZpdHlWYWx1ZSAqIERBWV9MRU5HVEgpOwotICAgICAgICBkZXNjcmlwdGlvbi5zZXRNYXhGaWxlU3RhdGVzKG1heEZpbGVTdGF0ZXMpOwotICAgICAgICBkZXNjcmlwdGlvbi5zZXRNYXhGaWxlU3RhdGVTaXplKG1heFN0YXRlU2l6ZSAqIE1FR0FCWVRFUyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vQXMgaXQgaXMgb25seSBhIGNvcHkgc2F2ZSBpdCBiYWNrIGluCi0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIElERVdvcmtiZW5jaE1lc3NhZ2VzLkZpbGVIaXN0b3J5X2V4Y2VwdGlvblNhdmluZywgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGEgdGV4dCBlbnRyeSBmb3IgYW4gaW50ZWdlciBmaWVsZC4gUmV0dXJuIHRoZSByZXN1bHQgaWYgdGhlcmUgYXJlCi0gICAgICogbm8gZXJyb3JzLCBvdGhlcndpc2UgcmV0dXJuIC0xIGFuZCBzZXQgdGhlIGVudHJ5IGZpZWxkIGVycm9yLiAKLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqLwotICAgIHByaXZhdGUgaW50IHZhbGlkYXRlSW50ZWdlclRleHRFbnRyeShUZXh0IHRleHQpIHsKLQotICAgICAgICBpbnQgdmFsdWU7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbHVlID0gSW50ZWdlci5wYXJzZUludCh0ZXh0LmdldFRleHQoKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KElERVdvcmtiZW5jaE1lc3NhZ2VzLkZpbGVIaXN0b3J5X2ludmFsaWQsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgfSkpOwotICAgICAgICAgICAgcmV0dXJuIEZBSUxFRF9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vQmUgc3VyZSBhbGwgdmFsdWVzIGFyZSBub24gemVybyBhbmQgcG9zaXRpdmUKLSAgICAgICAgaWYgKHZhbHVlIDw9IDApIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5GaWxlSGlzdG9yeV9tdXN0QmVQb3NpdGl2ZSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFJTEVEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGEgdGV4dCBlbnRyeSBmb3IgYSBsb25nIGZpZWxkLiBSZXR1cm4gdGhlIHJlc3VsdCBpZiB0aGVyZSBhcmUKLSAgICAgKiBubyBlcnJvcnMsIG90aGVyd2lzZSByZXR1cm4gLTEgYW5kIHNldCB0aGUgZW50cnkgZmllbGQgZXJyb3IuIAotICAgICAqIEByZXR1cm4gbG9uZwotICAgICAqLwotICAgIHByaXZhdGUgbG9uZyB2YWxpZGF0ZUxvbmdUZXh0RW50cnkoVGV4dCB0ZXh0KSB7Ci0KLSAgICAgICAgbG9uZyB2YWx1ZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsdWUgPSBMb25nLnBhcnNlTG9uZyh0ZXh0LmdldFRleHQoKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KElERVdvcmtiZW5jaE1lc3NhZ2VzLkZpbGVIaXN0b3J5X2ludmFsaWQsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgfSkpOwotICAgICAgICAgICAgcmV0dXJuIEZBSUxFRF9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vQmUgc3VyZSBhbGwgdmFsdWVzIGFyZSBub24gemVybyBhbmQgcG9zaXRpdmUKLSAgICAgICAgaWYgKHZhbHVlIDw9IDApIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5GaWxlSGlzdG9yeV9tdXN0QmVQb3NpdGl2ZSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFJTEVEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZSBtYXhpbXVtIGZpbGUgc3RhdGVzLgotICAgICAqIFJldHVybiB0aGUgdmFsdWUgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlCi0gICAgICogcmV0dXJuIEZBSUxFRF9WQUxVRS4KLSAgICAgKiBTZXQgdGhlIGVycm9yIG1lc3NhZ2UgaWYgaXQgZmFpbHMuCi0gICAgICogQHJldHVybiBpbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB2YWxpZGF0ZU1heEZpbGVTdGF0ZXMoKSB7Ci0gICAgICAgIGludCBtYXhGaWxlU3RhdGVzID0gdmFsaWRhdGVJbnRlZ2VyVGV4dEVudHJ5KHRoaXMubWF4U3RhdGVzVGV4dCk7Ci0gICAgICAgIGlmIChtYXhGaWxlU3RhdGVzID09IEZBSUxFRF9WQUxVRSkKLSAgICAgICAgICAgIHJldHVybiBtYXhGaWxlU3RhdGVzOwotCi0gICAgICAgIGlmIChtYXhGaWxlU3RhdGVzID4gRklMRV9TVEFURVNfTUFYSU1VTSkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLkZpbGVIaXN0b3J5X2Fib3ZlTWF4RW50cmllcywgU3RyaW5nLnZhbHVlT2YoRklMRV9TVEFURVNfTUFYSU1VTSkpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUlMRURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWF4RmlsZVN0YXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSB0aGUgbWF4aW11bSBmaWxlIHN0YXRlIHNpemUuCi0gICAgICogUmV0dXJuIHRoZSB2YWx1ZSBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UKLSAgICAgKiByZXR1cm4gRkFJTEVEX1ZBTFVFLgotICAgICAqIFNldCB0aGUgZXJyb3IgbWVzc2FnZSBpZiBpdCBmYWlscy4KLSAgICAgKiBAcmV0dXJuIGxvbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgdmFsaWRhdGVNYXhGaWxlU3RhdGVTaXplKCkgewotICAgICAgICBsb25nIG1heEZpbGVTdGF0ZVNpemUgPSB2YWxpZGF0ZUxvbmdUZXh0RW50cnkodGhpcy5tYXhTdGF0ZVNpemVUZXh0KTsKLSAgICAgICAgaWYgKG1heEZpbGVTdGF0ZVNpemUgPT0gRkFJTEVEX1ZBTFVFKQotICAgICAgICAgICAgcmV0dXJuIG1heEZpbGVTdGF0ZVNpemU7Ci0KLSAgICAgICAgaWYgKG1heEZpbGVTdGF0ZVNpemUgPiBTVEFURV9TSVpFX01BWElNVU0pIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5GaWxlSGlzdG9yeV9hYm92ZU1heEZpbGVTaXplLCBTdHJpbmcudmFsdWVPZihTVEFURV9TSVpFX01BWElNVU0pKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFJTEVEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1heEZpbGVTdGF0ZVNpemU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvSURFRWRpdG9yc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvSURFRWRpdG9yc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ODViYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0lERUVkaXRvcnNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdG9yc1ByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLQotLyoqCi0gKiBFeHRlbmRzIHRoZSBFZGl0b3JzIHByZWZlcmVuY2UgcGFnZSB3aXRoIElERS1zcGVjaWZpYyBzZXR0aW5ncy4KLSAqIAotICogTm90ZTogd2FudCBJREUgc2V0dGluZ3MgdG8gYXBwZWFyIGluIG1haW4gRWRpdG9ycyBwcmVmZXJlbmNlIHBhZ2UgKHZpYQotICogc3ViY2xhc3NpbmcpLCBob3dldmVyIHRoZSBzdXBlcmNsYXNzLCBFZGl0b3JzUHJlZmVyZW5jZVBhZ2UsIGlzIGludGVybmFsCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVFZGl0b3JzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBFZGl0b3JzUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0gICAgICAgIAotCQlQcmVmZXJlbmNlTGlua0FyZWEgZmlsZUVkaXRvcnNBcmVhID0gbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5OT05FLAotCQkJCSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuRmlsZUVkaXRvcnMiLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVFZGl0b3JzUHJlZmVyZW5jZVBhZ2VfV29ya2JlbmNoUHJlZmVyZW5jZV9GaWxlRWRpdG9yc1JlbGF0ZWRMaW5rLC8vJE5PTi1OTFMtMSQKLQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLG51bGwpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZmlsZUVkaXRvcnNBcmVhLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIFByZWZlcmVuY2VMaW5rQXJlYSBjb250ZW50VHlwZUFyZWEgPSBuZXcgUHJlZmVyZW5jZUxpbmtBcmVhKGNvbXBvc2l0ZSwgU1dULk5PTkUsCi0gICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5Db250ZW50VHlwZXMiLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVFZGl0b3JzUHJlZmVyZW5jZVBhZ2VfV29ya2JlbmNoUHJlZmVyZW5jZV9jb250ZW50VHlwZXNSZWxhdGVkTGluaywvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSxudWxsKTsKLSAgICAgICAgCi0gICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICAgICAgY29udGVudFR5cGVBcmVhLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAKLQkJUHJlZmVyZW5jZUxpbmtBcmVhIGFwcGVhcmFuY2VBcmVhID0gbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5OT05FLAotCQkJCSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuVmlld3MiLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVFZGl0b3JzUHJlZmVyZW5jZVBhZ2VfV29ya2JlbmNoUHJlZmVyZW5jZV92aWV3c1JlbGF0ZWRMaW5rLC8vJE5PTi1OTFMtMSQKLQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLG51bGwpOwotCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJYXBwZWFyYW5jZUFyZWEuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJY3JlYXRlRWRpdG9ySGlzdG9yeUdyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJY3JlYXRlU3BhY2UoY29tcG9zaXRlKTsKLQkJY3JlYXRlU2hvd011bHRpcGxlRWRpdG9yVGFic1ByZWYoY29tcG9zaXRlKTsKLQkJY3JlYXRlRWRpdG9yUmV1c2VHcm91cChjb21wb3NpdGUpOwotCi0JCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9JREVQZXJzcGVjdGl2ZXNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0lERVBlcnNwZWN0aXZlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZTAyYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0lERVBlcnNwZWN0aXZlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUmFkaW9Hcm91cEZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUGVyc3BlY3RpdmVzUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERUludGVybmFsUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogRXh0ZW5kcyB0aGUgUGVyc3BlY3RpdmVzIHByZWZlcmVuY2UgcGFnZSB3aXRoIElERS1zcGVjaWZpYyBzZXR0aW5ncy4KLSAqIAotICogTm90ZTogd2FudCBJREUgc2V0dGluZ3MgdG8gYXBwZWFyIGluIG1haW4gUGVyc3BlY3RpdmVzIHByZWZlcmVuY2UgcGFnZSAodmlhCi0gKiBzdWJjbGFzc2luZyksIGhvd2V2ZXIgdGhlIHN1cGVyY2xhc3MsIFBlcnNwZWN0aXZlc1ByZWZlcmVuY2VQYWdlLCBpcwotICogaW50ZXJuYWwKLSAqLwotcHVibGljIGNsYXNzIElERVBlcnNwZWN0aXZlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUGVyc3BlY3RpdmVzUHJlZmVyZW5jZVBhZ2UgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFBST0pFQ1RfU1dJVENIX1BFUlNQX01PREVfVElUTEUgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0U3dpdGNoUGVyc3BlY3RpdmVNb2RlX29wdGlvbnNUaXRsZTsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFBTUE1fQUxXQVlTX1RFWFQgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0U3dpdGNoUGVyc3BlY3RpdmVNb2RlX2Fsd2F5czsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFBTUE1fTkVWRVJfVEVYVCA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RTd2l0Y2hQZXJzcGVjdGl2ZU1vZGVfbmV2ZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBQU1BNX1BST01QVF9URVhUID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdFN3aXRjaFBlcnNwZWN0aXZlTW9kZV9wcm9tcHQ7Ci0KLSAgICBwcml2YXRlIFJhZGlvR3JvdXBGaWVsZEVkaXRvciBwcm9qZWN0U3dpdGNoRmllbGQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBwYWdlJ3MgVUkgY29udGVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIEBpc3N1ZSBpZiB0aGUgcHJvZHVjdCBzdWJjbGFzc2VzIHRoaXMgcGFnZSwgdGhlbiBpdCBzaG91bGQgcHJvdmlkZQotICAgICAgICAvLyB0aGUgaGVscCBjb250ZW50Ci0gICAgCVBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJLnNldEhlbHAoCi0JCQkJCQlwYXJlbnQsCi0JCQkJCQlvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoSGVscENvbnRleHRJZHMuUEVSU1BFQ1RJVkVTX1BSRUZFUkVOQ0VfUEFHRSk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgICAgIGNyZWF0ZU9wZW5QZXJzcEJ1dHRvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZU9wZW5WaWV3QnV0dG9uR3JvdXAoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlUHJvamVjdFBlcnNwZWN0aXZlR3JvdXAoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlQ3VzdG9taXplUGVyc3BlY3RpdmUoY29tcG9zaXRlKTsKLQotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb21wb3NpdGUgdGhhdCBjb250YWlucyBidXR0b25zIGZvciBzZWxlY3RpbmcgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBvcGVuaW5nIG5ldyBwcm9qZWN0IHNlbGVjdGlvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3RQZXJzcGVjdGl2ZUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQotICAgICAgICBDb21wb3NpdGUgcHJvamVjdENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHByb2plY3RDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIHByb2plY3RDb21wb3NpdGUuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQotICAgICAgICBTdHJpbmdbXVtdIG5hbWVzQW5kVmFsdWVzID0gewotICAgICAgICAgICAgICAgIHsgUFNQTV9BTFdBWVNfVEVYVCwgSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5QU1BNX0FMV0FZUyB9LAotICAgICAgICAgICAgICAgIHsgUFNQTV9ORVZFUl9URVhULCBJREVJbnRlcm5hbFByZWZlcmVuY2VzLlBTUE1fTkVWRVIgfSwKLSAgICAgICAgICAgICAgICB7IFBTUE1fUFJPTVBUX1RFWFQsIElERUludGVybmFsUHJlZmVyZW5jZXMuUFNQTV9QUk9NUFQgfSB9OwotICAgICAgICBwcm9qZWN0U3dpdGNoRmllbGQgPSBuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKAotICAgICAgICAgICAgICAgIElERUludGVybmFsUHJlZmVyZW5jZXMuUFJPSkVDVF9TV0lUQ0hfUEVSU1BfTU9ERSwKLSAgICAgICAgICAgICAgICBQUk9KRUNUX1NXSVRDSF9QRVJTUF9NT0RFX1RJVExFLCBuYW1lc0FuZFZhbHVlcy5sZW5ndGgsCi0gICAgICAgICAgICAgICAgbmFtZXNBbmRWYWx1ZXMsIHByb2plY3RDb21wb3NpdGUsIHRydWUpOwotICAgICAgICBwcm9qZWN0U3dpdGNoRmllbGQuc2V0UHJlZmVyZW5jZVN0b3JlKGdldElERVByZWZlcmVuY2VTdG9yZSgpKTsKLSAgICAgICAgcHJvamVjdFN3aXRjaEZpZWxkLnNldFBhZ2UodGhpcyk7Ci0gICAgICAgIHByb2plY3RTd2l0Y2hGaWVsZC5sb2FkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSURFIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0SURFUHJlZmVyZW5jZVN0b3JlKCkgewotICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUGVyc3BlY3RpdmVzUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0gICAgICAgIHByb2plY3RTd2l0Y2hGaWVsZC5sb2FkRGVmYXVsdCgpOwotICAgICAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUGVyc3BlY3RpdmVzUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gICAgICAgIHByb2plY3RTd2l0Y2hGaWVsZC5zdG9yZSgpOwotICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotICAgICAgICByZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvSURFUmVzb3VyY2VJbmZvVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9JREVSZXNvdXJjZUluZm9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTAyZDk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9JREVSZXNvdXJjZUluZm9VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLkVGUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHN1cHBvcnRpbmcgY29tbW9uIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZyb20gcmVzb3VyY2VzLgotICogCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIElERVJlc291cmNlSW5mb1V0aWxzIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCWVRFU19MQUJFTCA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlSW5mb19ieXRlczsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBGSUxFX0xBQkVMID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VJbmZvX2ZpbGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRklMRV9UWVBFX0ZPUk1BVCA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlSW5mb19maWxlVHlwZUZvcm1hdDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBGT0xERVJfTEFCRUwgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUluZm9fZm9sZGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfTEFCRUwgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUluZm9fcHJvamVjdDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBMSU5LRURfRklMRV9MQUJFTCA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlSW5mb19saW5rZWRGaWxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExJTktFRF9GT0xERVJfTEFCRUwgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUluZm9fbGlua2VkRm9sZGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFVOS05PV05fTEFCRUwgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUluZm9fdW5rbm93bjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBOT1RfTE9DQUxfVEVYVCA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlSW5mb19ub3RMb2NhbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNSVNTSU5HX1BBVEhfVkFSSUFCTEVfVEVYVCA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlSW5mb191bmRlZmluZWRQYXRoVmFyaWFibGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTk9UX0VYSVNUX1RFWFQgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUluZm9fbm90RXhpc3Q7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRklMRV9OT1RfRVhJU1RfVEVYVCA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlSW5mb19maWxlTm90RXhpc3Q7Ci0JCi0JLyoqCi0JICogQW4gZW1wdHkgc3RyaW5nIHRvIHJldXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgZGF0ZSBTdHJpbmcgZm9yIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHN1cHBsaWVkCi0JICogcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgdG8gcXVlcnkKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERhdGVTdHJpbmdWYWx1ZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKCFyZXNvdXJjZS5pc0xvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkKLQkJCXJldHVybiBOT1RfTE9DQUxfVEVYVDsKLQotCQlVUkkgbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvblVSSSgpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJaWYgKHJlc291cmNlLmlzTGlua2VkKCkpCi0JCQkJcmV0dXJuIE1JU1NJTkdfUEFUSF9WQVJJQUJMRV9URVhUOwotCi0JCQlyZXR1cm4gTk9UX0VYSVNUX1RFWFQ7Ci0JCX0KLQotCQlJRmlsZUluZm8gaW5mbyA9IGdldEZpbGVJbmZvKGxvY2F0aW9uKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBVTktOT1dOX0xBQkVMOwotCi0JCWlmIChpbmZvLmV4aXN0cygpKSB7Ci0JCQlEYXRlRm9ybWF0IGZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZShEYXRlRm9ybWF0LkxPTkcsCi0JCQkJCURhdGVGb3JtYXQuTUVESVVNKTsKLQkJCXJldHVybiBmb3JtYXQuZm9ybWF0KG5ldyBEYXRlKGluZm8uZ2V0TGFzdE1vZGlmaWVkKCkpKTsKLQkJfQotCQlyZXR1cm4gTk9UX0VYSVNUX1RFWFQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaWxlSW5mbyBmb3IgbG9jYXRpb24uIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcwotCSAqIGEgQ29yZUV4Y2VwdGlvbiBsb29raW5nIGl0IHVwCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHJldHVybiBTdHJpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlSW5mbyBnZXRGaWxlSW5mbyhVUkkgbG9jYXRpb24pIHsKLQkJSUZpbGVTdG9yZSBzdG9yZSA9IGdldEZpbGVTdG9yZShsb2NhdGlvbik7Ci0JCWlmIChzdG9yZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzdG9yZS5mZXRjaEluZm8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbGVJbmZvIGF0IHBhdGhOYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBmb3JtYXQgaXMKLQkgKiBpbnZhbGlkIG9yIGlmIHRoZSBmaWxlIGluZm8gY2Fubm90IGJlIGRldGVybWluZWQuCi0JICogCi0JICogQHBhcmFtIHBhdGhOYW1lCi0JICogQHJldHVybiBJRmlsZUluZm8gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlSW5mbyBnZXRGaWxlSW5mbyhTdHJpbmcgcGF0aE5hbWUpIHsKLQkJSUZpbGVTdG9yZSBzdG9yZSA9IGdldEZpbGVTdG9yZShwYXRoTmFtZSk7Ci0JCWlmIChzdG9yZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzdG9yZS5mZXRjaEluZm8oKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaWxlSW5mbyBhdCBwYXRoTmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZm9ybWF0IGlzCi0JICogaW52YWxpZCBvciBpZiB0aGUgZmlsZSBpbmZvIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoTmFtZQotCSAqIEByZXR1cm4gSUZpbGVJbmZvIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZUluZm8gZ2V0RmlsZUluZm8oSVBhdGggcGF0aE5hbWUpIHsKLQkJSUZpbGVTdG9yZSBzdG9yZSA9IGdldEZpbGVTdG9yZShwYXRoTmFtZS50b0ZpbGUoKS50b1VSSSgpKTsKLQkJaWYgKHN0b3JlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHN0b3JlLmZldGNoSW5mbygpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbG9jYXRpb24gb2YgYSByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSB0ZXh0IHRvIGRpc3BsYXkgdGhlIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYXRpb25UZXh0KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAoIXJlc291cmNlLmlzTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8pKQotCQkJcmV0dXJuIE5PVF9MT0NBTF9URVhUOwotCi0JCVVSSSByZXNvbHZlZExvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKTsKLQkJVVJJIGxvY2F0aW9uID0gcmVzb2x2ZWRMb2NhdGlvbjsKLQkJaWYgKHJlc291cmNlLmlzTGlua2VkKCkpIHsKLQkJCWxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0UmF3TG9jYXRpb25VUkkoKTsKLQkJfQotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIE5PVF9FWElTVF9URVhUOwotCQl9Ci0KLQkJSUZpbGVTdG9yZSBzdG9yZSA9IGdldEZpbGVTdG9yZShsb2NhdGlvbik7Ci0JCWlmIChyZXNvbHZlZExvY2F0aW9uICE9IG51bGwgJiYgIWlzUGF0aFZhcmlhYmxlKHJlc291cmNlKSkgewotCQkJLy8gTm8gcGF0aCB2YXJpYWJsZSB1c2VkLiBEaXNwbGF5IHRoZSBmaWxlIG5vdCBleGlzdCBtZXNzYWdlCi0JCQkvLyBpbiB0aGUgbG9jYXRpb24uIEZpeGVzIGJ1ZyAzMzMxOC4KLQkJCWlmIChzdG9yZSA9PSBudWxsKQotCQkJCXJldHVybiBVTktOT1dOX0xBQkVMOwotCQkJaWYgKCFzdG9yZS5mZXRjaEluZm8oKS5leGlzdHMoKSkgewotCQkJCXJldHVybiBOTFMuYmluZChGSUxFX05PVF9FWElTVF9URVhULCBsb2NhdGlvbi50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlpZiAoc3RvcmUgIT0gbnVsbCkKLQkJCXJldHVybiBzdG9yZS50b1N0cmluZygpOwotCQlyZXR1cm4gbG9jYXRpb24udG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlc29sdmVkIGxvY2F0aW9uIG9mIGEgcmVzb3VyY2UuIFRoaXMgcmVzb2x2ZXMgcGF0aCB2YXJpYWJsZXMgaWYKLQkgKiBwcmVzZW50IGluIHRoZSByZXNvdXJjZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb2x2ZWRMb2NhdGlvblRleHQoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmICghcmVzb3VyY2UuaXNMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTykpCi0JCQlyZXR1cm4gTk9UX0xPQ0FMX1RFWFQ7Ci0KLQkJVVJJIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCWlmIChyZXNvdXJjZS5pc0xpbmtlZCgpKQotCQkJCXJldHVybiBNSVNTSU5HX1BBVEhfVkFSSUFCTEVfVEVYVDsKLQotCQkJcmV0dXJuIE5PVF9FWElTVF9URVhUOwotCQl9Ci0KLQkJSUZpbGVTdG9yZSBzdG9yZSA9IGdldEZpbGVTdG9yZShsb2NhdGlvbik7Ci0JCWlmIChzdG9yZSA9PSBudWxsKQotCQkJcmV0dXJuIFVOS05PV05fTEFCRUw7Ci0KLQkJaWYgKCFzdG9yZS5mZXRjaEluZm8oKS5leGlzdHMoKSkKLQkJCXJldHVybiBOTFMuYmluZChGSUxFX05PVF9FWElTVF9URVhULCBzdG9yZS50b1N0cmluZygpKTsKLQotCQlyZXR1cm4gc3RvcmUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBTdHJpbmcgdGhhdCBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIHN1cHBsaWVkIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNpemVTdHJpbmcoSUZpbGUgZmlsZSkgewotCQlpZiAoIWZpbGUuaXNMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTykpCi0JCQlyZXR1cm4gTk9UX0xPQ0FMX1RFWFQ7Ci0KLQkJVVJJIGxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvblVSSSgpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJaWYgKGZpbGUuaXNMaW5rZWQoKSkKLQkJCQlyZXR1cm4gTUlTU0lOR19QQVRIX1ZBUklBQkxFX1RFWFQ7Ci0KLQkJCXJldHVybiBOT1RfRVhJU1RfVEVYVDsKLQkJfQotCi0JCUlGaWxlSW5mbyBpbmZvID0gZ2V0RmlsZUluZm8obG9jYXRpb24pOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIFVOS05PV05fTEFCRUw7Ci0KLQkJaWYgKGluZm8uZXhpc3RzKCkpCi0JCQlyZXR1cm4gTkxTLmJpbmQoQllURVNfTEFCRUwsIExvbmcudG9TdHJpbmcoaW5mby5nZXRMZW5ndGgoKSkpOwotCi0JCXJldHVybiBOT1RfRVhJU1RfVEVYVDsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFN0cmluZyB0aGF0IGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgc3VwcGxpZWQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNpemVTdHJpbmcoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQkJaWYgKCFmaWxlLmlzTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8pKQotCQkJcmV0dXJuIE5PVF9MT0NBTF9URVhUOwotCi0JCVVSSSBsb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb25VUkkoKTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCWlmIChmaWxlLmlzTGlua2VkKCkpCi0JCQkJcmV0dXJuIE1JU1NJTkdfUEFUSF9WQVJJQUJMRV9URVhUOwotCi0JCQlyZXR1cm4gTk9UX0VYSVNUX1RFWFQ7Ci0JCX0KLQotCQlJRmlsZUluZm8gaW5mbyA9IGdldEZpbGVJbmZvKGxvY2F0aW9uKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBVTktOT1dOX0xBQkVMOwotCi0JCWlmIChpbmZvLmV4aXN0cygpKQotCQkJcmV0dXJuIE5MUy5iaW5kKEJZVEVTX0xBQkVMLCBMb25nLnRvU3RyaW5nKGluZm8uZ2V0TGVuZ3RoKCkpKTsKLQotCQlyZXR1cm4gTk9UX0VYSVNUX1RFWFQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIHRoaXMgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKElSZXNvdXJjZSByZXNvdXJjZSwKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQlpZiAocmVzb3VyY2UuaXNMaW5rZWQoKSkKLQkJCQlyZXR1cm4gTElOS0VEX0ZJTEVfTEFCRUw7Ci0KLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGVTdHJpbmcoZGVzY3JpcHRpb24pOwotCQkJCWlmIChjb250ZW50VHlwZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoRklMRV9UWVBFX0ZPUk1BVCwKLQkJCQkJCQluZXcgU3RyaW5nW10geyBjb250ZW50VHlwZSB9KTsKLQkJCX0KLQkJCXJldHVybiBGSUxFX0xBQkVMOwotCQl9Ci0KLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0JCQlpZiAocmVzb3VyY2UuaXNMaW5rZWQoKSkKLQkJCQlyZXR1cm4gTElOS0VEX0ZPTERFUl9MQUJFTDsKLQotCQkJcmV0dXJuIEZPTERFUl9MQUJFTDsKLQkJfQotCi0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQlyZXR1cm4gUFJPSkVDVF9MQUJFTDsKLQotCQkvLyBTaG91bGQgbm90IGJlIHBvc3NpYmxlCi0JCXJldHVybiBVTktOT1dOX0xBQkVMOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb250ZW50VHlwZVN0cmluZyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBkZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpCi0JCQkJcmV0dXJuIGNvbnRlbnRUeXBlLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHJlc291cmNlIGlzIGEgbGlua2VkIHJlc291cmNlIGJvdW5kIHRvIGEgcGF0aAotCSAqIHZhcmlhYmxlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgcmVzb3VyY2UgdG8gdGVzdAotCSAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgYSBsaW5rZWQKLQkgKiAgICAgICAgIHJlc291cmNlIGJvdW5kIHRvIGEgcGF0aCB2YXJpYWJsZS4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRoZSBnaXZlbgotCSAqICAgICAgICAgcmVzb3VyY2UgaXMgZWl0aGVyIG5vdCBhIGxpbmtlZCByZXNvdXJjZSBvciBpdCBpcyBub3QgdXNpbmcgYQotCSAqICAgICAgICAgcGF0aCB2YXJpYWJsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUGF0aFZhcmlhYmxlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAoIXJlc291cmNlLmlzTGlua2VkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJVVJJIHJlc29sdmVkTG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvblVSSSgpOwotCQlpZiAocmVzb2x2ZWRMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkvLyBtaXNzaW5nIHBhdGggdmFyaWFibGUKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCVVSSSByYXdMb2NhdGlvbiA9IHJlc291cmNlLmdldFJhd0xvY2F0aW9uVVJJKCk7Ci0JCWlmIChyZXNvbHZlZExvY2F0aW9uLmVxdWFscyhyYXdMb2NhdGlvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaWxlIHN0b3JlIGZvciB0aGUgc3RyaW5nLgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuIElGaWxlU3RvcmUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgYQotCSAqIHtAbGluayBDb3JlRXhjZXB0aW9ufS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlU3RvcmUgZ2V0RmlsZVN0b3JlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIGdldEZpbGVTdG9yZShuZXcgUGF0aChzdHJpbmcpLnRvRmlsZSgpLnRvVVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlsZSBzdG9yZSBmb3IgdGhlIFVSSS4KLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBJRmlsZVN0b3JlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIGEKLQkgKiB7QGxpbmsgQ29yZUV4Y2VwdGlvbn0uCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZVN0b3JlIGdldEZpbGVTdG9yZShVUkkgdXJpKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRUZTLmdldFN0b3JlKHVyaSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJbG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhDb3JlRXhjZXB0aW9uIGUpIHsKLQkJSURFV29ya2JlbmNoUGx1Z2luLmxvZyhlLmdldE1lc3NhZ2UoKSwgZS5nZXRTdGF0dXMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaWxlIHN0b3JlcyB0aGF0IGFyZSBhIGNoaWxkIG9mIHN0b3JlIHRoYXQgdGhlIGZpbHRlciAKLQkgKiBhY2NlcHRzLgotCSAqIEBwYXJhbSBzdG9yZQotCSAqIEBwYXJhbSBmaWxlRmlsdGVyCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIElGaWxlU3RvcmVbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGVTdG9yZVtdIGxpc3RGaWxlU3RvcmVzKElGaWxlU3RvcmUgc3RvcmUsIElGaWxlU3RvcmVGaWx0ZXIgZmlsZUZpbHRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlGaWxlU3RvcmVbXSBjaGlsZHJlbjsKLQkJdHJ5IHsKLQkJCWNoaWxkcmVuID0gc3RvcmUuY2hpbGRTdG9yZXMoRUZTLk5PTkUsIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWxvZyhlKTsKLQkJCXJldHVybiBuZXcgSUZpbGVTdG9yZVswXTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihmaWxlRmlsdGVyLmFjY2VwdChjaGlsZHJlbltpXSkpCi0JCQkJcmVzdWx0LmFkZChjaGlsZHJlbltpXSk7CQkJCi0JCX0KLQkJSUZpbGVTdG9yZVtdIHN0b3JlcyA9IG5ldyBJRmlsZVN0b3JlW3Jlc3VsdC5zaXplKCldOwotCQlyZXN1bHQudG9BcnJheShzdG9yZXMpOwotCQlyZXR1cm4gc3RvcmVzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIGZpbGUgY2FsbGVkIHBhdGhOYW1lIGV4aXN0cy4KLQkgKiBAcGFyYW0gcGF0aE5hbWUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgZXhpc3RzLgotCSAqIEBzZWUgSUZpbGVJbmZvI2V4aXN0cygpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGV4aXN0cyhTdHJpbmcgcGF0aE5hbWUpIHsKLQkJSUZpbGVJbmZvIGluZm8gPSBnZXRGaWxlSW5mbyhwYXRoTmFtZSk7Ci0JCWlmKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGluZm8uZXhpc3RzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvSURFU3RhcnR1cFByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvSURFU3RhcnR1cFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjc5OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0lERVN0YXJ0dXBQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlN0YXJ0dXBQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuQ2hvb3NlV29ya3NwYWNlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFSW50ZXJuYWxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiBFeHRlbmRzIHRoZSBTdGFydHVwIGFuZCBTaHV0ZG93biBwcmVmZXJlbmNlIHBhZ2Ugd2l0aCBJREUtc3BlY2lmaWMgc2V0dGluZ3MuCi0gKiAKLSAqIE5vdGU6IHdhbnQgSURFIHNldHRpbmdzIHRvIGFwcGVhciBpbiBtYWluIFdvcmtiZW5jaCBwcmVmZXJlbmNlIHBhZ2UgKHZpYSBzdWJjbGFzc2luZyksCi0gKiAgIGhvd2V2ZXIgdGhlIHN1cGVyY2xhc3MsIFN0YXJ0dXBQcmVmZXJlbmNlUGFnZSwgaXMgaW50ZXJuYWwKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIElERVN0YXJ0dXBQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFN0YXJ0dXBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0gICAgICAgIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiByZWZyZXNoQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbGF1bmNoUHJvbXB0QnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZXhpdFByb21wdEJ1dHRvbjsKLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZQotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgIAlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwKLQkJCQlJV29ya2JlbmNoSGVscENvbnRleHRJZHMuU1RBUlRVUF9QUkVGRVJFTkNFX1BBR0UpOwotCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQotICAgICAgICBjcmVhdGVMYXVuY2hQcm9tcHRQcmVmKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZVJlZnJlc2hXb3Jrc3BhY2VPblN0YXJ0dXBQcmVmKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZUV4aXRQcm9tcHRQcmVmKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgTGFiZWwgc3BhY2UgPSBuZXcgTGFiZWwoY29tcG9zaXRlLFNXVC5OT05FKTsKLQkJc3BhY2Uuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0gICAgICAgIAotICAgICAgICBjcmVhdGVFYXJseVN0YXJ0dXBTZWxlY3Rpb24oY29tcG9zaXRlKTsKLQotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldElERVByZWZlcmVuY2VTdG9yZSgpOwotCi0gICAgICAgIGxhdW5jaFByb21wdEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLSAgICAgICAgcmVmcmVzaEJ1dHRvbgotICAgICAgICAgICAgICAgIC5zZXRTZWxlY3Rpb24oc3RvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0Qm9vbGVhbihJREVJbnRlcm5hbFByZWZlcmVuY2VzLlJFRlJFU0hfV09SS1NQQUNFX09OX1NUQVJUVVApKTsKLSAgICAgICAgZXhpdFByb21wdEJ1dHRvbgotICAgICAgICAgICAgICAgIC5zZXRTZWxlY3Rpb24oc3RvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0Qm9vbGVhbihJREVJbnRlcm5hbFByZWZlcmVuY2VzLkVYSVRfUFJPTVBUX09OX0NMT1NFX0xBU1RfV0lORE9XKSk7Ci0KLSAgICAgICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHVzZXIgaGFzIHByZXNzZWQgT2suIFN0b3JlL2FwcGx5IHRoaXMgcGFnZSdzIHZhbHVlcyBhcHByb3ByaWF0ZWx5LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldElERVByZWZlcmVuY2VTdG9yZSgpOwotCi0gICAgICAgIC8vIHN0b3JlIHRoZSByZWZyZXNoIHdvcmtzcGFjZSBvbiBzdGFydHVwIHNldHRpbmcKLSAgICAgICAgc3RvcmUuc2V0VmFsdWUoSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5SRUZSRVNIX1dPUktTUEFDRV9PTl9TVEFSVFVQLAotICAgICAgICAgICAgICAgIHJlZnJlc2hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0gICAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBwcmVmZXJlbmNlCi0gICAgICAgIC8vICAgICAgIGFyZWEsIGJ1dCBkaiBzYWlkIHdlIHNob3VsZG4ndCB1c2UgaXQgeWV0OyBzb21lIGZpbmFsIGRldGFpbHMgYXJlCi0gICAgICAgIC8vICAgICAgIGJlaW5nIHdvcmtlZCBvdXQuIEhvcGVmdWxseSBpdCB3aWxsIGJlIGF2YWlsYWJsZSBzb29uLCBhdCB3aGljaCB0aW1lCi0gICAgICAgIC8vICAgICAgIHRoZSBlbnRpcmUgcmVjZW50V29ya3NwYWNlcy54bWwgZmlsZSBjYW4gYmUgcmVtb3ZlZC4gQnV0IHVudGlsIHRoZW4sCi0gICAgICAgIC8vICAgICAgIHRoaXMgcHJlZmVyZW5jZSByZWFkcy93cml0ZXMgdGhlIGZpbGUgZWFjaCB0aW1lLgotICAgICAgICBDaG9vc2VXb3Jrc3BhY2VEYXRhLnNldFNob3dEaWFsb2dWYWx1ZShsYXVuY2hQcm9tcHRCdXR0b24KLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCkpOwotCi0gICAgICAgIC8vIHN0b3JlIHRoZSBleGl0IHByb21wdCBvbiBsYXN0IHdpbmRvdyBjbG9zZSBzZXR0aW5nCi0gICAgICAgIHN0b3JlLnNldFZhbHVlKElERUludGVybmFsUHJlZmVyZW5jZXMuRVhJVF9QUk9NUFRfT05fQ0xPU0VfTEFTVF9XSU5ET1csCi0gICAgICAgICAgICAgICAgZXhpdFByb21wdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLSAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVmcmVzaFdvcmtzcGFjZU9uU3RhcnR1cFByZWYoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICByZWZyZXNoQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHJlZnJlc2hCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5TdGFydHVwUHJlZmVyZW5jZVBhZ2VfcmVmcmVzaEJ1dHRvbik7Ci0gICAgICAgIHJlZnJlc2hCdXR0b24uc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLSAgICAgICAgcmVmcmVzaEJ1dHRvbi5zZXRTZWxlY3Rpb24oZ2V0SURFUHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICBJREVJbnRlcm5hbFByZWZlcmVuY2VzLlJFRlJFU0hfV09SS1NQQUNFX09OX1NUQVJUVVApKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMYXVuY2hQcm9tcHRQcmVmKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgbGF1bmNoUHJvbXB0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGxhdW5jaFByb21wdEJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlN0YXJ0dXBQcmVmZXJlbmNlUGFnZV9sYXVuY2hQcm9tcHRCdXR0b24pOwotICAgICAgICBsYXVuY2hQcm9tcHRCdXR0b24uc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQotICAgICAgICAvLyBUT0RPOiBUaGlzIHNob3VsZCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZQotICAgICAgICAvLyAgICAgICBhcmVhLCBidXQgZGogc2FpZCB3ZSBzaG91bGRuJ3QgdXNlIGl0IHlldDsgc29tZSBmaW5hbCBkZXRhaWxzIGFyZQotICAgICAgICAvLyAgICAgICBiZWluZyB3b3JrZWQgb3V0LiBIb3BlZnVsbHkgaXQgd2lsbCBiZSBhdmFpbGFibGUgc29vbiwgYXQgd2hpY2ggdGltZQotICAgICAgICAvLyAgICAgICB0aGUgZW50aXJlIHJlY2VudFdvcmtzcGFjZXMueG1sIGZpbGUgY2FuIGJlIHJlbW92ZWQuIEJ1dCB1bnRpbCB0aGVuLAotICAgICAgICAvLyAgICAgICB0aGlzIHByZWZlcmVuY2UgcmVhZHMvd3JpdGVzIHRoZSBmaWxlIGVhY2ggdGltZS4KLSAgICAgICAgbGF1bmNoUHJvbXB0QnV0dG9uLnNldFNlbGVjdGlvbihDaG9vc2VXb3Jrc3BhY2VEYXRhCi0gICAgICAgICAgICAgICAgLmdldFNob3dEaWFsb2dWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeGl0UHJvbXB0UHJlZihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIGV4aXRQcm9tcHRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLSAgICAgICAgZXhpdFByb21wdEJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlN0YXJ0dXBQcmVmZXJlbmNlUGFnZV9leGl0UHJvbXB0QnV0dG9uKTsKLSAgICAgICAgZXhpdFByb21wdEJ1dHRvbi5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotICAgICAgICBleGl0UHJvbXB0QnV0dG9uLnNldFNlbGVjdGlvbihnZXRJREVQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotICAgICAgICAgICAgICAgIElERUludGVybmFsUHJlZmVyZW5jZXMuRVhJVF9QUk9NUFRfT05fQ0xPU0VfTEFTVF9XSU5ET1cpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJREUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRJREVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9JREVXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0lERVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTcxYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0lERVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgSURFIHdvcmtiZW5jaCBtYWluIHByZWZlcmVuY2UgcGFnZS4KLSAqIAotICpOb3RlOiB3YW50IElERSBzZXR0aW5ncyB0byBhcHBlYXIgaW4gbWFpbiBXb3JrYmVuY2ggcHJlZmVyZW5jZSBwYWdlICh2aWEgc3ViY2xhc3NpbmcpLAotICogICBob3dldmVyIHRoZSBzdXBlcmNsYXNzLCBXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgaXMgaW50ZXJuYWwKLSAqLwotcHVibGljIGNsYXNzIElERVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLSAgICAgICAgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LAotCQkJCUlXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5XT1JLQkVOQ0hfUFJFRkVSRU5DRV9QQUdFKTsKLQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICAgICAgY3JlYXRlU2hvd1VzZXJEaWFsb2dQcmVmKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZVN0aWNreUN5Y2xlUHJlZihjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVIZWFwU3RhdHVzUHJlZihjb21wb3NpdGUpOwotICAgICAgICAKLSAgICAgICAgY3JlYXRlT3Blbk1vZGVHcm91cChjb21wb3NpdGUpOwotCi0gICAgICAgIGFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIElERSBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0SURFUHJlZmVyZW5jZVN0b3JlKCkgewotICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB1c2VyIGhhcyBwcmVzc2VkIE9rLiBTdG9yZS9hcHBseSB0aGlzIHBhZ2UncyB2YWx1ZXMgYXBwcm9wcmlhdGVseS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKLSAgICB9Ci0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9JREVXb3Jrc3BhY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0lERVdvcmtzcGFjZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTNlNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0lERVdvcmtzcGFjZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSW50ZWdlckZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEVuY29kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREVFbmNvZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuZGlhbG9ncy5SZXNvdXJjZUVuY29kaW5nRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERUludGVybmFsUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuTGluZURlbGltaXRlckVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLQotLyoqCi0gKiBUaGUgSURFV29ya3NwYWNlUHJlZmVyZW5jZVBhZ2UgaXMgdGhlIHBhZ2UgdXNlZCB0byBzZXQgSURFLXNwZWNpZmljIHByZWZlcmVuY2VzIHNldHRpbmdzCi0gKiByZWxhdGVkIHRvIHdvcmtzcGFjZS4KLQotICpOb3RlOlRoaXMgY2xhc3MgZXh0ZW5kcyBmcm9tIFByZWZlcmVuY2VQYWdlLGFuZCB0aGVyZSdzIG5vIFdvcmtzcGFjZVByZWZlcmVuY2VQYWdlIGNsYXNzLgotICpIZW5jZSB3aGVuIHRoZSBJREUgc2V0dGluZ3MgZG9lc24ndCBhcHBlYXIgaW4gdGhpcyBwcmVmZXJlbmNlIHBhZ2UsIHRoaXMgcGFnZSB3aWxsIGJlIGVtcHR5LgotICovCi1wdWJsaWMgY2xhc3MgSURFV29ya3NwYWNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZQotICAgICAgICBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZXsKLQotCXByaXZhdGUgQnV0dG9uIGF1dG9CdWlsZEJ1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGF1dG9TYXZlQWxsQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBJbnRlZ2VyRmllbGRFZGl0b3Igc2F2ZUludGVydmFsOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gYXV0b1JlZnJlc2hCdXR0b247Ci0gICAgCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUVuY29kaW5nRmllbGRFZGl0b3IgZW5jb2RpbmdFZGl0b3I7Ci0KLQlwcml2YXRlIExpbmVEZWxpbWl0ZXJFZGl0b3IgbGluZVNlcGFyYXRvckVkaXRvcjsKLQkKLSAgICAvL0EgYm9vbGVhbiB0byBpbmRpY2F0ZSBpZiB0aGUgdXNlciBzZXR0aW5ncyB3ZXJlIGNsZWFyZWQuCi0JcHJpdmF0ZSBib29sZWFuIGNsZWFyVXNlclNldHRpbmdzID0gZmFsc2U7Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsCi0JCQkJSUlERUhlbHBDb250ZXh0SWRzLldPUktTUEFDRV9QUkVGRVJFTkNFX1BBR0UpOwotCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQotCQlQcmVmZXJlbmNlTGlua0FyZWEgYXJlYSA9IG5ldyBQcmVmZXJlbmNlTGlua0FyZWEoY29tcG9zaXRlLCBTV1QuTk9ORSwKLQkJCQkib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLlN0YXJ0dXAiLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVXb3Jrc3BhY2VQcmVmZXJlbmNlUGFnZV9Xb3JrYmVuY2hQcmVmZXJlbmNlX3JlbGF0ZWRMaW5rLC8vJE5PTi1OTFMtMSQKLQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLG51bGwpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJYXJlYS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgCi0JCUxhYmVsIHNwYWNlID0gbmV3IExhYmVsKGNvbXBvc2l0ZSxTV1QuTk9ORSk7Ci0JCXNwYWNlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkKLSAgICAgICAgY3JlYXRlQXV0b0J1aWxkUHJlZihjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVTYXZlQWxsQmVmb3JlQnVpbGRQcmVmKGNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICBjcmVhdGVTcGFjZShjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVTYXZlSW50ZXJ2YWxHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVTcGFjZShjb21wb3NpdGUpOwotCQljcmVhdGVBdXRvUmVmcmVzaENvbnRyb2xzKGNvbXBvc2l0ZSk7Ci0JCQotCQlDb21wb3NpdGUgbG93ZXIgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSxTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbG93ZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsb3dlckxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbG93ZXJMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJbG93ZXIuc2V0TGF5b3V0KGxvd2VyTGF5b3V0KTsKLQkJCi0JCWxvd2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotICAgICAgICAgICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQkKLQkJY3JlYXRlRW5jb2RpbmdFZGl0b3JDb250cm9scyhsb3dlcik7Ci0JCWNyZWF0ZUxpbmVTZXBhcmF0b3JFZGl0b3JDb250cm9scyhsb3dlcik7Ci0JCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2F2ZUFsbEJlZm9yZUJ1aWxkUHJlZihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIGF1dG9TYXZlQWxsQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGF1dG9TYXZlQWxsQnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuSURFV29ya3NwYWNlUHJlZmVyZW5jZV9zYXZlUHJpb3JUb0J1aWxkaW5nKTsKLSAgICAgICAgYXV0b1NhdmVBbGxCdXR0b24uc2V0VG9vbFRpcFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuSURFV29ya3NwYWNlUHJlZmVyZW5jZV9zYXZlUHJpb3JUb0J1aWxkaW5nVG9vbFRpcCk7Ci0gICAgICAgIGF1dG9TYXZlQWxsQnV0dG9uLnNldFNlbGVjdGlvbihnZXRJREVQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotICAgICAgICAgICAgICAgIElERUludGVybmFsUHJlZmVyZW5jZXMuU0FWRV9BTExfQkVGT1JFX0JVSUxEKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXV0b0J1aWxkUHJlZihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIGF1dG9CdWlsZEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotICAgICAgICBhdXRvQnVpbGRCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVXb3Jrc3BhY2VQcmVmZXJlbmNlX2F1dG9idWlsZCk7Ci0gICAgICAgIGF1dG9CdWlsZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVXb3Jrc3BhY2VQcmVmZXJlbmNlX2F1dG9idWlsZFRvb2xUaXApOwotICAgICAgICBhdXRvQnVpbGRCdXR0b24uc2V0U2VsZWN0aW9uKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotICAgICAgICAgICAgICAgIC5pc0F1dG9CdWlsZGluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBjb21wb3NpdGUgdGhhdCBjb250YWlucyBlbnRyeSBmaWVsZHMgc3BlY2lmeWluZyBzYXZlIGludGVydmFsCi0gICAgICogcHJlZmVyZW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlIHRoZSBDb21wb3NpdGUgdGhlIGdyb3VwIGlzIGNyZWF0ZWQgaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNhdmVJbnRlcnZhbEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgQ29tcG9zaXRlIGdyb3VwQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGdyb3VwQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIGdyb3VwQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICAgIHNhdmVJbnRlcnZhbCA9IG5ldyBJbnRlZ2VyRmllbGRFZGl0b3IoCi0gICAgICAgICAgICAgICAgSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5TQVZFX0lOVEVSVkFMLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hQcmVmZXJlbmNlX3NhdmVJbnRlcnZhbCwKLSAgICAgICAgICAgICAgICBncm91cENvbXBvc2l0ZSk7Ci0KLSAgICAgICAgLy8gQGlzc3VlIHdlIHNob3VsZCBkcm9wIG91ciBwcmVmZXJlbmNlIGNvbnN0YW50IGFuZCBsZXQgY2xpZW50cyB1c2UKLSAgICAgICAgLy8gY29yZSdzIHByZWYuIG91cnMgaXMgbm90IHVwLXRvLWRhdGUgYW55d2F5IGlmIHNvbWVvbmUgY2hhbmdlcyB0aGlzCi0gICAgICAgIC8vIGludGVydmFsIGRpcmVjdGx5IHRocnUgY29yZSBhcGkuCi0gICAgICAgIHNhdmVJbnRlcnZhbC5zZXRQcmVmZXJlbmNlU3RvcmUoZ2V0SURFUHJlZmVyZW5jZVN0b3JlKCkpOwotICAgICAgICBzYXZlSW50ZXJ2YWwuc2V0UGFnZSh0aGlzKTsKLSAgICAgICAgc2F2ZUludGVydmFsLnNldFRleHRMaW1pdChJbnRlZ2VyLnRvU3RyaW5nKAotICAgICAgICAgICAgICAgIElERUludGVybmFsUHJlZmVyZW5jZXMuTUFYX1NBVkVfSU5URVJWQUwpLmxlbmd0aCgpKTsKLSAgICAgICAgc2F2ZUludGVydmFsLnNldEVycm9yTWVzc2FnZShOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hQcmVmZXJlbmNlX3NhdmVJbnRlcnZhbEVycm9yLCBuZXcgSW50ZWdlcihJREVJbnRlcm5hbFByZWZlcmVuY2VzLk1BWF9TQVZFX0lOVEVSVkFMKSkpOwotICAgICAgICBzYXZlSW50ZXJ2YWwKLSAgICAgICAgICAgICAgICAuc2V0VmFsaWRhdGVTdHJhdGVneShTdHJpbmdGaWVsZEVkaXRvci5WQUxJREFURV9PTl9LRVlfU1RST0tFKTsKLSAgICAgICAgc2F2ZUludGVydmFsLnNldFZhbGlkUmFuZ2UoMSwgSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5NQVhfU0FWRV9JTlRFUlZBTCk7Ci0KLSAgICAgICAgSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpCi0gICAgICAgICAgICAgICAgLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGxvbmcgaW50ZXJ2YWwgPSBkZXNjcmlwdGlvbi5nZXRTbmFwc2hvdEludGVydmFsKCkgLyA2MDAwMDsKLSAgICAgICAgc2F2ZUludGVydmFsLnNldFN0cmluZ1ZhbHVlKExvbmcudG9TdHJpbmcoaW50ZXJ2YWwpKTsKLQotICAgICAgICBzYXZlSW50ZXJ2YWwuc2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoRmllbGRFZGl0b3IuSVNfVkFMSUQpKQotICAgICAgICAgICAgICAgICAgICBzZXRWYWxpZChzYXZlSW50ZXJ2YWwuaXNWYWxpZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICB9Ci0JCi0JLyoqCi0gICAgICogQ3JlYXRlIHRoZSBSZWZyZXNoIGNvbnRyb2xzCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBdXRvUmVmcmVzaENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICB0aGlzLmF1dG9SZWZyZXNoQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHRoaXMuYXV0b1JlZnJlc2hCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVXb3Jrc3BhY2VQcmVmZXJlbmNlX1JlZnJlc2hCdXR0b25UZXh0KTsKLSAgICAgICAgdGhpcy5hdXRvUmVmcmVzaEJ1dHRvbi5zZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVXb3Jrc3BhY2VQcmVmZXJlbmNlX1JlZnJlc2hCdXR0b25Ub29sVGlwKTsKLQotICAgICAgICBib29sZWFuIGF1dG9SZWZyZXNoID0gUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpCi0gICAgICAgICAgICAgICAgLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5QUkVGX0FVVE9fUkVGUkVTSCk7Ci0gICAgICAgIHRoaXMuYXV0b1JlZnJlc2hCdXR0b24uc2V0U2VsZWN0aW9uKGF1dG9SZWZyZXNoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBjb21wb3NpdGUgdGhhdCBjb250YWlucyB0aGUgZW5jb2RpbmcgY29udHJvbHMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nRWRpdG9yQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCl7ICAgIAkJCQotCQlDb21wb3NpdGUgZW5jb2RpbmdDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCxTV1QuTk9ORSk7Ci0JCWVuY29kaW5nQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZW5jb2RpbmdDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCQotCQllbmNvZGluZ0VkaXRvciA9IG5ldyBSZXNvdXJjZUVuY29kaW5nRmllbGRFZGl0b3IoSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoUHJlZmVyZW5jZV9lbmNvZGluZywgZW5jb2RpbmdDb21wb3NpdGUsIFJlc291cmNlc1BsdWdpbgotCQkJCS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCi0JCWVuY29kaW5nRWRpdG9yLnNldFBhZ2UodGhpcyk7Ci0JCWVuY29kaW5nRWRpdG9yLmxvYWQoKTsKLQkJZW5jb2RpbmdFZGl0b3Iuc2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEZpZWxkRWRpdG9yLklTX1ZBTElEKSkKLQkJCQkJIHNldFZhbGlkKGVuY29kaW5nRWRpdG9yLmlzVmFsaWQoKSk7Ci0KLQkJCX0KLQkJfSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNvbXBvc2l0ZSB0aGF0IGNvbnRhaW5zIHRoZSBsaW5lIGRlbGltaXRlciBjb250cm9scwotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlTGluZVNlcGFyYXRvckVkaXRvckNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQpewotICAgIAlDb21wb3NpdGUgbGluZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LFNXVC5OT05FKTsKLQkJbGluZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWxpbmVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCQotCQlsaW5lU2VwYXJhdG9yRWRpdG9yID0gbmV3IExpbmVEZWxpbWl0ZXJFZGl0b3IobGluZUNvbXBvc2l0ZSk7Ci0JCWxpbmVTZXBhcmF0b3JFZGl0b3IuZG9Mb2FkKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIElERSBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0SURFUHJlZmVyZW5jZVN0b3JlKCkgewotICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICB9Ci0JCi0JLyoqCi0gICAgICogQ3JlYXRlcyBhIHRhYiBvZiBvbmUgaG9yaXpvbnRhbCBzcGFucy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IGluIHdoaWNoIHRoZSB0YWIgc2hvdWxkIGJlIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY3JlYXRlU3BhY2UoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCB2ZmlsbGVyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotICAgICAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgICAgICBncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotICAgICAgICB2ZmlsbGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIH0KLQotCS8qKgotICAgICAqIENyZWF0ZXMgdGhlIGNvbXBvc2l0ZSB3aGljaCB3aWxsIGNvbnRhaW4gYWxsIHRoZSBwcmVmZXJlbmNlIGNvbnRyb2xzIGZvcgotICAgICAqIHRoaXMgcGFnZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqIEByZXR1cm4gdGhlIGNvbXBvc2l0ZSBmb3IgdGhpcyBwYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCQotCXB1YmxpYyB2b2lkIGluaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLSAgICAgICAgLy9uby1vcAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0KLSAgICAgICAgLy8gY29yZSBob2xkcyBvbnRvIHRoaXMgcHJlZmVyZW5jZS4KLSAgICAgICAgYm9vbGVhbiBhdXRvQnVpbGQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0Qm9vbGVhbihSZXNvdXJjZXNQbHVnaW4uUFJFRl9BVVRPX0JVSUxESU5HKTsKLSAgICAgICAgYXV0b0J1aWxkQnV0dG9uLnNldFNlbGVjdGlvbihhdXRvQnVpbGQpOwotCi0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRJREVQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgYXV0b1NhdmVBbGxCdXR0b24KLSAgICAgICAgICAgICAgICAuc2V0U2VsZWN0aW9uKHN0b3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEJvb2xlYW4oSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5TQVZFX0FMTF9CRUZPUkVfQlVJTEQpKTsKLSAgICAgICAgc2F2ZUludGVydmFsLmxvYWREZWZhdWx0KCk7Ci0KLQkJCi0gICAgICAgIGJvb2xlYW4gYXV0b1JlZnJlc2ggPSBSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkKLSAgICAgICAgICAgICAgICAuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5QUkVGX0FVVE9fUkVGUkVTSCk7Ci0gICAgICAgIGF1dG9SZWZyZXNoQnV0dG9uLnNldFNlbGVjdGlvbihhdXRvUmVmcmVzaCk7Ci0gICAgICAgIAotICAgICAgICBjbGVhclVzZXJTZXR0aW5ncyA9IHRydWU7Ci0KLQkJTGlzdCBlbmNvZGluZ3MgPSBXb3JrYmVuY2hFbmNvZGluZy5nZXREZWZpbmVkRW5jb2RpbmdzKCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoZW5jb2RpbmdzKTsKLSAgICAgICAgZW5jb2RpbmdFZGl0b3IubG9hZERlZmF1bHQoKTsKLQkJbGluZVNlcGFyYXRvckVkaXRvci5sb2FkRGVmYXVsdCgpOwotCi0gICAgICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB1c2VyIGhhcyBwcmVzc2VkIE9rLiBTdG9yZS9hcHBseSB0aGlzIHBhZ2UncyB2YWx1ZXMgYXBwcm9wcmlhdGVseS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gICAgICAgIC8vIHNldCB0aGUgd29ya3NwYWNlIGF1dG8tYnVpbGQgZmxhZwotICAgICAgICBJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKGF1dG9CdWlsZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAhPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLSAgICAgICAgICAgICAgICAuaXNBdXRvQnVpbGRpbmcoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcoYXV0b0J1aWxkQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmxvZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjaGFuZ2luZyBhdXRvIGJ1aWxkIHdvcmtzcGFjZSBzZXR0aW5nLiIsIGUvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0SURFUHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICAgICAgLy8gc3RvcmUgdGhlIHNhdmUgYWxsIHByaW9yIHRvIGJ1aWxkIHNldHRpbmcKLSAgICAgICAgc3RvcmUuc2V0VmFsdWUoSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5TQVZFX0FMTF9CRUZPUkVfQlVJTEQsCi0gICAgICAgICAgICAgICAgYXV0b1NhdmVBbGxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0gICAgICAgIC8vIHN0b3JlIHRoZSB3b3Jrc3BhY2Ugc2F2ZSBpbnRlcnZhbAotICAgICAgICAvLyBAaXNzdWUgd2Ugc2hvdWxkIGRyb3Agb3VyIHByZWZlcmVuY2UgY29uc3RhbnQgYW5kIGxldCBjbGllbnRzIHVzZQotICAgICAgICAvLyBjb3JlJ3MgcHJlZi4gb3VycyBpcyBub3QgdXAtdG8tZGF0ZSBhbnl3YXkgaWYgc29tZW9uZSBjaGFuZ2VzIHRoaXMKLSAgICAgICAgLy8gaW50ZXJ2YWwgZGlyZWN0bHkgdGhydSBjb3JlIGFwaS4KLSAgICAgICAgbG9uZyBvbGRTYXZlSW50ZXJ2YWwgPSBkZXNjcmlwdGlvbi5nZXRTbmFwc2hvdEludGVydmFsKCkgLyA2MDAwMDsKLSAgICAgICAgbG9uZyBuZXdTYXZlSW50ZXJ2YWwgPSBuZXcgTG9uZyhzYXZlSW50ZXJ2YWwuZ2V0U3RyaW5nVmFsdWUoKSkKLSAgICAgICAgICAgICAgICAubG9uZ1ZhbHVlKCk7Ci0gICAgICAgIGlmIChvbGRTYXZlSW50ZXJ2YWwgIT0gbmV3U2F2ZUludGVydmFsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnNldFNuYXBzaG90SW50ZXJ2YWwobmV3U2F2ZUludGVydmFsICogNjAwMDApOwotICAgICAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgc3RvcmUuZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBJREVJbnRlcm5hbFByZWZlcmVuY2VzLlNBVkVfSU5URVJWQUwsIG5ldyBJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBvbGRTYXZlSW50ZXJ2YWwpLCBuZXcgSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgbmV3U2F2ZUludGVydmFsKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4ubG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNoYW5naW5nIHNhdmUgaW50ZXJ2YWwgcHJlZmVyZW5jZSIsIGUgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKQotICAgICAgICAgICAgICAgIC5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0gICAgICAgIGJvb2xlYW4gYXV0b1JlZnJlc2ggPSBhdXRvUmVmcmVzaEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgcHJlZmVyZW5jZXMuc2V0VmFsdWUoUmVzb3VyY2VzUGx1Z2luLlBSRUZfQVVUT19SRUZSRVNILCBhdXRvUmVmcmVzaCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2xlYXJVc2VyU2V0dGluZ3MpCi0JCQlJREVFbmNvZGluZy5jbGVhclVzZXJFbmNvZGluZ3MoKTsKLSAgICAgICAgZW5jb2RpbmdFZGl0b3Iuc3RvcmUoKTsKLQkJbGluZVNlcGFyYXRvckVkaXRvci5zdG9yZSgpOwotICAgICAgICByZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvSUVsZW1lbnRGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9JRWxlbWVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODA5OGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9JRWxlbWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBUaGUgSUVsZW1lbnRGaWx0ZXIgaXMgYSBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIAotICogdGhlIGFwaSBmb3IgZmlsdGVyaW5nIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBvZiAKLSAqIGEgUmVzb3VyY2VUcmVlQW5kTGlzdEdyb3VwIGluIG9yZGVyIHRvIGZpbmQgYSAKLSAqIHN1YnNldCB0byB1cGRhdGUgYXMgdGhlIHJlc3VsdCBvZiBhIHR5cGUgZmlsdGVyaW5nLgotICogVGhpcyBpcyBtZWFudCBhcyBhbiBpbnRlcm5hbCBjbGFzcyBhbmQgaXMgdXNlZCBleGxjdXNpdmVseQotICogYnkgdGhlIGltcG9ydCBkaWFsb2cuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRWxlbWVudEZpbHRlciB7Ci0KLSAgICBwdWJsaWMgdm9pZCBmaWx0ZXJFbGVtZW50cyhDb2xsZWN0aW9uIGVsZW1lbnRzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgdm9pZCBmaWx0ZXJFbGVtZW50cyhPYmplY3RbXSBlbGVtZW50cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvSUZpbGVTdG9yZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0lGaWxlU3RvcmVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiNjMzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvSUZpbGVTdG9yZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLQotLyoqCi0gKiBJRmlsZVN0b3JlRmlsdGVyIGlzIGFuIGludGVyZmFjZSB0aGF0IGRlZmluZXMgYSBmaWx0ZXIgb24gZmlsZQotICogc3RvcmVzLgotICogQHNpbmNlIDMuMgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmlsZVN0b3JlRmlsdGVyIHsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhpcyBzdG9yZSBpcyBhY2NlcHRlZCBieSB0aGUgcmVjZWl2ZXIuCi0JICogQHBhcmFtIHN0b3JlIElGaWxlU3RvcmUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzdG9yZSBpcyBhY2NlcHRlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhY2NlcHQoSUZpbGVTdG9yZSBzdG9yZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9JbnN0YWxsQ2FwYWJpbGl0eVN0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9JbnN0YWxsQ2FwYWJpbGl0eVN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4MzEzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvSW5zdGFsbENhcGFiaWxpdHlTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQ2FwYWJpbGl0eUluc3RhbGxXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLnJlZ2lzdHJ5LkNhcGFiaWxpdHk7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGNhcGFiaWxpdHkgaW5zdGFsbCBzdGVwIGluIGEgbXVsdGktc3RlcAotICogd2l6YXJkLgotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbENhcGFiaWxpdHlTdGVwIGV4dGVuZHMgV2l6YXJkU3RlcCB7Ci0gICAgcHJpdmF0ZSBDYXBhYmlsaXR5IGNhcGFiaWxpdHk7Ci0KLSAgICBwcml2YXRlIElDYXBhYmlsaXR5SW5zdGFsbFdpemFyZCB3aXphcmQ7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0gICAgcHJpdmF0ZSBJUHJvamVjdFByb3ZpZGVyIHByb2plY3RQcm92aWRlcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGNhcGFiaWxpdHkgaW5zdGFsbCBzdGVwCi0gICAgICogCi0gICAgICogQHBhcmFtIG51bWJlciBzdGVwIG9yZGVyIG51bWJlcgotICAgICAqIEBwYXJhbSBjYXBhYmlsaXR5IHRoZSBjYXBhYmlsaXR5IHRvIGluc3RhbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5zdGFsbENhcGFiaWxpdHlTdGVwKGludCBudW1iZXIsIENhcGFiaWxpdHkgY2FwYWJpbGl0eSwKLSAgICAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoLCBJUHJvamVjdFByb3ZpZGVyIHByb2plY3RQcm92aWRlcikgewotICAgICAgICBzdXBlcihudW1iZXIpOwotICAgICAgICB0aGlzLmNhcGFiaWxpdHkgPSBjYXBhYmlsaXR5OwotICAgICAgICB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLSAgICAgICAgdGhpcy5wcm9qZWN0UHJvdmlkZXIgPSBwcm9qZWN0UHJvdmlkZXI7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXaXphcmRTdGVwLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5JbnN0YWxsQ2FwYWJpbGl0eVN0ZXBfbGFiZWwsIGNhcGFiaWxpdHkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpemFyZFN0ZXAuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXRhaWxzKCkgewotICAgICAgICByZXR1cm4gY2FwYWJpbGl0eS5nZXRJbnN0YWxsRGV0YWlscygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV2l6YXJkU3RlcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVdpemFyZCBnZXRXaXphcmQoKSB7Ci0gICAgICAgIGlmICh3aXphcmQgPT0gbnVsbCkgewotICAgICAgICAgICAgd2l6YXJkID0gY2FwYWJpbGl0eS5nZXRJbnN0YWxsV2l6YXJkKCk7Ci0gICAgICAgICAgICBpZiAod2l6YXJkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3aXphcmQuaW5pdCh3b3JrYmVuY2gsIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0UHJvdmlkZXIuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgICAgICB3aXphcmQuYWRkUGFnZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB3aXphcmQ7Ci0gICAgfQotCi0gICAgaW50ZXJmYWNlIElQcm9qZWN0UHJvdmlkZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcHJvamVjdCB0byB3aGljaCB0aGUgY2FwYWJpbGl0eQotICAgICAgICAgKiBpcyB0byBiZSBjb25maWd1cmVkIGFnYWluc3QuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9JbnRlcm5hbEVycm9yRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvSW50ZXJuYWxFcnJvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUxZjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9JbnRlcm5hbEVycm9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQWRkZWQgYSBEZXRhaWxzIGJ1dHRvbiB0byB0aGUgTWVzc2FnZURpYWxvZyB0byBzaG93IHRoZSBleGNlcHRpb24KLSAqIHN0YWNrIHRyYWNlLgotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxFcnJvckRpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCi0gICAgcHJpdmF0ZSBUaHJvd2FibGUgZGV0YWlsOwotCi0gICAgcHJpdmF0ZSBpbnQgZGV0YWlsQnV0dG9uSUQgPSAtMTsKLQotICAgIHByaXZhdGUgVGV4dCB0ZXh0OwotCi0gICAgLy9Xb3JrYXJvdW5kLiBTV1QgZG9lcyBub3Qgc2VlbSB0byBzZXQgdGhlIGRlZmF1bHQgYnV0dG9uIGlmIAotICAgIC8vdGhlcmUgaXMgbm90IGNvbnRyb2wgd2l0aCBmb2N1cy4gQnVnOiAxNDY2OAotICAgIHByaXZhdGUgaW50IGRlZmF1bHRCdXR0b25JbmRleCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTaXplIG9mIHRoZSB0ZXh0IGluIGxpbmVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX0xJTkVfQ09VTlQgPSAxNTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBkaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBwYXJlbnQgc2hlbGwKLSAgICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUgdGhlICB0aXRsZQotICAgICAqIEBwYXJhbSBkaWFsb2dUaXRsZUltYWdlIHRoZSB0aXRsZSBpbWFnZQotICAgICAqIEBwYXJhbSBkaWFsb2dNZXNzYWdlIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGRldGFpbCB0aGUgZXJyb3IgdG8gZGlzcGxheQotICAgICAqIEBwYXJhbSBkaWFsb2dJbWFnZVR5cGUgdGhlIHR5cGUgb2YgaW1hZ2UKLSAgICAgKiBAcGFyYW0gZGlhbG9nQnV0dG9uTGFiZWxzIHRoZSBidXR0b24gbGFiZWxzCi0gICAgICogQHBhcmFtIGRlZmF1bHRJbmRleCB0aGUgZGVmYXVsdCBzZWxlY3RlZCBidXR0b24gaW5kZXgKLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZXJuYWxFcnJvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgICAgICAgICAgSW1hZ2UgZGlhbG9nVGl0bGVJbWFnZSwgU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIFRocm93YWJsZSBkZXRhaWwsCi0gICAgICAgICAgICBpbnQgZGlhbG9nSW1hZ2VUeXBlLCBTdHJpbmdbXSBkaWFsb2dCdXR0b25MYWJlbHMsIGludCBkZWZhdWx0SW5kZXgpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dUaXRsZUltYWdlLCBkaWFsb2dNZXNzYWdlLAotICAgICAgICAgICAgICAgIGRpYWxvZ0ltYWdlVHlwZSwgZGlhbG9nQnV0dG9uTGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotICAgICAgICBkZWZhdWx0QnV0dG9uSW5kZXggPSBkZWZhdWx0SW5kZXg7Ci0gICAgICAgIHRoaXMuZGV0YWlsID0gZGV0YWlsOwotICAgICAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0gICAgfQotCi0gICAgLy9Xb3JrYXJvdW5kLiBTV1QgZG9lcyBub3Qgc2VlbSB0byBzZXQgcmlndGggdGhlIGRlZmF1bHQgYnV0dG9uIGlmIAotICAgIC8vdGhlcmUgaXMgbm90IGNvbnRyb2wgd2l0aCBmb2N1cy4gQnVnOiAxNDY2OAotICAgIHB1YmxpYyBpbnQgb3BlbigpIHsKLSAgICAgICAgY3JlYXRlKCk7Ci0gICAgICAgIEJ1dHRvbiBiID0gZ2V0QnV0dG9uKGRlZmF1bHRCdXR0b25JbmRleCk7Ci0gICAgICAgIGIuc2V0Rm9jdXMoKTsKLSAgICAgICAgYi5nZXRTaGVsbCgpLnNldERlZmF1bHRCdXR0b24oYik7Ci0gICAgICAgIHJldHVybiBzdXBlci5vcGVuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZXRhaWwgYnV0dG9uOwotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgZGV0YWlsIGJ1dHRvbiBpbmRleAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERldGFpbEJ1dHRvbihpbnQgaW5kZXgpIHsKLSAgICAgICAgZGV0YWlsQnV0dG9uSUQgPSBpbmRleDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotICAgICAgICBpZiAoYnV0dG9uSWQgPT0gZGV0YWlsQnV0dG9uSUQpIHsKLSAgICAgICAgICAgIHRvZ2dsZURldGFpbHNBcmVhKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRSZXR1cm5Db2RlKGJ1dHRvbklkKTsKLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5Ci0gICAgICogdGhlIHVzZXIgcHJlc3NpbmcgdGhlIGRldGFpbHMgYnV0dG9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0b2dnbGVEZXRhaWxzQXJlYSgpIHsKLSAgICAgICAgUG9pbnQgd2luZG93U2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotICAgICAgICBQb2ludCBvbGRTaXplID0gZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRleHQuZGlzcG9zZSgpOwotICAgICAgICAgICAgdGV4dCA9IG51bGw7Ci0gICAgICAgICAgICBnZXRCdXR0b24oZGV0YWlsQnV0dG9uSUQpLnNldFRleHQoCi0gICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNyZWF0ZURyb3BEb3duVGV4dCgoQ29tcG9zaXRlKSBnZXRDb250ZW50cygpKTsKLSAgICAgICAgICAgIGdldEJ1dHRvbihkZXRhaWxCdXR0b25JRCkuc2V0VGV4dCgKLSAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ISURFX0RFVEFJTFNfTEFCRUwpOwotICAgICAgICB9Ci0KLSAgICAgICAgUG9pbnQgbmV3U2l6ZSA9IGdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgZ2V0U2hlbGwoKQotICAgICAgICAgICAgICAgIC5zZXRTaXplKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBvaW50KHdpbmRvd1NpemUueCwgd2luZG93U2l6ZS55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKG5ld1NpemUueSAtIG9sZFNpemUueSkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhpcyBkaWFsb2cncyBkcm9wLWRvd24gbGlzdCBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRHJvcERvd25UZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gY3JlYXRlIHRoZSBsaXN0Ci0gICAgICAgIHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICB0ZXh0LnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgLy8gcHJpbnQgdGhlIHN0YWNrdHJhY2UgaW4gdGhlIHRleHQgZmllbGQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0oYmFvcyk7Ci0gICAgICAgICAgICBkZXRhaWwucHJpbnRTdGFja1RyYWNlKHBzKTsKLSAgICAgICAgICAgIHBzLmZsdXNoKCk7Ci0gICAgICAgICAgICBiYW9zLmZsdXNoKCk7Ci0gICAgICAgICAgICB0ZXh0LnNldFRleHQoYmFvcy50b1N0cmluZygpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIFRFWFRfTElORV9DT1VOVDsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzaW1wbGUgWWVzL05vIHF1ZXN0aW9uIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHBhcmFtIHRpdGxlIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGRldGFpbCB0aGUgZXJyb3IgCi0gICAgICogQHBhcmFtIGRlZmF1bHRJbmRleCB0aGUgZGVmYXVsdCBpbmRleCBvZiB0aGUgYnV0dG9uIHRvIHNlbGVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgT0sgYnV0dG9uLAotICAgICAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlblF1ZXN0aW9uKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLAotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBkZXRhaWwsIGludCBkZWZhdWx0SW5kZXgpIHsKLSAgICAgICAgU3RyaW5nW10gbGFiZWxzOwotICAgICAgICBpZiAoZGV0YWlsID09IG51bGwpCi0gICAgICAgICAgICBsYWJlbHMgPSBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCB9OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsYWJlbHMgPSBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwgfTsKLQotICAgICAgICBJbnRlcm5hbEVycm9yRGlhbG9nIGRpYWxvZyA9IG5ldyBJbnRlcm5hbEVycm9yRGlhbG9nKHBhcmVudCwgdGl0bGUsCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0IHdpbmRvdyBpY29uCi0gICAgICAgICAgICAgICAgbWVzc2FnZSwgZGV0YWlsLCBRVUVTVElPTiwgbGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotICAgICAgICBpZiAoZGV0YWlsICE9IG51bGwpCi0gICAgICAgICAgICBkaWFsb2cuc2V0RGV0YWlsQnV0dG9uKDIpOwotICAgICAgICByZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL0xpbmtlZFJlc291cmNlc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvTGlua2VkUmVzb3VyY2VzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5ZWZjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvTGlua2VkUmVzb3VyY2VzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBsaW5rZWQgcmVzb3VyY2VzLiAKLSAqIFRoaXMgcHJlZmVyZW5jZSBwYWdlIGFsbG93cyBlbmFibGluZyBhbmQgZGlzYWJsaW5nIHRoZSB3b3JrYmVuY2ggbGlua2VkIAotICogcmVzb3VyY2Ugc3VwcG9ydC4KLSAqIEl0IGFsc28gc2hvd3MgYWxsIHBhdGggdmFyaWFibGVzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoZSB3b3Jrc3BhY2UncyBwYXRoIAotICogdmFyaWFibGUgbWFuYWdlci4gVGhlIHVzZXIgbWF5IGFkZCwgZWRpdCBhbmQgcmVtb3ZlIHBhdGggdmFyaWFibGVzLiAKLSAqICAKLSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuUGF0aFZhcmlhYmxlRGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rZWRSZXNvdXJjZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLSAgICAgICAgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLSAgICBwcml2YXRlIExhYmVsIHRvcExhYmVsOwotCi0gICAgcHJpdmF0ZSBQYXRoVmFyaWFibGVzR3JvdXAgcGF0aFZhcmlhYmxlc0dyb3VwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIHByZWZlcmVuY2UgcGFnZSBvZiBwYXRoIHZhcmlhYmxlcy4KLSAgICAgKiBPbWl0cyAiUmVzdG9yZSBEZWZhdWx0cyIvIkFwcGx5IENoYW5nZXMiIGJ1dHRvbnMuCi0gICAgICovCi0gICAgcHVibGljIExpbmtlZFJlc291cmNlc1ByZWZlcmVuY2VQYWdlKCkgewotICAgICAgICBwYXRoVmFyaWFibGVzR3JvdXAgPSBuZXcgUGF0aFZhcmlhYmxlc0dyb3VwKHRydWUsIElSZXNvdXJjZS5GSUxFCi0gICAgICAgICAgICAgICAgfCBJUmVzb3VyY2UuRk9MREVSKTsKLQotICAgICAgICB0aGlzLm5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoaXMgcGFnZSdzIGludGVybmFsIHN0YXRlIGFuZCBjcmVhdGVzIGl0cyBVSSBjb250ZW50cy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0KLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLkxJTktFRF9SRVNPVVJDRV9QUkVGRVJFTkNFX1BBR0UpOwotICAgICAgICAvLyBkZWZpbmUgY29udGFpbmVyICYgaXRzIGdyaWRkaW5nCi0gICAgICAgIENvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgcGFnZUNvbXBvbmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgcGFnZUNvbXBvbmVudC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBwYWdlQ29tcG9uZW50LnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgZmluYWwgQnV0dG9uIGVuYWJsZUxpbmtlZFJlc291cmNlc0J1dHRvbiA9IG5ldyBCdXR0b24ocGFnZUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBTV1QuQ0hFQ0spOwotICAgICAgICBlbmFibGVMaW5rZWRSZXNvdXJjZXNCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5MaW5rZWRSZXNvdXJjZXNQcmVmZXJlbmNlX2VuYWJsZUxpbmtlZFJlc291cmNlcyk7Ci0gICAgICAgIGVuYWJsZUxpbmtlZFJlc291cmNlc0J1dHRvbi5zZXRGb250KGZvbnQpOwotICAgICAgICBlbmFibGVMaW5rZWRSZXNvdXJjZXNCdXR0b24KLSAgICAgICAgICAgICAgICAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IGVuYWJsZUxpbmtlZFJlc291cmNlc0J1dHRvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VzLnNldFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uUFJFRl9ESVNBQkxFX0xJTktJTkcsICFlbmFibGVkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlV2lkZ2V0U3RhdGUoZW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuV2FybmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuTGlua2VkUmVzb3VyY2VzUHJlZmVyZW5jZV9saW5rZWRSZXNvdXJjZXNXYXJuaW5nVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLkxpbmtlZFJlc291cmNlc1ByZWZlcmVuY2VfbGlua2VkUmVzb3VyY2VzV2FybmluZ01lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgY3JlYXRlU3BhY2UocGFnZUNvbXBvbmVudCk7Ci0KLSAgICAgICAgdG9wTGFiZWwgPSBuZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpOwotICAgICAgICB0b3BMYWJlbC5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLkxpbmtlZFJlc291cmNlc1ByZWZlcmVuY2VfZXhwbGFuYXRpb24pOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICB0b3BMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICB0b3BMYWJlbC5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIHBhdGhWYXJpYWJsZXNHcm91cC5jcmVhdGVDb250ZW50cyhwYWdlQ29tcG9uZW50KTsKLQotICAgICAgICBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKQotICAgICAgICAgICAgICAgIC5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotICAgICAgICBib29sZWFuIGVuYWJsZUxpbmtpbmcgPSAhcHJlZmVyZW5jZXMKLSAgICAgICAgICAgICAgICAuZ2V0Qm9vbGVhbihSZXNvdXJjZXNQbHVnaW4uUFJFRl9ESVNBQkxFX0xJTktJTkcpOwotICAgICAgICBlbmFibGVMaW5rZWRSZXNvdXJjZXNCdXR0b24uc2V0U2VsZWN0aW9uKGVuYWJsZUxpbmtpbmcpOwotICAgICAgICB1cGRhdGVXaWRnZXRTdGF0ZShlbmFibGVMaW5raW5nKTsKLSAgICAgICAgcmV0dXJuIHBhZ2VDb21wb25lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHRhYiBvZiBvbmUgaG9yaXpvbnRhbCBzcGFucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgaW4gd2hpY2ggdGhlIHRhYiBzaG91bGQgYmUgY3JlYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBjcmVhdGVTcGFjZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHZmaWxsZXIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0gICAgICAgIHZmaWxsZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcG9zZXMgdGhlIHBhdGggdmFyaWFibGVzIGdyb3VwLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBwYXRoVmFyaWFibGVzR3JvdXAuZGlzcG9zZSgpOwotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW1wdHkgaW1wbGVtZW50YXRpb24uIFRoaXMgcGFnZSBkb2VzIG5vdCB1c2UgdGhlIHdvcmtiZW5jaC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbW1pdHMgdGhlIHRlbXBvcmFyeSBzdGF0ZSB0byB0aGUgcGF0aCB2YXJpYWJsZSBtYW5hZ2VyIGluIHJlc3BvbnNlIHRvIHVzZXIKLSAgICAgKiBjb25maXJtYXRpb24uCi0gICAgICogCi0gICAgICogQHNlZSBQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotICAgICAqIEBzZWUgUGF0aFZhcmlhYmxlc0dyb3VwI3BlcmZvcm1PaygpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAgICAgICByZXR1cm4gcGF0aFZhcmlhYmxlc0dyb3VwLnBlcmZvcm1PaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgd2lkZ2V0IGVuYWJsZWQgc3RhdGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW5hYmxlTGlua2luZyB0aGUgbmV3IHdpZGdldCBlbmFibGVkIHN0YXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0U3RhdGUoYm9vbGVhbiBlbmFibGVMaW5raW5nKSB7Ci0gICAgICAgIHRvcExhYmVsLnNldEVuYWJsZWQoZW5hYmxlTGlua2luZyk7Ci0gICAgICAgIHBhdGhWYXJpYWJsZXNHcm91cC5zZXRFbmFibGVkKGVuYWJsZUxpbmtpbmcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9NdWx0aVN0ZXBDYXBhYmlsaXR5V2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvTXVsdGlTdGVwQ2FwYWJpbGl0eVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA5YzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9NdWx0aVN0ZXBDYXBhYmlsaXR5V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5JbnN0YWxsQ2FwYWJpbGl0eVN0ZXAuSVByb2plY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlLkJhc2ljTmV3UmVzb3VyY2VXaXphcmQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNdWx0aVN0ZXBDYXBhYmlsaXR5V2l6YXJkIGV4dGVuZHMgTXVsdGlTdGVwV2l6YXJkCi0gICAgICAgIGltcGxlbWVudHMgSVByb2plY3RQcm92aWRlciB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbXB0eSB3aXphcmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTXVsdGlTdGVwQ2FwYWJpbGl0eVdpemFyZCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJRHMgb2YgdGhlIHBlcnNwZWN0aXZlcyB0byBwcmVzZW50Ci0gICAgICogYXMgY2hvaWNlcyB0byB0aGUgdXNlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nW10gZ2V0UGVyc3BlY3RpdmVDaG9pY2VzKCk7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgaWYgKCFzdXBlci5wZXJmb3JtRmluaXNoKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8gQWxsb3cgdGhlIHVzZXIgdG8gY2hvb3NlIHdoaWNoIHBlcnNwZWN0aXZlIHRvCi0gICAgICAgIC8vIHN3aXRjaCB0by4KLSAgICAgICAgaWYgKGlzQ29uZmlndXJlU3RlcE1vZGUoKSkgewotICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBlcnNwSWRzID0gZ2V0UGVyc3BlY3RpdmVDaG9pY2VzKCk7Ci0gICAgICAgICAgICBpZiAocGVyc3BJZHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIFByb2plY3RQZXJzcGVjdGl2ZUNob2ljZURpYWxvZyBkaWFsb2c7Ci0gICAgICAgICAgICAgICAgZGlhbG9nID0gbmV3IFByb2plY3RQZXJzcGVjdGl2ZUNob2ljZURpYWxvZyh3aW5kb3csIHBlcnNwSWRzKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgIGlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykKLSAgICAgICAgICAgICAgICAgICAgd2luZG93ID0gZGlhbG9nLnNob3dDaG9zZW5QZXJzcGVjdGl2ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEJhc2ljTmV3UmVzb3VyY2VXaXphcmQuc2VsZWN0QW5kUmV2ZWFsKHByb2plY3QsIHdpbmRvdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvTXVsdGlTdGVwQ29uZmlndXJlV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL011bHRpU3RlcENvbmZpZ3VyZVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4MDVjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvTXVsdGlTdGVwQ29uZmlndXJlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotICogICBTZWJhc3RpYW4gRGF2aWRzIDxzZGF2aWRzQGdteC5kZT4gLSBGaXggZm9yIGJ1ZyAxOTM0NiAtIERpYWxvZyBmb250IHNob3VsZCBiZQotICogICAgICBhY3RpdmF0ZWQgYW5kIHVzZWQgYnkgb3RoZXIgY29tcG9uZW50cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1pc2MuV2l6YXJkU3RlcEdyb3VwOwotCi0vKioKLSAqIFRoaXMgcGFnZSBhbGxvd3MgdGhlIHVzZXIgdG8gZ28gdGhydSBhIHNlcmllcyBvZiBzdGVwcy4gRWFjaAotICogc3RlcCB0aGF0IGhhcyBhIHdpemFyZCB3aWxsIGhhdmUgaXRzIHBhZ2VzIGVtYmVkZGVkIGludG8gdGhpcwotICogcGFnZS4gQXQgdGhlIGVuZCwgdGhlIHN0ZXAgd2lsbCBiZSBhc2tlZCB0byBjb21wbGV0ZSBpdHMgd29yay4KLSAqIDxwPgotICogRXhhbXBsZSB1c2FnZToKLSAqIDxwcmU+Ci0gKiBtYWluUGFnZSA9IG5ldyBNdWx0aVN0ZXBDb25maWd1cmVXaXphcmRQYWdlKCJtdWx0aVN0ZXBXaXphcmRQYWdlIik7Ci0gKiBtYWluUGFnZS5zZXRUaXRsZSgiUHJvamVjdCIpOwotICogbWFpblBhZ2Uuc2V0RGVzY3JpcHRpb24oIkNvbmZpZ3VyZSBwcm9qZWN0IGNhcGFiaWxpdHkuIik7Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE11bHRpU3RlcENvbmZpZ3VyZVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLSAgICBwcml2YXRlIE11bHRpU3RlcFdpemFyZERpYWxvZyB3aXphcmREaWFsb2c7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBwYWdlU2l0ZTsKLQotICAgIHByaXZhdGUgV2l6YXJkU3RlcEdyb3VwIHN0ZXBHcm91cDsKLQotICAgIHByaXZhdGUgV2l6YXJkU3RlcENvbnRhaW5lciBzdGVwQ29udGFpbmVyID0gbmV3IFdpemFyZFN0ZXBDb250YWluZXIoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgbXVsdGktc3RlcCB3aXphcmQgcGFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGlzIHBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlTdGVwQ29uZmlndXJlV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0ZXBDb250YWluZXIuY2FuRmxpcFRvTmV4dFBhZ2UoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwKLSAgICAgICAgICAgICAgICBJSURFSGVscENvbnRleHRJZHMuTkVXX1BST0pFQ1RfQ09ORklHVVJFX1dJWkFSRF9QQUdFKTsKLQotICAgICAgICBjcmVhdGVTdGVwR3JvdXAoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlRW1iZWRkZWRQYWdlU2l0ZShjb21wb3NpdGUpOwotCi0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250cm9sIHdoZXJlIHRoZSBzdGVwJ3Mgd2l6YXJkIHdpbGwKLSAgICAgKiBkaXNwbGF5IGl0cyBwYWdlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkZWRQYWdlU2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHBhZ2VTaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgcGFnZVNpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBwYWdlU2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250cm9sIGZvciB0aGUgc3RlcCBsaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVN0ZXBHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN0ZXBHcm91cCA9IG5ldyBXaXphcmRTdGVwR3JvdXAoKTsKLSAgICAgICAgc3RlcEdyb3VwLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGFpbmVyIGhhbmRsZXIgZm9yIHRoZSBwYWdlcwotICAgICAqIG9mIHRoZSBzdGVwJ3Mgd2l6YXJkLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi9XaXphcmRTdGVwQ29udGFpbmVyIGdldFN0ZXBDb250YWluZXIoKSB7Ci0gICAgICAgIHJldHVybiBzdGVwQ29udGFpbmVyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgICAgICBTdHJpbmcgbXNnID0gc3RlcENvbnRhaW5lci5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChtc2cgPT0gbnVsbCB8fCBtc2cubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIG1zZyA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmRQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBzdGVwQ29udGFpbmVyLmdldFByZXZpb3VzUGFnZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgLy8gRG8gbm90IGFsbG93IHRvIGdvIGJhY2sKLSAgICAgICAgc3VwZXIuc2V0UHJldmlvdXNQYWdlKG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN0ZXBzIHRvIGJlIGRpc3BsYXllZC4gSWdub3JlZCBpZiB0aGUKLSAgICAgKiBjcmVhdGVDb250cm9sIGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdGVwcyB0aGUgY29sbGVjdGlvbiBvZiBzdGVwcwotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi92b2lkIHNldFN0ZXBzKFdpemFyZFN0ZXBbXSBzdGVwcykgewotICAgICAgICBpZiAoc3RlcEdyb3VwICE9IG51bGwpCi0gICAgICAgICAgICBzdGVwR3JvdXAuc2V0U3RlcHMoc3RlcHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG11bHRpLXN0ZXAgd2l6YXJkIGRpYWxvZyBwcm9jZXNzaW5nIHRoaXMKLSAgICAgKiBwYWdlLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi92b2lkIHNldFdpemFyZERpYWxvZyhNdWx0aVN0ZXBXaXphcmREaWFsb2cgZGlhbG9nKSB7Ci0gICAgICAgIHdpemFyZERpYWxvZyA9IGRpYWxvZzsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgIFdpemFyZFN0ZXBbXSBzdGVwcyA9IHN0ZXBHcm91cC5nZXRTdGVwcygpOwotICAgICAgICBNdWx0aVN0ZXBXaXphcmQgc3RlcFdpemFyZCA9IHdpemFyZERpYWxvZy5nZXRNdWx0aVN0ZXBXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkRGlhbG9nLnNldEZpbmlzaExhYmVsKHN0ZXBXaXphcmQuZ2V0RmluaXNoU3RlcExhYmVsKHN0ZXBzKSk7Ci0KLSAgICAgICAgZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIHN0ZXBDb250YWluZXIucHJvY2Vzc0N1cnJlbnRTdGVwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN1cHBvcnQgZm9yIGhhbmRsaW5nIHBhZ2VzIGZyb20gdGhlIHN0ZXAncyB3aXphcmQKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovY2xhc3MgV2l6YXJkU3RlcENvbnRhaW5lciBpbXBsZW1lbnRzIElXaXphcmRDb250YWluZXIgewotICAgICAgICBwcml2YXRlIGludCBzdGVwSW5kZXggPSAwOwotCi0gICAgICAgIHByaXZhdGUgSVdpemFyZCB3aXphcmQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBJV2l6YXJkUGFnZSBjdXJyZW50UGFnZTsKLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUnVubmFibGVDb250ZXh0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLAotICAgICAgICAgICAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKGZvcmssIGNhbmNlbGFibGUsIHJ1bm5hYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmRDb250YWluZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0Q3VycmVudFBhZ2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3VycmVudFBhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkQ29udGFpbmVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lcigpLmdldFNoZWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkQ29udGFpbmVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2hvd1BhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotICAgICAgICAgICAgc2hvd1BhZ2UocGFnZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkQ29udGFpbmVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLSAgICAgICAgICAgIGdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmRDb250YWluZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVNZXNzYWdlKCkgewotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkudXBkYXRlTWVzc2FnZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZENvbnRhaW5lci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVRpdGxlQmFyKCkgewotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkudXBkYXRlVGl0bGVCYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmRDb250YWluZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVXaW5kb3dUaXRsZSgpIHsKLSAgICAgICAgICAgIGdldENvbnRhaW5lcigpLnVwZGF0ZVdpbmRvd1RpdGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSGFuZGxlcyB0aGUgYmFjayBidXR0b24gcHJlc3NlZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYmFja1ByZXNzZWQoKSB7Ci0gICAgICAgICAgICBzaG93UGFnZShjdXJyZW50UGFnZS5nZXRQcmV2aW91c1BhZ2UoKSwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEhhbmRsZXMgdGhlIG5leHQgYnV0dG9uIHByZXNzZWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG5leHRQcmVzc2VkKCkgewotICAgICAgICAgICAgc2hvd1BhZ2UoY3VycmVudFBhZ2UuZ2V0TmV4dFBhZ2UoKSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSGFuZGxlcyB0aGUgaGVscCBidXR0b24gcHJlc3NlZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgaGVscFByZXNzZWQoKSB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudFBhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjdXJyZW50UGFnZS5wZXJmb3JtSGVscCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEhhbmRsZXMgY2xvc2UgcmVxdWVzdC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLSAgICAgICAgICAgIGlmICh3aXphcmQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gd2l6YXJkLnBlcmZvcm1DYW5jZWwoKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSGFuZGxlcyBmaW5pc2ggcmVxdWVzdC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgICAgIGlmICh3aXphcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh3aXphcmQucGVyZm9ybUZpbmlzaCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdpemFyZC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdpemFyZC5zZXRDb250YWluZXIobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0ZXBHcm91cC5tYXJrU3RlcEFzRG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBzdGVwSW5kZXgrKzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsY3VsYXRlcyB0aGUgZGlmZmVyZW5jZSBpbiBzaXplIGJldHdlZW4gdGhlIGdpdmVuCi0gICAgICAgICAqIHBhZ2UgYW5kIHRoZSBwYWdlIHNpdGUuIEEgbGFyZ2VyIHBhZ2UgcmVzdWx0cyAKLSAgICAgICAgICogaW4gYSBwb3NpdGl2ZSBkZWx0YS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBhZ2UgdGhlIHBhZ2UKLSAgICAgICAgICogQHJldHVybiB0aGUgc2l6ZSBkaWZmZXJlbmNlIGVuY29kZWQKLSAgICAgICAgICogICBhcyBhIDxjb2RlPm5ldyBQb2ludChkZWx0YVdpZHRoLGRlbHRhSGVpZ2h0KTwvY29kZT4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgUG9pbnQgY2FsY3VsYXRlUGFnZVNpemVEZWx0YShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgICAgICBDb250cm9sIHBhZ2VDb250cm9sID0gcGFnZS5nZXRDb250cm9sKCk7Ci0KLSAgICAgICAgICAgIGlmIChwYWdlQ29udHJvbCA9PSBudWxsKQotICAgICAgICAgICAgICAgIC8vIGNvbnRyb2wgbm90IGNyZWF0ZWQgeWV0Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCgwLCAwKTsKLQotICAgICAgICAgICAgUG9pbnQgY29udGVudFNpemUgPSBwYWdlQ29udHJvbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgU1dULkRFRkFVTFQsIHRydWUpOwotICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBwYWdlU2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICBQb2ludCBjb250YWluZXJTaXplID0gbmV3IFBvaW50KHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChNYXRoLm1heCgwLCBjb250ZW50U2l6ZS54IC0gY29udGFpbmVyU2l6ZS54KSwgTWF0aAotICAgICAgICAgICAgICAgICAgICAubWF4KDAsIGNvbnRlbnRTaXplLnkgLSBjb250YWluZXJTaXplLnkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wdXRlcyB0aGUgY29ycmVjdCBwYWdlIHNpdGUgc2l6ZSBmb3IgdGhlIGdpdmVuIHBhZ2UKLSAgICAgICAgICogYW5kIHJlc2l6ZXMgdGhlIGRpYWxvZyBpZiBuZXNzZXNzYXJ5LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcGFnZSB0aGUgd2l6YXJkIHBhZ2UKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTaXplRm9yUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgICAgICAvLyBlbnN1cmUgdGhlIHBhZ2UgY29udGFpbmVyIGlzIGxhcmdlIGVub3VnaAotICAgICAgICAgICAgUG9pbnQgZGVsdGEgPSBjYWxjdWxhdGVQYWdlU2l6ZURlbHRhKHBhZ2UpOwotCi0gICAgICAgICAgICBpZiAoZGVsdGEueCA+IDAgfHwgZGVsdGEueSA+IDApIHsKLSAgICAgICAgICAgICAgICBQb2ludCBzaXRlU2l6ZSA9IHBhZ2VTaXRlLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKSBwYWdlU2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgZGF0YS5oZWlnaHRIaW50ID0gc2l0ZVNpemUueSArIGRlbHRhLnk7Ci0gICAgICAgICAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBzaXRlU2l6ZS54ICsgZGVsdGEueDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wdXRlcyB0aGUgY29ycmVjdCBwYWdlIHNpdGUgc2l6ZSBmb3IgdGhlIGdpdmVuIHdpemFyZAotICAgICAgICAgKiBhbmQgcmVzaXplcyB0aGUgZGlhbG9nIGlmIG5lc3Nlc3NhcnkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB3aXphcmQgdGhlIHdpemFyZAotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNpemVGb3JXaXphcmQoSVdpemFyZCB3aXphcmQpIHsKLSAgICAgICAgICAgIFBvaW50IGRlbHRhID0gbmV3IFBvaW50KDAsIDApOwotICAgICAgICAgICAgSVdpemFyZFBhZ2VbXSBwYWdlcyA9IHdpemFyZC5nZXRQYWdlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGUgcGFnZSBzaXRlIGlzIGxhcmdlIGVub3VnaAotICAgICAgICAgICAgICAgIFBvaW50IHBhZ2VEZWx0YSA9IGNhbGN1bGF0ZVBhZ2VTaXplRGVsdGEocGFnZXNbaV0pOwotCi0gICAgICAgICAgICAgICAgZGVsdGEueCA9IE1hdGgubWF4KGRlbHRhLngsIHBhZ2VEZWx0YS54KTsKLSAgICAgICAgICAgICAgICBkZWx0YS55ID0gTWF0aC5tYXgoZGVsdGEueSwgcGFnZURlbHRhLnkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZGVsdGEueCA+IDAgfHwgZGVsdGEueSA+IDApIHsKLSAgICAgICAgICAgICAgICBQb2ludCBzaXRlU2l6ZSA9IHBhZ2VTaXRlLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKSBwYWdlU2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgZGF0YS5oZWlnaHRIaW50ID0gc2l0ZVNpemUueSArIGRlbHRhLnk7Ci0gICAgICAgICAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBzaXRlU2l6ZS54ICsgZGVsdGEueDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcm9jZXNzIHRoZSBjdXJyZW50IHN0ZXAncyB3aXphcmQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ3VycmVudFN0ZXAoKSB7Ci0gICAgICAgICAgICBXaXphcmRTdGVwW10gc3RlcHMgPSBzdGVwR3JvdXAuZ2V0U3RlcHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChzdGVwSW5kZXggPCBzdGVwcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGZpbmlzaCBidXR0b24gbGFiZWwKLSAgICAgICAgICAgICAgICBpZiAoc3RlcEluZGV4ID09IChzdGVwcy5sZW5ndGggLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgd2l6YXJkRGlhbG9nLnNldEZpbmlzaExhYmVsKG51bGwpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgV2l6YXJkU3RlcCBzdGVwID0gc3RlcHNbc3RlcEluZGV4XTsKLSAgICAgICAgICAgICAgICBzdGVwR3JvdXAuc2V0Q3VycmVudFN0ZXAoc3RlcCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBJV2l6YXJkW10gc3RlcFdpemFyZCA9IG5ldyBJV2l6YXJkWzFdOwotICAgICAgICAgICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFdpemFyZFswXSA9IHN0ZXAuZ2V0V2l6YXJkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmllcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGVwV2l6YXJkWzBdID09IG51bGwgJiYgdHJpZXMrKyA8IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdHJ5QWdhaW4gPSB3aXphcmREaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE11bHRpU3RlcFdpemFyZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGVNaXNzaW5nU3RlcFdpemFyZChzdGVwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJ5QWdhaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBXaXphcmRbMF0gPSBzdGVwLmdldFdpemFyZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RlcFdpemFyZFswXSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBzZXRXaXphcmQoc3RlcFdpemFyZFswXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0ZXBXaXphcmRbMF0uZ2V0UGFnZUNvdW50KCkgPiAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBwZXJmb3JtRmluaXNoKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdpemFyZERpYWxvZy5mb3JjZUNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgY3VycmVudCB3aXphcmQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbmV3V2l6YXJkIHRoZSBjdXJyZW50IHdpemFyZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0V2l6YXJkKElXaXphcmQgbmV3V2l6YXJkKSB7Ci0gICAgICAgICAgICB3aXphcmQgPSBuZXdXaXphcmQ7Ci0KLSAgICAgICAgICAgIC8vIEFsbG93IHRoZSB3aXphcmQgcGFnZXMgdG8gcHJlY3JlYXRlIHRoZWlyIHBhZ2UgY29udHJvbHMKLSAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB3aXphcmQgdG8gb3BlbiB0byB0aGUgY29ycmVjdCBzaXplCi0gICAgICAgICAgICB3aXphcmQuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VTaXRlKTsKLQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBjcmVhdGVkIHBhZ2VzIGFyZSBpbml0aWFsbHkgbm90IHZpc2libGUKLSAgICAgICAgICAgIElXaXphcmRQYWdlW10gcGFnZXMgPSB3aXphcmQuZ2V0UGFnZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJV2l6YXJkUGFnZSBwYWdlID0gcGFnZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2UuZ2V0Q29udHJvbCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHBhZ2UuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGRpYWxvZyBpcyBsYXJnZSBlbm91Z2ggZm9yIHRoZSB3aXphcmQKLSAgICAgICAgICAgIHVwZGF0ZVNpemVGb3JXaXphcmQod2l6YXJkKTsKLSAgICAgICAgICAgIHdpemFyZERpYWxvZy51cGRhdGVMYXlvdXQoKTsKLQotICAgICAgICAgICAgd2l6YXJkLnNldENvbnRhaW5lcih0aGlzKTsKLSAgICAgICAgICAgIHNob3dQYWdlKHdpemFyZC5nZXRTdGFydGluZ1BhZ2UoKSwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNob3cgdGhlIHJlcXVlc3RlZCBwYWdlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHBhZ2UgdGhlIHBhZ2UKLSAgICAgICAgICogQHBhcmFtIHJlbWVtYmVyUHJldmlvdXMgd2hldGhlciBodGUgcHJldmlvdXMgcGFnZSBzaG91bGQgYmUgcmVtZW1iZXJlZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2hvd1BhZ2UoSVdpemFyZFBhZ2UgcGFnZSwgYm9vbGVhbiByZW1lbWJlclByZXZpb3VzKSB7Ci0gICAgICAgICAgICBpZiAocGFnZSA9PSBudWxsIHx8IHBhZ2UgPT0gY3VycmVudFBhZ2UpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAocmVtZW1iZXJQcmV2aW91cyAmJiBjdXJyZW50UGFnZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHBhZ2Uuc2V0UHJldmlvdXNQYWdlKGN1cnJlbnRQYWdlKTsKLQotICAgICAgICAgICAgaWYgKHdpemFyZCAhPSBwYWdlLmdldFdpemFyZCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCBwYWdlIGNvbnRyb2wgaGFzIGJlZW4gY3JlYXRlZAotICAgICAgICAgICAgLy8gKHRoaXMgYWxsb3dzIGxhenkgcGFnZSBjb250cm9sIGNyZWF0aW9uKQotICAgICAgICAgICAgaWYgKHBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYWdlLmNyZWF0ZUNvbnRyb2wocGFnZVNpdGUpOwotICAgICAgICAgICAgICAgIC8vIHRoZSBwYWdlIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGUgY3JlYXRlZCBjb250cm9sIGlzIGFjY2Vzc2FibGUKLSAgICAgICAgICAgICAgICAvLyB2aWEgZ2V0Q29udHJvbC4KLSAgICAgICAgICAgICAgICBpZiAocGFnZS5nZXRDb250cm9sKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGUgZGlhbG9nIGlzIGxhcmdlIGVub3VnaCBmb3IgdGhpcyBwYWdlCi0gICAgICAgICAgICAgICAgdXBkYXRlU2l6ZUZvclBhZ2UocGFnZSk7Ci0gICAgICAgICAgICAgICAgd2l6YXJkRGlhbG9nLnVwZGF0ZUxheW91dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBtYWtlIHRoZSBuZXcgcGFnZSB2aXNpYmxlCi0gICAgICAgICAgICBJV2l6YXJkUGFnZSBvbGRQYWdlID0gY3VycmVudFBhZ2U7Ci0gICAgICAgICAgICBjdXJyZW50UGFnZSA9IHBhZ2U7Ci0gICAgICAgICAgICBjdXJyZW50UGFnZS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgaWYgKG9sZFBhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBvbGRQYWdlLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgcGFnZS5nZXRDb250cm9sKCkuc2V0Qm91bmRzKHBhZ2VTaXRlLmdldENsaWVudEFyZWEoKSk7Ci0KLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGlhbG9nIGNvbnRyb2xzCi0gICAgICAgICAgICB3aXphcmREaWFsb2cudXBkYXRlQWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHdpemFyZCBjYW4gZmluaXNoLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSB3aXphcmQgY2FuIGZpbmlzaAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuV2l6YXJkRmluaXNoKCkgewotICAgICAgICAgICAgaWYgKHdpemFyZCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB3aXphcmQuY2FuRmluaXNoKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBjYW4gZmxpcCB0bwotICAgICAgICAgKiB0aGUgbmV4dCBwYWdlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiBjYW4gZmxpcCB0byBuZXh0IHBhZ2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQYWdlLmNhbkZsaXBUb05leHRQYWdlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwYWdlJ3MgbWVzc2FnZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50UGFnZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50UGFnZS5nZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFnZSdzIHByZXZpb3VzIHBhZ2UuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBwYWdlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UHJldmlvdXNQYWdlKCkgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQYWdlLmdldFByZXZpb3VzUGFnZSgpOwotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9NdWx0aVN0ZXBSZXZpZXdXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvTXVsdGlTdGVwUmV2aWV3V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJkMmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9NdWx0aVN0ZXBSZXZpZXdXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFNlYmFzdGlhbiBEYXZpZHMgPHNkYXZpZHNAZ214LmRlPiAtIEZpeCBmb3IgYnVnIDE5MzQ2IC0gRGlhbG9nIGZvbnQgc2hvdWxkIGJlCi0gKiAgICAgYWN0aXZhdGVkIGFuZCB1c2VkIGJ5IG90aGVyIGNvbXBvbmVudHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1pc2MuV2l6YXJkU3RlcEdyb3VwOwotCi0vKioKLSAqIFRoaXMgcGFnZSBhbGxvd3MgdGhlIHVzZXIgdG8gcmV2aWV3IHRoZSBzdGVwcyB0byBiZSBkb25lLgotICogPHA+Ci0gKiBFeGFtcGxlIHVzYWdlOgotICogPHByZT4KLSAqIG1haW5QYWdlID0gbmV3IE11bHRpU3RlcFJldmlld1dpemFyZFBhZ2UoIm11bHRpU3RlcFJldmlld1BhZ2UiKTsKLSAqIG1haW5QYWdlLnNldFRpdGxlKCJQcm9qZWN0Iik7Ci0gKiBtYWluUGFnZS5zZXREZXNjcmlwdGlvbigiUmV2aWV3IHByb2plY3QuIik7Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE11bHRpU3RlcFJldmlld1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLSAgICBwcml2YXRlIFRleHQgZGV0YWlsc0ZpZWxkOwotCi0gICAgcHJpdmF0ZSBMYWJlbCBpbnN0cnVjdGlvbkxhYmVsOwotCi0gICAgcHJpdmF0ZSBXaXphcmRTdGVwR3JvdXAgc3RlcEdyb3VwOwotCi0gICAgcHJpdmF0ZSBNdWx0aVN0ZXBXaXphcmQgc3RlcFdpemFyZDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgc3RlcCByZXZpZXcgd2l6YXJkIHBhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFnZU5hbWUgdGhlIG5hbWUgb2YgdGhpcyBwYWdlCi0gICAgICogQHBhcmFtIHN0ZXBXaXphcmQgdGhlIHdpemFyZAotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aVN0ZXBSZXZpZXdXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgTXVsdGlTdGVwV2l6YXJkIHN0ZXBXaXphcmQpIHsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUpOwotICAgICAgICB0aGlzLnN0ZXBXaXphcmQgPSBzdGVwV2l6YXJkOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLSAgICAgICAgLy8gQWxyZWFkeSBrbm93IHRoZXJlIGlzIGEgbmV4dCBwYWdlLi4uCi0gICAgICAgIHJldHVybiBpc1BhZ2VDb21wbGV0ZSgpICYmICFzdGVwV2l6YXJkLmNhbkZpbmlzaE9uUmV2aWV3UGFnZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1JFVklFV19XSVpBUkRfUEFHRSk7Ci0KLSAgICAgICAgY3JlYXRlU3RlcEdyb3VwKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZURldGFpbHNHcm91cChjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVJbnN0cnVjdGlvbnNHcm91cChjb21wb3NpdGUpOwotCi0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250cm9sIGZvciB0aGUgZGV0YWlscwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVEZXRhaWxzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotICAgICAgICAvLyBDcmVhdGUgYSBjb21wb3NpdGUgdG8gaG9sZCBldmVyeXRoaW5nIHRvZ2V0aGVyCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgLy8gQWRkIGEgbGFiZWwgdG8gaWRlbnRpZnkgdGhlIGRldGFpbHMgdGV4dCBmaWVsZAotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5NdWx0aVN0ZXBSZXZpZXdXaXphcmRQYWdlX2RldGFpbHNMYWJlbCk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGxhYmVsLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgLy8gVGV4dCBmaWVsZCB0byBkaXNwbGF5IHRoZSBzdGVwJ3MgZGV0YWlscwotICAgICAgICBkZXRhaWxzRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMCi0gICAgICAgICAgICAgICAgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgZGV0YWlsc0ZpZWxkLnNldFRleHQoIlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiIpOyAvLyBwcmVmaWxsIHRvIHNob3cgMTUgbGluZXMgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZXRhaWxzRmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICBkZXRhaWxzRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGRldGFpbHNGaWVsZC5zZXRGb250KGZvbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGNvbnRyb2wgZm9yIHRoZSBpbnN0cnVjdGlvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlSW5zdHJ1Y3Rpb25zR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpbnN0cnVjdGlvbkxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgICAgICBpbnN0cnVjdGlvbkxhYmVsLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuTXVsdGlTdGVwUmV2aWV3V2l6YXJkUGFnZV9pbnN0cnVjdGlvbkZpbmlzaExhYmVsKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGluc3RydWN0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25MYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGNvbnRyb2wgZm9yIHRoZSBzdGVwIGxpc3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU3RlcEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgc3RlcEdyb3VwID0gbmV3IFdpemFyZFN0ZXBHcm91cCgpOwotICAgICAgICBzdGVwR3JvdXAuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLSAgICAgICAgc3RlcEdyb3VwLnNldFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBXaXphcmRTdGVwIHN0ZXAgPSAoV2l6YXJkU3RlcCkgc2VsLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsc0ZpZWxkLnNldFRleHQoc3RlcC5nZXREZXRhaWxzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RlcHMgdG8gYmUgZGlzcGxheWVkLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi9XaXphcmRTdGVwW10gZ2V0U3RlcHMoKSB7Ci0gICAgICAgIGlmIChzdGVwR3JvdXAgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBzdGVwR3JvdXAuZ2V0U3RlcHMoKTsKLQotICAgICAgICByZXR1cm4gbmV3IFdpemFyZFN0ZXBbMF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3RlcHMgdG8gYmUgZGlzcGxheWVkLiBIYXMgbm8gZWZmZWN0IGlmCi0gICAgICogdGhlIHBhZ2UgaXMgbm90IHlldCBjcmVhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdGVwcyB0aGUgY29sbGVjdGlvbiBvZiBzdGVwcwotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi92b2lkIHNldFN0ZXBzKFdpemFyZFN0ZXBbXSBzdGVwcykgewotICAgICAgICBpZiAoc3RlcEdyb3VwICE9IG51bGwpCi0gICAgICAgICAgICBzdGVwR3JvdXAuc2V0U3RlcHMoc3RlcHMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIGlmIChzdGVwV2l6YXJkLmNhbkZpbmlzaE9uUmV2aWV3UGFnZSgpKQotICAgICAgICAgICAgICAgIGluc3RydWN0aW9uTGFiZWwuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5NdWx0aVN0ZXBSZXZpZXdXaXphcmRQYWdlX2luc3RydWN0aW9uRmluaXNoTGFiZWwpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGluc3RydWN0aW9uTGFiZWwuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5NdWx0aVN0ZXBSZXZpZXdXaXphcmRQYWdlX2luc3RydWN0aW9uTmV4dExhYmVsKTsKLSAgICAgICAgICAgICgoQ29tcG9zaXRlKSBnZXRDb250cm9sKCkpLmxheW91dCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9NdWx0aVN0ZXBXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9NdWx0aVN0ZXBXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlNTE3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvTXVsdGlTdGVwV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLk11bHRpU3RlcENvbmZpZ3VyZVdpemFyZFBhZ2UuV2l6YXJkU3RlcENvbnRhaW5lcjsKLQotLyoqCi0gKiBTdGFuZGFyZCB3b3JrYmVuY2ggd2l6YXJkIHRvIGhhbmRsZSBhIG11bHRpLXN0ZXAgcGFnZS4gVGhlCi0gKiB3aXphcmQgaXMgYWxsb3dlZCBhbnkgbnVtYmVyIG9mIHBhZ2VzIGJlZm9yZSB0aGUgbXVsdGktc3RlcAotICogcGFnZSBpcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCi0gKiA8cD4KLSAqIEV4YW1wbGU6Ci0gKiA8cHJlPgotICogSVdpemFyZCB3aXphcmQgPSBuZXcgTXVsdGlTdGVwV2l6YXJkKCk7Ci0gKiBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IE11bHRpU3RlcFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAqIGRpYWxvZy5vcGVuKCk7Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpU3RlcFdpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0gICAgcHJpdmF0ZSBNdWx0aVN0ZXBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nOwotCi0gICAgcHJpdmF0ZSBNdWx0aVN0ZXBSZXZpZXdXaXphcmRQYWdlIHJldmlld1BhZ2U7Ci0KLSAgICBwcml2YXRlIE11bHRpU3RlcENvbmZpZ3VyZVdpemFyZFBhZ2UgY29uZmlnUGFnZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgd2l6YXJkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE11bHRpU3RlcFdpemFyZCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbnkgY3VzdG9tIHBhZ2VzIHRvIHRoZSB3aXphcmQgYmVmb3JlCi0gICAgICogdGhlIG11bHRpLXN0ZXAgcmV2aWV3IGFuZCBjb25maWd1cmUgcGFnZXMgYXJlCi0gICAgICogYWRkZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkQ3VzdG9tUGFnZXMoKTsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRQYWdlcygpIHsKLSAgICAgICAgc3VwZXIuYWRkUGFnZXMoKTsKLSAgICAgICAgYWRkQ3VzdG9tUGFnZXMoKTsKLQotICAgICAgICByZXZpZXdQYWdlID0gbmV3IE11bHRpU3RlcFJldmlld1dpemFyZFBhZ2UoCi0gICAgICAgICAgICAgICAgIm11bHRpU3RlcFJldmlld1dpemFyZFBhZ2UiLCB0aGlzKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldmlld1BhZ2Uuc2V0VGl0bGUoZ2V0UmV2aWV3UGFnZVRpdGxlKCkpOwotICAgICAgICByZXZpZXdQYWdlLnNldERlc2NyaXB0aW9uKGdldFJldmlld1BhZ2VEZXNjcmlwdGlvbigpKTsKLSAgICAgICAgdGhpcy5hZGRQYWdlKHJldmlld1BhZ2UpOwotCi0gICAgICAgIGNvbmZpZ1BhZ2UgPSBuZXcgTXVsdGlTdGVwQ29uZmlndXJlV2l6YXJkUGFnZSgKLSAgICAgICAgICAgICAgICAibXVsdGlTdGVwQ29uZmlndXJlV2l6YXJkUGFnZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29uZmlnUGFnZS5zZXRUaXRsZShnZXRDb25maWd1cmVQYWdlVGl0bGUoKSk7Ci0gICAgICAgIGNvbmZpZ1BhZ2Uuc2V0RGVzY3JpcHRpb24oZ2V0Q29uZmlndXJlUGFnZURlc2NyaXB0aW9uKCkpOwotICAgICAgICBjb25maWdQYWdlLnNldFdpemFyZERpYWxvZyh3aXphcmREaWFsb2cpOwotICAgICAgICB0aGlzLmFkZFBhZ2UoY29uZmlnUGFnZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLSAgICAgICAgaWYgKGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgPT0gcmV2aWV3UGFnZSkKLSAgICAgICAgICAgIHJldHVybiBjYW5GaW5pc2hPblJldmlld1BhZ2UoKTsKLSAgICAgICAgZWxzZSBpZiAoaXNDb25maWd1cmVTdGVwTW9kZSgpKQotICAgICAgICAgICAgcmV0dXJuIGdldFN0ZXBDb250YWluZXIoKS5jYW5XaXphcmRGaW5pc2goKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgd2l6YXJkIHdhbnRzIHRoZSBGaW5pc2ggYnV0dG9uCi0gICAgICogZW5hYmxlZCBvbiB0aGUgcmV2aWV3IHBhZ2UuIFNob3VsZCBvbmx5IGhhcHBlbiBpZgotICAgICAqIHRoZXJlIGlzIG9ubHkgb25lIHN0ZXAgYW5kIHRoYXQgc3RlcCBkb2VzIG5vdCByZXF1aXJlCi0gICAgICogZnVydGhlciBpbnRlcmFjdGlvbiB3aXRoIHRoZSB1c2VyLiBUaGUgTmV4dCBidXR0b24gd2lsbAotICAgICAqIGJlIGRpc2FibGVkIGFuZCB0aGUgaW5zdHJ1Y3Rpb25zIHVwZGF0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gY2FuRmluaXNoT25SZXZpZXdQYWdlKCk7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICB3aXphcmREaWFsb2cgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRpdGxlIGZvciB0aGUgbXVsdGktc3RlcCBjb25maWd1cmUKLSAgICAgKiBwYWdlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29uZmlndXJlUGFnZVRpdGxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIG11bHRpLXN0ZXAgY29uZmlndXJlCi0gICAgICogcGFnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbmZpZ3VyZVBhZ2VEZXNjcmlwdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGl0bGUgZm9yIHRoZSBtdWx0aS1zdGVwIHJldmlldwotICAgICAqIHBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRSZXZpZXdQYWdlVGl0bGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhYmVsIHVzZWQgb24gdGhlIGZpbmlzaCBidXR0b24gdG8KLSAgICAgKiB0byBpbmRpY2F0ZSBmaW5pc2hpbmcgYSBzdGVwLiBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBpZiBubyBzcGVjaWFsIGxhYmVsIGlzIHJlcXVpcmVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHRvIHJldHVybiB0aGUgdHJhbnNsYXRlZAotICAgICAqIGxhYmVsICJGaW5pc2ggU3RlcCIuCi0gICAgICogPC9wPjxwPgotICAgICAqIE9uIHRoZSBsYXN0IHN0ZXAsIHRoZSBmaW5pc2ggYnV0dG9uIGxhYmVsIGlzIGNoYW5nZWQgdG8KLSAgICAgKiBiZSAiRmluaXNoIiBhbmQgd2lsbCBubyBiZSBjaGFuZ2VkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmlzaFN0ZXBMYWJlbChXaXphcmRTdGVwW10gc3RlcHMpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLk11bHRpU3RlcFdpemFyZF9maW5pc2hMYWJlbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgIGlmIChwYWdlID09IGNvbmZpZ1BhZ2UpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByZXZpb3VzUGFnZShwYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIG11bHRpLXN0ZXAgcmV2aWV3Ci0gICAgICogcGFnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFJldmlld1BhZ2VEZXNjcmlwdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGFpbmVyIGhhbmRsZXIgZm9yIHRoZSBwYWdlcwotICAgICAqIG9mIHRoZSBzdGVwJ3Mgd2l6YXJkLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi9XaXphcmRTdGVwQ29udGFpbmVyIGdldFN0ZXBDb250YWluZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb25maWdQYWdlLmdldFN0ZXBDb250YWluZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHRoZSBwcm9ibGVtIG9mIGEgbWlzc2luZyBzdGVwIHdpemFyZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIHJldHJ5LCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdGVybWluYXRlCi0gICAgICogCQltdWx0aSBzdGVwIHdpemFyZCBkaWFsb2cuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqL2Fic3RyYWN0IGJvb2xlYW4gaGFuZGxlTWlzc2luZ1N0ZXBXaXphcmQoV2l6YXJkU3RlcCBzdGVwKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgd2l6YXJkIGlzIGNvbmZpZ3VyaW5nIHN0ZXBzCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqL2Jvb2xlYW4gaXNDb25maWd1cmVTdGVwTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgPT0gY29uZmlnUGFnZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLSAgICAgICAgaWYgKGlzQ29uZmlndXJlU3RlcE1vZGUoKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRTdGVwQ29udGFpbmVyKCkucGVyZm9ybUNhbmNlbCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgLy8gRmluaXNoIG9uIHJldmlldyBwYWdlIGlzIGEgc2hvcnRjdXQgdG8gcGVyZm9ybWluZwotICAgICAgICAvLyB0aGUgc3RlcHMuCi0gICAgICAgIGlmIChnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpID09IHJldmlld1BhZ2UpIHsKLSAgICAgICAgICAgIGdldENvbnRhaW5lcigpLnNob3dQYWdlKGNvbmZpZ1BhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRG9lcyBub3RoaW5nIGFzIGVhY2ggc3RlcCBpcyByZXNwb25zaWJsZQotICAgICAgICAvLyB0byBjb21wbGV0ZSBpdHMgd29yayB3aGVuIGl0cyB3aXphcmQgaXMKLSAgICAgICAgLy8gZG9uZS4KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiBzdGVwcyBmb3IgdGhlIHdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgV2l6YXJkU3RlcFtdIGdldFN0ZXBzKCkgewotICAgICAgICBpZiAocmV2aWV3UGFnZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHJldmlld1BhZ2UuZ2V0U3RlcHMoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG5ldyBXaXphcmRTdGVwWzBdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbGxlY3Rpb24gb2Ygc3RlcHMgZm9yIHRoZSB3aXphcmQuCi0gICAgICogSWdub3JlZCBpZiB0aGUgbXVsdGktc3RlcCByZXZpZXcgYW5kIGNvbmZpZ3VyZQotICAgICAqIHBhZ2VzIGFyZSBub3QgeWV0IGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0U3RlcHMoV2l6YXJkU3RlcFtdIHN0ZXBzKSB7Ci0gICAgICAgIGlmIChyZXZpZXdQYWdlICE9IG51bGwpCi0gICAgICAgICAgICByZXZpZXdQYWdlLnNldFN0ZXBzKHN0ZXBzKTsKLSAgICAgICAgaWYgKGNvbmZpZ1BhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIGNvbmZpZ1BhZ2Uuc2V0U3RlcHMoc3RlcHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG11bHRpLXN0ZXAgd2l6YXJkIGRpYWxvZyBwcm9jZXNzaW5nIHRoaXMKLSAgICAgKiB3aXphcmQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqL3ZvaWQgc2V0V2l6YXJkRGlhbG9nKE11bHRpU3RlcFdpemFyZERpYWxvZyBkaWFsb2cpIHsKLSAgICAgICAgd2l6YXJkRGlhbG9nID0gZGlhbG9nOwotICAgICAgICBpZiAoY29uZmlnUGFnZSAhPSBudWxsKQotICAgICAgICAgICAgY29uZmlnUGFnZS5zZXRXaXphcmREaWFsb2cod2l6YXJkRGlhbG9nKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvTXVsdGlTdGVwV2l6YXJkRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvTXVsdGlTdGVwV2l6YXJkRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGQ4OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL011bHRpU3RlcFdpemFyZERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIGRpYWxvZyB0byBzaG93IGEgbXVsdGktc3RlcCB3aXphcmQgdG8gdGhlIGVuZCB1c2VyLiAKLSAqIDxwPgotICogSW4gdHlwaWNhbCB1c2FnZSwgdGhlIGNsaWVudCBpbnN0YW50aWF0ZXMgdGhpcyBjbGFzcyB3aXRoIAotICogYSBtdWx0aS1zdGVwIHdpemFyZC4gVGhlIGRpYWxvZyBzZXJ2ZXMgYXMgdGhlIHdpemFyZCBjb250YWluZXIKLSAqIGFuZCBvcmNoZXN0cmF0ZXMgdGhlIHByZXNlbnRhdGlvbiBvZiBpdHMgcGFnZXMuCi0gKiA8cD4KLSAqIFRoZSBzdGFuZGFyZCBsYXlvdXQgaXMgcm91Z2hseSBhcyBmb2xsb3dzOiAKLSAqIGl0IGhhcyBhbiBhcmVhIGF0IHRoZSB0b3AgY29udGFpbmluZyBib3RoIHRoZQotICogd2l6YXJkJ3MgdGl0bGUsIGRlc2NyaXB0aW9uLCBhbmQgaW1hZ2U7IHRoZSBhY3R1YWwgd2l6YXJkIHBhZ2UKLSAqIGFwcGVhcnMgaW4gdGhlIG1pZGRsZTsgYmVsb3cgdGhhdCBpcyBhIHByb2dyZXNzIGluZGljYXRvcgotICogKHdoaWNoIGlzIG1hZGUgdmlzaWJsZSBpZiBuZWVkZWQpOyBhbmQgYXQgdGhlIGJvdHRvbQotICogb2YgdGhlIHBhZ2UgaXMgbWVzc2FnZSBsaW5lIGFuZCBhIGJ1dHRvbiBiYXIgY29udGFpbmluZyAKLSAqIEhlbHAsIE5leHQsIEJhY2ssIEZpbmlzaCwgYW5kIENhbmNlbCBidXR0b25zIChvciBzb21lIHN1YnNldCkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE11bHRpU3RlcFdpemFyZERpYWxvZyBleHRlbmRzIFdpemFyZERpYWxvZyB7Ci0gICAgcHJpdmF0ZSBNdWx0aVN0ZXBXaXphcmQgbXVsdGlTdGVwV2l6YXJkOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB3aXphcmQgZGlhbG9nIGZvciB0aGUgZ2l2ZW4gd2l6YXJkLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnRTaGVsbCB0aGUgcGFyZW50IHNoZWxsCi0gICAgICogQHBhcmFtIG5ld1dpemFyZCB0aGUgbXVsdGktc3RlcCB3aXphcmQgdGhpcyBkaWFsb2cgaXMgd29ya2luZyBvbgotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aVN0ZXBXaXphcmREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE11bHRpU3RlcFdpemFyZCBuZXdXaXphcmQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwsIG5ld1dpemFyZCk7Ci0gICAgICAgIG11bHRpU3RlcFdpemFyZCA9IG5ld1dpemFyZDsKLSAgICAgICAgbXVsdGlTdGVwV2l6YXJkLnNldFdpemFyZERpYWxvZyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JjZXMgdGhlIHdpemFyZCBkaWFsb2cgdG8gY2xvc2UKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovdm9pZCBmb3JjZUNsb3NlKCkgewotICAgICAgICBzdXBlci5maW5pc2hQcmVzc2VkKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXaXphcmREaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYmFja1ByZXNzZWQoKSB7Ci0gICAgICAgIGlmIChtdWx0aVN0ZXBXaXphcmQuaXNDb25maWd1cmVTdGVwTW9kZSgpKQotICAgICAgICAgICAgbXVsdGlTdGVwV2l6YXJkLmdldFN0ZXBDb250YWluZXIoKS5iYWNrUHJlc3NlZCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdXBlci5iYWNrUHJlc3NlZCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV2l6YXJkRGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaFByZXNzZWQoKSB7Ci0gICAgICAgIGlmIChtdWx0aVN0ZXBXaXphcmQuaXNDb25maWd1cmVTdGVwTW9kZSgpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBtdWx0aVN0ZXBXaXphcmQuZ2V0U3RlcENvbnRhaW5lcigpCi0gICAgICAgICAgICAgICAgICAgIC5wZXJmb3JtRmluaXNoKCk7Ci0gICAgICAgICAgICBpZiAoc3VjY2VzcykKLSAgICAgICAgICAgICAgICBtdWx0aVN0ZXBXaXphcmQuZ2V0U3RlcENvbnRhaW5lcigpLnByb2Nlc3NDdXJyZW50U3RlcCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuZmluaXNoUHJlc3NlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbXVsdGktc3RlcCB3aXphcmQgZm9yIHRoaXMgZGlhbG9nCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqL011bHRpU3RlcFdpemFyZCBnZXRNdWx0aVN0ZXBXaXphcmQoKSB7Ci0gICAgICAgIHJldHVybiBtdWx0aVN0ZXBXaXphcmQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXaXphcmREaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGVscFByZXNzZWQoKSB7Ci0gICAgICAgIGlmIChtdWx0aVN0ZXBXaXphcmQuaXNDb25maWd1cmVTdGVwTW9kZSgpKQotICAgICAgICAgICAgbXVsdGlTdGVwV2l6YXJkLmdldFN0ZXBDb250YWluZXIoKS5oZWxwUHJlc3NlZCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdXBlci5oZWxwUHJlc3NlZCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV2l6YXJkRGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG5leHRQcmVzc2VkKCkgewotICAgICAgICBpZiAobXVsdGlTdGVwV2l6YXJkLmlzQ29uZmlndXJlU3RlcE1vZGUoKSkKLSAgICAgICAgICAgIG11bHRpU3RlcFdpemFyZC5nZXRTdGVwQ29udGFpbmVyKCkubmV4dFByZXNzZWQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VwZXIubmV4dFByZXNzZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsYWJlbCBmb3IgdGhlIGZpbmlzaCBidXR0b24KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovdm9pZCBzZXRGaW5pc2hMYWJlbChTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkZJTklTSF9JRCk7Ci0gICAgICAgIGlmIChidXR0b24gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAobGFiZWwgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFidXR0b24uZ2V0VGV4dCgpLmVxdWFscyhJRGlhbG9nQ29uc3RhbnRzLkZJTklTSF9MQUJFTCkpIHsKLSAgICAgICAgICAgICAgICBidXR0b24uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLkZJTklTSF9MQUJFTCk7Ci0gICAgICAgICAgICAgICAgYnV0dG9uLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLSAgICAgICAgICAgIGJ1dHRvbi5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIGV2ZXJ5dGhpbmcgaW4gdGhlIGRpYWxvZwotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi92b2lkIHVwZGF0ZUFsbCgpIHsKLSAgICAgICAgc3VwZXIudXBkYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgbGF5b3V0IG9mIHRoZSBkaWFsb2cKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovdm9pZCB1cGRhdGVMYXlvdXQoKSB7Ci0gICAgICAgIHN1cGVyLnVwZGF0ZVNpemUoZ2V0Q3VycmVudFBhZ2UoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL05ld1Byb2plY3RXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9OZXdQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOGZlZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL05ld1Byb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLnJlZ2lzdHJ5LkNhcGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLnJlZ2lzdHJ5LkNhcGFiaWxpdHlSZWdpc3RyeTsKLQotLyoqCi0gKiBTdGFuZGFyZCB3b3JrYmVuY2ggd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIHN1cHBseQotICogdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBjcmVhdGUgYSBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgTmV3UHJvamVjdFdpemFyZCBleHRlbmRzIE11bHRpU3RlcENhcGFiaWxpdHlXaXphcmQgaW1wbGVtZW50cwotICAgICAgICBJTmV3V2l6YXJkIHsKLSAgICAvLyBpbml0IG1ldGhvZCBwYXJhbWV0ZXJzIHN1cHBsaWVkCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotICAgIC8vIFJlZmVyZW5jZSB0byB0aGUgcGFnZXMgcHJvdmlkZWQgYnkgdGhpcyB3aXphcmQKLSAgICBwcml2YXRlIFdpemFyZE5ld1Byb2plY3ROYW1lQW5kTG9jYXRpb25QYWdlIGNyZWF0aW9uUGFnZTsKLQotICAgIHByaXZhdGUgV2l6YXJkTmV3UHJvamVjdENhcGFiaWxpdHlQYWdlIGNhcGFiaWxpdHlQYWdlOwotCi0gICAgLy8gTmV3bHkgY3JlYXRlZCBwcm9qZWN0Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBuZXdQcm9qZWN0OwotCi0gICAgLy8gaW5pdGlhbCB2YWx1ZXMgZm9yIHRoZSBwYWdlcyBwcm92aWRlZCBieSB0aGlzIHdpemFyZAotICAgIHByaXZhdGUgU3RyaW5nIGluaXRpYWxQcm9qZWN0TmFtZTsKLQotICAgIHByaXZhdGUgQ2FwYWJpbGl0eVtdIGluaXRpYWxQcm9qZWN0Q2FwYWJpbGl0aWVzOwotCi0gICAgcHJpdmF0ZSBDYXRlZ29yeVtdIGluaXRpYWxTZWxlY3RlZENhdGVnb3JpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IHdpemFyZCBmb3IgY3JlYXRpbmcgYSBuZXcgcHJvamVjdAotICAgICAqIGluIHRoZSB3b3Jrc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIE5ld1Byb2plY3RXaXphcmQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luIHBsdWdpbiA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IHBsdWdpbi5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oIk5ld1Byb2plY3RXaXphcmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChzZWN0aW9uID09IG51bGwpCi0gICAgICAgICAgICBzZWN0aW9uID0gd29ya2JlbmNoU2V0dGluZ3MuYWRkTmV3U2VjdGlvbigiTmV3UHJvamVjdFdpemFyZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0RGlhbG9nU2V0dGluZ3Moc2VjdGlvbik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBNdWx0aVN0ZXBXaXphcmQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQ3VzdG9tUGFnZXMoKSB7Ci0gICAgICAgIGNyZWF0aW9uUGFnZSA9IG5ldyBXaXphcmROZXdQcm9qZWN0TmFtZUFuZExvY2F0aW9uUGFnZSgKLSAgICAgICAgICAgICAgICAibmV3UHJvamVjdENyZWF0aW9uUGFnZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3JlYXRpb25QYWdlLnNldFRpdGxlKElERVdvcmtiZW5jaE1lc3NhZ2VzLk5ld1Byb2plY3RXaXphcmRfdGl0bGUpOwotICAgICAgICBjcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9kZXNjcmlwdGlvbik7Ci0gICAgICAgIGNyZWF0aW9uUGFnZS5zZXRJbml0aWFsUHJvamVjdE5hbWUoaW5pdGlhbFByb2plY3ROYW1lKTsKLSAgICAgICAgdGhpcy5hZGRQYWdlKGNyZWF0aW9uUGFnZSk7Ci0KLSAgICAgICAgY2FwYWJpbGl0eVBhZ2UgPSBuZXcgV2l6YXJkTmV3UHJvamVjdENhcGFiaWxpdHlQYWdlKAotICAgICAgICAgICAgICAgICJuZXdQcm9qZWN0Q2FwYWJpbGl0eVBhZ2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGNhcGFiaWxpdHlQYWdlLnNldFRpdGxlKElERVdvcmtiZW5jaE1lc3NhZ2VzLk5ld1Byb2plY3RXaXphcmRfdGl0bGUpOwotICAgICAgICBjYXBhYmlsaXR5UGFnZS5zZXREZXNjcmlwdGlvbihJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q2FwYWJpbGl0eVBhZ2VfZGVzY3JpcHRpb24pOwotICAgICAgICBjYXBhYmlsaXR5UGFnZQotICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsUHJvamVjdENhcGFiaWxpdGllcyhpbml0aWFsUHJvamVjdENhcGFiaWxpdGllcyk7Ci0gICAgICAgIGNhcGFiaWxpdHlQYWdlLnNldEluaXRpYWxTZWxlY3RlZENhdGVnb3JpZXMoaW5pdGlhbFNlbGVjdGVkQ2F0ZWdvcmllcyk7Ci0gICAgICAgIHRoaXMuYWRkUGFnZShjYXBhYmlsaXR5UGFnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIHRoZSBjb2xsZWN0aW9uIG9mIHN0ZXBzIHRvIGNyZWF0ZSBhbmQgaW5zdGFsbAotICAgICAqIHRoZSBjaG9zZW4gY2FwYWJpbGl0aWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2Vzc2Z1bCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogCQlpZiBhIHByb2JsZW0gd2FzIGRldGVjdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBidWlsZFN0ZXBzKCkgewotICAgICAgICBDYXBhYmlsaXR5W10gY2FwcyA9IGNhcGFiaWxpdHlQYWdlLmdldFNlbGVjdGVkQ2FwYWJpbGl0aWVzKCk7Ci0gICAgICAgIENhcGFiaWxpdHlSZWdpc3RyeSByZWcgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldENhcGFiaWxpdHlSZWdpc3RyeSgpOwotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IHJlZy52YWxpZGF0ZUNhcGFiaWxpdGllcyhjYXBzKTsKLSAgICAgICAgaWYgKHN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgIENhcGFiaWxpdHlbXSByZXN1bHRzID0gcmVnLnBydW5lQ2FwYWJpbGl0aWVzKGNhcHMpOwotICAgICAgICAgICAgV2l6YXJkU3RlcFtdIHN0ZXBzID0gbmV3IFdpemFyZFN0ZXBbcmVzdWx0cy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgIHN0ZXBzWzBdID0gbmV3IENyZWF0ZVByb2plY3RTdGVwKDEsIGNyZWF0aW9uUGFnZSwgdGhpcyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgc3RlcHNbaSArIDFdID0gbmV3IEluc3RhbGxDYXBhYmlsaXR5U3RlcChpICsgMiwgcmVzdWx0c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtiZW5jaCwgdGhpcyk7Ci0gICAgICAgICAgICBzZXRTdGVwcyhzdGVwcyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5OZXdQcm9qZWN0V2l6YXJkX2Vycm9yVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLk5ld1Byb2plY3RXaXphcmRfaW52YWxpZENhcGFiaWxpdGllcywKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gTXVsdGlTdGVwV2l6YXJkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkZpbmlzaE9uUmV2aWV3UGFnZSgpIHsKLSAgICAgICAgLy8geWVzIGlmIHRoZSBvbmx5IHN0ZXAgaXMgdG8gY3JlYXRlIHRoZSBwcm9qZWN0LgotICAgICAgICByZXR1cm4gZ2V0U3RlcHMoKS5sZW5ndGggPT0gMTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE11bHRpU3RlcFdpemFyZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ3VyZVBhZ2VUaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLk5ld1Byb2plY3RXaXphcmRfdGl0bGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBNdWx0aVN0ZXBXaXphcmQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWd1cmVQYWdlRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRQcm9qZWN0Q29uZmlndXJlUGFnZV9kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE11bHRpU3RlcFdpemFyZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmlld1BhZ2VUaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLk5ld1Byb2plY3RXaXphcmRfdGl0bGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBNdWx0aVN0ZXBXaXphcmQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZpZXdQYWdlRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmRQcm9qZWN0UmV2aWV3UGFnZV9kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE11bHRpU3RlcFdpemFyZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmlzaFN0ZXBMYWJlbChXaXphcmRTdGVwW10gc3RlcHMpIHsKLSAgICAgICAgLy8gVGhlIGZpcnN0IHN0ZXAgaXMgdGhlIHByb2plY3QgY3JlYXRpb24gd2hpY2ggaGFzIG5vIHdpemFyZAotICAgICAgICAvLyBwYWdlcywgc28gaWdub3JlIGl0LiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBzdGVwIGFmdGVyIHRoYXQsCi0gICAgICAgIC8vIHRoZW4gaXQgbmVlZHMgdGhlICJGaW5pc2giIGxhYmVsLiBTbyB0aGUgIkZpbmlzaCBTdGVwIiBsYWJlbAotICAgICAgICAvLyBpcyBvbmx5IG5lZWRlZCBpZiBtb3JlIHRoYW4gMiBzdGVwcyBpbiB0aGUgbGlzdC4KLSAgICAgICAgaWYgKHN0ZXBzLmxlbmd0aCA+IDIpCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RmluaXNoU3RlcExhYmVsKHN0ZXBzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBwcm9qZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICAgaWYgcHJvamVjdCBpcyBub3QgY3JlYXRlZCB5ZXQuCi0gICAgICovCi0gICAgcHVibGljIElQcm9qZWN0IGdldE5ld1Byb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBuZXdQcm9qZWN0OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gTXVsdGlTdGVwV2l6YXJkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRQZXJzcGVjdGl2ZUNob2ljZXMoKSB7Ci0gICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBDYXBhYmlsaXR5W10gY2FwcyA9IGNhcGFiaWxpdHlQYWdlLmdldFNlbGVjdGVkQ2FwYWJpbGl0aWVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2Fwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQXJyYXlMaXN0IGlkcyA9IGNhcHNbaV0uZ2V0UGVyc3BlY3RpdmVDaG9pY2VzKCk7Ci0gICAgICAgICAgICBpZiAoaWRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdCA9IGlkcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdHMuY29udGFpbnMoaWQpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSBpZHMgPSBuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXTsKLSAgICAgICAgcmVzdWx0cy50b0FycmF5KGlkcyk7Ci0gICAgICAgIHJldHVybiBpZHM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvamVjdFByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gbmV3UHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgaWYgKHBhZ2UgPT0gY2FwYWJpbGl0eVBhZ2UpIHsKLSAgICAgICAgICAgIGlmICghYnVpbGRTdGVwcygpKQotICAgICAgICAgICAgICAgIHJldHVybiBjYXBhYmlsaXR5UGFnZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmV4dFBhZ2UocGFnZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBNdWx0aVN0ZXBXaXphcmQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqL2Jvb2xlYW4gaGFuZGxlTWlzc2luZ1N0ZXBXaXphcmQoV2l6YXJkU3RlcCBzdGVwKSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgICAub3BlbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLk5ld1Byb2plY3RXaXphcmRfZXJyb3JUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLk5ld1Byb2plY3RXaXphcmRfbm9XaXphcmQsIHN0ZXAuZ2V0TGFiZWwoKSkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0gICAgICAgIGluaXRpYWxpemVEZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICBzZXRXaW5kb3dUaXRsZShJREVXb3JrYmVuY2hNZXNzYWdlcy5OZXdQcm9qZWN0V2l6YXJkX3dpbmRvd1RpdGxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbWFnZSBiYW5uZXIgZm9yIHRoZSB3aXphcmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIEltYWdlRGVzY3JpcHRvciBkZXNjID0gSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigid2l6YmFuL25ld3Byal93aXouZ2lmIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjKTsKLSAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbml0aWFsIGNhdGVnb3JpZXMgdG8gYmUgc2VsZWN0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdGVnb3JpZXMgaW5pdGlhbCBjYXRlZ29yaWVzIHRvIHNlbGVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3RlZENhdGVnb3JpZXMoQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzKSB7Ci0gICAgICAgIGluaXRpYWxTZWxlY3RlZENhdGVnb3JpZXMgPSBjYXRlZ29yaWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGluaXRpYWwgcHJvamVjdCBjYXBhYmlsaXRpZXMgdG8gYmUgc2VsZWN0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhcGFiaWxpdGllcyBpbml0aWFsIHByb2plY3QgY2FwYWJpbGl0aWVzIHRvIHNlbGVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxQcm9qZWN0Q2FwYWJpbGl0aWVzKENhcGFiaWxpdHlbXSBjYXBhYmlsaXRpZXMpIHsKLSAgICAgICAgaW5pdGlhbFByb2plY3RDYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW5pdGlhbCBwcm9qZWN0IG5hbWUuIExlYWRpbmcgYW5kIHRyYWlsaW5nCi0gICAgICogc3BhY2VzIGluIHRoZSBuYW1lIGFyZSBpZ25vcmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIGluaXRpYWwgcHJvamVjdCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFByb2plY3ROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICBpbml0aWFsUHJvamVjdE5hbWUgPSBudWxsOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpbml0aWFsUHJvamVjdE5hbWUgPSBuYW1lLnRyaW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuZXdseSBjcmVhdGVkIHByb2plY3QgcmVzb3VyY2UKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovdm9pZCBzZXROZXdQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgbmV3UHJvamVjdCA9IHByb2plY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL09wZW5SZXNvdXJjZURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL09wZW5SZXNvdXJjZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2VjNjY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9PcGVuUmVzb3VyY2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlJlc291cmNlTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotCi0vKioKLSAqIFNob3dzIGEgbGlzdCBvZiByZXNvdXJjZXMgdG8gdGhlIHVzZXIgd2l0aCBhIHRleHQgZW50cnkgZmllbGQKLSAqIGZvciBhIHN0cmluZyBwYXR0ZXJuIHVzZWQgdG8gZmlsdGVyIHRoZSBsaXN0IG9mIHJlc291cmNlcy4KLSAqCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuUmVzb3VyY2VEaWFsb2cgZXh0ZW5kcyBSZXNvdXJjZUxpc3RTZWxlY3Rpb25EaWFsb2cgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBwYXJlbnQgc2hlbGwKLSAgICAgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBjb250YWluZXIKLSAgICAgKiBAcGFyYW0gdHlwZXNNYXNrIHRoZSB0eXBlcyBtYXNrCi0gICAgICovCi0gICAgcHVibGljIE9wZW5SZXNvdXJjZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUNvbnRhaW5lciBjb250YWluZXIsCi0gICAgICAgICAgICBpbnQgdHlwZXNNYXNrKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsLCBjb250YWluZXIsIHR5cGVzTWFzayk7Ci0gICAgICAgIHNldFRpdGxlKElERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5SZXNvdXJjZURpYWxvZ190aXRsZSk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpCi0gICAgICAgICAgICAgICAgLnNldEhlbHAocGFyZW50U2hlbGwsIElJREVIZWxwQ29udGV4dElkcy5PUEVOX1JFU09VUkNFX0RJQUxPRyk7Ci0gICAgICAgIHNldEFsbG93VXNlclRvVG9nZ2xlRGVyaXZlZCh0cnVlKTsKLSAgICAgICAgc2V0U2hvd0Rlcml2ZWQoSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLmdldEJvb2xlYW4oIlJlc291cmNlTGlzdFNlbGVjdGlvbkRpYWxvZy5zaG93RGVyaXZlZCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUmVzb3VyY2VMaXN0U2VsZWN0aW9uRGlhbG9nI29rUHJlc3NlZCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkucHV0KCJSZXNvdXJjZUxpc3RTZWxlY3Rpb25EaWFsb2cuc2hvd0Rlcml2ZWQiLCBnZXRTaG93RGVyaXZlZCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUGF0aFZhcmlhYmxlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUGF0aFZhcmlhYmxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMjEyNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1BhdGhWYXJpYWJsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBTZWJhc3RpYW4gRGF2aWRzIDxzZGF2aWRzQGdteC5kZT4gLSBGaXggZm9yIGJ1ZyAxOTM0NiAtIERpYWxvZyBmb250Ci0gKiAgICAgc2hvdWxkIGJlIGFjdGl2YXRlZCBhbmQgdXNlZCBieSBvdGhlciBjb21wb25lbnRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQYXRoVmFyaWFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotCi0vKioKLSAqIERpYWxvZyB0aGF0IHByb21wdHMgdGhlIHVzZXIgZm9yIGRlZmluaW5nIGEgdmFyaWFibGUncyBuYW1lIGFuZCB2YWx1ZS4gSXQKLSAqIHN1cHBvcnRzIGNyZWF0aW5nIGEgbmV3IHZhcmlhYmxlIG9yIGVkaXRpbmcgYW4gZXhpc3Rpbmcgb25lLiBUaGUgZGlmZmVyZW5jZQotICogYmV0d2VlbiB0aGUgdHdvIHVzZXMgaXMganVzdCBhIG1hdHRlciBvZiB3aGljaCBtZXNzYWdlcyB0byBwcmVzZW50IHRvIHRoZQotICogdXNlciBhbmQgd2hldGhlciB0aGUgIk9rIiBidXR0b24gc3RhcnRzIGVuYWJsZWQgb3Igbm90LgotICovCi1wdWJsaWMgY2xhc3MgUGF0aFZhcmlhYmxlRGlhbG9nIGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nIHsKLQotICAgIC8vIFVJIHdpZGdldHMKLSAgICBwcml2YXRlIEJ1dHRvbiBva0J1dHRvbjsKLQotICAgIHByaXZhdGUgTGFiZWwgdmFyaWFibGVOYW1lTGFiZWw7Ci0KLSAgICBwcml2YXRlIExhYmVsIHZhcmlhYmxlVmFsdWVMYWJlbDsKLQotICAgIHByaXZhdGUgVGV4dCB2YXJpYWJsZU5hbWVGaWVsZDsKLQotICAgIHByaXZhdGUgVGV4dCB2YXJpYWJsZVZhbHVlRmllbGQ7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBmaWxlQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZm9sZGVyQnV0dG9uOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBkaWFsb2cgdHlwZTogPGNvZGU+TkVXX1ZBUklBQkxFPC9jb2RlPiBvcgotICAgICAqIDxjb2RlPkVYSVNUSU5HX1ZBUklBQkxFPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB0eXBlOwotCi0gICAgLyoqCi0gICAgICogVGhlIHR5cGUgb2YgdmFyaWFibGUgdGhhdCBjYW4gYmUgZWRpdGVkIGluIHRoaXMgZGlhbG9nLgotICAgICAqIDxjb2RlPklSZXNvdXJjZS5GSUxFPC9jb2RlPiBvciA8Y29kZT5JUmVzb3VyY2UuRk9MREVSPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHZhcmlhYmxlVHlwZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBiZWluZyBlZGl0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyaWFibGVOYW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBiZWluZyBlZGl0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFyaWFibGVWYWx1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoZSB2YXJpYWJsZSBiZWluZyBlZGl0ZWQuIEl0IGlzIHVzZWQgd2hlbiB0ZXN0aW5nCi0gICAgICogaWYgdGhlIGN1cnJlbnQgdmFyaWFibGUncyBuYW1lIGlzIGFscmVhZHkgaW4gdXNlLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG9yaWdpbmFsTmFtZTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gc2VsZWN0IHRoZSBwcm9wZXIgbWVzc2FnZSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgbW9kZQotICAgICAqIChuZXcvZXhpc3RpbmcgdmFyaWFibGUpLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBuZXdWYXJpYWJsZTsKLQotICAgIC8qKgotICAgICAqIFJlZmVyZW5jZSB0byB0aGUgcGF0aCB2YXJpYWJsZSBtYW5hZ2VyLiBJdCBpcyB1c2VkIGZvciB2YWxpZGF0aW5nCi0gICAgICogdmFyaWFibGUgbmFtZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUGF0aFZhcmlhYmxlTWFuYWdlciBwYXRoVmFyaWFibGVNYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogU2V0IG9mIHZhcmlhYmxlIG5hbWVzIGN1cnJlbnRseSBpbiB1c2UuIFVzZWQgd2hlbiB3YXJuaW5nIHRoZSB1c2VyIHRoYXQKLSAgICAgKiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciB2YXJpYWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNldCBuYW1lc0luVXNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBzdGF0dXMuIEl0cyB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6PHVsPgotICAgICAqIDxsaT48Y29kZT5JTWVzc2FnZVByb3ZpZGVyLk5PTkU8L2NvZGU+IChkZWZhdWx0KTs8L2xpPgotICAgICAqIDxsaT48Y29kZT5JTWVzc2FnZVByb3ZpZGVyLldBUk5JTkc8L2NvZGU+OzwvbGk+Ci0gICAgICogPGxpPjxjb2RlPklNZXNzYWdlUHJvdmlkZXIuRVJST1I8L2NvZGU+OzwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBVc2VkIHdoZW4gdmFsaWRhdGluZyB0aGUgdXNlciBpbnB1dC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB2YWxpZGF0aW9uU3RhdHVzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBtZXNzYWdlIGdlbmVyYXRlZCBieSB0aGUgbGFzdAotICAgICAqIGNhbGwgdG8gYSA8Y29kZT52YWxpZGF0ZTwvY29kZT4gbWV0aG9kLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25NZXNzYWdlOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciBhIHZhcmlhYmxlIG5hbWUgaGFzIGJlZW4gZW50ZXJlZC4gIAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBuYW1lRW50ZXJlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciBhIHZhcmlhYmxlIGxvY2F0aW9uIGhhcyBiZWVuIGVudGVyZWQuICAKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbG9jYXRpb25FbnRlcmVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3RhbmRhcmQgbWVzc2FnZSB0byBiZSBzaG93biB3aGVuIHRoZXJlIGFyZSBubyBwcm9ibGVtcyBiZWluZwotICAgICAqIHJlcG9ydGVkLgotICAgICAqLwotICAgIGZpbmFsIHByaXZhdGUgU3RyaW5nIHN0YW5kYXJkTWVzc2FnZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0YW50IGZvciBkZWZpbmluZyB0aGlzIGRpYWxvZyBhcyBpbnRlbmRlZCB0byBjcmVhdGUgYSBuZXcgdmFyaWFibGUKLSAgICAgKiAodmFsdWUgPSAxKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBORVdfVkFSSUFCTEUgPSAxOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgZm9yIGRlZmluaW5nIHRoaXMgZGlhbG9nIGFzIGludGVuZGVkIHRvIGVkaXQgYW4gZXhpc3RpbmcKLSAgICAgKiB2YXJpYWJsZSAodmFsdWUgPSAyKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFWElTVElOR19WQVJJQUJMRSA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgZGlhbG9nIGZvciBlZGl0aW5nIGEgbmV3L2V4aXN0aW5nIHBhdGggdmFyaWFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBwYXJlbnQgc2hlbGwKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgZGlhbG9nIHR5cGU6IDxjb2RlPk5FV19WQVJJQUJMRTwvY29kZT4gb3IKLSAgICAgKiAJPGNvZGU+RVhJU1RJTkdfVkFSSUFCTEU8L2NvZGU+Ci0gICAgICogQHBhcmFtIHZhcmlhYmxlVHlwZSB0aGUgdHlwZSBvZiB2YXJpYWJsZSB0aGF0IGNhbiBiZSBlZGl0ZWQgaW4gCi0gICAgICogCXRoaXMgZGlhbG9nLiA8Y29kZT5JUmVzb3VyY2UuRklMRTwvY29kZT4gb3IgPGNvZGU+SVJlc291cmNlLkZPTERFUjwvY29kZT4KLSAgICAgKiBAcGFyYW0gcGF0aFZhcmlhYmxlTWFuYWdlciBhIHJlZmVyZW5jZSB0byB0aGUgcGF0aCB2YXJpYWJsZSBtYW5hZ2VyCi0gICAgICogQHBhcmFtIG5hbWVzSW5Vc2UgYSBzZXQgb2YgdmFyaWFibGUgbmFtZXMgY3VycmVudGx5IGluIHVzZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aFZhcmlhYmxlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBpbnQgdHlwZSwgaW50IHZhcmlhYmxlVHlwZSwKLSAgICAgICAgICAgIElQYXRoVmFyaWFibGVNYW5hZ2VyIHBhdGhWYXJpYWJsZU1hbmFnZXIsIFNldCBuYW1lc0luVXNlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgdGhpcy5uZXdWYXJpYWJsZSA9IHR5cGUgPT0gTkVXX1ZBUklBQkxFOwotICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRoaXMudmFyaWFibGVUeXBlID0gdmFyaWFibGVUeXBlOwotICAgICAgICB0aGlzLnBhdGhWYXJpYWJsZU1hbmFnZXIgPSBwYXRoVmFyaWFibGVNYW5hZ2VyOwotICAgICAgICB0aGlzLm5hbWVzSW5Vc2UgPSBuYW1lc0luVXNlOwotCi0gICAgICAgIGlmIChuZXdWYXJpYWJsZSkKLSAgICAgICAgICAgIHRoaXMuc3RhbmRhcmRNZXNzYWdlID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUGF0aFZhcmlhYmxlRGlhbG9nX21lc3NhZ2VfbmV3VmFyaWFibGU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRoaXMuc3RhbmRhcmRNZXNzYWdlID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUGF0aFZhcmlhYmxlRGlhbG9nX21lc3NhZ2VfZXhpc3RpbmdWYXJpYWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIHRoaXMgZGlhbG9nJ3Mgc2hlbGwsIHNldHRpbmcgdGhlIHNoZWxsJ3MgdGV4dC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwoU2hlbGwpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgICAgICBpZiAobmV3VmFyaWFibGUpCi0gICAgICAgICAgICBzaGVsbC5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlBhdGhWYXJpYWJsZURpYWxvZ19zaGVsbFRpdGxlX25ld1ZhcmlhYmxlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2hlbGwKLSAgICAgICAgICAgICAgICAgICAgLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuUGF0aFZhcmlhYmxlRGlhbG9nX3NoZWxsVGl0bGVfZXhpc3RpbmdWYXJpYWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBkaWFsb2cgKGV4Y2VwdCBmb3IgdGhlIGJ1dHRvbiBiYXIpLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYQotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyB0b3AgbGV2ZWwgY29tcG9zaXRlCi0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlcyBkaWFsb2cgYXJlYSBjb21wb3NpdGUKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRlbnRzID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudENvbXBvc2l0ZSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlcyBhbmQgbGF5IG91dHMgZGlhbG9nIGFyZWEgd2lkZ2V0cyAKLSAgICAgICAgY3JlYXRlV2lkZ2V0cyhjb250ZW50cywgcGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgLy8gdmFsaWRhdGUgcG9zc2libHkgYWxyZWFkeSBpbmNvcnJlY3QgdmFyaWFibGUgZGVmaW5pdGlvbnMKLSAgICAgICAgaWYgKHR5cGUgPT0gRVhJU1RJTkdfVkFSSUFCTEUpIHsKLSAgICAgICAgICAgIG5hbWVFbnRlcmVkID0gbG9jYXRpb25FbnRlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHZhbGlkYXRlVmFyaWFibGVWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIGNvbmZpZ3VyZXMgdGhpcyBkaWFsb2cncyBtYWluIGNvbXBvc2l0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Q29tcG9zaXRlIHBhcmVudCdzIGNvbXBvc2l0ZQotICAgICAqIEByZXR1cm4gdGhpcyBkaWFsb2cncyBtYWluIGNvbXBvc2l0ZQotICAgICAqLwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlKSB7Ci0gICAgICAgIC8vIGNyZWF0ZXMgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCi0gICAgICAgIENvbXBvc2l0ZSBjb250ZW50cyA9IG5ldyBDb21wb3NpdGUocGFyZW50Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOwotCi0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQotICAgICAgICBjb250ZW50cy5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY29udGVudHMuc2V0Rm9udChwYXJlbnRDb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQotICAgICAgICBpZiAobmV3VmFyaWFibGUpCi0gICAgICAgICAgICBzZXRUaXRsZShJREVXb3JrYmVuY2hNZXNzYWdlcy5QYXRoVmFyaWFibGVEaWFsb2dfZGlhbG9nVGl0bGVfbmV3VmFyaWFibGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZXRUaXRsZShJREVXb3JrYmVuY2hNZXNzYWdlcy5QYXRoVmFyaWFibGVEaWFsb2dfZGlhbG9nVGl0bGVfZXhpc3RpbmdWYXJpYWJsZSk7Ci0gICAgICAgIHNldE1lc3NhZ2Uoc3RhbmRhcmRNZXNzYWdlKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgd2lkZ2V0cyBmb3IgdGhpcyBkaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0byBjcmVhdGUgd2lkZ2V0cwotICAgICAqIEBwYXJhbSBjb250ZW50cyAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlV2lkZ2V0cyhDb21wb3NpdGUgY29udGVudHMsIEZvbnQgZm9udCkgewotICAgICAgICBGb3JtRGF0YSBkYXRhOwotCi0gICAgICAgIFN0cmluZyBuYW1lTGFiZWxUZXh0ID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUGF0aFZhcmlhYmxlRGlhbG9nX3ZhcmlhYmxlTmFtZTsKLSAgICAgICAgU3RyaW5nIHZhbHVlTGFiZWxUZXh0ID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUGF0aFZhcmlhYmxlRGlhbG9nX3ZhcmlhYmxlVmFsdWU7Ci0KLSAgICAgICAgLy8gdmFyaWFibGUgbmFtZSBsYWJlbAotICAgICAgICB2YXJpYWJsZU5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULkxFRlQpOwotICAgICAgICB2YXJpYWJsZU5hbWVMYWJlbC5zZXRUZXh0KG5hbWVMYWJlbFRleHQpOwotCi0gICAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgdmFyaWFibGVOYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgdmFyaWFibGVOYW1lTGFiZWwuc2V0Rm9udChmb250KTsKLQotICAgICAgICAvLyB2YXJpYWJsZSB2YWx1ZSBsYWJlbAotICAgICAgICB2YXJpYWJsZVZhbHVlTGFiZWwgPSBuZXcgTGFiZWwoY29udGVudHMsIFNXVC5MRUZUKTsKLSAgICAgICAgdmFyaWFibGVWYWx1ZUxhYmVsLnNldFRleHQodmFsdWVMYWJlbFRleHQpOwotCi0gICAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodmFyaWFibGVOYW1lTGFiZWwsCi0gICAgICAgICAgICAgICAgY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDEwKSk7Ci0gICAgICAgIHZhcmlhYmxlVmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICB2YXJpYWJsZVZhbHVlTGFiZWwuc2V0Rm9udChmb250KTsKLQotICAgICAgICAvLyB0aGUgbGFyZ2VyIGxhYmVsIHdpbGwgYmUgdXNlZCBpbiB0aGUgbGVmdCBhdHRhY2htZW50cyBmb3IgdGhlIGZpZWxkcyAgCi0gICAgICAgIExhYmVsIGxhcmdlckxhYmVsID0gbmFtZUxhYmVsVGV4dC5sZW5ndGgoKSA+IHZhbHVlTGFiZWxUZXh0Lmxlbmd0aCgpID8gdmFyaWFibGVOYW1lTGFiZWwKLSAgICAgICAgICAgICAgICA6IHZhcmlhYmxlVmFsdWVMYWJlbDsKLQotICAgICAgICAvLyB2YXJpYWJsZSBuYW1lIGZpZWxkCi0gICAgICAgIHZhcmlhYmxlTmFtZUZpZWxkID0gbmV3IFRleHQoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgdmFyaWFibGVOYW1lRmllbGQuc2V0VGV4dCh2YXJpYWJsZU5hbWUpOwotCi0gICAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgZGF0YS53aWR0aCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0gICAgICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChsYXJnZXJMYWJlbCwKLSAgICAgICAgICAgICAgICBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyg1KSk7Ci0gICAgICAgIHZhcmlhYmxlTmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHZhcmlhYmxlTmFtZUZpZWxkLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIHZhcmlhYmxlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0KLSAgICAgICAgdmFyaWFibGVOYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZU1vZGlmaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIHZhcmlhYmxlIHZhbHVlIGZpZWxkCi0gICAgICAgIHZhcmlhYmxlVmFsdWVGaWVsZCA9IG5ldyBUZXh0KGNvbnRlbnRzLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIHZhcmlhYmxlVmFsdWVGaWVsZC5zZXRUZXh0KHZhcmlhYmxlVmFsdWUpOwotCi0gICAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgZGF0YS53aWR0aCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0gICAgICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChsYXJnZXJMYWJlbCwKLSAgICAgICAgICAgICAgICBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyg1KSk7Ci0gICAgICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHZhcmlhYmxlTmFtZUxhYmVsLAotICAgICAgICAgICAgICAgIGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygxMCkpOwotICAgICAgICB2YXJpYWJsZVZhbHVlRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgdmFyaWFibGVWYWx1ZUZpZWxkLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgdmFyaWFibGVWYWx1ZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICB2YXJpYWJsZVZhbHVlTW9kaWZpZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gc2VsZWN0IGZpbGUgcGF0aCBidXR0b24KLSAgICAgICAgZmlsZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGVudHMsIFNXVC5QVVNIKTsKLSAgICAgICAgZmlsZUJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlBhdGhWYXJpYWJsZURpYWxvZ19maWxlKTsKLSAgICAgICAgaWYgKCh2YXJpYWJsZVR5cGUgJiBJUmVzb3VyY2UuRklMRSkgPT0gMCkKLSAgICAgICAgICAgIGZpbGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgZGF0YSA9IHNldEJ1dHRvbkZvcm1MYXlvdXREYXRhKGZpbGVCdXR0b24pOwotICAgICAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh2YXJpYWJsZU5hbWVMYWJlbCwKLSAgICAgICAgICAgICAgICBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMTApKTsKLSAgICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHZhcmlhYmxlVmFsdWVGaWVsZCwKLSAgICAgICAgICAgICAgICBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscygxMCkpOwotICAgICAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotICAgICAgICBmaWxlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGZpbGVCdXR0b24uc2V0Rm9udChmb250KTsKLQotICAgICAgICBmaWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNlbGVjdEZpbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gc2VsZWN0IGZvbGRlciBwYXRoIGJ1dHRvbgotICAgICAgICBmb2xkZXJCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRlbnRzLCBTV1QuUFVTSCk7Ci0gICAgICAgIGZvbGRlckJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlBhdGhWYXJpYWJsZURpYWxvZ19mb2xkZXIpOwotICAgICAgICBpZiAoKHZhcmlhYmxlVHlwZSAmIElSZXNvdXJjZS5GT0xERVIpID09IDApCi0gICAgICAgICAgICBmb2xkZXJCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgZGF0YSA9IHNldEJ1dHRvbkZvcm1MYXlvdXREYXRhKGZvbGRlckJ1dHRvbik7Ci0gICAgICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHZhcmlhYmxlVmFsdWVMYWJlbCwKLSAgICAgICAgICAgICAgICBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMTApKTsKLSAgICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHZhcmlhYmxlVmFsdWVGaWVsZCwKLSAgICAgICAgICAgICAgICBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscygxMCkpOwotICAgICAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotICAgICAgICBmb2xkZXJCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgZm9sZGVyQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgZm9sZGVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNlbGVjdEZvbGRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSA8Y29kZT5Gb3JtRGF0YTwvY29kZT4gb24gdGhlIHNwZWNpZmllZCBidXR0b24gdG8gYmUgb25lIHRoYXQgaXMKLSAgICAgKiBzcGFjZWQgZm9yIHRoZSBjdXJyZW50IGRpYWxvZyBwYWdlIHVuaXRzLiBUaGUgbWV0aG9kCi0gICAgICogPGNvZGU+aW5pdGlhbGl6ZURpYWxvZ1VuaXRzPC9jb2RlPiBtdXN0IGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBjYWxsaW5nIHRoaXMKLSAgICAgKiBtZXRob2QgZm9yIHRoZSBmaXJzdCB0aW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBidXR0b24gdGhlIGJ1dHRvbiB0byBzZXQgdGhlIDxjb2RlPkZvcm1EYXRhPC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkZvcm1EYXRhPC9jb2RlPiBzZXQgb24gdGhlIHNwZWNpZmllZCBidXR0b24KLSAgICAgKi8KLSAgICBwcml2YXRlIEZvcm1EYXRhIHNldEJ1dHRvbkZvcm1MYXlvdXREYXRhKEJ1dHRvbiBidXR0b24pIHsKLSAgICAgICAgRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICBpbnQgd2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotICAgICAgICBkYXRhLndpZHRoID0gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0gICAgICAgICAgICAgICAgU1dULkRFRkFVTFQsIHRydWUpLngpOwotICAgICAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlyZXMgdmFsaWRhdGlvbnMgKHZhcmlhYmxlIG5hbWUgZmlyc3QpIGFuZCB1cGRhdGVzIGVuYWJsZWQgc3RhdGUgZm9yIHRoZQotICAgICAqICJPayIgYnV0dG9uIGFjY29yZGluZ2x5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2YXJpYWJsZU5hbWVNb2RpZmllZCgpIHsKLSAgICAgICAgLy8gdXBkYXRlcyBhbmQgdmFsaWRhdGVzIHRoZSB2YXJpYWJsZSBuYW1lCi0gICAgICAgIHZhcmlhYmxlTmFtZSA9IHZhcmlhYmxlTmFtZUZpZWxkLmdldFRleHQoKTsKLSAgICAgICAgdmFsaWRhdGlvblN0YXR1cyA9IElNZXNzYWdlUHJvdmlkZXIuTk9ORTsKLSAgICAgICAgb2tCdXR0b24uc2V0RW5hYmxlZCh2YWxpZGF0ZVZhcmlhYmxlTmFtZSgpICYmIHZhbGlkYXRlVmFyaWFibGVWYWx1ZSgpKTsKLSAgICAgICAgbmFtZUVudGVyZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpcmVzIHZhbGlkYXRpb25zICh2YXJpYWJsZSB2YWx1ZSBmaXJzdCkgYW5kIHVwZGF0ZXMgZW5hYmxlZCBzdGF0ZSBmb3IgdGhlCi0gICAgICogIk9rIiBidXR0b24gYWNjb3JkaW5nbHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhcmlhYmxlVmFsdWVNb2RpZmllZCgpIHsKLSAgICAgICAgLy8gdXBkYXRlcyBhbmQgdmFsaWRhdGVzIHRoZSB2YXJpYWJsZSB2YWx1ZQotICAgICAgICB2YXJpYWJsZVZhbHVlID0gdmFyaWFibGVWYWx1ZUZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgIHZhbGlkYXRpb25TdGF0dXMgPSBJTWVzc2FnZVByb3ZpZGVyLk5PTkU7Ci0gICAgICAgIG9rQnV0dG9uLnNldEVuYWJsZWQodmFsaWRhdGVWYXJpYWJsZVZhbHVlKCkgJiYgdmFsaWRhdGVWYXJpYWJsZU5hbWUoKSk7Ci0gICAgICAgIGxvY2F0aW9uRW50ZXJlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYSBkaWFsb2cgd2hlcmUgdGhlIHVzZXIgY2FuIHNlbGVjdCBhIGZvbGRlciBwYXRoLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZWxlY3RGb2xkZXIoKSB7Ci0gICAgICAgIERpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgICBkaWFsb2cuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5QYXRoVmFyaWFibGVEaWFsb2dfc2VsZWN0Rm9sZGVyVGl0bGUpOwotICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5QYXRoVmFyaWFibGVEaWFsb2dfc2VsZWN0Rm9sZGVyTWVzc2FnZSk7Ci0gICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJQYXRoKHZhcmlhYmxlVmFsdWUpOwotICAgICAgICBTdHJpbmcgcmVzID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgaWYgKHJlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2YXJpYWJsZVZhbHVlID0gbmV3IFBhdGgocmVzKS5tYWtlQWJzb2x1dGUoKS50b09TU3RyaW5nKCk7Ci0gICAgICAgICAgICB2YXJpYWJsZVZhbHVlRmllbGQuc2V0VGV4dCh2YXJpYWJsZVZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIGEgZGlhbG9nIHdoZXJlIHRoZSB1c2VyIGNhbiBzZWxlY3QgYSBmaWxlIHBhdGguCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNlbGVjdEZpbGUoKSB7Ci0gICAgICAgIEZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGRpYWxvZy5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlBhdGhWYXJpYWJsZURpYWxvZ19zZWxlY3RGaWxlVGl0bGUpOwotICAgICAgICBkaWFsb2cuc2V0RmlsdGVyUGF0aCh2YXJpYWJsZVZhbHVlKTsKLSAgICAgICAgU3RyaW5nIHJlcyA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIGlmIChyZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgdmFyaWFibGVWYWx1ZSA9IG5ldyBQYXRoKHJlcykubWFrZUFic29sdXRlKCkudG9PU1N0cmluZygpOwotICAgICAgICAgICAgdmFyaWFibGVWYWx1ZUZpZWxkLnNldFRleHQodmFyaWFibGVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGJ1dHRvbnMgdG8gdGhpcyBkaWFsb2cncyBidXR0b24gYmFyLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0gICAgICAgIG9rQnV0dG9uLnNldEVuYWJsZWQodHlwZSA9PSBFWElTVElOR19WQVJJQUJMRSk7Ci0KLSAgICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0gICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGN1cnJlbnQgdmFyaWFibGUgbmFtZSwgYW5kIHVwZGF0ZXMgdGhpcyBkaWFsb2cncyBtZXNzYWdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlVmFyaWFibGVOYW1lKCkgewotICAgICAgICBib29sZWFuIGFsbG93RmluaXNoID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgdmFsaWRhdGlvblN0YXR1cyBpcyBFUlJPUiwgbm8gYWRkaXRpb25hbCB2YWxpZGF0aW9uIGFwcGxpZXMKLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdGF0dXMgPT0gSU1lc3NhZ2VQcm92aWRlci5FUlJPUikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBhc3N1bWVzIGV2ZXJ5dGhpbmcgd2lsbCBiZSBvawotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN0YW5kYXJkTWVzc2FnZTsKLSAgICAgICAgaW50IG5ld1ZhbGlkYXRpb25TdGF0dXMgPSBJTWVzc2FnZVByb3ZpZGVyLk5PTkU7Ci0KLSAgICAgICAgaWYgKHZhcmlhYmxlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyB0aGUgdmFyaWFibGUgbmFtZSBpcyBlbXB0eQotICAgICAgICAgICAgaWYgKG5hbWVFbnRlcmVkKSB7Ci0gICAgICAgICAgICAgICAgLy8gYSBuYW1lIHdhcyBlbnRlcmVkIGJlZm9yZSBhbmQgaXMgbm93IGVtcHR5Ci0gICAgICAgICAgICAgICAgbmV3VmFsaWRhdGlvblN0YXR1cyA9IElNZXNzYWdlUHJvdmlkZXIuRVJST1I7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlBhdGhWYXJpYWJsZURpYWxvZ192YXJpYWJsZU5hbWVFbXB0eU1lc3NhZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IHBhdGhWYXJpYWJsZU1hbmFnZXIudmFsaWRhdGVOYW1lKHZhcmlhYmxlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoIXN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGUgdmFyaWFibGUgbmFtZSBpcyBub3QgdmFsaWQKLSAgICAgICAgICAgICAgICBuZXdWYWxpZGF0aW9uU3RhdHVzID0gSU1lc3NhZ2VQcm92aWRlci5FUlJPUjsKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZXNJblVzZS5jb250YWlucyh2YXJpYWJsZU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICYmICF2YXJpYWJsZU5hbWUuZXF1YWxzKG9yaWdpbmFsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGUgdmFyaWFibGUgbmFtZSBpcyBhbHJlYWR5IGluIHVzZQotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5QYXRoVmFyaWFibGVEaWFsb2dfdmFyaWFibGVBbHJlYWR5RXhpc3RzTWVzc2FnZTsKLSAgICAgICAgICAgICAgICBuZXdWYWxpZGF0aW9uU3RhdHVzID0gSU1lc3NhZ2VQcm92aWRlci5FUlJPUjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWxsb3dGaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb3ZlcndyaXRlIHRoZSBjdXJyZW50IHZhbGlkYXRpb24gc3RhdHVzIC8gbWVzc2FnZSBvbmx5IGlmIGV2ZXJ5dGhpbmcgaXMgb2sgKGNsZWFyaW5nIHRoZW0pCi0gICAgICAgIC8vIG9yIGlmIHdlIGhhdmUgYSBtb3JlIHNlcmlvdXMgcHJvYmxlbSB0aGFuIHRoZSBjdXJyZW50IG9uZQotICAgICAgICBpZiAodmFsaWRhdGlvblN0YXR1cyA9PSBJTWVzc2FnZVByb3ZpZGVyLk5PTkUKLSAgICAgICAgICAgICAgICB8fCBuZXdWYWxpZGF0aW9uU3RhdHVzID09IElNZXNzYWdlUHJvdmlkZXIuRVJST1IpIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdGF0dXMgPSBuZXdWYWxpZGF0aW9uU3RhdHVzOwotICAgICAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICB9Ci0gICAgICAgIC8vIG9ubHkgc2V0IHRoZSBtZXNzYWdlIGhlcmUgaWYgaXQgaXMgbm90IGdvaW5nIHRvIGJlIHNldCBpbiAKLSAgICAgICAgLy8gdmFsaWRhdGVWYXJpYWJsZVZhbHVlIHRvIGF2b2lkIGZsYXNoaW5nLgotICAgICAgICBpZiAoYWxsb3dGaW5pc2ggPT0gZmFsc2UpCi0gICAgICAgICAgICBzZXRNZXNzYWdlKHZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGF0aW9uU3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIGFsbG93RmluaXNoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgY3VycmVudCB2YXJpYWJsZSB2YWx1ZSwgYW5kIHVwZGF0ZXMgdGhpcyBkaWFsb2cncyBtZXNzYWdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVZhcmlhYmxlVmFsdWUoKSB7Ci0gICAgICAgIGJvb2xlYW4gYWxsb3dGaW5pc2ggPSBmYWxzZTsKLQotICAgICAgICAvLyBpZiB0aGUgY3VycmVudCB2YWxpZGF0aW9uU3RhdHVzIGlzIEVSUk9SLCBubyBhZGRpdGlvbmFsIHZhbGlkYXRpb24gYXBwbGllcwotICAgICAgICBpZiAodmFsaWRhdGlvblN0YXR1cyA9PSBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vIGFzc3VtZXMgZXZlcnl0aGluZyB3aWxsIGJlIG9rCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3RhbmRhcmRNZXNzYWdlOwotICAgICAgICBpbnQgbmV3VmFsaWRhdGlvblN0YXR1cyA9IElNZXNzYWdlUHJvdmlkZXIuTk9ORTsKLQotICAgICAgICBpZiAodmFyaWFibGVWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyB0aGUgdmFyaWFibGUgdmFsdWUgaXMgZW1wdHkKLSAgICAgICAgICAgIGlmIChsb2NhdGlvbkVudGVyZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBhIGxvY2F0aW9uIHZhbHVlIHdhcyBlbnRlcmVkIGJlZm9yZSBhbmQgaXMgbm93IGVtcHR5Ci0gICAgICAgICAgICAgICAgbmV3VmFsaWRhdGlvblN0YXR1cyA9IElNZXNzYWdlUHJvdmlkZXIuRVJST1I7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlBhdGhWYXJpYWJsZURpYWxvZ192YXJpYWJsZVZhbHVlRW1wdHlNZXNzYWdlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFQYXRoLkVNUFRZLmlzVmFsaWRQYXRoKHZhcmlhYmxlVmFsdWUpKSB7Ci0gICAgICAgICAgICAvLyB0aGUgdmFyaWFibGUgdmFsdWUgaXMgYW4gaW52YWxpZCBwYXRoCi0gICAgICAgICAgICBtZXNzYWdlID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUGF0aFZhcmlhYmxlRGlhbG9nX3ZhcmlhYmxlVmFsdWVJbnZhbGlkTWVzc2FnZTsKLSAgICAgICAgICAgIG5ld1ZhbGlkYXRpb25TdGF0dXMgPSBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SOwotICAgICAgICB9IGVsc2UgaWYgKCFuZXcgUGF0aCh2YXJpYWJsZVZhbHVlKS5pc0Fic29sdXRlKCkpIHsKLSAgICAgICAgICAgIC8vIHRoZSB2YXJpYWJsZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIHBhdGgKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5QYXRoVmFyaWFibGVEaWFsb2dfcGF0aElzUmVsYXRpdmVNZXNzYWdlOwotICAgICAgICAgICAgbmV3VmFsaWRhdGlvblN0YXR1cyA9IElNZXNzYWdlUHJvdmlkZXIuRVJST1I7Ci0gICAgICAgIH0gZWxzZSBpZiAoIUlERVJlc291cmNlSW5mb1V0aWxzLmV4aXN0cyh2YXJpYWJsZVZhbHVlKSkgewotICAgICAgICAgICAgLy8gdGhlIHBhdGggZG9lcyBub3QgZXhpc3QgKHdhcm5pbmcpCi0gICAgICAgICAgICBtZXNzYWdlID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUGF0aFZhcmlhYmxlRGlhbG9nX3BhdGhEb2VzTm90RXhpc3RNZXNzYWdlOwotICAgICAgICAgICAgbmV3VmFsaWRhdGlvblN0YXR1cyA9IElNZXNzYWdlUHJvdmlkZXIuV0FSTklORzsKLSAgICAgICAgICAgIGFsbG93RmluaXNoID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFsbG93RmluaXNoID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG92ZXJ3cml0ZSB0aGUgY3VycmVudCB2YWxpZGF0aW9uIHN0YXR1cyAvIG1lc3NhZ2Ugb25seSBpZiBldmVyeXRoaW5nIGlzIG9rIChjbGVhcmluZyB0aGVtKQotICAgICAgICAvLyBvciBpZiB3ZSBoYXZlIGEgbW9yZSBzZXJpb3VzIHByb2JsZW0gdGhhbiB0aGUgY3VycmVudCBvbmUKLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdGF0dXMgPT0gSU1lc3NhZ2VQcm92aWRlci5OT05FCi0gICAgICAgICAgICAgICAgfHwgbmV3VmFsaWRhdGlvblN0YXR1cyA+IHZhbGlkYXRpb25TdGF0dXMpIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdGF0dXMgPSBuZXdWYWxpZGF0aW9uU3RhdHVzOwotICAgICAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICB9Ci0gICAgICAgIHNldE1lc3NhZ2UodmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkYXRpb25TdGF0dXMpOwotICAgICAgICByZXR1cm4gYWxsb3dGaW5pc2g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFyaWFibGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYWJsZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFyaWFibGUgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFyaWFibGUgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmxlVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYWJsZVZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhcmlhYmxlIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhcmlhYmxlTmFtZSB0aGUgbmV3IHZhcmlhYmxlIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZU5hbWUoU3RyaW5nIHZhcmlhYmxlTmFtZSkgewotICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZSA9IHZhcmlhYmxlTmFtZS50cmltKCk7Ci0gICAgICAgIHRoaXMub3JpZ2luYWxOYW1lID0gdGhpcy52YXJpYWJsZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFyaWFibGUgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhcmlhYmxlVmFsdWUgdGhlIG5ldyB2YXJpYWJsZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhcmlhYmxlVmFsdWUoU3RyaW5nIHZhcmlhYmxlVmFsdWUpIHsKLSAgICAgICAgdGhpcy52YXJpYWJsZVZhbHVlID0gdmFyaWFibGVWYWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9QYXRoVmFyaWFibGVzR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9QYXRoVmFyaWFibGVzR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyMGI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUGF0aFZhcmlhYmxlc0dyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUGF0aFZhcmlhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIEEgd2lkZ2V0IGdyb3VwIHRoYXQgZGlzcGxheXMgcGF0aCB2YXJpYWJsZXMuIAotICogSW5jbHVkZXMgYnV0dG9ucyB0byBlZGl0LCByZW1vdmUgZXhpc3RpbmcgdmFyaWFibGVzIGFuZCBjcmVhdGUgbmV3IG9uZXMuCi0gKiAKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIFBhdGhWYXJpYWJsZXNHcm91cCB7Ci0gICAgLyoqCi0gICAgICogU2ltcGxlIGRhdGEgc3RydWN0dXJlIHRoYXQgaG9sZHMgYSBwYXRoIHZhcmlhYmxlIG5hbWUvdmFsdWUgcGFpci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhdGhWYXJpYWJsZUVsZW1lbnQgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBwYXRoIG9mIHRoZSBlbGVtZW50LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIElQYXRoIHBhdGg7Ci0gICAgfQotCi0gICAgLy8gc2l6aW5nIGNvbnN0YW50cwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfU0VMRUNUSU9OX1BBTkVfV0lEVEggPSA0MDA7Ci0KLSAgICAvLyBwYXJlbnQgc2hlbGwKLSAgICBwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0gICAgcHJpdmF0ZSBMYWJlbCB2YXJpYWJsZUxhYmVsOwotCi0gICAgcHJpdmF0ZSBUYWJsZSB2YXJpYWJsZVRhYmxlOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZWRpdEJ1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQotICAgIC8vIHVzZWQgdG8gY29tcHV0ZSBsYXlvdXQgc2l6ZXMKLSAgICBwcml2YXRlIEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzOwotCi0gICAgLy8gY3JlYXRlIGEgbXVsdGkgc2VsZWN0IHRhYmxlCi0gICAgcHJpdmF0ZSBib29sZWFuIG11bHRpU2VsZWN0OwotCi0gICAgLy8gSVJlc291cmNlLkZJTEUgYW5kL29yIElSZXNvdXJjZS5GT0xERVIKLSAgICBwcml2YXRlIGludCB2YXJpYWJsZVR5cGU7Ci0KLSAgICAvLyBFeHRlcm5hbCBsaXN0ZW5lciBjYWxsZWQgd2hlbiB0aGUgdGFibGUgc2VsZWN0aW9uIGNoYW5nZXMKLSAgICBwcml2YXRlIExpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyOwotCi0gICAgLy8gdGVtcG9yYXJ5IGNvbGxlY3Rpb24gZm9yIGtlZXBpbmcgY3VycmVudGx5IGRlZmluZWQgdmFyaWFibGVzCi0gICAgcHJpdmF0ZSBTb3J0ZWRNYXAgdGVtcFBhdGhWYXJpYWJsZXM7Ci0KLSAgICAvLyBzZXQgb2YgcmVtb3ZlZCB2YXJpYWJsZXMnIG5hbWVzCi0gICAgcHJpdmF0ZSBTZXQgcmVtb3ZlZFZhcmlhYmxlTmFtZXM7Ci0KLSAgICAvLyByZWZlcmVuY2UgdG8gdGhlIHdvcmtzcGFjZSdzIHBhdGggdmFyaWFibGUgbWFuYWdlcgotICAgIHByaXZhdGUgSVBhdGhWYXJpYWJsZU1hbmFnZXIgcGF0aFZhcmlhYmxlTWFuYWdlcjsKLQotICAgIC8vIGZpbGUgaW1hZ2UKLSAgICBwcml2YXRlIGZpbmFsIEltYWdlIEZJTEVfSU1HID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKQotICAgICAgICAgICAgLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GSUxFKTsKLQotICAgIC8vIGZvbGRlciBpbWFnZQotICAgIHByaXZhdGUgZmluYWwgSW1hZ2UgRk9MREVSX0lNRyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgIC5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpfRk9MREVSKTsKLQotICAgIC8vIHVua25vd24gKG5vbi1leGlzdGVudCkgaW1hZ2UuIGNyZWF0ZWQgbG9jYWxseSwgZGlzcG9zZSBsb2NhbGx5Ci0gICAgcHJpdmF0ZSBJbWFnZSBpbWFnZVVua293bjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgUGF0aFZhcmlhYmxlc0dyb3VwLgotICAgICAqCi0gICAgICogQHBhcmFtIG11bHRpU2VsZWN0IGNyZWF0ZSBhIG11bHRpIHNlbGVjdCB0cmVlCi0gICAgICogQHBhcmFtIHZhcmlhYmxlVHlwZSB0aGUgdHlwZSBvZiB2YXJpYWJsZXMgdGhhdCBhcmUgZGlzcGxheWVkIGluIAotICAgICAqIAl0aGUgd2lkZ2V0IGdyb3VwLiA8Y29kZT5JUmVzb3VyY2UuRklMRTwvY29kZT4gYW5kL29yIDxjb2RlPklSZXNvdXJjZS5GT0xERVI8L2NvZGU+Ci0gICAgICogCWxvZ2ljYWxseSBPUmVkIHRvZ2V0aGVyLgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoVmFyaWFibGVzR3JvdXAoYm9vbGVhbiBtdWx0aVNlbGVjdCwgaW50IHZhcmlhYmxlVHlwZSkgewotICAgICAgICB0aGlzLm11bHRpU2VsZWN0ID0gbXVsdGlTZWxlY3Q7Ci0gICAgICAgIHRoaXMudmFyaWFibGVUeXBlID0gdmFyaWFibGVUeXBlOwotICAgICAgICBwYXRoVmFyaWFibGVNYW5hZ2VyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpCi0gICAgICAgICAgICAgICAgLmdldFBhdGhWYXJpYWJsZU1hbmFnZXIoKTsKLSAgICAgICAgcmVtb3ZlZFZhcmlhYmxlTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICB0ZW1wUGF0aFZhcmlhYmxlcyA9IG5ldyBUcmVlTWFwKCk7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgaW50ZXJuYWwgbW9kZWwKLSAgICAgICAgaW5pdFRlbXBvcmFyeVN0YXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBQYXRoVmFyaWFibGVzR3JvdXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXVsdGlTZWxlY3QgY3JlYXRlIGEgbXVsdGkgc2VsZWN0IHRyZWUKLSAgICAgKiBAcGFyYW0gdmFyaWFibGVUeXBlIHRoZSB0eXBlIG9mIHZhcmlhYmxlcyB0aGF0IGFyZSBkaXNwbGF5ZWQgaW4gCi0gICAgICogCXRoZSB3aWRnZXQgZ3JvdXAuIDxjb2RlPklSZXNvdXJjZS5GSUxFPC9jb2RlPiBhbmQvb3IgPGNvZGU+SVJlc291cmNlLkZPTERFUjwvY29kZT4KLSAgICAgKiAJbG9naWNhbGx5IE9SZWQgdG9nZXRoZXIuCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIG5vdGlmaWVkIHdoZW4gdGhlIHNlbGVjdGlvbiBjaGFuZ2VzCi0gICAgICogCWluIHRoZSB2YXJpYWJsZXMgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aFZhcmlhYmxlc0dyb3VwKGJvb2xlYW4gbXVsdGlTZWxlY3QsIGludCB2YXJpYWJsZVR5cGUsCi0gICAgICAgICAgICBMaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotICAgICAgICB0aGlzKG11bHRpU2VsZWN0LCB2YXJpYWJsZVR5cGUpOwotICAgICAgICB0aGlzLnNlbGVjdGlvbkxpc3RlbmVyID0gc2VsZWN0aW9uTGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYSBkaWFsb2cgZm9yIGNyZWF0aW5nIGEgbmV3IHZhcmlhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGROZXdWYXJpYWJsZSgpIHsKLSAgICAgICAgLy8gY29uc3RydWN0cyBhIGRpYWxvZyBmb3IgZWRpdGluZyB0aGUgbmV3IHZhcmlhYmxlJ3MgY3VycmVudCBuYW1lIGFuZCB2YWx1ZQotICAgICAgICBQYXRoVmFyaWFibGVEaWFsb2cgZGlhbG9nID0gbmV3IFBhdGhWYXJpYWJsZURpYWxvZyhzaGVsbCwKLSAgICAgICAgICAgICAgICBQYXRoVmFyaWFibGVEaWFsb2cuTkVXX1ZBUklBQkxFLCB2YXJpYWJsZVR5cGUsCi0gICAgICAgICAgICAgICAgcGF0aFZhcmlhYmxlTWFuYWdlciwgdGVtcFBhdGhWYXJpYWJsZXMua2V5U2V0KCkpOwotCi0gICAgICAgIC8vIG9wZW5zIHRoZSBkaWFsb2cgLSBqdXN0IHJldHVybnMgaWYgdGhlIHVzZXIgY2FuY2VscyBpdAotICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIG90aGVyd2lzZSwgYWRkcyB0aGUgbmV3IHZhcmlhYmxlIChvciB1cGRhdGVzIGFuIGV4aXN0aW5nIG9uZSkgaW4gdGhlCi0gICAgICAgIC8vIHRlbXBvcmFyeSBjb2xsZWN0aW9uIG9mIGN1cnJlbnRseSBkZWZpbmVkIHZhcmlhYmxlcwotICAgICAgICBTdHJpbmcgbmV3VmFyaWFibGVOYW1lID0gZGlhbG9nLmdldFZhcmlhYmxlTmFtZSgpOwotICAgICAgICBJUGF0aCBuZXdWYXJpYWJsZVZhbHVlID0gbmV3IFBhdGgoZGlhbG9nLmdldFZhcmlhYmxlVmFsdWUoKSk7Ci0gICAgICAgIHRlbXBQYXRoVmFyaWFibGVzLnB1dChuZXdWYXJpYWJsZU5hbWUsIG5ld1ZhcmlhYmxlVmFsdWUpOwotCi0gICAgICAgIC8vIHRoZSBVSSBtdXN0IGJlIHVwZGF0ZWQKLSAgICAgICAgdXBkYXRlV2lkZ2V0U3RhdGUobmV3VmFyaWFibGVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB3aWRnZXQgZ3JvdXAuCi0gICAgICogQ2FsbGVycyBtdXN0IGNhbGwgPGNvZGU+ZGlzcG9zZTwvY29kZT4gd2hlbiB0aGUgZ3JvdXAgaXMgbm8gCi0gICAgICogbG9uZ2VyIG5lZWRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSB3aWRnZXQgcGFyZW50Ci0gICAgICogQHJldHVybiBjb250YWluZXIgb2YgdGhlIHdpZGdldHMgCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCi0gICAgICAgIGlmIChpbWFnZVVua293biA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4KLSAgICAgICAgICAgICAgICAgICAgLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRubCQvaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpbWFnZVVua293biA9IGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLSAgICAgICAgc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQotICAgICAgICAvLyBkZWZpbmUgY29udGFpbmVyICYgaXRzIGxheW91dAotICAgICAgICBDb21wb3NpdGUgcGFnZUNvbXBvbmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgcGFnZUNvbXBvbmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IFNJWklOR19TRUxFQ1RJT05fUEFORV9XSURUSDsKLSAgICAgICAgcGFnZUNvbXBvbmVudC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBwYWdlQ29tcG9uZW50LnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgLy8gbGF5b3V0IHRoZSB0YWJsZSAmIGl0cyBidXR0b25zCi0gICAgICAgIHZhcmlhYmxlTGFiZWwgPSBuZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULkxFRlQpOwotICAgICAgICB2YXJpYWJsZUxhYmVsLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuUGF0aFZhcmlhYmxlc0Jsb2NrX3ZhcmlhYmxlc0xhYmVsKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgdmFyaWFibGVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICB2YXJpYWJsZUxhYmVsLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgaW50IHRhYmxlU3R5bGUgPSBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OOwotICAgICAgICBpZiAobXVsdGlTZWxlY3QpIHsKLSAgICAgICAgICAgIHRhYmxlU3R5bGUgfD0gU1dULk1VTFRJOwotICAgICAgICB9Ci0gICAgICAgIHZhcmlhYmxlVGFibGUgPSBuZXcgVGFibGUocGFnZUNvbXBvbmVudCwgdGFibGVTdHlsZSk7Ci0gICAgICAgIHZhcmlhYmxlVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRW5hYmxlZFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkxpc3RlbmVyLmhhbmRsZUV2ZW50KG5ldyBFdmVudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZGF0YS5oZWlnaHRIaW50ID0gdmFyaWFibGVUYWJsZS5nZXRJdGVtSGVpZ2h0KCkgKiA3OwotICAgICAgICB2YXJpYWJsZVRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHZhcmlhYmxlVGFibGUuc2V0Rm9udChmb250KTsKLQotICAgICAgICBjcmVhdGVCdXR0b25Hcm91cChwYWdlQ29tcG9uZW50KTsKLSAgICAgICAgLy8gcG9wdWxhdGUgdGFibGUgd2l0aCBjdXJyZW50IGludGVybmFsIHN0YXRlIGFuZCBzZXQgYnV0dG9ucycgaW5pdGlhbCBzdGF0ZQotICAgICAgICB1cGRhdGVXaWRnZXRTdGF0ZShudWxsKTsKLQotICAgICAgICByZXR1cm4gcGFnZUNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlcyB0aGUgZ3JvdXAncyByZXNvdXJjZXMuIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChpbWFnZVVua293biAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbWFnZVVua293bi5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBpbWFnZVVua293biA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhIGRpYWxvZyBmb3IgZWRpdGluZyBhbiBleGlzdGluZyB2YXJpYWJsZS4KLSAgICAgKgotICAgICAqIEBzZWUgUGF0aFZhcmlhYmxlRGlhbG9nCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVkaXRTZWxlY3RlZFZhcmlhYmxlKCkgewotICAgICAgICAvLyByZXRyaWV2ZXMgdGhlIG5hbWUgYW5kIHZhbHVlIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZhcmlhYmxlCi0gICAgICAgIFRhYmxlSXRlbSBpdGVtID0gdmFyaWFibGVUYWJsZS5nZXRJdGVtKHZhcmlhYmxlVGFibGUKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0gICAgICAgIFN0cmluZyB2YXJpYWJsZU5hbWUgPSAoU3RyaW5nKSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgSVBhdGggdmFyaWFibGVWYWx1ZSA9IChJUGF0aCkgdGVtcFBhdGhWYXJpYWJsZXMuZ2V0KHZhcmlhYmxlTmFtZSk7Ci0KLSAgICAgICAgLy8gY29uc3RydWN0cyBhIGRpYWxvZyBmb3IgZWRpdGluZyB0aGUgdmFyaWFibGUncyBjdXJyZW50IG5hbWUgYW5kIHZhbHVlCi0gICAgICAgIFBhdGhWYXJpYWJsZURpYWxvZyBkaWFsb2cgPSBuZXcgUGF0aFZhcmlhYmxlRGlhbG9nKHNoZWxsLAotICAgICAgICAgICAgICAgIFBhdGhWYXJpYWJsZURpYWxvZy5FWElTVElOR19WQVJJQUJMRSwgdmFyaWFibGVUeXBlLAotICAgICAgICAgICAgICAgIHBhdGhWYXJpYWJsZU1hbmFnZXIsIHRlbXBQYXRoVmFyaWFibGVzLmtleVNldCgpKTsKLSAgICAgICAgZGlhbG9nLnNldFZhcmlhYmxlTmFtZSh2YXJpYWJsZU5hbWUpOwotICAgICAgICBkaWFsb2cuc2V0VmFyaWFibGVWYWx1ZSh2YXJpYWJsZVZhbHVlLnRvT1NTdHJpbmcoKSk7Ci0KLSAgICAgICAgLy8gb3BlbnMgdGhlIGRpYWxvZyAtIGp1c3QgcmV0dXJucyBpZiB0aGUgdXNlciBjYW5jZWxzIGl0Ci0gICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gdGhlIG5hbWUgY2FuIGJlIGNoYW5nZWQsIHNvIHdlIHJlbW92ZSB0aGUgY3VycmVudCB2YXJpYWJsZSBkZWZpbml0aW9uLi4uCi0gICAgICAgIHJlbW92ZWRWYXJpYWJsZU5hbWVzLmFkZCh2YXJpYWJsZU5hbWUpOwotICAgICAgICB0ZW1wUGF0aFZhcmlhYmxlcy5yZW1vdmUodmFyaWFibGVOYW1lKTsKLQotICAgICAgICBTdHJpbmcgbmV3VmFyaWFibGVOYW1lID0gZGlhbG9nLmdldFZhcmlhYmxlTmFtZSgpOwotICAgICAgICBJUGF0aCBuZXdWYXJpYWJsZVZhbHVlID0gbmV3IFBhdGgoZGlhbG9nLmdldFZhcmlhYmxlVmFsdWUoKSk7Ci0KLSAgICAgICAgLy8gYW5kIGFkZCBpdCBhZ2FpbiAobWF5YmUgd2l0aCBhIGRpZmZlcmVudCBuYW1lKQotICAgICAgICB0ZW1wUGF0aFZhcmlhYmxlcy5wdXQobmV3VmFyaWFibGVOYW1lLCBuZXdWYXJpYWJsZVZhbHVlKTsKLQotICAgICAgICAvLyBub3cgd2UgbXVzdCByZWZyZXNoIHRoZSBVSSBzdGF0ZQotICAgICAgICB1cGRhdGVXaWRnZXRTdGF0ZShuZXdWYXJpYWJsZU5hbWUpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgZ3JvdXAncyB3aWRnZXRzLgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgCi0gICAgICogPGNvZGU+Y3JlYXRlQ29udGVudHM8L2NvZGU+LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgZ3JvdXAncyB3aWRnZXRzLgotICAgICAqIAkgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgPGNvZGU+Y3JlYXRlQ29udGVudHM8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEVuYWJsZWQoKSB7Ci0gICAgICAgIGlmICh2YXJpYWJsZVRhYmxlICE9IG51bGwgJiYgIXZhcmlhYmxlVGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFyaWFibGVUYWJsZS5nZXRFbmFibGVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgdmFyaWFibGVzLgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3RlZCB2YXJpYWJsZXMuIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgCi0gICAgICogCXRoZSB3aWRnZXQgZ3JvdXAgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0IGJ5IGNhbGxpbmcgCi0gICAgICogCTxjb2RlPmNyZWF0ZUNvbnRlbnRzPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoVmFyaWFibGVFbGVtZW50W10gZ2V0U2VsZWN0aW9uKCkgewotICAgICAgICBpZiAodmFyaWFibGVUYWJsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBhdGhWYXJpYWJsZUVsZW1lbnRbMF07Ci0gICAgICAgIH0KLSAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB2YXJpYWJsZVRhYmxlLmdldFNlbGVjdGlvbigpOwotICAgICAgICBQYXRoVmFyaWFibGVFbGVtZW50W10gc2VsZWN0aW9uID0gbmV3IFBhdGhWYXJpYWJsZUVsZW1lbnRbaXRlbXMubGVuZ3RoXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0ZW1zW2ldLmdldERhdGEoKTsKLSAgICAgICAgICAgIHNlbGVjdGlvbltpXSA9IG5ldyBQYXRoVmFyaWFibGVFbGVtZW50KCk7Ci0gICAgICAgICAgICBzZWxlY3Rpb25baV0ubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICBzZWxlY3Rpb25baV0ucGF0aCA9IChJUGF0aCkgdGVtcFBhdGhWYXJpYWJsZXMuZ2V0KG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYWRkL2VkaXQvcmVtb3ZlIGJ1dHRvbnMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSB3aWRnZXQgcGFyZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgQ29tcG9zaXRlIGdyb3VwQ29tcG9uZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBncm91cExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGdyb3VwTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgZ3JvdXBMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgZ3JvdXBDb21wb25lbnQuc2V0TGF5b3V0KGdyb3VwTGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZ3JvdXBDb21wb25lbnQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgZ3JvdXBDb21wb25lbnQuc2V0Rm9udChmb250KTsKLQotICAgICAgICBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwQ29tcG9uZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGFkZEJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlBhdGhWYXJpYWJsZXNCbG9ja19hZGRWYXJpYWJsZUJ1dHRvbik7Ci0gICAgICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBhZGROZXdWYXJpYWJsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYWRkQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIHNldEJ1dHRvbkxheW91dERhdGEoYWRkQnV0dG9uKTsKLQotICAgICAgICBlZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihncm91cENvbXBvbmVudCwgU1dULlBVU0gpOwotICAgICAgICBlZGl0QnV0dG9uLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuUGF0aFZhcmlhYmxlc0Jsb2NrX2VkaXRWYXJpYWJsZUJ1dHRvbik7Ci0gICAgICAgIGVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZWRpdFNlbGVjdGVkVmFyaWFibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGVkaXRCdXR0b24uc2V0Rm9udChmb250KTsKLSAgICAgICAgc2V0QnV0dG9uTGF5b3V0RGF0YShlZGl0QnV0dG9uKTsKLQotICAgICAgICByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwQ29tcG9uZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlBhdGhWYXJpYWJsZXNCbG9ja19yZW1vdmVWYXJpYWJsZUJ1dHRvbik7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVTZWxlY3RlZFZhcmlhYmxlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIHNldEJ1dHRvbkxheW91dERhdGEocmVtb3ZlQnV0dG9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgY29tcHV0YXRpb24gb2YgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGlhbG9nIHVuaXRzCi0gICAgICogYmFzZWQgb24gdGhlIHNpemUgb2YgY3VycmVudCBmb250LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSA8Y29kZT5zZXRCdXR0b25MYXlvdXREYXRhPC9jb2RlPiAKLSAgICAgKiBpcyBjYWxsZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRyb2wgYSBjb250cm9sIGZyb20gd2hpY2ggdG8gb2J0YWluIHRoZSBjdXJyZW50IGZvbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCBjb250cm9sKSB7Ci0gICAgICAgIC8vIENvbXB1dGUgYW5kIHN0b3JlIGEgZm9udCBtZXRyaWMKLSAgICAgICAgR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7Ci0gICAgICAgIGdjLnNldEZvbnQoY29udHJvbC5nZXRGb250KCkpOwotICAgICAgICBmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0gICAgICAgIGdjLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAoUmUtKUluaXRpYWxpemUgY29sbGVjdGlvbnMgdXNlZCB0byBtYW50YWluIHRlbXBvcmFyeSB2YXJpYWJsZSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdFRlbXBvcmFyeVN0YXRlKCkgewotICAgICAgICBTdHJpbmdbXSB2YXJOYW1lcyA9IHBhdGhWYXJpYWJsZU1hbmFnZXIuZ2V0UGF0aFZhcmlhYmxlTmFtZXMoKTsKLQotICAgICAgICB0ZW1wUGF0aFZhcmlhYmxlcy5jbGVhcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhck5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJUGF0aCB2YWx1ZSA9IHBhdGhWYXJpYWJsZU1hbmFnZXIuZ2V0VmFsdWUodmFyTmFtZXNbaV0pOwotCi0gICAgICAgICAgICAvLyB0aGUgdmFsdWUgbWF5IG5vdCBleGlzdCBhbnkgbW9yZQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzRmlsZSA9IHZhbHVlLnRvRmlsZSgpLmlzRmlsZSgpOwotICAgICAgICAgICAgICAgIGlmICgoaXNGaWxlICYmICh2YXJpYWJsZVR5cGUgJiBJUmVzb3VyY2UuRklMRSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpc0ZpbGUgPT0gZmFsc2UgJiYgKHZhcmlhYmxlVHlwZSAmIElSZXNvdXJjZS5GT0xERVIpICE9IDApKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgdGVtcFBhdGhWYXJpYWJsZXMucHV0KHZhck5hbWVzW2ldLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJlbW92ZWRWYXJpYWJsZU5hbWVzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyBidXR0b24gZW5hYmxlZCBzdGF0ZSwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgY3VycmVudGx5IHNlbGVjdGVkCi0gICAgICogdmFyaWFibGVzIGluIHRoZSB0YWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlKCkgewotICAgICAgICBpbnQgaXRlbXNTZWxlY3RlZENvdW50ID0gdmFyaWFibGVUYWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpOwotICAgICAgICBlZGl0QnV0dG9uLnNldEVuYWJsZWQoaXRlbXNTZWxlY3RlZENvdW50ID09IDEpOwotICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChpdGVtc1NlbGVjdGVkQ291bnQgPiAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWJ1aWxkcyB0YWJsZSB3aWRnZXQgc3RhdGUgd2l0aCB0aGUgY3VycmVudCBsaXN0IG9mIHZhcmlhYmxlcyAocmVmbGVjdGluZwotICAgICAqIGFueSBjaGFuZ2VzLCBhZGRpdGlvbnMgYW5kIHJlbW92YWxzKSwgYW5kIHNlbGVjdHMgdGhlIGl0ZW0gY29ycmVzcG9uZGluZyB0bwotICAgICAqIHRoZSBnaXZlbiB2YXJpYWJsZSBuYW1lLiBJZiB0aGUgdmFyaWFibGUgbmFtZSBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlCi0gICAgICogZmlyc3QgaXRlbSAoaWYgYW55KSB3aWxsIGJlIHNlbGVjdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWxlY3RlZFZhck5hbWUgdGhlIG5hbWUgZm9yIHRoZSB2YXJpYWJsZSB0byBiZSBzZWxlY3RlZCAobWF5IGJlCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4pCi0gICAgICogQHNlZSBJUGF0aFZhcmlhYmxlTWFuYWdlciNnZXRQYXRoVmFyaWFibGVOYW1lcygpCi0gICAgICogQHNlZSBJUGF0aFZhcmlhYmxlTWFuYWdlciNnZXRWYWx1ZShTdHJpbmcpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVZhcmlhYmxlVGFibGUoU3RyaW5nIHNlbGVjdGVkVmFyTmFtZSkgewotICAgICAgICB2YXJpYWJsZVRhYmxlLnJlbW92ZUFsbCgpOwotICAgICAgICBpbnQgc2VsZWN0ZWRWYXJJbmRleCA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgdmFyTmFtZXMgPSB0ZW1wUGF0aFZhcmlhYmxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyB2YXJOYW1lcwotICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odmFyaWFibGVUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSAoU3RyaW5nKSB2YXJOYW1lcy5uZXh0KCk7Ci0gICAgICAgICAgICBJUGF0aCB2YWx1ZSA9IChJUGF0aCkgdGVtcFBhdGhWYXJpYWJsZXMuZ2V0KHZhck5hbWUpOwotICAgICAgICAgICAgSUZpbGVJbmZvIGZpbGUgPSBJREVSZXNvdXJjZUluZm9VdGlscy5nZXRGaWxlSW5mbyh2YWx1ZSk7Ci0KLSAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCh2YXJOYW1lICsgIiAtICIgKyB2YWx1ZS50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIAotICAgICAgICAgICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBpcyBzdG9yZWQgaW4gZWFjaCB0YWJsZSB3aWRnZXQgaXRlbQotICAgICAgICAgICAgaXRlbS5zZXREYXRhKHZhck5hbWUpOwotICAgICAgICAgICAgaXRlbS5zZXRJbWFnZShmaWxlLmV4aXN0cygpID8gKGZpbGUuaXNEaXJlY3RvcnkoKSA/IEZPTERFUl9JTUcgCi0gICAgICAgICAgICAgICAgICAgIDogRklMRV9JTUcgKSA6IGltYWdlVW5rb3duKTsKLSAgICAgICAgICAgIGlmICh2YXJOYW1lLmVxdWFscyhzZWxlY3RlZFZhck5hbWUpKQotICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFySW5kZXggPSB2YXJpYWJsZVRhYmxlLmdldEl0ZW1Db3VudCgpIC0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFyaWFibGVUYWJsZS5nZXRJdGVtQ291bnQoKSA+IHNlbGVjdGVkVmFySW5kZXgpIHsKLSAgICAgICAgICAgIHZhcmlhYmxlVGFibGUuc2V0U2VsZWN0aW9uKHNlbGVjdGVkVmFySW5kZXgpOwotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2VsZWN0aW9uTGlzdGVuZXIuaGFuZGxlRXZlbnQobmV3IEV2ZW50KCkpOwotICAgICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlVGFibGUuZ2V0SXRlbUNvdW50KCkgPT0gMAotICAgICAgICAgICAgICAgICYmIHNlbGVjdGlvbkxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICBzZWxlY3Rpb25MaXN0ZW5lci5oYW5kbGVFdmVudChuZXcgRXZlbnQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tbWl0cyB0aGUgdGVtcG9yYXJ5IHN0YXRlIHRvIHRoZSBwYXRoIHZhcmlhYmxlIG1hbmFnZXIgaW4gcmVzcG9uc2UgdG8gdXNlcgotICAgICAqIGNvbmZpcm1hdGlvbi4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgd2VyZSBubyBwcm9ibGVtcy4KLSAgICAgKiBAc2VlIElQYXRoVmFyaWFibGVNYW5hZ2VyI3NldFZhbHVlKFN0cmluZywgSVBhdGgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgcHJvY2VzcyByZW1vdmVkIHZhcmlhYmxlcyAgCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHJlbW92ZWQgPSByZW1vdmVkVmFyaWFibGVOYW1lcy5pdGVyYXRvcigpOyByZW1vdmVkCi0gICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlbW92ZWRWYXJpYWJsZU5hbWUgPSAoU3RyaW5nKSByZW1vdmVkLm5leHQoKTsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IHJlbW92ZXMgdmFyaWFibGVzIHRoYXQgaGF2ZSBub3QgYmVlbiBhZGRlZCBhZ2FpbgotICAgICAgICAgICAgICAgIGlmICghdGVtcFBhdGhWYXJpYWJsZXMuY29udGFpbnNLZXkocmVtb3ZlZFZhcmlhYmxlTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIHBhdGhWYXJpYWJsZU1hbmFnZXIuc2V0VmFsdWUocmVtb3ZlZFZhcmlhYmxlTmFtZSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRoZW4gcHJvY2VzcyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlcywgYWRkaW5nL3VwZGF0aW5nIHRoZW0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgY3VycmVudCA9IHRlbXBQYXRoVmFyaWFibGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGN1cnJlbnQubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YXJpYWJsZU5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBJUGF0aCB2YXJpYWJsZVZhbHVlID0gKElQYXRoKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHBhdGhWYXJpYWJsZU1hbmFnZXIuc2V0VmFsdWUodmFyaWFibGVOYW1lLCB2YXJpYWJsZVZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHJlLWluaXRpYWxpemUgdGVtcG9yYXJ5IHN0YXRlCi0gICAgICAgICAgICBpbml0VGVtcG9yYXJ5U3RhdGUoKTsKLQotICAgICAgICAgICAgLy8gcGVyZm9ybU9rIGFjY2VwdGVkCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBudWxsLCBudWxsLCBjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YXJpYWJsZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVNlbGVjdGVkVmFyaWFibGVzKCkgewotICAgICAgICAvLyByZW1vdmUgZWFjaCBzZWxlY3RlZCBlbGVtZW50Ci0gICAgICAgIGludFtdIHNlbGVjdGVkSW5kaWNlcyA9IHZhcmlhYmxlVGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGFibGVJdGVtIHNlbGVjdGVkSXRlbSA9IHZhcmlhYmxlVGFibGUuZ2V0SXRlbShzZWxlY3RlZEluZGljZXNbaV0pOwotICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSAoU3RyaW5nKSBzZWxlY3RlZEl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgcmVtb3ZlZFZhcmlhYmxlTmFtZXMuYWRkKHZhck5hbWUpOwotICAgICAgICAgICAgdGVtcFBhdGhWYXJpYWJsZXMucmVtb3ZlKHZhck5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVdpZGdldFN0YXRlKG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIDxjb2RlPkdyaWREYXRhPC9jb2RlPiBvbiB0aGUgc3BlY2lmaWVkIGJ1dHRvbiB0bwotICAgICAqIGJlIG9uZSB0aGF0IGlzIHNwYWNlZCBmb3IgdGhlIGN1cnJlbnQgZGlhbG9nIHBhZ2UgdW5pdHMuIFRoZQotICAgICAqIG1ldGhvZCA8Y29kZT5pbml0aWFsaXplRGlhbG9nVW5pdHM8L2NvZGU+IG11c3QgYmUgY2FsbGVkIG9uY2UKLSAgICAgKiBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCBmb3IgdGhlIGZpcnN0IHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnV0dG9uIHRoZSBidXR0b24gdG8gc2V0IHRoZSA8Y29kZT5HcmlkRGF0YTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5HcmlkRGF0YTwvY29kZT4gc2V0IG9uIHRoZSBzcGVjaWZpZWQgYnV0dG9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBHcmlkRGF0YSBzZXRCdXR0b25MYXlvdXREYXRhKEJ1dHRvbiBidXR0b24pIHsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgICAgICBpbnQgd2lkdGhIaW50ID0gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLAotICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLSAgICAgICAgICAgICAgICBTV1QuREVGQVVMVCwgdHJ1ZSkueCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBncm91cCdzIHdpZGdldHMuCi0gICAgICogRG9lcyBub3RoaW5nIGlmIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIDxjb2RlPmNyZWF0ZUNvbnRlbnRzPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW5hYmxlZCB0aGUgbmV3IGVuYWJsZWQgc3RhdGUgb2YgdGhlIGdyb3VwJ3Mgd2lkZ2V0cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIGlmICh2YXJpYWJsZVRhYmxlICE9IG51bGwgJiYgIXZhcmlhYmxlVGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICB2YXJpYWJsZUxhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgICAgICB2YXJpYWJsZVRhYmxlLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgICAgICBhZGRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgICAgIGlmIChlbmFibGVkKQotICAgICAgICAgICAgICAgIHVwZGF0ZUVuYWJsZWRTdGF0ZSgpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgd2lkZ2V0J3MgY3VycmVudCBzdGF0ZTogcmVmcmVzaGVzIHRoZSB0YWJsZSB3aXRoIHRoZSBjdXJyZW50IAotICAgICAqIGRlZmluZWQgdmFyaWFibGVzLCBzZWxlY3RzIHRoZSBpdGVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHZhcmlhYmxlIAotICAgICAqIChzZWxlY3RzIHRoZSBmaXJzdCBpdGVtIGlmIDxjb2RlPm51bGw8L2NvZGU+IGlzIHByb3ZpZGVkKSBhbmQgdXBkYXRlcyAKLSAgICAgKiB0aGUgZW5hYmxlZCBzdGF0ZSBmb3IgdGhlIEFkZC9SZW1vdmUvRWRpdCBidXR0b25zLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWxlY3RlZFZhck5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNlbGVjdGVkIChtYXkgYmUgbnVsbCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlV2lkZ2V0U3RhdGUoU3RyaW5nIHNlbGVjdGVkVmFyTmFtZSkgewotICAgICAgICB1cGRhdGVWYXJpYWJsZVRhYmxlKHNlbGVjdGVkVmFyTmFtZSk7Ci0gICAgICAgIHVwZGF0ZUVuYWJsZWRTdGF0ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9Qcm9qZWN0Q2FwYWJpbGl0eUVkaXRpbmdQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9Qcm9qZWN0Q2FwYWJpbGl0eUVkaXRpbmdQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5MzUzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUHJvamVjdENhcGFiaWxpdHlFZGl0aW5nUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFNlYmFzdGlhbiBEYXZpZHMgPHNkYXZpZHNAZ214LmRlPiAtIEZpeCBmb3IgYnVnIDE5MzQ2IC0gRGlhbG9nIGZvbnQgc2hvdWxkIGJlCi0gKiAgICAgYWN0aXZhdGVkIGFuZCB1c2VkIGJ5IG90aGVyIGNvbXBvbmVudHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklDYXBhYmlsaXR5VW5pbnN0YWxsV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnkuQ2FwYWJpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnkuQ2FwYWJpbGl0eVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb2dyZXNzLlByb2dyZXNzTW9uaXRvckpvYnNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIEEgcHJvcGVydHkgcGFnZSBmb3IgSVByb2plY3QgcmVzb3VyY2VzIHRvIGVkaXQgYSBzaW5nbGUKLSAqIGNhcGFiaWxpdHkgYXQgYSB0aW1lLgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdENhcGFiaWxpdHlFZGl0aW5nUHJvcGVydHlQYWdlIGV4dGVuZHMKLSAgICAgICAgUHJvamVjdENhcGFiaWxpdHlQcm9wZXJ0eVBhZ2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX1dJRFRIID0gNTAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfSEVJR0hUID0gNTAwOwotCi0gICAgcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZTsKLQotICAgIHByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGRpc2FibGVkQ2FwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgQ2FwYWJpbGl0eSBzZWxlY3RlZENhcDsKLQotICAgIHByaXZhdGUgQ2FwYWJpbGl0eVJlZ2lzdHJ5IHJlZzsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgUHJvamVjdENhcGFiaWxpdHlFZGl0aW5nUHJvcGVydHlQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0Q2FwYWJpbGl0eUVkaXRpbmdQcm9wZXJ0eVBhZ2UoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLlBST0pFQ1RfQ0FQQUJJTElUWV9QUk9QRVJUWV9QQUdFKTsKLSAgICAgICAgbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLSAgICAgICAgcmVnID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDYXBhYmlsaXR5UmVnaXN0cnkoKTsKLQotICAgICAgICBDb21wb3NpdGUgdG9wQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgdG9wQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICB0b3BDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgU3RyaW5nIGluc3RydWN0aW9uczsKLSAgICAgICAgaWYgKHJlZy5oYXNDYXBhYmlsaXRpZXMoKSkKLSAgICAgICAgICAgIGluc3RydWN0aW9ucyA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5UHJvcGVydHlQYWdlX2Nob29zZUNhcGFiaWxpdGllczsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlQcm9wZXJ0eVBhZ2Vfbm9DYXBhYmlsaXRpZXM7Ci0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRvcENvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgICAgICBsYWJlbC5zZXRGb250KGZvbnQpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KGluc3RydWN0aW9ucyk7Ci0KLSAgICAgICAgQ2FwYWJpbGl0eVtdIGNhcHMgPSByZWcuZ2V0UHJvamVjdERpc2FibGVkQ2FwYWJpbGl0aWVzKGdldFByb2plY3QoKSk7Ci0gICAgICAgIGRpc2FibGVkQ2Fwcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjYXBzKSk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIG1haW5Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRvcENvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIENvbXBvc2l0ZSBjYXBDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGNhcENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY2FwQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKGNhcENvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgICAgICBsYWJlbC5zZXRGb250KGZvbnQpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfY2FwYWJpbGl0aWVzKTsKLQotICAgICAgICB0YWJsZSA9IG5ldyBUYWJsZVZpZXdlcihjYXBDb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLSAgICAgICAgICAgICAgICB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotICAgICAgICB0YWJsZS5nZXRUYWJsZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICB0YWJsZS5nZXRUYWJsZSgpLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIHRhYmxlLnNldExhYmVsUHJvdmlkZXIobmV3IENhcGFiaWxpdHlMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICB0YWJsZS5zZXRDb250ZW50UHJvdmlkZXIoZ2V0Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICB0YWJsZS5zZXRJbnB1dChnZXRQcm9qZWN0KCkpOwotCi0gICAgICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChidXR0b25Db21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChmb250KTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICBhZGRCdXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0Q2FwYWJpbGl0eUVkaXRpbmdQcm9wZXJ0eVBhZ2VfYWRkKTsKLSAgICAgICAgYWRkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYWRkQ2FwYWJpbGl0eSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBpbnQgd2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IE1hdGgubWF4KHdpZHRoSGludCwgYWRkQnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotICAgICAgICAgICAgICAgIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKLSAgICAgICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGFkZEJ1dHRvbi5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5RWRpdGluZ1Byb3BlcnR5UGFnZV9yZW1vdmUpOwotICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQ2FwYWJpbGl0eShzZWxlY3RlZENhcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIHdpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heCh3aWR0aEhpbnQsIHJlbW92ZUJ1dHRvbi5jb21wdXRlU2l6ZSgKLSAgICAgICAgICAgICAgICBTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotICAgICAgICByZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgdGFibGUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZENhcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChzZWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDYXAgPSAoQ2FwYWJpbGl0eSkgc2VsLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHNlbGVjdGVkQ2FwICE9IG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gdG9wQ29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSB2aWV3ZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnLmdldFByb2plY3RDYXBhYmlsaXRpZXMoKElQcm9qZWN0KSBwYXJlbnRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2F0ZWdvcnkgaXMgY29uc2lkZXJlZCBkaXNhYmxlZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0Rpc2FibGVkQ2FwYWJpbGl0eShDYXBhYmlsaXR5IGNhcCkgewotICAgICAgICByZXR1cm4gZGlzYWJsZWRDYXBzLmNvbnRhaW5zKGNhcCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENhcGFiaWxpdHkoKSB7Ci0gICAgICAgIFByb2plY3RDYXBhYmlsaXR5U2ltcGxlQWRkV2l6YXJkIHdpemFyZDsKLSAgICAgICAgd2l6YXJkID0gbmV3IFByb2plY3RDYXBhYmlsaXR5U2ltcGxlQWRkV2l6YXJkKAotICAgICAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFksCi0gICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEgsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLSAgICAgICAgICAgICAgICBTSVpJTkdfV0laQVJEX0hFSUdIVCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLlVQREFURV9DQVBBQklMSVRZX1dJWkFSRCk7Ci0gICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgdGFibGUucmVmcmVzaCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVDYXBhYmlsaXR5KENhcGFiaWxpdHkgY2FwKSB7Ci0gICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByZXN1bHRzLmFkZEFsbChBcnJheXMuYXNMaXN0KHJlZy5nZXRQcm9qZWN0Q2FwYWJpbGl0aWVzKGdldFByb2plY3QoKSkpKTsKLSAgICAgICAgcmVzdWx0cy5yZW1vdmUoY2FwKTsKLSAgICAgICAgQ2FwYWJpbGl0eVtdIGNhcHMgPSBuZXcgQ2FwYWJpbGl0eVtyZXN1bHRzLnNpemUoKV07Ci0gICAgICAgIHJlc3VsdHMudG9BcnJheShjYXBzKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhcHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIExpc3QgcHJlcmVxcyA9IEFycmF5cy5hc0xpc3QocmVnLmdldFByZXJlcXVpc2l0ZUlkcyhjYXBzW2ldKSk7Ci0gICAgICAgICAgICBpZiAocHJlcmVxcy5jb250YWlucyhjYXAuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgICAgICAub3Blbldhcm5pbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5UHJvcGVydHlQYWdlX2Vycm9yVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5UHJvcGVydHlQYWdlX2NhcGFiaWxpdHlSZXF1aXJlZCwgY2Fwc1tpXS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IHJlZy52YWxpZGF0ZUNhcGFiaWxpdGllcyhjYXBzKTsKLSAgICAgICAgaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0gICAgICAgICAgICBFcnJvckRpYWxvZwotICAgICAgICAgICAgICAgICAgICAub3BlbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlQcm9wZXJ0eVBhZ2VfZXJyb3JUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0Q2FwYWJpbGl0eVByb3BlcnR5UGFnZV9pbnZhbGlkU2VsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBuYXR1cmVJZHMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgICBuYXR1cmVJZHNbMF0gPSBjYXAuZ2V0TmF0dXJlSWQoKTsKLQotICAgICAgICBJQ2FwYWJpbGl0eVVuaW5zdGFsbFdpemFyZCB3aXphcmQgPSBjYXAuZ2V0VW5pbnN0YWxsV2l6YXJkKCk7Ci0gICAgICAgIGlmICh3aXphcmQgPT0gbnVsbCkKLSAgICAgICAgICAgIHdpemFyZCA9IG5ldyBSZW1vdmVDYXBhYmlsaXR5V2l6YXJkKCk7Ci0gICAgICAgIGlmICh3aXphcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLCBuYXR1cmVJZHMpOwotICAgICAgICAgICAgd2l6YXJkLmFkZFBhZ2VzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2l6YXJkLmdldFN0YXJ0aW5nUGFnZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHdpemFyZC5zZXRDb250YWluZXIobmV3IFN0dWJDb250YWluZXIoKSk7Ci0gICAgICAgICAgICB3aXphcmQucGVyZm9ybUZpbmlzaCgpOwotICAgICAgICAgICAgd2l6YXJkLnNldENvbnRhaW5lcihudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdpemFyZCA9IGNhcC5nZXRVbmluc3RhbGxXaXphcmQoKTsKLSAgICAgICAgICAgIGlmICh3aXphcmQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB3aXphcmQgPSBuZXcgUmVtb3ZlQ2FwYWJpbGl0eVdpemFyZCgpOwotICAgICAgICAgICAgaWYgKHdpemFyZCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZLCBnZXRQcm9qZWN0KCksIG5hdHVyZUlkcyk7Ci0gICAgICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotICAgICAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgTWF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSCwgZGlhbG9nLmdldFNoZWxsKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTaXplKCkueCksIFNJWklOR19XSVpBUkRfSEVJR0hUKTsKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJCWRpYWxvZy5nZXRTaGVsbCgpLAotCQkJCQlJSURFSGVscENvbnRleHRJZHMuVVBEQVRFX0NBUEFCSUxJVFlfV0laQVJEKTsKLSAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0YWJsZS5yZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgY2xhc3MgQ2FwYWJpbGl0eUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBNYXAgaW1hZ2VUYWJsZTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgaWYgKGltYWdlVGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gaW1hZ2VUYWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICgoSW1hZ2UpIGl0Lm5leHQoKSkuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIGltYWdlVGFibGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9ICgoQ2FwYWJpbGl0eSkgZWxlbWVudCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEljb25EZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICAvL29idGFpbiB0aGUgY2FjaGVkIGltYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlc2NyaXB0b3IKLSAgICAgICAgICAgIGlmIChpbWFnZVRhYmxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbWFnZVRhYmxlID0gbmV3IEhhc2h0YWJsZSg0MCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbWFnZSBpbWFnZSA9IChJbWFnZSkgaW1hZ2VUYWJsZS5nZXQoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBpZiAoaW1hZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGltYWdlID0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgICAgICAgICAgICAgIGltYWdlVGFibGUucHV0KGRlc2NyaXB0b3IsIGltYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgQ2FwYWJpbGl0eSBjYXAgPSAoQ2FwYWJpbGl0eSkgZWxlbWVudDsKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gY2FwLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChpc0Rpc2FibGVkQ2FwYWJpbGl0eShjYXApKQotICAgICAgICAgICAgICAgIHRleHQgPSBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwX2Rpc2FibGVkTGFiZWwsIHRleHQpOwotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbGFzcyBTdHViQ29udGFpbmVyIGltcGxlbWVudHMgSVdpemFyZENvbnRhaW5lciB7Ci0gICAgICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRDdXJyZW50UGFnZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICAgICAgcmV0dXJuIFByb2plY3RDYXBhYmlsaXR5RWRpdGluZ1Byb3BlcnR5UGFnZS50aGlzLmdldFNoZWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzaG93UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlTWVzc2FnZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVRpdGxlQmFyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlV2luZG93VGl0bGUoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsCi0gICAgICAgICAgICAgICAgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlKQotICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBuZXcgUHJvZ3Jlc3NNb25pdG9ySm9ic0RpYWxvZyhnZXRTaGVsbCgpKS5ydW4oZm9yaywgY2FuY2VsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgcnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1Byb2plY3RDYXBhYmlsaXR5UHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUHJvamVjdENhcGFiaWxpdHlQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4NmIxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUHJvamVjdENhcGFiaWxpdHlQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKiAgICBTZWJhc3RpYW4gRGF2aWRzIDxzZGF2aWRzQGdteC5kZT4gLSBGaXggZm9yIGJ1ZyAxOTM0NiAtIERpYWxvZyBmb250IHNob3VsZCBiZQotICogICAgICAgYWN0aXZhdGVkIGFuZCB1c2VkIGJ5IG90aGVyIGNvbXBvbmVudHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5taXNjLlByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLnJlZ2lzdHJ5LkNhcGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLnJlZ2lzdHJ5LkNhcGFiaWxpdHlSZWdpc3RyeTsKLQotLyoqCi0gKiBBIHByb3BlcnR5IHBhZ2UgZm9yIElQcm9qZWN0IHJlc291cmNlcyB0byB2aWV3IGFuZCBlZGl0IHRoZQotICogY2FwYWJpbGl0aWVzIGFzc2lnbmVkIHRvIHRoZSBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdENhcGFiaWxpdHlQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotICAgIC8qKgotICAgICAqIFRoZSB3aXphcmQgZGlhbG9nIHdpZHRoCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfV0lEVEggPSA1MDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd2l6YXJkIGRpYWxvZyBoZWlnaHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9IRUlHSFQgPSA1MDA7Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLSAgICBwcml2YXRlIFByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXAgY2FwYWJpbGl0eUdyb3VwOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBQcm9qZWN0Q2FwYWJpbGl0eVByb3BlcnR5UGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvamVjdENhcGFiaWxpdHlQcm9wZXJ0eVBhZ2UoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLlBST0pFQ1RfQ0FQQUJJTElUWV9QUk9QRVJUWV9QQUdFKTsKLSAgICAgICAgbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLSAgICAgICAgQ2FwYWJpbGl0eVJlZ2lzdHJ5IHJlZyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0Q2FwYWJpbGl0eVJlZ2lzdHJ5KCk7Ci0KLSAgICAgICAgU3RyaW5nIGluc3RydWN0aW9uczsKLSAgICAgICAgaWYgKHJlZy5oYXNDYXBhYmlsaXRpZXMoKSkKLSAgICAgICAgICAgIGluc3RydWN0aW9ucyA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5UHJvcGVydHlQYWdlX2Nob29zZUNhcGFiaWxpdGllczsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlQcm9wZXJ0eVBhZ2Vfbm9DYXBhYmlsaXRpZXM7Ci0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgICAgICBsYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KGluc3RydWN0aW9ucyk7Ci0KLSAgICAgICAgQ2FwYWJpbGl0eVtdIGNhcHMgPSByZWcuZ2V0UHJvamVjdENhcGFiaWxpdGllcyhnZXRQcm9qZWN0KCkpOwotICAgICAgICBDYXBhYmlsaXR5W10gZGlzYWJsZWRDYXBzID0gcmVnCi0gICAgICAgICAgICAgICAgLmdldFByb2plY3REaXNhYmxlZENhcGFiaWxpdGllcyhnZXRQcm9qZWN0KCkpOwotICAgICAgICBDYXRlZ29yeVtdIGNhdHMgPSBuZXcgQ2F0ZWdvcnlbMF07Ci0gICAgICAgIGNhcGFiaWxpdHlHcm91cCA9IG5ldyBQcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwKGNhdHMsIGNhcHMsCi0gICAgICAgICAgICAgICAgZGlzYWJsZWRDYXBzLCByZWcpOwotICAgICAgICByZXR1cm4gY2FwYWJpbGl0eUdyb3VwLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvamVjdCB3aGljaCB0aGlzIHByb3BlcnR5IHBhZ2UgYXBwbGllcyB0bwotICAgICAqIAotICAgICAqIEByZXR1cm4gSVByb2plY3QgdGhlIHByb2plY3QgZm9yIHRoaXMgcHJvcGVydHkgcGFnZQotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi9JUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICBpZiAocHJvamVjdCA9PSBudWxsKQotICAgICAgICAgICAgcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAgICAgICAvLyBBdm9pZCBkb2luZyBhbnkgd29yayBpZiBubyBjaGFuZ2VzIHdlcmUgbWFkZS4KLSAgICAgICAgaWYgKCFjYXBhYmlsaXR5R3JvdXAuZ2V0Q2FwYWJpbGl0aWVzTW9kaWZpZWQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgb2sKLSAgICAgICAgQ2FwYWJpbGl0eVJlZ2lzdHJ5IHJlZyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0Q2FwYWJpbGl0eVJlZ2lzdHJ5KCk7Ci0gICAgICAgIENhcGFiaWxpdHlbXSBjYXBzID0gY2FwYWJpbGl0eUdyb3VwLmdldFNlbGVjdGVkQ2FwYWJpbGl0aWVzKCk7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gcmVnLnZhbGlkYXRlQ2FwYWJpbGl0aWVzKGNhcHMpOwotICAgICAgICBpZiAoIXN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0Q2FwYWJpbGl0eVByb3BlcnR5UGFnZV9lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5UHJvcGVydHlQYWdlX2ludmFsaWRTZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHNldCBvZiBuYXR1cmUgaWRzIG9uIHRoZSBwcm9qZWN0Ci0gICAgICAgIFN0cmluZ1tdIG5hdHVyZUlkczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdHVyZUlkcyA9IGdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpLmdldE5hdHVyZUlkcygpOwotICAgICAgICAgICAgbmF0dXJlSWRzID0gZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpLnNvcnROYXR1cmVTZXQobmF0dXJlSWRzKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBFcnJvckRpYWxvZwotICAgICAgICAgICAgICAgICAgICAub3BlbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlQcm9wZXJ0eVBhZ2VfZXJyb3JUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0Q2FwYWJpbGl0eVByb3BlcnR5UGFnZV9pbnRlcm5hbEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBLZWVwIG9ubHkgdGhlIG5hdHVyZSBpZHMgd2hvc2UgY2FwYWJpbGl0eSBpcyBzZWxlY3RlZAotICAgICAgICBBcnJheUxpc3Qga2VlcElkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXJyYXlMaXN0IHJlbW92ZUNhcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmF0dXJlSWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBib29sZWFuIGlzUmVtb3ZlZCA9IHRydWU7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBuYXR1cmVJZHNbaV07Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNhcHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaWQuZXF1YWxzKGNhcHNbal0uZ2V0TmF0dXJlSWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAga2VlcElkcy5hZGQoaWQpOwotICAgICAgICAgICAgICAgICAgICBpc1JlbW92ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzUmVtb3ZlZCkKLSAgICAgICAgICAgICAgICByZW1vdmVDYXBzLmFkZChyZWcuZ2V0Q2FwYWJpbGl0eUZvck5hdHVyZShpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29sbGVjdCB0aGUgY2FwYWJpbGl0aWVzIHRvIGFkZAotICAgICAgICBBcnJheUxpc3QgbmV3Q2FwcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBib29sZWFuIGlzTmV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIENhcGFiaWxpdHkgY2FwID0gY2Fwc1tpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbmF0dXJlSWRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hdHVyZUlkc1tqXS5lcXVhbHMoY2FwLmdldE5hdHVyZUlkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzTmV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc05ldykKLSAgICAgICAgICAgICAgICBuZXdDYXBzLmFkZChjYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRoZSBzdGVwIHdpemFyZCBpZiBuZWVkZWQJCQotICAgICAgICBpZiAobmV3Q2Fwcy5zaXplKCkgPiAwIHx8IHJlbW92ZUNhcHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgQ2FwYWJpbGl0eVtdIG5ld0NhcGFiaWxpdGllcyA9IG5ldyBDYXBhYmlsaXR5W25ld0NhcHMuc2l6ZSgpXTsKLSAgICAgICAgICAgIG5ld0NhcHMudG9BcnJheShuZXdDYXBhYmlsaXRpZXMpOwotCi0gICAgICAgICAgICBDYXBhYmlsaXR5W10gcmVtb3ZlQ2FwYWJpbGl0aWVzID0gbmV3IENhcGFiaWxpdHlbcmVtb3ZlQ2Fwcy5zaXplKCldOwotICAgICAgICAgICAgcmVtb3ZlQ2Fwcy50b0FycmF5KHJlbW92ZUNhcGFiaWxpdGllcyk7Ci0KLSAgICAgICAgICAgIFVwZGF0ZVByb2plY3RDYXBhYmlsaXR5V2l6YXJkIHdpemFyZCA9IG5ldyBVcGRhdGVQcm9qZWN0Q2FwYWJpbGl0eVdpemFyZCgKLSAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLCBuZXdDYXBhYmlsaXRpZXMsIHJlbW92ZUNhcGFiaWxpdGllcyk7Ci0KLSAgICAgICAgICAgIE11bHRpU3RlcFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgTXVsdGlTdGVwV2l6YXJkRGlhbG9nKAotICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLCB3aXphcmQpOwotICAgICAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgTWF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSCwgZGlhbG9nLmdldFNoZWxsKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTaXplKCkueCksIFNJWklOR19XSVpBUkRfSEVJR0hUKTsKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJCWRpYWxvZy5nZXRTaGVsbCgpLAotCQkJCQlJSURFSGVscENvbnRleHRJZHMuVVBEQVRFX0NBUEFCSUxJVFlfV0laQVJEKTsKLSAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUHJvamVjdENhcGFiaWxpdHlTaW1wbGVBZGRXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9Qcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZUFkZFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDg1ZjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9Qcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZUFkZFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdENhcGFiaWxpdHlTaW1wbGVBZGRXaXphcmQgZXh0ZW5kcyBXaXphcmQgewotICAgIHByaXZhdGUgUHJvamVjdENhcGFiaWxpdHlTaW1wbGVTZWxlY3Rpb25QYWdlIG1haW5QYWdlOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotICAgIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0gICAgcHVibGljIFByb2plY3RDYXBhYmlsaXR5U2ltcGxlQWRkV2l6YXJkKElXb3JrYmVuY2ggd29ya2JlbmNoLAotICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotICAgICAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLSAgICAgICAgaW5pdGlhbGl6ZURlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgIHNldFdpbmRvd1RpdGxlKElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5U2ltcGxlU2VsZWN0aW9uUGFnZV93aW5kb3dUaXRsZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0gICAgICAgIG1haW5QYWdlID0gbmV3IFByb2plY3RDYXBhYmlsaXR5U2ltcGxlU2VsZWN0aW9uUGFnZSgKLSAgICAgICAgICAgICAgICAicHJvamVjdENhcGFiaWxpdHlTaW1wbGVTZWxlY3Rpb25QYWdlIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHdvcmtiZW5jaCwgc2VsZWN0aW9uLCBwcm9qZWN0KTsKLSAgICAgICAgbWFpblBhZ2Uuc2V0VGl0bGUoSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlTaW1wbGVTZWxlY3Rpb25QYWdlX3RpdGxlKTsKLSAgICAgICAgbWFpblBhZ2Uuc2V0RGVzY3JpcHRpb24oSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlTaW1wbGVTZWxlY3Rpb25QYWdlX2Rlc2NyaXB0aW9uKTsKLSAgICAgICAgYWRkUGFnZShtYWluUGFnZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGltYWdlIGJhbm5lciBmb3IgdGhlIHdpemFyZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJ3aXpiYW4vbmV3cHJqX3dpei5naWYiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9Qcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9Qcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmYmMxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUHJvamVjdENhcGFiaWxpdHlTaW1wbGVTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotICogICAgU2ViYXN0aWFuIERhdmlkcyA8c2Rhdmlkc0BnbXguZGU+IC0gRml4IGZvciBidWcgMTkzNDYgLSBEaWFsb2cgZm9udCBzaG91bGQgYmUKLSAqICAgICAgIGFjdGl2YXRlZCBhbmQgdXNlZCBieSBvdGhlciBjb21wb25lbnRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUNhcGFiaWxpdHlJbnN0YWxsV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLkNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeS5DYXBhYmlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeS5DYXBhYmlsaXR5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLSAgICBwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0gICAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXIgdmlld2VyOwotCi0gICAgcHJpdmF0ZSBDYXBhYmlsaXR5UmVnaXN0cnkgcmVnOwotCi0gICAgcHJpdmF0ZSBDYXBhYmlsaXR5IGNob3NlbkNhcGFiaWxpdHk7Ci0KLSAgICBwcml2YXRlIEhhc2hNYXAgbWFwQ2FwVG9XaXphcmQgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIHBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3RDYXBhYmlsaXR5U2ltcGxlU2VsZWN0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0gICAgICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLAotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBzdXBlcihwYWdlTmFtZSk7Ci0gICAgICAgIHRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgdGhpcy5yZWcgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENhcGFiaWxpdHlSZWdpc3RyeSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nUGFnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotICAgICAgICBDb21wb3NpdGUgdG9wQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgdG9wQ29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgdG9wQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRvcENvbnRhaW5lciwgU1dULkxFRlQpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfY2FwYWJpbGl0aWVzKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLSAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChmb250KTsKLQotICAgICAgICB2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0b3BDb250YWluZXIsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLSAgICAgICAgICAgICAgICB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotICAgICAgICB2aWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICB2aWV3ZXIuZ2V0VHJlZSgpLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIHZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICB2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgdmlld2VyLnNldElucHV0KHJlZyk7Ci0KLSAgICAgICAgdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgY2hvc2VuQ2FwYWJpbGl0eSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbCAhPSBudWxsICYmICFzZWwuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIENhcGFiaWxpdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5DYXBhYmlsaXR5ID0gKENhcGFiaWxpdHkpIHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZUNob3NlbkNhcGFiaWxpdHkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHNldENvbnRyb2wodG9wQ29udGFpbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdmlld2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIENhcGFiaWxpdHlSZWdpc3RyeSkgewotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgY2F0cyA9IHJlZy5nZXRVc2VkQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVnLmdldE1pc2NDYXRlZ29yeSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXRzLmFkZChyZWcuZ2V0TWlzY0NhdGVnb3J5KCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2F0cy50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2F0ZWdvcnkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKENhdGVnb3J5KSBwYXJlbnRFbGVtZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENhcGFiaWxpdHlSZWdpc3RyeSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDYXRlZ29yeSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQ2F0ZWdvcnkpIGVsZW1lbnQpLmhhc0VsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotICAgICAgICBpZiAoY2hvc2VuQ2FwYWJpbGl0eSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgZmluYWwgSVdpemFyZFtdIHdpemFyZCA9IG5ldyBJV2l6YXJkWzFdOwotICAgICAgICB3aXphcmRbMF0gPSAoSVdpemFyZCkgbWFwQ2FwVG9XaXphcmQuZ2V0KGNob3NlbkNhcGFiaWxpdHkpOwotICAgICAgICBpZiAod2l6YXJkWzBdID09IG51bGwpIHsKLSAgICAgICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBJQ2FwYWJpbGl0eUluc3RhbGxXaXphcmQgd2l6OwotICAgICAgICAgICAgICAgICAgICB3aXogPSBjaG9zZW5DYXBhYmlsaXR5LmdldEluc3RhbGxXaXphcmQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdpeiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aXouaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbiwgcHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aXouYWRkUGFnZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcENhcFRvV2l6YXJkLnB1dChjaG9zZW5DYXBhYmlsaXR5LCB3aXopOwotICAgICAgICAgICAgICAgICAgICAgICAgd2l6YXJkWzBdID0gd2l6OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2l6YXJkWzBdID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBJV2l6YXJkUGFnZSBwYWdlID0gd2l6YXJkWzBdLmdldFN0YXJ0aW5nUGFnZSgpOwotICAgICAgICB3aXphcmRbMF0gPSBudWxsOwotICAgICAgICByZXR1cm4gcGFnZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVDaG9zZW5DYXBhYmlsaXR5KCkgewotICAgICAgICBpZiAoY2hvc2VuQ2FwYWJpbGl0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBDYXBhYmlsaXR5W10gY2FwcyA9IHJlZy5nZXRQcm9qZWN0Q2FwYWJpbGl0aWVzKHByb2plY3QpOwotICAgICAgICBMaXN0IGV4aXN0aW5nQ2FwcyA9IEFycmF5cy5hc0xpc3QoY2Fwcyk7Ci0gICAgICAgIGlmIChleGlzdGluZ0NhcHMuY29udGFpbnMoY2hvc2VuQ2FwYWJpbGl0eSkpIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2VfY2FwYWJpbGl0eUV4aXN0KTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGlkcyA9IHJlZy5nZXRQcmVyZXF1aXNpdGVJZHMoY2hvc2VuQ2FwYWJpbGl0eSk7Ci0gICAgICAgIENhcGFiaWxpdHlbXSBwcmVyZXFzID0gcmVnLmZpbmRDYXBhYmlsaXRpZXMoaWRzKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVyZXFzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocHJlcmVxc1tpXSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5U2ltcGxlU2VsZWN0aW9uUGFnZV9jYXBhYmlsaXR5TWlzc2luZywgaWRzW2ldKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFleGlzdGluZ0NhcHMuY29udGFpbnMocHJlcmVxc1tpXSkpIHsKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlTaW1wbGVTZWxlY3Rpb25QYWdlX2NhcGFiaWxpdHlSZXF1aXJlZCwgcHJlcmVxc1tpXS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZHMgPSByZWcuZ2V0TWVtYmVyc2hpcFNldElkcyhjaG9zZW5DYXBhYmlsaXR5KTsKLSAgICAgICAgTGlzdCBpZHNMaXN0ID0gQXJyYXlzLmFzTGlzdChpZHMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhcHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHNldElkcyA9IHJlZy5nZXRNZW1iZXJzaGlwU2V0SWRzKGNhcHNbaV0pOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzZXRJZHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaWRzTGlzdC5jb250YWlucyhzZXRJZHNbal0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2VfY2FwYWJpbGl0eVNldCwgY2Fwc1tpXS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENhcGFiaWxpdHlbXSBuZXdDYXBzID0gbmV3IENhcGFiaWxpdHlbY2Fwcy5sZW5ndGggKyAxXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShjYXBzLCAwLCBuZXdDYXBzLCAwLCBjYXBzLmxlbmd0aCk7Ci0gICAgICAgIG5ld0NhcHNbY2Fwcy5sZW5ndGhdID0gY2hvc2VuQ2FwYWJpbGl0eTsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSByZWcudmFsaWRhdGVDYXBhYmlsaXRpZXMobmV3Q2Fwcyk7Ci0gICAgICAgIGlmICghc3RhdHVzLmlzT0soKSkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUHJvamVjdENvbnRlbnRzTG9jYXRpb25BcmVhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUHJvamVjdENvbnRlbnRzTG9jYXRpb25BcmVhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2YzZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1Byb2plY3RDb250ZW50c0xvY2F0aW9uQXJlYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci0KLS8qKgotICogUHJvamVjdENvbnRlbnRzTG9jYXRpb25BcmVhIGlzIGEgY29udmVuaWVuY2UgY2xhc3MgZm9yIGFyZWEgdGhhdCBoYW5kbGUgZW50cnkKLSAqIG9mIGxvY2F0aW9ucyB1c2luZyBVUklzLgotICogCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RDb250ZW50c0xvY2F0aW9uQXJlYSB7Ci0JLyoqCi0JICogSUVycm9yTWVzc2FnZVJlcG9ydGVyIGlzIGFuIGludGVyZmFjZSBmb3IgdHlwZSB0aGF0IGFsbG93IG1lc3NhZ2UKLQkgKiByZXBvcnRpbmcuCi0JICogCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJRXJyb3JNZXNzYWdlUmVwb3J0ZXIgewotCQkvKioKLQkJICogUmVwb3J0IHRoZSBlcnJvciBtZXNzYWdlCi0JCSAqIAotCQkgKiBAcGFyYW0gZXJyb3JNZXNzYWdlCi0JCSAqICAgICAgICAgICAgU3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGUgZXJyb3JNZXNzYWdlIGlzCi0JCSAqICAgICAgICAgICAgbnVsbCB0aGVuIGNsZWFyIGFueSBlcnJvciBzdGF0ZS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBlcnJvck1lc3NhZ2UpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCUk9XU0VfTEFCRUwgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0TG9jYXRpb25TZWxlY3Rpb25EaWFsb2dfYnJvd3NlTGFiZWw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAyNTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TQ0hFTUUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGFiZWwgbG9jYXRpb25MYWJlbDsKLQotCXByaXZhdGUgVGV4dCBsb2NhdGlvblBhdGhGaWVsZDsKLQotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgSUVycm9yTWVzc2FnZVJlcG9ydGVyIGVycm9yUmVwb3J0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZSA9IElERVJlc291cmNlSW5mb1V0aWxzLkVNUFRZX1NUUklORzsKLQotCXByaXZhdGUgU3RyaW5nIHVzZXJQYXRoID0gSURFUmVzb3VyY2VJbmZvVXRpbHMuRU1QVFlfU1RSSU5HOwotCi0JcHJpdmF0ZSBCdXR0b24gdXNlRGVmYXVsdHNCdXR0b247Ci0KLQlwcml2YXRlIElQcm9qZWN0IGV4aXN0aW5nUHJvamVjdDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdGFydFByb2plY3QKLQkgKi8KLQlwdWJsaWMgUHJvamVjdENvbnRlbnRzTG9jYXRpb25BcmVhKElFcnJvck1lc3NhZ2VSZXBvcnRlciByZXBvcnRlciwKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUsIElQcm9qZWN0IHN0YXJ0UHJvamVjdCkgewotCi0JCWVycm9yUmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJcHJvamVjdE5hbWUgPSBzdGFydFByb2plY3QuZ2V0TmFtZSgpOwotCQlleGlzdGluZ1Byb2plY3QgPSBzdGFydFByb2plY3Q7Ci0KLQkJYm9vbGVhbiBkZWZhdWx0RW5hYmxlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlkZWZhdWx0RW5hYmxlZCA9IHN0YXJ0UHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldExvY2F0aW9uVVJJKCkgPT0gbnVsbDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJLy8gSWYgd2UgZ2V0IGEgQ29yZUV4Y2VwdGlvbiBhc3N1bWUgdGhlIGRlZmF1bHQuCi0JCX0KLQkJY3JlYXRlQ29udGVudHMoY29tcG9zaXRlLCBkZWZhdWx0RW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgUHJvamVjdENvbnRlbnRzTG9jYXRpb25BcmVhLgotCSAqIAotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgUHJvamVjdENvbnRlbnRzTG9jYXRpb25BcmVhKElFcnJvck1lc3NhZ2VSZXBvcnRlciByZXBvcnRlciwKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJZXJyb3JSZXBvcnRlciA9IHJlcG9ydGVyOwotCi0JCS8vIElmIGl0IGlzIGEgbmV3IHByb2plY3QgYWx3YXlzIHN0YXJ0IGVuYWJsZWQKLQkJY3JlYXRlQ29udGVudHMoY29tcG9zaXRlLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBkZWZhdWx0RW5hYmxlZCkgewotCQkvLyBwcm9qZWN0IHNwZWNpZmljYXRpb24gZ3JvdXAKLQkJQ29tcG9zaXRlIHByb2plY3RHcm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlwcm9qZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXByb2plY3RHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQl1c2VEZWZhdWx0c0J1dHRvbiA9IG5ldyBCdXR0b24ocHJvamVjdEdyb3VwLCBTV1QuQ0hFQ0sgfCBTV1QuUklHSFQpOwotCQl1c2VEZWZhdWx0c0J1dHRvbgotCQkJCS5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZ191c2VEZWZhdWx0TGFiZWwpOwotCQl1c2VEZWZhdWx0c0J1dHRvbi5zZXRTZWxlY3Rpb24oZGVmYXVsdEVuYWJsZWQpOwotCQlHcmlkRGF0YSBidXR0b25EYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ1dHRvbkRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl1c2VEZWZhdWx0c0J1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkRhdGEpOwotCi0JCWNyZWF0ZVVzZXJFbnRyeUFyZWEocHJvamVjdEdyb3VwLCBkZWZhdWx0RW5hYmxlZCk7Ci0KLQkJdXNlRGVmYXVsdHNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiB1c2VEZWZhdWx0cyA9IHVzZURlZmF1bHRzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0JCQkJaWYgKHVzZURlZmF1bHRzKSB7Ci0JCQkJCXVzZXJQYXRoID0gbG9jYXRpb25QYXRoRmllbGQuZ2V0VGV4dCgpOwotCQkJCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRUZXh0KGdldERlZmF1bHRQYXRoRGlzcGxheVN0cmluZygpKTsKLQkJCQl9IGVsc2UKLQkJCQkJbG9jYXRpb25QYXRoRmllbGQuc2V0VGV4dCh1c2VyUGF0aCk7Ci0JCQkJc2V0VXNlckFyZWFFbmFibGVkKCF1c2VEZWZhdWx0cyk7Ci0JCQl9Ci0JCX0pOwotCQlzZXRVc2VyQXJlYUVuYWJsZWQoIWRlZmF1bHRFbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3Qgd2UgYXJlIGN1cnJlbnRseSBzaG93aW5nIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGZvcgotCSAqIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHVzZURlZmF1bHRzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYXJlYSBmb3IgdXNlciBlbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRFbmFibGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVVzZXJFbnRyeUFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBkZWZhdWx0RW5hYmxlZCkgewotCQkvLyBsb2NhdGlvbiBsYWJlbAotCQlsb2NhdGlvbkxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkxhYmVsCi0JCQkJLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nX2xvY2F0aW9uTGFiZWwpOwotCi0JCS8vIHByb2plY3QgbG9jYXRpb24gZW50cnkgZmllbGQKLQkJbG9jYXRpb25QYXRoRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCWxvY2F0aW9uUGF0aEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gYnJvd3NlIGJ1dHRvbgotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChCUk9XU0VfTEFCRUwpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQotCQlpZiAoZGVmYXVsdEVuYWJsZWQpLy8gV2lsbCBiZSBudWxsIGlmIGl0IGlzIG5vdCBzZXQKLQkJCWxvY2F0aW9uUGF0aEZpZWxkLnNldFRleHQoZ2V0RGVmYXVsdFBhdGhEaXNwbGF5U3RyaW5nKCkpOwotCQllbHNlIHsKLQkJCWlmIChleGlzdGluZ1Byb2plY3QgPT0gbnVsbCkKLQkJCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRUZXh0KElERVJlc291cmNlSW5mb1V0aWxzLkVNUFRZX1NUUklORyk7Ci0JCQllbHNlIHsKLQkJCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRUZXh0KGV4aXN0aW5nUHJvamVjdC5nZXRMb2NhdGlvbigpCi0JCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlsb2NhdGlvblBhdGhGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQllcnJvclJlcG9ydGVyLnJlcG9ydEVycm9yKGNoZWNrVmFsaWRMb2NhdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoIHdlIGFyZSBnb2luZyB0byBkaXNwbGF5LiBJZiBpdCBpcyBhIGZpbGUgVVJJIHRoZW4gcmVtb3ZlCi0JICogdGhlIGZpbGUgcHJlZml4LgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFBhdGhEaXNwbGF5U3RyaW5nKCkgewotCi0JCVVSSSBkZWZhdWx0VVJJID0gbnVsbDsKLQkJaWYgKGV4aXN0aW5nUHJvamVjdCAhPSBudWxsKQotCQkJZGVmYXVsdFVSSSA9IGV4aXN0aW5nUHJvamVjdC5nZXRMb2NhdGlvblVSSSgpOwotCi0JCS8vIEhhbmRsZSBmaWxlcyBzcGVjaWFsbHkuIEFzc3VtZSBhIGZpbGUgaWYgdGhlcmUgaXMgbm8gcHJvamVjdCB0byBxdWVyeQotCQlpZiAoZGVmYXVsdFVSSSA9PSBudWxsIHx8IGRlZmF1bHRVUkkuZ2V0U2NoZW1lKCkuZXF1YWxzKEZJTEVfU0NIRU1FKSkgewotCQkJcmV0dXJuIFBsYXRmb3JtLmdldExvY2F0aW9uKCkuYXBwZW5kKHByb2plY3ROYW1lKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0VVJJLnRvU3RyaW5nKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGVuYWJsZW1lbnQgc3RhdGUgb2YgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFVzZXJBcmVhRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQotCQlsb2NhdGlvbkxhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWxvY2F0aW9uUGF0aEZpZWxkLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYnJvd3NlIGJ1dHRvbi4gVXN1YWxseSByZWZlcmVuY2VkIGluIG9yZGVyIHRvIHNldCB0aGUgbGF5b3V0Ci0JICogZGF0YSBmb3IgYSBkaWFsb2cuCi0JICogCi0JICogQHJldHVybiBCdXR0b24KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGdldEJyb3dzZUJ1dHRvbigpIHsKLQkJcmV0dXJuIGJyb3dzZUJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGFuIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBicm93c2VyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cobG9jYXRpb25QYXRoRmllbGQKLQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZwotCQkJCS5zZXRNZXNzYWdlKElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZ19kaXJlY3RvcnlMYWJlbCk7Ci0KLQkJU3RyaW5nIGRpck5hbWUgPSBnZXRQYXRoRnJvbUxvY2F0aW9uRmllbGQoKTsKLQkJaWYgKCFkaXJOYW1lLmVxdWFscyhJREVSZXNvdXJjZUluZm9VdGlscy5FTVBUWV9TVFJJTkcpKSB7Ci0JCQlJRmlsZUluZm8gaW5mbyA9IElERVJlc291cmNlSW5mb1V0aWxzLmdldEZpbGVJbmZvKGRpck5hbWUpOwotCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLmV4aXN0cygpKQotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpck5hbWUpOwotCQl9Ci0KLQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpCi0JCQl1cGRhdGVMb2NhdGlvbkZpZWxkKHNlbGVjdGVkRGlyZWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGxvY2F0aW9uIGZpZWxkIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RlZFBhdGgKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlTG9jYXRpb25GaWVsZChTdHJpbmcgc2VsZWN0ZWRQYXRoKSB7Ci0JCWxvY2F0aW9uUGF0aEZpZWxkLnNldFRleHQoc2VsZWN0ZWRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhdGggb24gdGhlIGxvY2F0aW9uIGZpZWxkLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aEZyb21Mb2NhdGlvbkZpZWxkKCkgewotCQlVUkkgZmllbGRVUkk7Ci0JCXRyeSB7Ci0JCQlmaWVsZFVSSSA9IG5ldyBVUkkobG9jYXRpb25QYXRoRmllbGQuZ2V0VGV4dCgpKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBsb2NhdGlvblBhdGhGaWVsZC5nZXRUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkVVJJLmdldFBhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgZW50cnkgaW4gdGhlIHdpZGdldCBsb2NhdGlvbiBpcyB2YWxpZC4gSWYgaXQgaXMgdmFsaWQgcmV0dXJuCi0JICogbnVsbC4gT3RoZXJ3aXNlIHJldHVybiBhIHN0cmluZyB0aGF0IGluZGljYXRlcyB0aGUgcHJvYmxlbS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgY2hlY2tWYWxpZExvY2F0aW9uKCkgewotCQkKLQkJaWYoaXNEZWZhdWx0KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgbG9jYXRpb25GaWVsZENvbnRlbnRzID0gbG9jYXRpb25QYXRoRmllbGQuZ2V0VGV4dCgpOwotCQlpZiAobG9jYXRpb25GaWVsZENvbnRlbnRzLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiAoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9wcm9qZWN0TG9jYXRpb25FbXB0eSk7Ci0JCX0KLQotCQlVUkkgbmV3UGF0aCA9IGdldExvY2F0aW9uRmllbGRVUkkoKTsKLQkJaWYgKG5ld1BhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZ19sb2NhdGlvbkVycm9yOwotCQl9Ci0KLQkJaWYgKGV4aXN0aW5nUHJvamVjdCA9PSBudWxsKSB7Ci0JCQlJUGF0aCBwcm9qZWN0UGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uRmllbGRDb250ZW50cyk7Ci0JCQlpZiAoUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKHByb2plY3RQYXRoKSkgewotCQkJCXJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2RlZmF1bHRMb2NhdGlvbkVycm9yOwotCQkJfQotCi0JCX0gZWxzZSB7Ci0JCQlJU3RhdHVzIGxvY2F0aW9uU3RhdHVzID0gZXhpc3RpbmdQcm9qZWN0LmdldFdvcmtzcGFjZSgpCi0JCQkJCS52YWxpZGF0ZVByb2plY3RMb2NhdGlvblVSSShleGlzdGluZ1Byb2plY3QsIG5ld1BhdGgpOwotCi0JCQlpZiAoIWxvY2F0aW9uU3RhdHVzLmlzT0soKSkKLQkJCQlyZXR1cm4gbG9jYXRpb25TdGF0dXMuZ2V0TWVzc2FnZSgpOwotCi0JCQlVUkkgcHJvamVjdFBhdGggPSBleGlzdGluZ1Byb2plY3QuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCWlmIChwcm9qZWN0UGF0aCAhPSBudWxsICYmIHByb2plY3RQYXRoLmVxdWFscyhuZXdQYXRoKSkgewotCQkJCXJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0TG9jYXRpb25TZWxlY3Rpb25EaWFsb2dfbG9jYXRpb25FcnJvcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgVVJJIGZvciB0aGUgbG9jYXRpb24gZmllbGQgaWYgcG9zc2libGUuCi0JICogCi0JICogQHJldHVybiBVUkkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgbm90IHZhbGlkLgotCSAqLwotCXByaXZhdGUgVVJJIGdldExvY2F0aW9uRmllbGRVUkkoKSB7Ci0KLQkJU3RyaW5nIGxvY2F0aW9uQ29udGVudHMgPSBsb2NhdGlvblBhdGhGaWVsZC5nZXRUZXh0KCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSSShsb2NhdGlvbkNvbnRlbnRzKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQotCQkJLy8gU2VlIGlmIGl0IHdhcyBhY2NlcHRhYmxlIGFzIGEgZmlsZQotCQkJcmV0dXJuIG5ldyBGaWxlKGxvY2F0aW9uQ29udGVudHMpLnRvVVJJKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGV4dCB0byB0aGUgZGVmYXVsdCBvciBjbGVhciBpdCBpZiBub3QgdXNpbmcgdGhlIGRlZmF1bHRzLgotCSAqIAotCSAqIEBwYXJhbSB1c2VEZWZhdWx0cwotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0byB1c2UuIElmIDxjb2RlPm51bGw8L2NvZGU+IHVzZSB0aGUKLQkgKiAgICAgICAgICAgIGV4aXN0aW5nIHByb2plY3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVQcm9qZWN0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlwcm9qZWN0TmFtZSA9IG5ld05hbWU7Ci0JCWlmIChpc0RlZmF1bHQoKSkKLQkJCWxvY2F0aW9uUGF0aEZpZWxkLnNldFRleHQoZ2V0RGVmYXVsdFBhdGhEaXNwbGF5U3RyaW5nKCkpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsb2NhdGlvbiBmb3IgdGhlIHByb2plY3QuIElmIHdlIGFyZSB1c2luZyBkZWZhdWx0cyB0aGVuIHJldHVybgotCSAqIHRoZSB3b3Jrc3BhY2Ugcm9vdCBzbyB0aGF0IGNvcmUgY3JlYXRlcyBpdCB3aXRoIGRlZmF1bHQgdmFsdWVzLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TG9jYXRpb24oKSB7Ci0JCWlmIChpc0RlZmF1bHQoKSkKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsb2NhdGlvblBhdGhGaWVsZC5nZXRUZXh0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1Byb2plY3RQZXJzcGVjdGl2ZUNob2ljZURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1Byb2plY3RQZXJzcGVjdGl2ZUNob2ljZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmVhN2UwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9Qcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotICogICAgIFNlYmFzdGlhbiBEYXZpZHMgPHNkYXZpZHNAZ214LmRlPiAtIEZpeCBmb3IgYnVnIDE5MzQ2IC0gRGlhbG9nIGZvbnQgc2hvdWxkIGJlCi0gKiAgICAgYWN0aXZhdGVkIGFuZCB1c2VkIGJ5IG90aGVyIGNvbXBvbmVudHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLlBlcnNwZWN0aXZlTGFiZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFByb2plY3RQZXJzcGVjdGl2ZUNob2ljZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9ESUFMT0dfV0lEVEggPSAyMDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0RJQUxPR19IRUlHSFQgPSAyNTA7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgcGVyc3BzOwotCi0gICAgcHJpdmF0ZSBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGNob3NlblBlcnNwOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNhbWVXaW5kb3cgPSB0cnVlOwotCi0gICAgcHJpdmF0ZSBUYWJsZVZpZXdlciBsaXN0OwotCi0gICAgcHJpdmF0ZSBDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLSAgICAgICAgcHJpdmF0ZSBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0KLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYjEsIE9iamVjdCBvYjIpIHsKLSAgICAgICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZDEgPSAoSVBlcnNwZWN0aXZlRGVzY3JpcHRvcikgb2IxOwotICAgICAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkMiA9IChJUGVyc3BlY3RpdmVEZXNjcmlwdG9yKSBvYjI7Ci0gICAgICAgICAgICByZXR1cm4gY29sbGF0b3IuY29tcGFyZShkMS5nZXRMYWJlbCgpLCBkMi5nZXRMYWJlbCgpKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBQcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2cKLSAgICAgKiBAcGFyYW0gd2luZG93IHRoZSB3b3JrYmVuY2ggd2luZG93IGxhdW5jaGluZyB0aGlzIGRpYWxvZwotICAgICAqIEBwYXJhbSBwZXJzcElkcyB0aGUgbGlzdCBvZiBpZHMgdGhlIHVzZXIgY2FuIGNob29zZSBmcm9tCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3RQZXJzcGVjdGl2ZUNob2ljZURpYWxvZyhJV29ya2JlbmNoV2luZG93IHdpbmRvdywKLSAgICAgICAgICAgIFN0cmluZ1tdIHBlcnNwSWRzKSB7Ci0gICAgICAgIHN1cGVyKHdpbmRvdy5nZXRTaGVsbCgpKTsKLSAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0KLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgICAgICBjaG9zZW5QZXJzcCA9IHBhZ2UuZ2V0UGVyc3BlY3RpdmUoKTsKLQotICAgICAgICBJUGVyc3BlY3RpdmVSZWdpc3RyeSByZWcgPSB3aW5kb3cuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpOwotICAgICAgICBwZXJzcHMgPSBuZXcgQXJyYXlMaXN0KHBlcnNwSWRzLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVyc3BJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYzsKLSAgICAgICAgICAgIGRlc2MgPSByZWcuZmluZFBlcnNwZWN0aXZlV2l0aElkKHBlcnNwSWRzW2ldKTsKLSAgICAgICAgICAgIGlmIChkZXNjICE9IG51bGwgJiYgZGVzYyAhPSBjaG9zZW5QZXJzcCkKLSAgICAgICAgICAgICAgICBwZXJzcHMuYWRkKGRlc2MpOwotICAgICAgICB9Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocGVyc3BzLCBjb21wYXJhdG9yKTsKLQotICAgICAgICBpZiAoY2hvc2VuUGVyc3AgIT0gbnVsbCkKLSAgICAgICAgICAgIHBlcnNwcy5hZGQoMCwgY2hvc2VuUGVyc3ApOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICAgICAgc2hlbGwuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2dfdGl0bGUpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNoZWxsLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5TSE9XX1BST0pFQ1RfUEVSU1BFQ1RJVkVfRElBTE9HKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gcGFnZSBncm91cAotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBNSU5fRElBTE9HX1dJRFRIOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSBNSU5fRElBTE9HX0hFSUdIVDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgY3JlYXRlUGVyc3BlY3RpdmVHcm91cChjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVPcHRpb25Hcm91cChjb21wb3NpdGUpOwotCi0gICAgICAgIGlmIChjaG9zZW5QZXJzcCAhPSBudWxsKQotICAgICAgICAgICAgbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY2hvc2VuUGVyc3ApKTsKLQotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHBlcnNwZWN0aXZlIGNob2ljZSBjb250cm9scy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlUGVyc3BlY3RpdmVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgIC8vIExhYmVsIGZvciBjaG9vc2luZyBwZXJzcGVjdGl2ZQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChmb250KTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2dfY2hvb3NlUGVyc3BlY3RpdmUpOwotCi0gICAgICAgIC8vIEFkZCBwZXJzcGVjdGl2ZSBsaXN0LgotICAgICAgICBsaXN0ID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIGxpc3Quc2V0TGFiZWxQcm92aWRlcihuZXcgUGVyc3BlY3RpdmVMYWJlbFByb3ZpZGVyKGZhbHNlKSk7Ci0gICAgICAgIGxpc3Quc2V0Q29udGVudFByb3ZpZGVyKG5ldyBQZXJzcGVjdGl2ZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgbGlzdC5zZXRJbnB1dChwZXJzcHMpOwotICAgICAgICBsaXN0LmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0gICAgICAgIGxpc3QuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgbGlzdC5nZXRUYWJsZSgpLnNldEZvbnQoZm9udCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgb3B0aW9uIGNvbnRyb2xzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVPcHRpb25Hcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgb3B0aW9uIGdyb3VwCi0gICAgICAgIEdyb3VwIG9wdGlvbkdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULkxFRlQpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIG9wdGlvbkdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICAgICAgb3B0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgb3B0aW9uR3JvdXAuc2V0Rm9udChmb250KTsKLSAgICAgICAgb3B0aW9uR3JvdXAuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2dfb3B0aW9ucyk7Ci0KLSAgICAgICAgLy8gU2FtZSB3aW5kb3cgb3B0aW9uCi0gICAgICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKG9wdGlvbkdyb3VwLCBTV1QuUkFESU8gfCBTV1QuTEVGVCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RQZXJzcGVjdGl2ZUNob2ljZURpYWxvZ19zYW1lV2luZG93KTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgYnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRTZWxlY3Rpb24oc2FtZVdpbmRvdyk7Ci0gICAgICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzYW1lV2luZG93ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gTmV3IHdpbmRvdyBvcHRpb24KLSAgICAgICAgYnV0dG9uID0gbmV3IEJ1dHRvbihvcHRpb25Hcm91cCwgU1dULlJBRElPIHwgU1dULkxFRlQpOwotICAgICAgICBidXR0b24uc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2dfbmV3V2luZG93KTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgYnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRTZWxlY3Rpb24oIXNhbWVXaW5kb3cpOwotICAgICAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2FtZVdpbmRvdyA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93cyB0aGUgY2hvb3NlbiBwZXJzcGVjdGl2ZSBpbiB0aGUgc2FtZSBvcgotICAgICAqIG5ldyB3aW5kb3cgZGVwZW5kaW5nIG9uIHRoZSBvcHRpb24gY2hlY2tlZC4KLSAgICAgKiBSZXR1cm5zIHRoZSB3b3JrYmVuY2ggd2luZG93IHRoZSBwZXJzcGVjdGl2ZQotICAgICAqIHdhcyBzaG93biBpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtiZW5jaFdpbmRvdyBzaG93Q2hvc2VuUGVyc3BlY3RpdmUoKSB7Ci0gICAgICAgIGlmIChjaG9zZW5QZXJzcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHdpbmRvdzsKLQotICAgICAgICBmaW5hbCBJV29ya2JlbmNoV2luZG93W10gcmVzdWx0cyA9IG5ldyBJV29ya2JlbmNoV2luZG93WzFdOwotICAgICAgICBmaW5hbCBXb3JrYmVuY2hFeGNlcHRpb25bXSBlcnJvcnMgPSBuZXcgV29ya2JlbmNoRXhjZXB0aW9uWzFdOwotICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZSh3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2FtZVdpbmRvdykgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRzWzBdID0gd2luZG93OwotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Uuc2V0UGVyc3BlY3RpdmUoY2hvc2VuUGVyc3ApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzWzBdID0gd2luZG93LmdldFdvcmtiZW5jaCgpLm9wZW5Xb3JrYmVuY2hXaW5kb3coCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob3NlblBlcnNwLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzWzBdID0gZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyByZXN1bHQgPSByZXN1bHRzWzBdOwotICAgICAgICByZXN1bHRzWzBdID0gbnVsbDsKLQotICAgICAgICBpZiAoZXJyb3JzWzBdICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdFBlcnNwZWN0aXZlQ2hvaWNlRGlhbG9nX2Vycm9yVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdFBlcnNwZWN0aXZlQ2hvaWNlRGlhbG9nX2Vycm9yTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnNbMF0uZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgZXJyb3JzWzBdID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiB3aW5kb3c7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGNsYXNzIFBlcnNwZWN0aXZlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgUGVyc3BlY3RpdmVDb250ZW50UHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnJheUxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChBcnJheUxpc3QpIGVsZW1lbnQpLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotICAgICAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY2hvc2VuUGVyc3AgPSAoSVBlcnNwZWN0aXZlRGVzY3JpcHRvcikgc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUHJvamVjdFJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9Qcm9qZWN0UmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjM5MGJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9Qcm9qZWN0UmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLkRpYWxvZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcm9ncmVzcy5Qcm9ncmVzc01vbml0b3JKb2JzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIEEgcHJvcGVydHkgcGFnZSBmb3Igdmlld2luZyBhbmQgbW9kaWZ5aW5nIHRoZSBzZXQKLSAqIG9mIHByb2plY3RzIHJlZmVyZW5jZWQgYnkgYSBnaXZlbiBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCi0gICAgLy93aWRnZXRzCi0gICAgcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGxpc3RWaWV3ZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPSkVDVF9MSVNUX01VTFRJUExJRVIgPSAzMDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgUHJvamVjdFJlZmVyZW5jZVBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3RSZWZlcmVuY2VQYWdlKCkgewotICAgICAgICAvL0RvIG5vdGhpbmcgb24gY3JlYXRpb24KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIFByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5QUk9KRUNUX1JFRkVSRU5DRV9QUk9QRVJUWV9QQUdFKTsKLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotCi0gICAgICAgIExhYmVsIGRlc2NyaXB0aW9uID0gY3JlYXRlRGVzY3JpcHRpb25MYWJlbChjb21wb3NpdGUpOwotICAgICAgICBkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UpKTsKLQotICAgICAgICBsaXN0Vmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29tcG9zaXRlLCBTV1QuVE9QCi0gICAgICAgICAgICAgICAgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgbGlzdFZpZXdlci5nZXRUYWJsZSgpLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQotICAgICAgICAvL09ubHkgc2V0IGEgaGVpZ2h0IGhpbnQgaWYgaXQgd2lsbCBub3QgcmVzdWx0IGluIGEgY3V0IG9mZiBkaWFsb2cKLSAgICAgICAgaWYgKERpYWxvZ1V0aWwuaW5SZWd1bGFyRm9udE1vZGUocGFyZW50KSkKLSAgICAgICAgICAgIGRhdGEuaGVpZ2h0SGludCA9IGdldERlZmF1bHRGb250SGVpZ2h0KGxpc3RWaWV3ZXIuZ2V0VGFibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgUFJPSkVDVF9MSVNUX01VTFRJUExJRVIpOwotICAgICAgICBsaXN0Vmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgbGlzdFZpZXdlci5nZXRUYWJsZSgpLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKFdvcmtiZW5jaExhYmVsUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAuZ2V0RGVjb3JhdGluZ1dvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIGxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbnRlbnRQcm92aWRlcihwcm9qZWN0KSk7Ci0gICAgICAgIGxpc3RWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0gICAgICAgIGxpc3RWaWV3ZXIuc2V0SW5wdXQocHJvamVjdC5nZXRXb3Jrc3BhY2UoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsaXN0Vmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL2Rvbid0IGluaXRpYWwtY2hlY2sgYW55dGhpbmcKLSAgICAgICAgfQotCi0gICAgICAgIC8vY2hlY2sgZm9yIGluaXRpYWwgbW9kaWZpY2F0aW9uIHRvIGF2b2lkIHdvcmsgaWYgbm8gY2hhbmdlcyBhcmUgbWFkZQotICAgICAgICBsaXN0Vmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBsaXN0IGRpYWxvZy4gSXQKLSAgICAgKiB3aWxsIHJldHVybiBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSBleGNlcHQKLSAgICAgKiB0aGUgZ2l2ZW4gcHJvamVjdCwgcGx1cyBhbnkgcHJvamVjdHMgcmVmZXJlbmNlZAotICAgICAqIGJ5IHRoZSBnaXZlbiBwcm9qZWN0IHdoaWNoIGRvIG5vIGV4aXN0IGluIHRoZQotICAgICAqIHdvcmtzcGFjZS4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0byBwcm92aWRlIGNvbnRlbnQgZm9yCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBwcm92aWRlciB0aGF0IHNob3dzIHRoZSBwcm9qZWN0IGNvbnRlbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKAotICAgICAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICByZXR1cm4gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBJV29ya3NwYWNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBDb2xsZWN0IGFsbCB0aGUgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSBleGNlcHQgdGhlIGdpdmVuIHByb2plY3QKLSAgICAgICAgICAgICAgICBJUHJvamVjdFtdIHByb2plY3RzID0gKChJV29ya3NwYWNlKSBvKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgcmVmZXJlbmNlZCA9IG5ldyBBcnJheUxpc3QocHJvamVjdHMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kICYmIHByb2plY3RzW2ldLmVxdWFscyhwcm9qZWN0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZC5hZGQocHJvamVjdHNbaV0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEFkZCBhbnkgcmVmZXJlbmNlZCB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgd29ya3NwYWNlIGN1cnJlbnRseQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3RzID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZmVyZW5jZWQuY29udGFpbnMocHJvamVjdHNbaV0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWQuYWRkKHByb2plY3RzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvL0lnbm9yZSBjb3JlIGV4Y2VwdGlvbnMKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlZC50b0FycmF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkZWZ1YWx0IHdpZGdldCBoZWlnaHQgZm9yIHRoZSBzdXBwbGllZCBjb250cm9sLgotICAgICAqIEByZXR1cm4gaW50Ci0gICAgICogQHBhcmFtIGNvbnRyb2wgLSB0aGUgY29udHJvbCBiZWluZyBxdWVyaWVkIGFib3V0IGZvbnRzCi0gICAgICogQHBhcmFtIGxpbmVzIC0gdGhlIG51bWJlciBvZiBsaW5lcyB0byBiZSBzaG93biBvbiB0aGUgdGFibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldERlZmF1bHRGb250SGVpZ2h0KENvbnRyb2wgY29udHJvbCwgaW50IGxpbmVzKSB7Ci0gICAgICAgIEZvbnREYXRhW10gdmlld2VyRm9udERhdGEgPSBjb250cm9sLmdldEZvbnQoKS5nZXRGb250RGF0YSgpOwotICAgICAgICBpbnQgZm9udEhlaWdodCA9IDEwOwotCi0gICAgICAgIC8vSWYgd2UgaGF2ZSBubyBmb250IGRhdGEgdXNlIG91ciBndWVzcwotICAgICAgICBpZiAodmlld2VyRm9udERhdGEubGVuZ3RoID4gMCkKLSAgICAgICAgICAgIGZvbnRIZWlnaHQgPSB2aWV3ZXJGb250RGF0YVswXS5nZXRIZWlnaHQoKTsKLSAgICAgICAgcmV0dXJuIGxpbmVzICogZm9udEhlaWdodDsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZSB0aGUgZXhjZXB0aW9uIHRocm93biB3aGVuIHNhdmluZy4KLSAgICAgKiBAcGFyYW0gZSB0aGUgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICBJU3RhdHVzIGVycm9yOwotICAgICAgICBUaHJvd2FibGUgdGFyZ2V0ID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIGVycm9yID0gKChDb3JlRXhjZXB0aW9uKSB0YXJnZXQpLmdldFN0YXR1cygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHRhcmdldC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBpZiAobXNnID09IG51bGwpCi0gICAgICAgICAgICAgICAgbXNnID0gSURFV29ya2JlbmNoTWVzc2FnZXMuSW50ZXJuYWxfZXJyb3I7Ci0gICAgICAgICAgICBlcnJvciA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsCi0gICAgICAgICAgICAgICAgICAgIDEsIG1zZywgdGFyZ2V0KTsKLSAgICAgICAgfQotICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIG51bGwsIG51bGwsIGVycm9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyBhIFByb2plY3RSZWZlcmVuY2VQYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotICAgICAgICBwcm9qZWN0ID0gKElQcm9qZWN0KSBnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotICAgICAgICBub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotICAgICAgICBzZXREZXNjcmlwdGlvbihOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0UmVmZXJlbmNlc1BhZ2VfbGFiZWwsIHByb2plY3QuZ2V0TmFtZSgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2sKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gICAgICAgIGlmICghbW9kaWZpZWQpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgT2JqZWN0W10gY2hlY2tlZCA9IGxpc3RWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0W10gcmVmcyA9IG5ldyBJUHJvamVjdFtjaGVja2VkLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2hlY2tlZCwgMCwgcmVmcywgMCwgY2hlY2tlZC5sZW5ndGgpOwotICAgICAgICBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uc2V0UmVmZXJlbmNlZFByb2plY3RzKHJlZnMpOwotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3IFByb2dyZXNzTW9uaXRvckpvYnNEaWFsb2coZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLAotICAgICAgICAgICAgICAgICAgICB0cnVlLCBydW5uYWJsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vSWdub3JlIGludGVycnVwdGVkIGV4Y2VwdGlvbnMKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBoYW5kbGUoZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1JlbW92ZUNhcGFiaWxpdHlTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUmVtb3ZlQ2FwYWJpbGl0eVN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzNTY3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUmVtb3ZlQ2FwYWJpbGl0eVN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQ2FwYWJpbGl0eVVuaW5zdGFsbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeS5DYXBhYmlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeS5DYXBhYmlsaXR5UmVnaXN0cnk7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgcmVtb3ZhbCBvZiBhIGNhcGFiaWxpdHkgc3RlcCBpbiBhIG11bHRpLXN0ZXAKLSAqIHdpemFyZC4KLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZUNhcGFiaWxpdHlTdGVwIGV4dGVuZHMgV2l6YXJkU3RlcCB7Ci0gICAgcHJpdmF0ZSBDYXBhYmlsaXR5IGNhcGFiaWxpdHk7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIG5hdHVyZUlkczsKLQotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotICAgIHByaXZhdGUgSUNhcGFiaWxpdHlVbmluc3RhbGxXaXphcmQgd2l6YXJkOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgcmVtb3ZlIGNhcGFiaWxpdHkgc3RlcAotICAgICAqIAotICAgICAqIEBwYXJhbSBudW1iZXIgc3RlcCBvcmRlciBudW1iZXIKLSAgICAgKiBAcGFyYW0gY2FwYWJpbGl0eSB0aGUgY2FwYWJpbGl0eSB0byBiZSByZW1vdmVkCi0gICAgICogQHBhcmFtIG5hdHVyZUlkcyB0aGUgbGlzdCBvZiBuYXR1cmUgaWRzIHRvIHJlbW92ZSBvbiB0aGUgcHJvamVjdAotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIHJlbW92ZSB0aGUgY2FwYWJpbGl0eSBmcm9tCi0gICAgICovCi0gICAgcHVibGljIFJlbW92ZUNhcGFiaWxpdHlTdGVwKGludCBudW1iZXIsIENhcGFiaWxpdHkgY2FwYWJpbGl0eSwKLSAgICAgICAgICAgIFN0cmluZ1tdIG5hdHVyZUlkcywgSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBzdXBlcihudW1iZXIpOwotICAgICAgICB0aGlzLmNhcGFiaWxpdHkgPSBjYXBhYmlsaXR5OwotICAgICAgICB0aGlzLm5hdHVyZUlkcyA9IG5hdHVyZUlkczsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpemFyZFN0ZXAuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlbW92ZUNhcGFiaWxpdHlTdGVwX2xhYmVsLCBjYXBhYmlsaXR5LmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXaXphcmRTdGVwLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlscygpIHsKLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBjYXBhYmlsaXR5LmdldFVuaW5zdGFsbERldGFpbHMoKTsKLSAgICAgICAgaWYgKGRldGFpbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG5hdHVyZUlkcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIGRldGFpbHMgPSBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5SZW1vdmVDYXBhYmlsaXR5U3RlcF9kZWZhdWx0RGVzY3JpcHRpb24wLCBjYXBhYmlsaXR5LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hdHVyZUlkcy5sZW5ndGggPT0gMikgewotICAgICAgICAgICAgICAgIENhcGFiaWxpdHlSZWdpc3RyeSByZWcgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2FwYWJpbGl0eVJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICAgICAgQ2FwYWJpbGl0eSBvdGhlckNhcGFiaWxpdHkgPSByZWcKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDYXBhYmlsaXR5Rm9yTmF0dXJlKG5hdHVyZUlkc1sxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKG90aGVyQ2FwYWJpbGl0eSA9PSBjYXBhYmlsaXR5KQotICAgICAgICAgICAgICAgICAgICBvdGhlckNhcGFiaWxpdHkgPSByZWcuZ2V0Q2FwYWJpbGl0eUZvck5hdHVyZShuYXR1cmVJZHNbMF0pOwotICAgICAgICAgICAgICAgIGRldGFpbHMgPSBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5SZW1vdmVDYXBhYmlsaXR5U3RlcF9kZWZhdWx0RGVzY3JpcHRpb24xLCBjYXBhYmlsaXR5LmdldE5hbWUoKSwgb3RoZXJDYXBhYmlsaXR5LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgQ2FwYWJpbGl0eVJlZ2lzdHJ5IHJlZyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDYXBhYmlsaXR5UmVnaXN0cnkoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hdHVyZUlkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5IGNhcCA9IHJlZy5nZXRDYXBhYmlsaXR5Rm9yTmF0dXJlKG5hdHVyZUlkc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYXAgIT0gY2FwYWJpbGl0eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiXG4gICAgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoY2FwLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGV0YWlscyA9IE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlbW92ZUNhcGFiaWxpdHlTdGVwX2RlZmF1bHREZXNjcmlwdGlvbjIsIGNhcGFiaWxpdHkuZ2V0TmFtZSgpLCBtc2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRldGFpbHM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXaXphcmRTdGVwLgotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkIGdldFdpemFyZCgpIHsKLSAgICAgICAgaWYgKHdpemFyZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3aXphcmQgPSBjYXBhYmlsaXR5LmdldFVuaW5zdGFsbFdpemFyZCgpOwotICAgICAgICAgICAgaWYgKHdpemFyZCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHdpemFyZCA9IG5ldyBSZW1vdmVDYXBhYmlsaXR5V2l6YXJkKCk7Ci0gICAgICAgICAgICBpZiAod2l6YXJkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSwgcHJvamVjdCwgbmF0dXJlSWRzKTsKLSAgICAgICAgICAgICAgICB3aXphcmQuYWRkUGFnZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB3aXphcmQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUmVtb3ZlQ2FwYWJpbGl0eVdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1JlbW92ZUNhcGFiaWxpdHlXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwMWZhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUmVtb3ZlQ2FwYWJpbGl0eVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQ2FwYWJpbGl0eVVuaW5zdGFsbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogSW50ZXJuYWwgd29ya2JlbmNoIHdpemFyZCB0byByZW1vdmUgYSBjYXBhYmlsaXR5Ci0gKiBmcm9tIGEgcHJvamVjdC4gQWxzbyByZW1vdmVzIHByZXJlcXVpc2l0ZSBuYXR1cmVzCi0gKiBhcyBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPmluaXQ8L2NvZGU+IG1ldGhvZC4KLSAqIDxwPgotICogVGhpcyB3aXphcmQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUKLSAqIDxjb2RlPlJlbW92ZUNhcGFiaWxpdHlTdGVwPC9jb2RlPiBjbGFzcyBvbmx5LgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQ2FwYWJpbGl0eVdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzCi0gICAgICAgIElDYXBhYmlsaXR5VW5pbnN0YWxsV2l6YXJkIHsKLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIG5hdHVyZUlkczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgd2l6YXJkIGZvciByZW1vdmluZyBhIGNhcGFiaWxpdHkKLSAgICAgKiBmcm9tIGEgcHJvamVjdC4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovUmVtb3ZlQ2FwYWJpbGl0eVdpemFyZCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDYXBhYmlsaXR5VW5pbnN0YWxsV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwKLSAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIG5hdHVyZUlkcykgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICB0aGlzLm5hdHVyZUlkcyA9IG5hdHVyZUlkczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZU5hdHVyZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHByb2plY3QgbmF0dXJlcwotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVOYXR1cmVzKCkgewotICAgICAgICAvLyBkZWZpbmUgdGhlIG9wZXJhdGlvbiB0byB1cGRhdGUgbmF0dXJlcwotICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBvbGRJZHMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IG5ld0lkcyA9IG5ldyBBcnJheUxpc3Qob2xkSWRzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2xkSWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGtlZXBOYXR1cmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuYXR1cmVJZHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF0dXJlSWRzW2pdLmVxdWFscyhvbGRJZHNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBOYXR1cmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtlZXBOYXR1cmUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SWRzLmFkZChvbGRJZHNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdHMgPSBuZXcgU3RyaW5nW25ld0lkcy5zaXplKCldOwotICAgICAgICAgICAgICAgICAgICBuZXdJZHMudG9BcnJheShyZXN1bHRzKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKHJlc3VsdHMpOwotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gcnVuIHRoZSB1cGRhdGUgbmF0dXJlIG9wZXJhdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZW1vdmVDYXBhYmlsaXR5V2l6YXJkX2Vycm9yTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIG5vIHNwZWNpYWwgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgKChDb3JlRXhjZXB0aW9uKSB0KS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFVuZXhwZWN0ZWQgcnVudGltZSBleGNlcHRpb25zIGFuZCBlcnJvcnMgbWF5IHN0aWxsIG9jY3VyLgotICAgICAgICAgICAgCSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUGxhdGZvcm1VSS5QTFVHSU5fSUQsIDAsIHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCksIHQpKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgICAgICAub3BlbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZW1vdmVDYXBhYmlsaXR5V2l6YXJkX2Vycm9yTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuUmVtb3ZlQ2FwYWJpbGl0eVdpemFyZF9pbnRlcm5hbEVycm9yLCB0LmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1Jlc291cmNlSW5mb1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9SZXNvdXJjZUluZm9QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMWNmYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1Jlc291cmNlSW5mb1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuZGlhbG9ncy5SZXNvdXJjZUVuY29kaW5nRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLkxpbmVEZWxpbWl0ZXJFZGl0b3I7Ci0KLS8qKgotICogVGhlIFJlc291cmNlSW5mb1BhZ2UgaXMgdGhlIHBhZ2UgdGhhdCBzaG93cyB0aGUgYmFzaWMKLSAqIGluZm8gYWJvdXQgdGhlIHJlc291cmNlLgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbmZvUGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBlZGl0YWJsZUJveDsKLQotCXByaXZhdGUgQnV0dG9uIGV4ZWN1dGFibGVCb3g7Ci0KLQlwcml2YXRlIEJ1dHRvbiBhcmNoaXZlQm94OwotCi0JcHJpdmF0ZSBCdXR0b24gZGVyaXZlZEJveDsKLQotCXByaXZhdGUgYm9vbGVhbiBwcmV2aW91c1JlYWRPbmx5VmFsdWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJldmlvdXNFeGVjdXRhYmxlVmFsdWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJldmlvdXNBcmNoaXZlVmFsdWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJldmlvdXNEZXJpdmVkVmFsdWU7Ci0KLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gY2FjaGVkQ29udGVudERlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBSZXNvdXJjZUVuY29kaW5nRmllbGRFZGl0b3IgZW5jb2RpbmdFZGl0b3I7Ci0KLQlwcml2YXRlIExpbmVEZWxpbWl0ZXJFZGl0b3IgbGluZURlbGltaXRlckVkaXRvcjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBSRUFEX09OTFkgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUluZm9fcmVhZE9ubHk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRVhFQ1VUQUJMRSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlSW5mb19leGVjdXRhYmxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEFSQ0hJVkUgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUluZm9fYXJjaGl2ZTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBERVJJVkVEID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VJbmZvX2Rlcml2ZWQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVFlQRV9USVRMRSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlSW5mb190eXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExPQ0FUSU9OX1RJVExFID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VJbmZvX2xvY2F0aW9uOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFU09MVkVEX0xPQ0FUSU9OX1RJVExFID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VJbmZvX3Jlc29sdmVkTG9jYXRpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU0laRV9USVRMRSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlSW5mb19zaXplOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBBVEhfVElUTEUgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUluZm9fcGF0aDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUSU1FU1RBTVBfVElUTEUgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUluZm9fbGFzdE1vZGlmaWVkOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEZJTEVfRU5DT0RJTkdfVElUTEUgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hQcmVmZXJlbmNlX2VuY29kaW5nOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9FTkNPRElOR19USVRMRSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlSW5mb19maWxlRW5jb2RpbmdUaXRsZTsKLQotCS8vIE1heCB2YWx1ZSB3aWR0aCBpbiBjaGFyYWN0ZXJzIGJlZm9yZSB3cmFwcGluZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVkFMVUVfV0lEVEggPSA4MDsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZ3JvdXAgdGhhdCBzaG93cyB0aGUgbmFtZSwgbG9jYXRpb24sIHNpemUgYW5kIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIGNvbXBvc2l0ZSB0aGUgZ3JvdXAgd2lsbCBiZSBjcmVhdGVkIGluCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgdGhlIGluZm9ybWF0aW9uIGlzIGJlaW5nIHRha2VuIGZyb20uCi0JICogQHJldHVybiB0aGUgY29tcG9zaXRlIGZvciB0aGUgZ3JvdXAKLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVCYXNpY0luZm9Hcm91cChDb21wb3NpdGUgcGFyZW50LCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQotCQlGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCi0JCUNvbXBvc2l0ZSBiYXNpY0luZm9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJhc2ljSW5mb0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJYmFzaWNJbmZvQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWJhc2ljSW5mb0NvbXBvc2l0ZS5zZXRGb250KGZvbnQpOwotCi0JCS8vIFRoZSBncm91cCBmb3IgcGF0aAotCQlMYWJlbCBwYXRoTGFiZWwgPSBuZXcgTGFiZWwoYmFzaWNJbmZvQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBhdGhMYWJlbC5zZXRUZXh0KFBBVEhfVElUTEUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCXBhdGhMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcGF0aExhYmVsLnNldEZvbnQoZm9udCk7Ci0KLQkJLy8gcGF0aCB2YWx1ZSBsYWJlbAotCQlUZXh0IHBhdGhWYWx1ZVRleHQgPSBuZXcgVGV4dChiYXNpY0luZm9Db21wb3NpdGUsIFNXVC5XUkFQCi0JCQkJfCBTV1QuUkVBRF9PTkxZKTsKLQkJcGF0aFZhbHVlVGV4dC5zZXRUZXh0KHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhNQVhfVkFMVUVfV0lEVEgpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXBhdGhWYWx1ZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXBhdGhWYWx1ZVRleHQuc2V0Rm9udChmb250KTsKLQkJcGF0aFZhbHVlVGV4dC5zZXRCYWNrZ3JvdW5kKHBhdGhWYWx1ZVRleHQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKAotCQkJCVNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOwotCi0JCS8vIFRoZSBncm91cCBmb3IgdHlwZXMKLQkJTGFiZWwgdHlwZVRpdGxlID0gbmV3IExhYmVsKGJhc2ljSW5mb0NvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQl0eXBlVGl0bGUuc2V0VGV4dChUWVBFX1RJVExFKTsKLQkJdHlwZVRpdGxlLnNldEZvbnQoZm9udCk7Ci0KLQkJVGV4dCB0eXBlVmFsdWUgPSBuZXcgVGV4dChiYXNpY0luZm9Db21wb3NpdGUsIFNXVC5MRUZUIHwgU1dULlJFQURfT05MWSk7Ci0JCXR5cGVWYWx1ZS5zZXRUZXh0KElERVJlc291cmNlSW5mb1V0aWxzLmdldFR5cGVTdHJpbmcocmVzb3VyY2UsIGdldENvbnRlbnREZXNjcmlwdGlvbihyZXNvdXJjZSkpKTsKLQkJdHlwZVZhbHVlLnNldEJhY2tncm91bmQodHlwZVZhbHVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcigKLQkJCQlTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLQkJdHlwZVZhbHVlLnNldEZvbnQoZm9udCk7Ci0KLQkJLy8gVGhlIGdyb3VwIGZvciBsb2NhdGlvbgotCQlMYWJlbCBsb2NhdGlvblRpdGxlID0gbmV3IExhYmVsKGJhc2ljSW5mb0NvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlsb2NhdGlvblRpdGxlLnNldFRleHQoTE9DQVRJT05fVElUTEUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWxvY2F0aW9uVGl0bGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxvY2F0aW9uVGl0bGUuc2V0Rm9udChmb250KTsKLQotCQlUZXh0IGxvY2F0aW9uVmFsdWUgPSBuZXcgVGV4dChiYXNpY0luZm9Db21wb3NpdGUsIFNXVC5XUkFQCi0JCQkJfCBTV1QuUkVBRF9PTkxZKTsKLQkJbG9jYXRpb25WYWx1ZS5zZXRUZXh0KElERVJlc291cmNlSW5mb1V0aWxzLmdldExvY2F0aW9uVGV4dChyZXNvdXJjZSkpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoTUFYX1ZBTFVFX1dJRFRIKTsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsb2NhdGlvblZhbHVlLnNldExheW91dERhdGEoZ2QpOwotCQlsb2NhdGlvblZhbHVlLnNldEZvbnQoZm9udCk7Ci0JCWxvY2F0aW9uVmFsdWUuc2V0QmFja2dyb3VuZChsb2NhdGlvblZhbHVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcigKLQkJCQlTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLQotCQlpZiAoaXNQYXRoVmFyaWFibGUocmVzb3VyY2UpKSB7Ci0JCQlMYWJlbCByZXNvbHZlZExvY2F0aW9uVGl0bGUgPSBuZXcgTGFiZWwoYmFzaWNJbmZvQ29tcG9zaXRlLAotCQkJCQlTV1QuTEVGVCk7Ci0JCQlyZXNvbHZlZExvY2F0aW9uVGl0bGUuc2V0VGV4dChSRVNPTFZFRF9MT0NBVElPTl9USVRMRSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCQkJcmVzb2x2ZWRMb2NhdGlvblRpdGxlLnNldExheW91dERhdGEoZ2QpOwotCQkJcmVzb2x2ZWRMb2NhdGlvblRpdGxlLnNldEZvbnQoZm9udCk7Ci0KLQkJCVRleHQgcmVzb2x2ZWRMb2NhdGlvblZhbHVlID0gbmV3IFRleHQoYmFzaWNJbmZvQ29tcG9zaXRlLCBTV1QuV1JBUAotCQkJCQl8IFNXVC5SRUFEX09OTFkpOwotCQkJcmVzb2x2ZWRMb2NhdGlvblZhbHVlLnNldFRleHQoSURFUmVzb3VyY2VJbmZvVXRpbHMuZ2V0UmVzb2x2ZWRMb2NhdGlvblRleHQocmVzb3VyY2UpKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoTUFYX1ZBTFVFX1dJRFRIKTsKLQkJCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlyZXNvbHZlZExvY2F0aW9uVmFsdWUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlyZXNvbHZlZExvY2F0aW9uVmFsdWUuc2V0Rm9udChmb250KTsKLQkJCXJlc29sdmVkTG9jYXRpb25WYWx1ZS5zZXRCYWNrZ3JvdW5kKHJlc29sdmVkTG9jYXRpb25WYWx1ZQotCQkJCQkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOwotCQl9Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCS8vIFRoZSBncm91cCBmb3Igc2l6ZQotCQkJTGFiZWwgc2l6ZVRpdGxlID0gbmV3IExhYmVsKGJhc2ljSW5mb0NvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQkJc2l6ZVRpdGxlLnNldFRleHQoU0laRV9USVRMRSk7Ci0JCQlzaXplVGl0bGUuc2V0Rm9udChmb250KTsKLQotCQkJVGV4dCBzaXplVmFsdWUgPSBuZXcgVGV4dChiYXNpY0luZm9Db21wb3NpdGUsIFNXVC5MRUZUCi0JCQkJCXwgU1dULlJFQURfT05MWSk7Ci0JCQlzaXplVmFsdWUuc2V0VGV4dChJREVSZXNvdXJjZUluZm9VdGlscy5nZXRTaXplU3RyaW5nKHJlc291cmNlKSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2Qud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKE1BWF9WQUxVRV9XSURUSCk7Ci0JCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJc2l6ZVZhbHVlLnNldExheW91dERhdGEoZ2QpOwotCQkJc2l6ZVZhbHVlLnNldEZvbnQoZm9udCk7Ci0JCQlzaXplVmFsdWUuc2V0QmFja2dyb3VuZChzaXplVmFsdWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKAotCQkJCQlTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLQkJfQotCi0JCXJldHVybiBiYXNpY0luZm9Db21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLAotCQkJCUlJREVIZWxwQ29udGV4dElkcy5SRVNPVVJDRV9JTkZPX1BST1BFUlRZX1BBR0UpOwotCi0JCS8vIGxheW91dCB0aGUgcGFnZQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBnZXRFbGVtZW50KCk7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCVJlc291cmNlQXR0cmlidXRlcyBhdHRycyA9IHJlc291cmNlLmdldFJlc291cmNlQXR0cmlidXRlcygpOwotCQkJaWYgKGF0dHJzICE9IG51bGwpIHsKLQkJCQlwcmV2aW91c1JlYWRPbmx5VmFsdWUgPSBhdHRycy5pc1JlYWRPbmx5KCk7Ci0JCQkJcHJldmlvdXNFeGVjdXRhYmxlVmFsdWUgPSBhdHRycy5pc0V4ZWN1dGFibGUoKTsKLQkJCQlwcmV2aW91c0FyY2hpdmVWYWx1ZSA9IGF0dHJzLmlzQXJjaGl2ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmV2aW91c1JlYWRPbmx5VmFsdWUgPSBwcmV2aW91c0V4ZWN1dGFibGVWYWx1ZSA9IHByZXZpb3VzQXJjaGl2ZVZhbHVlID0gZmFsc2U7Ci0JCQl9Ci0JCQlwcmV2aW91c0Rlcml2ZWRWYWx1ZSA9IHJlc291cmNlLmlzRGVyaXZlZCgpOwotCQl9Ci0KLQkJLy8gdG9wIGxldmVsIGdyb3VwCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQljcmVhdGVCYXNpY0luZm9Hcm91cChjb21wb3NpdGUsIHJlc291cmNlKTsKLQkJY3JlYXRlU2VwYXJhdG9yKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVN0YXRlR3JvdXAoY29tcG9zaXRlLCByZXNvdXJjZSk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsgLy8gYSB2ZXJ0aWNhbCBzcGFjZXIKLQkJZW5jb2RpbmdFZGl0b3IgPSBuZXcgUmVzb3VyY2VFbmNvZGluZ0ZpZWxkRWRpdG9yKAotCQkJCWdldEZpZWxkRWRpdG9yTGFiZWwocmVzb3VyY2UpLCBjb21wb3NpdGUsIHJlc291cmNlKTsKLQkJZW5jb2RpbmdFZGl0b3Iuc2V0UGFnZSh0aGlzKTsKLQkJZW5jb2RpbmdFZGl0b3IubG9hZCgpOwotCi0JCWVuY29kaW5nRWRpdG9yLnNldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhGaWVsZEVkaXRvci5JU19WQUxJRCkpCi0JCQkJCXNldFZhbGlkKGVuY29kaW5nRWRpdG9yLmlzVmFsaWQoKSk7Ci0KLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJbGluZURlbGltaXRlckVkaXRvciA9IG5ldyBMaW5lRGVsaW1pdGVyRWRpdG9yKGNvbXBvc2l0ZSwgcmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCWxpbmVEZWxpbWl0ZXJFZGl0b3IuZG9Mb2FkKCk7Ci0JCX0KLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGFiZWwgZm9yIHRoZSBlbmNvZGluZyBmaWVsZCBlZGl0b3IgZm9yIHRoZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UgLQotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHRvIGVkaXQuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGaWVsZEVkaXRvckxhYmVsKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotCQkJcmV0dXJuIENPTlRBSU5FUl9FTkNPRElOR19USVRMRTsKLQkJcmV0dXJuIEZJTEVfRU5DT0RJTkdfVElUTEU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBpc0VkaXRhYmxlIGJ1dHRvbiBhbmQgaXQncyBhc3NvY2lhdGVkIGxhYmVsIGFzIGEgY2hpbGQgb2YKLQkgKiBwYXJlbnQgdXNpbmcgdGhlIGVkaXRhYmxlVmFsdWUgb2YgdGhlIHJlY2VpdmVyLiBUaGUgQ29tcG9zaXRlIHdpbGwgYmUgdGhlCi0JICogcGFyZW50IG9mIHRoZSBidXR0b24uCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvZiB0aGUgYnV0dG9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVkaXRhYmxlQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQotCQl0aGlzLmVkaXRhYmxlQm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5SSUdIVCk7Ci0JCXRoaXMuZWRpdGFibGVCb3guc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJdGhpcy5lZGl0YWJsZUJveC5zZXRUZXh0KFJFQURfT05MWSk7Ci0JCXRoaXMuZWRpdGFibGVCb3guc2V0U2VsZWN0aW9uKHRoaXMucHJldmlvdXNSZWFkT25seVZhbHVlKTsKLQkJdGhpcy5lZGl0YWJsZUJveC5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmVkaXRhYmxlQm94LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBpc0V4ZWN1dGFibGUgYnV0dG9uIGFuZCBpdCdzIGFzc29jaWF0ZWQgbGFiZWwgYXMgYSBjaGlsZCBvZgotCSAqIHBhcmVudCB1c2luZyB0aGUgZWRpdGFibGVWYWx1ZSBvZiB0aGUgcmVjZWl2ZXIuIFRoZSBDb21wb3NpdGUgd2lsbCBiZSB0aGUKLQkgKiBwYXJlbnQgb2YgdGhlIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9mIHRoZSBidXR0b24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRXhlY3V0YWJsZUJ1dHRvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJdGhpcy5leGVjdXRhYmxlQm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5SSUdIVCk7Ci0JCXRoaXMuZXhlY3V0YWJsZUJveC5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQl0aGlzLmV4ZWN1dGFibGVCb3guc2V0VGV4dChFWEVDVVRBQkxFKTsKLQkJdGhpcy5leGVjdXRhYmxlQm94LnNldFNlbGVjdGlvbih0aGlzLnByZXZpb3VzRXhlY3V0YWJsZVZhbHVlKTsKLQkJdGhpcy5leGVjdXRhYmxlQm94LnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMuZXhlY3V0YWJsZUJveC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaXNBcmNoaXZlIGJ1dHRvbiBhbmQgaXQncyBhc3NvY2lhdGVkIGxhYmVsIGFzIGEgY2hpbGQgb2YKLQkgKiBwYXJlbnQgdXNpbmcgdGhlIGVkaXRhYmxlVmFsdWUgb2YgdGhlIHJlY2VpdmVyLiBUaGUgQ29tcG9zaXRlIHdpbGwgYmUgdGhlCi0JICogcGFyZW50IG9mIHRoZSBidXR0b24uCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvZiB0aGUgYnV0dG9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFyY2hpdmVCdXR0b24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCi0JCXRoaXMuYXJjaGl2ZUJveCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0sgfCBTV1QuUklHSFQpOwotCQl0aGlzLmFyY2hpdmVCb3guc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJdGhpcy5hcmNoaXZlQm94LnNldFRleHQoQVJDSElWRSk7Ci0JCXRoaXMuYXJjaGl2ZUJveC5zZXRTZWxlY3Rpb24odGhpcy5wcmV2aW91c0FyY2hpdmVWYWx1ZSk7Ci0JCXRoaXMuYXJjaGl2ZUJveC5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmFyY2hpdmVCb3guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGRlcml2ZWQgYnV0dG9uIGFuZCBpdCdzIGFzc29jaWF0ZWQgbGFiZWwgYXMgYSBjaGlsZCBvZiBwYXJlbnQKLQkgKiB1c2luZyB0aGUgZGVyaXZlZCBvZiB0aGUgcmVjZWl2ZXIuIFRoZSBDb21wb3NpdGUgd2lsbCBiZSB0aGUgcGFyZW50IG9mCi0JICogdGhlIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9mIHRoZSBidXR0b24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVyaXZlZEJ1dHRvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJdGhpcy5kZXJpdmVkQm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5SSUdIVCk7Ci0JCXRoaXMuZGVyaXZlZEJveC5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQl0aGlzLmRlcml2ZWRCb3guc2V0VGV4dChERVJJVkVEKTsKLQkJdGhpcy5kZXJpdmVkQm94LnNldFNlbGVjdGlvbih0aGlzLnByZXZpb3VzRGVyaXZlZFZhbHVlKTsKLQkJdGhpcy5kZXJpdmVkQm94LnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMuZGVyaXZlZEJveC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHNlcGFyYXRvciB0aGF0IGdvZXMgYWNyb3NzIHRoZSBlbnRpcmUgcGFnZQotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgb2YgdGhlIHNlcGVyYXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZXBhcmF0b3IoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCi0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZ3JvdXAgdGhhdCBzaG93cyB0aGUgcmVhZCBvbmx5IHN0YXRlIGFuZCB0aGUgdGltZXN0YW1wLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb21wb3NpdGUgdGhlIGdyb3VwIHdpbGwgYmUgY3JlYXRlZCBpbgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHRoZSBpbmZvcm1hdGlvbiBpcyBiZWluZyB0YWtlbiBmcm9tLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTdGF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCi0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljb21wb3NpdGUuc2V0Rm9udChmb250KTsKLQotCQlMYWJlbCB0aW1lU3RhbXBMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGltZVN0YW1wTGFiZWwuc2V0VGV4dChUSU1FU1RBTVBfVElUTEUpOwotCQl0aW1lU3RhbXBMYWJlbC5zZXRGb250KGZvbnQpOwotCi0JCS8vIHRpbWVTdGFtcCB2YWx1ZSBsYWJlbAotCQlUZXh0IHRpbWVTdGFtcFZhbHVlID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJdGltZVN0YW1wVmFsdWUuc2V0VGV4dChJREVSZXNvdXJjZUluZm9VdGlscy5nZXREYXRlU3RyaW5nVmFsdWUocmVzb3VyY2UpKTsKLQkJdGltZVN0YW1wVmFsdWUuc2V0Rm9udChmb250KTsKLQkJdGltZVN0YW1wVmFsdWUuc2V0QmFja2dyb3VuZCh0aW1lU3RhbXBWYWx1ZS5nZXREaXNwbGF5KCkKLQkJCQkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKSk7Ci0JCXRpbWVTdGFtcFZhbHVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gTm90IHJlbGV2YW50IHRvIHByb2plY3RzCi0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCVVSSSBsb2NhdGlvbiA9IHJlc291cmNlLmdldExvY2F0aW9uVVJJKCk7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlGaWxlU3lzdGVtIGZzID0gRUZTLmdldEZpbGVTeXN0ZW0obG9jYXRpb24uZ2V0U2NoZW1lKCkpOwotCQkJCQlpbnQgYXR0cmlidXRlcyA9IGZzLmF0dHJpYnV0ZXMoKTsKLQkJCQkJaWYgKChhdHRyaWJ1dGVzICYgRUZTLkFUVFJJQlVURV9SRUFEX09OTFkpICE9IDApCi0JCQkJCQljcmVhdGVFZGl0YWJsZUJ1dHRvbihjb21wb3NpdGUpOwotCQkJCQlpZiAoKGF0dHJpYnV0ZXMgJiBFRlMuQVRUUklCVVRFX0VYRUNVVEFCTEUpICE9IDApCi0JCQkJCQljcmVhdGVFeGVjdXRhYmxlQnV0dG9uKGNvbXBvc2l0ZSk7Ci0JCQkJCWlmICgoYXR0cmlidXRlcyAmIEVGUy5BVFRSSUJVVEVfQVJDSElWRSkgIT0gMCkKLQkJCQkJCWNyZWF0ZUFyY2hpdmVCdXR0b24oY29tcG9zaXRlKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9pZ25vcmUgaWYgd2UgY2FuJ3QgYWNjZXNzIHRoZSBmaWxlIHN5c3RlbSBmb3IgdGhpcyByZXNvdXJjZQotCQkJCX0KLQkJCX0KLQkJCWNyZWF0ZURlcml2ZWRCdXR0b24oY29tcG9zaXRlKTsKLQkJCS8vY3JlYXRlIHdhcm5pbmcgZm9yIGV4ZWN1dGFibGUgZmxhZwotCQkJaWYgKGV4ZWN1dGFibGVCb3ggIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkgICAgICAgIENvbXBvc2l0ZSBub3RlQ29tcG9zaXRlID0gY3JlYXRlTm90ZUNvbXBvc2l0ZShmb250LCBjb21wb3NpdGUsCi0JCSAgICAgICAgCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5QcmVmZXJlbmNlX25vdGUsIElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlSW5mb19leFdhcm5pbmcpOwotCQkgICAgICAgIEdyaWREYXRhIG5vdGVEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCSAgICAgICAgbm90ZURhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkgICAgICAgIG5vdGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShub3RlRGF0YSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGNhY2hlZENvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWNhY2hlZENvbnRlbnREZXNjcmlwdGlvbiA9ICgoSUZpbGUpcmVzb3VyY2UpLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENvbnRlbnREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHJlc291cmNlIGlzIGEgbGlua2VkIHJlc291cmNlIGJvdW5kIHRvIGEgcGF0aAotCSAqIHZhcmlhYmxlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgcmVzb3VyY2UgdG8gdGVzdAotCSAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgYSBsaW5rZWQKLQkgKiAgICAgICAgIHJlc291cmNlIGJvdW5kIHRvIGEgcGF0aCB2YXJpYWJsZS4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRoZSBnaXZlbgotCSAqICAgICAgICAgcmVzb3VyY2UgaXMgZWl0aGVyIG5vdCBhIGxpbmtlZCByZXNvdXJjZSBvciBpdCBpcyBub3QgdXNpbmcgYQotCSAqICAgICAgICAgcGF0aCB2YXJpYWJsZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQYXRoVmFyaWFibGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmICghcmVzb3VyY2UuaXNMaW5rZWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJUGF0aCByZXNvbHZlZExvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKHJlc29sdmVkTG9jYXRpb24gPT0gbnVsbCkgewotCQkJLy8gbWlzc2luZyBwYXRoIHZhcmlhYmxlCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlJUGF0aCByYXdMb2NhdGlvbiA9IHJlc291cmNlLmdldFJhd0xvY2F0aW9uKCk7Ci0JCWlmIChyZXNvbHZlZExvY2F0aW9uLmVxdWFscyhyYXdMb2NhdGlvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgdGhlIGVkaXRhYmxlQm94IHRvIHRoZSBmYWxzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0KLQkJLy8gTm90aGluZyB0byB1cGRhdGUgaWYgd2UgbmV2ZXIgbWFkZSB0aGUgYm94Ci0JCWlmICh0aGlzLmVkaXRhYmxlQm94ICE9IG51bGwpCi0JCQl0aGlzLmVkaXRhYmxlQm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0KLQkJLy8gTm90aGluZyB0byB1cGRhdGUgaWYgd2UgbmV2ZXIgbWFkZSB0aGUgYm94Ci0JCWlmICh0aGlzLmV4ZWN1dGFibGVCb3ggIT0gbnVsbCkKLQkJCXRoaXMuZXhlY3V0YWJsZUJveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCi0JCS8vIE5vdGhpbmcgdG8gdXBkYXRlIGlmIHdlIG5ldmVyIG1hZGUgdGhlIGJveAotCQlpZiAodGhpcy5kZXJpdmVkQm94ICE9IG51bGwpCi0JCQl0aGlzLmRlcml2ZWRCb3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQotCQllbmNvZGluZ0VkaXRvci5sb2FkRGVmYXVsdCgpOwotCi0JCWlmIChsaW5lRGVsaW1pdGVyRWRpdG9yICE9IG51bGwpCi0JCQlsaW5lRGVsaW1pdGVyRWRpdG9yLmxvYWREZWZhdWx0KCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBBcHBseSB0aGUgcmVhZCBvbmx5IHN0YXRlIGFuZCB0aGUgZW5jb2RpbmcgdG8gdGhlIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBnZXRFbGVtZW50KCk7Ci0KLQkJZW5jb2RpbmdFZGl0b3Iuc3RvcmUoKTsKLQotCQlpZiAobGluZURlbGltaXRlckVkaXRvciAhPSBudWxsKQotCQkJbGluZURlbGltaXRlckVkaXRvci5zdG9yZSgpOwotCi0JCXRyeSB7Ci0JCQlSZXNvdXJjZUF0dHJpYnV0ZXMgYXR0cnMgPSByZXNvdXJjZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKTsKLQkJCWlmIChhdHRycyAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBoYXNDaGFuZ2UgPSBmYWxzZTsKLQkJCQkvLyBOb3RoaW5nIHRvIHVwZGF0ZSBpZiB3ZSBuZXZlciBtYWRlIHRoZSBib3gKLQkJCQlpZiAoZWRpdGFibGVCb3ggIT0gbnVsbAotCQkJCQkJJiYgZWRpdGFibGVCb3guZ2V0U2VsZWN0aW9uKCkgIT0gcHJldmlvdXNSZWFkT25seVZhbHVlKSB7Ci0JCQkJCWF0dHJzLnNldFJlYWRPbmx5KGVkaXRhYmxlQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaGFzQ2hhbmdlID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKGV4ZWN1dGFibGVCb3ggIT0gbnVsbAotCQkJCQkJJiYgZXhlY3V0YWJsZUJveC5nZXRTZWxlY3Rpb24oKSAhPSBwcmV2aW91c0V4ZWN1dGFibGVWYWx1ZSkgewotCQkJCQlhdHRycy5zZXRFeGVjdXRhYmxlKGV4ZWN1dGFibGVCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQloYXNDaGFuZ2UgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoYXJjaGl2ZUJveCAhPSBudWxsCi0JCQkJCQkmJiBhcmNoaXZlQm94LmdldFNlbGVjdGlvbigpICE9IHByZXZpb3VzQXJjaGl2ZVZhbHVlKSB7Ci0JCQkJCWF0dHJzLnNldEFyY2hpdmUoYXJjaGl2ZUJveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWhhc0NoYW5nZSA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChoYXNDaGFuZ2UpIHsKLQkJCQkJcmVzb3VyY2Uuc2V0UmVzb3VyY2VBdHRyaWJ1dGVzKGF0dHJzKTsKLQkJCQkJYXR0cnMgPSByZXNvdXJjZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKTsKLQkJCQkJaWYgKGF0dHJzICE9IG51bGwpIHsKLQkJCQkJCXByZXZpb3VzUmVhZE9ubHlWYWx1ZSA9IGF0dHJzLmlzUmVhZE9ubHkoKTsKLQkJCQkJCXByZXZpb3VzRXhlY3V0YWJsZVZhbHVlID0gYXR0cnMuaXNFeGVjdXRhYmxlKCk7Ci0JCQkJCQlwcmV2aW91c0FyY2hpdmVWYWx1ZSA9IGF0dHJzLmlzQXJjaGl2ZSgpOwotCQkJCQkJaWYgKGVkaXRhYmxlQm94ICE9IG51bGwpCi0JCQkJCQkJZWRpdGFibGVCb3guc2V0U2VsZWN0aW9uKGF0dHJzLmlzUmVhZE9ubHkoKSk7Ci0JCQkJCQlpZiAoZXhlY3V0YWJsZUJveCAhPSBudWxsKQotCQkJCQkJCWV4ZWN1dGFibGVCb3guc2V0U2VsZWN0aW9uKGF0dHJzLmlzRXhlY3V0YWJsZSgpKTsKLQkJCQkJCWlmIChhcmNoaXZlQm94ICE9IG51bGwpCi0JCQkJCQkJYXJjaGl2ZUJveC5zZXRTZWxlY3Rpb24oYXR0cnMuaXNBcmNoaXZlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBOb3RoaW5nIHRvIHVwZGF0ZSBpZiB3ZSBuZXZlciBtYWRlIHRoZSBib3gKLQkJCWlmICh0aGlzLmRlcml2ZWRCb3ggIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gbG9jYWxEZXJpdmVkVmFsdWUgPSBkZXJpdmVkQm94LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChwcmV2aW91c0Rlcml2ZWRWYWx1ZSAhPSBsb2NhbERlcml2ZWRWYWx1ZSkgewotCQkJCQlyZXNvdXJjZS5zZXREZXJpdmVkKGxvY2FsRGVyaXZlZFZhbHVlKTsKLQkJCQkJYm9vbGVhbiBpc0Rlcml2ZWQgPSByZXNvdXJjZS5pc0Rlcml2ZWQoKTsKLQkJCQkJcHJldmlvdXNEZXJpdmVkVmFsdWUgPSBpc0Rlcml2ZWQ7Ci0JCQkJCWRlcml2ZWRCb3guc2V0U2VsZWN0aW9uKGlzRGVyaXZlZCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIElERVdvcmtiZW5jaE1lc3NhZ2VzLkludGVybmFsRXJyb3IsCi0JCQkJCWV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1Jlc291cmNlU29ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUmVzb3VyY2VTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRjMTNmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUmVzb3VyY2VTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLQotLyoqCi0gKiBTb3J0ZXIgZm9yIHZpZXdlcnMgdGhhdCBkaXNwbGF5IGl0ZW1zIG9mIHR5cGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPi4KLSAqIFRoZSBzb3J0ZXIgc3VwcG9ydHMgdHdvIHNvcnQgY3JpdGVyaWE6Ci0gKiA8cD4KLSAqIDxjb2RlPk5BTUU8L2NvZGU+OiBGb2xkZXJzIGFyZSBnaXZlbiBvcmRlciBwcmVjZWRlbmNlLCBmb2xsb3dlZCBieSBmaWxlcy4KLSAqIFdpdGhpbiB0aGVzZSB0d28gZ3JvdXBzIHJlc291cmNlcyBhcmUgb3JkZXJlZCBieSBuYW1lLiAgQWxsIG5hbWUgY29tcGFyaXNvbnMKLSAqIGFyZSBjYXNlLWluc2Vuc2l0aXZlLgotICogPC9wPgotICogPHA+Ci0gKiA8Y29kZT5UWVBFPC9jb2RlPjogRm9sZGVycyBhcmUgZ2l2ZW4gb3JkZXIgcHJlY2VkZW5jZSwgZm9sbG93ZWQgYnkgZmlsZXMuCi0gKiBXaXRoaW4gdGhlc2UgdHdvIGdyb3VwcyByZXNvdXJjZXMgYXJlIG9yZGVyZWQgYnkgZXh0ZW5zaW9uLiAgQWxsIGV4dGVuc2lvbgotICogY29tcGFyaXNvbnMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBhcmd1bWVudCB2YWx1ZSB0aGF0IGluZGljYXRlcyB0byBzb3J0IGl0ZW1zIGJ5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTkFNRSA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBhcmd1bWVudCB2YWx1ZSB0aGF0IGluZGljYXRlcyB0byBzb3J0IGl0ZW1zIGJ5IGV4dGVuc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUWVBFID0gMjsKLQotICAgIHByaXZhdGUgaW50IGNyaXRlcmlhOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlc291cmNlIHNvcnRlciB0aGF0IHdpbGwgdXNlIHRoZSBnaXZlbiBzb3J0IGNyaXRlcmlhLgotICAgICAqCi0gICAgICogQHBhcmFtIGNyaXRlcmlhIHRoZSBzb3J0IGNyaXRlcmlvbiB0byB1c2U6IG9uZSBvZiA8Y29kZT5OQU1FPC9jb2RlPiBvciAKLSAgICAgKiAgIDxjb2RlPlRZUEU8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlU29ydGVyKGludCBjcml0ZXJpYSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmNyaXRlcmlhID0gY3JpdGVyaWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgcmVsYXRpdmUgc29ydCBwcmlvcml0eSBvZiB0aGUgCi0gICAgICogZ2l2ZW4gZWxlbWVudCBiYXNlZCBvbiBpdHMgY2xhc3MuCi0gICAgICogPHA+Ci0gICAgICogPHVsPgotICAgICAqICAgPGxpPnJlc291cmNlcyAoPGNvZGU+SVJlc291cmNlPC9jb2RlPikgLSAyPC9saT4KLSAgICAgKiAgIDxsaT5wcm9qZWN0IHJlZmVyZW5jZXMgKDxjb2RlPlByb2plY3RSZWZlcmVuY2U8L2NvZGU+KSAtIDE8L2xpPgotICAgICAqICAgPGxpPmV2ZXJ5dGhpbmcgZWxzZSAtIDA8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBzb3J0IHByaW9yaXR5IChsYXJnZXIgbnVtYmVycyBtZWFucyBtb3JlIGltcG9ydGFudCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNsYXNzQ29tcGFyaXNvbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXJTb3J0ZXIuCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgIC8vaGF2ZSB0byBkZWFsIHdpdGggbm9uLXJlc291cmNlcyBpbiBuYXZpZ2F0b3IKLSAgICAgICAgLy9pZiBvbmUgb3IgYm90aCBvYmplY3RzIGFyZSBub3QgcmVzb3VyY2VzLCByZXR1cm5lZCBhIGNvbXBhcmlzb24gCi0gICAgICAgIC8vYmFzZWQgb24gY2xhc3MuCi0gICAgICAgIGlmICghKG8xIGluc3RhbmNlb2YgSVJlc291cmNlICYmIG8yIGluc3RhbmNlb2YgSVJlc291cmNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVDbGFzcyhvMSwgbzIpOwotICAgICAgICB9Ci0gICAgICAgIElSZXNvdXJjZSByMSA9IChJUmVzb3VyY2UpIG8xOwotICAgICAgICBJUmVzb3VyY2UgcjIgPSAoSVJlc291cmNlKSBvMjsKLQotICAgICAgICBpZiAocjEgaW5zdGFuY2VvZiBJQ29udGFpbmVyICYmIHIyIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlTmFtZXMocjEsIHIyKTsKLSAgICAgICAgZWxzZSBpZiAocjEgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBlbHNlIGlmIChyMiBpbnN0YW5jZW9mIElDb250YWluZXIpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgZWxzZSBpZiAoY3JpdGVyaWEgPT0gTkFNRSkKLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlTmFtZXMocjEsIHIyKTsKLSAgICAgICAgZWxzZSBpZiAoY3JpdGVyaWEgPT0gVFlQRSkKLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlVHlwZXMocjEsIHIyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG51bWJlciByZWZsZWN0aW5nIHRoZSBjb2xsYXRpb24gb3JkZXIgb2YgdGhlIGdpdmVuIGVsZW1lbnRzCi0gICAgICogYmFzZWQgb24gdGhlaXIgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudDEgdGhlIGZpcnN0IGVsZW1lbnQgdG8gYmUgb3JkZXJlZAotICAgICAqIEBwYXJhbSBlbGVtZW50MiB0aGUgc2Vjb25kIGVsZW1lbnQgdG8gYmUgb3JkZXJlZAotICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgbGVzcyAgdGhhbiB0aGUgCi0gICAgICogIHNlY29uZCBlbGVtZW50OyB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMKLSAgICAgKiAgZXF1YWwgdG8gdGhlIHNlY29uZCBlbGVtZW50OyBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0Ci0gICAgICogIGVsZW1lbnQgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQgZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZUNsYXNzKE9iamVjdCBlbGVtZW50MSwgT2JqZWN0IGVsZW1lbnQyKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbXBhcmlzb24oZWxlbWVudDEpIC0gY2xhc3NDb21wYXJpc29uKGVsZW1lbnQyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbnVtYmVyIHJlZmxlY3RpbmcgdGhlIGNvbGxhdGlvbiBvcmRlciBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2VzCi0gICAgICogYmFzZWQgb24gdGhlaXIgcmVzb3VyY2UgbmFtZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UxIHRoZSBmaXJzdCByZXNvdXJjZSBlbGVtZW50IHRvIGJlIG9yZGVyZWQKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UyIHRoZSBzZWNvbmQgcmVzb3VyY2UgZWxlbWVudCB0byBiZSBvcmRlcmVkCi0gICAgICogQHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBsZXNzICB0aGFuIHRoZSAKLSAgICAgKiAgc2Vjb25kIGVsZW1lbnQ7IHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcwotICAgICAqICBlcXVhbCB0byB0aGUgc2Vjb25kIGVsZW1lbnQ7IGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QKLSAgICAgKiAgZWxlbWVudCBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBjb21wYXJlTmFtZXMoSVJlc291cmNlIHJlc291cmNlMSwgSVJlc291cmNlIHJlc291cmNlMikgewotICAgICAgICByZXR1cm4gY29sbGF0b3IuY29tcGFyZShyZXNvdXJjZTEuZ2V0TmFtZSgpLCByZXNvdXJjZTIuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbnVtYmVyIHJlZmxlY3RpbmcgdGhlIGNvbGxhdGlvbiBvcmRlciBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2VzCi0gICAgICogYmFzZWQgb24gdGhlaXIgcmVzcGVjdGl2ZSBmaWxlIGV4dGVuc2lvbnMuIFJlc291cmNlcyB3aXRoIHRoZSBzYW1lIGZpbGUKLSAgICAgKiBleHRlbnNpb24gd2lsbCBiZSBjb2xsYXRlZCBiYXNlZCBvbiB0aGVpciBuYW1lcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZTEgdGhlIGZpcnN0IHJlc291cmNlIGVsZW1lbnQgdG8gYmUgb3JkZXJlZAotICAgICAqIEBwYXJhbSByZXNvdXJjZTIgdGhlIHNlY29uZCByZXNvdXJjZSBlbGVtZW50IHRvIGJlIG9yZGVyZWQKLSAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGxlc3MgIHRoYW4gdGhlIAotICAgICAqICBzZWNvbmQgZWxlbWVudDsgdGhlIHZhbHVlIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzCi0gICAgICogIGVxdWFsIHRvIHRoZSBzZWNvbmQgZWxlbWVudDsgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdAotICAgICAqICBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVUeXBlcyhJUmVzb3VyY2UgcmVzb3VyY2UxLCBJUmVzb3VyY2UgcmVzb3VyY2UyKSB7Ci0gICAgICAgIFN0cmluZyBleHQxID0gZ2V0RXh0ZW5zaW9uRm9yKHJlc291cmNlMSk7Ci0gICAgICAgIFN0cmluZyBleHQyID0gZ2V0RXh0ZW5zaW9uRm9yKHJlc291cmNlMik7Ci0KLSAgICAgICAgLy8gQ29tcGFyZSBleHRlbnNpb25zLiAgSWYgdGhleSdyZSBkaWZmZXJlbnQgdGhlbiByZXR1cm4gYSB2YWx1ZSB0aGF0Ci0gICAgICAgIC8vIGluZGljYXRlcyBjb3JyZWN0IGV4dGVuc2lvbiBvcmRlcmluZy4gIElmIHRoZXkncmUgdGhlIHNhbWUgdGhlbgotICAgICAgICAvLyByZXR1cm4gYSB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGUgY29ycmVjdCBOQU1FIG9yZGVyaW5nLgotICAgICAgICBpbnQgcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShleHQxLCBleHQyKTsKLQotICAgICAgICBpZiAocmVzdWx0ICE9IDApIC8vIGllLi0gZGlmZmVyZW50IGV4dGVuc2lvbnMKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBhcmVOYW1lcyhyZXNvdXJjZTEsIHJlc291cmNlMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc29ydCBjcml0ZXJpYSBvZiB0aGlzIHRoaXMgc29ydGVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc29ydCBjcml0ZXJpb246IG9uZSBvZiA8Y29kZT5OQU1FPC9jb2RlPiBvciA8Y29kZT5UWVBFPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q3JpdGVyaWEoKSB7Ci0gICAgICAgIHJldHVybiBjcml0ZXJpYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBleHRlbnNpb24gcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlCi0gICAgICogQHJldHVybiB0aGUgZmlsZSBleHRlbnNpb24sIHBvc3NpYmlseSB0aGUgZW1wdHkgc3RyaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZW5zaW9uRm9yKElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICBTdHJpbmcgZXh0ID0gcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgICAgICByZXR1cm4gZXh0ID09IG51bGwgPyAiIiA6IGV4dDsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9SZXNvdXJjZVRyZWVBbmRMaXN0R3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9SZXNvdXJjZVRyZWVBbmRMaXN0R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhOGNlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUmVzb3VyY2VUcmVlQW5kTGlzdEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkV2ZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVWaWV3ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlRXhwYW5zaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci0KLS8qKgotICoJV29ya2JlbmNoLWxldmVsIGNvbXBvc2l0ZSB0aGF0IGNvbWJpbmVzIGEgQ2hlY2tib3hUcmVlVmlld2VyIGFuZCBDaGVja2JveExpc3RWaWV3ZXIuCi0gKglBbGwgdmlld2VyIHNlbGVjdGlvbi1kcml2ZW4gaW50ZXJhY3Rpb25zIGFyZSBoYW5kbGVkIHdpdGhpbiB0aGlzIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VUcmVlQW5kTGlzdEdyb3VwIGV4dGVuZHMgRXZlbnRNYW5hZ2VyIGltcGxlbWVudHMKLQkJSUNoZWNrU3RhdGVMaXN0ZW5lciwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSVRyZWVWaWV3ZXJMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBPYmplY3Qgcm9vdDsKLQotICAgIHByaXZhdGUgT2JqZWN0IGN1cnJlbnRUcmVlU2VsZWN0aW9uOwotCi0gICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGV4cGFuZGVkVHJlZU5vZGVzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIHByaXZhdGUgTWFwIGNoZWNrZWRTdGF0ZVN0b3JlID0gbmV3IEhhc2hNYXAoOSk7Ci0KLSAgICBwcml2YXRlIENvbGxlY3Rpb24gd2hpdGVDaGVja2VkVHJlZUl0ZW1zID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIHByaXZhdGUgSVRyZWVDb250ZW50UHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlcjsKLQotICAgIHByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgbGlzdENvbnRlbnRQcm92aWRlcjsKLQotICAgIHByaXZhdGUgSUxhYmVsUHJvdmlkZXIgdHJlZUxhYmVsUHJvdmlkZXI7Ci0KLSAgICBwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxpc3RMYWJlbFByb3ZpZGVyOwotCi0gICAgLy8gd2lkZ2V0cwotICAgIHByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLSAgICBwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgbGlzdFZpZXdlcjsKLQotICAgIC8vaGVpZ2h0IGhpbnQgZm9yIHZpZXdlcnMKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgUFJFRkVSUkVEX0hFSUdIVCA9IDE1MDsKLQotICAgIC8qKgotICAgICAqCUNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLiAgVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdpc2ggdG8gc3BlY2lmeQotICAgICAqCXRoZSB3aWR0aCBhbmQvb3IgaGVpZ2h0IG9mIHRoZSBjb21iaW5lZCB3aWRnZXQgKHRvIG9ubHkgaGFyZGNvZGUgb25lIG9mIHRoZQotICAgICAqCXNpemluZyBkaW1lbnNpb25zLCBzcGVjaWZ5IHRoZSBvdGhlciBkaW1lbnNpb24ncyB2YWx1ZSBhcyAtMSkKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqIEBwYXJhbSByb290T2JqZWN0Ci0gICAgICogQHBhcmFtIHRyZWVDb250ZW50UHJvdmlkZXIKLSAgICAgKiBAcGFyYW0gdHJlZUxhYmVsUHJvdmlkZXIKLSAgICAgKiBAcGFyYW0gbGlzdENvbnRlbnRQcm92aWRlcgotICAgICAqIEBwYXJhbSBsaXN0TGFiZWxQcm92aWRlcgotICAgICAqIEBwYXJhbSBzdHlsZQotICAgICAqIEBwYXJhbSB1c2VIZWlnaHRIaW50IElmIHRydWUgdGhlbiB1c2UgdGhlIGhlaWdodCBoaW50Ci0gICAgICogIHRvIG1ha2UgdGhpcyBncm91cCBiaWcgZW5vdWdoCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VUcmVlQW5kTGlzdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCByb290T2JqZWN0LAotICAgICAgICAgICAgSVRyZWVDb250ZW50UHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciwKLSAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIHRyZWVMYWJlbFByb3ZpZGVyLAotICAgICAgICAgICAgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgbGlzdENvbnRlbnRQcm92aWRlciwKLSAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxpc3RMYWJlbFByb3ZpZGVyLCBpbnQgc3R5bGUsIGJvb2xlYW4gdXNlSGVpZ2h0SGludCkgewotCi0gICAgICAgIHJvb3QgPSByb290T2JqZWN0OwotICAgICAgICB0aGlzLnRyZWVDb250ZW50UHJvdmlkZXIgPSB0cmVlQ29udGVudFByb3ZpZGVyOwotICAgICAgICB0aGlzLmxpc3RDb250ZW50UHJvdmlkZXIgPSBsaXN0Q29udGVudFByb3ZpZGVyOwotICAgICAgICB0aGlzLnRyZWVMYWJlbFByb3ZpZGVyID0gdHJlZUxhYmVsUHJvdmlkZXI7Ci0gICAgICAgIHRoaXMubGlzdExhYmVsUHJvdmlkZXIgPSBsaXN0TGFiZWxQcm92aWRlcjsKLSAgICAgICAgY3JlYXRlQ29udGVudHMocGFyZW50LCBzdHlsZSwgdXNlSGVpZ2h0SGludCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQganVzdCBiZWZvcmUgdGhpcyB3aW5kb3cgYmVjb21lcyB2aXNpYmxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFib3V0VG9PcGVuKCkgewotICAgICAgICBkZXRlcm1pbmVXaGl0ZUNoZWNrZWREZXNjZW5kZW50cyhyb290KTsKLSAgICAgICAgY2hlY2tOZXdUcmVlRWxlbWVudHModHJlZUNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhyb290KSk7Ci0gICAgICAgIGN1cnJlbnRUcmVlU2VsZWN0aW9uID0gbnVsbDsKLQotICAgICAgICAvL3NlbGVjdCB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdAotICAgICAgICBPYmplY3RbXSBlbGVtZW50cyA9IHRyZWVDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMocm9vdCk7Ci0gICAgICAgIE9iamVjdCBwcmltYXJ5ID0gZWxlbWVudHMubGVuZ3RoID4gMCA/IGVsZW1lbnRzWzBdIDogbnVsbDsKLSAgICAgICAgaWYgKHByaW1hcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocHJpbWFyeSkpOwotICAgICAgICB9Ci0gICAgICAgIHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQWRkIHRoZSBwYXNzZWQgbGlzdGVuZXIgdG8gc2VsZidzIGNvbGxlY3Rpb24gb2YgY2xpZW50cwotICAgICAqCXRoYXQgbGlzdGVuIGZvciBjaGFuZ2VzIHRvIGVsZW1lbnQgY2hlY2tlZCBzdGF0ZXMKLSAgICAgKgotICAgICAqCUBwYXJhbSBsaXN0ZW5lciBJQ2hlY2tTdGF0ZUxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgYWRkTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCVJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFsbCBjaGlsZHJlbiBvZiB0aGUgcGFzc2VkIHRyZWUgZWxlbWVudAotICAgICAqCWFyZSBjdXJyZW50bHkgd2hpdGUtY2hlY2tlZAotICAgICAqCi0gICAgICoJQHJldHVybiBib29sZWFuCi0gICAgICoJQHBhcmFtIHRyZWVFbGVtZW50IGphdmEubGFuZy5PYmplY3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhcmVBbGxDaGlsZHJlbldoaXRlQ2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQpIHsKLSAgICAgICAgT2JqZWN0W10gY2hpbGRyZW4gPSB0cmVlQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKHRyZWVFbGVtZW50KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgaWYgKCF3aGl0ZUNoZWNrZWRUcmVlSXRlbXMuY29udGFpbnMoY2hpbGRyZW5baV0pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCVJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFsbCBsaXN0IGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aAotICAgICAqCXRoZSBwYXNzZWQgdHJlZSBlbGVtZW50IGFyZSBjdXJyZW50bHkgY2hlY2tlZAotICAgICAqCi0gICAgICoJQHJldHVybiBib29sZWFuCi0gICAgICoJQHBhcmFtIHRyZWVFbGVtZW50IGphdmEubGFuZy5PYmplY3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhcmVBbGxFbGVtZW50c0NoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0gICAgICAgIExpc3QgY2hlY2tlZEVsZW1lbnRzID0gKExpc3QpIGNoZWNrZWRTdGF0ZVN0b3JlLmdldCh0cmVlRWxlbWVudCk7Ci0gICAgICAgIGlmIChjaGVja2VkRWxlbWVudHMgPT0gbnVsbCkgLy8gaWUuLSB0cmVlIGl0ZW0gbm90IGV2ZW4gZ3JheS1jaGVja2VkCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIGdldExpc3RJdGVtc1NpemUodHJlZUVsZW1lbnQpID09IGNoZWNrZWRFbGVtZW50cy5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJSXRlcmF0ZSB0aHJvdWdoIHRoZSBwYXNzZWQgZWxlbWVudHMgd2hpY2ggYXJlIGJlaW5nIHJlYWxpemVkIGZvciB0aGUgZmlyc3QKLSAgICAgKgl0aW1lIGFuZCBjaGVjayBlYWNoIG9uZSBpbiB0aGUgdHJlZSB2aWV3ZXIgYXMgYXBwcm9wcmlhdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja05ld1RyZWVFbGVtZW50cyhPYmplY3RbXSBlbGVtZW50cykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBPYmplY3QgY3VycmVudEVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tlZCA9IGNoZWNrZWRTdGF0ZVN0b3JlLmNvbnRhaW5zS2V5KGN1cnJlbnRFbGVtZW50KTsKLSAgICAgICAgICAgIHRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChjdXJyZW50RWxlbWVudCwgY2hlY2tlZCk7Ci0gICAgICAgICAgICB0cmVlVmlld2VyLnNldEdyYXllZChjdXJyZW50RWxlbWVudCwgY2hlY2tlZAotICAgICAgICAgICAgICAgICAgICAmJiAhd2hpdGVDaGVja2VkVHJlZUl0ZW1zLmNvbnRhaW5zKGN1cnJlbnRFbGVtZW50KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbiBpdGVtIHdhcyBjaGVja2VkIGluIG9uZSBvZiBzZWxmJ3MgdHdvIHZpZXdzLiAgRGV0ZXJtaW5lIHdoaWNoCi0gICAgICoJdmlldyB0aGlzIG9jY3VycmVkIGluIGFuZCBkZWxlZ2F0ZSBhcHByb3ByaWF0ZWx5Ci0gICAgICoKLSAgICAgKglAcGFyYW0gZXZlbnQgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKGZpbmFsIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQotICAgICAgICAvL1BvdGVudGlhbGx5IGxvbmcgb3BlcmF0aW9uIC0gc2hvdyBhIGJ1c3kgY3Vyc29yCi0gICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwKLSAgICAgICAgICAgICAgICBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRDaGVja2FibGUoKS5lcXVhbHModHJlZVZpZXdlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZUl0ZW1DaGVja2VkKGV2ZW50LmdldEVsZW1lbnQoKSwgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGVja2VkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtQ2hlY2tlZChldmVudC5nZXRFbGVtZW50KCksIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hlY2tlZCgpLCB0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5Q2hlY2tTdGF0ZUNoYW5nZUxpc3RlbmVycyhldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglMYXkgb3V0IGFuZCBpbml0aWFsaXplIHNlbGYncyB2aXN1YWwgY29tcG9uZW50cy4KLSAgICAgKgotICAgICAqCUBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0gICAgICogIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgZmxhZ3MgZm9yIHRoZSBuZXcgQ29tcG9zaXRlCi0gICAgICoJQHBhcmFtIHVzZUhlaWdodEhpbnQgSWYgdHJ1ZSB5c2UgdGhlIHByZWZlcnJlZEhlaWdodC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsCi0gICAgICAgICAgICBib29sZWFuIHVzZUhlaWdodEhpbnQpIHsKLSAgICAgICAgLy8gZ3JvdXAgcGFuZQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIGNyZWF0ZVRyZWVWaWV3ZXIoY29tcG9zaXRlLCB1c2VIZWlnaHRIaW50KTsKLSAgICAgICAgY3JlYXRlTGlzdFZpZXdlcihjb21wb3NpdGUsIHVzZUhlaWdodEhpbnQpOwotCi0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglDcmVhdGUgdGhpcyBncm91cCdzIGxpc3Qgdmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpc3RWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiB1c2VIZWlnaHRIaW50KSB7Ci0gICAgICAgIGxpc3RWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGlmICh1c2VIZWlnaHRIaW50KQotICAgICAgICAgICAgZGF0YS5oZWlnaHRIaW50ID0gUFJFRkVSUkVEX0hFSUdIVDsKLSAgICAgICAgbGlzdFZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGxpc3RWaWV3ZXIuZ2V0VGFibGUoKS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBsaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihsaXN0Q29udGVudFByb3ZpZGVyKTsKLSAgICAgICAgbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxpc3RMYWJlbFByb3ZpZGVyKTsKLSAgICAgICAgbGlzdFZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQ3JlYXRlIHRoaXMgZ3JvdXAncyB0cmVlIHZpZXdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gdXNlSGVpZ2h0SGludCkgewotICAgICAgICBUcmVlIHRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGlmICh1c2VIZWlnaHRIaW50KQotICAgICAgICAgICAgZGF0YS5oZWlnaHRIaW50ID0gUFJFRkVSUkVEX0hFSUdIVDsKLSAgICAgICAgdHJlZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICB0cmVlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgdHJlZVZpZXdlciA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIodHJlZSk7Ci0gICAgICAgIHRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHRyZWVDb250ZW50UHJvdmlkZXIpOwotICAgICAgICB0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIodHJlZUxhYmVsUHJvdmlkZXIpOwotICAgICAgICB0cmVlVmlld2VyLmFkZFRyZWVMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIHRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFzc2VkIHRyZWUgZWxlbWVudCBzaG91bGQgYmUKLSAgICAgKiBhdCBMRUFTVCBncmF5LWNoZWNrZWQuICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgY29uc2lkZXIgd2hldGhlcgotICAgICAqIGl0IHNob3VsZCBiZSB3aGl0ZS1jaGVja2VkLCBzbyBhIHNwZWNpZmllZCB0cmVlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlCi0gICAgICogd2hpdGUtY2hlY2tlZCB3aWxsIHJlc3VsdCBpbiBhIDxjb2RlPnRydWU8L2NvZGU+IGFuc3dlciBmcm9tIHRoaXMgbWV0aG9kLgotICAgICAqIFRvIGRldGVybWluZSB3aGV0aGVyIGEgdHJlZSBpdGVtIHNob3VsZCBiZSB3aGl0ZS1jaGVja2VkIHVzZSBtZXRob2QKLSAgICAgKiAjZGV0ZXJtaW5lU2hvdWxkQmVXaGl0ZUNoZWNrZWQoT2JqZWN0KS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICogQHNlZSAjZGV0ZXJtaW5lU2hvdWxkQmVXaGl0ZUNoZWNrZWQoT2JqZWN0KQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGRldGVybWluZVNob3VsZEJlQXRMZWFzdEdyYXlDaGVja2VkKE9iamVjdCB0cmVlRWxlbWVudCkgewotICAgICAgICAvLyBpZiBhbnkgbGlzdCBpdGVtcyBhc3NvY2lhdGVkIHdpdGggdHJlZUVsZW1lbnQgYXJlIGNoZWNrZWQgdGhlbiBpdAotICAgICAgICAvLyByZXRhaW5zIGl0cyBncmF5LWNoZWNrZWQgc3RhdHVzIHJlZ2FyZGxlc3Mgb2YgaXRzIGNoaWxkcmVuCi0gICAgICAgIExpc3QgY2hlY2tlZCA9IChMaXN0KSBjaGVja2VkU3RhdGVTdG9yZS5nZXQodHJlZUVsZW1lbnQpOwotICAgICAgICBpZiAoY2hlY2tlZCAhPSBudWxsICYmICghY2hlY2tlZC5pc0VtcHR5KCkpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgLy8gaWYgYW55IGNoaWxkcmVuIG9mIHRyZWVFbGVtZW50IGFyZSBzdGlsbCBncmF5LWNoZWNrZWQgdGhlbiB0cmVlRWxlbWVudAotICAgICAgICAvLyBtdXN0IHJlbWFpbiBncmF5LWNoZWNrZWQgYXMgd2VsbC4gT25seSBhc2sgZXhwYW5kZWQgbm9kZXMKLSAgICAgICAgaWYgKGV4cGFuZGVkVHJlZU5vZGVzLmNvbnRhaW5zKHRyZWVFbGVtZW50KSkgewotICAgICAgICAgICAgT2JqZWN0W10gY2hpbGRyZW4gPSB0cmVlQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKHRyZWVFbGVtZW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZFN0YXRlU3RvcmUuY29udGFpbnNLZXkoY2hpbGRyZW5baV0pKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhc3NlZCB0cmVlIGl0ZW0gc2hvdWxkIGJlCi0gICAgICogd2hpdGUtY2hlY2tlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqIEBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZGV0ZXJtaW5lU2hvdWxkQmVXaGl0ZUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBhcmVBbGxDaGlsZHJlbldoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCkKLSAgICAgICAgICAgICAgICAmJiBhcmVBbGxFbGVtZW50c0NoZWNrZWQodHJlZUVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCVJlY3Vyc2l2ZWx5IGFkZCBhcHByb3ByaWF0ZSB0cmVlIGVsZW1lbnRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mCi0gICAgICoJa25vd24gd2hpdGUtY2hlY2tlZCB0cmVlIGVsZW1lbnRzLgotICAgICAqCi0gICAgICoJQHBhcmFtIHRyZWVFbGVtZW50IGphdmEubGFuZy5PYmplY3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZXRlcm1pbmVXaGl0ZUNoZWNrZWREZXNjZW5kZW50cyhPYmplY3QgdHJlZUVsZW1lbnQpIHsKLSAgICAgICAgLy8gYWx3YXlzIGdvIHRocm91Z2ggYWxsIGNoaWxkcmVuIGZpcnN0IHNpbmNlIHRoZWlyIHdoaXRlLWNoZWNrZWQKLSAgICAgICAgLy8gc3RhdHVzZXMgd2lsbCBiZSBuZWVkZWQgdG8gZGV0ZXJtaW5lIHRoZSB3aGl0ZS1jaGVja2VkIHN0YXR1cyBmb3IKLSAgICAgICAgLy8gdGhpcyB0cmVlIGVsZW1lbnQKLSAgICAgICAgT2JqZWN0W10gY2hpbGRyZW4gPSB0cmVlQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKHRyZWVFbGVtZW50KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkKLSAgICAgICAgICAgIGRldGVybWluZVdoaXRlQ2hlY2tlZERlc2NlbmRlbnRzKGNoaWxkcmVuW2ldKTsKLQotICAgICAgICAvLyBub3cgZGV0ZXJtaW5lIHRoZSB3aGl0ZS1jaGVja2VkIHN0YXR1cyBmb3IgdGhpcyB0cmVlIGVsZW1lbnQKLSAgICAgICAgaWYgKGRldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKHRyZWVFbGVtZW50KSkKLSAgICAgICAgICAgIHNldFdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2F1c2UgdGhlIHRyZWUgdmlld2VyIHRvIGV4cGFuZCBhbGwgaXRzIGl0ZW1zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhwYW5kQWxsKCkgewotICAgICAgICB0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUV4cGFuZCBhbiBlbGVtZW50IGluIGEgdHJlZSB2aWV3ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZXhwYW5kVHJlZUVsZW1lbnQoZmluYWwgT2JqZWN0IGl0ZW0pIHsKLSAgICAgICAgQnVzeUluZGljYXRvci5zaG93V2hpbGUodHJlZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLAotICAgICAgICAgICAgICAgIG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBzZWUgaWYgdGhlIGNoaWxkcmVuIG5lZWQgdG8gYmUgZ2l2ZW4gdGhlaXIgY2hlY2tlZCBzdGF0ZSBhdCBhbGwuICBJZiB0aGV5J3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGJlZW4gcmVhbGl6ZWQgdGhlbiB0aGlzIHdvbid0IGJlIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGFuZGVkVHJlZU5vZGVzLmNvbnRhaW5zKGl0ZW0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTmV3VHJlZUVsZW1lbnRzKHRyZWVDb250ZW50UHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZHJlbihpdGVtKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkVHJlZU5vZGVzLmFkZChpdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2hpdGVDaGVja2VkVHJlZUl0ZW1zLmNvbnRhaW5zKGl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgdGhpcyBpcyB0aGUgZmlyc3QgZXhwYW5zaW9uIGFuZCB0aGlzIGlzIGEgd2hpdGUgY2hlY2tlZCBub2RlIHRoZW4gY2hlY2sgdGhlIGNoaWxkcmVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGNoaWxkcmVuID0gdHJlZUNvbnRlbnRQcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZHJlbihpdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3aGl0ZUNoZWNrZWRUcmVlSXRlbXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKGNoaWxkcmVuW2ldKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdoaXRlQ2hlY2tlZChjaGlsZCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVZpZXdlci5zZXRDaGVja2VkKGNoaWxkLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkU3RhdGVTdG9yZS5wdXQoY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3cgYmUgc3VyZSB0byBzZWxlY3QgdGhlIGxpc3Qgb2YgaXRlbXMgdG9vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldExpc3RGb3JXaGl0ZVNlbGVjdGlvbihpdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbGwgb2YgdGhlIHNlbGVjdGVkIGNoaWxkcmVuIG9mIG5leHRFbnRyeSB0byByZXN1bHQgcmVjdXJzaXZlbHkuCi0gICAgICogVGhpcyBkb2VzIG5vdCBzZXQgYW55IHZhbHVlcyBpbiB0aGUgY2hlY2tlZCBzdGF0ZS4KLSAgICAgKiBAcGFyYW0gVGhlIHRyZWVFbGVtZW50IGJlaW5nIHF1ZXJpZWQKLSAgICAgKiBAcGFyYW0gYWRkQWxsIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSBpZiB0aGUgY2hlY2tlZCBzdGF0ZSBzdG9yZSBuZWVkcyB0byBiZSBxdWVyaWVkCi0gICAgICogQHBhcmFtIGZpbHRlciBJRWxlbWVudEZpbHRlciAtIHRoZSBmaWx0ZXIgYmVpbmcgdXNlZCBvbiB0aGUgZGF0YQotICAgICAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3Igb3IgbnVsbCB0aGF0IHRoZSBjYW5jZWwgaXMgcG9sbGVkIGZvciAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmluZEFsbFNlbGVjdGVkTGlzdEVsZW1lbnRzKE9iamVjdCB0cmVlRWxlbWVudCwKLSAgICAgICAgICAgIFN0cmluZyBwYXJlbnRMYWJlbCwgYm9vbGVhbiBhZGRBbGwsIElFbGVtZW50RmlsdGVyIGZpbHRlciwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgZnVsbExhYmVsID0gbnVsbDsKLSAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZnVsbExhYmVsID0gZ2V0RnVsbExhYmVsKHRyZWVFbGVtZW50LCBwYXJlbnRMYWJlbCk7Ci0gICAgICAgICAgICBtb25pdG9yLnN1YlRhc2soZnVsbExhYmVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhZGRBbGwpCi0gICAgICAgICAgICBmaWx0ZXIuZmlsdGVyRWxlbWVudHMobGlzdENvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyh0cmVlRWxlbWVudCksCi0gICAgICAgICAgICAgICAgICAgIG1vbml0b3IpOwotICAgICAgICBlbHNlIHsgLy9BZGQgd2hhdCB3ZSBoYXZlIHN0b3JlZAotICAgICAgICAgICAgaWYgKGNoZWNrZWRTdGF0ZVN0b3JlLmNvbnRhaW5zS2V5KHRyZWVFbGVtZW50KSkKLSAgICAgICAgICAgICAgICBmaWx0ZXIuZmlsdGVyRWxlbWVudHMoKENvbGxlY3Rpb24pIGNoZWNrZWRTdGF0ZVN0b3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KHRyZWVFbGVtZW50KSwgbW9uaXRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RbXSB0cmVlQ2hpbGRyZW4gPSB0cmVlQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKHRyZWVFbGVtZW50KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE9iamVjdCBjaGlsZCA9IHRyZWVDaGlsZHJlbltpXTsKLSAgICAgICAgICAgIGlmIChhZGRBbGwpCi0gICAgICAgICAgICAgICAgZmluZEFsbFNlbGVjdGVkTGlzdEVsZW1lbnRzKGNoaWxkLCBmdWxsTGFiZWwsIHRydWUsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IpOwotICAgICAgICAgICAgZWxzZSB7IC8vT25seSBjb250aW51ZSBmb3IgdGhvc2Ugd2l0aCBjaGVja2VkIHN0YXRlCi0gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWRTdGF0ZVN0b3JlLmNvbnRhaW5zS2V5KGNoaWxkKSkKLSAgICAgICAgICAgICAgICAgICAgZmluZEFsbFNlbGVjdGVkTGlzdEVsZW1lbnRzKGNoaWxkLCBmdWxsTGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVDaGVja2VkVHJlZUl0ZW1zLmNvbnRhaW5zKGNoaWxkKSwgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIGFsbCBvZiB0aGUgd2hpdGUgY2hlY2tlZCBjaGlsZHJlbiBvZiB0aGUgdHJlZUVsZW1lbnQgYW5kIGFkZCB0aGVtIHRvIHRoZSBjb2xsZWN0aW9uLgotICAgICAqIElmIHRoZSBlbGVtZW50IGl0c2VsZiBpcyB3aGl0ZSBzZWxlY3QgYWRkIGl0LiBJZiBub3QgdGhlbiBhZGQgYW55IHNlbGVjdGVkIGxpc3QgZWxlbWVudHMKLSAgICAgKiBhbmQgcmVjdXJzZSBkb3duIHRvIHRoZSBjaGlsZHJlbi4KLSAgICAgKiBAcGFyYW0gdHJlZUVsZW1lbnQgamF2YS5sYW5nLk9iamVjdAotICAgICAqIEBwYXJhbSByZXN1bHQgamF2YS51dGlsLkNvbGxlY3Rpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmluZEFsbFdoaXRlQ2hlY2tlZEl0ZW1zKE9iamVjdCB0cmVlRWxlbWVudCwgQ29sbGVjdGlvbiByZXN1bHQpIHsKLQotICAgICAgICBpZiAod2hpdGVDaGVja2VkVHJlZUl0ZW1zLmNvbnRhaW5zKHRyZWVFbGVtZW50KSkKLSAgICAgICAgICAgIHJlc3VsdC5hZGQodHJlZUVsZW1lbnQpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gbGlzdENoaWxkcmVuID0gKENvbGxlY3Rpb24pIGNoZWNrZWRTdGF0ZVN0b3JlCi0gICAgICAgICAgICAgICAgICAgIC5nZXQodHJlZUVsZW1lbnQpOwotICAgICAgICAgICAgLy9pZiBpdCBpcyBub3QgaW4gdGhlIHN0b3JlIHRoZW4gaXQgYW5kIGl0J3MgY2hpbGRyZW4gYXJlIG5vdCBpbnRlcmVzdGluZwotICAgICAgICAgICAgaWYgKGxpc3RDaGlsZHJlbiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwobGlzdENoaWxkcmVuKTsKLSAgICAgICAgICAgIE9iamVjdFtdIGNoaWxkcmVuID0gdHJlZUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbih0cmVlRWxlbWVudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgZmluZEFsbFdoaXRlQ2hlY2tlZEl0ZW1zKGNoaWxkcmVuW2ldLCByZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0JICogUmV0dXJucyBhIGZsYXQgbGlzdCBvZiBhbGwgb2YgdGhlIGxlYWYgZWxlbWVudHMgd2hpY2ggYXJlIGNoZWNrZWQuIEZpbHRlcgotCSAqIHRoZW4gYmFzZWQgb24gdGhlIHN1cHBsaWVkIEVsZW1lbnRGaWx0ZXIuIElmIG1vbml0b3IgaXMgY2FuY2VsbGVkIHRoZW4KLQkgKiByZXR1cm4gbnVsbAotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIGZpbHRlciBmb3IgdGhlIGRhdGEKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBvciBudWxsCi0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBmaW5kIGlzIGludGVycnVwdGVkLgotCSAqLwotICAgIHB1YmxpYyB2b2lkIGdldEFsbENoZWNrZWRMaXN0SXRlbXMoSUVsZW1lbnRGaWx0ZXIgZmlsdGVyLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCi0gICAgICAgIC8vSXRlcmF0ZSB0aHJvdWdoIHRoZSBjaGlsZHJlbiBvZiB0aGUgcm9vdCBhcyB0aGUgcm9vdCBpcyBub3QgaW4gdGhlIHN0b3JlCi0gICAgICAgIE9iamVjdFtdIGNoaWxkcmVuID0gdHJlZUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihyb290KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgZmluZEFsbFNlbGVjdGVkTGlzdEVsZW1lbnRzKGNoaWxkcmVuW2ldLCBudWxsLAotICAgICAgICAgICAgICAgICAgICB3aGl0ZUNoZWNrZWRUcmVlSXRlbXMuY29udGFpbnMoY2hpbGRyZW5baV0pLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIG1vbml0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJUmV0dXJucyBhIGZsYXQgbGlzdCBvZiBhbGwgb2YgdGhlIGxlYWYgZWxlbWVudHMgd2hpY2ggYXJlIGNoZWNrZWQuCi0gICAgICoKLSAgICAgKglAcmV0dXJuIGFsbCBvZiB0aGUgbGVhZiBlbGVtZW50cyB3aGljaCBhcmUgY2hlY2tlZC4gVGhpcyBBUEkgZG9lcyBub3QKLSAgICAgKiAJcmV0dXJuIG51bGwgaW4gb3JkZXIgdG8ga2VlcCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRBbGxDaGVja2VkTGlzdEl0ZW1zKCkgewotCi0gICAgICAgIGZpbmFsIEFycmF5TGlzdCByZXR1cm5WYWx1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBJRWxlbWVudEZpbHRlciBwYXNzVGhyb3VnaEZpbHRlciA9IG5ldyBJRWxlbWVudEZpbHRlcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyRWxlbWVudHMoQ29sbGVjdGlvbiBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuYWRkQWxsKGVsZW1lbnRzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyRWxlbWVudHMoT2JqZWN0W10gZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuYWRkKGVsZW1lbnRzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldEFsbENoZWNrZWRMaXN0SXRlbXMocGFzc1Rocm91Z2hGaWx0ZXIsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoJUmV0dXJucyBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBpdGVtcyB0aGF0IGFyZSB3aGl0ZSBjaGVja2VkLgotICAgICAqIAlBbnkgZm9sZGVycyB0aGF0IGFyZSB3aGl0ZSBjaGVja2VkIGFyZSBhZGRlZCBhbmQgdGhlbiBhbnkgZmlsZXMKLSAgICAgKiAgZnJvbSB3aGl0ZSBjaGVja2VkIGZvbGRlcnMgYXJlIGFkZGVkLiAKLSAgICAgKgotICAgICAqCUByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIG9mIHRoZSBpdGVtcyB0aGF0IGFyZSB3aGl0ZSBjaGVja2VkCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0QWxsV2hpdGVDaGVja2VkSXRlbXMoKSB7Ci0KLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgLy9JdGVyYXRlIHRocm91Z2ggdGhlIGNoaWxkcmVuIG9mIHRoZSByb290IGFzIHRoZSByb290IGlzIG5vdCBpbiB0aGUgc3RvcmUKLSAgICAgICAgT2JqZWN0W10gY2hpbGRyZW4gPSB0cmVlQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKHJvb3QpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBmaW5kQWxsV2hpdGVDaGVja2VkSXRlbXMoY2hpbGRyZW5baV0sIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgYnkgdGhlCi0gICAgICoJdXNlci4KLSAgICAgKgotICAgICAqCUByZXR1cm4gaW50Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDaGVja2VkRWxlbWVudENvdW50KCkgewotICAgICAgICByZXR1cm4gY2hlY2tlZFN0YXRlU3RvcmUuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZnVsbCBsYWJlbCBvZiB0aGUgdHJlZUVsZW1lbnQgKGl0cyBuYW1lIGFuZCBpdHMgcGFyZW50J3MgbmFtZSkuCi0gICAgICogQHBhcmFtIHRyZWVFbGVtZW50IC0gdGhlIGVsZW1lbnQgYmVpbmcgZXhwb3J0ZWQKLSAgICAgKiBAcGFyYW0gcGFyZW50TGFiZWwgLSB0aGUgbGFiZWwgb2YgdGhlIHBhcmVudCwgY2FuIGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbExhYmVsKE9iamVjdCB0cmVlRWxlbWVudCwgU3RyaW5nIHBhcmVudExhYmVsKSB7Ci0gICAgICAgIElQYXRoIHBhcmVudE5hbWUgPSBuZXcgUGF0aChwYXJlbnRMYWJlbCk7Ci0KLSAgICAgICBTdHJpbmcgZWxlbWVudFRleHQgPSB0cmVlTGFiZWxQcm92aWRlci5nZXRUZXh0KHRyZWVFbGVtZW50KTsKLSAgICAgICAgaWYoZWxlbWVudFRleHQgPT0gbnVsbCkKLSAgICAgICAgCXJldHVybiBwYXJlbnROYW1lLnRvU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBwYXJlbnROYW1lLmFwcGVuZChlbGVtZW50VGV4dCkudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglSZXR1cm4gYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGxpc3QgaXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEKLSAgICAgKglnaXZlbiB0cmVlIGl0ZW0uCi0gICAgICoKLSAgICAgKglAcmV0dXJuIGludAotICAgICAqCUBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRMaXN0SXRlbXNTaXplKE9iamVjdCB0cmVlRWxlbWVudCkgewotICAgICAgICBPYmplY3RbXSBlbGVtZW50cyA9IGxpc3RDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHModHJlZUVsZW1lbnQpOwotICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdGFibGUgdGhlIGxpc3Qgdmlld2VyIHVzZXMuCi0gICAgICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZQotICAgICAqLwotICAgIHB1YmxpYyBUYWJsZSBnZXRMaXN0VGFibGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxpc3RWaWV3ZXIuZ2V0VGFibGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglMb2dpY2FsbHkgZ3JheS1jaGVjayBhbGwgYW5jZXN0b3JzIG9mIHRyZWVJdGVtIGJ5IGVuc3VyaW5nIHRoYXQgdGhleQotICAgICAqCWFwcGVhciBpbiB0aGUgY2hlY2tlZCB0YWJsZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdyYXlDaGVja0hpZXJhcmNoeShPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQotICAgICAgICAvL2V4cGFuZCB0aGUgZWxlbWVudCBmaXJzdCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBwb3B1bGF0ZWQgZm9yIGl0Ci0gICAgICAgIGV4cGFuZFRyZWVFbGVtZW50KHRyZWVFbGVtZW50KTsKLQotICAgICAgICAvLyBpZiB0aGlzIHRyZWUgZWxlbWVudCBpcyBhbHJlYWR5IGdyYXkgdGhlbiBpdHMgYW5jZXN0b3JzIGFsbCBhcmUgYXMgd2VsbAotICAgICAgICBpZiAoY2hlY2tlZFN0YXRlU3RvcmUuY29udGFpbnNLZXkodHJlZUVsZW1lbnQpKQotICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBuZWVkIHRvIHByb2NlZWQgdXB3YXJkcyBmcm9tIGhlcmUKLQotICAgICAgICBjaGVja2VkU3RhdGVTdG9yZS5wdXQodHJlZUVsZW1lbnQsIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgIE9iamVjdCBwYXJlbnQgPSB0cmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudCh0cmVlRWxlbWVudCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIGdyYXlDaGVja0hpZXJhcmNoeShwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCVNldCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBzZWxmIGFuZCBhbGwgYW5jZXN0b3JzIGFwcHJvcHJpYXRlbHkuIERvIG5vdCB3aGl0ZSBjaGVjayBhbnlvbmUgLSB0aGlzIGlzCi0gICAgICogIG9ubHkgZG9uZSBkb3duIGEgaGllcmFyY2h5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBncmF5VXBkYXRlSGllcmFyY2h5KE9iamVjdCB0cmVlRWxlbWVudCkgewotCi0gICAgICAgIGJvb2xlYW4gc2hvdWxkQmVBdExlYXN0R3JheSA9IGRldGVybWluZVNob3VsZEJlQXRMZWFzdEdyYXlDaGVja2VkKHRyZWVFbGVtZW50KTsKLQotICAgICAgICB0cmVlVmlld2VyLnNldEdyYXlDaGVja2VkKHRyZWVFbGVtZW50LCBzaG91bGRCZUF0TGVhc3RHcmF5KTsKLQotICAgICAgICBpZiAod2hpdGVDaGVja2VkVHJlZUl0ZW1zLmNvbnRhaW5zKHRyZWVFbGVtZW50KSkKLSAgICAgICAgICAgIHdoaXRlQ2hlY2tlZFRyZWVJdGVtcy5yZW1vdmUodHJlZUVsZW1lbnQpOwotCi0gICAgICAgIC8vIHByb2NlZWQgdXAgdGhlIHRyZWUgZWxlbWVudCBoaWVyYXJjaHkKLSAgICAgICAgT2JqZWN0IHBhcmVudCA9IHRyZWVDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KHRyZWVFbGVtZW50KTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBncmF5VXBkYXRlSGllcmFyY2h5KHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTZXQgdGhlIGluaXRpYWwgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgcGFzc2VkIGxpc3QgZWxlbWVudCB0byB0cnVlLgotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbENoZWNrTGlzdEl0ZW0oT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgT2JqZWN0IHBhcmVudCA9IHRyZWVDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotICAgICAgICBzZWxlY3RBbmRSZXZlYWwocGFyZW50KTsKLSAgICAgICAgLy9DaGVjayB0aGUgZWxlbWVudCBpbiB0aGUgdmlld2VyIGFzIGlmIGl0IGhhZCBiZWVuIG1hbnVhbGx5IGNoZWNrZWQKLSAgICAgICAgbGlzdFZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotICAgICAgICAvL0FzIHRoaXMgaXMgbm90IGRvbmUgZnJvbSB0aGUgVUkgdGhlbiBzZXQgdGhlIGJveCBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgc2VsZWN0aW9uIHRvIGZhbHNlIAotICAgICAgICBsaXN0SXRlbUNoZWNrZWQoZWxlbWVudCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmF5VXBkYXRlSGllcmFyY2h5KHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbml0aWFsIGNoZWNrZWQgc3RhdGUgb2YgdGhlIHBhc3NlZCBlbGVtZW50IHRvIHRydWUsCi0gICAgICogYXMgd2VsbCBhcyB0byBhbGwgb2YgaXRzIGNoaWxkcmVuIGFuZCBhc3NvY2lhdGVkIGxpc3QgZWxlbWVudHMKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxDaGVja1RyZWVJdGVtKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHRyZWVJdGVtQ2hlY2tlZChlbGVtZW50LCB0cnVlKTsKLSAgICAgICAgc2VsZWN0QW5kUmV2ZWFsKGVsZW1lbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZWxlY3RBbmRSZXZlYWwoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0gICAgICAgIHRyZWVWaWV3ZXIucmV2ZWFsKHRyZWVFbGVtZW50KTsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odHJlZUVsZW1lbnQpOwotICAgICAgICB0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUluaXRpYWxpemUgdGhpcyBncm91cCdzIHZpZXdlcnMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gbGFpZCBvdXQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgdHJlZVZpZXdlci5zZXRJbnB1dChyb290KTsKLSAgICAgICAgdGhpcy5leHBhbmRlZFRyZWVOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy5leHBhbmRlZFRyZWVOb2Rlcy5hZGQocm9vdCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglDYWxsYmFjayB0aGF0J3MgaW52b2tlZCB3aGVuIHRoZSBjaGVja2VkIHN0YXR1cyBvZiBhbiBpdGVtIGluIHRoZSBsaXN0Ci0gICAgICoJaXMgY2hhbmdlZCBieSB0aGUgdXNlci4gRG8gbm90IHRyeSBhbmQgdXBkYXRlIHRoZSBoaWVyYXJjaHkgaWYgd2UgYXJlIGJ1aWxkaW5nIHRoZQotICAgICAqICBpbml0aWFsIGxpc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1DaGVja2VkKE9iamVjdCBsaXN0RWxlbWVudCwgYm9vbGVhbiBzdGF0ZSwKLSAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRpbmdGcm9tU2VsZWN0aW9uKSB7Ci0gICAgICAgIExpc3QgY2hlY2tlZExpc3RJdGVtcyA9IChMaXN0KSBjaGVja2VkU3RhdGVTdG9yZQotICAgICAgICAgICAgICAgIC5nZXQoY3VycmVudFRyZWVTZWxlY3Rpb24pOwotICAgICAgICAvL0lmIGl0IGhhcyBub3QgYmVlbiBleHBhbmRlZCBkbyBzbyBhcyB0aGUgc2VsZWN0aW9uIG9mIGxpc3QgaXRlbXMgd2lsbCBhZmZlY3QgZ3JheSBzdGF0ZQotICAgICAgICBpZiAoIWV4cGFuZGVkVHJlZU5vZGVzLmNvbnRhaW5zKGN1cnJlbnRUcmVlU2VsZWN0aW9uKSkKLSAgICAgICAgICAgIGV4cGFuZFRyZWVFbGVtZW50KGN1cnJlbnRUcmVlU2VsZWN0aW9uKTsKLQotICAgICAgICBpZiAoc3RhdGUpIHsKLSAgICAgICAgICAgIGlmIChjaGVja2VkTGlzdEl0ZW1zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgYXNzb2NpYXRlZCB0cmVlIGl0ZW0gaGFzIGdvbmUgZnJvbSAwIC0+IDEgY2hlY2tlZAotICAgICAgICAgICAgICAgIC8vIGxpc3QgaXRlbXMsIHRyZWUgY2hlY2tpbmcgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZAotICAgICAgICAgICAgICAgIGdyYXlDaGVja0hpZXJhcmNoeShjdXJyZW50VHJlZVNlbGVjdGlvbik7Ci0gICAgICAgICAgICAgICAgY2hlY2tlZExpc3RJdGVtcyA9IChMaXN0KSBjaGVja2VkU3RhdGVTdG9yZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChjdXJyZW50VHJlZVNlbGVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja2VkTGlzdEl0ZW1zLmFkZChsaXN0RWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGVja2VkTGlzdEl0ZW1zLnJlbW92ZShsaXN0RWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoY2hlY2tlZExpc3RJdGVtcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgYXNzb2NpYXRlZCB0cmVlIGl0ZW0gaGFzIGdvbmUgZnJvbSAxIC0+IDAgY2hlY2tlZAotICAgICAgICAgICAgICAgIC8vIGxpc3QgaXRlbXMsIHRyZWUgY2hlY2tpbmcgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZAotICAgICAgICAgICAgICAgIHVuZ3JheUNoZWNrSGllcmFyY2h5KGN1cnJlbnRUcmVlU2VsZWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vVXBkYXRlIHRoZSBsaXN0IHdpdGggdGhlIHNlbGVjdGlvbnMgaWYgdGhlcmUgYXJlIGFueQotICAgICAgICBpZiAoY2hlY2tlZExpc3RJdGVtcy5zaXplKCkgPiAwKQotICAgICAgICAgICAgY2hlY2tlZFN0YXRlU3RvcmUucHV0KGN1cnJlbnRUcmVlU2VsZWN0aW9uLCBjaGVja2VkTGlzdEl0ZW1zKTsKLSAgICAgICAgaWYgKHVwZGF0aW5nRnJvbVNlbGVjdGlvbikKLSAgICAgICAgICAgIGdyYXlVcGRhdGVIaWVyYXJjaHkoY3VycmVudFRyZWVTZWxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCU5vdGlmeSBhbGwgY2hlY2tlZCBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCB0aGUgcGFzc2VkIGVsZW1lbnQgaGFzIGhhZAotICAgICAqCWl0cyBjaGVja2VkIHN0YXRlIGNoYW5nZWQgdG8gdGhlIHBhc3NlZCBzdGF0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeUNoZWNrU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoCi0gICAgICAgICAgICBmaW5hbCBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIE9iamVjdFtdIGFycmF5ID0gZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIElDaGVja1N0YXRlTGlzdGVuZXIgbCA9IChJQ2hlY2tTdGF0ZUxpc3RlbmVyKSBhcnJheVtpXTsKLSAgICAgICAgICAgIFBsYXRmb3JtLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgbC5jaGVja1N0YXRlQ2hhbmdlZChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKlNldCB0aGUgY29udGVudHMgb2YgdGhlIGxpc3Qgdmlld2VyIGJhc2VkIHVwb24gdGhlIHNwZWNpZmllZCBzZWxlY3RlZAotICAgICAqdHJlZSBlbGVtZW50LiAgVGhpcyBhbHNvIGluY2x1ZGVzIGNoZWNraW5nIHRoZSBhcHByb3ByaWF0ZSBsaXN0IGl0ZW1zLgotICAgICAqCi0gICAgICpAcGFyYW0gdHJlZUVsZW1lbnQgamF2YS5sYW5nLk9iamVjdAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlzdFZpZXdlcihmaW5hbCBPYmplY3QgdHJlZUVsZW1lbnQpIHsKLSAgICAgICAgbGlzdFZpZXdlci5zZXRJbnB1dCh0cmVlRWxlbWVudCk7Ci0KLSAgICAgICAgLy9JZiB0aGUgZWxlbWVudCBpcyB3aGl0ZSBjaGVja2VkIGJ1dCBub3QgZXhwYW5kZWQgd2UgaGF2ZSBub3Qgc2V0IHVwIGFsbCBvZiB0aGUgY2hpbGRyZW4geWV0Ci0gICAgICAgIGlmICghKGV4cGFuZGVkVHJlZU5vZGVzLmNvbnRhaW5zKHRyZWVFbGVtZW50KSkKLSAgICAgICAgICAgICAgICAmJiB3aGl0ZUNoZWNrZWRUcmVlSXRlbXMuY29udGFpbnModHJlZUVsZW1lbnQpKSB7Ci0KLSAgICAgICAgICAgIC8vUG90ZW50aWFsbHkgbG9uZyBvcGVyYXRpb24gLSBzaG93IGEgYnVzeSBjdXJzb3IKLSAgICAgICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldExpc3RGb3JXaGl0ZVNlbGVjdGlvbih0cmVlRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZpZXdlci5zZXRBbGxDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGlzdCBsaXN0SXRlbXNUb0NoZWNrID0gKExpc3QpIGNoZWNrZWRTdGF0ZVN0b3JlLmdldCh0cmVlRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIGlmIChsaXN0SXRlbXNUb0NoZWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBsaXN0SXRlbXNFbnVtID0gbGlzdEl0ZW1zVG9DaGVjay5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChsaXN0SXRlbXNFbnVtLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgbGlzdFZpZXdlci5zZXRDaGVja2VkKGxpc3RJdGVtc0VudW0ubmV4dCgpLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCUxvZ2ljYWxseSBncmF5LWNoZWNrIGFsbCBhbmNlc3RvcnMgb2YgdHJlZUl0ZW0gYnkgZW5zdXJpbmcgdGhhdCB0aGV5Ci0gICAgICoJYXBwZWFyIGluIHRoZSBjaGVja2VkIHRhYmxlLiBBZGQgYW55IGVsZW1lbnRzIHRvIHRoZSBzZWxlY3RlZE5vZGVzCi0gICAgICogIHNvIHdlIGNhbiB0cmFjayB0aGF0IGhhcyBiZWVuIGRvbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW1lSGllcmFyY2h5Rm9yU2VsZWN0aW9uKE9iamVjdCBpdGVtLCBTZXQgc2VsZWN0ZWROb2RlcykgewotCi0gICAgICAgIC8vT25seSBwcmltZSBpdCBpZiB3ZSBoYXZlbid0IHZpc2l0ZWQgeWV0Ci0gICAgICAgIGlmIChzZWxlY3RlZE5vZGVzLmNvbnRhaW5zKGl0ZW0pKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGNoZWNrZWRTdGF0ZVN0b3JlLnB1dChpdGVtLCBuZXcgQXJyYXlMaXN0KCkpOwotCi0gICAgICAgIC8vbWFyayBhcyBleHBhbmRlZCBhcyB3ZSBhcmUgZ29pbmcgdG8gcG9wdWxhdGUgaXQgYWZ0ZXIgdGhpcwotICAgICAgICBleHBhbmRlZFRyZWVOb2Rlcy5hZGQoaXRlbSk7Ci0gICAgICAgIHNlbGVjdGVkTm9kZXMuYWRkKGl0ZW0pOwotCi0gICAgICAgIE9iamVjdCBwYXJlbnQgPSB0cmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudChpdGVtKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICAgICAgcHJpbWVIaWVyYXJjaHlGb3JTZWxlY3Rpb24ocGFyZW50LCBzZWxlY3RlZE5vZGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglSZW1vdmUgdGhlIHBhc3NlZCBsaXN0ZW5lciBmcm9tIHNlbGYncyBjb2xsZWN0aW9uIG9mIGNsaWVudHMKLSAgICAgKgl0aGF0IGxpc3RlbiBmb3IgY2hhbmdlcyB0byBlbGVtZW50IGNoZWNrZWQgc3RhdGVzCi0gICAgICoKLSAgICAgKglAcGFyYW0gbGlzdGVuZXIgSUNoZWNrU3RhdGVMaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNoZWNrU3RhdGVMaXN0ZW5lcihJQ2hlY2tTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHJlbW92ZUxpc3RlbmVyT2JqZWN0KGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglIYW5kbGUgdGhlIHNlbGVjdGlvbiBvZiBhbiBpdGVtIGluIHRoZSB0cmVlIHZpZXdlcgotICAgICAqCi0gICAgICoJQHBhcmFtIGV2ZW50IFNlbGVjdGlvbkNoYW5nZWRFdmVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIE9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgY3VycmVudFRyZWVTZWxlY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgbGlzdFZpZXdlci5zZXRJbnB1dChjdXJyZW50VHJlZVNlbGVjdGlvbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZS4tIGlmIG5vdCBhbiBpdGVtIGRlc2VsZWN0aW9uCi0gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgIT0gY3VycmVudFRyZWVTZWxlY3Rpb24pCi0gICAgICAgICAgICBwb3B1bGF0ZUxpc3RWaWV3ZXIoc2VsZWN0ZWRFbGVtZW50KTsKLQotICAgICAgICBjdXJyZW50VHJlZVNlbGVjdGlvbiA9IHNlbGVjdGVkRWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3Qgb3IgZGVzZWxlY3QgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgdHJlZSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3Rpb24KLSAgICAgKiBib29sZWFuLiBCZSBzdXJlIHRvIHVwZGF0ZSB0aGUgZGlzcGxheWVkIGZpbGVzIGFzIHdlbGwuCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFsbFNlbGVjdGlvbnMoZmluYWwgYm9vbGVhbiBzZWxlY3Rpb24pIHsKLQotICAgICAgICAvL0lmIHRoZXJlIGlzIG5vIHJvb3QgdGhlcmUgaXMgbm90aGluZyB0byBzZWxlY3QKLSAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvL1BvdGVudGlhbGx5IGxvbmcgb3BlcmF0aW9uIC0gc2hvdyBhIGJ1c3kgY3Vyc29yCi0gICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwKLSAgICAgICAgICAgICAgICBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFRyZWVDaGVja2VkKHJvb3QsIHNlbGVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0Vmlld2VyLnNldEFsbENoZWNrZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB0cmVlRWxlbWVudCBoYXMgYmVlbiB3aGl0ZSBzZWxlY3RlZC4gR2V0IHRoZSBsaXN0IGZvciB0aGUgZWxlbWVudCBhbmQKLSAgICAgKiBzZXQgaXQgaW4gdGhlIGNoZWNrZWQgc3RhdGUgc3RvcmUuCi0gICAgICogQHBhcmFtIHRyZWVFbGVtZW50IHRoZSBlbGVtZW50IGJlaW5nIHVwZGF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TGlzdEZvcldoaXRlU2VsZWN0aW9uKE9iamVjdCB0cmVlRWxlbWVudCkgewotCi0gICAgICAgIE9iamVjdFtdIGxpc3RJdGVtcyA9IGxpc3RDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHModHJlZUVsZW1lbnQpOwotICAgICAgICBMaXN0IGxpc3RJdGVtc0NoZWNrZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdEl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBsaXN0SXRlbXNDaGVja2VkLmFkZChsaXN0SXRlbXNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hlY2tlZFN0YXRlU3RvcmUucHV0KHRyZWVFbGVtZW50LCBsaXN0SXRlbXNDaGVja2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTZXQgdGhlIGxpc3Qgdmlld2VyJ3MgcHJvdmlkZXJzIHRvIHRob3NlIHBhc3NlZAotICAgICAqCi0gICAgICoJQHBhcmFtIGNvbnRlbnRQcm92aWRlciBJVHJlZUNvbnRlbnRQcm92aWRlcgotICAgICAqCUBwYXJhbSBsYWJlbFByb3ZpZGVyIElMYWJlbFByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdFByb3ZpZGVycyhJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0gICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0gICAgICAgIGxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0gICAgICAgIGxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNvcnRlciB0aGF0IGlzIHRvIGJlIGFwcGxpZWQgdG8gc2VsZidzIGxpc3Qgdmlld2VyCi0gICAgICogQHBhcmFtIHNvcnRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExpc3RTb3J0ZXIoVmlld2VyU29ydGVyIHNvcnRlcikgewotICAgICAgICBsaXN0Vmlld2VyLnNldFNvcnRlcihzb3J0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcm9vdCBvZiB0aGUgd2lkZ2V0IHRvIGJlIG5ldyBSb290LiBSZWdlbmVyYXRlIGFsbCBvZiB0aGUgdGFibGVzIGFuZCBsaXN0cyBmcm9tIHRoaXMKLSAgICAgKiB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gbmV3Um9vdCAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb290KE9iamVjdCBuZXdSb290KSB7Ci0gICAgICAgIHRoaXMucm9vdCA9IG5ld1Jvb3Q7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTZXQgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIHBhc3NlZCB0cmVlIGVsZW1lbnQgYXBwcm9wcmlhdGVseSwgYW5kCi0gICAgICoJZG8gc28gcmVjdXJzaXZlbHkgdG8gYWxsIG9mIGl0cyBjaGlsZCB0cmVlIGVsZW1lbnRzIGFzIHdlbGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRUcmVlQ2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQsIGJvb2xlYW4gc3RhdGUpIHsKLQotICAgICAgICBpZiAodHJlZUVsZW1lbnQuZXF1YWxzKGN1cnJlbnRUcmVlU2VsZWN0aW9uKSkgewotICAgICAgICAgICAgbGlzdFZpZXdlci5zZXRBbGxDaGVja2VkKHN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGF0ZSkgewotICAgICAgICAgICAgc2V0TGlzdEZvcldoaXRlU2VsZWN0aW9uKHRyZWVFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBjaGVja2VkU3RhdGVTdG9yZS5yZW1vdmUodHJlZUVsZW1lbnQpOwotCi0gICAgICAgIHNldFdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCwgc3RhdGUpOwotICAgICAgICB0cmVlVmlld2VyLnNldENoZWNrZWQodHJlZUVsZW1lbnQsIHN0YXRlKTsKLSAgICAgICAgdHJlZVZpZXdlci5zZXRHcmF5ZWQodHJlZUVsZW1lbnQsIGZhbHNlKTsKLQotICAgICAgICAvLyBub3cgbG9naWNhbGx5IGNoZWNrL3VuY2hlY2sgYWxsIGNoaWxkcmVuIGFzIHdlbGwgaWYgaXQgaGFzIGJlZW4gZXhwYW5kZWQKLSAgICAgICAgaWYgKGV4cGFuZGVkVHJlZU5vZGVzLmNvbnRhaW5zKHRyZWVFbGVtZW50KSkgewotICAgICAgICAgICAgT2JqZWN0W10gY2hpbGRyZW4gPSB0cmVlQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKHRyZWVFbGVtZW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzZXRUcmVlQ2hlY2tlZChjaGlsZHJlbltpXSwgc3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJU2V0IHRoZSB0cmVlIHZpZXdlcidzIHByb3ZpZGVycyB0byB0aG9zZSBwYXNzZWQKLSAgICAgKgotICAgICAqCUBwYXJhbSBjb250ZW50UHJvdmlkZXIgSVRyZWVDb250ZW50UHJvdmlkZXIKLSAgICAgKglAcGFyYW0gbGFiZWxQcm92aWRlciBJTGFiZWxQcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRyZWVQcm92aWRlcnMoSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotICAgICAgICB0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotICAgICAgICB0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzb3J0ZXIgdGhhdCBpcyB0byBiZSBhcHBsaWVkIHRvIHNlbGYncyB0cmVlIHZpZXdlcgotICAgICAqIEBwYXJhbSBzb3J0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmVlU29ydGVyKFZpZXdlclNvcnRlciBzb3J0ZXIpIHsKLSAgICAgICAgdHJlZVZpZXdlci5zZXRTb3J0ZXIoc29ydGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBZGp1c3QgdGhlIGNvbGxlY3Rpb24gb2YgcmVmZXJlbmNlcyB0byB3aGl0ZS1jaGVja2VkIHRyZWUgZWxlbWVudHMgYXBwcm9wcmlhdGVseS4KLSAgICAgKgotICAgICAqCUBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0gICAgICoJQHBhcmFtIGlzV2hpdGVDaGVja2VkIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRXaGl0ZUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50LCBib29sZWFuIGlzV2hpdGVDaGVja2VkKSB7Ci0gICAgICAgIGlmIChpc1doaXRlQ2hlY2tlZCkgewotICAgICAgICAgICAgaWYgKCF3aGl0ZUNoZWNrZWRUcmVlSXRlbXMuY29udGFpbnModHJlZUVsZW1lbnQpKQotICAgICAgICAgICAgICAgIHdoaXRlQ2hlY2tlZFRyZWVJdGVtcy5hZGQodHJlZUVsZW1lbnQpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHdoaXRlQ2hlY2tlZFRyZWVJdGVtcy5yZW1vdmUodHJlZUVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUhhbmRsZSB0aGUgY29sbGFwc2luZyBvZiBhbiBlbGVtZW50IGluIGEgdHJlZSB2aWV3ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHdpdGggdGhpcwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUhhbmRsZSB0aGUgZXhwYW5zaW9uc2lvbiBvZiBhbiBlbGVtZW50IGluIGEgdHJlZSB2aWV3ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGV4cGFuZFRyZWVFbGVtZW50KGV2ZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENhbGxiYWNrIHRoYXQncyBpbnZva2VkIHdoZW4gdGhlIGNoZWNrZWQgc3RhdHVzIG9mIGFuIGl0ZW0gaW4gdGhlIHRyZWUKLSAgICAgKiAgaXMgY2hhbmdlZCBieSB0aGUgdXNlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0cmVlSXRlbUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50LCBib29sZWFuIHN0YXRlKSB7Ci0KLSAgICAgICAgLy8gcmVjdXJzaXZlbHkgYWRqdXN0IGFsbCBjaGlsZCB0cmVlIGVsZW1lbnRzIGFwcHJvcHJpYXRlbHkKLSAgICAgICAgc2V0VHJlZUNoZWNrZWQodHJlZUVsZW1lbnQsIHN0YXRlKTsKLQotICAgICAgICBPYmplY3QgcGFyZW50ID0gdHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQodHJlZUVsZW1lbnQpOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gbm93IHVwZGF0ZSB1cHdhcmRzIGluIHRoZSB0cmVlIGhpZXJhcmNoeSAKLSAgICAgICAgaWYgKHN0YXRlKQotICAgICAgICAgICAgZ3JheUNoZWNrSGllcmFyY2h5KHBhcmVudCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVuZ3JheUNoZWNrSGllcmFyY2h5KHBhcmVudCk7Ci0KLSAgICAgICAgLy9VcGRhdGUgdGhlIGhpZXJhcmNoeSBidXQgZG8gbm90IHdoaXRlIHNlbGVjdCB0aGUgcGFyZW50Ci0gICAgICAgIGdyYXlVcGRhdGVIaWVyYXJjaHkocGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglMb2dpY2FsbHkgdW4tZ3JheS1jaGVjayBhbGwgYW5jZXN0b3JzIG9mIHRyZWVJdGVtIGlmZiBhcHByb3ByaWF0ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1bmdyYXlDaGVja0hpZXJhcmNoeShPYmplY3QgdHJlZUVsZW1lbnQpIHsKLSAgICAgICAgaWYgKCFkZXRlcm1pbmVTaG91bGRCZUF0TGVhc3RHcmF5Q2hlY2tlZCh0cmVlRWxlbWVudCkpCi0gICAgICAgICAgICBjaGVja2VkU3RhdGVTdG9yZS5yZW1vdmUodHJlZUVsZW1lbnQpOwotCi0gICAgICAgIE9iamVjdCBwYXJlbnQgPSB0cmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudCh0cmVlRWxlbWVudCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHVuZ3JheUNoZWNrSGllcmFyY2h5KHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJU2V0IHRoZSBjaGVja2VkIHN0YXRlIG9mIHNlbGYgYW5kIGFsbCBhbmNlc3RvcnMgYXBwcm9wcmlhdGVseQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUhpZXJhcmNoeShPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQotICAgICAgICBib29sZWFuIHdoaXRlQ2hlY2tlZCA9IGRldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKHRyZWVFbGVtZW50KTsKLSAgICAgICAgYm9vbGVhbiBzaG91bGRCZUF0TGVhc3RHcmF5ID0gZGV0ZXJtaW5lU2hvdWxkQmVBdExlYXN0R3JheUNoZWNrZWQodHJlZUVsZW1lbnQpOwotCi0gICAgICAgIHRyZWVWaWV3ZXIuc2V0Q2hlY2tlZCh0cmVlRWxlbWVudCwgc2hvdWxkQmVBdExlYXN0R3JheSk7Ci0gICAgICAgIHNldFdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCwgd2hpdGVDaGVja2VkKTsKLSAgICAgICAgaWYgKHdoaXRlQ2hlY2tlZCkKLSAgICAgICAgICAgIHRyZWVWaWV3ZXIuc2V0R3JheWVkKHRyZWVFbGVtZW50LCBmYWxzZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRyZWVWaWV3ZXIuc2V0R3JheWVkKHRyZWVFbGVtZW50LCBzaG91bGRCZUF0TGVhc3RHcmF5KTsKLQotICAgICAgICAvLyBwcm9jZWVkIHVwIHRoZSB0cmVlIGVsZW1lbnQgaGllcmFyY2h5IGJ1dCBncmF5IHNlbGVjdCBhbGwgb2YgdGhlbQotICAgICAgICBPYmplY3QgcGFyZW50ID0gdHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQodHJlZUVsZW1lbnQpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdyYXlVcGRhdGVIaWVyYXJjaHkocGFyZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgc2VsZWN0aW9ucyBvZiB0aGUgdHJlZSBlbGVtZW50cyBpbiBpdGVtcyB0byByZWZsZWN0IHRoZSBuZXcKLSAgICAgKiBzZWxlY3Rpb25zIHByb3ZpZGVkLgotICAgICAqIEBwYXJhbSBpdGVtcyBNYXAgd2l0aCBrZXlzIG9mIE9iamVjdCAodGhlIHRyZWUgZWxlbWVudCkgYW5kIHZhbHVlcyBvZiBMaXN0ICh0aGUgc2VsZWN0ZWQKLSAgICAgKiBsaXN0IGVsZW1lbnRzKS4gIAotICAgICAqIE5PVEU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IHNwZWNpYWwgY2FzZSBrZXlzIHdpdGggbm8gdmFsdWVzIChpLmUuLCAKLSAgICAgKiBhIHRyZWUgZWxlbWVudCB3aXRoIGFuIGVtcHR5IGxpc3QpLiAgSWYgYSB0cmVlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbnkgc2VsZWN0ZWQKLSAgICAgKiBpdGVtcywgZG8gbm90IGluY2x1ZGUgdGhlIGVsZW1lbnQgaW4gdGhlIE1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVTZWxlY3Rpb25zKE1hcCBpdGVtcykgewotICAgICAgICAvLyBXZSBhcmUgcmVwbGFjaW5nIGFsbCBzZWxlY3RlZCBpdGVtcyB3aXRoIHRoZSBnaXZlbiBzZWxlY3RlZCBpdGVtcywKLSAgICAgICAgLy8gc28gcmVpbml0aWFsaXplIGV2ZXJ5dGhpbmcuCi0gICAgICAgIHRoaXMubGlzdFZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLSAgICAgICAgdGhpcy50cmVlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgdGhpcy53aGl0ZUNoZWNrZWRUcmVlSXRlbXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgc2VsZWN0ZWROb2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGNoZWNrZWRTdGF0ZVN0b3JlID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAvL1VwZGF0ZSB0aGUgc3RvcmUgYmVmb3JlIHRoZSBoaWVyYXJjaHkgdG8gcHJldmVudCB1cGRhdGluZyBwYXJlbnRzIGJlZm9yZSBhbGwgb2YgdGhlIGNoaWxkcmVuIGFyZSBkb25lCi0gICAgICAgIEl0ZXJhdG9yIGtleUl0ZXJhdG9yID0gaXRlbXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGtleUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGtleUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIExpc3Qgc2VsZWN0aW9ucyA9IChMaXN0KSBpdGVtcy5nZXQoa2V5KTsKLSAgICAgICAgICAgIC8vUmVwbGFjZSB0aGUgaXRlbXMgaW4gdGhlIGNoZWNrZWQgc3RhdGUgc3RvcmUgd2l0aCB0aG9zZSBmcm9tIHRoZSBzdXBwbGllZCBpdGVtcwkJCQotICAgICAgICAgICAgY2hlY2tlZFN0YXRlU3RvcmUucHV0KGtleSwgc2VsZWN0aW9ucyk7Ci0gICAgICAgICAgICBzZWxlY3RlZE5vZGVzLmFkZChrZXkpOwotICAgICAgICAgICAgLy8gcHJvY2VlZCB1cCB0aGUgdHJlZSBlbGVtZW50IGhpZXJhcmNoeQotICAgICAgICAgICAgT2JqZWN0IHBhcmVudCA9IHRyZWVDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KGtleSk7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBwcm9jZWVkIHVwIHRoZSB0cmVlIGVsZW1lbnQgaGllcmFyY2h5IGFuZCBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBpbiB0aGUgdGFibGUJCQotICAgICAgICAgICAgICAgIHByaW1lSGllcmFyY2h5Rm9yU2VsZWN0aW9uKHBhcmVudCwgc2VsZWN0ZWROb2Rlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgdGhlIGNoZWNrZWQgdHJlZSBpdGVtcy4gIFNpbmNlIGVhY2ggdHJlZSBpdGVtIGhhcyBhIHNlbGVjdGVkCi0gICAgICAgIC8vIGl0ZW0sIGFsbCB0aGUgdHJlZSBpdGVtcyB3aWxsIGJlIGdyYXkgY2hlY2tlZC4KLSAgICAgICAgdHJlZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoY2hlY2tlZFN0YXRlU3RvcmUua2V5U2V0KCkudG9BcnJheSgpKTsKLSAgICAgICAgdHJlZVZpZXdlci5zZXRHcmF5ZWRFbGVtZW50cyhjaGVja2VkU3RhdGVTdG9yZS5rZXlTZXQoKS50b0FycmF5KCkpOwotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgbGlzdFZpZXcgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0cmVlIGl0ZW0uCi0gICAgICAgIGlmIChjdXJyZW50VHJlZVNlbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPYmplY3QgZGlzcGxheUl0ZW1zID0gaXRlbXMuZ2V0KGN1cnJlbnRUcmVlU2VsZWN0aW9uKTsKLSAgICAgICAgICAgIGlmIChkaXNwbGF5SXRlbXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBsaXN0Vmlld2VyLnNldENoZWNrZWRFbGVtZW50cygoKExpc3QpIGRpc3BsYXlJdGVtcykudG9BcnJheSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBTZXQgdGhlIGZvY3VzIG9uIHRvIHRoZSBsaXN0IHdpZGdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQotICAgICAgICB0aGlzLnRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldEZvY3VzKCk7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9SZXNvdXJjZVdvcmtpbmdTZXRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvUmVzb3VyY2VXb3JraW5nU2V0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzQ4YTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9SZXNvdXJjZVdvcmtpbmdTZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKiAgCVNlYmFzdGlhbiBEYXZpZHMgPHNkYXZpZHNAZ214LmRlPiAtIEZpeCBmb3IgYnVnIDE5MzQ2IC0gRGlhbG9nIGZvbnQKLSAqIAkJc2hvdWxkIGJlIGFjdGl2YXRlZCBhbmQgdXNlZCBieSBvdGhlciBjb21wb25lbnRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlVmlld2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlRXhwYW5zaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklXb3JraW5nU2V0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBBIHJlc291cmNlIHdvcmtpbmcgc2V0IHBhZ2UgYWxsb3dzIHRoZSB1c2VyIHRvIGVkaXQgYW4gCi0gKiBleGlzdGluZyB3b3JraW5nIHNldCBhbmQgY3JlYXRlIGEgbmV3IHdvcmtpbmcgc2V0LgotICogPHA+Ci0gKiBXb3JraW5nIHNldCBlbGVtZW50cyBhcmUgcHJlc2VudGVkIGFzIGEgc2ltcGxlIHJlc291cmNlIHRyZWUuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlV29ya2luZ1NldFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMKLSAgICAgICAgSVdvcmtpbmdTZXRQYWdlIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0laSU5HX1NFTEVDVElPTl9XSURHRVRfV0lEVEggPSA1MDsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSVpJTkdfU0VMRUNUSU9OX1dJREdFVF9IRUlHSFQgPSAyMDA7Ci0KLSAgICBwcml2YXRlIFRleHQgdGV4dDsKLQotICAgIHByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyIHRyZWU7Ci0KLSAgICBwcml2YXRlIElXb3JraW5nU2V0IHdvcmtpbmdTZXQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RDaGVjayA9IGZhbHNlOyAvLyBzZXQgdG8gdHJ1ZSBpZiBzZWxlY3Rpb24gaXMgc2V0IGluIHNldFNlbGVjdGlvbgotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlV29ya2luZ1NldFBhZ2UoKSB7Ci0gICAgICAgIHN1cGVyKAotICAgICAgICAgICAgICAgICJyZXNvdXJjZVdvcmtpbmdTZXRQYWdlIiwgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX3RpdGxlLAotICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19XSVpCQU5fUkVTT1VSQ0VXT1JLSU5HU0VUX1dJWikpOwotICAgICAgICBzZXREZXNjcmlwdGlvbihJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX2Rlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHdvcmtpbmcgc2V0IGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gY29udGFpbmVyIHRvIHRoZSBsaXN0Ci0gICAgICogb2YgY2hlY2tlZCByZXNvdXJjZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGxlY3RlZFJlc291cmNlcyBsaXN0IG9mIGNvbGxlY3RlZCByZXNvdXJjZXMKLSAgICAgKiBAcGFyYW0gY29udGFpbmVyIGNvbnRhaW5lciB0byBjb2xsZWN0IHdvcmtpbmcgc2V0IGVsZW1lbnRzIGZvcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRXb3JraW5nU2V0RWxlbWVudHMoTGlzdCBjb2xsZWN0ZWRSZXNvdXJjZXMsCi0gICAgICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lcikgewotICAgICAgICBJQWRhcHRhYmxlW10gZWxlbWVudHMgPSB3b3JraW5nU2V0LmdldEVsZW1lbnRzKCk7Ci0gICAgICAgIElQYXRoIGNvbnRhaW5lclBhdGggPSBjb250YWluZXIuZ2V0RnVsbFBhdGgoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICAgICAgICAgICAgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBlbGVtZW50c1tpXTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGVsZW1lbnRzW2ldLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQotICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJUGF0aCByZXNvdXJjZVBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJQYXRoLmlzUHJlZml4T2YocmVzb3VyY2VQYXRoKSkKLSAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkUmVzb3VyY2VzLmFkZChlbGVtZW50c1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZXMgbWV0aG9kIGluIFdpemFyZFBhZ2UuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5XT1JLSU5HX1NFVF9SRVNPVVJDRV9QQUdFKTsKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VXb3JraW5nU2V0UGFnZV9tZXNzYWdlKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLSAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChmb250KTsKLQotICAgICAgICB0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICAgICAgdGV4dC5zZXRGb250KGZvbnQpOwotICAgICAgICB0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlSW5wdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRleHQuc2V0Rm9jdXMoKTsKLQotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX2xhYmVsX3RyZWUpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBsYWJlbC5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIHRyZWUgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHRyZWUuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJZmluYWwgSVRyZWVDb250ZW50UHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKTsKLSAgICAgICAgdHJlZS5zZXRDb250ZW50UHJvdmlkZXIodHJlZUNvbnRlbnRQcm92aWRlcik7Ci0gICAgICAgIHRyZWUuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIoCi0gICAgICAgICAgICAgICAgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLSAgICAgICAgdHJlZS5zZXRJbnB1dChJREVXb3JrYmVuY2hQbHVnaW4uZ2V0UGx1Z2luV29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgdHJlZS5zZXRTb3J0ZXIobmV3IFJlc291cmNlU29ydGVyKFJlc291cmNlU29ydGVyLk5BTUUpKTsKLQotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSBTSVpJTkdfU0VMRUNUSU9OX1dJREdFVF9IRUlHSFQ7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gU0laSU5HX1NFTEVDVElPTl9XSURHRVRfV0lEVEg7Ci0gICAgICAgIHRyZWUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHRyZWUuZ2V0Q29udHJvbCgpLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgdHJlZS5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tTdGF0ZUNoYW5nZShldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRyZWUuYWRkVHJlZUxpc3RlbmVyKG5ldyBJVHJlZVZpZXdlckxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBlbGVtZW50ID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmICh0cmVlLmdldEdyYXllZChlbGVtZW50KSA9PSBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdWJ0cmVlQ2hlY2tlZCgoSUNvbnRhaW5lcikgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZS5nZXRDaGVja2VkKGVsZW1lbnQpLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLQkJLy8gQWRkIHNlbGVjdCAvIGRlc2VsZWN0IGFsbCBidXR0b25zIGZvciBidWcgNDY2NjkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQkKLQkJQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlV29ya2luZ1NldFBhZ2Vfc2VsZWN0QWxsX2xhYmVsKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlV29ya2luZ1NldFBhZ2Vfc2VsZWN0QWxsX3Rvb2xUaXApOwotCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25FdmVudCkgewotCQkJCXRyZWUuc2V0Q2hlY2tlZEVsZW1lbnRzKHRyZWVDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHModHJlZS5nZXRJbnB1dCgpKSk7Ci0JCQkJdmFsaWRhdGVJbnB1dCgpOwotCQkJfQotCQl9KTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0JCXNldEJ1dHRvbkxheW91dERhdGEoc2VsZWN0QWxsQnV0dG9uKTsKLQotCQlCdXR0b24gZGVzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlV29ya2luZ1NldFBhZ2VfZGVzZWxlY3RBbGxfbGFiZWwpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUb29sVGlwVGV4dChJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX2Rlc2VsZWN0QWxsX3Rvb2xUaXApOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlbGVjdGlvbkV2ZW50KSB7Ci0JCQkJdHJlZS5zZXRDaGVja2VkRWxlbWVudHMobmV3IE9iamVjdFswXSk7Ci0JCQkJdmFsaWRhdGVJbnB1dCgpOwotCQkJfQotCQl9KTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0Rm9udChmb250KTsKLQkJc2V0QnV0dG9uTGF5b3V0RGF0YShkZXNlbGVjdEFsbEJ1dHRvbik7Ci0JCQotCQlpbml0aWFsaXplQ2hlY2tlZFN0YXRlKCk7Ci0gICAgICAgIGlmICh3b3JraW5nU2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRleHQuc2V0VGV4dCh3b3JraW5nU2V0LmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb2xsZWN0cyBhbGwgY2hlY2tlZCByZXNvdXJjZXMgaW4gdGhlIHNwZWNpZmllZCBjb250YWluZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNoZWNrZWRSZXNvdXJjZXMgdGhlIG91dHB1dCwgbGlzdCBvZiBjaGVja2VkIHJlc291cmNlcwotICAgICAqIEBwYXJhbSBjb250YWluZXIgdGhlIGNvbnRhaW5lciB0byBjb2xsZWN0IGNoZWNrZWQgcmVzb3VyY2VzIGluCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmRDaGVja2VkUmVzb3VyY2VzKExpc3QgY2hlY2tlZFJlc291cmNlcywKLSAgICAgICAgICAgIElDb250YWluZXIgY29udGFpbmVyKSB7Ci0gICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvdXJjZXMgPSBjb250YWluZXIubWVtYmVycygpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBoYW5kbGVDb3JlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBleCwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VXb3JraW5nU2V0UGFnZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VXb3JraW5nU2V0UGFnZV9lcnJvcl91cGRhdGVDaGVja2VkU3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodHJlZS5nZXRHcmF5ZWQocmVzb3VyY2VzW2ldKSkgewotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNbaV0uaXNBY2Nlc3NpYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgIGZpbmRDaGVja2VkUmVzb3VyY2VzKGNoZWNrZWRSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKElDb250YWluZXIpIHJlc291cmNlc1tpXSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBhZGRXb3JraW5nU2V0RWxlbWVudHMoY2hlY2tlZFJlc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSUNvbnRhaW5lcikgcmVzb3VyY2VzW2ldKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJlZS5nZXRDaGVja2VkKHJlc291cmNlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICBjaGVja2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50cyBJV29ya2luZ1NldFBhZ2UuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklXb3JraW5nU2V0UGFnZSNmaW5pc2goKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKLSAgICAgICAgQXJyYXlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoMTApOwotICAgICAgICBmaW5kQ2hlY2tlZFJlc291cmNlcyhyZXNvdXJjZXMsIChJQ29udGFpbmVyKSB0cmVlLmdldElucHV0KCkpOwotICAgICAgICBpZiAod29ya2luZ1NldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJV29ya2luZ1NldE1hbmFnZXIgd29ya2luZ1NldE1hbmFnZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRXb3JraW5nU2V0TWFuYWdlcigpOwotICAgICAgICAgICAgd29ya2luZ1NldCA9IHdvcmtpbmdTZXRNYW5hZ2VyLmNyZWF0ZVdvcmtpbmdTZXQoCi0gICAgICAgICAgICAgICAgICAgIGdldFdvcmtpbmdTZXROYW1lKCksIChJQWRhcHRhYmxlW10pIHJlc291cmNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KG5ldyBJQWRhcHRhYmxlW3Jlc291cmNlcy5zaXplKCldKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3b3JraW5nU2V0LnNldE5hbWUoZ2V0V29ya2luZ1NldE5hbWUoKSk7Ci0gICAgICAgICAgICB3b3JraW5nU2V0LnNldEVsZW1lbnRzKChJQWRhcHRhYmxlW10pIHJlc291cmNlcwotICAgICAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgSUFkYXB0YWJsZVtyZXNvdXJjZXMuc2l6ZSgpXSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50cyBJV29ya2luZ1NldFBhZ2UuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklXb3JraW5nU2V0UGFnZSNnZXRTZWxlY3Rpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBJV29ya2luZ1NldCBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB3b3JraW5nU2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgZW50ZXJlZCBpbiB0aGUgd29ya2luZyBzZXQgbmFtZSBmaWVsZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIGVudGVyZWQgaW4gdGhlIHdvcmtpbmcgc2V0IG5hbWUgZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V29ya2luZ1NldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0ZXh0LmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIHRyZWUgaXRlbSBjaGFuZ2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgY2hlY2tlZCBzdGF0ZSBjaGFuZ2UgZXZlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNoZWNrU3RhdGVDaGFuZ2UoZmluYWwgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGV2ZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN0YXRlID0gZXZlbnQuZ2V0Q2hlY2tlZCgpOwotCi0gICAgICAgICAgICAgICAgdHJlZS5zZXRHcmF5ZWQocmVzb3VyY2UsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN1YnRyZWVDaGVja2VkKChJQ29udGFpbmVyKSByZXNvdXJjZSwgc3RhdGUsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGVQYXJlbnRTdGF0ZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVJbnB1dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIHdoZW4gYSBDb3JlRXhjZXB0aW9uIG9jY3VyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgQ29yZUV4Y2VwdGlvbiAKLSAgICAgKiBAcGFyYW0gc2hlbGwgcGFyZW50IHNoZWxsIGZvciB0aGUgbWVzc2FnZSBib3gKLSAgICAgKiBAcGFyYW0gdGl0bGUgdGhlIG1lc2FnZSBib3ggdGl0bGUKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBhZGRpdGlvbmFsIGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29yZUV4Y2VwdGlvbihDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbiwgU2hlbGwgc2hlbGwsCi0gICAgICAgICAgICBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gZXhjZXB0aW9uLmdldFN0YXR1cygpOwotICAgICAgICBpZiAoc3RhdHVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuSW50ZXJuYWxFcnJvciwgZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRyZWUgaXRlbXMgYmFzZWQgb24gdGhlIGluaXRpYWwgCi0gICAgICogd29ya2luZyBzZXQsIGlmIGFueS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNoZWNrZWRTdGF0ZSgpIHsKLSAgICAgICAgaWYgKHdvcmtpbmdTZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIElBZGFwdGFibGVbXSBpdGVtcyA9IHdvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICB0cmVlLnNldENoZWNrZWRFbGVtZW50cyhpdGVtcyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBJQWRhcHRhYmxlIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gKElDb250YWluZXIpIGl0ZW07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgaXRlbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJQ29udGFpbmVyLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFN1YnRyZWVDaGVja2VkKGNvbnRhaW5lciwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlID0gKElSZXNvdXJjZSkgaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlID0gKElSZXNvdXJjZSkgaXRlbS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJlZS5nZXRDaGVja2VkKHByb2plY3QpID09IGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWUuc2V0R3JheUNoZWNrZWQocHJvamVjdCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQYXJlbnRTdGF0ZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudHMgSVdvcmtpbmdTZXRQYWdlLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JV29ya2luZ1NldFBhZ2Ujc2V0U2VsZWN0aW9uKElXb3JraW5nU2V0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0gICAgICAgIGlmICh3b3JraW5nU2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIldvcmtpbmcgc2V0IG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHRoaXMud29ya2luZ1NldCA9IHdvcmtpbmdTZXQ7Ci0gICAgICAgIGlmIChnZXRTaGVsbCgpICE9IG51bGwgJiYgdGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaXJzdENoZWNrID0gdHJ1ZTsKLSAgICAgICAgICAgIGluaXRpYWxpemVDaGVja2VkU3RhdGUoKTsKLSAgICAgICAgICAgIHRleHQuc2V0VGV4dCh3b3JraW5nU2V0LmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjb250YWluZXIncyBtZW1iZXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250YWluZXIgdGhlIGNvbnRhaW5lciB3aG9zZSBjaGlsZHJlbiBzaG91bGQgYmUgY2hlY2tlZC91bmNoZWNrZWQKLSAgICAgKiBAcGFyYW0gc3RhdGUgdHJ1ZT1jaGVjayBhbGwgbWVtYmVycyBpbiB0aGUgY29udGFpbmVyLiBmYWxzZT11bmNoZWNrIGFsbCAKLSAgICAgKiAJbWVtYmVycyBpbiB0aGUgY29udGFpbmVyLgotICAgICAqIEBwYXJhbSBjaGVja0V4cGFuZGVkU3RhdGUgdHJ1ZT1yZWN1cnNlIGludG8gc3ViLWNvbnRhaW5lcnMgYW5kIHNldCB0aGUgCi0gICAgICogCWNoZWNrZWQgc3RhdGUuIGZhbHNlPW9ubHkgc2V0IGNoZWNrZWQgc3RhdGUgb2YgbWVtYmVycyBvZiB0aGlzIGNvbnRhaW5lcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTdWJ0cmVlQ2hlY2tlZChJQ29udGFpbmVyIGNvbnRhaW5lciwgYm9vbGVhbiBzdGF0ZSwKLSAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tFeHBhbmRlZFN0YXRlKSB7Ci0gICAgICAgIC8vIGNoZWNrZWQgc3RhdGUgaXMgc2V0IGxhemlseSBvbiBleHBhbmQsIGRvbid0IHNldCBpdCBpZiBjb250YWluZXIgaXMgY29sbGFwc2VkCi0gICAgICAgIGlmIChjb250YWluZXIuaXNBY2Nlc3NpYmxlKCkgPT0gZmFsc2UKLSAgICAgICAgICAgICAgICB8fCAodHJlZS5nZXRFeHBhbmRlZFN0YXRlKGNvbnRhaW5lcikgPT0gZmFsc2UgJiYgc3RhdGUgJiYgY2hlY2tFeHBhbmRlZFN0YXRlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIElSZXNvdXJjZVtdIG1lbWJlcnMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGhhbmRsZUNvcmVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIGV4LAotICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX2Vycm9yX3VwZGF0ZUNoZWNrZWRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IG1lbWJlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSBlbGVtZW50ID0gbWVtYmVyc1tpXTsKLSAgICAgICAgICAgIGJvb2xlYW4gZWxlbWVudEdyYXlDaGVja2VkID0gdHJlZS5nZXRHcmF5ZWQoZWxlbWVudCkKLSAgICAgICAgICAgICAgICAgICAgfHwgdHJlZS5nZXRDaGVja2VkKGVsZW1lbnQpOwotCi0gICAgICAgICAgICBpZiAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICB0cmVlLnNldENoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdHJlZS5zZXRHcmF5ZWQoZWxlbWVudCwgZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmVlLnNldEdyYXlDaGVja2VkKGVsZW1lbnQsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHVuY2hlY2tlZCBzdGF0ZSBvbmx5IG5lZWRzIHRvIGJlIHNldCB3aGVuIHRoZSBjb250YWluZXIgaXMgCi0gICAgICAgICAgICAvLyBjaGVja2VkIG9yIGdyYXllZAotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyICYmIChzdGF0ZSB8fCBlbGVtZW50R3JheUNoZWNrZWQpKSB7Ci0gICAgICAgICAgICAgICAgc2V0U3VidHJlZUNoZWNrZWQoKElDb250YWluZXIpIGVsZW1lbnQsIHN0YXRlLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGFuZCBncmF5IHRoZSByZXNvdXJjZSBwYXJlbnQgaWYgYWxsIHJlc291cmNlcyBvZiB0aGUgCi0gICAgICogcGFyZW50IGFyZSBjaGVja2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjaGlsZCB0aGUgcmVzb3VyY2Ugd2hvc2UgcGFyZW50IGNoZWNrZWQgc3RhdGUgc2hvdWxkIAotICAgICAqIAliZSBzZXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhcmVudFN0YXRlKElSZXNvdXJjZSBjaGlsZCkgewotICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXRQYXJlbnQoKSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIElDb250YWluZXIgcGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50KCk7Ci0gICAgICAgIGJvb2xlYW4gY2hpbGRDaGVja2VkID0gZmFsc2U7Ci0gICAgICAgIElSZXNvdXJjZVtdIG1lbWJlcnMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWVtYmVycyA9IHBhcmVudC5tZW1iZXJzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGhhbmRsZUNvcmVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIGV4LAotICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX2Vycm9yX3VwZGF0ZUNoZWNrZWRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IG1lbWJlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGlmICh0cmVlLmdldENoZWNrZWQobWVtYmVyc1tpXSkgfHwgdHJlZS5nZXRHcmF5ZWQobWVtYmVyc1tpXSkpIHsKLSAgICAgICAgICAgICAgICBjaGlsZENoZWNrZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRyZWUuc2V0R3JheUNoZWNrZWQocGFyZW50LCBjaGlsZENoZWNrZWQpOwotICAgICAgICB1cGRhdGVQYXJlbnRTdGF0ZShwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgd29ya2luZyBzZXQgbmFtZSBhbmQgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIAotICAgICAqIHJlc291cmNlIHRyZWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSW5wdXQoKSB7Ci0gICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgICAgICBTdHJpbmcgaW5mb01lc3NhZ2U9IG51bGw7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gdGV4dC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgaWYgKG5ld1RleHQuZXF1YWxzKG5ld1RleHQudHJpbSgpKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VXb3JraW5nU2V0UGFnZV93YXJuaW5nX25hbWVXaGl0ZXNwYWNlOyAKLSAgICAgICAgfSBlbHNlIGlmIChmaXJzdENoZWNrKSB7Ci0gICAgICAgICAgICBmaXJzdENoZWNrID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5ld1RleHQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX3dhcm5pbmdfbmFtZU11c3ROb3RCZUVtcHR5OwotICAgICAgICB9Ci0gICAgICAgIGlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbAotICAgICAgICAgICAgICAgICYmICh3b3JraW5nU2V0ID09IG51bGwgfHwgbmV3VGV4dC5lcXVhbHMod29ya2luZ1NldC5nZXROYW1lKCkpID09IGZhbHNlKSkgewotICAgICAgICAgICAgSVdvcmtpbmdTZXRbXSB3b3JraW5nU2V0cyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCkuZ2V0V29ya2luZ1NldHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29ya2luZ1NldHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobmV3VGV4dC5lcXVhbHMod29ya2luZ1NldHNbaV0uZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX3dhcm5pbmdfd29ya2luZ1NldEV4aXN0czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluZm9NZXNzYWdlID09IG51bGwgJiYgdHJlZS5nZXRDaGVja2VkRWxlbWVudHMoKS5sZW5ndGggPT0gMCkgewotICAgICAgICAJaW5mb01lc3NhZ2UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX3dhcm5pbmdfcmVzb3VyY2VNdXN0QmVDaGVja2VkOwotICAgICAgICB9Ci0gICAgICAgIHNldE1lc3NhZ2UoaW5mb01lc3NhZ2UsIElORk9STUFUSU9OKTsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1NpbXBsZUxpc3RDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9TaW1wbGVMaXN0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YmJkM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1NpbXBsZUxpc3RDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIFNpbXBsZUxpc3RDb250ZW50UHJvdmlkZXIgaXMgYSBjbGFzcyBkZXNpZ25lZCB0byByZXR1cm4gYSBzdGF0aWMgbGlzdCBvZiBpdGVtcwotICogd2hlbiBxdWVyaWVkIGZvciB1c2UgaW4gc2ltcGxlIGxpc3QgZGlhbG9ncy4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLSAgICAvL1RoZSBlbGVtZW50cyB0byBkaXNwbGF5Ci0gICAgcHJpdmF0ZSBPYmplY3RbXSBlbGVtZW50czsKLQotICAgIC8qKgotICAgICAqIFNpbXBsZUxpc3RDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2ltcGxlTGlzdENvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyBub3RoaW5nIHdoZW4gZGlzcG9zaW5nLAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyLiBUaGUgaW5wdXRFbGVtZW50IGlzIGlnbm9yZWQgZm9yIHRoaXMKLSAgICAgKiBwcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXF1aXJlZCBtZXRob2QgZnJvbSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci4gVGhlIGlucHV0IGlzIGFzc3VtZWQgdG8gbm90IGNoYW5nZSAKLSAgICAgKiBmb3IgdGhlIFNpbXBsZUxpc3RDb250ZW50Vmlld2VyIHNvIGRvIG5vdGhpbmcgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkuCi0gICAgICogQHBhcmFtIGl0ZW1zIE9iamVjdFtdCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudHMoT2JqZWN0W10gaXRlbXMpIHsKLQotICAgICAgICB0aGlzLmVsZW1lbnRzID0gaXRlbXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1VwZGF0ZVByb2plY3RDYXBhYmlsaXR5V2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvVXBkYXRlUHJvamVjdENhcGFiaWxpdHlXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxNDBmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvVXBkYXRlUHJvamVjdENhcGFiaWxpdHlXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeS5DYXBhYmlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeS5DYXBhYmlsaXR5UmVnaXN0cnk7Ci0KLS8qKgotICogU3RhbmRhcmQgd29ya2JlbmNoIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBzdXBwbHkKLSAqIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gY29uZmlndXJlIG5ldyBjYXBhYmlsaXRpZXMKLSAqIG9uIGFuIGV4aXN0aW5nIHByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVQcm9qZWN0Q2FwYWJpbGl0eVdpemFyZCBleHRlbmRzIE11bHRpU3RlcENhcGFiaWxpdHlXaXphcmQgewotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotICAgIHByaXZhdGUgQ2FwYWJpbGl0eVtdIGFkZENhcGFiaWxpdGllczsKLQotICAgIHByaXZhdGUgQ2FwYWJpbGl0eVtdIHJlbW92ZUNhcGFiaWxpdGllczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB3aXphcmQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gY29uZmlndXJlIG5ldyBjYXBhYmlsaXRpZXMKLSAgICAgKiBAcGFyYW0gYWRkQ2FwYWJpbGl0aWVzIHRoZSBuZXcgY2FwYWJpbGl0aWVzIHRvIGNvbmZpZ3VyZSBvbiB0aGUgcHJvamVjdAotICAgICAqIEBwYXJhbSByZW1vdmVDYXBhYmlsaXRpZXMgdGhlIG9sZCBjYXBhYmlsaXRpZXMgdG8gcmVtb3ZlIGZyb20gdGhlIHByb2plY3QKLSAgICAgKiAJCWluIHJldmVyc2Ugb3JkZXIgKGZpcnN0IGl0ZW0gbGFzdCB0byBiZSByZW1vdmVkKQotICAgICAqLwotICAgIHB1YmxpYyBVcGRhdGVQcm9qZWN0Q2FwYWJpbGl0eVdpemFyZChJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgQ2FwYWJpbGl0eVtdIGFkZENhcGFiaWxpdGllcywgQ2FwYWJpbGl0eVtdIHJlbW92ZUNhcGFiaWxpdGllcykgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICB0aGlzLmFkZENhcGFiaWxpdGllcyA9IGFkZENhcGFiaWxpdGllczsKLSAgICAgICAgdGhpcy5yZW1vdmVDYXBhYmlsaXRpZXMgPSByZW1vdmVDYXBhYmlsaXRpZXM7Ci0gICAgICAgIGluaXRpYWxpemVEZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICBzZXRXaW5kb3dUaXRsZShJREVXb3JrYmVuY2hNZXNzYWdlcy5VcGRhdGVQcm9qZWN0Q2FwYWJpbGl0eVdpemFyZF93aW5kb3dUaXRsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIHRoZSBjb2xsZWN0aW9uIG9mIHN0ZXBzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkU3RlcHMoKSB7Ci0gICAgICAgIGludCBzdGVwTnVtYmVyID0gMTsKLSAgICAgICAgQXJyYXlMaXN0IHN0ZXBzID0gbmV3IEFycmF5TGlzdChyZW1vdmVDYXBhYmlsaXRpZXMubGVuZ3RoCi0gICAgICAgICAgICAgICAgKyBhZGRDYXBhYmlsaXRpZXMubGVuZ3RoKTsKLQotICAgICAgICAvLyBjb2xsZWN0IHRoZSBtaW5pbXVtIHJlbW92ZSBjYXBhYmlsaXR5IHN0ZXBzCi0gICAgICAgIGlmIChyZW1vdmVDYXBhYmlsaXRpZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgLy8gUmVzZXJ2ZSB0aGUgb3JkZXIgc28gcHJlcmVxIGFyZW4ndCByZW1vdmVkIGJlZm9yZSBkZXBlbmRlbnRzCi0gICAgICAgICAgICBmb3IgKGludCBpID0gcmVtb3ZlQ2FwYWJpbGl0aWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbW92ZUNhcGFiaWxpdGllc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbGxlY3QgYWxsIHRoZSBuYXR1cmUgaWRzIHRoaXMgY2FwYWJpbGl0eSBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlLiBJbmNsdWRlcyBpdHNlbGYgYW5kIGFueSBvbmVzIHRoYXQgaXQKLSAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlcyB0aGUgdWkgZm9yLgotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgbmF0dXJlSWRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICBuYXR1cmVJZHMuYWRkKHJlbW92ZUNhcGFiaWxpdGllc1tpXS5nZXROYXR1cmVJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHVpSWRzID0gcmVtb3ZlQ2FwYWJpbGl0aWVzW2ldLmdldEhhbmRsZVVJcygpOwotICAgICAgICAgICAgICAgICAgICBpZiAodWlJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSB1aUlkcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlbW92ZUNhcGFiaWxpdGllcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlQ2FwYWJpbGl0aWVzW2pdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVDYXBhYmlsaXRpZXNbal0uZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdHVyZUlkcy5hZGQocmVtb3ZlQ2FwYWJpbGl0aWVzW2pdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmF0dXJlSWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2FwYWJpbGl0aWVzW2pdID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBzdGVwIHRvIHJlbW92ZSB0aGlzIGNhcGFiaWxpdHkgYW5kIHByZXJlcSBuYXR1cmVzCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGlkcyA9IG5ldyBTdHJpbmdbbmF0dXJlSWRzLnNpemUoKV07Ci0gICAgICAgICAgICAgICAgICAgIG5hdHVyZUlkcy50b0FycmF5KGlkcyk7Ci0gICAgICAgICAgICAgICAgICAgIHN0ZXBzLmFkZChuZXcgUmVtb3ZlQ2FwYWJpbGl0eVN0ZXAoc3RlcE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDYXBhYmlsaXRpZXNbaV0sIGlkcywgcHJvamVjdCkpOwotICAgICAgICAgICAgICAgICAgICBzdGVwTnVtYmVyKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29sbGVjdCB0aGUgbWluaW11bSBhZGQgY2FwYWJpbGl0eSBzdGVwcwotICAgICAgICBpZiAoYWRkQ2FwYWJpbGl0aWVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgICAgIENhcGFiaWxpdHlSZWdpc3RyeSByZWcgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDYXBhYmlsaXR5UmVnaXN0cnkoKTsKLSAgICAgICAgICAgIENhcGFiaWxpdHlbXSByZXN1bHRzID0gcmVnLnBydW5lQ2FwYWJpbGl0aWVzKGFkZENhcGFiaWxpdGllcyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyssIHN0ZXBOdW1iZXIrKykKLSAgICAgICAgICAgICAgICBzdGVwcy5hZGQobmV3IEluc3RhbGxDYXBhYmlsaXR5U3RlcChzdGVwTnVtYmVyLCByZXN1bHRzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgd29ya2JlbmNoLCB0aGlzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIGxpc3Qgb2Ygc3RlcHMgdG8gZG8KLSAgICAgICAgV2l6YXJkU3RlcFtdIHJlc3VsdHMgPSBuZXcgV2l6YXJkU3RlcFtzdGVwcy5zaXplKCldOwotICAgICAgICBzdGVwcy50b0FycmF5KHJlc3VsdHMpOwotICAgICAgICBzZXRTdGVwcyhyZXN1bHRzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE11bHRpU3RlcFdpemFyZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDdXN0b21QYWdlcygpIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE11bHRpU3RlcFdpemFyZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5GaW5pc2hPblJldmlld1BhZ2UoKSB7Ci0gICAgICAgIFdpemFyZFN0ZXBbXSBzdGVwcyA9IGdldFN0ZXBzKCk7Ci0gICAgICAgIC8vIHllcyBpZiB0aGUgb25seSBzdGVwIGlzIHRvIHJlbW92ZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgcmV0dXJuIHN0ZXBzLmxlbmd0aCA9PSAxICYmIHN0ZXBzWzBdIGluc3RhbmNlb2YgUmVtb3ZlQ2FwYWJpbGl0eVN0ZXA7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBNdWx0aVN0ZXBXaXphcmQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWd1cmVQYWdlVGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5VcGRhdGVQcm9qZWN0Q2FwYWJpbGl0eVdpemFyZF90aXRsZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE11bHRpU3RlcFdpemFyZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ3VyZVBhZ2VEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZFByb2plY3RDb25maWd1cmVQYWdlX2Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gTXVsdGlTdGVwV2l6YXJkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RmluaXNoU3RlcExhYmVsKFdpemFyZFN0ZXBbXSBzdGVwcykgewotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ZXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIShzdGVwc1tpXSBpbnN0YW5jZW9mIFJlbW92ZUNhcGFiaWxpdHlTdGVwKSkgewotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEZpbmlzaFN0ZXBMYWJlbChzdGVwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE11bHRpU3RlcFdpemFyZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGVyc3BlY3RpdmVDaG9pY2VzKCkgewotICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRDYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBpZHMgPSBhZGRDYXBhYmlsaXRpZXNbaV0uZ2V0UGVyc3BlY3RpdmVDaG9pY2VzKCk7Ci0gICAgICAgICAgICBpZiAoaWRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdCA9IGlkcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdHMuY29udGFpbnMoaWQpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSBpZHMgPSBuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXTsKLSAgICAgICAgcmVzdWx0cy50b0FycmF5KGlkcyk7Ci0gICAgICAgIHJldHVybiBpZHM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvamVjdFByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE11bHRpU3RlcFdpemFyZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmlld1BhZ2VUaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLlVwZGF0ZVByb2plY3RDYXBhYmlsaXR5V2l6YXJkX3RpdGxlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gTXVsdGlTdGVwV2l6YXJkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2aWV3UGFnZURlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkUHJvamVjdFJldmlld1BhZ2VfZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRTdGFydGluZ1BhZ2UoKSB7Ci0gICAgICAgIElXaXphcmRQYWdlIHBhZ2UgPSBzdXBlci5nZXRTdGFydGluZ1BhZ2UoKTsKLSAgICAgICAgYnVpbGRTdGVwcygpOwotICAgICAgICByZXR1cm4gcGFnZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE11bHRpU3RlcFdpemFyZC4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovYm9vbGVhbiBoYW5kbGVNaXNzaW5nU3RlcFdpemFyZChXaXphcmRTdGVwIHN0ZXApIHsKLSAgICAgICAgTWVzc2FnZURpYWxvZwotICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuVXBkYXRlUHJvamVjdENhcGFiaWxpdHlXaXphcmRfZXJyb3JUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLlVwZGF0ZVByb2plY3RDYXBhYmlsaXR5V2l6YXJkX25vV2l6YXJkLCBzdGVwLmdldExhYmVsKCkpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGltYWdlIGJhbm5lciBmb3IgdGhlIHdpemFyZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJ3aXpiYW4vbmV3cHJqX3dpei5naWYiKTsvLyROT04tTkxTLTEkCi0gICAgIAotICAgICAgICBzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjKTsKLSAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9XZWxjb21lRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvV2VsY29tZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ2OWZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9XZWxjb21lRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSkZhY2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogQSAiZmFrZSIgZWRpdG9yIHRvIHNob3cgYSB3ZWxjb21lIHBhZ2UKLSAqIFRoZSBjb250ZW50cyBvZiB0aGlzIHBhZ2UgYXJlIHN1cHBsaWVkIGluIHRoZSBwcm9kdWN0IGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBQUklWQVRFCi0gKgkJVGhpcyBjbGFzcyBpcyBpbnRlcm5hbCB0byB0aGUgd29ya2JlbmNoIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgd29ya2JlbmNoCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lRWRpdG9yIGV4dGVuZHMgRWRpdG9yUGFydCB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSE9SWl9TQ1JPTExfSU5DUkVNRU5UID0gMjA7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVkVSVF9TQ1JPTExfSU5DUkVNRU5UID0gMjA7Ci0KLSAgICAvLyB3aWR0aCBhdCB3aGljaCB3cmFwcGluZyB3aWxsIHN0b3AgYW5kIGEgaG9yaXpvbnRhbCBzY3JvbGwgYmFyIHdpbGwgYmUgCi0gICAgLy8gaW50cm9kdWNlZAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBXUkFQX01JTl9XSURUSCA9IDE1MDsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIGVkaXRvckNvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgQ3Vyc29yIGhhbmRDdXJzb3I7Ci0KLSAgICBwcml2YXRlIEN1cnNvciBidXN5Q3Vyc29yOwotCi0gICAgcHJpdmF0ZSBXZWxjb21lUGFyc2VyIHBhcnNlcjsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGh5cGVybGlua1JhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IHRleHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHJpdmF0ZSBTY3JvbGxlZENvbXBvc2l0ZSBzY3JvbGxlZENvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY29sb3JMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtb3VzZURvd24gPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBkcmFnRXZlbnQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgU3R5bGVkVGV4dCBmaXJzdFRleHQsIGxhc3RUZXh0OwotCi0gICAgcHJpdmF0ZSBTdHlsZWRUZXh0IGxhc3ROYXZpZ2F0ZWRUZXh0LCBjdXJyZW50VGV4dDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBuZXh0VGFiQWJvcnRUcmF2ZXJzYWwsIHByZXZpb3VzVGFiQWJvcnRUcmF2ZXJzYWwgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgV2VsY29tZUVkaXRvckNvcHlBY3Rpb24gY29weUFjdGlvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgd2VsY29tZSBlZGl0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgV2VsY29tZUVkaXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0UGFydE5hbWUoSURFV29ya2JlbmNoTWVzc2FnZXMuV2VsY29tZUVkaXRvcl90aXRsZSk7Ci0gICAgICAgIGNvcHlBY3Rpb24gPSBuZXcgV2VsY29tZUVkaXRvckNvcHlBY3Rpb24odGhpcyk7Ci0gICAgICAgIGNvcHlBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSB3ZWxjb21lIHBhZ2UgdG8gc3RhcnQgYXQgdGhlCi0gICAgICogYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmb2N1c09uKFN0eWxlZFRleHQgbmV3VGV4dCwgaW50IGNhcmV0T2Zmc2V0KSB7Ci0gICAgICAgIGlmIChuZXdUZXh0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIG5ld1RleHQuc2V0Rm9jdXMoKTsKLSAgICAgICAgbmV3VGV4dC5zZXRDYXJldE9mZnNldChjYXJldE9mZnNldCk7Ci0gICAgICAgIHNjcm9sbGVkQ29tcG9zaXRlLnNldE9yaWdpbigwLCBuZXdUZXh0LmdldExvY2F0aW9uKCkueSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIG5leHQgdGV4dCAKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0eWxlZFRleHQgbmV4dFRleHQoU3R5bGVkVGV4dCB0ZXh0KSB7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gKFN0eWxlZFRleHQpIHRleHRzLmdldCgwKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5kZXggPSB0ZXh0cy5pbmRleE9mKHRleHQpOwotCi0gICAgICAgIC8vSWYgd2UgYXJlIG5vdCBhdCB0aGUgZW5kLi4uLgotICAgICAgICBpZiAoaW5kZXggPCB0ZXh0cy5zaXplKCkgLSAxKQotICAgICAgICAgICAgcmV0dXJuIChTdHlsZWRUZXh0KSB0ZXh0cy5nZXQoaW5kZXggKyAxKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIChTdHlsZWRUZXh0KSB0ZXh0cy5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIHByZXZpb3VzIHRleHQgCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHlsZWRUZXh0IHByZXZpb3VzVGV4dChTdHlsZWRUZXh0IHRleHQpIHsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAoU3R5bGVkVGV4dCkgdGV4dHMuZ2V0KDApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpbmRleCA9IHRleHRzLmluZGV4T2YodGV4dCk7Ci0KLSAgICAgICAgLy9JZiB3ZSBhcmUgYXQgdGhlIGJlZ2lubmluZy4uLi4KLSAgICAgICAgaWYgKGluZGV4ID09IDApCi0gICAgICAgICAgICByZXR1cm4gKFN0eWxlZFRleHQpIHRleHRzLmdldCh0ZXh0cy5zaXplKCkgLSAxKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIChTdHlsZWRUZXh0KSB0ZXh0cy5nZXQoaW5kZXggLSAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRleHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0eWxlZFRleHQgZ2V0Q3VycmVudFRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50VGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3B5IGFjdGlvbi4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFdlbGNvbWVFZGl0b3JDb3B5QWN0aW9uIGdldENvcHlBY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBjb3B5QWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBuZXh0IGxpbmsgYWZ0ZXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgU3R5bGVSYW5nZSBmaW5kTmV4dExpbmsoU3R5bGVkVGV4dCB0ZXh0KSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBXZWxjb21lSXRlbSBpdGVtID0gKFdlbGNvbWVJdGVtKSB0ZXh0LmdldERhdGEoKTsKLSAgICAgICAgU3R5bGVSYW5nZVtdIHJhbmdlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLSAgICAgICAgaW50IGN1cnJlbnRTZWxlY3Rpb25FbmQgPSB0ZXh0LmdldFNlbGVjdGlvbigpLnk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChyYW5nZXNbaV0uc3RhcnQgPj0gY3VycmVudFNlbGVjdGlvbkVuZCkKLSAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc0xpbmtBdChyYW5nZXNbaV0uc3RhcnQpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2VzW2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBwcmV2aW91cyBsaW5rIGJlZm9yZSB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHlsZVJhbmdlIGZpbmRQcmV2aW91c0xpbmsoU3R5bGVkVGV4dCB0ZXh0KSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBXZWxjb21lSXRlbSBpdGVtID0gKFdlbGNvbWVJdGVtKSB0ZXh0LmdldERhdGEoKTsKLSAgICAgICAgU3R5bGVSYW5nZVtdIHJhbmdlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLSAgICAgICAgaW50IGN1cnJlbnRTZWxlY3Rpb25TdGFydCA9IHRleHQuZ2V0U2VsZWN0aW9uKCkueDsKLQotICAgICAgICBmb3IgKGludCBpID0gcmFuZ2VzLmxlbmd0aCAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0gICAgICAgICAgICBpZiAoKHJhbmdlc1tpXS5zdGFydCArIHJhbmdlc1tpXS5sZW5ndGgpIDwgY3VycmVudFNlbGVjdGlvblN0YXJ0KQotICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzTGlua0F0KHJhbmdlc1tpXS5zdGFydCArIHJhbmdlc1tpXS5sZW5ndGggLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlc1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyB0aGUgY3VycmVudCBsaW5rIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3R5bGVSYW5nZSBnZXRDdXJyZW50TGluayhTdHlsZWRUZXh0IHRleHQpIHsKLSAgICAgICAgU3R5bGVSYW5nZVtdIHJhbmdlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLSAgICAgICAgaW50IGN1cnJlbnRTZWxlY3Rpb25FbmQgPSB0ZXh0LmdldFNlbGVjdGlvbigpLnk7Ci0gICAgICAgIGludCBjdXJyZW50U2VsZWN0aW9uU3RhcnQgPSB0ZXh0LmdldFNlbGVjdGlvbigpLng7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoY3VycmVudFNlbGVjdGlvblN0YXJ0ID49IHJhbmdlc1tpXS5zdGFydCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKGN1cnJlbnRTZWxlY3Rpb25FbmQgPD0gKHJhbmdlc1tpXS5zdGFydCArIHJhbmdlc1tpXS5sZW5ndGgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiByYW5nZXNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBsaXN0ZW5lcnMgdG8gdGhlIGdpdmVuIHN0eWxlZCB0ZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhTdHlsZWRUZXh0IHN0eWxlZFRleHQpIHsKLSAgICAgICAgc3R5bGVkVGV4dC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuYnV0dG9uICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb3VzZURvd24gPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vdXNlRG93biA9IGZhbHNlOwotICAgICAgICAgICAgICAgIFN0eWxlZFRleHQgdGV4dCA9IChTdHlsZWRUZXh0KSBlLndpZGdldDsKLSAgICAgICAgICAgICAgICBXZWxjb21lSXRlbSBpdGVtID0gKFdlbGNvbWVJdGVtKSBlLndpZGdldC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZHJhZ0V2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyYWdFdmVudCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc0xpbmtBdChvZmZzZXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldEN1cnNvcihoYW5kQ3Vyc29yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5pc0xpbmtBdChvZmZzZXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQuc2V0Q3Vyc29yKGJ1c3lDdXJzb3IpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZS5idXR0b24gPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50cmlnZ2VyTGlua0F0KG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHlsZVJhbmdlIHNlbGVjdGlvblJhbmdlID0gZ2V0Q3VycmVudExpbmsodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblJhbmdlLnN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25SYW5nZS5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRDdXJzb3IobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHN0eWxlZFRleHQuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgY3Vyc29yIG9uIGRyYWcgZXZlbnRzCi0gICAgICAgICAgICAgICAgaWYgKG1vdXNlRG93bikgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWRyYWdFdmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkVGV4dCB0ZXh0ID0gKFN0eWxlZFRleHQpIGUud2lkZ2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRDdXJzb3IobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHJhZ0V2ZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHlsZWRUZXh0IHRleHQgPSAoU3R5bGVkVGV4dCkgZS53aWRnZXQ7Ci0gICAgICAgICAgICAgICAgV2VsY29tZUl0ZW0gaXRlbSA9IChXZWxjb21lSXRlbSkgZS53aWRnZXQuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAtMTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KGUueCwgZS55KSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxvY2F0aW9uIGlzIG5vdCBvdmVyIGEgY2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgIHRleHQuc2V0Q3Vyc29yKG51bGwpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0uaXNMaW5rQXQob2Zmc2V0KSkKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRDdXJzb3IoaGFuZEN1cnNvcik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldEN1cnNvcihudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc3R5bGVkVGV4dC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0eWxlZFRleHQgdGV4dCA9IChTdHlsZWRUZXh0KSBlLndpZGdldDsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5kZXRhaWwpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0gICAgICAgICAgICAgICAgICAgIGUuZG9pdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX1RBQl9ORVhUOgotICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgQ3RybC1UYWIKLSAgICAgICAgICAgICAgICAgICAgaWYgKChlLnN0YXRlTWFzayAmIFNXVC5DVFJMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS53aWRnZXQgPT0gbGFzdFRleHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRhYkFib3J0VHJhdmVyc2FsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VGV4dC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfVEFCX05FWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFRhYkFib3J0VHJhdmVyc2FsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0VGFiQWJvcnRUcmF2ZXJzYWwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IGxpbmsgaW4gY3VycmVudCB3aWRnZXQsIGlmIGFwcGxpY2FibGUKLSAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBhdCB0b3Agb2Ygd2lkZ2V0Ci0gICAgICAgICAgICAgICAgICAgIFN0eWxlUmFuZ2UgbmV4dExpbmsgPSBmaW5kTmV4dExpbmsodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0TGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnbyB0byB0aGUgbmV4dCB3aWRnZXQsIGZvY3VzIGF0IGJlZ2lubmluZwotICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkVGV4dCBuZXh0VGV4dCA9IG5leHRUZXh0KHRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRleHQuc2V0U2VsZWN0aW9uKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNPbihuZXh0VGV4dCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2N1c09uOiBhbGxvdyBub25lIHRhYiB0cmF2ZXJzYWxzIHRvIGFsaWduCi0gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c09uKHRleHQsIHRleHQuZ2V0U2VsZWN0aW9uKCkueCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldFNlbGVjdGlvblJhbmdlKG5leHRMaW5rLnN0YXJ0LCBuZXh0TGluay5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgIGUuZG9pdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUzoKLSAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIEN0cmwtU2hpZnQtVGFiCi0gICAgICAgICAgICAgICAgICAgIGlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUud2lkZ2V0ID09IGZpcnN0VGV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1RhYkFib3J0VHJhdmVyc2FsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRleHQudHJhdmVyc2UoU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1RhYkFib3J0VHJhdmVyc2FsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1RhYkFib3J0VHJhdmVyc2FsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgcHJldmlvdXMgbGluayBpbiBjdXJyZW50IHdpZGdldCwgaWYgYXBwbGljYWJsZQotICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGF0IHRvcCBvZiB3aWRnZXQgYWxzbwotICAgICAgICAgICAgICAgICAgICBTdHlsZVJhbmdlIHByZXZpb3VzTGluayA9IGZpbmRQcmV2aW91c0xpbmsodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0xpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQuZ2V0U2VsZWN0aW9uKCkueCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ28gdG8gdGhlIHByZXZpb3VzIHdpZGdldCwgZm9jdXMgYXQgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkVGV4dCBwcmV2aW91c1RleHQgPSBwcmV2aW91c1RleHQodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUZXh0LnNldFNlbGVjdGlvbihwcmV2aW91c1RleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGFyQ291bnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNMaW5rID0gZmluZFByZXZpb3VzTGluayhwcmV2aW91c1RleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0xpbmsgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNPbihwcmV2aW91c1RleHQsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c09uKHByZXZpb3VzVGV4dCwgcHJldmlvdXNUZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpLngpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1RleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VsZWN0aW9uUmFuZ2UocHJldmlvdXNMaW5rLnN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNMaW5rLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF5IGF0IHRvcCBvZiB0aGlzIHdpZGdldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzT24odGV4dCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2N1c09uOiBhbGxvdyBub25lIHRhYiB0cmF2ZXJzYWxzIHRvIGFsaWduCi0gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c09uKHRleHQsIHRleHQuZ2V0U2VsZWN0aW9uKCkueCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHByZXZpb3VzTGluay5zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNMaW5rLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZS5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgZS5kb2l0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzdHlsZWRUZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvL0lnbm9yZSBhIGtleSByZWxlYXNlCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHlsZWRUZXh0IHRleHQgPSAoU3R5bGVkVGV4dCkgZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgICAgIGlmIChldmVudC5jaGFyYWN0ZXIgPT0gJyAnIHx8IGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgV2VsY29tZUl0ZW0gaXRlbSA9IChXZWxjb21lSXRlbSkgdGV4dC5nZXREYXRhKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vQmUgc3VyZSB3ZSBhcmUgaW4gdGhlIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHRleHQuZ2V0U2VsZWN0aW9uKCkueCArIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzTGlua0F0KG9mZnNldCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldEN1cnNvcihidXN5Q3Vyc29yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRyaWdnZXJMaW5rQXQob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHlsZVJhbmdlIHNlbGVjdGlvblJhbmdlID0gZ2V0Q3VycmVudExpbmsodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25SYW5nZS5zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRDdXJzb3IobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFdoZW4gcGFnZSBkb3duIGlzIHByZXNzZWQsIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBpdGVtIGluIHRoZSAKLSAgICAgICAgICAgICAgICAvLyB3ZWxjb21lIHBhZ2UuICAgTm90ZSB0aGF0IHRoaXMgb3BlcmF0aW9uIHdyYXBzIChwYWdlcyB0byB0aGUgdG9wIGl0ZW0KLSAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBsYXN0IGl0ZW0gaXMgcmVhY2hlZCkuCi0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULlBBR0VfRE9XTikgewotICAgICAgICAgICAgICAgICAgICBmb2N1c09uKG5leHRUZXh0KHRleHQpLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFdoZW4gcGFnZSB1cCBpcyBwcmVzc2VkLCBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHByZXZpb3VzIGl0ZW0gaW4gdGhlIAotICAgICAgICAgICAgICAgIC8vIHdlbGNvbWUgcGFnZS4gIE5vdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiB3cmFwcyAocGFnZXMgdG8gdGhlIGJvdHRvbSBpdGVtCi0gICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgZmlyc3QgaXRlbSBpcyByZWFjaGVkKS4KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuUEFHRV9VUCkgewotICAgICAgICAgICAgICAgICAgICBmb2N1c09uKHByZXZpb3VzVGV4dCh0ZXh0KSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHN0eWxlZFRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIGN1cnJlbnQgdGV4dCB3aWRnZXQKLSAgICAgICAgICAgICAgICBsYXN0TmF2aWdhdGVkVGV4dCA9IChTdHlsZWRUZXh0KSBlLndpZGdldDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudFRleHQgPSAoU3R5bGVkVGV4dCkgZS53aWRnZXQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgaGlnaGxpZ2h0ZWQgc2VsZWN0aW9uIGlmIHRleHQgd2lkZ2V0IGhhcyBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgaWYgKChjdXJyZW50VGV4dCAhPSBsYXN0TmF2aWdhdGVkVGV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChsYXN0TmF2aWdhdGVkVGV4dCAhPSBudWxsKSkKLSAgICAgICAgICAgICAgICAgICAgbGFzdE5hdmlnYXRlZFRleHQuc2V0U2VsZWN0aW9uKGxhc3ROYXZpZ2F0ZWRUZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpLngpOwotCi0gICAgICAgICAgICAgICAgLy8gZW5hYmxlL2Rpc2FibGUgY29weSBhY3Rpb24KLSAgICAgICAgICAgICAgICBjb3B5QWN0aW9uLnNldEVuYWJsZWQoY3VycmVudFRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzdHlsZWRUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vIGVuYWJsZS9kaXNhYmxlIGNvcHkgYWN0aW9uCQkJCi0gICAgICAgICAgICAgICAgU3R5bGVkVGV4dCB0ZXh0ID0gKFN0eWxlZFRleHQpIGUud2lkZ2V0OwotICAgICAgICAgICAgICAgIGNvcHlBY3Rpb24uc2V0RW5hYmxlZCh0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgd2l6YXJkJ3MgdGl0bGUgYXJlYS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIFNXVCBwYXJlbnQgZm9yIHRoZSB0aXRsZSBhcmVhIGNvbXBvc2l0ZQotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgaW5mbyBhcmVhIGNvbXBvc2l0ZQotICAgICAqLwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUluZm9BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSB0aXRsZSBhcmVhIHdoaWNoIHdpbGwgY29udGFpbgotICAgICAgICAvLyBhIHRpdGxlLCBtZXNzYWdlLCBhbmQgaW1hZ2UuCi0gICAgICAgIHRoaXMuc2Nyb2xsZWRDb21wb3NpdGUgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuVl9TQ1JPTEwKLSAgICAgICAgICAgICAgICB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgICAgIHRoaXMuc2Nyb2xsZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBpbmZvQXJlYSA9IG5ldyBDb21wb3NpdGUodGhpcy5zY3JvbGxlZENvbXBvc2l0ZSwKLSAgICAgICAgICAgICAgICBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBpbmZvQXJlYS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBpbmZvQXJlYS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBib29sZWFuIHdyYXBwZWQgPSBwYXJzZXIuaXNGb3JtYXRXcmFwcGVkKCk7Ci0gICAgICAgIGludCBISU5ERU5UID0gMjA7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgdGl0bGUgYXJlYQotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotICAgICAgICBDb2xvciBiYWNrZ3JvdW5kID0gSkZhY2VDb2xvcnMuZ2V0QmFubmVyQmFja2dyb3VuZChkaXNwbGF5KTsKLSAgICAgICAgQ29sb3IgZm9yZWdyb3VuZCA9IEpGYWNlQ29sb3JzLmdldEJhbm5lckZvcmVncm91bmQoZGlzcGxheSk7Ci0gICAgICAgIGluZm9BcmVhLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0KLSAgICAgICAgaW50IHRleHRTdHlsZSA9IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFk7Ci0gICAgICAgIGlmICh3cmFwcGVkKSB7Ci0gICAgICAgICAgICB0ZXh0U3R5bGUgPSB0ZXh0U3R5bGUgfCBTV1QuV1JBUDsKLSAgICAgICAgfQotICAgICAgICBTdHlsZWRUZXh0IHNhbXBsZVN0eWxlZFRleHQgPSBudWxsOwotICAgICAgICAvLyBDcmVhdGUgdGhlIGludHJvIGl0ZW0KLSAgICAgICAgV2VsY29tZUl0ZW0gaXRlbSA9IGdldEludHJvSXRlbSgpOwotICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChpbmZvQXJlYSwgdGV4dFN0eWxlKTsKLSAgICAgICAgICAgIHRoaXMudGV4dHMuYWRkKHN0eWxlZFRleHQpOwotICAgICAgICAgICAgc2FtcGxlU3R5bGVkVGV4dCA9IHN0eWxlZFRleHQ7Ci0gICAgICAgICAgICBzdHlsZWRUZXh0LnNldEN1cnNvcihudWxsKTsKLSAgICAgICAgICAgIEpGYWNlQ29sb3JzLnNldENvbG9ycyhzdHlsZWRUZXh0LCBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0VGV4dChnZXRJbnRyb0l0ZW0oKS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgc2V0Qm9sZFJhbmdlcyhzdHlsZWRUZXh0LCBpdGVtLmdldEJvbGRSYW5nZXMoKSk7Ci0gICAgICAgICAgICBzZXRMaW5rUmFuZ2VzKHN0eWxlZFRleHQsIGl0ZW0uZ2V0QWN0aW9uUmFuZ2VzKCkpOwotICAgICAgICAgICAgc2V0TGlua1JhbmdlcyhzdHlsZWRUZXh0LCBpdGVtLmdldEhlbHBSYW5nZXMoKSk7Ci0gICAgICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICAgICAgZ2QuaG9yaXpvbnRhbEluZGVudCA9IEhJTkRFTlQ7Ci0gICAgICAgICAgICBnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORzsKLSAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgICAgICBzdHlsZWRUZXh0LnNldERhdGEoaXRlbSk7Ci0gICAgICAgICAgICBhZGRMaXN0ZW5lcnMoc3R5bGVkVGV4dCk7Ci0KLSAgICAgICAgICAgIExhYmVsIHNwYWNlciA9IG5ldyBMYWJlbChpbmZvQXJlYSwgU1dULk5PTkUpOwotICAgICAgICAgICAgc3BhY2VyLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0gICAgICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICAgICAgc3BhY2VyLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0VGV4dCA9IHNhbXBsZVN0eWxlZFRleHQ7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSB3ZWxjb21lIGl0ZW1zCi0gICAgICAgIExhYmVsIGltYWdlTGFiZWwgPSBudWxsOwotICAgICAgICBXZWxjb21lSXRlbVtdIGl0ZW1zID0gZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoaW5mb0FyZWEsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIGxhYmVsLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0gICAgICAgICAgICBsYWJlbAotICAgICAgICAgICAgICAgICAgICAuc2V0SW1hZ2UoUGxhdGZvcm1VSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTaGFyZWRJbWFnZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbWFnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX1dFTENPTUVfSVRFTSkpOwotICAgICAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgICAgIGdkLmhvcml6b250YWxJbmRlbnQgPSBISU5ERU5UOwotICAgICAgICAgICAgZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgICAgIGlmIChpbWFnZUxhYmVsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbWFnZUxhYmVsID0gbGFiZWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KGluZm9BcmVhLCB0ZXh0U3R5bGUpOwotICAgICAgICAgICAgdGhpcy50ZXh0cy5hZGQoc3R5bGVkVGV4dCk7Ci0gICAgICAgICAgICBzYW1wbGVTdHlsZWRUZXh0ID0gc3R5bGVkVGV4dDsKLSAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0Q3Vyc29yKG51bGwpOwotICAgICAgICAgICAgSkZhY2VDb2xvcnMuc2V0Q29sb3JzKHN0eWxlZFRleHQsIGZvcmVncm91bmQsIGJhY2tncm91bmQpOwotICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRUZXh0KGl0ZW1zW2ldLmdldFRleHQoKSk7Ci0gICAgICAgICAgICBzZXRCb2xkUmFuZ2VzKHN0eWxlZFRleHQsIGl0ZW1zW2ldLmdldEJvbGRSYW5nZXMoKSk7Ci0gICAgICAgICAgICBzZXRMaW5rUmFuZ2VzKHN0eWxlZFRleHQsIGl0ZW1zW2ldLmdldEFjdGlvblJhbmdlcygpKTsKLSAgICAgICAgICAgIHNldExpbmtSYW5nZXMoc3R5bGVkVGV4dCwgaXRlbXNbaV0uZ2V0SGVscFJhbmdlcygpKTsKLSAgICAgICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgICAgICBnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORzsKLSAgICAgICAgICAgIGdkLnZlcnRpY2FsU3BhbiA9IDI7Ci0gICAgICAgICAgICBzdHlsZWRUZXh0LnNldExheW91dERhdGEoZ2QpOwotICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXREYXRhKGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIGFkZExpc3RlbmVycyhzdHlsZWRUZXh0KTsKLQotICAgICAgICAgICAgTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKGluZm9BcmVhLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBzcGFjZXIuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgICAgICBzcGFjZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBjb250ZXh0IG1lbnUKLSAgICAgICAgICAgIE1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBtZW51TWdyLmFkZChjb3B5QWN0aW9uKTsKLSAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0TWVudShtZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KHN0eWxlZFRleHQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxhc3RUZXh0ID0gc2FtcGxlU3R5bGVkVGV4dDsKLSAgICAgICAgdGhpcy5zY3JvbGxlZENvbXBvc2l0ZS5zZXRDb250ZW50KGluZm9BcmVhKTsKLSAgICAgICAgUG9pbnQgcCA9IGluZm9BcmVhLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2Nyb2xsZWRDb21wb3NpdGUuc2V0TWluSGVpZ2h0KHAueSk7Ci0gICAgICAgIGlmICh3cmFwcGVkKSB7Ci0gICAgICAgICAgICAvLyBpbnRyb2R1Y2UgYSBob3Jpem9udGFsIHNjcm9sbCBiYXIgYWZ0ZXIgYSBtaW5pbXVtIHdpZHRoIGlzIHJlYWNoZWQKLSAgICAgICAgICAgIHRoaXMuc2Nyb2xsZWRDb21wb3NpdGUuc2V0TWluV2lkdGgoV1JBUF9NSU5fV0lEVEgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5zY3JvbGxlZENvbXBvc2l0ZS5zZXRNaW5XaWR0aChwLngpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2Nyb2xsZWRDb21wb3NpdGUuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLSAgICAgICAgdGhpcy5zY3JvbGxlZENvbXBvc2l0ZS5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQotICAgICAgICAvLyBXaGVuIHRoZSB3ZWxjb21lIGVkaXRvciBpcyByZXNpemVkLCB3ZSBuZWVkIHRvIHNldCB0aGUgd2lkdGggaGludCBmb3IKLSAgICAgICAgLy8gd3JhcHBlZCBTdHlsZWRUZXh0IHdpZGdldHMgc28gdGhhdCB0aGUgd3JhcHBlZCBoZWlnaHQgd2lsbCBiZSByZWNhbGN1bGF0ZWQuCi0gICAgICAgIGlmICh3cmFwcGVkICYmIChpbWFnZUxhYmVsICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAvLyBmaWd1cmUgb3V0IGhvdyB3aWRlIHRoZSBTdHlsZWRUZXh0IHdpZGdldHMgc2hvdWxkIGJlLCBkbyB0aGlzIGJ5IGZpcnN0Ci0gICAgICAgICAgICAvLyBjYWxjdWxhdGluZyB0aGUgd2lkdGggb2YgdGhlIGFyZWEgbm90IHVzZWQgYnkgc3R5bGVkIHRleHQgd2lkZ2V0cwotICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlTGFiZWwuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgYWRqdXN0ID0gSElOREVOVCArIGJvdW5kcy53aWR0aCArIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAobGF5b3V0Lm1hcmdpbldpZHRoICogMik7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgYWRqdXN0Rmlyc3QgPSBISU5ERU5UICsgKGxheW91dC5tYXJnaW5XaWR0aCAqIDIpOwotICAgICAgICAgICAgaW5mb0FyZWEuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB3ID0gc2Nyb2xsZWRDb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgaG9yaXpvbnRhbCBzY3JvbGwgYmFyIGV4aXN0cywgd2Ugd2FudCB0byB3cmFwIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBtaW5pbXVtIHdyYXAgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgaWYgKHcgPCBXUkFQX01JTl9XSURUSCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdyA9IFdSQVBfTUlOX1dJRFRIOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHRlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVudCA9IHcgLSBhZGp1c3RGaXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnQgPSB3IC0gYWRqdXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkVGV4dCB0ZXh0ID0gKFN0eWxlZFRleHQpIHRleHRzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50IHAgPSB0ZXh0LmNvbXB1dGVTaXplKGV4dGVudCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoR3JpZERhdGEpIHRleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBwLng7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHNjcm9sbGVkIGNvbXBvc2l0ZSBoZWlnaHQgc2luY2UgdGhlIGhlaWdodCBvZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgIC8vIHN0eWxlZCB0ZXh0IHdpZGdldHMgaGF2ZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgIFBvaW50IHAgPSBpbmZvQXJlYS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNjcm9sbGVkQ29tcG9zaXRlLnNldE1pbkhlaWdodChwLnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRqdXN0IHRoZSBzY3JvbGxiYXIgaW5jcmVtZW50cwotICAgICAgICBpZiAoc2FtcGxlU3R5bGVkVGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnNjcm9sbGVkQ29tcG9zaXRlLmdldEhvcml6b250YWxCYXIoKS5zZXRJbmNyZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIEhPUlpfU0NST0xMX0lOQ1JFTUVOVCk7Ci0gICAgICAgICAgICB0aGlzLnNjcm9sbGVkQ29tcG9zaXRlLmdldFZlcnRpY2FsQmFyKCkuc2V0SW5jcmVtZW50KAotICAgICAgICAgICAgICAgICAgICBWRVJUX1NDUk9MTF9JTkNSRU1FTlQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgR0MgZ2MgPSBuZXcgR0Moc2FtcGxlU3R5bGVkVGV4dCk7Ci0gICAgICAgICAgICBpbnQgd2lkdGggPSBnYy5nZXRGb250TWV0cmljcygpLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLSAgICAgICAgICAgIGdjLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHRoaXMuc2Nyb2xsZWRDb21wb3NpdGUuZ2V0SG9yaXpvbnRhbEJhcigpLnNldEluY3JlbWVudCh3aWR0aCk7Ci0gICAgICAgICAgICB0aGlzLnNjcm9sbGVkQ29tcG9zaXRlLmdldFZlcnRpY2FsQmFyKCkuc2V0SW5jcmVtZW50KAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVTdHlsZWRUZXh0LmdldExpbmVIZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZm9BcmVhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFNXVCBjb250cm9scyBmb3IgdGhpcyB3b3JrYmVuY2ggcGFydC4KLSAgICAgKiA8cD4KLSAgICAgKiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZCAodGhlIHdvcmtiZW5jaCBjYWxscyB0aGlzIG1ldGhvZCBhdAotICAgICAqIGFwcHJvcHJpYXRlIHRpbWVzKS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogRm9yIGltcGxlbWVudG9ycyB0aGlzIGlzIGEgbXVsdGktc3RlcCBwcm9jZXNzOgotICAgICAqIDxvbD4KLSAgICAgKiAgIDxsaT5DcmVhdGUgb25lIG9yIG1vcmUgY29udHJvbHMgd2l0aGluIHRoZSBwYXJlbnQuPC9saT4KLSAgICAgKiAgIDxsaT5TZXQgdGhlIHBhcmVudCBsYXlvdXQgYXMgbmVlZGVkLjwvbGk+Ci0gICAgICogICA8bGk+UmVnaXN0ZXIgYW55IGdsb2JhbCBhY3Rpb25zIHdpdGggdGhlIDxjb2RlPklBY3Rpb25TZXJ2aWNlPC9jb2RlPi48L2xpPgotICAgICAqICAgPGxpPlJlZ2lzdGVyIGFueSBwb3B1cCBtZW51cyB3aXRoIHRoZSA8Y29kZT5JQWN0aW9uU2VydmljZTwvY29kZT4uPC9saT4KLSAgICAgKiAgIDxsaT5SZWdpc3RlciBhIHNlbGVjdGlvbiBwcm92aWRlciB3aXRoIHRoZSA8Y29kZT5JU2VsZWN0aW9uU2VydmljZTwvY29kZT4KLSAgICAgKiAgICAgKG9wdGlvbmFsKS4gPC9saT4KLSAgICAgKiA8L29sPgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyByZWFkIG91ciBjb250ZW50cwotICAgICAgICByZWFkRmlsZSgpOwotICAgICAgICBpZiAocGFyc2VyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaGFuZEN1cnNvciA9IG5ldyBDdXJzb3IocGFyZW50LmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9IQU5EKTsKLSAgICAgICAgYnVzeUN1cnNvciA9IG5ldyBDdXJzb3IocGFyZW50LmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKTsKLQotICAgICAgICBlZGl0b3JDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLSAgICAgICAgZWRpdG9yQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgIGNyZWF0ZVRpdGxlQXJlYShlZGl0b3JDb21wb3NpdGUpOwotCi0gICAgICAgIExhYmVsIHRpdGxlQmFyU2VwYXJhdG9yID0gbmV3IExhYmVsKGVkaXRvckNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICB8IFNXVC5TRVBBUkFUT1IpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICB0aXRsZUJhclNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgICAgICBjcmVhdGVJbmZvQXJlYShlZGl0b3JDb21wb3NpdGUpOwotCi0gICAgICAgIGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQllZGl0b3JDb21wb3NpdGUsIElJREVIZWxwQ29udGV4dElkcy5XRUxDT01FX0VESVRPUik7Ci0KLSAgICAgICAgdGhpcy5jb2xvckxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKEpGYWNlUHJlZmVyZW5jZXMuSFlQRVJMSU5LX0NPTE9SKSkgewotICAgICAgICAgICAgICAgICAgICBDb2xvciBmZyA9IEpGYWNlQ29sb3JzLmdldEh5cGVybGlua1RleHQoZWRpdG9yQ29tcG9zaXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERpc3BsYXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGxpbmtzID0gaHlwZXJsaW5rUmFuZ2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChsaW5rcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlUmFuZ2UgcmFuZ2UgPSAoU3R5bGVSYW5nZSkgbGlua3MubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZm9yZWdyb3VuZCA9IGZnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIEpGYWNlUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICB0aGlzLmNvbG9yTGlzdGVuZXIpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgd2l6YXJkJ3MgdGl0bGUgYXJlYS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIFNXVCBwYXJlbnQgZm9yIHRoZSB0aXRsZSBhcmVhIGNvbXBvc2l0ZQotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgdGl0bGUgYXJlYSBjb21wb3NpdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVUaXRsZUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBHZXQgdGhlIGJhY2tncm91bmQgY29sb3IgZm9yIHRoZSB0aXRsZSBhcmVhCi0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0gICAgICAgIENvbG9yIGJhY2tncm91bmQgPSBKRmFjZUNvbG9ycy5nZXRCYW5uZXJCYWNrZ3JvdW5kKGRpc3BsYXkpOwotICAgICAgICBDb2xvciBmb3JlZ3JvdW5kID0gSkZhY2VDb2xvcnMuZ2V0QmFubmVyRm9yZWdyb3VuZChkaXNwbGF5KTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIHRpdGxlIGFyZWEgd2hpY2ggd2lsbCBjb250YWluCi0gICAgICAgIC8vIGEgdGl0bGUsIG1lc3NhZ2UsIGFuZCBpbWFnZS4KLSAgICAgICAgQ29tcG9zaXRlIHRpdGxlQXJlYSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSB8IFNXVC5OT19GT0NVUyk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgICAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIHRpdGxlQXJlYS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgdGl0bGVBcmVhLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICB0aXRsZUFyZWEuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLQotICAgICAgICAvLyBNZXNzYWdlIGxhYmVsCi0gICAgICAgIGZpbmFsIENMYWJlbCBtZXNzYWdlTGFiZWwgPSBuZXcgQ0xhYmVsKHRpdGxlQXJlYSwgU1dULkxFRlQpIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgc2hvcnRlblRleHQoR0MgZ2MsIFN0cmluZyB0ZXh0LCBpbnQgd2lkdGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2MudGV4dEV4dGVudCh0ZXh0LCBTV1QuRFJBV19NTkVNT05JQykueCA8PSB3aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVsbGlwc2lzID0gIi4uLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpbnQgZWxsaXBzZVdpZHRoID0gZ2MudGV4dEV4dGVudChlbGxpcHNpcywgU1dULkRSQVdfTU5FTU9OSUMpLng7Ci0gICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgaW50IGVuZCA9IGxlbmd0aCAtIDE7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGVuZCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsMSA9IGdjLnRleHRFeHRlbnQodGV4dCwgU1dULkRSQVdfTU5FTU9OSUMpLng7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsMSArIGVsbGlwc2VXaWR0aCA8PSB3aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQgKyBlbGxpcHNpczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbmQtLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRleHQgKyBlbGxpcHNpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgSkZhY2VDb2xvcnMuc2V0Q29sb3JzKG1lc3NhZ2VMYWJlbCwgZm9yZWdyb3VuZCwgYmFja2dyb3VuZCk7Ci0gICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KGdldEJhbm5lclRpdGxlKCkpOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRIZWFkZXJGb250KCkpOwotCi0gICAgICAgIGZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZvbnRMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoSkZhY2VSZXNvdXJjZXMuSEVBREVSX0ZPTlQuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEhlYWRlckZvbnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIG1lc3NhZ2VMYWJlbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLnJlbW92ZUxpc3RlbmVyKGZvbnRMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmFkZExpc3RlbmVyKGZvbnRMaXN0ZW5lcik7Ci0KLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICAgIC8vIFRpdGxlIGltYWdlCi0gICAgICAgIExhYmVsIHRpdGxlSW1hZ2UgPSBuZXcgTGFiZWwodGl0bGVBcmVhLCBTV1QuTEVGVCk7Ci0gICAgICAgIHRpdGxlSW1hZ2Uuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLSAgICAgICAgdGl0bGVJbWFnZS5zZXRJbWFnZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpCi0gICAgICAgICAgICAgICAgLmdldEltYWdlKElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX1dFTENPTUVfQkFOTkVSKSk7Ci0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5FTkQ7Ci0gICAgICAgIHRpdGxlSW1hZ2Uuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAgICAgcmV0dXJuIHRpdGxlQXJlYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+V29ya2JlbmNoUGFydDwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5JV29ya2JlbmNoUGFydDwvY29kZT4gbWV0aG9kIGRpc3Bvc2VzIHRoZSB0aXRsZSBpbWFnZQotICAgICAqIGxvYWRlZCBieSA8Y29kZT5zZXRJbml0aWFsaXphdGlvbkRhdGE8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICBpZiAoYnVzeUN1cnNvciAhPSBudWxsKQotICAgICAgICAgICAgYnVzeUN1cnNvci5kaXNwb3NlKCk7Ci0gICAgICAgIGlmIChoYW5kQ3Vyc29yICE9IG51bGwpCi0gICAgICAgICAgICBoYW5kQ3Vyc29yLmRpc3Bvc2UoKTsKLSAgICAgICAgaWYgKHRoaXMuY29sb3JMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBKRmFjZVByZWZlcmVuY2VzLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sb3JMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWRpdG9yLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIG9wZW4tc2F2ZS1jbG9zZSBsaWZlY3ljbGUKLSAgICAgKiBmb3IgYW4gZWRpdG9yLiAgRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlIDxjb2RlPklFZGl0b3JQYXJ0PC9jb2RlPgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgSUVkaXRvclBhcnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWRpdG9yIHRvIGFub3RoZXIgb2JqZWN0LgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIG9wZW4tc2F2ZS1jbG9zZSBsaWZlY3ljbGUKLSAgICAgKiBmb3IgYW4gZWRpdG9yLiAgRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlIDxjb2RlPklFZGl0b3JQYXJ0PC9jb2RlPgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgSUVkaXRvclBhcnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwkKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aXRsZSBvYnRhaW5lZCBmcm9tIHRoZSBwYXJzZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRCYW5uZXJUaXRsZSgpIHsKLSAgICAgICAgaWYgKHBhcnNlci5nZXRUaXRsZSgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHBhcnNlci5nZXRUaXRsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludHJvIGl0ZW0gb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIFdlbGNvbWVJdGVtIGdldEludHJvSXRlbSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcnNlci5nZXRJbnRyb0l0ZW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3ZWxjb21lIGl0ZW1zCi0gICAgICovCi0gICAgcHJpdmF0ZSBXZWxjb21lSXRlbVtdIGdldEl0ZW1zKCkgewotICAgICAgICByZXR1cm4gcGFyc2VyLmdldEl0ZW1zKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIFNldHMgdGhlIGN1cnNvciBhbmQgc2VsZWN0aW9uIHN0YXRlIGZvciB0aGlzIGVkaXRvciB0byB0aGUgcGFzc2FnZSBkZWZpbmVkCi0gICAgICogYnkgdGhlIGdpdmVuIG1hcmtlci4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4gIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT5JRWRpdG9yUGFydDwvY29kZT4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIElFZGl0b3JQYXJ0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgcGFydCB3aXRoIGEgc2l0ZSBhbmQgaW5wdXQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBvZiA8Y29kZT5FZGl0b3JQYXJ0PC9jb2RlPiBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZC4gIFdpdGhpbgotICAgICAqIHRoZSBpbXBsZW1lbnRhdGlvbiBzdWJjbGFzc2VzIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGUgaW5wdXQgdHlwZSBpcyBhY2NlcHRhYmxlCi0gICAgICogYW5kIHRoZW4gc2F2ZSB0aGUgc2l0ZSBhbmQgaW5wdXQuICBIZXJlIGlzIHNhbXBsZSBjb2RlOgotICAgICAqIDwvcD4KLSAgICAgKiA8cHJlPgotICAgICAqCQlpZiAoIShpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpKQotICAgICAqCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKCJJbnZhbGlkIElucHV0OiBNdXN0IGJlIElGaWxlRWRpdG9ySW5wdXQiKTsKLSAgICAgKgkJc2V0U2l0ZShzaXRlKTsKLSAgICAgKgkJc2V0SW5wdXQoZWRpdG9ySW5wdXQpOwotICAgICAqIDwvcHJlPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotICAgICAgICAgICAgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBXZWxjb21lRWRpdG9ySW5wdXQpKQotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBJbnB1dDogTXVzdCBiZSBXZWxjb21lRWRpdG9ySW5wdXQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRTaXRlKHNpdGUpOwotICAgICAgICBzZXRJbnB1dChpbnB1dCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY29udGVudHMgb2YgdGhpcyBlZGl0b3IgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHNhdmUKLSAgICAgKiBvcGVyYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZQotICAgICAqIGZvciBhbiBlZGl0b3IuICBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+SUVkaXRvclBhcnQ8L2NvZGU+Ci0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBJRWRpdG9yUGFydAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSAic2F2ZSBhcyIgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGlzIGVkaXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wbGVtZW50IHRoZSBvcGVuLXNhdmUtY2xvc2UgbGlmZWN5Y2xlCi0gICAgICogZm9yIGFuIGVkaXRvci4gIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT5JRWRpdG9yUGFydDwvY29kZT4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIElFZGl0b3JQYXJ0Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHdlbGNvbWUgcGFnZQotICAgICAqIAotICAgICAqIEBwYXJhbSBpcyB0aGUgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IHRvIHBhcnNlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWQoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJzZXIgPSBuZXcgV2VsY29tZVBhcnNlcigpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotICAgICAgICB9Ci0gICAgICAgIHBhcnNlci5wYXJzZShpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIHdlbGNvbWUgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWRGaWxlKCkgewotICAgICAgICBVUkwgdXJsID0gKChXZWxjb21lRWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCkpLmdldEFib3V0SW5mbygpCi0gICAgICAgICAgICAgICAgLmdldFdlbGNvbWVQYWdlVVJMKCk7Ci0KLSAgICAgICAgaWYgKHVybCA9PSBudWxsKQotICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4gCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMgPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgcmVhZChpcyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIElTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwgMSwgSURFV29ya2JlbmNoTWVzc2FnZXMuV2VsY29tZUVkaXRvcl9hY2Nlc3NFeGNlcHRpb24sIGUpOwotICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmxvZyhJREVXb3JrYmVuY2hNZXNzYWdlcy5XZWxjb21lRWRpdG9yX3JlYWRGaWxlRXJyb3IsIHN0YXR1cyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3R5bGVkIHRleHQncyBib2xkIHJhbmdlcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRCb2xkUmFuZ2VzKFN0eWxlZFRleHQgc3R5bGVkVGV4dCwgaW50W11bXSBib2xkUmFuZ2VzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYm9sZFJhbmdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3R5bGVSYW5nZSByID0gbmV3IFN0eWxlUmFuZ2UoYm9sZFJhbmdlc1tpXVswXSwgYm9sZFJhbmdlc1tpXVsxXSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgU1dULkJPTEQpOwotICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNrcyB0aGlzIHBhcnQgdG8gdGFrZSBmb2N1cyB3aXRoaW4gdGhlIHdvcmtiZW5jaC4KLSAgICAgKiA8cD4KLSAgICAgKiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZCAodGhlIHdvcmtiZW5jaCBjYWxscyB0aGlzIG1ldGhvZCBhdAotICAgICAqIGFwcHJvcHJpYXRlIHRpbWVzKS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIGlmICgoZWRpdG9yQ29tcG9zaXRlICE9IG51bGwpICYmIChsYXN0TmF2aWdhdGVkVGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICYmIChjdXJyZW50VGV4dCA9PSBudWxsKSkKLSAgICAgICAgICAgIGVkaXRvckNvbXBvc2l0ZS5zZXRGb2N1cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN0eWxlZCB0ZXh0J3MgbGluayAoYmx1ZSkgcmFuZ2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldExpbmtSYW5nZXMoU3R5bGVkVGV4dCBzdHlsZWRUZXh0LCBpbnRbXVtdIGxpbmtSYW5nZXMpIHsKLSAgICAgICAgLy9Db2xvciBmZyA9IHN0eWxlZFRleHQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLSAgICAgICAgQ29sb3IgZmcgPSBKRmFjZUNvbG9ycy5nZXRIeXBlcmxpbmtUZXh0KHN0eWxlZFRleHQuZ2V0U2hlbGwoKQotICAgICAgICAgICAgICAgIC5nZXREaXNwbGF5KCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtSYW5nZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0eWxlUmFuZ2UgciA9IG5ldyBTdHlsZVJhbmdlKGxpbmtSYW5nZXNbaV1bMF0sIGxpbmtSYW5nZXNbaV1bMV0sCi0gICAgICAgICAgICAgICAgICAgIGZnLCBudWxsKTsKLSAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShyKTsKLSAgICAgICAgICAgIGh5cGVybGlua1Jhbmdlcy5hZGQocik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9XZWxjb21lRWRpdG9yQWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9XZWxjb21lRWRpdG9yQWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzN2M1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvV2VsY29tZUVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGluc3RhbGxhdGlvbiBhbmQgZGVpbnN0YWxsYXRpb24gb2YgZ2xvYmFsIGFjdGlvbnMgZm9yIAotICogdGhlIHdlbGNvbWUgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZUVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuZHMgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5XZWxjb21lRWRpdG9yQWN0aW9uQ29udHJpYnV0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+SUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yPC9jb2RlPiBtZXRob2QgaW5zdGFsbHMgdGhlIGdsb2JhbCAKLSAgICAgKiBhY3Rpb24gaGFuZGxlciBmb3IgdGhlIGdpdmVuIGVkaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgewotICAgICAgICBJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0QWN0aW9uQmFycygpOwotICAgICAgICBpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICgoV2VsY29tZUVkaXRvcikgcGFydCkuZ2V0Q29weUFjdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9XZWxjb21lRWRpdG9yQ29weUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1dlbGNvbWVFZGl0b3JDb3B5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODRmMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1dlbGNvbWVFZGl0b3JDb3B5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotCi0vKioKLSAqIEdsb2JhbCBjb3B5IGFjdGlvbiBmb3IgdGhlIHdlbGNvbWUgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZUVkaXRvckNvcHlBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotICAgIHByaXZhdGUgV2VsY29tZUVkaXRvciBlZGl0b3JQYXJ0OwotCi0gICAgcHVibGljIFdlbGNvbWVFZGl0b3JDb3B5QWN0aW9uKFdlbGNvbWVFZGl0b3IgZWRpdG9yKSB7Ci0gICAgICAgIGVkaXRvclBhcnQgPSBlZGl0b3I7Ci0gICAgICAgIHNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV2VsY29tZUVkaXRvcl9jb3B5X3RleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgZWRpdG9yUGFydC5nZXRDdXJyZW50VGV4dCgpLmNvcHkoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvV2VsY29tZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvV2VsY29tZUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDE1ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1dlbGNvbWVFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLkFib3V0SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci0KLS8qKgotICogQSBzaW1wbGUgZWRpdG9yIGlucHV0IGZvciB0aGUgd2VsY29tZSBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCB7Ci0gICAgcHJpdmF0ZSBBYm91dEluZm8gYWJvdXRJbmZvOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZBQ1RPUllfSUQgPSAib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5XZWxjb21lRWRpdG9ySW5wdXRGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkVBVFVSRV9JRCA9ICJmZWF0dXJlSWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBXZWxjb21lRWRpdG9ySW5wdXQgY29uc3RydWN0b3IgY29tbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgV2VsY29tZUVkaXRvcklucHV0KEFib3V0SW5mbyBpbmZvKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBhYm91dEluZm8gPSBpbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5XZWxjb21lRWRpdG9yX3RpdGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotICAgICAgICByZXR1cm4gbmV3IElQZXJzaXN0YWJsZUVsZW1lbnQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlJZCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFDVE9SWV9JRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgICAgICAgICBtZW1lbnRvLnB1dFN0cmluZyhGRUFUVVJFX0lELCBhYm91dEluZm8uZ2V0RmVhdHVyZUlkKCkgKyAnOicKLSAgICAgICAgICAgICAgICAgICAgICAgICsgYWJvdXRJbmZvLmdldFZlcnNpb25JZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWJvdXRJbmZvIGdldEFib3V0SW5mbygpIHsKLSAgICAgICAgcmV0dXJuIGFib3V0SW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKChvICE9IG51bGwpICYmIChvIGluc3RhbmNlb2YgV2VsY29tZUVkaXRvcklucHV0KSkgewotICAgICAgICAgICAgaWYgKCgoV2VsY29tZUVkaXRvcklucHV0KSBvKS5hYm91dEluZm8uZ2V0RmVhdHVyZUlkKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBhYm91dEluZm8uZ2V0RmVhdHVyZUlkKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotICAgICAgICByZXR1cm4gTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuV2VsY29tZUVkaXRvcl90b29sVGlwLCBhYm91dEluZm8uZ2V0RmVhdHVyZUxhYmVsKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9XZWxjb21lRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvV2VsY29tZUVkaXRvcklucHV0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWEyN2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9XZWxjb21lRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLkFib3V0SW5mbzsKLQotLyoqCi0gKiBBIHNpbXBsZSBmYWN0b3J5IGZvciB0aGUgd2VsY29tZSBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVFZGl0b3JJbnB1dEZhY3RvcnkgaW1wbGVtZW50cyBJRWxlbWVudEZhY3RvcnkgewotICAgIC8qKgotICAgICAqIFdlbGNvbWVFZGl0b3JJbnB1dEZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgV2VsY29tZUVkaXRvcklucHV0RmFjdG9yeSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZS1jcmVhdGVzIGFuZCByZXR1cm5zIGFuIG9iamVjdCBmcm9tIHRoZSBzdGF0ZSBjYXB0dXJlZCB3aXRoaW4gdGhlIGdpdmVuIAotICAgICAqIG1lbWVudG8uIAotICAgICAqIDxwPgotICAgICAqIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCB0aGUgcmVzdWx0aW5nIG9iamVjdCBjYW4gYmUgZXhwZWN0ZWQgdG8gYmUKLSAgICAgKiBwZXJzaXN0YWJsZTsgdGhhdCBpcywKLSAgICAgKiA8cHJlPgotICAgICAqIHJlc3VsdC5nZXRBZGFwdGVyKG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQuY2xhc3MpCi0gICAgICogPC9wcmU+Ci0gICAgICogc2hvdWxkIG5vdCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWVudG8gYSBtZW1lbnRvIGNvbnRhaW5pbmcgdGhlIHN0YXRlIGZvciB0aGUgb2JqZWN0Ci0gICAgICogQHJldHVybiBhbiBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGNvdWxkIG5vdCBiZSBjcmVhdGVkCi0gICAgICovCi0gICAgcHVibGljIElBZGFwdGFibGUgY3JlYXRlRWxlbWVudChJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIC8vIEdldCB0aGUgZmVhdHVyZSBpZC4KLSAgICAgICAgU3RyaW5nIHZlcnNpb25lZEZlYXR1cmVJZCA9IG1lbWVudG8KLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKFdlbGNvbWVFZGl0b3JJbnB1dC5GRUFUVVJFX0lEKTsKLSAgICAgICAgaWYgKHZlcnNpb25lZEZlYXR1cmVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpbnQgY29sb25Qb3MgPSB2ZXJzaW9uZWRGZWF0dXJlSWQuaW5kZXhPZignOicpOwotICAgICAgICBpZiAoY29sb25Qb3MgPT0gLTEpIHsKLSAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgbWVtZW50byBpcyBzdGFsZSBvciBtYW5nbGVkCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgZmVhdHVyZUlkID0gdmVyc2lvbmVkRmVhdHVyZUlkLnN1YnN0cmluZygwLCBjb2xvblBvcyk7Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uSWQgPSB2ZXJzaW9uZWRGZWF0dXJlSWQuc3Vic3RyaW5nKGNvbG9uUG9zICsgMSk7Ci0gICAgICAgIC8vIEBpc3N1ZSB1c2luZyBmZWF0dXJlIGlkIGZvciBwbHVnLWluIGlkCi0gICAgICAgIEFib3V0SW5mbyBpbmZvID0gQWJvdXRJbmZvLnJlYWRGZWF0dXJlSW5mbyhmZWF0dXJlSWQsIHZlcnNpb25JZCk7Ci0gICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgV2VsY29tZUVkaXRvcklucHV0KGluZm8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9XZWxjb21lSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1dlbGNvbWVJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OTU4MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1dlbGNvbWVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBIb2xkcyB0aGUgaW5mb3JtYXRpb24gZm9yIGFuIGl0ZW0gYXBwZWFyaW5nIGluIHRoZSB3ZWxjb21lIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZUl0ZW0gewotICAgIHByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLSAgICBwcml2YXRlIGludFtdW10gYm9sZFJhbmdlczsKLQotICAgIHByaXZhdGUgaW50W11bXSBoZWxwUmFuZ2VzOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBoZWxwSWRzOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBoZWxwSHJlZnM7Ci0KLSAgICBwcml2YXRlIGludFtdW10gYWN0aW9uUmFuZ2VzOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBhY3Rpb25QbHVnaW5JZHM7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGFjdGlvbkNsYXNzZXM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHdlbGNvbWUgaXRlbQotICAgICAqLwotICAgIHB1YmxpYyBXZWxjb21lSXRlbShTdHJpbmcgdGV4dCwgaW50W11bXSBib2xkUmFuZ2VzLCBpbnRbXVtdIGFjdGlvblJhbmdlcywKLSAgICAgICAgICAgIFN0cmluZ1tdIGFjdGlvblBsdWdpbklkcywgU3RyaW5nW10gYWN0aW9uQ2xhc3NlcywKLSAgICAgICAgICAgIGludFtdW10gaGVscFJhbmdlcywgU3RyaW5nW10gaGVscElkcywgU3RyaW5nW10gaGVscEhyZWZzKSB7Ci0KLSAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKLSAgICAgICAgdGhpcy5ib2xkUmFuZ2VzID0gYm9sZFJhbmdlczsKLSAgICAgICAgdGhpcy5hY3Rpb25SYW5nZXMgPSBhY3Rpb25SYW5nZXM7Ci0gICAgICAgIHRoaXMuYWN0aW9uUGx1Z2luSWRzID0gYWN0aW9uUGx1Z2luSWRzOwotICAgICAgICB0aGlzLmFjdGlvbkNsYXNzZXMgPSBhY3Rpb25DbGFzc2VzOwotICAgICAgICB0aGlzLmhlbHBSYW5nZXMgPSBoZWxwUmFuZ2VzOwotICAgICAgICB0aGlzLmhlbHBJZHMgPSBoZWxwSWRzOwotICAgICAgICB0aGlzLmhlbHBIcmVmcyA9IGhlbHBIcmVmczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3Rpb24gcmFuZ2VzIChjaGFyYWN0ZXIgbG9jYXRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBpbnRbXVtdIGdldEFjdGlvblJhbmdlcygpIHsKLSAgICAgICAgcmV0dXJuIGFjdGlvblJhbmdlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBib2xkIHJhbmdlcyAoY2hhcmFjdGVyIGxvY2F0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50W11bXSBnZXRCb2xkUmFuZ2VzKCkgewotICAgICAgICByZXR1cm4gYm9sZFJhbmdlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoZWxwIHJhbmdlcyAoY2hhcmFjdGVyIGxvY2F0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50W11bXSBnZXRIZWxwUmFuZ2VzKCkgewotICAgICAgICByZXR1cm4gaGVscFJhbmdlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHRvIGRpc3BsYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpcyBhIGxpbmsgKGFjdGlvbiBvciBoZWxwKSBpcyBwcmVzZW50IGF0IHRoZSBnaXZlbiBjaGFyYWN0ZXIgbG9jYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpbmtBdChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgbGluayBhdCB0aGUgb2Zmc2V0Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVscFJhbmdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBoZWxwUmFuZ2VzW2ldWzBdCi0gICAgICAgICAgICAgICAgICAgICYmIG9mZnNldCA8IGhlbHBSYW5nZXNbaV1bMF0gKyBoZWxwUmFuZ2VzW2ldWzFdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBhY3Rpb24gbGluayBhdCB0aGUgb2Zmc2V0Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9uUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID49IGFjdGlvblJhbmdlc1tpXVswXQotICAgICAgICAgICAgICAgICAgICAmJiBvZmZzZXQgPCBhY3Rpb25SYW5nZXNbaV1bMF0gKyBhY3Rpb25SYW5nZXNbaV1bMV0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhIGVycm9yIHRvIHRoZSB3b3JrYmVuY2ggbG9nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9nQWN0aW9uTGlua0Vycm9yKFN0cmluZyBhY3Rpb25QbHVnaW5JZCwgU3RyaW5nIGFjdGlvbkNsYXNzKSB7Ci0gICAgICAgIElERVdvcmtiZW5jaFBsdWdpbgotICAgICAgICAgICAgICAgIC5sb2coSURFV29ya2JlbmNoTWVzc2FnZXMuV2VsY29tZUl0ZW1fdW5hYmxlVG9Mb2FkQ2xhc3MgKyBhY3Rpb25QbHVnaW5JZCArICIgIiArIGFjdGlvbkNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW4gYSBoZWxwIHRvcGljCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5IZWxwVG9waWMoU3RyaW5nIHRvcGljLCBTdHJpbmcgaHJlZikgewotICAgICAgICBpZiAoaHJlZiAhPSBudWxsKQotICAgICAgICAJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuZGlzcGxheUhlbHBSZXNvdXJjZShocmVmKTsKLSAgICAgICAgZWxzZQotICAgICAgICAJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuZGlzcGxheUhlbHBSZXNvdXJjZSh0b3BpYyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVuIGFuIGFjdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBydW5BY3Rpb24oU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgCUJ1bmRsZSBwbHVnaW5CdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotICAgICAgICBpZiAocGx1Z2luQnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZ0FjdGlvbkxpbmtFcnJvcihwbHVnaW5JZCwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBDbGFzcyBhY3Rpb25DbGFzczsKLSAgICAgICAgSUFjdGlvbiBhY3Rpb247Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIAlhY3Rpb25DbGFzcyA9IHBsdWdpbkJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2dBY3Rpb25MaW5rRXJyb3IocGx1Z2luSWQsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFjdGlvbiA9IChJQWN0aW9uKSBhY3Rpb25DbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZ0FjdGlvbkxpbmtFcnJvcihwbHVnaW5JZCwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2dBY3Rpb25MaW5rRXJyb3IocGx1Z2luSWQsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2dBY3Rpb25MaW5rRXJyb3IocGx1Z2luSWQsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWdnZXJzIHRoZSBsaW5rIGF0IHRoZSBnaXZlbiBvZmZzZXQgKGlmIHRoZXJlIGlzIG9uZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0cmlnZ2VyTGlua0F0KGludCBvZmZzZXQpIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBoZWxwIGxpbmsgYXQgdGhlIG9mZnNldAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlbHBSYW5nZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gaGVscFJhbmdlc1tpXVswXQotICAgICAgICAgICAgICAgICAgICAmJiBvZmZzZXQgPCBoZWxwUmFuZ2VzW2ldWzBdICsgaGVscFJhbmdlc1tpXVsxXSkgewotICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIGxpbmsKLSAgICAgICAgICAgICAgICBvcGVuSGVscFRvcGljKGhlbHBJZHNbaV0sIGhlbHBIcmVmc1tpXSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW4gYWN0aW9uIGxpbmsgYXQgdGhlIG9mZnNldAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvblJhbmdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBhY3Rpb25SYW5nZXNbaV1bMF0KLSAgICAgICAgICAgICAgICAgICAgJiYgb2Zmc2V0IDwgYWN0aW9uUmFuZ2VzW2ldWzBdICsgYWN0aW9uUmFuZ2VzW2ldWzFdKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB0aGUgbGluawotICAgICAgICAgICAgICAgIHJ1bkFjdGlvbihhY3Rpb25QbHVnaW5JZHNbaV0sIGFjdGlvbkNsYXNzZXNbaV0pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9XZWxjb21lUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvV2VsY29tZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM2YzNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvZGlhbG9ncy9XZWxjb21lUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIEEgcGFyc2VyIGZvciB0aGUgdGhlIHdlbGNvbWUgcGFnZQotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZVBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1dFTENPTUVfUEFHRSA9ICJ3ZWxjb21lUGFnZSI7IC8vJE5PTi1OTFMtMSQJCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lOVFJPID0gImludHJvIjsgLy8kTk9OLU5MUy0xJAkKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSVRFTSA9ICJpdGVtIjsgLy8kTk9OLU5MUy0xJAkKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQk9MRCA9ICJiIjsgLy8kTk9OLU5MUy0xJAkKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQUNUSU9OID0gImFjdGlvbiI7IC8vJE5PTi1OTFMtMSQJCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BBUkFHUkFQSCA9ICJwIjsgLy8kTk9OLU5MUy0xJAkKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVE9QSUMgPSAidG9waWMiOyAvLyROT04tTkxTLTEkCQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9USVRMRSA9ICJ0aXRsZSI7IC8vJE5PTi1OTFMtMSQJCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0ZPUk1BVCA9ICJmb3JtYXQiOyAvLyROT04tTkxTLTEkCQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QTFVHSU5fSUQgPSAicGx1Z2luSWQiOyAvLyROT04tTkxTLTEkCQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQJCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9IUkVGID0gImhyZWYiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1dSQVAgPSAid3JhcCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgREVMSU1JVEVSID0gJ1xuJzsgLy8gc2F4IHBhcnNlciByZXBsYWNlcyBjcmxmIHdpdGggbGYKLQotICAgIHByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsKLQotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0gICAgcHJpdmF0ZSBXZWxjb21lSXRlbSBpbnRyb0l0ZW07Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGZvcm1hdDsKLQotICAgIHByaXZhdGUgY2xhc3MgV2VsY29tZUNvbnRlbnRIYW5kbGVyIGltcGxlbWVudHMgQ29udGVudEhhbmRsZXIgewotICAgICAgICBwcm90ZWN0ZWQgQ29udGVudEhhbmRsZXIgcGFyZW50OwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChDb250ZW50SGFuZGxlciBwKSB7Ci0gICAgICAgICAgICBwYXJlbnQgPSBwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2tpcHBlZEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgV2VsY29tZVBhZ2VIYW5kbGVyIGV4dGVuZHMgV2VsY29tZUNvbnRlbnRIYW5kbGVyIHsKLSAgICAgICAgcHVibGljIFdlbGNvbWVQYWdlSGFuZGxlcihTdHJpbmcgbmV3VGl0bGUpIHsKLSAgICAgICAgICAgIHRpdGxlID0gbmV3VGl0bGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfSU5UUk8pKSB7Ci0gICAgICAgICAgICAgICAgSXRlbUhhbmRsZXIgaCA9IG5ldyBJbnRyb0l0ZW1IYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgaC5zZXRQYXJlbnQoV2VsY29tZVBhZ2VIYW5kbGVyLnRoaXMpOwotICAgICAgICAgICAgICAgIHBhcnNlci5nZXRYTUxSZWFkZXIoKS5zZXRDb250ZW50SGFuZGxlcihoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfSVRFTSkpIHsKLSAgICAgICAgICAgICAgICBJdGVtSGFuZGxlciBoID0gbmV3IEl0ZW1IYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgaC5zZXRQYXJlbnQoV2VsY29tZVBhZ2VIYW5kbGVyLnRoaXMpOwotICAgICAgICAgICAgICAgIHBhcnNlci5nZXRYTUxSZWFkZXIoKS5zZXRDb250ZW50SGFuZGxlcihoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgSXRlbUhhbmRsZXIgZXh0ZW5kcyBXZWxjb21lQ29udGVudEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIEFycmF5TGlzdCBib2xkUmFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIHByb3RlY3RlZCBBcnJheUxpc3Qgd3JhcFJhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBwcml2YXRlIEFycmF5TGlzdCBhY3Rpb25SYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgcGx1Z2luSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgaGVscFJhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBwcml2YXRlIEFycmF5TGlzdCBoZWxwSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IGhlbHBIcmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgb2Zmc2V0ID0gMDsKLQotICAgICAgICBwcm90ZWN0ZWQgaW50IHRleHRTdGFydDsKLQotICAgICAgICBwcm90ZWN0ZWQgaW50IHdyYXBTdGFydDsKLQotICAgICAgICBwcml2YXRlIGNsYXNzIEJvbGRIYW5kbGVyIGV4dGVuZHMgV2VsY29tZUNvbnRlbnRIYW5kbGVyIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIEl0ZW1IYW5kbGVyLnRoaXMuY2hhcmFjdGVycyhjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfQk9MRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9sZFJhbmdlcy5hZGQobmV3IGludFtdIHsgdGV4dFN0YXJ0LCBvZmZzZXQgLSB0ZXh0U3RhcnQgfSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRYTUxSZWFkZXIoKS5zZXRDb250ZW50SGFuZGxlcihwYXJlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2xhc3MgQWN0aW9uSGFuZGxlciBleHRlbmRzIFdlbGNvbWVDb250ZW50SGFuZGxlciB7Ci0gICAgICAgICAgICBwdWJsaWMgQWN0aW9uSGFuZGxlcihTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgICAgICAgICBwbHVnaW5JZHMuYWRkKHBsdWdpbklkKTsKLSAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBJdGVtSGFuZGxlci50aGlzLmNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0FDVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmFuZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgaW50W10geyB0ZXh0U3RhcnQsIG9mZnNldCAtIHRleHRTdGFydCB9KTsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldFhNTFJlYWRlcigpLnNldENvbnRlbnRIYW5kbGVyKHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBUb3BpY0hhbmRsZXIgZXh0ZW5kcyBXZWxjb21lQ29udGVudEhhbmRsZXIgewotICAgICAgICAgICAgcHVibGljIFRvcGljSGFuZGxlcihTdHJpbmcgaGVscElkLCBTdHJpbmcgaHJlZikgewotICAgICAgICAgICAgICAgIGhlbHBJZHMuYWRkKGhlbHBJZCk7Ci0gICAgICAgICAgICAgICAgaGVscEhyZWZzLmFkZChocmVmKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgSXRlbUhhbmRsZXIudGhpcy5jaGFyYWN0ZXJzKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19UT1BJQykpIHsKLSAgICAgICAgICAgICAgICAgICAgaGVscFJhbmdlcy5hZGQobmV3IGludFtdIHsgdGV4dFN0YXJ0LCBvZmZzZXQgLSB0ZXh0U3RhcnQgfSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRYTUxSZWFkZXIoKS5zZXRDb250ZW50SGFuZGxlcihwYXJlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBXZWxjb21lSXRlbSBjb25zdHJ1Y3RXZWxjb21lSXRlbSgpIHsKLSAgICAgICAgICAgIGlmIChpc0Zvcm1hdFdyYXBwZWQoKSkgewotICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgYWxsIGxpbmUgZGVsaW1pdGVycyB3aXRoIGEgc3BhY2UKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyYXBSYW5nZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50W10gcmFuZ2UgPSAoaW50W10pIHdyYXBSYW5nZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSByYW5nZVswXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IHJhbmdlWzFdOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gc3RhcnQ7IGogPCBzdGFydCArIGxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gdGV4dC5jaGFyQXQoaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gREVMSU1JVEVSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5yZXBsYWNlKGosIGogKyAxLCAiICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFdlbGNvbWVJdGVtKAotICAgICAgICAgICAgICAgICAgICB0ZXh0LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgIChpbnRbXVtdKSBib2xkUmFuZ2VzLnRvQXJyYXkobmV3IGludFtib2xkUmFuZ2VzLnNpemUoKV1bMl0pLAotICAgICAgICAgICAgICAgICAgICAoaW50W11bXSkgYWN0aW9uUmFuZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IGludFthY3Rpb25SYW5nZXMuc2l6ZSgpXVsyXSksCi0gICAgICAgICAgICAgICAgICAgIChTdHJpbmdbXSkgcGx1Z2luSWRzLnRvQXJyYXkobmV3IFN0cmluZ1twbHVnaW5JZHMuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgICAgIChTdHJpbmdbXSkgY2xhc3Nlcy50b0FycmF5KG5ldyBTdHJpbmdbY2xhc3Nlcy5zaXplKCldKSwKLSAgICAgICAgICAgICAgICAgICAgKGludFtdW10pIGhlbHBSYW5nZXMudG9BcnJheShuZXcgaW50W2hlbHBSYW5nZXMuc2l6ZSgpXVsyXSksCi0gICAgICAgICAgICAgICAgICAgIChTdHJpbmdbXSkgaGVscElkcy50b0FycmF5KG5ldyBTdHJpbmdbaGVscElkcy5zaXplKCldKSwKLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZ1tdKSBoZWxwSHJlZnMudG9BcnJheShuZXcgU3RyaW5nW2hlbHBIcmVmcy5zaXplKCldKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKGNoW3N0YXJ0ICsgaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgICAgIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRleHRTdGFydCA9IG9mZnNldDsKLSAgICAgICAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19CT0xEKSkgewotICAgICAgICAgICAgICAgIEJvbGRIYW5kbGVyIGggPSBuZXcgQm9sZEhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICBoLnNldFBhcmVudChJdGVtSGFuZGxlci50aGlzKTsKLSAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0WE1MUmVhZGVyKCkuc2V0Q29udGVudEhhbmRsZXIoaCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0FDVElPTikpIHsKLSAgICAgICAgICAgICAgICBBY3Rpb25IYW5kbGVyIGggPSBuZXcgQWN0aW9uSGFuZGxlcihhdHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoQVRUX1BMVUdJTl9JRCksIGF0dHMuZ2V0VmFsdWUoQVRUX0NMQVNTKSk7Ci0gICAgICAgICAgICAgICAgaC5zZXRQYXJlbnQoSXRlbUhhbmRsZXIudGhpcyk7Ci0gICAgICAgICAgICAgICAgcGFyc2VyLmdldFhNTFJlYWRlcigpLnNldENvbnRlbnRIYW5kbGVyKGgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19QQVJBR1JBUEgpKSB7Ci0gICAgICAgICAgICAgICAgd3JhcFN0YXJ0ID0gdGV4dFN0YXJ0OwotICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19UT1BJQykpIHsKLSAgICAgICAgICAgICAgICBUb3BpY0hhbmRsZXIgaCA9IG5ldyBUb3BpY0hhbmRsZXIoYXR0cy5nZXRWYWx1ZShBVFRfSUQpLCBhdHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoQVRUX0hSRUYpKTsKLSAgICAgICAgICAgICAgICBoLnNldFBhcmVudChJdGVtSGFuZGxlci50aGlzKTsKLSAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0WE1MUmVhZGVyKCkuc2V0Q29udGVudEhhbmRsZXIoaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19JVEVNKSkgewotICAgICAgICAgICAgICAgIGl0ZW1zLmFkZChjb25zdHJ1Y3RXZWxjb21lSXRlbSgpKTsKLSAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0WE1MUmVhZGVyKCkuc2V0Q29udGVudEhhbmRsZXIocGFyZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfUEFSQUdSQVBIKSkgewotICAgICAgICAgICAgICAgIHdyYXBSYW5nZXMuYWRkKG5ldyBpbnRbXSB7IHdyYXBTdGFydCwgb2Zmc2V0IC0gd3JhcFN0YXJ0IH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBJbnRyb0l0ZW1IYW5kbGVyIGV4dGVuZHMgSXRlbUhhbmRsZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19JTlRSTykpIHsKLSAgICAgICAgICAgICAgICBpbnRyb0l0ZW0gPSBjb25zdHJ1Y3RXZWxjb21lSXRlbSgpOwotICAgICAgICAgICAgICAgIHBhcnNlci5nZXRYTUxSZWFkZXIoKS5zZXRDb250ZW50SGFuZGxlcihwYXJlbnQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19QQVJBR1JBUEgpKSB7Ci0gICAgICAgICAgICAgICAgd3JhcFJhbmdlcy5hZGQobmV3IGludFtdIHsgd3JhcFN0YXJ0LCBvZmZzZXQgLSB3cmFwU3RhcnQgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHdlbGNvbWUgcGFyc2VyLgotICAgICAqLwotICAgIHB1YmxpYyBXZWxjb21lUGFyc2VyKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZhY3Rvcnkuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCi0gICAgICAgIHBhcnNlci5nZXRYTUxSZWFkZXIoKS5zZXRDb250ZW50SGFuZGxlcih0aGlzKTsKLSAgICAgICAgcGFyc2VyLmdldFhNTFJlYWRlcigpLnNldERUREhhbmRsZXIodGhpcyk7Ci0gICAgICAgIHBhcnNlci5nZXRYTUxSZWFkZXIoKS5zZXRFbnRpdHlSZXNvbHZlcih0aGlzKTsKLSAgICAgICAgcGFyc2VyLmdldFhNTFJlYWRlcigpLnNldEVycm9ySGFuZGxlcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbnRybyBpdGVtLgotICAgICAqLwotICAgIHB1YmxpYyBXZWxjb21lSXRlbSBnZXRJbnRyb0l0ZW0oKSB7Ci0gICAgICAgIHJldHVybiBpbnRyb0l0ZW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaXRlbXMuCi0gICAgICovCi0gICAgcHVibGljIFdlbGNvbWVJdGVtW10gZ2V0SXRlbXMoKSB7Ci0gICAgICAgIHJldHVybiAoV2VsY29tZUl0ZW1bXSkgaXRlbXMudG9BcnJheShuZXcgV2VsY29tZUl0ZW1baXRlbXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGl0bGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotICAgICAgICByZXR1cm4gdGl0bGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgd2VsY29tZSBlZGl0b3IgaW5wdXQgc2hvdWxkIGJlIHdyYXBwZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNGb3JtYXRXcmFwcGVkKCkgewotICAgICAgICByZXR1cm4gRk9STUFUX1dSQVAuZXF1YWxzKGZvcm1hdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpcyksIHRoaXMpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5JREVfV09SS0JFTkNILCAxLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5XZWxjb21lUGFyc2VyX3BhcnNlRXhjZXB0aW9uLCBlKTsKLSAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5sb2coSURFV29ya2JlbmNoTWVzc2FnZXMuV2VsY29tZVBhcnNlcl9wYXJzZUVycm9yLCBzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsIDEsIElERVdvcmtiZW5jaE1lc3NhZ2VzLldlbGNvbWVQYXJzZXJfcGFyc2VFeGNlcHRpb24sIGUpOwotICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmxvZyhJREVXb3JrYmVuY2hNZXNzYWdlcy5XZWxjb21lUGFyc2VyX3BhcnNlRXJyb3IsIHN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHRoZSBzdGFydCBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19XRUxDT01FX1BBR0UpKSB7Ci0gICAgICAgICAgICBXZWxjb21lQ29udGVudEhhbmRsZXIgaCA9IG5ldyBXZWxjb21lUGFnZUhhbmRsZXIoYXR0cwotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoQVRUX1RJVExFKSk7Ci0gICAgICAgICAgICBmb3JtYXQgPSBhdHRzLmdldFZhbHVlKEFUVF9GT1JNQVQpOwotICAgICAgICAgICAgaC5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgICAgICBwYXJzZXIuZ2V0WE1MUmVhZGVyKCkuc2V0Q29udGVudEhhbmRsZXIoaCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvV2l6YXJkTmV3UHJvamVjdENhcGFiaWxpdHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvV2l6YXJkTmV3UHJvamVjdENhcGFiaWxpdHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YjFmZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1dpemFyZE5ld1Byb2plY3RDYXBhYmlsaXR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLkNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JSURFSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1pc2MuUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnkuQ2FwYWJpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnkuQ2FwYWJpbGl0eVJlZ2lzdHJ5OwotCi0vKioKLSAqIFNlY29uZCBwYWdlIGZvciB0aGUgbmV3IHByb2plY3QgY3JlYXRpb24gd2l6YXJkLiBUaGlzIHBhZ2UKLSAqIGNvbGxlY3RzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIG5ldyBwcm9qZWN0LgotICogPHA+Ci0gKiBFeGFtcGxlIHVzYWdlOgotICogPHByZT4KLSAqIG1haW5QYWdlID0gbmV3IFdpemFyZE5ld1Byb2plY3RDYXBhYmlsaXR5UGFnZSgid2l6YXJkTmV3UHJvamVjdENhcGFiaWxpdHlQYWdlIik7Ci0gKiBtYWluUGFnZS5zZXRUaXRsZSgiUHJvamVjdCIpOwotICogbWFpblBhZ2Uuc2V0RGVzY3JpcHRpb24oIkNob29zZSBwcm9qZWN0J3MgY2FwYWJpbGl0aWVzLiIpOwotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmROZXdQcm9qZWN0Q2FwYWJpbGl0eVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLSAgICAvLyBpbml0aWFsIHZhbHVlIHN0b3JlcwotICAgIHByaXZhdGUgQ2FwYWJpbGl0eVtdIGluaXRpYWxQcm9qZWN0Q2FwYWJpbGl0aWVzOwotCi0gICAgcHJpdmF0ZSBDYXRlZ29yeVtdIGluaXRpYWxTZWxlY3RlZENhdGVnb3JpZXM7Ci0KLSAgICAvLyB3aWRnZXRzCi0gICAgcHJpdmF0ZSBQcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwIGNhcGFiaWxpdHlHcm91cDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdCBjYXBhYmlsaXRpZXMgd2l6YXJkIHBhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFnZU5hbWUgdGhlIG5hbWUgb2YgdGhpcyBwYWdlCi0gICAgICovCi0gICAgcHVibGljIFdpemFyZE5ld1Byb2plY3RDYXBhYmlsaXR5UGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLSAgICAgICAgLy8gQWxyZWFkeSBrbm93IHRoZXJlIGlzIGEgbmV4dCBwYWdlLi4uCi0gICAgICAgIHJldHVybiBpc1BhZ2VDb21wbGV0ZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5ORVdfUFJPSkVDVF9DQVBBQklMSVRZX1dJWkFSRF9QQUdFKTsKLSAgICAgICAgQ2FwYWJpbGl0eVJlZ2lzdHJ5IHJlZyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0Q2FwYWJpbGl0eVJlZ2lzdHJ5KCk7Ci0gICAgICAgIGNhcGFiaWxpdHlHcm91cCA9IG5ldyBQcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwKAotICAgICAgICAgICAgICAgIGluaXRpYWxTZWxlY3RlZENhdGVnb3JpZXMsIGluaXRpYWxQcm9qZWN0Q2FwYWJpbGl0aWVzLCByZWcpOwotICAgICAgICBzZXRDb250cm9sKGNhcGFiaWxpdHlHcm91cC5jcmVhdGVDb250ZW50cyhwYXJlbnQpKTsKLQotICAgICAgICBjYXBhYmlsaXR5R3JvdXAuc2V0Q2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaWYgKCFyZWcuaGFzQ2FwYWJpbGl0aWVzKCkpCi0gICAgICAgICAgICBzZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q2FwYWJpbGl0eVBhZ2Vfbm9DYXBhYmlsaXRpZXMsIFdBUk5JTkcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgY2FwYWJpbGl0aWVzIHNlbGVjdGVkCi0gICAgICogYnkgdGhlIHVzZXIuIFRoZSBjb2xsZWN0aW9uIGlzIG5vdCBpbiBwcmVyZXF1aXNpdGUKLSAgICAgKiBvcmRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFycmF5IG9mIHNlbGVjdGVkIGNhcGFiaWxpdGllcwotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi9DYXBhYmlsaXR5W10gZ2V0U2VsZWN0ZWRDYXBhYmlsaXRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBjYXBhYmlsaXR5R3JvdXAuZ2V0U2VsZWN0ZWRDYXBhYmlsaXRpZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbml0aWFsIGNhdGVnb3JpZXMgdG8gYmUgc2VsZWN0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdGVnb3JpZXMgaW5pdGlhbCBjYXRlZ29yaWVzIHRvIHNlbGVjdAotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi92b2lkIHNldEluaXRpYWxTZWxlY3RlZENhdGVnb3JpZXMoQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzKSB7Ci0gICAgICAgIGluaXRpYWxTZWxlY3RlZENhdGVnb3JpZXMgPSBjYXRlZ29yaWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGluaXRpYWwgcHJvamVjdCBjYXBhYmlsaXRpZXMgdG8gYmUgc2VsZWN0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhcGFiaWxpdGllcyBpbml0aWFsIHByb2plY3QgY2FwYWJpbGl0aWVzIHRvIHNlbGVjdAotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi92b2lkIHNldEluaXRpYWxQcm9qZWN0Q2FwYWJpbGl0aWVzKENhcGFiaWxpdHlbXSBjYXBhYmlsaXRpZXMpIHsKLSAgICAgICAgaW5pdGlhbFByb2plY3RDYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1dpemFyZE5ld1Byb2plY3ROYW1lQW5kTG9jYXRpb25QYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvV2l6YXJkTmV3UHJvamVjdE5hbWVBbmRMb2NhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxN2NhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvV2l6YXJkTmV3UHJvamVjdE5hbWVBbmRMb2NhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIFNlYmFzdGlhbiBEYXZpZHMgPHNkYXZpZHNAZ214LmRlPiAtIEZpeCBmb3IgYnVnIDE5MzQ2IC0gRGlhbG9nIGZvbnQgc2hvdWxkIGJlCi0gKiAgICAgICAgYWN0aXZhdGVkIGFuZCB1c2VkIGJ5IG90aGVyIGNvbXBvbmVudHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLQotLyoqCi0gKiBGaXJzdCBwYWdlIGZvciB0aGUgbmV3IHByb2plY3QgY3JlYXRpb24gd2l6YXJkLiBUaGlzIHBhZ2UKLSAqIGNvbGxlY3RzIHRoZSBuYW1lIGFuZCBsb2NhdGlvbiBvZiB0aGUgbmV3IHByb2plY3QuCi0gKiA8cD4KLSAqIEV4YW1wbGUgdXNhZ2U6Ci0gKiA8cHJlPgotICogbWFpblBhZ2UgPSBuZXcgV2l6YXJkTmV3UHJvamVjdE5hbWVBbmRMb2NhdGlvblBhZ2UoIndpemFyZE5ld1Byb2plY3ROYW1lQW5kTG9jYXRpb25QYWdlIik7Ci0gKiBtYWluUGFnZS5zZXRUaXRsZSgiUHJvamVjdCIpOwotICogbWFpblBhZ2Uuc2V0RGVzY3JpcHRpb24oIkNyZWF0ZSBhIG5ldyBwcm9qZWN0LiIpOwotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmROZXdQcm9qZWN0TmFtZUFuZExvY2F0aW9uUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotICAgIC8vIFdoZXRoZXIgdG8gdXNlIGRlZmF1bHQgb3IgY3VzdG9tIHByb2plY3QgbG9jYXRpb24KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRGVmYXVsdHMgPSB0cnVlOwotCi0gICAgLy8gaW5pdGlhbCB2YWx1ZSBzdG9yZXMKLSAgICBwcml2YXRlIFN0cmluZyBpbml0aWFsUHJvamVjdEZpZWxkVmFsdWU7Ci0KLSAgICBwcml2YXRlIElQYXRoIGluaXRpYWxMb2NhdGlvbkZpZWxkVmFsdWU7Ci0KLSAgICAvLyB0aGUgdmFsdWUgdGhlIHVzZXIgaGFzIGVudGVyZWQKLSAgICBwcml2YXRlIFN0cmluZyBjdXN0b21Mb2NhdGlvbkZpZWxkVmFsdWU7Ci0KLSAgICAvLyB3aWRnZXRzCi0gICAgcHJpdmF0ZSBUZXh0IHByb2plY3ROYW1lRmllbGQ7Ci0KLSAgICBwcml2YXRlIFRleHQgbG9jYXRpb25QYXRoRmllbGQ7Ci0KLSAgICBwcml2YXRlIExhYmVsIGxvY2F0aW9uTGFiZWw7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLSAgICBwcml2YXRlIExpc3RlbmVyIG5hbWVNb2RpZnlMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgc2V0TG9jYXRpb25Gb3JTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBMaXN0ZW5lciBsb2NhdGlvbk1vZGlmeUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8vIGNvbnN0YW50cwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSCA9IDI1MDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdCBjcmVhdGlvbiB3aXphcmQgcGFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGlzIHBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgV2l6YXJkTmV3UHJvamVjdE5hbWVBbmRMb2NhdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHBhZ2VOYW1lKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgaW5pdGlhbExvY2F0aW9uRmllbGRWYWx1ZSA9IFBsYXRmb3JtLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIGN1c3RvbUxvY2F0aW9uRmllbGRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkUGFnZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotICAgICAgICAvLyBBbHJlYWR5IGtub3cgdGhlcmUgaXMgYSBuZXh0IHBhZ2UuLi4KLSAgICAgICAgcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1dJWkFSRF9QQUdFKTsKLQotICAgICAgICBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZVByb2plY3RMb2NhdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0KLSAgICAgICAgLy8gU2hvdyBkZXNjcmlwdGlvbiBvbiBvcGVuaW5nCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgc2V0TWVzc2FnZShudWxsKTsKLSAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHByb2plY3QgbG9jYXRpb24gc3BlY2lmaWNhdGlvbiBjb250cm9scy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotICAgICAgICAvLyBwcm9qZWN0IHNwZWNpZmljYXRpb24gZ3JvdXAKLSAgICAgICAgQ29tcG9zaXRlIHByb2plY3RHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBwcm9qZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHByb2plY3RHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgcHJvamVjdEdyb3VwLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgLy8gbmV3IHByb2plY3QgbGFiZWwKLSAgICAgICAgTGFiZWwgcHJvamVjdENvbnRlbnRzTGFiZWwgPSBuZXcgTGFiZWwocHJvamVjdEdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIHByb2plY3RDb250ZW50c0xhYmVsLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIHByb2plY3RDb250ZW50c0xhYmVsCi0gICAgICAgICAgICAgICAgLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9wcm9qZWN0Q29udGVudHNMYWJlbCk7Ci0KLSAgICAgICAgR3JpZERhdGEgbGFiZWxEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGxhYmVsRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHByb2plY3RDb250ZW50c0xhYmVsLnNldExheW91dERhdGEobGFiZWxEYXRhKTsKLQotICAgICAgICBmaW5hbCBCdXR0b24gdXNlRGVmYXVsdHNCdXR0b24gPSBuZXcgQnV0dG9uKHByb2plY3RHcm91cCwgU1dULkNIRUNLCi0gICAgICAgICAgICAgICAgfCBTV1QuUklHSFQpOwotICAgICAgICB1c2VEZWZhdWx0c0J1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfdXNlRGVmYXVsdExhYmVsKTsKLSAgICAgICAgdXNlRGVmYXVsdHNCdXR0b24uc2V0U2VsZWN0aW9uKHVzZURlZmF1bHRzKTsKLSAgICAgICAgdXNlRGVmYXVsdHNCdXR0b24uc2V0Rm9udChmb250KTsKLQotICAgICAgICBHcmlkRGF0YSBidXR0b25EYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGJ1dHRvbkRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICB1c2VEZWZhdWx0c0J1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkRhdGEpOwotCi0gICAgICAgIGNyZWF0ZVVzZXJTcGVjaWZpZWRQcm9qZWN0TG9jYXRpb25Hcm91cChwcm9qZWN0R3JvdXAsICF1c2VEZWZhdWx0cyk7Ci0KLSAgICAgICAgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1c2VEZWZhdWx0cyA9IHVzZURlZmF1bHRzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKCF1c2VEZWZhdWx0cyk7Ci0gICAgICAgICAgICAgICAgbG9jYXRpb25QYXRoRmllbGQuc2V0RW5hYmxlZCghdXNlRGVmYXVsdHMpOwotICAgICAgICAgICAgICAgIGxvY2F0aW9uTGFiZWwuc2V0RW5hYmxlZCghdXNlRGVmYXVsdHMpOwotICAgICAgICAgICAgICAgIGlmICh1c2VEZWZhdWx0cykgewotICAgICAgICAgICAgICAgICAgICBjdXN0b21Mb2NhdGlvbkZpZWxkVmFsdWUgPSBsb2NhdGlvblBhdGhGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldExvY2F0aW9uRm9yU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25QYXRoRmllbGQuc2V0VGV4dChjdXN0b21Mb2NhdGlvbkZpZWxkVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgdXNlRGVmYXVsdHNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHByb2plY3QgbmFtZSBzcGVjaWZpY2F0aW9uIGNvbnRyb2xzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgLy8gcHJvamVjdCBzcGVjaWZpY2F0aW9uIGdyb3VwCi0gICAgICAgIENvbXBvc2l0ZSBwcm9qZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgcHJvamVjdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBwcm9qZWN0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgLy8gbmV3IHByb2plY3QgbGFiZWwKLSAgICAgICAgTGFiZWwgcHJvamVjdExhYmVsID0gbmV3IExhYmVsKHByb2plY3RHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBwcm9qZWN0TGFiZWwuc2V0Rm9udChmb250KTsKLSAgICAgICAgcHJvamVjdExhYmVsLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9uYW1lTGFiZWwpOwotCi0gICAgICAgIC8vIG5ldyBwcm9qZWN0IG5hbWUgZW50cnkgZmllbGQKLSAgICAgICAgcHJvamVjdE5hbWVGaWVsZCA9IG5ldyBUZXh0KHByb2plY3RHcm91cCwgU1dULkJPUkRFUik7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLSAgICAgICAgcHJvamVjdE5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBwcm9qZWN0TmFtZUZpZWxkLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIHZhbHVlIGZpcnN0IGJlZm9yZSBsaXN0ZW5lcgotICAgICAgICAvLyB0byBhdm9pZCBoYW5kbGluZyBhbiBldmVudCBkdXJpbmcgdGhlIGNyZWF0aW9uLgotICAgICAgICBpZiAoaW5pdGlhbFByb2plY3RGaWVsZFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICBwcm9qZWN0TmFtZUZpZWxkLnNldFRleHQoaW5pdGlhbFByb2plY3RGaWVsZFZhbHVlKTsKLSAgICAgICAgcHJvamVjdE5hbWVGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuYW1lTW9kaWZ5TGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHByb2plY3QgbG9jYXRpb24gc3BlY2lmaWNhdGlvbiBjb250cm9scy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0R3JvdXAgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKiBAcGFyYW0gZW5hYmxlZCB0aGUgaW5pdGlhbCBlbmFibGVkIHN0YXRlIG9mIHRoZSB3aWRnZXRzIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlVXNlclNwZWNpZmllZFByb2plY3RMb2NhdGlvbkdyb3VwKAotICAgICAgICAgICAgQ29tcG9zaXRlIHByb2plY3RHcm91cCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHByb2plY3RHcm91cC5nZXRGb250KCk7Ci0gICAgICAgIC8vIGxvY2F0aW9uIGxhYmVsCi0gICAgICAgIGxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwocHJvamVjdEdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxvY2F0aW9uTGFiZWwuc2V0Rm9udChmb250KTsKLSAgICAgICAgbG9jYXRpb25MYWJlbC5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfbG9jYXRpb25MYWJlbCk7Ci0gICAgICAgIGxvY2F0aW9uTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQotICAgICAgICAvLyBwcm9qZWN0IGxvY2F0aW9uIGVudHJ5IGZpZWxkCi0gICAgICAgIGxvY2F0aW9uUGF0aEZpZWxkID0gbmV3IFRleHQocHJvamVjdEdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotICAgICAgICBsb2NhdGlvblBhdGhGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBsb2NhdGlvblBhdGhGaWVsZC5zZXRGb250KGZvbnQpOwotICAgICAgICBsb2NhdGlvblBhdGhGaWVsZC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0gICAgICAgIC8vIGJyb3dzZSBidXR0b24KLSAgICAgICAgYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwcm9qZWN0R3JvdXAsIFNXVC5QVVNIKTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfYnJvd3NlTGFiZWwpOwotICAgICAgICBicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBicm93c2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQotICAgICAgICAvLyBTZXQgdGhlIGluaXRpYWwgdmFsdWUgZmlyc3QgYmVmb3JlIGxpc3RlbmVyCi0gICAgICAgIC8vIHRvIGF2b2lkIGhhbmRsaW5nIGFuIGV2ZW50IGR1cmluZyB0aGUgY3JlYXRpb24uCi0gICAgICAgIGlmIChpbml0aWFsTG9jYXRpb25GaWVsZFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICBsb2NhdGlvblBhdGhGaWVsZC5zZXRUZXh0KGluaXRpYWxMb2NhdGlvbkZpZWxkVmFsdWUudG9PU1N0cmluZygpKTsKLSAgICAgICAgbG9jYXRpb25QYXRoRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbG9jYXRpb25Nb2RpZnlMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwcm9qZWN0IGxvY2F0aW9uIHBhdGggYXMgZW50ZXJlZCBieSAKLSAgICAgKiB0aGUgdXNlciwgb3IgaXRzIGFudGljaXBhdGVkIGluaXRpYWwgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGxvY2F0aW9uIHBhdGgsIGl0cyBhbnRpY2lwYXRlZCBpbml0aWFsIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICAgaWYgbm8gcHJvamVjdCBsb2NhdGlvbiBwYXRoIGlzIGtub3duCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqL0lQYXRoIGdldExvY2F0aW9uUGF0aCgpIHsKLSAgICAgICAgaWYgKHVzZURlZmF1bHRzKQotICAgICAgICAgICAgcmV0dXJuIGluaXRpYWxMb2NhdGlvbkZpZWxkVmFsdWU7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBQYXRoKGdldFByb2plY3RMb2NhdGlvbkZpZWxkVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHByb2plY3QgcmVzb3VyY2UgaGFuZGxlIGZvciB0aGUgY3VycmVudCBwcm9qZWN0IG5hbWUgZmllbGQgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgY3JlYXRlIHRoZSBwcm9qZWN0IHJlc291cmNlOyB0aGlzIGlzIHRoZSByZXNwb25zaWJpbGl0eQotICAgICAqIG9mIDxjb2RlPklQcm9qZWN0OjpjcmVhdGU8L2NvZGU+IGludm9rZWQgYnkgdGhlIG5ldyBwcm9qZWN0IHJlc291cmNlIHdpemFyZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcHJvamVjdCByZXNvdXJjZSBoYW5kbGUKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovSVByb2plY3QgZ2V0UHJvamVjdEhhbmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLSAgICAgICAgICAgICAgICBnZXRQcm9qZWN0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByb2plY3QgbmFtZSBhcyBlbnRlcmVkIGJ5IHRoZSB1c2VyLCBvciBpdHMgYW50aWNpcGF0ZWQKLSAgICAgKiBpbml0aWFsIHZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBuYW1lLCBpdHMgYW50aWNpcGF0ZWQgaW5pdGlhbCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAgIGlmIG5vIHByb2plY3QgbmFtZSBpcyBrbm93bgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi9TdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0gICAgICAgIGlmIChwcm9qZWN0TmFtZUZpZWxkID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gaW5pdGlhbFByb2plY3RGaWVsZFZhbHVlOwotCi0gICAgICAgIHJldHVybiBnZXRQcm9qZWN0TmFtZUZpZWxkVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvamVjdCBuYW1lIGZpZWxkCi0gICAgICogd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgcmVtb3ZlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IG5hbWUgaW4gdGhlIGZpZWxkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvamVjdE5hbWVGaWVsZFZhbHVlKCkgewotICAgICAgICBpZiAocHJvamVjdE5hbWVGaWVsZCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIElERVJlc291cmNlSW5mb1V0aWxzLkVNUFRZX1NUUklORzsgCi0gICAgICAgcmV0dXJuIHByb2plY3ROYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvamVjdCBsb2NhdGlvbiBmaWVsZAotICAgICAqIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIHJlbW92ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBsb2NhdGlvbiBkaXJlY3RvcnkgaW4gdGhlIGZpZWxkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvamVjdExvY2F0aW9uRmllbGRWYWx1ZSgpIHsKLSAgICAgICAgaWYgKGxvY2F0aW9uUGF0aEZpZWxkID09IG51bGwpCi0gICAgICAgIAlyZXR1cm4gSURFUmVzb3VyY2VJbmZvVXRpbHMuRU1QVFlfU1RSSU5HOyAKLSAgICAgICByZXR1cm4gbG9jYXRpb25QYXRoRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglPcGVuIGFuIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBicm93c2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLSAgICAgICAgRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cobG9jYXRpb25QYXRoRmllbGQKLSAgICAgICAgICAgICAgICAuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfZGlyZWN0b3J5TGFiZWwpOwotCi0gICAgICAgIFN0cmluZyBkaXJOYW1lID0gZ2V0UHJvamVjdExvY2F0aW9uRmllbGRWYWx1ZSgpOwotICAgICAgICBpZiAoZGlyTmFtZS5sZW5ndGgoKSA+IDApIHsgCi0gICAgICAgICAgICBpZiAoSURFUmVzb3VyY2VJbmZvVXRpbHMuZXhpc3RzKGRpck5hbWUpKQotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJQYXRoKG5ldyBQYXRoKGRpck5hbWUpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotICAgICAgICBpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgY3VzdG9tTG9jYXRpb25GaWVsZFZhbHVlID0gc2VsZWN0ZWREaXJlY3Rvcnk7Ci0gICAgICAgICAgICBsb2NhdGlvblBhdGhGaWVsZC5zZXRUZXh0KGN1c3RvbUxvY2F0aW9uRmllbGRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnRseSBzcGVjaWZpZWQgcHJvamVjdAotICAgICAqIGNvbnRlbnQgZGlyZWN0b3J5IHBvaW50cyB0byBhbiBleGlzaW5nIHByb2plY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFeGlzdGluZ1Byb2plY3RMb2NhdGlvbigpIHsKLSAgICAgICAgSVBhdGggcGF0aCA9IGdldExvY2F0aW9uUGF0aCgpOwotICAgICAgICBwYXRoID0gcGF0aC5hcHBlbmQoSVByb2plY3REZXNjcmlwdGlvbi5ERVNDUklQVElPTl9GSUxFX05BTUUpOwotICAgICAgICByZXR1cm4gcGF0aC50b0ZpbGUoKS5leGlzdHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbml0aWFsIHByb2plY3QgbmFtZSB0aGF0IHRoaXMgcGFnZSB3aWxsIHVzZSB3aGVuCi0gICAgICogY3JlYXRlZC4gVGhlIG5hbWUgaXMgaWdub3JlZCBpZiB0aGUgY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0gICAgICogbWV0aG9kIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLiBMZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMKLSAgICAgKiBpbiB0aGUgbmFtZSBhcmUgaWdub3JlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSBpbml0aWFsIHByb2plY3QgbmFtZSBmb3IgdGhpcyBwYWdlCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqL3ZvaWQgc2V0SW5pdGlhbFByb2plY3ROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICBpbml0aWFsUHJvamVjdEZpZWxkVmFsdWUgPSBudWxsOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpbml0aWFsUHJvamVjdEZpZWxkVmFsdWUgPSBuYW1lLnRyaW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGxvY2F0aW9uIHRvIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGlmIHdlIGFyZSBzZXQgdG8gdXNlRGVmYXVsdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldExvY2F0aW9uRm9yU2VsZWN0aW9uKCkgewotICAgICAgICBpZiAodXNlRGVmYXVsdHMpIHsKLSAgICAgICAgICAgIElQYXRoIGRlZmF1bHRQYXRoID0gUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIGdldFByb2plY3ROYW1lRmllbGRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGxvY2F0aW9uUGF0aEZpZWxkLnNldFRleHQoZGVmYXVsdFBhdGgudG9PU1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhZ2UncyBjb250cm9scyBjdXJyZW50bHkgYWxsIGNvbnRhaW4gdmFsaWQgCi0gICAgICogdmFsdWVzLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgY29udHJvbHMgYXJlIHZhbGlkLCBhbmQKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgaXMgaW52YWxpZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gSURFV29ya2JlbmNoUGx1Z2luLmdldFBsdWdpbldvcmtzcGFjZSgpOwotCi0gICAgICAgIFN0cmluZyBwcm9qZWN0RmllbGRDb250ZW50cyA9IGdldFByb2plY3ROYW1lRmllbGRWYWx1ZSgpOwotICAgICAgICBpZiAocHJvamVjdEZpZWxkQ29udGVudHMuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfcHJvamVjdE5hbWVFbXB0eSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBJU3RhdHVzIG5hbWVTdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKHByb2plY3RGaWVsZENvbnRlbnRzLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZS5QUk9KRUNUKTsKLSAgICAgICAgaWYgKCFuYW1lU3RhdHVzLmlzT0soKSkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG5hbWVTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBsb2NhdGlvbkZpZWxkQ29udGVudHMgPSBnZXRQcm9qZWN0TG9jYXRpb25GaWVsZFZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKGxvY2F0aW9uRmllbGRDb250ZW50cy5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgICAgIHNldE1lc3NhZ2UoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9wcm9qZWN0TG9jYXRpb25FbXB0eSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICghcGF0aC5pc1ZhbGlkUGF0aChsb2NhdGlvbkZpZWxkQ29udGVudHMpKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9sb2NhdGlvbkVycm9yKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXVzZURlZmF1bHRzCi0gICAgICAgICAgICAgICAgJiYgUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhdGgobG9jYXRpb25GaWVsZENvbnRlbnRzKSkpIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2RlZmF1bHRMb2NhdGlvbkVycm9yKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRQcm9qZWN0SGFuZGxlKCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3RFeGlzdHNNZXNzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0V4aXN0aW5nUHJvamVjdExvY2F0aW9uKCkpIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3RMb2NhdGlvbkV4aXN0c01lc3NhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHNlZSBARGlhbG9nUGFnZS5zZXRWaXNpYmxlKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgaWYgKHZpc2libGUpCi0gICAgICAgICAgICBwcm9qZWN0TmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvV2l6YXJkU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9kaWFsb2dzL1dpemFyZFN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1NWZmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL2RpYWxvZ3MvV2l6YXJkU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gYSBtdWx0aS1zdGVwIHdpemFyZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdpemFyZFN0ZXAgewotICAgIHByaXZhdGUgaW50IG51bWJlcjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgd2l6YXJkIHN0ZXAuCi0gICAgICogCi0gICAgICogQHBhcmFtIG51bWJlciB0aGUgc3RlcCBudW1iZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgV2l6YXJkU3RlcChpbnQgbnVtYmVyKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGlzIHN0ZXAgdGhhdCBjYW4KLSAgICAgKiBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIGxhYmVsIG9mIHRoaXMgc3RlcAotICAgICAqLwotICAgIGFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gZXhwbGFpbmF0aW9uIG9mIHRoaXMgc3RlcCB0aGF0IGNhbgotICAgICAqIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgZGV0YWlscyBvZiB0aGlzIHN0ZXAKLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldERldGFpbHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0ZXAncyBudW1iZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIHN0ZXAncyBudW1iZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdGVwJ3Mgd2l6YXJkLiBTdWJjbGFzc2VzIGFyZQotICAgICAqIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGFkZFBhZ2VzIG1ldGhvZCBvbgotICAgICAqIHRoZSB3aXphcmQsIGlmIG5lZWRlZCwgYmVmb3JlIHJldHVybmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIElXaXphcmQgdGhlIHdpemFyZCB0byBjb21wbGV0ZSB0aGUgc3RlcAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBJV2l6YXJkIGdldFdpemFyZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzdGVwIGlzIGRvbmUgaXQncyB3b3JrCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb25lKCkgewotICAgICAgICByZXR1cm4gZG9uZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzdGVwIGFzIGJlaW5nIGRvbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtYXJrQXNEb25lKCkgewotICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4Y2UyMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBwYWNrYWdlOiBvcmcuZWNsaXBzZS51aS5pZGUKLQotSURFV29ya2JlbmNoQWR2aXNvcl9ub1BlcnNwZWN0aXZlPU5vIHBlcnNwZWN0aXZlcyBhcmUgb3Blbi4gVG8gb3BlbiBhIHBlcnNwZWN0aXZlLCBwcmVzcyB0aGlzIGJ1dHRvbjoKLQotSURFX25vRmlsZUVkaXRvckZvdW5kID0gTm8gZWRpdG9yIGZvdW5kIHRvIGVkaXQgdGhlIGZpbGUgcmVzb3VyY2UuCi0KLVF1aWNrU3RhcnRBY3Rpb25fZXJyb3JEaWFsb2dUaXRsZSA9IFF1aWNrIFN0YXJ0IEVycm9yCi1RdWlja1N0YXJ0QWN0aW9uX2luZm9SZWFkRXJyb3IgPSBDb3VsZCBub3QgcmVhZCBmZWF0dXJlIGFib3V0IGluZm9ybWF0aW9uLgotCi1Db25maWd1cmF0aW9uTG9nVXBkYXRlU2VjdGlvbl9pbnN0YWxsQ29uZmlndXJhdGlvbj1JbnN0YWxsIGNvbmZpZ3VyYXRpb246Ci1Db25maWd1cmF0aW9uTG9nVXBkYXRlU2VjdGlvbl9sYXN0Q2hhbmdlZE9uPUxhc3QgY2hhbmdlZCBvbiB7MH0KLUNvbmZpZ3VyYXRpb25Mb2dVcGRhdGVTZWN0aW9uX2xvY2F0aW9uPUxvY2F0aW9uOiB7MH0KLUNvbmZpZ3VyYXRpb25Mb2dVcGRhdGVTZWN0aW9uX2NvbmZpZ3VyYXRpb25TaXRlcz1Db25maWd1cmVkIHNpdGVzOgotQ29uZmlndXJhdGlvbkxvZ1VwZGF0ZVNlY3Rpb25fY29uZmlndXJhdGlvbkZlYXR1cmVzPUNvbmZpZ3VyZWQgZmVhdHVyZXM6Ci1Db25maWd1cmF0aW9uTG9nVXBkYXRlU2VjdGlvbl9mZWF0dXJlSWRBbmRWZXJzaW9uPUlEOiB7MH0sIFZlcnNpb246IHsxfQotQ29uZmlndXJhdGlvbkxvZ1VwZGF0ZVNlY3Rpb25fcGx1Z2lucz1Db25maWd1cmVkIHBsdWctaW5zOgotCi1FcnJvckNsb3NpbmcgPSBBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hlbiBjbG9zaW5nIHRoZSB3b3JrYmVuY2guIFNlZSBlcnJvciBsb2cgZm9yIG1vcmUgZGV0YWlscy4KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3BpZXMgZnJvbSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc2hvd0FkdmFuY2VkID0gJkFkdmFuY2VkID4+Ci1oaWRlQWR2YW5jZWQgPSA8PCAmQWR2YW5jZWQKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgV29ya2JlbmNoIEFjdGlvbnMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgLS0tIEZpbGUgTWVudSAtLS0KLVdvcmtiZW5jaF9maWxlID0gJkZpbGUKLVdvcmtiZW5jaF9uZXcgPSAmTmV3Ci1PcGVuV29ya3NwYWNlQWN0aW9uX3RleHQgPSBTd2l0Y2ggJldvcmtzcGFjZS4uLgotT3BlbldvcmtzcGFjZUFjdGlvbl90b29sVGlwID0gT3BlbiBXb3Jrc3BhY2UKLU9wZW5Xb3Jrc3BhY2VBY3Rpb25fZXJyb3JUaXRsZSA9IE1pc3NpbmcgU3lzdGVtIFByb3BlcnR5Ci1PcGVuV29ya3NwYWNlQWN0aW9uX2Vycm9yTWVzc2FnZSA9IFVuYWJsZSB0byByZWxhdW5jaCB0aGUgcGxhdGZvcm0gYmVjYXVzZSB0aGUgezB9IHByb3BlcnR5IGhhcyBub3QgYmVlbiBzZXQuCi1DcmVhdGVQcm9qZWN0QWN0aW9uX3RleHQgPSBDb25maWd1cmFibGUgJlByb2plY3QuLi4KLUNyZWF0ZVByb2plY3RBY3Rpb25fdG9vbFRpcCA9IE9wZW4gTmV3IENvbmZpZ3VyYWJsZSBQcm9qZWN0IFdpemFyZAotTmV3UHJvamVjdEFjdGlvbl90ZXh0ID0gUCZyb2plY3QuLi4KLU5ld1Byb2plY3RBY3Rpb25fdG9vbFRpcCA9IE5ldyBQcm9qZWN0Ci1OZXdFeGFtcGxlQWN0aW9uX3RleHQgPSBFJnhhbXBsZS4uLgotTmV3RXhhbXBsZUFjdGlvbl90b29sVGlwID0gTmV3IEV4YW1wbGUKLVNhdmVBc0RpYWxvZ190aXRsZSA9IFNhdmUgQXMKLVNhdmVBc0RpYWxvZ19tZXNzYWdlID0gU2F2ZSBmaWxlIHRvIGFub3RoZXIgbG9jYXRpb24uCi1TYXZlQXNEaWFsb2dfdGV4dCA9IFNhdmUgQXMKLVNhdmVBc0RpYWxvZ19maWxlTGFiZWwgPSAmRmlsZSBuYW1lOgotU2F2ZUFzRGlhbG9nX2ZpbGUgPSBmaWxlCi1TYXZlQXNEaWFsb2dfb3ZlcndyaXRlUXVlc3Rpb24gPSBUaGUgZmlsZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLiBEbyB5b3Ugd2FudCB0byByZXBsYWNlIHRoZSBleGlzdGluZyBmaWxlPwotV29ya2JlbmNoX3Byb2plY3RQcm9wZXJ0aWVzID0gJlByb3BlcnRpZXMKLVdvcmtiZW5jaF9wcm9qZWN0UHJvcGVydGllc1Rvb2xUaXAgPSBQcm9wZXJ0aWVzCi0KLQotIyAtLS0gRWRpdCBNZW51IC0tLQotV29ya2JlbmNoX2VkaXQgPSAmRWRpdAotV29ya2JlbmNoX2FkZEJvb2ttYXJrID0gQWRkIEJvb2ttYXImay4uLgotV29ya2JlbmNoX2FkZEJvb2ttYXJrVG9vbFRpcCA9IEFkZCBCb29rbWFyawotV29ya2JlbmNoX2FkZFRhc2sgPSBBZGQgVGEmc2suLi4KLVdvcmtiZW5jaF9hZGRUYXNrVG9vbFRpcCA9IEFkZCBUYXNrCi0KLQotIyAtLS0gTmF2aWdhdGUgTWVudSAtLS0KLVdvcmtiZW5jaF9uYXZpZ2F0ZSA9ICZOYXZpZ2F0ZQotV29ya2JlbmNoX2dvVG8gPSAmR28gVG8KLQotT3BlbldvcmtzcGFjZUZpbGVBY3Rpb25fZXJyb3JUaXRsZT1PcGVuIFJlc291cmNlCi1PcGVuV29ya3NwYWNlRmlsZUFjdGlvbl9lcnJvck1lc3NhZ2U9QW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIG9wZW5pbmcgdGhlIHJlc291cmNlLgotCi1Xb3JrYmVuY2hfc2hvd0luID0gU2hvJncgSW4KLQotIyAtLS0gUHJvamVjdCBNZW51IC0tLQotV29ya2JlbmNoX3Byb2plY3QgPSAmUHJvamVjdAotCi1Xb3JrYmVuY2hfb3BlblByb2plY3QgPSAmT3BlbiBQcm9qZWN0Ci1Xb3JrYmVuY2hfb3BlblByb2plY3RUb29sVGlwID0gT3BlbiBQcm9qZWN0Ci1Xb3JrYmVuY2hfY2xvc2VQcm9qZWN0ID0gJkNsb3NlIFByb2plY3QKLVdvcmtiZW5jaF9jbG9zZVByb2plY3RUb29sVGlwID0gQ2xvc2UgUHJvamVjdAotCi1Xb3JrYmVuY2hfYnVpbGRQcm9qZWN0ID0gJkJ1aWxkIFByb2plY3QKLVdvcmtiZW5jaF9idWlsZFByb2plY3RUb29sVGlwID0gQnVpbGQgUHJvamVjdAotV29ya2JlbmNoX3JlYnVpbGRQcm9qZWN0ID0gJlJlYnVpbGQgUHJvamVjdAotV29ya2JlbmNoX3JlYnVpbGRQcm9qZWN0VG9vbFRpcCA9IFJlYnVpbGQgUHJvamVjdAotV29ya2JlbmNoX2J1aWxkQ2xlYW4gPSBDbGVhJm4uLi4KLVdvcmtiZW5jaF9idWlsZFNldCA9IEJ1aWxkICZXb3JraW5nIFNldAotV29ya2JlbmNoX2J1aWxkQXV0b21hdGljYWxseSA9IEJ1aWxkIEF1dG8mbWF0aWNhbGx5Ci0KLUdsb2JhbEJ1aWxkQWN0aW9uX3RleHQgPSBCdWlsZCAmQWxsCi1HbG9iYWxCdWlsZEFjdGlvbl90b29sVGlwID0gQnVpbGQgQWxsCi1HbG9iYWxCdWlsZEFjdGlvbl9yZWJ1aWxkVGV4dCA9IFJlYnVpbGQgQSZsbAotR2xvYmFsQnVpbGRBY3Rpb25fcmVidWlsZFRvb2xUaXAgPSBSZWJ1aWxkIEFsbAotR2xvYmFsQnVpbGRBY3Rpb25fYnVpbGRQcm9ibGVtcyA9IEJ1aWxkIHByb2JsZW1zCi1HbG9iYWxCdWlsZEFjdGlvbl9pbnRlcm5hbEVycm9yID0gSW50ZXJuYWwgZXJyb3I6IHswfQotR2xvYmFsQnVpbGRBY3Rpb25fYnVpbGRPcGVyYXRpb25UaXRsZSA9IEJ1aWxkaW5nIGFsbC4uLgotR2xvYmFsQnVpbGRBY3Rpb25fcmVidWlsZEFsbE9wZXJhdGlvblRpdGxlID0gUmVidWlsZGluZyBhbGwuLi4KLUdsb2JhbEJ1aWxkQWN0aW9uX2pvYlRpdGxlID0gQnVpbGRpbmcgV29ya3NwYWNlCi1HbG9iYWxCdWlsZEFjdGlvbl9CdWlsZFJ1bm5pbmdUaXRsZT1CdWlsZCBJcyBSdW5uaW5nCi1HbG9iYWxCdWlsZEFjdGlvbl9CdWlsZFJ1bm5pbmdNZXNzYWdlPUEgYnVpbGQgaXMgY3VycmVudGx5IHJ1bm5pbmcuIERvIHlvdSB3aXNoIHRvIGNhbmNlbCBpdD8KLUJ1aWxkU2V0QWN0aW9uX25vUHJvamVjdHM9VGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0IGRvZXMgbm90IGNvbnRhaW4gcHJvamVjdHMgdGhhdCBjYW4gYmUgYnVpbHQuCi1CdWlsZFNldEFjdGlvbl9ub0J1aWxkVGl0bGU9Tm90aGluZyB0byBidWlsZAotCi0KLSMgLS0tIFdpbmRvdyBNZW51IC0tLQotV29ya2JlbmNoX3dpbmRvdyA9ICZXaW5kb3cKLVdvcmtiZW5jaF9vcGVuUGVyc3BlY3RpdmUgPSAmT3BlbiBQZXJzcGVjdGl2ZQotV29ya2JlbmNoX3Nob3dWaWV3ID0gU2hvdyAmVmlldwotCi1Qcm9tcHRPbkV4aXREaWFsb2dfc2hlbGxUaXRsZSA9IENvbmZpcm0gRXhpdAotUHJvbXB0T25FeGl0RGlhbG9nX21lc3NhZ2UwID0gRXhpdCBhcHBsaWNhdGlvbj8KLVByb21wdE9uRXhpdERpYWxvZ19tZXNzYWdlMSA9IEV4aXQgezB9PwotUHJvbXB0T25FeGl0RGlhbG9nX2Nob2ljZSA9ICZBbHdheXMgZXhpdCB3aXRob3V0IHByb21wdAotCi1Xb3JrYmVuY2hfc2hvcnRjdXRzID0gTmF2aSZnYXRpb24KLVdvcmtiZW5jaF9vcGVuTmV3V2luZG93ID0gJk5ldyBXaW5kb3cKLQotCi0jIC0tLSBIZWxwIE1lbnUgLS0tCi1Xb3JrYmVuY2hfaGVscCA9ICZIZWxwCi1RdWlja1N0YXJ0X3RleHQgPSAmV2VsY29tZS4uLgotUXVpY2tTdGFydF90b29sVGlwID0gT3BlbiBhIFdlbGNvbWUgRWRpdG9yCi1RdWlja1N0YXJ0TWVzc2FnZURpYWxvZ190aXRsZSA9IFdlbGNvbWUKLVF1aWNrU3RhcnRNZXNzYWdlRGlhbG9nX21lc3NhZ2UgPSBObyBmZWF0dXJlcyB3aXRoIHF1aWNrIHN0YXJ0IGluZm9ybWF0aW9uIGFyZSBhdmFpbGFibGUKLVdlbGNvbWVQYWdlU2VsZWN0aW9uRGlhbG9nX3RpdGxlID0gV2VsY29tZQotV2VsY29tZVBhZ2VTZWxlY3Rpb25EaWFsb2dfbWVzc2FnZSA9ICZTaG93IHdlbGNvbWUgcGFnZSBmb3I6Ci1UaXBzQW5kVHJpY2tzX3RleHQgPSAmVGlwcyBhbmQgVHJpY2tzLi4uCi1UaXBzQW5kVHJpY2tzX3Rvb2xUaXAgPVRpcHMgYW5kIFRyaWNrcwotVGlwc0FuZFRyaWNrc01lc3NhZ2VEaWFsb2dfdGl0bGUgPSBUaXBzIGFuZCBUcmlja3MKLVRpcHNBbmRUcmlja3NNZXNzYWdlRGlhbG9nX21lc3NhZ2UgPSBObyBmZWF0dXJlcyB3aXRoIHRpcHMgYW5kIHRyaWNrcyBpbmZvcm1hdGlvbiBhcmUgYXZhaWxhYmxlCi1UaXBzQW5kVHJpY2tzUGFnZVNlbGVjdGlvbkRpYWxvZ190aXRsZSA9IFRpcHMgYW5kIFRyaWNrcwotVGlwc0FuZFRyaWNrc1BhZ2VTZWxlY3Rpb25EaWFsb2dfbWVzc2FnZSA9ICZTaG93IHRpcHMgYW5kIHRyaWNrcyBwYWdlIGZvcjoKLVRpcHNBbmRUcmlja3NFcnJvckRpYWxvZ190aXRsZSA9IFByb2JsZW0KLVRpcHNBbmRUcmlja3NFcnJvckRpYWxvZ19ub0hyZWYgPSBObyB0aXBzIGFuZCB0cmlja3MgaW5mb3JtYXRpb24gYXZhaWxhYmxlCi1UaXBzQW5kVHJpY2tzRXJyb3JEaWFsb2dfbm9GZWF0dXJlcyA9IE5vIGZlYXR1cmVzIHdpdGggdGlwcyBhbmQgdHJpY2tzIGluZm9ybWF0aW9uIGF2YWlsYWJsZQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBOYXZpZ2F0b3IgQWN0aW9ucwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLU9wZW5XaXRoTWVudV9kaWFsb2dUaXRsZSA9IFByb2JsZW1zIE9wZW5pbmcgRWRpdG9yCi0KLUNvcHlQcm9qZWN0QWN0aW9uX3RpdGxlID0gJkNvcHkKLUNvcHlQcm9qZWN0QWN0aW9uX3Rvb2xUaXAgPSBDb3B5IFByb2plY3QKLUNvcHlQcm9qZWN0QWN0aW9uX3Byb2dyZXNzVGl0bGUgPSBDb3B5aW5nCi1Db3B5UHJvamVjdEFjdGlvbl9jb3B5VGl0bGUgPSBDb3B5IFByb2plY3QKLUNvcHlQcm9qZWN0QWN0aW9uX2NvcHlOYW1lT25lQXJnID0gQ29weSBvZiB7MH0KLUNvcHlQcm9qZWN0QWN0aW9uX2NvcHlOYW1lVHdvQXJncyA9IENvcHkgKHswfSkgb2YgezF9Ci1Db3B5UHJvamVjdEFjdGlvbl9hbHJlYWR5RXhpc3RzID0gUHJvamVjdCAnJ3swfScnIGFscmVhZHkgZXhpc3RzLgotQ29weVByb2plY3RBY3Rpb25fY29weUZhaWxlZFRpdGxlID0gQ29weSBQcm9ibGVtcwotQ29weVByb2plY3RBY3Rpb25faW50ZXJuYWxFcnJvciA9IEludGVybmFsIGVycm9yOiB7MH0KLQotQ29weVJlc291cmNlQWN0aW9uX3RpdGxlID0gJkNvcHkKLUNvcHlSZXNvdXJjZUFjdGlvbl90b29sVGlwID0gQ29weSBSZXNvdXJjZQotQ29weVJlc291cmNlQWN0aW9uX3NlbGVjdERlc3RpbmF0aW9uID0gU2VsZWN0IHRoZSAmZGVzdGluYXRpb246Ci0KLU1vdmVQcm9qZWN0QWN0aW9uX3RleHQgPSBNbyZ2ZS4uLgotTW92ZVByb2plY3RBY3Rpb25fdG9vbFRpcCA9IE1vdmUgUHJvamVjdAotTW92ZVByb2plY3RBY3Rpb25fbW92ZVRpdGxlID0gTW92ZSBQcm9qZWN0Ci1Nb3ZlUHJvamVjdEFjdGlvbl9wcm9ncmVzc01lc3NhZ2UgPSBNb3ZpbmcKLU1vdmVQcm9qZWN0QWN0aW9uX2RpYWxvZ1RpdGxlID0gTW92ZSBQcm9ibGVtcwotTW92ZVByb2plY3RBY3Rpb25faW50ZXJuYWxFcnJvciA9IEludGVybmFsIGVycm9yOiB7MH0KLQotTW92ZVJlc291cmNlQWN0aW9uX3RleHQgPSBNbyZ2ZS4uLgotTW92ZVJlc291cmNlQWN0aW9uX3Rvb2xUaXAgPSBNb3ZlIFJlc291cmNlCi1Nb3ZlUmVzb3VyY2VBY3Rpb25fdGl0bGUgPSBDaGVjayBNb3ZlCi1Nb3ZlUmVzb3VyY2VBY3Rpb25fY2hlY2tNb3ZlTWVzc2FnZSA9ICcnezB9JycgaXMgcmVhZCBvbmx5LiBEbyB5b3Ugc3RpbGwgd2lzaCB0byBtb3ZlIGl0PwotCi1SZWFkT25seUNoZWNrX3Byb2JsZW1zID0gUmVhZCBPbmx5IENoZWNraW5nIFByb2JsZW1zCi0KLVJlbmFtZVJlc291cmNlQWN0aW9uX3RleHQgPSBSZW5hJm1lCi1SZW5hbWVSZXNvdXJjZUFjdGlvbl90b29sVGlwID0gUmVuYW1lIFJlc291cmNlCi1SZW5hbWVSZXNvdXJjZUFjdGlvbl9pbnB1dERpYWxvZ1RpdGxlID0gUmVuYW1lIFJlc291cmNlCi1SZW5hbWVSZXNvdXJjZUFjdGlvbl9pbnB1dERpYWxvZ01lc3NhZ2UgPSBFbnRlciB0aGUgbmV3IHJlc291cmNlIG5hbWU6Ci1SZW5hbWVSZXNvdXJjZUFjdGlvbl9jaGVja1RpdGxlID0gQ2hlY2sgUmVuYW1lCi1SZW5hbWVSZXNvdXJjZUFjdGlvbl9yZWFkT25seUNoZWNrID0gJyd7MH0nJyBpcyByZWFkIG9ubHkuIERvIHlvdSBzdGlsbCB3aXNoIHRvIHJlbmFtZSBpdD8KLVJlbmFtZVJlc291cmNlQWN0aW9uX3Jlc291cmNlRXhpc3RzID0gUmVzb3VyY2UgRXhpc3RzCi1SZW5hbWVSZXNvdXJjZUFjdGlvbl9uYW1lRXhpc3RzID0gQSByZXNvdXJjZSB3aXRoIHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cwotUmVuYW1lUmVzb3VyY2VBY3Rpb25fb3ZlcndyaXRlUXVlc3Rpb24gPSAnJ3swfScnIGV4aXN0cy4gRG8geW91IHdpc2ggdG8gb3ZlcndyaXRlPwotUmVuYW1lUmVzb3VyY2VBY3Rpb25fcHJvZ3Jlc3NNZXNzYWdlID0gUmVuYW1pbmcuLi4KLVJlbmFtZVJlc291cmNlQWN0aW9uX3Byb2JsZW1UaXRsZSA9IFJlbmFtZSBQcm9ibGVtcwotUmVuYW1lUmVzb3VyY2VBY3Rpb25fcHJvZ3Jlc3MgPSBSZW5hbWluZzoKLVJlbmFtZVJlc291cmNlQWN0aW9uX25hbWVNdXN0QmVEaWZmZXJlbnQgPSBZb3UgbXVzdCB1c2UgYSBkaWZmZXJlbnQgbmFtZQotUmVuYW1lUmVzb3VyY2VBY3Rpb25fcHJvYmxlbU1lc3NhZ2UgPSBQcm9ibGVtcyBvY2N1cnJlZCByZW5hbWluZyB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UuCi0KLURlbGV0ZVJlc291cmNlQWN0aW9uX3RleHQgPSAmRGVsZXRlCi1EZWxldGVSZXNvdXJjZUFjdGlvbl90b29sVGlwID0gRGVsZXRlCi1EZWxldGVSZXNvdXJjZUFjdGlvbl90aXRsZTEgPSBDb25maXJtIFJlc291cmNlIERlbGV0ZQotRGVsZXRlUmVzb3VyY2VBY3Rpb25fdGl0bGVOID0gQ29uZmlybSBNdWx0aXBsZSBSZXNvdXJjZSBEZWxldGUKLURlbGV0ZVJlc291cmNlQWN0aW9uX2NvbmZpcm0xID0gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnIGZyb20gdGhlIGZpbGUgc3lzdGVtPwotRGVsZXRlUmVzb3VyY2VBY3Rpb25fY29uZmlybU4gPSBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZXNlIHswfSByZXNvdXJjZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0/Ci1EZWxldGVSZXNvdXJjZUFjdGlvbl90aXRsZVByb2plY3QxID0gQ29uZmlybSBQcm9qZWN0IERlbGV0ZQotRGVsZXRlUmVzb3VyY2VBY3Rpb25fdGl0bGVQcm9qZWN0TiA9IENvbmZpcm0gTXVsdGlwbGUgUHJvamVjdCBEZWxldGUKLURlbGV0ZVJlc291cmNlQWN0aW9uX2NvbmZpcm1Qcm9qZWN0MSA9IEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgcHJvamVjdCAnJ3swfScnPwotRGVsZXRlUmVzb3VyY2VBY3Rpb25fY29uZmlybVByb2plY3ROID0gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGVzZSB7MH0gcHJvamVjdHM/Ci1EZWxldGVSZXNvdXJjZUFjdGlvbl9kZWxldGVDb250ZW50czEgPSAmQWxzbyBkZWxldGUgY29udGVudHMgdW5kZXIgJyd7MH0nJwotRGVsZXRlUmVzb3VyY2VBY3Rpb25fZGVsZXRlQ29udGVudHNOID0gJkFsc28gZGVsZXRlIGNvbnRlbnRzIGluIHRoZSBmaWxlIHN5c3RlbQotRGVsZXRlUmVzb3VyY2VBY3Rpb25fZG9Ob3REZWxldGVDb250ZW50cyA9ICZEbyBub3QgZGVsZXRlIGNvbnRlbnRzCi1EZWxldGVSZXNvdXJjZUFjdGlvbl9jb25maXJtTGlua2VkUmVzb3VyY2UxID0gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBsaW5rZWQgcmVzb3VyY2UgJyd7MH0nJz9cbk9ubHkgdGhlIHdvcmtzcGFjZSBsaW5rIHdpbGwgYmUgZGVsZXRlZC4gTGluayB0YXJnZXQgd2lsbCByZW1haW4gdW5jaGFuZ2VkLgotRGVsZXRlUmVzb3VyY2VBY3Rpb25fY29uZmlybUxpbmtlZFJlc291cmNlTiA9IEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlc2UgezB9IHJlc291cmNlcz9cblxuU2VsZWN0aW9uIGNvbnRhaW5zIGxpbmtlZCByZXNvdXJjZXMuXG5Pbmx5IHRoZSB3b3Jrc3BhY2UgbGlua3Mgd2lsbCBiZSBkZWxldGVkLiBMaW5rIHRhcmdldHMgd2lsbCByZW1haW4gdW5jaGFuZ2VkLgotRGVsZXRlUmVzb3VyY2VBY3Rpb25fcmVhZE9ubHlRdWVzdGlvbiA9ICcnezB9JycgaXMgcmVhZCBvbmx5LiBEbyB5b3Ugc3RpbGwgd2lzaCB0byBkZWxldGUgaXQ/Ci1EZWxldGVSZXNvdXJjZUFjdGlvbl9tZXNzYWdlVGl0bGUgPSBQcm9ibGVtcyBkZWxldGluZwotRGVsZXRlUmVzb3VyY2VBY3Rpb25fb3V0T2ZTeW5jRXJyb3IgPSBSZXNvdXJjZSBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBmaWxlIHN5c3RlbS4gUmVmcmVzaCBhbmQgdHJ5IGFnYWluLgotRGVsZXRlUmVzb3VyY2VBY3Rpb25fb3V0T2ZTeW5jUXVlc3Rpb24gPSBSZXNvdXJjZSAnJ3swfScnIGlzIG91dCBvZiBzeW5jIHdpdGggdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBkZWxldGUgaXQgYW55d2F5PwotRGVsZXRlUmVzb3VyY2VBY3Rpb25fZGVsZXRpb25FeGNlcHRpb25NZXNzYWdlPU11bHRpcGxlIHByb2JsZW1zIG9jY3VycmVkIHdoaWxlIGRlbGV0aW5nIHJlc291cmNlcy4KLURlbGV0ZVJlc291cmNlQWN0aW9uX2pvYk5hbWUgPSBEZWxldGluZyByZXNvdXJjZXMKLQotQWRkQm9va21hcmtMYWJlbCA9IEFkZCBCb28ma21hcmsuLi4KLUFkZEJvb2ttYXJrVG9vbFRpcCA9IEFkZCBCb29rbWFyawotQWRkQm9va21hcmtEaWFsb2dfdGl0bGUgPSBBZGQgQm9va21hcmsKLUFkZEJvb2ttYXJrRGlhbG9nX21lc3NhZ2UgPSBFbnRlciBib29rbWFyayBuYW1lOgotCi1BZGRUYXNrTGFiZWwgPSBBZGQgJlRhc2sKLUFkZFRhc2tUb29sVGlwID0gQWRkIFRhc2sKLQotT3BlbkZpbGVBY3Rpb25fdGV4dCA9IE9wJmVuCi1PcGVuRmlsZUFjdGlvbl90b29sVGlwID0gRWRpdCBGaWxlCi1PcGVuRmlsZUFjdGlvbl9vcGVuRmlsZVNoZWxsVGl0bGUgPSBQcm9ibGVtcyBPcGVuaW5nIEVkaXRvcgotCi1PcGVuUmVzb3VyY2VBY3Rpb25fdGV4dCA9IE9wJmVuIFByb2plY3QKLU9wZW5SZXNvdXJjZUFjdGlvbl90b29sVGlwID0gT3BlbiBQcm9qZWN0Ci1PcGVuUmVzb3VyY2VBY3Rpb25fZGlhbG9nVGl0bGUgPSBPcGVuIFByb2JsZW1zCi1PcGVuUmVzb3VyY2VBY3Rpb25fcHJvYmxlbU1lc3NhZ2UgPSBQcm9ibGVtcyBvY2N1cnJlZCBvcGVuaW5nIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMuCi1PcGVuUmVzb3VyY2VBY3Rpb25fb3BlcmF0aW9uTWVzc2FnZSA9IE9wZW5pbmcgcHJvamVjdC4uLgotCi1DbG9zZVJlc291cmNlQWN0aW9uX3RleHQgPSBDbG8mc2UgUHJvamVjdAotQ2xvc2VSZXNvdXJjZUFjdGlvbl90b29sVGlwID0gQ2xvc2UgUHJvamVjdAotQ2xvc2VSZXNvdXJjZUFjdGlvbl90aXRsZSA9IENsb3NlIFByb2JsZW1zCi1DbG9zZVJlc291cmNlQWN0aW9uX3Byb2JsZW1NZXNzYWdlID0gUHJvYmxlbXMgb2NjdXJyZWQgY2xvc2luZyB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzLgotQ2xvc2VSZXNvdXJjZUFjdGlvbl9vcGVyYXRpb25NZXNzYWdlID0gQ2xvc2luZyBwcm9qZWN0Li4uCi0KLUJ1aWxkQWN0aW9uX3RleHQgPSAmQnVpbGQgUHJvamVjdAotQnVpbGRBY3Rpb25fdG9vbFRpcCA9IEluY3JlbWVudGFsIEJ1aWxkIG9mIFNlbGVjdGVkIFByb2plY3RzCi1CdWlsZEFjdGlvbl9wcm9ibGVtTWVzc2FnZSA9IFByb2JsZW1zIG9jY3VycmVkIGJ1aWxkaW5nIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMuCi1CdWlsZEFjdGlvbl9wcm9ibGVtVGl0bGUgPSBCdWlsZCBQcm9ibGVtcwotQnVpbGRBY3Rpb25fb3BlcmF0aW9uTWVzc2FnZSA9IEJ1aWxkaW5nIHByb2plY3QuLi4KLQotUmVidWlsZEFjdGlvbl90ZXh0ID0gUmVidWlsZCBQcm8mamVjdAotUmVidWlsZEFjdGlvbl90b29sdGlwID0gRnVsbCBCdWlsZCBPZiBTZWxlY3RlZCBQcm9qZWN0cwotCi1SZWZyZXNoQWN0aW9uX3RleHQgPSBSZSZmcmVzaAotUmVmcmVzaEFjdGlvbl90b29sVGlwID0gUmVmcmVzaAotUmVmcmVzaEFjdGlvbl9wcm9ncmVzc01lc3NhZ2UgPSBSZWZyZXNoaW5nLi4uCi1SZWZyZXNoQWN0aW9uX3Byb2JsZW1UaXRsZSA9IFJlZnJlc2ggUHJvYmxlbXMKLVJlZnJlc2hBY3Rpb25fcHJvYmxlbU1lc3NhZ2UgPSBQcm9ibGVtcyBvY2N1cnJlZCByZWZyZXNoaW5nIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMuCi1SZWZyZXNoQWN0aW9uX2xvY2F0aW9uRGVsZXRlZE1lc3NhZ2UgPSBUaGUgbG9jYXRpb24gZm9yIHByb2plY3QgJyd7MH0nJyAoezF9KSBoYXMgYmVlbiBkZWxldGVkLlxuIERlbGV0ZSAnJ3swfScnIGZyb20gdGhlIHdvcmtzcGFjZT8KLVJlZnJlc2hBY3Rpb25fZGlhbG9nVGl0bGUgPSBQcm9qZWN0IGxvY2F0aW9uIGhhcyBiZWVuIGRlbGV0ZWQKLQotU2VsZWN0V29ya2luZ1NldEFjdGlvbl90ZXh0PSBTZWxlY3QgJldvcmtpbmcgU2V0Li4uCi0KLSMgLS0tIE9wZXJhdGlvbnMgLS0tCi1Db3B5UHJvamVjdE9wZXJhdGlvbl9wcm9ncmVzc1RpdGxlID0gQ29weWluZzoKLUNvcHlQcm9qZWN0T3BlcmF0aW9uX2NvcHlGYWlsZWRNZXNzYWdlID0gUHJvYmxlbXMgb2NjdXJyZWQgY29weWluZyB0aGUgcHJvamVjdC4KLUNvcHlQcm9qZWN0T3BlcmF0aW9uX2NvcHlGYWlsZWRUaXRsZSA9IENvcHkgUHJvYmxlbXMKLUNvcHlQcm9qZWN0T3BlcmF0aW9uX2ludGVybmFsRXJyb3IgPSBJbnRlcm5hbCBlcnJvcjogezB9Ci1Db3B5UHJvamVjdE9wZXJhdGlvbl9jb3B5UHJvamVjdCA9IENvcHkgUHJvamVjdAotCi1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2NvcHlGYWlsZWRUaXRsZSA9IENvcHkgUHJvYmxlbXMKLUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fcHJvYmxlbU1lc3NhZ2UgPSBQcm9ibGVtcyBvY2N1cnJlZCBjb3B5aW5nIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMuCi1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX29wZXJhdGlvblRpdGxlID0gQ29weWluZy4uLgotQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9uYW1lQ29sbGlzaW9uID0gQSByZXNvdXJjZSBuYW1lIGNvbGxpc2lvbiB3YXMgZGV0ZWN0ZWQuCi1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2ludGVybmFsRXJyb3IgPSBJbnRlcm5hbCBlcnJvcjogezB9Ci1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3Jlc291cmNlRXhpc3RzID0gUmVzb3VyY2UgRXhpc3RzCi1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX292ZXJ3cml0ZVF1ZXN0aW9uID0gezB9IGV4aXN0cy4gRG8geW91IHdpc2ggdG8gb3ZlcndyaXRlPwotQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9vdmVyd3JpdGVXaXRoRGV0YWlsc1F1ZXN0aW9uID0gUmVzb3VyY2UgZXhpc3RzLiBEbyB5b3Ugd2lzaCB0byBvdmVyd3JpdGU/XG5cbk92ZXJ3cml0ZTogezB9XG5MYXN0IG1vZGlmaWVkOiB7MX1cblxud2l0aDogezJ9XG5MYXN0IG1vZGlmaWVkOiB7M30KLUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fb3ZlcndyaXRlTWVyZ2VRdWVzdGlvbiA9ICcnezB9JycgZXhpc3RzLiBEbyB5b3Ugd2lzaCB0byBvdmVyd3JpdGU/XG5Gb2xkZXIgY29udGVudHMgd2lsbCBiZSBtZXJnZWQsIGV4aXN0aW5nIGZpbGVzIHdpbGwgYmUgb3ZlcndyaXR0ZW4uCi1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX292ZXJ3cml0ZU5vTWVyZ2VMaW5rUXVlc3Rpb24gPSAnJ3swfScnIGV4aXN0cyBhbmQgaXMgYSBsaW5rZWQgZm9sZGVyLiBEbyB5b3Ugd2lzaCB0byBkZWxldGUgdGhlIGxpbmtlZCBmb2xkZXIgYW5kIHJlcGxhY2Ugd2l0aCB0aGUgdW5saW5rZWQgZm9sZGVyP1xuRm9sZGVyIGNvbnRlbnRzIHdpbGwgbm90IGJlIG1lcmdlZCEKLUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fb3ZlcndyaXRlTm9NZXJnZU5vTGlua1F1ZXN0aW9uID0gJyd7MH0nJyBleGlzdHMgYW5kIGlzIG5vdCBhIGxpbmtlZCBmb2xkZXIuIERvIHlvdSB3aXNoIHRvIGRlbGV0ZSB0aGUgZm9sZGVyIGFuZCByZXBsYWNlIHdpdGggdGhlIGxpbmtlZCBmb2xkZXI/XG5Gb2xkZXIgY29udGVudHMgd2lsbCBub3QgYmUgbWVyZ2VkIQotQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9kZWVwQ29weVF1ZXN0aW9uID0gRG8geW91IHdpc2ggdG8gcGVyZm9ybSBhIGRlZXAgY29weSBvZiBsaW5rZWQgcmVzb3VyY2UgJyd7MH0nJz8KLUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fZGVlcE1vdmVRdWVzdGlvbiA9IERvIHlvdSB3aXNoIHRvIHBlcmZvcm0gYSBkZWVwIG1vdmUgb2YgbGlua2VkIHJlc291cmNlICcnezB9Jyc/Ci1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2NvcHlOYW1lVHdvQXJncyA9IENvcHkgKHswfSkgb2YgezF9Ci1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2NvcHlOYW1lT25lQXJnID0gQ29weSBvZiB7MH0KLUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fZGVzdGluYXRpb25BY2Nlc3NFcnJvciA9IERlc3RpbmF0aW9uIGZvbGRlciBtdXN0IGJlIGFjY2Vzc2libGUuCi1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2Rlc3RpbmF0aW9uRGVzY2VuZGVudEVycm9yID0gRGVzdGluYXRpb24gY2Fubm90IGJlIGEgZGVzY2VuZGVudCBvZiB0aGUgc291cmNlLgotQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9vdmVyd3JpdGVQcm9ibGVtID0gVGhlIGZvbGRlciAnJ3swfScnIGFscmVhZHkgZXhpc3RzIGFuZCBjYW5ub3QgYmUgb3ZlcndyaXR0ZW4gc2luY2UgaXQgY29udGFpbnMgJyd7MX0nJy4KLUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fb3ZlcndyaXRlUHJvYmxlbVRpdGxlID0gT3ZlcndyaXRlIFByb2JsZW0KLUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fcXVlc3Rpb24gPSBRdWVzdGlvbgotQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9pbXBvcnRFcnJvckRpYWxvZ1RpdGxlID0gSW1wb3J0IFByb2JsZW1zCi1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2lucHV0RGlhbG9nVGl0bGUgPSBOYW1lIENvbmZsaWN0Ci1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2lucHV0RGlhbG9nTWVzc2FnZSA9IEVudGVyIGEgbmV3IG5hbWUgZm9yICcnezB9JycKLUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fbmFtZUV4aXN0cyA9IEEgcmVzb3VyY2Ugd2l0aCB0aGF0IG5hbWUgYWxyZWFkeSBleGlzdHMKLUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fbmFtZU11c3RCZURpZmZlcmVudCA9IFlvdSBtdXN0IHVzZSBhIGRpZmZlcmVudCBuYW1lCi1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3NhbWVTb3VyY2VBbmREZXN0ID0gQ2Fubm90IGNvcHkgJyd7MH0nJy4gVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIHRoZSBzYW1lLgotQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9pbXBvcnRTYW1lU291cmNlQW5kRGVzdCA9IENhbm5vdCBpbXBvcnQgJyd7MH0nJy4gVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIHRoZSBzYW1lLgotQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9yZXNvdXJjZURlbGV0ZWQgPSBUaGUgcmVzb3VyY2UgJyd7MH0nJyBkb2VzIG5vdCBleGlzdCBvbiB0aGUgZmlsZSBzeXN0ZW0uCi1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX21pc3NpbmdQYXRoVmFyaWFibGUgPSBUaGUgcmVzb3VyY2UgJyd7MH0nJyBpcyBsaW5rZWQgdXNpbmcgYSBtaXNzaW5nIHBhdGggdmFyaWFibGUuCi1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX21pc3NpbmdMaW5rVGFyZ2V0ID0gVGhlIGxpbmsgdGFyZ2V0IGZvciBsaW5rZWQgcmVzb3VyY2UgJyd7MH0nJyBkb2VzIG5vdCBleGlzdC4KLUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fQ29weVJlc291cmNlc1Rhc2s9Q29weWluZyBSZXNvdXJjZXMKLUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb25fcGFyZW50Tm90RXF1YWwgPSBUaGUgcmVzb3VyY2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBwYXJlbnQuCi1Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX2luZm9Ob3RGb3VuZCA9IEluZm9ybWF0aW9uIGZvciB7MH0gY291bGQgbm90IGJlIHJlYWQuIFBsZWFzZSBjaGVjayB0aGUgLmxvZyBmaWxlIGZvciBkZXRhaWxzLgotQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9jb3B5X2V4Y2VwdGlvbiA9IEV4Y2VwdGlvbiBpbiB7MH0ucGVyZm9ybUNvcHkoKTogezF9OwotCi1Nb3ZlRmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3NhbWVTb3VyY2VBbmREZXN0ID0gQ2Fubm90IG1vdmUgJyd7MH0nJy4gVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIHRoZSBzYW1lLgotTW92ZUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbl9tb3ZlRmFpbGVkVGl0bGUgPSBNb3ZlIFByb2JsZW1zCi1Nb3ZlRmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX3Byb2JsZW1NZXNzYWdlID0gUHJvYmxlbXMgb2NjdXJyZWQgbW92aW5nIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMuCi1Nb3ZlRmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uX29wZXJhdGlvblRpdGxlID0gTW92aW5nLi4uCi0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgQ2FwYWJpbGl0eSBzZWxlY3Rpb24gZ3JvdXAKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Qcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwX2NhdGVnb3JpZXMgPSBDYSZ0ZWdvcmllczoKLVByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfY2FwYWJpbGl0aWVzID0gJkNhcGFiaWxpdGllczoKLVByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfZGVzY3JpcHRpb24gPSAmRGVzY3JpcHRpb246Ci1Qcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwX2dyYXlJdGVtcyA9IE5vdGUgdGhhdCBzb21lIGNoZWNrZWQgY2FwYWJpbGl0aWVzIGFwcGVhciBncmF5ZWQgb3V0IGJlY2F1c2UgdGhleSBhcmVcbnJlcXVpcmVkIGJ5IG90aGVyIGNoZWNrZWQgY2FwYWJpbGl0aWVzLgotUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9kaXNhYmxlZExhYmVsID0gRGlzYWJsZWQ6IHswfQotUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9lcnJvclRpdGxlID0gQ2FwYWJpbGl0eSBQcm9ibGVtCi1Qcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwX2Rpc2FibGVkQ2FwYWJpbGl0eSA9IFRoZSBkaXNhYmxlZCBjYXBhYmlsaXR5IGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgcHJvamVjdC4KLVByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfaW52YWxpZENhcGFiaWxpdHkgPSBUaGUgbWlzc2luZyBjYXBhYmlsaXR5IGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgcHJvamVjdC4KLVByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfbWlzc2luZ1ByZXJlcXMgPSBUaGUgezB9IGNhcGFiaWxpdHkgcmVxdWlyZXMgYSBjYXBhYmlsaXR5IHRoYXQgaXMgZGlzYWJsZWQgb3IgbWlzc2luZyAoezF9KS5cblxuVGhlIHswfSBjYXBhYmlsaXR5IGNhbm5vdCBiZSBjaGVja2VkLgotUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9yZXF1aXJlZFByZXJlcSA9IFRoZSB7MH0gY2FwYWJpbGl0eSBpcyByZXF1aXJlZCBieSB0aGUgezF9IGNhcGFiaWxpdHksIHdoaWNoIGlzIGNoZWNrZWQuXG5cblRoZSB7MH0gY2FwYWJpbGl0eSBtdXN0IHJlbWFpbiBjaGVja2VkLgotUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9yZXF1aXJlZFByZXJlcXMgPSBUaGUgezB9IGNhcGFiaWxpdHkgaXMgcmVxdWlyZWQgYnkgdGhlIGZvbGxvd2luZyBjaGVja2VkIGNhcGFiaWxpdGllczogezF9XG5cblRoZSB7MH0gY2FwYWJpbGl0eSBtdXN0IHJlbWFpbiBjaGVja2VkLgotUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9tZW1iZXJzaGlwQ29uZmxpY3QgPSBUaGUgcHJvamVjdCBjYW5ub3QgaGF2ZSBib3RoIHRoZSB7MH0gYW5kIHsxfSBjYXBhYmlsaXRpZXMgYXQgdGhlIHNhbWUgdGltZS4gVW5jaGVjayB0aGUgezF9IGNhcGFiaWxpdHkgZmlyc3QuCi1Qcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwX21lbWJlcnNoaXBQcmVyZXFDb25mbGljdCA9IFRoZSB7MH0gY2FwYWJpbGl0eSByZXF1aXJlcyB0aGUgezF9IGNhcGFiaWxpdHkuIEhvd2V2ZXIgdGhlIHByb2plY3QgY2Fubm90IGhhdmUgYm90aCB0aGUgezF9IGFuZCB7Mn0gY2FwYWJpbGl0aWVzIGF0IHRoZSBzYW1lIHRpbWUuIFVuY2hlY2sgdGhlIHsyfSBjYXBhYmlsaXR5IGZpcnN0LgotCi1DYXBhYmlsaXR5X25hbWVNaXNzaW5nID0gTWlzc2luZyAoezB9KQotCi1JQ2F0ZWdvcnlfb3RoZXIgPSBPdGhlcgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBXaXphcmRzCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1XaXphcmREYXRhVHJhbnNmZXJfZXhpc3RzUXVlc3Rpb24gPSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLiAgV291bGQgeW91IGxpa2UgdG8gb3ZlcndyaXRlIGl0PwotV2l6YXJkRGF0YVRyYW5zZmVyX292ZXJ3cml0ZU5hbWVBbmRQYXRoUXVlc3Rpb24gPSBPdmVyd3JpdGUgJyd7MH0nJyBpbiBmb2xkZXIgJyd7MX0nJz8KLVdpemFyZERhdGFUcmFuc2Zlcl9leGNlcHRpb25NZXNzYWdlID0gIEVycm9yIG9jY3VycmVkIGR1cmluZyBvcGVyYXRpb246IHswfQotV2l6YXJkVHJhbnNmZXJQYWdlX3NlbGVjdFR5cGVzID0gU2VsZWN0ICZUeXBlcy4uLgotV2l6YXJkVHJhbnNmZXJQYWdlX3NlbGVjdEFsbCA9ICZTZWxlY3QgQWxsCi1XaXphcmRUcmFuc2ZlclBhZ2VfZGVzZWxlY3RBbGwgPSAmRGVzZWxlY3QgQWxsCi0KLU5ld1Byb2plY3RXaXphcmRfd2luZG93VGl0bGUgPSBOZXcgQ29uZmlndXJhYmxlIFByb2plY3QKLU5ld1Byb2plY3RXaXphcmRfdGl0bGUgPSBQcm9qZWN0Ci1OZXdQcm9qZWN0V2l6YXJkX2Vycm9yVGl0bGUgPSBOZXcgUHJvamVjdCBQcm9ibGVtcwotTmV3UHJvamVjdFdpemFyZF9pbnZhbGlkQ2FwYWJpbGl0aWVzID0gVGhlIHJlcXVlc3RlZCBncm91cCBvZiBjYXBhYmlsaXRpZXMgaXMgaW52YWxpZC4KLU5ld1Byb2plY3RXaXphcmRfbm9XaXphcmQgPSBUaGUgY3VycmVudCBzdGVwLCB7MH0sIGNvdWxkIG5vdCBiZSBzdGFydGVkLiBUaGlzIHdpemFyZCB3aWxsIGJlIGNsb3NlZC5cblxuVGhlIHByb2plY3Qgd2lsbCBub3QgYmUgY29uZmlndXJlZCBjb3JyZWN0bHkuIE9wZW4gdGhlIHByb2plY3QnJ3MgcHJvcGVydGllcyB0byBhZGQgbWlzc2luZyBjYXBhYmlsaXRpZXMuCi0KLUNyZWF0ZVByb2plY3RXaXphcmRfZXJyb3JUaXRsZSA9IENyZWF0aW9uIFByb2JsZW1zCi1DcmVhdGVQcm9qZWN0V2l6YXJkX2ludGVybmFsRXJyb3IgPSBJbnRlcm5hbCBlcnJvcjogezB9Ci1DcmVhdGVQcm9qZWN0V2l6YXJkX2Nhc2VWYXJpYW50RXhpc3RzRXJyb3IgPSBUaGUgcHJvamVjdCBjb250ZW50cyBkaXJlY3Rvcnkgc3BlY2lmaWVkIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciBwcm9qZWN0LiBQbGVhc2UgZW50ZXIgYSBuZXcgcHJvamVjdCBjb250ZW50cyBkaXJlY3RvcnkuCi0KLVJlbW92ZUNhcGFiaWxpdHlXaXphcmRfZXJyb3JNZXNzYWdlID0gUmVtb3ZlIENhcGFiaWxpdHkgUHJvYmxlbQotUmVtb3ZlQ2FwYWJpbGl0eVdpemFyZF9pbnRlcm5hbEVycm9yID0gSW50ZXJuYWwgZXJyb3I6IHswfQotCi1XaXphcmROZXdQcm9qZWN0Q2FwYWJpbGl0eVBhZ2VfZGVzY3JpcHRpb24gPSBDaG9vc2UgcHJvamVjdCdzIGNhcGFiaWxpdGllcwotV2l6YXJkTmV3UHJvamVjdENhcGFiaWxpdHlQYWdlX25vQ2FwYWJpbGl0aWVzID0gVGhlcmUgYXJlIG5vIGNhcGFiaWxpdGllcyBhdmFpbGFibGUgdG8gY2hvb3NlIGZyb20uCi1XaXphcmRQcm9qZWN0UmV2aWV3UGFnZV9kZXNjcmlwdGlvbiA9IFJldmlldyBwcm9qZWN0Ci1XaXphcmRQcm9qZWN0Q29uZmlndXJlUGFnZV9kZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSBwcm9qZWN0J3MgY2FwYWJpbGl0eQotCi1VcGRhdGVQcm9qZWN0Q2FwYWJpbGl0eVdpemFyZF93aW5kb3dUaXRsZSA9IFVwZGF0ZSBQcm9qZWN0Ci1VcGRhdGVQcm9qZWN0Q2FwYWJpbGl0eVdpemFyZF90aXRsZSA9IFByb2plY3QKLVVwZGF0ZVByb2plY3RDYXBhYmlsaXR5V2l6YXJkX2Vycm9yVGl0bGUgPSBVcGRhdGUgUHJvamVjdCBQcm9ibGVtcwotVXBkYXRlUHJvamVjdENhcGFiaWxpdHlXaXphcmRfbm9XaXphcmQgPSBUaGUgY3VycmVudCBzdGVwLCB7MH0sIGNvdWxkIG5vdCBiZSBzdGFydGVkLiBUaGlzIHdpemFyZCB3aWxsIGJlIGNsb3NlZC5cblxuVGhlIHByb2plY3Qgd2lsbCBub3QgYmUgY29uZmlndXJlZCBjb3JyZWN0bHkuCi0KLVdpemFyZFN0ZXBHcm91cF9zdGVwc0xhYmVsID0gJlN0ZXBzOgotTXVsdGlTdGVwUmV2aWV3V2l6YXJkUGFnZV9kZXRhaWxzTGFiZWwgPSAmRGV0YWlsczoKLU11bHRpU3RlcFJldmlld1dpemFyZFBhZ2VfaW5zdHJ1Y3Rpb25OZXh0TGFiZWwgPSBSZXZpZXcgc3RlcHMgYW5kIHByZXNzIE5leHQgYnV0dG9uIHdoZW4gcmVhZHkgdG8gY29udGludWUuCi1NdWx0aVN0ZXBSZXZpZXdXaXphcmRQYWdlX2luc3RydWN0aW9uRmluaXNoTGFiZWwgPSBSZXZpZXcgc3RlcHMgYW5kIHByZXNzIEZpbmlzaCBidXR0b24gd2hlbiByZWFkeSB0byBjb250aW51ZS4KLQotTXVsdGlTdGVwV2l6YXJkX2ZpbmlzaExhYmVsID0gJkZpbmlzaCBTdGVwCi0KLUNyZWF0ZVByb2plY3RTdGVwX2xhYmVsID0gQ3JlYXRlIFByb2plY3QKLUNyZWF0ZVByb2plY3RTdGVwX2RldGFpbHMgPSBUaGlzIHN0ZXAgd2lsbCBjcmVhdGUgYSBuZXcgcHJvamVjdCByZXNvdXJjZSBuYW1lZCAnJ3swfScnLgotCi1JbnN0YWxsQ2FwYWJpbGl0eVN0ZXBfbGFiZWwgPSBBZGQgezB9Ci0KLVJlbW92ZUNhcGFiaWxpdHlTdGVwX2xhYmVsID0gUmVtb3ZlIHswfQotUmVtb3ZlQ2FwYWJpbGl0eVN0ZXBfZGVmYXVsdERlc2NyaXB0aW9uMCA9IFJlbW92ZXMgdGhlIHswfSBjYXBhYmlsaXR5IGZyb20gdGhlIHByb2plY3QuCi1SZW1vdmVDYXBhYmlsaXR5U3RlcF9kZWZhdWx0RGVzY3JpcHRpb24xID0gUmVtb3ZlcyB0aGUgezB9IGNhcGFiaWxpdHkgZnJvbSB0aGUgcHJvamVjdCwgYWxvbmcgd2l0aCB0aGUgezF9IGNhcGFiaWxpdHkuCi1SZW1vdmVDYXBhYmlsaXR5U3RlcF9kZWZhdWx0RGVzY3JpcHRpb24yID0gUmVtb3ZlcyB0aGUgezB9IGNhcGFiaWxpdHkgZnJvbSB0aGUgcHJvamVjdCwgYWxvbmcgd2l0aCB0aGUgZm9sbG93aW5nIGNhcGFiaWxpdGllczogezF9LgotCi1Qcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2VfZGVzY3JpcHRpb24gPSBDaG9vc2UgYSBjYXBhYmlsaXR5Ci1Qcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2VfdGl0bGUgPSBTZWxlY3QKLVByb2plY3RDYXBhYmlsaXR5U2ltcGxlU2VsZWN0aW9uUGFnZV93aW5kb3dUaXRsZSA9IEFkZCBDYXBhYmlsaXR5Ci1Qcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2VfY2FwYWJpbGl0eUV4aXN0ID0gVGhlIHByb2plY3QgYWxyZWFkeSBoYXMgdGhlIGNob3NlbiBjYXBhYmlsaXR5LgotUHJvamVjdENhcGFiaWxpdHlTaW1wbGVTZWxlY3Rpb25QYWdlX2NhcGFiaWxpdHlSZXF1aXJlZCA9IFRoZSBjaG9zZW4gY2FwYWJpbGl0eSByZXF1aXJlcyB0aGUgezB9IGNhcGFiaWxpdHkgdG8gYmUgYWRkZWQgZmlyc3QuCi1Qcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2VfY2FwYWJpbGl0eU1pc3NpbmcgPSBUaGUgY2hvc2VuIGNhcGFiaWxpdHkgcmVxdWlyZXMgYSBtaXNzaW5nIGNhcGFiaWxpdHkgKHswfSkuCi1Qcm9qZWN0Q2FwYWJpbGl0eVNpbXBsZVNlbGVjdGlvblBhZ2VfY2FwYWJpbGl0eVNldCA9IFRoZSBjaG9zZW4gY2FwYWJpbGl0eSBjYW5ub3QgYmUgYWRkZWQgdW50aWwgdGhlIHswfSBjYXBhYmlsaXR5IGlzIHJlbW92ZWQuCi0KLSMgLS0tIEltcG9ydCAtLS0KLVdpemFyZEltcG9ydFBhZ2Vfc3BlY2lmeVByb2plY3QgPSBTcGVjaWZ5IGEgcHJvamVjdAotV2l6YXJkSW1wb3J0UGFnZV9zcGVjaWZ5Rm9sZGVyID0gUGxlYXNlIHNwZWNpZnkgZm9sZGVyCi1XaXphcmRJbXBvcnRQYWdlX2ZvbGRlck11c3RFeGlzdCA9IEZvbGRlciBtdXN0IGJlIGFjY2Vzc2libGUuCi1XaXphcmRJbXBvcnRQYWdlX2Vycm9yRGlhbG9nVGl0bGUgPSBJbXBvcnQgUHJvYmxlbXMKLVdpemFyZEltcG9ydFBhZ2VfZm9sZGVyID0gSW50byBmbyZsZGVyOgotV2l6YXJkSW1wb3J0UGFnZV9icm93c2VMYWJlbCA9IEJyb3dzZS4uLgotV2l6YXJkSW1wb3J0UGFnZV9icm93c2UyID0gQnJvJndzZS4uLgotV2l6YXJkSW1wb3J0UGFnZV9zZWxlY3RGb2xkZXJMYWJlbCA9IFNlbGVjdCBhIGZvbGRlciB0byBpbXBvcnQgaW50by4KLVdpemFyZEltcG9ydFBhZ2Vfc2VsZWN0Rm9sZGVyVGl0bGUgPSBJbXBvcnQgaW50byBGb2xkZXIKLVdpemFyZEltcG9ydFBhZ2VfZGVzdGluYXRpb25MYWJlbCA9IFNlbGVjdCB0aGUgZGVzdGluYXRpb24gZm9yIGltcG9ydGVkIHJlc291cmNlczoKLVdpemFyZEltcG9ydFBhZ2Vfb3B0aW9ucyA9IE9wdGlvbnMKLVdpemFyZEltcG9ydFBhZ2VfcHJvamVjdE5vdEV4aXN0ID0gRGVzdGluYXRpb24gcHJvamVjdCBkb2VzIG5vdCBleGlzdC4KLVdpemFyZEltcG9ydFBhZ2VfaW1wb3J0T25SZWNlaXZlciA9IFNvdXJjZSBpcyBpbiB0aGUgaGllcmFyY2h5IG9mIHRoZSBkZXN0aW5hdGlvbi4KLVdpemFyZEltcG9ydFBhZ2Vfbm9PcGVuUHJvamVjdHMgPSBDYW5ub3QgaW1wb3J0IGludG8gYSB3b3Jrc3BhY2Ugd2l0aCBubyBvcGVuIHByb2plY3RzLiBQbGVhc2UgY3JlYXRlIGEgcHJvamVjdCBiZWZvcmUgaW1wb3J0aW5nLgotV2l6YXJkSW1wb3J0UGFnZV91bmRlZmluZWRQYXRoVmFyaWFibGUgPSBEZXN0aW5hdGlvbiBmb2xkZXIgbG9jYXRpb24gaXMgYmFzZWQgb24gYW4gdW5kZWZpbmVkIHBhdGggdmFyaWFibGUuCi1XaXphcmRJbXBvcnRQYWdlX2NvbnRhaW5lck5vdEV4aXN0ID0gRGVzdGluYXRpb24gZm9sZGVyIGRvZXMgbm90IGV4aXN0LgotCi0jIC0tLSBFeHBvcnQgLS0tCi1XaXphcmRFeHBvcnRQYWdlX2Vycm9yRGlhbG9nVGl0bGUgPSBFeHBvcnQgUHJvYmxlbXMKLVdpemFyZEV4cG9ydFBhZ2VfbXVzdEV4aXN0TWVzc2FnZSA9IFJlc291cmNlIG11c3QgZXhpc3QuCi1XaXphcmRFeHBvcnRQYWdlX211c3RCZUFjY2Vzc2libGVNZXNzYWdlID0gUmVzb3VyY2UgbXVzdCBiZSBhY2Nlc3NpYmxlLgotV2l6YXJkRXhwb3J0UGFnZV9kZXRhaWxzTWVzc2FnZSA9IEFsbCBmaWxlIHJlc291cmNlcyBtYXRjaGluZyB0aGlzIGNyaXRlcmlvbgotV2l6YXJkRXhwb3J0UGFnZV93aGF0TGFiZWwgPSBTZWxlY3QgdGhlIHJlc291cmNlcyB0byAmZXhwb3J0OgotV2l6YXJkRXhwb3J0UGFnZV93aGVyZUxhYmVsID0gU2VsZWN0IHRoZSBleHBvcnQgZGVzdGluYXRpb246Ci1XaXphcmRFeHBvcnRQYWdlX29wdGlvbnMgPSBPcHRpb25zCi1XaXphcmRFeHBvcnRQYWdlX3NlbGVjdGlvbkRpYWxvZ01lc3NhZ2UgPSBTZWxlY3QgdGhlIHJlc291cmNlIHR5cGVzIHRvIGV4cG9ydC4KLVdpemFyZEV4cG9ydFBhZ2VfcmVzb3VyY2VUeXBlRGlhbG9nID0gUmVzb3VyY2UgVHlwZSBTZWxlY3Rpb24KLVdpemFyZEV4cG9ydFBhZ2VfZm9sZGVyID0gRm8mbGRlcjoKLVdpemFyZEV4cG9ydFBhZ2VfYnJvd3NlID0gQnJvd3NlLi4uCi1XaXphcmRFeHBvcnRQYWdlX2FsbFR5cGVzID0gQWxsIHR5cGVzCi1XaXphcmRFeHBvcnRQYWdlX3NwZWNpZmljVHlwZXMgPSBTcGVjaWZpYyB0eXBlczoKLVdpemFyZEV4cG9ydFBhZ2VfZWRpdCA9IEVkaXQuLi4KLVdpemFyZEV4cG9ydFBhZ2VfZGV0YWlscyA9IERldGFpbHMuLi4KLVdpemFyZEV4cG9ydFBhZ2Vfc2VsZWN0UmVzb3VyY2VzVGl0bGUgPSBTZWxlY3QgdGhlIHJlc291cmNlcyB0byBleHBvcnQuCi1XaXphcmRFeHBvcnRQYWdlX29uZVJlc291cmNlU2VsZWN0ZWQgPSAxIHJlc291cmNlIHNlbGVjdGVkCi1XaXphcmRFeHBvcnRQYWdlX3NlbGVjdFJlc291cmNlc1RvRXhwb3J0ID0gU2VsZWN0IHRoZSByZXNvdXJjZSB0byBleHBvcnQuCi1XaXphcmRFeHBvcnRQYWdlX2ludGVybmFsRXJyb3JUaXRsZSA9IEludGVybmFsIGVycm9yCi1XaXphcmRFeHBvcnRQYWdlX3Jlc291cmNlQ291bnRNZXNzYWdlID0gezB9IHJlc291cmNlcyBzZWxlY3RlZAotCi0KLSMgLS0tIE5ldyBFeGFtcGxlIC0tLQotTmV3RXhhbXBsZV90aXRsZSA9IE5ldyBFeGFtcGxlCi0KLSMgLS0tIE5ldyBQcm9qZWN0IC0tLQotV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBwcm9qZWN0Ci1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2xvY2F0aW9uRXJyb3IgPSBJbnZhbGlkIHByb2plY3QgY29udGVudHMgZGlyZWN0b3J5Ci1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2RlZmF1bHRMb2NhdGlvbkVycm9yID0gUHJvamVjdCBjb250ZW50cyBjYW5ub3QgYmUgaW5zaWRlIHdvcmtzcGFjZSBkaXJlY3RvcnkKLVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfcHJvamVjdE5hbWVFbXB0eSA9IFByb2plY3QgbmFtZSBtdXN0IGJlIHNwZWNpZmllZAotV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9wcm9qZWN0TG9jYXRpb25FbXB0eSA9IFByb2plY3QgY29udGVudHMgZGlyZWN0b3J5IG11c3QgYmUgc3BlY2lmaWVkCi1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3RFeGlzdHNNZXNzYWdlID0gQSBwcm9qZWN0IHdpdGggdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UuCi1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3RMb2NhdGlvbkV4aXN0c01lc3NhZ2UgPSBBbm90aGVyIHByb2plY3QgZXhpc3RzIGF0IHRoZSBzcGVjaWZpZWQgY29udGVudCBkaXJlY3RvcnkuCi1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3RDb250ZW50c0xhYmVsID0gUHJvamVjdCBjb250ZW50czoKLVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfcHJvamVjdENvbnRlbnRzR3JvdXBMYWJlbCA9IFByb2plY3QgY29udGVudHMKLVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfdXNlRGVmYXVsdExhYmVsID0gVXNlICZkZWZhdWx0Ci1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX25hbWVMYWJlbCA9ICZQcm9qZWN0IG5hbWU6Ci1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2RpcmVjdG9yeUxhYmVsID0gU2VsZWN0IHRoZSBwcm9qZWN0IGNvbnRlbnRzIGRpcmVjdG9yeS4KLVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfbG9jYXRpb25MYWJlbCA9IERpcmVjdG9yJnk6Ci1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2Jyb3dzZUxhYmVsID0gQiZyb3dzZS4uLgotV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZXNfdGl0bGUgPSAmUmVmZXJlbmNlZCBwcm9qZWN0czoKLQotIyAtLS0gTmV3IEZvbGRlciAtLS0KLVdpemFyZE5ld0ZvbGRlck1haW5QYWdlX2ZvbGRlck5hbWUgPSBGb2xkZXIgJm5hbWU6Ci1XaXphcmROZXdGb2xkZXJNYWluUGFnZV9mb2xkZXJMYWJlbCA9IGZvbGRlcgotV2l6YXJkTmV3Rm9sZGVyTWFpblBhZ2VfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgZm9sZGVyIHJlc291cmNlLgotV2l6YXJkTmV3Rm9sZGVyQ3JlYXRpb25QYWdlX3Byb2dyZXNzID0gQ3JlYXRpbmcKLVdpemFyZE5ld0ZvbGRlckNyZWF0aW9uUGFnZV9lcnJvclRpdGxlID0gQ3JlYXRpb24gUHJvYmxlbXMKLVdpemFyZE5ld0ZvbGRlckNyZWF0aW9uUGFnZV9pbnRlcm5hbEVycm9yVGl0bGUgPSBDcmVhdGlvbiBwcm9ibGVtcwotV2l6YXJkTmV3Rm9sZGVyX2ludGVybmFsRXJyb3IgPSBJbnRlcm5hbCBlcnJvcjogezB9Ci0KLSMgLS0tIE5ldyBGaWxlIC0tLQotV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZV9wcm9ncmVzcyA9IENyZWF0aW5nCi1XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlX2Vycm9yVGl0bGUgPSBDcmVhdGlvbiBQcm9ibGVtcwotV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZV9maWxlTGFiZWwgPSBGaWxlIG5hJm1lOgotV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZV9maWxlID0gZmlsZQotV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZV9pbnRlcm5hbEVycm9yVGl0bGUgPSBDcmVhdGlvbiBwcm9ibGVtcwotV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZV9pbnRlcm5hbEVycm9yTWVzc2FnZSA9IEludGVybmFsIGVycm9yOiB7MH0KLQotIyAtLS0gTGlua2VkIFJlc291cmNlIC0tLQotV2l6YXJkTmV3TGlua1BhZ2VfbGlua0ZpbGVCdXR0b24gPSAmTGluayB0byBmaWxlIG9uIHRoZSBmaWxlIHN5c3RlbQotV2l6YXJkTmV3TGlua1BhZ2VfbGlua0ZvbGRlckJ1dHRvbiA9ICZMaW5rIHRvIGZvbGRlciBvbiB0aGUgZmlsZSBzeXN0ZW0KLVdpemFyZE5ld0xpbmtQYWdlX2Jyb3dzZUJ1dHRvbiA9ICZCcm93c2UuLi4KLVdpemFyZE5ld0xpbmtQYWdlX3ZhcmlhYmxlc0J1dHRvbiA9ICZWYXJpYWJsZXMuLi4KLVdpemFyZE5ld0xpbmtQYWdlX3RhcmdldFNlbGVjdGlvbkxhYmVsID0gU2VsZWN0IHRoZSBsaW5rIHRhcmdldC4KLVdpemFyZE5ld0xpbmtQYWdlX2xpbmtUYXJnZXRFbXB0eSA9IExpbmsgdGFyZ2V0IG11c3QgYmUgc3BlY2lmaWVkCi1XaXphcmROZXdMaW5rUGFnZV9saW5rVGFyZ2V0SW52YWxpZCA9IExpbmsgdGFyZ2V0IG5hbWUgaXMgaW52YWxpZAotV2l6YXJkTmV3TGlua1BhZ2VfbGlua1RhcmdldExvY2F0aW9uSW52YWxpZCA9IExpbmsgdGFyZ2V0IGxvY2F0aW9uIGlzIGludmFsaWQKLVdpemFyZE5ld0xpbmtQYWdlX2xpbmtUYXJnZXROb25FeGlzdGVudCA9IExpbmsgdGFyZ2V0IGRvZXMgbm90IGV4aXN0Ci1XaXphcmROZXdMaW5rUGFnZV9saW5rVGFyZ2V0Tm90RmlsZSA9IExpbmsgdGFyZ2V0IG11c3QgYmUgYSBmaWxlCi1XaXphcmROZXdMaW5rUGFnZV9saW5rVGFyZ2V0Tm90Rm9sZGVyID0gTGluayB0YXJnZXQgbXVzdCBiZSBhIGZvbGRlcgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBQcmVmZXJlbmNlIFBhZ2VzCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUHJlZmVyZW5jZV9ub3RlID0gTm90ZToKLQotIyAtLS0gV29ya2JlbmNoIC0tLQotV29ya2JlbmNoUHJlZmVyZW5jZV9lbmNvZGluZyA9ICZUZXh0IGZpbGUgZW5jb2RpbmcKLVdvcmtiZW5jaFByZWZlcmVuY2VfZGVmYXVsdEVuY29kaW5nID0gJkRlZmF1bHQgKHswfSkKLVdvcmtiZW5jaFByZWZlcmVuY2Vfb3RoZXJFbmNvZGluZyA9ICZPdGhlcjoKLVdvcmtiZW5jaFByZWZlcmVuY2VfdW5zdXBwb3J0ZWRFbmNvZGluZyA9IFRoZSBzZWxlY3RlZCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkLgotCi1Xb3JrYmVuY2hQcmVmZXJlbmNlX2VuY29kaW5nX2VuY29kaW5nTWVzc2FnZSA9IEJ5dGUgT3JkZXIgTWFyayBpcyB7MH0KLQotIyAtLS1Xb3Jrc3BhY2UgCi1JREVXb3Jrc3BhY2VQcmVmZXJlbmNlX2F1dG9idWlsZCA9ICZCdWlsZCBhdXRvbWF0aWNhbGx5Ci1JREVXb3Jrc3BhY2VQcmVmZXJlbmNlX2F1dG9idWlsZFRvb2xUaXAgPSBCdWlsZCBhdXRvbWF0aWNhbGx5IG9uIHJlc291cmNlIG1vZGlmaWNhdGlvbgotSURFV29ya3NwYWNlUHJlZmVyZW5jZV9zYXZlUHJpb3JUb0J1aWxkaW5nPSBTYXZlIGF1dG8mbWF0aWNhbGx5IGJlZm9yZSBidWlsZAotSURFV29ya3NwYWNlUHJlZmVyZW5jZV9zYXZlUHJpb3JUb0J1aWxkaW5nVG9vbFRpcD0gU2F2ZSBtb2RpZmllZCByZXNvdXJjZXMgYXV0b21hdGljYWxseSBiZWZvcmUgbWFudWFsIGJ1aWxkCi1JREVXb3Jrc3BhY2VQcmVmZXJlbmNlX1JlZnJlc2hCdXR0b25UZXh0PSZSZWZyZXNoIGF1dG9tYXRpY2FsbHkKLUlERVdvcmtzcGFjZVByZWZlcmVuY2VfUmVmcmVzaEJ1dHRvblRvb2xUaXA9QXV0b21hdGljYWxseSByZWZyZXNoIGV4dGVybmFsIHdvcmtzcGFjZSBjaGFuZ2VzCi1JREVXb3Jrc3BhY2VQcmVmZXJlbmNlX2ZpbGVMaW5lRGVsaW1pdGVyPU5ldyB0ZXh0ICZmaWxlIGxpbmUgZGVsaW1pdGVyCi1JREVXb3Jrc3BhY2VQcmVmZXJlbmNlX2RlZmF1bHRMaW5lRGVsaW09RCZlZmF1bHQKLUlERVdvcmtzcGFjZVByZWZlcmVuY2VfZGVmYXVsdExpbmVEZWxpbVByb2o9SW5oJmVyaXRlZCBmcm9tIGNvbnRhaW5lcgotSURFV29ya3NwYWNlUHJlZmVyZW5jZV9vdGhlckxpbmVEZWxpbT0gT3QmaGVyOgotIyAtLS0gTGlua2VkIFJlc291cmNlcyAtLS0KLUxpbmtlZFJlc291cmNlc1ByZWZlcmVuY2VfZXhwbGFuYXRpb24gPSBQYXRoIHZhcmlhYmxlcyBzcGVjaWZ5IGxvY2F0aW9ucyBpbiB0aGUgZmlsZSBzeXN0ZW0uIFRoZSBsb2NhdGlvbnMgb2YgbGlua2VkIHJlc291cmNlc1xubWF5IGJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGVzZSBwYXRoIHZhcmlhYmxlcy4KLUxpbmtlZFJlc291cmNlc1ByZWZlcmVuY2VfZW5hYmxlTGlua2VkUmVzb3VyY2VzID0gJkVuYWJsZSBsaW5rZWQgcmVzb3VyY2VzCi1MaW5rZWRSZXNvdXJjZXNQcmVmZXJlbmNlX2xpbmtlZFJlc291cmNlc1dhcm5pbmdUaXRsZSA9IEVuYWJsZWQgTGlua2VkIFJlc291cmNlcwotTGlua2VkUmVzb3VyY2VzUHJlZmVyZW5jZV9saW5rZWRSZXNvdXJjZXNXYXJuaW5nTWVzc2FnZSA9IFlvdSBoYXZlIGVuYWJsZWQgYSBmZWF0dXJlIHdoaWNoIG1heSBnaXZlIHJpc2UgdG8gaW5jb21wYXRpYmlsaXRpZXMgaWYgcHJvamVjdHMgYXJlIHNoYXJlZCBieSB1c2VycyBvZiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHdvcmtiZW5jaC4gIFBsZWFzZSBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGRldGFpbHMuCi0KLSMgVGhlIGZvbGxvd2luZyBzaXgga2V5cyBhcmUgbWFya2VkIGFzIHVudXNlZCBieSB0aGUgTkxTIHNlYXJjaCwgYnV0IHRoZXkgYXJlIGluZGlyZWN0bHkgdXNlZAotIyBhbmQgc2hvdWxkIGJlIHJlbW92ZWQuCi1QYXRoVmFyaWFibGVEaWFsb2dfc2hlbGxUaXRsZV9uZXdWYXJpYWJsZSA9IE5ldyBWYXJpYWJsZQotUGF0aFZhcmlhYmxlRGlhbG9nX3NoZWxsVGl0bGVfZXhpc3RpbmdWYXJpYWJsZSA9IEVkaXQgVmFyaWFibGUKLVBhdGhWYXJpYWJsZURpYWxvZ19kaWFsb2dUaXRsZV9uZXdWYXJpYWJsZSA9IERlZmluZSBhIE5ldyBQYXRoIFZhcmlhYmxlCi1QYXRoVmFyaWFibGVEaWFsb2dfZGlhbG9nVGl0bGVfZXhpc3RpbmdWYXJpYWJsZSA9IEVkaXQgYW4gRXhpc3RpbmcgUGF0aCBWYXJpYWJsZQotUGF0aFZhcmlhYmxlRGlhbG9nX21lc3NhZ2VfbmV3VmFyaWFibGUgPSBFbnRlciBhIG5ldyB2YXJpYWJsZSBuYW1lIGFuZCBpdHMgYXNzb2NpYXRlZCBsb2NhdGlvbi4KLVBhdGhWYXJpYWJsZURpYWxvZ19tZXNzYWdlX2V4aXN0aW5nVmFyaWFibGUgPSBFZGl0IHZhcmlhYmxlJ3MgbmFtZSBhbmQgcGF0aCB2YWx1ZS4KLQotUGF0aFZhcmlhYmxlRGlhbG9nX3ZhcmlhYmxlTmFtZSA9ICZOYW1lOgotUGF0aFZhcmlhYmxlRGlhbG9nX3ZhcmlhYmxlVmFsdWUgPSAmTG9jYXRpb246Ci1QYXRoVmFyaWFibGVEaWFsb2dfdmFyaWFibGVOYW1lRW1wdHlNZXNzYWdlID0gWW91IG11c3QgcHJvdmlkZSBhIHZhcmlhYmxlIG5hbWUuCi1QYXRoVmFyaWFibGVEaWFsb2dfdmFyaWFibGVWYWx1ZUVtcHR5TWVzc2FnZSA9IFlvdSBtdXN0IHByb3ZpZGUgYSBmaWxlIG9yIGZvbGRlciBwYXRoIGFzIHZhcmlhYmxlIHZhbHVlLgotUGF0aFZhcmlhYmxlRGlhbG9nX3ZhcmlhYmxlVmFsdWVJbnZhbGlkTWVzc2FnZSA9IFRoZSBwcm92aWRlZCB2YWx1ZSBpcyBub3QgYSB2YWxpZCBwYXRoLgotUGF0aFZhcmlhYmxlRGlhbG9nX2ZpbGUgPSAmRmlsZS4uLgotUGF0aFZhcmlhYmxlRGlhbG9nX2ZvbGRlciA9IEYmb2xkZXIuLi4KLVBhdGhWYXJpYWJsZURpYWxvZ19zZWxlY3RGaWxlVGl0bGUgPSBGaWxlIHNlbGVjdGlvbgotUGF0aFZhcmlhYmxlRGlhbG9nX3NlbGVjdEZvbGRlclRpdGxlID0gRm9sZGVyIHNlbGVjdGlvbgotUGF0aFZhcmlhYmxlRGlhbG9nX3NlbGVjdEZvbGRlck1lc3NhZ2UgPSBTcGVjaWZ5IHRoZSBmb2xkZXIgdG8gYmUgcmVwcmVzZW50ZWQgYnkgdGhlIHZhcmlhYmxlLgotUGF0aFZhcmlhYmxlRGlhbG9nX3ZhcmlhYmxlQWxyZWFkeUV4aXN0c01lc3NhZ2UgPSBUaGlzIHZhcmlhYmxlIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuCi1QYXRoVmFyaWFibGVEaWFsb2dfcGF0aElzUmVsYXRpdmVNZXNzYWdlID0gUGF0aCBtdXN0IGJlIGFic29sdXRlLgotUGF0aFZhcmlhYmxlRGlhbG9nX3BhdGhEb2VzTm90RXhpc3RNZXNzYWdlID0gUGF0aCBkb2VzIG5vdCBleGlzdC4KLQotIyAtLS0gTG9jYWwgSGlzdG9yeSAtLS0KLUZpbGVIaXN0b3J5X2xvbmdldml0eSA9IERheXMgdG8gJmtlZXAgZmlsZXM6Ci1GaWxlSGlzdG9yeV9lbnRyaWVzID0gTWF4aW11bSAmZW50cmllcyBwZXIgZmlsZToKLUZpbGVIaXN0b3J5X2Rpc2tTcGFjZSA9ICZNYXhpbXVtIGZpbGUgc2l6ZSAoTUIpOgotRmlsZUhpc3RvcnlfbXVzdEJlUG9zaXRpdmUgPSBWYWx1ZXMgbXVzdCBiZSBwb3NpdGl2ZQotRmlsZUhpc3RvcnlfaW52YWxpZCA9IEludmFsaWQgdmFsdWU6IHswfQotRmlsZUhpc3RvcnlfZXhjZXB0aW9uU2F2aW5nID0gSW50ZXJuYWwgZXJyb3Igc2F2aW5nIGxvY2FsIGhpc3RvcnkKLUZpbGVIaXN0b3J5X2Fib3ZlTWF4RW50cmllcyA9IEFib3ZlIG1heGltdW0gRW50cmllcyBwZXIgZmlsZTogezB9Ci1GaWxlSGlzdG9yeV9hYm92ZU1heEZpbGVTaXplID0gQWJvdmUgbWF4aW11bSBmaWxlIHNpemUgdmFsdWU6IHswfQotRmlsZUhpc3RvcnlfcmVzdGFydE5vdGUgPSBUaGUgJ01heGltdW0gZW50cmllcyBwZXIgZmlsZScgYW5kICdEYXlzIHRvIGtlZXAgZmlsZXMnXG52YWx1ZXMgYXJlIG9ubHkgYXBwbGllZCBvbiByZXN0YXJ0LgotCi0jIC0tLSBQZXJzcGVjdGl2ZXMgLS0tCi1Qcm9qZWN0U3dpdGNoUGVyc3BlY3RpdmVNb2RlX29wdGlvbnNUaXRsZSA9IE9wZW4gdGhlIGFzc29jaWF0ZWQgcGVyc3BlY3RpdmUgd2hlbiBjcmVhdGluZyBhIG5ldyBwcm9qZWN0Ci1Qcm9qZWN0U3dpdGNoUGVyc3BlY3RpdmVNb2RlX2Fsd2F5cyA9IEFsd2EmeXMgb3BlbgotUHJvamVjdFN3aXRjaFBlcnNwZWN0aXZlTW9kZV9uZXZlciA9IE5lJnZlciBvcGVuCi1Qcm9qZWN0U3dpdGNoUGVyc3BlY3RpdmVNb2RlX3Byb21wdCA9IFByb21wJnQKLQotIyAtLS0gQnVpbGQgT3JkZXIgLS0tCi1CdWlsZE9yZGVyUHJlZmVyZW5jZV91cCA9ICZVcAotQnVpbGRPcmRlclByZWZlcmVuY2VfZG93biA9IERvdyZuCi1CdWlsZE9yZGVyUHJlZmVyZW5jZV9hZGQgPSBBZGQgJlByb2plY3QuLi4KLUJ1aWxkT3JkZXJQcmVmZXJlbmNlX3JlbW92ZSA9ICZSZW1vdmUgUHJvamVjdAotQnVpbGRPcmRlclByZWZlcmVuY2Vfc2VsZWN0T3RoZXJQcm9qZWN0cyA9IFNlbGVjdCAmcHJvamVjdHMgdG8gYWRkIHRvIGJ1aWxkIHBhdGg6Ci1CdWlsZE9yZGVyUHJlZmVyZW5jZV91c2VEZWZhdWx0cyA9IFVzZSBkJmVmYXVsdCBidWlsZCBvcmRlcgotQnVpbGRPcmRlclByZWZlcmVuY2VfcHJvamVjdEJ1aWxkT3JkZXIgPSBQcm9qZWN0IGJ1aWxkICZvcmRlcjoKLUJ1aWxkT3JkZXJQcmVmZXJlbmNlX3JlbW92ZU5vdGUgPSBBIHByb2plY3QgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGlzIHN0aWxsIGJ1aWx0IGJ1dCBhZnRlciB0aG9zZSBzcGVjaWZpZWQgaW4gdGhlIGxpc3QuCi1CdWlsZE9yZGVyUHJlZmVyZW5jZV9tYXhJdGVyYXRpb25zTGFiZWw9Jk1heCBpdGVyYXRpb25zIHdoZW4gYnVpbGRpbmcgd2l0aCBjeWNsZXM6Ci0KLSMgLS0tIFN0YXJ0dXAgcHJlZmVyZW5jZXMgLS0tCi1TdGFydHVwUHJlZmVyZW5jZVBhZ2VfcmVmcmVzaEJ1dHRvbiA9ICZSZWZyZXNoIHdvcmtzcGFjZSBvbiBzdGFydHVwCi1TdGFydHVwUHJlZmVyZW5jZVBhZ2VfbGF1bmNoUHJvbXB0QnV0dG9uID0gUHJvbXB0IGZvciAmd29ya3NwYWNlIG9uIHN0YXJ0dXAKLVN0YXJ0dXBQcmVmZXJlbmNlUGFnZV9leGl0UHJvbXB0QnV0dG9uID0gJkNvbmZpcm0gZXhpdCB3aGVuIGNsb3NpbmcgbGFzdCB3aW5kb3cKLQotIyAtLS0gSW5mbyAtLS0KLVJlc291cmNlSW5mb19yZWFkT25seSA9ICZSZWFkIG9ubHkKLVJlc291cmNlSW5mb19leGVjdXRhYmxlID0gRSZ4ZWN1dGFibGUKLVJlc291cmNlSW5mb19hcmNoaXZlID0gQXImY2hpdmUKLVJlc291cmNlSW5mb19kZXJpdmVkID0gRGVyaSZ2ZWQKLVJlc291cmNlSW5mb190eXBlID0gJlR5cGU6Ci1SZXNvdXJjZUluZm9fbG9jYXRpb24gPSAmTG9jYXRpb246Ci1SZXNvdXJjZUluZm9fcmVzb2x2ZWRMb2NhdGlvbiA9IFJlc29sdmVkIGxvY2F0aW9uOgotUmVzb3VyY2VJbmZvX3NpemUgPSAmU2l6ZToKLVJlc291cmNlSW5mb19ieXRlcyA9IHswfSAgYnl0ZXMKLVJlc291cmNlSW5mb19maWxlID0gRmlsZQotUmVzb3VyY2VJbmZvX2ZpbGVUeXBlRm9ybWF0ID0gRmlsZSAgKHswfSkKLVJlc291cmNlSW5mb19mb2xkZXIgPSBGb2xkZXIKLVJlc291cmNlSW5mb19wcm9qZWN0ID0gUHJvamVjdAotUmVzb3VyY2VJbmZvX2xpbmtlZEZpbGUgPSBMaW5rZWQgRmlsZQotUmVzb3VyY2VJbmZvX2xpbmtlZEZvbGRlciA9IExpbmtlZCBGb2xkZXIKLVJlc291cmNlSW5mb191bmtub3duID0gVW5rbm93bgotUmVzb3VyY2VJbmZvX25vdExvY2FsID0gPGZpbGUgY29udGVudHMgbm90IGxvY2FsPgotUmVzb3VyY2VJbmZvX3VuZGVmaW5lZFBhdGhWYXJpYWJsZSA9IDx1bmRlZmluZWQgcGF0aCB2YXJpYWJsZT4KLVJlc291cmNlSW5mb19ub3RFeGlzdCA9IDxyZXNvdXJjZSBkb2VzIG5vdCBleGlzdD4KLVJlc291cmNlSW5mb19maWxlTm90RXhpc3QgPSB7MH0gLSAoZG9lcyBub3QgZXhpc3QpCi1SZXNvdXJjZUluZm9fcGF0aCA9ICZQYXRoOgotUmVzb3VyY2VJbmZvX2xhc3RNb2RpZmllZCA9IExhc3QgJm1vZGlmaWVkOgotUmVzb3VyY2VJbmZvX2ZpbGVFbmNvZGluZ1RpdGxlID0gRGVmYXVsdCBlbmNvZGluZyBmb3IgJnRleHQgZmlsZXMKLVJlc291cmNlSW5mb19maWxlQ29udGVudEVuY29kaW5nRm9ybWF0ID0gJkRlZmF1bHQgKGRldGVybWluZWQgZnJvbSBjb250ZW50OiB7MH0pCi1SZXNvdXJjZUluZm9fZmlsZUNvbnRhaW5lckVuY29kaW5nRm9ybWF0ID0gRGVmYXVsdCAoJmluaGVyaXRlZCBmcm9tIGNvbnRhaW5lcjogezB9KQotUmVzb3VyY2VJbmZvX2NvbnRhaW5lckVuY29kaW5nRm9ybWF0ID0gJkluaGVyaXRlZCBmcm9tIGNvbnRhaW5lciAoezB9KQotUmVzb3VyY2VJbmZvX2V4V2FybmluZz0gUmVtb3ZpbmcgdGhlIGV4ZWN1dGFibGUgZmxhZyBvbiBhIGRpcmVjdG9yeSB3aWxsIGNhdXNlIGl0cyBjaGlsZHJlbiB0byBiZWNvbWUgdW5yZWFkYWJsZS4KLQotIyAtLS0gUHJvamVjdCBSZWZlcmVuY2VzIC0tLQotUHJvamVjdFJlZmVyZW5jZXNQYWdlX2xhYmVsID0gUHJvamVjdHMgbWF5IHJlZmVyIHRvIG90aGVyIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UuXG5Vc2UgdGhpcyBwYWdlIHRvIHNwZWNpZnkgd2hhdCBvdGhlciBwcm9qZWN0cyBhcmUgcmVmZXJlbmNlZCBieSB0aGUgcHJvamVjdC5cblxuJlByb2plY3QgcmVmZXJlbmNlcyBmb3IgezB9OgotCi0jIC0tLSBQcm9qZWN0IENhcGFiaWxpdGllcyAtLS0KLVByb2plY3RDYXBhYmlsaXR5UHJvcGVydHlQYWdlX2Nob29zZUNhcGFiaWxpdGllcyA9IENob29zZSB0aGUgY2FwYWJpbGl0aWVzIGZvciB0aGUgcHJvamVjdC4KLVByb2plY3RDYXBhYmlsaXR5UHJvcGVydHlQYWdlX25vQ2FwYWJpbGl0aWVzID0gVGhlcmUgYXJlIG5vIGNhcGFiaWxpdGllcyBhdmFpbGFibGUgdG8gY2hvb3NlIGZyb20uCi1Qcm9qZWN0Q2FwYWJpbGl0eVByb3BlcnR5UGFnZV9lcnJvclRpdGxlID0gUHJvamVjdCBDYXBhYmlsaXR5IFByb2JsZW1zCi1Qcm9qZWN0Q2FwYWJpbGl0eVByb3BlcnR5UGFnZV9pbnRlcm5hbEVycm9yID0gSW50ZXJuYWwgZXJyb3IgdXBkYXRpbmcgcHJvamVjdCBjYXBhYmlsaXRpZXMuCi1Qcm9qZWN0Q2FwYWJpbGl0eVByb3BlcnR5UGFnZV9pbnZhbGlkU2VsZWN0aW9uID0gVGhlIHJlcXVlc3RlZCBwcm9qZWN0IGNhcGFiaWxpdHkgY2hhbmdlcyBhcmUgaW52YWxpZC4KLQotUHJvamVjdENhcGFiaWxpdHlFZGl0aW5nUHJvcGVydHlQYWdlX2FkZCA9ICZBZGQuLi4KLVByb2plY3RDYXBhYmlsaXR5RWRpdGluZ1Byb3BlcnR5UGFnZV9yZW1vdmUgPSAmUmVtb3ZlCi1Qcm9qZWN0Q2FwYWJpbGl0eVByb3BlcnR5UGFnZV9jYXBhYmlsaXR5UmVxdWlyZWQgPSBUaGUgY2hvc2VuIGNhcGFiaWxpdHkgaXMgcmVxdWlyZWQgYnkgdGhlIHswfSBjYXBhYmlsaXR5IGFuZCBjYW5ub3QgYmUgcmVtb3ZlZC4KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRWRpdG9ycwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLURlZmF1bHRFZGl0b3JEZXNjcmlwdGlvbl9uYW1lID0gJkRlZmF1bHQgRWRpdG9yCi0KLVdlbGNvbWVFZGl0b3JfYWNjZXNzRXhjZXB0aW9uID0gQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgd2VsY29tZSBwYWdlCi1XZWxjb21lRWRpdG9yX3JlYWRGaWxlRXJyb3IgPSBFcnJvciBpbiBXZWxjb21lRWRpdG9yLnJlYWRGaWxlCi1XZWxjb21lRWRpdG9yX3RpdGxlID0gV2VsY29tZQotV2VsY29tZUVkaXRvcl90b29sVGlwID0gV2VsY29tZSB0byB7MH0KLVdlbGNvbWVFZGl0b3JfY29weV90ZXh0PSZDb3B5Ci0KLVdlbGNvbWVJdGVtX3VuYWJsZVRvTG9hZENsYXNzID0gVW5hYmxlIHRvIGxvYWQgY2xhc3MKLVdlbGNvbWVQYXJzZXJfcGFyc2VFcnJvciA9IEVycm9yIGluIFdlbGNvbWVQYXJzZXIucGFyc2UKLVdlbGNvbWVQYXJzZXJfcGFyc2VFeGNlcHRpb24gPSBBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hlbiBwYXJzaW5nIHRoZSB3ZWxjb21lIHBhZ2UKLVdvcmtiZW5jaF9vcGVuRWRpdG9yRXJyb3JEaWFsb2dUaXRsZSA9IFByb2JsZW0KLVdvcmtiZW5jaF9vcGVuRWRpdG9yRXJyb3JEaWFsb2dNZXNzYWdlID0gVW5hYmxlIHRvIG9wZW4gZWRpdG9yCi1RdWlja1N0YXJ0QWN0aW9uX29wZW5FZGl0b3JFeGNlcHRpb24gPSBBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hlbiBvcGVuaW5nIHRoZSBlZGl0b3IKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRGlhbG9ncwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVF1ZXN0aW9uID0gUXVlc3Rpb24KLQotQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nX3RpdGxlID0gRm9sZGVyIFNlbGVjdGlvbgotQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nX21lc3NhZ2UgPSBFbnRlciBvciBzZWxlY3QgdGhlIHBhcmVudCBmb2xkZXI6Ci0KLUNvbnRhaW5lckdyb3VwX21lc3NhZ2UgPSAmRW50ZXIgb3Igc2VsZWN0IHRoZSBwYXJlbnQgZm9sZGVyOgotQ29udGFpbmVyR3JvdXBfc2VsZWN0Rm9sZGVyID0gU2VsZWN0IHRoZSBmb2xkZXI6Ci0KLUNvbnRhaW5lckdlbmVyYXRvcl9wcm9ncmVzc01lc3NhZ2UgPSBHZW5lcmF0ZSBGb2xkZXIKLUNvbnRhaW5lckdlbmVyYXRvcl9wYXRoT2NjdXBpZWQgPSBDYW5ub3QgY3JlYXRlIGZvbGRlciBiZWNhdXNlIGEgZmlsZSBleGlzdHMgYXQgdGhhdCBsb2NhdGlvbjogezB9Ci0KLVJlc291cmNlR3JvdXBfcmVzb3VyY2UgPSByZXNvdXJjZQotUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLVJlc291cmNlR3JvdXBfZm9sZGVyRW1wdHkgPSBUaGUgZm9sZGVyIGlzIGVtcHR5LgotUmVzb3VyY2VHcm91cF9ub1Byb2plY3QgPSBUaGUgc3BlY2lmaWVkIHByb2plY3QgZG9lcyBub3QgZXhpc3QuCi1SZXNvdXJjZUdyb3VwX2VtcHR5TmFtZSA9IFRoZSAnJ3swfScnIG5hbWUgaXMgZW1wdHkuCi1SZXNvdXJjZUdyb3VwX2ludmFsaWRGaWxlbmFtZSA9ICcnezB9JycgaXMgbm90IGEgdmFsaWQgZmlsZSBuYW1lLgotUmVzb3VyY2VHcm91cF9wYXRoT2NjdXBpZWQgPSBBIGZpbGUgYWxyZWFkeSBleGlzdHMgYXQgdGhhdCBsb2NhdGlvbjogezB9Ci0KLUZpbGVTZWxlY3Rpb25EaWFsb2dfdGl0bGUgPSBGaWxlIFNlbGVjdGlvbgotRmlsZVNlbGVjdGlvbkRpYWxvZ19tZXNzYWdlID0gU2VsZWN0IHRoZSBmaWxlczoKLQotUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nX25hbWVMYWJlbCA9ICZQcm9qZWN0IG5hbWU6Ci1Qcm9qZWN0TG9jYXRpb25TZWxlY3Rpb25EaWFsb2dfbG9jYXRpb25MYWJlbCA9ICZMb2NhdGlvbjoKLVByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZ19icm93c2VMYWJlbCA9ICZCcm93c2UuLi4KLVByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZ19kaXJlY3RvcnlMYWJlbCA9IFNlbGVjdCB0aGUgbG9jYXRpb24gZGlyZWN0b3J5LgotUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nX2xvY2F0aW9uRXJyb3IgPSBJbnZhbGlkIGxvY2F0aW9uIHBhdGgKLVByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZ19zZWxlY3Rpb25UaXRsZSA9IFByb2plY3QKLVByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZ191c2VEZWZhdWx0TGFiZWwgPSBVc2UgJmRlZmF1bHQgbG9jYXRpb24KLQotUHJvamVjdFBlcnNwZWN0aXZlQ2hvaWNlRGlhbG9nX3RpdGxlID0gQ2hvb3NlIFBlcnNwZWN0aXZlCi1Qcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2dfY2hvb3NlUGVyc3BlY3RpdmUgPSBTaG93IHByb2plY3QgaW4gJnBlcnNwZWN0aXZlOgotUHJvamVjdFBlcnNwZWN0aXZlQ2hvaWNlRGlhbG9nX29wdGlvbnMgPSBPcHRpb25zCi1Qcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2dfbmV3V2luZG93ID0gJk5ldyB3aW5kb3cKLVByb2plY3RQZXJzcGVjdGl2ZUNob2ljZURpYWxvZ19zYW1lV2luZG93ID0gJlNhbWUgd2luZG93Ci1Qcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2dfZXJyb3JUaXRsZSA9IFNob3cgUGVyc3BlY3RpdmUgUHJvYmxlbQotUHJvamVjdFBlcnNwZWN0aXZlQ2hvaWNlRGlhbG9nX2Vycm9yTWVzc2FnZSA9IFVuYWJsZSB0byBzaG93IHRoZSBjaG9zZW4gcGVyc3BlY3RpdmUuCi0KLVJlc291cmNlU2VsZWN0aW9uRGlhbG9nX3RpdGxlID0gUmVzb3VyY2UgU2VsZWN0aW9uCi1SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZ19tZXNzYWdlID0gU2VsZWN0IHRoZSByZXNvdXJjZXM6Ci0KLU1hcmtlclJlc29sdXRpb25TZWxlY3Rpb25EaWFsb2dfdGl0bGUgPSBRdWljayBGaXgKLU1hcmtlclJlc29sdXRpb25TZWxlY3Rpb25EaWFsb2dfbWVzc2FnZUxhYmVsID0gJkF2YWlsYWJsZSBmaXhlczoKLQotUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2dfbGFiZWwgPSBTZWxlY3QgYSByZXNvdXJjZSB0byBvcGVuICg/ID0gYW55IGNoYXJhY3RlciwgKiA9IGFueSBzdHJpbmcpOgotUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2dfbWF0Y2hpbmcgPSAmTWF0Y2hpbmcgcmVzb3VyY2VzOgotUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2dfZm9sZGVycyA9IEluICZmb2xkZXJzOgotUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2dfc2hvd0Rlcml2ZWQ9U2hvdyAmZGVyaXZlZCByZXNvdXJjZXMKLQotT3BlblJlc291cmNlRGlhbG9nX3RpdGxlID0gT3BlbiBSZXNvdXJjZQotCi1OZXdGb2xkZXJEaWFsb2dfdGl0bGUgPSBOZXcgRm9sZGVyCi1OZXdGb2xkZXJEaWFsb2dfbmFtZUxhYmVsID0gJkZvbGRlciBuYW1lOgotTmV3Rm9sZGVyRGlhbG9nX2FscmVhZHlFeGlzdHMgPSBUaGUgZm9sZGVyICcnezB9JycgYWxyZWFkeSBleGlzdHMuCi1OZXdGb2xkZXJEaWFsb2dfZm9sZGVyTmFtZUVtcHR5ID0gRm9sZGVyIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQKLU5ld0ZvbGRlckRpYWxvZ19wcm9ncmVzcyA9IENyZWF0aW5nIG5ldyBmb2xkZXIKLU5ld0ZvbGRlckRpYWxvZ19lcnJvclRpdGxlID0gQ3JlYXRpb24gUHJvYmxlbXMKLU5ld0ZvbGRlckRpYWxvZ19pbnRlcm5hbEVycm9yID0gSW50ZXJuYWwgZXJyb3I6IHswfQotCi1DcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwX2xpbmtGaWxlQnV0dG9uID0gJkxpbmsgdG8gZmlsZSBpbiB0aGUgZmlsZSBzeXN0ZW0KLUNyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXBfbGlua0ZvbGRlckJ1dHRvbiA9ICZMaW5rIHRvIGZvbGRlciBpbiB0aGUgZmlsZSBzeXN0ZW0KLUNyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXBfYnJvd3NlQnV0dG9uID0gQnJvJndzZS4uLgotQ3JlYXRlTGlua2VkUmVzb3VyY2VHcm91cF92YXJpYWJsZXNCdXR0b24gPSAmVmFyaWFibGVzLi4uCi1DcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwX3Jlc29sdmVkUGF0aExhYmVsID0gUmVzb2x2ZWQgbG9jYXRpb246Ci1DcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwX3RhcmdldFNlbGVjdGlvbkxhYmVsID0gU2VsZWN0IHRoZSBsaW5rIHRhcmdldC4KLUNyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXBfbGlua1RhcmdldE5vdEZpbGUgPSBMaW5rIHRhcmdldCBtdXN0IGJlIGEgZmlsZS4KLUNyZWF0ZUxpbmtlZFJlc291cmNlR3JvdXBfbGlua1RhcmdldE5vdEZvbGRlciA9IExpbmsgdGFyZ2V0IG11c3QgYmUgYSBmb2xkZXIuCi1DcmVhdGVMaW5rZWRSZXNvdXJjZUdyb3VwX2xpbmtUYXJnZXROb25FeGlzdGVudCA9IExpbmsgdGFyZ2V0IGRvZXMgbm90IGV4aXN0LgotQ3JlYXRlTGlua2VkUmVzb3VyY2VHcm91cF91bmFibGVUb1ZhbGlkYXRlTGlua1RhcmdldCA9IFVuYWJsZSB0byB2YWxpZGF0ZSBsaW5rIHRhcmdldC4KLQotUGF0aFZhcmlhYmxlc0Jsb2NrX3ZhcmlhYmxlc0xhYmVsID0gJkRlZmluZWQgcGF0aCB2YXJpYWJsZXM6Ci1QYXRoVmFyaWFibGVzQmxvY2tfYWRkVmFyaWFibGVCdXR0b24gPSAmTmV3Li4uCi1QYXRoVmFyaWFibGVzQmxvY2tfZWRpdFZhcmlhYmxlQnV0dG9uID0gRWRpJnQuLi4KLVBhdGhWYXJpYWJsZXNCbG9ja19yZW1vdmVWYXJpYWJsZUJ1dHRvbiA9ICZSZW1vdmUKLQotUGF0aFZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nX3RpdGxlID0gU2VsZWN0IFBhdGggVmFyaWFibGUKLVBhdGhWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZ19leHRlbmRCdXR0b24gPSAmRXh0ZW5kLi4uCi1QYXRoVmFyaWFibGVTZWxlY3Rpb25EaWFsb2dfRXh0ZW5zaW9uRGlhbG9nX3RpdGxlID0gVmFyaWFibGUgRXh0ZW5zaW9uCi1QYXRoVmFyaWFibGVTZWxlY3Rpb25EaWFsb2dfRXh0ZW5zaW9uRGlhbG9nX2Rlc2NyaXB0aW9uID0gQ2hvb3NlIGV4dGVuc2lvbiB0byB7MH0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRWRpdG9yIEZyYW1ld29yawotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUVkaXRvck1hbmFnZXJfc2F2ZVJlc291cmNlc01lc3NhZ2UgPSBTZWxlY3QgdGhlICZyZXNvdXJjZXMgdG8gc2F2ZToKLUVkaXRvck1hbmFnZXJfc2F2ZVJlc291cmNlc1RpdGxlID0gU2F2ZSBSZXNvdXJjZXMKLQotT3BlblN5c3RlbUVkaXRvckFjdGlvbl9kaWFsb2dUaXRsZSA9IFByb2JsZW1zIE9wZW5pbmcgU3lzdGVtIEVkaXRvcgotT3BlblN5c3RlbUVkaXRvckFjdGlvbl90ZXh0ID0gJlN5c3RlbSBFZGl0b3IKLU9wZW5TeXN0ZW1FZGl0b3JBY3Rpb25fdG9vbFRpcCA9IEVkaXQgRmlsZSB3aXRoIFN5c3RlbSBFZGl0b3IKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgV29ya3NwYWNlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotV29ya3NwYWNlQWN0aW9uX3Byb2JsZW1zVGl0bGUgPSBQcm9ibGVtcwotV29ya3NwYWNlQWN0aW9uX2xvZ1RpdGxlID0gRXhjZXB0aW9uIGluIHswfS4gcnVuOiB7MX0KLVdvcmtiZW5jaEFjdGlvbl9wcm9ibGVtc01lc3NhZ2UgPSBUaGUgZm9sbG93aW5nIHByb2JsZW1zIG9jY3VycmVkLgotV29ya2JlbmNoQWN0aW9uX2ludGVybmFsRXJyb3IgPSBJbnRlcm5hbCBlcnJvci4KLVdvcmtzcGFjZSA9IFdvcmtzcGFjZQotCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFdvcmtiZW5jaAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVdvcmtiZW5jaFdpbmRvd19zaGVsbFRpdGxlID0gezB9IC0gezF9Ci0KLUludGVybmFsX2Vycm9yID0gSW50ZXJuYWwgZXJyb3IKLUludGVybmFsRXJyb3IgPSBJbnRlcm5hbCBFcnJvcgotSW50ZXJuYWxFcnJvck5vQXJnID0gQW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLlxuU2VlIHRoZSAubG9nIGZpbGUgZm9yIG1vcmUgZGV0YWlscy5cblxuRG8geW91IHdhbnQgdG8gZXhpdCB0aGUgd29ya2JlbmNoPwotSW50ZXJuYWxFcnJvck9uZUFyZyA9IEFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC5cbnswfVxuU2VlIHRoZSAubG9nIGZpbGUgZm9yIG1vcmUgZGV0YWlscy5cblxuRG8geW91IHdhbnQgdG8gZXhpdCB0aGUgd29ya2JlbmNoPwotCi1GYXRhbEVycm9yX1JlY3Vyc2l2ZUVycm9yID0gQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2hvd2luZyBhbiBpbnRlcm5hbCBlcnJvci4KLUZhdGFsRXJyb3JfT3V0T2ZNZW1vcnlFcnJvciA9IEFuIG91dCBvZiBtZW1vcnkgZXJyb3IgaGFzIG9jY3VycmVkLiBZb3UgY2FuIHByZXZlbnQgdGhlc2UgZXJyb3JzIGluIHRoZSBmdXR1cmUgYnkgaW5jcmVhc2luZyB5b3VyIGhlYXAgc2l6ZSBiZWZvcmUgeW91IHN0YXJ0IHRoZSB3b3JrYmVuY2ggdXNpbmcgdGhlIC12bWFyZ3MgLVhteCBjb21tYW5kIGxpbmUgb3B0aW9uLgotRmF0YWxFcnJvcl9TdGFja092ZXJmbG93RXJyb3IgPSBBIHN0YWNrIG92ZXJmbG93IGVycm9yIGhhcyBvY2N1cnJlZC4KLUZhdGFsRXJyb3JfVmlydHVhbE1hY2hpbmVFcnJvciA9IEEgdmlydHVhbCBtYWNoaW5lIGVycm9yIGhhcyBvY2N1cnJlZC4KLUZhdGFsRXJyb3JfU1dURXJyb3IgPSBBbiBTV1QgZXJyb3IgaGFzIG9jY3VycmVkLgotRmF0YWxFcnJvciA9IHswfVxuWW91IGFyZSByZWNvbW1lbmRlZCB0byBleGl0IHRoZSB3b3JrYmVuY2guXG5TdWJzZXF1ZW50IGVycm9ycyBtYXkgaGFwcGVuIGFuZCBtYXkgdGVybWluYXRlIHRoZSB3b3JrYmVuY2ggd2l0aG91dCB3YXJuaW5nLlxuU2VlIHRoZSAubG9nIGZpbGUgZm9yIG1vcmUgZGV0YWlscy5cblxuRG8geW91IHdhbnQgdG8gZXhpdCB0aGUgd29ya2JlbmNoPwotCi1Qcm9ibGVtU2F2aW5nV29ya2JlbmNoID0gUHJvYmxlbXMgb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSB3b3JrYmVuY2guCi1Qcm9ibGVtc1NhdmluZ1dvcmtzcGFjZSA9IFByb2JsZW1zIHNhdmluZyB3b3Jrc3BhY2UKLQotUHJvYmxlbXNfT3BlbmluZ19QYWdlID0gUHJvYmxlbXMgT3BlbmluZyBQYWdlCi0KLVdvcmtzcGFjZV9yZWZyZXNoaW5nID0gUmVmcmVzaGluZyB3b3Jrc3BhY2UKLQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBLZXlzIHdpdGggcmVmZXJlbmNlcyBidXQgZG9uJ3Qgc2hvdyBpbiB0aGUgVUkKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1DcmVhdGVGaWxlQWN0aW9uX3RleHQgPSBOZXcgJkZpbGUKLUNyZWF0ZUZpbGVBY3Rpb25fdG9vbFRpcCA9IENyZWF0ZSBOZXcgRmlsZQotQ3JlYXRlRmlsZUFjdGlvbl90aXRsZSA9IE5ldwotCi1DcmVhdGVGb2xkZXJBY3Rpb25fdGV4dCA9IE5ldyBGJm9sZGVyCi1DcmVhdGVGb2xkZXJBY3Rpb25fdG9vbFRpcCA9IENyZWF0ZSBOZXcgRm9sZGVyCi1DcmVhdGVGb2xkZXJBY3Rpb25fdGl0bGUgPSBOZXcKLQotU2NydWJMb2NhbEFjdGlvbl9wcm9ibGVtc01lc3NhZ2UgPSBQcm9ibGVtcyBvY2N1cnJlZCByZW1vdmluZyB0aGUgbG9jYWwgY29udGVudHMgb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlcy4KLVNjcnViTG9jYWxBY3Rpb25fdGV4dCA9IERpc2NhcmQgJkxvY2FsIENvcHkKLVNjcnViTG9jYWxBY3Rpb25fdG9vbFRpcCA9IERpc2NhcmQgTG9jYWwgQ29udGVudHMKLVNjcnViTG9jYWxBY3Rpb25fcHJvYmxlbXNUaXRsZSA9IENvbnRlbnQgUmVtb3ZhbCBQcm9ibGVtcwotU2NydWJMb2NhbEFjdGlvbl9wcm9ncmVzcyA9IERpc2NhcmRpbmcgY29udGVudC4uLgotCi1UZXh0QWN0aW9uX3NlbGVjdEFsbCA9IFNlbGVjdCBBbGwKLUN1dCA9IEN1dAotQ29weSA9IENvcHkKLVBhc3RlID0gUGFzdGUKLURlbGV0ZSA9IERlbGV0ZQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBLZXlzIHVzZWQgaW4gdGhlIHJldXNlIGVkaXRvciB3aGljaCBpcyByZWxlYXNlZCBhcyBleHBlcmltZW50YWwuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotV29ya2JlbmNoUHJlZmVyZW5jZV9zYXZlSW50ZXJ2YWw9JldvcmtzcGFjZSBzYXZlIGludGVydmFsIChpbiBtaW51dGVzKToKLVdvcmtiZW5jaFByZWZlcmVuY2Vfc2F2ZUludGVydmFsRXJyb3I9VGhlIHdvcmtzcGFjZSBzYXZlIGludGVydmFsIHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIHswfS4KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgV29ya2luZyBTZXQgRnJhbWV3b3JrLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJlc291cmNlV29ya2luZ1NldFBhZ2VfdGl0bGU9UmVzb3VyY2UgV29ya2luZyBTZXQKLVJlc291cmNlV29ya2luZ1NldFBhZ2VfZGVzY3JpcHRpb249RW50ZXIgYSB3b3JraW5nIHNldCBuYW1lIGFuZCBzZWxlY3QgdGhlIHdvcmtpbmcgc2V0IHJlc291cmNlcy4KLVJlc291cmNlV29ya2luZ1NldFBhZ2VfbWVzc2FnZT0mV29ya2luZyBzZXQgbmFtZToKLVJlc291cmNlV29ya2luZ1NldFBhZ2VfbGFiZWxfdHJlZT1Xb3JraW5nIHNldCAmY29udGVudHM6Ci1SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX3dhcm5pbmdfbmFtZU11c3ROb3RCZUVtcHR5PSBUaGUgbmFtZSBtdXN0IG5vdCBiZSBlbXB0eS4KLVJlc291cmNlV29ya2luZ1NldFBhZ2Vfd2FybmluZ19uYW1lV2hpdGVzcGFjZT0gVGhlIG5hbWUgbXVzdCBub3QgaGF2ZSBhIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZS4KLVJlc291cmNlV29ya2luZ1NldFBhZ2Vfd2FybmluZ193b3JraW5nU2V0RXhpc3RzPSBBIHdvcmtpbmcgc2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLVJlc291cmNlV29ya2luZ1NldFBhZ2Vfd2FybmluZ19yZXNvdXJjZU11c3RCZUNoZWNrZWQ9IE5vIHJlc291cmNlcyBzZWxlY3RlZC4KLVJlc291cmNlV29ya2luZ1NldFBhZ2VfZXJyb3I9IEVycm9yCi1SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX2Vycm9yX3VwZGF0ZUNoZWNrZWRTdGF0ZT0gRXJyb3IgZHVyaW5nIHVwZGF0ZSBvZiBjaGVja2VkIHN0YXRlCi1SZXNvdXJjZVdvcmtpbmdTZXRQYWdlX3NlbGVjdEFsbF9sYWJlbD1TZWxlY3QgJkFsbAotUmVzb3VyY2VXb3JraW5nU2V0UGFnZV9zZWxlY3RBbGxfdG9vbFRpcD1TZWxlY3QgYWxsIG9mIHRoZXNlcyByZXNvdXJjZSBmb3IgdGhpcyB3b3JraW5nIHNldC4KLVJlc291cmNlV29ya2luZ1NldFBhZ2VfZGVzZWxlY3RBbGxfbGFiZWw9RGVzZSZsZWN0IEFsbAotUmVzb3VyY2VXb3JraW5nU2V0UGFnZV9kZXNlbGVjdEFsbF90b29sVGlwPURlc2VsZWN0IGFsbCBvZiB0aGVzZSByZXNvdXJjZXMgZm9yIHRoaXMgd29ya2luZyBzZXQuCi0KLVJlc291cmNlRW5jb2RpbmdGaWVsZEVkaXRvcl9FcnJvckxvYWRpbmdNZXNzYWdlPUVycm9yIGxvYWRpbmcgZW5jb2RpbmcKLVJlc291cmNlRW5jb2RpbmdGaWVsZEVkaXRvcl9FcnJvclN0b3JpbmdNZXNzYWdlPUVycm9yIHN0b3JpbmcgZW5jb2RpbmcKLVJlc291cmNlRW5jb2RpbmdGaWVsZEVkaXRvcl9FbmNvZGluZ0NvbmZsaWN0VGl0bGU9Q29uZmxpY3QgaW4gRW5jb2RpbmcKLVJlc291cmNlRW5jb2RpbmdGaWVsZEVkaXRvcl9FbmNvZGluZ0NvbmZsaWN0TWVzc2FnZT0gezB9IGNvbmZsaWN0cyB3aXRoIHRoZSBlbmNvZGluZyBkZWZpbmVkIGluIHRoZSBjb250ZW50IHR5cGUgKHsxfSkuIERvIHlvdSB3aXNoIHRvIHNldCBpdCBhbnl3YXlzPwotCi1DaG9vc2VXb3Jrc3BhY2VEaWFsb2dfZGlhbG9nTmFtZT1Xb3Jrc3BhY2UgTGF1bmNoZXIKLUNob29zZVdvcmtzcGFjZURpYWxvZ19kaWFsb2dUaXRsZT1TZWxlY3QgYSB3b3Jrc3BhY2UKLUNob29zZVdvcmtzcGFjZURpYWxvZ19kaWFsb2dNZXNzYWdlPSBcCi17MH0gc3RvcmVzIHlvdXIgcHJvamVjdHMgaW4gYSBmb2xkZXIgY2FsbGVkIGEgd29ya3NwYWNlLlxuXAotQ2hvb3NlIGEgd29ya3NwYWNlIGZvbGRlciB0byB1c2UgZm9yIHRoaXMgc2Vzc2lvbi4KLUNob29zZVdvcmtzcGFjZURpYWxvZ19kZWZhdWx0UHJvZHVjdE5hbWUgPSBUaGlzIHByb2R1Y3QKLUNob29zZVdvcmtzcGFjZURpYWxvZ193b3Jrc3BhY2VFbnRyeUxhYmVsPSZXb3Jrc3BhY2U6Ci1DaG9vc2VXb3Jrc3BhY2VEaWFsb2dfYnJvd3NlTGFiZWw9JkJyb3dzZS4uLgotQ2hvb3NlV29ya3NwYWNlRGlhbG9nX2RpcmVjdG9yeUJyb3dzZXJUaXRsZT1TZWxlY3QgV29ya3NwYWNlIERpcmVjdG9yeQotQ2hvb3NlV29ya3NwYWNlRGlhbG9nX2RpcmVjdG9yeUJyb3dzZXJNZXNzYWdlPVNlbGVjdCB0aGUgd29ya3NwYWNlIGRpcmVjdG9yeSB0byB1c2UuCi1DaG9vc2VXb3Jrc3BhY2VEaWFsb2dfdXNlRGVmYXVsdE1lc3NhZ2U9JlVzZSB0aGlzIGFzIHRoZSBkZWZhdWx0IGFuZCBkbyBub3QgYXNrIGFnYWluCi1JREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VNYW5kYXRvcnlUaXRsZT1Xb3Jrc3BhY2UgaXMgTWFuZGF0b3J5Ci1JREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VNYW5kYXRvcnlNZXNzYWdlPUlERXMgbmVlZCBhIHZhbGlkIHdvcmtzcGFjZS4gUmVzdGFydCB3aXRob3V0IHRoZSBAbm9uZSBvcHRpb24uCi1JREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VJblVzZVRpdGxlPVdvcmtzcGFjZSBpbiBVc2UKLUlERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUluVXNlTWVzc2FnZT1Xb3Jrc3BhY2UgaW4gdXNlLCBjaG9vc2UgYSBkaWZmZXJlbnQgb25lLgotSURFQXBwbGljYXRpb25fd29ya3NwYWNlRW1wdHlUaXRsZT1Xb3Jrc3BhY2UgUmVxdWlyZWQKLUlERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUVtcHR5TWVzc2FnZT1Xb3Jrc3BhY2UgZmllbGQgbXVzdCBub3QgYmUgZW1wdHk7IGVudGVyIGEgcGF0aCB0byBjb250aW51ZS4KLUlERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUludmFsaWRUaXRsZT1JbnZhbGlkIFdvcmtzcGFjZQotSURFQXBwbGljYXRpb25fd29ya3NwYWNlSW52YWxpZE1lc3NhZ2U9U2VsZWN0ZWQgd29ya3NwYWNlIGlzIG5vdCB2YWxpZDsgY2hvb3NlIGEgZGlmZmVyZW50IG9uZS4KLUlERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUNhbm5vdEJlU2V0VGl0bGU9V29ya3NwYWNlIENhbm5vdCBiZSBTZXQKLUlERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUNhbm5vdEJlU2V0TWVzc2FnZT1FcnJvciBpbiBydW50aW1lOyB3b3Jrc3BhY2UgY2Fubm90IGJlIHNldC4gIEV4aXRpbmcuCi1JREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VDYW5ub3RMb2NrVGl0bGU9V29ya3NwYWNlIENhbm5vdCBiZSBMb2NrZWQKLUlERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlPUNvdWxkIG5vdCBsYXVuY2ggdGhlIHByb2R1Y3QgYmVjYXVzZSB0aGUgYXNzb2NpYXRlZCB3b3Jrc3BhY2UgaXMgY3VycmVudGx5IGluIHVzZS4KLUlERUFwcGxpY2F0aW9uX3ZlcnNpb25UaXRsZSA9IERpZmZlcmVudCBXb3Jrc3BhY2UgVmVyc2lvbgotSURFQXBwbGljYXRpb25fdmVyc2lvbk1lc3NhZ2UgPSBcCi1UaGlzIHdvcmtzcGFjZSB3YXMgd3JpdHRlbiB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgdGhlIHByb2R1Y3QgYW5kIG5lZWRzIHRvIGJlIHVwZGF0ZWQuXG5cblwKLXswfVxuXG5cCi1VcGRhdGluZyB0aGUgd29ya3NwYWNlIG1heSBtYWtlIGl0IGluY29tcGF0aWJsZSB3aXRoIG90aGVyIHZlcnNpb25zIG9mIHRoZSBwcm9kdWN0LlxuXAotUHJlc3MgT0sgdG8gdXBkYXRlIHRoZSB3b3Jrc3BhY2UgYW5kIG9wZW4gaXQuICBQcmVzcyBDYW5jZWwgdG8gc2VsZWN0IGEgZGlmZmVyZW50IHdvcmtzcGFjZS4KLUlERUFwcGxpY2F0aW9uX2luY29tcGF0aWJsZUpWTVRpdGxlID0gSW5jb21wYXRpYmxlIEpWTQotSURFQXBwbGljYXRpb25faW5jb21wYXRpYmxlSlZNTWVzc2FnZSA9IFRoaXMgdmVyc2lvbiBvZiB0aGUgSlZNIGlzIG5vdCBzdWl0YWJsZSBmb3IgdGhpcyBwcm9kdWN0LiAgVmVyc2lvbiB7MH0gb3IgZ3JlYXRlciBpcyByZXF1aXJlZC4KLUNsZWFuRGlhbG9nX2J1aWxkQ2xlYW5BdXRvPUNsZWFuIHdpbGwgZGlzY2FyZCBhbGwgYnVpbGQgcHJvYmxlbXMgYW5kIGJ1aWx0IHN0YXRlcy4gIFRoZSBwcm9qZWN0cyB3aWxsIGJlIHJlYnVpbHQgZnJvbSBzY3JhdGNoLgotQ2xlYW5EaWFsb2dfYnVpbGRDbGVhbk1hbnVhbD1DbGVhbiB3aWxsIGRpc2NhcmQgYWxsIGJ1aWxkIHByb2JsZW1zIGFuZCBidWlsdCBzdGF0ZXMuICBUaGUgbmV4dCB0aW1lIGEgYnVpbGQgb2NjdXJzIHRoZSBwcm9qZWN0cyB3aWxsIGJlIHJlYnVpbHQgZnJvbSBzY3JhdGNoLgotQ2xlYW5EaWFsb2dfdGl0bGU9Q2xlYW4KLUNsZWFuRGlhbG9nX2NsZWFuQWxsQnV0dG9uPUNsZWFuICZhbGwgcHJvamVjdHMKLUNsZWFuRGlhbG9nX2NsZWFuU2VsZWN0ZWRCdXR0b249Q2xlYW4gcHJvamVjdHMgJnNlbGVjdGVkIGJlbG93Ci1DbGVhbkRpYWxvZ19idWlsZE5vd0J1dHRvbj1TdGFydCBhICZidWlsZCBpbW1lZGlhdGVseQotQ2xlYW5EaWFsb2dfdGFza05hbWU9Q2xlYW5pbmcgc2VsZWN0ZWQgcHJvamVjdHMKLUlERUVuY29kaW5nX0VuY29kaW5nSm9iPVNldHRpbmcgZW5jb2RpbmcKLUlERUVkaXRvcnNQcmVmZXJlbmNlUGFnZV9Xb3JrYmVuY2hQcmVmZXJlbmNlX0ZpbGVFZGl0b3JzUmVsYXRlZExpbms9U2VlIDxhPicnezB9Jyc8L2E+IGZvciBhc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggZmlsZSB0eXBlcy4KLUlERUVkaXRvcnNQcmVmZXJlbmNlUGFnZV9Xb3JrYmVuY2hQcmVmZXJlbmNlX3ZpZXdzUmVsYXRlZExpbmsgPSBTZWUgPGE+Jyd7MH0nJzwvYT4gZm9yIGFwcGVhcmFuY2UgcHJlZmVyZW5jZXMuCi1JREVFZGl0b3JzUHJlZmVyZW5jZVBhZ2VfV29ya2JlbmNoUHJlZmVyZW5jZV9jb250ZW50VHlwZXNSZWxhdGVkTGluayA9IFNlZSA8YT4nJ3swfScnPC9hPiBmb3IgY29udGVudC10eXBlIGJhc2VkIGZpbGUgYXNzb2NpYXRpb25zLgotSURFV29ya3NwYWNlUHJlZmVyZW5jZVBhZ2VfV29ya2JlbmNoUHJlZmVyZW5jZV9yZWxhdGVkTGluayA9IFNlZSA8YT4nJ3swfScnPC9hPiBmb3Igd29ya3NwYWNlIHN0YXJ0dXAgYW5kIHNodXRkb3duIHByZWZlcmVuY2VzLgotV29ya2JlbmNoRW5jb2RpbmdfaW52YWxpZENoYXJzZXQgPSB7MH0gaXMgbm90IGEgdmFsaWQgY2hhcnNldC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbWlzYy9DaGVja2JveFRyZWVBbmRMaXN0R3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbWlzYy9DaGVja2JveFRyZWVBbmRMaXN0R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmODEzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21pc2MvQ2hlY2tib3hUcmVlQW5kTGlzdEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5taXNjOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uRXZlbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlVmlld2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZUV4cGFuc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotCi0vKioKLSAqCVdvcmtiZW5jaC1sZXZlbCBjb21wb3NpdGUgdGhhdCBjb21iaW5lcyBhIENoZWNrYm94VHJlZVZpZXdlciBhbmQgQ2hlY2tib3hMaXN0Vmlld2VyLgotICoJQWxsIHZpZXdlciBzZWxlY3Rpb24tZHJpdmVuIGludGVyYWN0aW9ucyBhcmUgaGFuZGxlZCB3aXRoaW4gdGhpcyBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIENoZWNrYm94VHJlZUFuZExpc3RHcm91cCBleHRlbmRzIEV2ZW50TWFuYWdlciBpbXBsZW1lbnRzCi0JCUlDaGVja1N0YXRlTGlzdGVuZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElUcmVlVmlld2VyTGlzdGVuZXIgewotICAgIHByaXZhdGUgT2JqZWN0IHJvb3Q7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBjdXJyZW50VHJlZVNlbGVjdGlvbjsKLQotICAgIHByaXZhdGUgTGlzdCBleHBhbmRlZFRyZWVOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgTWFwIGNoZWNrZWRTdGF0ZVN0b3JlID0gbmV3IEhhc2hNYXAoOSk7Ci0KLSAgICBwcml2YXRlIExpc3Qgd2hpdGVDaGVja2VkVHJlZUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHJpdmF0ZSBJVHJlZUNvbnRlbnRQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBsaXN0Q29udGVudFByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBJTGFiZWxQcm92aWRlciB0cmVlTGFiZWxQcm92aWRlcjsKLQotICAgIHByaXZhdGUgSUxhYmVsUHJvdmlkZXIgbGlzdExhYmVsUHJvdmlkZXI7Ci0KLSAgICAvLyB3aWRnZXRzCi0gICAgcHJpdmF0ZSBDaGVja2JveFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotICAgIHByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBsaXN0Vmlld2VyOwotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLiAgVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdpc2ggdG8gc3BlY2lmeQotICAgICAqCXRoZSB3aWR0aCBhbmQvb3IgaGVpZ2h0IG9mIHRoZSBjb21iaW5lZCB3aWRnZXQgKHRvIG9ubHkgaGFyZGNvZGUgb25lIG9mIHRoZQotICAgICAqCXNpemluZyBkaW1lbnNpb25zLCBzcGVjaWZ5IHRoZSBvdGhlciBkaW1lbnNpb24ncyB2YWx1ZSBhcyAtMSkKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogQHBhcmFtIHJvb3RPYmplY3QKLSAgICAgKiBAcGFyYW0gdHJlZUNvbnRlbnRQcm92aWRlcgotICAgICAqIEBwYXJhbSB0cmVlTGFiZWxQcm92aWRlcgotICAgICAqIEBwYXJhbSBsaXN0Q29udGVudFByb3ZpZGVyCi0gICAgICogQHBhcmFtIGxpc3RMYWJlbFByb3ZpZGVyCi0gICAgICogQHBhcmFtIHN0eWxlCi0gICAgICogQHBhcmFtIHdpZHRoCi0gICAgICogQHBhcmFtIGhlaWdodAotICAgICAqLwotICAgIHB1YmxpYyBDaGVja2JveFRyZWVBbmRMaXN0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IHJvb3RPYmplY3QsCi0gICAgICAgICAgICBJVHJlZUNvbnRlbnRQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyLAotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgdHJlZUxhYmVsUHJvdmlkZXIsCi0gICAgICAgICAgICBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBsaXN0Q29udGVudFByb3ZpZGVyLAotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGlzdExhYmVsUHJvdmlkZXIsIGludCBzdHlsZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0KLSAgICAgICAgcm9vdCA9IHJvb3RPYmplY3Q7Ci0gICAgICAgIHRoaXMudHJlZUNvbnRlbnRQcm92aWRlciA9IHRyZWVDb250ZW50UHJvdmlkZXI7Ci0gICAgICAgIHRoaXMubGlzdENvbnRlbnRQcm92aWRlciA9IGxpc3RDb250ZW50UHJvdmlkZXI7Ci0gICAgICAgIHRoaXMudHJlZUxhYmVsUHJvdmlkZXIgPSB0cmVlTGFiZWxQcm92aWRlcjsKLSAgICAgICAgdGhpcy5saXN0TGFiZWxQcm92aWRlciA9IGxpc3RMYWJlbFByb3ZpZGVyOwotICAgICAgICBjcmVhdGVDb250ZW50cyhwYXJlbnQsIHdpZHRoLCBoZWlnaHQsIHN0eWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGlzIHdpbmRvdyBiZWNvbWVzIHZpc2libGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvdXRUb09wZW4oKSB7Ci0gICAgICAgIGRldGVybWluZVdoaXRlQ2hlY2tlZERlc2NlbmRlbnRzKHJvb3QpOwotICAgICAgICBjaGVja05ld1RyZWVFbGVtZW50cyh0cmVlQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKHJvb3QpKTsKLSAgICAgICAgY3VycmVudFRyZWVTZWxlY3Rpb24gPSBudWxsOwotCi0gICAgICAgIC8vc2VsZWN0IHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBsaXN0Ci0gICAgICAgIE9iamVjdFtdIGVsZW1lbnRzID0gdHJlZUNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhyb290KTsKLSAgICAgICAgT2JqZWN0IHByaW1hcnkgPSBlbGVtZW50cy5sZW5ndGggPiAwID8gZWxlbWVudHNbMF0gOiBudWxsOwotICAgICAgICBpZiAocHJpbWFyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwcmltYXJ5KSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBZGQgdGhlIHBhc3NlZCBsaXN0ZW5lciB0byBzZWxmJ3MgY29sbGVjdGlvbiBvZiBjbGllbnRzCi0gICAgICoJdGhhdCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gZWxlbWVudCBjaGVja2VkIHN0YXRlcwotICAgICAqCi0gICAgICoJQHBhcmFtIGxpc3RlbmVyIElDaGVja1N0YXRlTGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDaGVja1N0YXRlTGlzdGVuZXIoSUNoZWNrU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBhZGRMaXN0ZW5lck9iamVjdChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQWRkIHRoZSByZWNlaXZlciBhbmQgYWxsIG9mIGl0J3MgYW5jZXN0b3JzIHRvIHRoZSBjaGVja2VkU3RhdGVTdG9yZSBpZiB0aGV5Ci0gICAgICogYXJlIG5vdCBhbHJlYWR5IHRoZXJlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRUb0hpZXJhcmNoeVRvQ2hlY2tlZFN0b3JlKE9iamVjdCB0cmVlRWxlbWVudCkgewotCi0gICAgICAgIC8vIGlmIHRoaXMgdHJlZSBlbGVtZW50IGlzIGFscmVhZHkgZ3JheSB0aGVuIGl0cyBhbmNlc3RvcnMgYWxsIGFyZSBhcyB3ZWxsCi0gICAgICAgIGlmICghY2hlY2tlZFN0YXRlU3RvcmUuY29udGFpbnNLZXkodHJlZUVsZW1lbnQpKQotICAgICAgICAgICAgY2hlY2tlZFN0YXRlU3RvcmUucHV0KHRyZWVFbGVtZW50LCBuZXcgQXJyYXlMaXN0KCkpOwotCi0gICAgICAgIE9iamVjdCBwYXJlbnQgPSB0cmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudCh0cmVlRWxlbWVudCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIGFkZFRvSGllcmFyY2h5VG9DaGVja2VkU3RvcmUocGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbGwgY2hpbGRyZW4gb2YgdGhlIHBhc3NlZCB0cmVlIGVsZW1lbnQKLSAgICAgKglhcmUgY3VycmVudGx5IHdoaXRlLWNoZWNrZWQKLSAgICAgKgotICAgICAqCUByZXR1cm4gYm9vbGVhbgotICAgICAqCUBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYXJlQWxsQ2hpbGRyZW5XaGl0ZUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0gICAgICAgIE9iamVjdFtdIGNoaWxkcmVuID0gdHJlZUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbih0cmVlRWxlbWVudCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGlmICghd2hpdGVDaGVja2VkVHJlZUl0ZW1zLmNvbnRhaW5zKGNoaWxkcmVuW2ldKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbGwgbGlzdCBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKgl0aGUgcGFzc2VkIHRyZWUgZWxlbWVudCBhcmUgY3VycmVudGx5IGNoZWNrZWQKLSAgICAgKgotICAgICAqCUByZXR1cm4gYm9vbGVhbgotICAgICAqCUBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYXJlQWxsRWxlbWVudHNDaGVja2VkKE9iamVjdCB0cmVlRWxlbWVudCkgewotICAgICAgICBMaXN0IGNoZWNrZWRFbGVtZW50cyA9IChMaXN0KSBjaGVja2VkU3RhdGVTdG9yZS5nZXQodHJlZUVsZW1lbnQpOwotICAgICAgICBpZiAoY2hlY2tlZEVsZW1lbnRzID09IG51bGwpIC8vIGllLi0gdHJlZSBpdGVtIG5vdCBldmVuIGdyYXktY2hlY2tlZAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiBnZXRMaXN0SXRlbXNTaXplKHRyZWVFbGVtZW50KSA9PSBjaGVja2VkRWxlbWVudHMuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUl0ZXJhdGUgdGhyb3VnaCB0aGUgcGFzc2VkIGVsZW1lbnRzIHdoaWNoIGFyZSBiZWluZyByZWFsaXplZCBmb3IgdGhlIGZpcnN0Ci0gICAgICoJdGltZSBhbmQgY2hlY2sgZWFjaCBvbmUgaW4gdGhlIHRyZWUgdmlld2VyIGFzIGFwcHJvcHJpYXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tOZXdUcmVlRWxlbWVudHMoT2JqZWN0W10gZWxlbWVudHMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgT2JqZWN0IGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICBib29sZWFuIGNoZWNrZWQgPSBjaGVja2VkU3RhdGVTdG9yZS5jb250YWluc0tleShjdXJyZW50RWxlbWVudCk7Ci0gICAgICAgICAgICB0cmVlVmlld2VyLnNldENoZWNrZWQoY3VycmVudEVsZW1lbnQsIGNoZWNrZWQpOwotICAgICAgICAgICAgdHJlZVZpZXdlci5zZXRHcmF5ZWQoY3VycmVudEVsZW1lbnQsIGNoZWNrZWQKLSAgICAgICAgICAgICAgICAgICAgJiYgIXdoaXRlQ2hlY2tlZFRyZWVJdGVtcy5jb250YWlucyhjdXJyZW50RWxlbWVudCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQW4gaXRlbSB3YXMgY2hlY2tlZCBpbiBvbmUgb2Ygc2VsZidzIHR3byB2aWV3cy4gIERldGVybWluZSB3aGljaAotICAgICAqCXZpZXcgdGhpcyBvY2N1cnJlZCBpbiBhbmQgZGVsZWdhdGUgYXBwcm9wcmlhdGVseQotICAgICAqCi0gICAgICoJQHBhcmFtIGV2ZW50IENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChmaW5hbCBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0KLSAgICAgICAgLy9Qb3RlbnRpYWxseSBsb25nIG9wZXJhdGlvbiAtIHNob3cgYSBidXN5IGN1cnNvcgotICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZSh0cmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksCi0gICAgICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0Q2hlY2thYmxlKCkuZXF1YWxzKHRyZWVWaWV3ZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVJdGVtQ2hlY2tlZChldmVudC5nZXRFbGVtZW50KCksIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0SXRlbUNoZWNrZWQoZXZlbnQuZ2V0RWxlbWVudCgpLCBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENoZWNrZWQoKSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUNoZWNrU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJTGF5IG91dCBhbmQgaW5pdGlhbGl6ZSBzZWxmJ3MgdmlzdWFsIGNvbXBvbmVudHMuCi0gICAgICoKLSAgICAgKglAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotICAgICAqCUBwYXJhbSB3aWR0aCBpbnQKLSAgICAgKglAcGFyYW0gaGVpZ2h0IGludAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgIGludCBzdHlsZSkgewotICAgICAgICAvLyBncm91cCBwYW5lCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgY3JlYXRlVHJlZVZpZXdlcihjb21wb3NpdGUsIHdpZHRoIC8gMiwgaGVpZ2h0KTsKLSAgICAgICAgY3JlYXRlTGlzdFZpZXdlcihjb21wb3NpdGUsIHdpZHRoIC8gMiwgaGVpZ2h0KTsKLQotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQ3JlYXRlIHRoaXMgZ3JvdXAncyBsaXN0IHZpZXdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaXN0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBsaXN0Vmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0gICAgICAgIGxpc3RWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBsaXN0Vmlld2VyLmdldFRhYmxlKCkuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgbGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobGlzdENvbnRlbnRQcm92aWRlcik7Ci0gICAgICAgIGxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsaXN0TGFiZWxQcm92aWRlcik7Ci0gICAgICAgIGxpc3RWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUNyZWF0ZSB0aGlzIGdyb3VwJ3MgdHJlZSB2aWV3ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgVHJlZSB0cmVlID0gbmV3IFRyZWUocGFyZW50LCBTV1QuQ0hFQ0sgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0gICAgICAgIHRyZWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgdHJlZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIHRyZWVWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHRyZWUpOwotICAgICAgICB0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcih0cmVlQ29udGVudFByb3ZpZGVyKTsKLSAgICAgICAgdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHRyZWVMYWJlbFByb3ZpZGVyKTsKLSAgICAgICAgdHJlZVZpZXdlci5hZGRUcmVlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIHRyZWVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICB0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhc3NlZCB0cmVlIGVsZW1lbnQgc2hvdWxkIGJlCi0gICAgICogYXQgTEVBU1QgZ3JheS1jaGVja2VkLiAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgbm90IGNvbnNpZGVyIHdoZXRoZXIKLSAgICAgKiBpdCBzaG91bGQgYmUgd2hpdGUtY2hlY2tlZCwgc28gYSBzcGVjaWZpZWQgdHJlZSBpdGVtIHdoaWNoIHNob3VsZCBiZQotICAgICAqIHdoaXRlLWNoZWNrZWQgd2lsbCByZXN1bHQgaW4gYSA8Y29kZT50cnVlPC9jb2RlPiBhbnN3ZXIgZnJvbSB0aGlzIG1ldGhvZC4KLSAgICAgKiBUbyBkZXRlcm1pbmUgd2hldGhlciBhIHRyZWUgaXRlbSBzaG91bGQgYmUgd2hpdGUtY2hlY2tlZCB1c2UgbWV0aG9kCi0gICAgICogI2RldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKE9iamVjdCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHJlZUVsZW1lbnQgamF2YS5sYW5nLk9iamVjdAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqIEBzZWUgI2RldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZGV0ZXJtaW5lU2hvdWxkQmVBdExlYXN0R3JheUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0gICAgICAgIC8vIGlmIGFueSBsaXN0IGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0cmVlRWxlbWVudCBhcmUgY2hlY2tlZCB0aGVuIGl0Ci0gICAgICAgIC8vIHJldGFpbnMgaXRzIGdyYXktY2hlY2tlZCBzdGF0dXMgcmVnYXJkbGVzcyBvZiBpdHMgY2hpbGRyZW4KLSAgICAgICAgTGlzdCBjaGVja2VkID0gKExpc3QpIGNoZWNrZWRTdGF0ZVN0b3JlLmdldCh0cmVlRWxlbWVudCk7Ci0gICAgICAgIGlmIChjaGVja2VkICE9IG51bGwgJiYgKCFjaGVja2VkLmlzRW1wdHkoKSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAvLyBpZiBhbnkgY2hpbGRyZW4gb2YgdHJlZUVsZW1lbnQgYXJlIHN0aWxsIGdyYXktY2hlY2tlZCB0aGVuIHRyZWVFbGVtZW50Ci0gICAgICAgIC8vIG11c3QgcmVtYWluIGdyYXktY2hlY2tlZCBhcyB3ZWxsCi0gICAgICAgIE9iamVjdFtdIGNoaWxkcmVuID0gdHJlZUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbih0cmVlRWxlbWVudCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChjaGVja2VkU3RhdGVTdG9yZS5jb250YWluc0tleShjaGlsZHJlbltpXSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYXNzZWQgdHJlZSBpdGVtIHNob3VsZCBiZQotICAgICAqIHdoaXRlLWNoZWNrZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKiBAcGFyYW0gdHJlZUVsZW1lbnQgamF2YS5sYW5nLk9iamVjdAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGRldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKE9iamVjdCB0cmVlRWxlbWVudCkgewotICAgICAgICByZXR1cm4gYXJlQWxsQ2hpbGRyZW5XaGl0ZUNoZWNrZWQodHJlZUVsZW1lbnQpCi0gICAgICAgICAgICAgICAgJiYgYXJlQWxsRWxlbWVudHNDaGVja2VkKHRyZWVFbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglSZWN1cnNpdmVseSBhZGQgYXBwcm9wcmlhdGUgdHJlZSBlbGVtZW50cyB0byB0aGUgY29sbGVjdGlvbiBvZgotICAgICAqCWtub3duIHdoaXRlLWNoZWNrZWQgdHJlZSBlbGVtZW50cy4KLSAgICAgKgotICAgICAqCUBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGV0ZXJtaW5lV2hpdGVDaGVja2VkRGVzY2VuZGVudHMoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0gICAgICAgIC8vIGFsd2F5cyBnbyB0aHJvdWdoIGFsbCBjaGlsZHJlbiBmaXJzdCBzaW5jZSB0aGVpciB3aGl0ZS1jaGVja2VkCi0gICAgICAgIC8vIHN0YXR1c2VzIHdpbGwgYmUgbmVlZGVkIHRvIGRldGVybWluZSB0aGUgd2hpdGUtY2hlY2tlZCBzdGF0dXMgZm9yCi0gICAgICAgIC8vIHRoaXMgdHJlZSBlbGVtZW50Ci0gICAgICAgIE9iamVjdFtdIGNoaWxkcmVuID0gdHJlZUNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyh0cmVlRWxlbWVudCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpCi0gICAgICAgICAgICBkZXRlcm1pbmVXaGl0ZUNoZWNrZWREZXNjZW5kZW50cyhjaGlsZHJlbltpXSk7Ci0KLSAgICAgICAgLy8gbm93IGRldGVybWluZSB0aGUgd2hpdGUtY2hlY2tlZCBzdGF0dXMgZm9yIHRoaXMgdHJlZSBlbGVtZW50Ci0gICAgICAgIGlmIChkZXRlcm1pbmVTaG91bGRCZVdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCkpCi0gICAgICAgICAgICBzZXRXaGl0ZUNoZWNrZWQodHJlZUVsZW1lbnQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhdXNlIHRoZSB0cmVlIHZpZXdlciB0byBleHBhbmQgYWxsIGl0cyBpdGVtcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4cGFuZEFsbCgpIHsKLSAgICAgICAgdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgYSBmbGF0IGNvbGxlY3Rpb24gb2YgYWxsIG9mIHRoZSBjaGVja2VkIGVsZW1lbnRzIGluIHRoZQotICAgICAqCWxpc3QgcG9ydGlvbiBvZiBzZWxmCi0gICAgICoKLSAgICAgKglAcmV0dXJuIGphdmEudXRpbC5WZWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QWxsQ2hlY2tlZExpc3RJdGVtcygpIHsKLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGxpc3RDb2xsZWN0aW9uc0VudW0gPSBjaGVja2VkU3RhdGVTdG9yZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChsaXN0Q29sbGVjdGlvbnNFbnVtLmhhc05leHQoKSkgewotICAgICAgICAgICAgSXRlcmF0b3IgY3VycmVudENvbGxlY3Rpb24gPSAoKExpc3QpIGxpc3RDb2xsZWN0aW9uc0VudW0ubmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Q29sbGVjdGlvbi5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjdXJyZW50Q29sbGVjdGlvbi5uZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciBhIGNvbGxlY3Rpb24gb2YgYWxsIG9mIHRoZSBjaGVja2VkIGVsZW1lbnRzIGluIHRoZSB0cmVlIHBvcnRpb24KLSAgICAgKglvZiBzZWxmCi0gICAgICoKLSAgICAgKglAcmV0dXJuIGphdmEudXRpbC5WZWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGdldEFsbENoZWNrZWRUcmVlSXRlbXMoKSB7Ci0gICAgICAgIHJldHVybiBjaGVja2VkU3RhdGVTdG9yZS5rZXlTZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBjaGVja2VkIGJ5IHRoZQotICAgICAqCXVzZXIuCi0gICAgICoKLSAgICAgKglAcmV0dXJuIGludAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q2hlY2tlZEVsZW1lbnRDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGNoZWNrZWRTdGF0ZVN0b3JlLnNpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglSZXR1cm4gYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGxpc3QgaXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEKLSAgICAgKglnaXZlbiB0cmVlIGl0ZW0uCi0gICAgICoKLSAgICAgKglAcmV0dXJuIGludAotICAgICAqCUBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRMaXN0SXRlbXNTaXplKE9iamVjdCB0cmVlRWxlbWVudCkgewotICAgICAgICBPYmplY3RbXSBlbGVtZW50cyA9IGxpc3RDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHModHJlZUVsZW1lbnQpOwotICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdGFibGUgdGhlIGxpc3Qgdmlld2VyIHVzZXMuCi0gICAgICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZQotICAgICAqLwotICAgIHB1YmxpYyBUYWJsZSBnZXRMaXN0VGFibGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxpc3RWaWV3ZXIuZ2V0VGFibGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglMb2dpY2FsbHkgZ3JheS1jaGVjayBhbGwgYW5jZXN0b3JzIG9mIHRyZWVJdGVtIGJ5IGVuc3VyaW5nIHRoYXQgdGhleQotICAgICAqCWFwcGVhciBpbiB0aGUgY2hlY2tlZCB0YWJsZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdyYXlDaGVja0hpZXJhcmNoeShPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQotICAgICAgICAvLyBpZiB0aGlzIHRyZWUgZWxlbWVudCBpcyBhbHJlYWR5IGdyYXkgdGhlbiBpdHMgYW5jZXN0b3JzIGFsbCBhcmUgYXMgd2VsbAotICAgICAgICBpZiAoY2hlY2tlZFN0YXRlU3RvcmUuY29udGFpbnNLZXkodHJlZUVsZW1lbnQpKQotICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBuZWVkIHRvIHByb2NlZWQgdXB3YXJkcyBmcm9tIGhlcmUKLQotICAgICAgICBjaGVja2VkU3RhdGVTdG9yZS5wdXQodHJlZUVsZW1lbnQsIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgIGlmIChkZXRlcm1pbmVTaG91bGRCZVdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCkpIHsKLSAgICAgICAgICAgIHNldFdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IHBhcmVudCA9IHRyZWVDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KHRyZWVFbGVtZW50KTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICAgICAgZ3JheUNoZWNrSGllcmFyY2h5KHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJU2V0IHRoZSBpbml0aWFsIGNoZWNrZWQgc3RhdGUgb2YgdGhlIHBhc3NlZCBsaXN0IGVsZW1lbnQgdG8gdHJ1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsQ2hlY2tMaXN0SXRlbShPYmplY3QgZWxlbWVudCkgewotICAgICAgICBPYmplY3QgcGFyZW50ID0gdHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0gICAgICAgIGN1cnJlbnRUcmVlU2VsZWN0aW9uID0gcGFyZW50OwotICAgICAgICAvL0FzIHRoaXMgaXMgbm90IGRvbmUgZnJvbSB0aGUgVUkgdGhlbiBzZXQgdGhlIGJveCBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgc2VsZWN0aW9uIHRvIGZhbHNlIAotICAgICAgICBsaXN0SXRlbUNoZWNrZWQoZWxlbWVudCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB1cGRhdGVIaWVyYXJjaHkocGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTZXQgdGhlIGluaXRpYWwgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgcGFzc2VkIGVsZW1lbnQgdG8gdHJ1ZSwKLSAgICAgKglhcyB3ZWxsIGFzIHRvIGFsbCBvZiBpdHMgY2hpbGRyZW4gYW5kIGFzc29jaWF0ZWQgbGlzdCBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxDaGVja1RyZWVJdGVtKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHRyZWVJdGVtQ2hlY2tlZChlbGVtZW50LCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglJbml0aWFsaXplIHRoaXMgZ3JvdXAncyB2aWV3ZXJzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGxhaWQgb3V0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICAgIHRyZWVWaWV3ZXIuc2V0SW5wdXQocm9vdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQ2FsbGJhY2sgdGhhdCdzIGludm9rZWQgd2hlbiB0aGUgY2hlY2tlZCBzdGF0dXMgb2YgYW4gaXRlbSBpbiB0aGUgbGlzdAotICAgICAqCWlzIGNoYW5nZWQgYnkgdGhlIHVzZXIuIERvIG5vdCB0cnkgYW5kIHVwZGF0ZSB0aGUgaGllcmFyY2h5IGlmIHdlIGFyZSBidWlsZGluZyB0aGUKLSAgICAgKiAgaW5pdGlhbCBsaXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RJdGVtQ2hlY2tlZChPYmplY3QgbGlzdEVsZW1lbnQsIGJvb2xlYW4gc3RhdGUsCi0gICAgICAgICAgICBib29sZWFuIHVwZGF0aW5nRnJvbVNlbGVjdGlvbikgewotICAgICAgICBMaXN0IGNoZWNrZWRMaXN0SXRlbXMgPSAoTGlzdCkgY2hlY2tlZFN0YXRlU3RvcmUKLSAgICAgICAgICAgICAgICAuZ2V0KGN1cnJlbnRUcmVlU2VsZWN0aW9uKTsKLQotICAgICAgICBpZiAoc3RhdGUpIHsKLSAgICAgICAgICAgIGlmIChjaGVja2VkTGlzdEl0ZW1zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgYXNzb2NpYXRlZCB0cmVlIGl0ZW0gaGFzIGdvbmUgZnJvbSAwIC0+IDEgY2hlY2tlZAotICAgICAgICAgICAgICAgIC8vIGxpc3QgaXRlbXMsIHRyZWUgY2hlY2tpbmcgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZAotICAgICAgICAgICAgICAgIGdyYXlDaGVja0hpZXJhcmNoeShjdXJyZW50VHJlZVNlbGVjdGlvbik7Ci0gICAgICAgICAgICAgICAgY2hlY2tlZExpc3RJdGVtcyA9IChMaXN0KSBjaGVja2VkU3RhdGVTdG9yZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChjdXJyZW50VHJlZVNlbGVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja2VkTGlzdEl0ZW1zLmFkZChsaXN0RWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGVja2VkTGlzdEl0ZW1zLnJlbW92ZShsaXN0RWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoY2hlY2tlZExpc3RJdGVtcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgYXNzb2NpYXRlZCB0cmVlIGl0ZW0gaGFzIGdvbmUgZnJvbSAxIC0+IDAgY2hlY2tlZAotICAgICAgICAgICAgICAgIC8vIGxpc3QgaXRlbXMsIHRyZWUgY2hlY2tpbmcgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZAotICAgICAgICAgICAgICAgIHVuZ3JheUNoZWNrSGllcmFyY2h5KGN1cnJlbnRUcmVlU2VsZWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1cGRhdGluZ0Zyb21TZWxlY3Rpb24pCi0gICAgICAgICAgICB1cGRhdGVIaWVyYXJjaHkoY3VycmVudFRyZWVTZWxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCU5vdGlmeSBhbGwgY2hlY2tlZCBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCB0aGUgcGFzc2VkIGVsZW1lbnQgaGFzIGhhZAotICAgICAqCWl0cyBjaGVja2VkIHN0YXRlIGNoYW5nZWQgdG8gdGhlIHBhc3NlZCBzdGF0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeUNoZWNrU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoCi0gICAgICAgICAgICBmaW5hbCBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIE9iamVjdFtdIGFycmF5ID0gZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIElDaGVja1N0YXRlTGlzdGVuZXIgbCA9IChJQ2hlY2tTdGF0ZUxpc3RlbmVyKSBhcnJheVtpXTsKLSAgICAgICAgICAgIFBsYXRmb3JtLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgbC5jaGVja1N0YXRlQ2hhbmdlZChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKlNldCB0aGUgY29udGVudHMgb2YgdGhlIGxpc3Qgdmlld2VyIGJhc2VkIHVwb24gdGhlIHNwZWNpZmllZCBzZWxlY3RlZAotICAgICAqdHJlZSBlbGVtZW50LiAgVGhpcyBhbHNvIGluY2x1ZGVzIGNoZWNraW5nIHRoZSBhcHByb3ByaWF0ZSBsaXN0IGl0ZW1zLgotICAgICAqCi0gICAgICpAcGFyYW0gdHJlZUVsZW1lbnQgamF2YS5sYW5nLk9iamVjdAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlzdFZpZXdlcihmaW5hbCBPYmplY3QgdHJlZUVsZW1lbnQpIHsKLSAgICAgICAgbGlzdFZpZXdlci5zZXRJbnB1dCh0cmVlRWxlbWVudCk7Ci0gICAgICAgIExpc3QgbGlzdEl0ZW1zVG9DaGVjayA9IChMaXN0KSBjaGVja2VkU3RhdGVTdG9yZS5nZXQodHJlZUVsZW1lbnQpOwotCi0gICAgICAgIGlmIChsaXN0SXRlbXNUb0NoZWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGxpc3RJdGVtc0VudW0gPSBsaXN0SXRlbXNUb0NoZWNrLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAobGlzdEl0ZW1zRW51bS5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgbGlzdFZpZXdlci5zZXRDaGVja2VkKGxpc3RJdGVtc0VudW0ubmV4dCgpLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCVJlbW92ZSB0aGUgcGFzc2VkIGxpc3RlbmVyIGZyb20gc2VsZidzIGNvbGxlY3Rpb24gb2YgY2xpZW50cwotICAgICAqCXRoYXQgbGlzdGVuIGZvciBjaGFuZ2VzIHRvIGVsZW1lbnQgY2hlY2tlZCBzdGF0ZXMKLSAgICAgKgotICAgICAqCUBwYXJhbSBsaXN0ZW5lciBJQ2hlY2tTdGF0ZUxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hlY2tTdGF0ZUxpc3RlbmVyKElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcmVtb3ZlTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUhhbmRsZSB0aGUgc2VsZWN0aW9uIG9mIGFuIGl0ZW0gaW4gdGhlIHRyZWUgdmlld2VyCi0gICAgICoKLSAgICAgKglAcGFyYW0gZXZlbnQgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjdXJyZW50VHJlZVNlbGVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICBsaXN0Vmlld2VyLnNldElucHV0KGN1cnJlbnRUcmVlU2VsZWN0aW9uKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGllLi0gaWYgbm90IGFuIGl0ZW0gZGVzZWxlY3Rpb24KLSAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCAhPSBjdXJyZW50VHJlZVNlbGVjdGlvbikKLSAgICAgICAgICAgIHBvcHVsYXRlTGlzdFZpZXdlcihzZWxlY3RlZEVsZW1lbnQpOwotCi0gICAgICAgIGN1cnJlbnRUcmVlU2VsZWN0aW9uID0gc2VsZWN0ZWRFbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbGVjdCBvciBkZXNlbGVjdCBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSB0cmVlIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdGlvbgotICAgICAqIGJvb2xlYW4uIEJlIHN1cmUgdG8gdXBkYXRlIHRoZSBkaXNwbGF5ZWQgZmlsZXMgYXMgd2VsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxTZWxlY3Rpb25zKGZpbmFsIGJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0KLSAgICAgICAgLy9Qb3RlbnRpYWxseSBsb25nIG9wZXJhdGlvbiAtIHNob3cgYSBidXN5IGN1cnNvcgotICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZSh0cmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksCi0gICAgICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRUcmVlQ2hlY2tlZChyb290LCBzZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZpZXdlci5zZXRBbGxDaGVja2VkKHNlbGVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTZXQgdGhlIGxpc3Qgdmlld2VyJ3MgcHJvdmlkZXJzIHRvIHRob3NlIHBhc3NlZAotICAgICAqCi0gICAgICoJQHBhcmFtIGNvbnRlbnRQcm92aWRlciBJVHJlZUNvbnRlbnRQcm92aWRlcgotICAgICAqCUBwYXJhbSBsYWJlbFByb3ZpZGVyIElMYWJlbFByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdFByb3ZpZGVycyhJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0gICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0gICAgICAgIGxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0gICAgICAgIGxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTZXQgdGhlIHNvcnRlciB0aGF0IGlzIHRvIGJlIGFwcGxpZWQgdG8gc2VsZidzIGxpc3Qgdmlld2VyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdFNvcnRlcihWaWV3ZXJTb3J0ZXIgc29ydGVyKSB7Ci0gICAgICAgIGxpc3RWaWV3ZXIuc2V0U29ydGVyKHNvcnRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSByb290IG9mIHRoZSB3aWRnZXQgdG8gYmUgbmV3IFJvb3QuIFJlZ2VuZXJhdGUgYWxsIG9mIHRoZSB0YWJsZXMgYW5kIGxpc3RzIGZyb20gdGhpcwotICAgICAqIHZhbHVlLgotICAgICAqIEBwYXJhbSBuZXdSb290IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvb3QoT2JqZWN0IG5ld1Jvb3QpIHsKLSAgICAgICAgdGhpcy5yb290ID0gbmV3Um9vdDsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCVNldCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgcGFzc2VkIHRyZWUgZWxlbWVudCBhcHByb3ByaWF0ZWx5LCBhbmQKLSAgICAgKglkbyBzbyByZWN1cnNpdmVseSB0byBhbGwgb2YgaXRzIGNoaWxkIHRyZWUgZWxlbWVudHMgYXMgd2VsbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFRyZWVDaGVja2VkKE9iamVjdCB0cmVlRWxlbWVudCwgYm9vbGVhbiBzdGF0ZSkgewotCi0gICAgICAgIGlmICh0cmVlRWxlbWVudC5lcXVhbHMoY3VycmVudFRyZWVTZWxlY3Rpb24pKSB7Ci0gICAgICAgICAgICBsaXN0Vmlld2VyLnNldEFsbENoZWNrZWQoc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0YXRlKSB7Ci0gICAgICAgICAgICBPYmplY3RbXSBsaXN0SXRlbXMgPSBsaXN0Q29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKHRyZWVFbGVtZW50KTsKLSAgICAgICAgICAgIExpc3QgbGlzdEl0ZW1zQ2hlY2tlZCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdEl0ZW1zLmxlbmd0aDsgKytpKQotICAgICAgICAgICAgICAgIGxpc3RJdGVtc0NoZWNrZWQuYWRkKGxpc3RJdGVtc1tpXSk7Ci0KLSAgICAgICAgICAgIGNoZWNrZWRTdGF0ZVN0b3JlLnB1dCh0cmVlRWxlbWVudCwgbGlzdEl0ZW1zQ2hlY2tlZCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgY2hlY2tlZFN0YXRlU3RvcmUucmVtb3ZlKHRyZWVFbGVtZW50KTsKLQotICAgICAgICBzZXRXaGl0ZUNoZWNrZWQodHJlZUVsZW1lbnQsIHN0YXRlKTsKLSAgICAgICAgdHJlZVZpZXdlci5zZXRDaGVja2VkKHRyZWVFbGVtZW50LCBzdGF0ZSk7Ci0gICAgICAgIHRyZWVWaWV3ZXIuc2V0R3JheWVkKHRyZWVFbGVtZW50LCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gbm93IGxvZ2ljYWxseSBjaGVjay91bmNoZWNrIGFsbCBjaGlsZHJlbiBhcyB3ZWxsCi0gICAgICAgIE9iamVjdFtdIGNoaWxkcmVuID0gdHJlZUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbih0cmVlRWxlbWVudCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIHNldFRyZWVDaGVja2VkKGNoaWxkcmVuW2ldLCBzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTZXQgdGhlIHRyZWUgdmlld2VyJ3MgcHJvdmlkZXJzIHRvIHRob3NlIHBhc3NlZAotICAgICAqCi0gICAgICoJQHBhcmFtIGNvbnRlbnRQcm92aWRlciBJVHJlZUNvbnRlbnRQcm92aWRlcgotICAgICAqCUBwYXJhbSBsYWJlbFByb3ZpZGVyIElMYWJlbFByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHJlZVByb3ZpZGVycyhJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0gICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0gICAgICAgIHRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0gICAgICAgIHRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTZXQgdGhlIHNvcnRlciB0aGF0IGlzIHRvIGJlIGFwcGxpZWQgdG8gc2VsZidzIHRyZWUgdmlld2VyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHJlZVNvcnRlcihWaWV3ZXJTb3J0ZXIgc29ydGVyKSB7Ci0gICAgICAgIHRyZWVWaWV3ZXIuc2V0U29ydGVyKHNvcnRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQWRqdXN0IHRoZSBjb2xsZWN0aW9uIG9mIHJlZmVyZW5jZXMgdG8gd2hpdGUtY2hlY2tlZCB0cmVlIGVsZW1lbnRzIGFwcHJvcHJpYXRlbHkuCi0gICAgICoKLSAgICAgKglAcGFyYW0gdHJlZUVsZW1lbnQgamF2YS5sYW5nLk9iamVjdAotICAgICAqCUBwYXJhbSBpc1doaXRlQ2hlY2tlZCBib29sZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0V2hpdGVDaGVja2VkKE9iamVjdCB0cmVlRWxlbWVudCwgYm9vbGVhbiBpc1doaXRlQ2hlY2tlZCkgewotICAgICAgICBpZiAoaXNXaGl0ZUNoZWNrZWQpIHsKLSAgICAgICAgICAgIGlmICghd2hpdGVDaGVja2VkVHJlZUl0ZW1zLmNvbnRhaW5zKHRyZWVFbGVtZW50KSkKLSAgICAgICAgICAgICAgICB3aGl0ZUNoZWNrZWRUcmVlSXRlbXMuYWRkKHRyZWVFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB3aGl0ZUNoZWNrZWRUcmVlSXRlbXMucmVtb3ZlKHRyZWVFbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglIYW5kbGUgdGhlIGNvbGxhcHNpbmcgb2YgYW4gZWxlbWVudCBpbiBhIHRyZWUgdmlld2VyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyB3aXRoIHRoaXMKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglIYW5kbGUgdGhlIGV4cGFuc2lvbnNpb24gb2YgYW4gZWxlbWVudCBpbiBhIHRyZWUgdmlld2VyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotCi0gICAgICAgIE9iamVjdCBpdGVtID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0gICAgICAgIC8vIEZpcnN0IHNlZSBpZiB0aGUgY2hpbGRyZW4gbmVlZCB0byBiZSBnaXZlbiB0aGVpciBjaGVja2VkIHN0YXRlIGF0IGFsbC4gIElmIHRoZXkndmUKLSAgICAgICAgLy8gYWxyZWFkeSBiZWVuIHJlYWxpemVkIHRoZW4gdGhpcyB3b24ndCBiZSBuZWNlc3NhcnkKLSAgICAgICAgaWYgKCFleHBhbmRlZFRyZWVOb2Rlcy5jb250YWlucyhpdGVtKSkgewotICAgICAgICAgICAgZXhwYW5kZWRUcmVlTm9kZXMuYWRkKGl0ZW0pOwotICAgICAgICAgICAgY2hlY2tOZXdUcmVlRWxlbWVudHModHJlZUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihpdGVtKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2FsbGJhY2sgdGhhdCdzIGludm9rZWQgd2hlbiB0aGUgY2hlY2tlZCBzdGF0dXMgb2YgYW4gaXRlbSBpbiB0aGUgdHJlZQotICAgICAqICBpcyBjaGFuZ2VkIGJ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRyZWVJdGVtQ2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQsIGJvb2xlYW4gc3RhdGUpIHsKLQotICAgICAgICAvLyByZWN1cnNpdmVseSBhZGp1c3QgYWxsIGNoaWxkIHRyZWUgZWxlbWVudHMgYXBwcm9wcmlhdGVseQotICAgICAgICBzZXRUcmVlQ2hlY2tlZCh0cmVlRWxlbWVudCwgc3RhdGUpOwotCi0gICAgICAgIE9iamVjdCBwYXJlbnQgPSB0cmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudCh0cmVlRWxlbWVudCk7Ci0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBub3cgdXBkYXRlIHVwd2FyZHMgaW4gdGhlIHRyZWUgaGllcmFyY2h5IAotICAgICAgICBpZiAoc3RhdGUpCi0gICAgICAgICAgICBncmF5Q2hlY2tIaWVyYXJjaHkocGFyZW50KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdW5ncmF5Q2hlY2tIaWVyYXJjaHkocGFyZW50KTsKLQotICAgICAgICB1cGRhdGVIaWVyYXJjaHkodHJlZUVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUxvZ2ljYWxseSB1bi1ncmF5LWNoZWNrIGFsbCBhbmNlc3RvcnMgb2YgdHJlZUl0ZW0gaWZmIGFwcHJvcHJpYXRlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVuZ3JheUNoZWNrSGllcmFyY2h5KE9iamVjdCB0cmVlRWxlbWVudCkgewotICAgICAgICBpZiAoIWRldGVybWluZVNob3VsZEJlQXRMZWFzdEdyYXlDaGVja2VkKHRyZWVFbGVtZW50KSkKLSAgICAgICAgICAgIGNoZWNrZWRTdGF0ZVN0b3JlLnJlbW92ZSh0cmVlRWxlbWVudCk7Ci0KLSAgICAgICAgT2JqZWN0IHBhcmVudCA9IHRyZWVDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KHRyZWVFbGVtZW50KTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICAgICAgdW5ncmF5Q2hlY2tIaWVyYXJjaHkocGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTZXQgdGhlIGNoZWNrZWQgc3RhdGUgb2Ygc2VsZiBhbmQgYWxsIGFuY2VzdG9ycyBhcHByb3ByaWF0ZWx5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGllcmFyY2h5KE9iamVjdCB0cmVlRWxlbWVudCkgewotCi0gICAgICAgIGJvb2xlYW4gd2hpdGVDaGVja2VkID0gZGV0ZXJtaW5lU2hvdWxkQmVXaGl0ZUNoZWNrZWQodHJlZUVsZW1lbnQpOwotICAgICAgICBib29sZWFuIHNob3VsZEJlQXRMZWFzdEdyYXkgPSBkZXRlcm1pbmVTaG91bGRCZUF0TGVhc3RHcmF5Q2hlY2tlZCh0cmVlRWxlbWVudCk7Ci0KLSAgICAgICAgdHJlZVZpZXdlci5zZXRDaGVja2VkKHRyZWVFbGVtZW50LCBzaG91bGRCZUF0TGVhc3RHcmF5KTsKLSAgICAgICAgc2V0V2hpdGVDaGVja2VkKHRyZWVFbGVtZW50LCB3aGl0ZUNoZWNrZWQpOwotICAgICAgICBpZiAoIXdoaXRlQ2hlY2tlZCkKLSAgICAgICAgICAgIHRyZWVWaWV3ZXIuc2V0R3JheWVkKHRyZWVFbGVtZW50LCBzaG91bGRCZUF0TGVhc3RHcmF5KTsKLQotICAgICAgICAvLyBwcm9jZWVkIHVwIHRoZSB0cmVlIGVsZW1lbnQgaGllcmFyY2h5Ci0gICAgICAgIE9iamVjdCBwYXJlbnQgPSB0cmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudCh0cmVlRWxlbWVudCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgdXBkYXRlSGllcmFyY2h5KHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHNlbGVjdGlvbnMgb2YgdGhlIHRyZWUgZWxlbWVudHMgaW4gaXRlbXMgdG8gcmVmbGVjdCB0aGUgbmV3Ci0gICAgICogc2VsZWN0aW9ucyBwcm92aWRlZC4KLSAgICAgKiBAcGFyYW0gaXRlbXMgTWFwIHdpdGgga2V5cyBvZiBPYmplY3QgKHRoZSB0cmVlIGVsZW1lbnQpIGFuZCB2YWx1ZXMgb2YgTGlzdCAodGhlIHNlbGVjdGVkCi0gICAgICogbGlzdCBlbGVtZW50cykuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlU2VsZWN0aW9ucyhmaW5hbCBNYXAgaXRlbXMpIHsKLQotICAgICAgICAvL1BvdGVudGlhbGx5IGxvbmcgb3BlcmF0aW9uIC0gc2hvdyBhIGJ1c3kgY3Vyc29yCi0gICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwKLSAgICAgICAgICAgICAgICBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGtleUl0ZXJhdG9yID0gaXRlbXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy9VcGRhdGUgdGhlIHN0b3JlIGJlZm9yZSB0aGUgaGllcmFyY2h5IHRvIHByZXZlbnQgdXBkYXRpbmcgcGFyZW50cyBiZWZvcmUgYWxsIG9mIHRoZSBjaGlsZHJlbiBhcmUgZG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGtleUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBrZXlJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZXBsYWNlIHRoZSBpdGVtcyBpbiB0aGUgY2hlY2tlZCBzdGF0ZSBzdG9yZSB3aXRoIHRob3NlIGZyb20gdGhlIHN1cHBsaWVkIGl0ZW1zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBzZWxlY3Rpb25zID0gKExpc3QpIGl0ZW1zLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25zLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGl0IGlzIGVtcHR5IHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRTdGF0ZVN0b3JlLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkU3RhdGVTdG9yZS5wdXQoa2V5LCBzZWxlY3Rpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCB1cCB0aGUgdHJlZSBlbGVtZW50IGhpZXJhcmNoeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcGFyZW50ID0gdHJlZUNvbnRlbnRQcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJlbnQoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUb0hpZXJhcmNoeVRvQ2hlY2tlZFN0b3JlKHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vTm93IHVwZGF0ZSBoaWVyYXJjaGllcwotICAgICAgICAgICAgICAgICAgICAgICAga2V5SXRlcmF0b3IgPSBpdGVtcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoa2V5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGtleUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVIaWVyYXJjaHkoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRyZWVTZWxlY3Rpb24gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY3VycmVudFRyZWVTZWxlY3Rpb24uZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoKChMaXN0KSBpdGVtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoa2V5KSkudG9BcnJheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbWlzYy9Db250YWluZXJDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbWlzYy9Db250YWluZXJDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzYmYzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21pc2MvQ29udGFpbmVyQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5taXNjOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBQcm92aWRlcyBjb250ZW50IGZvciBhIHRyZWUgdmlld2VyIHRoYXQgc2hvd3Mgb25seSBjb250YWluZXJzLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93Q2xvc2VkUHJvamVjdHMgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBDb250YWluZXJDb250ZW50UHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIENvbnRhaW5lckNvbnRlbnRQcm92aWRlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmlzdWFsIHBhcnQgdGhhdCBpcyB1c2luZyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgaXMgYWJvdXQKLSAgICAgKiB0byBiZSBkaXNwb3NlZC4gRGVhbGxvY2F0ZSBhbGwgYWxsb2NhdGVkIFNXVCByZXNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpIHsKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIGNsb3NlZCBwcm9qZWN0cyBzaG91bGQgYmUgc2hvd24KLSAgICAgICAgICAgIElQcm9qZWN0W10gYWxsUHJvamVjdHMgPSAoKElXb3Jrc3BhY2UpIGVsZW1lbnQpLmdldFJvb3QoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvamVjdHMoKTsKLSAgICAgICAgICAgIGlmIChzaG93Q2xvc2VkUHJvamVjdHMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFsbFByb2plY3RzOwotCi0gICAgICAgICAgICBBcnJheUxpc3QgYWNjZXNzaWJsZVByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChhbGxQcm9qZWN0c1tpXS5pc09wZW4oKSkgewotICAgICAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlUHJvamVjdHMuYWRkKGFsbFByb2plY3RzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYWNjZXNzaWJsZVByb2plY3RzLnRvQXJyYXkoKTsKLSAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotICAgICAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgZWxlbWVudDsKLSAgICAgICAgICAgIGlmIChjb250YWluZXIuaXNBY2Nlc3NpYmxlKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VbXSBtZW1iZXJzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyc1tpXS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQobWVtYmVyc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2Ugd2UgY2FsbCAjaXNBY2Nlc3NpYmxlIGJlZm9yZSBpbnZva2luZyAjbWVtYmVycwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICAgICAgICByZXR1cm4gKChJUmVzb3VyY2UpIGVsZW1lbnQpLmdldFBhcmVudCgpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSB3aGV0aGVyIG9yIG5vdCB0byBzaG93IGNsb3NlZCBwcm9qZWN0cyBpbiB0aGUgdHJlZSAKLSAgICAgKiB2aWV3ZXIuICBEZWZhdWx0IGlzIHRvIHNob3cgY2xvc2VkIHByb2plY3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaG93IGJvb2xlYW4gaWYgZmFsc2UsIGRvIG5vdCBzaG93IGNsb3NlZCBwcm9qZWN0cyBpbiB0aGUgdHJlZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dDbG9zZWRQcm9qZWN0cyhib29sZWFuIHNob3cpIHsKLSAgICAgICAgc2hvd0Nsb3NlZFByb2plY3RzID0gc2hvdzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbWlzYy9Db250YWluZXJTZWxlY3Rpb25Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9taXNjL0NvbnRhaW5lclNlbGVjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjQ5ODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9taXNjL0NvbnRhaW5lclNlbGVjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5taXNjOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRHJpbGxEb3duQ29tcG9zaXRlOwotCi0vKioKLSAqIFdvcmtiZW5jaC1sZXZlbCBjb21wb3NpdGUgZm9yIGNob29zaW5nIGEgY29udGFpbmVyLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyU2VsZWN0aW9uR3JvdXAgZXh0ZW5kcyBDb21wb3NpdGUgewotICAgIC8vIFRoZSBsaXN0ZW5lciB0byBub3RpZnkgb2YgZXZlbnRzCi0gICAgcHJpdmF0ZSBMaXN0ZW5lciBsaXN0ZW5lcjsKLQotICAgIC8vIEVuYWJsZSB1c2VyIHRvIHR5cGUgaW4gbmV3IGNvbnRhaW5lciBuYW1lCi0gICAgcHJpdmF0ZSBib29sZWFuIGFsbG93TmV3Q29udGFpbmVyTmFtZSA9IHRydWU7Ci0KLSAgICAvLyBzaG93IGFsbCBwcm9qZWN0cyBieSBkZWZhdWx0Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNob3dDbG9zZWRQcm9qZWN0cyA9IHRydWU7Ci0KLSAgICAvLyBMYXN0IHNlbGVjdGlvbiBtYWRlIGJ5IHVzZXIKLSAgICBwcml2YXRlIElDb250YWluZXIgc2VsZWN0ZWRDb250YWluZXI7Ci0KLSAgICAvLyBoYW5kbGUgb24gcGFydHMKLSAgICBwcml2YXRlIFRleHQgY29udGFpbmVyTmFtZUZpZWxkOwotCi0gICAgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0gICAgLy8gdGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBhdCB0aGUgdG9wIG9mIHRoaXMgZGlhbG9nCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTVNHX05FV19BTExPV0VEID0gSURFV29ya2JlbmNoTWVzc2FnZXMuQ29udGFpbmVyR3JvdXBfbWVzc2FnZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01TR19TRUxFQ1RfT05MWSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLkNvbnRhaW5lckdyb3VwX3NlbGVjdEZvbGRlcjsKLQotICAgIC8vIHNpemluZyBjb25zdGFudHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1NFTEVDVElPTl9QQU5FX1dJRFRIID0gMzIwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19TRUxFQ1RJT05fUEFORV9IRUlHSFQgPSAzMDA7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB3aWRnZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgd2lkZ2V0IG9mIHRoZSBncm91cC4KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQSBsaXN0ZW5lciB0byBmb3J3YXJkIGV2ZW50cyB0by4gQ2FuIGJlIG51bGwgaWYKLSAgICAgKgkgbm8gbGlzdGVuZXIgaXMgcmVxdWlyZWQuCi0gICAgICogQHBhcmFtIGFsbG93TmV3Q29udGFpbmVyTmFtZSBFbmFibGUgdGhlIHVzZXIgdG8gdHlwZSBpbiBhIG5ldyBjb250YWluZXIKLSAgICAgKiAgbmFtZSBpbnN0ZWFkIG9mIGp1c3Qgc2VsZWN0aW5nIGZyb20gdGhlIGV4aXN0aW5nIG9uZXMuCi0gICAgICovCi0gICAgcHVibGljIENvbnRhaW5lclNlbGVjdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgYm9vbGVhbiBhbGxvd05ld0NvbnRhaW5lck5hbWUpIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIGxpc3RlbmVyLCBhbGxvd05ld0NvbnRhaW5lck5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHdpZGdldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB3aWRnZXQgb2YgdGhlIGdyb3VwLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBBIGxpc3RlbmVyIHRvIGZvcndhcmQgZXZlbnRzIHRvLiAgQ2FuIGJlIG51bGwgaWYKLSAgICAgKgkgbm8gbGlzdGVuZXIgaXMgcmVxdWlyZWQuCi0gICAgICogQHBhcmFtIGFsbG93TmV3Q29udGFpbmVyTmFtZSBFbmFibGUgdGhlIHVzZXIgdG8gdHlwZSBpbiBhIG5ldyBjb250YWluZXIKLSAgICAgKiAgbmFtZSBpbnN0ZWFkIG9mIGp1c3Qgc2VsZWN0aW5nIGZyb20gdGhlIGV4aXN0aW5nIG9uZXMuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHRleHQgdG8gcHJlc2VudCB0byB0aGUgdXNlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGFpbmVyU2VsZWN0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICBib29sZWFuIGFsbG93TmV3Q29udGFpbmVyTmFtZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIGxpc3RlbmVyLCBhbGxvd05ld0NvbnRhaW5lck5hbWUsIG1lc3NhZ2UsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHdpZGdldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB3aWRnZXQgb2YgdGhlIGdyb3VwLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBBIGxpc3RlbmVyIHRvIGZvcndhcmQgZXZlbnRzIHRvLiAgQ2FuIGJlIG51bGwgaWYKLSAgICAgKgkgbm8gbGlzdGVuZXIgaXMgcmVxdWlyZWQuCi0gICAgICogQHBhcmFtIGFsbG93TmV3Q29udGFpbmVyTmFtZSBFbmFibGUgdGhlIHVzZXIgdG8gdHlwZSBpbiBhIG5ldyBjb250YWluZXIKLSAgICAgKiAgbmFtZSBpbnN0ZWFkIG9mIGp1c3Qgc2VsZWN0aW5nIGZyb20gdGhlIGV4aXN0aW5nIG9uZXMuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHRleHQgdG8gcHJlc2VudCB0byB0aGUgdXNlci4KLSAgICAgKiBAcGFyYW0gc2hvd0Nsb3NlZFByb2plY3RzIFdoZXRoZXIgb3Igbm90IHRvIHNob3cgY2xvc2VkIHByb2plY3RzLgotICAgICAqLwotICAgIHB1YmxpYyBDb250YWluZXJTZWxlY3Rpb25Hcm91cChDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dOZXdDb250YWluZXJOYW1lLCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgICAgICAgIGJvb2xlYW4gc2hvd0Nsb3NlZFByb2plY3RzKSB7Ci0gICAgICAgIHRoaXMocGFyZW50LCBsaXN0ZW5lciwgYWxsb3dOZXdDb250YWluZXJOYW1lLCBtZXNzYWdlLAotICAgICAgICAgICAgICAgIHNob3dDbG9zZWRQcm9qZWN0cywgU0laSU5HX1NFTEVDVElPTl9QQU5FX0hFSUdIVCwgU0laSU5HX1NFTEVDVElPTl9QQU5FX1dJRFRIKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB3aWRnZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgd2lkZ2V0IG9mIHRoZSBncm91cC4KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQSBsaXN0ZW5lciB0byBmb3J3YXJkIGV2ZW50cyB0by4gIENhbiBiZSBudWxsIGlmCi0gICAgICoJIG5vIGxpc3RlbmVyIGlzIHJlcXVpcmVkLgotICAgICAqIEBwYXJhbSBhbGxvd05ld0NvbnRhaW5lck5hbWUgRW5hYmxlIHRoZSB1c2VyIHRvIHR5cGUgaW4gYSBuZXcgY29udGFpbmVyCi0gICAgICogIG5hbWUgaW5zdGVhZCBvZiBqdXN0IHNlbGVjdGluZyBmcm9tIHRoZSBleGlzdGluZyBvbmVzLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSB0ZXh0IHRvIHByZXNlbnQgdG8gdGhlIHVzZXIuCi0gICAgICogQHBhcmFtIHNob3dDbG9zZWRQcm9qZWN0cyBXaGV0aGVyIG9yIG5vdCB0byBzaG93IGNsb3NlZCBwcm9qZWN0cy4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0SGludCBoZWlnaHQgaGludCBmb3IgdGhlIGRyaWxsIGRvd24gY29tcG9zaXRlCi0gICAgICovCi0gICAgcHVibGljIENvbnRhaW5lclNlbGVjdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgYm9vbGVhbiBhbGxvd05ld0NvbnRhaW5lck5hbWUsIFN0cmluZyBtZXNzYWdlLAotICAgICAgICAgICAgYm9vbGVhbiBzaG93Q2xvc2VkUHJvamVjdHMsIGludCBoZWlnaHRIaW50LCBpbnQgd2lkdGhIaW50KSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgIHRoaXMuYWxsb3dOZXdDb250YWluZXJOYW1lID0gYWxsb3dOZXdDb250YWluZXJOYW1lOwotICAgICAgICB0aGlzLnNob3dDbG9zZWRQcm9qZWN0cyA9IHNob3dDbG9zZWRQcm9qZWN0czsKLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIGNyZWF0ZUNvbnRlbnRzKG1lc3NhZ2UsIGhlaWdodEhpbnQsIHdpZHRoSGludCk7Ci0gICAgICAgIGVsc2UgaWYgKGFsbG93TmV3Q29udGFpbmVyTmFtZSkKLSAgICAgICAgICAgIGNyZWF0ZUNvbnRlbnRzKERFRkFVTFRfTVNHX05FV19BTExPV0VELCBoZWlnaHRIaW50LCB3aWR0aEhpbnQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjcmVhdGVDb250ZW50cyhERUZBVUxUX01TR19TRUxFQ1RfT05MWSwgaGVpZ2h0SGludCwgd2lkdGhIaW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29udGFpbmVyIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCBpbiB0aGUKLSAgICAgKiB0cmVlIHZpZXcuIFVwZGF0ZSB0aGUgY29udGFpbmVyIG5hbWUgZmllbGQKLSAgICAgKiB2YWx1ZSBhbmQgbm90aWZ5IGFsbCBsaXN0ZW5lcnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29udGFpbmVyU2VsZWN0aW9uQ2hhbmdlZChJQ29udGFpbmVyIGNvbnRhaW5lcikgewotICAgICAgICBzZWxlY3RlZENvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQotICAgICAgICBpZiAoYWxsb3dOZXdDb250YWluZXJOYW1lKSB7Ci0gICAgICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGFpbmVyTmFtZUZpZWxkLnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgCSAgIFN0cmluZyB0ZXh0ID0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBjb250YWluZXJOYW1lRmllbGQuc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgICAgICAgICBjb250YWluZXJOYW1lRmllbGQuc2V0VG9vbFRpcFRleHQodGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaXJlIGFuIGV2ZW50IHNvIHRoZSBwYXJlbnQgY2FuIHVwZGF0ZSBpdHMgY29udHJvbHMKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEV2ZW50IGNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgICAgICBjaGFuZ2VFdmVudC50eXBlID0gU1dULlNlbGVjdGlvbjsKLSAgICAgICAgICAgIGNoYW5nZUV2ZW50LndpZGdldCA9IHRoaXM7Ci0gICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVFdmVudChjaGFuZ2VFdmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250ZW50cyBvZiB0aGUgY29tcG9zaXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGNyZWF0ZUNvbnRlbnRzKG1lc3NhZ2UsIFNJWklOR19TRUxFQ1RJT05fUEFORV9IRUlHSFQsIFNJWklOR19TRUxFQ1RJT05fUEFORV9XSURUSCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgY29udGVudHMgb2YgdGhlIGNvbXBvc2l0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGVpZ2h0SGludCBoZWlnaHQgaGludCBmb3IgdGhlIGRyaWxsIGRvd24gY29tcG9zaXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoU3RyaW5nIG1lc3NhZ2UsIGludCBoZWlnaHRIaW50LCBpbnQgd2lkdGhIaW50KSB7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5XUkFQKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udCh0aGlzLmdldEZvbnQoKSk7Ci0KLSAgICAgICAgaWYgKGFsbG93TmV3Q29udGFpbmVyTmFtZSkgewotICAgICAgICAgICAgY29udGFpbmVyTmFtZUZpZWxkID0gbmV3IFRleHQodGhpcywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgICAgIGdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLSAgICAgICAgICAgIGNvbnRhaW5lck5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgICAgIGNvbnRhaW5lck5hbWVGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBsaXN0ZW5lcik7Ci0gICAgICAgICAgICBjb250YWluZXJOYW1lRmllbGQuc2V0Rm9udCh0aGlzLmdldEZvbnQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBmaWxsZXIuLi4KLSAgICAgICAgICAgIG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjcmVhdGVUcmVlVmlld2VyKGhlaWdodEhpbnQpOwotICAgICAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgZHJpbGwgZG93biB2aWV3ZXIgZm9yIHRoaXMgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIGhlaWdodEhpbnQgaGVpZ2h0IGhpbnQgZm9yIHRoZSBkcmlsbCBkb3duIGNvbXBvc2l0ZQotICAgICAqIEByZXR1cm4gYSBuZXcgZHJpbGwgZG93biB2aWV3ZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUcmVlVmlld2VyKGludCBoZWlnaHRIaW50KSB7Ci0gICAgICAgIC8vIENyZWF0ZSBkcmlsbCBkb3duLgotICAgICAgICBEcmlsbERvd25Db21wb3NpdGUgZHJpbGxEb3duID0gbmV3IERyaWxsRG93bkNvbXBvc2l0ZSh0aGlzLCBTV1QuQk9SREVSKTsKLSAgICAgICAgR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBzcGVjLndpZHRoSGludCA9IFNJWklOR19TRUxFQ1RJT05fUEFORV9XSURUSDsKLSAgICAgICAgc3BlYy5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLSAgICAgICAgZHJpbGxEb3duLnNldExheW91dERhdGEoc3BlYyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRyZWUgdmlld2VyIGluc2lkZSBkcmlsbCBkb3duLgotICAgICAgICB0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoZHJpbGxEb3duLCBTV1QuTk9ORSk7Ci0gICAgICAgIGRyaWxsRG93bi5zZXRDaGlsZFRyZWUodHJlZVZpZXdlcik7Ci0gICAgICAgIENvbnRhaW5lckNvbnRlbnRQcm92aWRlciBjcCA9IG5ldyBDb250YWluZXJDb250ZW50UHJvdmlkZXIoKTsKLSAgICAgICAgY3Auc2hvd0Nsb3NlZFByb2plY3RzKHNob3dDbG9zZWRQcm9qZWN0cyk7Ci0gICAgICAgIHRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNwKTsKLSAgICAgICAgdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKFdvcmtiZW5jaExhYmVsUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAuZ2V0RGVjb3JhdGluZ1dvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIHRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0gICAgICAgIHRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29udGFpbmVyU2VsZWN0aW9uQ2hhbmdlZCgoSUNvbnRhaW5lcikgc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RFbGVtZW50KCkpOyAvLyBhbGxvdyBudWxsCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBpdGVtID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoaXRlbSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAJcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBpZiAodHJlZVZpZXdlci5nZXRFeHBhbmRlZFN0YXRlKGl0ZW0pKQotICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVZpZXdlci5jb2xsYXBzZVRvTGV2ZWwoaXRlbSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbChpdGVtLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIFRoaXMgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgdGhlIHZpZXdlciBoYXMgYmVlbiBsYWlkIG91dAotICAgICAgICB0cmVlVmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IGVudGVyZWQgY29udGFpbmVyIG5hbWUuCi0gICAgICogTnVsbCBpZiB0aGUgZmllbGQgaXMgZW1wdHkuIE5vdGUgdGhhdCB0aGUKLSAgICAgKiBjb250YWluZXIgbWF5IG5vdCBleGlzdCB5ZXQgaWYgdGhlIHVzZXIKLSAgICAgKiBlbnRlcmVkIGEgbmV3IGNvbnRhaW5lciBuYW1lIGluIHRoZSBmaWVsZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGggZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSB7Ci0gICAgICAgIGlmIChhbGxvd05ld0NvbnRhaW5lck5hbWUpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoTmFtZSA9IGNvbnRhaW5lck5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBpZiAocGF0aE5hbWUgPT0gbnVsbCB8fCBwYXRoTmFtZS5sZW5ndGgoKSA8IDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgLy9UaGUgdXNlciBtYXkgbm90IGhhdmUgbWFkZSB0aGlzIGFic29sdXRlIHNvIGRvIGl0IGZvciB0aGVtCi0gICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgUGF0aChwYXRoTmFtZSkpLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ29udGFpbmVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkQ29udGFpbmVyLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlcyBmb2N1cyB0byBvbmUgb2YgdGhlIHdpZGdldHMgaW4gdGhlIGdyb3VwLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBncm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsRm9jdXMoKSB7Ci0gICAgICAgIGlmIChhbGxvd05ld0NvbnRhaW5lck5hbWUpCi0gICAgICAgICAgICBjb250YWluZXJOYW1lRmllbGQuc2V0Rm9jdXMoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBleGlzdGluZyBjb250YWluZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRDb250YWluZXIoSUNvbnRhaW5lciBjb250YWluZXIpIHsKLSAgICAgICAgc2VsZWN0ZWRDb250YWluZXIgPSBjb250YWluZXI7Ci0KLSAgICAgICAgLy9leHBhbmQgdG8gYW5kIHNlbGVjdCB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lcgotICAgICAgICBMaXN0IGl0ZW1zVG9FeHBhbmQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIElDb250YWluZXIgcGFyZW50ID0gY29udGFpbmVyLmdldFBhcmVudCgpOwotICAgICAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGl0ZW1zVG9FeHBhbmQuYWRkKDAsIHBhcmVudCk7Ci0gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJlZVZpZXdlci5zZXRFeHBhbmRlZEVsZW1lbnRzKGl0ZW1zVG9FeHBhbmQudG9BcnJheSgpKTsKLSAgICAgICAgdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29udGFpbmVyKSwgdHJ1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9taXNjL092ZXJsYXlJY29uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21pc2MvT3ZlcmxheUljb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjYTJjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21pc2MvT3ZlcmxheUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1pc2M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi0vKioKLSAqIEFuIE92ZXJsYXlJY29uIGNvbnNpc3RzIG9mIGEgbWFpbiBpY29uIGFuZCBzZXZlcmFsIGFkb3JubWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVybGF5SWNvbiBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEggPSAyMjsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9IRUlHSFQgPSAxNjsKLQotICAgIHByaXZhdGUgUG9pbnQgZlNpemUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZkJhc2U7Ci0KLSAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBmT3ZlcmxheXNbXVtdOwotCi0gICAgcHVibGljIE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvciBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzLAotICAgICAgICAgICAgUG9pbnQgc2l6ZSkgewotICAgICAgICBmQmFzZSA9IGJhc2U7Ci0gICAgICAgIGZPdmVybGF5cyA9IG92ZXJsYXlzOwotICAgICAgICBmU2l6ZSA9IHNpemU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbUxlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLSAgICAgICAgaWYgKG92ZXJsYXlzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0gICAgICAgIGludCB4ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgICAgICAgICBkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB4ICs9IGlkLndpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbVJpZ2h0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0gICAgICAgIGlmIChvdmVybGF5cyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotICAgICAgICBpbnQgeCA9IGdldFNpemUoKS54OwotICAgICAgICBmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgICAgICAgICB4IC09IGlkLndpZHRoOwotICAgICAgICAgICAgICAgIGRyYXdJbWFnZShpZCwgeCwgZ2V0U2l6ZSgpLnkgLSBpZC5oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZHJhd0NvbXBvc2l0ZUltYWdlKGludCwgaW50KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgSW1hZ2VEYXRhIGJnOwotICAgICAgICBpZiAoZkJhc2UgPT0gbnVsbCB8fCAoYmcgPSBmQmFzZS5nZXRJbWFnZURhdGEoKSkgPT0gbnVsbCkKLSAgICAgICAgICAgIGJnID0gREVGQVVMVF9JTUFHRV9EQVRBOwotICAgICAgICBkcmF3SW1hZ2UoYmcsIDAsIDApOwotCi0gICAgICAgIGlmIChmT3ZlcmxheXMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGZPdmVybGF5cy5sZW5ndGggPiAwKQotICAgICAgICAgICAgICAgIGRyYXdUb3BSaWdodChmT3ZlcmxheXNbMF0pOwotCi0gICAgICAgICAgICBpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDEpCi0gICAgICAgICAgICAgICAgZHJhd0JvdHRvbVJpZ2h0KGZPdmVybGF5c1sxXSk7Ci0KLSAgICAgICAgICAgIGlmIChmT3ZlcmxheXMubGVuZ3RoID4gMikKLSAgICAgICAgICAgICAgICBkcmF3Qm90dG9tTGVmdChmT3ZlcmxheXNbMl0pOwotCi0gICAgICAgICAgICBpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDMpCi0gICAgICAgICAgICAgICAgZHJhd1RvcExlZnQoZk92ZXJsYXlzWzNdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRyYXdUb3BMZWZ0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0gICAgICAgIGlmIChvdmVybGF5cyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotICAgICAgICBpbnQgeCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgICAgICAgICAgICAgZHJhd0ltYWdlKGlkLCB4LCAwKTsKLSAgICAgICAgICAgICAgICB4ICs9IGlkLndpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd1RvcFJpZ2h0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0gICAgICAgIGlmIChvdmVybGF5cyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotICAgICAgICBpbnQgeCA9IGdldFNpemUoKS54OwotICAgICAgICBmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgICAgICAgICB4IC09IGlkLndpZHRoOwotICAgICAgICAgICAgICAgIGRyYXdJbWFnZShpZCwgeCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNnZXRTaXplKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGZTaXplOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbWlzYy9Qcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21pc2MvUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjBmNDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbWlzYy9Qcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgIFNlYmFzdGlhbiBEYXZpZHMgPHNkYXZpZHNAZ214LmRlPiAtIEZpeCBmb3IgYnVnIDE5MzQ2IC0gRGlhbG9nIGZvbnQgc2hvdWxkIGJlCi0gKiAgICAgICAgYWN0aXZhdGVkIGFuZCB1c2VkIGJ5IG90aGVyIGNvbXBvbmVudHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1pc2M7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeS5DYXBhYmlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeS5DYXBhYmlsaXR5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQSBncm91cCBvZiBjb250cm9scyB1c2VkIHRvIHZpZXcgYW5kIG1vZGlmeSB0aGUKLSAqIHNldCBvZiBjYXBhYmlsaXRpZXMgb24gYSBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX0RFU0NSSVBUSU9OID0gIlxuXG5cbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgQ2FwYWJpbGl0eVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCi0gICAgcHJpdmF0ZSBDYXRlZ29yeVtdIGluaXRpYWxDYXRlZ29yaWVzOwotCi0gICAgcHJpdmF0ZSBDYXBhYmlsaXR5W10gaW5pdGlhbENhcGFiaWxpdGllczsKLQotICAgIHByaXZhdGUgQ2FwYWJpbGl0eVtdIGRpc2FibGVkQ2FwYWJpbGl0aWVzOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFRleHQgZGVzY3JpcHRpb25UZXh0OwotCi0gICAgcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGNoZWNrYm94Vmlld2VyOwotCi0gICAgcHJpdmF0ZSBJQ2hlY2tTdGF0ZUxpc3RlbmVyIGNoZWNrU3RhdGVMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IHZpc2libGVDYXBhYmlsaXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBjaGVja2VkQ2FwYWJpbGl0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGRpc2FibGVkQ2FwczsKLQotICAgIC8vIEZvciBhIGdpdmVuIGNhcGFiaWxpdHkgYXMga2V5LCB0aGUgdmFsdWUgd2lsbCBiZSBhIGxpc3Qgb2YKLSAgICAvLyBvdGhlciBjYXBhYmlsaXRpZXMgdGhhdCByZXF1aXJlIHRoZSBjYXBhYmlsaXR5LiBBbHNvLAotICAgIC8vIGl0IG1heSBpbmNsdWRlIHRoZSBjYXBhYmlsaXR5IGtleSBpZiBpdCB3YXMgc2VsZWN0ZWQgYnkgdGhlCi0gICAgLy8gdXNlciBiZWZvcmUgYmVpbmcgcmVxdWlyZWQgYnkgb3RoZXIgY2FwYWJpbGl0aWVzLgotICAgIHByaXZhdGUgSGFzaE1hcCBkZXBlbmRlbnRzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8vIEZvciBhIGdpdmVuIG1lbWJlcnNoaXAgc2V0IGlkIGFzIGtleSwgdGhlIHZhbHVlIGlzCi0gICAgLy8gYSBjaGVja2VkIGNhcGFiaWxpdHkKLSAgICBwcml2YXRlIEhhc2hNYXAgbWVtYmVyc2hpcHMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLy8gU29ydCBjYXRlZ29yaWVzCi0gICAgcHJpdmF0ZSBDb21wYXJhdG9yIGNhdGVnb3J5Q29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotICAgICAgICBwcml2YXRlIENvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iMSwgT2JqZWN0IG9iMikgewotICAgICAgICAgICAgQ2F0ZWdvcnkgYzEgPSAoQ2F0ZWdvcnkpIG9iMTsKLSAgICAgICAgICAgIENhdGVnb3J5IGMyID0gKENhdGVnb3J5KSBvYjI7Ci0gICAgICAgICAgICByZXR1cm4gY29sbGF0b3IuY29tcGFyZShjMS5nZXRMYWJlbCgpLCBjMi5nZXRMYWJlbCgpKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvLyBTb3J0IGNhcGFiaWxpdGllcwotICAgIHByaXZhdGUgQ29tcGFyYXRvciBjYXBhYmlsaXR5Q29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotICAgICAgICBwcml2YXRlIENvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iMSwgT2JqZWN0IG9iMikgewotICAgICAgICAgICAgQ2FwYWJpbGl0eSBjMSA9IChDYXBhYmlsaXR5KSBvYjE7Ci0gICAgICAgICAgICBDYXBhYmlsaXR5IGMyID0gKENhcGFiaWxpdHkpIG9iMjsKLSAgICAgICAgICAgIHJldHVybiBjb2xsYXRvci5jb21wYXJlKGMxLmdldE5hbWUoKSwgYzIuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8Y29kZT5Qcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwPC9jb2RlPgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYXRlZ29yaWVzIHRoZSBpbml0aWFsIGNvbGxlY3Rpb24gb2YgdmFsaWQgY2F0ZWdvcmllcyB0byBzZWxlY3QKLSAgICAgKiBAcGFyYW0gY2FwYWJpbGl0aWVzIHRoZSBpbnRpYWwgY29sbGVjdGlvbiBvZiB2YWxpZCBjYXBhYmlsaXRpZXMgdG8gc2VsZWN0Ci0gICAgICogQHBhcmFtIHJlZ2lzdHJ5IGFsbCBhdmFpbGFibGUgY2FwYWJpbGl0aWVzIHJlZ2lzdGVyZWQgYnkgcGx1Zy1pbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cChDYXRlZ29yeVtdIGNhdGVnb3JpZXMsCi0gICAgICAgICAgICBDYXBhYmlsaXR5W10gY2FwYWJpbGl0aWVzLCBDYXBhYmlsaXR5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLSAgICAgICAgdGhpcyhjYXRlZ29yaWVzLCBjYXBhYmlsaXRpZXMsIG51bGwsIHJlZ2lzdHJ5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8Y29kZT5Qcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwPC9jb2RlPgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYXRlZ29yaWVzIHRoZSBpbml0aWFsIGNvbGxlY3Rpb24gb2YgdmFsaWQgY2F0ZWdvcmllcyB0byBzZWxlY3QKLSAgICAgKiBAcGFyYW0gY2FwYWJpbGl0aWVzIHRoZSBpbnRpYWwgY29sbGVjdGlvbiBvZiB2YWxpZCBjYXBhYmlsaXRpZXMgdG8gc2VsZWN0Ci0gICAgICogQHBhcmFtIGRpc2FibGVkQ2FwYWJpbGl0aWVzIHRoZSBjb2xsZWN0aW9uIG9mIGNhcGFiaWxpdGllcyB0byBzaG93IGFzIGRpc2FibGVkCi0gICAgICogQHBhcmFtIHJlZ2lzdHJ5IGFsbCBhdmFpbGFibGUgY2FwYWJpbGl0aWVzIHJlZ2lzdGVyZWQgYnkgcGx1Zy1pbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cChDYXRlZ29yeVtdIGNhdGVnb3JpZXMsCi0gICAgICAgICAgICBDYXBhYmlsaXR5W10gY2FwYWJpbGl0aWVzLCBDYXBhYmlsaXR5W10gZGlzYWJsZWRDYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICBDYXBhYmlsaXR5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5pbml0aWFsQ2F0ZWdvcmllcyA9IGNhdGVnb3JpZXM7Ci0gICAgICAgIHRoaXMuaW5pdGlhbENhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllczsKLSAgICAgICAgdGhpcy5kaXNhYmxlZENhcGFiaWxpdGllcyA9IGRpc2FibGVkQ2FwYWJpbGl0aWVzOwotICAgICAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBjb250ZW50cyBvZiB0aGlzIGdyb3VwLiBUaGUgYmFzaWMgbGF5b3V0IGlzIGEgY2hlY2tib3gKLSAgICAgKiBsaXN0IHdpdGggYSB0ZXh0IGZpZWxkIGF0IHRoZSBib3R0b20gdG8gZGlzcGxheSB0aGUgY2FwYWJpbGl0eQotICAgICAqIGRlc2NyaXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBtYWluIGNvbXBvc2l0ZSBmb3IgdGhlIG90aGVyIGNvbnRyb2xzCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIC8vIENvbXBvc2l0ZSBmb3IgY2F0ZWdvcnkgbGFiZWwgYW5kIGxpc3QuLi4KLSAgICAgICAgQ29tcG9zaXRlIGNhdENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGNhdENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGNhdENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICAvLyBBZGQgYSBsYWJlbCB0byBpZGVudGlmeSB0aGUgbGlzdCB2aWV3ZXIgb2YgY2F0ZWdvcmllcwotICAgICAgICBMYWJlbCBjYXRlZ29yeUxhYmVsID0gbmV3IExhYmVsKGNhdENvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgICAgICBjYXRlZ29yeUxhYmVsLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9jYXRlZ29yaWVzKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLSAgICAgICAgY2F0ZWdvcnlMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBjYXRlZ29yeUxhYmVsLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgLy8gTGlzdCB2aWV3ZXIgb2YgYWxsIGF2YWlsYWJsZSBjYXRlZ29yaWVzCi0gICAgICAgIExpc3RWaWV3ZXIgbGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKGNhdENvbXBvc2l0ZSk7Ci0gICAgICAgIGxpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBsaXN0Vmlld2VyLmdldExpc3QoKS5zZXRGb250KGZvbnQpOwotICAgICAgICBsaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIGxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgbGlzdFZpZXdlci5zZXRJbnB1dChnZXRBdmFpbGFibGVDYXRlZ29yaWVzKCkpOwotCi0gICAgICAgIC8vIENvbXBvc2l0ZSBmb3IgY2FwYWJpbGl0eSBsYWJlbCBhbmQgdGFibGUuLi4KLSAgICAgICAgQ29tcG9zaXRlIGNhcENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGNhcENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGNhcENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICAvLyBBZGQgYSBsYWJlbCB0byBpZGVudGlmeSB0aGUgY2hlY2tib3ggdHJlZSB2aWV3ZXIgb2YgY2FwYWJpbGl0aWVzCi0gICAgICAgIExhYmVsIGNhcGFiaWxpdHlMYWJlbCA9IG5ldyBMYWJlbChjYXBDb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICAgICAgY2FwYWJpbGl0eUxhYmVsLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9jYXBhYmlsaXRpZXMpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotICAgICAgICBjYXBhYmlsaXR5TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgY2FwYWJpbGl0eUxhYmVsLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgLy8gQ2hlY2tib3ggdHJlZSB2aWV3ZXIgb2YgY2FwYWJpbGl0aWVzIGluIHNlbGVjdGVkIGNhdGVnb3JpZXMKLSAgICAgICAgY2hlY2tib3hWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChjYXBDb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5UT1AgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgY2hlY2tib3hWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKAotICAgICAgICAgICAgICAgIG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgY2hlY2tib3hWaWV3ZXIuZ2V0VGFibGUoKS5zZXRGb250KGZvbnQpOwotICAgICAgICBjaGVja2JveFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDYXBhYmlsaXR5TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgY2hlY2tib3hWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgY2hlY2tib3hWaWV3ZXIuc2V0SW5wdXQodmlzaWJsZUNhcGFiaWxpdGllcyk7Ci0KLSAgICAgICAgLy8gQWRkIGEgbGFiZWwgdG8gaWRlbnRpZnkgdGhlIHRleHQgZmllbGQgb2YgY2FwYWJpbGl0eSdzIGRlc2NyaXB0aW9uCi0gICAgICAgIExhYmVsIGRlc2NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICAgICAgZGVzY0xhYmVsLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9kZXNjcmlwdGlvbik7Ci0gICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBkZXNjTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgZGVzY0xhYmVsLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgLy8gVGV4dCBmaWVsZCB0byBkaXNwbGF5IHRoZSBjYXBhYmlsaXR5J3MgZGVzY3JpcHRpb24KLSAgICAgICAgZGVzY3JpcHRpb25UZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuV1JBUCB8IFNXVC5NVUxUSQotICAgICAgICAgICAgICAgIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIGRlc2NyaXB0aW9uVGV4dC5zZXRUZXh0KEVNUFRZX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgZGVzY3JpcHRpb25UZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZGVzY3JpcHRpb25UZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGRlc2NyaXB0aW9uVGV4dC5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIC8vIEFkZCBhIHRleHQgZmllbGQgdG8gZXhwbGFpbiBncmF5ZWQgb3V0IGl0ZW1zCi0gICAgICAgIExhYmVsIGdyYXlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICAgICAgZ3JheUxhYmVsLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9ncmF5SXRlbXMpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZ3JheUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGdyYXlMYWJlbC5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIC8vIFNldHVwIGluaXRpYWwgY29udGV4dAkJCi0gICAgICAgIHBvcHVsYXRlRGVwZW5kZW50cygpOwotICAgICAgICBwb3B1bGF0ZU1lbWJlcnNoaXBzKCk7Ci0KLSAgICAgICAgLy8gTGlzdGVuIGZvciBzZWxlY3Rpb24gY2hhbmdlcyB0byB1cGRhdGUgdGhlIGRlc2NyaXB0aW9uIGZpZWxkCi0gICAgICAgIGNoZWNrYm94Vmlld2VyCi0gICAgICAgICAgICAgICAgLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZURlc2NyaXB0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgIC8vIFByb3Blcmx5IGhhbmRsZSB1c2VyIGNoZWNraW5nIGFuZCB1bmNoZWNraW5nIHByb2plY3QgZmVhdHVyZXMKLSAgICAgICAgY2hlY2tib3hWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIENhcGFiaWxpdHkgY2FwID0gKENhcGFiaWxpdHkpIGV2ZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKQotICAgICAgICAgICAgICAgICAgICBoYW5kbGVDYXBhYmlsaXR5Q2hlY2tlZChjYXApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2FwYWJpbGl0eVVuY2hlY2tlZChjYXApOwotICAgICAgICAgICAgICAgIGNoZWNrYm94Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjYXApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gTGlzdGVuIGZvciBjYXRlZ29yeSBzZWxlY3Rpb24gYW5kIHVwZGF0ZSB0aGUgbGlzdCBvZiBjYXBhYmlsaXRpZXMKLSAgICAgICAgbGlzdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2libGVDYXBhYmlsaXRpZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gc2VsLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSBjYXQgPSAoQ2F0ZWdvcnkpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlQ2FwYWJpbGl0aWVzLmFkZEFsbChjYXQuZ2V0RWxlbWVudHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh2aXNpYmxlQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXR5Q29tcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrYm94Vmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgaXRyID0gdmlzaWJsZUNhcGFiaWxpdGllcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2FwYWJpbGl0eSBjYXAgPSAoQ2FwYWJpbGl0eSkgaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNEZXBlbmRlbmN5KGNhcCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3hWaWV3ZXIuc2V0R3JheWVkKGNhcCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZENhcGFiaWxpdGllcy5jb250YWlucyhjYXApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94Vmlld2VyLnNldENoZWNrZWQoY2FwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVEZXNjcmlwdGlvbihjaGVja2JveFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBpbml0aWFsaXplCi0gICAgICAgIGlmIChpbml0aWFsQ2FwYWJpbGl0aWVzICE9IG51bGwpCi0gICAgICAgICAgICBjaGVja2VkQ2FwYWJpbGl0aWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGluaXRpYWxDYXBhYmlsaXRpZXMpKTsKLSAgICAgICAgaWYgKGluaXRpYWxDYXRlZ29yaWVzICE9IG51bGwpCi0gICAgICAgICAgICBsaXN0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbml0aWFsQ2F0ZWdvcmllcykpOwotCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFya3MgdGhlIGNhcGFiaWxpdHkgYXMgYmVpbmcgY2hlY2tlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbWFya0NhcGFiaWxpdHlDaGVja2VkKENhcGFiaWxpdHkgdGFyZ2V0LCBDYXBhYmlsaXR5IGRlcGVuZGVudCkgewotICAgICAgICAvLyBDaGVjayB0aGUgdGFyZ2V0IGNhcGFiaWxpdHkKLSAgICAgICAgaWYgKCFjaGVja2VkQ2FwYWJpbGl0aWVzLmNvbnRhaW5zKHRhcmdldCkpCi0gICAgICAgICAgICBjaGVja2VkQ2FwYWJpbGl0aWVzLmFkZCh0YXJnZXQpOwotICAgICAgICBjaGVja2JveFZpZXdlci5zZXRDaGVja2VkKHRhcmdldCwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gR3JheSB0aGUgdGFyZ2V0IHRvIHNob3cgdGhlIHVzZXIgaXRzIHJlcXVpcmVkCi0gICAgICAgIC8vIGJ5IGFub3RoZXIgY2FwYWJpbGl0eS4KLSAgICAgICAgaWYgKHRhcmdldCAhPSBkZXBlbmRlbnQpCi0gICAgICAgICAgICBjaGVja2JveFZpZXdlci5zZXRHcmF5ZWQodGFyZ2V0LCB0cnVlKTsKLQotICAgICAgICAvLyBVcGRhdGUgdGhlIGRlcGVuZGVudCBtYXAgZm9yIHRoZSB0YXJnZXQgY2FwYWJpbGl0eQotICAgICAgICBhZGREZXBlbmRlbmN5KHRhcmdldCwgZGVwZW5kZW50KTsKLQotICAgICAgICAvLyBVcGRhdGUgdGhlIG1lbWJlcnNoaXAgc2V0IGZvciB0aGUgdGFyZ2V0IGNhcGFiaWxpdHkKLSAgICAgICAgU3RyaW5nW10gaWRzID0gcmVnaXN0cnkuZ2V0TWVtYmVyc2hpcFNldElkcyh0YXJnZXQpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGlkcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIG1lbWJlcnNoaXBzLnB1dChpZHNbal0sIHRhcmdldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFya3MgdGhlIGNhcGFiaWxpdHkgYXMgYmVpbmcgdW5jaGVja2VkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtYXJrQ2FwYWJpbGl0eVVuY2hlY2tlZChDYXBhYmlsaXR5IHRhcmdldCkgewotICAgICAgICAvLyBVbmNoZWNrIHRoZSB0YXJnZXQgY2FwYWJpbGl0eQotICAgICAgICBjaGVja2VkQ2FwYWJpbGl0aWVzLnJlbW92ZSh0YXJnZXQpOwotICAgICAgICBjaGVja2JveFZpZXdlci5zZXRDaGVja2VkKHRhcmdldCwgZmFsc2UpOwotCi0gICAgICAgIC8vIFVuZ3JheSB0aGUgdGFyZ2V0IGFzIHRoZXJlIGlzIG5vIGRlcGVuZGVuY3kgb24gaXQKLSAgICAgICAgY2hlY2tib3hWaWV3ZXIuc2V0R3JheWVkKHRhcmdldCwgZmFsc2UpOwotCi0gICAgICAgIC8vIFJlbW92ZSB0aGUgZGVwZW5kZW5jeSBlbnRyeQotICAgICAgICBkZXBlbmRlbnRzLnJlbW92ZSh0YXJnZXQpOwotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgbWVtYmVyc2hpcCBzZXQgZm9yIHRoZSB0YXJnZXQgY2FwYWJpbGl0eQotICAgICAgICBTdHJpbmdbXSBpZHMgPSByZWdpc3RyeS5nZXRNZW1iZXJzaGlwU2V0SWRzKHRhcmdldCk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaWRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICBpZiAobWVtYmVyc2hpcHMuZ2V0KGlkc1tqXSkgPT0gdGFyZ2V0KQotICAgICAgICAgICAgICAgIG1lbWJlcnNoaXBzLnJlbW92ZShpZHNbal0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjYXRlZ29yaWVzIHRoYXQgaGF2ZSBjYXBhYmlsaXRpZXMKLSAgICAgKiByZWdpc3RlcmVkIGFnYWluc3QgaXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZ2V0QXZhaWxhYmxlQ2F0ZWdvcmllcygpIHsKLSAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSByZWdpc3RyeS5nZXRVc2VkQ2F0ZWdvcmllcygpOwotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMsIGNhdGVnb3J5Q29tcGFyYXRvcik7Ci0gICAgICAgIGlmIChyZWdpc3RyeS5nZXRNaXNjQ2F0ZWdvcnkoKSAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0cy5hZGQocmVnaXN0cnkuZ2V0TWlzY0NhdGVnb3J5KCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgbWF5IGhhdmUgbWFkZSBjaGFuZ2VzCi0gICAgICogdG8gdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgcHJvamVjdC4gT3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqIGlmIG5vIGNoYW5nZXMgd2VyZSBtYWRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvdHJ1ZT4gd2hlbiBwb3NzaWJsZSBjaGFuZ2VzIG1heSBoYXZlIGJlZW4gbWFkZSwKLSAgICAgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FwYWJpbGl0aWVzTW9kaWZpZWQoKSB7Ci0gICAgICAgIHJldHVybiBtb2RpZmllZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdmlld2VycwotICAgICAqLwotICAgIHByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBcnJheUxpc3QpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEFycmF5TGlzdCkgcGFyZW50RWxlbWVudCkudG9BcnJheSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHVzZXIgaGFzIGNoYW5nZWQgdGhlIHByb2plY3QgY2FwYWJpbGl0eSBzZWxlY3Rpb24uCi0gICAgICogU2V0IHRoZSBtb2RpZmllZCBmbGFnIGFuZCBjbGVhciB0aGUgY2FjaGVzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjYXBhYmlsaXRpZXNNb2RpZmllZCgpIHsKLSAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgdGFyZ2V0IGFuZCBkZXBlbmRlbnQKLSAgICAgKiBjYXBhYmlsaXRpZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkRGVwZW5kZW5jeShDYXBhYmlsaXR5IHRhcmdldCwgQ2FwYWJpbGl0eSBkZXBlbmRlbnQpIHsKLSAgICAgICAgQXJyYXlMaXN0IGRlc2NyaXB0b3JzID0gKEFycmF5TGlzdCkgZGVwZW5kZW50cy5nZXQodGFyZ2V0KTsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3JzID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZGVzY3JpcHRvcnMuYWRkKGRlcGVuZGVudCk7Ci0gICAgICAgICAgICBkZXBlbmRlbnRzLnB1dCh0YXJnZXQsIGRlc2NyaXB0b3JzKTsKLSAgICAgICAgfSBlbHNlIGlmICghZGVzY3JpcHRvcnMuY29udGFpbnMoZGVwZW5kZW50KSkgewotICAgICAgICAgICAgZGVzY3JpcHRvcnMuYWRkKGRlcGVuZGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNhcGFiaWxpdHkgaGFzIGFueQotICAgICAqIGRlcGVuZGVuY2llcyBvbiBpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRGVwZW5kZW5jeShDYXBhYmlsaXR5IGNhcGFiaWxpdHkpIHsKLSAgICAgICAgQXJyYXlMaXN0IGRlc2NyaXB0b3JzID0gKEFycmF5TGlzdCkgZGVwZW5kZW50cy5nZXQoY2FwYWJpbGl0eSk7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9ycyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoZGVzY3JpcHRvcnMuc2l6ZSgpID09IDEgJiYgZGVzY3JpcHRvcnMuZ2V0KDApID09IGNhcGFiaWxpdHkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2F0ZWdvcnkgaXMgY29uc2lkZXJlZCBkaXNhYmxlZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0Rpc2FibGVkQ2FwYWJpbGl0eShDYXBhYmlsaXR5IGNhcCkgewotICAgICAgICBpZiAoZGlzYWJsZWRDYXBzID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChkaXNhYmxlZENhcGFiaWxpdGllcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIGRpc2FibGVkQ2FwcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGlzYWJsZWRDYXBzID0gQXJyYXlzLmFzTGlzdChkaXNhYmxlZENhcGFiaWxpdGllcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpc2FibGVkQ2Fwcy5jb250YWlucyhjYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvcHVsYXRlIHRoZSBkZXBlbmRlbnRzIG1hcCBiYXNlZCBvbiB0aGUKLSAgICAgKiBjdXJyZW50IHNldCBvZiBjYXBhYmlsaXRpZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGVwZW5kZW50cygpIHsKLSAgICAgICAgaWYgKGluaXRpYWxDYXBhYmlsaXRpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBMaW5rZWRMaXN0IGNhcGFiaWxpdGllcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChpbml0aWFsQ2FwYWJpbGl0aWVzKSk7Ci0KLSAgICAgICAgd2hpbGUgKCFjYXBhYmlsaXRpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgdGFyZ2V0IGNhcGFiaWxpdHkKLSAgICAgICAgICAgIENhcGFiaWxpdHkgdGFyZ2V0OwotICAgICAgICAgICAgdGFyZ2V0ID0gKENhcGFiaWxpdHkpIGNhcGFiaWxpdGllcy5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgLy8gQWRkIHRoZSBjYXBhYmlsaXR5IGFzIGEgZGVwZW5kZW50IG9mIGl0c2VsZi4KLSAgICAgICAgICAgIC8vIEl0IHdpbGwgaW5kaWNhdGUgdG8gdGhlIHVuY2hlY2sgaGFuZGxlciB0byBub3QgdW5jaGVjayB0aGlzCi0gICAgICAgICAgICAvLyBjYXBhYmlsaXR5IGF1dG9tYXRpY2FsbHkgZXZlbiBpZiBhIGFub3RoZXIgY2FwYWJpbGl0eSB3aGljaAotICAgICAgICAgICAgLy8gZGVwZW5kZWQgb24gaXQgaXMgdW5jaGVja2VkLgotICAgICAgICAgICAgYWRkRGVwZW5kZW5jeSh0YXJnZXQsIHRhcmdldCk7Ci0KLSAgICAgICAgICAgIGlmIChyZWdpc3RyeS5oYXNQcmVyZXF1aXNpdGVzKHRhcmdldCkpIHsKLSAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgcHJlcmVxdWlzaXRlIGNhcGFiaWxpdGllcy4uLgotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByZXJlcUlkcyA9IHJlZ2lzdHJ5LmdldFByZXJlcXVpc2l0ZUlkcyh0YXJnZXQpOwotICAgICAgICAgICAgICAgIENhcGFiaWxpdHlbXSBwcmVyZXFDYXBhYmlsaXRpZXM7Ci0gICAgICAgICAgICAgICAgcHJlcmVxQ2FwYWJpbGl0aWVzID0gcmVnaXN0cnkuZmluZENhcGFiaWxpdGllcyhwcmVyZXFJZHMpOwotICAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIHByZXJlcXVpc2l0ZSBjYXBhYmlsaXR5Li4uCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVyZXFDYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBkZXBlbmRlbnQgbWFwIGZvciB0aGUgcHJlcmVxdWlzaXRlIGNhcGFiaWxpdHkKLSAgICAgICAgICAgICAgICAgICAgYWRkRGVwZW5kZW5jeShwcmVyZXFDYXBhYmlsaXRpZXNbaV0sIHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZSBpZiBwcmVyZXF1aXNpdGUgY2FwYWJpbGl0eSBhbHNvIGhhcyBwcmVyZXF1aXNpdGVzCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyeS5oYXNQcmVyZXF1aXNpdGVzKHByZXJlcUNhcGFiaWxpdGllc1tpXSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuYWRkTGFzdChwcmVyZXFDYXBhYmlsaXRpZXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvcHVsYXRlIHRoZSBtZW1iZXJzaGlwcyBtYXAgYmFzZWQgb24gdGhlCi0gICAgICogY3VycmVudCBzZXQgb2YgY2FwYWJpbGl0aWVzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZU1lbWJlcnNoaXBzKCkgewotICAgICAgICBpZiAoaW5pdGlhbENhcGFiaWxpdGllcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IChBcnJheXMuYXNMaXN0KGluaXRpYWxDYXBhYmlsaXRpZXMpKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQ2FwYWJpbGl0eSBjYXAgPSAoQ2FwYWJpbGl0eSkgaXRyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGlkcyA9IHJlZ2lzdHJ5LmdldE1lbWJlcnNoaXBTZXRJZHMoY2FwKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaWRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgbWVtYmVyc2hpcHMucHV0KGlkc1tqXSwgY2FwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZSB0aGUgY2FzZSBvZiBhIGNhcGFiaWxpdHkgYmVpbmcgY2hlY2tlZAotICAgICAqIGJ5IGVuc3VyaW5nIHRoZSBhY3Rpb24gaXMgYWxsb3dlZCBhbmQgdGhlIHByZXJlcXVpc2l0ZQotICAgICAqIGNhcGFiaWxpdGllcyBhcmUgYWxzbyBjaGVja2VkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDYXBhYmlsaXR5Q2hlY2tlZChDYXBhYmlsaXR5IGNhcGFiaWxpdHkpIHsKLSAgICAgICAgLy8gQ2Fubm90IGFsbG93IGEgZGlzYWJsZWQgY2FwYWJpbGl0eSB0byBiZSBjaGVja2VkCi0gICAgICAgIGlmIChpc0Rpc2FibGVkQ2FwYWJpbGl0eShjYXBhYmlsaXR5KSkgewotICAgICAgICAgICAgTWVzc2FnZURpYWxvZwotICAgICAgICAgICAgICAgICAgICAub3Blbldhcm5pbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3hWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfZGlzYWJsZWRDYXBhYmlsaXR5LCBjYXBhYmlsaXR5LmdldE5hbWUoKSkpOwotICAgICAgICAgICAgY2hlY2tib3hWaWV3ZXIuc2V0Q2hlY2tlZChjYXBhYmlsaXR5LCBmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYW5ub3QgYWxsb3cgYW4gaW52YWxpZCBjYXBhYmlsaXR5IHRvIGJlIGNoZWNrZWQKLSAgICAgICAgaWYgKCFjYXBhYmlsaXR5LmlzVmFsaWQoKSkgewotICAgICAgICAgICAgTWVzc2FnZURpYWxvZwotICAgICAgICAgICAgICAgICAgICAub3Blbldhcm5pbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3hWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfaW52YWxpZENhcGFiaWxpdHksIGNhcGFiaWxpdHkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICBjaGVja2JveFZpZXdlci5zZXRDaGVja2VkKGNhcGFiaWxpdHksIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElzIHRoZXJlIGEgbWVtYmVyc2hpcCBzZXQgcHJvYmxlbS4uLgotICAgICAgICBTdHJpbmdbXSBpZHMgPSByZWdpc3RyeS5nZXRNZW1iZXJzaGlwU2V0SWRzKGNhcGFiaWxpdHkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ2FwYWJpbGl0eSBtZW1iZXIgPSAoQ2FwYWJpbGl0eSkgbWVtYmVyc2hpcHMuZ2V0KGlkc1tpXSk7Ci0gICAgICAgICAgICBpZiAobWVtYmVyICE9IG51bGwgJiYgbWVtYmVyICE9IGNhcGFiaWxpdHkpIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgICAgICAub3Blbldhcm5pbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94Vmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwX2Vycm9yVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfbWVtYmVyc2hpcENvbmZsaWN0LCBjYXBhYmlsaXR5LmdldE5hbWUoKSwgbWVtYmVyLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIGNoZWNrYm94Vmlld2VyLnNldENoZWNrZWQoY2FwYWJpbGl0eSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBwcmVyZXF1aXNpdGUgYnkgYXV0by1jaGVja2luZyB0aGVtIGlmIHBvc3NpYmxlCi0gICAgICAgIGlmIChyZWdpc3RyeS5oYXNQcmVyZXF1aXNpdGVzKGNhcGFiaWxpdHkpKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayBmb3IgYW55IHByZXJlcXVpc2l0ZSBwcm9ibGVtcy4uLgotICAgICAgICAgICAgLy8gUmV0cmlldmUgYWxsIHRoZSBwcmVyZXF1aXNpdGUgY2FwYWJpbGl0aWVzLCBpbmNsdWRpbmcKLSAgICAgICAgICAgIC8vIGFueSBwcmVyZXF1aXNpdGUgb2YgdGhlIHByZXJlcXVpc2l0ZXMhCi0gICAgICAgICAgICBMaW5rZWRMaXN0IGNhcGFiaWxpdGllcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgICAgICAgICBjYXBhYmlsaXRpZXMuYWRkTGFzdChjYXBhYmlsaXR5KTsKLSAgICAgICAgICAgIHdoaWxlICghY2FwYWJpbGl0aWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIENhcGFiaWxpdHkgdGFyZ2V0OwotICAgICAgICAgICAgICAgIHRhcmdldCA9IChDYXBhYmlsaXR5KSBjYXBhYmlsaXRpZXMucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgY2FwYWJpbGl0eSdzIGltbWVkaWF0ZSBwcmVyZXF1aXNpdGVzCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gcHJlcmVxSWRzID0gcmVnaXN0cnkuZ2V0UHJlcmVxdWlzaXRlSWRzKHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgQ2FwYWJpbGl0eVtdIHByZXJlcUNhcGFiaWxpdGllczsKLSAgICAgICAgICAgICAgICBwcmVyZXFDYXBhYmlsaXRpZXMgPSByZWdpc3RyeS5maW5kQ2FwYWJpbGl0aWVzKHByZXJlcUlkcyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVyZXFDYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHByZXJlcXVpc2l0ZSBpcyBtaXNzaW5nLCB3YXJuIHRoZSB1c2VyIGFuZAotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgYWxsb3cgdGhlIGNoZWNrIHRvIHByb2NlZWQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVyZXFDYXBhYmlsaXRpZXNbaV0gPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzRGlzYWJsZWRDYXBhYmlsaXR5KHByZXJlcUNhcGFiaWxpdGllc1tpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhcHJlcmVxQ2FwYWJpbGl0aWVzW2ldLmlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub3Blbldhcm5pbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3hWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfbWlzc2luZ1ByZXJlcXMsIGNhcGFiaWxpdHkuZ2V0TmFtZSgpLCBwcmVyZXFJZHNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94Vmlld2VyLnNldENoZWNrZWQoY2FwYWJpbGl0eSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbWVtYmVyc2hpcCBwcm9ibGVtLCB3YXJuIHRoZSB1c2VyIGFuZAotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgYWxsb3cgdGhlIGNoZWNrIHRvIHByb2NlZWQKLSAgICAgICAgICAgICAgICAgICAgaWRzID0gcmVnaXN0cnkuZ2V0TWVtYmVyc2hpcFNldElkcyhwcmVyZXFDYXBhYmlsaXRpZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGlkcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2FwYWJpbGl0eSBtZW1iZXIgPSAoQ2FwYWJpbGl0eSkgbWVtYmVyc2hpcHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChpZHNbal0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlciAhPSBudWxsICYmIG1lbWJlciAhPSBwcmVyZXFDYXBhYmlsaXRpZXNbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub3Blbldhcm5pbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94Vmlld2VyLmdldENvbnRyb2woKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hNZXNzYWdlcy5Qcm9qZWN0Q2FwYWJpbGl0eVNlbGVjdGlvbkdyb3VwX2Vycm9yVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfbWVtYmVyc2hpcFByZXJlcUNvbmZsaWN0LCBuZXcgT2JqZWN0W10ge2NhcGFiaWxpdHkuZ2V0TmFtZSgpLCBwcmVyZXFDYXBhYmlsaXRpZXNbaV0uZ2V0TmFtZSgpLCBtZW1iZXIuZ2V0TmFtZSgpfSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94Vmlld2VyLnNldENoZWNrZWQoY2FwYWJpbGl0eSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJlcmVxdWlzaXRlIGNhcGFiaWxpdHkgaGFzIHByZXJlcXVpc2l0ZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gYWxzbywgdGhlbiBhZGQgaXQgdG8gYmUgcHJvY2Vzc2VkLgotICAgICAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnkuaGFzUHJlcmVxdWlzaXRlcyhwcmVyZXFDYXBhYmlsaXRpZXNbaV0pKQotICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmFkZExhc3QocHJlcmVxQ2FwYWJpbGl0aWVzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEF1dG8tY2hlY2sgYWxsIHByZXJlcXVpc2l0ZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICAgIGNhcGFiaWxpdGllcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgICAgICAgICBjYXBhYmlsaXRpZXMuYWRkTGFzdChjYXBhYmlsaXR5KTsKLSAgICAgICAgICAgIC8vIEZvciBlYWNoIGNhcGFiaWxpdHkgdGhhdCBoYXMgcHJlcmVxdWlzaXRlcy4uLgotICAgICAgICAgICAgd2hpbGUgKCFjYXBhYmlsaXRpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQ2FwYWJpbGl0eSB0YXJnZXQ7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gKENhcGFiaWxpdHkpIGNhcGFiaWxpdGllcy5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSBwcmVyZXF1aXNpdGUgY2FwYWJpbGl0aWVzLi4uCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gcHJlcmVxSWRzID0gcmVnaXN0cnkuZ2V0UHJlcmVxdWlzaXRlSWRzKHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgQ2FwYWJpbGl0eVtdIHByZXJlcUNhcGFiaWxpdGllczsKLSAgICAgICAgICAgICAgICBwcmVyZXFDYXBhYmlsaXRpZXMgPSByZWdpc3RyeS5maW5kQ2FwYWJpbGl0aWVzKHByZXJlcUlkcyk7Ci0gICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggcHJlcmVxdWlzaXRlIGNhcGFiaWxpdHkuLi4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByZXJlcUNhcGFiaWxpdGllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGl0IGFzIGJlaW5nIGNoZWNrZWQKLSAgICAgICAgICAgICAgICAgICAgbWFya0NhcGFiaWxpdHlDaGVja2VkKHByZXJlcUNhcGFiaWxpdGllc1tpXSwgdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVjdXJzaXZlIGlmIHByZXJlcXVpc2l0ZSBjYXBhYmlsaXR5IGFsc28gaGFzIHByZXJlcXVpc2l0ZXMKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ2lzdHJ5Lmhhc1ByZXJlcXVpc2l0ZXMocHJlcmVxQ2FwYWJpbGl0aWVzW2ldKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5hZGRMYXN0KHByZXJlcUNhcGFiaWxpdGllc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFyayB0aGUgY2FwYWJpbGl0eSBhcyBjaGVja2VkLiBBZGRzIGl0c2VsZiBhcyBhCi0gICAgICAgIC8vIGRlcGVuZGVudCAtIHRoaXMgd2lsbCBpbmRpY2F0ZSB0byB0aGUgdW5jaGVjayBoYW5kbGVyCi0gICAgICAgIC8vIHRvIG5vdCB1bmNoZWNrIHRoaXMgY2FwYWJpbGl0eSBhdXRvbWF0aWNhbGx5IGV2ZW4gaWYKLSAgICAgICAgLy8gYW5vdGhlciBjYXBhYmlsaXR5IHdoaWNoIGRlcGVuZHMgb24gaXQgaXMgdW5jaGVja2VkLgotICAgICAgICBtYXJrQ2FwYWJpbGl0eUNoZWNrZWQoY2FwYWJpbGl0eSwgY2FwYWJpbGl0eSk7Ci0KLSAgICAgICAgLy8gTm90aWZ5IHRob3NlIGludGVyZXN0ZWQKLSAgICAgICAgY2FwYWJpbGl0aWVzTW9kaWZpZWQoKTsKLSAgICAgICAgbm90aWZ5Q2hlY2tTdGF0ZUxpc3RuZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBjYXBhYmlsaXR5IGJlaW5nIHVuY2hlY2tlZAotICAgICAqIGJ5IGVuc3VyaW5nIHRoZSBhY3Rpb24gaXMgYWxsb3dlZC4gCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNhcGFiaWxpdHlVbmNoZWNrZWQoQ2FwYWJpbGl0eSBjYXBhYmlsaXR5KSB7Ci0gICAgICAgIEFycmF5TGlzdCBkZXNjcmlwdG9ycyA9IChBcnJheUxpc3QpIGRlcGVuZGVudHMuZ2V0KGNhcGFiaWxpdHkpOwotCi0gICAgICAgIC8vIE5vdGUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGRlc2NyaXB0b3JzIHNpemUKLSAgICAgICAgLy8gaXMgemVybyBiZWNhdXNlIGl0IGNhbm5vdCBoYXBwZW4uIEZvciB0aGlzIG1ldGhvZCB0byBiZSBjYWxsZWQsIHRoZQotICAgICAgICAvLyBpdGVtIG11c3QgaGF2ZSBiZWVuIGNoZWNrZWQgcHJldmlvdXNseS4gSWYgaXQgd2FzIGNoZWNrZWQgYnkgdGhlIHVzZXIsCi0gICAgICAgIC8vIHRoZW4gdGhlIGl0ZW0gaXRzZWxmIHdvdWxkIGJlIGEgZGVwZW5kZW50LiBJZiB0aGUgaXRlbSB3YXMgY2hlY2tlZAotICAgICAgICAvLyBiZWNhdXNlIGl0IHdhcyByZXF1aXJlZCBieSBhbm90aGVyIGNhcGFiaWxpdHksIHRoZW4gdGhhdCBvdGhlciBjYXBhYmlsaXR5Ci0gICAgICAgIC8vIHdvdWxkIGJlIGEgZGVwZW5kZW50LgotCi0gICAgICAgIGlmIChkZXNjcmlwdG9ycy5zaXplKCkgPT0gMSAmJiBkZXNjcmlwdG9ycy5nZXQoMCkgPT0gY2FwYWJpbGl0eSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIG9ubHkgZGVwZW5kZW50IGlzIGl0c2VsZiwgdGhlbiBpdHMgb2sgdG8gdW5jaGVjawotICAgICAgICAgICAgY2FwYWJpbGl0aWVzTW9kaWZpZWQoKTsKLSAgICAgICAgICAgIG1hcmtDYXBhYmlsaXR5VW5jaGVja2VkKGNhcGFiaWxpdHkpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBjYXBhYmlsaXR5IGFzIGEgZGVwZW5kZW50IG9uIGl0cyBwcmVyZXF1aXNpdGUKLSAgICAgICAgICAgIC8vIGNhcGFiaWxpdGllcy4gUmVjdXJzaXZlIGlmIGEgcHJlcmVxdWlzaXRlIGNhcGFiaWxpdHkKLSAgICAgICAgICAgIC8vIG5vIGxvbmdlciBoYXMgYW55IGRlcGVuZGVudHMuCi0gICAgICAgICAgICBpZiAocmVnaXN0cnkuaGFzUHJlcmVxdWlzaXRlcyhjYXBhYmlsaXR5KSkgewotICAgICAgICAgICAgICAgIExpbmtlZExpc3QgY2FwYWJpbGl0aWVzID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuYWRkTGFzdChjYXBhYmlsaXR5KTsKLSAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBjYXBhYmlsaXR5IHRoYXQgaGFzIHByZXJlcXVpc2l0ZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICAgICAgICB3aGlsZSAoIWNhcGFiaWxpdGllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2FwYWJpbGl0eSB0YXJnZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IChDYXBhYmlsaXR5KSBjYXBhYmlsaXRpZXMucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIHByZXJlcXVpc2l0ZSBjYXBhYmlsaXRpZXMuLi4KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJlcmVxSWRzID0gcmVnaXN0cnkuZ2V0UHJlcmVxdWlzaXRlSWRzKHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdHlbXSBwcmVyZXFDYXBhYmlsaXRpZXM7Ci0gICAgICAgICAgICAgICAgICAgIHByZXJlcUNhcGFiaWxpdGllcyA9IHJlZ2lzdHJ5LmZpbmRDYXBhYmlsaXRpZXMocHJlcmVxSWRzKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggcHJlcmVxdWlzaXRlIGNhcGFiaWxpdHkuLi4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVyZXFDYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMgb24gdGhlIHByZXJlcXVpc2l0ZSBjYXBhYmlsaXR5Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5IHByZXJlcUNhcCA9IHByZXJlcUNhcGFiaWxpdGllc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBwcmVyZXFEZXBlbmRlbnRzID0gKEFycmF5TGlzdCkgZGVwZW5kZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KHByZXJlcUNhcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGRlcGVuZGVudCB0YXJnZXQgY2FwYWJpbGl0eS4uLgotICAgICAgICAgICAgICAgICAgICAgICAgcHJlcmVxRGVwZW5kZW50cy5yZW1vdmUodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVyZXFEZXBlbmRlbnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuY2hlY2tlZCB0aGUgcHJlcmVxdWlzaXRlIGNhcGFiaWxpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrQ2FwYWJpbGl0eVVuY2hlY2tlZChwcmVyZXFDYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZSBpZiBwcmVyZXF1aXNpdGUgY2FwYWJpbGl0eSBhbHNvIGhhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXJlcXVpc2l0ZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnkuaGFzUHJlcmVxdWlzaXRlcyhwcmVyZXFDYXApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuYWRkTGFzdChwcmVyZXFDYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmVyZXFEZXBlbmRlbnRzLnNpemUoKSA9PSAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHByZXJlcURlcGVuZGVudHMuZ2V0KDApID09IHByZXJlcUNhcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZGVwZW5kZW50IGlzIGl0c2VsZiBzbyB1bmdyYXkgdGhlIGl0ZW0gdG8gbGV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXIga25vdyBubyBvdGhlciBjYXBhYmlsaXR5IGlzIGRlcGVuZGVudCBvbiBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94Vmlld2VyLnNldEdyYXllZChwcmVyZXFDYXAsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm90aWZ5IHRob3NlIGludGVyZXN0ZWQKLSAgICAgICAgICAgIG5vdGlmeUNoZWNrU3RhdGVMaXN0bmVyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBBdCBsZWFzdCBvbmUgb3RoZXIgY2FwYWJpbGl0eSBkZXBlbmRzIG9uIGl0IGJlaW5nIGNoZWNrZWQKLSAgICAgICAgICAgIC8vIHNvIGZvcmNlIGl0IHRvIHJlbWFpbiBjaGVja2VkIGFuZCB3YXJuIHRoZSB1c2VyLgotICAgICAgICAgICAgY2hlY2tib3hWaWV3ZXIuc2V0Q2hlY2tlZChjYXBhYmlsaXR5LCB0cnVlKTsKLSAgICAgICAgICAgIC8vIEdldCBhIGNvcHkgYW5kIHJlbW92ZSB0aGUgdGFyZ2V0IGNhcGFiaWxpdHkKLSAgICAgICAgICAgIEFycmF5TGlzdCBkZXNjQ29weSA9IChBcnJheUxpc3QpIGRlc2NyaXB0b3JzLmNsb25lKCk7Ci0gICAgICAgICAgICBkZXNjQ29weS5yZW1vdmUoY2FwYWJpbGl0eSk7Ci0gICAgICAgICAgICAvLyBTaG93IHRoZSBwcmVyZXEgcHJvYmxlbSB0byB0aGUgdXNlcgotICAgICAgICAgICAgaWYgKGRlc2NDb3B5LnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgQ2FwYWJpbGl0eSBjYXAgPSAoQ2FwYWJpbGl0eSkgZGVzY0NvcHkuZ2V0KDApOwotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuV2FybmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3hWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfZXJyb3JUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9yZXF1aXJlZFByZXJlcSwgY2FwYWJpbGl0eS5nZXROYW1lKCksIGNhcC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdHIgPSBkZXNjQ29weS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdHkgY2FwID0gKENhcGFiaWxpdHkpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoIlxuICAgICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoY2FwLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuV2FybmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3hWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfZXJyb3JUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuUHJvamVjdENhcGFiaWxpdHlTZWxlY3Rpb25Hcm91cF9yZXF1aXJlZFByZXJlcXMsIGNhcGFiaWxpdHkuZ2V0TmFtZSgpLCBtc2cpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgY2FwYWJpbGl0aWVzIHNlbGVjdGVkCi0gICAgICogYnkgdGhlIHVzZXIuIFRoZSBjb2xsZWN0aW9uIGlzIG5vdCBpbiBwcmVyZXF1aXNpdGUKLSAgICAgKiBvcmRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFycmF5IG9mIHNlbGVjdGVkIGNhcGFiaWxpdGllcwotICAgICAqLwotICAgIHB1YmxpYyBDYXBhYmlsaXR5W10gZ2V0U2VsZWN0ZWRDYXBhYmlsaXRpZXMoKSB7Ci0gICAgICAgIENhcGFiaWxpdHlbXSBjYXBhYmlsaXRpZXMgPSBuZXcgQ2FwYWJpbGl0eVtjaGVja2VkQ2FwYWJpbGl0aWVzLnNpemUoKV07Ci0gICAgICAgIGNoZWNrZWRDYXBhYmlsaXRpZXMudG9BcnJheShjYXBhYmlsaXRpZXMpOwotICAgICAgICByZXR1cm4gY2FwYWJpbGl0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY3VycmVudCBsaXN0ZW5lciBpbnRlcmVzdGVkIHdoZW4gdGhlIGNoZWNrCi0gICAgICogc3RhdGUgb2YgYSBjYXBhYmlsaXR5IGFjdHVhbGx5IGNoYW5nZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBSZXR1cm5zIGEgSUNoZWNrU3RhdGVMaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyBJQ2hlY2tTdGF0ZUxpc3RlbmVyIGdldENoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhdGVMaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgaW50ZXJlc3RlZCB3aGVuIHRoZSBjaGVjawotICAgICAqIHN0YXRlIG9mIGEgY2FwYWJpbGl0eSBhY3R1YWxseSBjaGFuZ2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjaGVja1N0YXRlTGlzdGVuZXIgVGhlIGNoZWNrU3RhdGVMaXN0ZW5lciB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGVja1N0YXRlTGlzdGVuZXIoSUNoZWNrU3RhdGVMaXN0ZW5lciBjaGVja1N0YXRlTGlzdGVuZXIpIHsKLSAgICAgICAgdGhpcy5jaGVja1N0YXRlTGlzdGVuZXIgPSBjaGVja1N0YXRlTGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IHRoZSBjaGVjayBzdGF0ZSBsaXN0ZW5lciB0aGF0IGEgY2FwYWJpbGl0eQotICAgICAqIGNoZWNrIHN0YXRlIGhhcyBjaGFuZ2VkLiBUaGUgZXZlbnQgcGFzdCB3aWxsCi0gICAgICogYWx3YXlzIGJlIDxjb2RlPm51bGw8L2NvZGU+IGFzIGl0IGNvdWxkIGJlCi0gICAgICogdHJpZ2dlcmVkIGJ5IGNvZGUgaW5zdGVhZCBvZiB1c2VyIGlucHV0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBub3RpZnlDaGVja1N0YXRlTGlzdG5lcigpIHsKLSAgICAgICAgaWYgKGNoZWNrU3RhdGVMaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgY2hlY2tTdGF0ZUxpc3RlbmVyLmNoZWNrU3RhdGVDaGFuZ2VkKG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGRlc2NyaXB0aW9uIGZpZWxkIGZvciB0aGUgc2VsZWN0ZWQgY2FwYWJpbGl0eQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEZXNjcmlwdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBTdHJpbmcgdGV4dCA9IEVNUFRZX0RFU0NSSVBUSU9OOwotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICAgICAgQ2FwYWJpbGl0eSBjYXAgPSAoQ2FwYWJpbGl0eSkgc2VsLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGNhcCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRleHQgPSBjYXAuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBkZXNjcmlwdGlvblRleHQuc2V0VGV4dCh0ZXh0KTsKLSAgICB9Ci0KLSAgICBjbGFzcyBDYXBhYmlsaXR5TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIE1hcCBpbWFnZVRhYmxlOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICBpZiAoaW1hZ2VUYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gaW1hZ2VUYWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAoKEltYWdlKSBpdHIubmV4dCgpKS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgaW1hZ2VUYWJsZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKChDYXBhYmlsaXR5KSBlbGVtZW50KQotICAgICAgICAgICAgICAgICAgICAuZ2V0SWNvbkRlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIC8vb2J0YWluIHRoZSBjYWNoZWQgaW1hZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgZGVzY3JpcHRvcgotICAgICAgICAgICAgaWYgKGltYWdlVGFibGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGltYWdlVGFibGUgPSBuZXcgSGFzaHRhYmxlKDQwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gKEltYWdlKSBpbWFnZVRhYmxlLmdldChkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIGlmIChpbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgPSBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgICAgICAgICAgaW1hZ2VUYWJsZS5wdXQoZGVzY3JpcHRvciwgaW1hZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGltYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICBDYXBhYmlsaXR5IGNhcCA9IChDYXBhYmlsaXR5KSBlbGVtZW50OwotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBjYXAuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKGlzRGlzYWJsZWRDYXBhYmlsaXR5KGNhcCkpCi0gICAgICAgICAgICAgICAgdGV4dCA9IE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLlByb2plY3RDYXBhYmlsaXR5U2VsZWN0aW9uR3JvdXBfZGlzYWJsZWRMYWJlbCwgdGV4dCApOwotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbWlzYy9SZXNvdXJjZUFuZENvbnRhaW5lckdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21pc2MvUmVzb3VyY2VBbmRDb250YWluZXJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTYxMjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbWlzYy9SZXNvdXJjZUFuZENvbnRhaW5lckdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5taXNjOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci0KLS8qKgotICogV29ya2JlbmNoLWxldmVsIGNvbXBvc2l0ZSBmb3IgcmVzb3VyY2UgYW5kIGNvbnRhaW5lciBzcGVjaWZpY2F0aW9uIGJ5IHRoZSB1c2VyLgotICogU2VydmljZXMgc3VjaCBhcyBmaWVsZCB2YWxpZGF0aW9uIGFyZSBwZXJmb3JtZWQgYnkgdGhlIGdyb3VwLgotICogVGhlIGdyb3VwIGNhbiBiZSBjb25maWd1cmVkIHRvIGFjY2VwdCBleGlzdGluZyByZXNvdXJjZXMsIG9yIG9ubHkKLSAqIG5ldyByZXNvdXJjZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUFuZENvbnRhaW5lckdyb3VwIGltcGxlbWVudHMgTGlzdGVuZXIgewotICAgIC8vIHByb2JsZW0gaWRlbnRpZmllcnMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9CTEVNX05PTkUgPSAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPQkxFTV9SRVNPVVJDRV9FTVBUWSA9IDE7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9CTEVNX1JFU09VUkNFX0VYSVNUID0gMjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0JMRU1fUkVTT1VSQ0VfQ09OVEFJTlNfU0VQQVJBVE9SID0gMzsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0JMRU1fUEFUSF9JTlZBTElEID0gNDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0JMRU1fQ09OVEFJTkVSX0VNUFRZID0gNTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0JMRU1fUFJPSkVDVF9ET0VTX05PVF9FWElTVCA9IDY7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9CTEVNX05BTUVfSU5WQUxJRCA9IDc7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9CTEVNX1BBVEhfT0NDVVBJRUQgPSA4OwotCi0gICAgLy8gdGhlIGNsaWVudCB0byBub3RpZnkgb2YgY2hhbmdlcwotICAgIHByaXZhdGUgTGlzdGVuZXIgY2xpZW50OwotCi0gICAgLy8gd2hldGhlciB0byBhbGxvdyBleGlzdGluZyByZXNvdXJjZXMKLSAgICBwcml2YXRlIGJvb2xlYW4gYWxsb3dFeGlzdGluZ1Jlc291cmNlcyA9IGZhbHNlOwotCi0gICAgLy8gcmVzb3VyY2UgdHlwZSAoZmlsZSwgZm9sZGVyLCBwcm9qZWN0KQotICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNlVHlwZSA9IElERVdvcmtiZW5jaE1lc3NhZ2VzLlJlc291cmNlR3JvdXBfcmVzb3VyY2U7Ci0KLSAgICAvLyBzaG93IGNsb3NlZCBwcm9qZWN0cyBpbiB0aGUgdHJlZSwgYnkgZGVmYXVsdAotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93Q2xvc2VkUHJvamVjdHMgPSB0cnVlOwotCi0gICAgLy8gcHJvYmxlbSBpbmRpY2F0b3IKLSAgICBwcml2YXRlIFN0cmluZyBwcm9ibGVtTWVzc2FnZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgaW50IHByb2JsZW1UeXBlID0gUFJPQkxFTV9OT05FOwotCi0gICAgLy8gd2lkZ2V0cwotICAgIHByaXZhdGUgQ29udGFpbmVyU2VsZWN0aW9uR3JvdXAgY29udGFpbmVyR3JvdXA7Ci0KLSAgICBwcml2YXRlIFRleHQgcmVzb3VyY2VOYW1lRmllbGQ7Ci0KLSAgICAvLyBjb25zdGFudHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAyNTA7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGdyb3VwIHRvIGFsbG93IHRoZSB1c2VyCi0gICAgICogdG8gZW50ZXIvc2VsZWN0IGEgY29udGFpbmVyIGFuZCBzcGVjaWZ5IGEgcmVzb3VyY2UKLSAgICAgKiBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCBjb21wb3NpdGUgd2lkZ2V0IHRvIHBhcmVudCB0aGUgZ3JvdXAKLSAgICAgKiBAcGFyYW0gY2xpZW50IG9iamVjdCBpbnRlcmVzdGVkIGluIGNoYW5nZXMgdG8gdGhlIGdyb3VwJ3MgZmllbGRzIHZhbHVlCi0gICAgICogQHBhcmFtIHJlc291cmNlRmllbGRMYWJlbCBsYWJlbCB0byB1c2UgaW4gZnJvbnQgb2YgdGhlIHJlc291cmNlIG5hbWUgZmllbGQKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIG9uZSB3b3JkLCBpbiBsb3dlcmNhc2UsIHRvIGRlc2NyaWJlIHRoZSByZXNvdXJjZSB0byB0aGUgdXNlciAoZmlsZSwgZm9sZGVyLCBwcm9qZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUFuZENvbnRhaW5lckdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIGNsaWVudCwKLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZUZpZWxkTGFiZWwsIFN0cmluZyByZXNvdXJjZVR5cGUpIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIGNsaWVudCwgcmVzb3VyY2VGaWVsZExhYmVsLCByZXNvdXJjZVR5cGUsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZ3JvdXAgdG8gYWxsb3cgdGhlIHVzZXIKLSAgICAgKiB0byBlbnRlci9zZWxlY3QgYSBjb250YWluZXIgYW5kIHNwZWNpZnkgYSByZXNvdXJjZQotICAgICAqIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IGNvbXBvc2l0ZSB3aWRnZXQgdG8gcGFyZW50IHRoZSBncm91cAotICAgICAqIEBwYXJhbSBjbGllbnQgb2JqZWN0IGludGVyZXN0ZWQgaW4gY2hhbmdlcyB0byB0aGUgZ3JvdXAncyBmaWVsZHMgdmFsdWUKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VGaWVsZExhYmVsIGxhYmVsIHRvIHVzZSBpbiBmcm9udCBvZiB0aGUgcmVzb3VyY2UgbmFtZSBmaWVsZAotICAgICAqIEBwYXJhbSByZXNvdXJjZVR5cGUgb25lIHdvcmQsIGluIGxvd2VyY2FzZSwgdG8gZGVzY3JpYmUgdGhlIHJlc291cmNlIHRvIHRoZSB1c2VyIChmaWxlLCBmb2xkZXIsIHByb2plY3QpCi0gICAgICogQHBhcmFtIHNob3dDbG9zZWRQcm9qZWN0cyB3aGV0aGVyIG9yIG5vdCB0byBzaG93IGNsb3NlZCBwcm9qZWN0cwotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUFuZENvbnRhaW5lckdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIGNsaWVudCwKLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZUZpZWxkTGFiZWwsIFN0cmluZyByZXNvdXJjZVR5cGUsCi0gICAgICAgICAgICBib29sZWFuIHNob3dDbG9zZWRQcm9qZWN0cykgewotICAgICAgICB0aGlzKHBhcmVudCwgY2xpZW50LCByZXNvdXJjZUZpZWxkTGFiZWwsIHJlc291cmNlVHlwZSwKLSAgICAgICAgICAgICAgICBzaG93Q2xvc2VkUHJvamVjdHMsIFNXVC5ERUZBVUxUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGdyb3VwIHRvIGFsbG93IHRoZSB1c2VyCi0gICAgICogdG8gZW50ZXIvc2VsZWN0IGEgY29udGFpbmVyIGFuZCBzcGVjaWZ5IGEgcmVzb3VyY2UKLSAgICAgKiBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCBjb21wb3NpdGUgd2lkZ2V0IHRvIHBhcmVudCB0aGUgZ3JvdXAKLSAgICAgKiBAcGFyYW0gY2xpZW50IG9iamVjdCBpbnRlcmVzdGVkIGluIGNoYW5nZXMgdG8gdGhlIGdyb3VwJ3MgZmllbGRzIHZhbHVlCi0gICAgICogQHBhcmFtIHJlc291cmNlRmllbGRMYWJlbCBsYWJlbCB0byB1c2UgaW4gZnJvbnQgb2YgdGhlIHJlc291cmNlIG5hbWUgZmllbGQKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIG9uZSB3b3JkLCBpbiBsb3dlcmNhc2UsIHRvIGRlc2NyaWJlIHRoZSByZXNvdXJjZSB0byB0aGUgdXNlciAoZmlsZSwgZm9sZGVyLCBwcm9qZWN0KQotICAgICAqIEBwYXJhbSBzaG93Q2xvc2VkUHJvamVjdHMgd2hldGhlciBvciBub3QgdG8gc2hvdyBjbG9zZWQgcHJvamVjdHMKLSAgICAgKiBAcGFyYW0gaGVpZ2h0SGludCBoZWlnaHQgaGludCBmb3IgdGhlIGNvbnRhaW5lciBzZWxlY3Rpb24gd2lkZ2V0IGdyb3VwCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlQW5kQ29udGFpbmVyR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgY2xpZW50LAotICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlRmllbGRMYWJlbCwgU3RyaW5nIHJlc291cmNlVHlwZSwKLSAgICAgICAgICAgIGJvb2xlYW4gc2hvd0Nsb3NlZFByb2plY3RzLCBpbnQgaGVpZ2h0SGludCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKLSAgICAgICAgdGhpcy5zaG93Q2xvc2VkUHJvamVjdHMgPSBzaG93Q2xvc2VkUHJvamVjdHM7Ci0gICAgICAgIGNyZWF0ZUNvbnRlbnRzKHBhcmVudCwgcmVzb3VyY2VGaWVsZExhYmVsLCBoZWlnaHRIaW50KTsKLSAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFsbCBjb250cm9scyBpbiB0aGlzIGdyb3VwCi0gICAgICogY29udGFpbiB2YWxpZCB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhcmVBbGxWYWx1ZXNWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIHByb2JsZW1UeXBlID09IFBST0JMRU1fTk9ORTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoaXMgb2JqZWN0J3MgdmlzdWFsIGNvbXBvbmVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotICAgICAqIEBwYXJhbSBoZWlnaHRIaW50IGhlaWdodCBoaW50IGZvciB0aGUgY29udGFpbmVyIHNlbGVjdGlvbiB3aWRnZXQgZ3JvdXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgcmVzb3VyY2VMYWJlbFN0cmluZywKLSAgICAgICAgICAgIGludCBoZWlnaHRIaW50KSB7Ci0KLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgLy8gc2VydmVyIG5hbWUgZ3JvdXAKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChmb250KTsKLQotICAgICAgICAvLyBjb250YWluZXIgZ3JvdXAKLSAgICAgICAgaWYgKGhlaWdodEhpbnQgPT0gU1dULkRFRkFVTFQpCi0gICAgICAgICAgICBjb250YWluZXJHcm91cCA9IG5ldyBDb250YWluZXJTZWxlY3Rpb25Hcm91cChjb21wb3NpdGUsIHRoaXMsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIHNob3dDbG9zZWRQcm9qZWN0cyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRhaW5lckdyb3VwID0gbmV3IENvbnRhaW5lclNlbGVjdGlvbkdyb3VwKGNvbXBvc2l0ZSwgdGhpcywgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgc2hvd0Nsb3NlZFByb2plY3RzLCBoZWlnaHRIaW50LCBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSCk7Ci0KLSAgICAgICAgLy8gcmVzb3VyY2UgbmFtZSBncm91cAotICAgICAgICBDb21wb3NpdGUgbmFtZUdyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBuYW1lR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIG5hbWVHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotICAgICAgICBuYW1lR3JvdXAuc2V0Rm9udChmb250KTsKLQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChuYW1lR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChyZXNvdXJjZUxhYmVsU3RyaW5nKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChmb250KTsKLQotICAgICAgICAvLyByZXNvdXJjZSBuYW1lIGVudHJ5IGZpZWxkCi0gICAgICAgIHJlc291cmNlTmFtZUZpZWxkID0gbmV3IFRleHQobmFtZUdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgcmVzb3VyY2VOYW1lRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotICAgICAgICByZXNvdXJjZU5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICByZXNvdXJjZU5hbWVGaWVsZC5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIHZhbGlkYXRlQ29udHJvbHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29udGFpbmVyCi0gICAgICogb3IgbnVsbCBpZiBubyBjb250YWluZXIgaGFzIGJlZW4gc2VsZWN0ZWQuIE5vdGUgdGhhdAotICAgICAqIHRoZSBjb250YWluZXIgbWF5IG5vdCBleGlzdCB5ZXQgaWYgdGhlIHVzZXIgZW50ZXJlZAotICAgICAqIGEgbmV3IGNvbnRhaW5lciBuYW1lIGluIHRoZSBmaWVsZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGggZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBjb250YWluZXJHcm91cC5nZXRDb250YWluZXJGdWxsUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHByb2JsZW0gd2l0aCB0aGUgdmFsdWUKLSAgICAgKiBvZiBhIGNvbnRyb2wgaW4gdGhlIGdyb3VwLCBvciBhbiBlbXB0eSBtZXNzYWdlIGlmIGFsbCBjb250cm9scyBpbiB0aGUKLSAgICAgKiBncm91cCBjb250YWluIHZhbGlkIHZhbHVlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvYmxlbU1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBwcm9ibGVtTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHByb2JsZW0gd2l0aCB0aGUgdmFsdWUgb2YgYSBjb250cm9sCi0gICAgICogaW4gdGhlIGdyb3VwLgotICAgICAqCi0gICAgICogQHJldHVybiBvbmUgb2YgdGhlIFBST0JMRU1fKiBjb25zdGFudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFByb2JsZW1UeXBlKCkgewotICAgICAgICByZXR1cm4gcHJvYmxlbVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgICAgKiBjb250YWluZXIuICBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiBubyBjb250YWluZXIgaGFzIGJlZW4KLSAgICAgKiBzZWxlY3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgZXZlbnRzIGZvciBhbGwgY29udHJvbHMgaW4gdGhlIGdyb3VwLgotICAgICAqCi0gICAgICogQHBhcmFtIGUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0gICAgICAgIHZhbGlkYXRlQ29udHJvbHMoKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbGllbnQuaGFuZGxlRXZlbnQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBleGlzdGluZyByZXNvdXJjZXMgYXJlIHBlcm1pdHRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd0V4aXN0aW5nUmVzb3VyY2VzKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgYWxsb3dFeGlzdGluZ1Jlc291cmNlcyA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgcGFnZSdzIGNvbnRhaW5lci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIEZ1bGwgcGF0aCB0byB0aGUgY29udGFpbmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lckZ1bGxQYXRoKElQYXRoIHBhdGgpIHsKLSAgICAgICAgSVJlc291cmNlIGluaXRpYWwgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0gICAgICAgICAgICAgICAgLmZpbmRNZW1iZXIocGF0aCk7Ci0gICAgICAgIGlmIChpbml0aWFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghKGluaXRpYWwgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSkgewotICAgICAgICAgICAgICAgIGluaXRpYWwgPSBpbml0aWFsLmdldFBhcmVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGFpbmVyR3JvdXAuc2V0U2VsZWN0ZWRDb250YWluZXIoKElDb250YWluZXIpIGluaXRpYWwpOwotICAgICAgICB9Ci0gICAgICAgIHZhbGlkYXRlQ29udHJvbHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlcyBmb2N1cyB0byB0aGUgcmVzb3VyY2UgbmFtZSBmaWVsZCBhbmQgc2VsZWN0cyBpdHMgY29udGVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgLy9zZWxlY3QgdGhlIHdob2xlIHJlc291cmNlIG5hbWUuCi0gICAgICAgIHJlc291cmNlTmFtZUZpZWxkLnNldFNlbGVjdGlvbigwLCByZXNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkpOwotICAgICAgICByZXNvdXJjZU5hbWVGaWVsZC5zZXRGb2N1cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgcGFnZSdzIHJlc291cmNlIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgbmV3IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJlc291cmNlTmFtZUZpZWxkLnNldFRleHQodmFsdWUpOwotICAgICAgICB2YWxpZGF0ZUNvbnRyb2xzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcgd2hldGhlciBhIGNvbnRhaW5lciBuYW1lIHJlcHJlc2VudHMKLSAgICAgKiBhIHZhbGlkIGNvbnRhaW5lciByZXNvdXJjZSBpbiB0aGUgd29ya2JlbmNoLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyBzdG9yZWQgZm9yCi0gICAgICogZnV0dXJlIHJlZmVyZW5jZSBpZiB0aGUgbmFtZSBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBjb250YWluZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcgdmFsaWRpdHkgb2YgdGhlIGNvbnRhaW5lciBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVDb250YWluZXIoKSB7Ci0gICAgICAgIElQYXRoIHBhdGggPSBjb250YWluZXJHcm91cC5nZXRDb250YWluZXJGdWxsUGF0aCgpOwotICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9ibGVtVHlwZSA9IFBST0JMRU1fQ09OVEFJTkVSX0VNUFRZOwotICAgICAgICAgICAgcHJvYmxlbU1lc3NhZ2UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX2ZvbGRlckVtcHR5OwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBwYXRoLnNlZ21lbnQoMCk7Ci0gICAgICAgIGlmIChwcm9qZWN0TmFtZSA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgIXdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHByb2JsZW1UeXBlID0gUFJPQkxFTV9QUk9KRUNUX0RPRVNfTk9UX0VYSVNUOwotICAgICAgICAgICAgcHJvYmxlbU1lc3NhZ2UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX25vUHJvamVjdDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvL3BhdGggaXMgaW52YWxpZCBpZiBhbnkgcHJlZml4IGlzIG9jY3VwaWVkIGJ5IGEgZmlsZQotICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLSAgICAgICAgd2hpbGUgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0gICAgICAgIAlpZiAocm9vdC5nZXRGaWxlKHBhdGgpLmV4aXN0cygpKSB7Ci0gICAgICAgIAkJcHJvYmxlbVR5cGUgPSBQUk9CTEVNX1BBVEhfT0NDVVBJRUQ7Ci0gICAgICAgIAkJcHJvYmxlbU1lc3NhZ2UgPSBOTFMuYmluZChJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX3BhdGhPY2N1cGllZCwgcGF0aC5tYWtlUmVsYXRpdmUoKSk7Ci0gICAgICAgIAkJcmV0dXJuIGZhbHNlOwotICAgICAgICAJfQotICAgICAgICAJcGF0aCA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBncm91cCdzIGNvbnRyb2xzLiAgSWYgYW4gaW52YWxpZAotICAgICAqIHZhbHVlIGlzIGZvdW5kIHRoZW4gYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlIGlzIHN0b3JlZCBmb3IgbGF0ZXIKLSAgICAgKiByZWZlcmVuY2UuICBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoZSB2YWxpZGl0eSBvZiBhbGwgb2YgdGhlCi0gICAgICogY29udHJvbHMgaW4gdGhlIGdyb3VwLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlQ29udHJvbHMoKSB7Ci0gICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gdmFsaWRhdGUgY29udHJvbHMgdW50aWwgdGhleSBoYXZlIGJlZW4gY3JlYXRlZAotICAgICAgICBpZiAoY29udGFpbmVyR3JvdXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHByb2JsZW1UeXBlID0gUFJPQkxFTV9OT05FOwotICAgICAgICBwcm9ibGVtTWVzc2FnZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpZiAoIXZhbGlkYXRlQ29udGFpbmVyKCkgfHwgIXZhbGlkYXRlUmVzb3VyY2VOYW1lKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgSVBhdGggcGF0aCA9IGNvbnRhaW5lckdyb3VwLmdldENvbnRhaW5lckZ1bGxQYXRoKCkuYXBwZW5kKAotICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0ZUZ1bGxSZXNvdXJjZVBhdGgocGF0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcgd2hldGhlciB0aGUgc3BlY2lmaWVkIHJlc291cmNlCi0gICAgICogcGF0aCByZXByZXNlbnRzIGEgdmFsaWQgbmV3IHJlc291cmNlIGluIHRoZSB3b3JrYmVuY2guICBBbiBlcnJvciBtZXNzYWdlCi0gICAgICogaXMgc3RvcmVkIGZvciBmdXR1cmUgcmVmZXJlbmNlIGlmIHRoZSBwYXRoICBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZAotICAgICAqIG5ldyByZXNvdXJjZSBwYXRoLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlUGF0aCB0aGUgcGF0aCB0byB2YWxpZGF0ZQotICAgICAqIEByZXR1cm4gPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB2YWxpZGl0eSBvZiB0aGUgcmVzb3VyY2UgcGF0aAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRnVsbFJlc291cmNlUGF0aChJUGF0aCByZXNvdXJjZVBhdGgpIHsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0KLSAgICAgICAgSVN0YXR1cyByZXN1bHQgPSB3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHJlc291cmNlUGF0aC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZS5GT0xERVIpOwotICAgICAgICBpZiAoIXJlc3VsdC5pc09LKCkpIHsKLSAgICAgICAgICAgIHByb2JsZW1UeXBlID0gUFJPQkxFTV9QQVRIX0lOVkFMSUQ7Ci0gICAgICAgICAgICBwcm9ibGVtTWVzc2FnZSA9IHJlc3VsdC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFsbG93RXhpc3RpbmdSZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAmJiAod29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIocmVzb3VyY2VQYXRoKS5leGlzdHMoKSB8fCB3b3Jrc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSb290KCkuZ2V0RmlsZShyZXNvdXJjZVBhdGgpLmV4aXN0cygpKSkgewotICAgICAgICAgICAgcHJvYmxlbVR5cGUgPSBQUk9CTEVNX1JFU09VUkNFX0VYSVNUOwotICAgICAgICAgICAgcHJvYmxlbU1lc3NhZ2UgPSBJREVXb3JrYmVuY2hNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHM7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVzb3VyY2UgbmFtZSByZXAtCi0gICAgICogcmVzZW50cyBhIHZhbGlkIHJlc291cmNlIG5hbWUgaW4gdGhlIHdvcmtiZW5jaC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgc3RvcmVkCi0gICAgICogZm9yIGZ1dHVyZSByZWZlcmVuY2UgaWYgdGhlIG5hbWUgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgcmVzb3VyY2UgbmFtZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB2YWxpZGl0eSBvZiB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2VOYW1lKCkgewotICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpOwotCi0gICAgICAgIGlmIChyZXNvdXJjZU5hbWUuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHByb2JsZW1UeXBlID0gUFJPQkxFTV9SRVNPVVJDRV9FTVBUWTsKLSAgICAgICAgICAgIHByb2JsZW1NZXNzYWdlID0gTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VHcm91cF9lbXB0eU5hbWUsIHJlc291cmNlVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIShuZXcgUGF0aCgiIikpLmlzVmFsaWRQYXRoKHJlc291cmNlTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcHJvYmxlbVR5cGUgPSBQUk9CTEVNX05BTUVfSU5WQUxJRDsKLSAgICAgICAgICAgIHByb2JsZW1NZXNzYWdlID0gTkxTLmJpbmQoSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VHcm91cF9pbnZhbGlkRmlsZW5hbWUsIHJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21pc2MvV2l6YXJkU3RlcEdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21pc2MvV2l6YXJkU3RlcEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTM3MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9taXNjL1dpemFyZFN0ZXBHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBTZWJhc3RpYW4gRGF2aWRzIDxzZGF2aWRzQGdteC5kZT4gLSBGaXggZm9yIGJ1ZyAxOTM0NiAtIERpYWxvZyBmb250IHNob3VsZCBiZQotICogICAgIGFjdGl2YXRlZCBhbmQgdXNlZCBieSBvdGhlciBjb21wb25lbnRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5taXNjOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MuV2l6YXJkU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogQSBncm91cCBvZiBjb250cm9scyB1c2VkIHRvIHZpZXcgdGhlIGxpc3Qgb2YKLSAqIHdpemFyZCBzdGVwcyB0byBiZSBkb25lLgotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkU3RlcEdyb3VwIHsKLQkKLQkgcHJpdmF0ZSBJbWFnZSBkb25lSW1hZ2U7Ci0KLSAgICBwcml2YXRlIEltYWdlIGN1cnJlbnRJbWFnZTsKLQotICAgIHByaXZhdGUgV2l6YXJkU3RlcCBjdXJyZW50U3RlcDsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgVGFibGVWaWV3ZXIgc3RlcFZpZXdlcjsKLQotICAgIHByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPldpemFyZFN0ZXBHcm91cDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgV2l6YXJkU3RlcEdyb3VwKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgY29udGVudHMgb2YgdGhpcyBncm91cC4gVGhlIGJhc2ljIGxheW91dCBpcyBhIHRhYmxlCi0gICAgICogd2l0aCBhIGxhYmVsIGFib3ZlIGl0LgotICAgICAqLwotICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgcGFyZW50Q29tcG9zaXRlID0gcGFyZW50OwotCi0gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvc2l0ZSB0byBob2xkIGV2ZXJ5dGhpbmcgdG9nZXRoZXIKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KGZvbnQpOwotICAgICAgICBjb21wb3NpdGUuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChkb25lSW1hZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkb25lSW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBkb25lSW1hZ2UgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudEltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudEltYWdlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIEFkZCBhIGxhYmVsIHRvIGlkZW50aWZ5IHRoZSBzdGVwIGxpc3QgZmllbGQKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkU3RlcEdyb3VwX3N0ZXBzTGFiZWwpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBsYWJlbC5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIC8vIFRhYmxlIHZpZXdlciBvZiBhbGwgdGhlIHN0ZXBzCi0gICAgICAgIHN0ZXBWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULlZfU0NST0xMCi0gICAgICAgICAgICAgICAgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBzdGVwVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgc3RlcFZpZXdlci5nZXRUYWJsZSgpLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIHN0ZXBWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldFN0ZXBQcm92aWRlcigpKTsKLSAgICAgICAgc3RlcFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBTdGVwTGFiZWxQcm92aWRlcigpKTsKLQotICAgICAgICBpZiAoc2VsZWN0aW9uTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHN0ZXBWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyBpY29uRmlsZU5hbWUpIHsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSAKLQkJCUlERVdvcmtiZW5jaFBsdWdpbi5nZXRJREVJbWFnZURlc2NyaXB0b3IoaWNvbkZpbGVOYW1lKTsKLSAgICAgICAKLSAgICAgICAgcmV0dXJuIGRlc2MuY3JlYXRlSW1hZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGltYWdlIGluZGljYXRpbmcgYSBzdGVwIGlzIGN1cnJlbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIEltYWdlIGdldEN1cnJlbnRJbWFnZSgpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRJbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjdXJyZW50SW1hZ2UgPSBjcmVhdGVJbWFnZSgiZWxjbDE2L3N0ZXBfY3VycmVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50SW1hZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBpbWFnZSBpbmRpY2F0aW5nIGEgc3RlcCBpcyBkb25lCi0gICAgICovCi0gICAgcHJpdmF0ZSBJbWFnZSBnZXREb25lSW1hZ2UoKSB7Ci0gICAgICAgIGlmIChkb25lSW1hZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgZG9uZUltYWdlID0gY3JlYXRlSW1hZ2UoImVsY2wxNi9zdGVwX2RvbmUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9uZUltYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBzdGVwIHZpZXdlcgotICAgICAqLwotICAgIHByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBnZXRTdGVwUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBTdGVwUm9vdCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoU3RlcFJvb3QpIHBhcmVudEVsZW1lbnQpLmdldFN0ZXBzKCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0ZXBzLgotICAgICAqLwotICAgIHB1YmxpYyBXaXphcmRTdGVwW10gZ2V0U3RlcHMoKSB7Ci0gICAgICAgIGlmIChzdGVwVmlld2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0ZXBSb290IHJvb3QgPSAoU3RlcFJvb3QpIHN0ZXBWaWV3ZXIuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChyb290ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJvb3QuZ2V0U3RlcHMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgV2l6YXJkU3RlcFswXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXJrcyB0aGUgY3VycmVudCBzdGVwIGFzIGJlaW5nIGRvbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtYXJrU3RlcEFzRG9uZSgpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRTdGVwICE9IG51bGwpCi0gICAgICAgICAgICBjdXJyZW50U3RlcC5tYXJrQXNEb25lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBzdGVwIGJlaW5nIHdvcmtlZCBvbi4gQXNzdW1lcwotICAgICAqIHRoZSBzdGVwIHByb3ZpZGVkIGV4aXN0IGluIHRoZSBzdGVwcyB3aXRoaW4gdGhlCi0gICAgICogZ3JvdXAncyB2aWV3ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0ZXAgdGhlIHdpemFyZCBzdGVwIGJlaW5nIHdvcmtlZCBvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRTdGVwKFdpemFyZFN0ZXAgc3RlcCkgewotICAgICAgICBXaXphcmRTdGVwIG9sZFN0ZXAgPSBjdXJyZW50U3RlcDsKLSAgICAgICAgY3VycmVudFN0ZXAgPSBzdGVwOwotICAgICAgICBpZiAoc3RlcFZpZXdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAob2xkU3RlcCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0ZXBWaWV3ZXIudXBkYXRlKG9sZFN0ZXAsIG51bGwpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGVwICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RlcFZpZXdlci51cGRhdGUoY3VycmVudFN0ZXAsIG51bGwpOwotCi0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGxheW91dCBzbyB0aGF0IHRoZXJlIGlzIGVub3VnaAotICAgICAgICAgICAgLy8gcm9vbSBmb3IgdGhlIGljb24gbm93LgotICAgICAgICAgICAgaWYgKG9sZFN0ZXAgPT0gbnVsbCAmJiBjdXJyZW50U3RlcCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHBhcmVudENvbXBvc2l0ZS5sYXlvdXQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgaW50ZXJlc3RlZCB3aGVuIHRoZSBzZWxlY3Rpb24KLSAgICAgKiBzdGF0ZSBjaGFuZ2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgc2VsZWN0aW9uIGxpc3RlbmVyIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbkxpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKHNlbGVjdGlvbkxpc3RlbmVyICE9IG51bGwgJiYgc3RlcFZpZXdlciAhPSBudWxsKQotICAgICAgICAgICAgc3RlcFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotICAgICAgICBzZWxlY3Rpb25MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICBpZiAoc2VsZWN0aW9uTGlzdGVuZXIgIT0gbnVsbCAmJiBzdGVwVmlld2VyICE9IG51bGwpCi0gICAgICAgICAgICBzdGVwVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3RlcHMgdG8gYmUgZGlzcGxheWVkLiBJZ25vcmVkIGlzIHRoZQotICAgICAqIG1ldGhvZCBjcmVhdGVDb250ZW50cyBoYXMgbm90IGJlZW4gY2FsbGVkIHlldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RlcHMgdGhlIGNvbGxlY3Rpb24gb2Ygc3RlcHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGVwcyhXaXphcmRTdGVwW10gc3RlcHMpIHsKLSAgICAgICAgaWYgKHN0ZXBWaWV3ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RlcFZpZXdlci5zZXRJbnB1dChuZXcgU3RlcFJvb3Qoc3RlcHMpKTsKLSAgICAgICAgICAgIHBhcmVudENvbXBvc2l0ZS5sYXlvdXQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIb2xkZXIgb2YgYWxsIHRoZSBzdGVwcyB3aXRoaW4gdGhlIHZpZXdlcgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU3RlcFJvb3QgewotICAgICAgICBwcml2YXRlIFdpemFyZFN0ZXBbXSBzdGVwczsKLQotICAgICAgICBwdWJsaWMgU3RlcFJvb3QoV2l6YXJkU3RlcFtdIHN0ZXBzKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5zdGVwcyA9IHN0ZXBzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFdpemFyZFN0ZXBbXSBnZXRTdGVwcygpIHsKLSAgICAgICAgICAgIGlmIChzdGVwcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2l6YXJkU3RlcFswXTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RlcHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMYWJlbCBwcm92aWRlciBmb3Igc3RlcCB0YWJsZSB2aWV3ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFN0ZXBMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXaXphcmRTdGVwKSB7Ci0gICAgICAgICAgICAgICAgV2l6YXJkU3RlcCBzdGVwID0gKFdpemFyZFN0ZXApIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0ZXAuZ2V0TnVtYmVyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIuICIgKyBzdGVwLmdldExhYmVsKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV2l6YXJkU3RlcCkgewotICAgICAgICAgICAgICAgIFdpemFyZFN0ZXAgc3RlcCA9IChXaXphcmRTdGVwKSBlbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChzdGVwLmlzRG9uZSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RG9uZUltYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0ZXAgPT0gY3VycmVudFN0ZXApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDdXJyZW50SW1hZ2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL0NvbXBvc2l0ZVJlc291cmNlTWFwcGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Db21wb3NpdGVSZXNvdXJjZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2M2I1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL0NvbXBvc2l0ZVJlc291cmNlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotLyoqCi0gKiBBIHJlc291cmNlIG1hcHBpbmcgdGhhdCBjb250YWlucyBjaGlsZCBtYXBwaW5ncyB3aGljaCBhcmUgdXNlZCB0byBvYnRhaW4gdGhlIHRyYXZlcnNhbHMKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZVJlc291cmNlTWFwcGluZyBleHRlbmRzIFJlc291cmNlTWFwcGluZyB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtb2RlbE9iamVjdDsKLSAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlTWFwcGluZ1tdIG1hcHBpbmdzOwotICAgIHByaXZhdGUgZmluYWwgSVByb2plY3RbXSBwcm9qZWN0czsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNvbXBvc2l0ZSBtYXBwaW5nIHRoYXQgb2J0YWlucyBpdCdzIHRyYXZlcnNhbHMgZnJvbSBhIHNldCBvZiBzdWItbWFwcGluZ3MuCi0gICAgICogQHBhcmFtIG1vZGVsT2JqZWN0IHRoZSBtb2RlbCBvYmplY3QgZm9yIHRoaXMgbWFwcGluZwotICAgICAqIEBwYXJhbSBtYXBwaW5ncyB0aGUgc3ViLW1hcHBpbmdzIGZyb20gd2hpY2ggdGhlIHRyYXZlcnNhbHMgYXJlIG9idGFpbmVkCi0gICAgICovCi0gICAgcHVibGljIENvbXBvc2l0ZVJlc291cmNlTWFwcGluZyhPYmplY3QgbW9kZWxPYmplY3QsIFJlc291cmNlTWFwcGluZ1tdIG1hcHBpbmdzKSB7Ci0gICAgICAgIHRoaXMubW9kZWxPYmplY3QgPSBtb2RlbE9iamVjdDsKLSAgICAgICAgdGhpcy5tYXBwaW5ncyA9IG1hcHBpbmdzOwotICAgICAgICB0aGlzLnByb2plY3RzID0gZ2V0UHJvamVjdHMobWFwcGluZ3MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJuIGFuIGFycmF5IG9mIGFsbCB0aGUgcHJvamVjdHMgb2YgdGhlIGdpdmVuIG1hcHBpbmdzLgotICAgICAqLwotICAgIHByaXZhdGUgSVByb2plY3RbXSBnZXRQcm9qZWN0cyhSZXNvdXJjZU1hcHBpbmdbXSBtYXBwaW5ncykgewotICAgICAgICBTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUmVzb3VyY2VNYXBwaW5nIG1hcHBpbmcgPSBtYXBwaW5nc1tpXTsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChtYXBwaW5nLmdldFByb2plY3RzKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKElQcm9qZWN0W10pIHJlc3VsdC50b0FycmF5KG5ldyBJUHJvamVjdFtyZXN1bHQuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMubWFwcGluZy5SZXNvdXJjZU1hcHBpbmcjZ2V0TW9kZWxPYmplY3QoKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlbE9iamVjdDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlTWFwcGluZyNnZXRQcm9qZWN0cygpCi0gICAgICovCi0gICAgcHVibGljIElQcm9qZWN0W10gZ2V0UHJvamVjdHMoKSB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0czsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMubWFwcGluZy5SZXNvdXJjZU1hcHBpbmcjZ2V0VHJhdmVyc2FscyhvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlTWFwcGluZ0NvbnRleHQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZVRyYXZlcnNhbFtdIGdldFRyYXZlcnNhbHMoUmVzb3VyY2VNYXBwaW5nQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtb25pdG9yID09IG51bGwpCi0gICAgICAgICAgICBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKG51bGwsIDEwMCAqIG1hcHBpbmdzLmxlbmd0aCk7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZU1hcHBpbmcgbWFwcGluZyA9IG1hcHBpbmdzW2ldOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChtYXBwaW5nLmdldFRyYXZlcnNhbHMoY29udGV4dCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDApKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChSZXNvdXJjZVRyYXZlcnNhbFtdKSByZXN1bHQudG9BcnJheShuZXcgUmVzb3VyY2VUcmF2ZXJzYWxbcmVzdWx0LnNpemUoKV0pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1vZGVsUHJvdmlkZXJJZCgpIHsKLQkJcmV0dXJuIE1vZGVsUHJvdmlkZXIuUkVTT1VSQ0VfTU9ERUxfUFJPVklERVJfSUQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL0ZpbGVPcGVuV2l0aEVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL0ZpbGVPcGVuV2l0aEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTEwNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9GaWxlT3BlbldpdGhFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5pZGUuT3BlbldpdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotcHVibGljIGNsYXNzIEZpbGVPcGVuV2l0aEVudHJ5IGV4dGVuZHMgT3BlbldpdGhFbnRyeSB7Ci0KLQlwdWJsaWMgRmlsZU9wZW5XaXRoRW50cnkoSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzYywgSUZpbGUgZmlsZSkgewotCQlzdXBlcihlZGl0b3JEZXNjLCBmaWxlKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChlZGl0b3JEZXNjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIGJvb2xlYW4gYWN0aXZhdGUsCi0JCQlpbnQgbWF0Y2hGbGFncywgYm9vbGVhbiByZW1lbWJlckVkaXRvcikgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChnZXRFZGl0b3JEZXNjcmlwdG9yKCkpOwotCQlTdHJpbmcgZWRpdG9ySWQgPSBnZXRFZGl0b3JEZXNjcmlwdG9yKCkuZ2V0SWQoKTsKLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgZ2V0RWxlbWVudCgpOwotCQlwYWdlLm9wZW5FZGl0b3IoCi0JCQkJbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZWRpdG9ySWQsIGFjdGl2YXRlLCBtYXRjaEZsYWdzKTsKLQkJaWYgKHJlbWVtYmVyRWRpdG9yKSB7Ci0JCQkvLyBvbmx5IHJlbWVtYmVyIHRoZSBkZWZhdWx0IGVkaXRvciBpZiB0aGUgb3BlbiBzdWNjZWVkcwotCQkJSURFLnNldERlZmF1bHRFZGl0b3IoZmlsZSwgZWRpdG9ySWQpOwotCQl9Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgZ2V0RWxlbWVudCgpOwotCi0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2M7Ci0JCQotCQlpZiAoZ2V0RWRpdG9yRGVzY3JpcHRvcigpICE9IG51bGwpIHsKLQkJCVN0cmluZyBlZGl0b3JJZCA9IGdldEVkaXRvckRlc2NyaXB0b3IoKSA9PSBudWxsID8gbnVsbAotCQkJCTogZ2V0RWRpdG9yRGVzY3JpcHRvcigpLmdldElkKCk7Ci0JCQlpZiAoSUVkaXRvclJlZ2lzdHJ5LlNZU1RFTV9FWFRFUk5BTF9FRElUT1JfSUQuZXF1YWxzKGVkaXRvcklkKQotCQkJCQl8fCBJRWRpdG9yUmVnaXN0cnkuU1lTVEVNX0lOUExBQ0VfRURJVE9SX0lELmVxdWFscyhlZGl0b3JJZCkpIHsKLQkJCQlyZXR1cm4gcmVnaXN0cnkuZ2V0U3lzdGVtRXh0ZXJuYWxFZGl0b3JJbWFnZURlc2NyaXB0b3IoZmlsZQotCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlpbWFnZURlc2MgPSBnZXRFZGl0b3JEZXNjcmlwdG9yKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlpZiAoaW1hZ2VEZXNjICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gaW1hZ2VEZXNjOwotCQkJfQotCQl9Ci0JCQotCQkvLyBUT0RPOiBpcyB0aGlzIGNhc2UgdmFsaWQsIGFuZCBpZiBzbywgd2hhdCBhcmUgdGhlIGltcGxpY2F0aW9ucwotCQkvLyBmb3IgY29udGVudC10eXBlIGVkaXRvciBiaW5kaW5ncz8KLQkJaW1hZ2VEZXNjID0gcmVnaXN0cnkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGZpbGUuZ2V0TmFtZSgpKTsKLQkJaWYgKGltYWdlRGVzYyAhPSBudWxsKQotCQkJcmV0dXJuIGltYWdlRGVzYzsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Nb2RlbFByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvTW9kZWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NzkxOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Nb2RlbFByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmlkZS5JRWRpdG9yT3BlblN0cmF0ZWd5OwotCi0vKioKLSAqIEFkYXB0ZXIgZmFjdG9yeSB3aGljaCBwcm92aWRlcyBhbiBlZGl0b3Igb3BlbiBzdHJhdGVneSBmb3IgdGhlIHJlc291cmNlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotICAgIAkvLyBUT0RPIGZpeCB1cCBpbnRlcm5hbCByZWYgdG8gUmVzb3VyY2VNb2RlbFByb3ZpZGVyCi0gICAgICAgIGlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZU1vZGVsUHJvdmlkZXIpIHsKLSAgICAgICAgICAgIGlmIChhZGFwdGVyVHlwZSA9PSBJRWRpdG9yT3BlblN0cmF0ZWd5LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUVkaXRvck9wZW5TdHJhdGVneSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQotICAgICAqLwotICAgIHB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotICAgICAgICByZXR1cm4gbmV3IENsYXNzW10geyBJRWRpdG9yT3BlblN0cmF0ZWd5LmNsYXNzIH07Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Nb2RlbFByb3ZpZGVyQmFzZWRFZGl0b3JPcGVuU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvTW9kZWxQcm92aWRlckJhc2VkRWRpdG9yT3BlblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MzVlNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Nb2RlbFByb3ZpZGVyQmFzZWRFZGl0b3JPcGVuU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFwcGluZy5Nb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5pZGUuSUVkaXRvck9wZW5TdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5pZGUuT3BlbldpdGhJbmZvOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxQcm92aWRlckJhc2VkRWRpdG9yT3BlblN0cmF0ZWd5IGltcGxlbWVudHMKLQkJSUVkaXRvck9wZW5TdHJhdGVneSB7Ci0KLQlwdWJsaWMgT3BlbldpdGhJbmZvIGdldE9wZW5XaXRoSW5mbyhPYmplY3QgZWxlbWVudCkgewotCQlPcGVuV2l0aEluZm8gcmVzdWx0ID0gbmV3IE9wZW5XaXRoSW5mbygpOwotCQlSZXNvdXJjZU1hcHBpbmcgbWFwcGluZyA9IFJlc291cmNlVXRpbC5nZXRSZXNvdXJjZU1hcHBpbmcoZWxlbWVudCk7Ci0JCXRyeSB7Ci0JCQlib29sZWFuIGFueUZvdW5kID0gZmFsc2U7Ci0JCQlNb2RlbFByb3ZpZGVyW10gcHJvdmlkZXJzID0gTW9kZWxQcm92aWRlclV0aWwuZ2V0TW9kZWxQcm92aWRlcnNGb3IobWFwcGluZyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3ZpZGVycy5sZW5ndGg7IGkrKykgewotCQkJCU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBwcm92aWRlcnNbaV07Ci0JCQkJSUVkaXRvck9wZW5TdHJhdGVneSBvcGVuU3RyYXRlZ3kgPSAoSUVkaXRvck9wZW5TdHJhdGVneSkgUmVzb3VyY2VVdGlsLmdldEFkYXB0ZXIocHJvdmlkZXIsIElFZGl0b3JPcGVuU3RyYXRlZ3kuY2xhc3MsIHRydWUpOwotCQkJCWlmIChvcGVuU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJCQlPcGVuV2l0aEluZm8gaW5mbyA9IG9wZW5TdHJhdGVneS5nZXRPcGVuV2l0aEluZm8oZWxlbWVudCk7Ci0JCQkJCXJlc3VsdCA9IHJlc3VsdC5tZXJnZVdpdGgoaW5mbyk7Ci0JCQkJCWFueUZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBUT0RPOiBUaGUgZm9sbG93aW5nIGlzIGp1c3QgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIG1vZGVsIHByb3ZpZGVycyBhbmQvb3IgdGhlIGNvcnJlc3BvbmRpbmcKLQkJCS8vIG9wZW4gc3RyYXRlZ2llcyBjYW5ub3QgYmUgZm91bmQgZHVlIHRvIGFuIGVycm9yIGluIHRoZSBjb25maWd1cmF0aW9uLiAgSXQgbWF5IG5vdCBiZSBuZWVkZWQuCi0JCQlpZiAoIWFueUZvdW5kKSB7Ci0JCQkJT3BlbldpdGhJbmZvIGluZm8gPSBuZXcgUmVzb3VyY2VFZGl0b3JPcGVuU3RyYXRlZ3koKS5nZXRPcGVuV2l0aEluZm8oZWxlbWVudCk7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0Lm1lcmdlV2l0aChpbmZvKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlJREVXb3JrYmVuY2hQbHVnaW4ubG9nKGdldENsYXNzKCksICJnZXRPcGVuV2l0aEluZm8iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL01vZGVsUHJvdmlkZXJVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL01vZGVsUHJvdmlkZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Y2QzNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Nb2RlbFByb3ZpZGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLklNb2RlbFByb3ZpZGVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLk1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFwcGluZy5SZXNvdXJjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdXRpbGl0eSBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggbW9kZWwgcHJvdmlkZXJzLgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNb2RlbFByb3ZpZGVyVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGVsUHJvdmlkZXJbXSBnZXRNb2RlbFByb3ZpZGVyc0ZvcihSZXNvdXJjZU1hcHBpbmcgbWFwcGluZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPOiBhY3R1YWxseSBmaWx0ZXIsIGFuZCBkbyBhIHRvcG9sb2dpY2FsIHNvcnQKLQkJSU1vZGVsUHJvdmlkZXJEZXNjcmlwdG9yW10gZGVzY3MgPSBNb2RlbFByb3ZpZGVyLmdldE1vZGVsUHJvdmlkZXJEZXNjcmlwdG9ycygpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoZGVzY3MubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcy5sZW5ndGg7IGkrKykgewotCQkJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IGRlc2NzW2ldLmdldE1vZGVsUHJvdmlkZXIoKTsKLQkJCXJlc3VsdC5hZGQocHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiAoTW9kZWxQcm92aWRlcltdKSByZXN1bHQudG9BcnJheShuZXcgTW9kZWxQcm92aWRlcltyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Qcm9qZWN0UGVyc2lzdGVudFByb3BlcnR5VGVzdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1Byb2plY3RQZXJzaXN0ZW50UHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyMTQ1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1Byb2plY3RQZXJzaXN0ZW50UHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFwcGluZy5SZXNvdXJjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUmVzb3VyY2VBY3Rpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiBQcm9wZXJ0eSB0ZXN0ZXIgZm9yIGRldGVjdGluZyB0aGUgZXhpc2l0YW5jZSBvZiBhIHBhcnRpY3VsYXIgcGVyc2l0ZW50Ci0gKiBwcm9wZXJ0eSBvbiBhbGwgdGhlIHByb2plY3RzIG9mIGEgUmVzb3VyY2VNYXBwaW5nLgotICoKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RQZXJzaXN0ZW50UHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTE9XX1VOU0VUX1BST0pFQ1RTID0gImFsbG93VW5zZXRQcm9qZWN0cyI7ICAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUFjdGlvbkZpbHRlciBmaWx0ZXIgPSBuZXcgV29ya2JlbmNoUmVzb3VyY2UoKSB7Ci0gICAgICAgIAotICAgIAkvKiAobm9uLUphdmFkb2MpCi0gICAgCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsLldvcmtiZW5jaFJlc291cmNlI2dldEJhc2VJbWFnZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UpCi0gICAgCSAqLwotICAgIAlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldEJhc2VJbWFnZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSVByb3BlcnR5VGVzdGVyI3Rlc3QoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0gICAgICAgIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIFJlc291cmNlTWFwcGluZykgewotICAgICAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhJUmVzb3VyY2VBY3Rpb25GaWx0ZXIuUFJPSkVDVF9QRVJTSVNURU5UX1BST1BFUlRZKSkgewotICAgICAgICAgICAgICAgIGlmKGFyZ3MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIFN0cmluZyBwZXJzaXRlbnRQcm9wZXJ0eUVudHJ5ID0gKFN0cmluZylhcmdzWzBdOwotCSAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dVbnNldFByb2plY3RzID0gZmFsc2U7Ci0JICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkKLQkgICAgICAgICAgICAgICAgYWxsb3dVbnNldFByb2plY3RzID0gYXJnc1sxXS5lcXVhbHMoQUxMT1dfVU5TRVRfUFJPSkVDVFMpOwotCSAgICAgICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSAoKFJlc291cmNlTWFwcGluZylyZWNlaXZlcikuZ2V0UHJvamVjdHMoKTsKLQkgICAgICAgICAgICBib29sZWFuIGF0TGVhc3RPbmUgPSBmYWxzZTsKLQkgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkgICAgICAgICAgICAgICAgaWYgKGZpbHRlci50ZXN0QXR0cmlidXRlKHByb2plY3QsIHByb3BlcnR5LCBwZXJzaXRlbnRQcm9wZXJ0eUVudHJ5KSkgewotCSAgICAgICAgICAgICAgICAgICAgYXRMZWFzdE9uZSA9IHRydWU7Ci0JICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFsbG93VW5zZXRQcm9qZWN0cykgewotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBwZXJzaXN0YW50IHByb3BlcnR5IGlzIHByZXNlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzLCB3ZSBmYWlsIHNpbmNlIGl0IG11c3QgYmUgc2V0IHRvIHNvbWV0aGluZ3MgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkgJiYgcHJvamVjdC5nZXRQZXJzaXN0ZW50UHJvcGVydHkoZ2V0UHJvcGVydHlLZXkocGVyc2l0ZW50UHJvcGVydHlFbnRyeSkpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkNvcmUgZXhjZXB0aW9uIHdoaWxlIHRlc3RpbmcgcHJvamVjdCBwZXJzaXN0ZW50IHByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5sb2cobWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgcmV0dXJuIGF0TGVhc3RPbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSVJlc291cmNlQWN0aW9uRmlsdGVyLlBST0pFQ1RfUEVSU0lTVEVOVF9QUk9QRVJUWSkpIHsKLSAgICAgICAgICAgICAgICBpZihhcmdzID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGVyc2l0ZW50UHJvcGVydHlFbnRyeSA9IChTdHJpbmcpYXJnc1swXTsKLSAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKChJUmVzb3VyY2UpcmVjZWl2ZXIpLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyLnRlc3RBdHRyaWJ1dGUocHJvamVjdCwgcHJvcGVydHksIHBlcnNpdGVudFByb3BlcnR5RW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBRdWFsaWZpZWROYW1lIGdldFByb3BlcnR5S2V5KFN0cmluZyB2YWx1ZSkgewotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lOwotICAgICAgICBpbnQgaSA9IHZhbHVlLmluZGV4T2YoJz0nKTsKLSAgICAgICAgaWYgKGkgIT0gLTEpIHsKLSAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IHZhbHVlLnN1YnN0cmluZygwLCBpKS50cmltKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSB2YWx1ZS50cmltKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUXVhbGlmaWVkTmFtZSBrZXk7Ci0gICAgICAgIGludCBkb3QgPSBwcm9wZXJ0eU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgaWYgKGRvdCAhPSAtMSkgewotICAgICAgICAgICAga2V5ID0gbmV3IFF1YWxpZmllZE5hbWUocHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCBkb3QpLAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKGRvdCArIDEpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGtleSA9IG5ldyBRdWFsaWZpZWROYW1lKG51bGwsIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvUmVzb3VyY2VFZGl0b3JPcGVuU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvUmVzb3VyY2VFZGl0b3JPcGVuU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhNGE2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1Jlc291cmNlRWRpdG9yT3BlblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuaWRlLklFZGl0b3JPcGVuU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuaWRlLk9wZW5XaXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuaWRlLk9wZW5XaXRoSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBUaGUgSURFJ3MgZWRpdG9yIG9wZW4gc3RyYXRlZ3kgZm9yIHJlc291cmNlcy4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VFZGl0b3JPcGVuU3RyYXRlZ3kgaW1wbGVtZW50cyBJRWRpdG9yT3BlblN0cmF0ZWd5IHsKLQotCXByaXZhdGUgSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0KLQlwdWJsaWMgUmVzb3VyY2VFZGl0b3JPcGVuU3RyYXRlZ3koKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgT3BlbldpdGhJbmZvIGdldE9wZW5XaXRoSW5mbyhPYmplY3QgZWxlbWVudCkgewotCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VVdGlsLmdldEZpbGUoZWxlbWVudCk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUhhc2hTZXQgYWxyZWFkeU1hcHBlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlFZGl0b3JEZXNjcmlwdG9yW10gZWRpdG9ycyA9IHJlZ2lzdHJ5LmdldEVkaXRvcnMoZmlsZS5nZXROYW1lKCksIElERQotCQkJCS5nZXRDb250ZW50VHlwZShmaWxlKSk7Ci0JCUlFZGl0b3JEZXNjcmlwdG9yIHByZWZlcnJlZEVkaXRvciA9IElERS5nZXREZWZhdWx0RWRpdG9yKGZpbGUpOwotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KGVkaXRvcnMubGVuZ3RoKTsKLQkJT3BlbldpdGhFbnRyeSBwcmVmZXJyZWRFbnRyeSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9ycy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yID0gZWRpdG9yc1tpXTsKLQkJCWlmIChhbHJlYWR5TWFwcGVkLmNvbnRhaW5zKGVkaXRvcikpCi0JCQkJY29udGludWU7Ci0JCQlhbHJlYWR5TWFwcGVkLmFkZChlZGl0b3IpOwotCQkJT3BlbldpdGhFbnRyeSBlbnRyeSA9IG5ldyBGaWxlT3BlbldpdGhFbnRyeShlZGl0b3IsIGZpbGUpOwotCQkJZW50cmllcy5hZGQoZW50cnkpOwotCQkJaWYgKGVkaXRvci5lcXVhbHMocHJlZmVycmVkRWRpdG9yKSkgewotCQkJCXByZWZlcnJlZEVudHJ5ID0gZW50cnk7Ci0JCQl9Ci0JCX0KLQkJT3BlbldpdGhFbnRyeSBleHRlcm5hbEVudHJ5ID0gbnVsbDsKLS8vCQlpZiAocmVnaXN0cnkuaXNTeXN0ZW1FeHRlcm5hbEVkaXRvckF2YWlsYWJsZShmaWxlLmdldE5hbWUoKSkpIHsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGV4dGVybmFsRWRpdG9yID0gcmVnaXN0cnkuZmluZEVkaXRvcihJRWRpdG9yUmVnaXN0cnkuU1lTVEVNX0VYVEVSTkFMX0VESVRPUl9JRCk7Ci0JCQlleHRlcm5hbEVudHJ5ID0gbmV3IEZpbGVPcGVuV2l0aEVudHJ5KGV4dGVybmFsRWRpdG9yLCBmaWxlKTsKLQkJCWlmIChwcmVmZXJyZWRFbnRyeSA9PSBudWxsICYmIGV4dGVybmFsRWRpdG9yLmVxdWFscyhwcmVmZXJyZWRFZGl0b3IpKSB7Ci0JCQkJcHJlZmVycmVkRW50cnkgPSBleHRlcm5hbEVudHJ5OwotCQkJfQotLy8JCX0KLQkJT3BlbldpdGhFbnRyeSBpblBsYWNlRW50cnkgPSBudWxsOwotCQlpZiAocmVnaXN0cnkuaXNTeXN0ZW1JblBsYWNlRWRpdG9yQXZhaWxhYmxlKGZpbGUuZ2V0TmFtZSgpKSkgewotCQkJSUVkaXRvckRlc2NyaXB0b3IgaW5QbGFjZUVkaXRvciA9IHJlZ2lzdHJ5Ci0JCQkJCS5maW5kRWRpdG9yKElFZGl0b3JSZWdpc3RyeS5TWVNURU1fSU5QTEFDRV9FRElUT1JfSUQpOwotCQkJaW5QbGFjZUVudHJ5ID0gbmV3IEZpbGVPcGVuV2l0aEVudHJ5KGluUGxhY2VFZGl0b3IsIGZpbGUpOwotCQkJaWYgKHByZWZlcnJlZEVudHJ5ID09IG51bGwgJiYgaW5QbGFjZUVudHJ5LmVxdWFscyhwcmVmZXJyZWRFZGl0b3IpKSB7Ci0JCQkJcHJlZmVycmVkRW50cnkgPSBleHRlcm5hbEVudHJ5OwotCQkJfQotCQl9Ci0JCU9wZW5XaXRoRW50cnkgZGVmYXVsdEVudHJ5ID0gbmV3IE9wZW5XaXRoRW50cnkobnVsbCwgZmlsZSkgewotCQkJcHVibGljIHZvaWQgb3BlbkVkaXRvcihJV29ya2JlbmNoUGFnZSBwYWdlLAotCQkJCQlib29sZWFuIGFjdGl2YXRlLCBpbnQgbWF0Y2hGbGFncywgYm9vbGVhbiByZW1lbWJlckVkaXRvcikKLQkJCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJCQlJRmlsZSBmID0gKElGaWxlKSBnZXRFbGVtZW50KCk7Ci0JCQkJSURFLnNldERlZmF1bHRFZGl0b3IoZiwgbnVsbCk7Ci0JCQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzYyA9IElERS5nZXRFZGl0b3JEZXNjcmlwdG9yKGYpOwotCQkJCXBhZ2Uub3BlbkVkaXRvcigKLQkJCQkJCW5ldyBGaWxlRWRpdG9ySW5wdXQoZiksIGRlc2MuZ2V0SWQoKSwgYWN0aXZhdGUsCi0JCQkJCQltYXRjaEZsYWdzKTsKLQkJCX0KLQkJfTsKLQkJSUVkaXRvckRlc2NyaXB0b3IgdGV4dEVkaXRvciA9IHJlZ2lzdHJ5Ci0JCQkuZmluZEVkaXRvcihJREVXb3JrYmVuY2hQbHVnaW4uREVGQVVMVF9URVhUX0VESVRPUl9JRCk7IC8vIG1heSBiZSBudWxsCi0JCWlmICghYWxyZWFkeU1hcHBlZC5jb250YWlucyh0ZXh0RWRpdG9yKSkgewotCQkJT3BlbldpdGhFbnRyeSB0ZXh0RWRpdG9yRW50cnkgPSBuZXcgRmlsZU9wZW5XaXRoRW50cnkodGV4dEVkaXRvciwgZmlsZSk7Ci0JCQllbnRyaWVzLmFkZCh0ZXh0RWRpdG9yRW50cnkpOwotCQkJaWYgKHByZWZlcnJlZEVudHJ5ID09IG51bGwpIHsKLQkJCQlwcmVmZXJyZWRFbnRyeSA9IHRleHRFZGl0b3JFbnRyeTsKLQkJCX0KLQkJfQotCQlPcGVuV2l0aEVudHJ5W10gZW50cnlBcnJheSA9IChPcGVuV2l0aEVudHJ5W10pIGVudHJpZXMudG9BcnJheShuZXcgT3BlbldpdGhFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotCQlyZXR1cm4gbmV3IE9wZW5XaXRoSW5mbyhlbnRyeUFycmF5LCBwcmVmZXJyZWRFbnRyeSwgZXh0ZXJuYWxFbnRyeSwKLQkJCQlpblBsYWNlRW50cnksIGRlZmF1bHRFbnRyeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1Jlc291cmNlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9SZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRlZmM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1Jlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotCi0vKioKLSAqIFRoZSBSZXNvdXJjZUZhY3RvcnkgaXMgdXNlZCB0byBzYXZlIGFuZCByZWNyZWF0ZSBhbiBJUmVzb3VyY2Ugb2JqZWN0LgotICogQXMgc3VjaCwgaXQgaW1wbGVtZW50cyB0aGUgSVBlcnNpc3RhYmxlRWxlbWVudCBpbnRlcmZhY2UgZm9yIHN0b3JhZ2UKLSAqIGFuZCB0aGUgSUVsZW1lbnRGYWN0b3J5IGludGVyZmFjZSBmb3IgcmVjcmVhdGlvbi4KLSAqCi0gKiBAc2VlIElNZW1lbnRvCi0gKiBAc2VlIElQZXJzaXN0YWJsZUVsZW1lbnQKLSAqIEBzZWUgSUVsZW1lbnRGYWN0b3J5Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUZhY3RvcnkgaW1wbGVtZW50cyBJRWxlbWVudEZhY3RvcnksIElQZXJzaXN0YWJsZUVsZW1lbnQgewotCi0gICAgLy8gVGhlc2UgcGVyc2lzdGVuY2UgY29uc3RhbnRzIGFyZSBzdG9yZWQgaW4gWE1MLiAgRG8gbm90Ci0gICAgLy8gY2hhbmdlIHRoZW0uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QQVRIID0gInBhdGgiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRSA9ICJ0eXBlIjsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDVE9SWV9JRCA9ICJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkiOy8vJE5PTi1OTFMtMSQKLQotICAgIC8vIElQZXJzaXN0YWJsZSBkYXRhLgotICAgIHByaXZhdGUgSVJlc291cmNlIHJlczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFJlc291cmNlRmFjdG9yeS4gIFRoaXMgY29uc3RydWN0b3IgaXMgdHlwaWNhbGx5IHVzZWQKLSAgICAgKiBmb3Igb3VyIElFbGVtZW50RmFjdG9yeSBzaWRlLgotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgUmVzb3VyY2VGYWN0b3J5LiAgVGhpcyBjb25zdHJ1Y3RvciBpcyB0eXBpY2FsbHkgdXNlZAotICAgICAqIGZvciBvdXIgSVBlcnNpc3RhYmxlRWxlbWVudCBzaWRlLgotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUZhY3RvcnkoSVJlc291cmNlIGlucHV0KSB7Ci0gICAgICAgIHJlcyA9IGlucHV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUVsZW1lbnRGYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIElBZGFwdGFibGUgY3JlYXRlRWxlbWVudChJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIC8vIEdldCB0aGUgZmlsZSBuYW1lLgotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfUEFUSCk7Ci0gICAgICAgIGlmIChmaWxlTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIFN0cmluZyB0eXBlID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX1RZUEUpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBPbGQgZm9ybWF0IG1lbWVudG8uIENyZWF0ZSBhbiBJUmVzb3VyY2UgdXNpbmcgZmluZE1lbWJlci4gCi0gICAgICAgICAgICAvLyBXaWxsIHJldHVybiBudWxsIGZvciByZXNvdXJjZXMgaW4gY2xvc2VkIHByb2plY3RzLgotICAgICAgICAgICAgcmVzID0gcm9vdC5maW5kTWVtYmVyKG5ldyBQYXRoKGZpbGVOYW1lKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgcmVzb3VyY2VUeXBlID0gSW50ZWdlci5wYXJzZUludCh0eXBlKTsKLQotICAgICAgICAgICAgaWYgKHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuUk9PVCkKLSAgICAgICAgICAgICAgICByZXMgPSByb290OwotICAgICAgICAgICAgZWxzZSBpZiAocmVzb3VyY2VUeXBlID09IElSZXNvdXJjZS5QUk9KRUNUKQotICAgICAgICAgICAgICAgIHJlcyA9IHJvb3QuZ2V0UHJvamVjdChmaWxlTmFtZSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXNvdXJjZVR5cGUgPT0gSVJlc291cmNlLkZPTERFUikKLSAgICAgICAgICAgICAgICByZXMgPSByb290LmdldEZvbGRlcihuZXcgUGF0aChmaWxlTmFtZSkpOwotICAgICAgICAgICAgZWxzZSBpZiAocmVzb3VyY2VUeXBlID09IElSZXNvdXJjZS5GSUxFKQotICAgICAgICAgICAgICAgIHJlcyA9IHJvb3QuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUGVyc2lzdGFibGVFbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0gICAgICAgIHJldHVybiBGQUNUT1JZX0lEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVBlcnNpc3RhYmxlRWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIG1lbWVudG8ucHV0U3RyaW5nKFRBR19QQVRILCByZXMuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLSAgICAgICAgbWVtZW50by5wdXRTdHJpbmcoVEFHX1RZUEUsIEludGVnZXIudG9TdHJpbmcocmVzLmdldFR5cGUoKSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvU3RhbmRhcmRQcm9wZXJ0aWVzQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvU3RhbmRhcmRQcm9wZXJ0aWVzQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjNDk0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1N0YW5kYXJkUHJvcGVydGllc0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5GaWxlUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5SZXNvdXJjZVByb3BlcnR5U291cmNlOwotCi0vKioKLSAqIERpc3BlbnNlcyBhbiA8Y29kZT5JUHJvcGVydHlTb3VyY2U8L2NvZGU+IGFkYXB0ZXIgZm9yIHRoZSBjb3JlIHJlc291cmNlIG9iamVjdHMuCi0gKi8KLS8qIHBhY2thZ2UgKi9jbGFzcyBTdGFuZGFyZFByb3BlcnRpZXNBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWRhcHRlckZhY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBvLCBDbGFzcyBhZGFwdGVyVHlwZSkgewotICAgICAgICBpZiAoYWRhcHRlclR5cGUuaXNJbnN0YW5jZShvKSkgewotICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFkYXB0ZXJUeXBlID09IElQcm9wZXJ0eVNvdXJjZS5jbGFzcykgewotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBvOwotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZVByb3BlcnR5U291cmNlKChJRmlsZSkgbyk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlUHJvcGVydHlTb3VyY2UoKElSZXNvdXJjZSkgbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWRhcHRlckZhY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2xhc3NbXSB7IElQcm9wZXJ0eVNvdXJjZS5jbGFzcyB9OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvV29ya2JlbmNoQWRhcHRlckJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvV29ya2JlbmNoQWRhcHRlckJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzYTU4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaEFkYXB0ZXJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBSZWdpc3RlcnMgdGhlIGFkYXB0ZXJzIG9uIGNvcmUgY29uc3RydWN0cwotICogdXNlZCBpbiB0aGUgd29ya2JlbmNoIFVJLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV29ya2JlbmNoQWRhcHRlckJ1aWxkZXIgewotICAgIC8qKgotICAgICAqIENyZWF0ZXMgZXh0ZW5kZXJzIGFuZCByZWdpc3RlcnMgCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQWRhcHRlcnMoKSB7Ci0gICAgICAgIElBZGFwdGVyTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKTsKLSAgICAgICAgSUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgV29ya2JlbmNoQWRhcHRlckZhY3RvcnkoKTsKLSAgICAgICAgbWFuYWdlci5yZWdpc3RlckFkYXB0ZXJzKGZhY3RvcnksIElXb3Jrc3BhY2UuY2xhc3MpOwotICAgICAgICBtYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMoZmFjdG9yeSwgSVdvcmtzcGFjZVJvb3QuY2xhc3MpOwotICAgICAgICBtYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMoZmFjdG9yeSwgSVByb2plY3QuY2xhc3MpOwotICAgICAgICBtYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMoZmFjdG9yeSwgSUZvbGRlci5jbGFzcyk7Ci0gICAgICAgIG1hbmFnZXIucmVnaXN0ZXJBZGFwdGVycyhmYWN0b3J5LCBJRmlsZS5jbGFzcyk7Ci0gICAgICAgIG1hbmFnZXIucmVnaXN0ZXJBZGFwdGVycyhmYWN0b3J5LCBJTWFya2VyLmNsYXNzKTsKLQotICAgICAgICAvLyBwcm9wZXJ0aWVzIGFkYXB0ZXJzCi0gICAgICAgIElBZGFwdGVyRmFjdG9yeSBwYUZhY3RvcnkgPSBuZXcgU3RhbmRhcmRQcm9wZXJ0aWVzQWRhcHRlckZhY3RvcnkoKTsKLSAgICAgICAgbWFuYWdlci5yZWdpc3RlckFkYXB0ZXJzKHBhRmFjdG9yeSwgSVdvcmtzcGFjZS5jbGFzcyk7Ci0gICAgICAgIG1hbmFnZXIucmVnaXN0ZXJBZGFwdGVycyhwYUZhY3RvcnksIElXb3Jrc3BhY2VSb290LmNsYXNzKTsKLSAgICAgICAgbWFuYWdlci5yZWdpc3RlckFkYXB0ZXJzKHBhRmFjdG9yeSwgSVByb2plY3QuY2xhc3MpOwotICAgICAgICBtYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMocGFGYWN0b3J5LCBJRm9sZGVyLmNsYXNzKTsKLSAgICAgICAgbWFuYWdlci5yZWdpc3RlckFkYXB0ZXJzKHBhRmFjdG9yeSwgSUZpbGUuY2xhc3MpOwotICAgICAgICBtYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMocGFGYWN0b3J5LCBJTWFya2VyLmNsYXNzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNmM2MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Xb3JrYmVuY2hBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogRGlzcGVuc2VzIGFkYXB0ZXJzIGZvciB2YXJpb3VzIGNvcmUgb2JqZWN0cy4KLSAqIFJldHVybnMgSVdvcmtiZW5jaEFkYXB0ZXIgYWRhcHRlcnMsIHVzZWQgZm9yIGRpc3BsYXlpbmcsCi0gKiBuYXZpZ2F0aW5nLCBhbmQgcG9wdWxhdGluZyBtZW51cyBmb3IgY29yZSBvYmplY3RzLgotICovCi1jbGFzcyBXb3JrYmVuY2hBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBPYmplY3Qgd29ya3NwYWNlQWRhcHRlciA9IG5ldyBXb3JrYmVuY2hXb3Jrc3BhY2UoKTsKLQotICAgIHByaXZhdGUgT2JqZWN0IHJvb3RBZGFwdGVyID0gbmV3IFdvcmtiZW5jaFJvb3RSZXNvdXJjZSgpOwotCi0gICAgcHJpdmF0ZSBPYmplY3QgcHJvamVjdEFkYXB0ZXIgPSBuZXcgV29ya2JlbmNoUHJvamVjdCgpOwotCi0gICAgcHJpdmF0ZSBPYmplY3QgZm9sZGVyQWRhcHRlciA9IG5ldyBXb3JrYmVuY2hGb2xkZXIoKTsKLQotICAgIHByaXZhdGUgT2JqZWN0IGZpbGVBZGFwdGVyID0gbmV3IFdvcmtiZW5jaEZpbGUoKTsKLQotICAgIHByaXZhdGUgT2JqZWN0IG1hcmtlckFkYXB0ZXIgPSBuZXcgV29ya2JlbmNoTWFya2VyKCk7Ci0KLSAgICBwcml2YXRlIE9iamVjdCByZXNvdXJjZUZhY3RvcnkgPSBuZXcgUmVzb3VyY2VGYWN0b3J5KCk7Ci0KLSAgICBwcml2YXRlIE9iamVjdCB3b3Jrc3BhY2VGYWN0b3J5ID0gbmV3IFdvcmtzcGFjZUZhY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIElBY3Rpb25GaWx0ZXIgZm9yIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldEFjdGlvbkZpbHRlcihPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgc3dpdGNoICgoKElSZXNvdXJjZSkgbykuZ2V0VHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIElSZXNvdXJjZS5GSUxFOgotICAgICAgICAgICAgICAgIHJldHVybiBmaWxlQWRhcHRlcjsKLSAgICAgICAgICAgIGNhc2UgSVJlc291cmNlLkZPTERFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZm9sZGVyQWRhcHRlcjsKLSAgICAgICAgICAgIGNhc2UgSVJlc291cmNlLlBST0pFQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2plY3RBZGFwdGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgSU1hcmtlcikgewotICAgICAgICAgICAgcmV0dXJuIG1hcmtlckFkYXB0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzCi0gICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAgKiBubyBzdWNoIG9iamVjdCBjYW4gYmUgZm91bmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRhYmxlT2JqZWN0IHRoZSBhZGFwdGFibGUgb2JqZWN0IGJlaW5nIHF1ZXJpZWQKLSAgICAgKiAgICh1c3VhbGx5IGFuIGluc3RhbmNlIG9mIDxjb2RlPklBZGFwdGFibGU8L2NvZGU+KQotICAgICAqIEBwYXJhbSBhZGFwdGVyVHlwZSB0aGUgdHlwZSBvZiBhZGFwdGVyIHRvIGxvb2sgdXAKLSAgICAgKiBAcmV0dXJuIGEgb2JqZWN0IGNhc3RhYmxlIHRvIHRoZSBnaXZlbiBhZGFwdGVyIHR5cGUsIAotICAgICAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgYWRhcHRlciBwcm92aWRlciAKLSAgICAgKiAgICBkb2VzIG5vdCBoYXZlIGFuIGFkYXB0ZXIgb2YgdGhlIGdpdmVuIHR5cGUgZm9yIHRoZQotICAgICAqICAgIGdpdmVuIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgbywgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLSAgICAgICAgaWYgKGFkYXB0ZXJUeXBlLmlzSW5zdGFuY2UobykpIHsKLSAgICAgICAgICAgIHJldHVybiBvOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZGFwdGVyVHlwZSA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIGdldFdvcmtiZW5jaEVsZW1lbnQobyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFkYXB0ZXJUeXBlID09IElQZXJzaXN0YWJsZUVsZW1lbnQuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQZXJzaXN0YWJsZUVsZW1lbnQobyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFkYXB0ZXJUeXBlID09IElFbGVtZW50RmFjdG9yeS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRGYWN0b3J5KG8pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZGFwdGVyVHlwZSA9PSBJQWN0aW9uRmlsdGVyLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QWN0aW9uRmlsdGVyKG8pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZGFwdGVyVHlwZSA9PSBJVW5kb0NvbnRleHQuY2xhc3MpIHsKLSAgICAgICAgCXJldHVybiBnZXRVbmRvQ29udGV4dChvKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIGFkYXBhdGVyIHR5cGVzIGhhbmRsZWQgYnkgdGhpcwotICAgICAqIHByb3ZpZGVyLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGdlbmVyYWxseSB1c2VkIGJ5IGFuIGFkYXB0ZXIgbWFuYWdlcgotICAgICAqIHRvIGRpc2NvdmVyIHdoaWNoIGFkYXB0ZXIgdHlwZXMgYXJlIHN1cHBvcnRlZCwgaW4gYWRhdmFuY2UKLSAgICAgKiBvZiBkaXNwYXRjaGluZyBhbnkgYWN0dWFsIDxjb2RlPmdldEFkYXB0ZXI8L2NvZGU+IHJlcXVlc3RzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgYWRhcHRlciB0eXBlcwotICAgICAqLwotICAgIHB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotICAgICAgICByZXR1cm4gbmV3IENsYXNzW10geyBJV29ya2JlbmNoQWRhcHRlci5jbGFzcywgSUVsZW1lbnRGYWN0b3J5LmNsYXNzLAotICAgICAgICAgICAgICAgIElQZXJzaXN0YWJsZUVsZW1lbnQuY2xhc3MsIElBY3Rpb25GaWx0ZXIuY2xhc3MsIElVbmRvQ29udGV4dC5jbGFzcyB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIElFbGVtZW50RmFjdG9yeQotICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0gICAgICogbm8gc3VjaCBvYmplY3QgY2FuIGJlIGZvdW5kLgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudEZhY3RvcnkoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUZhY3Rvcnk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJV29ya3NwYWNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRmFjdG9yeTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiBJUGVyc2lzdGFibGVFbGVtZW50Ci0gICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAgKiBubyBzdWNoIG9iamVjdCBjYW4gYmUgZm91bmQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRQZXJzaXN0YWJsZUVsZW1lbnQoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VGYWN0b3J5KChJUmVzb3VyY2UpIG8pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVdvcmtzcGFjZSkgewotICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZUZhY3Rvcnk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgSVdvcmtiZW5jaEFkYXB0ZXIKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iamVjdC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqIG5vIHN1Y2ggb2JqZWN0IGNhbiBiZSBmb3VuZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFdvcmtiZW5jaEVsZW1lbnQoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoKChJUmVzb3VyY2UpIG8pLmdldFR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2UuRklMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUFkYXB0ZXI7Ci0gICAgICAgICAgICBjYXNlIElSZXNvdXJjZS5GT0xERVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvbGRlckFkYXB0ZXI7Ci0gICAgICAgICAgICBjYXNlIElSZXNvdXJjZS5QUk9KRUNUOgotICAgICAgICAgICAgICAgIHJldHVybiBwcm9qZWN0QWRhcHRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSB7Ci0gICAgICAgICAgICByZXR1cm4gcm9vdEFkYXB0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJV29ya3NwYWNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlQWRhcHRlcjsKLSAgICAgICAgfQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXJrZXJBZGFwdGVyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJVW5kb0NvbnRleHQgZm9yIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFVuZG9Db250ZXh0KE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVdvcmtzcGFjZSkgewotICAgICAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0T3BlcmF0aW9uU3VwcG9ydCgpLmdldFVuZG9Db250ZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Xb3JrYmVuY2hGaWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2MjkyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaEZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBBbiBJV29ya2JlbmNoQWRhcHRlciB0aGF0IHJlcHJlc2VudHMgSUZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoRmlsZSBleHRlbmRzIFdvcmtiZW5jaFJlc291cmNlIHsKLSAgICAvKioKLSAgICAgKglBbnN3ZXIgdGhlIGFwcHJvcHJpYXRlIGJhc2UgaW1hZ2UgdG8gdXNlIGZvciB0aGUgcGFzc2VkIHJlc291cmNlLCBvcHRpb25hbGx5Ci0gICAgICoJY29uc2lkZXJpbmcgdGhlIHBhc3NlZCBvcGVuIHN0YXR1cyBhcyB3ZWxsIGlmZiBhcHByb3ByaWF0ZSBmb3IgdGhlIHR5cGUgb2YKLSAgICAgKglwYXNzZWQgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldEJhc2VJbWFnZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gbnVsbDsKLQkJLy8gZG8gd2UgbmVlZCB0byB3b3JyeSBhYm91dCBjaGVja2luZyBoZXJlPwotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJY29udGVudFR5cGUgPSBJREUuZ3Vlc3NDb250ZW50VHlwZSgoSUZpbGUpcmVzb3VyY2UpOwotCQl9Ci0gICAgICAgIC8vIEBpc3N1ZSBtb3ZlIElERSBzcGVjaWZpYyBpbWFnZXMKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZS5nZXROYW1lKCksIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgaWYgKGltYWdlID09IG51bGwpCi0gICAgICAgICAgICBpbWFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19PQkpfRklMRSk7Ci0gICAgICAgIHJldHVybiBpbWFnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaEZvbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Xb3JrYmVuY2hGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxNDgxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaEZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQW4gSVdvcmtiZW5jaEFkYXB0ZXIgdGhhdCByZXByZXNlbnRzIElGb2xkZXJzLgotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoRm9sZGVyIGV4dGVuZHMgV29ya2JlbmNoUmVzb3VyY2UgewotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgYXBwcm9wcmlhdGUgYmFzZSBpbWFnZSB0byB1c2UgZm9yIHRoZSBwYXNzZWQgcmVzb3VyY2UsIG9wdGlvbmFsbHkKLSAgICAgKgljb25zaWRlcmluZyB0aGUgcGFzc2VkIG9wZW4gc3RhdHVzIGFzIHdlbGwgaWZmIGFwcHJvcHJpYXRlIGZvciB0aGUgdHlwZSBvZgotICAgICAqCXBhc3NlZCByZXNvdXJjZQotICAgICAqLwotICAgIHByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0QmFzZUltYWdlKElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hpbGRyZW4gb2YgdGhpcyBjb250YWluZXIuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKChJQ29udGFpbmVyKSBvKS5tZW1iZXJzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIE5PX0NISUxEUkVOOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Xb3JrYmVuY2hNYXJrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvV29ya2JlbmNoTWFya2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0Nzg2YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Xb3JrYmVuY2hNYXJrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlckFjdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNpbXBsZVdpbGRjYXJkVGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlcjsKLQotLyoqCi0gKiBNb2RlbCBvYmplY3QgZm9yIGFkYXB0aW5nIElNYXJrZXIgb2JqZWN0cyB0byB0aGUgSVdvcmtiZW5jaEFkYXB0ZXIKLSAqIGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtiZW5jaE1hcmtlciBleHRlbmRzIFdvcmtiZW5jaEFkYXB0ZXIgaW1wbGVtZW50cwotICAgICAgICBJTWFya2VyQWN0aW9uRmlsdGVyIHsKLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3QgbykgewotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSU1hcmtlcikpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TWFya2VySW1hZ2VQcm92aWRlclJlZ2lzdHJ5KCkKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKChJTWFya2VyKSBvKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRMYWJlbChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLSAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgbzsKLSAgICAgICAgcmV0dXJuIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCAiIik7Ly8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiAoKElNYXJrZXIpIG8pLmdldFJlc291cmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpYyBhdHRyaWJ1dGUgbWF0Y2hlcyB0aGUgc3RhdGUgb2YgdGhlIHRhcmdldAotICAgICAqIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCBvYmplY3QKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGF0dHJpdXRlIHZhbHVlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIG1hdGNoZXM7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlKE9iamVjdCB0YXJnZXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgdGFyZ2V0OwotICAgICAgICBpZiAobmFtZS5lcXVhbHMoVFlQRSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmVxdWFscyhtYXJrZXIuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhTVVBFUl9UWVBFKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWFya2VyLmlzU3VidHlwZU9mKHZhbHVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQUklPUklUWSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXN0SW50ZWdlckF0dHJpYnV0ZShtYXJrZXIsIElNYXJrZXIuUFJJT1JJVFksIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhTRVZFUklUWSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXN0SW50ZWdlckF0dHJpYnV0ZShtYXJrZXIsIElNYXJrZXIuU0VWRVJJVFksIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhNRVNTQUdFKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpOwotICAgICAgICAgICAgICAgIGlmIChtc2cgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiBTaW1wbGVXaWxkY2FyZFRlc3Rlci50ZXN0V2lsZGNhcmRJZ25vcmVDYXNlKHZhbHVlLCBtc2cpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKERPTkUpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICBCb29sZWFuIGRvbmUgPSAoQm9vbGVhbikgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkRPTkUpOwotICAgICAgICAgICAgICAgIGlmIChkb25lID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGRvbmUuYm9vbGVhblZhbHVlKCkgPT0gdmFsdWUuZXF1YWxzKCJ0cnVlIikpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhSRVNPVVJDRV9UWVBFKSkgewotICAgICAgICAgICAgaW50IGRlc2lyZWRUeXBlID0gMDsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGVOdW1iZXJGb3JtYXQpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCEoZGVzaXJlZFR5cGUgPT0gSVJlc291cmNlLkZJTEUKLSAgICAgICAgICAgICAgICAgICAgfHwgZGVzaXJlZFR5cGUgPT0gSVJlc291cmNlLkZPTERFUgotICAgICAgICAgICAgICAgICAgICB8fCBkZXNpcmVkVHlwZSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCBkZXNpcmVkVHlwZSA9PSBJUmVzb3VyY2UuUk9PVCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICByZXR1cm4gKG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSAmIGRlc2lyZWRUeXBlKSA+IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWMgaW50ZWdlciBhdHRyaWJ1dGUgbWF0Y2hlcyBhIHZhbHVlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0SW50ZWdlckF0dHJpYnV0ZShJTWFya2VyIG1hcmtlciwgU3RyaW5nIGF0dHJOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIEludGVnZXIgaTEsIGkyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaTEgPSAoSW50ZWdlcikgbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0gICAgICAgICAgICBpZiAoaTEgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpMiA9IEludGVnZXIudmFsdWVPZih2YWx1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGkxLmVxdWFscyhpMik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Xb3JrYmVuY2hQcm9qZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjOWZjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaFByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvamVjdEFjdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5taXNjLk92ZXJsYXlJY29uOwotCi0vKioKLSAqIEFuIElXb3JrYmVuY2hBZGFwdGVyIHRoYXQgcmVwcmVzZW50cyBJUHJvamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtiZW5jaFByb2plY3QgZXh0ZW5kcyBXb3JrYmVuY2hSZXNvdXJjZSBpbXBsZW1lbnRzCi0gICAgICAgIElQcm9qZWN0QWN0aW9uRmlsdGVyIHsKLSAgICBIYXNoTWFwIGltYWdlQ2FjaGUgPSBuZXcgSGFzaE1hcCgxMSk7Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgdGhlIGFwcHJvcHJpYXRlIGJhc2UgaW1hZ2UgdG8gdXNlIGZvciB0aGUgcGFzc2VkIHJlc291cmNlLCBvcHRpb25hbGx5Ci0gICAgICoJY29uc2lkZXJpbmcgdGhlIHBhc3NlZCBvcGVuIHN0YXR1cyBhcyB3ZWxsIGlmZiBhcHByb3ByaWF0ZSBmb3IgdGhlIHR5cGUgb2YKLSAgICAgKglwYXNzZWQgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldEJhc2VJbWFnZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0gICAgICAgIGJvb2xlYW4gaXNPcGVuID0gcHJvamVjdC5pc09wZW4oKTsKLSAgICAgICAgU3RyaW5nIGJhc2VLZXkgPSBpc09wZW4gPyBJREUuU2hhcmVkSW1hZ2VzLklNR19PQkpfUFJPSkVDVAotICAgICAgICAgICAgICAgIDogSURFLlNoYXJlZEltYWdlcy5JTUdfT0JKX1BST0pFQ1RfQ0xPU0VEOwotICAgICAgICBpZiAoaXNPcGVuKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIG5hdHVyZUlkcyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXROYXR1cmVJZHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hdHVyZUlkcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAvLyBIYXZlIHRvIHVzZSBhIGNhY2hlIGJlY2F1c2UgT3ZlcmxheUljb24gZG9lcyBub3QgZGVmaW5lIGl0cyBvd24gZXF1YWxpdHkgY3JpdGVyaWEsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIFdvcmtiZW5jaExhYmVsUHJvdmlkZXIgd291bGQgYWx3YXlzIGNyZWF0ZSBhIG5ldyBpbWFnZSBvdGhlcndpc2UuCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbWFnZUtleSA9IG5hdHVyZUlkc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIG92ZXJsYXlJbWFnZSA9IChJbWFnZURlc2NyaXB0b3IpIGltYWdlQ2FjaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KGltYWdlS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXlJbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3ZlcmxheUltYWdlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvciBuYXR1cmVJbWFnZSA9IElERVdvcmtiZW5jaFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0KCkuZ2V0UHJvamVjdEltYWdlUmVnaXN0cnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYXR1cmVJbWFnZShuYXR1cmVJZHNbaV0pOwotICAgICAgICAgICAgICAgICAgICBpZiAobmF0dXJlSW1hZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGJhc2VJbWFnZSA9IElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoYmFzZUtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5SW1hZ2UgPSBuZXcgT3ZlcmxheUljb24oYmFzZUltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VEZXNjcmlwdG9yW11bXSB7IHsgbmF0dXJlSW1hZ2UgfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQoMTYsIDE2KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUNhY2hlLnB1dChpbWFnZUtleSwgb3ZlcmxheUltYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdmVybGF5SW1hZ2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKGJhc2VLZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoaWxkcmVuIG9mIHRoaXMgY29udGFpbmVyLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBvOwotICAgICAgICBpZiAocHJvamVjdC5pc09wZW4oKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvamVjdC5tZW1iZXJzKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL2Rvbid0IGdldCB0aGUgY2hpbGRyZW4gaWYgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIHByb2plY3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTk9fQ0hJTERSRU47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpYyBhdHRyaWJ1dGUgbWF0Y2hlcyB0aGUgc3RhdGUgb2YgdGhlIHRhcmdldAotICAgICAqIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCBvYmplY3QKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGF0dHJpdXRlIHZhbHVlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIG1hdGNoZXM7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlKE9iamVjdCB0YXJnZXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSVByb2plY3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgSVByb2plY3QgcHJvaiA9IChJUHJvamVjdCkgdGFyZ2V0OwotICAgICAgICBpZiAobmFtZS5lcXVhbHMoTkFUVVJFKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvai5pc0FjY2Vzc2libGUoKSAmJiBwcm9qLmhhc05hdHVyZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoT1BFTikpIHsKLSAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIHJldHVybiAocHJvai5pc09wZW4oKSA9PSB2YWx1ZS5lcXVhbHMoInRydWUiKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci50ZXN0QXR0cmlidXRlKHRhcmdldCwgbmFtZSwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvV29ya2JlbmNoUmVzb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvV29ya2JlbmNoUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkY2RiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUmVzb3VyY2VBY3Rpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TaW1wbGVXaWxkY2FyZFRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogQW4gSVdvcmtiZW5jaEFkYXB0ZXIgdGhhdCByZXByZXNlbnRzIElSZXNvdXJjZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXb3JrYmVuY2hSZXNvdXJjZSBleHRlbmRzIFdvcmtiZW5jaEFkYXB0ZXIgaW1wbGVtZW50cwotICAgICAgICBJUmVzb3VyY2VBY3Rpb25GaWx0ZXIgewotCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIHRoZSBhcHByb3ByaWF0ZSBiYXNlIGltYWdlIHRvIHVzZSBmb3IgdGhlIHJlc291cmNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBJbWFnZURlc2NyaXB0b3IgZ2V0QmFzZUltYWdlKElSZXNvdXJjZSByZXNvdXJjZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvKSB7Ci0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKG8pOwotICAgICAgICByZXR1cm4gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBnZXRCYXNlSW1hZ2UocmVzb3VyY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldExhYmVsIG1ldGhvZCBjb21tZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2Uobyk7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIGdpdmVuIG9iamVjdC4gIFJldHVybnMgbnVsbCBpZiB0aGUKLSAgICAgKiBwYXJlbnQgaXMgbm90IGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShvKTsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlID09IG51bGwgPyBudWxsIDogcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgY29ycmVzcG9uZGluZyB0byB0aGlzIG9iamVjdCwKLSAgICAgKiBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgcmV0dXJuIChJUmVzb3VyY2UpIG87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBvKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpYyBhdHRyaWJ1dGUgbWF0Y2hlcyB0aGUgc3RhdGUgb2YgdGhlIHRhcmdldAotICAgICAqIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCBvYmplY3QKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGF0dHJpYnV0ZSB2YWx1ZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGF0dHJpYnV0ZSBtYXRjaGVzOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdGVzdEF0dHJpYnV0ZShPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBJUmVzb3VyY2UgcmVzID0gKElSZXNvdXJjZSkgdGFyZ2V0OwotICAgICAgICBpZiAobmFtZS5lcXVhbHMoTkFNRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBTaW1wbGVXaWxkY2FyZFRlc3Rlci50ZXN0V2lsZGNhcmRJZ25vcmVDYXNlKHZhbHVlLCByZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUEFUSCkpIHsKLSAgICAgICAgICAgIHJldHVybiBTaW1wbGVXaWxkY2FyZFRlc3Rlci50ZXN0V2lsZGNhcmRJZ25vcmVDYXNlKHZhbHVlLCByZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoRVhURU5TSU9OKSkgewotICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVdpbGRjYXJkVGVzdGVyLnRlc3RXaWxkY2FyZElnbm9yZUNhc2UodmFsdWUsIHJlcwotICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsZUV4dGVuc2lvbigpKTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhSRUFEX09OTFkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHJlcy5pc1JlYWRPbmx5KCkgPT0gdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUFJPSkVDVF9OQVRVUkUpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2ogPSByZXMuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBwcm9qLmlzQWNjZXNzaWJsZSgpICYmIHByb2ouaGFzTmF0dXJlKHZhbHVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQRVJTSVNURU5UX1BST1BFUlRZKSkgewotICAgICAgICAgICAgcmV0dXJuIHRlc3RQcm9wZXJ0eShyZXMsIHRydWUsIGZhbHNlLCB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUFJPSkVDVF9QRVJTSVNURU5UX1BST1BFUlRZKSkgewotICAgICAgICAgICAgcmV0dXJuIHRlc3RQcm9wZXJ0eShyZXMsIHRydWUsIHRydWUsIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhTRVNTSU9OX1BST1BFUlRZKSkgewotICAgICAgICAgICAgcmV0dXJuIHRlc3RQcm9wZXJ0eShyZXMsIGZhbHNlLCBmYWxzZSwgdmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBST0pFQ1RfU0VTU0lPTl9QUk9QRVJUWSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXN0UHJvcGVydHkocmVzLCBmYWxzZSwgdHJ1ZSwgdmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKENPTlRFTlRfVFlQRV9JRCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXN0Q29udGVudFR5cGVQcm9wZXJ0eShyZXMsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciB0aGUgY29udGVudCB0eXBlIGZvciA8Y29kZT5yZXNvdXJjZTwvY29kZT4gbWF0Y2hlcyB0aGUKLSAgICAgKiA8Y29kZT5jb250ZW50VHlwZUlkPC9jb2RlPi4gSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIG1ldGhvZCBjYWxsIGNvdWxkCi0gICAgICogY2F1c2UgdGhlIHJlc291cmNlIHRvIGJlIHJlYWQuIEl0IGlzIGFsc28gcG9zc2libGUgKHRocm91Z2ggcG9vciBwbHVnLWluCi0gICAgICogZGVzaWduKSBmb3IgdGhpcyBtZXRob2QgdG8gbG9hZCBwbHVnLWlucy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBmb3Igd2hpY2ggdGhlIGNvbnRlbnQgdHlwZSBzaG91bGQgYmUgZGV0ZXJtaW5lZDsKLSAgICAgKiAgICAgICAgICAgIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZUlkCi0gICAgICogICAgICAgICAgICBUaGUgZXhwZWN0ZWQgY29udGVudCB0eXBlOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgYmVzdCBtYXRjaGluZyBjb250ZW50IHR5cGUgaGFzIGFuCi0gICAgICogICAgICAgICBpZGVudGlmaWVyIHRoYXQgbWF0Y2hlcyA8Y29kZT5jb250ZW50VHlwZUlkPC9jb2RlPjsKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHRlc3RDb250ZW50VHlwZVByb3BlcnR5KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFZhbHVlID0gY29udGVudFR5cGVJZC50cmltKCk7Ci0KLSAgICAgICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwotICAgICAgICBTdHJpbmcgYWN0dWFsVmFsdWUgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCi0gICAgICAgICAgICBpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICAgICAgICAgIGFjdHVhbFZhbHVlID0gY29udGVudFR5cGUuZ2V0SWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBMb2cgdGhlIGVycm9yLgotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiQ29yZSBleGNlcHRpb24gd2hpbGUgcmV0cmlldmluZyB0aGUgY29udGVudCBkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5sb2cobWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXhwZWN0ZWRWYWx1ZSA9PSBudWxsIHx8IGV4cGVjdGVkVmFsdWUuZXF1YWxzKGFjdHVhbFZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIGEgc2Vzc2lvbiBvciBwZXJzaXN0ZW50IHByb3BlcnR5IG9uIHRoZSByZXNvdXJjZSBvciBpdHMgcHJvamVjdAotICAgICAqIG1hdGNoZXMgdGhlIGdpdmVuIHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHRvIGNoZWNrCi0gICAgICogQHBhcmFtIHBlcnNpc3RlbnRGbGFnCi0gICAgICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYSBwZXJzaXN0ZW50IHByb3BlcnR5LCA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgICAgICAgICAgIGZvciBhIHNlc3Npb24gcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gcHJvamVjdEZsYWcKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIGNoZWNrIHRoZSByZXNvdXJjZSdzIHByb2plY3QsCi0gICAgICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gY2hlY2sgdGhlIHJlc291cmNlIGl0c2VsZgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSB2YWx1ZSwgd2hpY2ggaGFzIGVpdGhlciB0aGUgZm9ybSAicHJvcGVydHlOYW1lIiBvcgotICAgICAqICAgICAgICAgICAgInByb3BlcnR5TmFtZT1wcm9wZXJ0eVZhbHVlIgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGVyZSBpcyBhIG1hdGNoCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHRlc3RQcm9wZXJ0eShJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gcGVyc2lzdGVudEZsYWcsCi0gICAgICAgICAgICBib29sZWFuIHByb2plY3RGbGFnLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkVmFsOwotICAgICAgICBpbnQgaSA9IHZhbHVlLmluZGV4T2YoJz0nKTsKLSAgICAgICAgaWYgKGkgIT0gLTEpIHsKLSAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IHZhbHVlLnN1YnN0cmluZygwLCBpKS50cmltKCk7Ci0gICAgICAgICAgICBleHBlY3RlZFZhbCA9IHZhbHVlLnN1YnN0cmluZyhpICsgMSkudHJpbSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gdmFsdWUudHJpbSgpOwotICAgICAgICAgICAgZXhwZWN0ZWRWYWwgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBRdWFsaWZpZWROYW1lIGtleTsKLSAgICAgICAgICAgIGludCBkb3QgPSBwcm9wZXJ0eU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIGlmIChkb3QgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBrZXkgPSBuZXcgUXVhbGlmaWVkTmFtZShwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIGRvdCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKGRvdCArIDEpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAga2V5ID0gbmV3IFF1YWxpZmllZE5hbWUobnVsbCwgcHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNUb0NoZWNrID0gcHJvamVjdEZsYWcgPyByZXNvdXJjZS5nZXRQcm9qZWN0KCkKLSAgICAgICAgICAgICAgICAgICAgOiByZXNvdXJjZTsKLSAgICAgICAgICAgIC8vIGdldFByb2plY3QoKSBvbiB3b3Jrc3BhY2Ugcm9vdCBjYW4gYmUgbnVsbAotICAgICAgICAgICAgaWYgKHJlc1RvQ2hlY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwZXJzaXN0ZW50RmxhZykgewotICAgICAgICAgICAgICAgIFN0cmluZyBhY3R1YWxWYWwgPSByZXNUb0NoZWNrLmdldFBlcnNpc3RlbnRQcm9wZXJ0eShrZXkpOwotICAgICAgICAgICAgICAgIGlmIChhY3R1YWxWYWwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBleHBlY3RlZFZhbCA9PSBudWxsIHx8IGV4cGVjdGVkVmFsLmVxdWFscyhhY3R1YWxWYWwpOwotICAgICAgICAgICAgfSAKLQotICAgICAgICAgICAgT2JqZWN0IGFjdHVhbFZhbCA9IHJlc1RvQ2hlY2suZ2V0U2Vzc2lvblByb3BlcnR5KGtleSk7Ci0gICAgICAgICAgICAgaWYgKGFjdHVhbFZhbCA9PSBudWxsKSAKLSAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWRWYWwgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXhwZWN0ZWRWYWwuZXF1YWxzKGFjdHVhbFZhbC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvV29ya2JlbmNoUm9vdFJlc291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaFJvb3RSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2VmNWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvV29ya2JlbmNoUm9vdFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlcjsKLQotLyoqCi0gKiBBbiBJV29ya2JlbmNoQWRhcHRlciBpbXBsZW1lbnRhdGlvbiBmb3IgSVdvcmtzcGFjZVJvb3Qgb2JqZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtiZW5jaFJvb3RSZXNvdXJjZSBleHRlbmRzIFdvcmtiZW5jaEFkYXB0ZXIgewotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotICAgICAqIFJldHVybnMgdGhlIGNoaWxkcmVuIG9mIHRoZSByb290IHJlc291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gKElXb3Jrc3BhY2VSb290KSBvOwotICAgICAgICByZXR1cm4gcm9vdC5nZXRQcm9qZWN0cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0gICAgCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICBJU2hhcmVkSW1hZ2VzLklNR19PQkpfRUxFTUVOVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGVsZW1lbnQuICBUaGlzIHdpbGwgdHlwaWNhbGx5Ci0gICAgICogYmUgdXNlZCB0byBhc3NpZ24gYSBsYWJlbCB0byB0aGlzIG9iamVjdCB3aGVuIGRpc3BsYXllZAotICAgICAqIGluIHRoZSBVSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0gICAgICAgIC8vcm9vdCByZXNvdXJjZSBoYXMgbm8gbmFtZQotICAgICAgICByZXR1cm4gSURFV29ya2JlbmNoTWVzc2FnZXMuV29ya3NwYWNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvV29ya2JlbmNoU3RhdHVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaFN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzdjMjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvV29ya2JlbmNoU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlcjsKLQotLyoqCi0gKiBVSSBtYW5mZXN0YXRpb24gb2YgYSBzdGF0dXMgb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoU3RhdHVzIGV4dGVuZHMgV29ya2JlbmNoQWRhcHRlciBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotICAgIHByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0KLSAgICBwcml2YXRlIE9iamVjdFtdIGNoaWxkcmVuOwotCi0gICAgcHVibGljIFdvcmtiZW5jaFN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAgKiBubyBzdWNoIG9iamVjdCBjYW4gYmUgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKGFkYXB0ZXIgPT0gSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgSVN0YXR1c1tdIGNoaWxkU3RhdGlpID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBPYmplY3RbY2hpbGRTdGF0aWkubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRTdGF0aWkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbltpXSA9IG5ldyBXb3JrYmVuY2hTdGF0dXMoY2hpbGRTdGF0aWlbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotICAgICAgICByZXR1cm4gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3cmFwcGVkIHN0YXR1cyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvV29ya2JlbmNoV29ya3NwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtiZW5jaFdvcmtzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmQ0MjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvV29ya2JlbmNoV29ya3NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogSVdvcmtiZW5jaEFkYXB0ZXIgYWRhcHRlciBmb3IgdGhlIElXb3Jrc3BhY2Ugb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoV29ya3NwYWNlIGV4dGVuZHMgV29ya2JlbmNoQWRhcHRlciB7Ci0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSAoSVdvcmtzcGFjZSkgbzsKLSAgICAgICAgcmV0dXJuIHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldExhYmVsIG1ldGhvZCBjb21tZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLSAgICAgICAgLy93b3Jrc3BhY2VzIGRvbid0IGhhdmUgYSBuYW1lCi0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hNZXNzYWdlcy5Xb3Jrc3BhY2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Xb3JraW5nU2V0QWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvbW9kZWwvV29ya2luZ1NldEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NzRlYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Xb3JraW5nU2V0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFwcGluZy5SZXNvdXJjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklDb250cmlidXRvclJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLQotLyoqCi0gKiBBZGFwdGVyIGZhY3Rvcnkgd2hpY2ggcHJvdmlkZXMgYSBSZXNvdXJjZU1hcHBpbmcgZm9yIGEgd29ya2luZyBzZXQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtpbmdTZXRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0gICAgCi0gICAgLyoKLSAgICAgKiBBZGFwdGVyIGZvciBjb252ZXJ0aW5nIGEgd29ya2luZyBzZXQgdG8gYSByZXNvdXJjZSBtYXBwaW5nIGZvcgotICAgICAqIHVzZSBieSBvYmplY3QgY29udHJpYnV0aW9ucy4KLSAgICAgKi8KLSAgICBjbGFzcyBDb250cmlidXRvclJlc291cmNlQWRhcHRlciBpbXBsZW1lbnRzIElDb250cmlidXRvclJlc291cmNlQWRhcHRlcjIgewotCi0gICAgICAgIHB1YmxpYyBSZXNvdXJjZU1hcHBpbmcgZ2V0QWRhcHRlZFJlc291cmNlTWFwcGluZyhJQWRhcHRhYmxlIGFkYXB0YWJsZSkgewotICAgICAgICAgICAgaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElXb3JraW5nU2V0KSB7Ci0gICAgICAgICAgICAgICAgSVdvcmtpbmdTZXQgd29ya2luZ1NldCA9IChJV29ya2luZ1NldCkgYWRhcHRhYmxlOwotICAgICAgICAgICAgICAgIElBZGFwdGFibGVbXSBlbGVtZW50cyA9IHdvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIElBZGFwdGFibGUgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU1hcHBpbmcgbWFwcGluZyA9IGdldENvbnRyaWJ1dGVkUmVzb3VyY2VNYXBwaW5nKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gZ2V0UmVzb3VyY2VNYXBwaW5nKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXBwaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobWFwcGluZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZVJlc291cmNlTWFwcGluZyhhZGFwdGFibGUsIChSZXNvdXJjZU1hcHBpbmdbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFJlc291cmNlTWFwcGluZ1tyZXN1bHQuc2l6ZSgpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSVJlc291cmNlIGdldEFkYXB0ZWRSZXNvdXJjZShJQWRhcHRhYmxlIGFkYXB0YWJsZSkgewotICAgICAgICAgICAgLy8gV29ya2luZyBzZXRzIGRvbid0IGFkYXB0IHRvIElSZXNvdXJjZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIGNsYXNzIFdvcmtiZW5jaEFkYXB0ZXIgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciB7Ci0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElXb3JraW5nU2V0KSB7Ci0gICAgICAgICAgICAgICAgSVdvcmtpbmdTZXQgc2V0ID0gKElXb3JraW5nU2V0KSBvOwotICAgICAgICAgICAgICAgIHJldHVybiBzZXQuZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVdvcmtpbmdTZXQpIHsKLSAgICAgICAgICAgICAgICBJV29ya2luZ1NldCBzZXQgPSAoSVdvcmtpbmdTZXQpIG87Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNldC5nZXRJbWFnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElXb3JraW5nU2V0KSB7Ci0gICAgICAgICAgICAgICAgSVdvcmtpbmdTZXQgc2V0ID0gKElXb3JraW5nU2V0KSBvOwotICAgICAgICAgICAgICAgIHJldHVybiBzZXQuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIHByaXZhdGUgSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyMiBjb250cmlidXRvclJlc291cmNlQWRhcHRlciA9IG5ldyBDb250cmlidXRvclJlc291cmNlQWRhcHRlcigpOwotICAgIHByaXZhdGUgSVdvcmtiZW5jaEFkYXB0ZXIgd29ya2JlbmNoQWRhcHRlciA9IG5ldyBXb3JrYmVuY2hBZGFwdGVyKCk7Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLSAgICAgICAgaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElXb3JraW5nU2V0KSB7Ci0gICAgICAgICAgICBpZiAoYWRhcHRlclR5cGUgPT0gSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFkYXB0ZXJUeXBlID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtiZW5jaEFkYXB0ZXIgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFkYXB0ZXJUeXBlID09IFJlc291cmNlTWFwcGluZy5jbGFzcykgewotICAgICAgICAgICAgICAgIElXb3JraW5nU2V0IHdvcmtpbmdTZXQgPSAoSVdvcmtpbmdTZXQpIGFkYXB0YWJsZU9iamVjdDsKLSAgICAgICAgICAgICAgICBJQWRhcHRhYmxlW10gZWxlbWVudHMgPSB3b3JraW5nU2V0LmdldEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBJQWRhcHRhYmxlIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNYXBwaW5nIG1hcHBpbmcgPSBnZXRSZXNvdXJjZU1hcHBpbmcoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXBwaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobWFwcGluZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZVJlc291cmNlTWFwcGluZyhhZGFwdGFibGVPYmplY3QsIChSZXNvdXJjZU1hcHBpbmdbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFJlc291cmNlTWFwcGluZ1tyZXN1bHQuc2l6ZSgpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQotICAgICAqLwotICAgIHB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotICAgICAgICByZXR1cm4gbmV3IENsYXNzW10geyBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIyLmNsYXNzLCBJV29ya2JlbmNoQWRhcHRlci5jbGFzcywgUmVzb3VyY2VNYXBwaW5nLmNsYXNzIH07Ci0gICAgfQotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gUmVzb3VyY2VNYXBwaW5nIGdldFJlc291cmNlTWFwcGluZyhPYmplY3QgbykgeyAKLSAgICAgICAgLy8gRmlyc3QsIGFzayB0aGUgb2JqZWN0IGRpcmVjdGx5IGZvciBhIHJlc291cmNlIG1hcHBpbmcKLSAgICAgICAgT2JqZWN0IG1hcHBpbmcgPSBpbnRlcm5hbEdldEFkYXB0ZXIobywgUmVzb3VyY2VNYXBwaW5nLmNsYXNzKTsKLSAgICAgICAgaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBSZXNvdXJjZU1hcHBpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAoUmVzb3VyY2VNYXBwaW5nKW1hcHBpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhpcyBmYWlscywgYXNrIGZvciBhIHJlc291cmNlIGFuZCBjb252ZXJ0IHRvIGEgcmVzb3VyY2UgbWFwcGluZwotICAgICAgICBPYmplY3QgcmVzb3VyY2UgPSBpbnRlcm5hbEdldEFkYXB0ZXIobywgSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1hcHBpbmcgPSBpbnRlcm5hbEdldEFkYXB0ZXIocmVzb3VyY2UsIFJlc291cmNlTWFwcGluZy5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAobWFwcGluZyBpbnN0YW5jZW9mIFJlc291cmNlTWFwcGluZykgewotICAgICAgICAgICAgICAgIHJldHVybiAoUmVzb3VyY2VNYXBwaW5nKW1hcHBpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gUmVzb3VyY2VNYXBwaW5nIGdldENvbnRyaWJ1dGVkUmVzb3VyY2VNYXBwaW5nKElBZGFwdGFibGUgZWxlbWVudCkgeyAKLSAgICAgICAgT2JqZWN0IHJlc291cmNlQWRhcHRlciA9IGludGVybmFsR2V0QWRhcHRlcihlbGVtZW50LCBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIuY2xhc3MpOwotICAgICAgICBpZiAocmVzb3VyY2VBZGFwdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIyKSB7Ci0gICAgICAgICAgICAgICAgLy8gRmlyc3QsIHVzZSB0aGUgbWFwcGluZyBjb250cmlidXRvciBhZGFwdGVyIHRvIGdldCB0aGUgbWFwcGluZwotICAgICAgICAgICAgICAgIElDb250cmlidXRvclJlc291cmNlQWRhcHRlcjIgbWFwcGluZ0FkYXB0ZXIgPSAoSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyMikgcmVzb3VyY2VBZGFwdGVyOwotICAgICAgICAgICAgICAgIFJlc291cmNlTWFwcGluZyBtYXBwaW5nID0gbWFwcGluZ0FkYXB0ZXIuZ2V0QWRhcHRlZFJlc291cmNlTWFwcGluZyhlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAobWFwcGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBwaW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBOZXh0LCB1c2UgdGhlIHJlc291cmNlIGFkYXB0ZXIgdG8gZ2V0IGEgcmVzb3VyY2UgYW5kIHRoZW4gZ2V0IHRoZSBtYXBwaW5nIGZvciB0aGF0IHJlc291cmNlCi0gICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKChJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIpcmVzb3VyY2VBZGFwdGVyKS5nZXRBZGFwdGVkUmVzb3VyY2UoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1hcHBpbmcgPSBpbnRlcm5hbEdldEFkYXB0ZXIocmVzb3VyY2UsIFJlc291cmNlTWFwcGluZy5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgUmVzb3VyY2VNYXBwaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFJlc291cmNlTWFwcGluZyltYXBwaW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKiBwYWNrYWdlICovICBPYmplY3QgaW50ZXJuYWxHZXRBZGFwdGVyKE9iamVjdCBvLCBDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgSUFkYXB0YWJsZSBlbGVtZW50ID0gKElBZGFwdGFibGUpIG87Ci0gICAgICAgICAgICBPYmplY3QgYWRhcHRlZCA9IGVsZW1lbnQuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLSAgICAgICAgICAgIGlmIChhZGFwdGVkICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRmFsbGJhY2sgdG8gdGhlIGFkYXB0ZXIgbWFuYWdlciBpbiBjYXNlIHRoZSBvYmplY3QgZG9lc24ndAotICAgICAgICAvLyBpbXBsZW1lbnQgZ2V0QWRhcHRlciBvciBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgaW1wbGVtZW50YXRpb24gCi0gICAgICAgIC8vIGRvZXNuJ3QgY29uc3VsdCB0aGUgbWFuYWdlcgotICAgICAgICByZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKG8sIGFkYXB0ZXIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9tb2RlbC9Xb3Jrc3BhY2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtzcGFjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkYzYyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL21vZGVsL1dvcmtzcGFjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIFJlc291cmNlRmFjdG9yeSBpcyB1c2VkIHRvIHNhdmUgYW5kIHJlY3JlYXRlIGFuIElSZXNvdXJjZSBvYmplY3QuCi0gKiBBcyBzdWNoLCBpdCBpbXBsZW1lbnRzIHRoZSBJUGVyc2lzdGFibGVFbGVtZW50IGludGVyZmFjZSBmb3Igc3RvcmFnZQotICogYW5kIHRoZSBJRWxlbWVudEZhY3RvcnkgaW50ZXJmYWNlIGZvciByZWNyZWF0aW9uLgotICoKLSAqIEBzZWUgSU1lbWVudG8KLSAqIEBzZWUgSVBlcnNpc3RhYmxlRWxlbWVudAotICogQHNlZSBJRWxlbWVudEZhY3RvcnkKLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZUZhY3RvcnkgaW1wbGVtZW50cyBJRWxlbWVudEZhY3RvcnksIElQZXJzaXN0YWJsZUVsZW1lbnQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0lEID0gIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLldvcmtzcGFjZUZhY3RvcnkiOy8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFJlc291cmNlRmFjdG9yeS4gIFRoaXMgY29uc3RydWN0b3IgaXMgdHlwaWNhbGx5IHVzZWQKLSAgICAgKiBmb3Igb3VyIElFbGVtZW50RmFjdG9yeSBzaWRlLgotICAgICAqLwotICAgIHB1YmxpYyBXb3Jrc3BhY2VGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUVsZW1lbnRGYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIElBZGFwdGFibGUgY3JlYXRlRWxlbWVudChJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUGVyc2lzdGFibGVFbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0gICAgICAgIHJldHVybiBGQUNUT1JZX0lEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVBlcnNpc3RhYmxlRWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5MjU3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLTxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTWljcm9zb2Z0IEZyb250UGFnZSA0LjAiPgotPG1ldGEgbmFtZT0iUHJvZ0lkIiBjb250ZW50PSJGcm9udFBhZ2UuRWRpdG9yLkRvY3VtZW50Ij4KLTx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIElERS1zcGVjaWZpYyBwb3J0aW9uIG9mIHRoZSBFY2xpcHNlIFBsYXRmb3JtIFVzZXIKLUludGVyZmFjZS4KLTxoMj5QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotVGhpcyBwYWNrYWdlIGRvZXMgbm90IGNvbnRhaW4gYW55IEFQSS4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L0NhcGFiaWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvcmVnaXN0cnkvQ2FwYWJpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzVkYWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvcmVnaXN0cnkvQ2FwYWJpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklDYXBhYmlsaXR5SW5zdGFsbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQ2FwYWJpbGl0eVVuaW5zdGFsbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBBIGNhcGFiaWxpdHkgaXMgdGhlIHVzZXIgaW50ZXJmYWNlIGFzcGVjdCBvZiBhIHByb2plY3QncyBuYXR1cmUuIFRoZXJlIGlzCi0gKiBhIDEtMSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIGNhcGFiaWxpdHkgYW5kIGEgbmF0dXJlLiBJdCBpcyBwb3NzaWJsZSBmb3IKLSAqIGEgbmF0dXJlIHRvIG5vdCBoYXZlIGEgY2FwYWJpbGl0eSwgYnV0IHRoZSBvcHBvc2l0ZSBpcyBub3QgdHJ1ZSAtIHRoYXQgaXMsCi0gKiBhIGNhcGFiaWxpdHkgbXVzdCByZXByZXNlbnQgYSBuYXR1cmUuCi0gKiA8cD4KLSAqIEEgY2FwYWJpbGl0eSBjYW4gdGFrZSBjb250cm9sIG9mIHRoZSB1c2VyIGludGVyZmFjZSBvZiBvdGhlciBjYXBhYmlsaXRpZXMuIEl0Ci0gKiBpcyB0aGVuIHJlc3BvbnNpYmxlIGZvciBjb2xsZWN0aW5nIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYW5kIGFkZGluZyB0aGUKLSAqIG5hdHVyZXMgcmVwcmVzZW50ZWQgYnkgdGhlc2UgY2FwYWJpbGl0ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDYXBhYmlsaXR5IGV4dGVuZHMgV29ya2JlbmNoQWRhcHRlciBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFUVVJFX0lEID0gIm5hdHVyZUlkIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lOU1RBTExfV0laQVJEID0gImluc3RhbGxXaXphcmQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lOU1RBTExfREVUQUlMUyA9ICJpbnN0YWxsRGV0YWlscyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVU5JTlNUQUxMX1dJWkFSRCA9ICJ1bmluc3RhbGxXaXphcmQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1VOSU5TVEFMTF9ERVRBSUxTID0gInVuaW5zdGFsbERldGFpbHMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hdHVyZUlkOwotCi0gICAgcHJpdmF0ZSBJUHJvamVjdE5hdHVyZURlc2NyaXB0b3IgbmF0dXJlRGVzY3JpcHRvcjsKLQotICAgIHByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGljb247Ci0KLSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgaGFuZGxlVUlzOwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgcGVyc3BlY3RpdmVDaG9pY2VzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5DYXBhYmlsaXR5PC9jb2RlPiB1c2luZyB0aGUKLSAgICAgKiBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25maWdFbGVtZW50IHRoZSA8Y29kZT5JQ29uZmlndXJhdGlvbkVsZW1lbnQ8Y29kZT4gY29udGFpbmluZwotICAgICAqIAkJdGhlIGF0dHJpYnV0ZXMKLSAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSA8Y29kZT5DYXBhYmlsaXR5UmVnaXN0cnlSZWFkZXI8Y29kZT4gdXNlZCB0byBsb2cgbWlzc2luZyBhdHRyaWJ1dGVzCi0gICAgICogQHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24gaWYgdGhlIElELCBuYXR1cmUsIG9yIHdpemFyZCBpcyA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBDYXBhYmlsaXR5KElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50LAotICAgICAgICAgICAgQ2FwYWJpbGl0eVJlZ2lzdHJ5UmVhZGVyIHJlYWRlcikgdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBtaXNzaW5nQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBhdHRyX2lkID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLSAgICAgICAgU3RyaW5nIGF0dHJfbmF0dXJlID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BVFVSRV9JRCk7Ci0KLSAgICAgICAgaWYgKGF0dHJfaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVhZGVyLmxvZ01pc3NpbmdBdHRyaWJ1dGUoY29uZmlnRWxlbWVudCwgQVRUX0lEKTsKLSAgICAgICAgICAgIG1pc3NpbmdBdHRyaWJ1dGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhdHRyX25hdHVyZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZWFkZXIubG9nTWlzc2luZ0F0dHJpYnV0ZShjb25maWdFbGVtZW50LCBBVFRfTkFUVVJFX0lEKTsKLSAgICAgICAgICAgIG1pc3NpbmdBdHRyaWJ1dGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSU5TVEFMTF9XSVpBUkQpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlYWRlci5sb2dNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUVF9JTlNUQUxMX1dJWkFSRCk7Ci0gICAgICAgICAgICBtaXNzaW5nQXR0cmlidXRlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtaXNzaW5nQXR0cmlidXRlKQotICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtiZW5jaEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhcGFiaWxpdHkgbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzLiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgaWQgPSBhdHRyX2lkOwotICAgICAgICBuYXR1cmVJZCA9IGF0dHJfbmF0dXJlOwotICAgICAgICBlbGVtZW50ID0gY29uZmlnRWxlbWVudDsKLSAgICAgICAgbmF0dXJlRGVzY3JpcHRvciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXROYXR1cmVEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgIG5hdHVyZUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPkNhcGFiaWxpdHk8L2NvZGU+IGFzIGFuIHVua25vd24gb25lCi0gICAgICogZm9yIGEgZ2l2ZW4gbmF0dXJlIGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYXR1cmVJZCB0aGUgbmF0dXJlIGlkIGZvciB0aGUgdW5rbm93biBjYXBiaWxpdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2FwYWJpbGl0eShTdHJpbmcgbmF0dXJlSWQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5pZCA9IG5hdHVyZUlkOwotICAgICAgICB0aGlzLm5hdHVyZUlkID0gbmF0dXJlSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgaWQgb2YgYSBjYXBhYmlsaXR5IGZvciB3aGljaCB0aGlzIGNhcGFiaWxpdHkgaGFuZGxlcwotICAgICAqIHRoZSB1c2VyIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRIYW5kbGVVSShTdHJpbmcgY2FwYWJpbGl0eUlkKSB7Ci0gICAgICAgIGlmIChoYW5kbGVVSXMgPT0gbnVsbCkKLSAgICAgICAgICAgIGhhbmRsZVVJcyA9IG5ldyBBcnJheUxpc3QoNCk7Ci0gICAgICAgIGhhbmRsZVVJcy5hZGQoY2FwYWJpbGl0eUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBpZCBvZiBhIHBlcnNwZWN0aXZlIGZvciB3aGljaCB0aGlzIGNhcGFiaWxpdHkKLSAgICAgKiB3YW50cyB0byBwcmVzZW50IGFzIGEgY2hvaWNlIGluIHRoZSB1c2VyIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQZXJzcGVjdGl2ZUNob2ljZShTdHJpbmcgcGVyc3BJZCkgewotICAgICAgICBpZiAocGVyc3BlY3RpdmVDaG9pY2VzID09IG51bGwpCi0gICAgICAgICAgICBwZXJzcGVjdGl2ZUNob2ljZXMgPSBuZXcgQXJyYXlMaXN0KDQpOwotICAgICAgICBwZXJzcGVjdGl2ZUNob2ljZXMuYWRkKHBlcnNwSWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hBZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIGdldEljb25EZXNjcmlwdG9yKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoQWRhcHRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICBpZiAoaXNWYWxpZCgpKQotICAgICAgICAgICAgcmV0dXJuIG5hdHVyZURlc2NyaXB0b3IuZ2V0TGFiZWwoKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5MUy5iaW5kKElERVdvcmtiZW5jaE1lc3NhZ2VzLkNhcGFiaWxpdHlfbmFtZU1pc3NpbmcsIGlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEljb25EZXNjcmlwdG9yKCkgewotCQlpZiAoaWNvbiA9PSBudWxsICYmIGlzVmFsaWQoKSkgewotCQkJU3RyaW5nIGV4dGVuZGluZ1BsdWdpbklkID0gZWxlbWVudC5nZXROYW1lc3BhY2UoKTsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JQ09OKTsKLSAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsICYmIGxvY2F0aW9uLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICBpY29uID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kaW5nUGx1Z2luSWQsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaWNvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYXR1cmUgZGVzY3JpcHRvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqIG5vbmUgZXhpc3QuCi0gICAgICovCi0gICAgcHVibGljIElQcm9qZWN0TmF0dXJlRGVzY3JpcHRvciBnZXROYXR1cmVEZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gbmF0dXJlRGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hdHVyZUlkKCkgewotICAgICAgICByZXR1cm4gbmF0dXJlSWQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWRhcHRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChhZGFwdGVyID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnlQYXRoKCkgewotICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NBVEVHT1JZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjYXBhYmlsaXR5IGluc3RhbGwKLSAgICAgKiB3aXphcmQuIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGUgaW5pdAotICAgICAqIG1ldGhvZC4gSWYgdGhlIHdpemFyZCBjYW5ub3QgYmUgY3JlYXRlZCwgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBpcyByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBub24taW5pdGlhbGl6ZWQgY2FwYWJpbGl0eSB3aXphcmQgb3IKLSAgICAgKiAJCTxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB3aXphcmQgY2Fubm90IGJlIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIElDYXBhYmlsaXR5SW5zdGFsbFdpemFyZCBnZXRJbnN0YWxsV2l6YXJkKCkgewotICAgICAgICBpZiAoIWlzVmFsaWQoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKElDYXBhYmlsaXR5SW5zdGFsbFdpemFyZCkgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfSU5TVEFMTF9XSVpBUkQpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAubG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIGNhcGFiaWxpdHkgaW5zdGFsbCB3aXphcmQuIiwgZS5nZXRTdGF0dXMoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBpbnN0YWxsIHdpemFyZAotICAgICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgc3VwcGxpZWQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnN0YWxsRGV0YWlscygpIHsKLSAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JTlNUQUxMX0RFVEFJTFMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNhcGFiaWxpdHkgdW5pbnN0YWxsCi0gICAgICogd2l6YXJkLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhlIGluaXQKLSAgICAgKiBtZXRob2QuIElmIHRoZSB3aXphcmQgY2Fubm90IGJlIGNyZWF0ZWQsIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbm9uLWluaXRpYWxpemVkIGNhcGFiaWxpdHkgd2l6YXJkIG9yCi0gICAgICogCQk8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgd2l6YXJkIGNhbm5vdCBiZSBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBJQ2FwYWJpbGl0eVVuaW5zdGFsbFdpemFyZCBnZXRVbmluc3RhbGxXaXphcmQoKSB7Ci0gICAgICAgIGlmICghaXNWYWxpZCgpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAoSUNhcGFiaWxpdHlVbmluc3RhbGxXaXphcmQpIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX1VOSU5TVEFMTF9XSVpBUkQpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAubG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIGNhcGFiaWxpdHkgdW5pbnN0YWxsIHdpemFyZC4iLCBlLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHVuaW5zdGFsbCB3aXphcmQKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHN1cHBsaWVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5pbnN0YWxsRGV0YWlscygpIHsKLSAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9VTklOU1RBTExfREVUQUlMUyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQ7Ci0gICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERVNDUklQVElPTik7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgaWRzIG9mIG90aGVyIGNhcGFiaWxpdGllcyBmb3Igd2hpY2ggdGhpcyAKLSAgICAgKiBjYXBhYmlsaXR5IGhhbmRsZXMgdGhlIHVzZXIgaW50ZXJmYWNlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIGlmIG5vdCBhcHBsaWNhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0SGFuZGxlVUlzKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlVUlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGlkcyBvZiBwZXJzcGVjdGl2ZXMgZm9yIHdoaWNoIHRoaXMgCi0gICAgICogY2FwYWJpbGl0eSB3YW50cyB0byBwcmVzZW50IGFzIGNob2ljZXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgbm90IGFwcGxpY2FibGUuCi0gICAgICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQZXJzcGVjdGl2ZUNob2ljZXMoKSB7Ci0gICAgICAgIHJldHVybiBwZXJzcGVjdGl2ZUNob2ljZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY2FwYWJpbGl0eSBpcyB2YWxpZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBuYXR1cmVEZXNjcmlwdG9yICE9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9DYXBhYmlsaXR5UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvcmVnaXN0cnkvQ2FwYWJpbGl0eVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZmVmYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9DYXBhYmlsaXR5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHJlZ2lzdHJ5IG9mIHByb2plY3QgY2FwYWJpbGl0aWVzIGFuZCBjYXRlZ29yaWVzIG9mIAotICogY2FwYWJpbGl0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVJlZ2lzdHJ5IGV4dGVuZHMgV29ya2JlbmNoQWRhcHRlciBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0lEX0xJU1QgPSBuZXcgU3RyaW5nWzBdOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FwYWJpbGl0eVtdIEVNUFRZX0NBUF9MSVNUID0gbmV3IENhcGFiaWxpdHlbMF07Ci0KLSAgICBwcml2YXRlIEhhc2hNYXAgbmF0dXJlVG9DYXBhYmlsaXR5OwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgY2FwYWJpbGl0aWVzOwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgY2F0ZWdvcmllczsKLQotICAgIHByaXZhdGUgQ2F0ZWdvcnkgbWlzY0NhdGVnb3J5OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5DYXBhYmlsaXR5UmVnaXN0cnk8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIENhcGFiaWxpdHlSZWdpc3RyeSgpIHsKLSAgICAgICAgY2FwYWJpbGl0aWVzID0gbmV3IEFycmF5TGlzdCgzMCk7Ci0gICAgICAgIGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KDE1KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiBjYXBhYmlsaXR5IHRvIHRoZSByZWdpc3RyeS4gQ2FsbGVkIGJ5Ci0gICAgICogdGhlIENhcGFiaWxpdHlSZWdpc3RyeVJlYWRlci4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovYm9vbGVhbiBhZGRDYXBhYmlsaXR5KENhcGFiaWxpdHkgY2FwYWJpbGl0eSkgewotICAgICAgICByZXR1cm4gY2FwYWJpbGl0aWVzLmFkZChjYXBhYmlsaXR5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiBjYXBhYmlsaXR5IGNhdGVnb3J5IHRvIHRoZSByZWdpc3RyeS4gQ2FsbGVkCi0gICAgICogYnkgdGhlIENhcGFiaWxpdHlSZWdpc3RyeVJlYWRlci4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovYm9vbGVhbiBhZGRDYXRlZ29yeShDYXRlZ29yeSBjYXRlZ29yeSkgewotICAgICAgICByZXR1cm4gY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBjYXBhYmlsaXR5IGZvciB0aGUgZ2l2ZW4gaWRlbnRpZmllciwgb3IKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBDYXBhYmlsaXR5IGZpbmRDYXBhYmlsaXR5KFN0cmluZyBpZCkgewotICAgICAgICBJdGVyYXRvciBpdHIgPSBjYXBhYmlsaXRpZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIENhcGFiaWxpdHkgY2FwID0gKENhcGFiaWxpdHkpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKGNhcC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjYXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIGNhdGVnb3J5IGZvciB0aGUgZ2l2ZW4gaWRlbnRpZmllciwgb3IKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBDYXRlZ29yeSBmaW5kQ2F0ZWdvcnkoU3RyaW5nIGlkKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIENhdGVnb3J5IGNhdCA9IChDYXRlZ29yeSkgaXRyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoY2F0LmdldFJvb3RQYXRoKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNhdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyB0aGUgY2FwYWJpbGl0eSBmb3IgZWFjaCBzcGVjaWZpZWQgaWRlbnRpZmllci4KLSAgICAgKiBBbnkgPGNvZGU+bnVsbDwvY29kZT4gZW50cmllcyBpbiB0aGUgcmVzdWx0aW5nIGFycmF5Ci0gICAgICogYXJlIGZvciBpZGVudGlmaWVycyB0byB3aGljaCBubyBjYXBhYmlsaXR5IGV4aXN0LgotICAgICAqLwotICAgIHB1YmxpYyBDYXBhYmlsaXR5W10gZmluZENhcGFiaWxpdGllcyhTdHJpbmdbXSBpZHMpIHsKLSAgICAgICAgaW50IGNvdW50ID0gY2FwYWJpbGl0aWVzLnNpemUoKTsKLSAgICAgICAgQ2FwYWJpbGl0eVtdIHJlc3VsdHMgPSBuZXcgQ2FwYWJpbGl0eVtpZHMubGVuZ3RoXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGlkID0gaWRzW2ldOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ2FwYWJpbGl0eSBjYXAgPSAoQ2FwYWJpbGl0eSkgY2FwYWJpbGl0aWVzLmdldChqKTsKLSAgICAgICAgICAgICAgICBpZiAoY2FwLmdldElkKCkuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldID0gY2FwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyB0aGUgY2F0ZWdvcnkgZm9yIGVhY2ggc3BlY2lmaWVkIGlkZW50aWZpZXIuCi0gICAgICogQW55IDxjb2RlPm51bGw8L2NvZGU+IGVudHJpZXMgaW4gdGhlIHJlc3VsdGluZyBhcnJheQotICAgICAqIGFyZSBmb3IgaWRlbnRpZmllcnMgdG8gd2hpY2ggbm8gY2F0ZWdvcnkgZXhpc3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5JQ2F0ZWdvcnk8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIENhdGVnb3J5W10gZmluZENhdGVnb3JpZXMoU3RyaW5nW10gaWRzKSB7Ci0gICAgICAgIGludCBjb3VudCA9IGNhdGVnb3JpZXMuc2l6ZSgpOwotICAgICAgICBDYXRlZ29yeVtdIHJlc3VsdHMgPSBuZXcgQ2F0ZWdvcnlbaWRzLmxlbmd0aF07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBpZCA9IGlkc1tpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgewotICAgICAgICAgICAgICAgIENhdGVnb3J5IGNhdCA9IChDYXRlZ29yeSkgY2F0ZWdvcmllcy5nZXQoaik7Ci0gICAgICAgICAgICAgICAgaWYgKGNhdC5nZXRJZCgpLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IGNhdDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWRhcHRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChhZGFwdGVyID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2F0ZWdvcmllcyBpbiB0aGUgcmVnaXN0cnkKLSAgICAgKiB3aGljaCBjb250YWluIGF0IGxlYXN0IG9uZSBjYXBhYmlsaXR5LiBEb2VzIG5vdAotICAgICAqIGluY2x1ZGUgdGhlIG1pc2MgYW5kIHVua25vd24gY2F0ZWdvcmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFVzZWRDYXRlZ29yaWVzKCkgewotICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoY2F0ZWdvcmllcy5zaXplKCkpOwotICAgICAgICBJdGVyYXRvciBpdHIgPSBjYXRlZ29yaWVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBDYXRlZ29yeSBjYXQgPSAoQ2F0ZWdvcnkpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY2F0Lmhhc0VsZW1lbnRzKCkpCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoY2F0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYXBhYmlsaXR5IGZvciB0aGUgbmF0dXJlIGlkCi0gICAgICovCi0gICAgcHVibGljIENhcGFiaWxpdHkgZ2V0Q2FwYWJpbGl0eUZvck5hdHVyZShTdHJpbmcgbmF0dXJlSWQpIHsKLSAgICAgICAgcmV0dXJuIChDYXBhYmlsaXR5KSBuYXR1cmVUb0NhcGFiaWxpdHkuZ2V0KG5hdHVyZUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNhcGFiaWxpdGllcyBpbiB0aGUgcmVnaXN0cnkKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldENhcGFiaWxpdGllcygpIHsKLSAgICAgICAgcmV0dXJuIGNhcGFiaWxpdGllczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hBZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICByZXR1cm4gY2FwYWJpbGl0aWVzLnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZW1iZXJzaGlwIHNldCBpZHMgdGhhdCB0aGUgc3BlY2lmaWVkCi0gICAgICogY2FwYWJpbGl0eSBiZWxvbmdzIHRvLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNZW1iZXJzaGlwU2V0SWRzKENhcGFiaWxpdHkgY2FwYWJpbGl0eSkgewotICAgICAgICBJUHJvamVjdE5hdHVyZURlc2NyaXB0b3IgZGVzYyA9IGNhcGFiaWxpdHkuZ2V0TmF0dXJlRGVzY3JpcHRvcigpOwotICAgICAgICBpZiAoZGVzYyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0lEX0xJU1Q7Ci0KLSAgICAgICAgcmV0dXJuIGRlc2MuZ2V0TmF0dXJlU2V0SWRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWlzY2VsbGFuZW91cyBjYXRlZ29yeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBDYXRlZ29yeSBnZXRNaXNjQ2F0ZWdvcnkoKSB7Ci0gICAgICAgIHJldHVybiBtaXNjQ2F0ZWdvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2FwYWJpbGl0eSBpZHMgdGhhdCBhcmUgcHJlcmVxdWlzaXRlcwotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgY2FwYWJpbGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJlcmVxdWlzaXRlSWRzKENhcGFiaWxpdHkgY2FwYWJpbGl0eSkgewotICAgICAgICBJUHJvamVjdE5hdHVyZURlc2NyaXB0b3IgZGVzYyA9IGNhcGFiaWxpdHkuZ2V0TmF0dXJlRGVzY3JpcHRvcigpOwotICAgICAgICBpZiAoZGVzYyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0lEX0xJU1Q7Ci0KLSAgICAgICAgU3RyaW5nW10gbmF0dXJlSWRzID0gZGVzYy5nZXRSZXF1aXJlZE5hdHVyZUlkcygpOwotICAgICAgICBpZiAobmF0dXJlSWRzLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0lEX0xJU1Q7Ci0KLSAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KG5hdHVyZUlkcy5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hdHVyZUlkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ2FwYWJpbGl0eSBjYXAgPSAoQ2FwYWJpbGl0eSkgbmF0dXJlVG9DYXBhYmlsaXR5LmdldChuYXR1cmVJZHNbaV0pOwotICAgICAgICAgICAgaWYgKGNhcCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGNhcC5nZXRJZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXN1bHRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRU1QVFlfSURfTElTVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGlkcyA9IG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldOwotICAgICAgICAgICAgcmVzdWx0cy50b0FycmF5KGlkcyk7Ci0gICAgICAgICAgICByZXR1cm4gaWRzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2FwYWJpbGl0aWVzIGFzc2lnbmVkIHRvIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotICAgICAqLwotICAgIHB1YmxpYyBDYXBhYmlsaXR5W10gZ2V0UHJvamVjdENhcGFiaWxpdGllcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuYXR1cmVJZHMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7Ci0gICAgICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QobmF0dXJlSWRzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hdHVyZUlkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIENhcGFiaWxpdHkgY2FwID0gKENhcGFiaWxpdHkpIG5hdHVyZVRvQ2FwYWJpbGl0eQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChuYXR1cmVJZHNbaV0pOwotICAgICAgICAgICAgICAgIGlmIChjYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYXAgPSBuZXcgQ2FwYWJpbGl0eShuYXR1cmVJZHNbaV0pOwotICAgICAgICAgICAgICAgICAgICBtYXBDYXBhYmlsaXR5KGNhcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGNhcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0NBUF9MSVNUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDYXBhYmlsaXR5W10gY2FwcyA9IG5ldyBDYXBhYmlsaXR5W3Jlc3VsdHMuc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICByZXN1bHRzLnRvQXJyYXkoY2Fwcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNhcHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0NBUF9MSVNUOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2FwYWJpbGl0aWVzIGFzc2lnbmVkIHRvIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotICAgICAqIHRoYXQgYXJlIGNvbnNpZGVlZCBkaXNhYmxlZCBieSBjb3JlLgotICAgICAqLwotICAgIHB1YmxpYyBDYXBhYmlsaXR5W10gZ2V0UHJvamVjdERpc2FibGVkQ2FwYWJpbGl0aWVzKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZ1tdIG5hdHVyZUlkcyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXROYXR1cmVJZHMoKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdChuYXR1cmVJZHMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmF0dXJlSWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9qZWN0LmlzTmF0dXJlRW5hYmxlZChuYXR1cmVJZHNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdHkgY2FwID0gKENhcGFiaWxpdHkpIG5hdHVyZVRvQ2FwYWJpbGl0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQobmF0dXJlSWRzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSBuZXcgQ2FwYWJpbGl0eShuYXR1cmVJZHNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFwQ2FwYWJpbGl0eShjYXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGNhcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVzdWx0cy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWV9DQVBfTElTVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ2FwYWJpbGl0eVtdIGNhcHMgPSBuZXcgQ2FwYWJpbGl0eVtyZXN1bHRzLnNpemUoKV07Ci0gICAgICAgICAgICAgICAgcmVzdWx0cy50b0FycmF5KGNhcHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBjYXBzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9DQVBfTElTVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVnaXN0cnkgY29udGFpbnMgYW55IGNhcGFiaWxpdGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYXBhYmlsaXRpZXMoKSB7Ci0gICAgICAgIHJldHVybiAhY2FwYWJpbGl0aWVzLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjYXBhYmlsaXR5IGhhcyBhbnkgcHJlcmVxdWlzaXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmVyZXF1aXNpdGVzKENhcGFiaWxpdHkgY2FwYWJpbGl0eSkgewotICAgICAgICByZXR1cm4gZ2V0UHJlcmVxdWlzaXRlSWRzKGNhcGFiaWxpdHkpLmxlbmd0aCA+IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgY2FwYWJpbGl0aWVzIGFuZCBjYXBhYmlsaXR5IGNhdGVnb3JpZXMgZnJvbSB0aGUgcGxhdGZvcm0ncyBwbHVnaW4KLSAgICAgKiByZWdpc3RyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2FkKCkgewotICAgICAgICBDYXBhYmlsaXR5UmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbmV3IENhcGFiaWxpdHlSZWdpc3RyeVJlYWRlcigpOwotICAgICAgICByZWFkZXIucmVhZChQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLCB0aGlzKTsKLSAgICAgICAgbWFwQ2FwYWJpbGl0aWVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFwcyBlYWNoIGNhcGFiaWxpdHkgaW4gdGhlIHJlZ2lzdHJ5IHRvIGEgcGFydGljdWxhciBjYXRlZ29yeS4KLSAgICAgKiBUaGUgY2F0ZWdvcnkgaXMgZGVmaW5lZCBpbiB4bWwuIElmIHRoZSBjYXBhYmlsaXR5J3MgY2F0ZWdvcnkgaXMKLSAgICAgKiBub3QgZm91bmQsIHRoZW4gdGhlIGNhcGFiaWxpdHkgaXMgYWRkZWQgdG8gdGhlICJtaXNjIiBjYXRlZ29yeS4KLSAgICAgKiA8cD4KLSAgICAgKiBNYXBzIGVhY2ggY2FwYWJpbGl0eSBpbiB0aGUgcmVnaXN0cnkgdG8gYSBwYXJ0aWN1bGFyIG5hdHVyZQotICAgICAqIGlkLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi92b2lkIG1hcENhcGFiaWxpdGllcygpIHsKLSAgICAgICAgbmF0dXJlVG9DYXBhYmlsaXR5ID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBJdGVyYXRvciBpdHIgPSBjYXBhYmlsaXRpZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0gICAgICAgICAgICBtYXBDYXBhYmlsaXR5KChDYXBhYmlsaXR5KSBpdHIubmV4dCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbWFwQ2FwYWJpbGl0eShDYXBhYmlsaXR5IGNhcCkgewotICAgICAgICAvLyBNYXAgdG8gY2F0ZWdvcnkKLSAgICAgICAgaWYgKCFjYXAuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBpZiAobWlzY0NhdGVnb3J5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgbWlzY0NhdGVnb3J5ID0gbmV3IENhdGVnb3J5KCk7Ci0gICAgICAgICAgICBtaXNjQ2F0ZWdvcnkuYWRkRWxlbWVudChjYXApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ2F0ZWdvcnkgY2F0ID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBjYXRQYXRoID0gY2FwLmdldENhdGVnb3J5UGF0aCgpOwotICAgICAgICAgICAgaWYgKGNhdFBhdGggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjYXQgPSBmaW5kQ2F0ZWdvcnkoY2F0UGF0aCk7Ci0gICAgICAgICAgICBpZiAoY2F0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYXQuYWRkRWxlbWVudChjYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobWlzY0NhdGVnb3J5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIG1pc2NDYXRlZ29yeSA9IG5ldyBDYXRlZ29yeSgpOwotICAgICAgICAgICAgICAgIG1pc2NDYXRlZ29yeS5hZGRFbGVtZW50KGNhcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYXAgdG8gbmF0dXJlIGlkCi0gICAgICAgIG5hdHVyZVRvQ2FwYWJpbGl0eS5wdXQoY2FwLmdldE5hdHVyZUlkKCksIGNhcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBmcm9tIHRoZSBjYXBhYmlsaXR5IGNvbGxlY3Rpb24gYWxsIGNhcGFiaWxpdGllcwotICAgICAqIHdob3NlIFVJIGlzIGhhbmRsZSBieSBhbm90aGVyIGNhcGFiaWxpdHkgaW4gdGhlIGNvbGxlY3Rpb24uCi0gICAgICogVGhlIHByb3ZpZGVkIGNvbGxlY3Rpb24gbXVzdCBiZSBpbiBwcm9wZXIgcHJlcmVxdWlzaXRlIG9yZGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYXBhYmlsaXRpZXMgdGhlIGNhcGFiaWxpdGllcyB0byBiZSBwcnVuZWQKLSAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBjYXBhYmlsaXRpZXMgcHJ1bmVkCi0gICAgICovCi0gICAgcHVibGljIENhcGFiaWxpdHlbXSBwcnVuZUNhcGFiaWxpdGllcyhDYXBhYmlsaXR5W10gY2FwYWJpbGl0aWVzKSB7Ci0gICAgICAgIEFycmF5TGlzdCBpZHMgPSBuZXcgQXJyYXlMaXN0KGNhcGFiaWxpdGllcy5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhcGFiaWxpdGllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGlkcy5hZGQoY2FwYWJpbGl0aWVzW2ldLmdldElkKCkpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgaGFuZGxlSWRzID0gY2FwYWJpbGl0aWVzW2ldLmdldEhhbmRsZVVJcygpOwotICAgICAgICAgICAgaWYgKGhhbmRsZUlkcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIGlkcy5yZW1vdmVBbGwoaGFuZGxlSWRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIHJlc3VsdHMgPSBuZXcgU3RyaW5nW2lkcy5zaXplKCldOwotICAgICAgICBpZHMudG9BcnJheShyZXN1bHRzKTsKLSAgICAgICAgcmV0dXJuIGZpbmRDYXBhYmlsaXRpZXMocmVzdWx0cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgdGhlIGNvbGxlY3Rpb24gaXMgdmFsaWQuIElmIHNvLCB0aGUgY29sbGVjdGlvbiBpcwotICAgICAqIG9yZGVyZWQgYmFzZWQgb24gcHJlcmVxdWlzaXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYXBhYmlsaXRpZXMgdGhlIGNhcGFiaWxpdGllcyB0byBiZSBjaGVja2VkIGFuZCBvcmRlcmVkCi0gICAgICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0gICAgICoJCXRoZSBnaXZlbiBzZXQgb2YgbmF0dXJlcyBpcyB2YWxpZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIAotICAgICAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIHNldC4gQWxzbywgdGhlCi0gICAgICogCQljb2xsZWN0aW9uIG9mIGNhcGFiaWxpdGllcyBzcGVjaWZpZWQgaXMgb3JkZXJlZCBiYXNlZCBvbgotICAgICAqIAkJcHJlcmVxdWlzaXRlLgotICAgICAqLwotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlQ2FwYWJpbGl0aWVzKENhcGFiaWxpdHlbXSBjYXBhYmlsaXRpZXMpIHsKLSAgICAgICAgU3RyaW5nIG5hdHVyZXNbXSA9IG5ldyBTdHJpbmdbY2FwYWJpbGl0aWVzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgbmF0dXJlc1tpXSA9IGNhcGFiaWxpdGllc1tpXS5nZXROYXR1cmVJZCgpOwotCi0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZU5hdHVyZVNldChuYXR1cmVzKTsKLSAgICAgICAgaWYgKHN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgIG5hdHVyZXMgPSB3b3Jrc3BhY2Uuc29ydE5hdHVyZVNldChuYXR1cmVzKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmF0dXJlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXNbaV0gPSAoQ2FwYWJpbGl0eSkgbmF0dXJlVG9DYXBhYmlsaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KG5hdHVyZXNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L0NhcGFiaWxpdHlSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9DYXBhYmlsaXR5UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhMTdlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L0NhcGFiaWxpdHlSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWFkIHByb2plY3QgY2FwYWJpbGl0aWVzIGFuZCBjYXBhYmlsaXR5Ci0gKiBjYXRlZ29yaWVzIGZyb20gdGhlIHBsYXRmb3JtJ3MgcGx1Z2luIHJlZ2lzdHJ5IGFuZCBzdG9yZSB0aGUgcmVzdWx0cyBpbgotICogYSBjYXBhYmlsaXR5IHJlZ2lzdHJ5LgotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgSURFUmVnaXN0cnlSZWFkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQQUJJTElUWSA9ICJjYXBhYmlsaXR5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSEFORExFX1VJID0gImhhbmRsZVVJIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QRVJTUEVDVElWRV9DSE9JQ0UgPSAicGVyc3BlY3RpdmVDaG9pY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBDYXBhYmlsaXR5UmVnaXN0cnkgY2FwYWJpbGl0eVJlZ2lzdHJ5OwotCi0gICAgcHJpdmF0ZSBDYXBhYmlsaXR5IGN1cnJlbnRDYXBhYmlsaXR5OwotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYW4gZWxlbWVudCBvZiB0aGUgcGx1Z2luIHJlZ2lzdHJ5IGFuZCBhZGRzIGl0IHRvIHRoZSBjYXBhYmlsaXR5Ci0gICAgICogcmVnaXN0cnkgaWYgaXQgaXMgYSBjYXBhYmlsaXR5IG9yIGNhdGVnb3J5IChvciBhIGhhbmRsZVVJIGVsZW1lbnQsIGEKLSAgICAgKiBjaGlsZCBvZiBhIGNhcGFiaWxpdHkuIEEgaGFuZGxlVUkgZWxlbWVudCByZXByZXNlbnRzIGFub3RoZXIgY2FwYWJpbGl0eQotICAgICAqIGZvciB3aGljaCB0aGlzIGNhcGFiaWxpdHkgY29udHJvbHMgdGhlIHVzZXIgaW50ZXJmYWNlKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotICAgICAgICBpZiAobmFtZS5lcXVhbHMoVEFHX0NBUEFCSUxJVFkpKQotICAgICAgICAgICAgcmV0dXJuIHJlYWRDYXBhYmlsaXR5KGVsZW1lbnQpOwotICAgICAgICBpZiAobmFtZS5lcXVhbHMoVEFHX0NBVEVHT1JZKSkKLSAgICAgICAgICAgIHJldHVybiByZWFkQ2F0ZWdvcnkoZWxlbWVudCk7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhUQUdfSEFORExFX1VJKSkKLSAgICAgICAgICAgIHJldHVybiByZWFkSGFuZGxlVUkoZWxlbWVudCk7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhUQUdfUEVSU1BFQ1RJVkVfQ0hPSUNFKSkKLSAgICAgICAgICAgIHJldHVybiByZWFkUGVyc3BlY3RpdmVDaG9pY2UoZWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyBhIGNhcGFiaWxpdHkgYW5kIGFkZHMgaXQgdG8gdGhlIGNhcGFiaWxpdHkgcmVnaXN0cnkuIFJlYWRzIGFsbAotICAgICAqIGNoaWxkcmVuIGVsZW1lbnRzICh3aGljaCB3aWxsIGJlIGhhbmRsZVVJIGVsZW1lbnRzKSBhcyB3ZWxsIGFuZCBhZGRzCi0gICAgICogdGhlbSB0byB0aGUgY2FwYWJpbGl0eS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVhZENhcGFiaWxpdHkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENhcGFiaWxpdHkgY2FwYWJpbGl0eSA9IG5ldyBDYXBhYmlsaXR5KGVsZW1lbnQsIHRoaXMpOwotICAgICAgICAgICAgY2FwYWJpbGl0eVJlZ2lzdHJ5LmFkZENhcGFiaWxpdHkoY2FwYWJpbGl0eSk7Ci0gICAgICAgICAgICBjdXJyZW50Q2FwYWJpbGl0eSA9IGNhcGFiaWxpdHk7Ci0gICAgICAgICAgICByZWFkRWxlbWVudENoaWxkcmVuKGVsZW1lbnQpOwotICAgICAgICAgICAgY3VycmVudENhcGFiaWxpdHkgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBjdXJyZW50Q2FwYWJpbGl0eSA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyBhIGNhcGFiaWxpdHkgY2F0ZWdvcnkgYW5kIGFkZHMgaXQgdG8gdGhlIGNhcGFiaWxpdHkgcmVnaXN0cnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlYWRDYXRlZ29yeShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBuZXcgQ2F0ZWdvcnkoZWxlbWVudCk7Ci0gICAgICAgICAgICBjYXBhYmlsaXR5UmVnaXN0cnkuYWRkQ2F0ZWdvcnkoY2F0ZWdvcnkpOwotICAgICAgICB9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbG9nIGFuIGVycm9yIHNpbmNlIGl0cyBub3Qgc2FmZSB0byBzaG93IGEgZGlhbG9nIGhlcmUKLSAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5sb2coCi0gICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIGNhcGFiaWxpdHkgY2F0ZWdvcnkuICIsIGUuZ2V0U3RhdHVzKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgaGFuZGxlVUkgZWxlbWVudHMuIFRoZXNlIGVsZW1lbnRzIGNvbnRhaW4gdGhlIGlkcyBvZiBvdGhlcgotICAgICAqIGNhcGFiaWxpdGllcy4gVGhlIGNhcGFiaWxpdHkgdGhhdCBpcyB0aGUgcGFyZW50IG9mIHRoZSBoYW5kbGVVSSBlbGVtZW50Ci0gICAgICogY29udHJvbHMgdGhlIHVzZXIgaW50ZXJmYWNlIGZvciB0aGUgY2FwYWJpbGl0aWVzIHdob3NlIGlkcyBhcmUgc3RvcmVkCi0gICAgICogaW4gdGhlIGhhbmRsZVVJIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlYWRIYW5kbGVVSShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBTdHJpbmcgY2FwYWJpbGl0eUlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQotICAgICAgICBpZiAoY2FwYWJpbGl0eUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0lEKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJyZW50Q2FwYWJpbGl0eSAhPSBudWxsKQotICAgICAgICAgICAgY3VycmVudENhcGFiaWxpdHkuYWRkSGFuZGxlVUkoY2FwYWJpbGl0eUlkKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgcGVyc3BlY3RpdmVDaG9pY2UgZWxlbWVudHMuIFRoZXNlIGVsZW1lbnRzIGNvbnRhaW4gdGhlIGlkcyBvZgotICAgICAqIHBlcnNwZWN0aXZlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVhZFBlcnNwZWN0aXZlQ2hvaWNlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIFN0cmluZyBwZXJzcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQotICAgICAgICBpZiAocGVyc3BJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9JRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3VycmVudENhcGFiaWxpdHkgIT0gbnVsbCkKLSAgICAgICAgICAgIGN1cnJlbnRDYXBhYmlsaXR5LmFkZFBlcnNwZWN0aXZlQ2hvaWNlKHBlcnNwSWQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyBwcm9qZWN0IGNhcGFiaWxpdGllcyBhbmQgY2FwYWJpbGl0eSBjYXRlZ29yaWVzIGZyb20gdGhlIHByb3ZpZGVkCi0gICAgICogcGx1Z2luIHJlZ2lzdHJ5IGFuZCBzdG9yZXMgdGhlbSBpbiB0aGUgcHJvdmlkZWQgY2FwYWJpbGl0eSByZWdpc3RyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkKElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgQ2FwYWJpbGl0eVJlZ2lzdHJ5IG91dCkgewotICAgICAgICBjYXBhYmlsaXR5UmVnaXN0cnkgPSBvdXQ7Ci0gICAgICAgIHJlYWRSZWdpc3RyeShyZWdpc3RyeSwgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLlBMX0NBUEFCSUxJVElFUyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9JREVSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9JREVSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjhlODljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvcmVnaXN0cnkvSURFUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogVGVtcGxhdGUgaW1wbGVtZW50YXRpb24gb2YgYSByZWdpc3RyeSByZWFkZXIgdGhhdCBjcmVhdGVzIG9iamVjdHMKLSAqIHJlcHJlc2VudGluZyByZWdpc3RyeSBjb250ZW50cy4gVHlwaWNhbGx5LCBhbiBleHRlbnNpb24KLSAqIGNvbnRhaW5zIG9uZSBlbGVtZW50LCBidXQgdGhpcyByZWFkZXIgaGFuZGxlcyBtdWx0aXBsZQotICogZWxlbWVudHMgcGVyIGV4dGVuc2lvbi4KLSAqCi0gKiBUbyBzdGFydCByZWFkaW5nIHRoZSBleHRlbnNpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciBhbgotICogZXh0ZW5zaW9uIHBvaW50LCBjYWxsIHRoZSBtZXRob2QgPGNvZGU+cmVhZFJlZ2lzdHJ5PC9jb2RlPi4KLSAqCi0gKiBUbyByZWFkIGNoaWxkcmVuIG9mIGFuIElDb25maWd1cmF0aW9uRWxlbWVudCwgY2FsbCB0aGUKLSAqIG1ldGhvZCA8Y29kZT5yZWFkRWxlbWVudENoaWxkcmVuPC9jb2RlPiBmcm9tIHlvdXIgaW1wbGVtZW50YXRpb24KLSAqIG9mIHRoZSBtZXRob2QgPGNvZGU+cmVhZEVsZW1lbnQ8L2NvZGU+LCBhcyBpdCB3aWxsIG5vdCBiZQotICogZG9uZSBieSBkZWZhdWx0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSURFUmVnaXN0cnlSZWFkZXIgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgSGFzaHRhYmxlIGV4dGVuc2lvblBvaW50cyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgY29tcGFyZXIgPSBuZXcgQ29tcGFyYXRvcigpIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotCQkJSUV4dGVuc2lvbiBpMSA9IChJRXh0ZW5zaW9uKSBhcmcwOwotCQkJU3RyaW5nIHMxID0gaTEuZ2V0TmFtZXNwYWNlKCk7Ci0JCQlJRXh0ZW5zaW9uIGkyID0gKElFeHRlbnNpb24pIGFyZzE7Ci0JCQlTdHJpbmcgczIgPSBpMi5nZXROYW1lc3BhY2UoKTsKLQkJCXJldHVybiBzMS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyKTsKLQkJfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElERVJlZ2lzdHJ5UmVhZGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGV4dHJhY3RzIGRlc2NyaXB0aW9uIGFzIGEgc3ViZWxlbWVudCBvZgotICAgICAqIHRoZSBnaXZlbiBlbGVtZW50LgotICAgICAqIEByZXR1cm4gZGVzY3JpcHRpb24gc3RyaW5nIGlmIGRlZmluZWQsIG9yIGVtcHR5IHN0cmluZwotICAgICAqIGlmIG5vdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oVEFHX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bMF0uZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvZ3MgdGhlIGVycm9yIGluIHRoZSB3b3JrYmVuY2ggbG9nIHVzaW5nIHRoZSBwcm92aWRlZAotICAgICAqIHRleHQgYW5kIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvZ0Vycm9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZCgiUGx1Z2luICIgKyBwbHVnaW5JZCArICIsIGV4dGVuc2lvbiAiIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOwotCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsvLyROT04tTkxTLTEkCi0JCUlERVdvcmtiZW5jaFBsdWdpbi5sb2coYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotICAgIC8qKgotICAgICAqIExvZ3MgYSB2ZXJ5IGNvbW1vbiByZWdpc3RyeSBlcnJvciB3aGVuIGEgcmVxdWlyZWQgYXR0cmlidXRlIGlzIG1pc3NpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwKLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIGxvZ0Vycm9yKGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgIlJlcXVpcmVkIGF0dHJpYnV0ZSAnIiArIGF0dHJpYnV0ZU5hbWUgKyAiJyBub3QgZGVmaW5lZCIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhIHZlcnkgY29tbW9uIHJlZ2lzdHJ5IGVycm9yIHdoZW4gYSByZXF1aXJlZCBjaGlsZCBpcyBtaXNzaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvZ01pc3NpbmdFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0gICAgICAgIGxvZ0Vycm9yKGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgIlJlcXVpcmVkIHN1YiBlbGVtZW50ICciICsgZWxlbWVudE5hbWUgKyAiJyBub3QgZGVmaW5lZCIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhIHJlZ2lzdHJ5IGVycm9yIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBpcyB1bmtub3duLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvZ1Vua25vd25FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIGxvZ0Vycm9yKGVsZW1lbnQsICJVbmtub3duIGV4dGVuc2lvbiB0YWcgZm91bmQ6ICIgKyBlbGVtZW50LmdldE5hbWUoKSk7Ly8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFwcGx5IGEgcmVwcm9kdWNhYmxlIG9yZGVyIHRvIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMKLSAgICAgKiBwcm92aWRlZCwgc3VjaCB0aGF0IHRoZSBvcmRlciB3aWxsIG5vdCBjaGFuZ2UgYXMKLSAgICAgKiBleHRlbnNpb25zIGFyZSBhZGRlZCBvciByZW1vdmVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJRXh0ZW5zaW9uW10gb3JkZXJFeHRlbnNpb25zKElFeHRlbnNpb25bXSBleHRlbnNpb25zKSB7Ci0gICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBvcmRlciBpcyBiYXNlZCBvbiBwbHVnaW4gaWQgc29ydGVkCi0gICAgICAgIC8vIGluIGFzY2VuZGluZyBvcmRlci4gVGhlIG9yZGVyIGZvciBhIHBsdWdpbiBwcm92aWRpbmcKLSAgICAgICAgLy8gbW9yZSB0aGFuIG9uZSBleHRlbnNpb24gZm9yIGFuIGV4dGVuc2lvbiBwb2ludCBpcwotICAgICAgICAvLyBkZXBlbmRlbnQgaW4gdGhlIG9yZGVyIGxpc3RlZCBpbiB0aGUgWE1MIGZpbGUuCi0gICAgICAgIElFeHRlbnNpb25bXSBzb3J0ZWRFeHRlbnNpb24gPSBuZXcgSUV4dGVuc2lvbltleHRlbnNpb25zLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZXh0ZW5zaW9ucywgMCwgc29ydGVkRXh0ZW5zaW9uLCAwLCBleHRlbnNpb25zLmxlbmd0aCk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoQXJyYXlzLmFzTGlzdChzb3J0ZWRFeHRlbnNpb24pLCBjb21wYXJlcik7Ci0gICAgICAgIHJldHVybiBzb3J0ZWRFeHRlbnNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJlYWQgZWxlbWVudCdzIGF0dHJpYnV0ZXMuCi0gICAgICogSWYgY2hpbGRyZW4gc2hvdWxkIGFsc28gYmUgcmVhZCwgdGhlbiBpbXBsZW1lbnRvcgotICAgICAqIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIDxjb2RlPnJlYWRFbGVtZW50Q2hpbGRyZW48L2NvZGU+LgotICAgICAqIEltcGxlbWVudG9yIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGxvZ2dpbmcgbWlzc2luZyAKLSAgICAgKiBhdHRyaWJ1dGVzLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgd2FzIHJlY29nbml6ZWQsIGZhbHNlIGlmIG5vdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4uIFRoaXMgaXMgY2FsbGVkIGJ5Ci0gICAgICogdGhlIHN1YmNsYXNzJyByZWFkRWxlbWVudCBtZXRob2Qgd2hlbiBpdCB3YW50cwotICAgICAqIHRvIHJlYWQgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50Q2hpbGRyZW4oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgcmVhZEVsZW1lbnRzKGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCBlYWNoIGVsZW1lbnQgb25lIGF0IGEgdGltZSBieSBjYWxsaW5nIHRoZQotICAgICAqIHN1YmNsYXNzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPnJlYWRFbGVtZW50PC9jb2RlPi4KLSAgICAgKgotICAgICAqIExvZ3MgYW4gZXJyb3IgaWYgdGhlIGVsZW1lbnQgd2FzIG5vdCByZWNvZ25pemVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50cyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKSkKLSAgICAgICAgICAgICAgICBsb2dVbmtub3duRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIG9uZSBleHRlbnNpb24gYnkgbG9vcGluZyB0aHJvdWdoIGl0cwotICAgICAqIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotICAgICAgICByZWFkRWxlbWVudHMoZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTdGFydCB0aGUgcmVnaXN0cnkgcmVhZGluZyBwcm9jZXNzIHVzaW5nIHRoZQotICAgICAqIHN1cHBsaWVkIHBsdWdpbiBJRCBhbmQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRSZWdpc3RyeShJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBwbHVnaW5JZCwKLSAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotICAgICAgICBTdHJpbmcgcG9pbnRJZCA9IHBsdWdpbklkICsgIi0iICsgZXh0ZW5zaW9uUG9pbnQ7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSAoSUV4dGVuc2lvbltdKSBleHRlbnNpb25Qb2ludHMuZ2V0KHBvaW50SWQpOwotICAgICAgICBpZiAoZXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUG9pbnQpOwotICAgICAgICAgICAgaWYgKHBvaW50ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLSAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBvcmRlckV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0gICAgICAgICAgICBleHRlbnNpb25Qb2ludHMucHV0KHBvaW50SWQsIGV4dGVuc2lvbnMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlYWRFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9NYXJrZXJIZWxwUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvcmVnaXN0cnkvTWFya2VySGVscFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NTM0YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9NYXJrZXJIZWxwUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VySGVscFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHJlZ2lzdHJ5IGZvciBtYXJrZXIgaGVscAotICogY29udGV4dHMgYW5kIHJlc29sdXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgTWFya2VySGVscFJlZ2lzdHJ5IGltcGxlbWVudHMgSU1hcmtlckhlbHBSZWdpc3RyeSB7Ci0gICAgLyoqCi0gICAgICogVGFibGUgb2YgcXVlcmllcyBmb3IgbWFya2VyIEYxIGhlbHAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgaGVscFF1ZXJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogU29ydGVkIGxpc3Qgb2YgaGVscCBxdWVyaWVzLgotICAgICAqIFVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlICJtb3N0IHNwZWNpZmljIgotICAgICAqIHF1ZXJ5IGlzIHRyaWVkIGZpcnN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IHNvcnRlZEhlbHBRdWVyaWVzOwotCi0gICAgLyoqCi0gICAgICogVGFibGUgb2YgcXVlcmllcyBmb3IgbWFya2VyIHJlc29sdXRpb25zCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgcmVzb2x1dGlvblF1ZXJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogSGVscCBjb250ZXh0IGlkIGF0dHJpYnV0ZSBpbiBjb25maWd1cmF0aW9uIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0hFTFAgPSAiaGVscENvbnRleHRJZCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFJlc29sdXRpb24gY2xhc3MgYXR0cmlidXRlIG5hbWUgaW4gY29uZmlndXJhdGlvbiBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgY2xhc3MgUXVlcnlDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFF1ZXJ5Q29tcGFyYXRvcikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBDb21wYXJhdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgICAgICAvLyBtb3JlIGF0dHJpYnVlcyBjb21lIGZpcnN0Ci0gICAgICAgICAgICBNYXJrZXJRdWVyeSBxMSA9IChNYXJrZXJRdWVyeSkgbzE7Ci0gICAgICAgICAgICBNYXJrZXJRdWVyeSBxMiA9IChNYXJrZXJRdWVyeSkgbzI7Ci0KLSAgICAgICAgICAgIGludCBzaXplMSA9IHExLmdldEF0dHJpYnV0ZXMoKS5sZW5ndGg7Ci0gICAgICAgICAgICBpbnQgc2l6ZTIgPSBxMi5nZXRBdHRyaWJ1dGVzKCkubGVuZ3RoOwotCi0gICAgICAgICAgICBpZiAoc2l6ZTEgPiBzaXplMikKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBpZiAoc2l6ZTEgPT0gc2l6ZTIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSU1hcmtlckhlbHBSZWdpc3RyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhlbHAoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgaWYgKHNvcnRlZEhlbHBRdWVyaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIFNldCBzZXQgPSBoZWxwUXVlcmllcy5rZXlTZXQoKTsKLSAgICAgICAgICAgIHNvcnRlZEhlbHBRdWVyaWVzID0gbmV3IEFycmF5TGlzdChzZXQuc2l6ZSgpKTsKLSAgICAgICAgICAgIHNvcnRlZEhlbHBRdWVyaWVzLmFkZEFsbChzZXQpOwotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRIZWxwUXVlcmllcywgbmV3IFF1ZXJ5Q29tcGFyYXRvcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJldHVybiB0aGUgZmlyc3QgbWF0Y2ggKHdlIGFzc3VtZSB0aGVyZSBpcyBvbmx5IG9uZSkKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc29ydGVkSGVscFF1ZXJpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBNYXJrZXJRdWVyeSBxdWVyeSA9IChNYXJrZXJRdWVyeSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBNYXJrZXJRdWVyeVJlc3VsdCByZXN1bHQgPSBxdWVyeS5wZXJmb3JtUXVlcnkobWFya2VyKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFNlZSBpZiBhIG1hdGNoaW5nIHJlc3VsdCBpcyByZWdpc3RlcmVkCi0gICAgICAgICAgICAgICAgTWFwIHJlc3VsdHNUYWJsZSA9IChNYXApIGhlbHBRdWVyaWVzLmdldChxdWVyeSk7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSByZXN1bHRzVGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbWF0Y2ggc28gcmV0dXJuIHRoZSBoZWxwIGNvbnRleHQgaWQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9IRUxQKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElNYXJrZXJIZWxwUmVnaXN0cnkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUmVzb2x1dGlvbnMoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgLy8gRGV0ZWN0IGEgbWF0Y2gKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb2x1dGlvblF1ZXJpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBNYXJrZXJRdWVyeSBxdWVyeSA9IChNYXJrZXJRdWVyeSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBNYXJrZXJRdWVyeVJlc3VsdCByZXN1bHQgPSBxdWVyeS5wZXJmb3JtUXVlcnkobWFya2VyKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFNlZSBpZiBhIG1hdGNoaW5nIHJlc3VsdCBpcyByZWdpc3RlcmVkCi0gICAgICAgICAgICAgICAgTWFwIHJlc3VsdHNUYWJsZSA9IChNYXApIHJlc29sdXRpb25RdWVyaWVzLmdldChxdWVyeSk7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSByZXN1bHRzVGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIElNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIGdlbmVyYXRvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgaWYgKFBsYXRmb3JtLmdldEJ1bmRsZShlbGVtZW50LmdldE5hbWVzcGFjZSgpKS5nZXRTdGF0ZSgpPT1CdW5kbGUuQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGVsZW1lbnQncyBwbHVnaW4gaXMgbG9hZGVkIHNvIHdlIGluc3RhbnRpYXRlIHRoZSByZXNvbHV0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvciA9IChJTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcikgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBpbnN0YW50aWF0ZSByZXNvbHV0aW9uIGdlbmVyYXRvciIsIGUuZ2V0U3RhdHVzKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdG9yIGluc3RhbmNlb2YgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKElNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yMikgZ2VuZXJhdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNSZXNvbHV0aW9ucyhtYXJrZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlclJlc29sdXRpb25bXSByZXNvbHV0aW9ucyA9IGdlbmVyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvbHV0aW9ucyhtYXJrZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbnMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSByZXNvbHV0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudCdzIHBsdWdpbiBpbiBub3QgbG9hZGVkIHNvIHdlIGFzc3VtZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBnZW5lcmF0b3Igd2lsbCBwcm9kdWNlIHJlc29sdXRpb25zIGZvciB0aGUgbWFya2VyCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJTWFya2VySGVscFJlZ2lzdHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBJTWFya2VyUmVzb2x1dGlvbltdIGdldFJlc29sdXRpb25zKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIC8vIENvbGxlY3QgYWxsIG1hdGNoZXMKLSAgICAgICAgQXJyYXlMaXN0IHJlc29sdXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvbHV0aW9uUXVlcmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0gICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE1hcmtlclF1ZXJ5IHF1ZXJ5ID0gKE1hcmtlclF1ZXJ5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIE1hcmtlclF1ZXJ5UmVzdWx0IHJlc3VsdCA9IHF1ZXJ5LnBlcmZvcm1RdWVyeShtYXJrZXIpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2VlIGlmIGEgbWF0Y2hpbmcgcmVzdWx0IGlzIHJlZ2lzdGVyZWQKLSAgICAgICAgICAgICAgICBNYXAgcmVzdWx0c1RhYmxlID0gKE1hcCkgcmVzb2x1dGlvblF1ZXJpZXMuZ2V0KHF1ZXJ5KTsKLSAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIHJlc3VsdHNUYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChyZXN1bHQpOwotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgZ2VuZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvciA9IChJTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcikgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gaW5zdGFudGlhdGUgcmVzb2x1dGlvbiBnZW5lcmF0b3IiLCBlLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlclJlc29sdXRpb25bXSBnZW5lcmF0ZWRSZXNvbHV0aW9ucyA9IGdlbmVyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb2x1dGlvbnMobWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2VuZXJhdGVkUmVzb2x1dGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9ucy5hZGQoZ2VuZXJhdGVkUmVzb2x1dGlvbnNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoSU1hcmtlclJlc29sdXRpb25bXSkgcmVzb2x1dGlvbnMKLSAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgSU1hcmtlclJlc29sdXRpb25bcmVzb2x1dGlvbnMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGhlbHAgcXVlcnkgdG8gdGhlIHJlZ2lzdHJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBxdWVyeSBhIG1hcmtlciBxdWVyeQotICAgICAqIEBwYXJhbSByZXN1bHQgYSByZXN1bHQgZm9yIHRoZSBnaXZlbiBxdWVyeQotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgZGVmaW5pbmcgdGhlIHJlc3VsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEhlbHBRdWVyeShNYXJrZXJRdWVyeSBxdWVyeSwgTWFya2VyUXVlcnlSZXN1bHQgcmVzdWx0LAotICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQotICAgICAgICBhZGRRdWVyeShoZWxwUXVlcmllcywgcXVlcnksIHJlc3VsdCwgZWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlc29sdXRpb24gcXVlcnkgdG8gdGhlIHJlZ2lzdHJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBxdWVyeSBhIG1hcmtlciBxdWVyeQotICAgICAqIEBwYXJhbSByZXN1bHQgYSByZXN1bHQgZm9yIHRoZSBnaXZlbiBxdWVyeQotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgZGVmaW5pbmcgdGhlIHJlc3VsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlc29sdXRpb25RdWVyeShNYXJrZXJRdWVyeSBxdWVyeSwgTWFya2VyUXVlcnlSZXN1bHQgcmVzdWx0LAotICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQotICAgICAgICBhZGRRdWVyeShyZXNvbHV0aW9uUXVlcmllcywgcXVlcnksIHJlc3VsdCwgZWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHF1ZXJ5IHRvIHRoZSBnaXZlbiB0YWJsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIHdoaWNoIHRoZSBxdWVyeSBpcyBhZGRlZAotICAgICAqIEBwYXJhbSBxdWVyeSBhIG1hcmtlciBxdWVyeQotICAgICAqIEBwYXJhbSByZXN1bHQgYSByZXN1bHQgZm9yIHRoZSBnaXZlbiBxdWVyeQotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgZGVmaW5pbmcgdGhlIHJlc3VsdAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRRdWVyeShNYXAgdGFibGUsIE1hcmtlclF1ZXJ5IHF1ZXJ5LAotICAgICAgICAgICAgTWFya2VyUXVlcnlSZXN1bHQgcmVzdWx0LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCi0gICAgICAgIC8vIFNlZSBpZiB0aGUgcXVlcnkgaXMgYWxyZWFkeSBpbiB0aGUgdGFibGUKLSAgICAgICAgTWFwIHJlc3VsdHMgPSAoTWFwKSB0YWJsZS5nZXQocXVlcnkpOwotICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcmVzdWx0cyB0YWJsZQotICAgICAgICAgICAgcmVzdWx0cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCB0aGUgcXVlcnkgdG8gdGhlIHRhYmxlCi0gICAgICAgICAgICB0YWJsZS5wdXQocXVlcnksIHJlc3VsdHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBuZXcgcmVzdWx0Ci0gICAgICAgIHJlc3VsdHMucHV0KHJlc3VsdCwgZWxlbWVudCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L01hcmtlckhlbHBSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9NYXJrZXJIZWxwUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlM2Q2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L01hcmtlckhlbHBSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWFkIG1hcmtlciBoZWxwIGNvbnRleHQgaWRzIGFuZCAKLSAqIHJlc29sdXRpb25zIGZyb20gdGhlIHBsYXRmb3JtIHJlZ2lzdHJ5LgotICovCi1wdWJsaWMgY2xhc3MgTWFya2VySGVscFJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgSURFUmVnaXN0cnlSZWFkZXIgewotICAgIHByaXZhdGUgTWFya2VySGVscFJlZ2lzdHJ5IG1hcmtlckhlbHBSZWdpc3RyeTsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGN1cnJlbnRBdHRyaWJ1dGVOYW1lczsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGN1cnJlbnRBdHRyaWJ1dGVWYWx1ZXM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0hFTFAgPSAibWFya2VySGVscCI7Ly8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVNPTFVUSU9OX0dFTkVSQVRPUiA9ICJtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIjsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOy8vJE5PTi1OTFMtMSQgCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RZUEUgPSAibWFya2VyVHlwZSI7Ly8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVkFMVUUgPSAidmFsdWUiOy8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWFya2VyIGhlbHAgdGhhdCBpcyBkZWZpbmVkIGluIHRoZSBwbHVnaW4gcmVnaXN0cnkKLSAgICAgKiBhbmQgYWRkIGl0IHRvIHRoZSBnaXZlbiBtYXJrZXIgaGVscCByZWdpc3RyeS4KLSAgICAgKiA8cD4KLSAgICAgKiBXYXJuaW5nOgotICAgICAqIFRoZSBtYXJrZXIgaGVscCByZWdpc3RyeSBtdXN0IGJlIHBhc3NlZCBpbiBiZWNhdXNlIHRoaXMgCi0gICAgICogbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgdGhlIHByb2Nlc3Mgb2Ygc2V0dGluZyB1cCB0aGUgCi0gICAgICogbWFya2VyIGhlbHAgcmVnaXN0cnkgYW5kIGF0IHRoaXMgdGltZSBpdCBoYXMgbm90IGJlZW4KLSAgICAgKiBzYWZlbHkgc2V0dXAgd2l0aCB0aGUgcGx1Z2luLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRIZWxwKE1hcmtlckhlbHBSZWdpc3RyeSByZWdpc3RyeSkgewotICAgICAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgICBtYXJrZXJIZWxwUmVnaXN0cnkgPSByZWdpc3RyeTsKLSAgICAgICAgcmVhZFJlZ2lzdHJ5KGV4dGVuc2lvblJlZ2lzdHJ5LCBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4uUExfTUFSS0VSX0hFTFApOwotICAgICAgICByZWFkUmVnaXN0cnkoZXh0ZW5zaW9uUmVnaXN0cnksIElERVdvcmtiZW5jaFBsdWdpbi5JREVfV09SS0JFTkNILAotICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5QTF9NQVJLRVJfUkVTT0xVVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIG9uZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgb3IgY2hpbGQgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19IRUxQKSkgewotICAgICAgICAgICAgcmVhZEhlbHBFbGVtZW50KGVsZW1lbnQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfUkVTT0xVVElPTl9HRU5FUkFUT1IpKSB7Ci0gICAgICAgICAgICByZWFkUmVzb2x1dGlvbkVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19BVFRSSUJVVEUpKSB7Ci0gICAgICAgICAgICByZWFkQXR0cmlidXRlRWxlbWVudChlbGVtZW50KTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBoZWxwIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZEhlbHBFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIC8vIHJlYWQgdHlwZQotICAgICAgICBTdHJpbmcgdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKTsKLQotICAgICAgICAvLyByZWFkIGF0dHJpYnV0ZXMgYW5kIHZhbHVlcwotICAgICAgICBjdXJyZW50QXR0cmlidXRlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHJlYWRFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgICAgIFN0cmluZ1tdIGF0dHJpYnV0ZU5hbWVzID0gKFN0cmluZ1tdKSBjdXJyZW50QXR0cmlidXRlTmFtZXMKLSAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgU3RyaW5nW2N1cnJlbnRBdHRyaWJ1dGVOYW1lcy5zaXplKCldKTsKLSAgICAgICAgU3RyaW5nW10gYXR0cmlidXRlVmFsdWVzID0gKFN0cmluZ1tdKSBjdXJyZW50QXR0cmlidXRlVmFsdWVzCi0gICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IFN0cmluZ1tjdXJyZW50QXR0cmlidXRlVmFsdWVzLnNpemUoKV0pOwotCi0gICAgICAgIC8vIGFkZCBxdWVyeSB0byB0aGUgcmVnaXN0cnkKLSAgICAgICAgTWFya2VyUXVlcnkgcXVlcnkgPSBuZXcgTWFya2VyUXVlcnkodHlwZSwgYXR0cmlidXRlTmFtZXMpOwotICAgICAgICBNYXJrZXJRdWVyeVJlc3VsdCByZXN1bHQgPSBuZXcgTWFya2VyUXVlcnlSZXN1bHQoYXR0cmlidXRlVmFsdWVzKTsKLSAgICAgICAgbWFya2VySGVscFJlZ2lzdHJ5LmFkZEhlbHBRdWVyeShxdWVyeSwgcmVzdWx0LCBlbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSByZXNvbHV0aW9uIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZFJlc29sdXRpb25FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIC8vIHJlYWQgdHlwZQotICAgICAgICBTdHJpbmcgdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKTsKLQotICAgICAgICAvLyByZWFkIGF0dHJpYnV0ZXMgYW5kIHZhbHVlcwotICAgICAgICBjdXJyZW50QXR0cmlidXRlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHJlYWRFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgICAgIFN0cmluZ1tdIGF0dHJpYnV0ZU5hbWVzID0gKFN0cmluZ1tdKSBjdXJyZW50QXR0cmlidXRlTmFtZXMKLSAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgU3RyaW5nW2N1cnJlbnRBdHRyaWJ1dGVOYW1lcy5zaXplKCldKTsKLSAgICAgICAgU3RyaW5nW10gYXR0cmlidXRlVmFsdWVzID0gKFN0cmluZ1tdKSBjdXJyZW50QXR0cmlidXRlVmFsdWVzCi0gICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IFN0cmluZ1tjdXJyZW50QXR0cmlidXRlVmFsdWVzLnNpemUoKV0pOwotCi0gICAgICAgIC8vIGFkZCBxdWVyeSB0byB0aGUgcmVnaXN0cnkKLSAgICAgICAgTWFya2VyUXVlcnkgcXVlcnkgPSBuZXcgTWFya2VyUXVlcnkodHlwZSwgYXR0cmlidXRlTmFtZXMpOwotICAgICAgICBNYXJrZXJRdWVyeVJlc3VsdCByZXN1bHQgPSBuZXcgTWFya2VyUXVlcnlSZXN1bHQoYXR0cmlidXRlVmFsdWVzKTsKLSAgICAgICAgbWFya2VySGVscFJlZ2lzdHJ5LmFkZFJlc29sdXRpb25RdWVyeShxdWVyeSwgcmVzdWx0LCBlbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYW4gYXR0cmlidXRlIHN1YiBlbGVtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkQXR0cmlidXRlRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1ZBTFVFKTsKLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlTmFtZXMuYWRkKG5hbWUpOwotICAgICAgICAgICAgY3VycmVudEF0dHJpYnV0ZVZhbHVlcy5hZGQodmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L01hcmtlckltYWdlUHJvdmlkZXJSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9NYXJrZXJJbWFnZVByb3ZpZGVyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZjNDI2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L01hcmtlckltYWdlUHJvdmlkZXJSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JTWFya2VySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIGEgbWFya2VyIGltYWdlIHJlZ2lzdHJ5IHdoaWNoIG1hcHMgZWl0aGVyCi0gKiBhIG1hcmtlciB0eXBlIHRvIGEgcHJvdmlkZXIgb3IgdG8gYSBzdGF0aWMgaW1hZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrZXJJbWFnZVByb3ZpZGVyUmVnaXN0cnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFJPVklERVJfQ0xBU1MgPSAiY2xhc3MiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUNPTiA9ICJpY29uIjsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX01BUktFUl9UWVBFID0gIm1hcmtlcnR5cGUiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfQVRUX0tFWSA9ICJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5NYXJrZXJJbWFnZVByb3ZpZGVyUmVnaXN0cnkiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJPVklERVIgPSAiaW1hZ2Vwcm92aWRlciI7Ly8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBjbGFzcyBEZXNjcmlwdG9yIHsKLSAgICAgICAgU3RyaW5nIGlkOwotCi0gICAgICAgIFN0cmluZyBtYXJrZXJUeXBlOwotCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWU7Ci0KLSAgICAgICAgU3RyaW5nIGltYWdlUGF0aDsKLQotICAgICAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yOwotCi0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0gICAgICAgIEJ1bmRsZSBwbHVnaW5CdW5kbGU7Ci0KLSAgICAgICAgSU1hcmtlckltYWdlUHJvdmlkZXIgcHJvdmlkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGlzIG5ldyBNYXJrZXJJbWFnZVByb3ZpZGVyUmVnaXN0cnkuCi0gICAgICovCi0gICAgcHVibGljIE1hcmtlckltYWdlUHJvdmlkZXJSZWdpc3RyeSgpIHsKLSAgICAgICAgY2xhc3MgTWFya2VySW1hZ2VSZWFkZXIgZXh0ZW5kcyBJREVSZWdpc3RyeVJlYWRlciB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX1BST1ZJREVSKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRQcm92aWRlcihlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0gICAgICAgICAgICAgICAgcmVhZFJlZ2lzdHJ5KFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5QTF9NQVJLRVJfSU1BR0VfUFJPVklERVIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbmV3IE1hcmtlckltYWdlUmVhZGVyKCkucmVhZFJlZ2lzdHJ5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGRlc2NyaXB0b3IgZm9yIHRoZSBtYXJrZXIgcHJvdmlkZXIgZXh0ZW5zaW9uCi0gICAgICogYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBwcm92aWRlcnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUHJvdmlkZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IoKTsKLSAgICAgICAgZGVzYy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgZGVzYy5wbHVnaW5CdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGRlc2MuaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotICAgICAgICBkZXNjLm1hcmtlclR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTUFSS0VSX1RZUEUpOwotICAgICAgICBkZXNjLmltYWdlUGF0aCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JQ09OKTsKLSAgICAgICAgZGVzYy5jbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJPVklERVJfQ0xBU1MpOwotICAgICAgICBpZiAoZGVzYy5pbWFnZVBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgZGVzYy5pbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZURlc2NyaXB0b3IoZGVzYyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlc2MuY2xhc3NOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vRG9uJ3QgbmVlZCB0byBrZWVwIHRoZXNlIHJlZmVyZW5jZXMuCi0gICAgICAgICAgICBkZXNjLmVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgZGVzYy5wbHVnaW5CdW5kbGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGRlc2NyaXB0b3JzLmFkZChkZXNjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldEltYWdlRGVzY3JpcHRvcihPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgaW50IHNpemUgPSBkZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgZGVzY3JpcHRvcnMuZ2V0KGkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAobWFya2VyLmlzU3VidHlwZU9mKGRlc2MubWFya2VyVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MuY2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCWlmIChkZXNjLnBsdWdpbkJ1bmRsZS5nZXRTdGF0ZSgpPT1CdW5kbGUuQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLSBHZXQgdGhlIGltYWdlIGRlc2NyaXB0b3IgZnJvbSB0aGUgcHJvdmlkZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLSBTYXZlIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHVybCBhcyBhIHBlcnNpc3RhYmxlIHByb3BlcnR5LCBzbyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pbWFnZSBkZXNjcmlwdG9yIGNhbiBiZSBjcmVhdGVkIHdpdGhvdXQgYWN0aXZhdGluZyB0aGUgcGx1Z2luIG5leHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RpbWUgdGhlIHdvcmtiZW5jaCBpcyBzdGFydGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLnByb3ZpZGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MucHJvdmlkZXIgPSAoSU1hcmtlckltYWdlUHJvdmlkZXIpIElERVdvcmtiZW5jaFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVFeHRlbnNpb24oZGVzYy5lbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUX1BST1ZJREVSX0NMQVNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRlc2MucHJvdmlkZXIuZ2V0SW1hZ2VQYXRoKG1hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gZGVzYy5pbWFnZVBhdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5pbWFnZVBhdGggPSBwYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihkZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MuaW1hZ2VEZXNjcmlwdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy5pbWFnZURlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ3JlYXRlIGEgaW1hZ2UgZGVzY3JpcHRvciB0byBiZSB1c2VkIHVudGlsIHRoZSBwbHVnaW4gZ2V0cyBhY3RpdmF0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuaW1hZ2VQYXRoID0gKFN0cmluZykgbWFya2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShNQVJLRVJfQVRUX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy5pbWFnZURlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzYy5pbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MuaW1hZ2VEZXNjcmlwdG9yOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TG9nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5sb2coCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVVJLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gY3JlYXRpbmcgaW1hZ2UgZGVzY3JpcHRvciBmb3I6ICIgKyBkZXNjLm1hcmtlclR5cGUsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIHJlbGF0aXZlIHBhdGguCi0gICAgICovCi0gICAgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihEZXNjcmlwdG9yIGRlc2MpIHsKLSAgICAgICBVUkwgdXJsID0gUGxhdGZvcm0uZmluZChkZXNjLnBsdWdpbkJ1bmRsZSwgbmV3IFBhdGgoZGVzYy5pbWFnZVBhdGgpKTsKLSAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L01hcmtlclF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L01hcmtlclF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNWY0YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9NYXJrZXJRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgaG9sZCBhIG1hcmtlciB0eXBlIGlkIGFuZC9vciAKLSAqIGEgc2VyaWVzIG9mIG1hcmtlciBhdHRyaWJ1dGVzLiBUaGlzIGluZm9ybWF0aW9uIG1heSBiZSB1c2VkIAotICogdG8gZGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gbWFya2VyIGlzIG9mIHRoZSBzYW1lIG1hcmtlcgotICogdHlwZSBhbmQgZGV0ZXJtaW5lIGl0cyB2YWx1ZXMgZm9yIHRoZSBhdHRyaWJ1dGVzLgotICovCi1wdWJsaWMgY2xhc3MgTWFya2VyUXVlcnkgewotICAgIC8qKgotICAgICAqIFRoZSBtYXJrZXIgdHlwZSB0YXJnZXR0ZWQgYnkgdGhpcyBxdWVyeS4gCi0gICAgICogTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBBIHNvcnRlZCBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRhcmdldHRlZCBieSB0aGlzIHF1ZXJ5LgotICAgICAqIFRoZSBsaXN0IGlzIHNvcnRlZCBmcm9tIGxlYXN0IHRvIGdyZWF0ZXN0IGFjY29yZGluZyB0bwotICAgICAqIDxjb2RlPlN0aW5nLmNvbXBhcmU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBhdHRyaWJ1dGVzOwotCi0gICAgLyoqCi0gICAgICogQ2FjaGVkIGhhc2ggY29kZSB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgaW50IGhhc2hDb2RlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBtYXJrZXIgcXVlcnkgd2l0aCB0aGUgZ2l2ZW4gdHlwZQotICAgICAqIGFuZCBhdHRyaWJ1dGVzLgotICAgICAqIDxwPgotICAgICAqIFRoZSB0eXBlIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIGF0dHJpYnV0ZXMgbWF5IAotICAgICAqIGJlIGVtcHR5LCBidXQgbm90IDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFya2VyVHlwZSB0aGUgdGFyZ2V0dGVkIG1hcmtlciB0eXBlCi0gICAgICogQHBhcmFtIG1hcmtlckF0dHJpYnV0ZXMgdGhlIHRhcmdldHRlZCBtYXJrZXIgYXR0cmlidXRlcwotICAgICAqLwotICAgIHB1YmxpYyBNYXJrZXJRdWVyeShTdHJpbmcgbWFya2VyVHlwZSwgU3RyaW5nW10gbWFya2VyQXR0cmlidXRlcykgewotICAgICAgICBpZiAobWFya2VyQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0eXBlID0gbWFya2VyVHlwZTsKLSAgICAgICAgYXR0cmlidXRlcyA9IG1hcmtlckF0dHJpYnV0ZXM7Ci0gICAgICAgIGNvbXB1dGVIYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGEgcXVlcnkgYWdhaW5zdCB0aGUgZ2l2ZW4gbWFya2VyLgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgYSA8Y29kZT5NYXJrZXJRdWVyeVJlc3VsdDwvY29kZT4gaWYgdGhlIG1hcmtlcgotICAgICAqIGlzIGFwcHJvcHJpYXRlIGZvciB0aGlzIHF1ZXJ5IChjb3JyZWN0IHR5cGUgYW5kIGhhcwotICAgICAqIGFsbCBvZiB0aGUgcXVlcnkgYXR0cmlidXRlcyksIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXJrZXIgdGhlIG1hcmtlciB0byBwZXJmb3JtIHRoZSBxdWVyeSBhZ2FpbnN0Ci0gICAgICogQHJldHVybiBhIG1hcmtlciBxdWVyeSByZXN1bHQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFya2VyUXVlcnlSZXN1bHQgcGVyZm9ybVF1ZXJ5KElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIC8vIENoZWNrIHR5cGUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgIXR5cGUuZXF1YWxzKG1hcmtlci5nZXRUeXBlKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAubG9nKCJFcnJvciBhY2Nlc3NpbmcgbWFya2VyIHR5cGUiLCBlLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBhdHRyaWJ1dGVzCi0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbYXR0cmlidXRlcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVzW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5sb2coCi0gICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgYWNjZXNzaW5nIG1hcmtlciBhdHRyaWJ1dGUiLCBlLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gdGhlIHJlc3VsdAotICAgICAgICByZXR1cm4gbmV3IE1hcmtlclF1ZXJ5UmVzdWx0KHZhbHVlcyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXJrZXJRdWVyeSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG8gPT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIE1hcmtlclF1ZXJ5IG1xID0gKE1hcmtlclF1ZXJ5KSBvOwotICAgICAgICBpZiAoISh0eXBlID09IG51bGwgPyBtcS50eXBlID09IG51bGwgOiB0eXBlLmVxdWFscyhtcS50eXBlKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMubGVuZ3RoICE9IG1xLmF0dHJpYnV0ZXMubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCEoYXR0cmlidXRlc1tpXS5lcXVhbHMobXEuYXR0cmlidXRlc1tpXSkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gT2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBoYXNoQ29kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wdXRlcyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVIYXNoQ29kZSgpIHsKLSAgICAgICAgaGFzaENvZGUgPSAxOTsKLQotICAgICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgICAgICAgaGFzaENvZGUgPSBoYXNoQ29kZSAqIDM3ICsgdHlwZS5oYXNoQ29kZSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaGFzaENvZGUgPSBoYXNoQ29kZSAqIDM3ICsgYXR0cmlidXRlc1tpXS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGFyZ2V0dGVkIG1hcmtlciB0eXBlLiBNYXkgYmUgCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0YXJnZXR0ZWQgbWFya2VyIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRhcmdldHRlZCBhdHRyaWJ1dGVzLgotICAgICAqIFRoZSBhcnJheSBtYXkgYmUgZW1wdHkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGFyZ2V0dGVkIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L01hcmtlclF1ZXJ5UmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L01hcmtlclF1ZXJ5UmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMGY3NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9NYXJrZXJRdWVyeVJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeTsKLQotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgdGhlIHJlc3VsdCBvZiBhIHNwZWNpZmljIG1hcmtlcgotICogcXVlcnkuIFNwZWNpZmljYWxseSB0aGV5IGNvbnRhaW4gYW4gb3JkZXJlZCBjb2xsZWN0aW9uIG9mIG1hcmtlciAKLSAqIGF0dHJpYnV0ZSB2YWx1ZXMuCi0gKi8KLQotcHVibGljIGNsYXNzIE1hcmtlclF1ZXJ5UmVzdWx0IHsKLSAgICAvKioKLSAgICAgKiBBbiBvcmRlcmVkIGNvbGxlY3Rpb24gb2YgbWFya2VyIGF0dHJpYnV0ZSB2YWx1ZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSB2YWx1ZXM7Ci0KLSAgICAvKioKLSAgICAgKiBDYWNoZWQgaGFzaCBjb2RlIHZhbHVlCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgaGFzaENvZGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG1hcmtlciBxdWVyeSByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZXMgbWF5IG5vdCBiZSBlbXB0eS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG1hcmtlckF0dHJpYnV0ZVZhbHVlcyB0aGUgdGFyZ2V0IG1hcmtlcidzIGF0dHJpYnV0ZSB2YWx1ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFya2VyUXVlcnlSZXN1bHQoU3RyaW5nW10gbWFya2VyQXR0cmlidXRlVmFsdWVzKSB7Ci0gICAgICAgIGlmIChtYXJrZXJBdHRyaWJ1dGVWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHZhbHVlcyA9IG1hcmtlckF0dHJpYnV0ZVZhbHVlczsKLSAgICAgICAgY29tcHV0ZUhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXJrZXJRdWVyeVJlc3VsdCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG8gPT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIE1hcmtlclF1ZXJ5UmVzdWx0IG1xciA9IChNYXJrZXJRdWVyeVJlc3VsdCkgbzsKLSAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggIT0gbXFyLnZhbHVlcy5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghKHZhbHVlc1tpXS5lcXVhbHMobXFyLnZhbHVlc1tpXSkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gT2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBoYXNoQ29kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wdXRlcyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVIYXNoQ29kZSgpIHsKLSAgICAgICAgaGFzaENvZGUgPSAxOTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaGFzaENvZGUgPSBoYXNoQ29kZSAqIDM3ICsgdmFsdWVzW2ldLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L1BlcnNwZWN0aXZlUGFyYW1ldGVyVmFsdWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L1BlcnNwZWN0aXZlUGFyYW1ldGVyVmFsdWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYzZlMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9QZXJzcGVjdGl2ZVBhcmFtZXRlclZhbHVlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JUGFyYW1ldGVyVmFsdWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotCi0vKioKLSAqIFByb3ZpZGVzIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgc2hvdyBwZXJzcGVjdGl2ZSBjb21tYW5kLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQZXJzcGVjdGl2ZVBhcmFtZXRlclZhbHVlcyBpbXBsZW1lbnRzIElQYXJhbWV0ZXJWYWx1ZXMgewotCi0JcHVibGljIGZpbmFsIE1hcCBnZXRQYXJhbWV0ZXJWYWx1ZXMoKSB7Ci0JCWZpbmFsIE1hcCB2YWx1ZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWZpbmFsIElQZXJzcGVjdGl2ZURlc2NyaXB0b3JbXSBwZXJzcGVjdGl2ZXMgPSBXb3JrYmVuY2hQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKS5nZXRQZXJzcGVjdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJzcGVjdGl2ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyc3BlY3RpdmUgPSBwZXJzcGVjdGl2ZXNbaV07Ci0JCQl2YWx1ZXMucHV0KHBlcnNwZWN0aXZlLmdldExhYmVsKCksIHBlcnNwZWN0aXZlLmdldElkKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L1Byb2plY3RJbWFnZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L1Byb2plY3RJbWFnZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYjUwZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9Qcm9qZWN0SW1hZ2VSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi0vKioKLSAqIFJlZ2lzdHJ5IHRvIGhvbGQgbWFwcGluZ3MgZnJvbSBwcm9qZWN0IG5hdHVyZXMgdG8gaW1hZ2VzCi0gKi8KLQotcHVibGljIGNsYXNzIFByb2plY3RJbWFnZVJlZ2lzdHJ5IHsKLSAgICBwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgxMCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGdpdmVuIG5hdHVyZSBpZCBvcgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGltYWdlIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBpZAotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0TmF0dXJlSW1hZ2UoU3RyaW5nIG5hdHVyZUlkKSB7Ci0gICAgICAgIHJldHVybiAoSW1hZ2VEZXNjcmlwdG9yKSBtYXAuZ2V0KG5hdHVyZUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyBmcm9tIHRoZSBwbHVnaW4gcmVnaXN0cnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9hZCgpIHsKLSAgICAgICAgUHJvamVjdEltYWdlUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbmV3IFByb2plY3RJbWFnZVJlZ2lzdHJ5UmVhZGVyKCk7Ci0gICAgICAgIHJlYWRlci5yZWFkUHJvamVjdE5hdHVyZUltYWdlcyhQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbWFnZSBmb3IgdGhlIGdpdmVuIG5hdHVyZSBpZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hdHVyZUltYWdlKFN0cmluZyBuYXR1cmVJZCwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKSB7Ci0gICAgICAgIG1hcC5wdXQobmF0dXJlSWQsIGltYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L1Byb2plY3RJbWFnZVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3JlZ2lzdHJ5L1Byb2plY3RJbWFnZVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNjBhNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS9yZWdpc3RyeS9Qcm9qZWN0SW1hZ2VSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBBIHN0cmF0ZWd5IHRvIHByb2plY3QgbmF0dXJlIGltYWdlIGV4dGVuc2lvbnMgZnJvbSB0aGUgcmVnaXN0cnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0SW1hZ2VSZWdpc3RyeVJlYWRlciBleHRlbmRzIElERVJlZ2lzdHJ5UmVhZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lNQUdFID0gImltYWdlIjsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BVFVSRV9JRCA9ICJuYXR1cmVJZCI7Ly8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JQ09OID0gImljb24iOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgUHJvamVjdEltYWdlUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfSU1BR0UpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0gICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9JRCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBuYXR1cmVJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQVRVUkVfSUQpOwotICAgICAgICBpZiAobmF0dXJlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfTkFUVVJFX0lEKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGljb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUNPTik7Ci0gICAgICAgIGlmIChpY29uID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0lDT04pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQkJU3RyaW5nIGV4dGVuZGluZ1BsdWdpbklkID0gZWxlbWVudC5nZXROYW1lc3BhY2UoKTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAotCQkJCWV4dGVuZGluZ1BsdWdpbklkLCBpY29uKTsKLQotICAgICAgICBpZiAoaW1hZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlZ2lzdHJ5LnNldE5hdHVyZUltYWdlKG5hdHVyZUlkLCBpbWFnZSk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgcHJvamVjdCBuYXR1cmUgaW1hZ2VzIHdpdGhpbiBhIHJlZ2lzdHJ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWRQcm9qZWN0TmF0dXJlSW1hZ2VzKElFeHRlbnNpb25SZWdpc3RyeSBpbiwKLSAgICAgICAgICAgIFByb2plY3RJbWFnZVJlZ2lzdHJ5IG91dCkgewotICAgICAgICByZWdpc3RyeSA9IG91dDsKLSAgICAgICAgcmVhZFJlZ2lzdHJ5KGluLCBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwKLSAgICAgICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4uUExfUFJPSkVDVF9OQVRVUkVfSU1BR0VTKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3VwZGF0ZS9Db25maWd1cmF0aW9uTWFuYWdlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS91cGRhdGUvQ29uZmlndXJhdGlvbk1hbmFnZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0M2NmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvaWRlL3VwZGF0ZS9Db25maWd1cmF0aW9uTWFuYWdlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS51cGRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5VcGRhdGVNYW5hZ2VyVUk7Ci0KLS8qKgotICogQWN0aW9uIHRvIGludm9rZSB0aGUgVXBkYXRlIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbk1hbmFnZXJBY3Rpb24gaW1wbGVtZW50cwotICAgICAgICBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbk1hbmFnZXJBY3Rpb24oKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIHRoZSBhY3Rpb24gd2hlbiBzZWxlY3RlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZSh3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBVcGRhdGVNYW5hZ2VyVUkub3BlbkNvbmZpZ3VyYXRpb25NYW5hZ2VyKHdpbmRvdy5nZXRTaGVsbCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS91cGRhdGUvSW5zdGFsbFdpemFyZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2lkZS91cGRhdGUvSW5zdGFsbFdpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjg4ZjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9pZGUvdXBkYXRlL0luc3RhbGxXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUudXBkYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZU1hbmFnZXJVSTsKLQotLyoqCi0gKiBBY3Rpb24gdG8gaW52b2tlIHRoZSBVcGRhdGUgaW5zdGFsbCB3aXphcmQuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxXaXphcmRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cwotICAgICAgICBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotICAgIHB1YmxpYyBJbnN0YWxsV2l6YXJkQWN0aW9uKCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBvcGVuSW5zdGFsbGVyKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBvcGVuSW5zdGFsbGVyKHdpbmRvdyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5JbnN0YWxsZXIoZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgQnVzeUluZGljYXRvci5zaG93V2hpbGUod2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgVXBkYXRlTWFuYWdlclVJLm9wZW5JbnN0YWxsZXIod2luZG93LmdldFNoZWxsKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2lkZS9JRWRpdG9yT3BlblN0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvaWRlL0lFZGl0b3JPcGVuU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2NTczZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvaWRlL0lFZGl0b3JPcGVuU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuaWRlOwotCi0vKioKLSAqIEEgc3RyYXRlZ3kgb2JqZWN0IGZvciBvcGVuaW5nIGVkaXRvcnMgb24gbW9kZWwgZWxlbWVudHMuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWRpdG9yT3BlblN0cmF0ZWd5IHsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5mbyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlZGl0b3JzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZWRpdAotCSAqIHRoZSBnaXZlbiBtb2RlbCBlbGVtZW50LCBhbmQgd2hpY2ggb25lIGlzIHRoZSBkZWZhdWx0LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgbW9kZWwgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIG9wZW4gd2l0aCBpbmZvCi0JICovCi0JT3BlbldpdGhJbmZvIGdldE9wZW5XaXRoSW5mbyhPYmplY3QgZWxlbWVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9pZGUvT3BlbldpdGhFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2lkZS9PcGVuV2l0aEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYTBiNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2lkZS9PcGVuV2l0aEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmlkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiBlbnRyeSBpbiB0aGUgT3BlbiBXaXRoIG1lbnUsIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSBsYWJlbCBhbmQgaW1hZ2UKLSAqIGRlc2NyaXB0b3IsIGFuZCBmb3Igb3BlbmluZyB0aGUgZWRpdG9yIHdoZW4gdGhlIGVudHJ5IGlzIGNob3Nlbi4KLSAqIAotICogQHNlZSBJRWRpdG9yT3BlblN0cmF0ZWd5Ci0gKiBAc2VlIE9wZW5XaXRoSW5mbwotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3BlbldpdGhFbnRyeSB7Ci0KLQlwcml2YXRlIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2M7Ci0KLQlwcml2YXRlIE9iamVjdCBlbGVtZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcGVuV2l0aEVudHJ5PC9jb2RlPiBmb3IgdGhlIGdpdmVuIGVkaXRvcgotCSAqIGRlc2NyaXB0b3IgYW5kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVkaXRvckRlc2MKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0b3IgZGVzY3JpcHRvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bnNwZWNpZmllZAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgbW9kZWwgZWxlbWVudAotCSAqLwotCXB1YmxpYyBPcGVuV2l0aEVudHJ5KElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2MsIE9iamVjdCBlbGVtZW50KSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZWxlbWVudCk7Ci0JCXRoaXMuZWRpdG9yRGVzYyA9IGVkaXRvckRlc2M7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdG9yIGRlc2NyaXB0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuc3BlY2lmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXRvciBkZXNjcmlwdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBJRWRpdG9yRGVzY3JpcHRvciBnZXRFZGl0b3JEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZWRpdG9yRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RlbCBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZGVsIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBlZGl0b3IocykgcmVwcmVzZW50ZWQgYnkgdGhpcyBlbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZQotCSAqICAgICAgICAgICAgdGhlIHdvcmtiZW5jaCBwYWdlCi0JICogQHBhcmFtIGFjdGl2YXRlCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byBhY3RpdmF0ZSB0aGUgZWRpdG9yLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgICAgIHRvIG9wZW4gd2l0aG91dCBhY3RpdmF0aW5nCi0JICogQHBhcmFtIG1hdGNoRmxhZ3MKLQkgKiAgICAgICAgICAgIHRoZSBtYXRjaCBmbGFncyAoc2VlCi0JICogICAgICAgICAgICB7QGxpbmsgSVdvcmtiZW5jaFBhZ2Ujb3BlbkVkaXRvcihvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQsIFN0cmluZywgYm9vbGVhbiwgaW50KX0KLQkgKiAgICAgICAgICAgIGZvciBtb3JlIGRldGFpbHMKLQkgKiBAcGFyYW0gcmVtZW1iZXJFZGl0b3IKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIHJlbWVtYmVyIHRoZSBlZGl0b3IgZGVzY3JpcHRvciBhcyB0aGUKLQkgKiAgICAgICAgICAgIGxhc3QgdHlwZSBvZiBlZGl0b3IgdXNlZCBvbiB0aGUgbW9kZWwgZWxlbWVudCwKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgcmVtZW1iZXIKLQkgKiBAdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGF0dGVtcHRpbmcgdG8gb3BlbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9wZW5FZGl0b3IoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgYm9vbGVhbiBhY3RpdmF0ZSwKLQkJCWludCBtYXRjaEZsYWdzLCBib29sZWFuIHJlbWVtYmVyRWRpdG9yKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCB0byBzaG93IGZvciB0aGlzIGVudHJ5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhYmVsIHRvIHNob3cgZm9yIHRoaXMgZW50cnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gZ2V0RWRpdG9yRGVzY3JpcHRvcigpID09IG51bGwgPyAiIiA6IGdldEVkaXRvckRlc2NyaXB0b3IoKS5nZXRMYWJlbCgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIHRvIHNob3cgZm9yIHRoaXMgZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm8gaW1hZ2Ugc2hvdWxkIGJlIHNob3duLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGVkaXRvckRlc2MuZ2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvaWRlL09wZW5XaXRoSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2lkZS9PcGVuV2l0aEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFlNDUzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvaWRlL09wZW5XaXRoSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuaWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIGVudHJpZXMgdG8gc2hvdyBpbiB0aGUgT3BlbiBXaXRoIG1lbnUsIGFuZCBpbmRpY2F0ZXMgd2hpY2ggZW50cnkKLSAqIGlzIHRoZSBkZWZhdWx0LgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuV2l0aEluZm8gewotCi0JcHJpdmF0ZSBPcGVuV2l0aEVudHJ5W10gZW50cmllczsKLQotCXByaXZhdGUgT3BlbldpdGhFbnRyeSBwcmVmZXJyZWRFbnRyeSwgZXh0ZXJuYWxFbnRyeSwgaW5QbGFjZUVudHJ5LAotCQkJZGVmYXVsdEVudHJ5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSA8Y29kZT5PcGVuV2l0aEluZm88L2NvZGU+LgotCSAqLwotCXB1YmxpYyBPcGVuV2l0aEluZm8oKSB7Ci0JCXRoaXMobmV3IE9wZW5XaXRoRW50cnlbMF0sIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3BlbldpdGhJbmZvPC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBlbnRyaWVzLgotCSAqIAotCSAqIEBwYXJhbSBlbnRyaWVzCi0JICogICAgICAgICAgICB0aGUgcmVndWxhciBlbnRyaWVzCi0JICogQHBhcmFtIHByZWZlcnJlZEVudHJ5Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGVudHJ5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIGV4dGVybmFsRW50cnkKLQkgKiAgICAgICAgICAgIHRoZSBlbnRyeSBmb3IgdGhlIGV4dGVybmFsIHN5c3RlbSBlZGl0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiBub25lCi0JICogQHBhcmFtIGluUGxhY2VFbnRyeQotCSAqICAgICAgICAgICAgdGhlIGVudHJ5IGZvciB0aGUgaW4tcGxhY2Ugc3lzdGVtIGVkaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIGlmIG5vbmUKLQkgKiBAcGFyYW0gZGVmYXVsdEVudHJ5Ci0JICogICAgICAgICAgICB0aGUgZW50cnkgZm9yIERlZmF1bHQgKGkuZS4gcmV2ZXJ0IHRvIGZhY3RvcnkgZGVmYXVsdHMpLCBvcgotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBPcGVuV2l0aEluZm8oT3BlbldpdGhFbnRyeVtdIGVudHJpZXMsIE9wZW5XaXRoRW50cnkgcHJlZmVycmVkRW50cnksCi0JCQlPcGVuV2l0aEVudHJ5IGV4dGVybmFsRW50cnksIE9wZW5XaXRoRW50cnkgaW5QbGFjZUVudHJ5LAotCQkJT3BlbldpdGhFbnRyeSBkZWZhdWx0RW50cnkpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChlbnRyaWVzKTsKLQkJdGhpcy5lbnRyaWVzID0gZW50cmllczsKLQkJdGhpcy5wcmVmZXJyZWRFbnRyeSA9IHByZWZlcnJlZEVudHJ5OwotCQl0aGlzLmV4dGVybmFsRW50cnkgPSBleHRlcm5hbEVudHJ5OwotCQl0aGlzLmluUGxhY2VFbnRyeSA9IGluUGxhY2VFbnRyeTsKLQkJdGhpcy5kZWZhdWx0RW50cnkgPSBkZWZhdWx0RW50cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW50cnkgZm9yIERlZmF1bHQgKGkuZS4gcmV2ZXJ0IHRvIGZhY3RvcnkgZGVmYXVsdHMpIGVudHJ5LCBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICogCi0JICogQHJldHVybiB0aGUgRGVmYXVsdCBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgT3BlbldpdGhFbnRyeSBnZXREZWZhdWx0RW50cnkoKSB7Ci0JCXJldHVybiBkZWZhdWx0RW50cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVndWxhciBlbnRyaWVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlZ3VsYXIgZW50cmllcwotCSAqLwotCXB1YmxpYyBPcGVuV2l0aEVudHJ5W10gZ2V0RW50cmllcygpIHsKLQkJcmV0dXJuIGVudHJpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW50cnkgZm9yIHRoZSBpbi1wbGFjZSBzeXN0ZW0gZWRpdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuCi0JICogCi0JICogQHJldHVybiB0aGUgaW4tcGxhY2UgZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIE9wZW5XaXRoRW50cnkgZ2V0SW5QbGFjZUVudHJ5KCkgewotCQlyZXR1cm4gaW5QbGFjZUVudHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZWZlcnJlZCBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gVGhpcyBlbnRyeQotCSAqIGlzIHR5cGljYWxseSBoaWdobGlnaHRlZCB3aXRoIGJvbGQgb3IgYSByYWRpbyBidXR0b24gaW4gdGhlIE9wZW4gV2l0aAotCSAqIG1lbnUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVycmVkIGVudHJ5LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBPcGVuV2l0aEVudHJ5IGdldFByZWZlcnJlZEVudHJ5KCkgewotCQlyZXR1cm4gcHJlZmVycmVkRW50cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW50cnkgZm9yIHRoZSBpbi1wbGFjZSBleHRlcm5hbCBlZGl0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBleHRlcm5hbCBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgT3BlbldpdGhFbnRyeSBnZXRFeHRlcm5hbEVudHJ5KCkgewotCQlyZXR1cm4gZXh0ZXJuYWxFbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IDxjb2RlPk9wZW5XaXRoSW5mbzwvY29kZT4gd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBtZXJnaW5nCi0JICogdGhpcyA8Y29kZT5PcGVuV2l0aEluZm88L2NvZGU+IHdpdGggdGhlIGdpdmVuIG90aGVyCi0JICogPGNvZGU+T3BlbldpdGhJbmZvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXJnZWQgaW5mbwotCSAqLwotCXB1YmxpYyBPcGVuV2l0aEluZm8gbWVyZ2VXaXRoKE9wZW5XaXRoSW5mbyBvdGhlcikgewotCQlIYXNoU2V0IHNlZW5EZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCU9wZW5XaXRoRW50cnlbXSB0aGlzRW50cmllcyA9IGdldEVudHJpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJT3BlbldpdGhFbnRyeSBlbnRyeSA9IHRoaXNFbnRyaWVzW2ldOwotCQkJaWYgKGVudHJ5LmdldEVkaXRvckRlc2NyaXB0b3IoKSAhPSBudWxsKSB7Ci0JCQkJc2VlbkRlc2NyaXB0b3JzLmFkZChlbnRyeS5nZXRFZGl0b3JEZXNjcmlwdG9yKCkpOwotCQkJfQotCQl9Ci0JCU9wZW5XaXRoRW50cnlbXSBvdGhlckVudHJpZXMgPSBvdGhlci5nZXRFbnRyaWVzKCk7Ci0JCUFycmF5TGlzdCBtZXJnZWRFbnRyaWVzID0gbmV3IEFycmF5TGlzdCh0aGlzRW50cmllcy5sZW5ndGgKLQkJCQkrIG90aGVyRW50cmllcy5sZW5ndGgpOwotCQltZXJnZWRFbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHRoaXNFbnRyaWVzKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPcGVuV2l0aEVudHJ5IGVudHJ5ID0gb3RoZXJFbnRyaWVzW2ldOwotCQkJaWYgKGVudHJ5LmdldEVkaXRvckRlc2NyaXB0b3IoKSAhPSBudWxsCi0JCQkJCSYmICFzZWVuRGVzY3JpcHRvcnMuY29udGFpbnMoZW50cnkuZ2V0RWRpdG9yRGVzY3JpcHRvcigpKSkgewotCQkJCXNlZW5EZXNjcmlwdG9ycy5hZGQoZW50cnkuZ2V0RWRpdG9yRGVzY3JpcHRvcigpKTsKLQkJCQltZXJnZWRFbnRyaWVzLmFkZChlbnRyeSk7Ci0JCQl9Ci0JCX0KLQkJSGFzaFNldCBhbGxFbnRyaWVzID0gbmV3IEhhc2hTZXQobWVyZ2VkRW50cmllcy5zaXplKCkgKyAzKTsKLQkJYWxsRW50cmllcy5hZGRBbGwobWVyZ2VkRW50cmllcyk7Ci0KLQkJT3BlbldpdGhFbnRyeSBleHRlcm5hbEVudHJ5ID0gZ2V0RXh0ZXJuYWxFbnRyeSgpICE9IG51bGwgPyBnZXRFeHRlcm5hbEVudHJ5KCkKLQkJCQk6IG90aGVyLmdldEV4dGVybmFsRW50cnkoKTsKLQkJaWYgKGV4dGVybmFsRW50cnkgIT0gbnVsbCkgewotCQkJYWxsRW50cmllcy5hZGQoZXh0ZXJuYWxFbnRyeSk7Ci0JCX0KLQkJT3BlbldpdGhFbnRyeSBpblBsYWNlRW50cnkgPSBnZXRJblBsYWNlRW50cnkoKSAhPSBudWxsID8gZ2V0SW5QbGFjZUVudHJ5KCkKLQkJCQk6IG90aGVyLmdldEluUGxhY2VFbnRyeSgpOwotCQlpZiAoaW5QbGFjZUVudHJ5ICE9IG51bGwpIHsKLQkJCWFsbEVudHJpZXMuYWRkKGluUGxhY2VFbnRyeSk7Ci0JCX0KLQkJT3BlbldpdGhFbnRyeSBkZWZhdWx0RW50cnkgPSBnZXREZWZhdWx0RW50cnkoKSAhPSBudWxsID8gZ2V0RGVmYXVsdEVudHJ5KCkKLQkJCQk6IG90aGVyLmdldERlZmF1bHRFbnRyeSgpOwotCQlpZiAoZGVmYXVsdEVudHJ5ICE9IG51bGwpIHsKLQkJCWFsbEVudHJpZXMuYWRkKGRlZmF1bHRFbnRyeSk7Ci0JCX0KLQotCQlPcGVuV2l0aEVudHJ5IHRoaXNQcmVmZXJyZWRFbnRyeSA9IGdldFByZWZlcnJlZEVudHJ5KCkgIT0gbnVsbAotCQkJCSYmIGFsbEVudHJpZXMuY29udGFpbnMoZ2V0UHJlZmVycmVkRW50cnkoKSkgPyBnZXRQcmVmZXJyZWRFbnRyeSgpCi0JCQkJOiBudWxsOwotCQlPcGVuV2l0aEVudHJ5IG90aGVyUHJlZmVycmVkRW50cnkgPSBvdGhlci5nZXRQcmVmZXJyZWRFbnRyeSgpICE9IG51bGwKLQkJCQkmJiBhbGxFbnRyaWVzLmNvbnRhaW5zKG90aGVyLmdldFByZWZlcnJlZEVudHJ5KCkpID8gb3RoZXIKLQkJCQkuZ2V0UHJlZmVycmVkRW50cnkoKSA6IG51bGw7Ci0JCS8vIGlmIGJvdGggaGF2ZSBwcmVmZXJyZWQgZW50cmllcyB0aGF0IHJlbWFpbiBpbiB0aGUgbGlzdCwgdGhlbiBjbGFpbSBubwotCQkvLyBwcmVmZXJyZWQgZW50cnkKLQkJT3BlbldpdGhFbnRyeSBwcmVmZXJyZWRFbnRyeSA9IHRoaXNQcmVmZXJyZWRFbnRyeSAhPSBudWxsID8gKG90aGVyUHJlZmVycmVkRW50cnkgIT0gbnVsbCA/IG51bGwKLQkJCQk6IHRoaXNQcmVmZXJyZWRFbnRyeSkKLQkJCQk6IG90aGVyUHJlZmVycmVkRW50cnk7Ci0KLQkJT3BlbldpdGhFbnRyeVtdIG1lcmdlZEVudHJ5QXJyYXkgPSAoT3BlbldpdGhFbnRyeVtdKSBtZXJnZWRFbnRyaWVzCi0JCQkJLnRvQXJyYXkobmV3IE9wZW5XaXRoRW50cnlbbWVyZ2VkRW50cmllcy5zaXplKCldKTsKLQkJcmV0dXJuIG5ldyBPcGVuV2l0aEluZm8obWVyZ2VkRW50cnlBcnJheSwgcHJlZmVycmVkRW50cnksCi0JCQkJZXh0ZXJuYWxFbnRyeSwgaW5QbGFjZUVudHJ5LCBkZWZhdWx0RW50cnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2lkZS9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvaWRlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY5ZjE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvaWRlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLTxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTWljcm9zb2Z0IEZyb250UGFnZSA0LjAiPgotPG1ldGEgbmFtZT0iUHJvZ0lkIiBjb250ZW50PSJGcm9udFBhZ2UuRWRpdG9yLkRvY3VtZW50Ij4KLTx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotPHA+Ci1Db250YWlucyBwcm92aXNpb25hbCBBUEkgZm9yIHRoZSBJREUuIAotPC9wPgotPHA+Ci1UaGlzIGN1cnJlbnRseSBjb25zaXN0cyBvZiBBUEkgZm9yIGN1c3RvbSBlZGl0b3Igb3BlbmluZwotc3RyYXRlZ2llcy4gIEZvciBkZXRhaWxzIHNlZSA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDI2NDMiPkJ1ZyA0MjY0MyBbRWRpdG9yIE1nbXRdIE5lZWQgZXh0ZW5zaW9uIHRvIGludGVyY2VwdCBlZGl0b3Igb3BlbmluZzwvYT4uCi08L3A+Ci08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9ib29rbWFya2V4cGxvcmVyL0Jvb2ttYXJrTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9ib29rbWFya2V4cGxvcmVyL0Jvb2ttYXJrTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5YTY1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvYm9va21hcmtleHBsb3Jlci9Cb29rbWFya01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5ib29rbWFya2V4cGxvcmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEJvb2ttYXJrTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5ib29rbWFya2V4cGxvcmVyLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0JLy8KLQkvLyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0JLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotCS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0JLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLQkvLwotCS8vIENvbnRyaWJ1dG9yczoKLQkvLyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0JLy8KLQotCS8vIHBhY2thZ2U6IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXIKLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUJvb2ttYXJrX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXN0ZUJvb2ttYXJrX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFzdGVCb29rbWFya19lcnJvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkJvb2ttYXJrX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkJvb2ttYXJrX3Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkJvb2ttYXJrX2Vycm9yVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCb29rbWFya190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJvb2ttYXJrX3Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQm9va21hcmtfZXJyb3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEFsbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEFsbF90b29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvcGVydGllc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uRGVzY3JpcHRpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5SZXNvdXJjZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkZvbGRlcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkxvY2F0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ3JlYXRpb25UaW1lX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpbmVJbmRpY2F0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkljb25faGVhZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkRlc2NyaXB0aW9uX2hlYWRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5SZXNvdXJjZV9oZWFkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uRm9sZGVyX2hlYWRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Mb2NhdGlvbl9oZWFkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5EZXNjcmlwdGlvbl9kaWFsb2dUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtblJlc291cmNlX2RpYWxvZ1RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uRm9sZGVyX2RpYWxvZ1RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uTG9jYXRpb25fZGlhbG9nVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRNZW51R3JvdXBfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0RGlyZWN0aW9uQXNjZW5kaW5nX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydERpcmVjdGlvbkRlc2NlbmRpbmdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnRpZXNEaWFsb2dUaXRsZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlckNyZWF0aW9uVGltZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weVRvQ2xpcGJvYXJkUHJvYmxlbURpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5VG9DbGlwYm9hcmRQcm9ibGVtRGlhbG9nX21lc3NhZ2U7Ci0KLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCb29rbWFya01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9ib29rbWFya2V4cGxvcmVyL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzk2MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBwYWNrYWdlOiBvcmcuZWNsaXBzZS51aS52aWV3cy5ib29rbWFya2V4cGxvcmVyCi0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgQm9va21hcmtzIFZpZXcKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNvcHlCb29rbWFya190ZXh0ID0gJkNvcHkKLQotUGFzdGVCb29rbWFya190ZXh0ID0gJlBhc3RlCi1QYXN0ZUJvb2ttYXJrX2Vycm9yVGl0bGUgPSBFcnJvciBwYXN0aW5nIGJvb2ttYXJrKHMpCi0KLU9wZW5Cb29rbWFya190ZXh0ID0gJkdvIFRvCi1PcGVuQm9va21hcmtfdG9vbFRpcCA9IEdvIFRvCi1PcGVuQm9va21hcmtfZXJyb3JUaXRsZSA9IFByb2JsZW1zIE9wZW5pbmcgRWRpdG9yCi0KLVJlbW92ZUJvb2ttYXJrX3RleHQgPSAmRGVsZXRlCi1SZW1vdmVCb29rbWFya190b29sVGlwID0gRGVsZXRlCi1SZW1vdmVCb29rbWFya19lcnJvclRpdGxlID0gRXJyb3IgZGVsZXRpbmcgYm9va21hcmtzCi0KLVNlbGVjdEFsbF90ZXh0ID0gU2VsZWN0IEEmbGwKLVNlbGVjdEFsbF90b29sVGlwID0gU2VsZWN0IEFsbAotCi1Qcm9wZXJ0aWVzX3RleHQgPSBQJnJvcGVydGllcwotCi1Db2x1bW5EZXNjcmlwdGlvbl90ZXh0ID0gYnkgJkRlc2NyaXB0aW9uCi1Db2x1bW5SZXNvdXJjZV90ZXh0ID0gYnkgJlJlc291cmNlCi1Db2x1bW5Gb2xkZXJfdGV4dCA9IGJ5ICZGb2xkZXIKLUNvbHVtbkxvY2F0aW9uX3RleHQgPSBieSAmTG9jYXRpb24KLUNvbHVtbkNyZWF0aW9uVGltZV90ZXh0ID0gYnkgJkNyZWF0aW9uIFRpbWUKLQotTGluZUluZGljYXRvcl90ZXh0ID0gbGluZSB7MH0KLQotQ29sdW1uSWNvbl9oZWFkZXIgPQotQ29sdW1uRGVzY3JpcHRpb25faGVhZGVyID0gRGVzY3JpcHRpb24KLUNvbHVtblJlc291cmNlX2hlYWRlciA9IFJlc291cmNlCi1Db2x1bW5Gb2xkZXJfaGVhZGVyID0gSW4gRm9sZGVyCi1Db2x1bW5Mb2NhdGlvbl9oZWFkZXIgPSBMb2NhdGlvbgotCi1Db2x1bW5EZXNjcmlwdGlvbl9kaWFsb2dUZXh0ID0gRGVzY3JpcHRpb246Ci1Db2x1bW5SZXNvdXJjZV9kaWFsb2dUZXh0ID0gUmVzb3VyY2U6Ci1Db2x1bW5Gb2xkZXJfZGlhbG9nVGV4dCA9IEluIEZvbGRlcjoKLUNvbHVtbkxvY2F0aW9uX2RpYWxvZ1RleHQgPSBMb2NhdGlvbjoKLQotU29ydE1lbnVHcm91cF90ZXh0ID0gJlNvcnQKLVNvcnREaXJlY3Rpb25Bc2NlbmRpbmdfdGV4dCA9ICZBc2NlbmRpbmcKLVNvcnREaXJlY3Rpb25EZXNjZW5kaW5nX3RleHQgPSBEJmVzY2VuZGluZwotCi1Qcm9wZXJ0aWVzRGlhbG9nVGl0bGVfdGV4dCA9IEJvb2ttYXJrIFByb3BlcnRpZXMKLQotTWFya2VyQ3JlYXRpb25UaW1lX3RleHQgPSAmQ3JlYXRpb24gVGltZToKLQotRXJyb3JfdGV4dCA9ICZFcnJvcgotCi1Db3B5VG9DbGlwYm9hcmRQcm9ibGVtRGlhbG9nX3RpdGxlPVByb2JsZW0gQ29weWluZyB0byBDbGlwYm9hcmQKLUNvcHlUb0NsaXBib2FyZFByb2JsZW1EaWFsb2dfbWVzc2FnZT1UaGVyZSB3YXMgYSBwcm9ibGVtIHdoZW4gYWNjZXNzaW5nIHRoZSBzeXN0ZW0gY2xpcGJvYXJkLiBSZXRyeT8KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL2ZyYW1lbGlzdC9GcmFtZUxpc3RNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL2ZyYW1lbGlzdC9GcmFtZUxpc3RNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg2MDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9mcmFtZWxpc3QvRnJhbWVMaXN0TWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLmZyYW1lbGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBGcmFtZUxpc3RNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLmZyYW1lbGlzdC5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gRnJhbWVMaXN0Ci0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFja190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhY2tfdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYWNrX3Rvb2xUaXBPbmVBcmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3J3YXJkX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9yd2FyZF90b29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcndhcmRfdG9vbFRpcE9uZUFyZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdvSW50b190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdvSW50b190b29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcF90b29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwX3Rvb2xUaXBPbmVBcmc7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRnJhbWVMaXN0TWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvZnJhbWVsaXN0L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvZnJhbWVsaXN0L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZGE0Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL2ZyYW1lbGlzdC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIHBhY2thZ2U6IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmZyYW1lbGlzdAotCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIEZyYW1lTGlzdAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUJhY2tfdGV4dCA9ICZCYWNrCi1CYWNrX3Rvb2xUaXAgPSBCYWNrCi1CYWNrX3Rvb2xUaXBPbmVBcmcgPSBCYWNrIHRvIHswfQotCi1Gb3J3YXJkX3RleHQgPSAmRm9yd2FyZAotRm9yd2FyZF90b29sVGlwID0gRm9yd2FyZAotRm9yd2FyZF90b29sVGlwT25lQXJnID0gRm9yd2FyZCB0byB7MH0KLQotR29JbnRvX3RleHQgPSBHbyAmSW50bwotR29JbnRvX3Rvb2xUaXAgPSBHbyBJbnRvCi0KLVVwX3RleHQgPSAmVXAgT25lIExldmVsCi1VcF90b29sVGlwID0gVXAKLVVwX3Rvb2xUaXBPbmVBcmcgPSBVcCB0byB7MH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9uYXZpZ2F0b3IvUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL25hdmlnYXRvci9SZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmUzNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL25hdmlnYXRvci9SZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VOYXZpZ2F0b3Jfb25lSXRlbVNlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlTmF2aWdhdG9yX3N0YXR1c0xpbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VOYXZpZ2F0b3Jfd29ya2luZ1NldFRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VOYXZpZ2F0b3Jfd29ya2luZ1NldElucHV0VG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZU1hbmFnZXJfdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93SW5OYXZpZ2F0b3JfZXJyb3JNZXNzYWdlOwotCi0JLy8gLS0tIEFjdGlvbnMgLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VOYXZpZ2F0b3Jfc29ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0Vmlld19ieVR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydFZpZXdfdG9vbFRpcEJ5VHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0Vmlld19ieU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydFZpZXdfdG9vbFRpcEJ5TmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUxpbmtpbmdBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVMaW5raW5nQWN0aW9uX3Rvb2xUaXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZU5hdmlnYXRvcl9maWx0ZXJUZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VOYXZpZ2F0b3JfbmV3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlTmF2aWdhdG9yX29wZW5XaXRoOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hvd0luTmF2aWdhdG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hvd0luTmF2aWdhdG9yX3Rvb2xUaXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5QWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlBY3Rpb25fdG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhc3RlQWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhc3RlQWN0aW9uX3Rvb2xUaXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2xsYXBzZUFsbEFjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2xsYXBzZUFsbEFjdGlvbl90b29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR29Ub1Jlc291cmNlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yRnJhbWVTb3VyY2VfY2xvc2VkUHJvamVjdF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JGcmFtZVNvdXJjZV9jbG9zZWRQcm9qZWN0X21lc3NhZ2U7Ci0JLy8gLS0tIERpYWxvZ3MgLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR290b190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJTZWxlY3Rpb25fbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJTZWxlY3Rpb25fdG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJTZWxlY3Rpb25fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEcm9wQWRhcHRlcl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEcm9wQWRhcHRlcl9wcm9ibGVtSW1wb3J0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERyb3BBZGFwdGVyX3Byb2JsZW1zTW92aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERyb3BBZGFwdGVyX3F1ZXN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERyb3BBZGFwdGVyX3RhcmdldE11c3RCZVJlc291cmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERyb3BBZGFwdGVyX2Nhbk5vdERyb3BJbnRvQ2xvc2VkUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEcm9wQWRhcHRlcl9yZXNvdXJjZXNDYW5Ob3RCZVNpYmxpbmdzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERyb3BBZGFwdGVyX29rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERyb3BBZGFwdGVyX292ZXJ3cml0ZVF1ZXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERyb3BBZGFwdGVyX2Ryb3BPcGVyYXRpb25FcnJvck90aGVyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHJhZ0FkYXB0ZXJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHJhZ0FkYXB0ZXJfY2hlY2tEZWxldGVNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlcl9lcnJvck1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5VG9DbGlwYm9hcmRQcm9ibGVtRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlUb0NsaXBib2FyZFByb2JsZW1EaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVSZXNvdXJjZUFjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlUmVzb3VyY2VBY3Rpb25fY2hlY2tNb3ZlTWVzc2FnZTsKLQotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvbmF2aWdhdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvbmF2aWdhdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjN2E5NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL25hdmlnYXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIHBhY2thZ2U6IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvcgotCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIE5hdmlnYXRvciBWaWV3Ci0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUmVzb3VyY2VOYXZpZ2F0b3Jfb25lSXRlbVNlbGVjdGVkID0gMSBpdGVtIHNlbGVjdGVkCi1SZXNvdXJjZU5hdmlnYXRvcl9zdGF0dXNMaW5lID0gezB9IGl0ZW1zIHNlbGVjdGVkCi1SZXNvdXJjZU5hdmlnYXRvcl93b3JraW5nU2V0VG9vbFRpcCA9IFdvcmtpbmcgU2V0OiB7MH0KLVJlc291cmNlTmF2aWdhdG9yX3dvcmtpbmdTZXRJbnB1dFRvb2xUaXAgPSB7MH0gLSBXb3JraW5nIFNldDogezF9Ci1SZXNvdXJjZU1hbmFnZXJfdG9vbFRpcCA9IFdvcmtzcGFjZQotU2hvd0luTmF2aWdhdG9yX2Vycm9yTWVzc2FnZSA9IENhbid0IG9wZW4gbmF2aWdhdG9yCi0KLSMgLS0tIEFjdGlvbnMgLS0tCi1SZXNvdXJjZU5hdmlnYXRvcl9zb3J0ID0gJlNvcnQKLVNvcnRWaWV3X2J5VHlwZSA9IGJ5ICZUeXBlCi1Tb3J0Vmlld190b29sVGlwQnlUeXBlID0gU29ydCBieSBUeXBlCi1Tb3J0Vmlld19ieU5hbWUgPSBieSAmTmFtZQotU29ydFZpZXdfdG9vbFRpcEJ5TmFtZSA9IFNvcnQgYnkgTmFtZQotCi1Ub2dnbGVMaW5raW5nQWN0aW9uX3RleHQgPSAmTGluayB3aXRoIEVkaXRvcgotVG9nZ2xlTGlua2luZ0FjdGlvbl90b29sVGlwID0gTGluayB3aXRoIEVkaXRvcgotCi1SZXNvdXJjZU5hdmlnYXRvcl9maWx0ZXJUZXh0ID0gJkZpbHRlcnMuLi4KLQotUmVzb3VyY2VOYXZpZ2F0b3JfbmV3ID0gTmUmdwotUmVzb3VyY2VOYXZpZ2F0b3Jfb3BlbldpdGggPSBPcGVuIFdpdCZoCi0KLVNob3dJbk5hdmlnYXRvcl90ZXh0ID0gU2hvdyBpbiAmTmF2aWdhdG9yCi1TaG93SW5OYXZpZ2F0b3JfdG9vbFRpcCA9IFNob3cgU2VsZWN0ZWQgT2JqZWN0cyBpbiBOYXZpZ2F0b3IgVmlldwotCi1Db3B5QWN0aW9uX3RpdGxlID0gJkNvcHkKLUNvcHlBY3Rpb25fdG9vbFRpcCA9IENvcHkKLQotUGFzdGVBY3Rpb25fdGl0bGU9JlBhc3RlCi1QYXN0ZUFjdGlvbl90b29sVGlwID0gUGFzdGUKLQotQ29sbGFwc2VBbGxBY3Rpb25fdGl0bGUgPSBDbyZsbGFwc2UgQWxsCi1Db2xsYXBzZUFsbEFjdGlvbl90b29sVGlwID0gQ29sbGFwc2UgQWxsCi0KLUdvVG9SZXNvdXJjZV9sYWJlbD0mUmVzb3VyY2UuLi4KLQotTmF2aWdhdG9yRnJhbWVTb3VyY2VfY2xvc2VkUHJvamVjdF90aXRsZT1DbG9zZWQgUHJvamVjdAotTmF2aWdhdG9yRnJhbWVTb3VyY2VfY2xvc2VkUHJvamVjdF9tZXNzYWdlPVlvdSBhdHRlbXB0ZWQgdG8gZ28gaW50byBhIGNsb3NlZCBwcm9qZWN0OiB7MH1cblBsZWFzZSBvcGVuIHRoZSBwcm9qZWN0IGFuZCB0cnkgYWdhaW4uCi0jIC0tLSBEaWFsb2dzIC0tLQotR290b190aXRsZSA9IEdvIFRvIFJlc291cmNlCi0KLUZpbHRlclNlbGVjdGlvbl9tZXNzYWdlID0gU2VsZWN0IHRoZSAmZmlsdGVycyB0byBhcHBseSAobWF0Y2hpbmcgZmlsZXMgd2lsbCBiZSBoaWRkZW4pOgotRmlsdGVyU2VsZWN0aW9uX3Rvb2xUaXAgPSBBcHBseSBGaWx0ZXJzCi1GaWx0ZXJTZWxlY3Rpb25fdGl0bGUgPSBOYXZpZ2F0b3IgRmlsdGVycwotCi0KLSMgLS0tIERyb3AgQWRhcHRlciAtLS0KLURyb3BBZGFwdGVyX3RpdGxlID0gRHJhZyBhbmQgRHJvcCBQcm9ibGVtCi1Ecm9wQWRhcHRlcl9wcm9ibGVtSW1wb3J0aW5nID0gUHJvYmxlbXMgb2NjdXJyZWQgd2hpbGUgaW1wb3J0aW5nIHJlc291cmNlcy4KLURyb3BBZGFwdGVyX3Byb2JsZW1zTW92aW5nID0gUHJvYmxlbXMgb2NjdXJyZWQgd2hpbGUgbW92aW5nIHJlc291cmNlcy4KLURyb3BBZGFwdGVyX3F1ZXN0aW9uID0gUXVlc3Rpb24KLURyb3BBZGFwdGVyX3RhcmdldE11c3RCZVJlc291cmNlID0gVGFyZ2V0IG11c3QgYmUgYSByZXNvdXJjZQotRHJvcEFkYXB0ZXJfY2FuTm90RHJvcEludG9DbG9zZWRQcm9qZWN0ID0gQ2Fubm90IGRyb3AgYSByZXNvdXJjZSBpbnRvIGNsb3NlZCBwcm9qZWN0Ci1Ecm9wQWRhcHRlcl9yZXNvdXJjZXNDYW5Ob3RCZVNpYmxpbmdzID0gUmVzb3VyY2VzIGNhbm5vdCBiZSBzaWJsaW5ncyBvZiBwcm9qZWN0cwotRHJvcEFkYXB0ZXJfb2sgPSBvawotRHJvcEFkYXB0ZXJfb3ZlcndyaXRlUXVlcnkgPSB7MH0gYWxyZWFkeSBleGlzdHMuICBXb3VsZCB5b3UgbGlrZSB0byBvdmVyd3JpdGUgaXQ/Ci1Ecm9wQWRhcHRlcl9kcm9wT3BlcmF0aW9uRXJyb3JPdGhlciA9IEFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgZHJvcCBvcGVyYXRpb24uCi0KLURyYWdBZGFwdGVyX3RpdGxlID0gQ2hlY2sgTW92ZQotRHJhZ0FkYXB0ZXJfY2hlY2tEZWxldGVNZXNzYWdlID0gezB9IGlzIHJlYWQgb25seS4gRG8geW91IHN0aWxsIHdpc2ggdG8gZGVsZXRlIGl0PwotCi1Mb2NhbFNlbGVjdGlvblRyYW5zZmVyX2Vycm9yTWVzc2FnZT1SZWNlaXZlZCB3cm9uZyB0cmFuc2ZlciBkYXRhLgotCi1Db3B5VG9DbGlwYm9hcmRQcm9ibGVtRGlhbG9nX3RpdGxlPVByb2JsZW0gQ29weWluZyB0byBDbGlwYm9hcmQKLUNvcHlUb0NsaXBib2FyZFByb2JsZW1EaWFsb2dfbWVzc2FnZT1UaGVyZSB3YXMgYSBwcm9ibGVtIHdoZW4gYWNjZXNzaW5nIHRoZSBzeXN0ZW0gY2xpcGJvYXJkLiBSZXRyeT8KLQotTW92ZVJlc291cmNlQWN0aW9uX3RpdGxlID0gQ2hlY2sgTW92ZQotTW92ZVJlc291cmNlQWN0aW9uX2NoZWNrTW92ZU1lc3NhZ2UgPSAnJ3swfScnIGlzIHJlYWQgb25seS4gRG8geW91IHN0aWxsIHdpc2ggdG8gbW92ZSBpdD8KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvSURFUHJvcGVydGllc01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9JREVQcm9wZXJ0aWVzTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyYmYzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9JREVQcm9wZXJ0aWVzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSURFUHJvcGVydGllc01lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllcy5pZGVNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gUHJvcGVydGllcyBWaWV3IC0gSURFLXNwZWNpZmljIHN0cmluZ3MKLQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnR5U291cmNlX25vdExvY2FsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnR5U291cmNlX25vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnR5U291cmNlX3JlYWRPbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnR5U291cmNlX3VuZGVmaW5lZFBhdGhWYXJpYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9wZXJ0eVNvdXJjZV9maWxlTm90RXhpc3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50c19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzX3BhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSVJlc291cmNlUHJvcGVydHlDb25zdGFudHNfZWRpdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSVJlc291cmNlUHJvcGVydHlDb25zdGFudHNfZGVyaXZlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50c19zaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzX2xhc3RNb2RpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50c19pbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzX2xvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzX3Jlc29sdmVkTG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSVJlc291cmNlUHJvcGVydHlDb25zdGFudHNfbGlua2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlUHJvcGVydHlfZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VQcm9wZXJ0eV90cnVlOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIElERVByb3BlcnRpZXNNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL2lkZU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9pZGVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmFkZjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL2lkZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgcGFja2FnZTogb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBQcm9wZXJ0aWVzIFZpZXcgLSBJREUtc3BlY2lmaWMgc3RyaW5ncwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotUHJvcGVydHlTb3VyY2Vfbm90TG9jYWwgPSA8bm90IGxvY2FsPgotUHJvcGVydHlTb3VyY2Vfbm90Rm91bmQgPSA8cmVzb3VyY2UgZG9lcyBub3QgZXhpc3Q+Ci1Qcm9wZXJ0eVNvdXJjZV9yZWFkT25seSA9IFJlYWQgb25seQotUHJvcGVydHlTb3VyY2VfdW5kZWZpbmVkUGF0aFZhcmlhYmxlID0gPHVuZGVmaW5lZCBwYXRoIHZhcmlhYmxlPgotUHJvcGVydHlTb3VyY2VfZmlsZU5vdEV4aXN0ID0gLSAoZG9lcyBub3QgZXhpc3QpCi0KLUlSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzX25hbWUgPSBuYW1lCi1JUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50c19wYXRoID0gcGF0aAotSVJlc291cmNlUHJvcGVydHlDb25zdGFudHNfZWRpdGFibGUgPSBlZGl0YWJsZQotSVJlc291cmNlUHJvcGVydHlDb25zdGFudHNfZGVyaXZlZCA9IGRlcml2ZWQKLUlSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzX3NpemUgPSBzaXplCi1JUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50c19sYXN0TW9kaWZpZWQgPSBsYXN0IG1vZGlmaWVkCi1JUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50c19pbmZvID0gSW5mbwotSVJlc291cmNlUHJvcGVydHlDb25zdGFudHNfbG9jYXRpb24gPSBsb2NhdGlvbgotSVJlc291cmNlUHJvcGVydHlDb25zdGFudHNfcmVzb2x2ZWRMb2NhdGlvbiA9IHJlc29sdmVkIGxvY2F0aW9uCi1JUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50c19saW5rZWQgPSBsaW5rZWQKLVJlc291cmNlUHJvcGVydHlfZmFsc2UgPSBmYWxzZQotUmVzb3VyY2VQcm9wZXJ0eV90cnVlID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL3Rhc2tsaXN0L1Rhc2tMaXN0TWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy90YXNrbGlzdC9UYXNrTGlzdE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MThiOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL3Rhc2tsaXN0L1Rhc2tMaXN0TWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy50YXNrbGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGFza0xpc3RNZXNzYWdlcyBhcmUgdGhlIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIFRhc2tMaXN0LgotICoKLSAqLwotcHVibGljIGNsYXNzIFRhc2tMaXN0TWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy50YXNrbGlzdC5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gVGFza0xpc3QKLQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X2xpbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RfbGluZUFuZExvY2F0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3Rfc3RhdHVzU3VtbWFyeVZpc2libGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3Rfc3RhdHVzU3VtbWFyeVNlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3N0YXR1c1N1bW1hcnlCcmVha2Rvd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RfdGl0bGVTdW1tYXJ5VW5maWx0ZXJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF90aXRsZVN1bW1hcnlGaWx0ZXJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9oZWFkZXJJY29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X2hlYWRlckNvbXBsZXRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9oZWFkZXJQcmlvcml0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9oZWFkZXJEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9oZWFkZXJSZXNvdXJjZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9oZWFkZXJGb2xkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RfaGVhZGVyTG9jYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9oaWdoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X2xvdzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9ub3JtYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9lcnJvck1vZGlmeWluZ1Rhc2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9yZXBvcnRLaW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3JlcG9ydFN0YXR1czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9yZXBvcnRQcmlvcml0eTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3Rfd2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9pbmZvOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RfY29tcGxldGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X25vdENvbXBsZXRlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X21hcmtlckxpbWl0RXhjZWVkZWQ7Ci0KLQkvLyAtLS0gQWN0aW9ucyAtLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdUYXNrX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VGFza190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1Rhc2tfbm90U2hvd25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdUYXNrX25vdFNob3duTXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weVRhc2tfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5VGFza190b29sdGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFzdGVUYXNrX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFzdGVUYXNrX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFzdGVUYXNrX2Vycm9yTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZVRhc2tfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVUYXNrX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlVGFza19lcnJvck1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJzX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyc190b29sdGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydEJ5TWVudV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRCeUNhdGVnb3J5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydEJ5Q2F0ZWdvcnlfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0QnlDb21wbGV0ZWRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0QnlDb21wbGV0ZWRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0QnlQcmlvcml0eV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRCeVByaW9yaXR5X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydEJ5RGVzY3JpcHRpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0QnlEZXNjcmlwdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRCeVJlc291cmNlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydEJ5UmVzb3VyY2VfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0QnlDb250YWluZXJfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0QnlDb250YWluZXJfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0QnlMb2NhdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRCeUxvY2F0aW9uX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydEJ5Q3JlYXRpb25UaW1lX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydEJ5Q3JlYXRpb25UaW1lX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydEFzY2VuZGluZ190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRBc2NlbmRpbmdfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0RGVzY2VuZGluZ190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnREZXNjZW5kaW5nX3Rvb2x0aXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHb3RvVGFza190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdvdG9UYXNrX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR290b1Rhc2tfZXJyb3JNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHVyZ2VDb21wbGV0ZWRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQdXJnZUNvbXBsZXRlZF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFB1cmdlQ29tcGxldGVkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFB1cmdlQ29tcGxldGVkX25vbmVDb21wbGV0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHVyZ2VDb21wbGV0ZWRfcGVybWFuZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFB1cmdlQ29tcGxldGVkX2Vycm9yTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtDb21wbGV0ZWRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrQ29tcGxldGVkX3Rvb2x0aXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RBbGxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RBbGxfdG9vbHRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc29sdmVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvbHZlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb2x2ZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvbHZlX25vUmVzb2x1dGlvbnNMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnRpZXNfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9wZXJ0aWVzX3Rvb2x0aXA7Ci0KLQkvLyAtLS0gRmlsdGVyIERpYWxvZyAtLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9maWx0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3Rfc2hvd0l0ZW1zT2ZUeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RfYW55UmVzb3VyY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RfYW55UmVzb3VyY2VJblNhbWVQcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3NlbGVjdGVkUmVzb3VyY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3Rfc2VsZWN0ZWRBbmRDaGlsZHJlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF93b3JraW5nU2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3dvcmtpbmdTZXRTZWxlY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3Rfbm9Xb3JraW5nU2V0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3Rfd2hlcmVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9jb250YWluczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9kb2VzTm90Q29udGFpbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3NldmVyaXR5X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3NldmVyaXR5X2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3NldmVyaXR5X3dhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3Rfc2V2ZXJpdHlfaW5mbzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3ByaW9yaXR5X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3ByaW9yaXR5X2hpZ2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RfcHJpb3JpdHlfbG93OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3ByaW9yaXR5X25vcm1hbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3N0YXR1c19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9zdGF0dXNfY29tcGxldGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3N0YXR1c19ub3RDb21wbGV0ZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9yZXNldFRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdF9saW1pdFZpc2libGVUYXNrc1RvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X3RpdGxlTWFya2VyTGltaXRJbnZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0X21lc3NhZ2VNYXJrZXJMaW1pdEludmFsaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1Byb3BlcnRpZXNEaWFsb2dfV29ya2luZ09uTWFya2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tQcm9wZXJ0aWVzRGlhbG9nX0NyZWF0aW5nTWFya2VyOwotCi0JLy8gLS0tIFByb3BlcnRpZXMgRGlhbG9nIC0tLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tQcm9wX25ld1Rhc2tUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrUHJvcF9wcm9wZXJ0aWVzVGl0bGU7Ci0JLy9UYXNrUHJvcC50aXRsZUZtdCA9IHswfSAtIHsxfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tQcm9wX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tQcm9wX2NyZWF0aW9uVGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrUHJvcF9wcmlvcml0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrUHJvcF9jb21wbGV0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1Byb3Bfc2V2ZXJpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1Byb3Bfb25SZXNvdXJjZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrUHJvcF9pbkZvbGRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrUHJvcF9sb2NhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrUHJvcF9lcnJvck1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5VG9DbGlwYm9hcmRQcm9ibGVtRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlUb0NsaXBib2FyZFByb2JsZW1EaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tQcm9wZXJ0aWVzRGlhbG9nX1VwZGF0aW5nQXR0cmlidXRlczsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBUYXNrTGlzdE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL3Rhc2tsaXN0L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvdGFza2xpc3QvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0ZDkzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvdGFza2xpc3QvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBDYWdhdGF5IEthdnVrY3VvZ2x1IDxjYWdhdGF5a0BhY20ub3JnPiAtIEZpbHRlciBmb3IgbWFya2VycyBpbiBzYW1lIHByb2plY3QKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBwYWNrYWdlOiBvcmcuZWNsaXBzZS51aS52aWV3cy50YXNrbGlzdAotCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRhc2tMaXN0Ci0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UYXNrTGlzdF9saW5lID0gbGluZSB7MH0KLVRhc2tMaXN0X2xpbmVBbmRMb2NhdGlvbiA9IGxpbmUgezB9IGluIHsxfQotCi1UYXNrTGlzdF9zdGF0dXNTdW1tYXJ5VmlzaWJsZSA9IHswLGNob2ljZSwwIzAgaXRlbXN8MSN7MCxudW1iZXIsaW50ZWdlcn0gaXRlbXwxPHswLG51bWJlcixpbnRlZ2VyfSBpdGVtc306IHsxfQotVGFza0xpc3Rfc3RhdHVzU3VtbWFyeVNlbGVjdGVkID0gezAsY2hvaWNlLDAjMCBpdGVtc3wxI3swLG51bWJlcixpbnRlZ2VyfSBpdGVtfDE8ezAsbnVtYmVyLGludGVnZXJ9IGl0ZW1zfSBzZWxlY3RlZDogezF9Ci1UYXNrTGlzdF9zdGF0dXNTdW1tYXJ5QnJlYWtkb3duID0gezAsY2hvaWNlLDAjMCB0YXNrc3wxI3swLG51bWJlcixpbnRlZ2VyfSB0YXNrfDE8ezAsbnVtYmVyLGludGVnZXJ9IHRhc2tzfSwgezEsY2hvaWNlLDAjMCBlcnJvcnN8MSN7MSxudW1iZXIsaW50ZWdlcn0gZXJyb3J8MTx7MSxudW1iZXIsaW50ZWdlcn0gZXJyb3JzfSwgezIsY2hvaWNlLDAjMCB3YXJuaW5nc3wxI3syLG51bWJlcixpbnRlZ2VyfSB3YXJuaW5nfDE8ezIsbnVtYmVyLGludGVnZXJ9IHdhcm5pbmdzfSwgezMsY2hvaWNlLDAjMCBpbmZvc3wxI3szLG51bWJlcixpbnRlZ2VyfSBpbmZvfDE8ezMsbnVtYmVyLGludGVnZXJ9IGluZm9zfQotVGFza0xpc3RfdGl0bGVTdW1tYXJ5VW5maWx0ZXJlZCA9IHswLGNob2ljZSwwIzAgaXRlbXN8MSN7MCxudW1iZXIsaW50ZWdlcn0gaXRlbXwxPHswLG51bWJlcixpbnRlZ2VyfSBpdGVtc30KLVRhc2tMaXN0X3RpdGxlU3VtbWFyeUZpbHRlcmVkID0gRmlsdGVyIG1hdGNoZWQgezB9IG9mIHsxLGNob2ljZSwwIzAgaXRlbXN8MSN7MSxudW1iZXIsaW50ZWdlcn0gaXRlbXwxPHsxLG51bWJlcixpbnRlZ2VyfSBpdGVtc30KLQotVGFza0xpc3RfaGVhZGVySWNvbiA9Ci1UYXNrTGlzdF9oZWFkZXJDb21wbGV0ZWQgPSBDCi1UYXNrTGlzdF9oZWFkZXJQcmlvcml0eSA9ICEKLVRhc2tMaXN0X2hlYWRlckRlc2NyaXB0aW9uID0gRGVzY3JpcHRpb24KLVRhc2tMaXN0X2hlYWRlclJlc291cmNlID0gUmVzb3VyY2UKLVRhc2tMaXN0X2hlYWRlckZvbGRlciA9IEluIEZvbGRlcgotVGFza0xpc3RfaGVhZGVyTG9jYXRpb24gPSBMb2NhdGlvbgotCi1UYXNrTGlzdF9oaWdoID0gSGlnaAotVGFza0xpc3RfbG93ID0gTG93Ci1UYXNrTGlzdF9ub3JtYWwgPSBOb3JtYWwKLQotVGFza0xpc3RfZXJyb3JNb2RpZnlpbmdUYXNrID0gRXJyb3IgbW9kaWZ5aW5nIHRhc2sKLQotVGFza0xpc3RfcmVwb3J0S2luZCA9IEtpbmQKLVRhc2tMaXN0X3JlcG9ydFN0YXR1cyA9IFN0YXR1cwotVGFza0xpc3RfcmVwb3J0UHJpb3JpdHkgPSBQcmlvcml0eQotCi1UYXNrTGlzdF90YXNrID0gVGFzawotVGFza0xpc3RfZXJyb3IgPSBFcnJvcgotVGFza0xpc3Rfd2FybmluZyA9IFdhcm5pbmcKLVRhc2tMaXN0X2luZm8gPSBJbmZvCi0KLVRhc2tMaXN0X2NvbXBsZXRlZCA9IENvbXBsZXRlZAotVGFza0xpc3Rfbm90Q29tcGxldGVkID0gTm90IENvbXBsZXRlZAotCi1UYXNrTGlzdF9tYXJrZXJMaW1pdEV4Y2VlZGVkID0gVGhlcmUgYXJlIHRvbyBtYW55IGl0ZW1zIHRvIGRpc3BsYXkuXG5cCi1UbyBzZWUgaXRlbXMgaW4gdGhpcyB3aW5kb3csIGFkanVzdCB0aGUgZmlsdGVyIHNldHRpbmdzLgotCi0jIC0tLSBBY3Rpb25zIC0tLQotTmV3VGFza190ZXh0ID0gJk5ldyBUYXNrCi1OZXdUYXNrX3Rvb2x0aXAgPSBOZXcgVGFzawotTmV3VGFza19ub3RTaG93blRpdGxlID0gTmV3IFRhc2sgTm90IFZpc2libGUKLU5ld1Rhc2tfbm90U2hvd25Nc2cgPSBUaGUgbmV3IHRhc2sgd2lsbCBub3QgYmUgdmlzaWJsZSwgZHVlIHRvIHRoZSBjdXJyZW50IGZpbHRlciBzZXR0aW5ncy5cblwKLVRvIHNlZSBhbGwgdGFza3MsIGNob29zZSBGaWx0ZXIuLi4gdGhlbiBzZWxlY3QgdGhlIFJlc2V0IGJ1dHRvbi4KLQotQ29weVRhc2tfdGV4dCA9ICZDb3B5Ci1Db3B5VGFza190b29sdGlwID0gQ29weQotCi1QYXN0ZVRhc2tfdGV4dCA9ICZQYXN0ZQotUGFzdGVUYXNrX3Rvb2x0aXAgPSBQYXN0ZQotUGFzdGVUYXNrX2Vycm9yTWVzc2FnZSA9IEVycm9yIHBhc3RpbmcgdGFzawotCi1SZW1vdmVUYXNrX3RleHQgPSAmRGVsZXRlCi1SZW1vdmVUYXNrX3Rvb2x0aXAgPSBEZWxldGUKLVJlbW92ZVRhc2tfZXJyb3JNZXNzYWdlID0gRXJyb3IgZGVsZXRpbmcgdGFzawotCi1GaWx0ZXJzX3RleHQgPSAmRmlsdGVycy4uLgotRmlsdGVyc190b29sdGlwID0gRmlsdGVycy4uLgotCi1Tb3J0QnlNZW51X3RleHQ9ICZTb3J0Ci1Tb3J0QnlDYXRlZ29yeV90ZXh0PSBieSAmVHlwZQotU29ydEJ5Q2F0ZWdvcnlfdG9vbHRpcD0gU29ydCBieSB0eXBlIGNvbHVtbgotU29ydEJ5Q29tcGxldGVkX3RleHQ9IGJ5ICZDb21wbGV0aW9uCi1Tb3J0QnlDb21wbGV0ZWRfdG9vbHRpcD0gU29ydCBieSBjb21wbGV0aW9uIGNvbHVtbgotU29ydEJ5UHJpb3JpdHlfdGV4dD0gYnkgJlByaW9yaXR5Ci1Tb3J0QnlQcmlvcml0eV90b29sdGlwPSBTb3J0IGJ5IHByaW9yaXR5IGNvbHVtbgotU29ydEJ5RGVzY3JpcHRpb25fdGV4dD0gYnkgJkRlc2NyaXB0aW9uCi1Tb3J0QnlEZXNjcmlwdGlvbl90b29sdGlwPSBTb3J0IGJ5IGRlc2NyaXB0aW9uIGNvbHVtbgotU29ydEJ5UmVzb3VyY2VfdGV4dD0gYnkgJlJlc291cmNlCi1Tb3J0QnlSZXNvdXJjZV90b29sdGlwPSBTb3J0IGJ5IHJlc291cmNlIGNvbHVtbgotU29ydEJ5Q29udGFpbmVyX3RleHQ9IGJ5ICZGb2xkZXIKLVNvcnRCeUNvbnRhaW5lcl90b29sdGlwPSBTb3J0IGJ5IGZvbGRlciBjb2x1bW4KLVNvcnRCeUxvY2F0aW9uX3RleHQ9IGJ5ICZMb2NhdGlvbgotU29ydEJ5TG9jYXRpb25fdG9vbHRpcD0gU29ydCBieSBsb2NhdGlvbiBjb2x1bW4KLVNvcnRCeUNyZWF0aW9uVGltZV90ZXh0PSBieSBDciZlYXRpb24gVGltZQotU29ydEJ5Q3JlYXRpb25UaW1lX3Rvb2x0aXA9IFNvcnQgYnkgdGFzayBjcmVhdGlvbiB0aW1lCi1Tb3J0QXNjZW5kaW5nX3RleHQ9ICZBc2NlbmRpbmcKLVNvcnRBc2NlbmRpbmdfdG9vbHRpcD0gU29ydCBhc2NlbmRpbmcKLVNvcnREZXNjZW5kaW5nX3RleHQ9IERlJnNjZW5kaW5nCi1Tb3J0RGVzY2VuZGluZ190b29sdGlwPSBTb3J0IERlc2NlbmRpbmcKLQotR290b1Rhc2tfdGV4dCA9ICZHbyBUbwotR290b1Rhc2tfdG9vbHRpcCA9IEdvIFRvCi1Hb3RvVGFza19lcnJvck1lc3NhZ2UgPSBQcm9ibGVtcyBPcGVuaW5nIEVkaXRvcgotCi1QdXJnZUNvbXBsZXRlZF90ZXh0ID0gRGVsZXRlIENvbXBsZXRlZCAmVGFza3MKLVB1cmdlQ29tcGxldGVkX3Rvb2x0aXAgPSBEZWxldGUgQ29tcGxldGVkIFRhc2tzCi1QdXJnZUNvbXBsZXRlZF90aXRsZSA9IERlbGV0ZSBDb21wbGV0ZWQgVGFza3MKLVB1cmdlQ29tcGxldGVkX25vbmVDb21wbGV0ZWQgPSBObyBjb21wbGV0ZWQgdGFza3MgdG8gZGVsZXRlLgotUHVyZ2VDb21wbGV0ZWRfcGVybWFuZW50ID0gRG8geW91IHdhbnQgdG8gcGVybWFuZW50bHkgZGVsZXRlIGFsbCB7MH0gY29tcGxldGVkIHRhc2tzPwotUHVyZ2VDb21wbGV0ZWRfZXJyb3JNZXNzYWdlID0gRXJyb3IgZGVsZXRpbmcgY29tcGxldGVkIHRhc2tzCi0KLU1hcmtDb21wbGV0ZWRfdGV4dCA9ICZNYXJrIENvbXBsZXRlZAotTWFya0NvbXBsZXRlZF90b29sdGlwID0gTWFyayBDb21wbGV0ZWQKLQotU2VsZWN0QWxsX3RleHQgPSBTZWxlY3QgQSZsbAotU2VsZWN0QWxsX3Rvb2x0aXAgPSBTZWxlY3QgQWxsCi0KLVJlc29sdmVfdGV4dCA9ICZRdWljayBGaXguLi4KLVJlc29sdmVfdG9vbHRpcCA9IFF1aWNrIEZpeAotUmVzb2x2ZV90aXRsZSA9IFF1aWNrIEZpeAotUmVzb2x2ZV9ub1Jlc29sdXRpb25zTGFiZWwgPSBUaGVyZSBhcmUgbm8gcXVpY2sgZml4ZXMgYXZhaWxhYmxlIGZvciB0aGUgc2VsZWN0ZWQgbWFya2VyLgotCi1Qcm9wZXJ0aWVzX3RleHQgPSBQJnJvcGVydGllcwotUHJvcGVydGllc190b29sdGlwID0gUHJvcGVydGllcwotCi0jIC0tLSBGaWx0ZXIgRGlhbG9nIC0tLQotVGFza0xpc3RfZmlsdGVyID0gRmlsdGVyIFRhc2tzCi1UYXNrTGlzdF9zaG93SXRlbXNPZlR5cGUgPSBTaG93IGl0ZW1zIG9mICZ0eXBlOgotCi1UYXNrTGlzdF9hbnlSZXNvdXJjZSA9IE9uICZhbnkgcmVzb3VyY2UKLVRhc2tMaXN0X2FueVJlc291cmNlSW5TYW1lUHJvamVjdCA9IE9uIGFueSByZXNvdXJjZSBpbiBzYW1lICZwcm9qZWN0Ci1UYXNrTGlzdF9zZWxlY3RlZFJlc291cmNlID0gT24gc2VsZWN0ZWQgcmVzb3VyY2UgJm9ubHkKLVRhc2tMaXN0X3NlbGVjdGVkQW5kQ2hpbGRyZW4gPSBPbiBzZWxlY3RlZCByZXNvdXJjZSBhbmQgaXRzICZjaGlsZHJlbgotVGFza0xpc3Rfd29ya2luZ1NldCA9IE9uIHdvciZraW5nIHNldDogIHswfQotVGFza0xpc3Rfd29ya2luZ1NldFNlbGVjdCA9ICZTZWxlY3QuLi4KLVRhc2tMaXN0X25vV29ya2luZ1NldCA9IE9uIHdvciZraW5nIHNldDogIDxubyB3b3JraW5nIHNldCBzZWxlY3RlZD4KLQotVGFza0xpc3Rfd2hlcmVEZXNjcmlwdGlvbiA9IFdoZXJlICZkZXNjcmlwdGlvbgotVGFza0xpc3RfY29udGFpbnMgPSBjb250YWlucwotVGFza0xpc3RfZG9lc05vdENvbnRhaW4gPSBkb2VzIG5vdCBjb250YWluCi0KLVRhc2tMaXN0X3NldmVyaXR5X2xhYmVsID0gV2hlcmUgcHJvYmxlbSBzZSZ2ZXJpdHkgaXM6Ci1UYXNrTGlzdF9zZXZlcml0eV9lcnJvciA9ICZFcnJvcgotVGFza0xpc3Rfc2V2ZXJpdHlfd2FybmluZyA9IFdhcm5pbiZnCi1UYXNrTGlzdF9zZXZlcml0eV9pbmZvID0gJkluZm8KLQotVGFza0xpc3RfcHJpb3JpdHlfbGFiZWwgPSBXaGVyZSB0YXNrIHByaW9yaXQmeSBpczoKLVRhc2tMaXN0X3ByaW9yaXR5X2hpZ2ggPSAmSGlnaAotVGFza0xpc3RfcHJpb3JpdHlfbG93ID0gTG8mdwotVGFza0xpc3RfcHJpb3JpdHlfbm9ybWFsID0gJk5vcm1hbAotCi1UYXNrTGlzdF9zdGF0dXNfbGFiZWwgPSBXaGVyZSB0YXNrIHN0YXQmdXMgaXM6Ci1UYXNrTGlzdF9zdGF0dXNfY29tcGxldGVkID0gQ28mbXBsZXRlZAotVGFza0xpc3Rfc3RhdHVzX25vdENvbXBsZXRlZCA9IE5vdCBDb21wJmxldGVkCi0KLVRhc2tMaXN0X3Jlc2V0VGV4dCA9ICZSZXN0b3JlIERlZmF1bHRzCi0KLVRhc2tMaXN0X2xpbWl0VmlzaWJsZVRhc2tzVG8gPSBMaW1pdCB2aXNpJmJsZSBpdGVtcyB0bzoKLVRhc2tMaXN0X3RpdGxlTWFya2VyTGltaXRJbnZhbGlkID0gRXJyb3IKLVRhc2tMaXN0X21lc3NhZ2VNYXJrZXJMaW1pdEludmFsaWQgPSBUaGUgdmlzaWJsZSBpdGVtIGxpbWl0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLgotVGFza1Byb3BlcnRpZXNEaWFsb2dfV29ya2luZ09uTWFya2VyPVdvcmtpbmcgb24gTWFya2VyCi1UYXNrUHJvcGVydGllc0RpYWxvZ19DcmVhdGluZ01hcmtlcj1DcmVhdGluZyBtYXJrZXIKLQotIyAtLS0gUHJvcGVydGllcyBEaWFsb2cgLS0tCi1UYXNrUHJvcF9uZXdUYXNrVGl0bGUgPSBOZXcgVGFzawotVGFza1Byb3BfcHJvcGVydGllc1RpdGxlID0gezB9IFByb3BlcnRpZXMKLSNUYXNrUHJvcC50aXRsZUZtdCA9IHswfSAtIHsxfQotVGFza1Byb3BfZGVzY3JpcHRpb24gPSAmRGVzY3JpcHRpb246Ci1UYXNrUHJvcF9jcmVhdGlvblRpbWUgPSBDcmVhdGlvbiAmVGltZToKLVRhc2tQcm9wX3ByaW9yaXR5ID0gJlByaW9yaXR5OgotVGFza1Byb3BfY29tcGxldGVkID0gJkNvbXBsZXRlZAotVGFza1Byb3Bfc2V2ZXJpdHkgPSBTZXZlcml0eToKLVRhc2tQcm9wX29uUmVzb3VyY2UgPSBPbiAmUmVzb3VyY2U6Ci1UYXNrUHJvcF9pbkZvbGRlciA9IEluICZGb2xkZXI6Ci1UYXNrUHJvcF9sb2NhdGlvbiA9ICZMb2NhdGlvbjoKLVRhc2tQcm9wX2Vycm9yTWVzc2FnZSA9IEVycm9yIGNyZWF0aW5nIG9yIG1vZGlmeWluZyB0YXNrCi0KLUNvcHlUb0NsaXBib2FyZFByb2JsZW1EaWFsb2dfdGl0bGU9UHJvYmxlbSBDb3B5aW5nIHRvIENsaXBib2FyZAotQ29weVRvQ2xpcGJvYXJkUHJvYmxlbURpYWxvZ19tZXNzYWdlPVRoZXJlIHdhcyBhIHByb2JsZW0gd2hlbiBhY2Nlc3NpbmcgdGhlIHN5c3RlbSBjbGlwYm9hcmQuIFJldHJ5PwotCi1UYXNrUHJvcGVydGllc0RpYWxvZ19VcGRhdGluZ0F0dHJpYnV0ZXM9VXBkYXRpbmcgYXR0cmlidXRlcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL0FyY2hpdmVGaWxlRXhwb3J0T3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvQXJjaGl2ZUZpbGVFeHBvcnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlZWFlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvQXJjaGl2ZUZpbGVFeHBvcnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uTW9kYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKglPcGVyYXRpb24gZm9yIGV4cG9ydGluZyBhIHJlc291cmNlIGFuZCBpdHMgY2hpbGRyZW4gdG8gYSBuZXcgLnppcCBvcgotICogIC50YXIuZ3ogZmlsZS4KLSAqICAKLSAqICBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbiBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0gICAgcHJpdmF0ZSBJRmlsZUV4cG9ydGVyIGV4cG9ydGVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzdGluYXRpb25GaWxlbmFtZTsKLQotICAgIHByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0gICAgcHJpdmF0ZSBMaXN0IHJlc291cmNlc1RvRXhwb3J0OwotCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2UgcmVzb3VyY2U7Ci0KLSAgICBwcml2YXRlIExpc3QgZXJyb3JUYWJsZSA9IG5ldyBBcnJheUxpc3QoMSk7IC8vSVN0YXR1cwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUNvbXByZXNzaW9uID0gdHJ1ZTsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlVGFyRm9ybWF0ID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlTGVhZHVwU3RydWN0dXJlID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqCUNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLiAgVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdpc2ggdG8KLSAgICAgKglleHBvcnQgc3BlY2lmaWMgcmVzb3VyY2VzIHdpdGhvdXQgYSBjb21tb24gcGFyZW50IHJlc291cmNlCi0gICAgICoKLSAgICAgKglAcGFyYW0gcmVzb3VyY2VzIGphdmEudXRpbC5WZWN0b3IKLSAgICAgKglAcGFyYW0gZmlsZW5hbWUgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbihMaXN0IHJlc291cmNlcywgU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgLy8gRWxpbWluYXRlIHJlZHVuZGFuY2llcyBpbiBsaXN0IG9mIHJlc291cmNlcyBiZWluZyBleHBvcnRlZAotICAgICAgICBJdGVyYXRvciBlbGVtZW50c0VudW0gPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGVsZW1lbnRzRW51bS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UgPSAoSVJlc291cmNlKSBlbGVtZW50c0VudW0ubmV4dCgpOwotICAgICAgICAgICAgaWYgKGlzRGVzY2VuZGVudChyZXNvdXJjZXMsIGN1cnJlbnRSZXNvdXJjZSkpCi0gICAgICAgICAgICAgICAgZWxlbWVudHNFbnVtLnJlbW92ZSgpOyAvL1JlbW92ZXMgY3VycmVudFJlc291cmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzb3VyY2VzVG9FeHBvcnQgPSByZXNvdXJjZXM7Ci0gICAgICAgIGRlc3RpbmF0aW9uRmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuICBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2lzaAotICAgICAqICB0byByZWN1cnNpdmVseSBleHBvcnQgYSBzaW5nbGUgcmVzb3VyY2UuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIHJlcyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0gICAgICogIEBwYXJhbSBmaWxlbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIEFyY2hpdmVGaWxlRXhwb3J0T3BlcmF0aW9uKElSZXNvdXJjZSByZXMsIFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICByZXNvdXJjZSA9IHJlczsKLSAgICAgICAgZGVzdGluYXRpb25GaWxlbmFtZSA9IGZpbGVuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4gIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3aXNoIHRvCi0gICAgICogIGV4cG9ydCBzcGVjaWZpYyByZXNvdXJjZXMgd2l0aCBhIGNvbW1vbiBwYXJlbnQgcmVzb3VyY2UgKGFmZmVjdHMgY29udGFpbmVyCi0gICAgICogIGRpcmVjdG9yeSBjcmVhdGlvbikKLSAgICAgKgotICAgICAqICBAcGFyYW0gcmVzIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZQotICAgICAqICBAcGFyYW0gcmVzb3VyY2VzIGphdmEudXRpbC5WZWN0b3IKLSAgICAgKiAgQHBhcmFtIGZpbGVuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJjaGl2ZUZpbGVFeHBvcnRPcGVyYXRpb24oSVJlc291cmNlIHJlcywgTGlzdCByZXNvdXJjZXMsIFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICB0aGlzKHJlcywgZmlsZW5hbWUpOwotICAgICAgICByZXNvdXJjZXNUb0V4cG9ydCA9IHJlc291cmNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGVycm9yIHRhYmxlIHdpdGggdGhlIHBhc3NlZCBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotICAgICAgICBlcnJvclRhYmxlLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsIDAsIG1lc3NhZ2UsIGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQW5zd2VyIHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZSByZXNvdXJjZXMgdGhhdCBleGlzdCBhdCBvciBiZWxvdyBzZWxmCi0gICAgICogIGluIHRoZSByZXNvdXJjZXMgaGllcmFyY2h5LgotICAgICAqCi0gICAgICogIEByZXR1cm4gaW50Ci0gICAgICogIEBwYXJhbSBjaGVja1Jlc291cmNlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgY291bnRDaGlsZHJlbk9mKElSZXNvdXJjZSBjaGVja1Jlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjaGVja1Jlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLSAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGlmIChjaGVja1Jlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2VbXSBjaGlsZHJlbiA9ICgoSUNvbnRhaW5lcikgY2hlY2tSZXNvdXJjZSkubWVtYmVycygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudENoaWxkcmVuT2YoY2hpbGRyZW5baV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciBhIGJvb2xlYW4gaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGZpbGUgcmVzb3VyY2VzIHRoYXQgd2VyZQotICAgICAqCXNwZWNpZmllZCBmb3IgZXhwb3J0Ci0gICAgICoKLSAgICAgKglAcmV0dXJuIGludAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgY291bnRTZWxlY3RlZFJlc291cmNlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgICAgIEl0ZXJhdG9yIHJlc291cmNlcyA9IHJlc291cmNlc1RvRXhwb3J0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChyZXNvdXJjZXMuaGFzTmV4dCgpKQotICAgICAgICAgICAgcmVzdWx0ICs9IGNvdW50Q2hpbGRyZW5PZigoSVJlc291cmNlKSByZXNvdXJjZXMubmV4dCgpKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBFeHBvcnQgdGhlIHBhc3NlZCByZXNvdXJjZSB0byB0aGUgZGVzdGluYXRpb24gLnppcC4gRXhwb3J0IHdpdGgKLSAgICAgKiBubyBwYXRoIGxlYWR1cAotICAgICAqCi0gICAgICogIEBwYXJhbSBleHBvcnRSZXNvdXJjZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHBvcnRSZXNvdXJjZShJUmVzb3VyY2UgZXhwb3J0UmVzb3VyY2UpCi0gICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBleHBvcnRSZXNvdXJjZShleHBvcnRSZXNvdXJjZSwgMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEV4cG9ydCB0aGUgcGFzc2VkIHJlc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbiAuemlwCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGV4cG9ydFJlc291cmNlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZQotICAgICAqICBAcGFyYW0gbGVhZHVwRGVwdGggdGhlIG51bWJlciBvZiByZXNvdXJjZSBsZXZlbHMgdG8gYmUgaW5jbHVkZWQgaW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBwYXRoIGluY2x1ZGluZyB0aGUgcmVzb3Vyc2UgaXRzZWxmLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGV4cG9ydFJlc291cmNlKElSZXNvdXJjZSBleHBvcnRSZXNvdXJjZSwgaW50IGxlYWR1cERlcHRoKQotICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFleHBvcnRSZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoZXhwb3J0UmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25OYW1lOwotICAgICAgICAgICAgSVBhdGggZnVsbFBhdGggPSBleHBvcnRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgICAgaWYgKGNyZWF0ZUxlYWR1cFN0cnVjdHVyZSkKLSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbk5hbWUgPSBmdWxsUGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uTmFtZSA9IGZ1bGxQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBmdWxsUGF0aC5zZWdtZW50Q291bnQoKSAtIGxlYWR1cERlcHRoKS50b1N0cmluZygpOwotICAgICAgICAgICAgbW9uaXRvci5zdWJUYXNrKGRlc3RpbmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZXhwb3J0ZXIud3JpdGUoKElGaWxlKSBleHBvcnRSZXNvdXJjZSwgZGVzdGluYXRpb25OYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhZGRFcnJvcihOTFMuYmluZChEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfZXJyb3JFeHBvcnRpbmcsIGV4cG9ydFJlc291cmNlLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCksIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhZGRFcnJvcihOTFMuYmluZChEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfZXJyb3JFeHBvcnRpbmcsIGV4cG9ydFJlc291cmNlLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCksIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgTW9kYWxDb250ZXh0LmNoZWNrQ2FuY2VsZWQobW9uaXRvcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2VbXSBjaGlsZHJlbiA9IG51bGw7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSAoKElDb250YWluZXIpIGV4cG9ydFJlc291cmNlKS5tZW1iZXJzKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gYmVjYXVzZSBhbiAjaXNBY2Nlc3NpYmxlIGNoZWNrIGlzIGRvbmUgYmVmb3JlICNtZW1iZXJzIGlzIGludm9rZWQKLSAgICAgICAgICAgICAgICBhZGRFcnJvcihOTFMuYmluZChEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfZXJyb3JFeHBvcnRpbmcsIGV4cG9ydFJlc291cmNlLmdldEZ1bGxQYXRoKCkpLCBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBleHBvcnRSZXNvdXJjZShjaGlsZHJlbltpXSwgbGVhZHVwRGVwdGggKyAxKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJRXhwb3J0IHRoZSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoZSBwcmV2aW91c2x5LWRlZmluZWQKLSAgICAgKglyZXNvdXJjZXNUb0V4cG9ydCBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhwb3J0U3BlY2lmaWVkUmVzb3VyY2VzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgSXRlcmF0b3IgcmVzb3VyY2VzID0gcmVzb3VyY2VzVG9FeHBvcnQuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAocmVzb3VyY2VzLmhhc05leHQoKSkgewotICAgICAgICAgICAgSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSA9IChJUmVzb3VyY2UpIHJlc291cmNlcy5uZXh0KCk7Ci0gICAgICAgICAgICBleHBvcnRSZXNvdXJjZShjdXJyZW50UmVzb3VyY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIHRoZSBlcnJvciB0YWJsZQotICAgICAqCi0gICAgICoJQHJldHVybiBWZWN0b3Igb2YgSVN0YXR1cwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldFJlc3VsdCgpIHsKLSAgICAgICAgcmV0dXJuIGVycm9yVGFibGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICogSWYgdGhlcmUgd2VyZSBhbnkgZXJyb3JzLCB0aGUgcmVzdWx0IGlzIGEgc3RhdHVzIG9iamVjdCBjb250YWluaW5nCi0gICAgICogaW5kaXZpZHVhbCBzdGF0dXMgb2JqZWN0cyBmb3IgZWFjaCBlcnJvci4KLSAgICAgKiBJZiB0aGVyZSB3ZXJlIG5vIGVycm9ycywgdGhlIHJlc3VsdCBpcyBhIHN0YXR1cyBvYmplY3Qgd2l0aCBlcnJvciBjb2RlIDxjb2RlPk9LPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHN0YXR1cwotICAgICAqLwotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgSVN0YXR1c1tdIGVycm9ycyA9IG5ldyBJU3RhdHVzW2Vycm9yVGFibGUuc2l6ZSgpXTsKLSAgICAgICAgZXJyb3JUYWJsZS50b0FycmF5KGVycm9ycyk7Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlTdGF0dXMoCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsCi0gICAgICAgICAgICAgICAgSVN0YXR1cy5PSywKLSAgICAgICAgICAgICAgICBlcnJvcnMsCi0gICAgICAgICAgICAgICAgRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbl9wcm9ibGVtc0V4cG9ydGluZywKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglJbml0aWFsaXplIHRoaXMgb3BlcmF0aW9uCi0gICAgICoKLSAgICAgKglAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAJaWYodXNlVGFyRm9ybWF0KSB7Ci0gICAgCQlleHBvcnRlciA9IG5ldyBUYXJGaWxlRXhwb3J0ZXIoZGVzdGluYXRpb25GaWxlbmFtZSwgdXNlQ29tcHJlc3Npb24pOwotICAgIAl9IGVsc2UgewotICAgICAgICAJZXhwb3J0ZXIgPSBuZXcgWmlwRmlsZUV4cG9ydGVyKGRlc3RpbmF0aW9uRmlsZW5hbWUsIHVzZUNvbXByZXNzaW9uKTsKLSAgICAJfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBbnN3ZXIgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFzc2VkIGNoaWxkIGlzIGEgZGVzY2VuZGVudAotICAgICAqICBvZiBvbmUgb3IgbW9yZSBtZW1iZXJzIG9mIHRoZSBwYXNzZWQgcmVzb3VyY2VzIGNvbGxlY3Rpb24KLSAgICAgKgotICAgICAqICBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKiAgQHBhcmFtIHJlc291cmNlcyBqYXZhLnV0aWwuVmVjdG9yCi0gICAgICogIEBwYXJhbSBjaGlsZCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Rlc2NlbmRlbnQoTGlzdCByZXNvdXJjZXMsIElSZXNvdXJjZSBjaGlsZCkgewotICAgICAgICBpZiAoY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIElSZXNvdXJjZSBwYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnQoKTsKLSAgICAgICAgaWYgKHJlc291cmNlcy5jb250YWlucyhwYXJlbnQpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgcmV0dXJuIGlzRGVzY2VuZGVudChyZXNvdXJjZXMsIHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJRXhwb3J0IHRoZSByZXNvdXJjZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgc3BlY2lmaWVkIGZvciBleHBvcnQKLSAgICAgKgkob3IgaWYgYSBzaW5nbGUgcmVzb3VyY2Ugd2FzIHNwZWNpZmllZCB0aGVuIGV4cG9ydCBpdCByZWN1cnNpdmVseSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluaXRpYWxpemUoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSwgTkxTLmJpbmQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuWmlwRXhwb3J0X2Nhbm5vdE9wZW4sIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gaWUuLSBhIHNpbmdsZSByZXNvdXJjZSBmb3IgcmVjdXJzaXZlIGV4cG9ydCB3YXMgc3BlY2lmaWVkCi0gICAgICAgICAgICBpbnQgdG90YWxXb3JrID0gSVByb2dyZXNzTW9uaXRvci5VTktOT1dOOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzVG9FeHBvcnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdG90YWxXb3JrID0gY291bnRDaGlsZHJlbk9mKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHRvdGFsV29yayA9IGNvdW50U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFNob3VsZCBub3QgaGFwcGVuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayhEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfZXhwb3J0aW5nVGl0bGUsIHRvdGFsV29yayk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VzVG9FeHBvcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGV4cG9ydFJlc291cmNlKHJlc291cmNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaWUuLSBhIGxpc3Qgb2Ygc3BlY2lmaWMgcmVzb3VyY2VzIHRvIGV4cG9ydCB3YXMgc3BlY2lmaWVkCi0gICAgICAgICAgICAgICAgZXhwb3J0U3BlY2lmaWVkUmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZXhwb3J0ZXIuZmluaXNoZWQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZChEYXRhVHJhbnNmZXJNZXNzYWdlcy5aaXBFeHBvcnRfY2Fubm90Q2xvc2UsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCVNldCB0aGlzIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGVhY2ggZXhwb3J0ZWQgcmVzb3VyY2UncyBwYXRoIHNob3VsZAotICAgICAqCWluY2x1ZGUgY29udGFpbm1lbnQgaGllcmFyY2hpZXMgYXMgZGljdGF0ZWQgYnkgaXRzIHBhcmVudHMKLSAgICAgKgotICAgICAqCUBwYXJhbSB2YWx1ZSBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q3JlYXRlTGVhZHVwU3RydWN0dXJlKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgY3JlYXRlTGVhZHVwU3RydWN0dXJlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJU2V0IHRoaXMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgZXhwb3J0ZWQgcmVzb3VyY2VzIHNob3VsZAotICAgICAqCWJlIGNvbXByZXNzZWQgKGFzIG9wcG9zZWQgdG8gc2ltcGx5IGJlaW5nIHN0b3JlZCkKLSAgICAgKgotICAgICAqCUBwYXJhbSB2YWx1ZSBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlQ29tcHJlc3Npb24oYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICB1c2VDb21wcmVzc2lvbiA9IHZhbHVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgb3V0cHV0Ci0gICAgICogaW4gdGFyLmd6IGZvcm1hdCByYXRoZXIgdGhhbiAuemlwIGZvcm1hdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZVRhckZvcm1hdChib29sZWFuIHZhbHVlKSB7Ci0gICAgCXVzZVRhckZvcm1hdCA9IHZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9BcmNoaXZlRmlsZU1hbmlwdWxhdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9BcmNoaXZlRmlsZU1hbmlwdWxhdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5MDE0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvQXJjaGl2ZUZpbGVNYW5pcHVsYXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIENvcHlyaWdodCAoYykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgUmVkIEhhdCwgSW5jIC0gRXh0cmFjdGVkIG1ldGhvZHMgZnJvbSBXaXphcmRBcmNoaXZlRmlsZVJlc291cmNlSW1wb3J0UGFnZTEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaE1lc3NhZ2VzOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVGaWxlTWFuaXB1bGF0aW9ucyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBaaXBMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIgemlwUHJvdmlkZXJDYWNoZTsKLQotCXByaXZhdGUgc3RhdGljIFRhckxldmVsZWRTdHJ1Y3R1cmVQcm92aWRlciB0YXJQcm92aWRlckNhY2hlOwotCi0JLyoqCi0JICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gZmlsZW5hbWUgaXMgaW4gLnRhci5neiBvciAudGFyCi0JICogZm9ybWF0LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqICAgICAgICAgICAgZmlsZSB0byB0ZXN0Ci0JICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlIGlzIGluIHRhciBmb3JtYXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUYXJGaWxlKFN0cmluZyBmaWxlTmFtZSkgewotCQlpZiAoZmlsZU5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQl0cnkgewotCQkJbmV3IFRhckZpbGUoZmlsZU5hbWUpOwotCQl9IGNhdGNoIChUYXJFeGNlcHRpb24gdGFyRXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBmaWxlbmFtZSBpcyBpbiAuemlwIG9yIC5qYXIKLQkgKiBmb3JtYXQuCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogICAgICAgICAgICBmaWxlIHRvIHRlc3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgaXMgaW4gdGFyIGZvcm1hdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ppcEZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXRyeSB7Ci0JCQluZXcgWmlwRmlsZShmaWxlTmFtZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGNhY2hlZCBzdHJ1Y3R1cmUgcHJvdmlkZXIgYWZ0ZXIgZmlyc3QgZmluYWxpemluZyBpdCBwcm9wZXJseS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiAgICAgICAgICAgIFRoZSBzaGVsbCB0byBkaXNwbGF5IGFueSBwb3NzaWJsZSBEaWFsb2dzIGluCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyUHJvdmlkZXJDYWNoZShTaGVsbCBzaGVsbCkgewotCQlpZiAoemlwUHJvdmlkZXJDYWNoZSAhPSBudWxsKSB7Ci0JCQljbG9zZVppcEZpbGUoemlwUHJvdmlkZXJDYWNoZS5nZXRaaXBGaWxlKCksIHNoZWxsKTsKLQkJCXppcFByb3ZpZGVyQ2FjaGUgPSBudWxsOwotCQl9Ci0JCXRhclByb3ZpZGVyQ2FjaGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXRaaXAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3R1cmUgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFppcExldmVsZWRTdHJ1Y3R1cmVQcm92aWRlciBnZXRaaXBTdHJ1Y3R1cmVQcm92aWRlcigKLQkJCVppcEZpbGUgdGFyZ2V0WmlwLCBTaGVsbCBzaGVsbCkgewotCQlpZiAoemlwUHJvdmlkZXJDYWNoZSA9PSBudWxsKQotCQkJemlwUHJvdmlkZXJDYWNoZSA9IG5ldyBaaXBMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIodGFyZ2V0WmlwKTsKLQkJZWxzZSBpZiAoIXppcFByb3ZpZGVyQ2FjaGUuZ2V0WmlwRmlsZSgpLmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJdGFyZ2V0WmlwLmdldE5hbWUoKSkpIHsKLQkJCWNsZWFyUHJvdmlkZXJDYWNoZShzaGVsbCk7Ci0JCQkvLyBpZS4tIG5ldyB2YWx1ZSwgc28gZmluYWxpemUmcmVtb3ZlIG9sZCB2YWx1ZQotCQkJemlwUHJvdmlkZXJDYWNoZSA9IG5ldyBaaXBMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIodGFyZ2V0WmlwKTsKLQkJfSBlbHNlIGlmICghemlwUHJvdmlkZXJDYWNoZS5nZXRaaXBGaWxlKCkuZXF1YWxzKHRhcmdldFppcCkpCi0JCQljbG9zZVppcEZpbGUodGFyZ2V0WmlwLCBzaGVsbCk7IC8vIGllLi0gZHVwbGljYXRlIGhhbmRsZSB0byBzYW1lCi0JCS8vIC56aXAKLQotCQlyZXR1cm4gemlwUHJvdmlkZXJDYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiBBdHRlbXB0cyB0byBjbG9zZSB0aGUgcGFzc2VkIHppcCBmaWxlLCBhbmQgYW5zd2VycyBhIGJvb2xlYW4gaW5kaWNhdGluZwotCSAqIHN1Y2Nlc3MuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSB6aXAgZmlsZSB0byBhdHRlbXB0IHRvIGNsb3NlCi0JICogQHBhcmFtIHNoZWxsCi0JICogICAgICAgICAgICBUaGUgc2hlbGwgdG8gZGlzcGxheSBlcnJvciBkaWFsb2dzIGluCi0JICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbG9zZVppcEZpbGUoWmlwRmlsZSBmaWxlLCBTaGVsbCBzaGVsbCkgewotCQl0cnkgewotCQkJZmlsZS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlkaXNwbGF5RXJyb3JEaWFsb2coRGF0YVRyYW5zZmVyTWVzc2FnZXMuWmlwSW1wb3J0X2NvdWxkTm90Q2xvc2UsCi0JCQkJCXNoZWxsKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJ1Y3R1cmUgcHJvdmlkZXIgZm9yIHRoZSBzcGVjaWZpZWQgdGFyIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRhcmdldFRhcgotCSAqICAgICAgICAgICAgVGhlIHNwZWNpZmllZCB0YXIgZmlsZQotCSAqIEBwYXJhbSBzaGVsbAotCSAqICAgICAgICAgICAgVGhlIHNoZWxsIHRvIGRpc3BsYXkgZGlhbG9ncyBpbgotCSAqIEByZXR1cm4gdGhlIHN0cnVjdHVyZSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFyTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyIGdldFRhclN0cnVjdHVyZVByb3ZpZGVyKAotCQkJVGFyRmlsZSB0YXJnZXRUYXIsIFNoZWxsIHNoZWxsKSB7Ci0JCWlmICh0YXJQcm92aWRlckNhY2hlID09IG51bGwpCi0JCQl0YXJQcm92aWRlckNhY2hlID0gbmV3IFRhckxldmVsZWRTdHJ1Y3R1cmVQcm92aWRlcih0YXJnZXRUYXIpOwotCQllbHNlIGlmICghdGFyUHJvdmlkZXJDYWNoZS5nZXRUYXJGaWxlKCkuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQl0YXJnZXRUYXIuZ2V0TmFtZSgpKSkgewotCQkJQXJjaGl2ZUZpbGVNYW5pcHVsYXRpb25zLmNsZWFyUHJvdmlkZXJDYWNoZShzaGVsbCk7Ci0JCQkvLyBpZS4tIG5ldyB2YWx1ZSwgc28gZmluYWxpemUmcmVtb3ZlIG9sZCB2YWx1ZQotCQkJdGFyUHJvdmlkZXJDYWNoZSA9IG5ldyBUYXJMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIodGFyZ2V0VGFyKTsKLQkJfQotCi0JCXJldHVybiB0YXJQcm92aWRlckNhY2hlOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgYW4gZXJyb3IgZGlhbG9nIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkaXNwbGF5RXJyb3JEaWFsb2coU3RyaW5nIG1lc3NhZ2UsIFNoZWxsIHNoZWxsKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBnZXRFcnJvckRpYWxvZ1RpdGxlKCksIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdGl0bGUgZm9yIGFuIGVycm9yIGRpYWxvZy4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RXJyb3JEaWFsb2dUaXRsZSgpIHsKLQkJcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEV4cG9ydFBhZ2VfaW50ZXJuYWxFcnJvclRpdGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9EYXRhVHJhbnNmZXJNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2Zlck1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzUwOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2Zlck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBSZWQgSGF0LCBJbmMgLSBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VbX0FyY2hpdmVTZWxlY3RUaXRsZSwKLSAqIAkJCQkJCQkJCQkgICBfU2VsZWN0QXJjaGl2ZURpYWxvZ1RpdGxlXQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIERhdGFUcmFuc2Zlck1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXIubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIERhdGEgVHJhbnNmZXIgV2l6YXJkcwotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFUcmFuc2Zlcl9maWxlU3lzdGVtVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWmlwRXhwb3J0X2V4cG9ydFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFyY2hpdmVFeHBvcnRfZXhwb3J0VGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhVHJhbnNmZXJfYnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFUcmFuc2Zlcl9zZWxlY3RUeXBlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhVHJhbnNmZXJfc2VsZWN0QWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFUcmFuc2Zlcl9kZXNlbGVjdEFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhVHJhbnNmZXJfcmVmcmVzaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhVHJhbnNmZXJfY2Fubm90T3ZlcndyaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFUcmFuc2Zlcl9lbXB0eVN0cmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhVHJhbnNmZXJfc2Nhbm5pbmdDaGlsZHJlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhVHJhbnNmZXJfc2Nhbm5pbmdNYXRjaGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhVHJhbnNmZXJfaW5mb3JtYXRpb247Ci0KLQkvLyAtLS0gSW1wb3J0IFdpemFyZHMgLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YVRyYW5zZmVyX2ltcG9ydFRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YVRyYW5zZmVyX2ltcG9ydFRhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0T3BlcmF0aW9uX2Nhbm5vdENvcHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0T3BlcmF0aW9uX2ltcG9ydFByb2JsZW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydE9wZXJhdGlvbl9vcGVuU3RyZWFtRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0T3BlcmF0aW9uX2Nsb3NlU3RyZWFtRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0T3BlcmF0aW9uX2NvcmVJbXBvcnRFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRPcGVyYXRpb25fdGFyZ2V0U2FtZUFzU291cmNlRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0UGFnZV9maWx0ZXJTZWxlY3Rpb25zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUltcG9ydF9zZWxlY3RTb3VyY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUltcG9ydF9zZWxlY3RTb3VyY2VUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlSW1wb3J0X2Zyb21EaXJlY3Rvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUltcG9ydF9pbXBvcnRGaWxlU3lzdGVtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVJbXBvcnRfb3ZlcndyaXRlRXhpc3Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUltcG9ydF9jcmVhdGVDb21wbGV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlSW1wb3J0X2NyZWF0ZVNlbGVjdGVkRm9sZGVyczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlSW1wb3J0X25vbmVTZWxlY3RlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlSW1wb3J0X2ludmFsaWRTb3VyY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUltcG9ydF9zb3VyY2VFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlSW1wb3J0X2ltcG9ydFByb2JsZW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFppcEltcG9ydF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBaaXBJbXBvcnRfY291bGROb3RDbG9zZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBaaXBJbXBvcnRfYmFkRm9ybWF0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFppcEltcG9ydF9jb3VsZE5vdFJlYWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWmlwSW1wb3J0X2Zyb21GaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFppcEltcG9ydFNvdXJjZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFyY2hpdmVJbXBvcnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXJjaGl2ZUltcG9ydF9mcm9tRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcmNoaXZlSW1wb3J0U291cmNlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhckltcG9ydF9iYWRGb3JtYXQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlX2xvY2F0aW9uRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9wcm9qZWN0TG9jYXRpb25FbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlX3Byb2plY3RFeGlzdHNNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEV4dGVybmFsUHJvamVjdEltcG9ydFBhZ2VfcHJvamVjdENvbnRlbnRzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9uYW1lTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlX1Jvb3RTZWxlY3RUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEV4dGVybmFsUHJvamVjdEltcG9ydFBhZ2VfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9ub3RBUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfUHJvamVjdHNMaXN0VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlX1Byb2Nlc3NpbmdNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFByb2plY3RzSW1wb3J0UGFnZV9TZWxlY3REaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfU2VhcmNoaW5nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlX2Vycm9yTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfSW1wb3J0UHJvamVjdHNUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlX2Nhc2VWYXJpYW50RXhpc3RzRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9kaXJlY3RvcnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfSW1wb3J0UHJvamVjdHNEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfQ2hlY2tpbmdNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFByb2plY3RzSW1wb3J0UGFnZV9BcmNoaXZlU2VsZWN0VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlX1NlbGVjdEFyY2hpdmVEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfQ3JlYXRlUHJvamVjdHNUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFByb2plY3RzSW1wb3J0UGFnZV9Db3B5UHJvamVjdHNJbnRvV29ya3NwYWNlOwotCi0JLy8gLS0tIEV4cG9ydCBXaXphcmRzIC0tLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFUcmFuc2Zlcl9leHBvcnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhVHJhbnNmZXJfZXhwb3J0aW5nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YVRyYW5zZmVyX2NyZWF0ZVRhcmdldERpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhVHJhbnNmZXJfZGlyZWN0b3J5Q3JlYXRpb25FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhVHJhbnNmZXJfZXJyb3JFeHBvcnRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YVRyYW5zZmVyX2V4cG9ydFByb2JsZW1zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0RmlsZV9vdmVyd3JpdGVFeGlzdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlRXhwb3J0X3NlbGVjdERlc3RpbmF0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUV4cG9ydF9zZWxlY3REZXN0aW5hdGlvbk1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUV4cG9ydF9leHBvcnRMb2NhbEZpbGVTeXN0ZW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUV4cG9ydF9kZXN0aW5hdGlvbkVtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVFeHBvcnRfY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVFeHBvcnRfY3JlYXRlU2VsZWN0ZWREaXJlY3RvcmllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlRXhwb3J0X25vbmVTZWxlY3RlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlRXhwb3J0X2RpcmVjdG9yeUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlRXhwb3J0X2NvbmZsaWN0aW5nQ29udGFpbmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVFeHBvcnRfcm9vdE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbl9wcm9ibGVtc0V4cG9ydGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlRXhwb3J0X3RvRGlyZWN0b3J5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWmlwRXhwb3J0X2NvbXByZXNzQ29udGVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWmlwRXhwb3J0X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFppcEV4cG9ydF9kZXN0aW5hdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFppcEV4cG9ydF9tdXN0QmVGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFppcEV4cG9ydF9hbHJlYWR5RXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFppcEV4cG9ydF9hbHJlYWR5RXhpc3RzRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWmlwRXhwb3J0X2Nhbm5vdE9wZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWmlwRXhwb3J0X2Nhbm5vdENsb3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFppcEV4cG9ydF9zZWxlY3REZXN0aW5hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFppcEV4cG9ydF9kZXN0aW5hdGlvbkVtcHR5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXJjaGl2ZUV4cG9ydF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcmNoaXZlRXhwb3J0X2Rlc3RpbmF0aW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXJjaGl2ZUV4cG9ydF9zZWxlY3REZXN0aW5hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFyY2hpdmVFeHBvcnRfZGVzdGluYXRpb25FbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcmNoaXZlRXhwb3J0X3NhdmVJblppcEZvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcmNoaXZlRXhwb3J0X3NhdmVJblRhckZvcm1hdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhckltcG9ydF9pbnZhbGlkX3Rhcl9mb3JtYXQ7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRGF0YVRyYW5zZmVyTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL0ZpbGVTeXN0ZW1FeHBvcnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4Y2MzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLk1vZGFsQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JT3ZlcndyaXRlUXVlcnk7Ci0KLQotLyoqCi0gKglPcGVyYXRpb24gZm9yIGV4cG9ydGluZyB0aGUgY29udGVudHMgb2YgYSByZXNvdXJjZSB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlU3lzdGVtRXhwb3J0T3BlcmF0aW9uIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLSAgICBwcml2YXRlIElQYXRoIHBhdGg7Ci0KLSAgICBwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotICAgIHByaXZhdGUgRmlsZVN5c3RlbUV4cG9ydGVyIGV4cG9ydGVyID0gbmV3IEZpbGVTeXN0ZW1FeHBvcnRlcigpOwotCi0gICAgcHJpdmF0ZSBMaXN0IHJlc291cmNlc1RvRXhwb3J0OwotCi0gICAgcHJpdmF0ZSBJT3ZlcndyaXRlUXVlcnkgb3ZlcndyaXRlQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIElSZXNvdXJjZSByZXNvdXJjZTsKLQotICAgIHByaXZhdGUgTGlzdCBlcnJvclRhYmxlID0gbmV3IEFycmF5TGlzdCgxKTsKLQotICAgIC8vVGhlIGNvbnN0YW50cyBmb3IgdGhlIG92ZXJ3cml0ZSAzIHN0YXRlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJXUklURV9OT1RfU0VUID0gMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPVkVSV1JJVEVfTk9ORSA9IDE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUldSSVRFX0FMTCA9IDI7Ci0KLSAgICBwcml2YXRlIGludCBvdmVyd3JpdGVTdGF0ZSA9IE9WRVJXUklURV9OT1RfU0VUOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUxlYWR1cFN0cnVjdHVyZSA9IHRydWU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlQ29udGFpbmVyRGlyZWN0b3JpZXMgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLiAgVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdpc2ggdG8KLSAgICAgKiAgZXhwb3J0IHNwZWNpZmljIHJlc291cmNlcyB3aXRob3V0IGEgY29tbW9uIHBhcmVudCByZXNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBGaWxlU3lzdGVtRXhwb3J0T3BlcmF0aW9uKExpc3QgcmVzb3VyY2VzLCBTdHJpbmcgZGVzdGluYXRpb25QYXRoLAotICAgICAgICAgICAgSU92ZXJ3cml0ZVF1ZXJ5IG92ZXJ3cml0ZUltcGxlbWVudG9yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgLy8gRWxpbWluYXRlIHJlZHVuZGFuY2llcyBpbiBsaXN0IG9mIHJlc291cmNlcyBiZWluZyBleHBvcnRlZAotICAgICAgICBJdGVyYXRvciBlbGVtZW50c0VudW0gPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGVsZW1lbnRzRW51bS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UgPSAoSVJlc291cmNlKSBlbGVtZW50c0VudW0ubmV4dCgpOwotICAgICAgICAgICAgaWYgKGlzRGVzY2VuZGVudChyZXNvdXJjZXMsIGN1cnJlbnRSZXNvdXJjZSkpCi0gICAgICAgICAgICAgICAgZWxlbWVudHNFbnVtLnJlbW92ZSgpOyAvL1JlbW92ZSBjdXJyZW50UmVzb3VyY2UKLSAgICAgICAgfQotCi0gICAgICAgIHJlc291cmNlc1RvRXhwb3J0ID0gcmVzb3VyY2VzOwotICAgICAgICBwYXRoID0gbmV3IFBhdGgoZGVzdGluYXRpb25QYXRoKTsKLSAgICAgICAgb3ZlcndyaXRlQ2FsbGJhY2sgPSBvdmVyd3JpdGVJbXBsZW1lbnRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuICBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2lzaCB0bwotICAgICAqICByZWN1cnNpdmVseSBleHBvcnQgYSBzaW5nbGUgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbihJUmVzb3VyY2UgcmVzLCBTdHJpbmcgZGVzdGluYXRpb25QYXRoLAotICAgICAgICAgICAgSU92ZXJ3cml0ZVF1ZXJ5IG92ZXJ3cml0ZUltcGxlbWVudG9yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHJlc291cmNlID0gcmVzOwotICAgICAgICBwYXRoID0gbmV3IFBhdGgoZGVzdGluYXRpb25QYXRoKTsKLSAgICAgICAgb3ZlcndyaXRlQ2FsbGJhY2sgPSBvdmVyd3JpdGVJbXBsZW1lbnRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuICBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2lzaCB0bwotICAgICAqICBleHBvcnQgc3BlY2lmaWMgcmVzb3VyY2VzIHdpdGggYSBjb21tb24gcGFyZW50IHJlc291cmNlIChhZmZlY3RzIGNvbnRhaW5lcgotICAgICAqICBkaXJlY3RvcnkgY3JlYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIEZpbGVTeXN0ZW1FeHBvcnRPcGVyYXRpb24oSVJlc291cmNlIHJlcywgTGlzdCByZXNvdXJjZXMsCi0gICAgICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25QYXRoLCBJT3ZlcndyaXRlUXVlcnkgb3ZlcndyaXRlSW1wbGVtZW50b3IpIHsKLSAgICAgICAgdGhpcyhyZXMsIGRlc3RpbmF0aW9uUGF0aCwgb3ZlcndyaXRlSW1wbGVtZW50b3IpOwotICAgICAgICByZXNvdXJjZXNUb0V4cG9ydCA9IHJlc291cmNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGVycm9yIHRhYmxlIHdpdGggdGhlIHBhc3NlZCBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotICAgICAgICBlcnJvclRhYmxlLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBsYXRmb3JtVUkuUExVR0lOX0lELCAwLAotICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQW5zd2VyIHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZSByZXNvdXJjZXMgdGhhdCBleGlzdCBhdCBvciBiZWxvdyBzZWxmIGluIHRoZQotICAgICAqICByZXNvdXJjZXMgaGllcmFyY2h5LgotICAgICAqCi0gICAgICogIEByZXR1cm4gaW50Ci0gICAgICogIEBwYXJhbSBwYXJlbnRSZXNvdXJjZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNvdW50Q2hpbGRyZW5PZihJUmVzb3VyY2UgcGFyZW50UmVzb3VyY2UpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwYXJlbnRSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBpZiAocGFyZW50UmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZVtdIGNoaWxkcmVuID0gKChJQ29udGFpbmVyKSBwYXJlbnRSZXNvdXJjZSkubWVtYmVycygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudENoaWxkcmVuT2YoY2hpbGRyZW5baV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciBhIGJvb2xlYW4gaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGZpbGUgcmVzb3VyY2VzIHRoYXQgd2VyZQotICAgICAqCXNwZWNpZmllZCBmb3IgZXhwb3J0Ci0gICAgICoKLSAgICAgKglAcmV0dXJuIGludAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgY291bnRTZWxlY3RlZFJlc291cmNlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgICAgIEl0ZXJhdG9yIHJlc291cmNlcyA9IHJlc291cmNlc1RvRXhwb3J0Lml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNOZXh0KCkpCi0gICAgICAgICAgICByZXN1bHQgKz0gY291bnRDaGlsZHJlbk9mKChJUmVzb3VyY2UpIHJlc291cmNlcy5uZXh0KCkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZSB0aGUgZGlyZWN0b3JpZXMgcmVxdWlyZWQgZm9yIGV4cG9ydGluZyB0aGUgcGFzc2VkIHJlc291cmNlLAotICAgICAqICBiYXNlZCB1cG9uIGl0cyBjb250YWluZXIgaGllcmFyY2h5Ci0gICAgICoKLSAgICAgKiAgQHBhcmFtIGNoaWxkUmVzb3VyY2Ugb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGVhZHVwRGlyZWN0b3JpZXNGb3IoSVJlc291cmNlIGNoaWxkUmVzb3VyY2UpIHsKLSAgICAgICAgSVBhdGggcmVzb3VyY2VQYXRoID0gY2hpbGRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBwYXRoID0gcGF0aC5hcHBlbmQocmVzb3VyY2VQYXRoLnNlZ21lbnQoaSkpOwotICAgICAgICAgICAgZXhwb3J0ZXIuY3JlYXRlRm9sZGVyKHBhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJUmVjdXJzaXZlbHkgZXhwb3J0IHRoZSBwcmV2aW91c2x5LXNwZWNpZmllZCByZXNvdXJjZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGV4cG9ydEFsbFJlc291cmNlcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICBleHBvcnRGaWxlKChJRmlsZSkgcmVzb3VyY2UsIHBhdGgpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZXhwb3J0Q2hpbGRyZW4oKChJQ29udGFpbmVyKSByZXNvdXJjZSkubWVtYmVycygpLCBwYXRoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIG5vdCBzYWZlIHRvIHNob3cgYSBkaWFsb2cKLSAgICAgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2UgdGhlIGZpbGUgc3lzdGVtIGV4cG9ydCB3aXphcmQgZW5zdXJlcyB0aGF0IHRoZQotICAgICAgICAgICAgICAgIC8vIHNpbmdsZSByZXNvdXJjZSBjaG9zZW4gZm9yIGV4cG9ydCBpcyBib3RoIGV4aXN0ZW50IGFuZCBhY2Nlc3NpYmxlCi0gICAgICAgICAgICAgICAgZXJyb3JUYWJsZS5hZGQoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglFeHBvcnQgYWxsIG9mIHRoZSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoZSBwYXNzZWQgY29sbGVjdGlvbgotICAgICAqCi0gICAgICoJQHBhcmFtIGNoaWxkcmVuIGphdmEudXRpbC5FbnVtZXJhdGlvbgotICAgICAqCUBwYXJhbSBjdXJyZW50UGF0aCBJUGF0aAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGV4cG9ydENoaWxkcmVuKElSZXNvdXJjZVtdIGNoaWxkcmVuLCBJUGF0aCBjdXJyZW50UGF0aCkKLSAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSBjaGlsZCA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgaWYgKCFjaGlsZC5pc0FjY2Vzc2libGUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgaWYgKGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLSAgICAgICAgICAgICAgICBleHBvcnRGaWxlKChJRmlsZSkgY2hpbGQsIGN1cnJlbnRQYXRoKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIElQYXRoIGRlc3RpbmF0aW9uID0gY3VycmVudFBhdGguYXBwZW5kKGNoaWxkLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZXhwb3J0ZXIuY3JlYXRlRm9sZGVyKGRlc3RpbmF0aW9uKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBleHBvcnRDaGlsZHJlbigoKElDb250YWluZXIpIGNoaWxkKS5tZW1iZXJzKCksIGRlc3RpbmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90IHNhZmUgdG8gc2hvdyBhIGRpYWxvZwotICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2U6Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCByZWN1cnNpdmVseSBpdGVyYXRpbmcgb3ZlciB0aGUgcmVzdWx0IG9mICNtZW1iZXJzLAotICAgICAgICAgICAgICAgICAgICAvLwkJd2hpY2ggb25seSBhbnN3ZXJzIGV4aXN0aW5nIGNoaWxkcmVuCi0gICAgICAgICAgICAgICAgICAgIC8vIGlpLiB0aGVyZSBpcyBhbiAjaXNBY2Nlc3NpYmxlIGNoZWNrIGRvbmUgYmVmb3JlICNtZW1iZXJzIGlzIGludm9rZWQKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JUYWJsZS5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEV4cG9ydCB0aGUgcGFzc2VkIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbgotICAgICAqCi0gICAgICogIEBwYXJhbSBmaWxlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlCi0gICAgICogIEBwYXJhbSBsb2NhdGlvbiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHBvcnRGaWxlKElGaWxlIGZpbGUsIElQYXRoIGxvY2F0aW9uKQotICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgSVBhdGggZnVsbFBhdGggPSBsb2NhdGlvbi5hcHBlbmQoZmlsZS5nZXROYW1lKCkpOwotICAgICAgICBtb25pdG9yLnN1YlRhc2soZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotICAgICAgICBTdHJpbmcgcHJvcGVyUGF0aFN0cmluZyA9IGZ1bGxQYXRoLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUocHJvcGVyUGF0aFN0cmluZyk7Ci0KLSAgICAgICAgaWYgKHRhcmdldEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGlmICghdGFyZ2V0RmlsZS5jYW5Xcml0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JUYWJsZS5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQbGF0Zm9ybVVJLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5MUy5iaW5kKERhdGFUcmFuc2Zlck1lc3NhZ2VzLkRhdGFUcmFuc2Zlcl9jYW5ub3RPdmVyd3JpdGUsIHRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkpOwotICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG92ZXJ3cml0ZVN0YXRlID09IE9WRVJXUklURV9OT05FKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKG92ZXJ3cml0ZVN0YXRlICE9IE9WRVJXUklURV9BTEwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3ZlcndyaXRlQW5zd2VyID0gb3ZlcndyaXRlQ2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5xdWVyeU92ZXJ3cml0ZShwcm9wZXJQYXRoU3RyaW5nKTsKLQotICAgICAgICAgICAgICAgIGlmIChvdmVyd3JpdGVBbnN3ZXIuZXF1YWxzKElPdmVyd3JpdGVRdWVyeS5DQU5DRUwpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgICAgIGlmIChvdmVyd3JpdGVBbnN3ZXIuZXF1YWxzKElPdmVyd3JpdGVRdWVyeS5OTykpIHsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3ZlcndyaXRlQW5zd2VyLmVxdWFscyhJT3ZlcndyaXRlUXVlcnkuTk9fQUxMKSkgewotICAgICAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlU3RhdGUgPSBPVkVSV1JJVEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChvdmVyd3JpdGVBbnN3ZXIuZXF1YWxzKElPdmVyd3JpdGVRdWVyeS5BTEwpKQotICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVTdGF0ZSA9IE9WRVJXUklURV9BTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhwb3J0ZXIud3JpdGUoZmlsZSwgZnVsbFBhdGgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvclRhYmxlLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBsYXRmb3JtVUkuUExVR0lOX0lELCAwLAotICAgICAgICAgICAgICAgICAgICBOTFMuYmluZChEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfZXJyb3JFeHBvcnRpbmcsIGZ1bGxQYXRoLCBlLmdldE1lc3NhZ2UoKSksIGUpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvclRhYmxlLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBsYXRmb3JtVUkuUExVR0lOX0lELCAwLAotICAgICAgICAgICAgICAgICAgICBOTFMuYmluZChEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfZXJyb3JFeHBvcnRpbmcsIGZ1bGxQYXRoLCBlLmdldE1lc3NhZ2UoKSksIGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICBNb2RhbENvbnRleHQuY2hlY2tDYW5jZWxlZChtb25pdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglFeHBvcnQgdGhlIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhlIHByZXZpb3VzbHktZGVmaW5lZAotICAgICAqCXJlc291cmNlc1RvRXhwb3J0IGNvbGxlY3Rpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHBvcnRTcGVjaWZpZWRSZXNvdXJjZXMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBJdGVyYXRvciByZXNvdXJjZXMgPSByZXNvdXJjZXNUb0V4cG9ydC5pdGVyYXRvcigpOwotICAgICAgICBJUGF0aCBpbml0UGF0aCA9IChJUGF0aCkgcGF0aC5jbG9uZSgpOwotCi0gICAgICAgIHdoaWxlIChyZXNvdXJjZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgY3VycmVudFJlc291cmNlID0gKElSZXNvdXJjZSkgcmVzb3VyY2VzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghY3VycmVudFJlc291cmNlLmlzQWNjZXNzaWJsZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBwYXRoID0gaW5pdFBhdGg7Ci0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gcm9vdCByZXNvdXJjZSBzcGVjaWZpZWQgYW5kIGNyZWF0aW9uIG9mIGNvbnRhaW5tZW50IGRpcmVjdG9yaWVzCi0gICAgICAgICAgICAgICAgLy8gaXMgcmVxdWlyZWQuICBDcmVhdGUgY29udGFpbmVycyBmcm9tIGRlcHRoIDIgb253YXJkcyAoaWUuLSBwcm9qZWN0J3MKLSAgICAgICAgICAgICAgICAvLyBjaGlsZCBpbmNsdXNpdmUpIGZvciBlYWNoIHJlc291cmNlIGJlaW5nIGV4cG9ydGVkLgotICAgICAgICAgICAgICAgIGlmIChjcmVhdGVMZWFkdXBTdHJ1Y3R1cmUpCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUxlYWR1cERpcmVjdG9yaWVzRm9yKGN1cnJlbnRSZXNvdXJjZSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUm9vdCByZXNvdXJjZSBzcGVjaWZpZWQuICBNdXN0IGNyZWF0ZSBjb250YWlubWVudCBkaXJlY3RvcmllcwotICAgICAgICAgICAgICAgIC8vIGZyb20gdGhpcyBwb2ludCBvbndhcmRzIGZvciBlYWNoIHJlc291cmNlIGJlaW5nIGV4cG9ydGVkCi0gICAgICAgICAgICAgICAgSVBhdGggY29udGFpbmVyc1RvQ3JlYXRlID0gY3VycmVudFJlc291cmNlLmdldEZ1bGxQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVGaXJzdFNlZ21lbnRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnNlZ21lbnRDb3VudCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmVyc1RvQ3JlYXRlLnNlZ21lbnRDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguYXBwZW5kKGNvbnRhaW5lcnNUb0NyZWF0ZS5zZWdtZW50KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZXIuY3JlYXRlRm9sZGVyKHBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGN1cnJlbnRSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICAgICAgZXhwb3J0RmlsZSgoSUZpbGUpIGN1cnJlbnRSZXNvdXJjZSwgcGF0aCk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY3JlYXRlQ29udGFpbmVyRGlyZWN0b3JpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguYXBwZW5kKGN1cnJlbnRSZXNvdXJjZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBleHBvcnRlci5jcmVhdGVGb2xkZXIocGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZXhwb3J0Q2hpbGRyZW4oKChJQ29udGFpbmVyKSBjdXJyZW50UmVzb3VyY2UpLm1lbWJlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlICNpc0FjY2Vzc2libGUgaXMgY2FsbGVkIGJlZm9yZSAjbWVtYmVycyBpcyBpbnZva2VkLAotICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBpbXBsaWNpdGx5IGRvZXMgYW4gZXhpc3RlbmNlIGNoZWNrCi0gICAgICAgICAgICAgICAgICAgIGVycm9yVGFibGUuYWRkKGUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgZXhwb3J0IG9wZXJhdGlvbi4KLSAgICAgKiBJZiB0aGVyZSB3ZXJlIGFueSBlcnJvcnMsIHRoZSByZXN1bHQgaXMgYSBzdGF0dXMgb2JqZWN0IGNvbnRhaW5pbmcKLSAgICAgKiBpbmRpdmlkdWFsIHN0YXR1cyBvYmplY3RzIGZvciBlYWNoIGVycm9yLgotICAgICAqIElmIHRoZXJlIHdlcmUgbm8gZXJyb3JzLCB0aGUgcmVzdWx0IGlzIGEgc3RhdHVzIG9iamVjdCB3aXRoIGVycm9yIGNvZGUgPGNvZGU+T0s8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc3RhdHVzCi0gICAgICovCi0gICAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICBJU3RhdHVzW10gZXJyb3JzID0gbmV3IElTdGF0dXNbZXJyb3JUYWJsZS5zaXplKCldOwotICAgICAgICBlcnJvclRhYmxlLnRvQXJyYXkoZXJyb3JzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVN0YXR1cygKLSAgICAgICAgICAgICAgICBQbGF0Zm9ybVVJLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICBJU3RhdHVzLk9LLAotICAgICAgICAgICAgICAgIGVycm9ycywKLSAgICAgICAgICAgICAgICBEYXRhVHJhbnNmZXJNZXNzYWdlcy5GaWxlU3lzdGVtRXhwb3J0T3BlcmF0aW9uX3Byb2JsZW1zRXhwb3J0aW5nLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBbnN3ZXIgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFzc2VkIGNoaWxkIGlzIGEgZGVzY2VuZGVudAotICAgICAqICBvZiBvbmUgb3IgbW9yZSBtZW1iZXJzIG9mIHRoZSBwYXNzZWQgcmVzb3VyY2VzIGNvbGxlY3Rpb24KLSAgICAgKgotICAgICAqICBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKiAgQHBhcmFtIHJlc291cmNlcyBqYXZhLnV0aWwuTGlzdAotICAgICAqICBAcGFyYW0gY2hpbGQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEZXNjZW5kZW50KExpc3QgcmVzb3VyY2VzLCBJUmVzb3VyY2UgY2hpbGQpIHsKLSAgICAgICAgaWYgKGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBJUmVzb3VyY2UgcGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50KCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZXMuY29udGFpbnMocGFyZW50KSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiBpc0Rlc2NlbmRlbnQocmVzb3VyY2VzLCBwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUV4cG9ydCB0aGUgcmVzb3VyY2VzIHRoYXQgd2VyZSBwcmV2aW91c2x5IHNwZWNpZmllZCBmb3IgZXhwb3J0Ci0gICAgICoJKG9yIGlmIGEgc2luZ2xlIHJlc291cmNlIHdhcyBzcGVjaWZpZWQgdGhlbiBleHBvcnQgaXQgcmVjdXJzaXZlbHkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tb25pdG9yID0gcHJvZ3Jlc3NNb25pdG9yOwotCi0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY3JlYXRlTGVhZHVwU3RydWN0dXJlKQotICAgICAgICAgICAgICAgIGNyZWF0ZUxlYWR1cERpcmVjdG9yaWVzRm9yKHJlc291cmNlKTsKLQotICAgICAgICAgICAgaWYgKGNyZWF0ZUNvbnRhaW5lckRpcmVjdG9yaWVzCi0gICAgICAgICAgICAgICAgICAgICYmIHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkgewotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBpdCdzIGEgY29udGFpbmVyCi0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguYXBwZW5kKHJlc291cmNlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZXhwb3J0ZXIuY3JlYXRlRm9sZGVyKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCB0b3RhbFdvcmsgPSBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV047Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNUb0V4cG9ydCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0b3RhbFdvcmsgPSBjb3VudENoaWxkcmVuT2YocmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdG90YWxXb3JrID0gY291bnRTZWxlY3RlZFJlc291cmNlcygpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4KLSAgICAgICAgICAgICAgICBlcnJvclRhYmxlLmFkZChlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKERhdGFUcmFuc2Zlck1lc3NhZ2VzLkRhdGFUcmFuc2Zlcl9leHBvcnRpbmdUaXRsZSwgdG90YWxXb3JrKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZXNUb0V4cG9ydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXhwb3J0QWxsUmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGV4cG9ydFNwZWNpZmllZFJlc291cmNlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTZXQgdGhpcyBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhIGRpcmVjdG9yeSBzaG91bGQgYmUgY3JlYXRlZCBmb3IKLSAgICAgKglGb2xkZXIgcmVzb3VyY2VzIHRoYXQgYXJlIGV4cGxpY2l0bHkgcGFzc2VkIGZvciBleHBvcnQKLSAgICAgKgotICAgICAqCUBwYXJhbSB2YWx1ZSBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q3JlYXRlQ29udGFpbmVyRGlyZWN0b3JpZXMoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBjcmVhdGVDb250YWluZXJEaXJlY3RvcmllcyA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCVNldCB0aGlzIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGVhY2ggZXhwb3J0ZWQgcmVzb3VyY2UncyBjb21wbGV0ZSBwYXRoIHNob3VsZAotICAgICAqCWluY2x1ZGUgY29udGFpbm1lbnQgaGllcmFyY2hpZXMgYXMgZGljdGF0ZWQgYnkgaXRzIHBhcmVudHMKLSAgICAgKgotICAgICAqCUBwYXJhbSB2YWx1ZSBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q3JlYXRlTGVhZHVwU3RydWN0dXJlKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgY3JlYXRlTGVhZHVwU3RydWN0dXJlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJU2V0IHRoaXMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgZXhwb3J0ZWQgcmVzb3VyY2VzIHNob3VsZCBhdXRvbWF0aWNhbGx5Ci0gICAgICoJb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIHdoZW4gYSBjb25mbGljdCBvY2N1cnMuIElmIG5vdAotICAgICAqCXF1ZXJ5IHRoZSB1c2VyLgotICAgICAqCi0gICAgICoJQHBhcmFtIHZhbHVlIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGVGaWxlcyhib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgIG92ZXJ3cml0ZVN0YXRlID0gT1ZFUldSSVRFX0FMTDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvRmlsZVN5c3RlbUV4cG9ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvRmlsZVN5c3RlbUV4cG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYzhmOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL0ZpbGVTeXN0ZW1FeHBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgZXhwb3J0aW5nIHJlc291cmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlU3lzdGVtRXhwb3J0ZXIgewotICAgIC8qKgotICAgICAqICBDcmVhdGVzIHRoZSBzcGVjaWZpZWQgZmlsZSBzeXN0ZW0gZGlyZWN0b3J5IGF0IDxjb2RlPmRlc3RpbmF0aW9uUGF0aDwvY29kZT4uCi0gICAgICogIFRoaXMgY3JlYXRlcyBhIG5ldyBmaWxlIHN5c3RlbSBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlRm9sZGVyKElQYXRoIGRlc3RpbmF0aW9uUGF0aCkgewotICAgICAgICBuZXcgRmlsZShkZXN0aW5hdGlvblBhdGgudG9PU1N0cmluZygpKS5ta2RpcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBXcml0ZXMgdGhlIHBhc3NlZCByZXNvdXJjZSB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHJlY3Vyc2l2ZWx5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGUoSVJlc291cmNlIHJlc291cmNlLCBJUGF0aCBkZXN0aW5hdGlvblBhdGgpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotICAgICAgICAgICAgd3JpdGVGaWxlKChJRmlsZSkgcmVzb3VyY2UsIGRlc3RpbmF0aW9uUGF0aCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHdyaXRlQ2hpbGRyZW4oKElDb250YWluZXIpIHJlc291cmNlLCBkZXN0aW5hdGlvblBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBFeHBvcnRzIHRoZSBwYXNzZWQgY29udGFpbmVyJ3MgY2hpbGRyZW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUNoaWxkcmVuKElDb250YWluZXIgZm9sZGVyLCBJUGF0aCBkZXN0aW5hdGlvblBhdGgpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoZm9sZGVyLmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2VbXSBjaGlsZHJlbiA9IGZvbGRlci5tZW1iZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIGNoaWxkID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgd3JpdGVSZXNvdXJjZShjaGlsZCwgZGVzdGluYXRpb25QYXRoLmFwcGVuZChjaGlsZC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBXcml0ZXMgdGhlIHBhc3NlZCBmaWxlIHJlc291cmNlIHRvIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gb24gdGhlIGxvY2FsCi0gICAgICogIGZpbGUgc3lzdGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVGaWxlKElGaWxlIGZpbGUsIElQYXRoIGRlc3RpbmF0aW9uUGF0aCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKLSAgICAgICAgSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0gPSBmaWxlLmdldENvbnRlbnRzKGZhbHNlKTsKLSAgICAgICAgICAgIG91dHB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uUGF0aC50b09TU3RyaW5nKCkpOwotICAgICAgICAgICAgaW50IGNodW5rU2l6ZSA9IGNvbnRlbnRTdHJlYW0uYXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICBieXRlW10gcmVhZEJ1ZmZlciA9IG5ldyBieXRlW2NodW5rU2l6ZV07Ci0gICAgICAgICAgICBpbnQgbiA9IGNvbnRlbnRTdHJlYW0ucmVhZChyZWFkQnVmZmVyKTsKLQotICAgICAgICAgICAgd2hpbGUgKG4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKHJlYWRCdWZmZXIpOwotICAgICAgICAgICAgICAgIG4gPSBjb250ZW50U3RyZWFtLnJlYWQocmVhZEJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudFN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBXcml0ZXMgdGhlIHBhc3NlZCByZXNvdXJjZSB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHJlY3Vyc2l2ZWx5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UsIElQYXRoIGRlc3RpbmF0aW9uUGF0aCkKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICB3cml0ZUZpbGUoKElGaWxlKSByZXNvdXJjZSwgZGVzdGluYXRpb25QYXRoKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjcmVhdGVGb2xkZXIoZGVzdGluYXRpb25QYXRoKTsKLSAgICAgICAgICAgIHdyaXRlQ2hpbGRyZW4oKElDb250YWluZXIpIHJlc291cmNlLCBkZXN0aW5hdGlvblBhdGgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL0lEYXRhVHJhbnNmZXJIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL0lEYXRhVHJhbnNmZXJIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjNkYjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9JRGF0YVRyYW5zZmVySGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIGRhdGEgdHJhbnNmZXIgd2l6YXJkcy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZAotICogb3IgZXh0ZW5kZWQuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGF0YVRyYW5zZmVySGVscENvbnRleHRJZHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFBsYXRmb3JtVUkuUExVR0lOX0lEICsgIi4iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBXaXphcmQgcGFnZXMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1NZU1RFTV9FWFBPUlRfV0laQVJEX1BBR0UgPSBQUkVGSVgKLSAgICAgICAgICAgICsgImZpbGVfc3lzdGVtX2V4cG9ydF93aXphcmRfcGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU1lTVEVNX0lNUE9SVF9XSVpBUkRfUEFHRSA9IFBSRUZJWAotICAgICAgICAgICAgKyAiZmlsZV9zeXN0ZW1faW1wb3J0X3dpemFyZF9wYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWklQX0ZJTEVfRVhQT1JUX1dJWkFSRF9QQUdFID0gUFJFRklYCi0gICAgICAgICAgICArICJ6aXBfZmlsZV9leHBvcnRfd2l6YXJkX3BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaSVBfRklMRV9JTVBPUlRfV0laQVJEX1BBR0UgPSBQUkVGSVgKLSAgICAgICAgICAgICsgInppcF9maWxlX2ltcG9ydF93aXphcmRfcGFnZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9JRmlsZUV4cG9ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvSUZpbGVFeHBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzA3NWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9JRmlsZUV4cG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBmaWxlIGV4cG9ydGVycyBvZiBkaWZmZXJlbnQgZmlsZSBmb3JtYXRzLiAgVXNlZCBieSB0aGUKLSAqIHppcCBhbmQgdGFyLmd6IGV4cG9ydGVycy4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlRXhwb3J0ZXIgewotCi0JLyoqCi0JICogRG8gYWxsIHJlcXVpcmVkIGNsZWFudXAgbm93IHRoYXQgd2UgYXJlIGZpbmlzaGVkIHdpdGggdGhlCi0gICAgICogY3VycmVudGx5LW9wZW4gZmlsZS4KLSAgICAgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZmluaXNoZWQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogV3JpdGUgdGhlIHBhc3NlZCByZXNvdXJjZSB0byB0aGUgY3VycmVudCBhcmNoaXZlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uUGF0aAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShJRmlsZSByZXNvdXJjZSwgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkKLSAgICAJdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvSUxldmVsZWRJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL0lMZXZlbGVkSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0NDNmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvSUxldmVsZWRJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFJlZCBIYXQsIEluYyAtIHNldFN0cmlwKGludCksIGdldFN0cmlwKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JSW1wb3J0U3RydWN0dXJlUHJvdmlkZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHdoaWNoIGNhbiBwcm92aWRlIHN0cnVjdHVyZSBhbmQgY29udGVudCBpbmZvcm1hdGlvbiBmb3IgYW4gZWxlbWVudAotICogKGZvciBleGFtcGxlLCBhIGZpbGUgc3lzdGVtIGVsZW1lbnQpLiBVc2VkIGJ5IHRoZSBpbXBvcnQgd2l6YXJkcyB0byBhYnN0cmFjdAotICogdGhlIGNvbW1vbmFsaXRpZXMgYmV0d2VlbiBpbXBvcnRpbmcgZnJvbSB0aGUgZmlsZSBzeXN0ZW0gYW5kIGltcG9ydGluZyBmcm9tCi0gKiBhbiBhcmNoaXZlLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWludGVyZmFjZSBJTGV2ZWxlZEltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIGV4dGVuZHMgSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbnRyeSB0aGF0IHRoaXMgaW1wb3J0ZXIgdXNlcyBhcyB0aGUgcm9vdCBzZW50aW5lbC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRhckVudHJ5IGVudHJ5Ci0JICovCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRSb290KCk7Ci0KLQkvKioKLQkgKiBUZWxscyB0aGUgcHJvdmlkZXIgdG8gc3RyaXAgTiBudW1iZXIgb2YgZGlyZWN0b3JpZXMgZnJvbSB0aGUgcGF0aCBvZiBhbnkKLQkgKiBwYXRoIG9yIGZpbGUgbmFtZSByZXR1cm5lZCBieSB0aGUgSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIChEZWZhdWx0PTApLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBkaXJlY3RvcmllcyB0byBzdHJpcAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN0cmlwKGludCBsZXZlbCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlyZWN0b3JpZXMgdGhhdCB0aGlzIElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBpcwotCSAqIHN0cmlwcGluZyBmcm9tIHRoZSBmaWxlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBOdW1iZXIgb2YgZW50cmllcwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U3RyaXAoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9NaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL01pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MmU3YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL01pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbGVTeXN0ZW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLkFkYXB0YWJsZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSA8Y29kZT5NaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudDwvY29kZT4gaXMgYSA8Y29kZT5GaWxlU3lzdGVtRWxlbWVudDwvY29kZT4gdGhhdCBrbm93cwotICogaWYgaXQgaGFzIGJlZW4gcG9wdWxhdGVkIG9yIG5vdC4KLSAqLwotcHVibGljIGNsYXNzIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGV4dGVuZHMgRmlsZVN5c3RlbUVsZW1lbnQgewotICAgIHByaXZhdGUgYm9vbGVhbiBwb3B1bGF0ZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIDxjb2RlPk1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiB3aXRoIHRoZSBzdXBwbGllZCBuYW1lIGFuZCBwYXJlbnQuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZWxlbWVudCB0aGlzIHJlcHJlc2VudHMKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBjb250YWluaW5nIHBhcmVudAotICAgICAqIEBwYXJhbSBpc0RpcmVjdG9yeSBpbmRpY2F0ZWQgaWYgdGhpcyBjb3VsZCBoYXZlIGNoaWxkcmVuIG9yIG5vdAotICAgICAqLwotICAgIHB1YmxpYyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudChTdHJpbmcgbmFtZSwgRmlsZVN5c3RlbUVsZW1lbnQgcGFyZW50LAotICAgICAgICAgICAgYm9vbGVhbiBpc0RpcmVjdG9yeSkgewotICAgICAgICBzdXBlcihuYW1lLCBwYXJlbnQsIGlzRGlyZWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgaW1tZWRpYXRlIGNoaWxkcmVuLiBVc2UgdGhlIHN1cHBsaWVkIHByb3ZpZGVyCi0gICAgICogaWYgaXQgbmVlZHMgdG8gYmUgcG9wdWxhdGVkLgotICAgICAqIG9mIHRoaXMgZm9sZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGFibGVMaXN0IGdldEZpbGVzKElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgewotICAgICAgICBpZiAoIXBvcHVsYXRlZCkgewotICAgICAgICAgICAgcG9wdWxhdGUocHJvdmlkZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRGaWxlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBmb2xkZXJzIHRoYXQgYXJlIGltbWVkaWF0ZSBjaGlsZHJlbi4gVXNlIHRoZSBzdXBwbGllZCBwcm92aWRlcgotICAgICAqIGlmIGl0IG5lZWRzIHRvIGJlIHBvcHVsYXRlZC4KLSAgICAgKiBvZiB0aGlzIGZvbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRhYmxlTGlzdCBnZXRGb2xkZXJzKElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgewotICAgICAgICBpZiAoIXBvcHVsYXRlZCkgewotICAgICAgICAgICAgcG9wdWxhdGUocHJvdmlkZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRGb2xkZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHBvcHVsYXRpb24gaGFzIGhhcHBlbmVkIGZvciB0aGUgcmVjZWl2ZXIuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1BvcHVsYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucG9wdWxhdGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCBwb3B1bGF0aW9uIGhhcyBub3QgaGFwcGVuZWQgZm9yIHRoZSByZWNlaXZlci4KLSAgICAgKi8KLSAgICBib29sZWFuIG5vdFBvcHVsYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuICF0aGlzLnBvcHVsYXRlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSB0aGUgZmlsZXMgYW5kIGZvbGRlcnMgb2YgdGhlIHJlY2VpdmVyIHVzaW5nIHRoZSBzdXBwbGllYyBzdHJ1Y3R1cmUgcHJvdmlkZXIuCi0gICAgICogQHBhcmFtIHByb3ZpZGVyIG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLklJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZShJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQotICAgICAgICBPYmplY3QgZmlsZVN5c3RlbU9iamVjdCA9IGdldEZpbGVTeXN0ZW1PYmplY3QoKTsKLQotICAgICAgICBMaXN0IGNoaWxkcmVuID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZmlsZVN5c3RlbU9iamVjdCk7Ci0gICAgICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3IgY2hpbGRyZW5FbnVtID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkcmVuRW51bS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGNoaWxkcmVuRW51bS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TGFiZWwgPSBwcm92aWRlci5nZXRMYWJlbChjaGlsZCk7Ci0gICAgICAgICAgICAvL0NyZWF0ZSBvbmUgbGV2ZWwgYmVsb3cKLSAgICAgICAgICAgIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IHJlc3VsdCA9IG5ldyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudExhYmVsLCB0aGlzLCBwcm92aWRlci5pc0ZvbGRlcihjaGlsZCkpOwotICAgICAgICAgICAgcmVzdWx0LnNldEZpbGVTeXN0ZW1PYmplY3QoY2hpbGQpOwotICAgICAgICB9Ci0gICAgICAgIHNldFBvcHVsYXRlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB3aGV0aGVyIG9yIG5vdCBwb3B1bGF0aW9uIGhhcyBoYXBwZW5lZCBmb3IgdGhlIHJlY2VpdmVyIHRvIHRydWUuCi0gICAgICovCi0gICBwdWJsaWMgdm9pZCBzZXRQb3B1bGF0ZWQoKSB7Ci0gICAgICAgIHRoaXMucG9wdWxhdGVkID0gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvVGFyRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9UYXJFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjRjZjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9UYXJFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotLyoqCi0gKiBSZXByZXNlbnRhdGlvbiBvZiBhIGZpbGUgaW4gYSB0YXIgYXJjaGl2ZS4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgVGFyRW50cnkgaW1wbGVtZW50cyBDbG9uZWFibGUKLXsJCi0JU3RyaW5nIG5hbWUsIGxpbmtkZXN0LCB1c2VybmFtZSwgZ3JvdXBuYW1lOwotCWxvbmcgbW9kZSwgdGltZSwgc2l6ZTsKLQlpbnQgdHlwZSwgdWlkLCBnaWQsIG1ham9yLCBtaW5vcjsKLQlpbnQgZmlsZXBvczsKLQotCS8qKgotCSAqIEVudHJ5IHR5cGUgZm9yIG5vcm1hbCBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFID0gJzAnOwotCi0JLyoqCi0JICogRW50cnkgdHlwZSBmb3IgaGFyZCBsaW5rcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5LID0gJzEnOwotCQotCS8qKgotCSAqIEVudHJ5IHR5cGUgZm9yIHN5bWJvbGljIGxpbmtzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTUxJTksgPSAnMic7Ci0JCi0JLyoqCi0JICogRW50cnkgdHlwZSBmb3IgY2hhcmFjdGVyIGRldmljZSBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFSX0RFVklDRSA9ICczJzsKLQkKLQkvKioKLQkgKiBFbnRyeSB0eXBlIGZvciBibG9jayBkZXZpY2Ugbm9kZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0tfREVWSUNFID0gJzQnOwotCQotCS8qKgotCSAqIEVudHJ5IHR5cGUgZm9yIGRpcmVjdG9yaWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVE9SWSA9ICc1JzsKLQkKLQkvKioKLQkgKiBFbnRyeSB0eXBlIGZvciBGSUZPIGZpbGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRk8gPSAnNic7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgVGFyRW50cnkgZm9yIGEgZmlsZSBvZiB0aGUgZ2l2ZW4gbmFtZSBhdCB0aGUKLQkgKiBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBmaWxlbmFtZQotCSAqIEBwYXJhbSBwb3MgcG9zaXRpb24gaW4gdGhlIGZpbGUgaW4gYnl0ZXMKLQkgKi8KLQlUYXJFbnRyeShTdHJpbmcgbmFtZSwgaW50IHBvcykgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQltb2RlID0gMDY0NDsKLQkJdHlwZSA9IEZJTEU7Ci0JCWZpbGVwb3MgPSBwb3M7Ci0JCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAvIDEwMDA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFRhckVudHJ5IGZvciBhIGZpbGUgb2YgdGhlIGdpdmVuIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUgZmlsZW5hbWUKLQkgKi8KLQlwdWJsaWMgVGFyRW50cnkoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyhuYW1lLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgY29weSBvZiB0aGUgZ2l2ZW4gVGFyRW50cnkuCi0JICogCi0JICogQHBhcmFtIGUgZW50cnkgdG8gY29weSBmcm9tCi0JICovCi0JcHVibGljIFRhckVudHJ5KFRhckVudHJ5IGUpIHsKLQkJbmFtZSA9IGUubmFtZTsKLQkJbW9kZSA9IGUubW9kZTsKLQkJbGlua2Rlc3QgPSBlLmxpbmtkZXN0OwotCQl1c2VybmFtZSA9IGUudXNlcm5hbWU7Ci0JCWdyb3VwbmFtZSA9IGUuZ3JvdXBuYW1lOwotCQl0aW1lID0gZS50aW1lOwotCQlzaXplID0gZS5zaXplOwotCQl0eXBlID0gZS50eXBlOwotCQl1aWQgPSBlLnVpZDsKLQkJZ2lkID0gZS5naWQ7Ci0JCW1ham9yID0gZS5tYWpvcjsKLQkJbWlub3IgPSBlLm1pbm9yOwotCQlmaWxlcG9zID0gZS5maWxlcG9zOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgZmlsZSBpcyBhIGRldmljZSBpbm9kZSwgcmV0dXJucyBpdHMgbWFqb3IgbnVtYmVyLgotCSAqIAotCSAqIEByZXR1cm4gbWFqb3IgbnVtYmVyIG9mIHRoZSBkZXZpY2UKLQkgKi8KLQlwdWJsaWMgaW50IGdldERldmljZU1ham9yKCkgewotCQlyZXR1cm4gbWFqb3I7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBmaWxlIGlzIGEgZGV2aWNlIGlub2RlLCByZXR1cm5zIGl0cyBtaW5vciBudW1iZXIuCi0JICogCi0JICogQHJldHVybiBtaW5vciBudW1iZXIgb2YgdGhlIGRldmljZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGV2aWNlTWlub3IoKSB7Ci0JCXJldHVybiBtaW5vcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZmlsZSwgb25lIG9mIEZJTEUsIExJTkssIFNZTV9MSU5LLAotCSAqIENIQVJfREVWSUNFLCBCTE9DS19ERVZJQ0UsIERJUkVDVE9SWSBvciBGSUZPLgotCSAqIAotCSAqIEByZXR1cm4gZmlsZSB0eXBlCi0JICovCi0JcHVibGljIGludCBnZXRGaWxlVHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ3JvdXAgSUQgb2YgdGhlIGZpbGUuCi0JICogCi0JICogQHJldHVybiBncm91cCBJRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0R3JvdXBJRCgpIHsKLQkJcmV0dXJuIGdpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBncm91cC4gIElmIG5vdCBudWxsLCB0aGlzIHNob3VsZCBiZSB1c2VkCi0JICogaW4gZmF2b3VyIG9mIHRoZSBncm91cCBJRCBzaG91bGQgYW4gZXF1aXZhbGVudCBncm91cCBiZSBmb3VuZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGdyb3VwIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdyb3VwTmFtZSgpIHsKLQkJcmV0dXJuIGdyb3VwbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIGZpbGUgcmVwcmVzZW50cyBhIHN5bWJvbGljIGxpbmsgb3IgaGFyZCBsaW5rLCB0aGlzIGlzCi0JICogaXRzIGRlc3RpbmF0aW9uIHBhdGguCi0JICogCi0JICogQHJldHVybiBsaW5rIGRlc3RpbmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5rRGVzdGluYXRpb24oKSB7Ci0JCXJldHVybiBsaW5rZGVzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RlIG9mIHRoZSBmaWxlIGluIFVOSVggcGVybWlzc2lvbnMgZm9ybWF0LgotCSAqIAotCSAqIEByZXR1cm4gZmlsZSBtb2RlCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kZSgpIHsKLQkJcmV0dXJuIG1vZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGZpbGVuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBmaWxlIGluIGJ5dGVzLgotCSAqIAotCSAqIEByZXR1cm4gZmlsZXNpemUKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZSBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkKLQkgKiAxc3QgMTk3MC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRpbWUKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRUaW1lKCkgewotCQlyZXR1cm4gdGltZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1c2VyIElEIG9mIHRoZSBvd25lciBvZiB0aGlzIGZpbGUuCi0JICogCi0JICogQHJldHVybiB1c2VyaWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFVzZXJJRCgpIHsKLQkJcmV0dXJuIHVpZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdXNlciB0aGF0IG93bnMgdGhpcyBmaWxlLiAgSWYgbm90IG51bGwsCi0JICogdGhpcyBzaG91bGQgYmUgdXNlZCBpbiBmYXZvdXIgb2YgdGhlIHVzZXIgSUQgc2hvdWxkIGFuCi0JICogZXF1aXZhbGVudCB1c2VyIGJlIGZvdW5kLgotCSAqIAotCSAqIEByZXR1cm4gdXNlciBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKLQkJcmV0dXJuIHVzZXJuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgZGV2aWNlIGlmIHRoaXMgZW50cnkgcmVwcmVzZW50cyBhIGRldmljZQotCSAqIGlub2RlLgotCSAqIAotCSAqIEBwYXJhbSBtYWpvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERldmljZU1ham9yKGludCBtYWpvcikgewotCQl0aGlzLm1ham9yID0gbWFqb3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSBkZXZpY2UgaWYgdGhpcyBlbnRyeSByZXByZXNlbnRzIGEgZGV2aWNlCi0JICogaW5vZGUuCi0JICogCi0JICogQHBhcmFtIG1pbm9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGV2aWNlTWlub3IoaW50IG1pbm9yKSB7Ci0JCXRoaXMubWlub3IgPSBtaW5vcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0eXBlIG9mIHRoZSBmaWxlLCBvbmUgb2YgRklMRSwgTElOSywgU1lNTElOSywgQ0hBUl9ERVZJQ0UsCi0JICogQkxPQ0tfREVWSUNFLCBvciBESVJFQ1RPUlkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlVHlwZShpbnQgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGdyb3VwIElEIG9mIHRoaXMgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZ2lkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JvdXBJRChpbnQgZ2lkKSB7Ci0JCXRoaXMuZ2lkID0gZ2lkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGdyb3VwIG9mIHRoaXMgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZ3JvdXBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JvdXBOYW1lKFN0cmluZyBncm91cG5hbWUpIHsKLQkJdGhpcy5ncm91cG5hbWUgPSBncm91cG5hbWU7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBmaWxlIHJlcHJlc2VudHMgYSBzeW1ib2xpYyBvciBoYXJkIGxpbmssIHNldHMgdGhlIHBhdGggbmFtZQotCSAqIG9mIHRoZSBkZXN0aW5hdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbGlua2Rlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rRGVzdGluYXRpb24oU3RyaW5nIGxpbmtkZXN0KSB7Ci0JCXRoaXMubGlua2Rlc3QgPSBsaW5rZGVzdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RlIG9mIHRoZSBmaWxlIGluIFVOSVggcGVybWlzc2lvbnMgZm9ybWF0LgotCSAqIAotCSAqIEBwYXJhbSBtb2RlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZShsb25nIG1vZGUpIHsKLQkJdGhpcy5tb2RlID0gbW9kZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBmaWxlIGluIGJ5dGVzLgotCSAqIAotCSAqIEBwYXJhbSBzaXplCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShsb25nIHNpemUpIHsKLQkJdGhpcy5zaXplID0gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZSBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkKLQkgKiAxc3QgMTk3MC4KLQkgKiAKLQkgKiBAcGFyYW0gdGltZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWUobG9uZyB0aW1lKSB7Ci0JCXRoaXMudGltZSA9IHRpbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBJRCBvZiB0aGUgb3duZXIgb2YgdGhpcyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB1aWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VySUQoaW50IHVpZCkgewotCQl0aGlzLnVpZCA9IHVpZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB1c2VyIHdobyBvd25zIHRoaXMgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdXNlcm5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VyTmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKLQkJdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9UYXJFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9UYXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwNTRkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvVGFyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotLyoqCi0gKiBFeGNlcHRpb24gZ2VuZXJhdGVkIHVwb24gZW5jb3VudGVyaW5nIGNvcnJ1cHRlZCB0YXIgZmlsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCS8qKgotCSAqIEdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQgZm9yIHRoaXMgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjg4NjY3MTI1NDUxODg1MzUyOEw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgVGFyRXhjZXB0aW9uIHdpdGhvdXQgYSBkZXRhaWwgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBUYXJFeGNlcHRpb24oKSB7Ci0gICAgCXN1cGVyKCk7Ci0gICAgfQotCQotCS8qKgotICAgICAqIENvbnN0cnVjdHMgYSBUYXJFeGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcyB0aGUgZGV0YWlsIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBUYXJFeGNlcHRpb24oU3RyaW5nIHMpIHsKLSAgICAJc3VwZXIocyk7Ci0gICAgfQotCQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBUYXJFeGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcyB0aGUgZGV0YWlsIHN0cmluZwotICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFyRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAJc3VwZXIocywgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9UYXJGaWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvVGFyRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmFlZGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9UYXJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07Ci0KLS8qKgotICogUmVhZHMgYSAudGFyIG9yIC50YXIuZ3ogYXJjaGl2ZSBmaWxlLCBwcm92aWRpbmcgYW4gaW5kZXggZW51bWVyYXRpb24KLSAqIGFuZCBhbGxvd3MgZm9yIGFjY2Vzc2luZyBhbiBJbnB1dFN0cmVhbSBmb3IgYXJiaXRyYXJ5IGZpbGVzIGluIHRoZQotICogYXJjaGl2ZS4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgVGFyRmlsZSB7Ci0JcHJpdmF0ZSBGaWxlIGZpbGU7Ci0JcHJpdmF0ZSBUYXJJbnB1dFN0cmVhbSBlbnRyeUVudW1lcmF0aW9uU3RyZWFtOwotCXByaXZhdGUgVGFyRW50cnkgY3VyRW50cnk7Ci0JcHJpdmF0ZSBUYXJJbnB1dFN0cmVhbSBlbnRyeVN0cmVhbTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgVGFyRmlsZSBmb3IgdGhlIGdpdmVuIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAdGhyb3dzIFRhckV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgVGFyRmlsZShGaWxlIGZpbGUpIHRocm93cyBUYXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQotCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCS8vIEZpcnN0LCBjaGVjayBpZiBpdCdzIGEgR1pJUElucHV0U3RyZWFtLgotCQl0cnkgewotCQkJaW4gPSBuZXcgR1pJUElucHV0U3RyZWFtKGluKTsKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lmIGl0IGlzIG5vdCBjb21wcmVzc2VkIHdlIGNsb3NlCi0JCQkvL3RoZSBvbGQgb25lIGFuZCByZWNyZWF0ZQotCQkJaW4uY2xvc2UoKTsJCQotCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQl9Ci0JCWVudHJ5RW51bWVyYXRpb25TdHJlYW0gPSBuZXcgVGFySW5wdXRTdHJlYW0oaW4pOwotCQljdXJFbnRyeSA9IGVudHJ5RW51bWVyYXRpb25TdHJlYW0uZ2V0TmV4dEVudHJ5KCk7Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIHRoZSB0YXIgZmlsZSBpbnB1dCBzdHJlYW0uCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSBjYW5ub3QgYmUgc3VjY2Vzc2Z1bGx5IGNsb3NlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW50cnlFbnVtZXJhdGlvblN0cmVhbS5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBUYXJGaWxlIGZvciB0aGUgZ2l2ZW4gcGF0aCBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqIEB0aHJvd3MgVGFyRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBUYXJGaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIFRhckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQl0aGlzKG5ldyBGaWxlKGZpbGVuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBjYXRhbG9ndWluZyB0aGUgdGFyIGFyY2hpdmUuCi0JICogCi0JICogQHJldHVybiBlbnVtZXJhdGlvbiBvZiBhbGwgZmlsZXMgaW4gdGhlIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZW50cmllcygpIHsKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbigpIHsJCQkKLQkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJCQlyZXR1cm4gKGN1ckVudHJ5ICE9IG51bGwpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCQkJCVRhckVudHJ5IG9sZEVudHJ5ID0gY3VyRW50cnk7Ci0JCQkJdHJ5IHsKLQkJCQkJY3VyRW50cnkgPSBlbnRyeUVudW1lcmF0aW9uU3RyZWFtLmdldE5leHRFbnRyeSgpOwotCQkJCX0gY2F0Y2goVGFyRXhjZXB0aW9uIGUpIHsKLQkJCQkJY3VyRW50cnkgPSBudWxsOwotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJCQljdXJFbnRyeSA9IG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBvbGRFbnRyeTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IElucHV0U3RyZWFtIGZvciB0aGUgZ2l2ZW4gZmlsZSBpbiB0aGUgdGFyIGFyY2hpdmUuCi0JICogCi0JICogQHBhcmFtIGVudHJ5Ci0JICogQHJldHVybiBhbiBpbnB1dCBzdHJlYW0gZm9yIHRoZSBnaXZlbiBmaWxlCi0JICogQHRocm93cyBUYXJFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFRhckVudHJ5IGVudHJ5KSB0aHJvd3MgVGFyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmKGVudHJ5U3RyZWFtID09IG51bGwgfHwgIWVudHJ5U3RyZWFtLnNraXBUb0VudHJ5KGVudHJ5KSkgewotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJLy8gRmlyc3QsIGNoZWNrIGlmIGl0J3MgYSBHWklQSW5wdXRTdHJlYW0uCi0JCQl0cnkgewotCQkJCWluID0gbmV3IEdaSVBJbnB1dFN0cmVhbShpbik7Ci0JCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQl9Ci0JCQllbnRyeVN0cmVhbSA9IG5ldyBUYXJJbnB1dFN0cmVhbShpbiwgZW50cnkpIHsKLQkJCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJCQkJLy8gSWdub3JlIGNsb3NlKCkgc2luY2Ugd2Ugd2FudCB0byByZXVzZSB0aGUgc3RyZWFtLgotCQkJCX0KLQkJCX07Ci0JCX0KLQkJaWYoZW50cnlTdHJlYW0gPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJodWg/Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZW50cnlTdHJlYW07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCBuYW1lIG9mIHRoZSBmaWxlIHRoaXMgYXJjaGl2ZSByZXByZXNlbnRzLgotCSAqIAotCSAqIEByZXR1cm4gcGF0aAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZpbGUuZ2V0UGF0aCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9UYXJGaWxlRXhwb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9UYXJGaWxlRXhwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhMDhlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvVGFyRmlsZUV4cG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqIEV4cG9ydHMgcmVzb3VyY2VzIHRvIGEgLnRhci5neiBmaWxlLgotICoKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFRhckZpbGVFeHBvcnRlciBpbXBsZW1lbnRzIElGaWxlRXhwb3J0ZXIgewotICAgIHByaXZhdGUgVGFyT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbTsKLSAgICBwcml2YXRlIEdaSVBPdXRwdXRTdHJlYW0gZ3ppcE91dHB1dFN0cmVhbTsKLSAgICAKLQotICAgIC8qKgotICAgICAqCUNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgICAqCi0gICAgICoJQHBhcmFtIGZpbGVuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKglAcGFyYW0gY29tcHJlc3MgYm9vbGVhbgotICAgICAqCUBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBUYXJGaWxlRXhwb3J0ZXIoU3RyaW5nIGZpbGVuYW1lLCBib29sZWFuIGNvbXByZXNzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIAlpZihjb21wcmVzcykgewotICAgIAkJZ3ppcE91dHB1dFN0cmVhbSA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSk7Ci0gICAgCQlvdXRwdXRTdHJlYW0gPSBuZXcgVGFyT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShnemlwT3V0cHV0U3RyZWFtKSk7Ci0gICAgCX0gZWxzZSB7Ci0gICAgCQlvdXRwdXRTdHJlYW0gPSBuZXcgVGFyT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSkpKTsKLSAgICAJfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCURvIGFsbCByZXF1aXJlZCBjbGVhbnVwIG5vdyB0aGF0IHdlJ3JlIGZpbmlzaGVkIHdpdGggdGhlCi0gICAgICoJY3VycmVudGx5LW9wZW4gLnRhci5negotICAgICAqCi0gICAgICoJQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmluaXNoZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgaWYoZ3ppcE91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgIAlnemlwT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgdG8gdGhlIHRhciBhcmNoaXZlLgotICAgICAqCi0gICAgICoJQHBhcmFtIGVudHJ5Ci0gICAgICoJQHBhcmFtIGNvbnRlbnRzCi0gICAgICogIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlKFRhckVudHJ5IGVudHJ5LCBJRmlsZSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggbG9jYXRpb24gPSBjb250ZW50cy5nZXRMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihjb250ZW50cy5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCX0KLQkJamF2YS5pby5GaWxlIGxvY2FsRmlsZSA9IGxvY2F0aW9uLnRvRmlsZSgpOwotICAgIAkKLSAgICAJZW50cnkuc2V0U2l6ZShsb2NhbEZpbGUubGVuZ3RoKCkpOwotICAgIAkKLSAgICAJb3V0cHV0U3RyZWFtLnB1dE5leHRFbnRyeShlbnRyeSk7Ci0gICAgCUlucHV0U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBjb250ZW50cy5nZXRDb250ZW50cyhmYWxzZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgbjsKLSAgICAgICAgICAgIGJ5dGVbXSByZWFkQnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgICAgICAgICB3aGlsZSAoKG4gPSBjb250ZW50U3RyZWFtLnJlYWQocmVhZEJ1ZmZlcikpID4gMCkgewotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShyZWFkQnVmZmVyLCAwLCBuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjb250ZW50U3RyZWFtICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAJb3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsgICAgCQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBXcml0ZSB0aGUgcGFzc2VkIHJlc291cmNlIHRvIHRoZSBjdXJyZW50IGFyY2hpdmUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIHJlc291cmNlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlCi0gICAgICogIEBwYXJhbSBkZXN0aW5hdGlvblBhdGggamF2YS5sYW5nLlN0cmluZwotICAgICAqICBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlKElGaWxlIHJlc291cmNlLCBTdHJpbmcgZGVzdGluYXRpb25QYXRoKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICBUYXJFbnRyeSBuZXdFbnRyeSA9IG5ldyBUYXJFbnRyeShkZXN0aW5hdGlvblBhdGgpOwotICAgICAgICBpZihyZXNvdXJjZS5nZXRMb2NhbFRpbWVTdGFtcCgpICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QKSB7Ci0gICAgICAgIAluZXdFbnRyeS5zZXRUaW1lKHJlc291cmNlLmdldExvY2FsVGltZVN0YW1wKCkgLyAxMDAwKTsKLSAgICAgICAgfQotICAgICAgICBSZXNvdXJjZUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IHJlc291cmNlLmdldFJlc291cmNlQXR0cmlidXRlcygpOwotICAgICAgICBpZiAoYXR0cmlidXRlcy5pc0V4ZWN1dGFibGUoKSkgewotICAgICAgICAJbmV3RW50cnkuc2V0TW9kZShuZXdFbnRyeS5nZXRNb2RlKCkgfCAwMTExKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXR0cmlidXRlcy5pc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgCW5ld0VudHJ5LnNldE1vZGUobmV3RW50cnkuZ2V0TW9kZSgpICYgfjAyMjIpOwotICAgICAgICB9Ci0gICAgICAgIHdyaXRlKG5ld0VudHJ5LCByZXNvdXJjZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL1RhcklucHV0U3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvVGFySW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhMDYxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvVGFySW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqIElucHV0IHN0cmVhbSBmb3IgcmVhZGluZyBmaWxlcyBpbiB1c3RhciBmb3JtYXQgKHRhcikgY29tcGF0aWJsZQotICogd2l0aCB0aGUgc3BlY2lmaWNhdGlvbiBpbiBJRUVFIFN0ZCAxMDAzLjEtMjAwMS4gIEFsc28gc3VwcG9ydHMKLSAqIGxvbmcgZmlsZW5hbWVzIGVuY29kZWQgdXNpbmcgdGhlIEdOVSBATG9uZ0xpbmsgZXh0ZW5zaW9uLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtCi17Ci0JcHJpdmF0ZSBpbnQgbmV4dEVudHJ5ID0gMDsKLQlwcml2YXRlIGludCBuZXh0RU9GID0gMDsKLQlwcml2YXRlIGludCBmaWxlcG9zID0gMDsKLQlwcml2YXRlIGludCBieXRlc3JlYWQgPSAwOwotCXByaXZhdGUgVGFyRW50cnkgZmlyc3RFbnRyeSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgbG9uZ0xpbmtOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdGFyIGlucHV0IHN0cmVhbSBvbiB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBpbiBpbnB1dCBzdHJlYW0KLQkgKiBAdGhyb3dzIFRhckV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgVGFySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBUYXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIoaW4pOwotCi0JCS8vIFJlYWQgaW4gdGhlIGZpcnN0IFRhckVudHJ5IHRvIG1ha2Ugc3VyZQotCQkvLyB0aGUgaW5wdXQgaXMgYSB2YWxpZCB0YXIgZmlsZSBzdHJlYW0uCi0JCWZpcnN0RW50cnkgPSBnZXROZXh0RW50cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgdGFyIGlucHV0IHN0cmVhbSwgc2tpcHBpbmcgYWhlYWQgdG8gdGhlIGdpdmVuIGVudHJ5Ci0JICogaW4gdGhlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGluIGlucHV0IHN0cmVhbQotCSAqIEBwYXJhbSBlbnRyeSBza2lwcyB0byB0aGlzIGVudHJ5IGluIHRoZSBmaWxlCi0JICogQHRocm93cyBUYXJFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JVGFySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIFRhckVudHJ5IGVudHJ5KSB0aHJvd3MgVGFyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyKGluKTsKLQkJc2tpcFRvRW50cnkoZW50cnkpOwotCX0KLQotCS8qKgotCSAqICBUaGUgY2hlY2tzdW0gb2YgYSB0YXIgZmlsZSBoZWFkZXIgaXMgc2ltcGx5IHRoZSBzdW0gb2YgdGhlIGJ5dGVzIGluCi0JICogIHRoZSBoZWFkZXIuCi0JICogCi0JICogQHBhcmFtIGhlYWRlcgotCSAqIEByZXR1cm4gY2hlY2tzdW0KLQkgKi8KLQlwcml2YXRlIGxvbmcgaGVhZGVyQ2hlY2tzdW0oYnl0ZVtdIGhlYWRlcikgewotCQlsb25nIHN1bSA9IDA7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCA1MTI7IGkrKykgewotCQkJc3VtICs9IGhlYWRlcltpXSAmIDB4ZmY7Ci0JCX0KLQkJcmV0dXJuIHN1bTsKLQl9Ci0KLQkvKioKLQkgKiBTa2lwcyBhaGVhZCB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGdpdmVuIGVudHJ5IGluIHRoZSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBlbnRyeQotCSAqIEByZXR1cm5zIGZhbHNlIGlmIHRoZSBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHBhc3NlZAotCSAqIEB0aHJvd3MgVGFyRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCWJvb2xlYW4gc2tpcFRvRW50cnkoVGFyRW50cnkgZW50cnkpIHRocm93cyBUYXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaW50IGJ5dGVzdG9za2lwID0gZW50cnkuZmlsZXBvcyAtIGJ5dGVzcmVhZDsKLQkJaWYoYnl0ZXN0b3NraXAgPCAwKSByZXR1cm4gZmFsc2U7Ci0JCXdoaWxlKGJ5dGVzdG9za2lwID4gMCkgewotCQkJbG9uZyByZXQgPSBpbi5za2lwKGJ5dGVzdG9za2lwKTsKLQkJCWlmKHJldCA8IDApIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oImVhcmx5IGVuZCBvZiBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnl0ZXN0b3NraXAgLT0gcmV0OwotCQkJYnl0ZXNyZWFkICs9IHJldDsKLQkJfQotCQlmaWxlcG9zID0gZW50cnkuZmlsZXBvczsKLQkJbmV4dEVudHJ5ID0gMDsKLQkJbmV4dEVPRiA9IDA7Ci0JCS8vIFJlYWQgbmV4dCBoZWFkZXIgdG8gc2VlayB0byBmaWxlIGRhdGEuCi0JCWdldE5leHRFbnRyeSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGhlYWRlciBjaGVja3N1bSBpcyBjb3JyZWN0LgotCSAqIAotCSAqIEBwYXJhbSBoZWFkZXIKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBoZWFkZXIgaGFzIGEgdmFsaWQgY2hlY2tzdW0KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFRhckhlYWRlcihieXRlW10gaGVhZGVyKSB7Ci0JCWxvbmcgZmlsZUNoZWNrc3VtLCBjYWxjdWxhdGVkQ2hlY2tzdW07Ci0JCWludCBwb3MsIGk7Ci0JCQotCQlwb3MgPSAxNDg7Ci0JCVN0cmluZ0J1ZmZlciBjaGVja3N1bVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlpZihoZWFkZXJbcG9zICsgaV0gPT0gJyAnKSBjb250aW51ZTsKLQkJCWlmKGhlYWRlcltwb3MgKyBpXSA9PSAwIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhcikgaGVhZGVyW3BvcyArIGldKSkgYnJlYWs7Ci0JCQljaGVja3N1bVN0cmluZy5hcHBlbmQoKGNoYXIpIGhlYWRlcltwb3MgKyBpXSk7Ci0JCX0KLQkJaWYoY2hlY2tzdW1TdHJpbmcubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIGZhbHNlOwotCQlpZihjaGVja3N1bVN0cmluZy5jaGFyQXQoMCkgIT0gJzAnKSBjaGVja3N1bVN0cmluZy5pbnNlcnQoMCwgJzAnKTsKLQkJdHJ5IHsKLQkJCWZpbGVDaGVja3N1bSA9IExvbmcuZGVjb2RlKGNoZWNrc3VtU3RyaW5nLnRvU3RyaW5nKCkpLmxvbmdWYWx1ZSgpOwotCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vVGhpcyBpcyBub3QgdmFsaWQgaWYgaXQgY2Fubm90IGJlIHBhcnNlZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gQmxhbmsgb3V0IHRoZSBjaGVja3N1bS4KLQkJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQloZWFkZXJbcG9zICsgaV0gPSAnICc7Ci0JCX0KLQkJY2FsY3VsYXRlZENoZWNrc3VtID0gaGVhZGVyQ2hlY2tzdW0oaGVhZGVyKTsKLQotCQlyZXR1cm4gKGZpbGVDaGVja3N1bSA9PSBjYWxjdWxhdGVkQ2hlY2tzdW0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgZW50cnkgaW4gdGhlIHRhciBmaWxlLiAgRG9lcyBub3QgaGFuZGxlCi0JICogR05VIEBMb25nTGluayBleHRlbnNpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5leHQgZW50cnkgaW4gdGhlIHRhciBmaWxlCi0JICogQHRocm93cyBUYXJFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JVGFyRW50cnkgZ2V0TmV4dEVudHJ5SW50ZXJuYWwoKSB0aHJvd3MgVGFyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBoZWFkZXIgPSBuZXcgYnl0ZVs1MTJdOwotCQlpbnQgcG9zID0gMDsKLQkJaW50IGk7Ci0KLQkJaWYoZmlyc3RFbnRyeSAhPSBudWxsKSB7Ci0JCQlUYXJFbnRyeSBlbnRyeVJldHVybiA9IGZpcnN0RW50cnk7Ci0JCQlmaXJzdEVudHJ5ID0gbnVsbDsKLQkJCXJldHVybiBlbnRyeVJldHVybjsKLQkJfQotCi0JCXdoaWxlKG5leHRFbnRyeSA+IDApIHsKLQkJCWxvbmcgcmV0ID0gaW4uc2tpcChuZXh0RW50cnkpOwotCQkJaWYocmV0IDwgMCkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiZWFybHkgZW5kIG9mIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluZXh0RW50cnkgLT0gcmV0OwotCQkJYnl0ZXNyZWFkICs9IHJldDsKLQkJfQotCi0JCWludCBieXRlc3RvcmVhZCA9IDUxMjsKLQkJd2hpbGUoYnl0ZXN0b3JlYWQgPiAwKSB7Ci0JCQlpbnQgcmV0ID0gc3VwZXIucmVhZChoZWFkZXIsIDUxMiAtIGJ5dGVzdG9yZWFkLCBieXRlc3RvcmVhZCk7Ci0JCQlpZiggcmV0IDwgMCApIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oImVhcmx5IGVuZCBvZiBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnl0ZXN0b3JlYWQgLT0gcmV0OwotCQkJYnl0ZXNyZWFkICs9IHJldDsKLQkJfQotCi0JCS8vIElmIHdlIGhhdmUgYSBoZWFkZXIgb2YgYWxsIHplcm9zLCB0aGlzIG1hcmtzIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0JCWlmKGhlYWRlckNoZWNrc3VtKGhlYWRlcikgPT0gMCkgewotCQkJLy8gV2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0JCQlpZihmaWxlcG9zID4gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBJbnZhbGlkIHN0cmVhbS4KLQkJCXRocm93IG5ldyBUYXJFeGNlcHRpb24oIm5vdCBpbiB0YXIgZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLy8gVmFsaWRhdGUgY2hlY2tzdW0uCi0JCWlmKCFpc1ZhbGlkVGFySGVhZGVyKGhlYWRlcikpIHsKLQkJCXRocm93IG5ldyBUYXJFeGNlcHRpb24oIm5vdCBpbiB0YXIgZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXdoaWxlIChwb3MgPCAxMDAgJiYgaGVhZGVyW3Bvc10gIT0gMCkKLQkJCXBvcysrOwotCQlTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcoaGVhZGVyLCAwLCBwb3MsICJVVEY4Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gUHJlcGVuZCB0aGUgcHJlZml4IGhlcmUuCi0JCXBvcyA9IDM0NTsKLQkJaWYoaGVhZGVyW3Bvc10gIT0gMCkgewotCQkJd2hpbGUgKHBvcyA8IDUwMCAmJiBoZWFkZXJbcG9zXSAhPSAwKQotCQkJCXBvcysrOwotCQkJU3RyaW5nIHByZWZpeCA9IG5ldyBTdHJpbmcoaGVhZGVyLCAzNDUsIHBvcyAtIDM0NSwgIlVURjgiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IHByZWZpeCArICIvIiArIG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJVGFyRW50cnkgZW50cnk7Ci0JCWlmKGxvbmdMaW5rTmFtZSAhPSBudWxsKSB7Ci0JCQllbnRyeSA9IG5ldyBUYXJFbnRyeShsb25nTGlua05hbWUsIGZpbGVwb3MpOwotCQkJbG9uZ0xpbmtOYW1lID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCWVudHJ5ID0gbmV3IFRhckVudHJ5KG5hbWUsIGZpbGVwb3MpOwotCQl9Ci0JCWlmKGhlYWRlclsxNTZdICE9IDApIHsKLQkJCWVudHJ5LnNldEZpbGVUeXBlKGhlYWRlclsxNTZdKTsKLQkJfQotCQkKLQkJcG9zID0gMTAwOwotCQlTdHJpbmdCdWZmZXIgbW9kZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlpZihoZWFkZXJbcG9zICsgaV0gPT0gMCkgYnJlYWs7Ci0JCQlpZihoZWFkZXJbcG9zICsgaV0gPT0gJyAnKSBjb250aW51ZTsKLQkJCW1vZGUuYXBwZW5kKChjaGFyKSBoZWFkZXJbcG9zICsgaV0pOwotCQl9Ci0JCWlmKG1vZGUubGVuZ3RoKCkgPiAwICYmIG1vZGUuY2hhckF0KDApICE9ICcwJykgbW9kZS5pbnNlcnQoMCwgJzAnKTsKLQkJdHJ5IHsKLQkJCWxvbmcgZmlsZU1vZGUgPSBMb25nLmRlY29kZShtb2RlLnRvU3RyaW5nKCkpLmxvbmdWYWx1ZSgpOwotCQkJZW50cnkuc2V0TW9kZShmaWxlTW9kZSk7Ci0JCX0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJdGhyb3cgbmV3IFRhckV4Y2VwdGlvbihEYXRhVHJhbnNmZXJNZXNzYWdlcy5UYXJJbXBvcnRfaW52YWxpZF90YXJfZm9ybWF0LCBuZmUpOwotCQl9Ci0JCQotCQlwb3MgPSAxMDAgKyAyNDsKLQkJU3RyaW5nQnVmZmVyIHNpemUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcihpID0gMDsgaSA8IDEyOyBpKyspIHsKLQkJCWlmKGhlYWRlcltwb3MgKyBpXSA9PSAwKSBicmVhazsKLQkJCWlmKGhlYWRlcltwb3MgKyBpXSA9PSAnICcpIGNvbnRpbnVlOwotCQkJc2l6ZS5hcHBlbmQoKGNoYXIpIGhlYWRlcltwb3MgKyBpXSk7Ci0JCX0KLQkJaWYoc2l6ZS5jaGFyQXQoMCkgIT0gJzAnKSBzaXplLmluc2VydCgwLCAnMCcpOwotCQlpbnQgZmlsZVNpemU7Ci0JCXRyeSB7Ci0JCQlmaWxlU2l6ZSA9IEludGVnZXIuZGVjb2RlKHNpemUudG9TdHJpbmcoKSkuaW50VmFsdWUoKTsKLQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQl0aHJvdyBuZXcgVGFyRXhjZXB0aW9uKERhdGFUcmFuc2Zlck1lc3NhZ2VzLlRhckltcG9ydF9pbnZhbGlkX3Rhcl9mb3JtYXQsIG5mZSk7Ci0JCX0KLQotCQllbnRyeS5zZXRTaXplKGZpbGVTaXplKTsKLQkJbmV4dEVPRiA9IGZpbGVTaXplOwotCQlpZihmaWxlU2l6ZSAlIDUxMiA+IDApIHsKLQkJCW5leHRFbnRyeSA9IGZpbGVTaXplICsgKDUxMiAtIChmaWxlU2l6ZSAlIDUxMikpOwotCQl9IGVsc2UgewotCQkJbmV4dEVudHJ5ID0gZmlsZVNpemU7Ci0JCX0KLQkJZmlsZXBvcyArPSAobmV4dEVudHJ5ICsgNTEyKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIE1vdmVzIGFoZWFkIHRvIHRoZSBuZXh0IGZpbGUgaW4gdGhlIHRhciBhcmNoaXZlIGFuZCByZXR1cm5zCi0JICogYSBUYXJFbnRyeSBvYmplY3QgZGVzY3JpYmluZyBpdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IGVudHJ5IGluIHRoZSB0YXIgZmlsZQotCSAqIEB0aHJvd3MgVGFyRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBUYXJFbnRyeSBnZXROZXh0RW50cnkoKSB0aHJvd3MgVGFyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCVRhckVudHJ5IGVudHJ5ID0gZ2V0TmV4dEVudHJ5SW50ZXJuYWwoKTsKLQotCQlpZihlbnRyeSAhPSBudWxsICYmIGVudHJ5LmdldE5hbWUoKS5lcXVhbHMoIi4vLi9ATG9uZ0xpbmsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbiBmb3IgZG9pbmcgbG9uZyBmaWxlbmFtZXMuCi0JCQkvLyBXZSBnZXQgYSBmaWxlIGNhbGxlZCAuLy4vQExvbmdMaW5rIHdoaWNoIGp1c3QgY29udGFpbnMKLQkJCS8vIHRoZSByZWFsIHBhdGhuYW1lLgotCQkJYnl0ZVtdIGxvbmdOYW1lRGF0YSA9IG5ldyBieXRlWyhpbnQpIGVudHJ5LmdldFNpemUoKV07Ci0JCQlpbnQgYnl0ZXNyZWFkID0gMDsKLQkJCXdoaWxlIChieXRlc3JlYWQgPCBsb25nTmFtZURhdGEubGVuZ3RoKSB7Ci0JCQkJaW50IGN1ciA9IHJlYWQobG9uZ05hbWVEYXRhLCBieXRlc3JlYWQsIGxvbmdOYW1lRGF0YS5sZW5ndGggLSBieXRlc3JlYWQpOwotCQkJCWlmIChjdXIgPCAwKSB7Ci0JCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiZWFybHkgZW5kIG9mIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWJ5dGVzcmVhZCArPSBjdXI7Ci0JCQl9Ci0KLQkJCWludCBwb3MgPSAwOwotCQkJd2hpbGUgKHBvcyA8IGxvbmdOYW1lRGF0YS5sZW5ndGggJiYgbG9uZ05hbWVEYXRhW3Bvc10gIT0gMCkKLQkJCQlwb3MrKzsKLQkJCWxvbmdMaW5rTmFtZSA9IG5ldyBTdHJpbmcobG9uZ05hbWVEYXRhLCAwLCBwb3MsICJVVEY4Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBnZXROZXh0RW50cnlJbnRlcm5hbCgpOwotCQl9Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI3JlYWQoYnl0ZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKG5leHRFT0YgPT0gMCkgcmV0dXJuIC0xOwotCQlpZihsZW4gPiBuZXh0RU9GKSBsZW4gPSBuZXh0RU9GOwotCQlpbnQgc2l6ZSA9IHN1cGVyLnJlYWQoYiwgb2ZmLCBsZW4pOwotCQluZXh0RW50cnkgLT0gc2l6ZTsKLQkJbmV4dEVPRiAtPSBzaXplOwotCQlieXRlc3JlYWQgKz0gc2l6ZTsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gZGF0YSA9IG5ldyBieXRlWzFdOwotCQlpbnQgc2l6ZSA9IHJlYWQoZGF0YSwgMCwgMSk7Ci0JCWlmIChzaXplIDwgMCkKLQkJCXJldHVybiBzaXplOwotCQlyZXR1cm4gZGF0YVswXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvVGFyTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvVGFyTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YjcyN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL1RhckxldmVsZWRTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBSZWQgSGF0LCBJbmMgLSBXYXMgVGFyRmlsZVN0cnVjdHVyZVByb3ZpZGVyLCBwZXJmb3JtZWQgY2hhbmdlcyBmcm9tIAotICogICAgIElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciB0byBJTGV2ZWxlZEltcG9ydFN0cnVjdHVyZVByb3ZpZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGNvbnRleHQgc3RydWN0dXJlIGFuZCBjb250ZW50Ci0gKiBvZiBzcGVjaWZpZWQgdGFyIGZpbGUgZW50cnkgb2JqZWN0cy4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgVGFyTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUxldmVsZWRJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciB7Ci0JcHJpdmF0ZSBUYXJGaWxlIHRhckZpbGU7Ci0KLQlwcml2YXRlIFRhckVudHJ5IHJvb3QgPSBuZXcgVGFyRW50cnkoIi8iKTsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1hcCBjaGlsZHJlbjsKLQotCXByaXZhdGUgTWFwIGRpcmVjdG9yeUVudHJ5Q2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBpbnQgc3RyaXBMZXZlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5UYXJGaWxlU3RydWN0dXJlUHJvdmlkZXI8L2NvZGU+LCB3aGljaCB3aWxsIG9wZXJhdGUgb24KLQkgKiB0aGUgcGFzc2VkIHRhciBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VGaWxlCi0JICogICAgICAgICAgICB0aGUgc291cmNlIFRhckZpbGUKLQkgKi8KLQlwdWJsaWMgVGFyTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyKFRhckZpbGUgc291cmNlRmlsZSkgewotCQlzdXBlcigpOwotCQl0YXJGaWxlID0gc291cmNlRmlsZTsKLQkJcm9vdC5zZXRGaWxlVHlwZShUYXJFbnRyeS5ESVJFQ1RPUlkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRhciBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgaWZmIGl0IGhhcyAKLQkgKiBub3QgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuIElmIHRoZSBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnQgZG9lcyBub3QKLQkgKiBhbHJlYWR5IGV4aXN0IGl0IHdpbGwgYmUgcmVjdXJzaXZlbHkgY3JlYXRlZCBhcyB3ZWxsLgotCSAqIEBwYXJhbSBwYXRobmFtZSBUaGUgcGF0aCByZXByZXNlbnRpbmcgdGhlIGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBwYXRobmFtZSAoaXQgbWF5IGhhdmUgYWxyZWFkeSBleGlzdGVkKQotCSAqLwotCXByb3RlY3RlZCBUYXJFbnRyeSBjcmVhdGVDb250YWluZXIoSVBhdGggcGF0aG5hbWUpIHsKLQkJVGFyRW50cnkgZXhpc3RpbmdFbnRyeSA9IChUYXJFbnRyeSkgZGlyZWN0b3J5RW50cnlDYWNoZS5nZXQocGF0aG5hbWUpOwotCQlpZiAoZXhpc3RpbmdFbnRyeSAhPSBudWxsKQotCQkJcmV0dXJuIGV4aXN0aW5nRW50cnk7Ci0KLQkJVGFyRW50cnkgcGFyZW50OwotCQlpZiAocGF0aG5hbWUuc2VnbWVudENvdW50KCkgPT0gMSkKLQkJCXBhcmVudCA9IHJvb3Q7Ci0JCWVsc2UKLQkJCXBhcmVudCA9IGNyZWF0ZUNvbnRhaW5lcihwYXRobmFtZS5yZW1vdmVMYXN0U2VnbWVudHMoMSkpOwotCQlUYXJFbnRyeSBuZXdFbnRyeSA9IG5ldyBUYXJFbnRyeShwYXRobmFtZS50b1N0cmluZygpKTsKLQkJbmV3RW50cnkuc2V0RmlsZVR5cGUoVGFyRW50cnkuRElSRUNUT1JZKTsKLQkJZGlyZWN0b3J5RW50cnlDYWNoZS5wdXQocGF0aG5hbWUsIG5ld0VudHJ5KTsKLQkJTGlzdCBjaGlsZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNoaWxkcmVuLnB1dChuZXdFbnRyeSwgY2hpbGRMaXN0KTsKLQotCQlMaXN0IHBhcmVudENoaWxkTGlzdCA9IChMaXN0KSBjaGlsZHJlbi5nZXQocGFyZW50KTsKLQkJcGFyZW50Q2hpbGRMaXN0LmFkZChuZXdFbnRyeSk7Ci0JCXJldHVybiBuZXdFbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRhciBmaWxlIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbGUoVGFyRW50cnkgZW50cnkpIHsKLQkJSVBhdGggcGF0aG5hbWUgPSBuZXcgUGF0aChlbnRyeS5nZXROYW1lKCkpOwotCQlUYXJFbnRyeSBwYXJlbnQ7Ci0JCWlmIChwYXRobmFtZS5zZWdtZW50Q291bnQoKSA9PSAxKQotCQkJcGFyZW50ID0gcm9vdDsKLQkJZWxzZQotCQkJcGFyZW50ID0gKFRhckVudHJ5KSBkaXJlY3RvcnlFbnRyeUNhY2hlLmdldChwYXRobmFtZQotCQkJCQkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpKTsKLQotCQlMaXN0IGNoaWxkTGlzdCA9IChMaXN0KSBjaGlsZHJlbi5nZXQocGFyZW50KTsKLQkJY2hpbGRMaXN0LmFkZChlbnRyeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCWluaXRpYWxpemUoKTsKLQotCQlyZXR1cm4gKChMaXN0KSBjaGlsZHJlbi5nZXQoZWxlbWVudCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGFyRmlsZS5nZXRJbnB1dFN0cmVhbSgoVGFyRW50cnkpIGVsZW1lbnQpOwotCQl9IGNhdGNoIChUYXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYXR0cmlidXRlcyBmb3IgdGhpcyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZmlsZQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF0dHJpYnV0ZXMgZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbmV3IFJlc291cmNlQXR0cmlidXRlcygpOwotCQlUYXJFbnRyeSBlbnRyeSA9IChUYXJFbnRyeSkgZWxlbWVudDsKLQkJYXR0cmlidXRlcy5zZXRFeGVjdXRhYmxlKChlbnRyeS5nZXRNb2RlKCkgJiAwMTAwKSAhPSAwKTsKLQkJYXR0cmlidXRlcy5zZXRSZWFkT25seSgoZW50cnkuZ2V0TW9kZSgpICYgMDIwMCkgPT0gMCk7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsUGF0aChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gc3RyaXBQYXRoKCgoVGFyRW50cnkpIGVsZW1lbnQpLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmVxdWFscyhyb290KSkKLQkJCXJldHVybiAoKFRhckVudHJ5KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0KLQkJcmV0dXJuIHN0cmlwUGF0aChuZXcgUGF0aCgoKFRhckVudHJ5KSBlbGVtZW50KS5nZXROYW1lKCkpLmxhc3RTZWdtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVudHJ5IHRoYXQgdGhpcyBpbXBvcnRlciB1c2VzIGFzIHRoZSByb290IHNlbnRpbmVsLgotCSAqIAotCSAqIEByZXR1cm4gVGFyRW50cnkgZW50cnkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJvb3QoKSB7Ci0JCXJldHVybiByb290OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhciBmaWxlIHRoYXQgdGhpcyBwcm92aWRlciBwcm92aWRlcyBzdHJ1Y3R1cmUgZm9yLgotCSAqIAotCSAqIEByZXR1cm4gVGFyRmlsZSBmaWxlCi0JICovCi0JcHVibGljIFRhckZpbGUgZ2V0VGFyRmlsZSgpIHsKLQkJcmV0dXJuIHRhckZpbGU7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBvYmplY3QncyBjaGlsZHJlbiB0YWJsZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlCi0JICogc3BlY2lmaWVkIHNvdXJjZSBmaWxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWNoaWxkcmVuID0gbmV3IEhhc2hNYXAoMTAwMCk7Ci0JCQotCQljaGlsZHJlbi5wdXQocm9vdCwgbmV3IEFycmF5TGlzdCgpKTsKLQkJRW51bWVyYXRpb24gZW50cmllcyA9IHRhckZpbGUuZW50cmllcygpOwotCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJVGFyRW50cnkgZW50cnkgPSAoVGFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChlbnRyeS5nZXROYW1lKCkpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCQkKLQkJCWlmIChlbnRyeS5nZXRGaWxlVHlwZSgpID09IFRhckVudHJ5LkRJUkVDVE9SWSkgCi0JCQkJY3JlYXRlQ29udGFpbmVyKHBhdGgpOwotCQkJZWxzZQotCQkJewotCQkJCS8vIEVuc3VyZSB0aGUgY29udGFpbmVyIHN0cnVjdHVyZSBmb3IgYWxsIGxldmVscyBhYm92ZSB0aGlzIGlzIGluaXRpYWxpemVkCi0JCQkJLy8gT25jZSB3ZSBoaXQgYSBoaWdoZXItbGV2ZWwgY29udGFpbmVyIHRoYXQncyBhbHJlYWR5IGFkZGVkIHdlIG5lZWQgZ28gbm8gZnVydGhlcgotCQkJCWludCBwYXRoU2VnbWVudENvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQlpZiAocGF0aFNlZ21lbnRDb3VudCA+IDEpCi0JCQkJCWNyZWF0ZUNvbnRhaW5lcihwYXRoLnVwdG9TZWdtZW50KHBhdGhTZWdtZW50Q291bnQgLSAxKSk7Ci0JCQkJY3JlYXRlRmlsZShlbnRyeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvbGRlcihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gKCgoVGFyRW50cnkpIGVsZW1lbnQpLmdldEZpbGVUeXBlKCkgPT0gVGFyRW50cnkuRElSRUNUT1JZKTsKLQl9Ci0KLQkvKgotCSAqIFN0cmlwIHRoZSBsZWFkaW5nIGRpcmVjdG9yaWVzIGZyb20gdGhlIHBhdGgKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzdHJpcFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJU3RyaW5nIHBhdGhPcmlnID0gbmV3IFN0cmluZyhwYXRoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpcExldmVsOyBpKyspIHsKLQkJCWludCBmaXJzdFNlcCA9IHBhdGguaW5kZXhPZignLycpOwotCQkJLy8gSWYgdGhlIGZpcnN0IGNoYXJhY3RlciB3YXMgYSBzZXBlcmF0b3Igd2UgbXVzdCBzdHJpcCB0byB0aGUgbmV4dAotCQkJLy8gc2VwZXJhdG9yIGFzIHdlbGwKLQkJCWlmIChmaXJzdFNlcCA9PSAwKSB7Ci0JCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwotCQkJCWZpcnN0U2VwID0gcGF0aC5pbmRleE9mKCcvJyk7Ci0JCQl9Ci0JCQkvLyBObyBzZXBlcmF0b3Igd2FzdyBwcmVzZW50IHNvIHdlJ3JlIGluIGEgaGlnaGVyIGRpcmVjdG9yeSByaWdodAotCQkJLy8gbm93Ci0JCQlpZiAoZmlyc3RTZXAgPT0gLTEpCi0JCQkJcmV0dXJuIHBhdGhPcmlnOwotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKGZpcnN0U2VwKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJpcChpbnQgbGV2ZWwpIHsKLQkJc3RyaXBMZXZlbCA9IGxldmVsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RyaXAoKSB7Ci0JCXJldHVybiBzdHJpcExldmVsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9UYXJPdXRwdXRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9UYXJPdXRwdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY1ODE0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvVGFyT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIE91dHB1dCBzdHJlYW0gZm9yIHdyaXRpbmcgdXN0YXIgYXJjaGl2ZSBmaWxlcyAodGFyKSBjb21wYXRpYmxlCi0gKiB3aXRoIHRoZSBzcGVjaWZpY2F0aW9uIGluIElFRUUgU3RkIDEwMDMuMS0yMDAxLgotICoKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFRhck91dHB1dFN0cmVhbSBleHRlbmRzIEZpbHRlck91dHB1dFN0cmVhbSB7Ci0JCi0JcHJpdmF0ZSBpbnQgYnl0ZXN3cml0dGVuID0gMDsKLQlwcml2YXRlIGludCBkYXRhcG9zID0gMDsKLQlwcml2YXRlIGxvbmcgY3Vyc2l6ZSA9IDA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRhciBvdXRwdXQgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBvdXQgdGhlIHN0cmVhbSB0byB3cml0ZSB0bwotCSAqLwotCXB1YmxpYyBUYXJPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgewotCQlzdXBlcihvdXQpOwotCX0KLQotCS8qKgotCSAqIENsb3NlIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCB3cml0ZSBhbnkgbmVjZXNzYXJ5IHBhZGRpbmcuCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTcGVjIHNheXMgdG8gd3JpdGUgMTAyNCBieXRlcyBvZiB6ZXJvcyBhdCB0aGUgZW5kLgotCQlieXRlW10gemVyb3MgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJY3Vyc2l6ZSA9IDEwMjQ7Ci0JCXdyaXRlKHplcm9zLCAwLCAxMDI0KTsKLQotCQkvLyBEZWZhdWx0IGJsb2NrIHNpemUgZm9yIHRhciBmaWxlcyBpcyAxMDI0MCwgc28gd2UgaGF2ZSB0bwotCQkvLyBwYWQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0byBiZSBhIG11bHRpcGxlIG9mIHRoaXMgc2l6ZS4KLQkJaWYoKGJ5dGVzd3JpdHRlbiAlIDEwMjQwKSAhPSAwKSB7Ci0JCQlpbnQgbGVuZ3RoID0gMTAyNDAgLSAoYnl0ZXN3cml0dGVuICUgMTAyNDApOwotCQkJY3Vyc2l6ZSA9IGxlbmd0aDsKLQkJCXplcm9zID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLQkJCXdyaXRlKHplcm9zLCAwLCBsZW5ndGgpOwotCQl9Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgdGhlIGN1cnJlbnQgZW50cnkgaW4gdGhlIHRhciBmaWxlLiAgTXVzdCBiZSBjYWxsZWQKLQkgKiBhZnRlciBlYWNoIGVudHJ5IGlzIGNvbXBsZXRlZC4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VFbnRyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbNTEyXTsKLQkJaW50IGxlbiA9IDUxMiAtIGRhdGFwb3M7Ci0JCWlmKGxlbiA+IDAgJiYgZGF0YXBvcyA+IDApIHsKLQkJCWN1cnNpemUgPSBsZW47Ci0JCQl3cml0ZShkYXRhLCAwLCBsZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIFRoZSBjaGVja3N1bSBvZiBhIHRhciBmaWxlIGhlYWRlciBpcyBzaW1wbHkgdGhlIHN1bSBvZiB0aGUgYnl0ZXMgaW4KLQkgKiAgdGhlIGhlYWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gaGVhZGVyCi0JICogQHJldHVybiBjaGVja3N1bQotCSAqLwotCXByaXZhdGUgbG9uZyBoZWFkZXJDaGVja3N1bShieXRlW10gaGVhZGVyKSB7Ci0JCWxvbmcgc3VtID0gMDsKLQkJZm9yKGludCBpID0gMDsgaSA8IDUxMjsgaSsrKSB7Ci0JCQlzdW0gKz0gaGVhZGVyW2ldICYgMHhmZjsKLQkJfQotCQlyZXR1cm4gc3VtOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYW4gZW50cnkgZm9yIGEgbmV3IGZpbGUgaW4gdGhlIHRhciBhcmNoaXZlLgotCSAqIAotCSAqIEBwYXJhbSBlIFRhckVudHJ5IGRlc2NyaWJpbmcgdGhlIGZpbGUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcHV0TmV4dEVudHJ5KFRhckVudHJ5IGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBoZWFkZXIgPSBuZXcgYnl0ZVs1MTJdOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBlLmdldE5hbWUoKTsKLQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCWludCBwb3MsIGk7Ci0JCQotCQkvKiBTcGxpdCBmaWxlbmFtZSBpbnRvIG5hbWUgYW5kIHByZWZpeCBpZiBuZWNlc3NhcnkuICovCi0JCWJ5dGVbXSBmaWxlbmFtZUJ5dGVzID0gZmlsZW5hbWUuZ2V0Qnl0ZXMoIlVURjgiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZmlsZW5hbWVCeXRlcy5sZW5ndGggPiA5OSkgewotCQkJaW50IHNlcHBvcyA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZihzZXBwb3MgPT0gLTEpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiZmlsZW5hbWUgdG9vIGxvbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJlZml4ID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIHNlcHBvcyk7Ci0JCQlmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhzZXBwb3MgKyAxKTsKLQkJCWZpbGVuYW1lQnl0ZXMgPSBmaWxlbmFtZS5nZXRCeXRlcygiVVRGOCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZmlsZW5hbWVCeXRlcy5sZW5ndGggPiA5OSkKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oImZpbGVuYW1lIHRvbyBsb25nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLyogRmlsZW5hbWUuICovCi0JCXBvcyA9IDA7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZmlsZW5hbWVCeXRlcywgMCwgaGVhZGVyLCAwLCBmaWxlbmFtZUJ5dGVzLmxlbmd0aCk7Ci0JCXBvcyArPSAxMDA7Ci0JCQotCQkvKiBGaWxlIG1vZGUuICovCi0JCVN0cmluZ0J1ZmZlciBtb2RlID0gbmV3IFN0cmluZ0J1ZmZlcihMb25nLnRvT2N0YWxTdHJpbmcoZS5nZXRNb2RlKCkpKTsKLQkJd2hpbGUobW9kZS5sZW5ndGgoKSA8IDcpIG1vZGUuaW5zZXJ0KDAsJzAnKTsKLQkJZm9yKGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0JCQloZWFkZXJbcG9zICsgaV0gPSAoYnl0ZSkgbW9kZS5jaGFyQXQoaSk7Ci0JCX0KLQkJcG9zICs9IDg7Ci0JCQotCQkvKiBVSUQuICovCi0JCWhlYWRlcltwb3NdID0gJzAnOwotCQlwb3MgKz0gODsKLQkJCi0JCS8qIEdJRC4gKi8KLQkJaGVhZGVyW3Bvc10gPSAnMCc7Ci0JCXBvcyArPSA4OwotCQkKLQkJLyogTGVuZ3RoIG9mIHRoZSBmaWxlLiAqLwotCQlTdHJpbmcgbGVuZ3RoID0gTG9uZy50b09jdGFsU3RyaW5nKGUuZ2V0U2l6ZSgpKTsKLQkJZm9yKGkgPSAwOyBpIDwgbGVuZ3RoLmxlbmd0aCgpOyBpKyspIHsKLQkJCWhlYWRlcltwb3MgKyBpXSA9IChieXRlKSBsZW5ndGguY2hhckF0KGkpOwotCQl9Ci0JCXBvcyArPSAxMjsKLQkJCi0JCS8qIG10aW1lICovCi0JCVN0cmluZyBtdGltZSA9IExvbmcudG9PY3RhbFN0cmluZyhlLmdldFRpbWUoKSk7Ci0JCWZvcihpID0gMDsgaSA8IG10aW1lLmxlbmd0aCgpOyBpKyspIHsKLQkJCWhlYWRlcltwb3MgKyBpXSA9IChieXRlKSBtdGltZS5jaGFyQXQoaSk7Ci0JCX0KLQkJcG9zICs9IDEyOwotCQkKLQkJLyogIkJsYW5rIiBvdXQgdGhlIGNoZWNrc3VtLiAqLwotCQlmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCWhlYWRlcltwb3MgKyBpXSA9ICcgJzsKLQkJfQotCQlwb3MgKz0gODsKLQkJCi0JCS8qIExpbmsgZmxhZy4gKi8KLQkJaGVhZGVyW3Bvc10gPSAoYnl0ZSkgZS5nZXRGaWxlVHlwZSgpOwotCQlwb3MgKz0gMTsKLQotCQkvKiBMaW5rIGRlc3RpbmF0aW9uLiAqLwotCQlwb3MgKz0gMTAwOwotCi0JCS8qIEFkZCB1c3RhciBoZWFkZXIuICovCi0JCVN0cmluZyB1c3RhciA9ICJ1c3RhciAwMCI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yKGkgPSAwOyBpIDwgdXN0YXIubGVuZ3RoKCk7IGkrKykgewotCQkJaGVhZGVyW3BvcyArIGldID0gKGJ5dGUpIHVzdGFyLmNoYXJBdChpKTsKLQkJfQotCQloZWFkZXJbcG9zICsgNV0gPSAwOwotCQlwb3MgKz0gODsKLQkJCi0JCS8qIFVzZXJuYW1lLiAqLwotCQlTdHJpbmcgdW5hbWUgPSAibm9ib2R5IjsgLy8kTk9OLU5MUy0xJAotCQlmb3IoaSA9IDA7IGkgPCB1bmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQloZWFkZXJbcG9zICsgaV0gPSAoYnl0ZSkgdW5hbWUuY2hhckF0KGkpOwotCQl9Ci0JCXBvcyArPSAzMjsKLQkJCi0JCQotCQkvKiBHcm91cCBuYW1lLiAqLwotCQlTdHJpbmcgZ25hbWUgPSAibm9ib2R5IjsgLy8kTk9OLU5MUy0xJAotCQlmb3IoaSA9IDA7IGkgPCBnbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQloZWFkZXJbcG9zICsgaV0gPSAoYnl0ZSkgZ25hbWUuY2hhckF0KGkpOwotCQl9Ci0JCXBvcyArPSAzMjsKLQkJCi0JCS8qIERldmljZSBtYWpvci4gKi8KLQkJcG9zICs9IDg7Ci0KLQkJLyogRGV2aWNlIG1pbm9yLiAqLwotCQlwb3MgKz0gODsKLQotCQkvKiBGaWxlIHByZWZpeC4gKi8KLQkJaWYocHJlZml4ICE9IG51bGwpIHsKLQkJCWJ5dGVbXSBwcmVmaXhCeXRlcyA9IHByZWZpeC5nZXRCeXRlcygiVVRGOCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocHJlZml4Qnl0ZXMubGVuZ3RoID4gMTU1KQotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigicHJlZml4IHRvbyBsYXJnZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0uYXJyYXljb3B5KHByZWZpeEJ5dGVzLCAwLCBoZWFkZXIsIHBvcywgcHJlZml4Qnl0ZXMubGVuZ3RoKTsKLQkJfQotCi0JCWxvbmcgc3VtID0gaGVhZGVyQ2hlY2tzdW0oaGVhZGVyKTsKLQkJcG9zID0gMTAwICsgOCArIDggKyA4ICsgMTIgKyAxMjsKLQkJU3RyaW5nIHN1bXZhbCA9IExvbmcudG9PY3RhbFN0cmluZyhzdW0pOwotCQlmb3IoaSA9IDA7IGkgPCBzdW12YWwubGVuZ3RoKCk7IGkrKykgewotCQkJaGVhZGVyW3BvcyArIGldID0gKGJ5dGUpIHN1bXZhbC5jaGFyQXQoaSk7Ci0JCX0KLQotCQljdXJzaXplID0gNTEyOwotCQl3cml0ZShoZWFkZXIsIDAsIDUxMik7Ci0JCQotCQljdXJzaXplID0gZS5nZXRTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIGRhdGEgZm9yIHRoZSBjdXJyZW50IGZpbGUgaW50byB0aGUgYXJjaGl2ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIud3JpdGUoYiwgb2ZmLCBsZW4pOwotCQlkYXRhcG9zID0gKGRhdGFwb3MgKyBsZW4pICUgNTEyOwotCQlieXRlc3dyaXR0ZW4gKz0gbGVuOwotCQljdXJzaXplIC09IGxlbjsKLQkJaWYoY3Vyc2l6ZSA8IDApIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigidG9vIG11Y2ggZGF0YSB3cml0dGVuIGZvciBjdXJyZW50IGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL1dpemFyZEFyY2hpdmVGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL1dpemFyZEFyY2hpdmVGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTEzZTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9XaXphcmRBcmNoaXZlRmlsZVJlc291cmNlRXhwb3J0UGFnZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqCVBhZ2UgMSBvZiB0aGUgYmFzZSByZXNvdXJjZSBleHBvcnQtdG8tYXJjaGl2ZSBXaXphcmQuCi0gKgotICoJQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkQXJjaGl2ZUZpbGVSZXNvdXJjZUV4cG9ydFBhZ2UxIGV4dGVuZHMKLQkJV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlRXhwb3J0UGFnZTEgewotCi0gICAgLy8gd2lkZ2V0cwotICAgIHByb3RlY3RlZCBCdXR0b24gY29tcHJlc3NDb250ZW50c0NoZWNrYm94OwotICAgIAotICAgIHByaXZhdGUgQnV0dG9uIHppcEZvcm1hdEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiB0YXJnekZvcm1hdEJ1dHRvbjsKLQotICAgIC8vIGRpYWxvZyBzdG9yZSBpZCBjb25zdGFudHMKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RPUkVfREVTVElOQVRJT05fTkFNRVNfSUQgPSAiV2l6YXJkWmlwRmlsZVJlc291cmNlRXhwb3J0UGFnZTEuU1RPUkVfREVTVElOQVRJT05fTkFNRVNfSUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RPUkVfQ1JFQVRFX1NUUlVDVFVSRV9JRCA9ICJXaXphcmRaaXBGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMS5TVE9SRV9DUkVBVEVfU1RSVUNUVVJFX0lEIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUT1JFX0NPTVBSRVNTX0NPTlRFTlRTX0lEID0gIldpemFyZFppcEZpbGVSZXNvdXJjZUV4cG9ydFBhZ2UxLlNUT1JFX0NPTVBSRVNTX0NPTlRFTlRTX0lEIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICoJQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuIAotICAgICAqCi0gICAgICoJQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBXaXphcmRBcmNoaXZlRmlsZVJlc291cmNlRXhwb3J0UGFnZTEoU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIobmFtZSwgc2VsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIHNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBXaXphcmRBcmNoaXZlRmlsZVJlc291cmNlRXhwb3J0UGFnZTEoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHRoaXMoInppcEZpbGVFeHBvcnRQYWdlMSIsIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0VGl0bGUoRGF0YVRyYW5zZmVyTWVzc2FnZXMuQXJjaGl2ZUV4cG9ydF9leHBvcnRUaXRsZSk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKERhdGFUcmFuc2Zlck1lc3NhZ2VzLkFyY2hpdmVFeHBvcnRfZGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLAotICAgICAgICAgICAgICAgIElEYXRhVHJhbnNmZXJIZWxwQ29udGV4dElkcy5aSVBfRklMRV9FWFBPUlRfV0laQVJEX1BBR0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUNyZWF0ZSB0aGUgZXhwb3J0IG9wdGlvbnMgc3BlY2lmaWNhdGlvbiB3aWRnZXRzLgotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3B0aW9uc0dyb3VwQnV0dG9ucyhHcm91cCBvcHRpb25zR3JvdXApIHsKLSAgICAJRm9udCBmb250ID0gb3B0aW9uc0dyb3VwLmdldEZvbnQoKTsKLSAgICAJb3B0aW9uc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0gICAgCQotICAgIAlDb21wb3NpdGUgbGVmdCA9IG5ldyBDb21wb3NpdGUob3B0aW9uc0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgCWxlZnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5UT1AsIHRydWUsIGZhbHNlKSk7Ci0gICAgCWxlZnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQotICAgICAgICBjcmVhdGVGaWxlRm9ybWF0T3B0aW9ucyhsZWZ0LCBmb250KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNvbXByZXNzLi4uIGNoZWNrYm94Ci0gICAgICAgIGNvbXByZXNzQ29udGVudHNDaGVja2JveCA9IG5ldyBCdXR0b24obGVmdCwgU1dULkNIRUNLCi0gICAgICAgICAgICAgICAgfCBTV1QuTEVGVCk7Ci0gICAgICAgIGNvbXByZXNzQ29udGVudHNDaGVja2JveC5zZXRUZXh0KERhdGFUcmFuc2Zlck1lc3NhZ2VzLlppcEV4cG9ydF9jb21wcmVzc0NvbnRlbnRzKTsKLSAgICAgICAgY29tcHJlc3NDb250ZW50c0NoZWNrYm94LnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIHJpZ2h0ID0gbmV3IENvbXBvc2l0ZShvcHRpb25zR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgcmlnaHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5UT1AsIHRydWUsIGZhbHNlKSk7Ci0gICAgICAgIHJpZ2h0LnNldExheW91dChuZXcgR3JpZExheW91dCgxLCB0cnVlKSk7Ci0KLSAgICAgICAgY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlT3B0aW9ucyhyaWdodCwgZm9udCk7Ci0KLSAgICAgICAgLy8gaW5pdGlhbCBzZXR1cAotICAgICAgICBjcmVhdGVEaXJlY3RvcnlTdHJ1Y3R1cmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICBjcmVhdGVTZWxlY3Rpb25Pbmx5QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIGNvbXByZXNzQ29udGVudHNDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBidXR0b25zIGZvciB0aGUgZ3JvdXAgdGhhdCBkZXRlcm1pbmUgaWYgdGhlIGVudGlyZSBvcgotICAgICAqIHNlbGVjdGVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGNyZWF0ZWQuCi0gICAgICogQHBhcmFtIG9wdGlvbnNHcm91cAotICAgICAqIEBwYXJhbSBmb250Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsZUZvcm1hdE9wdGlvbnMoQ29tcG9zaXRlIG9wdGlvbnNHcm91cCwgRm9udCBmb250KSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlIHJhZGlvcwotICAgICAgICB6aXBGb3JtYXRCdXR0b24gPSBuZXcgQnV0dG9uKG9wdGlvbnNHcm91cCwgU1dULlJBRElPIHwgU1dULkxFRlQpOwotICAgICAgICB6aXBGb3JtYXRCdXR0b24uc2V0VGV4dChEYXRhVHJhbnNmZXJNZXNzYWdlcy5BcmNoaXZlRXhwb3J0X3NhdmVJblppcEZvcm1hdCk7Ci0gICAgICAgIHppcEZvcm1hdEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIHppcEZvcm1hdEJ1dHRvbi5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlIHJhZGlvcwotICAgICAgICB0YXJnekZvcm1hdEJ1dHRvbiA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuUkFESU8gfCBTV1QuTEVGVCk7Ci0gICAgICAgIHRhcmd6Rm9ybWF0QnV0dG9uLnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuQXJjaGl2ZUV4cG9ydF9zYXZlSW5UYXJGb3JtYXQpOwotICAgICAgICB0YXJnekZvcm1hdEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICB0YXJnekZvcm1hdEJ1dHRvbi5zZXRGb250KGZvbnQpOwotICAgIH0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkaXJlY3RvcnkgcG9ydGlvbiBvZiB0aGUKLSAgICAgKiBwYXNzZWQgcGF0aG5hbWUgaXMgdmFsaWQgYW5kIGF2YWlsYWJsZSBmb3IgdXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGVuc3VyZVRhcmdldERpcmVjdG9yeUlzVmFsaWQoU3RyaW5nIGZ1bGxQYXRobmFtZSkgewotICAgICAgICBpbnQgc2VwYXJhdG9ySW5kZXggPSBmdWxsUGF0aG5hbWUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwotCi0gICAgICAgIGlmIChzZXBhcmF0b3JJbmRleCA9PSAtMSkgLy8gaWUuLSBkZWZhdWx0IGRpciwgd2hpY2ggaXMgZmluZQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgcmV0dXJuIGVuc3VyZVRhcmdldElzVmFsaWQobmV3IEZpbGUoZnVsbFBhdGhuYW1lLnN1YnN0cmluZygwLAotICAgICAgICAgICAgICAgIHNlcGFyYXRvckluZGV4KSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFzc2VkIEZpbGUgaGFuZGxlIGlzCi0gICAgICogaXMgdmFsaWQgYW5kIGF2YWlsYWJsZSBmb3IgdXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGVuc3VyZVRhcmdldEZpbGVJc1ZhbGlkKEZpbGUgdGFyZ2V0RmlsZSkgewotICAgICAgICBpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSAmJiB0YXJnZXRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIGRpc3BsYXlFcnJvckRpYWxvZyhEYXRhVHJhbnNmZXJNZXNzYWdlcy5aaXBFeHBvcnRfbXVzdEJlRmlsZSk7Ci0gICAgICAgICAgICBnaXZlRm9jdXNUb0Rlc3RpbmF0aW9uKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgaWYgKHRhcmdldEZpbGUuY2FuV3JpdGUoKSkgewotICAgICAgICAgICAgICAgIGlmICghcXVlcnlZZXNOb1F1ZXN0aW9uKERhdGFUcmFuc2Zlck1lc3NhZ2VzLlppcEV4cG9ydF9hbHJlYWR5RXhpc3RzKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5RXJyb3JEaWFsb2coRGF0YVRyYW5zZmVyTWVzc2FnZXMuWmlwRXhwb3J0X2FscmVhZHlFeGlzdHNFcnJvcik7Ci0gICAgICAgICAgICAgICAgZ2l2ZUZvY3VzVG9EZXN0aW5hdGlvbigpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgdGFyZ2V0IG91dHB1dCBmaWxlIGFuZCBpdHMgY29udGFpbmluZyBkaXJlY3RvcnkgYXJlCi0gICAgICogYm90aCB2YWxpZCBhbmQgYWJsZSB0byBiZSB1c2VkLiAgQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHZhbGlkaXR5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGVuc3VyZVRhcmdldElzVmFsaWQoKSB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRQYXRoID0gZ2V0RGVzdGluYXRpb25WYWx1ZSgpOwotCi0gICAgICAgIGlmICghZW5zdXJlVGFyZ2V0RGlyZWN0b3J5SXNWYWxpZCh0YXJnZXRQYXRoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoIWVuc3VyZVRhcmdldEZpbGVJc1ZhbGlkKG5ldyBGaWxlKHRhcmdldFBhdGgpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRXhwb3J0IHRoZSBwYXNzZWQgcmVzb3VyY2UgYW5kIHJlY3Vyc2l2ZWx5IGV4cG9ydCBhbGwgb2YgaXRzIGNoaWxkIHJlc291cmNlcwotICAgICAqICAoaWZmIGl0J3MgYSBjb250YWluZXIpLiAgQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZUV4cG9ydE9wZXJhdGlvbihBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbiBvcCkgewotICAgICAgICBvcC5zZXRDcmVhdGVMZWFkdXBTdHJ1Y3R1cmUoY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlQnV0dG9uCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgb3Auc2V0VXNlQ29tcHJlc3Npb24oY29tcHJlc3NDb250ZW50c0NoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgb3Auc2V0VXNlVGFyRm9ybWF0KHRhcmd6Rm9ybWF0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGRpc3BsYXlFcnJvckRpYWxvZyhlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gb3AuZ2V0U3RhdHVzKCk7Ci0gICAgICAgIGlmICghc3RhdHVzLmlzT0soKSkgewotICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgIERhdGFUcmFuc2Zlck1lc3NhZ2VzLkRhdGFUcmFuc2Zlcl9leHBvcnRQcm9ibGVtcywKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gbm8gc3BlY2lhbCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgRmluaXNoIGJ1dHRvbiB3YXMgcHJlc3NlZC4gIFRyeSB0byBkbyB0aGUgcmVxdWlyZWQgd29yayBub3cgYW5kIGFuc3dlcgotICAgICAqIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuICBJZiBmYWxzZSBpcyByZXR1cm5lZCB0aGVuIHRoZSB3aXphcmQgd2lsbAotICAgICAqIG5vdCBjbG9zZS4KLSAgICAgKiBAcmV0dXJucyBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZmluaXNoKCkgewotICAgIAlMaXN0IHJlc291cmNlc1RvRXhwb3J0ID0gZ2V0V2hpdGVDaGVja2VkUmVzb3VyY2VzKCk7Ci0gICAgCQotICAgICAgICBpZiAoIWVuc3VyZVRhcmdldElzVmFsaWQoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvL1NhdmUgZGlydHkgZWRpdG9ycyBpZiBwb3NzaWJsZSBidXQgZG8gbm90IHN0b3AgaWYgbm90IGFsbCBhcmUgc2F2ZWQKLSAgICAgICAgc2F2ZURpcnR5RWRpdG9ycygpOwotICAgICAgICAvLyBhYm91dCB0byBpbnZva2UgdGhlIG9wZXJhdGlvbiBzbyBzYXZlIG91ciBzdGF0ZQotICAgICAgICBzYXZlV2lkZ2V0VmFsdWVzKCk7Ci0KLSAgICAgICAgcmV0dXJuIGV4ZWN1dGVFeHBvcnRPcGVyYXRpb24obmV3IEFyY2hpdmVGaWxlRXhwb3J0T3BlcmF0aW9uKG51bGwsCi0gICAgICAgICAgICAgICAgcmVzb3VyY2VzVG9FeHBvcnQsIGdldERlc3RpbmF0aW9uVmFsdWUoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgc3RyaW5nIHRvIGRpc3BsYXkgaW4gdGhlIHJlY2VpdmVyIGFzIHRoZSBkZXN0aW5hdGlvbiB0eXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZXN0aW5hdGlvbkxhYmVsKCkgewotICAgICAgICByZXR1cm4gRGF0YVRyYW5zZmVyTWVzc2FnZXMuQXJjaGl2ZUV4cG9ydF9kZXN0aW5hdGlvbkxhYmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgY29udGVudHMgb2Ygc2VsZidzIGRlc3RpbmF0aW9uIHNwZWNpZmljYXRpb24gd2lkZ2V0LiAgSWYgdGhpcwotICAgICAqCXZhbHVlIGRvZXMgbm90IGhhdmUgYSBzdWZmaXggdGhlbiBhZGQgaXQgZmlyc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZXN0aW5hdGlvblZhbHVlKCkgewotICAgICAgICBTdHJpbmcgaWRlYWxTdWZmaXggPSBnZXRPdXRwdXRTdWZmaXgoKTsKLSAgICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uVGV4dCA9IHN1cGVyLmdldERlc3RpbmF0aW9uVmFsdWUoKTsKLQotICAgICAgICAvLyBvbmx5IGFwcGVuZCBhIHN1ZmZpeCBpZiB0aGUgZGVzdGluYXRpb24gZG9lc24ndCBhbHJlYWR5IGhhdmUgYSAuIGluIAotICAgICAgICAvLyBpdHMgbGFzdCBwYXRoIHNlZ21lbnQuICAKLSAgICAgICAgLy8gQWxzbyBwcmV2ZW50IHRoZSB1c2VyIGZyb20gc2VsZWN0aW5nIGEgZGlyZWN0b3J5LiAgQWxsb3dpbmcgdGhpcyB3aWxsIAotICAgICAgICAvLyBjcmVhdGUgYSAiLnppcCIgZmlsZSBpbiB0aGUgZGlyZWN0b3J5Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvblRleHQubGVuZ3RoKCkgIT0gMAotICAgICAgICAgICAgICAgICYmICFkZXN0aW5hdGlvblRleHQuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0gICAgICAgICAgICBpbnQgZG90SW5kZXggPSBkZXN0aW5hdGlvblRleHQubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIGlmIChkb3RJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IHBhdGggc2VwZXJhdG9yIGluZGV4Ci0gICAgICAgICAgICAgICAgaW50IHBhdGhTZXBJbmRleCA9IGRlc3RpbmF0aW9uVGV4dC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGhTZXBJbmRleCAhPSAtMSAmJiBkb3RJbmRleCA8IHBhdGhTZXBJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRleHQgKz0gaWRlYWxTdWZmaXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRleHQgKz0gaWRlYWxTdWZmaXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGVzdGluYXRpb25UZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgc3VmZml4IHRoYXQgZmlsZXMgZXhwb3J0ZWQgZnJvbSB0aGlzIHdpemFyZCBzaG91bGQgaGF2ZS4KLSAgICAgKglJZiB0aGlzIHN1ZmZpeCBpcyBhIGZpbGUgZXh0ZW5zaW9uICh3aGljaCBpcyB0eXBpY2FsbHkgdGhlIGNhc2UpCi0gICAgICoJdGhlbiBpdCBtdXN0IGluY2x1ZGUgdGhlIGxlYWRpbmcgcGVyaW9kIGNoYXJhY3Rlci4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3V0cHV0U3VmZml4KCkgewotICAgIAlpZih6aXBGb3JtYXRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgCXJldHVybiAiLnppcCI7IC8vJE5PTi1OTFMtMSQKLSAgICAJfSBlbHNlIGlmKGNvbXByZXNzQ29udGVudHNDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkgewotICAgIAkJcmV0dXJuICIudGFyLmd6IjsgLy8kTk9OLU5MUy0xJAotICAgIAl9IGVsc2UgewotICAgIAkJcmV0dXJuICIudGFyIjsgLy8kTk9OLU5MUy0xJAotICAgIAl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJT3BlbiBhbiBhcHByb3ByaWF0ZSBkZXN0aW5hdGlvbiBicm93c2VyIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBzb3VyY2UKLSAgICAgKgl0byBpbXBvcnQgZnJvbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZURlc3RpbmF0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLSAgICAgICAgRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLCBTV1QuU0FWRSk7Ci0gICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLnppcDsqLnRhci5nejsqLnRhcjsqLnRneiIsICIqLioiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgZGlhbG9nLnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuQXJjaGl2ZUV4cG9ydF9zZWxlY3REZXN0aW5hdGlvblRpdGxlKTsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRTb3VyY2VTdHJpbmcgPSBnZXREZXN0aW5hdGlvblZhbHVlKCk7Ci0gICAgICAgIGludCBsYXN0U2VwYXJhdG9ySW5kZXggPSBjdXJyZW50U291cmNlU3RyaW5nCi0gICAgICAgICAgICAgICAgLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgICAgaWYgKGxhc3RTZXBhcmF0b3JJbmRleCAhPSAtMSkKLSAgICAgICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJQYXRoKGN1cnJlbnRTb3VyY2VTdHJpbmcuc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgICAgIGxhc3RTZXBhcmF0b3JJbmRleCkpOwotICAgICAgICBTdHJpbmcgc2VsZWN0ZWRGaWxlTmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkRmlsZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICAgICAgc2V0RGVzdGluYXRpb25WYWx1ZShzZWxlY3RlZEZpbGVOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCUhvb2sgbWV0aG9kIGZvciBzYXZpbmcgd2lkZ2V0IHZhbHVlcyBmb3IgcmVzdG9yYXRpb24gYnkgdGhlIG5leHQgaW5zdGFuY2UKLSAgICAgKglvZiB0aGlzIGNsYXNzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGludGVybmFsU2F2ZVdpZGdldFZhbHVlcygpIHsKLSAgICAgICAgLy8gdXBkYXRlIGRpcmVjdG9yeSBuYW1lcyBoaXN0b3J5Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBkaXJlY3RvcnlOYW1lcyA9IHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBcnJheShTVE9SRV9ERVNUSU5BVElPTl9OQU1FU19JRCk7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0b3J5TmFtZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBkaXJlY3RvcnlOYW1lcyA9IG5ldyBTdHJpbmdbMF07Ci0KLSAgICAgICAgICAgIGRpcmVjdG9yeU5hbWVzID0gYWRkVG9IaXN0b3J5KGRpcmVjdG9yeU5hbWVzLCBnZXREZXN0aW5hdGlvblZhbHVlKCkpOwotICAgICAgICAgICAgc2V0dGluZ3MucHV0KFNUT1JFX0RFU1RJTkFUSU9OX05BTUVTX0lELCBkaXJlY3RvcnlOYW1lcyk7Ci0KLSAgICAgICAgICAgIHNldHRpbmdzLnB1dChTVE9SRV9DUkVBVEVfU1RSVUNUVVJFX0lELAotICAgICAgICAgICAgICAgICAgICBjcmVhdGVEaXJlY3RvcnlTdHJ1Y3R1cmVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0gICAgICAgICAgICBzZXR0aW5ncy5wdXQoU1RPUkVfQ09NUFJFU1NfQ09OVEVOVFNfSUQsIGNvbXByZXNzQ29udGVudHNDaGVja2JveAotICAgICAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJSG9vayBtZXRob2QgZm9yIHJlc3RvcmluZyB3aWRnZXQgdmFsdWVzIHRvIHRoZSB2YWx1ZXMgdGhhdCB0aGV5IGhlbGQKLSAgICAgKglsYXN0IHRpbWUgdGhpcyB3aXphcmQgd2FzIHVzZWQgdG8gY29tcGxldGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nW10gZGlyZWN0b3J5TmFtZXMgPSBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAuZ2V0QXJyYXkoU1RPUkVfREVTVElOQVRJT05fTkFNRVNfSUQpOwotICAgICAgICAgICAgaWYgKGRpcmVjdG9yeU5hbWVzID09IG51bGwgfHwgZGlyZWN0b3J5TmFtZXMubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBpZS4tIG5vIHNldHRpbmdzIHN0b3JlZAotCi0gICAgICAgICAgICAvLyBkZXN0aW5hdGlvbgotICAgICAgICAgICAgc2V0RGVzdGluYXRpb25WYWx1ZShkaXJlY3RvcnlOYW1lc1swXSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdG9yeU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGFkZERlc3RpbmF0aW9uSXRlbShkaXJlY3RvcnlOYW1lc1tpXSk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gc2V0U3RydWN0dXJlID0gc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgLmdldEJvb2xlYW4oU1RPUkVfQ1JFQVRFX1NUUlVDVFVSRV9JRCk7Ci0KLSAgICAgICAgICAgIGNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZUJ1dHRvbi5zZXRTZWxlY3Rpb24oc2V0U3RydWN0dXJlKTsKLSAgICAgICAgICAgIGNyZWF0ZVNlbGVjdGlvbk9ubHlCdXR0b24uc2V0U2VsZWN0aW9uKCFzZXRTdHJ1Y3R1cmUpOwotCi0gICAgICAgICAgICBjb21wcmVzc0NvbnRlbnRzQ2hlY2tib3guc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRCb29sZWFuKFNUT1JFX0NPTVBSRVNTX0NPTlRFTlRTX0lEKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5XaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VFeHBvcnRQYWdlMSNkZXN0aW5hdGlvbkVtcHR5TWVzc2FnZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkZXN0aW5hdGlvbkVtcHR5TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIERhdGFUcmFuc2Zlck1lc3NhZ2VzLkFyY2hpdmVFeHBvcnRfZGVzdGluYXRpb25FbXB0eTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVycyBkZXN0aW5hdGlvbiBzcGVjaWZpY2F0aW9uCi0gICAgICoJd2lkZ2V0cyBjdXJyZW50bHkgYWxsIGNvbnRhaW4gdmFsaWQgdmFsdWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRGVzdGluYXRpb25Hcm91cCgpIHsKLSAgICAJU3RyaW5nIGRlc3RpbmF0aW9uVmFsdWUgPSBnZXREZXN0aW5hdGlvblZhbHVlKCk7Ci0gICAgCWlmIChkZXN0aW5hdGlvblZhbHVlLmVuZHNXaXRoKCIudGFyIikpIHsgLy8kTk9OLU5MUy0xJAotICAgIAkJY29tcHJlc3NDb250ZW50c0NoZWNrYm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgCQl0YXJnekZvcm1hdEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgCQl6aXBGb3JtYXRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAJfSBlbHNlIGlmIChkZXN0aW5hdGlvblZhbHVlLmVuZHNXaXRoKCIudGFyLmd6IikgLy8kTk9OLU5MUy0xJAotCQkJCXx8IGRlc3RpbmF0aW9uVmFsdWUuZW5kc1dpdGgoIi50Z3oiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgCQljb21wcmVzc0NvbnRlbnRzQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIAkJdGFyZ3pGb3JtYXRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIAkJemlwRm9ybWF0QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgCX0gZWxzZSBpZiAoZGVzdGluYXRpb25WYWx1ZS5lbmRzV2l0aCgiLnppcCIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAJCXppcEZvcm1hdEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgCQl0YXJnekZvcm1hdEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgIAl9Ci0gICAgCQotICAgIAlyZXR1cm4gc3VwZXIudmFsaWRhdGVEZXN0aW5hdGlvbkdyb3VwKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL1dpemFyZEFyY2hpdmVGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL1dpemFyZEFyY2hpdmVGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTM1Y2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9XaXphcmRBcmNoaXZlRmlsZVJlc291cmNlSW1wb3J0UGFnZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgUmVkIEhhdCwgSW5jIC0gRXh0cmFjdGVkIHNldmVyYWwgbWV0aG9kcyB0byBBcmNoaXZlRmlsZU1hbmlwdWxhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5BZGFwdGFibGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JbXBvcnRPcGVyYXRpb247Ci0KLQotLyoqCi0gKglQYWdlIDEgb2YgdGhlIGJhc2UgcmVzb3VyY2UgaW1wb3J0LWZyb20tYXJjaGl2ZSBXaXphcmQuCi0gKgotICoJTm90ZSB0aGF0IGltcG9ydGluZyBmcm9tIC5qYXIgaXMgaWRlbnRpY2FsIHRvIGltcG9ydGluZyBmcm9tIC56aXAsIHNvCi0gKglhbGwgcmVmZXJlbmNlcyB0byAuemlwIGluIHRoaXMgY2xhc3MgYXJlIGVxdWFsbHkgYXBwbGljYWJsZSB0byAuamFyCi0gKglyZWZlcmVuY2VzLgotICoKLSAqCUBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFdpemFyZEFyY2hpdmVGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMSBleHRlbmRzCi0gICAgICAgIFdpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUltcG9ydFBhZ2UxIGltcGxlbWVudHMgTGlzdGVuZXIgewotCi0gICAgWmlwTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyIHppcEN1cnJlbnRQcm92aWRlcjsKLSAgICBUYXJMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIgdGFyQ3VycmVudFByb3ZpZGVyOwotCi0gICAgLy8gY29uc3RhbnRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRklMRV9JTVBPUlRfTUFTSyA9IHsgIiouamFyOyouemlwOyoudGFyOyoudGFyLmd6OyoudGd6IiwgIiouKiIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAvLyBkaWFsb2cgc3RvcmUgaWQgY29uc3RhbnRzCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUT1JFX1NPVVJDRV9OQU1FU19JRCA9ICJXaXphcmRaaXBGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMS5TVE9SRV9TT1VSQ0VfTkFNRVNfSUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RPUkVfT1ZFUldSSVRFX0VYSVNUSU5HX1JFU09VUkNFU19JRCA9ICJXaXphcmRaaXBGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMS5TVE9SRV9PVkVSV1JJVEVfRVhJU1RJTkdfUkVTT1VSQ0VTX0lEIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUT1JFX1NFTEVDVEVEX1RZUEVTX0lEID0gIldpemFyZFppcEZpbGVSZXNvdXJjZUltcG9ydFBhZ2UxLlNUT1JFX1NFTEVDVEVEX1RZUEVTX0lEIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICoJQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0gICAgICogQHBhcmFtIGFXb3JrYmVuY2ggSVdvcmtiZW5jaAotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gSVN0cnVjdHVyZWRTZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgV2l6YXJkQXJjaGl2ZUZpbGVSZXNvdXJjZUltcG9ydFBhZ2UxKElXb3JrYmVuY2ggYVdvcmtiZW5jaCwKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzdXBlcigiemlwRmlsZUltcG9ydFBhZ2UxIiwgYVdvcmtiZW5jaCwgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRUaXRsZShEYXRhVHJhbnNmZXJNZXNzYWdlcy5BcmNoaXZlRXhwb3J0X2V4cG9ydFRpdGxlKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oRGF0YVRyYW5zZmVyTWVzc2FnZXMuQXJjaGl2ZUltcG9ydF9kZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgQ2FuY2VsIGJ1dHRvbi4gUmV0dXJuIGEgYm9vbGVhbgotICAgICAqIGluZGljYXRpbmcgcGVybWlzc2lvbiB0byBjbG9zZSB0aGUgd2l6YXJkLgotICAgICAqCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2FuY2VsKCkgewotICAgICAgICBjbGVhclByb3ZpZGVyQ2FjaGUoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBjYWNoZWQgc3RydWN0dXJlIHByb3ZpZGVyIGFmdGVyIGZpcnN0IGZpbmFsaXppbmcKLSAgICAgKiBpdCBwcm9wZXJseS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhclByb3ZpZGVyQ2FjaGUoKSB7Ci0gICAgICAgIEFyY2hpdmVGaWxlTWFuaXB1bGF0aW9ucy5jbGVhclByb3ZpZGVyQ2FjaGUoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXR0ZW1wdHMgdG8gY2xvc2UgdGhlIHBhc3NlZCB6aXAgZmlsZSwgYW5kIGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjbG9zZVppcEZpbGUoWmlwRmlsZSBmaWxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaWxlLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGRpc3BsYXlFcnJvckRpYWxvZyhOTFMuYmluZChEYXRhVHJhbnNmZXJNZXNzYWdlcy5aaXBJbXBvcnRfY291bGROb3RDbG9zZSwgZmlsZS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLAotICAgICAgICAgICAgICAgIElEYXRhVHJhbnNmZXJIZWxwQ29udGV4dElkcy5aSVBfRklMRV9JTVBPUlRfV0laQVJEX1BBR0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUNyZWF0ZSB0aGUgb3B0aW9ucyBzcGVjaWZpY2F0aW9uIHdpZGdldHMuIFRoZXJlIGlzIG9ubHkgb25lCi0gICAgICogaW4gdGhpcyBjYXNlIHNvIGNyZWF0ZSBubyBncm91cC4KLSAgICAgKgotICAgICAqCUBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3B0aW9uc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICAvLyBvdmVyd3JpdGUuLi4gY2hlY2tib3gKLSAgICAgICAgb3ZlcndyaXRlRXhpc3RpbmdSZXNvdXJjZXNDaGVja2JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBvdmVyd3JpdGVFeGlzdGluZ1Jlc291cmNlc0NoZWNrYm94LnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUltcG9ydF9vdmVyd3JpdGVFeGlzdGluZyk7Ci0gICAgICAgIG92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3guc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVTb3VyY2VGaWxlKFN0cmluZyBmaWxlTmFtZSkgewotICAgIAlpZihBcmNoaXZlRmlsZU1hbmlwdWxhdGlvbnMuaXNUYXJGaWxlKGZpbGVOYW1lKSkgewotICAgIAkJVGFyRmlsZSB0YXJGaWxlID0gZ2V0U3BlY2lmaWVkVGFyU291cmNlRmlsZShmaWxlTmFtZSk7Ci0gICAgCQlyZXR1cm4gKHRhckZpbGUgIT0gbnVsbCk7Ci0gICAgCX0KLSAgICAJWmlwRmlsZSB6aXBGaWxlID0gZ2V0U3BlY2lmaWVkWmlwU291cmNlRmlsZShmaWxlTmFtZSk7Ci0gICAgCWlmKHppcEZpbGUgIT0gbnVsbCkgewotICAgIAkJQXJjaGl2ZUZpbGVNYW5pcHVsYXRpb25zLmNsb3NlWmlwRmlsZSh6aXBGaWxlLCBnZXRDb250YWluZXIoKQotCQkJCQkuZ2V0U2hlbGwoKSk7Ci0gICAgCQlyZXR1cm4gdHJ1ZTsKLSAgICAJfQotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzb3VyY2UgY3VycmVudGx5IGV4aXN0cwotICAgICAqCWFuZCBpcyB2YWxpZCAoaWUuLSBwcm9wZXIgZm9ybWF0KQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBlbnN1cmVaaXBTb3VyY2VJc1ZhbGlkKCkgewotICAgICAgICBaaXBGaWxlIHNwZWNpZmllZEZpbGUgPSBnZXRTcGVjaWZpZWRaaXBTb3VyY2VGaWxlKCk7Ci0gICAgICAgIGlmIChzcGVjaWZpZWRGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQXJjaGl2ZUZpbGVNYW5pcHVsYXRpb25zLmNsb3NlWmlwRmlsZShzcGVjaWZpZWRGaWxlLAotCQkJCWdldENvbnRhaW5lcigpLmdldFNoZWxsKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBlbnN1cmVUYXJTb3VyY2VJc1ZhbGlkKCkgewotICAgIAlUYXJGaWxlIHNwZWNpZmllZEZpbGUgPSBnZXRTcGVjaWZpZWRUYXJTb3VyY2VGaWxlKCk7Ci0gICAgCWlmKCBzcGVjaWZpZWRGaWxlID09IG51bGwgKSB7Ci0gICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzb3VyY2UgY3VycmVudGx5IGV4aXN0cwotICAgICAqCWFuZCBpcyB2YWxpZCAoaWUuLSBwcm9wZXIgZm9ybWF0KQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGVuc3VyZVNvdXJjZUlzVmFsaWQoKSB7Ci0gICAgCWlmIChBcmNoaXZlRmlsZU1hbmlwdWxhdGlvbnMuaXNUYXJGaWxlKHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpKSB7Ci0gICAgCQlyZXR1cm4gZW5zdXJlVGFyU291cmNlSXNWYWxpZCgpOwotICAgIAl9Ci0gICAgCXJldHVybiBlbnN1cmVaaXBTb3VyY2VJc1ZhbGlkKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBGaW5pc2ggYnV0dG9uIHdhcyBwcmVzc2VkLiAgVHJ5IHRvIGRvIHRoZSByZXF1aXJlZCB3b3JrIG5vdyBhbmQgYW5zd2VyCi0gICAgICogYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4gIElmIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZCB0aGVuIHRoZQotICAgICAqIHdpemFyZCB3aWxsIG5vdCBjbG9zZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGZpbmlzaCgpIHsKLSAgICAgICAgaWYgKCFzdXBlci5maW5pc2goKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBBcmNoaXZlRmlsZU1hbmlwdWxhdGlvbnMuY2xlYXJQcm92aWRlckNhY2hlKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29udGVudCBwcm92aWRlciBmb3IgPGNvZGU+RmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+cyB0aGF0IHJldHVybnMgCi0gICAgICogb25seSBmaWxlcyBhcyBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0RmlsZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZWxlbWVudCA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgbzsKLSAgICAgICAgICAgICAgICAgICAgQWRhcHRhYmxlTGlzdCBsOwotICAgICAgICAgICAgICAgICAgICBpZih6aXBDdXJyZW50UHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAJbCA9IGVsZW1lbnQuZ2V0RmlsZXMoemlwQ3VycmVudFByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgCWwgPSBlbGVtZW50LmdldEZpbGVzKHRhckN1cnJlbnRQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgcm9vdCBGaWxlU3lzdGVtRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIHRoZQotICAgICAqCWN1cnJlbnRseS1zcGVjaWZpZWQgLnppcCBmaWxlLiAgSWYgdGhpcyBGaWxlU3lzdGVtRWxlbWVudCBpcyBub3QKLSAgICAgKgljdXJyZW50bHkgZGVmaW5lZCB0aGVuIGNyZWF0ZSBhbmQgcmV0dXJuIGl0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBnZXRGaWxlU3lzdGVtVHJlZSgpIHsKLSAgICAJaWYoQXJjaGl2ZUZpbGVNYW5pcHVsYXRpb25zLmlzVGFyRmlsZShzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpKSkgeyAgICAJCQotICAgICAgICAJVGFyRmlsZSBzb3VyY2VUYXJGaWxlID0gZ2V0U3BlY2lmaWVkVGFyU291cmNlRmlsZSgpOwotICAgICAgICAJaWYgKHNvdXJjZVRhckZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vQ2xlYXIgb3V0IHRoZSBwcm92aWRlciBhcyB3ZWxsCi0gICAgICAgICAgICAgICAgdGhpcy56aXBDdXJyZW50UHJvdmlkZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIHRoaXMudGFyQ3VycmVudFByb3ZpZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgCX0KLQkKLSAgICAgICAgICAgIFRhckxldmVsZWRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlciA9IEFyY2hpdmVGaWxlTWFuaXB1bGF0aW9ucwotCQkJCQkuZ2V0VGFyU3RydWN0dXJlUHJvdmlkZXIoc291cmNlVGFyRmlsZSwgZ2V0Q29udGFpbmVyKCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICB0aGlzLnRhckN1cnJlbnRQcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgdGhpcy56aXBDdXJyZW50UHJvdmlkZXIgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEZpbGVzKHByb3ZpZGVyLmdldFJvb3QoKSwgcHJvdmlkZXIpOwotICAgIAl9Ci0KLSAgICAgICAgWmlwRmlsZSBzb3VyY2VGaWxlID0gZ2V0U3BlY2lmaWVkWmlwU291cmNlRmlsZSgpOwotICAgICAgICBpZiAoc291cmNlRmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvL0NsZWFyIG91dCB0aGUgcHJvdmlkZXIgYXMgd2VsbAotICAgICAgICAgICAgdGhpcy56aXBDdXJyZW50UHJvdmlkZXIgPSBudWxsOwotICAgICAgICAgICAgdGhpcy50YXJDdXJyZW50UHJvdmlkZXIgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBaaXBMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIgPSBBcmNoaXZlRmlsZU1hbmlwdWxhdGlvbnMKLQkJCQkuZ2V0WmlwU3RydWN0dXJlUHJvdmlkZXIoc291cmNlRmlsZSwgZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIHRoaXMuemlwQ3VycmVudFByb3ZpZGVyID0gcHJvdmlkZXI7Ci0gICAgICAgIHRoaXMudGFyQ3VycmVudFByb3ZpZGVyID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHNlbGVjdEZpbGVzKHByb3ZpZGVyLmdldFJvb3QoKSwgcHJvdmlkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb250ZW50IHByb3ZpZGVyIGZvciA8Y29kZT5GaWxlU3lzdGVtRWxlbWVudDwvY29kZT5zIHRoYXQgcmV0dXJucyAKLSAgICAgKiBvbmx5IGZvbGRlcnMgYXMgY2hpbGRyZW4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGdldEZvbGRlclByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZWxlbWVudCA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgbzsKLSAgICAgICAgICAgICAgICAgICAgQWRhcHRhYmxlTGlzdCBsOwotICAgICAgICAgICAgICAgICAgICBpZih6aXBDdXJyZW50UHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAJbCA9IGVsZW1lbnQuZ2V0Rm9sZGVycyh6aXBDdXJyZW50UHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAJbCA9IGVsZW1lbnQuZ2V0Rm9sZGVycyh0YXJDdXJyZW50UHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBsLmdldENoaWxkcmVuKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG8pIHsKLSAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGVsZW1lbnQgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIG87Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmlzUG9wdWxhdGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQotICAgICAgICAgICAgICAgICAgICAvL0lmIHdlIGhhdmUgbm90IHBvcHVsYXRlZCB0aGVuIHdhaXQgdW50aWwgYXNrZWQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgdGhlIHN0cmluZyB0byBkaXNwbGF5IGFzIHRoZSBsYWJlbCBmb3IgdGhlIHNvdXJjZSBzcGVjaWZpY2F0aW9uIGZpZWxkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VMYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIERhdGFUcmFuc2Zlck1lc3NhZ2VzLkFyY2hpdmVJbXBvcnRfZnJvbUZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIGEgaGFuZGxlIHRvIHRoZSB6aXAgZmlsZSBjdXJyZW50bHkgc3BlY2lmaWVkIGFzIGJlaW5nIHRoZSBzb3VyY2UuCi0gICAgICoJUmV0dXJuIG51bGwgaWYgdGhpcyBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBvZiB2YWxpZCBmb3JtYXQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFppcEZpbGUgZ2V0U3BlY2lmaWVkWmlwU291cmNlRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNwZWNpZmllZFppcFNvdXJjZUZpbGUoc291cmNlTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIGEgaGFuZGxlIHRvIHRoZSB6aXAgZmlsZSBjdXJyZW50bHkgc3BlY2lmaWVkIGFzIGJlaW5nIHRoZSBzb3VyY2UuCi0gICAgICoJUmV0dXJuIG51bGwgaWYgdGhpcyBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBvZiB2YWxpZCBmb3JtYXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBaaXBGaWxlIGdldFNwZWNpZmllZFppcFNvdXJjZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIGlmIChmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgWmlwRmlsZShmaWxlTmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBkaXNwbGF5RXJyb3JEaWFsb2coRGF0YVRyYW5zZmVyTWVzc2FnZXMuWmlwSW1wb3J0X2JhZEZvcm1hdCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGRpc3BsYXlFcnJvckRpYWxvZyhEYXRhVHJhbnNmZXJNZXNzYWdlcy5aaXBJbXBvcnRfY291bGROb3RSZWFkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNvdXJjZU5hbWVGaWVsZC5zZXRGb2N1cygpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgYSBoYW5kbGUgdG8gdGhlIHppcCBmaWxlIGN1cnJlbnRseSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIHNvdXJjZS4KLSAgICAgKglSZXR1cm4gbnVsbCBpZiB0aGlzIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IG9mIHZhbGlkIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGFyRmlsZSBnZXRTcGVjaWZpZWRUYXJTb3VyY2VGaWxlKCkgewotICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWVkVGFyU291cmNlRmlsZShzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgYSBoYW5kbGUgdG8gdGhlIHppcCBmaWxlIGN1cnJlbnRseSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIHNvdXJjZS4KLSAgICAgKglSZXR1cm4gbnVsbCBpZiB0aGlzIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IG9mIHZhbGlkIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRhckZpbGUgZ2V0U3BlY2lmaWVkVGFyU291cmNlRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgaWYgKGZpbGVOYW1lLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBUYXJGaWxlKGZpbGVOYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoVGFyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCWRpc3BsYXlFcnJvckRpYWxvZyhEYXRhVHJhbnNmZXJNZXNzYWdlcy5UYXJJbXBvcnRfYmFkRm9ybWF0KTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZGlzcGxheUVycm9yRGlhbG9nKERhdGFUcmFuc2Zlck1lc3NhZ2VzLlppcEltcG9ydF9jb3VsZE5vdFJlYWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgc291cmNlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCU9wZW4gYSBGaWxlRGlhbG9nIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNwZWNpZnkgdGhlIHNvdXJjZQotICAgICAqCWZpbGUgdG8gaW1wb3J0IGZyb20KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTb3VyY2VCcm93c2VCdXR0b25QcmVzc2VkKCkgewotICAgICAgICBTdHJpbmcgc2VsZWN0ZWRGaWxlID0gcXVlcnlaaXBGaWxlVG9JbXBvcnQoKTsKLQotICAgICAgICBpZiAoc2VsZWN0ZWRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vQmUgc3VyZSBpdCBpcyB2YWxpZCBiZWZvcmUgd2UgZ28gc2V0dGluZyBhbnkgbmFtZXMKLSAgICAgICAgICAgIGlmICghc2VsZWN0ZWRGaWxlLmVxdWFscyhzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpKQotCQkJCQkmJiB2YWxpZGF0ZVNvdXJjZUZpbGUoc2VsZWN0ZWRGaWxlKSkgewotICAgICAgICAgICAgICAgIHNldFNvdXJjZU5hbWUoc2VsZWN0ZWRGaWxlKTsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25Hcm91cC5zZXRGb2N1cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEltcG9ydCB0aGUgcmVzb3VyY2VzIHdpdGggZXh0ZW5zaW9ucyBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbXBvcnRSZXNvdXJjZXMoTGlzdCBmaWxlU3lzdGVtT2JqZWN0cykgewotICAgIAlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgCWlmIChBcmNoaXZlRmlsZU1hbmlwdWxhdGlvbnMuaXNUYXJGaWxlKHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpKSB7Ci0gICAgCQlpZiggZW5zdXJlVGFyU291cmNlSXNWYWxpZCgpKSB7Ci0JICAgIAkJVGFyRmlsZSB0YXJGaWxlID0gZ2V0U3BlY2lmaWVkVGFyU291cmNlRmlsZSgpOwotCSAgICAJCVRhckxldmVsZWRTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IEFyY2hpdmVGaWxlTWFuaXB1bGF0aW9ucwotCQkJCQkJLmdldFRhclN0cnVjdHVyZVByb3ZpZGVyKHRhckZpbGUsIGdldENvbnRhaW5lcigpCi0JCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkgICAgCQlJbXBvcnRPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEltcG9ydE9wZXJhdGlvbihnZXRDb250YWluZXJGdWxsUGF0aCgpLAotCSAgICAJCQkJc3RydWN0dXJlUHJvdmlkZXIuZ2V0Um9vdCgpLCBzdHJ1Y3R1cmVQcm92aWRlciwgdGhpcywKLQkJCQkJCWZpbGVTeXN0ZW1PYmplY3RzKTsKLQkKLQkgICAgCQlvcGVyYXRpb24uc2V0Q29udGV4dChnZXRTaGVsbCgpKTsKLQkgICAgCQlyZXR1cm4gZXhlY3V0ZUltcG9ydE9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgIAkJfQotICAgIAl9Ci0KLSAgICAJaWYoZW5zdXJlWmlwU291cmNlSXNWYWxpZCgpKSB7Ci0gICAgCQlaaXBGaWxlIHppcEZpbGUgPSBnZXRTcGVjaWZpZWRaaXBTb3VyY2VGaWxlKCk7Ci0gICAgICAgICAgICBaaXBMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIgPSBBcmNoaXZlRmlsZU1hbmlwdWxhdGlvbnMKLQkJCQkJLmdldFppcFN0cnVjdHVyZVByb3ZpZGVyKHppcEZpbGUsIGdldENvbnRhaW5lcigpLmdldFNoZWxsKCkpOwotCQkJSW1wb3J0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBJbXBvcnRPcGVyYXRpb24oCi0JCQkJCWdldENvbnRhaW5lckZ1bGxQYXRoKCksIHN0cnVjdHVyZVByb3ZpZGVyLmdldFJvb3QoKSwKLQkJCQkJc3RydWN0dXJlUHJvdmlkZXIsIHRoaXMsIGZpbGVTeXN0ZW1PYmplY3RzKTsKLQotICAgIAkJb3BlcmF0aW9uLnNldENvbnRleHQoZ2V0U2hlbGwoKSk7Ci0gICAgCQlyZXN1bHQgPSBleGVjdXRlSW1wb3J0T3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0KLSAgICAJCWNsb3NlWmlwRmlsZSh6aXBGaWxlKTsKLSAgICAJfQotICAgIAlyZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9wZXJhdGlvbihJbXBvcnRPcGVyYXRpb24gb3ApIHsKLSAgICAgICAgb3Auc2V0T3ZlcndyaXRlUmVzb3VyY2VzKG92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3gKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nIGFuZCByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUKLSAgICAgKiBzZWxlY3RlZCBmaWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGlhbG9nIHdhcyBjYW5jZWxlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5WmlwRmlsZVRvSW1wb3J0KCkgewotICAgICAgICBGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNvdXJjZU5hbWVGaWVsZC5nZXRTaGVsbCgpLCBTV1QuT1BFTik7Ci0gICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKEZJTEVfSU1QT1JUX01BU0spOwotICAgICAgICBkaWFsb2cuc2V0VGV4dChEYXRhVHJhbnNmZXJNZXNzYWdlcy5BcmNoaXZlSW1wb3J0U291cmNlX3RpdGxlKTsKLQotICAgICAgICBTdHJpbmcgY3VycmVudFNvdXJjZVN0cmluZyA9IHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICAgIGludCBsYXN0U2VwYXJhdG9ySW5kZXggPSBjdXJyZW50U291cmNlU3RyaW5nCi0gICAgICAgICAgICAgICAgLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgICAgaWYgKGxhc3RTZXBhcmF0b3JJbmRleCAhPSAtMSkKLSAgICAgICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJQYXRoKGN1cnJlbnRTb3VyY2VTdHJpbmcuc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgICAgIGxhc3RTZXBhcmF0b3JJbmRleCkpOwotCi0gICAgICAgIHJldHVybiBkaWFsb2cub3BlbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCVJlcG9wdWxhdGUgdGhlIHZpZXcgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBlbnRlcmVkIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNldFNlbGVjdGlvbigpIHsKLQotICAgICAgICBzdXBlci5yZXNldFNlbGVjdGlvbigpOwotICAgICAgICBzZXRBbGxTZWxlY3Rpb25zKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCVVzZSB0aGUgZGlhbG9nIHN0b3JlIHRvIHJlc3RvcmUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgdmFsdWVzIHRoYXQgdGhleSBoZWxkCi0gICAgICoJbGFzdCB0aW1lIHRoaXMgd2l6YXJkIHdhcyB1c2VkIHRvIGNvbXBsZXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nW10gc291cmNlTmFtZXMgPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9TT1VSQ0VfTkFNRVNfSUQpOwotICAgICAgICAgICAgaWYgKHNvdXJjZU5hbWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBpZS4tIG5vIHNldHRpbmdzIHN0b3JlZAotCi0gICAgICAgICAgICAvLyBzZXQgZmlsZW5hbWVzIGhpc3RvcnkKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgc291cmNlTmFtZUZpZWxkLmFkZChzb3VyY2VOYW1lc1tpXSk7Ci0KLSAgICAgICAgICAgIC8vIHJhZGlvIGJ1dHRvbnMgYW5kIGNoZWNrYm94ZXMJCi0gICAgICAgICAgICBvdmVyd3JpdGVFeGlzdGluZ1Jlc291cmNlc0NoZWNrYm94LnNldFNlbGVjdGlvbihzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAuZ2V0Qm9vbGVhbihTVE9SRV9PVkVSV1JJVEVfRVhJU1RJTkdfUkVTT1VSQ0VTX0lEKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAJU2luY2UgRmluaXNoIHdhcyBwcmVzc2VkLCB3cml0ZSB3aWRnZXQgdmFsdWVzIHRvIHRoZSBkaWFsb2cgc3RvcmUgc28gdGhhdCB0aGV5Ci0gICAgICoJd2lsbCBwZXJzaXN0IGludG8gdGhlIG5leHQgaW52b2NhdGlvbiBvZiB0aGlzIHdpemFyZCBwYWdlLgotICAgICAqCi0gICAgICoJTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIGlkZW50aWNhbCB0byB0aGUgb25lIHRoYXQgYXBwZWFycyBpbiB0aGUgc3VwZXJjbGFzcy4KLSAgICAgKglUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHByb3BlciBvdmVycmlkaW5nIG9mIGluc3RhbmNlIHZhcmlhYmxlcyBpcyBub3Qgb2NjdXJyaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNhdmVXaWRnZXRWYWx1ZXMoKSB7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB1cGRhdGUgc291cmNlIG5hbWVzIGhpc3RvcnkKLSAgICAgICAgICAgIFN0cmluZ1tdIHNvdXJjZU5hbWVzID0gc2V0dGluZ3MuZ2V0QXJyYXkoU1RPUkVfU09VUkNFX05BTUVTX0lEKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1swXTsKLQotICAgICAgICAgICAgc291cmNlTmFtZXMgPSBhZGRUb0hpc3Rvcnkoc291cmNlTmFtZXMsIHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgc2V0dGluZ3MucHV0KFNUT1JFX1NPVVJDRV9OQU1FU19JRCwgc291cmNlTmFtZXMpOwotCi0gICAgICAgICAgICAvLyB1cGRhdGUgc3BlY2lmaWMgdHlwZXMgdG8gaW1wb3J0IGhpc3RvcnkKLSAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGVkVHlwZXNOYW1lcyA9IHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBcnJheShTVE9SRV9TRUxFQ1RFRF9UWVBFU19JRCk7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0ZWRUeXBlc05hbWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlc05hbWVzID0gbmV3IFN0cmluZ1swXTsKLQotICAgICAgICAgICAgc2V0dGluZ3MucHV0KFNUT1JFX09WRVJXUklURV9FWElTVElOR19SRVNPVVJDRVNfSUQsCi0gICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgc2VsZidzIHNvdXJjZSBzcGVjaWZpY2F0aW9uCi0gICAgICoJd2lkZ2V0cyBjdXJyZW50bHkgYWxsIGNvbnRhaW4gdmFsaWQgdmFsdWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU291cmNlR3JvdXAoKSB7Ci0KLSAgICAgICAgLy9JZiB0aGVyZSBpcyBub3RoaW5nIGJlaW5nIHByb3ZpZGVkIHRvIHRoZSBpbnB1dCB0aGVuIHRoZXJlIGlzIGEgcHJvYmxlbQotICAgICAgICBpZiAodGhpcy56aXBDdXJyZW50UHJvdmlkZXIgPT0gbnVsbCAmJiB0aGlzLnRhckN1cnJlbnRQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKFNPVVJDRV9FTVBUWV9NRVNTQUdFKTsKLSAgICAgICAgICAgIGVuYWJsZUJ1dHRvbkdyb3VwKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIExpc3QgcmVzb3VyY2VzVG9FeHBvcnQgPSBzZWxlY3Rpb25Hcm91cC5nZXRBbGxXaGl0ZUNoZWNrZWRJdGVtcygpOwotICAgICAgICBpZiAocmVzb3VyY2VzVG9FeHBvcnQuc2l6ZSgpID09IDApewotICAgICAgICAJc2V0RXJyb3JNZXNzYWdlKERhdGFUcmFuc2Zlck1lc3NhZ2VzLkZpbGVJbXBvcnRfbm9uZVNlbGVjdGVkKTsKLSAgICAgICAgCXJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZW5hYmxlQnV0dG9uR3JvdXAodHJ1ZSk7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL1dpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUV4cG9ydFBhZ2UxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlRXhwb3J0UGFnZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE4YWRmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlRXhwb3J0UGFnZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkRXhwb3J0UmVzb3VyY2VzUGFnZTsKLQotCi0vKioKLSAqCVBhZ2UgMSBvZiB0aGUgYmFzZSByZXNvdXJjZSBleHBvcnQtdG8tZmlsZS1zeXN0ZW0gV2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VFeHBvcnRQYWdlMSBleHRlbmRzCi0gICAgICAgIFdpemFyZEV4cG9ydFJlc291cmNlc1BhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLSAgICAvLyB3aWRnZXRzCi0gICAgcHJpdmF0ZSBDb21ibyBkZXN0aW5hdGlvbk5hbWVGaWVsZDsKLQotICAgIHByaXZhdGUgQnV0dG9uIGRlc3RpbmF0aW9uQnJvd3NlQnV0dG9uOwotCi0gICAgcHJvdGVjdGVkIEJ1dHRvbiBvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3g7Ci0KLSAgICBwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZUJ1dHRvbjsKLQotICAgIHByb3RlY3RlZCBCdXR0b24gY3JlYXRlU2VsZWN0aW9uT25seUJ1dHRvbjsKLQotICAgIC8vIGRpYWxvZyBzdG9yZSBpZCBjb25zdGFudHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkVfREVTVElOQVRJT05fTkFNRVNfSUQgPSAiV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlRXhwb3J0UGFnZTEuU1RPUkVfREVTVElOQVRJT05fTkFNRVNfSUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkVfT1ZFUldSSVRFX0VYSVNUSU5HX0ZJTEVTX0lEID0gIldpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUV4cG9ydFBhZ2UxLlNUT1JFX09WRVJXUklURV9FWElTVElOR19GSUxFU19JRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9DUkVBVEVfU1RSVUNUVVJFX0lEID0gIldpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUV4cG9ydFBhZ2UxLlNUT1JFX0NSRUFURV9TVFJVQ1RVUkVfSUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvL21lc3NhZ2VzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9ERVNUSU5BVElPTl9NRVNTQUdFID0gRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUV4cG9ydF9zZWxlY3REZXN0aW5hdGlvbk1lc3NhZ2U7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX0RFU1RJTkFUSU9OX1RJVExFID0gRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUV4cG9ydF9zZWxlY3REZXN0aW5hdGlvblRpdGxlOwotCi0gICAgLyoqCi0gICAgICoJQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlRXhwb3J0UGFnZTEoU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIobmFtZSwgc2VsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIHNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VFeHBvcnRQYWdlMShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcygiZmlsZVN5c3RlbUV4cG9ydFBhZ2UxIiwgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRUaXRsZShEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfZmlsZVN5c3RlbVRpdGxlKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUV4cG9ydF9leHBvcnRMb2NhbEZpbGVTeXN0ZW0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFkZCB0aGUgcGFzc2VkIHZhbHVlIHRvIHNlbGYncyBkZXN0aW5hdGlvbiB3aWRnZXQncyBoaXN0b3J5Ci0gICAgICoKLSAgICAgKglAcGFyYW0gdmFsdWUgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZERlc3RpbmF0aW9uSXRlbShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgZGVzdGluYXRpb25OYW1lRmllbGQuYWRkKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgICAgICBnaXZlRm9jdXNUb0Rlc3RpbmF0aW9uKCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLAotICAgICAgICAgICAgICAgIElEYXRhVHJhbnNmZXJIZWxwQ29udGV4dElkcy5GSUxFX1NZU1RFTV9FWFBPUlRfV0laQVJEX1BBR0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUNyZWF0ZSB0aGUgZXhwb3J0IGRlc3RpbmF0aW9uIHNwZWNpZmljYXRpb24gd2lkZ2V0cwotICAgICAqCi0gICAgICoJQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXN0aW5hdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICBGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotICAgICAgICAvLyBkZXN0aW5hdGlvbiBzcGVjaWZpY2F0aW9uIGdyb3VwCi0gICAgICAgIENvbXBvc2l0ZSBkZXN0aW5hdGlvblNlbGVjdGlvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgICAgIGRlc3RpbmF0aW9uU2VsZWN0aW9uR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGRlc3RpbmF0aW9uU2VsZWN0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotICAgICAgICBkZXN0aW5hdGlvblNlbGVjdGlvbkdyb3VwLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgTGFiZWwgZGVzdGluYXRpb25MYWJlbCA9IG5ldyBMYWJlbChkZXN0aW5hdGlvblNlbGVjdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGRlc3RpbmF0aW9uTGFiZWwuc2V0VGV4dChnZXREZXN0aW5hdGlvbkxhYmVsKCkpOwotICAgICAgICBkZXN0aW5hdGlvbkxhYmVsLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgLy8gZGVzdGluYXRpb24gbmFtZSBlbnRyeSBmaWVsZAotICAgICAgICBkZXN0aW5hdGlvbk5hbWVGaWVsZCA9IG5ldyBDb21ibyhkZXN0aW5hdGlvblNlbGVjdGlvbkdyb3VwLCBTV1QuU0lOR0xFCi0gICAgICAgICAgICAgICAgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgZGVzdGluYXRpb25OYW1lRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gICAgICAgIGRlc3RpbmF0aW9uTmFtZUZpZWxkLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLSAgICAgICAgZGVzdGluYXRpb25OYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgZGVzdGluYXRpb25OYW1lRmllbGQuc2V0Rm9udChmb250KTsKLQotICAgICAgICAvLyBkZXN0aW5hdGlvbiBicm93c2UgYnV0dG9uCi0gICAgICAgIGRlc3RpbmF0aW9uQnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihkZXN0aW5hdGlvblNlbGVjdGlvbkdyb3VwLAotICAgICAgICAgICAgICAgIFNXVC5QVVNIKTsKLSAgICAgICAgZGVzdGluYXRpb25Ccm93c2VCdXR0b24uc2V0VGV4dChEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfYnJvd3NlKTsKLSAgICAgICAgZGVzdGluYXRpb25Ccm93c2VCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgICAgIGRlc3RpbmF0aW9uQnJvd3NlQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIHNldEJ1dHRvbkxheW91dERhdGEoZGVzdGluYXRpb25Ccm93c2VCdXR0b24pOwotCi0gICAgICAgIG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsgLy8gdmVydGljYWwgc3BhY2VyCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBidXR0b25zIGluIHRoZSBvcHRpb25zIGdyb3VwLgotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3B0aW9uc0dyb3VwQnV0dG9ucyhHcm91cCBvcHRpb25zR3JvdXApIHsKLQotICAgICAgICBGb250IGZvbnQgPSBvcHRpb25zR3JvdXAuZ2V0Rm9udCgpOwotICAgICAgICBjcmVhdGVPdmVyd3JpdGVFeGlzdGluZyhvcHRpb25zR3JvdXAsIGZvbnQpOwotCi0gICAgICAgIGNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZU9wdGlvbnMob3B0aW9uc0dyb3VwLCBmb250KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGJ1dHRvbnMgZm9yIHRoZSBncm91cCB0aGF0IGRldGVybWluZSBpZiB0aGUgZW50aXJlIG9yCi0gICAgICogc2VsZWN0ZWQgZGlyZWN0b3J5IHN0cnVjdHVyZSBzaG91bGQgYmUgY3JlYXRlZC4KLSAgICAgKiBAcGFyYW0gb3B0aW9uc0dyb3VwCi0gICAgICogQHBhcmFtIGZvbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEaXJlY3RvcnlTdHJ1Y3R1cmVPcHRpb25zKENvbXBvc2l0ZSBvcHRpb25zR3JvdXAsIEZvbnQgZm9udCkgewotICAgICAgICAvLyBjcmVhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZSByYWRpb3MKLSAgICAgICAgY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlQnV0dG9uID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5SQURJTwotICAgICAgICAgICAgICAgIHwgU1dULkxFRlQpOwotICAgICAgICBjcmVhdGVEaXJlY3RvcnlTdHJ1Y3R1cmVCdXR0b24uc2V0VGV4dChEYXRhVHJhbnNmZXJNZXNzYWdlcy5GaWxlRXhwb3J0X2NyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZSk7Ci0gICAgICAgIGNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICBjcmVhdGVEaXJlY3RvcnlTdHJ1Y3R1cmVCdXR0b24uc2V0Rm9udChmb250KTsKLQotICAgICAgICAvLyBjcmVhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZSByYWRpb3MKLSAgICAgICAgY3JlYXRlU2VsZWN0aW9uT25seUJ1dHRvbiA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuUkFESU8KLSAgICAgICAgICAgICAgICB8IFNXVC5MRUZUKTsKLSAgICAgICAgY3JlYXRlU2VsZWN0aW9uT25seUJ1dHRvbi5zZXRUZXh0KERhdGFUcmFuc2Zlck1lc3NhZ2VzLkZpbGVFeHBvcnRfY3JlYXRlU2VsZWN0ZWREaXJlY3Rvcmllcyk7Ci0gICAgICAgIGNyZWF0ZVNlbGVjdGlvbk9ubHlCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICBjcmVhdGVTZWxlY3Rpb25Pbmx5QnV0dG9uLnNldEZvbnQoZm9udCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBidXR0b24gZm9yIGNoZWNraW5nIGlmIHdlIHNob3VsZCBhc2sgaWYgd2UgYXJlIGdvaW5nIHRvCi0gICAgICogb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzLgotICAgICAqIEBwYXJhbSBvcHRpb25zR3JvdXAKLSAgICAgKiBAcGFyYW0gZm9udAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU92ZXJ3cml0ZUV4aXN0aW5nKEdyb3VwIG9wdGlvbnNHcm91cCwgRm9udCBmb250KSB7Ci0gICAgICAgIC8vIG92ZXJ3cml0ZS4uLiBjaGVja2JveAotICAgICAgICBvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3ggPSBuZXcgQnV0dG9uKG9wdGlvbnNHcm91cCwgU1dULkNIRUNLCi0gICAgICAgICAgICAgICAgfCBTV1QuTEVGVCk7Ci0gICAgICAgIG92ZXJ3cml0ZUV4aXN0aW5nRmlsZXNDaGVja2JveC5zZXRUZXh0KERhdGFUcmFuc2Zlck1lc3NhZ2VzLkV4cG9ydEZpbGVfb3ZlcndyaXRlRXhpc3RpbmcpOwotICAgICAgICBvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3guc2V0Rm9udChmb250KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdHRlbXB0cyB0byBlbnN1cmUgdGhhdCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBleGlzdHMgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotICAgICAqIEFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqIEBwYXJhbSBkaXJlY3RvcnkgamF2YS5pby5GaWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5zdXJlRGlyZWN0b3J5RXhpc3RzKEZpbGUgZGlyZWN0b3J5KSB7Ci0gICAgICAgIGlmICghZGlyZWN0b3J5LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBpZiAoIXF1ZXJ5WWVzTm9RdWVzdGlvbihEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfY3JlYXRlVGFyZ2V0RGlyZWN0b3J5KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmICghZGlyZWN0b3J5Lm1rZGlycygpKSB7Ci0gICAgICAgICAgICAgICAgZGlzcGxheUVycm9yRGlhbG9nKERhdGFUcmFuc2Zlck1lc3NhZ2VzLkRhdGFUcmFuc2Zlcl9kaXJlY3RvcnlDcmVhdGlvbkVycm9yKTsKLSAgICAgICAgICAgICAgICBnaXZlRm9jdXNUb0Rlc3RpbmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJSWYgdGhlIHRhcmdldCBmb3IgZXhwb3J0IGRvZXMgbm90IGV4aXN0IHRoZW4gYXR0ZW1wdCB0byBjcmVhdGUgaXQuCi0gICAgICoJQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBleGlzdHMgKGllLi0gaWYgaXQKLSAgICAgKgllaXRoZXIgcHJlLWV4aXN0ZWQgb3IgdGhpcyBtZXRob2Qgd2FzIGFibGUgdG8gY3JlYXRlIGl0KQotICAgICAqCi0gICAgICoJQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5zdXJlVGFyZ2V0SXNWYWxpZChGaWxlIHRhcmdldERpcmVjdG9yeSkgewotICAgICAgICBpZiAodGFyZ2V0RGlyZWN0b3J5LmV4aXN0cygpICYmICF0YXJnZXREaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgZGlzcGxheUVycm9yRGlhbG9nKERhdGFUcmFuc2Zlck1lc3NhZ2VzLkZpbGVFeHBvcnRfZGlyZWN0b3J5RXhpc3RzKTsKLSAgICAgICAgICAgIGdpdmVGb2N1c1RvRGVzdGluYXRpb24oKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbnN1cmVEaXJlY3RvcnlFeGlzdHModGFyZ2V0RGlyZWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0IHVwIGFuZCBleGVjdXRlIHRoZSBwYXNzZWQgT3BlcmF0aW9uLiAgQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZUV4cG9ydE9wZXJhdGlvbihGaWxlU3lzdGVtRXhwb3J0T3BlcmF0aW9uIG9wKSB7Ci0gICAgICAgIG9wLnNldENyZWF0ZUxlYWR1cFN0cnVjdHVyZShjcmVhdGVEaXJlY3RvcnlTdHJ1Y3R1cmVCdXR0b24KLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBvcC5zZXRPdmVyd3JpdGVGaWxlcyhvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZGlzcGxheUVycm9yRGlhbG9nKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBvcC5nZXRTdGF0dXMoKTsKLSAgICAgICAgaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0gICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgRGF0YVRyYW5zZmVyTWVzc2FnZXMuRGF0YVRyYW5zZmVyX2V4cG9ydFByb2JsZW1zLAotICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBubyBzcGVjaWFsIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCVRoZSBGaW5pc2ggYnV0dG9uIHdhcyBwcmVzc2VkLiAgVHJ5IHRvIGRvIHRoZSByZXF1aXJlZCB3b3JrIG5vdyBhbmQgYW5zd2VyCi0gICAgICoJYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4gIElmIGZhbHNlIGlzIHJldHVybmVkIHRoZW4gdGhlIHdpemFyZCB3aWxsCi0gICAgICoJbm90IGNsb3NlLgotICAgICAqCi0gICAgICoJQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZmluaXNoKCkgewotICAgICAgICBMaXN0IHJlc291cmNlc1RvRXhwb3J0ID0gZ2V0V2hpdGVDaGVja2VkUmVzb3VyY2VzKCk7Ci0gICAgICAgIGlmICghZW5zdXJlVGFyZ2V0SXNWYWxpZChuZXcgRmlsZShnZXREZXN0aW5hdGlvblZhbHVlKCkpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotCi0gICAgICAgIC8vU2F2ZSBkaXJ0eSBlZGl0b3JzIGlmIHBvc3NpYmxlIGJ1dCBkbyBub3Qgc3RvcCBpZiBub3QgYWxsIGFyZSBzYXZlZAotICAgICAgICBzYXZlRGlydHlFZGl0b3JzKCk7Ci0gICAgICAgIC8vIGFib3V0IHRvIGludm9rZSB0aGUgb3BlcmF0aW9uIHNvIHNhdmUgb3VyIHN0YXRlCi0gICAgICAgIHNhdmVXaWRnZXRWYWx1ZXMoKTsKLQotICAgICAgICByZXR1cm4gZXhlY3V0ZUV4cG9ydE9wZXJhdGlvbihuZXcgRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbihudWxsLAotICAgICAgICAgICAgICAgIHJlc291cmNlc1RvRXhwb3J0LCBnZXREZXN0aW5hdGlvblZhbHVlKCksIHRoaXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgdGhlIHN0cmluZyB0byBkaXNwbGF5IGluIHNlbGYgYXMgdGhlIGRlc3RpbmF0aW9uIHR5cGUKLSAgICAgKgotICAgICAqCUByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzdGluYXRpb25MYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIERhdGFUcmFuc2Zlck1lc3NhZ2VzLkZpbGVFeHBvcnRfdG9EaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIHRoZSBjb250ZW50cyBvZiBzZWxmJ3MgZGVzdGluYXRpb24gc3BlY2lmaWNhdGlvbiB3aWRnZXQKLSAgICAgKgotICAgICAqCUByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzdGluYXRpb25WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uTmFtZUZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJU2V0IHRoZSBjdXJyZW50IGlucHV0IGZvY3VzIHRvIHNlbGYncyBkZXN0aW5hdGlvbiBlbnRyeSBmaWVsZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdpdmVGb2N1c1RvRGVzdGluYXRpb24oKSB7Ci0gICAgICAgIGRlc3RpbmF0aW9uTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJT3BlbiBhbiBhcHByb3ByaWF0ZSBkZXN0aW5hdGlvbiBicm93c2VyIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBzb3VyY2UKLSAgICAgKgl0byBpbXBvcnQgZnJvbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZURlc3RpbmF0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLSAgICAgICAgRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBTV1QuU0FWRSk7Ci0gICAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKFNFTEVDVF9ERVNUSU5BVElPTl9NRVNTQUdFKTsKLSAgICAgICAgZGlhbG9nLnNldFRleHQoU0VMRUNUX0RFU1RJTkFUSU9OX1RJVExFKTsKLSAgICAgICAgZGlhbG9nLnNldEZpbHRlclBhdGgoZ2V0RGVzdGluYXRpb25WYWx1ZSgpKTsKLSAgICAgICAgU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5TmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkRGlyZWN0b3J5TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgICBzZXREZXN0aW5hdGlvblZhbHVlKHNlbGVjdGVkRGlyZWN0b3J5TmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgYWxsIGV2ZW50cyBhbmQgZW5hYmxlbWVudHMgZm9yIHdpZGdldHMgaW4gdGhpcyBwYWdlCi0gICAgICogQHBhcmFtIGUgRXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0gICAgICAgIFdpZGdldCBzb3VyY2UgPSBlLndpZGdldDsKLQotICAgICAgICBpZiAoc291cmNlID09IGRlc3RpbmF0aW9uQnJvd3NlQnV0dG9uKQotICAgICAgICAgICAgaGFuZGxlRGVzdGluYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCk7Ci0KLSAgICAgICAgdXBkYXRlUGFnZUNvbXBsZXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglIb29rIG1ldGhvZCBmb3Igc2F2aW5nIHdpZGdldCB2YWx1ZXMgZm9yIHJlc3RvcmF0aW9uIGJ5IHRoZSBuZXh0IGluc3RhbmNlCi0gICAgICoJb2YgdGhpcyBjbGFzcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFNhdmVXaWRnZXRWYWx1ZXMoKSB7Ci0gICAgICAgIC8vIHVwZGF0ZSBkaXJlY3RvcnkgbmFtZXMgaGlzdG9yeQotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nW10gZGlyZWN0b3J5TmFtZXMgPSBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAuZ2V0QXJyYXkoU1RPUkVfREVTVElOQVRJT05fTkFNRVNfSUQpOwotICAgICAgICAgICAgaWYgKGRpcmVjdG9yeU5hbWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgZGlyZWN0b3J5TmFtZXMgPSBuZXcgU3RyaW5nWzBdOwotCi0gICAgICAgICAgICBkaXJlY3RvcnlOYW1lcyA9IGFkZFRvSGlzdG9yeShkaXJlY3RvcnlOYW1lcywgZ2V0RGVzdGluYXRpb25WYWx1ZSgpKTsKLSAgICAgICAgICAgIHNldHRpbmdzLnB1dChTVE9SRV9ERVNUSU5BVElPTl9OQU1FU19JRCwgZGlyZWN0b3J5TmFtZXMpOwotCi0gICAgICAgICAgICAvLyBvcHRpb25zCi0gICAgICAgICAgICBzZXR0aW5ncy5wdXQoU1RPUkVfT1ZFUldSSVRFX0VYSVNUSU5HX0ZJTEVTX0lELAotICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotCi0gICAgICAgICAgICBzZXR0aW5ncy5wdXQoU1RPUkVfQ1JFQVRFX1NUUlVDVFVSRV9JRCwKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJSG9vayBtZXRob2QgZm9yIHJlc3RvcmluZyB3aWRnZXQgdmFsdWVzIHRvIHRoZSB2YWx1ZXMgdGhhdCB0aGV5IGhlbGQKLSAgICAgKglsYXN0IHRpbWUgdGhpcyB3aXphcmQgd2FzIHVzZWQgdG8gY29tcGxldGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nW10gZGlyZWN0b3J5TmFtZXMgPSBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAuZ2V0QXJyYXkoU1RPUkVfREVTVElOQVRJT05fTkFNRVNfSUQpOwotICAgICAgICAgICAgaWYgKGRpcmVjdG9yeU5hbWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBpZS4tIG5vIHNldHRpbmdzIHN0b3JlZAotCi0gICAgICAgICAgICAvLyBkZXN0aW5hdGlvbgotICAgICAgICAgICAgc2V0RGVzdGluYXRpb25WYWx1ZShkaXJlY3RvcnlOYW1lc1swXSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdG9yeU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGFkZERlc3RpbmF0aW9uSXRlbShkaXJlY3RvcnlOYW1lc1tpXSk7Ci0KLSAgICAgICAgICAgIC8vIG9wdGlvbnMKLSAgICAgICAgICAgIG92ZXJ3cml0ZUV4aXN0aW5nRmlsZXNDaGVja2JveC5zZXRTZWxlY3Rpb24oc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgLmdldEJvb2xlYW4oU1RPUkVfT1ZFUldSSVRFX0VYSVNUSU5HX0ZJTEVTX0lEKSk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gY3JlYXRlRGlyZWN0b3JpZXMgPSBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAuZ2V0Qm9vbGVhbihTVE9SRV9DUkVBVEVfU1RSVUNUVVJFX0lEKTsKLSAgICAgICAgICAgIGNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZUJ1dHRvbi5zZXRTZWxlY3Rpb24oY3JlYXRlRGlyZWN0b3JpZXMpOwotICAgICAgICAgICAgY3JlYXRlU2VsZWN0aW9uT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24oIWNyZWF0ZURpcmVjdG9yaWVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCVNldCB0aGUgY29udGVudHMgb2YgdGhlIHJlY2VpdmVycyBkZXN0aW5hdGlvbiBzcGVjaWZpY2F0aW9uIHdpZGdldCB0bwotICAgICAqCXRoZSBwYXNzZWQgdmFsdWUKLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldERlc3RpbmF0aW9uVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGRlc3RpbmF0aW9uTmFtZUZpZWxkLnNldFRleHQodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZWNlaXZlcnMgZGVzdGluYXRpb24gc3BlY2lmaWNhdGlvbgotICAgICAqCXdpZGdldHMgY3VycmVudGx5IGFsbCBjb250YWluIHZhbGlkIHZhbHVlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZURlc3RpbmF0aW9uR3JvdXAoKSB7Ci0gICAgICAgIFN0cmluZyBkZXN0aW5hdGlvblZhbHVlID0gZ2V0RGVzdGluYXRpb25WYWx1ZSgpOwotICAgICAgICBpZiAoZGVzdGluYXRpb25WYWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKGRlc3RpbmF0aW9uRW1wdHlNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNvbmZsaWN0aW5nQ29udGFpbmVyID0gZ2V0Q29uZmxpY3RpbmdDb250YWluZXJOYW1lRm9yKGRlc3RpbmF0aW9uVmFsdWUpOwotICAgICAgICBpZiAoY29uZmxpY3RpbmdDb250YWluZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUV4cG9ydF9jb25mbGljdGluZ0NvbnRhaW5lciwgY29uZmxpY3RpbmdDb250YWluZXIpKTsKLSAgICAgICAgICAgIGdpdmVGb2N1c1RvRGVzdGluYXRpb24oKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmREYXRhVHJhbnNmZXJQYWdlI3ZhbGlkYXRlU291cmNlR3JvdXAoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU291cmNlR3JvdXAoKSB7Ci0gICAgCS8vIHRoZXJlIG11c3QgYmUgc29tZSByZXNvdXJjZXMgc2VsZWN0ZWQgZm9yIEV4cG9ydAotICAgIAlib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotICAgICAgICBMaXN0IHJlc291cmNlc1RvRXhwb3J0ID0gZ2V0V2hpdGVDaGVja2VkUmVzb3VyY2VzKCk7Ci0gICAgCWlmIChyZXNvdXJjZXNUb0V4cG9ydC5zaXplKCkgPT0gMCl7Ci0gICAgCQlzZXRFcnJvck1lc3NhZ2UoRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUV4cG9ydF9ub25lU2VsZWN0ZWQpOwotICAgICAgICAgICAgaXNWYWxpZCA9ICBmYWxzZTsKLSAgICAJfQotICAgIAllbHNlCi0gICAgCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXJldHVybiBzdXBlci52YWxpZGF0ZVNvdXJjZUdyb3VwKCkgJiYgaXNWYWxpZDsKLQl9Ci0KLQkvKioKLSAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgdXNlZCB0byBkZW5vdGUgYW4gZW1wdHkgZGVzdGluYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkZXN0aW5hdGlvbkVtcHR5TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIERhdGFUcmFuc2Zlck1lc3NhZ2VzLkZpbGVFeHBvcnRfZGVzdGluYXRpb25FbXB0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgY29udGFpbmVyIHdpdGggYSBsb2NhdGlvbiB0aGF0IGVuY29tcGFzc2VzIHRhcmdldERpcmVjdG9yeS4KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gY29uZmxpY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRhcmdldERpcmVjdG9yeSB0aGUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gdGhlIGNvbmZsaWN0aW5nIGNvbnRhaW5lciBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25mbGljdGluZ0NvbnRhaW5lck5hbWVGb3IoU3RyaW5nIHRhcmdldERpcmVjdG9yeSkgewotCi0gICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUGF0aCB0ZXN0UGF0aCA9IG5ldyBQYXRoKHRhcmdldERpcmVjdG9yeSk7Ci0KLSAgICAgICAgaWYgKHJvb3QuZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKHRlc3RQYXRoKSkKLSAgICAgICAgICAgIHJldHVybiBEYXRhVHJhbnNmZXJNZXNzYWdlcy5GaWxlRXhwb3J0X3Jvb3ROYW1lOwotCi0JICAgIElDb250YWluZXJbXSBjb250YWluZXJzID0gcm9vdC5maW5kQ29udGFpbmVyc0ZvckxvY2F0aW9uKHRlc3RQYXRoKTsKLQkgICAgaWYgKGNvbnRhaW5lcnMubGVuZ3RoID4gMCl7Ci0gICAgCQlyZXR1cm4gY29udGFpbmVyc1swXS5nZXROYW1lKCk7Ci0JICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL1dpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUltcG9ydFBhZ2UxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlSW1wb3J0UGFnZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUzNjVhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlSW1wb3J0UGFnZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5GaWxlU3lzdGVtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZFJlc291cmNlSW1wb3J0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5JRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcm9ncmVzcy5Qcm9ncmVzc01vbml0b3JKb2JzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5GaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkltcG9ydE9wZXJhdGlvbjsKLQotLyoqCi0gKglQYWdlIDEgb2YgdGhlIGJhc2UgcmVzb3VyY2UgaW1wb3J0LWZyb20tZmlsZS1zeXN0ZW0gV2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMSBleHRlbmRzIFdpemFyZFJlc291cmNlSW1wb3J0UGFnZQotICAgICAgICBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLSAgICAvLyB3aWRnZXRzCi0gICAgcHJvdGVjdGVkIENvbWJvIHNvdXJjZU5hbWVGaWVsZDsKLQotICAgIHByb3RlY3RlZCBCdXR0b24gb3ZlcndyaXRlRXhpc3RpbmdSZXNvdXJjZXNDaGVja2JveDsKLQotICAgIHByb3RlY3RlZCBCdXR0b24gY3JlYXRlQ29udGFpbmVyU3RydWN0dXJlQnV0dG9uOwotCi0gICAgcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVPbmx5U2VsZWN0ZWRCdXR0b247Ci0KLSAgICBwcm90ZWN0ZWQgQnV0dG9uIHNvdXJjZUJyb3dzZUJ1dHRvbjsKLQotICAgIHByb3RlY3RlZCBCdXR0b24gc2VsZWN0VHlwZXNCdXR0b247Ci0KLSAgICBwcm90ZWN0ZWQgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbjsKLQotICAgIHByb3RlY3RlZCBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0KLSAgICAvL0EgYm9vbGVhbiB0byBpbmRpY2F0ZSBpZiB0aGUgdXNlciBoYXMgdHlwZWQgYW55dGhpbmcKLSAgICBwcml2YXRlIGJvb2xlYW4gZW50cnlDaGFuZ2VkID0gZmFsc2U7Ci0KLSAgICAvLyBkaWFsb2cgc3RvcmUgaWQgY29uc3RhbnRzCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUT1JFX1NPVVJDRV9OQU1FU19JRCA9ICJXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMS5TVE9SRV9TT1VSQ0VfTkFNRVNfSUQiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVE9SRV9PVkVSV1JJVEVfRVhJU1RJTkdfUkVTT1VSQ0VTX0lEID0gIldpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUltcG9ydFBhZ2UxLlNUT1JFX09WRVJXUklURV9FWElTVElOR19SRVNPVVJDRVNfSUQiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVE9SRV9DUkVBVEVfQ09OVEFJTkVSX1NUUlVDVFVSRV9JRCA9ICJXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMS5TVE9SRV9DUkVBVEVfQ09OVEFJTkVSX1NUUlVDVFVSRV9JRCI7Ly8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9UWVBFU19USVRMRSA9IERhdGFUcmFuc2Zlck1lc3NhZ2VzLkRhdGFUcmFuc2Zlcl9zZWxlY3RUeXBlczsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQUxMX1RJVExFID0gRGF0YVRyYW5zZmVyTWVzc2FnZXMuRGF0YVRyYW5zZmVyX3NlbGVjdEFsbDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNFTEVDVF9BTExfVElUTEUgPSBEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfZGVzZWxlY3RBbGw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NPVVJDRV9USVRMRSA9IERhdGFUcmFuc2Zlck1lc3NhZ2VzLkZpbGVJbXBvcnRfc2VsZWN0U291cmNlVGl0bGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NPVVJDRV9NRVNTQUdFID0gRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUltcG9ydF9zZWxlY3RTb3VyY2U7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRU1QVFlfTUVTU0FHRSA9IERhdGFUcmFuc2Zlck1lc3NhZ2VzLkZpbGVJbXBvcnRfc291cmNlRW1wdHk7Ci0KLSAgICAvKioKLSAgICAgKglDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlSW1wb3J0UGFnZTEoU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzdXBlcihuYW1lLCBzZWxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIGFXb3JrYmVuY2ggSVdvcmtiZW5jaAotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gSVN0cnVjdHVyZWRTZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlSW1wb3J0UGFnZTEoSVdvcmtiZW5jaCBhV29ya2JlbmNoLAotICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHRoaXMoImZpbGVTeXN0ZW1JbXBvcnRQYWdlMSIsIGFXb3JrYmVuY2gsIHNlbGVjdGlvbik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBzZXRUaXRsZShEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfZmlsZVN5c3RlbVRpdGxlKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUltcG9ydF9pbXBvcnRGaWxlU3lzdGVtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGJ1dHRvbiB3aXRoIHRoZSBnaXZlbiBpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QKLSAgICAgKiBjcmVhdGVzIGEgc3RhbmRhcmQgcHVzaCBidXR0b24sIHJlZ2lzdGVycyBmb3Igc2VsZWN0aW9uIGV2ZW50cwotICAgICAqIGluY2x1ZGluZyBidXR0b24gcHJlc3NlcyBhbmQgcmVnaXN0ZXJzCi0gICAgICogZGVmYXVsdCBidXR0b25zIHdpdGggaXRzIHNoZWxsLgotICAgICAqIFRoZSBidXR0b24gaWQgaXMgc3RvcmVkIGFzIHRoZSBidXR0b25zIGNsaWVudCBkYXRhLgotICAgICAqIE5vdGUgdGhhdCB0aGUgcGFyZW50J3MgbGF5b3V0IGlzIGFzc3VtZWQgdG8gYmUgYSBHcmlkTGF5b3V0IGFuZCAKLSAgICAgKiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhpcyBsYXlvdXQgaXMgaW5jcmVtZW50ZWQuCi0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIGJ1dHRvbiAoc2VlCi0gICAgICogIDxjb2RlPklEaWFsb2dDb25zdGFudHMuKl9JRDwvY29kZT4gY29uc3RhbnRzIAotICAgICAqICBmb3Igc3RhbmRhcmQgZGlhbG9nIGJ1dHRvbiBpZHMpCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCBmcm9tIHRoZSBidXR0b24KLSAgICAgKiBAcGFyYW0gZGVmYXVsdEJ1dHRvbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYnV0dG9uIGlzIHRvIGJlIHRoZQotICAgICAqICAgZGVmYXVsdCBidXR0b24sIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGlkLCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICBib29sZWFuIGRlZmF1bHRCdXR0b24pIHsKLSAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgYnV0dG9uIGJhcgotICAgICAgICAoKEdyaWRMYXlvdXQpIHBhcmVudC5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucysrOwotCi0gICAgICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBidXR0b24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotICAgICAgICBHcmlkRGF0YSBidXR0b25EYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkRhdGEpOwotCi0gICAgICAgIGJ1dHRvbi5zZXREYXRhKG5ldyBJbnRlZ2VyKGlkKSk7Ci0gICAgICAgIGJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQotICAgICAgICBpZiAoZGVmYXVsdEJ1dHRvbikgewotICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgIGlmIChzaGVsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2hlbGwuc2V0RGVmYXVsdEJ1dHRvbihidXR0b24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnV0dG9uLnNldEZvY3VzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1dHRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBidXR0b25zIGZvciBzZWxlY3Rpbmcgc3BlY2lmaWMgdHlwZXMgb3Igc2VsZWN0aW5nIGFsbCBvciBub25lIG9mIHRoZQotICAgICAqIGVsZW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjcmVhdGVCdXR0b25zR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyB0b3AgbGV2ZWwgZ3JvdXAKLSAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBidXR0b25Db21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgR3JpZERhdGEgYnV0dG9uRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMCi0gICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgICAgICBidXR0b25EYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoYnV0dG9uRGF0YSk7Ci0KLSAgICAgICAgLy8gdHlwZXMgZWRpdCBidXR0b24KLSAgICAgICAgc2VsZWN0VHlwZXNCdXR0b24gPSBjcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0VMRUNUX1RZUEVTX0lELCBTRUxFQ1RfVFlQRVNfVElUTEUsIGZhbHNlKTsKLQotICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZVR5cGVzRWRpdEJ1dHRvblByZXNzZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgc2VsZWN0VHlwZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBzZXRCdXR0b25MYXlvdXREYXRhKHNlbGVjdFR5cGVzQnV0dG9uKTsKLQotICAgICAgICBzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0VMRUNUX0FMTF9JRCwgU0VMRUNUX0FMTF9USVRMRSwgZmFsc2UpOwotCi0gICAgICAgIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0QWxsU2VsZWN0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgc2V0QnV0dG9uTGF5b3V0RGF0YShzZWxlY3RBbGxCdXR0b24pOwotCi0gICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwKLSAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkRFU0VMRUNUX0FMTF9JRCwgREVTRUxFQ1RfQUxMX1RJVExFLCBmYWxzZSk7Ci0KLSAgICAgICAgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRBbGxTZWxlY3Rpb25zKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBzZXRCdXR0b25MYXlvdXREYXRhKGRlc2VsZWN0QWxsQnV0dG9uKTsKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICAgICAgdmFsaWRhdGVTb3VyY2VHcm91cCgpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdldENvbnRyb2woKSwKLSAgICAgICAgICAgICAgICBJRGF0YVRyYW5zZmVySGVscENvbnRleHRJZHMuRklMRV9TWVNURU1fSU1QT1JUX1dJWkFSRF9QQUdFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglDcmVhdGUgdGhlIGltcG9ydCBvcHRpb25zIHNwZWNpZmljYXRpb24gd2lkZ2V0cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPcHRpb25zR3JvdXBCdXR0b25zKEdyb3VwIG9wdGlvbnNHcm91cCkgewotCi0gICAgICAgIC8vIG92ZXJ3cml0ZS4uLiBjaGVja2JveAotICAgICAgICBvdmVyd3JpdGVFeGlzdGluZ1Jlc291cmNlc0NoZWNrYm94ID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIG92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3guc2V0Rm9udChvcHRpb25zR3JvdXAuZ2V0Rm9udCgpKTsKLSAgICAgICAgb3ZlcndyaXRlRXhpc3RpbmdSZXNvdXJjZXNDaGVja2JveC5zZXRUZXh0KERhdGFUcmFuc2Zlck1lc3NhZ2VzLkZpbGVJbXBvcnRfb3ZlcndyaXRlRXhpc3RpbmcpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBjb250YWluZXJzIHJhZGlvCi0gICAgICAgIGNyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZUJ1dHRvbiA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICBjcmVhdGVDb250YWluZXJTdHJ1Y3R1cmVCdXR0b24uc2V0Rm9udChvcHRpb25zR3JvdXAuZ2V0Rm9udCgpKTsKLSAgICAgICAgY3JlYXRlQ29udGFpbmVyU3RydWN0dXJlQnV0dG9uLnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUltcG9ydF9jcmVhdGVDb21wbGV0ZSk7Ci0gICAgICAgIGNyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBzZWxlY3Rpb24gb25seSByYWRpbwotICAgICAgICBjcmVhdGVPbmx5U2VsZWN0ZWRCdXR0b24gPSBuZXcgQnV0dG9uKG9wdGlvbnNHcm91cCwgU1dULlJBRElPKTsKLSAgICAgICAgY3JlYXRlT25seVNlbGVjdGVkQnV0dG9uLnNldEZvbnQob3B0aW9uc0dyb3VwLmdldEZvbnQoKSk7Ci0gICAgICAgIGNyZWF0ZU9ubHlTZWxlY3RlZEJ1dHRvbi5zZXRUZXh0KERhdGFUcmFuc2Zlck1lc3NhZ2VzLkZpbGVJbXBvcnRfY3JlYXRlU2VsZWN0ZWRGb2xkZXJzKTsKLSAgICAgICAgY3JlYXRlT25seVNlbGVjdGVkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqCUNyZWF0ZSB0aGUgZ3JvdXAgZm9yIGNyZWF0aW5nIHRoZSByb290IGRpcmVjdG9yeQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJvb3REaXJlY3RvcnlHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBzb3VyY2VDb250YWluZXJHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBzb3VyY2VDb250YWluZXJHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgc291cmNlQ29udGFpbmVyR3JvdXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgc291cmNlQ29udGFpbmVyR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgTGFiZWwgZ3JvdXBMYWJlbCA9IG5ldyBMYWJlbChzb3VyY2VDb250YWluZXJHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBncm91cExhYmVsLnNldFRleHQoZ2V0U291cmNlTGFiZWwoKSk7Ci0gICAgICAgIGdyb3VwTGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotICAgICAgICAvLyBzb3VyY2UgbmFtZSBlbnRyeSBmaWVsZAotICAgICAgICBzb3VyY2VOYW1lRmllbGQgPSBuZXcgQ29tYm8oc291cmNlQ29udGFpbmVyR3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLSAgICAgICAgc291cmNlTmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHNvdXJjZU5hbWVGaWVsZC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIHNvdXJjZU5hbWVGaWVsZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVGcm9tU291cmNlRmllbGQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc291cmNlTmFtZUZpZWxkLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBAc2VlIEtleUxpc3RlbmVyLmtleVByZXNzZWQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgLy9JZiB0aGVyZSBoYXMgYmVlbiBhIGtleSBwcmVzc2VkIHRoZW4gbWFyayBhcyBkaXJ0eQotICAgICAgICAgICAgICAgIGVudHJ5Q2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBAc2VlIEtleUxpc3RlbmVyLmtleVJlbGVhc2VkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc291cmNlTmFtZUZpZWxkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQHNlZSBGb2N1c0xpc3RlbmVyLmZvY3VzR2FpbmVkKEZvY3VzRXZlbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vRG8gbm90aGluZyB3aGVuIGdldHRpbmcgZm9jdXMKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEBzZWUgRm9jdXNMaXN0ZW5lci5mb2N1c0xvc3QoRm9jdXNFdmVudCkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vQ2xlYXIgdGhlIGZsYWcgdG8gcHJldmVudCBjb25zdGFudCB1cGRhdGUKLSAgICAgICAgICAgICAgICBpZiAoZW50cnlDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVudHJ5Q2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVGcm9tU291cmNlRmllbGQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gc291cmNlIGJyb3dzZSBidXR0b24KLSAgICAgICAgc291cmNlQnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihzb3VyY2VDb250YWluZXJHcm91cCwgU1dULlBVU0gpOwotICAgICAgICBzb3VyY2VCcm93c2VCdXR0b24uc2V0VGV4dChEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfYnJvd3NlKTsKLSAgICAgICAgc291cmNlQnJvd3NlQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgICAgICBzb3VyY2VCcm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgICAgIHNvdXJjZUJyb3dzZUJ1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBzZXRCdXR0b25MYXlvdXREYXRhKHNvdXJjZUJyb3dzZUJ1dHRvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSByZWNlaXZlciBmcm9tIHRoZSBzb3VyY2UgbmFtZSBmaWVsZC4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVGcm9tU291cmNlRmllbGQoKSB7Ci0KLSAgICAgICAgc2V0U291cmNlTmFtZShzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLSAgICAgICAgLy9VcGRhdGUgZW5hYmxlbWVudHMgd2hlbiB0aGlzIGlzIHNlbGVjdGVkCi0gICAgICAgIHVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkCi0gICAgICogZmlsZSBzeXN0ZW0gb2JqZWN0IG1lcml0cyBvbmUuICBUaGUgY3JpdGVyaWEgZm9yIHRoaXMgYXJlOgotICAgICAqIEFsc28gY3JlYXRlIHRoZSBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgY3JlYXRlUm9vdEVsZW1lbnQoCi0gICAgICAgICAgICBPYmplY3QgZmlsZVN5c3RlbU9iamVjdCwgSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNDb250YWluZXIgPSBwcm92aWRlci5pc0ZvbGRlcihmaWxlU3lzdGVtT2JqZWN0KTsKLSAgICAgICAgU3RyaW5nIGVsZW1lbnRMYWJlbCA9IHByb3ZpZGVyLmdldExhYmVsKGZpbGVTeXN0ZW1PYmplY3QpOwotCi0gICAgICAgIC8vIFVzZSBhbiBlbXB0eSBsYWJlbCBzbyB0aGF0IGRpc3BsYXkgb2YgdGhlIGVsZW1lbnQncyBmdWxsIG5hbWUKLSAgICAgICAgLy8gZG9lc24ndCBpbmNsdWRlIGEgY29uZnVzaW5nIGxhYmVsCi0gICAgICAgIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGR1bW15UGFyZW50ID0gbmV3IE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KAotICAgICAgICAgICAgICAgICIiLCBudWxsLCB0cnVlKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGR1bW15UGFyZW50LnNldFBvcHVsYXRlZCgpOwotICAgICAgICBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCByZXN1bHQgPSBuZXcgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgZWxlbWVudExhYmVsLCBkdW1teVBhcmVudCwgaXNDb250YWluZXIpOwotICAgICAgICByZXN1bHQuc2V0RmlsZVN5c3RlbU9iamVjdChmaWxlU3lzdGVtT2JqZWN0KTsKLQotICAgICAgICAvL0dldCB0aGUgZmlsZXMgZm9yIHRoZSBlbGVtZW50IHNvIGFzIHRvIGJ1aWxkIHRoZSBmaXJzdCBsZXZlbAotICAgICAgICByZXN1bHQuZ2V0RmlsZXMocHJvdmlkZXIpOwotCi0gICAgICAgIHJldHVybiBkdW1teVBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglDcmVhdGUgdGhlIGltcG9ydCBzb3VyY2Ugc3BlY2lmaWNhdGlvbiB3aWRnZXRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIGNyZWF0ZVJvb3REaXJlY3RvcnlHcm91cChwYXJlbnQpOwotICAgICAgICBjcmVhdGVGaWxlU2VsZWN0aW9uR3JvdXAocGFyZW50KTsKLSAgICAgICAgY3JlYXRlQnV0dG9uc0dyb3VwKHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIGJ1dHRvbiBncm91cC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBlbmFibGVCdXR0b25Hcm91cChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBzZWxlY3RUeXBlc0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3BlY2lmaWVkIHNvdXJjZSBjdXJyZW50bHkgZXhpc3RzCi0gICAgICoJYW5kIGlzIHZhbGlkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5zdXJlU291cmNlSXNWYWxpZCgpIHsKLSAgICAgICAgaWYgKG5ldyBGaWxlKGdldFNvdXJjZURpcmVjdG9yeU5hbWUoKSkuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGRpc3BsYXlFcnJvckRpYWxvZyhEYXRhVHJhbnNmZXJNZXNzYWdlcy5GaWxlSW1wb3J0X2ludmFsaWRTb3VyY2UpOwotICAgICAgICBzb3VyY2VOYW1lRmllbGQuc2V0Rm9jdXMoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUV4ZWN1dGUgdGhlIHBhc3NlZCBpbXBvcnQgb3BlcmF0aW9uLiAgQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZUltcG9ydE9wZXJhdGlvbihJbXBvcnRPcGVyYXRpb24gb3ApIHsKLSAgICAgICAgaW5pdGlhbGl6ZU9wZXJhdGlvbihvcCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBvcCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBkaXNwbGF5RXJyb3JEaWFsb2coZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG9wLmdldFN0YXR1cygpOwotICAgICAgICBpZiAoIXN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwgRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUltcG9ydF9pbXBvcnRQcm9ibGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBubyBzcGVjaWFsIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJVGhlIEZpbmlzaCBidXR0b24gd2FzIHByZXNzZWQuICBUcnkgdG8gZG8gdGhlIHJlcXVpcmVkIHdvcmsgbm93IGFuZCBhbnN3ZXIKLSAgICAgKglhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLiAgSWYgZmFsc2UgaXMgcmV0dXJuZWQgdGhlbiB0aGUgd2l6YXJkIHdpbGwKLSAgICAgKglub3QgY2xvc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5pc2goKSB7Ci0gICAgICAgIGlmICghZW5zdXJlU291cmNlSXNWYWxpZCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHNhdmVXaWRnZXRWYWx1ZXMoKTsKLQotICAgICAgICBJdGVyYXRvciByZXNvdXJjZXNFbnVtID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBMaXN0IGZpbGVTeXN0ZW1PYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAocmVzb3VyY2VzRW51bS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGZpbGVTeXN0ZW1PYmplY3RzLmFkZCgoKEZpbGVTeXN0ZW1FbGVtZW50KSByZXNvdXJjZXNFbnVtLm5leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgLmdldEZpbGVTeXN0ZW1PYmplY3QoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlsZVN5c3RlbU9iamVjdHMuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIHJldHVybiBpbXBvcnRSZXNvdXJjZXMoZmlsZVN5c3RlbU9iamVjdHMpOwotCi0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgRGF0YVRyYW5zZmVyTWVzc2FnZXMuRGF0YVRyYW5zZmVyX2luZm9ybWF0aW9uLAotICAgICAgICAgICAgICAgIERhdGFUcmFuc2Zlck1lc3NhZ2VzLkZpbGVJbXBvcnRfbm9uZVNlbGVjdGVkKTsKLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbnRlbnQgcHJvdmlkZXIgZm9yIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPnMgdGhhdCByZXR1cm5zIAotICAgICAqIG9ubHkgZmlsZXMgYXMgY2hpbGRyZW4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGdldEZpbGVQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLSAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGVsZW1lbnQgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIG87Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEZpbGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSkuZ2V0Q2hpbGRyZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgcm9vdCBGaWxlU3lzdGVtRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mCi0gICAgICoJdGhlIGN1cnJlbnRseS1zcGVjaWZpZWQgc291cmNlLiAgSWYgdGhpcyBGaWxlU3lzdGVtRWxlbWVudCBpcyBub3QKLSAgICAgKgljdXJyZW50bHkgZGVmaW5lZCB0aGVuIGNyZWF0ZSBhbmQgcmV0dXJuIGl0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBnZXRGaWxlU3lzdGVtVHJlZSgpIHsKLQotICAgICAgICBGaWxlIHNvdXJjZURpcmVjdG9yeSA9IGdldFNvdXJjZURpcmVjdG9yeSgpOwotICAgICAgICBpZiAoc291cmNlRGlyZWN0b3J5ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gc2VsZWN0RmlsZXMoc291cmNlRGlyZWN0b3J5LAotICAgICAgICAgICAgICAgIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbnRlbnQgcHJvdmlkZXIgZm9yIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPnMgdGhhdCByZXR1cm5zIAotICAgICAqIG9ubHkgZm9sZGVycyBhcyBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Rm9sZGVyUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBlbGVtZW50ID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBvOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRGb2xkZXJzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSkuZ2V0Q2hpbGRyZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZWxlbWVudCA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgbzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNQb3B1bGF0ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCi0gICAgICAgICAgICAgICAgICAgIC8vSWYgd2UgaGF2ZSBub3QgcG9wdWxhdGVkIHRoZW4gd2FpdCB1bnRpbCBhc2tlZAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnRseS1uYW1lZCBzb3VyY2UgZGlyZWN0b3J5IGlmZgotICAgICAqIGl0IGV4aXN0cyBhcyBhIHZhbGlkIGRpcmVjdG9yeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGdldFNvdXJjZURpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvdXJjZURpcmVjdG9yeSh0aGlzLnNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnRseS1uYW1lZCBzb3VyY2UgZGlyZWN0b3J5IGlmZgotICAgICAqIGl0IGV4aXN0cyBhcyBhIHZhbGlkIGRpcmVjdG9yeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGggYSBTdHJpbmcgbm90IHlldCBmb3JtYXR0ZWQgZm9yIGphdmEuaW8uRmlsZSBjb21wYXRhYmlsaXR5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGdldFNvdXJjZURpcmVjdG9yeShTdHJpbmcgcGF0aCkgewotICAgICAgICBGaWxlIHNvdXJjZURpcmVjdG9yeSA9IG5ldyBGaWxlKGdldFNvdXJjZURpcmVjdG9yeU5hbWUocGF0aCkpOwotICAgICAgICBpZiAoIXNvdXJjZURpcmVjdG9yeS5leGlzdHMoKSB8fCAhc291cmNlRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNvdXJjZURpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgdGhlIGRpcmVjdG9yeSBuYW1lIHNwZWNpZmllZCBhcyBiZWluZyB0aGUgaW1wb3J0IHNvdXJjZS4KLSAgICAgKglOb3RlIHRoYXQgaWYgaXQgZW5kcyB3aXRoIGEgc2VwYXJhdG9yIHRoZW4gdGhlIHNlcGFyYXRvciBpcyBmaXJzdAotICAgICAqCXJlbW92ZWQgc28gdGhhdCBqYXZhIHRyZWF0cyBpdCBhcyBhIHByb3BlciBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTb3VyY2VEaXJlY3RvcnlOYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0U291cmNlRGlyZWN0b3J5TmFtZSh0aGlzLnNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgZGlyZWN0b3J5IG5hbWUgc3BlY2lmaWVkIGFzIGJlaW5nIHRoZSBpbXBvcnQgc291cmNlLgotICAgICAqCU5vdGUgdGhhdCBpZiBpdCBlbmRzIHdpdGggYSBzZXBhcmF0b3IgdGhlbiB0aGUgc2VwYXJhdG9yIGlzIGZpcnN0Ci0gICAgICoJcmVtb3ZlZCBzbyB0aGF0IGphdmEgdHJlYXRzIGl0IGFzIGEgcHJvcGVyIGRpcmVjdG9yeQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFNvdXJjZURpcmVjdG9yeU5hbWUoU3RyaW5nIHNvdXJjZU5hbWUpIHsKLSAgICAgICAgSVBhdGggcmVzdWx0ID0gbmV3IFBhdGgoc291cmNlTmFtZS50cmltKCkpOwotCi0gICAgICAgIGlmIChyZXN1bHQuZ2V0RGV2aWNlKCkgIT0gbnVsbCAmJiByZXN1bHQuc2VnbWVudENvdW50KCkgPT0gMCkgLy8gc29tZXRoaW5nIGxpa2UgImM6IgotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQudG9PU1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgc3RyaW5nIHRvIGRpc3BsYXkgYXMgdGhlIGxhYmVsIGZvciB0aGUgc291cmNlIHNwZWNpZmljYXRpb24gZmllbGQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZUxhYmVsKCkgewotICAgICAgICByZXR1cm4gRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUltcG9ydF9mcm9tRGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUhhbmRsZSBhbGwgZXZlbnRzIGFuZCBlbmFibGVtZW50cyBmb3Igd2lkZ2V0cyBpbiB0aGlzIGRpYWxvZwotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LndpZGdldCA9PSBzb3VyY2VCcm93c2VCdXR0b24pCi0gICAgICAgICAgICBoYW5kbGVTb3VyY2VCcm93c2VCdXR0b25QcmVzc2VkKCk7Ci0KLSAgICAgICAgc3VwZXIuaGFuZGxlRXZlbnQoZXZlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCU9wZW4gYW4gYXBwcm9wcmlhdGUgc291cmNlIGJyb3dzZXIgc28gdGhhdCB0aGUgdXNlciBjYW4gc3BlY2lmeSBhIHNvdXJjZQotICAgICAqCXRvIGltcG9ydCBmcm9tCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU291cmNlQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQotICAgICAgICBTdHJpbmcgY3VycmVudFNvdXJjZSA9IHRoaXMuc291cmNlTmFtZUZpZWxkLmdldFRleHQoKTsKLSAgICAgICAgRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coCi0gICAgICAgICAgICAgICAgc291cmNlTmFtZUZpZWxkLmdldFNoZWxsKCksIFNXVC5TQVZFKTsKLSAgICAgICAgZGlhbG9nLnNldFRleHQoU0VMRUNUX1NPVVJDRV9USVRMRSk7Ci0gICAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKFNFTEVDVF9TT1VSQ0VfTUVTU0FHRSk7Ci0gICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJQYXRoKGdldFNvdXJjZURpcmVjdG9yeU5hbWUoY3VycmVudFNvdXJjZSkpOwotCi0gICAgICAgIFN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvL0p1c3QgcXVpdCBpZiB0aGUgZGlyZWN0b3J5IGlzIG5vdCB2YWxpZAotICAgICAgICAgICAgaWYgKChnZXRTb3VyY2VEaXJlY3Rvcnkoc2VsZWN0ZWREaXJlY3RvcnkpID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHx8IHNlbGVjdGVkRGlyZWN0b3J5LmVxdWFscyhjdXJyZW50U291cmNlKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAvL0lmIGl0IGlzIHZhbGlkIHRoZW4gcHJvY2VlZCB0byBwb3B1bGF0ZQotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICAgICAgc2V0U291cmNlTmFtZShzZWxlY3RlZERpcmVjdG9yeSk7Ci0gICAgICAgICAgICBzZWxlY3Rpb25Hcm91cC5zZXRGb2N1cygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbiBhIHJlZ2lzdGVyZWQgdHlwZSBzZWxlY3Rpb24gZGlhbG9nIGFuZCBub3RlIHRoZSBzZWxlY3Rpb25zCi0gICAgICogaW4gdGhlIHJlY2VpdmVycyB0eXBlcy10by1leHBvcnQgZmllbGQuLAotICAgICAqIEFkZGVkIGhlcmUgc28gdGhhdCBpbm5lciBjbGFzc2VzIGNhbiBoYXZlIGFjY2VzcwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGVzRWRpdEJ1dHRvblByZXNzZWQoKSB7Ci0KLSAgICAgICAgc3VwZXIuaGFuZGxlVHlwZXNFZGl0QnV0dG9uUHJlc3NlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBvcnQgdGhlIHJlc291cmNlcyB3aXRoIGV4dGVuc2lvbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0UmVzb3VyY2VzKExpc3QgZmlsZVN5c3RlbU9iamVjdHMpIHsKLSAgICAgICAgSW1wb3J0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBJbXBvcnRPcGVyYXRpb24oZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSwKLSAgICAgICAgICAgICAgICBnZXRTb3VyY2VEaXJlY3RvcnkoKSwgRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFLAotICAgICAgICAgICAgICAgIHRoaXMsIGZpbGVTeXN0ZW1PYmplY3RzKTsKLQotICAgICAgICBvcGVyYXRpb24uc2V0Q29udGV4dChnZXRTaGVsbCgpKTsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dGVJbXBvcnRPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBhcHByb3ByaWF0ZWx5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcGVyYXRpb24oSW1wb3J0T3BlcmF0aW9uIG9wKSB7Ci0gICAgICAgIG9wLnNldENyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZShjcmVhdGVDb250YWluZXJTdHJ1Y3R1cmVCdXR0b24KLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBvcC5zZXRPdmVyd3JpdGVSZXNvdXJjZXMob3ZlcndyaXRlRXhpc3RpbmdSZXNvdXJjZXNDaGVja2JveAotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBleHRlbnNpb24gcHJvdmlkZWQgaXMgYW4gZXh0ZW5zaW9uIHRoYXQKLSAgICAgKiBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIGV4cG9ydCBieSB0aGUgdXNlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRlbnNpb24gdGhlIHJlc291cmNlIG5hbWUKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXNvdXJjZSBuYW1lIGlzIHN1aXRhYmxlIGZvciBleHBvcnQgYmFzZWQgCi0gICAgICogICB1cG9uIGl0cyBleHRlbnNpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cG9ydGFibGVFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoc2VsZWN0ZWRUeXBlcyA9PSBudWxsKSAvLyBpZS4tIGFsbCBleHRlbnNpb25zIGFyZSBhY2NlcHRhYmxlCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBJdGVyYXRvciBpdHIgPSBzZWxlY3RlZFR5cGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykgaXRyLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJUmVwb3B1bGF0ZSB0aGUgdmlldyBiYXNlZCBvbiB0aGUgY3VycmVudGx5IGVudGVyZWQgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0U2VsZWN0aW9uKCkgewotCi0gICAgICAgIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGN1cnJlbnRSb290ID0gZ2V0RmlsZVN5c3RlbVRyZWUoKTsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb25Hcm91cC5zZXRSb290KGN1cnJlbnRSb290KTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqCVVzZSB0aGUgZGlhbG9nIHN0b3JlIHRvIHJlc3RvcmUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgdmFsdWVzIHRoYXQgdGhleSBoZWxkCi0gICAgICoJbGFzdCB0aW1lIHRoaXMgd2l6YXJkIHdhcyB1c2VkIHRvIGNvbXBsZXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nW10gc291cmNlTmFtZXMgPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9TT1VSQ0VfTkFNRVNfSUQpOwotICAgICAgICAgICAgaWYgKHNvdXJjZU5hbWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBpZS4tIG5vIHZhbHVlcyBzdG9yZWQsIHNvIHN0b3AKLQotICAgICAgICAgICAgLy8gc2V0IGZpbGVuYW1lcyBoaXN0b3J5Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHNvdXJjZU5hbWVGaWVsZC5hZGQoc291cmNlTmFtZXNbaV0pOwotCi0gICAgICAgICAgICAvLyByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzCQotICAgICAgICAgICAgb3ZlcndyaXRlRXhpc3RpbmdSZXNvdXJjZXNDaGVja2JveC5zZXRTZWxlY3Rpb24oc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgLmdldEJvb2xlYW4oU1RPUkVfT1ZFUldSSVRFX0VYSVNUSU5HX1JFU09VUkNFU19JRCkpOwotCi0gICAgICAgICAgICBib29sZWFuIGNyZWF0ZVN0cnVjdHVyZSA9IHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRCb29sZWFuKFNUT1JFX0NSRUFURV9DT05UQUlORVJfU1RSVUNUVVJFX0lEKTsKLSAgICAgICAgICAgIGNyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZUJ1dHRvbi5zZXRTZWxlY3Rpb24oY3JlYXRlU3RydWN0dXJlKTsKLSAgICAgICAgICAgIGNyZWF0ZU9ubHlTZWxlY3RlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oIWNyZWF0ZVN0cnVjdHVyZSk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIAlTaW5jZSBGaW5pc2ggd2FzIHByZXNzZWQsIHdyaXRlIHdpZGdldCB2YWx1ZXMgdG8gdGhlIGRpYWxvZyBzdG9yZSBzbyB0aGF0IHRoZXkKLSAgICAgKgl3aWxsIHBlcnNpc3QgaW50byB0aGUgbmV4dCBpbnZvY2F0aW9uIG9mIHRoaXMgd2l6YXJkIHBhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlV2lkZ2V0VmFsdWVzKCkgewotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdXBkYXRlIHNvdXJjZSBuYW1lcyBoaXN0b3J5Ci0gICAgICAgICAgICBTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IHNldHRpbmdzLmdldEFycmF5KFNUT1JFX1NPVVJDRV9OQU1FU19JRCk7Ci0gICAgICAgICAgICBpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzb3VyY2VOYW1lcyA9IG5ldyBTdHJpbmdbMF07Ci0KLSAgICAgICAgICAgIHNvdXJjZU5hbWVzID0gYWRkVG9IaXN0b3J5KHNvdXJjZU5hbWVzLCBnZXRTb3VyY2VEaXJlY3RvcnlOYW1lKCkpOwotICAgICAgICAgICAgc2V0dGluZ3MucHV0KFNUT1JFX1NPVVJDRV9OQU1FU19JRCwgc291cmNlTmFtZXMpOwotCi0gICAgICAgICAgICAvLyByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzCQotICAgICAgICAgICAgc2V0dGluZ3MucHV0KFNUT1JFX09WRVJXUklURV9FWElTVElOR19SRVNPVVJDRVNfSUQsCi0gICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotCi0gICAgICAgICAgICBzZXR0aW5ncy5wdXQoU1RPUkVfQ1JFQVRFX0NPTlRBSU5FUl9TVFJVQ1RVUkVfSUQsCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgYSBmaWxlIHNlbGVjdGlvbiBvcGVyYXRpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxlIHN5c3RlbSBhbmQKLSAgICAgKiBzdHJ1Y3R1cmUgcHJvdmlkZXIuICBJZiB0aGUgdXNlciBzcGVjaWZpZXMgZmlsZXMgdG8gYmUgaW1wb3J0ZWQgdGhlbgotICAgICAqIHRoaXMgc2VsZWN0aW9uIGlzIGNhY2hlZCBmb3IgbGF0ZXIgcmV0cmlldmFsIGFuZCBpcyByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgc2VsZWN0RmlsZXMoCi0gICAgICAgICAgICBmaW5hbCBPYmplY3Qgcm9vdEZpbGVTeXN0ZW1PYmplY3QsCi0gICAgICAgICAgICBmaW5hbCBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIpIHsKLQotICAgICAgICBmaW5hbCBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudFtdIHJlc3VsdHMgPSBuZXcgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnRbMV07Ci0KLSAgICAgICAgQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgcm9vdCBlbGVtZW50IGZyb20gdGhlIHN1cHBsaWVkIGZpbGUgc3lzdGVtIG9iamVjdAotICAgICAgICAgICAgICAgIHJlc3VsdHNbMF0gPSBjcmVhdGVSb290RWxlbWVudChyb290RmlsZVN5c3RlbU9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZVByb3ZpZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHNbMF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGFsbCBvZiB0aGUgc2VsZWN0aW9ucyBpbiB0aGUgc2VsZWN0aW9uIGdyb3VwIHRvIHZhbHVlLiBJbXBsZW1lbnRlZCBoZXJlCi0gICAgICogdG8gcHJvdmlkZSBhY2Nlc3MgZm9yIGlubmVyIGNsYXNzZXMuCi0gICAgICogQHBhcmFtIHZhbHVlIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBbGxTZWxlY3Rpb25zKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgc3VwZXIuc2V0QWxsU2VsZWN0aW9ucyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc291cmNlIG5hbWUgb2YgdGhlIGltcG9ydCB0byBiZSB0aGUgc3VwcGxpZWQgcGF0aC4KLSAgICAgKiBBZGRzIHRoZSBuYW1lIG9mIHRoZSBwYXRoIHRvIHRoZSBsaXN0IG9mIGl0ZW1zIGluIHRoZQotICAgICAqIHNvdXJjZSBjb21ibyBhbmQgc2VsZWN0cyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGJlIGFkZGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlTmFtZShTdHJpbmcgcGF0aCkgewotCi0gICAgICAgIGlmIChwYXRoLmxlbmd0aCgpID4gMCkgewotCi0gICAgICAgICAgICBTdHJpbmdbXSBjdXJyZW50SXRlbXMgPSB0aGlzLnNvdXJjZU5hbWVGaWVsZC5nZXRJdGVtcygpOwotICAgICAgICAgICAgaW50IHNlbGVjdGlvbkluZGV4ID0gLTE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRJdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SXRlbXNbaV0uZXF1YWxzKHBhdGgpKQotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JbmRleCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VsZWN0aW9uSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IG9sZExlbmd0aCA9IGN1cnJlbnRJdGVtcy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbmV3SXRlbXMgPSBuZXcgU3RyaW5nW29sZExlbmd0aCArIDFdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY3VycmVudEl0ZW1zLCAwLCBuZXdJdGVtcywgMCwgb2xkTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBuZXdJdGVtc1tvbGRMZW5ndGhdID0gcGF0aDsKLSAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZU5hbWVGaWVsZC5zZXRJdGVtcyhuZXdJdGVtcyk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uSW5kZXggPSBvbGRMZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnNvdXJjZU5hbWVGaWVsZC5zZWxlY3Qoc2VsZWN0aW9uSW5kZXgpOwotCi0gICAgICAgICAgICByZXNldFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSB0cmVlIHRvIG9ubHkgc2VsZWN0IHRob3NlIGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdGVkIHR5cGVzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBTZWxlY3Rpb25zQmFzZWRPblNlbGVjdGVkVHlwZXMoKSB7Ci0gICAgICAgIFByb2dyZXNzTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9ySm9ic0RpYWxvZygKLSAgICAgICAgICAgICAgICBnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpKTsKLSAgICAgICAgZmluYWwgTWFwIHNlbGVjdGlvbk1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgICAgICBmaW5hbCBJRWxlbWVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSUVsZW1lbnRGaWx0ZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlckVsZW1lbnRzKENvbGxlY3Rpb24gZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgZmlsZXNMaXN0ID0gZmlsZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZmlsZXNMaXN0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tGaWxlKGZpbGVzTGlzdC5uZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyRWxlbWVudHMoT2JqZWN0W10gZmlsZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tGaWxlKGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0ZpbGUoT2JqZWN0IGZpbGVFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZmlsZSA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgZmlsZUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRXhwb3J0YWJsZUV4dGVuc2lvbihmaWxlLmdldEZpbGVOYW1lRXh0ZW5zaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVTeXN0ZW1FbGVtZW50IHBhcmVudCA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25NYXAuY29udGFpbnNLZXkocGFyZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gKExpc3QpIHNlbGVjdGlvbk1hcC5nZXQocGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25NYXAucHV0KHBhcmVudCwgZWxlbWVudHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9OwotCi0gICAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIG1vbml0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIC5iZWdpblRhc2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUcmFuc2Zlck1lc3NhZ2VzLkltcG9ydFBhZ2VfZmlsdGVyU2VsZWN0aW9ucywgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLSAgICAgICAgICAgICAgICBnZXRTZWxlY3RlZFJlc291cmNlcyhmaWx0ZXIsIG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkaWFsb2cucnVuKHRydWUsIHRydWUsIHJ1bm5hYmxlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgIC8vQ291bGRuJ3Qgc3RhcnQuIERvIG5vdGhpbmcuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgLy9Hb3QgaW50ZXJydXB0ZWQuIERvIG5vdGhpbmcuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYWxsIHBhaW50IG9wZXJhdGlvbnMgY2F1c2VkIGJ5IGNsb3NpbmcgdGhlIHByb2dyZXNzIAotICAgICAgICAvLyBkaWFsb2cgZ2V0IGZsdXNoZWQsIG90aGVyd2lzZSBleHRyYSBwaXhlbHMgd2lsbCByZW1haW4gb24gdGhlIHNjcmVlbiB1bnRpbCAKLSAgICAgICAgLy8gdXBkYXRlU2VsZWN0aW9ucyBpcyBjb21wbGV0ZWQKLSAgICAgICAgZ2V0U2hlbGwoKS51cGRhdGUoKTsKLSAgICAgICAgLy8gVGhlIHVwZGF0ZVNlbGVjdGlvbnMgbWV0aG9kIGFjY2Vzc2VzIFNXVCB3aWRnZXRzIHNvIGNhbm5vdCBiZSBleGVjdXRlZAotICAgICAgICAvLyBhcyBwYXJ0IG9mIHRoZSBhYm92ZSBwcm9ncmVzcyBkaWFsb2cgb3BlcmF0aW9uIHNpbmNlIHRoZSBvcGVyYXRpb24gZm9ya3MKLSAgICAgICAgLy8gYSBuZXcgcHJvY2Vzcy4JCi0gICAgICAgIGlmIChzZWxlY3Rpb25NYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9ucyhzZWxlY3Rpb25NYXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nUGFnZS4gU2V0IHRoZSBzZWxlY3Rpb24gdXAgd2hlbiBpdCBiZWNvbWVzIHZpc2libGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgcmVzZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKHZpc2libGUpCi0gICAgICAgICAgICB0aGlzLnNvdXJjZU5hbWVGaWVsZC5zZXRGb2N1cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgc2VsZWN0aW9ucyB3aXRoIHRob3NlIGluIG1hcCAuIEltcGxlbWVudGVkIGhlcmUgdG8gZ2l2ZSBpbm5lciBjbGFzcwotICAgICAqIHZpc2liaWxpdHkKLSAgICAgKiBAcGFyYW0gbWFwIE1hcCAtIGtleSB0cmVlIGVsZW1lbnRzLCB2YWx1ZXMgTGlzdHMgb2YgbGlzdCBlbGVtZW50cwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbnMoTWFwIG1hcCkgewotICAgICAgICBzdXBlci51cGRhdGVTZWxlY3Rpb25zKG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgd2lkZ2V0cyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZCBieSBhIGNoYW5nZSBpbiB0aGUgZGlhbG9nLgotICAgICAqIFByb3ZpZGVkIGhlcmUgdG8gZ2l2ZSBhY2Nlc3MgdG8gaW5uZXIgY2xhc3Nlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpIHsKLQotICAgICAgICBzdXBlci51cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHNlbGYncyBzb3VyY2Ugc3BlY2lmaWNhdGlvbgotICAgICAqCXdpZGdldHMgY3VycmVudGx5IGFsbCBjb250YWluIHZhbGlkIHZhbHVlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNvdXJjZUdyb3VwKCkgewotICAgICAgICBGaWxlIHNvdXJjZURpcmVjdG9yeSA9IGdldFNvdXJjZURpcmVjdG9yeSgpOwotICAgICAgICBpZiAoc291cmNlRGlyZWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldE1lc3NhZ2UoU09VUkNFX0VNUFRZX01FU1NBR0UpOwotICAgICAgICAgICAgZW5hYmxlQnV0dG9uR3JvdXAoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvdXJjZUNvbmZsaWN0c1dpdGhEZXN0aW5hdGlvbihuZXcgUGF0aChzb3VyY2VEaXJlY3RvcnkuZ2V0UGF0aCgpKSkpIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShnZXRTb3VyY2VDb25mbGljdE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBlbmFibGVCdXR0b25Hcm91cChmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IHJlc291cmNlc1RvRXhwb3J0ID0gc2VsZWN0aW9uR3JvdXAuZ2V0QWxsV2hpdGVDaGVja2VkSXRlbXMoKTsKLSAgICAgICAgaWYgKHJlc291cmNlc1RvRXhwb3J0LnNpemUoKSA9PSAwKXsKLSAgICAgICAgCXNldEVycm9yTWVzc2FnZShEYXRhVHJhbnNmZXJNZXNzYWdlcy5GaWxlSW1wb3J0X25vbmVTZWxlY3RlZCk7Ci0gICAgICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCWVuYWJsZUJ1dHRvbkdyb3VwKHRydWUpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc291cmNlIGxvY2F0aW9uIGNvbmZsaWN0cwotICAgICAqIHdpdGggdGhlIGRlc3RpbmF0aW9uIHJlc291cmNlLiBUaGlzIHdpbGwgb2NjdXIgaWYKLSAgICAgKiB0aGUgc291cmNlIGlzIGFscmVhZHkgdW5kZXIgdGhlIGRlc3RpbmF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2VQYXRoIHRoZSBwYXRoIHRvIGNoZWNrCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhIGNvbmZsaWN0LCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc291cmNlQ29uZmxpY3RzV2l0aERlc3RpbmF0aW9uKElQYXRoIHNvdXJjZVBhdGgpIHsKLQotICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldFNwZWNpZmllZENvbnRhaW5lcigpOwotICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBJUGF0aCBkZXN0aW5hdGlvbkxvY2F0aW9uID0gZ2V0U3BlY2lmaWVkQ29udGFpbmVyKCkuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uTG9jYXRpb24uaXNQcmVmaXhPZihzb3VyY2VQYXRoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBudWxsIGRlc3RpbmF0aW9uIGxvY2F0aW9uIGlzIGhhbmRsZWQgaW4gCi0gICAgICAgIC8vIFdpemFyZFJlc291cmNlSW1wb3J0UGFnZSAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL1dpemFyZFByb2plY3RzSW1wb3J0UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL1dpemFyZFByb2plY3RzSW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDFiMGFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9XaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIENvcHlyaWdodCAoYykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBSZWQgSGF0LCBJbmMgLSBleHRlbnNpdmUgY2hhbmdlcyB0byBhbGxvdyBpbXBvcnRpbmcgb2YgQXJjaGl2ZSBGaWxlcwotICogICAgIFBoaWxpcHBlIE9tYnJlZGFubmUgKHBvbWJyZWRhbm5lQG5leGIuY29tKQotICogICAgIAkJLSBCdWcgMTAxMTgwIFtJbXBvcnQvRXhwb3J0XSBJbXBvcnQgRXhpc3RpbmcgUHJvamVjdCBpbnRvIFdvcmtzcGFjZSBkZWZhdWx0IHdpZGdldCBpcyBiYWNrIGJ1dHRvbiAsIHNob3VsZCBiZSB0ZXh0IGZpZWxkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSU92ZXJ3cml0ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5GaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkltcG9ydE9wZXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlIGlzIHRoZSBwYWdlIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGltcG9ydAotICogcHJvamVjdHMgZnJvbSBhIHBhcnRpY3VsYXIgbG9jYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSU92ZXJ3cml0ZVF1ZXJ5IHsKLQotCS8qKgotCSAqIENsYXNzIGRlY2xhcmVkIHB1YmxpYyBvbmx5IGZvciB0ZXN0IHN1aXRlLiAKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBQcm9qZWN0UmVjb3JkIHsKLQkJRmlsZSBwcm9qZWN0U3lzdGVtRmlsZTsKLQotCQlPYmplY3QgcHJvamVjdEFyY2hpdmVGaWxlOwotCi0JCVN0cmluZyBwcm9qZWN0TmFtZTsKLQotCQlPYmplY3QgcGFyZW50OwotCi0JCWludCBsZXZlbDsKLQotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOwotCi0JCUlMZXZlbGVkSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXI7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhIHJlY29yZCBmb3IgYSBwcm9qZWN0IGJhc2VkIG9uIHRoZSBpbmZvIGluIHRoZSBmaWxlLgotCQkgKiAKLQkJICogQHBhcmFtIGZpbGUKLQkJICovCi0JCVByb2plY3RSZWNvcmQoRmlsZSBmaWxlKSB7Ci0JCQlwcm9qZWN0U3lzdGVtRmlsZSA9IGZpbGU7Ci0JCQlzZXRQcm9qZWN0TmFtZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBmaWxlCi0JCSAqICAgICAgICAgICAgVGhlIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIC5wcm9qZWN0IGZpbGUKLQkJICogQHBhcmFtIHBhcmVudAotCQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgZm9sZGVyIG9mIHRoZSAucHJvamVjdCBmaWxlCi0JCSAqIEBwYXJhbSBsZXZlbAotCQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgbGV2ZWxzIGRlZXAgaW4gdGhlIHByb3ZpZGVyIHRoZSBmaWxlIGlzCi0JCSAqIEBwYXJhbSBlbnRyeVByb3ZpZGVyCi0JCSAqICAgICAgICAgICAgVGhlIHByb3ZpZGVyIGZvciB0aGUgYXJjaGl2ZSBmaWxlIHRoYXQgY29udGFpbnMgaXQKLQkJICovCi0JCVByb2plY3RSZWNvcmQoT2JqZWN0IGZpbGUsIE9iamVjdCBwYXJlbnQsIGludCBsZXZlbCwKLQkJCQlJTGV2ZWxlZEltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIGVudHJ5UHJvdmlkZXIpIHsKLQkJCXRoaXMucHJvamVjdEFyY2hpdmVGaWxlID0gZmlsZTsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy5sZXZlbCA9IGxldmVsOwotCQkJdGhpcy5wcm92aWRlciA9IGVudHJ5UHJvdmlkZXI7Ci0JCQlzZXRQcm9qZWN0TmFtZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBiYXNlZCBvbiB0aGUgcHJvamVjdEZpbGUuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0UHJvamVjdE5hbWUoKSB7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIG5ld0Rlc2NyaXB0aW9uID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKHByb2plY3RBcmNoaXZlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IHByb3ZpZGVyCi0JCQkJCQkJLmdldENvbnRlbnRzKHByb2plY3RBcmNoaXZlRmlsZSk7Ci0JCQkJCW5ld0Rlc2NyaXB0aW9uID0gSURFV29ya2JlbmNoUGx1Z2luLmdldFBsdWdpbldvcmtzcGFjZSgpCi0JCQkJCQkJLmxvYWRQcm9qZWN0RGVzY3JpcHRpb24oc3RyZWFtKTsKLQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHByb2plY3RTeXN0ZW1GaWxlLmdldFBhdGgoKSk7Ci0JCQkJCW5ld0Rlc2NyaXB0aW9uID0gSURFV29ya2JlbmNoUGx1Z2luLmdldFBsdWdpbldvcmtzcGFjZSgpCi0JCQkJCQkJLmxvYWRQcm9qZWN0RGVzY3JpcHRpb24ocGF0aCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm8gZ29vZCBjb3VsZG4ndCBnZXQgdGhlIG5hbWUKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBubyBnb29kIGNvdWxkbid0IGdldCB0aGUgbmFtZQotCQkJfQotCi0JCQlpZiAobmV3RGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJCXRoaXMuZGVzY3JpcHRpb24gPSBudWxsOwotCQkJCXByb2plY3ROYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5kZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQkJCXByb2plY3ROYW1lID0gdGhpcy5kZXNjcmlwdGlvbi5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogR2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0Ci0JCSAqIAotCQkgKiBAcmV0dXJuIFN0cmluZwotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJCXJldHVybiBwcm9qZWN0TmFtZTsKLQkJfQotCX0KLSAgICAKLSAgICAvLyBkaWFsb2cgc3RvcmUgaWQgY29uc3RhbnRzCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUT1JFX0NPUFlfUFJPSkVDVF9JRCA9ICJXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2UuU1RPUkVfQ09QWV9QUk9KRUNUX0lEIjsgLy8kTk9OLU5MUy0xJAotCQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVE9SRV9BUkNISVZFX1NFTEVDVEVEID0gIldpemFyZFByb2plY3RzSW1wb3J0UGFnZS5TVE9SRV9BUkNISVZFX1NFTEVDVEVEIjsJLy8kTk9OLU5MUy0xJAotICAgIAotCXByaXZhdGUgVGV4dCBkaXJlY3RvcnlQYXRoRmllbGQ7Ci0KLQlwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlciBwcm9qZWN0c0xpc3Q7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY29weUNoZWNrYm94OwotCQotCXByaXZhdGUgYm9vbGVhbiBjb3B5RmlsZXMgPSBmYWxzZTsKLQotCXByaXZhdGUgUHJvamVjdFJlY29yZFtdIHNlbGVjdGVkUHJvamVjdHMgPSBuZXcgUHJvamVjdFJlY29yZFswXTsKLQotCS8vIEtlZXAgdHJhY2sgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IHdlIGJyb3dzZWQgdG8gbGFzdCB0aW1lCi0JLy8gdGhlIHdpemFyZCB3YXMgaW52b2tlZC4KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJldmlvdXNseUJyb3dzZWREaXJlY3RvcnkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gS2VlcCB0cmFjayBvZiB0aGUgYXJjaGl2ZSB0aGF0IHdlIGJyb3dzZWQgdG8gbGFzdCB0aW1lCi0JLy8gdGhlIHdpemFyZCB3YXMgaW52b2tlZC4KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJldmlvdXNseUJyb3dzZWRBcmNoaXZlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQnV0dG9uIHByb2plY3RGcm9tRGlyZWN0b3J5UmFkaW87Ci0KLQlwcml2YXRlIEJ1dHRvbiBwcm9qZWN0RnJvbUFyY2hpdmVSYWRpbzsKLQotCXByaXZhdGUgVGV4dCBhcmNoaXZlUGF0aEZpZWxkOwotCi0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlRGlyZWN0b3JpZXNCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VBcmNoaXZlc0J1dHRvbjsKLQkKLQlwcml2YXRlIElQcm9qZWN0W10gd3NQcm9qZWN0czsKLQotCS8vIGNvbnN0YW50IGZyb20gV2l6YXJkQXJjaGl2ZUZpbGVSZXNvdXJjZUltcG9ydFBhZ2UxCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRklMRV9JTVBPUlRfTUFTSyA9IHsKLQkJCSIqLmphcjsqLnppcDsqLnRhcjsqLnRhci5nejsqLnRneiIsICIqLioiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLy9UaGUgbGFzdCBzZWxlY3RlZCBwYXRoIHRvIG1pbWl6ZSBzZWFyY2hlcwotCXByaXZhdGUgU3RyaW5nIGxhc3RQYXRoOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0IGNyZWF0aW9uIHdpemFyZCBwYWdlLgotCSAqIAotCSAqLwotCXB1YmxpYyBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2UoKSB7Ci0JCXRoaXMoIndpemFyZEV4dGVybmFsUHJvamVjdHNQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJc2V0VGl0bGUoRGF0YVRyYW5zZmVyTWVzc2FnZXMuV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlX0ltcG9ydFByb2plY3RzVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihEYXRhVHJhbnNmZXJNZXNzYWdlcy5XaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfSW1wb3J0UHJvamVjdHNEZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gdGl0bGVJbWFnZQotCSAqLwotCXB1YmxpYyBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgdGl0bGUsCi0JCQlJbWFnZURlc2NyaXB0b3IgdGl0bGVJbWFnZSkgewotCQlzdXBlcihwYWdlTmFtZSwgdGl0bGUsIHRpdGxlSW1hZ2UpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotCQlDb21wb3NpdGUgd29ya0FyZWEgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlzZXRDb250cm9sKHdvcmtBcmVhKTsKLQotCQl3b3JrQXJlYS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXdvcmtBcmVhLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USAotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCi0JCWNyZWF0ZVByb2plY3RzUm9vdCh3b3JrQXJlYSk7Ci0JCWNyZWF0ZVByb2plY3RzTGlzdCh3b3JrQXJlYSk7Ci0JCWNyZWF0ZU9wdGlvbnNBcmVhKHdvcmtBcmVhKTsKLQkJcmVzdG9yZVdpZGdldFZhbHVlcygpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHdvcmtBcmVhKTsKLQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGFyZWEgd2l0aCB0aGUgZXh0cmEgb3B0aW9ucy4KLQkgKiBAcGFyYW0gd29ya0FyZWEKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlT3B0aW9uc0FyZWEoQ29tcG9zaXRlIHdvcmtBcmVhKXsKLQkJQ29tcG9zaXRlIG9wdGlvbnNHcm91cCA9IG5ldyBDb21wb3NpdGUod29ya0FyZWEsIFNXVC5OT05FKTsKLQkJb3B0aW9uc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJb3B0aW9uc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJY29weUNoZWNrYm94ID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNvcHlDaGVja2JveC5zZXRUZXh0KERhdGFUcmFuc2Zlck1lc3NhZ2VzLldpemFyZFByb2plY3RzSW1wb3J0UGFnZV9Db3B5UHJvamVjdHNJbnRvV29ya3NwYWNlKTsKLQkJY29weUNoZWNrYm94LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljb3B5Q2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljb3B5RmlsZXMgPSBjb3B5Q2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgY2hlY2tib3ggbGlzdCBmb3IgdGhlIGZvdW5kIHByb2plY3RzLgotCSAqIAotCSAqIEBwYXJhbSB3b3JrQXJlYQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0c0xpc3QoQ29tcG9zaXRlIHdvcmtBcmVhKSB7Ci0KLQkJTGFiZWwgdGl0bGUgPSBuZXcgTGFiZWwod29ya0FyZWEsIFNXVC5OT05FKTsKLQkJdGl0bGUKLQkJCQkuc2V0VGV4dChEYXRhVHJhbnNmZXJNZXNzYWdlcy5XaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfUHJvamVjdHNMaXN0VGl0bGUpOwotCi0JCUNvbXBvc2l0ZSBsaXN0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh3b3JrQXJlYSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotCQlsaXN0Q29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCWxpc3RDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJcHJvamVjdHNMaXN0ID0gbmV3IENoZWNrYm94VHJlZVZpZXdlcihsaXN0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgbGlzdERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJcHJvamVjdHNMaXN0LmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGxpc3REYXRhKTsKLQotCQlwcm9qZWN0c0xpc3Quc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0VmFsaWRQcm9qZWN0cygpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQotCQl9KTsKLQotCQlwcm9qZWN0c0xpc3Quc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoUHJvamVjdFJlY29yZCkgZWxlbWVudCkuZ2V0UHJvamVjdE5hbWUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHJvamVjdHNMaXN0LnNldElucHV0KHRoaXMpOwotCQlwcm9qZWN0c0xpc3Quc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCWNyZWF0ZVNlbGVjdGlvbkJ1dHRvbnMobGlzdENvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBzZWxlY3Rpb24gYnV0dG9ucyBpbiB0aGUgbGlzdENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdENvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxlY3Rpb25CdXR0b25zKENvbXBvc2l0ZSBsaXN0Q29tcG9zaXRlKSB7Ci0JCUNvbXBvc2l0ZSBidXR0b25zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShsaXN0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQlCdXR0b24gc2VsZWN0QWxsID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbC5zZXRUZXh0KERhdGFUcmFuc2Zlck1lc3NhZ2VzLkRhdGFUcmFuc2Zlcl9zZWxlY3RBbGwpOwotCQlzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcHJvamVjdHNMaXN0LnNldENoZWNrZWRFbGVtZW50cyhzZWxlY3RlZFByb2plY3RzKTsKLQkJCX0KLQkJfSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc2VsZWN0QWxsKTsKLQkJc2V0QnV0dG9uTGF5b3V0RGF0YShzZWxlY3RBbGwpOwotCi0JCUJ1dHRvbiBkZXNlbGVjdEFsbCA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbC5zZXRUZXh0KERhdGFUcmFuc2Zlck1lc3NhZ2VzLkRhdGFUcmFuc2Zlcl9kZXNlbGVjdEFsbCk7Ci0JCWRlc2VsZWN0QWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCQkJcHJvamVjdHNMaXN0LnNldENoZWNrZWRFbGVtZW50cyhuZXcgT2JqZWN0WzBdKTsKLQotCQkJfQotCQl9KTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChkZXNlbGVjdEFsbCk7Ci0JCXNldEJ1dHRvbkxheW91dERhdGEoZGVzZWxlY3RBbGwpOwotCi0JCUJ1dHRvbiByZWZyZXNoID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCXJlZnJlc2guc2V0VGV4dChEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfcmVmcmVzaCk7Ci0JCXJlZnJlc2guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHByb2plY3RGcm9tRGlyZWN0b3J5UmFkaW8uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCXVwZGF0ZVByb2plY3RzTGlzdChkaXJlY3RvcnlQYXRoRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJZWxzZQotCQkJCQl1cGRhdGVQcm9qZWN0c0xpc3QoYXJjaGl2ZVBhdGhGaWVsZC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCX0KLQkJfSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocmVmcmVzaCk7Ci0JCXNldEJ1dHRvbkxheW91dERhdGEocmVmcmVzaCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBhcmVhIHdoZXJlIHlvdSBzZWxlY3QgdGhlIHJvb3QgZGlyZWN0b3J5IGZvciB0aGUgcHJvamVjdHMuCi0JICogCi0JICogQHBhcmFtIHdvcmtBcmVhCi0JICogICAgICAgICAgICBDb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdHNSb290KENvbXBvc2l0ZSB3b3JrQXJlYSkgewotCi0JCS8vIHByb2plY3Qgc3BlY2lmaWNhdGlvbiBncm91cAotCQlDb21wb3NpdGUgcHJvamVjdEdyb3VwID0gbmV3IENvbXBvc2l0ZSh3b3JrQXJlYSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwcm9qZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXByb2plY3RHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkvLyBuZXcgcHJvamVjdCBmcm9tIGRpcmVjdG9yeSByYWRpbyBidXR0b24KLQkJcHJvamVjdEZyb21EaXJlY3RvcnlSYWRpbyA9IG5ldyBCdXR0b24ocHJvamVjdEdyb3VwLCBTV1QuUkFESU8pOwotCQlwcm9qZWN0RnJvbURpcmVjdG9yeVJhZGlvCi0JCQkJLnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlX1Jvb3RTZWxlY3RUaXRsZSk7Ci0KLQkJLy8gcHJvamVjdCBsb2NhdGlvbiBlbnRyeSBmaWVsZAotCQl0aGlzLmRpcmVjdG9yeVBhdGhGaWVsZCA9IG5ldyBUZXh0KHByb2plY3RHcm91cCwgU1dULkJPUkRFUik7Ci0KLQkJdGhpcy5kaXJlY3RvcnlQYXRoRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gYnJvd3NlIGJ1dHRvbgotCQlicm93c2VEaXJlY3Rvcmllc0J1dHRvbiA9IG5ldyBCdXR0b24ocHJvamVjdEdyb3VwLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZURpcmVjdG9yaWVzQnV0dG9uCi0JCQkJLnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuRGF0YVRyYW5zZmVyX2Jyb3dzZSk7Ci0JCXNldEJ1dHRvbkxheW91dERhdGEoYnJvd3NlRGlyZWN0b3JpZXNCdXR0b24pOwotCi0JCS8vIG5ldyBwcm9qZWN0IGZyb20gYXJjaGl2ZSByYWRpbyBidXR0b24KLQkJcHJvamVjdEZyb21BcmNoaXZlUmFkaW8gPSBuZXcgQnV0dG9uKHByb2plY3RHcm91cCwgU1dULlJBRElPKTsKLQkJcHJvamVjdEZyb21BcmNoaXZlUmFkaW8KLQkJCQkuc2V0VGV4dChEYXRhVHJhbnNmZXJNZXNzYWdlcy5XaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfQXJjaGl2ZVNlbGVjdFRpdGxlKTsKLQotCQkvLyBwcm9qZWN0IGxvY2F0aW9uIGVudHJ5IGZpZWxkCi0JCWFyY2hpdmVQYXRoRmllbGQgPSBuZXcgVGV4dChwcm9qZWN0R3JvdXAsIFNXVC5CT1JERVIpOwotCi0JCWFyY2hpdmVQYXRoRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJLy8gYnJvd3NlIGJ1dHRvbgotCQlicm93c2VBcmNoaXZlc0J1dHRvbiA9IG5ldyBCdXR0b24ocHJvamVjdEdyb3VwLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUFyY2hpdmVzQnV0dG9uLnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuRGF0YVRyYW5zZmVyX2Jyb3dzZSk7Ci0JCXNldEJ1dHRvbkxheW91dERhdGEoYnJvd3NlQXJjaGl2ZXNCdXR0b24pOwotCi0JCXByb2plY3RGcm9tRGlyZWN0b3J5UmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlhcmNoaXZlUGF0aEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQlicm93c2VBcmNoaXZlc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlicm93c2VEaXJlY3Rvcmllc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyI3dpZGdldFMKLQkJCSAqICAgICAgZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlTG9jYXRpb25EaXJlY3RvcnlCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJYnJvd3NlQXJjaGl2ZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlTG9jYXRpb25BcmNoaXZlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCi0JCX0pOwotCi0JCWRpcmVjdG9yeVBhdGhGaWVsZC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lciNrZXlUcmF2ZXJzZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCXVwZGF0ZVByb2plY3RzTGlzdChkaXJlY3RvcnlQYXRoRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWRpcmVjdG9yeVBhdGhGaWVsZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyI2ZvY3VzTG9zdChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQgZSkgewotCQkJCXVwZGF0ZVByb2plY3RzTGlzdChkaXJlY3RvcnlQYXRoRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0KLQkJYXJjaGl2ZVBhdGhGaWVsZC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lciNrZXlUcmF2ZXJzZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCXVwZGF0ZVByb2plY3RzTGlzdChhcmNoaXZlUGF0aEZpZWxkLmdldFRleHQoKS50cmltKCkpOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQotCQlhcmNoaXZlUGF0aEZpZWxkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyI2ZvY3VzTG9zdChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQgZSkgewotCQkJCXVwZGF0ZVByb2plY3RzTGlzdChhcmNoaXZlUGF0aEZpZWxkLmdldFRleHQoKS50cmltKCkpOwotCQkJfQotCQl9KTsKLQotCQlwcm9qZWN0RnJvbURpcmVjdG9yeVJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlkaXJlY3RvcnlSYWRpb1NlbGVjdGVkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXByb2plY3RGcm9tQXJjaGl2ZVJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhcmNoaXZlUmFkaW9TZWxlY3RlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFyY2hpdmVSYWRpb1NlbGVjdGVkKCl7Ci0JCWlmIChwcm9qZWN0RnJvbUFyY2hpdmVSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotCQkJZGlyZWN0b3J5UGF0aEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJYnJvd3NlRGlyZWN0b3JpZXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlhcmNoaXZlUGF0aEZpZWxkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlicm93c2VBcmNoaXZlc0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJdXBkYXRlUHJvamVjdHNMaXN0KGFyY2hpdmVQYXRoRmllbGQuZ2V0VGV4dCgpKTsKLQkJCWFyY2hpdmVQYXRoRmllbGQuc2V0Rm9jdXMoKTsKLQkJCWNvcHlDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQljb3B5Q2hlY2tib3guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlyZWN0b3J5UmFkaW9TZWxlY3RlZCgpewotCQlpZiAocHJvamVjdEZyb21EaXJlY3RvcnlSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotCQkJZGlyZWN0b3J5UGF0aEZpZWxkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlicm93c2VEaXJlY3Rvcmllc0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJYXJjaGl2ZVBhdGhGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWJyb3dzZUFyY2hpdmVzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdXBkYXRlUHJvamVjdHNMaXN0KGRpcmVjdG9yeVBhdGhGaWVsZC5nZXRUZXh0KCkpOwotCQkJZGlyZWN0b3J5UGF0aEZpZWxkLnNldEZvY3VzKCk7Ci0JCQljb3B5Q2hlY2tib3guc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWNvcHlDaGVja2JveC5zZXRTZWxlY3Rpb24oY29weUZpbGVzKTsKLQkJfQkJCi0JfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nUGFnZS4gU2V0IHRoZSBmb2N1cyBvbiBwYXRoIGZpZWxkcyB3aGVuIHBhZ2UgYmVjb21lcyB2aXNpYmxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgIGlmICh2aXNpYmxlICYmIHRoaXMucHJvamVjdEZyb21EaXJlY3RvcnlSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAJdGhpcy5kaXJlY3RvcnlQYXRoRmllbGQuc2V0Rm9jdXMoKTsKLSAgICAgICAgfSAKLSAgICAgICAgaWYgKHZpc2libGUgJiYgdGhpcy5wcm9qZWN0RnJvbUFyY2hpdmVSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAJdGhpcy5hcmNoaXZlUGF0aEZpZWxkLnNldEZvY3VzKCk7Ci0gICAgICAgIH0gIAotICAgIH0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgbGlzdCBvZiBwcm9qZWN0cyBiYXNlZCBvbiBwYXRoLgotCSAqIE1ldGhvZCBkZWNsYXJlZCBwdWJsaWMgb25seSBmb3IgdGVzdCBzdWl0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2plY3RzTGlzdChmaW5hbCBTdHJpbmcgcGF0aCkgewotCQkKLQkJaWYocGF0aC5lcXVhbHMobGFzdFBhdGgpKS8vRG8gbm90IHNlbGVjdCB0aGUgc2FtZSBwYXRoIGFnYWluCi0JCQlyZXR1cm47Ci0JCQotCQlsYXN0UGF0aCA9IHBhdGg7Ci0JCQotCQkvLyBvbiBhbiBlbXB0eSBwYXRoIGVtcHR5IHNlbGVjdGVkUHJvamVjdHMKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCXNlbGVjdGVkUHJvamVjdHMgPSBuZXcgUHJvamVjdFJlY29yZFswXTsKLQkJCXByb2plY3RzTGlzdC5yZWZyZXNoKHRydWUpOwotCQkJcHJvamVjdHNMaXN0LnNldENoZWNrZWRFbGVtZW50cyhzZWxlY3RlZFByb2plY3RzKTsKLQkJCXNldFBhZ2VDb21wbGV0ZShnZXRWYWxpZFByb2plY3RzKCkubGVuZ3RoID4gMCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gV2UgY2FuJ3QgYWNjZXNzIHRoZSByYWRpbyBidXR0b24gZnJvbSB0aGUgaW5uZXIgY2xhc3Mgc28gZ2V0IHRoZQotCQkvLyBzdGF0dXMgYmVmb3JlaGFuZAotCQlmaW5hbCBib29sZWFuIGRpclNlbGVjdGVkID0gdGhpcy5wcm9qZWN0RnJvbURpcmVjdG9yeVJhZGlvCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQkJCQltb25pdG9yCi0JCQkJCQkJLmJlZ2luVGFzaygKLQkJCQkJCQkJCURhdGFUcmFuc2Zlck1lc3NhZ2VzLldpemFyZFByb2plY3RzSW1wb3J0UGFnZV9TZWFyY2hpbmdNZXNzYWdlLAotCQkJCQkJCQkJMTAwKTsKLQkJCQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShwYXRoKTsKLQkJCQkJc2VsZWN0ZWRQcm9qZWN0cyA9IG5ldyBQcm9qZWN0UmVjb3JkWzBdOwotCQkJCQlDb2xsZWN0aW9uIGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQltb25pdG9yLndvcmtlZCgxMCk7Ci0JCQkJCWlmICghZGlyU2VsZWN0ZWQKLQkJCQkJCQkmJiBBcmNoaXZlRmlsZU1hbmlwdWxhdGlvbnMuaXNUYXJGaWxlKHBhdGgpKSB7Ci0JCQkJCQlUYXJGaWxlIHNvdXJjZVRhckZpbGUgPSBnZXRTcGVjaWZpZWRUYXJTb3VyY2VGaWxlKHBhdGgpOwotCQkJCQkJaWYgKHNvdXJjZVRhckZpbGUgPT0gbnVsbCkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQkJVGFyTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gQXJjaGl2ZUZpbGVNYW5pcHVsYXRpb25zCi0JCQkJCQkJCS5nZXRUYXJTdHJ1Y3R1cmVQcm92aWRlcihzb3VyY2VUYXJGaWxlLAotCQkJCQkJCQkJCWdldENvbnRhaW5lcigpLmdldFNoZWxsKCkpOwotCQkJCQkJT2JqZWN0IGNoaWxkID0gcHJvdmlkZXIuZ2V0Um9vdCgpOwotCi0JCQkJCQlpZiAoIWNvbGxlY3RQcm9qZWN0RmlsZXNGcm9tUHJvdmlkZXIoZmlsZXMsIHByb3ZpZGVyLAotCQkJCQkJCQljaGlsZCwgMCwgbW9uaXRvcikpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJSXRlcmF0b3IgZmlsZXNJdGVyYXRvciA9IGZpbGVzLml0ZXJhdG9yKCk7Ci0JCQkJCQlzZWxlY3RlZFByb2plY3RzID0gbmV3IFByb2plY3RSZWNvcmRbZmlsZXMuc2l6ZSgpXTsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQltb25pdG9yLndvcmtlZCg1MCk7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKERhdGFUcmFuc2Zlck1lc3NhZ2VzLldpemFyZFByb2plY3RzSW1wb3J0UGFnZV9Qcm9jZXNzaW5nTWVzc2FnZSk7Ci0JCQkJCQl3aGlsZSAoZmlsZXNJdGVyYXRvci5oYXNOZXh0KCkpCi0JCQkJCQkJc2VsZWN0ZWRQcm9qZWN0c1tpbmRleCsrXSA9IChQcm9qZWN0UmVjb3JkKSBmaWxlc0l0ZXJhdG9yCi0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQl9IGVsc2UgaWYgKCFkaXJTZWxlY3RlZAotCQkJCQkJCSYmIEFyY2hpdmVGaWxlTWFuaXB1bGF0aW9ucy5pc1ppcEZpbGUocGF0aCkpIHsKLQkJCQkJCVppcEZpbGUgc291cmNlRmlsZSA9IGdldFNwZWNpZmllZFppcFNvdXJjZUZpbGUocGF0aCk7Ci0JCQkJCQlpZiAoc291cmNlRmlsZSA9PSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJWmlwTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gQXJjaGl2ZUZpbGVNYW5pcHVsYXRpb25zCi0JCQkJCQkJCS5nZXRaaXBTdHJ1Y3R1cmVQcm92aWRlcihzb3VyY2VGaWxlLAotCQkJCQkJCQkJCWdldENvbnRhaW5lcigpLmdldFNoZWxsKCkpOwotCQkJCQkJT2JqZWN0IGNoaWxkID0gcHJvdmlkZXIuZ2V0Um9vdCgpOwotCi0JCQkJCQlpZiAoIWNvbGxlY3RQcm9qZWN0RmlsZXNGcm9tUHJvdmlkZXIoZmlsZXMsIHByb3ZpZGVyLAotCQkJCQkJCQljaGlsZCwgMCwgbW9uaXRvcikpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJSXRlcmF0b3IgZmlsZXNJdGVyYXRvciA9IGZpbGVzLml0ZXJhdG9yKCk7Ci0JCQkJCQlzZWxlY3RlZFByb2plY3RzID0gbmV3IFByb2plY3RSZWNvcmRbZmlsZXMuc2l6ZSgpXTsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQltb25pdG9yLndvcmtlZCg1MCk7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKERhdGFUcmFuc2Zlck1lc3NhZ2VzLldpemFyZFByb2plY3RzSW1wb3J0UGFnZV9Qcm9jZXNzaW5nTWVzc2FnZSk7Ci0JCQkJCQl3aGlsZSAoZmlsZXNJdGVyYXRvci5oYXNOZXh0KCkpCi0JCQkJCQkJc2VsZWN0ZWRQcm9qZWN0c1tpbmRleCsrXSA9IChQcm9qZWN0UmVjb3JkKSBmaWxlc0l0ZXJhdG9yCi0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQl9Ci0KLQkJCQkJZWxzZSBpZiAoZGlyU2VsZWN0ZWQgJiYgZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLQotCQkJCQkJaWYgKCFjb2xsZWN0UHJvamVjdEZpbGVzRnJvbURpcmVjdG9yeShmaWxlcywgZGlyZWN0b3J5LAotCQkJCQkJCQltb25pdG9yKSkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlJdGVyYXRvciBmaWxlc0l0ZXJhdG9yID0gZmlsZXMuaXRlcmF0b3IoKTsKLQkJCQkJCXNlbGVjdGVkUHJvamVjdHMgPSBuZXcgUHJvamVjdFJlY29yZFtmaWxlcy5zaXplKCldOwotCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDUwKTsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnN1YlRhc2soRGF0YVRyYW5zZmVyTWVzc2FnZXMuV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlX1Byb2Nlc3NpbmdNZXNzYWdlKTsKLQkJCQkJCXdoaWxlIChmaWxlc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBmaWxlc0l0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlzZWxlY3RlZFByb2plY3RzW2luZGV4XSA9IG5ldyBQcm9qZWN0UmVjb3JkKGZpbGUpOwotCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZQotCQkJCQkJbW9uaXRvci53b3JrZWQoNjApOwotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCUlERVdvcmtiZW5jaFBsdWdpbi5sb2coZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBOb3RoaW5nIHRvIGRvIGlmIHRoZSB1c2VyIGludGVycnVwdHMuCi0JCX0KLQotCQlwcm9qZWN0c0xpc3QucmVmcmVzaCh0cnVlKTsKLQkJcHJvamVjdHNMaXN0LnNldENoZWNrZWRFbGVtZW50cyhnZXRWYWxpZFByb2plY3RzKCkpOwotCQlzZXRQYWdlQ29tcGxldGUoZ2V0VmFsaWRQcm9qZWN0cygpLmxlbmd0aCA+IDApOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciBhIGhhbmRsZSB0byB0aGUgemlwIGZpbGUgY3VycmVudGx5IHNwZWNpZmllZCBhcyBiZWluZyB0aGUgc291cmNlLgotCSAqIFJldHVybiBudWxsIGlmIHRoaXMgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3Qgb2YgdmFsaWQgZm9ybWF0LgotCSAqLwotCXByb3RlY3RlZCBaaXBGaWxlIGdldFNwZWNpZmllZFppcFNvdXJjZUZpbGUoKSB7Ci0JCXJldHVybiBnZXRTcGVjaWZpZWRaaXBTb3VyY2VGaWxlKGFyY2hpdmVQYXRoRmllbGQuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBoYW5kbGUgdG8gdGhlIHppcCBmaWxlIGN1cnJlbnRseSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIHNvdXJjZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGlzIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IG9mIHZhbGlkIGZvcm1hdC4KLQkgKi8KLQlwcml2YXRlIFppcEZpbGUgZ2V0U3BlY2lmaWVkWmlwU291cmNlRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYgKGZpbGVOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBaaXBGaWxlKGZpbGVOYW1lKTsKLQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKLQkJCWRpc3BsYXlFcnJvckRpYWxvZyhEYXRhVHJhbnNmZXJNZXNzYWdlcy5aaXBJbXBvcnRfYmFkRm9ybWF0KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZGlzcGxheUVycm9yRGlhbG9nKERhdGFUcmFuc2Zlck1lc3NhZ2VzLlppcEltcG9ydF9jb3VsZE5vdFJlYWQpOwotCQl9Ci0KLQkJYXJjaGl2ZVBhdGhGaWVsZC5zZXRGb2N1cygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBoYW5kbGUgdG8gdGhlIHppcCBmaWxlIGN1cnJlbnRseSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIHNvdXJjZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGlzIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IG9mIHZhbGlkIGZvcm1hdC4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFyRmlsZSBnZXRTcGVjaWZpZWRUYXJTb3VyY2VGaWxlKCkgewotCQlyZXR1cm4gZ2V0U3BlY2lmaWVkVGFyU291cmNlRmlsZShhcmNoaXZlUGF0aEZpZWxkLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIGEgaGFuZGxlIHRvIHRoZSB6aXAgZmlsZSBjdXJyZW50bHkgc3BlY2lmaWVkIGFzIGJlaW5nIHRoZSBzb3VyY2UuCi0JICogUmV0dXJuIG51bGwgaWYgdGhpcyBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBvZiB2YWxpZCBmb3JtYXQuCi0JICovCi0JcHJpdmF0ZSBUYXJGaWxlIGdldFNwZWNpZmllZFRhclNvdXJjZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVGFyRmlsZShmaWxlTmFtZSk7Ci0JCX0gY2F0Y2ggKFRhckV4Y2VwdGlvbiBlKSB7Ci0JCQlkaXNwbGF5RXJyb3JEaWFsb2coRGF0YVRyYW5zZmVyTWVzc2FnZXMuVGFySW1wb3J0X2JhZEZvcm1hdCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWRpc3BsYXlFcnJvckRpYWxvZyhEYXRhVHJhbnNmZXJNZXNzYWdlcy5aaXBJbXBvcnRfY291bGROb3RSZWFkKTsKLQkJfQotCi0JCWFyY2hpdmVQYXRoRmllbGQuc2V0Rm9jdXMoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cgd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheUVycm9yRGlhbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0JCQkJZ2V0RXJyb3JEaWFsb2dUaXRsZSgpLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHRpdGxlIGZvciBhbiBlcnJvciBkaWFsb2cuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JEaWFsb2dUaXRsZSgpIHsKLQkJcmV0dXJuIElERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZEV4cG9ydFBhZ2VfaW50ZXJuYWxFcnJvclRpdGxlOwotCX0KLQotCS8qKgotCSAqIENvbGxlY3QgdGhlIGxpc3Qgb2YgLnByb2plY3QgZmlsZXMgdGhhdCBhcmUgdW5kZXIgZGlyZWN0b3J5IGludG8gZmlsZXMuCi0JICogCi0JICogQHBhcmFtIGZpbGVzCi0JICogQHBhcmFtIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBUaGUgbW9uaXRvciB0byByZXBvcnQgdG8KLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9wZXJhdGlvbiB3YXMgY29tcGxldGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb2xsZWN0UHJvamVjdEZpbGVzRnJvbURpcmVjdG9yeShDb2xsZWN0aW9uIGZpbGVzLAotCQkJRmlsZSBkaXJlY3RvcnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKAotCQkJCURhdGFUcmFuc2Zlck1lc3NhZ2VzLldpemFyZFByb2plY3RzSW1wb3J0UGFnZV9DaGVja2luZ01lc3NhZ2UsCi0JCQkJZGlyZWN0b3J5LmdldFBhdGgoKSkpOwotCQlGaWxlW10gY29udGVudHMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCS8vIGZpcnN0IGxvb2sgZm9yIHByb2plY3QgZGVzY3JpcHRpb24gZmlsZXMKLQkJZmluYWwgU3RyaW5nIGRvdFByb2plY3QgPSBJUHJvamVjdERlc2NyaXB0aW9uLkRFU0NSSVBUSU9OX0ZJTEVfTkFNRTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBmaWxlID0gY29udGVudHNbaV07Ci0JCQlpZiAoZmlsZS5pc0ZpbGUoKSAmJiBmaWxlLmdldE5hbWUoKS5lcXVhbHMoZG90UHJvamVjdCkpIHsKLQkJCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCQkJLy8gZG9uJ3Qgc2VhcmNoIHN1Yi1kaXJlY3RvcmllcyBzaW5jZSB3ZSBjYW4ndCBoYXZlIG5lc3RlZAotCQkJCS8vIHByb2plY3RzCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gcHJvamVjdCBkZXNjcmlwdGlvbiBmb3VuZCwgc28gcmVjdXJzZSBpbnRvIHN1Yi1kaXJlY3RvcmllcwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udGVudHNbaV0uaXNEaXJlY3RvcnkoKSkKLQkJCQlpZiAoIWNvbnRlbnRzW2ldLmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlJREVBcHBsaWNhdGlvbi5NRVRBREFUQV9GT0xERVIpKQotCQkJCQljb2xsZWN0UHJvamVjdEZpbGVzRnJvbURpcmVjdG9yeShmaWxlcywgY29udGVudHNbaV0sCi0JCQkJCQkJbW9uaXRvcik7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ29sbGVjdCB0aGUgbGlzdCBvZiAucHJvamVjdCBmaWxlcyB0aGF0IGFyZSB1bmRlciBkaXJlY3RvcnkgaW50byBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXMKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIG1vbml0b3IgdG8gcmVwb3J0IHRvCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gd2FzIGNvbXBsZXRlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29sbGVjdFByb2plY3RGaWxlc0Zyb21Qcm92aWRlcihDb2xsZWN0aW9uIGZpbGVzLAotCQkJSUxldmVsZWRJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlciwgT2JqZWN0IGVudHJ5LCBpbnQgbGV2ZWwsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZCgKLQkJCQlEYXRhVHJhbnNmZXJNZXNzYWdlcy5XaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfQ2hlY2tpbmdNZXNzYWdlLAotCQkJCXByb3ZpZGVyLmdldExhYmVsKGVudHJ5KSkpOwotCQlMaXN0IGNoaWxkcmVuID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZW50cnkpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KDEpOwotCQl9Ci0JCUl0ZXJhdG9yIGNoaWxkcmVuRW51bSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjaGlsZHJlbkVudW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBjaGlsZHJlbkVudW0ubmV4dCgpOwotCQkJaWYgKHByb3ZpZGVyLmlzRm9sZGVyKGNoaWxkKSkKLQkJCQljb2xsZWN0UHJvamVjdEZpbGVzRnJvbVByb3ZpZGVyKGZpbGVzLCBwcm92aWRlciwgY2hpbGQsCi0JCQkJCQlsZXZlbCArIDEsIG1vbml0b3IpOwotCQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IHByb3ZpZGVyLmdldExhYmVsKGNoaWxkKTsKLQkJCWlmIChlbGVtZW50TGFiZWwuZXF1YWxzKElQcm9qZWN0RGVzY3JpcHRpb24uREVTQ1JJUFRJT05fRklMRV9OQU1FKSkKLQkJCQlmaWxlcy5hZGQobmV3IFByb2plY3RSZWNvcmQoY2hpbGQsIGVudHJ5LCBsZXZlbCwgcHJvdmlkZXIpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYnJvd3NlIGJ1dHRvbiBoYXMgYmVlbiBzZWxlY3RlZC4gU2VsZWN0IHRoZSBsb2NhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMb2NhdGlvbkRpcmVjdG9yeUJ1dHRvblByZXNzZWQoKSB7Ci0KLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZGlyZWN0b3J5UGF0aEZpZWxkCi0JCQkJLmdldFNoZWxsKCkpOwotCQlkaWFsb2cKLQkJCQkuc2V0TWVzc2FnZShEYXRhVHJhbnNmZXJNZXNzYWdlcy5XaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfU2VsZWN0RGlhbG9nVGl0bGUpOwotCi0JCVN0cmluZyBkaXJOYW1lID0gZGlyZWN0b3J5UGF0aEZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0JCWlmIChkaXJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlkaXJOYW1lID0gcHJldmlvdXNseUJyb3dzZWREaXJlY3Rvcnk7Ci0KLQkJaWYgKGRpck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKElERVdvcmtiZW5jaFBsdWdpbi5nZXRQbHVnaW5Xb3Jrc3BhY2UoKQotCQkJCQkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJZWxzZSB7Ci0JCQlGaWxlIHBhdGggPSBuZXcgRmlsZShkaXJOYW1lKTsKLQkJCWlmIChwYXRoLmV4aXN0cygpKQotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKG5ldyBQYXRoKGRpck5hbWUpLnRvT1NTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJcHJldmlvdXNseUJyb3dzZWREaXJlY3RvcnkgPSBzZWxlY3RlZERpcmVjdG9yeTsKLQkJCWRpcmVjdG9yeVBhdGhGaWVsZC5zZXRUZXh0KHByZXZpb3VzbHlCcm93c2VkRGlyZWN0b3J5KTsKLQkJCXVwZGF0ZVByb2plY3RzTGlzdChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoZSBicm93c2UgYnV0dG9uIGhhcyBiZWVuIHNlbGVjdGVkLiBTZWxlY3QgdGhlIGxvY2F0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxvY2F0aW9uQXJjaGl2ZUJ1dHRvblByZXNzZWQoKSB7Ci0KLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhhcmNoaXZlUGF0aEZpZWxkLmdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhGSUxFX0lNUE9SVF9NQVNLKTsKLQkJZGlhbG9nCi0JCQkJLnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlX1NlbGVjdEFyY2hpdmVEaWFsb2dUaXRsZSk7Ci0KLQkJU3RyaW5nIGZpbGVOYW1lID0gYXJjaGl2ZVBhdGhGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAoZmlsZU5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCWZpbGVOYW1lID0gcHJldmlvdXNseUJyb3dzZWRBcmNoaXZlOwotCi0JCWlmIChmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoSURFV29ya2JlbmNoUGx1Z2luLmdldFBsdWdpbldvcmtzcGFjZSgpCi0JCQkJCS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQllbHNlIHsKLQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJCWlmIChwYXRoLmV4aXN0cygpKQotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKG5ldyBQYXRoKGZpbGVOYW1lKS50b09TU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHNlbGVjdGVkQXJjaGl2ZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZEFyY2hpdmUgIT0gbnVsbCkgewotCQkJcHJldmlvdXNseUJyb3dzZWRBcmNoaXZlID0gc2VsZWN0ZWRBcmNoaXZlOwotCQkJYXJjaGl2ZVBhdGhGaWVsZC5zZXRUZXh0KHByZXZpb3VzbHlCcm93c2VkQXJjaGl2ZSk7Ci0JCQl1cGRhdGVQcm9qZWN0c0xpc3Qoc2VsZWN0ZWRBcmNoaXZlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBzZWxlY3RlZCBwcm9qZWN0cwotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgcHJvamVjdCBjcmVhdGlvbnMgd2VyZQotCSAqICAgICAgICAgc3VjY2Vzc2Z1bC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVQcm9qZWN0cygpIHsKLQkJc2F2ZVdpZGdldFZhbHVlcygpOwotCQlmaW5hbCBPYmplY3RbXSBzZWxlY3RlZCA9IHByb2plY3RzTGlzdC5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBzZWxlY3RlZC5sZW5ndGgpOwkvLyROT04tTkxTLTEkCi0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKQotCQkJCQkJY3JlYXRlRXhpc3RpbmdQcm9qZWN0KChQcm9qZWN0UmVjb3JkKSBzZWxlY3RlZFtpXSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkvLyBydW4gdGhlIG5ldyBwcm9qZWN0IGNyZWF0aW9uIG9wZXJhdGlvbgotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9uZSBvZiB0aGUgc3RlcHMgcmVzdWx0ZWQgaW4gYSBjb3JlIGV4Y2VwdGlvbgotCQkJVGhyb3dhYmxlIHQgPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBEYXRhVHJhbnNmZXJNZXNzYWdlcy5XaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlX2Vycm9yTWVzc2FnZTsKLQkJCUlTdGF0dXMgc3RhdHVzOwotCQkJaWYgKHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJCXN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbil0KS5nZXRTdGF0dXMoKTsKLQkJCWVsc2UKLQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIElERVdvcmtiZW5jaFBsdWdpbi5JREVfV09SS0JFTkNILCAxLCBtZXNzYWdlLCB0KTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCAKLQkJCQltZXNzYWdlLAotCQkJCW51bGwsCi0JCQkJc3RhdHVzKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHByb2plY3QgZGVzY3JpYmVkIGluIHJlY29yZC4gSWYgaXQgaXMgc3VjY2Vzc2Z1bCByZXR1cm4gdHJ1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVjb3JkCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3NmdWwKLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjcmVhdGVFeGlzdGluZ1Byb2plY3QoZmluYWwgUHJvamVjdFJlY29yZCByZWNvcmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gcmVjb3JkLmdldFByb2plY3ROYW1lKCk7Ci0JCWZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKHJlY29yZC5kZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkvLyBlcnJvciBjYXNlCi0JCQlyZWNvcmQuZGVzY3JpcHRpb24gPSB3b3Jrc3BhY2UubmV3UHJvamVjdERlc2NyaXB0aW9uKHByb2plY3ROYW1lKTsKLQkJCUlQYXRoIGxvY2F0aW9uUGF0aCA9IG5ldyBQYXRoKHJlY29yZC5wcm9qZWN0U3lzdGVtRmlsZQotCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJLy8gSVBhdGggbG9jYXRpb25QYXRoID0gbmV3Ci0JCQkvLyBQYXRoKHJlY29yZC5wcm9qZWN0RmlsZS5nZXRGdWxsUGF0aChyZWNvcmQucHJvamVjdEZpbGUuZ2V0Um9vdCgpKSk7Ci0KLQkJCS8vIElmIGl0IGlzIHVuZGVyIHRoZSByb290IHVzZSB0aGUgZGVmYXVsdCBsb2NhdGlvbgotCQkJaWYgKFBsYXRmb3JtLmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihsb2NhdGlvblBhdGgpKQotCQkJCXJlY29yZC5kZXNjcmlwdGlvbi5zZXRMb2NhdGlvbihudWxsKTsKLQkJCWVsc2UKLQkJCQlyZWNvcmQuZGVzY3JpcHRpb24uc2V0TG9jYXRpb24obG9jYXRpb25QYXRoKTsKLQkJfSBlbHNlCi0JCQlyZWNvcmQuZGVzY3JpcHRpb24uc2V0TmFtZShwcm9qZWN0TmFtZSk7Ci0JCWlmIChyZWNvcmQucHJvamVjdEFyY2hpdmVGaWxlICE9IG51bGwpIHsKLQkJCS8vaW1wb3J0IGZyb20gYXJjaGl2ZQotCQkJQXJyYXlMaXN0IGZpbGVTeXN0ZW1PYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ2V0RmlsZXNGb3JQcm9qZWN0KGZpbGVTeXN0ZW1PYmplY3RzLCByZWNvcmQucHJvdmlkZXIsCi0JCQkJCXJlY29yZC5wYXJlbnQpOwotCQkJcmVjb3JkLnByb3ZpZGVyLnNldFN0cmlwKHJlY29yZC5sZXZlbCk7Ci0JCQlJbXBvcnRPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEltcG9ydE9wZXJhdGlvbihwcm9qZWN0Ci0JCQkJCS5nZXRGdWxsUGF0aCgpLCByZWNvcmQucHJvdmlkZXIuZ2V0Um9vdCgpLCByZWNvcmQucHJvdmlkZXIsCi0JCQkJCXRoaXMsIGZpbGVTeXN0ZW1PYmplY3RzKTsKLQkJCW9wZXJhdGlvbi5zZXRDb250ZXh0KGdldFNoZWxsKCkpOwotCQkJb3BlcmF0aW9uLnJ1bihtb25pdG9yKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vaW1wb3J0IGZyb20gZmlsZSBzeXN0ZW0KLQkJRmlsZSBpbXBvcnRTb3VyY2UgPSBudWxsOwotCQlpZiAoY29weUZpbGVzKXsKLQkJCS8vIGltcG9ydCBwcm9qZWN0IGZyb20gbG9jYXRpb24gY29weWluZyBmaWxlcyAtIHVzZSBkZWZhdWx0IHByb2plY3QgbG9jYXRpb24gZm9yIHRoaXMgd29ya3NwYWNlCi0JCQlVUkkgbG9jYXRpb25VUkkgPSByZWNvcmQuZGVzY3JpcHRpb24uZ2V0TG9jYXRpb25VUkkoKTsKLQkJCS8vIGlmIGxvY2F0aW9uIGlzIG51bGwsIHByb2plY3QgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBsb2NhdGlvbiBvciAKLQkJCS8vIHNvbWUgZXJyb3IgY29uZGl0aW9uIG9jY3VyZWQuCi0JCQlpZiAobG9jYXRpb25VUkkgIT0gbnVsbCl7Ci0JCQkJaW1wb3J0U291cmNlID0gbmV3IEZpbGUobG9jYXRpb25VUkkpOwotCQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHdvcmtzcGFjZS5uZXdQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdE5hbWUpOwotCQkJCWRlc2Muc2V0QnVpbGRTcGVjKHJlY29yZC5kZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKSk7Ci0JCQkJZGVzYy5zZXROYXR1cmVJZHMocmVjb3JkLmRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpKTsKLQkJCQlkZXNjLnNldER5bmFtaWNSZWZlcmVuY2VzKHJlY29yZC5kZXNjcmlwdGlvbi5nZXREeW5hbWljUmVmZXJlbmNlcygpKTsKLQkJCQlkZXNjLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWNvcmQuZGVzY3JpcHRpb24uZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkpOwotCQkJCXJlY29yZC5kZXNjcmlwdGlvbiA9IGRlc2M7Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJCURhdGFUcmFuc2Zlck1lc3NhZ2VzLldpemFyZFByb2plY3RzSW1wb3J0UGFnZV9DcmVhdGVQcm9qZWN0c1Rhc2ssIAotCQkJCQkxMDApOyAKLQkJCXByb2plY3QuY3JlYXRlKHJlY29yZC5kZXNjcmlwdGlvbiwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcigKLQkJCQkJbW9uaXRvciwgMzApKTsKLQkJCXByb2plY3Qub3BlbihJUmVzb3VyY2UuQkFDS0dST1VORF9SRUZSRVNILAotCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDcwKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCi0JCS8vIGltcG9ydCBvcGVyYXRpb24gdG8gaW1wb3J0IHByb2plY3QgZmlsZXMgaWYgY29weSBjaGVja2JveCBpcyBzZWxlY3RlZAotCQlpZiAoY29weUZpbGVzICYmIGltcG9ydFNvdXJjZSAhPSBudWxsKXsKLQkJCUxpc3QgZmlsZXNUb0ltcG9ydCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlciA9IEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRTsKLQkJCWdldEZpbGVzRm9yUHJvamVjdChmaWxlc1RvSW1wb3J0LCBwcm92aWRlciwgaW1wb3J0U291cmNlKTsKLQkJCUltcG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgSW1wb3J0T3BlcmF0aW9uKHByb2plY3QuZ2V0RnVsbFBhdGgoKSwgCi0JCQkJCWltcG9ydFNvdXJjZSwgCi0JCQkJCUZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSwgdGhpcywgZmlsZXNUb0ltcG9ydCk7Ci0JCQlvcGVyYXRpb24uc2V0Q29udGV4dChnZXRTaGVsbCgpKTsKLQkJCW9wZXJhdGlvbi5zZXRPdmVyd3JpdGVSZXNvdXJjZXModHJ1ZSk7CS8vIG5lZWQgdG8gb3ZlcndyaXRlIC5wcm9qZWN0LCAuY2xhc3NwYXRoIGZpbGVzCi0JCQlvcGVyYXRpb24uc2V0Q3JlYXRlQ29udGFpbmVyU3RydWN0dXJlKGZhbHNlKTsKLQkJCW9wZXJhdGlvbi5ydW4obW9uaXRvcik7CQkJCQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBmaWxlcyBpbiB0aGUgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBwcm92aWRlcgotCSAqICAgICAgICAgICAgVGhlIHByb3ZpZGVyIGZvciB0aGUgcGFyZW50IGZpbGUKLQkgKiBAcGFyYW0gZW50cnkKLQkgKiAgICAgICAgICAgIFRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdAotCSAqIEByZXR1cm4gQSBsaXN0IG9mIGFsbCBmaWxlcyBpbiB0aGUgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldEZpbGVzRm9yUHJvamVjdChDb2xsZWN0aW9uIGZpbGVzLAotCQkJSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyLCBPYmplY3QgZW50cnkpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IHByb3ZpZGVyLmdldENoaWxkcmVuKGVudHJ5KTsKLQkJSXRlcmF0b3IgY2hpbGRyZW5FbnVtID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoY2hpbGRyZW5FbnVtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGNoaWxkID0gY2hpbGRyZW5FbnVtLm5leHQoKTsKLQkJCS8vIEFkZCB0aGUgY2hpbGQsIHRoaXMgd2F5IHdlIGdldCBldmVyeSBmaWxlcyBleGNlcHQgdGhlIHByb2plY3QKLQkJCS8vIGZvbGRlciBpdHNlbGYgd2hpY2ggd2UgZG9uJ3Qgd2FudAotCQkJZmlsZXMuYWRkKGNoaWxkKTsKLQkJCS8vIFdlIGRvbid0IGhhdmUgaXNEaXJlY3RvcnkgZm9yIHRhciBzbyBtdXN0IGNoZWNrIGZvciBjaGlsZHJlbgotCQkJLy8gaW5zdGVhZAotCQkJaWYgKHByb3ZpZGVyLmlzRm9sZGVyKGNoaWxkKSkKLQkJCQlnZXRGaWxlc0ZvclByb2plY3QoZmlsZXMsIHByb3ZpZGVyLCBjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgcGFzc2VkIGltcG9ydCBvcGVyYXRpb24uIEFuc3dlciBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZUltcG9ydE9wZXJhdGlvbihJbXBvcnRPcGVyYXRpb24gb3ApIHsKLQkJLy8gaW5pdGlhbGl6ZU9wZXJhdGlvbihvcCk7Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJLy8gZGlzcGxheUVycm9yRGlhbG9nKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBvcC5nZXRTdGF0dXMoKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwKLQkJCQkJRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUltcG9ydF9pbXBvcnRQcm9ibGVtcywgbnVsbCwgLy8gbm8KLQkJCQkJLy8gc3BlY2lhbAotCQkJCQkvLyBtZXNzYWdlCi0JCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+V2l6YXJkRGF0YVRyYW5zZmVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0JICogPGNvZGU+SU92ZXJ3cml0ZVF1ZXJ5PC9jb2RlPiBtZXRob2QgYXNrcyB0aGUgdXNlciB3aGV0aGVyIHRoZSBleGlzdGluZwotCSAqIHJlc291cmNlIGF0IHRoZSBnaXZlbiBwYXRoIHNob3VsZCBiZSBvdmVyd3JpdHRlbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aFN0cmluZwotCSAqIEByZXR1cm4gdGhlIHVzZXIncyByZXBseTogb25lIG9mIDxjb2RlPiJZRVMiPC9jb2RlPiwgPGNvZGU+Ik5PIjwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT4iQUxMIjwvY29kZT4sIG9yIDxjb2RlPiJDQU5DRUwiPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcXVlcnlPdmVyd3JpdGUoU3RyaW5nIHBhdGhTdHJpbmcpIHsKLQotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChwYXRoU3RyaW5nKTsKLQotCQlTdHJpbmcgbWVzc2FnZVN0cmluZzsKLQkJLy8gQnJlYWsgdGhlIG1lc3NhZ2UgdXAgaWYgdGhlcmUgaXMgYSBmaWxlIG5hbWUgYW5kIGEgZGlyZWN0b3J5Ci0JCS8vIGFuZCB0aGVyZSBhcmUgYXQgbGVhc3QgMiBzZWdtZW50cy4KLQkJaWYgKHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpID09IG51bGwgfHwgcGF0aC5zZWdtZW50Q291bnQoKSA8IDIpCi0JCQltZXNzYWdlU3RyaW5nID0gTkxTLmJpbmQoCi0JCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLldpemFyZERhdGFUcmFuc2Zlcl9leGlzdHNRdWVzdGlvbiwKLQkJCQkJcGF0aFN0cmluZyk7Ci0KLQkJZWxzZQotCQkJbWVzc2FnZVN0cmluZyA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlJREVXb3JrYmVuY2hNZXNzYWdlcy5XaXphcmREYXRhVHJhbnNmZXJfb3ZlcndyaXRlTmFtZUFuZFBhdGhRdWVzdGlvbiwKLQkJCQkJCQlwYXRoLmxhc3RTZWdtZW50KCksIHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpCi0JCQkJCQkJCQkudG9PU1N0cmluZygpKTsKLQotCQlmaW5hbCBNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldENvbnRhaW5lcigpCi0JCQkJLmdldFNoZWxsKCksIElERVdvcmtiZW5jaE1lc3NhZ2VzLlF1ZXN0aW9uLCBudWxsLAotCQkJCW1lc3NhZ2VTdHJpbmcsIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQlJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9MQUJFTCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsCi0JCQkJCQlJRGlhbG9nQ29uc3RhbnRzLk5PX1RPX0FMTF9MQUJFTCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOwotCQlTdHJpbmdbXSByZXNwb25zZSA9IG5ldyBTdHJpbmdbXSB7IFlFUywgQUxMLCBOTywgTk9fQUxMLCBDQU5DRUwgfTsKLQkJLy8gcnVuIGluIHN5bmNFeGVjIGJlY2F1c2UgY2FsbGJhY2sgaXMgZnJvbSBhbiBvcGVyYXRpb24sCi0JCS8vIHdoaWNoIGlzIHByb2JhYmx5IG5vdCBydW5uaW5nIGluIHRoZSBVSSB0aHJlYWQuCi0JCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gZGlhbG9nLmdldFJldHVybkNvZGUoKSA8IDAgPyBDQU5DRUwgOiByZXNwb25zZVtkaWFsb2cKLQkJCQkuZ2V0UmV0dXJuQ29kZSgpXTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCBmb3IgdGVzdCBzdWl0ZS4KLQkgKiBAcmV0dXJuIEJ1dHRvbiB0aGUgSW1wb3J0IGZyb20gRGlyZWN0b3J5IFJhZGlvQnV0dG9uCi0JICovCi0JcHVibGljIEJ1dHRvbiBnZXRQcm9qZWN0RnJvbURpcmVjdG9yeVJhZGlvKCkgewotCQlyZXR1cm4gcHJvamVjdEZyb21EaXJlY3RvcnlSYWRpbzsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCBmb3IgdGVzdCBzdWl0ZS4KLQkgKiBAcmV0dXJuIENoZWNrYm94VHJlZVZpZXdlciB0aGUgdmlld2VyIGNvbnRhaW5pbmcgYWxsIHRoZSBwcm9qZWN0cyBmb3VuZCAKLQkgKi8KLQlwdWJsaWMgQ2hlY2tib3hUcmVlVmlld2VyIGdldFByb2plY3RzTGlzdCgpIHsKLQkJcmV0dXJuIHByb2plY3RzTGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0cmlldmUgYWxsIHRoZSBwcm9qZWN0cyBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogCi0JICogQHJldHVybiBJUHJvamVjdFtdIGFycmF5IG9mIElQcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZQotCSAqLwotCXByaXZhdGUgSVByb2plY3RbXSBnZXRQcm9qZWN0c0luV29ya3NwYWNlKCl7Ci0JCWlmICh3c1Byb2plY3RzID09IG51bGwpCi0JCQl3c1Byb2plY3RzID0gSURFV29ya2JlbmNoUGx1Z2luLmdldFBsdWdpbldvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlyZXR1cm4gd3NQcm9qZWN0czsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGFycmF5IG9mIHZhbGlkIHByb2plY3QgcmVjb3JkcyB0aGF0IGNhbiBiZSBpbXBvcnRlZCAKLQkgKiBmcm9tIHRoZSBzb3VyY2Ugd29ya3NwYWNlIG9yIGFyY2hpdmUsIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLgotCSAqIElmIGEgcHJvamVjdCB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3RzIGluIGJvdGggdGhlIHNvdXJjZSB3b3Jrc3BhY2UgYW5kIHRoZSAKLQkgKiBjdXJyZW50IHdvcmtzcGFjZSwgaXQgd2lsbCBub3QgYXBwZWFyIGluIHRoZSBsaXN0IG9mIHByb2plY3RzIHRvIGltcG9ydCBhbmQgCi0JICogdGh1cyBjYW5ub3QgYmUgc2VsZWN0ZWQgZm9yIGltcG9ydC4KLQkgKiAKLQkgKiBNZXRob2QgZGVjbGFyZWQgcHVibGljIGZvciB0ZXN0IHN1aXRlLgotCSAqIAotCSAqIEByZXR1cm4gUHJvamVjdFJlY29yZFtdIGFycmF5IG9mIHByb2plY3RzIHRoYXQgY2FuIGJlIGltcG9ydGVkIGludG8gdGhlIHdvcmtzcGFjZQotCSAqLwotCXB1YmxpYyBQcm9qZWN0UmVjb3JkW10gZ2V0VmFsaWRQcm9qZWN0cygpewotCQlMaXN0IHZhbGlkUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRQcm9qZWN0cy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAoIWlzUHJvamVjdEluV29ya3NwYWNlKHNlbGVjdGVkUHJvamVjdHNbaV0uZ2V0UHJvamVjdE5hbWUoKSkpCi0JCQkJdmFsaWRQcm9qZWN0cy5hZGQoc2VsZWN0ZWRQcm9qZWN0c1tpXSk7Ci0JCX0KLQkJcmV0dXJuIChQcm9qZWN0UmVjb3JkW10pIHZhbGlkUHJvamVjdHMudG9BcnJheShuZXcgUHJvamVjdFJlY29yZFt2YWxpZFByb2plY3RzLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhlIHByb2plY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcyBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3ROYW1lIFN0cmluZyB0aGUgcHJvamVjdCBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIHByb2plY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcyBpbiB0aGlzIHdvcmtzcGFjZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1Byb2plY3RJbldvcmtzcGFjZShTdHJpbmcgcHJvamVjdE5hbWUpewotCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVByb2plY3RbXSB3b3Jrc3BhY2VQcm9qZWN0cyA9IGdldFByb2plY3RzSW5Xb3Jrc3BhY2UoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aDsgaSsrKXsKLQkJCWlmIChwcm9qZWN0TmFtZS5lcXVhbHMod29ya3NwYWNlUHJvamVjdHNbaV0uZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotICAgIC8qKgotICAgICAqCVVzZSB0aGUgZGlhbG9nIHN0b3JlIHRvIHJlc3RvcmUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgdmFsdWVzIHRoYXQgdGhleSBoZWxkCi0gICAgICoJbGFzdCB0aW1lIHRoaXMgd2l6YXJkIHdhcyB1c2VkIHRvIGNvbXBsZXRpb24uCi0gICAgICoJCi0gICAgICoJTWV0aG9kIGRlY2xhcmVkIHB1YmxpYyBvbmx5IGZvciB1c2Ugb2YgdGVzdHMuCi0gICAgICovCQotICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKSB7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjaGVja2JveAkKLSAgICAgICAgCWNvcHlGaWxlcyA9IHNldHRpbmdzLmdldEJvb2xlYW4oU1RPUkVfQ09QWV9QUk9KRUNUX0lEKTsKLSAgICAgICAgICAgIGNvcHlDaGVja2JveC5zZXRTZWxlY3Rpb24oY29weUZpbGVzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gcmFkaW8gc2VsZWN0aW9uCi0gICAgICAgICAgICBib29sZWFuIGFyY2hpdmVTZWxlY3RlZCA9IHNldHRpbmdzLmdldEJvb2xlYW4oU1RPUkVfQVJDSElWRV9TRUxFQ1RFRCk7Ci0gICAgICAgICAgICBwcm9qZWN0RnJvbURpcmVjdG9yeVJhZGlvLnNldFNlbGVjdGlvbighYXJjaGl2ZVNlbGVjdGVkKTsKLSAgICAgICAgICAgIHByb2plY3RGcm9tQXJjaGl2ZVJhZGlvLnNldFNlbGVjdGlvbihhcmNoaXZlU2VsZWN0ZWQpOwotICAgICAgICAgICAgaWYgKGFyY2hpdmVTZWxlY3RlZCkKLSAgICAgICAgICAgIAlhcmNoaXZlUmFkaW9TZWxlY3RlZCgpOwotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgIAlkaXJlY3RvcnlSYWRpb1NlbGVjdGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAJU2luY2UgRmluaXNoIHdhcyBwcmVzc2VkLCB3cml0ZSB3aWRnZXQgdmFsdWVzIHRvIHRoZSBkaWFsb2cgc3RvcmUgc28gdGhhdCB0aGV5Ci0gICAgICoJd2lsbCBwZXJzaXN0IGludG8gdGhlIG5leHQgaW52b2NhdGlvbiBvZiB0aGlzIHdpemFyZCBwYWdlLgotICAgICAqCi0gICAgICoJTWV0aG9kIGRlY2xhcmVkIHB1YmxpYyBvbmx5IGZvciB1c2Ugb2YgdGVzdHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZVdpZGdldFZhbHVlcygpIHsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldHRpbmdzLnB1dChTVE9SRV9DT1BZX1BST0pFQ1RfSUQsCi0gICAgICAgICAgICAgICAgICAgIGNvcHlDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNldHRpbmdzLnB1dChTVE9SRV9BUkNISVZFX1NFTEVDVEVELCAKLSAgICAgICAgICAgIAkJcHJvamVjdEZyb21BcmNoaXZlUmFkaW8uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHVzZWQgZm9yIHRlc3Qgc3VpdGUuCi0gICAgICogQHJldHVybiBCdXR0b24gY29weSBjaGVja2JveAotICAgICAqLwotCXB1YmxpYyBCdXR0b24gZ2V0Q29weUNoZWNrYm94KCkgewotCQlyZXR1cm4gY29weUNoZWNrYm94OwotCX0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvV2l6YXJkWmlwRmlsZVJlc291cmNlRXhwb3J0UGFnZTEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9XaXphcmRaaXBGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzRhYTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9XaXphcmRaaXBGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICoJUGFnZSAxIG9mIHRoZSBiYXNlIHJlc291cmNlIGV4cG9ydC10by16aXAgV2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRaaXBGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMSBleHRlbmRzCi0gICAgICAgIFdpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUV4cG9ydFBhZ2UxIHsKLQotICAgIC8vIHdpZGdldHMKLSAgICBwcm90ZWN0ZWQgQnV0dG9uIGNvbXByZXNzQ29udGVudHNDaGVja2JveDsKLQotICAgIC8vIGRpYWxvZyBzdG9yZSBpZCBjb25zdGFudHMKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RPUkVfREVTVElOQVRJT05fTkFNRVNfSUQgPSAiV2l6YXJkWmlwRmlsZVJlc291cmNlRXhwb3J0UGFnZTEuU1RPUkVfREVTVElOQVRJT05fTkFNRVNfSUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RPUkVfQ1JFQVRFX1NUUlVDVFVSRV9JRCA9ICJXaXphcmRaaXBGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMS5TVE9SRV9DUkVBVEVfU1RSVUNUVVJFX0lEIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUT1JFX0NPTVBSRVNTX0NPTlRFTlRTX0lEID0gIldpemFyZFppcEZpbGVSZXNvdXJjZUV4cG9ydFBhZ2UxLlNUT1JFX0NPTVBSRVNTX0NPTlRFTlRTX0lEIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICoJQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuIAotICAgICAqCi0gICAgICoJQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBXaXphcmRaaXBGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMShTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzdXBlcihuYW1lLCBzZWxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIHNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBXaXphcmRaaXBGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcygiemlwRmlsZUV4cG9ydFBhZ2UxIiwgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRUaXRsZShEYXRhVHJhbnNmZXJNZXNzYWdlcy5aaXBFeHBvcnRfZXhwb3J0VGl0bGUpOwotICAgICAgICBzZXREZXNjcmlwdGlvbihEYXRhVHJhbnNmZXJNZXNzYWdlcy5aaXBFeHBvcnRfZGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLAotICAgICAgICAgICAgICAgIElEYXRhVHJhbnNmZXJIZWxwQ29udGV4dElkcy5aSVBfRklMRV9FWFBPUlRfV0laQVJEX1BBR0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUNyZWF0ZSB0aGUgZXhwb3J0IG9wdGlvbnMgc3BlY2lmaWNhdGlvbiB3aWRnZXRzLgotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3B0aW9uc0dyb3VwQnV0dG9ucyhHcm91cCBvcHRpb25zR3JvdXApIHsKLQotICAgICAgICBGb250IGZvbnQgPSBvcHRpb25zR3JvdXAuZ2V0Rm9udCgpOwotICAgICAgICAvLyBjb21wcmVzcy4uLiBjaGVja2JveAotICAgICAgICBjb21wcmVzc0NvbnRlbnRzQ2hlY2tib3ggPSBuZXcgQnV0dG9uKG9wdGlvbnNHcm91cCwgU1dULkNIRUNLCi0gICAgICAgICAgICAgICAgfCBTV1QuTEVGVCk7Ci0gICAgICAgIGNvbXByZXNzQ29udGVudHNDaGVja2JveC5zZXRUZXh0KERhdGFUcmFuc2Zlck1lc3NhZ2VzLlppcEV4cG9ydF9jb21wcmVzc0NvbnRlbnRzKTsKLSAgICAgICAgY29tcHJlc3NDb250ZW50c0NoZWNrYm94LnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlT3B0aW9ucyhvcHRpb25zR3JvdXAsIGZvbnQpOwotCi0gICAgICAgIC8vIGluaXRpYWwgc2V0dXAKLSAgICAgICAgY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgY3JlYXRlU2VsZWN0aW9uT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICBjb21wcmVzc0NvbnRlbnRzQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZGlyZWN0b3J5IHBvcnRpb24gb2YgdGhlCi0gICAgICogcGFzc2VkIHBhdGhuYW1lIGlzIHZhbGlkIGFuZCBhdmFpbGFibGUgZm9yIHVzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbnN1cmVUYXJnZXREaXJlY3RvcnlJc1ZhbGlkKFN0cmluZyBmdWxsUGF0aG5hbWUpIHsKLSAgICAgICAgaW50IHNlcGFyYXRvckluZGV4ID0gZnVsbFBhdGhuYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLQotICAgICAgICBpZiAoc2VwYXJhdG9ySW5kZXggPT0gLTEpIC8vIGllLi0gZGVmYXVsdCBkaXIsIHdoaWNoIGlzIGZpbmUKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiBlbnN1cmVUYXJnZXRJc1ZhbGlkKG5ldyBGaWxlKGZ1bGxQYXRobmFtZS5zdWJzdHJpbmcoMCwKLSAgICAgICAgICAgICAgICBzZXBhcmF0b3JJbmRleCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhc3NlZCBGaWxlIGhhbmRsZSBpcwotICAgICAqIGlzIHZhbGlkIGFuZCBhdmFpbGFibGUgZm9yIHVzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbnN1cmVUYXJnZXRGaWxlSXNWYWxpZChGaWxlIHRhcmdldEZpbGUpIHsKLSAgICAgICAgaWYgKHRhcmdldEZpbGUuZXhpc3RzKCkgJiYgdGFyZ2V0RmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBkaXNwbGF5RXJyb3JEaWFsb2coRGF0YVRyYW5zZmVyTWVzc2FnZXMuWmlwRXhwb3J0X211c3RCZUZpbGUpOwotICAgICAgICAgICAgZ2l2ZUZvY3VzVG9EZXN0aW5hdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRhcmdldEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGlmICh0YXJnZXRGaWxlLmNhbldyaXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXF1ZXJ5WWVzTm9RdWVzdGlvbihEYXRhVHJhbnNmZXJNZXNzYWdlcy5aaXBFeHBvcnRfYWxyZWFkeUV4aXN0cykpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGlzcGxheUVycm9yRGlhbG9nKERhdGFUcmFuc2Zlck1lc3NhZ2VzLlppcEV4cG9ydF9hbHJlYWR5RXhpc3RzRXJyb3IpOwotICAgICAgICAgICAgICAgIGdpdmVGb2N1c1RvRGVzdGluYXRpb24oKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIHRhcmdldCBvdXRwdXQgZmlsZSBhbmQgaXRzIGNvbnRhaW5pbmcgZGlyZWN0b3J5IGFyZQotICAgICAqIGJvdGggdmFsaWQgYW5kIGFibGUgdG8gYmUgdXNlZC4gIEFuc3dlciBhIGJvb2xlYW4gaW5kaWNhdGluZyB2YWxpZGl0eS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbnN1cmVUYXJnZXRJc1ZhbGlkKCkgewotICAgICAgICBTdHJpbmcgdGFyZ2V0UGF0aCA9IGdldERlc3RpbmF0aW9uVmFsdWUoKTsKLQotICAgICAgICBpZiAoIWVuc3VyZVRhcmdldERpcmVjdG9yeUlzVmFsaWQodGFyZ2V0UGF0aCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFlbnN1cmVUYXJnZXRGaWxlSXNWYWxpZChuZXcgRmlsZSh0YXJnZXRQYXRoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEV4cG9ydCB0aGUgcGFzc2VkIHJlc291cmNlIGFuZCByZWN1cnNpdmVseSBleHBvcnQgYWxsIG9mIGl0cyBjaGlsZCByZXNvdXJjZXMKLSAgICAgKiAgKGlmZiBpdCdzIGEgY29udGFpbmVyKS4gIEFuc3dlciBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVFeHBvcnRPcGVyYXRpb24oQXJjaGl2ZUZpbGVFeHBvcnRPcGVyYXRpb24gb3ApIHsKLSAgICAgICAgb3Auc2V0Q3JlYXRlTGVhZHVwU3RydWN0dXJlKGNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZUJ1dHRvbgotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIG9wLnNldFVzZUNvbXByZXNzaW9uKGNvbXByZXNzQ29udGVudHNDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBvcCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBkaXNwbGF5RXJyb3JEaWFsb2coZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG9wLmdldFN0YXR1cygpOwotICAgICAgICBpZiAoIXN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICBEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfZXhwb3J0UHJvYmxlbXMsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIG5vIHNwZWNpYWwgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIEZpbmlzaCBidXR0b24gd2FzIHByZXNzZWQuICBUcnkgdG8gZG8gdGhlIHJlcXVpcmVkIHdvcmsgbm93IGFuZCBhbnN3ZXIKLSAgICAgKiBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLiAgSWYgZmFsc2UgaXMgcmV0dXJuZWQgdGhlbiB0aGUgd2l6YXJkIHdpbGwKLSAgICAgKiBub3QgY2xvc2UuCi0gICAgICogQHJldHVybnMgYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGZpbmlzaCgpIHsKLSAgICAgICAgaWYgKCFlbnN1cmVUYXJnZXRJc1ZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgTGlzdCByZXNvdXJjZXNUb0V4cG9ydCA9IGdldFdoaXRlQ2hlY2tlZFJlc291cmNlcygpOwotCi0gICAgICAgIC8vU2F2ZSBkaXJ0eSBlZGl0b3JzIGlmIHBvc3NpYmxlIGJ1dCBkbyBub3Qgc3RvcCBpZiBub3QgYWxsIGFyZSBzYXZlZAotICAgICAgICBzYXZlRGlydHlFZGl0b3JzKCk7Ci0gICAgICAgIC8vIGFib3V0IHRvIGludm9rZSB0aGUgb3BlcmF0aW9uIHNvIHNhdmUgb3VyIHN0YXRlCi0gICAgICAgIHNhdmVXaWRnZXRWYWx1ZXMoKTsKLQotICAgICAgICBpZiAocmVzb3VyY2VzVG9FeHBvcnQuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIHJldHVybiBleGVjdXRlRXhwb3J0T3BlcmF0aW9uKG5ldyBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbihudWxsLAotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXNUb0V4cG9ydCwgZ2V0RGVzdGluYXRpb25WYWx1ZSgpKSk7Ci0KLSAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfaW5mb3JtYXRpb24sCi0gICAgICAgICAgICAgICAgRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUV4cG9ydF9ub25lU2VsZWN0ZWQpOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgdGhlIHN0cmluZyB0byBkaXNwbGF5IGluIHRoZSByZWNlaXZlciBhcyB0aGUgZGVzdGluYXRpb24gdHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzdGluYXRpb25MYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIERhdGFUcmFuc2Zlck1lc3NhZ2VzLlppcEV4cG9ydF9kZXN0aW5hdGlvbkxhYmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgY29udGVudHMgb2Ygc2VsZidzIGRlc3RpbmF0aW9uIHNwZWNpZmljYXRpb24gd2lkZ2V0LiAgSWYgdGhpcwotICAgICAqCXZhbHVlIGRvZXMgbm90IGhhdmUgYSBzdWZmaXggdGhlbiBhZGQgaXQgZmlyc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZXN0aW5hdGlvblZhbHVlKCkgewotICAgICAgICBTdHJpbmcgaWRlYWxTdWZmaXggPSBnZXRPdXRwdXRTdWZmaXgoKTsKLSAgICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uVGV4dCA9IHN1cGVyLmdldERlc3RpbmF0aW9uVmFsdWUoKTsKLQotICAgICAgICAvLyBvbmx5IGFwcGVuZCBhIHN1ZmZpeCBpZiB0aGUgZGVzdGluYXRpb24gZG9lc24ndCBhbHJlYWR5IGhhdmUgYSAuIGluIAotICAgICAgICAvLyBpdHMgbGFzdCBwYXRoIHNlZ21lbnQuICAKLSAgICAgICAgLy8gQWxzbyBwcmV2ZW50IHRoZSB1c2VyIGZyb20gc2VsZWN0aW5nIGEgZGlyZWN0b3J5LiAgQWxsb3dpbmcgdGhpcyB3aWxsIAotICAgICAgICAvLyBjcmVhdGUgYSAiLnppcCIgZmlsZSBpbiB0aGUgZGlyZWN0b3J5Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvblRleHQubGVuZ3RoKCkgIT0gMAotICAgICAgICAgICAgICAgICYmICFkZXN0aW5hdGlvblRleHQuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0gICAgICAgICAgICBpbnQgZG90SW5kZXggPSBkZXN0aW5hdGlvblRleHQubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIGlmIChkb3RJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IHBhdGggc2VwZXJhdG9yIGluZGV4Ci0gICAgICAgICAgICAgICAgaW50IHBhdGhTZXBJbmRleCA9IGRlc3RpbmF0aW9uVGV4dC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGhTZXBJbmRleCAhPSAtMSAmJiBkb3RJbmRleCA8IHBhdGhTZXBJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRleHQgKz0gaWRlYWxTdWZmaXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRleHQgKz0gaWRlYWxTdWZmaXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGVzdGluYXRpb25UZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgc3VmZml4IHRoYXQgZmlsZXMgZXhwb3J0ZWQgZnJvbSB0aGlzIHdpemFyZCBzaG91bGQgaGF2ZS4KLSAgICAgKglJZiB0aGlzIHN1ZmZpeCBpcyBhIGZpbGUgZXh0ZW5zaW9uICh3aGljaCBpcyB0eXBpY2FsbHkgdGhlIGNhc2UpCi0gICAgICoJdGhlbiBpdCBtdXN0IGluY2x1ZGUgdGhlIGxlYWRpbmcgcGVyaW9kIGNoYXJhY3Rlci4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3V0cHV0U3VmZml4KCkgewotICAgICAgICByZXR1cm4gIi56aXAiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoJT3BlbiBhbiBhcHByb3ByaWF0ZSBkZXN0aW5hdGlvbiBicm93c2VyIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBzb3VyY2UKLSAgICAgKgl0byBpbXBvcnQgZnJvbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZURlc3RpbmF0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLSAgICAgICAgRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLCBTV1QuU0FWRSk7Ci0gICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLnppcCIsICIqLioiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgZGlhbG9nLnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuWmlwRXhwb3J0X3NlbGVjdERlc3RpbmF0aW9uVGl0bGUpOwotICAgICAgICBTdHJpbmcgY3VycmVudFNvdXJjZVN0cmluZyA9IGdldERlc3RpbmF0aW9uVmFsdWUoKTsKLSAgICAgICAgaW50IGxhc3RTZXBhcmF0b3JJbmRleCA9IGN1cnJlbnRTb3VyY2VTdHJpbmcKLSAgICAgICAgICAgICAgICAubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwotICAgICAgICBpZiAobGFzdFNlcGFyYXRvckluZGV4ICE9IC0xKQotICAgICAgICAgICAgZGlhbG9nLnNldEZpbHRlclBhdGgoY3VycmVudFNvdXJjZVN0cmluZy5zdWJzdHJpbmcoMCwKLSAgICAgICAgICAgICAgICAgICAgbGFzdFNlcGFyYXRvckluZGV4KSk7Ci0gICAgICAgIFN0cmluZyBzZWxlY3RlZEZpbGVOYW1lID0gZGlhbG9nLm9wZW4oKTsKLQotICAgICAgICBpZiAoc2VsZWN0ZWRGaWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgICBzZXREZXN0aW5hdGlvblZhbHVlKHNlbGVjdGVkRmlsZU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJSG9vayBtZXRob2QgZm9yIHNhdmluZyB3aWRnZXQgdmFsdWVzIGZvciByZXN0b3JhdGlvbiBieSB0aGUgbmV4dCBpbnN0YW5jZQotICAgICAqCW9mIHRoaXMgY2xhc3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTYXZlV2lkZ2V0VmFsdWVzKCkgewotICAgICAgICAvLyB1cGRhdGUgZGlyZWN0b3J5IG5hbWVzIGhpc3RvcnkKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGRpcmVjdG9yeU5hbWVzID0gc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgLmdldEFycmF5KFNUT1JFX0RFU1RJTkFUSU9OX05BTUVTX0lEKTsKLSAgICAgICAgICAgIGlmIChkaXJlY3RvcnlOYW1lcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIGRpcmVjdG9yeU5hbWVzID0gbmV3IFN0cmluZ1swXTsKLQotICAgICAgICAgICAgZGlyZWN0b3J5TmFtZXMgPSBhZGRUb0hpc3RvcnkoZGlyZWN0b3J5TmFtZXMsIGdldERlc3RpbmF0aW9uVmFsdWUoKSk7Ci0gICAgICAgICAgICBzZXR0aW5ncy5wdXQoU1RPUkVfREVTVElOQVRJT05fTkFNRVNfSUQsIGRpcmVjdG9yeU5hbWVzKTsKLQotICAgICAgICAgICAgc2V0dGluZ3MucHV0KFNUT1JFX0NSRUFURV9TVFJVQ1RVUkVfSUQsCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLSAgICAgICAgICAgIHNldHRpbmdzLnB1dChTVE9SRV9DT01QUkVTU19DT05URU5UU19JRCwgY29tcHJlc3NDb250ZW50c0NoZWNrYm94Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglIb29rIG1ldGhvZCBmb3IgcmVzdG9yaW5nIHdpZGdldCB2YWx1ZXMgdG8gdGhlIHZhbHVlcyB0aGF0IHRoZXkgaGVsZAotICAgICAqCWxhc3QgdGltZSB0aGlzIHdpemFyZCB3YXMgdXNlZCB0byBjb21wbGV0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKSB7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBkaXJlY3RvcnlOYW1lcyA9IHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBcnJheShTVE9SRV9ERVNUSU5BVElPTl9OQU1FU19JRCk7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0b3J5TmFtZXMgPT0gbnVsbCB8fCBkaXJlY3RvcnlOYW1lcy5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47IC8vIGllLi0gbm8gc2V0dGluZ3Mgc3RvcmVkCi0KLSAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBzZXREZXN0aW5hdGlvblZhbHVlKGRpcmVjdG9yeU5hbWVzWzBdKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0b3J5TmFtZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgYWRkRGVzdGluYXRpb25JdGVtKGRpcmVjdG9yeU5hbWVzW2ldKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBzZXRTdHJ1Y3R1cmUgPSBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAuZ2V0Qm9vbGVhbihTVE9SRV9DUkVBVEVfU1RSVUNUVVJFX0lEKTsKLQotICAgICAgICAgICAgY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlQnV0dG9uLnNldFNlbGVjdGlvbihzZXRTdHJ1Y3R1cmUpOwotICAgICAgICAgICAgY3JlYXRlU2VsZWN0aW9uT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24oIXNldFN0cnVjdHVyZSk7Ci0KLSAgICAgICAgICAgIGNvbXByZXNzQ29udGVudHNDaGVja2JveC5zZXRTZWxlY3Rpb24oc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgLmdldEJvb2xlYW4oU1RPUkVfQ09NUFJFU1NfQ09OVEVOVFNfSUQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLldpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUV4cG9ydFBhZ2UxI2Rlc3RpbmF0aW9uRW1wdHlNZXNzYWdlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlc3RpbmF0aW9uRW1wdHlNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gRGF0YVRyYW5zZmVyTWVzc2FnZXMuWmlwRXhwb3J0X2Rlc3RpbmF0aW9uRW1wdHk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvV2l6YXJkWmlwRmlsZVJlc291cmNlSW1wb3J0UGFnZTEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9XaXphcmRaaXBGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjM0NzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9XaXphcmRaaXBGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSW1wb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLlppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlcjsKLQotCi0vKioKLSAqCVBhZ2UgMSBvZiB0aGUgYmFzZSByZXNvdXJjZSBpbXBvcnQtZnJvbS16aXAgV2l6YXJkLgotICoKLSAqCU5vdGUgdGhhdCBpbXBvcnRpbmcgZnJvbSAuamFyIGlzIGlkZW50aWNhbCB0byBpbXBvcnRpbmcgZnJvbSAuemlwLCBzbwotICoJYWxsIHJlZmVyZW5jZXMgdG8gLnppcCBpbiB0aGlzIGNsYXNzIGFyZSBlcXVhbGx5IGFwcGxpY2FibGUgdG8gLmphcgotICoJcmVmZXJlbmNlcy4KLSAqLwotcHVibGljIGNsYXNzIFdpemFyZFppcEZpbGVSZXNvdXJjZUltcG9ydFBhZ2UxIGV4dGVuZHMKLSAgICAgICAgV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlSW1wb3J0UGFnZTEgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXJDYWNoZTsKLQotICAgIFppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBjdXJyZW50UHJvdmlkZXI7Ci0KLSAgICAvLyBjb25zdGFudHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGSUxFX0lNUE9SVF9NQVNLID0geyAiKi5qYXI7Ki56aXAiLCAiKi4qIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIC8vIGRpYWxvZyBzdG9yZSBpZCBjb25zdGFudHMKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RPUkVfU09VUkNFX05BTUVTX0lEID0gIldpemFyZFppcEZpbGVSZXNvdXJjZUltcG9ydFBhZ2UxLlNUT1JFX1NPVVJDRV9OQU1FU19JRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVE9SRV9PVkVSV1JJVEVfRVhJU1RJTkdfUkVTT1VSQ0VTX0lEID0gIldpemFyZFppcEZpbGVSZXNvdXJjZUltcG9ydFBhZ2UxLlNUT1JFX09WRVJXUklURV9FWElTVElOR19SRVNPVVJDRVNfSUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RPUkVfU0VMRUNURURfVFlQRVNfSUQgPSAiV2l6YXJkWmlwRmlsZVJlc291cmNlSW1wb3J0UGFnZTEuU1RPUkVfU0VMRUNURURfVFlQRVNfSUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKglDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLSAgICAgKiBAcGFyYW0gYVdvcmtiZW5jaCBJV29ya2JlbmNoCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiBJU3RydWN0dXJlZFNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBXaXphcmRaaXBGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMShJV29ya2JlbmNoIGFXb3JrYmVuY2gsCi0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIoInppcEZpbGVJbXBvcnRQYWdlMSIsIGFXb3JrYmVuY2gsIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0VGl0bGUoRGF0YVRyYW5zZmVyTWVzc2FnZXMuWmlwRXhwb3J0X2V4cG9ydFRpdGxlKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oRGF0YVRyYW5zZmVyTWVzc2FnZXMuWmlwSW1wb3J0X2Rlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBDYW5jZWwgYnV0dG9uLiBSZXR1cm4gYSBib29sZWFuCi0gICAgICogaW5kaWNhdGluZyBwZXJtaXNzaW9uIHRvIGNsb3NlIHRoZSB3aXphcmQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWwoKSB7Ci0gICAgICAgIGNsZWFyUHJvdmlkZXJDYWNoZSgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGNhY2hlZCBzdHJ1Y3R1cmUgcHJvdmlkZXIgYWZ0ZXIgZmlyc3QgZmluYWxpemluZwotICAgICAqIGl0IHByb3Blcmx5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyUHJvdmlkZXJDYWNoZSgpIHsKLSAgICAgICAgaWYgKHByb3ZpZGVyQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgY2xvc2VaaXBGaWxlKHByb3ZpZGVyQ2FjaGUuZ2V0WmlwRmlsZSgpKTsKLSAgICAgICAgICAgIHByb3ZpZGVyQ2FjaGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXR0ZW1wdHMgdG8gY2xvc2UgdGhlIHBhc3NlZCB6aXAgZmlsZSwgYW5kIGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjbG9zZVppcEZpbGUoWmlwRmlsZSBmaWxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaWxlLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGRpc3BsYXlFcnJvckRpYWxvZyhOTFMuYmluZChEYXRhVHJhbnNmZXJNZXNzYWdlcy5aaXBJbXBvcnRfY291bGROb3RDbG9zZSwgZmlsZS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLAotICAgICAgICAgICAgICAgIElEYXRhVHJhbnNmZXJIZWxwQ29udGV4dElkcy5aSVBfRklMRV9JTVBPUlRfV0laQVJEX1BBR0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUNyZWF0ZSB0aGUgb3B0aW9ucyBzcGVjaWZpY2F0aW9uIHdpZGdldHMuIFRoZXJlIGlzIG9ubHkgb25lCi0gICAgICogaW4gdGhpcyBjYXNlIHNvIGNyZWF0ZSBubyBncm91cC4KLSAgICAgKgotICAgICAqCUBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3B0aW9uc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICAvLyBvdmVyd3JpdGUuLi4gY2hlY2tib3gKLSAgICAgICAgb3ZlcndyaXRlRXhpc3RpbmdSZXNvdXJjZXNDaGVja2JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBvdmVyd3JpdGVFeGlzdGluZ1Jlc291cmNlc0NoZWNrYm94LnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuRmlsZUltcG9ydF9vdmVyd3JpdGVFeGlzdGluZyk7Ci0gICAgICAgIG92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3guc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3BlY2lmaWVkIHNvdXJjZSBjdXJyZW50bHkgZXhpc3RzCi0gICAgICoJYW5kIGlzIHZhbGlkIChpZS4tIHByb3BlciBmb3JtYXQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5zdXJlU291cmNlSXNWYWxpZCgpIHsKLSAgICAgICAgWmlwRmlsZSBzcGVjaWZpZWRGaWxlID0gZ2V0U3BlY2lmaWVkU291cmNlRmlsZSgpOwotCi0gICAgICAgIGlmIChzcGVjaWZpZWRGaWxlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIGNsb3NlWmlwRmlsZShzcGVjaWZpZWRGaWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgRmluaXNoIGJ1dHRvbiB3YXMgcHJlc3NlZC4gIFRyeSB0byBkbyB0aGUgcmVxdWlyZWQgd29yayBub3cgYW5kIGFuc3dlcgotICAgICAqIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuICBJZiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQgdGhlbiB0aGUKLSAgICAgKiB3aXphcmQgd2lsbCBub3QgY2xvc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5pc2goKSB7Ci0gICAgICAgIGlmICghc3VwZXIuZmluaXNoKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgY2xlYXJQcm92aWRlckNhY2hlKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb250ZW50IHByb3ZpZGVyIGZvciA8Y29kZT5GaWxlU3lzdGVtRWxlbWVudDwvY29kZT5zIHRoYXQgcmV0dXJucyAKLSAgICAgKiBvbmx5IGZpbGVzIGFzIGNoaWxkcmVuLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRGaWxlUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBlbGVtZW50ID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBvOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRGaWxlcyhjdXJyZW50UHJvdmlkZXIpLmdldENoaWxkcmVuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgdGhlIHJvb3QgRmlsZVN5c3RlbUVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBjb250ZW50cyBvZiB0aGUKLSAgICAgKgljdXJyZW50bHktc3BlY2lmaWVkIC56aXAgZmlsZS4gIElmIHRoaXMgRmlsZVN5c3RlbUVsZW1lbnQgaXMgbm90Ci0gICAgICoJY3VycmVudGx5IGRlZmluZWQgdGhlbiBjcmVhdGUgYW5kIHJldHVybiBpdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZ2V0RmlsZVN5c3RlbVRyZWUoKSB7Ci0KLSAgICAgICAgWmlwRmlsZSBzb3VyY2VGaWxlID0gZ2V0U3BlY2lmaWVkU291cmNlRmlsZSgpOwotICAgICAgICBpZiAoc291cmNlRmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvL0NsZWFyIG91dCB0aGUgcHJvdmlkZXIgYXMgd2VsbAotICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvdmlkZXIgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRTdHJ1Y3R1cmVQcm92aWRlcihzb3VyY2VGaWxlKTsKLSAgICAgICAgdGhpcy5jdXJyZW50UHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgcmV0dXJuIHNlbGVjdEZpbGVzKHByb3ZpZGVyLmdldFJvb3QoKSwgcHJvdmlkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb250ZW50IHByb3ZpZGVyIGZvciA8Y29kZT5GaWxlU3lzdGVtRWxlbWVudDwvY29kZT5zIHRoYXQgcmV0dXJucyAKLSAgICAgKiBvbmx5IGZvbGRlcnMgYXMgY2hpbGRyZW4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGdldEZvbGRlclByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZWxlbWVudCA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgbzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Rm9sZGVycyhjdXJyZW50UHJvdmlkZXIpLmdldENoaWxkcmVuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG8pIHsKLSAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGVsZW1lbnQgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIG87Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmlzUG9wdWxhdGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHdlIGhhdmUgbm90IHBvcHVsYXRlZCB0aGVuIHdhaXQgdW50aWwgYXNrZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgdGhlIHN0cmluZyB0byBkaXNwbGF5IGFzIHRoZSBsYWJlbCBmb3IgdGhlIHNvdXJjZSBzcGVjaWZpY2F0aW9uIGZpZWxkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VMYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIERhdGFUcmFuc2Zlck1lc3NhZ2VzLlppcEltcG9ydF9mcm9tRmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgYSBoYW5kbGUgdG8gdGhlIHppcCBmaWxlIGN1cnJlbnRseSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIHNvdXJjZS4KLSAgICAgKglSZXR1cm4gbnVsbCBpZiB0aGlzIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IG9mIHZhbGlkIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWmlwRmlsZSBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKCkgewotICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWVkU291cmNlRmlsZShzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgYSBoYW5kbGUgdG8gdGhlIHppcCBmaWxlIGN1cnJlbnRseSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIHNvdXJjZS4KLSAgICAgKglSZXR1cm4gbnVsbCBpZiB0aGlzIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IG9mIHZhbGlkIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFppcEZpbGUgZ2V0U3BlY2lmaWVkU291cmNlRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgaWYgKGZpbGVOYW1lLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBaaXBGaWxlKGZpbGVOYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGRpc3BsYXlFcnJvckRpYWxvZyhEYXRhVHJhbnNmZXJNZXNzYWdlcy5aaXBJbXBvcnRfYmFkRm9ybWF0KTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZGlzcGxheUVycm9yRGlhbG9nKERhdGFUcmFuc2Zlck1lc3NhZ2VzLlppcEltcG9ydF9jb3VsZE5vdFJlYWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgc291cmNlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJ1Y3R1cmUgcHJvdmlkZXIgZm9yIHRoZSBzcGVjaWZpZWQgemlwIGZpbGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcihaaXBGaWxlIHRhcmdldFppcCkgewotICAgICAgICBpZiAocHJvdmlkZXJDYWNoZSA9PSBudWxsKQotICAgICAgICAgICAgcHJvdmlkZXJDYWNoZSA9IG5ldyBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIodGFyZ2V0WmlwKTsKLSAgICAgICAgZWxzZSBpZiAoIXByb3ZpZGVyQ2FjaGUuZ2V0WmlwRmlsZSgpLmdldE5hbWUoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgdGFyZ2V0WmlwLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIGNsZWFyUHJvdmlkZXJDYWNoZSgpOwotICAgICAgICAgICAgLy8gaWUuLSBuZXcgdmFsdWUsIHNvIGZpbmFsaXplJnJlbW92ZSBvbGQgdmFsdWUKLSAgICAgICAgICAgIHByb3ZpZGVyQ2FjaGUgPSBuZXcgWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyKHRhcmdldFppcCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXByb3ZpZGVyQ2FjaGUuZ2V0WmlwRmlsZSgpLmVxdWFscyh0YXJnZXRaaXApKQotICAgICAgICAgICAgY2xvc2VaaXBGaWxlKHRhcmdldFppcCk7IC8vIGllLi0gZHVwbGljYXRlIGhhbmRsZSB0byBzYW1lIC56aXAKLQotICAgICAgICByZXR1cm4gcHJvdmlkZXJDYWNoZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglPcGVuIGEgRmlsZURpYWxvZyBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzcGVjaWZ5IHRoZSBzb3VyY2UKLSAgICAgKglmaWxlIHRvIGltcG9ydCBmcm9tCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU291cmNlQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLSAgICAgICAgU3RyaW5nIHNlbGVjdGVkRmlsZSA9IHF1ZXJ5WmlwRmlsZVRvSW1wb3J0KCk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIXNlbGVjdGVkRmlsZS5lcXVhbHMoc291cmNlTmFtZUZpZWxkLmdldFRleHQoKSkpIHsKLSAgICAgICAgICAgICAgICAvL0JlIHN1cmUgaXQgaXMgdmFsaWQgYmVmb3JlIHdlIGdvIHNldHRpbmcgYW55IG5hbWVzCi0gICAgICAgICAgICAgICAgWmlwRmlsZSBzb3VyY2VGaWxlID0gZ2V0U3BlY2lmaWVkU291cmNlRmlsZShzZWxlY3RlZEZpbGUpOwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VaaXBGaWxlKHNvdXJjZUZpbGUpOwotICAgICAgICAgICAgICAgICAgICBzZXRTb3VyY2VOYW1lKHNlbGVjdGVkRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkdyb3VwLnNldEZvY3VzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEltcG9ydCB0aGUgcmVzb3VyY2VzIHdpdGggZXh0ZW5zaW9ucyBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbXBvcnRSZXNvdXJjZXMoTGlzdCBmaWxlU3lzdGVtT2JqZWN0cykgewotICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKCk7Ci0gICAgICAgIFppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IGdldFN0cnVjdHVyZVByb3ZpZGVyKHppcEZpbGUpOwotICAgICAgICBJbXBvcnRPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEltcG9ydE9wZXJhdGlvbihnZXRDb250YWluZXJGdWxsUGF0aCgpLAotICAgICAgICAgICAgICAgIHN0cnVjdHVyZVByb3ZpZGVyLmdldFJvb3QoKSwgc3RydWN0dXJlUHJvdmlkZXIsIHRoaXMsCi0gICAgICAgICAgICAgICAgZmlsZVN5c3RlbU9iamVjdHMpOwotCi0gICAgICAgIG9wZXJhdGlvbi5zZXRDb250ZXh0KGdldFNoZWxsKCkpOwotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGV4ZWN1dGVJbXBvcnRPcGVyYXRpb24ob3BlcmF0aW9uKTsKLQotICAgICAgICBjbG9zZVppcEZpbGUoemlwRmlsZSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBhcHByb3ByaWF0ZWx5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcGVyYXRpb24oSW1wb3J0T3BlcmF0aW9uIG9wKSB7Ci0gICAgICAgIG9wLnNldE92ZXJ3cml0ZVJlc291cmNlcyhvdmVyd3JpdGVFeGlzdGluZ1Jlc291cmNlc0NoZWNrYm94Ci0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyBhbmQgcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlCi0gICAgICogc2VsZWN0ZWQgZmlsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRpYWxvZyB3YXMgY2FuY2VsZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBxdWVyeVppcEZpbGVUb0ltcG9ydCgpIHsKLSAgICAgICAgRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzb3VyY2VOYW1lRmllbGQuZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotICAgICAgICBkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhGSUxFX0lNUE9SVF9NQVNLKTsKLSAgICAgICAgZGlhbG9nLnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuWmlwSW1wb3J0U291cmNlX3RpdGxlKTsKLQotICAgICAgICBTdHJpbmcgY3VycmVudFNvdXJjZVN0cmluZyA9IHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICAgIGludCBsYXN0U2VwYXJhdG9ySW5kZXggPSBjdXJyZW50U291cmNlU3RyaW5nCi0gICAgICAgICAgICAgICAgLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgICAgaWYgKGxhc3RTZXBhcmF0b3JJbmRleCAhPSAtMSkKLSAgICAgICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJQYXRoKGN1cnJlbnRTb3VyY2VTdHJpbmcuc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgICAgIGxhc3RTZXBhcmF0b3JJbmRleCkpOwotCi0gICAgICAgIHJldHVybiBkaWFsb2cub3BlbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCVJlcG9wdWxhdGUgdGhlIHZpZXcgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBlbnRlcmVkIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNldFNlbGVjdGlvbigpIHsKLQotICAgICAgICBzdXBlci5yZXNldFNlbGVjdGlvbigpOwotICAgICAgICBzZXRBbGxTZWxlY3Rpb25zKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCVVzZSB0aGUgZGlhbG9nIHN0b3JlIHRvIHJlc3RvcmUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgdmFsdWVzIHRoYXQgdGhleSBoZWxkCi0gICAgICoJbGFzdCB0aW1lIHRoaXMgd2l6YXJkIHdhcyB1c2VkIHRvIGNvbXBsZXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nW10gc291cmNlTmFtZXMgPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9TT1VSQ0VfTkFNRVNfSUQpOwotICAgICAgICAgICAgaWYgKHNvdXJjZU5hbWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBpZS4tIG5vIHNldHRpbmdzIHN0b3JlZAotCi0gICAgICAgICAgICAvLyBzZXQgZmlsZW5hbWVzIGhpc3RvcnkKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgc291cmNlTmFtZUZpZWxkLmFkZChzb3VyY2VOYW1lc1tpXSk7Ci0KLSAgICAgICAgICAgIC8vIHJhZGlvIGJ1dHRvbnMgYW5kIGNoZWNrYm94ZXMJCi0gICAgICAgICAgICBvdmVyd3JpdGVFeGlzdGluZ1Jlc291cmNlc0NoZWNrYm94LnNldFNlbGVjdGlvbihzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAuZ2V0Qm9vbGVhbihTVE9SRV9PVkVSV1JJVEVfRVhJU1RJTkdfUkVTT1VSQ0VTX0lEKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAJU2luY2UgRmluaXNoIHdhcyBwcmVzc2VkLCB3cml0ZSB3aWRnZXQgdmFsdWVzIHRvIHRoZSBkaWFsb2cgc3RvcmUgc28gdGhhdCB0aGV5Ci0gICAgICoJd2lsbCBwZXJzaXN0IGludG8gdGhlIG5leHQgaW52b2NhdGlvbiBvZiB0aGlzIHdpemFyZCBwYWdlLgotICAgICAqCi0gICAgICoJTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIGlkZW50aWNhbCB0byB0aGUgb25lIHRoYXQgYXBwZWFycyBpbiB0aGUgc3VwZXJjbGFzcy4KLSAgICAgKglUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHByb3BlciBvdmVycmlkaW5nIG9mIGluc3RhbmNlIHZhcmlhYmxlcyBpcyBub3Qgb2NjdXJyaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNhdmVXaWRnZXRWYWx1ZXMoKSB7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB1cGRhdGUgc291cmNlIG5hbWVzIGhpc3RvcnkKLSAgICAgICAgICAgIFN0cmluZ1tdIHNvdXJjZU5hbWVzID0gc2V0dGluZ3MuZ2V0QXJyYXkoU1RPUkVfU09VUkNFX05BTUVTX0lEKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1swXTsKLQotICAgICAgICAgICAgc291cmNlTmFtZXMgPSBhZGRUb0hpc3Rvcnkoc291cmNlTmFtZXMsIHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgc2V0dGluZ3MucHV0KFNUT1JFX1NPVVJDRV9OQU1FU19JRCwgc291cmNlTmFtZXMpOwotCi0gICAgICAgICAgICAvLyB1cGRhdGUgc3BlY2lmaWMgdHlwZXMgdG8gaW1wb3J0IGhpc3RvcnkKLSAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGVkVHlwZXNOYW1lcyA9IHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBcnJheShTVE9SRV9TRUxFQ1RFRF9UWVBFU19JRCk7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0ZWRUeXBlc05hbWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlc05hbWVzID0gbmV3IFN0cmluZ1swXTsKLQotICAgICAgICAgICAgc2V0dGluZ3MucHV0KFNUT1JFX09WRVJXUklURV9FWElTVElOR19SRVNPVVJDRVNfSUQsCi0gICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgc2VsZidzIHNvdXJjZSBzcGVjaWZpY2F0aW9uCi0gICAgICoJd2lkZ2V0cyBjdXJyZW50bHkgYWxsIGNvbnRhaW4gdmFsaWQgdmFsdWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU291cmNlR3JvdXAoKSB7Ci0KLSAgICAgICAgLy9JZiB0aGVyZSBpcyBub3RoaW5nIGJlaW5nIHByb3ZpZGVkIHRvIHRoZSBpbnB1dCB0aGVuIHRoZXJlIGlzIGEgcHJvYmxlbQotICAgICAgICBpZiAodGhpcy5jdXJyZW50UHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0TWVzc2FnZShTT1VSQ0VfRU1QVFlfTUVTU0FHRSk7Ci0gICAgICAgICAgICBlbmFibGVCdXR0b25Hcm91cChmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbmFibGVCdXR0b25Hcm91cCh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL1ppcEZpbGVFeHBvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL1ppcEZpbGVFeHBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNmNjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9aaXBGaWxlRXhwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0KLS8qKgotICoJRXhwb3J0cyByZXNvdXJjZXMgdG8gYSAuemlwIGZpbGUKLSAqLwotcHVibGljIGNsYXNzIFppcEZpbGVFeHBvcnRlciBpbXBsZW1lbnRzIElGaWxlRXhwb3J0ZXIgewotICAgIHByaXZhdGUgWmlwT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VDb21wcmVzc2lvbiA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKglDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICAgKgotICAgICAqCUBwYXJhbSBmaWxlbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICoJQHBhcmFtIGNvbXByZXNzIGJvb2xlYW4KLSAgICAgKglAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgWmlwRmlsZUV4cG9ydGVyKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiBjb21wcmVzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IFppcE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSkpOwotICAgICAgICB1c2VDb21wcmVzc2lvbiA9IGNvbXByZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCURvIGFsbCByZXF1aXJlZCBjbGVhbnVwIG5vdyB0aGF0IHdlJ3JlIGZpbmlzaGVkIHdpdGggdGhlCi0gICAgICoJY3VycmVudGx5LW9wZW4gLnppcAotICAgICAqCi0gICAgICoJQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmluaXNoZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgdG8gdGhlIHRhciBhcmNoaXZlLgotICAgICAqCi0gICAgICoJQHBhcmFtIGVudHJ5Ci0gICAgICoJQHBhcmFtIGNvbnRlbnRzCi0gICAgICogIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlKFppcEVudHJ5IGVudHJ5LCBJRmlsZSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIHJlYWRCdWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKLQotICAgICAgICAvLyBJZiB0aGUgY29udGVudHMgYXJlIGJlaW5nIGNvbXByZXNzZWQgdGhlbiB3ZSBnZXQgdGhlIGJlbG93IGZvciBmcmVlLgotICAgICAgICBpZiAoIXVzZUNvbXByZXNzaW9uKSB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRNZXRob2QoWmlwRW50cnkuU1RPUkVEKTsKLSAgICAgICAgCUlucHV0U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBjb250ZW50cy5nZXRDb250ZW50cyhmYWxzZSk7Ci0gICAgICAgIAlpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgICAgIENSQzMyIGNoZWNrc3VtQ2FsY3VsYXRvciA9IG5ldyBDUkMzMigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgbjsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKG4gPSBjb250ZW50U3RyZWFtLnJlYWQocmVhZEJ1ZmZlcikpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBjaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKHJlYWRCdWZmZXIsIDAsIG4pOwotICAgICAgICAgICAgICAgICAgICBsZW5ndGggKz0gbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50U3RyZWFtICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW50cnkuc2V0U2l6ZShsZW5ndGgpOwotICAgICAgICAgICAgZW50cnkuc2V0Q3JjKGNoZWNrc3VtQ2FsY3VsYXRvci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dHB1dFN0cmVhbS5wdXROZXh0RW50cnkoZW50cnkpOwotICAgIAlJbnB1dFN0cmVhbSBjb250ZW50U3RyZWFtID0gY29udGVudHMuZ2V0Q29udGVudHMoZmFsc2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IG47Ci0gICAgICAgICAgICB3aGlsZSAoKG4gPSBjb250ZW50U3RyZWFtLnJlYWQocmVhZEJ1ZmZlcikpID4gMCkgewotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShyZWFkQnVmZmVyLCAwLCBuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjb250ZW50U3RyZWFtICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZUVudHJ5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFdyaXRlIHRoZSBwYXNzZWQgcmVzb3VyY2UgdG8gdGhlIGN1cnJlbnQgYXJjaGl2ZS4KLSAgICAgKgotICAgICAqICBAcGFyYW0gcmVzb3VyY2Ugb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUKLSAgICAgKiAgQHBhcmFtIGRlc3RpbmF0aW9uUGF0aCBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICogIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGUoSUZpbGUgcmVzb3VyY2UsIFN0cmluZyBkZXN0aW5hdGlvblBhdGgpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotICAgICAgICBaaXBFbnRyeSBuZXdFbnRyeSA9IG5ldyBaaXBFbnRyeShkZXN0aW5hdGlvblBhdGgpOwotICAgICAgICB3cml0ZShuZXdFbnRyeSwgcmVzb3VyY2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9aaXBMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL2RhdGF0cmFuc2Zlci9aaXBMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlNzUwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvWmlwTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFJlZCBIYXQsIEluYyAtIFdhcyBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIsIHBlcmZvcm1lZCBjaGFuZ2VzIGZyb20gCi0gKiAgICAgSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHRvIElMZXZlbGVkSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBjb250ZXh0IHN0cnVjdHVyZSBhbmQgY29udGVudAotICogb2Ygc3BlY2lmaWVkIHppcCBmaWxlIGVudHJ5IG9iamVjdHMuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFppcExldmVsZWRTdHJ1Y3R1cmVQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlMZXZlbGVkSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgewotCXByaXZhdGUgWmlwRmlsZSB6aXBGaWxlOwotCi0JcHJpdmF0ZSBaaXBFbnRyeSByb290ID0gbmV3IFppcEVudHJ5KCIvIik7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYXAgY2hpbGRyZW47Ci0KLQlwcml2YXRlIE1hcCBkaXJlY3RvcnlFbnRyeUNhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgaW50IHN0cmlwTGV2ZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+WmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyPC9jb2RlPiwgd2hpY2ggd2lsbCBvcGVyYXRlIG9uCi0JICogdGhlIHBhc3NlZCB6aXAgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlRmlsZQotCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBmaWxlIHRvIGNyZWF0ZSB0aGUgWmlwTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyCi0JICogICAgICAgICAgICBhcm91bmQKLQkgKi8KLQlwdWJsaWMgWmlwTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyKFppcEZpbGUgc291cmNlRmlsZSkgewotCQlzdXBlcigpOwotCQl6aXBGaWxlID0gc291cmNlRmlsZTsKLQkJc3RyaXBMZXZlbCA9IDA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgemlwIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBpZmYgaXQgaGFzIAotCSAqIG5vdCBhbHJlYWR5IGJlZW4gY3JlYXRlZC4gSWYgdGhlIHBhcmVudCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBkb2VzIG5vdAotCSAqIGFscmVhZHkgZXhpc3QgaXQgd2lsbCBiZSByZWN1cnNpdmVseSBjcmVhdGVkIGFzIHdlbGwuCi0JICogQHBhcmFtIHBhdGhuYW1lIFRoZSBwYXRoIHJlcHJlc2VudGluZyB0aGUgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgZWxlbWVudCByZXByZXNlbnRlZCBieSB0aGlzIHBhdGhuYW1lIChpdCBtYXkgaGF2ZSBhbHJlYWR5IGV4aXN0ZWQpCi0JICovCi0JcHJvdGVjdGVkIFppcEVudHJ5IGNyZWF0ZUNvbnRhaW5lcihJUGF0aCBwYXRobmFtZSkgewotCQlaaXBFbnRyeSBleGlzdGluZ0VudHJ5ID0gKFppcEVudHJ5KSBkaXJlY3RvcnlFbnRyeUNhY2hlLmdldChwYXRobmFtZSk7Ci0JCWlmIChleGlzdGluZ0VudHJ5ICE9IG51bGwpCi0JCQlyZXR1cm4gZXhpc3RpbmdFbnRyeTsKLQotCQlaaXBFbnRyeSBwYXJlbnQ7Ci0JCWlmIChwYXRobmFtZS5zZWdtZW50Q291bnQoKSA9PSAxKQotCQkJcGFyZW50ID0gcm9vdDsKLQkJZWxzZQotCQkJcGFyZW50ID0gY3JlYXRlQ29udGFpbmVyKHBhdGhuYW1lLnJlbW92ZUxhc3RTZWdtZW50cygxKSk7Ci0JCVppcEVudHJ5IG5ld0VudHJ5ID0gbmV3IFppcEVudHJ5KHBhdGhuYW1lLnRvU3RyaW5nKCkpOwotCQlkaXJlY3RvcnlFbnRyeUNhY2hlLnB1dChwYXRobmFtZSwgbmV3RW50cnkpOwotCQlMaXN0IGNoaWxkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY2hpbGRyZW4ucHV0KG5ld0VudHJ5LCBjaGlsZExpc3QpOwotCi0JCUxpc3QgcGFyZW50Q2hpbGRMaXN0ID0gKExpc3QpIGNoaWxkcmVuLmdldChwYXJlbnQpOwotCQlwYXJlbnRDaGlsZExpc3QuYWRkKG5ld0VudHJ5KTsKLQkJcmV0dXJuIG5ld0VudHJ5OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZmlsZSB6aXAgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsZShaaXBFbnRyeSBlbnRyeSkgewotCQlJUGF0aCBwYXRobmFtZSA9IG5ldyBQYXRoKGVudHJ5LmdldE5hbWUoKSk7Ci0JCVppcEVudHJ5IHBhcmVudDsKLQkJaWYgKHBhdGhuYW1lLnNlZ21lbnRDb3VudCgpID09IDEpCi0JCQlwYXJlbnQgPSByb290OwotCQllbHNlCi0JCQlwYXJlbnQgPSAoWmlwRW50cnkpIGRpcmVjdG9yeUVudHJ5Q2FjaGUuZ2V0KHBhdGhuYW1lCi0JCQkJCS5yZW1vdmVMYXN0U2VnbWVudHMoMSkpOwotCi0JCUxpc3QgY2hpbGRMaXN0ID0gKExpc3QpIGNoaWxkcmVuLmdldChwYXJlbnQpOwotCQljaGlsZExpc3QuYWRkKGVudHJ5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlcgotCSAqLwotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZSgpOwotCi0JCXJldHVybiAoKExpc3QpIGNoaWxkcmVuLmdldChlbGVtZW50KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB6aXBGaWxlLmdldElucHV0U3RyZWFtKChaaXBFbnRyeSkgZWxlbWVudCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBTdHJpcCB0aGUgbGVhZGluZyBkaXJlY3RvcmllcyBmcm9tIHRoZSBwYXRoCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc3RyaXBQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCVN0cmluZyBwYXRoT3JpZyA9IG5ldyBTdHJpbmcocGF0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyaXBMZXZlbDsgaSsrKSB7Ci0JCQlpbnQgZmlyc3RTZXAgPSBwYXRoLmluZGV4T2YoJy8nKTsKLQkJCS8vIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgd2FzIGEgc2VwZXJhdG9yIHdlIG11c3Qgc3RyaXAgdG8gdGhlIG5leHQKLQkJCS8vIHNlcGVyYXRvciBhcyB3ZWxsCi0JCQlpZiAoZmlyc3RTZXAgPT0gMCkgewotCQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLQkJCQlmaXJzdFNlcCA9IHBhdGguaW5kZXhPZignLycpOwotCQkJfQotCQkJLy8gTm8gc2VwZXJhdG9yIHdhc3cgcHJlc2VudCBzbyB3ZSdyZSBpbiBhIGhpZ2hlciBkaXJlY3RvcnkgcmlnaHQKLQkJCS8vIG5vdwotCQkJaWYgKGZpcnN0U2VwID09IC0xKQotCQkJCXJldHVybiBwYXRoT3JpZzsKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhmaXJzdFNlcCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxQYXRoKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBzdHJpcFBhdGgoKChaaXBFbnRyeSkgZWxlbWVudCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZXF1YWxzKHJvb3QpKQotCQkJcmV0dXJuICgoWmlwRW50cnkpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQotCQlyZXR1cm4gc3RyaXBQYXRoKG5ldyBQYXRoKCgoWmlwRW50cnkpIGVsZW1lbnQpLmdldE5hbWUoKSkubGFzdFNlZ21lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW50cnkgdGhhdCB0aGlzIGltcG9ydGVyIHVzZXMgYXMgdGhlIHJvb3Qgc2VudGluZWwuCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB6aXAgZmlsZSB0aGF0IHRoaXMgcHJvdmlkZXIgcHJvdmlkZXMgc3RydWN0dXJlIGZvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSB6aXAgZmlsZQotCSAqLwotCXB1YmxpYyBaaXBGaWxlIGdldFppcEZpbGUoKSB7Ci0JCXJldHVybiB6aXBGaWxlOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgb2JqZWN0J3MgY2hpbGRyZW4gdGFibGUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZQotCSAqIHNwZWNpZmllZCBzb3VyY2UgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQljaGlsZHJlbiA9IG5ldyBIYXNoTWFwKDEwMDApOwotCi0JCWNoaWxkcmVuLnB1dChyb290LCBuZXcgQXJyYXlMaXN0KCkpOwotCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gemlwRmlsZS5lbnRyaWVzKCk7Ci0JCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGVudHJ5LmdldE5hbWUoKSkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQotCQkJaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpCi0JCQkJY3JlYXRlQ29udGFpbmVyKHBhdGgpOwotCQkJZWxzZQotCQkJewotCQkJCS8vIEVuc3VyZSB0aGUgY29udGFpbmVyIHN0cnVjdHVyZSBmb3IgYWxsIGxldmVscyBhYm92ZSB0aGlzIGlzIGluaXRpYWxpemVkCi0JCQkJLy8gT25jZSB3ZSBoaXQgYSBoaWdoZXItbGV2ZWwgY29udGFpbmVyIHRoYXQncyBhbHJlYWR5IGFkZGVkIHdlIG5lZWQgZ28gbm8gZnVydGhlcgotCQkJCWludCBwYXRoU2VnbWVudENvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQlpZiAocGF0aFNlZ21lbnRDb3VudCA+IDEpCi0JCQkJCWNyZWF0ZUNvbnRhaW5lcihwYXRoLnVwdG9TZWdtZW50KHBhdGhTZWdtZW50Q291bnQgLSAxKSk7Ci0JCQkJY3JlYXRlRmlsZShlbnRyeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9sZGVyKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoKFppcEVudHJ5KSBlbGVtZW50KS5pc0RpcmVjdG9yeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmlwKGludCBsZXZlbCkgewotCQlzdHJpcExldmVsID0gbGV2ZWw7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdHJpcCgpIHsKLQkJcmV0dXJuIHN0cmlwTGV2ZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyOTI2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBSZWQgSGF0LCBJbmMgLSBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VbX0FyY2hpdmVTZWxlY3RUaXRsZSwKLSMJCQkJCQkJCQkJCSAgX1NlbGVjdEFyY2hpdmVEaWFsb2dUaXRsZV0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBwYWNrYWdlOiBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2ZlcgotCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERhdGEgVHJhbnNmZXIgV2l6YXJkcwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLURhdGFUcmFuc2Zlcl9maWxlU3lzdGVtVGl0bGUgPSBGaWxlIHN5c3RlbQotWmlwRXhwb3J0X2V4cG9ydFRpdGxlID0gWmlwIGZpbGUKLUFyY2hpdmVFeHBvcnRfZXhwb3J0VGl0bGUgPSBBcmNoaXZlIGZpbGUKLQotRGF0YVRyYW5zZmVyX2Jyb3dzZSA9IEImcm93c2UuLi4KLURhdGFUcmFuc2Zlcl9zZWxlY3RUeXBlcyA9IEZpbHRlciAmVHlwZXMuLi4KLURhdGFUcmFuc2Zlcl9zZWxlY3RBbGwgPSAmU2VsZWN0IEFsbAotRGF0YVRyYW5zZmVyX2Rlc2VsZWN0QWxsID0gJkRlc2VsZWN0IEFsbAotRGF0YVRyYW5zZmVyX3JlZnJlc2ggPSBSJmVmcmVzaAotCi1EYXRhVHJhbnNmZXJfY2Fubm90T3ZlcndyaXRlID0gQ2Fubm90IG92ZXJ3cml0ZSBmaWxlOiB7MH0KLURhdGFUcmFuc2Zlcl9lbXB0eVN0cmluZyA9Ci1EYXRhVHJhbnNmZXJfc2Nhbm5pbmdDaGlsZHJlbiA9IFNjYW5uaW5nIGZvciBjaGlsZHJlbi4uLgotRGF0YVRyYW5zZmVyX3NjYW5uaW5nTWF0Y2hpbmcgPSBTY2FubmluZyBmb3IgbWF0Y2hpbmcgZmlsZXMuLi4KLURhdGFUcmFuc2Zlcl9pbmZvcm1hdGlvbiA9IEluZm9ybWF0aW9uCi0KLSMgLS0tIEltcG9ydCBXaXphcmRzIC0tLQotRGF0YVRyYW5zZmVyX2ltcG9ydFRpdGxlID0gSW1wb3J0Ci0KLURhdGFUcmFuc2Zlcl9pbXBvcnRUYXNrID0gSW1wb3J0aW5nOgotSW1wb3J0T3BlcmF0aW9uX2Nhbm5vdENvcHkgPSBDYW5ub3QgY29weSByb290IGZpbGUgc3lzdGVtLgotSW1wb3J0T3BlcmF0aW9uX2ltcG9ydFByb2JsZW1zID0gUHJvYmxlbXMgd2VyZSBlbmNvdW50ZXJlZCBkdXJpbmcgaW1wb3J0OgotSW1wb3J0T3BlcmF0aW9uX29wZW5TdHJlYW1FcnJvciA9IEVycm9yIG9wZW5pbmcgaW5wdXQgc3RyZWFtIGZvciB7MH0KLUltcG9ydE9wZXJhdGlvbl9jbG9zZVN0cmVhbUVycm9yID0gQ291bGQgbm90IGNsb3NlIGlucHV0IHN0cmVhbSBmb3IgezB9Ci1JbXBvcnRPcGVyYXRpb25fY29yZUltcG9ydEVycm9yID0gVW5hYmxlIHRvIGltcG9ydCB7MH0uICBSZWFzb246IHsxfQotSW1wb3J0T3BlcmF0aW9uX3RhcmdldFNhbWVBc1NvdXJjZUVycm9yID0gVW5hYmxlIHRvIGltcG9ydCB7MH0uIFRoZSBmaWxlIGNhbm5vdCBiZSBjb3BpZWQgb250byBpdHNlbGYKLUltcG9ydFBhZ2VfZmlsdGVyU2VsZWN0aW9ucyA9IEZpbHRlcmluZyBzZWxlY3Rpb24KLQotRmlsZUltcG9ydF9zZWxlY3RTb3VyY2UgPSBTZWxlY3QgYSBkaXJlY3RvcnkgdG8gaW1wb3J0IGZyb20uCi1GaWxlSW1wb3J0X3NlbGVjdFNvdXJjZVRpdGxlID0gSW1wb3J0IGZyb20gZGlyZWN0b3J5Ci1GaWxlSW1wb3J0X2Zyb21EaXJlY3RvcnkgPSBGcm9tIGRpcmVjdG9yJnk6Ci1GaWxlSW1wb3J0X2ltcG9ydEZpbGVTeXN0ZW0gPSBJbXBvcnQgcmVzb3VyY2VzIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotRmlsZUltcG9ydF9vdmVyd3JpdGVFeGlzdGluZyA9ICZPdmVyd3JpdGUgZXhpc3RpbmcgcmVzb3VyY2VzIHdpdGhvdXQgd2FybmluZwotRmlsZUltcG9ydF9jcmVhdGVDb21wbGV0ZSA9ICZDcmVhdGUgY29tcGxldGUgZm9sZGVyIHN0cnVjdHVyZQotRmlsZUltcG9ydF9jcmVhdGVTZWxlY3RlZEZvbGRlcnMgPSBDcmVhdGUgcyZlbGVjdGVkIGZvbGRlcnMgb25seQotRmlsZUltcG9ydF9ub25lU2VsZWN0ZWQgPSBUaGVyZSBhcmUgbm8gcmVzb3VyY2VzIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgaW1wb3J0LgotRmlsZUltcG9ydF9pbnZhbGlkU291cmNlID0gU291cmNlIGRpcmVjdG9yeSBpcyBub3QgdmFsaWQgb3IgaGFzIG5vdCBiZWVuIHNwZWNpZmllZC4KLUZpbGVJbXBvcnRfc291cmNlRW1wdHkgPSBTb3VyY2UgbXVzdCBub3QgYmUgZW1wdHkuCi1GaWxlSW1wb3J0X2ltcG9ydFByb2JsZW1zID0gSW1wb3J0IFByb2JsZW1zCi0KLVppcEltcG9ydF9kZXNjcmlwdGlvbiA9IEltcG9ydCB0aGUgY29udGVudHMgb2YgYSBaaXAgZmlsZSBmcm9tIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KLVppcEltcG9ydF9jb3VsZE5vdENsb3NlID0gQ291bGQgbm90IGNsb3NlIGZpbGUgezB9Ci1aaXBJbXBvcnRfYmFkRm9ybWF0ID0gU291cmNlIGZpbGUgaXMgbm90IGEgdmFsaWQgWmlwIGZpbGUuCi1aaXBJbXBvcnRfY291bGROb3RSZWFkID0gU291cmNlIGZpbGUgY291bGQgbm90IGJlIHJlYWQuCi1aaXBJbXBvcnRfZnJvbUZpbGUgPSBGcm9tICZ6aXAgZmlsZToKLVppcEltcG9ydFNvdXJjZV90aXRsZSA9IEltcG9ydCBmcm9tIFppcCBGaWxlCi0KLUFyY2hpdmVJbXBvcnRfZGVzY3JpcHRpb24gPSBJbXBvcnQgdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgZmlsZSBpbiB6aXAgb3IgdGFyIGZvcm1hdCBmcm9tIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KLUFyY2hpdmVJbXBvcnRfZnJvbUZpbGUgPSBGcm9tICZhcmNoaXZlIGZpbGU6Ci1BcmNoaXZlSW1wb3J0U291cmNlX3RpdGxlID0gSW1wb3J0IGZyb20gQXJjaGl2ZSBGaWxlCi1UYXJJbXBvcnRfYmFkRm9ybWF0ID0gU291cmNlIGZpbGUgaXMgbm90IGEgdmFsaWQgdGFyIGZpbGUuCi1UYXJJbXBvcnRfaW52YWxpZF90YXJfZm9ybWF0ID0gTm90IGEgdmFsaWQgdGFyIGZvcm1hdAotCi1XaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlX2xvY2F0aW9uRXJyb3IgPSBJbnZhbGlkIHByb2plY3QgY29udGVudHMgZGlyZWN0b3J5Ci1XaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlX3Byb2plY3RMb2NhdGlvbkVtcHR5ID0gUHJvamVjdCBjb250ZW50cyBkaXJlY3RvcnkgbXVzdCBiZSBzcGVjaWZpZWQKLVdpemFyZEV4dGVybmFsUHJvamVjdEltcG9ydFBhZ2VfcHJvamVjdEV4aXN0c01lc3NhZ2UgPSBQcm9qZWN0IGFscmVhZHkgZXhpc3RzLgotV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9wcm9qZWN0Q29udGVudHNMYWJlbCA9IFByb2plY3QgJmNvbnRlbnRzOgotV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9uYW1lTGFiZWwgPSAmUHJvamVjdCBuYW1lOgotV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlX1Jvb3RTZWxlY3RUaXRsZT1TZWxlY3Qgcm9vJnQgZGlyZWN0b3J5OgotV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV90aXRsZSA9IEltcG9ydCBQcm9qZWN0IGZyb20gRmlsZSBTeXN0ZW0KLVdpemFyZEV4dGVybmFsUHJvamVjdEltcG9ydFBhZ2VfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgUHJvamVjdCBmcm9tIGFuIEVjbGlwc2UgcHJvamVjdCBpbiB0aGUgZmlsZSBzeXN0ZW0uIAotV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9ub3RBUHJvamVjdCA9IHswfSBkb2VzIG5vdCBoYXZlIGEgLnByb2plY3QgZmlsZS4KLVdpemFyZFByb2plY3RzSW1wb3J0UGFnZV9BcmNoaXZlU2VsZWN0VGl0bGU9U2VsZWN0ICZhcmNoaXZlIGZpbGU6Ci1XaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfU2VsZWN0QXJjaGl2ZURpYWxvZ1RpdGxlPVNlbGVjdCBhcmNoaXZlIGNvbnRhaW5pbmcgdGhlIHByb2plY3RzIHRvIGltcG9ydAotV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlX1Byb2plY3RzTGlzdFRpdGxlPSZQcm9qZWN0czoKLVdpemFyZFByb2plY3RzSW1wb3J0UGFnZV9Qcm9jZXNzaW5nTWVzc2FnZT1Qcm9jZXNzaW5nIHJlc3VsdHMKLVdpemFyZFByb2plY3RzSW1wb3J0UGFnZV9TZWxlY3REaWFsb2dUaXRsZT1TZWxlY3Qgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3RzIHRvIGltcG9ydAotV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlX1NlYXJjaGluZ01lc3NhZ2U9U2VhcmNoaW5nIGZvciBwcm9qZWN0cwotV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9lcnJvck1lc3NhZ2UgPSBDcmVhdGlvbiBQcm9ibGVtcwotV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlX0ltcG9ydFByb2plY3RzVGl0bGU9SW1wb3J0IFByb2plY3RzCi1XaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2VfQ3JlYXRlUHJvamVjdHNUYXNrPUNyZWF0aW5nIFByb2plY3RzCi1XaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlX2Nhc2VWYXJpYW50RXhpc3RzRXJyb3IgPSBUaGUgbmFtZSBvZiB7MH0gY29uZmxpY3RzIHdpdGggYW5vdGhlciBwcm9qZWN0IGluIHRoZSB3b3JrYmVuY2guIFByb2plY3QgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCi1XaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlX2RpcmVjdG9yeUxhYmVsID0gU2VsZWN0IHRoZSBQcm9qZWN0IGxvY2F0aW9uLgotV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlX0ltcG9ydFByb2plY3RzRGVzY3JpcHRpb249U2VsZWN0IGEgZGlyZWN0b3J5IHRvIHNlYXJjaCBmb3IgZXhpc3RpbmcgRWNsaXBzZSBwcm9qZWN0cy4KLVdpemFyZFByb2plY3RzSW1wb3J0UGFnZV9DaGVja2luZ01lc3NhZ2U9IENoZWNraW5nOiB7MH0KLVdpemFyZFByb2plY3RzSW1wb3J0UGFnZV9Db3B5UHJvamVjdHNJbnRvV29ya3NwYWNlPSZDb3B5IHByb2plY3RzIGludG8gd29ya3NwYWNlCi0KLSMgLS0tIEV4cG9ydCBXaXphcmRzIC0tLQotRGF0YVRyYW5zZmVyX2V4cG9ydCA9IEV4cG9ydAotCi1EYXRhVHJhbnNmZXJfZXhwb3J0aW5nVGl0bGUgPSBFeHBvcnRpbmc6Ci1EYXRhVHJhbnNmZXJfY3JlYXRlVGFyZ2V0RGlyZWN0b3J5ID0gVGFyZ2V0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gIFdvdWxkIHlvdSBsaWtlIHRvIGNyZWF0ZSBpdD8KLURhdGFUcmFuc2Zlcl9kaXJlY3RvcnlDcmVhdGlvbkVycm9yID0gVGFyZ2V0IGRpcmVjdG9yeSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLURhdGFUcmFuc2Zlcl9lcnJvckV4cG9ydGluZyA9IEVycm9yIGV4cG9ydGluZyB7MH06IHsxfQotRGF0YVRyYW5zZmVyX2V4cG9ydFByb2JsZW1zID0gRXhwb3J0IFByb2JsZW1zCi0KLUV4cG9ydEZpbGVfb3ZlcndyaXRlRXhpc3RpbmcgPSAmT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIHdpdGhvdXQgd2FybmluZwotCi1GaWxlRXhwb3J0X3NlbGVjdERlc3RpbmF0aW9uVGl0bGU9IEV4cG9ydCB0byBEaXJlY3RvcnkKLUZpbGVFeHBvcnRfc2VsZWN0RGVzdGluYXRpb25NZXNzYWdlPVNlbGVjdCBhIGRpcmVjdG9yeSB0byBleHBvcnQgdG8uCi1GaWxlRXhwb3J0X2V4cG9ydExvY2FsRmlsZVN5c3RlbSA9IEV4cG9ydCByZXNvdXJjZXMgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotRmlsZUV4cG9ydF9kZXN0aW5hdGlvbkVtcHR5ID0gUGxlYXNlIGVudGVyIGEgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotRmlsZUV4cG9ydF9jcmVhdGVEaXJlY3RvcnlTdHJ1Y3R1cmUgPSAmQ3JlYXRlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIGZpbGVzCi1GaWxlRXhwb3J0X2NyZWF0ZVNlbGVjdGVkRGlyZWN0b3JpZXMgPSBDcmVhdGUgb24mbHkgc2VsZWN0ZWQgZGlyZWN0b3JpZXMKLUZpbGVFeHBvcnRfbm9uZVNlbGVjdGVkID0gVGhlcmUgYXJlIG5vIHJlc291cmNlcyBjdXJyZW50bHkgc2VsZWN0ZWQgZm9yIGV4cG9ydC4KLUZpbGVFeHBvcnRfZGlyZWN0b3J5RXhpc3RzID0gVGFyZ2V0IGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBhcyBhIGZpbGUuCi1GaWxlRXhwb3J0X2NvbmZsaWN0aW5nQ29udGFpbmVyID0gRGVzdGluYXRpb24gZGlyZWN0b3J5IGNvbmZsaWN0cyB3aXRoIGxvY2F0aW9uIG9mIHswfS4KLUZpbGVFeHBvcnRfcm9vdE5hbWUgPSB3b3Jrc3BhY2Ugcm9vdAotRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbl9wcm9ibGVtc0V4cG9ydGluZyA9IFByb2JsZW1zIHdlcmUgZW5jb3VudGVyZWQgZHVyaW5nIGV4cG9ydDoKLUZpbGVFeHBvcnRfdG9EaXJlY3RvcnkgPSBUbyBkaXJlY3RvciZ5OgotCi1aaXBFeHBvcnRfY29tcHJlc3NDb250ZW50cyA9IENvJm1wcmVzcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUKLVppcEV4cG9ydF9kZXNjcmlwdGlvbiA9IEV4cG9ydCByZXNvdXJjZXMgdG8gYSBaaXAgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi1aaXBFeHBvcnRfZGVzdGluYXRpb25MYWJlbCA9IFRvICZ6aXAgZmlsZToKLVppcEV4cG9ydF9tdXN0QmVGaWxlID0gRXhwb3J0IGRlc3RpbmF0aW9uIG11c3QgYmUgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkuCi1aaXBFeHBvcnRfYWxyZWFkeUV4aXN0cyA9IFRhcmdldCBmaWxlIGFscmVhZHkgZXhpc3RzLiAgV291bGQgeW91IGxpa2UgdG8gb3ZlcndyaXRlIGl0PwotWmlwRXhwb3J0X2FscmVhZHlFeGlzdHNFcnJvciA9IEV4cG9ydCBkZXN0aW5hdGlvbiBhbHJlYWR5IGV4aXN0cyBhbmQgY2Fubm90IGJlIG92ZXJ3cml0dGVuLgotWmlwRXhwb3J0X2Nhbm5vdE9wZW4gPSBVbmFibGUgdG8gb3BlbiBkZXN0aW5hdGlvbiBmaWxlOiB7MH0KLVppcEV4cG9ydF9jYW5ub3RDbG9zZSA9IFVuYWJsZSB0byBjbG9zZSBkZXN0aW5hdGlvbiBmaWxlOiB7MH0KLVppcEV4cG9ydF9zZWxlY3REZXN0aW5hdGlvblRpdGxlID0gRXhwb3J0IHRvIFppcCBGaWxlCi1aaXBFeHBvcnRfZGVzdGluYXRpb25FbXB0eSA9IFBsZWFzZSBlbnRlciBhIGRlc3RpbmF0aW9uIHppcCBmaWxlLgotCi1BcmNoaXZlRXhwb3J0X2Rlc2NyaXB0aW9uID0gRXhwb3J0IHJlc291cmNlcyB0byBhbiBhcmNoaXZlIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotQXJjaGl2ZUV4cG9ydF9kZXN0aW5hdGlvbkxhYmVsID0gVG8gJmFyY2hpdmUgZmlsZToKLUFyY2hpdmVFeHBvcnRfc2VsZWN0RGVzdGluYXRpb25UaXRsZSA9IEV4cG9ydCB0byBBcmNoaXZlIEZpbGUKLUFyY2hpdmVFeHBvcnRfZGVzdGluYXRpb25FbXB0eSA9IFBsZWFzZSBlbnRlciBhIGRlc3RpbmF0aW9uIGFyY2hpdmUgZmlsZS4KLUFyY2hpdmVFeHBvcnRfc2F2ZUluWmlwRm9ybWF0ID0gU2F2ZSBpbiAmemlwIGZvcm1hdAotQXJjaGl2ZUV4cG9ydF9zYXZlSW5UYXJGb3JtYXQgPSBTYSZ2ZSBpbiB0YXIgZm9ybWF0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvZGF0YXRyYW5zZmVyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlYzcxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9kYXRhdHJhbnNmZXIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNaWNyb3NvZnQgRnJvbnRQYWdlIDQuMCI+Ci08bWV0YSBuYW1lPSJQcm9nSWQiIGNvbnRlbnQ9IkZyb250UGFnZS5FZGl0b3IuRG9jdW1lbnQiPgotPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRhdGEgdHJhbnNmZXIgc3VwcG9ydCBvZiB0aGUgRWNsaXBzZSBQbGF0Zm9ybSBVc2VyIAotSW50ZXJmYWNlLiAKLTxoMj5QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotVGhpcyBwYWNrYWdlIGRvZXMgbm90IGNvbnRhaW4gYW55IEFQSS4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9uZXdyZXNvdXJjZS9SZXNvdXJjZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvd2l6YXJkcy9uZXdyZXNvdXJjZS9SZXNvdXJjZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YzkwNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvbmV3cmVzb3VyY2UvUmVzb3VyY2VNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5uZXdyZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5uZXdyZXNvdXJjZS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCQotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIE5ldyBSZXNvdXJjZSBXaXphcmRzCi0JLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVJlc291cmNlX3NoZWxsVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVJlc291cmNlX3BhZ2VUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlUmVzb3VyY2VfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVJlc291cmNlX2Vycm9yTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0ZvbGRlcl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdGb2xkZXJfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1Byb2plY3Rfd2luZG93VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UHJvamVjdF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQcm9qZWN0X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1Byb2plY3RfcmVmZXJlbmNlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UHJvamVjdF9yZWZlcmVuY2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQcm9qZWN0X2Vycm9yT3BlbmluZ1dpbmRvdzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQcm9qZWN0X2Vycm9yTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQcm9qZWN0X2ludGVybmFsRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UHJvamVjdF9jYXNlVmFyaWFudEV4aXN0c0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1Byb2plY3RfcGVyc3BTd2l0Y2hUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQcm9qZWN0X3BlcnNwU3dpdGNoTWVzc2FnZTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSZXNvdXJjZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvbmV3cmVzb3VyY2UvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC93aXphcmRzL25ld3Jlc291cmNlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOGQ5MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3dpemFyZHMvbmV3cmVzb3VyY2UvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBwYWNrYWdlOiBvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlCi0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgTmV3IFJlc291cmNlIFdpemFyZHMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GaWxlUmVzb3VyY2Vfc2hlbGxUaXRsZSA9IE5ldyBGaWxlCi1GaWxlUmVzb3VyY2VfcGFnZVRpdGxlID0gRmlsZQotRmlsZVJlc291cmNlX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGZpbGUgcmVzb3VyY2UuCi1GaWxlUmVzb3VyY2VfZXJyb3JNZXNzYWdlID0gUHJvYmxlbXMgT3BlbmluZyBFZGl0b3IKLQotTmV3Rm9sZGVyX3RpdGxlID0gTmV3IEZvbGRlcgotTmV3Rm9sZGVyX3RleHQgPSBGb2xkZXIKLQotTmV3UHJvamVjdF93aW5kb3dUaXRsZSA9IE5ldyBQcm9qZWN0Ci1OZXdQcm9qZWN0X3RpdGxlID0gUHJvamVjdAotTmV3UHJvamVjdF9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBwcm9qZWN0IHJlc291cmNlLgotTmV3UHJvamVjdF9yZWZlcmVuY2VUaXRsZSA9IFByb2plY3QgUmVmZXJlbmNlcwotTmV3UHJvamVjdF9yZWZlcmVuY2VEZXNjcmlwdGlvbiA9IFNlbGVjdCByZWZlcmVuY2VkIHByb2plY3RzLgotTmV3UHJvamVjdF9lcnJvck9wZW5pbmdXaW5kb3cgPSBQcm9ibGVtcyBPcGVuaW5nIFdpbmRvdwotTmV3UHJvamVjdF9lcnJvck1lc3NhZ2UgPSBDcmVhdGlvbiBQcm9ibGVtcwotTmV3UHJvamVjdF9pbnRlcm5hbEVycm9yID0gSW50ZXJuYWwgZXJyb3I6IHswfQotTmV3UHJvamVjdF9jYXNlVmFyaWFudEV4aXN0c0Vycm9yID0gVGhlIHVuZGVybHlpbmcgZmlsZSBzeXN0ZW0gaXMgY2FzZSBpbnNlbnNpdGl2ZS4gVGhlcmUgaXMgYW4gZXhpc3RpbmcgcHJvamVjdCB3aGljaCBjb25mbGljdHMgd2l0aCAnJ3swfScnLgotTmV3UHJvamVjdF9wZXJzcFN3aXRjaFRpdGxlID0gT3BlbiBBc3NvY2lhdGVkIFBlcnNwZWN0aXZlPwotTmV3UHJvamVjdF9wZXJzcFN3aXRjaE1lc3NhZ2UgPSBUaGlzIGtpbmQgb2YgcHJvamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHswfSBwZXJzcGVjdGl2ZS4gIERvIHlvdSB3YW50IHRvIG9wZW4gdGhpcyBwZXJzcGVjdGl2ZSBub3c/CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9Cb29rbWFya0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvQm9va21hcmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxNDZiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9Cb29rbWFya0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuYm9va21hcmtleHBsb3JlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb247Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgY2xhc3MgZm9yIGFsbCBib29rbWFyayB2aWV3IGFjdGlvbnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEJvb2ttYXJrQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24gewotICAgIHByaXZhdGUgQm9va21hcmtOYXZpZ2F0b3IgdmlldzsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBib29rbWFyayBhY3Rpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJvb2ttYXJrQWN0aW9uKEJvb2ttYXJrTmF2aWdhdG9yIHZpZXcsIFN0cmluZyBsYWJlbCkgewotICAgICAgICBzdXBlcih2aWV3LmdldFZpZXdlcigpLCBsYWJlbCk7Ci0gICAgICAgIHRoaXMudmlldyA9IHZpZXc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYm9va21hcmtzIHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIEJvb2ttYXJrTmF2aWdhdG9yIGdldFZpZXcoKSB7Ci0gICAgICAgIHJldHVybiB2aWV3OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9ib29rbWFya2V4cGxvcmVyL0Jvb2ttYXJrQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9Cb29rbWFya0NvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmQxZjkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9ib29rbWFya2V4cGxvcmVyL0Jvb2ttYXJrQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuYm9va21hcmtleHBsb3JlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNpY1Byb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBQcm92aWRlcyBjb250ZW50IGZvciB0aGUgYm9va21hcmsgbmF2aWdhdG9yCi0gKi8KLWNsYXNzIEJvb2ttYXJrQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsCi0gICAgICAgIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJQmFzaWNQcm9wZXJ0eUNvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIElSZXNvdXJjZSBpbnB1dDsKLQotICAgIHByaXZhdGUgVmlld2VyIHZpZXdlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQm9va21hcmtDb250ZW50UHJvdmlkZXIoQm9va21hcmtOYXZpZ2F0b3IgYm9va21hcmtzVmlldykgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB2aXN1YWwgcGFydCB0aGF0IGlzIHVzaW5nIHRoaXMgY29udGVudCBwcm92aWRlciBpcyBhYm91dAotICAgICAqIHRvIGJlIGRpc3Bvc2VkLiBEZWFsbG9jYXRlIGFsbCBhbGxvY2F0ZWQgU1dUIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc291cmNlLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgYm9va21hcmtzIHRoYXQgc2hvdWxkIGJlIHNob3duIGZvcgotICAgICAqIHRoZSBjdXJyZW50IHNldHRpbmdzLgotICAgICAqLwotICAgIE9iamVjdFtdIGdldEJvb2ttYXJrcyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiByZXNvdXJjZS5maW5kTWFya2VycyhJTWFya2VyLkJPT0tNQVJLLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIC8vIElmIHRoZSBpbnB1dCBlbGVtZW50IGlzIGEgd29ya2JlbmNoIHJldHVybiBhIGxpc3QKLSAgICAgICAgLy8gb2YgdGhlIGV4aXN0aW5nIGJvb2ttYXJrcy4gIE90aGVyd2lzZSwgcmV0dXJuIGFuIGVtcHR5IGxpc3QuCi0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgICAgICAgICAgcmV0dXJuIGdldEJvb2ttYXJrcygoSVJlc291cmNlKSBlbGVtZW50KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWN1cnNpdmVseSB3YWxrcyBvdmVyIHRoZSByZXNvdXJjZSBkZWx0YSBhbmQgZ2F0aGVycyBhbGwgbWFya2VyIGRlbHRhcy4gIE1hcmtlcgotICAgICAqIGRlbHRhcyBhcmUgcGxhY2VkIGludG8gb25lIG9mIHRoZSB0aHJlZSBnaXZlbiB2ZWN0b3JzIGRlcGVuZGluZyBvbgotICAgICAqIHRoZSB0eXBlIG9mIGRlbHRhIChhZGQsIHJlbW92ZSwgb3IgY2hhbmdlKS4KLSAgICAgKi8KLSAgICB2b2lkIGdldE1hcmtlckRlbHRhcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSwgTGlzdCBhZGRpdGlvbnMsIExpc3QgcmVtb3ZhbHMsCi0gICAgICAgICAgICBMaXN0IGNoYW5nZXMpIHsKLSAgICAgICAgSU1hcmtlckRlbHRhW10gbWFya2VyRGVsdGFzID0gZGVsdGEuZ2V0TWFya2VyRGVsdGFzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyRGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJTWFya2VyRGVsdGEgbWFya2VyRGVsdGEgPSBtYXJrZXJEZWx0YXNbaV07Ci0gICAgICAgICAgICBJTWFya2VyIG1hcmtlciA9IG1hcmtlckRlbHRhLmdldE1hcmtlcigpOwotICAgICAgICAgICAgc3dpdGNoIChtYXJrZXJEZWx0YS5nZXRLaW5kKCkpIHsKLSAgICAgICAgICAgIGNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1hcmtlckRlbHRhLmlzU3VidHlwZU9mKElNYXJrZXIuQk9PS01BUkspKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9ucy5hZGQobWFya2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1hcmtlckRlbHRhLmlzU3VidHlwZU9mKElNYXJrZXIuQk9PS01BUkspKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92YWxzLmFkZChtYXJrZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICBpZiAobWFya2VyRGVsdGEuaXNTdWJ0eXBlT2YoSU1hcmtlci5CT09LTUFSSykpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5hZGQobWFya2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlY3Vyc2Ugb24gY2hpbGQgZGVsdGFzCi0gICAgICAgIElSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGdldE1hcmtlckRlbHRhcyhjaGlsZHJlbltpXSwgYWRkaXRpb25zLCByZW1vdmFscywgY2hhbmdlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElUcmVlQ29udGVudFByb3ZpZGVyLAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBoYXNDaGlsZHJlbiBtZXRob2QgY29tbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgbmV3Vmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICBpZiAob2xkSW5wdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgbmV3SW5wdXQ7Ci0gICAgICAgICAgICByZXNvdXJjZS5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMudmlld2VyID0gbmV3Vmlld2VyOwotICAgICAgICB0aGlzLmlucHV0ID0gKElSZXNvdXJjZSkgbmV3SW5wdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHdvcmtiZW5jaCBoYXMgY2hhbmdlZC4gIFByb2Nlc3MgdGhlIGRlbHRhIGFuZCBwcm92aWRlIHVwZGF0ZXMgdG8gdGhlIHZpZXdlciwKLSAgICAgKiBpbnNpZGUgdGhlIFVJIHRocmVhZC4KLSAgICAgKgotICAgICAqIEBzZWUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKGZpbmFsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLSAgICAgICAgLy8gZ2F0aGVyIGFsbCBtYXJrZXIgY2hhbmdlcyBmcm9tIHRoZSBkZWx0YS4KLSAgICAgICAgLy8gYmUgc3VyZSB0byBkbyB0aGlzIGluIHRoZSBjYWxsaW5nIHRocmVhZCwgCi0gICAgICAgIC8vIGFzIHRoZSBkZWx0YSBpcyBkZXN0cm95ZWQgd2hlbiB0aGlzIG1ldGhvZCByZXR1cm5zCi0gICAgICAgIGZpbmFsIExpc3QgYWRkaXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCBMaXN0IHJlbW92YWxzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCBMaXN0IGNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotICAgICAgICBpZiAoZGVsdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZ2V0TWFya2VyRGVsdGFzKGRlbHRhLCBhZGRpdGlvbnMsIHJlbW92YWxzLCBjaGFuZ2VzKTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhlIHZpZXdlciBiYXNlZCBvbiB0aGUgbWFya2VyIGNoYW5nZXMsIGluIHRoZSBVSSB0aHJlYWQKLSAgICAgICAgaWYgKGFkZGl0aW9ucy5zaXplKCkgKyByZW1vdmFscy5zaXplKCkgKyBjaGFuZ2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBydW5zIGluc2lkZSBhbiBhc3luY0V4ZWMuICBUaGUgd2lkZ2V0IG1heSBoYXZlIGJlZW4gZGVzdHJveWVkCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSB0aW1lIHRoaXMgaXMgcnVuLiAgQ2hlY2sgZm9yIHRoaXMgYW5kIGRvIG5vdGhpbmcgaWYgc28uCi0gICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY3RybCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdHJsID09IG51bGwgfHwgY3RybC5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9ib29rbWFya2V4cGxvcmVyL0Jvb2ttYXJrTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvQm9va21hcmtMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZGNhYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvQm9va21hcmtMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuYm9va21hcmtleHBsb3JlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MuYm9va21hcmtleHBsb3Jlci5Cb29rbWFya01lc3NhZ2VzOwotCi0vKioKLSAqIFByb3ZpZGVzIGxhYmVscyBmb3IgdGhlIGJvb2ttYXJrIG5hdmlnYXRvciB0YWJsZQotICovCi1jbGFzcyBCb29rbWFya0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMKLSAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIEltYWdlIGltYWdlOwotICAgIHByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGRlc2M7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50IENPTFVNTl9JQ09OID0gMDsKLQotICAgIGZpbmFsIHN0YXRpYyBpbnQgQ09MVU1OX0RFU0NSSVBUSU9OID0gMTsKLQotICAgIGZpbmFsIHN0YXRpYyBpbnQgQ09MVU1OX1JFU09VUkNFID0gMjsKLQotICAgIGZpbmFsIHN0YXRpYyBpbnQgQ09MVU1OX0ZPTERFUiA9IDM7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50IENPTFVNTl9MT0NBVElPTiA9IDQ7Ci0KLSAgICBwdWJsaWMgQm9va21hcmtMYWJlbFByb3ZpZGVyKEJvb2ttYXJrTmF2aWdhdG9yIHZpZXcpIHsKLSAgICAgICAgZGVzYyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXRJREVJbWFnZURlc2NyaXB0b3IoIm9iajE2L2JrbXJrX3Rzay5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbWFnZSA9IEpGYWNlUmVzb3VyY2VzLmdldFJlc291cmNlcygpLmNyZWF0ZUltYWdlV2l0aERlZmF1bHQoZGVzYyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBMYWJlbFByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChpbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBKRmFjZVJlc291cmNlcy5nZXRSZXNvdXJjZXMoKS5kZXN0cm95SW1hZ2UoZGVzYyk7Ci0gICAgICAgICAgICBpbWFnZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIExhYmVsUHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBpbWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSU1hcmtlcikpCi0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgZWxlbWVudDsKLQotICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIGNhc2UgQ09MVU1OX0RFU0NSSVBUSU9OOgotICAgICAgICAgICAgcmV0dXJuIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY2FzZSBDT0xVTU5fUkVTT1VSQ0U6Ci0gICAgICAgICAgICByZXR1cm4gbWFya2VyLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpOwotICAgICAgICBjYXNlIENPTFVNTl9GT0xERVI6Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyTmFtZShtYXJrZXIpOwotICAgICAgICBjYXNlIENPTFVNTl9MT0NBVElPTjogewotICAgICAgICAgICAgaW50IGxpbmUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIC0xKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKEJvb2ttYXJrTWVzc2FnZXMuTGluZUluZGljYXRvcl90ZXh0LCBTdHJpbmcudmFsdWVPZihsaW5lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQgCi0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGluZGV4ID09IENPTFVNTl9JQ09OKQotICAgICAgICAgICAgcmV0dXJuIGltYWdlOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250YWluZXIgbmFtZSBpZiBpdCBpcyBkZWZpbmVkLCBvciBlbXB0eSBzdHJpbmcgaWYgbm90LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbnRhaW5lck5hbWUoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgSVBhdGggcGF0aCA9IG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIGludCBuID0gcGF0aC5zZWdtZW50Q291bnQoKSAtIDE7Ci0gICAgICAgIC8vIG4gaXMgdGhlIG51bWJlciBvZiBzZWdtZW50cyBpbiBjb250YWluZXIsIG5vdCBwYXRoCi0gICAgICAgIGlmIChuIDw9IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IGxlbiA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQotICAgICAgICAgICAgbGVuICs9IHBhdGguc2VnbWVudChpKS5sZW5ndGgoKTsKLSAgICAgICAgLy8gYWNjb3VudCBmb3IgLydzCi0gICAgICAgIGlmIChuID4gMSkKLSAgICAgICAgICAgIGxlbiArPSBuIC0gMTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy8nKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoLnNlZ21lbnQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9ib29rbWFya2V4cGxvcmVyL0Jvb2ttYXJrTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9ib29rbWFya2V4cGxvcmVyL0Jvb2ttYXJrTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1YjI5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9Cb29rbWFya01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5ib29rbWFya2V4cGxvcmVyOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aGljaCBoZWxwcyBtYW5hZ2luZyBtZXNzYWdlcwotICogQGRlcHJlY2F0ZWQgVGhlc2UgbWVzc2FnZXMgYXJlIG5vdCBBUEkgYW5kIHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZAotICogb3V0c2lkZSBvZiB0aGlzIHBsdWctaW4uCi0gKi8KLWNsYXNzIEJvb2ttYXJrTWVzc2FnZXMgewotCi0gICAgcHJpdmF0ZSBCb29rbWFya01lc3NhZ2VzKCkgewotICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24gb2YgY2xhc3MKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIGtleSBpbgotICAgICAqIHRoZSByZXNvdXJjZSBidW5kbGUuIAotICAgICAqCi0gICAgICogQHBhcmFtIGtleSB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqIEBwYXJhbSBhcmdzIHRoZSBtZXNzYWdlIGFyZ3VtZW50cwotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugb2JqZWN0IHdpdGggdGhlIGdpdmVuIGtleSBpbgotICAgICAqIHRoZSByZXNvdXJjZSBidW5kbGUuIElmIHRoZXJlIGlzbid0IGFueSB2YWx1ZSB1bmRlcgotICAgICAqIHRoZSBnaXZlbiBrZXksIHRoZSBrZXkgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLSAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9ib29rbWFya2V4cGxvcmVyL0Jvb2ttYXJrTmF2aWdhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9Cb29rbWFya05hdmlnYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGVjNDFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9ib29rbWFya2V4cGxvcmVyL0Jvb2ttYXJrTmF2aWdhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuYm9va21hcmtleHBsb3JlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYXlvdXREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uUGl4ZWxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSU9wZW5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLk9wZW5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5ib29rbWFya2V4cGxvcmVyLkJvb2ttYXJrTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NYXJrZXJUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlNob3dJbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuU2hvd0luTmF2aWdhdG9yQWN0aW9uOwotCi0vKioKLSAqIE1haW4gY2xhc3MgZm9yIHRoZSBib29rbWFyayBuYXZpZ2F0b3IgZm9yIGRpc3BsYXlpbmcgYm9va21hcmtzIG9uCi0gKiByZXNvdXJjZXMgYW5kIG9wZW5pbmcgYW4gZWRpdG9yIG9uIHRoZSBib29rbWFya2VkIHJlc291cmNlIHdoZW4gdGhlIHVzZXIKLSAqIGNvbW1hbmRzLgotICogPHA+Ci0gKiBUaGlzIHN0YW5kYXJkIHZpZXcgaGFzIGlkIDxjb2RlPiJvcmcuZWNsaXBzZS51aS52aWV3cy5Cb29rbWFya05hdmlnYXRvciI8L2NvZGU+LgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgd29ya2JlbmNoIHdpbGwgYXV0b21hdGljYWxseSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIHdoZW4gYSBib29rbWFyawotICogbmF2aWdhdG9yIGlzIG5lZWRlZCBmb3IgYSB3b3JrYmVuY2ggd2luZG93LiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZAotICogdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEJvb2ttYXJrTmF2aWdhdG9yIGV4dGVuZHMgVmlld1BhcnQgewotICAgIHByaXZhdGUgVGFibGUgdGFibGU7Ci0KLSAgICBwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcjsKLQotICAgIHByaXZhdGUgT3BlbkJvb2ttYXJrQWN0aW9uIG9wZW5BY3Rpb247Ci0KLSAgICBwcml2YXRlIENvcHlCb29rbWFya0FjdGlvbiBjb3B5QWN0aW9uOwotCi0gICAgcHJpdmF0ZSBQYXN0ZUJvb2ttYXJrQWN0aW9uIHBhc3RlQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBSZW1vdmVCb29rbWFya0FjdGlvbiByZW1vdmVBY3Rpb247Ci0KLSAgICBwcml2YXRlIEVkaXRCb29rbWFya0FjdGlvbiBlZGl0QWN0aW9uOwotCi0gICAgcHJpdmF0ZSBTZWxlY3RBbGxBY3Rpb24gc2VsZWN0QWxsQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBTaG93SW5OYXZpZ2F0b3JBY3Rpb24gc2hvd0luTmF2aWdhdG9yQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBTb3J0QnlBY3Rpb24gc29ydEJ5RGVzY3JpcHRpb25BY3Rpb247Ci0KLSAgICBwcml2YXRlIFNvcnRCeUFjdGlvbiBzb3J0QnlSZXNvdXJjZUFjdGlvbjsKLQotICAgIHByaXZhdGUgU29ydEJ5QWN0aW9uIHNvcnRCeUZvbGRlckFjdGlvbjsKLQotICAgIHByaXZhdGUgU29ydEJ5QWN0aW9uIHNvcnRCeUxpbmVBY3Rpb247Ci0KLSAgICBwcml2YXRlIFNvcnRCeUFjdGlvbiBzb3J0QnlDcmVhdGlvblRpbWU7Ci0KLSAgICBwcml2YXRlIENoYW5nZVNvcnREaXJlY3Rpb25BY3Rpb24gc29ydEFzY2VuZGluZ0FjdGlvbjsKLQotICAgIHByaXZhdGUgQ2hhbmdlU29ydERpcmVjdGlvbkFjdGlvbiBzb3J0RGVzY2VuZGluZ0FjdGlvbjsKLQotICAgIHByaXZhdGUgSU1lbWVudG8gbWVtZW50bzsKLQotICAgIHByaXZhdGUgQm9va21hcmtTb3J0ZXIgc29ydGVyOwotCi0gICAgcHJpdmF0ZSBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29sdW1uSGVhZGVyc1tdID0gewotICAgICAgICAgICAgQm9va21hcmtNZXNzYWdlcy5Db2x1bW5JY29uX2hlYWRlciwKLSAgICAgICAgICAgIEJvb2ttYXJrTWVzc2FnZXMuQ29sdW1uRGVzY3JpcHRpb25faGVhZGVyLAotICAgICAgICAgICAgQm9va21hcmtNZXNzYWdlcy5Db2x1bW5SZXNvdXJjZV9oZWFkZXIsCi0gICAgICAgICAgICBCb29rbWFya01lc3NhZ2VzLkNvbHVtbkZvbGRlcl9oZWFkZXIsCi0gICAgICAgICAgICBCb29rbWFya01lc3NhZ2VzLkNvbHVtbkxvY2F0aW9uX2hlYWRlciB9OwotCi0gICAgcHJpdmF0ZSBDb2x1bW5MYXlvdXREYXRhIGNvbHVtbkxheW91dHNbXSA9IHsKLQkJCW5ldyBDb2x1bW5QaXhlbERhdGEoMTYsIGZhbHNlLCB0cnVlKSwgbmV3IENvbHVtbldlaWdodERhdGEoMjAwKSwKLQkJCW5ldyBDb2x1bW5XZWlnaHREYXRhKDc1KSwgbmV3IENvbHVtbldlaWdodERhdGEoMTUwKSwKLQkJCW5ldyBDb2x1bW5XZWlnaHREYXRhKDYwKSB9OwotCi0gICAgLy8gUGVyc2lzdGFuY2UgdGFncy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NFTEVDVElPTiA9ICJzZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEID0gImlkIjsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX01BUktFUiA9ICJtYXJrZXIiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVTT1VSQ0UgPSAicmVzb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVkVSVElDQUxfUE9TSVRJT04gPSAidmVydGljYWxQb3NpdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19IT1JJWk9OVEFMX1BPU0lUSU9OID0gImhvcml6b250YWxQb3NpdGlvbiI7Ly8kTk9OLU5MUy0xJAotCQotICAgIGNsYXNzIFNvcnRCeUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgY29sdW1uOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gY29sdW1uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU29ydEJ5QWN0aW9uKGludCBjb2x1bW4pIHsKLSAgICAgICAgICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgc29ydGVyLnNldFRvcFByaW9yaXR5KGNvbHVtbik7Ci0gICAgICAgICAgICB1cGRhdGVTb3J0U3RhdGUoKTsKLSAgICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBnZXRQbHVnaW4oKS5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oIkJvb2ttYXJrU29ydFN0YXRlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncy5hZGROZXdTZWN0aW9uKCJCb29rbWFya1NvcnRTdGF0ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNvcnRlci5zYXZlU3RhdGUoc2V0dGluZ3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgQ2hhbmdlU29ydERpcmVjdGlvbkFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZGlyZWN0aW9uOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gZGlyZWN0aW9uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQ2hhbmdlU29ydERpcmVjdGlvbkFjdGlvbihpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHNvcnRlci5zZXRUb3BQcmlvcml0eURpcmVjdGlvbihkaXJlY3Rpb24pOwotICAgICAgICAgICAgdXBkYXRlU29ydFN0YXRlKCk7Ci0gICAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gZ2V0UGx1Z2luKCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uKCJCb29rbWFya1NvcnRTdGF0ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChzZXR0aW5ncyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MuYWRkTmV3U2VjdGlvbigiQm9va21hcmtTb3J0U3RhdGUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzb3J0ZXIuc2F2ZVN0YXRlKHNldHRpbmdzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGJvb2ttYXJrcyB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyBCb29rbWFya05hdmlnYXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoaXMgdmlld3MgY29udHJpYnV0aW9ucyB0byB0aGUgd29ya2JlbmNoLgotICAgICAqLwotICAgIHZvaWQgYWRkQ29udHJpYnV0aW9ucygpIHsKLSAgICAgICAgSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgLmdldFNoYXJlZEltYWdlcygpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgYWN0aW9ucy4KLSAgICAgICAgb3BlbkFjdGlvbiA9IG5ldyBPcGVuQm9va21hcmtBY3Rpb24odGhpcyk7Ci0gICAgICAgIG9wZW5BY3Rpb24KLSAgICAgICAgICAgICAgICAuc2V0SW1hZ2VEZXNjcmlwdG9yKElERVdvcmtiZW5jaFBsdWdpbi5nZXRJREVJbWFnZURlc2NyaXB0b3IoImVsY2wxNi9nb3Rvb2JqX3Rzay5naWYiKSk7Ly8kTk9OLU5MUy0xJAotCi0gICAgICAgIGNvcHlBY3Rpb24gPSBuZXcgQ29weUJvb2ttYXJrQWN0aW9uKHRoaXMpOwotICAgICAgICBjb3B5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWSkpOwotCi0gICAgICAgIHBhc3RlQWN0aW9uID0gbmV3IFBhc3RlQm9va21hcmtBY3Rpb24odGhpcyk7Ci0gICAgICAgIHBhc3RlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUEFTVEUpKTsKLQotICAgICAgICByZW1vdmVBY3Rpb24gPSBuZXcgUmVtb3ZlQm9va21hcmtBY3Rpb24odGhpcyk7Ci0gICAgICAgIHJlbW92ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSkpOwotICAgICAgICByZW1vdmVBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURV9ESVNBQkxFRCkpOwotCi0gICAgICAgIGVkaXRBY3Rpb24gPSBuZXcgRWRpdEJvb2ttYXJrQWN0aW9uKHRoaXMpOwotCi0gICAgICAgIHNlbGVjdEFsbEFjdGlvbiA9IG5ldyBTZWxlY3RBbGxBY3Rpb24odGhpcyk7Ci0gICAgICAgIHNob3dJbk5hdmlnYXRvckFjdGlvbiA9IG5ldyBTaG93SW5OYXZpZ2F0b3JBY3Rpb24oZ2V0Vmlld1NpdGUoKQotICAgICAgICAgICAgICAgIC5nZXRQYWdlKCksIHZpZXdlcik7Ci0KLSAgICAgICAgLy8gaW5pdGlhbGl6ZXMgYWN0aW9uIGVuYWJsZWQgc3RhdGUKLSAgICAgICAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQotICAgICAgICAvLyBDcmVhdGUgZHluYW1pYyBtZW51IG1nci4gIER5bmFtaWMgaXMgY3VycmVudGx5IHJlcXVpcmVkIHRvCi0gICAgICAgIC8vIHN1cHBvcnQgYWN0aW9uIGNvbnRyaWJ1dGlvbnMuCi0gICAgICAgIE1lbnVNYW5hZ2VyIG1nciA9IG5ldyBNZW51TWFuYWdlcigpOwotICAgICAgICBtZ3Iuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotICAgICAgICBtZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZ3IpIHsKLSAgICAgICAgICAgICAgICBmaWxsQ29udGV4dE1lbnUobWdyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIE1lbnUgbWVudSA9IG1nci5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotICAgICAgICBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZ3IsIHZpZXdlcik7Ci0KLSAgICAgICAgLy8gQWRkIGFjdGlvbnMgdG8gdGhlIGxvY2FsIHRvb2wgYmFyCi0gICAgICAgIElUb29sQmFyTWFuYWdlciB0Ym0gPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRUb29sQmFyTWFuYWdlcigpOwotICAgICAgICB0Ym0uYWRkKHJlbW92ZUFjdGlvbik7Ci0gICAgICAgIHRibS5hZGQob3BlbkFjdGlvbik7Ci0gICAgICAgIHRibS51cGRhdGUoZmFsc2UpOwotCi0gICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggYWN0aW9uIHNlcnZpY2UuCi0gICAgICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLSAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLAotICAgICAgICAgICAgICAgIGNvcHlBY3Rpb24pOwotICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLAotICAgICAgICAgICAgICAgIHBhc3RlQWN0aW9uKTsKLSAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksCi0gICAgICAgICAgICAgICAgcmVtb3ZlQWN0aW9uKTsKLSAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLAotICAgICAgICAgICAgICAgIHNlbGVjdEFsbEFjdGlvbik7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBkb3VibGUgY2xpY2sgYWN0aW9uLgotICAgICAgICB2aWV3ZXIuYWRkT3Blbkxpc3RlbmVyKG5ldyBJT3Blbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb3BlbihPcGVuRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBvcGVuQWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUtleVByZXNzZWQoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFBhcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHBhcmVudC5nZXREaXNwbGF5KCkpOwotICAgICAgICBjcmVhdGVUYWJsZShwYXJlbnQpOwotICAgICAgICB2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotICAgICAgICBjcmVhdGVDb2x1bW5zKCk7Ci0KLSAgICAgICAgc29ydGVyID0gbmV3IEJvb2ttYXJrU29ydGVyKCk7Ci0gICAgICAgIHZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEJvb2ttYXJrQ29udGVudFByb3ZpZGVyKHRoaXMpKTsKLSAgICAgICAgdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEJvb2ttYXJrTGFiZWxQcm92aWRlcih0aGlzKSk7Ci0gICAgICAgIHZpZXdlci5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgdmlld2VyLnNldFNvcnRlcihzb3J0ZXIpOwotCi0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IGdldFBsdWdpbigpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oIkJvb2ttYXJrU29ydFN0YXRlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBzb3J0ZXIucmVzdG9yZVN0YXRlKHNldHRpbmdzKTsKLQotICAgICAgICBhZGRDb250cmlidXRpb25zKCk7Ci0gICAgICAgIGluaXREcmFnQW5kRHJvcCgpOwotICAgICAgICBjcmVhdGVTb3J0QWN0aW9ucygpOwotICAgICAgICBmaWxsQWN0aW9uQmFycygpOwotICAgICAgICB1cGRhdGVTb3J0U3RhdGUoKTsKLSAgICAgICAgdXBkYXRlUGFzdGVFbmFibGVtZW50KCk7Ci0KLSAgICAgICAgZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHZpZXdlcik7Ci0KLSAgICAgICAgaWYgKG1lbWVudG8gIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3RvcmVTdGF0ZShtZW1lbnRvKTsKLSAgICAgICAgbWVtZW50byA9IG51bGw7Ci0KLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh2aWV3ZXIuZ2V0Q29udHJvbCgpLAotICAgICAgICAgICAgICAgIElCb29rbWFya0hlbHBDb250ZXh0SWRzLkJPT0tNQVJLX1ZJRVcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChjbGlwYm9hcmQgIT0gbnVsbCkKLSAgICAgICAgICAgIGNsaXBib2FyZC5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBtZW51IGlzIGFib3V0IHRvIGJlIHNob3duIGJ5Ci0gICAgICogdGhlIGdpdmVuIG1lbnUgbWFuYWdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSBtZW51IG1hbmFnZXIKLSAgICAgKi8KLSAgICB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICBtYW5hZ2VyLmFkZChvcGVuQWN0aW9uKTsKLSAgICAgICAgbWFuYWdlci5hZGQoY29weUFjdGlvbik7Ci0gICAgICAgIHVwZGF0ZVBhc3RlRW5hYmxlbWVudCgpOwotICAgICAgICBtYW5hZ2VyLmFkZChwYXN0ZUFjdGlvbik7Ci0gICAgICAgIG1hbmFnZXIuYWRkKHJlbW92ZUFjdGlvbik7Ci0gICAgICAgIG1hbmFnZXIuYWRkKHNlbGVjdEFsbEFjdGlvbik7Ci0gICAgICAgIG1hbmFnZXIuYWRkKHNob3dJbk5hdmlnYXRvckFjdGlvbik7Ci0gICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLSAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgbWFuYWdlci5hZGQoZWRpdEFjdGlvbik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihDbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotICAgICAgICBpZiAoYWRhcHRlciA9PSBJU2hvd0luU291cmNlLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IElTaG93SW5Tb3VyY2UoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIFNob3dJbkNvbnRleHQgZ2V0U2hvd0luQ29udGV4dCgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG93SW5Db250ZXh0KG51bGwsIGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZGFwdGVyID09IElTaG93SW5UYXJnZXRMaXN0LmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IElTaG93SW5UYXJnZXRMaXN0KCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTaG93SW5UYXJnZXRJZHMoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBJUGFnZUxheW91dC5JRF9SRVNfTkFWIH07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFVJIHBsdWdpbiBmb3IgdGhlIGJvb2ttYXJrcyB2aWV3LgotICAgICAqLwotICAgIHN0YXRpYyBBYnN0cmFjdFVJUGx1Z2luIGdldFBsdWdpbigpIHsKLSAgICAgICAgcmV0dXJuIChBYnN0cmFjdFVJUGx1Z2luKSBQbGF0Zm9ybS5nZXRQbHVnaW4oUGxhdGZvcm1VSS5QTFVHSU5fSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoZWxsLgotICAgICAqLwotICAgIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gZ2V0Vmlld1NpdGUoKS5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZpZXdlciB1c2VkIHRvIGRpc3BsYXkgYm9va21hcmtzLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdmlld2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHZpZXcncyBjb250cm9scwotICAgICAqICBoYXZlIG5vdCBiZWVuIGNyZWF0ZWQgeWV0Ci0gICAgICovCi0gICAgU3RydWN0dXJlZFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0gICAgICAgIHJldHVybiB2aWV3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd29ya3NwYWNlLgotICAgICAqLwotICAgIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMga2V5IGV2ZW50cyBpbiB2aWV3ZXIuCi0gICAgICovCi0gICAgdm9pZCBoYW5kbGVLZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkRFTCAmJiBldmVudC5zdGF0ZU1hc2sgPT0gMAotICAgICAgICAgICAgICAgICYmIHJlbW92ZUFjdGlvbi5pc0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHJlbW92ZUFjdGlvbi5ydW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIGEgc2VsZWN0aW9uIGNoYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIG5ldyBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICB2b2lkIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIC8vdXBkYXRlIHRoZSBhY3Rpb25zCi0gICAgICAgIG9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotICAgICAgICByZW1vdmVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotICAgICAgICBlZGl0QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgc2VsZWN0QWxsQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgc2hvd0luTmF2aWdhdG9yQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElWaWV3UGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlLCBJTWVtZW50byBtZW1lbnRvKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBzdXBlci5pbml0KHNpdGUsIG1lbWVudG8pOwotICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgZHJhZyBhbmQgZHJvcCBzdXBwb3J0IHRvIHRoZSBib29rbWFyayBuYXZpZ2F0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdERyYWdBbmREcm9wKCkgewotICAgICAgICBpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFk7Ci0gICAgICAgIFRyYW5zZmVyW10gdHJhbnNmZXJUeXBlcyA9IG5ldyBUcmFuc2ZlcltdIHsKLSAgICAgICAgICAgICAgICBNYXJrZXJUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotICAgICAgICBEcmFnU291cmNlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRHJhZ1NvdXJjZUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBwZXJmb3JtRHJhZ1NldERhdGEoZXZlbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHZpZXdlci5hZGREcmFnU3VwcG9ydChvcGVyYXRpb25zLCB0cmFuc2ZlclR5cGVzLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHVzZXIgaXMgYXR0ZW1wdGluZyB0byBkcmFnIG1hcmtlciBkYXRhLiAgQWRkIHRoZSBhcHByb3ByaWF0ZQotICAgICAqIGRhdGEgdG8gdGhlIGV2ZW50IGRlcGVuZGluZyBvbiB0aGUgdHJhbnNmZXIgdHlwZS4KLSAgICAgKi8KLSAgICB2b2lkIHBlcmZvcm1EcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKE1hcmtlclRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotICAgICAgICAgICAgZXZlbnQuZGF0YSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotICAgICAgICAgICAgT2JqZWN0W10gbWFya2VycyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIGlmIChtYXJrZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gKElMYWJlbFByb3ZpZGVyKSBnZXRWaWV3ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gcHJvdmlkZXIuZ2V0VGV4dChtYXJrZXJzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgaWYodGV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAJYnVmZmVyLmFwcGVuZCh0ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXZlbnQuZGF0YSA9IGJ1ZmZlci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSU1lbWVudG8gc2VsZWN0aW9uTWVtID0gbWVtZW50by5nZXRDaGlsZChUQUdfU0VMRUNUSU9OKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbk1lbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Qgc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIElNZW1lbnRvIG1hcmtlck1lbXNbXSA9IHNlbGVjdGlvbk1lbS5nZXRDaGlsZHJlbihUQUdfTUFSS0VSKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyTWVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgaWQgPSBuZXcgTG9uZyhtYXJrZXJNZW1zW2ldLmdldFN0cmluZyhUQUdfSUQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gcm9vdC5maW5kTWVtYmVyKG1hcmtlck1lbXNbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKFRBR19SRVNPVVJDRSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSByZXNvdXJjZS5maW5kTWFya2VyKGlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJrZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25MaXN0LmFkZChtYXJrZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb25MaXN0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTY3JvbGxhYmxlIHNjcm9sbGFibGUgPSAoU2Nyb2xsYWJsZSkgdmlld2VyLmdldENvbnRyb2woKTsKLSAgICAgICAgLy9zYXZlIHZlcnRpY2FsIHBvc2l0aW9uCi0gICAgICAgIFNjcm9sbEJhciBiYXIgPSBzY3JvbGxhYmxlLmdldFZlcnRpY2FsQmFyKCk7Ci0gICAgICAgIGlmIChiYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcG9zU3RyID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX1ZFUlRJQ0FMX1BPU0lUSU9OKTsKLSAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBuZXcgSW50ZWdlcihwb3NTdHIpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYmFyLnNldFNlbGVjdGlvbihwb3NpdGlvbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJhciA9IHNjcm9sbGFibGUuZ2V0SG9yaXpvbnRhbEJhcigpOwotICAgICAgICBpZiAoYmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBvc1N0ciA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19IT1JJWk9OVEFMX1BPU0lUSU9OKTsKLSAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBuZXcgSW50ZWdlcihwb3NTdHIpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYmFyLnNldFNlbGVjdGlvbihwb3NpdGlvbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlU29ydFN0YXRlKCk7Ci0gICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgaWYgKHZpZXdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5tZW1lbnRvICE9IG51bGwpIC8vS2VlcCB0aGUgb2xkIHN0YXRlOwotICAgICAgICAgICAgICAgIG1lbWVudG8ucHV0TWVtZW50byh0aGlzLm1lbWVudG8pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU2Nyb2xsYWJsZSBzY3JvbGxhYmxlID0gKFNjcm9sbGFibGUpIHZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgICAgIE9iamVjdCBtYXJrZXJzW10gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgLnRvQXJyYXkoKTsKLSAgICAgICAgaWYgKG1hcmtlcnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgSU1lbWVudG8gc2VsZWN0aW9uTWVtID0gbWVtZW50by5jcmVhdGVDaGlsZChUQUdfU0VMRUNUSU9OKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElNZW1lbnRvIGVsZW1lbnRNZW0gPSBzZWxlY3Rpb25NZW0uY3JlYXRlQ2hpbGQoVEFHX01BUktFUik7Ci0gICAgICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgbWFya2Vyc1tpXTsKLSAgICAgICAgICAgICAgICBlbGVtZW50TWVtLnB1dFN0cmluZyhUQUdfUkVTT1VSQ0UsIG1hcmtlci5nZXRSZXNvdXJjZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50TWVtLnB1dFN0cmluZyhUQUdfSUQsIFN0cmluZy52YWx1ZU9mKG1hcmtlci5nZXRJZCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL3NhdmUgdmVydGljYWwgcG9zaXRpb24KLSAgICAgICAgU2Nyb2xsQmFyIGJhciA9IHNjcm9sbGFibGUuZ2V0VmVydGljYWxCYXIoKTsKLSAgICAgICAgaW50IHBvc2l0aW9uID0gYmFyICE9IG51bGwgPyBiYXIuZ2V0U2VsZWN0aW9uKCkgOiAwOwotICAgICAgICBtZW1lbnRvLnB1dFN0cmluZyhUQUdfVkVSVElDQUxfUE9TSVRJT04sIFN0cmluZy52YWx1ZU9mKHBvc2l0aW9uKSk7Ci0gICAgICAgIC8vc2F2ZSBob3Jpem9udGFsIHBvc2l0aW9uCi0gICAgICAgIGJhciA9IHNjcm9sbGFibGUuZ2V0SG9yaXpvbnRhbEJhcigpOwotICAgICAgICBwb3NpdGlvbiA9IGJhciAhPSBudWxsID8gYmFyLmdldFNlbGVjdGlvbigpIDogMDsKLSAgICAgICAgbWVtZW50by5wdXRTdHJpbmcoVEFHX0hPUklaT05UQUxfUE9TSVRJT04sIFN0cmluZy52YWx1ZU9mKHBvc2l0aW9uKSk7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hQYXJ0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBpZiAodmlld2VyICE9IG51bGwpCi0gICAgICAgICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgdm9pZCBjcmVhdGVDb2x1bW5zKCkgewotICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBoZWFkZXJMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBIYW5kbGVzIHRoZSBjYXNlIG9mIHVzZXIgc2VsZWN0aW5nIHRoZQotICAgICAgICAgICAgICogaGVhZGVyIGFyZWEuCi0gICAgICAgICAgICAgKiA8cD5JZiB0aGUgY29sdW1uIGhhcyBub3QgYmVlbiBzZWxlY3RlZCBwcmV2aW91c2x5LAotICAgICAgICAgICAgICogaXQgd2lsbCBzZXQgdGhlIHNvcnRlciBvZiB0aGF0IGNvbHVtbiB0byBiZQotICAgICAgICAgICAgICogdGhlIGN1cnJlbnQgdGFza2xpc3Qgc29ydGVyLiBSZXBlYXRlZAotICAgICAgICAgICAgICogcHJlc3NlcyBvbiB0aGUgc2FtZSBjb2x1bW4gaGVhZGVyIHdpbGwKLSAgICAgICAgICAgICAqIHRvZ2dsZSBzb3J0aW5nIG9yZGVyIChhc2NlbmRpbmcvZGVzY2VuZGluZykuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBjb2x1bW4gc2VsZWN0ZWQgLSBmaXJzdCBjb2x1bW4gZG9lc24ndCBjb3VudAotICAgICAgICAgICAgICAgIGludCBjb2x1bW4gPSB0YWJsZS5pbmRleE9mKChUYWJsZUNvbHVtbikgZS53aWRnZXQpIC0gMTsKLSAgICAgICAgICAgICAgICBpZiAoY29sdW1uID09IHNvcnRlci5nZXRUb3BQcmlvcml0eSgpKQotICAgICAgICAgICAgICAgICAgICBzb3J0ZXIucmV2ZXJzZVRvcFByaW9yaXR5KCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvcnRlci5zZXRUb3BQcmlvcml0eShjb2x1bW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGVTb3J0U3RhdGUoKTsKLSAgICAgICAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IGdldFBsdWdpbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oIkJvb2ttYXJrU29ydFN0YXRlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE5ld1NlY3Rpb24oIkJvb2ttYXJrU29ydFN0YXRlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHNvcnRlci5zYXZlU3RhdGUoc2V0dGluZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgICB0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5IZWFkZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5MYXlvdXRzW2ldKTsKLSAgICAgICAgICAgIFRhYmxlQ29sdW1uIHRjID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgaSk7Ci0gICAgICAgICAgICB0Yy5zZXRSZXNpemFibGUoY29sdW1uTGF5b3V0c1tpXS5yZXNpemFibGUpOwotICAgICAgICAgICAgdGMuc2V0VGV4dChjb2x1bW5IZWFkZXJzW2ldKTsKLSAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICB0Yy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihoZWFkZXJMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB0YWJsZSBjb250cm9sLgotICAgICAqLwotICAgIHZvaWQgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5NVUxUSQotICAgICAgICAgICAgICAgIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICAvL3RhYmxlLnNldExheW91dChuZXcgVGFibGVMYXlvdXQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbHMgdGhlIGxvY2FsIHRvb2wgYmFyIGFuZCBtZW51IG1hbmFnZXIgd2l0aCBhY3Rpb25zLgotICAgICAqLwotICAgIHZvaWQgZmlsbEFjdGlvbkJhcnMoKSB7Ci0gICAgICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLSAgICAgICAgSU1lbnVNYW5hZ2VyIG1lbnUgPSBhY3Rpb25CYXJzLmdldE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIElNZW51TWFuYWdlciBzdWJtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKEJvb2ttYXJrTWVzc2FnZXMuU29ydE1lbnVHcm91cF90ZXh0KTsKLSAgICAgICAgbWVudS5hZGQoc3VibWVudSk7Ci0gICAgICAgIHN1Ym1lbnUuYWRkKHNvcnRCeURlc2NyaXB0aW9uQWN0aW9uKTsKLSAgICAgICAgc3VibWVudS5hZGQoc29ydEJ5UmVzb3VyY2VBY3Rpb24pOwotICAgICAgICBzdWJtZW51LmFkZChzb3J0QnlGb2xkZXJBY3Rpb24pOwotICAgICAgICBzdWJtZW51LmFkZChzb3J0QnlMaW5lQWN0aW9uKTsKLSAgICAgICAgc3VibWVudS5hZGQoc29ydEJ5Q3JlYXRpb25UaW1lKTsKLSAgICAgICAgc3VibWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgc3VibWVudS5hZGQoc29ydEFzY2VuZGluZ0FjdGlvbik7Ci0gICAgICAgIHN1Ym1lbnUuYWRkKHNvcnREZXNjZW5kaW5nQWN0aW9uKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNyZWF0ZVNvcnRBY3Rpb25zKCkgewotICAgICAgICBzb3J0QnlEZXNjcmlwdGlvbkFjdGlvbiA9IG5ldyBTb3J0QnlBY3Rpb24oQm9va21hcmtTb3J0ZXIuREVTQ1JJUFRJT04pOwotICAgICAgICBzb3J0QnlEZXNjcmlwdGlvbkFjdGlvbi5zZXRUZXh0KEJvb2ttYXJrTWVzc2FnZXMuQ29sdW1uRGVzY3JpcHRpb25fdGV4dCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJc29ydEJ5RGVzY3JpcHRpb25BY3Rpb24sCi0JCQkJSUJvb2ttYXJrSGVscENvbnRleHRJZHMuU09SVF9ERVNDUklQVElPTl9BQ1RJT04pOwotCi0gICAgICAgIHNvcnRCeVJlc291cmNlQWN0aW9uID0gbmV3IFNvcnRCeUFjdGlvbihCb29rbWFya1NvcnRlci5SRVNPVVJDRSk7Ci0gICAgICAgIHNvcnRCeVJlc291cmNlQWN0aW9uLnNldFRleHQoQm9va21hcmtNZXNzYWdlcy5Db2x1bW5SZXNvdXJjZV90ZXh0KTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzb3J0QnlSZXNvdXJjZUFjdGlvbiwKLSAgICAgICAgICAgICAgICBJQm9va21hcmtIZWxwQ29udGV4dElkcy5TT1JUX1JFU09VUkNFX0FDVElPTik7Ci0KLSAgICAgICAgc29ydEJ5Rm9sZGVyQWN0aW9uID0gbmV3IFNvcnRCeUFjdGlvbihCb29rbWFya1NvcnRlci5GT0xERVIpOwotICAgICAgICBzb3J0QnlGb2xkZXJBY3Rpb24uc2V0VGV4dChCb29rbWFya01lc3NhZ2VzLkNvbHVtbkZvbGRlcl90ZXh0KTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzb3J0QnlGb2xkZXJBY3Rpb24sCi0gICAgICAgICAgICAgICAgSUJvb2ttYXJrSGVscENvbnRleHRJZHMuU09SVF9GT0xERVJfQUNUSU9OKTsKLQotICAgICAgICBzb3J0QnlMaW5lQWN0aW9uID0gbmV3IFNvcnRCeUFjdGlvbihCb29rbWFya1NvcnRlci5MT0NBVElPTik7Ci0gICAgICAgIHNvcnRCeUxpbmVBY3Rpb24uc2V0VGV4dChCb29rbWFya01lc3NhZ2VzLkNvbHVtbkxvY2F0aW9uX3RleHQpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNvcnRCeUxpbmVBY3Rpb24sCi0gICAgICAgICAgICAgICAgSUJvb2ttYXJrSGVscENvbnRleHRJZHMuU09SVF9MT0NBVElPTl9BQ1RJT04pOwotCi0gICAgICAgIHNvcnRCeUNyZWF0aW9uVGltZSA9IG5ldyBTb3J0QnlBY3Rpb24oQm9va21hcmtTb3J0ZXIuQ1JFQVRJT05fVElNRSk7Ci0gICAgICAgIHNvcnRCeUNyZWF0aW9uVGltZS5zZXRUZXh0KEJvb2ttYXJrTWVzc2FnZXMuQ29sdW1uQ3JlYXRpb25UaW1lX3RleHQpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNvcnRCeUNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgICAgICBJQm9va21hcmtIZWxwQ29udGV4dElkcy5TT1JUX0NSRUFUSU9OX1RJTUVfQUNUSU9OKTsKLQotICAgICAgICBzb3J0QXNjZW5kaW5nQWN0aW9uID0gbmV3IENoYW5nZVNvcnREaXJlY3Rpb25BY3Rpb24oCi0gICAgICAgICAgICAgICAgQm9va21hcmtTb3J0ZXIuQVNDRU5ESU5HKTsKLSAgICAgICAgc29ydEFzY2VuZGluZ0FjdGlvbi5zZXRUZXh0KEJvb2ttYXJrTWVzc2FnZXMuU29ydERpcmVjdGlvbkFzY2VuZGluZ190ZXh0KTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzb3J0QXNjZW5kaW5nQWN0aW9uLAotICAgICAgICAgICAgICAgIElCb29rbWFya0hlbHBDb250ZXh0SWRzLlNPUlRfQVNDRU5ESU5HX0FDVElPTik7Ci0KLSAgICAgICAgc29ydERlc2NlbmRpbmdBY3Rpb24gPSBuZXcgQ2hhbmdlU29ydERpcmVjdGlvbkFjdGlvbigKLSAgICAgICAgICAgICAgICBCb29rbWFya1NvcnRlci5ERVNDRU5ESU5HKTsKLSAgICAgICAgc29ydERlc2NlbmRpbmdBY3Rpb24uc2V0VGV4dChCb29rbWFya01lc3NhZ2VzLlNvcnREaXJlY3Rpb25EZXNjZW5kaW5nX3RleHQpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNvcnREZXNjZW5kaW5nQWN0aW9uLAotICAgICAgICAgICAgICAgIElCb29rbWFya0hlbHBDb250ZXh0SWRzLlNPUlRfREVTQ0VORElOR19BQ1RJT04pOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlU29ydFN0YXRlKCkgewotICAgICAgICBpbnQgY29sdW1uID0gc29ydGVyLmdldFRvcFByaW9yaXR5KCk7Ci0gICAgICAgIHNvcnRCeURlc2NyaXB0aW9uQWN0aW9uCi0gICAgICAgICAgICAgICAgLnNldENoZWNrZWQoY29sdW1uID09IEJvb2ttYXJrU29ydGVyLkRFU0NSSVBUSU9OKTsKLSAgICAgICAgc29ydEJ5UmVzb3VyY2VBY3Rpb24uc2V0Q2hlY2tlZChjb2x1bW4gPT0gQm9va21hcmtTb3J0ZXIuUkVTT1VSQ0UpOwotICAgICAgICBzb3J0QnlGb2xkZXJBY3Rpb24uc2V0Q2hlY2tlZChjb2x1bW4gPT0gQm9va21hcmtTb3J0ZXIuRk9MREVSKTsKLSAgICAgICAgc29ydEJ5TGluZUFjdGlvbi5zZXRDaGVja2VkKGNvbHVtbiA9PSBCb29rbWFya1NvcnRlci5MT0NBVElPTik7Ci0gICAgICAgIHNvcnRCeUNyZWF0aW9uVGltZS5zZXRDaGVja2VkKGNvbHVtbiA9PSBCb29rbWFya1NvcnRlci5DUkVBVElPTl9USU1FKTsKLQotICAgICAgICBpbnQgZGlyZWN0aW9uID0gc29ydGVyLmdldFRvcFByaW9yaXR5RGlyZWN0aW9uKCk7Ci0gICAgICAgIHNvcnRBc2NlbmRpbmdBY3Rpb24uc2V0Q2hlY2tlZChkaXJlY3Rpb24gPT0gQm9va21hcmtTb3J0ZXIuQVNDRU5ESU5HKTsKLSAgICAgICAgc29ydERlc2NlbmRpbmdBY3Rpb24uc2V0Q2hlY2tlZChkaXJlY3Rpb24gPT0gQm9va21hcmtTb3J0ZXIuREVTQ0VORElORyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgZW5hYmxlbWVudCBvZiB0aGUgcGFzdGUgYWN0aW9uCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVQYXN0ZUVuYWJsZW1lbnQoKSB7Ci0gICAgICAgIC8vIFBhc3RlIGlmIGNsaXBib2FyZCBjb250YWlucyB0YXNrcwotICAgICAgICBNYXJrZXJUcmFuc2ZlciB0cmFuc2ZlciA9IE1hcmtlclRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIElNYXJrZXJbXSBtYXJrZXJEYXRhID0gKElNYXJrZXJbXSkgZ2V0Q2xpcGJvYXJkKCkuZ2V0Q29udGVudHModHJhbnNmZXIpOwotICAgICAgICBib29sZWFuIGNhblBhc3RlID0gZmFsc2U7Ci0gICAgICAgIGlmIChtYXJrZXJEYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXJrZXJEYXRhW2ldLmdldFR5cGUoKS5lcXVhbHMoSU1hcmtlci5CT09LTUFSSykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhblBhc3RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhblBhc3RlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBhc3RlQWN0aW9uLnNldEVuYWJsZWQoY2FuUGFzdGUpOwotICAgIH0KLQotICAgIENsaXBib2FyZCBnZXRDbGlwYm9hcmQoKSB7Ci0gICAgICAgIHJldHVybiBjbGlwYm9hcmQ7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9ib29rbWFya2V4cGxvcmVyL0Jvb2ttYXJrUHJvcGVydGllc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvQm9va21hcmtQcm9wZXJ0aWVzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZDA3YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvQm9va21hcmtQcm9wZXJ0aWVzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuYm9va21hcmtleHBsb3JlcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXIuQm9va21hcmtNZXNzYWdlczsKLQotLyoqCi0gKiBTaG93cyB0aGUgcHJvcGVydGllcyBvZiBhIG5ldyBvciBleGlzdGluZyBib29rbWFyawotICovCi1jbGFzcyBCb29rbWFya1Byb3BlcnRpZXNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0gICAgLyoqCi0gICAgICogVGhlIGJvb2ttYXJrIGJlaW5nIHNob3duLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgYSBuZXcgYm9va21hcmsKLSAgICAgKi8KLSAgICBwcml2YXRlIElNYXJrZXIgbWFya2VyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSByZXNvdXJjZSBvbiB3aGljaCB0byBjcmVhdGUgYSBuZXcgYm9va21hcmsKLSAgICAgKi8KLSAgICBwcml2YXRlIElSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaW5pdGlhbCBhdHRyaWJ1dGVzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgbmV3IGJvb2ttYXJrCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgaW5pdGlhbEF0dHJpYnV0ZXMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIHRleHQgY29udHJvbCBmb3IgdGhlIERlc2NyaXB0aW9uIGZpZWxkLgotICAgICAqLwotICAgIHByaXZhdGUgVGV4dCBkZXNjcmlwdGlvblRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29udHJvbCBmb3IgdGhlIENyZWF0aW9uIFRpbWUgZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMYWJlbCBjcmVhdGlvblRpbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGV4dCBjb250cm9sIGZvciB0aGUgUmVzb3VyY2UgZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUZXh0IHJlc291cmNlVGV4dDsKLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXh0IGNvbnRyb2wgZm9yIHRoZSBGb2xkZXIgZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUZXh0IGZvbGRlclRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGV4dCBjb250cm9sIGZvciB0aGUgTG9jYXRpb24gZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUZXh0IGxvY2F0aW9uVGV4dDsKLQotICAgIC8qKgotICAgICAqIERpcnR5IGZsYWcuICBUcnVlIGlmIGFueSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkaXJ0eTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGlhbG9nLiAgQnkgZGVmYXVsdCB0aGlzIGRpYWxvZyBjcmVhdGVzIGEgbmV3IGJvb2ttYXJrLgotICAgICAqIFRvIHNldCB0aGUgcmVzb3VyY2UgYW5kIGluaXRpYWwgYXR0cmlidXRlcyBmb3IgdGhlIG5ldyBib29rbWFyaywgCi0gICAgICogdXNlIDxjb2RlPnNldFJlc291cmNlPC9jb2RlPiBhbmQgPGNvZGU+c2V0SW5pdGlhbEF0dHJpYnV0ZXM8L2NvZGU+LgotICAgICAqIFRvIHNob3cgb3IgbW9kaWZ5IGFuIGV4aXN0aW5nIGJvb2ttYXJrLCB1c2UgPGNvZGU+c2V0TWFya2VyPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2hlbGwgdGhlIHBhcmVudCBzaGVsbAotICAgICAqLwotICAgIHB1YmxpYyBCb29rbWFya1Byb3BlcnRpZXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29rbWFya1Byb3BlcnRpZXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSkgewotICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1hcmtlciB0byBzaG93IG9yIG1vZGlmeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNyZWF0ZSBhIG5ldyBtYXJrZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgdGhpcy5tYXJrZXIgPSBtYXJrZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFya2VyIGJlaW5nIGNyZWF0ZWQgb3IgbW9kaWZpZWQuCi0gICAgICogRm9yIGEgbmV3IG1hcmtlciwgdGhpcyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHVudGlsCi0gICAgICogdGhlIGRpYWxvZyByZXR1cm5zLCBidXQgaXMgbm9uLW51bGwgYWZ0ZXIuCi0gICAgICovCi0gICAgcHVibGljIElNYXJrZXIgZ2V0TWFya2VyKCkgewotICAgICAgICByZXR1cm4gbWFya2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJlc291cmNlIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgbmV3IGJvb2ttYXJrLgotICAgICAqIElmIG5vdCBzZXQsIHRoZSBuZXcgYm9va21hcmsgaXMgY3JlYXRlZCBvbiB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIG5ldyBib29rbWFyaywKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGhhcyBiZWVuIHNldC4KLSAgICAgKiBJZiBub3Qgc2V0LCB0aGUgbmV3IGJvb2ttYXJrIGlzIGNyZWF0ZWQgb24gdGhlIHdvcmtzcGFjZSByb290LgotICAgICAqLwotICAgIHB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGluaXRpYWwgYXR0cmlidXRlcyB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIG5ldyBib29rbWFyay4KLSAgICAgKiBJZiBub3Qgc2V0LCB0aGUgbmV3IGJvb2ttYXJrIGlzIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IGF0dHJpYnV0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbEF0dHJpYnV0ZXMoTWFwIGluaXRpYWxBdHRyaWJ1dGVzKSB7Ci0gICAgICAgIHRoaXMuaW5pdGlhbEF0dHJpYnV0ZXMgPSBpbml0aWFsQXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbml0aWFsIGF0dHJpYnV0ZXMgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYSBuZXcgYm9va21hcmssCi0gICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLSAgICAgKiBJZiBub3Qgc2V0LCB0aGUgbmV3IGJvb2ttYXJrIGlzIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IGF0dHJpYnV0ZXMuCi0gICAgICovCi0gICAgcHVibGljIE1hcCBnZXRJbml0aWFsQXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGluaXRpYWxBdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLSAgICAgICAgaWYgKHRpdGxlID09IG51bGwpCi0gICAgICAgICAgICBuZXdTaGVsbC5zZXRUZXh0KEJvb2ttYXJrTWVzc2FnZXMuUHJvcGVydGllc0RpYWxvZ1RpdGxlX3RleHQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXdTaGVsbC5zZXRUZXh0KHRpdGxlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy9pbml0aWFsaXplIHJlc291cmNlcy9wcm9wZXJ0aWVzCi0gICAgICAgIGlmIChtYXJrZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzb3VyY2UgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW5pdGlhbEF0dHJpYnV0ZXMgPSBtYXJrZXIuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbEF0dHJpYnV0ZXMgPT0gbnVsbCAmJiByZXNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgICAgICBpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlRGVzY3JpcHRpb25BcmVhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGlmIChtYXJrZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGNyZWF0ZUNyZWF0aW9uVGltZUFyZWEoY29tcG9zaXRlKTsKLSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5ST09UKQotICAgICAgICAgICAgY3JlYXRlUmVzb3VyY2VBcmVhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHVwZGF0ZURpYWxvZ0Zyb21NYXJrZXIoKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgY3JlYXRlQ3JlYXRpb25UaW1lQXJlYS4KLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNyZWF0aW9uVGltZUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBTdHJpbmcgY3JlYXRpb24gPSBCb29rbWFya01lc3NhZ2VzLk1hcmtlckNyZWF0aW9uVGltZV90ZXh0OwotCi0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KGNyZWF0aW9uKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChmb250KTsKLQotICAgICAgICBjcmVhdGlvblRpbWUgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGNyZWF0aW9uVGltZS5zZXRGb250KGZvbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIE9LIGFuZCBDYW5jZWwgYnV0dG9ucy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0gICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhcmVhIGZvciB0aGUgRGVzY3JpcHRpb24gZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURlc2NyaXB0aW9uQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChCb29rbWFya01lc3NhZ2VzLkNvbHVtbkRlc2NyaXB0aW9uX2RpYWxvZ1RleHQpOwotICAgICAgICBsYWJlbC5zZXRGb250KGZvbnQpOwotICAgICAgICBpbnQgc3R5bGUgPSBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUjsKLSAgICAgICAgZGVzY3JpcHRpb25UZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBzdHlsZSk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQwMCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgZGVzY3JpcHRpb25UZXh0LnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgZGVzY3JpcHRpb25UZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1hcmtEaXJ0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhcmVhIGZvciB0aGUgUmVzb3VyY2UgZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlc291cmNlQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICAgICAgTGFiZWwgcmVzb3VyY2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgcmVzb3VyY2VMYWJlbC5zZXRUZXh0KEJvb2ttYXJrTWVzc2FnZXMuQ29sdW1uUmVzb3VyY2VfZGlhbG9nVGV4dCk7Ci0gICAgICAgIHJlc291cmNlTGFiZWwuc2V0Rm9udChmb250KTsKLSAgICAgICAgcmVzb3VyY2VUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULldSQVAKLSAgICAgICAgICAgICAgICB8IFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgcmVzb3VyY2VUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICByZXNvdXJjZVRleHQuc2V0Rm9udChmb250KTsKLQotICAgICAgICBMYWJlbCBmb2xkZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgZm9sZGVyTGFiZWwuc2V0VGV4dChCb29rbWFya01lc3NhZ2VzLkNvbHVtbkZvbGRlcl9kaWFsb2dUZXh0KTsKLSAgICAgICAgZm9sZGVyTGFiZWwuc2V0Rm9udChmb250KTsKLSAgICAgICAgZm9sZGVyVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5XUkFQIHwgU1dULlJFQURfT05MWQotICAgICAgICAgICAgICAgIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGZvbGRlclRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGZvbGRlclRleHQuc2V0Rm9udChmb250KTsKLQotICAgICAgICBMYWJlbCBsb2NhdGlvbkxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsb2NhdGlvbkxhYmVsLnNldFRleHQoQm9va21hcmtNZXNzYWdlcy5Db2x1bW5Mb2NhdGlvbl9kaWFsb2dUZXh0KTsKLSAgICAgICAgbG9jYXRpb25MYWJlbC5zZXRGb250KGZvbnQpOwotICAgICAgICBsb2NhdGlvblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUAotICAgICAgICAgICAgICAgIHwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBsb2NhdGlvblRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGxvY2F0aW9uVGV4dC5zZXRGb250KGZvbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGRpYWxvZyBmcm9tIHRoZSBtYXJrZXIgc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURpYWxvZ0Zyb21NYXJrZXIoKSB7Ci0gICAgICAgIGlmIChtYXJrZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdXBkYXRlRGlhbG9nRm9yTmV3TWFya2VyKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZGVzY3JpcHRpb25UZXh0LnNldFRleHQoTWFya2VyVXRpbC5nZXRNZXNzYWdlKG1hcmtlcikpOwotICAgICAgICBpZiAoY3JlYXRpb25UaW1lICE9IG51bGwpCi0gICAgICAgICAgICBjcmVhdGlvblRpbWUuc2V0VGV4dChNYXJrZXJVdGlsLmdldENyZWF0aW9uVGltZShtYXJrZXIpKTsKLSAgICAgICAgaWYgKHJlc291cmNlVGV4dCAhPSBudWxsKQotICAgICAgICAgICAgcmVzb3VyY2VUZXh0LnNldFRleHQoTWFya2VyVXRpbC5nZXRSZXNvdXJjZU5hbWUobWFya2VyKSk7Ci0gICAgICAgIGlmIChmb2xkZXJUZXh0ICE9IG51bGwpCi0gICAgICAgICAgICBmb2xkZXJUZXh0LnNldFRleHQoTWFya2VyVXRpbC5nZXRDb250YWluZXJOYW1lKG1hcmtlcikpOwotICAgICAgICBpZiAobG9jYXRpb25UZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBsaW5lID0gTWFya2VyVXRpbC5nZXRMaW5lTnVtYmVyKG1hcmtlcik7Ci0gICAgICAgICAgICBpZiAobGluZSA8IDApCi0gICAgICAgICAgICAgICAgbG9jYXRpb25UZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbG9jYXRpb25UZXh0LnNldFRleHQoTkxTLmJpbmQoQm9va21hcmtNZXNzYWdlcy5MaW5lSW5kaWNhdG9yX3RleHQsIFN0cmluZy52YWx1ZU9mKGxpbmUpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZXNjcmlwdGlvblRleHQuc2VsZWN0QWxsKCk7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVEaWFsb2dGb3JOZXdNYXJrZXIoKSB7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNvdXJjZVRleHQuc2V0VGV4dChyZXNvdXJjZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICAgIGludCBuID0gcGF0aC5zZWdtZW50Q291bnQoKSAtIDE7IC8vIG4gaXMgdGhlIG51bWJlciBvZiBzZWdtZW50cyBpbiBjb250YWluZXIsIG5vdCBwYXRoCi0gICAgICAgICAgICBpZiAobiA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgbGVuID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKLSAgICAgICAgICAgICAgICAgICAgbGVuICs9IHBhdGguc2VnbWVudChpKS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAvLyBhY2NvdW50IGZvciAvJ3MKLSAgICAgICAgICAgICAgICBpZiAobiA+IDEpCi0gICAgICAgICAgICAgICAgICAgIGxlbiArPSBuIC0gMTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLycpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGF0aC5zZWdtZW50KGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9sZGVyVGV4dC5zZXRUZXh0KHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluaXRpYWxBdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCBkZXNjcmlwdGlvbiA9IGluaXRpYWxBdHRyaWJ1dGVzLmdldChJTWFya2VyLk1FU1NBR0UpOwotICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25UZXh0LnNldFRleHQoKFN0cmluZykgZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgZGVzY3JpcHRpb25UZXh0LnNlbGVjdEFsbCgpOwotCi0gICAgICAgICAgICBPYmplY3QgbGluZSA9IGluaXRpYWxBdHRyaWJ1dGVzLmdldChJTWFya2VyLkxJTkVfTlVNQkVSKTsKLSAgICAgICAgICAgIGlmIChsaW5lICE9IG51bGwgJiYgbGluZSBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgICAgICAgICAgbG9jYXRpb25UZXh0LnNldFRleHQoTkxTLmJpbmQoQm9va21hcmtNZXNzYWdlcy5MaW5lSW5kaWNhdG9yX3RleHQsIGxpbmUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotICAgICAgICBzYXZlQ2hhbmdlcygpOwotICAgICAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbWFya0RpcnR5KCkgewotICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgICAgIHJldHVybiBkaXJ0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgY2hhbmdlcyBtYWRlIGluIHRoZSBkaWFsb2cgaWYgbmVlZGVkLgotICAgICAqIENyZWF0ZXMgYSBuZXcgYm9va21hcmsgaWYgbmVlZGVkLgotICAgICAqIFVwZGF0ZXMgdGhlIGV4aXN0aW5nIGJvb2ttYXJrIG9ubHkgaWYgdGhlcmUgaGF2ZSBiZWVuIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVDaGFuZ2VzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtlciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTWFya2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRGlydHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hcmtlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBCb29rbWFya01lc3NhZ2VzLkVycm9yX3RleHQsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBvciB1cGRhdGVzIHRoZSBtYXJrZXIuICBNdXN0IGJlIGNhbGxlZCB3aXRoaW4gYSB3b3Jrc3BhY2UgcnVubmFibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1hcmtlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0IHRoZSBtYXJrZXIgYXR0cmlidXRlcyBmcm9tIHRoZSBjdXJyZW50IGRpYWxvZyBmaWVsZCB2YWx1ZXMuCi0gICAgICAgIC8vIERvIG5vdCB1c2Ugc2V0QXR0cmlidXRlcyhNYXApIGFzIHRoYXQgb3ZlcndyaXRlcyBhbnkgYXR0cmlidXRlcwotICAgICAgICAvLyBub3QgY292ZXJlZCBieSB0aGUgZGlhbG9nLgotICAgICAgICBNYXAgYXR0cnMgPSBnZXRNYXJrZXJBdHRyaWJ1dGVzRnJvbURpYWxvZygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWwgPSBhdHRycy5nZXQoa2V5KTsKLSAgICAgICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoa2V5LCB2YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFya2VyIGF0dHJpYnV0ZXMgdG8gc2F2ZSBiYWNrIHRvIHRoZSBtYXJrZXIsIAotICAgICAqIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRpYWxvZyBmaWVsZHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgZ2V0TWFya2VyQXR0cmlidXRlc0Zyb21EaWFsb2coKSB7Ci0gICAgICAgIE1hcCBhdHRyaWJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgYXR0cmlicy5wdXQoSU1hcmtlci5NRVNTQUdFLCBkZXNjcmlwdGlvblRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU1hcmtlcigpIHsKLSAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwgfHwgIShyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElNYXJrZXIgbmV3TWFya2VyID0gZmlsZS5jcmVhdGVNYXJrZXIoSU1hcmtlci5CT09LTUFSSyk7Ci0gICAgICAgICAgICBpZiAoaW5pdGlhbEF0dHJpYnV0ZXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBuZXdNYXJrZXIuc2V0QXR0cmlidXRlcyhpbml0aWFsQXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGRlc2NyaXB0aW9uVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBuZXdNYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgbWVzc2FnZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9Cb29rbWFya1NvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvQm9va21hcmtTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjMTk5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9Cb29rbWFya1NvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi1jbGFzcyBCb29rbWFya1NvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLSAgICBwcml2YXRlIGludFtdIGRpcmVjdGlvbnM7Ci0KLSAgICBwcml2YXRlIGludFtdIHByaW9yaXRpZXM7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50IEFTQ0VORElORyA9IDE7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50IERFU0NFTkRJTkcgPSAtMTsKLQotICAgIGZpbmFsIHN0YXRpYyBpbnQgREVTQ1JJUFRJT04gPSAwOwotCi0gICAgZmluYWwgc3RhdGljIGludCBSRVNPVVJDRSA9IDE7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50IEZPTERFUiA9IDI7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50IExPQ0FUSU9OID0gMzsKLQotICAgIGZpbmFsIHN0YXRpYyBpbnQgQ1JFQVRJT05fVElNRSA9IDQ7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50W10gREVGQVVMVF9QUklPUklUSUVTID0geyBGT0xERVIsIFJFU09VUkNFLCBMT0NBVElPTiwKLSAgICAgICAgICAgIERFU0NSSVBUSU9OLCBDUkVBVElPTl9USU1FIH07Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50W10gREVGQVVMVF9ESVJFQ1RJT05TID0geyBBU0NFTkRJTkcsIC8vZGVzY3JpcHRpb24KLSAgICAgICAgICAgIEFTQ0VORElORywgLy9yZXNvdXJjZQotICAgICAgICAgICAgQVNDRU5ESU5HLCAvL2ZvbGRlcgotICAgICAgICAgICAgQVNDRU5ESU5HLCAvL2xvY2F0aW9uCi0gICAgICAgICAgICBBU0NFTkRJTkcsIH07IC8vY3JlYXRpb24gdGltZQotCi0gICAgcHVibGljIEJvb2ttYXJrU29ydGVyKCkgewotICAgICAgICByZXNldFN0YXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2ZXJzZVRvcFByaW9yaXR5KCkgewotICAgICAgICBkaXJlY3Rpb25zW3ByaW9yaXRpZXNbMF1dICo9IC0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRvcFByaW9yaXR5KGludCBwcmlvcml0eSkgewotICAgICAgICBpZiAocHJpb3JpdHkgPCAwIHx8IHByaW9yaXR5ID49IHByaW9yaXRpZXMubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByaW9yaXRpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwcmlvcml0aWVzW2ldID09IHByaW9yaXR5KQotICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICAgICAgcmVzZXRTdGF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zaGlmdCB0aGUgYXJyYXkKLSAgICAgICAgZm9yIChpbnQgaSA9IGluZGV4OyBpID4gMDsgaS0tKSB7Ci0gICAgICAgICAgICBwcmlvcml0aWVzW2ldID0gcHJpb3JpdGllc1tpIC0gMV07Ci0gICAgICAgIH0KLSAgICAgICAgcHJpb3JpdGllc1swXSA9IHByaW9yaXR5OwotICAgICAgICBkaXJlY3Rpb25zW3ByaW9yaXR5XSA9IERFRkFVTFRfRElSRUNUSU9OU1twcmlvcml0eV07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VG9wUHJpb3JpdHlEaXJlY3Rpb24oaW50IGRpcmVjdGlvbikgewotICAgICAgICBpZiAoZGlyZWN0aW9uID09IEFTQ0VORElORyB8fCBkaXJlY3Rpb24gPT0gREVTQ0VORElORykKLSAgICAgICAgICAgIGRpcmVjdGlvbnNbcHJpb3JpdGllc1swXV0gPSBkaXJlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUb3BQcmlvcml0eURpcmVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRpcmVjdGlvbnNbcHJpb3JpdGllc1swXV07Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUb3BQcmlvcml0eSgpIHsKLSAgICAgICAgcmV0dXJuIHByaW9yaXRpZXNbMF07Ci0gICAgfQotCi0gICAgcHVibGljIGludFtdIGdldFByaW9yaXRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBwcmlvcml0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0U3RhdGUoKSB7Ci0gICAgICAgIHByaW9yaXRpZXMgPSBuZXcgaW50W0RFRkFVTFRfUFJJT1JJVElFUy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KERFRkFVTFRfUFJJT1JJVElFUywgMCwgcHJpb3JpdGllcywgMCwKLSAgICAgICAgICAgICAgICBwcmlvcml0aWVzLmxlbmd0aCk7Ci0gICAgICAgIGRpcmVjdGlvbnMgPSBuZXcgaW50W0RFRkFVTFRfRElSRUNUSU9OUy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KERFRkFVTFRfRElSRUNUSU9OUywgMCwgZGlyZWN0aW9ucywgMCwKLSAgICAgICAgICAgICAgICBkaXJlY3Rpb25zLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY29tcGFyZShJTWFya2VyIG1hcmtlcjEsIElNYXJrZXIgbWFya2VyMiwgaW50IGRlcHRoKSB7Ci0gICAgICAgIGlmIChkZXB0aCA+PSBwcmlvcml0aWVzLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGludCBjb2x1bW4gPSBwcmlvcml0aWVzW2RlcHRoXTsKLSAgICAgICAgc3dpdGNoIChjb2x1bW4pIHsKLSAgICAgICAgY2FzZSBERVNDUklQVElPTjogewotICAgICAgICAgICAgU3RyaW5nIGRlc2MxID0gbWFya2VyMS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCAiIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3RyaW5nIGRlc2MyID0gbWFya2VyMi5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCAiIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaW50IHJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUoZGVzYzEsIGRlc2MyKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZShtYXJrZXIxLCBtYXJrZXIyLCBkZXB0aCArIDEpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIGRpcmVjdGlvbnNbY29sdW1uXTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFJFU09VUkNFOiB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzMSA9IG1hcmtlcjEuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzMiA9IG1hcmtlcjIuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShyZXMxLCByZXMyKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZShtYXJrZXIxLCBtYXJrZXIyLCBkZXB0aCArIDEpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIGRpcmVjdGlvbnNbY29sdW1uXTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPTERFUjogewotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcjEgPSBCb29rbWFya0xhYmVsUHJvdmlkZXIuZ2V0Q29udGFpbmVyTmFtZShtYXJrZXIxKTsKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXIyID0gQm9va21hcmtMYWJlbFByb3ZpZGVyLmdldENvbnRhaW5lck5hbWUobWFya2VyMik7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShmb2xkZXIxLCBmb2xkZXIyKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZShtYXJrZXIxLCBtYXJrZXIyLCBkZXB0aCArIDEpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIGRpcmVjdGlvbnNbY29sdW1uXTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIExPQ0FUSU9OOiB7Ci0gICAgICAgICAgICBpbnQgbGluZTEgPSBtYXJrZXIxLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSLCAtMSk7Ci0gICAgICAgICAgICBpbnQgbGluZTIgPSBtYXJrZXIyLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSLCAtMSk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gbGluZTEgLSBsaW5lMjsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZShtYXJrZXIxLCBtYXJrZXIyLCBkZXB0aCArIDEpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIGRpcmVjdGlvbnNbY29sdW1uXTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENSRUFUSU9OX1RJTUU6IHsKLSAgICAgICAgICAgIGxvbmcgcmVzdWx0OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBtYXJrZXIxLmdldENyZWF0aW9uVGltZSgpIC0gbWFya2VyMi5nZXRDcmVhdGlvblRpbWUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUobWFya2VyMSwgbWFya2VyMiwgZGVwdGggKyAxKTsKLSAgICAgICAgICAgIHJldHVybiAoKGludCkgcmVzdWx0KSAqIGRpcmVjdGlvbnNbY29sdW1uXTsKLSAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0gICAgICAgIElNYXJrZXIgbWFya2VyMSA9IChJTWFya2VyKSBlMTsKLSAgICAgICAgSU1hcmtlciBtYXJrZXIyID0gKElNYXJrZXIpIGUyOwotCi0gICAgICAgIHJldHVybiBjb21wYXJlKG1hcmtlcjEsIG1hcmtlcjIsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLSAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmlvcml0aWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzZXR0aW5ncy5wdXQoInByaW9yaXR5IiArIGksIHByaW9yaXRpZXNbaV0pOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNldHRpbmdzLnB1dCgiZGlyZWN0aW9uIiArIGksIGRpcmVjdGlvbnNbaV0pOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLSAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJpb3JpdGllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHByaW9yaXRpZXNbaV0gPSBzZXR0aW5ncy5nZXRJbnQoInByaW9yaXR5IiArIGkpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBkaXJlY3Rpb25zW2ldID0gc2V0dGluZ3MuZ2V0SW50KCJkaXJlY3Rpb24iICsgaSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmVzZXRTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvQ29weUJvb2ttYXJrQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9Db3B5Qm9va21hcmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhZGNkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9Db3B5Qm9va21hcmtBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5ib29rbWFya2V4cGxvcmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MuYm9va21hcmtleHBsb3Jlci5Cb29rbWFya01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTWFya2VyVHJhbnNmZXI7Ci0KLS8qKgotICogQ29waWVzIG9uZSBvciBtb3JlIGJvb2ttYXJrKHMpIHRvIHRoZSBjbGlwYm9hcmQuCi0gKi8KLWNsYXNzIENvcHlCb29rbWFya0FjdGlvbiBleHRlbmRzIEJvb2ttYXJrQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYm9va21hcmtOYXZpZ2F0b3IgdGhlIHZpZXcKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29weUJvb2ttYXJrQWN0aW9uKEJvb2ttYXJrTmF2aWdhdG9yIGJvb2ttYXJrTmF2aWdhdG9yKSB7Ci0gICAgICAgIHN1cGVyKGJvb2ttYXJrTmF2aWdhdG9yLCBCb29rbWFya01lc3NhZ2VzLkNvcHlCb29rbWFya190ZXh0KTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotICAgICAgICAgICAgICAgIElCb29rbWFya0hlbHBDb250ZXh0SWRzLkNPUFlfQk9PS01BUktfQUNUSU9OKTsKLSAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhpcyBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAvLyBHZXQgdGhlIHNlbGVjdGVkIG1hcmtlcnMKLSAgICAgICAgQm9va21hcmtOYXZpZ2F0b3IgYm9va21hcmtOYXZpZ2F0b3IgPSBnZXRWaWV3KCk7Ci0gICAgICAgIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gYm9va21hcmtOYXZpZ2F0b3IuZ2V0Vmlld2VyKCk7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIExpc3QgbGlzdCA9IHNlbGVjdGlvbi50b0xpc3QoKTsKLSAgICAgICAgSU1hcmtlcltdIG1hcmtlcnMgPSBuZXcgSU1hcmtlcltsaXN0LnNpemUoKV07Ci0gICAgICAgIGxpc3QudG9BcnJheShtYXJrZXJzKTsKLQotICAgICAgICBzZXRDbGlwYm9hcmQobWFya2VycywgY3JlYXRlQm9va21hcmtSZXBvcnQobWFya2VycykpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBVcGRhdGVzIGVuYWJsZW1lbnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwpIHsKLSAgICAgICAgc2V0RW5hYmxlZCghc2VsLmlzRW1wdHkoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldENsaXBib2FyZChJTWFya2VyW10gbWFya2VycywgU3RyaW5nIG1hcmtlclJlcG9ydCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gUGxhY2UgdGhlIG1hcmtlcnMgb24gdGhlIGNsaXBib2FyZAotICAgICAgICAgICAgT2JqZWN0W10gZGF0YSA9IG5ldyBPYmplY3RbXSB7IG1hcmtlcnMsIG1hcmtlclJlcG9ydCB9OwotICAgICAgICAgICAgVHJhbnNmZXJbXSB0cmFuc2ZlclR5cGVzID0gbmV3IFRyYW5zZmVyW10gewotICAgICAgICAgICAgICAgICAgICBNYXJrZXJUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCi0gICAgICAgICAgICAvLyBzZXQgdGhlIGNsaXBib2FyZCBjb250ZW50cwotICAgICAgICAgICAgZ2V0VmlldygpLmdldENsaXBib2FyZCgpLnNldENvbnRlbnRzKGRhdGEsIHRyYW5zZmVyVHlwZXMpOwotICAgICAgICB9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0gICAgICAgICAgICBpZiAoZS5jb2RlICE9IERORC5FUlJPUl9DQU5OT1RfU0VUX0NMSVBCT0FSRCkKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgaWYgKE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgLm9wZW5RdWVzdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWaWV3KCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29rbWFya01lc3NhZ2VzLkNvcHlUb0NsaXBib2FyZFByb2JsZW1EaWFsb2dfdGl0bGUsIEJvb2ttYXJrTWVzc2FnZXMuQ29weVRvQ2xpcGJvYXJkUHJvYmxlbURpYWxvZ19tZXNzYWdlKSkKLSAgICAgICAgICAgICAgICBzZXRDbGlwYm9hcmQobWFya2VycywgbWFya2VyUmVwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUJvb2ttYXJrUmVwb3J0KElNYXJrZXJbXSBtYXJrZXJzKSB7Ci0gICAgICAgIFN0cmluZyByZXBvcnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vd3JpdGUgaGVhZGVyCi0gICAgICAgIHJlcG9ydCArPSBCb29rbWFya01lc3NhZ2VzLkNvbHVtbkRlc2NyaXB0aW9uX2hlYWRlciArICdcdCc7Ci0gICAgICAgIHJlcG9ydCArPSBCb29rbWFya01lc3NhZ2VzLkNvbHVtblJlc291cmNlX2hlYWRlciArICdcdCc7Ci0gICAgICAgIHJlcG9ydCArPSBCb29rbWFya01lc3NhZ2VzLkNvbHVtbkZvbGRlcl9oZWFkZXIgKyAnXHQnOwotICAgICAgICByZXBvcnQgKz0gQm9va21hcmtNZXNzYWdlcy5Db2x1bW5Mb2NhdGlvbl9oZWFkZXI7Ci0gICAgICAgIHJlcG9ydCArPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvL3dyaXRlIG1hcmtlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICByZXBvcnQgKz0gTWFya2VyVXRpbC5nZXRNZXNzYWdlKG1hcmtlcnNbaV0pICsgJ1x0JzsKLSAgICAgICAgICAgIHJlcG9ydCArPSBNYXJrZXJVdGlsLmdldFJlc291cmNlTmFtZShtYXJrZXJzW2ldKSArICdcdCc7Ci0gICAgICAgICAgICByZXBvcnQgKz0gTWFya2VyVXRpbC5nZXRDb250YWluZXJOYW1lKG1hcmtlcnNbaV0pICsgJ1x0JzsKLSAgICAgICAgICAgIGludCBsaW5lID0gTWFya2VyVXRpbC5nZXRMaW5lTnVtYmVyKG1hcmtlcnNbaV0pOwotICAgICAgICAgICAgcmVwb3J0ICs9IE5MUy5iaW5kKEJvb2ttYXJrTWVzc2FnZXMuTGluZUluZGljYXRvcl90ZXh0LCBTdHJpbmcudmFsdWVPZihsaW5lKSk7Ci0gICAgICAgICAgICByZXBvcnQgKz0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVwb3J0OwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvRWRpdEJvb2ttYXJrQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9FZGl0Qm9va21hcmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyMjY4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9FZGl0Qm9va21hcmtBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MuYm9va21hcmtleHBsb3Jlci5Cb29rbWFya01lc3NhZ2VzOwotCi0vKioKLSAqIE9wZW5zIGEgcHJvcGVydGllcyBkaWFsb2cgYWxsb3dpbmcgdGhlIHVzZXIgdG8gZWRpdCB0aGUgYm9va21hcmsncyBkZXNjcmlwdGlvbi4gCi0gKi8KLWNsYXNzIEVkaXRCb29rbWFya0FjdGlvbiBleHRlbmRzIEJvb2ttYXJrQWN0aW9uIHsKLQotICAgIHByb3RlY3RlZCBFZGl0Qm9va21hcmtBY3Rpb24oQm9va21hcmtOYXZpZ2F0b3IgdmlldykgewotICAgICAgICBzdXBlcih2aWV3LCBCb29rbWFya01lc3NhZ2VzLlByb3BlcnRpZXNfdGV4dCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLSAgICAgICAgICAgICAgICBJQm9va21hcmtIZWxwQ29udGV4dElkcy5CT09LTUFSS19QUk9QRVJUSUVTX0FDVElPTik7Ci0gICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgSU1hcmtlciBtYXJrZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGlmIChtYXJrZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGVkaXRCb29rbWFyaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgbWFya2VyIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpZiB0aGUgc2VsZWN0aW9uIGlzIGFuIGluc3RhbmNlIG9mIAotICAgICAqIDxjb2RlPm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI8Y29kZT4gYW5kIHRoZSBzZWxlY3RlZCBtYXJrZXIncyAKLSAgICAgKiByZXNvdXJjZSBpcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTxjb2RlPi4KLSAgICAgKiBPdGhlcndpc2Ugc2V0cyBtYXJrZXIgdG8gbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBtYXJrZXIgPSBudWxsOwotICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIE9iamVjdCBvID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSU1hcmtlcikpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSU1hcmtlciBzZWxlY3RlZE1hcmtlciA9IChJTWFya2VyKSBvOwotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBzZWxlY3RlZE1hcmtlci5nZXRSZXNvdXJjZSgpOwotICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgbWFya2VyID0gc2VsZWN0ZWRNYXJrZXI7Ci0gICAgICAgICAgICBzZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVkaXRCb29rbWFyaygpIHsKLSAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgbWFya2VyLmdldFJlc291cmNlKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbGUuZ2V0V29ya3NwYWNlKCkucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBCb29rbWFya1Byb3BlcnRpZXNEaWFsb2cgZGlhbG9nID0gbmV3IEJvb2ttYXJrUHJvcGVydGllc0RpYWxvZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWaWV3KCkuZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotICAgICAgICAgICAgICAgICAgICBkaWFsb2cuc2V0TWFya2VyKG1hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmxvZyhudWxsLCBlLmdldFN0YXR1cygpKTsgLy8gV2UgZG9uJ3QgY2FyZQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9JQm9va21hcmtIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvSUJvb2ttYXJrSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5NjYzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9JQm9va21hcmtIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuYm9va21hcmtleHBsb3JlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIGJvb2ttYXJrIHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQKLSAqIG9yIGV4dGVuZGVkLgotICogPC9wPgotICogCi0gKi8KLWludGVyZmFjZSBJQm9va21hcmtIZWxwQ29udGV4dElkcyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gUGxhdGZvcm1VSS5QTFVHSU5fSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIEFjdGlvbnMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZX0JPT0tNQVJLX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiY29weV9ib29rbWFya19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1RFX0JPT0tNQVJLX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAicGFzdGVfYm9va21hcmtfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfQk9PS01BUktfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJyZW1vdmVfYm9va21hcmtfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0JPT0tNQVJLX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAib3Blbl9ib29rbWFya19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9BTExfQk9PS01BUktfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJzZWxlY3RfYWxsX2Jvb2ttYXJrX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PS01BUktfUFJPUEVSVElFU19BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgImJvb2ttYXJrX3Byb3BlcnRpZXNfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1JUX0FTQ0VORElOR19BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgImJvb2ttYXJrX3NvcnRfYXNjZW5kaW5nX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09SVF9ERVNDRU5ESU5HX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiYm9va21hcmtfc29ydF9kZXNjZW5kaW5nX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09SVF9ERVNDUklQVElPTl9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgImJvb2ttYXJrX3NvcnRfZGVzY3JpcHRpb25fYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1JUX1JFU09VUkNFX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiYm9va21hcmtfc29ydF9yZXNvdXJjZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPUlRfRk9MREVSX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiYm9va21hcmtfc29ydF9mb2xkZXJfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1JUX0xPQ0FUSU9OX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiYm9va21hcmtfc29ydF9sb2NhdGlvbl9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPUlRfQ1JFQVRJT05fVElNRV9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgImJvb2ttYXJrX3NvcnRfY3JlYXRpb25fdGltZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFZpZXdzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PS01BUktfVklFVyA9IFBSRUZJWCArICJib29rbWFya192aWV3X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9NYXJrZXJVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9NYXJrZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkM2IzZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvTWFya2VyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXI7Ci0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGFjY2Vzc2luZyBtYXJrZXIgYXR0cmlidXRlcy4KLSAqLwotY2xhc3MgTWFya2VyVXRpbCB7Ci0KLSAgICAvKioKLSAgICAgKiBEb24ndCBhbGxvdyBpbnN0YW50aWF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgTWFya2VyVXRpbCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbmRpbmcgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgZ2l2ZW4gbWFya2VyLgotICAgICAqLwotICAgIHN0YXRpYyBpbnQgZ2V0Q2hhckVuZChJTWFya2VyIG1hcmtlcikgewotICAgICAgICByZXR1cm4gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhcnRpbmcgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgZ2l2ZW4gbWFya2VyLgotICAgICAqLwotICAgIHN0YXRpYyBpbnQgZ2V0Q2hhclN0YXJ0KElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIHJldHVybiBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRhaW5lciBuYW1lIGlmIGl0IGlzIGRlZmluZWQsIG9yIGVtcHR5IHN0cmluZyBpZiBub3QuCi0gICAgICovCi0gICAgc3RhdGljIFN0cmluZyBnZXRDb250YWluZXJOYW1lKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIElQYXRoIHBhdGggPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpOwotICAgICAgICBpbnQgbiA9IHBhdGguc2VnbWVudENvdW50KCkgLSAxOyAvLyBuIGlzIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgaW4gY29udGFpbmVyLCBub3QgcGF0aAotICAgICAgICBpZiAobiA8PSAwKQotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGludCBsZW4gPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKLSAgICAgICAgICAgIGxlbiArPSBwYXRoLnNlZ21lbnQoaSkubGVuZ3RoKCk7Ci0gICAgICAgIC8vIGFjY291bnQgZm9yIC8ncwotICAgICAgICBpZiAobiA+IDEpCi0gICAgICAgICAgICBsZW4gKz0gbiAtIDE7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobGVuKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChpICE9IDApCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcvJyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQocGF0aC5zZWdtZW50KGkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZ2l2ZW4gbWFya2VyLgotICAgICAqLwotICAgIHN0YXRpYyBpbnQgZ2V0TGluZU51bWJlcihJTWFya2VyIG1hcmtlcikgewotICAgICAgICByZXR1cm4gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSLCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGxvY2F0aW9uIGZpZWxkLgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYXRpb24oSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgcmV0dXJuIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgIiIpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gbWFya2VyLAotICAgICAqIG9yIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlIG1lc3NhZ2UgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShJTWFya2VyIG1hcmtlcikgewotICAgICAgICByZXR1cm4gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsICIiKTsvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgZ2l2ZW4gc3RyaW5nLCB3aGljaCBpcyBhc3N1bWVkIHRvIHJlcHJlc2VudCBhIG51bWVyaWMgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG51bWVyaWMsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLSAgICAgKi8KLSAgICBzdGF0aWMgaW50IGdldE51bWVyaWNWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgYm9vbGVhbiBuZWdhdGl2ZSA9IGZhbHNlOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGludCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKLQotICAgICAgICAvLyBza2lwIGFueSBsZWFkaW5nICcjJwotICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciAxR0NFNjlVOiBJVFBKQ09SRTpBTEwgLSBKYXZhIHByb2JsZW1zIHNob3VsZCBub3QgaGF2ZSAnIycgaW4gbG9jYXRpb24uCi0gICAgICAgIGlmIChpIDwgbGVuICYmIHZhbHVlLmNoYXJBdChpKSA9PSAnIycpCi0gICAgICAgICAgICArK2k7Ci0KLSAgICAgICAgaWYgKGkgPCBsZW4gJiYgdmFsdWUuY2hhckF0KGkpID09ICctJykgewotICAgICAgICAgICAgbmVnYXRpdmUgPSB0cnVlOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgICAgIHdoaWxlIChpIDwgbGVuKSB7Ci0gICAgICAgICAgICBpbnQgZGlnaXQgPSBDaGFyYWN0ZXIuZGlnaXQodmFsdWUuY2hhckF0KGkrKyksIDEwKTsKLSAgICAgICAgICAgIGlmIChkaWdpdCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICogMTAgKyBkaWdpdDsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVnYXRpdmUpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IC1yZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRzIElQcm92aWRlciBpbnRlcmZhY2UgYnkgc3VwcG9ydGluZyBhIG51bWJlciBvZgotICAgICAqIHByb3BlcnRpZXMgcmVxdWlyZWQgZm9yIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiBtYXJrZXJzCi0gICAgICogaW4gdGhlIHRhc2tsaXN0LgotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBuYW1lIGlmIGl0IGlzIGRlZmluZWQsIG9yCi0gICAgICogYmxhbmsgc3RyaW5nIGlmIG5vdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlTmFtZShJTWFya2VyIG1hcmtlcikgewotICAgICAgICByZXR1cm4gbWFya2VyLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIG1hcmtlciBhcyBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBzdGF0aWMgU3RyaW5nIGdldENyZWF0aW9uVGltZShJTWFya2VyIG1hcmtlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZShEYXRlRm9ybWF0LkxPTkcsCi0gICAgICAgICAgICAgICAgICAgIERhdGVGb3JtYXQuTUVESVVNKS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKG1hcmtlci5nZXRDcmVhdGlvblRpbWUoKSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvT3BlbkJvb2ttYXJrQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9PcGVuQm9va21hcmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzZmNmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9PcGVuQm9va21hcmtBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuT3BlblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXIuQm9va21hcmtNZXNzYWdlczsKLQotLyoqCi0gKiBBY3Rpb24gdG8gb3BlbiBhbiBlZGl0b3Igb24gdGhlIHNlbGVjdGVkIGJvb2ttYXJrcy4KLSAqLwotY2xhc3MgT3BlbkJvb2ttYXJrQWN0aW9uIGV4dGVuZHMgQm9va21hcmtBY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZpZXcgdGhlIHZpZXcKLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlbkJvb2ttYXJrQWN0aW9uKEJvb2ttYXJrTmF2aWdhdG9yIHZpZXcpIHsKLSAgICAgICAgc3VwZXIodmlldywgQm9va21hcmtNZXNzYWdlcy5PcGVuQm9va21hcmtfdGV4dCk7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KEJvb2ttYXJrTWVzc2FnZXMuT3BlbkJvb2ttYXJrX3Rvb2xUaXApOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0gICAgICAgICAgICAgICAgSUJvb2ttYXJrSGVscENvbnRleHRJZHMuT1BFTl9CT09LTUFSS19BQ1RJT04pOwotICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRWaWV3KCkuZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgaS5uZXh0KCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElERS5vcGVuRWRpdG9yKHBhZ2UsIG1hcmtlciwgT3BlblN0cmF0ZWd5LmFjdGl2YXRlT25PcGVuKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIE9wZW4gYW4gZXJyb3Igc3R5bGUgZGlhbG9nIGZvciBQYXJ0SW5pdEV4Y2VwdGlvbiBieQotICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBhbnkgZXh0cmEgaW5mb3JtYXRpb24gZnJvbSB0aGUgbmVzdGVkCi0gICAgICAgICAgICAgICAgLy8gQ29yZUV4Y2VwdGlvbiBpZiBwcmVzZW50LgotCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVzdGVkIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBDb3JlRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3RhdHVzLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgbmVzdGVkRXhjZXB0aW9uID0gKENvcmVFeGNlcHRpb24pIHN0YXR1cy5nZXRFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgICAgIGlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBPcGVuIGFuIGVycm9yIGRpYWxvZyBhbmQgaW5jbHVkZSB0aGUgZXh0cmEKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RhdHVzIGluZm9ybWF0aW9uIGZyb20gdGhlIG5lc3RlZCBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRWaWV3KCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29rbWFya01lc3NhZ2VzLk9wZW5Cb29rbWFya19lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpLCBuZXN0ZWRFeGNlcHRpb24uZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9wZW4gYSByZWd1bGFyIGVycm9yIGRpYWxvZyBzaW5jZSB0aGVyZSBpcyBubwotICAgICAgICAgICAgICAgICAgICAvLyBleHRyYSBpbmZvcm1hdGlvbiB0byBkaXNwbGF5Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFZpZXcoKS5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2ttYXJrTWVzc2FnZXMuT3BlbkJvb2ttYXJrX2Vycm9yVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsKSB7Ci0gICAgICAgIHNldEVuYWJsZWQoIXNlbC5pc0VtcHR5KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9ib29rbWFya2V4cGxvcmVyL1Bhc3RlQm9va21hcmtBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9ib29rbWFya2V4cGxvcmVyL1Bhc3RlQm9va21hcmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0YzA3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9QYXN0ZUJvb2ttYXJrQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuYm9va21hcmtleHBsb3JlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXIuQm9va21hcmtNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk1hcmtlclRyYW5zZmVyOwotCi0vKioKLSAqIFBhc3RlcyBvbmUgb3IgbW9yZSBib29rbWFyayhzKSBmcm9tIHRoZSBjbGlwYm9hcmQgaW50byB0aGUgYm9va21hcmsgbmF2aWdhdG9yLgotICovCi1jbGFzcyBQYXN0ZUJvb2ttYXJrQWN0aW9uIGV4dGVuZHMgQm9va21hcmtBY3Rpb24gewotCi0gICAgcHJpdmF0ZSBCb29rbWFya05hdmlnYXRvciB2aWV3OwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2aWV3IHRoZSB2aWV3Ci0gICAgICovCi0gICAgcHVibGljIFBhc3RlQm9va21hcmtBY3Rpb24oQm9va21hcmtOYXZpZ2F0b3IgdmlldykgewotICAgICAgICBzdXBlcih2aWV3LCBCb29rbWFya01lc3NhZ2VzLlBhc3RlQm9va21hcmtfdGV4dCk7Ci0gICAgICAgIHRoaXMudmlldyA9IHZpZXc7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLSAgICAgICAgICAgICAgICBJQm9va21hcmtIZWxwQ29udGV4dElkcy5QQVNURV9CT09LTUFSS19BQ1RJT04pOwotICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIG1hcmtlcihzKSBmcm9tIHRoZSBjbGlwYm9hcmQgdG8gdGhlIGJvb2ttYXJrIG5hdmlnYXRvciB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgLy8gR2V0IHRoZSBtYXJrZXJzIGZyb20gdGhlIGNsaXBib2FyZAotICAgICAgICBNYXJrZXJUcmFuc2ZlciB0cmFuc2ZlciA9IE1hcmtlclRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGZpbmFsIElNYXJrZXJbXSBtYXJrZXJEYXRhID0gKElNYXJrZXJbXSkgdmlldy5nZXRDbGlwYm9hcmQoKQotICAgICAgICAgICAgICAgIC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0KLSAgICAgICAgaWYgKG1hcmtlckRhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBmaW5hbCBBcnJheUxpc3QgbmV3TWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmlldy5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBwYXN0ZSB0YXNrcyAobm90IHByb2JsZW1zKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXJrZXJEYXRhW2ldLmdldFR5cGUoKS5lcXVhbHMoSU1hcmtlci5CT09LTUFSSykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3RlIHRvIHRoZSBzYW1lIHJlc291cmNlIGFzIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gbWFya2VyRGF0YVtpXS5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGF0dHJpYnV0ZXMgPSBtYXJrZXJEYXRhW2ldLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElNYXJrZXIgbWFya2VyID0gcmVzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZU1hcmtlcihJTWFya2VyLkJPT0tNQVJLKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWFya2Vycy5hZGQobWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcih2aWV3LmdldFNoZWxsKCksIEJvb2ttYXJrTWVzc2FnZXMuUGFzdGVCb29rbWFya19lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICBudWxsLCBlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5lZWQgdG8gZG8gdGhpcyBpbiBhbiBhc3luY0V4ZWMsIGV2ZW4gdGhvdWdoIHdlJ3JlIGluIHRoZSBVSSB0aHJlYWQgaGVyZSwKLSAgICAgICAgLy8gc2luY2UgdGhlIGJvb2ttYXJrIG5hdmlnYXRvciB1cGRhdGVzIGl0c2VsZiB3aXRoIHRoZSBhZGRpdGlvbiBpbiBhbiBhc3luY0V4ZWMsCi0gICAgICAgIC8vIHdoaWNoIGhhc24ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuCi0gICAgICAgIC8vIE11c3QgYmUgZG9uZSBvdXRzaWRlIElXb3Jrc3BhY2VSdW5uYWJsZSBhYm92ZSBzaW5jZSBub3RpZmljYXRpb24gZm9yIGFkZCBpcwotICAgICAgICAvLyBzZW50IGFmdGVyIElXb3Jrc3BhY2VSdW5uYWJsZSBpcyBydW4uCi0gICAgICAgIGlmIChuZXdNYXJrZXJzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHZpZXcuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZXcuZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld01hcmtlcnMpKTsKLSAgICAgICAgICAgICAgICAgICAgdmlldy51cGRhdGVQYXN0ZUVuYWJsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvUmVtb3ZlQm9va21hcmtBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9ib29rbWFya2V4cGxvcmVyL1JlbW92ZUJvb2ttYXJrQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NGM2YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvUmVtb3ZlQm9va21hcmtBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5ib29rbWFya2V4cGxvcmVyLkJvb2ttYXJrTWVzc2FnZXM7Ci0KLS8qKgotICogQWN0aW9uIHRvIHJlbW92ZSB0aGUgc2VsZWN0ZWQgYm9va21hcmtzLgotICovCi1jbGFzcyBSZW1vdmVCb29rbWFya0FjdGlvbiBleHRlbmRzIEJvb2ttYXJrQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2aWV3IHRoZSB2aWV3Ci0gICAgICovCi0gICAgcHVibGljIFJlbW92ZUJvb2ttYXJrQWN0aW9uKEJvb2ttYXJrTmF2aWdhdG9yIHZpZXcpIHsKLSAgICAgICAgc3VwZXIodmlldywgQm9va21hcmtNZXNzYWdlcy5SZW1vdmVCb29rbWFya190ZXh0KTsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQoQm9va21hcmtNZXNzYWdlcy5SZW1vdmVCb29rbWFya190b29sVGlwKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotICAgICAgICAgICAgICAgIElCb29rbWFya0hlbHBDb250ZXh0SWRzLlJFTU9WRV9CT09LTUFSS19BQ1RJT04pOwotICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgdGhlIG1hcmtlciBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWwuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0VmlldygpLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc2VsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSU1hcmtlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIG87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgRXJyb3JEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgLm9wZW5FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWaWV3KCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29rbWFya01lc3NhZ2VzLlJlbW92ZUJvb2ttYXJrX2Vycm9yVGl0bGUsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwpIHsKLSAgICAgICAgc2V0RW5hYmxlZCghc2VsLmlzRW1wdHkoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvU2VsZWN0QWxsQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9TZWxlY3RBbGxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzllMmFhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvYm9va21hcmtleHBsb3Jlci9TZWxlY3RBbGxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MuYm9va21hcmtleHBsb3Jlci5Cb29rbWFya01lc3NhZ2VzOwotCi0vKioKLSAqIEFjdGlvbiB0byBzZWxlY3QgYWxsIGJvb2ttYXJrcy4KLSAqLwotY2xhc3MgU2VsZWN0QWxsQWN0aW9uIGV4dGVuZHMgQm9va21hcmtBY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZpZXcgdGhlIHZpZXcKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VsZWN0QWxsQWN0aW9uKEJvb2ttYXJrTmF2aWdhdG9yIHZpZXcpIHsKLSAgICAgICAgc3VwZXIodmlldywgQm9va21hcmtNZXNzYWdlcy5TZWxlY3RBbGxfdGV4dCk7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KEJvb2ttYXJrTWVzc2FnZXMuU2VsZWN0QWxsX3Rvb2xUaXApOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0gICAgICAgICAgICAgICAgSUJvb2ttYXJrSGVscENvbnRleHRJZHMuU0VMRUNUX0FMTF9CT09LTUFSS19BQ1RJT04pOwotICAgICAgICBzZXRFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgVmlld2VyIHZpZXdlciA9IGdldFZpZXcoKS5nZXRWaWV3ZXIoKTsKLSAgICAgICAgQ29udHJvbCBjb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLSAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZSkgewotICAgICAgICAgICAgKChUYWJsZSkgY29udHJvbCkuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICB2aWV3ZXIuc2V0U2VsZWN0aW9uKHZpZXdlci5nZXRTZWxlY3Rpb24oKSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2Jvb2ttYXJrZXhwbG9yZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDI0Yjg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9ib29rbWFya2V4cGxvcmVyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgc3RhbmRhcmQgQm9va21hcmtzIHZpZXcgd2hpY2ggZGlzcGxheXMKLWJvb2ttYXJrcyBvbiByZXNvdXJjZXMuCi08YnI+Jm5ic3A7Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvZnJhbWVsaXN0L0JhY2tBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvQmFja0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmE2ZjQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvQmFja0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmZyYW1lbGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLmZyYW1lbGlzdC5GcmFtZUxpc3RNZXNzYWdlczsKLQotLyoqCi0gKiBHZW5lcmljICJCYWNrIiBhY3Rpb24gd2hpY2ggZ29lcyBiYWNrIG9uZSBmcmFtZSwKLSAqLwotcHVibGljIGNsYXNzIEJhY2tBY3Rpb24gZXh0ZW5kcyBGcmFtZUFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZSBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBmcmFtZUxpc3QgdGhlIGZyYW1lIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgQmFja0FjdGlvbihGcmFtZUxpc3QgZnJhbWVMaXN0KSB7Ci0gICAgICAgIHN1cGVyKGZyYW1lTGlzdCk7Ci0gICAgICAgIHNldFRleHQoRnJhbWVMaXN0TWVzc2FnZXMuQmFja190ZXh0KTsKLSAgICAgICAgSVNoYXJlZEltYWdlcyBpbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0JBQ0spKTsKLSAgICAgICAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0JBQ0tfRElTQUJMRUQpKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCUlGcmFtZUxpc3RIZWxwQ29udGV4dElkcy5CQUNLX0FDVElPTik7Ci0gICAgICAgIHVwZGF0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRnJhbWUgZ2V0UHJldmlvdXNGcmFtZSgpIHsKLSAgICAgICAgRnJhbWVMaXN0IGxpc3QgPSBnZXRGcmFtZUxpc3QoKTsKLSAgICAgICAgcmV0dXJuIGxpc3QuZ2V0RnJhbWUobGlzdC5nZXRDdXJyZW50SW5kZXgoKSAtIDEpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFRvb2xUaXBUZXh0KEZyYW1lIHByZXZpb3VzRnJhbWUpIHsKLSAgICAgICAgaWYgKHByZXZpb3VzRnJhbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBwcmV2aW91c0ZyYW1lLmdldFRvb2xUaXBUZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKEZyYW1lTGlzdE1lc3NhZ2VzLkJhY2tfdG9vbFRpcE9uZUFyZywgdGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZyYW1lTGlzdE1lc3NhZ2VzLkJhY2tfdG9vbFRpcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxscyA8Y29kZT5iYWNrKCk8L2NvZGU+IG9uIHRoZSBmcmFtZSBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgZ2V0RnJhbWVMaXN0KCkuYmFjaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhpcyBhY3Rpb24ncyBlbmFibGVkIHN0YXRlIGFuZCB0b29sIHRpcCB0ZXh0LgotICAgICAqIFRoaXMgYWN0aW9uIGlzIGVuYWJsZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgcHJldmlvdXMgZnJhbWUgaW4gdGhlIGZyYW1lIGxpc3QuCi0gICAgICogVGhlIHRvb2wgdGlwIHRleHQgaXMgIkJhY2sgdG8gIiBwbHVzIHRoZSB0b29sIHRpcCB0ZXh0IGZvciB0aGUgcHJldmlvdXMgZnJhbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBzdXBlci51cGRhdGUoKTsKLSAgICAgICAgRnJhbWUgcHJldmlvdXNGcmFtZSA9IGdldFByZXZpb3VzRnJhbWUoKTsKLSAgICAgICAgc2V0RW5hYmxlZChwcmV2aW91c0ZyYW1lICE9IG51bGwpOwotICAgICAgICBzZXRUb29sVGlwVGV4dChnZXRUb29sVGlwVGV4dChwcmV2aW91c0ZyYW1lKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvZnJhbWVsaXN0L0ZvcndhcmRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvRm9yd2FyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmM1OWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvRm9yd2FyZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmZyYW1lbGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLmZyYW1lbGlzdC5GcmFtZUxpc3RNZXNzYWdlczsKLQotLyoqCi0gKiBHZW5lcmljICJGb3J3YXJkIiBhY3Rpb24gd2hpY2ggZ29lcyBmb3J3YXJkIG9uZSBmcmFtZS4KLSAqLwotcHVibGljIGNsYXNzIEZvcndhcmRBY3Rpb24gZXh0ZW5kcyBGcmFtZUFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZSBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBmcmFtZUxpc3QgdGhlIGZyYW1lIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgRm9yd2FyZEFjdGlvbihGcmFtZUxpc3QgZnJhbWVMaXN0KSB7Ci0gICAgICAgIHN1cGVyKGZyYW1lTGlzdCk7Ci0gICAgICAgIHNldFRleHQoRnJhbWVMaXN0TWVzc2FnZXMuRm9yd2FyZF90ZXh0KTsKLSAgICAgICAgSVNoYXJlZEltYWdlcyBpbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0ZPUldBUkQpKTsKLSAgICAgICAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0ZPUldBUkRfRElTQUJMRUQpKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCUlGcmFtZUxpc3RIZWxwQ29udGV4dElkcy5GT1JXQVJEX0FDVElPTik7Ci0gICAgICAgIHVwZGF0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRnJhbWUgZ2V0TmV4dEZyYW1lKCkgewotICAgICAgICBGcmFtZUxpc3QgbGlzdCA9IGdldEZyYW1lTGlzdCgpOwotICAgICAgICByZXR1cm4gbGlzdC5nZXRGcmFtZShsaXN0LmdldEN1cnJlbnRJbmRleCgpICsgMSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoRnJhbWUgbmV4dEZyYW1lKSB7Ci0gICAgICAgIGlmIChuZXh0RnJhbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBuZXh0RnJhbWUuZ2V0VG9vbFRpcFRleHQoKTsKLSAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoRnJhbWVMaXN0TWVzc2FnZXMuRm9yd2FyZF90b29sVGlwT25lQXJnLCB0ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRnJhbWVMaXN0TWVzc2FnZXMuRm9yd2FyZF90b29sVGlwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxzIDxjb2RlPmZvcndhcmQoKTwvY29kZT4gb24gdGhlIGZyYW1lIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBnZXRGcmFtZUxpc3QoKS5mb3J3YXJkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGlzIGFjdGlvbidzIGVuYWJsZWQgc3RhdGUgYW5kIHRvb2wgdGlwIHRleHQuCi0gICAgICogVGhpcyBhY3Rpb24gaXMgZW5hYmxlZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBuZXh0IGZyYW1lIGluIHRoZSBmcmFtZSBsaXN0LgotICAgICAqIFRoZSB0b29sIHRpcCB0ZXh0IGlzICJGb3J3YXJkIHRvICIgcGx1cyB0aGUgdG9vbCB0aXAgdGV4dCBmb3IgdGhlIG5leHQKLSAgICAgKiBmcmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0gICAgICAgIHN1cGVyLnVwZGF0ZSgpOwotICAgICAgICBGcmFtZSBuZXh0RnJhbWUgPSBnZXROZXh0RnJhbWUoKTsKLSAgICAgICAgc2V0RW5hYmxlZChuZXh0RnJhbWUgIT0gbnVsbCk7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KGdldFRvb2xUaXBUZXh0KG5leHRGcmFtZSkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9GcmFtZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9GcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTc3ZTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuZnJhbWVsaXN0OwotCi0vKioKLSAqIEdlbmVyaWMgZnJhbWUsIHdoaWNoIGNhcHR1cmVzIHRoZSBzdGF0ZSBmb3Igb25lIGZyYW1lIGluIHRoZSBmcmFtZSBsaXN0LgotICogQ2xpZW50cyBtYXkgc3ViY2xhc3MgdGhpcyBmcmFtZSB0byBhZGQgdGhlaXIgb3duIHN0YXRlLgotICovCi1wdWJsaWMgY2xhc3MgRnJhbWUgewotCi0gICAgcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsKLQotICAgIHByaXZhdGUgRnJhbWVMaXN0IHBhcmVudDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9vbFRpcFRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGZyYW1lLiA8cD4KLSAgICAgKiAKLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRnJhbWUoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZyYW1lIGluIHRoZSBmcmFtZSBsaXN0LgotICAgICAqIE9ubHkgdmFsaWQgb25jZSB0aGUgZnJhbWUgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGZyYW1lIGxpc3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZyYW1lIGluIHRoZSBmcmFtZSBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGUgZnJhbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGUgZnJhbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmcmFtZSBsaXN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZyYW1lIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgRnJhbWVMaXN0IGdldFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0b29sIHRpcCB0ZXh0IHRvIHNob3cgZm9yIHRoZSBmcmFtZS4KLSAgICAgKiBUaGlzIGNhbiBmb3JtIHBhcnQgb2YgdGhlIHRvb2wgdGlwIGZvciBhY3Rpb25zIGxpa2UgdGhlIGJhY2sgYW5kIGZvcndhcmQKLSAgICAgKiBhY3Rpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRvb2wgdGlwIHRleHQgdG8gc2hvdyBmb3IgdGhlIGZyYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRvb2xUaXBUZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGluZGV4IG9mIHRoZSBmcmFtZSBpbiB0aGUgZnJhbWUgbGlzdC4KLSAgICAgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIGZyYW1lIGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgZnJhbWUgaW4gdGhlIGZyYW1lIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKLSAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoZSBmcmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZGlzcGxheWFibGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmcmFtZSBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIGZyYW1lIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoRnJhbWVMaXN0IHBhcmVudCkgewotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0b29sIHRpcCB0ZXh0IHRvIHNob3cgZm9yIHRoZSBmcmFtZS4KLSAgICAgKiBUaGlzIGNhbiBmb3JtIHBhcnQgb2YgdGhlIHRvb2wgdGlwIGZvciBhY3Rpb25zIGxpa2UgdGhlIGJhY2sgYW5kIGZvcndhcmQKLSAgICAgKiBhY3Rpb25zLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b29sVGlwVGV4dCB0aGUgdG9vbCB0aXAgdGV4dCB0byBzaG93IGZvciB0aGUgZnJhbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRvb2xUaXBUZXh0KSB7Ci0gICAgICAgIHRoaXMudG9vbFRpcFRleHQgPSB0b29sVGlwVGV4dDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvZnJhbWVsaXN0L0ZyYW1lQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvZnJhbWVsaXN0L0ZyYW1lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YTM0MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9GcmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmZyYW1lbGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgYWN0aW9ucyBkZWFsaW5nIHdpdGggZnJhbWVzIG9yIGEgZnJhbWUgbGlzdC4KLSAqIFRoaXMgbGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUgZnJhbWUgbGlzdCBhbmQgdXBkYXRlcyBpdHNlbGYKLSAqIGFjY29yZGluZ2x5LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRnJhbWVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotICAgIHByaXZhdGUgRnJhbWVMaXN0IGZyYW1lTGlzdDsKLQkKLSAgICBwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIEZyYW1lQWN0aW9uLnRoaXMuaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGZyYW1lIGxpc3QuCi0gICAgICogYW5kIGFkZHMgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgb24gaXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZyYW1lTGlzdCB0aGUgZnJhbWUgbGlzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBGcmFtZUFjdGlvbihGcmFtZUxpc3QgZnJhbWVMaXN0KSB7Ci0gICAgICAgIHRoaXMuZnJhbWVMaXN0ID0gZnJhbWVMaXN0OwotICAgICAgICBmcmFtZUxpc3QuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlcyB0aGlzIGZyYW1lIGFjdGlvbi4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJlbW92ZXMgdGhlIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoZSBmcmFtZSBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGZyYW1lTGlzdC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZyYW1lIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIEZyYW1lTGlzdCBnZXRGcmFtZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBmcmFtZUxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudCBmcm9tIHRoZSBmcmFtZSBsaXN0LgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gY2FsbHMgPGNvZGU+dXBkYXRlKCk8L2NvZGU+LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGlzIGFjdGlvbi4gIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICAgICAqIE1vc3QgaW1wbGVtZW50YXRpb25zIHdpbGwgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9GcmFtZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvRnJhbWVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjJhMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9GcmFtZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuZnJhbWVsaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkV2ZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBTdXBwb3J0cyBhIHdlYi1icm93c2VyIHN0eWxlIG9mIG5hdmlnYXRpb24gYnkgbWFpbnRhaW5pbmcgYSBsaXN0Ci0gKiBvZiBmcmFtZXMuICBFYWNoIGZyYW1lIGhvbGRzIGEgc25hcHNob3Qgb2YgYSB2aWV3IGF0IHNvbWUgcG9pbnQgCi0gKiBpbiB0aW1lLgotICogPHA+Ci0gKiBUaGUgZnJhbWUgbGlzdCBvYnRhaW5zIGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgZnJhbWUgZnJvbSBhIGZyYW1lIHNvdXJjZQotICogb24gY3JlYXRpb24sIGFuZCB3aGVuZXZlciBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgZnJhbWUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEEgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW5ldmVyIHRoZSBjdXJyZW50IHBhZ2UgY2hhbmdlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEZyYW1lTGlzdCBleHRlbmRzIEV2ZW50TWFuYWdlciB7Ci0KLSAgICAvKiogUHJvcGVydHkgbmFtZSBjb25zdGFudCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9DVVJSRU5UX0ZSQU1FID0gImN1cnJlbnRGcmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgSUZyYW1lU291cmNlIHNvdXJjZTsKLQotICAgIHByaXZhdGUgTGlzdCBmcmFtZXM7Ci0KLSAgICBwcml2YXRlIGludCBjdXJyZW50OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmcmFtZSBsaXN0IHdpdGggdGhlIGdpdmVuIHNvdXJjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIGZyYW1lIHNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBGcmFtZUxpc3QoSUZyYW1lU291cmNlIHNvdXJjZSkgewotICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLSAgICAgICAgRnJhbWUgZnJhbWUgPSBzb3VyY2UuZ2V0RnJhbWUoSUZyYW1lU291cmNlLkNVUlJFTlRfRlJBTUUsIDApOwotICAgICAgICBmcmFtZS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIGZyYW1lLnNldEluZGV4KDApOwotICAgICAgICBmcmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZyYW1lcy5hZGQoZnJhbWUpOwotICAgICAgICBjdXJyZW50ID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyLgotICAgICAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAJYWRkTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBmcmFtZSBwb2ludGVyIGJhY2sgYnkgb25lLgotICAgICAqIEhhcyBubyBlZmZlY3QgaWYgdGhlcmUgaXMgbm8gZnJhbWUgYmVmb3JlIHRoZSBjdXJyZW50IG9uZS4KLSAgICAgKiBGaXJlcyBhIDxjb2RlPlBfQ1VSUkVOVF9GUkFNRTwvY29kZT4gcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJhY2soKSB7Ci0gICAgICAgIGlmIChjdXJyZW50ID4gMCkgewotICAgICAgICAgICAgc2V0Q3VycmVudChjdXJyZW50IC0gMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyBhbnkgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyB0aGF0IGEgcHJvcGVydHkgaGFzIGNoYW5nZWQuCi0gICAgICogT25seSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQKLSAgICAgKgotICAgICAqIEBzZWUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICgoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGZyYW1lIHBvaW50ZXIgZm9yd2FyZCBieSBvbmUuCi0gICAgICogSGFzIG5vIGVmZmVjdCBpZiB0aGVyZSBpcyBubyBmcmFtZSBhZnRlciB0aGUgY3VycmVudCBvbmUuCi0gICAgICogRmlyZXMgYSA8Y29kZT5QX0NVUlJFTlRfRlJBTUU8L2NvZGU+IHByb3BlcnR5IGNoYW5nZSBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmb3J3YXJkKCkgewotICAgICAgICBpZiAoY3VycmVudCA8IGZyYW1lcy5zaXplKCkgLSAxKSB7Ci0gICAgICAgICAgICBzZXRDdXJyZW50KGN1cnJlbnQgKyAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZnJhbWUuCi0gICAgICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGZyYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBmcmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgRnJhbWUgZ2V0Q3VycmVudEZyYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0RnJhbWUoY3VycmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgZnJhbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBmcmFtZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEluZGV4KCkgewotICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmcmFtZSBhdCB0aGUgZ2l2ZW4gaW5kZXgsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgdGhlIGluZGV4IGlzICZsZTsgMCBvciAmZ2U7IDxjb2RlPnNpemUoKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0ZWQgZnJhbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBmcmFtZSBhdCB0aGUgZ2l2ZW4gaW5kZXggb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgRnJhbWUgZ2V0RnJhbWUoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gZnJhbWVzLnNpemUoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKEZyYW1lKSBmcmFtZXMuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmcmFtZSBzb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIElGcmFtZVNvdXJjZSBnZXRTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gZnJhbWUgYWZ0ZXIgdGhlIGN1cnJlbnQgZnJhbWUsCi0gICAgICogYW5kIGFkdmFuY2VzIHRoZSBwb2ludGVyIHRvIHRoZSBuZXcgZnJhbWUuCi0gICAgICogQmVmb3JlIGRvaW5nIHNvLCB1cGRhdGVzIHRoZSBjdXJyZW50IGZyYW1lLCBhbmQgcmVtb3ZlcyBhbnkgZnJhbWVzIGZvbGxvd2luZyB0aGUgY3VycmVudCBmcmFtZS4KLSAgICAgKiBGaXJlcyBhIDxjb2RlPlBfQ1VSUkVOVF9GUkFNRTwvY29kZT4gcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGZyYW1lIHRoZSBmcmFtZSB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnb3RvRnJhbWUoRnJhbWUgZnJhbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IGZyYW1lcy5zaXplKCk7IC0taSA+IGN1cnJlbnQ7KSB7Ci0gICAgICAgICAgICBmcmFtZXMucmVtb3ZlKGkpOwotICAgICAgICB9Ci0gICAgICAgIGZyYW1lLnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgaW50IGluZGV4ID0gZnJhbWVzLnNpemUoKTsKLSAgICAgICAgZnJhbWUuc2V0SW5kZXgoaW5kZXgpOwotICAgICAgICBmcmFtZXMuYWRkKGZyYW1lKTsKLSAgICAgICAgc2V0Q3VycmVudChpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lci4KLSAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcmVtb3ZlTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgZnJhbWUgdG8gdGhlIG9uZSB3aXRoIHRoZSBnaXZlbiBpbmRleC4KLSAgICAgKiBVcGRhdGVzIHRoZSBvbGQgY3VycmVudCBmcmFtZSwgYW5kIGZpcmVzIGEgPGNvZGU+UF9DVVJSRU5UX0ZSQU1FPC9jb2RlPiBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQKLSAgICAgKiBpZiB0aGUgY3VycmVudCBmcmFtZSBjaGFuZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld0N1cnJlbnQgdGhlIGluZGV4IG9mIHRoZSBmcmFtZQotICAgICAqLwotICAgIHZvaWQgc2V0Q3VycmVudChpbnQgbmV3Q3VycmVudCkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKG5ld0N1cnJlbnQgPj0gMCAmJiBuZXdDdXJyZW50IDwgZnJhbWVzLnNpemUoKSk7Ci0gICAgICAgIGludCBvbGRDdXJyZW50ID0gdGhpcy5jdXJyZW50OwotICAgICAgICBpZiAob2xkQ3VycmVudCAhPSBuZXdDdXJyZW50KSB7Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50RnJhbWUoKTsKLSAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IG5ld0N1cnJlbnQ7Ci0gICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgUF9DVVJSRU5UX0ZSQU1FLAotICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZShvbGRDdXJyZW50KSwgZ2V0RnJhbWUobmV3Q3VycmVudCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgZnJhbWUgdG8gdGhlIGZyYW1lIHdpdGggdGhlIGdpdmVuIGluZGV4LgotICAgICAqIEZpcmVzIGEgPGNvZGU+UF9DVVJSRU5UX0ZSQU1FPC9jb2RlPiBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQKLSAgICAgKiBpZiB0aGUgY3VycmVudCBmcmFtZSBjaGFuZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRJbmRleChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ICE9IGN1cnJlbnQpCi0gICAgICAgICAgICBzZXRDdXJyZW50KGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBmcmFtZSBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGZyYW1lcy5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgZnJhbWUgaW4gdGhpcyBsaXN0IHdpdGggdGhlIGN1cnJlbnQgZnJhbWUgCi0gICAgICogZnJvbSB0aGUgZnJhbWUgc291cmNlLiAgTm8gZXZlbnQgaXMgZmlyZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQ3VycmVudEZyYW1lKCkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKGN1cnJlbnQgPj0gMCk7Ci0gICAgICAgIEZyYW1lIGZyYW1lID0gc291cmNlLmdldEZyYW1lKElGcmFtZVNvdXJjZS5DVVJSRU5UX0ZSQU1FLAotICAgICAgICAgICAgICAgIElGcmFtZVNvdXJjZS5GVUxMX0NPTlRFWFQpOwotICAgICAgICBmcmFtZS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIGZyYW1lLnNldEluZGV4KGN1cnJlbnQpOwotICAgICAgICBmcmFtZXMuc2V0KGN1cnJlbnQsIGZyYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvZnJhbWVsaXN0L0ZyYW1lTGlzdE1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvZnJhbWVsaXN0L0ZyYW1lTGlzdE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNmQ2YjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9GcmFtZUxpc3RNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmZyYW1lbGlzdDsKLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2hpY2ggaGVscHMgd2l0aCBtYW5hZ2luZyBtZXNzYWdlcy4KLSAqIEBkZXByZWNhdGVkIFRoZXNlIG1lc3NhZ2VzIGFyZSBub3QgQVBJIGFuZCBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQKLSAqIG91dHNpZGUgb2YgdGhpcyBwbHVnLWluLgotICovCi1jbGFzcyBGcmFtZUxpc3RNZXNzYWdlcyB7Ci0KLSAgICBwcml2YXRlIEZyYW1lTGlzdE1lc3NhZ2VzKCkgewotICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24gb2YgY2xhc3MKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIGtleSBpbgotICAgICAqIHRoZSByZXNvdXJjZSBidW5kbGUuIAotICAgICAqCi0gICAgICogQHBhcmFtIGtleSB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqIEBwYXJhbSBhcmdzIHRoZSBtZXNzYWdlIGFyZ3VtZW50cwotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugb2JqZWN0IHdpdGggdGhlIGdpdmVuIGtleSBpbgotICAgICAqIHRoZSByZXNvdXJjZSBidW5kbGUuIElmIHRoZXJlIGlzbid0IGFueSB2YWx1ZSB1bmRlcgotICAgICAqIHRoZSBnaXZlbiBrZXksIHRoZSBrZXkgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLSAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9Hb0ludG9BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvR29JbnRvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MDQzYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9Hb0ludG9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5mcmFtZWxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLmZyYW1lbGlzdC5GcmFtZUxpc3RNZXNzYWdlczsKLQotLyoqCi0gKiBHZW5lcmljICJHbyBJbnRvIiBhY3Rpb24gd2hpY2ggZ29lcyB0byB0aGUgZnJhbWUgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gCi0gKi8KLXB1YmxpYyBjbGFzcyBHb0ludG9BY3Rpb24gZXh0ZW5kcyBGcmFtZUFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZSBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBmcmFtZUxpc3QgdGhlIGZyYW1lIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgR29JbnRvQWN0aW9uKEZyYW1lTGlzdCBmcmFtZUxpc3QpIHsKLSAgICAgICAgc3VwZXIoZnJhbWVMaXN0KTsKLSAgICAgICAgc2V0VGV4dChGcmFtZUxpc3RNZXNzYWdlcy5Hb0ludG9fdGV4dCk7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KEZyYW1lTGlzdE1lc3NhZ2VzLkdvSW50b190b29sVGlwKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCUlGcmFtZUxpc3RIZWxwQ29udGV4dElkcy5HT19JTlRPX0FDVElPTik7Ci0gICAgICAgIHVwZGF0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRnJhbWUgZ2V0U2VsZWN0aW9uRnJhbWUoaW50IGZsYWdzKSB7Ci0gICAgICAgIHJldHVybiBnZXRGcmFtZUxpc3QoKS5nZXRTb3VyY2UoKS5nZXRGcmFtZSgKLSAgICAgICAgICAgICAgICBJRnJhbWVTb3VyY2UuU0VMRUNUSU9OX0ZSQU1FLCBmbGFncyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMgPGNvZGU+Z290b0ZyYW1lPC9jb2RlPiBvbiB0aGUgZnJhbWUgbGlzdCB3aXRoIGEgZnJhbWUKLSAgICAgKiByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb250YWluZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBGcmFtZSBzZWxlY3Rpb25GcmFtZSA9IGdldFNlbGVjdGlvbkZyYW1lKElGcmFtZVNvdXJjZS5GVUxMX0NPTlRFWFQpOwotICAgICAgICBpZiAoc2VsZWN0aW9uRnJhbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0RnJhbWVMaXN0KCkuZ290b0ZyYW1lKHNlbGVjdGlvbkZyYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhpcyBhY3Rpb24ncyBlbmFibGVkIHN0YXRlLgotICAgICAqIFRoaXMgYWN0aW9uIGlzIGVuYWJsZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgZnJhbWUgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0gICAgICAgIHN1cGVyLnVwZGF0ZSgpOwotICAgICAgICBGcmFtZSBzZWxlY3Rpb25GcmFtZSA9IGdldFNlbGVjdGlvbkZyYW1lKDApOwotICAgICAgICBzZXRFbmFibGVkKHNlbGVjdGlvbkZyYW1lICE9IG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvSUZyYW1lTGlzdEhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvZnJhbWVsaXN0L0lGcmFtZUxpc3RIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFmNzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvSUZyYW1lTGlzdEhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuZnJhbWVsaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgZnJhbWUgbGlzdC4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZAotICogb3IgZXh0ZW5kZWQuCi0gKiA8L3A+Ci0gKiAKLSAqLwotLypwYWNrYWdlKi9pbnRlcmZhY2UgSUZyYW1lTGlzdEhlbHBDb250ZXh0SWRzIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBQbGF0Zm9ybVVJLlBMVUdJTl9JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gQWN0aW9ucwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tfQUNUSU9OID0gUFJFRklYICsgImJhY2tfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiZm9yd2FyZF9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdPX0lOVE9fQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJnb19pbnRvX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBfQUNUSU9OID0gUFJFRklYICsgInVwX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9JRnJhbWVTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvSUZyYW1lU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMzc4ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9JRnJhbWVTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5mcmFtZWxpc3Q7Ci0KLS8qKgotICogQSBmcmFtZSBzb3VyY2UgaXMgdGhlIHNvdXJjZSBvZiBmcmFtZXMgd2hpY2ggYXBwZWFyIGluIGEgZnJhbWUgbGlzdC4KLSAqIFRoZSBmcmFtZSBsaXN0IGFza3MgZm9yIHRoZSBjdXJyZW50IGZyYW1lIHdoZW5ldmVyIGl0IHN3aXRjaGVzCi0gKiB0byBhbm90aGVyIGZyYW1lLCBzbyB0aGF0IHRoZSBjb250ZXh0IGNhbiBiZSByZXN0b3JlZCB3aGVuIHRoZQotICogZnJhbWUgYmVjb21lcyBjdXJyZW50IGFnYWluLgotICoKLSAqIEBzZWUgRnJhbWVMaXN0Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZyYW1lU291cmNlIHsKLQotICAgIC8qKgotICAgICAqIEZyYW1lIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIGN1cnJlbnQgZnJhbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSUkVOVF9GUkFNRSA9IDB4MDAwMTsKLQotICAgIC8qKgotICAgICAqIEZyYW1lIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIGZyYW1lIGZvciB0aGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9GUkFNRSA9IDB4MDAwMjsKLQotICAgIC8qKgotICAgICAqIEZyYW1lIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHBhcmVudCBmcmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJFTlRfRlJBTUUgPSAweDAwMDM7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgZnVsbCBjb250ZXh0IHNob3VsZCBiZSBjYXB0dXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVUxMX0NPTlRFWFQgPSAweDAwMDE7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IGZyYW1lIGRlc2NyaWJpbmcgdGhlIHN0YXRlIG9mIHRoZSBzb3VyY2UuCi0gICAgICogSWYgdGhlIDxjb2RlPkZVTExfQ09OVEVYVDwvY29kZT4gZmxhZyBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGZ1bGwKLSAgICAgKiBjb250ZXh0IG9mIHRoZSBzb3VyY2Ugc2hvdWxkIGJlIGNhcHR1cmVkIGJ5IHRoZSBmcmFtZS4KLSAgICAgKiBPdGhlcndpc2UsIG9ubHkgdGhlIHZpc2libGUgYXNwZWN0cyBvZiB0aGUgZnJhbWUsIHN1Y2ggYXMgdGhlIG5hbWUgYW5kIHRvb2wgdGlwIHRleHQsCi0gICAgICogd2lsbCBiZSB1c2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHdoaWNoRnJhbWUgb25lIG9mIHRoZSBmcmFtZSBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZQotICAgICAqIEBwYXJhbSBmbGFncyBhIGJpdC13aXNlIE9SIG9mIHRoZSBmbGFnIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlCi0gICAgICogQHJldHVybiBhIG5ldyBmcmFtZSBkZXNjcmliaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRnJhbWUgZ2V0RnJhbWUoaW50IHdoaWNoRnJhbWUsIGludCBmbGFncyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvZnJhbWVsaXN0L1RyZWVGcmFtZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9UcmVlRnJhbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2OWJlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvZnJhbWVsaXN0L1RyZWVGcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5mcmFtZWxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBGcmFtZSBmb3IgdHJlZSB2aWV3ZXJzLiAgVGhpcyBjYXB0dXJlIHRoZSB2aWV3ZXIncyBpbnB1dCBlbGVtZW50LCBzZWxlY3Rpb24sCi0gKiBhbmQgZXhwYW5kZWQgZWxlbWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlRnJhbWUgZXh0ZW5kcyBGcmFtZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TRUxFQ1RJT04gPSAic2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19FWFBBTkRFRCA9ICJleHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRUxFTUVOVCA9ICJlbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19GUkFNRV9JTlBVVCA9ICJmcmFtZUlucHV0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19GQUNUT1JZX0lEID0gImZhY3RvcnlJRCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlcjsKLQotICAgIHByaXZhdGUgT2JqZWN0IGlucHV0OwotCi0gICAgcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICAgIHByaXZhdGUgT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50czsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBmcmFtZSBmb3IgdGhlIHNwZWNpZmllZCB0cmVlIHZpZXdlci4KLSAgICAgKiBUaGUgZnJhbWUncyBpbnB1dCwgbmFtZSBhbmQgdG9vbCB0aXAgdGV4dCBhcmUgbm90IHNldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmlld2VyIHRoZSB0cmVlIHZpZXdlcgotICAgICAqLwotICAgIHB1YmxpYyBUcmVlRnJhbWUoQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlcikgewotICAgICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgZnJhbWUgZm9yIHRoZSBzcGVjaWZpZWQgdHJlZSB2aWV3ZXIuCi0gICAgICogVGhlIGZyYW1lJ3MgaW5wdXQgZWxlbWVudCBpcyBzZXQgdG8gdGhlIHNwZWNpZmllZCBpbnB1dCBlbGVtZW50LgotICAgICAqIFRoZSBmcmFtZSdzIG5hbWUgYW5kIHRvb2wgdGlwIHRleHQgYXJlIHNldCB0byB0aGUgdGV4dCBmb3IgdGhlIGlucHV0IAotICAgICAqIGVsZW1lbnQsIGFzIHByb3ZpZGVkIGJ5IHRoZSB2aWV3ZXIncyBsYWJlbCBwcm92aWRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmlld2VyIHRoZSB0cmVlIHZpZXdlcgotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBUcmVlRnJhbWUoQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlciwgT2JqZWN0IGlucHV0KSB7Ci0gICAgICAgIHRoaXModmlld2VyKTsKLSAgICAgICAgc2V0SW5wdXQoaW5wdXQpOwotICAgICAgICBJTGFiZWxQcm92aWRlciBwcm92aWRlciA9IChJTGFiZWxQcm92aWRlcikgdmlld2VyLmdldExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm92aWRlci5nZXRUZXh0KGlucHV0KTsKLSAgICAgICAgaWYobmFtZSA9PSBudWxsKQotICAgICAgICAJbmFtZSA9ICIiOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXhwYW5kZWQgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZXhwYW5kZWQgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RXhwYW5kZWRFbGVtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIGV4cGFuZGVkRWxlbWVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5wdXQgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKLSAgICAgICAgcmV0dXJuIGlucHV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHJlZSB2aWV3ZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHJlZSB2aWV3ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RUcmVlVmlld2VyIGdldFZpZXdlcigpIHsKLSAgICAgICAgcmV0dXJuIHZpZXdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlIElQZXJzaXN0YWJsZUVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBtZW1lbnRvLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZW1lbnRvIG1lbWVudG8gdG8gcmVzdG9yZSBlbGVtZW50cyBmcm9tCi0gICAgICogQHJldHVybiBsaXN0IG9mIHJlc3RvcmVkIGVsZW1lbnRzLiBNYXkgYmUgZW1wdHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IHJlc3RvcmVFbGVtZW50cyhJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIElNZW1lbnRvW10gZWxlbWVudE1lbSA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oVEFHX0VMRU1FTlQpOwotICAgICAgICBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChlbGVtZW50TWVtLmxlbmd0aCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50TWVtLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmFjdG9yeUlEID0gZWxlbWVudE1lbVtpXS5nZXRTdHJpbmcoVEFHX0ZBQ1RPUllfSUQpOwotICAgICAgICAgICAgaWYgKGZhY3RvcnlJRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUVsZW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudEZhY3RvcnkoZmFjdG9yeUlEKTsKLSAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQoZmFjdG9yeS5jcmVhdGVFbGVtZW50KGVsZW1lbnRNZW1baV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbWVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZSB0aGUgZnJhbWUgZnJvbSB0aGUgc3BlY2lmaWVkIG1lbWVudG8uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lbWVudG8gbWVtZW50byB0byByZXN0b3JlIGZyYW1lIGZyb20KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotICAgICAgICBJTWVtZW50byBjaGlsZE1lbSA9IG1lbWVudG8uZ2V0Q2hpbGQoVEFHX0ZSQU1FX0lOUFVUKTsKLQotICAgICAgICBpZiAoY2hpbGRNZW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTdHJpbmcgZmFjdG9yeUlEID0gY2hpbGRNZW0uZ2V0U3RyaW5nKFRBR19GQUNUT1JZX0lEKTsKLSAgICAgICAgSUFkYXB0YWJsZSBmcmFtZUlucHV0ID0gbnVsbDsKLSAgICAgICAgaWYgKGZhY3RvcnlJRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJRWxlbWVudEZhY3RvcnkgZmFjdG9yeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRGYWN0b3J5KGZhY3RvcnlJRCk7Ci0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGZyYW1lSW5wdXQgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQoY2hpbGRNZW0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmcmFtZUlucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlucHV0ID0gZnJhbWVJbnB1dDsKLSAgICAgICAgfQotICAgICAgICBJTWVtZW50byBleHBhbmRlZE1lbSA9IG1lbWVudG8uZ2V0Q2hpbGQoVEFHX0VYUEFOREVEKTsKLSAgICAgICAgaWYgKGV4cGFuZGVkTWVtICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3QgZWxlbWVudHMgPSByZXN0b3JlRWxlbWVudHMoZXhwYW5kZWRNZW0pOwotICAgICAgICAgICAgZXhwYW5kZWRFbGVtZW50cyA9IGVsZW1lbnRzLnRvQXJyYXkobmV3IE9iamVjdFtlbGVtZW50cy5zaXplKCldKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV4cGFuZGVkRWxlbWVudHMgPSBuZXcgT2JqZWN0WzBdOwotICAgICAgICB9Ci0gICAgICAgIElNZW1lbnRvIHNlbGVjdGlvbk1lbSA9IG1lbWVudG8uZ2V0Q2hpbGQoVEFHX1NFTEVDVElPTik7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25NZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdCBlbGVtZW50cyA9IHJlc3RvcmVFbGVtZW50cyhzZWxlY3Rpb25NZW0pOwotICAgICAgICAgICAgc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgdGhlIHNwZWNpZmllZCBlbGVtZW50cyB0byB0aGUgZ2l2ZW4gbWVtZW50by4KLSAgICAgKiBUaGUgZWxlbWVudHMgaGF2ZSB0byBiZSBhZGFwdGFibGUgdG8gSVBlcnNpc3RhYmxlRWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudHMgZWxlbWVudHMgdG8gcGVyc2lzdAotICAgICAqIEBwYXJhbSBtZW1lbnRvIG1lbWVudG8gdG8gcGVyc2lzdCBlbGVtZW50cyBpbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzYXZlRWxlbWVudHMoT2JqZWN0W10gZWxlbWVudHMsIElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgICAgIElQZXJzaXN0YWJsZUVsZW1lbnQgcGVyc2lzdGFibGUgPSAoSVBlcnNpc3RhYmxlRWxlbWVudCkgKChJQWRhcHRhYmxlKSBlbGVtZW50c1tpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElQZXJzaXN0YWJsZUVsZW1lbnQuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmIChwZXJzaXN0YWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIElNZW1lbnRvIGVsZW1lbnRNZW0gPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKFRBR19FTEVNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudE1lbS5wdXRTdHJpbmcoVEFHX0ZBQ1RPUllfSUQsIHBlcnNpc3RhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZhY3RvcnlJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGFibGUuc2F2ZVN0YXRlKGVsZW1lbnRNZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgdGhlIGZyYW1lIHN0YXRlIGluIHRoZSBnaXZlbiBtZW1lbnRvLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZW1lbnRvIG1lbWVudG8gdG8gcGVyc2lzdCB0aGUgZnJhbWUgc3RhdGUgaW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBJUGVyc2lzdGFibGVFbGVtZW50IHBlcnNpc3RhYmxlID0gKElQZXJzaXN0YWJsZUVsZW1lbnQpICgoSUFkYXB0YWJsZSkgaW5wdXQpCi0gICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVBlcnNpc3RhYmxlRWxlbWVudC5jbGFzcyk7Ci0gICAgICAgIGlmIChwZXJzaXN0YWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJTWVtZW50byBmcmFtZU1lbWVudG8gPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKFRBR19GUkFNRV9JTlBVVCk7Ci0KLSAgICAgICAgICAgIGZyYW1lTWVtZW50by5wdXRTdHJpbmcoVEFHX0ZBQ1RPUllfSUQsIHBlcnNpc3RhYmxlLmdldEZhY3RvcnlJZCgpKTsKLSAgICAgICAgICAgIHBlcnNpc3RhYmxlLnNhdmVTdGF0ZShmcmFtZU1lbWVudG8pOwotCi0gICAgICAgICAgICBpZiAoZXhwYW5kZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgSU1lbWVudG8gZXhwYW5kZWRNZW0gPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKFRBR19FWFBBTkRFRCk7Ci0gICAgICAgICAgICAgICAgc2F2ZUVsZW1lbnRzKGV4cGFuZGVkRWxlbWVudHMsIGV4cGFuZGVkTWVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGFsd2F5cyBJU3RydWN0dXJlZFNlbGVjdGlvbiBzaW5jZSB3ZSBvbmx5IGRlYWwgd2l0aCB0cmVlIHZpZXdlcnMKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgIE9iamVjdFtdIGVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBJTWVtZW50byBzZWxlY3Rpb25NZW0gPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKFRBR19TRUxFQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICBzYXZlRWxlbWVudHMoZWxlbWVudHMsIHNlbGVjdGlvbk1lbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW5wdXQgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLSAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV4cGFuZGVkIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBleHBhbmRlZEVsZW1lbnRzIHRoZSBleHBhbmRlZCBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4cGFuZGVkRWxlbWVudHMoT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cykgewotICAgICAgICB0aGlzLmV4cGFuZGVkRWxlbWVudHMgPSBleHBhbmRlZEVsZW1lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9UcmVlVmlld2VyRnJhbWVTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvVHJlZVZpZXdlckZyYW1lU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzA2N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9UcmVlVmlld2VyRnJhbWVTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuZnJhbWVsaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotCi0vKiogCi0gKiBGcmFtZSBzb3VyY2UgZm9yIHRyZWUgdmlld2Vycywgd2hpY2ggdXNlcyA8Y29kZT5UcmVlRnJhbWU8L2NvZGU+IHRvIGNhcHR1cmUKLSAqIHRoZSBzdGF0ZSBvZiB0aGUgdHJlZSB2aWV3ZXIuCi0gKiAKLSAqIEBzZWUgVHJlZUZyYW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlVmlld2VyRnJhbWVTb3VyY2UgaW1wbGVtZW50cyBJRnJhbWVTb3VyY2UgewotCi0gICAgcHJpdmF0ZSBBYnN0cmFjdFRyZWVWaWV3ZXIgdmlld2VyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB0cmVlIHZpZXdlciBmcmFtZSBzb3VyY2UgZm9yIHRoZSBzcGVjaWZpZWQgdHJlZSB2aWV3ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZpZXdlciB0aGUgdHJlZSB2aWV3ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJlZVZpZXdlckZyYW1lU291cmNlKEFic3RyYWN0VHJlZVZpZXdlciB2aWV3ZXIpIHsKLSAgICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29ubmVjdHMgdGhpcyBzb3VyY2UgYXMgYSBsaXN0ZW5lciBvbiB0aGUgZnJhbWUgbGlzdCwKLSAgICAgKiBzbyB0aGF0IHdoZW4gdGhlIGN1cnJlbnQgZnJhbWUgY2hhbmdlcywgdGhlIHZpZXdlciBpcyB1cGRhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbm5lY3RUbyhGcmFtZUxpc3QgZnJhbWVMaXN0KSB7Ci0gICAgICAgIGZyYW1lTGlzdC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBUcmVlVmlld2VyRnJhbWVTb3VyY2UudGhpcy5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgdHJlZSBmcmFtZSBjYXB0dXJpbmcgdGhlIHNwZWNpZmllZCBpbnB1dCBlbGVtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgZWxlbWVudAotICAgICAqIEByZXR1cm4gdGhlIHRyZWUgZnJhbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJlZUZyYW1lIGNyZWF0ZUZyYW1lKE9iamVjdCBpbnB1dCkgewotICAgICAgICByZXR1cm4gbmV3IFRyZWVGcmFtZSh2aWV3ZXIsIGlucHV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2aWV3ZXIgaW4gcmVzcG9uc2UgdG8gdGhlIGN1cnJlbnQgZnJhbWUgY2hhbmdpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZyYW1lIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBjdXJyZW50IGZyYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZnJhbWVDaGFuZ2VkKFRyZWVGcmFtZSBmcmFtZSkgewotICAgICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0gICAgICAgIHZpZXdlci5zZXRJbnB1dChmcmFtZS5nZXRJbnB1dCgpKTsKLSAgICAgICAgdmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMoZnJhbWUuZ2V0RXhwYW5kZWRFbGVtZW50cygpKTsKLSAgICAgICAgdmlld2VyLnNldFNlbGVjdGlvbihmcmFtZS5nZXRTZWxlY3Rpb24oKSwgdHJ1ZSk7Ci0gICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZnJhbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZsYWdzIGEgYml0LXdpc2UgT1Igb2YgdGhlIGZyYW1lIHNvdXJjZSBmbGFnIGNvbnN0YW50cwotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgZnJhbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRnJhbWUgZ2V0Q3VycmVudEZyYW1lKGludCBmbGFncykgewotICAgICAgICBPYmplY3QgaW5wdXQgPSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLSAgICAgICAgVHJlZUZyYW1lIGZyYW1lID0gY3JlYXRlRnJhbWUoaW5wdXQpOwotICAgICAgICBpZiAoKGZsYWdzICYgSUZyYW1lU291cmNlLkZVTExfQ09OVEVYVCkgIT0gMCkgewotICAgICAgICAgICAgZnJhbWUuc2V0U2VsZWN0aW9uKHZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICBmcmFtZS5zZXRFeHBhbmRlZEVsZW1lbnRzKHZpZXdlci5nZXRFeHBhbmRlZEVsZW1lbnRzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmcmFtZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElGcmFtZVNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRnJhbWUgZ2V0RnJhbWUoaW50IHdoaWNoRnJhbWUsIGludCBmbGFncykgewotICAgICAgICBzd2l0Y2ggKHdoaWNoRnJhbWUpIHsKLSAgICAgICAgY2FzZSBJRnJhbWVTb3VyY2UuQ1VSUkVOVF9GUkFNRToKLSAgICAgICAgICAgIHJldHVybiBnZXRDdXJyZW50RnJhbWUoZmxhZ3MpOwotICAgICAgICBjYXNlIElGcmFtZVNvdXJjZS5QQVJFTlRfRlJBTUU6Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50RnJhbWUoZmxhZ3MpOwotICAgICAgICBjYXNlIElGcmFtZVNvdXJjZS5TRUxFQ1RJT05fRlJBTUU6Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2VsZWN0aW9uRnJhbWUoZmxhZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZnJhbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHBhcmVudCBmcmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmxhZ3MgYSBiaXQtd2lzZSBPUiBvZiB0aGUgZnJhbWUgc291cmNlIGZsYWcgY29uc3RhbnRzCi0gICAgICogQHJldHVybiB0aGUgcGFyZW50IGZyYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCBGcmFtZSBnZXRQYXJlbnRGcmFtZShpbnQgZmxhZ3MpIHsKLSAgICAgICAgT2JqZWN0IGlucHV0ID0gdmlld2VyLmdldElucHV0KCk7Ci0gICAgICAgIElUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSB2aWV3ZXIKLSAgICAgICAgICAgICAgICAuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0gICAgICAgIE9iamVjdCBwYXJlbnQgPSBwcm92aWRlci5nZXRQYXJlbnQoaW5wdXQpOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVHJlZUZyYW1lIGZyYW1lID0gY3JlYXRlRnJhbWUocGFyZW50KTsKLSAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJRnJhbWVTb3VyY2UuRlVMTF9DT05URVhUKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWUuc2V0U2VsZWN0aW9uKHZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgLy8gaW5jbHVkZSBjdXJyZW50IGlucHV0IGluIGV4cGFuZGVkIHNldAotICAgICAgICAgICAgICAgIE9iamVjdFtdIGV4cGFuZGVkID0gdmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBuZXdFeHBhbmRlZCA9IG5ldyBPYmplY3RbZXhwYW5kZWQubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShleHBhbmRlZCwgMCwgbmV3RXhwYW5kZWQsIDAsIGV4cGFuZGVkLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbmV3RXhwYW5kZWRbbmV3RXhwYW5kZWQubGVuZ3RoIC0gMV0gPSBpbnB1dDsKLSAgICAgICAgICAgICAgICBmcmFtZS5zZXRFeHBhbmRlZEVsZW1lbnRzKG5ld0V4cGFuZGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmcmFtZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZyYW1lIGZvciB0aGUgc2VsZWN0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotICAgICAqIGZyYW1lIGZvciB0aGUgc2VsZWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmbGFncyBhIGJpdC13aXNlIE9SIG9mIHRoZSBmcmFtZSBzb3VyY2UgZmxhZyBjb25zdGFudHMKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24gZnJhbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEZyYW1lIGdldFNlbGVjdGlvbkZyYW1lKGludCBmbGFncykgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKHNlbC5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAodmlld2VyLmlzRXhwYW5kYWJsZShvKSkgewotICAgICAgICAgICAgICAgIFRyZWVGcmFtZSBmcmFtZSA9IGNyZWF0ZUZyYW1lKG8pOwotICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJRnJhbWVTb3VyY2UuRlVMTF9DT05URVhUKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1lLnNldFNlbGVjdGlvbih2aWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBmcmFtZS5zZXRFeHBhbmRlZEVsZW1lbnRzKHZpZXdlci5nZXRFeHBhbmRlZEVsZW1lbnRzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHJlZSB2aWV3ZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHJlZSB2aWV3ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RUcmVlVmlld2VyIGdldFZpZXdlcigpIHsKLSAgICAgICAgcmV0dXJuIHZpZXdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGZyb20gdGhlIGZyYW1lIGxpc3QuCi0gICAgICogQ2FsbHMgPGNvZGU+ZnJhbWVDaGFuZ2VkPC9jb2RlPiB3aGVuIHRoZSBjdXJyZW50IGZyYW1lIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICBpZiAoRnJhbWVMaXN0LlBfQ1VSUkVOVF9GUkFNRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpIHsKLSAgICAgICAgICAgIGZyYW1lQ2hhbmdlZCgoVHJlZUZyYW1lKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvVXBBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9mcmFtZWxpc3QvVXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1MGQ2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvZnJhbWVsaXN0L1VwQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuZnJhbWVsaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MuZnJhbWVsaXN0LkZyYW1lTGlzdE1lc3NhZ2VzOwotCi0vKioKLSAqIEdlbmVyaWMgIlVwIiBhY3Rpb24gd2hpY2ggZ29lcyB0byB0aGUgcGFyZW50IGZyYW1lIGZvciB0aGUgY3VycmVudCBmcmFtZS4KLSAqLwotcHVibGljIGNsYXNzIFVwQWN0aW9uIGV4dGVuZHMgRnJhbWVBY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgZnJhbWUgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJhbWVMaXN0IHRoZSBmcmFtZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIFVwQWN0aW9uKEZyYW1lTGlzdCBmcmFtZUxpc3QpIHsKLSAgICAgICAgc3VwZXIoZnJhbWVMaXN0KTsKLSAgICAgICAgc2V0VGV4dChGcmFtZUxpc3RNZXNzYWdlcy5VcF90ZXh0KTsKLSAgICAgICAgSVNoYXJlZEltYWdlcyBpbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1VQKSk7Ci0gICAgICAgIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGltYWdlcwotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VUF9ESVNBQkxFRCkpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJSUZyYW1lTGlzdEhlbHBDb250ZXh0SWRzLlVQX0FDVElPTik7Ci0gICAgICAgIHVwZGF0ZSgpOwotICAgIH0KLQotICAgIEZyYW1lIGdldFBhcmVudEZyYW1lKGludCBmbGFncykgewotICAgICAgICByZXR1cm4gZ2V0RnJhbWVMaXN0KCkuZ2V0U291cmNlKCkuZ2V0RnJhbWUoSUZyYW1lU291cmNlLlBBUkVOVF9GUkFNRSwKLSAgICAgICAgICAgICAgICBmbGFncyk7Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldFRvb2xUaXBUZXh0KEZyYW1lIHBhcmVudEZyYW1lKSB7Ci0gICAgICAgIGlmIChwYXJlbnRGcmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHBhcmVudEZyYW1lLmdldFRvb2xUaXBUZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKEZyYW1lTGlzdE1lc3NhZ2VzLlVwX3Rvb2xUaXBPbmVBcmcsIHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGcmFtZUxpc3RNZXNzYWdlcy5VcF90b29sVGlwOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMgPGNvZGU+Z290b0ZyYW1lPC9jb2RlPiBvbiB0aGUgZnJhbWUgbGlzdCB3aXRoIGEgZnJhbWUKLSAgICAgKiByZXByZXNlbnRpbmcgdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBpbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIEZyYW1lIHBhcmVudEZyYW1lID0gZ2V0UGFyZW50RnJhbWUoSUZyYW1lU291cmNlLkZVTExfQ09OVEVYVCk7Ci0gICAgICAgIGlmIChwYXJlbnRGcmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRGcmFtZUxpc3QoKS5nb3RvRnJhbWUocGFyZW50RnJhbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGlzIGFjdGlvbidzIGVuYWJsZWQgc3RhdGUgYW5kIHRvb2wgdGlwIHRleHQuCi0gICAgICogVGhpcyBhY3Rpb24gaXMgZW5hYmxlZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBwYXJlbnQgZnJhbWUgZm9yIHRoZSBjdXJyZW50Ci0gICAgICogZnJhbWUgaW4gdGhlIGZyYW1lIGxpc3QuCi0gICAgICogVGhlIHRvb2wgdGlwIHRleHQgaXMgIlVwIHRvICIgcGx1cyB0aGUgdG9vbCB0aXAgdGV4dCBmb3IgdGhlIHBhcmVudAotICAgICAqIGZyYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgc3VwZXIudXBkYXRlKCk7Ci0gICAgICAgIEZyYW1lIHBhcmVudEZyYW1lID0gZ2V0UGFyZW50RnJhbWUoMCk7Ci0gICAgICAgIHNldEVuYWJsZWQocGFyZW50RnJhbWUgIT0gbnVsbCk7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KGdldFRvb2xUaXBUZXh0KHBhcmVudEZyYW1lKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2ZyYW1lbGlzdC9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvZnJhbWVsaXN0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhMGY5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvZnJhbWVsaXN0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1pY3Jvc29mdCBGcm9udFBhZ2UgNC4wIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5Qcm92aWRlcyBzdXBwb3J0IGZvciBhIHdlYi1icm93c2VyIHN0eWxlIG9mIG5hdmlnYXRpb24gd2l0aGluIGEgdmlldyBieSBtYWludGFpbmluZyBhIGxpc3QKLW9mIGZyYW1lcy4gIEVhY2ggZnJhbWUgaG9sZHMgYSBzbmFwc2hvdCBvZiBhIHZpZXcgYXQgc29tZSBwb2ludCBpbiB0aW1lLgotSW5jbHVkZXMgc3VwcG9ydCBmb3IgdXNlIHdpdGggYSB0cmVlIHZpZXdlci48L3A+Ci08cD4KLTxicj4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9NYXJrZXJWaWV3VXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvTWFya2VyVmlld1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyNWIwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9NYXJrZXJWaWV3VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJWaWV3OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHNob3dpbmcgbWFya2VycyBpbiB0aGUgbWFya2VyIHZpZXdzLgotICovCi1wdWJsaWMgY2xhc3MgTWFya2VyVmlld1V0aWwgewotCQotCS8qKgotCSAqIFRoZSBQQVRIX0FUVFJJQlVURSBpcyB0aGUgdGFnIGZvciB0aGUgYXR0cmlidXRlIG9uIGEgbWFya2VyIAotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3VwcGx5IHRoZSBTdHJpbmcgZm9yIHRoZSBwYXRoIHJhdGhlciB0aGFuCi0JICogdXNpbmcgdGhlIHBhdGggb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0JICogQHNlZSBJTWFya2VyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqIEBzaW5jZSAzLjIKLQkgKiA8c3Ryb25nPk5PVEU6PC9zdHJvbmc+VGhpcyBBUEkgaXMgZXhwZXJpbWVudGFsIGFuZCBzdWJqZWN0IHRvCi0JICogY2hhbmdlIGluIHRoZSAzLjIgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfQVRUUklCVVRFID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMucGF0aCI7Ly8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBOQU1FX0FUVFJJQlVURSBpcyB0aGUgdGFnIGZvciB0aGUgYXR0cmlidXRlIG9uIGEgbWFya2VyIAotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3VwcGx5IHRoZSBTdHJpbmcgZm9yIHRoZSBuYW1lIHJhdGhlciB0aGFuCi0JICogdXNpbmcgdGhlIG5hbWUgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0JICogQHNlZSBJTWFya2VyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqIEBzaW5jZSAzLjIKLQkgKiA8c3Ryb25nPk5PVEU6PC9zdHJvbmc+VGhpcyBBUEkgaXMgZXhwZXJpbWVudGFsIGFuZCBzdWJqZWN0IHRvCi0JICogY2hhbmdlIGluIHRoZSAzLjIgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVRUUklCVVRFID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMubmFtZSI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIHZpZXcgdXNlZCB0byBzaG93IG1hcmtlcnMgb2YgdGhlCi0gICAgICogc2FtZSB0eXBlIGFzIHRoZSBnaXZlbiBtYXJrZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcmtlciB0aGUgbWFya2VyCi0gICAgICogQHJldHVybiB0aGUgdmlldyBpZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhcHByb3ByaWF0ZSB2aWV3IGNvdWxkIGJlIGRldGVybWluZWQKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB0ZXN0aW5nIHRoZSB0eXBlIG9mIHRoZSBtYXJrZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWaWV3SWQoSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1hcmtlci5pc1N1YnR5cGVPZihJTWFya2VyLlRBU0spKSB7Ci0gICAgICAgICAgICByZXR1cm4gSVBhZ2VMYXlvdXQuSURfVEFTS19MSVNUOwotICAgICAgICB9IGVsc2UgaWYgKG1hcmtlci5pc1N1YnR5cGVPZihJTWFya2VyLlBST0JMRU0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXOwotICAgICAgICB9IGVsc2UgaWYgKG1hcmtlci5pc1N1YnR5cGVPZihJTWFya2VyLkJPT0tNQVJLKSkgewotICAgICAgICAgICAgcmV0dXJuIElQYWdlTGF5b3V0LklEX0JPT0tNQVJLUzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93cyB0aGUgZ2l2ZW4gbWFya2VyIGluIHRoZSBhcHByb3ByaWF0ZSB2aWV3IGluIHRoZSBnaXZlbiBwYWdlLgotICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWdlIHRoZSB3b3JrYmVuY2ggcGFnZSBpbiB3aGljaCB0byBzaG93IHRoZSBtYXJrZXIKLSAgICAgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIgdG8gc2hvdwotICAgICAqIEBwYXJhbSBzaG93VmlldyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmlldyBzaG91bGQgYmUgc2hvd24gZmlyc3QKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBvbmx5IHNob3cgdGhlIG1hcmtlciBpZiB0aGUgdmlldyBpcyBhbHJlYWR5IHNob3dpbmcgCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFya2VyIHdhcyBzdWNjZXNzZnVsbHkgc2hvd24sCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0gICAgICogICAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd01hcmtlcihJV29ya2JlbmNoUGFnZSBwYWdlLCBJTWFya2VyIG1hcmtlciwKLSAgICAgICAgICAgIGJvb2xlYW4gc2hvd1ZpZXcpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyB2aWV3SWQgPSBnZXRWaWV3SWQobWFya2VyKTsKLSAgICAgICAgICAgIGlmICh2aWV3SWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElWaWV3UGFydCB2aWV3ID0gc2hvd1ZpZXcgPyBwYWdlLnNob3dWaWV3KHZpZXdJZCkgOiBwYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZmluZFZpZXcodmlld0lkKTsKLSAgICAgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIE1hcmtlclZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIpOwotICAgICAgICAgICAgICAgICAgICBNYXJrZXJWaWV3IG1hcmtlclZpZXcgPSAoTWFya2VyVmlldykgdmlldzsKLSAgICAgICAgICAgICAgICAgICAgbWFya2VyVmlldy5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gbWFya2VyVmlldy5nZXRTZWxlY3Rpb24oKS5lcXVhbHMoc2VsZWN0aW9uKTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL1dvcmtiZW5jaE1hcmtlclJlc29sdXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL1dvcmtiZW5jaE1hcmtlclJlc29sdXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjZjkyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9Xb3JrYmVuY2hNYXJrZXJSZXNvbHV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5VdGlsOwotCi0vKioKLSAqIFdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24gaXMgdGhlIHJlc29sdXRpb24gdGhhdCBjYW4gYmUgZ3JvdXBlZAotICogd2l0aCBvdGhlcnMgdGhhdCBhcmUgc2ltaWxhciB0byBhbGxvdyBtdWx0aSBzZWxlY3Rpb24uCi0gKiBAc2luY2UgMy4yCi0gKiA8c3Ryb25nPk5PVEU6PC9zdHJvbmc+IFRoaXMgQVBJIGlzIGV4cGVyaW1lbnRhbCBhbmQgc3ViamVjdCB0bwotICogY2hhbmdlIGluIHRoZSAzLjIgZGV2ZWxvcG1lbnQgY3ljbGUuCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbiBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uMiB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHJlY2VpdmVyIGNhbiBiZSBncm91cGVkIHdpdGgKLQkgKiByZXNvbHV0aW9uIGluIHRoZSBRdWljayBGaXggZGlhbG9nLgotCSAqIEBwYXJhbSByZXNvbHV0aW9uCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWNlaXZlciBjYW4KLQkgKiBiZSBncm91cGVkIHdpdGggcmVzb2x1dGlvbgotCSAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIG5vIGxvbmdlciBpbiB1c2UgYW5kIHdpbGwgYmUgZGVsZXRlZAotCSAqIGR1cmluZyAzLjIgTTUuCi0JICogQHNlZSAjZmluZE90aGVyTWFya2VycyhJTWFya2VyW10pCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQmVHcm91cGVkV2l0aChXb3JrYmVuY2hNYXJrZXJSZXNvbHV0aW9uIHJlc29sdXRpb24pewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiB1cGRhdGVkIFdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24gZm9yIHRoZSByZWNlaXZlci4KLQkgKiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbm90aGVyIFdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24gaGFzIGJlZW4KLQkgKiBhcHBsaWVkIGluIGNoYW5nZXMgYXJlIHJlcXVpcmVkLgotCSAqIEByZXR1cm4gV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbgotCSAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIG5vIGxvbmdlciBpbiB1c2UgYW5kIHdpbGwgYmUgZGVsZXRlZAotCSAqIGR1cmluZyAzLjIgTTUuCi0JICogQHNlZSAjZmluZE90aGVyTWFya2VycyhJTWFya2VyW10pCi0JICovCi0JcHVibGljIFdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24gZ2V0VXBkYXRlZFJlc29sdXRpb24oKXsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCS8qKgotCSAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiBzdXBwbGllZCBtYXJrZXJzLiBSZXR1cm4gYW55IHRoYXQgY2FuIGFsc28gaGF2ZQotCSAqIHRoZSByZWNlaXZlciBhcHBsaWVkIHRvIHRoZW0uCi0JICogQHBhcmFtIG1hcmtlcnMKLQkgKiBAcmV0dXJuIElNYXJrZXJbXQotCSAqIDxzdHJvbmc+Tk9URTo8L3N0cm9uZz4gVGhpcyBtZXRob2Qgd2lsbCBiZWNvbWUgYWJzdHJhY3QgZm9yCi0JICogMy4yIE01LgotCSAqIAkgCi0JICogKi8KLQlwdWJsaWMgSU1hcmtlcltdIGZpbmRPdGhlck1hcmtlcnMoSU1hcmtlcltdIG1hcmtlcnMpewotCQlyZXR1cm4gbmV3IElNYXJrZXJbMF07Ci0JfQotCi0gICAgLyoqCi0gICAgICogUnVucyB0aGlzIHJlc29sdXRpb24uIFJlc29sdmUgYWxsIDxjb2RlPm1hcmtlcnM8L2NvZGU+LgotICAgICAqIDxjb2RlPm1hcmtlcnM8L2NvZGU+IG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIG1hcmtlcnMgcmV0dXJuZWQKLSAgICAgKiBieSA8Y29kZT5maW5kT3RoZXJNYXJrZXJzKElNYXJrZXJbXSk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXJzIFRoZSBtYXJrZXJzIHRvIHJlc29sdmUsIG5vdCBudWxsCi0JICogQHBhcmFtIG1vbml0b3IgVGhlIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElNYXJrZXJbXSBtYXJrZXJzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJbW9uaXRvci5zdWJUYXNrKFV0aWwuZ2V0UHJvcGVydHkoSU1hcmtlci5NRVNTQUdFLCBtYXJrZXJzW2ldKSk7Ci0JCQlydW4obWFya2Vyc1tpXSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BYnN0cmFjdEZpZWxkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BYnN0cmFjdEZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YjdhMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWJzdHJhY3RGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi0KLS8qKgotICogQWJzdHJhY3RGaWVsZCBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgZmllbGRzLgotICogQHNpbmNlIDMuMgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RmllbGQgaW1wbGVtZW50cyBJRmllbGQgewotCQotCWJvb2xlYW4gdmlzaWJsZSA9IHRydWU7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjaXNTaG93aW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7Ci0JCXJldHVybiB2aXNpYmxlOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgd2hldGhlciBvciBub3QgdGhlIHJlY2VpdmVyIGlzIHNob3dpbmcuCi0JICogQHBhcmFtIHNob3dpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93aW5nKGJvb2xlYW4gc2hvd2luZyl7Ci0JCXZpc2libGUgPSBzaG93aW5nOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25BZGRHbG9iYWxUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25BZGRHbG9iYWxUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDZkNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWN0aW9uQWRkR2xvYmFsVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgQWN0aW9uQWRkR2xvYmFsVGFzayBpcyB0aGUgYWN0aW9uIGZvciBhZGRpbmcgYSBnbG9iYWwgdGFzay4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25BZGRHbG9iYWxUYXNrIGV4dGVuZHMgQWN0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVEX0lNQUdFX1BBVEggPSAiZWxjbDE2L2FkZHRza190c2suZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBwYXJ0OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBnbG9iYWwgdGFzay4KLSAgICAgKiBAcGFyYW0gcGFydAotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpb25BZGRHbG9iYWxUYXNrKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5hZGRHbG9iYWxUYXNrQWN0aW9uX3RpdGxlKTsgCi0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKEVOQUJMRURfSU1BR0VfUEFUSCkpOwotICAgICAgICBzZXRUb29sVGlwVGV4dChNYXJrZXJNZXNzYWdlcy5hZGRHbG9iYWxUYXNrQWN0aW9uX3Rvb2x0aXApOwotICAgICAgICB0aGlzLnBhcnQgPSBwYXJ0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgRGlhbG9nVGFza1Byb3BlcnRpZXMgZGlhbG9nID0gbmV3IERpYWxvZ1Rhc2tQcm9wZXJ0aWVzKHBhcnQuZ2V0U2l0ZSgpCi0gICAgICAgICAgICAgICAgLmdldFNoZWxsKCksIE1hcmtlck1lc3NhZ2VzLmFkZEdsb2JhbFRhc2tEaWFsb2dfdGl0bGUpOwotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0FjdGlvbkNvcHlNYXJrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0FjdGlvbkNvcHlNYXJrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTczMjQ3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25Db3B5TWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NYXJrZXJUcmFuc2ZlcjsKLQotLyoqCi0gKiBDb3BpZXMgb25lIG9yIG1vcmUgbWFya2VyIHRvIHRoZSBjbGlwYm9hcmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db3B5TWFya2VyIGV4dGVuZHMgTWFya2VyU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24gewotCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBwYXJ0OwotCi0JcHJpdmF0ZSBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCi0JcHJpdmF0ZSBJRmllbGRbXSBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0Ci0JICogQHBhcmFtIHByb3ZpZGVyCi0JICovCi0JcHVibGljIEFjdGlvbkNvcHlNYXJrZXIoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKHByb3ZpZGVyLCBNYXJrZXJNZXNzYWdlcy5jb3B5QWN0aW9uX3RpdGxlKTsKLQkJdGhpcy5wYXJ0ID0gcGFydDsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWSkpOwotCQlzZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjbGlwYm9hcmQgdGhhdCB0aGUgbWFya2VyKHMpIHdpbGwgYmUgY29waWVkIHRvLgotCSAqIAotCSAqIEBwYXJhbSBjbGlwYm9hcmQKLQkgKiAgICAgICAgICAgIHRoZSBjbGlwYm9hcmQKLQkgKi8KLQl2b2lkIHNldENsaXBib2FyZChDbGlwYm9hcmQgY2xpcGJvYXJkKSB7Ci0JCXRoaXMuY2xpcGJvYXJkID0gY2xpcGJvYXJkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIHBsYWluLXRleHQgbWFya2VyIHJlcG9ydCB0aGF0IHdpbGwKLQkgKiBiZSBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydGllcwotCSAqLwotCXZvaWQgc2V0UHJvcGVydGllcyhJRmllbGRbXSBwcm9wZXJ0aWVzKSB7Ci0JCXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBzZWxlY3RlZCBJTWFya2VyIG9iamVjdHMgdG8gdGhlIGNsaXBib2FyZC4gSWYgcHJvcGVydGllcyBoYXZlCi0JICogYmVlbiBzZXQsIGFsc28gY29waWVzIGEgcGxhaW4tdGV4dCByZXBvcnQgb2YgdGhlIHNlbGVjdGVkIG1hcmtlcnMgdG8gdGhlCi0JICogY2xpcGJvYXJkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRTZWxlY3RlZE1hcmtlcnMoKTsKLQkJc2V0Q2xpcGJvYXJkKG1hcmtlcnMsIGNyZWF0ZU1hcmtlclJlcG9ydChtYXJrZXJzKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRFbmFibGVkKFV0aWwuYWxsQ29uY3JldGVTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENsaXBib2FyZChJTWFya2VyW10gbWFya2VycywgU3RyaW5nIG1hcmtlclJlcG9ydCkgewotCQl0cnkgewotCQkJLy8gUGxhY2UgdGhlIG1hcmtlcnMgb24gdGhlIGNsaXBib2FyZAotCQkJT2JqZWN0W10gZGF0YTsKLQkJCVRyYW5zZmVyW10gdHJhbnNmZXJUeXBlczsKLQkJCWlmIChtYXJrZXJSZXBvcnQgPT0gbnVsbCkgewotCQkJCWRhdGEgPSBuZXcgT2JqZWN0W10geyBtYXJrZXJzIH07Ci0JCQkJdHJhbnNmZXJUeXBlcyA9IG5ldyBUcmFuc2ZlcltdIHsgTWFya2VyVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhID0gbmV3IE9iamVjdFtdIHsgbWFya2VycywgbWFya2VyUmVwb3J0IH07Ci0JCQkJdHJhbnNmZXJUeXBlcyA9IG5ldyBUcmFuc2ZlcltdIHsgTWFya2VyVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkJCQkJCVRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCQl9Ci0KLQkJCWNsaXBib2FyZC5zZXRDb250ZW50cyhkYXRhLCB0cmFuc2ZlclR5cGVzKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJaWYgKGUuY29kZSAhPSBETkQuRVJST1JfQ0FOTk9UX1NFVF9DTElQQk9BUkQpCi0JCQkJdGhyb3cgZTsKLQkJCWlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihwYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpLAotCQkJCQlNYXJrZXJNZXNzYWdlcy5Db3B5VG9DbGlwYm9hcmRQcm9ibGVtRGlhbG9nX3RpdGxlLAotCQkJCQlNYXJrZXJNZXNzYWdlcy5Db3B5VG9DbGlwYm9hcmRQcm9ibGVtRGlhbG9nX21lc3NhZ2UpKQotCQkJCXNldENsaXBib2FyZChtYXJrZXJzLCBtYXJrZXJSZXBvcnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHBsYWluLXRleHQgcmVwb3J0IG9mIHRoZSBzZWxlY3RlZCBtYXJrZXJzIGJhc2VkIG9uIHByZWRlZmluZWQKLQkgKiBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEBwYXJhbSByYXdNYXJrZXJzCi0JICogQHJldHVybiB0aGUgbWFya2VyIHJlcG9ydAotCSAqLwotCVN0cmluZyBjcmVhdGVNYXJrZXJSZXBvcnQoSU1hcmtlcltdIHJhd01hcmtlcnMpIHsKLQkJQ29uY3JldGVNYXJrZXJbXSBtYXJrZXJzOwotCQl0cnkgewotCQkJbWFya2VycyA9IE1hcmtlckxpc3QuY3JlYXRlTWFya2VycyhyYXdNYXJrZXJzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IocGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwKLQkJCQkJTWFya2VyTWVzc2FnZXMuRXJyb3IsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOwotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmdCdWZmZXIgcmVwb3J0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZpbmFsIFN0cmluZyBORVdMSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIGNoYXIgREVMSU1JVEVSID0gJ1x0JzsKLQotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGNyZWF0ZSBoZWFkZXIKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXBvcnQuYXBwZW5kKHByb3BlcnRpZXNbaV0uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQlpZiAoaSA9PSBwcm9wZXJ0aWVzLmxlbmd0aCAtIDEpCi0JCQkJcmVwb3J0LmFwcGVuZChORVdMSU5FKTsKLQkJCWVsc2UKLQkJCQlyZXBvcnQuYXBwZW5kKERFTElNSVRFUik7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbmNyZXRlTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHByb3BlcnRpZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlyZXBvcnQuYXBwZW5kKHByb3BlcnRpZXNbal0uZ2V0VmFsdWUobWFya2VyKSk7Ci0JCQkJaWYgKGogPT0gcHJvcGVydGllcy5sZW5ndGggLSAxKQotCQkJCQlyZXBvcnQuYXBwZW5kKE5FV0xJTkUpOwotCQkJCWVsc2UKLQkJCQkJcmVwb3J0LmFwcGVuZChERUxJTUlURVIpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlcG9ydC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0FjdGlvbkRlbGV0ZUNvbXBsZXRlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWN0aW9uRGVsZXRlQ29tcGxldGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhY2ZlNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWN0aW9uRGVsZXRlQ29tcGxldGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEFjdGlvbkRlbGV0ZUNvbXBsZXRlZCBpcyB0aGUgYWN0aW9uIGZvciBkZWxldGluZyBjb21wbGV0ZWQKLSAqIG1hcmtlcnMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uRGVsZXRlQ29tcGxldGVkIGV4dGVuZHMgTWFya2VyU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24gewotCi0gICAgcHJpdmF0ZSBUYXNrVmlldyBwYXJ0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBBY3Rpb25EZWxldGVDb21wbGV0ZWQgaW5zdGFuY2UKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFydAotICAgICAqIEBwYXJhbSBwcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpb25EZWxldGVDb21wbGV0ZWQoVGFza1ZpZXcgcGFydCwgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKHByb3ZpZGVyLCBNYXJrZXJNZXNzYWdlcy5kZWxldGVDb21wbGV0ZWRBY3Rpb25fdGl0bGUpOwotICAgICAgICB0aGlzLnBhcnQgPSBwYXJ0OwotICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBmaW5hbCBMaXN0IGNvbXBsZXRlZCA9IGdldENvbXBsZXRlZFRhc2tzKCk7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGRvCi0gICAgICAgIGlmIChjb21wbGV0ZWQuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCksIAotICAgICAgICAgICAgCQlNYXJrZXJNZXNzYWdlcy5kZWxldGVDb21wbGV0ZWRUYXNrc19kaWFsb2dUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgTWFya2VyTWVzc2FnZXMuZGVsZXRlQ29tcGxldGVkVGFza3Nfbm9uZUNvbXBsZXRlZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgICAgIGlmIChjb21wbGV0ZWQuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBNYXJrZXJNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAuZGVsZXRlQ29tcGxldGVkVGFza3NfcGVybWFuZW50U2luZ3VsYXI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXNzYWdlID0gTkxTLmJpbmQoCi0gICAgICAgICAgICAJCU1hcmtlck1lc3NhZ2VzLmRlbGV0ZUNvbXBsZXRlZFRhc2tzX3Blcm1hbmVudFBsdXJhbCwKLSAgICAgICAgICAgIAkJU3RyaW5nLnZhbHVlT2YoY29tcGxldGVkLnNpemUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFZlcmlmeS4KLSAgICAgICAgaWYgKCFNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKHBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCksIE1hcmtlck1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgLmRlbGV0ZUNvbXBsZXRlZFRhc2tzX2RpYWxvZ1RpdGxlLAotICAgICAgICAgICAgICAgIG1lc3NhZ2UpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcGxldGVkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSBjb21wbGV0ZWQuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrZXJNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlbGV0ZUNvbXBsZXRlZFRhc2tzX2Vycm9yTWVzc2FnZSwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7IAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IGdldENvbXBsZXRlZFRhc2tzKCkgewotICAgICAgICBMaXN0IGNvbXBsZXRlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBNYXJrZXJMaXN0IG1hcmtlckxpc3QgPSBwYXJ0LmdldFZpc2libGVNYXJrZXJzKCk7Ci0KLSAgICAgICAgQ29uY3JldGVNYXJrZXJbXSBtYXJrZXJzID0gbWFya2VyTGlzdC50b0FycmF5KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDb25jcmV0ZU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotICAgICAgICAgICAgaWYgKG1hcmtlciBpbnN0YW5jZW9mIFRhc2tNYXJrZXIpIHsKLSAgICAgICAgICAgICAgICBUYXNrTWFya2VyIHRhc2tNYXJrZXIgPSAoVGFza01hcmtlcikgbWFya2VyOwotCi0gICAgICAgICAgICAgICAgaWYgKHRhc2tNYXJrZXIuZ2V0RG9uZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkLmFkZCh0YXNrTWFya2VyLmdldE1hcmtlcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29tcGxldGVkOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24jc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWN0aW9uTWFya0NvbXBsZXRlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWN0aW9uTWFya0NvbXBsZXRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjIyNjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0FjdGlvbk1hcmtDb21wbGV0ZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBBY3Rpb25NYXJrQ29tcGxldGVkIGlzIHRoZSBhY3Rpb24gZm9yIG1hcmtpbmcgdGFzayBjb21wbGV0aW9uLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25NYXJrQ29tcGxldGVkIGV4dGVuZHMgTWFya2VyU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNpZXZlci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQWN0aW9uTWFya0NvbXBsZXRlZChJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIocHJvdmlkZXIsIE1hcmtlck1lc3NhZ2VzLm1hcmtDb21wbGV0ZWRBY3Rpb25fdGl0bGUpOwotCQlzZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0U2VsZWN0ZWRNYXJrZXJzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQltYXJrZXJzW2ldLnNldEF0dHJpYnV0ZShJTWFya2VyLkRPTkUsIHRydWUpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJVXRpbC5sb2coZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCi0JCQkJfQotCQkJfSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXRpbC5sb2coZSk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25Qcm92aWRlckFjdGlvbiNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgQ29uY3JldGVNYXJrZXIpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJSU1hcmtlciBtYXJrZXIgPSAoKENvbmNyZXRlTWFya2VyKSBvYmopLmdldE1hcmtlcigpOwotCQkJaWYgKCFtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuVVNFUl9FRElUQUJMRSwgdHJ1ZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAobWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkRPTkUsIGZhbHNlKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0FjdGlvbk1hcmtlclByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0FjdGlvbk1hcmtlclByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExOThhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25NYXJrZXJQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uOwotCi0vKioKLSAqIEFjdGlvbk1hcmtlclByb3BlcnRpZXMgaXMgdGhlIGFjdGlvbiBmb3Igb3BlbmluZyBhIHByb3BlcnRpZXMKLSAqIGRpYWxvZy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25NYXJrZXJQcm9wZXJ0aWVzIGV4dGVuZHMgU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24gewotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBwYXJ0OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKiBAcGFyYW0gcGFydAotICAgICAqIEBwYXJhbSBwcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpb25NYXJrZXJQcm9wZXJ0aWVzKElXb3JrYmVuY2hQYXJ0IHBhcnQsCi0gICAgICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIocHJvdmlkZXIsIE1hcmtlck1lc3NhZ2VzLnByb3BlcnRpZXNBY3Rpb25fdGl0bGUpOwotICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5wYXJ0ID0gcGFydDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBpZiAoIWlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IG9iaiA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29uY3JldGVNYXJrZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgQ29uY3JldGVNYXJrZXIgbWFya2VyID0gKENvbmNyZXRlTWFya2VyKSBvYmo7Ci0gICAgICAgIERpYWxvZ01hcmtlclByb3BlcnRpZXMgZGlhbG9nID0gbmV3IERpYWxvZ01hcmtlclByb3BlcnRpZXMocGFydAotICAgICAgICAgICAgICAgIC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGRpYWxvZy5zZXRNYXJrZXIobWFya2VyLmdldE1hcmtlcigpKTsKLSAgICAgICAgZGlhbG9nLm9wZW4oKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzZXRFbmFibGVkKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWN0aW9uT3Blbk1hcmtlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWN0aW9uT3Blbk1hcmtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzRjOTc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0FjdGlvbk9wZW5NYXJrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLk9wZW5TdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiBBY3Rpb24gdG8gb3BlbiBhbiBlZGl0b3Igb24gdGhlIHNlbGVjdGVkIGJvb2ttYXJrcy4KLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbk9wZW5NYXJrZXIgZXh0ZW5kcyBNYXJrZXJTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTUFHRV9QQVRIID0gImVsY2wxNi9nb3Rvb2JqX3Rzay5naWYiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUFHRV9QQVRIID0gImRsY2wxNi9nb3Rvb2JqX3Rzay5naWYiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgcGFydDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICogQHBhcmFtIHBhcnQKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQWN0aW9uT3Blbk1hcmtlcihJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIocHJvdmlkZXIsIE1hcmtlck1lc3NhZ2VzLm9wZW5BY3Rpb25fdGl0bGUpOwotICAgICAgICB0aGlzLnBhcnQgPSBwYXJ0OwotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcihJTUFHRV9QQVRIKSk7Ci0gICAgICAgIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKElERVdvcmtiZW5jaFBsdWdpbi5nZXRJREVJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1BR0VfUEFUSCkpOwotICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBJTWFya2VyIG1hcmtlciA9IGdldFNlbGVjdGVkTWFya2VyKCk7Ci0gICAgICAgIC8vb3B0aW1pemF0aW9uOiBpZiB0aGUgYWN0aXZlIGVkaXRvciBoYXMgdGhlIHNhbWUgaW5wdXQgYXMgdGhlIHNlbGVjdGVkIG1hcmtlciB0aGVuIAotICAgICAgICAvL1JldmVhbE1hcmtlckFjdGlvbiB3b3VsZCBoYXZlIGJlZW4gcnVuIGFuZCB3ZSBvbmx5IG5lZWQgdG8gYWN0aXZhdGUgdGhlIGVkaXRvcgotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBwYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIGlmIChlZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VVdGlsLmdldEZpbGUoaW5wdXQpOwotICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChtYXJrZXIuZ2V0UmVzb3VyY2UoKS5lcXVhbHMoZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLmFjdGl2YXRlKGVkaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1hcmtlci5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSURFLm9wZW5FZGl0b3IocGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLCBtYXJrZXIsIE9wZW5TdHJhdGVneQotICAgICAgICAgICAgICAgICAgICAgICAgLmFjdGl2YXRlT25PcGVuKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIE9wZW4gYW4gZXJyb3Igc3R5bGUgZGlhbG9nIGZvciBQYXJ0SW5pdEV4Y2VwdGlvbiBieQotICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBhbnkgZXh0cmEgaW5mb3JtYXRpb24gZnJvbSB0aGUgbmVzdGVkCi0gICAgICAgICAgICAgICAgLy8gQ29yZUV4Y2VwdGlvbiBpZiBwcmVzZW50LgotCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVzdGVkIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBDb3JlRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3RhdHVzLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgbmVzdGVkRXhjZXB0aW9uID0gKENvcmVFeGNlcHRpb24pIHN0YXR1cy5nZXRFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgICAgIGlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBPcGVuIGFuIGVycm9yIGRpYWxvZyBhbmQgaW5jbHVkZSB0aGUgZXh0cmEKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RhdHVzIGluZm9ybWF0aW9uIGZyb20gdGhlIG5lc3RlZCBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihwYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpLCAKLSAgICAgICAgICAgICAgICAgICAgCQlNYXJrZXJNZXNzYWdlcy5PcGVuTWFya2VyX2Vycm9yVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCksIG5lc3RlZEV4Y2VwdGlvbi5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT3BlbiBhIHJlZ3VsYXIgZXJyb3IgZGlhbG9nIHNpbmNlIHRoZXJlIGlzIG5vCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4dHJhIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IocGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgCi0gICAgICAgICAgICAgICAgICAgIAkJTWFya2VyTWVzc2FnZXMuT3Blbk1hcmtlcl9lcnJvclRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzZXRFbmFibGVkKFV0aWwuaXNTaW5nbGVDb25jcmV0ZVNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25QYXN0ZU1hcmtlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWN0aW9uUGFzdGVNYXJrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1N2YxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25QYXN0ZU1hcmtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk1hcmtlclRyYW5zZmVyOwotCi0vKioKLSAqIFBhc3RlcyBvbmUgb3IgbW9yZSBib29rbWFyayhzKSBmcm9tIHRoZSBjbGlwYm9hcmQgaW50byB0aGUgYm9va21hcmsgbmF2aWdhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uUGFzdGVNYXJrZXIgZXh0ZW5kcyBNYXJrZXJTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiB7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0KLSAgICBwcml2YXRlIENsaXBib2FyZCBjbGlwYm9hcmQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIHBhc3RhYmxlVHlwZXM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhY3Rpb24uCi0gICAgICogQHBhcmFtIHBhcnQKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQWN0aW9uUGFzdGVNYXJrZXIoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKHByb3ZpZGVyLCBNYXJrZXJNZXNzYWdlcy5wYXN0ZUFjdGlvbl90aXRsZSk7Ci0gICAgICAgIHRoaXMucGFydCA9IHBhcnQ7Ci0gICAgICAgIHRoaXMucGFzdGFibGVUeXBlcyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1BBU1RFKSk7Ci0gICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLQotICAgIHZvaWQgc2V0Q2xpcGJvYXJkKENsaXBib2FyZCBjbGlwYm9hcmQpIHsKLSAgICAgICAgdGhpcy5jbGlwYm9hcmQgPSBjbGlwYm9hcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBtYXJrZXIocykgZnJvbSB0aGUgY2xpcGJvYXJkIHRvIHRoZSBib29rbWFyayBuYXZpZ2F0b3Igdmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIC8vIEdldCB0aGUgbWFya2VycyBmcm9tIHRoZSBjbGlwYm9hcmQKLSAgICAgICAgTWFya2VyVHJhbnNmZXIgdHJhbnNmZXIgPSBNYXJrZXJUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICBJTWFya2VyW10gbWFya2VyRGF0YSA9IChJTWFya2VyW10pIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0gICAgICAgIHBhc3RlKG1hcmtlckRhdGEpOwotICAgIH0KLQotICAgIHZvaWQgcGFzdGUoZmluYWwgSU1hcmtlcltdIG1hcmtlcnMpIHsKLSAgICAgICAgaWYgKG1hcmtlcnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBmaW5hbCBBcnJheUxpc3QgbmV3TWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IG1hcmtlcnNbaV0uZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzdGUgdG8gdGhlIHNhbWUgcmVzb3VyY2UgYXMgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXJrZXJzW2ldLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgYXR0cmlidXRlcyA9IG1hcmtlcnNbaV0uZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIodHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld01hcmtlcnMuYWRkKG1hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IocGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgCi0gICAgICAgICAgICAJCU1hcmtlck1lc3NhZ2VzLlBhc3RlTWFya2VyX2Vycm9yVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIGUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTmVlZCB0byBkbyB0aGlzIGluIGFuIGFzeW5jRXhlYywgZXZlbiB0aG91Z2ggd2UncmUgaW4gdGhlIFVJIHRocmVhZCBoZXJlLAotICAgICAgICAvLyBzaW5jZSB0aGUgbWFya2VyIHZpZXcgdXBkYXRlcyBpdHNlbGYgd2l0aCB0aGUgYWRkaXRpb24gaW4gYW4gYXN5bmNFeGVjLAotICAgICAgICAvLyB3aGljaCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LgotICAgICAgICAvLyBNdXN0IGJlIGRvbmUgb3V0c2lkZSBJV29ya3NwYWNlUnVubmFibGUgYWJvdmUgc2luY2Ugbm90aWZpY2F0aW9uIGZvciBhZGQgaXMKLSAgICAgICAgLy8gc2VudCBhZnRlciBJV29ya3NwYWNlUnVubmFibGUgaXMgcnVuLgotICAgICAgICBpZiAoZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSAhPSBudWxsICYmIG5ld01hcmtlcnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgcGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld01hcmtlcnMpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlRW5hYmxlbWVudCgpIHsKLSAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGlmIChjbGlwYm9hcmQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUGFzdGUgaWYgY2xpcGJvYXJkIGNvbnRhaW5zIHBhc3RhYmxlIG1hcmtlcnMKLSAgICAgICAgTWFya2VyVHJhbnNmZXIgdHJhbnNmZXIgPSBNYXJrZXJUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICBJTWFya2VyW10gbWFya2VyRGF0YSA9IChJTWFya2VyW10pIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0gICAgICAgIGlmIChtYXJrZXJEYXRhID09IG51bGwgfHwgbWFya2VyRGF0YS5sZW5ndGggPCAxCi0gICAgICAgICAgICAgICAgfHwgcGFzdGFibGVUeXBlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJEYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElNYXJrZXIgbWFya2VyID0gbWFya2VyRGF0YVtpXTsKLSAgICAgICAgICAgICAgICBpZiAoIW1hcmtlci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBwYXN0YWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFzdGFibGVUeXBlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWFya2VyLmlzU3VidHlwZU9mKHBhc3RhYmxlVHlwZXNbal0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXN0YWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIXBhc3RhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFVdGlsLmlzRWRpdGFibGUobWFya2VyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHN0cmluZ3MKLSAgICAgKi8KLSAgICB2b2lkIHNldFBhc3RhYmxlVHlwZXMoU3RyaW5nW10gc3RyaW5ncykgewotICAgICAgICBwYXN0YWJsZVR5cGVzID0gc3RyaW5nczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25Qcm9ibGVtUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWN0aW9uUHJvYmxlbVByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxOTY5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25Qcm9ibGVtUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBBY3Rpb25Qcm9ibGVtUHJvcGVydGllcyBpcyB0aGUgYWN0aW9uIGZvciBvcGVuaW5nIHRoZSBwcm9wZXJ0aWVzCi0gKiBpbiB0aGUgcHJvYmxlbXMgdmlldy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Qcm9ibGVtUHJvcGVydGllcyBleHRlbmRzIE1hcmtlclNlbGVjdGlvblByb3ZpZGVyQWN0aW9uIHsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaFBhcnQgcGFydDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICogQHBhcmFtIHBhcnQKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQWN0aW9uUHJvYmxlbVByb3BlcnRpZXMoSVdvcmtiZW5jaFBhcnQgcGFydCwKLSAgICAgICAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotICAgICAgICBzdXBlcihwcm92aWRlciwgTWFya2VyTWVzc2FnZXMucHJvcGVydGllc0FjdGlvbl90aXRsZSk7Ci0gICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLnBhcnQgPSBwYXJ0OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gCi0gICAgCUlNYXJrZXIgbWFya2VyID0gZ2V0U2VsZWN0ZWRNYXJrZXIoKTsKLSAgICAgICAgRGlhbG9nTWFya2VyUHJvcGVydGllcyBkaWFsb2cgPSBuZXcgRGlhbG9nUHJvYmxlbVByb3BlcnRpZXMocGFydAotICAgICAgICAgICAgICAgIC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGRpYWxvZy5zZXRNYXJrZXIobWFya2VyKTsKLSAgICAgICAgZGlhbG9nLm9wZW4oKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzZXRFbmFibGVkKFV0aWwuaXNTaW5nbGVDb25jcmV0ZVNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25SZW1vdmVNYXJrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0FjdGlvblJlbW92ZU1hcmtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWEyMjM4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25SZW1vdmVNYXJrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBY3Rpb24gdG8gcmVtb3ZlIHRoZSBzZWxlY3RlZCBib29rbWFya3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25SZW1vdmVNYXJrZXIgZXh0ZW5kcyBNYXJrZXJTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiB7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBhY3Rpb24uCi0JICogQHBhcmFtIHBhcnQKLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQWN0aW9uUmVtb3ZlTWFya2VyKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihwcm92aWRlciwgTWFya2VyTWVzc2FnZXMuZGVsZXRlQWN0aW9uX3RpdGxlKTsKLQkJdGhpcy5wYXJ0ID0gcGFydDsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFX0RJU0FCTEVEKSk7Ci0JCXNldFRvb2xUaXBUZXh0KE1hcmtlck1lc3NhZ2VzLmRlbGV0ZUFjdGlvbl90b29sdGlwKTsKLQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlIHRoZSBtYXJrZXIgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJCQlJTWFya2VyW10gbWFya2VycyA9IGdldFNlbGVjdGVkTWFya2VycygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCW1hcmtlcnNbaV0uZGVsZXRlKCk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0sIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUVycm9yRGlhbG9nCi0JCQkJCS5vcGVuRXJyb3IocGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCQlNYXJrZXJNZXNzYWdlcy5SZW1vdmVNYXJrZXJfZXJyb3JUaXRsZSwgbnVsbCwgZQotCQkJCQkJCQkJLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldEVuYWJsZWQoZmFsc2UpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIENvbmNyZXRlTWFya2VyKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKCFVdGlsLmlzRWRpdGFibGUoKChDb25jcmV0ZU1hcmtlcikgb2JqKS5nZXRNYXJrZXIoKSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25SZXNvbHZlTWFya2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25SZXNvbHZlTWFya2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5N2QxNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWN0aW9uUmVzb2x2ZU1hcmtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlOwotCi0vKioKLSAqIFRoaXMgYWN0aW9uIGRpc3BsYXlzIGEgbGlzdCBvZiByZXNvbHV0aW9ucyBmb3IgdGhlIHNlbGVjdGVkIG1hcmtlcgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25SZXNvbHZlTWFya2VyIGV4dGVuZHMgTWFya2VyU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24gewotCi0JcHJpdmF0ZSBNYXJrZXJWaWV3IHZpZXc7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXJWaWV3Ci0JICogQHBhcmFtIHByb3ZpZGVyCi0JICovCi0JcHVibGljIEFjdGlvblJlc29sdmVNYXJrZXIoTWFya2VyVmlldyBtYXJrZXJWaWV3LAotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKHByb3ZpZGVyLCBNYXJrZXJNZXNzYWdlcy5yZXNvbHZlTWFya2VyQWN0aW9uX3RpdGxlKTsKLQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXZpZXcgPSBtYXJrZXJWaWV3OwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIGEgbGlzdCBvZiByZXNvbHV0aW9ucyBhbmQgcGVyZm9ybXMgdGhlIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyh2aWV3LmdldFNpdGUoKQotCQkJCS5nZXRTaGVsbCgpKTsKLQkJZmluYWwgT2JqZWN0W10gcmVzb2x1dGlvbnMgPSBuZXcgT2JqZWN0WzFdOwotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyByZXNvbHV0aW9uc1J1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhOTFMuYmluZCgKLQkJCQkJCU1hcmtlck1lc3NhZ2VzLnJlc29sdmVNYXJrZXJBY3Rpb25fY29tcHV0YXRpb25BY3Rpb24sCi0JCQkJCQlnZXRNYXJrZXJEZXNjcmlwdGlvbigpKSwgMTAwKTsKLQkJCQltb25pdG9yLndvcmtlZCgyNSk7Ci0JCQkJcmVzb2x1dGlvbnNbMF0gPSBJREUuZ2V0TWFya2VySGVscFJlZ2lzdHJ5KCkuZ2V0UmVzb2x1dGlvbnMoCi0JCQkJCQlnZXRTZWxlY3RlZE1hcmtlcigpKTsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfTsKLQotCQlPYmplY3Qgc2VydmljZSA9IHZpZXcuZ2V0U2l0ZSgpLmdldEFkYXB0ZXIoCi0JCQkJSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UuY2xhc3MpOwotCi0JCXRyeSB7Ci0JCQlpZiAoc2VydmljZSA9PSBudWxsKQotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSShjb250ZXh0LAotCQkJCQkJcmVzb2x1dGlvbnNSdW5uYWJsZSwgbnVsbCk7Ci0JCQllbHNlCi0JCQkJKChJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSkgc2VydmljZSkucnVuSW5VSShjb250ZXh0LAotCQkJCQkJcmVzb2x1dGlvbnNSdW5uYWJsZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCURpYWxvZyBkaWFsb2cgPSBuZXcgTWFya2VyUmVzb2x1dGlvbkRpYWxvZyh2aWV3LmdldFNpdGUoKS5nZXRTaGVsbCgpLAotCQkJCWdldFNlbGVjdGVkTWFya2VyKCksIChJTWFya2VyUmVzb2x1dGlvbltdKSByZXNvbHV0aW9uc1swXSx2aWV3KTsKLQkJZGlhbG9nLm9wZW4oKTsKLQotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJSURFV29ya2JlbmNoUGx1Z2luLmxvZyhleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24pOwotCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Iodmlldy5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgTWFya2VyTWVzc2FnZXMuRXJyb3IsCi0JCQkJTkxTLmJpbmQoTWFya2VyTWVzc2FnZXMuTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19DYW5ub3RGaXhNZXNzYWdlLAotCQkJCQkJZ2V0TWFya2VyRGVzY3JpcHRpb24oKSksIFV0aWwuZXJyb3JTdGF0dXMoZXhjZXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbWFya2VyLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWFya2VyRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBVdGlsLmdldFByb3BlcnR5KElNYXJrZXIuTUVTU0FHRSwgZ2V0U2VsZWN0ZWRNYXJrZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCi0JCWlmIChVdGlsLmlzU2luZ2xlQ29uY3JldGVTZWxlY3Rpb24oc2VsZWN0aW9uKSkgewotCQkJaWYgKElERS5nZXRNYXJrZXJIZWxwUmVnaXN0cnkoKS5oYXNSZXNvbHV0aW9ucyhnZXRTZWxlY3RlZE1hcmtlcigpKSkgewotCQkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWN0aW9uUmV2ZWFsTWFya2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25SZXZlYWxNYXJrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkMDA5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25SZXZlYWxNYXJrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuUmVzb3VyY2VVdGlsOwotCi0vKioKLSAqIEFjdGlvblJldmVhbE1hcmtlciBpcyB0aGUgYWN0aW9uIGZvciBvcGVuaW5nIHRoZSBlZGl0b3Igb24KLSAqIGEgbWFya2VyLgotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGlvblJldmVhbE1hcmtlciBleHRlbmRzIE1hcmtlclNlbGVjdGlvblByb3ZpZGVyQWN0aW9uIHsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCBwYXJ0OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkgKiBAcGFyYW0gcGFydAotCSAqIEBwYXJhbSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBBY3Rpb25SZXZlYWxNYXJrZXIoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKHByb3ZpZGVyLCBVdGlsLkVNUFRZX1NUUklORyk7IAotCQl0aGlzLnBhcnQgPSBwYXJ0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCi0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VVdGlsLmdldEZpbGUoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IGdldFNlbGVjdGVkTWFya2VyKCk7Ci0JCQlpZiAobWFya2VyLmdldFJlc291cmNlKCkuZXF1YWxzKGZpbGUpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSURFLm9wZW5FZGl0b3IocGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLAotCQkJCQkJCW1hcmtlciwgZmFsc2UpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24jc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldEVuYWJsZWQoVXRpbC5pc1NpbmdsZUNvbmNyZXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCXJ1bigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQWN0aW9uU2VsZWN0QWxsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25TZWxlY3RBbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkZGRkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25TZWxlY3RBbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBUaGUgQWN0aW9uU2VsZWN0QWxsIGlzIHRoZSBhY3Rpb24gZm9yIHNlbGVjdGluZyBhbGwgCi0gKiBvZiB0aGUgZW50cmllcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25TZWxlY3RBbGwgZXh0ZW5kcyBNYXJrZXJTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiB7Ci0KLQlwcml2YXRlIE1hcmtlclZpZXcgdmlldzsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgc3VwcGxpZWQKLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyVmlldwotCSAqLwotCXB1YmxpYyBBY3Rpb25TZWxlY3RBbGwoTWFya2VyVmlldyBtYXJrZXJWaWV3KSB7Ci0JCXN1cGVyKG1hcmtlclZpZXcuZ2V0Vmlld2VyKCksCi0JCQkJTWFya2VyTWVzc2FnZXMuc2VsZWN0QWxsQWN0aW9uX3RpdGxlKTsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJdmlldyA9IG1hcmtlclZpZXc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlzdXBlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbigKLQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbih2aWV3LmdldEN1cnJlbnRNYXJrZXJzKCkuYXNMaXN0KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24jc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0FjdGlvblRhc2tQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9BY3Rpb25UYXNrUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzhmOGJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0FjdGlvblRhc2tQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBBY3Rpb25UYXNrUHJvcGVydGllcyBpcyB0aGUgYWN0aW9uIGZvciBzZXR0aW5nIGEgdGFza3MgcHJvcGVydGllcy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uVGFza1Byb3BlcnRpZXMgZXh0ZW5kcyBNYXJrZXJTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiB7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0Ci0JICogQHBhcmFtIHByb3ZpZGVyCi0JICovCi0JcHVibGljIEFjdGlvblRhc2tQcm9wZXJ0aWVzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihwcm92aWRlciwgTWFya2VyTWVzc2FnZXMucHJvcGVydGllc0FjdGlvbl90aXRsZSk7Ci0JCXNldEVuYWJsZWQoZmFsc2UpOwotCQl0aGlzLnBhcnQgPSBwYXJ0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQotCQlEaWFsb2dNYXJrZXJQcm9wZXJ0aWVzIGRpYWxvZyA9IG5ldyBEaWFsb2dUYXNrUHJvcGVydGllcyhwYXJ0LmdldFNpdGUoKQotCQkJCS5nZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldE1hcmtlcihnZXRTZWxlY3RlZE1hcmtlcigpKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24jc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldEVuYWJsZWQoVXRpbC5pc1NpbmdsZUNvbmNyZXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0Jvb2ttYXJrRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9Cb29rbWFya0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjM5MjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0Jvb2ttYXJrRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci0KLXB1YmxpYyBjbGFzcyBCb29rbWFya0ZpbHRlciBleHRlbmRzIE1hcmtlckZpbHRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX0NPTlRBSU5TID0gImNvbnRhaW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBib29sZWFuIERFRkFVTFRfQ09OVEFJTlMgPSB0cnVlOwotCi0JZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0RFU0NSSVBUSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluczsKLQotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNldmllciB3aXRoIHRoZSBkZWZhdWx0IG5hbWUuCi0JICogCi0JICovCi0JcHVibGljIEJvb2ttYXJrRmlsdGVyKCkgewotCQl0aGlzKE1hcmtlck1lc3NhZ2VzLk1hcmtlckZpbHRlcl9kZWZhdWx0RmlsdGVyTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNldmllciB3aXRoIHRoZSBmaWx0ZXJOYW1lCi0JICogCi0JICogQHBhcmFtIGZpbHRlck5hbWUKLQkgKi8KLQlwdWJsaWMgQm9va21hcmtGaWx0ZXIoU3RyaW5nIGZpbHRlck5hbWUpIHsKLQkJc3VwZXIoZmlsdGVyTmFtZSwgbmV3IFN0cmluZ1tdIHsgSU1hcmtlci5CT09LTUFSSyB9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWZmIHRoZSBnaXZlbiBtYXJrZXIgaXMgYWNjZXB0ZWQgYnkgdGhpcyBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3RNYXJrZXIoQ29uY3JldGVNYXJrZXIgbWFya2VyKSB7Ci0JCXJldHVybiAhaXNFbmFibGVkKCkKLQkJCQl8fCAoc3VwZXIuc2VsZWN0TWFya2VyKG1hcmtlcikgJiYgc2VsZWN0QnlEZXNjcmlwdGlvbihtYXJrZXIpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0QnlEZXNjcmlwdGlvbihDb25jcmV0ZU1hcmtlciBtYXJrZXIpIHsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwgfHwgZGVzY3JpcHRpb24uZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0KLQkJU3RyaW5nIG1hcmtlckRlc2NyaXB0aW9uID0gbWFya2VyLmdldERlc2NyaXB0aW9uKCk7Ci0JCWludCBpbmRleCA9IG1hcmtlckRlc2NyaXB0aW9uLmluZGV4T2YoZGVzY3JpcHRpb24pOwotCQlyZXR1cm4gY29udGFpbnMgPyAoaW5kZXggPj0gMCkgOiAoaW5kZXggPCAwKTsKLQl9Ci0KLQlib29sZWFuIGdldENvbnRhaW5zKCkgewotCQlyZXR1cm4gY29udGFpbnM7Ci0JfQotCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0Jdm9pZCBzZXRDb250YWlucyhib29sZWFuIGNvbnRhaW5zKSB7Ci0JCXRoaXMuY29udGFpbnMgPSBjb250YWluczsKLQl9Ci0KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlckZpbHRlciNyZXNldFN0YXRlKCkKLQkgKi8KLQl2b2lkIHJlc2V0U3RhdGUoKSB7Ci0JCXN1cGVyLnJlc2V0U3RhdGUoKTsKLQkJY29udGFpbnMgPSBERUZBVUxUX0NPTlRBSU5TOwotCQlkZXNjcmlwdGlvbiA9IERFRkFVTFRfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlckZpbHRlciNyZXN0b3JlRmlsdGVyU2V0dGluZ3Mob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3MpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZUZpbHRlclNldHRpbmdzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncykgewotCi0JCXN1cGVyLnJlc3RvcmVGaWx0ZXJTZXR0aW5ncyhzZXR0aW5ncyk7Ci0KLQkJU3RyaW5nIHNldHRpbmcgPSBzZXR0aW5ncy5nZXQoVEFHX0NPTlRBSU5TKTsKLQotCQlpZiAoc2V0dGluZyAhPSBudWxsKQotCQkJY29udGFpbnMgPSBCb29sZWFuLnZhbHVlT2Yoc2V0dGluZykuYm9vbGVhblZhbHVlKCk7Ci0KLQkJc2V0dGluZyA9IHNldHRpbmdzLmdldChUQUdfREVTQ1JJUFRJT04pOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQlkZXNjcmlwdGlvbiA9IG5ldyBTdHJpbmcoc2V0dGluZyk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlckZpbHRlciNyZXN0b3JlRmlsdGVyU2V0dGluZ3Mob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZUZpbHRlclNldHRpbmdzKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJc3VwZXIucmVzdG9yZUZpbHRlclNldHRpbmdzKG1lbWVudG8pOwotCi0JCVN0cmluZyBzZXR0aW5nID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX0NPTlRBSU5TKTsKLQotCQlpZiAoc2V0dGluZyAhPSBudWxsKQotCQkJY29udGFpbnMgPSBCb29sZWFuLnZhbHVlT2Yoc2V0dGluZykuYm9vbGVhblZhbHVlKCk7Ci0KLQkJc2V0dGluZyA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19ERVNDUklQVElPTik7Ci0KLQkJaWYgKHNldHRpbmcgIT0gbnVsbCkKLQkJCWRlc2NyaXB0aW9uID0gbmV3IFN0cmluZyhzZXR0aW5nKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJGaWx0ZXIjc2F2ZUZpbHRlclNldHRpbmdzKG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVGaWx0ZXJTZXR0aW5ncyhJTWVtZW50byBtZW1lbnRvKSB7Ci0JCXN1cGVyLnNhdmVGaWx0ZXJTZXR0aW5ncyhtZW1lbnRvKTsKLQkJbWVtZW50by5wdXRTdHJpbmcoVEFHX0NPTlRBSU5TLCBTdHJpbmcudmFsdWVPZihjb250YWlucykpOwotCQltZW1lbnRvLnB1dFN0cmluZyhUQUdfREVTQ1JJUFRJT04sIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0Jvb2ttYXJrTWFya2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9Cb29rbWFya01hcmtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWI5YmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0Jvb2ttYXJrTWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIG1hcmtlciB2aXNpYmxlIGluIHRoZSBCb29rbWFya3Mgdmlldy4gQ3VycmVudGx5LCB0aGlzIGFkZHMgbm8gYWRkaXRpb25hbAotICogZmllbGRzIHRvIHRoZSBDb25jcmV0ZU1hcmtlciBjbGFzcy4gSG93ZXZlciwgaWYgYWRkaXRpb25hbCBmaWVsZHMgd2VyZSBhZGRlZCB0byB0aGUKLSAqIGJvb2ttYXJrIHZpZXcgdGhhdCBhcmUgbm90IGdlbmVyYWwgdG8gYWxsIHZpZXdzLCB0aGVzZSBmaWVsZHMgd291bGQgYmUgYWRkZWQgdG8gdGhpcwotICogY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBCb29rbWFya01hcmtlciBleHRlbmRzIENvbmNyZXRlTWFya2VyIHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0b0NvcHkKLSAgICAgKi8KLSAgICBwdWJsaWMgQm9va21hcmtNYXJrZXIoSU1hcmtlciB0b0NvcHkpIHsKLSAgICAgICAgc3VwZXIodG9Db3B5KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0Jvb2ttYXJrVmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQm9va21hcmtWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Zjg5ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvQm9va21hcmtWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFSW50ZXJuYWxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkNlbGxFZGl0b3JBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoZSBCb29rbWFya1ZpZXcgaXMgdGhlIG1hcmtlciB2aWV3IGZvciBib29rbWFya3MuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQm9va21hcmtWaWV3IGV4dGVuZHMgTWFya2VyVmlldyB7Ci0vLwotLy8JcHJpdmF0ZSBmaW5hbCBDb2x1bW5QaXhlbERhdGFbXSBERUZBVUxUX0NPTFVNTl9MQVlPVVRTID0gewotLy8JCQluZXcgQ29sdW1uUGl4ZWxEYXRhKDAsZmFsc2UsZmFsc2UpLAotLy8JCQluZXcgQ29sdW1uUGl4ZWxEYXRhKDIwMCksIG5ldyBDb2x1bW5QaXhlbERhdGEoNzUpLAotLy8JCQluZXcgQ29sdW1uUGl4ZWxEYXRhKDE1MCksIG5ldyBDb2x1bW5QaXhlbERhdGEoNjApIH07Ci0KLQlwcml2YXRlIGZpbmFsIElGaWVsZFtdIEhJRERFTl9GSUVMRFMgPSB7IG5ldyBGaWVsZENyZWF0aW9uVGltZSgpIH07Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBST09UX1RZUEVTID0geyBJTWFya2VyLkJPT0tNQVJLIH07Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBUQUJMRV9DT0xVTU5fUFJPUEVSVElFUyA9IHtVdGlsLkVNUFRZX1NUUklORywgSU1hcmtlci5NRVNTQUdFLAotCQlVdGlsLkVNUFRZX1NUUklORywKLQkJVXRpbC5FTVBUWV9TVFJJTkcsCi0JCVV0aWwuRU1QVFlfU1RSSU5HCi0JfTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfRElBTE9HX1NFQ1RJT04gPSAib3JnLmVjbGlwc2UudWkudmlld3MuYm9va21hcmsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIElGaWVsZFtdIFZJU0lCTEVfRklFTERTID0ge25ldyBGaWVsZER1bW15KCksIG5ldyBGaWVsZE1lc3NhZ2UoKSwKLQkJCW5ldyBGaWVsZFJlc291cmNlKCksIG5ldyBGaWVsZEZvbGRlcigpLCBuZXcgRmllbGRMaW5lTnVtYmVyKCkgfTsKLQotCXByaXZhdGUgSUNlbGxNb2RpZmllciBjZWxsTW9kaWZpZXIgPSBuZXcgSUNlbGxNb2RpZmllcigpIHsKLQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbmNyZXRlTWFya2VyCi0JCQkJCSYmIElNYXJrZXIuTUVTU0FHRS5lcXVhbHMocHJvcGVydHkpKQotCQkJCXJldHVybiAoKENvbmNyZXRlTWFya2VyKSBlbGVtZW50KS5nZXREZXNjcmlwdGlvbigpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEl0ZW0pIHsKLQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgZWxlbWVudDsKLQkJCQlPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotCi0JCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikgewotCQkJCQlJTWFya2VyIG1hcmtlciA9ICgoQ29uY3JldGVNYXJrZXIpIGRhdGEpLmdldE1hcmtlcigpOwotCi0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoIW1hcmtlci5nZXRBdHRyaWJ1dGUocHJvcGVydHkpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJCQlpZiAoSU1hcmtlci5NRVNTQUdFLmVxdWFscyhwcm9wZXJ0eSkpCi0JCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCB2YWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJRXJyb3JEaWFsb2cKLQkJCQkJCQkJLm9wZW5FcnJvcigKLQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJCQlNYXJrZXJNZXNzYWdlcy5lcnJvck1vZGlmeWluZ0Jvb2ttYXJrLCBudWxsLCBlLmdldFN0YXR1cygpKTsgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlciBjZWxsRWRpdG9yQWN0aW9uSGFuZGxlcjsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyVmlldyNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCi0JCVRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IGdldFZpZXdlcigpOwotCQlDZWxsRWRpdG9yIGNlbGxFZGl0b3JzW10gPSBuZXcgQ2VsbEVkaXRvclt0cmVlVmlld2VyLmdldFRyZWUoKQotCQkJCS5nZXRDb2x1bW5Db3VudCgpXTsKLQkJQ2VsbEVkaXRvciBkZXNjcmlwdGlvbkNlbGxFZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IodHJlZVZpZXdlcgotCQkJCS5nZXRUcmVlKCkpOwotCQljZWxsRWRpdG9yc1sxXSA9IGRlc2NyaXB0aW9uQ2VsbEVkaXRvcjsKLQkJdHJlZVZpZXdlci5zZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKGNlbGxNb2RpZmllcik7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhUQUJMRV9DT0xVTU5fUFJPUEVSVElFUyk7Ci0KLQkJY2VsbEVkaXRvckFjdGlvbkhhbmRsZXIgPSBuZXcgQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIoZ2V0Vmlld1NpdGUoKQotCQkJCS5nZXRBY3Rpb25CYXJzKCkpOwotCQljZWxsRWRpdG9yQWN0aW9uSGFuZGxlci5hZGRDZWxsRWRpdG9yKGRlc2NyaXB0aW9uQ2VsbEVkaXRvcik7Ci0JCWNlbGxFZGl0b3JBY3Rpb25IYW5kbGVyLnNldENvcHlBY3Rpb24oY29weUFjdGlvbik7Ci0JCWNlbGxFZGl0b3JBY3Rpb25IYW5kbGVyLnNldFBhc3RlQWN0aW9uKHBhc3RlQWN0aW9uKTsKLQkJY2VsbEVkaXRvckFjdGlvbkhhbmRsZXIuc2V0RGVsZXRlQWN0aW9uKGRlbGV0ZUFjdGlvbik7Ci0JCWNlbGxFZGl0b3JBY3Rpb25IYW5kbGVyLnNldFNlbGVjdEFsbEFjdGlvbihzZWxlY3RBbGxBY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjZWxsRWRpdG9yQWN0aW9uSGFuZGxlciAhPSBudWxsKQotCQkJY2VsbEVkaXRvckFjdGlvbkhhbmRsZXIuZGlzcG9zZSgpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlBYnN0cmFjdFVJUGx1Z2luIHBsdWdpbiA9IChBYnN0cmFjdFVJUGx1Z2luKSBQbGF0Zm9ybQotCQkJCS5nZXRQbHVnaW4oUGxhdGZvcm1VSS5QTFVHSU5fSUQpOwotCQlJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBwbHVnaW4uZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLQkJCQkuZ2V0U2VjdGlvbihUQUdfRElBTE9HX1NFQ1RJT04pOwotCi0JCWlmIChzZXR0aW5ncyA9PSBudWxsKQotCQkJc2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncy5hZGROZXdTZWN0aW9uKFRBR19ESUFMT0dfU0VDVElPTik7Ci0KLQkJcmV0dXJuIHNldHRpbmdzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuVGFibGVWaWV3I2dldFNvcnRpbmdGaWVsZHMoKQotCSAqLwotCXByb3RlY3RlZCBJRmllbGRbXSBnZXRTb3J0aW5nRmllbGRzKCkgewotCQlJRmllbGRbXSBhbGwgPSBuZXcgSUZpZWxkW1ZJU0lCTEVfRklFTERTLmxlbmd0aCArIEhJRERFTl9GSUVMRFMubGVuZ3RoXTsKLQkJCi0JCVN5c3RlbS5hcnJheWNvcHkoVklTSUJMRV9GSUVMRFMsIDAsIGFsbCwgMCwgVklTSUJMRV9GSUVMRFMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShISURERU5fRklFTERTLCAwLCBhbGwsIFZJU0lCTEVfRklFTERTLmxlbmd0aCwgSElEREVOX0ZJRUxEUy5sZW5ndGgpOwotCQkKLQkJcmV0dXJuIGFsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5UYWJsZVZpZXcjZ2V0QWxsRmllbGRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZWxkW10gZ2V0QWxsRmllbGRzKCkgewotCQlyZXR1cm4gZ2V0U29ydGluZ0ZpZWxkcygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRSb290VHlwZXMoKSB7Ci0JCXJldHVybiBST09UX1RZUEVTOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24sCi0JCQlib29sZWFuIHJldmVhbCkgewotCQkvLyBUT0RPOiBhZGRlZCBiZWNhdXNlIG5pY2sgZG9lc24ndCBsaWtlIHB1YmxpYyBBUEkgaW5oZXJpdGVkIGZyb20KLQkJLy8gaW50ZXJuYWwgY2xhc3NlcwotCQlzdXBlci5zZXRTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbiwgcmV2ZWFsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyVmlldyNnZXRNYXJrZXJUeXBlcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1hcmtlclR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgSU1hcmtlci5CT09LTUFSSyB9OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyVmlldyNjcmVhdGVGaWx0ZXJzRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhbG9nTWFya2VyRmlsdGVyIGNyZWF0ZUZpbHRlcnNEaWFsb2coKSB7Ci0KLQkJTWFya2VyRmlsdGVyW10gZmlsdGVycyA9IGdldFVzZXJGaWx0ZXJzKCk7Ci0JCUJvb2ttYXJrRmlsdGVyW10gYm9va21hcmtGaWx0ZXJzID0gbmV3IEJvb2ttYXJrRmlsdGVyW2ZpbHRlcnMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShmaWx0ZXJzLCAwLCBib29rbWFya0ZpbHRlcnMsIDAsIGZpbHRlcnMubGVuZ3RoKTsKLQkJcmV0dXJuIG5ldyBEaWFsb2dCb29rbWFya0ZpbHRlcihnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgYm9va21hcmtGaWx0ZXJzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0YXRpY0NvbnRleHRJZCgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuUExVR0lOX0lEICsgIi5ib29rbWFya192aWV3X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJWaWV3I2NyZWF0ZUZpbHRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBNYXJrZXJGaWx0ZXIgY3JlYXRlRmlsdGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuZXcgQm9va21hcmtGaWx0ZXIobmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJWaWV3I2dldFNlY3Rpb25UYWcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvblRhZygpIHsKLQkJcmV0dXJuIFRBR19ESUFMT0dfU0VDVElPTjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJWaWV3I2ZpbGxDb250ZXh0TWVudUFkZGl0aW9ucyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXZvaWQgZmlsbENvbnRleHRNZW51QWRkaXRpb25zKElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCS8vRG8gbm90aGluZyBpbiB0aGlzIHZpZXcKLQkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyVmlldyNnZXRNYXJrZXJFbmFibGVtZW50UHJlZmVyZW5jZU5hbWUoKQotCSAqLwotCVN0cmluZyBnZXRNYXJrZXJFbmFibGVtZW50UHJlZmVyZW5jZU5hbWUoKSB7Ci0JCXJldHVybiBJREVJbnRlcm5hbFByZWZlcmVuY2VzLkxJTUlUX0JPT0tNQVJLUzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJWaWV3I2dldE1hcmtlckxpbWl0UHJlZmVyZW5jZU5hbWUoKQotCSAqLwotCVN0cmluZyBnZXRNYXJrZXJMaW1pdFByZWZlcmVuY2VOYW1lKCkgewotCQlyZXR1cm4gSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5CT09LTUFSS1NfTElNSVQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyVmlldyNnZXRGaWx0ZXJzUHJlZmVyZW5jZU5hbWUoKQotCSAqLwotCVN0cmluZyBnZXRGaWx0ZXJzUHJlZmVyZW5jZU5hbWUoKSB7Ci0JCXJldHVybiBJREVJbnRlcm5hbFByZWZlcmVuY2VzLkJPT0tNQVJLU19GSUxURVJTOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0NhdGVnb3J5U29ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9DYXRlZ29yeVNvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjUxNDg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0NhdGVnb3J5U29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLQotLyoqCi0gKiBDYXRlZ29yeVNvcnRlciBpcyB0aGUgc29ydGVyIHRoYXQgdGFrZXMgY2F0ZWdvcmllcyBhbmQgdGhlIHZpZXdlciBpbnRvCi0gKiBhY2NvdW50LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeVNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCVRhYmxlU29ydGVyIGlubmVyU29ydGVyOwotCi0JSUZpZWxkIGNhdGVnb3J5RmllbGQ7Ci0KLQlib29sZWFuIHJldmVyc2VTb3J0ID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHX0ZJRUxEID0gImNhdGVnb3J5RmllbGQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyIHdyYXBwaW5nIGEgc29ydGVyLgotCSAqIAotCSAqIEBwYXJhbSBzb3J0ZXIKLQkgKi8KLQlDYXRlZ29yeVNvcnRlcihUYWJsZVNvcnRlciBzb3J0ZXIpIHsKLQkJaW5uZXJTb3J0ZXIgPSBzb3J0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ29tcGFyZSBvYmoxIGFuZCBvYmogc3RhcnRpbmcgd2l0aCBmaWVsZCBkZXB0aC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqMQotCSAqIEBwYXJhbSBvYmoyCi0JICogQHBhcmFtIGRlcHRoCi0JICogQHBhcmFtIGNvbnRpbnVlU2VhcmNoaW5nCi0JICogQHJldHVybiBpbnQKLQkgKiBAc2VlIFZpZXdlclNvcnRlciNjb21wYXJlKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JaW50IGNvbXBhcmUoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyLCBpbnQgZGVwdGgsIGJvb2xlYW4gY29udGludWVTZWFyY2hpbmcpIHsKLQotCQlpZiAob2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCB8fCAhKG9iajEgaW5zdGFuY2VvZiBNYXJrZXJOb2RlKQotCQkJCXx8ICEob2JqMiBpbnN0YW5jZW9mIE1hcmtlck5vZGUpKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCU1hcmtlck5vZGUgbWFya2VyMTsKLQkJTWFya2VyTm9kZSBtYXJrZXIyOwotCQlpZiAocmV2ZXJzZVNvcnQpIHsKLQkJCW1hcmtlcjEgPSAoTWFya2VyTm9kZSkgb2JqMjsKLQkJCW1hcmtlcjIgPSAoTWFya2VyTm9kZSkgb2JqMTsKLQkJfSBlbHNlIHsKLQkJCW1hcmtlcjEgPSAoTWFya2VyTm9kZSkgb2JqMTsKLQkJCW1hcmtlcjIgPSAoTWFya2VyTm9kZSkgb2JqMjsKLQkJfQotCi0JCWlmICghbWFya2VyMS5pc0NvbmNyZXRlKCkgfHwgIW1hcmtlcjIuaXNDb25jcmV0ZSgpKQotCQkJcmV0dXJuIG1hcmtlcjEuZ2V0RGVzY3JpcHRpb24oKS5jb21wYXJlVG8obWFya2VyMi5nZXREZXNjcmlwdGlvbigpKTsKLQotCQlpZiAoY2F0ZWdvcnlGaWVsZCA9PSBudWxsKQotCQkJcmV0dXJuIGlubmVyU29ydGVyLmNvbXBhcmUobWFya2VyMSwgbWFya2VyMiwgZGVwdGgsCi0JCQkJCWNvbnRpbnVlU2VhcmNoaW5nKTsKLQotCQlpZiAoZGVwdGggPT0gMCkgeyAvLyBJcyB0aGlzIHRoZSBoaWVyYWNoeSBjaGVjawotCQkJaW50IHJlc3VsdCA9IGNhdGVnb3J5RmllbGQuY29tcGFyZShtYXJrZXIxLCBtYXJrZXIyKTsKLQkJCWlmIChjb250aW51ZVNlYXJjaGluZyAmJiByZXN1bHQgPT0gMCkKLQkJCQlyZXR1cm4gaW5uZXJTb3J0ZXIuY29tcGFyZShtYXJrZXIxLCBtYXJrZXIyLCAwLAotCQkJCQkJY29udGludWVTZWFyY2hpbmcpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8vIE5vdyBoZWFkIGZvciB0aGUgdGFibGUgc29ydGVyCi0JCXJldHVybiBpbm5lclNvcnRlci5jb21wYXJlKG1hcmtlcjEsIG1hcmtlcjIsIGRlcHRoIC0gMSwKLQkJCQljb250aW51ZVNlYXJjaGluZyk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyI2NvbXBhcmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlyZXR1cm4gY29tcGFyZShlMSwgZTIsIDAsIHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJcmV0dXJuIGNvbXBhcmUoYXJnMCwgYXJnMSwgMCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjYXRlZ29yeSBmaWVsZC4KLQkgKiAKLQkgKiBAcmV0dXJuIElGaWVsZAotCSAqLwotCXB1YmxpYyBJRmllbGQgZ2V0Q2F0ZWdvcnlGaWVsZCgpIHsKLQkJcmV0dXJuIGNhdGVnb3J5RmllbGQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBmaWVsZCB0aGF0IHdlIGFyZSBjYXRlZ29yaXppbmcgYnkuCi0JICogCi0JICogQHBhcmFtIGZpZWxkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlGaWVsZChJRmllbGQgZmllbGQpIHsKLQkJdGhpcy5jYXRlZ29yeUZpZWxkID0gZmllbGQ7Ci0JCXJldmVyc2VTb3J0ID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV2ZXJzZSB0aGUgZGlyZWN0aW9uIHdlIGFyZSBzb3J0aW5nIGluCi0JICovCi0JcHVibGljIHZvaWQgcmV2ZXJzZVNvcnREaXJlY3Rpb24oKSB7Ci0JCXJldmVyc2VTb3J0ID0gIXJldmVyc2VTb3J0OwotCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBpbm5lciBzb3J0ZXIgdG8gdGhlIG5ldyBzb3J0ZXIuCi0JICogQHBhcmFtIHNvcnRlcjIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZVNvcnRlcihUYWJsZVNvcnRlciBzb3J0ZXIyKSB7Ci0JCWlubmVyU29ydGVyID0gc29ydGVyMjsKLQkJCi0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIHJlY2VpdmVyLgotCSAqIEBwYXJhbSBkaWFsb2dTZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MpIHsKLQkJaWYgKGRpYWxvZ1NldHRpbmdzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGRpYWxvZ1NldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oVGFibGVTb3J0ZXIuVEFHX0RJQUxPR19TRUNUSU9OKTsKLQkJaWYgKHNldHRpbmdzID09IG51bGwpIHsKLQkJCXNldHRpbmdzID0gZGlhbG9nU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihUYWJsZVNvcnRlci5UQUdfRElBTE9HX1NFQ1RJT04pOwotCQl9Ci0JCQotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBVdGlsLkVNUFRZX1NUUklORzsKLQkJaWYoY2F0ZWdvcnlGaWVsZCAhPSBudWxsKQotCQkJZGVzY3JpcHRpb24gPSBjYXRlZ29yeUZpZWxkLmdldERlc2NyaXB0aW9uKCk7Ci0JCQotCQlzZXR0aW5ncy5wdXQoVEFHX0ZJRUxELCBkZXNjcmlwdGlvbik7Ci0JCQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSByZWNlaXZlciBmcm9tIHRoZSBkaWFsb2cgc2V0dGluZ3MuCi0JICogQHBhcmFtIGRpYWxvZ1NldHRpbmdzCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzLCBQcm9ibGVtVmlldyB2aWV3KSB7Ci0JCWlmIChkaWFsb2dTZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncwotCQkJCS5nZXRTZWN0aW9uKFRhYmxlU29ydGVyLlRBR19ESUFMT0dfU0VDVElPTik7Ci0JCWlmIChzZXR0aW5ncyA9PSBudWxsKSAKLQkJCXJldHVybjsKLQkJCi0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IHNldHRpbmdzLmdldChUQUdfRklFTEQpOwotCQkKLQkJaWYoZGVzY3JpcHRpb24gPT0gbnVsbCB8fCBkZXNjcmlwdGlvbi5sZW5ndGgoKSA9PSAwKXsKLQkJCWNhdGVnb3J5RmllbGQgPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQljYXRlZ29yeUZpZWxkID0gdmlldy5maW5kRmllbGQoZGVzY3JpcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0NvbmNyZXRlTWFya2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9Db25jcmV0ZU1hcmtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYwZDEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0NvbmNyZXRlTWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0aW9uS2V5OwotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IHN0b3JlcyB0aGUgc2FtZSB0eXBlIG9mIGluZm9ybWF0aW9uIGFzIHRoZSBJTWFya2VycwotICogdXNlZCBieSB0aGUgSURFLiBUaGlzIGNsYXNzIGV4aXN0cyBhcyBhbiBvcHRpbWl6YXRpb24uIFRoZSB2YXJpb3VzIGdldCogbWV0aG9kcwotICogb24gSU1hcmtlciBhcmUgZXh0cmVtZWx5IHNsb3csIHdoaWNoIG1ha2VzIGl0IHZlcnkgc2xvdyB0byBzb3J0IG1hcmtlcnMgKGZvciBleGFtcGxlLAotICogaW4gdGhlIHByb2JsZW1zIHZpZXcpLiBUaGlzIG1hcmtlciBjbGFzcyBzdG9yZXMgdGhlIGZpZWxkcyBpbiB0aGUgbW9zdCBlZmZpY2llbnQgZm9ybQotICogZm9yIHNvcnRpbmcgYW5kIGRpc3BsYXksIGJ1dCBuZWNlc3NhcmlseSByZW1vdmVzIHNvbWUgZ2VuZXJhbGl0eSBmcm9tIElNYXJrZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25jcmV0ZU1hcmtlciBleHRlbmRzIE1hcmtlck5vZGV7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNlTmFtZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGluRm9sZGVyOwotCi0gICAgcHJpdmF0ZSBDb2xsYXRpb25LZXkgZGVzY3JpcHRpb25LZXk7Ci0KLSAgICBwcml2YXRlIENvbGxhdGlvbktleSByZXNvdXJjZU5hbWVLZXk7Ci0KLSAgICBwcml2YXRlIGludCBsaW5lOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uU3RyaW5nOwotCi0gICAgcHJpdmF0ZSBsb25nIGNyZWF0aW9uVGltZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLSAgICBwcml2YXRlIElNYXJrZXIgbWFya2VyOwotCi0gICAgLyoqCi0gICAgICogQ2FjaGUgZm9yIHRoZSBtYXJrZXIgSUQuCi0gICAgICovCi0JcHJpdmF0ZSBsb25nIGlkID0gLTFMOwotCi0JcHJpdmF0ZSBNYXJrZXJOb2RlIG1hcmtlckNhdGVnb3J5OwotCi0JcHJpdmF0ZSBTdHJpbmcgc2hvcnRGb2xkZXI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ3JvdXA7Ci0KLQlwdWJsaWMgQ29uY3JldGVNYXJrZXIoSU1hcmtlciB0b0NvcHkpIHsKLSAgICAgICAgbWFya2VyID0gdG9Db3B5OwotICAgICAgICByZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIGFueSBjYWNoZWQgaW5mb3JtYXRpb24uIFRoaXMgZnJlZXMgdXAgc29tZSBtZW1vcnksIGJ1dCB3aWxsIHNsb3cgZG93bgotICAgICAqIHRoZSBuZXh0IGNvbXBhcmlzb24gb3BlcmF0aW9uLiBJdCBpcyBhIGdvb2QgaWRlYSB0byBjYWxsIHRoaXMgb24gYSBzZXQgb2YgbWFya2VycwotICAgICAqIGFmdGVyIHNvcnRpbmcgdGhlbSwgaW4gb3JkZXIgdG8gcmVkdWNlIHRoZWlyIG1lbW9yeSBjb3N0LiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgewotICAgICAgICByZXNvdXJjZU5hbWVLZXkgPSBudWxsOwotICAgICAgICBkZXNjcmlwdGlvbktleSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVmcmVzaCB0aGUgcHJvcGVydGllcyBvZiB0aGlzIG1hcmtlciBmcm9tIHRoZSB1bmRlcmx5aW5nIElNYXJrZXIgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICBjbGVhckNhY2hlKCk7Ci0KLSAgICAgICAgZGVzY3JpcHRpb24gPSBVdGlsLmdldFByb3BlcnR5KElNYXJrZXIuTUVTU0FHRSwgbWFya2VyKTsKLSAgICAgICAgcmVzb3VyY2VOYW1lID0gVXRpbC5nZXRSZXNvdXJjZU5hbWUobWFya2VyKTsKLSAgICAgICAgaW5Gb2xkZXIgPSBVdGlsLmdldENvbnRhaW5lck5hbWUobWFya2VyKTsKLSAgICAgICAgc2hvcnRGb2xkZXIgPSBudWxsOwotICAgICAgICBsaW5lID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSLCAtMSk7ICAKLSAgICAgICAgbG9jYXRpb25TdHJpbmcgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04sCi0JCQkJVXRpbC5FTVBUWV9TVFJJTkcpOwotCQkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyZWF0aW9uVGltZSA9IG1hcmtlci5nZXRDcmVhdGlvblRpbWUoKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBjcmVhdGlvblRpbWUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHR5cGUgPSBtYXJrZXIuZ2V0VHlwZSgpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICB0eXBlID0gVXRpbC5FTVBUWV9TVFJJTkc7IAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzdG9yZSB0aGUgbWFya2VyIElEIGxvY2FsbHkKLSAgICAgICAgaWQgPSBtYXJrZXIuZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotICAgICAgICByZXR1cm4gbWFya2VyLmdldFJlc291cmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlck5vZGUjZ2V0RGVzY3JpcHRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGF0aW9uS2V5IGdldERlc2NyaXB0aW9uS2V5KCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb25LZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb25LZXkgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb2xsYXRpb25LZXkoZGVzY3JpcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uS2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsYXRpb25LZXkgZ2V0UmVzb3VyY2VOYW1lS2V5KCkgewotICAgICAgICBpZiAocmVzb3VyY2VOYW1lS2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlc291cmNlTmFtZUtleSA9IENvbGxhdG9yLmdldEluc3RhbmNlKCkuZ2V0Q29sbGF0aW9uS2V5KAotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNvdXJjZU5hbWVLZXk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMaW5lKCkgewotICAgICAgICByZXR1cm4gbGluZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIGluRm9sZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldENyZWF0aW9uVGltZSgpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0aW9uVGltZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHVuZGVybHlpbmcgbWFya2VyIElEIHZhbHVlLgotICAgICAqIEByZXR1cm4gdGhlIG1hcmtlcidzIElELgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldElkKCkgewotICAgIAlyZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIElNYXJrZXIgZ2V0TWFya2VyKCkgewotICAgICAgICByZXR1cm4gbWFya2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIENvbmNyZXRlTWFya2VyKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29uY3JldGVNYXJrZXIgb3RoZXIgPSAoQ29uY3JldGVNYXJrZXIpIG9iamVjdDsKLQotICAgICAgICByZXR1cm4gb3RoZXIuZ2V0TWFya2VyKCkuZXF1YWxzKGdldE1hcmtlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZ2V0TWFya2VyKCkuaGFzaENvZGUoKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGNhdGVnb3J5IHRoZSByZWNlaXZlciBpcyBpbi4KLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShNYXJrZXJOb2RlIGNhdGVnb3J5KSB7Ci0JCW1hcmtlckNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyTm9kZSNnZXRDaGlsZHJlbigpCi0JICovCi0JcHVibGljIE1hcmtlck5vZGVbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIFV0aWwuRU1QVFlfTUFSS0VSX0FSUkFZOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyTm9kZSNnZXRQYXJlbnQoKQotCSAqLwotCXB1YmxpYyBNYXJrZXJOb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG1hcmtlckNhdGVnb3J5OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyTm9kZSNpc0NvbmNyZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmNyZXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgZm9yIHRoZSBmb2xkZXIuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0Rm9sZGVyKCkgewotCQlpZihzaG9ydEZvbGRlciA9PSBudWxsKQotCQkJc2hvcnRGb2xkZXIgPSBVdGlsLmdldFNob3J0Q29udGFpbmVyTmFtZShtYXJrZXIpOwotCQlyZXR1cm4gc2hvcnRGb2xkZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXQgdGhlIGxvY2F0aW9uIHN0cmluZy4gSWYgdGhlIHtAbGluayBJTWFya2VyI0xPQ0FUSU9OIH0KLQkgKiBhdHRyaWJ1dGUgd2FzIG5vdCBzZXQgdGhlbiByZXR1cm4gYW4gZW1wdHkgU3RyaW5nLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblN0cmluZygpIHsKLQkJcmV0dXJuIGxvY2F0aW9uU3RyaW5nOwotCX0KLQotCi0JLyoqCi0JICogR2V0IHRoZSBncm91cCBmb3IgdGhlIHJlY2lldmVyLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZ3JvdXAuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHcm91cCgpIHsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZ3JvdXAgbmFtZS4KLQkgKiBAcGFyYW0gZ3JvdXAgdGhlIGdyb3VwIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcm91cChTdHJpbmcgZ3JvdXApIHsKLQkJdGhpcy5ncm91cCA9IGdyb3VwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0RlZmF1bHRNYXJrZXJSZXNvdXJjZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0RlZmF1bHRNYXJrZXJSZXNvdXJjZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwNzdlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9EZWZhdWx0TWFya2VyUmVzb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnRhc2tsaXN0LklUYXNrTGlzdFJlc291cmNlQWRhcHRlcjsKLQotLyoqCi0gKiBUaGUgRGVmYXVsdE1hcmtlclJlc291cmNlQWRhcHRlciBpcyB0aGUgZGVmYXVsdAotICogaW1wbGVtZW50YXRpb24gb2YgdGhlIElNYXJrZXJSZXNvdXJjZUFkYXB0ZXIgdXNlZCBieSB0aGUKLSAqIE1hcmtlclZpZXcgZm9yIHJlc291cmNlIGFkYXB0aW9uLgotICovCi1jbGFzcyBEZWZhdWx0TWFya2VyUmVzb3VyY2VBZGFwdGVyIGltcGxlbWVudHMgSVRhc2tMaXN0UmVzb3VyY2VBZGFwdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIElUYXNrTGlzdFJlc291cmNlQWRhcHRlciBzaW5nbGV0b247Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdE1hcmtlclJlc291cmNlQWRhcHRlci4KLSAgICAgKi8KLSAgICBEZWZhdWx0TWFya2VyUmVzb3VyY2VBZGFwdGVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBpbnN0YW5jZSB1c2VkIGZvciBNYXJrZXJWaWV3IGFkYXB0aW5nLgotICAgICAqLwotICAgIHN0YXRpYyBJVGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotICAgICAgICAgICAgc2luZ2xldG9uID0gbmV3IERlZmF1bHRNYXJrZXJSZXNvdXJjZUFkYXB0ZXIoKTsKLSAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElNYXJrZXJSZXNvdXJjZUFkYXB0ZXIjZ2V0QWZmZWN0ZWRSZXNvdXJjZShJQWRhcHRhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyBJUmVzb3VyY2UgZ2V0QWZmZWN0ZWRSZXNvdXJjZShJQWRhcHRhYmxlIGFkYXB0YWJsZSkgewotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBhZGFwdGFibGUuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCi0gICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIChJRmlsZSkgYWRhcHRhYmxlLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRGlhbG9nQm9va21hcmtGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0RpYWxvZ0Jvb2ttYXJrRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjM2MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRGlhbG9nQm9va21hcmtGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBEaWFsb2dCb29rbWFya0ZpbHRlciBpcyB0aGUgZmlsdGVyIGRpYWxvZyBmb3IgYm9va21hcmtzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERpYWxvZ0Jvb2ttYXJrRmlsdGVyIGV4dGVuZHMgRGlhbG9nTWFya2VyRmlsdGVyIHsKLQotCXByaXZhdGUgRGVzY3JpcHRpb25Hcm91cCBkZXNjcmlwdGlvbkdyb3VwOwotCi0JcHJpdmF0ZSBjbGFzcyBEZXNjcmlwdGlvbkdyb3VwIHsKLQkJcHJpdmF0ZSBMYWJlbCBkZXNjcmlwdGlvbkxhYmVsOwotCi0JCXByaXZhdGUgQ29tYm8gY29tYm87Ci0KLQkJcHJpdmF0ZSBUZXh0IGRlc2NyaXB0aW9uOwotCi0JCXByaXZhdGUgU3RyaW5nIGNvbnRhaW5zID0gTWFya2VyTWVzc2FnZXMuZmlsdGVyc0RpYWxvZ19jb250YWluczsKLQotCQlwcml2YXRlIFN0cmluZyBkb2VzTm90Q29udGFpbiA9IAotCQkJTWFya2VyTWVzc2FnZXMuZmlsdGVyc0RpYWxvZ19kb2VzTm90Q29udGFpbjsKLQotCQkvKioKLQkJICogQ3JlYXRlIGEgZGVzY3JpcHRpb24gZ3JvdXAuCi0JCSAqIAotCQkgKiBAcGFyYW0gcGFyZW50Ci0JCSAqLwotCQlwdWJsaWMgRGVzY3JpcHRpb25Hcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlkZXNjcmlwdGlvbkxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJZGVzY3JpcHRpb25MYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJZGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KAotCQkJCU1hcmtlck1lc3NhZ2VzLmZpbHRlcnNEaWFsb2dfZGVzY3JpcHRpb25MYWJlbCk7Ci0KLQkJCWNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCQljb21iby5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJY29tYm8uYWRkKGNvbnRhaW5zKTsKLQkJCWNvbWJvLmFkZChkb2VzTm90Q29udGFpbik7Ci0JCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCSAgICAgICAgCS8qIChub24tSmF2YWRvYykKLQkgICAgICAgIAkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgICAgICAgIAkgKi8KLQkgICAgICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JICAgICAgICAJCSAgdXBkYXRlRm9yU2VsZWN0aW9uKCk7Ci0JICAgICAgICAJfQotCSAgICAgICAgICB9KTsKLQkJCS8vIFByZXZlbnQgRXNjIGFuZCBSZXR1cm4gZnJvbSBjbG9zaW5nIHRoZSBkaWFsb2cgd2hlbiB0aGUgY29tYm8gaXMKLQkJCS8vIGFjdGl2ZS4KLQkJCWNvbWJvLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRQotCQkJCQkJCXx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLQkJCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWRlc2NyaXB0aW9uID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlkZXNjcmlwdGlvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJZGVzY3JpcHRpb24uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlEaWFsb2dCb29rbWFya0ZpbHRlci50aGlzLm1hcmtEaXJ0eSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0Q29udGFpbnMoKSB7Ci0JCQlyZXR1cm4gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSBjb21iby5pbmRleE9mKGNvbnRhaW5zKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvbnRhaW5zKGJvb2xlYW4gdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSkgewotCQkJCWNvbWJvLnNlbGVjdChjb21iby5pbmRleE9mKGNvbnRhaW5zKSk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbWJvLnNlbGVjdChjb21iby5pbmRleE9mKGRvZXNOb3RDb250YWluKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdGV4dCkgewotCQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJCWRlc2NyaXB0aW9uLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkIAotCQkJfSBlbHNlIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRUZXh0KHRleHQpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbi5nZXRUZXh0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogVXBkYXRlIHRoZSBlbmFibGVtZW50IGJhc2VkIG9uIGVuYWJsZWQuCi0JCSAqIEBwYXJhbSBlbmFibGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1cGRhdGVFbmFibGVtZW50KGJvb2xlYW4gZW5hYmxlZCkgewotCQkJZGVzY3JpcHRpb25MYWJlbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJY29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCWRlc2NyaXB0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gZmlsdGVycwotCSAqLwotCXB1YmxpYyBEaWFsb2dCb29rbWFya0ZpbHRlcihTaGVsbCBwYXJlbnRTaGVsbCwgQm9va21hcmtGaWx0ZXJbXSBmaWx0ZXJzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBmaWx0ZXJzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuRGlhbG9nTWFya2VyRmlsdGVyI2NyZWF0ZUF0dHJpYnV0ZXNBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVzQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDUsIGZhbHNlKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDc7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlkZXNjcmlwdGlvbkdyb3VwID0gbmV3IERlc2NyaXB0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLkRpYWxvZ01hcmtlckZpbHRlciN1cGRhdGVGaWx0ZXJGcm9tVUkob3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJGaWx0ZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRmlsdGVyRnJvbVVJKE1hcmtlckZpbHRlciBmaWx0ZXIpIHsKLQkJc3VwZXIudXBkYXRlRmlsdGVyRnJvbVVJKGZpbHRlcik7Ci0KLQkJQm9va21hcmtGaWx0ZXIgYm9va21hcmsgPSAoQm9va21hcmtGaWx0ZXIpIGZpbHRlcjsKLQkJYm9va21hcmsuc2V0Q29udGFpbnMoZGVzY3JpcHRpb25Hcm91cC5nZXRDb250YWlucygpKTsKLQkJYm9va21hcmsuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb25Hcm91cC5nZXREZXNjcmlwdGlvbigpLnRyaW0oKSk7Ci0JCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuRGlhbG9nTWFya2VyRmlsdGVyI3VwZGF0ZVVJV2l0aEZpbHRlcihvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlckZpbHRlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVSVdpdGhGaWx0ZXIoTWFya2VyRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci51cGRhdGVVSVdpdGhGaWx0ZXIoZmlsdGVyKTsKLQkJQm9va21hcmtGaWx0ZXIgYm9va21hcmsgPSAoQm9va21hcmtGaWx0ZXIpIGZpbHRlcjsKLQkJZGVzY3JpcHRpb25Hcm91cC5zZXRDb250YWlucyhib29rbWFyay5nZXRDb250YWlucygpKTsKLQkJZGVzY3JpcHRpb25Hcm91cC5zZXREZXNjcmlwdGlvbihib29rbWFyay5nZXREZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLkRpYWxvZ01hcmtlckZpbHRlciN1cGRhdGVFbmFibGVkU3RhdGUoYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbmFibGVkU3RhdGUoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLnVwZGF0ZUVuYWJsZWRTdGF0ZShlbmFibGVkKTsKLQkJZGVzY3JpcHRpb25Hcm91cC51cGRhdGVFbmFibGVtZW50KGVuYWJsZWQpOwotCX0KLQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vydmlldy5GaWx0ZXJzRGlhbG9nI3Jlc2V0UHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRQcmVzc2VkKCkgewotCQlkZXNjcmlwdGlvbkdyb3VwLnNldENvbnRhaW5zKEJvb2ttYXJrRmlsdGVyLkRFRkFVTFRfQ09OVEFJTlMpOwotCQlkZXNjcmlwdGlvbkdyb3VwLnNldERlc2NyaXB0aW9uKEJvb2ttYXJrRmlsdGVyLkRFRkFVTFRfREVTQ1JJUFRJT04pOwotCi0JCXN1cGVyLnJlc2V0UHJlc3NlZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dNYXJrZXJGaWx0ZXIjbmV3RmlsdGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIE1hcmtlckZpbHRlciBuZXdGaWx0ZXIoU3RyaW5nIG5ld05hbWUpIHsKLQotCQlyZXR1cm4gbmV3IEJvb2ttYXJrRmlsdGVyKG5ld05hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRGlhbG9nTWFya2VyRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9EaWFsb2dNYXJrZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0MWNlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9EaWFsb2dNYXJrZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVHJheURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBEaWFsb2cgd2hpY2ggYWxsb3dzIHVzZXIgdG8gbW9kaWZ5IGFsbCBzZXR0aW5ncyBvZiBhbgotICogb3JnLmVjbGlwc2UudWkudmlld3MuTWFya2VyRmlsdGVyIG9iamVjdC4gTm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3IKLSAqIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhbG9nTWFya2VyRmlsdGVyIGV4dGVuZHMgVHJheURpYWxvZyB7Ci0JLyoqCi0JICogYnV0dG9uIElEcwotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgUkVTRVRfSUQgPSBJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRDsKLQotCXN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUX1dPUktJTkdfU0VUX0lEID0gSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAxOwotCi0Jc3RhdGljIGZpbmFsIGludCBTRUxFQ1RfQUxMX0lEID0gSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAyOwotCi0Jc3RhdGljIGZpbmFsIGludCBERVNFTEVDVF9BTExfSUQgPSBJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDM7Ci0KLQlwcml2YXRlIGNsYXNzIFR5cGVzTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cwotCQkJSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiAoKEFic3RyYWN0Tm9kZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgbWFuYWdlcyBhIGdyb3VwIG9mIHdpZGdldHMgZm9yIHNlbGVjdGluZyBhIHdvcmtpbmcgc2V0IG1hcmtlcgotCSAqIGZpbHRlci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFdvcmtpbmdTZXRHcm91cCB7Ci0KLQkJcHJpdmF0ZSBCdXR0b24gYnV0dG9uOwotCi0JCXByaXZhdGUgQnV0dG9uIHNlbGVjdEJ1dHRvbjsKLQotCQkvKioKLQkJICogQ3JlYXRlcyB0aGUgd29ya2luZyBzZXQgZmlsdGVyIHNlbGVjdGlvbiB3aWRnZXRzLgotCQkgKiAKLQkJICogQHBhcmFtIHBhcmVudAotCQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlIG9mIHRoZSB3b3JraW5nIHNldCB3aWRnZXRzCi0JCSAqLwotCQlXb3JraW5nU2V0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJLy8gcmFkaW8gYnV0dG9uIGhhcyB0byBiZSBwYXJ0IG9mIG1haW4gcmFkaW8gYnV0dG9uIGdyb3VwCi0JCQlidXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihwYXJlbnQsCi0JCQkJCU1hcmtlck1lc3NhZ2VzLmZpbHRlcnNEaWFsb2dfbm9Xb3JraW5nU2V0KTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJQnV0dG9uIHJhZGlvID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSByYWRpby5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCXJhZGlvLmRpc3Bvc2UoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCXNlbGVjdEJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIFNFTEVDVF9XT1JLSU5HX1NFVF9JRCwKLQkJCQkJTWFya2VyTWVzc2FnZXMuZmlsdGVyc0RpYWxvZ193b3JraW5nU2V0U2VsZWN0LCBmYWxzZSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB3ZXRoZXIgb3Igbm90IGEgd29ya2luZyBzZXQgZmlsdGVyIHNob3VsZCBiZSB1c2VkCi0JCSAqIAotCQkgKiBAcmV0dXJuIHRydWU9YSB3b3JraW5nIHNldCBmaWx0ZXIgc2hvdWxkIGJlIHVzZWQgZmFsc2U9YSB3b3JraW5nIHNldAotCQkgKiAgICAgICAgIGZpbHRlciBzaG91bGQgbm90IGJlIHVzZWQKLQkJICovCi0JCWJvb2xlYW4gZ2V0U2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIGJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldCBmaWx0ZXIgb3IgbnVsbCBpZiBub25lIGlzIHNlbGVjdGVkLgotCQkgKiAKLQkJICogQHJldHVybiB0aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQgZmlsdGVyIG9yIG51bGwgaWYgbm9uZSBpcyBzZWxlY3RlZC4KLQkJICovCi0JCUlXb3JraW5nU2V0IGdldFdvcmtpbmdTZXQoKSB7Ci0JCQlyZXR1cm4gKElXb3JraW5nU2V0KSBidXR0b24uZ2V0RGF0YSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIHdvcmtpbmcgc2V0IGZpbHRlciBzZWxlY3Rpb24uCi0JCSAqIAotCQkgKiBAcGFyYW0gc2VsZWN0ZWQKLQkJICogICAgICAgICAgICB0cnVlPWEgd29ya2luZyBzZXQgZmlsdGVyIHNob3VsZCBiZSB1c2VkIGZhbHNlPW5vIHdvcmtpbmcKLQkJICogICAgICAgICAgICBzZXQgZmlsdGVyIHNob3VsZCBiZSB1c2VkCi0JCSAqLwotCQl2b2lkIHNldFNlbGVjdGlvbihib29sZWFuIHNlbGVjdGVkKSB7Ci0JCQlidXR0b24uc2V0U2VsZWN0aW9uKHNlbGVjdGVkKTsKLQkJCWlmIChzZWxlY3RlZCkgewotCQkJCWFueVJlc291cmNlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJYW55UmVzb3VyY2VJblNhbWVQcm9qZWN0QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJc2VsZWN0ZWRSZXNvdXJjZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXNlbGVjdGVkUmVzb3VyY2VBbmRDaGlsZHJlbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIE9wZW5zIHRoZSB3b3JraW5nIHNldCBzZWxlY3Rpb24gZGlhbG9nLgotCQkgKi8KLQkJdm9pZCBzZWxlY3RQcmVzc2VkKCkgewotCQkJSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0V29ya2luZ1NldE1hbmFnZXIoKS5jcmVhdGVXb3JraW5nU2V0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQkJCWdldFNoZWxsKCksIGZhbHNlKTsKLQkJCUlXb3JraW5nU2V0IHdvcmtpbmdTZXQgPSBnZXRXb3JraW5nU2V0KCk7Ci0KLQkJCWlmICh3b3JraW5nU2V0ICE9IG51bGwpIHsKLQkJCQlkaWFsb2cuc2V0U2VsZWN0aW9uKG5ldyBJV29ya2luZ1NldFtdIHsgd29ya2luZ1NldCB9KTsKLQkJCX0KLQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCW1hcmtEaXJ0eSgpOwotCQkJCUlXb3JraW5nU2V0W10gcmVzdWx0ID0gZGlhbG9nLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoID4gMCkgewotCQkJCQlzZXRXb3JraW5nU2V0KHJlc3VsdFswXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0V29ya2luZ1NldChudWxsKTsKLQkJCQl9Ci0JCQkJaWYgKGdldFNlbGVjdGlvbigpID09IGZhbHNlKSB7Ci0JCQkJCXNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUgc3BlY2lmaWVkIHdvcmtpbmcgc2V0LgotCQkgKiAKLQkJICogQHBhcmFtIHdvcmtpbmdTZXQKLQkJICogICAgICAgICAgICB0aGUgd29ya2luZyBzZXQKLQkJICovCi0JCXZvaWQgc2V0V29ya2luZ1NldChJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0JCQlidXR0b24uc2V0RGF0YSh3b3JraW5nU2V0KTsKLQkJCWlmICh3b3JraW5nU2V0ICE9IG51bGwpIHsKLQkJCQlidXR0b24uc2V0VGV4dChOTFMuYmluZCgKLQkJCQkJCU1hcmtlck1lc3NhZ2VzLmZpbHRlcnNEaWFsb2dfd29ya2luZ1NldCwgd29ya2luZ1NldAotCQkJCQkJCQkuZ2V0TGFiZWwoKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlidXR0b24uc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5maWx0ZXJzRGlhbG9nX25vV29ya2luZ1NldCk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCQlidXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWJzdHJhY3ROb2RlIGlzIHRoZSBhYnN0cmFjdCBzdXBlcmNsYXNzIG9mIHRoZSBub2RlIGVsZW1lbnRzIGZvcgotCSAqIE1hcmtlclR5cGVzLgotCSAqIAotCSAqLwotCXByaXZhdGUgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROb2RlIHsKLQotCQkvKioKLQkJICogR2V0IHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGUgcmVjZWl2ZXIuCi0JCSAqIAotCQkgKiBAcmV0dXJuIE9iamVjdAotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRQYXJlbnQoKTsKLQotCQkvKioKLQkJICogR2V0IHRoZSBuYW1lIG9mIHRoZSByZWNlaXZlci4KLQkJICogCi0JCSAqIEByZXR1cm4gU3RyaW5nCi0JCSAqLwotCQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSByZWNlaXZlciBoYXMgY2hpbGRyZW4uCi0JCSAqIAotCQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc0NoaWxkcmVuKCk7Ci0KLQkJLyoqCi0JCSAqIEdldCB0aGUgY2hpbGRyZW4gb2YgdGhlIHJlY2VpdmVyLgotCQkgKiAKLQkJICogQHJldHVybiBPYmplY3RbXQotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IE9iamVjdFtdIGdldENoaWxkcmVuKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIGEgY2F0ZWdvcnkgbm9kZS4KLQkJICogCi0JCSAqIEByZXR1cm4gYm9vbGVhbgotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDYXRlZ29yeSgpOwotCi0JfQotCi0JLyoqCi0JICogTWFya2VyVHlwZU5vZGUgaXMgdGhlIHdyYXBwZXIgZm9yIG1hcmtlciB0eXBlcy4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGNsYXNzIE1hcmtlclR5cGVOb2RlIGV4dGVuZHMgQWJzdHJhY3ROb2RlIHsKLQotCQlNYXJrZXJUeXBlIHR5cGU7Ci0KLQkJTWFya2VyQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd3JhcHBpbmcgbWFya2VyVHlwZS4KLQkJICogCi0JCSAqIEBwYXJhbSBtYXJrZXJUeXBlCi0JCSAqLwotCQlwdWJsaWMgTWFya2VyVHlwZU5vZGUoTWFya2VyVHlwZSBtYXJrZXJUeXBlKSB7Ci0JCQl0eXBlID0gbWFya2VyVHlwZTsKLQkJCW5vZGVUb1R5cGVNYXBwaW5nLnB1dChtYXJrZXJUeXBlLmdldElkKCksIHRoaXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgY2F0ZWdvcnkgb2YgdGhlIHJlY2VpdmVyLgotCQkgKiAKLQkJICogQHBhcmFtIGNhdGVnb3J5Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShNYXJrZXJDYXRlZ29yeSBjYXRlZ29yeSkgewotCQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCB0aGUgY2F0ZWdvcnkgZm9yIHRoZSByZWNlaXZlci4KLQkJICogCi0JCSAqIEByZXR1cm4gTWFya2VyQ2F0ZWdvcnkKLQkJICovCi0JCXB1YmxpYyBNYXJrZXJDYXRlZ29yeSBnZXRDYXRlZ29yeSgpIHsKLQkJCXJldHVybiBjYXRlZ29yeTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dNYXJrZXJGaWx0ZXIuQWJzdHJhY3ROb2RlI2dldENoaWxkcmVuKCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLkRpYWxvZ01hcmtlckZpbHRlci5BYnN0cmFjdE5vZGUjZ2V0UGFyZW50KCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIGNhdGVnb3J5OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLkRpYWxvZ01hcmtlckZpbHRlci5BYnN0cmFjdE5vZGUjaGFzQ2hpbGRyZW4oKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuRGlhbG9nTWFya2VyRmlsdGVyLkFic3RyYWN0Tm9kZSNnZXROYW1lKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0eXBlLmdldExhYmVsKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuRGlhbG9nTWFya2VyRmlsdGVyLkFic3RyYWN0Tm9kZSNpc0NhdGVnb3J5KCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQ2F0ZWdvcnkoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBtYXJrZXIgdHlwZSB0aGlzIGlzIHdyYXBwaW5nCi0JCSAqIEByZXR1cm4gT2JqZWN0Ci0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldE1hcmtlclR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBNYXJrZXJDYXRlZ29yeSBpcyBhIGRhdGEgdHlwZSB0byByZXByZXNlbnQgdGhlIGNhdGVnb3JpZXMgaW4gdGhlIHRyZWUKLQkgKiB2aWV3LgotCSAqIAotCSAqLwotCXByaXZhdGUgY2xhc3MgTWFya2VyQ2F0ZWdvcnkgZXh0ZW5kcyBBYnN0cmFjdE5vZGUgewotCi0JCVN0cmluZyBuYW1lOwotCi0JCUNvbGxlY3Rpb24gdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd2l0aCBuYW1lIGNhdGVnb3J5TmFtZS4KLQkJICogCi0JCSAqIEBwYXJhbSBjYXRlZ29yeU5hbWUKLQkJICovCi0JCXB1YmxpYyBNYXJrZXJDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnlOYW1lKSB7Ci0JCQluYW1lID0gY2F0ZWdvcnlOYW1lOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLkRpYWxvZ01hcmtlckZpbHRlci5BYnN0cmFjdE5vZGUjZ2V0TmFtZSgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgbWFya2VyVHlwZSB0byB0aGUgbGlzdCBvZiB0eXBlcy4KLQkJICogCi0JCSAqIEBwYXJhbSBtYXJrZXJUeXBlCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGQoTWFya2VyVHlwZU5vZGUgbWFya2VyVHlwZSkgewotCQkJdHlwZXMuYWRkKG1hcmtlclR5cGUpOwotCQkJbWFya2VyVHlwZS5zZXRDYXRlZ29yeSh0aGlzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG1hcmtlciB0eXBlcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgotCQkgKiAKLQkJICogQHJldHVybiBPYmplY3RbXQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldE1hcmtlclR5cGVzKCkgewotCQkJcmV0dXJuIHR5cGVzLnRvQXJyYXkoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dNYXJrZXJGaWx0ZXIuQWJzdHJhY3ROb2RlI2dldENoaWxkcmVuKCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsKLQkJCXJldHVybiBnZXRNYXJrZXJUeXBlcygpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLkRpYWxvZ01hcmtlckZpbHRlci5BYnN0cmFjdE5vZGUjZ2V0UGFyZW50KCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuRGlhbG9nTWFya2VyRmlsdGVyLkFic3RyYWN0Tm9kZSNoYXNDaGlsZHJlbigpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLkRpYWxvZ01hcmtlckZpbHRlci5BYnN0cmFjdE5vZGUjaXNDYXRlZ29yeSgpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0NhdGVnb3J5KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgTWFya2VyRmlsdGVyW10gZmlsdGVyczsKLQotCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyIHR5cGVzVmlld2VyOwotCi0JcHJpdmF0ZSBCdXR0b24gYW55UmVzb3VyY2VCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBhbnlSZXNvdXJjZUluU2FtZVByb2plY3RCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RlZFJlc291cmNlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0ZWRSZXNvdXJjZUFuZENoaWxkcmVuQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0KLQlwcml2YXRlIFdvcmtpbmdTZXRHcm91cCB3b3JraW5nU2V0R3JvdXA7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlydHkgPSBmYWxzZTsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBmaWx0ZXJzTGlzdDsKLQotCXByaXZhdGUgTWFya2VyRmlsdGVyW10gc2VsZWN0ZWRGaWx0ZXJzOwotCi0JcHJpdmF0ZSBIYXNoTWFwIG5vZGVUb1R5cGVNYXBwaW5nID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSVRyZWVDb250ZW50UHJvdmlkZXIgdHlwZXNDb250ZW50UHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBmaWx0ZXJzTGlzdAotCSAqLwotCURpYWxvZ01hcmtlckZpbHRlcihTaGVsbCBwYXJlbnRTaGVsbCwgTWFya2VyRmlsdGVyW10gZmlsdGVyc0xpc3QpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRGaWx0ZXJzKGZpbHRlcnNMaXN0KTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGZpbHRlcnMgaW4gdGhlIGZpbHRlcnNMaXN0IGJ5IGNvcHlpbmcgdGhlbS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5pdGlhbEZpbHRlcnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RmlsdGVycyhNYXJrZXJGaWx0ZXJbXSBpbml0aWFsRmlsdGVycykgewotCQlNYXJrZXJGaWx0ZXJbXSBuZXdNYXJrZXJzID0gbmV3IE1hcmtlckZpbHRlcltpbml0aWFsRmlsdGVycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluaXRpYWxGaWx0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNYXJrZXJGaWx0ZXIgbmV3RmlsdGVyOwotCQkJdHJ5IHsKLQkJCQluZXdGaWx0ZXIgPSBpbml0aWFsRmlsdGVyc1tpXS5tYWtlQ2xvbmUoKTsKLQkJCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLAotCQkJCQkJTWFya2VyTWVzc2FnZXMuTWFya2VyRmlsdGVyRGlhbG9nX2Vycm9yVGl0bGUsCi0JCQkJCQlNYXJrZXJNZXNzYWdlcy5NYXJrZXJGaWx0ZXJEaWFsb2dfZmFpbGVkRmlsdGVyTWVzc2FnZSwKLQkJCQkJCVV0aWwuZXJyb3JTdGF0dXMoZXhjZXB0aW9uKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQluZXdNYXJrZXJzW2ldID0gbmV3RmlsdGVyOwotCi0JCX0KLQkJZmlsdGVycyA9IG5ld01hcmtlcnM7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gUkVTRVRfSUQpIHsKLQkJCXJlc2V0UHJlc3NlZCgpOwotCQkJbWFya0RpcnR5KCk7Ci0JCX0gZWxzZSBpZiAoYnV0dG9uSWQgPT0gU0VMRUNUX1dPUktJTkdfU0VUX0lEKSB7Ci0JCQl3b3JraW5nU2V0R3JvdXAuc2VsZWN0UHJlc3NlZCgpOwotCQl9IGVsc2UgaWYgKGJ1dHRvbklkID09IFNFTEVDVF9BTExfSUQpIHsKLQkJCXR5cGVzVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCX0gZWxzZSBpZiAoYnV0dG9uSWQgPT0gREVTRUxFQ1RfQUxMX0lEKSB7Ci0JCQl0eXBlc1ZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpbmRvdy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoTWFya2VyTWVzc2FnZXMuZmlsdGVyc0RpYWxvZ190aXRsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVzZXRBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlCdXR0b24gcmVzZXQgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlyZXNldC5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLnJlc3RvcmVEZWZhdWx0c190ZXh0KTsKLQkJcmVzZXQuc2V0RGF0YShuZXcgSW50ZWdlcihSRVNFVF9JRCkpOwotCi0JCXJlc2V0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlidXR0b25QcmVzc2VkKCgoSW50ZWdlcikgZXZlbnQud2lkZ2V0LmdldERhdGEoKSkuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlpbnQgd2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlQb2ludCBtaW5TaXplID0gcmVzZXQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heCh3aWR0aEhpbnQsIG1pblNpemUueCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlyZXNldC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGVjayBib3ggYnV0dG9uIHdpdGggdGhlIGdpdmVuIHBhcmVudCBhbmQgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNoZWNrIGJveAotCSAqIEBwYXJhbSBncmFiUm93Ci0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPnRvIGdyYWIgdGhlIHJlbWFpbmluZyBob3Jpem9udGFsIHNwYWNlLAotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEByZXR1cm4gdGhlIGNoZWNrIGJveCBidXR0b24KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUNoZWNrYm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJYm9vbGVhbiBncmFiUm93KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJaWYgKGdyYWJSb3cpIHsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVGb3JTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCWJ1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ibyBib3ggd2l0aCB0aGUgZ2l2ZW4gcGFyZW50LCBpdGVtcywgYW5kIHNlbGVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGl0ZW1zCi0JICogICAgICAgICAgICB0aGUgaXRlbXMgZm9yIHRoZSBjb21ibyBib3gKLQkgKiBAcGFyYW0gc2VsZWN0aW9uSW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBzZWxlY3QKLQkgKiBAcmV0dXJuIHRoZSBjb21ibyBib3gKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gaXRlbXMsCi0JCQlpbnQgc2VsZWN0aW9uSW5kZXgpIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljb21iby5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQljb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JCWNvbWJvLnNlbGVjdChzZWxlY3Rpb25JbmRleCk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXVwZGF0ZUZvclNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCWRpYWxvZ0FyZWEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJY3JlYXRlRmlsdGVyc0FyZWEoZGlhbG9nQXJlYSk7Ci0KLQkJQ29tcG9zaXRlIHNlbGVjdGVkQ29tcG9zaXRlID0gY3JlYXRlU2VsZWN0ZWRGaWx0ZXJBcmVhKGRpYWxvZ0FyZWEpOwotCQlzZWxlY3RlZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsCi0JCQkJdHJ1ZSkpOwotCQl1cGRhdGVVSUZyb21GaWx0ZXIoKTsKLQotCQlmaWx0ZXJzTGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsdGVyc1swXSkpOwotCi0JCWFwcGx5RGlhbG9nRm9udChkaWFsb2dBcmVhKTsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBsaXN0IGluIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcGFyYW0gZGlhbG9nQXJlYQotCSAqLwotCS8qKgotCSAqIEBwYXJhbSBkaWFsb2dBcmVhCi0JICovCi0Jdm9pZCBjcmVhdGVGaWx0ZXJzQXJlYShDb21wb3NpdGUgZGlhbG9nQXJlYSkgewotCi0JCUNvbXBvc2l0ZSBsaXN0QXJlYSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlsaXN0QXJlYS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCB0cnVlKSk7Ci0JCWxpc3RBcmVhLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlMYWJlbCB0aXRsZSA9IG5ldyBMYWJlbChsaXN0QXJlYSwgU1dULk5PTkUpOwotCQl0aXRsZS5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLk1hcmtlckZpbHRlcl9maWx0ZXJzVGl0bGUpOwotCQlmaWx0ZXJzTGlzdCA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGxpc3RBcmVhLCBTV1QuQk9SREVSKTsKLQkJZmlsdGVyc0xpc3Quc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiBmaWx0ZXJzOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvLyBEbyBub3RoaW5nCi0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwKLQkJCQkJT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJLy8gRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQlmaWx0ZXJzTGlzdC5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoTWFya2VyRmlsdGVyKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbHRlcnNMaXN0LmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCSgoTWFya2VyRmlsdGVyKSBldmVudC5nZXRFbGVtZW50KCkpLnNldEVuYWJsZWQoZXZlbnQKLQkJCQkJCS5nZXRDaGVja2VkKCkpOwotCi0JCQl9Ci0JCX0pOwotCi0JCXNlbGVjdGVkRmlsdGVycyA9IG5ldyBNYXJrZXJGaWx0ZXJbXSB7IGZpbHRlcnNbMF0gfTsKLQkJZmlsdGVyc0xpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGVkRmlsdGVycykpOwotCi0JCWZpbHRlcnNMaXN0Ci0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCQkJCQkgKi8KLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZUZpbHRlckZyb21VSSgpOwotCQkJCQkJc2V0U2VsZWN0ZWRGaWx0ZXIoZXZlbnQpOwotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQlmaWx0ZXJzTGlzdC5zZXRJbnB1dCh0aGlzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaWx0ZXJzTGlzdC5zZXRDaGVja2VkKGZpbHRlcnNbaV0sIGZpbHRlcnNbaV0uaXNFbmFibGVkKCkpOwotCQl9Ci0KLQkJZmlsdGVyc0xpc3QuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIHRydWUpKTsKLQotCQlDb21wb3NpdGUgYnV0dG9ucyA9IG5ldyBDb21wb3NpdGUobGlzdEFyZWEsIFNXVC5OT05FKTsKLQkJYnV0dG9ucy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlCdXR0b24gYWRkTmV3ID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCWFkZE5ldy5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLk1hcmtlckZpbHRlcl9hZGRGaWx0ZXJOYW1lKTsKLQkJYWRkTmV3LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlucHV0RGlhbG9nIG5ld0RpYWxvZyA9IG5ldyBJbnB1dERpYWxvZyhnZXRTaGVsbCgpLAotCQkJCQkJTWFya2VyTWVzc2FnZXMuTWFya2VyRmlsdGVyRGlhbG9nX3RpdGxlLAotCQkJCQkJTWFya2VyTWVzc2FnZXMuTWFya2VyRmlsdGVyRGlhbG9nX21lc3NhZ2UsCi0JCQkJCQlNYXJrZXJNZXNzYWdlcy5NYXJrZXJGaWx0ZXJfbmV3RmlsdGVyTmFtZSwKLQkJCQkJCW5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCQkJICogCi0JCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JCQkJCQkJICovCi0JCQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQkJCWlmIChuZXdUZXh0Lmxlbmd0aCgpID09IDApCi0JCQkJCQkJCQlyZXR1cm4gTWFya2VyTWVzc2FnZXMuTWFya2VyRmlsdGVyRGlhbG9nX2VtcHR5TWVzc2FnZTsKLQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJbmV3RGlhbG9nLm9wZW4oKTsKLQkJCQlTdHJpbmcgbmV3TmFtZSA9IG5ld0RpYWxvZy5nZXRWYWx1ZSgpOwotCQkJCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCQkJY3JlYXRlTmV3RmlsdGVyKG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIHJlbW92ZSA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQlyZW1vdmUuc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5NYXJrZXJGaWx0ZXJfZGVsZXRlU2VsZWN0ZWROYW1lKTsKLQkJcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlbW92ZUZpbHRlcnMoZmlsdGVyc0xpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNlbGVjdGVkIGZpbHRlciBmcm9tIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNlbGVjdGVkRmlsdGVyKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKTsKLQkJCU1hcmtlckZpbHRlcltdIHNlbGVjdGVkID0gbmV3IE1hcmtlckZpbHRlcltsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkoc2VsZWN0ZWQpOwotCQkJc2VsZWN0ZWRGaWx0ZXJzID0gc2VsZWN0ZWQ7Ci0KLQkJfSBlbHNlCi0JCQlzZWxlY3RlZEZpbHRlcnMgPSBuZXcgTWFya2VyRmlsdGVyWzBdOwotCQl1cGRhdGVVSUZyb21GaWx0ZXIoKTsKLQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlsdGVycyBpbiBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZpbHRlcnMoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlMaXN0IHRvUmVtb3ZlID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKTsKLQkJCU1hcmtlckZpbHRlcltdIG5ld0ZpbHRlcnMgPSBuZXcgTWFya2VyRmlsdGVyW2ZpbHRlcnMubGVuZ3RoCi0JCQkJCS0gdG9SZW1vdmUuc2l6ZSgpXTsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodG9SZW1vdmUuY29udGFpbnMoZmlsdGVyc1tpXSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCW5ld0ZpbHRlcnNbaW5kZXhdID0gZmlsdGVyc1tpXTsKLQkJCQlpbmRleCsrOwotCQkJfQotCi0JCQlmaWx0ZXJzID0gbmV3RmlsdGVyczsKLQkJCWZpbHRlcnNMaXN0LnJlZnJlc2goKTsKLQkJCXVwZGF0ZVVJRnJvbUZpbHRlcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGZpbHRlciBjYWxsZWQgbmV3TmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVOZXdGaWx0ZXIoU3RyaW5nIG5ld05hbWUpIHsKLQkJTWFya2VyRmlsdGVyW10gbmV3RmlsdGVycyA9IG5ldyBNYXJrZXJGaWx0ZXJbZmlsdGVycy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShmaWx0ZXJzLCAwLCBuZXdGaWx0ZXJzLCAwLCBmaWx0ZXJzLmxlbmd0aCk7Ci0JCU1hcmtlckZpbHRlciBmaWx0ZXIgPSBuZXdGaWx0ZXIobmV3TmFtZSk7Ci0JCW5ld0ZpbHRlcnNbZmlsdGVycy5sZW5ndGhdID0gZmlsdGVyOwotCQlmaWx0ZXJzID0gbmV3RmlsdGVyczsKLQkJZmlsdGVyc0xpc3QucmVmcmVzaCgpOwotCQlmaWx0ZXJzTGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsdGVyKSwgdHJ1ZSk7Ci0JCWZpbHRlcnNMaXN0LmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIENyYXRlIGEgbmV3RmlsdGVyIGNhbGxlZCBuZXdOYW1lCi0JICogCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKiBAcmV0dXJuIE1hcmtlckZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBNYXJrZXJGaWx0ZXIgbmV3RmlsdGVyKFN0cmluZyBuZXdOYW1lKTsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYXJlYSBmb3IgdGhlIHNlbGVjdGVkIGZpbHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVNlbGVjdGVkRmlsdGVyQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJQ29tcG9zaXRlIHNlbGVjdGVkQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc2VsZWN0ZWRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJQ29tcG9zaXRlIGxlZnRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNlbGVjdGVkQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxlZnRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlsZWZ0Q29tcG9zaXRlCi0JCQkJLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQljcmVhdGVSZXNvdXJjZUFyZWEobGVmdENvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUF0dHJpYnV0ZXNBcmVhKGxlZnRDb21wb3NpdGUpOwotCi0JCUNvbXBvc2l0ZSByaWdodENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2VsZWN0ZWRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY3JlYXRlVHlwZXNBcmVhKHJpZ2h0Q29tcG9zaXRlKTsKLQkJcmlnaHRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlyaWdodENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsCi0JCQkJdHJ1ZSkpOwotCi0JCWNyZWF0ZVNlcGFyYXRvckxpbmUoc2VsZWN0ZWRDb21wb3NpdGUpOwotCQljcmVhdGVSZXNldEFyZWEoc2VsZWN0ZWRDb21wb3NpdGUpOwotCi0JCXJldHVybiBzZWxlY3RlZENvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc2VwYXJhdG9yIGxpbmUgYWJvdmUgdGhlIE9LL0NhbmNlbCBidXR0b25zIGJhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2VwYXJhdG9yTGluZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIEJ1aWxkIHRoZSBzZXBhcmF0b3IgbGluZQotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmFkaW8gYnV0dG9uIHdpdGggdGhlIGdpdmVuIHBhcmVudCBhbmQgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNoZWNrIGJveAotCSAqIEByZXR1cm4gdGhlIHJhZGlvIGJveCBidXR0b24KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCWJ1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXVwZGF0ZUZvclNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBhcmVhIHNob3dpbmcgd2hpY2ggcmVzb3VyY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVzb3VyY2VBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZ3JvdXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJYW55UmVzb3VyY2VCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihncm91cCwKLQkJCQlNYXJrZXJNZXNzYWdlcy5maWx0ZXJzRGlhbG9nX2FueVJlc291cmNlKTsKLQkJYW55UmVzb3VyY2VJblNhbWVQcm9qZWN0QnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oZ3JvdXAsCi0JCQkJTWFya2VyTWVzc2FnZXMuZmlsdGVyc0RpYWxvZ19hbnlSZXNvdXJjZUluU2FtZVByb2plY3QpOyAvLyBhZGRlZAotCQkvLyBieQotCQkvLyBjYWdhdGF5a0BhY20ub3JnCi0JCXNlbGVjdGVkUmVzb3VyY2VCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihncm91cCwKLQkJCQlNYXJrZXJNZXNzYWdlcy5maWx0ZXJzRGlhbG9nX3NlbGVjdGVkUmVzb3VyY2UpOwotCQlzZWxlY3RlZFJlc291cmNlQW5kQ2hpbGRyZW5CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihncm91cCwKLQkJCQlNYXJrZXJNZXNzYWdlcy5maWx0ZXJzRGlhbG9nX3NlbGVjdGVkQW5kQ2hpbGRyZW4pOwotCQl3b3JraW5nU2V0R3JvdXAgPSBuZXcgV29ya2luZ1NldEdyb3VwKGdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBhcmVhIHNob3dpbmcgd2hpY2ggbWFya2VyIHR5cGVzIHNob3VsZCBiZSBpbmNsdWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVR5cGVzQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWFya2VyTWVzc2FnZXMuZmlsdGVyc0RpYWxvZ19zaG93SXRlbXNPZlR5cGUpOwotCi0JCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGNvbXBvc2l0ZSwgU1dULkNIRUNLIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMCi0JCQkJfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRyZWUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDAsIHRydWUpKTsKLQkJbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUsIDApOwotCi0JCXR5cGVzVmlld2VyID0gbmV3IENoZWNrYm94VHJlZVZpZXdlcih0cmVlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDEwMCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMjAwKTsKLQotCQl0eXBlc0NvbnRlbnRQcm92aWRlciA9IGdldFR5cGVzQ29udGVudFByb3ZpZGVyKCk7Ci0JCXR5cGVzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdHlwZXNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHR5cGVzQ29udGVudFByb3ZpZGVyKTsKLQkJdHlwZXNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihnZXRMYWJlbFByb3ZpZGVyKCkpOwotCQl0eXBlc1ZpZXdlci5zZXRTb3J0ZXIoZ2V0U29ydGVyKCkpOwotCQl0eXBlc1ZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJbWFya0RpcnR5KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCQkJYm9vbGVhbiBjaGVja2VkID0gZXZlbnQuZ2V0Q2hlY2tlZCgpOwotCQkJCXNldENoaWxkcmVuQ2hlY2tlZChlbGVtZW50LCBjaGVja2VkKTsKLQkJCQlzZXRQYXJlbnRDaGVja1N0YXRlKGVsZW1lbnQsIGNoZWNrZWQpOwotCQkJfQotCQl9KTsKLQkJdHlwZXNWaWV3ZXIuc2V0SW5wdXQoZ2V0U2VsZWN0ZWRGaWx0ZXIoKS5nZXRSb290VHlwZXMoKS50b0FycmF5KCkpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGJ1dHRvbkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWJ1dHRvbkxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uTGF5b3V0KTsKLQkJc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU0VMRUNUX0FMTF9JRCwKLQkJCQlNYXJrZXJNZXNzYWdlcy5maWx0ZXJzRGlhbG9nX3NlbGVjdEFsbCwgZmFsc2UpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIERFU0VMRUNUX0FMTF9JRCwKLQkJCQlNYXJrZXJNZXNzYWdlcy5maWx0ZXJzRGlhbG9nX2Rlc2VsZWN0QWxsLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFya2VyIGZpbHRlciBpZiB0aGVyZSBpcyBvbmx5IG9uZSBzZWxlY3Rpb24uCi0JICogCi0JICogQHJldHVybiBNYXJrZXJGaWx0ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIE1hcmtlckZpbHRlciBnZXRTZWxlY3RlZEZpbHRlcigpIHsKLQotCQlpZiAoc2VsZWN0ZWRGaWx0ZXJzLmxlbmd0aCA9PSAxKQotCQkJcmV0dXJuIHNlbGVjdGVkRmlsdGVyc1swXTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHJldHVybiBJVHJlZUNvbnRlbnRQcm92aWRlcgotCSAqLwotCXByaXZhdGUgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0VHlwZXNDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlNYXJrZXJGaWx0ZXIgc2VsZWN0ZWQgPSBnZXRTZWxlY3RlZEZpbHRlcigpOwotCQkJCWlmIChzZWxlY3RlZCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQotCQkJCXJldHVybiBnZXRSb290RW50cmllcyhzZWxlY3RlZCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCi0JCQkJCU9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoQWJzdHJhY3ROb2RlKSBwYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoQWJzdHJhY3ROb2RlKSBlbGVtZW50KS5nZXRQYXJlbnQoKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoQWJzdHJhY3ROb2RlKSBlbGVtZW50KS5oYXNDaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyBvZiBGaWx0ZXJzRGlhbG9nLgotCSAqIFRoZSBhdHRyaWJ1dGVzIGFyZWEgd2lsbCBiZSBjcmVhdGVkIGp1c3QgYWJvdmUgdGhlIFJlc3RvcmUgRGVmYXVsdHMKLQkgKiBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBDb21wb3NpdGUKLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZXNBcmVhKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFR5cGVzTGFiZWxQcm92aWRlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIG1hcmtlciB0eXBlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgdGhlIHNlbGVjdGVkIG1hcmtlciB0eXBlcwotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbGVjdGVkVHlwZXMoKSB7Ci0JCU9iamVjdFtdIGNoZWNrRWxlbWVudHMgPSB0eXBlc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJTGlzdCBzZWxlY3RlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBYnN0cmFjdE5vZGUgbm9kZSA9IChBYnN0cmFjdE5vZGUpIGNoZWNrRWxlbWVudHNbaV07Ci0JCQlpZiAoIW5vZGUuaXNDYXRlZ29yeSgpKQotCQkJCXNlbGVjdGVkLmFkZCgoKE1hcmtlclR5cGVOb2RlKW5vZGUpLmdldE1hcmtlclR5cGUoKSk7Ci0KLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzb3J0ZXIgZm9yIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFZpZXdlclNvcnRlcgotCSAqLwotCXByb3RlY3RlZCBWaWV3ZXJTb3J0ZXIgZ2V0U29ydGVyKCkgewotCQlyZXR1cm4gbmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXIjY29tcGFyZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUoKChBYnN0cmFjdE5vZGUpIGUxKS5nZXROYW1lKCksCi0JCQkJCQkoKEFic3RyYWN0Tm9kZSkgZTIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZmlsdGVyIGZyb20gdGhlIFVJIHN0YXRlLiBNdXN0IGJlIGRvbmUgaGVyZSByYXRoZXIgdGhhbiBieQotCSAqIGV4dGVuZGluZyBvcGVuKCkgYmVjYXVzZSBhZnRlciBzdXBlci5vcGVuKCkgaXMgY2FsbGVkLCB0aGUgd2lkZ2V0cnkgaXMKLQkgKiBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXVwZGF0ZUZpbHRlckZyb21VSSgpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgcHJlc3Mgb2YgdGhlIFJlc2V0IGJ1dHRvbi4gVXBkYXRlcyB0aGUgVUkgc3RhdGUgdG8gY29ycmVzcG9uZAotCSAqIHRvIGEgcmVzZXQgZmlsdGVyLCBidXQgZG9lc24ndCBhY3R1YWxseSByZXNldCBvdXIgZmlsdGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0UHJlc3NlZCgpIHsKLQkJdHlwZXNWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJaW50IG9uUmVzb3VyY2UgPSBNYXJrZXJGaWx0ZXIuREVGQVVMVF9PTl9SRVNPVVJDRTsKLQkJYW55UmVzb3VyY2VCdXR0b24uc2V0U2VsZWN0aW9uKG9uUmVzb3VyY2UgPT0gTWFya2VyRmlsdGVyLk9OX0FOWSk7Ci0JCWFueVJlc291cmNlSW5TYW1lUHJvamVjdEJ1dHRvbgotCQkJCS5zZXRTZWxlY3Rpb24ob25SZXNvdXJjZSA9PSBNYXJrZXJGaWx0ZXIuT05fQU5ZX0lOX1NBTUVfQ09OVEFJTkVSKTsKLQkJc2VsZWN0ZWRSZXNvdXJjZUJ1dHRvbgotCQkJCS5zZXRTZWxlY3Rpb24ob25SZXNvdXJjZSA9PSBNYXJrZXJGaWx0ZXIuT05fU0VMRUNURURfT05MWSk7Ci0JCXNlbGVjdGVkUmVzb3VyY2VBbmRDaGlsZHJlbkJ1dHRvbgotCQkJCS5zZXRTZWxlY3Rpb24ob25SZXNvdXJjZSA9PSBNYXJrZXJGaWx0ZXIuT05fU0VMRUNURURfQU5EX0NISUxEUkVOKTsKLQkJd29ya2luZ1NldEdyb3VwLnNldFNlbGVjdGlvbihvblJlc291cmNlID09IE1hcmtlckZpbHRlci5PTl9XT1JLSU5HX1NFVCk7Ci0JCXVwZGF0ZUVuYWJsZWRTdGF0ZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZWxlY3RlZCBtYXJrZXIgdHlwZXMuCi0JICogCi0JICogQHBhcmFtIG1hcmtlclR5cGVzCi0JICovCi0Jdm9pZCBzZXRTZWxlY3RlZFR5cGVzKExpc3QgbWFya2VyVHlwZXMpIHsKLQkJdHlwZXNWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKG5ldyBPYmplY3RbMF0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlclR5cGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbWFya2VyVHlwZXMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1hcmtlclR5cGUpIHsKLQotCQkJCU9iamVjdCBtYXBwaW5nID0gbm9kZVRvVHlwZU1hcHBpbmcuZ2V0KCgoTWFya2VyVHlwZSkgb2JqKS5nZXRJZCgpKTsKLQkJCQlpZiAobWFwcGluZyAhPSBudWxsKXsKLQkJCQkJdHlwZXNWaWV3ZXIuc2V0Q2hlY2tlZChtYXBwaW5nLCB0cnVlKTsKLQkJCQkJc2V0UGFyZW50Q2hlY2tTdGF0ZShtYXBwaW5nLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSB3aWRnZXRyeSBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCBpdCBpcwotCSAqIGVuYWJsZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlKGJvb2xlYW4gZW5hYmxlZCkgewotCi0JCXR5cGVzVmlld2VyLmdldFRyZWUoKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkCi0JCQkJJiYgdHlwZXNWaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1Db3VudCgpID4gMCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZAotCQkJCSYmIHR5cGVzVmlld2VyLmdldFRyZWUoKS5nZXRJdGVtQ291bnQoKSA+IDApOwotCi0JCWFueVJlc291cmNlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWFueVJlc291cmNlSW5TYW1lUHJvamVjdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlzZWxlY3RlZFJlc291cmNlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXNlbGVjdGVkUmVzb3VyY2VBbmRDaGlsZHJlbkJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl3b3JraW5nU2V0R3JvdXAuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBnaXZlbiBmaWx0ZXIgZnJvbSB0aGUgVUkgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdXBkYXRlRmlsdGVyRnJvbVVJKCkgewotCi0JCU1hcmtlckZpbHRlciBmaWx0ZXIgPSBnZXRTZWxlY3RlZEZpbHRlcigpOwotCi0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJdXBkYXRlRW5hYmxlZFN0YXRlKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXVwZGF0ZUZpbHRlckZyb21VSShmaWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgZmlsdGVyIGZyb20gdGhlIFVJLgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVGaWx0ZXJGcm9tVUkoTWFya2VyRmlsdGVyIGZpbHRlcikgewotCi0JCWZpbHRlci5zZXRTZWxlY3RlZFR5cGVzKGdldFNlbGVjdGVkVHlwZXMoKSk7Ci0KLQkJaWYgKHNlbGVjdGVkUmVzb3VyY2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0JCQlmaWx0ZXIuc2V0T25SZXNvdXJjZShNYXJrZXJGaWx0ZXIuT05fU0VMRUNURURfT05MWSk7Ci0JCWVsc2UgaWYgKHNlbGVjdGVkUmVzb3VyY2VBbmRDaGlsZHJlbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLQkJCWZpbHRlci5zZXRPblJlc291cmNlKE1hcmtlckZpbHRlci5PTl9TRUxFQ1RFRF9BTkRfQ0hJTERSRU4pOwotCQllbHNlIGlmIChhbnlSZXNvdXJjZUluU2FtZVByb2plY3RCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0JCQlmaWx0ZXIuc2V0T25SZXNvdXJjZShNYXJrZXJGaWx0ZXIuT05fQU5ZX0lOX1NBTUVfQ09OVEFJTkVSKTsKLQkJZWxzZSBpZiAod29ya2luZ1NldEdyb3VwLmdldFNlbGVjdGlvbigpKQotCQkJZmlsdGVyLnNldE9uUmVzb3VyY2UoTWFya2VyRmlsdGVyLk9OX1dPUktJTkdfU0VUKTsKLQkJZWxzZQotCQkJZmlsdGVyLnNldE9uUmVzb3VyY2UoTWFya2VyRmlsdGVyLk9OX0FOWSk7Ci0KLQkJZmlsdGVyLnNldFdvcmtpbmdTZXQod29ya2luZ1NldEdyb3VwLmdldFdvcmtpbmdTZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgVUkgc3RhdGUgZnJvbSB0aGUgZ2l2ZW4gZmlsdGVyLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHVwZGF0ZVVJRnJvbUZpbHRlcigpIHsKLQotCQlNYXJrZXJGaWx0ZXIgZmlsdGVyID0gZ2V0U2VsZWN0ZWRGaWx0ZXIoKTsKLQotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCXVwZGF0ZUVuYWJsZWRTdGF0ZShmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl1cGRhdGVVSVdpdGhGaWx0ZXIoZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIFVJIHdpdGggdGhlIGNvbnRlbnRzIG9mIGZpbHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVUlXaXRoRmlsdGVyKE1hcmtlckZpbHRlciBmaWx0ZXIpIHsKLQkJc2V0U2VsZWN0ZWRUeXBlcyhmaWx0ZXIuZ2V0U2VsZWN0ZWRUeXBlcygpKTsKLQotCQlpbnQgb24gPSBmaWx0ZXIuZ2V0T25SZXNvdXJjZSgpOwotCQlhbnlSZXNvdXJjZUJ1dHRvbi5zZXRTZWxlY3Rpb24ob24gPT0gTWFya2VyRmlsdGVyLk9OX0FOWSk7Ci0JCWFueVJlc291cmNlSW5TYW1lUHJvamVjdEJ1dHRvbgotCQkJCS5zZXRTZWxlY3Rpb24ob24gPT0gTWFya2VyRmlsdGVyLk9OX0FOWV9JTl9TQU1FX0NPTlRBSU5FUik7Ci0JCXNlbGVjdGVkUmVzb3VyY2VCdXR0b24KLQkJCQkuc2V0U2VsZWN0aW9uKG9uID09IE1hcmtlckZpbHRlci5PTl9TRUxFQ1RFRF9PTkxZKTsKLQkJc2VsZWN0ZWRSZXNvdXJjZUFuZENoaWxkcmVuQnV0dG9uCi0JCQkJLnNldFNlbGVjdGlvbihvbiA9PSBNYXJrZXJGaWx0ZXIuT05fU0VMRUNURURfQU5EX0NISUxEUkVOKTsKLQkJd29ya2luZ1NldEdyb3VwLnNldFNlbGVjdGlvbihvbiA9PSBNYXJrZXJGaWx0ZXIuT05fV09SS0lOR19TRVQpOwotCQl3b3JraW5nU2V0R3JvdXAuc2V0V29ya2luZ1NldChmaWx0ZXIuZ2V0V29ya2luZ1NldCgpKTsKLQotCQl1cGRhdGVFbmFibGVkU3RhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGlydHkgZmxhZyBoYXMgYmVlbiBzZXQgb3RoZXJ3aXNlCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gZGlydHk7Ci0JfQotCi0JLyoqCi0JICogTWFya3MgdGhlIGRpYWxvZyBhcyBkaXJ0eS4KLQkgKi8KLQl2b2lkIG1hcmtEaXJ0eSgpIHsKLQkJZGlydHkgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbWFya2VyIGZpbHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3RmlsdGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKE1hcmtlckZpbHRlciBuZXdGaWx0ZXIpIHsKLQkJc2V0RmlsdGVycyhuZXcgTWFya2VyRmlsdGVyW10geyBuZXdGaWx0ZXIgfSk7Ci0JCXVwZGF0ZVVJRnJvbUZpbHRlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIE1hcmtlckZpbHRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGRpYWxvZy4KLQkgKi8KLQlwdWJsaWMgTWFya2VyRmlsdGVyW10gZ2V0RmlsdGVycygpIHsKLQkJcmV0dXJuIGZpbHRlcnM7Ci0JfQotCi0JLyoqCi0JICogQSBzZWxlY3Rpb24gaGFzIG9jY3VyZWQgb24gb25lIG9mIHRoZSBjaGVja2JveGVzIG9yIGNvbWJvcy4gVXBkYXRlLgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUZvclNlbGVjdGlvbigpIHsKLQkJdXBkYXRlRW5hYmxlZFN0YXRlKHRydWUpOwotCQltYXJrRGlydHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIG9mIHRoZSBtYXJrZXIgdHlwZXMgYXZpbGFibGUgZm9yIHRoZSBmaWx0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0ZWQKLQkgKiBAcmV0dXJuIE9iamVjdFtdCi0JICovCi0JT2JqZWN0W10gZ2V0Um9vdEVudHJpZXMoTWFya2VyRmlsdGVyIHNlbGVjdGVkKSB7Ci0KLQkJTGlzdCByb290cyA9IHNlbGVjdGVkLmdldFJvb3RUeXBlcygpOwotCQlMaXN0IG1hcmtlck5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlIYXNoTWFwIGNhdGVnb3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gcm9vdHMuZ2V0KGkpOwotCQkJYnVpbGRUeXBlVHJlZShtYXJrZXJOb2Rlcywgb2JqLCBjYXRlZ29yaWVzKTsKLQkJfQotCQlyZXR1cm4gbWFya2VyTm9kZXMudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBsaXN0IG9mIHR5cGVzIGFuZCBjYXRlZ29yaWVzIGZyb20gdGhlIHN1cHBsaWVkIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gY2F0ZWdvcmllcwotCSAqLwotCXByaXZhdGUgdm9pZCBidWlsZFR5cGVUcmVlKExpc3QgZWxlbWVudHMsIE9iamVjdCBvYmosIEhhc2hNYXAgY2F0ZWdvcmllcykgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWFya2VyVHlwZSkgewotCi0JCQlNYXJrZXJUeXBlIG1hcmtlclR5cGUgPSAoTWFya2VyVHlwZSkgb2JqOwotCi0JCQlTdHJpbmcgY2F0ZWdvcnlOYW1lID0gTWFya2VyU3VwcG9ydFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJLmdldENhdGVnb3J5KG1hcmtlclR5cGUuZ2V0SWQoKSk7Ci0KLQkJCWlmIChjYXRlZ29yeU5hbWUgPT0gbnVsbCkgewotCQkJCWVsZW1lbnRzLmFkZChuZXcgTWFya2VyVHlwZU5vZGUobWFya2VyVHlwZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlNYXJrZXJDYXRlZ29yeSBjYXRlZ29yeTsKLQkJCQlpZiAoY2F0ZWdvcmllcy5jb250YWluc0tleShjYXRlZ29yeU5hbWUpKQotCQkJCQljYXRlZ29yeSA9IChNYXJrZXJDYXRlZ29yeSkgY2F0ZWdvcmllcy5nZXQoY2F0ZWdvcnlOYW1lKTsKLQkJCQllbHNlIHsKLQkJCQkJY2F0ZWdvcnkgPSBuZXcgTWFya2VyQ2F0ZWdvcnkoY2F0ZWdvcnlOYW1lKTsKLQkJCQkJY2F0ZWdvcmllcy5wdXQoY2F0ZWdvcnlOYW1lLCBjYXRlZ29yeSk7Ci0JCQkJCWVsZW1lbnRzLmFkZChjYXRlZ29yeSk7Ci0JCQkJfQotCQkJCU1hcmtlclR5cGVOb2RlIG5vZGUgPSBuZXcgTWFya2VyVHlwZU5vZGUobWFya2VyVHlwZSk7Ci0JCQkJY2F0ZWdvcnkuYWRkKG5vZGUpOwotCQkJfQotCi0JCQlNYXJrZXJUeXBlW10gc3ViVHlwZXMgPSAoKE1hcmtlclR5cGUpIG9iaikuZ2V0QWxsU3ViVHlwZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3ViVHlwZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlidWlsZFR5cGVUcmVlKGVsZW1lbnRzLCBzdWJUeXBlc1tqXSwgY2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHcmV5IGNoZWNrIHRoZSBwYXJlbnQgaWYgcmVxdWlyZWQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjaGVja2VkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFBhcmVudENoZWNrU3RhdGUoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tlZCkgewotCQlPYmplY3QgcGFyZW50ID0gdHlwZXNDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gdHlwZXNDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAoY2hlY2tlZCkgey8vIGF0IGxlYXN0IG9uZSBpcyBjaGVja2VkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGNoaWxkcmVuW2ldOwotCQkJCWlmICghdHlwZXNWaWV3ZXIuZ2V0Q2hlY2tlZChvYmplY3QpKSB7Ci0JCQkJCXR5cGVzVmlld2VyLnNldEdyYXlDaGVja2VkKHBhcmVudCwgdHJ1ZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBBbGwgY2hlY2tlZCAtIGNoZWNrIHRoZSBwYXJlbnQKLQkJCXR5cGVzVmlld2VyLnNldENoZWNrZWQocGFyZW50LCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gY2hpbGRyZW5baV07Ci0JCQkJaWYgKHR5cGVzVmlld2VyLmdldENoZWNrZWQob2JqZWN0KSkgewotCQkJCQl0eXBlc1ZpZXdlci5zZXRHcmF5Q2hlY2tlZChwYXJlbnQsIHRydWUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJLy8gQWxsIGNoZWNrZWQgLSBjaGVjayB0aGUgcGFyZW50Ci0JCQl0eXBlc1ZpZXdlci5zZXRDaGVja2VkKHBhcmVudCwgZmFsc2UpOwotCQl9Ci0JCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjaGVjayBzdGF0ZSBvZiB0aGUgY2hpbGRyZW4gb2YgZWxlbWVudCB0byBjaGVja2VkLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNoZWNrZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q2hpbGRyZW5DaGVja2VkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrZWQpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSB0eXBlc0NvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQl0eXBlc1ZpZXdlci5zZXRDaGVja2VkKGNoaWxkcmVuW2ldLCBjaGVja2VkKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRGlhbG9nTWFya2VyUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRGlhbG9nTWFya2VyUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY3MGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0RpYWxvZ01hcmtlclByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVHJheURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLlN0YXR1c1V0aWw7Ci0KLS8qKgotICogU2hvd3MgdGhlIHByb3BlcnRpZXMgb2YgYSBuZXcgb3IgZXhpc3RpbmcgbWFya2VyCi0gKi8KLWNsYXNzIERpYWxvZ01hcmtlclByb3BlcnRpZXMgZXh0ZW5kcyBUcmF5RGlhbG9nIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYXJrZXIgYmVpbmcgc2hvd24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBhIG5ldyBtYXJrZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIElNYXJrZXIgbWFya2VyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSByZXNvdXJjZSBvbiB3aGljaCB0byBjcmVhdGUgYSBuZXcgbWFya2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIHR5cGUgb2YgbWFya2VyIHRvIGJlIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gSU1hcmtlci5NQVJLRVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaW5pdGlhbCBhdHRyaWJ1dGVzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgbmV3IG1hcmtlcgotICAgICAqLwotICAgIHByaXZhdGUgTWFwIGluaXRpYWxBdHRyaWJ1dGVzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXh0IGNvbnRyb2wgZm9yIHRoZSBEZXNjcmlwdGlvbiBmaWVsZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRleHQgZGVzY3JpcHRpb25UZXh0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnRyb2wgZm9yIHRoZSBDcmVhdGlvbiBUaW1lIGZpZWxkLgotICAgICAqLwotICAgIHByaXZhdGUgTGFiZWwgY3JlYXRpb25UaW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIHRleHQgY29udHJvbCBmb3IgdGhlIFJlc291cmNlIGZpZWxkLgotICAgICAqLwotICAgIHByaXZhdGUgVGV4dCByZXNvdXJjZVRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGV4dCBjb250cm9sIGZvciB0aGUgRm9sZGVyIGZpZWxkLgotICAgICAqLwotICAgIHByaXZhdGUgVGV4dCBmb2xkZXJUZXh0OwotCi0gICAgLyoqCi0gICAgICogVGhlIHRleHQgY29udHJvbCBmb3IgdGhlIExvY2F0aW9uIGZpZWxkLgotICAgICAqLwotICAgIHByaXZhdGUgVGV4dCBsb2NhdGlvblRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBEaXJ0eSBmbGFnLiAgVHJ1ZSBpZiBhbnkgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZGlydHk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGRpYWxvZy4gIEJ5IGRlZmF1bHQgdGhpcyBkaWFsb2cgY3JlYXRlcyBhIG5ldyBtYXJrZXIuCi0gICAgICogVG8gc2V0IHRoZSByZXNvdXJjZSBhbmQgaW5pdGlhbCBhdHRyaWJ1dGVzIGZvciB0aGUgbmV3IG1hcmtlciwgCi0gICAgICogdXNlIDxjb2RlPnNldFJlc291cmNlPC9jb2RlPiBhbmQgPGNvZGU+c2V0SW5pdGlhbEF0dHJpYnV0ZXM8L2NvZGU+LgotICAgICAqIFRvIHNob3cgb3IgbW9kaWZ5IGFuIGV4aXN0aW5nIG1hcmtlciwgdXNlIDxjb2RlPnNldE1hcmtlcjwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHNoZWxsIHRoZSBwYXJlbnQgc2hlbGwKLSAgICAgKi8KLSAgICBEaWFsb2dNYXJrZXJQcm9wZXJ0aWVzKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkaWFsb2cuICBCeSBkZWZhdWx0IHRoaXMgZGlhbG9nIGNyZWF0ZXMgYSBuZXcgbWFya2VyLgotICAgICAqIFRvIHNldCB0aGUgcmVzb3VyY2UgYW5kIGluaXRpYWwgYXR0cmlidXRlcyBmb3IgdGhlIG5ldyBtYXJrZXIsIAotICAgICAqIHVzZSA8Y29kZT5zZXRSZXNvdXJjZTwvY29kZT4gYW5kIDxjb2RlPnNldEluaXRpYWxBdHRyaWJ1dGVzPC9jb2RlPi4KLSAgICAgKiBUbyBzaG93IG9yIG1vZGlmeSBhbiBleGlzdGluZyBtYXJrZXIsIHVzZSA8Y29kZT5zZXRNYXJrZXI8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaGVsbCB0aGUgcGFyZW50IHNoZWxsCi0gICAgICogQHBhcmFtIHRpdGxlIHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nCi0gICAgICovCi0gICAgRGlhbG9nTWFya2VyUHJvcGVydGllcyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjcmVhdGUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWFya2VyIHRvIHNob3cgb3IgbW9kaWZ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXJrZXIgdGhlIG1hcmtlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gY3JlYXRlIGEgbmV3IG1hcmtlcgotICAgICAqLwotICAgIHZvaWQgc2V0TWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIHRoaXMubWFya2VyID0gbWFya2VyOwotICAgICAgICBpZiAobWFya2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IG1hcmtlci5nZXRUeXBlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1hcmtlciBiZWluZyBjcmVhdGVkIG9yIG1vZGlmaWVkLgotICAgICAqIEZvciBhIG5ldyBtYXJrZXIsIHRoaXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiB1bnRpbAotICAgICAqIHRoZSBkaWFsb2cgcmV0dXJucywgYnV0IGlzIG5vbi1udWxsIGFmdGVyLgotICAgICAqLwotICAgIElNYXJrZXIgZ2V0TWFya2VyKCkgewotICAgICAgICByZXR1cm4gbWFya2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJlc291cmNlIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgbmV3IG1hcmtlci4KLSAgICAgKiBJZiBub3Qgc2V0LCB0aGUgbmV3IG1hcmtlciBpcyBjcmVhdGVkIG9uIHRoZSB3b3Jrc3BhY2Ugcm9vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgbmV3IG1hcmtlciwKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGhhcyBiZWVuIHNldC4KLSAgICAgKiBJZiBub3Qgc2V0LCB0aGUgbmV3IG1hcmtlciBpcyBjcmVhdGVkIG9uIHRoZSB3b3Jrc3BhY2Ugcm9vdC4KLSAgICAgKi8KLSAgICBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGluaXRpYWwgYXR0cmlidXRlcyB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIG5ldyBtYXJrZXIuCi0gICAgICogSWYgbm90IHNldCwgdGhlIG5ldyBtYXJrZXIgaXMgY3JlYXRlZCB3aXRoIGRlZmF1bHQgYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICB2b2lkIHNldEluaXRpYWxBdHRyaWJ1dGVzKE1hcCBpbml0aWFsQXR0cmlidXRlcykgewotICAgICAgICB0aGlzLmluaXRpYWxBdHRyaWJ1dGVzID0gaW5pdGlhbEF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5pdGlhbCBhdHRyaWJ1dGVzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgbmV3IG1hcmtlciwKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgotICAgICAqIElmIG5vdCBzZXQsIHRoZSBuZXcgbWFya2VyIGlzIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IGF0dHJpYnV0ZXMuCi0gICAgICovCi0gICAgTWFwIGdldEluaXRpYWxBdHRyaWJ1dGVzKCkgewotICAgICAgICBpZiAoaW5pdGlhbEF0dHJpYnV0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdGlhbEF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbml0aWFsQXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLSAgICAgICAgaWYgKHRpdGxlID09IG51bGwpCi0gICAgICAgICAgICBuZXdTaGVsbC5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLnByb3BlcnRpZXNEaWFsb2dfdGl0bGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXdTaGVsbC5zZXRUZXh0KHRpdGxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvL2luaXRpYWxpemUgcmVzb3VyY2VzL3Byb3BlcnRpZXMKLSAgICAgICAgaWYgKG1hcmtlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNvdXJjZSA9IG1hcmtlci5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbml0aWFsQXR0cmlidXRlcyA9IG1hcmtlci5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgICAgICBpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlRGVzY3JpcHRpb25BcmVhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGlmIChtYXJrZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY3JlYXRlQ3JlYXRpb25UaW1lQXJlYShjb21wb3NpdGUpOwotICAgICAgICB9Ci0gICAgICAgIGNyZWF0ZUF0dHJpYnV0ZXNBcmVhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgY3JlYXRlUmVzb3VyY2VBcmVhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHVwZGF0ZURpYWxvZ0Zyb21NYXJrZXIoKTsKLSAgICAgICAgdXBkYXRlRW5hYmxlbWVudCgpOwotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBjcmVhdGVDcmVhdGlvblRpbWVBcmVhLgotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ3JlYXRpb25UaW1lQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIFN0cmluZyBjcmVhdGlvbiA9IE1hcmtlck1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgLnByb3BlcnRpZXNEaWFsb2dfY3JlYXRpb25UaW1lX3RleHQ7Ci0KLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoY3JlYXRpb24pOwotICAgICAgICBsYWJlbC5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIGNyZWF0aW9uVGltZSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgY3JlYXRpb25UaW1lLnNldEZvbnQoZm9udCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgT0sgYW5kIENhbmNlbCBidXR0b25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLSAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFyZWEgZm9yIHRoZSBEZXNjcmlwdGlvbiBmaWVsZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRGVzY3JpcHRpb25BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICAgICAgCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLnByb3BlcnRpZXNEaWFsb2dfZGVzY3JpcHRpb25fdGV4dCk7Ci0gICAgICAgIGxhYmVsLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIGludCBzdHlsZSA9IFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSOwotICAgICAgICBkZXNjcmlwdGlvblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIHN0eWxlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gIGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQwMCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgZGVzY3JpcHRpb25UZXh0LnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgZGVzY3JpcHRpb25UZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1hcmtEaXJ0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuIFRoZSBhdHRyaWJ1dGVzIGFyZWEgaXMgY3JlYXRlZCBiZXR3ZWVuCi0gICAgICogdGhlIGNyZWF0aW9uIHRpbWUgYXJlYSBhbmQgdGhlIHJlc291cmNlIGFyZWEuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZXNBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhcmVhIGZvciB0aGUgUmVzb3VyY2UgZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlc291cmNlQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICAgICAgTGFiZWwgcmVzb3VyY2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgcmVzb3VyY2VMYWJlbC5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLnByb3BlcnRpZXNEaWFsb2dfcmVzb3VyY2VfdGV4dCk7Ci0gICAgICAgIHJlc291cmNlTGFiZWwuc2V0Rm9udChmb250KTsKLSAgICAgICAgcmVzb3VyY2VUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULldSQVAKLSAgICAgICAgICAgICAgICB8IFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgcmVzb3VyY2VUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICByZXNvdXJjZVRleHQuc2V0Rm9udChmb250KTsKLQotICAgICAgICBMYWJlbCBmb2xkZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgZm9sZGVyTGFiZWwuc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5wcm9wZXJ0aWVzRGlhbG9nX2ZvbGRlcl90ZXh0KTsKLSAgICAgICAgZm9sZGVyTGFiZWwuc2V0Rm9udChmb250KTsKLSAgICAgICAgZm9sZGVyVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5XUkFQIHwgU1dULlJFQURfT05MWQotICAgICAgICAgICAgICAgIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGZvbGRlclRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGZvbGRlclRleHQuc2V0Rm9udChmb250KTsKLQotICAgICAgICBMYWJlbCBsb2NhdGlvbkxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsb2NhdGlvbkxhYmVsLnNldFRleHQoTWFya2VyTWVzc2FnZXMucHJvcGVydGllc0RpYWxvZ19sb2NhdGlvbl90ZXh0KTsKLSAgICAgICAgbG9jYXRpb25MYWJlbC5zZXRGb250KGZvbnQpOwotICAgICAgICBsb2NhdGlvblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUAotICAgICAgICAgICAgICAgIHwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBsb2NhdGlvblRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGxvY2F0aW9uVGV4dC5zZXRGb250KGZvbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGRpYWxvZyBmcm9tIHRoZSBtYXJrZXIgc3RhdGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGlhbG9nRnJvbU1hcmtlcigpIHsKLSAgICAgICAgaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB1cGRhdGVEaWFsb2dGb3JOZXdNYXJrZXIoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBkZXNjcmlwdGlvblRleHQuc2V0VGV4dChVdGlsLmdldFByb3BlcnR5KElNYXJrZXIuTUVTU0FHRSwgbWFya2VyKSk7Ci0gICAgICAgIGlmIChjcmVhdGlvblRpbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIGNyZWF0aW9uVGltZS5zZXRUZXh0KFV0aWwuZ2V0Q3JlYXRpb25UaW1lKG1hcmtlcikpOwotICAgICAgICBpZiAocmVzb3VyY2VUZXh0ICE9IG51bGwpCi0gICAgICAgICAgICByZXNvdXJjZVRleHQuc2V0VGV4dChVdGlsLmdldFJlc291cmNlTmFtZShtYXJrZXIpKTsKLSAgICAgICAgaWYgKGZvbGRlclRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgIGZvbGRlclRleHQuc2V0VGV4dChVdGlsLmdldENvbnRhaW5lck5hbWUobWFya2VyKSk7Ci0gICAgICAgIGlmIChsb2NhdGlvblRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBVdGlsLmdldFByb3BlcnR5KElNYXJrZXIuTElORV9OVU1CRVIsIG1hcmtlcik7Ci0gICAgICAgICAgICBpZiAobGluZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgbG9jYXRpb25UZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbG9jYXRpb25UZXh0LnNldFRleHQoTkxTLmJpbmQoTWFya2VyTWVzc2FnZXMubGFiZWxfbGluZU51bWJlciwgbGluZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVzY3JpcHRpb25UZXh0LnNlbGVjdEFsbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGRpYWxvZyBmcm9tIHRoZSBwcmVkZWZpbmVkIGF0dHJpYnV0ZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGlhbG9nRm9yTmV3TWFya2VyKCkgewotICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZVRleHQgIT0gbnVsbCAmJiBmb2xkZXJUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc291cmNlVGV4dC5zZXRUZXh0KHJlc291cmNlLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIElQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgICAgaW50IG4gPSBwYXRoLnNlZ21lbnRDb3VudCgpIC0gMTsgLy8gbiBpcyB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIGluIGNvbnRhaW5lciwgbm90IHBhdGgKLSAgICAgICAgICAgIGlmIChuID4gMCkgewotICAgICAgICAgICAgICAgIGludCBsZW4gPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQotICAgICAgICAgICAgICAgICAgICBsZW4gKz0gcGF0aC5zZWdtZW50KGkpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIC8vIGFjY291bnQgZm9yIC8ncwotICAgICAgICAgICAgICAgIGlmIChuID4gMSkKLSAgICAgICAgICAgICAgICAgICAgbGVuICs9IG4gLSAxOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobGVuKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcvJyk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoLnNlZ21lbnQoaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb2xkZXJUZXh0LnNldFRleHQoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5pdGlhbEF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IGRlc2NyaXB0aW9uID0gaW5pdGlhbEF0dHJpYnV0ZXMuZ2V0KElNYXJrZXIuTUVTU0FHRSk7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCAmJiBkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblRleHQuc2V0VGV4dCgoU3RyaW5nKSBkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvblRleHQuc2VsZWN0QWxsKCk7Ci0KLSAgICAgICAgICAgIE9iamVjdCBsaW5lID0gaW5pdGlhbEF0dHJpYnV0ZXMuZ2V0KElNYXJrZXIuTElORV9OVU1CRVIpOwotICAgICAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCAmJiBsaW5lIGluc3RhbmNlb2YgSW50ZWdlciAmJiBsb2NhdGlvblRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBsb2NhdGlvblRleHQuc2V0VGV4dCgKLSAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoTWFya2VyTWVzc2FnZXMubGFiZWxfbGluZU51bWJlciwgbGluZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgaWYgKG1hcmtlciA9PSBudWxsIHx8IFV0aWwuaXNFZGl0YWJsZShtYXJrZXIpKSB7Ci0gICAgICAgICAgICBzYXZlQ2hhbmdlcygpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRpYWxvZydzIGRpcnR5IGZsYWcgdG8gPGNvZGU+dHJ1ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYXJrRGlydHkoKSB7Ci0gICAgICAgIGRpcnR5ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICogPHVsPgotICAgICAqIDxsaT48Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGlydHkgZmxhZyBoYXMgYmVlbiBzZXQgdG8gdHJ1ZS48L2xpPgotICAgICAqIDxsaT48Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RpcnR5KCkgewotICAgICAgICByZXR1cm4gZGlydHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIGNoYW5nZXMgbWFkZSBpbiB0aGUgZGlhbG9nIGlmIG5lZWRlZC4KLSAgICAgKiBDcmVhdGVzIGEgbmV3IG1hcmtlciBpZiBuZWVkZWQuCi0gICAgICogVXBkYXRlcyB0aGUgZXhpc3RpbmcgbWFya2VyIG9ubHkgaWYgdGhlcmUgaGF2ZSBiZWVuIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVDaGFuZ2VzKCkgewotCi0gICAgICAgIGZpbmFsIENvcmVFeGNlcHRpb25bXSBjb3JlRXhjZXB0aW9ucyA9IG5ldyBDb3JlRXhjZXB0aW9uWzFdOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBNYXAgYXR0cnMgPSBnZXRNYXJrZXJBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuYnVzeUN1cnNvcldoaWxlKAotICAgICAgICAgICAgICAgICAgICBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCAxMDApOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJrZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNYXJrZXIobW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEaXJ0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hcmtlcihtb25pdG9yLCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVFeGNlcHRpb25zWzBdID0gZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmxvZyhlLmdldE1lc3NhZ2UoKSwgU3RhdHVzVXRpbC5uZXdTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgIElTdGF0dXMuRVJST1IsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvcmVFeGNlcHRpb25zWzBdICE9IG51bGwpCi0gICAgICAgICAgICBFcnJvckRpYWxvZwotICAgICAgICAgICAgICAgICAgICAub3BlbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFya2VyTWVzc2FnZXMuRXJyb3IsIG51bGwsIGNvcmVFeGNlcHRpb25zWzBdLmdldFN0YXR1cygpKTsgCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIG9yIHVwZGF0ZXMgdGhlIG1hcmtlci4gIE11c3QgYmUgY2FsbGVkIHdpdGhpbiBhIHdvcmtzcGFjZSBydW5uYWJsZS4KLSAgICAgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciB3ZSByZXBvcnQgdG8uIAotICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSBkaWFsb2cKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTWFya2VyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWFwIGF0dHJzKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBTZXQgdGhlIG1hcmtlciBhdHRyaWJ1dGVzIGZyb20gdGhlIGN1cnJlbnQgZGlhbG9nIGZpZWxkIHZhbHVlcy4KLSAgICAgICAgLy8gRG8gbm90IHVzZSBzZXRBdHRyaWJ1dGVzKE1hcCkgYXMgdGhhdCBvdmVyd3JpdGVzIGFueSBhdHRyaWJ1dGVzCi0gICAgICAgIC8vIG5vdCBjb3ZlcmVkIGJ5IHRoZSBkaWFsb2cuCi0KLSAgICAgICAgaW50IGluY3JlbWVudCA9IDUwIC8gYXR0cnMuc2l6ZSgpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGF0dHJzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoaW5jcmVtZW50KTsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWwgPSBhdHRycy5nZXQoa2V5KTsKLSAgICAgICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoa2V5LCB2YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFya2VyIGF0dHJpYnV0ZXMgdG8gc2F2ZSBiYWNrIHRvIHRoZSBtYXJrZXIsIAotICAgICAqIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRpYWxvZyBmaWVsZHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRNYXJrZXJBdHRyaWJ1dGVzKCkgewotICAgICAgICBNYXAgYXR0cnM7Ci0gICAgICAgIGlmIChpbml0aWFsQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhdHRycyA9IGluaXRpYWxBdHRyaWJ1dGVzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXR0cnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIGF0dHJzLnB1dChJTWFya2VyLk1FU1NBR0UsIGRlc2NyaXB0aW9uVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICByZXR1cm4gYXR0cnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBtYXJrZXIgYW5kIHJlcG9ydCBwcm9ncmVzcwotICAgICAqIHRvIHRoZSBtb25pdG9yLgotICAgICAqIEBwYXJhbSBtb25pdG9yCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU1hcmtlcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgbW9uaXRvci53b3JrZWQoMTApOwotICAgICAgICBtYXJrZXIgPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIodHlwZSk7Ci0gICAgICAgIG1vbml0b3Iud29ya2VkKDQwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHdpZGdldCBlbmFibGVtZW50IGZvciB0aGUgZGlhbG9nLiBTaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbmFibGVtZW50KCkgewotICAgICAgICBkZXNjcmlwdGlvblRleHQuc2V0RWRpdGFibGUoaXNFZGl0YWJsZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICogPHVsPgotICAgICAqIDxsaT48Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFya2VyIGlzIGVkaXRhYmxlIG9yIHRoZSBkaWFsb2cgaXMgY3JlYXRpbmcgYSBuZXcgbWFya2VyLjwvbGk+Ci0gICAgICogPGxpPjxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgbWFya2VyIGlzIG5vdCBlZGl0YWJsZS48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLSAgICAgICAgaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVXRpbC5pc0VkaXRhYmxlKG1hcmtlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWFya2VyIHR5cGUgd2hlbiBjcmVhdGluZyBhIG5ldyBtYXJrZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIG1hcmtlciB0eXBlCi0gICAgICovCi0gICAgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRGlhbG9nUHJvYmxlbUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRGlhbG9nUHJvYmxlbUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmYzZmE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0RpYWxvZ1Byb2JsZW1GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIERpYWxvZ1Byb2JsZW1GaWx0ZXIgZXh0ZW5kcyBEaWFsb2dNYXJrZXJGaWx0ZXIgewotCi0JcHJpdmF0ZSBEZXNjcmlwdGlvbkdyb3VwIGRlc2NyaXB0aW9uR3JvdXA7Ci0KLQlwcml2YXRlIFNldmVyaXR5R3JvdXAgc2V2ZXJpdHlHcm91cDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHVzZXJGaWx0ZXJDb21wb3NpdGU7Ci0KLQlwcml2YXRlIExhYmVsIHN5c3RlbVNldHRpbmdzTGFiZWw7Ci0KLQlwcml2YXRlIGNsYXNzIERlc2NyaXB0aW9uR3JvdXAgewotCQlwcml2YXRlIExhYmVsIGRlc2NyaXB0aW9uTGFiZWw7Ci0KLQkJcHJpdmF0ZSBDb21ibyBjb21ibzsKLQotCQlwcml2YXRlIFRleHQgZGVzY3JpcHRpb247Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgY29udGFpbnMgPSBNYXJrZXJNZXNzYWdlcy5maWx0ZXJzRGlhbG9nX2NvbnRhaW5zOwotCi0JCXByaXZhdGUgU3RyaW5nIGRvZXNOb3RDb250YWluID0gTWFya2VyTWVzc2FnZXMuZmlsdGVyc0RpYWxvZ19kb2VzTm90Q29udGFpbjsKLQotCQkvKioKLQkJICogQ3JlYXRlIGEgZGVzY3JpcHRvciBncm91cC4KLQkJICogCi0JCSAqIEBwYXJhbSBwYXJlbnQKLQkJICovCi0JCXB1YmxpYyBEZXNjcmlwdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCWRlc2NyaXB0aW9uTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlkZXNjcmlwdGlvbkxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCQlkZXNjcmlwdGlvbkxhYmVsCi0JCQkJCS5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLmZpbHRlcnNEaWFsb2dfZGVzY3JpcHRpb25MYWJlbCk7Ci0KLQkJCWNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCQljb21iby5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJY29tYm8uYWRkKGNvbnRhaW5zKTsKLQkJCWNvbWJvLmFkZChkb2VzTm90Q29udGFpbik7Ci0JCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXVwZGF0ZUZvclNlbGVjdGlvbigpOwotCQkJCX0KLQkJCX0pOwotCQkJLy8gUHJldmVudCBFc2MgYW5kIFJldHVybiBmcm9tIGNsb3NpbmcgdGhlIGRpYWxvZyB3aGVuIHRoZSBjb21ibyBpcwotCQkJLy8gYWN0aXZlLgotCQkJY29tYm8uYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFCi0JCQkJCQkJfHwgZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJZGVzY3JpcHRpb24gPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWRlc2NyaXB0aW9uLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlkZXNjcmlwdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCURpYWxvZ1Byb2JsZW1GaWx0ZXIudGhpcy5tYXJrRGlydHkoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGdldENvbnRhaW5zKCkgewotCQkJcmV0dXJuIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gY29tYm8uaW5kZXhPZihjb250YWlucyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDb250YWlucyhib29sZWFuIHZhbHVlKSB7Ci0JCQlpZiAodmFsdWUpIHsKLQkJCQljb21iby5zZWxlY3QoY29tYm8uaW5kZXhPZihjb250YWlucykpOwotCQkJfSBlbHNlIHsKLQkJCQljb21iby5zZWxlY3QoY29tYm8uaW5kZXhPZihkb2VzTm90Q29udGFpbikpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHRleHQpIHsKLQkJCWlmICh0ZXh0ID09IG51bGwpIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCX0gZWxzZSB7Ci0JCQkJZGVzY3JpcHRpb24uc2V0VGV4dCh0ZXh0KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb24uZ2V0VGV4dCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFVwZGF0ZSB0aGUgZW5hYmxlbWVudCBzdGF0ZSBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjZWl2ZXIgaXMKLQkJICogZW5hYmxlZC4KLQkJICogCi0JCSAqIEBwYXJhbSBlbmFibGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1cGRhdGVFbmFibGVtZW50KGJvb2xlYW4gZW5hYmxlZCkgewotCQkJZGVzY3JpcHRpb25MYWJlbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJY29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCWRlc2NyaXB0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNldmVyaXR5R3JvdXAgewotCQlwcml2YXRlIEJ1dHRvbiBlbmFibGVtZW50QnV0dG9uOwotCi0JCXByaXZhdGUgQnV0dG9uIGVycm9yQnV0dG9uOwotCi0JCXByaXZhdGUgQnV0dG9uIHdhcm5pbmdCdXR0b247Ci0KLQkJcHJpdmF0ZSBCdXR0b24gaW5mb0J1dHRvbjsKLQotCQkvKioKLQkJICogQ3JlYXRlIGEgZ3JvdXAgZm9yIHNldmVyaXR5LgotCQkgKiAKLQkJICogQHBhcmFtIHBhcmVudAotCQkgKi8KLQkJcHVibGljIFNldmVyaXR5R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXVwZGF0ZUVuYWJsZW1lbnQodHJ1ZSk7Ci0JCQkJCURpYWxvZ1Byb2JsZW1GaWx0ZXIudGhpcy5tYXJrRGlydHkoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQllbmFibGVtZW50QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWVuYWJsZW1lbnRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWVuYWJsZW1lbnRCdXR0b24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCWVuYWJsZW1lbnRCdXR0b24KLQkJCQkJLnNldFRleHQoTWFya2VyTWVzc2FnZXMuZmlsdGVyc0RpYWxvZ19zZXZlcml0eUxhYmVsKTsKLQkJCWVuYWJsZW1lbnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCQllcnJvckJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQkJZXJyb3JCdXR0b24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCWVycm9yQnV0dG9uLnNldFRleHQoTWFya2VyTWVzc2FnZXMuZmlsdGVyc0RpYWxvZ19zZXZlcml0eUVycm9yKTsKLQkJCWVycm9yQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJZXJyb3JCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl1cGRhdGVGb3JTZWxlY3Rpb24oKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJd2FybmluZ0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQkJd2FybmluZ0J1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJd2FybmluZ0J1dHRvbi5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLmZpbHRlcnNEaWFsb2dfc2V2ZXJpdHlXYXJuaW5nKTsKLQkJCXdhcm5pbmdCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQl3YXJuaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJdXBkYXRlRm9yU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWluZm9CdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJCWluZm9CdXR0b24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCWluZm9CdXR0b24uc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5maWx0ZXJzRGlhbG9nX3NldmVyaXR5SW5mbyk7Ci0JCQlpbmZvQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJaW5mb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXVwZGF0ZUZvclNlbGVjdGlvbigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNTZXZlcml0eVNlbGVjdGVkKCkgewotCQkJcmV0dXJuIGVuYWJsZW1lbnRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQkJZW5hYmxlbWVudEJ1dHRvbi5zZXRTZWxlY3Rpb24oZW5hYmxlZCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yU2VsZWN0ZWQoKSB7Ci0JCQlyZXR1cm4gZXJyb3JCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRFcnJvclNlbGVjdGVkKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJCWVycm9yQnV0dG9uLnNldFNlbGVjdGlvbihzZWxlY3RlZCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmdTZWxlY3RlZCgpIHsKLQkJCXJldHVybiB3YXJuaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0V2FybmluZ1NlbGVjdGVkKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJCXdhcm5pbmdCdXR0b24uc2V0U2VsZWN0aW9uKHNlbGVjdGVkKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzSW5mb1NlbGVjdGVkKCkgewotCQkJcmV0dXJuIGluZm9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRJbmZvU2VsZWN0ZWQoYm9vbGVhbiBzZWxlY3RlZCkgewotCQkJaW5mb0J1dHRvbi5zZXRTZWxlY3Rpb24oc2VsZWN0ZWQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFVwZGF0ZSBlbmFibGVtZW50IGJhc2VkIG9uIHRoZSBlbmFibGVkIGZsYWcuCi0JCSAqIAotCQkgKiBAcGFyYW0gZW5hYmxlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgdXBkYXRlRW5hYmxlbWVudChib29sZWFuIGVuYWJsZWQpIHsKLQotCQkJYm9vbGVhbiBzaG93aW5nU2V2ZXJpdHkgPSBpc1NldmVyaXR5U2VsZWN0ZWQoKTsKLQkJCWVuYWJsZW1lbnRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCWVycm9yQnV0dG9uLnNldEVuYWJsZWQoc2hvd2luZ1NldmVyaXR5ICYmIGVuYWJsZWQpOwotCQkJd2FybmluZ0J1dHRvbi5zZXRFbmFibGVkKHNob3dpbmdTZXZlcml0eSAmJiBlbmFibGVkKTsKLQkJCWluZm9CdXR0b24uc2V0RW5hYmxlZChzaG93aW5nU2V2ZXJpdHkgJiYgZW5hYmxlZCk7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogQHBhcmFtIGZpbHRlcnMKLQkgKi8KLQlwdWJsaWMgRGlhbG9nUHJvYmxlbUZpbHRlcihTaGVsbCBwYXJlbnRTaGVsbCwgUHJvYmxlbUZpbHRlcltdIGZpbHRlcnMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGZpbHRlcnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dNYXJrZXJGaWx0ZXIjY3JlYXRlQXR0cmlidXRlc0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZXNBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJZGVzY3JpcHRpb25Hcm91cCA9IG5ldyBEZXNjcmlwdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0JCXNldmVyaXR5R3JvdXAgPSBuZXcgU2V2ZXJpdHlHcm91cChjb21wb3NpdGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dNYXJrZXJGaWx0ZXIjdXBkYXRlRmlsdGVyRnJvbVVJKG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyRmlsdGVyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUZpbHRlckZyb21VSShNYXJrZXJGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyLnVwZGF0ZUZpbHRlckZyb21VSShmaWx0ZXIpOwotCi0JCVByb2JsZW1GaWx0ZXIgcHJvYmxlbUZpbHRlciA9IChQcm9ibGVtRmlsdGVyKSBmaWx0ZXI7Ci0JCXByb2JsZW1GaWx0ZXIuc2V0Q29udGFpbnMoZGVzY3JpcHRpb25Hcm91cC5nZXRDb250YWlucygpKTsKLQkJcHJvYmxlbUZpbHRlci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbkdyb3VwLmdldERlc2NyaXB0aW9uKCkudHJpbSgpKTsKLQotCQlwcm9ibGVtRmlsdGVyLnNldFNlbGVjdEJ5U2V2ZXJpdHkoc2V2ZXJpdHlHcm91cC5pc1NldmVyaXR5U2VsZWN0ZWQoKSk7Ci0JCWludCBzZXZlcml0eSA9IDA7Ci0JCWlmIChzZXZlcml0eUdyb3VwLmlzRXJyb3JTZWxlY3RlZCgpKSB7Ci0JCQlzZXZlcml0eSA9IHNldmVyaXR5IHwgUHJvYmxlbUZpbHRlci5TRVZFUklUWV9FUlJPUjsKLQkJfQotCQlpZiAoc2V2ZXJpdHlHcm91cC5pc1dhcm5pbmdTZWxlY3RlZCgpKSB7Ci0JCQlzZXZlcml0eSA9IHNldmVyaXR5IHwgUHJvYmxlbUZpbHRlci5TRVZFUklUWV9XQVJOSU5HOwotCQl9Ci0JCWlmIChzZXZlcml0eUdyb3VwLmlzSW5mb1NlbGVjdGVkKCkpIHsKLQkJCXNldmVyaXR5ID0gc2V2ZXJpdHkgfCBQcm9ibGVtRmlsdGVyLlNFVkVSSVRZX0lORk87Ci0JCX0KLQkJcHJvYmxlbUZpbHRlci5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuRGlhbG9nTWFya2VyRmlsdGVyI3VwZGF0ZVVJV2l0aEZpbHRlcihvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlckZpbHRlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVSVdpdGhGaWx0ZXIoTWFya2VyRmlsdGVyIGZpbHRlcikgewotCi0JCVByb2JsZW1GaWx0ZXIgcHJvYmxlbUZpbHRlciA9IChQcm9ibGVtRmlsdGVyKSBmaWx0ZXI7Ci0JCWRlc2NyaXB0aW9uR3JvdXAuc2V0Q29udGFpbnMocHJvYmxlbUZpbHRlci5nZXRDb250YWlucygpKTsKLQkJZGVzY3JpcHRpb25Hcm91cC5zZXREZXNjcmlwdGlvbihwcm9ibGVtRmlsdGVyLmdldERlc2NyaXB0aW9uKCkpOwotCi0JCXNldmVyaXR5R3JvdXAuc2V0RW5hYmxlZChwcm9ibGVtRmlsdGVyLmdldFNlbGVjdEJ5U2V2ZXJpdHkoKSk7Ci0JCWludCBzZXZlcml0eSA9IHByb2JsZW1GaWx0ZXIuZ2V0U2V2ZXJpdHkoKTsKLQotCQlzZXZlcml0eUdyb3VwCi0JCQkJLnNldEVycm9yU2VsZWN0ZWQoKHNldmVyaXR5ICYgUHJvYmxlbUZpbHRlci5TRVZFUklUWV9FUlJPUikgPiAwKTsKLQkJc2V2ZXJpdHlHcm91cAotCQkJCS5zZXRXYXJuaW5nU2VsZWN0ZWQoKHNldmVyaXR5ICYgUHJvYmxlbUZpbHRlci5TRVZFUklUWV9XQVJOSU5HKSA+IDApOwotCQlzZXZlcml0eUdyb3VwCi0JCQkJLnNldEluZm9TZWxlY3RlZCgoc2V2ZXJpdHkgJiBQcm9ibGVtRmlsdGVyLlNFVkVSSVRZX0lORk8pID4gMCk7Ci0KLQkJc3VwZXIudXBkYXRlVUlXaXRoRmlsdGVyKGZpbHRlcik7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuRGlhbG9nTWFya2VyRmlsdGVyI3VwZGF0ZUVuYWJsZWRTdGF0ZShib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVuYWJsZWRTdGF0ZShib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIudXBkYXRlRW5hYmxlZFN0YXRlKGVuYWJsZWQpOwotCQlkZXNjcmlwdGlvbkdyb3VwLnVwZGF0ZUVuYWJsZW1lbnQoZW5hYmxlZCk7Ci0JCXNldmVyaXR5R3JvdXAudXBkYXRlRW5hYmxlbWVudChlbmFibGVkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnZpZXcuRmlsdGVyc0RpYWxvZyNyZXNldFByZXNzZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0UHJlc3NlZCgpIHsKLQkJZGVzY3JpcHRpb25Hcm91cC5zZXRDb250YWlucyhQcm9ibGVtRmlsdGVyLkRFRkFVTFRfQ09OVEFJTlMpOwotCQlkZXNjcmlwdGlvbkdyb3VwLnNldERlc2NyaXB0aW9uKFByb2JsZW1GaWx0ZXIuREVGQVVMVF9ERVNDUklQVElPTik7Ci0KLQkJc2V2ZXJpdHlHcm91cC5zZXRFbmFibGVkKFByb2JsZW1GaWx0ZXIuREVGQVVMVF9TRUxFQ1RfQllfU0VWRVJJVFkpOwotCQlzZXZlcml0eUdyb3VwCi0JCQkJLnNldEVycm9yU2VsZWN0ZWQoKFByb2JsZW1GaWx0ZXIuREVGQVVMVF9TRVZFUklUWSAmIFByb2JsZW1GaWx0ZXIuU0VWRVJJVFlfRVJST1IpID4gMCk7Ci0JCXNldmVyaXR5R3JvdXAKLQkJCQkuc2V0V2FybmluZ1NlbGVjdGVkKChQcm9ibGVtRmlsdGVyLkRFRkFVTFRfU0VWRVJJVFkgJiBQcm9ibGVtRmlsdGVyLlNFVkVSSVRZX1dBUk5JTkcpID4gMCk7Ci0JCXNldmVyaXR5R3JvdXAKLQkJCQkuc2V0SW5mb1NlbGVjdGVkKChQcm9ibGVtRmlsdGVyLkRFRkFVTFRfU0VWRVJJVFkgJiBQcm9ibGVtRmlsdGVyLlNFVkVSSVRZX0lORk8pID4gMCk7Ci0KLQkJc3VwZXIucmVzZXRQcmVzc2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcmtlckZpbHRlciBuZXdGaWx0ZXIoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBQcm9ibGVtRmlsdGVyKG5ld05hbWUpOwotCX0KLQotCXZvaWQgY3JlYXRlRmlsdGVyc0FyZWEoQ29tcG9zaXRlIGRpYWxvZ0FyZWEpIHsKLQotCQlDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQltYWluQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsCi0JCQkJdHJ1ZSkpOwotCi0JCW1haW5Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSB0b3BDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgdG9wRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQl0b3BEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJdG9wRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQl0b3BEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXRvcERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQotCQl0b3BDb21wb3NpdGUuc2V0TGF5b3V0RGF0YSh0b3BEYXRhKTsKLQkJdG9wQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlzdXBlci5jcmVhdGVGaWx0ZXJzQXJlYSh0b3BDb21wb3NpdGUpOwotCi0JCUNvbXBvc2l0ZSBib3R0b21Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgYm90dG9tRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlib3R0b21EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCWJvdHRvbURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJYm90dG9tRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlib3R0b21EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCi0JCWJvdHRvbUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGJvdHRvbURhdGEpOwotCQlib3R0b21Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZVJlZ2lzdGVyZWRGaWx0ZXJzKGJvdHRvbUNvbXBvc2l0ZSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVnaXN0ZXJlZEZpbHRlcnMoQ29tcG9zaXRlIGJvdHRvbUNvbXBvc2l0ZSkgewotCi0JCUNvbXBvc2l0ZSBsaXN0QXJlYSA9IG5ldyBDb21wb3NpdGUoYm90dG9tQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxpc3RBcmVhLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlsaXN0QXJlYS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJTGFiZWwgdGl0bGUgPSBuZXcgTGFiZWwobGlzdEFyZWEsIFNXVC5OT05FKTsKLQkJdGl0bGUuc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5Qcm9ibGVtRmlsdGVyRGlhbG9nX1N5c3RlbV9GaWx0ZXJzX1RpdGxlKTsKLQkJQ2hlY2tib3hUYWJsZVZpZXdlciBkZWZpbmVkTGlzdCA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KAotCQkJCWxpc3RBcmVhLCBTV1QuQk9SREVSKTsKLQkJZGVmaW5lZExpc3Quc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiBNYXJrZXJTdXBwb3J0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldFJlZ2lzdGVyZWRGaWx0ZXJzKCkudG9BcnJheSgpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvLyBEbyBub3RoaW5nCi0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwKLQkJCQkJT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJLy8gRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQlkZWZpbmVkTGlzdC5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoTWFya2VyRmlsdGVyKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWRlZmluZWRMaXN0LmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCSgoTWFya2VyRmlsdGVyKSBldmVudC5nZXRFbGVtZW50KCkpLnNldEVuYWJsZWQoZXZlbnQKLQkJCQkJCS5nZXRDaGVja2VkKCkpOwotCi0JCQl9Ci0JCX0pOwotCi0JCWRlZmluZWRMaXN0Ci0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCQkJCQkgKi8KLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQotCQkJCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQkJCU9iamVjdCBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCQlpZiAoc2VsZWN0ZWQgPT0gbnVsbCkKLQkJCQkJCQkJc3lzdGVtU2V0dGluZ3NMYWJlbC5zZXRUZXh0KFV0aWwuRU1QVFlfU1RSSU5HKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXN5c3RlbVNldHRpbmdzTGFiZWwKLQkJCQkJCQkJCQkuc2V0VGV4dChnZXRTeXN0ZW1GaWx0ZXJTdHJpbmcoKFByb2JsZW1GaWx0ZXIpIHNlbGVjdGVkKSk7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlzeXN0ZW1TZXR0aW5nc0xhYmVsLnNldFRleHQoVXRpbC5FTVBUWV9TVFJJTkcpOwotCQkJCQkJc2hvd1N5c3RlbUxhYmVsKHRydWUpOwotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQlJdGVyYXRvciBkZWZpbmVkRmlsdGVycyA9IE1hcmtlclN1cHBvcnRSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFJlZ2lzdGVyZWRGaWx0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJZGVmaW5lZExpc3Quc2V0SW5wdXQodGhpcyk7Ci0JCXdoaWxlIChkZWZpbmVkRmlsdGVycy5oYXNOZXh0KCkpIHsKLQkJCU1hcmtlckZpbHRlciBuZXh0ID0gKE1hcmtlckZpbHRlcikgZGVmaW5lZEZpbHRlcnMubmV4dCgpOwotCQkJZGVmaW5lZExpc3Quc2V0Q2hlY2tlZChuZXh0LCBuZXh0LmlzRW5hYmxlZCgpKTsKLQkJfQotCi0JCWRlZmluZWRMaXN0LmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKAotCQkJCW5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyaW5nIHdpdGggdGhlIGRldGFpbHMgb2YgZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3lzdGVtRmlsdGVyU3RyaW5nKFByb2JsZW1GaWx0ZXIgZmlsdGVyKSB7Ci0JCVN0cmluZ0J1ZmZlciBmaWx0ZXJCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJU3RyaW5nIHNjb3BlU3RyaW5nID0gZ2V0U2NvcGVTdHJpbmcoZmlsdGVyKTsKLQkJaWYgKHNjb3BlU3RyaW5nICE9IG51bGwpCi0JCQlmaWx0ZXJCdWZmZXIuYXBwZW5kKHNjb3BlU3RyaW5nKTsKLQotCQlTdHJpbmcgZGVzY3JpcHRpb25TdHJpbmcgPSBnZXREZXNjcmlwdGlvblN0cmluZyhmaWx0ZXIpOwotCQlpZiAoZGVzY3JpcHRpb25TdHJpbmcgIT0gbnVsbCl7Ci0JCQlmaWx0ZXJCdWZmZXIuYXBwZW5kKFV0aWwuVFdPX0xJTkVfRkVFRCk7Ci0JCQlmaWx0ZXJCdWZmZXIuYXBwZW5kKGRlc2NyaXB0aW9uU3RyaW5nKTsKLQkJfQotCi0JCVN0cmluZyBzZXZlcml0eVN0cmluZyA9IGdldFNldmVyaXR5U3RyaW5nKGZpbHRlcik7Ci0JCWlmIChzZXZlcml0eVN0cmluZyAhPSBudWxsKSB7Ci0JCQlmaWx0ZXJCdWZmZXIuYXBwZW5kKFV0aWwuVFdPX0xJTkVfRkVFRCk7Ci0JCQlmaWx0ZXJCdWZmZXIuYXBwZW5kKHNldmVyaXR5U3RyaW5nKTsKLQkJfQotCi0JCVN0cmluZyB0eXBlc1N0cmluZyA9IGdldFByb2JsZW1UeXBlc1N0cmluZyhmaWx0ZXIpOwotCQlmaWx0ZXJCdWZmZXIuYXBwZW5kKFV0aWwuVFdPX0xJTkVfRkVFRCk7Ci0JCWZpbHRlckJ1ZmZlci5hcHBlbmQodHlwZXNTdHJpbmcpOwotCi0JCXJldHVybiBmaWx0ZXJCdWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2JsZW0gdHlwZXMgU3RyaW5nIGZvciBmaWx0ZXIuCi0JICogCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvYmxlbVR5cGVzU3RyaW5nKFByb2JsZW1GaWx0ZXIgZmlsdGVyKSB7Ci0JCUxpc3QgdHlwZXMgPSBmaWx0ZXIuZ2V0U2VsZWN0ZWRUeXBlcygpOwotCQlpZiAodHlwZXMuc2l6ZSgpID09IGdldFJvb3RFbnRyaWVzKGZpbHRlcikubGVuZ3RoKQotCQkJcmV0dXJuIE1hcmtlck1lc3NhZ2VzLlByb2JsZW1GaWx0ZXJEaWFsb2dfQWxsX1Byb2JsZW1zOwotCQlTdHJpbmdCdWZmZXIgdHlwZXNCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUl0ZXJhdG9yIHR5cGVzSXRlcmF0b3IgPSB0eXBlcy5pdGVyYXRvcigpOwotCQl0eXBlc0J1ZmZlci5hcHBlbmQoTWFya2VyTWVzc2FnZXMuUHJvYmxlbUZpbHRlckRpYWxvZ19TZWxlY3RlZF9UeXBlcyk7Ci0KLQkJd2hpbGUgKHR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl0eXBlc0J1ZmZlci5hcHBlbmQoVXRpbC5MSU5FX0ZFRURfQU5EX1RBQik7Ci0JCQl0eXBlc0J1ZmZlci5hcHBlbmQoKChNYXJrZXJUeXBlKSB0eXBlc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TGFiZWwoKSk7Ci0KLQkJfQotCQlyZXR1cm4gdHlwZXNCdWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0cmluZyBmb3Igc2V2ZXJpdHkgaWYgdGhlcmUgaXMgb25lLiBPdGhlcndpc2UgcmV0dXJuCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2V2ZXJpdHlTdHJpbmcoUHJvYmxlbUZpbHRlciBmaWx0ZXIpIHsKLQkJaWYgKGZpbHRlci5nZXRTZWxlY3RCeVNldmVyaXR5KCkpIHsKLQkJCXN3aXRjaCAoZmlsdGVyLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgUHJvYmxlbUZpbHRlci5TRVZFUklUWV9JTkZPOgotCQkJCXJldHVybiBNYXJrZXJNZXNzYWdlcy5Qcm9ibGVtRmlsdGVyRGlhbG9nX0luZm9fU2V2ZXJpdHk7Ci0JCQljYXNlIFByb2JsZW1GaWx0ZXIuU0VWRVJJVFlfV0FSTklORzoKLQkJCQlyZXR1cm4gTWFya2VyTWVzc2FnZXMuUHJvYmxlbUZpbHRlckRpYWxvZ19XYXJuaW5nX1NldmVyaXR5OwotCQkJY2FzZSBQcm9ibGVtRmlsdGVyLlNFVkVSSVRZX0VSUk9SOgotCQkJCXJldHVybiBNYXJrZXJNZXNzYWdlcy5Qcm9ibGVtRmlsdGVyRGlhbG9nX0Vycm9yX1NldmVyaXR5OwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIGRlc2NyaXB0aW9uIGlmIHRoZXJlIGlzIG9uZS4gSWYgbm90IHJldHVybgotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcmV0dXJuIFN0cmluZyBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZXNjcmlwdGlvblN0cmluZyhQcm9ibGVtRmlsdGVyIGZpbHRlcikgewotCQlpZiAoZmlsdGVyLmdldERlc2NyaXB0aW9uKCkubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZmlsdGVyLmdldENvbnRhaW5zKCkpCi0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCU1hcmtlck1lc3NhZ2VzLlByb2JsZW1GaWx0ZXJEaWFsb2dfQ29udGFpbnNfRGVzY3JpcHRpb24sCi0JCQkJCWZpbHRlci5nZXREZXNjcmlwdGlvbigpKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlNYXJrZXJNZXNzYWdlcy5Qcm9ibGVtRmlsdGVyRGlhbG9nX0RvZXNfTm90X0NvbnRhaW5fRGVzY3JpcHRpb24sCi0JCQkJCQkJZmlsdGVyLmdldERlc2NyaXB0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBzY29wZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogQHJldHVybiBTdHJpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNldmVyaXR5IGRvZXMgbm90IG1hdGNoLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNjb3BlU3RyaW5nKFByb2JsZW1GaWx0ZXIgZmlsdGVyKSB7Ci0KLQkJc3dpdGNoIChmaWx0ZXIub25SZXNvdXJjZSkgewotCQljYXNlIE1hcmtlckZpbHRlci5PTl9BTlk6Ci0JCQlyZXR1cm4gTWFya2VyTWVzc2FnZXMuUHJvYmxlbUZpbHRlckRpYWxvZ19hbnk7Ci0JCWNhc2UgTWFya2VyRmlsdGVyLk9OX0FOWV9JTl9TQU1FX0NPTlRBSU5FUjoKLQkJCXJldHVybiBNYXJrZXJNZXNzYWdlcy5Qcm9ibGVtRmlsdGVyRGlhbG9nX3NhbWVDb250YWluZXI7Ci0JCWNhc2UgTWFya2VyRmlsdGVyLk9OX1NFTEVDVEVEX0FORF9DSElMRFJFTjoKLQkJCXJldHVybiBNYXJrZXJNZXNzYWdlcy5Qcm9ibGVtRmlsdGVyRGlhbG9nX3NlbGVjdGVkQW5kQ2hpbGRyZW47Ci0JCWNhc2UgTWFya2VyRmlsdGVyLk9OX1NFTEVDVEVEX09OTFk6Ci0JCQlyZXR1cm4gTWFya2VyTWVzc2FnZXMuUHJvYmxlbUZpbHRlckRpYWxvZ19zZWxlY3RlZDsKLQkJY2FzZSBNYXJrZXJGaWx0ZXIuT05fV09SS0lOR19TRVQ6Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTWFya2VyTWVzc2FnZXMuUHJvYmxlbUZpbHRlckRpYWxvZ193b3JraW5nU2V0LAotCQkJCQlmaWx0ZXIuZ2V0V29ya2luZ1NldCgpKTsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIG51bGw7Ci0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dNYXJrZXJGaWx0ZXIjc2V0U2VsZWN0ZWRGaWx0ZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0ZWRGaWx0ZXIoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXNob3dTeXN0ZW1MYWJlbChmYWxzZSk7Ci0JCXN1cGVyLnNldFNlbGVjdGVkRmlsdGVyKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBTaG93IG9yIGhpZGUgdGhlIHN5c3RlbSBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gc3lzdGVtTGFiZWxTaG93aW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1N5c3RlbUxhYmVsKGJvb2xlYW4gc3lzdGVtTGFiZWxTaG93aW5nKSB7Ci0KLQkJc3lzdGVtU2V0dGluZ3NMYWJlbC5zZXRWaXNpYmxlKHN5c3RlbUxhYmVsU2hvd2luZyk7Ci0JCXVzZXJGaWx0ZXJDb21wb3NpdGUuc2V0VmlzaWJsZSghc3lzdGVtTGFiZWxTaG93aW5nKTsKLQkJdXNlckZpbHRlckNvbXBvc2l0ZS5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuRGlhbG9nTWFya2VyRmlsdGVyI2NyZWF0ZVNlbGVjdGVkRmlsdGVyQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVNlbGVjdGVkRmlsdGVyQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJQ29tcG9zaXRlIHdyYXBwZXIgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlGb3JtTGF5b3V0IHdyYXBwZXJMYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOwotCQl3cmFwcGVyTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXdyYXBwZXJMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQl3cmFwcGVyLnNldExheW91dCh3cmFwcGVyTGF5b3V0KTsKLQotCQlzeXN0ZW1TZXR0aW5nc0xhYmVsID0gY3JlYXRlU3lzdGVtU2V0dGluZ3NMYWJlbCh3cmFwcGVyKTsKLQkJc3lzdGVtU2V0dGluZ3NMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQlGb3JtRGF0YSBzeXN0ZW1EYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCXN5c3RlbURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJc3lzdGVtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCXN5c3RlbURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMQotCQkJCSogSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCXN5c3RlbURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEKLQkJCQkqIElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQotCQlzeXN0ZW1TZXR0aW5nc0xhYmVsLnNldExheW91dERhdGEoc3lzdGVtRGF0YSk7Ci0KLQkJdXNlckZpbHRlckNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZVNlbGVjdGVkRmlsdGVyQXJlYSh3cmFwcGVyKTsKLQotCQlGb3JtRGF0YSB1c2VyRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQl1c2VyRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCXVzZXJEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCXVzZXJEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXVzZXJEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCi0JCXVzZXJGaWx0ZXJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YSh1c2VyRGF0YSk7Ci0KLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBsYWJlbCBmb3Igc3lzdGVtIGZpbHRlcnMuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcmV0dXJuIExhYmVsCi0JICovCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVTeXN0ZW1TZXR0aW5nc0xhYmVsKENvbXBvc2l0ZSB3cmFwcGVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBMYWJlbCh3cmFwcGVyLCBTV1QuTk9ORSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRGlhbG9nUHJvYmxlbVByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0RpYWxvZ1Byb2JsZW1Qcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYWM5NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRGlhbG9nUHJvYmxlbVByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1jbGFzcyBEaWFsb2dQcm9ibGVtUHJvcGVydGllcyBleHRlbmRzIERpYWxvZ01hcmtlclByb3BlcnRpZXMgewotCi0gICAgcHJpdmF0ZSBMYWJlbCBzZXZlcml0eUxhYmVsOwotCi0gICAgRGlhbG9nUHJvYmxlbVByb3BlcnRpZXMoU2hlbGwgcGFyZW50U2hlbGwpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnZpZXcuTWFya2VyUHJvcGVydGllc0RpYWxvZyNjcmVhdGVBdHRyaWJ1dGVzQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlc0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzdXBlci5jcmVhdGVBdHRyaWJ1dGVzQXJlYShwYXJlbnQpOwotCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotICAgICAgICBzZXZlcml0eUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBzZXZlcml0eUxhYmVsLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vydmlldy5NYXJrZXJQcm9wZXJ0aWVzRGlhbG9nI3VwZGF0ZURpYWxvZ0Zyb21NYXJrZXIoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZURpYWxvZ0Zyb21NYXJrZXIoKSB7Ci0gICAgICAgIHN1cGVyLnVwZGF0ZURpYWxvZ0Zyb21NYXJrZXIoKTsKLSAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBnZXRNYXJrZXIoKTsKLSAgICAgICAgaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy9UT0RPIGRpc3BsYXkgaW1hZ2UgcmF0aGVyIHRoYW4gdGV4dAotICAgICAgICBGaWVsZFNldmVyaXR5IHR5cGUgPSBuZXcgRmllbGRTZXZlcml0eSgpOwotICAgICAgICBzZXZlcml0eUxhYmVsLnNldEltYWdlKHR5cGUuZ2V0SW1hZ2UobWFya2VyKSk7Ci0gICAgICAgIGludCBzZXZlcml0eSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotICAgICAgICBpZiAoc2V2ZXJpdHkgPT0gSU1hcmtlci5TRVZFUklUWV9FUlJPUikgewotICAgICAgICAgICAgc2V2ZXJpdHlMYWJlbC5zZXRUZXh0KAotICAgICAgICAgICAgCQlOTFMuYmluZCgKLSAgICAgICAgICAgIAkJCU1hcmtlck1lc3NhZ2VzLnByb3BlcnRpZXNEaWFsb2dfc2V2ZXJpdHlMYWJlbCwKLSAgICAgICAgICAgIAkJICAgIE1hcmtlck1lc3NhZ2VzLnByb3BlcnRpZXNEaWFsb2dfZXJyb3JMYWJlbCkpOwotICAgICAgICB9IGVsc2UgaWYgKHNldmVyaXR5ID09IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORykgewotICAgICAgICAgICAgc2V2ZXJpdHlMYWJlbC5zZXRUZXh0KAotICAgICAgICAgICAgCQlOTFMuYmluZCgKLSAgICAgICAgICAgICAgICAJCQlNYXJrZXJNZXNzYWdlcy5wcm9wZXJ0aWVzRGlhbG9nX3NldmVyaXR5TGFiZWwsCi0gICAgICAgICAgICAgICAgCQkgICAgTWFya2VyTWVzc2FnZXMucHJvcGVydGllc0RpYWxvZ193YXJuaW5nTGFiZWwpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXZlcml0eSA9PSBJTWFya2VyLlNFVkVSSVRZX0lORk8pIHsKLSAgICAgICAgICAgIHNldmVyaXR5TGFiZWwuc2V0VGV4dCgKLSAgICAgICAgICAgIAkJTkxTLmJpbmQoCi0gICAgICAgICAgICAgICAgCQkJTWFya2VyTWVzc2FnZXMucHJvcGVydGllc0RpYWxvZ19zZXZlcml0eUxhYmVsLAotICAgICAgICAgICAgICAgIAkJICAgIE1hcmtlck1lc3NhZ2VzLnByb3BlcnRpZXNEaWFsb2dfaW5mb0xhYmVsKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXZlcml0eUxhYmVsLnNldFRleHQoCi0gICAgICAgICAgICAJCU5MUy5iaW5kKAotICAgICAgICAgICAgICAgIAkJCU1hcmtlck1lc3NhZ2VzLnByb3BlcnRpZXNEaWFsb2dfc2V2ZXJpdHlMYWJlbCwKLSAgICAgICAgICAgICAgICAJCSAgICBNYXJrZXJNZXNzYWdlcy5wcm9wZXJ0aWVzRGlhbG9nX25vc2V2ZXJpdHlMYWJlbCkpOwotIAotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9EaWFsb2dUYXNrRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9EaWFsb2dUYXNrRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2Yzg4MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRGlhbG9nVGFza0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgRGlhbG9nVGFza0ZpbHRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuRGlhbG9nTWFya2VyRmlsdGVyIHsKLQotCXByaXZhdGUgRGVzY3JpcHRpb25Hcm91cCBkZXNjcmlwdGlvbkdyb3VwOwotCi0JcHJpdmF0ZSBQcmlvcml0eUdyb3VwIHByaW9yaXR5R3JvdXA7Ci0KLQlwcml2YXRlIFN0YXR1c0dyb3VwIHN0YXR1c0dyb3VwOwotCi0JcHJpdmF0ZSBjbGFzcyBEZXNjcmlwdGlvbkdyb3VwIHsKLQkJcHJpdmF0ZSBMYWJlbCBkZXNjcmlwdGlvbkxhYmVsOwotCi0JCXByaXZhdGUgQ29tYm8gY29tYm87Ci0KLQkJcHJpdmF0ZSBUZXh0IGRlc2NyaXB0aW9uOwotCi0JCXByaXZhdGUgU3RyaW5nIGNvbnRhaW5zID0gTWFya2VyTWVzc2FnZXMuZmlsdGVyc0RpYWxvZ19jb250YWluczsKLQotCQlwcml2YXRlIFN0cmluZyBkb2VzTm90Q29udGFpbiA9IE1hcmtlck1lc3NhZ2VzLmZpbHRlcnNEaWFsb2dfZG9lc05vdENvbnRhaW47Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhIG5ldyBEZXNjcmlwdGlvbkdyb3VwLgotCQkgKiAKLQkJICogQHBhcmFtIHBhcmVudAotCQkgKi8KLQkJcHVibGljIERlc2NyaXB0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJZGVzY3JpcHRpb25MYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWRlc2NyaXB0aW9uTGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCWRlc2NyaXB0aW9uTGFiZWwuc2V0VGV4dCgKLQkJCQlNYXJrZXJNZXNzYWdlcy5maWx0ZXJzRGlhbG9nX2Rlc2NyaXB0aW9uTGFiZWwpOwotCi0JCQljb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQkJY29tYm8uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCWNvbWJvLmFkZChjb250YWlucyk7Ci0JCQljb21iby5hZGQoZG9lc05vdENvbnRhaW4pOwotCQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkgICAgICAgIAkvKiAobm9uLUphdmFkb2MpCi0JICAgICAgICAJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICAgICAgICAJICovCi0JICAgICAgICAJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCSAgICAgICAgCQkgIHVwZGF0ZUZvclNlbGVjdGlvbigpOwotCSAgICAgICAgCX0KLQkgICAgICAgICAgfSk7Ci0JCQkvLyBQcmV2ZW50IEVzYyBhbmQgUmV0dXJuIGZyb20gY2xvc2luZyB0aGUgZGlhbG9nIHdoZW4gdGhlIGNvbWJvIGlzCi0JCQkvLyBhY3RpdmUuCi0JCQljb21iby5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQkJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9FU0NBUEUKLQkJCQkJCQl8fCBlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfUkVUVVJOKSB7Ci0JCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQlkZXNjcmlwdGlvbiA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJZGVzY3JpcHRpb24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJZGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWRlc2NyaXB0aW9uLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJRGlhbG9nVGFza0ZpbHRlci50aGlzLm1hcmtEaXJ0eSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0Q29udGFpbnMoKSB7Ci0JCQlyZXR1cm4gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSBjb21iby5pbmRleE9mKGNvbnRhaW5zKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvbnRhaW5zKGJvb2xlYW4gdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSkgewotCQkJCWNvbWJvLnNlbGVjdChjb21iby5pbmRleE9mKGNvbnRhaW5zKSk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbWJvLnNlbGVjdChjb21iby5pbmRleE9mKGRvZXNOb3RDb250YWluKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdGV4dCkgewotCQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJCWRlc2NyaXB0aW9uLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkIAotCQkJfSBlbHNlIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRUZXh0KHRleHQpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbi5nZXRUZXh0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogVXBkYXRlIHRoZSBlbmFibGVkIHN0YXRlLgotCQkgKiBAcGFyYW0gZW5hYmxlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgdXBkYXRlRW5hYmxlbWVudChib29sZWFuIGVuYWJsZWQpIHsKLQkJCWRlc2NyaXB0aW9uTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCWNvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBQcmlvcml0eUdyb3VwIHsKLQkJcHJpdmF0ZSBCdXR0b24gZW5hYmxlbWVudEJ1dHRvbjsKLQotCQlwcml2YXRlIEJ1dHRvbiBoaWdoQnV0dG9uOwotCi0JCXByaXZhdGUgQnV0dG9uIG5vcm1hbEJ1dHRvbjsKLQotCQlwcml2YXRlIEJ1dHRvbiBsb3dCdXR0b247Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhIG5ldyBwcmlvcml0eSBncm91cC4KLQkJICogCi0JCSAqIEBwYXJhbSBwYXJlbnQKLQkJICovCi0JCXB1YmxpYyBQcmlvcml0eUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl1cGRhdGVFbmFibGVtZW50KHRydWUpOwotCQkJCQlEaWFsb2dUYXNrRmlsdGVyLnRoaXMubWFya0RpcnR5KCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJZW5hYmxlbWVudEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQllbmFibGVtZW50QnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQllbmFibGVtZW50QnV0dG9uLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCQllbmFibGVtZW50QnV0dG9uLnNldFRleHQoCi0JCQkJCU1hcmtlck1lc3NhZ2VzLmZpbHRlcnNEaWFsb2dfcHJpb3JpdHlMYWJlbCk7Ci0JCQllbmFibGVtZW50QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkJaGlnaEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQkJaGlnaEJ1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJaGlnaEJ1dHRvbgotCQkJCQkuc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5maWx0ZXJzRGlhbG9nX3ByaW9yaXR5SGlnaCk7Ci0JCQloaWdoQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJaGlnaEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCSAgICAgICAgCS8qIChub24tSmF2YWRvYykKLQkgICAgICAgIAkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgICAgICAgIAkgKi8KLQkgICAgICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JICAgICAgICAJCSAgdXBkYXRlRm9yU2VsZWN0aW9uKCk7Ci0JICAgICAgICAJfQotCSAgICAgICAgICB9KTsKLQotCQkJbm9ybWFsQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCQlub3JtYWxCdXR0b24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCW5vcm1hbEJ1dHRvbi5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLmZpbHRlcnNEaWFsb2dfcHJpb3JpdHlOb3JtYWwpOwotCQkJbm9ybWFsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJbm9ybWFsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JICAgICAgICAJLyogKG5vbi1KYXZhZG9jKQotCSAgICAgICAgCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAgICAgICAgCSAqLwotCSAgICAgICAgCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkgICAgICAgIAkJICB1cGRhdGVGb3JTZWxlY3Rpb24oKTsKLQkgICAgICAgIAl9Ci0JICAgICAgICAgIH0pOwotCi0JCQlsb3dCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJCWxvd0J1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJbG93QnV0dG9uLnNldFRleHQoTWFya2VyTWVzc2FnZXMuZmlsdGVyc0RpYWxvZ19wcmlvcml0eUxvdyk7Ci0JCQlsb3dCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlsb3dCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkgICAgICAgIAkvKiAobm9uLUphdmFkb2MpCi0JICAgICAgICAJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICAgICAgICAJICovCi0JICAgICAgICAJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCSAgICAgICAgCQkgIHVwZGF0ZUZvclNlbGVjdGlvbigpOwotCSAgICAgICAgCX0KLQkgICAgICAgICAgfSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1ByaW9yaXR5RW5hYmxlZCgpIHsKLQkJCXJldHVybiBlbmFibGVtZW50QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJCWVuYWJsZW1lbnRCdXR0b24uc2V0U2VsZWN0aW9uKGVuYWJsZWQpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNIaWdoU2VsZWN0ZWQoKSB7Ci0JCQlyZXR1cm4gaGlnaEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEhpZ2hTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKSB7Ci0JCQloaWdoQnV0dG9uLnNldFNlbGVjdGlvbihzZWxlY3RlZCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc05vcm1hbFNlbGVjdGVkKCkgewotCQkJcmV0dXJuIG5vcm1hbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5vcm1hbFNlbGVjdGVkKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJCW5vcm1hbEJ1dHRvbi5zZXRTZWxlY3Rpb24oc2VsZWN0ZWQpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMb3dTZWxlY3RlZCgpIHsKLQkJCXJldHVybiBsb3dCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRMb3dTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKSB7Ci0JCQlsb3dCdXR0b24uc2V0U2VsZWN0aW9uKHNlbGVjdGVkKTsKLQkJfQotCi0JCS8qKgotCQkgKiBVcGRhdGUgZW5hYmxlbWVudCBiYXNlZCBvbiBlbmFibGVkLgotCQkgKiBAcGFyYW0gZW5hYmxlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgdXBkYXRlRW5hYmxlbWVudChib29sZWFuIGVuYWJsZWQpIHsKLQkJCWVuYWJsZW1lbnRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCWhpZ2hCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkICYmIGlzUHJpb3JpdHlFbmFibGVkKCkpOwotCQkJbm9ybWFsQnV0dG9uCi0JCQkJCS5zZXRFbmFibGVkKGVuYWJsZWQgJiYgaXNQcmlvcml0eUVuYWJsZWQoKSk7Ci0JCQlsb3dCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkICYmIGlzUHJpb3JpdHlFbmFibGVkKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTdGF0dXNHcm91cCB7Ci0JCXByaXZhdGUgQnV0dG9uIGVuYWJsZW1lbnRCdXR0b247Ci0KLQkJcHJpdmF0ZSBCdXR0b24gY29tcGxldGVCdXR0b247Ci0KLQkJcHJpdmF0ZSBCdXR0b24gaW5jb21wbGV0ZUJ1dHRvbjsKLQotCQkvKioKLQkJICogQ3JlYXRlIGEgbmV3IFN0YXR1c0dyb3VwLgotCQkgKiAKLQkJICogQHBhcmFtIHBhcmVudAotCQkgKi8KLQkJcHVibGljIFN0YXR1c0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCVNlbGVjdGlvbkxpc3RlbmVyIGVuYWJsZW1lbnRMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJdXBkYXRlRW5hYmxlbWVudCh0cnVlKTsKLQkJCQkJRGlhbG9nVGFza0ZpbHRlci50aGlzLm1hcmtEaXJ0eSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCWVuYWJsZW1lbnRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZW5hYmxlbWVudEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJZW5hYmxlbWVudEJ1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJZW5hYmxlbWVudEJ1dHRvbi5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLmZpbHRlcnNEaWFsb2dfc3RhdHVzTGFiZWwpOwotCQkJZW5hYmxlbWVudEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihlbmFibGVtZW50TGlzdGVuZXIpOwotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJY29tcGxldGVCdXR0b24uc2V0U2VsZWN0aW9uKCFpbmNvbXBsZXRlQnV0dG9uCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaW5jb21wbGV0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oIWNvbXBsZXRlQnV0dG9uCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJRGlhbG9nVGFza0ZpbHRlci50aGlzLm1hcmtEaXJ0eSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCWNvbXBsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCQljb21wbGV0ZUJ1dHRvbi5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQkJY29tcGxldGVCdXR0b24uc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5maWx0ZXJzRGlhbG9nX3N0YXR1c0NvbXBsZXRlKTsKLQkJCWNvbXBsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkJaW5jb21wbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQkJaW5jb21wbGV0ZUJ1dHRvbi5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQkJaW5jb21wbGV0ZUJ1dHRvbi5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLmZpbHRlcnNEaWFsb2dfc3RhdHVzSW5jb21wbGV0ZSk7Ci0JCQlpbmNvbXBsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzU3RhdHVzRW5hYmxlZCgpIHsKLQkJCXJldHVybiBlbmFibGVtZW50QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJCWVuYWJsZW1lbnRCdXR0b24uc2V0U2VsZWN0aW9uKGVuYWJsZWQpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0RG9uZSgpIHsKLQkJCXJldHVybiBjb21wbGV0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldERvbmUoYm9vbGVhbiBkb25lKSB7Ci0JCQljb21wbGV0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZG9uZSk7Ci0JCQlpbmNvbXBsZXRlQnV0dG9uLnNldFNlbGVjdGlvbighZG9uZSk7Ci0JCX0KLQotCQkvKioKLQkJICogVXBkYXRlIHRoZSBlbmFibGVtZW50IHN0YXRlIG9mIHRoZSBncm91cC4KLQkJICogQHBhcmFtIGVuYWJsZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZUVuYWJsZW1lbnQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCQllbmFibGVtZW50QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQljb21wbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGlzU3RhdHVzRW5hYmxlZCgpCi0JCQkJCSYmIGVuYWJsZWQpOwotCQkJaW5jb21wbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGlzU3RhdHVzRW5hYmxlZCgpCi0JCQkJCSYmIGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBmaWx0ZXJzCi0JICovCi0JcHVibGljIERpYWxvZ1Rhc2tGaWx0ZXIoU2hlbGwgcGFyZW50U2hlbGwsIFRhc2tGaWx0ZXJbXSBmaWx0ZXJzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBmaWx0ZXJzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuRGlhbG9nTWFya2VyRmlsdGVyI2NyZWF0ZUF0dHJpYnV0ZXNBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVzQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDUsIGZhbHNlKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDc7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlkZXNjcmlwdGlvbkdyb3VwID0gbmV3IERlc2NyaXB0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQkJcHJpb3JpdHlHcm91cCA9IG5ldyBQcmlvcml0eUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCXN0YXR1c0dyb3VwID0gbmV3IFN0YXR1c0dyb3VwKGNvbXBvc2l0ZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuRGlhbG9nTWFya2VyRmlsdGVyI3VwZGF0ZUZpbHRlckZyb21VSShvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlckZpbHRlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVGaWx0ZXJGcm9tVUkoTWFya2VyRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci51cGRhdGVGaWx0ZXJGcm9tVUkoZmlsdGVyKTsKLQotCQlUYXNrRmlsdGVyIHRhc2tGaWx0ZXIgPSAoVGFza0ZpbHRlcilmaWx0ZXI7Ci0JCXRhc2tGaWx0ZXIuc2V0Q29udGFpbnMoZGVzY3JpcHRpb25Hcm91cC5nZXRDb250YWlucygpKTsKLQkJdGFza0ZpbHRlci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbkdyb3VwLmdldERlc2NyaXB0aW9uKCkudHJpbSgpKTsKLQotCQl0YXNrRmlsdGVyLnNldFNlbGVjdEJ5UHJpb3JpdHkocHJpb3JpdHlHcm91cC5pc1ByaW9yaXR5RW5hYmxlZCgpKTsKLQkJaW50IHByaW9yaXR5ID0gMDsKLQkJaWYgKHByaW9yaXR5R3JvdXAuaXNIaWdoU2VsZWN0ZWQoKSkgewotCQkJcHJpb3JpdHkgPSBwcmlvcml0eSB8IFRhc2tGaWx0ZXIuUFJJT1JJVFlfSElHSDsKLQkJfQotCQlpZiAocHJpb3JpdHlHcm91cC5pc05vcm1hbFNlbGVjdGVkKCkpIHsKLQkJCXByaW9yaXR5ID0gcHJpb3JpdHkgfCBUYXNrRmlsdGVyLlBSSU9SSVRZX05PUk1BTDsKLQkJfQotCQlpZiAocHJpb3JpdHlHcm91cC5pc0xvd1NlbGVjdGVkKCkpIHsKLQkJCXByaW9yaXR5ID0gcHJpb3JpdHkgfCBUYXNrRmlsdGVyLlBSSU9SSVRZX0xPVzsKLQkJfQotCQl0YXNrRmlsdGVyLnNldFByaW9yaXR5KHByaW9yaXR5KTsKLQotCQl0YXNrRmlsdGVyLnNldFNlbGVjdEJ5RG9uZShzdGF0dXNHcm91cC5pc1N0YXR1c0VuYWJsZWQoKSk7Ci0JCXRhc2tGaWx0ZXIuc2V0RG9uZShzdGF0dXNHcm91cC5nZXREb25lKCkpOwotCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLkRpYWxvZ01hcmtlckZpbHRlciN1cGRhdGVVSVdpdGhGaWx0ZXIob3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJGaWx0ZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVUlXaXRoRmlsdGVyKE1hcmtlckZpbHRlciBmaWx0ZXIpIHsKLQkJVGFza0ZpbHRlciB0YXNrRmlsdGVyID0gKFRhc2tGaWx0ZXIpZmlsdGVyOwotCQlkZXNjcmlwdGlvbkdyb3VwLnNldENvbnRhaW5zKHRhc2tGaWx0ZXIuZ2V0Q29udGFpbnMoKSk7Ci0JCWRlc2NyaXB0aW9uR3JvdXAuc2V0RGVzY3JpcHRpb24odGFza0ZpbHRlci5nZXREZXNjcmlwdGlvbigpKTsKLQotCQlwcmlvcml0eUdyb3VwLnNldEVuYWJsZWQodGFza0ZpbHRlci5nZXRTZWxlY3RCeVByaW9yaXR5KCkpOwotCQlpbnQgcHJpb3JpdHkgPSB0YXNrRmlsdGVyLmdldFByaW9yaXR5KCk7Ci0JCXByaW9yaXR5R3JvdXAKLQkJCQkuc2V0SGlnaFNlbGVjdGVkKChwcmlvcml0eSAmIFRhc2tGaWx0ZXIuUFJJT1JJVFlfSElHSCkgPiAwKTsKLQkJcHJpb3JpdHlHcm91cAotCQkJCS5zZXROb3JtYWxTZWxlY3RlZCgocHJpb3JpdHkgJiBUYXNrRmlsdGVyLlBSSU9SSVRZX05PUk1BTCkgPiAwKTsKLQkJcHJpb3JpdHlHcm91cC5zZXRMb3dTZWxlY3RlZCgocHJpb3JpdHkgJiBUYXNrRmlsdGVyLlBSSU9SSVRZX0xPVykgPiAwKTsKLQotCQlzdGF0dXNHcm91cC5zZXRFbmFibGVkKHRhc2tGaWx0ZXIuZ2V0U2VsZWN0QnlEb25lKCkpOwotCQlzdGF0dXNHcm91cC5zZXREb25lKHRhc2tGaWx0ZXIuZ2V0RG9uZSgpKTsKLQkJCi0JCXN1cGVyLnVwZGF0ZVVJV2l0aEZpbHRlcihmaWx0ZXIpOwotCi0JCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dNYXJrZXJGaWx0ZXIjdXBkYXRlRW5hYmxlZFN0YXRlKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci51cGRhdGVFbmFibGVkU3RhdGUoZW5hYmxlZCk7Ci0JCWRlc2NyaXB0aW9uR3JvdXAudXBkYXRlRW5hYmxlbWVudChlbmFibGVkKTsKLQkJcHJpb3JpdHlHcm91cC51cGRhdGVFbmFibGVtZW50KGVuYWJsZWQpOwotCQlzdGF0dXNHcm91cC51cGRhdGVFbmFibGVtZW50KGVuYWJsZWQpOwotCX0KLQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vydmlldy5GaWx0ZXJzRGlhbG9nI3Jlc2V0UHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRQcmVzc2VkKCkgewotCQlkZXNjcmlwdGlvbkdyb3VwLnNldENvbnRhaW5zKFRhc2tGaWx0ZXIuREVGQVVMVF9DT05UQUlOUyk7Ci0JCWRlc2NyaXB0aW9uR3JvdXAuc2V0RGVzY3JpcHRpb24oVGFza0ZpbHRlci5ERUZBVUxUX0RFU0NSSVBUSU9OKTsKLQotCQlwcmlvcml0eUdyb3VwLnNldEVuYWJsZWQoVGFza0ZpbHRlci5ERUZBVUxUX1NFTEVDVF9CWV9QUklPUklUWSk7Ci0JCXByaW9yaXR5R3JvdXAKLQkJCQkuc2V0SGlnaFNlbGVjdGVkKChUYXNrRmlsdGVyLkRFRkFVTFRfUFJJT1JJVFkgJiBUYXNrRmlsdGVyLlBSSU9SSVRZX0hJR0gpID4gMCk7Ci0JCXByaW9yaXR5R3JvdXAKLQkJCQkuc2V0Tm9ybWFsU2VsZWN0ZWQoKFRhc2tGaWx0ZXIuREVGQVVMVF9QUklPUklUWSAmIFRhc2tGaWx0ZXIuUFJJT1JJVFlfTk9STUFMKSA+IDApOwotCQlwcmlvcml0eUdyb3VwCi0JCQkJLnNldExvd1NlbGVjdGVkKChUYXNrRmlsdGVyLkRFRkFVTFRfUFJJT1JJVFkgJiBUYXNrRmlsdGVyLlBSSU9SSVRZX05PUk1BTCkgPiAwKTsKLQotCQlzdGF0dXNHcm91cC5zZXRFbmFibGVkKFRhc2tGaWx0ZXIuREVGQVVMVF9TRUxFQ1RfQllfRE9ORSk7Ci0JCXN0YXR1c0dyb3VwLnNldERvbmUoVGFza0ZpbHRlci5ERUZBVUxUX0RPTkUpOwotCi0JCXN1cGVyLnJlc2V0UHJlc3NlZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dNYXJrZXJGaWx0ZXIjbmV3RmlsdGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIE1hcmtlckZpbHRlciBuZXdGaWx0ZXIoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBUYXNrRmlsdGVyKG5ld05hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRGlhbG9nVGFza1Byb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0RpYWxvZ1Rhc2tQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjN2Y0MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRGlhbG9nVGFza1Byb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBEaWFsb2dUYXNrUHJvcGVydGllcyBleHRlbmRzIERpYWxvZ01hcmtlclByb3BlcnRpZXMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX0hJR0ggPSAKLSAgICAJTWFya2VyTWVzc2FnZXMucHJvcGVydGllc0RpYWxvZ19wcmlvcml0eUhpZ2g7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfTk9STUFMID0gCi0gICAgCU1hcmtlck1lc3NhZ2VzLnByb3BlcnRpZXNEaWFsb2dfcHJpb3JpdHlOb3JtYWw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfTE9XID0gCi0gICAgCU1hcmtlck1lc3NhZ2VzLnByb3BlcnRpZXNEaWFsb2dfcHJpb3JpdHlMb3c7Ci0KLSAgICBwcm90ZWN0ZWQgQ29tYm8gcHJpb3JpdHlDb21ibzsKLQotICAgIHByb3RlY3RlZCBCdXR0b24gY29tcGxldGVkQ2hlY2tib3g7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgRGlhbG9nVGFza1Byb3BlcnRpZXMoU2hlbGwgcGFyZW50U2hlbGwpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgICBzZXRUeXBlKElNYXJrZXIuVEFTSyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAgICovCi0gICAgRGlhbG9nVGFza1Byb3BlcnRpZXMoU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSkgewotICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCwgdGl0bGUpOwotICAgICAgICBzZXRUeXBlKElNYXJrZXIuVEFTSyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dNYXJrZXJQcm9wZXJ0aWVzI2NyZWF0ZUF0dHJpYnV0ZXNBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVzQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUF0dHJpYnV0ZXNBcmVhKHBhcmVudCk7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5wcm9wZXJ0aWVzRGlhbG9nX3ByaW9yaXR5KTsKLSAgICAgICAgcHJpb3JpdHlDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBwcmlvcml0eUNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7IFBSSU9SSVRZX0hJR0gsIFBSSU9SSVRZX05PUk1BTCwKLSAgICAgICAgICAgICAgICBQUklPUklUWV9MT1cgfSk7Ci0gICAgICAgIC8vIFByZXZlbnQgRXNjIGFuZCBSZXR1cm4gZnJvbSBjbG9zaW5nIHRoZSBkaWFsb2cgd2hlbiB0aGUgY29tYm8gaXMgYWN0aXZlLgotICAgICAgICBwcmlvcml0eUNvbWJvLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9FU0NBUEUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLSAgICAgICAgICAgICAgICAgICAgZS5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcHJpb3JpdHlDb21iby5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotICAgICAgICBwcmlvcml0eUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChnZXRNYXJrZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcCBpbml0aWFsQXR0cmlidXRlcyA9IGdldEluaXRpYWxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGluaXRpYWxBdHRyaWJ1dGVzLnB1dChJTWFya2VyLlBSSU9SSVRZLCBuZXcgSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcmlvcml0eUZyb21EaWFsb2coKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYXJrRGlydHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY29tcGxldGVkQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLSAgICAgICAgY29tcGxldGVkQ2hlY2tib3guc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLSAgICAgICAgY29tcGxldGVkQ2hlY2tib3guc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5wcm9wZXJ0aWVzRGlhbG9nX2NvbXBsZXRlZCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscygyMCk7Ci0gICAgICAgIGNvbXBsZXRlZENoZWNrYm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBjb21wbGV0ZWRDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0TWFya2VyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBNYXAgaW5pdGlhbEF0dHJpYnV0ZXMgPSBnZXRJbml0aWFsQXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgICAgICBpbml0aWFsQXR0cmlidXRlcy5wdXQoSU1hcmtlci5ET05FLCBuZXcgQm9vbGVhbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYXJrRGlydHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Q29tcGxldGVkKCkgewotICAgICAgICBJTWFya2VyIG1hcmtlciA9IGdldE1hcmtlcigpOwotICAgICAgICBpZiAobWFya2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gZ2V0SW5pdGlhbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIE9iamVjdCBkb25lID0gYXR0cmlidXRlcy5nZXQoSU1hcmtlci5ET05FKTsKLSAgICAgICAgICAgIHJldHVybiBkb25lICE9IG51bGwgJiYgZG9uZSBpbnN0YW5jZW9mIEJvb2xlYW4KLSAgICAgICAgICAgICAgICAgICAgJiYgKChCb29sZWFuKSBkb25lKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuRE9ORSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRQcmlvcml0eSgpIHsKLSAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBnZXRNYXJrZXIoKTsKLSAgICAgICAgaW50IHByaW9yaXR5ID0gSU1hcmtlci5QUklPUklUWV9OT1JNQUw7Ci0gICAgICAgIGlmIChtYXJrZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgTWFwIGF0dHJpYnV0ZXMgPSBnZXRJbml0aWFsQXR0cmlidXRlcygpOwotICAgICAgICAgICAgT2JqZWN0IHByaW9yaXR5T2JqID0gYXR0cmlidXRlcy5nZXQoSU1hcmtlci5QUklPUklUWSk7Ci0gICAgICAgICAgICBpZiAocHJpb3JpdHlPYmogIT0gbnVsbCAmJiBwcmlvcml0eU9iaiBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgICAgICBwcmlvcml0eSA9ICgoSW50ZWdlcikgcHJpb3JpdHlPYmopLmludFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmlvcml0eSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5QUklPUklUWSwKLSAgICAgICAgICAgICAgICAgICAgSU1hcmtlci5QUklPUklUWV9OT1JNQUwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmlvcml0eTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLkRpYWxvZ01hcmtlclByb3BlcnRpZXMjdXBkYXRlRW5hYmxlbWVudCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW5hYmxlbWVudCgpIHsKLSAgICAgICAgc3VwZXIudXBkYXRlRW5hYmxlbWVudCgpOwotICAgICAgICBwcmlvcml0eUNvbWJvLnNldEVuYWJsZWQoaXNFZGl0YWJsZSgpKTsKLSAgICAgICAgY29tcGxldGVkQ2hlY2tib3guc2V0RW5hYmxlZChpc0VkaXRhYmxlKCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dNYXJrZXJQcm9wZXJ0aWVzI3VwZGF0ZURpYWxvZ0Zvck5ld01hcmtlcigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGlhbG9nRm9yTmV3TWFya2VyKCkgewotICAgICAgICBNYXAgaW5pdGlhbEF0dHJpYnV0ZXMgPSBnZXRJbml0aWFsQXR0cmlidXRlcygpOwotICAgICAgICBpbnQgcHJpb3JpdHkgPSBnZXRQcmlvcml0eSgpOwotICAgICAgICBpbml0aWFsQXR0cmlidXRlcy5wdXQoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIocHJpb3JpdHkpKTsKLSAgICAgICAgaWYgKHByaW9yaXR5ID09IElNYXJrZXIuUFJJT1JJVFlfSElHSCkgewotICAgICAgICAgICAgcHJpb3JpdHlDb21iby5zZWxlY3QocHJpb3JpdHlDb21iby5pbmRleE9mKFBSSU9SSVRZX0hJR0gpKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcmlvcml0eSA9PSBJTWFya2VyLlBSSU9SSVRZX0xPVykgewotICAgICAgICAgICAgcHJpb3JpdHlDb21iby5zZWxlY3QocHJpb3JpdHlDb21iby5pbmRleE9mKFBSSU9SSVRZX0xPVykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpb3JpdHlDb21iby5zZWxlY3QocHJpb3JpdHlDb21iby5pbmRleE9mKFBSSU9SSVRZX05PUk1BTCkpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gY29tcGxldGVkID0gZ2V0Q29tcGxldGVkKCk7Ci0gICAgICAgIGluaXRpYWxBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkRPTkUsIG5ldyBCb29sZWFuKGNvbXBsZXRlZCkpOwotICAgICAgICBjb21wbGV0ZWRDaGVja2JveC5zZXRTZWxlY3Rpb24oY29tcGxldGVkKTsKLSAgICAgICAgc3VwZXIudXBkYXRlRGlhbG9nRm9yTmV3TWFya2VyKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dNYXJrZXJQcm9wZXJ0aWVzI3VwZGF0ZURpYWxvZ0Zyb21NYXJrZXIoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZURpYWxvZ0Zyb21NYXJrZXIoKSB7Ci0gICAgICAgIE1hcCBpbml0aWFsQXR0cmlidXRlcyA9IGdldEluaXRpYWxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGludCBwcmlvcml0eSA9IGdldFByaW9yaXR5KCk7Ci0gICAgICAgIGluaXRpYWxBdHRyaWJ1dGVzLnB1dChJTWFya2VyLlBSSU9SSVRZLCBuZXcgSW50ZWdlcihwcmlvcml0eSkpOwotICAgICAgICBpZiAocHJpb3JpdHkgPT0gSU1hcmtlci5QUklPUklUWV9ISUdIKSB7Ci0gICAgICAgICAgICBwcmlvcml0eUNvbWJvLnNlbGVjdChwcmlvcml0eUNvbWJvLmluZGV4T2YoUFJJT1JJVFlfSElHSCkpOwotICAgICAgICB9IGVsc2UgaWYgKHByaW9yaXR5ID09IElNYXJrZXIuUFJJT1JJVFlfTE9XKSB7Ci0gICAgICAgICAgICBwcmlvcml0eUNvbWJvLnNlbGVjdChwcmlvcml0eUNvbWJvLmluZGV4T2YoUFJJT1JJVFlfTE9XKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmlvcml0eUNvbWJvLnNlbGVjdChwcmlvcml0eUNvbWJvLmluZGV4T2YoUFJJT1JJVFlfTk9STUFMKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBjb21wbGV0ZWQgPSBnZXRDb21wbGV0ZWQoKTsKLSAgICAgICAgaW5pdGlhbEF0dHJpYnV0ZXMucHV0KElNYXJrZXIuRE9ORSwgbmV3IEJvb2xlYW4oY29tcGxldGVkKSk7Ci0gICAgICAgIGNvbXBsZXRlZENoZWNrYm94LnNldFNlbGVjdGlvbihjb21wbGV0ZWQpOwotICAgICAgICBzdXBlci51cGRhdGVEaWFsb2dGcm9tTWFya2VyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UHJpb3JpdHlGcm9tRGlhbG9nKCkgewotICAgICAgICBpbnQgcHJpb3JpdHkgPSBJTWFya2VyLlBSSU9SSVRZX05PUk1BTDsKLSAgICAgICAgaWYgKHByaW9yaXR5Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSBwcmlvcml0eUNvbWJvCi0gICAgICAgICAgICAgICAgLmluZGV4T2YoUFJJT1JJVFlfSElHSCkpIHsKLSAgICAgICAgICAgIHByaW9yaXR5ID0gSU1hcmtlci5QUklPUklUWV9ISUdIOwotICAgICAgICB9IGVsc2UgaWYgKHByaW9yaXR5Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSBwcmlvcml0eUNvbWJvCi0gICAgICAgICAgICAgICAgLmluZGV4T2YoUFJJT1JJVFlfTE9XKSkgewotICAgICAgICAgICAgcHJpb3JpdHkgPSBJTWFya2VyLlBSSU9SSVRZX0xPVzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJpb3JpdHk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5EaWFsb2dNYXJrZXJQcm9wZXJ0aWVzI2dldE1hcmtlckF0dHJpYnV0ZXMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXAgZ2V0TWFya2VyQXR0cmlidXRlcygpIHsKLSAgICAgICAgTWFwIGF0dHJzID0gc3VwZXIuZ2V0TWFya2VyQXR0cmlidXRlcygpOwotICAgICAgICBhdHRycy5wdXQoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIoZ2V0UHJpb3JpdHlGcm9tRGlhbG9nKCkpKTsKLSAgICAgICAgYXR0cnMucHV0KElNYXJrZXIuRE9ORSwgbmV3IEJvb2xlYW4oY29tcGxldGVkQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpKTsKLSAgICAgICAgT2JqZWN0IHVzZXJFZGl0YWJsZSA9IGF0dHJzLmdldChJTWFya2VyLlVTRVJfRURJVEFCTEUpOwotICAgICAgICBpZiAodXNlckVkaXRhYmxlID09IG51bGwgfHwgISh1c2VyRWRpdGFibGUgaW5zdGFuY2VvZiBCb29sZWFuKSkgewotICAgICAgICAgICAgYXR0cnMucHV0KElNYXJrZXIuVVNFUl9FRElUQUJMRSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdHRyczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkQ2F0ZWdvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJlZjVlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9GaWVsZENhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEZpZWxkQ2F0ZWdvcnkgaXMgdGhlIGZpZWxkIGZvciBzaG93aW5nIGNhdGVnb3JpZXMgb2YgbWFya2Vycy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRmllbGRDYXRlZ29yeSBleHRlbmRzIEFic3RyYWN0RmllbGQgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIE1hcmtlck1lc3NhZ2VzLmRlc2NyaXB0aW9uX2NhdGVnb3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0RGVzY3JpcHRpb25JbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldERlc2NyaXB0aW9uSW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0Q29sdW1uSGVhZGVyVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5IZWFkZXJUZXh0KCkgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldENvbHVtbkhlYWRlckltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSGVhZGVySW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKE9iamVjdCBvYmopIHsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29uY3JldGVNYXJrZXIpIHsKLQkJCUNvbmNyZXRlTWFya2VyIG1hcmtlciA9IChDb25jcmV0ZU1hcmtlcikgb2JqOwotCQkJaWYgKG1hcmtlci5nZXRHcm91cCgpID09IG51bGwpIHsKLQotCQkJCVN0cmluZyBncm91cE5hbWUgPSBNYXJrZXJTdXBwb3J0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENhdGVnb3J5KG1hcmtlci5nZXRNYXJrZXIoKSk7Ci0JCQkJaWYgKGdyb3VwTmFtZSA9PSBudWxsKQotCQkJCQlncm91cE5hbWUgPSBVdGlsLmdldE1hcmtlclR5cGVOYW1lKG1hcmtlcik7Ci0JCQkJbWFya2VyLnNldEdyb3VwKGdyb3VwTmFtZSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBtYXJrZXIuZ2V0R3JvdXAoKTsKLQotCQl9Ci0JCXJldHVybiBVdGlsLkVNUFRZX1NUUklORzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLQkJcmV0dXJuIGdldFZhbHVlKG9iajEpLmNvbXBhcmVUbyhnZXRWYWx1ZShvYmoyKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZWZhdWx0RGlyZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHREaXJlY3Rpb24oKSB7Ci0JCXJldHVybiBUYWJsZVNvcnRlci5BU0NFTkRJTkc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRQcmVmZXJyZWRXaWR0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmVmZXJyZWRXaWR0aCgpIHsKLQkJcmV0dXJuIDIwMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkQ3JlYXRpb25UaW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9GaWVsZENyZWF0aW9uVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGExNWNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkQ3JlYXRpb25UaW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBDcmVhdGlvbiB0aW1lIGZpZWxkLiBEZXNpZ25lZCB0byBkaXNwbGF5IGFuZCBjb21wYXJlIGNyZWF0aW9uIHRpbWVzIG9mIElNYXJrZXIgb2JqZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIEZpZWxkQ3JlYXRpb25UaW1lIGV4dGVuZHMgQWJzdHJhY3RGaWVsZCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotICAgIHByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgRmllbGRDcmVhdGlvblRpbWUoKSB7Ci0gICAgICAgIGRlc2NyaXB0aW9uID0gTWFya2VyTWVzc2FnZXMuZGVzY3JpcHRpb25fY3JlYXRpb25UaW1lOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldERlc2NyaXB0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0RGVzY3JpcHRpb25JbWFnZSgpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldERlc2NyaXB0aW9uSW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBpbWFnZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRDb2x1bW5IZWFkZXJUZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbkhlYWRlclRleHQoKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRDb2x1bW5IZWFkZXJJbWFnZSgpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkhlYWRlckltYWdlKCkgewotICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgQ29uY3JldGVNYXJrZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBDb25jcmV0ZU1hcmtlciBtYXJrZXIgPSAoQ29uY3JldGVNYXJrZXIpIG9iajsKLSAgICAgICAgcmV0dXJuIFV0aWwuZ2V0Q3JlYXRpb25UaW1lKG1hcmtlci5nZXRDcmVhdGlvblRpbWUoKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotICAgICAgICBpZiAob2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCB8fCAhKG9iajEgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikKLSAgICAgICAgICAgICAgICB8fCAhKG9iajIgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29uY3JldGVNYXJrZXIgbWFya2VyMSA9IChDb25jcmV0ZU1hcmtlcikgb2JqMTsKLSAgICAgICAgQ29uY3JldGVNYXJrZXIgbWFya2VyMiA9IChDb25jcmV0ZU1hcmtlcikgb2JqMjsKLQotICAgICAgICBsb25nIHZhbHVlID0gbWFya2VyMS5nZXRDcmVhdGlvblRpbWUoKSAtIG1hcmtlcjIuZ2V0Q3JlYXRpb25UaW1lKCk7Ci0gICAgICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZWZhdWx0RGlyZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHREaXJlY3Rpb24oKSB7Ci0JCXJldHVybiBUYWJsZVNvcnRlci5BU0NFTkRJTkc7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFByZWZlcnJlZFdpZHRoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByZWZlcnJlZFdpZHRoKCkgewotCQlyZXR1cm4gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9GaWVsZERvbmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkRG9uZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM3NzI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkRG9uZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiBGaWVsZERvbmUgaXMgdGhlIGZpZWxkIGZvciB0aGUgZG9uZSBtYXJrZXIgaW4gdGFza3MuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmllbGREb25lIGV4dGVuZHMgQWJzdHJhY3RGaWVsZCB7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0lNQUdFX1BBVEggPSAib2JqMTYvaGVhZGVyX2NvbXBsZXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUExFVEVfSU1BR0VfUEFUSCA9ICJvYmoxNi9jb21wbGV0ZV90c2suZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJTkNPTVBMRVRFX0lNQUdFX1BBVEggPSAib2JqMTYvaW5jb21wbGV0ZV90c2suZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBNYXJrZXJNZXNzYWdlcy5jb21wbGV0aW9uX2Rlc2NyaXB0aW9uOwotCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyCi0JICoKLQkgKi8KLQlwdWJsaWMgRmllbGREb25lKCkgewotCQkKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbkltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0RGVzY3JpcHRpb25JbWFnZSgpIHsKLQkJcmV0dXJuIGdldEltYWdlKERFU0NSSVBUSU9OX0lNQUdFX1BBVEgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGltYWdlIGF0IHBhdGguCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcGF0aCl7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRSZXNvdXJjZXMoKS5jcmVhdGVJbWFnZVdpdGhEZWZhdWx0KAotCQkJCUlERVdvcmtiZW5jaFBsdWdpbgotCQkJCQkJLmdldElERUltYWdlRGVzY3JpcHRvcihwYXRoKSk7Ci0JCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0Q29sdW1uSGVhZGVyVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5IZWFkZXJUZXh0KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldENvbHVtbkhlYWRlckltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSGVhZGVySW1hZ2UoKSB7Ci0JCXJldHVybiBnZXRJbWFnZShERVNDUklQVElPTl9JTUFHRV9QQVRIKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZShPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBUYXNrTWFya2VyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVGFza01hcmtlciBtYXJrZXIgPSAoVGFza01hcmtlcikgb2JqOwotCQlpbnQgZG9uZSA9IG1hcmtlci5nZXREb25lKCk7Ci0JCWlmIChkb25lID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZG9uZSA9PSAxKSB7Ci0JCQlyZXR1cm4gZ2V0SW1hZ2UoQ09NUExFVEVfSU1BR0VfUEFUSCk7Ci0JCX0KLQkJcmV0dXJuIGdldEltYWdlKElOQ09NUExFVEVfSU1BR0VfUEFUSCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLQkJaWYgKG9iajEgPT0gbnVsbCB8fCBvYmoyID09IG51bGwgfHwgIShvYmoxIGluc3RhbmNlb2YgVGFza01hcmtlcikKLQkJCQl8fCAhKG9iajIgaW5zdGFuY2VvZiBUYXNrTWFya2VyKSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJVGFza01hcmtlciBtYXJrZXIxID0gKFRhc2tNYXJrZXIpIG9iajE7Ci0JCVRhc2tNYXJrZXIgbWFya2VyMiA9IChUYXNrTWFya2VyKSBvYmoyOwotCQlpbnQgdmFsdWUxID0gbWFya2VyMS5nZXREb25lKCk7Ci0JCWludCB2YWx1ZTIgPSBtYXJrZXIyLmdldERvbmUoKTsKLQkJcmV0dXJuIHZhbHVlMSAtIHZhbHVlMjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0RGVmYXVsdERpcmVjdGlvbigpCi0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0RGlyZWN0aW9uKCkgewotCQlyZXR1cm4gVGFibGVTb3J0ZXIuQVNDRU5ESU5HOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRQcmVmZXJyZWRXaWR0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmVmZXJyZWRXaWR0aCgpIHsKLQkJcmV0dXJuIDIwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGREdW1teS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGREdW1teS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWYyYjBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkRHVtbXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogRmllbGREdW1teSBpcyBhIGR1bW15IGZpZWxkIHVzZWQgdG8gZWF0IHVwIHRoZSBjb2x1bW4gb2YgdGhlIHRyZWUKLSAqIHdoaWNoIGhhcyBsYXlvdXQgaXNzdWVzLAotICogQHNpbmNlIDMuMgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpZWxkRHVtbXkgZXh0ZW5kcyBBYnN0cmFjdEZpZWxkIGltcGxlbWVudHMgSUZpZWxkIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gVXRpbC5FTVBUWV9TVFJJTkc7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0RGVzY3JpcHRpb25JbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldERlc2NyaXB0aW9uSW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldENvbHVtbkhlYWRlclRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uSGVhZGVyVGV4dCgpIHsKLQkJcmV0dXJuIFV0aWwuRU1QVFlfU1RSSU5HOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldENvbHVtbkhlYWRlckltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSGVhZGVySW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZShPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBVdGlsLkVNUFRZX1NUUklORzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2NvbXBhcmUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldERlZmF1bHREaXJlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdERpcmVjdGlvbigpIHsKLQkJcmV0dXJuIFRhYmxlU29ydGVyLkFTQ0VORElORzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRQcmVmZXJyZWRXaWR0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmVmZXJyZWRXaWR0aCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9GaWVsZEZvbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzOGIwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9GaWVsZEZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogRm9sZGVyIGZpZWxkLiBEZXNpZ25lZCB0byBkaXNwbGF5IGFuZCBjb21wYXJlIHRoZSBuYW1lcyBvZiB0aGUgZm9sZGVycyB0aGF0IGNvbnRhaW4KLSAqIElNYXJrZXIgb2JqZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIEZpZWxkRm9sZGVyIGV4dGVuZHMgQWJzdHJhY3RGaWVsZCB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBGaWVsZEZvbGRlcigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIE1hcmtlck1lc3NhZ2VzLmRlc2NyaXB0aW9uX2ZvbGRlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbkltYWdlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0RGVzY3JpcHRpb25JbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0Q29sdW1uSGVhZGVyVGV4dCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5IZWFkZXJUZXh0KCkgewotICAgICAgICByZXR1cm4gTWFya2VyTWVzc2FnZXMuZGVzY3JpcHRpb25fZm9sZGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldENvbHVtbkhlYWRlckltYWdlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSGVhZGVySW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIENvbmNyZXRlTWFya2VyKSkgewotICAgICAgICAgICAgcmV0dXJuIFV0aWwuRU1QVFlfU1RSSU5HOwotICAgICAgICB9Ci0gICAgICAgIENvbmNyZXRlTWFya2VyIG1hcmtlciA9IChDb25jcmV0ZU1hcmtlcikgb2JqOwotICAgICAgICByZXR1cm4gbWFya2VyLmdldEZvbGRlcigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLSAgICAgICAgaWYgKG9iajEgPT0gbnVsbCB8fCBvYmoyID09IG51bGwgfHwgIShvYmoxIGluc3RhbmNlb2YgQ29uY3JldGVNYXJrZXIpCi0gICAgICAgICAgICAgICAgfHwgIShvYmoyIGluc3RhbmNlb2YgQ29uY3JldGVNYXJrZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBDb25jcmV0ZU1hcmtlciBtYXJrZXIxID0gKENvbmNyZXRlTWFya2VyKSBvYmoxOwotICAgICAgICBDb25jcmV0ZU1hcmtlciBtYXJrZXIyID0gKENvbmNyZXRlTWFya2VyKSBvYmoyOwotCi0gICAgICAgIHJldHVybiBtYXJrZXIxLmdldEZvbGRlcigpLmNvbXBhcmVUbyhtYXJrZXIyLmdldEZvbGRlcigpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZWZhdWx0RGlyZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHREaXJlY3Rpb24oKSB7Ci0JCXJldHVybiBUYWJsZVNvcnRlci5BU0NFTkRJTkc7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFByZWZlcnJlZFdpZHRoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByZWZlcnJlZFdpZHRoKCkgewotCQlyZXR1cm4gMTUwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRIaWVyYXJjaHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkSGllcmFyY2h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Y2Q0MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRIaWVyYXJjaHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGUgRmllbGRDYXRlZ29yeSBpcyB0aGUgZmllbGQgZm9yIHRoZSBjYXRlZ29yeSBlbnRyaWVzLgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpZWxkSGllcmFyY2h5IGV4dGVuZHMgQWJzdHJhY3RGaWVsZCB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIE1hcmtlck1lc3NhZ2VzLmRlc2NyaXB0aW9uX3N1YmNhdGVnb3J5OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldERlc2NyaXB0aW9uSW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXREZXNjcmlwdGlvbkltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRDb2x1bW5IZWFkZXJUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkhlYWRlclRleHQoKSB7Ci0JCXJldHVybiBVdGlsLkVNUFRZX1NUUklORzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRDb2x1bW5IZWFkZXJJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkhlYWRlckltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoT2JqZWN0IG9iaikgewotCQlpZihvYmogaW5zdGFuY2VvZiBNYXJrZXJOb2RlKXsKLQkJCU1hcmtlck5vZGUgbm9kZSA9IChNYXJrZXJOb2RlKSBvYmo7Ci0JCQlpZihub2RlLmlzQ29uY3JldGUoKSkKLQkJCQlyZXR1cm4gVXRpbC5FTVBUWV9TVFJJTkc7Ci0JCQlyZXR1cm4gbm9kZS5nZXREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBVdGlsLkVNUFRZX1NUUklORzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2NvbXBhcmUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0JCWlmIChvYmoxID09IG51bGwgfHwgb2JqMiA9PSBudWxsIHx8ICEob2JqMSBpbnN0YW5jZW9mIE1hcmtlck5vZGUpCi0JCQkJfHwgIShvYmoyIGluc3RhbmNlb2YgTWFya2VyTm9kZSkpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJTWFya2VyTm9kZSBtYXJrZXIxID0gKE1hcmtlck5vZGUpIG9iajE7Ci0JCU1hcmtlck5vZGUgbWFya2VyMiA9IChNYXJrZXJOb2RlKSBvYmoyOwotCQkKLQkJaWYobWFya2VyMS5pc0NvbmNyZXRlKCkgfHwgbWFya2VyMi5pc0NvbmNyZXRlKCkpCi0JCQlyZXR1cm4gMDsJCi0KLQkJcmV0dXJuIG1hcmtlcjEuZ2V0RGVzY3JpcHRpb24oKS5jb21wYXJlVG8oCi0JCQkJbWFya2VyMi5nZXREZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZWZhdWx0RGlyZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHREaXJlY3Rpb24oKSB7Ci0JCXJldHVybiBUYWJsZVNvcnRlci5BU0NFTkRJTkc7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFByZWZlcnJlZFdpZHRoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByZWZlcnJlZFdpZHRoKCkgewotCQlyZXR1cm4gMTUwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkSWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkSWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyOGE5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9GaWVsZElkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBGaWVsZElkIGlzIHRoZSBmaWVsZCBmb3IgbWFya2VyIGlkLgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpZWxkSWQgaW1wbGVtZW50cyBJRmllbGQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLSAgICBwcml2YXRlIEltYWdlIGltYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmllbGRJZCgpIHsKLSAgICAgICAgZGVzY3JpcHRpb24gPSBNYXJrZXJNZXNzYWdlcy5kZXNjcmlwdGlvbl9tYXJrZXJJZDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldERlc2NyaXB0aW9uSW1hZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXREZXNjcmlwdGlvbkltYWdlKCkgewotICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0Q29sdW1uSGVhZGVyVGV4dCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5IZWFkZXJUZXh0KCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0Q29sdW1uSGVhZGVySW1hZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5IZWFkZXJJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGltYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIENvbmNyZXRlTWFya2VyKSkgewotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgQ29uY3JldGVNYXJrZXIgbWFya2VyID0gKENvbmNyZXRlTWFya2VyKSBvYmo7Ci0gICAgICAgIHJldHVybiAiIiArIG1hcmtlci5nZXRJZCgpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotICAgICAgICBpZiAob2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCB8fCAhKG9iajEgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikKLSAgICAgICAgICAgICAgICB8fCAhKG9iajIgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29uY3JldGVNYXJrZXIgbWFya2VyMSA9IChDb25jcmV0ZU1hcmtlcikgb2JqMTsKLSAgICAgICAgQ29uY3JldGVNYXJrZXIgbWFya2VyMiA9IChDb25jcmV0ZU1hcmtlcikgb2JqMjsKLSAgICAgICAgcmV0dXJuIChpbnQpKG1hcmtlcjEuZ2V0SWQoKSAtIG1hcmtlcjIuZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0RGVmYXVsdERpcmVjdGlvbigpCi0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0RGlyZWN0aW9uKCkgewotCQlyZXR1cm4gVGFibGVTb3J0ZXIuQVNDRU5ESU5HOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFByZWZlcnJlZFdpZHRoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByZWZlcnJlZFdpZHRoKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjaXNTaG93aW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7Ci0JCS8vIE5ldmVyIHNob3cgaWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNzZXRTaG93aW5nKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvd2luZyhib29sZWFuIHNob3dpbmcpIHsKLQkJLy8gSWdub3JlCi0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkTGluZU51bWJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRMaW5lTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZmQ5NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRMaW5lTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogRmllbGRMaW5lTnVtYmVyIGlzIHRoZSBmaWVsZCBmb3IgbGluZSBudW1iZXJzLgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpZWxkTGluZU51bWJlciBleHRlbmRzIEFic3RyYWN0RmllbGQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLSAgICBwcml2YXRlIEltYWdlIGltYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmllbGRMaW5lTnVtYmVyKCkgewotICAgICAgICBkZXNjcmlwdGlvbiA9IE1hcmtlck1lc3NhZ2VzLmRlc2NyaXB0aW9uX2xpbmVOdW1iZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0RGVzY3JpcHRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbkltYWdlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0RGVzY3JpcHRpb25JbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGltYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldENvbHVtbkhlYWRlclRleHQoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uSGVhZGVyVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldENvbHVtbkhlYWRlckltYWdlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSGVhZGVySW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBpbWFnZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoT2JqZWN0IG9iaikgewotICAgIAlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gTWFya2VyTWVzc2FnZXMuRmllbGRNZXNzYWdlX051bGxNZXNzYWdlOwotCi0gICAgCWlmIChvYmogaW5zdGFuY2VvZiBNYXJrZXJOb2RlKXsKLQkJCU1hcmtlck5vZGUgbm9kZSA9IChNYXJrZXJOb2RlKSBvYmo7Ci0JICAgIAlpZihub2RlLmlzQ29uY3JldGUoKSl7Ci0JICAgIAkJQ29uY3JldGVNYXJrZXIgY29uY3JldGVOb2RlID0gKENvbmNyZXRlTWFya2VyKSBub2RlOwotCSAgICAJCWlmKGNvbmNyZXRlTm9kZS5nZXRMb2NhdGlvblN0cmluZygpLmxlbmd0aCgpID09IDApewotCSAgICAJCQlpZiAoY29uY3JldGVOb2RlLmdldExpbmUoKSA8IDApIAotCSAgICAJICAgICAgICAgICAgcmV0dXJuIE1hcmtlck1lc3NhZ2VzLlVua25vd247CSAgICAJICAgCi0JICAgIAkgICAgICAgIHJldHVybiBOTFMuYmluZCgKLQkgICAgCSAgICAgICAgCQlNYXJrZXJNZXNzYWdlcy5sYWJlbF9saW5lTnVtYmVyLAotCSAgICAJICAgICAgICAJCUludGVnZXIudG9TdHJpbmcoY29uY3JldGVOb2RlLmdldExpbmUoKSkpOwotCSAgICAJCX0KLQkgICAgCQlyZXR1cm4gY29uY3JldGVOb2RlLmdldExvY2F0aW9uU3RyaW5nKCk7Ci0JICAgIAl9Ci0JICAgIAlyZXR1cm4gVXRpbC5FTVBUWV9TVFJJTkc7Ci0JCX0KLQkJCi0JCWlmKG9iaiBpbnN0YW5jZW9mIElXb3JrYmVuY2hBZGFwdGVyKQotCQkJcmV0dXJuIFV0aWwuRU1QVFlfU1RSSU5HOy8vRG9uJ3Qgc2hvdyBwZW5kaW5nCi0JCQotCQlpZihvYmogaW5zdGFuY2VvZiBJTWFya2VyKQotCQkJIHJldHVybiBVdGlsLmdldFByb3BlcnR5KElNYXJrZXIuTElORV9OVU1CRVIsIChJTWFya2VyKSBvYmopOyAKLQkJCi0JCXJldHVybiBOTFMuYmluZChNYXJrZXJNZXNzYWdlcy5GaWVsZE1lc3NhZ2VfV3JvbmdUeXBlLG9iai50b1N0cmluZygpKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotICAgICAgICBpZiAob2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCB8fCAhKG9iajEgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikKLSAgICAgICAgICAgICAgICB8fCAhKG9iajIgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29uY3JldGVNYXJrZXIgbWFya2VyMSA9IChDb25jcmV0ZU1hcmtlcikgb2JqMTsKLSAgICAgICAgQ29uY3JldGVNYXJrZXIgbWFya2VyMiA9IChDb25jcmV0ZU1hcmtlcikgb2JqMjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBsb2NhdGlvbjEgPSBtYXJrZXIxLmdldExvY2F0aW9uU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvbjIgPSBtYXJrZXIyLmdldExvY2F0aW9uU3RyaW5nKCk7Ci0gICAgICAgIAotICAgICAgICBpZihsb2NhdGlvbjEubGVuZ3RoKCkgPT0gMCB8fCBsb2NhdGlvbjIubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgCXJldHVybiBtYXJrZXIxLmdldExpbmUoKSAtIG1hcmtlcjIuZ2V0TGluZSgpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uMS5jb21wYXJlVG8obG9jYXRpb24yKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZWZhdWx0RGlyZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHREaXJlY3Rpb24oKSB7Ci0JCXJldHVybiBUYWJsZVNvcnRlci5BU0NFTkRJTkc7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFByZWZlcnJlZFdpZHRoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByZWZlcnJlZFdpZHRoKCkgewotCQlyZXR1cm4gNjA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRNYXJrZXJHcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRNYXJrZXJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWExOTAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkTWFya2VyR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRmllbGRNYXJrZXJHcm91cCBpbXBsZW1lbnRzIElGaWVsZCB7Ci0KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCXByaXZhdGUgU3RyaW5nIG1hcmtlckF0dHJpYnV0ZTsKLQotCXByaXZhdGUgTWFwIHZhbHVlTWFwcGluZzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiB0eXBlczsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG93aW5nOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciBjYWxsZWQgbmFtZS4gYXR0cmlidXRlIGlzIHRoZQotCSAqIGF0dHJpYnV0ZSB0byBiZSBjaGVja2VkIGFuZCB3aG9zZSB2YWx1ZSBpcyBsb29rZWQgdXAgaW4gcHJvdmlkZXJzLiBBcHBseQotCSAqIHRvIG1hcmtlclR5cGVzW10uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gYXR0cmlidXRlCi0JICogQHBhcmFtIHByb3ZpZGVycwotCSAqIEBwYXJhbSBtYXJrZXJUeXBlcwotCSAqLwotCXB1YmxpYyBGaWVsZE1hcmtlckdyb3VwKFN0cmluZyBuYW1lLCBTdHJpbmcgYXR0cmlidXRlLCBNYXAgcHJvdmlkZXJzLAotCQkJU3RyaW5nW10gbWFya2VyVHlwZXMpIHsKLQkJdGl0bGUgPSBuYW1lOwotCQltYXJrZXJBdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0JCXZhbHVlTWFwcGluZyA9IHByb3ZpZGVyczsKLQkJdHlwZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0eXBlcy5hZGQobWFya2VyVHlwZXNbaV0pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0RGVzY3JpcHRpb25JbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldERlc2NyaXB0aW9uSW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0Q29sdW1uSGVhZGVyVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5IZWFkZXJUZXh0KCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRDb2x1bW5IZWFkZXJJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkhlYWRlckltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZShPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIENvbmNyZXRlTWFya2VyKSkKLQkJCXJldHVybiBVdGlsLkVNUFRZX1NUUklORzsKLQotCQlDb25jcmV0ZU1hcmtlciBtYXJrZXIgPSAoQ29uY3JldGVNYXJrZXIpIG9iajsKLQkJaWYgKG1hcmtlci5nZXRHcm91cCgpID09IG51bGwpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IGZpbmRHcm91cFZhbHVlKG1hcmtlcik7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQltYXJrZXIuc2V0R3JvdXAoTWFya2VyTWVzc2FnZXMuRmllbGRDYXRlZ29yeV9VbmNhdGVnb3JpemVkKTsKLQkJCWVsc2UKLQkJCQltYXJrZXIuc2V0R3JvdXAodmFsdWUpOwotCQl9Ci0JCXJldHVybiBtYXJrZXIuZ2V0R3JvdXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSBncm91cCB2YWx1ZS4gSWYgaXQgY2Fubm90IGJlIGZvdW5kIGluIGFuIAotCSAqIGF0dHJpYnV0ZSBtYXBwaW5nIHRoZW4gcmV0dXJuIG51bGw7Ci0JICogQHBhcmFtIG1hcmtlcgotCSAqIEByZXR1cm4gU3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+IAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZpbmRHcm91cFZhbHVlKENvbmNyZXRlTWFya2VyIG1hcmtlcikgewotCi0JCWlmICh0eXBlcy5jb250YWlucyhtYXJrZXIuZ2V0VHlwZSgpKSkgewotCQkJU3RyaW5nIHZhbHVlOwotCQkJdHJ5IHsKLQkJCQl2YWx1ZSA9IChTdHJpbmcpIG1hcmtlci5nZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoCi0JCQkJCQltYXJrZXJBdHRyaWJ1dGUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlpZiAodmFsdWVNYXBwaW5nLmNvbnRhaW5zS2V5KHZhbHVlKSkKLQkJCQlyZXR1cm4gKFN0cmluZykgdmFsdWVNYXBwaW5nLmdldCh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9IC8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2NvbXBhcmUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotCQlpZiAob2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCB8fCAhKG9iajEgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikKLQkJCQl8fCAhKG9iajIgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJQ29uY3JldGVNYXJrZXIgbWFya2VyMSA9IChDb25jcmV0ZU1hcmtlcikgb2JqMTsKLQkJQ29uY3JldGVNYXJrZXIgbWFya2VyMiA9IChDb25jcmV0ZU1hcmtlcikgb2JqMjsKLQotCQlyZXR1cm4gZ2V0VmFsdWUobWFya2VyMSkuY29tcGFyZVRvKGdldFZhbHVlKG1hcmtlcjIpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldERlZmF1bHREaXJlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdERpcmVjdGlvbigpIHsKLQkJcmV0dXJuIFRhYmxlU29ydGVyLkFTQ0VORElORzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFByZWZlcnJlZFdpZHRoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByZWZlcnJlZFdpZHRoKCkgewotCQlyZXR1cm4gNzU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNpc1Nob3dpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKLQkJcmV0dXJuIHNob3dpbmc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNzZXRTaG93aW5nKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvd2luZyhib29sZWFuIHNob3dpbmcpIHsKLQkJdGhpcy5zaG93aW5nID0gc2hvd2luZzsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkTWFya2VyVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRNYXJrZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMTQyYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRNYXJrZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEZpZWxkTWFya2VyVHlwZSBpcyB0aGUgZmllbGQgZW50cnkgZm9yIG1hcmtlciB0eXBlcwotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWVsZE1hcmtlclR5cGUgZXh0ZW5kcyBBYnN0cmFjdEZpZWxkIHsKLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIE1hcmtlck1lc3NhZ2VzLmRlc2NyaXB0aW9uX3R5cGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbkltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0RGVzY3JpcHRpb25JbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRDb2x1bW5IZWFkZXJUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkhlYWRlclRleHQoKSB7Ci0JCXJldHVybiBVdGlsLkVNUFRZX1NUUklORzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldENvbHVtbkhlYWRlckltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSGVhZGVySW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbmNyZXRlTWFya2VyKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IFV0aWwuZ2V0TWFya2VyVHlwZU5hbWUoKENvbmNyZXRlTWFya2VyKSBvYmopOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmFtZTsKLQkJfQotCQlyZXR1cm4gVXRpbC5FTVBUWV9TVFJJTkc7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLQkJaWYgKG9iajEgPT0gbnVsbCB8fCBvYmoyID09IG51bGwgfHwgIShvYmoxIGluc3RhbmNlb2YgQ29uY3JldGVNYXJrZXIpCi0JCQkJfHwgIShvYmoyIGluc3RhbmNlb2YgQ29uY3JldGVNYXJrZXIpKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCUNvbmNyZXRlTWFya2VyIG1hcmtlcjEgPSAoQ29uY3JldGVNYXJrZXIpIG9iajE7Ci0JCUNvbmNyZXRlTWFya2VyIG1hcmtlcjIgPSAoQ29uY3JldGVNYXJrZXIpIG9iajI7Ci0KLQkJcmV0dXJuIGdldFZhbHVlKG1hcmtlcjEpLmNvbXBhcmVUbyhnZXRWYWx1ZShtYXJrZXIyKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZWZhdWx0RGlyZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHREaXJlY3Rpb24oKSB7Ci0JCXJldHVybiBUYWJsZVNvcnRlci5BU0NFTkRJTkc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRQcmVmZXJyZWRXaWR0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmVmZXJyZWRXaWR0aCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRNZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9GaWVsZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjNzk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9GaWVsZE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuRGV2aWNlUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERUludGVybmFsV29ya2JlbmNoSW1hZ2VzOwotCi0vKioKLSAqIFRoZSBtZXNzYWdlIGZpZWxkIGlzIHRoZSBmaWVsZCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBtYXJrZXIuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRmllbGRNZXNzYWdlIGV4dGVuZHMgQWJzdHJhY3RGaWVsZCB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotCSAqLwotCXB1YmxpYyBGaWVsZE1lc3NhZ2UoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIE1hcmtlck1lc3NhZ2VzLmRlc2NyaXB0aW9uX21lc3NhZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbkltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0RGVzY3JpcHRpb25JbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRDb2x1bW5IZWFkZXJUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkhlYWRlclRleHQoKSB7Ci0JCXJldHVybiBNYXJrZXJNZXNzYWdlcy5kZXNjcmlwdGlvbl9tZXNzYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0Q29sdW1uSGVhZGVySW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5IZWFkZXJJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gTWFya2VyTWVzc2FnZXMuRmllbGRNZXNzYWdlX051bGxNZXNzYWdlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNYXJrZXJOb2RlKSB7Ci0JCQlyZXR1cm4gKChNYXJrZXJOb2RlKSBvYmopLmdldERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIE5MUy5iaW5kKE1hcmtlck1lc3NhZ2VzLkZpZWxkTWVzc2FnZV9Xcm9uZ1R5cGUsIG9iai50b1N0cmluZygpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgTWFya2VyTm9kZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFya2VyTm9kZSBub2RlID0gKE1hcmtlck5vZGUpIG9iajsKLQkJaWYgKG5vZGUuaXNDb25jcmV0ZSgpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFByb2JsZW1NYXJrZXIpCi0JCQkJcmV0dXJuIFV0aWwuZ2V0SW1hZ2UoKChQcm9ibGVtTWFya2VyKSBvYmopLmdldFNldmVyaXR5KCkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzCi0JCQkJCS5nZXRSZXNvdXJjZXMoKQotCQkJCQkuY3JlYXRlSW1hZ2UoCi0JCQkJCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMKLQkJCQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0VUT09MX1BST0JMRU1fQ0FURUdPUlkpKTsKLQkJfSBjYXRjaCAoRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2NvbXBhcmUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotCQlpZiAob2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCB8fCAhKG9iajEgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikKLQkJCQl8fCAhKG9iajIgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJQ29uY3JldGVNYXJrZXIgbWFya2VyMSA9IChDb25jcmV0ZU1hcmtlcikgb2JqMTsKLQkJQ29uY3JldGVNYXJrZXIgbWFya2VyMiA9IChDb25jcmV0ZU1hcmtlcikgb2JqMjsKLQotCQlyZXR1cm4gbWFya2VyMS5nZXREZXNjcmlwdGlvbktleSgpLmNvbXBhcmVUbygKLQkJCQltYXJrZXIyLmdldERlc2NyaXB0aW9uS2V5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0RGVmYXVsdERpcmVjdGlvbigpCi0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0RGlyZWN0aW9uKCkgewotCQlyZXR1cm4gVGFibGVTb3J0ZXIuQVNDRU5ESU5HOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0UHJlZmVycmVkV2lkdGgoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHJlZmVycmVkV2lkdGgoKSB7Ci0JCXJldHVybiAyNTA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRQcmlvcml0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRQcmlvcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNmYjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkUHJpb3JpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgRmllbGRQcmlvcml0eSBpcyB0aGUgZmllbGQgZm9yIHNldHRpbmcgYSB0YXNrcyAKLSAqIHByaW9yaXR5LgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpZWxkUHJpb3JpdHkgZXh0ZW5kcyBBYnN0cmFjdEZpZWxkIHsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fSU1BR0VfUEFUSCA9ICJvYmoxNi9oZWFkZXJfcHJpb3JpdHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBISUdIX1BSSU9SSVRZX0lNQUdFX1BBVEggPSAib2JqMTYvaHByaW9fdHNrLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9XX1BSSU9SSVRZX0lNQUdFX1BBVEggPSAib2JqMTYvbHByaW9fdHNrLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmllbGRQcmlvcml0eSgpIHsKLSAgICAgICAgZGVzY3JpcHRpb24gPSBNYXJrZXJNZXNzYWdlcy5wcmlvcml0eV9kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBHZXQgdGhlIGltYWdlIGF0IHBhdGguCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcGF0aCl7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRSZXNvdXJjZXMoKS5jcmVhdGVJbWFnZVdpdGhEZWZhdWx0KAotCQkJCUlERVdvcmtiZW5jaFBsdWdpbgotCQkJCQkJLmdldElERUltYWdlRGVzY3JpcHRvcihwYXRoKSk7Ci0JCQotCX0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldERlc2NyaXB0aW9uSW1hZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXREZXNjcmlwdGlvbkltYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0SW1hZ2UoREVTQ1JJUFRJT05fSU1BR0VfUEFUSCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0Q29sdW1uSGVhZGVyVGV4dCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5IZWFkZXJUZXh0KCkgewotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRDb2x1bW5IZWFkZXJJbWFnZSgpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkhlYWRlckltYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRpb25JbWFnZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgVGFza01hcmtlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgcHJpb3JpdHkgPSAoKFRhc2tNYXJrZXIpIG9iaikuZ2V0UHJpb3JpdHkoKTsKLSAgICAgICAgICAgIGlmIChwcmlvcml0eSA9PSBJTWFya2VyLlBSSU9SSVRZX0hJR0gpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2UoSElHSF9QUklPUklUWV9JTUFHRV9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcmlvcml0eSA9PSBJTWFya2VyLlBSSU9SSVRZX0xPVykgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZShMT1dfUFJJT1JJVFlfSU1BR0VfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotICAgICAgICBpZiAob2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCB8fCAhKG9iajEgaW5zdGFuY2VvZiBUYXNrTWFya2VyKQotICAgICAgICAgICAgICAgIHx8ICEob2JqMiBpbnN0YW5jZW9mIFRhc2tNYXJrZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpbnQgcHJpb3JpdHkxID0gKChUYXNrTWFya2VyKSBvYmoxKS5nZXRQcmlvcml0eSgpOwotICAgICAgICBpbnQgcHJpb3JpdHkyID0gKChUYXNrTWFya2VyKSBvYmoyKS5nZXRQcmlvcml0eSgpOwotICAgICAgICByZXR1cm4gcHJpb3JpdHkxIC0gcHJpb3JpdHkyOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZWZhdWx0RGlyZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHREaXJlY3Rpb24oKSB7Ci0JCXJldHVybiBUYWJsZVNvcnRlci5BU0NFTkRJTkc7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFByZWZlcnJlZFdpZHRoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByZWZlcnJlZFdpZHRoKCkgewotCQlyZXR1cm4gMTY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRSZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmllbGRSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDViYzY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEZpZWxkUmVzb3VyY2UgaXMgdGhlIGZpZWxkIGZvciB0aGUgcmVzb3VyY2UuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmllbGRSZXNvdXJjZSBleHRlbmRzIEFic3RyYWN0RmllbGQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLSAgICBwcml2YXRlIEltYWdlIGltYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmllbGRSZXNvdXJjZSgpIHsKLSAgICAgICAgZGVzY3JpcHRpb24gPSBNYXJrZXJNZXNzYWdlcy5kZXNjcmlwdGlvbl9yZXNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldERlc2NyaXB0aW9uSW1hZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXREZXNjcmlwdGlvbkltYWdlKCkgewotICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0Q29sdW1uSGVhZGVyVGV4dCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5IZWFkZXJUZXh0KCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0Q29sdW1uSGVhZGVySW1hZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5IZWFkZXJJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGltYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldFZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIENvbmNyZXRlTWFya2VyKSkgewotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgQ29uY3JldGVNYXJrZXIgbWFya2VyID0gKENvbmNyZXRlTWFya2VyKSBvYmo7Ci0gICAgICAgIHJldHVybiBtYXJrZXIuZ2V0UmVzb3VyY2VOYW1lKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotICAgICAgICBpZiAob2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCB8fCAhKG9iajEgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikKLSAgICAgICAgICAgICAgICB8fCAhKG9iajIgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29uY3JldGVNYXJrZXIgbWFya2VyMSA9IChDb25jcmV0ZU1hcmtlcikgb2JqMTsKLSAgICAgICAgQ29uY3JldGVNYXJrZXIgbWFya2VyMiA9IChDb25jcmV0ZU1hcmtlcikgb2JqMjsKLQotICAgICAgICByZXR1cm4gbWFya2VyMS5nZXRSZXNvdXJjZU5hbWUoKS5jb21wYXJlVG8oCi0gICAgICAgICAgICAgICAgbWFya2VyMi5nZXRSZXNvdXJjZU5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0RGVmYXVsdERpcmVjdGlvbigpCi0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0RGlyZWN0aW9uKCkgewotCQlyZXR1cm4gVGFibGVTb3J0ZXIuQVNDRU5ESU5HOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRQcmVmZXJyZWRXaWR0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmVmZXJyZWRXaWR0aCgpIHsKLQkJcmV0dXJuIDc1OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkU2V2ZXJpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpZWxkU2V2ZXJpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0MmFmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9GaWVsZFNldmVyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGUgRmllbGRTZXZlcml0eSBpcyB0aGUgZmllbGQgZm9yIHNldHRpbmcgc2V2ZXJpdGllcy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRmllbGRTZXZlcml0eSBleHRlbmRzIEFic3RyYWN0RmllbGQgewotCi0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotCSAqLwotCXB1YmxpYyBGaWVsZFNldmVyaXR5KCkgewotCQlkZXNjcmlwdGlvbiA9IE1hcmtlck1lc3NhZ2VzLnByb2JsZW1TZXZlcml0eV9kZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuSUZpZWxkI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXREZXNjcmlwdGlvbkltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0RGVzY3JpcHRpb25JbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRDb2x1bW5IZWFkZXJUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkhlYWRlclRleHQoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0Q29sdW1uSGVhZGVySW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5IZWFkZXJJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gVXRpbC5nZXRTZXZlcml0eVRleHQoKChQcm9ibGVtTWFya2VyKSBvYmopLmdldFNldmVyaXR5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBQcm9ibGVtTWFya2VyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gVXRpbC5nZXRJbWFnZSgoKFByb2JsZW1NYXJrZXIpIG9iaikuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLQkJaWYgKG9iajEgPT0gbnVsbCB8fCBvYmoyID09IG51bGwgfHwgIShvYmoxIGluc3RhbmNlb2YgUHJvYmxlbU1hcmtlcikKLQkJCQl8fCAhKG9iajIgaW5zdGFuY2VvZiBQcm9ibGVtTWFya2VyKSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkxID0gKChQcm9ibGVtTWFya2VyKSBvYmoxKS5nZXRTZXZlcml0eSgpOwotCQlpbnQgc2V2ZXJpdHkyID0gKChQcm9ibGVtTWFya2VyKSBvYmoyKS5nZXRTZXZlcml0eSgpOwotCQlyZXR1cm4gc2V2ZXJpdHkxIC0gc2V2ZXJpdHkyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5JRmllbGQjZ2V0RGVmYXVsdERpcmVjdGlvbigpCi0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0RGlyZWN0aW9uKCkgewotCQlyZXR1cm4gVGFibGVTb3J0ZXIuREVTQ0VORElORzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLklGaWVsZCNnZXRQcmVmZXJyZWRXaWR0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmVmZXJyZWRXaWR0aCgpIHsKLQkJcmV0dXJuIDE2OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpbHRlckVuYWJsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0ZpbHRlckVuYWJsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRjZmVlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9GaWx0ZXJFbmFibGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogVGhlIEZpbHRlckVuYWJsZW1lbnRBY3Rpb24gaXMgYW4gYWN0aW9uIGZvciBlbmFibGluZyAKLSAqIG9yIGRpc2FibGluZyBhIGZpbHRlci4KLSAqCi0gKi8KLWNsYXNzIEZpbHRlckVuYWJsZW1lbnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBNYXJrZXJGaWx0ZXIgbWFya2VyRmlsdGVyOwotCXByaXZhdGUgTWFya2VyVmlldyBtYXJrZXJWaWV3OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGFjdGlvbiBmb3IgdGhlIGZpbHRlci4KLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwdWJsaWMgRmlsdGVyRW5hYmxlbWVudEFjdGlvbihNYXJrZXJGaWx0ZXIgZmlsdGVyLCBNYXJrZXJWaWV3IHZpZXcpIHsKLQkJc3VwZXIoZmlsdGVyLmdldE5hbWUoKSxTV1QuQ0hFQ0spOwotCQlzZXRDaGVja2VkKGZpbHRlci5pc0VuYWJsZWQoKSk7Ci0JCW1hcmtlckZpbHRlciA9IGZpbHRlcjsKLQkJbWFya2VyVmlldyA9IHZpZXc7Ci0JCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJbWFya2VyRmlsdGVyLnNldEVuYWJsZWQoIW1hcmtlckZpbHRlci5pc0VuYWJsZWQoKSk7Ci0JCXNldENoZWNrZWQobWFya2VyRmlsdGVyLmlzRW5hYmxlZCgpKTsKLQkJbWFya2VyVmlldy51cGRhdGVGb3JGaWx0ZXJDaGFuZ2VzKCk7Ci0JCW1hcmtlclZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9GaWx0ZXJzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9GaWx0ZXJzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZGQ2NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvRmlsdGVyc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGFjdGlvbiBvcGVucyBhIEZpbHRlcnMgRGlhbG9nIGFuZCBub3RpZmllcyB0aGUgTWFya2VyIFZpZXcgaWYgdGhlIHVzZXIgaGFzCi0gKiBtb2RpZmllZCB0aGUgZmlsdGVyIHZpYSB0aGUgZmlsdGVycyBkaWFsb2cuCi0gKi8KLWNsYXNzIEZpbHRlcnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0gICAgcHJpdmF0ZSBNYXJrZXJWaWV3IHZpZXc7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsdGVyc0FjdGlvbihNYXJrZXJWaWV3IHZpZXcpIHsKLSAgICAgICAgc3VwZXIoTWFya2VyTWVzc2FnZXMuZmlsdGVyc0FjdGlvbl90aXRsZSk7Ci0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJlbGNsMTYvZmlsdGVyX3BzLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRUb29sVGlwVGV4dChNYXJrZXJNZXNzYWdlcy5maWx0ZXJzQWN0aW9uX3Rvb2x0aXApOwotICAgICAgICB0aGlzLnZpZXcgPSB2aWV3OwotICAgICAgICBzZXRFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIHRoZSBkaWFsb2cuIE5vdGlmaWVzIHRoZSB2aWV3IGlmIHRoZSBmaWx0ZXIgaGFzIGJlZW4gbW9kaWZpZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICB2aWV3Lm9wZW5GaWx0ZXJzRGlhbG9nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvSUZpZWxkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9JRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3YmM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9JRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogSUZpZWxkIGlzIHRoZSBkZWZpbml0aW9uIG9mIGZpZWxkcyBmb3IgbWFya2VyIHZpZXdzLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmllbGQgewotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkIG9yIDxjb2RlPm51bGw8Y29kZT4uCi0gICAgICovCi0gICAgSW1hZ2UgZ2V0RGVzY3JpcHRpb25JbWFnZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgdGV4dCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNvbHVtbiBoZWFkZXIgZm9yIHRoaXMgZmllbGQuCi0gICAgICovCi0gICAgU3RyaW5nIGdldENvbHVtbkhlYWRlclRleHQoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGltYWdlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY29sdW1uIGhlYWRlciBmb3IgdGhpcyBmaWVsZCBvciA8Y29kZT5udWxsPGNvZGU+LgotICAgICAqLwotICAgIEltYWdlIGdldENvbHVtbkhlYWRlckltYWdlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb2JqCi0gICAgICogQHJldHVybiBUaGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBvYmplY3QgZm9yIHRoaXMgcGFydGljdWxhciBmaWVsZCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuICAKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VmFsdWUoT2JqZWN0IG9iaik7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb2JqCi0gICAgICogQHJldHVybiBUaGUgaW1hZ2UgdmFsdWUgb2YgdGhlIG9iamVjdCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpZWxkIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlcgotICAgICAqIG9yIDxjb2RlPm51bGw8Y29kZT4uCi0gICAgICovCi0gICAgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaik7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb2JqMQotICAgICAqIEBwYXJhbSBvYmoyCi0gICAgICogQHJldHVybiBFaXRoZXI6Ci0gICAgICogCTxsaT5hIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgdmFsdWUgb2Ygb2JqMSBpcyBsZXNzIHRoYW4gdGhlIHZhbHVlIG9mIG9iajIgZm9yIHRoaXMgZmllbGQuCi0gICAgICogIDxsaT48Y29kZT4wPC9jb2RlPiBpZiB0aGUgdmFsdWUgb2Ygb2JqMSBhbmQgdGhlIHZhbHVlIG9mIG9iajIgYXJlIGVxdWFsIGZvciB0aGlzIGZpZWxkLgotICAgICAqICA8bGk+YSBwb3NpdGl2ZSBudW1iZXIgaWYgdGhlIHZhbHVlIG9mIG9iajEgaXMgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZSBvZiBvYmoyIGZvciB0aGlzIGZpZWxkLgotICAgICAqLwotICAgIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkZWZhdWx0IGRpcmVjdGlvbiBmb3IgdGhlIHJlY2VpdmVyLiBSZXR1cm4gZWl0aGVyIAotICAgICAqIHtAbGluayBUYWJsZVNvcnRlciNBU0NFTkRJTkcgfSBvciB7QGxpbmsgVGFibGVTb3J0ZXIjREVTQ0VORElORyB9Ci0gICAgICogQHJldHVybiBpbnQKLSAgICAgKi8KLSAgIGludCBnZXREZWZhdWx0RGlyZWN0aW9uKCk7Ci0gICAKLSAgIC8qKgotICAgICogR2V0IHRoZSBwcmVmZXJyZWQgd2lkdGggb2YgdGhlIHJlY2VpdmVyLgotICAgICogQHJldHVybiBpbnQKLSAgICAqLwotICAgaW50IGdldFByZWZlcnJlZFdpZHRoKCk7Ci0KLSAgIC8qKgotICAgICogUmV0dXJuIHdoZXRoZXIgbm90IHRoZSByZWNlaXZlciBpcyBzaG93aW5nLgotICAgICogQHJldHVybiBib29sZWFuCi0gICAgKi8KLSAgIGJvb2xlYW4gaXNTaG93aW5nKCk7Ci0gICAKLSAgIC8qKgotICAgICogU2V0IHdoZXRoZXIgb3Igbm90IHRoZSByZWNlaXZlciBpcyBzaG93aW5nLgotICAgICogQHBhcmFtIHNob3dpbmcKLSAgICAqLwotICB2b2lkIHNldFNob3dpbmcoYm9vbGVhbiBzaG93aW5nKTsKLSAgIAotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvSUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvSUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTgxYTcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0lGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLS8qKgotICogR2VuZXJpYyBmaWx0ZXJpbmcgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWx0ZXIgewotCi0gICAgLyoqCi0gICAgICogRmlsdGVycyB0aGUgbGlzdCBvZiBlbGVtZW50cy4gUmVtb3ZlcyB0aGUgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGZpbHRlcmVkIG91dCBmcm9tIHRoZSBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBmaWx0ZXIoT2JqZWN0W10gZWxlbWVudHMpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGl0ZW0KLSAgICAgKiBAcmV0dXJuCi0gICAgICogPHVsPgotICAgICAqIDxsaT48Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaXRlbSB3aWxsIG1ha2UgaXQgdGhyb3VnaCB0aGUgZmlsdGVyLjwvbGk+Ci0gICAgICogPGxpPjxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgaXRlbSB3aWxsIG5vdCBtYWtlIGl0IHRocm91Z2ggdGhlIGZpbHRlci48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCBpdGVtKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvSUl0ZW1zQ2hhbmdlZExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9JSXRlbXNDaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2MzMyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9JSXRlbXNDaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBJSXRlbXNDaGFuZ2VkTGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFkZGl0aW9ucyBuZXcgaXRlbXMgYWRkZWQKLSAgICAgKiBAcGFyYW0gcmVtb3ZhbHMgaXRlbXMgcmVtb3ZlZAotICAgICAqIEBwYXJhbSBjaGFuZ2VzIGNoYW5nZWQgaXRlbXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpdGVtc0NoYW5nZWQoTGlzdCBhZGRpdGlvbnMsIExpc3QgcmVtb3ZhbHMsIExpc3QgY2hhbmdlcyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0lNYXJrZXJDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0lNYXJrZXJDaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyMGVmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9JTWFya2VyQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogTGlzdGVuZXIgaW50ZXJmYWNlIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyBpbiByZXNvdXJjZSBtYXJrZXJzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNYXJrZXJDaGFuZ2VkTGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFkZGl0aW9ucyBuZXcgbWFya2VycyBhZGRlZAotICAgICAqIEBwYXJhbSByZW1vdmFscyBtYXJrZXJzIHJlbW92ZWQKLSAgICAgKiBAcGFyYW0gY2hhbmdlcyBjaGFuZ2VkIG1hcmtlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtYXJrZXJDaGFuZ2VkKExpc3QgYWRkaXRpb25zLCBMaXN0IHJlbW92YWxzLCBMaXN0IGNoYW5nZXMpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9JTWFya2VyUmVzb3VyY2VBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9JTWFya2VyUmVzb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZDczZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvSU1hcmtlclJlc291cmNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotLyoqCi0gKiA8Y29kZT5JTWFya2VyUmVzb3VyY2VBZGFwdGVyPC9jb2RlPiBpcyBhbiBhZGFwdGVyIGludGVyZmFjZSB0aGF0Ci0gKiBzdXBwbGllcyB0aGUgcmVzb3VyY2UgdG8gcXVlcnkgZm9yIG1hcmtlcnMgdG8gZGlzcGxheSBpbiB0aGUgbWFya2VyIHZpZXcKLSAqIG9yIGFueSBvZiBpdHMgc3ViY2xhc3Nlcy4KLSAqIAotICogSW1wbGVtZW50b3JzIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSB0eXBpY2FsbHkgcmVnaXN0ZXJlZCB3aXRoIGFuCi0gKiBJQWRhcHRlckZhY3RvcnkgZm9yIGxvb2t1cCB2aWEgdGhlIGdldEFkYXB0ZXIoKSBtZWNoYW5pc20uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1hcmtlclJlc291cmNlQWRhcHRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSB0byBxdWVyeSBmb3IgdGhlIG1hcmtlcnMgdG8gZGlzcGxheQotICAgICAqIGZvciB0aGUgZ2l2ZW4gYWRhcHRhYmxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhZGFwdGFibGUgdGhlIGFkYXB0YWJsZSBiZWluZyBxdWVyaWVkLgotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlCi0gICAgICogCWlzIG5vIGFkYXB0ZWQgcmVzb3VyY2UgZm9yIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBJUmVzb3VyY2UgZ2V0QWZmZWN0ZWRSZXNvdXJjZShJQWRhcHRhYmxlIGFkYXB0YWJsZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0lUYWJsZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9JVGFibGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjRjYzcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL0lUYWJsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWJsZUxpc3RlbmVyIHsKLSAgICBwdWJsaWMgdm9pZCBjb250ZW50c0ZvdW5kKENvbGxlY3Rpb24gY29udGVudHMpOwotCi0gICAgcHVibGljIHZvaWQgaW52YWxpZCgpOwotCi0gICAgcHVibGljIHZvaWQgZHJhd2FibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL01hcmtlckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL01hcmtlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjZTgyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogVGhlIE1hcmtlckFkYXB0ZXIgaXMgdGhlIGFkYXB0ZXIgZm9yIHRoZSBkZWZlcnJlZCB1cGRhdGUgb2YgbWFya2Vycy4KLSAqIAotICogQHNpbmNlIDMuMQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrZXJBZGFwdGVyIHsKLQotCXByaXZhdGUgY2xhc3MgTWFya2VyQ2F0ZWdvcnkgZXh0ZW5kcyBNYXJrZXJOb2RlIHsKLQotCQlNYXJrZXJBZGFwdGVyIG1hcmtlckFkYXB0ZXI7Ci0KLQkJaW50IHN0YXJ0OwotCi0JCWludCBlbmQ7Ci0KLQkJaW50IGZpZWxkSW5kZXggPSAwOwotCi0JCU1hcmtlckNhdGVnb3J5IHBhcmVudDsKLQotCQlwcml2YXRlIE1hcmtlck5vZGVbXSBjaGlsZHJlbjsKLQotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCS8qKgotCQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyIHRoYXQgaGFzIHRoZSBtYXJrZXJzIGJldHdlZW4KLQkJICogc3RhcnRJbmRleCBhbmQgZW5kSW5kZXggc2hvd2luZy4KLQkJICogCi0JCSAqIEBwYXJhbSBhZGFwdGVyCi0JCSAqIEBwYXJhbSBzdGFydEluZGV4Ci0JCSAqIEBwYXJhbSBlbmRJbmRleAotCQkgKiBAcGFyYW0gZmllbGROdW1iZXIKLQkJICogQHBhcmFtIHBhcmVudENhdGVnb3J5Ci0JCSAqLwotCQlNYXJrZXJDYXRlZ29yeShNYXJrZXJBZGFwdGVyIGFkYXB0ZXIsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsCi0JCQkJaW50IGZpZWxkTnVtYmVyLCBNYXJrZXJDYXRlZ29yeSBwYXJlbnRDYXRlZ29yeSkgewotCQkJbWFya2VyQWRhcHRlciA9IGFkYXB0ZXI7Ci0JCQlzdGFydCA9IHN0YXJ0SW5kZXg7Ci0JCQllbmQgPSBlbmRJbmRleDsKLQkJCWZpZWxkSW5kZXggPSBmaWVsZE51bWJlcjsKLQkJCXBhcmVudCA9IHBhcmVudENhdGVnb3J5OwotCi0JCQlJRmllbGQgZmllbGQgPSBhZGFwdGVyLmdldENhdGVnb3J5U29ydGVyKCkuZ2V0Q2F0ZWdvcnlGaWVsZCgpOwotCi0JCQluYW1lID0gZmllbGQKLQkJCQkJLmdldFZhbHVlKG1hcmtlckFkYXB0ZXIubGFzdE1hcmtlcnMudG9BcnJheSgpW3N0YXJ0SW5kZXhdKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJOb2RlI2dldENoaWxkcmVuKCkKLQkJICovCi0JCXB1YmxpYyBNYXJrZXJOb2RlW10gZ2V0Q2hpbGRyZW4oKSB7Ci0KLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0KLQkJCQlpZiAodmlldy5nZXRUYWJsZVNvcnRlcigpLmdldEZpZWxkcygpLmxlbmd0aCA+PSBmaWVsZEluZGV4KSB7Ci0JCQkJCWNoaWxkcmVuID0gYnVpbGRIaWVyYXJjaHkobWFya2VyQWRhcHRlci5sYXN0TWFya2Vycywgc3RhcnQsCi0JCQkJCQkJZW5kLCBmaWVsZEluZGV4ICsgMSwgdGhpcyk7Ci0JCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKS8vIERlIHdlIGZpbmQgYW55PwotCQkJCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJCX0KLQotCQkJCS8vIFdlIGFyZSBhdCB0aGUgbGVhZgotCi0JCQkJQ29uY3JldGVNYXJrZXJbXSBhbGxNYXJrZXJzID0gbWFya2VyQWRhcHRlci5sYXN0TWFya2VycwotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCQljaGlsZHJlbiA9IG5ldyBNYXJrZXJOb2RlW2VuZCAtIHN0YXJ0ICsgMV07Ci0KLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFsbE1hcmtlcnMsIHN0YXJ0LCBjaGlsZHJlbiwgMCwgZW5kIC0gc3RhcnQKLQkJCQkJCSsgMSk7Ci0JCQkJLy8gU29ydCB0aGVtIGxvY2FsbHkgbm93Ci0JCQkJdmlldy5nZXRUYWJsZVNvcnRlcigpLnNvcnQodmlldy5nZXRWaWV3ZXIoKSwgY2hpbGRyZW4pOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQkoKENvbmNyZXRlTWFya2VyKSBjaGlsZHJlbltpXSkuc2V0Q2F0ZWdvcnkodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyTm9kZSNnZXRQYXJlbnQoKQotCQkgKi8KLQkJcHVibGljIE1hcmtlck5vZGUgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJOb2RlI2dldERlc2NyaXB0aW9uKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJOb2RlI2lzQ29uY3JldGUoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNDb25jcmV0ZSgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCU1hcmtlclZpZXcgdmlldzsKLQotCXByaXZhdGUgTWFya2VyTGlzdCBsYXN0TWFya2VyczsKLQotCXByaXZhdGUgTWFya2VyQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzOwotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkaW5nID0gdHJ1ZTsvLyBTdGFydCB3aXRoIG5vdGhpbmcgdW50aWwgd2UgaGF2ZQotCi0JLy8gc29tZXRoaW5nCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXJWaWV3Ci0JICovCi0JTWFya2VyQWRhcHRlcihNYXJrZXJWaWV3IG1hcmtlclZpZXcpIHsKLQkJdmlldyA9IG1hcmtlclZpZXc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYXRlZ29yeSBzb3J0ZXIgZm9yIHRoZSByZWNlaXZlci4gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQKLQkgKiBpbiBoaWVyYXJjaGFsIG1vZGUgb3IgdGhlcmUgd2lsbCBiZSBhIENsYXNzQ2FzdEV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIENhdGVnb3J5U29ydGVyCi0JICovCi0JcHVibGljIENhdGVnb3J5U29ydGVyIGdldENhdGVnb3J5U29ydGVyKCkgewotCQlyZXR1cm4gKENhdGVnb3J5U29ydGVyKSB2aWV3LmdldFZpZXdlcigpLmdldFNvcnRlcigpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGFsbCBvZiB0aGUgbWFya2VycyBpbiB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHBhcmFtIGNvbGxlY3RvcgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRBbGxNYXJrZXJzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlidWlsZGluZyA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlpbnQgbWFya2VyTGltaXQgPSB2aWV3LmdldE1hcmtlckxpbWl0KCk7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNYXJrZXJNZXNzYWdlcy5NYXJrZXJWaWV3XzE5LAotCQkJCQltYXJrZXJMaW1pdCA9PSAtMSA/IDYwIDogMTAwKTsKLQkJCXRyeSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKE1hcmtlck1lc3NhZ2VzLk1hcmtlclZpZXdfd2FpdGluZ19vbl9jaGFuZ2VzKTsKLQotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJbW9uaXRvcgotCQkJCQkJLnN1YlRhc2soTWFya2VyTWVzc2FnZXMuTWFya2VyVmlld19zZWFyY2hpbmdfZm9yX21hcmtlcnMpOwotCQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLAotCQkJCQkJMTApOwotCQkJCWxhc3RNYXJrZXJzID0gTWFya2VyTGlzdC5jb21wdXRlKHZpZXcuZ2V0RW5hYmxlZEZpbHRlcnMoKSwKLQkJCQkJCXN1Yk1vbml0b3IsIHRydWUpOwotCi0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQlyZXR1cm47Ci0KLQkJCQl2aWV3LnJlZnJlc2hNYXJrZXJDb3VudHMobW9uaXRvcik7Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUlERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCWxhc3RNYXJrZXJzID0gbmV3IE1hcmtlckxpc3QoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJVmlld2VyU29ydGVyIHNvcnRlciA9IHZpZXcuZ2V0Vmlld2VyKCkuZ2V0U29ydGVyKCk7Ci0KLQkJCWlmIChtYXJrZXJMaW1pdCA9PSAtMSkgewotCQkJCXNvcnRlci5zb3J0KHZpZXcuZ2V0Vmlld2VyKCksIGxhc3RNYXJrZXJzLnRvQXJyYXkoKSk7Ci0JCQl9IGVsc2UgewotCi0JCQkJbW9uaXRvci5zdWJUYXNrKE1hcmtlck1lc3NhZ2VzLk1hcmtlclZpZXdfMTgpOwotCQkJCVN1YlByb2dyZXNzTW9uaXRvciBtb24gPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDQwKTsKLQotCQkJCWxhc3RNYXJrZXJzID0gU29ydFV0aWwuZ2V0Rmlyc3QobGFzdE1hcmtlcnMsCi0JCQkJCQkoQ29tcGFyYXRvcikgc29ydGVyLCBtYXJrZXJMaW1pdCwgbW9uKTsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXJldHVybjsKLQkJCQlzb3J0ZXIuc29ydCh2aWV3LmdldFZpZXdlcigpLCBsYXN0TWFya2Vycy50b0FycmF5KCkpOwotCQkJfQotCi0JCQlpZiAobGFzdE1hcmtlcnMuZ2V0U2l6ZSgpID09IDApIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCW1vbml0b3Iuc3ViVGFzayhNYXJrZXJNZXNzYWdlcy5NYXJrZXJWaWV3X3F1ZXVlaW5nX3VwZGF0ZXMpOwotCi0JCQlpZiAoaXNTaG93aW5nSGllcmFyY2h5KCkpIHsKLQkJCQljYXRlZ29yaWVzID0gYnVpbGRIaWVyYXJjaHkobGFzdE1hcmtlcnMsIDAsIGxhc3RNYXJrZXJzCi0JCQkJCQkuZ2V0U2l6ZSgpIC0gMSwgMCwgbnVsbCk7Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0KLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGZpbmFsbHkgewotCQkJYnVpbGRpbmcgPSBmYWxzZTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IGEgaGllcmFyY2h5IGlzIHNob3dpbmcuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzU2hvd2luZ0hpZXJhcmNoeSgpIHsKLQotCQlWaWV3ZXJTb3J0ZXIgc29ydGVyID0gdmlldy5nZXRWaWV3ZXIoKS5nZXRTb3J0ZXIoKTsKLQkJaWYgKHNvcnRlciBpbnN0YW5jZW9mIENhdGVnb3J5U29ydGVyKQotCQkJcmV0dXJuICgoQ2F0ZWdvcnlTb3J0ZXIpIHNvcnRlcikuZ2V0Q2F0ZWdvcnlGaWVsZCgpICE9IG51bGw7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBCcmVhayB0aGUgbWFya2VyIHVwIGludG8gY2F0ZWdvcmllcwotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXJzCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggaW4gdGhlIG1hcmtlcnMKLQkgKiBAcGFyYW0gZW5kCi0JICogICAgICAgICAgICB0aGUgbGFzdCBpbmRleCB0byBjaGVjawotCSAqIEBwYXJhbSBzb3J0SW5kZXggLQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvZiB0aGUgZmllbGQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybiBNYXJrZXJDYXRlZ29yeVtdIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHdlIGFyZSBhdCB0aGUgYm90dG9tCi0JICogICAgICAgICBvZiB0aGUgdHJlZQotCSAqLwotCU1hcmtlckNhdGVnb3J5W10gYnVpbGRIaWVyYXJjaHkoTWFya2VyTGlzdCBtYXJrZXJzLCBpbnQgc3RhcnQsIGludCBlbmQsCi0JCQlpbnQgc29ydEluZGV4LCBNYXJrZXJDYXRlZ29yeSBwYXJlbnQpIHsKLQkJQ2F0ZWdvcnlTb3J0ZXIgc29ydGVyID0gZ2V0Q2F0ZWdvcnlTb3J0ZXIoKTsKLQotCQlpZiAoc29ydEluZGV4ID4gMCkKLQkJCXJldHVybiBudWxsOy8vIEFyZSB3ZSBvdXQgb2YgY2F0ZWdvcmllcz8KLQotCQlDb2xsZWN0aW9uIGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJT2JqZWN0IHByZXZpb3VzID0gbnVsbDsKLQkJaW50IGNhdGVnb3J5U3RhcnQgPSBzdGFydDsKLQotCQlPYmplY3RbXSBlbGVtZW50cyA9IG1hcmtlcnMuZ2V0QXJyYXkoKTsKLQotCQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHsKLQotCQkJaWYgKHByZXZpb3VzICE9IG51bGwpIHsKLQkJCQkvLyBBcmUgd2UgYXQgYSBjYXRlZ29yeSBib3VuZGFyeT8KLQkJCQlpZiAoc29ydGVyLmNvbXBhcmUocHJldmlvdXMsIGVsZW1lbnRzW2ldLCBzb3J0SW5kZXgsIGZhbHNlKSAhPSAwKSB7Ci0JCQkJCWNhdGVnb3JpZXMuYWRkKG5ldyBNYXJrZXJDYXRlZ29yeSh0aGlzLCBjYXRlZ29yeVN0YXJ0LAotCQkJCQkJCWkgLSAxLCBzb3J0SW5kZXgsIHBhcmVudCkpOwotCQkJCQljYXRlZ29yeVN0YXJ0ID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCQlwcmV2aW91cyA9IGVsZW1lbnRzW2ldOwotCi0JCX0KLQotCQlpZiAoZW5kID49IGNhdGVnb3J5U3RhcnQpIHsKLQkJCWNhdGVnb3JpZXMuYWRkKG5ldyBNYXJrZXJDYXRlZ29yeSh0aGlzLCBjYXRlZ29yeVN0YXJ0LCBlbmQsCi0JCQkJCXNvcnRJbmRleCwgcGFyZW50KSk7Ci0JCX0KLQotCQkvLyBGbGF0dGVuIHNpbmdsZSBjYXRlZ29yaWVzCi0vLwkJaWYgKGNhdGVnb3JpZXMuc2l6ZSgpID09IDEpIHsKLS8vCQkJcmV0dXJuIGJ1aWxkSGllcmFyY2h5KG1hcmtlcnMsIHN0YXJ0LCBlbmQsIHNvcnRJbmRleCArIDEsIHBhcmVudCk7Ci0vLwkJfQotCQlNYXJrZXJDYXRlZ29yeVtdIG5vZGVzID0gbmV3IE1hcmtlckNhdGVnb3J5W2NhdGVnb3JpZXMuc2l6ZSgpXTsKLQkJY2F0ZWdvcmllcy50b0FycmF5KG5vZGVzKTsKLQkJcmV0dXJuIG5vZGVzOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IGxpc3Qgb2YgbWFya2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIE1hcmtlckxpc3QKLQkgKi8KLQlwdWJsaWMgTWFya2VyTGlzdCBnZXRDdXJyZW50TWFya2VycygpIHsKLQkJaWYgKGxhc3RNYXJrZXJzID09IG51bGwpIHsvLyBGaXJzdCB0aW1lPwotCQkJdmlldy5zY2hlZHVsZU1hcmtlclVwZGF0ZSgpOwotCQkJYnVpbGRpbmcgPSB0cnVlOwotCQl9CQotCQlpZiAoYnVpbGRpbmcpCi0JCQlyZXR1cm4gbmV3IE1hcmtlckxpc3QoKTsKLQkJcmV0dXJuIGxhc3RNYXJrZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgaW4gdGhlIGFkYXB0ZXIuCi0JICogCi0JICogQHBhcmFtIHJvb3QKLQkgKiBAcmV0dXJuIE9iamVjdFtdCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkgewotCi0JCWlmIChsYXN0TWFya2VycyA9PSBudWxsKSB7Ly8gRmlyc3QgdGltZT8KLQkJCXZpZXcuc2NoZWR1bGVNYXJrZXJVcGRhdGUoKTsKLQkJCWJ1aWxkaW5nID0gdHJ1ZTsKLQkJfQkKLQkJaWYgKGJ1aWxkaW5nKQotCQkJcmV0dXJuIFV0aWwuRU1QVFlfTUFSS0VSX0FSUkFZOwotCQlpZiAoaXNTaG93aW5nSGllcmFyY2h5KCkgJiYgY2F0ZWdvcmllcyAhPSBudWxsKQotCQkJcmV0dXJuIGNhdGVnb3JpZXM7Ci0JCXJldHVybiBsYXN0TWFya2Vycy50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSByZWNlaXZlciBoYXMgbWFya2VycyB3aXRob3V0IHNjaGVkdWxpbmcKLQkgKiBhbnl0aGluZyBpZiBpdCBkb2Vzbid0LgotCSAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFya2VycyBoYXZlIG5vdCBiZWVuIAotCSAqIGNhbGN1bGF0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9NYXJrZXJzKCkgewotCQlyZXR1cm4gbGFzdE1hcmtlcnMgPT0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL01hcmtlckZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTQ5ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBNYXJrZXJGaWx0ZXIgaW1wbGVtZW50cyBDbG9uZWFibGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19FTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09OX1JFU09VUkNFID0gIm9uUmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NFTEVDVEVEX1RZUEVTID0gInNlbGVjdGVkVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfV09SS0lOR19TRVQgPSAid29ya2luZ1NldCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRVNfREVMSU1JVEVSID0gIjoiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBOZXcgYXR0cmlidXRlIHRvIGhhbmRsZSB0aGUgc2VsZWN0aW9uIHN0YXR1cyBvZiBtYXJrZXIgdHlwZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TRUxFQ1RJT05fU1RBVFVTID0gInNlbGVjdGlvblN0YXR1cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEF0dHJpYnV0ZSBzdGF0dXMgdHJ1ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNURURfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBdHRyaWJ1dGUgc3RhdHVzIGZhbHNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RFRF9UUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTl9BTlkgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05fU0VMRUNURURfT05MWSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTl9TRUxFQ1RFRF9BTkRfQ0hJTERSRU4gPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05fQU5ZX0lOX1NBTUVfQ09OVEFJTkVSID0gMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9OX1dPUktJTkdfU0VUID0gNDsKLQotCXN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9PTl9SRVNPVVJDRSA9IE9OX0FOWTsKLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfQUNUSVZBVElPTl9TVEFUVVMgPSB0cnVlOwotCi0JcHJvdGVjdGVkIExpc3Qgcm9vdFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBJV29ya2luZ1NldCB3b3JraW5nU2V0OwotCi0JcHJvdGVjdGVkIGludCBvblJlc291cmNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZDsKLQotCi0JcHJpdmF0ZSBJUmVzb3VyY2VbXSBmb2N1c1Jlc291cmNlOwotCi0JcHJpdmF0ZSBTZXQgY2FjaGVkV29ya2luZ1NldDsKLQotCS8vIFRoZSBodW1hbiByZWFkYWJsZSBuYW1lIGZvciB0aGUgZmlsdGVyCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHBhcmFtIGZpbHRlck5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBodW1hbiByZWFkYWJsZSBuYW1lIGZvciB0aGUgZmlsdGVyCi0JICogQHBhcmFtIHJvb3RUeXBlcwotCSAqICAgICAgICAgICAgVGhlIHR5cGVzIHRoaXMgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCB0bwotCSAqLwotCU1hcmtlckZpbHRlcihTdHJpbmcgZmlsdGVyTmFtZSwgU3RyaW5nW10gcm9vdFR5cGVzKSB7Ci0KLQkJbmFtZSA9IGZpbHRlck5hbWU7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCU1hcmtlclR5cGUgdHlwZSA9IE1hcmtlclR5cGVzTW9kZWwuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlKHJvb3RUeXBlc1tpXSk7Ci0KLQkJCWlmICghdGhpcy5yb290VHlwZXMuY29udGFpbnModHlwZSkpCi0JCQkJdGhpcy5yb290VHlwZXMuYWRkKHR5cGUpOwotCQl9Ci0JCXJlc2V0U3RhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0IGFsbCB0eXBlcyBrbm93biB0byB0aGlzIE1hcmtlckZpbHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZXMKLQkgKiAgICAgICAgICAgIGxpc3QgdG8gYmUgZmlsbGVkIGluIHdpdGggdHlwZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBbGxTdWJUeXBlcyhMaXN0IHR5cGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdFR5cGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNYXJrZXJUeXBlIHJvb3RUeXBlID0gKE1hcmtlclR5cGUpIHJvb3RUeXBlcy5nZXQoaSk7Ci0JCQlhZGRBbGxTdWJUeXBlcyh0eXBlcywgcm9vdFR5cGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEFsbFN1YlR5cGVzKExpc3QgdHlwZXMsIE1hcmtlclR5cGUgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghdHlwZXMuY29udGFpbnModHlwZSkpCi0JCQl0eXBlcy5hZGQodHlwZSk7Ci0KLQkJTWFya2VyVHlwZVtdIHN1YlR5cGVzID0gdHlwZS5nZXRTdWJ0eXBlcygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViVHlwZXMubGVuZ3RoOyBpKyspCi0JCQlhZGRBbGxTdWJUeXBlcyh0eXBlcywgc3ViVHlwZXNbaV0pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYWxsIG1hcmtlcnMgaW4gdGhlIGdpdmVuIHNldCBvZiByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIGxpc3QKLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0TGlzdAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gbWFya2VyVHlwZUlkCi0JICogQHBhcmFtIGRlcHRoCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZpbmRNYXJrZXJzKElSZXNvdXJjZVtdIHJlc291cmNlcywgaW50IGRlcHRoLCBpbnQgbGltaXQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbiwgYm9vbGVhbiBpZ25vcmVFeGNlcHRpb25zKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJTGlzdCByZXN1bHRMaXN0ID0gbmV3IEFycmF5TGlzdChyZXNvdXJjZXMubGVuZ3RoICogMik7Ci0KLQkJLy8gT3B0aW1pemF0aW9uOiBpZiBhIHR5cGUgYXBwZWFycyBpbiB0aGUgc2VsZWN0ZWRUeXBlcyBsaXN0IGFsb25nIHdpdGgKLQkJLy8gYWxsIG9mIGl0cwotCQkvLyBzdWJ0eXBlcywgdGhlbiBjb21iaW5lIHRoZXNlIGluIGEgc2luZ2xlIHNlYXJjaC4KLQotCQkvLyBMaXN0IG9mIHR5cGVzIHRoYXQgaGF2ZW4ndCBiZWVuIHJlcGxhY2VkIGJ5IG9uZSBvZiB0aGVpciBzdXBlcnR5cGVzCi0JCUhhc2hTZXQgdHlwZXNUb1NlYXJjaCA9IG5ldyBIYXNoU2V0KHNlbGVjdGVkVHlwZXMuc2l6ZSgpKTsKLQotCQkvLyBMaXN0IG9mIHR5cGVzIHRoYXQgYXBwZWFyZWQgaW4gc2VsZWN0ZWRUeXBlcyBhbG9uZyB3aXRoIGFsbCBvZiB0aGVpcgotCQkvLyBzdWJ0eXBlcwotCQlIYXNoU2V0IGluY2x1ZGVBbGxTdWJ0eXBlcyA9IG5ldyBIYXNoU2V0KHNlbGVjdGVkVHlwZXMuc2l6ZSgpKTsKLQotCQl0eXBlc1RvU2VhcmNoLmFkZEFsbChzZWxlY3RlZFR5cGVzKTsKLQotCQlJdGVyYXRvciBpdGVyID0gc2VsZWN0ZWRUeXBlcy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJTWFya2VyVHlwZSB0eXBlID0gKE1hcmtlclR5cGUpIGl0ZXIubmV4dCgpOwotCi0JCQlDb2xsZWN0aW9uIHN1YnR5cGVzID0gQXJyYXlzLmFzTGlzdCh0eXBlLmdldEFsbFN1YlR5cGVzKCkpOwotCi0JCQlpZiAoc2VsZWN0ZWRUeXBlcy5jb250YWluc0FsbChzdWJ0eXBlcykpIHsKLQkJCQl0eXBlc1RvU2VhcmNoLnJlbW92ZUFsbChzdWJ0eXBlcyk7Ci0KLQkJCQlpbmNsdWRlQWxsU3VidHlwZXMuYWRkKHR5cGUpOwotCQkJfQotCQl9Ci0KLQkJbW9uLmJlZ2luVGFzayhNYXJrZXJNZXNzYWdlcy5NYXJrZXJGaWx0ZXJfc2VhcmNoaW5nLCB0eXBlc1RvU2VhcmNoCi0JCQkJLnNpemUoKQotCQkJCSogcmVzb3VyY2VzLmxlbmd0aCk7Ci0KLQkJLy8gVXNlIHRoaXMgaGFzaCBzZXQgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSBhbnkgcmVzb3VyY2VzIGluIHRoZQotCQkvLyBsaXN0IHRoYXQgYXBwZWFyIGFsb25nIHdpdGggdGhlaXIgcGFyZW50LgotCQlIYXNoU2V0IHJlc291cmNlc1RvU2VhcmNoID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvLyBJbnNlcnQgYWxsIHRoZSByZXNvdXJjZXMgaW50byB0aGUgaGFzaHNldAotCQlmb3IgKGludCBpZHggPSAwOyBpZHggPCByZXNvdXJjZXMubGVuZ3RoOyBpZHgrKykgewotCQkJSVJlc291cmNlIG5leHQgPSByZXNvdXJjZXNbaWR4XTsKLQotCQkJaWYgKCFuZXh0LmV4aXN0cygpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChyZXNvdXJjZXNUb1NlYXJjaC5jb250YWlucyhuZXh0KSkgewotCQkJCW1vbi53b3JrZWQodHlwZXNUb1NlYXJjaC5zaXplKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZXNUb1NlYXJjaC5hZGQobmV4dCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMKLQkJZm9yIChpbnQgcmVzb3VyY2VJZHggPSAwOyByZXNvdXJjZUlkeCA8IHJlc291cmNlcy5sZW5ndGg7IHJlc291cmNlSWR4KyspIHsKLQkJCWl0ZXIgPSB0eXBlc1RvU2VhcmNoLml0ZXJhdG9yKCk7Ci0KLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tyZXNvdXJjZUlkeF07Ci0KLQkJCS8vIFNraXAgcmVzb3VyY2VzIHRoYXQgZG9uJ3QgZXhpc3QKLQkJCWlmICghcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGRlcHRoID09IElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSkgewotCQkJCS8vIERldGVybWluZSBpZiBhbnkgcGFyZW50IG9mIHRoaXMgcmVzb3VyY2UgaXMgYWxzbyBpbiBvdXIKLQkJCQkvLyBmaWx0ZXIKLQkJCQlJUmVzb3VyY2UgcGFyZW50ID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlpZiAocmVzb3VyY2VzVG9TZWFyY2guY29udGFpbnMocGFyZW50KSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQl9Ci0KLQkJCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotCQkJCX0KLQotCQkJCS8vIElmIGEgcGFyZW50IG9mIHRoaXMgcmVzb3VyY2UgaXMgYWxzbyBpbiB0aGUgZmlsdGVyLCB3ZSBjYW4KLQkJCQkvLyBza2lwIGl0Ci0JCQkJLy8gYmVjYXVzZSB3ZSdsbCBwaWNrIHVwIGl0cyBtYXJrZXJzIHdoZW4gd2Ugc2VhcmNoIHRoZSBwYXJlbnQuCi0JCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgbWFya2VyIHR5cGVzCi0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlNYXJrZXJUeXBlIG1hcmtlclR5cGUgPSAoTWFya2VyVHlwZSkgaXRlci5uZXh0KCk7Ci0KLQkJCQkvLyBPbmx5IHNlYXJjaCBmb3Igc3VidHlwZXMgb2YgdGhlIG1hcmtlciBpZiB3ZSBmb3VuZCBhbGwgb2YgaXRzCi0JCQkJLy8gc3VidHlwZXMgaW4gdGhlIGZpbHRlciBjcml0ZXJpYS4KLQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKG1hcmtlclR5cGUuZ2V0SWQoKSwKLQkJCQkJCWluY2x1ZGVBbGxTdWJ0eXBlcy5jb250YWlucyhtYXJrZXJUeXBlKSwgZGVwdGgpOwotCi0JCQkJbW9uLndvcmtlZCgxKTsKLQotCQkJCWZvciAoaW50IGlkeCA9IDA7IGlkeCA8IG1hcmtlcnMubGVuZ3RoOyBpZHgrKykgewotCQkJCQlDb25jcmV0ZU1hcmtlciBtYXJrZXI7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltYXJrZXIgPSBNYXJrZXJMaXN0LmNyZWF0ZU1hcmtlcihtYXJrZXJzW2lkeF0pOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChpZ25vcmVFeGNlcHRpb25zKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRocm93IGU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAobGltaXQgIT0gLTEgJiYgcmVzdWx0TGlzdC5zaXplKCkgPj0gbGltaXQpIHsKLQkJCQkJCXJldHVybiByZXN1bHRMaXN0OwotCQkJCQl9Ci0KLQkJCQkJaWYgKHNlbGVjdE1hcmtlcihtYXJrZXIpKSB7Ci0JCQkJCQlyZXN1bHRMaXN0LmFkZChtYXJrZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJbW9uLmRvbmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIG1hcmtlciBwYXNzZXMgdGhlCi0JICogZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYXJrZXIgcGFzc2VzIHRoZSBmaWx0ZXIgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2VsZWN0TWFya2VyKENvbmNyZXRlTWFya2VyIG1hcmtlcikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyB0aGUgd29ya3NwYWNlIGZvciBtYXJrZXJzIHRoYXQgcGFzcyB0aGlzIGZpbHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIENvbGxlY3Rpb24gb2YgbWFya2Vycy4KLQkgKi8KLQlDb2xsZWN0aW9uIGZpbmRNYXJrZXJzKElQcm9ncmVzc01vbml0b3IgbW9uLCBib29sZWFuIGlnbm9yZUV4Y2VwdGlvbnMpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJTGlzdCB1bmZpbHRlcmVkID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotCQlpZiAoIWlzRW5hYmxlZCgpKSB7Ci0JCQl1bmZpbHRlcmVkID0gZmluZE1hcmtlcnMobmV3IElSZXNvdXJjZVtdIHsgUmVzb3VyY2VzUGx1Z2luCi0JCQkJCS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkgfSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCAtMSwKLQkJCQkJbW9uLCBpZ25vcmVFeGNlcHRpb25zKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGludCBsaW1pdCA9IGdldEZpbHRlck9uTWFya2VyTGltaXQoKSA/IGdldE1hcmtlckxpbWl0KCkgKyAxIDogLTE7Ci0JCQlpbnQgbGltaXQgPSAtMTsKLQotCQkJc3dpdGNoIChnZXRPblJlc291cmNlKCkpIHsKLQkJCWNhc2UgT05fQU5ZOiB7Ci0JCQkJdW5maWx0ZXJlZCA9IGZpbmRNYXJrZXJzKG5ldyBJUmVzb3VyY2VbXSB7IFJlc291cmNlc1BsdWdpbgotCQkJCQkJLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSB9LCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsCi0JCQkJCQlsaW1pdCwgbW9uLCBpZ25vcmVFeGNlcHRpb25zKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgT05fU0VMRUNURURfT05MWTogewotCQkJCXVuZmlsdGVyZWQgPSBmaW5kTWFya2Vycyhmb2N1c1Jlc291cmNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTywKLQkJCQkJCWxpbWl0LCBtb24sIGlnbm9yZUV4Y2VwdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBPTl9TRUxFQ1RFRF9BTkRfQ0hJTERSRU46IHsKLQkJCQl1bmZpbHRlcmVkID0gZmluZE1hcmtlcnMoZm9jdXNSZXNvdXJjZSwKLQkJCQkJCUlSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbGltaXQsIG1vbiwgaWdub3JlRXhjZXB0aW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE9OX0FOWV9JTl9TQU1FX0NPTlRBSU5FUjogewotCQkJCXVuZmlsdGVyZWQgPSBmaW5kTWFya2VycyhnZXRQcm9qZWN0cyhmb2N1c1Jlc291cmNlKSwKLQkJCQkJCUlSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbGltaXQsIG1vbiwgaWdub3JlRXhjZXB0aW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE9OX1dPUktJTkdfU0VUOiB7Ci0JCQkJdW5maWx0ZXJlZCA9IGZpbmRNYXJrZXJzKGdldFJlc291cmNlc0luV29ya2luZ1NldCgpLAotCQkJCQkJSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBsaW1pdCwgbW9uLCBpZ25vcmVFeGNlcHRpb25zKTsKLQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICh1bmZpbHRlcmVkID09IG51bGwpIHsKLQkJCXVuZmlsdGVyZWQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJcmV0dXJuIHVuZmlsdGVyZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZXMgaW4gdGhlIHdvcmtpbmcgc2V0LiBJZiBpdCBpcyBlbXB0eSB0aGVuCi0JICogcmV0dXJuIHRoZSB3b3Jrc3BhY2Ugcm9vdC4KLQkgKiBAcmV0dXJuIElSZXNvdXJjZVtdCi0JICovCi0JSVJlc291cmNlW10gZ2V0UmVzb3VyY2VzSW5Xb3JraW5nU2V0KCkgewotCQlpZiAod29ya2luZ1NldCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElSZXNvdXJjZVswXTsKLQkJfQotCi0JCWlmICh3b3JraW5nU2V0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG5ldyBJUmVzb3VyY2VbXSB7IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkgfTsKLQkJfQotCi0JCUlBZGFwdGFibGVbXSBlbGVtZW50cyA9IHdvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLmxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgZWxlbWVudHMubGVuZ3RoOyBpZHgrKykgewotCQkJSVJlc291cmNlIG5leHQgPSAoSVJlc291cmNlKSBlbGVtZW50c1tpZHhdCi0JCQkJCS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0KLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQuYWRkKG5leHQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChJUmVzb3VyY2VbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElSZXNvdXJjZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHNldCBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgZnVsbCBwYXRobmFtZXMgdG8gZXZlcnkKLQkgKiByZXNvdXJjZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGNvbnRhaW5lZCBpbiB0aGUgd29ya2luZyBzZXQuIEEgcmVzb3VyY2UKLQkgKiBpcyBpbiB0aGUgd29ya2luZyBzZXQgaWZmIGl0cyBwYXRoIG5hbWUgY2FuIGJlIGZvdW5kIGluIHRoaXMgc2V0LgotCSAqIAotCSAqIEByZXR1cm4gU2V0Ci0JICovCi0JcHJpdmF0ZSBTZXQgZ2V0V29ya2luZ1NldEFzU2V0T2ZQYXRocygpIHsKLQkJaWYgKGNhY2hlZFdvcmtpbmdTZXQgPT0gbnVsbCkgewotCQkJSGFzaFNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwotCi0JCQlhZGRSZXNvdXJjZXNBbmRDaGlsZHJlbihyZXN1bHQsIGdldFJlc291cmNlc0luV29ya2luZ1NldCgpKTsKLQotCQkJY2FjaGVkV29ya2luZ1NldCA9IHJlc3VsdDsKLQkJfQotCi0JCXJldHVybiBjYWNoZWRXb3JraW5nU2V0OwotCX0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBBZGRzIHRoZSBwYXRocyBvZiBhbGwgcmVzb3VyY2VzIGluIHRoZSBnaXZlbiBhcnJheSB0byB0aGUgZ2l2ZW4gc2V0LgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRSZXNvdXJjZXNBbmRDaGlsZHJlbihIYXNoU2V0IHJlc3VsdCwgSVJlc291cmNlW10gcmVzb3VyY2VzKSB7Ci0JCWZvciAoaW50IGlkeCA9IDA7IGlkeCA8IHJlc291cmNlcy5sZW5ndGg7IGlkeCsrKSB7Ci0KLQkJCUlSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UgPSByZXNvdXJjZXNbaWR4XTsKLQotCQkJcmVzdWx0LmFkZChjdXJyZW50UmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQotCQkJaWYgKGN1cnJlbnRSZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQlJQ29udGFpbmVyIGNvbnQgPSAoSUNvbnRhaW5lcikgY3VycmVudFJlc291cmNlOwotCi0JCQkJdHJ5IHsKLQkJCQkJYWRkUmVzb3VyY2VzQW5kQ2hpbGRyZW4ocmVzdWx0LCBjb250Lm1lbWJlcnMoKSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIElnbm9yZSBlcnJvcnMKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldCBvZiBwcm9qZWN0cyB0aGF0IGNvbnRhaW4gdGhlIGdpdmVuIHNldCBvZiByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgSVByb2plY3RbXSBnZXRQcm9qZWN0cyhJUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElQcm9qZWN0WzBdOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBwcm9qZWN0cyA9IGdldFByb2plY3RzQXNDb2xsZWN0aW9uKHJlc291cmNlcyk7Ci0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSBwcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFtwcm9qZWN0cy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2plY3RzIGZvciB0aGUgZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIElSZXNvdXJjZSBvciBJUmVzb3VyY2VNYXBwaW5nCi0JICogQHJldHVybiBDb2xsZWN0aW9uIG9mIElQcm9qZWN0Ci0JICovCi0Jc3RhdGljIENvbGxlY3Rpb24gZ2V0UHJvamVjdHNBc0NvbGxlY3Rpb24oT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJSGFzaFNldCBwcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgZWxlbWVudHMubGVuZ3RoOyBpZHgrKykgewotCQkJaWYgKGVsZW1lbnRzW2lkeF0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0JCQkJcHJvamVjdHMuYWRkKCgoSVJlc291cmNlKSBlbGVtZW50c1tpZHhdKS5nZXRQcm9qZWN0KCkpOwotCQkJZWxzZSB7Ci0JCQkJSVByb2plY3RbXSBtYXBwaW5nUHJvamVjdHMgPSAoKChSZXNvdXJjZU1hcHBpbmcpIGVsZW1lbnRzW2lkeF0pCi0JCQkJCQkuZ2V0UHJvamVjdHMoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5nUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJcHJvamVjdHMuYWRkKG1hcHBpbmdQcm9qZWN0c1tpXSk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcHJvamVjdHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0KENvbmNyZXRlTWFya2VyIG1hcmtlcikgewotCQlpZiAoIWlzRW5hYmxlZCgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBzZWxlY3RCeVR5cGUobWFya2VyKSAmJiBzZWxlY3RCeVNlbGVjdGlvbihtYXJrZXIpCi0JCQkJJiYgc2VsZWN0TWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdEJ5VHlwZShDb25jcmV0ZU1hcmtlciBtYXJrZXIpIHsKLQkJcmV0dXJuIHNlbGVjdGVkVHlwZXMuY29udGFpbnMoTWFya2VyVHlwZXNNb2RlbC5nZXRJbnN0YW5jZSgpLmdldFR5cGUobWFya2VyLmdldFR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG1hcmtlciBzaG91bGQgYmUgZmlsdGVyIG91dCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIG1hcmtlcgotCSAqICAgICAgICAgICAgdGhlIG1hcmtlciB0byB0ZXN0Ci0JICogQHJldHVybiB0cnVlPXRoZSBtYXJrZXIgc2hvdWxkIG5vdCBiZSBmaWx0ZXJlZCBvdXQgZmFsc2U9dGhlIG1hcmtlcgotCSAqICAgICAgICAgc2hvdWxkIGJlIGZpbHRlcmVkIG91dAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RCeVNlbGVjdGlvbihDb25jcmV0ZU1hcmtlciBtYXJrZXIpIHsKLQkJaWYgKG9uUmVzb3VyY2UgPT0gT05fQU5ZIHx8IG1hcmtlciA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKGZvY3VzUmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG1hcmtlci5nZXRSZXNvdXJjZSgpOwotCi0JCWlmIChvblJlc291cmNlID09IE9OX1dPUktJTkdfU0VUKSB7Ci0KLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJCXJldHVybiBpc0VuY2xvc2VkKHJlc291cmNlKTsKLQotCQl9IGVsc2UgaWYgKG9uUmVzb3VyY2UgPT0gT05fQU5ZX0lOX1NBTUVfQ09OVEFJTkVSKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCi0JCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZvY3VzUmVzb3VyY2UubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBzZWxlY3RlZFByb2plY3QgPSBmb2N1c1Jlc291cmNlW2ldLmdldFByb2plY3QoKTsKLQotCQkJCWlmIChzZWxlY3RlZFByb2plY3QgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAocHJvamVjdC5lcXVhbHMoc2VsZWN0ZWRQcm9qZWN0KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob25SZXNvdXJjZSA9PSBPTl9TRUxFQ1RFRF9PTkxZKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZvY3VzUmVzb3VyY2UubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocmVzb3VyY2UuZXF1YWxzKGZvY3VzUmVzb3VyY2VbaV0pKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChvblJlc291cmNlID09IE9OX1NFTEVDVEVEX0FORF9DSElMRFJFTikgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb2N1c1Jlc291cmNlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVJlc291cmNlIHBhcmVudFJlc291cmNlID0gcmVzb3VyY2U7Ci0KLQkJCQl3aGlsZSAocGFyZW50UmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlpZiAocGFyZW50UmVzb3VyY2UuZXF1YWxzKGZvY3VzUmVzb3VyY2VbaV0pKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJcGFyZW50UmVzb3VyY2UgPSBwYXJlbnRSZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgZW5jbG9zZWQgYnkgYSB3b3JraW5nIHNldCBlbGVtZW50LgotCSAqIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgbWV0aG9kIHVzZWQgSUNvbnRhaW5tZW50QWRhcHRlciBmb3IgY29udGFpbm1lbnQKLQkgKiB0ZXN0cy4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoaXMgaXMgbm8gbG9uZ2VyIHBvc3NpYmxlLiBDb2RlIHRoYXQKLQkgKiByZWxpZXMgb24gdGhpcyBiZWhhdmlvciBzaG91bGQgYmUgdXBkYXRlZCBhcHByb3ByaWF0ZWx5LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICByZXNvdXJjZSB0byB0ZXN0IGZvciBlbmNsb3N1cmUgYnkgYSB3b3JraW5nIHNldCBlbGVtZW50Ci0JICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgaXMgZW5jbG9zZWQgYnkgYSB3b3JraW5nIHNldCBlbGVtZW50IGFuZCBmYWxzZQotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VuY2xvc2VkKElSZXNvdXJjZSBlbGVtZW50KSB7Ci0JCWlmICh3b3JraW5nU2V0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKHdvcmtpbmdTZXQuaXNFbXB0eSgpKQotCQkJcmV0dXJuIHRydWU7IC8vIEV2ZXJ5dGhpbmcgaXMgaW4gYW4gZW1wdHkgd29ya2luZyBzZXQKLQkJU2V0IHdvcmtpbmdTZXRQYXRocyA9IGdldFdvcmtpbmdTZXRBc1NldE9mUGF0aHMoKTsKLQotCQlyZXR1cm4gd29ya2luZ1NldFBhdGhzLmNvbnRhaW5zKGVsZW1lbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPk1hcmtlckZpbHRlci5PTl9BTlk8L2NvZGU+IGlmIHNob3dpbmcgaXRlbXMgYXNzb2NpYXRlZCB3aXRoCi0JICogYW55IHJlc291cmNlLjwvbGk+Ci0JICogPGxpPjxjb2RlPk1hcmtlckZpbHRlci5PTl9TRUxFQ1RFRF9PTkxZPC9jb2RlPiBpZiBzaG93aW5nIGl0ZW1zCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWxlY3RlZCByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtiZW5jaC48L2xpPgotCSAqIDxsaT48Y29kZT5NYXJrZXJGaWx0ZXIuT05fU0VMRUNURURfQU5EX0NISUxEUkVOPC9jb2RlPiBpZiBzaG93aW5nCi0JICogaXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWxlY3RlZCByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtiZW5jaCBhbmQgaXRzCi0JICogY2hpbGRyZW4uPC9saT4KLQkgKiA8bGk+PGNvZGU+TWFya2VyRmlsdGVyLk9OX0FOWV9PRl9TQU1FX1BST0pFQ1Q8L2NvZGU+IGlmIHNob3dpbmcgaXRlbXMKLQkgKiBpbiB0aGUgc2FtZSBwcm9qZWN0IGFzIHRoZSBzZWxlY3RlZCByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtiZW5jaC48L2xpPgotCSAqIDxsaT48Y29kZT5NYXJrZXJGaWx0ZXIuT05fV09SS0lOR19TRVQ8L2NvZGU+IGlmIHNob3dpbmcgaXRlbXMgaW4gc29tZQotCSAqIHdvcmtpbmcgc2V0LjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiBvblJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHR5cGUgb2YgZmlsdGVyaW5nIGJ5IHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb25SZXNvdXJjZQotCSAqICAgICAgICAgICAgbXVzdCBiZSBvbmUgb2Y6Ci0JICogICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICA8bGk+PGNvZGU+TWFya2VyRmlsdGVyLk9OX0FOWV9SRVNPVVJDRTwvY29kZT48L2xpPgotCSAqICAgICAgICAgICAgPGxpPjxjb2RlPk1hcmtlckZpbHRlci5PTl9TRUxFQ1RFRF9SRVNPVVJDRV9PTkxZPC9jb2RlPjwvbGk+Ci0JICogICAgICAgICAgICA8bGk+PGNvZGU+TWFya2VyRmlsdGVyLk9OX1NFTEVDVEVEX1JFU09VUkNFX0FORF9DSElMRFJFTjwvY29kZT48L2xpPgotCSAqICAgICAgICAgICAgPGxpPjxjb2RlPk1hcmtlckZpbHRlci5PTl9BTllfUkVTT1VSQ0VfT0ZfU0FNRV9QUk9KRUNUPC9jb2RlPjwvbGk+Ci0JICogICAgICAgICAgICA8bGk+PGNvZGU+TWFya2VyRmlsdGVyLk9OX1dPUktJTkdfU0VUPC9jb2RlPjwvbGk+Ci0JICogICAgICAgICAgICA8L3VsPgotCSAqLwotCXZvaWQgc2V0T25SZXNvdXJjZShpbnQgb25SZXNvdXJjZSkgewotCQlpZiAob25SZXNvdXJjZSA+PSBPTl9BTlkgJiYgb25SZXNvdXJjZSA8PSBPTl9XT1JLSU5HX1NFVCkKLQkJCXRoaXMub25SZXNvdXJjZSA9IG9uUmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2Uocykgd2l0aGluZyB0aGUgd29ya2JlbmNoLgotCSAqLwotCUlSZXNvdXJjZVtdIGdldEZvY3VzUmVzb3VyY2UoKSB7Ci0JCXJldHVybiBmb2N1c1Jlc291cmNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvY3VzZWQgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzUmVzb3VyY2UoSVJlc291cmNlW10gcmVzb3VyY2VzKSB7Ci0JCWZvY3VzUmVzb3VyY2UgPSByZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqIDx1bD4KLQkgKiA8bGk+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbHRlciBpcyBlbmFibGVkLjwvbGk+Ci0JICogPGxpPjxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgZmlsdGVyIGlzIG5vdCBlbmFibGVkLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCS8qKgotCSAqIDxiPldhcm5pbmc6PC9iPiBmb3IgaW50ZXJuYWwgcGFja2FnZSB1c2Ugb25seS4gUmV0dXJuIHRoZSByb290IG1hcmtlcgotCSAqIHR5cGVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJvb3QgbWFya2VyIHR5cGVzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJvb3RUeXBlcygpIHsKLQkJcmV0dXJuIHJvb3RUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiA8Yj5XYXJuaW5nOjwvYj4gZm9yIGludGVybmFsIHBhY2thZ2UgdXNlIG9ubHkuIFJldHVybiB0aGUgc2VsZWN0ZWQKLQkgKiB0eXBlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWxlY3RlZCBtYXJrZXIgdHlwZXMgdG8gYmUgZGlzcGxheWVkLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkVHlwZXMoKSB7Ci0JCXJldHVybiBzZWxlY3RlZFR5cGVzOwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIHR5cGVNb2RlbCBlbnRyeSB0aGF0IG1hdGNoZXMgaWQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICB0aGUgSUQgZm9yIGEgbWFya2VyIHR5cGUKLQkgKiBAcmV0dXJuIE1hcmtlclR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBNYXJrZXJUeXBlIGdldE1hcmtlclR5cGUoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBNYXJrZXJUeXBlc01vZGVsLmdldEluc3RhbmNlKCkuZ2V0VHlwZShpZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIHNldCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyB3b3JraW5nIHNldAotCSAqICAgICAgICAgaXMgZGVmaW5lZC4KLQkgKi8KLQlJV29ya2luZ1NldCBnZXRXb3JraW5nU2V0KCkgewotCQlyZXR1cm4gd29ya2luZ1NldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbmFibGVtZW50IHN0YXRlIG9mIHRoZSBmaWx0ZXIuCi0JICovCi0Jdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgd29ya2luZyBzZXQuCi0JICovCi0Jdm9pZCBzZXRXb3JraW5nU2V0KElXb3JraW5nU2V0IHdvcmtpbmdTZXQpIHsKLQkJdGhpcy53b3JraW5nU2V0ID0gd29ya2luZ1NldDsKLQkJY2FjaGVkV29ya2luZ1NldCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgdG8gdGhlIGRlZmF1bHQgc3RhdGUuCi0JICovCi0Jdm9pZCByZXNldFN0YXRlKCkgewotCQllbmFibGVkID0gREVGQVVMVF9BQ1RJVkFUSU9OX1NUQVRVUzsKLQkJb25SZXNvdXJjZSA9IERFRkFVTFRfT05fUkVTT1VSQ0U7Ci0JCXNlbGVjdGVkVHlwZXMuY2xlYXIoKTsKLQkJYWRkQWxsU3ViVHlwZXMoc2VsZWN0ZWRUeXBlcyk7Ci0JCXNldFdvcmtpbmdTZXQobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZSB0aGUgc3RhdGUgaW4gdGhlIG1lbWVudG8uCi0JICogCi0JICogQHBhcmFtIG1lbWVudG8KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlyZXNldFN0YXRlKCk7Ci0JCXJlc3RvcmVGaWx0ZXJTZXR0aW5ncyhtZW1lbnRvKTsKLQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSByZWNlaXZlciBpbiB0aGUgc3VwcGxpZWQgc2V0dGluZ3MuIFRoaXMgaXMga2VwdAotCSAqIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIDMuMSBkaWFsb2cgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZUZpbHRlclNldHRpbmdzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncykgewotCi0JCXJlc2V0U3RhdGUoKTsKLQotCQlTdHJpbmcgc2V0dGluZyA9IHNldHRpbmdzLmdldChUQUdfRU5BQkxFRCk7Ci0KLQkJaWYgKHNldHRpbmcgIT0gbnVsbCkKLQkJCWVuYWJsZWQgPSBCb29sZWFuLnZhbHVlT2Yoc2V0dGluZykuYm9vbGVhblZhbHVlKCk7Ci0KLQkJc2V0dGluZyA9IHNldHRpbmdzLmdldChUQUdfT05fUkVTT1VSQ0UpOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJb25SZXNvdXJjZSA9IEludGVnZXIucGFyc2VJbnQoc2V0dGluZyk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZU51bWJlckZvcm1hdCkgewotCQkJfQotCQl9Ci0KLQkJLy8gbmV3IHNlbGVjdGlvbiBsaXN0IGF0dHJpYnV0ZQotCQkvLyBmb3JtYXQgaXMgImlkOih0cnVlfGZhbHNlKToiCi0JCXNldHRpbmcgPSBzZXR0aW5ncy5nZXQoVEFHX1NFTEVDVElPTl9TVEFUVVMpOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpIHsKLQkJCXNlbGVjdGVkVHlwZXMuY2xlYXIoKTsKLQotCQkJLy8gZ2V0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIHR5cGVzCi0JCQlMaXN0IG5ld1R5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYWRkQWxsU3ViVHlwZXMobmV3VHlwZXMpOwotCi0JCQlTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZXR0aW5nKTsKLQotCQkJd2hpbGUgKHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgaWQgPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKFRBR19UWVBFU19ERUxJTUlURVIpOwotCQkJCVN0cmluZyBzdGF0dXMgPSBudWxsOwotCQkJCWlmIChzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCXN0YXR1cyA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oVEFHX1RZUEVTX0RFTElNSVRFUik7Ci0JCQkJfQotCi0JCQkJTWFya2VyVHlwZSBtYXJrZXJUeXBlID0gTWFya2VyVHlwZXNNb2RlbC5nZXRJbnN0YW5jZSgpLmdldFR5cGUoaWQpOwotCQkJCWlmIChtYXJrZXJUeXBlICE9IG51bGwpIHsKLQkJCQkJbmV3VHlwZXMucmVtb3ZlKG1hcmtlclR5cGUpOwotCi0JCQkJCS8vIGFkZCB0aGUgdHlwZSB0byB0aGUgc2VsZWN0ZWQgbGlzdAotCQkJCQlpZiAoIVNFTEVDVEVEX0ZBTFNFLmVxdWFscyhzdGF0dXMpCi0JCQkJCQkJJiYgIXNlbGVjdGVkVHlwZXMuY29udGFpbnMobWFya2VyVHlwZSkpIHsKLQkJCQkJCXNlbGVjdGVkVHlwZXMuYWRkKG1hcmtlclR5cGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBhbnkgdHlwZXMgd2Uga25vdyBhYm91dCB0aGF0IHdlcmVuJ3QgZWl0aGVyIHRydWUgb3IKLQkJCS8vIGZhbHNlIGluIHRoZSBzZWxlY3Rpb24gYXR0cmlidXRlIGFyZSBuZXcuIEJ5IGRlZmF1bHQsCi0JCQkvLyBuZXcgbWFya2VyIHR5cGVzIHdpbGwgYmUgc2VsZWN0ZWQ9dHJ1ZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdUeXBlcy5zaXplKCk7ICsraSkgewotCQkJCXNlbGVjdGVkVHlwZXMuYWRkKG5ld1R5cGVzLmdldChpKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGUgc2V0dGluZ3MgZGlkbid0IGNvbnRhaW4gdGhlIG5ldyBzZWxlY3Rpb24gYXR0cmlidXRlCi0JCQkvLyBzbyBjaGVjayBmb3IgdGhlIG9sZCBzZWxlY3Rpb24gYXR0cmlidXRlLgotCQkJLy8gZm9ybWF0IGlzIGp1c3QgImlkOiIKLQkJCXNldHRpbmcgPSBzZXR0aW5ncy5nZXQoVEFHX1NFTEVDVEVEX1RZUEVTKTsKLQotCQkJaWYgKHNldHRpbmcgIT0gbnVsbCkgewotCQkJCWdlbmVyYXRlU2VsZWN0ZWRUeXBlcyhzZXR0aW5nKTsKLQkJCX0KLQotCQl9Ci0KLQkJc2V0dGluZyA9IHNldHRpbmdzLmdldChUQUdfV09SS0lOR19TRVQpOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQlzZXRXb3JraW5nU2V0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2luZ1NldE1hbmFnZXIoKQotCQkJCQkuZ2V0V29ya2luZ1NldChzZXR0aW5nKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzZWxlY3RlZCB0eXBlcyBiYXNlZCBvbiB0aGUgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGVkVHlwZXNWYWx1ZQotCSAqLwotCXZvaWQgZ2VuZXJhdGVTZWxlY3RlZFR5cGVzKFN0cmluZyBzZWxlY3RlZFR5cGVzVmFsdWUpIHsKLQkJc2VsZWN0ZWRUeXBlcy5jbGVhcigpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLQkJCQlzZWxlY3RlZFR5cGVzVmFsdWUpOwotCi0JCXdoaWxlIChzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlNYXJrZXJUeXBlIG1hcmtlclR5cGUgPSBnZXRNYXJrZXJUeXBlKHN0cmluZ1Rva2VuaXplcgotCQkJCQkubmV4dFRva2VuKFRBR19UWVBFU19ERUxJTUlURVIpKTsKLQotCQkJaWYgKG1hcmtlclR5cGUgIT0gbnVsbCAmJiAhc2VsZWN0ZWRUeXBlcy5jb250YWlucyhtYXJrZXJUeXBlKSkKLQkJCQlzZWxlY3RlZFR5cGVzLmFkZChtYXJrZXJUeXBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIG1hcmtlclR5cGUgbWF0Y2hpbmcgdHlwZU5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZU5hbWUKLQkgKiBAcmV0dXJuIE1hcmtlclR5cGUKLQkgKi8KLQlNYXJrZXJUeXBlIGZpbmRNYXJrZXJUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gTWFya2VyVHlwZXNNb2RlbC5nZXRJbnN0YW5jZSgpLmdldFR5cGUodHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSByZWNlaXZlciBpbiB0aGUgc3VwcGxpZWQgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIG1lbWVudG8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlRmlsdGVyU2V0dGluZ3MoSU1lbWVudG8gbWVtZW50bykgewotCQlTdHJpbmcgc2V0dGluZyA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19FTkFCTEVEKTsKLQotCQlpZiAoc2V0dGluZyAhPSBudWxsKQotCQkJZW5hYmxlZCA9IEJvb2xlYW4udmFsdWVPZihzZXR0aW5nKS5ib29sZWFuVmFsdWUoKTsKLQotCQlJbnRlZ2VyIHJlc291cmNlU2V0dGluZyA9IG1lbWVudG8uZ2V0SW50ZWdlcihUQUdfT05fUkVTT1VSQ0UpOwotCi0JCWlmIChyZXNvdXJjZVNldHRpbmcgIT0gbnVsbCkgewotCQkJb25SZXNvdXJjZSA9IHJlc291cmNlU2V0dGluZy5pbnRWYWx1ZSgpOwotCQl9Ci0KLQkJLy8gbmV3IHNlbGVjdGlvbiBsaXN0IGF0dHJpYnV0ZQotCQkvLyBmb3JtYXQgaXMgImlkOih0cnVlfGZhbHNlKToiCi0JCXNldHRpbmcgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfU0VMRUNUSU9OX1NUQVRVUyk7Ci0KLQkJaWYgKHNldHRpbmcgIT0gbnVsbCkgewotCQkJc2VsZWN0ZWRUeXBlcy5jbGVhcigpOwotCi0JCQkvLyBnZXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgdHlwZXMKLQkJCUxpc3QgbmV3VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlhZGRBbGxTdWJUeXBlcyhuZXdUeXBlcyk7Ci0KLQkJCVN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNldHRpbmcpOwotCi0JCQl3aGlsZSAoc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBpZCA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oVEFHX1RZUEVTX0RFTElNSVRFUik7Ci0JCQkJU3RyaW5nIHN0YXR1cyA9IG51bGw7Ci0JCQkJaWYgKHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJc3RhdHVzID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbihUQUdfVFlQRVNfREVMSU1JVEVSKTsKLQkJCQl9Ci0KLQkJCQlNYXJrZXJUeXBlIG1hcmtlclR5cGUgPSBNYXJrZXJUeXBlc01vZGVsLmdldEluc3RhbmNlKCkuZ2V0VHlwZShpZCk7Ci0JCQkJaWYgKG1hcmtlclR5cGUgIT0gbnVsbCkgewotCQkJCQluZXdUeXBlcy5yZW1vdmUobWFya2VyVHlwZSk7Ci0KLQkJCQkJLy8gYWRkIHRoZSB0eXBlIHRvIHRoZSBzZWxlY3RlZCBsaXN0Ci0JCQkJCWlmICghU0VMRUNURURfRkFMU0UuZXF1YWxzKHN0YXR1cykKLQkJCQkJCQkmJiAhc2VsZWN0ZWRUeXBlcy5jb250YWlucyhtYXJrZXJUeXBlKSkgewotCQkJCQkJc2VsZWN0ZWRUeXBlcy5hZGQobWFya2VyVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGFueSB0eXBlcyB3ZSBrbm93IGFib3V0IHRoYXQgd2VyZW4ndCBlaXRoZXIgdHJ1ZSBvcgotCQkJLy8gZmFsc2UgaW4gdGhlIHNlbGVjdGlvbiBhdHRyaWJ1dGUgYXJlIG5ldy4gQnkgZGVmYXVsdCwKLQkJCS8vIG5ldyBtYXJrZXIgdHlwZXMgd2lsbCBiZSBzZWxlY3RlZD10cnVlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1R5cGVzLnNpemUoKTsgKytpKSB7Ci0JCQkJc2VsZWN0ZWRUeXBlcy5hZGQobmV3VHlwZXMuZ2V0KGkpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIHRoZSBzZXR0aW5ncyBkaWRuJ3QgY29udGFpbiB0aGUgbmV3IHNlbGVjdGlvbiBhdHRyaWJ1dGUKLQkJCS8vIHNvIGNoZWNrIGZvciB0aGUgb2xkIHNlbGVjdGlvbiBhdHRyaWJ1dGUuCi0JCQkvLyBmb3JtYXQgaXMganVzdCAiaWQ6IgotCQkJc2V0dGluZyA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19TRUxFQ1RFRF9UWVBFUyk7Ci0KLQkJCWlmIChzZXR0aW5nICE9IG51bGwpIHsKLQkJCQlnZW5lcmF0ZVNlbGVjdGVkVHlwZXMoc2V0dGluZyk7Ci0JCQl9Ci0KLQkJfQotCi0JCXNldHRpbmcgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfV09SS0lOR19TRVQpOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQlzZXRXb3JraW5nU2V0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2luZ1NldE1hbmFnZXIoKQotCQkJCQkuZ2V0V29ya2luZ1NldChzZXR0aW5nKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgZmlsdGVyIHNldHRpbmdzIGZvciB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHBhcmFtIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUZpbHRlclNldHRpbmdzKElNZW1lbnRvIHNldHRpbmdzKSB7Ci0KLQkJc2V0dGluZ3MucHV0U3RyaW5nKFRBR19FTkFCTEVELCBTdHJpbmcudmFsdWVPZihlbmFibGVkKSk7Ci0JCXNldHRpbmdzLnB1dEludGVnZXIoVEFHX09OX1JFU09VUkNFLCBvblJlc291cmNlKTsKLQotCQlTdHJpbmcgbWFya2VyVHlwZUlkcyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdCBpbmNsdWRlZFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhZGRBbGxTdWJUeXBlcyhpbmNsdWRlZFR5cGVzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZFR5cGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNYXJrZXJUeXBlIG1hcmtlclR5cGUgPSAoTWFya2VyVHlwZSkgaW5jbHVkZWRUeXBlcy5nZXQoaSk7Ci0JCQltYXJrZXJUeXBlSWRzICs9IG1hcmtlclR5cGUuZ2V0SWQoKSArIFRBR19UWVBFU19ERUxJTUlURVI7Ci0JCQlpZiAoc2VsZWN0ZWRUeXBlcy5jb250YWlucyhtYXJrZXJUeXBlKSkgewotCQkJCW1hcmtlclR5cGVJZHMgKz0gU0VMRUNURURfVFJVRSArIFRBR19UWVBFU19ERUxJTUlURVI7Ci0JCQl9IGVsc2UgewotCQkJCW1hcmtlclR5cGVJZHMgKz0gU0VMRUNURURfRkFMU0UgKyBUQUdfVFlQRVNfREVMSU1JVEVSOwotCQkJfQotCQl9Ci0KLQkJc2V0dGluZ3MucHV0U3RyaW5nKFRBR19TRUxFQ1RJT05fU1RBVFVTLCBtYXJrZXJUeXBlSWRzKTsKLQotCQlpZiAod29ya2luZ1NldCAhPSBudWxsKQotCQkJc2V0dGluZ3MucHV0U3RyaW5nKFRBR19XT1JLSU5HX1NFVCwgd29ya2luZ1NldC5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbmFtZSBvZiB0aGUgcmVjZWl2ZXIKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBhIGNsb25lIG9mIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIE1hcmtlckZpbHRlcgotCSAqIEB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTWFya2VyRmlsdGVyIG1ha2VDbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoTWFya2VyRmlsdGVyKSB0aGlzLmNsb25lKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzZWxlY3RlZCB0eXBlcy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0ZWRUeXBlcwotCSAqICAgICAgICAgICAgTGlzdCBvZiBNYXJrZXJUeXBlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVHlwZXMoTGlzdCBzZWxlY3RlZFR5cGVzKSB7Ci0JCXRoaXMuc2VsZWN0ZWRUeXBlcyA9IHNlbGVjdGVkVHlwZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZWM0YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWNsYXNzIE1hcmtlckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLSAgICBJRmllbGRbXSBwcm9wZXJ0aWVzOwotCi0gICAgcHVibGljIE1hcmtlckxhYmVsUHJvdmlkZXIoSUZpZWxkW10gcHJvcGVydGllcykgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIGlmIChlbGVtZW50ID09IG51bGwgfHwgIShlbGVtZW50IGluc3RhbmNlb2YgSU1hcmtlcikKLSAgICAgICAgICAgICAgICB8fCBwcm9wZXJ0aWVzID09IG51bGwgfHwgY29sdW1uSW5kZXggPj0gcHJvcGVydGllcy5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gcHJvcGVydGllc1tjb2x1bW5JbmRleF0uZ2V0SW1hZ2UoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWFya2VyKQotICAgICAgICAgICAgICAgIHx8IHByb3BlcnRpZXMgPT0gbnVsbCB8fCBjb2x1bW5JbmRleCA+PSBwcm9wZXJ0aWVzLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzW2NvbHVtbkluZGV4XS5nZXRWYWx1ZShlbGVtZW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYzM0YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBsaXN0IG9mIENvbmNyZXRlTWFya2Vycy4KLSAqLwotcHVibGljIGNsYXNzIE1hcmtlckxpc3QgewotCQotCXByaXZhdGUgaW50W10gbWFya2VyQ291bnRzID0gbnVsbDsKLQotCXByaXZhdGUgQ29uY3JldGVNYXJrZXJbXSBtYXJrZXJzOwotCi0JLyoqCi0JICogTGF6aWx5IGNyZWF0ZWQgbWFya2VyIHRhYmxlIC0gbWFwcyBJTWFya2VycyBvbnRvIENvbmNyZXRlTWFya2Vycy4gTnVsbCBpZgotCSAqIG5vdCBjcmVhdGVkCi0JICovCi0JcHJpdmF0ZSBNYXAgbWFya2VyVGFibGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluaXRpYWxseSBlbXB0eSBtYXJrZXIgbGlzdAotCSAqLwotCXB1YmxpYyBNYXJrZXJMaXN0KCkgewotCQl0aGlzKG5ldyBDb25jcmV0ZU1hcmtlclswXSk7Ci0JfQotCi0JcHVibGljIE1hcmtlckxpc3QoQ29sbGVjdGlvbiBtYXJrZXJzKSB7Ci0JCXRoaXMoKENvbmNyZXRlTWFya2VyW10pIG1hcmtlcnMudG9BcnJheShuZXcgQ29uY3JldGVNYXJrZXJbbWFya2VycwotCQkJCS5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3QgY29udGFpbmluZyB0aGUgZ2l2ZW4gc2V0IG9mIG1hcmtlcnMKLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VycwotCSAqLwotCXB1YmxpYyBNYXJrZXJMaXN0KENvbmNyZXRlTWFya2VyW10gbWFya2VycykgewotCQl0aGlzLm1hcmtlcnMgPSBtYXJrZXJzOwotCX0KLQotCS8qKgotCSAqIENsZWFycyBhbnkgY2FjaGVkIGNvbGxhdGlvbiBrZXlzLiBVc2UgdG8gZnJlZSB1cCBzb21lIG1lbW9yeSBpZiB0aGUKLQkgKiBtYXJrZXJzIGluIHRoaXMgbGlzdCB3b24ndCBiZSBzb3J0ZWQgZm9yIGF3aGlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbmNyZXRlTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0KLQkJCW1hcmtlci5jbGVhckNhY2hlKCk7Ci0JCX0KLQotCQltYXJrZXJUYWJsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFya2VyIHRhYmxlIG9yIGxhemlseSBjcmVhdGVzIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0Ci0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBJTWFya2VyIG9udG8gQ29uY3JldGVNYXJrZXIsIGNvbnRhaW5pbmcgYWxsIHRoZQotCSAqICAgICAgICAgQ29uY3JldGVNYXJrZXJzIGluIHRoZSBsaXN0Ci0JICovCi0JcHJpdmF0ZSBNYXAgZ2V0TWFya2VyTWFwKCkgewotCQlpZiAobWFya2VyVGFibGUgPT0gbnVsbCkgewotCQkJbWFya2VyVGFibGUgPSBuZXcgSGFzaE1hcCgpOwotCi0JCQlmb3IgKGludCBpZHggPSAwOyBpZHggPCBtYXJrZXJzLmxlbmd0aDsgaWR4KyspIHsKLQkJCQlDb25jcmV0ZU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2lkeF07Ci0JCQkJbWFya2VyVGFibGUucHV0KG1hcmtlci5nZXRNYXJrZXIoKSwgbWFya2VyKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtYXJrZXJUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGV4aXN0aW5nIG1hcmtlciBmcm9tIHRoZSBsaXN0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGdpdmVuIElNYXJrZXIKLQkgKiAKLQkgKiBAcGFyYW0gdG9GaW5kCi0JICogICAgICAgICAgICB0aGUgSU1hcmtlciB0byBsb29rdXAgaW4gdGhlIGxpc3QKLQkgKiBAcmV0dXJuIHRoZSBDb25jcmV0ZU1hcmtlciB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBJTWFya2VyCi0JICovCi0JcHVibGljIENvbmNyZXRlTWFya2VyIGdldE1hcmtlcihJTWFya2VyIHRvRmluZCkgewotCQlyZXR1cm4gKENvbmNyZXRlTWFya2VyKSBnZXRNYXJrZXJNYXAoKS5nZXQodG9GaW5kKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIElNYXJrZXJzIGNvbnRhaW5lZCBpbiB0aGUgcmVjZWl2ZXIuCi0JICogQHJldHVybiBJTWFya2VyW10KLQkgKi8KLQlwdWJsaWMgSU1hcmtlcltdIGdldElNYXJrZXJzKCl7Ci0JCUlNYXJrZXJbXSBpTWFya2VycyA9IG5ldyBJTWFya2VyW21hcmtlcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpTWFya2Vyc1tpXSA9IG1hcmtlcnNbaV0uZ2V0TWFya2VyKCk7CQkJCi0JCX0KLQkJcmV0dXJuIGlNYXJrZXJzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29uY3JldGVNYXJrZXIgY3JlYXRlTWFya2VyKElNYXJrZXIgbWFya2VyKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobWFya2VyLmlzU3VidHlwZU9mKElNYXJrZXIuVEFTSykpIHsKLQkJCXJldHVybiBuZXcgVGFza01hcmtlcihtYXJrZXIpOwotCQl9IGVsc2UgaWYgKG1hcmtlci5pc1N1YnR5cGVPZihJTWFya2VyLkJPT0tNQVJLKSkgewotCQkJcmV0dXJuIG5ldyBCb29rbWFya01hcmtlcihtYXJrZXIpOwotCQl9IGVsc2UgaWYgKG1hcmtlci5pc1N1YnR5cGVPZihJTWFya2VyLlBST0JMRU0pKSB7Ci0JCQlyZXR1cm4gbmV3IFByb2JsZW1NYXJrZXIobWFya2VyKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbmV3IENvbmNyZXRlTWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJZm9yIChpbnQgbWFya2VySWR4ID0gMDsgbWFya2VySWR4IDwgbWFya2Vycy5sZW5ndGg7IG1hcmtlcklkeCsrKSB7Ci0JCQlDb25jcmV0ZU1hcmtlciBuZXh0ID0gbWFya2Vyc1ttYXJrZXJJZHhdOwotCQkJbmV4dC5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBhc0xpc3QoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KG1hcmtlcnMpOwotCX0KLQotCXB1YmxpYyBNYXJrZXJMaXN0IGZpbmRNYXJrZXJzKENvbGxlY3Rpb24gb2ZJTWFya2VyKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChvZklNYXJrZXIuc2l6ZSgpKTsKLQotCQlJdGVyYXRvciBpdGVyID0gb2ZJTWFya2VyLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSU1hcmtlciBuZXh0ID0gKElNYXJrZXIpIGl0ZXIubmV4dCgpOwotCi0JCQlDb25jcmV0ZU1hcmtlciBtYXJrZXIgPSBnZXRNYXJrZXIobmV4dCk7Ci0JCQlpZiAobWFya2VyICE9IG51bGwpIHsKLQkJCQlyZXN1bHQuYWRkKG1hcmtlcik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3IE1hcmtlckxpc3QocmVzdWx0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbmNyZXRlTWFya2VyW10gY3JlYXRlTWFya2VycyhJTWFya2VyW10gc291cmNlKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDb25jcmV0ZU1hcmtlcltdIHJlc3VsdCA9IG5ldyBDb25jcmV0ZU1hcmtlcltzb3VyY2UubGVuZ3RoXTsKLQotCQlmb3IgKGludCBpZHggPSAwOyBpZHggPCBzb3VyY2UubGVuZ3RoOyBpZHgrKykgewotCQkJcmVzdWx0W2lkeF0gPSBjcmVhdGVNYXJrZXIoc291cmNlW2lkeF0pOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgc2V0IG9mIG1hcmtlcnMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gZmlsdGVyCi0JICogCi0JICogQHBhcmFtIGZpbHRlcnMKLQkgKiAgICAgICAgICAgIHRoZSBmaWx0ZXJzIHRvIGFwcGx5Ci0JICogQHBhcmFtIG1vbgotCSAqICAgICAgICAgICAgdGhlIG1vbml0b3IgdG8gdXBkYXRlCi0JICogQHBhcmFtIGlnbm9yZUV4Y2VwdGlvbnMKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgb3Igbm90IGV4Y2VwdGlvbiB3aWxsIGJlIHNob3duCi0JICogQHJldHVybiBNYXJrZXJMaXN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXJrZXJMaXN0IGNvbXB1dGUoTWFya2VyRmlsdGVyW10gZmlsdGVycywKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uLCBib29sZWFuIGlnbm9yZUV4Y2VwdGlvbnMpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQ29sbGVjdGlvbiByZXR1cm5NYXJrZXJzID0gbmV3IEhhc2hTZXQoKTsvLyBhdm9pZCBkdXBsaWNhdGVzCi0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXR1cm5NYXJrZXJzLmFkZEFsbChmaWx0ZXJzW2ldLmZpbmRNYXJrZXJzKG1vbiwgaWdub3JlRXhjZXB0aW9ucykpOwotCQl9Ci0JCXJldHVybiBuZXcgTWFya2VyTGlzdChyZXR1cm5NYXJrZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IE1hcmtlckxpc3QgY29udGFpbmluZyBhbGwgbWFya2VycyBpbiB0aGUgd29ya3NwYWNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCB0eXBlcwotCSAqIAotCSAqIEBwYXJhbSB0eXBlcwotCSAqIEByZXR1cm4gSU1hcmtlcltdCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWFya2VyW10gY29tcHV0ZShTdHJpbmdbXSB0eXBlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlSZXNvdXJjZSBpbnB1dCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJSU1hcmtlcltdIG5ld01hcmtlcnMgPSBpbnB1dC5maW5kTWFya2Vycyh0eXBlc1tpXSwgdHJ1ZSwKLQkJCQkJSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXdNYXJrZXJzKSk7Ci0JCX0KLQotCQlyZXR1cm4gKElNYXJrZXJbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElNYXJrZXJbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcmtlcnMgaW4gdGhlIGxpc3QuIFJlYWQtb25seS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1hcmtlcnMgaW4gdGhlIGxpc3QKLQkgKi8KLQlwdWJsaWMgQ29uY3JldGVNYXJrZXJbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gbWFya2VyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXJrZXJzIGluIHRoaXMgbGlzdC4gUmVhZC1vbmx5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1hcmtlcnMgaW4gdGhlIGxpc3QKLQkgKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNYXJrZXJzKCkgewotCS8vIHJldHVybiBtYXJrZXJzOwotCS8vIH0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGxpc3QKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMKLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1Db3VudCgpIHsKLQkJcmV0dXJuIG1hcmtlcnMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlcnJvciBtYXJrZXJzIGluIHRoZSBsaXN0Ci0JICogCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVycm9ycwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JzKCkgewotCQlyZXR1cm4gZ2V0TWFya2VyQ291bnRzKClbSU1hcmtlci5TRVZFUklUWV9FUlJPUl07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGluZm8gbWFya2VycyBpbiB0aGUgbGlzdAotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpbmZvIG1hcmtlcnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZm9zKCkgewotCQlyZXR1cm4gZ2V0TWFya2VyQ291bnRzKClbSU1hcmtlci5TRVZFUklUWV9JTkZPXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2FybmluZyBtYXJrZXJzIGluIHRoZSBsaXN0Ci0JICogCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHdhcm5pbmcgbWFya2VycwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2FybmluZ3MoKSB7Ci0JCXJldHVybiBnZXRNYXJrZXJDb3VudHMoKVtJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkddOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgbWFya2VyIGNvdW50cyB3aGVyZSBnZXRNYXJrZXJDb3VudHMoKVtzZXZlcml0eV0gaXMKLQkgKiB0aGUgbnVtYmVyIG9mIG1hcmtlcnMgaW4gdGhlIGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtYXJrZXIgY291bnRzCi0JICovCi0JcHJpdmF0ZSBpbnRbXSBnZXRNYXJrZXJDb3VudHMoKSB7Ci0JCWlmIChtYXJrZXJDb3VudHMgPT0gbnVsbCkgewotCQkJbWFya2VyQ291bnRzID0gbmV3IGludFtdIHsgMCwgMCwgMCB9OwotCi0JCQlmb3IgKGludCBpZHggPSAwOyBpZHggPCBtYXJrZXJzLmxlbmd0aDsgaWR4KyspIHsKLQkJCQlDb25jcmV0ZU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2lkeF07Ci0KLQkJCQlpZiAobWFya2VyIGluc3RhbmNlb2YgUHJvYmxlbU1hcmtlcikgewotCQkJCQlpbnQgc2V2ZXJpdHkgPSAoKFByb2JsZW1NYXJrZXIpIG1hcmtlcnNbaWR4XSkuZ2V0U2V2ZXJpdHkoKTsKLQkJCQkJaWYgKHNldmVyaXR5ID49IDAgJiYgc2V2ZXJpdHkgPD0gMikgewotCQkJCQkJbWFya2VyQ291bnRzW3NldmVyaXR5XSsrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hcmtlckNvdW50czsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGFycmF5IHRoYXQgaXMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXJrZXIgbGlzdAotCSAqIHdpdGhvdXQgbWFraW5nIGEgY29weS4KLQkgKiAKLQkgKiBAcmV0dXJuIE9iamVjdFtdCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEFycmF5KCkgewotCQlyZXR1cm4gbWFya2VyczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNpemUgb2YgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gZ2V0QXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXJrZXJzIGF0IGluZGV4Ci0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHJldHVybiBDb25jcmV0ZU1hcmtlcgotCSAqLwotCXB1YmxpYyBDb25jcmV0ZU1hcmtlciBnZXRNYXJrZXIoaW50IGluZGV4KSB7Ci0JCXJldHVybiBtYXJrZXJzW2luZGV4XTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGFkZGVkTWFya2VycyB0byB0aGUgcmVjZWl2ZXIuCi0JICogQHBhcmFtIGFkZGVkTWFya2VycyBDb2xsZWN0aW9uIG9mIENvbmNyZXRlTWFya2VyCi0JICogQHBhcmFtIHJlbW92ZWRNYXJrZXJzIENvbGxlY3Rpb24gb2YgQ29uY3JldGVNYXJrZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNYXJrZXJzKENvbGxlY3Rpb24gYWRkZWRNYXJrZXJzLENvbGxlY3Rpb24gcmVtb3ZlZE1hcmtlcnMpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChhc0xpc3QoKSk7Ci0JCWxpc3QuYWRkQWxsKGFkZGVkTWFya2Vycyk7CQkKLQkJbGlzdC5yZW1vdmVBbGwocmVtb3ZlZE1hcmtlcnMpOwkKLQkJbWFya2VycyA9IG5ldyBDb25jcmV0ZU1hcmtlcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShtYXJrZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVmcmVzaCBhbGwgb2YgdGhlIG1hcmtlcnMgaW4gdGhlIHJlY2VpdmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hBbGwoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJbWFya2Vyc1tpXS5yZWZyZXNoKCk7Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIENsZWFyIGFsbCBvZiB0aGUgZ3JvdXAgc2V0dGluZ3MgaW4gdGhlIHJlY2VpdmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyR3JvdXBzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCW1hcmtlcnNbaV0uc2V0R3JvdXAobnVsbCk7Ci0JCX0KLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL01hcmtlck1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2I5ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBNYXJrZXJNZXNzYWdlcyBpcyB0aGUgY2xhc3MgdGhhdCBoYW5kbGVzIHRoZSBtZXNzYWdlcyBmb3IgdGhlIG1hcmtlcnMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWFya2VyTWVzc2FnZXMgZXh0ZW5kcyBOTFN7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FPSAib3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNYXJrZXJNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzb3J0QWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcnNBY3Rpb25fdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0FjdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcnNTdWJNZW51X3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc29ydERpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzb3J0RGlhbG9nX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNvcnREaWFsb2dfY29sdW1uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzb3J0RGlyZWN0aW9uQXNjZW5kaW5nX3RleHQgOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNvcnREaXJlY3Rpb25Bc2NlbmRpbmdfdGV4dDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc29ydERpcmVjdGlvbkFzY2VuZGluZ190ZXh0MzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzb3J0RGlyZWN0aW9uQXNjZW5kaW5nX3RleHQ0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc29ydERpcmVjdGlvbkRlc2NlbmRpbmdfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzb3J0RGlyZWN0aW9uRGVzY2VuZGluZ190ZXh0MjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzb3J0RGlyZWN0aW9uRGVzY2VuZGluZ190ZXh0MzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzb3J0RGlyZWN0aW9uRGVzY2VuZGluZ190ZXh0NDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3RvcmVEZWZhdWx0c190ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVua25vd247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5IZWFkZXJfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5IZWFkZXJfbG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uSGVhZGVyX2xpbmVOdW1iZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uSGVhZGVyX2NoYXJTdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5IZWFkZXJfY2hhckVuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5IZWFkZXJfdHJhbnNpZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtbkhlYWRlcl91c2VyRWRpdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uSGVhZGVyX3NldmVyaXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtbkhlYWRlcl9wcmlvcml0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5IZWFkZXJfZG9uZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25fcmVzb3VyY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25fZm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uX2xpbmVOdW1iZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25fY3JlYXRpb25UaW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uX3ByaW9yaXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uX2NvbXBsZXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25fbWFya2VySWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25fc3ViY2F0ZWdvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25fY2F0ZWdvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25fdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmlwdGlvbl9wcm9qZWN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGFiZWxfbGluZU51bWJlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5BY3Rpb25fdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUFjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXN0ZUFjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVBY3Rpb25fdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQWN0aW9uX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0QWxsQWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb3BlcnRpZXNBY3Rpb25fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJzRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcnNEaWFsb2dfb25PZmY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0RpYWxvZ19saW1pdFZpc2libGVNYXJrZXJzVG87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0RpYWxvZ19zaG93SXRlbXNPZlR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0RpYWxvZ19hbnlSZXNvdXJjZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJzRGlhbG9nX2FueVJlc291cmNlSW5TYW1lUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJzRGlhbG9nX3NlbGVjdGVkUmVzb3VyY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0RpYWxvZ19zZWxlY3RlZEFuZENoaWxkcmVuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcnNEaWFsb2dfd29ya2luZ1NldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJzRGlhbG9nX3dvcmtpbmdTZXRTZWxlY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0RpYWxvZ19ub1dvcmtpbmdTZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0RpYWxvZ19zZWxlY3RBbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0RpYWxvZ19kZXNlbGVjdEFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJzRGlhbG9nX3R5cGVfY29sdW1uSGVhZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcnNEaWFsb2dfc3VwZXJUeXBlY29sdW1uSGVhZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcnNEaWFsb2dfdGl0bGVNYXJrZXJMaW1pdEludmFsaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0RpYWxvZ19tZXNzYWdlTWFya2VyTGltaXRJbnZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcnNEaWFsb2dfZGVzY3JpcHRpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJzRGlhbG9nX2NvbnRhaW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcnNEaWFsb2dfZG9lc05vdENvbnRhaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0RpYWxvZ19zZXZlcml0eUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcnNEaWFsb2dfc2V2ZXJpdHlFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJzRGlhbG9nX3NldmVyaXR5V2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJzRGlhbG9nX3NldmVyaXR5SW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJzRGlhbG9nX3ByaW9yaXR5TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0RpYWxvZ19wcmlvcml0eUhpZ2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0RpYWxvZ19wcmlvcml0eU5vcm1hbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJzRGlhbG9nX3ByaW9yaXR5TG93OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcnNEaWFsb2dfc3RhdHVzTGFiZWw7IAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcnNEaWFsb2dfc3RhdHVzQ29tcGxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyc0RpYWxvZ19zdGF0dXNJbmNvbXBsZXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvcGVydGllc0RpYWxvZ19jcmVhdGlvblRpbWVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9wZXJ0aWVzRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvcGVydGllc0RpYWxvZ19mb2xkZXJfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9wZXJ0aWVzRGlhbG9nX2xvY2F0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvcGVydGllc0RpYWxvZ19yZXNvdXJjZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb3BlcnRpZXNEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvcGVydGllc0RpYWxvZ19zZXZlcml0eUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb3BlcnRpZXNEaWFsb2dfZXJyb3JMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9wZXJ0aWVzRGlhbG9nX3dhcm5pbmdMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9wZXJ0aWVzRGlhbG9nX2luZm9MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9wZXJ0aWVzRGlhbG9nX25vc2V2ZXJpdHlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9wZXJ0aWVzRGlhbG9nX3ByaW9yaXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb3BlcnRpZXNEaWFsb2dfcHJpb3JpdHlIaWdoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb3BlcnRpZXNEaWFsb2dfcHJpb3JpdHlOb3JtYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvcGVydGllc0RpYWxvZ19wcmlvcml0eUxvdzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9wZXJ0aWVzRGlhbG9nX2NvbXBsZXRlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hcmtlckxpbWl0RXhjZWVkZWRfdGl0bGU7Ci0JCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcl9tYXRjaGVkTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJfaXRlbXNNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2JsZW1fZmlsdGVyX21hdGNoZWRNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1vZGlmeWluZ0Jvb2ttYXJrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTW9kaWZ5aW5nVGFzazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2JsZW1TZXZlcml0eV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9ibGVtX3N0YXR1c1N1bW1hcnlCcmVha2Rvd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFya2VyX3N0YXR1c1N1bW1hcnlTZWxlY3RlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUNvbXBsZXRlZEFjdGlvbl90aXRsZTsKLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFya0NvbXBsZXRlZEFjdGlvbl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVNYXJrZXJBY3Rpb25fdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZU1hcmtlckFjdGlvbl9kaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlTWFya2VyQWN0aW9uX25vUmVzb2x1dGlvbnNMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlTWFya2VyQWN0aW9uX2NvbXB1dGF0aW9uQWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQ29tcGxldGVkVGFza3NfZGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQ29tcGxldGVkVGFza3Nfbm9uZUNvbXBsZXRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVDb21wbGV0ZWRUYXNrc19wZXJtYW5lbnRQbHVyYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQ29tcGxldGVkVGFza3NfcGVybWFuZW50U2luZ3VsYXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQ29tcGxldGVkVGFza3NfZXJyb3JNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkR2xvYmFsVGFza0FjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRHbG9iYWxUYXNrQWN0aW9uX3Rvb2x0aXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRHbG9iYWxUYXNrRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGxldGlvbl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmlvcml0eV9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW9yaXR5X2hpZ2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJpb3JpdHlfbm9ybWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW9yaXR5X2xvdzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlUb0NsaXBib2FyZFByb2JsZW1EaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weVRvQ2xpcGJvYXJkUHJvYmxlbURpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyTGlzdF8wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVDb250ZW50UHJvdmlkZXJfVGFibGVTeW5jaHJvbml6YXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVDb250ZW50UHJvdmlkZXJfVXBkYXRpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJGaWx0ZXJfc2VhcmNoaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclZpZXdfcmVmcmVzaFByb2dyZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclZpZXdfcmVmcmVzaFRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyVmlld193YWl0aW5nX29uX2NoYW5nZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyVmlld19zZWFyY2hpbmdfZm9yX21hcmtlcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyVmlld19yZWZyZXNoaW5nX2NvdW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJWaWV3X3F1ZXVlaW5nX3VwZGF0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyVmlld19wcm9jZXNzVXBkYXRlczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZlcnJlZFF1ZXVlX3NldHRpbmdfY29udGVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmZXJyZWRRdWV1ZV9lbnF1ZXVlaW5nX2l0ZW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclZpZXdfMTg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyVmlld18xOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0VXRpbF9maW5kaW5nX2ZpcnN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRVdGlsX3BhcnRpdGlvbmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNbmVtb25pY0Fzc2lnbmVyX3ZhbGlkX21uZW1vbmljczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNbmVtb25pY0Fzc2lnbmVyX21pc3NpbmdfbW5lbW9uaWNfZm9ybWF0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NYXJrZXJfZXJyb3JUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXN0ZU1hcmtlcl9lcnJvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZU1hcmtlcl9lcnJvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyRmlsdGVyX2RlZmF1bHRGaWx0ZXJOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlckZpbHRlcl9uZXdGaWx0ZXJOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlckZpbHRlcl9maWx0ZXJzVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyRmlsdGVyX2FkZEZpbHRlck5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyRmlsdGVyX2RlbGV0ZVNlbGVjdGVkTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlckZpbHRlckRpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJGaWx0ZXJEaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJGaWx0ZXJEaWFsb2dfZW1wdHlNZXNzYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoZWNrZWRUYWJsZVNlbGVjdGlvbkRpYWxvZ19lbXB0eUxpc3RNZXNzYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlckZpbHRlckRpYWxvZ19lcnJvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlckZpbHRlckRpYWxvZ19mYWlsZWRGaWx0ZXJNZXNzYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclByZWZlcmVuY2VzX0RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclByZWZlcmVuY2VzX01hcmtlckxpbWl0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJQcmVmZXJlbmNlc19WaXNpYmxlSXRlbXM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvYmxlbUZpbHRlckRpYWxvZ19TeXN0ZW1fRmlsdGVyc19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ibGVtRmlsdGVyRGlhbG9nX0FsbF9Qcm9ibGVtczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ibGVtRmlsdGVyRGlhbG9nX1NlbGVjdGVkX1R5cGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2JsZW1GaWx0ZXJEaWFsb2dfSW5mb19TZXZlcml0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ibGVtRmlsdGVyRGlhbG9nX1dhcm5pbmdfU2V2ZXJpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvYmxlbUZpbHRlckRpYWxvZ19FcnJvcl9TZXZlcml0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ibGVtRmlsdGVyRGlhbG9nX0NvbnRhaW5zX0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2JsZW1GaWx0ZXJEaWFsb2dfRG9lc19Ob3RfQ29udGFpbl9EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ibGVtRmlsdGVyRGlhbG9nX2FueTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ibGVtRmlsdGVyRGlhbG9nX3NhbWVDb250YWluZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvYmxlbUZpbHRlckRpYWxvZ19zZWxlY3RlZEFuZENoaWxkcmVuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2JsZW1GaWx0ZXJEaWFsb2dfc2VsZWN0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvYmxlbUZpbHRlckRpYWxvZ193b3JraW5nU2V0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2JsZW1GaWx0ZXJSZWdpc3RyeV9udWxsVHlwZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWVsZE1lc3NhZ2VfTnVsbE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmllbGRDYXRlZ29yeV9VbmNhdGVnb3JpemVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpZWxkTWVzc2FnZV9Xcm9uZ1R5cGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aW9uUmVzb2x2ZU1hcmtlcl9DYWxjdWxhdGluZ0pvYjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpb25SZXNvbHZlTWFya2VyX09wZW5XaXphcmRKb2I7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19GaXhpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJSZXNvbHV0aW9uRGlhbG9nX1Byb2JsZW1zX0xpc3RfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19SZXNvbHV0aW9uc19MaXN0X1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclJlc29sdXRpb25EaWFsb2dfTm9NYXRjaE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19DYW5ub3RGaXhUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJSZXNvbHV0aW9uRGlhbG9nX0Nhbm5vdEZpeE1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJSZXNvbHV0aW9uRGlhbG9nX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclJlc29sdXRpb25EaWFsb2dfQ2FsY3VsYXRpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclJlc29sdXRpb25EaWFsb2dfV29ya2luZ1N1YlRhc2s7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19BZGRPdGhlcnM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvYmxlbVZpZXdfR3JvdXBCeU1lbnU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvYmxlbVZpZXdfU2V2ZXJpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvYmxlbVZpZXdfQ2F0ZWdvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvYmxlbVZpZXdfTm9uZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVdGlsX1dvcmtzcGFjZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXRpbF9Qcm9qZWN0Um9vdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVdGlsX1dvcmtzcGFjZVJvb3Q7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTIxZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotLyoqCi0gKiBUaGUgTWFya2VyTm9kZSBjbGFzcyBpcyB0aGUgY2xhc3MgdGhhdCBoYW5kbGVzIGNhdGVnb3J5IG5vZGVzIGFuZCAKLSAqIGNvbmNyZXRlIG1hcmtlcnMuCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFya2VyTm9kZSB7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgotCSAqIEByZXR1cm4gTWFya2VyTm9kZVtdCi0JICovCi0JcHVibGljIGFic3RyYWN0IE1hcmtlck5vZGVbXSBnZXRDaGlsZHJlbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXJlbnQgbm9kZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzIGEgdG9wCi0JICogbGV2ZWwgZWxlbWVudC4KLQkgKiBAcmV0dXJuIE1hcmtlck5vZGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgTWFya2VyTm9kZSBnZXRQYXJlbnQoKSA7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhpcyBpcyBhIGNvbmNyZXRlIG5vZGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NvbmNyZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWNlaXZlci4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSA7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL01hcmtlck5vZGVSZWZyZXNoUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJOb2RlUmVmcmVzaFJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjZiZTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL01hcmtlck5vZGVSZWZyZXNoUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1jbGFzcyBNYXJrZXJOb2RlUmVmcmVzaFJlY29yZHsKLQlDb2xsZWN0aW9uIHJlbW92ZWRNYXJrZXJzOwotCUNvbGxlY3Rpb24gYWRkZWRNYXJrZXJzOwotCUNvbGxlY3Rpb24gY2hhbmdlZE1hcmtlcnM7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciB3aXRoIHRoZSBzdXBwbGllZCBtYXJrZXJzLgotCSAqIEBwYXJhbSByZW1vdmVkCi0JICogQHBhcmFtIGFkZGVkCi0JICogQHBhcmFtIGNoYW5nZWQKLQkgKi8KLQlNYXJrZXJOb2RlUmVmcmVzaFJlY29yZChDb2xsZWN0aW9uIHJlbW92ZWQsIENvbGxlY3Rpb24gYWRkZWQsIENvbGxlY3Rpb24gY2hhbmdlZCl7Ci0JCXJlbW92ZWRNYXJrZXJzID0gbmV3IEFycmF5TGlzdChyZW1vdmVkKTsKLQkJYWRkZWRNYXJrZXJzID0gIG5ldyBBcnJheUxpc3QoYWRkZWQpOwotCQljaGFuZ2VkTWFya2VycyA9ICBuZXcgQXJyYXlMaXN0KGNoYW5nZWQpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbm9kZSB0byB0aGUgbGlzdCBvZiByZW1vdmFscy4KLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShNYXJrZXJOb2RlIG5vZGUpIHsKLQkJcmVtb3ZlZE1hcmtlcnMuYWRkKG5vZGUpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSBub2RlIHRvIHRoZSBsaXN0IG9mIGFkZHMuCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoTWFya2VyTm9kZSBub2RlKSB7Ci0JCWFkZGVkTWFya2Vycy5hZGQobm9kZSk7Ci0JCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJSZXNvbHV0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJSZXNvbHV0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNmU1Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyUmVzb2x1dGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbjsKLQotLyoqCi0gKiBUaGUgTWFya2VyUmVzb2x1dGlvbkRpYWxvZyBpcyB0aGUgZGlhbG9nIHVzZWQgdG8gc2VsZWN0IGEgbWFya2VyIHJlc29sdXRpb24uCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWFya2VyUmVzb2x1dGlvbkRpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZyB7Ci0KLQlwcml2YXRlIElNYXJrZXIgb3JpZ2luYWxNYXJrZXI7Ci0KLQlwcml2YXRlIElNYXJrZXJSZXNvbHV0aW9uW10gcmVzb2x1dGlvbnM7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgbWFya2Vyc1RhYmxlOwotCi0JcHJpdmF0ZSBMaXN0Vmlld2VyIHJlc29sdXRpb25zTGlzdDsKLQotCXByaXZhdGUgUHJvZ3Jlc3NNb25pdG9yUGFydCBwcm9ncmVzc1BhcnQ7Ci0KLQlwcml2YXRlIE1hcmtlclZpZXcgbWFya2VyVmlldzsKLQotCXByaXZhdGUgVmlld2VyU29ydGVyIHJlc29sdXRpb25zU29ydGVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhbGN1bGF0aW5nUmVzb2x1dGlvbnM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJvZ3Jlc3NDYW5jZWxsZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgQnV0dG9uIGFkZE1hdGNoaW5nOwotCi0JcHJpdmF0ZSBIYXNodGFibGUgbWFya2VyTWFwID0gbmV3IEhhc2h0YWJsZSgwKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgZ2l2ZW4gcmVzb2x1dGlvbnMuCi0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogQHBhcmFtIG1hcmtlcgotCSAqICAgICAgICAgICAgdGhlIG1hcmtlciB0byBzaG93Ci0JICogQHBhcmFtIG5ld1Jlc29sdXRpb25zCi0JICogQHBhcmFtIHZpZXcKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgdGhhdCBpcyBzaG93aW5nIHRoZXNlIGVycm9ycwotCSAqLwotCXB1YmxpYyBNYXJrZXJSZXNvbHV0aW9uRGlhbG9nKFNoZWxsIHNoZWxsLCBJTWFya2VyIG1hcmtlciwKLQkJCUlNYXJrZXJSZXNvbHV0aW9uW10gbmV3UmVzb2x1dGlvbnMsIE1hcmtlclZpZXcgdmlldykgewotCQlzdXBlcihzaGVsbCk7Ci0JCWluaXRpYWxpemVSZXNvbHV0aW9uc1NvcnRlcigpOwotCQlyZXNvbHV0aW9uc1NvcnRlci5zb3J0KHZpZXcuZ2V0Vmlld2VyKCksIG5ld1Jlc29sdXRpb25zKTsKLQkJcmVzb2x1dGlvbnMgPSBuZXdSZXNvbHV0aW9uczsKLQkJb3JpZ2luYWxNYXJrZXIgPSBtYXJrZXI7Ci0JCW1hcmtlclZpZXcgPSB2aWV3OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoTWFya2VyTWVzc2FnZXMucmVzb2x2ZU1hcmtlckFjdGlvbl9kaWFsb2dUaXRsZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIG1haW5BcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBhIG5ldyBjb21wb3NpdGUgYXMgdGhlcmUgaXMgdGhlIHRpdGxlIGJhciBzZXBlcmF0b3IKLQkJLy8gdG8gZGVhbCB3aXRoCi0JCUNvbXBvc2l0ZSBjb250cm9sID0gbmV3IENvbXBvc2l0ZShtYWluQXJlYSwgU1dULk5PTkUpOwotCQljb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCi0JCUZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9NQVJHSU47Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9NQVJHSU47Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IElEaWFsb2dDb25zdGFudHMuQlVUVE9OX01BUkdJTjsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IElEaWFsb2dDb25zdGFudHMuQlVUVE9OX01BUkdJTjsKLQkJbGF5b3V0LnNwYWNpbmcgPSBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9NQVJHSU47Ci0JCWNvbnRyb2wuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbnRyb2wpOwotCi0JCUxhYmVsIHJlc29sdXRpb25zTGFiZWwgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULk5PTkUpOwotCQlyZXNvbHV0aW9uc0xhYmVsCi0JCQkJLnNldFRleHQoTWFya2VyTWVzc2FnZXMuTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19SZXNvbHV0aW9uc19MaXN0X1RpdGxlKTsKLQotCQlGb3JtRGF0YSByZXNvbHV0aW9uc0xhYmVsRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlyZXNvbHV0aW9uc0xhYmVsRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCXJlc29sdXRpb25zTGFiZWxEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCXJlc29sdXRpb25zTGFiZWwuc2V0TGF5b3V0RGF0YShyZXNvbHV0aW9uc0xhYmVsRGF0YSk7Ci0KLQkJcmVzb2x1dGlvbnNMaXN0ID0gbmV3IExpc3RWaWV3ZXIoY29udHJvbCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCQlyZXNvbHV0aW9uc0xpc3Quc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHJlc29sdXRpb25zOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCi0JCQkJCU9iamVjdCBuZXdJbnB1dCkgewotCi0JCQl9Ci0JCX0pOwotCi0JCXJlc29sdXRpb25zTGlzdC5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSU1hcmtlclJlc29sdXRpb24pIGVsZW1lbnQpLmdldExhYmVsKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJlc29sdXRpb25zTGlzdAotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJc2V0Q29tcGxldGUoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0JCQkJCQlhZGRNYXRjaGluZwotCQkJCQkJCQkuc2V0RW5hYmxlZChnZXRTZWxlY3RlZFdvcmtiZW5jaFJlc29sdXRpb24oKSAhPSBudWxsKTsKLQkJCQkJCW1hcmtlcnNUYWJsZS5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlyZXNvbHV0aW9uc0xpc3Quc2V0SW5wdXQodGhpcyk7Ci0KLQkJcmVzb2x1dGlvbnNMaXN0LnNldFNvcnRlcihyZXNvbHV0aW9uc1NvcnRlcik7Ci0KLQkJRm9ybURhdGEgbGlzdERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJbGlzdERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHJlc29sdXRpb25zTGFiZWwsIDApOwotCQlsaXN0RGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQlsaXN0RGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlsaXN0RGF0YS5oZWlnaHQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDEwKTsKLQkJcmVzb2x1dGlvbnNMaXN0LmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGxpc3REYXRhKTsKLQotCQlMYWJlbCB0aXRsZSA9IG5ldyBMYWJlbChjb250cm9sLCBTV1QuTk9ORSk7Ci0JCXRpdGxlCi0JCQkJLnNldFRleHQoTWFya2VyTWVzc2FnZXMuTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19Qcm9ibGVtc19MaXN0X1RpdGxlKTsKLQkJRm9ybURhdGEgbGFiZWxEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWxhYmVsRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmVzb2x1dGlvbnNMaXN0LmdldENvbnRyb2woKSwgMCk7Ci0JCWxhYmVsRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQl0aXRsZS5zZXRMYXlvdXREYXRhKGxhYmVsRGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBjcmVhdGVUYWJsZUJ1dHRvbnMoY29udHJvbCk7Ci0JCUZvcm1EYXRhIGJ1dHRvbkRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJYnV0dG9uRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGl0bGUsIDApOwotCQlidXR0b25EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWJ1dHRvbkRhdGEuaGVpZ2h0ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0RGF0YShidXR0b25EYXRhKTsKLQotCQljcmVhdGVNYXJrZXJUYWJsZShjb250cm9sKTsKLQotCQlGb3JtRGF0YSB0YWJsZURhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJdGFibGVEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChidXR0b25zLCAwLCBTV1QuVE9QKTsKLQkJdGFibGVEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCXRhYmxlRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChidXR0b25zLCAwKTsKLQkJdGFibGVEYXRhLmhlaWdodCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMTApOwotCQltYXJrZXJzVGFibGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEodGFibGVEYXRhKTsKLQotCQlwcm9ncmVzc1BhcnQgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yUGFydChjb250cm9sLCBuZXcgR3JpZExheW91dCgpKTsKLQotCQlGb3JtRGF0YSBwcm9ncmVzc0RhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJcHJvZ3Jlc3NEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChtYXJrZXJzVGFibGUuZ2V0Q29udHJvbCgpLCAwKTsKLQkJcHJvZ3Jlc3NEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCXByb2dyZXNzRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlwcm9ncmVzc1BhcnQuc2V0TGF5b3V0RGF0YShwcm9ncmVzc0RhdGEpOwotCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29udHJvbCk7Ci0JCW1hcmtlclZpZXcuZ2V0VHJlZSgpOwotCi0JCXNldE1lc3NhZ2UoTkxTLmJpbmQoTWFya2VyTWVzc2FnZXMuTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19EZXNjcmlwdGlvbiwKLQkJCQlVdGlsLmdldFByb3BlcnR5KElNYXJrZXIuTUVTU0FHRSwgb3JpZ2luYWxNYXJrZXIpKSk7Ci0JCXJldHVybiBtYWluQXJlYTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgcmVzb2x1dGlvbnMgc29ydGVyLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUmVzb2x1dGlvbnNTb3J0ZXIoKSB7Ci0JCXJlc29sdXRpb25zU29ydGVyID0gbmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXIjY29tcGFyZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQkJcmV0dXJuICgoSU1hcmtlclJlc29sdXRpb24pIGUxKS5nZXRMYWJlbCgpLmNvbXBhcmVUbygKLQkJCQkJCSgoSU1hcmtlclJlc29sdXRpb24pIGUxKS5nZXRMYWJlbCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGJ1dHRvbnMgZm9yIHRoZSB0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEByZXR1cm4gQ29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlVGFibGVCdXR0b25zKENvbXBvc2l0ZSBjb250cm9sKSB7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29udHJvbCwgU1dULk5PTkUpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUJ1dHRvbiBzZWxlY3RBbGwgPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGwuc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5zZWxlY3RBbGxBY3Rpb25fdGl0bGUpOwotCQlzZWxlY3RBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5OT05FLCBmYWxzZSwgZmFsc2UpKTsKLQotCQlzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7Ci0JCQkJbWFya2Vyc1RhYmxlLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQkJc2V0Q29tcGxldGUoIXJlc29sdXRpb25zTGlzdC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpOwotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gZGVzZWxlY3RBbGwgPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbC5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLmZpbHRlcnNEaWFsb2dfZGVzZWxlY3RBbGwpOwotCQlkZXNlbGVjdEFsbAotCQkJCS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULk5PTkUsIGZhbHNlLCBmYWxzZSkpOwotCi0JCWRlc2VsZWN0QWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgYXJnMCkgewotCQkJCW1hcmtlcnNUYWJsZS5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJCQlzZXRDb21wbGV0ZShmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZE1hdGNoaW5nID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJYWRkTWF0Y2hpbmcuc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5NYXJrZXJSZXNvbHV0aW9uRGlhbG9nX0FkZE90aGVycyk7Ci0JCWFkZE1hdGNoaW5nCi0JCQkJLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuTk9ORSwgZmFsc2UsIGZhbHNlKSk7Ci0JCWFkZE1hdGNoaW5nLnNldEVuYWJsZWQoZ2V0TWF0Y2hpbmdCdXR0b25FbmFibGVtZW50KCkpOwotCQlhZGRNYXRjaGluZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKLQotCQkJCVdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24gc2VsZWN0ZWQgPSBnZXRTZWxlY3RlZFdvcmtiZW5jaFJlc29sdXRpb24oKTsKLQkJCQlpZiAoc2VsZWN0ZWQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJaWYgKGFkZE1hdGNoaW5nTWFya2VycyhzZWxlY3RlZCkpCi0JCQkJCWFkZE1hdGNoaW5nLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gYnV0dG9uQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xlIHNlbGVjdGVkIFdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24gaWYgdGhlcmUgaXMgb25lLgotCSAqIAotCSAqIEByZXR1cm4gV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgc2VsZWN0aW9uIG9yIHRoZSBzZWxlY3Rpb24gaXMgbm90IGEgV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbi4KLQkgKi8KLQlwcml2YXRlIFdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24gZ2V0U2VsZWN0ZWRXb3JrYmVuY2hSZXNvbHV0aW9uKCkgewotCQlPYmplY3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0ZWRSZXNvbHV0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbAotCQkJCXx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXb3JrYmVuY2hNYXJrZXJSZXNvbHV0aW9uKSBzZWxlY3Rpb247Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcmtlciByZXNvbHV0aW9uIHRoYXQgaXMgY3VycmVubHkgc2VsZWN0ZWQvCi0JICogCi0JICogQHJldHVybiBJTWFya2VyUmVzb2x1dGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgc2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgSU1hcmtlclJlc29sdXRpb24gZ2V0U2VsZWN0ZWRSZXNvbHV0aW9uKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHJlc29sdXRpb25zTGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJT2JqZWN0IGZpcnN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQlyZXR1cm4gKElNYXJrZXJSZXNvbHV0aW9uKSBmaXJzdDsKLQotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgb2YgdGhlIG1hcmtlcnMgdGhhdCBoYXZlIHJlc29sdXRpb25zIGNvbXBhdGlibGUgd2l0aCB0aGUKLQkgKiByZWNlaXZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkTWF0Y2hpbmdNYXJrZXJzKAotCQkJZmluYWwgV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbiByZXNvbHV0aW9uKSB7Ci0KLQkJY2FsY3VsYXRpbmdSZXNvbHV0aW9ucyA9IHRydWU7Ci0JCXByb2dyZXNzUGFydC5iZWdpblRhc2soCi0JCQkJTWFya2VyTWVzc2FnZXMuTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19DYWxjdWxhdGluZ1Rhc2ssIDEwMCk7Ci0KLQkJcHJvZ3Jlc3NQYXJ0LndvcmtlZCgxMCk7Ci0JCWlmIChwcm9ncmVzc0NhbmNlbGxlZCgpKSB7Ci0JCQljYWxjdWxhdGluZ1Jlc29sdXRpb25zID0gZmFsc2U7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwcm9ncmVzc1BhcnQuc3ViVGFzayhOTFMuYmluZCgKLQkJCQlNYXJrZXJNZXNzYWdlcy5NYXJrZXJSZXNvbHV0aW9uRGlhbG9nX1dvcmtpbmdTdWJUYXNrLAotCQkJCXJlc29sdXRpb24uZ2V0TGFiZWwoKSkpOwotCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSU1hcmtlcltdIG90aGVycyA9IHJlc29sdXRpb24uZmluZE90aGVyTWFya2VycyhtYXJrZXJWaWV3Ci0JCQkJCQkuZ2V0Q3VycmVudE1hcmtlcnMoKS5nZXRJTWFya2VycygpKTsKLQotCQkJCUNvbGxlY3Rpb24gY3VycmVudE1hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJY3VycmVudE1hcmtlcnMuYWRkKG9yaWdpbmFsTWFya2VyKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWN1cnJlbnRNYXJrZXJzLmFkZChvdGhlcnNbaV0pOwotCQkJCX0KLQotCQkJCW1hcmtlck1hcC5wdXQocmVzb2x1dGlvbiwgY3VycmVudE1hcmtlcnMpOwotCi0JCQkJcHJvZ3Jlc3NQYXJ0LndvcmtlZCg5MCk7Ci0JCQkJcHJvZ3Jlc3NQYXJ0LmRvbmUoKTsKLQkJCQlwcm9ncmVzc0NhbmNlbGxlZCA9IGZhbHNlOwotCQkJCWNhbGN1bGF0aW5nUmVzb2x1dGlvbnMgPSBmYWxzZTsKLQkJCQltYXJrZXJzVGFibGUucmVmcmVzaCgpOwotCi0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNwaW4gdGhlIGV2ZW50IGxvb3AgYW5kIHNlZSBpZiB0aGUgY2FuY2VsIGJ1dHRvbiB3YXMgcHJlc3NlZC4gSWYgaXQgd2FzCi0JICogdGhlbiBjbGVhciB0aGUgZmxhZ3MgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcHJvZ3Jlc3NDYW5jZWxsZWQoKSB7Ci0JCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnJlYWRBbmREaXNwYXRjaCgpOwotCQlpZiAocHJvZ3Jlc3NDYW5jZWxsZWQpIHsKLQkJCXByb2dyZXNzQ2FuY2VsbGVkID0gZmFsc2U7Ci0JCQljYWxjdWxhdGluZ1Jlc29sdXRpb25zID0gZmFsc2U7Ci0JCQlwcm9ncmVzc1BhcnQuZG9uZSgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgYWRkIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZ2V0TWF0Y2hpbmdCdXR0b25FbmFibGVtZW50KCkgewotCi0JCXJldHVybiBnZXRTZWxlY3RlZFJlc29sdXRpb24oKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgdGFibGUgZm9yIHRoZSBtYXJrZXJzLwotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1hcmtlclRhYmxlKENvbXBvc2l0ZSBjb250cm9sKSB7Ci0JCW1hcmtlcnNUYWJsZSA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGNvbnRyb2wsIFNXVC5CT1JERVIKLQkJCQl8IFNXVC5WX1NDUk9MTCk7Ci0KLQkJbWFya2Vyc1RhYmxlLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlJTWFya2VyUmVzb2x1dGlvbiBzZWxlY3RlZCA9IGdldFNlbGVjdGVkUmVzb2x1dGlvbigpOwotCQkJCWlmIChzZWxlY3RlZCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQotCQkJCWlmIChtYXJrZXJNYXAuY29udGFpbnNLZXkoc2VsZWN0ZWQpKQotCQkJCQlyZXR1cm4gKChDb2xsZWN0aW9uKSBtYXJrZXJNYXAuZ2V0KHNlbGVjdGVkKSkudG9BcnJheSgpOwotCQkJCXJldHVybiBuZXcgSU1hcmtlcltdIHsgb3JpZ2luYWxNYXJrZXIgfTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQotCQkJfQotCQl9KTsKLQotCQltYXJrZXJzVGFibGUuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFV0aWwuZ2V0UmVzb3VyY2VOYW1lKChJTWFya2VyKSBlbGVtZW50KTsKLQkJCX0KLQotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFV0aWwuZ2V0SW1hZ2UoKChJTWFya2VyKSBlbGVtZW50KS5nZXRBdHRyaWJ1dGUoCi0JCQkJCQlJTWFya2VyLlNFVkVSSVRZLCAtMSkpOwotCQkJfQotCQl9KTsKLQotCQltYXJrZXJzVGFibGUuc2V0SW5wdXQodGhpcyk7Ci0JCW1hcmtlcnNUYWJsZS5zZXRBbGxDaGVja2VkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGlhbG9nIHRvIGJlIGNvbXBsZXRlLgotCSAqIAotCSAqIEBwYXJhbSBjb21wbGV0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldENvbXBsZXRlKGJvb2xlYW4gY29tcGxldGUpIHsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoY29tcGxldGUpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBvZiB0aGUgcmVzb2x1dGlvbnMgdG8gY2hvb3NlIGZyb20gaW4gdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEByZXR1cm4gSU1hcmtlclJlc29sdXRpb25bXQotCSAqLwotCXB1YmxpYyBJTWFya2VyUmVzb2x1dGlvbltdIGdldFJlc29sdXRpb25zKCkgewotCQlyZXR1cm4gcmVzb2x1dGlvbnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCXNldFRpdGxlKE1hcmtlck1lc3NhZ2VzLk1hcmtlclJlc29sdXRpb25EaWFsb2dfVGl0bGUpOwotCQkvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBzZWxlY3QgaXQKLQkJaWYgKHJlc29sdXRpb25zTGlzdC5nZXRMaXN0KCkuZ2V0SXRlbUNvdW50KCkgPT0gMSkgewotCQkJcmVzb2x1dGlvbnNMaXN0LmdldExpc3QoKS5zZWxlY3QoMCk7Ci0JCQlzZXRDb21wbGV0ZSh0cnVlKTsKLQkJfSBlbHNlCi0JCQlzZXRDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJSU1hcmtlclJlc29sdXRpb24gcmVzb2x1dGlvbiA9IGdldFNlbGVjdGVkUmVzb2x1dGlvbigpOwotCQlpZiAocmVzb2x1dGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCU9iamVjdFtdIGNoZWNrZWQgPSBtYXJrZXJzVGFibGUuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0KLQkJcHJvZ3Jlc3NQYXJ0LmJlZ2luVGFzayhNYXJrZXJNZXNzYWdlcy5NYXJrZXJSZXNvbHV0aW9uRGlhbG9nX0ZpeGluZywKLQkJCQljaGVja2VkLmxlbmd0aCArIDEpOwotCQlwcm9ncmVzc1BhcnQud29ya2VkKDEpOwotCi0JCWNhbGN1bGF0aW5nUmVzb2x1dGlvbnMgPSB0cnVlOwotCi0JCWlmIChyZXNvbHV0aW9uIGluc3RhbmNlb2YgV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbikgewotCi0JCQlJTWFya2VyW10gbWFya2VycyA9IG5ldyBJTWFya2VyW2NoZWNrZWQubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoY2hlY2tlZCwgMCwgbWFya2VycywgMCwgY2hlY2tlZC5sZW5ndGgpOwotCQkJKChXb3JrYmVuY2hNYXJrZXJSZXNvbHV0aW9uKSByZXNvbHV0aW9uKS5ydW4obWFya2VycywKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc1BhcnQsIGNoZWNrZWQubGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0KLQkJCS8vIEFsbG93IHBhaW50IGV2ZW50cyBhbmQgd2FrZSB1cCB0aGUgYnV0dG9uCi0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5yZWFkQW5kRGlzcGF0Y2goKTsKLQkJCWlmICghcHJvZ3Jlc3NDYW5jZWxsZWQoKSkgewotCi0JCQkJLy8gVGhlcmUgd2lsbCBvbmx5IGJlIG9uZQotCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIGNoZWNrZWRbMF07Ci0KLQkJCQlwcm9ncmVzc1BhcnQuc3ViVGFzayhVdGlsLmdldFByb3BlcnR5KElNYXJrZXIuTUVTU0FHRSwgbWFya2VyKSk7Ci0JCQkJcmVzb2x1dGlvbi5ydW4obWFya2VyKTsKLQkJCQlwcm9ncmVzc1BhcnQud29ya2VkKDEpOwotCQkJfQotCi0JCX0KLQotCQljYWxjdWxhdGluZ1Jlc29sdXRpb25zID0gZmFsc2U7Ci0JCXByb2dyZXNzUGFydC5kb25lKCk7Ci0JCXByb2dyZXNzQ2FuY2VsbGVkID0gZmFsc2U7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY2FuY2VsUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJaWYgKGNhbGN1bGF0aW5nUmVzb2x1dGlvbnMpIHsKLQkJCXByb2dyZXNzQ2FuY2VsbGVkID0gdHJ1ZTsKLQkJCXByb2dyZXNzUGFydC5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJTZWxlY3Rpb25Qcm92aWRlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMxZjRhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJTZWxlY3Rpb25Qcm92aWRlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uOwotCi0vKioKLSAqIE1hcmtlclNlbGVjdGlvblByb3ZpZGVyQWN0aW9uIGlzIHRoZSBhYnN0cmFjdCBzdXBlciBjbGFzcyBvZiB0aGUKLSAqIHNlbGVjdGlvbiBwcm92aWRlciBhY3Rpb25zIHVzZWQgYnkgbWFya2VyIHZpZXdzLgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1hcmtlclNlbGVjdGlvblByb3ZpZGVyQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBNYXJrZXJTZWxlY3Rpb25Qcm92aWRlckFjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIsIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHByb3ZpZGVyLCB0ZXh0KTsKLQkJCi0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgc2VsZWN0ZWQgbWFya2VycyBpbiB0aGUgcmVjZWl2ZXIuCi0JICogQHJldHVybiBJTWFya2VyW10KLQkgKi8KLQlJTWFya2VyW10gZ2V0U2VsZWN0ZWRNYXJrZXJzKCl7Ci0JCQotCQlyZXR1cm4gZ2V0U2VsZWN0ZWRNYXJrZXJzKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZWxlY3RlZCBtYXJrZXJzIGZvciB0aGUgc3RydWN0dXJlZCBzZWxlY3Rpb24uCi0JICogQHBhcmFtIHN0cnVjdHVyZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24KLQkgKiBAcmV0dXJuIElNYXJrZXJbXQotCSAqLwotCUlNYXJrZXJbXSBnZXRTZWxlY3RlZE1hcmtlcnMoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZCkgewotCQlPYmplY3RbXSBzZWxlY3Rpb24gPSBzdHJ1Y3R1cmVkLnRvQXJyYXkoKTsKLQkJQXJyYXlMaXN0IG1hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gc2VsZWN0aW9uW2ldOwotCQkJaWYoIShvYmplY3QgaW5zdGFuY2VvZiBNYXJrZXJOb2RlKSkKLQkJCQlyZXR1cm4gbmV3IElNYXJrZXJbMF07Ly9zdGlsbCBwZW5kaW5nCi0JCQlNYXJrZXJOb2RlIG1hcmtlciA9KE1hcmtlck5vZGUpIG9iamVjdDsKLQkJCWlmKG1hcmtlci5pc0NvbmNyZXRlKCkpCi0JCQkJbWFya2Vycy5hZGQoKChDb25jcmV0ZU1hcmtlcikgb2JqZWN0KS5nZXRNYXJrZXIoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiAoSU1hcmtlcltdKSBtYXJrZXJzLnRvQXJyYXkobmV3IElNYXJrZXJbbWFya2Vycy5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBzZWxlY3RlZCBtYXJrZXIgaW4gdGhlIHJlY2VpdmVyLgotCSAqIEByZXR1cm4gSU1hcmtlcgotCSAqLwotCUlNYXJrZXIgZ2V0U2VsZWN0ZWRNYXJrZXIoKXsKLQkJCi0JCUNvbmNyZXRlTWFya2VyIHNlbGVjdGlvbiA9IChDb25jcmV0ZU1hcmtlcikgZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpLmdldEZpcnN0RWxlbWVudCgpOwotCQlyZXR1cm4gc2VsZWN0aW9uLmdldE1hcmtlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyU29ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhZTNhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotCi1hYnN0cmFjdCBjbGFzcyBNYXJrZXJTb3J0ZXIgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotCS8qKgotCSAqIFNvcnQgdGhlIGFycmF5IG9mIG1hcmtlcnMgaW4gbGFzdE1hcmtlcnMgaW4gcGxhY2UuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBtYXJrZXJzCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc29ydChUcmVlVmlld2VyIHZpZXdlciwgTWFya2VyTGlzdCBtYXJrZXJzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL01hcmtlclN1cHBvcnRSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyU3VwcG9ydFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZjNmYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyU3VwcG9ydFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5keW5hbWljaGVscGVycy5FeHRlbnNpb25UcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5keW5hbWljaGVscGVycy5JRXh0ZW5zaW9uQ2hhbmdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuZHluYW1pY2hlbHBlcnMuSUV4dGVuc2lvblRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotCi0vKioKLSAqIFRoZSBQcm9ibGVtRmlsdGVyUmVnaXN0cnlSZWFkZXIgaXMgdGhlIHJlZ2lzdHJ5IHJlYWRlciBmb3IgZGVjbGFyYXRpdmUKLSAqIHByb2JsZW0gZmlsdGVycy4gU2VlIHRoZSBvcmcuZWNsaXBzZS51aS5tYXJrZXJTdXBwb3J0IGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrZXJTdXBwb3J0UmVnaXN0cnkgaW1wbGVtZW50cyBJRXh0ZW5zaW9uQ2hhbmdlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAib25EZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgRVJST1IgPSAiRVJST1IiOy8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSU5GTyA9ICJJTkZPIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgV0FSTklORyA9ICJXQVJOSU5HIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm1hcmtlcklkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHRhZyBmb3IgdGhlIG1hcmtlciBzdXBwb3J0IGV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9TVVBQT1JUID0gIm1hcmtlclN1cHBvcnQiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgT05fQU5ZID0gIk9OX0FOWSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBPTl9BTllfSU5fU0FNRV9DT05UQUlORVIgPSAiT05fQU5ZX0lOX1NBTUVfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgT05fU0VMRUNURURfQU5EX0NISUxEUkVOID0gIk9OX1NFTEVDVEVEX0FORF9DSElMRFJFTiI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IE9OX1NFTEVDVEVEX09OTFkgPSAiT05fU0VMRUNURURfT05MWSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBQUk9CTEVNX0ZJTFRFUiA9ICJwcm9ibGVtRmlsdGVyIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEUgPSAic2NvcGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNURURfVFlQRSA9ICJzZWxlY3RlZFR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VWRVJJVFkgPSAic2V2ZXJpdHkiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfVFlQRV9SRUZFUkVOQ0UgPSAibWFya2VyVHlwZVJlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBNQVJLRVJfQ0FURUdPUlkgPSAibWFya2VyQ2F0ZWdvcnkiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBISUVSQVJDSFkgPSAiaGllcmFyY2h5IjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElFUkFSQ0hZX1JFRkVSRU5DRSA9ICJoaWVyYXJjaHlSZWZlcmVuY2UiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIID0gIlBBVEgiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gIk1FU1NBR0UiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRSA9ICJSRVNPVVJDRSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVkVSSVRZX0hJRVJBUkNIWSA9ICJTRVZFUklUWSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElPTiA9ICJkaXJlY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU0NFTkRJTkcgPSAiQVNDRU5ESU5HIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9NQVBQSU5HID0gIm1hcmtlckF0dHJpYnV0ZU1hcHBpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTUFSS0VSX0dST1VQSU5HID0gIm1hcmtlckdyb3VwaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBNYXJrZXJTdXBwb3J0UmVnaXN0cnkgc2luZ2xldG9uOwotCi0JLy8gQ3JlYXRlIGEgbG9jayBzbyB0aGF0IGluaXRpaXphdGlvbiBoYXBwZW5zIGluIG9uZSB0aHJlYWQKLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgY3JlYXRpb25Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0JLyoqCi0JICogR2V0IHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiBQcm9ibGVtRmlsdGVyUmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcmtlclN1cHBvcnRSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGNyZWF0aW9uTG9jaykgewotCQkJCWlmIChzaW5nbGV0b24gPT0gbnVsbCkvLyBNYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgYmxvY2tpbmcKLQkJCQkJLy8gdGhyZWFkCi0JCQkJCXNpbmdsZXRvbiA9IG5ldyBNYXJrZXJTdXBwb3J0UmVnaXN0cnkoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiByZWdpc3RlcmVkRmlsdGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtYXJrZXJHcm91cHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgY2F0ZWdvcmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgaGllcmFyY2h5T3JkZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgTWFya2VyVHlwZSByb290VHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgYW5kIHJlYWQgdGhlIHJlZ2lzdHJ5LgotCSAqLwotCXByaXZhdGUgTWFya2VyU3VwcG9ydFJlZ2lzdHJ5KCkgewotCQlJRXh0ZW5zaW9uVHJhY2tlciB0cmFja2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRFeHRlbnNpb25UcmFja2VyKCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkKLQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoSURFV29ya2JlbmNoUGx1Z2luLklERV9XT1JLQkVOQ0gsCi0JCQkJCQlNQVJLRVJfU1VQUE9SVCk7Ci0JCWlmIChwb2ludCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJLy8gaW5pdGlhbCBwb3B1bGF0aW9uCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJcHJvY2Vzc0V4dGVuc2lvbih0cmFja2VyLCBleHRlbnNpb24pOwotCQl9Ci0JCXRyYWNrZXIucmVnaXN0ZXJIYW5kbGVyKHRoaXMsIEV4dGVuc2lvblRyYWNrZXIKLQkJCQkuY3JlYXRlRXh0ZW5zaW9uUG9pbnRGaWx0ZXIocG9pbnQpKTsKLQotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGV4dGVuc2lvbiBhbmQgcmVnaXN0ZXIgdGhlIHJlc3VsdCB3aXRoIHRoZSB0cmFja2VyLgotCSAqIAotCSAqIEBwYXJhbSB0cmFja2VyCi0JICogQHBhcmFtIGV4dGVuc2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzRXh0ZW5zaW9uKElFeHRlbnNpb25UcmFja2VyIHRyYWNrZXIsCi0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tqXTsKLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoUFJPQkxFTV9GSUxURVIpKSB7Ci0JCQkJUHJvYmxlbUZpbHRlciBmaWx0ZXIgPSBuZXdGaWx0ZXIoZWxlbWVudCk7Ci0JCQkJcmVnaXN0ZXJlZEZpbHRlcnMuYWRkKGZpbHRlcik7Ci0JCQkJdHJhY2tlci5yZWdpc3Rlck9iamVjdChleHRlbnNpb24sIGZpbHRlciwKLQkJCQkJCUlFeHRlbnNpb25UcmFja2VyLlJFRl9TVFJPTkcpOwotCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKE1BUktFUl9HUk9VUElORykpIHsKLQotCQkJCVN0cmluZ1tdIG1hcmtlclR5cGVzID0gZ2V0TWFya2VyVHlwZXMoZWxlbWVudCk7Ci0JCQkJTWFwIHByb3ZpZGVycyA9IGdldFByb3ZpZGVycyhlbGVtZW50KTsKLQotCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRSk7Ci0JCQkJU3RyaW5nIGF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURSk7Ci0KLQkJCQlGaWVsZE1hcmtlckdyb3VwIGdyb3VwID0gbmV3IEZpZWxkTWFya2VyR3JvdXAobmFtZSwgYXR0cmlidXRlLCBwcm92aWRlcnMsCi0JCQkJCQltYXJrZXJUeXBlcyk7Ci0KLQkJCQltYXJrZXJHcm91cHMuYWRkKGdyb3VwKTsKLQkJCQl0cmFja2VyLnJlZ2lzdGVyT2JqZWN0KGV4dGVuc2lvbiwgZ3JvdXAsCi0JCQkJCQlJRXh0ZW5zaW9uVHJhY2tlci5SRUZfU1RST05HKTsKLQkJCX0KLQotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhNQVJLRVJfQ0FURUdPUlkpKSB7Ci0KLQkJCQlTdHJpbmdbXSBtYXJrZXJUeXBlcyA9IGdldE1hcmtlclR5cGVzKGVsZW1lbnQpOwotCQkJCVN0cmluZyBjYXRlZ29yeU5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShOQU1FKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJY2F0ZWdvcmllcy5wdXQobWFya2VyVHlwZXNbaV0sIGNhdGVnb3J5TmFtZSk7Ci0KLQkJCQl9Ci0JCQkJdHJhY2tlci5yZWdpc3Rlck9iamVjdChleHRlbnNpb24sIGNhdGVnb3J5TmFtZSwKLQkJCQkJCUlFeHRlbnNpb25UcmFja2VyLlJFRl9TVFJPTkcpOwotCQkJfQotCi0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEhJRVJBUkNIWSkpIHsKLQotCQkJCVN0cmluZyBtYXJrZXJUeXBlID0gZ2V0TWFya2VyVHlwZXMoZWxlbWVudClbMF07Ci0KLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0eXBlcyA9IGVsZW1lbnQKLQkJCQkJCS5nZXRDaGlsZHJlbihISUVSQVJDSFlfUkVGRVJFTkNFKTsKLQkJCQlJRmllbGRbXSBwcm9wZXJ0aWVzID0gbmV3IElGaWVsZFt0eXBlcy5sZW5ndGhdOwotCQkJCWludFtdIGRpcmVjdGlvbnMgPSBuZXcgaW50W3R5cGVzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQlwcm9wZXJ0aWVzW2ldID0gZ2V0RmllbGRGb3IodHlwZXNbaV0uZ2V0QXR0cmlidXRlKFRZUEUpKTsKLQkJCQkJU3RyaW5nIGRpcmVjdGlvbiA9IHR5cGVzW2ldLmdldEF0dHJpYnV0ZShESVJFQ1RJT04pOwotCQkJCQlpZiAoZGlyZWN0aW9uID09IEFTQ0VORElORykKLQkJCQkJCWRpcmVjdGlvbnNbaV0gPSBUYWJsZVNvcnRlci5BU0NFTkRJTkc7Ci0JCQkJCWVsc2UKLQkJCQkJCWRpcmVjdGlvbnNbaV0gPSBUYWJsZVNvcnRlci5ERVNDRU5ESU5HOwotCQkJCX0KLQotCQkJCWludFtdIHByaW9yaXRpZXMgPSBuZXcgaW50W3Byb3BlcnRpZXMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByaW9yaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJcHJpb3JpdGllc1tpXSA9IGk7Ci0JCQkJfQotCi0JCQkJVGFibGVTb3J0ZXIgc29ydGVyID0gbmV3IFRhYmxlU29ydGVyKHByb3BlcnRpZXMsIHByaW9yaXRpZXMsCi0JCQkJCQlkaXJlY3Rpb25zKTsKLQkJCQloaWVyYXJjaHlPcmRlcnMucHV0KG1hcmtlclR5cGUsIHNvcnRlcik7Ci0JCQkJdHJhY2tlci5yZWdpc3Rlck9iamVjdChleHRlbnNpb24sIHNvcnRlciwKLQkJCQkJCUlFeHRlbnNpb25UcmFja2VyLlJFRl9TVFJPTkcpOwotCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpZWxkIHRoYXQgbWF0Y2hlcyBhdHRyaWJ1dGUKLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlCi0JICogQHJldHVybiBJRmllbGQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgZmllbGQuCi0JICovCi0JcHJpdmF0ZSBJRmllbGQgZ2V0RmllbGRGb3IoU3RyaW5nIGF0dHJpYnV0ZSkgewotCQlpZiAoYXR0cmlidXRlLmVxdWFscyhQQVRIKSkKLQkJCXJldHVybiBuZXcgRmllbGRGb2xkZXIoKTsKLQkJaWYgKGF0dHJpYnV0ZS5lcXVhbHMoTUVTU0FHRSkpCi0JCQlyZXR1cm4gbmV3IEZpZWxkTWVzc2FnZSgpOwotCQlpZiAoYXR0cmlidXRlLmVxdWFscyhTRVZFUklUWV9ISUVSQVJDSFkpKQotCQkJcmV0dXJuIG5ldyBGaWVsZFNldmVyaXR5KCk7Ci0JCWlmIChhdHRyaWJ1dGUuZXF1YWxzKFJFU09VUkNFKSkKLQkJCXJldHVybiBuZXcgRmllbGRSZXNvdXJjZSgpOwotCi0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBtYXJrZXJUeXBlcyBkZWZpbmVkIGluIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZ1tdCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRNYXJrZXJUeXBlcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0eXBlcyA9IGVsZW1lbnQKLQkJCQkuZ2V0Q2hpbGRyZW4oTUFSS0VSX1RZUEVfUkVGRVJFTkNFKTsKLQkJU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1t0eXBlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJaWRzW2ldID0gdHlwZXNbaV0uZ2V0QXR0cmlidXRlKElEKTsKLQkJfQotCQlyZXR1cm4gaWRzOwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIGF0dHJpYnV0ZU1hcHBpbmdzIGZyb20gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gTWFwCi0JICovCi0JcHJpdmF0ZSBNYXAgZ2V0UHJvdmlkZXJzKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gbWFwcGluZ3MgPSBlbGVtZW50Ci0JCQkJLmdldENoaWxkcmVuKEFUVFJJQlVURV9NQVBQSU5HKTsKLQotCQlIYXNoTWFwIHZhbHVlc1RvU3RyaW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCXZhbHVlc1RvU3RyaW5ncy5wdXQobWFwcGluZ3NbaV0uZ2V0QXR0cmlidXRlKFZBTFVFKSwgbWFwcGluZ3NbaV0KLQkJCQkJLmdldEF0dHJpYnV0ZShOQU1FKSk7Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWVzVG9TdHJpbmdzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmR5bmFtaWNoZWxwZXJzLklFeHRlbnNpb25DaGFuZ2VIYW5kbGVyI2FkZEV4dGVuc2lvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuZHluYW1pY2hlbHBlcnMuSUV4dGVuc2lvblRyYWNrZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oSUV4dGVuc2lvblRyYWNrZXIgdHJhY2tlciwgSUV4dGVuc2lvbiBleHRlbnNpb24pIHsKLQkJcHJvY2Vzc0V4dGVuc2lvbih0cmFja2VyLCBleHRlbnNpb24pOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY29sbGVjdGlvbiBvZiBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmaWx0ZXJzLgotCSAqIAotCSAqIEByZXR1cm4gQ29sbGVjdGlvbiBvZiBQcm9ibGVtRmlsdGVyCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVnaXN0ZXJlZEZpbHRlcnMoKSB7Ci0JCUNvbGxlY3Rpb24gZmlsdGVyZWRGaWx0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciByZWdpc3RlcmVkSXRlcmF0b3IgPSByZWdpc3RlcmVkRmlsdGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaXN0ZXJlZEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvYmxlbUZpbHRlciBuZXh0ID0gKFByb2JsZW1GaWx0ZXIpIHJlZ2lzdGVyZWRJdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dC5pc0ZpbHRlcmVkT3V0QnlBY3Rpdml0eSgpKQotCQkJCWNvbnRpbnVlOwotCQkJZmlsdGVyZWRGaWx0ZXJzLmFkZChuZXh0KTsKLQkJfQotCi0JCXJldHVybiBmaWx0ZXJlZEZpbHRlcnM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjb25zdGFudCBmb3Igc2NvcGUgZnJvbSBlbGVtZW50LiBSZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGludCBvbmUgb2YgTWFya2VyVmlldyNPTl9BTlkgTWFya2VyVmlldyNPTl9TRUxFQ1RFRF9PTkxZCi0JICogICAgICAgICBNYXJrZXJWaWV3I09OX1NFTEVDVEVEX0FORF9DSElMRFJFTgotCSAqICAgICAgICAgTWFya2VyVmlldyNPTl9BTllfSU5fU0FNRV9DT05UQUlORVIKLQkgKi8KLQlwcml2YXRlIGludCBnZXRTY29wZVZhbHVlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBzY29wZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFNDT1BFKTsKLQkJaWYgKHNjb3BlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChzY29wZS5lcXVhbHMoT05fQU5ZKSkKLQkJCXJldHVybiBNYXJrZXJGaWx0ZXIuT05fQU5ZOwotCQlpZiAoc2NvcGUuZXF1YWxzKE9OX1NFTEVDVEVEX09OTFkpKQotCQkJcmV0dXJuIE1hcmtlckZpbHRlci5PTl9TRUxFQ1RFRF9PTkxZOwotCQlpZiAoc2NvcGUuZXF1YWxzKE9OX1NFTEVDVEVEX0FORF9DSElMRFJFTikpCi0JCQlyZXR1cm4gTWFya2VyRmlsdGVyLk9OX1NFTEVDVEVEX0FORF9DSElMRFJFTjsKLQkJaWYgKHNjb3BlLmVxdWFscyhPTl9BTllfSU5fU0FNRV9DT05UQUlORVIpKQotCQkJcmV0dXJuIE1hcmtlckZpbHRlci5PTl9BTllfSU5fU0FNRV9DT05UQUlORVI7Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY29uc3RhbnQgZm9yIHNjb3BlIGZyb20gZWxlbWVudC4gUmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBpbnQgb25lIG9mIE1hcmtlclZpZXcjT05fQU5ZIE1hcmtlclZpZXcjT05fU0VMRUNURURfT05MWQotCSAqICAgICAgICAgTWFya2VyVmlldyNPTl9TRUxFQ1RFRF9BTkRfQ0hJTERSRU4KLQkgKiAgICAgICAgIE1hcmtlclZpZXcjT05fQU5ZX0lOX1NBTUVfQ09OVEFJTkVSCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0U2V2ZXJpdHlWYWx1ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgc2V2ZXJpdHkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShTRVZFUklUWSk7Ci0JCWlmIChzZXZlcml0eSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoc2V2ZXJpdHkuZXF1YWxzKElORk8pKQotCQkJcmV0dXJuIFByb2JsZW1GaWx0ZXIuU0VWRVJJVFlfSU5GTzsKLQkJaWYgKHNldmVyaXR5LmVxdWFscyhXQVJOSU5HKSkKLQkJCXJldHVybiBQcm9ibGVtRmlsdGVyLlNFVkVSSVRZX1dBUk5JTkc7Ci0JCWlmIChzZXZlcml0eS5lcXVhbHMoRVJST1IpKQotCQkJcmV0dXJuIFByb2JsZW1GaWx0ZXIuU0VWRVJJVFlfRVJST1I7Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJlYWQgdGhlIHByb2JsZW0gZmlsdGVycyBpbiB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBmaWx0ZXIgZWxlbWVudAotCSAqIEByZXR1cm4gUHJvYmxlbUZpbHRlcgotCSAqLwotCXByaXZhdGUgUHJvYmxlbUZpbHRlciBuZXdGaWx0ZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJUHJvYmxlbUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvYmxlbUZpbHRlcihlbGVtZW50LmdldEF0dHJpYnV0ZShOQU1FKSk7Ci0KLQkJZmlsdGVyLmNyZWF0ZUNvbnRyaWJ1dGlvbkZyb20oZWxlbWVudCk7Ci0KLQkJU3RyaW5nIGVuYWJsZWRWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEVOQUJMRUQpOwotCQlmaWx0ZXIuc2V0RW5hYmxlZChlbmFibGVkVmFsdWUgPT0gbnVsbAotCQkJCXx8IEJvb2xlYW4udmFsdWVPZihlbmFibGVkVmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQlpbnQgc2NvcGVWYWx1ZSA9IGdldFNjb3BlVmFsdWUoZWxlbWVudCk7Ci0JCWlmIChzY29wZVZhbHVlID49IDApIHsKLQkJCWZpbHRlci5zZXRPblJlc291cmNlKHNjb3BlVmFsdWUpOwotCQl9Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoREVTQ1JJUFRJT04pOwotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJYm9vbGVhbiBjb250YWlucyA9IHRydWU7Ci0JCQlpZiAoZGVzY3JpcHRpb24uY2hhckF0KDApID09ICchJykgey8vIGRvZXMgbm90IGNvbnRhaW4gZmxhZwotCQkJCWRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24uc3Vic3RyaW5nKDEsIGRlc2NyaXB0aW9uLmxlbmd0aCgpKTsKLQkJCQljb250YWlucyA9IGZhbHNlOwotCQkJfQotCQkJZmlsdGVyLnNldENvbnRhaW5zKGNvbnRhaW5zKTsKLQkJCWZpbHRlci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHlWYWx1ZSA9IGdldFNldmVyaXR5VmFsdWUoZWxlbWVudCk7Ci0JCWlmIChzZXZlcml0eVZhbHVlID4gMCkgewotCQkJZmlsdGVyLnNldFNlbGVjdEJ5U2V2ZXJpdHkodHJ1ZSk7Ci0JCQlmaWx0ZXIuc2V0U2V2ZXJpdHkoc2V2ZXJpdHlWYWx1ZSk7Ci0JCX0gZWxzZQotCQkJZmlsdGVyLnNldFNlbGVjdEJ5U2V2ZXJpdHkoZmFsc2UpOwotCi0JCUxpc3Qgc2VsZWN0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gdHlwZXMgPSBlbGVtZW50LmdldENoaWxkcmVuKFNFTEVDVEVEX1RZUEUpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzLmxlbmd0aDsgaisrKSB7Ci0JCQlTdHJpbmcgbWFya2VySWQgPSB0eXBlc1tqXS5nZXRBdHRyaWJ1dGUoTUFSS0VSX0lEKTsKLQkJCWlmIChtYXJrZXJJZCAhPSBudWxsKSB7Ci0JCQkJTWFya2VyVHlwZSB0eXBlID0gZmlsdGVyLmdldE1hcmtlclR5cGUobWFya2VySWQpOwotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywKLQkJCQkJCQlJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwgSVN0YXR1cy5XQVJOSU5HLAotCQkJCQkJCU1hcmtlck1lc3NhZ2VzLlByb2JsZW1GaWx0ZXJSZWdpc3RyeV9udWxsVHlwZSwgbnVsbCk7Ci0JCQkJCUlERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCQkJfSBlbHNlCi0JCQkJCXNlbGVjdGVkVHlwZXMuYWRkKHR5cGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNlbGVjdGVkVHlwZXMuc2l6ZSgpID4gMCkgLy8gT25seSBzZXQgdGhlIHR5cGVzIGlmIHRoZXJlIGFyZSBhbnkKLQkJCS8vIHNwZWNpZmllZAotCQkJZmlsdGVyLnNldFNlbGVjdGVkVHlwZXMoc2VsZWN0ZWRUeXBlcyk7Ci0KLQkJcmV0dXJuIGZpbHRlcjsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmR5bmFtaWNoZWxwZXJzLklFeHRlbnNpb25DaGFuZ2VIYW5kbGVyI3JlbW92ZUV4dGVuc2lvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHRlbnNpb24oSUV4dGVuc2lvbiBleHRlbnNpb24sIE9iamVjdFtdIG9iamVjdHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob2JqZWN0c1tpXSBpbnN0YW5jZW9mIFByb2JsZW1GaWx0ZXIpCi0JCQkJcmVnaXN0ZXJlZEZpbHRlcnMucmVtb3ZlKG9iamVjdHNbaV0pOwotCi0JCQlpZiAob2JqZWN0c1tpXSBpbnN0YW5jZW9mIEZpZWxkTWFya2VyR3JvdXApIHsKLQkJCQltYXJrZXJHcm91cHMucmVtb3ZlKG9iamVjdHNbaV0pOwotCQkJfQotCi0JCQlpZiAob2JqZWN0c1tpXSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCXJlbW92ZVZhbHVlcyhvYmplY3RzW2ldLCBjYXRlZ29yaWVzKTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdHNbaV0gaW5zdGFuY2VvZiBUYWJsZVNvcnRlcikgewotCQkJCXJlbW92ZVZhbHVlcyhvYmplY3RzW2ldLCBoaWVyYXJjaHlPcmRlcnMpOwotCQkJfQotCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgdmFsdWUgZnJvbSBhbGwgb2YgdGhlIGNvbGxlY3Rpb24gc2V0cyBpbiBjYWNoZS4gSWYgdGhlCi0JICogY29sbGVjdGlvbiBpcyBlbXB0eSByZW1vdmUgdGhlIGtleSBhcyB3ZWxsLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBjYWNoZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVWYWx1ZXMoT2JqZWN0IHZhbHVlLCBIYXNoTWFwIGNhY2hlKSB7Ci0JCUNvbGxlY3Rpb24ga2V5c1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBrZXlzID0gY2FjaGUua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0JCQlPYmplY3QgbmV4dCA9IGNhY2hlLmdldChrZXkpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG5leHQ7Ci0JCQkJaWYgKGNvbGxlY3Rpb24uY29udGFpbnModmFsdWUpKSB7Ci0JCQkJCWNvbGxlY3Rpb24ucmVtb3ZlKHZhbHVlKTsKLQkJCQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKQotCQkJCQkJa2V5c1RvUmVtb3ZlLmFkZChrZXkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjYWNoZS5nZXQoa2V5KS5lcXVhbHModmFsdWUpKQotCQkJCQlrZXlzVG9SZW1vdmUuYWRkKGtleSk7Ci0JCQl9Ci0JCX0KLQkJSXRlcmF0b3Iga2V5c1RvUmVtb3ZlSXRlcmF0b3IgPSBrZXlzVG9SZW1vdmUuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGtleXNUb1JlbW92ZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJY2FjaGUucmVtb3ZlKGtleXNUb1JlbW92ZUl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNhdGVnb3J5IGFzc29jaWF0ZWQgd2l0aCBtYXJrZXIuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoZXJlIGFyZSBub25lLgotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcmV0dXJuIFN0cmluZyBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRDYXRlZ29yeShtYXJrZXIuZ2V0VHlwZSgpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVdGlsLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNhdGVnb3J5IGFzc29jaWF0ZWQgd2l0aCBtYXJrZXJUeXBlLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB0aGVyZSBhcmUgbm9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyVHlwZQotCSAqIEByZXR1cm4gU3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeShTdHJpbmcgbWFya2VyVHlwZSkgewotCQlpZiAoY2F0ZWdvcmllcy5jb250YWluc0tleShtYXJrZXJUeXBlKSkKLQkJCXJldHVybiAoU3RyaW5nKSBjYXRlZ29yaWVzLmdldChtYXJrZXJUeXBlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBUYWJsZVNvcnRlciB0aGF0IGNvcnJlc3BvbmRzIHRvIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIFRhYmxlU29ydGVyCi0JICovCi0JcHVibGljIFRhYmxlU29ydGVyIGdldFNvcnRlckZvcihTdHJpbmcgdHlwZSkgewotCQlpZiAoaGllcmFyY2h5T3JkZXJzLmNvbnRhaW5zS2V5KHR5cGUpKQotCQkJcmV0dXJuIChUYWJsZVNvcnRlcikgaGllcmFyY2h5T3JkZXJzLmdldCh0eXBlKTsKLQotCQlUYWJsZVNvcnRlciBzb3J0ZXIgPSBmaW5kU29ydGVySW5DaGlsZHJlbih0eXBlLCBnZXRSb290VHlwZSgpKTsKLQkJaWYgKHNvcnRlciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBUYWJsZVNvcnRlcihuZXcgSUZpZWxkWzBdLCBuZXcgaW50WzBdLCBuZXcgaW50WzBdKTsKLQkJcmV0dXJuIHNvcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2Ygcm9vdCBtYXJrZXIgdHlwZXMuCi0JICogCi0JICogQHJldHVybiBMaXN0IG9mIE1hcmtlclR5cGUuCi0JICovCi0JcHJpdmF0ZSBNYXJrZXJUeXBlIGdldFJvb3RUeXBlKCkgewotCQlpZiAocm9vdFR5cGUgPT0gbnVsbCkgewotCQkJcm9vdFR5cGUgPSAoTWFya2VyVHlwZXNNb2RlbC5nZXRJbnN0YW5jZSgpKQotCQkJCQkuZ2V0VHlwZShJTWFya2VyLlBST0JMRU0pOwotCQl9Ci0JCXJldHVybiByb290VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSBiZXN0IG1hdGNoIHNvcnRlciBmb3IgdHlwZU5hbWUgaW4gdGhlIGNoaWxkcmVuLiBJZiBpdCBjYW5ub3QgYmUKLQkgKiBmb3VuZCB0aGVuIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZU5hbWUKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4gVGFibGVTb3J0ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBUYWJsZVNvcnRlciBmaW5kU29ydGVySW5DaGlsZHJlbihTdHJpbmcgdHlwZU5hbWUsIE1hcmtlclR5cGUgdHlwZSkgewotCi0JCU1hcmtlclR5cGVbXSB0eXBlcyA9IHR5cGUuZ2V0QWxsU3ViVHlwZXMoKTsKLQkJVGFibGVTb3J0ZXIgZGVmYXVsdFNvcnRlciA9IG51bGw7Ci0JCWlmIChoaWVyYXJjaHlPcmRlcnMuY29udGFpbnNLZXkodHlwZS5nZXRJZCgpKSkKLQkJCWRlZmF1bHRTb3J0ZXIgPSAoVGFibGVTb3J0ZXIpIGhpZXJhcmNoeU9yZGVycy5nZXQodHlwZS5nZXRJZCgpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNYXJrZXJUeXBlW10gc3VidHlwZXMgPSB0eXBlc1tpXS5nZXRBbGxTdWJUeXBlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdWJ0eXBlcy5sZW5ndGg7IGorKykgewotCQkJCVRhYmxlU29ydGVyIHNvcnRlciA9IGZpbmRTb3J0ZXJJbkNoaWxkcmVuKHR5cGVOYW1lLCBzdWJ0eXBlc1tqXSk7Ci0JCQkJaWYgKHNvcnRlciAhPSBudWxsKQotCQkJCQlyZXR1cm4gc29ydGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0U29ydGVyOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBGaWVsZE1hcmtlckdyb3VwcyBpbiB0aGUgcmVjZWl2ZXIuCi0JICogQHJldHVybiBDb2xsZWN0aW9uIG9mIEZpZWxkTWFya2VyR3JvdXAKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNYXJrZXJHcm91cHMoKSB7Ci0JCXJldHVybiBtYXJrZXJHcm91cHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYWFiZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBUaGUgTWFya2VyVHJlZUNvbnRlbnRQcm92aWRlciBpcyB0aGUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIG1hcmtlciB0cmVlcy4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrZXJUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JVHJlZVZpZXdlciB2aWV3ZXI7Ci0KLQlib29sZWFuIGhpZXJhcmNoYWxNb2RlID0gdHJ1ZTsKLQotCXByaXZhdGUgTWFya2VyQWRhcHRlciBhZGFwdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSB2aWV3LgotCSAqLwotCU1hcmtlclRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWFya2VyTm9kZSkKLQkJCXJldHVybiAoKE1hcmtlck5vZGUpIHBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCXJldHVybiBVdGlsLkVNUFRZX01BUktFUl9BUlJBWTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNYXJrZXJOb2RlKQotCQkJcmV0dXJuICgoTWFya2VyTm9kZSkgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWFya2VyTm9kZSkKLQkJCXJldHVybiAoKE1hcmtlck5vZGUpIGVsZW1lbnQpLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBhZGFwdGVyLmdldEVsZW1lbnRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gTm90aGluZyB0byBkbyBoZXJlLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCXRoaXMudmlld2VyID0gKFRyZWVWaWV3ZXIpIHZpZXdlcjsKLQkJYWRhcHRlciA9IChNYXJrZXJBZGFwdGVyKSBuZXdJbnB1dDsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL01hcmtlclR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL01hcmtlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhYjBlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIG1hcmtlciB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgTWFya2VyVHlwZSB7Ci0gICAgcHJpdmF0ZSBNYXJrZXJUeXBlc01vZGVsIG1vZGVsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotICAgIHByaXZhdGUgU3RyaW5nW10gc3VwZXJ0eXBlSWRzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBtYXJrZXIgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFya2VyVHlwZShNYXJrZXJUeXBlc01vZGVsIG1vZGVsLCBTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIFN0cmluZ1tdIHN1cGVydHlwZUlkcykgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICB0aGlzLnN1cGVydHlwZUlkcyA9IHN1cGVydHlwZUlkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGlzIHR5cGUncyBzdXBlcnR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBNYXJrZXJUeXBlW10gZ2V0QWxsU3VwZXJ0eXBlcygpIHsKLSAgICAgICAgQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZ2V0QWxsU3VwZXJ0eXBlcyhyZXN1bHQpOwotICAgICAgICByZXR1cm4gKE1hcmtlclR5cGVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IE1hcmtlclR5cGVbcmVzdWx0LnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgYWxsIHRoaXMgdHlwZSdzIHN1cGVydHlwZXMgdG8gdGhlIGdpdmVuIGxpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdldEFsbFN1cGVydHlwZXMoQXJyYXlMaXN0IHJlc3VsdCkgewotICAgICAgICBNYXJrZXJUeXBlW10gc3VwZXJzID0gZ2V0U3VwZXJ0eXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVycy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgTWFya2VyVHlwZSBzdXAgPSBzdXBlcnNbaV07Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdC5jb250YWlucyhzdXApKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChzdXApOwotICAgICAgICAgICAgICAgIHN1cC5nZXRBbGxTdXBlcnR5cGVzKHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXJrZXIgdHlwZSBpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoaXMgbWFya2VyIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIGxhYmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGVzIHdoaWNoIGhhdmUgdGhpcyB0eXBlIGFzIGEgZGlyZWN0IHN1cGVydHlwZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGRpcmVjdCBzdWJ0eXBlcyBvZiB0aGlzIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFya2VyVHlwZVtdIGdldFN1YnR5cGVzKCkgewotICAgICAgICBNYXJrZXJUeXBlW10gdHlwZXMgPSBtb2RlbC5nZXRUeXBlcygpOwotICAgICAgICBBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBNYXJrZXJUeXBlIHR5cGUgPSB0eXBlc1tpXTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHN1cGVycyA9IHR5cGUuZ2V0U3VwZXJ0eXBlSWRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN1cGVycy5sZW5ndGg7ICsraikgewotICAgICAgICAgICAgICAgIGlmIChzdXBlcnNbal0uZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE1hcmtlclR5cGVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IE1hcmtlclR5cGVbcmVzdWx0LnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXJrZXJUeXBlW10gZ2V0QWxsU3ViVHlwZXMoKSB7Ci0gICAgICAgIExpc3Qgc3ViVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFkZFN1YlR5cGVzKHN1YlR5cGVzLCB0aGlzKTsKLSAgICAgICAgTWFya2VyVHlwZVtdIHN1YnMgPSBuZXcgTWFya2VyVHlwZVtzdWJUeXBlcy5zaXplKCldOwotICAgICAgICBzdWJUeXBlcy50b0FycmF5KHN1YnMpOwotICAgICAgICByZXR1cm4gc3ViczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkU3ViVHlwZXMoTGlzdCBsaXN0LCBNYXJrZXJUeXBlIHN1cGVyVHlwZSkgewotICAgICAgICBNYXJrZXJUeXBlW10gc3ViVHlwZXMgPSBzdXBlclR5cGUuZ2V0U3VidHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgTWFya2VyVHlwZSBzdWJUeXBlID0gc3ViVHlwZXNbaV07Ci0gICAgICAgICAgICBpZiAoIWxpc3QuY29udGFpbnMoc3ViVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChzdWJUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFN1YlR5cGVzKGxpc3QsIHN1YlR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFya2VyIHR5cGUgaWRzIGZvciB0aGlzIHR5cGUncyBzdXBlcnR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdXBlcnR5cGVJZHMoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlcnR5cGVJZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHR5cGUncyBkaXJlY3Qgc3VwZXJ0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFya2VyVHlwZVtdIGdldFN1cGVydHlwZXMoKSB7Ci0gICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJ0eXBlSWRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBNYXJrZXJUeXBlIHN1cCA9IG1vZGVsLmdldFR5cGUoc3VwZXJ0eXBlSWRzW2ldKTsKLSAgICAgICAgICAgIGlmIChzdXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoc3VwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE1hcmtlclR5cGVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IE1hcmtlclR5cGVbcmVzdWx0LnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hcmtlciB0eXBlIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJ0eXBlIG9mCi0gICAgICogdGhlIGdpdmVuIG1hcmtlciB0eXBlLiAKLSAgICAgKgotICAgICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPmlmIHRoaXMgdHlwZSBpcyB0aGUgc2FtZSBhcyAob3IgYSBzdWJ0eXBlIG9mKSB0aGUgZ2l2ZW4gdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU3VidHlwZU9mKE1hcmtlclR5cGUgc3VwZXJUeXBlKSB7Ci0gICAgICAgIGlmIChpZC5lcXVhbHMoc3VwZXJUeXBlLmdldElkKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVydHlwZUlkcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgTWFya2VyVHlwZSBzdXAgPSBtb2RlbC5nZXRUeXBlKHN1cGVydHlwZUlkc1tpXSk7Ci0gICAgICAgICAgICBpZiAoc3VwICE9IG51bGwgJiYgc3VwLmlzU3VidHlwZU9mKHN1cGVyVHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIE1hcmtlclR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoTWFya2VyVHlwZSkgb3RoZXIpLmdldElkKCkuZXF1YWxzKHRoaXMuaWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL01hcmtlclR5cGVzTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL01hcmtlclR5cGVzTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0NDJkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJUeXBlc01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIE1haW50YWlucyBhIG1vZGVsIG9mIGFsbCBrbm93biBtYXJrZXIgdHlwZXMuIEFjY2Vzc2VkIHN0YXRpY2FsbHkgYXMKLSAqIHRoZSBsaXN0IGRvZXMgbm90IGNoYW5nZSBmcmVxdWVudGx5LgotICovCi1jbGFzcyBNYXJrZXJUeXBlc01vZGVsIHsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbi4KLQkgKiBAcmV0dXJuIE1hcmtlclR5cGVzTW9kZWwKLQkgKi8KLQlzdGF0aWMgTWFya2VyVHlwZXNNb2RlbCBnZXRJbnN0YW5jZSgpewotCQlpZihpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgTWFya2VyVHlwZXNNb2RlbCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0Jc3RhdGljIE1hcmtlclR5cGVzTW9kZWwgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBNYXBzIGZyb20gbWFya2VyIHR5cGUgaWQgdG8gTWFya2VyVHlwZS4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgdHlwZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1hcmtlciB0eXBlcyBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIE1hcmtlclR5cGVzTW9kZWwoKSB7Ci0JCXR5cGVzID0gcmVhZFR5cGVzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFya2VyIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhlcmUgaXMgbm8gc3VjaCBtYXJrZXIgdHlwZS4KLQkgKi8KLQlwdWJsaWMgTWFya2VyVHlwZSBnZXRUeXBlKFN0cmluZyBpZCkgewotCQlyZXR1cm4gKE1hcmtlclR5cGUpIHR5cGVzLmdldChpZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwga25vd24gbWFya2VyIHR5cGVzLgotCSAqLwotCXB1YmxpYyBNYXJrZXJUeXBlW10gZ2V0VHlwZXMoKSB7Ci0JCU1hcmtlclR5cGVbXSByZXN1bHQgPSBuZXcgTWFya2VyVHlwZVt0eXBlcy5zaXplKCldOwotCQl0eXBlcy52YWx1ZXMoKS50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBnaXZlbiBtYXJrZXIgdHlwZS4gV29ya2Fyb3VuZCB1bnRpbCB3ZSBoYXZlCi0JICogbGFiZWxzIGluIFhNTC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRXZWxsS25vd25MYWJlbChTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZS5lcXVhbHMoSU1hcmtlci5QUk9CTEVNKSkKLQkJCXJldHVybiAiUHJvYmxlbSI7Ly8kTk9OLU5MUy0xJAotCQlpZiAodHlwZS5lcXVhbHMoSU1hcmtlci5UQVNLKSkKLQkJCXJldHVybiAiVGFzayI7Ly8kTk9OLU5MUy0xJAotCQlpZiAodHlwZS5lcXVhbHMoIm9yZy5lY2xpcHNlLmpkdC5jb3JlLnByb2JsZW0iKSkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gIkphdmEgUHJvYmxlbSI7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgbWFya2VyIHR5cGVzIGZyb20gdGhlIHJlZ2lzdHJ5LgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCByZWFkVHlwZXMoKSB7Ci0JCUhhc2hNYXAgdHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkKLQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoUmVzb3VyY2VzUGx1Z2luLlBJX1JFU09VUkNFUywKLQkJCQkJCVJlc291cmNlc1BsdWdpbi5QVF9NQVJLRVJTKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCS8vIEdhdGhlciBhbGwgcmVnaXN0ZXJlZCBtYXJrZXIgdHlwZXMuCi0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7ICsraSkgewotCQkJCUlFeHRlbnNpb24gZXh0ID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgaWQgPSBleHQuZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCQkJCVN0cmluZyBsYWJlbCA9IGV4dC5nZXRMYWJlbCgpOwotCQkJCWlmIChsYWJlbC5lcXVhbHMoIiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQlsYWJlbCA9IGdldFdlbGxLbm93bkxhYmVsKGlkKTsKLQkJCQl9Ci0JCQkJQXJyYXlMaXN0IHN1cGVyc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHQKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgKytqKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbHQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJaWYgKGVsdC5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgic3VwZXIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBzdXAgPSBlbHQuZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHN1cCAhPSBudWxsKSB7Ci0JCQkJCQkJc3VwZXJzTGlzdC5hZGQoc3VwKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlTdHJpbmdbXSBzdXBlclR5cGVzID0gbmV3IFN0cmluZ1tzdXBlcnNMaXN0LnNpemUoKV07Ci0JCQkJc3VwZXJzTGlzdC50b0FycmF5KHN1cGVyVHlwZXMpOwotCQkJCU1hcmtlclR5cGUgdHlwZSA9IG5ldyBNYXJrZXJUeXBlKHRoaXMsIGlkLCBsYWJlbCwgc3VwZXJUeXBlcyk7Ci0JCQkJdHlwZXMucHV0KGlkLCB0eXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyVmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzdmNjMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL01hcmtlclZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5oZWxwLkhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaGVscC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5oZWxwLklDb250ZXh0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLk9wZW5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuWE1MTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Db250cmlidXRpb25JdGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NYXJrZXJUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlNob3dJbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuVmlld1ByZWZlcmVuY2VzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLldvcmtiZW5jaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy50YXNrbGlzdC5JVGFza0xpc3RSZXNvdXJjZUFkYXB0ZXI7Ci0KLS8qKgotICogTWFya2VyVmlldyBpcyB0aGUgYWJzdHJhY3Qgc3VwZXIgY2xhc3Mgb2YgdGhlIG1hcmtlciBiYXNlZCB2aWV3cy4KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFya2VyVmlldyBleHRlbmRzIFRhYmxlVmlldyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NFTEVDVElPTiA9ICJzZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX01BUktFUiA9ICJtYXJrZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFU09VUkNFID0gInJlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRklMVEVSU19TRUNUSU9OID0gImZpbHRlcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0ZJTFRFUl9FTlRSWSA9ICJmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVOVV9GSUxURVJTX0dST1VQID0gImdyb3VwLmZpbHRlciI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlVfU0hPV19JTl9HUk9VUCA9ICJncm91cC5zaG93SW4iOy8vJE5PTi1OTFMtMSQKLQotCS8vIFNlY3Rpb24gZnJvbSBhIDMuMSBvciBlYXJsaWVyIHdvcmtiZW5jaAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfRklMVEVSX1NFQ1RJT04gPSAiZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBjbGFzcyBNYXJrZXJQcm9jZXNzSm9iIGV4dGVuZHMgSm9iIHsKLQotCQkvKioKLQkJICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkJICovCi0JCU1hcmtlclByb2Nlc3NKb2IoKSB7Ci0JCQlzdXBlcihNYXJrZXJNZXNzYWdlcy5NYXJrZXJWaWV3X3Byb2Nlc3NVcGRhdGVzKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJfQotCi0JCWJvb2xlYW4gYnVpbGREb25lID0gdHJ1ZTsKLQotCQlwcml2YXRlIENvbGxlY3Rpb24gcmVmcmVzaGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXByaXZhdGUgQ29sbGVjdGlvbiBhZGRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXByaXZhdGUgQ29sbGVjdGlvbiByZW1vdmVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXByaXZhdGUgT2JqZWN0IHVwZGF0ZUtleSA9IG5ldyBPYmplY3QoKTsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JCSAqLwotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHVwZGF0ZUtleSkgewotCQkJCQotCQkJCS8vIElmIHdlIGRvbid0IGhhdmUgYW55IHlldCB0aGVuIHJlZnJlc2ggaXQgYWxsCi0JCQkJaWYgKGdldE1hcmtlckFkYXB0ZXIoKS5oYXNOb01hcmtlcnMoKSB8fCBhZGRzLnNpemUoKSA9PSAwIHx8IHJlbW92ZXMuc2l6ZSgpID09IDApCi0JCQkJCXVwZGF0ZUpvYi5yZWZyZXNoQWxsKCk7Ci0JCQkJZWxzZSB7Ci0JCQkJCU1hcmtlckxpc3QgY3VycmVudCA9IGdldEN1cnJlbnRNYXJrZXJzKCk7Ci0JCQkJCWN1cnJlbnQudXBkYXRlTWFya2VycyhnZXRBZGRlZE1hcmtlcnMoYWRkcyksCi0JCQkJCQkJZ2V0RXhpc3RpbmdNYXJrZXJzKHJlbW92ZXMpKTsKLQkJCQkJdXBkYXRlSm9iLnJlZnJlc2gocmVmcmVzaGVzKTsKLQotCQkJCX0KLQotCQkJCWFkZHMuY2xlYXIoKTsKLQkJCQlyZW1vdmVzLmNsZWFyKCk7Ci0JCQkJcmVmcmVzaGVzLmNsZWFyKCk7Ci0JCQl9Ci0JCQl1cGRhdGVGb3JDb250ZW50c1JlZnJlc2gobW9uaXRvcik7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuV29ya2JlbmNoSm9iI3Nob3VsZFJ1bigpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCQkvL0Rvbid0IHJ1biB1bnRpbCB0aGUgY2xpcGJvYXJkIGlzIGNyZWF0ZWQgYXMgaXQgaXMgdGhlIGxhc3Qgd2lkZ2V0Ci0JCQlyZXR1cm4gY2xpcGJvYXJkICE9IG51bGwgJiYgYnVpbGREb25lOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCB0aGUgY29sbGVjdGlvbiBvZiBNYXJrZXJzIHRvIHJlbW92ZS4KLQkJICogCi0JCSAqIEBwYXJhbSBleGlzdGluZ01hcmtlcnMKLQkJICogQHJldHVybiBDb2xsZWN0aW9uIG9mIENvbmNyZXRlTWFya2VyCi0JCSAqLwotCQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0RXhpc3RpbmdNYXJrZXJzKENvbGxlY3Rpb24gZXhpc3RpbmdNYXJrZXJzKSB7Ci0JCQlpZiAoZXhpc3RpbmdNYXJrZXJzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gVXRpbC5FTVBUWV9DT0xMRUNUSU9OOwotCi0JCQlDb2xsZWN0aW9uIHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlNYXJrZXJMaXN0IGN1cnJlbnRMaXN0ID0gZ2V0Q3VycmVudE1hcmtlcnMoKTsKLQkJCUl0ZXJhdG9yIHJlbW92ZXMgPSBleGlzdGluZ01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChyZW1vdmVzLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBuZXh0ID0gY3VycmVudExpc3QuZ2V0TWFya2VyKChJTWFya2VyKSByZW1vdmVzLm5leHQoKSk7Ci0JCQkJaWYgKG5leHQgIT0gbnVsbCkKLQkJCQkJdG9SZW1vdmUuYWRkKG5leHQpOwotCQkJfQotCi0JCQlyZXR1cm4gdG9SZW1vdmU7Ci0JCX0KLQotCQkvKioKLQkJICogR2V0IHRoZSBDb25jcmV0ZU1hcmtlcnMgYmVpbmcgYWRkZWQgYWZ0ZXIgZmlsdGVyaW5nLgotCQkgKiAKLQkJICogQHBhcmFtIGFkZGVkTWFya2VycwotCQkgKiAgICAgICAgICAgIENvbGxlY3Rpb24gb2YgSU1hcmtlcgotCQkgKiBAcmV0dXJuIENvbGxlY3Rpb24gb2YgQ29uY3JldGVNYXJrZXIKLQkJICovCi0JCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRBZGRlZE1hcmtlcnMoQ29sbGVjdGlvbiBhZGRlZE1hcmtlcnMpIHsKLQkJCWlmIChhZGRlZE1hcmtlcnMuaXNFbXB0eSgpKQotCQkJCXJldHVybiBVdGlsLkVNUFRZX0NPTExFQ1RJT047Ci0KLQkJCUxpc3QgdG9BZGQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCUl0ZXJhdG9yIGFkZGVkID0gYWRkZWRNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCQlNYXJrZXJGaWx0ZXJbXSBmaWx0ZXJzID0gZ2V0RW5hYmxlZEZpbHRlcnMoKTsKLQkJCXdoaWxlIChhZGRlZC5oYXNOZXh0KCkpIHsKLQkJCQlDb25jcmV0ZU1hcmtlciBuZXdNYXJrZXI7Ci0JCQkJdHJ5IHsKLQkJCQkJbmV3TWFya2VyID0gTWFya2VyTGlzdC5jcmVhdGVNYXJrZXIoKElNYXJrZXIpIGFkZGVkLm5leHQoKSk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGZpbHRlcnNbaV0uc2VsZWN0KG5ld01hcmtlcikpCi0JCQkJCQkJdG9BZGQuYWRkKG5ld01hcmtlcik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gdG9BZGQ7Ci0JCX0KLQotCQkvKioKLQkJICogUmVmcmVzaCBhbGwgb2YgdGhlIGNvbnRlbnRzIG9mIGNoYW5nZWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gY2hhbmdlZAotCQkgKiAgICAgICAgICAgIENvbGxlY3Rpb24gb2YgQ29uY3JldGVNYXJrZXIKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZnJlc2goQ29sbGVjdGlvbiBjaGFuZ2VkKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHVwZGF0ZUtleSkgewotCQkJCXJlZnJlc2hlcy5hZGRBbGwoY2hhbmdlZCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIGFsbCBvZiB0aGUgY29udGVudHMgb2YgY2hhbmdlZC4KLQkJICogCi0JCSAqIEBwYXJhbSBhZGRlZE1hcmtlcnMKLQkJICogICAgICAgICAgICBDb2xsZWN0aW9uIG9mIENvbmNyZXRlTWFya2VyCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGQoQ29sbGVjdGlvbiBhZGRlZE1hcmtlcnMpIHsKLQkJCXN5bmNocm9uaXplZCAodXBkYXRlS2V5KSB7Ci0JCQkJYWRkcy5hZGRBbGwoYWRkZWRNYXJrZXJzKTsKLQkJCQlyZWZyZXNoZXMucmVtb3ZlQWxsKGFkZGVkTWFya2Vycyk7Ci0JCQl9Ci0KLQkJfQotCi0JCS8qKgotCQkgKiBSZW1vdmUgYWxsIG9mIHRoZSBjb250ZW50cyBvZiBjaGFuZ2VkLgotCQkgKiAKLQkJICogQHBhcmFtIHJlbW92ZWRNYXJrZXJzCi0JCSAqICAgICAgICAgICAgQ29sbGVjdGlvbiBvZiBDb25jcmV0ZU1hcmtlcgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlKENvbGxlY3Rpb24gcmVtb3ZlZE1hcmtlcnMpIHsKLQkJCXN5bmNocm9uaXplZCAodXBkYXRlS2V5KSB7Ci0JCQkJcmVtb3Zlcy5hZGRBbGwocmVtb3ZlZE1hcmtlcnMpOwotCQkJCXJlZnJlc2hlcy5yZW1vdmVBbGwocmVtb3ZlZE1hcmtlcnMpOwotCQkJCWFkZHMucmVtb3ZlQWxsKHJlbW92ZWRNYXJrZXJzKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JTWFya2VyUHJvY2Vzc0pvYiBtYXJrZXJQcm9jZXNzSm9iID0gbmV3IE1hcmtlclByb2Nlc3NKb2IoKTsKLQotCXByaXZhdGUgY2xhc3MgVXBkYXRlSm9iIGV4dGVuZHMgV29ya2JlbmNoSm9iIHsKLQotCQlib29sZWFuIGJ1aWxkRG9uZSA9IHRydWU7Ci0KLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIHBlbmRpbmdNYXJrZXJVcGRhdGVzID0gQ29sbGVjdGlvbnMKLQkJCQkuc3luY2hyb25pemVkU2V0KG5ldyBIYXNoU2V0KCkpOwotCi0JCWJvb2xlYW4gcmVmcmVzaEFsbCA9IGZhbHNlOwotCi0JCVVwZGF0ZUpvYigpIHsKLQkJCXN1cGVyKE1hcmtlck1lc3NhZ2VzLk1hcmtlclZpZXdfcXVldWVpbmdfdXBkYXRlcyk7Ci0JCX0KLQotCQkvKioKLQkJICogUmVmcmVzaCB0aGUgY2hhbmdlZCBsaXN0LgotCQkgKiAKLQkJICogQHBhcmFtIGNoYW5nZWQKLQkJICovCi0JCXZvaWQgcmVmcmVzaChDb2xsZWN0aW9uIGNoYW5nZWQpIHsKLQkJCWlmIChyZWZyZXNoQWxsKQotCQkJCXJldHVybjsKLQkJCXBlbmRpbmdNYXJrZXJVcGRhdGVzLmFkZEFsbChjaGFuZ2VkKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZWZyZXNoIHRoZSB3aG9sZSB2aWV3Ci0JCSAqLwotCQl2b2lkIHJlZnJlc2hBbGwoKSB7Ci0JCQlyZWZyZXNoQWxsID0gdHJ1ZTsKLQkJCXBlbmRpbmdNYXJrZXJVcGRhdGVzLmNsZWFyKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iI3J1bkluVUlUaHJlYWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JCSAqLwotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCQlpZiAoZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0KLQkJCWlmIChyZWZyZXNoQWxsKSB7Ci0JCQkJZ2V0Vmlld2VyKCkucmVmcmVzaCh0cnVlKTsKLQkJCQlyZWZyZXNoQWxsID0gZmFsc2U7Ci0KLQkJCX0gZWxzZSBpZiAoIXBlbmRpbmdNYXJrZXJVcGRhdGVzLmlzRW1wdHkoKSkgewotCQkJCU9iamVjdFtdIG1hcmtlcnMgPSBwZW5kaW5nTWFya2VyVXBkYXRlcy50b0FycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWdldFZpZXdlcigpLnJlZnJlc2gobWFya2Vyc1tpXSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCXBlbmRpbmdNYXJrZXJVcGRhdGVzLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCXBlbmRpbmdNYXJrZXJVcGRhdGVzLmNsZWFyKCk7Ci0KLQkJCVRyZWUgdHJlZSA9IGdldFRyZWUoKTsKLQotCQkJaWYgKHRyZWUgIT0gbnVsbCAmJiAhdHJlZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQl1cGRhdGVTdGF0dXNNZXNzYWdlKCk7Ci0JCQkJdXBkYXRlVGl0bGUoKTsKLQkJCQkvLyBFeHBhbmQgYWxsIGlmIHRoZSBsaXN0IGlzIHNtYWxsCi0JCQkJaWYgKGdldEN1cnJlbnRNYXJrZXJzKCkuZ2V0U2l6ZSgpIDwgMjApCi0JCQkJCWdldFZpZXdlcigpLmV4cGFuZEFsbCgpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgVXBkYXRlSm9iIHVwZGF0ZUpvYiA9IG5ldyBVcGRhdGVKb2IoKTsKLQotCS8vIEEgcHJpdmF0ZSBmaWVsZCBmb3Iga2VlcGluZyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIG1hcmtlcnMKLQkvLyBiZWZvcmUgdGhlIGJ1c3kgdGVzdGluZyBzdGFydGVkCi0JcHJpdmF0ZSBpbnQgcHJlQnVzeU1hcmtlcnMgPSAwOwotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGZvY3VzRWxlbWVudHM7Ci0KLQlwcml2YXRlIENsaXBib2FyZCBjbGlwYm9hcmQ7Ci0KLQlJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBtYXJrZXJVcGRhdGVMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJU3RyaW5nW10gbWFya2VyVHlwZXMgPSBnZXRNYXJrZXJUeXBlcygpOwotCQkJQ29sbGVjdGlvbiBjaGFuZ2VkTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUNvbGxlY3Rpb24gYWRkZWRNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQ29sbGVjdGlvbiByZW1vdmVkTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQpIHsKLQkJCQltYXJrZXJQcm9jZXNzSm9iLmJ1aWxkRG9uZSA9IGZhbHNlOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEKSB7Ci0JCQkJbWFya2VyUHJvY2Vzc0pvYi5idWlsZERvbmUgPSB0cnVlOwotCQkJCXNjaGVkdWxlTWFya2VyVXBkYXRlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlmb3IgKGludCBpZHggPSAwOyBpZHggPCBtYXJrZXJUeXBlcy5sZW5ndGg7IGlkeCsrKSB7Ci0JCQkJSU1hcmtlckRlbHRhW10gbWFya2VyRGVsdGFzID0gZXZlbnQuZmluZE1hcmtlckRlbHRhcygKLQkJCQkJCW1hcmtlclR5cGVzW2lkeF0sIHRydWUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyRGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXJEZWx0YSBkZWx0YSA9IG1hcmtlckRlbHRhc1tpXTsKLQkJCQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0KLQkJCQkJaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJCQkJY2hhbmdlZE1hcmtlcnMuYWRkKGRlbHRhLmdldE1hcmtlcigpKTsKLQkJCQkJfQotCQkJCQlpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkgewotCQkJCQkJYWRkZWRNYXJrZXJzLmFkZChkZWx0YS5nZXRNYXJrZXIoKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkJcmVtb3ZlZE1hcmtlcnMuYWRkKGRlbHRhLmdldE1hcmtlcigpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCi0JCQlpZiAoIWNoYW5nZWRNYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCU1hcmtlckxpc3QgY2hhbmdlZCA9IGdldEN1cnJlbnRNYXJrZXJzKCkuZmluZE1hcmtlcnMoCi0JCQkJCQljaGFuZ2VkTWFya2Vycyk7Ci0JCQkJaWYgKGNoYW5nZWQuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQkJCWNoYW5nZWQucmVmcmVzaCgpOwotCQkJCQltYXJrZXJQcm9jZXNzSm9iLnJlZnJlc2goY2hhbmdlZC5hc0xpc3QoKSk7Ci0JCQkJCXNjaGVkdWxlTWFya2VyVXBkYXRlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoYWRkZWRNYXJrZXJzLnNpemUoKSA+IDAgfHwgcmVtb3ZlZE1hcmtlcnMuc2l6ZSgpID4gMCkgewotCQkJCW1hcmtlclByb2Nlc3NKb2IuYWRkKGFkZGVkTWFya2Vycyk7Ci0JCQkJbWFya2VyUHJvY2Vzc0pvYi5yZW1vdmUocmVtb3ZlZE1hcmtlcnMpOwotCi0JCQkJc2NoZWR1bGVNYXJrZXJVcGRhdGUoKTsKLQkJCX0KLQotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBjbGFzcyBDb250ZXh0UHJvdmlkZXIgaW1wbGVtZW50cyBJQ29udGV4dFByb3ZpZGVyIHsKLQkJcHVibGljIGludCBnZXRDb250ZXh0Q2hhbmdlTWFzaygpIHsKLQkJCXJldHVybiBTRUxFQ1RJT047Ci0JCX0KLQotCQlwdWJsaWMgSUNvbnRleHQgZ2V0Q29udGV4dChPYmplY3QgdGFyZ2V0KSB7Ci0JCQlTdHJpbmcgY29udGV4dElkID0gbnVsbDsKLQkJCS8vIFNlZSBpZiB0aGVyZSBpcyBhIGNvbnRleHQgcmVnaXN0ZXJlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0JCQlDb25jcmV0ZU1hcmtlciBtYXJrZXIgPSAoQ29uY3JldGVNYXJrZXIpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFZpZXdlcigpCi0JCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAobWFya2VyICE9IG51bGwpIHsKLQkJCQljb250ZXh0SWQgPSBJREUuZ2V0TWFya2VySGVscFJlZ2lzdHJ5KCkuZ2V0SGVscCgKLQkJCQkJCW1hcmtlci5nZXRNYXJrZXIoKSk7Ci0JCQl9Ci0KLQkJCWlmIChjb250ZXh0SWQgPT0gbnVsbCkgewotCQkJCWNvbnRleHRJZCA9IGdldFN0YXRpY0NvbnRleHRJZCgpOwotCQkJfQotCQkJcmV0dXJuIEhlbHBTeXN0ZW0uZ2V0Q29udGV4dChjb250ZXh0SWQpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTZWFyY2hFeHByZXNzaW9uKE9iamVjdCB0YXJnZXQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb250ZXh0UHJvdmlkZXIgY29udGV4dFByb3ZpZGVyID0gbmV3IENvbnRleHRQcm92aWRlcigpOwotCi0JcHJvdGVjdGVkIEFjdGlvbkNvcHlNYXJrZXIgY29weUFjdGlvbjsKLQotCXByb3RlY3RlZCBBY3Rpb25QYXN0ZU1hcmtlciBwYXN0ZUFjdGlvbjsKLQotCXByb3RlY3RlZCBTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiByZXZlYWxBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24gb3BlbkFjdGlvbjsKLQotCXByb3RlY3RlZCBTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiBkZWxldGVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24gc2VsZWN0QWxsQWN0aW9uOwotCi0JcHJvdGVjdGVkIFNlbGVjdGlvblByb3ZpZGVyQWN0aW9uIHByb3BlcnRpZXNBY3Rpb247Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25MaXN0ZW5lciBmb2N1c0xpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJTWFya2VyVmlldy50aGlzLmZvY3VzU2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgaW50IHRvdGFsTWFya2VycyA9IDA7Ci0KLQkvLyBXb3JrYmVuY2hKb2IgY291bnRVcGRhdGVKb2I7Ci0KLQlwcml2YXRlIE1hcmtlckZpbHRlcltdIG1hcmtlckZpbHRlcnMgPSBuZXcgTWFya2VyRmlsdGVyWzBdOwotCi0JLy8gQSBjYWNoZSBvZiB0aGUgZW5hYmxlZCBmaWx0ZXJzCi0JcHJpdmF0ZSBNYXJrZXJGaWx0ZXJbXSBlbmFibGVkRmlsdGVycyA9IG51bGw7Ci0KLQlwcml2YXRlIE1lbnVNYW5hZ2VyIGZpbHRlcnNNZW51OwotCi0JcHJpdmF0ZSBNZW51TWFuYWdlciBzaG93SW5NZW51OwotCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB3b3JraW5nU2V0TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnQgbWFya2VycyBmb3IgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEByZXR1cm4gTWFya2VyTGlzdAotCSAqLwotCXB1YmxpYyBNYXJrZXJMaXN0IGdldEN1cnJlbnRNYXJrZXJzKCkgewotCQlyZXR1cm4gZ2V0TWFya2VyQWRhcHRlcigpLmdldEN1cnJlbnRNYXJrZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBtYXJrZXIgYWRhcHRlciBmb3IgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEByZXR1cm4gTWFya2VyQWRhcHRlcgotCSAqLwotCXByb3RlY3RlZCBNYXJrZXJBZGFwdGVyIGdldE1hcmtlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoKE1hcmtlckFkYXB0ZXIpIGdldFZpZXdlcklucHV0KCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBmb3IgdGhlIGNoYW5nZSBpbiB0aGUgY29udGVudHMuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVGb3JDb250ZW50c1JlZnJlc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldE1hcmtlckFkYXB0ZXIoKS5idWlsZEFsbE1hcmtlcnMobW9uaXRvcik7Ci0JCWdldFByb2dyZXNzU2VydmljZSgpLnNjaGVkdWxlKHVwZGF0ZUpvYik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JTWVtZW50bykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlLCBJTWVtZW50byBtZW1lbnRvKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUsIG1lbWVudG8pOwotCQlJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSBwcm9ncmVzc1NlcnZpY2UgPSBnZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJaWYgKHByb2dyZXNzU2VydmljZSAhPSBudWxsKSB7Ci0JCQlnZXRQcm9ncmVzc1NlcnZpY2UoKS5zaG93QnVzeUZvckZhbWlseSgKLQkJCQkJUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpOwotCQkJZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuc2hvd0J1c3lGb3JGYW1pbHkoCi0JCQkJCVJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCk7Ci0JCX0KLQkJbG9hZEZpbHRlcnNQcmVmZXJlbmNlcygpOwotCi0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgZmlsdGVycyBwcmVmZXJlbmNlLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRmlsdGVyc1ByZWZlcmVuY2VzKCkgewotCi0JCVN0cmluZyBwcmVmZXJlbmNlID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoZ2V0RmlsdGVyc1ByZWZlcmVuY2VOYW1lKCkpOwotCi0JCWlmIChwcmVmZXJlbmNlLmVxdWFscyhJUHJlZmVyZW5jZVN0b3JlLlNUUklOR19ERUZBVUxUX0RFRkFVTFQpKSB7Ci0JCQljcmVhdGVEZWZhdWx0RmlsdGVyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihwcmVmZXJlbmNlKTsKLQkJdHJ5IHsKLQkJCXJlc3RvcmVGaWx0ZXJzKFhNTE1lbWVudG8uY3JlYXRlUmVhZFJvb3QocmVhZGVyKSk7Ci0JCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0JCQlJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVXBkYXRlIGZvciBmaWx0ZXIgY2hhbmdlcy4gU2F2ZSB0aGUgcHJlZmVyZW5jZSBhbmQgY2xlYXIgdGhlIGVuYWJsZWQKLQkgKiBjYWNoZS4KLQkgKi8KLQl2b2lkIHVwZGF0ZUZvckZpbHRlckNoYW5nZXMoKSB7Ci0KLQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoVEFHX0ZJTFRFUlNfU0VDVElPTik7Ci0KLQkJTWFya2VyRmlsdGVyW10gZmlsdGVycyA9IGdldFVzZXJGaWx0ZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKFRBR19GSUxURVJfRU5UUlksIGZpbHRlcnNbaV0KLQkJCQkJLmdldE5hbWUoKSk7Ci0JCQlmaWx0ZXJzW2ldLnNhdmVGaWx0ZXJTZXR0aW5ncyhjaGlsZCk7Ci0JCX0KLQotCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQl0cnkgewotCQkJbWVtZW50by5zYXZlKHdyaXRlcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUlERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKFV0aWwuZXJyb3JTdGF0dXMoZSkpOwotCQl9Ci0KLQkJSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5wdXRWYWx1ZSgKLQkJCQlnZXRGaWx0ZXJzUHJlZmVyZW5jZU5hbWUoKSwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCQlJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCWNsZWFyRW5hYmxlZEZpbHRlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpbHRlcnMgcHJlZmVyZW5jZSBmb3IgaW5zdGFuY2VzIG9mIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCWFic3RyYWN0IFN0cmluZyBnZXRGaWx0ZXJzUHJlZmVyZW5jZU5hbWUoKTsKLQotCS8qKgotCSAqIFJlc3RvcmUgdGhlIGZpbHRlcnMgZnJvbSB0aGUgbWltZW50by4KLQkgKiAKLQkgKiBAcGFyYW0gbWVtZW50bwotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlRmlsdGVycyhJTWVtZW50byBtZW1lbnRvKSB7Ci0KLQkJSU1lbWVudG9bXSBzZWN0aW9ucyA9IG51bGw7Ci0JCWlmIChtZW1lbnRvICE9IG51bGwpCi0JCQlzZWN0aW9ucyA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oVEFHX0ZJTFRFUl9FTlRSWSk7Ci0KLQkJaWYgKHNlY3Rpb25zID09IG51bGwpIHsKLQkJCS8vIENoZWNrIGlmIHdlIGhhdmUgYW4gb2xkIGZpbHRlciBzZXR0aW5nIGFyb3VuZAotCQkJSURpYWxvZ1NldHRpbmdzIG1haW5TZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlJRGlhbG9nU2V0dGluZ3MgZmlsdGVyc1NlY3Rpb24gPSBtYWluU2V0dGluZ3MKLQkJCQkJLmdldFNlY3Rpb24oT0xEX0ZJTFRFUl9TRUNUSU9OKTsKLQkJCWlmIChmaWx0ZXJzU2VjdGlvbiAhPSBudWxsKSB7Ci0JCQkJTWFya2VyRmlsdGVyIG1hcmtlckZpbHRlciA9IGNyZWF0ZUZpbHRlcihNYXJrZXJNZXNzYWdlcy5NYXJrZXJGaWx0ZXJfZGVmYXVsdEZpbHRlck5hbWUpOwotCQkJCW1hcmtlckZpbHRlci5yZXN0b3JlRmlsdGVyU2V0dGluZ3MoZmlsdGVyc1NlY3Rpb24pOwotCQkJCXNldEZpbHRlcnMobmV3IE1hcmtlckZpbHRlcltdIHsgbWFya2VyRmlsdGVyIH0pOwotCQkJfQotCi0JCX0gZWxzZSB7Ci0JCQlNYXJrZXJGaWx0ZXJbXSBuZXdGaWx0ZXJzID0gbmV3IE1hcmtlckZpbHRlcltzZWN0aW9ucy5sZW5ndGhdOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbmV3RmlsdGVyc1tpXSA9IGNyZWF0ZUZpbHRlcihzZWN0aW9uc1tpXS5nZXRJRCgpKTsKLQkJCQluZXdGaWx0ZXJzW2ldLnJlc3RvcmVTdGF0ZShzZWN0aW9uc1tpXSk7Ci0JCQl9Ci0JCQlzZXRGaWx0ZXJzKG5ld0ZpbHRlcnMpOwotCQl9Ci0KLQkJaWYgKG1hcmtlckZpbHRlcnMubGVuZ3RoID09IDApIHsvLyBNYWtlIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3QgYSBkZWZhdWx0Ci0JCQljcmVhdGVEZWZhdWx0RmlsdGVyKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGRlZmF1bHQgZmlsdGVyIGZvciB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRGaWx0ZXIoKSB7Ci0JCU1hcmtlckZpbHRlciBmaWx0ZXIgPSBjcmVhdGVGaWx0ZXIoTWFya2VyTWVzc2FnZXMuTWFya2VyRmlsdGVyX2RlZmF1bHRGaWx0ZXJOYW1lKTsKLQkJc2V0RmlsdGVycyhuZXcgTWFya2VyRmlsdGVyW10geyBmaWx0ZXIgfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgZmlsdGVyIGNhbGxlZCBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBNYXJrZXJGaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTWFya2VyRmlsdGVyIGNyZWF0ZUZpbHRlcihTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lbWVudG8gdGFnIGZvciB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFNlY3Rpb25UYWcoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MuaW50ZXJuYWwudGFibGV2aWV3LlRhYmxlVmlldyNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCi0JCWluaXREcmFnQW5kRHJvcCgpOwotCi0JCWdldFNpdGUoKS5nZXRQYWdlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZm9jdXNMaXN0ZW5lcik7Ci0JCWZvY3VzU2VsZWN0aW9uQ2hhbmdlZChnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZVBhcnQoKSwgZ2V0U2l0ZSgpCi0JCQkJLmdldFBhZ2UoKS5nZXRTZWxlY3Rpb24oKSk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAotCQkJCW1hcmtlclVwZGF0ZUxpc3RlbmVyLAotCQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFCi0JCQkJCQl8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRAotCQkJCQkJfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpCi0JCQkJLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZ2V0V29ya2luZ1NldExpc3RlbmVyKCkpOwotCi0JCS8vIFNldCBoZWxwIG9uIHRoZSB2aWV3IGl0c2VsZgotCQlnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuYWRkSGVscExpc3RlbmVyKG5ldyBIZWxwTGlzdGVuZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyI2hlbHBSZXF1ZXN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGhlbHBSZXF1ZXN0ZWQoSGVscEV2ZW50IGUpIHsKLQkJCQlJQ29udGV4dCBjb250ZXh0ID0gY29udGV4dFByb3ZpZGVyLmdldENvbnRleHQoZ2V0Vmlld2VyKCkKLQkJCQkJCS5nZXRDb250cm9sKCkpOwotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLmRpc3BsYXlIZWxwKGNvbnRleHQpOwotCQkJfQotCQl9KTsKLQotCQkvL1RoaXMgaXMgY3JlYXRlZCBsYXN0IGFzIHRoZSB1cGRhdGVzIGFyZSBibG9ja2VkIHVudGlsIGl0IGlzCi0JCS8vY3JlYXRlZC4gSWYgdGhpcyBpcyBkZWxldGVkIGJlIHN1cmUgdGhlcmUgaXMgc3RpbGwgYSBtZWNoYW5pc20KLQkJLy90byBibG9jayB0aGUgdXBkYXRlcy4KLQkJLy9Ac2VlIE1hcmtlclByb2Nlc3NKb2Ijc2hvdWxkUnVuCi0JCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRhYmxlKSB7Ci0JCWlmIChhZGFwdGFibGUuZXF1YWxzKElDb250ZXh0UHJvdmlkZXIuY2xhc3MpKQotCQkJcmV0dXJuIGNvbnRleHRQcm92aWRlcjsKLQkJaWYgKGFkYXB0YWJsZS5lcXVhbHMoSVNob3dJblNvdXJjZS5jbGFzcykpIHsKLQkJCXJldHVybiBuZXcgSVNob3dJblNvdXJjZSgpIHsKLQkJCQlwdWJsaWMgU2hvd0luQ29udGV4dCBnZXRTaG93SW5Db250ZXh0KCkgewotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCQlJdGVyYXRvciBtYXJrZXJJdGVyYXRvciA9IHN0cnVjdHVyZWQuaXRlcmF0b3IoKTsKLQkJCQkJTGlzdCBuZXdTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXdoaWxlIChtYXJrZXJJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCUNvbmNyZXRlTWFya2VyIGVsZW1lbnQgPSAoQ29uY3JldGVNYXJrZXIpIG1hcmtlckl0ZXJhdG9yCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQluZXdTZWxlY3Rpb24uYWRkKGVsZW1lbnQuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG5ldyBTaG93SW5Db250ZXh0KGdldFZpZXdlcigpLmdldElucHV0KCksCi0JCQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKSk7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0YWJsZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLlRhYmxlVmlldyN2aWV3ZXJTZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlld2VyU2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotCQl1cGRhdGVTdGF0dXNNZXNzYWdlKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5pbnRlcm5hbC50YWJsZXZpZXcuVGFibGVWaWV3I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigKLQkJCQltYXJrZXJVcGRhdGVMaXN0ZW5lcik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2luZ1NldE1hbmFnZXIoKQotCQkJCS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHdvcmtpbmdTZXRMaXN0ZW5lcik7Ci0JCWdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoZm9jdXNMaXN0ZW5lcik7Ci0KLQkJLy8gZGlzcG9zZSBvZiBzZWxlY3Rpb24gcHJvdmlkZXIgYWN0aW9ucyAobWF5IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCB5ZXQKLQkJLy8gaWYKLQkJLy8gY3JlYXRlUGFydENvbnRyb2xzIHdhcyBuZXZlciBjYWxsZWQpCi0JCWlmIChvcGVuQWN0aW9uICE9IG51bGwpIHsKLQkJCW9wZW5BY3Rpb24uZGlzcG9zZSgpOwotCQkJY29weUFjdGlvbi5kaXNwb3NlKCk7Ci0JCQlzZWxlY3RBbGxBY3Rpb24uZGlzcG9zZSgpOwotCQkJZGVsZXRlQWN0aW9uLmRpc3Bvc2UoKTsKLQkJCXJldmVhbEFjdGlvbi5kaXNwb3NlKCk7Ci0JCQlwcm9wZXJ0aWVzQWN0aW9uLmRpc3Bvc2UoKTsKLQkJCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0KLQkJfQotCQlpZiAoc2hvd0luTWVudSAhPSBudWxsKQotCQkJc2hvd0luTWVudS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5pbnRlcm5hbC50YWJsZXZpZXcuVGFibGVWaWV3I2NyZWF0ZUFjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXJldmVhbEFjdGlvbiA9IG5ldyBBY3Rpb25SZXZlYWxNYXJrZXIodGhpcywgZ2V0Vmlld2VyKCkpOwotCQlvcGVuQWN0aW9uID0gbmV3IEFjdGlvbk9wZW5NYXJrZXIodGhpcywgZ2V0Vmlld2VyKCkpOwotCQljb3B5QWN0aW9uID0gbmV3IEFjdGlvbkNvcHlNYXJrZXIodGhpcywgZ2V0Vmlld2VyKCkpOwotCQljb3B5QWN0aW9uLnNldENsaXBib2FyZChjbGlwYm9hcmQpOwotCQljb3B5QWN0aW9uLnNldFByb3BlcnRpZXMoZ2V0U29ydGluZ0ZpZWxkcygpKTsKLQkJcGFzdGVBY3Rpb24gPSBuZXcgQWN0aW9uUGFzdGVNYXJrZXIodGhpcywgZ2V0Vmlld2VyKCkpOwotCQlwYXN0ZUFjdGlvbi5zZXRDbGlwYm9hcmQoY2xpcGJvYXJkKTsKLQkJcGFzdGVBY3Rpb24uc2V0UGFzdGFibGVUeXBlcyhnZXRNYXJrZXJUeXBlcygpKTsKLQkJZGVsZXRlQWN0aW9uID0gbmV3IEFjdGlvblJlbW92ZU1hcmtlcih0aGlzLCBnZXRWaWV3ZXIoKSk7Ci0JCXNlbGVjdEFsbEFjdGlvbiA9IG5ldyBBY3Rpb25TZWxlY3RBbGwodGhpcyk7Ci0KLQkJcHJvcGVydGllc0FjdGlvbiA9IG5ldyBBY3Rpb25NYXJrZXJQcm9wZXJ0aWVzKHRoaXMsIGdldFZpZXdlcigpKTsKLQotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0KLQkJc2V0RmlsdGVyQWN0aW9uKG5ldyBGaWx0ZXJzQWN0aW9uKHRoaXMpKTsKLQotCQlzZXRQcmVmZXJlbmNlc0FjdGlvbihuZXcgVmlld1ByZWZlcmVuY2VzQWN0aW9uKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5WaWV3UHJlZmVyZW5jZXNBY3Rpb24jb3BlblZpZXdQcmVmZXJlbmNlc0RpYWxvZygpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIG9wZW5WaWV3UHJlZmVyZW5jZXNEaWFsb2coKSB7Ci0JCQkJb3BlblByZWZlcmVuY2VzRGlhbG9nKGdldE1hcmtlckVuYWJsZW1lbnRQcmVmZXJlbmNlTmFtZSgpLAotCQkJCQkJZ2V0TWFya2VyTGltaXRQcmVmZXJlbmNlTmFtZSgpKTsKLQotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYSBkaWFsb2cgdG8gc2V0IHRoZSBwcmVmZXJlbmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyRW5hYmxlbWVudFByZWZlcmVuY2VOYW1lCi0JICogQHBhcmFtIG1hcmtlckxpbWl0UHJlZmVyZW5jZU5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlblByZWZlcmVuY2VzRGlhbG9nKFN0cmluZyBtYXJrZXJFbmFibGVtZW50UHJlZmVyZW5jZU5hbWUsCi0JCQlTdHJpbmcgbWFya2VyTGltaXRQcmVmZXJlbmNlTmFtZSkgewotCi0JCURpYWxvZyBkaWFsb2cgPSBuZXcgTWFya2VyVmlld1ByZWZlcmVuY2VEaWFsb2coZ2V0U2l0ZSgpCi0JCQkJLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJbWFya2VyRW5hYmxlbWVudFByZWZlcmVuY2VOYW1lLCBtYXJrZXJMaW1pdFByZWZlcmVuY2VOYW1lLAotCQkJCU1hcmtlck1lc3NhZ2VzLk1hcmtlclByZWZlcmVuY2VzX0RpYWxvZ1RpdGxlKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotCQkJcmVmcmVzaFZpZXdlcigpOwotCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuYW1lIG9mIHRoZSBtYXJrZXIgZW5hYmxlbWVudCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JYWJzdHJhY3QgU3RyaW5nIGdldE1hcmtlckxpbWl0UHJlZmVyZW5jZU5hbWUoKTsKLQotCWFic3RyYWN0IFN0cmluZ1tdIGdldE1hcmtlclR5cGVzKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmludGVybmFsLnRhYmxldmlldy5UYWJsZVZpZXcjaW5pdFRvb2xCYXIob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdGJtKSB7Ci0JCXRibS5hZGQoZGVsZXRlQWN0aW9uKTsKLQkJdGJtLmFkZChnZXRGaWx0ZXJBY3Rpb24oKSk7Ci0JCXRibS51cGRhdGUoZmFsc2UpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MuaW50ZXJuYWwudGFibGV2aWV3LlRhYmxlVmlldyNyZWdpc3Rlckdsb2JhbEFjdGlvbnMob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJHbG9iYWxBY3Rpb25zKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLAotCQkJCWNvcHlBY3Rpb24pOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLAotCQkJCXBhc3RlQWN0aW9uKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksCi0JCQkJZGVsZXRlQWN0aW9uKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLAotCQkJCXNlbGVjdEFsbEFjdGlvbik7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBST1BFUlRJRVMuZ2V0SWQoKSwKLQkJCQlwcm9wZXJ0aWVzQWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RHJhZ0FuZERyb3AoKSB7Ci0JCWludCBvcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWTsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlclR5cGVzID0gbmV3IFRyYW5zZmVyW10gewotCQkJCU1hcmtlclRyYW5zZmVyLmdldEluc3RhbmNlKCksIFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCURyYWdTb3VyY2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCXBlcmZvcm1EcmFnU2V0RGF0YShldmVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfTsKLQotCQlnZXRWaWV3ZXIoKS5hZGREcmFnU3VwcG9ydChvcGVyYXRpb25zLCB0cmFuc2ZlclR5cGVzLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhlIHVzZXIgaXMgYXR0ZW1wdGluZyB0byBkcmFnIG1hcmtlciBkYXRhLiBBZGQgdGhlIGFwcHJvcHJpYXRlIGRhdGEgdG8KLQkgKiB0aGUgZXZlbnQgZGVwZW5kaW5nIG9uIHRoZSB0cmFuc2ZlciB0eXBlLgotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChNYXJrZXJUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQotCQkJZXZlbnQuZGF0YSA9IGdldFNlbGVjdGVkTWFya2VycygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQlMaXN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpKQotCQkJCQkudG9MaXN0KCk7Ci0JCQl0cnkgewotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gbmV3IElNYXJrZXJbc2VsZWN0aW9uLnNpemUoKV07Ci0JCQkJc2VsZWN0aW9uLnRvQXJyYXkobWFya2Vycyk7Ci0JCQkJaWYgKG1hcmtlcnMgIT0gbnVsbCkgewotCQkJCQlldmVudC5kYXRhID0gY29weUFjdGlvbi5jcmVhdGVNYXJrZXJSZXBvcnQobWFya2Vycyk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQXJyYXlTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGFycmF5IG9mIHNlbGVjdGVkIG1hcmtlcnMuCi0JICogCi0JICogQHJldHVybiBJTWFya2VyW10KLQkgKi8KLQlwcml2YXRlIElNYXJrZXJbXSBnZXRTZWxlY3RlZE1hcmtlcnMoKSB7Ci0JCU9iamVjdFtdIHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpKQotCQkJCS50b0FycmF5KCk7Ci0JCUFycmF5TGlzdCBtYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNlbGVjdGlvbltpXSBpbnN0YW5jZW9mIENvbmNyZXRlTWFya2VyKQotCQkJCW1hcmtlcnMuYWRkKCgoQ29uY3JldGVNYXJrZXIpIHNlbGVjdGlvbltpXSkuZ2V0TWFya2VyKCkpOwotCQl9Ci0JCXJldHVybiAoSU1hcmtlcltdKSBtYXJrZXJzLnRvQXJyYXkobmV3IElNYXJrZXJbbWFya2Vycy5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmludGVybmFsLnRhYmxldmlldy5UYWJsZVZpZXcjZmlsbENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1hbmFnZXIuYWRkKG9wZW5BY3Rpb24pOwotCQljcmVhdGVTaG93SW5NZW51KG1hbmFnZXIpOwotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQltYW5hZ2VyLmFkZChjb3B5QWN0aW9uKTsKLQkJcGFzdGVBY3Rpb24udXBkYXRlRW5hYmxlbWVudCgpOwotCQltYW5hZ2VyLmFkZChwYXN0ZUFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKGRlbGV0ZUFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHNlbGVjdEFsbEFjdGlvbik7Ci0JCWZpbGxDb250ZXh0TWVudUFkZGl0aW9ucyhtYW5hZ2VyKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQltYW5hZ2VyLmFkZChwcm9wZXJ0aWVzQWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxsIHRoZSBjb250ZXh0IG1lbnUgZm9yIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqLwotCWFic3RyYWN0IHZvaWQgZmlsbENvbnRleHRNZW51QWRkaXRpb25zKElNZW51TWFuYWdlciBtYW5hZ2VyKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZmlsdGVycyBmb3IgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEByZXR1cm4gTWFya2VyRmlsdGVyW10KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTWFya2VyRmlsdGVyW10gZ2V0VXNlckZpbHRlcnMoKSB7Ci0JCXJldHVybiBtYXJrZXJGaWx0ZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MuaW50ZXJuYWwudGFibGV2aWV3LlRhYmxlVmlldyNoYW5kbGVLZXlQcmVzc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlS2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5ERUwgJiYgZXZlbnQuc3RhdGVNYXNrID09IDAKLQkJCQkmJiBkZWxldGVBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MuaW50ZXJuYWwudGFibGV2aWV3LlRhYmxlVmlldyNoYW5kbGVPcGVuRXZlbnQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5PcGVuRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlT3BlbkV2ZW50KE9wZW5FdmVudCBldmVudCkgewotCQlpZiAob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkKLQkJCW9wZW5BY3Rpb24ucnVuKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5pbnRlcm5hbC50YWJsZXZpZXcuVGFibGVWaWV3I3NhdmVTZWxlY3Rpb24ob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVNlbGVjdGlvbihJTWVtZW50byBtZW1lbnRvKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Vmlld2VyKCkKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCUlNZW1lbnRvIHNlbGVjdGlvbk1lbSA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoVEFHX1NFTEVDVElPTik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIShuZXh0IGluc3RhbmNlb2YgQ29uY3JldGVNYXJrZXIpKQotCQkJCWNvbnRpbnVlOwotCQkJQ29uY3JldGVNYXJrZXIgbWFya2VyID0gKENvbmNyZXRlTWFya2VyKSBuZXh0OwotCQkJSU1lbWVudG8gZWxlbWVudE1lbSA9IHNlbGVjdGlvbk1lbS5jcmVhdGVDaGlsZChUQUdfTUFSS0VSKTsKLQkJCWVsZW1lbnRNZW0ucHV0U3RyaW5nKFRBR19SRVNPVVJDRSwgbWFya2VyLmdldE1hcmtlcigpLmdldFJlc291cmNlKCkKLQkJCQkJLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQllbGVtZW50TWVtLnB1dFN0cmluZyhUQUdfSUQsIFN0cmluZy52YWx1ZU9mKG1hcmtlci5nZXRNYXJrZXIoKQotCQkJCQkuZ2V0SWQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldFJvb3RUeXBlcygpOwotCi0JLyoqCi0JICogQHBhcmFtIHBhcnQKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9jdXNTZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsCi0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCi0JCUxpc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gKElFZGl0b3JQYXJ0KSBwYXJ0OwotCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlVXRpbC5nZXRGaWxlKGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChmaWxlID09IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlpZiAoZWRpdG9ySW5wdXQgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgbWFwcGluZyA9IGVkaXRvcklucHV0Ci0JCQkJCQkJLmdldEFkYXB0ZXIoUmVzb3VyY2VNYXBwaW5nLmNsYXNzKTsKLQkJCQkJaWYgKG1hcHBpbmcgIT0gbnVsbCkKLQkJCQkJCXNlbGVjdGVkRWxlbWVudHMuYWRkKG1hcHBpbmcpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0ZWRFbGVtZW50cy5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCQkJCUlUYXNrTGlzdFJlc291cmNlQWRhcHRlciB0YXNrTGlzdFJlc291cmNlQWRhcHRlcjsKLQkJCQkJCU9iamVjdCBhZGFwdGVyID0gKChJQWRhcHRhYmxlKSBvYmplY3QpCi0JCQkJCQkJCS5nZXRBZGFwdGVyKElUYXNrTGlzdFJlc291cmNlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsCi0JCQkJCQkJCSYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJVGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIpIHsKLQkJCQkJCQl0YXNrTGlzdFJlc291cmNlQWRhcHRlciA9IChJVGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRhc2tMaXN0UmVzb3VyY2VBZGFwdGVyID0gRGVmYXVsdE1hcmtlclJlc291cmNlQWRhcHRlcgotCQkJCQkJCQkJLmdldERlZmF1bHQoKTsKLQkJCQkJCX0KLQotCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gdGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIKLQkJCQkJCQkJLmdldEFmZmVjdGVkUmVzb3VyY2UoKElBZGFwdGFibGUpIG9iamVjdCk7Ci0JCQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQkJCU9iamVjdCBtYXBwaW5nID0gKChJQWRhcHRhYmxlKSBvYmplY3QpCi0JCQkJCQkJCQkuZ2V0QWRhcHRlcihSZXNvdXJjZU1hcHBpbmcuY2xhc3MpOwotCQkJCQkJCWlmIChtYXBwaW5nICE9IG51bGwpCi0JCQkJCQkJCXNlbGVjdGVkRWxlbWVudHMuYWRkKG1hcHBpbmcpOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJc2VsZWN0ZWRFbGVtZW50cy5hZGQocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXVwZGF0ZUZvY3VzTWFya2VycyhzZWxlY3RlZEVsZW1lbnRzLnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBmb2N1cyByZXNvdXJjZXMgb2YgdGhlIGZpbHRlcnMuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdXBkYXRlRmlsdGVyU2VsZWN0aW9uKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0KLQkJQ29sbGVjdGlvbiByZXNvdXJjZUNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElSZXNvdXJjZSkKLQkJCQlyZXNvdXJjZUNvbGxlY3Rpb24uYWRkKGVsZW1lbnRzW2ldKTsKLQkJCWVsc2UKLQkJCQlhZGRSZXNvdXJjZXMocmVzb3VyY2VDb2xsZWN0aW9uLAotCQkJCQkJKChSZXNvdXJjZU1hcHBpbmcpIGVsZW1lbnRzW2ldKSk7Ci0JCX0KLQotCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW3Jlc291cmNlQ29sbGVjdGlvbi5zaXplKCldOwotCQlyZXNvdXJjZUNvbGxlY3Rpb24udG9BcnJheShyZXNvdXJjZXMpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyRmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJbWFya2VyRmlsdGVyc1tpXS5zZXRGb2N1c1Jlc291cmNlKHJlc291cmNlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHJlc291cmNlcyBmb3IgdGhlIG1hcHBpbmcgdG8gcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gbWFwcGluZwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRSZXNvdXJjZXMoQ29sbGVjdGlvbiByZXNvdXJjZXMsIFJlc291cmNlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZVRyYXZlcnNhbFtdIHRyYXZlcnNhbHMgPSBtYXBwaW5nLmdldFRyYXZlcnNhbHMoCi0JCQkJCVJlc291cmNlTWFwcGluZ0NvbnRleHQuTE9DQUxfQ09OVEVYVCwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRyYXZlcnNhbHMubGVuZ3RoOyBpKyspIHsKLQkJCQlSZXNvdXJjZVRyYXZlcnNhbCB0cmF2ZXJzYWwgPSB0cmF2ZXJzYWxzW2ldOwotCQkJCUlSZXNvdXJjZVtdIHJlc3VsdCA9IHRyYXZlcnNhbC5nZXRSZXNvdXJjZXMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgewotCQkJCQlyZXNvdXJjZXMuYWRkKHJlc3VsdFtqXSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUlERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXRpY0NvbnRleHRJZCgpOwotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBmb2N1cyBtYXJrZXJzIGZvciB0aGUgc3VwcGxpZWQgZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0Jdm9pZCB1cGRhdGVGb2N1c01hcmtlcnMoT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJYm9vbGVhbiB1cGRhdGVOZWVkZWQgPSB1cGRhdGVOZWVkZWQoZm9jdXNFbGVtZW50cywgZWxlbWVudHMpOwotCQlpZiAodXBkYXRlTmVlZGVkKSB7Ci0JCQlmb2N1c0VsZW1lbnRzID0gZWxlbWVudHM7Ci0JCQl1cGRhdGVGaWx0ZXJTZWxlY3Rpb24oZWxlbWVudHMpOwotCQkJcmVmcmVzaFZpZXdlcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZU5lZWRlZChPYmplY3RbXSBvbGRFbGVtZW50cywgT2JqZWN0W10gbmV3RWxlbWVudHMpIHsKLQkJLy8gZGV0ZXJtaW5lIGlmIGFuIHVwZGF0ZSBpZiByZWZpbHRlcmluZyBpcyByZXF1aXJlZAotCQlNYXJrZXJGaWx0ZXJbXSBmaWx0ZXJzID0gZ2V0RW5hYmxlZEZpbHRlcnMoKTsKLQkJYm9vbGVhbiB1cGRhdGVOZWVkZWQgPSBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCU1hcmtlckZpbHRlciBmaWx0ZXIgPSBmaWx0ZXJzW2ldOwotCQkJaWYgKCFmaWx0ZXIuaXNFbmFibGVkKCkpCi0JCQkJY29udGludWU7Ci0KLQkJCWludCBvblJlc291cmNlID0gZmlsdGVyLmdldE9uUmVzb3VyY2UoKTsKLQkJCWlmIChvblJlc291cmNlID09IE1hcmtlckZpbHRlci5PTl9BTlkKLQkJCQkJfHwgb25SZXNvdXJjZSA9PSBNYXJrZXJGaWx0ZXIuT05fV09SS0lOR19TRVQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChuZXdFbGVtZW50cyA9PSBudWxsIHx8IG5ld0VsZW1lbnRzLmxlbmd0aCA8IDEpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChvbGRFbGVtZW50cyA9PSBudWxsIHx8IG9sZEVsZW1lbnRzLmxlbmd0aCA8IDEpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChBcnJheXMuZXF1YWxzKG9sZEVsZW1lbnRzLCBuZXdFbGVtZW50cykpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChvblJlc291cmNlID09IE1hcmtlckZpbHRlci5PTl9BTllfSU5fU0FNRV9DT05UQUlORVIpIHsKLQkJCQlDb2xsZWN0aW9uIG9sZFByb2plY3RzID0gTWFya2VyRmlsdGVyCi0JCQkJCQkuZ2V0UHJvamVjdHNBc0NvbGxlY3Rpb24ob2xkRWxlbWVudHMpOwotCQkJCUNvbGxlY3Rpb24gbmV3UHJvamVjdHMgPSBNYXJrZXJGaWx0ZXIKLQkJCQkJCS5nZXRQcm9qZWN0c0FzQ29sbGVjdGlvbihuZXdFbGVtZW50cyk7Ci0KLQkJCQlpZiAob2xkUHJvamVjdHMuc2l6ZSgpID09IG5ld1Byb2plY3RzLnNpemUoKSkgewotCQkJCQlpZiAobmV3UHJvamVjdHMuY29udGFpbnNBbGwob2xkUHJvamVjdHMpKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQl1cGRhdGVOZWVkZWQgPSB0cnVlOy8vIFdlIGFyZSB1cGRhdGluZyBhcyB0aGVyZSBpcyBub3RoaW5nIHRvIHN0b3AKLQkJCS8vIHVzCi0JCX0KLQotCQlyZXR1cm4gdXBkYXRlTmVlZGVkOwotCX0KLQotCXZvaWQgdXBkYXRlVGl0bGUoKSB7Ci0JCVN0cmluZyBzdGF0dXMgPSBVdGlsLkVNUFRZX1NUUklORzsKLQkJaW50IGZpbHRlcmVkQ291bnQgPSBnZXRDdXJyZW50TWFya2VycygpLmdldEl0ZW1Db3VudCgpOwotCQlpbnQgdG90YWxDb3VudCA9IGdldFRvdGFsTWFya2VycygpOwotCQlpZiAoZmlsdGVyZWRDb3VudCA9PSB0b3RhbENvdW50KSB7Ci0JCQlzdGF0dXMgPSBOTFMuYmluZChNYXJrZXJNZXNzYWdlcy5maWx0ZXJfaXRlbXNNZXNzYWdlLCBuZXcgSW50ZWdlcigKLQkJCQkJdG90YWxDb3VudCkpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gTkxTLmJpbmQoTWFya2VyTWVzc2FnZXMuZmlsdGVyX21hdGNoZWRNZXNzYWdlLAotCQkJCQluZXcgSW50ZWdlcihmaWx0ZXJlZENvdW50KSwgbmV3IEludGVnZXIodG90YWxDb3VudCkpOwotCQl9Ci0JCXNldENvbnRlbnREZXNjcmlwdGlvbihzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIG1lc3NhZ2UgZGlzcGxheWVkIGluIHRoZSBzdGF0dXMgbGluZS4gVGhpcyBtZXRob2QgaXMgaW52b2tlZAotCSAqIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6Ci0JICogPHVsPgotCSAqIDxsaT53aGVuIHRoaXMgdmlldyBpcyBmaXJzdCBjcmVhdGVkPC9saT4KLQkgKiA8bGk+d2hlbiBuZXcgZWxlbWVudHMgYXJlIGFkZGVkPC9saT4KLQkgKiA8bGk+d2hlbiBzb21ldGhpbmcgaXMgZGVsZXRlZDwvbGk+Ci0JICogPGxpPndoZW4gdGhlIGZpbHRlcnMgY2hhbmdlPC9saT4KLQkgKiA8L3VsPgotCSAqIDxwPgotCSAqIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGNhbGxzCi0JICogPGNvZGU+dXBkYXRlU3RhdHVzTWVzc2FnZShJU3RydWN0dXJlZFNlbGVjdGlvbik8L2NvZGU+IHdpdGggdGhlIGN1cnJlbnQKLQkgKiBzZWxlY3Rpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4uIENsYXNzZXMgd2lzaGluZyB0byBvdmVycmlkZSB0aGlzCi0JICogZnVuY3Rpb25hbGl0eSwgc2hvdWxkIGp1c3Qgb3ZlcnJpZGUgdGhlIG1ldGhvZAotCSAqIDxjb2RlPnVwZGF0ZVN0YXR1c01lc3NhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24pPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzTWVzc2FnZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQl1cGRhdGVTdGF0dXNNZXNzYWdlKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQkJZWxzZQotCQkJdXBkYXRlU3RhdHVzTWVzc2FnZShudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoYXQgbWVzc2FnZSBkaXNwbGF5ZWQgaW4gdGhlIHN0YXR1cyBsaW5lLiBJZiB0aGUgc2VsZWN0aW9uCi0JICogcGFyYW1ldGVyIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGl0cyBzaXplIGlzIDAsIHRoZSBzdGF0dXMgYXJlYSBpcwotCSAqIGJsYW5rZWQgb3V0LiBJZiBvbmx5IDEgbWFya2VyIGlzIHNlbGVjdGVkLCB0aGUgc3RhdHVzIGFyZWEgaXMgdXBkYXRlZAotCSAqIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZSBvZiB0aGlzIG1hcmtlci4gSW4gb3RoZXIgY2FzZXMKLQkgKiAobW9yZSB0aGFuIG9uZSBtYXJrZXIgaXMgc2VsZWN0ZWQpIHRoZSBzdGF0dXMgYXJlYSBpbmRpY2F0ZXMgaG93IG1hbnkKLQkgKiBpdGVtcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbWF5IGJlIG92ZXJ3cml0dGVuLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzZWxlY3Rpb24gY2hhbmdlcyBpbiB0aGlzIHZpZXcuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIGEgdmFsaWQgc2VsZWN0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzTWVzc2FnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uc2l6ZSgpID09IDApIHsKLQkJCS8vIFNob3cgc3RhdHMgb24gYWxsIGl0ZW1zIGluIHRoZSB2aWV3Ci0JCQltZXNzYWdlID0gdXBkYXRlU3VtbWFyeVZpc2libGUoKTsKLQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCS8vIFVzZSB0aGUgTWVzc2FnZSBhdHRyaWJ1dGUgb2YgdGhlIG1hcmtlcgotCQkJT2JqZWN0IGZpcnN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKGZpcnN0IGluc3RhbmNlb2YgQ29uY3JldGVNYXJrZXIpIHsKLQkJCQltZXNzYWdlID0gKChDb25jcmV0ZU1hcmtlcikgZmlyc3QpLmdldERlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCS8vIFNob3cgc3RhdHMgb24gb25seSB0aG9zZSBpdGVtcyBpbiB0aGUgc2VsZWN0aW9uCi0JCQltZXNzYWdlID0gdXBkYXRlU3VtbWFyeVNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCS5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuIHRoZSBzdW1tYXJ5IHN0YXR1cyBtZXNzYWdlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1cGRhdGVTdW1tYXJ5U2VsZWN0ZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIFNob3cgaG93IG1hbnkgaXRlbXMgc2VsZWN0ZWQKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCU1hcmtlck1lc3NhZ2VzLm1hcmtlcl9zdGF0dXNTdW1tYXJ5U2VsZWN0ZWQsCi0JCQkJbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoc2VsZWN0aW9uLnNpemUoKSkgfSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdXBkYXRlIHN1bW1hcnkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVwZGF0ZVN1bW1hcnlWaXNpYmxlKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGEgZGlhbG9nIG9uIHRoZSBmaWx0ZXJzCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgb3BlbkZpbHRlcnNEaWFsb2coKSB7Ci0KLQkJRGlhbG9nTWFya2VyRmlsdGVyIGRpYWxvZyA9IGNyZWF0ZUZpbHRlcnNEaWFsb2coKTsKLQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQotCQkJTWFya2VyRmlsdGVyW10gcmVzdWx0ID0gZGlhbG9nLmdldEZpbHRlcnMoKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKQotCQkJCXNldEZpbHRlcnMobmV3IE1hcmtlckZpbHRlcltdIHsgY3JlYXRlRmlsdGVyKE1hcmtlck1lc3NhZ2VzLk1hcmtlckZpbHRlcl9kZWZhdWx0RmlsdGVyTmFtZSkgfSk7Ci0JCQllbHNlCi0JCQkJc2V0RmlsdGVycyhyZXN1bHQpOwotCi0JCQl1cGRhdGVGb3JGaWx0ZXJDaGFuZ2VzKCk7Ci0JCQlyZWZyZXNoRmlsdGVyTWVudSgpOwotCQkJcmVmcmVzaFZpZXdlcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgY29udGVudHMgb2YgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoVmlld2VyKCkgewotCQlzY2hlZHVsZU1hcmtlclVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZmlsdGVycyB0byBuZXdGaWx0ZXJzLgotCSAqIAotCSAqIEBwYXJhbSBuZXdGaWx0ZXJzCi0JICovCi0Jdm9pZCBzZXRGaWx0ZXJzKE1hcmtlckZpbHRlcltdIG5ld0ZpbHRlcnMpIHsKLQkJbWFya2VyRmlsdGVycyA9IG5ld0ZpbHRlcnM7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIGNhY2hlIG9mIGVuYWJsZWQgZmlsdGVycy4KLQkgKiAKLQkgKi8KLQl2b2lkIGNsZWFyRW5hYmxlZEZpbHRlcnMoKSB7Ci0JCWVuYWJsZWRGaWx0ZXJzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsdGVyIHN1YiBtZW51LgotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoRmlsdGVyTWVudSgpIHsKLQkJaWYgKGZpbHRlcnNNZW51ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbHRlcnNNZW51LnJlbW92ZUFsbCgpOwotCQlNYXJrZXJGaWx0ZXJbXSBmaWx0ZXJzID0gZ2V0QWxsRmlsdGVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbHRlcnNNZW51LmFkZChuZXcgRmlsdGVyRW5hYmxlbWVudEFjdGlvbihmaWx0ZXJzW2ldLCB0aGlzKSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIE9wZW4gYSBmaWx0ZXIgZGlhbG9nIG9uIHRoZSByZWNlaXZlci4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGlhbG9nTWFya2VyRmlsdGVyIGNyZWF0ZUZpbHRlcnNEaWFsb2coKTsKLQotCS8qKgotCSAqIEdpdmVuIGEgc2VsZWN0aW9uIG9mIElNYXJrZXIsIHJldmVhbHMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlCi0JICogdmlld2VyCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWRTZWxlY3Rpb24KLQkgKiBAcGFyYW0gcmV2ZWFsCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24sCi0JCQlib29sZWFuIHJldmVhbCkgewotCQlUcmVlVmlld2VyIHZpZXdlciA9IGdldFZpZXdlcigpOwotCi0JCUxpc3QgbmV3U2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpID0gc3RydWN0dXJlZFNlbGVjdGlvbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBuZXh0ID0gaS5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCQlDb25jcmV0ZU1hcmtlciBtYXJrZXIgPSBnZXRDdXJyZW50TWFya2VycygpLmdldE1hcmtlcigKLQkJCQkJCShJTWFya2VyKSBuZXh0KTsKLQkJCQlpZiAobWFya2VyICE9IG51bGwpIHsKLQkJCQkJbmV3U2VsZWN0aW9uLmFkZChtYXJrZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICh2aWV3ZXIgIT0gbnVsbCkKLQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKSwgcmV2ZWFsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFya2VyTGlzdCBnZXRWaXNpYmxlTWFya2VycygpIHsKLQkJcmV0dXJuIGdldEN1cnJlbnRNYXJrZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIG1hcmtlcnMuIFNob3VsZCBub3QgYmUgY2FsbGVkIHdoaWxlIHRoZQotCSAqIG1hcmtlciBsaXN0IGlzIHN0aWxsIHVwZGF0aW5nLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBtYXJrZXJzIGluIHRoZSB3b3Jrc3BhY2UgKGluY2x1ZGluZwotCSAqICAgICAgICAgZXZlcnl0aGluZyB0aGF0IGRvZXNuJ3QgcGFzcyB0aGUgZmlsdGVycykKLQkgKi8KLQlpbnQgZ2V0VG90YWxNYXJrZXJzKCkgewotCQkvLyBUaGUgbnVtYmVyIG9mIHZpc2libGUgbWFya2VycyBzaG91bGQgbmV2ZXIgZXhjZWVkIHRoZSB0b3RhbCBudW1iZXIgb2YKLQkJLy8gbWFya2VycyBpbgotCQkvLyB0aGUgd29ya3NwYWNlLiBJZiB0aGlzIGFzc2VydGF0aW9uIGZhaWxzLCBpdCBwcm9iYWJseSBpbmRpY2F0ZXMgc29tZQotCQkvLyBzb3J0IG9mIGNvbmN1cnJlbmN5IHByb2JsZW0KLQkJLy8gKG1vc3QgbGlrZWx5LCBnZXRUb3RhbE1hcmtlcnMgd2FzIGNhbGxlZCB3aGlsZSB3ZSB3ZXJlIHN0aWxsCi0JCS8vIGNvbXB1dGluZyB0aGUgbWFya2VyIGxpc3RzKQotCQkvLyBBc3NlcnQuaXNUcnVlKHRvdGFsTWFya2VycyA+PSBjdXJyZW50TWFya2Vycy5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJcmV0dXJuIHRvdGFsTWFya2VyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuVGFibGVWaWV3I3NvcnRlckNoYW5nZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNvcnRlckNoYW5nZWQoKSB7Ci0JCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzaG93QnVzeShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dCdXN5KGJvb2xlYW4gYnVzeSkgewotCQlzdXBlci5zaG93QnVzeShidXN5KTsKLQotCQlpZiAoYnVzeSkgewotCQkJcHJlQnVzeU1hcmtlcnMgPSB0b3RhbE1hcmtlcnM7Ci0JCX0gZWxzZSB7Ly8gT25seSBib2xkIGlmIHRoZXJlIGhhcyBiZWVuIGEgY2hhbmdlIGluIGNvdW50Ci0JCQlpZiAodG90YWxNYXJrZXJzICE9IHByZUJ1c3lNYXJrZXJzKQotCQkJCWdldFByb2dyZXNzU2VydmljZSgpLndhcm5PZkNvbnRlbnRDaGFuZ2UoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaWx0ZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBlbmFibGVkLgotCSAqIAotCSAqIEByZXR1cm4gTWFya2VyRmlsdGVyW10KLQkgKi8KLQlNYXJrZXJGaWx0ZXJbXSBnZXRFbmFibGVkRmlsdGVycygpIHsKLQotCQlpZiAoZW5hYmxlZEZpbHRlcnMgPT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBmaWx0ZXJzID0gZmluZEVuYWJsZWRGaWx0ZXJzKCk7Ci0KLQkJCWVuYWJsZWRGaWx0ZXJzID0gbmV3IE1hcmtlckZpbHRlcltmaWx0ZXJzLnNpemUoKV07Ci0JCQlmaWx0ZXJzLnRvQXJyYXkoZW5hYmxlZEZpbHRlcnMpOwotCQl9Ci0JCXJldHVybiBlbmFibGVkRmlsdGVyczsKLQotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIGZpbHRlcnMgZW5hYmxlZCBpbiB0aGUgdmlldy4KLQkgKiAKLQkgKiBAcmV0dXJuIENvbGxlY3Rpb24gb2YgTWFya2VyRmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZmluZEVuYWJsZWRGaWx0ZXJzKCkgewotCQlNYXJrZXJGaWx0ZXJbXSBhbGxGaWx0ZXJzID0gZ2V0QWxsRmlsdGVycygpOwotCQlBcnJheUxpc3QgZmlsdGVycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFsbEZpbHRlcnNbaV0uaXNFbmFibGVkKCkpCi0JCQkJZmlsdGVycy5hZGQoYWxsRmlsdGVyc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcnM7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBvZiB0aGUgZmlsdGVycyBhcHBsaWVkIHRvIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIE1hcmtlckZpbHRlcltdCi0JICovCi0JTWFya2VyRmlsdGVyW10gZ2V0QWxsRmlsdGVycygpIHsKLQkJcmV0dXJuIGdldFVzZXJGaWx0ZXJzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLlRhYmxlVmlldyNhZGREcm9wRG93bkNvbnRyaWJ1dGlvbnMob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQl2b2lkIGFkZERyb3BEb3duQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5hZGREcm9wRG93bkNvbnRyaWJ1dGlvbnMobWVudSk7Ci0KLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihNRU5VX0ZJTFRFUlNfR1JPVVApKTsKLQkJLy8gRG9uJ3QgYWRkIGluIHRoZSBmaWx0ZXJzIHVudGlsIHRoZXkgYXJlIHNldAotCQlmaWx0ZXJzTWVudSA9IG5ldyBNZW51TWFuYWdlcihNYXJrZXJNZXNzYWdlcy5maWx0ZXJzU3ViTWVudV90aXRsZSk7Ci0JCXJlZnJlc2hGaWx0ZXJNZW51KCk7Ci0JCW1lbnUuYXBwZW5kVG9Hcm91cChNRU5VX0ZJTFRFUlNfR1JPVVAsIGZpbHRlcnNNZW51KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHNob3cgaW4gbWVudSBpZiB0aGVyZSBpcyBhIHNpbmdsZSBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIG1lbnUKLQkgKi8KLQl2b2lkIGNyZWF0ZVNob3dJbk1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJaWYgKCFVdGlsLmlzU2luZ2xlQ29uY3JldGVTZWxlY3Rpb24oc3RydWN0dXJlZCkpCi0JCQlyZXR1cm47Ci0KLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihNRU5VX1NIT1dfSU5fR1JPVVApKTsKLQkJLy8gRG9uJ3QgYWRkIGluIHRoZSBmaWx0ZXJzIHVudGlsIHRoZXkgYXJlIHNldAotCQlzaG93SW5NZW51ID0gbmV3IE1lbnVNYW5hZ2VyKElERVdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF9zaG93SW4pOwotCQlzaG93SW5NZW51LmFkZChDb250cmlidXRpb25JdGVtRmFjdG9yeS5WSUVXU19TSE9XX0lOCi0JCQkJLmNyZWF0ZShnZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKSk7Ci0KLQkJbWVudS5hcHBlbmRUb0dyb3VwKE1FTlVfU0hPV19JTl9HUk9VUCwgc2hvd0luTWVudSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBtYXJrZXIgY291bnRzCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQl2b2lkIHJlZnJlc2hNYXJrZXJDb3VudHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCW1vbml0b3Iuc3ViVGFzayhNYXJrZXJNZXNzYWdlcy5NYXJrZXJWaWV3X3JlZnJlc2hpbmdfY291bnRzKTsKLQkJdHJ5IHsKLQkJCXRvdGFsTWFya2VycyA9IE1hcmtlckxpc3QuY29tcHV0ZShnZXRNYXJrZXJUeXBlcygpKS5sZW5ndGg7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcmtlciBsaW1pdCBvciAtMSBpZiB1bmxpbWl0ZWQKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRNYXJrZXJMaW1pdCgpIHsKLQotCQkvLyBJZiBsaW1pdHMgYXJlIGVuYWJsZWQgcmV0dXJuIGl0LiBPdGhlcndpc2UgcmV0dXJuIC0xCi0JCWlmIChJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJZ2V0TWFya2VyRW5hYmxlbWVudFByZWZlcmVuY2VOYW1lKCkpKSB7Ci0JCQlyZXR1cm4gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoCi0JCQkJCWdldE1hcmtlckxpbWl0UHJlZmVyZW5jZU5hbWUoKSk7Ci0KLQkJfQotCQlyZXR1cm4gLTE7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIG1hcmtlciBsaW1pdCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JYWJzdHJhY3QgU3RyaW5nIGdldE1hcmtlckVuYWJsZW1lbnRQcmVmZXJlbmNlTmFtZSgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLlRhYmxlVmlldyNjcmVhdGVWaWV3ZXJJbnB1dCgpCi0JICovCi0JT2JqZWN0IGNyZWF0ZVZpZXdlcklucHV0KCkgewotCQlyZXR1cm4gbmV3IE1hcmtlckFkYXB0ZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBUYWJsZVNvcnRlcgotCSAqIAotCSAqIEByZXR1cm4gVGFibGVTb3J0ZXIKLQkgKi8KLQlwdWJsaWMgVGFibGVTb3J0ZXIgZ2V0VGFibGVTb3J0ZXIoKSB7Ci0JCXJldHVybiAoVGFibGVTb3J0ZXIpIGdldFZpZXdlcigpLmdldFNvcnRlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIGZvciB0aGUgZW5kIG9mIHRoZSB1cGRhdGUuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkVXBkYXRlRmluaXNoTGlzdGVuZXIoSUpvYkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXVwZGF0ZUpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgdGhlIGVuZCBvZiB0aGUgdXBkYXRlLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZUZpbmlzaExpc3RlbmVyKElKb2JDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl1cGRhdGVKb2IucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbGlzdGVuZXIgZm9yIHdvcmtpbmcgc2V0IGNoYW5nZXMuCi0JICogCi0JICogQHJldHVybiBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZ2V0V29ya2luZ1NldExpc3RlbmVyKCkgewotCQl3b3JraW5nU2V0TGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJY2xlYXJFbmFibGVkRmlsdGVycygpOwotCQkJCXJlZnJlc2hWaWV3ZXIoKTsKLQotCQkJfQotCQl9OwotCQlyZXR1cm4gd29ya2luZ1NldExpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIFNjaGVkdWxlIGFuIHVwZGF0ZSBvZiB0aGUgbWFya2VycwotCSAqLwotCXZvaWQgc2NoZWR1bGVNYXJrZXJVcGRhdGUoKSB7Ci0JCXVwZGF0ZUpvYi5yZWZyZXNoQWxsKCk7Ci0JCWdldFByb2dyZXNzU2VydmljZSgpLnNjaGVkdWxlKG1hcmtlclByb2Nlc3NKb2IsIDEwMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJWaWV3UHJlZmVyZW5jZURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvTWFya2VyVmlld1ByZWZlcmVuY2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmYjU0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9NYXJrZXJWaWV3UHJlZmVyZW5jZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5WaWV3U2V0dGluZ3NEaWFsb2c7Ci0KLS8qKgotICogVGhlIE1hcmtlclZpZXdQcmVmZXJlbmNlRGlhbG9nIGlzIHRoZSBkaWFsb2cgdGhhdCBpcyB1c2VkIGZvciBwcmVmZXJlbmNlCi0gKiBzZXR0aW5ncyBpbiBhIG1hcmtlcnMgdmlldy4KLSAqIAotICogQHNpbmNlIDMuMQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrZXJWaWV3UHJlZmVyZW5jZURpYWxvZyBleHRlbmRzIFZpZXdTZXR0aW5nc0RpYWxvZyB7Ci0KLQlTdHJpbmcgZW5hYmxlbWVudEtleTsKLQotCVN0cmluZyBsaW1pdEtleTsKLQotCVN0cmluZyBkaWFsb2dUaXRsZTsKLQotCXByaXZhdGUgSW50ZWdlckZpZWxkRWRpdG9yIGxpbWl0RWRpdG9yOwotCi0JcHJpdmF0ZSBCdXR0b24gZW5hYmxlbWVudEJ1dHRvbjsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGVkaXRBcmVhOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gZW5hYmxlbWVudFByZWZlcmVuY2UKLQkgKiAgICAgICAgICAgIFRoZSBrZXkgZm9yIHRoZSBlbmFibGVtZW50IHByZWZlcmVuY2UuCi0JICogQHBhcmFtIGxpbWl0UHJlZmVyZW5jZQotCSAqICAgICAgICAgICAgVGhlIGtleSBmb3IgdGhlIGxpbWl0IHByZWZlcmVuY2UuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBkaWFsb2cuCi0JICovCi0JcHVibGljIE1hcmtlclZpZXdQcmVmZXJlbmNlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLAotCQkJU3RyaW5nIGVuYWJsZW1lbnRQcmVmZXJlbmNlLCBTdHJpbmcgbGltaXRQcmVmZXJlbmNlLCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQllbmFibGVtZW50S2V5ID0gZW5hYmxlbWVudFByZWZlcmVuY2U7Ci0JCWxpbWl0S2V5ID0gbGltaXRQcmVmZXJlbmNlOwotCQlkaWFsb2dUaXRsZSA9IHRpdGxlOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dChkaWFsb2dUaXRsZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHRvcENvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlib29sZWFuIGNoZWNrZWQgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLmdldEJvb2xlYW4oZW5hYmxlbWVudEtleSk7Ci0JCWVuYWJsZW1lbnRCdXR0b24gPSBuZXcgQnV0dG9uKHRvcENvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZW5hYmxlbWVudEJ1dHRvbi5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLk1hcmtlclByZWZlcmVuY2VzX01hcmtlckxpbWl0cyk7Ci0JCWVuYWJsZW1lbnRCdXR0b24uc2V0U2VsZWN0aW9uKGNoZWNrZWQpOwotCi0JCWVkaXRBcmVhID0gbmV3IENvbXBvc2l0ZSh0b3BDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZWRpdEFyZWEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBlZGl0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQllZGl0RGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCWVkaXRBcmVhLnNldExheW91dERhdGEoZWRpdERhdGEpOwotCi0JCWxpbWl0RWRpdG9yID0gbmV3IEludGVnZXJGaWVsZEVkaXRvcigKLQkJCQkibGltaXQiLCBNYXJrZXJNZXNzYWdlcy5NYXJrZXJQcmVmZXJlbmNlc19WaXNpYmxlSXRlbXMsIGVkaXRBcmVhKTsvLyROT04tTkxTLTEkCi0JCWxpbWl0RWRpdG9yLnNldFByZWZlcmVuY2VTdG9yZShJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJbGltaXRFZGl0b3Iuc2V0UHJlZmVyZW5jZU5hbWUobGltaXRLZXkpOwotCQlsaW1pdEVkaXRvci5sb2FkKCk7Ci0KLQkJR3JpZERhdGEgY2hlY2tlZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5OT05FLCB0cnVlLCBmYWxzZSk7Ci0JCWNoZWNrZWREYXRhLmhvcml6b250YWxTcGFuID0gbGltaXRFZGl0b3IuZ2V0TnVtYmVyT2ZDb250cm9scygpOwotCQllbmFibGVtZW50QnV0dG9uLnNldExheW91dERhdGEoY2hlY2tlZERhdGEpOwotCi0JCWVuYWJsZW1lbnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0TGltaXRFZGl0b3JFbmFibGVtZW50KGVkaXRBcmVhLCBlbmFibGVtZW50QnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQotCQlzZXRMaW1pdEVkaXRvckVuYWJsZW1lbnQoZWRpdEFyZWEsIGNoZWNrZWQpOwotCi0JCXJldHVybiB0b3BDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIHRoZSBsaW1pdEVkaXRvciBiYXNlZCBvbiBjaGVja2VkLgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IG9mIHRoZSBlZGl0b3IKLQkgKiBAcGFyYW0gY2hlY2tlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRMaW1pdEVkaXRvckVuYWJsZW1lbnQoQ29tcG9zaXRlIGNvbnRyb2wsIGJvb2xlYW4gY2hlY2tlZCkgewotCQlsaW1pdEVkaXRvci5zZXRFbmFibGVkKGNoZWNrZWQsIGNvbnRyb2wpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWxpbWl0RWRpdG9yLnN0b3JlKCk7Ci0JCUlERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJZW5hYmxlbWVudEtleSwgZW5hYmxlbWVudEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCUlERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuVmlld1NldHRpbmdzRGlhbG9nI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJbGltaXRFZGl0b3IubG9hZERlZmF1bHQoKTsKLQkJYm9vbGVhbiBjaGVja2VkID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCS5nZXREZWZhdWx0Qm9vbGVhbihlbmFibGVtZW50S2V5KTsKLQkJZW5hYmxlbWVudEJ1dHRvbi5zZXRTZWxlY3Rpb24oY2hlY2tlZCk7Ci0JCXNldExpbWl0RWRpdG9yRW5hYmxlbWVudChlZGl0QXJlYSwgY2hlY2tlZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9Qcm9ibGVtRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9Qcm9ibGVtRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNWFkZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvUHJvYmxlbUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBsdWdpbkNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLldvcmtiZW5jaEFjdGl2aXR5SGVscGVyOwotCi0vKioKLSAqIFByb2JsZW1GaWx0ZXJzIGFyZSB0aGUgZmlsdGVycyB1c2VkIGluIHRoZSBwcm9ibGVtcyB2aWV3LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ibGVtRmlsdGVyIGV4dGVuZHMgTWFya2VyRmlsdGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09OVEFJTlMgPSAiY29udGFpbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TRUxFQ1RfQllfU0VWRVJJVFkgPSAic2VsZWN0QnlTZXZlcml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU0VWRVJJVFkgPSAic2V2ZXJpdHkiOyAvLyROT04tTkxTLTEkCi0KLQlmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUZBVUxUX0NPTlRBSU5TID0gdHJ1ZTsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9ERVNDUklQVElPTiA9ICIiOyAvLyROT04tTkxTLTEkCQotCi0JZmluYWwgc3RhdGljIGJvb2xlYW4gREVGQVVMVF9TRUxFQ1RfQllfU0VWRVJJVFkgPSBmYWxzZTsKLQotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9TRVZFUklUWSA9IDA7Ci0KLQkvKioKLQkgKiBTZXZlcml0eSBmb3IgZXJyb3JzCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VWRVJJVFlfRVJST1IgPSAxIDw8IDI7Ci0KLQkvKioKLQkgKiBTZXZlcml0eSBmb3Igd2FybmluZ3MKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRVZFUklUWV9XQVJOSU5HID0gMSA8PCAxOwotCi0JLyoqCi0JICogU2V2ZXJpdHkgZm9yIGluZm9zCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VWRVJJVFlfSU5GTyA9IDEgPDwgMDsKLQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluczsKLQotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdEJ5U2V2ZXJpdHk7Ci0KLQlwcml2YXRlIGludCBzZXZlcml0eTsKLQotCXByaXZhdGUgSVBsdWdpbkNvbnRyaWJ1dGlvbiBjb250cmlidXRpb25EZXNjcmlwdG9yID0gbnVsbDsKLQotCXByaXZhdGUgSUlkZW50aWZpZXIgaWRlbnRpZmllcjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd2l0aCBuYW1lIGZpbHRlck5hbWUuCi0JICogCi0JICogQHBhcmFtIGZpbHRlck5hbWUKLQkgKiAgICAgICAgICAgIEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhlIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgUHJvYmxlbUZpbHRlcihTdHJpbmcgZmlsdGVyTmFtZSkgewotCQlzdXBlcihmaWx0ZXJOYW1lLCBuZXcgU3RyaW5nW10geyBJTWFya2VyLlBST0JMRU0gfSk7Ci0JCWlmICgoUGxhdGZvcm1VSS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCS5nZXRCb29sZWFuKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLlVTRV9XSU5ET1dfV09SS0lOR19TRVRfQllfREVGQVVMVCkpKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQlzZXRPblJlc291cmNlKE1hcmtlckZpbHRlci5PTl9XT1JLSU5HX1NFVCk7Ci0JCQkJCXNldFdvcmtpbmdTZXQocGFnZS5nZXRBZ2dyZWdhdGVXb3JraW5nU2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0TWFya2VyKENvbmNyZXRlTWFya2VyIG1hcmtlcikgewotCQlpZiAoIShtYXJrZXIgaW5zdGFuY2VvZiBQcm9ibGVtTWFya2VyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJUHJvYmxlbU1hcmtlciBwcm9ibGVtTWFya2VyID0gKFByb2JsZW1NYXJrZXIpIG1hcmtlcjsKLQotCQlyZXR1cm4gIWlzRW5hYmxlZCgpCi0JCQkJfHwgKHN1cGVyLnNlbGVjdE1hcmtlcihwcm9ibGVtTWFya2VyKQotCQkJCQkJJiYgc2VsZWN0QnlEZXNjcmlwdGlvbihwcm9ibGVtTWFya2VyKSAmJiBzZWxlY3RCeVNldmVyaXR5KHByb2JsZW1NYXJrZXIpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0QnlEZXNjcmlwdGlvbihDb25jcmV0ZU1hcmtlciBpdGVtKSB7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsIHx8IGRlc2NyaXB0aW9uLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCi0JCVN0cmluZyBtYXJrZXJEZXNjcmlwdGlvbiA9IGl0ZW0uZ2V0RGVzY3JpcHRpb24oKTsKLQkJaW50IGluZGV4ID0gbWFya2VyRGVzY3JpcHRpb24uaW5kZXhPZihkZXNjcmlwdGlvbik7Ci0JCXJldHVybiBjb250YWlucyA/IChpbmRleCA+PSAwKSA6IChpbmRleCA8IDApOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RCeVNldmVyaXR5KFByb2JsZW1NYXJrZXIgaXRlbSkgewotCQlpZiAoc2VsZWN0QnlTZXZlcml0eSkgewotCQkJaW50IG1hcmtlclNldmVyaXR5ID0gaXRlbS5nZXRTZXZlcml0eSgpOwotCi0JCQlpZiAobWFya2VyU2V2ZXJpdHkgPT0gSU1hcmtlci5TRVZFUklUWV9FUlJPUikKLQkJCQlyZXR1cm4gKHNldmVyaXR5ICYgU0VWRVJJVFlfRVJST1IpID4gMDsKLQkJCWVsc2UgaWYgKG1hcmtlclNldmVyaXR5ID09IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORykKLQkJCQlyZXR1cm4gKHNldmVyaXR5ICYgU0VWRVJJVFlfV0FSTklORykgPiAwOwotCQkJZWxzZSBpZiAobWFya2VyU2V2ZXJpdHkgPT0gSU1hcmtlci5TRVZFUklUWV9JTkZPKQotCQkJCXJldHVybiAoc2V2ZXJpdHkgJiBTRVZFUklUWV9JTkZPKSA+IDA7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIGZvciBpZiB0aGVyZSBpcyBhIGNoZWNrIGZvciBjb250YWluaW5nIGEgcGhyYXNlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldENvbnRhaW5zKCkgewotCQlyZXR1cm4gY29udGFpbnM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIGZvciBpZiB0aGVyZSBpcyBhIGNoZWNrIGZvciBzZXZlcml0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTZWxlY3RCeVNldmVyaXR5KCkgewotCQlyZXR1cm4gc2VsZWN0QnlTZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIGZvciBpZiB0aGVyZSBpcyBhIHNldmVyaXR5LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBzZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIGZvciBpZiB0aGVyZSBpcyBhIGNoZWNrIGZvciBjb250YWluaW5nIGEgcGhyYXNlLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWlucwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5zKGJvb2xlYW4gY29udGFpbnMpIHsKLQkJdGhpcy5jb250YWlucyA9IGNvbnRhaW5zOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgZm9yIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgZm9yIGlmIHRoZXJlIGlzIGEgY2hlY2sgZm9yIHNldmVyaXR5Ci0JICogCi0JICogQHBhcmFtIHNlbGVjdEJ5U2V2ZXJpdHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RCeVNldmVyaXR5KGJvb2xlYW4gc2VsZWN0QnlTZXZlcml0eSkgewotCQl0aGlzLnNlbGVjdEJ5U2V2ZXJpdHkgPSBzZWxlY3RCeVNldmVyaXR5OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgZm9yIHRoZSBzZXZlcml0eSB0byBtYXRjaCBhZ2FpbnN0LgotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBzZXZlcml0eSkgewotCQl0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlckZpbHRlciNyZXNldFN0YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFN0YXRlKCkgewotCQlzdXBlci5yZXNldFN0YXRlKCk7Ci0JCWNvbnRhaW5zID0gREVGQVVMVF9DT05UQUlOUzsKLQkJZGVzY3JpcHRpb24gPSBERUZBVUxUX0RFU0NSSVBUSU9OOwotCQlzZWxlY3RCeVNldmVyaXR5ID0gREVGQVVMVF9TRUxFQ1RfQllfU0VWRVJJVFk7Ci0JCXNldmVyaXR5ID0gREVGQVVMVF9TRVZFUklUWTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyRmlsdGVyI3Jlc3RvcmVGaWx0ZXJTZXR0aW5ncyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5ncykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlRmlsdGVyU2V0dGluZ3MoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzKSB7Ci0KLQkJc3VwZXIucmVzdG9yZUZpbHRlclNldHRpbmdzKHNldHRpbmdzKTsKLQotCQlTdHJpbmcgc2V0dGluZyA9IHNldHRpbmdzLmdldChUQUdfQ09OVEFJTlMpOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQljb250YWlucyA9IEJvb2xlYW4udmFsdWVPZihzZXR0aW5nKS5ib29sZWFuVmFsdWUoKTsKLQotCQlzZXR0aW5nID0gc2V0dGluZ3MuZ2V0KFRBR19ERVNDUklQVElPTik7Ci0KLQkJaWYgKHNldHRpbmcgIT0gbnVsbCkKLQkJCWRlc2NyaXB0aW9uID0gbmV3IFN0cmluZyhzZXR0aW5nKTsKLQotCQlzZXR0aW5nID0gc2V0dGluZ3MuZ2V0KFRBR19TRUxFQ1RfQllfU0VWRVJJVFkpOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQlzZWxlY3RCeVNldmVyaXR5ID0gQm9vbGVhbi52YWx1ZU9mKHNldHRpbmcpLmJvb2xlYW5WYWx1ZSgpOwotCi0JCXNldHRpbmcgPSBzZXR0aW5ncy5nZXQoVEFHX1NFVkVSSVRZKTsKLQotCQlpZiAoc2V0dGluZyAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlzZXZlcml0eSA9IEludGVnZXIucGFyc2VJbnQoc2V0dGluZyk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZU51bWJlckZvcm1hdCkgewotCQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlckZpbHRlciNyZXN0b3JlRmlsdGVyU2V0dGluZ3Mob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZUZpbHRlclNldHRpbmdzKElNZW1lbnRvIG1lbWVudG8pIHsKLQotCQlzdXBlci5yZXN0b3JlRmlsdGVyU2V0dGluZ3MobWVtZW50byk7Ci0KLQkJU3RyaW5nIHNldHRpbmcgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfQ09OVEFJTlMpOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQljb250YWlucyA9IEJvb2xlYW4udmFsdWVPZihzZXR0aW5nKS5ib29sZWFuVmFsdWUoKTsKLQotCQlzZXR0aW5nID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX0RFU0NSSVBUSU9OKTsKLQotCQlpZiAoc2V0dGluZyAhPSBudWxsKQotCQkJZGVzY3JpcHRpb24gPSBuZXcgU3RyaW5nKHNldHRpbmcpOwotCi0JCXNldHRpbmcgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfU0VMRUNUX0JZX1NFVkVSSVRZKTsKLQotCQlpZiAoc2V0dGluZyAhPSBudWxsKQotCQkJc2VsZWN0QnlTZXZlcml0eSA9IEJvb2xlYW4udmFsdWVPZihzZXR0aW5nKS5ib29sZWFuVmFsdWUoKTsKLQotCQlJbnRlZ2VyIHNldmVyaXR5U2V0dGluZyA9IG1lbWVudG8uZ2V0SW50ZWdlcihUQUdfU0VWRVJJVFkpOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQlzZXZlcml0eSA9IHNldmVyaXR5U2V0dGluZy5pbnRWYWx1ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJGaWx0ZXIjc2F2ZUZpbHRlclNldHRpbmdzKG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVGaWx0ZXJTZXR0aW5ncyhJTWVtZW50byBzZXR0aW5ncykgewotCQlzdXBlci5zYXZlRmlsdGVyU2V0dGluZ3Moc2V0dGluZ3MpOwotCQlzZXR0aW5ncy5wdXRTdHJpbmcoVEFHX0NPTlRBSU5TLCBTdHJpbmcudmFsdWVPZihjb250YWlucykpOwotCQlzZXR0aW5ncy5wdXRTdHJpbmcoVEFHX0RFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7Ci0JCXNldHRpbmdzLnB1dFN0cmluZyhUQUdfU0VMRUNUX0JZX1NFVkVSSVRZLCBTdHJpbmcKLQkJCQkudmFsdWVPZihzZWxlY3RCeVNldmVyaXR5KSk7Ci0JCXNldHRpbmdzLnB1dEludGVnZXIoVEFHX1NFVkVSSVRZLCBzZXZlcml0eSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGlkIG9mIHRoZSBmaWx0ZXIuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBmaWx0ZXIgaXMgdXNlcgotCSAqIGRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlpZiAoY29udHJpYnV0aW9uRGVzY3JpcHRvciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBjb250cmlidXRpb25EZXNjcmlwdG9yLmdldExvY2FsSWQoKTsKLQl9Ci0KLQl2b2lkIGNyZWF0ZUNvbnRyaWJ1dGlvbkZyb20oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJZmluYWwgU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoTWFya2VyU3VwcG9ydFJlZ2lzdHJ5LklEKTsKLQkJZmluYWwgU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlKCk7Ci0JCWNvbnRyaWJ1dGlvbkRlc2NyaXB0b3IgPSBuZXcgSVBsdWdpbkNvbnRyaWJ1dGlvbigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBsdWdpbkNvbnRyaWJ1dGlvbiNnZXRMb2NhbElkKCkKLQkJCSAqLwotCQkJcHVibGljIFN0cmluZyBnZXRMb2NhbElkKCkgewotCQkJCXJldHVybiBpZDsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGx1Z2luQ29udHJpYnV0aW9uI2dldFBsdWdpbklkKCkKLQkJCSAqLwotCQkJcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJCQlyZXR1cm4gbmFtZXNwYWNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjZWl2ZXIgd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZHVlIHRvIGFuCi0JICogYWN0aXZpdHkgbWF0Y2guCi0JICogCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIGZpbHRlcmVkIG91dC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlcmVkT3V0QnlBY3Rpdml0eSgpIHsKLQkJaWYgKGNvbnRyaWJ1dGlvbkRlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkgewotCQkJaWRlbnRpZmllciA9IFdvcmtiZW5jaEFjdGl2aXR5SGVscGVyCi0JCQkJCS5nZXRJZGVudGlmaWVyKGNvbnRyaWJ1dGlvbkRlc2NyaXB0b3IpOwotCQl9Ci0JCXJldHVybiAhaWRlbnRpZmllci5pc0VuYWJsZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc0VuYWJsZWQoKSAmJiAhaXNGaWx0ZXJlZE91dEJ5QWN0aXZpdHkoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL1Byb2JsZW1NYXJrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL1Byb2JsZW1NYXJrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlZjE0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9Qcm9ibGVtTWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ibGVtTWFya2VyIGV4dGVuZHMgQ29uY3JldGVNYXJrZXIgewotCi0gICAgcHJpdmF0ZSBpbnQgc2V2ZXJpdHk7Ci0KLSAgICBwdWJsaWMgUHJvYmxlbU1hcmtlcihJTWFya2VyIHRvQ29weSkgewotICAgICAgICBzdXBlcih0b0NvcHkpOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5Db25jcmV0ZU1hcmtlciNyZWZyZXNoKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgICAgIHNldmVyaXR5ID0gZ2V0TWFya2VyKCkuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIC0xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotICAgICAgICByZXR1cm4gc2V2ZXJpdHk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvUHJvYmxlbVZpZXcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL1Byb2JsZW1WaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZmU0NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvUHJvYmxlbVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYXlvdXREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuQWN0aXZpdHlNYW5hZ2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQWN0aXZpdHlNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERUludGVybmFsUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBUaGUgUHJvYmxlbVZpZXcgaXMgdGhlIHZpZXcgdGhhdCBkaXNwbGF5cyBwcm9ibGVtIG1hcmtlcnMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb2JsZW1WaWV3IGV4dGVuZHMgTWFya2VyVmlldyB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBST09UX1RZUEVTID0geyBJTWFya2VyLlBST0JMRU0gfTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfRElBTE9HX1NFQ1RJT04gPSAib3JnLmVjbGlwc2UudWkudmlld3MucHJvYmxlbSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWN0aW9uUmVzb2x2ZU1hcmtlciByZXNvbHZlTWFya2VyQWN0aW9uOwotCi0JcHJpdmF0ZSBJQWN0aXZpdHlNYW5hZ2VyTGlzdGVuZXIgYWN0aXZpdHlNYW5hZ2VyTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElGaWVsZCBzZXZlcml0eSA9IG5ldyBGaWVsZFNldmVyaXR5KCk7Ci0KLQlwcml2YXRlIElGaWVsZCBjYXRlZ29yeSA9IG5ldyBGaWVsZENhdGVnb3J5KCk7Ci0KLQlwcml2YXRlIElGaWVsZCBmb2xkZXIgPSBuZXcgRmllbGRGb2xkZXIoKTsKLQotCXByaXZhdGUgSUZpZWxkIHJlc291cmNlID0gbmV3IEZpZWxkUmVzb3VyY2UoKTsKLQotCXByaXZhdGUgSUZpZWxkIG1lc3NhZ2UgPSBuZXcgRmllbGRNZXNzYWdlKCk7Ci0KLQlwcml2YXRlIElGaWVsZCBsaW5lTnVtYmVyID0gbmV3IEZpZWxkTGluZU51bWJlcigpOwotCi0JcHJpdmF0ZSBJRmllbGQgY3JlYXRpb25UaW1lID0gbmV3IEZpZWxkQ3JlYXRpb25UaW1lKCk7Ci0KLQkvLyBBZGQgdGhlIG1hcmtlciBJRCBzbyB0aGUgdGFibGUgc29ydGVyIHdvbid0IHJlZHVjZQotCS8vIGVycm9ycyBvbiB0aGUgc2FtZSBsaW5lIGJ1ZyA4MjUwMgotCXByaXZhdGUgc3RhdGljIElGaWVsZCBpZCA9IG5ldyBGaWVsZElkKCk7Ci0KLQlwcml2YXRlIGNsYXNzIEdyb3VwaW5nQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCQlJRmllbGQgZ3JvdXBpbmdGaWVsZDsKLQotCQlQcm9ibGVtVmlldyBwcm9ibGVtVmlldzsKLQotCQkvKioKLQkJICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkJICogCi0JCSAqIEBwYXJhbSBsYWJlbAotCQkgKiBAcGFyYW0gZmllbGQKLQkJICogQHBhcmFtIHZpZXcKLQkJICovCi0JCXB1YmxpYyBHcm91cGluZ0FjdGlvbihTdHJpbmcgbGFiZWwsIElGaWVsZCBmaWVsZCwgUHJvYmxlbVZpZXcgdmlldykgewotCQkJc3VwZXIobGFiZWwsIElBY3Rpb24uQVNfUkFESU9fQlVUVE9OKTsKLQotCQkJZ3JvdXBpbmdGaWVsZCA9IGZpZWxkOwotCQkJcHJvYmxlbVZpZXcgPSB2aWV3OwotCQkJSUZpZWxkIGNhdGVnb3J5RmllbGQgPSB2aWV3LmdldE1hcmtlckFkYXB0ZXIoKS5nZXRDYXRlZ29yeVNvcnRlcigpCi0JCQkJCS5nZXRDYXRlZ29yeUZpZWxkKCk7Ci0JCQlpZiAoY2F0ZWdvcnlGaWVsZCA9PSBudWxsKQotCQkJCXNldENoZWNrZWQoZ3JvdXBpbmdGaWVsZCA9PSBudWxsKTsKLQkJCWVsc2UKLQkJCQlzZXRDaGVja2VkKGNhdGVnb3J5RmllbGQuZXF1YWxzKGdyb3VwaW5nRmllbGQpKTsKLQkJfQotCi0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBVdGlsLkVNUFRZX1NUUklORzsKLQkJCWlmIChncm91cGluZ0ZpZWxkICE9IG51bGwpCi0JCQkJZGVzY3JpcHRpb24gPSBncm91cGluZ0ZpZWxkLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoCi0JCQkJCUlERUludGVybmFsUHJlZmVyZW5jZXMuUFJPQkxFTVNfR1JPVVBJTkcsIGRlc2NyaXB0aW9uKTsKLQkJCXByb2JsZW1WaWV3LmdldE1hcmtlckFkYXB0ZXIoKS5nZXRDdXJyZW50TWFya2VycygpLmNsZWFyR3JvdXBzKCk7Ci0JCQlwcm9ibGVtVmlldy5nZXRNYXJrZXJBZGFwdGVyKCkuZ2V0Q2F0ZWdvcnlTb3J0ZXIoKQotCQkJCQkuc2V0Q2F0ZWdvcnlGaWVsZChncm91cGluZ0ZpZWxkKTsKLQkJCXByb2JsZW1WaWV3LnJlZnJlc2hWaWV3ZXIoKTsKLQkJCWdldE1hcmtlckFkYXB0ZXIoKS5nZXRDYXRlZ29yeVNvcnRlcigpLnNhdmVTdGF0ZShnZXREaWFsb2dTZXR0aW5ncygpKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkgKi8KLQlwdWJsaWMgUHJvYmxlbVZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JCWNyZWF0aW9uVGltZS5zZXRTaG93aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyVmlldyNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocmVzb2x2ZU1hcmtlckFjdGlvbiAhPSBudWxsKQotCQkJcmVzb2x2ZU1hcmtlckFjdGlvbi5kaXNwb3NlKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKS5nZXRBY3Rpdml0eU1hbmFnZXIoKQotCQkJCS5yZW1vdmVBY3Rpdml0eU1hbmFnZXJMaXN0ZW5lcihhY3Rpdml0eU1hbmFnZXJMaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuVGFibGVWaWV3I2dldFNvcnRpbmdGaWVsZHMoKQotCSAqLwotCXByb3RlY3RlZCBJRmllbGRbXSBnZXRTb3J0aW5nRmllbGRzKCkgewotCQlyZXR1cm4gbmV3IElGaWVsZFtdIHsgc2V2ZXJpdHksIGNhdGVnb3J5LCBmb2xkZXIsIHJlc291cmNlLCBtZXNzYWdlLAotCQkJCWxpbmVOdW1iZXIsIGNyZWF0aW9uVGltZSwKLQkJCQkvLyBBZGQgdGhlIG1hcmtlciBJRCBzbyB0aGUgdGFibGUgc29ydGVyIHdvbid0IHJlZHVjZQotCQkJCS8vIGVycm9ycyBvbiB0aGUgc2FtZSBsaW5lIGJ1ZyA4MjUwMgotCQkJCWlkIH07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLlRhYmxlVmlldyNnZXREaWFsb2dTZXR0aW5ncygpCi0JICovCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJQWJzdHJhY3RVSVBsdWdpbiBwbHVnaW4gPSAoQWJzdHJhY3RVSVBsdWdpbikgUGxhdGZvcm0KLQkJCQkuZ2V0UGx1Z2luKFBsYXRmb3JtVUkuUExVR0lOX0lEKTsKLQkJSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gcGx1Z2luLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oVEFHX0RJQUxPR19TRUNUSU9OKTsKLQotCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCkKLQkJCXNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihUQUdfRElBTE9HX1NFQ1RJT04pOwotCi0JCXJldHVybiBzZXR0aW5nczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuVGFibGVWaWV3I2NyZWF0ZUFjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJcHJvcGVydGllc0FjdGlvbiA9IG5ldyBBY3Rpb25Qcm9ibGVtUHJvcGVydGllcyh0aGlzLCBnZXRWaWV3ZXIoKSk7Ci0JCXJlc29sdmVNYXJrZXJBY3Rpb24gPSBuZXcgQWN0aW9uUmVzb2x2ZU1hcmtlcih0aGlzLCBnZXRWaWV3ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlclZpZXcjZmlsbENvbnRleHRNZW51QWRkaXRpb25zKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51QWRkaXRpb25zKElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCW1hbmFnZXIuYWRkKHJlc29sdmVNYXJrZXJBY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRSb290VHlwZXMoKSB7Ci0JCXJldHVybiBST09UX1RZUEVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5UYWJsZVZpZXcjZ2V0QWxsRmllbGRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZWxkW10gZ2V0QWxsRmllbGRzKCkgewotCi0JCS8vIEFkZCB0aGUgbWFya2VyIElEIHNvIHRoZSB0YWJsZSBzb3J0ZXIgd29uJ3QgcmVkdWNlCi0JCS8vIGVycm9ycyBvbiB0aGUgc2FtZSBsaW5lIGJ1ZyA4MjUwMgotCQlyZXR1cm4gbmV3IElGaWVsZFtdIHsgbWVzc2FnZSwgcmVzb3VyY2UsIGZvbGRlciwgY2F0ZWdvcnksIGxpbmVOdW1iZXIsCi0JCQkJY3JlYXRpb25UaW1lIH07Ci0JfQotCi0Jdm9pZCB1cGRhdGVUaXRsZSgpIHsKLQkJTWFya2VyTGlzdCB2aXNpYmxlTWFya2VycyA9IGdldFZpc2libGVNYXJrZXJzKCk7Ci0JCVN0cmluZyBicmVha2Rvd24gPSBmb3JtYXRTdW1tYXJ5QnJlYWtEb3duKHZpc2libGVNYXJrZXJzKTsKLQkJaW50IGZpbHRlcmVkQ291bnQgPSB2aXNpYmxlTWFya2Vycy5nZXRJdGVtQ291bnQoKTsKLQkJaW50IHRvdGFsQ291bnQgPSBnZXRUb3RhbE1hcmtlcnMoKTsKLQkJaWYgKGZpbHRlcmVkQ291bnQgIT0gdG90YWxDb3VudCkKLQkJCWJyZWFrZG93biA9IE5MUy5iaW5kKE1hcmtlck1lc3NhZ2VzLnByb2JsZW1fZmlsdGVyX21hdGNoZWRNZXNzYWdlLAotCQkJCQluZXcgT2JqZWN0W10geyBicmVha2Rvd24sIG5ldyBJbnRlZ2VyKGZpbHRlcmVkQ291bnQpLAotCQkJCQkJCW5ldyBJbnRlZ2VyKHRvdGFsQ291bnQpIH0pOwotCQlzZXRDb250ZW50RGVzY3JpcHRpb24oYnJlYWtkb3duKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmb3JtYXRTdW1tYXJ5QnJlYWtEb3duKE1hcmtlckxpc3QgdmlzaWJsZU1hcmtlcnMpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCU1hcmtlck1lc3NhZ2VzLnByb2JsZW1fc3RhdHVzU3VtbWFyeUJyZWFrZG93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCW5ldyBJbnRlZ2VyKHZpc2libGVNYXJrZXJzLmdldEVycm9ycygpKSwKLQkJCQkJCW5ldyBJbnRlZ2VyKHZpc2libGVNYXJrZXJzLmdldFdhcm5pbmdzKCkpLAotCQkJCQkJbmV3IEludGVnZXIodmlzaWJsZU1hcmtlcnMuZ2V0SW5mb3MoKSkgfSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3VtbWFyeShNYXJrZXJMaXN0IG1hcmtlcnMsIFN0cmluZyBtZXNzYWdlS2V5KSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQobWVzc2FnZUtleSwgbmV3IE9iamVjdFtdIHsKLQkJCQluZXcgSW50ZWdlcihtYXJrZXJzLmdldEl0ZW1Db3VudCgpKSwKLQkJCQlmb3JtYXRTdW1tYXJ5QnJlYWtEb3duKG1hcmtlcnMpIH0pOwotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gKHRoZSB0b3RhbCBudW1iZXIgb2YgbWFya2VycyB3aXRoIGVhY2gKLQkgKiBzZXZlcml0eSB0eXBlKSBmb3IgdGhlIG1hcmtlcnMgY29udGFpbmVkIGluIHRoZSBzZWxlY3Rpb24gcGFzc2VkIGluLiBUaGlzCi0JICogaW5mb3JtYXRpb24gaXMgdGhlbiBtYXNzYWdlZCBpbnRvIGEgc3RyaW5nIHdoaWNoIG1heSBiZSBkaXNwbGF5ZWQgYnkgdGhlCi0JICogY2FsbGVyLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIGEgdmFsaWQgc2VsZWN0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBhIG1lc3NhZ2UgcmVhZHkgZm9yIGRpc3BsYXkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVwZGF0ZVN1bW1hcnlTZWxlY3RlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBzZWxlY3Rpb25MaXN0OwotCi0JCXNlbGVjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIHNlbGVjdGlvbkl0ZXJhdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzZWxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1hcmtlck5vZGUgbmV4dCA9IChNYXJrZXJOb2RlKSBzZWxlY3Rpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dC5pc0NvbmNyZXRlKCkpCi0JCQkJc2VsZWN0aW9uTGlzdC5hZGQobmV4dCk7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0U3VtbWFyeShuZXcgTWFya2VyTGlzdChzZWxlY3Rpb25MaXN0KSwKLQkJCQkicHJvYmxlbS5zdGF0dXNTdW1tYXJ5U2VsZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJWaWV3I2dldE1hcmtlclR5cGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TWFya2VyVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBJTWFya2VyLlBST0JMRU0gfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0YXRpY0NvbnRleHRJZCgpIHsKLQkJLy8gVE9ETyB0aGlzIGNvbnRleHQgaXMgbWlzc2luZyAtIGFkZCBpdAotCQlyZXR1cm4gUGxhdGZvcm1VSS5QTFVHSU5fSUQgKyAiLnByb2JsZW1fdmlld19jb250ZXh0IjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlclZpZXcjY3JlYXRlRmlsdGVyc0RpYWxvZygpCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZ01hcmtlckZpbHRlciBjcmVhdGVGaWx0ZXJzRGlhbG9nKCkgewotCi0JCU1hcmtlckZpbHRlcltdIGZpbHRlcnMgPSBnZXRVc2VyRmlsdGVycygpOwotCQlQcm9ibGVtRmlsdGVyW10gcHJvYmxlbUZpbHRlcnMgPSBuZXcgUHJvYmxlbUZpbHRlcltmaWx0ZXJzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoZmlsdGVycywgMCwgcHJvYmxlbUZpbHRlcnMsIDAsIGZpbHRlcnMubGVuZ3RoKTsKLQkJcmV0dXJuIG5ldyBEaWFsb2dQcm9ibGVtRmlsdGVyKGdldFNpdGUoKS5nZXRTaGVsbCgpLCBwcm9ibGVtRmlsdGVycyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlclZpZXcjY3JlYXRlRmlsdGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIE1hcmtlckZpbHRlciBjcmVhdGVGaWx0ZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5ldyBQcm9ibGVtRmlsdGVyKG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJWaWV3I2dldFNlY3Rpb25UYWcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvblRhZygpIHsKLQkJcmV0dXJuIFRBR19ESUFMT0dfU0VDVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyVmlldyNnZXRNYXJrZXJFbmFibGVtZW50UHJlZmVyZW5jZU5hbWUoKQotCSAqLwotCVN0cmluZyBnZXRNYXJrZXJFbmFibGVtZW50UHJlZmVyZW5jZU5hbWUoKSB7Ci0JCXJldHVybiBJREVJbnRlcm5hbFByZWZlcmVuY2VzLkxJTUlUX1BST0JMRU1TOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJWaWV3I2dldE1hcmtlckxpbWl0UHJlZmVyZW5jZU5hbWUoKQotCSAqLwotCVN0cmluZyBnZXRNYXJrZXJMaW1pdFByZWZlcmVuY2VOYW1lKCkgewotCQlyZXR1cm4gSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5QUk9CTEVNU19MSU1JVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyVmlldyNnZXRGaWx0ZXJzUHJlZmVyZW5jZU5hbWUoKQotCSAqLwotCVN0cmluZyBnZXRGaWx0ZXJzUHJlZmVyZW5jZU5hbWUoKSB7Ci0JCXJldHVybiBJREVJbnRlcm5hbFByZWZlcmVuY2VzLlBST0JMRU1TX0ZJTFRFUlM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlclZpZXcjZ2V0QWxsRmlsdGVycygpCi0JICovCi0JTWFya2VyRmlsdGVyW10gZ2V0QWxsRmlsdGVycygpIHsKLQkJTWFya2VyRmlsdGVyW10gdXNlckZpbHRlcnMgPSBzdXBlci5nZXRBbGxGaWx0ZXJzKCk7Ci0JCUNvbGxlY3Rpb24gZGVjbGFyZWRGaWx0ZXJzID0gTWFya2VyU3VwcG9ydFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UmVnaXN0ZXJlZEZpbHRlcnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWNsYXJlZEZpbHRlcnMuaXRlcmF0b3IoKTsKLQotCQlNYXJrZXJGaWx0ZXJbXSBhbGxGaWx0ZXJzID0gbmV3IE1hcmtlckZpbHRlclt1c2VyRmlsdGVycy5sZW5ndGgKLQkJCQkrIGRlY2xhcmVkRmlsdGVycy5zaXplKCldOwotCQlTeXN0ZW0uYXJyYXljb3B5KHVzZXJGaWx0ZXJzLCAwLCBhbGxGaWx0ZXJzLCAwLCB1c2VyRmlsdGVycy5sZW5ndGgpOwotCQlpbnQgaW5kZXggPSB1c2VyRmlsdGVycy5sZW5ndGg7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYWxsRmlsdGVyc1tpbmRleF0gPSAoTWFya2VyRmlsdGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpbmRleCsrOwotCQl9Ci0JCXJldHVybiBhbGxGaWx0ZXJzOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlclZpZXcjYWRkRHJvcERvd25Db250cmlidXRpb25zKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0Jdm9pZCBhZGREcm9wRG93bkNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQotCQlNZW51TWFuYWdlciBncm91cEJ5TWVudSA9IG5ldyBNZW51TWFuYWdlcihNYXJrZXJNZXNzYWdlcy5Qcm9ibGVtVmlld19Hcm91cEJ5TWVudSk7Ci0JCWdyb3VwQnlNZW51LmFkZChuZXcgR3JvdXBpbmdBY3Rpb24oTWFya2VyTWVzc2FnZXMuUHJvYmxlbVZpZXdfU2V2ZXJpdHksIHNldmVyaXR5LCB0aGlzKSk7Ci0JCWdyb3VwQnlNZW51LmFkZChuZXcgR3JvdXBpbmdBY3Rpb24oTWFya2VyTWVzc2FnZXMuUHJvYmxlbVZpZXdfQ2F0ZWdvcnksIGNhdGVnb3J5LCB0aGlzKSk7Ci0JCQotCQlJdGVyYXRvciBkZWZpbmVkR3JvdXBzID0gTWFya2VyU3VwcG9ydFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0TWFya2VyR3JvdXBzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCXdoaWxlKGRlZmluZWRHcm91cHMuaGFzTmV4dCgpKXsKLQkJCUZpZWxkTWFya2VyR3JvdXAgZ3JvdXAgPSAoRmllbGRNYXJrZXJHcm91cCkgZGVmaW5lZEdyb3Vwcy5uZXh0KCk7Ci0JCQlncm91cEJ5TWVudS5hZGQobmV3IEdyb3VwaW5nQWN0aW9uKGdyb3VwLmdldERlc2NyaXB0aW9uKCksZ3JvdXAsdGhpcykpOwotCQl9Ci0JCQotCQlncm91cEJ5TWVudS5hZGQobmV3IEdyb3VwaW5nQWN0aW9uKE1hcmtlck1lc3NhZ2VzLlByb2JsZW1WaWV3X05vbmUsIG51bGwsIHRoaXMpKTsKLQkJbWVudS5hZGQoZ3JvdXBCeU1lbnUpOwotCi0JCXN1cGVyLmFkZERyb3BEb3duQ29udHJpYnV0aW9ucyhtZW51KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNpemUgdGhlIGNhdGVnb3J5IGNvbHVtbiBpbiB0aGUgdGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVnZW5lcmF0ZUxheW91dCgpIHsKLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWdldFZpZXdlcigpLmdldFRyZWUoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlDb2x1bW5MYXlvdXREYXRhW10gY29sdW1uV2lkdGhzID0gZ2V0RGVmYXVsdENvbHVtbkxheW91dHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5XaWR0aHMubGVuZ3RoOyBpKyspIHsKLQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldpZHRoc1tpXSk7Ci0KLQkJfQotCQlnZXRWaWV3ZXIoKS5nZXRUcmVlKCkubGF5b3V0KHRydWUpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLlRhYmxlVmlldyNzZXRTb3J0ZXIob3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5UYWJsZVNvcnRlcikKLQkgKi8KLQl2b2lkIHNldFNvcnRlcihUYWJsZVNvcnRlciBzb3J0ZXIyKSB7Ci0JCWdldE1hcmtlckFkYXB0ZXIoKS5nZXRDYXRlZ29yeVNvcnRlcigpLnNldFRhYmxlU29ydGVyKHNvcnRlcjIpOwotCQlnZXRNYXJrZXJBZGFwdGVyKCkuZ2V0Q2F0ZWdvcnlTb3J0ZXIoKS5zYXZlU3RhdGUoZ2V0RGlhbG9nU2V0dGluZ3MoKSk7Ci0JCXJlZnJlc2hWaWV3ZXIoKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJWaWV3I2dldFRhYmxlU29ydGVyKCkKLQkgKi8KLQlwdWJsaWMgVGFibGVTb3J0ZXIgZ2V0VGFibGVTb3J0ZXIoKSB7Ci0JCXJldHVybiAoKENhdGVnb3J5U29ydGVyKSBnZXRWaWV3ZXIoKS5nZXRTb3J0ZXIoKSkuaW5uZXJTb3J0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlclZpZXcjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLQkJY3JlYXRlQWN0aXZpdHlNYW5hZ2VyTGlzdGVuZXIoKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKS5nZXRBY3Rpdml0eU1hbmFnZXIoKQotCQkJCS5hZGRBY3Rpdml0eU1hbmFnZXJMaXN0ZW5lcihhY3Rpdml0eU1hbmFnZXJMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGxpc3RlbmVyIGZvciBhY3Rpdml0eSBjaGFuZ2VzLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVBY3Rpdml0eU1hbmFnZXJMaXN0ZW5lcigpIHsKLQkJYWN0aXZpdHlNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgSUFjdGl2aXR5TWFuYWdlckxpc3RlbmVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklBY3Rpdml0eU1hbmFnZXJMaXN0ZW5lciNhY3Rpdml0eU1hbmFnZXJDaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuQWN0aXZpdHlNYW5hZ2VyRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGFjdGl2aXR5TWFuYWdlckNoYW5nZWQoCi0JCQkJCUFjdGl2aXR5TWFuYWdlckV2ZW50IGFjdGl2aXR5TWFuYWdlckV2ZW50KSB7Ci0JCQkJY2xlYXJFbmFibGVkRmlsdGVycygpOwotCQkJCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCX0KLQkJfTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmllbGQgd2hvc2UgZGVzY3JpcHRpb24gbWF0Y2hlcyBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIElGaWVsZAotCSAqLwotCXB1YmxpYyBJRmllbGQgZmluZEZpZWxkKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlJRmllbGRbXSBmaWVsZHMgPSBnZXRTb3J0aW5nRmllbGRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmllbGRzW2ldLmdldERlc2NyaXB0aW9uKCkuZXF1YWxzKGRlc2NyaXB0aW9uKSkKLQkJCQlyZXR1cm4gZmllbGRzW2ldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuVGFibGVWaWV3I2J1aWxkU29ydGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVmlld2VyU29ydGVyIGJ1aWxkU29ydGVyKCkgewotCi0JCVRhYmxlU29ydGVyIHNvcnRlciA9IFRhYmxlU29ydGVyLmNyZWF0ZVRhYmxlU29ydGVyKGdldFNvcnRpbmdGaWVsZHMoKSk7Ci0JCXNvcnRlci5yZXN0b3JlU3RhdGUoZ2V0RGlhbG9nU2V0dGluZ3MoKSk7Ci0JCUNhdGVnb3J5U29ydGVyIGNhdGVnb3J5ID0gbmV3IENhdGVnb3J5U29ydGVyKHNvcnRlcik7Ci0JCWNhdGVnb3J5LnJlc3RvcmVTdGF0ZShnZXREaWFsb2dTZXR0aW5ncygpLCB0aGlzKTsKLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvU29ydFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL1NvcnRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMWI3NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvU29ydFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgU29ydFV0aWwgewotCi0gICAgLyoqCi0gICAgICogICogUmV0dXJucyB0aGUgayBzbWFsbGVzdCBpdGVtcyBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbi4gUnVucyBpbgotICAgICAqIE8obikgdGltZSwgYXZlcmFnZSBjYXNlLiBUaGUgcmVzdWx0aW5nIGNvbGxlY3Rpb24gaXMgbm90IHNvcnRlZC4KLSAgICAgKiBAcGFyYW0gZWxlbWVudHMgdGhlIE1hcmtlckxpc3QgdG8gY2hlY2sKLSAgICAgKiBAcGFyYW0gYyB0aGUgY29tcGFyYXRvcgotICAgICAqIEBwYXJhbSBrIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gY29sbGVjdAotICAgICAqIEBwYXJhbSBtb24gdGhlIG1vbml0b3IKLSAgICAgKiBAcmV0dXJuIE1hcmtlckxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcmtlckxpc3QgZ2V0Rmlyc3QoTWFya2VyTGlzdCBlbGVtZW50cywgQ29tcGFyYXRvciBjLCBpbnQgaywKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uKSB7Ci0gICAgCUNvbGxlY3Rpb24gc3RhcnQgPSBlbGVtZW50cy5hc0xpc3QoKTsKLSAgICAgICAgQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KHN0YXJ0LnNpemUoKSk7Ci0KLSAgICAgICAgbW9uLmJlZ2luVGFzayhNYXJrZXJNZXNzYWdlcy5Tb3J0VXRpbF9maW5kaW5nX2ZpcnN0LCAxMDAwKTsgCi0KLSAgICAgICAgZ2V0Rmlyc3QocmVzdWx0LCBzdGFydCwgYywgaywgbW9uLCAxMDAwKTsKLQotICAgICAgICBtb24uZG9uZSgpOwotCi0gICAgICAgIHJldHVybiBuZXcgTWFya2VyTGlzdChyZXN1bHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0Rmlyc3QoQ29sbGVjdGlvbiByZXN1bHQsIENvbGxlY3Rpb24gZWxlbWVudHMsCi0gICAgICAgICAgICBDb21wYXJhdG9yIGMsIGludCBrLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbiwgaW50IHRvdGFsV29yaykgewotCi0gICAgICAgIGlmIChtb24uaXNDYW5jZWxlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWxlbWVudHMuc2l6ZSgpIDw9IGspIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoZWxlbWVudHMpOwotICAgICAgICAgICAgbW9uLndvcmtlZCh0b3RhbFdvcmspOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHBpdm90OwotCi0gICAgICAgIGlmIChlbGVtZW50cyBpbnN0YW5jZW9mIEFycmF5TGlzdCkgewotICAgICAgICAgICAgcGl2b3QgPSAoKEFycmF5TGlzdCkgZWxlbWVudHMpLmdldChlbGVtZW50cy5zaXplKCkgLyAyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBpdm90ID0gZWxlbWVudHMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbiBtb3JlID0gbmV3IEFycmF5TGlzdChlbGVtZW50cy5zaXplKCkpOwotICAgICAgICBDb2xsZWN0aW9uIGxlc3MgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLnNpemUoKSk7Ci0gICAgICAgIENvbGxlY3Rpb24gZXF1YWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgcGFydGl0aW9uSGVscGVyKGxlc3MsIG1vcmUsIGVxdWFsLCBlbGVtZW50cywgYywgcGl2b3QsIG1vbiwKLSAgICAgICAgICAgICAgICB0b3RhbFdvcmsgLyAyKTsKLQotICAgICAgICBpZiAobGVzcy5zaXplKCkgPj0gaykgewotICAgICAgICAgICAgZ2V0Rmlyc3QocmVzdWx0LCBsZXNzLCBjLCBrLCBtb24sIHRvdGFsV29yayAvIDIpOwotICAgICAgICB9IGVsc2UgaWYgKGxlc3Muc2l6ZSgpICsgZXF1YWwuc2l6ZSgpID49IGspIHsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gayAtIGxlc3Muc2l6ZSgpOwotCi0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKGxlc3MpOwotCi0gICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gZXF1YWwuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbmV4dCA9IGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuZXh0KTsKLSAgICAgICAgICAgICAgICBjb3VudC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbW9uLndvcmtlZCh0b3RhbFdvcmsgLyAyKTsKLSAgICAgICAgfSBlbHNlIGlmIChsZXNzLnNpemUoKSArIGVxdWFsLnNpemUoKSArIG1vcmUuc2l6ZSgpID49IGspIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwobGVzcyk7Ci0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKGVxdWFsKTsKLQotICAgICAgICAgICAgZ2V0Rmlyc3QocmVzdWx0LCBtb3JlLCBjLCBrIC0gbGVzcy5zaXplKCkgLSBlcXVhbC5zaXplKCksIG1vbiwKLSAgICAgICAgICAgICAgICAgICAgdG90YWxXb3JrIC8gMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnRpdGlvbkhlbHBlcihDb2xsZWN0aW9uIGxlc3MsIENvbGxlY3Rpb24gbW9yZSwKLSAgICAgICAgICAgIENvbGxlY3Rpb24gZXF1YWwsIENvbGxlY3Rpb24gaW5wdXQsIENvbXBhcmF0b3IgYywgT2JqZWN0IHRvVGVzdCwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uLCBpbnQgdG90YWxXb3JrKSB7Ci0gICAgICAgIGludCB3b3JrUmVtYWluaW5nID0gdG90YWxXb3JrOwotICAgICAgICBpbnQgY291bnRlciA9IDA7Ci0gICAgICAgIGludCB0b3RhbEl0ZW1zID0gaW5wdXQuc2l6ZSgpOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBpbnB1dC5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgaW50IGNvbXBhcmVSZXN1bHQgPSBjLmNvbXBhcmUobmV4dCwgdG9UZXN0KTsKLQotICAgICAgICAgICAgaWYgKGNvbXBhcmVSZXN1bHQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbGVzcy5hZGQobmV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmVSZXN1bHQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbW9yZS5hZGQobmV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVxdWFsLmFkZChuZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY291bnRlcisrOwotICAgICAgICAgICAgaWYgKGNvdW50ZXIgPiAxMDApIHsKLSAgICAgICAgICAgICAgICBpZiAobW9uLmlzQ2FuY2VsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBuZXh0V29ya2VkID0gY291bnRlciAqIHdvcmtSZW1haW5pbmcgLyB0b3RhbEl0ZW1zOwotICAgICAgICAgICAgICAgIG1vbi53b3JrZWQobmV4dFdvcmtlZCk7Ci0gICAgICAgICAgICAgICAgd29ya1JlbWFpbmluZyAtPSBuZXh0V29ya2VkOwotICAgICAgICAgICAgICAgIHRvdGFsSXRlbXMgLT0gY291bnRlcjsKLSAgICAgICAgICAgICAgICBjb3VudGVyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1vbi53b3JrZWQod29ya1JlbWFpbmluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGl2aWRlcyB0aGUgaXRlbXMgaW4gdGhlIGlucHV0IGNvbGxlY3Rpb24gaW50byB0aHJlZSBzZXRzIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBhcmUgbGVzcyB0aGFuLAotICAgICAqIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHRlc3QgaXRlbS4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgZ2l2ZW4gbW9uaXRvciBpcyBjYW5jZWxsZWQgKHBvc3NpYmx5IGJ5IGFub3RoZXIgdGhyZWFkKSwgdGhlIG9wZXJhdGlvbiB3aWxsCi0gICAgICogYmUgYWJvcnRlZC4gSW4gdGhpcyBjYXNlLCB0aGUgaW5zZXJ0aW9ucyBtYXkgb25seSBiZSBwYXJ0aWFsbHkgY29tcGxldGUuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBsZXNzCi0gICAgICogQHBhcmFtIG1vcmUKLSAgICAgKiBAcGFyYW0gZXF1YWwKLSAgICAgKiBAcGFyYW0gaW5wdXQKLSAgICAgKiBAcGFyYW0gYwotICAgICAqIEBwYXJhbSB0b1Rlc3QKLSAgICAgKiBAcGFyYW0gbW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHBhcnRpdGlvbihDb2xsZWN0aW9uIGxlc3MsIENvbGxlY3Rpb24gbW9yZSwKLSAgICAgICAgICAgIENvbGxlY3Rpb24gZXF1YWwsIENvbGxlY3Rpb24gaW5wdXQsIENvbXBhcmF0b3IgYywgT2JqZWN0IHRvVGVzdCwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uKSB7Ci0gICAgICAgIG1vbgotICAgICAgICAgICAgICAgIC5iZWdpblRhc2soCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXJrZXJNZXNzYWdlcy5Tb3J0VXRpbF9wYXJ0aXRpb25pbmcsIGlucHV0LnNpemUoKSk7IAotCi0gICAgICAgIGlmICh0b1Rlc3QgPT0gbnVsbCB8fCBjID09IG51bGwpIHsKLSAgICAgICAgICAgIGludCBjb3VudGVyID0gMDsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBpbnB1dC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGNvdW50ZXIrKzsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRlciA+PSAyMCkgewotICAgICAgICAgICAgICAgICAgICBtb24ud29ya2VkKGNvdW50ZXIpOwotICAgICAgICAgICAgICAgICAgICBjb3VudGVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbi5pc0NhbmNlbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1vcmUuYWRkKG5leHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbW9uLndvcmtlZChjb3VudGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcnRpdGlvbkhlbHBlcihsZXNzLCBtb3JlLCBlcXVhbCwgaW5wdXQsIGMsIHRvVGVzdCwgbW9uLCBpbnB1dAotICAgICAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vbi5kb25lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgZmlyc3QgbiBpdGVtcyBmcm9tIHRoZSBnaXZlbiBjb2xsZWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogQHBhcmFtIG51bVRvUmVtb3ZlCi0gICAgICogQHJldHVybiBMaXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHJlbW92ZUZpcnN0KENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IG51bVRvUmVtb3ZlKSB7Ci0gICAgICAgIGludCB0b1JlbW92ZSA9IE1hdGgubWluKGNvbGxlY3Rpb24uc2l6ZSgpLCBudW1Ub1JlbW92ZSk7Ci0KLSAgICAgICAgTGlzdCByZW1vdmVkID0gbmV3IEFycmF5TGlzdCh0b1JlbW92ZSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLQotICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCB0b1JlbW92ZTsgaWR4KyspIHsKLSAgICAgICAgICAgIHJlbW92ZWQuYWRkKGl0ZXIubmV4dCgpKTsKLQotICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZW1vdmVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBncmVhdGVzdCBlbGVtZW50IGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uLCBvciBudWxsIGlmIHRoZSBjb2xsZWN0aW9uCi0gICAgICogaXMgZW1wdHkuCi0gICAgICogIAotICAgICAqIEBwYXJhbSB0b1NlYXJjaCBjb2xsZWN0aW9uIHRvIHNlYXJjaAotICAgICAqIEBwYXJhbSBjIGNvbXBhcmF0b3IgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGdyZWF0ZXN0IGl0ZW0KLSAgICAgKiBAcmV0dXJuIHRoZSBncmVhdGVzdCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZmluZEdyZWF0ZXN0KENvbGxlY3Rpb24gdG9TZWFyY2gsIENvbXBhcmF0b3IgYykgewotICAgICAgICAvLyBJZiB0aGlzIHNldCBpcyBhbHJlYWR5IHNvcnRlZCB1c2luZyB0aGUgZ2l2ZW4gY29tcGFyYXRvciwganVzdCByZXR1cm4gdGhlIGxhc3QgZWxlbWVudAotICAgICAgICBpZiAodG9TZWFyY2ggaW5zdGFuY2VvZiBTb3J0ZWRTZXQKLSAgICAgICAgICAgICAgICAmJiAoKFNvcnRlZFNldCkgdG9TZWFyY2gpLmNvbXBhcmF0b3IoKS5lcXVhbHMoYykpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFNvcnRlZFNldCkgdG9TZWFyY2gpLmxhc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE90aGVyd2lzZSwgZXhoYXVzdGl2ZWx5IHNlYXJjaCBmb3IgdGhlIGdyZWF0ZXN0IGVsZW1lbnQKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB0b1NlYXJjaC5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IGMuY29tcGFyZShyZXN1bHQsIG5leHQpID4gMCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL1RhYmxlU29ydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvVGFibGVTb3J0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNWJmNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvVGFibGVTb3J0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotCi1wdWJsaWMgY2xhc3MgVGFibGVTb3J0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotICAgIHByaXZhdGUgVGFibGVWaWV3IHZpZXc7Ci0KLSAgICBwcml2YXRlIFRhYmxlU29ydERpYWxvZyBkaWFsb2c7Ci0KLSAgICBwdWJsaWMgVGFibGVTb3J0QWN0aW9uKFRhYmxlVmlldyB2aWV3LCBUYWJsZVNvcnREaWFsb2cgZGlhbG9nKSB7Ci0gICAgICAgIHN1cGVyKE1hcmtlck1lc3NhZ2VzLnNvcnRBY3Rpb25fdGl0bGUpOwotICAgICAgICB0aGlzLnZpZXcgPSB2aWV3OwotICAgICAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZzsKLSAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyAmJiBkaWFsb2cuaXNEaXJ0eSgpKSB7Ci0gICAgICAgICAgICB2aWV3LnNldFNvcnRlcihkaWFsb2cuZ2V0U29ydGVyKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvVGFibGVTb3J0RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9UYWJsZVNvcnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxZWJlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9UYWJsZVNvcnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVHJheURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuSVNoZWxsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGUgVGFibGVTb3J0RGlhbG9nIGlzIHRoZSBkaWFsb2cgdGhhdCBhbGxvd3Mgc29ydCBvcmRlciB0bwotICogYmUgc2VsZWN0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZVNvcnREaWFsb2cgZXh0ZW5kcyBUcmF5RGlhbG9nIHsKLQotICAgIHByaXZhdGUgVGFibGVTb3J0ZXIgc29ydGVyOwotCi0gICAgcHJpdmF0ZSBDb21ib1tdIHByaW9yaXR5Q29tYm9zOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBwcm9wZXJ0eVRleHQ7Ci0KLSAgICBwcml2YXRlIElGaWVsZFtdIHByb3BlcnRpZXM7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbltdIGFzY2VuZGluZ0J1dHRvbnM7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbltdIGRlc2NlbmRpbmdCdXR0b25zOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpcnR5OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yIGNvbHVtbkNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotICAgICAgICAgICAgaW50IGluZGV4MCA9IC0xOwotICAgICAgICAgICAgaW50IGluZGV4MSA9IC0xOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eVRleHQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlUZXh0W2ldLmVxdWFscyhhcmcwKSkKLSAgICAgICAgICAgICAgICAgICAgaW5kZXgwID0gaTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlUZXh0W2ldLmVxdWFscyhhcmcxKSkKLSAgICAgICAgICAgICAgICAgICAgaW5kZXgxID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbmRleDAgLSBpbmRleDE7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICAgKiBAcGFyYW0gc29ydGVyCi0gICAgICovCi0gICAgcHVibGljIFRhYmxlU29ydERpYWxvZyhJU2hlbGxQcm92aWRlciBwYXJlbnRTaGVsbCwgVGFibGVTb3J0ZXIgc29ydGVyKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICAgICAgdGhpcy5zb3J0ZXIgPSBzb3J0ZXI7Ci0gICAgICAgIGRpcnR5ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXaW5kb3cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotICAgICAgICBuZXdTaGVsbC5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLnNvcnREaWFsb2dfdGl0bGUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgICAgICBpZiAoc29ydGVyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotCi0gICAgICAgIGNyZWF0ZVByaW9yaXRpZXNBcmVhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZVJlc3RvcmVEZWZhdWx0c0J1dHRvbihjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVTZXBhcmF0b3JMaW5lKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHByb2lyaXRpZXMgYXJlYS4KLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByaW9yaXRpZXNBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIHByaW9yaXRpZXNBcmVhID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgcHJpb3JpdGllc0FyZWEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0gICAgICAgIAotICAgICAgICBpbnRbXSBwcmlvcml0aWVzID0gc29ydGVyLmdldFByaW9yaXRpZXMoKTsKLQotICAgICAgICBhc2NlbmRpbmdCdXR0b25zID0gbmV3IEJ1dHRvbltwcmlvcml0aWVzLmxlbmd0aF07Ci0gICAgICAgIGRlc2NlbmRpbmdCdXR0b25zID0gbmV3IEJ1dHRvbltwcmlvcml0aWVzLmxlbmd0aF07Ci0gICAgICAgIHByaW9yaXR5Q29tYm9zID0gbmV3IENvbWJvW01hdGgubWluKHByaW9yaXRpZXMubGVuZ3RoLAotICAgICAgICAgICAgICAgIFRhYmxlU29ydGVyLk1BWF9ERVBUSCldOwotICAgICAgICBpbml0UHJpb3RpdHlUZXh0KCk7Ci0KLSAgICAgICAgTGFiZWwgc29ydEJ5TGFiZWwgPSBuZXcgTGFiZWwocHJpb3JpdGllc0FyZWEsIFNXVC5OVUxMKTsKLSAgICAgICAgc29ydEJ5TGFiZWwuc2V0VGV4dChNYXJrZXJNZXNzYWdlcy5zb3J0RGlhbG9nX2xhYmVsKTsgCi0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHNvcnRCeUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmlvcml0eUNvbWJvcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gaTsKLSAgICAgICAgICAgIExhYmVsIG51bWJlckxhYmVsID0gbmV3IExhYmVsKHByaW9yaXRpZXNBcmVhLCBTV1QuTlVMTCk7Ci0gICAgICAgICAgICBudW1iZXJMYWJlbAotICAgICAgICAgICAgICAgICAgICAuc2V0VGV4dChOTFMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZChNYXJrZXJNZXNzYWdlcy5zb3J0RGlhbG9nX2NvbHVtbkxhYmVsLG5ldyBJbnRlZ2VyKGkgKyAxKSkpOyAKLQotICAgICAgICAgICAgcHJpb3JpdHlDb21ib3NbaV0gPSBuZXcgQ29tYm8ocHJpb3JpdGllc0FyZWEsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICAgICAgcHJpb3JpdHlDb21ib3NbaV0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgICAgICBDb21wb3NpdGUgZGlyZWN0aW9uR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHByaW9yaXRpZXNBcmVhLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBkaXJlY3Rpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNjZW5kaW5nQnV0dG9uc1tpXSA9IG5ldyBCdXR0b24oZGlyZWN0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgICAgICBhc2NlbmRpbmdCdXR0b25zW2ldLnNldFRleHQoZ2V0QXNjZW5kaW5nVGV4dChpKSk7Ci0gICAgICAgICAgICBhc2NlbmRpbmdCdXR0b25zW2ldLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFya0RpcnR5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBkZXNjZW5kaW5nQnV0dG9uc1tpXSA9IG5ldyBCdXR0b24oZGlyZWN0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgICAgICBkZXNjZW5kaW5nQnV0dG9uc1tpXS5zZXRUZXh0KGdldERlc2NlbmRpbmdUZXh0KGkpKTsKLSAgICAgICAgICAgIGRlc2NlbmRpbmdCdXR0b25zW2ldLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFya0RpcnR5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGlmIChpIDwgcHJpb3JpdHlDb21ib3MubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIHByaW9yaXR5Q29tYm9zW2ldLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2xkU2VsZWN0aW9uRGlyZWN0aW9uID0gVGFibGVTb3J0ZXIuQVNDRU5ESU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NlbmRpbmdCdXR0b25zW2luZGV4XS5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRTZWxlY3Rpb25EaXJlY3Rpb24gPSBUYWJsZVNvcnRlci5ERVNDRU5ESU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IG9sZFNlbGVjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KEFycmF5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXNMaXN0KHByaW9yaXR5Q29tYm9zW2luZGV4XS5nZXRJdGVtcygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbGRTZWxlY3Rpb25MaXN0LnJlbW92ZUFsbChBcnJheXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzTGlzdChwcmlvcml0eUNvbWJvc1tpbmRleCArIDFdLmdldEl0ZW1zKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRTZWxlY3Rpb25MaXN0LnNpemUoKSAhPSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvbGRTZWxlY3Rpb24gPSAoU3RyaW5nKSBvbGRTZWxlY3Rpb25MaXN0LmdldCgwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdTZWxlY3Rpb24gPSBwcmlvcml0eUNvbWJvc1tpbmRleF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEl0ZW0ocHJpb3JpdHlDb21ib3NbaW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbkluZGV4KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFNlbGVjdGlvbi5lcXVhbHMobmV3U2VsZWN0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpbmRleCArIDE7IGogPCBwcmlvcml0eUNvbWJvcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdTZWxlY3Rpb25JbmRleCA9IHByaW9yaXR5Q29tYm9zW2pdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZihuZXdTZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBjb21ibydzIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGVxdWFsIHRvIG5ld1NlbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmlvcml0eUNvbWJvc1tqXS5nZXRTZWxlY3Rpb25JbmRleCgpID09IG5ld1NlbGVjdGlvbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5Q29tYm9zW2pdLnJlbW92ZShuZXdTZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5zZXJ0aW9uUG9pbnQgPSAtMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQXJyYXlzLmJpbmFyeVNlYXJjaChwcmlvcml0eUNvbWJvc1tqXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEl0ZW1zKCksIG9sZFNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvbXBhcmF0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnQgPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluc2VydGlvblBvaW50IDw9IHByaW9yaXR5Q29tYm9zW2pdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SXRlbUNvdW50KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eUNvbWJvc1tqXS5hZGQob2xkU2VsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5Q29tYm9zW2pdLmFkZChvbGRTZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eUNvbWJvc1tqXS5zZWxlY3QocHJpb3JpdHlDb21ib3Nbal0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZihvbGRTZWxlY3Rpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjZW5kaW5nQnV0dG9uc1tpbmRleF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VsZWN0aW9uKGFzY2VuZGluZ0J1dHRvbnNbal0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbmRpbmdCdXR0b25zW2luZGV4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZWxlY3Rpb24oZGVzY2VuZGluZ0J1dHRvbnNbal0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY2VuZGluZ0J1dHRvbnNbal0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VsZWN0aW9uKG9sZFNlbGVjdGlvbkRpcmVjdGlvbiA9PSBUYWJsZVNvcnRlci5BU0NFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kaW5nQnV0dG9uc1tqXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZWxlY3Rpb24ob2xkU2VsZWN0aW9uRGlyZWN0aW9uID09IFRhYmxlU29ydGVyLkRFU0NFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgY29tYm8gY29udGFpbnMgbmV3U2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3U2VsZWN0aW9uSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eUNvbWJvc1tqXS5yZW1vdmUobmV3U2VsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluc2VydGlvblBvaW50ID0gLTEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEFycmF5cy5iaW5hcnlTZWFyY2gocHJpb3JpdHlDb21ib3Nbal0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJdGVtcygpLCBvbGRTZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db21wYXJhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50ID49IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbnNlcnRpb25Qb2ludCA8PSBwcmlvcml0eUNvbWJvc1tqXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEl0ZW1Db3VudCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHlDb21ib3Nbal0uYWRkKG9sZFNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eUNvbWJvc1tqXS5hZGQob2xkU2VsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXJrRGlydHkoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmlvcml0eUNvbWJvc1tpXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFya0RpcnR5KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB1cGRhdGVVSUZyb21Tb3J0ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRlc2NlbmRpbmcgbGFiZWwgZm9yIHRoZSBEZXNjZW5kaW5nIGZpZWxkCi0gICAgICogYXQgaS4gVXNlIHRoZSBpbmRleCB0byBkZXRlcm1pbmUgdGhlIG1uZW1vbmljLgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVzY2VuZGluZ1RleHQoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJY2FzZSAxOgotCQkJcmV0dXJuIE1hcmtlck1lc3NhZ2VzLnNvcnREaXJlY3Rpb25EZXNjZW5kaW5nX3RleHQyOwotCQljYXNlIDI6Ci0JCQlyZXR1cm4gTWFya2VyTWVzc2FnZXMuc29ydERpcmVjdGlvbkRlc2NlbmRpbmdfdGV4dDM7Ci0JCWNhc2UgMzoKLQkJCXJldHVybiBNYXJrZXJNZXNzYWdlcy5zb3J0RGlyZWN0aW9uRGVzY2VuZGluZ190ZXh0NDsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBNYXJrZXJNZXNzYWdlcy5zb3J0RGlyZWN0aW9uRGVzY2VuZGluZ190ZXh0OwotCX0KLQkKLX0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYXNjZW5kaW5nIGxhYmVsIGZvciB0aGUgQXNjZW5kaW5nIGZpZWxkCi0gICAgICogYXQgaS4gVXNlIHRoZSBpbmRleCB0byBkZXRlcm1pbmUgdGhlIG1uZW1vbmljLgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXNjZW5kaW5nVGV4dChpbnQgaW5kZXgpIHsKLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSAxOgotCQkJCXJldHVybiBNYXJrZXJNZXNzYWdlcy5zb3J0RGlyZWN0aW9uQXNjZW5kaW5nX3RleHQyOwotCQkJY2FzZSAyOgotCQkJCXJldHVybiBNYXJrZXJNZXNzYWdlcy5zb3J0RGlyZWN0aW9uQXNjZW5kaW5nX3RleHQzOwotCQkJY2FzZSAzOgotCQkJCXJldHVybiBNYXJrZXJNZXNzYWdlcy5zb3J0RGlyZWN0aW9uQXNjZW5kaW5nX3RleHQ0OwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gTWFya2VyTWVzc2FnZXMuc29ydERpcmVjdGlvbkFzY2VuZGluZ190ZXh0OwotCQl9Ci0JCQotCX0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgcmVzdG9yZSBkZWZhdWx0cyBidXR0b24uCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSZXN0b3JlRGVmYXVsdHNCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gZGVmYXVsdHNCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBkZWZhdWx0c0J1dHRvbi5zZXRUZXh0KE1hcmtlck1lc3NhZ2VzLnJlc3RvcmVEZWZhdWx0c190ZXh0KTsKLSAgICAgICAgc2V0QnV0dG9uU2l6ZShkZWZhdWx0c0J1dHRvbiwgbmV3IEdyaWREYXRhKAotICAgICAgICAgICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGRlZmF1bHRzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHJlc3RvcmVEZWZhdWx0cygpOwotICAgICAgICAgICAgICAgIG1hcmtEaXJ0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2VwYXJhdG9yTGluZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLSAgICAgICAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotICAgICAgICAvLwkJc2VwYXJhdG9yLnNldEZvcmVncm91bmQobmV3IENvbG9yKHBhcmVudC5nZXREaXNwbGF5KCksIDE1MCwgMTUwLCAxNTApKTsKLSAgICAgICAgLy8JCXNlcGFyYXRvci5zZXRCYWNrZ3JvdW5kKG5ldyBDb2xvcihwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNTAsIDE1MCwgMTUwKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVEZWZhdWx0cygpIHsKLSAgICAgICAgdXBkYXRlVUkoc29ydGVyLmdldERlZmF1bHRQcmlvcml0aWVzKCksIHNvcnRlci5nZXREZWZhdWx0RGlyZWN0aW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVUlGcm9tU29ydGVyKCkgewotICAgICAgICB1cGRhdGVVSShzb3J0ZXIuZ2V0UHJpb3JpdGllcygpLCBzb3J0ZXIuZ2V0RGlyZWN0aW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVUkoaW50W10gcHJpb3JpdGllcywgaW50W10gZGlyZWN0aW9ucykgewotICAgICAgICBBcnJheUxpc3QgYXZhaWxhYmxlUHJpb3JpdGllcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzCi0gICAgICAgICAgICAgICAgLmFzTGlzdChwcm9wZXJ0eVRleHQpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByaW9yaXR5Q29tYm9zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBwcmlvcml0eUNvbWJvc1tpXS5yZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXZhaWxhYmxlUHJpb3JpdGllcy5zaXplKCk7IGorKykKLSAgICAgICAgICAgICAgICBwcmlvcml0eUNvbWJvc1tpXS5hZGQoKFN0cmluZykgYXZhaWxhYmxlUHJpb3JpdGllcy5nZXQoaikpOwotICAgICAgICAgICAgcHJpb3JpdHlDb21ib3NbaV0uc2VsZWN0KHByaW9yaXR5Q29tYm9zW2ldCi0gICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKHByb3BlcnR5VGV4dFtwcmlvcml0aWVzW2ldXSkpOwotICAgICAgICAgICAgYXZhaWxhYmxlUHJpb3JpdGllcy5yZW1vdmUocHJvcGVydHlUZXh0W3ByaW9yaXRpZXNbaV1dKTsKLQotICAgICAgICAgICAgYXNjZW5kaW5nQnV0dG9uc1tpXQotICAgICAgICAgICAgICAgICAgICAuc2V0U2VsZWN0aW9uKGRpcmVjdGlvbnNbcHJpb3JpdGllc1tpXV0gPT0gVGFibGVTb3J0ZXIuQVNDRU5ESU5HKTsKLSAgICAgICAgICAgIGRlc2NlbmRpbmdCdXR0b25zW2ldCi0gICAgICAgICAgICAgICAgICAgIC5zZXRTZWxlY3Rpb24oZGlyZWN0aW9uc1twcmlvcml0aWVzW2ldXSA9PSBUYWJsZVNvcnRlci5ERVNDRU5ESU5HKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgaWYgKGlzRGlydHkoKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHByaW9yaXR5Q29tYm9zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbHVtbiA9IHByaW9yaXR5Q29tYm9zW2ldLmdldEl0ZW0ocHJpb3JpdHlDb21ib3NbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHByb3BlcnR5VGV4dC5sZW5ndGggJiYgaW5kZXggPT0gLTE7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlUZXh0W2pdLmVxdWFscyhjb2x1bW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBqOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgc29ydGVyLnJlc2V0U3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzb3J0ZXIuc2V0VG9wUHJpb3JpdHkocHJvcGVydGllc1tpbmRleF0pOwotICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24gPSBUYWJsZVNvcnRlci5BU0NFTkRJTkc7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2NlbmRpbmdCdXR0b25zW2ldLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBUYWJsZVNvcnRlci5ERVNDRU5ESU5HOwotICAgICAgICAgICAgICAgIHNvcnRlci5zZXRUb3BQcmlvcml0eURpcmVjdGlvbihkaXJlY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgICAgIHJldHVybiBkaXJ0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkaXJ0eSBmbGFnIHRvIHRydWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWFya0RpcnR5KCkgewotICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBsYXlvdXQgZGF0YSBvZiB0aGUgYnV0dG9uIHRvIGEgR3JpZERhdGEgd2l0aCAKLSAgICAgKiBhcHByb3ByaWF0ZSBoZWlnaHRzIGFuZCB3aWR0aHMuCi0gICAgICogQHBhcmFtIGJ1dHRvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRCdXR0b25TaXplKEJ1dHRvbiBidXR0b24sIEdyaWREYXRhIGJ1dHRvbkRhdGEpIHsKLSAgICAgICAgaW50IHdpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLSAgICAgICAgYnV0dG9uRGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZSgKLSAgICAgICAgICAgICAgICBTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotICAgICAgICBidXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25EYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFByaW90aXR5VGV4dCgpIHsKLSAgICAgICAgSUZpZWxkW10gdW5vcmRlcmVkUHJvcGVydGllcyA9IHNvcnRlci5nZXRGaWVsZHMoKTsKLSAgICAgICAgcHJvcGVydGllcyA9IG5ldyBJRmllbGRbdW5vcmRlcmVkUHJvcGVydGllcy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHVub3JkZXJlZFByb3BlcnRpZXMsIDAsIHByb3BlcnRpZXMsIDAsCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5sZW5ndGgpOwotICAgICAgICBwcm9wZXJ0eVRleHQgPSBuZXcgU3RyaW5nW3Byb3BlcnRpZXMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVRleHRbaV0gPSBwcm9wZXJ0aWVzW2ldLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHNvcnRlciBmb3IgdGhlIHJlY2VpdmVyLgotICAgICAqIEByZXR1cm4gVGFibGVTb3J0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFibGVTb3J0ZXIgZ2V0U29ydGVyKCkgewotICAgICAgICByZXR1cm4gc29ydGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL1RhYmxlU29ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9UYWJsZVNvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWM0OTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL1RhYmxlU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi1wdWJsaWMgY2xhc3MgVGFibGVTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9ERVBUSCA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU0NFTkRJTkcgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVTQ0VORElORyA9IC0xOwotCi0JcHJvdGVjdGVkIElGaWVsZFtdIGZpZWxkczsKLQotCXByb3RlY3RlZCBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0KLQlwcm90ZWN0ZWQgaW50W10gcHJpb3JpdGllczsKLQotCXByb3RlY3RlZCBpbnRbXSBkaXJlY3Rpb25zOwotCi0JcHJvdGVjdGVkIGludFtdIGRlZmF1bHRQcmlvcml0aWVzOwotCi0JcHJvdGVjdGVkIGludFtdIGRlZmF1bHREaXJlY3Rpb25zOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RJQUxPR19TRUNUSU9OID0gInNvcnRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJJT1JJVFkgPSAicHJpb3JpdHkiOyAvLyROT04tTkxTLTEkIAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19ESVJFQ1RJT04gPSAiZGlyZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19ERUZBVUxUX1BSSU9SSVRZID0gImRlZmF1bHRQcmlvcml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVGQVVMVF9ESVJFQ1RJT04gPSAiZGVmYXVsdERpcmVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBUYWJsZVNvcnRlcihUYWJsZVNvcnRlciBvdGhlcikgewotCQl0aGlzKG90aGVyLmdldEZpZWxkcygpLCBvdGhlci5nZXREZWZhdWx0UHJpb3JpdGllcygpLCBvdGhlcgotCQkJCS5nZXREZWZhdWx0RGlyZWN0aW9ucygpKTsKLQkJcHJpb3JpdGllcyA9IG90aGVyLmdldFByaW9yaXRpZXMoKTsKLQkJZGlyZWN0aW9ucyA9IG90aGVyLmdldERpcmVjdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGVTb3J0ZXIoSUZpZWxkW10gcHJvcGVydGllcywgZmluYWwgaW50W10gZGVmYXVsdFByaW9yaXRpZXMsCi0JCQlmaW5hbCBpbnRbXSBkZWZhdWx0RGlyZWN0aW9ucykgewotCQlzdXBlcigpOwotCQl0aGlzLmZpZWxkcyA9IHByb3BlcnRpZXM7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwKLQkJCQl8fCBkZWZhdWx0UHJpb3JpdGllcyA9PSBudWxsCi0JCQkJfHwgZGVmYXVsdERpcmVjdGlvbnMgPT0gbnVsbAotCQkJCXx8ICEocHJvcGVydGllcy5sZW5ndGggPT0gZGVmYXVsdFByaW9yaXRpZXMubGVuZ3RoICYmIHByb3BlcnRpZXMubGVuZ3RoID09IGRlZmF1bHREaXJlY3Rpb25zLmxlbmd0aCkKLQkJCQl8fCAhdmVyaWZ5UHJpb3JpdGllcyhkZWZhdWx0UHJpb3JpdGllcykKLQkJCQl8fCAhdmVyaWZ5RGlyZWN0aW9ucyhkZWZhdWx0RGlyZWN0aW9ucykpIHsKLQkJCXRoaXMucHJpb3JpdGllcyA9IG5ldyBpbnRbMF07Ci0JCQl0aGlzLmRpcmVjdGlvbnMgPSBuZXcgaW50WzBdOwotCQkJdGhpcy5kZWZhdWx0UHJpb3JpdGllcyA9IG5ldyBpbnRbMF07Ci0JCQl0aGlzLmRlZmF1bHREaXJlY3Rpb25zID0gbmV3IGludFswXTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucHJpb3JpdGllcyA9IG5ldyBpbnRbZGVmYXVsdFByaW9yaXRpZXMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGVmYXVsdFByaW9yaXRpZXMsIDAsIHRoaXMucHJpb3JpdGllcywgMCwKLQkJCQkJcHJpb3JpdGllcy5sZW5ndGgpOwotCQkJdGhpcy5kaXJlY3Rpb25zID0gbmV3IGludFtkZWZhdWx0RGlyZWN0aW9ucy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShkZWZhdWx0RGlyZWN0aW9ucywgMCwgdGhpcy5kaXJlY3Rpb25zLCAwLAotCQkJCQlkaXJlY3Rpb25zLmxlbmd0aCk7Ci0JCQl0aGlzLmRlZmF1bHRQcmlvcml0aWVzID0gbmV3IGludFtkZWZhdWx0UHJpb3JpdGllcy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShkZWZhdWx0UHJpb3JpdGllcywgMCwgdGhpcy5kZWZhdWx0UHJpb3JpdGllcywgMCwKLQkJCQkJZGVmYXVsdFByaW9yaXRpZXMubGVuZ3RoKTsKLQkJCXRoaXMuZGVmYXVsdERpcmVjdGlvbnMgPSBuZXcgaW50W2RlZmF1bHREaXJlY3Rpb25zLmxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRlZmF1bHREaXJlY3Rpb25zLCAwLCB0aGlzLmRlZmF1bHREaXJlY3Rpb25zLCAwLAotCQkJCQlkZWZhdWx0RGlyZWN0aW9ucy5sZW5ndGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgVGFibGVTb3J0ZXIgYmFzZWQgb24gdGhlIHN1cHBsaWVkIGZpZWxkcy4KLQkgKiAKLQkgKiBAcGFyYW0gc29ydGluZ0ZpZWxkcwotCSAqLwotCXN0YXRpYyBUYWJsZVNvcnRlciBjcmVhdGVUYWJsZVNvcnRlcihJRmllbGRbXSBzb3J0aW5nRmllbGRzKSB7Ci0JCWludFtdIGRlZmF1bHRQcmlvcml0aWVzID0gbmV3IGludFtzb3J0aW5nRmllbGRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmYXVsdFByaW9yaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWRlZmF1bHRQcmlvcml0aWVzW2ldID0gaTsKLQkJfQotCi0JCWludFtdIGRpcmVjdGlvbnMgPSBuZXcgaW50W3NvcnRpbmdGaWVsZHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlkaXJlY3Rpb25zW2ldID0gc29ydGluZ0ZpZWxkc1tpXS5nZXREZWZhdWx0RGlyZWN0aW9uKCk7Ci0KLQkJfQotCi0JCXJldHVybiBuZXcgVGFibGVTb3J0ZXIoc29ydGluZ0ZpZWxkcywgZGVmYXVsdFByaW9yaXRpZXMsIGRpcmVjdGlvbnMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0U3RhdGUoKSB7Ci0JCVN5c3RlbQotCQkJCS5hcnJheWNvcHkoZGVmYXVsdFByaW9yaXRpZXMsIDAsIHByaW9yaXRpZXMsIDAsCi0JCQkJCQlwcmlvcml0aWVzLmxlbmd0aCk7Ci0JCVN5c3RlbQotCQkJCS5hcnJheWNvcHkoZGVmYXVsdERpcmVjdGlvbnMsIDAsIGRpcmVjdGlvbnMsIDAsCi0JCQkJCQlkaXJlY3Rpb25zLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmV2ZXJzZVRvcFByaW9yaXR5KCkgewotCQlkaXJlY3Rpb25zW3ByaW9yaXRpZXNbMF1dICo9IC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRvcFByaW9yaXR5KElGaWVsZCBwcm9wZXJ0eSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZpZWxkc1tpXS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQkJc2V0VG9wUHJpb3JpdHkoaSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VG9wUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7Ci0JCWlmIChwcmlvcml0eSA8IDAgfHwgcHJpb3JpdHkgPj0gcHJpb3JpdGllcy5sZW5ndGgpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJpb3JpdGllcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHByaW9yaXRpZXNbaV0gPT0gcHJpb3JpdHkpCi0JCQkJaW5kZXggPSBpOwotCQl9Ci0KLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXNldFN0YXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBzaGlmdCB0aGUgYXJyYXkKLQkJZm9yIChpbnQgaSA9IGluZGV4OyBpID4gMDsgaS0tKSB7Ci0JCQlwcmlvcml0aWVzW2ldID0gcHJpb3JpdGllc1tpIC0gMV07Ci0JCX0KLQkJcHJpb3JpdGllc1swXSA9IHByaW9yaXR5OwotCQlkaXJlY3Rpb25zW3ByaW9yaXR5XSA9IGRlZmF1bHREaXJlY3Rpb25zW3ByaW9yaXR5XTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUb3BQcmlvcml0eURpcmVjdGlvbihpbnQgZGlyZWN0aW9uKSB7Ci0JCWlmIChkaXJlY3Rpb24gPT0gQVNDRU5ESU5HIHx8IGRpcmVjdGlvbiA9PSBERVNDRU5ESU5HKQotCQkJZGlyZWN0aW9uc1twcmlvcml0aWVzWzBdXSA9IGRpcmVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRvcFByaW9yaXR5RGlyZWN0aW9uKCkgewotCQlyZXR1cm4gZGlyZWN0aW9uc1twcmlvcml0aWVzWzBdXTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRvcFByaW9yaXR5KCkgewotCQlyZXR1cm4gcHJpb3JpdGllc1swXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpZWxkIGF0IHRoZSB0b3AgcHJpb3JpdHkuCi0JICogCi0JICogQHJldHVybiBJRmllbGQKLQkgKi8KLQlwdWJsaWMgSUZpZWxkIGdldFRvcEZpZWxkKCkgewotCQlyZXR1cm4gZmllbGRzW2dldFRvcFByaW9yaXR5KCldOwotCX0KLQotCXB1YmxpYyBpbnRbXSBnZXRQcmlvcml0aWVzKCkgewotCQlpbnRbXSBjb3B5ID0gbmV3IGludFtwcmlvcml0aWVzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJpb3JpdGllcywgMCwgY29weSwgMCwgY29weS5sZW5ndGgpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwdWJsaWMgaW50W10gZ2V0RGlyZWN0aW9ucygpIHsKLQkJaW50W10gY29weSA9IG5ldyBpbnRbZGlyZWN0aW9ucy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRpcmVjdGlvbnMsIDAsIGNvcHksIDAsIGNvcHkubGVuZ3RoKTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHVibGljIGludFtdIGdldERlZmF1bHRQcmlvcml0aWVzKCkgewotCQlpbnRbXSBjb3B5ID0gbmV3IGludFtkZWZhdWx0UHJpb3JpdGllcy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRlZmF1bHRQcmlvcml0aWVzLCAwLCBjb3B5LCAwLCBjb3B5Lmxlbmd0aCk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXB1YmxpYyBpbnRbXSBnZXREZWZhdWx0RGlyZWN0aW9ucygpIHsKLQkJaW50W10gY29weSA9IG5ldyBpbnRbZGVmYXVsdERpcmVjdGlvbnMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShkZWZhdWx0RGlyZWN0aW9ucywgMCwgY29weSwgMCwgY29weS5sZW5ndGgpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJcmV0dXJuIGNvbXBhcmUoZTEsIGUyLCAwLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wYXJlIG9iajEgYW5kIG9iajIgYXQgZGVwdGguIElmIGNvbnRpbnVlU2VhcmNoaW5nIGNvbnRpbnVlIHNlYXJjaGluZwotCSAqIGJlbG93IGRlcHRoIHRvIGNvbnRpbnVlIHRoZSBjb21wYXJpc29uLgotCSAqIAotCSAqIEBwYXJhbSBvYmoxCi0JICogQHBhcmFtIG9iajIKLQkgKiBAcGFyYW0gZGVwdGgKLQkgKiBAcGFyYW0gY29udGludWVTZWFyY2hpbmcKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXByb3RlY3RlZCBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIsIGludCBkZXB0aCwKLQkJCWJvb2xlYW4gY29udGludWVTZWFyY2hpbmcpIHsKLQkJaWYgKGRlcHRoID49IHByaW9yaXRpZXMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWludCBjb2x1bW4gPSBwcmlvcml0aWVzW2RlcHRoXTsKLQkJSUZpZWxkIHByb3BlcnR5ID0gZmllbGRzW2NvbHVtbl07Ci0JCWludCByZXN1bHQgPSBwcm9wZXJ0eS5jb21wYXJlKG9iajEsIG9iajIpOwotCQlpZiAocmVzdWx0ID09IDAgJiYgY29udGludWVTZWFyY2hpbmcpCi0JCQlyZXR1cm4gY29tcGFyZShvYmoxLCBvYmoyLCBkZXB0aCArIDEsIGNvbnRpbnVlU2VhcmNoaW5nKTsKLQkJcmV0dXJuIHJlc3VsdCAqIGRpcmVjdGlvbnNbY29sdW1uXTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElGaWVsZFtdIGFuIGFycmF5IG9mIGZpZWxkcwotCSAqLwotCXB1YmxpYyBJRmllbGRbXSBnZXRGaWVsZHMoKSB7Ci0JCXJldHVybiBmaWVsZHM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHZlcmlmeVByaW9yaXRpZXMoaW50W10gcHJpb3JpdGllcykgewotCQlpbnQgbGVuZ3RoID0gcHJpb3JpdGllcy5sZW5ndGg7Ci0JCWJvb2xlYW5bXSBpbmNsdWRlZCA9IG5ldyBib29sZWFuW2xlbmd0aF07Ci0JCUFycmF5cy5maWxsKGluY2x1ZGVkLCBmYWxzZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWludCBwcmlvcml0eSA9IHByaW9yaXRpZXNbaV07Ci0JCQlpZiAocHJpb3JpdHkgPCAwIHx8IHByaW9yaXR5ID49IGxlbmd0aCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoaW5jbHVkZWRbcHJpb3JpdHldKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWluY2x1ZGVkW3ByaW9yaXR5XSA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHZlcmlmeURpcmVjdGlvbnMoaW50W10gZGlyZWN0aW9ucykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkaXJlY3Rpb25zW2ldICE9IEFTQ0VORElORyAmJiBkaXJlY3Rpb25zW2ldICE9IERFU0NFTkRJTkcpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlyZXR1cm4gY29tcGFyZShudWxsLCBvMSwgbzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MpIHsKLQkJaWYgKGRpYWxvZ1NldHRpbmdzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGRpYWxvZ1NldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oVEFHX0RJQUxPR19TRUNUSU9OKTsKLQkJaWYgKHNldHRpbmdzID09IG51bGwpIHsKLQkJCXNldHRpbmdzID0gZGlhbG9nU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihUQUdfRElBTE9HX1NFQ1RJT04pOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmlvcml0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzZXR0aW5ncy5wdXQoVEFHX1BSSU9SSVRZICsgaSwgcHJpb3JpdGllc1tpXSk7Ci0JCQlzZXR0aW5ncy5wdXQoVEFHX0RJUkVDVElPTiArIGksIGRpcmVjdGlvbnNbaV0pOwotCQkJc2V0dGluZ3MucHV0KFRBR19ERUZBVUxUX1BSSU9SSVRZICsgaSwgZGVmYXVsdFByaW9yaXRpZXNbaV0pOwotCQkJc2V0dGluZ3MucHV0KFRBR19ERUZBVUxUX0RJUkVDVElPTiArIGksIGRlZmF1bHREaXJlY3Rpb25zW2ldKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MpIHsKLQkJaWYgKGRpYWxvZ1NldHRpbmdzID09IG51bGwpIHsKLQkJCXJlc2V0U3RhdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGRpYWxvZ1NldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oVEFHX0RJQUxPR19TRUNUSU9OKTsKLQkJaWYgKHNldHRpbmdzID09IG51bGwpIHsKLQkJCXJlc2V0U3RhdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByaW9yaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgcHJpb3JpdHkgPSBzZXR0aW5ncy5nZXQoVEFHX1BSSU9SSVRZICsgaSk7Ci0JCQkJaWYgKHByaW9yaXR5ID09IG51bGwpIHsKLQkJCQkJcmVzZXRTdGF0ZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCWludCBmaWVsZEluZGV4ID0gSW50ZWdlci5wYXJzZUludChwcmlvcml0eSk7Ci0JCQkJCi0JCQkJLy9NYWtlIHN1cmUgaXQgaXMgbm90IG9sZCBkYXRhIGZyb20gYSBkaWZmZXJlbnQgc2l6ZWQgYXJyYXkKLQkJCQlpZihmaWVsZEluZGV4IDwgZmllbGRzLmxlbmd0aCkKLQkJCQkJcHJpb3JpdGllc1tpXSA9IGZpZWxkSW5kZXg7Ci0JCQkJCi0JCQkJU3RyaW5nIGRpcmVjdGlvbiA9IHNldHRpbmdzLmdldChUQUdfRElSRUNUSU9OICsgaSk7Ci0JCQkJaWYgKGRpcmVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJCXJlc2V0U3RhdGUoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlkaXJlY3Rpb25zW2ldID0gSW50ZWdlci5wYXJzZUludChkaXJlY3Rpb24pOwotCQkJCVN0cmluZyBkZWZhdWx0UHJpb3JpdHkgPSBzZXR0aW5ncy5nZXQoVEFHX0RFRkFVTFRfUFJJT1JJVFkgKyBpKTsKLQkJCQlpZiAoZGVmYXVsdFByaW9yaXR5ID09IG51bGwpIHsKLQkJCQkJcmVzZXRTdGF0ZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWRlZmF1bHRQcmlvcml0aWVzW2ldID0gSW50ZWdlci5wYXJzZUludChkZWZhdWx0UHJpb3JpdHkpOwotCQkJCVN0cmluZyBkZWZhdWx0RGlyZWN0aW9uID0gc2V0dGluZ3MuZ2V0KFRBR19ERUZBVUxUX0RJUkVDVElPTgotCQkJCQkJKyBpKTsKLQkJCQlpZiAoZGVmYXVsdERpcmVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJCXJlc2V0U3RhdGUoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlkZWZhdWx0RGlyZWN0aW9uc1tpXSA9IEludGVnZXIucGFyc2VJbnQoZGVmYXVsdERpcmVjdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXNldFN0YXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTb3J0IHRoZSBhcnJheSBvZiBtYXJrZXJzIGluIGxhc3RNYXJrZXJzIGluIHBsYWNlLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gbGFzdE1hcmtlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzb3J0KFRyZWVWaWV3ZXIgdmlld2VyLCBNYXJrZXJMaXN0IGxhc3RNYXJrZXJzKSB7Ci0JCXNvcnQodmlld2VyLCBsYXN0TWFya2Vycy5nZXRBcnJheSgpKTsKLQotCX0KLQotCS8qKgotCSAqIFNvcnRzIHRoZSBnaXZlbiBlbGVtZW50cyBpbi1wbGFjZSwgbW9kaWZ5aW5nIHRoZSBnaXZlbiBhcnJheSBmcm9tIGluZGV4Ci0JICogc3RhcnQgdG8gaW5kZXggZW5kLiA8Ci0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBzdGFydAotCSAqIEBwYXJhbSBlbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzb3J0KGZpbmFsIFZpZXdlciB2aWV3ZXIsIE9iamVjdFtdIGVsZW1lbnRzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJQXJyYXlzLnNvcnQoZWxlbWVudHMsIHN0YXJ0LCBlbmQsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCXJldHVybiBUYWJsZVNvcnRlci50aGlzLmNvbXBhcmUodmlld2VyLCBhLCBiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9UYWJsZVZpZXcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL1RhYmxlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTljNjc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL1RhYmxlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYXlvdXREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uUGl4ZWxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSU9wZW5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLk9wZW5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuVmlld1ByZWZlcmVuY2VzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlOwotCi0vKioKLSAqIFRoZSBUYWJsZVZpZXcgaXMgYSB2aWV3IHRoYXQgZ2VuZXJpY2FsbHkgaW1wbGVtZW50cyB2aWV3cyB3aXRoIHRhYmxlcy4KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGFibGVWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT0xVTU5fV0lEVEggPSAiY29sdW1uV2lkdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1ZFUlRJQ0FMX1BPU0lUSU9OID0gInZlcnRpY2FsUG9zaXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0hPUklaT05UQUxfUE9TSVRJT04gPSAiaG9yaXpvbnRhbFBvc2l0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdlcjsKLQotCXByaXZhdGUgSU1lbWVudG8gbWVtZW50bzsKLQotCXByaXZhdGUgSUFjdGlvbiBzb3J0QWN0aW9uOwotCi0JcHJpdmF0ZSBJQWN0aW9uIGZpbHRlcnNBY3Rpb247Ci0KLQlwcml2YXRlIElBY3Rpb24gcHJlZmVyZW5jZXNBY3Rpb247Ci0KLQlwcml2YXRlIE1hcmtlclRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJVmlld1BhcnQuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgc2l0ZSwgSU1lbWVudG8gbWVtZW50bykgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBtZW1lbnRvKTsKLQkJdGhpcy5tZW1lbnRvID0gbWVtZW50bzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQkvLyB2b2lkIGhhbHRUYWJsZVVwZGF0ZXMoKSB7Ci0JLy8gY29udGVudC5jYW5jZWxQZW5kaW5nQ2hhbmdlcygpOwotCS8vIH0KLQkvLyB2b2lkIGNoYW5nZShDb2xsZWN0aW9uIHRvUmVmcmVzaCkgewotCS8vIGNvbnRlbnQuY2hhbmdlKHRvUmVmcmVzaCk7Ci0JLy8gfQotCS8vIHZvaWQgc2V0Q29udGVudHMoQ29sbGVjdGlvbiBjb250ZW50cywgSVByb2dyZXNzTW9uaXRvciBtb24pIHsKLQkvLyBjb250ZW50LnNldChjb250ZW50cywgbW9uKTsKLQkvLyB9Ci0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgdmlld2VyU2VsZWN0aW9uQ2hhbmdlZCgKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNyZWF0ZVRyZWUocGFyZW50KSk7Ci0JCWNyZWF0ZUNvbHVtbnModmlld2VyLmdldFRyZWUoKSk7Ci0KLQkJY29udGVudFByb3ZpZGVyID0gbmV3IE1hcmtlclRyZWVDb250ZW50UHJvdmlkZXIoKTsKLQotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0KLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRhYmxlVmlld0xhYmVsUHJvdmlkZXIoZ2V0QWxsRmllbGRzKCkpKTsKLQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJdmlld2VyU2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJfQotCQl9KTsKLQotCQl2aWV3ZXIuc2V0U29ydGVyKGJ1aWxkU29ydGVyKCkpOwotCi0JCS8vIGNyZWF0ZSB0aGUgYWN0aW9ucyBiZWZvcmUgdGhlIGlucHV0IGlzIHNldCBvbiB0aGUgdmlld2VyIGJ1dCBhZnRlcgotCQkvLyB0aGUKLQkJLy8gc29ydGVyIGFuZCBmaWx0ZXIgYXJlIHNldCBzbyB0aGUgYWN0aW9ucyB3aWxsIGJlIGVuYWJsZWQgY29ycmVjdGx5LgotCQljcmVhdGVBY3Rpb25zKCk7Ci0KLQkJdmlld2VyLnNldElucHV0KGNyZWF0ZVZpZXdlcklucHV0KCkpOwotCi0JCVNjcm9sbGFibGUgc2Nyb2xsYWJsZSA9IChTY3JvbGxhYmxlKSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlTY3JvbGxCYXIgYmFyID0gc2Nyb2xsYWJsZS5nZXRWZXJ0aWNhbEJhcigpOwotCQlpZiAoYmFyICE9IG51bGwpIHsKLQkJCWJhci5zZXRTZWxlY3Rpb24ocmVzdG9yZVZlcnRpY2FsU2Nyb2xsQmFyUG9zaXRpb24obWVtZW50bykpOwotCQl9Ci0JCWJhciA9IHNjcm9sbGFibGUuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlpZiAoYmFyICE9IG51bGwpIHsKLQkJCWJhci5zZXRTZWxlY3Rpb24ocmVzdG9yZUhvcml6b250YWxTY3JvbGxCYXJQb3NpdGlvbihtZW1lbnRvKSk7Ci0JCX0KLQotCQlNZW51TWFuYWdlciBtZ3IgPSBpbml0Q29udGV4dE1lbnUoKTsKLQkJTWVudSBtZW51ID0gbWdyLmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1nciwgZ2V0Vmlld2VyKCkpOwotCi0JCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRWaWV3ZXIoKSk7Ci0KLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlpbml0TWVudShhY3Rpb25CYXJzLmdldE1lbnVNYW5hZ2VyKCkpOwotCQlpbml0VG9vbEJhcihhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCi0JCXJlZ2lzdGVyR2xvYmFsQWN0aW9ucyhnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKSk7Ci0KLQkJdmlld2VyLmFkZE9wZW5MaXN0ZW5lcihuZXcgSU9wZW5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oT3BlbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlT3BlbkV2ZW50KGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQloYW5kbGVLZXlQcmVzc2VkKGUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHZpZXdlciBpbnB1dCBmb3IgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JYWJzdHJhY3QgT2JqZWN0IGNyZWF0ZVZpZXdlcklucHV0KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc29ydGVyMgotCSAqLwotCXZvaWQgc2V0U29ydGVyKFRhYmxlU29ydGVyIHNvcnRlcjIpIHsKLQkJVGFibGVTb3J0ZXIgbmV3U29ydGVyID0gbmV3IFRhYmxlU29ydGVyKHNvcnRlcjIpOwotCQl2aWV3ZXIuc2V0U29ydGVyKG5ld1NvcnRlcik7Ci0JCW5ld1NvcnRlci5zYXZlU3RhdGUoZ2V0RGlhbG9nU2V0dGluZ3MoKSk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBtYWluIHRyZWUgY29udHJvbAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuIFRyZWUKLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZSBjcmVhdGVUcmVlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlyZXR1cm4gdHJlZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHBpeGVsIGRhdGEgZm9yIHRoZSBjb2x1bW5zLgotCSAqIAotCSAqIEByZXR1cm4gQ29sdW1uUGl4ZWxEYXRhW10KLQkgKi8KLQlwdWJsaWMgQ29sdW1uUGl4ZWxEYXRhW10gZ2V0U2F2ZWRDb2x1bW5EYXRhKCkgewotCQlDb2x1bW5QaXhlbERhdGFbXSBkZWZhdWx0RGF0YSA9IGdldERlZmF1bHRDb2x1bW5MYXlvdXRzKCk7Ci0KLQkJQ29sdW1uUGl4ZWxEYXRhW10gcmVzdWx0ID0gbmV3IENvbHVtblBpeGVsRGF0YVtkZWZhdWx0RGF0YS5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmF1bHREYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgd2lkdGggPSBkZWZhdWx0RGF0YVtpXS53aWR0aDsKLQkJCUNvbHVtblBpeGVsRGF0YSBkZWZhdWx0UGl4ZWxEYXRhID0gZGVmYXVsdERhdGFbaV07Ci0KLQkJCS8vIG5vbi1yZXNpemFibGUgY29sdW1ucyBhcmUgYWx3YXlzIGxlZnQgYXQgdGhlaXIgZGVmYXVsdCB3aWR0aAotCQkJaWYgKGRlZmF1bHRQaXhlbERhdGEucmVzaXphYmxlKSB7Ci0JCQkJaWYgKG1lbWVudG8gIT0gbnVsbCkgewotCQkJCQlJbnRlZ2VyIHdpZHRoSW50ID0gbWVtZW50by5nZXRJbnRlZ2VyKFRBR19DT0xVTU5fV0lEVEggKyBpKTsKLQotCQkJCQlpZiAod2lkdGhJbnQgIT0gbnVsbCAmJiB3aWR0aEludC5pbnRWYWx1ZSgpID4gMCkgewotCQkJCQkJd2lkdGggPSB3aWR0aEludC5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlyZXN1bHRbaV0gPSBuZXcgQ29sdW1uUGl4ZWxEYXRhKHdpZHRoLCBkZWZhdWx0UGl4ZWxEYXRhLnJlc2l6YWJsZSwKLQkJCQkJZGVmYXVsdFBpeGVsRGF0YS5hZGRUcmltKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4gc2l6ZXMgZnJvbSB0aGUgYWN0dWFsIHdpZGdldC4gUmV0dXJucyB0aGUgc2F2ZWQgY29sdW1uCi0JICogc2l6ZXMgaWYgdGhlIHdpZGdldCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldCBvciBpdHMgY29sdW1ucyBoYXZlbid0IGJlZW4KLQkgKiBpbml0aWFsaXplZCB5ZXQuIChOb3RlIHRoYXQgVGFibGVMYXlvdXQgb25seSBpbml0aWFsaXplcyB0aGUgY29sdW1uCi0JICogd2lkdGhzIGFmdGVyIHRoZSBmaXJzdCBsYXlvdXQsIHNvIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgd2lkZ2V0IHRvIGV4aXN0Ci0JICogYnV0IGhhdmUgYWxsIGl0cyBjb2x1bW5zIGluY29ycmVjdGx5IHNldCB0byB6ZXJvIHdpZHRoIC0gc2VlIGJ1ZyA4NjMyOSkKLQkgKiAKLQkgKiBAcmV0dXJuIENvbHVtblBpeGVsRGF0YQotCSAqLwotCXB1YmxpYyBDb2x1bW5QaXhlbERhdGFbXSBnZXRDb2x1bW5EYXRhKCkgewotCQlDb2x1bW5QaXhlbERhdGFbXSBkZWZhdWx0RGF0YSA9IGdldFNhdmVkQ29sdW1uRGF0YSgpOwotCi0JCVRyZWUgdHJlZSA9IGdldFRyZWUoKTsKLQotCQlpZiAodHJlZSAhPSBudWxsICYmICh0cmVlLmlzRGlzcG9zZWQoKSB8fCB0cmVlLmdldEJvdW5kcygpLndpZHRoID09IDApKSB7Ci0JCQl0cmVlID0gbnVsbDsKLQkJfQotCi0JCVRyZWVDb2x1bW5bXSBjb2x1bW4gPSBudWxsOwotCQlpZiAodHJlZSAhPSBudWxsKSB7Ci0JCQljb2x1bW4gPSB0cmVlLmdldENvbHVtbnMoKTsKLQkJfQotCi0JCUNvbHVtblBpeGVsRGF0YVtdIHJlc3VsdCA9IG5ldyBDb2x1bW5QaXhlbERhdGFbZGVmYXVsdERhdGEubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0RGF0YS5sZW5ndGg7IGkrKykgewotCQkJQ29sdW1uUGl4ZWxEYXRhIGRlZmF1bHRQaXhlbERhdGEgPSBkZWZhdWx0RGF0YVtpXTsKLQkJCWludCB3aWR0aCA9IGRlZmF1bHREYXRhW2ldLndpZHRoOwotCi0JCQlpZiAoY29sdW1uICE9IG51bGwgJiYgaSA8IGNvbHVtbi5sZW5ndGgpIHsKLQkJCQlUcmVlQ29sdW1uIGNvbCA9IGNvbHVtbltpXTsKLQotCQkJCWlmIChjb2wuZ2V0V2lkdGgoKSA+IDApIHsKLQkJCQkJd2lkdGggPSBjb2wuZ2V0V2lkdGgoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJlc3VsdFtpXSA9IG5ldyBDb2x1bW5QaXhlbERhdGEod2lkdGgsIGRlZmF1bHRQaXhlbERhdGEucmVzaXphYmxlLAotCQkJCQlkZWZhdWx0UGl4ZWxEYXRhLmFkZFRyaW0pOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbHVtbnMgaW4gdGhlIHRyZWUuCi0JICogCi0JICogQHBhcmFtIHRyZWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb2x1bW5zKGZpbmFsIFRyZWUgdHJlZSkgewotCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdHJlZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0JCWZpbmFsIElGaWVsZFtdIGZpZWxkcyA9IGdldEFsbEZpZWxkcygpOwotCQlDb2x1bW5MYXlvdXREYXRhW10gY29sdW1uV2lkdGhzID0gZ2V0U2F2ZWRDb2x1bW5EYXRhKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XaWR0aHNbaV0pOwotCQkJVHJlZUNvbHVtbiB0YyA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCBpKTsKLQkJCXRjLnNldFRleHQoZmllbGRzW2ldLmdldENvbHVtbkhlYWRlclRleHQoKSk7Ci0JCQl0Yy5zZXRJbWFnZShmaWVsZHNbaV0uZ2V0Q29sdW1uSGVhZGVySW1hZ2UoKSk7Ci0JCQl0Yy5zZXRSZXNpemFibGUoY29sdW1uV2lkdGhzW2ldLnJlc2l6YWJsZSk7Ci0JCQl0Yy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRIZWFkZXJMaXN0ZW5lcigpKTsKLQkJCXRjLnNldERhdGEoZmllbGRzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYWN0aW9ucyBmb3IgdGhlIHJlY2VpdmVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCWlmIChnZXRTb3J0RGlhbG9nKCkgIT0gbnVsbCkgewotCQkJc29ydEFjdGlvbiA9IG5ldyBUYWJsZVNvcnRBY3Rpb24odGhpcywgZ2V0U29ydERpYWxvZygpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBNZW51TWFuYWdlciBpbml0Q29udGV4dE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIG1nciA9IG5ldyBNZW51TWFuYWdlcigpOwotCQltZ3Iuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQltZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZ3IpIHsKLQotCQkJCWdldFZpZXdlcigpLmNhbmNlbEVkaXRpbmcoKTsKLQkJCQlmaWxsQ29udGV4dE1lbnUobWdyKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBtZ3I7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdFRvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRibSk7Ci0KLQkvKioKLQkgKiBJbml0IHRoZSBtZW51IGZvciB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHBhcmFtIG1lbnUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlpZiAoc29ydEFjdGlvbiAhPSBudWxsKQotCQkJbWVudS5hZGQoc29ydEFjdGlvbik7Ci0JCWFkZERyb3BEb3duQ29udHJpYnV0aW9ucyhtZW51KTsKLQkJaWYgKGZpbHRlcnNBY3Rpb24gIT0gbnVsbCkKLQkJCW1lbnUuYWRkKGZpbHRlcnNBY3Rpb24pOwotCQlpZiAocHJlZmVyZW5jZXNBY3Rpb24gIT0gbnVsbCkKLQkJCW1lbnUuYWRkKHByZWZlcmVuY2VzQWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW55IGV4dHJhIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIGRyb3AgZG93bi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVudQotCSAqLwotCXZvaWQgYWRkRHJvcERvd25Db250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC4KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZWdpc3Rlckdsb2JhbEFjdGlvbnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycyk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlWaWV3ZXIgdmlld2VyID0gZ2V0Vmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBzb3J0ZXIgZnJvbSB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRhYmxlU29ydGVyCi0JICovCi0JcHJvdGVjdGVkIFZpZXdlclNvcnRlciBidWlsZFNvcnRlcigpIHsKLQotCQlJRmllbGRbXSBzb3J0aW5nRmllbGRzID0gZ2V0U29ydGluZ0ZpZWxkcygpOwotCQlpbnRbXSBwcmlvcml0aWVzID0gbmV3IGludFtzb3J0aW5nRmllbGRzLmxlbmd0aF07Ci0JCWludFtdIGRpcmVjdGlvbnMgPSBuZXcgaW50W3NvcnRpbmdGaWVsZHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3J0aW5nRmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcmlvcml0aWVzW2ldID0gaTsKLQkJfQotCQlBcnJheXMuZmlsbChkaXJlY3Rpb25zLCBUYWJsZVNvcnRlci5BU0NFTkRJTkcpOwotCQlUYWJsZVNvcnRlciBzb3J0ZXIgPSBuZXcgVGFibGVTb3J0ZXIoc29ydGluZ0ZpZWxkcywgcHJpb3JpdGllcywKLQkJCQlkaXJlY3Rpb25zKTsKLQkJc29ydGVyLnJlc3RvcmVTdGF0ZShnZXREaWFsb2dTZXR0aW5ncygpKTsKLQotCQlyZXR1cm4gc29ydGVyOwotCX0KLQotCS8vIHByb3RlY3RlZCBhYnN0cmFjdCBJVGFibGVWaWV3Q29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElGaWVsZFtdIGdldFNvcnRpbmdGaWVsZHMoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJRmllbGRbXSBnZXRBbGxGaWVsZHMoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmlld2VyLgotCSAqIAotCSAqIEByZXR1cm4gVHJlZVZpZXdlcgotCSAqLwotCXByb3RlY3RlZCBUcmVlVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRyZWUgZm9yIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRyZWUKLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZSBnZXRUcmVlKCkgewotCQlyZXR1cm4gZ2V0Vmlld2VyKCkuZ2V0VHJlZSgpOwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBnZXRIZWFkZXJMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJLyoqCi0JCQkgKiBIYW5kbGVzIHRoZSBjYXNlIG9mIHVzZXIgc2VsZWN0aW5nIHRoZSBoZWFkZXIgYXJlYS4KLQkJCSAqLwotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCQkJZmluYWwgSUZpZWxkIGZpZWxkID0gKElGaWVsZCkgZS53aWRnZXQuZ2V0RGF0YSgpOwotCQkJCXRyeSB7Ci0JCQkJCWdldFByb2dyZXNzU2VydmljZSgpLmJ1c3lDdXJzb3JXaGlsZSgKLQkJCQkJCQluZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkJCQlUYWJsZVNvcnRlciBzb3J0ZXIgPSBnZXRUYWJsZVNvcnRlcigpOwotCi0JCQkJCQkJCQltb25pdG9yLmJlZ2luVGFzayhNYXJrZXJNZXNzYWdlcy5zb3J0RGlhbG9nX3RpdGxlLCAxMDApOwotCQkJCQkJCQkJbW9uaXRvci53b3JrZWQoMTApOwotCQkJCQkJCQkJaWYgKGZpZWxkLmVxdWFscyhzb3J0ZXIuZ2V0VG9wRmllbGQoKSkpCi0JCQkJCQkJCQkJc29ydGVyLnJldmVyc2VUb3BQcmlvcml0eSgpOwotCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJc29ydGVyLnNldFRvcFByaW9yaXR5KGZpZWxkKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW1vbml0b3Iud29ya2VkKDE1KTsKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJCQkJCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCQkJCQkJCQkgKi8KLQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7CQkJCQkJCQkJCQkKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9KTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUxKSB7Ci0JCQkJCUlERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotCQkJCQkJCVV0aWwuZXJyb3JTdGF0dXMoZTEpKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLlRhYmxlVmlldyNnZXREZWZhdWx0Q29sdW1uTGF5b3V0cygpCi0JICovCi0JcHJvdGVjdGVkIENvbHVtblBpeGVsRGF0YVtdIGdldERlZmF1bHRDb2x1bW5MYXlvdXRzKCkgewotCi0JCUlGaWVsZFtdIGZpZWxkcyA9IGdldEFsbEZpZWxkcygpOwotCQlDb2x1bW5QaXhlbERhdGFbXSBkYXRhcyA9IG5ldyBDb2x1bW5QaXhlbERhdGFbZmllbGRzLmxlbmd0aF07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCWludCB3aWR0aCA9IGdldFdpZHRoKGZpZWxkc1tpXSk7Ci0JCQlib29sZWFuIHJlc2l6YWJsZSA9IHdpZHRoID4gMDsKLQkJCWRhdGFzW2ldID0gbmV3IENvbHVtblBpeGVsRGF0YSh3aWR0aCxyZXNpemFibGUscmVzaXphYmxlKTsKLQkJfQotCQlyZXR1cm4gZGF0YXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgZmllbGQgdG8gZGlzcGxheS4KLQkgKiAKLQkgKiBAcGFyYW0gZmllbGQKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXByaXZhdGUgaW50IGdldFdpZHRoKElGaWVsZCBmaWVsZCkgewotCQlpZiAoIWZpZWxkLmlzU2hvd2luZygpKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBmaWVsZC5nZXRQcmVmZXJyZWRXaWR0aCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnQgZGlhbG9nIGZvciB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHJldHVybiBUYWJsZVNvcnREaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgVGFibGVTb3J0RGlhbG9nIGdldFNvcnREaWFsb2coKSB7Ci0JCXJldHVybiBuZXcgVGFibGVTb3J0RGlhbG9nKGdldFNpdGUoKSwgZ2V0VGFibGVTb3J0ZXIoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhYmxlIHNvcnRlciBwb3J0aW9uIG9mIHRoZSBzb3J0ZXIuCi0JICogCi0JICogQHJldHVybiBUYWJsZVNvcnRlcgotCSAqLwotCVRhYmxlU29ydGVyIGdldFRhYmxlU29ydGVyKCkgewotCQlyZXR1cm4gKFRhYmxlU29ydGVyKSB2aWV3ZXIuZ2V0U29ydGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlS2V5UHJlc3NlZChLZXlFdmVudCBldmVudCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVPcGVuRXZlbnQoT3BlbkV2ZW50IGV2ZW50KTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzYXZlU3RhdGUob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJc3VwZXIuc2F2ZVN0YXRlKG1lbWVudG8pOwotCi0JCUNvbHVtblBpeGVsRGF0YVtdIGRhdGEgPSBnZXRDb2x1bW5EYXRhKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb2x1bW5QaXhlbERhdGEgZGF0YTIgPSBkYXRhW2ldOwotCi0JCQltZW1lbnRvLnB1dEludGVnZXIoVEFHX0NPTFVNTl9XSURUSCArIGksIGRhdGEyLndpZHRoKTsKLQkJfQotCi0JCS8vIHNhdmUgdmVydGljYWwgcG9zaXRpb24KLQkJU2Nyb2xsYWJsZSBzY3JvbGxhYmxlID0gKFNjcm9sbGFibGUpIHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCVNjcm9sbEJhciBiYXIgPSBzY3JvbGxhYmxlLmdldFZlcnRpY2FsQmFyKCk7Ci0JCWludCBwb3NpdGlvbiA9IChiYXIgIT0gbnVsbCkgPyBiYXIuZ2V0U2VsZWN0aW9uKCkgOiAwOwotCQltZW1lbnRvLnB1dEludGVnZXIoVEFHX1ZFUlRJQ0FMX1BPU0lUSU9OLCBwb3NpdGlvbik7Ci0JCS8vIHNhdmUgaG9yaXpvbnRhbCBwb3NpdGlvbgotCQliYXIgPSBzY3JvbGxhYmxlLmdldEhvcml6b250YWxCYXIoKTsKLQkJcG9zaXRpb24gPSAoYmFyICE9IG51bGwpID8gYmFyLmdldFNlbGVjdGlvbigpIDogMDsKLQkJbWVtZW50by5wdXRJbnRlZ2VyKFRBR19IT1JJWk9OVEFMX1BPU0lUSU9OLCBwb3NpdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgcmVzdG9yZVZlcnRpY2FsU2Nyb2xsQmFyUG9zaXRpb24oSU1lbWVudG8gbWVtZW50bykgewotCQlpZiAobWVtZW50byA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlJbnRlZ2VyIHBvc2l0aW9uID0gbWVtZW50by5nZXRJbnRlZ2VyKFRBR19WRVJUSUNBTF9QT1NJVElPTik7Ci0JCXJldHVybiAocG9zaXRpb24gPT0gbnVsbCkgPyAwIDogcG9zaXRpb24uaW50VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIGludCByZXN0b3JlSG9yaXpvbnRhbFNjcm9sbEJhclBvc2l0aW9uKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJaWYgKG1lbWVudG8gPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJSW50ZWdlciBwb3NpdGlvbiA9IG1lbWVudG8uZ2V0SW50ZWdlcihUQUdfSE9SSVpPTlRBTF9QT1NJVElPTik7Ci0JCXJldHVybiAocG9zaXRpb24gPT0gbnVsbCkgPyAwIDogcG9zaXRpb24uaW50VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlIGZvciB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHJldHVybiBJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UgZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkgewotCQlJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLQkJT2JqZWN0IHNpdGVTZXJ2aWNlID0gZ2V0U2l0ZSgpLmdldEFkYXB0ZXIoCi0JCQkJSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UuY2xhc3MpOwotCQlpZiAoc2l0ZVNlcnZpY2UgIT0gbnVsbCkKLQkJCXNlcnZpY2UgPSAoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UpIHNpdGVTZXJ2aWNlOwotCQlyZXR1cm4gc2VydmljZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGZpbHRlcnMgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKi8KLQl2b2lkIHNldEZpbHRlckFjdGlvbihGaWx0ZXJzQWN0aW9uIGFjdGlvbikgewotCQlmaWx0ZXJzQWN0aW9uID0gYWN0aW9uOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaWx0ZXIgYWN0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHJldHVybiBJQWN0aW9uCi0JICovCi0JSUFjdGlvbiBnZXRGaWx0ZXJBY3Rpb24oKSB7Ci0JCXJldHVybiBmaWx0ZXJzQWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJlZmVyZW5jZXMgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gSUFjdGlvbgotCSAqLwotCUlBY3Rpb24gZ2V0UHJlZmVyZW5jZXNBY3Rpb24oKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlc0FjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHByZWZlcmVuY2VzIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZmVyZW5jZXNBY3Rpb24KLQkgKi8KLQl2b2lkIHNldFByZWZlcmVuY2VzQWN0aW9uKFZpZXdQcmVmZXJlbmNlc0FjdGlvbiBwcmVmZXJlbmNlc0FjdGlvbikgewotCQl0aGlzLnByZWZlcmVuY2VzQWN0aW9uID0gcHJlZmVyZW5jZXNBY3Rpb247Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjb250ZW50IHByb3ZpZGVyCi0JICogCi0JICogQHJldHVybiBNYXJrZXJUcmVlQ29udGVudFByb3ZpZGVyCi0JICovCi0JTWFya2VyVHJlZUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBjb250ZW50UHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbnB1dCB0byB0aGUgdmlld2VyLgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRWaWV3ZXJJbnB1dCgpIHsKLQkJcmV0dXJuIGdldFZpZXdlcigpLmdldElucHV0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9UYWJsZVZpZXdMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9UYWJsZVZpZXdMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNDVmZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvVGFibGVWaWV3TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZvbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGUgVGFibGVWaWV3TGFiZWxQcm92aWRlciBpcyB0aGUgY29udGVudCBwcm92aWRlciBmb3IgbWFya2VyIHZpZXdzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZVZpZXdMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlUYWJsZUxhYmVsUHJvdmlkZXIsIElGb250UHJvdmlkZXIgewotCi0JSUZpZWxkW10gZmllbGRzOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmVldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHBhcmFtIGZpZWxkcwotCSAqLwotCXB1YmxpYyBUYWJsZVZpZXdMYWJlbFByb3ZpZGVyKElGaWVsZFtdIGZpZWxkcykgewotCQl0aGlzLmZpZWxkcyA9IGZpZWxkczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChmaWVsZHMgPT0gbnVsbCB8fCBjb2x1bW5JbmRleCA8IDAgfHwgY29sdW1uSW5kZXggPj0gZmllbGRzLmxlbmd0aCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkc1tjb2x1bW5JbmRleF0uZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChmaWVsZHMgPT0gbnVsbCB8fCBjb2x1bW5JbmRleCA8IDAgfHwgY29sdW1uSW5kZXggPj0gZmllbGRzLmxlbmd0aCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkc1tjb2x1bW5JbmRleF0uZ2V0VmFsdWUoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEZvbnQgZ2V0Rm9udChPYmplY3QgZWxlbWVudCkgewotCQlNYXJrZXJOb2RlIG5vZGUgPSAoTWFya2VyTm9kZSkgZWxlbWVudDsKLQkJaWYgKG5vZGUuaXNDb25jcmV0ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXRCb2xkKAotCQkJCUpGYWNlUmVzb3VyY2VzLkRFRkFVTFRfRk9OVCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9UYXNrRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9UYXNrRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTIyZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvVGFza0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotCi1wdWJsaWMgY2xhc3MgVGFza0ZpbHRlciBleHRlbmRzIE1hcmtlckZpbHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NPTlRBSU5TID0gImNvbnRhaW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRE9ORSA9ICJkb25lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUklPUklUWSA9ICJwcmlvcml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU0VMRUNUX0JZX0RPTkUgPSAic2VsZWN0QnlEb25lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TRUxFQ1RfQllfUFJJT1JJVFkgPSAic2VsZWN0QnlQcmlvcml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBib29sZWFuIERFRkFVTFRfQ09OVEFJTlMgPSB0cnVlOwotCi0JZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0RFU0NSSVBUSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUZBVUxUX0RPTkUgPSBmYWxzZTsKLQotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9QUklPUklUWSA9IDA7Ci0KLQlmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUZBVUxUX1NFTEVDVF9CWV9ET05FID0gZmFsc2U7Ci0KLQlmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUZBVUxUX1NFTEVDVF9CWV9QUklPUklUWSA9IGZhbHNlOwotCi0JZmluYWwgc3RhdGljIGludCBQUklPUklUWV9ISUdIID0gMSA8PCAyOwotCi0JZmluYWwgc3RhdGljIGludCBQUklPUklUWV9OT1JNQUwgPSAxIDw8IDE7Ci0KLQlmaW5hbCBzdGF0aWMgaW50IFBSSU9SSVRZX0xPVyA9IDEgPDwgMDsKLQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluczsKLQotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQlwcml2YXRlIGludCBwcmlvcml0eTsKLQotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RCeVByaW9yaXR5ID0gZmFsc2U7IAotCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdEJ5RG9uZSA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciB3aXRoIHRoZSBkZWZhdWx0IG5hbWUuCi0JICogCi0JICovCi0JcHVibGljIFRhc2tGaWx0ZXIoKSB7Ci0JCXRoaXMoTWFya2VyTWVzc2FnZXMuTWFya2VyRmlsdGVyX2RlZmF1bHRGaWx0ZXJOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKi8KLQlwdWJsaWMgVGFza0ZpbHRlcihTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihuZXdOYW1lLCBuZXcgU3RyaW5nW10geyBJTWFya2VyLlRBU0sgfSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0TWFya2VyKENvbmNyZXRlTWFya2VyIG1hcmtlcikgewotCQlpZiAoIShtYXJrZXIgaW5zdGFuY2VvZiBUYXNrTWFya2VyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVGFza01hcmtlciB0YXNrTWFya2VyID0gKFRhc2tNYXJrZXIpIG1hcmtlcjsKLQotCQlyZXR1cm4gIWlzRW5hYmxlZCgpCi0JCQkJfHwgKHN1cGVyLnNlbGVjdE1hcmtlcih0YXNrTWFya2VyKQotCQkJCQkJJiYgc2VsZWN0QnlEZXNjcmlwdGlvbih0YXNrTWFya2VyKQotCQkJCQkJJiYgc2VsZWN0QnlEb25lKHRhc2tNYXJrZXIpICYmIHNlbGVjdEJ5UHJpb3JpdHkodGFza01hcmtlcikpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RCeURlc2NyaXB0aW9uKENvbmNyZXRlTWFya2VyIG1hcmtlcikgewotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCB8fCBkZXNjcmlwdGlvbi5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpbnQgaW5kZXggPSBtYXJrZXIuZ2V0RGVzY3JpcHRpb24oKS5pbmRleE9mKGRlc2NyaXB0aW9uKTsKLQkJcmV0dXJuIGNvbnRhaW5zID8gKGluZGV4ID49IDApIDogKGluZGV4IDwgMCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdEJ5RG9uZShUYXNrTWFya2VyIGl0ZW0pIHsKLQkJaWYgKHNlbGVjdEJ5RG9uZSkKLQkJCXJldHVybiBkb25lID09IChpdGVtLmdldERvbmUoKSA9PSAxKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0QnlQcmlvcml0eShUYXNrTWFya2VyIG1hcmtlcikgewotCQlpZiAocHJpb3JpdHkgIT0gMCAmJiBzZWxlY3RCeVByaW9yaXR5KSB7Ci0JCQlpbnQgbWFya2VyUHJpb3JpdHkgPSBtYXJrZXIuZ2V0UHJpb3JpdHkoKTsKLQotCQkJaWYgKG1hcmtlclByaW9yaXR5ID09IElNYXJrZXIuUFJJT1JJVFlfSElHSCkKLQkJCQlyZXR1cm4gKHByaW9yaXR5ICYgUFJJT1JJVFlfSElHSCkgPiAwOwotCQkJZWxzZSBpZiAobWFya2VyUHJpb3JpdHkgPT0gSU1hcmtlci5QUklPUklUWV9OT1JNQUwpCi0JCQkJcmV0dXJuIChwcmlvcml0eSAmIFBSSU9SSVRZX05PUk1BTCkgPiAwOwotCQkJZWxzZSBpZiAobWFya2VyUHJpb3JpdHkgPT0gSU1hcmtlci5QUklPUklUWV9MT1cpCi0JCQkJcmV0dXJuIChwcmlvcml0eSAmIFBSSU9SSVRZX0xPVykgPiAwOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29udGFpbnMoKSB7Ci0JCXJldHVybiBjb250YWluczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RG9uZSgpIHsKLQkJcmV0dXJuIGRvbmU7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJcmV0dXJuIHByaW9yaXR5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFNlbGVjdEJ5RG9uZSgpIHsKLQkJcmV0dXJuIHNlbGVjdEJ5RG9uZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRTZWxlY3RCeVByaW9yaXR5KCkgewotCQlyZXR1cm4gc2VsZWN0QnlQcmlvcml0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250YWlucyhib29sZWFuIGNvbnRhaW5zKSB7Ci0JCXRoaXMuY29udGFpbnMgPSBjb250YWluczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvbmUoYm9vbGVhbiBkb25lKSB7Ci0JCXRoaXMuZG9uZSA9IGRvbmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoaW50IHByaW9yaXR5KSB7Ci0JCXRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RCeURvbmUoYm9vbGVhbiBzZWxlY3RCeURvbmUpIHsKLQkJdGhpcy5zZWxlY3RCeURvbmUgPSBzZWxlY3RCeURvbmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0QnlQcmlvcml0eShib29sZWFuIHNlbGVjdEJ5UHJpb3JpdHkpIHsKLQkJdGhpcy5zZWxlY3RCeVByaW9yaXR5ID0gc2VsZWN0QnlQcmlvcml0eTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlckZpbHRlciNyZXNldFN0YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFN0YXRlKCkgewotCQlzdXBlci5yZXNldFN0YXRlKCk7Ci0JCWNvbnRhaW5zID0gREVGQVVMVF9DT05UQUlOUzsKLQkJZGVzY3JpcHRpb24gPSBERUZBVUxUX0RFU0NSSVBUSU9OOwotCQlkb25lID0gREVGQVVMVF9ET05FOwotCQlwcmlvcml0eSA9IERFRkFVTFRfUFJJT1JJVFk7Ci0JCXNlbGVjdEJ5RG9uZSA9IERFRkFVTFRfU0VMRUNUX0JZX0RPTkU7Ci0JCXNlbGVjdEJ5UHJpb3JpdHkgPSBERUZBVUxUX1NFTEVDVF9CWV9QUklPUklUWTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyRmlsdGVyI3Jlc3RvcmVGaWx0ZXJTZXR0aW5ncyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5ncykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlRmlsdGVyU2V0dGluZ3MoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzKSB7Ci0JCXN1cGVyLnJlc3RvcmVGaWx0ZXJTZXR0aW5ncyhzZXR0aW5ncyk7Ci0KLQkJU3RyaW5nIHNldHRpbmcgPSBzZXR0aW5ncy5nZXQoVEFHX0NPTlRBSU5TKTsKLQotCQlpZiAoc2V0dGluZyAhPSBudWxsKQotCQkJY29udGFpbnMgPSBCb29sZWFuLnZhbHVlT2Yoc2V0dGluZykuYm9vbGVhblZhbHVlKCk7Ci0KLQkJc2V0dGluZyA9IHNldHRpbmdzLmdldChUQUdfREVTQ1JJUFRJT04pOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQlkZXNjcmlwdGlvbiA9IG5ldyBTdHJpbmcoc2V0dGluZyk7Ci0KLQkJc2V0dGluZyA9IHNldHRpbmdzLmdldChUQUdfRE9ORSk7Ci0KLQkJaWYgKHNldHRpbmcgIT0gbnVsbCkKLQkJCWRvbmUgPSBCb29sZWFuLnZhbHVlT2Yoc2V0dGluZykuYm9vbGVhblZhbHVlKCk7Ci0KLQkJc2V0dGluZyA9IHNldHRpbmdzLmdldChUQUdfUFJJT1JJVFkpOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQl0cnkgewotCQkJCXByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludChzZXR0aW5nKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlTnVtYmVyRm9ybWF0KSB7Ci0JCQl9Ci0KLQkJc2V0dGluZyA9IHNldHRpbmdzLmdldChUQUdfU0VMRUNUX0JZX0RPTkUpOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQlzZWxlY3RCeURvbmUgPSBCb29sZWFuLnZhbHVlT2Yoc2V0dGluZykuYm9vbGVhblZhbHVlKCk7Ci0KLQkJc2V0dGluZyA9IHNldHRpbmdzLmdldChUQUdfU0VMRUNUX0JZX1BSSU9SSVRZKTsKLQotCQlpZiAoc2V0dGluZyAhPSBudWxsKQotCQkJc2VsZWN0QnlQcmlvcml0eSA9IEJvb2xlYW4udmFsdWVPZihzZXR0aW5nKS5ib29sZWFuVmFsdWUoKTsKLQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlckZpbHRlciNyZXN0b3JlRmlsdGVyU2V0dGluZ3Mob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZUZpbHRlclNldHRpbmdzKElNZW1lbnRvIHNldHRpbmdzKSB7Ci0JCXN1cGVyLnJlc3RvcmVGaWx0ZXJTZXR0aW5ncyhzZXR0aW5ncyk7Ci0KLQkJU3RyaW5nIHNldHRpbmcgPSBzZXR0aW5ncy5nZXRTdHJpbmcoVEFHX0NPTlRBSU5TKTsKLQotCQlpZiAoc2V0dGluZyAhPSBudWxsKQotCQkJY29udGFpbnMgPSBCb29sZWFuLnZhbHVlT2Yoc2V0dGluZykuYm9vbGVhblZhbHVlKCk7Ci0KLQkJc2V0dGluZyA9IHNldHRpbmdzLmdldFN0cmluZyhUQUdfREVTQ1JJUFRJT04pOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQlkZXNjcmlwdGlvbiA9IG5ldyBTdHJpbmcoc2V0dGluZyk7Ci0KLQkJc2V0dGluZyA9IHNldHRpbmdzLmdldFN0cmluZyhUQUdfRE9ORSk7Ci0KLQkJaWYgKHNldHRpbmcgIT0gbnVsbCkKLQkJCWRvbmUgPSBCb29sZWFuLnZhbHVlT2Yoc2V0dGluZykuYm9vbGVhblZhbHVlKCk7Ci0KLQkJSW50ZWdlciBwcmlvcml0eVZhbHVlID0gc2V0dGluZ3MuZ2V0SW50ZWdlcihUQUdfUFJJT1JJVFkpOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQlwcmlvcml0eSA9IHByaW9yaXR5VmFsdWUuaW50VmFsdWUoKTsKLQotCQlzZXR0aW5nID0gc2V0dGluZ3MuZ2V0U3RyaW5nKFRBR19TRUxFQ1RfQllfRE9ORSk7Ci0KLQkJaWYgKHNldHRpbmcgIT0gbnVsbCkKLQkJCXNlbGVjdEJ5RG9uZSA9IEJvb2xlYW4udmFsdWVPZihzZXR0aW5nKS5ib29sZWFuVmFsdWUoKTsKLQotCQlzZXR0aW5nID0gc2V0dGluZ3MuZ2V0U3RyaW5nKFRBR19TRUxFQ1RfQllfUFJJT1JJVFkpOwotCi0JCWlmIChzZXR0aW5nICE9IG51bGwpCi0JCQlzZWxlY3RCeVByaW9yaXR5ID0gQm9vbGVhbi52YWx1ZU9mKHNldHRpbmcpLmJvb2xlYW5WYWx1ZSgpOwotCi0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJGaWx0ZXIjc2F2ZUZpbHRlclNldHRpbmdzKG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVGaWx0ZXJTZXR0aW5ncyhJTWVtZW50byBzZXR0aW5ncykgewotCQlzdXBlci5zYXZlRmlsdGVyU2V0dGluZ3Moc2V0dGluZ3MpOwotCQlzZXR0aW5ncy5wdXRTdHJpbmcoVEFHX0NPTlRBSU5TLCBTdHJpbmcudmFsdWVPZihjb250YWlucykpOwotCQlzZXR0aW5ncy5wdXRTdHJpbmcoVEFHX0RFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7Ci0JCXNldHRpbmdzLnB1dFN0cmluZyhUQUdfRE9ORSwgU3RyaW5nLnZhbHVlT2YoZG9uZSkpOwotCQlzZXR0aW5ncy5wdXRJbnRlZ2VyKFRBR19QUklPUklUWSwgcHJpb3JpdHkpOwotCQlzZXR0aW5ncy5wdXRTdHJpbmcoVEFHX1NFTEVDVF9CWV9ET05FLCBTdHJpbmcudmFsdWVPZihzZWxlY3RCeURvbmUpKTsKLQkJc2V0dGluZ3MucHV0U3RyaW5nKFRBR19TRUxFQ1RfQllfUFJJT1JJVFksIFN0cmluZy52YWx1ZU9mKHNlbGVjdEJ5UHJpb3JpdHkpKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvVGFza01hcmtlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvVGFza01hcmtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmQ4NWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL1Rhc2tNYXJrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgbWFya2VyIHZpc2libGUgaW4gdGhlIFRhc2tzIHZpZXcuIEFkZGl0aW9uYWwgbWVtYmVycyBzaG91bGQgYmUgYWRkZWQKLSAqIHRvIHRoaXMgY2xhc3MgaWYgbmV3IGZpZWxkcyBhcmUgYWRkZWQgdG8gdGhlIFRhc2tzIHZpZXcuIFN1Y2ggbWVtYmVycyBzaG91bGQgYmUKLSAqIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvciwgYW5kIGFjY2Vzc2VkIHZpYSBnZXQgbWV0aG9kcyByYXRoZXIgdGhhbiBhY2Nlc3NpbmcKLSAqIHRoZSBJTWFya2VyIGluc3RhbmNlIGRpcmVjdGx5LiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBzdXBwb3J0IHNvcnRpbmcgaW4gYSByZWFzb25hYmxlCi0gKiB0aW1lIGJvdW5kLgotICovCi1wdWJsaWMgY2xhc3MgVGFza01hcmtlciBleHRlbmRzIENvbmNyZXRlTWFya2VyIHsKLQotICAgIHByaXZhdGUgaW50IHByaW9yaXR5OwotCi0gICAgcHJpdmF0ZSBpbnQgZG9uZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0b0NvcHkKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFza01hcmtlcihJTWFya2VyIHRvQ29weSkgewotICAgICAgICBzdXBlcih0b0NvcHkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIHN1cGVyLnJlZnJlc2goKTsKLSAgICAgICAgcHJpb3JpdHkgPSBnZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5QUklPUklUWSwKLSAgICAgICAgICAgICAgICBJTWFya2VyLlBSSU9SSVRZX05PUk1BTCk7Ci0gICAgICAgIGRvbmUgPSAtMTsKLSAgICAgICAgaWYgKGdldE1hcmtlcigpLmdldEF0dHJpYnV0ZShJTWFya2VyLlVTRVJfRURJVEFCTEUsIHRydWUpKSB7Ci0gICAgICAgICAgICBkb25lID0gMDsKLSAgICAgICAgICAgIGlmIChnZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5ET05FLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICBkb25lID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7Ci0gICAgICAgIHJldHVybiBwcmlvcml0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERvbmUoKSB7Ci0gICAgICAgIHJldHVybiBkb25lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL1Rhc2tWaWV3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9UYXNrVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTlhZjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9tYXJrZXJzL2ludGVybmFsL1Rhc2tWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFSW50ZXJuYWxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkNlbGxFZGl0b3JBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoZSBUYXNrVmlldyBpcyB0aGUgdmlldyBmb3IgZGlzcGxheWluZyB0YXNrIG1hcmtlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrVmlldyBleHRlbmRzIE1hcmtlclZpZXcgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBMRVRJT04gPSAiY29tcGxldGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgSUZpZWxkW10gSElEREVOX0ZJRUxEUyA9IHsgbmV3IEZpZWxkQ3JlYXRpb25UaW1lKCkgfTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIFJPT1RfVFlQRVMgPSB7IElNYXJrZXIuVEFTSyB9OwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gVEFCTEVfQ09MVU1OX1BST1BFUlRJRVMgPSB7VXRpbC5FTVBUWV9TVFJJTkcsIENPTVBMRVRJT04sCi0JCQlJTWFya2VyLlBSSU9SSVRZLCBJTWFya2VyLk1FU1NBR0UsIFV0aWwuRU1QVFlfU1RSSU5HLAotCQkJVXRpbC5FTVBUWV9TVFJJTkcsCi0JCQlVdGlsLkVNUFRZX1NUUklORwotCX07Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX0RJQUxPR19TRUNUSU9OID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLnRhc2siOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIElGaWVsZFtdIFZJU0lCTEVfRklFTERTID0geyBuZXcgRmllbGREdW1teSgpLCBuZXcgRmllbGREb25lKCksCi0JCQluZXcgRmllbGRQcmlvcml0eSgpLCBuZXcgRmllbGRNZXNzYWdlKCksIG5ldyBGaWVsZFJlc291cmNlKCksCi0JCQluZXcgRmllbGRGb2xkZXIoKSwgbmV3IEZpZWxkTGluZU51bWJlcigpIH07Ci0KLQlwcml2YXRlIElDZWxsTW9kaWZpZXIgY2VsbE1vZGlmaWVyID0gbmV3IElDZWxsTW9kaWZpZXIoKSB7Ci0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb25jcmV0ZU1hcmtlcikgewotCQkJCUlNYXJrZXIgbWFya2VyID0gKChDb25jcmV0ZU1hcmtlcikgZWxlbWVudCkuZ2V0TWFya2VyKCk7Ci0KLQkJCQlpZiAoQ09NUExFVElPTi5lcXVhbHMocHJvcGVydHkpKQotCQkJCQlyZXR1cm4gbmV3IEJvb2xlYW4obWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkRPTkUsIGZhbHNlKSk7Ci0KLQkJCQlpZiAoSU1hcmtlci5QUklPUklUWS5lcXVhbHMocHJvcGVydHkpKQotCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9ISUdICi0JCQkJCQkJLSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuUFJJT1JJVFksCi0JCQkJCQkJCQlJTWFya2VyLlBSSU9SSVRZX05PUk1BTCkpOwotCi0JCQkJaWYgKElNYXJrZXIuTUVTU0FHRS5lcXVhbHMocHJvcGVydHkpKQotCQkJCQlyZXR1cm4gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gVXRpbC5pc0VkaXRhYmxlKCgoQ29uY3JldGVNYXJrZXIpIGVsZW1lbnQpLmdldE1hcmtlcigpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSXRlbSkgewotCQkJCUl0ZW0gaXRlbSA9IChJdGVtKSBlbGVtZW50OwotCQkJCU9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0KLQkJCQlpZiAoZGF0YSBpbnN0YW5jZW9mIENvbmNyZXRlTWFya2VyKSB7Ci0JCQkJCUNvbmNyZXRlTWFya2VyIGNvbmNyZXRlTWFya2VyID0gKENvbmNyZXRlTWFya2VyKSBkYXRhOwotCi0JCQkJCUlNYXJrZXIgbWFya2VyID0gY29uY3JldGVNYXJrZXIuZ2V0TWFya2VyKCk7Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCU9iamVjdCBvbGRWYWx1ZSA9IGdldFZhbHVlKGRhdGEsIHByb3BlcnR5KTsKLQkJCQkJCWlmIChvbGRWYWx1ZSAhPSBudWxsICYmICFvbGRWYWx1ZS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQkJaWYgKENPTVBMRVRJT04uZXF1YWxzKHByb3BlcnR5KSkKLQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkRPTkUsIHZhbHVlKTsKLQkJCQkJCQllbHNlIGlmIChJTWFya2VyLlBSSU9SSVRZLmVxdWFscyhwcm9wZXJ0eSkpCi0JCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5QUklPUklUWSwKLQkJCQkJCQkJCQlJTWFya2VyLlBSSU9SSVRZX0hJR0gKLQkJCQkJCQkJCQkJCS0gKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJCQkJZWxzZSBpZiAoSU1hcmtlci5NRVNTQUdFLmVxdWFscyhwcm9wZXJ0eSkpCi0JCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCB2YWx1ZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWNvbmNyZXRlTWFya2VyLnJlZnJlc2goKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2l0ZSgpLmdldFNoZWxsKCksCi0JCQkJCQkJCU1hcmtlck1lc3NhZ2VzLmVycm9yTW9kaWZ5aW5nVGFzaywgbnVsbCwgZQotCQkJCQkJCQkJCS5nZXRTdGF0dXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlciBjZWxsRWRpdG9yQWN0aW9uSGFuZGxlcjsKLQotCXByaXZhdGUgQWN0aW9uQWRkR2xvYmFsVGFzayBhZGRHbG9iYWxUYXNrQWN0aW9uOwotCi0JcHJpdmF0ZSBBY3Rpb25EZWxldGVDb21wbGV0ZWQgZGVsZXRlQ29tcGxldGVkQWN0aW9uOwotCi0JcHJpdmF0ZSBBY3Rpb25NYXJrQ29tcGxldGVkIG1hcmtDb21wbGV0ZWRBY3Rpb247Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0KLQkJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gZ2V0Vmlld2VyKCk7Ci0JCUNlbGxFZGl0b3IgY2VsbEVkaXRvcnNbXSA9IG5ldyBDZWxsRWRpdG9yW3RyZWVWaWV3ZXIuZ2V0VHJlZSgpCi0JCQkJLmdldENvbHVtbkNvdW50KCldOwotCQljZWxsRWRpdG9yc1sxXSA9IG5ldyBDaGVja2JveENlbGxFZGl0b3IodHJlZVZpZXdlci5nZXRUcmVlKCkpOwotCi0JCVN0cmluZ1tdIHByaW9yaXRpZXMgPSBuZXcgU3RyaW5nW10geyBNYXJrZXJNZXNzYWdlcy5wcmlvcml0eV9oaWdoLAotCQkJCU1hcmtlck1lc3NhZ2VzLnByaW9yaXR5X25vcm1hbCwgTWFya2VyTWVzc2FnZXMucHJpb3JpdHlfbG93IH07Ci0KLQkJY2VsbEVkaXRvcnNbMl0gPSBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLAotCQkJCXByaW9yaXRpZXMsIFNXVC5SRUFEX09OTFkpOwotCQlDZWxsRWRpdG9yIGRlc2NyaXB0aW9uQ2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0cmVlVmlld2VyCi0JCQkJLmdldFRyZWUoKSk7Ci0JCWNlbGxFZGl0b3JzWzNdID0gZGVzY3JpcHRpb25DZWxsRWRpdG9yOwotCQl0cmVlVmlld2VyLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQkJdHJlZVZpZXdlci5zZXRDZWxsTW9kaWZpZXIoY2VsbE1vZGlmaWVyKTsKLQkJdHJlZVZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKFRBQkxFX0NPTFVNTl9QUk9QRVJUSUVTKTsKLQotCQljZWxsRWRpdG9yQWN0aW9uSGFuZGxlciA9IG5ldyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcihnZXRWaWV3U2l0ZSgpCi0JCQkJLmdldEFjdGlvbkJhcnMoKSk7Ci0JCWNlbGxFZGl0b3JBY3Rpb25IYW5kbGVyLmFkZENlbGxFZGl0b3IoZGVzY3JpcHRpb25DZWxsRWRpdG9yKTsKLQkJY2VsbEVkaXRvckFjdGlvbkhhbmRsZXIuc2V0Q29weUFjdGlvbihjb3B5QWN0aW9uKTsKLQkJY2VsbEVkaXRvckFjdGlvbkhhbmRsZXIuc2V0UGFzdGVBY3Rpb24ocGFzdGVBY3Rpb24pOwotCQljZWxsRWRpdG9yQWN0aW9uSGFuZGxlci5zZXREZWxldGVBY3Rpb24oZGVsZXRlQWN0aW9uKTsKLQkJY2VsbEVkaXRvckFjdGlvbkhhbmRsZXIuc2V0U2VsZWN0QWxsQWN0aW9uKHNlbGVjdEFsbEFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNlbGxFZGl0b3JBY3Rpb25IYW5kbGVyICE9IG51bGwpCi0JCQljZWxsRWRpdG9yQWN0aW9uSGFuZGxlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKG1hcmtDb21wbGV0ZWRBY3Rpb24gIT0gbnVsbCkKLQkJCW1hcmtDb21wbGV0ZWRBY3Rpb24uZGlzcG9zZSgpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlBYnN0cmFjdFVJUGx1Z2luIHBsdWdpbiA9IChBYnN0cmFjdFVJUGx1Z2luKSBQbGF0Zm9ybQotCQkJCS5nZXRQbHVnaW4oUGxhdGZvcm1VSS5QTFVHSU5fSUQpOwotCQlJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBwbHVnaW4uZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLQkJCQkuZ2V0U2VjdGlvbihUQUdfRElBTE9HX1NFQ1RJT04pOwotCi0JCWlmIChzZXR0aW5ncyA9PSBudWxsKQotCQkJc2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncy5hZGROZXdTZWN0aW9uKFRBR19ESUFMT0dfU0VDVElPTik7Ci0KLQkJcmV0dXJuIHNldHRpbmdzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQotCQlhZGRHbG9iYWxUYXNrQWN0aW9uID0gbmV3IEFjdGlvbkFkZEdsb2JhbFRhc2sodGhpcyk7Ci0JCWRlbGV0ZUNvbXBsZXRlZEFjdGlvbiA9IG5ldyBBY3Rpb25EZWxldGVDb21wbGV0ZWQodGhpcywgZ2V0Vmlld2VyKCkpOwotCQltYXJrQ29tcGxldGVkQWN0aW9uID0gbmV3IEFjdGlvbk1hcmtDb21wbGV0ZWQoZ2V0Vmlld2VyKCkpOwotCQlwcm9wZXJ0aWVzQWN0aW9uID0gbmV3IEFjdGlvblRhc2tQcm9wZXJ0aWVzKHRoaXMsIGdldFZpZXdlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoYWRkR2xvYmFsVGFza0FjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXN1cGVyLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnVBZGRpdGlvbnMoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWFuYWdlci5hZGQobWFya0NvbXBsZXRlZEFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKGRlbGV0ZUNvbXBsZXRlZEFjdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5UYWJsZVZpZXcjZ2V0U29ydGluZ0ZpZWxkcygpCi0JICovCi0JcHJvdGVjdGVkIElGaWVsZFtdIGdldFNvcnRpbmdGaWVsZHMoKSB7Ci0JCUlGaWVsZFtdIGFsbCA9IG5ldyBJRmllbGRbVklTSUJMRV9GSUVMRFMubGVuZ3RoICsgSElEREVOX0ZJRUxEUy5sZW5ndGhdOwotCi0JCVN5c3RlbS5hcnJheWNvcHkoVklTSUJMRV9GSUVMRFMsIDAsIGFsbCwgMCwgVklTSUJMRV9GSUVMRFMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShISURERU5fRklFTERTLCAwLCBhbGwsIFZJU0lCTEVfRklFTERTLmxlbmd0aCwKLQkJCQlISURERU5fRklFTERTLmxlbmd0aCk7Ci0KLQkJcmV0dXJuIGFsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5UYWJsZVZpZXcjZ2V0QWxsRmllbGRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZWxkW10gZ2V0QWxsRmllbGRzKCkgewotCQlyZXR1cm4gZ2V0U29ydGluZ0ZpZWxkcygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRSb290VHlwZXMoKSB7Ci0JCXJldHVybiBST09UX1RZUEVTOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRUb29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQl0b29sQmFyTWFuYWdlci5hZGQoYWRkR2xvYmFsVGFza0FjdGlvbik7Ci0JCXN1cGVyLmluaXRUb29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiwKLQkJCWJvb2xlYW4gcmV2ZWFsKSB7Ci0JCS8vIFRPRE86IGFkZGVkIGJlY2F1c2UgbmljayBkb2Vzbid0IGxpa2UgcHVibGljIEFQSSBpbmhlcml0ZWQgZnJvbQotCQkvLyBpbnRlcm5hbCBjbGFzc2VzCi0JCXN1cGVyLnNldFNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uLCByZXZlYWwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJWaWV3I2dldE1hcmtlclR5cGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TWFya2VyVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBJTWFya2VyLlRBU0sgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0YXRpY0NvbnRleHRJZCgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuUExVR0lOX0lEICsgIi50YXNrX2xpc3Rfdmlld19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJWaWV3I2NyZWF0ZUZpbHRlcnNEaWFsb2coKQotCSAqLwotCXByb3RlY3RlZCBEaWFsb2dNYXJrZXJGaWx0ZXIgY3JlYXRlRmlsdGVyc0RpYWxvZygpIHsKLQotCQlNYXJrZXJGaWx0ZXJbXSBmaWx0ZXJzID0gZ2V0VXNlckZpbHRlcnMoKTsKLQkJVGFza0ZpbHRlcltdIHRhc2tGaWx0ZXJzID0gbmV3IFRhc2tGaWx0ZXJbZmlsdGVycy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGZpbHRlcnMsIDAsIHRhc2tGaWx0ZXJzLCAwLCBmaWx0ZXJzLmxlbmd0aCk7Ci0JCXJldHVybiBuZXcgRGlhbG9nVGFza0ZpbHRlcihnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgdGFza0ZpbHRlcnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJWaWV3I2NyZWF0ZUZpbHRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBNYXJrZXJGaWx0ZXIgY3JlYXRlRmlsdGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuZXcgVGFza0ZpbHRlcihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyVmlldyNnZXRTZWN0aW9uVGFnKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25UYWcoKSB7Ci0JCXJldHVybiBUQUdfRElBTE9HX1NFQ1RJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlclZpZXcjZ2V0TWFya2VyRW5hYmxlbWVudFByZWZlcmVuY2VOYW1lKCkKLQkgKi8KLQlTdHJpbmcgZ2V0TWFya2VyRW5hYmxlbWVudFByZWZlcmVuY2VOYW1lKCkgewotCQlyZXR1cm4gSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5MSU1JVF9UQVNLUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyVmlldyNnZXRNYXJrZXJMaW1pdFByZWZlcmVuY2VOYW1lKCkKLQkgKi8KLQlTdHJpbmcgZ2V0TWFya2VyTGltaXRQcmVmZXJlbmNlTmFtZSgpIHsKLQkJcmV0dXJuIElERUludGVybmFsUHJlZmVyZW5jZXMuVEFTS1NfTElNSVQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlclZpZXcjZ2V0RmlsdGVyc1ByZWZlcmVuY2VOYW1lKCkKLQkgKi8KLQlTdHJpbmcgZ2V0RmlsdGVyc1ByZWZlcmVuY2VOYW1lKCkgewotCQlyZXR1cm4gSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5UQVNLU19GSUxURVJTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNDY1Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5NYXJrZXJWaWV3VXRpbDsKLQotLyoqCi0gKiBUaGUgVXRpbCBjbGFzcyBpcyB0aGUgY2xhc3Mgb2YgZ2VuZXJhbCB1dGlsaXRpZXMgdXNlZCBieSB0aGUgbWFya2VyIHN1cHBvcnQuCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFV0aWwgewotCi0Jc3RhdGljIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgU3RyaW5nIFRXT19MSU5FX0ZFRUQgPSAiXG5cbiI7Ly8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIFN0cmluZyBMSU5FX0ZFRURfQU5EX1RBQiA9ICJcblx0IjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfRVJST1JfUEFUSCA9ICJvYmoxNi9lcnJvcl90c2suZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX1dBUk5JTkdfUEFUSCA9ICJvYmoxNi93YXJuX3Rzay5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSU5GT19QQVRIID0gIm9iajE2L2luZm9fdHNrLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBNYXJrZXJOb2RlW10gRU1QVFlfTUFSS0VSX0FSUkFZID0gbmV3IE1hcmtlck5vZGVbMF07Ci0JCi0Jc3RhdGljIGZpbmFsIENvbmNyZXRlTWFya2VyW10gRU1QVFlfQ09OQ1JFVEVfTUFSS0VSX0FSUkFZID0gbmV3IENvbmNyZXRlTWFya2VyWzBdOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEVNUFRZX0NPTExFQ1RJT04gPSBBcnJheXMuYXNMaXN0KG5ldyBNYXJrZXJOb2RlWzBdKTsKLQotCS8qKgotCSAqIEdldCB0aGUgcHJvcGVyeSBjYWxsZWQgcHJvcGVydHkgZnJvbSB0aGUgbWFya2VyLiBJZiBpdCBpcyBub3QgZm91bmQKLQkgKiByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIElNYXJrZXIgbWFya2VyKSB7Ci0JCWlmIChtYXJrZXIgPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2JqID0gbWFya2VyLmdldEF0dHJpYnV0ZShwcm9wZXJ0eSk7Ci0JCQlpZiAob2JqICE9IG51bGwpCi0JCQkJcmV0dXJuIG9iai50b1N0cmluZygpOwotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coZSk7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBjcmVhdGlvbiB0aW1lIGZyb20gdGhlIHRpbWVzdGFtcAotCSAqIAotCSAqIEBwYXJhbSB0aW1lc3RhbXAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENyZWF0aW9uVGltZShsb25nIHRpbWVzdGFtcCkgewotCQlyZXR1cm4gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKERhdGVGb3JtYXQuTE9ORywKLQkJCQlEYXRlRm9ybWF0Lk1FRElVTSkuZm9ybWF0KG5ldyBEYXRlKHRpbWVzdGFtcCkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgY3JlYXRpb24gdGltZSBmcm9tIHRoZSBtYXJrZXIuCi0JICogCi0JICogQHBhcmFtIG1hcmtlcgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q3JlYXRpb25UaW1lKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0Q3JlYXRpb25UaW1lKG1hcmtlci5nZXRDcmVhdGlvblRpbWUoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJbG9nKGUpOwotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyLiBJZiB0aGUgbWFya2VyIGhhcyB0aGUKLQkgKiBNYXJrZXJWaWV3VXRpbCNQQVRIX0FUVFJJQlVURSBzZXQgdXNlIHRoYXQuIE90aGVyd2lzZSB1c2UgdGhlIHBhdGggb2YgdGhlCi0JICogcGFyZW50IHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbnRhaW5lck5hbWUoSU1hcmtlciBtYXJrZXIpIHsKLQotCQl0cnkgewotCQkJT2JqZWN0IHBhdGhBdHRyaWJ1dGUgPSBtYXJrZXIKLQkJCQkJLmdldEF0dHJpYnV0ZShNYXJrZXJWaWV3VXRpbC5QQVRIX0FUVFJJQlVURSk7Ci0KLQkJCWlmIChwYXRoQXR0cmlidXRlICE9IG51bGwpCi0JCQkJcmV0dXJuIHBhdGhBdHRyaWJ1dGUudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIExvZyB0aGUgZXhjZXB0aW9uIGFuZCBmYWxsIGJhY2suCi0JCQlsb2coZXhjZXB0aW9uKTsKLQkJfQotCi0JCUlQYXRoIHBhdGggPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpOwotCQlpbnQgbiA9IHBhdGguc2VnbWVudENvdW50KCkgLSAxOyAvLyBuIGlzIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgaW4KLQkJLy8gY29udGFpbmVyLCBub3QgcGF0aAotCQlpZiAobiA8PSAwKQotCQkJcmV0dXJuIFV0aWwuRU1QVFlfU1RSSU5HOwotCQlpbnQgbGVuID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpCi0JCQlsZW4gKz0gcGF0aC5zZWdtZW50KGkpLmxlbmd0aCgpOwotCQkvLyBhY2NvdW50IGZvciAvJ3MKLQkJaWYgKG4gPiAxKQotCQkJbGVuICs9IG4gLSAxOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCQlpZiAoaSAhPSAwKQotCQkJCXNiLmFwcGVuZCgnLycpOwotCQkJc2IuYXBwZW5kKHBhdGguc2VnbWVudChpKSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZXhjZXB0aW9uLmdldFN0YXR1cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQuIElmIHRoZSBtYXJrZXIgaGFzIHRoZQotCSAqIE1hcmtlclZpZXdVdGlsI05BTUVfQVRUUklCVVRFIHNldCB1c2UgdGhhdC4gT3RoZXJ3aXNlIHVzZSB0aGUgbmFtZSBvZiB0aGUKLQkgKiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoSU1hcmtlciBtYXJrZXIpIHsKLQotCQl0cnkgewotCQkJT2JqZWN0IG5hbWVBdHRyaWJ1dGUgPSBtYXJrZXIKLQkJCQkJLmdldEF0dHJpYnV0ZShNYXJrZXJWaWV3VXRpbC5OQU1FX0FUVFJJQlVURSk7Ci0KLQkJCWlmIChuYW1lQXR0cmlidXRlICE9IG51bGwpCi0JCQkJcmV0dXJuIG5hbWVBdHRyaWJ1dGUudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWxvZyhleGNlcHRpb24pOwotCQl9Ci0KLQkJcmV0dXJuIG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIG1hcmtlciBpcyBlZGl0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIGVkaXRhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRWRpdGFibGUoSU1hcmtlciBtYXJrZXIpIHsKLQkJaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJldHVybiBtYXJrZXIuaXNTdWJ0eXBlT2YoSU1hcmtlci5CT09LTUFSSykKLQkJCQkJfHwgKG1hcmtlci5pc1N1YnR5cGVPZihJTWFya2VyLlRBU0spICYmIG1hcmtlcgotCQkJCQkJCS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5VU0VSX0VESVRBQkxFLCB0cnVlKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGVycm9yIHN0YXR1cyBmb3IgdGhlIGdpdmVuIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBJU3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGVycm9yU3RhdHVzKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQlpZihtZXNzYWdlID09IG51bGwpCi0JCQltZXNzYWdlID0gRU1QVFlfU1RSSU5HOwotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwKLQkJCQlJU3RhdHVzLkVSUk9SLG1lc3NhZ2UgLCBleGNlcHRpb24pOwotCX0KLQotCXByaXZhdGUgVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGltYWdlIGZvciB0aGUgc2V2ZXJpdHkgaWYgaXQgY2FuIGJlIGlkZW50aWZpZWQuCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHJldHVybiBJbWFnZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoaW50IHNldmVyaXR5KSB7Ci0KLQkJaWYgKHNldmVyaXR5ID09IElNYXJrZXIuU0VWRVJJVFlfRVJST1IpIHsKLQkJCXJldHVybiBnZXRJREVJbWFnZShJTUFHRV9FUlJPUl9QQVRIKTsKLQkJfQotCQlpZiAoc2V2ZXJpdHkgPT0gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKSB7Ci0JCQlyZXR1cm4gZ2V0SURFSW1hZ2UoSU1BR0VfV0FSTklOR19QQVRIKTsKLQkJfQotCQlpZiAoc2V2ZXJpdHkgPT0gSU1hcmtlci5TRVZFUklUWV9JTkZPKSB7Ci0JCQlyZXR1cm4gZ2V0SURFSW1hZ2UoSU1BR0VfSU5GT19QQVRIKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgSURFIGltYWdlIGF0IHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgZ2V0SURFSW1hZ2UoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldFJlc291cmNlcygpLmNyZWF0ZUltYWdlV2l0aERlZmF1bHQoCi0JCQkJSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcihwYXRoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgZm9yIHNldmVyaXR5Ci0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXZlcml0eVRleHQoaW50IHNldmVyaXR5KSB7Ci0JCWlmIChzZXZlcml0eSA9PSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKSB7Ci0JCQlyZXR1cm4gTWFya2VyTWVzc2FnZXMucHJvcGVydGllc0RpYWxvZ19lcnJvckxhYmVsOwotCQl9Ci0JCWlmIChzZXZlcml0eSA9PSBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcpIHsKLQkJCXJldHVybiBNYXJrZXJNZXNzYWdlcy5wcm9wZXJ0aWVzRGlhbG9nX3dhcm5pbmdMYWJlbDsKLQkJfQotCQlpZiAoc2V2ZXJpdHkgPT0gSU1hcmtlci5TRVZFUklUWV9JTkZPKSB7Ci0JCQlyZXR1cm4gTWFya2VyTWVzc2FnZXMucHJvcGVydGllc0RpYWxvZ19pbmZvTGFiZWw7Ci0JCX0KLQotCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNob3J0IG5hbWUgZm9yIHRoZSBjb250YWluZXIKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaG9ydENvbnRhaW5lck5hbWUoSU1hcmtlciBtYXJrZXIpIHsKLQotCQl0cnkgewotCQkJT2JqZWN0IHBhdGhBdHRyaWJ1dGUgPSBtYXJrZXIKLQkJCQkJLmdldEF0dHJpYnV0ZShNYXJrZXJWaWV3VXRpbC5QQVRIX0FUVFJJQlVURSk7Ci0KLQkJCWlmIChwYXRoQXR0cmlidXRlICE9IG51bGwpCi0JCQkJcmV0dXJuIHBhdGhBdHRyaWJ1dGUudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIExvZyB0aGUgZXhjZXB0aW9uIGFuZCBmYWxsIGJhY2suCi0JCQlsb2coZXhjZXB0aW9uKTsKLQkJfQotCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG1hcmtlci5nZXRSZXNvdXJjZSgpOwotCQlpbnQgdHlwZSA9IHJlc291cmNlLmdldFR5cGUoKTsKLQkJCi0JCS8vQ2Fubm90IGJlIHByb2plY3QgcmVsYXRpdmUgaWYgaXQgaXMgdGhlIHJvb3Qgb3IgYSBwcm9qZWN0Ci0JCWlmKHR5cGUgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQlyZXR1cm4gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkKLQkJaWYodHlwZSA9PSBJUmVzb3VyY2UuUk9PVCkKLQkJCXJldHVybiBNYXJrZXJNZXNzYWdlcy5VdGlsX1dvcmtzcGFjZVJvb3Q7Ci0JCQotCQlTdHJpbmcgcmVzdWx0ID0gIG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9PU1N0cmluZygpOwotCQlpZihyZXN1bHQudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gTWFya2VyTWVzc2FnZXMuVXRpbF9Qcm9qZWN0Um9vdDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBzZWxlY3Rpb24gaGFzIG9uZSBlbGVtZW50IHRoYXQKLQkgKiBpcyBjb25jcmV0ZS4KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybiA8dHJ1ZT5jb2RlPC90cnVlPiBpZiB0aGUgc2VsZWN0aW9uIGhhcyBvbmUgZWxlbWVudCB0aGF0Ci0JICogaXMgY29uY3JldGUuCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNTaW5nbGVDb25jcmV0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYoIHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSl7Ci0JCQlPYmplY3QgZmlyc3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZihmaXJzdCBpbnN0YW5jZW9mIE1hcmtlck5vZGUpCi0JCQkgcmV0dXJuKChNYXJrZXJOb2RlKSBmaXJzdCkuaXNDb25jcmV0ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsJCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNlbGVjdGlvbgotCSAqIGFyZSBjb25jcmV0ZS4KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybiA8dHJ1ZT5jb2RlPC90cnVlPiBpZiBhbGwgb2YgdGhlIGVsZW1lbnRzIGFyZSBjb25jcmV0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsQ29uY3JldGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmKCBzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpPjApewotCQkJSXRlcmF0b3Igbm9kZXMgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJCXdoaWxlKG5vZGVzLmhhc05leHQoKSl7Ci0JCQkJaWYoKChNYXJrZXJOb2RlKSBub2Rlcy5uZXh0KCkpLmlzQ29uY3JldGUoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtYXJrZXIgdHlwZSBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZC4KLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHJldHVybiBTdHJpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNYXJrZXJUeXBlTmFtZShDb25jcmV0ZU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyB0eXBlSWQgPSAgbWFya2VyLmdldE1hcmtlcigpLmdldFR5cGUoKTsKLQkJCU1hcmtlclR5cGUgdHlwZSA9IE1hcmtlclR5cGVzTW9kZWwuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlKHR5cGVJZCk7Ci0JCQlyZXR1cm4gdHlwZS5nZXRMYWJlbCgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUlERVdvcmtiZW5jaFBsdWdpbi5sb2coZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUuZ2V0U3RhdHVzKCkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhZTBmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotc29ydEFjdGlvbl90aXRsZSA9ICZTb3J0aW5nLi4uCi1maWx0ZXJzU3ViTWVudV90aXRsZSA9ICZGaWx0ZXJzCi1maWx0ZXJzQWN0aW9uX3RpdGxlID0gJkNvbmZpZ3VyZSBGaWx0ZXJzLi4uCi1maWx0ZXJzQWN0aW9uX3Rvb2x0aXAgPSBGaWx0ZXJzLi4uCi0KLXNvcnREaWFsb2dfdGl0bGUgPSBTb3J0aW5nCi1zb3J0RGlhbG9nX2xhYmVsID0gU29ydCBieToKLXNvcnREaWFsb2dfY29sdW1uTGFiZWwgPSAmezB9LiAKLQotc29ydERpcmVjdGlvbkFzY2VuZGluZ190ZXh0ID0gJkFzY2VuZGluZwotc29ydERpcmVjdGlvbkFzY2VuZGluZ190ZXh0MiA9IEEmc2NlbmRpbmcKLXNvcnREaXJlY3Rpb25Bc2NlbmRpbmdfdGV4dDMgPSBBcyZjZW5kaW5nCi1zb3J0RGlyZWN0aW9uQXNjZW5kaW5nX3RleHQ0ID0gQXNjZSZuZGluZwotCi1zb3J0RGlyZWN0aW9uRGVzY2VuZGluZ190ZXh0ID0gJkRlc2NlbmRpbmcKLXNvcnREaXJlY3Rpb25EZXNjZW5kaW5nX3RleHQyID0gRCZlc2NlbmRpbmcKLXNvcnREaXJlY3Rpb25EZXNjZW5kaW5nX3RleHQzID0gRGVzY2VuZCZpbmcKLXNvcnREaXJlY3Rpb25EZXNjZW5kaW5nX3RleHQ0ID0gRGVzY2VuZGluJmcKLQotcmVzdG9yZURlZmF1bHRzX3RleHQgPSBSZXN0b3JlIERlJmZhdWx0cwotCi1FcnJvciA9IEVycm9yOiAKLVVua25vd24gPSBVbmtub3duCi0KLWNvbHVtbkhlYWRlcl9tZXNzYWdlID0gRGVzY3JpcHRpb24KLWNvbHVtbkhlYWRlcl9sb2NhdGlvbiA9IExvY2F0aW9uCi1jb2x1bW5IZWFkZXJfbGluZU51bWJlciA9IExvY2F0aW9uCi1jb2x1bW5IZWFkZXJfY2hhclN0YXJ0ID0gQ2hhciBTdGFydAotY29sdW1uSGVhZGVyX2NoYXJFbmQgPSBDaGFyIEVuZAotY29sdW1uSGVhZGVyX3RyYW5zaWVudCA9IFRyYW5zaWVudAotY29sdW1uSGVhZGVyX3VzZXJFZGl0YWJsZSA9IFVzZXIgRWRpdGFibGUKLWNvbHVtbkhlYWRlcl9zZXZlcml0eSA9IAotY29sdW1uSGVhZGVyX3ByaW9yaXR5ID0KLWNvbHVtbkhlYWRlcl9kb25lID0gCi0KLWRlc2NyaXB0aW9uX21lc3NhZ2UgPSBEZXNjcmlwdGlvbgotZGVzY3JpcHRpb25fcmVzb3VyY2UgPSBSZXNvdXJjZQotZGVzY3JpcHRpb25fZm9sZGVyID0gUGF0aAotZGVzY3JpcHRpb25fbGluZU51bWJlciA9IExvY2F0aW9uCi1kZXNjcmlwdGlvbl9jcmVhdGlvblRpbWUgPSBDcmVhdGlvbiBUaW1lCi1kZXNjcmlwdGlvbl9wcmlvcml0eSA9IFByaW9yaXR5Ci1kZXNjcmlwdGlvbl9jb21wbGV0aW9uID0gQ29tcGxldGlvbgotZGVzY3JpcHRpb25fbWFya2VySWQgPSBJZAotZGVzY3JpcHRpb25fc3ViY2F0ZWdvcnkgPSBTdWIgQ2F0ZWdvcnkKLWRlc2NyaXB0aW9uX2NhdGVnb3J5ID0gQ2F0ZWdvcnkKLWRlc2NyaXB0aW9uX3R5cGUgPSBUeXBlCi1kZXNjcmlwdGlvbl9wcm9qZWN0ID0gUHJvamVjdAotCi1sYWJlbF9saW5lTnVtYmVyID0gbGluZSB7MH0KLQotb3BlbkFjdGlvbl90aXRsZSA9ICZHbyBUbwotY29weUFjdGlvbl90aXRsZSA9ICZDb3B5Ci1wYXN0ZUFjdGlvbl90aXRsZSA9ICZQYXN0ZQotZGVsZXRlQWN0aW9uX3RpdGxlID0gJkRlbGV0ZQotZGVsZXRlQWN0aW9uX3Rvb2x0aXAgPSBEZWxldGUKLXNlbGVjdEFsbEFjdGlvbl90aXRsZSA9IFNlbGVjdCAmQWxsCi1wcm9wZXJ0aWVzQWN0aW9uX3RpdGxlID0gUCZyb3BlcnRpZXMKLQotZmlsdGVyc0RpYWxvZ190aXRsZSA9IEZpbHRlcnMKLWZpbHRlcnNEaWFsb2dfb25PZmYgPSBFJm5hYmxlZAotZmlsdGVyc0RpYWxvZ19saW1pdFZpc2libGVNYXJrZXJzVG8gPSBMaW1pdCB2aXNpJmJsZSBpdGVtcyB0bzoKLWZpbHRlcnNEaWFsb2dfc2hvd0l0ZW1zT2ZUeXBlID0gU2hvdyBpdGVtcyBvZiAmdHlwZToKLWZpbHRlcnNEaWFsb2dfYW55UmVzb3VyY2UgPSBPbiBhbnkgJmVsZW1lbnQKLWZpbHRlcnNEaWFsb2dfYW55UmVzb3VyY2VJblNhbWVQcm9qZWN0ID0gT24gYW55IGVsZW1lbnQgaW4gc2FtZSAmcHJvamVjdAotZmlsdGVyc0RpYWxvZ19zZWxlY3RlZFJlc291cmNlID0gT24gc2VsZWN0ZWQgZWxlbWVudCAmb25seQotZmlsdGVyc0RpYWxvZ19zZWxlY3RlZEFuZENoaWxkcmVuID0gT24gc2VsZWN0ZWQgZWxlbWVudCBhbmQgaXRzICZjaGlsZHJlbgotZmlsdGVyc0RpYWxvZ193b3JraW5nU2V0ID0gT24gd29yJmtpbmcgc2V0OiAgezB9Ci1maWx0ZXJzRGlhbG9nX3dvcmtpbmdTZXRTZWxlY3QgPSAmU2VsZWN0Li4uCi1maWx0ZXJzRGlhbG9nX25vV29ya2luZ1NldCA9IE9uIHdvciZraW5nIHNldDogIDxubyB3b3JraW5nIHNldCBzZWxlY3RlZD4KLWZpbHRlcnNEaWFsb2dfc2VsZWN0QWxsID0gU2VsZWN0ICZBbGwKLWZpbHRlcnNEaWFsb2dfZGVzZWxlY3RBbGwgPSAmRGVzZWxlY3QgQWxsCi1maWx0ZXJzRGlhbG9nX3R5cGVfY29sdW1uSGVhZGVyID0gVHlwZQotZmlsdGVyc0RpYWxvZ19zdXBlclR5cGVjb2x1bW5IZWFkZXIgPSBQYXJlbnQgdHlwZXMKLWZpbHRlcnNEaWFsb2dfdGl0bGVNYXJrZXJMaW1pdEludmFsaWQgPSBFcnJvcgotZmlsdGVyc0RpYWxvZ19tZXNzYWdlTWFya2VyTGltaXRJbnZhbGlkID0gVGhlIHZpc2libGUgaXRlbSBsaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4KLWZpbHRlcnNEaWFsb2dfZGVzY3JpcHRpb25MYWJlbCA9ICZXaGVyZSBkZXNjcmlwdGlvbiAKLWZpbHRlcnNEaWFsb2dfY29udGFpbnMgPSBjb250YWlucwotZmlsdGVyc0RpYWxvZ19kb2VzTm90Q29udGFpbiA9IGRvZXMgbm90IGNvbnRhaW4KLWZpbHRlcnNEaWFsb2dfc2V2ZXJpdHlMYWJlbCA9IFdoZXJlIHNlJnZlcml0eSBpczoKLWZpbHRlcnNEaWFsb2dfc2V2ZXJpdHlFcnJvciA9ICZFcnJvcgotZmlsdGVyc0RpYWxvZ19zZXZlcml0eVdhcm5pbmcgPSBXYXJuaW4mZwotZmlsdGVyc0RpYWxvZ19zZXZlcml0eUluZm8gPSAmSW5mbwotZmlsdGVyc0RpYWxvZ19wcmlvcml0eUxhYmVsID0gV2hlcmUgcHJpb3JpdCZ5IGlzOiAKLWZpbHRlcnNEaWFsb2dfcHJpb3JpdHlIaWdoID0gJkhpZ2gKLWZpbHRlcnNEaWFsb2dfcHJpb3JpdHlOb3JtYWwgPSAmTm9ybWFsCi1maWx0ZXJzRGlhbG9nX3ByaW9yaXR5TG93ID0gTG8mdwotZmlsdGVyc0RpYWxvZ19zdGF0dXNMYWJlbCA9IFdoZXJlIHN0YXQmdXMgaXM6IAotZmlsdGVyc0RpYWxvZ19zdGF0dXNDb21wbGV0ZSA9IENvJm1wbGV0ZWQKLWZpbHRlcnNEaWFsb2dfc3RhdHVzSW5jb21wbGV0ZSA9IE5vdCBDb21wJmxldGVkCi0KLXByb3BlcnRpZXNEaWFsb2dfY3JlYXRpb25UaW1lX3RleHQgPSBDcmVhdGlvbiAmVGltZTogCi1wcm9wZXJ0aWVzRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQgPSAmRGVzY3JpcHRpb246IAotcHJvcGVydGllc0RpYWxvZ19mb2xkZXJfdGV4dCA9IEluICZGb2xkZXI6IAotcHJvcGVydGllc0RpYWxvZ19sb2NhdGlvbl90ZXh0ID0gJkxvY2F0aW9uOiAKLXByb3BlcnRpZXNEaWFsb2dfcmVzb3VyY2VfdGV4dCA9IE9uICZFbGVtZW50OiAKLXByb3BlcnRpZXNEaWFsb2dfdGl0bGUgPSBQcm9wZXJ0aWVzCi1wcm9wZXJ0aWVzRGlhbG9nX3NldmVyaXR5TGFiZWwgPSAmU2V2ZXJpdHk6IHswfQotcHJvcGVydGllc0RpYWxvZ19lcnJvckxhYmVsID0gRXJyb3IKLXByb3BlcnRpZXNEaWFsb2dfd2FybmluZ0xhYmVsID0gV2FybmluZwotcHJvcGVydGllc0RpYWxvZ19pbmZvTGFiZWwgPSBJbmZvCi1wcm9wZXJ0aWVzRGlhbG9nX25vc2V2ZXJpdHlMYWJlbCA9IE5vdCBkZWZpbmVkCi1wcm9wZXJ0aWVzRGlhbG9nX3ByaW9yaXR5ID0gJlByaW9yaXR5Ci1wcm9wZXJ0aWVzRGlhbG9nX3ByaW9yaXR5SGlnaCA9IEhpZ2gKLXByb3BlcnRpZXNEaWFsb2dfcHJpb3JpdHlOb3JtYWwgPSBOb3JtYWwKLXByb3BlcnRpZXNEaWFsb2dfcHJpb3JpdHlMb3cgPSBMb3cKLXByb3BlcnRpZXNEaWFsb2dfY29tcGxldGVkID0gJkNvbXBsZXRlZAotCi1tYXJrZXJMaW1pdEV4Y2VlZGVkX3RpdGxlID0gVGhlcmUgYXJlIHRvbyBtYW55IGl0ZW1zIHRvIGRpc3BsYXkuXG5cCi0JVG8gc2VlIGl0ZW1zIGluIHRoaXMgd2luZG93LCBhZGp1c3QgdGhlIGZpbHRlciBzZXR0aW5ncy4KLQkKLWZpbHRlcl9tYXRjaGVkTWVzc2FnZSA9IEZpbHRlciBtYXRjaGVkIHswfSBvZiB7MX0gaXRlbXMKLWZpbHRlcl9pdGVtc01lc3NhZ2UgPSB7MH0gaXRlbXMKLXByb2JsZW1fZmlsdGVyX21hdGNoZWRNZXNzYWdlID0gezB9IChGaWx0ZXIgbWF0Y2hlZCB7MX0gb2YgezJ9IGl0ZW1zKQotdmlld190aXRsZSA9IHswfSAoezF9KQotCi1lcnJvck1vZGlmeWluZ0Jvb2ttYXJrID0gRXJyb3IgTW9kaWZ5aW5nIEJvb2ttYXJrCi1lcnJvck1vZGlmeWluZ1Rhc2sgPSBFcnJvciBNb2RpZnlpbmcgVGFzawotCi1wcm9ibGVtU2V2ZXJpdHlfZGVzY3JpcHRpb24gPSBTZXZlcml0eQotcHJvYmxlbV9zdGF0dXNTdW1tYXJ5QnJlYWtkb3duID0gezAsY2hvaWNlLDAjMCBlcnJvcnN8MSN7MCxudW1iZXIsaW50ZWdlcn0gZXJyb3J8MTx7MCxudW1iZXIsaW50ZWdlcn0gZXJyb3JzfSwgezEsY2hvaWNlLDAjMCB3YXJuaW5nc3wxI3sxLG51bWJlcixpbnRlZ2VyfSB3YXJuaW5nfDE8ezEsbnVtYmVyLGludGVnZXJ9IHdhcm5pbmdzfSwgezIsY2hvaWNlLDAjMCBpbmZvc3wxI3syLG51bWJlcixpbnRlZ2VyfSBpbmZvfDE8ezIsbnVtYmVyLGludGVnZXJ9IGluZm9zfQotbWFya2VyX3N0YXR1c1N1bW1hcnlTZWxlY3RlZCA9ICAgezAsY2hvaWNlLDAjMCBpdGVtcyB8MSN7MCxudW1iZXIsaW50ZWdlcn0gaXRlbSB8MTx7MCxudW1iZXIsaW50ZWdlcn0gaXRlbXN9IHNlbGVjdGVkLiAKLQotZGVsZXRlQ29tcGxldGVkQWN0aW9uX3RpdGxlID0gRGVsZXRlIENvbXBsZXRlZCAmVGFza3MKLQotZmlsdGVyc0FjdGlvbl90aXRsZSA9ICZGaWx0ZXJzLi4uCi0KLW1hcmtDb21wbGV0ZWRBY3Rpb25fdGl0bGUgPSAmTWFyayBDb21wbGV0ZWQKLQotcmVzb2x2ZU1hcmtlckFjdGlvbl90aXRsZSA9ICZRdWljayBGaXgKLXJlc29sdmVNYXJrZXJBY3Rpb25fZGlhbG9nVGl0bGUgPSBRdWljayBGaXgKLXJlc29sdmVNYXJrZXJBY3Rpb25fbm9SZXNvbHV0aW9uc0xhYmVsID0gVGhlcmUgYXJlIG5vIHF1aWNrIGZpeGVzIGF2YWlsYWJsZSBmb3IgdGhlIHNlbGVjdGVkIG1hcmtlci4KLXJlc29sdmVNYXJrZXJBY3Rpb25fY29tcHV0YXRpb25BY3Rpb24gPSBDYWxjdWxhdGluZyBSZXNvbHV0aW9ucyBGb3IgezB9Ci0KLWRlbGV0ZUNvbXBsZXRlZFRhc2tzX2RpYWxvZ1RpdGxlID0gRGVsZXRlIENvbXBsZXRlZCBUYXNrcwotZGVsZXRlQ29tcGxldGVkVGFza3Nfbm9uZUNvbXBsZXRlZCA9IE5vIHVzZXItZWRpdGFibGUgY29tcGxldGVkIHRhc2tzIHRvIGRlbGV0ZS4KLWRlbGV0ZUNvbXBsZXRlZFRhc2tzX3Blcm1hbmVudFBsdXJhbCA9IERvIHlvdSB3YW50IHRvIHBlcm1hbmVudGx5IGRlbGV0ZSB0aGUgezB9IGNvbXBsZXRlZCB0YXNrcz8KLWRlbGV0ZUNvbXBsZXRlZFRhc2tzX3Blcm1hbmVudFNpbmd1bGFyID0gRG8geW91IHdhbnQgdG8gcGVybWFuZW50bHkgZGVsZXRlIHRoZSBjb21wbGV0ZWQgdGFzaz8KLWRlbGV0ZUNvbXBsZXRlZFRhc2tzX2Vycm9yTWVzc2FnZSA9IEVycm9yIGRlbGV0aW5nIGNvbXBsZXRlZCB0YXNrcwotCi1hZGRHbG9iYWxUYXNrQWN0aW9uX3RpdGxlID0gJkFkZCBUYXNrCi1hZGRHbG9iYWxUYXNrQWN0aW9uX3Rvb2x0aXAgPSBBZGQgVGFzawotCi1hZGRHbG9iYWxUYXNrRGlhbG9nX3RpdGxlID0gQWRkIFRhc2sKLQotY29tcGxldGlvbl9kZXNjcmlwdGlvbiA9IENvbXBsZXRlZAotcHJpb3JpdHlfZGVzY3JpcHRpb24gPSBQcmlvcml0eQotCi1wcmlvcml0eV9oaWdoID0gSGlnaAotcHJpb3JpdHlfbm9ybWFsID0gTm9ybWFsCi1wcmlvcml0eV9sb3cgPSBMb3cKLQotQ29weVRvQ2xpcGJvYXJkUHJvYmxlbURpYWxvZ190aXRsZT1Qcm9ibGVtIENvcHlpbmcgdG8gQ2xpcGJvYXJkCi1Db3B5VG9DbGlwYm9hcmRQcm9ibGVtRGlhbG9nX21lc3NhZ2U9VGhlcmUgd2FzIGEgcHJvYmxlbSB3aGVuIGFjY2Vzc2luZyB0aGUgc3lzdGVtIGNsaXBib2FyZC4gUmV0cnk/Ci0KLU1hcmtlckxpc3RfMD1TZWFyY2hpbmcgZm9yIG1hcmtlcnMKLQotVGFibGVDb250ZW50UHJvdmlkZXJfVGFibGVTeW5jaHJvbml6YXRpb249VGFibGUgc3luY2hyb25pemF0aW9uCi1UYWJsZUNvbnRlbnRQcm92aWRlcl9VcGRhdGluZz1VcGRhdGluZyB0YWJsZSB3aWRnZXQKLQotTWFya2VyRmlsdGVyX3NlYXJjaGluZz1TZWFyY2hpbmcgZm9yIG1hcmtlcnMKLU1hcmtlclZpZXdfcmVmcmVzaFByb2dyZXNzPVJlZnJlc2hpbmcgbWFya2VyIHZpZXcKLU1hcmtlclZpZXdfcmVmcmVzaFRpdGxlPVVwZGF0aW5nIHswfSB2aWV3Ci1NYXJrZXJWaWV3X3Byb2Nlc3NVcGRhdGVzPVByb2Nlc3MgcmVzb3VyY2UgdXBkYXRlcwotTWFya2VyVmlld193YWl0aW5nX29uX2NoYW5nZXM9V2FpdGluZyBmb3Igd29ya3NwYWNlIGNoYW5nZXMgdG8gZmluaXNoCi1NYXJrZXJWaWV3X3NlYXJjaGluZ19mb3JfbWFya2Vycz1TZWFyY2hpbmcgZm9yIG1hcmtlcnMKLU1hcmtlclZpZXdfcmVmcmVzaGluZ19jb3VudHM9UmVmcmVzaGluZyBtYXJrZXIgY291bnRzCi1NYXJrZXJWaWV3X3F1ZXVlaW5nX3VwZGF0ZXM9UXVldWVpbmcgdmlld2VyIHVwZGF0ZXMKLQotRGVmZXJyZWRRdWV1ZV9zZXR0aW5nX2NvbnRlbnRzPVNldHRpbmcgY29udGVudHMKLURlZmVycmVkUXVldWVfZW5xdWV1ZWluZ19pdGVtcz1FbnF1ZXVlaW5nIGl0ZW1zCi1NYXJrZXJWaWV3XzE4PUZpbHRlcmluZyBvbiBtYXJrZXIgbGltaXQKLU1hcmtlclZpZXdfMTk9UmVmcmVzaGluZyB2aWV3Ci1Tb3J0VXRpbF9maW5kaW5nX2ZpcnN0PUZpbmRpbmcgZmlyc3QgaXRlbXMKLVNvcnRVdGlsX3BhcnRpdGlvbmluZz1QYXJ0aXRpb25pbmcgaXRlbXMKLU9wZW5NYXJrZXJfZXJyb3JUaXRsZT1FcnJvcgotUGFzdGVNYXJrZXJfZXJyb3JUaXRsZT1FcnJvcgotUmVtb3ZlTWFya2VyX2Vycm9yVGl0bGU9RXJyb3IKLQotTWFya2VyRmlsdGVyX2RlZmF1bHRGaWx0ZXJOYW1lPURlZmF1bHQKLU1hcmtlckZpbHRlcl9uZXdGaWx0ZXJOYW1lPU5ldyBGaWx0ZXIKLU1hcmtlckZpbHRlcl9maWx0ZXJzVGl0bGU9RiZpbHRlcnMKLU1hcmtlckZpbHRlcl9hZGRGaWx0ZXJOYW1lPU4mZXcgRmlsdGVyCi1NYXJrZXJGaWx0ZXJfZGVsZXRlU2VsZWN0ZWROYW1lID0gRGUmbGV0ZSBTZWxlY3RlZAotCi1NYXJrZXJGaWx0ZXJEaWFsb2dfdGl0bGU9QWRkIE5ldyBGaWx0ZXIKLU1hcmtlckZpbHRlckRpYWxvZ19tZXNzYWdlPVNlbGVjdCBGaWx0ZXIgTmFtZQotTWFya2VyRmlsdGVyRGlhbG9nX2VtcHR5TWVzc2FnZT1OYW1lIG11c3Qgbm90IGJlIGVtcHR5Ci0KLU1hcmtlckZpbHRlckRpYWxvZ19lcnJvclRpdGxlID0gQW4gZXJyb3IgaGFzIG9jY3VycmVkCi1NYXJrZXJGaWx0ZXJEaWFsb2dfZmFpbGVkRmlsdGVyTWVzc2FnZSA9IENvdWxkIG5vdCBjcmVhdGUgZmlsdGVyIHswfS4gCi0KLUNoZWNrZWRUYWJsZVNlbGVjdGlvbkRpYWxvZ19lbXB0eUxpc3RNZXNzYWdlPU5vIGVudHJpZXMgYXZhaWxhYmxlLgotCi1NYXJrZXJQcmVmZXJlbmNlc19EaWFsb2dUaXRsZSA9IFNldCBMaW1pdHMKLU1hcmtlclByZWZlcmVuY2VzX01hcmtlckxpbWl0cyA9IFVzZSBNYXJrZXIgTGltaXRzCi1NYXJrZXJQcmVmZXJlbmNlc19WaXNpYmxlSXRlbXMgPSBMaW1pdCB2aXNpYmxlIGl0ZW1zIHRvCi0KLVByb2JsZW1GaWx0ZXJEaWFsb2dfU3lzdGVtX0ZpbHRlcnNfVGl0bGUgPSBTeXN0ZW0gRmlsdGVycwotUHJvYmxlbUZpbHRlckRpYWxvZ19BbGxfUHJvYmxlbXMgPSBFbmFibGVkIGZvciBhbGwgcHJvYmxlbXMKLVByb2JsZW1GaWx0ZXJEaWFsb2dfU2VsZWN0ZWRfVHlwZXMgPSBTZWxlY3RlZCBUeXBlczogCi1Qcm9ibGVtRmlsdGVyRGlhbG9nX0luZm9fU2V2ZXJpdHkgPSBXaGVyZSBzZXZlcml0eSBpcyBpbmZvCi1Qcm9ibGVtRmlsdGVyRGlhbG9nX1dhcm5pbmdfU2V2ZXJpdHkgPSBXaGVyZSBzZXZlcml0eSBpcyB3YXJuaW5nCi1Qcm9ibGVtRmlsdGVyRGlhbG9nX0Vycm9yX1NldmVyaXR5ID0gV2hlcmUgc2V2ZXJpdHkgaXMgZXJyb3IKLVByb2JsZW1GaWx0ZXJEaWFsb2dfQ29udGFpbnNfRGVzY3JpcHRpb24gPSBPbiBhbnkgZGVzY3JpcHRpb24gY29udGFpbmluZyB7MH0KLVByb2JsZW1GaWx0ZXJEaWFsb2dfRG9lc19Ob3RfQ29udGFpbl9EZXNjcmlwdGlvbiA9IE9uIGFueSBkZXNjcmlwdGlvbiBub3QgY29udGFpbmluZyB7MH0KLVByb2JsZW1GaWx0ZXJEaWFsb2dfYW55ID0gRmlsdGVyIG9uIGFueSBlbGVtZW50Ci1Qcm9ibGVtRmlsdGVyRGlhbG9nX3NhbWVDb250YWluZXIgPSBGaWx0ZXIgb24gYW55IGluIHRoZSBzYW1lIGNvbnRhaW5lcgotUHJvYmxlbUZpbHRlckRpYWxvZ19zZWxlY3RlZEFuZENoaWxkcmVuID0gRmlsdGVyIG9uIHNlbGVjdGVkIGVsZW1lbnQgYW5kIGl0J3MgY2hpbGRyZW4KLVByb2JsZW1GaWx0ZXJEaWFsb2dfc2VsZWN0ZWQgPSBGaWx0ZXIgb24gc2VsZWN0ZWQgZWxlbWVudCBvbmx5Ci1Qcm9ibGVtRmlsdGVyRGlhbG9nX3dvcmtpbmdTZXQgPSBGaWx0ZXIgb24gd29ya2luZyBzZXQgezB9ICAKLQotUHJvYmxlbUZpbHRlclJlZ2lzdHJ5X251bGxUeXBlID0gTWFya2VyIHR5cGUgezB9IGRvZXMgbm90IGV4aXN0LgotCi1GaWVsZE1lc3NhZ2VfTnVsbE1lc3NhZ2UgPSBNYXJrZXIgaXMgbnVsbAotRmllbGRNZXNzYWdlX1dyb25nVHlwZSA9IHswfSBpcyBub3Qgb2YgYSBkaXNwbGF5YWJsZSB0eXBlCi0KLUZpZWxkQ2F0ZWdvcnlfVW5jYXRlZ29yaXplZCA9IE90aGVyIFByb2JsZW1zCi0KLUFjdGlvblJlc29sdmVNYXJrZXJfQ2FsY3VsYXRpbmdKb2IgPSBDYWxjdWxhdGluZyBQcm9ibGVtIFJlc29sdXRpb25zCi1BY3Rpb25SZXNvbHZlTWFya2VyX09wZW5XaXphcmRKb2IgPSBPcGVuIFF1aWNrIEZpeCBXaXphcmQKLQotTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19GaXhpbmcgPSBGaXhpbmcKLU1hcmtlclJlc29sdXRpb25EaWFsb2dfRGVzY3JpcHRpb24gPSBTZWxlY3QgdGhlIGZpeCBmb3IgezB9Ci1NYXJrZXJSZXNvbHV0aW9uRGlhbG9nX1Byb2JsZW1zX0xpc3RfVGl0bGUgPSAmUHJvYmxlbXMKLU1hcmtlclJlc29sdXRpb25EaWFsb2dfUmVzb2x1dGlvbnNfTGlzdF9UaXRsZSA9ICZTZWxlY3QgYSByZXNvbHV0aW9uCi1NYXJrZXJSZXNvbHV0aW9uRGlhbG9nX05vTWF0Y2hNZXNzYWdlID0gU29tZSByZXNvbHV0aW9ucyBub3QgYXBwbGllZCBkdWUgdG8gYSBwcmV2aW91cyBmaXgKLU1hcmtlclJlc29sdXRpb25EaWFsb2dfQ2Fubm90Rml4VGl0bGUgPSBFcnJvciBmaXhpbmcgcHJvYmxlbQotTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19DYW5ub3RGaXhNZXNzYWdlID0gQ291bGQgbm90IGZpeCB7MH0KLQotTWFya2VyUmVzb2x1dGlvbkRpYWxvZ19BZGRPdGhlcnMgPSBBZGQgJk1hdGNoaW5nIFByb2JsZW1zCi0KLU1hcmtlclJlc29sdXRpb25EaWFsb2dfVGl0bGUgPSBRdWljayBGaXgKLU1hcmtlclJlc29sdXRpb25EaWFsb2dfQ2FsY3VsYXRpbmdUYXNrID0gQ2FsY3VsYXRpbmcgUG9zc2libGUgUmVzb2x1dGlvbnMKLU1hcmtlclJlc29sdXRpb25EaWFsb2dfV29ya2luZ1N1YlRhc2sgPSBXb3JraW5nIG9uOiB7MH0KLQotVXRpbF9Xb3Jrc3BhY2VOYW1lID0gV29ya3NwYWNlCi1VdGlsX1Byb2plY3RSb290ID0gcHJvamVjdCByb290Ci1VdGlsX1dvcmtzcGFjZVJvb3QgPSB3b3Jrc3BhY2Ugcm9vdAotCi1Qcm9ibGVtVmlld19Hcm91cEJ5TWVudT0mR3JvdXAgQnkKLVByb2JsZW1WaWV3X1NldmVyaXR5PSZTZXZlcml0eQotUHJvYmxlbVZpZXdfQ2F0ZWdvcnk9JkNhdGVnb3J5Ci1Qcm9ibGVtVmlld19Ob25lPSZOb25lCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbWFya2Vycy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOTE5MWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL21hcmtlcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVV0aWxpdHkgY2xhc3NlcyBmb3Igd29ya2luZyB3aXRoIG1hcmtlcnMgaW4gdmlld3MKLTxicj4mbmJzcDsKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvQ29sbGFwc2VBbGxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvQ29sbGFwc2VBbGxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5MDMwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL0NvbGxhcHNlQWxsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqICAgU2ViYXN0aWFuIERhdmlkcyA8c2Rhdmlkc0BnbXguZGU+IC0gQ29sbGFwc2UgYWxsIGFjdGlvbiAoMjU4MjYpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBDb2xsYXBzZSBhbGwgcHJvamVjdCBub2Rlcy4KLSAqLwotcHVibGljIGNsYXNzIENvbGxhcHNlQWxsQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYXZpZ2F0b3IgdGhlIHJlc291cmNlIG5hdmlnYXRvcgotICAgICAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwgZm9yIHRoZSBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGFwc2VBbGxBY3Rpb24oSVJlc291cmNlTmF2aWdhdG9yIG5hdmlnYXRvciwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHN1cGVyKG5hdmlnYXRvciwgbGFiZWwpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0gICAgICAgICAgICAgICAgSU5hdmlnYXRvckhlbHBDb250ZXh0SWRzLkNPTExBUFNFX0FMTF9BQ1RJT04pOwotICAgICAgICBzZXRFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGRlZmluZWQgb24gPGNvZGU+SUFjdGlvbjwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBnZXROYXZpZ2F0b3IoKS5nZXRWaWV3ZXIoKS5jb2xsYXBzZUFsbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvQ29weUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9Db3B5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Y2U0ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9Db3B5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotCi0vKioKLSAqIFN0YW5kYXJkIGFjdGlvbiBmb3IgY29weWluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlc291cmNlcyB0byB0aGUgY2xpcGJvYXJkLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLS8qcGFja2FnZSovY2xhc3MgQ29weUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBpZCBvZiB0aGlzIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IFBsYXRmb3JtVUkuUExVR0lOX0lEICsgIi5Db3B5QWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIHNoZWxsIGluIHdoaWNoIHRvIHNob3cgYW55IGRpYWxvZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotICAgIC8qKgotICAgICAqIFN5c3RlbSBjbGlwYm9hcmQKLSAgICAgKi8KLSAgICBwcml2YXRlIENsaXBib2FyZCBjbGlwYm9hcmQ7Ci0KLSAgICAvKioKLSAgICAgKiBBc3NvY2lhdGVkIHBhc3RlIGFjdGlvbi4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBQYXN0ZUFjdGlvbiBwYXN0ZUFjdGlvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbCBmb3IgYW55IGRpYWxvZ3MKLSAgICAgKiBAcGFyYW0gY2xpcGJvYXJkIGEgcGxhdGZvcm0gY2xpcGJvYXJkCi0gICAgICovCi0gICAgcHVibGljIENvcHlBY3Rpb24oU2hlbGwgc2hlbGwsIENsaXBib2FyZCBjbGlwYm9hcmQpIHsKLSAgICAgICAgc3VwZXIoUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Db3B5QWN0aW9uX3RpdGxlKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChzaGVsbCk7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoY2xpcGJvYXJkKTsKLSAgICAgICAgdGhpcy5zaGVsbCA9IHNoZWxsOwotICAgICAgICB0aGlzLmNsaXBib2FyZCA9IGNsaXBib2FyZDsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQoUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Db3B5QWN0aW9uX3Rvb2xUaXApOwotICAgICAgICBzZXRJZChDb3B5QWN0aW9uLklEKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCUlOYXZpZ2F0b3JIZWxwQ29udGV4dElkcy5DT1BZX0FDVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2hlbGwgdGhlIHNoZWxsIGZvciBhbnkgZGlhbG9ncwotICAgICAqIEBwYXJhbSBjbGlwYm9hcmQgYSBwbGF0Zm9ybSBjbGlwYm9hcmQKLSAgICAgKiBAcGFyYW0gcGFzdGVBY3Rpb24gYSBwYXN0ZSBhY3Rpb24KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHVibGljIENvcHlBY3Rpb24oU2hlbGwgc2hlbGwsIENsaXBib2FyZCBjbGlwYm9hcmQsIFBhc3RlQWN0aW9uIHBhc3RlQWN0aW9uKSB7Ci0gICAgICAgIHRoaXMoc2hlbGwsIGNsaXBib2FyZCk7Ci0gICAgICAgIHRoaXMucGFzdGVBY3Rpb24gPSBwYXN0ZUFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+Q29weUFjdGlvbjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZGVmaW5lZCAKLSAgICAgKiBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPiBjb3BpZXMgdGhlIHNlbGVjdGVkIHJlc291cmNlcyB0byB0aGUgCi0gICAgICogY2xpcGJvYXJkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgTGlzdCBzZWxlY3RlZFJlc291cmNlcyA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCk7Ci0gICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IChJUmVzb3VyY2VbXSkgc2VsZWN0ZWRSZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgSVJlc291cmNlW3NlbGVjdGVkUmVzb3VyY2VzLnNpemUoKV0pOwotCi0gICAgICAgIC8vIEdldCB0aGUgZmlsZSBuYW1lcyBhbmQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHJlc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIGludCBhY3R1YWxMZW5ndGggPSAwOwotICAgICAgICBTdHJpbmdbXSBmaWxlTmFtZXMgPSBuZXcgU3RyaW5nW2xlbmd0aF07Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2VzW2ldLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAvLyBsb2NhdGlvbiBtYXkgYmUgbnVsbC4gU2VlIGJ1ZyAyOTQ5MS4KLSAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIGZpbGVOYW1lc1thY3R1YWxMZW5ndGgrK10gPSBsb2NhdGlvbi50b09TU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgYnVmLmFwcGVuZChyZXNvdXJjZXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyB3YXMgb25lIG9yIG1vcmUgb2YgdGhlIGxvY2F0aW9ucyBudWxsPwotICAgICAgICBpZiAoYWN0dWFsTGVuZ3RoIDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSB0ZW1wRmlsZU5hbWVzID0gZmlsZU5hbWVzOwotICAgICAgICAgICAgZmlsZU5hbWVzID0gbmV3IFN0cmluZ1thY3R1YWxMZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWxMZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBmaWxlTmFtZXNbaV0gPSB0ZW1wRmlsZU5hbWVzW2ldOwotICAgICAgICB9Ci0gICAgICAgIHNldENsaXBib2FyZChyZXNvdXJjZXMsIGZpbGVOYW1lcywgYnVmLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgZW5hYmxlbWVudCBvZiB0aGUgcGFzdGUgYWN0aW9uCi0gICAgICAgIC8vIHdvcmthcm91bmQgc2luY2UgdGhlIGNsaXBib2FyZCBkb2VzIG5vdCBzdXBwb3QgY2FsbGJhY2tzCi0gICAgICAgIGlmIChwYXN0ZUFjdGlvbiAhPSBudWxsICYmIHBhc3RlQWN0aW9uLmdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSAhPSBudWxsKQotICAgICAgICAgICAgcGFzdGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChwYXN0ZUFjdGlvbi5nZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2xpcGJvYXJkIGNvbnRlbnRzLiBQcm9tcHQgdG8gcmV0cnkgaWYgY2xpcGJvYXJkIGlzIGJ1c3kuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlcyB0aGUgcmVzb3VyY2VzIHRvIGNvcHkgdG8gdGhlIGNsaXBib2FyZAotICAgICAqIEBwYXJhbSBmaWxlTmFtZXMgZmlsZSBuYW1lcyBvZiB0aGUgcmVzb3VyY2VzIHRvIGNvcHkgdG8gdGhlIGNsaXBib2FyZAotICAgICAqIEBwYXJhbSBuYW1lcyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYWxsIG5hbWVzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldENsaXBib2FyZChJUmVzb3VyY2VbXSByZXNvdXJjZXMsIFN0cmluZ1tdIGZpbGVOYW1lcywKLSAgICAgICAgICAgIFN0cmluZyBuYW1lcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gc2V0IHRoZSBjbGlwYm9hcmQgY29udGVudHMKLSAgICAgICAgICAgIGlmIChmaWxlTmFtZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10geyByZXNvdXJjZXMsIGZpbGVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJhbnNmZXJbXSB7IFJlc291cmNlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHsgcmVzb3VyY2VzLCBuYW1lcyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyYW5zZmVyW10geyBSZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0gICAgICAgICAgICBpZiAoZS5jb2RlICE9IERORC5FUlJPUl9DQU5OT1RfU0VUX0NMSVBCT0FSRCkKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgaWYgKE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgLm9wZW5RdWVzdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLkNvcHlUb0NsaXBib2FyZFByb2JsZW1EaWFsb2dfdGl0bGUsIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuQ29weVRvQ2xpcGJvYXJkUHJvYmxlbURpYWxvZ19tZXNzYWdlKSkKLSAgICAgICAgICAgICAgICBzZXRDbGlwYm9hcmQocmVzb3VyY2VzLCBmaWxlTmFtZXMsIG5hbWVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db3B5QWN0aW9uPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+U2VsZWN0aW9uTGlzdGVuZXJBY3Rpb248L2NvZGU+IG1ldGhvZCBlbmFibGVzIHRoaXMgYWN0aW9uIGlmIAotICAgICAqIG9uZSBvciBtb3JlIHJlc291cmNlcyBvZiBjb21wYXRpYmxlIHR5cGVzIGFyZSBzZWxlY3RlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGdldFNlbGVjdGVkTm9uUmVzb3VyY2VzKCkuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBMaXN0IHNlbGVjdGVkUmVzb3VyY2VzID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLSAgICAgICAgaWYgKHNlbGVjdGVkUmVzb3VyY2VzLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGJvb2xlYW4gcHJvalNlbGVjdGVkID0gc2VsZWN0aW9uSXNPZlR5cGUoSVJlc291cmNlLlBST0pFQ1QpOwotICAgICAgICBib29sZWFuIGZpbGVGb2xkZXJzU2VsZWN0ZWQgPSBzZWxlY3Rpb25Jc09mVHlwZShJUmVzb3VyY2UuRklMRQotICAgICAgICAgICAgICAgIHwgSVJlc291cmNlLkZPTERFUik7Ci0gICAgICAgIGlmICghcHJvalNlbGVjdGVkICYmICFmaWxlRm9sZGVyc1NlbGVjdGVkKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vIHNlbGVjdGlvbiBtdXN0IGJlIGhvbW9nZW5lb3VzCi0gICAgICAgIGlmIChwcm9qU2VsZWN0ZWQgJiYgZmlsZUZvbGRlcnNTZWxlY3RlZCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBtdXN0IGhhdmUgYSBjb21tb24gcGFyZW50CQotICAgICAgICBJQ29udGFpbmVyIGZpcnN0UGFyZW50ID0gKChJUmVzb3VyY2UpIHNlbGVjdGVkUmVzb3VyY2VzLmdldCgwKSkKLSAgICAgICAgICAgICAgICAuZ2V0UGFyZW50KCk7Ci0gICAgICAgIGlmIChmaXJzdFBhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEl0ZXJhdG9yIHJlc291cmNlc0VudW0gPSBzZWxlY3RlZFJlc291cmNlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocmVzb3VyY2VzRW51bS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UgPSAoSVJlc291cmNlKSByZXNvdXJjZXNFbnVtLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghY3VycmVudFJlc291cmNlLmdldFBhcmVudCgpLmVxdWFscyhmaXJzdFBhcmVudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgLy8gcmVzb3VyY2UgbG9jYXRpb24gbXVzdCBleGlzdAotICAgICAgICAgICAgaWYgKGN1cnJlbnRSZXNvdXJjZS5nZXRMb2NhdGlvbigpID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvRmlsdGVyU2VsZWN0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL0ZpbHRlclNlbGVjdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2EzNGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvRmlsdGVyU2VsZWN0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlczsKLQotLyoqCi0gKiBUaGUgRmlsdGVyU2VsZWN0aW9uQWN0aW9uIG9wZW5zIHRoZSBmaWx0ZXJzIGRpYWxvZy4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlclNlbGVjdGlvbkFjdGlvbiBleHRlbmRzIFJlc291cmNlTmF2aWdhdG9yQWN0aW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX1RPT0xfVElQID0gUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5GaWx0ZXJTZWxlY3Rpb25fdG9vbFRpcDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfU0VMRUNUSU9OX01FU1NBR0UgPSBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLkZpbHRlclNlbGVjdGlvbl9tZXNzYWdlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTFRFUl9USVRMRV9NRVNTQUdFID0gUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5GaWx0ZXJTZWxlY3Rpb25fdGl0bGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hdmlnYXRvciB0aGUgcmVzb3VyY2UgbmF2aWdhdG9yCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCBmb3IgdGhlIGFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBGaWx0ZXJTZWxlY3Rpb25BY3Rpb24oSVJlc291cmNlTmF2aWdhdG9yIG5hdmlnYXRvciwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHN1cGVyKG5hdmlnYXRvciwgbGFiZWwpOwotICAgICAgICBzZXRUb29sVGlwVGV4dChGSUxURVJfVE9PTF9USVApOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0gICAgICAgICAgICAgICAgSU5hdmlnYXRvckhlbHBDb250ZXh0SWRzLkZJTFRFUl9TRUxFQ1RJT05fQUNUSU9OKTsKLSAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgSVJlc291cmNlTmF2aWdhdG9yIG5hdmlnYXRvciA9IGdldE5hdmlnYXRvcigpOwotICAgICAgICBSZXNvdXJjZVBhdHRlcm5GaWx0ZXIgZmlsdGVyID0gbmF2aWdhdG9yLmdldFBhdHRlcm5GaWx0ZXIoKTsKLSAgICAgICAgRmlsdGVyc0NvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgRmlsdGVyc0NvbnRlbnRQcm92aWRlcigKLSAgICAgICAgICAgICAgICBmaWx0ZXIpOwotCi0gICAgICAgIExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBnZXRWaWV3ZXIoKSwgY29udGVudFByb3ZpZGVyLCBuZXcgTGFiZWxQcm92aWRlcigpLAotICAgICAgICAgICAgICAgIEZJTFRFUl9TRUxFQ1RJT05fTUVTU0FHRSk7Ci0KLSAgICAgICAgZGlhbG9nLnNldFRpdGxlKEZJTFRFUl9USVRMRV9NRVNTQUdFKTsKLSAgICAgICAgZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb25zKGNvbnRlbnRQcm92aWRlci5nZXRJbml0aWFsU2VsZWN0aW9ucygpKTsKLSAgICAgICAgZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICBPYmplY3RbXSByZXN1bHRzID0gZGlhbG9nLmdldFJlc3VsdCgpOwotICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0ZWRQYXR0ZXJucyA9IG5ldyBTdHJpbmdbcmVzdWx0cy5sZW5ndGhdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHRzLCAwLCBzZWxlY3RlZFBhdHRlcm5zLCAwLCByZXN1bHRzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmaWx0ZXIuc2V0UGF0dGVybnMoc2VsZWN0ZWRQYXR0ZXJucyk7Ci0gICAgICAgICAgICBuYXZpZ2F0b3Iuc2V0RmlsdGVyc1ByZWZlcmVuY2Uoc2VsZWN0ZWRQYXR0ZXJucyk7Ci0gICAgICAgICAgICBWaWV3ZXIgdmlld2VyID0gZ2V0Vmlld2VyKCk7Ci0gICAgICAgICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0gICAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvRmlsdGVyc0NvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9GaWx0ZXJzQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MjBiZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9GaWx0ZXJzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoZSBGaWx0ZXJzQ29udGVudFByb3ZpZGVyIHByb3ZpZGVzIHRoZSBlbGVtZW50cyBmb3IgdXNlIGJ5IHRoZSBsaXN0IGRpYWxvZwotICogZm9yIHNlbGVjdGluZyB0aGUgcGF0dGVybnMgdG8gYXBwbHkuCi0gKi8KLS8qIHBhY2thZ2UgKi9jbGFzcyBGaWx0ZXJzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMKLSAgICAgICAgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBkZWZpbmVkRmlsdGVyczsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3QgZGVmYXVsdEZpbHRlcnM7Ci0KLSAgICBwcml2YXRlIFJlc291cmNlUGF0dGVybkZpbHRlciByZXNvdXJjZUZpbHRlcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEZpbHRlcnNDb250ZW50UHJvdmlkZXIgdXNpbmcgdGhlIHNlbGVjdGlvbnMgZnJvbSB0aGUgc3VwcGxpZWMKLSAgICAgKiByZXNvdXJjZSBmaWx0ZXIuCi0gICAgICovCi0gICAgcHVibGljIEZpbHRlcnNDb250ZW50UHJvdmlkZXIoUmVzb3VyY2VQYXR0ZXJuRmlsdGVyIGZpbHRlcikgewotICAgICAgICB0aGlzLnJlc291cmNlRmlsdGVyID0gZmlsdGVyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRlbnRQcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbHRlcnMgd2hpY2ggYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHN0cmluZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGVmYXVsdEZpbHRlcnMoKSB7Ci0gICAgICAgIGlmIChkZWZhdWx0RmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZWFkRmlsdGVycygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWZhdWx0RmlsdGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXJzIGN1cnJlbnRseSBkZWZpbmVkIGZvciB0aGUgbmF2aWdhdG9yLgotICAgICAqCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2Ygc3RyaW5ncwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXREZWZpbmVkRmlsdGVycygpIHsKLSAgICAgICAgaWYgKGRlZmluZWRGaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlYWRGaWx0ZXJzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZmluZWRGaWx0ZXJzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIGdldERlZmluZWRGaWx0ZXJzKCkudG9BcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgaW5pdGlhbGx5IHNlbGVjdGVkIGVsZW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbml0aWFsU2VsZWN0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VGaWx0ZXIuZ2V0UGF0dGVybnMoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250ZW50UHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIGZpbHRlcnMgY3VycmVudGx5IGRlZmluZWQgZm9yIHRoZSB3b3JrYmVuY2guIAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZEZpbHRlcnMoKSB7Ci0gICAgICAgIGRlZmluZWRGaWx0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBkZWZhdWx0RmlsdGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQWJzdHJhY3RVSVBsdWdpbiBwbHVnaW4gPSAgSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKTsKLSAgICAgICAgaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uID0gcGx1Z2luLmdldERlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0RXh0ZW5zaW9uUG9pbnQoUmVzb3VyY2VQYXR0ZXJuRmlsdGVyLkZJTFRFUlNfVEFHKTsKLSAgICAgICAgICAgIGlmIChleHRlbnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uLmdldEV4dGVuc2lvbnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb25zW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGNvbmZpZ0VsZW1lbnRzW2pdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoInBhdHRlcm4iKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWRGaWx0ZXJzLmFkZChwYXR0ZXJuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3RlZCA9IGNvbmZpZ0VsZW1lbnRzW2pdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoInNlbGVjdGVkIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2VsZWN0ZWQuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKS8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVycy5hZGQocGF0dGVybik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL0dvdG9BY3Rpb25Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9Hb3RvQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3YWFkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL0dvdG9BY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuZnJhbWVsaXN0LkJhY2tBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuZnJhbWVsaXN0LkZvcndhcmRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuZnJhbWVsaXN0LkZyYW1lTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5mcmFtZWxpc3QuR29JbnRvQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmZyYW1lbGlzdC5VcEFjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBhY3Rpb24gZ3JvdXAgZm9yIHRoZSBnb3RvIGFjdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBHb3RvQWN0aW9uR3JvdXAgZXh0ZW5kcyBSZXNvdXJjZU5hdmlnYXRvckFjdGlvbkdyb3VwIHsKLQotICAgIHByaXZhdGUgQmFja0FjdGlvbiBiYWNrQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBGb3J3YXJkQWN0aW9uIGZvcndhcmRBY3Rpb247Ci0KLSAgICBwcml2YXRlIEdvSW50b0FjdGlvbiBnb0ludG9BY3Rpb247Ci0KLSAgICBwcml2YXRlIFVwQWN0aW9uIHVwQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBHb3RvUmVzb3VyY2VBY3Rpb24gZ29Ub1Jlc291cmNlQWN0aW9uOwotCi0gICAgcHVibGljIEdvdG9BY3Rpb25Hcm91cChJUmVzb3VyY2VOYXZpZ2F0b3IgbmF2aWdhdG9yKSB7Ci0gICAgICAgIHN1cGVyKG5hdmlnYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAoUmVzb3VyY2VTZWxlY3Rpb25VdGlsLmFsbFJlc291cmNlc0FyZU9mVHlwZShzZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5GT0xERVIpKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoZ29JbnRvQWN0aW9uKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gcmVzb3VyY2VTZWxlY3Rpb24gPSBSZXNvdXJjZVNlbGVjdGlvblV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbGxSZXNvdXJjZXMoc2VsZWN0aW9uLCBJUmVzb3VyY2UuUFJPSkVDVCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlU2VsZWN0aW9uICE9IG51bGwgJiYgIXJlc291cmNlU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZVNlbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2plY3QuaXNPcGVuKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW51LmFkZChnb0ludG9BY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLSAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR09fSU5UTywKLSAgICAgICAgICAgICAgICBnb0ludG9BY3Rpb24pOwotICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5CQUNLLmdldElkKCksCi0gICAgICAgICAgICAgICAgYmFja0FjdGlvbik7Ci0gICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZPUldBUkQuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICBmb3J3YXJkQWN0aW9uKTsKLSAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuVVAsCi0gICAgICAgICAgICAgICAgdXBBY3Rpb24pOwotICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5HT19UT19SRVNPVVJDRSwgZ29Ub1Jlc291cmNlQWN0aW9uKTsKLQotICAgICAgICBJVG9vbEJhck1hbmFnZXIgdG9vbEJhciA9IGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLSAgICAgICAgdG9vbEJhci5hZGQoYmFja0FjdGlvbik7Ci0gICAgICAgIHRvb2xCYXIuYWRkKGZvcndhcmRBY3Rpb24pOwotICAgICAgICB0b29sQmFyLmFkZCh1cEFjdGlvbik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0gICAgICAgIEZyYW1lTGlzdCBmcmFtZUxpc3QgPSBuYXZpZ2F0b3IuZ2V0RnJhbWVMaXN0KCk7Ci0gICAgICAgIGdvSW50b0FjdGlvbiA9IG5ldyBHb0ludG9BY3Rpb24oZnJhbWVMaXN0KTsKLSAgICAgICAgYmFja0FjdGlvbiA9IG5ldyBCYWNrQWN0aW9uKGZyYW1lTGlzdCk7Ci0gICAgICAgIGZvcndhcmRBY3Rpb24gPSBuZXcgRm9yd2FyZEFjdGlvbihmcmFtZUxpc3QpOwotICAgICAgICB1cEFjdGlvbiA9IG5ldyBVcEFjdGlvbihmcmFtZUxpc3QpOwotICAgICAgICBnb1RvUmVzb3VyY2VBY3Rpb24gPSBuZXcgR290b1Jlc291cmNlQWN0aW9uKG5hdmlnYXRvciwKLSAgICAgICAgICAgICAgICBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLkdvVG9SZXNvdXJjZV9sYWJlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQWN0aW9uQmFycygpIHsKLSAgICAgICAgQWN0aW9uQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotICAgICAgICBib29sZWFuIGVuYWJsZSA9IGZhbHNlOwotCi0gICAgICAgIC8vIEZpeCBmb3IgYnVnIDI2MTI2LiBSZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIgY291bGQgY2FsbAotICAgICAgICAvLyB1cGRhdGVBY3Rpb25CYXJzIHdpdGhvdXQgYSBjb250ZXh0IGJlaW5nIHNldC4KLSAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2UgcmVzb3VyY2UgbmF2aWdhdG9yIHNldHMKLSAgICAgICAgLy8gY29udGV4dCBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGdyb3VwIGlzIGNyZWF0ZWQuCi0gICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotICAgICAgICAgICAgICAgICAgICBlbmFibGUgPSAoKElQcm9qZWN0KSBvYmplY3QpLmlzT3BlbigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZvbGRlcikgewotICAgICAgICAgICAgICAgICAgICBlbmFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBnb0ludG9BY3Rpb24uc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICAvLyB0aGUgcmVzdCBvZiB0aGUgYWN0aW9ucyB1cGRhdGUgYnkgbGlzdGVuaW5nIHRvIGZyYW1lIGxpc3QgY2hhbmdlcwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvR290b1Jlc291cmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL0dvdG9SZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRiM2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvR290b1Jlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSW1wbGVtZW50cyB0aGUgZ28gdG8gcmVzb3VyY2UgYWN0aW9uLiBPcGVucyBhIGRpYWxvZyBhbmQgc2V0Ci0gKiB0aGUgbmF2aWdhdG9yIHNlbGVjdGlvbiB3aXRoIHRoZSByZXNvdXJjZSBzZWxlY3RlZCBieQotICogdGhlIHVzZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBHb3RvUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBSZXNvdXJjZU5hdmlnYXRvckFjdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hdmlnYXRvciB0aGUgbmF2aWdhdG9yCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgR290b1Jlc291cmNlQWN0aW9uKElSZXNvdXJjZU5hdmlnYXRvciBuYXZpZ2F0b3IsIFN0cmluZyBsYWJlbCkgewotICAgICAgICBzdXBlcihuYXZpZ2F0b3IsIGxhYmVsKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotICAgICAgICAgICAgICAgIElOYXZpZ2F0b3JIZWxwQ29udGV4dElkcy5HT1RPX1JFU09VUkNFX0FDVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29sbGVjdCBhbGwgcmVzb3VyY2VzIGluIHRoZSB3b3JrYmVuY2ggb3BlbiBhIGRpYWxvZyBhc2tpbmcKLSAgICAgKiB0aGUgdXNlciB0byBzZWxlY3QgYSByZXNvdXJjZSBhbmQgY2hhbmdlIHRoZSBzZWxlY3Rpb24gaW4KLSAgICAgKiB0aGUgbmF2aWdhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgR290b1Jlc291cmNlRGlhbG9nIGRpYWxvZyA9IG5ldyBHb3RvUmVzb3VyY2VEaWFsb2coZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBjb250YWluZXIsIElSZXNvdXJjZS5GSUxFIHwgSVJlc291cmNlLkZPTERFUgotICAgICAgICAgICAgICAgICAgICAgICAgfCBJUmVzb3VyY2UuUFJPSkVDVCk7Ci0gICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGggPT0gMAotICAgICAgICAgICAgICAgIHx8IHJlc3VsdFswXSBpbnN0YW5jZW9mIElSZXNvdXJjZSA9PSBmYWxzZSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBJUmVzb3VyY2Ugc2VsZWN0aW9uID0gKElSZXNvdXJjZSkgcmVzdWx0WzBdOwotICAgICAgICBnZXRWaWV3ZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uKSwgdHJ1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9Hb3RvUmVzb3VyY2VEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvR290b1Jlc291cmNlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMzE2ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9Hb3RvUmVzb3VyY2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5SZXNvdXJjZUxpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlczsKLQotLyoqCi0gKiBTaG93cyBhIGxpc3Qgb2YgcmVzb3VyY2VzIHRvIHRoZSB1c2VyIHdpdGggYSB0ZXh0IGVudHJ5IGZpZWxkCi0gKiBmb3IgYSBzdHJpbmcgcGF0dGVybiB1c2VkIHRvIGZpbHRlciB0aGUgbGlzdCBvZiByZXNvdXJjZXMuCi0gKgotICovCi0vKnBhY2thZ2UqL2NsYXNzIEdvdG9SZXNvdXJjZURpYWxvZyBleHRlbmRzIFJlc291cmNlTGlzdFNlbGVjdGlvbkRpYWxvZyB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgR290b1Jlc291cmNlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJQ29udGFpbmVyIGNvbnRhaW5lciwKLSAgICAgICAgICAgIGludCB0eXBlc01hc2spIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwsIGNvbnRhaW5lciwgdHlwZXNNYXNrKTsKLSAgICAgICAgc2V0VGl0bGUoUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Hb3RvX3RpdGxlKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnRTaGVsbCwKLSAgICAgICAgICAgICAgICBJTmF2aWdhdG9ySGVscENvbnRleHRJZHMuR09UT19SRVNPVVJDRV9ESUFMT0cpOwotICAgICAgICBzZXRBbGxvd1VzZXJUb1RvZ2dsZURlcml2ZWQodHJ1ZSk7Ci0gICAgICAgIHNldFNob3dEZXJpdmVkKElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKS5nZXRCb29sZWFuKCJSZXNvdXJjZUxpc3RTZWxlY3Rpb25EaWFsb2cuc2hvd0Rlcml2ZWQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5SZXNvdXJjZUxpc3RTZWxlY3Rpb25EaWFsb2cjb2tQcmVzc2VkKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0gICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKS5wdXQoIlJlc291cmNlTGlzdFNlbGVjdGlvbkRpYWxvZy5zaG93RGVyaXZlZCIsIGdldFNob3dEZXJpdmVkKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvSU5hdmlnYXRvckhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL0lOYXZpZ2F0b3JIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjEzZTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvSU5hdmlnYXRvckhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqICAgU2ViYXN0aWFuIERhdmlkcyA8c2Rhdmlkc0BnbXguZGU+IC0gQ29sbGFwc2UgYWxsIGFjdGlvbiAoMjU4MjYpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgcmVzb3VyY2UgbmF2aWdhdG9yIHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQKLSAqIG9yIGV4dGVuZGVkLgotICogPC9wPgotICogCi0gKi8KLS8qcGFja2FnZSovaW50ZXJmYWNlIElOYXZpZ2F0b3JIZWxwQ29udGV4dElkcyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gUGxhdGZvcm1VSS5QTFVHSU5fSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIEFjdGlvbnMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfU0VMRUNUSU9OX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiZmlsdGVyX3NlbGVjdGlvbl9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdPVE9fUkVTT1VSQ0VfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJnb3RvX3Jlc291cmNlX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfTkFWSUdBVE9SX01PVkVfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJyZXNvdXJjZV9uYXZpZ2F0b3JfbW92ZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX05BVklHQVRPUl9SRU5BTUVfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJyZXNvdXJjZV9uYXZpZ2F0b3JfcmVuYW1lX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19JTl9OQVZJR0FUT1JfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJzaG93X2luX25hdmlnYXRvcl9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPUlRfVklFV19BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInNvcnRfdmlld19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFlfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJyZXNvdXJjZV9uYXZpZ2F0b3JfY29weV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1RFX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAicmVzb3VyY2VfbmF2aWdhdG9yX3Bhc3RlX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MTEFQU0VfQUxMX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiY29sbGFwc2VfYWxsX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gRGlhbG9ncwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdPVE9fUkVTT1VSQ0VfRElBTE9HID0gUFJFRklYCi0gICAgICAgICAgICArICJnb3RvX3Jlc291cmNlX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVmlld3MKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9WSUVXID0gUFJFRklYICsgInJlc291cmNlX3ZpZXdfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvSVJlc291cmNlTmF2aWdhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL0lSZXNvdXJjZU5hdmlnYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RjNTNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvSVJlc291cmNlTmF2aWdhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5mcmFtZWxpc3QuRnJhbWVMaXN0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIEFQSSBmb3IgdGhlIHJlc291cmNlIG5hdmlnYXRvci4KLSAqIFRoZSBhY3Rpb24gZ3JvdXBzIHNob3VsZCByZXN0cmljdCB0aGVtc2VsdmVzIHRvIHVzaW5nIHRoaXMgQVBJLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIFN1YmNsYXNzIDxjb2RlPm9yZy5lY2xpcHNlLnVpLnZpZXdzLlJlc291cmNlTmF2aWdhdG9yPC9jb2RlPiAKLSAqIGluc3RlYWQuICAgCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VOYXZpZ2F0b3IgZXh0ZW5kcyBJVmlld1BhcnQgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0dGVybiBmaWx0ZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXR0ZXJuIGZpbHRlcgotICAgICAqLwotICAgIFJlc291cmNlUGF0dGVybkZpbHRlciBnZXRQYXR0ZXJuRmlsdGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgd29ya2luZyBzZXQsIG9yIDxjb2RlPm51bGw8Y29kZT4gaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGFjdGl2ZSB3b3JraW5nIHNldCwgb3IgPGNvZGU+bnVsbDxjb2RlPiBpZiBub25lCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIElXb3JraW5nU2V0IGdldFdvcmtpbmdTZXQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc29ydGVyLgotICAgICAqLwotICAgIFJlc291cmNlU29ydGVyIGdldFNvcnRlcigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBzb3J0ZXIuCi0gICAgICovCi0gICAgdm9pZCBzZXRTb3J0ZXIoUmVzb3VyY2VTb3J0ZXIgc29ydGVyKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlcyBvZiB0aGUgZmlsdGVyIHByZWZlcmVuY2UgdG8gYmUgdGhlIAotICAgICAqIHN0cmluZ3MgaW4gcHJlZmVyZW5jZSB2YWx1ZXMKLSAgICAgKi8KLSAgICB2b2lkIHNldEZpbHRlcnNQcmVmZXJlbmNlKFN0cmluZ1tdIHBhdHRlcm5zKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZpZXdlciB3aGljaCBzaG93cyB0aGUgcmVzb3VyY2UgdHJlZS4KLSAgICAgKi8KLSAgICBUcmVlVmlld2VyIGdldFZpZXdlcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZnJhbWUgbGlzdCBmb3IgdGhpcyBuYXZpZ2F0b3IuCi0gICAgICovCi0gICAgRnJhbWVMaXN0IGdldEZyYW1lTGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbmF2aWdhdG9yJ3Mgc2VsZWN0aW9uIGF1dG9tYXRpY2FsbHkgdHJhY2tzIHRoZSBhY3RpdmUgZWRpdG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbGlua2luZyBpcyBlbmFibGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIGJvb2xlYW4gaXNMaW5raW5nRW5hYmxlZCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgd29ya2luZyBzZXQgZm9yIHRoaXMgdmlldywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gY2xlYXIgaXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHdvcmtpbmdTZXQgdGhlIHdvcmtpbmcgc2V0LCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciBpdAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICB2b2lkIHNldFdvcmtpbmdTZXQoSVdvcmtpbmdTZXQgd29ya2luZ1NldCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBuYXZpZ2F0b3IncyBzZWxlY3Rpb24gYXV0b21hdGljYWxseSB0cmFja3MgdGhlIGFjdGl2ZSBlZGl0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVuYWJsZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZW5hYmxlLCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZGlzYWJsZQotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICB2b2lkIHNldExpbmtpbmdFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL0xvY2FsU2VsZWN0aW9uVHJhbnNmZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGQ3Y2UwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkJ5dGVBcnJheVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXM7Ci0KLS8qKgotICogQSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyIG1heSBiZSB1c2VkIGZvciBkcmFnIGFuZCBkcm9wIG9wZXJhdGlvbnMKLSAqIHdpdGhpbiB0aGUgc2FtZSBpbnN0YW5jZSBvZiBFY2xpcHNlLgotICogVGhlIHNlbGVjdGlvbiBpcyBtYWRlIGF2YWlsYWJsZSBkaXJlY3RseSBmb3IgdXNlIGluIHRoZSBEcm9wVGFyZ2V0TGlzdGVuZXIuCi0gKiBkcm9wQWNjZXB0IG1ldGhvZC4gVGhlIERyb3BUYXJnZXRFdmVudCBwYXNzZWQgdG8gZHJvcEFjY2VwdCBkb2VzIG5vdCBjb250YWluCi0gKiB0aGUgZHJvcCBkYXRhLiBUaGUgc2VsZWN0aW9uIG1heSBiZSB1c2VkIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzIHNvIHRoYXQgdGhlCi0gKiBkcm9wIGNhbiBiZSBhYm9ydGVkIGlmIGFwcHJvcHJpYXRlLgotICoKLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiAKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLSAgICAvLyBGaXJzdCBhdHRlbXB0IHRvIGNyZWF0ZSBhIFVVSUQgZm9yIHRoZSB0eXBlIG5hbWUgdG8gbWFrZSBzdXJlIHRoYXQKLSAgICAvLyBkaWZmZXJlbnQgRWNsaXBzZSBhcHBsaWNhdGlvbnMgdXNlIGRpZmZlcmVudCAidHlwZXMiIG9mCi0gICAgLy8gPGNvZGU+TG9jYWxTZWxlY3Rpb25UcmFuc2ZlcjwvY29kZT4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FID0gImxvY2FsLXNlbGVjdGlvbi10cmFuc2Zlci1mb3JtYXQiICsgKG5ldyBMb25nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFSUQgPSByZWdpc3RlclR5cGUoVFlQRV9OQU1FKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIgSU5TVEFOQ0UgPSBuZXcgTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcigpOwotCi0gICAgcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICAgIHByaXZhdGUgbG9uZyBzZWxlY3Rpb25TZXRUaW1lOwotCi0gICAgLyoqCi0gICAgICogT25seSB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgbWF5IGJlIHVzZWQuIAotICAgICAqLwotICAgIHByaXZhdGUgTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24uCi0gICAgICogQHJldHVybiBMb2NhbFNlbGVjdGlvblRyYW5zZmVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMb2NhbFNlbGVjdGlvblRyYW5zZmVyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jYWwgdHJhbnNmZXIgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCB0cmFuc2ZlciBkYXRhCi0gICAgICovCi0gICAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotICAgICAgICByZXR1cm4gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgbmF0aXZlIGRyb3AgZGF0YSBtYXRjaGVzIHRoaXMgdHJhbnNmZXIgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzdWx0IHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBuYXRpdmUgZHJvcCBkYXRhIHRvIEphdmEKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hdGl2ZSBkcm9wIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhpcyB0cmFuc2ZlciB0eXBlLgotICAgICAqIAlmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW52YWxpZE5hdGl2ZVR5cGUoT2JqZWN0IHJlc3VsdCkgewotICAgICAgICByZXR1cm4gIShyZXN1bHQgaW5zdGFuY2VvZiBieXRlW10pCi0gICAgICAgICAgICAgICAgfHwgIVRZUEVfTkFNRS5lcXVhbHMobmV3IFN0cmluZygoYnl0ZVtdKSByZXN1bHQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIGlkIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyB0cmFuc2Zlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIGlkIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyB0cmFuc2Zlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7IFRZUEVJRCB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgdHJhbnNmZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyB0cmFuc2Zlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgVFlQRV9OQU1FIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGVzIG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXIjamF2YVRvTmF0aXZlKE9iamVjdCwKLSAgICAgKiBUcmFuc2ZlckRhdGEpLgotICAgICAqIE9ubHkgZW5jb2RlIHRoZSB0cmFuc2ZlciB0eXBlIG5hbWUgc2luY2UgdGhlIHNlbGVjdGlvbiBpcyByZWFkIGFuZAotICAgICAqIHdyaXR0ZW4gaW4gdGhlIHNhbWUgcHJvY2Vzcy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXIjamF2YVRvTmF0aXZlKGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZShPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0gICAgICAgIGJ5dGVbXSBjaGVjayA9IFRZUEVfTkFNRS5nZXRCeXRlcygpOwotICAgICAgICBzdXBlci5qYXZhVG9OYXRpdmUoY2hlY2ssIHRyYW5zZmVyRGF0YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGVzIG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXIjbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSkuCi0gICAgICogVGVzdCBpZiB0aGUgbmF0aXZlIGRyb3AgZGF0YSBtYXRjaGVzIHRoaXMgdHJhbnNmZXIgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXIjbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSBzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKTsKLSAgICAgICAgaWYgKGlzSW52YWxpZE5hdGl2ZVR5cGUocmVzdWx0KSkgewotICAgICAgICAgICAgSUxvZyBsb2cgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpOwotICAgICAgICAgICAgbG9nCi0gICAgICAgICAgICAgICAgICAgIC5sb2cobmV3IFN0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5JREVfV09SS0JFTkNILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyX2Vycm9yTWVzc2FnZSwgbnVsbCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdHJhbnNmZXIgZGF0YSBmb3IgbG9jYWwgdXNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSB0cmFuc2ZlciBkYXRhCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gcykgewotICAgICAgICBzZWxlY3Rpb24gPSBzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRpbWUgd2hlbiB0aGUgc2VsZWN0aW9uIG9wZXJhdGlvbgotICAgICAqIHRoaXMgdHJhbnNmZXIgaXMgYXNzb2NpYXRlZCB3aXRoIHdhcyBzdGFydGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRpbWUgd2hlbiB0aGUgc2VsZWN0aW9uIG9wZXJhdGlvbiBoYXMgc3RhcnRlZAotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UeXBlZEV2ZW50I3RpbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRTZWxlY3Rpb25TZXRUaW1lKCkgewotICAgICAgICByZXR1cm4gc2VsZWN0aW9uU2V0VGltZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aW1lIHdoZW4gdGhlIHNlbGVjdGlvbiBvcGVyYXRpb24gdGhpcwotICAgICAqIHRyYW5zZmVyIGlzIGFzc29jaWF0ZWQgd2l0aCB3YXMgc3RhcnRlZC4KLSAgICAgKiBJZiBhc3NpZ25pbmcgdGhpcyBmcm9tIGFuIFNXVCBldmVudCwgYmUgc3VyZSB0byB1c2UKLSAgICAgKiA8Y29kZT5zZXRTZWxlY3Rpb25UaW1lKGV2ZW50LnRpbWUgJiAweEZGRkYpPC9jb2RlPgotICAgICAqIAotICAgICAqIEBwYXJhbSB0aW1lIHRoZSB0aW1lIHdoZW4gdGhlIHNlbGVjdGlvbiBvcGVyYXRpb24gd2FzIHN0YXJ0ZWQKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHlwZWRFdmVudCN0aW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uU2V0VGltZShsb25nIHRpbWUpIHsKLSAgICAgICAgc2VsZWN0aW9uU2V0VGltZSA9IHRpbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9NYWluQWN0aW9uR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvTWFpbkFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDU3OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9NYWluQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgU2ViYXN0aWFuIERhdmlkcyA8c2Rhdmlkc0BnbXguZGU+IC0gQ29sbGFwc2UgYWxsIGFjdGlvbiAoMjU4MjYpCi0gKiAgICAgU2ViYXN0aWFuIERhdmlkcyA8c2Rhdmlkc0BnbXguZGU+IC0gSW1hZ2VzIGZvciBtZW51IGl0ZW1zICgyNzQ4MSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BZGRCb29rbWFya0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFkZFRhc2tBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5FeHBvcnRSZXNvdXJjZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5JbXBvcnRSZXNvdXJjZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5OZXdXaXphcmRNZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya2luZ1NldEZpbHRlckFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlEaWFsb2dBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERUFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkub3BlcmF0aW9ucy5VbmRvUmVkb0FjdGlvbkdyb3VwOwotCi0vKioKLSAqIFRoZSBtYWluIGFjdGlvbiBncm91cCBmb3IgdGhlIG5hdmlnYXRvci4KLSAqIFRoaXMgY29udGFpbnMgYSBmZXcgYWN0aW9ucyBhbmQgc2V2ZXJhbCBzdWJncm91cHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluQWN0aW9uR3JvdXAgZXh0ZW5kcyBSZXNvdXJjZU5hdmlnYXRvckFjdGlvbkdyb3VwIHsKLQotICAgIHByb3RlY3RlZCBBZGRCb29rbWFya0FjdGlvbiBhZGRCb29rbWFya0FjdGlvbjsKLQotICAgIHByb3RlY3RlZCBBZGRUYXNrQWN0aW9uIGFkZFRhc2tBY3Rpb247Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlEaWFsb2dBY3Rpb24gcHJvcGVydHlEaWFsb2dBY3Rpb247Ci0KLSAgICBwcm90ZWN0ZWQgSW1wb3J0UmVzb3VyY2VzQWN0aW9uIGltcG9ydEFjdGlvbjsKLSAgICAKLSAgICBwcm90ZWN0ZWQgRXhwb3J0UmVzb3VyY2VzQWN0aW9uIGV4cG9ydEFjdGlvbjsKLQotICAgIHByb3RlY3RlZCBDb2xsYXBzZUFsbEFjdGlvbiBjb2xsYXBzZUFsbEFjdGlvbjsKLQotICAgIHByb3RlY3RlZCBUb2dnbGVMaW5raW5nQWN0aW9uIHRvZ2dsZUxpbmtpbmdBY3Rpb247Ci0KLSAgICBwcm90ZWN0ZWQgR290b0FjdGlvbkdyb3VwIGdvdG9Hcm91cDsKLQotICAgIHByb3RlY3RlZCBPcGVuQWN0aW9uR3JvdXAgb3Blbkdyb3VwOwotCi0gICAgcHJvdGVjdGVkIFJlZmFjdG9yQWN0aW9uR3JvdXAgcmVmYWN0b3JHcm91cDsKLQotICAgIHByb3RlY3RlZCBXb3JraW5nU2V0RmlsdGVyQWN0aW9uR3JvdXAgd29ya2luZ1NldEdyb3VwOwotCi0gICAgcHJvdGVjdGVkIFNvcnRBbmRGaWx0ZXJBY3Rpb25Hcm91cCBzb3J0QW5kRmlsdGVyR3JvdXA7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFVuZG9SZWRvQWN0aW9uR3JvdXAgdW5kb1JlZG9Hcm91cDsKLQotICAgIHByb3RlY3RlZCBXb3Jrc3BhY2VBY3Rpb25Hcm91cCB3b3Jrc3BhY2VHcm91cDsKLQotICAgIHByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgTmV3V2l6YXJkTWVudSBuZXdXaXphcmRNZW51OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyB0aGUgbWFpbiBhY3Rpb24gZ3JvdXAuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hdmlnYXRvciB0aGUgbmF2aWdhdG9yIHZpZXcKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFpbkFjdGlvbkdyb3VwKElSZXNvdXJjZU5hdmlnYXRvciBuYXZpZ2F0b3IpIHsKLSAgICAgICAgc3VwZXIobmF2aWdhdG9yKTsKLSAgICAgICAgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGhhbmRsZVJlc291cmNlQ2hhbmdlZChldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLSAgICAgICAgbWFrZVN1Ykdyb3VwcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYSByZXNvdXJjZSBjaGFuZ2VkIGV2ZW50IGJ5IHVwZGF0aW5nIHRoZSBlbmFibGVtZW50Ci0gICAgICogaWYgb25lIG9mIHRoZSBzZWxlY3RlZCBwcm9qZWN0cyBpcyBvcGVuZWQgb3IgY2xvc2VkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICBBY3Rpb25Db250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29udGV4dAotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKFJlc291cmNlU2VsZWN0aW9uVXRpbC5hbGxSZXNvdXJjZXNBcmVPZlR5cGUoc2VsZWN0aW9uLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZS5QUk9KRUNUKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIExpc3Qgc2VsID0gc2VsZWN0aW9uLnRvTGlzdCgpOwotICAgICAgICBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0gICAgICAgIGlmIChkZWx0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgSVJlc291cmNlRGVsdGFbXSBwcm9qRGVsdGFzID0gZGVsdGEKLSAgICAgICAgICAgICAgICAuZ2V0QWZmZWN0ZWRDaGlsZHJlbihJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qRGVsdGFzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2VEZWx0YSBwcm9qRGVsdGEgPSBwcm9qRGVsdGFzW2ldOwotICAgICAgICAgICAgaWYgKChwcm9qRGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsLmNvbnRhaW5zKHByb2pEZWx0YS5nZXRSZXNvdXJjZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBnZXROYXZpZ2F0b3IoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUYXNrQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG9Hcm91cC51cGRhdGVBY3Rpb25CYXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZhY3Rvckdyb3VwLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzcGFjZUdyb3VwLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2VzIHRoZSBhY3Rpb25zIGNvbnRhaW5lZCBkaXJlY3RseSBpbiB0aGlzIGFjdGlvbiBncm91cC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucygpIHsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBuYXZpZ2F0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0KLSAgICAgICAgbmV3V2l6YXJkTWVudSA9IG5ldyBOZXdXaXphcmRNZW51KG5hdmlnYXRvci5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkpOwotICAgICAgICBhZGRCb29rbWFya0FjdGlvbiA9IG5ldyBBZGRCb29rbWFya0FjdGlvbihzaGVsbCk7Ci0gICAgICAgIGFkZFRhc2tBY3Rpb24gPSBuZXcgQWRkVGFza0FjdGlvbihzaGVsbCk7Ci0gICAgICAgIHByb3BlcnR5RGlhbG9nQWN0aW9uID0gbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKHNoZWxsLCBuYXZpZ2F0b3IKLSAgICAgICAgICAgICAgICAuZ2V0Vmlld2VyKCkpOwotCi0gICAgICAgIGltcG9ydEFjdGlvbiA9IG5ldyBJbXBvcnRSZXNvdXJjZXNBY3Rpb24obmF2aWdhdG9yLmdldFNpdGUoKQotICAgICAgICAgICAgICAgIC5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0gICAgICAgIGltcG9ydEFjdGlvbgotICAgICAgICAgICAgICAgIC5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihnZXRJbWFnZURlc2NyaXB0b3IoImR0b29sMTYvaW1wb3J0X3dpei5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1wb3J0QWN0aW9uCi0gICAgICAgICAgICAgICAgLnNldEltYWdlRGVzY3JpcHRvcihnZXRJbWFnZURlc2NyaXB0b3IoImV0b29sMTYvaW1wb3J0X3dpei5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCi0gICAgICAgIGV4cG9ydEFjdGlvbiA9IG5ldyBFeHBvcnRSZXNvdXJjZXNBY3Rpb24obmF2aWdhdG9yLmdldFNpdGUoKQotICAgICAgICAgICAgICAgIC5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0gICAgICAgIGV4cG9ydEFjdGlvbgotICAgICAgICAgICAgICAgIC5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihnZXRJbWFnZURlc2NyaXB0b3IoImR0b29sMTYvZXhwb3J0X3dpei5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZXhwb3J0QWN0aW9uCi0gICAgICAgICAgICAgICAgLnNldEltYWdlRGVzY3JpcHRvcihnZXRJbWFnZURlc2NyaXB0b3IoImV0b29sMTYvZXhwb3J0X3dpei5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGNvbGxhcHNlQWxsQWN0aW9uID0gbmV3IENvbGxhcHNlQWxsQWN0aW9uKG5hdmlnYXRvciwKLSAgICAgICAgICAgICAgICBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLkNvbGxhcHNlQWxsQWN0aW9uX3RpdGxlKTsKLSAgICAgICAgY29sbGFwc2VBbGxBY3Rpb24uc2V0VG9vbFRpcFRleHQoUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Db2xsYXBzZUFsbEFjdGlvbl90b29sVGlwKTsKLSAgICAgICAgY29sbGFwc2VBbGxBY3Rpb24KLSAgICAgICAgICAgICAgICAuc2V0SW1hZ2VEZXNjcmlwdG9yKGdldEltYWdlRGVzY3JpcHRvcigiZWxjbDE2L2NvbGxhcHNlYWxsLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHRvZ2dsZUxpbmtpbmdBY3Rpb24gPSBuZXcgVG9nZ2xlTGlua2luZ0FjdGlvbihuYXZpZ2F0b3IsCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Ub2dnbGVMaW5raW5nQWN0aW9uX3RleHQpOwotICAgICAgICB0b2dnbGVMaW5raW5nQWN0aW9uLnNldFRvb2xUaXBUZXh0KFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuVG9nZ2xlTGlua2luZ0FjdGlvbl90b29sVGlwKTsKLSAgICAgICAgdG9nZ2xlTGlua2luZ0FjdGlvbgotICAgICAgICAgICAgICAgIC5zZXRJbWFnZURlc2NyaXB0b3IoZ2V0SW1hZ2VEZXNjcmlwdG9yKCJlbGNsMTYvc3luY2VkLmdpZiIpKTsvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZXMgdGhlIHN1YiBhY3Rpb24gZ3JvdXBzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG1ha2VTdWJHcm91cHMoKSB7Ci0gICAgICAgIGdvdG9Hcm91cCA9IG5ldyBHb3RvQWN0aW9uR3JvdXAobmF2aWdhdG9yKTsKLSAgICAgICAgb3Blbkdyb3VwID0gbmV3IE9wZW5BY3Rpb25Hcm91cChuYXZpZ2F0b3IpOwotICAgICAgICByZWZhY3Rvckdyb3VwID0gbmV3IFJlZmFjdG9yQWN0aW9uR3JvdXAobmF2aWdhdG9yKTsKLSAgICAgICAgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgd29ya2luZ1NldFVwZGF0ZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQotICAgICAgICAgICAgICAgIGlmIChXb3JraW5nU2V0RmlsdGVyQWN0aW9uR3JvdXAuQ0hBTkdFX1dPUktJTkdfU0VUCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHByb3BlcnR5KSkgewotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VOYXZpZ2F0b3IgbmF2aWdhdG9yID0gZ2V0TmF2aWdhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgSVdvcmtpbmdTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5zZXRXb3JraW5nU2V0KChJV29ya2luZ1NldCkgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5zZXRXb3JraW5nU2V0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBUcmVlVmlld2VyIHRyZWVWaWV3ID0gbmF2aWdhdG9yLmdldFZpZXdlcigpOwotICAgICAgICBTaGVsbCBzaGVsbCA9IHRyZWVWaWV3LmdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotICAgICAgICB3b3JraW5nU2V0R3JvdXAgPSBuZXcgV29ya2luZ1NldEZpbHRlckFjdGlvbkdyb3VwKHNoZWxsLAotICAgICAgICAgICAgICAgIHdvcmtpbmdTZXRVcGRhdGVyKTsKLSAgICAgICAgd29ya2luZ1NldEdyb3VwLnNldFdvcmtpbmdTZXQobmF2aWdhdG9yLmdldFdvcmtpbmdTZXQoKSk7Ci0gICAgICAgIHNvcnRBbmRGaWx0ZXJHcm91cCA9IG5ldyBTb3J0QW5kRmlsdGVyQWN0aW9uR3JvdXAobmF2aWdhdG9yKTsKLSAgICAgICAgd29ya3NwYWNlR3JvdXAgPSBuZXcgV29ya3NwYWNlQWN0aW9uR3JvdXAobmF2aWdhdG9yKTsKLSAgICAgICAgSVVuZG9Db250ZXh0IHdvcmtzcGFjZUNvbnRleHQ9IChJVW5kb0NvbnRleHQpUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldEFkYXB0ZXIoSVVuZG9Db250ZXh0LmNsYXNzKTsKLQkJdW5kb1JlZG9Hcm91cD0gbmV3IFVuZG9SZWRvQWN0aW9uR3JvdXAoZ2V0TmF2aWdhdG9yKCkuZ2V0U2l0ZSgpLCB3b3Jrc3BhY2VDb250ZXh0LCB0cnVlKTsKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBFeHRlbmRzIHRoZSBzdXBlcmNsYXNzIGltcGxlbWVudGF0aW9uIHRvIHNldCB0aGUgY29udGV4dCBpbiB0aGUgc3ViZ3JvdXBzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoQWN0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyLnNldENvbnRleHQoY29udGV4dCk7Ci0gICAgICAgIGdvdG9Hcm91cC5zZXRDb250ZXh0KGNvbnRleHQpOwotICAgICAgICBvcGVuR3JvdXAuc2V0Q29udGV4dChjb250ZXh0KTsKLSAgICAgICAgcmVmYWN0b3JHcm91cC5zZXRDb250ZXh0KGNvbnRleHQpOwotICAgICAgICBzb3J0QW5kRmlsdGVyR3JvdXAuc2V0Q29udGV4dChjb250ZXh0KTsKLSAgICAgICAgd29ya3NwYWNlR3JvdXAuc2V0Q29udGV4dChjb250ZXh0KTsKLSAgICAgICAgdW5kb1JlZG9Hcm91cC5zZXRDb250ZXh0KGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGxzIHRoZSBjb250ZXh0IG1lbnUgd2l0aCB0aGUgYWN0aW9ucyBjb250YWluZWQgaW4gdGhpcyBncm91cAotICAgICAqIGFuZCBpdHMgc3ViZ3JvdXBzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZW51IHRoZSBjb250ZXh0IG1lbnUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgTWVudU1hbmFnZXIgbmV3TWVudSA9IG5ldyBNZW51TWFuYWdlcihSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLlJlc291cmNlTmF2aWdhdG9yX25ldyk7Ci0gICAgICAgIG1lbnUuYWRkKG5ld01lbnUpOwotICAgICAgICBuZXdNZW51LmFkZChuZXdXaXphcmRNZW51KTsKLQotICAgICAgICBnb3RvR3JvdXAuZmlsbENvbnRleHRNZW51KG1lbnUpOwotICAgICAgICBvcGVuR3JvdXAuZmlsbENvbnRleHRNZW51KG1lbnUpOwotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgICAgIHJlZmFjdG9yR3JvdXAuZmlsbENvbnRleHRNZW51KG1lbnUpOwotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgICAgIG1lbnUuYWRkKGltcG9ydEFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKGV4cG9ydEFjdGlvbik7Ci0gICAgICAgIGltcG9ydEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0gICAgICAgIGV4cG9ydEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLSAgICAgICAgd29ya3NwYWNlR3JvdXAuZmlsbENvbnRleHRNZW51KG1lbnUpOwotCi0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLSAgICAgICAgbWVudQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUwotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgIHByb3BlcnR5RGlhbG9nQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIG1lbnUuYWRkKHByb3BlcnR5RGlhbG9nQWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGFjdGlvbnMgaW4gdGhpcyBncm91cCBhbmQgaXRzIHN1Ymdyb3VwcyB0byB0aGUgYWN0aW9uIGJhcnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QUk9QRVJUSUVTLmdldElkKCksCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEaWFsb2dBY3Rpb24pOwotICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSURFQWN0aW9uRmFjdG9yeS5CT09LTUFSSy5nZXRJZCgpLAotICAgICAgICAgICAgICAgIGFkZEJvb2ttYXJrQWN0aW9uKTsKLSAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElERUFjdGlvbkZhY3RvcnkuQUREX1RBU0suZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICBhZGRUYXNrQWN0aW9uKTsKLQotICAgICAgICBnb3RvR3JvdXAuZmlsbEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0gICAgICAgIG9wZW5Hcm91cC5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLSAgICAgICAgcmVmYWN0b3JHcm91cC5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLSAgICAgICAgd29ya2luZ1NldEdyb3VwLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotICAgICAgICBzb3J0QW5kRmlsdGVyR3JvdXAuZmlsbEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0gICAgICAgIHdvcmtzcGFjZUdyb3VwLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotICAgICAgICB1bmRvUmVkb0dyb3VwLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotCi0gICAgICAgIElNZW51TWFuYWdlciBtZW51ID0gYWN0aW9uQmFycy5nZXRNZW51TWFuYWdlcigpOwotICAgICAgICBtZW51LmFkZCh0b2dnbGVMaW5raW5nQWN0aW9uKTsKLQotICAgICAgICBJVG9vbEJhck1hbmFnZXIgdG9vbEJhciA9IGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLSAgICAgICAgdG9vbEJhci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgdG9vbEJhci5hZGQoY29sbGFwc2VBbGxBY3Rpb24pOwotICAgICAgICB0b29sQmFyLmFkZCh0b2dnbGVMaW5raW5nQWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBhY3Rpb25zIHdoaWNoIHdlcmUgYWRkZWQgdG8gdGhlIGFjdGlvbiBiYXJzLAotICAgICAqIGRlbGVnYXRpbmcgdG8gdGhlIHN1Ymdyb3VwcyBhcyBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQWN0aW9uQmFycygpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIHByb3BlcnR5RGlhbG9nQWN0aW9uLnNldEVuYWJsZWQoc2VsZWN0aW9uLnNpemUoKSA9PSAxKTsKLSAgICAgICAgYWRkQm9va21hcmtBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotICAgICAgICBhZGRUYXNrQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQotICAgICAgICBnb3RvR3JvdXAudXBkYXRlQWN0aW9uQmFycygpOwotICAgICAgICBvcGVuR3JvdXAudXBkYXRlQWN0aW9uQmFycygpOwotICAgICAgICByZWZhY3Rvckdyb3VwLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICAgICAgd29ya2luZ1NldEdyb3VwLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICAgICAgc29ydEFuZEZpbHRlckdyb3VwLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICAgICAgd29ya3NwYWNlR3JvdXAudXBkYXRlQWN0aW9uQmFycygpOwotICAgICAgICB1bmRvUmVkb0dyb3VwLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIHRoZSBkZWZhdWx0IGFjdGlvbiAob3BlbiBmaWxlKSBieSBkZWxlZ2F0aW5nIHRoZSBvcGVuIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bkRlZmF1bHRBY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIG9wZW5Hcm91cC5ydW5EZWZhdWx0QWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIGtleSBwcmVzc2VkIGV2ZW50IGJ5IGludm9raW5nIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24sCi0gICAgICogZGVsZWdhdGluZyB0byB0aGUgc3ViZ3JvdXBzIGFzIG5lY2Vzc2FyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVLZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHJlZmFjdG9yR3JvdXAuaGFuZGxlS2V5UHJlc3NlZChldmVudCk7Ci0gICAgICAgIHdvcmtzcGFjZUdyb3VwLmhhbmRsZUtleVByZXNzZWQoZXZlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dGVuZHMgdGhlIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24gdG8gZGlzcG9zZSB0aGUgCi0gICAgICogYWN0aW9ucyBpbiB0aGlzIGdyb3VwIGFuZCBpdHMgc3ViZ3JvdXBzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCi0gICAgICAgIG5ld1dpemFyZE1lbnUuZGlzcG9zZSgpOwotICAgICAgICBjb2xsYXBzZUFsbEFjdGlvbi5kaXNwb3NlKCk7Ci0gICAgICAgIGltcG9ydEFjdGlvbi5kaXNwb3NlKCk7Ci0gICAgICAgIGV4cG9ydEFjdGlvbi5kaXNwb3NlKCk7Ci0gICAgICAgIHByb3BlcnR5RGlhbG9nQWN0aW9uLmRpc3Bvc2UoKTsKLSAgICAgICAgdG9nZ2xlTGlua2luZ0FjdGlvbi5kaXNwb3NlKCk7Ci0KLSAgICAgICAgZ290b0dyb3VwLmRpc3Bvc2UoKTsKLSAgICAgICAgb3Blbkdyb3VwLmRpc3Bvc2UoKTsKLSAgICAgICAgcmVmYWN0b3JHcm91cC5kaXNwb3NlKCk7Ci0gICAgICAgIHNvcnRBbmRGaWx0ZXJHcm91cC5kaXNwb3NlKCk7Ci0gICAgICAgIHdvcmtpbmdTZXRHcm91cC5kaXNwb3NlKCk7Ci0gICAgICAgIHdvcmtzcGFjZUdyb3VwLmRpc3Bvc2UoKTsKLSAgICAgICAgdW5kb1JlZG9Hcm91cC5kaXNwb3NlKCk7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL05hdmlnYXRvckRyYWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL05hdmlnYXRvckRyYWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZGFhZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9OYXZpZ2F0b3JEcmFnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuUmVhZE9ubHlTdGF0ZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotCi0vKioKLSAqIEltcGxlbWVudHMgZHJhZyBiZWhhdmlvdXIgd2hlbiBpdGVtcyBhcmUgZHJhZ2dlZCBvdXQgb2YgdGhlCi0gKiByZXNvdXJjZSBuYXZpZ2F0b3IuCi0gKiAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE5hdmlnYXRvckRyYWdBZGFwdGVyIGV4dGVuZHMgRHJhZ1NvdXJjZUFkYXB0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19NT1ZFX1RJVExFID0gUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5EcmFnQWRhcHRlcl90aXRsZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19ERUxFVEVfTUVTU0FHRSA9IFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuRHJhZ0FkYXB0ZXJfY2hlY2tEZWxldGVNZXNzYWdlOwotCi0gICAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBUcmFuc2ZlckRhdGEgbGFzdERhdGFUeXBlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBkcmFnIGFkYXB0ZXIuCi0gICAgICovCi0gICAgcHVibGljIE5hdmlnYXRvckRyYWdBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotICAgICAgICBzZWxlY3Rpb25Qcm92aWRlciA9IHByb3ZpZGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBEcmFnU291cmNlTGlzdGVuZXIjZHJhZ0ZpbmlzaGVkKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLnNldFNlbGVjdGlvbihudWxsKTsKLQotICAgICAgICBpZiAoZXZlbnQuZG9pdCA9PSBmYWxzZSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBmaW5hbCBpbnQgdHlwZU1hc2sgPSBJUmVzb3VyY2UuRk9MREVSIHwgSVJlc291cmNlLkZJTEU7Ci0gICAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkgewotICAgICAgICAgICAgLy9uZXZlciBkZWxldGUgcmVzb3VyY2VzIHdoZW4gZHJhZ2dpbmcgb3V0c2lkZSBFY2xpcHNlLiAKLSAgICAgICAgICAgIC8vd29ya2Fyb3VuZCBmb3IgYnVnIDMwNTQzLgotICAgICAgICAgICAgaWYgKGxhc3REYXRhVHlwZSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShsYXN0RGF0YVR5cGUpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgSVJlc291cmNlW10gcmVzb3VyY2VzID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXModHlwZU1hc2spOwotICAgICAgICAgICAgRHJhZ1NvdXJjZSBkcmFnU291cmNlID0gKERyYWdTb3VyY2UpIGV2ZW50LndpZGdldDsKLSAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCA9IGRyYWdTb3VyY2UuZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBjb250cm9sLmdldFNoZWxsKCk7Ci0gICAgICAgICAgICBSZWFkT25seVN0YXRlQ2hlY2tlciBjaGVja2VyOwotCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgY2hlY2tlciA9IG5ldyBSZWFkT25seVN0YXRlQ2hlY2tlcihzaGVsbCwgQ0hFQ0tfTU9WRV9USVRMRSwKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfREVMRVRFX01FU1NBR0UpOwotICAgICAgICAgICAgcmVzb3VyY2VzID0gY2hlY2tlci5jaGVja1JlYWRPbmx5UmVzb3VyY2VzKHJlc291cmNlcyk7Ci0gICAgICAgICAgICAvL2RlbGV0ZSB0aGUgb2xkIGVsZW1lbnRzCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlc1tpXS5kZWxldGUoSVJlc291cmNlLktFRVBfSElTVE9SWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSVJlc291cmNlLkZPUkNFLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX1RBUkdFVF9NT1ZFKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlcyh0eXBlTWFzayk7Ci0KLSAgICAgICAgICAgIC8vIGZpbGUgbW92ZWQgZm9yIHVzIGJ5IE9TLCBubyBuZWVkIHRvIGRlbGV0ZSB0aGUgcmVzb3VyY2VzLCBqdXN0Ci0gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHZpZXcKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlc1tpXS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgRHJhZ1NvdXJjZUxpc3RlbmVyI2RyYWdTZXREYXRhKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotICAgICAgICBmaW5hbCBpbnQgdHlwZU1hc2sgPSBJUmVzb3VyY2UuRklMRSB8IElSZXNvdXJjZS5GT0xERVI7Ci0gICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKHR5cGVNYXNrKTsKLQotICAgICAgICBpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGxhc3REYXRhVHlwZSA9IGV2ZW50LmRhdGFUeXBlOwotICAgICAgICAvL3VzZSBsb2NhbCBzZWxlY3Rpb24gdHJhbnNmZXIgaWYgcG9zc2libGUKLSAgICAgICAgaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgIC5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0gICAgICAgICAgICBldmVudC5kYXRhID0gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vdXNlIHJlc291cmNlIHRyYW5zZmVyIGlmIHBvc3NpYmxlCi0gICAgICAgIGlmIChSZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotICAgICAgICAgICAgZXZlbnQuZGF0YSA9IHJlc291cmNlczsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvL3Jlc29ydCB0byBhIGZpbGUgdHJhbnNmZXIKLSAgICAgICAgaWYgKCFGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIEdldCB0aGUgcGF0aCBvZiBlYWNoIGZpbGUgYW5kIHNldCBhcyB0aGUgZHJhZyBkYXRhCi0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSByZXNvdXJjZXMubGVuZ3RoOwotICAgICAgICBpbnQgYWN0dWFsTGVuZ3RoID0gMDsKLSAgICAgICAgU3RyaW5nW10gZmlsZU5hbWVzID0gbmV3IFN0cmluZ1tsZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJUGF0aCBsb2NhdGlvbiA9IHJlc291cmNlc1tpXS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgLy8gbG9jYXRpb24gbWF5IGJlIG51bGwuIFNlZSBidWcgMjk0OTEuCi0gICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBmaWxlTmFtZXNbYWN0dWFsTGVuZ3RoKytdID0gbG9jYXRpb24udG9PU1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhY3R1YWxMZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgLy8gd2FzIG9uZSBvciBtb3JlIG9mIHRoZSBsb2NhdGlvbnMgbnVsbD8KLSAgICAgICAgaWYgKGFjdHVhbExlbmd0aCA8IGxlbmd0aCkgewotICAgICAgICAgICAgU3RyaW5nW10gdGVtcEZpbGVOYW1lcyA9IGZpbGVOYW1lczsKLSAgICAgICAgICAgIGZpbGVOYW1lcyA9IG5ldyBTdHJpbmdbYWN0dWFsTGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgZmlsZU5hbWVzW2ldID0gdGVtcEZpbGVOYW1lc1tpXTsKLSAgICAgICAgfQotICAgICAgICBldmVudC5kYXRhID0gZmlsZU5hbWVzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBEcmFnU291cmNlTGlzdGVuZXIjZHJhZ1N0YXJ0KG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgbGFzdERhdGFUeXBlID0gbnVsbDsKLSAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgMUdFVVM5VgotICAgICAgICBEcmFnU291cmNlIGRyYWdTb3VyY2UgPSAoRHJhZ1NvdXJjZSkgZXZlbnQud2lkZ2V0OwotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBkcmFnU291cmNlLmdldENvbnRyb2woKTsKLSAgICAgICAgaWYgKGNvbnRyb2wgIT0gY29udHJvbC5nZXREaXNwbGF5KCkuZ2V0Rm9jdXNDb250cm9sKCkpIHsKLSAgICAgICAgICAgIGV2ZW50LmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBuZXh0ID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIShuZXh0IGluc3RhbmNlb2YgSUZpbGUgfHwgbmV4dCBpbnN0YW5jZW9mIElGb2xkZXIpKSB7Ci0gICAgICAgICAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICAgICAgZXZlbnQuZG9pdCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VbXSBnZXRTZWxlY3RlZFJlc291cmNlcyhpbnQgcmVzb3VyY2VUeXBlcykgewotICAgICAgICBMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSVJlc291cmNlW10gcmVzdWx0ID0gbmV3IElSZXNvdXJjZVswXTsKLQotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICBpZiAoc3RydWN0dXJlZFNlbGVjdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGxpc3QgYW5kIGxvb2sgZm9yIG1hdGNoaW5nIGl0ZW1zCi0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdHIubmV4dCgpOwotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKSBvYmo7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXMuZ2V0VHlwZSgpICYgcmVzb3VyY2VUeXBlcykgPT0gcmVzLmdldFR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuYWRkKHJlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBJUmVzb3VyY2VbcmVzb3VyY2VzLnNpemUoKV07Ci0gICAgICAgIHJlc291cmNlcy50b0FycmF5KHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTU2ZDlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLk1vdmVGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZWFkT25seVN0YXRlQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBsdWdpbkRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUmVzb3VyY2VUcmFuc2ZlcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIGRyb3AgYmVoYXZpb3VyIGZvciBkcmFnIGFuZCBkcm9wIG9wZXJhdGlvbnMKLSAqIHRoYXQgbGFuZCBvbiB0aGUgcmVzb3VyY2UgbmF2aWdhdG9yLgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0b3JEcm9wQWRhcHRlciBleHRlbmRzIFBsdWdpbkRyb3BBZGFwdGVyIGltcGxlbWVudHMKLSAgICAgICAgSU92ZXJ3cml0ZVF1ZXJ5IHsKLQotICAgIC8qKgotICAgICAqIEEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgb3ZlcndyaXRlcyBzaG91bGQgYWx3YXlzIG9jY3VyLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBhbHdheXNPdmVyd3JpdGUgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBsYXN0IHZhbGlkIG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBsYXN0VmFsaWRPcGVyYXRpb24gPSBETkQuRFJPUF9OT05FOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBkcm9wIGFkYXB0ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZpZXdlciB0aGUgbmF2aWdhdG9yJ3Mgdmlld2VyCi0gICAgICovCi0gICAgcHVibGljIE5hdmlnYXRvckRyb3BBZGFwdGVyKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0gICAgICAgIHN1cGVyKHZpZXdlcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyI2RyYWdFbnRlcihvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKQotICAgICAgICAgICAgICAgICYmIGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGNvcHkgd2hlbiBkcmFnZ2luZyBmcm9tIG91dHNpZGUgRWNsaXBzZS4gRml4ZXMgYnVnIDE2MzA4LgotICAgICAgICAgICAgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5kcmFnRW50ZXIoZXZlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gZXJyb3Igc3RhdHVzIHdpdGggdGhlIGdpdmVuIGluZm8uCi0gICAgICovCi0gICAgcHJpdmF0ZSBJU3RhdHVzIGVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHJldHVybiBlcnJvcihtZXNzYWdlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVycm9yIHN0YXR1cyB3aXRoIHRoZSBnaXZlbiBpbmZvLgotICAgICAqLwotICAgIHByaXZhdGUgSVN0YXR1cyBlcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQbGF0Zm9ybVVJLlBMVUdJTl9JRCwgMCwgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICBleGNlcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjdHVhbCB0YXJnZXQgb2YgdGhlIGRyb3AsIGdpdmVuIHRoZSByZXNvdXJjZQotICAgICAqIHVuZGVyIHRoZSBtb3VzZS4gIElmIHRoZSBtb3VzZSB0YXJnZXQgaXMgYSBmaWxlLCB0aGVuIHRoZSBkcm9wIGFjdHVhbGx5IAotICAgICAqIG9jY3VycyBpbiBpdHMgcGFyZW50LiAgSWYgdGhlIGRyb3AgbG9jYXRpb24gaXMgYmVmb3JlIG9yIGFmdGVyIHRoZQotICAgICAqIG1vdXNlIHRhcmdldCBhbmQgZmVlZGJhY2sgaXMgZW5hYmxlZCwgdGhlIHRhcmdldCBpcyBhbHNvIHRoZSBwYXJlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJQ29udGFpbmVyIGdldEFjdHVhbFRhcmdldChJUmVzb3VyY2UgbW91c2VUYXJnZXQpIHsKLSAgICAgICAgLyogaWYgY3Vyc29yIGlzIGJlZm9yZSBvciBhZnRlciBtb3VzZVRhcmdldCwgc2V0IHRhcmdldCB0byBwYXJlbnQgKi8KLSAgICAgICAgaWYgKGdldEZlZWRiYWNrRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q3VycmVudExvY2F0aW9uKCkgPT0gTE9DQVRJT05fQkVGT1JFCi0gICAgICAgICAgICAgICAgICAgIHx8IGdldEN1cnJlbnRMb2NhdGlvbigpID09IExPQ0FUSU9OX0FGVEVSKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1vdXNlVGFyZ2V0LmdldFBhcmVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIGlmIGN1cnNvciBpcyBvbiBhIGZpbGUsIHJldHVybiB0aGUgcGFyZW50ICovCi0gICAgICAgIGlmIChtb3VzZVRhcmdldC5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLSAgICAgICAgICAgIHJldHVybiBtb3VzZVRhcmdldC5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICAvKiBvdGhlcndpc2UgdGhlIG1vdXNlVGFyZ2V0IGlzIHRoZSByZWFsIHRhcmdldCAqLwotICAgICAgICByZXR1cm4gKElDb250YWluZXIpIG1vdXNlVGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRpc3BsYXkKLSAgICAgKi8KLSAgICBwcml2YXRlIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZpZXdlcigpLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugc2VsZWN0aW9uIGZyb20gdGhlIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVzb3VyY2Ugc2VsZWN0aW9uIGZyb20gdGhlIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIElSZXNvdXJjZVtdIGdldFNlbGVjdGVkUmVzb3VyY2VzKCkgewotICAgICAgICBBcnJheUxpc3Qgc2VsZWN0ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc3NlbC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUmVzb3VyY2VzLmFkZChvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgSUFkYXB0YWJsZSBhID0gKElBZGFwdGFibGUpIG87Ci0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSByID0gKElSZXNvdXJjZSkgYS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUmVzb3VyY2VzLmFkZChyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKElSZXNvdXJjZVtdKSBzZWxlY3RlZFJlc291cmNlcy50b0FycmF5KG5ldyBJUmVzb3VyY2Vbc2VsZWN0ZWRSZXNvdXJjZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hlbGwKLSAgICAgKi8KLSAgICBwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBlcnJvciBzdGF0dXMgd2l0aCB0aGUgZ2l2ZW4gaW5mby4KLSAgICAgKi8KLSAgICBwcml2YXRlIElTdGF0dXMgaW5mbyhTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFBsYXRmb3JtVUkuUExVR0lOX0lELCAwLCBtZXNzYWdlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiBzdGF0dXMgdG8gdGhlIGxpc3Qgb2YgcHJvYmxlbXMuICBEaXNjYXJkcwotICAgICAqIE9LIHN0YXR1c2VzLiAgSWYgdGhlIHN0YXR1cyBpcyBhIG11bHRpLXN0YXR1cywgb25seSBpdHMgY2hpbGRyZW4KLSAgICAgKiBhcmUgYWRkZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1lcmdlU3RhdHVzKE11bHRpU3RhdHVzIHN0YXR1cywgSVN0YXR1cyB0b01lcmdlKSB7Ci0gICAgICAgIGlmICghdG9NZXJnZS5pc09LKCkpIHsKLSAgICAgICAgICAgIHN0YXR1cy5tZXJnZSh0b01lcmdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gc3RhdHVzIGluZGljYXRpbmcgc3VjY2Vzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIElTdGF0dXMgb2soKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBsYXRmb3JtVUkuUExVR0lOX0lELCAwLAotICAgICAgICAgICAgICAgIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuRHJvcEFkYXB0ZXJfb2ssIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIGFuIGVycm9yIGRpYWxvZyBpZiBuZWNlc3NhcnkuICBUYWtlcyBjYXJlIG9mCi0gICAgICogY29tcGxleCBydWxlcyBuZWNlc3NhcnkgZm9yIG1ha2luZyB0aGUgZXJyb3IgZGlhbG9nIGxvb2sgbmljZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb3BlbkVycm9yKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTdHJpbmcgZ2VuZXJpY1RpdGxlID0gUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Ecm9wQWRhcHRlcl90aXRsZTsKLSAgICAgICAgaW50IGNvZGVzID0gSVN0YXR1cy5FUlJPUiB8IElTdGF0dXMuV0FSTklORzsKLQotICAgICAgICAvL3NpbXBsZSBjYXNlOiBvbmUgZXJyb3IsIG5vdCBhIG11bHRpc3RhdHVzCi0gICAgICAgIGlmICghc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotICAgICAgICAgICAgRXJyb3JEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBnZW5lcmljVGl0bGUsIG51bGwsIHN0YXR1cywgY29kZXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9vbmUgZXJyb3IsIHNpbmdsZSBjaGlsZCBvZiBtdWx0aXN0YXR1cwotICAgICAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5bMF0sIGNvZGVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvL3NldmVyYWwgcHJvYmxlbXMKLSAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIGdlbmVyaWNUaXRsZSwgbnVsbCwgc3RhdHVzLCBjb2Rlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSB0aGUgZHJvcC4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyI2Ryb3Aob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybURyb3AoZmluYWwgT2JqZWN0IGRhdGEpIHsKLSAgICAgICAgYWx3YXlzT3ZlcndyaXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChnZXRDdXJyZW50VGFyZ2V0KCkgPT0gbnVsbCB8fCBkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0gICAgICAgIFRyYW5zZmVyRGF0YSBjdXJyZW50VHJhbnNmZXIgPSBnZXRDdXJyZW50VHJhbnNmZXIoKTsKLSAgICAgICAgaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoCi0gICAgICAgICAgICAgICAgY3VycmVudFRyYW5zZmVyKSkgewotICAgICAgICAgICAgcmVzb3VyY2VzID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLSAgICAgICAgfSBlbHNlIGlmIChSZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKAotICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFuc2ZlcikpIHsKLSAgICAgICAgICAgIHJlc291cmNlcyA9IChJUmVzb3VyY2VbXSkgZGF0YTsKLSAgICAgICAgfSBlbHNlIGlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoY3VycmVudFRyYW5zZmVyKSkgewotICAgICAgICAgICAgc3RhdHVzID0gcGVyZm9ybUZpbGVEcm9wKGRhdGEpOwotICAgICAgICAgICAgcmVzdWx0ID0gc3RhdHVzLmlzT0soKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IE5hdmlnYXRvckRyb3BBZGFwdGVyLnN1cGVyLnBlcmZvcm1Ecm9wKGRhdGEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCAmJiByZXNvdXJjZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRPcGVyYXRpb24oKSA9PSBETkQuRFJPUF9DT1BZKQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBlcmZvcm1SZXNvdXJjZUNvcHkoZ2V0U2hlbGwoKSwgcmVzb3VyY2VzKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBwZXJmb3JtUmVzb3VyY2VNb3ZlKHJlc291cmNlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgb3BlbkVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSBkcm9wIHVzaW5nIHRoZSBGaWxlVHJhbnNmZXIgdHJhbnNmZXIgdHlwZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElTdGF0dXMgcGVyZm9ybUZpbGVEcm9wKE9iamVjdCBkYXRhKSB7Ci0gICAgICAgIE11bHRpU3RhdHVzIHByb2JsZW1zID0gbmV3IE11bHRpU3RhdHVzKFBsYXRmb3JtVUkuUExVR0lOX0lELCAwLAotICAgICAgICAgICAgICAgIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuRHJvcEFkYXB0ZXJfcHJvYmxlbUltcG9ydGluZywgbnVsbCk7Ci0gICAgICAgIG1lcmdlU3RhdHVzKHByb2JsZW1zLCB2YWxpZGF0ZVRhcmdldChnZXRDdXJyZW50VGFyZ2V0KCksCi0gICAgICAgICAgICAgICAgZ2V0Q3VycmVudFRyYW5zZmVyKCkpKTsKLQotICAgICAgICBmaW5hbCBJQ29udGFpbmVyIHRhcmdldCA9IGdldEFjdHVhbFRhcmdldCgoSVJlc291cmNlKSBnZXRDdXJyZW50VGFyZ2V0KCkpOwotICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lcyA9IChTdHJpbmdbXSkgZGF0YTsKLSAgICAgICAgLy8gUnVuIHRoZSBpbXBvcnQgb3BlcmF0aW9uIGFzeW5jaHJvbm91c2x5LiAKLSAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBkcmFnIHNvdXJjZSAoZS5nLiwgV2luZG93cyBFeHBsb3Jlcikgd2lsbCBiZSBibG9ja2VkIAotICAgICAgICAvLyB3aGlsZSB0aGUgb3BlcmF0aW9uIGV4ZWN1dGVzLiBGaXhlcyBidWcgMTY0NzguCi0gICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZ2V0U2hlbGwoKS5mb3JjZUFjdGl2ZSgpOwotICAgICAgICAgICAgICAgIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24uY29weUZpbGVzKG5hbWVzLCB0YXJnZXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2JsZW1zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGEgcmVzb3VyY2UgY29weQotICAgICAqLwotICAgIHByaXZhdGUgSVN0YXR1cyBwZXJmb3JtUmVzb3VyY2VDb3B5KFNoZWxsIHNoZWxsLCBJUmVzb3VyY2VbXSBzb3VyY2VzKSB7Ci0gICAgICAgIE11bHRpU3RhdHVzIHByb2JsZW1zID0gbmV3IE11bHRpU3RhdHVzKFBsYXRmb3JtVUkuUExVR0lOX0lELCAxLAotICAgICAgICAgICAgICAgIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuRHJvcEFkYXB0ZXJfcHJvYmxlbXNNb3ZpbmcsIG51bGwpOwotICAgICAgICBtZXJnZVN0YXR1cyhwcm9ibGVtcywgdmFsaWRhdGVUYXJnZXQoZ2V0Q3VycmVudFRhcmdldCgpLAotICAgICAgICAgICAgICAgIGdldEN1cnJlbnRUcmFuc2ZlcigpKSk7Ci0KLSAgICAgICAgSUNvbnRhaW5lciB0YXJnZXQgPSBnZXRBY3R1YWxUYXJnZXQoKElSZXNvdXJjZSkgZ2V0Q3VycmVudFRhcmdldCgpKTsKLSAgICAgICAgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICBzaGVsbCk7Ci0gICAgICAgIG9wZXJhdGlvbi5jb3B5UmVzb3VyY2VzKHNvdXJjZXMsIHRhcmdldCk7Ci0KLSAgICAgICAgcmV0dXJuIHByb2JsZW1zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGEgcmVzb3VyY2UgbW92ZQotICAgICAqLwotICAgIHByaXZhdGUgSVN0YXR1cyBwZXJmb3JtUmVzb3VyY2VNb3ZlKElSZXNvdXJjZVtdIHNvdXJjZXMpIHsKLSAgICAgICAgTXVsdGlTdGF0dXMgcHJvYmxlbXMgPSBuZXcgTXVsdGlTdGF0dXMoUGxhdGZvcm1VSS5QTFVHSU5fSUQsIDEsCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Ecm9wQWRhcHRlcl9wcm9ibGVtc01vdmluZywgbnVsbCk7Ci0gICAgICAgIG1lcmdlU3RhdHVzKHByb2JsZW1zLCB2YWxpZGF0ZVRhcmdldChnZXRDdXJyZW50VGFyZ2V0KCksCi0gICAgICAgICAgICAgICAgZ2V0Q3VycmVudFRyYW5zZmVyKCkpKTsKLQotICAgICAgICBJQ29udGFpbmVyIHRhcmdldCA9IGdldEFjdHVhbFRhcmdldCgoSVJlc291cmNlKSBnZXRDdXJyZW50VGFyZ2V0KCkpOwotICAgICAgICBSZWFkT25seVN0YXRlQ2hlY2tlciBjaGVja2VyID0gbmV3IFJlYWRPbmx5U3RhdGVDaGVja2VyKAotICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Nb3ZlUmVzb3VyY2VBY3Rpb25fdGl0bGUsCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Nb3ZlUmVzb3VyY2VBY3Rpb25fY2hlY2tNb3ZlTWVzc2FnZSk7Ci0gICAgICAgIHNvdXJjZXMgPSBjaGVja2VyLmNoZWNrUmVhZE9ubHlSZXNvdXJjZXMoc291cmNlcyk7Ci0gICAgICAgIE1vdmVGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IE1vdmVGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSk7Ci0gICAgICAgIG9wZXJhdGlvbi5jb3B5UmVzb3VyY2VzKHNvdXJjZXMsIHRhcmdldCk7Ci0KLSAgICAgICAgcmV0dXJuIHByb2JsZW1zOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeSNxdWVyeU92ZXJ3cml0ZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgcXVlcnlPdmVyd3JpdGUoU3RyaW5nIHBhdGhTdHJpbmcpIHsKLSAgICAgICAgaWYgKGFsd2F5c092ZXJ3cml0ZSkKLSAgICAgICAgICAgIHJldHVybiBBTEw7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHJldHVybkNvZGVbXSA9IHsgQ0FOQ0VMIH07Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBOTFMuYmluZChSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLkRyb3BBZGFwdGVyX292ZXJ3cml0ZVF1ZXJ5LCBwYXRoU3RyaW5nKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gb3B0aW9ucyA9IHsgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsCi0gICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLAotICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH07Ci0gICAgICAgIGdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZygKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLkRyb3BBZGFwdGVyX3F1ZXN0aW9uLCBudWxsLCBtc2csIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG9wdGlvbnMsIDApOwotICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgaW50IHJldHVyblZhbCA9IGRpYWxvZy5nZXRSZXR1cm5Db2RlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcmV0dXJuQ29kZXMgPSB7IFlFUywgQUxMLCBOTywgQ0FOQ0VMIH07Ci0gICAgICAgICAgICAgICAgcmV0dXJuQ29kZVswXSA9IHJldHVyblZhbCA8IDAgPyBDQU5DRUwgOiByZXR1cm5Db2Rlc1tyZXR1cm5WYWxdOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaWYgKHJldHVybkNvZGVbMF0gPT0gQUxMKQotICAgICAgICAgICAgYWx3YXlzT3ZlcndyaXRlID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHJldHVybkNvZGVbMF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBub3RpZnkgdGhlIGFjdGlvbiB0aGF0IHNvbWUgYXNwZWN0IG9mCi0gICAgICogdGhlIGRyb3Agb3BlcmF0aW9uIGhhcyBjaGFuZ2VkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHJvcChPYmplY3QgdGFyZ2V0LCBpbnQgZHJhZ09wZXJhdGlvbiwKLSAgICAgICAgICAgIFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGUpIHsKLQotICAgICAgICBpZiAoZHJhZ09wZXJhdGlvbiAhPSBETkQuRFJPUF9OT05FKSB7Ci0gICAgICAgICAgICBsYXN0VmFsaWRPcGVyYXRpb24gPSBkcmFnT3BlcmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKQotICAgICAgICAgICAgICAgICYmIGxhc3RWYWxpZE9wZXJhdGlvbiAhPSBETkQuRFJPUF9DT1BZKSB7Ci0gICAgICAgICAgICAvLyBvbmx5IGFsbG93IGNvcHlpbmcgd2hlbiBkcmFnZ2luZyBmcm9tIG91dHNpZGUgRWNsaXBzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdXBlci52YWxpZGF0ZURyb3AodGFyZ2V0LCBkcmFnT3BlcmF0aW9uLCB0cmFuc2ZlclR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsaWRhdGVUYXJnZXQodGFyZ2V0LCB0cmFuc2ZlclR5cGUpLmlzT0soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIGRyb3AgdGFyZ2V0IG1lZXRzIGNlcnRhaW4gY3JpdGVyaWEKLSAgICAgKi8KLSAgICBwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVUYXJnZXQoT2JqZWN0IHRhcmdldCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotICAgICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5mbyhSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLkRyb3BBZGFwdGVyX3RhcmdldE11c3RCZVJlc291cmNlKTsKLSAgICAgICAgfQotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSB0YXJnZXQ7Ci0gICAgICAgIGlmICghcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnJvcihSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLkRyb3BBZGFwdGVyX2Nhbk5vdERyb3BJbnRvQ2xvc2VkUHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgSUNvbnRhaW5lciBkZXN0aW5hdGlvbiA9IGdldEFjdHVhbFRhcmdldChyZXNvdXJjZSk7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlJPT1QpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnJvcihSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLkRyb3BBZGFwdGVyX3Jlc291cmNlc0Nhbk5vdEJlU2libGluZ3MpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKLSAgICAgICAgLy8gZHJhZyB3aXRoaW4gRWNsaXBzZT8KLSAgICAgICAgaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotICAgICAgICAgICAgSVJlc291cmNlW10gc2VsZWN0ZWRSZXNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpOwotCi0gICAgICAgICAgICBpZiAoc2VsZWN0ZWRSZXNvdXJjZXMubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuRHJvcEFkYXB0ZXJfZHJvcE9wZXJhdGlvbkVycm9yT3RoZXI7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uIG9wZXJhdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAobGFzdFZhbGlkT3BlcmF0aW9uID09IERORC5EUk9QX0NPUFkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gbmV3IENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24oZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gbmV3IE1vdmVGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24oZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBvcGVyYXRpb24udmFsaWRhdGVEZXN0aW5hdGlvbihkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUmVzb3VyY2VzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvLyBmaWxlIGltcG9ydD8KLSAgICAgICAgZWxzZSBpZiAoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHNvdXJjZU5hbWVzID0gKFN0cmluZ1tdKSBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAubmF0aXZlVG9KYXZhKHRyYW5zZmVyVHlwZSk7Ci0gICAgICAgICAgICBpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHNvdXJjZSBuYW1lcyB3aWxsIGJlIG51bGwgb24gTGludXguIFVzZSBlbXB0eSBuYW1lcyB0byBkbyBkZXN0aW5hdGlvbiB2YWxpZGF0aW9uLgotICAgICAgICAgICAgICAgIC8vIEZpeGVzIGJ1ZyAyOTc3OAotICAgICAgICAgICAgICAgIHNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24gY29weU9wZXJhdGlvbiA9IG5ldyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpKTsKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBjb3B5T3BlcmF0aW9uLnZhbGlkYXRlSW1wb3J0RGVzdGluYXRpb24oZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZU5hbWVzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyb3IobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9rKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9OYXZpZ2F0b3JGcmFtZVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9OYXZpZ2F0b3JGcmFtZVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjBiZmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvTmF2aWdhdG9yRnJhbWVTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuZnJhbWVsaXN0LlRyZWVGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5mcmFtZWxpc3QuVHJlZVZpZXdlckZyYW1lU291cmNlOwotCi0vKioKLSAqIEZyYW1lIHNvdXJjZSBmb3IgdGhlIHJlc291cmNlIG5hdmlnYXRvci4KLSAqLwotcHVibGljIGNsYXNzIE5hdmlnYXRvckZyYW1lU291cmNlIGV4dGVuZHMgVHJlZVZpZXdlckZyYW1lU291cmNlIHsKLQotICAgIHByaXZhdGUgUmVzb3VyY2VOYXZpZ2F0b3IgbmF2aWdhdG9yOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBmcmFtZSBzb3VyY2UgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgbmF2aWdhdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYXZpZ2F0b3IgdGhlIHJlc291cmNlIG5hdmlnYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBOYXZpZ2F0b3JGcmFtZVNvdXJjZShSZXNvdXJjZU5hdmlnYXRvciBuYXZpZ2F0b3IpIHsKLSAgICAgICAgc3VwZXIobmF2aWdhdG9yLmdldFRyZWVWaWV3ZXIoKSk7Ci0gICAgICAgIHRoaXMubmF2aWdhdG9yID0gbmF2aWdhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgZnJhbWUuICBUaGlzIGltcGxlbWVudGF0aW9uIGV4dGVuZHMgdGhlIHN1cGVyIGltcGxlbWVudGF0aW9uCi0gICAgICogYnkgc2V0dGluZyB0aGUgZnJhbWUncyB0b29sIHRpcCB0ZXh0IHRvIHNob3cgdGhlIGZ1bGwgcGF0aCBmb3IgdGhlIGlucHV0Ci0gICAgICogZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJlZUZyYW1lIGNyZWF0ZUZyYW1lKE9iamVjdCBpbnB1dCkgewotICAgICAgICBUcmVlRnJhbWUgZnJhbWUgPSBzdXBlci5jcmVhdGVGcmFtZShpbnB1dCk7Ci0gICAgICAgIGZyYW1lLnNldE5hbWUobmF2aWdhdG9yLmdldEZyYW1lTmFtZShpbnB1dCkpOwotICAgICAgICBmcmFtZS5zZXRUb29sVGlwVGV4dChuYXZpZ2F0b3IuZ2V0RnJhbWVUb29sVGlwVGV4dChpbnB1dCkpOwotICAgICAgICByZXR1cm4gZnJhbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxzbyB1cGRhdGVzIHRoZSBuYXZpZ2F0b3IncyB0aXRsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmcmFtZUNoYW5nZWQoVHJlZUZyYW1lIGZyYW1lKSB7Ci0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGZyYW1lLmdldElucHV0KCk7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzT3BlbigpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgIC5vcGVuSW5mb3JtYXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmdldFZpZXdTaXRlKCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLk5hdmlnYXRvckZyYW1lU291cmNlX2Nsb3NlZFByb2plY3RfdGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5OYXZpZ2F0b3JGcmFtZVNvdXJjZV9jbG9zZWRQcm9qZWN0X21lc3NhZ2UsIHByb2plY3QuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICBuYXZpZ2F0b3IuZ2V0RnJhbWVMaXN0KCkuYmFjaygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuZnJhbWVDaGFuZ2VkKGZyYW1lKTsKLSAgICAgICAgICAgIG5hdmlnYXRvci51cGRhdGVUaXRsZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9PcGVuQWN0aW9uR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvT3BlbkFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjlmODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9PcGVuQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuT3BlbkZpbGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5PcGVuSW5OZXdXaW5kb3dBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5PcGVuV2l0aE1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYWN0aW9uIGdyb3VwIGZvciB0aGUgb3BlbiBhY3Rpb25zLgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkFjdGlvbkdyb3VwIGV4dGVuZHMgUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb25Hcm91cCB7Ci0KLSAgICBwcml2YXRlIE9wZW5GaWxlQWN0aW9uIG9wZW5GaWxlQWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhlIGlkIGZvciB0aGUgT3BlbiBXaXRoIHN1Ym1lbnUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9XSVRIX0lEID0gUGxhdGZvcm1VSS5QTFVHSU5fSUQKLSAgICAgICAgICAgICsgIi5PcGVuV2l0aFN1Yk1lbnUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgT3BlbkFjdGlvbkdyb3VwKElSZXNvdXJjZU5hdmlnYXRvciBuYXZpZ2F0b3IpIHsKLSAgICAgICAgc3VwZXIobmF2aWdhdG9yKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucygpIHsKLSAgICAgICAgb3BlbkZpbGVBY3Rpb24gPSBuZXcgT3BlbkZpbGVBY3Rpb24obmF2aWdhdG9yLmdldFNpdGUoKS5nZXRQYWdlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICBib29sZWFuIGFueVJlc291cmNlU2VsZWN0ZWQgPSAhc2VsZWN0aW9uLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgICYmIFJlc291cmNlU2VsZWN0aW9uVXRpbC5hbGxSZXNvdXJjZXNBcmVPZlR5cGUoc2VsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLlBST0pFQ1QgfCBJUmVzb3VyY2UuRk9MREVSIHwgSVJlc291cmNlLkZJTEUpOwotICAgICAgICBib29sZWFuIG9ubHlGaWxlc1NlbGVjdGVkID0gIXNlbGVjdGlvbi5pc0VtcHR5KCkKLSAgICAgICAgICAgICAgICAmJiBSZXNvdXJjZVNlbGVjdGlvblV0aWwuYWxsUmVzb3VyY2VzQXJlT2ZUeXBlKHNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5GSUxFKTsKLQotICAgICAgICBpZiAob25seUZpbGVzU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgIG9wZW5GaWxlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIG1lbnUuYWRkKG9wZW5GaWxlQWN0aW9uKTsKLSAgICAgICAgICAgIGZpbGxPcGVuV2l0aE1lbnUobWVudSwgc2VsZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhbnlSZXNvdXJjZVNlbGVjdGVkKSB7Ci0gICAgICAgICAgICBhZGROZXdXaW5kb3dBY3Rpb24obWVudSwgc2VsZWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIE9wZW5XaXRoIHN1Ym1lbnUgdG8gdGhlIGNvbnRleHQgbWVudS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVudSB0aGUgY29udGV4dCBtZW51Ci0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmlsbE9wZW5XaXRoTWVudShJTWVudU1hbmFnZXIgbWVudSwKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCi0gICAgICAgIC8vIE9ubHkgc3VwcG9ydGVkIGlmIGV4YWN0bHkgb25lIGZpbGUgaXMgc2VsZWN0ZWQuCi0gICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIE9iamVjdCBlbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIE1lbnVNYW5hZ2VyIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5SZXNvdXJjZU5hdmlnYXRvcl9vcGVuV2l0aCwgT1BFTl9XSVRIX0lEKTsKLSAgICAgICAgc3VibWVudS5hZGQobmV3IE9wZW5XaXRoTWVudShuYXZpZ2F0b3IuZ2V0U2l0ZSgpLmdldFBhZ2UoKSwKLSAgICAgICAgICAgICAgICAoSUZpbGUpIGVsZW1lbnQpKTsKLSAgICAgICAgbWVudS5hZGQoc3VibWVudSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgT3BlbiBpbiBOZXcgV2luZG93IGFjdGlvbiB0byB0aGUgY29udGV4dCBtZW51LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZW51IHRoZSBjb250ZXh0IG1lbnUKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGROZXdXaW5kb3dBY3Rpb24oSU1lbnVNYW5hZ2VyIG1lbnUsCi0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotICAgICAgICAvLyBPbmx5IHN1cHBvcnRlZCBpZiBleGFjdGx5IG9uZSBjb250YWluZXIgKGkuZSBvcGVuIHByb2plY3Qgb3IgZm9sZGVyKSBpcyBzZWxlY3RlZC4KLSAgICAgICAgaWYgKHNlbGVjdGlvbi5zaXplKCkgIT0gMSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCAmJiAhKCgoSVByb2plY3QpIGVsZW1lbnQpLmlzT3BlbigpKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBtZW51LmFkZChuZXcgT3BlbkluTmV3V2luZG93QWN0aW9uKG5hdmlnYXRvci5nZXRTaXRlKCkKLSAgICAgICAgICAgICAgICAuZ2V0V29ya2JlbmNoV2luZG93KCksIChJQ29udGFpbmVyKSBlbGVtZW50KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVucyB0aGUgZGVmYXVsdCBhY3Rpb24gKG9wZW4gZmlsZSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuRGVmYXVsdEFjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgIG9wZW5GaWxlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIG9wZW5GaWxlQWN0aW9uLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9QYXN0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9QYXN0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjI5ZTAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvUGFzdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Db3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29weVByb2plY3RPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlJlc291cmNlVHJhbnNmZXI7Ci0KLS8qKgotICogU3RhbmRhcmQgYWN0aW9uIGZvciBwYXN0aW5nIHJlc291cmNlcyBvbiB0aGUgY2xpcGJvYXJkIHRvIHRoZSBzZWxlY3RlZCByZXNvdXJjZSdzIGxvY2F0aW9uLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLS8qcGFja2FnZSovY2xhc3MgUGFzdGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaWQgb2YgdGhpcyBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBQbGF0Zm9ybVVJLlBMVUdJTl9JRCArICIuUGFzdGVBY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBzaGVsbCBpbiB3aGljaCB0byBzaG93IGFueSBkaWFsb2dzLgotICAgICAqLwotICAgIHByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLSAgICAvKioKLSAgICAgKiBTeXN0ZW0gY2xpcGJvYXJkCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2hlbGwgdGhlIHNoZWxsIGZvciBhbnkgZGlhbG9ncwotICAgICAqIEBwYXJhbSBjbGlwYm9hcmQgdGhlIGNsaXBib2FyZAotICAgICAqLwotICAgIHB1YmxpYyBQYXN0ZUFjdGlvbihTaGVsbCBzaGVsbCwgQ2xpcGJvYXJkIGNsaXBib2FyZCkgewotICAgICAgICBzdXBlcihSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLlBhc3RlQWN0aW9uX3RpdGxlKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChzaGVsbCk7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoY2xpcGJvYXJkKTsKLSAgICAgICAgdGhpcy5zaGVsbCA9IHNoZWxsOwotICAgICAgICB0aGlzLmNsaXBib2FyZCA9IGNsaXBib2FyZDsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQoUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5QYXN0ZUFjdGlvbl90b29sVGlwKTsKLSAgICAgICAgc2V0SWQoUGFzdGVBY3Rpb24uSUQpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJSU5hdmlnYXRvckhlbHBDb250ZXh0SWRzLlBBU1RFX0FDVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0dWFsIHRhcmdldCBvZiB0aGUgcGFzdGUgYWN0aW9uLiBSZXR1cm5zIG51bGwKLSAgICAgKiBpZiBubyB2YWxpZCB0YXJnZXQgaXMgc2VsZWN0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYWN0dWFsIHRhcmdldCBvZiB0aGUgcGFzdGUgYWN0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0VGFyZ2V0KCkgewotICAgICAgICBMaXN0IHNlbGVjdGVkUmVzb3VyY2VzID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBzZWxlY3RlZFJlc291cmNlcy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0ICYmICEoKElQcm9qZWN0KSByZXNvdXJjZSkuaXNPcGVuKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotICAgICAgICAgICAgICAgIHJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIGFueSBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2VzIGFyZSBsaW5rZWQgcmVzb3VyY2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZXMgcmVzb3VyY2UgdG8gY2hlY2sgZm9yIGxpbmtlZCB0eXBlLiBtYXkgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdHJ1ZT1vbmUgb3IgbW9yZSByZXNvdXJjZXMgYXJlIGxpbmtlZC4gZmFsc2U9bm9uZSBvZiB0aGUgCi0gICAgICogCXJlc291cmNlcyBhcmUgbGlua2VkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGlua2VkKElSZXNvdXJjZVtdIHJlc291cmNlcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHJlc291cmNlc1tpXS5pc0xpbmtlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIC8vIHRyeSBhIHJlc291cmNlIHRyYW5zZmVyCi0gICAgICAgIFJlc291cmNlVHJhbnNmZXIgcmVzVHJhbnNmZXIgPSBSZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlRGF0YSA9IChJUmVzb3VyY2VbXSkgY2xpcGJvYXJkCi0gICAgICAgICAgICAgICAgLmdldENvbnRlbnRzKHJlc1RyYW5zZmVyKTsKLQotICAgICAgICBpZiAocmVzb3VyY2VEYXRhICE9IG51bGwgJiYgcmVzb3VyY2VEYXRhLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZURhdGFbMF0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0gICAgICAgICAgICAgICAgLy8gZW5hYmxlbWVudCBjaGVja3MgZm9yIGFsbCBwcm9qZWN0cwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VEYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvcHlQcm9qZWN0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBDb3B5UHJvamVjdE9wZXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoZWxsKTsKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNvcHlQcm9qZWN0KChJUHJvamVjdCkgcmVzb3VyY2VEYXRhW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGVuYWJsZW1lbnQgc2hvdWxkIGVuc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGFjY2VzcyB0byBhIGNvbnRhaW5lcgotICAgICAgICAgICAgICAgIElDb250YWluZXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgICAgICAgICBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGVsbCk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNvcHlSZXNvdXJjZXMocmVzb3VyY2VEYXRhLCBjb250YWluZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdHJ5IGEgZmlsZSB0cmFuc2ZlcgotICAgICAgICBGaWxlVHJhbnNmZXIgZmlsZVRyYW5zZmVyID0gRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZ1tdIGZpbGVEYXRhID0gKFN0cmluZ1tdKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoZmlsZVRyYW5zZmVyKTsKLQotICAgICAgICBpZiAoZmlsZURhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZW5hYmxlbWVudCBzaG91bGQgZW5zdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgYWNjZXNzIHRvIGEgY29udGFpbmVyCi0gICAgICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwotCi0gICAgICAgICAgICBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICB0aGlzLnNoZWxsKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbi5jb3B5RmlsZXMoZmlsZURhdGEsIGNvbnRhaW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250YWluZXIgdG8gaG9sZCB0aGUgcGFzdGVkIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIElDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgewotICAgICAgICBMaXN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uZ2V0KDApIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICAgICAgICByZXR1cm4gKChJRmlsZSkgc2VsZWN0aW9uLmdldCgwKSkuZ2V0UGFyZW50KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAoSUNvbnRhaW5lcikgc2VsZWN0aW9uLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+UGFzdGVBY3Rpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjwvY29kZT4gbWV0aG9kIGVuYWJsZXMgdGhpcyBhY3Rpb24gaWYgCi0gICAgICogYSByZXNvdXJjZSBjb21wYXRpYmxlIHdpdGggd2hhdCBpcyBvbiB0aGUgY2xpcGJvYXJkIGlzIHNlbGVjdGVkLgotICAgICAqIAotICAgICAqIC1DbGlwYm9hcmQgbXVzdCBoYXZlIElSZXNvdXJjZSBvciBqYXZhLmlvLkZpbGUKLSAgICAgKiAtUHJvamVjdHMgY2FuIGFsd2F5cyBiZSBwYXN0ZWQgaWYgdGhleSBhcmUgb3BlbgotICAgICAqIC1Xb3Jrc3BhY2UgZm9sZGVyIG1heSBub3QgYmUgY29waWVkIGludG8gaXRzZWxmCi0gICAgICogLUZpbGVzIGFuZCBmb2xkZXJzIG1heSBiZSBwYXN0ZWQgdG8gYSBzaW5nbGUgc2VsZWN0ZWQgZm9sZGVyIGluIG9wZW4gCi0gICAgICogCXByb2plY3Qgb3IgbXVsdGlwbGUgc2VsZWN0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZm9sZGVyIAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgaWYgKCFzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBmaW5hbCBJUmVzb3VyY2VbXVtdIGNsaXBib2FyZERhdGEgPSBuZXcgSVJlc291cmNlWzFdW107Ci0gICAgICAgIHNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgLy8gY2xpcGJvYXJkIG11c3QgaGF2ZSByZXNvdXJjZXMgb3IgZmlsZXMKLSAgICAgICAgICAgICAgICBSZXNvdXJjZVRyYW5zZmVyIHJlc1RyYW5zZmVyID0gUmVzb3VyY2VUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIGNsaXBib2FyZERhdGFbMF0gPSAoSVJlc291cmNlW10pIGNsaXBib2FyZAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbnRlbnRzKHJlc1RyYW5zZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlRGF0YSA9IGNsaXBib2FyZERhdGFbMF07Ci0gICAgICAgIGJvb2xlYW4gaXNQcm9qZWN0UmVzID0gcmVzb3VyY2VEYXRhICE9IG51bGwgJiYgcmVzb3VyY2VEYXRhLmxlbmd0aCA+IDAKLSAgICAgICAgICAgICAgICAmJiByZXNvdXJjZURhdGFbMF0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUOwotCi0gICAgICAgIGlmIChpc1Byb2plY3RSZXMpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VEYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGFsbCByZXNvdXJjZSBkYXRhIGFyZSBvcGVuIHByb2plY3RzCi0gICAgICAgICAgICAgICAgLy8gY2FuIHBhc3RlIG9wZW4gcHJvamVjdHMgcmVnYXJkbGVzcyBvZiBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VEYXRhW2ldLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUFJPSkVDVAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChJUHJvamVjdCkgcmVzb3VyY2VEYXRhW2ldKS5pc09wZW4oKSA9PSBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0U2VsZWN0ZWROb25SZXNvdXJjZXMoKS5zaXplKCkgPiAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIElSZXNvdXJjZSB0YXJnZXRSZXNvdXJjZSA9IGdldFRhcmdldCgpOwotICAgICAgICAvLyB0YXJnZXRSZXNvdXJjZSBpcyBudWxsIGlmIG5vIHZhbGlkIHRhcmdldCBpcyBzZWxlY3RlZCAoZS5nLiwgb3BlbiBwcm9qZWN0KSAKLSAgICAgICAgLy8gb3Igc2VsZWN0aW9uIGlzIGVtcHR5CQotICAgICAgICBpZiAodGFyZ2V0UmVzb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBjYW4gcGFzdGUgZmlsZXMgYW5kIGZvbGRlcnMgdG8gYSBzaW5nbGUgc2VsZWN0aW9uIChmaWxlLCBmb2xkZXIsIAotICAgICAgICAvLyBvcGVuIHByb2plY3QpIG9yIG11bHRpcGxlIGZpbGUgc2VsZWN0aW9uIHdpdGggdGhlIHNhbWUgcGFyZW50Ci0gICAgICAgIExpc3Qgc2VsZWN0ZWRSZXNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpOwotICAgICAgICBpZiAoc2VsZWN0ZWRSZXNvdXJjZXMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZFJlc291cmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHNlbGVjdGVkUmVzb3VyY2VzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRSZXNvdXJjZS5lcXVhbHMocmVzb3VyY2UuZ2V0UGFyZW50KCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc291cmNlRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBsaW5rZWQgcmVzb3VyY2VzIGNhbiBvbmx5IGJlIHBhc3RlZCBpbnRvIHByb2plY3RzCi0gICAgICAgICAgICBpZiAoaXNMaW5rZWQocmVzb3VyY2VEYXRhKQotICAgICAgICAgICAgICAgICAgICAmJiB0YXJnZXRSZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBpZiAodGFyZ2V0UmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLSAgICAgICAgICAgICAgICAvLyBkb24ndCB0cnkgdG8gY29weSBmb2xkZXIgdG8gc2VsZgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VEYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRSZXNvdXJjZS5lcXVhbHMocmVzb3VyY2VEYXRhW2ldKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBUcmFuc2ZlckRhdGFbXSB0cmFuc2ZlcnMgPSBjbGlwYm9hcmQuZ2V0QXZhaWxhYmxlVHlwZXMoKTsKLSAgICAgICAgRmlsZVRyYW5zZmVyIGZpbGVUcmFuc2ZlciA9IEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zZmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGZpbGVUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJzW2ldKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1JlZmFjdG9yQWN0aW9uR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvUmVmYWN0b3JBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmQ5YmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvUmVmYWN0b3JBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBTZWJhc3RpYW4gRGF2aWRzIDxzZGF2aWRzQGdteC5kZT4gLSBJbWFnZXMgZm9yIG1lbnUgaXRlbXMgKDI3NDgxKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuRGVsZXRlUmVzb3VyY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5UZXh0QWN0aW9uSGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBhY3Rpb24gZ3JvdXAgZm9yIHJlZmFjdG9yIGFjdGlvbnMsCi0gKiBpbmNsdWRpbmcgZ2xvYmFsIGFjdGlvbiBoYW5kbGVycyBmb3IgY29weSwgcGFzdGUgYW5kIGRlbGV0ZS4KLSAqIAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmYWN0b3JBY3Rpb25Hcm91cCBleHRlbmRzIFJlc291cmNlTmF2aWdhdG9yQWN0aW9uR3JvdXAgewotCi0gICAgcHJpdmF0ZSBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCi0gICAgcHJpdmF0ZSBDb3B5QWN0aW9uIGNvcHlBY3Rpb247Ci0KLSAgICBwcml2YXRlIERlbGV0ZVJlc291cmNlQWN0aW9uIGRlbGV0ZUFjdGlvbjsKLQotICAgIHByaXZhdGUgUGFzdGVBY3Rpb24gcGFzdGVBY3Rpb247Ci0KLSAgICBwcml2YXRlIFJlc291cmNlTmF2aWdhdG9yUmVuYW1lQWN0aW9uIHJlbmFtZUFjdGlvbjsKLQotICAgIHByaXZhdGUgUmVzb3VyY2VOYXZpZ2F0b3JNb3ZlQWN0aW9uIG1vdmVBY3Rpb247Ci0KLSAgICBwcml2YXRlIFRleHRBY3Rpb25IYW5kbGVyIHRleHRBY3Rpb25IYW5kbGVyOwotCi0gICAgcHVibGljIFJlZmFjdG9yQWN0aW9uR3JvdXAoSVJlc291cmNlTmF2aWdhdG9yIG5hdmlnYXRvcikgewotICAgICAgICBzdXBlcihuYXZpZ2F0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChjbGlwYm9hcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGNsaXBib2FyZCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICBib29sZWFuIGFueVJlc291cmNlU2VsZWN0ZWQgPSAhc2VsZWN0aW9uLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgICYmIFJlc291cmNlU2VsZWN0aW9uVXRpbC5hbGxSZXNvdXJjZXNBcmVPZlR5cGUoc2VsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLlBST0pFQ1QgfCBJUmVzb3VyY2UuRk9MREVSIHwgSVJlc291cmNlLkZJTEUpOwotCi0gICAgICAgIGNvcHlBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotICAgICAgICBtZW51LmFkZChjb3B5QWN0aW9uKTsKLSAgICAgICAgcGFzdGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotICAgICAgICBtZW51LmFkZChwYXN0ZUFjdGlvbik7Ci0KLSAgICAgICAgaWYgKGFueVJlc291cmNlU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgIGRlbGV0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0gICAgICAgICAgICBtZW51LmFkZChkZWxldGVBY3Rpb24pOwotICAgICAgICAgICAgbW92ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0gICAgICAgICAgICBtZW51LmFkZChtb3ZlQWN0aW9uKTsKLSAgICAgICAgICAgIHJlbmFtZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0gICAgICAgICAgICBtZW51LmFkZChyZW5hbWVBY3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotICAgICAgICB0ZXh0QWN0aW9uSGFuZGxlciA9IG5ldyBUZXh0QWN0aW9uSGFuZGxlcihhY3Rpb25CYXJzKTsgLy8gaG9va3MgaGFuZGxlcnMKLSAgICAgICAgdGV4dEFjdGlvbkhhbmRsZXIuc2V0Q29weUFjdGlvbihjb3B5QWN0aW9uKTsKLSAgICAgICAgdGV4dEFjdGlvbkhhbmRsZXIuc2V0UGFzdGVBY3Rpb24ocGFzdGVBY3Rpb24pOwotICAgICAgICB0ZXh0QWN0aW9uSGFuZGxlci5zZXREZWxldGVBY3Rpb24oZGVsZXRlQWN0aW9uKTsKLSAgICAgICAgcmVuYW1lQWN0aW9uLnNldFRleHRBY3Rpb25IYW5kbGVyKHRleHRBY3Rpb25IYW5kbGVyKTsKLQotICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5NT1ZFLmdldElkKCksCi0gICAgICAgICAgICAgICAgbW92ZUFjdGlvbik7Ci0gICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFTkFNRS5nZXRJZCgpLAotICAgICAgICAgICAgICAgIHJlbmFtZUFjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIGtleSBwcmVzc2VkIGV2ZW50IGJ5IGludm9raW5nIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlS2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5ERUwgJiYgZXZlbnQuc3RhdGVNYXNrID09IDApIHsKLSAgICAgICAgICAgIGlmIChkZWxldGVBY3Rpb24uaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFN3YWxsb3cgdGhlIGV2ZW50LgotICAgICAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotCi0gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuRjIgJiYgZXZlbnQuc3RhdGVNYXNrID09IDApIHsKLSAgICAgICAgICAgIGlmIChyZW5hbWVBY3Rpb24uaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZW5hbWVBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFN3YWxsb3cgdGhlIGV2ZW50LgotICAgICAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0gICAgICAgIFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IG5hdmlnYXRvci5nZXRWaWV3ZXIoKTsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBuYXZpZ2F0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0gICAgICAgIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoc2hlbGwuZ2V0RGlzcGxheSgpKTsKLQotICAgICAgICBwYXN0ZUFjdGlvbiA9IG5ldyBQYXN0ZUFjdGlvbihzaGVsbCwgY2xpcGJvYXJkKTsKLSAgICAgICAgSVNoYXJlZEltYWdlcyBpbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotICAgICAgICBwYXN0ZUFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihpbWFnZXMKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUEFTVEVfRElTQUJMRUQpKTsKLSAgICAgICAgcGFzdGVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlcwotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9QQVNURSkpOwotCi0gICAgICAgIGNvcHlBY3Rpb24gPSBuZXcgQ29weUFjdGlvbihzaGVsbCwgY2xpcGJvYXJkLCBwYXN0ZUFjdGlvbik7Ci0gICAgICAgIGNvcHlBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFlfRElTQUJMRUQpKTsKLSAgICAgICAgY29weUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFkpKTsKLQotICAgICAgICBtb3ZlQWN0aW9uID0gbmV3IFJlc291cmNlTmF2aWdhdG9yTW92ZUFjdGlvbihzaGVsbCwgdHJlZVZpZXdlcik7Ci0gICAgICAgIHJlbmFtZUFjdGlvbiA9IG5ldyBSZXNvdXJjZU5hdmlnYXRvclJlbmFtZUFjdGlvbihzaGVsbCwgdHJlZVZpZXdlcik7Ci0KLSAgICAgICAgZGVsZXRlQWN0aW9uID0gbmV3IERlbGV0ZVJlc291cmNlQWN0aW9uKHNoZWxsKTsKLSAgICAgICAgZGVsZXRlQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGltYWdlcwotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEVfRElTQUJMRUQpKTsKLSAgICAgICAgZGVsZXRlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZXMKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQWN0aW9uQmFycygpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgY29weUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0gICAgICAgIHBhc3RlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgZGVsZXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgbW92ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0gICAgICAgIHJlbmFtZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1Jlc291cmNlTmF2aWdhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1Jlc291cmNlTmF2aWdhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYjA4YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9SZXNvdXJjZU5hdmlnYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JT3Blbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLk9wZW5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlJlc291cmNlV29ya2luZ1NldEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGx1Z2luVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuU2hvd0luQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmZyYW1lbGlzdC5GcmFtZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuZnJhbWVsaXN0LlRyZWVGcmFtZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBSZXNvdXJjZSBOYXZpZ2F0b3Igdmlldy4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlTmF2aWdhdG9yIGV4dGVuZHMgVmlld1BhcnQgaW1wbGVtZW50cyBJU2V0U2VsZWN0aW9uVGFyZ2V0LAotICAgICAgICBJUmVzb3VyY2VOYXZpZ2F0b3IgewotCi0gICAgcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdlcjsKLQotICAgIHByaXZhdGUgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzOwotCi0gICAgcHJpdmF0ZSBJTWVtZW50byBtZW1lbnRvOwotCi0gICAgcHJpdmF0ZSBGcmFtZUxpc3QgZnJhbWVMaXN0OwotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZU5hdmlnYXRvckFjdGlvbkdyb3VwIGFjdGlvbkdyb3VwOwotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZVBhdHRlcm5GaWx0ZXIgcGF0dGVybkZpbHRlciA9IG5ldyBSZXNvdXJjZVBhdHRlcm5GaWx0ZXIoKTsKLQotICAgIHByaXZhdGUgUmVzb3VyY2VXb3JraW5nU2V0RmlsdGVyIHdvcmtpbmdTZXRGaWx0ZXIgPSBuZXcgUmVzb3VyY2VXb3JraW5nU2V0RmlsdGVyKCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbGlua2luZ0VuYWJsZWQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZHJhZ0RldGVjdGVkOwotCi0gICAgcHJpdmF0ZSBMaXN0ZW5lciBkcmFnRGV0ZWN0TGlzdGVuZXI7Ci0gICAgLyoqCi0gICAgICogUmVtZW1iZXJlZCB3b3JraW5nIHNldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElXb3JraW5nU2V0IHdvcmtpbmdTZXQ7Ci0KLSAgICAvKioKLQkgKiBNYXJrcyB3aGV0aGVyIHRoZSB3b3JraW5nIHNldCB3ZSdyZSB1c2luZyBpcyBjdXJyZW50bHkgZW1wdHkuIEluIHRoaXMKLQkgKiBldmVudCB3ZSdyZSBlZmZlY3RpdmVseSBub3QgdXNpbmcgYSB3b3JraW5nIHNldC4KLQkgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZW1wdHlXb3JraW5nU2V0ID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0JICogU2V0dGluZ3MgY29uc3RhbnQgZm9yIHNlY3Rpb24gbmFtZSAodmFsdWUgPGNvZGU+UmVzb3VyY2VOYXZpZ2F0b3I8L2NvZGU+KS4KLQkgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkVfU0VDVElPTiA9ICJSZXNvdXJjZU5hdmlnYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiAKLSAgICAgKiBTZXR0aW5ncyBjb25zdGFudCBmb3Igc29ydCBvcmRlciAodmFsdWUgPGNvZGU+UmVzb3VyY2VWaWV3ZXIuU1RPUkVfU09SVF9UWVBFPC9jb2RlPikuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JFX1NPUlRfVFlQRSA9ICJSZXNvdXJjZVZpZXdlci5TVE9SRV9TT1JUX1RZUEUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogCi0gICAgICogU2V0dGluZ3MgY29uc3RhbnQgZm9yIHdvcmtpbmcgc2V0ICh2YWx1ZSA8Y29kZT5SZXNvdXJjZVdvcmtpbmdTZXRGaWx0ZXIuU1RPUkVfV09SS0lOR19TRVQ8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkVfV09SS0lOR19TRVQgPSAiUmVzb3VyY2VXb3JraW5nU2V0RmlsdGVyLlNUT1JFX1dPUktJTkdfU0VUIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIHVzZWQgYnV0IHByZXNlcnZlZCB0byBhdm9pZCBhbiBhcGkgY2hhbmdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVklHQVRPUl9WSUVXX0hFTFBfSUQgPSBJTmF2aWdhdG9ySGVscENvbnRleHRJZHMuUkVTT1VSQ0VfVklFVzsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWZmIHdlJ3ZlIGFscmVhZHkgc2NoZWR1bGVkIGFuIGFzeW5jaHJvbm91cyBjYWxsIHRvIGxpbmtUb0VkaXRvcgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBsaW5rU2NoZWR1bGVkID0gZmFsc2U7Ci0gICAgCi0gICAgLy8gUGVyc2lzdGFuY2UgdGFncy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NPUlRFUiA9ICJzb3J0ZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0ZJTFRFUlMgPSAiZmlsdGVycyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRklMVEVSID0gImZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU0VMRUNUSU9OID0gInNlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0VMRU1FTlQgPSAiZWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSVNfRU5BQkxFRCA9ICJpc0VuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BBVEggPSAicGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ1VSUkVOVF9GUkFNRSA9ICJjdXJyZW50RnJhbWUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkKLSAgICAgICAgICAgICAgICBlZGl0b3JBY3RpdmF0ZWQoKElFZGl0b3JQYXJ0KSBwYXJ0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLSAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0gICAgICAgICAgIAotICAgICAgICAgICAgaWYgKElXb3JraW5nU2V0TWFuYWdlci5DSEFOR0VfV09SS0lOR19TRVRfUkVNT1ZFLmVxdWFscyhwcm9wZXJ0eSkKLSAgICAgICAgICAgICAgICAgICAgJiYgb2xkVmFsdWUgPT0gd29ya2luZ1NldCkgewotICAgICAgICAgICAgICAgIHNldFdvcmtpbmdTZXQobnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKElXb3JraW5nU2V0TWFuYWdlci5DSEFOR0VfV09SS0lOR19TRVRfTkFNRV9DSEFOR0UKLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhwcm9wZXJ0eSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbmV3VmFsdWUgPT0gd29ya2luZ1NldCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKElXb3JraW5nU2V0TWFuYWdlci5DSEFOR0VfV09SS0lOR19TRVRfQ09OVEVOVF9DSEFOR0UKLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhwcm9wZXJ0eSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbmV3VmFsdWUgPT0gd29ya2luZ1NldCkgewotCQkJCWlmICh3b3JraW5nU2V0LmlzQWdncmVnYXRlV29ya2luZ1NldCgpICYmIHdvcmtpbmdTZXQuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIGFjdCBhcyBpZiB0aGUgd29ya2luZyBzZXQgaGFzIGJlZW4gbWFkZSBudWxsCi0JCQkJCWlmICghZW1wdHlXb3JraW5nU2V0KSB7Ci0JCQkJCQllbXB0eVdvcmtpbmdTZXQgPSB0cnVlOwotCQkJCQkJd29ya2luZ1NldEZpbHRlci5zZXRXb3JraW5nU2V0KG51bGwpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gd2UndmUgZ29uZSBmcm9tIGVtcHR5IHRvIG5vbi1lbXB0eSBvbiBvdXIgc2V0LgotCQkJCQkvLyBSZXN0b3JlIGl0LgotCQkJCQlpZiAoZW1wdHlXb3JraW5nU2V0KSB7Ci0JCQkJCSAgICBlbXB0eVdvcmtpbmdTZXQgPSBmYWxzZTsKLQkJCQkJCXdvcmtpbmdTZXRGaWx0ZXIuc2V0V29ya2luZ1NldCh3b3JraW5nU2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyByZXNvdXJjZSBuYXZpZ2F0b3Igdmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VOYXZpZ2F0b3IoKSB7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB2aWV3c1NldHRpbmdzID0gZ2V0UGx1Z2luKCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQotICAgICAgICBzZXR0aW5ncyA9IHZpZXdzU2V0dGluZ3MuZ2V0U2VjdGlvbihTVE9SRV9TRUNUSU9OKTsKLSAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldHRpbmdzID0gdmlld3NTZXR0aW5ncy5hZGROZXdTZWN0aW9uKFNUT1JFX1NFQ1RJT04pOwotICAgICAgICAgICAgbWlncmF0ZURpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbml0TGlua2luZ0VuYWJsZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGludG8gYSBmb3JtIHVzYWJsZSBieSB0aGUgdmlld2VyLAotICAgICAqIHdoZXJlIHRoZSBlbGVtZW50cyBhcmUgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHByaXZhdGUgU3RydWN0dXJlZFNlbGVjdGlvbiBjb252ZXJ0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNzZWwuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlID0gKElSZXNvdXJjZSkgbzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBvKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFBhcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBUcmVlVmlld2VyIHZpZXdlciA9IGNyZWF0ZVZpZXdlcihwYXJlbnQpOwotICAgICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQotICAgICAgICBpZiAobWVtZW50byAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN0b3JlRmlsdGVycygpOwotICAgICAgICAgICAgcmVzdG9yZUxpbmtpbmdFbmFibGVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZnJhbWVMaXN0ID0gY3JlYXRlRnJhbWVMaXN0KCk7Ci0gICAgICAgIGluaXREcmFnQW5kRHJvcCgpOwotICAgICAgICB1cGRhdGVUaXRsZSgpOwotCi0gICAgICAgIGluaXRDb250ZXh0TWVudSgpOwotCi0gICAgICAgIGluaXRSZXNvdXJjZVNvcnRlcigpOwotICAgICAgICBpbml0V29ya2luZ1NldEZpbHRlcigpOwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSBpbnB1dCBpcyBzZXQgYWZ0ZXIgc29ydGVycyBhbmQgZmlsdGVycywKLSAgICAgICAgLy8gdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVmcmVzaGVzCi0gICAgICAgIHZpZXdlci5zZXRJbnB1dChnZXRJbml0aWFsSW5wdXQoKSk7Ci0KLSAgICAgICAgLy8gbWFrZSBhY3Rpb25zIGFmdGVyIHNldHRpbmcgaW5wdXQsIGJlY2F1c2Ugc29tZSBhY3Rpb25zCi0gICAgICAgIC8vIGxvb2sgYXQgdGhlIHZpZXdlciBmb3IgZW5hYmxlbWVudCAoZS5nLiB0aGUgVXAgYWN0aW9uKQotICAgICAgICBtYWtlQWN0aW9ucygpOwotCi0gICAgICAgIC8vIEZpbGwgdGhlIGFjdGlvbiBiYXJzIGFuZCB1cGRhdGUgdGhlIGdsb2JhbCBhY3Rpb24gaGFuZGxlcnMnCi0gICAgICAgIC8vIGVuYWJsZWQgc3RhdGUgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgICAgICBnZXRBY3Rpb25Hcm91cCgpLmZpbGxBY3Rpb25CYXJzKGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpKTsKLSAgICAgICAgdXBkYXRlQWN0aW9uQmFycygoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLSAgICAgICAgZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHZpZXdlcik7Ci0gICAgICAgIGdldFNpdGUoKS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0gICAgICAgIElXb3JraW5nU2V0TWFuYWdlciB3b3JraW5nU2V0TWFuYWdlciA9IGdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCk7Ci0gICAgICAgIHdvcmtpbmdTZXRNYW5hZ2VyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLSAgICAgICAgaWYgKG1lbWVudG8gIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3RvcmVTdGF0ZShtZW1lbnRvKTsKLSAgICAgICAgbWVtZW50byA9IG51bGw7Ci0KLSAgICAgICAgLy8gU2V0IGhlbHAgZm9yIHRoZSB2aWV3IAotICAgICAgICBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJdmlld2VyLmdldENvbnRyb2woKSwgZ2V0SGVscENvbnRleHRJZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoZWxwIGNvbnRleHQgaWQgdG8gdXNlIGZvciB0aGlzIHZpZXcuCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscENvbnRleHRJZCgpIHsKLSAgICAgICAgcmV0dXJuIElOYXZpZ2F0b3JIZWxwQ29udGV4dElkcy5SRVNPVVJDRV9WSUVXOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIGFuZCByZWdpc3RlcnMgdGhlIGNvbnRleHQgbWVudS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRNZW51KCkgewotICAgICAgICBNZW51TWFuYWdlciBtZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wdXBNZW51Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0gICAgICAgIG1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VOYXZpZ2F0b3IudGhpcy5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBUcmVlVmlld2VyIHZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKLSAgICAgICAgTWVudSBtZW51ID0gbWVudU1nci5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0VHJlZSgpKTsKLSAgICAgICAgdmlld2VyLmdldFRyZWUoKS5zZXRNZW51KG1lbnUpOwotICAgICAgICBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZW51TWdyLCB2aWV3ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHZpZXdlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmVlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIFRyZWVWaWV3ZXIgdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLSAgICAgICAgICAgICAgICB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgICAgIHZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotICAgICAgICBpbml0Q29udGVudFByb3ZpZGVyKHZpZXdlcik7Ci0gICAgICAgIGluaXRMYWJlbFByb3ZpZGVyKHZpZXdlcik7Ci0gICAgICAgIGluaXRGaWx0ZXJzKHZpZXdlcik7Ci0gICAgICAgIGluaXRMaXN0ZW5lcnModmlld2VyKTsKLQotICAgICAgICByZXR1cm4gdmlld2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSB2aWV3ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZpZXdlciB0aGUgdmlld2VyCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLSAgICAgICAgdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgdmlld2VyLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2aWV3ZXIgdGhlIHZpZXdlcgotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotICAgICAgICB2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIoCi0gICAgICAgICAgICAgICAgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGZpbHRlcnMgdG8gdGhlIHZpZXdlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdEZpbHRlcnMoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLSAgICAgICAgdmlld2VyLmFkZEZpbHRlcihwYXR0ZXJuRmlsdGVyKTsKLSAgICAgICAgdmlld2VyLmFkZEZpbHRlcih3b3JraW5nU2V0RmlsdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgbGlua2luZyBlbmFibGVkIHNldHRpbmcgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdExpbmtpbmdFbmFibGVkKCkgewotICAgICAgICAvLyBUcnkgdGhlIGRpYWxvZyBzZXR0aW5ncyBmaXJzdCwgd2hpY2ggcmVtZW1iZXIgdGhlIGxhc3QgY2hvaWNlLgotICAgICAgICBTdHJpbmcgc2V0dGluZyA9IHNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cy5MSU5LX05BVklHQVRPUl9UT19FRElUT1IpOwotICAgICAgICBpZiAoc2V0dGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5raW5nRW5hYmxlZCA9IHNldHRpbmcuZXF1YWxzKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBJZiBub3QgaW4gdGhlIGRpYWxvZyBzZXR0aW5ncywgY2hlY2sgdGhlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHRoZSBkZWZhdWx0IHNldHRpbmcuIAotICAgICAgICAvLyBVc2UgdGhlIFVJIHBsdWdpbidzIHByZWZlcmVuY2Ugc3RvcmUgc2luY2UgdGhpcyBpcyBhIHB1YmxpYyBwcmVmZXJlbmNlLgotICAgICAgICBBYnN0cmFjdFVJUGx1Z2luIHVpUGx1Z2luID0gKEFic3RyYWN0VUlQbHVnaW4pIFBsYXRmb3JtCi0gICAgICAgICAgICAgICAgLmdldFBsdWdpbihQbGF0Zm9ybVVJLlBMVUdJTl9JRCk7Ci0gICAgICAgIGxpbmtpbmdFbmFibGVkID0gdWlQbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cy5MSU5LX05BVklHQVRPUl9UT19FRElUT1IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGxpc3RlbmVycyB0byB0aGUgdmlld2VyLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2aWV3ZXIgdGhlIHZpZXdlcgotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TGlzdGVuZXJzKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0gICAgICAgIHZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGhhbmRsZURvdWJsZUNsaWNrKGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHZpZXdlci5hZGRPcGVuTGlzdGVuZXIobmV3IElPcGVuTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvcGVuKE9wZW5FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGhhbmRsZU9wZW4oZXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlS2V5UHJlc3NlZChldmVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlS2V5UmVsZWFzZWQoZXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hQYXJ0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0KLSAgICAgICAgSVdvcmtpbmdTZXRNYW5hZ2VyIHdvcmtpbmdTZXRNYW5hZ2VyID0gZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0V29ya2luZ1NldE1hbmFnZXIoKTsKLSAgICAgICAgd29ya2luZ1NldE1hbmFnZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotICAgICAgICBpZiAoZ2V0QWN0aW9uR3JvdXAoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRBY3Rpb25Hcm91cCgpLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotICAgICAgICBpZiAoZHJhZ0RldGVjdExpc3RlbmVyICE9IG51bGwgJiYgY29udHJvbCAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgY29udHJvbC5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULkRyYWdEZXRlY3QsIGRyYWdEZXRlY3RMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGVkaXRvciBoYXMgYmVlbiBhY3RpdmF0ZWQuICBTZXRzIHRoZSBzZWxlY3Rpb24gaW4gdGhpcyBuYXZpZ2F0b3IKLSAgICAgKiB0byBiZSB0aGUgZWRpdG9yJ3MgaW5wdXQsIGlmIGxpbmtpbmcgaXMgZW5hYmxlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWRpdG9yIHRoZSBhY3RpdmUgZWRpdG9yCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGVkaXRvckFjdGl2YXRlZChJRWRpdG9yUGFydCBlZGl0b3IpIHsKLSAgICAgICAgaWYgKCFpc0xpbmtpbmdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElGaWxlIGZpbGUgPSBSZXNvdXJjZVV0aWwuZ2V0RmlsZShlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIElTZWxlY3Rpb24gbmV3U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsZSk7Ci0gICAgICAgICAgICBpZiAoZ2V0VHJlZVZpZXdlcigpLmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXdTZWxlY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgZ2V0VHJlZVZpZXdlcigpLmdldFRyZWUoKS5zaG93U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgYWJvdXQgdG8gb3Blbi4KLSAgICAgKiBEZWxlZ2F0ZXMgdG8gdGhlIGFjdGlvbiBncm91cCB1c2luZyB0aGUgdmlld2VyJ3Mgc2VsZWN0aW9uIGFzIHRoZSBhY3Rpb24gY29udGV4dC4KLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Vmlld2VyKCkKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGdldEFjdGlvbkdyb3VwKCkuc2V0Q29udGV4dChuZXcgQWN0aW9uQ29udGV4dChzZWxlY3Rpb24pKTsKLSAgICAgICAgZ2V0QWN0aW9uR3JvdXAoKS5maWxsQ29udGV4dE1lbnUobWVudSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElSZXNvdXJjZU5hdmlnYXRvclBhcnQKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHVibGljIEZyYW1lTGlzdCBnZXRGcmFtZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBmcmFtZUxpc3Q7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFJldHVybnMgdGhlIGluaXRpYWwgaW5wdXQgZm9yIHRoZSB2aWV3ZXIuCi0gICAgICogVHJpZXMgdG8gY29udmVydCB0aGUgcGFnZSBpbnB1dCB0byBhIHJlc291cmNlLCBlaXRoZXIgZGlyZWN0bHkgb3IgdmlhIElBZGFwdGFibGUuCi0gICAgICogSWYgdGhlIHJlc291cmNlIGlzIGEgY29udGFpbmVyLCBpdCB1c2VzIHRoYXQuCi0gICAgICogSWYgdGhlIHJlc291cmNlIGlzIGEgZmlsZSwgaXQgdXNlcyBpdHMgcGFyZW50IGZvbGRlci4KLSAgICAgKiBJZiBhIHJlc291cmNlIGNvdWxkIG5vdCBiZSBvYnRhaW5lZCwgaXQgdXNlcyB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHByb3RlY3RlZCBJQWRhcHRhYmxlIGdldEluaXRpYWxJbnB1dCgpIHsKLSAgICAgICAgSUFkYXB0YWJsZSBpbnB1dCA9IGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIElSZXNvdXJjZS5GSUxFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2UuRk9MREVSOgotICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlLlBST0pFQ1Q6Ci0gICAgICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2UuUk9PVDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChJQ29udGFpbmVyKSByZXNvdXJjZTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIHJlc291cmNlIHR5cGUuICBGYWxsIHRocm91Z2guCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXR0ZXJuIGZpbHRlciBmb3IgdGhpcyB2aWV3LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcGF0dGVybiBmaWx0ZXIKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlUGF0dGVybkZpbHRlciBnZXRQYXR0ZXJuRmlsdGVyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wYXR0ZXJuRmlsdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdvcmtpbmcgc2V0IGZvciB0aGlzIHZpZXcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB3b3JraW5nIHNldAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtpbmdTZXQgZ2V0V29ya2luZ1NldCgpIHsKLSAgICAgICAgcmV0dXJuIHdvcmtpbmdTZXRGaWx0ZXIuZ2V0V29ya2luZ1NldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hdmlnYXRvcidzIHBsdWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RVSVBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0gICAgICAgIHJldHVybiBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNvcnRlci4KLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlU29ydGVyIGdldFNvcnRlcigpIHsKLSAgICAgICAgcmV0dXJuIChSZXNvdXJjZVNvcnRlcikgZ2V0VHJlZVZpZXdlcigpLmdldFNvcnRlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHZpZXdlciB3aGljaCBzaG93cyB0aGUgcmVzb3VyY2UgaGllcmFyY2h5LgotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJlZVZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0gICAgICAgIHJldHVybiB2aWV3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHJlZSB2aWV3ZXIgd2hpY2ggc2hvd3MgdGhlIHJlc291cmNlIGhpZXJhcmNoeS4KLSAgICAgKiBAcmV0dXJuIHRoZSB0cmVlIHZpZXdlcgotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkgewotICAgICAgICByZXR1cm4gdmlld2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoZWxsIHRvIHVzZSBmb3Igb3BlbmluZyBkaWFsb2dzLgotICAgICAqIFVzZWQgaW4gdGhpcyBjbGFzcywgYW5kIGluIHRoZSBhY3Rpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNoZWxsCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIGdldFZpZXdTaXRlKCkuZ2V0U2hlbGwoKQotICAgICAqLwotICAgIHB1YmxpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZpZXdTaXRlKCkuZ2V0U2hlbGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhlIHN0YXR1cyBsaW5lLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24KLSAgICAgKiBAcmV0dXJuIHRoZSBzdGF0dXMgbGluZSBtZXNzYWdlCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3RhdHVzTGluZU1lc3NhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChJUmVzb3VyY2UpIG8pLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuUmVzb3VyY2VOYXZpZ2F0b3Jfb25lSXRlbVNlbGVjdGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuUmVzb3VyY2VOYXZpZ2F0b3Jfc3RhdHVzTGluZSwgU3RyaW5nLnZhbHVlT2Yoc2VsZWN0aW9uLnNpemUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgZm9yIHRoZSBnaXZlbiBlbGVtZW50LgotICAgICAqIFVzZWQgYXMgdGhlIG5hbWUgZm9yIHRoZSBjdXJyZW50IGZyYW1lLiAKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RnJhbWVOYW1lKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSAKLSAgICAgICAgICAgIHJldHVybiAoKElSZXNvdXJjZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgdGV4dCA9ICgoSUxhYmVsUHJvdmlkZXIpIGdldFRyZWVWaWV3ZXIoKS5nZXRMYWJlbFByb3ZpZGVyKCkpCi0gICAgICAgIC5nZXRUZXh0KGVsZW1lbnQpOwotICAgICAgICBpZih0ZXh0ID09IG51bGwpCi0gICAgICAgIAlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0b29sIHRpcCB0ZXh0IGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4KLSAgICAgKiBVc2VkIGFzIHRoZSB0b29sIHRpcCB0ZXh0IGZvciB0aGUgY3VycmVudCBmcmFtZSwgYW5kIGZvciB0aGUgdmlldyB0aXRsZSB0b29sdGlwLgotICAgICAqLwotICAgIFN0cmluZyBnZXRGcmFtZVRvb2xUaXBUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICBJUGF0aCBwYXRoID0gKChJUmVzb3VyY2UpIGVsZW1lbnQpLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgICAgICBpZiAocGF0aC5pc1Jvb3QoKSkgCi0gICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuUmVzb3VyY2VNYW5hZ2VyX3Rvb2xUaXA7Ci0gICAgICAgICAgICByZXR1cm4gcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotICAgICAgICB9IAotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHRleHQgPSAoKElMYWJlbFByb3ZpZGVyKSBnZXRUcmVlVmlld2VyKCkuZ2V0TGFiZWxQcm92aWRlcigpKQotICAgICAgICAJLmdldFRleHQoZWxlbWVudCk7Ci0gICAgICAgIGlmKHRleHQgPT0gbnVsbCkKLSAgICAgICAgCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYW4gb3BlbiBldmVudCBmcm9tIHRoZSB2aWV3ZXIuCi0gICAgICogT3BlbnMgYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBmaWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgb3BlbiBldmVudAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVPcGVuKE9wZW5FdmVudCBldmVudCkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICBnZXRBY3Rpb25Hcm91cCgpLnJ1bkRlZmF1bHRBY3Rpb24oc2VsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIGEgZG91YmxlLWNsaWNrIGV2ZW50IGZyb20gdGhlIHZpZXdlci4KLSAgICAgKiBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIGZvbGRlciB3aGVuIGRvdWJsZS1jbGlja2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgZG91YmxlLWNsaWNrIGV2ZW50Ci0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgLy8gMUdCWklBMDogSVRQVUk6V0lOMjAwMCAtIERvdWJsZS1jbGlja2luZyBpbiBuYXZpZ2F0b3Igc2hvdWxkIGV4cGFuZC9jb2xsYXBzZSBjb250YWluZXJzCi0gICAgICAgIFRyZWVWaWV3ZXIgdmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOwotICAgICAgICBpZiAodmlld2VyLmlzRXhwYW5kYWJsZShlbGVtZW50KSkgewotICAgICAgICAgICAgdmlld2VyLnNldEV4cGFuZGVkU3RhdGUoZWxlbWVudCwgIXZpZXdlci5nZXRFeHBhbmRlZFN0YXRlKGVsZW1lbnQpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IGZyb20gdGhlIHZpZXdlci4KLSAgICAgKiBVcGRhdGVzIHRoZSBzdGF0dXMgbGluZSBhbmQgdGhlIGFjdGlvbiBiYXJzLCBhbmQgbGlua3MgdG8gZWRpdG9yIChpZiBvcHRpb24gZW5hYmxlZCkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBzZWxlY3Rpb24gZXZlbnQKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgdXBkYXRlU3RhdHVzTGluZShzZWwpOwotICAgICAgICB1cGRhdGVBY3Rpb25CYXJzKHNlbCk7Ci0gICAgICAgIGRyYWdEZXRlY3RlZCA9IGZhbHNlOwotICAgICAgICBpZiAoaXNMaW5raW5nRW5hYmxlZCgpICYmICFsaW5rU2NoZWR1bGVkKSB7Ci0gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBpZiBhbm90aGVyIHNlbGVjdGlvbiBjaGFuZ2UgYXJyaXZlcyB3aGlsZSB3ZSdyZSB3YWl0aW5nIGZvciB0aGUgKnN5bmNFeGVjLAotICAgICAgICAgICAgLy8gd2Ugb25seSBkbyB0aGlzIHdvcmsgb25jZS4KLSAgICAgICAgICAgIGxpbmtTY2hlZHVsZWQgPSB0cnVlOwotICAgICAgICAgICAgZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gdGVsbGluZyB3aGF0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgc3luY0V4ZWMgd2FzIHNjaGVkdWxlZC4KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHdpZGdldHMgaGF2ZW4ndCBiZWVuIGRpc3Bvc2VkLgotICAgICAgICAgICAgICAgICAgICBsaW5rU2NoZWR1bGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAodmlld2VyID09IG51bGwgfHwgdmlld2VyLmdldENvbnRyb2woKSA9PSBudWxsIHx8IHZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChkcmFnRGV0ZWN0ZWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgc3luY2hyb25pemUgd2l0aCBlZGl0b3Igd2hlbiB0aGUgc2VsZWN0aW9uIGlzIG5vdCB0aGUgcmVzdWx0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGEgZHJhZy4gRml4ZXMgYnVnIDIyMjc0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUb0VkaXRvcihzZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIGEga2V5IHByZXNzIGV2ZW50IGZyb20gdGhlIHZpZXdlci4KLSAgICAgKiBEZWxlZ2F0ZXMgdG8gdGhlIGFjdGlvbiBncm91cC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGtleSBldmVudAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVLZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGdldEFjdGlvbkdyb3VwKCkuaGFuZGxlS2V5UHJlc3NlZChldmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIGtleSByZWxlYXNlIGluIHRoZSB2aWV3ZXIuICBEb2VzIG5vdGhpbmcgYnkgZGVmYXVsdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGtleSBldmVudAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVLZXlSZWxlYXNlZChLZXlFdmVudCBldmVudCkgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVZpZXdQYXJ0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUsIElNZW1lbnRvIG1lbWVudG8pIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQoc2l0ZSwgbWVtZW50byk7Ci0gICAgICAgIHRoaXMubWVtZW50byA9IG1lbWVudG87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBkcmFnIGFuZCBkcm9wIHN1cHBvcnQgdG8gdGhlIG5hdmlnYXRvci4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdERyYWdBbmREcm9wKCkgewotICAgICAgICBpbnQgb3BzID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkU7Ci0gICAgICAgIFRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10gewotICAgICAgICAgICAgICAgIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICBSZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCksIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgIFBsdWdpblRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLSAgICAgICAgVHJlZVZpZXdlciB2aWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7Ci0gICAgICAgIHZpZXdlci5hZGREcmFnU3VwcG9ydChvcHMsIHRyYW5zZmVycywgbmV3IE5hdmlnYXRvckRyYWdBZGFwdGVyKHZpZXdlcikpOwotICAgICAgICBOYXZpZ2F0b3JEcm9wQWRhcHRlciBhZGFwdGVyID0gbmV3IE5hdmlnYXRvckRyb3BBZGFwdGVyKHZpZXdlcik7Ci0gICAgICAgIGFkYXB0ZXIuc2V0RmVlZGJhY2tFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdmlld2VyLmFkZERyb3BTdXBwb3J0KG9wcyB8IERORC5EUk9QX0RFRkFVTFQsIHRyYW5zZmVycywgYWRhcHRlcik7Ci0gICAgICAgIGRyYWdEZXRlY3RMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgZHJhZ0RldGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5hZGRMaXN0ZW5lcihTV1QuRHJhZ0RldGVjdCwgZHJhZ0RldGVjdExpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBmcmFtZSBzb3VyY2UgYW5kIGZyYW1lIGxpc3QsIGFuZCBjb25uZWN0cyB0aGVtLgotICAgICAqIAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRnJhbWVMaXN0IGNyZWF0ZUZyYW1lTGlzdCgpIHsKLSAgICAgICAgTmF2aWdhdG9yRnJhbWVTb3VyY2UgZnJhbWVTb3VyY2UgPSBuZXcgTmF2aWdhdG9yRnJhbWVTb3VyY2UodGhpcyk7Ci0gICAgICAgIEZyYW1lTGlzdCBmcmFtZUxpc3QgPSBuZXcgRnJhbWVMaXN0KGZyYW1lU291cmNlKTsKLSAgICAgICAgZnJhbWVTb3VyY2UuY29ubmVjdFRvKGZyYW1lTGlzdCk7Ci0gICAgICAgIHJldHVybiBmcmFtZUxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIHNvcnRlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVzb3VyY2VTb3J0ZXIoKSB7Ci0gICAgICAgIGludCBzb3J0VHlwZSA9IFJlc291cmNlU29ydGVyLk5BTUU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgc29ydEludCA9IDA7Ci0gICAgICAgICAgICBpZiAobWVtZW50byAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNvcnRTdHIgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfU09SVEVSKTsKLSAgICAgICAgICAgICAgICBpZiAoc29ydFN0ciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzb3J0SW50ID0gbmV3IEludGVnZXIoc29ydFN0cikuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc29ydEludCA9IHNldHRpbmdzLmdldEludChTVE9SRV9TT1JUX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNvcnRJbnQgPT0gUmVzb3VyY2VTb3J0ZXIuTkFNRQotICAgICAgICAgICAgICAgICAgICB8fCBzb3J0SW50ID09IFJlc291cmNlU29ydGVyLlRZUEUpCi0gICAgICAgICAgICAgICAgc29ydFR5cGUgPSBzb3J0SW50OwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHNldFNvcnRlcihuZXcgUmVzb3VyY2VTb3J0ZXIoc29ydFR5cGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlcyB0aGUgd29ya2luZyBzZXQgZmlsdGVyIGZyb20gdGhlIHBlcnNpc3RlbmNlIHN0b3JlLgotICAgICAqLwotICAgIHZvaWQgaW5pdFdvcmtpbmdTZXRGaWx0ZXIoKSB7Ci0gICAgICAgIFN0cmluZyB3b3JraW5nU2V0TmFtZSA9IHNldHRpbmdzLmdldChTVE9SRV9XT1JLSU5HX1NFVCk7Ci0KLSAgICAgICAgSVdvcmtpbmdTZXQgd29ya2luZ1NldCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiAod29ya2luZ1NldE5hbWUgIT0gbnVsbCAmJiB3b3JraW5nU2V0TmFtZS5lcXVhbHMoIiIpID09IGZhbHNlKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUlXb3JraW5nU2V0TWFuYWdlciB3b3JraW5nU2V0TWFuYWdlciA9IGdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRXb3JraW5nU2V0TWFuYWdlcigpOwotCQkJd29ya2luZ1NldCA9IHdvcmtpbmdTZXRNYW5hZ2VyLmdldFdvcmtpbmdTZXQod29ya2luZ1NldE5hbWUpOwotCQl9IGVsc2UgaWYgKFBsYXRmb3JtVUkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuZ2V0Qm9vbGVhbigKLQkJCQkJCUlXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLlVTRV9XSU5ET1dfV09SS0lOR19TRVRfQllfREVGQVVMVCkpIHsKLQkJCS8vIHVzZSB0aGUgd2luZG93IHNldCBieSBkZWZhdWx0IGlmIHRoZSBnbG9iYWwgcHJlZmVyZW5jZSBpcyBzZXQKLQkJCXdvcmtpbmdTZXQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFnZ3JlZ2F0ZVdvcmtpbmdTZXQoKTsKLQkJfQotCi0JCWlmICh3b3JraW5nU2V0ICE9IG51bGwpIHsKLQkJCS8vIE9ubHkgaW5pdGlhbGl6ZSBmaWx0ZXIuIERvbid0IHNldCB3b3JraW5nIHNldCBpbnRvIHZpZXdlci4KLQkJCS8vIFdvcmtpbmcgc2V0IGlzIHNldCB2aWEgV29ya2luZ1NldEZpbHRlckFjdGlvbkdyb3VwCi0JCQkvLyBkdXJpbmcgYWN0aW9uIGNyZWF0aW9uLgotCQkJd29ya2luZ1NldEZpbHRlci5zZXRXb3JraW5nU2V0KHdvcmtpbmdTZXQpOwotCQkJaW50ZXJuYWxTZXRXb3JraW5nU2V0KHdvcmtpbmdTZXQpOwotCQl9Ci0gICAgfQotCi0gICAgLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBuYXZpZ2F0b3Igc2VsZWN0aW9uIGF1dG9tYXRpY2FsbHkgdHJhY2tzIHRoZSBhY3RpdmUKLQkgKiBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBsaW5raW5nIGlzIGVuYWJsZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgaWYgbm90Ci0JICogQHNpbmNlIDIuMCAodGhpcyB3YXMgcHJvdGVjdGVkIGluIDIuMCwgYnV0IHdhcyBtYWRlIHB1YmxpYyBpbiAyLjEpCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaW5raW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGxpbmtpbmdFbmFibGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJyaW5ncyB0aGUgY29ycmVzcG9uZGluZyBlZGl0b3IgdG8gdG9wIGlmIHRoZSBzZWxlY3RlZCByZXNvdXJjZSBpcyBvcGVuLgotICAgICAqIAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsaW5rVG9FZGl0b3IoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0KLSAgICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgb2JqOwotICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldFNpdGUoKS5nZXRQYWdlKCk7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBSZXNvdXJjZVV0aWwuZmluZEVkaXRvcihwYWdlLCBmaWxlKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhZ2UuYnJpbmdUb1RvcChlZGl0b3IpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjdGlvbiBncm91cCwgd2hpY2ggZW5jYXBzdWxhdGVzIGFsbCBhY3Rpb25zIGZvciB0aGUgdmlldy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucygpIHsKLSAgICAgICAgc2V0QWN0aW9uR3JvdXAobmV3IE1haW5BY3Rpb25Hcm91cCh0aGlzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWlncmF0ZXMgdGhlIGRpYWxvZyBzZXR0aW5ncyBmcm9tIHRoZSBVSSBwbHVnaW4gc3RvcmUgdG8gdGhlIAotICAgICAqIFZpZXdzIHBsdWdpbiBzdG9yZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbWlncmF0ZURpYWxvZ1NldHRpbmdzKCkgewotICAgICAgICBBYnN0cmFjdFVJUGx1Z2luIHVpUGx1Z2luID0gKEFic3RyYWN0VUlQbHVnaW4pIFBsYXRmb3JtCi0gICAgICAgICAgICAgICAgLmdldFBsdWdpbihQbGF0Zm9ybVVJLlBMVUdJTl9JRCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB1aVNldHRpbmdzID0gdWlQbHVnaW4uZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQotICAgICAgICB1aVNldHRpbmdzID0gdWlTZXR0aW5ncy5nZXRTZWN0aW9uKFNUT1JFX1NFQ1RJT04pOwotICAgICAgICBpZiAodWlTZXR0aW5ncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgd29ya2luZ1NldE5hbWUgPSB1aVNldHRpbmdzLmdldChTVE9SRV9XT1JLSU5HX1NFVCk7Ci0gICAgICAgICAgICBpZiAod29ya2luZ1NldE5hbWUgIT0gbnVsbCAmJiB3b3JraW5nU2V0TmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5wdXQoU1RPUkVfV09SS0lOR19TRVQsIHdvcmtpbmdTZXROYW1lKTsKLSAgICAgICAgICAgICAgICB1aVNldHRpbmdzLnB1dChTVE9SRV9XT1JLSU5HX1NFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgc29ydFR5cGUgPSB1aVNldHRpbmdzLmdldChTVE9SRV9TT1JUX1RZUEUpOwotICAgICAgICAgICAgaWYgKHNvcnRUeXBlICE9IG51bGwgJiYgc29ydFR5cGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KFNUT1JFX1NPUlRfVFlQRSwgc29ydFR5cGUpOwotICAgICAgICAgICAgICAgIHVpU2V0dGluZ3MucHV0KFNUT1JFX1NPUlRfVFlQRSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlcyB0aGUgc2F2ZWQgZmlsdGVyIHNldHRpbmdzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlRmlsdGVycygpIHsKLSAgICAgICAgSU1lbWVudG8gZmlsdGVyc01lbSA9IG1lbWVudG8uZ2V0Q2hpbGQoVEFHX0ZJTFRFUlMpOwotCi0gICAgICAgIGlmIChmaWx0ZXJzTWVtICE9IG51bGwpIHsgLy9maWx0ZXJzIGhhdmUgYmVlbiBkZWZpbmVkCi0gICAgICAgICAgICBJTWVtZW50byBjaGlsZHJlbltdID0gZmlsdGVyc01lbS5nZXRDaGlsZHJlbihUQUdfRklMVEVSKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgaWYgZmlyc3QgZWxlbWVudCBoYXMgbmV3IHRhZyBkZWZpbmVkLCBpbmRpY2F0ZXMgbmV3IHZlcnNpb24KLSAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwCi0gICAgICAgICAgICAgICAgICAgICYmIGNoaWxkcmVuWzBdLmdldFN0cmluZyhUQUdfSVNfRU5BQkxFRCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBzZWxlY3RlZEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHVuU2VsZWN0ZWRGaWx0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLmdldFN0cmluZyhUQUdfSVNfRU5BQkxFRCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHRydWUpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmlsdGVycy5hZGQoY2hpbGRyZW5baV0uZ2V0U3RyaW5nKFRBR19FTEVNRU5UKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxlZCA9PSBmYWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdW5TZWxlY3RlZEZpbHRlcnMuYWRkKGNoaWxkcmVuW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoVEFHX0VMRU1FTlQpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBtZXJnZSBmaWx0ZXJzIGZyb20gTWVtZW50byB3aXRoIHNlbGVjdGVkID0gdHJ1ZSBmaWx0ZXJzIGZyb20gcGx1Z2lucwotICAgICAgICAgICAgICAgICAqIGVuc3VyZSB0aGVyZSBhcmUgbm8gZHVwbGljYXRlcyAmIGRvbid0IG92ZXJyaWRlIHVzZXIgcHJlZmVyZW5jZXMJICovCi0gICAgICAgICAgICAgICAgTGlzdCBwbHVnaW5GaWx0ZXJzID0gRmlsdGVyc0NvbnRlbnRQcm92aWRlci5nZXREZWZhdWx0RmlsdGVycygpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHBsdWdpbkZpbHRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRGaWx0ZXJzLmNvbnRhaW5zKGVsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXVuU2VsZWN0ZWRGaWx0ZXJzLmNvbnRhaW5zKGVsZW1lbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWx0ZXJzLmFkZChlbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL0NvbnZlcnQgdG8gYW4gYXJyYXkgb2YgU3RyaW5ncwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhdHRlcm5BcnJheSA9IG5ldyBTdHJpbmdbc2VsZWN0ZWRGaWx0ZXJzLnNpemUoKV07Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWx0ZXJzLnRvQXJyYXkocGF0dGVybkFycmF5KTsKLSAgICAgICAgICAgICAgICBnZXRQYXR0ZXJuRmlsdGVyKCkuc2V0UGF0dGVybnMocGF0dGVybkFycmF5KTsKLQotICAgICAgICAgICAgfSBlbHNlIHsgLy9maWx0ZXJzIGRlZmluZWQsIG9sZCB2ZXJzaW9uOiBpZ25vcmUgZmlsdGVycyBmcm9tIHBsdWdpbnMKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsdGVyc1tdID0gbmV3IFN0cmluZ1tjaGlsZHJlbi5sZW5ndGhdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1tpXSA9IGNoaWxkcmVuW2ldLmdldFN0cmluZyhUQUdfRUxFTUVOVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdldFBhdHRlcm5GaWx0ZXIoKS5zZXRQYXR0ZXJucyhmaWx0ZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgLy9ubyBmaWx0ZXJzIGRlZmluZWQsIG9sZCB2ZXJzaW9uOiBpZ25vcmUgZmlsdGVycyBmcm9tIHBsdWdpbnMKLSAgICAgICAgICAgIGdldFBhdHRlcm5GaWx0ZXIoKS5zZXRQYXR0ZXJucyhuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgcmVjZWl2ZXIgdG8gdGhlIHN0YXRlIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIG1lbWVudG8uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVtZW50byB0aGUgbWVtZW50bwotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotICAgICAgICBUcmVlVmlld2VyIHZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKLSAgICAgICAgSU1lbWVudG8gZnJhbWVNZW1lbnRvID0gbWVtZW50by5nZXRDaGlsZChUQUdfQ1VSUkVOVF9GUkFNRSk7Ci0KLSAgICAgICAgaWYgKGZyYW1lTWVtZW50byAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUcmVlRnJhbWUgZnJhbWUgPSBuZXcgVHJlZUZyYW1lKHZpZXdlcik7Ci0gICAgICAgICAgICBmcmFtZS5yZXN0b3JlU3RhdGUoZnJhbWVNZW1lbnRvKTsKLSAgICAgICAgICAgIGZyYW1lLnNldE5hbWUoZ2V0RnJhbWVOYW1lKGZyYW1lLmdldElucHV0KCkpKTsKLSAgICAgICAgICAgIGZyYW1lLnNldFRvb2xUaXBUZXh0KGdldEZyYW1lVG9vbFRpcFRleHQoZnJhbWUuZ2V0SW5wdXQoKSkpOwotICAgICAgICAgICAgdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmcmFtZS5nZXRJbnB1dCgpKSk7Ci0gICAgICAgICAgICBmcmFtZUxpc3QuZ290b0ZyYW1lKGZyYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIElDb250YWluZXIgY29udGFpbmVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgICAgIElNZW1lbnRvIGNoaWxkTWVtID0gbWVtZW50by5nZXRDaGlsZChUQUdfRVhQQU5ERUQpOwotICAgICAgICAgICAgaWYgKGNoaWxkTWVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgSU1lbWVudG9bXSBlbGVtZW50TWVtID0gY2hpbGRNZW0uZ2V0Q2hpbGRyZW4oVEFHX0VMRU1FTlQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudE1lbS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGNvbnRhaW5lci5maW5kTWVtYmVyKGVsZW1lbnRNZW1baV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKFRBR19QQVRIKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZChlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2aWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhlbGVtZW50cy50b0FycmF5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hpbGRNZW0gPSBtZW1lbnRvLmdldENoaWxkKFRBR19TRUxFQ1RJT04pOwotICAgICAgICAgICAgaWYgKGNoaWxkTWVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBJTWVtZW50b1tdIGVsZW1lbnRNZW0gPSBjaGlsZE1lbS5nZXRDaGlsZHJlbihUQUdfRUxFTUVOVCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50TWVtLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gY29udGFpbmVyLmZpbmRNZW1iZXIoZWxlbWVudE1lbVtpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoVEFHX1BBVEgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlcyB0aGUgbGlua2luZyBlbmFibGVkIHN0YXRlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlTGlua2luZ0VuYWJsZWQoKSB7Ci0gICAgICAgIEludGVnZXIgdmFsID0gbWVtZW50bwotICAgICAgICAgICAgICAgIC5nZXRJbnRlZ2VyKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLkxJTktfTkFWSUdBVE9SX1RPX0VESVRPUik7Ci0gICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgbGlua2luZ0VuYWJsZWQgPSB2YWwuaW50VmFsdWUoKSAhPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCQotICAgICAqIEBzZWUgVmlld1BhcnQjc2F2ZVN0YXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgVHJlZVZpZXdlciB2aWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7Ci0gICAgICAgIGlmICh2aWV3ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHRoaXMubWVtZW50byAhPSBudWxsKSAvL0tlZXAgdGhlIG9sZCBzdGF0ZTsKLSAgICAgICAgICAgICAgICBtZW1lbnRvLnB1dE1lbWVudG8odGhpcy5tZW1lbnRvKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2F2ZSBzb3J0ZXIKLSAgICAgICAgbWVtZW50by5wdXRJbnRlZ2VyKFRBR19TT1JURVIsIGdldFNvcnRlcigpLmdldENyaXRlcmlhKCkpOwotCi0gICAgICAgIC8vc2F2ZSBmaWx0ZXJzCi0gICAgICAgIFN0cmluZyBmaWx0ZXJzW10gPSBnZXRQYXR0ZXJuRmlsdGVyKCkuZ2V0UGF0dGVybnMoKTsKLSAgICAgICAgTGlzdCBzZWxlY3RlZEZpbHRlcnMgPSBBcnJheXMuYXNMaXN0KGZpbHRlcnMpOwotICAgICAgICBMaXN0IGFsbEZpbHRlcnMgPSBGaWx0ZXJzQ29udGVudFByb3ZpZGVyLmdldERlZmluZWRGaWx0ZXJzKCk7Ci0gICAgICAgIElNZW1lbnRvIGZpbHRlcnNNZW0gPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKFRBR19GSUxURVJTKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYWxsRmlsdGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBJTWVtZW50byBjaGlsZCA9IGZpbHRlcnNNZW0uY3JlYXRlQ2hpbGQoVEFHX0ZJTFRFUik7Ci0gICAgICAgICAgICBjaGlsZC5wdXRTdHJpbmcoVEFHX0VMRU1FTlQsIGVsZW1lbnQpOwotICAgICAgICAgICAgY2hpbGQucHV0U3RyaW5nKFRBR19JU19FTkFCTEVELCBTdHJpbmcudmFsdWVPZihzZWxlY3RlZEZpbHRlcnMKLSAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKGVsZW1lbnQpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZnJhbWVMaXN0LmdldEN1cnJlbnRJbmRleCgpID4gMCkgewotICAgICAgICAgICAgLy9zYXZlIGZyYW1lLCBpdCdzIG5vdCB0aGUgImhvbWUiL3dvcmtzcGFjZSBmcmFtZQotICAgICAgICAgICAgVHJlZUZyYW1lIGN1cnJlbnRGcmFtZSA9IChUcmVlRnJhbWUpIGZyYW1lTGlzdC5nZXRDdXJyZW50RnJhbWUoKTsKLSAgICAgICAgICAgIElNZW1lbnRvIGZyYW1lTWVtZW50byA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoVEFHX0NVUlJFTlRfRlJBTUUpOwotICAgICAgICAgICAgY3VycmVudEZyYW1lLnNhdmVTdGF0ZShmcmFtZU1lbWVudG8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9zYXZlIHZpc2libGUgZXhwYW5kZWQgZWxlbWVudHMKLSAgICAgICAgICAgIE9iamVjdCBleHBhbmRlZEVsZW1lbnRzW10gPSB2aWV3ZXIuZ2V0VmlzaWJsZUV4cGFuZGVkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGlmIChleHBhbmRlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBJTWVtZW50byBleHBhbmRlZE1lbSA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoVEFHX0VYUEFOREVEKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGFuZGVkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGFuZGVkRWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElNZW1lbnRvIGVsZW1lbnRNZW0gPSBleHBhbmRlZE1lbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ2hpbGQoVEFHX0VMRU1FTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE1lbS5wdXRTdHJpbmcoVEFHX1BBVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVJlc291cmNlKSBleHBhbmRlZEVsZW1lbnRzW2ldKS5nZXRGdWxsUGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9zYXZlIHNlbGVjdGlvbgotICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnRzW10gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIC50b0FycmF5KCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIElNZW1lbnRvIHNlbGVjdGlvbk1lbSA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoVEFHX1NFTEVDVElPTik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElNZW1lbnRvIGVsZW1lbnRNZW0gPSBzZWxlY3Rpb25NZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNoaWxkKFRBR19FTEVNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRNZW0ucHV0U3RyaW5nKFRBR19QQVRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElSZXNvdXJjZSkgZWxlbWVudHNbaV0pLmdldEZ1bGxQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzYXZlTGlua2luZ0VuYWJsZWQobWVtZW50byk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIGxpbmtpbmcgZW5hYmxlZCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2F2ZUxpbmtpbmdFbmFibGVkKElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgbWVtZW50by5wdXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLkxJTktfTkFWSUdBVE9SX1RPX0VESVRPUiwKLSAgICAgICAgICAgICAgICBsaW5raW5nRW5hYmxlZCA/IDEgOiAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIGFuZCByZXZlYWxzIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0UmV2ZWFsKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IGNvbnZlcnRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICAgICAgaWYgKCFzc2VsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0gICAgICAgICAgICBnZXRWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oc3NlbCwgdHJ1ZSk7Ci0gICAgICAgICAgICBnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIGZpbHRlcnMgZGVmaW5lZCBhcyBzdHJpbmdzIGluIDxjb2RlPnBhdHRlcm5zPC9jb2RlPiAKLSAgICAgKiBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJzUHJlZmVyZW5jZShTdHJpbmdbXSBwYXR0ZXJucykgewotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSAhPSAwKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChSZXNvdXJjZVBhdHRlcm5GaWx0ZXIuQ09NTUFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChwYXR0ZXJuc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLSAgICAgICAgICAgICAgICBSZXNvdXJjZVBhdHRlcm5GaWx0ZXIuRklMVEVSU19UQUcsIHNiLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIHJlbW92ZSB2YWx1ZSBpbiBvbGQgd29ya2JlbmNoIHByZWZlcmVuY2Ugc3RvcmUgbG9jYXRpb24gCi0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgU3RyaW5nIHN0b3JlZFBhdHRlcm5zID0gcHJlZmVyZW5jZVN0b3JlCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZyhSZXNvdXJjZVBhdHRlcm5GaWx0ZXIuRklMVEVSU19UQUcpOwotICAgICAgICBpZiAoc3RvcmVkUGF0dGVybnMubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgcHJlZmVyZW5jZVN0b3JlLnNldFZhbHVlKFJlc291cmNlUGF0dGVybkZpbHRlci5GSUxURVJTX1RBRywgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIGdldFRyZWVWaWV3ZXIoKS5nZXRUcmVlKCkuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlOiBGb3IgZXhwZXJpbWVudGFsIHVzZSBvbmx5LgotICAgICAqIFNldHMgdGhlIGRlY29yYXRvciBmb3IgdGhlIG5hdmlnYXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBBcyBvZiAyLjAsIHRoaXMgbWV0aG9kIG5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVjb3JhdG9yIGEgbGFiZWwgZGVjb3JhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyBkZWNvcmF0aW9ucy4KLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIGRlY29yYXRvcnMgZXh0ZW5zaW9uIHBvaW50IGluc3RlYWQ7IHNlZSBJV29ya2JlbmNoLmdldERlY29yYXRvck1hbmFnZXIoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsRGVjb3JhdG9yKElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVJlc291cmNlTmF2aWdhdG9yI3NldExpbmtpbmdFbmFibGVkKGJvb2xlYW4pCi0gICAgICogQHNpbmNlIDIuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExpbmtpbmdFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICB0aGlzLmxpbmtpbmdFbmFibGVkID0gZW5hYmxlZDsKLQotICAgICAgICAvLyByZW1lbWJlciB0aGUgbGFzdCBzZXR0aW5nIGluIHRoZSBkaWFsb2cgc2V0dGluZ3MJCQotICAgICAgICBzZXR0aW5ncy5wdXQoSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuTElOS19OQVZJR0FUT1JfVE9fRURJVE9SLAotICAgICAgICAgICAgICAgIGVuYWJsZWQpOwotCi0gICAgICAgIC8vIGlmIHR1cm5pbmcgbGlua2luZyBvbiwgdXBkYXRlIHRoZSBzZWxlY3Rpb24gdG8gY29ycmVzcG9uZCB0byB0aGUgYWN0aXZlIGVkaXRvcgotICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVkaXRvckFjdGl2YXRlZChlZGl0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmVzb3VyY2Ugc29ydGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3J0ZXIgdGhlIHJlc291cmNlIHNvcnRlcgotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3J0ZXIoUmVzb3VyY2VTb3J0ZXIgc29ydGVyKSB7Ci0gICAgICAgIFRyZWVWaWV3ZXIgdmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOwotICAgICAgICBWaWV3ZXJTb3J0ZXIgdmlld2VyU29ydGVyID0gdmlld2VyLmdldFNvcnRlcigpOwotCi0gICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgaWYgKHZpZXdlclNvcnRlciA9PSBzb3J0ZXIpIHsKLSAgICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2aWV3ZXIuc2V0U29ydGVyKHNvcnRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChTVE9SRV9TT1JUX1RZUEUsIHNvcnRlci5nZXRDcml0ZXJpYSgpKTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhlIHNvcnQgYWN0aW9ucycgY2hlY2tlZCBzdGF0ZQotICAgICAgICB1cGRhdGVBY3Rpb25CYXJzKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLklSZXNvdXJjZU5hdmlnYXRvclBhcnQjc2V0V29ya2luZ1NldChJV29ya2luZ1NldCkKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V29ya2luZ1NldChJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0gICAgICAgIFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKLSAgICAgICAgT2JqZWN0W10gZXhwYW5kZWQgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICAKLSAgICAgICAgaW50ZXJuYWxTZXRXb3JraW5nU2V0KHdvcmtpbmdTZXQpOwotICAgICAgICAKLSAgICAgICAgd29ya2luZ1NldEZpbHRlci5zZXRXb3JraW5nU2V0KGVtcHR5V29ya2luZ1NldCA/IG51bGwgOiB3b3JraW5nU2V0KTsKLSAgICAgICAgaWYgKHdvcmtpbmdTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0dGluZ3MucHV0KFNUT1JFX1dPUktJTkdfU0VULCB3b3JraW5nU2V0LmdldE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXR0aW5ncy5wdXQoU1RPUkVfV09SS0lOR19TRVQsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgICAgIHRyZWVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICB0cmVlVmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMoZXhwYW5kZWQpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSA9PSBmYWxzZQotICAgICAgICAgICAgICAgICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgICAgICB0cmVlVmlld2VyLnJldmVhbChzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotCS8qKgotCSAqIFNldCB0aGUgaW50ZXJuYWwgd29ya2luZyBzZXQgZmllbGRzIHNwZWNpZmljIHRvIHRoZSBuYXZpZ2F0b3IuCi0JICogCi0JICogQHBhcmFtIHdvcmtpbmdTZXQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgd29ya2luZyBzZXQKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsU2V0V29ya2luZ1NldChJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0JCXRoaXMud29ya2luZ1NldCA9IHdvcmtpbmdTZXQ7Ci0JCWVtcHR5V29ya2luZ1NldCA9IHdvcmtpbmdTZXQgIT0gbnVsbCAmJiB3b3JraW5nU2V0LmlzQWdncmVnYXRlV29ya2luZ1NldCgpIAotCQkJCSYmIHdvcmtpbmdTZXQuaXNFbXB0eSgpOwotCX0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGFjdGlvbiBiYXIgYWN0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBY3Rpb25CYXJzKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBSZXNvdXJjZU5hdmlnYXRvckFjdGlvbkdyb3VwIGdyb3VwID0gZ2V0QWN0aW9uR3JvdXAoKTsKLSAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdyb3VwLnNldENvbnRleHQobmV3IEFjdGlvbkNvbnRleHQoc2VsZWN0aW9uKSk7Ci0gICAgICAgICAgICBncm91cC51cGRhdGVBY3Rpb25CYXJzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBtZXNzYWdlIHNob3duIGluIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzTGluZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgU3RyaW5nIG1zZyA9IGdldFN0YXR1c0xpbmVNZXNzYWdlKHNlbGVjdGlvbik7Ci0gICAgICAgIGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuc2V0TWVzc2FnZShtc2cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHRpdGxlIHRleHQgYW5kIHRpdGxlIHRvb2wgdGlwLgotICAgICAqIENhbGxlZCB3aGVuZXZlciB0aGUgaW5wdXQgb2YgdGhlIHZpZXdlciBjaGFuZ2VzLgotICAgICAqIENhbGxlZCB3aGVuZXZlciB0aGUgaW5wdXQgb2YgdGhlIHZpZXdlciBjaGFuZ2VzLgotICAgICAqIAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVUaXRsZSgpIHsKLSAgICAgICAgT2JqZWN0IGlucHV0ID0gZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIElXb3JraW5nU2V0IHdvcmtpbmdTZXQgPSB3b3JraW5nU2V0RmlsdGVyLmdldFdvcmtpbmdTZXQoKTsKLQotICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCB8fCBpbnB1dC5lcXVhbHMod29ya3NwYWNlKQotICAgICAgICAgICAgICAgIHx8IGlucHV0LmVxdWFscyh3b3Jrc3BhY2UuZ2V0Um9vdCgpKSkgewotICAgICAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKHdvcmtpbmdTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldFRpdGxlVG9vbFRpcChOTFMuYmluZChSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLlJlc291cmNlTmF2aWdhdG9yX3dvcmtpbmdTZXRUb29sVGlwLCB3b3JraW5nU2V0LmdldExhYmVsKCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0VGl0bGVUb29sVGlwKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IChJTGFiZWxQcm92aWRlcikgZ2V0VHJlZVZpZXdlcigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgICAgICBTdHJpbmcgaW5wdXRUb29sVGlwID0gZ2V0RnJhbWVUb29sVGlwVGV4dChpbnB1dCk7Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChpbnB1dCk7Ci0gICAgICAgICAgICBpZih0ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAJc2V0Q29udGVudERlc2NyaXB0aW9uKHRleHQpOwotICAgICAgICAgICAgaWYgKHdvcmtpbmdTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldFRpdGxlVG9vbFRpcChOTFMuYmluZChSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLlJlc291cmNlTmF2aWdhdG9yX3dvcmtpbmdTZXRJbnB1dFRvb2xUaXAsIGlucHV0VG9vbFRpcCwgd29ya2luZ1NldC5nZXRMYWJlbCgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFRpdGxlVG9vbFRpcChpbnB1dFRvb2xUaXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9uIGdyb3VwLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFjdGlvbiBncm91cAotICAgICAqLwotICAgIHByb3RlY3RlZCBSZXNvdXJjZU5hdmlnYXRvckFjdGlvbkdyb3VwIGdldEFjdGlvbkdyb3VwKCkgewotICAgICAgICByZXR1cm4gYWN0aW9uR3JvdXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYWN0aW9uIGdyb3VwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY3Rpb25Hcm91cCB0aGUgYWN0aW9uIGdyb3VwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QWN0aW9uR3JvdXAoUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb25Hcm91cCBhY3Rpb25Hcm91cCkgewotICAgICAgICB0aGlzLmFjdGlvbkdyb3VwID0gYWN0aW9uR3JvdXA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hQYXJ0I2dldEFkYXB0ZXIoQ2xhc3MpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKGFkYXB0ZXIgPT0gSVNob3dJblNvdXJjZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIGdldFNob3dJblNvdXJjZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZGFwdGVyID09IElTaG93SW5UYXJnZXQuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTaG93SW5UYXJnZXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5JU2hvd0luU291cmNlPC9jb2RlPiBmb3IgdGhpcyB2aWV3LgotICAgICAqLwotICAgIHByb3RlY3RlZCBJU2hvd0luU291cmNlIGdldFNob3dJblNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJU2hvd0luU291cmNlKCkgewotICAgICAgICAgICAgcHVibGljIFNob3dJbkNvbnRleHQgZ2V0U2hvd0luQ29udGV4dCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNob3dJbkNvbnRleHQoZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKSwgZ2V0Vmlld2VyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgPGNvZGU+SVNob3dJblRhcmdldDwvY29kZT4gZm9yIHRoaXMgdmlldy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVNob3dJblRhcmdldCBnZXRTaG93SW5UYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSVNob3dJblRhcmdldCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNob3coU2hvd0luQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHRvU2VsZWN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsID0gY29udGV4dC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzc2VsLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TZWxlY3QuYWRkKG8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSU1hcmtlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSByID0gKChJTWFya2VyKSBvKS5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUk9PVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1NlbGVjdC5hZGQocik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBZGFwdGFibGUgYWRhcHRhYmxlID0gKElBZGFwdGFibGUpIG87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGFkYXB0YWJsZS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TZWxlY3QuYWRkKG8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBhZGFwdGFibGUuZ2V0QWRhcHRlcihJTWFya2VyLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgciA9ICgoSU1hcmtlcikgbykuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUk9PVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU2VsZWN0LmFkZChyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodG9TZWxlY3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBpbnB1dCA9IGNvbnRleHQuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSUFkYXB0YWJsZSBhZGFwdGFibGUgPSAoSUFkYXB0YWJsZSkgaW5wdXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGFkYXB0YWJsZS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU2VsZWN0LmFkZChvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIXRvU2VsZWN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RSZXZlYWwobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odG9TZWxlY3QpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1Jlc291cmNlTmF2aWdhdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1Jlc291cmNlTmF2aWdhdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NGMyYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9SZXNvdXJjZU5hdmlnYXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb247Ci0KLS8qKgotICogU3VwZXJjbGFzcyBvZiBhbGwgYWN0aW9ucyBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgbmF2aWdhdG9yLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiB7Ci0KLSAgICBwcml2YXRlIElSZXNvdXJjZU5hdmlnYXRvciBuYXZpZ2F0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb24oSVJlc291cmNlTmF2aWdhdG9yIG5hdmlnYXRvciwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHN1cGVyKG5hdmlnYXRvci5nZXRWaWV3ZXIoKSwgbGFiZWwpOwotICAgICAgICB0aGlzLm5hdmlnYXRvciA9IG5hdmlnYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBuYXZpZ2F0b3IgZm9yIHdoaWNoIHRoaXMgYWN0aW9uIHdhcyBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBJUmVzb3VyY2VOYXZpZ2F0b3IgZ2V0TmF2aWdhdG9yKCkgewotICAgICAgICByZXR1cm4gbmF2aWdhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHZpZXdlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotICAgICAgICByZXR1cm4gZ2V0TmF2aWdhdG9yKCkuZ2V0Vmlld2VyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hlbGwgdG8gdXNlIHdpdGhpbiBhY3Rpb25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldE5hdmlnYXRvcigpLmdldFNpdGUoKS5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdvcmtiZW5jaC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdvcmtiZW5jaCB3aW5kb3cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgZ2V0V29ya2JlbmNoV2luZG93KCkgewotICAgICAgICByZXR1cm4gZ2V0TmF2aWdhdG9yKCkuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb25Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9SZXNvdXJjZU5hdmlnYXRvckFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWJkOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9SZXNvdXJjZU5hdmlnYXRvckFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotICogICAgICAgIFNlYmFzdGlhbiBEYXZpZHMgPHNkYXZpZHNAZ214LmRlPiAtIEltYWdlcyBmb3IgbWVudSBpdGVtcyAoMjc0ODEpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYWN0aW9uIGdyb3VwIGZvciBhbGwgdGhlIHJlc291cmNlIG5hdmlnYXRvciBhY3Rpb25zLgotICogSXQgZGVsZWdhdGVzIHRvIHNldmVyYWwgc3ViZ3JvdXBzIGZvciBtb3N0IG9mIHRoZSBhY3Rpb25zLgotICogCi0gKiBAc2VlIEdvdG9BY3Rpb25Hcm91cAotICogQHNlZSBPcGVuQWN0aW9uR3JvdXAKLSAqIEBzZWUgUmVmYWN0b3JBY3Rpb25Hcm91cAotICogQHNlZSBTb3J0QW5kRmlsdGVyQWN0aW9uR3JvdXAKLSAqIEBzZWUgV29ya3NwYWNlQWN0aW9uR3JvdXAKLSAqIAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwIHsKLQotICAgIC8qKgotICAgICAqIFRoZSByZXNvdXJjZSBuYXZpZ2F0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElSZXNvdXJjZU5hdmlnYXRvciBuYXZpZ2F0b3I7Ci0JCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBuYXZpZ2F0b3IgYWN0aW9uIGdyb3VwIGFuZCBjcmVhdGVzIGl0cyBhY3Rpb25zLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYXZpZ2F0b3IgdGhlIHJlc291cmNlIG5hdmlnYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZU5hdmlnYXRvckFjdGlvbkdyb3VwKElSZXNvdXJjZU5hdmlnYXRvciBuYXZpZ2F0b3IpIHsKLSAgICAgICAgdGhpcy5uYXZpZ2F0b3IgPSBuYXZpZ2F0b3I7Ci0gICAgICAgIG1ha2VBY3Rpb25zKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlbiByZWxhdGl2ZSBwYXRoLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLSAgICAgICByZXR1cm4gSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcihyZWxhdGl2ZVBhdGgpOwotICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBuYXZpZ2F0b3IuCi0gICAgICovCi0gICAgcHVibGljIElSZXNvdXJjZU5hdmlnYXRvciBnZXROYXZpZ2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuYXZpZ2F0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIGtleSBwcmVzc2VkIGV2ZW50IGJ5IGludm9raW5nIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24uCi0gICAgICogRG9lcyBub3RoaW5nIGJ5IGRlZmF1bHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlS2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2VzIHRoZSBhY3Rpb25zIGNvbnRhaW5lZCBpbiB0aGlzIGFjdGlvbiBncm91cC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBtYWtlQWN0aW9ucygpOwotCi0gICAgLyoqCi0gICAgICogUnVucyB0aGUgZGVmYXVsdCBhY3Rpb24gaW4gdGhlIGdyb3VwLgotICAgICAqIERvZXMgbm90aGluZyBieSBkZWZhdWx0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuRGVmYXVsdEFjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9SZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjAyMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9SZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aGljaCBoZWxwcyBtYW5hZ2luZyBtZXNzYWdlcwotICogQHNpbmNlIDIuMAotICogQGRlcHJlY2F0ZWQgVGhlc2UgbWVzc2FnZXMgYXJlIG5vdCBBUEkgYW5kIHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZAotICogb3V0c2lkZSBvZiB0aGlzIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzIHsKLSAgICAKLQlwcml2YXRlIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMoKSB7Ci0gICAgICAgIC8vIHByZXZlbnQgaW5zdGFudGlhdGlvbiBvZiBjbGFzcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4ga2V5IGluCi0gICAgICogdGhlIHJlc291cmNlIGJ1bmRsZS4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHBhcmFtIGFyZ3MgdGhlIG1lc3NhZ2UgYXJndW1lbnRzCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4ga2V5IGluCi0gICAgICogdGhlIHJlc291cmNlIGJ1bmRsZS4gSWYgdGhlcmUgaXNuJ3QgYW55IHZhbHVlIHVuZGVyCi0gICAgICogdGhlIGdpdmVuIGtleSwgdGhlIGtleSBpcyByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgdGhlIHJlc291cmNlIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvUmVzb3VyY2VOYXZpZ2F0b3JNb3ZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1Jlc291cmNlTmF2aWdhdG9yTW92ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2MwZWEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvUmVzb3VyY2VOYXZpZ2F0b3JNb3ZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLk1vdmVQcm9qZWN0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuTW92ZVJlc291cmNlQWN0aW9uOwotCi0vKioKLSAqIFRoZSBSZXNvdXJjZU5hdmlnYXRvck1vdmVBY3Rpb24gaXMgYSByZXNvdXJjZSBtb3ZlIHRoYXQgYXNvIHVwZGF0ZXMgdGhlIG5hdmlnYXRvcgotICogdG8gc2hvdyB0aGUgcmVzdWx0IG9mIHRoZSBtb3ZlLgotICogSXQgYWxzbyBkZWxlZ2F0ZXMgdG8gTW92ZVByb2plY3RBY3Rpb24gYXMgbmVlZGVkLgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU5hdmlnYXRvck1vdmVBY3Rpb24gZXh0ZW5kcyBNb3ZlUmVzb3VyY2VBY3Rpb24gewotICAgIHByaXZhdGUgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXI7Ci0KLSAgICBwcml2YXRlIE1vdmVQcm9qZWN0QWN0aW9uIG1vdmVQcm9qZWN0QWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgUmVzb3VyY2VOYXZpZ2F0b3JNb3ZlQWN0aW9uIGFuZCB1c2UgdGhlIHN1cHBsaWVkIHZpZXdlciB0byB1cGRhdGUgdGhlIFVJLgotICAgICAqIEBwYXJhbSBzaGVsbCBTaGVsbAotICAgICAqIEBwYXJhbSBzdHJ1Y3R1cmVWaWV3ZXIgU3RydWN0dXJlZFZpZXdlcgotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZU5hdmlnYXRvck1vdmVBY3Rpb24oU2hlbGwgc2hlbGwsCi0gICAgICAgICAgICBTdHJ1Y3R1cmVkVmlld2VyIHN0cnVjdHVyZVZpZXdlcikgewotICAgICAgICBzdXBlcihzaGVsbCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLSAgICAgICAgICAgICAgICBJTmF2aWdhdG9ySGVscENvbnRleHRJZHMuUkVTT1VSQ0VfTkFWSUdBVE9SX01PVkVfQUNUSU9OKTsKLSAgICAgICAgdGhpcy52aWV3ZXIgPSBzdHJ1Y3R1cmVWaWV3ZXI7Ci0gICAgICAgIHRoaXMubW92ZVByb2plY3RBY3Rpb24gPSBuZXcgTW92ZVByb2plY3RBY3Rpb24oc2hlbGwpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGlmIChtb3ZlUHJvamVjdEFjdGlvbi5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbW92ZVByb2plY3RBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5ydW4oKTsKLSAgICAgICAgTGlzdCBkZXN0aW5hdGlvbnMgPSBnZXREZXN0aW5hdGlvbnMoKTsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9ucyAhPSBudWxsICYmIGRlc3RpbmF0aW9ucy5pc0VtcHR5KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICAgICAgTGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGRlc3RpbmF0aW9ucy5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIG5ld1Jlc291cmNlID0gcm9vdAotICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRNZW1iZXIoKElQYXRoKSBpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICAgICAgICAgIGlmIChuZXdSZXNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuYWRkKG5ld1Jlc291cmNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy52aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJlc291cmNlcyksIHRydWUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIG1vdmVQcm9qZWN0QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pCi0gICAgICAgICAgICAgICAgfHwgbW92ZVByb2plY3RBY3Rpb24uaXNFbmFibGVkKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1Jlc291cmNlTmF2aWdhdG9yUmVuYW1lQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1Jlc291cmNlTmF2aWdhdG9yUmVuYW1lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNDYwOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9SZXNvdXJjZU5hdmlnYXRvclJlbmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlJlbmFtZVJlc291cmNlQWN0aW9uOwotCi0vKioKLSAqIFRoZSBSZXNvdXJjZU5hdmlnYXRvclJlbmFtZUFjdGlvbiBpcyB0aGUgcmVuYW1lIGFjdGlvbiB1c2VkIGJ5IHRoZQotICogUmVzb3VyY2VOYXZpZ2F0b3IgdGhhdCBhbHNvIGFsbG93cyB1cGRhdGluZyBhZnRlciByZW5hbWUuCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU5hdmlnYXRvclJlbmFtZUFjdGlvbiBleHRlbmRzIFJlbmFtZVJlc291cmNlQWN0aW9uIHsKLSAgICBwcml2YXRlIFRyZWVWaWV3ZXIgdmlld2VyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgUmVzb3VyY2VOYXZpZ2F0b3JSZW5hbWVBY3Rpb24gYW5kIHVzZSB0aGUgdHJlZSBvZiB0aGUgc3VwcGxpZWQgdmlld2VyCi0gICAgICogZm9yIGVkaXRpbmcuCi0gICAgICogQHBhcmFtIHNoZWxsIFNoZWxsCi0gICAgICogQHBhcmFtIHRyZWVWaWV3ZXIgVHJlZVZpZXdlcgotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZU5hdmlnYXRvclJlbmFtZUFjdGlvbihTaGVsbCBzaGVsbCwgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0gICAgICAgIHN1cGVyKHNoZWxsLCB0cmVlVmlld2VyLmdldFRyZWUoKSk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLSAgICAgICAgICAgICAgICBJTmF2aWdhdG9ySGVscENvbnRleHRJZHMuUkVTT1VSQ0VfTkFWSUdBVE9SX1JFTkFNRV9BQ1RJT04pOwotICAgICAgICB0aGlzLnZpZXdlciA9IHRyZWVWaWV3ZXI7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIFJ1biB0aGUgYWN0aW9uIHRvIGNvbXBsZXRpb24gdXNpbmcgdGhlIHN1cHBsaWVkIHBhdGguCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuV2l0aE5ld1BhdGgoSVBhdGggcGF0aCwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBzdXBlci5ydW5XaXRoTmV3UGF0aChwYXRoLCByZXNvdXJjZSk7Ci0gICAgICAgIGlmICh0aGlzLnZpZXdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgbmV3UmVzb3VyY2UgPSByb290LmZpbmRNZW1iZXIocGF0aCk7Ci0gICAgICAgICAgICBpZiAobmV3UmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aGlzLnZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3UmVzb3VyY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgdGhlIGtleSByZWxlYXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlS2V5UmVsZWFzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkYyICYmIGV2ZW50LnN0YXRlTWFzayA9PSAwICYmIGlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBydW4oKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvUmVzb3VyY2VQYXR0ZXJuRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1Jlc291cmNlUGF0dGVybkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmFkNWFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvUmVzb3VyY2VQYXR0ZXJuRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC51dGlsLlByZWZVdGlsOwotCi0vKioKLSAqIEZpbHRlciB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHJlc291cmNlcyBhcmUgdG8gYmUgc2hvd24gb3Igbm90LgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVBhdHRlcm5GaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotICAgIHByaXZhdGUgU3RyaW5nW10gcGF0dGVybnM7Ci0KLSAgICBwcml2YXRlIFN0cmluZ01hdGNoZXJbXSBtYXRjaGVyczsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFfU0VQQVJBVE9SID0gIiwiOy8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSU19UQUcgPSAicmVzb3VyY2VGaWx0ZXJzIjsvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHJlc291cmNlIHBhdHRlcm4gZmlsdGVyLgotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZVBhdHRlcm5GaWx0ZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBTdHJpbmdNYXRjaGVycy4gSWYgdGhlcmUgYXJlbid0IGFueSBsb29rCi0gICAgICogdGhlbSB1cC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ01hdGNoZXJbXSBnZXRNYXRjaGVycygpIHsKLQotICAgICAgICBpZiAodGhpcy5tYXRjaGVycyA9PSBudWxsKQotICAgICAgICAgICAgaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcygpOwotCi0gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBhdHRlcm5zIGZvciB0aGUgcmVjZWl2ZXIuIFJldHVybnMgdGhlIGNhY2hlZCB2YWx1ZXMgaWYgdGhlcmUKLSAgICAgKiBhcmUgYW55IC0gaWYgbm90IGxvb2sgaXQgdXAuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBhdHRlcm5zKCkgewotCi0gICAgICAgIGlmICh0aGlzLnBhdHRlcm5zID09IG51bGwpCi0gICAgICAgICAgICBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMucGF0dGVybnM7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgZmlsdGVycyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzKCkgewotICAgICAgICAvLyBnZXQgdGhlIGZpbHRlcnMgdGhhdCB3ZXJlIHNhdmVkIGJ5IFJlc291cmNlTmF2aWdhdG9yLnNldEZpbHRlcnNQcmVmZXJlbmNlCi0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgdmlld3NQcmVmcyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIFN0cmluZyBzdG9yZWRQYXR0ZXJucyA9IHZpZXdzUHJlZnMuZ2V0U3RyaW5nKEZJTFRFUlNfVEFHKTsKLQotICAgICAgICBpZiAoc3RvcmVkUGF0dGVybnMubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgLy8gdHJ5IHRvIG1pZ3JhdGUgcGF0dGVybnMgZnJvbSBvbGQgd29ya2JlbmNoIHByZWZlcmVuY2Ugc3RvcmUgbG9jYXRpb24KLSAgICAgICAgICAgIElQcmVmZXJlbmNlU3RvcmUgd29ya2JlbmNoUHJlZnMgPSBQcmVmVXRpbC5nZXRJbnRlcm5hbFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICAgICAgc3RvcmVkUGF0dGVybnMgPSB3b3JrYmVuY2hQcmVmcy5nZXRTdHJpbmcoRklMVEVSU19UQUcpOwotICAgICAgICAgICAgaWYgKHN0b3JlZFBhdHRlcm5zLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHZpZXdzUHJlZnMuc2V0VmFsdWUoRklMVEVSU19UQUcsIHN0b3JlZFBhdHRlcm5zKTsKLSAgICAgICAgICAgICAgICB3b3JrYmVuY2hQcmVmcy5zZXRWYWx1ZShGSUxURVJTX1RBRywgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RvcmVkUGF0dGVybnMubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgLy8gcmV2ZXJ0IHRvIGFsbCBmaWx0ZXIgZXh0ZW5zaW9ucyB3aXRoIHNlbGVjdGVkID09ICJ0cnVlIgotICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGZpbHRlcnMgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUKLSAgICAgICAgICAgIExpc3QgZGVmYXVsdEZpbHRlcnMgPSBGaWx0ZXJzQ29udGVudFByb3ZpZGVyLmdldERlZmF1bHRGaWx0ZXJzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXR0ZXJucyA9IG5ldyBTdHJpbmdbZGVmYXVsdEZpbHRlcnMuc2l6ZSgpXTsKLSAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLnRvQXJyYXkocGF0dGVybnMpOwotICAgICAgICAgICAgc2V0UGF0dGVybnMocGF0dGVybnMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9HZXQgdGhlIHN0cmluZ3Mgc2VwYXJhdGVkIGJ5IGEgY29tbWEgYW5kIGZpbHRlciB0aGVtIGZyb20gdGhlIGN1cnJlbnRseQotICAgICAgICAvL2RlZmluZWQgb25lcwotICAgICAgICBMaXN0IGRlZmluZWRGaWx0ZXJzID0gRmlsdGVyc0NvbnRlbnRQcm92aWRlci5nZXREZWZpbmVkRmlsdGVycygpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgZW50cmllcyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RvcmVkUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgQ09NTUFfU0VQQVJBVE9SKTsKLSAgICAgICAgTGlzdCBwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICB3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIG5leHRUb2tlbiA9IGVudHJpZXMubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpZiAoZGVmaW5lZEZpbHRlcnMuaW5kZXhPZihuZXh0VG9rZW4pID4gLTEpCi0gICAgICAgICAgICAgICAgcGF0dGVybnMuYWRkKG5leHRUb2tlbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0NvbnZlcnQgdG8gYW4gYXJyYXkgb2YgU3RyaW5ncwotICAgICAgICBTdHJpbmdbXSBwYXR0ZXJuQXJyYXkgPSBuZXcgU3RyaW5nW3BhdHRlcm5zLnNpemUoKV07Ci0gICAgICAgIHBhdHRlcm5zLnRvQXJyYXkocGF0dGVybkFycmF5KTsKLSAgICAgICAgc2V0UGF0dGVybnMocGF0dGVybkFycmF5KTsKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gVmlld2VyRmlsdGVyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIHJlc291cmNlID0gKElSZXNvdXJjZSkgZWxlbWVudDsKLSAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgSUFkYXB0YWJsZSBhZGFwdGFibGUgPSAoSUFkYXB0YWJsZSkgZWxlbWVudDsKLSAgICAgICAgICAgIHJlc291cmNlID0gKElSZXNvdXJjZSkgYWRhcHRhYmxlLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmdNYXRjaGVyW10gdGVzdE1hdGNoZXJzID0gZ2V0TWF0Y2hlcnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdE1hdGNoZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3RNYXRjaGVyc1tpXS5tYXRjaChuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcGF0dGVybnMgdG8gZmlsdGVyIG91dCBmb3IgdGhlIHJlY2VpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5zKFN0cmluZ1tdIG5ld1BhdHRlcm5zKSB7Ci0KLSAgICAgICAgdGhpcy5wYXR0ZXJucyA9IG5ld1BhdHRlcm5zOwotICAgICAgICB0aGlzLm1hdGNoZXJzID0gbmV3IFN0cmluZ01hdGNoZXJbbmV3UGF0dGVybnMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdQYXR0ZXJucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgLy9SZXNldCB0aGUgbWF0Y2hlcnMgdG8gcHJldmVudCBjb25zdHJ1Y3RvciBvdmVyaGVhZAotICAgICAgICAgICAgbWF0Y2hlcnNbaV0gPSBuZXcgU3RyaW5nTWF0Y2hlcihuZXdQYXR0ZXJuc1tpXSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9SZXNvdXJjZVNlbGVjdGlvblV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvUmVzb3VyY2VTZWxlY3Rpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNDM5MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9SZXNvdXJjZVNlbGVjdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdXRpbGl0aWVzIGZvciBjaGVja2luZyB0aGUgdmFsaWRpdHkgb2Ygc2VsZWN0aW9ucy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkCi0gKiBvciBzdWJjbGFzc2VkLgotICogQHNpbmNlIDIuMAotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTZWxlY3Rpb25VdGlsIHsKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBibG9jayBpbnN0YW50aWF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgUmVzb3VyY2VTZWxlY3Rpb25VdGlsKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgdHlwZXMgb2YgdGhlIHJlc291cmNlcyBpbiB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGFyZSBhbW9uZyAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHR5cGVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIHNlbGVjdGlvbgotICAgICAqIEBwYXJhbSByZXNvdXJjZU1hc2sgcmVzb3VyY2UgbWFzayBmb3JtZWQgYnkgYml0d2lzZSBPUiBvZiByZXNvdXJjZSB0eXBlCi0gICAgICogICBjb25zdGFudHMgKGRlZmluZWQgb24gPGNvZGU+SVJlc291cmNlPC9jb2RlPikKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBzZWxlY3RlZCBlbGVtZW50cyBhcmUgcmVzb3VyY2VzIG9mIHRoZSByaWdodAotICAgICAqICB0eXBlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGF0IGxlYXN0IG9uZSBlbGVtZW50IGlzIGVpdGhlciBhIHJlc291cmNlCi0gICAgICogIG9mIHNvbWUgb3RoZXIgdHlwZSBvciBhIG5vbi1yZXNvdXJjZQotICAgICAqIEBzZWUgSVJlc291cmNlI2dldFR5cGUoKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxSZXNvdXJjZXNBcmVPZlR5cGUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLAotICAgICAgICAgICAgaW50IHJlc291cmNlTWFzaykgewotICAgICAgICBJdGVyYXRvciByZXNvdXJjZXMgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBuZXh0ID0gcmVzb3VyY2VzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghKG5leHQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmICghcmVzb3VyY2VJc1R5cGUoKElSZXNvdXJjZSkgbmV4dCwgcmVzb3VyY2VNYXNrKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIGFkYXB0ZWQgdG8gSVJlc291cmNlLiBSZXR1cm5zIG51bGwKLSAgICAgKiBpZiBhbnkgb2YgdGhlIGVudHJpZXMgYXJlIG5vdCBhZGFwdGFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgc2VsZWN0aW9uCi0gICAgICogQHBhcmFtIHJlc291cmNlTWFzayByZXNvdXJjZSBtYXNrIGZvcm1lZCBieSBiaXR3aXNlIE9SIG9mIHJlc291cmNlIHR5cGUKLSAgICAgKiAgIGNvbnN0YW50cyAoZGVmaW5lZCBvbiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+KQotICAgICAqIEByZXR1cm4gSVN0cnVjdHVyZWRTZWxlY3Rpb24gb3IgbnVsbCBpZiBhbnkgb2YgdGhlIGVudHJpZXMgYXJlIG5vdCBhZGFwdGFibGUuCi0gICAgICogQHNlZSBJUmVzb3VyY2UjZ2V0VHlwZSgpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBhbGxSZXNvdXJjZXMoCi0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGludCByZXNvdXJjZU1hc2spIHsKLSAgICAgICAgSXRlcmF0b3IgYWRhcHRhYmxlcyA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgd2hpbGUgKGFkYXB0YWJsZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbmV4dCA9IGFkYXB0YWJsZXMubmV4dCgpOwotICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHJlc291cmNlID0gKChJQWRhcHRhYmxlKSBuZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzb3VyY2VJc1R5cGUoKElSZXNvdXJjZSkgcmVzb3VyY2UsIHJlc291cmNlTWFzaykpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocmVzb3VyY2UpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJlc3VsdCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIHJlc291cmNlIGlzIGFtb25nIHRoZSBzcGVjaWZpZWQgCi0gICAgICogcmVzb3VyY2UgdHlwZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZQotICAgICAqIEBwYXJhbSByZXNvdXJjZU1hc2sgcmVzb3VyY2UgbWFzayBmb3JtZWQgYnkgYml0d2lzZSBPUiBvZiByZXNvdXJjZSB0eXBlCi0gICAgICogICBjb25zdGFudHMgKGRlZmluZWQgb24gPGNvZGU+SVJlc291cmNlPC9jb2RlPikKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXNvdXJjZXMgaGFzIGEgbWF0Y2hpbmcgdHlwZSwgYW5kIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqIEBzZWUgSVJlc291cmNlI2dldFR5cGUoKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXNvdXJjZUlzVHlwZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXNvdXJjZU1hc2spIHsKLSAgICAgICAgcmV0dXJuIChyZXNvdXJjZS5nZXRUeXBlKCkgJiByZXNvdXJjZU1hc2spICE9IDA7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1Jlc291cmNlU29ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1Jlc291cmNlU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDllOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9SZXNvdXJjZVNvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLQotLyoqCi0gKiBTb3J0ZXIgZm9yIHZpZXdlcnMgdGhhdCBkaXNwbGF5IGl0ZW1zIG9mIHR5cGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPi4KLSAqIFRoZSBzb3J0ZXIgc3VwcG9ydHMgdHdvIHNvcnQgY3JpdGVyaWE6Ci0gKiA8cD4KLSAqIDxjb2RlPk5BTUU8L2NvZGU+OiBGb2xkZXJzIGFyZSBnaXZlbiBvcmRlciBwcmVjZWRlbmNlLCBmb2xsb3dlZCBieSBmaWxlcy4KLSAqIFdpdGhpbiB0aGVzZSB0d28gZ3JvdXBzIHJlc291cmNlcyBhcmUgb3JkZXJlZCBieSBuYW1lLiAgQWxsIG5hbWUgY29tcGFyaXNvbnMKLSAqIGFyZSBjYXNlLWluc2Vuc2l0aXZlLgotICogPC9wPgotICogPHA+Ci0gKiA8Y29kZT5UWVBFPC9jb2RlPjogRm9sZGVycyBhcmUgZ2l2ZW4gb3JkZXIgcHJlY2VkZW5jZSwgZm9sbG93ZWQgYnkgZmlsZXMuCi0gKiBXaXRoaW4gdGhlc2UgdHdvIGdyb3VwcyByZXNvdXJjZXMgYXJlIG9yZGVyZWQgYnkgZXh0ZW5zaW9uLiAgQWxsIGV4dGVuc2lvbgotICogY29tcGFyaXNvbnMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBhcmd1bWVudCB2YWx1ZSB0aGF0IGluZGljYXRlcyB0byBzb3J0IGl0ZW1zIGJ5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTkFNRSA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBhcmd1bWVudCB2YWx1ZSB0aGF0IGluZGljYXRlcyB0byBzb3J0IGl0ZW1zIGJ5IGV4dGVuc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUWVBFID0gMjsKLQotICAgIHByaXZhdGUgaW50IGNyaXRlcmlhOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlc291cmNlIHNvcnRlciB0aGF0IHdpbGwgdXNlIHRoZSBnaXZlbiBzb3J0IGNyaXRlcmlhLgotICAgICAqCi0gICAgICogQHBhcmFtIGNyaXRlcmlhIHRoZSBzb3J0IGNyaXRlcmlvbiB0byB1c2U6IG9uZSBvZiA8Y29kZT5OQU1FPC9jb2RlPiBvciAKLSAgICAgKiAgIDxjb2RlPlRZUEU8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlU29ydGVyKGludCBjcml0ZXJpYSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmNyaXRlcmlhID0gY3JpdGVyaWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgcmVsYXRpdmUgc29ydCBwcmlvcml0eSBvZiB0aGUgCi0gICAgICogZ2l2ZW4gZWxlbWVudCBiYXNlZCBvbiBpdHMgY2xhc3MuCi0gICAgICogPHA+Ci0gICAgICogPHVsPgotICAgICAqICAgPGxpPnJlc291cmNlcyAoPGNvZGU+SVJlc291cmNlPC9jb2RlPikgLSAyPC9saT4KLSAgICAgKiAgIDxsaT5wcm9qZWN0IHJlZmVyZW5jZXMgKDxjb2RlPlByb2plY3RSZWZlcmVuY2U8L2NvZGU+KSAtIDE8L2xpPgotICAgICAqICAgPGxpPmV2ZXJ5dGhpbmcgZWxzZSAtIDA8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBzb3J0IHByaW9yaXR5IChsYXJnZXIgbnVtYmVycyBtZWFucyBtb3JlIGltcG9ydGFudCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNsYXNzQ29tcGFyaXNvbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXJTb3J0ZXIuCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgIC8vaGF2ZSB0byBkZWFsIHdpdGggbm9uLXJlc291cmNlcyBpbiBuYXZpZ2F0b3IKLSAgICAgICAgLy9pZiBvbmUgb3IgYm90aCBvYmplY3RzIGFyZSBub3QgcmVzb3VyY2VzLCByZXR1cm5lZCBhIGNvbXBhcmlzb24gCi0gICAgICAgIC8vYmFzZWQgb24gY2xhc3MuCi0gICAgICAgIGlmICghKG8xIGluc3RhbmNlb2YgSVJlc291cmNlICYmIG8yIGluc3RhbmNlb2YgSVJlc291cmNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVDbGFzcyhvMSwgbzIpOwotICAgICAgICB9Ci0gICAgICAgIElSZXNvdXJjZSByMSA9IChJUmVzb3VyY2UpIG8xOwotICAgICAgICBJUmVzb3VyY2UgcjIgPSAoSVJlc291cmNlKSBvMjsKLQotICAgICAgICBpZiAocjEgaW5zdGFuY2VvZiBJQ29udGFpbmVyICYmIHIyIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlTmFtZXMocjEsIHIyKTsKLSAgICAgICAgZWxzZSBpZiAocjEgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBlbHNlIGlmIChyMiBpbnN0YW5jZW9mIElDb250YWluZXIpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgZWxzZSBpZiAoY3JpdGVyaWEgPT0gTkFNRSkKLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlTmFtZXMocjEsIHIyKTsKLSAgICAgICAgZWxzZSBpZiAoY3JpdGVyaWEgPT0gVFlQRSkKLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlVHlwZXMocjEsIHIyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG51bWJlciByZWZsZWN0aW5nIHRoZSBjb2xsYXRpb24gb3JkZXIgb2YgdGhlIGdpdmVuIGVsZW1lbnRzCi0gICAgICogYmFzZWQgb24gdGhlaXIgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudDEgdGhlIGZpcnN0IGVsZW1lbnQgdG8gYmUgb3JkZXJlZAotICAgICAqIEBwYXJhbSBlbGVtZW50MiB0aGUgc2Vjb25kIGVsZW1lbnQgdG8gYmUgb3JkZXJlZAotICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgbGVzcyAgdGhhbiB0aGUgCi0gICAgICogIHNlY29uZCBlbGVtZW50OyB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMKLSAgICAgKiAgZXF1YWwgdG8gdGhlIHNlY29uZCBlbGVtZW50OyBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0Ci0gICAgICogIGVsZW1lbnQgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQgZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZUNsYXNzKE9iamVjdCBlbGVtZW50MSwgT2JqZWN0IGVsZW1lbnQyKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbXBhcmlzb24oZWxlbWVudDEpIC0gY2xhc3NDb21wYXJpc29uKGVsZW1lbnQyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbnVtYmVyIHJlZmxlY3RpbmcgdGhlIGNvbGxhdGlvbiBvcmRlciBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2VzCi0gICAgICogYmFzZWQgb24gdGhlaXIgcmVzb3VyY2UgbmFtZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UxIHRoZSBmaXJzdCByZXNvdXJjZSBlbGVtZW50IHRvIGJlIG9yZGVyZWQKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UyIHRoZSBzZWNvbmQgcmVzb3VyY2UgZWxlbWVudCB0byBiZSBvcmRlcmVkCi0gICAgICogQHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBsZXNzICB0aGFuIHRoZSAKLSAgICAgKiAgc2Vjb25kIGVsZW1lbnQ7IHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcwotICAgICAqICBlcXVhbCB0byB0aGUgc2Vjb25kIGVsZW1lbnQ7IGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QKLSAgICAgKiAgZWxlbWVudCBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBjb21wYXJlTmFtZXMoSVJlc291cmNlIHJlc291cmNlMSwgSVJlc291cmNlIHJlc291cmNlMikgewotICAgICAgICByZXR1cm4gY29sbGF0b3IuY29tcGFyZShyZXNvdXJjZTEuZ2V0TmFtZSgpLCByZXNvdXJjZTIuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbnVtYmVyIHJlZmxlY3RpbmcgdGhlIGNvbGxhdGlvbiBvcmRlciBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2VzCi0gICAgICogYmFzZWQgb24gdGhlaXIgcmVzcGVjdGl2ZSBmaWxlIGV4dGVuc2lvbnMuIFJlc291cmNlcyB3aXRoIHRoZSBzYW1lIGZpbGUKLSAgICAgKiBleHRlbnNpb24gd2lsbCBiZSBjb2xsYXRlZCBiYXNlZCBvbiB0aGVpciBuYW1lcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZTEgdGhlIGZpcnN0IHJlc291cmNlIGVsZW1lbnQgdG8gYmUgb3JkZXJlZAotICAgICAqIEBwYXJhbSByZXNvdXJjZTIgdGhlIHNlY29uZCByZXNvdXJjZSBlbGVtZW50IHRvIGJlIG9yZGVyZWQKLSAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGxlc3MgIHRoYW4gdGhlIAotICAgICAqICBzZWNvbmQgZWxlbWVudDsgdGhlIHZhbHVlIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzCi0gICAgICogIGVxdWFsIHRvIHRoZSBzZWNvbmQgZWxlbWVudDsgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdAotICAgICAqICBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVUeXBlcyhJUmVzb3VyY2UgcmVzb3VyY2UxLCBJUmVzb3VyY2UgcmVzb3VyY2UyKSB7Ci0gICAgICAgIFN0cmluZyBleHQxID0gZ2V0RXh0ZW5zaW9uRm9yKHJlc291cmNlMSk7Ci0gICAgICAgIFN0cmluZyBleHQyID0gZ2V0RXh0ZW5zaW9uRm9yKHJlc291cmNlMik7Ci0KLSAgICAgICAgLy8gQ29tcGFyZSBleHRlbnNpb25zLiAgSWYgdGhleSdyZSBkaWZmZXJlbnQgdGhlbiByZXR1cm4gYSB2YWx1ZSB0aGF0Ci0gICAgICAgIC8vIGluZGljYXRlcyBjb3JyZWN0IGV4dGVuc2lvbiBvcmRlcmluZy4gIElmIHRoZXkncmUgdGhlIHNhbWUgdGhlbgotICAgICAgICAvLyByZXR1cm4gYSB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGUgY29ycmVjdCBOQU1FIG9yZGVyaW5nLgotICAgICAgICBpbnQgcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShleHQxLCBleHQyKTsKLQotICAgICAgICBpZiAocmVzdWx0ICE9IDApIC8vIGllLi0gZGlmZmVyZW50IGV4dGVuc2lvbnMKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBhcmVOYW1lcyhyZXNvdXJjZTEsIHJlc291cmNlMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc29ydCBjcml0ZXJpYSBvZiB0aGlzIHNvcnRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNvcnQgY3JpdGVyaW9uOiBvbmUgb2YgPGNvZGU+TkFNRTwvY29kZT4gb3IgPGNvZGU+VFlQRTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENyaXRlcmlhKCkgewotICAgICAgICByZXR1cm4gY3JpdGVyaWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXh0ZW5zaW9uIHBvcnRpb24gb2YgdGhlIGdpdmVuIHJlc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZQotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgZXh0ZW5zaW9uLCBwb3NzaWJpbHkgdGhlIGVtcHR5IHN0cmluZwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldEV4dGVuc2lvbkZvcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgU3RyaW5nIGV4dCA9IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgICAgICAgcmV0dXJuIGV4dCA9PSBudWxsID8gIiIgOiBleHQ7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzb3J0IGNyaXRlcmlhIG9mIHRoaXMgc29ydGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjcml0ZXJpYSB0aGUgc29ydCBjcml0ZXJpb246IAotICAgICAqCW9uZSBvZiA8Y29kZT5SZXNvdXJjZVNvcnRlci5OQU1FPC9jb2RlPiBvciAKLSAgICAgKgk8Y29kZT5SZXNvdXJjZVNvcnRlci5UWVBFPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENyaXRlcmlhKGludCBjcml0ZXJpYSkgewotICAgICAgICB0aGlzLmNyaXRlcmlhID0gY3JpdGVyaWE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9TaG93SW5OYXZpZ2F0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvU2hvd0luTmF2aWdhdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTlmZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9TaG93SW5OYXZpZ2F0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25Qcm92aWRlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7Ci0KLS8qKgotICogQW4gYWN0aW9uIHdoaWNoIHNob3dzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgTmF2aWdhdG9yIHZpZXcuCi0gKiBGb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZWxlY3Rpb24sIGlmIGl0IGlzIGFuIDxjb2RlPklSZXNvdXJjZTwvY29kZT4KLSAqIGl0IHVzZXMgaXQgZGlyZWN0bHksIG90aGVyd2lzZSBpZiBpdCBpcyBhbiA8Y29kZT5JTWFya2VyPC9jb2RlPiBpdCB1c2VzIHRoZSBtYXJrZXIncyByZXNvdXJjZSwKLSAqIG90aGVyd2lzZSBpZiBpdCBpcyBhbiA8Y29kZT5JQWRhcHRhYmxlPC9jb2RlPiwgaXQgdHJpZXMgdG8gZ2V0IHRoZSA8Y29kZT5JUmVzb3VyY2UuY2xhc3M8L2NvZGU+IGFkYXB0ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93SW5OYXZpZ2F0b3JBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiB7Ci0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBwYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhZ2UgdGhlIHBhZ2UKLSAgICAgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU2hvd0luTmF2aWdhdG9yQWN0aW9uKElXb3JrYmVuY2hQYWdlIHBhZ2UsIElTZWxlY3Rpb25Qcm92aWRlciB2aWV3ZXIpIHsKLSAgICAgICAgc3VwZXIodmlld2VyLCBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLlNob3dJbk5hdmlnYXRvcl90ZXh0KTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChwYWdlKTsKLSAgICAgICAgdGhpcy5wYWdlID0gcGFnZTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5TaG93SW5OYXZpZ2F0b3JfdG9vbFRpcCk7Ci0gICAgICAgIHBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlJTmF2aWdhdG9ySGVscENvbnRleHRJZHMuU0hPV19JTl9OQVZJR0FUT1JfQUNUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZXMgaW4gdGhlIGdpdmVuIHNlbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIDxjb2RlPklSZXNvdXJjZTwvY29kZT4KLSAgICAgKi8KLSAgICBMaXN0IGdldFJlc291cmNlcyhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICB2LmFkZChvKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKElNYXJrZXIpIG8pLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgdi5hZGQocmVzb3VyY2UpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpICgoSUFkYXB0YWJsZSkgbykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdi5hZGQocmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbi4KLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBTaG93cyB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIHNldHMgaXRzIHNlbGVjdGlvbiB0byB0aGUgcmVzb3VyY2VzCi0gICAgICogc2VsZWN0ZWQgaW4gdGhpcyBhY3Rpb24ncyBzZWxlY3Rpb24gcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBMaXN0IHYgPSBnZXRSZXNvdXJjZXMoZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLSAgICAgICAgaWYgKHYuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVZpZXdQYXJ0IHZpZXcgPSBwYWdlLnNob3dWaWV3KElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih2KTsKLSAgICAgICAgICAgICAgICAoKElTZXRTZWxlY3Rpb25UYXJnZXQpIHZpZXcpLnNlbGVjdFJldmVhbChzZWxlY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IocGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLlNob3dJbk5hdmlnYXRvcl9lcnJvck1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpLCBlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBTZWxlY3Rpb25Qcm92aWRlckFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzZXRFbmFibGVkKCFnZXRSZXNvdXJjZXMoc2VsZWN0aW9uKS5pc0VtcHR5KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvU29ydEFuZEZpbHRlckFjdGlvbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1NvcnRBbmRGaWx0ZXJBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzVlNmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvU29ydEFuZEZpbHRlckFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgU2ViYXN0aWFuIERhdmlkcyA8c2Rhdmlkc0BnbXguZGU+IC0gSW1hZ2VzIGZvciBtZW51IGl0ZW1zICgyNzQ4MSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlczsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBhY3Rpb24gZ3JvdXAgZm9yIHRoZSBzb3J0IGFuZCBmaWx0ZXIgYWN0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFNvcnRBbmRGaWx0ZXJBY3Rpb25Hcm91cCBleHRlbmRzIFJlc291cmNlTmF2aWdhdG9yQWN0aW9uR3JvdXAgewotCi0gICAgcHJpdmF0ZSBTb3J0Vmlld0FjdGlvbiBzb3J0QnlUeXBlQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBTb3J0Vmlld0FjdGlvbiBzb3J0QnlOYW1lQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBGaWx0ZXJTZWxlY3Rpb25BY3Rpb24gZmlsdGVyQWN0aW9uOwotCi0gICAgcHVibGljIFNvcnRBbmRGaWx0ZXJBY3Rpb25Hcm91cChJUmVzb3VyY2VOYXZpZ2F0b3IgbmF2aWdhdG9yKSB7Ci0gICAgICAgIHN1cGVyKG5hdmlnYXRvcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0gICAgICAgIHNvcnRCeU5hbWVBY3Rpb24gPSBuZXcgU29ydFZpZXdBY3Rpb24obmF2aWdhdG9yLCBmYWxzZSk7Ci0gICAgICAgIHNvcnRCeVR5cGVBY3Rpb24gPSBuZXcgU29ydFZpZXdBY3Rpb24obmF2aWdhdG9yLCB0cnVlKTsKLQotICAgICAgICBmaWx0ZXJBY3Rpb24gPSBuZXcgRmlsdGVyU2VsZWN0aW9uQWN0aW9uKG5hdmlnYXRvciwKLSAgICAgICAgICAgICAgICBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLlJlc291cmNlTmF2aWdhdG9yX2ZpbHRlclRleHQpOwotICAgICAgICBmaWx0ZXJBY3Rpb24KLSAgICAgICAgICAgICAgICAuc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoZ2V0SW1hZ2VEZXNjcmlwdG9yKCJkbGNsMTYvZmlsdGVyX3BzLmdpZiIpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGZpbHRlckFjdGlvbgotICAgICAgICAgICAgICAgIC5zZXRJbWFnZURlc2NyaXB0b3IoZ2V0SW1hZ2VEZXNjcmlwdG9yKCJlbGNsMTYvZmlsdGVyX3BzLmdpZiIpKTsvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotICAgICAgICBJTWVudU1hbmFnZXIgbWVudSA9IGFjdGlvbkJhcnMuZ2V0TWVudU1hbmFnZXIoKTsKLSAgICAgICAgSU1lbnVNYW5hZ2VyIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5SZXNvdXJjZU5hdmlnYXRvcl9zb3J0KTsKLSAgICAgICAgbWVudS5hZGQoc3VibWVudSk7Ci0gICAgICAgIHN1Ym1lbnUuYWRkKHNvcnRCeU5hbWVBY3Rpb24pOwotICAgICAgICBzdWJtZW51LmFkZChzb3J0QnlUeXBlQWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQoZmlsdGVyQWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVBY3Rpb25CYXJzKCkgewotICAgICAgICBpbnQgY3JpdGVyaWEgPSBuYXZpZ2F0b3IuZ2V0U29ydGVyKCkuZ2V0Q3JpdGVyaWEoKTsKLSAgICAgICAgc29ydEJ5TmFtZUFjdGlvbi5zZXRDaGVja2VkKGNyaXRlcmlhID09IFJlc291cmNlU29ydGVyLk5BTUUpOwotICAgICAgICBzb3J0QnlUeXBlQWN0aW9uLnNldENoZWNrZWQoY3JpdGVyaWEgPT0gUmVzb3VyY2VTb3J0ZXIuVFlQRSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9Tb3J0Vmlld0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9Tb3J0Vmlld0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzNiN2ZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvU29ydFZpZXdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB2aWV3IHNvcnRpbmcgYWN0aW9ucy4KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFNvcnRWaWV3QWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb24gewotICAgIHByaXZhdGUgaW50IHNvcnRDcml0ZXJpYTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYXZpZ2F0b3IgdGhlIHJlc291cmNlIG5hdmlnYXRvcgotICAgICAqIEBwYXJhbSBzb3J0QnlUeXBlIDxjb2RlPnRydWU8L2NvZGU+IGZvciBzb3J0IGJ5IHR5cGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3Igc29ydCBieSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFNvcnRWaWV3QWN0aW9uKElSZXNvdXJjZU5hdmlnYXRvciBuYXZpZ2F0b3IsIGJvb2xlYW4gc29ydEJ5VHlwZSkgewotICAgICAgICBzdXBlcigKLSAgICAgICAgICAgICAgICBuYXZpZ2F0b3IsCi0gICAgICAgICAgICAgICAgc29ydEJ5VHlwZSA/IFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuU29ydFZpZXdfYnlUeXBlIDogUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Tb3J0Vmlld19ieU5hbWUpOwotICAgICAgICBpZiAoc29ydEJ5VHlwZSkgewotICAgICAgICAgICAgc2V0VG9vbFRpcFRleHQoUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Tb3J0Vmlld190b29sVGlwQnlUeXBlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFRvb2xUaXBUZXh0KFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuU29ydFZpZXdfdG9vbFRpcEJ5TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgc29ydENyaXRlcmlhID0gc29ydEJ5VHlwZSA/IFJlc291cmNlU29ydGVyLlRZUEUgOiBSZXNvdXJjZVNvcnRlci5OQU1FOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJSU5hdmlnYXRvckhlbHBDb250ZXh0SWRzLlNPUlRfVklFV19BQ1RJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgSVJlc291cmNlTmF2aWdhdG9yIG5hdmlnYXRvciA9IGdldE5hdmlnYXRvcigpOwotICAgICAgICBSZXNvdXJjZVNvcnRlciBzb3J0ZXIgPSBuYXZpZ2F0b3IuZ2V0U29ydGVyKCk7Ci0KLSAgICAgICAgaWYgKHNvcnRlciA9PSBudWxsKQotICAgICAgICAgICAgbmF2aWdhdG9yLnNldFNvcnRlcihuZXcgUmVzb3VyY2VTb3J0ZXIoc29ydENyaXRlcmlhKSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc29ydGVyLnNldENyaXRlcmlhKHNvcnRDcml0ZXJpYSk7Ci0gICAgICAgICAgICBuYXZpZ2F0b3Iuc2V0U29ydGVyKHNvcnRlcik7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvU3RyaW5nTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9TdHJpbmdNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZWNlMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9TdHJpbmdNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogQSBzdHJpbmcgcGF0dGVybiBtYXRjaGVyLCBzdXBwcG9ydGluZyA/Kj8gYW5kID8/PyB3aWxkY2FyZHMuCi0gKi8KLS8qIHBhY2thZ2UgKi9jbGFzcyBTdHJpbmdNYXRjaGVyIHsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZQYXR0ZXJuOwotCi0gICAgcHJvdGVjdGVkIGludCBmTGVuZ3RoOyAvLyBwYXR0ZXJuIGxlbmd0aAotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZklnbm9yZVdpbGRDYXJkczsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGZJZ25vcmVDYXNlOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZkhhc0xlYWRpbmdTdGFyOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZkhhc1RyYWlsaW5nU3RhcjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZlNlZ21lbnRzW107IC8vdGhlIGdpdmVuIHBhdHRlcm4gaXMgc3BsaXQgaW50byAqIHNlcGFyYXRlZCBzZWdtZW50cwotCi0gICAgLyogYm91bmRhcnkgdmFsdWUgYmV5b25kIHdoaWNoIHdlIGRvbid0IG5lZWQgdG8gc2VhcmNoIGluIHRoZSB0ZXh0ICovCi0gICAgcHJvdGVjdGVkIGludCBmQm91bmQgPSAwOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIGZTaW5nbGVXaWxkQ2FyZCA9ICdcdTAwMDAnOwotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb3NpdGlvbiB7Ci0gICAgICAgIGludCBzdGFydDsgLy9pbmNsdXNpdmUKLQotICAgICAgICBpbnQgZW5kOyAvL2V4Y2x1c2l2ZQotCi0gICAgICAgIHB1YmxpYyBQb3NpdGlvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIHRoaXMuZW5kID0gZW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTdGFydCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RW5kKCkgewotICAgICAgICAgICAgcmV0dXJuIGVuZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmluZ01hdGNoZXIgY29uc3RydWN0b3IgdGFrZXMgaW4gYSBTdHJpbmcgb2JqZWN0IHRoYXQgaXMgYSBzaW1wbGUgCi0gICAgICogcGF0dGVybiB3aGljaCBtYXkgY29udGFpbiAnKicgZm9yIDAgYW5kIG1hbnkgY2hhcmFjdGVycyBhbmQKLSAgICAgKiAnPycgZm9yIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4gIAotICAgICAqCi0gICAgICogTGl0ZXJhbCAnKicgYW5kICc/JyBjaGFyYWN0ZXJzIG11c3QgYmUgZXNjYXBlZCBpbiB0aGUgcGF0dGVybiAKLSAgICAgKiBlLmcuLCAiXCoiIG1lYW5zIGxpdGVyYWwgIioiLCBldGMuCi0gICAgICoKLSAgICAgKiBFc2NhcGluZyBhbnkgb3RoZXIgY2hhcmFjdGVyIChpbmNsdWRpbmcgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgaXRzZWxmKSwgCi0gICAgICoganVzdCByZXN1bHRzIGluIHRoYXQgY2hhcmFjdGVyIGluIHRoZSBwYXR0ZXJuLgotICAgICAqIGUuZy4sICJcYSIgbWVhbnMgImEiIGFuZCAiXFwiIG1lYW5zICJcIgotICAgICAqCi0gICAgICogSWYgaW52b2tpbmcgdGhlIFN0cmluZ01hdGNoZXIgd2l0aCBzdHJpbmcgbGl0ZXJhbHMgaW4gSmF2YSwgZG9uJ3QgZm9yZ2V0Ci0gICAgICogZXNjYXBlIGNoYXJhY3RlcnMgYXJlIHJlcHJlc2VudGVkIGJ5ICJcXCIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgcGF0dGVybiB0byBtYXRjaCB0ZXh0IGFnYWluc3QKLSAgICAgKiBAcGFyYW0gaWdub3JlQ2FzZSBpZiB0cnVlLCBjYXNlIGlzIGlnbm9yZWQKLSAgICAgKiBAcGFyYW0gaWdub3JlV2lsZENhcmRzIGlmIHRydWUsIHdpbGQgY2FyZHMgYW5kIHRoZWlyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGlnbm9yZWQKLSAgICAgKiAJCSAgKGV2ZXJ5dGhpbmcgaXMgdGFrZW4gbGl0ZXJhbGx5KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nTWF0Y2hlcihTdHJpbmcgcGF0dGVybiwgYm9vbGVhbiBpZ25vcmVDYXNlLAotICAgICAgICAgICAgYm9vbGVhbiBpZ25vcmVXaWxkQ2FyZHMpIHsKLSAgICAgICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgZklnbm9yZUNhc2UgPSBpZ25vcmVDYXNlOwotICAgICAgICBmSWdub3JlV2lsZENhcmRzID0gaWdub3JlV2lsZENhcmRzOwotICAgICAgICBmUGF0dGVybiA9IHBhdHRlcm47Ci0gICAgICAgIGZMZW5ndGggPSBwYXR0ZXJuLmxlbmd0aCgpOwotCi0gICAgICAgIGlmIChmSWdub3JlV2lsZENhcmRzKSB7Ci0gICAgICAgICAgICBwYXJzZU5vV2lsZENhcmRzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJzZVdpbGRDYXJkcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgcGF0dGVybiBiZXR3ZWVuIDxjb2RlPnN0YXJ0PC9jb2RlKShpbmNsdXNpdmUpIAotICAgICAqIGFuZCA8Y29kZT5lbmQ8L2NvZGU+KGV4Y2x1c2l2ZSkuICAKLSAgICAgKiBAcGFyYW0gPGNvZGU+dGV4dDwvY29kZT4sIHRoZSBTdHJpbmcgb2JqZWN0IHRvIHNlYXJjaCBpbiAKLSAgICAgKiBAcGFyYW0gPGNvZGU+c3RhcnQ8L2NvZGU+LCB0aGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIHNlYXJjaCByYW5nZSwgaW5jbHVzaXZlCi0gICAgICogQHBhcmFtIDxjb2RlPmVuZDwvY29kZT4sIHRoZSBlbmRpbmcgaW5kZXggb2YgdGhlIHNlYXJjaCByYW5nZSwgZXhjbHVzaXZlCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5TdHJpbmdNYXRjaGVyLlBvc2l0aW9uPC9jb2RlPiBvYmplY3QgdGhhdCBrZWVwcyB0aGUgc3RhcnRpbmcgCi0gICAgICogKGluY2x1c2l2ZSkgYW5kIGVuZGluZyBwb3NpdGlvbnMgKGV4Y2x1c2l2ZSkgb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIAotICAgICAqIHBhdHRlcm4gaW4gdGhlIHNwZWNpZmllZCByYW5nZSBvZiB0aGUgdGV4dDsgcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kIG9yIHN1YnRleHQKLSAgICAgKiBpcyBlbXB0eSAoc3RhcnQ9PWVuZCkuIEEgcGFpciBvZiB6ZXJvcyBpcyByZXR1cm5lZCBpZiBwYXR0ZXJuIGlzIGVtcHR5IHN0cmluZwotICAgICAqIE5vdGUgdGhhdCBmb3IgcGF0dGVybiBsaWtlICIqYWJjKiIgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzdGFycywgcG9zaXRpb24gb2YgImFiYyIKLSAgICAgKiBpcyByZXR1cm5lZC4gRm9yIGEgcGF0dGVybiBsaWtlIio/PyoiIGluIHRleHQgImFiY2RmIiwgKDEsMykgaXMgcmV0dXJuZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nTWF0Y2hlci5Qb3NpdGlvbiBmaW5kKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICBpbnQgdGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChzdGFydCA8IDApCi0gICAgICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgIGlmIChlbmQgPiB0bGVuKQotICAgICAgICAgICAgZW5kID0gdGxlbjsKLSAgICAgICAgaWYgKGVuZCA8IDAgfHwgc3RhcnQgPj0gZW5kKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGlmIChmTGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHN0YXJ0LCBzdGFydCk7Ci0gICAgICAgIGlmIChmSWdub3JlV2lsZENhcmRzKSB7Ci0gICAgICAgICAgICBpbnQgeCA9IHBvc0luKHRleHQsIHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgaWYgKHggPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbih4LCB4ICsgZkxlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2VnQ291bnQgPSBmU2VnbWVudHMubGVuZ3RoOwotICAgICAgICBpZiAoc2VnQ291bnQgPT0gMCkvL3BhdHRlcm4gY29udGFpbnMgb25seSAnKicocykKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24oc3RhcnQsIGVuZCk7Ci0KLSAgICAgICAgaW50IGN1clBvcyA9IHN0YXJ0OwotICAgICAgICBpbnQgbWF0Y2hTdGFydCA9IC0xOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50ICYmIGN1clBvcyA8IGVuZDsgKytpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY3VycmVudCA9IGZTZWdtZW50c1tpXTsKLSAgICAgICAgICAgIGludCBuZXh0TWF0Y2ggPSByZWdFeHBQb3NJbih0ZXh0LCBjdXJQb3MsIGVuZCwgY3VycmVudCk7Ci0gICAgICAgICAgICBpZiAobmV4dE1hdGNoIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGlmIChpID09IDApCi0gICAgICAgICAgICAgICAgbWF0Y2hTdGFydCA9IG5leHRNYXRjaDsKLSAgICAgICAgICAgIGN1clBvcyA9IG5leHRNYXRjaCArIGN1cnJlbnQubGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkgPCBzZWdDb3VudCkgLy8gRW5zdXJlIGFsbCBzZWdtZW50cyBtYXRjaAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24obWF0Y2hTdGFydCwgY3VyUG9zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtYXRjaCB0aGUgZ2l2ZW4gPGNvZGU+dGV4dDwvY29kZT4gd2l0aCB0aGUgcGF0dGVybiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbWF0Y2hlZCBlaXRoZXJ3aXNlIGZhbHNlCi0gICAgICogQHBhcmFtIDxjb2RlPnRleHQ8L2NvZGU+LCBhIFN0cmluZyBvYmplY3QgCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIG1hdGNoKHRleHQsIDAsIHRleHQubGVuZ3RoKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIHRoZSBzdGFydGluZyAoaW5jbHVzaXZlKSBhbmQgdGhlIGVuZGluZyAoZXhjbHVzaXZlKSBwb2lzaXRpb25zIGluIHRoZSAgIAotICAgICAqIDxjb2RlPnRleHQ8L2NvZGU+LCBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHN1YnN0cmluZyBtYXRjaGVzIHdpdGggYVBhdHRlcm4gIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhlIHRleHQgbWF0Y2hlcyB0aGUgcGF0dGVybgotICAgICAqIEBwYXJhbSBTdHJpbmcgPGNvZGU+dGV4dDwvY29kZT4sIGEgU3RyaW5nIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzdWJzdHJpbmcgdG8gbWF0Y2ggCi0gICAgICogQHBhcmFtIGludCA8Y29kZT5zdGFydDxjb2RlPiBtYXJrcyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gKGluY2x1c2l2ZSkgb2YgdGhlIHN1YnN0cmluZwotICAgICAqIEBwYXJhbSBpbnQgPGNvZGU+ZW5kPGNvZGU+IG1hcmtzIHRoZSBlbmRpbmcgaW5kZXggKGV4Y2x1c2l2ZSkgb2YgdGhlIHN1YnN0cmluZyAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIGlmIChudWxsID09IHRleHQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChmSWdub3JlV2lsZENhcmRzKQotICAgICAgICAgICAgcmV0dXJuIChlbmQgLSBzdGFydCA9PSBmTGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAmJiBmUGF0dGVybi5yZWdpb25NYXRjaGVzKGZJZ25vcmVDYXNlLCAwLCB0ZXh0LCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTGVuZ3RoKTsKLSAgICAgICAgaW50IHNlZ0NvdW50ID0gZlNlZ21lbnRzLmxlbmd0aDsKLSAgICAgICAgaWYgKHNlZ0NvdW50ID09IDAgJiYgKGZIYXNMZWFkaW5nU3RhciB8fCBmSGFzVHJhaWxpbmdTdGFyKSkgLy8gcGF0dGVybiBjb250YWlucyBvbmx5ICcqJyhzKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChzdGFydCA9PSBlbmQpCi0gICAgICAgICAgICByZXR1cm4gZkxlbmd0aCA9PSAwOwotICAgICAgICBpZiAoZkxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ID09IGVuZDsKLQotICAgICAgICBpbnQgdGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChzdGFydCA8IDApCi0gICAgICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgIGlmIChlbmQgPiB0bGVuKQotICAgICAgICAgICAgZW5kID0gdGxlbjsKLQotICAgICAgICBpbnQgdEN1clBvcyA9IHN0YXJ0OwotICAgICAgICBpbnQgYm91bmQgPSBlbmQgLSBmQm91bmQ7Ci0gICAgICAgIGlmIChib3VuZCA8IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBmU2VnbWVudHNbaV07Ci0gICAgICAgIGludCBzZWdMZW5ndGggPSBjdXJyZW50Lmxlbmd0aCgpOwotCi0gICAgICAgIC8qIHByb2Nlc3MgZmlyc3Qgc2VnbWVudCAqLwotICAgICAgICBpZiAoIWZIYXNMZWFkaW5nU3RhcikgewotICAgICAgICAgICAgaWYgKCFyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIHN0YXJ0LCBjdXJyZW50LCAwLCBzZWdMZW5ndGgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICArK2k7Ci0gICAgICAgICAgICAgICAgdEN1clBvcyA9IHRDdXJQb3MgKyBzZWdMZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChmU2VnbWVudHMubGVuZ3RoID09IDEpICYmICghZkhhc0xlYWRpbmdTdGFyKQotICAgICAgICAgICAgICAgICYmICghZkhhc1RyYWlsaW5nU3RhcikpIHsKLSAgICAgICAgICAgIC8vIG9ubHkgb25lIHNlZ21lbnQgdG8gbWF0Y2gsIG5vIHdpbGRjYXJkcyBzcGVjaWZpZWQKLSAgICAgICAgICAgIHJldHVybiB0Q3VyUG9zID09IGVuZDsKLSAgICAgICAgfQotICAgICAgICAvKiBwcm9jZXNzIG1pZGRsZSBzZWdtZW50cyAqLwotICAgICAgICBmb3IgKDsgaSA8IHNlZ0NvdW50ICYmIHRDdXJQb3MgPD0gYm91bmQ7ICsraSkgewotICAgICAgICAgICAgY3VycmVudCA9IGZTZWdtZW50c1tpXTsKLSAgICAgICAgICAgIGludCBjdXJyZW50TWF0Y2g7Ci0gICAgICAgICAgICBpbnQgayA9IGN1cnJlbnQuaW5kZXhPZihmU2luZ2xlV2lsZENhcmQpOwotICAgICAgICAgICAgaWYgKGsgPCAwKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudE1hdGNoID0gdGV4dFBvc0luKHRleHQsIHRDdXJQb3MsIGVuZCwgY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRNYXRjaCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudE1hdGNoID0gcmVnRXhwUG9zSW4odGV4dCwgdEN1clBvcywgZW5kLCBjdXJyZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudE1hdGNoIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdEN1clBvcyA9IGN1cnJlbnRNYXRjaCArIGN1cnJlbnQubGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBwcm9jZXNzIGZpbmFsIHNlZ21lbnQgKi8KLSAgICAgICAgaWYgKCFmSGFzVHJhaWxpbmdTdGFyICYmIHRDdXJQb3MgIT0gZW5kKSB7Ci0gICAgICAgICAgICBpbnQgY2xlbiA9IGN1cnJlbnQubGVuZ3RoKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVnRXhwUmVnaW9uTWF0Y2hlcyh0ZXh0LCBlbmQgLSBjbGVuLCBjdXJyZW50LCAwLCBjbGVuKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaSA9PSBzZWdDb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBwYXJzZXMgdGhlIGdpdmVuIHBhdHRlcm4gaW50byBzZWdtZW50cyBzZXBlcmF0ZWQgYnkgd2lsZGNhcmQgJyonIGNoYXJhY3RlcnMuCi0gICAgICogU2luY2Ugd2lsZGNhcmRzIGFyZSBub3QgYmVpbmcgdXNlZCBpbiB0aGlzIGNhc2UsIHRoZSBwYXR0ZXJuIGNvbnNpc3RzIG9mIGEgc2luZ2xlIHNlZ21lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlTm9XaWxkQ2FyZHMoKSB7Ci0gICAgICAgIGZTZWdtZW50cyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICAgIGZTZWdtZW50c1swXSA9IGZQYXR0ZXJuOwotICAgICAgICBmQm91bmQgPSBmTGVuZ3RoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gcGF0dGVybiBpbnRvIHNlZ21lbnRzIHNlcGVyYXRlZCBieSB3aWxkY2FyZCAnKicgY2hhcmFjdGVycy4KLSAgICAgKiBAcGFyYW0gcCwgYSBTdHJpbmcgb2JqZWN0IHRoYXQgaXMgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHdpdGggJyonIGFuZC9vciAnPycKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VXaWxkQ2FyZHMoKSB7Ci0gICAgICAgIGlmIChmUGF0dGVybi5zdGFydHNXaXRoKCIqIikpLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgZkhhc0xlYWRpbmdTdGFyID0gdHJ1ZTsKLSAgICAgICAgaWYgKGZQYXR0ZXJuLmVuZHNXaXRoKCIqIikpIHsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAvKiBtYWtlIHN1cmUgaXQncyBub3QgYW4gZXNjYXBlZCB3aWxkY2FyZCAqLwotICAgICAgICAgICAgaWYgKGZMZW5ndGggPiAxICYmIGZQYXR0ZXJuLmNoYXJBdChmTGVuZ3RoIC0gMikgIT0gJ1xcJykgewotICAgICAgICAgICAgICAgIGZIYXNUcmFpbGluZ1N0YXIgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgVmVjdG9yIHRlbXAgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAgICAgaW50IHBvcyA9IDA7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHdoaWxlIChwb3MgPCBmTGVuZ3RoKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBmUGF0dGVybi5jaGFyQXQocG9zKyspOwotICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBmTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0ID0gZlBhdHRlcm4uY2hhckF0KHBvcysrKTsKLSAgICAgICAgICAgICAgICAgICAgLyogaWYgaXQncyBhbiBlc2NhcGUgc2VxdWVuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gJyonIHx8IG5leHQgPT0gJz8nIHx8IG5leHQgPT0gJ1xcJykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChuZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBhbiBlc2NhcGUgc2VxdWVuY2UsIGp1c3QgaW5zZXJ0IGxpdGVyYWxseSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobmV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICcqJzoKLSAgICAgICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvKiBuZXcgc2VnbWVudCAqLwotICAgICAgICAgICAgICAgICAgICB0ZW1wLmFkZEVsZW1lbnQoYnVmLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBmQm91bmQgKz0gYnVmLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBidWYuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgICAgICAgIC8qIGFwcGVuZCBzcGVjaWFsIGNoYXJhY3RlciByZXByZXNlbnRpbmcgc2luZ2xlIG1hdGNoIHdpbGRjYXJkICovCi0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChmU2luZ2xlV2lsZENhcmQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogYWRkIGxhc3QgYnVmZmVyIHRvIHNlZ21lbnQgbGlzdCAqLwotICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgdGVtcC5hZGRFbGVtZW50KGJ1Zi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGZCb3VuZCArPSBidWYubGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmU2VnbWVudHMgPSBuZXcgU3RyaW5nW3RlbXAuc2l6ZSgpXTsKLSAgICAgICAgdGVtcC5jb3B5SW50byhmU2VnbWVudHMpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBAcGFyYW0gPGNvZGU+dGV4dDwvY29kZT4sIGEgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIG5vIHdpbGRjYXJkCi0gICAgICogQHBhcmFtIDxjb2RlPnN0YXJ0PC9jb2RlPiwgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IGZvciBzZWFyY2gsIGluY2x1c2l2ZQotICAgICAqIEBwYXJhbSA8Y29kZT5lbmQ8L2NvZGU+LCB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBvZiB0aGUgcGF0dGVybiAsIG9yIC0xIGlmIG5vdCBmb3VuZCAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IHBvc0luKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsvL25vIHdpbGQgY2FyZCBpbiBwYXR0ZXJuCi0gICAgICAgIGludCBtYXggPSBlbmQgLSBmTGVuZ3RoOwotCi0gICAgICAgIGlmICghZklnbm9yZUNhc2UpIHsKLSAgICAgICAgICAgIGludCBpID0gdGV4dC5pbmRleE9mKGZQYXR0ZXJuLCBzdGFydCk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAtMSB8fCBpID4gbWF4KQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IG1heDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAodGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIGksIGZQYXR0ZXJuLCAwLCBmTGVuZ3RoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQHBhcmFtIDxjb2RlPnRleHQ8L2NvZGU+LCBhIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXkgb25seSBjb250YWluICc/JyhzKQotICAgICAqIEBwYXJhbSA8Y29kZT5zdGFydDwvY29kZT4sIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBmb3Igc2VhcmNoLCBpbmNsdXNpdmUKLSAgICAgKiBAcGFyYW0gPGNvZGU+ZW5kPC9jb2RlPiwgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCi0gICAgICogQHBhcmFtIDxjb2RlPnA8L2NvZGU+LCBhIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXkgY29udGFpbnMgJz8nCi0gICAgICogQHBhcmFtIDxjb2RlPmNhc2VJZ25vcmVkPC9jb2RlPiwgd2V0aGVyIHRoZSBwYXR0ZXJuIGlzIG5vdCBjYXNlc2Vuc2l0aXZlCi0gICAgICogQHJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgb2YgdGhlIHBhdHRlcm4gLCBvciAtMSBpZiBub3QgZm91bmQgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCByZWdFeHBQb3NJbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgcCkgewotICAgICAgICBpbnQgcGxlbiA9IHAubGVuZ3RoKCk7Ci0KLSAgICAgICAgaW50IG1heCA9IGVuZCAtIHBsZW47Ci0gICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBtYXg7ICsraSkgewotICAgICAgICAgICAgaWYgKHJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgaSwgcCwgMCwgcGxlbikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqIEBwYXJhbSA8Y29kZT50ZXh0PC9jb2RlPiwgYSBTdHJpbmcgdG8gbWF0Y2gKLSAgICAgKiBAcGFyYW0gPGNvZGU+c3RhcnQ8L2NvZGU+LCBpbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIHN0YXJ0aW5nIGluZGV4IG9mIG1hdGNoLCBpbmNsdXNpdmUKLSAgICAgKiBAcGFyYW0gPGNvZGU+ZW5kPC9jb2RlPiBpbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGVuZGluZyBpbmRleCBvZiBtYXRjaCwgZXhjbHVzaXZlCi0gICAgICogQHBhcmFtIDxjb2RlPnA8L2NvZGU+LCBTdHJpbmcsICBTdHJpbmcsIGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1heSBjb250YWluICc/JwotICAgICAqIEBwYXJhbSA8Y29kZT5pZ25vcmVDYXNlPC9jb2RlPiwgYm9vbGVhbiBpbmRpY2F0aW5nIHdldGhlciBjb2RlPnA8L2NvZGU+IGlzIGNhc2Ugc2Vuc2l0aXZlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVnRXhwUmVnaW9uTWF0Y2hlcyhTdHJpbmcgdGV4dCwgaW50IHRTdGFydCwgU3RyaW5nIHAsCi0gICAgICAgICAgICBpbnQgcFN0YXJ0LCBpbnQgcGxlbikgewotICAgICAgICB3aGlsZSAocGxlbi0tID4gMCkgewotICAgICAgICAgICAgY2hhciB0Y2hhciA9IHRleHQuY2hhckF0KHRTdGFydCsrKTsKLSAgICAgICAgICAgIGNoYXIgcGNoYXIgPSBwLmNoYXJBdChwU3RhcnQrKyk7Ci0KLSAgICAgICAgICAgIC8qIHByb2Nlc3Mgd2lsZCBjYXJkcyAqLwotICAgICAgICAgICAgaWYgKCFmSWdub3JlV2lsZENhcmRzKSB7Ci0gICAgICAgICAgICAgICAgLyogc2tpcCBzaW5nbGUgd2lsZCBjYXJkcyAqLwotICAgICAgICAgICAgICAgIGlmIChwY2hhciA9PSBmU2luZ2xlV2lsZENhcmQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBjaGFyID09IHRjaGFyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGZJZ25vcmVDYXNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b1VwcGVyQ2FzZSh0Y2hhcikgPT0gQ2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAudG9VcHBlckNhc2UocGNoYXIpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAvLyBjb21wYXJpbmcgYWZ0ZXIgY29udmVydGluZyB0byB1cHBlciBjYXNlIGRvZXNuJ3QgaGFuZGxlIGFsbCBjYXNlczsKLSAgICAgICAgICAgICAgICAvLyBhbHNvIGNvbXBhcmUgYWZ0ZXIgY29udmVydGluZyB0byBsb3dlciBjYXNlCi0gICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh0Y2hhcikgPT0gQ2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UocGNoYXIpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQHBhcmFtIDxjb2RlPnRleHQ8L2NvZGU+LCB0aGUgc3RyaW5nIHRvIG1hdGNoCi0gICAgICogQHBhcmFtIDxjb2RlPnN0YXJ0PC9jb2RlPiwgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IGZvciBzZWFyY2gsIGluY2x1c2l2ZQotICAgICAqIEBwYXJhbSA8Y29kZT5lbmQ8L2NvZGU+LCB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKLSAgICAgKiBAcGFyYW0gY29kZT5wPC9jb2RlPiwgYSBzdHJpbmcgdGhhdCBoYXMgbm8gd2lsZGNhcmQKLSAgICAgKiBAcGFyYW0gPGNvZGU+aWdub3JlQ2FzZTwvY29kZT4sIGJvb2xlYW4gaW5kaWNhdGluZyB3ZXRoZXIgY29kZT5wPC9jb2RlPiBpcyBjYXNlIHNlbnNpdGl2ZQotICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYgbm90IGZvdW5kIAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgdGV4dFBvc0luKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZyBwKSB7Ci0KLSAgICAgICAgaW50IHBsZW4gPSBwLmxlbmd0aCgpOwotICAgICAgICBpbnQgbWF4ID0gZW5kIC0gcGxlbjsKLQotICAgICAgICBpZiAoIWZJZ25vcmVDYXNlKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IHRleHQuaW5kZXhPZihwLCBzdGFydCk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAtMSB8fCBpID4gbWF4KQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbWF4OyArK2kpIHsKLSAgICAgICAgICAgIGlmICh0ZXh0LnJlZ2lvbk1hdGNoZXModHJ1ZSwgaSwgcCwgMCwgcGxlbikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9Ub2dnbGVMaW5raW5nQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1RvZ2dsZUxpbmtpbmdBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1NTY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL1RvZ2dsZUxpbmtpbmdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvcjsKLQotLyoqCi0gKiBUaGlzIGFjdGlvbiB0b2dnbGVzIHdoZXRoZXIgdGhpcyBuYXZpZ2F0b3IgbGlua3MgaXRzIHNlbGVjdGlvbiB0byB0aGUgYWN0aXZlCi0gKiBlZGl0b3IuCi0gKiAKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUxpbmtpbmdBY3Rpb24gZXh0ZW5kcyBSZXNvdXJjZU5hdmlnYXRvckFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgVG9nZ2xlTGlua2luZ0FjdGlvbihJUmVzb3VyY2VOYXZpZ2F0b3IgbmF2aWdhdG9yLCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgc3VwZXIobmF2aWdhdG9yLCBsYWJlbCk7Ci0gICAgICAgIHNldENoZWNrZWQobmF2aWdhdG9yLmlzTGlua2luZ0VuYWJsZWQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVucyB0aGUgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgZ2V0TmF2aWdhdG9yKCkuc2V0TGlua2luZ0VuYWJsZWQoaXNDaGVja2VkKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9Xb3Jrc3BhY2VBY3Rpb25Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9Xb3Jrc3BhY2VBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTEwYWUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9uYXZpZ2F0b3IvV29ya3NwYWNlQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgU2ViYXN0aWFuIERhdmlkcyA8c2Rhdmlkc0BnbXguZGU+IC0gSW1hZ2VzIGZvciBtZW51IGl0ZW1zICgyNzQ4MSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJ1aWxkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ2xvc2VSZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLk9wZW5SZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlJlZnJlc2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERUFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYWN0aW9uIGdyb3VwIGZvciB3b3Jrc3BhY2UgYWN0aW9ucyBzdWNoIGFzIEJ1aWxkLCBSZWZyZXNoIExvY2FsLAotICogYW5kIE9wZW4vQ2xvc2UgUHJvamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZUFjdGlvbkdyb3VwIGV4dGVuZHMgUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb25Hcm91cCB7Ci0KLSAgICBwcml2YXRlIEJ1aWxkQWN0aW9uIGJ1aWxkQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBPcGVuUmVzb3VyY2VBY3Rpb24gb3BlblByb2plY3RBY3Rpb247Ci0KLSAgICBwcml2YXRlIENsb3NlUmVzb3VyY2VBY3Rpb24gY2xvc2VQcm9qZWN0QWN0aW9uOwotCi0gICAgcHJpdmF0ZSBSZWZyZXNoQWN0aW9uIHJlZnJlc2hBY3Rpb247Ci0KLSAgICBwdWJsaWMgV29ya3NwYWNlQWN0aW9uR3JvdXAoSVJlc291cmNlTmF2aWdhdG9yIG5hdmlnYXRvcikgewotICAgICAgICBzdXBlcihuYXZpZ2F0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLSAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVGUkVTSC5nZXRJZCgpLAotICAgICAgICAgICAgICAgIHJlZnJlc2hBY3Rpb24pOwotICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSURFQWN0aW9uRmFjdG9yeS5CVUlMRF9QUk9KRUNUCi0gICAgICAgICAgICAgICAgLmdldElkKCksIGJ1aWxkQWN0aW9uKTsKLSAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotICAgICAgICAgICAgICAgIElERUFjdGlvbkZhY3RvcnkuT1BFTl9QUk9KRUNULmdldElkKCksIG9wZW5Qcm9qZWN0QWN0aW9uKTsKLSAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElERUFjdGlvbkZhY3RvcnkuQ0xPU0VfUFJPSkVDVAotICAgICAgICAgICAgICAgIC5nZXRJZCgpLCBjbG9zZVByb2plY3RBY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGJ1aWxkLCBvcGVuIHByb2plY3QsIGNsb3NlIHByb2plY3QgYW5kIHJlZnJlc2ggcmVzb3VyY2UKLSAgICAgKiBhY3Rpb25zIHRvIHRoZSBjb250ZXh0IG1lbnUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFwcGx5OiAKLSAgICAgKiAJYnVpbGQtb25seSBwcm9qZWN0cyBzZWxlY3RlZCwgYXV0byBidWlsZCBkaXNhYmxlZCwgYXQgbGVhc3Qgb25lIAotICAgICAqIAkJYnVpbGRlciBwcmVzZW50Ci0gICAgICogCW9wZW4gcHJvamVjdC1vbmx5IHByb2plY3RzIHNlbGVjdGVkLCBhdCBsZWFzdCBvbmUgY2xvc2VkIHByb2plY3QKLSAgICAgKiAJY2xvc2UgcHJvamVjdC1vbmx5IHByb2plY3RzIHNlbGVjdGVkLCBhdCBsZWFzdCBvbmUgb3BlbiBwcm9qZWN0Ci0gICAgICogCXJlZnJlc2gtbm8gY2xvc2VkIHByb2plY3Qgc2VsZWN0ZWQKLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogQm90aCB0aGUgb3BlbiBwcm9qZWN0IGFuZCBjbG9zZSBwcm9qZWN0IGFjdGlvbiBtYXkgYmUgb24gdGhlIG1lbnUKLSAgICAgKiBhdCB0aGUgc2FtZSB0aW1lLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBObyBkaXNhYmxlZCBhY3Rpb24gc2hvdWxkIGJlIG9uIHRoZSBjb250ZXh0IG1lbnUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZW51IGNvbnRleHQgbWVudSB0byBhZGQgYWN0aW9ucyB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgYm9vbGVhbiBpc1Byb2plY3RTZWxlY3Rpb24gPSB0cnVlOwotICAgICAgICBib29sZWFuIGhhc09wZW5Qcm9qZWN0cyA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGhhc0Nsb3NlZFByb2plY3RzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gaGFzQnVpbGRlciA9IHRydWU7IC8vIGZhbHNlIGlmIGFueSBwcm9qZWN0IGlzIGNsb3NlZCBvciBkb2VzIG5vdCBoYXZlIGJ1aWxkZXIgCi0gICAgICAgIEl0ZXJhdG9yIHJlc291cmNlcyA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChyZXNvdXJjZXMuaGFzTmV4dCgpCi0gICAgICAgICAgICAgICAgJiYgKCFoYXNPcGVuUHJvamVjdHMgfHwgIWhhc0Nsb3NlZFByb2plY3RzIHx8IGhhc0J1aWxkZXIgfHwgaXNQcm9qZWN0U2VsZWN0aW9uKSkgewotICAgICAgICAgICAgT2JqZWN0IG5leHQgPSByZXNvdXJjZXMubmV4dCgpOwotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgSVByb2plY3QpCi0gICAgICAgICAgICAgICAgcHJvamVjdCA9IChJUHJvamVjdCkgbmV4dDsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotICAgICAgICAgICAgICAgIHByb2plY3QgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgbmV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQotICAgICAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlzUHJvamVjdFNlbGVjdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgICBoYXNPcGVuUHJvamVjdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmIChoYXNCdWlsZGVyICYmICFoYXNCdWlsZGVyKHByb2plY3QpKQotICAgICAgICAgICAgICAgICAgICBoYXNCdWlsZGVyID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhhc0Nsb3NlZFByb2plY3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBoYXNCdWlsZGVyID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIGlzUHJvamVjdFNlbGVjdGlvbgotICAgICAgICAgICAgICAgICYmICFSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKQotICAgICAgICAgICAgICAgICYmIGhhc0J1aWxkZXIpIHsKLSAgICAgICAgICAgIC8vIEFsbG93IG1hbnVhbCBpbmNyZW1lbnRhbCBidWlsZCBvbmx5IGlmIGF1dG8gYnVpbGQgaXMgb2ZmLgotICAgICAgICAgICAgYnVpbGRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotICAgICAgICAgICAgbWVudS5hZGQoYnVpbGRBY3Rpb24pOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaGFzQ2xvc2VkUHJvamVjdHMpIHsKLSAgICAgICAgICAgIHJlZnJlc2hBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotICAgICAgICAgICAgbWVudS5hZGQocmVmcmVzaEFjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzUHJvamVjdFNlbGVjdGlvbikgewotICAgICAgICAgICAgaWYgKGhhc0Nsb3NlZFByb2plY3RzKSB7Ci0gICAgICAgICAgICAgICAgb3BlblByb2plY3RBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgIG1lbnUuYWRkKG9wZW5Qcm9qZWN0QWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoYXNPcGVuUHJvamVjdHMpIHsKLSAgICAgICAgICAgICAgICBjbG9zZVByb2plY3RBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgIG1lbnUuYWRkKGNsb3NlUHJvamVjdEFjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIGEga2V5IHByZXNzZWQgZXZlbnQgYnkgaW52b2tpbmcgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVLZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IFNXVC5GNSAmJiBldmVudC5zdGF0ZU1hc2sgPT0gMCkgewotICAgICAgICAgICAgaWYgKHJlZnJlc2hBY3Rpb24uaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZWZyZXNoQWN0aW9uLnJlZnJlc2hBbGwoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU3dhbGxvdyB0aGUgZXZlbnQKLSAgICAgICAgICAgIGV2ZW50LmRvaXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGVyZSBhcmUgYnVpbGRlcnMgY29uZmlndXJlZCBvbiB0aGUgZ2l2ZW4gcHJvamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaGFzIGJ1aWxkZXJzLAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdCwgb3IgaWYgdGhpcyBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZAotICAgICAqLwotICAgIGJvb2xlYW4gaGFzQnVpbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQ29tbWFuZFtdIGNvbW1hbmRzID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldEJ1aWxkU3BlYygpOwotICAgICAgICAgICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ2Fubm90IGRldGVybWluZSBpZiBwcm9qZWN0IGhhcyBidWlsZGVycy4gUHJvamVjdCBpcyBjbG9zZWQgCi0gICAgICAgICAgICAvLyBvciBkb2VzIG5vdCBleGlzdC4gRmFsbCB0aHJvdWdoIHRvIHJldHVybiBmYWxzZS4KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gbmF2aWdhdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpOwotICAgICAgICBvcGVuUHJvamVjdEFjdGlvbiA9IG5ldyBPcGVuUmVzb3VyY2VBY3Rpb24oc2hlbGwpOwotICAgICAgICBjbG9zZVByb2plY3RBY3Rpb24gPSBuZXcgQ2xvc2VSZXNvdXJjZUFjdGlvbihzaGVsbCk7Ci0gICAgICAgIHJlZnJlc2hBY3Rpb24gPSBuZXcgUmVmcmVzaEFjdGlvbihzaGVsbCk7Ci0gICAgICAgIHJlZnJlc2hBY3Rpb24KLSAgICAgICAgICAgICAgICAuc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoZ2V0SW1hZ2VEZXNjcmlwdG9yKCJkbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIikpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVmcmVzaEFjdGlvbgotICAgICAgICAgICAgICAgIC5zZXRJbWFnZURlc2NyaXB0b3IoZ2V0SW1hZ2VEZXNjcmlwdG9yKCJlbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIikpOy8vJE5PTi1OTFMtMSQJCi0gICAgICAgIGJ1aWxkQWN0aW9uID0gbmV3IEJ1aWxkQWN0aW9uKHNoZWxsLAotICAgICAgICAgICAgICAgIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFjdGlvbkJhcnMoKSB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICByZWZyZXNoQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgYnVpbGRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotICAgICAgICBvcGVuUHJvamVjdEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0gICAgICAgIGNsb3NlUHJvamVjdEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL25hdmlnYXRvci9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViMjAxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvbmF2aWdhdG9yL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgc3RhbmRhcmQgUmVzb3VyY2UgTmF2aWdhdG9yIHZpZXcgd2hpY2gKLXByZXNlbnRzIHRoZSB0cmVlIG9mIHJlc291cmNlcyBpbiB0aGUgd29ya3NwYWNlLgotPGJyPiZuYnNwOwotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvRmlsZVByb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9GaWxlUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyOWE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9GaWxlUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICogVGhlIEZpbGVQcm9wZXJ0eVNvdXJjZSBnaXZlcyB0aGUgZXh0cmEgaW5mb3JtYXRpb24gdGhhdCBpcyBzaG93biBmb3IgZmlsZXMKLSAqLwotcHVibGljIGNsYXNzIEZpbGVQcm9wZXJ0eVNvdXJjZSBleHRlbmRzIFJlc291cmNlUHJvcGVydHlTb3VyY2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlEZXNjcmlwdG9yIGZpbGVEZXNjcmlwdG9yOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIGZpbGVEZXNjcmlwdG9yID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50cy5QX1NJWkVfUkVTLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfRElTUExBWV9TSVpFKTsKLSAgICAgICAgZmlsZURlc2NyaXB0b3Iuc2V0QWx3YXlzSW5jb21wYXRpYmxlKHRydWUpOwotICAgICAgICBmaWxlRGVzY3JpcHRvcgotICAgICAgICAgICAgICAgIC5zZXRDYXRlZ29yeShJUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50cy5QX0ZJTEVfU1lTVEVNX0NBVEVHT1JZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIHByb3BlcnR5IHNvdXJjZSBmb3IgYSBmaWxlIHJlc291cmNlLgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHJlc291cmNlCi0gICAgICovCi0gICAgcHVibGljIEZpbGVQcm9wZXJ0eVNvdXJjZShJRmlsZSBmaWxlKSB7Ci0gICAgICAgIHN1cGVyKGZpbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIFByb3BlcnR5RGVzY3JpcHRvciB0aGF0IGRlZmluZXMgdGhlIHNpemUgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSBQcm9wZXJ0eURlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0SW5pdGlhbFByb3BlcnR5RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVEZXNjcmlwdG9yOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLSAgICAgICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHN1cGVyRGVzY3JpcHRvcnMgPSBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGludCBzdXBlckxlbmd0aCA9IHN1cGVyRGVzY3JpcHRvcnMubGVuZ3RoOwotICAgICAgICBJUHJvcGVydHlEZXNjcmlwdG9yW10gZmlsZURlc2NyaXB0b3JzID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3Jbc3VwZXJMZW5ndGggKyAxXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShzdXBlckRlc2NyaXB0b3JzLCAwLCBmaWxlRGVzY3JpcHRvcnMsIDAsIHN1cGVyTGVuZ3RoKTsKLSAgICAgICAgZmlsZURlc2NyaXB0b3JzW3N1cGVyTGVuZ3RoXSA9IGdldEluaXRpYWxQcm9wZXJ0eURlc2NyaXB0b3IoKTsKLQotICAgICAgICByZXR1cm4gZmlsZURlc2NyaXB0b3JzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3Qga2V5KSB7Ci0KLSAgICAgICAgT2JqZWN0IHJldHVyblZhbHVlID0gc3VwZXIuZ2V0UHJvcGVydHlWYWx1ZShrZXkpOwotCi0gICAgICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotCi0gICAgICAgIGlmIChrZXkuZXF1YWxzKElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfU0laRV9SRVMpKQotICAgICAgICAgICAgcmV0dXJuIGdldFNpemVTdHJpbmcoKElGaWxlKSBlbGVtZW50KTsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBTdHJpbmcgdGhhdCBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIHN1cHBsaWVkIGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2l6ZVN0cmluZyhJRmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmICghZmlsZS5pc0xvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkKLSAgICAgICAgICAgIHJldHVybiBOT1RfTE9DQUxfVEVYVDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBJUGF0aCBsb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNMaW5rZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOREVGSU5FRF9QQVRIX1ZBUklBQkxFOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZJTEVfTk9UX0ZPVU5EOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGaWxlIGxvY2FsRmlsZSA9IGxvY2F0aW9uLnRvRmlsZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvY2FsRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhsb2NhbEZpbGUubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRklMRV9OT1RfRk9VTkQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lERVByb3BlcnRpZXNNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvSURFUHJvcGVydGllc01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTE3YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvSURFUHJvcGVydGllc01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aGljaCBoZWxwcyBtYW5hZ2UgbWVzc2FnZXMuCi0gKiBAZGVwcmVjYXRlZCBUaGVzZSBtZXNzYWdlcyBhcmUgbm90IEFQSSBhbmQgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkCi0gKiBvdXRzaWRlIG9mIHRoaXMgcGx1Zy1pbi4KLSAqLwotY2xhc3MgSURFUHJvcGVydGllc01lc3NhZ2VzIHsKLSAgICBwcml2YXRlIElERVByb3BlcnRpZXNNZXNzYWdlcygpIHsKLSAgICAgICAgLy8gcHJldmVudCBpbnN0YW50aWF0aW9uIG9mIGNsYXNzCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbiBrZXkgaW4KLSAgICAgKiB0aGUgcmVzb3VyY2UgYnVuZGxlLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgdGhlIHJlc291cmNlIG5hbWUKLSAgICAgKiBAcGFyYW0gYXJncyB0aGUgbWVzc2FnZSBhcmd1bWVudHMKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBrZXkgaW4KLSAgICAgKiB0aGUgcmVzb3VyY2UgYnVuZGxlLiBJZiB0aGVyZSBpc24ndCBhbnkgdmFsdWUgdW5kZXIKLSAgICAgKiB0aGUgZ2l2ZW4ga2V5LCB0aGUga2V5IGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDA4YzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXMuSURFUHJvcGVydGllc01lc3NhZ2VzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRvY3VtZW50cyB0aGUgcHJvcGVydHkgY29uc3RhbnRzIHVzZWQgYnkgdGhlIHJlc291cmNlCi0gKiBwcm9wZXJ0eSBzb3VyY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMgewotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPiBwcm9wZXJ0eSBrZXkgZm9yIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9MQUJFTF9SRVMgPSBJREVQcm9wZXJ0aWVzTWVzc2FnZXMuSVJlc291cmNlUHJvcGVydHlDb25zdGFudHNfbmFtZTsKLQotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPiBwcm9wZXJ0eSBrZXkgZm9yIHBhdGguCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9QQVRIX1JFUyA9ICJvcmcuZWNsaXBzZS51aS5wYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIAotICAgICAqIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+IHByb3BlcnR5IGtleSBmb3IgZGlzcGxheSBwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRElTUExBWVBBVEhfUkVTID0gSURFUHJvcGVydGllc01lc3NhZ2VzLklSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzX3BhdGg7Ci0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gcHJvcGVydHkga2V5IGZvciByZWFkLW9ubHkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9FRElUQUJMRV9SRVMgPSAib3JnLmVjbGlwc2UudWkuZWRpdGFibGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gcHJvcGVydHkga2V5IGZvciBkaXNwbGF5IHJlYWQtb25seS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0RJU1BMQVlFRElUQUJMRV9SRVMgPSBJREVQcm9wZXJ0aWVzTWVzc2FnZXMuSVJlc291cmNlUHJvcGVydHlDb25zdGFudHNfZWRpdGFibGU7Ci0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gcHJvcGVydHkga2V5IGZvciByZWFkLW9ubHkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9ERVJJVkVEX1JFUyA9ICJvcmcuZWNsaXBzZS51aS5kZXJpdmVkIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIAotICAgICAqIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+IHByb3BlcnR5IGtleSBmb3IgZGlzcGxheSByZWFkLW9ubHkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9ESVNQTEFZREVSSVZFRF9SRVMgPSBJREVQcm9wZXJ0aWVzTWVzc2FnZXMuSVJlc291cmNlUHJvcGVydHlDb25zdGFudHNfZGVyaXZlZDsKLQotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPiBwcm9wZXJ0eSBrZXkgZm9yIGxvY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfTE9DQVRJT05fUkVTID0gIm9yZy5lY2xpcHNlLnVpLmxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIAotICAgICAqIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+IHByb3BlcnR5IGtleSBmb3IgZGlzcGxheSBsb2NhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0RJU1BMQVlMT0NBVElPTl9SRVMgPSBJREVQcm9wZXJ0aWVzTWVzc2FnZXMuSVJlc291cmNlUHJvcGVydHlDb25zdGFudHNfbG9jYXRpb247Ci0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gcHJvcGVydHkga2V5IGZvciByZXNvbHZlZCBsb2NhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1JFU09MVkVEX0xPQ0FUSU9OX1JFUyA9ICJvcmcuZWNsaXBzZS51aS5yZXNvbHZlZExvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJCwKLQotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPiBwcm9wZXJ0eSBrZXkgZm9yIGRpc3BsYXkgcmVzb2x2ZWQgbG9jYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9ESVNQTEFZUkVTT0xWRURfTE9DQVRJT05fUkVTID0gSURFUHJvcGVydGllc01lc3NhZ2VzLklSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzX3Jlc29sdmVkTG9jYXRpb247Ci0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gcHJvcGVydHkga2V5IGZvciBsaW5rZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9MSU5LRURfUkVTID0gIm9yZy5lY2xpcHNlLnVpLmxpbmtlZCI7IC8vJE5PTi1OTFMtMSQsCi0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gcHJvcGVydHkga2V5IGZvciBkaXNwbGF5IGxpbmtlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0RJU1BMQVlMSU5LRURfUkVTID0gSURFUHJvcGVydGllc01lc3NhZ2VzLklSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzX2xpbmtlZDsKLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+IGNhdGVnb3J5IGZvciB0aGUgYmFzZSB2YWx1ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0ZJTEVfU1lTVEVNX0NBVEVHT1JZID0gSURFUHJvcGVydGllc01lc3NhZ2VzLklSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzX2luZm87Ci0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gcHJvcGVydHkga2V5IGZvciBwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfU0laRV9SRVMgPSAib3JnLmVjbGlwc2UudWkuc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+IHByb3BlcnR5IGtleSBmb3IgZGlzcGxheWluZyBzaXplCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9ESVNQTEFZX1NJWkUgPSBJREVQcm9wZXJ0aWVzTWVzc2FnZXMuSVJlc291cmNlUHJvcGVydHlDb25zdGFudHNfc2l6ZTsKLQotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPiBwcm9wZXJ0eSBrZXkgZm9yIHBhdGguCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9MQVNUX01PRElGSUVEX1JFUyA9ICJvcmcuZWNsaXBzZS51aS5sYXN0bW9kaWZpZWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPiBjYXRlZ29yeSBmb3IgbGFzdCBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRElTUExBWV9MQVNUX01PRElGSUVEID0gSURFUHJvcGVydGllc01lc3NhZ2VzLklSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzX2xhc3RNb2RpZmllZDsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUmVzb3VyY2VQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUmVzb3VyY2VQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODI3OTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Jlc291cmNlUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzaWNQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLklERVByb3BlcnRpZXNNZXNzYWdlczsKLQotLyoqCi0gKiBBIFJlc291cmNlIHByb3BlcnR5IHNvdXJjZS4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlUHJvcGVydHlTb3VyY2UgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UgewotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIE5PVF9MT0NBTF9URVhUID0gSURFUHJvcGVydGllc01lc3NhZ2VzLlByb3BlcnR5U291cmNlX25vdExvY2FsOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgRklMRV9OT1RfRk9VTkQgPSBJREVQcm9wZXJ0aWVzTWVzc2FnZXMuUHJvcGVydHlTb3VyY2Vfbm90Rm91bmQ7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBVTkRFRklORURfUEFUSF9WQVJJQUJMRSA9IElERVByb3BlcnRpZXNNZXNzYWdlcy5Qcm9wZXJ0eVNvdXJjZV91bmRlZmluZWRQYXRoVmFyaWFibGU7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBGSUxFX05PVF9FWElTVF9URVhUID0gSURFUHJvcGVydGllc01lc3NhZ2VzLlByb3BlcnR5U291cmNlX2ZpbGVOb3RFeGlzdDsKLQotICAgIC8vIFRoZSBlbGVtZW50IGZvciB0aGUgcHJvcGVydHkgc291cmNlCi0gICAgcHJvdGVjdGVkIElSZXNvdXJjZSBlbGVtZW50OwotCi0gICAgLy8gRXJyb3IgbWVzc2FnZSB3aGVuIHNldHRpbmcgYSBwcm9wZXJ0eSBpbmNvcnJlY3RseQotICAgIHByb3RlY3RlZCBTdHJpbmcgZXJyb3JNZXNzYWdlID0gSURFUHJvcGVydGllc01lc3NhZ2VzLlByb3BlcnR5U291cmNlX3JlYWRPbmx5OwotCi0gICAgLy8gUHJvcGVydHkgRGVzY3JpcHRvcnMKLSAgICBzdGF0aWMgcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbN107Ci0KLSAgICBzdGF0aWMgcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzTGlua1ZhcmlhYmxlID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbOF07Ci0gICAgc3RhdGljIHsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0KLSAgICAgICAgLy8gcmVzb3VyY2UgbmFtZQotICAgICAgICBkZXNjcmlwdG9yID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvcihJQmFzaWNQcm9wZXJ0eUNvbnN0YW50cy5QX1RFWFQsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9MQUJFTF9SRVMpOwotICAgICAgICBkZXNjcmlwdG9yLnNldEFsd2F5c0luY29tcGF0aWJsZSh0cnVlKTsKLSAgICAgICAgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgIC5zZXRDYXRlZ29yeShJUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50cy5QX0ZJTEVfU1lTVEVNX0NBVEVHT1JZKTsKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yc1swXSA9IGRlc2NyaXB0b3I7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvcnNMaW5rVmFyaWFibGVbMF0gPSBkZXNjcmlwdG9yOwotCi0gICAgICAgIC8vIFJlbGF0aXZlIHBhdGgKLSAgICAgICAgZGVzY3JpcHRvciA9IG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9QQVRIX1JFUywKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50cy5QX0RJU1BMQVlQQVRIX1JFUyk7Ci0gICAgICAgIGRlc2NyaXB0b3Iuc2V0QWx3YXlzSW5jb21wYXRpYmxlKHRydWUpOwotICAgICAgICBkZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgLnNldENhdGVnb3J5KElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfRklMRV9TWVNURU1fQ0FURUdPUlkpOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3JzWzFdID0gZGVzY3JpcHRvcjsKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yc0xpbmtWYXJpYWJsZVsxXSA9IGRlc2NyaXB0b3I7Ci0KLSAgICAgICAgLy8gcmVhZHdyaXRlIHN0YXRlCi0gICAgICAgIGRlc2NyaXB0b3IgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgIElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfRURJVEFCTEVfUkVTLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfRElTUExBWUVESVRBQkxFX1JFUyk7Ci0gICAgICAgIGRlc2NyaXB0b3Iuc2V0QWx3YXlzSW5jb21wYXRpYmxlKHRydWUpOwotICAgICAgICBkZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgLnNldENhdGVnb3J5KElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfRklMRV9TWVNURU1fQ0FURUdPUlkpOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3JzWzJdID0gZGVzY3JpcHRvcjsKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yc0xpbmtWYXJpYWJsZVsyXSA9IGRlc2NyaXB0b3I7Ci0KLSAgICAgICAgLy8gZGVyaXZlZCBzdGF0ZQotICAgICAgICBkZXNjcmlwdG9yID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50cy5QX0RFUklWRURfUkVTLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfRElTUExBWURFUklWRURfUkVTKTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXRBbHdheXNJbmNvbXBhdGlibGUodHJ1ZSk7Ci0gICAgICAgIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAuc2V0Q2F0ZWdvcnkoSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9GSUxFX1NZU1RFTV9DQVRFR09SWSk7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvcnNbM10gPSBkZXNjcmlwdG9yOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3JzTGlua1ZhcmlhYmxlWzNdID0gZGVzY3JpcHRvcjsKLQotICAgICAgICAvLyBsYXN0IG1vZGlmaWVkIHN0YXRlCi0gICAgICAgIGRlc2NyaXB0b3IgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgIElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfTEFTVF9NT0RJRklFRF9SRVMsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9ESVNQTEFZX0xBU1RfTU9ESUZJRUQpOwotICAgICAgICBkZXNjcmlwdG9yLnNldEFsd2F5c0luY29tcGF0aWJsZSh0cnVlKTsKLSAgICAgICAgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgIC5zZXRDYXRlZ29yeShJUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50cy5QX0ZJTEVfU1lTVEVNX0NBVEVHT1JZKTsKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yc1s0XSA9IGRlc2NyaXB0b3I7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvcnNMaW5rVmFyaWFibGVbNF0gPSBkZXNjcmlwdG9yOwotCi0gICAgICAgIC8vIGxpbmsgc3RhdGUKLSAgICAgICAgZGVzY3JpcHRvciA9IG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9MSU5LRURfUkVTLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfRElTUExBWUxJTktFRF9SRVMpOwotICAgICAgICBkZXNjcmlwdG9yLnNldEFsd2F5c0luY29tcGF0aWJsZSh0cnVlKTsKLSAgICAgICAgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgIC5zZXRDYXRlZ29yeShJUmVzb3VyY2VQcm9wZXJ0eUNvbnN0YW50cy5QX0ZJTEVfU1lTVEVNX0NBVEVHT1JZKTsKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yc1s1XSA9IGRlc2NyaXB0b3I7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvcnNMaW5rVmFyaWFibGVbNV0gPSBkZXNjcmlwdG9yOwotCi0gICAgICAgIC8vIGxvY2F0aW9uCi0gICAgICAgIGRlc2NyaXB0b3IgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgIElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfTE9DQVRJT05fUkVTLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfRElTUExBWUxPQ0FUSU9OX1JFUyk7Ci0gICAgICAgIGRlc2NyaXB0b3Iuc2V0QWx3YXlzSW5jb21wYXRpYmxlKHRydWUpOwotICAgICAgICBkZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgLnNldENhdGVnb3J5KElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfRklMRV9TWVNURU1fQ0FURUdPUlkpOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3JzWzZdID0gZGVzY3JpcHRvcjsKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yc0xpbmtWYXJpYWJsZVs2XSA9IGRlc2NyaXB0b3I7Ci0KLSAgICAgICAgLy8gcmVzb2x2ZWQgbG9jYXRpb24KLSAgICAgICAgZGVzY3JpcHRvciA9IG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9SRVNPTFZFRF9MT0NBVElPTl9SRVMsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9ESVNQTEFZUkVTT0xWRURfTE9DQVRJT05fUkVTKTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXRBbHdheXNJbmNvbXBhdGlibGUodHJ1ZSk7Ci0gICAgICAgIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAuc2V0Q2F0ZWdvcnkoSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9GSUxFX1NZU1RFTV9DQVRFR09SWSk7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvcnNMaW5rVmFyaWFibGVbN10gPSBkZXNjcmlwdG9yOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFByb3BlcnR5U291cmNlIGFuZCBzdG9yZXMgaXRzIElSZXNvdXJjZQotICAgICAqCi0gICAgICogQHBhcmFtIHJlcyB0aGUgcmVzb3VyY2UgZm9yIHdoaWNoIHRoaXMgaXMgYSBwcm9wZXJ0eSBzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VQcm9wZXJ0eVNvdXJjZShJUmVzb3VyY2UgcmVzKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwocmVzKTsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gcmVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBkYXRlIHN0cmluZyBmb3IgdGhlIHRpbWVzdGFtcCBvZiB0aGUgc3VwcGxpZWQgcmVzb3VyY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0byBxdWVyeQotICAgICAqIEByZXR1cm4gdGhlIGRhdGUgc3RyaW5nIGZvciB0aGUgcmVzb3VyY2UgCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0ZVN0cmluZ1ZhbHVlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCi0gICAgICAgIGlmICghcmVzb3VyY2UuaXNMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTykpCi0gICAgICAgICAgICByZXR1cm4gTk9UX0xPQ0FMX1RFWFQ7Ci0KLSAgICAgICAgSVBhdGggbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJlc291cmNlLmlzTGlua2VkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVOREVGSU5FRF9QQVRIX1ZBUklBQkxFOwotCi0gICAgICAgICAgICByZXR1cm4gRklMRV9OT1RfRk9VTkQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGaWxlIGxvY2FsRmlsZSA9IGxvY2F0aW9uLnRvRmlsZSgpOwotICAgICAgICAgICAgaWYgKGxvY2FsRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIERhdGVGb3JtYXQgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0LmZvcm1hdChuZXcgRGF0ZShsb2NhbEZpbGUubGFzdE1vZGlmaWVkKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBGSUxFX05PVF9GT1VORDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsb2NhdGlvbiBvZiBhIHJlc291cmNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25UZXh0KElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICBpZiAoIXJlc291cmNlLmlzTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8pKQotICAgICAgICAgICAgcmV0dXJuIE5PVF9MT0NBTF9URVhUOwotCi0gICAgICAgIElQYXRoIHJlc29sdmVkTG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotICAgICAgICBJUGF0aCBsb2NhdGlvbiA9IHJlc29sdmVkTG9jYXRpb247Ci0gICAgICAgIGlmIChyZXNvdXJjZS5pc0xpbmtlZCgpKSB7Ci0gICAgICAgICAgICBsb2NhdGlvbiA9IHJlc291cmNlLmdldFJhd0xvY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBGSUxFX05PVF9GT1VORDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvblN0cmluZyA9IGxvY2F0aW9uLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlZExvY2F0aW9uICE9IG51bGwgJiYgIWlzUGF0aFZhcmlhYmxlKHJlc291cmNlKSkgewotICAgICAgICAgICAgICAgIC8vIE5vIHBhdGggdmFyaWFibGUgdXNlZC4gRGlzcGxheSB0aGUgZmlsZSBub3QgZXhpc3QgbWVzc2FnZSAKLSAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbG9jYXRpb24uIEZpeGVzIGJ1ZyAzMzMxOC4gCi0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gcmVzb2x2ZWRMb2NhdGlvbi50b0ZpbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25TdHJpbmcgKz0gIiAiICsgRklMRV9OT1RfRVhJU1RfVEVYVDsgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25TdHJpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHJlc29sdmVkIGxvY2F0aW9uIG9mIGEgcmVzb3VyY2UuCi0gICAgICogVGhpcyByZXNvbHZlcyBwYXRoIHZhcmlhYmxlcyBpZiBwcmVzZW50IGluIHRoZSByZXNvdXJjZSBwYXRoLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFJlc29sdmVkTG9jYXRpb25UZXh0KElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICBpZiAoIXJlc291cmNlLmlzTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8pKQotICAgICAgICAgICAgcmV0dXJuIE5PVF9MT0NBTF9URVhUOwotCi0gICAgICAgIElQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZS5pc0xpbmtlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBVTkRFRklORURfUEFUSF9WQVJJQUJMRTsKLQotICAgICAgICAgICAgcmV0dXJuIEZJTEVfTk9UX0ZPVU5EOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uU3RyaW5nID0gbG9jYXRpb24udG9PU1N0cmluZygpOwotICAgICAgICAgICAgRmlsZSBmaWxlID0gbG9jYXRpb24udG9GaWxlKCk7Ci0KLSAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGxvY2F0aW9uU3RyaW5nICs9ICIgIiArIEZJTEVfTk9UX0VYSVNUX1RFWFQ7IC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25TdHJpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0gICAgICAgIGlmIChpc1BhdGhWYXJpYWJsZShlbGVtZW50KSkKLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzTGlua1ZhcmlhYmxlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKElCYXNpY1Byb3BlcnR5Q29uc3RhbnRzLlBfVEVYVCkpIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZS5lcXVhbHMoSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9QQVRIX1JFUykpIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZS5lcXVhbHMoSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9MQVNUX01PRElGSUVEX1JFUykpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXREYXRlU3RyaW5nVmFsdWUoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfRURJVEFCTEVfUkVTKSkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNSZWFkT25seSgpKQotICAgICAgICAgICAgICAgIHJldHVybiBJREVQcm9wZXJ0aWVzTWVzc2FnZXMuUmVzb3VyY2VQcm9wZXJ0eV9mYWxzZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gSURFUHJvcGVydGllc01lc3NhZ2VzLlJlc291cmNlUHJvcGVydHlfdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZS5lcXVhbHMoSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9ERVJJVkVEX1JFUykpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihlbGVtZW50LmlzRGVyaXZlZCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZS5lcXVhbHMoSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9MSU5LRURfUkVTKSkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGVsZW1lbnQuaXNMaW5rZWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKElSZXNvdXJjZVByb3BlcnR5Q29uc3RhbnRzLlBfTE9DQVRJT05fUkVTKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uVGV4dChlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZS5lcXVhbHMoSVJlc291cmNlUHJvcGVydHlDb25zdGFudHMuUF9SRVNPTFZFRF9MT0NBVElPTl9SRVMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVzb2x2ZWRMb2NhdGlvblRleHQoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiByZXNvdXJjZSBpcyBhIGxpbmtlZCByZXNvdXJjZSBib3VuZCAKLSAgICAgKiB0byBhIHBhdGggdmFyaWFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlIHJlc291cmNlIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGdpdmVuIHJlc291cmNlIGlzIGEgbGlua2VkIAotICAgICAqIAlyZXNvdXJjZSBib3VuZCB0byBhIHBhdGggdmFyaWFibGUuIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGUgZ2l2ZW4gCi0gICAgICogCXJlc291cmNlIGlzIGVpdGhlciBub3QgYSBsaW5rZWQgcmVzb3VyY2Ugb3IgaXQgaXMgbm90IHVzaW5nIGEKLSAgICAgKiAJcGF0aCB2YXJpYWJsZS4gIAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BhdGhWYXJpYWJsZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgaWYgKCFyZXNvdXJjZS5pc0xpbmtlZCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIElQYXRoIHJlc29sdmVkTG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotICAgICAgICBpZiAocmVzb2x2ZWRMb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBtaXNzaW5nIHBhdGggdmFyaWFibGUKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIElQYXRoIHJhd0xvY2F0aW9uID0gcmVzb3VyY2UuZ2V0UmF3TG9jYXRpb24oKTsKLSAgICAgICAgaWYgKHJlc29sdmVkTG9jYXRpb24uZXF1YWxzKHJhd0xvY2F0aW9uKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBwcm9wZXJ0eSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlJlc291cmNlUHJvcGVydHlTb3VyY2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5JUHJvcGVydHlTb3VyY2U8L2NvZGU+IG1ldGhvZCBkb2VzIG5vdGhpbmcgc2luY2UgYWxsCi0gICAgICogcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgcHJvcGVydHkpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+UmVzb3VyY2VQcm9wZXJ0eVNvdXJjZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPklQcm9wZXJ0eVNvdXJjZTwvY29kZT4gbWV0aG9kIGRvZXMgbm90aGluZyBzaW5jZSBhbGwKLSAgICAgKiBwcm9wZXJ0aWVzIGFyZSByZWFkLW9ubHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEdldCB0aGUgamF2YS5pby5GaWxlIGVxdWl2YWxlbnQgb2YgdGhlIHBhc3NlZAotICAgICAqIElGaWxlLiBJZiB0aGUgbG9jYXRpb24gZG9lcyBub3QgZXhpc3QgdGhlbiByZXR1cm4KLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gbG9va3VwCi0gICAgICogQHJldHVybiBqYXZhLmlvLkZpbGUgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgSVBhdGggbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbG9jYXRpb24udG9GaWxlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvQ29weVRhc2tBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9Db3B5VGFza0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGJiNDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9Db3B5VGFza0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MudGFza2xpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnRhc2tsaXN0LlRhc2tMaXN0TWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NYXJrZXJUcmFuc2ZlcjsKLQotLyoqCi0gKiBDb3BpZXMgYSB0YXNrIHRvIHRoZSBjbGlwYm9hcmQuCi0gKi8KLWNsYXNzIENvcHlUYXNrQWN0aW9uIGV4dGVuZHMgVGFza0FjdGlvbiB7Ci0gCi0JLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYWN0aW9uLgotCSAqIEBwYXJhbSB0YXNrbGlzdCB0aGUgdGFzayBsaXN0Ci0JICogQHBhcmFtIGlkIHRoZSBpZAotICAgICAqLwotICAgIHB1YmxpYyBDb3B5VGFza0FjdGlvbihUYXNrTGlzdCB0YXNrbGlzdCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHN1cGVyKHRhc2tsaXN0LCBpZCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlJVGFza0xpc3RIZWxwQ29udGV4dElkcy5DT1BZX1RBU0tfQUNUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGlzIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIC8vIEdldCB0aGUgc2VsZWN0ZWQgbWFya2VycwotICAgICAgICBUYXNrTGlzdCB0YXNrTGlzdCA9IGdldFRhc2tMaXN0KCk7Ci0gICAgICAgIFRhYmxlVmlld2VyIHZpZXdlciA9IHRhc2tMaXN0LmdldFRhYmxlVmlld2VyKCk7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRhc2tMaXN0LmNhbmNlbEVkaXRpbmcoKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gc2VsZWN0aW9uLnRvTGlzdCgpOwotICAgICAgICBJTWFya2VyW10gbWFya2VycyA9IG5ldyBJTWFya2VyW2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgbGlzdC50b0FycmF5KG1hcmtlcnMpOwotCi0gICAgICAgIHNldENsaXBib2FyZChtYXJrZXJzLCBUYXNrTGlzdC5jcmVhdGVNYXJrZXJSZXBvcnQobWFya2VycykpOwotCi0gICAgICAgIC8vVXBkYXRlIHBhc3RlIGVuYWJsZW1lbnQKLSAgICAgICAgdGFza0xpc3QudXBkYXRlUGFzdGVFbmFibGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldENsaXBib2FyZChJTWFya2VyW10gbWFya2VycywgU3RyaW5nIG1hcmtlclJlcG9ydCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gUGxhY2UgdGhlIG1hcmtlcnMgb24gdGhlIGNsaXBib2FyZAotICAgICAgICAgICAgT2JqZWN0W10gZGF0YSA9IG5ldyBPYmplY3RbXSB7IG1hcmtlcnMsIG1hcmtlclJlcG9ydCB9OwotICAgICAgICAgICAgVHJhbnNmZXJbXSB0cmFuc2ZlclR5cGVzID0gbmV3IFRyYW5zZmVyW10gewotICAgICAgICAgICAgICAgICAgICBNYXJrZXJUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCi0gICAgICAgICAgICAvLyBzZXQgdGhlIGNsaXBib2FyZCBjb250ZW50cwotICAgICAgICAgICAgZ2V0VGFza0xpc3QoKS5nZXRDbGlwYm9hcmQoKS5zZXRDb250ZW50cyhkYXRhLCB0cmFuc2ZlclR5cGVzKTsKLSAgICAgICAgfSBjYXRjaCAoU1dURXJyb3IgZSkgewotICAgICAgICAgICAgaWYgKGUuY29kZSAhPSBETkQuRVJST1JfQ0FOTk9UX1NFVF9DTElQQk9BUkQpCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIGlmIChNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgIC5vcGVuUXVlc3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrTGlzdE1lc3NhZ2VzLkNvcHlUb0NsaXBib2FyZFByb2JsZW1EaWFsb2dfdGl0bGUsIFRhc2tMaXN0TWVzc2FnZXMuQ29weVRvQ2xpcGJvYXJkUHJvYmxlbURpYWxvZ19tZXNzYWdlKSkgCi0gICAgICAgICAgICAgICAgc2V0Q2xpcGJvYXJkKG1hcmtlcnMsIG1hcmtlclJlcG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9EZWZhdWx0VGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9EZWZhdWx0VGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjZDA0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvRGVmYXVsdFRhc2tMaXN0UmVzb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy50YXNrbGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotLyoqCi0gKiBUaGUgRGVmYXVsdFRhc2tMaXN0UmVzb3VyY2VBZGFwdGVyIGlzIHRoZSBkZWZhdWx0Ci0gKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVRhc2tMaXN0UmVzb3VyY2VBZGFwdGVyIHVzZWQgYnkgdGhlCi0gKiBUYXNrTGlzdCBmb3IgcmVzb3VyY2UgYWRhcHRpb24uCi0gKi8KLWNsYXNzIERlZmF1bHRUYXNrTGlzdFJlc291cmNlQWRhcHRlciBpbXBsZW1lbnRzIElUYXNrTGlzdFJlc291cmNlQWRhcHRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJVGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIgc2luZ2xldG9uOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIERlZmF1bHRUYXNrTGlzdFJlc291cmNlQWRhcHRlci4KLSAgICAgKi8KLSAgICBEZWZhdWx0VGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IGluc3RhbmNlIHVzZWQgZm9yIFRhc2tMaXN0IGFkYXB0aW5nLgotICAgICAqLwotICAgIHN0YXRpYyBJVGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotICAgICAgICAgICAgc2luZ2xldG9uID0gbmV3IERlZmF1bHRUYXNrTGlzdFJlc291cmNlQWRhcHRlcigpOwotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJVGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIjZ2V0QWZmZWN0ZWRSZXNvdXJjZShJQWRhcHRhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyBJUmVzb3VyY2UgZ2V0QWZmZWN0ZWRSZXNvdXJjZShJQWRhcHRhYmxlIGFkYXB0YWJsZSkgewotCi0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGFkYXB0YWJsZS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIChJRmlsZSkgYWRhcHRhYmxlLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9GaWx0ZXJzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvRmlsdGVyc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzU1MjRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9GaWx0ZXJzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy50YXNrbGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGlzIGFjdGlvbiBvcGVucyBhbiBlZGl0b3IgZm9yIHRoZSByZXNvdXJjZQotICogYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWxlY3RlZCBtYXJrZXIsIGFuZAotICoganVtcHMgdG8gdGhlIG1hcmtlcidzIGxvY2F0aW9uIGluIHRoZSBlZGl0b3IuCi0gKi8KLWNsYXNzIEZpbHRlcnNBY3Rpb24gZXh0ZW5kcyBUYXNrQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjdGlvbi4KLSAgICAgKiBAcGFyYW0gdGFza2xpc3QgdGhlIHRhc2sgbGlzdAotICAgICAqIEBwYXJhbSBpZCB0aGUgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsdGVyc0FjdGlvbihUYXNrTGlzdCB0YXNrbGlzdCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHN1cGVyKHRhc2tsaXN0LCBpZCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlJVGFza0xpc3RIZWxwQ29udGV4dElkcy5GSUxURVJTX0FDVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhpcyBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBGaWx0ZXJzRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWx0ZXJzRGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgICBUYXNrc0ZpbHRlciBmaWx0ZXIgPSBnZXRUYXNrTGlzdCgpLmdldEZpbHRlcigpOwotICAgICAgICBkaWFsb2cuc2V0RmlsdGVyKGZpbHRlcik7Ci0gICAgICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgZ2V0VGFza0xpc3QoKS5maWx0ZXJDaGFuZ2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9GaWx0ZXJzRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvRmlsdGVyc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWExMzNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9GaWx0ZXJzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MudGFza2xpc3Q7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRyYXlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy50YXNrbGlzdC5UYXNrTGlzdE1lc3NhZ2VzOwotCi1jbGFzcyBGaWx0ZXJzRGlhbG9nIGV4dGVuZHMgVHJheURpYWxvZyB7Ci0gICAgLyoqCi0gICAgICogSUQgZm9yIHRoZSBSZXNldCBidXR0b24KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFJFU0VUX0lEID0gSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQ7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IFNFTEVDVF9JRCA9IElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVudW1WYWx1ZSB7Ci0gICAgICAgIHByaXZhdGUgaW50IHZhbHVlOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQotICAgICAgICBFbnVtVmFsdWUoaW50IHZhbHVlLCBTdHJpbmcgdGV4dCwgSW1hZ2UgaW1hZ2UpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnVtVHlwZSB7Ci0gICAgICAgIHByaXZhdGUgRW51bVZhbHVlW10gdmFsdWVzOwotCi0gICAgICAgIEVudW1UeXBlKEVudW1WYWx1ZVtdIHZhbHVlcykgewotICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBFbnVtVmFsdWVbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFbnVtVHlwZSBzZXZlcml0eVR5cGU7Ci0KLSAgICBwcml2YXRlIEVudW1UeXBlIHByaW9yaXR5VHlwZTsKLQotICAgIHByaXZhdGUgRW51bVR5cGUgY29tcGxldGlvblR5cGU7Ci0KLSAgICBwcml2YXRlIGNsYXNzIENoZWNrYm94RW51bUdyb3VwIHsKLSAgICAgICAgcHJpdmF0ZSBFbnVtVHlwZSB0eXBlOwotCi0gICAgICAgIHByaXZhdGUgQnV0dG9uIGVuYWJsZUJ1dHRvbjsKLQotICAgICAgICBwcml2YXRlIEJ1dHRvbltdIHZhbHVlQnV0dG9uczsKLQotICAgICAgICBDaGVja2JveEVudW1Hcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgRW51bVR5cGUgdHlwZSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIC8vIGFsdGhvdWdoIG5vdCBuZWVkZWQgZm9yIGxheW91dCwgdGhpcyBjb21wb3NpdGUgaXMgbmVlZGVkIHRvIGdldCB0aGUgdGFiIG9yZGVyIHJpZ2h0Ci0gICAgICAgICAgICBDb21wb3NpdGUgZW5hYmxlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIGVuYWJsZUNvbXBvc2l0ZQotICAgICAgICAgICAgICAgICAgICAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgICAgICBlbmFibGVDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotICAgICAgICAgICAgZW5hYmxlQnV0dG9uID0gbmV3IEJ1dHRvbihlbmFibGVDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgICAgICBlbmFibGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotICAgICAgICAgICAgZW5hYmxlQnV0dG9uLnNldFRleHQodGV4dCk7Ci0gICAgICAgICAgICBDb21wb3NpdGUgdmFsdWVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICAgICAgdmFsdWVDb21wb3NpdGUKLSAgICAgICAgICAgICAgICAgICAgLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgdmFsdWVDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotICAgICAgICAgICAgRW51bVZhbHVlW10gdmFsdWVzID0gdHlwZS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgICAgIHZhbHVlQnV0dG9ucyA9IG5ldyBCdXR0b25bdmFsdWVzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIEJ1dHRvbiB2YWx1ZUJ1dHRvbiA9IG5ldyBCdXR0b24odmFsdWVDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgICAgICAgICAgdmFsdWVCdXR0b24uc2V0VGV4dCh2YWx1ZXNbaV0uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICB2YWx1ZUJ1dHRvbnNbaV0gPSB2YWx1ZUJ1dHRvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBlbmFibGVCdXR0b24uZ2V0RW5hYmxlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgZW5hYmxlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgICAgICB1cGRhdGVFbmFibGVkU3RhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZ2V0U2VsZWN0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIGVuYWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0U2VsZWN0aW9uKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLSAgICAgICAgICAgIGVuYWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oc2VsZWN0ZWQpOwotICAgICAgICAgICAgdXBkYXRlRW5hYmxlZFN0YXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZUVuYWJsZWRTdGF0ZSgpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IGVuYWJsZUJ1dHRvbi5pc0VuYWJsZWQoKQotICAgICAgICAgICAgICAgICAgICAmJiBlbmFibGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlQnV0dG9ucy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIHZhbHVlQnV0dG9uc1tpXS5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldFZhbHVlTWFzaygpIHsKLSAgICAgICAgICAgIGludCBtYXNrID0gMDsKLSAgICAgICAgICAgIEVudW1WYWx1ZVtdIHZhbHVlcyA9IHR5cGUuZ2V0VmFsdWVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlQnV0dG9ucy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZUJ1dHRvbnNbaV0uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFzayB8PSAoMSA8PCB2YWx1ZXNbaV0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1hc2s7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFZhbHVlTWFzayhpbnQgbWFzaykgewotICAgICAgICAgICAgRW51bVZhbHVlW10gdmFsdWVzID0gdHlwZS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVCdXR0b25zW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VsZWN0aW9uKChtYXNrICYgKDEgPDwgdmFsdWVzW2ldLmdldFZhbHVlKCkpKSAhPSAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTGFiZWxDb21ib1RleHRHcm91cCB7Ci0gICAgICAgIExhYmVsIGxhYmVsOwotCi0gICAgICAgIENvbWJvIGNvbWJvOwotCi0gICAgICAgIFRleHQgdGV4dDsKLQotICAgICAgICBMYWJlbENvbWJvVGV4dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gY29tYm9TdHJpbmdzLCBTdHJpbmcgaW5pdGlhbFRleHQsIGludCB3aWR0aEhpbnQpIHsKLSAgICAgICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgICAgICBDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICAgICAgLy9TZXQgdGhlIG1hcmdpbiB3aWR0aCB0byAwIGluIG9yZGVyIHRvIGxpbmUgdXAgd2l0aCBvdGhlciBpdGVtcwotICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICAgICAgZ3JvdXAuc2V0Rm9udChmb250KTsKLSAgICAgICAgICAgIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KGxhYmVsVGV4dCk7Ci0gICAgICAgICAgICBsYWJlbC5zZXRGb250KGZvbnQpOwotICAgICAgICAgICAgY29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgY29tYm9TdHJpbmdzLCAwKTsKLSAgICAgICAgICAgIHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgICAgICBncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0gICAgICAgICAgICB0ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgdGV4dC5zZXRGb250KGZvbnQpOwotICAgICAgICAgICAgdGV4dC5zZXRUZXh0KGluaXRpYWxUZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIG1hbmFnZXMgYSBncm91cCBvZiB3aWRnZXRzIGZvciBzZWxlY3RpbmcgYSB3b3JraW5nIAotICAgICAqIHNldCB0YXNrIGZpbHRlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFdvcmtpbmdTZXRHcm91cCB7Ci0gICAgICAgIHByaXZhdGUgQnV0dG9uIGJ1dHRvbjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyB0aGUgd29ya2luZyBzZXQgZmlsdGVyIHNlbGVjdGlvbiB3aWRnZXRzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSBvZiB0aGUgd29ya2luZyBzZXQgd2lkZ2V0cwotICAgICAgICAgKi8KLSAgICAgICAgV29ya2luZ1NldEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgICAgIC8vIHJhZGlvIGJ1dHRvbiBoYXMgdG8gYmUgcGFydCBvZiBtYWluIHJhZGlvIGJ1dHRvbiBncm91cAotICAgICAgICAgICAgYnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24ocGFyZW50LCBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X25vV29ya2luZ1NldCk7Ci0gICAgICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgICAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgICAgIEJ1dHRvbiByYWRpbyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gcmFkaW8uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgICAgICByYWRpby5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgICAgICBjcmVhdGVCdXR0b24oY29tcG9zaXRlLCBTRUxFQ1RfSUQsIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3Rfd29ya2luZ1NldFNlbGVjdCwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgd2V0aGVyIG9yIG5vdCBhIHdvcmtpbmcgc2V0IGZpbHRlciBzaG91bGQgYmUgdXNlZAotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiAKLSAgICAgICAgICogCXRydWU9YSB3b3JraW5nIHNldCBmaWx0ZXIgc2hvdWxkIGJlIHVzZWQKLSAgICAgICAgICogCWZhbHNlPWEgd29ya2luZyBzZXQgZmlsdGVyIHNob3VsZCBub3QgYmUgdXNlZAotICAgICAgICAgKi8KLSAgICAgICAgYm9vbGVhbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gYnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0IGZpbHRlciBvciBudWxsIGlmIG5vbmUgCi0gICAgICAgICAqIGlzIHNlbGVjdGVkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQgZmlsdGVyIG9yIG51bGwgaWYgbm9uZSAKLSAgICAgICAgICogCWlzIHNlbGVjdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgSVdvcmtpbmdTZXQgZ2V0V29ya2luZ1NldCgpIHsKLSAgICAgICAgICAgIHJldHVybiAoSVdvcmtpbmdTZXQpIGJ1dHRvbi5nZXREYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgd29ya2luZyBzZXQgZmlsdGVyIHNlbGVjdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBzZWxlY3RlZCB0cnVlPWEgd29ya2luZyBzZXQgZmlsdGVyIHNob3VsZCBiZSB1c2VkCi0gICAgICAgICAqIAlmYWxzZT1ubyB3b3JraW5nIHNldCBmaWx0ZXIgc2hvdWxkIGJlIHVzZWQKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgc2V0U2VsZWN0aW9uKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLSAgICAgICAgICAgIGJ1dHRvbi5zZXRTZWxlY3Rpb24oc2VsZWN0ZWQpOwotICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgYW55UmVzb3VyY2VCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBhbnlSZXNvdXJjZUluU2FtZVByb2plY3RCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFJlc291cmNlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZUFuZENoaWxkcmVuQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogT3BlbnMgdGhlIHdvcmtpbmcgc2V0IHNlbGVjdGlvbiBkaWFsb2cuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIHNlbGVjdFByZXNzZWQoKSB7Ci0gICAgICAgICAgICBJV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRXb3JraW5nU2V0TWFuYWdlcigpLmNyZWF0ZVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSwgZmFsc2UpOwotICAgICAgICAgICAgSVdvcmtpbmdTZXQgd29ya2luZ1NldCA9IGdldFdvcmtpbmdTZXQoKTsKLQotICAgICAgICAgICAgaWYgKHdvcmtpbmdTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRTZWxlY3Rpb24obmV3IElXb3JraW5nU2V0W10geyB3b3JraW5nU2V0IH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgSVdvcmtpbmdTZXRbXSByZXN1bHQgPSBkaWFsb2cuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFdvcmtpbmdTZXQocmVzdWx0WzBdKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRXb3JraW5nU2V0KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0U2VsZWN0aW9uKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgd29ya2luZyBzZXQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gd29ya2luZ1NldCB0aGUgd29ya2luZyBzZXQgCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIHNldFdvcmtpbmdTZXQoSVdvcmtpbmdTZXQgd29ya2luZ1NldCkgewotICAgICAgICAgICAgYnV0dG9uLnNldERhdGEod29ya2luZ1NldCk7Ci0gICAgICAgICAgICBpZiAod29ya2luZ1NldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnV0dG9uLnNldFRleHQoTkxTLmJpbmQoVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF93b3JraW5nU2V0LCAgd29ya2luZ1NldC5nZXRMYWJlbCgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3Rfbm9Xb3JraW5nU2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVGFza3NGaWx0ZXIgZmlsdGVyOwotCi0gICAgTWFya2VyVHlwZXNNb2RlbCBtYXJrZXJUeXBlc01vZGVsID0gbmV3IE1hcmtlclR5cGVzTW9kZWwoKTsKLQotICAgIHByaXZhdGUgTWFya2VyVHlwZVtdIG1hcmtlclR5cGVzOwotCi0gICAgcHJpdmF0ZSBDaGVja2JveFRyZWVWaWV3ZXIgdHlwZXNWaWV3ZXI7Ci0KLSAgICBCdXR0b24gYW55UmVzb3VyY2VCdXR0b247Ci0KLSAgICBCdXR0b24gYW55UmVzb3VyY2VJblNhbWVQcm9qZWN0QnV0dG9uOyAvLyBhZGRlZCBieSBjYWdhdGF5a0BhY20ub3JnCi0KLSAgICBCdXR0b24gc2VsZWN0ZWRSZXNvdXJjZUJ1dHRvbjsKLQotICAgIEJ1dHRvbiBzZWxlY3RlZFJlc291cmNlQW5kQ2hpbGRyZW5CdXR0b247Ci0KLSAgICBwcml2YXRlIFdvcmtpbmdTZXRHcm91cCB3b3JraW5nU2V0R3JvdXA7Ci0KLSAgICBwcml2YXRlIExhYmVsQ29tYm9UZXh0R3JvdXAgZGVzY3JpcHRpb25Hcm91cDsKLQotICAgIHByaXZhdGUgQ2hlY2tib3hFbnVtR3JvdXAgc2V2ZXJpdHlHcm91cDsKLQotICAgIHByaXZhdGUgQ2hlY2tib3hFbnVtR3JvdXAgcHJpb3JpdHlHcm91cDsKLQotICAgIHByaXZhdGUgQ2hlY2tib3hFbnVtR3JvdXAgY29tcGxldGlvbkdyb3VwOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZmlsdGVyT25NYXJrZXJMaW1pdDsKLQotICAgIHByaXZhdGUgVGV4dCBtYXJrZXJMaW1pdDsKLQotICAgIFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIEZpbHRlcnNEaWFsb2cudGhpcy53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIElDaGVja1N0YXRlTGlzdGVuZXIgY2hlY2tTdGF0ZUxpc3RlbmVyID0gbmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIEZpbHRlcnNEaWFsb2cudGhpcy5jaGVja1N0YXRlQ2hhbmdlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmaWx0ZXJzIGRpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhlIHBhcmVudCBzaGVsbAotICAgICAqLwotICAgIHB1YmxpYyBGaWx0ZXJzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICAgICAgaW5pdFR5cGVzKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLSAgICAgICAgaWYgKFJFU0VUX0lEID09IGJ1dHRvbklkKSB7Ci0gICAgICAgICAgICByZXNldFByZXNzZWQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChTRUxFQ1RfSUQgPT0gYnV0dG9uSWQpIHsKLSAgICAgICAgICAgIHdvcmtpbmdTZXRHcm91cC5zZWxlY3RQcmVzc2VkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHN0YXRlIGNoYW5nZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBNYXJrZXJUeXBlIHR5cGUgPSAoTWFya2VyVHlwZSkgZXZlbnQuZ2V0RWxlbWVudCgpOwotICAgICAgICB0eXBlc1ZpZXdlci5zZXRTdWJ0cmVlQ2hlY2tlZCh0eXBlLCBldmVudC5nZXRDaGVja2VkKCkpOwotICAgICAgICBNYXJrZXJUeXBlW10gYWxsU3VwZXJ0eXBlcyA9IHR5cGUuZ2V0QWxsU3VwZXJ0eXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbFN1cGVydHlwZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIHR5cGVzVmlld2VyLnNldENoZWNrZWQoYWxsU3VwZXJ0eXBlc1tpXSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZUVuYWJsZWRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLSAgICAgICAgbmV3U2hlbGwuc2V0VGV4dChUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X2ZpbHRlcik7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmV3U2hlbGwsCi0JCQkJSVRhc2tMaXN0SGVscENvbnRleHRJZHMuRklMVEVSU19ESUFMT0cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFyZWEgc2hvd2luZyBmaWx0ZXJpbmcgY3JpdGVyaWEgb24gYXR0cmlidXRlIHZhbHVlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKi8KLSAgICB2b2lkIGNyZWF0ZUF0dHJpYnV0ZXNBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIFN0cmluZ1tdIGZpbHRlcnMgPSB7Ci0gICAgICAgICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9jb250YWlucywgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9kb2VzTm90Q29udGFpbiB9OyAKLSAgICAgICAgZGVzY3JpcHRpb25Hcm91cCA9IG5ldyBMYWJlbENvbWJvVGV4dEdyb3VwKGNvbXBvc2l0ZSwgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF93aGVyZURlc2NyaXB0aW9uLCBmaWx0ZXJzLCAiIiwgMjAwKTsvLyROT04tTkxTLTEkIAotICAgICAgICBzZXZlcml0eUdyb3VwID0gbmV3IENoZWNrYm94RW51bUdyb3VwKGNvbXBvc2l0ZSwgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9zZXZlcml0eV9sYWJlbCwgc2V2ZXJpdHlUeXBlKTsgCi0gICAgICAgIHByaW9yaXR5R3JvdXAgPSBuZXcgQ2hlY2tib3hFbnVtR3JvdXAoY29tcG9zaXRlLCBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X3ByaW9yaXR5X2xhYmVsLCBwcmlvcml0eVR5cGUpOyAKLSAgICAgICAgY29tcGxldGlvbkdyb3VwID0gbmV3IENoZWNrYm94RW51bUdyb3VwKGNvbXBvc2l0ZSwgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9zdGF0dXNfbGFiZWwsIGNvbXBsZXRpb25UeXBlKTsgCi0gICAgfQotCi0gICAgdm9pZCBjcmVhdGVSZXNldEFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCi0gICAgICAgIEJ1dHRvbiByZXNldCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgIHJlc2V0LnNldFRleHQoVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9yZXNldFRleHQpOwotICAgICAgICByZXNldC5zZXREYXRhKG5ldyBJbnRlZ2VyKFJFU0VUX0lEKSk7Ci0KLSAgICAgICAgcmVzZXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGJ1dHRvblByZXNzZWQoKChJbnRlZ2VyKSBldmVudC53aWRnZXQuZ2V0RGF0YSgpKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmVzZXQuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLSAgICAgICAgc2V0QnV0dG9uTGF5b3V0RGF0YShyZXNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNoZWNrIGJveCBidXR0b24gd2l0aCB0aGUgZ2l2ZW4gcGFyZW50IGFuZCB0ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IGZvciB0aGUgY2hlY2sgYm94Ci0gICAgICogQHBhcmFtIGdyYWJSb3cgPGNvZGU+dHJ1ZTwvY29kZT50byBncmFiIHRoZSByZW1haW5pbmcgaG9yaXpvbnRhbCBzcGFjZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqIEByZXR1cm4gdGhlIGNoZWNrIGJveCBidXR0b24KLSAgICAgKi8KLSAgICBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGJvb2xlYW4gZ3JhYlJvdykgewotICAgICAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGlmIChncmFiUm93KSB7Ci0gICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICAgICAgYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICB9Ci0gICAgICAgIGJ1dHRvbi5zZXRUZXh0KHRleHQpOwotICAgICAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotICAgICAgICBidXR0b24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgcmV0dXJuIGJ1dHRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29tYm8gYm94IHdpdGggdGhlIGdpdmVuIHBhcmVudCwgaXRlbXMsIGFuZCBzZWxlY3Rpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKiBAcGFyYW0gaXRlbXMgdGhlIGl0ZW1zIGZvciB0aGUgY29tYm8gYm94Ci0gICAgICogQHBhcmFtIHNlbGVjdGlvbkluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBzZWxlY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBjb21ibyBib3gKLSAgICAgKi8KLSAgICBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBpdGVtcywgaW50IHNlbGVjdGlvbkluZGV4KSB7Ci0gICAgICAgIENvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBjb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgY29tYm8uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgY29tYm8uc2V0SXRlbXMoaXRlbXMpOwotICAgICAgICBjb21iby5zZWxlY3Qoc2VsZWN0aW9uSW5kZXgpOwotICAgICAgICBjb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0gICAgICAgIHJldHVybiBjb21ibzsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAgICAgY3JlYXRlTWFya2VyTGltaXRBcmVhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZVR5cGVzQXJlYShjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVSZXNvdXJjZUFyZWEoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlQXR0cmlidXRlc0FyZWEoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlUmVzZXRBcmVhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZVNlcGFyYXRvckxpbmUoY29tcG9zaXRlKTsKLQotICAgICAgICB1cGRhdGVVSUZyb21GaWx0ZXIoZ2V0RmlsdGVyKCkpOwotCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHNlcGFyYXRvciBsaW5lIGFib3ZlIHRoZSBPSy9DYW5jZWwgYnV0dG9ucyBiYXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICovCi0gICAgdm9pZCBjcmVhdGVTZXBhcmF0b3JMaW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gQnVpbGQgdGhlIHNlcGFyYXRvciBsaW5lCi0gICAgICAgIExhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5IT1JJWk9OVEFMIHwgU1dULlNFUEFSQVRPUik7Ci0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMTsKLSAgICAgICAgc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByYWRpbyBidXR0b24gd2l0aCB0aGUgZ2l2ZW4gcGFyZW50IGFuZCB0ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IGZvciB0aGUgY2hlY2sgYm94Ci0gICAgICogQHJldHVybiB0aGUgcmFkaW8gYm94IGJ1dHRvbgotICAgICAqLwotICAgIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotICAgICAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0gICAgICAgIGJ1dHRvbi5zZXRUZXh0KHRleHQpOwotICAgICAgICBidXR0b24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgICAgICAgcmV0dXJuIGJ1dHRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhcmVhIHNob3dpbmcgd2hpY2ggcmVzb3VyY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqLwotICAgIHZvaWQgY3JlYXRlUmVzb3VyY2VBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgZ3JvdXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgYW55UmVzb3VyY2VCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihncm91cCwgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9hbnlSZXNvdXJjZSk7Ci0gICAgICAgIGFueVJlc291cmNlSW5TYW1lUHJvamVjdEJ1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGdyb3VwLAotICAgICAgICAgICAgICAgIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfYW55UmVzb3VyY2VJblNhbWVQcm9qZWN0KTsvLyBhZGRlZCBieSBjYWdhdGF5a0BhY20ub3JnCi0gICAgICAgIHNlbGVjdGVkUmVzb3VyY2VCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihncm91cCwgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9zZWxlY3RlZFJlc291cmNlKTsgCi0gICAgICAgIHNlbGVjdGVkUmVzb3VyY2VBbmRDaGlsZHJlbkJ1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGdyb3VwLAotICAgICAgICAgICAgICAgIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3Rfc2VsZWN0ZWRBbmRDaGlsZHJlbik7IAotICAgICAgICB3b3JraW5nU2V0R3JvdXAgPSBuZXcgV29ya2luZ1NldEdyb3VwKGdyb3VwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhcmVhIHNob3dpbmcgd2hpY2ggbWFya2VyIHR5cGVzIHNob3VsZCBiZSBpbmNsdWRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKi8KLSAgICB2b2lkIGNyZWF0ZVR5cGVzQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3Rfc2hvd0l0ZW1zT2ZUeXBlKTsKLQotICAgICAgICB0eXBlc1ZpZXdlciA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIoY29tcG9zaXRlKTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEwMDsKLSAgICAgICAgdHlwZXNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICB0eXBlc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZ2V0Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICB0eXBlc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGdldExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIHR5cGVzVmlld2VyLnNldFNvcnRlcihnZXRTb3J0ZXIoKSk7Ci0gICAgICAgIHR5cGVzVmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbChBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0gICAgICAgIHR5cGVzVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihjaGVja1N0YXRlTGlzdGVuZXIpOwotICAgICAgICB0eXBlc1ZpZXdlci5zZXRJbnB1dChnZXRNYXJrZXJUeXBlcygpKTsKLSAgICB9Ci0KLSAgICBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotICAgICAgICAgICAgICAgICAgICBPYmplY3QgbmV3SW5wdXQpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlclR5cGVzTW9kZWwuZ2V0VHlwZShJTWFya2VyLlBST0JMRU0pLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyVHlwZXNNb2RlbC5nZXRUeXBlKElNYXJrZXIuVEFTSykgfTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgTWFya2VyVHlwZSB0eXBlID0gKE1hcmtlclR5cGUpIHBhcmVudEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuZ2V0U3VidHlwZXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICB2b2lkIGNyZWF0ZU1hcmtlckxpbWl0QXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KGZvbnQpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBmaWx0ZXJPbk1hcmtlckxpbWl0ID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X2xpbWl0VmlzaWJsZVRhc2tzVG8sIGZhbHNlKTsKLSAgICAgICAgZmlsdGVyT25NYXJrZXJMaW1pdC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLSAgICAgICAgbWFya2VyTGltaXQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgbWFya2VyTGltaXQuc2V0VGV4dExpbWl0KDYpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBncmlkRGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMTApOwotICAgICAgICBtYXJrZXJMaW1pdC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgbWFya2VyTGltaXQuc2V0Rm9udChmb250KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXIgd2hpY2ggdGhpcyBkaWFsb2cgaXMgY29uZmlndXJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFza3NGaWx0ZXIgZ2V0RmlsdGVyKCkgewotICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpCi0gICAgICAgICAgICBmaWx0ZXIgPSBuZXcgVGFza3NGaWx0ZXIoKTsKLSAgICAgICAgcmV0dXJuIGZpbHRlcjsKLSAgICB9Ci0KLSAgICBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBNYXJrZXJUeXBlIHR5cGUgPSAoTWFya2VyVHlwZSkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5nZXRMYWJlbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1hcmtlciB0eXBlcyB0byBkaXNwbGF5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWFya2VyIHR5cGVzIHRvIGRpc3BsYXkKLSAgICAgKi8KLSAgICBNYXJrZXJUeXBlW10gZ2V0TWFya2VyVHlwZXMoKSB7Ci0gICAgICAgIGlmIChtYXJrZXJUeXBlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgdHlwZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgTWFya2VyVHlwZVtdIHR5cGVzID0gbWFya2VyVHlwZXNNb2RlbC5nZXRUeXBlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIE1hcmtlclR5cGUgdHlwZSA9IHR5cGVzW2ldOwotICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldExhYmVsKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzU3VidHlwZU9mKG1hcmtlclR5cGVzTW9kZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VHlwZShJTWFya2VyLlBST0JMRU0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUuaXNTdWJ0eXBlT2YobWFya2VyVHlwZXNNb2RlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFR5cGUoSU1hcmtlci5UQVNLKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQodHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHR5cGVzTGlzdCwgbmV3IENvbXBhcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xsYXRvci5jb21wYXJlKCgoTWFya2VyVHlwZSkgbzEpLmdldExhYmVsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNYXJrZXJUeXBlKSBvMikuZ2V0TGFiZWwoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtYXJrZXJUeXBlcyA9IG5ldyBNYXJrZXJUeXBlW3R5cGVzTGlzdC5zaXplKCldOwotICAgICAgICAgICAgdHlwZXNMaXN0LnRvQXJyYXkobWFya2VyVHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXJrZXJUeXBlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpZHMgb2YgdGhlIHNlbGVjdGVkIG1hcmtlciB0eXBlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGlkcyBvZiB0aGUgc2VsZWN0ZWQgbWFya2VyIHR5cGVzCi0gICAgICovCi0gICAgU3RyaW5nW10gZ2V0U2VsZWN0ZWRUeXBlcygpIHsKLSAgICAgICAgT2JqZWN0W10gY2hlY2tlZCA9IHR5cGVzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBNYXJrZXJUeXBlIHR5cGUgPSAoTWFya2VyVHlwZSkgY2hlY2tlZFtpXTsKLSAgICAgICAgICAgIC8vIFNraXAgaXQgaWYgYW55IHN1cGVydHlwZXMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5jbHVkZWQuCi0gICAgICAgICAgICAvLyBSZWxpZXMgb24gZ2V0Q2hlY2tlZEVsZW1lbnRzKCkgdXNpbmcgYSBwcmUtb3JkZXIgdHJhdmVyc2FsIAotICAgICAgICAgICAgLy8gc28gcGFyZW50cyBhcmUgZWFybGllciBpbiB0aGUgbGlzdC4KLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBsaXN0LnNpemUoKTsgLS1qID49IDA7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNTdWJ0eXBlT2YoKE1hcmtlclR5cGUpIGxpc3QuZ2V0KGopKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZCh0eXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSB0eXBlcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIHR5cGVzW2ldID0gKChNYXJrZXJUeXBlKSBsaXN0LmdldChpKSkuZ2V0SWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZXM7Ci0gICAgfQotCi0gICAgVmlld2VyU29ydGVyIGdldFNvcnRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLSAgICAgICAgICAgICAgICBNYXJrZXJUeXBlIHQxID0gKE1hcmtlclR5cGUpIGUxOwotICAgICAgICAgICAgICAgIE1hcmtlclR5cGUgdDIgPSAoTWFya2VyVHlwZSkgZTI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUodDEuZ2V0TGFiZWwoKSwgdDIuZ2V0TGFiZWwoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIG1hcmtlciB0eXBlIGF0IHRoZSBnaXZlbiBpbmRleAotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGVJbmRleCB0aGUgaW5kZXggb2YgdGhlIG1hcmtlciB0eXBlIGluIHRoZSBVSSBsaXN0Ci0gICAgICogQHJldHVybiB0aGUgaWQgb2YgdGhlIG1hcmtlciB0eXBlIGF0IHRoZSBnaXZlbiBpbmRleAotICAgICAqLwotICAgIFN0cmluZyBnZXRUeXBlSWQoaW50IHR5cGVJbmRleCkgewotICAgICAgICByZXR1cm4gZ2V0TWFya2VyVHlwZXMoKVt0eXBlSW5kZXhdLmdldElkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIG1hcmtlciB0eXBlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFya2VyVHlwZSB0aGUgbWFya2VyIHR5cGUgaWQKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbWFya2VyIHR5cGUKLSAgICAgKi8KLSAgICBpbnQgZ2V0VHlwZUluZGV4KFN0cmluZyBtYXJrZXJUeXBlKSB7Ci0gICAgICAgIE1hcmtlclR5cGVbXSB0eXBlcyA9IGdldE1hcmtlclR5cGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIFN0cmluZyBpZCA9IHR5cGVzW2ldLmdldElkKCk7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCA/IG1hcmtlclR5cGUgPT0gbnVsbCA6IGlkLmVxdWFscyhtYXJrZXJUeXBlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgdm9pZCBpbml0VHlwZXMoKSB7Ci0gICAgICAgIHNldmVyaXR5VHlwZSA9IG5ldyBFbnVtVHlwZSgKLSAgICAgICAgICAgICAgICBuZXcgRW51bVZhbHVlW10gewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVudW1WYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlci5TRVZFUklUWV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9zZXZlcml0eV9lcnJvciwgTWFya2VyVXRpbC5nZXRJbWFnZSgiZXJyb3IiKSksLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVudW1WYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X3NldmVyaXR5X3dhcm5pbmcsIE1hcmtlclV0aWwuZ2V0SW1hZ2UoIndhcm4iKSksLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVudW1WYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlci5TRVZFUklUWV9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X3NldmVyaXR5X2luZm8sIE1hcmtlclV0aWwuZ2V0SW1hZ2UoImluZm8iKSkgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICBwcmlvcml0eVR5cGUgPSBuZXcgRW51bVR5cGUoCi0gICAgICAgICAgICAgICAgbmV3IEVudW1WYWx1ZVtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbnVtVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNYXJrZXIuUFJJT1JJVFlfSElHSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9wcmlvcml0eV9oaWdoLCBNYXJrZXJVdGlsLmdldEltYWdlKCJocHJpbyIpKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVudW1WYWx1ZShJTWFya2VyLlBSSU9SSVRZX05PUk1BTCwgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9wcmlvcml0eV9ub3JtYWwsIG51bGwpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbnVtVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNYXJrZXIuUFJJT1JJVFlfTE9XLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X3ByaW9yaXR5X2xvdywgTWFya2VyVXRpbC5nZXRJbWFnZSgibHByaW8iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgIGNvbXBsZXRpb25UeXBlID0gbmV3IEVudW1UeXBlKG5ldyBFbnVtVmFsdWVbXSB7Ci0gICAgICAgICAgICAgICAgbmV3IEVudW1WYWx1ZSgxLCBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X3N0YXR1c19jb21wbGV0ZWQsIG51bGwpLCAKLSAgICAgICAgICAgICAgICBuZXcgRW51bVZhbHVlKDAsIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3Rfc3RhdHVzX25vdENvbXBsZXRlZCwgbnVsbCkgCi0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgZmlsdGVyIGZyb20gdGhlIFVJIHN0YXRlLgotICAgICAqIE11c3QgYmUgZG9uZSBoZXJlIHJhdGhlciB0aGFuIGJ5IGV4dGVuZGluZyBvcGVuKCkKLSAgICAgKiBiZWNhdXNlIGFmdGVyIHN1cGVyLm9wZW4oKSBpcyBjYWxsZWQsIHRoZSB3aWRnZXRyeSBpcyBkaXNwb3NlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgcGFyc2VSZXN1bHQgPSBJbnRlZ2VyLnBhcnNlSW50KHRoaXMubWFya2VyTGltaXQuZ2V0VGV4dCgpKTsKLQotICAgICAgICAgICAgaWYgKHBhcnNlUmVzdWx0IDwgMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlRmlsdGVyRnJvbVVJKGdldEZpbHRlcigpKTsKLSAgICAgICAgICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZU51bWJlckZvcm1hdCkgewotICAgICAgICAgICAgTWVzc2FnZUJveCBtZXNzYWdlQm94ID0gbmV3IE1lc3NhZ2VCb3goZ2V0U2hlbGwoKSwgU1dULk9LCi0gICAgICAgICAgICAgICAgICAgIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULklDT05fRVJST1IpOwotICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfdGl0bGVNYXJrZXJMaW1pdEludmFsaWQpOwotICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRNZXNzYWdlKFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfbWVzc2FnZU1hcmtlckxpbWl0SW52YWxpZCk7IAotICAgICAgICAgICAgbWVzc2FnZUJveC5vcGVuKCk7Ci0KLSAgICAgICAgICAgIGlmIChtYXJrZXJMaW1pdC5mb3JjZUZvY3VzKCkpIHsKLSAgICAgICAgICAgICAgICBtYXJrZXJMaW1pdC5zZXRTZWxlY3Rpb24oMCwgbWFya2VyTGltaXQuZ2V0Q2hhckNvdW50KCkpOwotICAgICAgICAgICAgICAgIG1hcmtlckxpbWl0LnNob3dTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYSBwcmVzcyBvZiB0aGUgUmVzZXQgYnV0dG9uLgotICAgICAqIFVwZGF0ZXMgdGhlIFVJIHN0YXRlIHRvIGNvcnJlc3BvbmQgdG8gYSByZXNldCBmaWx0ZXIsCi0gICAgICogYnV0IGRvZXNuJ3QgYWN0dWFsbHkgcmVzZXQgb3VyIGZpbHRlci4KLSAgICAgKi8KLSAgICB2b2lkIHJlc2V0UHJlc3NlZCgpIHsKLSAgICAgICAgdXBkYXRlVUlGcm9tRmlsdGVyKG5ldyBUYXNrc0ZpbHRlcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYW55IG9mIHRoZSBzZWxlY3RlZCB0eXBlcyBhcmUgYSBzdWJ0eXBlIG9mIHRoZSBnaXZlbiB0eXBlLgotICAgICAqLwotICAgIGJvb2xlYW4gc2VsZWN0aW9uSW5jbHVkZXNTdWJ0eXBlT2YoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgTWFya2VyVHlwZSBzdXBlclR5cGUgPSBtYXJrZXJUeXBlc01vZGVsLmdldFR5cGUodHlwZSk7Ci0gICAgICAgIGlmIChzdXBlclR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdFtdIGNoZWNrZWQgPSB0eXBlc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoKChNYXJrZXJUeXBlKSBjaGVja2VkW2ldKS5pc1N1YnR5cGVPZihzdXBlclR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbHRlciB3aGljaCB0aGlzIGRpYWxvZyBpcyB0byBjb25maWd1cmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoVGFza3NGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNlbGVjdGVkIG1hcmtlciB0eXBlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlSWRzIHRoZSBpZHMgb2YgdGhlIG1hcmtlciB0eXBlcyB0byBzZWxlY3QKLSAgICAgKi8KLSAgICB2b2lkIHNldFNlbGVjdGVkVHlwZXMoU3RyaW5nW10gdHlwZUlkcykgewotICAgICAgICB0eXBlc1ZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMobmV3IE1hcmtlclR5cGVbMF0pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVJZHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIE1hcmtlclR5cGUgdHlwZSA9IG1hcmtlclR5cGVzTW9kZWwuZ2V0VHlwZSh0eXBlSWRzW2ldKTsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0eXBlc1ZpZXdlci5zZXRTdWJ0cmVlQ2hlY2tlZCh0eXBlLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIHdpZGdldHJ5LgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlKCkgewotICAgICAgICBtYXJrZXJMaW1pdC5zZXRFbmFibGVkKGZpbHRlck9uTWFya2VyTGltaXQuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBib29sZWFuIGlzUHJvYmxlbVNlbGVjdGVkID0gc2VsZWN0aW9uSW5jbHVkZXNTdWJ0eXBlT2YoSU1hcmtlci5QUk9CTEVNKTsKLSAgICAgICAgYm9vbGVhbiBpc1Rhc2tTZWxlY3RlZCA9IHNlbGVjdGlvbkluY2x1ZGVzU3VidHlwZU9mKElNYXJrZXIuVEFTSyk7Ci0gICAgICAgIHNldmVyaXR5R3JvdXAuc2V0RW5hYmxlZChpc1Byb2JsZW1TZWxlY3RlZCk7Ci0gICAgICAgIHByaW9yaXR5R3JvdXAuc2V0RW5hYmxlZChpc1Rhc2tTZWxlY3RlZCk7Ci0gICAgICAgIGNvbXBsZXRpb25Hcm91cC5zZXRFbmFibGVkKGlzVGFza1NlbGVjdGVkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBnaXZlbiBmaWx0ZXIgZnJvbSB0aGUgVUkgc3RhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFza3NGaWx0ZXIgdGhlIGZpbHRlciB0byB1cGRhdGUKLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUZpbHRlckZyb21VSShUYXNrc0ZpbHRlciB0YXNrc0ZpbHRlcikgewotCi0gICAgICAgIHRhc2tzRmlsdGVyLnR5cGVzID0gZ2V0U2VsZWN0ZWRUeXBlcygpOwotCi0gICAgICAgIGlmIChzZWxlY3RlZFJlc291cmNlQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgdGFza3NGaWx0ZXIub25SZXNvdXJjZSA9IFRhc2tzRmlsdGVyLk9OX1NFTEVDVEVEX1JFU09VUkNFX09OTFk7Ci0gICAgICAgIGVsc2UgaWYgKHNlbGVjdGVkUmVzb3VyY2VBbmRDaGlsZHJlbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHRhc2tzRmlsdGVyLm9uUmVzb3VyY2UgPSBUYXNrc0ZpbHRlci5PTl9TRUxFQ1RFRF9SRVNPVVJDRV9BTkRfQ0hJTERSRU47Ci0gICAgICAgIGVsc2UgaWYgKGFueVJlc291cmNlSW5TYW1lUHJvamVjdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgLy8gYWRkZWQgYnkgY2FnYXRheWtAYWNtLm9yZwotICAgICAgICAgICAgdGFza3NGaWx0ZXIub25SZXNvdXJjZSA9IFRhc2tzRmlsdGVyLk9OX0FOWV9SRVNPVVJDRV9PRl9TQU1FX1BST0pFQ1Q7Ci0gICAgICAgIGVsc2UgaWYgKHdvcmtpbmdTZXRHcm91cC5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHRhc2tzRmlsdGVyLm9uUmVzb3VyY2UgPSBUYXNrc0ZpbHRlci5PTl9XT1JLSU5HX1NFVDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGFza3NGaWx0ZXIub25SZXNvdXJjZSA9IFRhc2tzRmlsdGVyLk9OX0FOWV9SRVNPVVJDRTsKLQotICAgICAgICB0YXNrc0ZpbHRlci53b3JraW5nU2V0ID0gd29ya2luZ1NldEdyb3VwLmdldFdvcmtpbmdTZXQoKTsKLSAgICAgICAgdGFza3NGaWx0ZXIuZGVzY3JpcHRpb25GaWx0ZXJLaW5kID0gZGVzY3JpcHRpb25Hcm91cC5jb21ibwotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICB0YXNrc0ZpbHRlci5kZXNjcmlwdGlvbkZpbHRlciA9IGRlc2NyaXB0aW9uR3JvdXAudGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIHRhc2tzRmlsdGVyLmZpbHRlck9uRGVzY3JpcHRpb24gPSAhdGFza3NGaWx0ZXIuZGVzY3JpcHRpb25GaWx0ZXIKLSAgICAgICAgICAgICAgICAuZXF1YWxzKCIiKTsvLyROT04tTkxTLTEkCi0KLSAgICAgICAgdGFza3NGaWx0ZXIuZmlsdGVyT25TZXZlcml0eSA9IHNldmVyaXR5R3JvdXAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIHRhc2tzRmlsdGVyLnNldmVyaXR5RmlsdGVyID0gc2V2ZXJpdHlHcm91cC5nZXRWYWx1ZU1hc2soKTsKLQotICAgICAgICB0YXNrc0ZpbHRlci5maWx0ZXJPblByaW9yaXR5ID0gcHJpb3JpdHlHcm91cC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgdGFza3NGaWx0ZXIucHJpb3JpdHlGaWx0ZXIgPSBwcmlvcml0eUdyb3VwLmdldFZhbHVlTWFzaygpOwotCi0gICAgICAgIHRhc2tzRmlsdGVyLmZpbHRlck9uQ29tcGxldGlvbiA9IGNvbXBsZXRpb25Hcm91cC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgdGFza3NGaWx0ZXIuY29tcGxldGlvbkZpbHRlciA9IGNvbXBsZXRpb25Hcm91cC5nZXRWYWx1ZU1hc2soKTsKLQotICAgICAgICBpbnQgbGltaXQgPSBUYXNrc0ZpbHRlci5ERUZBVUxUX01BUktFUl9MSU1JVDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbGltaXQgPSBJbnRlZ2VyLnBhcnNlSW50KHRoaXMubWFya2VyTGltaXQuZ2V0VGV4dCgpKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGVOdW1iZXJGb3JtYXQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHRhc2tzRmlsdGVyLnNldE1hcmtlckxpbWl0KGxpbWl0KTsKLSAgICAgICAgdGFza3NGaWx0ZXIuc2V0RmlsdGVyT25NYXJrZXJMaW1pdChmaWx0ZXJPbk1hcmtlckxpbWl0LmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBVSSBzdGF0ZSBmcm9tIHRoZSBnaXZlbiBmaWx0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFza3NGaWx0ZXIgdGhlIGZpbHRlciB0byB1c2UKLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVVJRnJvbUZpbHRlcihUYXNrc0ZpbHRlciB0YXNrc0ZpbHRlcikgewotCi0gICAgICAgIHNldFNlbGVjdGVkVHlwZXModGFza3NGaWx0ZXIudHlwZXMpOwotCi0gICAgICAgIGludCBvbiA9IHRhc2tzRmlsdGVyLm9uUmVzb3VyY2U7Ci0gICAgICAgIGFueVJlc291cmNlQnV0dG9uLnNldFNlbGVjdGlvbihvbiA9PSBUYXNrc0ZpbHRlci5PTl9BTllfUkVTT1VSQ0UpOwotICAgICAgICBhbnlSZXNvdXJjZUluU2FtZVByb2plY3RCdXR0b24KLSAgICAgICAgICAgICAgICAuc2V0U2VsZWN0aW9uKG9uID09IFRhc2tzRmlsdGVyLk9OX0FOWV9SRVNPVVJDRV9PRl9TQU1FX1BST0pFQ1QpOyAvLyBhZGRlZCBieSBjYWdhdGF5a0BhY20ub3JnCi0gICAgICAgIHNlbGVjdGVkUmVzb3VyY2VCdXR0b24KLSAgICAgICAgICAgICAgICAuc2V0U2VsZWN0aW9uKG9uID09IFRhc2tzRmlsdGVyLk9OX1NFTEVDVEVEX1JFU09VUkNFX09OTFkpOwotICAgICAgICBzZWxlY3RlZFJlc291cmNlQW5kQ2hpbGRyZW5CdXR0b24KLSAgICAgICAgICAgICAgICAuc2V0U2VsZWN0aW9uKG9uID09IFRhc2tzRmlsdGVyLk9OX1NFTEVDVEVEX1JFU09VUkNFX0FORF9DSElMRFJFTik7Ci0gICAgICAgIHdvcmtpbmdTZXRHcm91cC5zZXRTZWxlY3Rpb24ob24gPT0gVGFza3NGaWx0ZXIuT05fV09SS0lOR19TRVQpOwotICAgICAgICB3b3JraW5nU2V0R3JvdXAuc2V0V29ya2luZ1NldCh0YXNrc0ZpbHRlci53b3JraW5nU2V0KTsKLQotICAgICAgICBkZXNjcmlwdGlvbkdyb3VwLmNvbWJvLnNlbGVjdCh0YXNrc0ZpbHRlci5kZXNjcmlwdGlvbkZpbHRlcktpbmQpOwotICAgICAgICBkZXNjcmlwdGlvbkdyb3VwLnRleHQuc2V0VGV4dCh0YXNrc0ZpbHRlci5kZXNjcmlwdGlvbkZpbHRlcik7Ci0KLSAgICAgICAgc2V2ZXJpdHlHcm91cC5zZXRTZWxlY3Rpb24odGFza3NGaWx0ZXIuZmlsdGVyT25TZXZlcml0eSk7Ci0gICAgICAgIHNldmVyaXR5R3JvdXAuc2V0VmFsdWVNYXNrKHRhc2tzRmlsdGVyLnNldmVyaXR5RmlsdGVyKTsKLQotICAgICAgICBwcmlvcml0eUdyb3VwLnNldFNlbGVjdGlvbih0YXNrc0ZpbHRlci5maWx0ZXJPblByaW9yaXR5KTsKLSAgICAgICAgcHJpb3JpdHlHcm91cC5zZXRWYWx1ZU1hc2sodGFza3NGaWx0ZXIucHJpb3JpdHlGaWx0ZXIpOwotCi0gICAgICAgIGNvbXBsZXRpb25Hcm91cC5zZXRTZWxlY3Rpb24odGFza3NGaWx0ZXIuZmlsdGVyT25Db21wbGV0aW9uKTsKLSAgICAgICAgY29tcGxldGlvbkdyb3VwLnNldFZhbHVlTWFzayh0YXNrc0ZpbHRlci5jb21wbGV0aW9uRmlsdGVyKTsKLQotICAgICAgICBtYXJrZXJMaW1pdC5zZXRUZXh0KCIiICsgdGFza3NGaWx0ZXIuZ2V0TWFya2VyTGltaXQoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmlsdGVyT25NYXJrZXJMaW1pdC5zZXRTZWxlY3Rpb24odGFza3NGaWx0ZXIuZ2V0RmlsdGVyT25NYXJrZXJMaW1pdCgpKTsKLQotICAgICAgICB1cGRhdGVFbmFibGVkU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHNlbGVjdGlvbiBvbiBhIGNoZWNrIGJveCBvciBjb21ibyBib3guCi0gICAgICovCi0gICAgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIHVwZGF0ZUVuYWJsZWRTdGF0ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9Hb3RvVGFza0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L0dvdG9UYXNrQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YWE3NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L0dvdG9UYXNrQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy50YXNrbGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuT3BlblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5EaWFsb2dVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnRhc2tsaXN0LlRhc2tMaXN0TWVzc2FnZXM7Ci0KLS8qKgotICogVGhpcyBhY3Rpb24gb3BlbnMgYW4gZWRpdG9yIGZvciB0aGUgcmVzb3VyY2UKLSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgbWFya2VyLCBhbmQKLSAqIGp1bXBzIHRvIHRoZSBtYXJrZXIncyBsb2NhdGlvbiBpbiB0aGUgZWRpdG9yLgotICovCi1jbGFzcyBHb3RvVGFza0FjdGlvbiBleHRlbmRzIFRhc2tBY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0YXNrbGlzdCB0aGUgdGFzayBsaXN0Ci0gICAgICogQHBhcmFtIGlkIHRoZSBpZAotICAgICAqLwotICAgIHB1YmxpYyBHb3RvVGFza0FjdGlvbihUYXNrTGlzdCB0YXNrbGlzdCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHN1cGVyKHRhc2tsaXN0LCBpZCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlJVGFza0xpc3RIZWxwQ29udGV4dElkcy5HT1RPX1RBU0tfQUNUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGlzIGFjdGlvbi4gVGhpcyBhY3Rpb24gd29ya3Mgb25seSBmb3Igc2luZ2xlIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0VGFza0xpc3QoKQotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgT2JqZWN0IG8gPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBJTWFya2VyKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgbzsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gbWFya2VyLmdldFJlc291cmNlKCk7Ci0gICAgICAgIGlmIChtYXJrZXIuZXhpc3RzKCkgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldFRhc2tMaXN0KCkuZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSURFLm9wZW5FZGl0b3IocGFnZSwgbWFya2VyLCBPcGVuU3RyYXRlZ3kuYWN0aXZhdGVPbk9wZW4oKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgRGlhbG9nVXRpbC5vcGVuRXJyb3IocGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5Hb3RvVGFza19lcnJvck1lc3NhZ2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L0lNYXJrZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9JTWFya2VyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYzU3YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L0lNYXJrZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnRhc2tsaXN0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgY29uc3RhbnRzIHVzZWQgZm9yIG1hcmtlciBwcm9wZXJ0aWVzCi0gKiBhbmQgYXR0cmlidXRlcy4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIKLSAqLwotaW50ZXJmYWNlIElNYXJrZXJDb25zdGFudHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJvcmcuZWNsaXBzZS51aS50YXNrbGlzdC4iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1BSSU9SSVRZX0lNQUdFID0gUFJFRklYICsgInByaW9yaXR5SW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0NPTVBMRVRFX0lNQUdFID0gUFJFRklYICsgImNvbXBsZXRlSW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1JFU09VUkNFX05BTUUgPSBQUkVGSVggKyAicmVzb3VyY2VOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9DT05UQUlORVJfTkFNRSA9IFBSRUZJWCArICJjb250YWluZXJOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9MSU5FX0FORF9MT0NBVElPTiA9IFBSRUZJWCArICJsaW5lQW5kTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvSVRhc2tMaXN0SGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9JVGFza0xpc3RIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWQ5NDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9JVGFza0xpc3RIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnRhc2tsaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgdGFzayBsaXN0IHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQKLSAqIG9yIGV4dGVuZGVkLgotICogPC9wPgotICogCi0gKi8KLWludGVyZmFjZSBJVGFza0xpc3RIZWxwQ29udGV4dElkcyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gUGxhdGZvcm1VSS5QTFVHSU5fSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIEFjdGlvbnMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJHRV9DT01QTEVURURfVEFTS19BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInB1cmdlX2NvbXBsZXRlZF90YXNrX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWV9UQVNLX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAiY29weV90YXNrX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTVEVfVEFTS19BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInBhc3RlX3Rhc2tfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVEFTS19BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgIm5ld190YXNrX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX1RBU0tfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJyZW1vdmVfdGFza19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdPVE9fVEFTS19BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgImdvdG9fdGFza19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTFRFUlNfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJmaWx0ZXJzX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS19DT01QTEVURURfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJtYXJrX2NvbXBsZXRlZF9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09MVkVfTUFSS0VSX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAicmVzb2x2ZV9tYXJrZXJfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQUxMX1RBU0tTX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAic2VsZWN0X2FsbF90YXNrc19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfUFJPUEVSVElFU19BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInRhc2tfcHJvcGVydGllc19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfU09SVF9UWVBFX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAidGFza19zb3J0X3R5cGVfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1NPUlRfQ09NUExFVEVEX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAidGFza19zb3J0X2NvbXBsZXRlZF9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfU09SVF9QUklPUklUWV9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInRhc2tfc29ydF9wcmlvcml0eV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfU09SVF9ERVNDUklQVElPTl9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInRhc2tfc29ydF9kZXNjcmlwdGlvbl9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfU09SVF9SRVNPVVJDRV9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInRhc2tfc29ydF9yZXNvdXJjZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfU09SVF9GT0xERVJfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJ0YXNrX3NvcnRfZm9sZGVyX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19TT1JUX0xPQ0FUSU9OX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAidGFza19zb3J0X2xvY2F0aW9uX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19TT1JUX0NSRUFUSU9OX1RJTUVfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJ0YXNrX3NvcnRfY3JlYXRpb25fdGltZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfU09SVF9BU0NFTkRJTkdfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJ0YXNrX3NvcnRfYXNjZW5kaW5nX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19TT1JUX0RFU0NFTkRJTkdfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJ0YXNrX3NvcnRfZGVzY2VuZGluZ19hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIERpYWxvZ3MKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJTX0RJQUxPRyA9IFBSRUZJWAotICAgICAgICAgICAgKyAidGFza19maWx0ZXJzX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19ESUFMT0cgPSBQUkVGSVgKLSAgICAgICAgICAgICsgInRhc2tfcHJvcGVydGllc19kaWFsb2dfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFZpZXdzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19MSVNUX1ZJRVcgPSBQUkVGSVgKLSAgICAgICAgICAgICsgInRhc2tfbGlzdF92aWV3X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvSVRhc2tMaXN0UmVzb3VyY2VBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvSVRhc2tMaXN0UmVzb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOWU4NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L0lUYXNrTGlzdFJlc291cmNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MudGFza2xpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLS8qKgotICogPGNvZGU+SVRhc2tMaXN0UmVzb3VyY2VBZGFwdGVyPC9jb2RlPiBpcyBhbiBhZGFwdGVyIGludGVyZmFjZSB0aGF0Ci0gKiBzdXBwbGllcyB0aGUgcmVzb3VyY2UgdG8gcXVlcnkgZm9yIG1hcmtlcnMgdG8gZGlzcGxheSBpbiB0aGUgdGFzayBsaXN0LgotICogPHA+Ci0gKiBUaGUgVGFza3MgdmlldyBjaGVja3MgZm9yIHRoaXMgYWRhcHRlciBiZWZvcmUgdGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4KLSAqIGFkYXB0ZXIsIGFsbG93aW5nIHRoZSBvYmplY3QgdG8gcHJvdmlkZSBhIHJlc291cmNlIHRvIHRoZSBUYXNrcyB2aWV3IHdpdGhvdXQKLSAqIG5lY2Vzc2FyaWx5IGV4cG9zaW5nIGl0IHRvIG90aGVyIGNvbXBvbmVudHMgdGhhdCBsb29rIGZvciBhbiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+Ci0gKiBhZGFwdGVyLiAgICAgCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEltcGxlbWVudG9ycyBvZiB0aGlzIGludGVyZmFjZSBhcmUgdHlwaWNhbGx5IHJlZ2lzdGVyZWQgd2l0aCBhbgotICogSUFkYXB0ZXJGYWN0b3J5IGZvciBsb29rdXAgdmlhIHRoZSBnZXRBZGFwdGVyKCkgbWVjaGFuaXNtLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYXNrTGlzdFJlc291cmNlQWRhcHRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSB0byBxdWVyeSBmb3IgdGhlIG1hcmtlcnMgdG8gZGlzcGxheQotICAgICAqIGZvciB0aGUgZ2l2ZW4gYWRhcHRhYmxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhZGFwdGFibGUgdGhlIGFkYXB0YWJsZSBiZWluZyBxdWVyaWVkLgotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlCi0gICAgICogCWlzIG5vIGFkYXB0ZWQgcmVzb3VyY2UgZm9yIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBJUmVzb3VyY2UgZ2V0QWZmZWN0ZWRSZXNvdXJjZShJQWRhcHRhYmxlIGFkYXB0YWJsZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9NYXJrQ29tcGxldGVkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvTWFya0NvbXBsZXRlZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTVkZWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9NYXJrQ29tcGxldGVkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy50YXNrbGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotY2xhc3MgTWFya0NvbXBsZXRlZEFjdGlvbiBleHRlbmRzIFRhc2tBY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgTWFya0NvbXBsZXRlZEFjdGlvbi4KLSAgICAgKiBAcGFyYW0gdGFza2xpc3QKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFya0NvbXBsZXRlZEFjdGlvbihUYXNrTGlzdCB0YXNrbGlzdCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHN1cGVyKHRhc2tsaXN0LCBpZCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLSAgICAgICAgICAgICAgICBJVGFza0xpc3RIZWxwQ29udGV4dElkcy5NQVJLX0NPTVBMRVRFRF9BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbXBsZXRlZCB2YWx1ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gICAgICogYWN0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIElTZWxlY3Rpb24gbWFya2VycyA9IGdldFRhc2tMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChtYXJrZXJzIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHNlbGVjdGlvbnMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBtYXJrZXJzKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKHNlbGVjdGlvbnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgSU1hcmtlciBuZXh0TWFya2VyID0gKElNYXJrZXIpIHNlbGVjdGlvbnMubmV4dCgpOwotICAgICAgICAgICAgICAgIGdldFRhc2tMaXN0KCkuc2V0UHJvcGVydHkobmV4dE1hcmtlciwgSU1hcmtlci5ET05FLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhlIGdpdmVuIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBzZWxlY3Rpb24KLSAgICAgKiBAcmV0dXJuIGVuYWJsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRFbmFibGUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghKE1hcmtlclV0aWwuaXNNYXJrZXJUeXBlKG1hcmtlciwgSU1hcmtlci5UQVNLKQotICAgICAgICAgICAgICAgICAgICAmJiAhTWFya2VyVXRpbC5pc0NvbXBsZXRlKG1hcmtlcikgJiYgTWFya2VyVXRpbAotICAgICAgICAgICAgICAgICAgICAuaXNFZGl0YWJsZShtYXJrZXIpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9NYXJrZXJUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvTWFya2VyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjQ0NmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9NYXJrZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MudGFza2xpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBtYXJrZXIgdHlwZS4KLSAqLwotY2xhc3MgTWFya2VyVHlwZSB7Ci0gICAgcHJpdmF0ZSBNYXJrZXJUeXBlc01vZGVsIG1vZGVsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotICAgIHByaXZhdGUgU3RyaW5nW10gc3VwZXJ0eXBlSWRzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBtYXJrZXIgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFya2VyVHlwZShNYXJrZXJUeXBlc01vZGVsIG1vZGVsLCBTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIFN0cmluZ1tdIHN1cGVydHlwZUlkcykgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICB0aGlzLnN1cGVydHlwZUlkcyA9IHN1cGVydHlwZUlkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGlzIHR5cGUncyBzdXBlcnR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBNYXJrZXJUeXBlW10gZ2V0QWxsU3VwZXJ0eXBlcygpIHsKLSAgICAgICAgQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZ2V0QWxsU3VwZXJ0eXBlcyhyZXN1bHQpOwotICAgICAgICByZXR1cm4gKE1hcmtlclR5cGVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IE1hcmtlclR5cGVbcmVzdWx0LnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgYWxsIHRoaXMgdHlwZSdzIHN1cGVydHlwZXMgdG8gdGhlIGdpdmVuIGxpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdldEFsbFN1cGVydHlwZXMoQXJyYXlMaXN0IHJlc3VsdCkgewotICAgICAgICBNYXJrZXJUeXBlW10gc3VwZXJzID0gZ2V0U3VwZXJ0eXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVycy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgTWFya2VyVHlwZSBzdXAgPSBzdXBlcnNbaV07Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdC5jb250YWlucyhzdXApKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChzdXApOwotICAgICAgICAgICAgICAgIHN1cC5nZXRBbGxTdXBlcnR5cGVzKHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXJrZXIgdHlwZSBpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoaXMgbWFya2VyIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIGxhYmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGVzIHdoaWNoIGhhdmUgdGhpcyB0eXBlIGFzIGEgZGlyZWN0IHN1cGVydHlwZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGRpcmVjdCBzdWJ0eXBlcyBvZiB0aGlzIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFya2VyVHlwZVtdIGdldFN1YnR5cGVzKCkgewotICAgICAgICBNYXJrZXJUeXBlW10gdHlwZXMgPSBtb2RlbC5nZXRUeXBlcygpOwotICAgICAgICBBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBNYXJrZXJUeXBlIHR5cGUgPSB0eXBlc1tpXTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHN1cGVycyA9IHR5cGUuZ2V0U3VwZXJ0eXBlSWRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN1cGVycy5sZW5ndGg7ICsraikgewotICAgICAgICAgICAgICAgIGlmIChzdXBlcnNbal0uZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE1hcmtlclR5cGVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IE1hcmtlclR5cGVbcmVzdWx0LnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1hcmtlciB0eXBlIGlkcyBmb3IgdGhpcyB0eXBlJ3Mgc3VwZXJ0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3VwZXJ0eXBlSWRzKCkgewotICAgICAgICByZXR1cm4gc3VwZXJ0eXBlSWRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB0eXBlJ3MgZGlyZWN0IHN1cGVydHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIE1hcmtlclR5cGVbXSBnZXRTdXBlcnR5cGVzKCkgewotICAgICAgICBBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVydHlwZUlkcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgTWFya2VyVHlwZSBzdXAgPSBtb2RlbC5nZXRUeXBlKHN1cGVydHlwZUlkc1tpXSk7Ci0gICAgICAgICAgICBpZiAoc3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHN1cCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChNYXJrZXJUeXBlW10pIHJlc3VsdC50b0FycmF5KG5ldyBNYXJrZXJUeXBlW3Jlc3VsdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtYXJrZXIgdHlwZSBpcyBjb25zaWRlcmVkIHRvIGJlIGEgc3VidHlwZSBvZgotICAgICAqIHRoZSBnaXZlbiBtYXJrZXIgdHlwZS4gCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT5pZiB0aGlzIHR5cGUgaXMgdGhlIHNhbWUgYXMgKG9yIGEgc3VidHlwZSBvZikgdGhlIGdpdmVuIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N1YnR5cGVPZihNYXJrZXJUeXBlIHN1cGVyVHlwZSkgewotICAgICAgICBpZiAoaWQuZXF1YWxzKHN1cGVyVHlwZS5nZXRJZCgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcnR5cGVJZHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIE1hcmtlclR5cGUgc3VwID0gbW9kZWwuZ2V0VHlwZShzdXBlcnR5cGVJZHNbaV0pOwotICAgICAgICAgICAgaWYgKHN1cCAhPSBudWxsICYmIHN1cC5pc1N1YnR5cGVPZihzdXBlclR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9NYXJrZXJUeXBlc01vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvTWFya2VyVHlwZXNNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmExYTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9NYXJrZXJUeXBlc01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MudGFza2xpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBNYWludGFpbnMgYSBtb2RlbCBvZiBhbGwga25vd24gbWFya2VyIHR5cGVzLgotICovCi1jbGFzcyBNYXJrZXJUeXBlc01vZGVsIHsKLSAgICAvKioKLSAgICAgKiBNYXBzIGZyb20gbWFya2VyIHR5cGUgaWQgdG8gTWFya2VyVHlwZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXAgdHlwZXM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG1hcmtlciB0eXBlcyBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFya2VyVHlwZXNNb2RlbCgpIHsKLSAgICAgICAgdHlwZXMgPSByZWFkVHlwZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXJrZXIgdHlwZSB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBtYXJrZXIgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFya2VyVHlwZSBnZXRUeXBlKFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gKE1hcmtlclR5cGUpIHR5cGVzLmdldChpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwga25vd24gbWFya2VyIHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBNYXJrZXJUeXBlW10gZ2V0VHlwZXMoKSB7Ci0gICAgICAgIE1hcmtlclR5cGVbXSByZXN1bHQgPSBuZXcgTWFya2VyVHlwZVt0eXBlcy5zaXplKCldOwotICAgICAgICB0eXBlcy52YWx1ZXMoKS50b0FycmF5KHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBnaXZlbiBtYXJrZXIgdHlwZS4KLSAgICAgKiBXb3JrYXJvdW5kIHVudGlsIHdlIGhhdmUgbGFiZWxzIGluIFhNTC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRXZWxsS25vd25MYWJlbChTdHJpbmcgdHlwZSkgewotICAgICAgICBpZiAodHlwZS5lcXVhbHMoSU1hcmtlci5QUk9CTEVNKSkKLSAgICAgICAgICAgIHJldHVybiAiUHJvYmxlbSI7Ly8kTk9OLU5MUy0xJAotICAgICAgICBpZiAodHlwZS5lcXVhbHMoSU1hcmtlci5UQVNLKSkKLSAgICAgICAgICAgIHJldHVybiAiVGFzayI7Ly8kTk9OLU5MUy0xJAotICAgICAgICBpZiAodHlwZS5lcXVhbHMoIm9yZy5lY2xpcHNlLmpkdC5jb3JlLnByb2JsZW0iKSkvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gIkphdmEgUHJvYmxlbSI7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbWFya2VyIHR5cGVzIGZyb20gdGhlIHJlZ2lzdHJ5LgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcCByZWFkVHlwZXMoKSB7Ci0gICAgICAgIEhhc2hNYXAgdHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KAotICAgICAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMsIFJlc291cmNlc1BsdWdpbi5QVF9NQVJLRVJTKTsKLSAgICAgICAgaWYgKHBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEdhdGhlciBhbGwgcmVnaXN0ZXJlZCBtYXJrZXIgdHlwZXMuCi0gICAgICAgICAgICBJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIElFeHRlbnNpb24gZXh0ID0gZXh0ZW5zaW9uc1tpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBleHQuZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGV4dC5nZXRMYWJlbCgpOwotICAgICAgICAgICAgICAgIGlmIChsYWJlbC5lcXVhbHMoIiIpKSB7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGdldFdlbGxLbm93bkxhYmVsKGlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHN1cGVyc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbHQgPSBjb25maWdFbGVtZW50c1tqXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsdC5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgic3VwZXIiKSkgey8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdXAgPSBlbHQuZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJzTGlzdC5hZGQoc3VwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBzdXBlclR5cGVzID0gbmV3IFN0cmluZ1tzdXBlcnNMaXN0LnNpemUoKV07Ci0gICAgICAgICAgICAgICAgc3VwZXJzTGlzdC50b0FycmF5KHN1cGVyVHlwZXMpOwotICAgICAgICAgICAgICAgIE1hcmtlclR5cGUgdHlwZSA9IG5ldyBNYXJrZXJUeXBlKHRoaXMsIGlkLCBsYWJlbCwgc3VwZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgdHlwZXMucHV0KGlkLCB0eXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L01hcmtlclV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9NYXJrZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZTVkYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L01hcmtlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy50YXNrbGlzdDsKLQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNpY1Byb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnRhc2tsaXN0LlRhc2tMaXN0TWVzc2FnZXM7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYWNjZXNzaW5nIG1hcmtlciBhdHRyaWJ1dGVzLgotICovCi1jbGFzcyBNYXJrZXJVdGlsIGltcGxlbWVudHMgSU1hcmtlckNvbnN0YW50cyB7Ci0JCi0gICBwcml2YXRlIHN0YXRpYyBNYXAgaW1hZ2VEZXNjcmlwdG9yczsKLQotICAgIHByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXNzYWdlRm9ybWF0IGxpbmUgPSBuZXcgTWVzc2FnZUZvcm1hdChUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X2xpbmUpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZUZvcm1hdCBsaW5lQW5kTG9jYXRpb24gPSBuZXcgTWVzc2FnZUZvcm1hdCgKLSAgICAgICAgICAgIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfbGluZUFuZExvY2F0aW9uKTsgCi0KLSAgICBzdGF0aWMgewotICAgICAgICBjcmVhdGVJbWFnZURlc2NyaXB0b3JzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcmtlclV0aWwoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbWFwIG9mIGltYWdlIGRlc2NyaXB0b3JzLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUltYWdlRGVzY3JpcHRvcnMoKSB7Ci0gICAgCi0KLSAgICAgICAgaW1hZ2VEZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwKDUxKTsKLSAgICAgICAgaW1hZ2VEZXNjcmlwdG9ycwotICAgICAgICAgICAgICAgIC5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyX2NvbXBsZXRlIiwgSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigib2JqMTYvaGVhZGVyX2NvbXBsZXRlLmdpZiIpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgICAgICBpbWFnZURlc2NyaXB0b3JzCi0gICAgICAgICAgICAgICAgLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJoZWFkZXJfcHJpb3JpdHkiLCBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJvYmoxNi9oZWFkZXJfcHJpb3JpdHkuZ2lmIikpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgICAgIGltYWdlRGVzY3JpcHRvcnMucHV0KAotICAgICAgICAgICAgICAgICJ0YXNrIiwgSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigib2JqMTYvdGFza21ya190c2suZ2lmIikpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgICAgIGltYWdlRGVzY3JpcHRvcnMucHV0KAotICAgICAgICAgICAgICAgICJlcnJvciIsIElERVdvcmtiZW5jaFBsdWdpbi5nZXRJREVJbWFnZURlc2NyaXB0b3IoIm9iajE2L2Vycm9yX3Rzay5naWYiKSk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1hZ2VEZXNjcmlwdG9ycy5wdXQoCi0gICAgICAgICAgICAgICAgIndhcm4iLCBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJvYmoxNi93YXJuX3Rzay5naWYiKSk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1hZ2VEZXNjcmlwdG9ycy5wdXQoCi0gICAgICAgICAgICAgICAgImluZm8iLCBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJvYmoxNi9pbmZvX3Rzay5naWYiKSk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1hZ2VEZXNjcmlwdG9ycy5wdXQoCi0gICAgICAgICAgICAgICAgImhwcmlvIiwgSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigib2JqMTYvaHByaW9fdHNrLmdpZiIpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgICAgICBpbWFnZURlc2NyaXB0b3JzLnB1dCgKLSAgICAgICAgICAgICAgICAibHByaW8iLCBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJvYmoxNi9scHJpb190c2suZ2lmIikpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgICAgIGltYWdlRGVzY3JpcHRvcnMKLSAgICAgICAgICAgICAgICAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXRlX3RzayIsIElERVdvcmtiZW5jaFBsdWdpbi5nZXRJREVJbWFnZURlc2NyaXB0b3IoIm9iajE2L2NvbXBsZXRlX3Rzay5naWYiKSk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1hZ2VEZXNjcmlwdG9ycwotICAgICAgICAgICAgICAgIC5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiaW5jb21wbGV0ZV90c2siLCBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJvYmoxNi9pbmNvbXBsZXRlX3Rzay5naWYiKSk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1hZ2VEZXNjcmlwdG9ycy5wdXQoCi0gICAgICAgICAgICAgICAgImdvdG9vYmoiLCBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJlbGNsMTYvZ290b29ial90c2suZ2lmIikpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgICAgIGltYWdlRGVzY3JpcHRvcnMucHV0KAotICAgICAgICAgICAgICAgICJhZGR0c2siLCBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJlbGNsMTYvYWRkdHNrX3Rzay5naWYiKSk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1hZ2VEZXNjcmlwdG9ycwotICAgICAgICAgICAgICAgIC5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWRkdHNrX2Rpc2FibGVkIiwgSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigiZGxjbDE2L2FkZHRza190c2suZ2lmIikpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgICAgIGltYWdlRGVzY3JpcHRvcnMKLSAgICAgICAgICAgICAgICAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgInNob3djb21wbGV0ZSIsIElERVdvcmtiZW5jaFBsdWdpbi5nZXRJREVJbWFnZURlc2NyaXB0b3IoImVsY2wxNi9zaG93Y29tcGxldGVfdHNrLmdpZiIpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgICAgICBpbWFnZURlc2NyaXB0b3JzCi0gICAgICAgICAgICAgICAgLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3RlZF9tb2RlIiwgSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigiZWxjbDE2L3NlbGVjdGVkX21vZGUuZ2lmIikpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgICAgIGltYWdlRGVzY3JpcHRvcnMKLSAgICAgICAgICAgICAgICAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdGVkX21vZGVfZGlzYWJsZWQiLCBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJkbGNsMTYvc2VsZWN0ZWRfbW9kZS5naWYiKSk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1hZ2VEZXNjcmlwdG9ycwotICAgICAgICAgICAgICAgIC5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAic2hvd2NoaWxkX21vZGUiLCBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJlbGNsMTYvc2hvd2NoaWxkX21vZGUuZ2lmIikpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgICAgIGltYWdlRGVzY3JpcHRvcnMKLSAgICAgICAgICAgICAgICAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgInNob3djaGlsZF9tb2RlX2Rpc2FibGVkIiwgSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigiZGxjbDE2L3Nob3djaGlsZF9tb2RlLmdpZiIpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgICAgICBpbWFnZURlc2NyaXB0b3JzCi0gICAgICAgICAgICAgICAgLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJzaG93ZXJyX2Rpc2FibGVkIiwgSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigiZGxjbDE2L3Nob3dlcnJfdHNrLmdpZiIpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgICAgICBpbWFnZURlc2NyaXB0b3JzCi0gICAgICAgICAgICAgICAgLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJzaG93d2Fybl9kaXNhYmxlZCIsIElERVdvcmtiZW5jaFBsdWdpbi5nZXRJREVJbWFnZURlc2NyaXB0b3IoImRsY2wxNi9zaG93d2Fybl90c2suZ2lmIikpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgICAgIGltYWdlRGVzY3JpcHRvcnMKLSAgICAgICAgICAgICAgICAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgInNob3d0c2tfZGlzYWJsZWQiLCBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJkbGNsMTYvc2hvd3Rza190c2suZ2lmIikpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgICAgIGltYWdlRGVzY3JpcHRvcnMucHV0KAotICAgICAgICAgICAgICAgICJmaWx0ZXIiLCBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJlbGNsMTYvZmlsdGVyX3BzLmdpZiIpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVuZGluZyBjaGFyYWN0ZXIgb2Zmc2V0IG9mIHRoZSBnaXZlbiBtYXJrZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Q2hhckVuZChJTWFya2VyIG1hcmtlcikgewotICAgICAgICByZXR1cm4gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhcnRpbmcgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgZ2l2ZW4gbWFya2VyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldENoYXJTdGFydChJTWFya2VyIG1hcmtlcikgewotICAgICAgICByZXR1cm4gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpY29uIHRvIGJlIHVzZWQgaW4gdGhlIHRhc2tsaXN0Ci0gICAgICogZm9yIHRoZSBjb21wbGV0ZSBzdGF0ZSBvZiBhIHRhc2suIFJldHVybnMgbnVsbAotICAgICAqIGZvciBtYXJrZXJzIHRoYXQgYXJlIG5vdCB0YXNrcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlIGdldENvbXBsZXRlSW1hZ2UoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgaWYgKGlzTWFya2VyVHlwZShtYXJrZXIsIElNYXJrZXIuVEFTSykpIHsKLSAgICAgICAgICAgIGlmIChpc0NvbXBsZXRlKG1hcmtlcikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlKCJjb21wbGV0ZV90c2siKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBlbHNlIGlmICghaXNSZWFkT25seShtYXJrZXIpKSAvLyBkb24ndCBzaG93IGEgY2hlY2sgYm94IGZvciByZWFkLW9ubHkgdGFza3MKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2UoImluY29tcGxldGVfdHNrIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGNvbXBsZXRlIHN0YXRlIG9mIGEgdGFzay4gCi0gICAgICogUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGZvciBtYXJrZXJzIHRoYXQgYXJlIG5vdCB0YXNrcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21wbGV0ZVRleHQoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgaWYgKGlzTWFya2VyVHlwZShtYXJrZXIsIElNYXJrZXIuVEFTSykpIHsKLSAgICAgICAgICAgIGlmIChpc0NvbXBsZXRlKG1hcmtlcikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfY29tcGxldGVkOyAKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9ub3RDb21wbGV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGV4dCB0byBiZSB1c2VkIGZvciB0aGUga2luZCBvZiBtYXJrZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0S2luZFRleHQoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgaWYgKGlzTWFya2VyVHlwZShtYXJrZXIsIElNYXJrZXIuVEFTSykpIHsKLSAgICAgICAgICAgIHJldHVybiBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X3Rhc2s7IAotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoZ2V0U2V2ZXJpdHkobWFya2VyKSkgewotICAgICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfRVJST1I6Ci0gICAgICAgICAgICByZXR1cm4gVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9lcnJvcjsgCi0gICAgICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOgotICAgICAgICAgICAgcmV0dXJuIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3Rfd2FybmluZzsgCi0gICAgICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9JTkZPOgotICAgICAgICAgICAgcmV0dXJuIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfaW5mbzsgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGFpbmVyIG5hbWUgaWYgaXQgaXMgZGVmaW5lZCwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb250YWluZXJOYW1lKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIElQYXRoIHBhdGggPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpOwotICAgICAgICBpbnQgbiA9IHBhdGguc2VnbWVudENvdW50KCkgLSAxOyAvLyBuIGlzIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgaW4gY29udGFpbmVyLCBub3QgcGF0aAotICAgICAgICBpZiAobiA8PSAwKQotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGludCBsZW4gPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKLSAgICAgICAgICAgIGxlbiArPSBwYXRoLnNlZ21lbnQoaSkubGVuZ3RoKCk7Ci0gICAgICAgIC8vIGFjY291bnQgZm9yIC8ncwotICAgICAgICBpZiAobiA+IDEpCi0gICAgICAgICAgICBsZW4gKz0gbiAtIDE7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobGVuKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChpICE9IDApCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcvJyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQocGF0aC5zZWdtZW50KGkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotICAgICAgICBJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChpbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihrZXkpOwotICAgICAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGltYWdlID0gZGVzYy5jcmVhdGVJbWFnZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGltYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVycgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJUYXNrTGlzdDogRXJyb3IgY3JlYXRpbmcgaW1hZ2UgZm9yICIgKyBrZXkpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBpbWFnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGltYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGltYWdlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gdmlzdWFsbHkgcmVwcmVzZW50Ci0gICAgICogdGhlIG1hcmtlciwgYmFzZWQgb24gaXRzIHR5cGUgYW5kIHByaW9yaXR5LgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgaWYgKGlzTWFya2VyVHlwZShtYXJrZXIsIElNYXJrZXIuUFJPQkxFTSkpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZ2V0U2V2ZXJpdHkobWFya2VyKSkgewotICAgICAgICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZSgiZXJyb3IiKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2UoIndhcm4iKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfSU5GTzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2UoImluZm8iKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNNYXJrZXJUeXBlKG1hcmtlciwgSU1hcmtlci5UQVNLKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlKCJ0YXNrIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotICAgICAgICBJbWFnZURlc2NyaXB0b3IgZGVzYyA9IChJbWFnZURlc2NyaXB0b3IpIGltYWdlRGVzY3JpcHRvcnMuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChkZXNjID09IG51bGwpIHsKLSAgICAgICAgCQlJREVXb3JrYmVuY2hQbHVnaW4ubG9nKCJUYXNrTGlzdDogTm8gaW1hZ2UgZGVzY3JpcHRvciBmb3IgIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVzYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgbGluZSBhbmQgbG9jYXRpb24gY29sdW1uIGdpdmVuIHRoZSBtYXJrZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGluZUFuZExvY2F0aW9uKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIGludCBsaW5lTnVtYmVyID0gZ2V0TGluZU51bWJlcihtYXJrZXIpOwotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihtYXJrZXIpOwotICAgICAgICByZXR1cm4gZ2V0TGluZUFuZExvY2F0aW9uKGxpbmVOdW1iZXIsIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgbGluZSBhbmQgbG9jYXRpb24gY29sdW1uIGdpdmVuIHRoZSBsaW5lIG51bWJlciBhbmQgbG9jYXRpb24gdGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMaW5lQW5kTG9jYXRpb24oaW50IGxpbmVOdW1iZXIsIFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICBpZiAobGluZU51bWJlciA9PSAtMSkgewotICAgICAgICAgICAgaWYgKGxvY2F0aW9uLmVxdWFscygiIikpIHsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvY2F0aW9uLmVxdWFscygiIikpIHsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQobmV3IE9iamVjdFtdIHsgSW50ZWdlci50b1N0cmluZyhsaW5lTnVtYmVyKSB9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVBbmRMb2NhdGlvbi5mb3JtYXQobmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobGluZU51bWJlciksIGxvY2F0aW9uIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGdpdmVuIG1hcmtlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRMaW5lTnVtYmVyKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIHJldHVybiBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgbG9jYXRpb24gZmllbGQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYXRpb24oSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgcmV0dXJuIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgIiIpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gbWFya2VyLAotICAgICAqIG9yIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlIG1lc3NhZ2UgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgcmV0dXJuIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCAiIik7Ly8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIGdpdmVuIHN0cmluZywgd2hpY2ggaXMgYXNzdW1lZCB0byByZXByZXNlbnQgYSBudW1lcmljIHZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBudW1lcmljLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBpbnQgZ2V0TnVtZXJpY1ZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBib29sZWFuIG5lZ2F0aXZlID0gZmFsc2U7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgaW50IGxlbiA9IHZhbHVlLmxlbmd0aCgpOwotCi0gICAgICAgIC8vIHNraXAgYW55IGxlYWRpbmcgJyMnCi0gICAgICAgIC8vIHdvcmthcm91bmQgZm9yIDFHQ0U2OVU6IElUUEpDT1JFOkFMTCAtIEphdmEgcHJvYmxlbXMgc2hvdWxkIG5vdCBoYXZlICcjJyBpbiBsb2NhdGlvbi4KLSAgICAgICAgaWYgKGkgPCBsZW4gJiYgdmFsdWUuY2hhckF0KGkpID09ICcjJykKLSAgICAgICAgICAgICsraTsKLQotICAgICAgICBpZiAoaSA8IGxlbiAmJiB2YWx1ZS5jaGFyQXQoaSkgPT0gJy0nKSB7Ci0gICAgICAgICAgICBuZWdhdGl2ZSA9IHRydWU7Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgd2hpbGUgKGkgPCBsZW4pIHsKLSAgICAgICAgICAgIGludCBkaWdpdCA9IENoYXJhY3Rlci5kaWdpdCh2YWx1ZS5jaGFyQXQoaSsrKSwgMTApOwotICAgICAgICAgICAgaWYgKGRpZ2l0IDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKiAxMCArIGRpZ2l0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWdhdGl2ZSkgewotICAgICAgICAgICAgcmVzdWx0ID0gLXJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByaW9yaXR5IG9mIHRoZSBnaXZlbiBtYXJrZXIuICBEZWZhdWx0IGlzIFBSSU9SSVRZX05PUk1BTC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQcmlvcml0eShJTWFya2VyIG1hcmtlcikgewotICAgICAgICByZXR1cm4gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlBSSU9SSVRZLCBJTWFya2VyLlBSSU9SSVRZX05PUk1BTCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbWFnZSB0aGF0IHNob3VsZCB2aXN1YWxseSByZXByZXNlbnQgbWFya2VyJ3MgcHJpb3JpdHkKLSAgICAgKiBpbiB0aGUgdGFza2xpc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRQcmlvcml0eUltYWdlKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIHN3aXRjaCAoZ2V0UHJpb3JpdHkobWFya2VyKSkgewotICAgICAgICBjYXNlIElNYXJrZXIuUFJJT1JJVFlfSElHSDoKLSAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZSgiaHByaW8iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGNhc2UgSU1hcmtlci5QUklPUklUWV9OT1JNQUw6Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gbm8gaW1hZ2UgZm9yIG5vcm1hbCBwcmlvcml0eQotICAgICAgICBjYXNlIElNYXJrZXIuUFJJT1JJVFlfTE9XOgotICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlKCJscHJpbyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgZ2l2ZW4gbWFya2VyJ3MgcHJpb3JpdHkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJpb3JpdHlUZXh0KElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIGlmICghaXNNYXJrZXJUeXBlKG1hcmtlciwgSU1hcmtlci5UQVNLKSkKLSAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHN3aXRjaCAoZ2V0UHJpb3JpdHkobWFya2VyKSkgewotICAgICAgICBjYXNlIElNYXJrZXIuUFJJT1JJVFlfSElHSDoKLSAgICAgICAgICAgIHJldHVybiBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X2hpZ2g7IAotICAgICAgICBjYXNlIElNYXJrZXIuUFJJT1JJVFlfTk9STUFMOgotICAgICAgICAgICAgcmV0dXJuIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3Rfbm9ybWFsOwotICAgICAgICBjYXNlIElNYXJrZXIuUFJJT1JJVFlfTE9XOgotICAgICAgICAgICAgcmV0dXJuIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfbG93OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAkJCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50cyBJUHJvdmlkZXIgaW50ZXJmYWNlIGJ5IHN1cHBvcnRpbmcgYSBudW1iZXIgb2YKLSAgICAgKiBwcm9wZXJ0aWVzIHJlcXVpcmVkIGZvciB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgbWFya2VycwotICAgICAqIGluIHRoZSB0YXNrbGlzdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIElNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIG9iamVjdDsKLQotICAgICAgICAvLyBvcHRpbWl6YXRpb25zOgotICAgICAgICAvLyAtIGNoZWNrIHByb3BlcnRpZXMgbmVlZGVkIGZvciBUYXNrTGlzdExhYmVsUHJvdmlkZXIgZmlyc3QsCi0gICAgICAgIC8vICAgdGhlbiB0aG9zZSBuZWVkZWQgZm9yIGNlbGwgbW9kaWZpZXJzCi0gICAgICAgIC8vIC0gdXNlID09IGluc3RlYWQgb2YgZXF1YWxzIGZvciBlZmZpY2llbmN5Ci0gICAgICAgIGlmIChJQmFzaWNQcm9wZXJ0eUNvbnN0YW50cy5QX0lNQUdFID09IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlKG1hcmtlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKElNYXJrZXJDb25zdGFudHMuUF9DT01QTEVURV9JTUFHRSA9PSBrZXkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb21wbGV0ZUltYWdlKG1hcmtlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKElNYXJrZXJDb25zdGFudHMuUF9QUklPUklUWV9JTUFHRSA9PSBrZXkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQcmlvcml0eUltYWdlKG1hcmtlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKElNYXJrZXIuTUVTU0FHRSA9PSBrZXkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNZXNzYWdlKG1hcmtlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKElNYXJrZXJDb25zdGFudHMuUF9SRVNPVVJDRV9OQU1FID09IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlc291cmNlTmFtZShtYXJrZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChJTWFya2VyQ29uc3RhbnRzLlBfQ09OVEFJTkVSX05BTUUgPT0ga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyTmFtZShtYXJrZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChJTWFya2VyQ29uc3RhbnRzLlBfTElORV9BTkRfTE9DQVRJT04gPT0ga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TGluZUFuZExvY2F0aW9uKG1hcmtlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKElNYXJrZXIuUFJJT1JJVFkgPT0ga2V5KSB7Ci0gICAgICAgICAgICAvLyB0aGlzIHByb3BlcnR5IGlzIHVzZWQgb25seSBieSBjZWxsIGVkaXRvciwgd2hlcmUgb3JkZXIgaXMgSGlnaCwgTm9ybWFsLCBMb3cKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX0hJR0ggLSBnZXRQcmlvcml0eShtYXJrZXIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoSU1hcmtlci5ET05FID09IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIGlzQ29tcGxldGUobWFya2VyKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKElCYXNpY1Byb3BlcnR5Q29uc3RhbnRzLlBfVEVYVCA9PSBrZXkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNZXNzYWdlKG1hcmtlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBuYW1lIGlmIGl0IGlzIGRlZmluZWQsIG9yCi0gICAgICogYmxhbmsgc3RyaW5nIGlmIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgcmV0dXJuIG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXZlcml0eSBvZiB0aGUgZ2l2ZW4gbWFya2VyLiAgRGVmYXVsdCBpcyBTRVZFUklUWV9XQVJOSU5HLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFNldmVyaXR5KElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIHJldHVybiBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBoZWxwZXIgbWV0aG9kIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbgotICAgICAqIG1hcmtlciBpcyBtYXJrZWQgYXMgY29tcGxldGUgaW4gdGhlIHRhc2tsaXN0LgotICAgICAqIE9ubHkgdGFza3MgY2FuIGJlIGNvbXBsZXRlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbXBsZXRlKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIHJldHVybiBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuRE9ORSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbWFya2VyIGlzIGVkaXRhYmxlLgotICAgICAqIE9ubHkgdGFza3Mgd2hpY2ggaGF2ZSBub3QgYmVlbiBtYXJrZWQgYXMgcmVhZC1vbmx5IGFyZSBlZGl0YWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFZGl0YWJsZShJTWFya2VyIG1hcmtlcikgewotICAgICAgICByZXR1cm4gaXNNYXJrZXJUeXBlKG1hcmtlciwgSU1hcmtlci5UQVNLKSAmJiAhaXNSZWFkT25seShtYXJrZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbWFya2VyIGlzIG9mIHRoZSBnaXZlbiB0eXBlIChlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFya2VyVHlwZShJTWFya2VyIG1hcmtlciwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtYXJrZXIuaXNTdWJ0eXBlT2YodHlwZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBtYXJrZXIgaXMgcmVhZC1vbmx5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRPbmx5KElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIHJldHVybiAhbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlVTRVJfRURJVEFCTEUsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIG1hcmtlciBhcyBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDcmVhdGlvblRpbWUoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoRGF0ZUZvcm1hdC5MT05HLAotICAgICAgICAgICAgICAgICAgICBEYXRlRm9ybWF0Lk1FRElVTSkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShtYXJrZXIuZ2V0Q3JlYXRpb25UaW1lKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9OZXdUYXNrQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvTmV3VGFza0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjdlZjdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9OZXdUYXNrQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy50YXNrbGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MudGFza2xpc3QuVGFza0xpc3RNZXNzYWdlczsKLQotLyoqCi0gKiBUaGlzIGFjdGlvbiBjcmVhdGVzIGEgbmV3IHRhc2suIElmIGEgcmVzb3VyY2UgaXMgY3VycmVudGx5Ci0gKiBwcmVzZW50IGF0IHRoZSB0YXNrbGlzdCdzIGlucHV0LCB0aGlzIHRhc2sgd2lsbCBiZQotICogYXNzb2NpYXRlZCB3aXRoIGl0LiBJZiB0aGUgdGFza2xpc3QgaXMgY3VycmVudGx5Ci0gKiBvYnNlcnZpbmcgYWxsIHRoZSBtYXJrZXJzIGluIHRoZSB3b3JrYmVuY2gsIHRoZSB0YXNrCi0gKiB3aWxsIG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55IHJlc291cmNlLgotICogPHA+VGhlIG5ld2x5IGNyZWF0ZWQgdGFzayB3aWxsIGhhdmUgbG93IHByaW9yaXR5LAotICogZml4ZWQgZGVzY3JpcHRpb24gdGV4dCBhbmQgd2lsbCBub3QgYmUgc3ViamVjdCB0bwotICogc29ydGluZyBvciBmaWx0ZXJpbmcgdW50aWwgaXRzIGRlc2NpcHJpb24gaXMgYmVpbmcKLSAqIGNoYW5nZWQgZm9yIHRoZSBmaXJzdCB0aW1lLiBGb3IgdGhpcyByZWFzb24sIG5ldwotICogdGFza3MgcmVtYWluIGF0IHRoZSB0b3Agb2YgdGhlIHRhc2sgbGlzdAotICogdW50aWwgbW9kaWZpZWQuIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIG5ld2x5Ci0gKiBjcmVhdGVkIHRhc2sgZGlzc2FwZWFycyBhZnRlciB0aGF0IGlmIGl0cwotICogdHlwZSBvciBzb21lIG90aGVyIHByb3BlcnR5IGNhdXNlcyBpdCB0bwotICogYmUgZmlsdGVyZWQgb3V0LgotICovCi1jbGFzcyBOZXdUYXNrQWN0aW9uIGV4dGVuZHMgVGFza0FjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHRhc2tsaXN0IHRoZSB0YXNrIGxpc3QKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGlkCi0gICAgICovCi0gICAgcHVibGljIE5ld1Rhc2tBY3Rpb24oVGFza0xpc3QgdGFza2xpc3QsIFN0cmluZyBpZCkgewotICAgICAgICBzdXBlcih0YXNrbGlzdCwgaWQpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJSVRhc2tMaXN0SGVscENvbnRleHRJZHMuTkVXX1RBU0tfQUNUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyB0aGUgbmV3IHRhc2sgZGlhbG9nIGFuZCBzaG93cyB0aGUgbmV3bHkgY3JlYXRlZCB0YXNrIHdoZW4gZG9uZS4KLSAgICAgKiBUaGUgbmV3IHRhc2sgaXMgY3JlYXRlZCBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlc291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgVGFza1Byb3BlcnRpZXNEaWFsb2cgZGlhbG9nID0gbmV3IFRhc2tQcm9wZXJ0aWVzRGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgICBkaWFsb2cuc2V0UmVzb3VyY2UoZ2V0VGFza0xpc3QoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICBzaG93TWFya2VyKGRpYWxvZy5nZXRNYXJrZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IHRoZSBuZXdseSBjcmVhdGVkIG1hcmtlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2hvd01hcmtlcihmaW5hbCBJTWFya2VyIG1hcmtlcikgewotICAgICAgICBpZiAobWFya2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0VGFza0xpc3QoKS5zaG91bGRTaG93KG1hcmtlcikpIHsKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gZG8gdGhpcyBpbiBhbiBhc3luY0V4ZWMsIGV2ZW4gdGhvdWdoIHdlJ3JlIGluIHRoZSBVSSB0aHJlYWQgaGVyZSwKLSAgICAgICAgICAgIC8vIHNpbmNlIHRoZSB0YXNrIGxpc3QgdXBkYXRlcyBpdHNlbGYgd2l0aCB0aGUgYWRkaXRpb24gaW4gYW4gYXN5bmNFeGVjLAotICAgICAgICAgICAgLy8gd2hpY2ggaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldC4KLSAgICAgICAgICAgIGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBnZXRUYXNrTGlzdCgpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtYXJrZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0U2hlbGwoKSwgVGFza0xpc3RNZXNzYWdlcy5OZXdUYXNrX25vdFNob3duVGl0bGUsIAotICAgICAgICAgICAgICAgICAgICBUYXNrTGlzdE1lc3NhZ2VzLk5ld1Rhc2tfbm90U2hvd25Nc2cpOyAKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9QYXN0ZVRhc2tBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9QYXN0ZVRhc2tBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiYjQwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvUGFzdGVUYXNrQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MudGFza2xpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy50YXNrbGlzdC5UYXNrTGlzdE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTWFya2VyVHJhbnNmZXI7Ci0KLS8qKgotICogU3RhbmRhcmQgYWN0aW9uIGZvciBwYXN0aW5nIHRhc2tzIGZyb20gdGhlIGNsaXBib2FyZC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDIuMAotICovCi1jbGFzcyBQYXN0ZVRhc2tBY3Rpb24gZXh0ZW5kcyBUYXNrQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0YXNrbGlzdCB0aGUgdGFzayBsaXN0Ci0gICAgICogQHBhcmFtIGlkIHRoZSBpZAotICAgICAqLwotICAgIHB1YmxpYyBQYXN0ZVRhc2tBY3Rpb24oVGFza0xpc3QgdGFza2xpc3QsIFN0cmluZyBpZCkgewotICAgICAgICBzdXBlcih0YXNrbGlzdCwgaWQpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJSVRhc2tMaXN0SGVscENvbnRleHRJZHMuUEFTVEVfVEFTS19BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgLy8gR2V0IHRoZSBtYXJrZXJzIGZyb20gdGhlIGNsaXBib2FyZAotICAgICAgICBNYXJrZXJUcmFuc2ZlciB0cmFuc2ZlciA9IE1hcmtlclRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGZpbmFsIElNYXJrZXJbXSBtYXJrZXJEYXRhID0gKElNYXJrZXJbXSkgZ2V0VGFza0xpc3QoKS5nZXRDbGlwYm9hcmQoKQotICAgICAgICAgICAgICAgIC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0KLSAgICAgICAgaWYgKG1hcmtlckRhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBmaW5hbCBBcnJheUxpc3QgbmV3TWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0VGFza0xpc3QoKS5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBwYXN0ZSB0YXNrcyAobm90IHByb2JsZW1zKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXJrZXJEYXRhW2ldLmdldFR5cGUoKS5lcXVhbHMoSU1hcmtlci5UQVNLKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzdGUgdG8gdGhlIHNhbWUgcmVzb3VyY2UgYXMgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXJrZXJEYXRhW2ldLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgYXR0cmlidXRlcyA9IG1hcmtlckRhdGFbaV0uZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIoSU1hcmtlci5UQVNLKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWFya2Vycy5hZGQobWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBUYXNrTGlzdE1lc3NhZ2VzLlBhc3RlVGFza19lcnJvck1lc3NhZ2UsIAotICAgICAgICAgICAgICAgICAgICBudWxsLCBlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5lZWQgdG8gZG8gdGhpcyBpbiBhbiBhc3luY0V4ZWMsIGV2ZW4gdGhvdWdoIHdlJ3JlIGluIHRoZSBVSSB0aHJlYWQgaGVyZSwKLSAgICAgICAgLy8gc2luY2UgdGhlIHRhc2sgbGlzdCB1cGRhdGVzIGl0c2VsZiB3aXRoIHRoZSBhZGRpdGlvbiBpbiBhbiBhc3luY0V4ZWMsCi0gICAgICAgIC8vIHdoaWNoIGhhc24ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuCi0gICAgICAgIC8vIE11c3QgYmUgZG9uZSBvdXRzaWRlIElXb3Jrc3BhY2VSdW5uYWJsZSBhYm92ZSBzaW5jZSBub3RpZmljYXRpb24gZm9yIGFkZCBpcwotICAgICAgICAvLyBzZW50IGFmdGVyIElXb3Jrc3BhY2VSdW5uYWJsZSBpcyBydW4uCi0gICAgICAgIGlmIChuZXdNYXJrZXJzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBUYXNrTGlzdCB0YXNrTGlzdCA9IGdldFRhc2tMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRhc2tMaXN0LnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdNYXJrZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvUHVyZ2VDb21wbGV0ZWRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9QdXJnZUNvbXBsZXRlZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGFjYzk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9QdXJnZUNvbXBsZXRlZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MudGFza2xpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnRhc2tsaXN0LlRhc2tMaXN0TWVzc2FnZXM7Ci0KLS8qKgotICogVGhpcyBhY3Rpb24gZGVsZXRlcyBhbGwgdGhlIHRhc2tzIGZvdW5kIGluIHRoZSByZWdpc3RyeSB0aGF0Ci0gKiBhcmUgbWFya2VkIGFzIGNvbXBsZXRlZC4KLSAqLwotY2xhc3MgUHVyZ2VDb21wbGV0ZWRBY3Rpb24gZXh0ZW5kcyBUYXNrQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFza2xpc3QgdGhlIHRhc2sgbGlzdAotICAgICAqIEBwYXJhbSBpZCB0aGUgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUHVyZ2VDb21wbGV0ZWRBY3Rpb24oVGFza0xpc3QgdGFza2xpc3QsIFN0cmluZyBpZCkgewotICAgICAgICBzdXBlcih0YXNrbGlzdCwgaWQpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0gICAgICAgICAgICAgICAgSVRhc2tMaXN0SGVscENvbnRleHRJZHMuUFVSR0VfQ09NUExFVEVEX1RBU0tfQUNUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGZXRjaGVzIGFsbCB0aGUgY29tcGxldGVkIHRhc2tzIGluIHRoZSB3b3Jrc3BhY2UgYW5kIGRlbGV0ZXMgdGhlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRUYXNrTGlzdCgpLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICBpbnQgZGVwdGggPSBnZXRUYXNrTGlzdCgpLmdldFJlc291cmNlRGVwdGgoKTsKLSAgICAgICAgICAgIElNYXJrZXJbXSB0YXNrcyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKElNYXJrZXIuVEFTSywgdHJ1ZSwgZGVwdGgpOwotICAgICAgICAgICAgZmluYWwgTGlzdCBjb21wbGV0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSU1hcmtlciB0YXNrID0gdGFza3NbaV07Ci0gICAgICAgICAgICAgICAgaWYgKE1hcmtlclV0aWwuaXNDb21wbGV0ZSh0YXNrKSAmJiAhTWFya2VyVXRpbC5pc1JlYWRPbmx5KHRhc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZC5hZGQodGFzayk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gZG8KLSAgICAgICAgICAgIGlmIChjb21wbGV0ZWQuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRTaGVsbCgpLCBUYXNrTGlzdE1lc3NhZ2VzLlB1cmdlQ29tcGxldGVkX3RpdGxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tMaXN0TWVzc2FnZXMuUHVyZ2VDb21wbGV0ZWRfbm9uZUNvbXBsZXRlZCk7IAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVmVyaWZ5LgotICAgICAgICAgICAgaWYgKCFNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKGdldFNoZWxsKCksIFRhc2tMaXN0TWVzc2FnZXMuUHVyZ2VDb21wbGV0ZWRfdGl0bGUsCi0gICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKFRhc2tMaXN0TWVzc2FnZXMuUHVyZ2VDb21wbGV0ZWRfcGVybWFuZW50LFN0cmluZy52YWx1ZU9mKGNvbXBsZXRlZC5zaXplKCkpKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSB0b0RlbGV0ZSA9IG5ldyBJTWFya2VyW2NvbXBsZXRlZC5zaXplKCldOwotICAgICAgICAgICAgY29tcGxldGVkLnRvQXJyYXkodG9EZWxldGUpOwotICAgICAgICAgICAgZ2V0VGFza0xpc3QoKS5nZXRXb3Jrc3BhY2UoKS5kZWxldGVNYXJrZXJzKHRvRGVsZXRlKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBFcnJvckRpYWxvZwotICAgICAgICAgICAgICAgICAgICAub3BlbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5QdXJnZUNvbXBsZXRlZF9lcnJvck1lc3NhZ2UsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOyAKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9SZW1vdmVUYXNrQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvUmVtb3ZlVGFza0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzc2ZDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9SZW1vdmVUYXNrQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy50YXNrbGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnRhc2tsaXN0LlRhc2tMaXN0TWVzc2FnZXM7Ci0KLS8qKgotICogVGhpcyBhY3Rpb24gcmVtb3ZlcyB0aGUgc2VsZWN0ZWQgdGFzayhzKSBmcm9tIHRoZSB0YXNrIGxpc3QuCi0gKiBPbmx5IHRhc2tzIGNhbiBiZSByZW1vdmVkLiBQcm9ibGVtcyBjYW4gb25seSBkaXNhcHBlYXIgZnJvbQotICogdGhlIHRhc2sgbGlzdCB3aGVuIHRoZXkgYXJlIGZpeGVkIGluIHRoZSBhc3NvY2lhdGVkIGNvZGUuCi0gKi8KLWNsYXNzIFJlbW92ZVRhc2tBY3Rpb24gZXh0ZW5kcyBUYXNrQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFza2xpc3QgdGhlIHRhc2sgbGlzdAotICAgICAqIEBwYXJhbSBpZCB0aGUgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVtb3ZlVGFza0FjdGlvbihUYXNrTGlzdCB0YXNrbGlzdCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHN1cGVyKHRhc2tsaXN0LCBpZCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlJVGFza0xpc3RIZWxwQ29udGV4dElkcy5SRU1PVkVfVEFTS19BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIHRoZSB0YXNrcyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gZnJvbSB0aGUgdGFzayBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgVGFza0xpc3QgdGFza0xpc3QgPSBnZXRUYXNrTGlzdCgpOwotICAgICAgICBUYWJsZVZpZXdlciB2aWV3ZXIgPSB0YXNrTGlzdC5nZXRUYWJsZVZpZXdlcigpOwotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0YXNrTGlzdC5jYW5jZWxFZGl0aW5nKCk7Ci0gICAgICAgIC8vIGdldCB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0gd2hpY2ggaGFzIGZvY3VzCi0gICAgICAgIFRhYmxlIHRhYmxlID0gdmlld2VyLmdldFRhYmxlKCk7Ci0gICAgICAgIGludCBmb2N1c0luZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3QgbGlzdCA9IHNlbGVjdGlvbi50b0xpc3QoKTsKLSAgICAgICAgICAgIElNYXJrZXJbXSBtYXJrZXJzID0gbmV3IElNYXJrZXJbbGlzdC5zaXplKCldOwotICAgICAgICAgICAgbGlzdC50b0FycmF5KG1hcmtlcnMpOwotICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBvbmx5IGludm9rZSBvbmUgd29ya3NwYWNlIG9wZXJhdGlvbgotICAgICAgICAgICAgdGFza0xpc3QuZ2V0V29ya3NwYWNlKCkuZGVsZXRlTWFya2VycyhtYXJrZXJzKTsKLSAgICAgICAgICAgIC8vIHNldCB0aGUgc2VsZWN0aW9uIHRvIGJlIHRoZSBvbmUgd2hpY2ggdG9vayB0aGUgcGxhY2Ugb2YgdGhlIG9uZSB3aXRoIGZvY3VzCi0gICAgICAgICAgICBpbnQgY291bnQgPSB0YWJsZS5nZXRJdGVtQ291bnQoKTsKLSAgICAgICAgICAgIGlmIChmb2N1c0luZGV4IDwgY291bnQpIHsKLSAgICAgICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oZm9jdXNJbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50ICE9IDApIHsKLSAgICAgICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oY291bnQgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdmlld2VyJ3Mgc2VsZWN0aW9uLCBzaW5jZSBzZXR0aW5nIHRoZSB0YWJsZSBzZWxlY3Rpb24gZG9lcyBub3Qgbm90aWZ5IHRoZSB2aWV3ZXIKLSAgICAgICAgICAgIHZpZXdlci5zZXRTZWxlY3Rpb24odmlld2VyLmdldFNlbGVjdGlvbigpLCB0cnVlKTsKLQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBUYXNrTGlzdE1lc3NhZ2VzLlJlbW92ZVRhc2tfZXJyb3JNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBudWxsLCBlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9SZXNvbHZlTWFya2VyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvUmVzb2x2ZU1hcmtlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzliMmJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9SZXNvbHZlTWFya2VyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MudGFza2xpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLk1hcmtlclJlc29sdXRpb25TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy50YXNrbGlzdC5UYXNrTGlzdE1lc3NhZ2VzOwotCi0vKioKLSAqIFRoaXMgYWN0aW9uIGRpc3BsYXlzIGEgbGlzdCBvZiByZXNvbHV0aW9ucyBmb3IgdGhlIHNlbGVjdGVkIG1hcmtlcgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLWNsYXNzIFJlc29sdmVNYXJrZXJBY3Rpb24gZXh0ZW5kcyBUYXNrQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUmVzb2x2ZU1hcmtlckFjdGlvbihUYXNrTGlzdCB0YXNrbGlzdCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHN1cGVyKHRhc2tsaXN0LCBpZCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLSAgICAgICAgICAgICAgICBJVGFza0xpc3RIZWxwQ29udGV4dElkcy5SRVNPTFZFX01BUktFUl9BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBnaXZlbiB0aGUgc2VsZWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIHNlbGVjdGlvbgotICAgICAqIEByZXR1cm4gZW5hYmxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZEVuYWJsZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgaWYgKHNlbGVjdGlvbi5zaXplKCkgIT0gMSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAobWFya2VyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBJREUuZ2V0TWFya2VySGVscFJlZ2lzdHJ5KCkuaGFzUmVzb2x1dGlvbnMobWFya2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5cyBhIGxpc3Qgb2YgcmVzb2x1dGlvbnMgYW5kIHBlcmZvcm1zIHRoZSBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBJTWFya2VyIG1hcmtlciA9IGdldE1hcmtlcigpOwotICAgICAgICBpZiAobWFya2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBnZXRUYXNrTGlzdCgpLmNhbmNlbEVkaXRpbmcoKTsKLSAgICAgICAgSU1hcmtlclJlc29sdXRpb25bXSByZXNvbHV0aW9ucyA9IGdldFJlc29sdXRpb25zKG1hcmtlcik7Ci0gICAgICAgIGlmIChyZXNvbHV0aW9ucy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0U2hlbGwoKSwgVGFza0xpc3RNZXNzYWdlcy5SZXNvbHZlX3RpdGxlLCAKLSAgICAgICAgICAgICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5SZXNvbHZlX25vUmVzb2x1dGlvbnNMYWJlbCk7IAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1hcmtlclJlc29sdXRpb25TZWxlY3Rpb25EaWFsb2cgZCA9IG5ldyBNYXJrZXJSZXNvbHV0aW9uU2VsZWN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgIGdldFNoZWxsKCksIHJlc29sdXRpb25zKTsKLSAgICAgICAgaWYgKGQub3BlbigpICE9IFdpbmRvdy5PSykKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gZC5nZXRSZXN1bHQoKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGggPiAwKQotICAgICAgICAgICAgKChJTWFya2VyUmVzb2x1dGlvbikgcmVzdWx0WzBdKS5ydW4obWFya2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvbHV0aW9ucyBmb3IgdGhlIGdpdmVuIG1hcmtlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXJrZXIgdGhlIG1hcmtlciBmb3Igd2hpY2ggdG8gb2J0YWluIHJlc29sdXRpb25zCi0gICAgICogQHJldHVybiB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSBzZWxlY3RlZCBtYXJrZXIJCi0gICAgICovCi0gICAgcHJpdmF0ZSBJTWFya2VyUmVzb2x1dGlvbltdIGdldFJlc29sdXRpb25zKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIHJldHVybiBJREUuZ2V0TWFya2VySGVscFJlZ2lzdHJ5KCkuZ2V0UmVzb2x1dGlvbnMobWFya2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBtYXJrZXIgKG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2VsZWN0ZWQgbWFya2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSBJTWFya2VyIGdldE1hcmtlcigpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRUYXNrTGlzdCgpCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICAvLyBvbmx5IGVuYWJsZSBmb3Igc2luZ2xlIHNlbGVjdGlvbgotICAgICAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoSU1hcmtlcikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9TZWxlY3RBbGxUYXNrc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L1NlbGVjdEFsbFRhc2tzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODY4ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L1NlbGVjdEFsbFRhc2tzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy50YXNrbGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGlzIGFjdGlvbiBzZWxlY3RzIGFsbCB0YXNrcyBjdXJyZW50bHkgc2hvd2luZyBpbiB0aGUgdGFzayBsaXN0LgotICovCi1jbGFzcyBTZWxlY3RBbGxUYXNrc0FjdGlvbiBleHRlbmRzIFRhc2tBY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTZWxlY3RBbGxUYXNrc0FjdGlvbihUYXNrTGlzdCB0YXNrbGlzdCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHN1cGVyKHRhc2tsaXN0LCBpZCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLSAgICAgICAgICAgICAgICBJVGFza0xpc3RIZWxwQ29udGV4dElkcy5TRUxFQ1RfQUxMX1RBU0tTX0FDVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyBhbGwgcmVzb3VyY2VzIGluIHRoZSB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgZ2V0VGFza0xpc3QoKS5jYW5jZWxFZGl0aW5nKCk7Ci0gICAgICAgIFRhYmxlVmlld2VyIHZpZXdlciA9IGdldFRhc2tMaXN0KCkuZ2V0VGFibGVWaWV3ZXIoKTsKLSAgICAgICAgdmlld2VyLmdldFRhYmxlKCkuc2VsZWN0QWxsKCk7Ci0gICAgICAgIC8vIGZvcmNlIHZpZXdlciBzZWxlY3Rpb24gY2hhbmdlCi0gICAgICAgIHZpZXdlci5zZXRTZWxlY3Rpb24odmlld2VyLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvVGFza0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L1Rhc2tBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjYWRkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvVGFza0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MudGFza2xpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3Mgb2YgYWxsIHRoZSBsb2NhbCBhY3Rpb25zIHVzZWQKLSAqIGluIHRoZSB0YXNrIGxpc3Qgdmlldy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgVGFza0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLSAgICBwcml2YXRlIFRhc2tMaXN0IHRhc2tMaXN0OwotCi0gICAgLyoqCi0gICAgICogVGFza0FjdGlvbiBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGFza0FjdGlvbihUYXNrTGlzdCB0YXNrbGlzdCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMudGFza0xpc3QgPSB0YXNrbGlzdDsKLSAgICAgICAgc2V0SWQoaWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoZWxsIHRvIHVzZSB3aXRoaW4gYWN0aW9ucy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0gICAgICAgIHJldHVybiB0YXNrTGlzdC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0YXNrIGxpc3Qgdmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUYXNrTGlzdCBnZXRUYXNrTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3JlcyB0aGUgY3VycmVudCBzdGF0ZSB2YWx1ZSBvZiB0aGlzIHRvZ2dsZSBhY3Rpb24KLSAgICAgKiBpbnRvIHRoZSBkaWFsb2cgc3RvcmUgdXNpbmcgYWN0aW9uIElEIGFzIGEga2V5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWUoKSB7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IFRhc2tMaXN0LmdldFBsdWdpbigpCi0gICAgICAgICAgICAgICAgLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzLmdldFNlY3Rpb24oIlRhc2tBY3Rpb24iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChzZXR0aW5ncyA9PSBudWxsKQotICAgICAgICAgICAgc2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncy5hZGROZXdTZWN0aW9uKCJUYXNrQWN0aW9uIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBzZXR0aW5ncy5wdXQoZ2V0SWQoKSwgaXNDaGVja2VkKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9UYXNrTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L1Rhc2tMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMDFkZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L1Rhc2tMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBDYWdhdGF5IEthdnVrY3VvZ2x1IDxjYWdhdGF5a0BhY20ub3JnPiAtIEZpbHRlciBmb3IgbWFya2VycyBpbiBzYW1lIHByb2plY3QKLSAqICAgICBTZWJhc3RpYW4gRGF2aWRzIDxzZGF2aWRzQGdteC5kZT4gLSBSZW9yZGVyZWQgbWVudSBpdGVtcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MudGFza2xpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGF5b3V0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtblBpeGVsRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzaWNQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JT3Blbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuT3BlbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnRhc2tsaXN0LlRhc2tMaXN0TWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5DZWxsRWRpdG9yQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk1hcmtlclRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuU2hvd0luQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIE1haW4gY2xhc3MgZm9yIHRoZSBUYXNrIExpc3QgdmlldyBmb3IgZGlzcGxheWluZyB0YXNrcyBhbmQgcHJvYmxlbSBhbm5vdGF0aW9ucwotICogb24gcmVzb3VyY2VzLCBhbmQgZm9yIG9wZW5pbmcgYW4gZWRpdG9yIG9uIHRoZSByZXNvdXJjZSB3aGVuIHRoZSB1c2VyIGNvbW1hbmRzLgotICogPHA+Ci0gKiBUaGlzIHN0YW5kYXJkIHZpZXcgaGFzIGlkIDxjb2RlPiJvcmcuZWNsaXBzZS51aS52aWV3cy5UYXNrTGlzdCI8L2NvZGU+LgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgd29ya2JlbmNoIHdpbGwgYXV0b21hdGljYWxseSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIHdoZW4gYSBUYXNrIExpc3QKLSAqIHZpZXcgaXMgbmVlZGVkIGZvciBhIHdvcmtiZW5jaCB3aW5kb3cuIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkCi0gKiB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVGFza0xpc3QgZXh0ZW5kcyBWaWV3UGFydCB7Ci0KLSAgICBwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0gICAgcHJpdmF0ZSBUYXNrU29ydGVyIHNvcnRlcjsKLQotICAgIHByaXZhdGUgQ2VsbEVkaXRvciBkZXNjcmlwdGlvbkVkaXRvcjsKLQotICAgIHByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotCi0gICAgcHJpdmF0ZSBUYXNrc0ZpbHRlciBmaWx0ZXIgPSBuZXcgVGFza3NGaWx0ZXIoKTsKLQotICAgIHByaXZhdGUgSU1lbWVudG8gbWVtZW50bzsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtYXJrZXJMaW1pdEV4Y2VlZGVkOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0gICAgcHJpdmF0ZSBTdGFja0xheW91dCBzdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlTWFya2VyTGltaXRFeGNlZWRlZDsKLQotICAgIHByaXZhdGUgQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIgZWRpdG9yQWN0aW9uSGFuZGxlcjsKLQotICAgIHByaXZhdGUgVGFza0FjdGlvbiBuZXdUYXNrQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBUYXNrQWN0aW9uIGNvcHlUYXNrQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBUYXNrQWN0aW9uIHBhc3RlVGFza0FjdGlvbjsKLQotICAgIHByaXZhdGUgVGFza0FjdGlvbiByZW1vdmVUYXNrQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBUYXNrQWN0aW9uIHB1cmdlQ29tcGxldGVkQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBUYXNrQWN0aW9uIGdvdG9UYXNrQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBUYXNrQWN0aW9uIHNlbGVjdEFsbEFjdGlvbjsKLQotICAgIHByaXZhdGUgUmVzb2x2ZU1hcmtlckFjdGlvbiByZXNvbHZlTWFya2VyQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBUYXNrQWN0aW9uIGZpbHRlcnNBY3Rpb247Ci0KLSAgICBwcml2YXRlIE1hcmtDb21wbGV0ZWRBY3Rpb24gbWFya0NvbXBsZXRlZEFjdGlvbjsKLQotICAgIHByaXZhdGUgVGFza0FjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uOwotCi0gICAgLy9zb3J0IGJ5IGFjdGlvbgotICAgIHByaXZhdGUgQWN0aW9uIHNvcnRCeUNhdGVnb3J5QWN0aW9uOwotCi0gICAgcHJpdmF0ZSBBY3Rpb24gc29ydEJ5Q29tcGxldGVkQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBBY3Rpb24gc29ydEJ5UHJpb3JpdHlBY3Rpb247Ci0KLSAgICBwcml2YXRlIEFjdGlvbiBzb3J0QnlEZXNjcmlwdGlvbkFjdGlvbjsKLQotICAgIHByaXZhdGUgQWN0aW9uIHNvcnRCeVJlc291cmNlQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBBY3Rpb24gc29ydEJ5Q29udGFpbmVyQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBBY3Rpb24gc29ydEJ5TG9jYXRpb25BY3Rpb247Ci0KLSAgICBwcml2YXRlIEFjdGlvbiBzb3J0QnlDcmVhdGlvblRpbWVBY3Rpb247Ci0KLSAgICBwcml2YXRlIEFjdGlvbiBzb3J0QXNjZW5kaW5nQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBBY3Rpb24gc29ydERlc2NlbmRpbmdBY3Rpb247Ci0KLSAgICBwcml2YXRlIENsaXBib2FyZCBjbGlwYm9hcmQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0YWJsZUNvbHVtblByb3BlcnRpZXMgPSB7Ci0gICAgICAgICAgICBJQmFzaWNQcm9wZXJ0eUNvbnN0YW50cy5QX0lNQUdFLCBJTWFya2VyLkRPTkUsIElNYXJrZXIuUFJJT1JJVFksCi0gICAgICAgICAgICBJTWFya2VyLk1FU1NBR0UsIElNYXJrZXJDb25zdGFudHMuUF9SRVNPVVJDRV9OQU1FLAotICAgICAgICAgICAgSU1hcmtlckNvbnN0YW50cy5QX0NPTlRBSU5FUl9OQU1FLAotICAgICAgICAgICAgSU1hcmtlckNvbnN0YW50cy5QX0xJTkVfQU5EX0xPQ0FUSU9OIH07Ci0KLSAgICAvLyBQZXJzaXN0YW5jZSB0YWdzLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09MVU1OID0gImNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTlVNQkVSID0gIm51bWJlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfV0lEVEggPSAid2lkdGgiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0ZJTFRFUiA9ICJmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NFTEVDVElPTiA9ICJzZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19NQVJLRVIgPSAibWFya2VyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVNPVVJDRSA9ICJyZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVE9QX0lOREVYID0gInRvcEluZGV4IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TT1JUX1NFQ1RJT04gPSAiVGFza0xpc3RTb3J0U3RhdGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBzdGF0aWMgY2xhc3MgVGFza0xpc3RMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzCi0gICAgICAgICAgICBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBrZXlzID0geyBJQmFzaWNQcm9wZXJ0eUNvbnN0YW50cy5QX0lNQUdFLAotICAgICAgICAgICAgICAgIElNYXJrZXJDb25zdGFudHMuUF9DT01QTEVURV9JTUFHRSwKLSAgICAgICAgICAgICAgICBJTWFya2VyQ29uc3RhbnRzLlBfUFJJT1JJVFlfSU1BR0UsIElNYXJrZXIuTUVTU0FHRSwKLSAgICAgICAgICAgICAgICBJTWFya2VyQ29uc3RhbnRzLlBfUkVTT1VSQ0VfTkFNRSwKLSAgICAgICAgICAgICAgICBJTWFya2VyQ29uc3RhbnRzLlBfQ09OVEFJTkVSX05BTUUsCi0gICAgICAgICAgICAgICAgSU1hcmtlckNvbnN0YW50cy5QX0xJTkVfQU5EX0xPQ0FUSU9OIH07Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA+PSAzICYmIGNvbHVtbkluZGV4IDw9IDYpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIE1hcmtlclV0aWwuZ2V0UHJvcGVydHkoZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleXNbY29sdW1uSW5kZXhdKTsKLSAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA+PSAwICYmIGNvbHVtbkluZGV4IDw9IDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEltYWdlKSBNYXJrZXJVdGlsLmdldFByb3BlcnR5KGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXlzW2NvbHVtbkluZGV4XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIFNvcnRCeUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgY29sdW1uOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gY29sdW1uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU29ydEJ5QWN0aW9uKGludCBjb2x1bW4pIHsKLSAgICAgICAgICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgc29ydGVyLnNldFRvcFByaW9yaXR5KGNvbHVtbik7Ci0gICAgICAgICAgICB1cGRhdGVTb3J0aW5nU3RhdGUoKTsKLSAgICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBnZXRQbHVnaW4oKS5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oVEFHX1NPUlRfU0VDVElPTik7Ci0gICAgICAgICAgICBpZiAoc2V0dGluZ3MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzLmFkZE5ld1NlY3Rpb24oVEFHX1NPUlRfU0VDVElPTik7Ci0gICAgICAgICAgICBzb3J0ZXIuc2F2ZVN0YXRlKHNldHRpbmdzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIFNvcnREaXJlY3Rpb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0gICAgICAgIHByaXZhdGUgaW50IGRpcmVjdGlvbjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFNvcnREaXJlY3Rpb25BY3Rpb24oaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBzb3J0ZXIuc2V0VG9wUHJpb3JpdHlEaXJlY3Rpb24oZGlyZWN0aW9uKTsKLSAgICAgICAgICAgIHVwZGF0ZVNvcnRpbmdTdGF0ZSgpOwotICAgICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IGdldFBsdWdpbigpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAuZ2V0U2VjdGlvbihUQUdfU09SVF9TRUNUSU9OKTsKLSAgICAgICAgICAgIGlmIChzZXR0aW5ncyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihUQUdfU09SVF9TRUNUSU9OKTsKLSAgICAgICAgICAgIHNvcnRlci5zYXZlU3RhdGUoc2V0dGluZ3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29sdW1uSGVhZGVyc1tdID0gewotICAgICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9oZWFkZXJJY29uLAotICAgICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9oZWFkZXJDb21wbGV0ZWQsIAotICAgICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9oZWFkZXJQcmlvcml0eSwgCi0gICAgICAgICAgICBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X2hlYWRlckRlc2NyaXB0aW9uLCAKLSAgICAgICAgICAgIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfaGVhZGVyUmVzb3VyY2UsCi0gICAgICAgICAgICBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X2hlYWRlckZvbGRlciwgCi0gICAgICAgICAgICBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X2hlYWRlckxvY2F0aW9uCi0gICAgfTsKLQotICAgIHByaXZhdGUgQ29sdW1uTGF5b3V0RGF0YSBjb2x1bW5MYXlvdXRzW10gPSB7Ci0gICAgICAgICAgICBuZXcgQ29sdW1uUGl4ZWxEYXRhKDE2LCBmYWxzZSwgdHJ1ZSksIG5ldyBDb2x1bW5QaXhlbERhdGEoMTYsIGZhbHNlLCB0cnVlKSwKLSAgICAgICAgICAgIG5ldyBDb2x1bW5QaXhlbERhdGEoMTYsIGZhbHNlLCB0cnVlKSwgbmV3IENvbHVtbldlaWdodERhdGEoMjAwKSwKLSAgICAgICAgICAgIG5ldyBDb2x1bW5XZWlnaHREYXRhKDc1KSwgbmV3IENvbHVtbldlaWdodERhdGEoMTUwKSwKLSAgICAgICAgICAgIG5ldyBDb2x1bW5XZWlnaHREYXRhKDYwKSB9OwotCi0gICAgcHJpdmF0ZSBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9IG5ldyBJUGFydExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgICAgIFRhc2tMaXN0LnRoaXMucGFydEFjdGl2YXRlZChwYXJ0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgICAgICBUYXNrTGlzdC50aGlzLnBhcnRDbG9zZWQocGFydCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGZvY3VzU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBUYXNrTGlzdC50aGlzLmZvY3VzU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VbXSBmb2N1c1Jlc291cmNlczsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZm9jdXNQYXJ0OwotCi0gICAgcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZm9jdXNTZWxlY3Rpb25Qcm92aWRlcjsKLQotICAgIHByaXZhdGUgSUNlbGxNb2RpZmllciBjZWxsTW9kaWZpZXIgPSBuZXcgSUNlbGxNb2RpZmllcigpIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgICAgICByZXR1cm4gTWFya2VyVXRpbC5nZXRQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICAgICAgcmV0dXJuIE1hcmtlclV0aWwuaXNFZGl0YWJsZSgoSU1hcmtlcikgZWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTW9kaWZpZXMgYSBtYXJrZXIgYXMgYSByZXN1bHQgb2YgYSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGRpcmVjdCBlZGl0aW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgSXRlbSBpdGVtID0gKEl0ZW0pIGVsZW1lbnQ7Ci0gICAgICAgICAgICBJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgIHNldFByb3BlcnR5KG1hcmtlciwgcHJvcGVydHksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHRhc2sgbGlzdCB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyBUYXNrTGlzdCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udHJvbAotICAgICAqLwotICAgIHZvaWQgYWRkRHJhZ1N1cHBvcnQoQ29udHJvbCBjb250cm9sKSB7Ci0KLSAgICAgICAgaW50IG9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZOwotICAgICAgICBUcmFuc2ZlcltdIHRyYW5zZmVyVHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7Ci0gICAgICAgICAgICAgICAgTWFya2VyVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwgVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLSAgICAgICAgRHJhZ1NvdXJjZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IERyYWdTb3VyY2VBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybURyYWdTZXREYXRhKGV2ZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQob3BlcmF0aW9ucywgdHJhbnNmZXJUeXBlcywgbGlzdGVuZXIpOwotICAgIH0KLQotICAgIHZvaWQgY2FuY2VsRWRpdGluZygpIHsKLSAgICAgICAgZ2V0VGFibGVWaWV3ZXIoKS5jYW5jZWxFZGl0aW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBjcmVhdGVDb2x1bW5zKCkgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBjbGFzcyBoYW5kbGVzIHNlbGVjdGlvbnMgb2YgdGhlIGNvbHVtbiBoZWFkZXJzLgotICAgICAgICAgKiBTZWxlY3Rpb24gb2YgdGhlIGNvbHVtbiBoZWFkZXIgd2lsbCBjYXVzZSByZXNvcnRpbmcKLSAgICAgICAgICogb2YgdGhlIHNob3duIHRhc2tzIHVzaW5nIHRoYXQgY29sdW1uJ3Mgc29ydGVyLgotICAgICAgICAgKiBSZXBlYXRlZCBzZWxlY3Rpb24gb2YgdGhlIGhlYWRlciB3aWxsIHRvZ2dsZQotICAgICAgICAgKiBzb3J0aW5nIG9yZGVyIChhc2NlbmRpbmcgdmVyc3VzIGRlc2NlbmRpbmcpLgotICAgICAgICAgKi8KLSAgICAgICAgU2VsZWN0aW9uTGlzdGVuZXIgaGVhZGVyTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogSGFuZGxlcyB0aGUgY2FzZSBvZiB1c2VyIHNlbGVjdGluZyB0aGUKLSAgICAgICAgICAgICAqIGhlYWRlciBhcmVhLgotICAgICAgICAgICAgICogPHA+SWYgdGhlIGNvbHVtbiBoYXMgbm90IGJlZW4gc2VsZWN0ZWQgcHJldmlvdXNseSwKLSAgICAgICAgICAgICAqIGl0IHdpbGwgc2V0IHRoZSBzb3J0ZXIgb2YgdGhhdCBjb2x1bW4gdG8gYmUKLSAgICAgICAgICAgICAqIHRoZSBjdXJyZW50IHRhc2tsaXN0IHNvcnRlci4gUmVwZWF0ZWQKLSAgICAgICAgICAgICAqIHByZXNzZXMgb24gdGhlIHNhbWUgY29sdW1uIGhlYWRlciB3aWxsCi0gICAgICAgICAgICAgKiB0b2dnbGUgc29ydGluZyBvcmRlciAoYXNjZW5kaW5nL2Rlc2NlbmRpbmcpLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gY29sdW1uIHNlbGVjdGVkIC0gbmVlZCB0byBzb3J0Ci0gICAgICAgICAgICAgICAgaW50IGNvbHVtbiA9IHRhYmxlLmluZGV4T2YoKFRhYmxlQ29sdW1uKSBlLndpZGdldCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA9PSBzb3J0ZXIuZ2V0VG9wUHJpb3JpdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgc29ydGVyLnJldmVyc2VUb3BQcmlvcml0eSgpOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzb3J0ZXIuc2V0VG9wUHJpb3JpdHkoY29sdW1uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlU29ydGluZ1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBnZXRQbHVnaW4oKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uKFRBR19TT1JUX1NFQ1RJT04pOwotICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE5ld1NlY3Rpb24oVEFHX1NPUlRfU0VDVElPTik7Ci0gICAgICAgICAgICAgICAgc29ydGVyLnNhdmVTdGF0ZShzZXR0aW5ncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgKG1lbWVudG8gIT0gbnVsbCkgewotICAgICAgICAgICAgLy9yZXN0b3JlIGNvbHVtbnMgd2lkdGgKLSAgICAgICAgICAgIElNZW1lbnRvIGNoaWxkcmVuW10gPSBtZW1lbnRvLmdldENoaWxkcmVuKFRBR19DT0xVTU4pOwotICAgICAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEludGVnZXIgdmFsID0gY2hpbGRyZW5baV0uZ2V0SW50ZWdlcihUQUdfTlVNQkVSKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSB2YWwuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGNoaWxkcmVuW2ldLmdldEludGVnZXIoVEFHX1dJRFRIKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkxheW91dHNbaW5kZXhdID0gbmV3IENvbHVtblBpeGVsRGF0YSh2YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRWYWx1ZSgpLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gdGV4dCA9ICJjYXJib24iLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgICAgIHRhYmxlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uSGVhZGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGFibGVDb2x1bW4gdGMgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCBpKTsKLQotICAgICAgICAgICAgaWYgKCF0ZXh0ICYmIGkgPT0gMSkKLSAgICAgICAgICAgICAgICB0Yy5zZXRJbWFnZShNYXJrZXJVdGlsLmdldEltYWdlKCJoZWFkZXJfY29tcGxldGUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGVsc2UgaWYgKCF0ZXh0ICYmIGkgPT0gMikKLSAgICAgICAgICAgICAgICB0Yy5zZXRJbWFnZShNYXJrZXJVdGlsLmdldEltYWdlKCJoZWFkZXJfcHJpb3JpdHkiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0Yy5zZXRUZXh0KGNvbHVtbkhlYWRlcnNbaV0pOwotCi0gICAgICAgICAgICBpZiAodGV4dCAmJiAoaSA9PSAxIHx8IGkgPT0gMikpIHsKLSAgICAgICAgICAgICAgICB0Yy5wYWNrKCk7Ci0gICAgICAgICAgICAgICAgY29sdW1uTGF5b3V0c1tpXSA9IG5ldyBDb2x1bW5QaXhlbERhdGEoTWF0aC5tYXgoMTYsIHRjCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V2lkdGgoKSksIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGMuc2V0UmVzaXphYmxlKGNvbHVtbkxheW91dHNbaV0ucmVzaXphYmxlKTsKLSAgICAgICAgICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbkxheW91dHNbaV0pOwotICAgICAgICAgICAgdGMuYWRkU2VsZWN0aW9uTGlzdGVuZXIoaGVhZGVyTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyB0aGF0IHN1bW1hcml6ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZQotICAgICAqIGdpdmVuIG1hcmtlcnMuCi0gICAgICovCi0gICAgc3RhdGljIFN0cmluZyBjcmVhdGVNYXJrZXJSZXBvcnQoSU1hcmtlcltdIG1hcmtlcnMpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBoZWFkZXIKLSAgICAgICAgYnVmLmFwcGVuZChUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X3JlcG9ydEtpbmQpOwotICAgICAgICBidWYuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9yZXBvcnRTdGF0dXMpOyAKLSAgICAgICAgYnVmLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfcmVwb3J0UHJpb3JpdHkpOyAKLSAgICAgICAgYnVmLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfaGVhZGVyRGVzY3JpcHRpb24pOwotICAgICAgICBidWYuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9oZWFkZXJSZXNvdXJjZSk7IAotICAgICAgICBidWYuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9oZWFkZXJGb2xkZXIpOyAKLSAgICAgICAgYnVmLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfaGVhZGVyTG9jYXRpb24pOyAKLSAgICAgICAgYnVmLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSByZXBvcnQgZm9yIHRoZSBtYXJrZXJzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgd3JpdGVNYXJrZXIoYnVmLCBtYXJrZXJzW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBtYXJrZXIgdG8gdGhlIGJ1ZmZlci4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCB3cml0ZU1hcmtlcihTdHJpbmdCdWZmZXIgYnVmLCBJTWFya2VyIG1hcmtlcikgewotICAgICAgICBidWYuYXBwZW5kKE1hcmtlclV0aWwuZ2V0S2luZFRleHQobWFya2VyKSk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZChNYXJrZXJVdGlsLmdldENvbXBsZXRlVGV4dChtYXJrZXIpKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKE1hcmtlclV0aWwuZ2V0UHJpb3JpdHlUZXh0KG1hcmtlcikpOwotICAgICAgICBidWYuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoTWFya2VyVXRpbC5nZXRNZXNzYWdlKG1hcmtlcikpOwotICAgICAgICBidWYuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoTWFya2VyVXRpbC5nZXRSZXNvdXJjZU5hbWUobWFya2VyKSk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZChNYXJrZXJVdGlsLmdldENvbnRhaW5lck5hbWUobWFya2VyKSk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZChNYXJrZXJVdGlsLmdldExpbmVBbmRMb2NhdGlvbihtYXJrZXIpKTsKLSAgICAgICAgYnVmLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLwotICAgIGJvb2xlYW4gaXNNYXJrZXJMaW1pdEV4Y2VlZGVkKCkgewotICAgICAgICByZXR1cm4gbWFya2VyTGltaXRFeGNlZWRlZDsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovCi0gICAgdm9pZCBzZXRNYXJrZXJMaW1pdEV4Y2VlZGVkKGJvb2xlYW4gbWFya2VyTGltaXRFeGNlZWRlZCkgewotICAgICAgICB0aGlzLm1hcmtlckxpbWl0RXhjZWVkZWQgPSBtYXJrZXJMaW1pdEV4Y2VlZGVkOwotCi0gICAgICAgIGlmIChtYXJrZXJMaW1pdEV4Y2VlZGVkKSB7Ci0gICAgICAgICAgICBzdGFja0xheW91dC50b3BDb250cm9sID0gY29tcG9zaXRlTWFya2VyTGltaXRFeGNlZWRlZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSB0YWJsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcmVudC5sYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hQYXJ0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8JbG9uZyB0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGNyZWF0ZVBhcnRDb250cm9sMChwYXJlbnQpOwotICAgICAgICAvLwl0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OwotICAgICAgICAvLwlTeXN0ZW0ub3V0LnByaW50bG4oIlRhc2tMaXN0LmNyZWF0ZVBhcnRDb250cm9sOiAiICsgdCArICJtcyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbDAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLSAgICAgICAgY3JlYXRlVGFibGUocGFyZW50KTsKLSAgICAgICAgdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLSAgICAgICAgdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0gICAgICAgIGNyZWF0ZUNvbHVtbnMoKTsKLSAgICAgICAgbWFrZUFjdGlvbnMoKTsKLSAgICAgICAgZmlsbEFjdGlvbkJhcnMoKTsKLSAgICAgICAgYWRkRHJhZ1N1cHBvcnQodGFibGUpOwotCi0gICAgICAgIGNvbXBvc2l0ZU1hcmtlckxpbWl0RXhjZWVkZWQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBjb21wb3NpdGVNYXJrZXJMaW1pdEV4Y2VlZGVkLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgTGFiZWwgbGFiZWxNYXJrZXJMaW1pdEV4Y2VlZGVkID0gbmV3IExhYmVsKAotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZU1hcmtlckxpbWl0RXhjZWVkZWQsIFNXVC5XUkFQKTsKLSAgICAgICAgbGFiZWxNYXJrZXJMaW1pdEV4Y2VlZGVkLnNldFRleHQoVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9tYXJrZXJMaW1pdEV4Y2VlZGVkKTsKLSAgICAgICAgcGFyZW50LnNldExheW91dChzdGFja0xheW91dCk7Ci0gICAgICAgIHNldE1hcmtlckxpbWl0RXhjZWVkZWQoZmFsc2UpOwotCi0gICAgICAgIHZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRhc2tMaXN0Q29udGVudFByb3ZpZGVyKHRoaXMpKTsKLSAgICAgICAgdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRhc2tMaXN0TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgaWYgKG1lbWVudG8gIT0gbnVsbCkgewotICAgICAgICAgICAgLy9yZXN0b3JlIGZpbHRlcgotICAgICAgICAgICAgSU1lbWVudG8gZmlsdGVyTWVtID0gbWVtZW50by5nZXRDaGlsZChUQUdfRklMVEVSKTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJNZW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBnZXRGaWx0ZXIoKS5yZXN0b3JlU3RhdGUoZmlsdGVyTWVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNvcnRlciA9IG5ldyBUYXNrU29ydGVyKCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IGdldFBsdWdpbigpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oVEFHX1NPUlRfU0VDVElPTik7Ci0gICAgICAgIHNvcnRlci5yZXN0b3JlU3RhdGUoc2V0dGluZ3MpOwotICAgICAgICB2aWV3ZXIuc2V0U29ydGVyKHNvcnRlcik7Ci0KLSAgICAgICAgLy91cGRhdGUgdGhlIG1lbnUgdG8gaW5kaWNhdGUgaG93IHRhc2sgYXJlIGN1cnJlbnRseSBzb3J0ZWQKLSAgICAgICAgdXBkYXRlU29ydGluZ1N0YXRlKCk7Ci0gICAgICAgIHZpZXdlci5zZXRJbnB1dChnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgICAgICB2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBUYXNrTGlzdC50aGlzLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdmlld2VyLmFkZE9wZW5MaXN0ZW5lcihuZXcgSU9wZW5MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9wZW4oT3BlbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgZ290b1Rhc2tBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlS2V5UHJlc3NlZChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy9BZGQgaW4gc29tZSBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgdG8gc3VwcGxlbWVudCB0aGUgZGVzY3JpcHRpb24gdGhhdCB3ZSBhbHJlYWR5IAotICAgICAgICAvL2dldCBmcm9tIHRoZSBTV1QgdGFibGUuCi0gICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciNnZXRWYWx1ZShvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KQotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGlsZEluZGV4ID0gZS5jaGlsZElEOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA9PSBBQ0MuQ0hJTERJRF9TRUxGKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZ2V0VmFsdWUoZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSB2aWV3ZXIuZ2V0RWxlbWVudEF0KGNoaWxkSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgaXRlbTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgaXQgaXMgZWRpdGFibGUgYWxsIHdlIG5lZWQgaXMgY29tcGxldGVuZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3QgaXMgZm91bmQgYnkgdGhlIHRhYmxlIGFjY2Vzc2liaWxpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWFya2VyVXRpbC5pc0VkaXRhYmxlKG1hcmtlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdWx0ID0gTWFya2VyVXRpbC5nZXRDb21wbGV0ZVRleHQobWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vT3RoZXJ3aXNlIGFsbCBpdCBuZWVkcyBpcyBzZXZlcml0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlc3VsdCA9IE1hcmtlclV0aWwuZ2V0S2luZFRleHQobWFya2VyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5nZXRWYWx1ZShlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgQ2VsbEVkaXRvciBlZGl0b3JzW10gPSBuZXcgQ2VsbEVkaXRvcltjb2x1bW5IZWFkZXJzLmxlbmd0aF07Ci0gICAgICAgIGVkaXRvcnNbMV0gPSBuZXcgQ2hlY2tib3hDZWxsRWRpdG9yKHRhYmxlKTsKLSAgICAgICAgU3RyaW5nW10gcHJpb3JpdGllcyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9oaWdoLCAKLSAgICAgICAgICAgICAgICBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X25vcm1hbCwgCi0gICAgICAgICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9sb3cKLSAgICAgICAgfTsKLSAgICAgICAgZWRpdG9yc1syXSA9IG5ldyBDb21ib0JveENlbGxFZGl0b3IodGFibGUsIHByaW9yaXRpZXMsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBlZGl0b3JzWzNdID0gZGVzY3JpcHRpb25FZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotICAgICAgICB2aWV3ZXIuc2V0Q2VsbEVkaXRvcnMoZWRpdG9ycyk7Ci0gICAgICAgIHZpZXdlci5zZXRDZWxsTW9kaWZpZXIoY2VsbE1vZGlmaWVyKTsKLSAgICAgICAgdmlld2VyLnNldENvbHVtblByb3BlcnRpZXModGFibGVDb2x1bW5Qcm9wZXJ0aWVzKTsKLQotICAgICAgICAvLyBDb25maWd1cmUgdGhlIGNvbnRleHQgbWVudSB0byBiZSBsYXppbHkgcG9wdWxhdGVkIG9uIGVhY2ggcG9wLXVwLgotICAgICAgICBNZW51TWFuYWdlciBtZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wdXBNZW51Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0gICAgICAgIG1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgICAgICAgICAgVGFza0xpc3QudGhpcy5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBNZW51IG1lbnUgPSBtZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KHRhYmxlKTsKLSAgICAgICAgdGFibGUuc2V0TWVudShtZW51KTsKLSAgICAgICAgLy8gQmUgc3VyZSB0byByZWdpc3RlciBpdCBzbyB0aGF0IG90aGVyIHBsdWctaW5zIGNhbiBhZGQgYWN0aW9ucy4KLSAgICAgICAgZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWVudU1nciwgdmlld2VyKTsKLQotICAgICAgICAvLyBUcmFjayBzZWxlY3Rpb24gaW4gdGhlIHBhZ2UuCi0gICAgICAgIGdldFNpdGUoKS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0KLSAgICAgICAgLy8gQWRkIGdsb2JhbCBhY3Rpb24gaGFuZGxlcnMuCi0gICAgICAgIGVkaXRvckFjdGlvbkhhbmRsZXIgPSBuZXcgQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIoZ2V0Vmlld1NpdGUoKQotICAgICAgICAgICAgICAgIC5nZXRBY3Rpb25CYXJzKCkpOwotICAgICAgICBlZGl0b3JBY3Rpb25IYW5kbGVyLmFkZENlbGxFZGl0b3IoZGVzY3JpcHRpb25FZGl0b3IpOwotICAgICAgICBlZGl0b3JBY3Rpb25IYW5kbGVyLnNldENvcHlBY3Rpb24oY29weVRhc2tBY3Rpb24pOwotICAgICAgICBlZGl0b3JBY3Rpb25IYW5kbGVyLnNldFBhc3RlQWN0aW9uKHBhc3RlVGFza0FjdGlvbik7Ci0gICAgICAgIGVkaXRvckFjdGlvbkhhbmRsZXIuc2V0RGVsZXRlQWN0aW9uKHJlbW92ZVRhc2tBY3Rpb24pOwotICAgICAgICBlZGl0b3JBY3Rpb25IYW5kbGVyLnNldFNlbGVjdEFsbEFjdGlvbihzZWxlY3RBbGxBY3Rpb24pOwotCi0gICAgICAgIGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0gICAgICAgICAgICAgICAgQWN0aW9uRmFjdG9yeS5QUk9QRVJUSUVTLmdldElkKCksIHByb3BlcnRpZXNBY3Rpb24pOwotCi0gICAgICAgIGdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpOwotCi0gICAgICAgIGlmIChtZW1lbnRvICE9IG51bGwpCi0gICAgICAgICAgICByZXN0b3JlU3RhdGUobWVtZW50byk7Ci0gICAgICAgIG1lbWVudG8gPSBudWxsOwotCi0gICAgICAgIC8vIFNldCBoZWxwIG9uIHRoZSB2aWV3IGl0c2VsZgotICAgICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLmFkZEhlbHBMaXN0ZW5lcihuZXcgSGVscExpc3RlbmVyKCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEBzZWUgSGVscExpc3RlbmVyI2hlbHBSZXF1ZXN0ZWQoSGVscEV2ZW50KQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoZWxwUmVxdWVzdGVkKEhlbHBFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRJZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgY29udGV4dCByZWdpc3RlcmVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICBJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAobWFya2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dElkID0gSURFLmdldE1hcmtlckhlbHBSZWdpc3RyeSgpLmdldEhlbHAobWFya2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dElkID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHRJZCA9IElUYXNrTGlzdEhlbHBDb250ZXh0SWRzLlRBU0tfTElTVF9WSUVXOwotCi0gICAgICAgICAgICAgICAgZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkJLmRpc3BsYXlIZWxwKGNvbnRleHRJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIFByaW1lIHRoZSBzdGF0dXMgbGluZSBhbmQgdGl0bGUuCi0gICAgICAgIHVwZGF0ZVN0YXR1c01lc3NhZ2UoKTsKLSAgICAgICAgdXBkYXRlVGl0bGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB0YWJsZSBjb250cm9sLgotICAgICAqLwotICAgIHZvaWQgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5NVUxUSQotICAgICAgICAgICAgICAgIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICAvL3RhYmxlLnNldExheW91dChuZXcgVGFibGVMYXlvdXQoKSk7Ci0KLSAgICAgICAgbmV3IFRhYmxlRWRpdG9yKHRhYmxlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hQYXJ0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLSAgICAgICAgaWYgKGZvY3VzU2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9jdXNTZWxlY3Rpb25Qcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZvY3VzU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLSAgICAgICAgICAgIGZvY3VzU2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZvY3VzUGFydCA9IG51bGw7Ci0gICAgICAgIGlmIChlZGl0b3JBY3Rpb25IYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVkaXRvckFjdGlvbkhhbmRsZXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgZWRpdG9yQWN0aW9uSGFuZGxlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsaXBib2FyZCAhPSBudWxsKQotICAgICAgICAgICAgY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY3RpdmF0ZXMgdGhlIGVkaXRvciBvbiB0aGUgZ2l2ZW4gbWFya2VyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXJrZXIgdGhlIG1hcmtlciB0byBlZGl0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZWRpdChJTWFya2VyIG1hcmtlcikgewotICAgICAgICB2aWV3ZXIuZWRpdEVsZW1lbnQobWFya2VyLCAzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxscyB0aGUgbG9jYWwgdG9vbCBiYXIgYW5kIG1lbnUgbWFuYWdlciB3aXRoIGFjdGlvbnMuCi0gICAgICovCi0gICAgdm9pZCBmaWxsQWN0aW9uQmFycygpIHsKLSAgICAgICAgSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotICAgICAgICBJTWVudU1hbmFnZXIgbWVudSA9IGFjdGlvbkJhcnMuZ2V0TWVudU1hbmFnZXIoKTsKLSAgICAgICAgSU1lbnVNYW5hZ2VyIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoVGFza0xpc3RNZXNzYWdlcy5Tb3J0QnlNZW51X3RleHQpOwotCi0gICAgICAgIG1lbnUuYWRkKHN1Ym1lbnUpOwotICAgICAgICBzdWJtZW51LmFkZChzb3J0QnlDYXRlZ29yeUFjdGlvbik7Ci0gICAgICAgIHN1Ym1lbnUuYWRkKHNvcnRCeUNvbXBsZXRlZEFjdGlvbik7Ci0gICAgICAgIHN1Ym1lbnUuYWRkKHNvcnRCeVByaW9yaXR5QWN0aW9uKTsKLSAgICAgICAgc3VibWVudS5hZGQoc29ydEJ5RGVzY3JpcHRpb25BY3Rpb24pOwotICAgICAgICBzdWJtZW51LmFkZChzb3J0QnlSZXNvdXJjZUFjdGlvbik7Ci0gICAgICAgIHN1Ym1lbnUuYWRkKHNvcnRCeUNvbnRhaW5lckFjdGlvbik7Ci0gICAgICAgIHN1Ym1lbnUuYWRkKHNvcnRCeUxvY2F0aW9uQWN0aW9uKTsKLSAgICAgICAgc3VibWVudS5hZGQoc29ydEJ5Q3JlYXRpb25UaW1lQWN0aW9uKTsKLSAgICAgICAgc3VibWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgc3VibWVudS5hZGQoc29ydEFzY2VuZGluZ0FjdGlvbik7Ci0gICAgICAgIHN1Ym1lbnUuYWRkKHNvcnREZXNjZW5kaW5nQWN0aW9uKTsKLQotICAgICAgICBtZW51LmFkZChmaWx0ZXJzQWN0aW9uKTsKLQotICAgICAgICBJVG9vbEJhck1hbmFnZXIgdG9vbEJhciA9IGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLSAgICAgICAgdG9vbEJhci5hZGQobmV3VGFza0FjdGlvbik7Ci0gICAgICAgIHRvb2xCYXIuYWRkKHJlbW92ZVRhc2tBY3Rpb24pOwotICAgICAgICB0b29sQmFyLmFkZChmaWx0ZXJzQWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb250cmlidXRlcyBhY3Rpb25zIHRvIHRoZSBwb3AtdXAgbWVudS4KLSAgICAgKi8KLSAgICB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotICAgICAgICAvLyB1cGRhdGUgZW5hYmxlZCBzdGF0ZSBmb3IgYWN0aW9ucyB0aGF0IGFyZW4ndCB1cGRhdGVkIGluIHNlbGVjdGlvbkNoYW5nZWQKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgbWFya0NvbXBsZXRlZEFjdGlvbi5zZXRFbmFibGVkKG1hcmtDb21wbGV0ZWRBY3Rpb24KLSAgICAgICAgICAgICAgICAuc2hvdWxkRW5hYmxlKHNlbGVjdGlvbikpOwotICAgICAgICByZXNvbHZlTWFya2VyQWN0aW9uLnNldEVuYWJsZWQocmVzb2x2ZU1hcmtlckFjdGlvbgotICAgICAgICAgICAgICAgIC5zaG91bGRFbmFibGUoc2VsZWN0aW9uKSk7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBhY3Rpb25zIHRvIHRoZSBtZW51Ci0gICAgICAgIG1lbnUuYWRkKG5ld1Rhc2tBY3Rpb24pOwotICAgICAgICBtZW51LmFkZChnb3RvVGFza0FjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIG1lbnUuYWRkKGNvcHlUYXNrQWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQocGFzdGVUYXNrQWN0aW9uKTsKLSAgICAgICAgbWVudS5hZGQocmVtb3ZlVGFza0FjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIG1lbnUuYWRkKG1hcmtDb21wbGV0ZWRBY3Rpb24pOwotICAgICAgICBtZW51LmFkZChwdXJnZUNvbXBsZXRlZEFjdGlvbik7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIG1lbnUuYWRkKHJlc29sdmVNYXJrZXJBY3Rpb24pOwotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0gICAgICAgIG1lbnUKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIi1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbWVudS5hZGQocHJvcGVydGllc0FjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbHRlciBzZXR0aW5ncyBoYXZlIGNoYW5nZWQuCi0gICAgICogUmVmcmVzaGVzIHRoZSB2aWV3ZXIgYW5kIHRpdGxlIGJhci4KLSAgICAgKi8KLSAgICB2b2lkIGZpbHRlckNoYW5nZWQoKSB7Ci0KLSAgICAgICAgQnVzeUluZGljYXRvci5zaG93V2hpbGUodmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwKLSAgICAgICAgICAgICAgICBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbHRlciBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWQgYnkgZGlhbG9nOyBqdXN0IHJlZnJlc2guCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBuZWVkIHRvIHVwZGF0ZSBsYWJlbHMgZm9yIGV4aXN0aW5nIGVsZW1lbnRzIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgY2hhbmdlcyB0byBmaWx0ZXIgc2V0dGluZ3MgZG9uJ3QgYWZmZWN0IHRoZW0uCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXIucmVmcmVzaChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBhZnRlciByZWZyZXNoIHNpbmNlIHRoZSBjb250ZW50IHByb3ZpZGVyIGNhY2hlcyBzdW1tYXJ5IGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c01lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLQotICAgIH0KLQotICAgIHZvaWQgZm9jdXNTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICB1cGRhdGVGb2N1c1Jlc291cmNlKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKENsYXNzKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChhZGFwdGVyID09IElTaG93SW5Tb3VyY2UuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSVNob3dJblNvdXJjZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgU2hvd0luQ29udGV4dCBnZXRTaG93SW5Db250ZXh0KCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNob3dJbkNvbnRleHQobnVsbCwgZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFkYXB0ZXIgPT0gSVNob3dJblRhcmdldExpc3QuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSVNob3dJblRhcmdldExpc3QoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFNob3dJblRhcmdldElkcygpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IElQYWdlTGF5b3V0LklEX1JFU19OQVYgfTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNsaXBib2FyZCBmb3IgY3V0L2NvcHkvcGFzdGUgYWN0aW9ucy4KLSAgICAgKiA8cD4KLSAgICAgKiBNYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhpcyBwYXJ0J3Mgdmlld2VyIGhhcyBiZWVuIGNyZWF0ZWQuCi0gICAgICogVGhlIGNsaXBib2FyZCBpcyBkaXNwb3NlZCB3aGVuIHRoaXMgcGFydCBpcyBkaXNwb3NlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogQHJldHVybiBhIGNsaXBib2FyZAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICAvKnBhY2thZ2UqLwotICAgIENsaXBib2FyZCBnZXRDbGlwYm9hcmQoKSB7Ci0gICAgICAgIHJldHVybiBjbGlwYm9hcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsdGVyIGZvciB0aGUgdmlld2VyLgotICAgICAqLwotICAgIFRhc2tzRmlsdGVyIGdldEZpbHRlcigpIHsKLSAgICAgICAgcmV0dXJuIGZpbHRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVSSBwbHVnaW4gZm9yIHRoZSB0YXNrIGxpc3QuCi0gICAgICovCi0gICAgc3RhdGljIEFic3RyYWN0VUlQbHVnaW4gZ2V0UGx1Z2luKCkgewotICAgICAgICByZXR1cm4gKEFic3RyYWN0VUlQbHVnaW4pIFBsYXRmb3JtLmdldFBsdWdpbihQbGF0Zm9ybVVJLlBMVUdJTl9JRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgZm9yIHdoaWNoIHRoZSB0YXNrIGxpc3QgaXMgc2hvd2luZyB0YXNrcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlLCBwb3NzaWJseSB0aGUgd29ya3NwYWNlIHJvb3QKLSAgICAgKi8KLSAgICBwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotICAgICAgICBpZiAoc2hvd1NlbGVjdGlvbnMoKSkgewotICAgICAgICAgICAgaWYgKGZvY3VzUmVzb3VyY2VzICE9IG51bGwgJiYgZm9jdXNSZXNvdXJjZXMubGVuZ3RoID49IDEKLSAgICAgICAgICAgICAgICAgICAgJiYgZm9jdXNSZXNvdXJjZXNbMF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c1Jlc291cmNlc1swXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSByZXNvdXJjZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVzb3VyY2VzCi0gICAgICovCi0gICAgcHVibGljIElSZXNvdXJjZVtdIGdldFJlc291cmNlcygpIHsKLSAgICAgICAgaWYgKHNob3dTZWxlY3Rpb25zKCkpIHsKLSAgICAgICAgICAgIGlmIChmb2N1c1Jlc291cmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzUmVzb3VyY2VzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBJUmVzb3VyY2VbXSB7IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGRlcHRoIHdoaWNoIHRoZSB0YXNrIGxpc3QgaXMgdXNpbmcgdG8gc2hvdyB0YXNrcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+SVJlc291cmNlLkRFUFRIXyo8L2NvZGU+IGNvbnN0YW50Ci0gICAgICovCi0gICAgaW50IGdldFJlc291cmNlRGVwdGgoKSB7Ci0gICAgICAgIGlmIChzaG93U2VsZWN0aW9ucygpICYmICFzaG93Q2hpbGRyZW5IaWVyYXJjaHkoKSkKLSAgICAgICAgICAgIHJldHVybiBJUmVzb3VyY2UuREVQVEhfWkVSTzsKLQotICAgICAgICByZXR1cm4gSVJlc291cmNlLkRFUFRIX0lORklOSVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFQSSBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAoZWxlbWVudCB0eXBlOiA8Y29kZT5JTWFya2VyPC9jb2RlPikKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U3RhdHVzTWVzc2FnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgcmV0dXJuIE1hcmtlclV0aWwuZ2V0TWVzc2FnZShtYXJrZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVGFza0xpc3RDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSAoVGFza0xpc3RDb250ZW50UHJvdmlkZXIpIHZpZXdlcgotICAgICAgICAgICAgICAgIC5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQotICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5nZXRTdGF0dXNTdW1tYXJ5U2VsZWN0ZWQoc2VsZWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0U3RhdHVzU3VtbWFyeVZpc2libGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGNyZWF0ZWQsIG5ldyB0YXNrIGluc3RhbmNlIGlzIGNhY2hlZCBpbgotICAgICAqIG9yZGVyIHRvIGtlZXAgaXQgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdCB1bnRpbAotICAgICAqIGZpcnN0IGVkaXRlZC4gVGhpcyBtZXRob2QgcmV0dXJucyBpdCwgb3IKLSAgICAgKiBudWxsIGlmIHRoZXJlIGlzIG5vIHRhc2sgaW5zdGFuY2UgcGVuZGluZwotICAgICAqIGZvciBmaXJzdCBlZGl0aW5nLgotICAgICAqLwotICAgIFRhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewotICAgICAgICByZXR1cm4gdmlld2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdvcmtzcGFjZS4KLSAgICAgKi8KLSAgICBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIGtleSBldmVudHMgaW4gdmlld2VyLgotICAgICAqLwotICAgIHZvaWQgaGFuZGxlS2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5ERUwgJiYgZXZlbnQuc3RhdGVNYXNrID09IDAKLSAgICAgICAgICAgICAgICAmJiByZW1vdmVUYXNrQWN0aW9uLmlzRW5hYmxlZCgpKQotICAgICAgICAgICAgcmVtb3ZlVGFza0FjdGlvbi5ydW4oKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElWaWV3UGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlLCBJTWVtZW50byBtZW1lbnRvKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBzdXBlci5pbml0KHNpdGUsIG1lbWVudG8pOwotICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBtYXJrZXJzIG9uIHRoZSBnaXZlbiByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGNoZWNrUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIGlmICghc2hvd1NlbGVjdGlvbnMoKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlMjsKLQotICAgICAgICBpZiAoc2hvd093bmVyUHJvamVjdCgpKSB7Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0OwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbCA9IHJlc291cmNlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZTIgPSByZXNvdXJjZXNbaV07Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByb2plY3QgPSByZXNvdXJjZTIuZ2V0UHJvamVjdCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcHJvamVjdC5lcXVhbHMocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2hvd0NoaWxkcmVuSGllcmFyY2h5KCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBsID0gcmVzb3VyY2VzLmxlbmd0aDsgaSA8IGw7IGkrKykgewotICAgICAgICAgICAgICAgIHJlc291cmNlMiA9IHJlc291cmNlc1tpXTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZTIgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzb3VyY2UyLmdldEZ1bGxQYXRoKCkuaXNQcmVmaXhPZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBsID0gcmVzb3VyY2VzLmxlbmd0aDsgaSA8IGw7IGkrKykgewotICAgICAgICAgICAgICAgIHJlc291cmNlMiA9IHJlc291cmNlc1tpXTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5lcXVhbHMocmVzb3VyY2UyKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbWFya2VyIHNob3VsZCBiZSBzaG93biwKLSAgICAgKiBnaXZlbiB0aGUgY3VycmVudCBmaWx0ZXIgc2V0dGluZ3MuCi0gICAgICovCi0gICAgYm9vbGVhbiBzaG91bGRTaG93KElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIHJldHVybiBjaGVja1Jlc291cmNlKG1hcmtlci5nZXRSZXNvdXJjZSgpKQotICAgICAgICAgICAgICAgICYmIGdldEZpbHRlcigpLnNlbGVjdChtYXJrZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2VzIGFjdGlvbnMgdXNlZCBpbiB0aGUgbG9jYWwgdG9vbCBiYXIgYW5kCi0gICAgICogcG9wdXAgbWVudS4KLSAgICAgKi8KLSAgICB2b2lkIG1ha2VBY3Rpb25zKCkgewotICAgICAgICBJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0KLSAgICAgICAgLy8gZ290bwotICAgICAgICBnb3RvVGFza0FjdGlvbiA9IG5ldyBHb3RvVGFza0FjdGlvbih0aGlzLCAiZ290b0ZpbGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBnb3RvVGFza0FjdGlvbi5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuR290b1Rhc2tfdGV4dCk7IAotICAgICAgICBnb3RvVGFza0FjdGlvbi5zZXRUb29sVGlwVGV4dChUYXNrTGlzdE1lc3NhZ2VzLkdvdG9UYXNrX3Rvb2x0aXApOyAKLSAgICAgICAgZ290b1Rhc2tBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKE1hcmtlclV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJnb3Rvb2JqIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGdvdG9UYXNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIC8vIG5ldyB0YXNrCi0gICAgICAgIG5ld1Rhc2tBY3Rpb24gPSBuZXcgTmV3VGFza0FjdGlvbih0aGlzLCAibmV3VGFzayIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG5ld1Rhc2tBY3Rpb24uc2V0VGV4dChUYXNrTGlzdE1lc3NhZ2VzLk5ld1Rhc2tfdGV4dCk7IAotICAgICAgICBuZXdUYXNrQWN0aW9uLnNldFRvb2xUaXBUZXh0KFRhc2tMaXN0TWVzc2FnZXMuTmV3VGFza190b29sdGlwKTsKLSAgICAgICAgbmV3VGFza0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoTWFya2VyVXRpbAotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoImFkZHRzayIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBuZXdUYXNrQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKE1hcmtlclV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJhZGR0c2tfZGlzYWJsZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyBjb3B5IHRhc2sKLSAgICAgICAgY29weVRhc2tBY3Rpb24gPSBuZXcgQ29weVRhc2tBY3Rpb24odGhpcywgImNvcHkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb3B5VGFza0FjdGlvbi5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuQ29weVRhc2tfdGV4dCk7IAotICAgICAgICBjb3B5VGFza0FjdGlvbi5zZXRUb29sVGlwVGV4dChUYXNrTGlzdE1lc3NhZ2VzLkNvcHlUYXNrX3Rvb2x0aXApOwotICAgICAgICBjb3B5VGFza0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAvLyBwYXN0ZSB0YXNrCi0gICAgICAgIHBhc3RlVGFza0FjdGlvbiA9IG5ldyBQYXN0ZVRhc2tBY3Rpb24odGhpcywgInBhc3RlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcGFzdGVUYXNrQWN0aW9uLnNldFRleHQoVGFza0xpc3RNZXNzYWdlcy5QYXN0ZVRhc2tfdGV4dCk7IAotICAgICAgICBwYXN0ZVRhc2tBY3Rpb24uc2V0VG9vbFRpcFRleHQoVGFza0xpc3RNZXNzYWdlcy5QYXN0ZVRhc2tfdG9vbHRpcCk7Ci0gICAgICAgIHBhc3RlVGFza0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAvLyByZW1vdmUgdGFzawotICAgICAgICByZW1vdmVUYXNrQWN0aW9uID0gbmV3IFJlbW92ZVRhc2tBY3Rpb24odGhpcywgImRlbGV0ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJlbW92ZVRhc2tBY3Rpb24uc2V0VGV4dChUYXNrTGlzdE1lc3NhZ2VzLlJlbW92ZVRhc2tfdGV4dCk7Ci0gICAgICAgIHJlbW92ZVRhc2tBY3Rpb24uc2V0VG9vbFRpcFRleHQoVGFza0xpc3RNZXNzYWdlcy5SZW1vdmVUYXNrX3Rvb2x0aXApOyAKLSAgICAgICAgcmVtb3ZlVGFza0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSkpOwotICAgICAgICByZW1vdmVUYXNrQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEVfRElTQUJMRUQpKTsKLSAgICAgICAgcmVtb3ZlVGFza0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAvL21hcmsgY29tcGxldGVkIHRhc2sKLSAgICAgICAgbWFya0NvbXBsZXRlZEFjdGlvbiA9IG5ldyBNYXJrQ29tcGxldGVkQWN0aW9uKHRoaXMsICJtYXJrQ29tcGxldGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbWFya0NvbXBsZXRlZEFjdGlvbi5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuTWFya0NvbXBsZXRlZF90ZXh0KTsKLSAgICAgICAgbWFya0NvbXBsZXRlZEFjdGlvbi5zZXRUb29sVGlwVGV4dChUYXNrTGlzdE1lc3NhZ2VzLk1hcmtDb21wbGV0ZWRfdG9vbHRpcCk7Ci0gICAgICAgIG1hcmtDb21wbGV0ZWRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgLy9kZWxldGUgY29tcGxldGVkIHRhc2sKLSAgICAgICAgcHVyZ2VDb21wbGV0ZWRBY3Rpb24gPSBuZXcgUHVyZ2VDb21wbGV0ZWRBY3Rpb24odGhpcywgImRlbGV0ZUNvbXBsZXRlZCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHB1cmdlQ29tcGxldGVkQWN0aW9uLnNldFRleHQoVGFza0xpc3RNZXNzYWdlcy5QdXJnZUNvbXBsZXRlZF90ZXh0KTsKLSAgICAgICAgcHVyZ2VDb21wbGV0ZWRBY3Rpb24uc2V0VG9vbFRpcFRleHQoVGFza0xpc3RNZXNzYWdlcy5QdXJnZUNvbXBsZXRlZF90b29sdGlwKTsgCi0gICAgICAgIHB1cmdlQ29tcGxldGVkQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0gICAgICAgIHB1cmdlQ29tcGxldGVkQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLSAgICAgICAgLy8gc2VsZWN0IGFsbAotICAgICAgICBzZWxlY3RBbGxBY3Rpb24gPSBuZXcgU2VsZWN0QWxsVGFza3NBY3Rpb24odGhpcywgInNlbGVjdEFsbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNlbGVjdEFsbEFjdGlvbi5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuU2VsZWN0QWxsX3RleHQpOyAKLSAgICAgICAgc2VsZWN0QWxsQWN0aW9uLnNldFRvb2xUaXBUZXh0KFRhc2tMaXN0TWVzc2FnZXMuU2VsZWN0QWxsX3Rvb2x0aXApOwotCi0gICAgICAgIC8vIHJlc29sdXRpb25zCi0gICAgICAgIHJlc29sdmVNYXJrZXJBY3Rpb24gPSBuZXcgUmVzb2x2ZU1hcmtlckFjdGlvbih0aGlzLCAicmVzb2x2ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJlc29sdmVNYXJrZXJBY3Rpb24uc2V0VGV4dChUYXNrTGlzdE1lc3NhZ2VzLlJlc29sdmVfdGV4dCk7IAotICAgICAgICByZXNvbHZlTWFya2VyQWN0aW9uLnNldFRvb2xUaXBUZXh0KFRhc2tMaXN0TWVzc2FnZXMuUmVzb2x2ZV90b29sdGlwKTsKLSAgICAgICAgcmVzb2x2ZU1hcmtlckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAvLyBTb3J0IGJ5IC0+CQotICAgICAgICBzb3J0QnlDYXRlZ29yeUFjdGlvbiA9IG5ldyBTb3J0QnlBY3Rpb24oVGFza1NvcnRlci5UWVBFKTsKLSAgICAgICAgc29ydEJ5Q2F0ZWdvcnlBY3Rpb24uc2V0VGV4dChUYXNrTGlzdE1lc3NhZ2VzLlNvcnRCeUNhdGVnb3J5X3RleHQpOwotICAgICAgICBzb3J0QnlDYXRlZ29yeUFjdGlvbi5zZXRUb29sVGlwVGV4dChUYXNrTGlzdE1lc3NhZ2VzLlNvcnRCeUNhdGVnb3J5X3Rvb2x0aXApOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNvcnRCeUNhdGVnb3J5QWN0aW9uLAotCQkJCUlUYXNrTGlzdEhlbHBDb250ZXh0SWRzLlRBU0tfU09SVF9UWVBFX0FDVElPTik7Ci0KLSAgICAgICAgc29ydEJ5Q29tcGxldGVkQWN0aW9uID0gbmV3IFNvcnRCeUFjdGlvbihUYXNrU29ydGVyLkNPTVBMRVRJT04pOwotICAgICAgICBzb3J0QnlDb21wbGV0ZWRBY3Rpb24uc2V0VGV4dChUYXNrTGlzdE1lc3NhZ2VzLlNvcnRCeUNvbXBsZXRlZF90ZXh0KTsKLSAgICAgICAgc29ydEJ5Q29tcGxldGVkQWN0aW9uLnNldFRvb2xUaXBUZXh0KFRhc2tMaXN0TWVzc2FnZXMuU29ydEJ5Q29tcGxldGVkX3Rvb2x0aXApOyAKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQlzb3J0QnlDb21wbGV0ZWRBY3Rpb24sCi0JCQkJSVRhc2tMaXN0SGVscENvbnRleHRJZHMuVEFTS19TT1JUX0NPTVBMRVRFRF9BQ1RJT04pOwotCi0gICAgICAgIHNvcnRCeVByaW9yaXR5QWN0aW9uID0gbmV3IFNvcnRCeUFjdGlvbihUYXNrU29ydGVyLlBSSU9SSVRZKTsKLSAgICAgICAgc29ydEJ5UHJpb3JpdHlBY3Rpb24uc2V0VGV4dChUYXNrTGlzdE1lc3NhZ2VzLlNvcnRCeVByaW9yaXR5X3RleHQpOyAKLSAgICAgICAgc29ydEJ5UHJpb3JpdHlBY3Rpb24uc2V0VG9vbFRpcFRleHQoVGFza0xpc3RNZXNzYWdlcy5Tb3J0QnlQcmlvcml0eV90b29sdGlwKTsgCi0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc29ydEJ5UHJpb3JpdHlBY3Rpb24sCi0JCQkJSVRhc2tMaXN0SGVscENvbnRleHRJZHMuVEFTS19TT1JUX1BSSU9SSVRZX0FDVElPTik7Ci0KLSAgICAgICAgc29ydEJ5RGVzY3JpcHRpb25BY3Rpb24gPSBuZXcgU29ydEJ5QWN0aW9uKFRhc2tTb3J0ZXIuREVTQ1JJUFRJT04pOwotICAgICAgICBzb3J0QnlEZXNjcmlwdGlvbkFjdGlvbi5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuU29ydEJ5RGVzY3JpcHRpb25fdGV4dCk7IAotICAgICAgICBzb3J0QnlEZXNjcmlwdGlvbkFjdGlvbi5zZXRUb29sVGlwVGV4dChUYXNrTGlzdE1lc3NhZ2VzLlNvcnRCeURlc2NyaXB0aW9uX3Rvb2x0aXApOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAotCQkJCXNvcnRCeURlc2NyaXB0aW9uQWN0aW9uLAotCQkJCUlUYXNrTGlzdEhlbHBDb250ZXh0SWRzLlRBU0tfU09SVF9ERVNDUklQVElPTl9BQ1RJT04pOwotCi0gICAgICAgIHNvcnRCeVJlc291cmNlQWN0aW9uID0gbmV3IFNvcnRCeUFjdGlvbihUYXNrU29ydGVyLlJFU09VUkNFKTsKLSAgICAgICAgc29ydEJ5UmVzb3VyY2VBY3Rpb24uc2V0VGV4dChUYXNrTGlzdE1lc3NhZ2VzLlNvcnRCeVJlc291cmNlX3RleHQpOwotICAgICAgICBzb3J0QnlSZXNvdXJjZUFjdGlvbi5zZXRUb29sVGlwVGV4dChUYXNrTGlzdE1lc3NhZ2VzLlNvcnRCeVJlc291cmNlX3Rvb2x0aXApOyAKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzb3J0QnlSZXNvdXJjZUFjdGlvbiwKLQkJCQlJVGFza0xpc3RIZWxwQ29udGV4dElkcy5UQVNLX1NPUlRfUkVTT1VSQ0VfQUNUSU9OKTsKLQotICAgICAgICBzb3J0QnlDb250YWluZXJBY3Rpb24gPSBuZXcgU29ydEJ5QWN0aW9uKFRhc2tTb3J0ZXIuRk9MREVSKTsKLSAgICAgICAgc29ydEJ5Q29udGFpbmVyQWN0aW9uLnNldFRleHQoVGFza0xpc3RNZXNzYWdlcy5Tb3J0QnlDb250YWluZXJfdGV4dCk7IAotICAgICAgICBzb3J0QnlDb250YWluZXJBY3Rpb24uc2V0VG9vbFRpcFRleHQoVGFza0xpc3RNZXNzYWdlcy5Tb3J0QnlDb250YWluZXJfdG9vbHRpcCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJc29ydEJ5Q29udGFpbmVyQWN0aW9uLAotCQkJCUlUYXNrTGlzdEhlbHBDb250ZXh0SWRzLlRBU0tfU09SVF9GT0xERVJfQUNUSU9OKTsKLQotICAgICAgICBzb3J0QnlMb2NhdGlvbkFjdGlvbiA9IG5ldyBTb3J0QnlBY3Rpb24oVGFza1NvcnRlci5MT0NBVElPTik7Ci0gICAgICAgIHNvcnRCeUxvY2F0aW9uQWN0aW9uLnNldFRleHQoVGFza0xpc3RNZXNzYWdlcy5Tb3J0QnlMb2NhdGlvbl90ZXh0KTsgCi0gICAgICAgIHNvcnRCeUxvY2F0aW9uQWN0aW9uLnNldFRvb2xUaXBUZXh0KFRhc2tMaXN0TWVzc2FnZXMuU29ydEJ5TG9jYXRpb25fdG9vbHRpcCk7IAotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNvcnRCeUxvY2F0aW9uQWN0aW9uLAotCQkJCUlUYXNrTGlzdEhlbHBDb250ZXh0SWRzLlRBU0tfU09SVF9MT0NBVElPTl9BQ1RJT04pOwotCi0gICAgICAgIHNvcnRCeUNyZWF0aW9uVGltZUFjdGlvbiA9IG5ldyBTb3J0QnlBY3Rpb24oVGFza1NvcnRlci5DUkVBVElPTl9USU1FKTsKLSAgICAgICAgc29ydEJ5Q3JlYXRpb25UaW1lQWN0aW9uLnNldFRleHQoVGFza0xpc3RNZXNzYWdlcy5Tb3J0QnlDcmVhdGlvblRpbWVfdGV4dCk7Ci0gICAgICAgIHNvcnRCeUNyZWF0aW9uVGltZUFjdGlvbi5zZXRUb29sVGlwVGV4dChUYXNrTGlzdE1lc3NhZ2VzLlNvcnRCeUNyZWF0aW9uVGltZV90b29sdGlwKTsgCi0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJc29ydEJ5Q3JlYXRpb25UaW1lQWN0aW9uLAotCQkJCUlUYXNrTGlzdEhlbHBDb250ZXh0SWRzLlRBU0tfU09SVF9DUkVBVElPTl9USU1FX0FDVElPTik7Ci0KLSAgICAgICAgc29ydEFzY2VuZGluZ0FjdGlvbiA9IG5ldyBTb3J0RGlyZWN0aW9uQWN0aW9uKFRhc2tTb3J0ZXIuQVNDRU5ESU5HKTsKLSAgICAgICAgc29ydEFzY2VuZGluZ0FjdGlvbi5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuU29ydEFzY2VuZGluZ190ZXh0KTsKLSAgICAgICAgc29ydEFzY2VuZGluZ0FjdGlvbi5zZXRUb29sVGlwVGV4dChUYXNrTGlzdE1lc3NhZ2VzLlNvcnRBc2NlbmRpbmdfdG9vbHRpcCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc29ydEFzY2VuZGluZ0FjdGlvbiwKLQkJCQlJVGFza0xpc3RIZWxwQ29udGV4dElkcy5UQVNLX1NPUlRfQVNDRU5ESU5HX0FDVElPTik7Ci0KLSAgICAgICAgc29ydERlc2NlbmRpbmdBY3Rpb24gPSBuZXcgU29ydERpcmVjdGlvbkFjdGlvbihUYXNrU29ydGVyLkRFU0NFTkRJTkcpOwotICAgICAgICBzb3J0RGVzY2VuZGluZ0FjdGlvbi5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuU29ydERlc2NlbmRpbmdfdGV4dCk7Ci0gICAgICAgIHNvcnREZXNjZW5kaW5nQWN0aW9uLnNldFRvb2xUaXBUZXh0KFRhc2tMaXN0TWVzc2FnZXMuU29ydERlc2NlbmRpbmdfdG9vbHRpcCk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc29ydERlc2NlbmRpbmdBY3Rpb24sCi0JCQkJSVRhc2tMaXN0SGVscENvbnRleHRJZHMuVEFTS19TT1JUX0RFU0NFTkRJTkdfQUNUSU9OKTsKLQotICAgICAgICAvLyBmaWx0ZXJzLi4uCi0gICAgICAgIGZpbHRlcnNBY3Rpb24gPSBuZXcgRmlsdGVyc0FjdGlvbih0aGlzLCAiZmlsdGVyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmlsdGVyc0FjdGlvbi5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuRmlsdGVyc190ZXh0KTsgCi0gICAgICAgIGZpbHRlcnNBY3Rpb24uc2V0VG9vbFRpcFRleHQoVGFza0xpc3RNZXNzYWdlcy5GaWx0ZXJzX3Rvb2x0aXApOwotICAgICAgICBmaWx0ZXJzQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihNYXJrZXJVdGlsCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcigiZmlsdGVyIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy8gcHJvcGVydGllcwotICAgICAgICBwcm9wZXJ0aWVzQWN0aW9uID0gbmV3IFRhc2tQcm9wZXJ0aWVzQWN0aW9uKHRoaXMsICJwcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcHJvcGVydGllc0FjdGlvbi5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuUHJvcGVydGllc190ZXh0KTsgCi0gICAgICAgIHByb3BlcnRpZXNBY3Rpb24uc2V0VG9vbFRpcFRleHQoVGFza0xpc3RNZXNzYWdlcy5Qcm9wZXJ0aWVzX3Rvb2x0aXApOwotICAgICAgICBwcm9wZXJ0aWVzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBtYXJrZXJzIGhhdmUgY2hhbmdlZC4gIFVwZGF0ZSB0aGUgc3RhdHVzIGxpbmUgYW5kIHRpdGxlIGJhci4KLSAgICAgKi8KLSAgICB2b2lkIG1hcmtlcnNDaGFuZ2VkKCkgewotICAgICAgICB1cGRhdGVTdGF0dXNNZXNzYWdlKCk7Ci0gICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgaWYgKHBhcnQgPT0gZm9jdXNQYXJ0KQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChmb2N1c1NlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvY3VzU2VsZWN0aW9uUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmb2N1c1NlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0gICAgICAgICAgICBmb2N1c1NlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvY3VzUGFydCA9IHBhcnQ7Ci0gICAgICAgIGlmIChmb2N1c1BhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9jdXNTZWxlY3Rpb25Qcm92aWRlciA9IGZvY3VzUGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLSAgICAgICAgICAgIGlmIChmb2N1c1NlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb2N1c1NlbGVjdGlvblByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZvY3VzU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVGb2N1c1Jlc291cmNlKGZvY3VzU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVGb2N1c1Jlc291cmNlKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICBpZiAocGFydCAhPSBmb2N1c1BhcnQpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChmb2N1c1NlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvY3VzU2VsZWN0aW9uUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmb2N1c1NlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0gICAgICAgICAgICBmb2N1c1NlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmb2N1c1BhcnQgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB1c2VyIGlzIGF0dGVtcHRpbmcgdG8gZHJhZyBtYXJrZXIgZGF0YS4gIEFkZCB0aGUgYXBwcm9wcmlhdGUKLSAgICAgKiBkYXRhIHRvIHRoZSBldmVudCBkZXBlbmRpbmcgb24gdGhlIHRyYW5zZmVyIHR5cGUuCi0gICAgICovCi0gICAgdm9pZCBwZXJmb3JtRHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChNYXJrZXJUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLSAgICAgICAgICAgIGV2ZW50LmRhdGEgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIC50b0FycmF5KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLSAgICAgICAgICAgIE9iamVjdFtdIGRhdGEgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIC50b0FycmF5KCk7Ci0gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSU1hcmtlcltdIG1hcmtlcnMgPSBuZXcgSU1hcmtlcltkYXRhLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmtlcnNbaV0gPSAoSU1hcmtlcikgZGF0YVtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXZlbnQuZGF0YSA9IGNyZWF0ZU1hcmtlclJlcG9ydChtYXJrZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgLy9yZXN0b3JlIHNlbGVjdGlvbgotICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSU1lbWVudG8gc2VsZWN0aW9uTWVtID0gbWVtZW50by5nZXRDaGlsZChUQUdfU0VMRUNUSU9OKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbk1lbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Qgc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIElNZW1lbnRvIG1hcmtlck1lbXNbXSA9IHNlbGVjdGlvbk1lbS5nZXRDaGlsZHJlbihUQUdfTUFSS0VSKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyTWVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgaWQgPSBMb25nLnBhcnNlTG9uZyhtYXJrZXJNZW1zW2ldLmdldFN0cmluZyhUQUdfSUQpKTsKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gcm9vdC5maW5kTWVtYmVyKG1hcmtlck1lbXNbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKFRBR19SRVNPVVJDRSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSByZXNvdXJjZS5maW5kTWFya2VyKGlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJrZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkxpc3QuYWRkKG1hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb25MaXN0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBUYWJsZSB0YWJsZSA9IHZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICAvL3Jlc3RvcmUgdmVydGljYWwgcG9zaXRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyB0b3BJbmRleFN0ciA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19UT1BfSU5ERVgpOwotICAgICAgICAgICAgdGFibGUuc2V0VG9wSW5kZXgoSW50ZWdlci5wYXJzZUludCh0b3BJbmRleFN0cikpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJVmlld1BhcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgaWYgKHZpZXdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5tZW1lbnRvICE9IG51bGwpIC8vS2VlcCB0aGUgb2xkIHN0YXRlOwotICAgICAgICAgICAgICAgIG1lbWVudG8ucHV0TWVtZW50byh0aGlzLm1lbWVudG8pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zYXZlIGZpbHRlcgotICAgICAgICBnZXRGaWx0ZXIoKS5zYXZlU3RhdGUobWVtZW50by5jcmVhdGVDaGlsZChUQUdfRklMVEVSKSk7Ci0KLSAgICAgICAgLy9zYXZlIGNvbHVtbnMgd2lkdGgKLSAgICAgICAgVGFibGUgdGFibGUgPSB2aWV3ZXIuZ2V0VGFibGUoKTsKLSAgICAgICAgVGFibGVDb2x1bW4gY29sdW1uc1tdID0gdGFibGUuZ2V0Q29sdW1ucygpOwotICAgICAgICAvL2NoZWNrIHdoZXRoZXIgaXQgaGFzIGV2ZXIgYmVlbiBsYXllZCBvdXQKLSAgICAgICAgLy93b3JrYXJvdW5kIGZvciAxR0RUVTE5OiBJVFBVSTpXSU4yMDAwIC0gVGFzayBsaXN0IGNvbHVtbnMgImNvbGxhcHNlZCIgbGVmdAotICAgICAgICBib29sZWFuIHNob3VsZFNhdmUgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY29sdW1uTGF5b3V0c1tpXS5yZXNpemFibGUgJiYgY29sdW1uc1tpXS5nZXRXaWR0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzaG91bGRTYXZlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2hvdWxkU2F2ZSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbHVtbkxheW91dHNbaV0ucmVzaXphYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIElNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZChUQUdfQ09MVU1OKTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQucHV0SW50ZWdlcihUQUdfTlVNQkVSLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQucHV0SW50ZWdlcihUQUdfV0lEVEgsIGNvbHVtbnNbaV0uZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9zYXZlIHNlbGVjdGlvbgotICAgICAgICBPYmplY3QgbWFya2Vyc1tdID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgICAgIC50b0FycmF5KCk7Ci0gICAgICAgIGlmIChtYXJrZXJzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIElNZW1lbnRvIHNlbGVjdGlvbk1lbSA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoVEFHX1NFTEVDVElPTik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJTWVtZW50byBlbGVtZW50TWVtID0gc2VsZWN0aW9uTWVtLmNyZWF0ZUNoaWxkKFRBR19NQVJLRVIpOwotICAgICAgICAgICAgICAgIElNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIG1hcmtlcnNbaV07Ci0gICAgICAgICAgICAgICAgZWxlbWVudE1lbS5wdXRTdHJpbmcoVEFHX1JFU09VUkNFLCBtYXJrZXIuZ2V0UmVzb3VyY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZWxlbWVudE1lbS5wdXRTdHJpbmcoVEFHX0lELCBTdHJpbmcudmFsdWVPZihtYXJrZXIuZ2V0SWQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9zYXZlIHZlcnRpY2FsIHBvc2l0aW9uCi0gICAgICAgIGludCB0b3BJbmRleCA9IHRhYmxlLmdldFRvcEluZGV4KCk7Ci0gICAgICAgIG1lbWVudG8ucHV0U3RyaW5nKFRBR19UT1BfSU5ERVgsIFN0cmluZy52YWx1ZU9mKHRvcEluZGV4KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBtYXJrZXIgc2VsZWN0aW9uIGNoYW5nZSBpbiB0aGUgdGFzayBsaXN0IGJ5IHVwZGF0aW5nIGF2YWlsYWJpbGl0eSBvZgotICAgICAqIHRoZSBhY3Rpb25zIGluIHRoZSBsb2NhbCB0b29sIGJhci4KLSAgICAgKi8KLSAgICB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIHVwZGF0ZVN0YXR1c01lc3NhZ2Uoc2VsZWN0aW9uKTsKLSAgICAgICAgdXBkYXRlVGl0bGUoKTsKLQotICAgICAgICB1cGRhdGVQYXN0ZUVuYWJsZW1lbnQoKTsKLQotICAgICAgICAvLyBJZiBzZWxlY3Rpb24gaXMgZW1wdHksIHRoZW4gZGlzYWJsZSBjb3B5LCByZW1vdmUgYW5kIGdvdG8uCQotICAgICAgICBpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgY29weVRhc2tBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICByZW1vdmVUYXNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgZ290b1Rhc2tBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotCi0gICAgICAgIC8vIENhbiBvbmx5IG9wZW4gcHJvcGVydGllcyBmb3IgYSBzaW5nbGUgdGFzayBhdCBhIHRpbWUKLSAgICAgICAgcHJvcGVydGllc0FjdGlvbi5zZXRFbmFibGVkKHNlbGVjdGlvbi5zaXplKCkgPT0gMSk7Ci0KLSAgICAgICAgLy8gQ2FuIGFsd2F5cyBjb3B5Ci0gICAgICAgIGNvcHlUYXNrQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGdvdG8gc2hvdWxkIGJlIGVuYWJsZWQKLSAgICAgICAgSU1hcmtlciBzZWxlY3RlZE1hcmtlciA9IChJTWFya2VyKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGJvb2xlYW4gY2FuSnVtcCA9IHNlbGVjdGlvbi5zaXplKCkgPT0gMQotICAgICAgICAgICAgICAgICYmIHNlbGVjdGVkTWFya2VyLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFOwotICAgICAgICBnb3RvVGFza0FjdGlvbi5zZXRFbmFibGVkKGNhbkp1bXApOwotCi0gICAgICAgIC8vIERldGVybWluZSBpZiByZW1vdmUgc2hvdWxkIGJlIGVuYWJsZWQKLSAgICAgICAgYm9vbGVhbiBjYW5SZW1vdmUgPSB0cnVlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIG1hcmtlcnMgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgbWFya2Vycy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJTWFya2VyIG0gPSAoSU1hcmtlcikgbWFya2Vycy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIU1hcmtlclV0aWwuaXNFZGl0YWJsZShtKSkgewotICAgICAgICAgICAgICAgIGNhblJlbW92ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJlbW92ZVRhc2tBY3Rpb24uc2V0RW5hYmxlZChjYW5SZW1vdmUpOwotCi0gICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBlZGl0b3Igb24gdGhlIHNlbGVjdGlvbidzIGlucHV0LCB0ZWxsCi0gICAgICAgIC8vIHRoZSBlZGl0b3IgdG8gZ290byB0aGUgbWFya2VyCi0gICAgICAgIGlmIChjYW5KdW1wKSB7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlVXRpbC5nZXRGaWxlKGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE1hcmtlci5nZXRSZXNvdXJjZSgpLmVxdWFscyhmaWxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSURFLmdvdG9NYXJrZXIoZWRpdG9yLCBzZWxlY3RlZE1hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hQYXJ0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvcGVydHkgb24gYSBtYXJrZXIgdG8gdGhlIGdpdmVuIHZhbHVlLgotICAgICAqLwotICAgIHZvaWQgc2V0UHJvcGVydHkoSU1hcmtlciBtYXJrZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChNYXJrZXJVdGlsLmdldFByb3BlcnR5KG1hcmtlciwgcHJvcGVydHkpLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IHRhYmxlQ29sdW1uUHJvcGVydGllc1sxXSkgeyAvLyBDb21wbGV0ZWQKLSAgICAgICAgICAgICAgICBtYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuRE9ORSwgdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSB0YWJsZUNvbHVtblByb3BlcnRpZXNbMl0pIHsgLy8gUHJpb3JpdHkKLSAgICAgICAgICAgICAgICAvLyB0aGlzIHByb3BlcnR5IGlzIHVzZWQgb25seSBieSBjZWxsIGVkaXRvciwgd2hlcmUgb3JkZXIgaXMgSGlnaCwgTm9ybWFsLCBMb3cKLSAgICAgICAgICAgICAgICBtYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuUFJJT1JJVFksIElNYXJrZXIuUFJJT1JJVFlfSElHSAotICAgICAgICAgICAgICAgICAgICAgICAgLSAoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT0gdGFibGVDb2x1bW5Qcm9wZXJ0aWVzWzNdKSB7IC8vIERlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAvLyBMZXQncyBub3QgcmVmaWx0ZXIgdG9vIGxpZ2h0bHkgLSBzZWUgaWYgaXQgaXMgbmVlZGVkCi0gICAgICAgICAgICAgICAgLy8JCQlUYXNrU29ydGVyIHNvcnRlciA9IChUYXNrU29ydGVyKSB2aWV3ZXIuZ2V0U29ydGVyKCk7Ci0gICAgICAgICAgICAgICAgLy8JCQlpZiAoc29ydGVyICE9IG51bGwgJiYgc29ydGVyLmdldENvbHVtbk51bWJlcigpID09IDMpIHsKLSAgICAgICAgICAgICAgICAvLwkJCQl2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgIC8vCQkJfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X2Vycm9yTW9kaWZ5aW5nVGFzazsgCi0gICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2l0ZSgpLmdldFNoZWxsKCksIG1zZywgbnVsbCwgZQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQVBJIG1ldGhvZCB3aGljaCBzZXRzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBvZiB0aGlzIHZpZXdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gYSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBvZiA8Y29kZT5JTWFya2VyPC9jb2RlPiBvYmplY3RzCi0gICAgICogQHBhcmFtIHJldmVhbCA8Y29kZT50cnVlPC9jb2RlPiB0byByZXZlYWwgdGhlIHNlbGVjdGlvbiwgPGZhbHNlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gcmV2ZWFsKSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pOwotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc3NlbC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgICBBc3NlcnQuaXNUcnVlKGkubmV4dCgpIGluc3RhbmNlb2YgSU1hcmtlcik7Ci0KLSAgICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgICAgICAgdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHJldmVhbCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBzaG93Q2hpbGRyZW5IaWVyYXJjaHkoKSB7Ci0gICAgICAgIHN3aXRjaCAoZ2V0RmlsdGVyKCkub25SZXNvdXJjZSkgewotICAgICAgICBjYXNlIFRhc2tzRmlsdGVyLk9OX0FOWV9SRVNPVVJDRToKLSAgICAgICAgY2FzZSBUYXNrc0ZpbHRlci5PTl9TRUxFQ1RFRF9SRVNPVVJDRV9BTkRfQ0hJTERSRU46Ci0gICAgICAgIGNhc2UgVGFza3NGaWx0ZXIuT05fQU5ZX1JFU09VUkNFX09GX1NBTUVfUFJPSkVDVDoKLSAgICAgICAgLy8gYWRkZWQgYnkgY2FnYXRheWtAYWNtLm9yZwotICAgICAgICBjYXNlIFRhc2tzRmlsdGVyLk9OX1dPUktJTkdfU0VUOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGNhc2UgVGFza3NGaWx0ZXIuT05fU0VMRUNURURfUkVTT1VSQ0VfT05MWToKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gc2hvd1NlbGVjdGlvbnMoKSB7Ci0gICAgICAgIHN3aXRjaCAoZ2V0RmlsdGVyKCkub25SZXNvdXJjZSkgewotICAgICAgICBjYXNlIFRhc2tzRmlsdGVyLk9OX1NFTEVDVEVEX1JFU09VUkNFX09OTFk6Ci0gICAgICAgIGNhc2UgVGFza3NGaWx0ZXIuT05fU0VMRUNURURfUkVTT1VSQ0VfQU5EX0NISUxEUkVOOgotICAgICAgICBjYXNlIFRhc2tzRmlsdGVyLk9OX0FOWV9SRVNPVVJDRV9PRl9TQU1FX1BST0pFQ1Q6Ci0gICAgICAgICAgICAvLyBhZGRlZCBieSBjYWdhdGF5a0BhY20ub3JnCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgY2FzZSBUYXNrc0ZpbHRlci5PTl9BTllfUkVTT1VSQ0U6Ci0gICAgICAgIGNhc2UgVGFza3NGaWx0ZXIuT05fV09SS0lOR19TRVQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBzaG93T3duZXJQcm9qZWN0KCkgYWRkZWQgYnkgY2FnYXRheWtAYWNtLm9yZyAKLSAgICBib29sZWFuIHNob3dPd25lclByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXRGaWx0ZXIoKS5vblJlc291cmNlID09IFRhc2tzRmlsdGVyLk9OX0FOWV9SRVNPVVJDRV9PRl9TQU1FX1BST0pFQ1Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHN0YXRlIGNoYW5nZSBvZiB0aGUgJ3Nob3dTZWxlY3Rpb25zJyBzd2l0Y2guCi0gICAgICogSWYgdHJ1ZSwgaXQgd2lsbCByZXN5bmMgd2l0aCB0aGUgc2F2ZWQgaW5wdXQgZWxlbWVudC4KLSAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgcmVjb25maWd1cmUgdG8gc2hvdyBhbGwgdGhlCi0gICAgICogcHJvYmxlbXMvdGFza3MgaW4gdGhlIHdvcmtiZW5jaC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gICAgICovCi0gICAgdm9pZCB0b2dnbGVJbnB1dFNlbGVjdGlvbihib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgIGhhbmRsZUlucHV0KGlucHV0U2VsZWN0aW9uLCBmYWxzZSk7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgLy8gZGV0YWNoIGZyb20gaW5wdXQgYW5kIGxpbmsgdG8gdGhlIHdvcmtiZW5jaCBvYmplY3QKLSAgICAgICAgIGhhbmRsZUlucHV0KFdvcmtiZW5jaFBsdWdpbi5nZXRQbHVnaW5Xb3JrYmVuY2goKSwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgICAgICB1cGRhdGVUaXRsZSgpOwotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0cnVlLCBjdXJyZW50IGlucHV0IHdpbGwgYmUKLSAgICAgKiByZW1lbWJlcmVkIGFuZCBmdXJ0aGVyIHNlbGVjdGlvbnMgd2lsbCBiZQotICAgICAqIGlnbm9yZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgICAqLwotICAgIHZvaWQgdG9nZ2xlTG9ja0lucHV0KGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgLyoKLSAgICAgICAgIGlmICghdmFsdWUpIHsKLSAgICAgICAgIGhhbmRsZUlucHV0KGlucHV0U2VsZWN0aW9uLCBmYWxzZSk7Ci0gICAgICAgICBsb2NrZWRJbnB1dCA9IG51bGw7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgbG9ja2VkSW5wdXQgPSAoSUVsZW1lbnQpIGdldElucHV0KCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBTdHJpbmcgbG9ja2VkSW5wdXRQYXRoID0gIiI7Ci0gICAgICAgICBpZiAobG9ja2VkSW5wdXQgIT0gbnVsbCAmJiBsb2NrZWRJbnB1dCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgbG9ja2VkSW5wdXQ7Ci0gICAgICAgICBsb2NrZWRJbnB1dFBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBJRGlhbG9nU3RvcmUgc3RvcmUgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1N0b3JlKCk7Ci0gICAgICAgICBzdG9yZS5wdXQoU1RPUkVfTE9DS0VEX0lOUFVULCBsb2NrZWRJbnB1dFBhdGgpOwotICAgICAgICAgdXBkYXRlVGl0bGUoKTsKLSAgICAgICAgICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgZm9jdXMgcmVzb3VyY2UsIGFuZCByZWZyZXNoZXMgaWYgd2UncmUgc2hvd2luZyBvbmx5IHRhc2tzIGZvciB0aGUgZm9jdXMgcmVzb3VyY2UuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVGb2N1c1Jlc291cmNlKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIElUYXNrTGlzdFJlc291cmNlQWRhcHRlciB0YXNrTGlzdFJlc291cmNlQWRhcHRlcjsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFkYXB0ZXIgPSAoKElBZGFwdGFibGUpIG9iamVjdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJVGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWRhcHRlciBpbnN0YW5jZW9mIElUYXNrTGlzdFJlc291cmNlQWRhcHRlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIgPSAoSVRhc2tMaXN0UmVzb3VyY2VBZGFwdGVyKSBhZGFwdGVyOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIgPSBEZWZhdWx0VGFza0xpc3RSZXNvdXJjZUFkYXB0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHRhc2tMaXN0UmVzb3VyY2VBZGFwdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFmZmVjdGVkUmVzb3VyY2UoKElBZGFwdGFibGUpIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdC5zaXplKCkgPT0gMCAmJiBmb2N1c1BhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gKChJRWRpdG9yUGFydCkgZm9jdXNQYXJ0KS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWwuZ2V0UmVzb3VyY2UoaW5wdXQpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbCA9IGxpc3Quc2l6ZSgpOwotICAgICAgICBpZiAobCA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybjsgLy8gcmVxdWlyZWQgdG8gYWNoaWV2ZSBsYXp5IHVwZGF0ZSBiZWhhdmlvci4KLSAgICAgICAgfQotCi0gICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IChJUmVzb3VyY2VbXSkgbGlzdC50b0FycmF5KG5ldyBJUmVzb3VyY2VbbF0pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGw7IGkrKykgewotICAgICAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChyZXNvdXJjZXNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHJlc291cmNlcywgZm9jdXNSZXNvdXJjZXMpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHVwZGF0ZU5lZWRlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAoc2hvd093bmVyUHJvamVjdCgpKSB7Ci0gICAgICAgICAgICAgICAgaW50IG0gPSBmb2N1c1Jlc291cmNlcyA9PSBudWxsID8gMCA6IGZvY3VzUmVzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBpZiAobCAhPSBtKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0IG9sZFByb2plY3QgPSBtIDwgMSA/IG51bGwgOiBmb2N1c1Jlc291cmNlc1swXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgbmV3UHJvamVjdCA9IHJlc291cmNlc1swXS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2plY3RzRXF1YWwgPSAob2xkUHJvamVjdCA9PSBudWxsID8gbmV3UHJvamVjdCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb2xkUHJvamVjdC5lcXVhbHMobmV3UHJvamVjdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9qZWN0c0VxdWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTmVlZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hvd1NlbGVjdGlvbnMoKSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoZSBmb2N1cyByZXNvdXJjZXMgZXZlbiBpZiB1cGRhdGUgaXMgbm90IG5lZWRlZCwKLSAgICAgICAgICAgIC8vIHNvIHRoYXQgd2Uga25vdyB0aGVtIGlmIHRoZSBmaWx0ZXIgc2V0dGluZ3MgY2hhbmdlCi0gICAgICAgICAgICBmb2N1c1Jlc291cmNlcyA9IHJlc291cmNlczsKLQotICAgICAgICAgICAgaWYgKHVwZGF0ZU5lZWRlZCkgewotICAgICAgICAgICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c01lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVUaXRsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgZW5hYmxlbWVudCBvZiB0aGUgcGFzdGUgYWN0aW9uCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVQYXN0ZUVuYWJsZW1lbnQoKSB7Ci0gICAgICAgIC8vIFBhc3RlIGlmIGNsaXBib2FyZCBjb250YWlucyB0YXNrcwotICAgICAgICBNYXJrZXJUcmFuc2ZlciB0cmFuc2ZlciA9IE1hcmtlclRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIElNYXJrZXJbXSBtYXJrZXJEYXRhID0gKElNYXJrZXJbXSkgZ2V0Q2xpcGJvYXJkKCkuZ2V0Q29udGVudHModHJhbnNmZXIpOwotICAgICAgICBib29sZWFuIGNhblBhc3RlID0gZmFsc2U7Ci0gICAgICAgIGlmIChtYXJrZXJEYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChNYXJrZXJVdGlsLmlzTWFya2VyVHlwZShtYXJrZXJEYXRhW2ldLCBJTWFya2VyLlRBU0spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhblBhc3RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBhc3RlVGFza0FjdGlvbi5zZXRFbmFibGVkKGNhblBhc3RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoYXQgbWVzc2FnZSBkaXNwbGF5ZWQgaW4gdGhlIHN0YXR1cyBsaW5lLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlU3RhdHVzTWVzc2FnZSgpIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgICAgdXBkYXRlU3RhdHVzTWVzc2FnZSgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1c01lc3NhZ2UobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGF0IG1lc3NhZ2UgZGlzcGxheWVkIGluIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVN0YXR1c01lc3NhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0U3RhdHVzTWVzc2FnZShzZWxlY3Rpb24pOwotICAgICAgICBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdGl0bGUgb2YgdGhlIHZpZXcuICBTaG91bGQgYmUgY2FsbGVkIHdoZW4gZmlsdGVycyBjaGFuZ2UuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVUaXRsZSgpIHsKLSAgICAgICAgVGFza0xpc3RDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSAoVGFza0xpc3RDb250ZW50UHJvdmlkZXIpIGdldFRhYmxlVmlld2VyKCkKLSAgICAgICAgICAgICAgICAuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gcHJvdmlkZXIuZ2V0VGl0bGVTdW1tYXJ5KCk7Ci0gICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihzdW1tYXJ5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdXBkYXRlU29ydGluZ1N0YXRlLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlU29ydGluZ1N0YXRlKCkgewotICAgICAgICBpbnQgY3VyQ29sdW1uID0gc29ydGVyLmdldFRvcFByaW9yaXR5KCk7Ci0gICAgICAgIHNvcnRCeUNhdGVnb3J5QWN0aW9uLnNldENoZWNrZWQoY3VyQ29sdW1uID09IFRhc2tTb3J0ZXIuVFlQRSk7Ci0gICAgICAgIHNvcnRCeUNvbXBsZXRlZEFjdGlvbi5zZXRDaGVja2VkKGN1ckNvbHVtbiA9PSBUYXNrU29ydGVyLkNPTVBMRVRJT04pOwotICAgICAgICBzb3J0QnlQcmlvcml0eUFjdGlvbi5zZXRDaGVja2VkKGN1ckNvbHVtbiA9PSBUYXNrU29ydGVyLlBSSU9SSVRZKTsKLSAgICAgICAgc29ydEJ5RGVzY3JpcHRpb25BY3Rpb24uc2V0Q2hlY2tlZChjdXJDb2x1bW4gPT0gVGFza1NvcnRlci5ERVNDUklQVElPTik7Ci0gICAgICAgIHNvcnRCeVJlc291cmNlQWN0aW9uLnNldENoZWNrZWQoY3VyQ29sdW1uID09IFRhc2tTb3J0ZXIuUkVTT1VSQ0UpOwotICAgICAgICBzb3J0QnlDb250YWluZXJBY3Rpb24uc2V0Q2hlY2tlZChjdXJDb2x1bW4gPT0gVGFza1NvcnRlci5GT0xERVIpOwotICAgICAgICBzb3J0QnlMb2NhdGlvbkFjdGlvbi5zZXRDaGVja2VkKGN1ckNvbHVtbiA9PSBUYXNrU29ydGVyLkxPQ0FUSU9OKTsKLSAgICAgICAgc29ydEJ5Q3JlYXRpb25UaW1lQWN0aW9uCi0gICAgICAgICAgICAgICAgLnNldENoZWNrZWQoY3VyQ29sdW1uID09IFRhc2tTb3J0ZXIuQ1JFQVRJT05fVElNRSk7Ci0KLSAgICAgICAgaW50IGN1ckRpcmVjdGlvbiA9IHNvcnRlci5nZXRUb3BQcmlvcml0eURpcmVjdGlvbigpOwotICAgICAgICBzb3J0QXNjZW5kaW5nQWN0aW9uLnNldENoZWNrZWQoY3VyRGlyZWN0aW9uID09IFRhc2tTb3J0ZXIuQVNDRU5ESU5HKTsKLSAgICAgICAgc29ydERlc2NlbmRpbmdBY3Rpb24uc2V0Q2hlY2tlZChjdXJEaXJlY3Rpb24gPT0gVGFza1NvcnRlci5ERVNDRU5ESU5HKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9UYXNrTGlzdENvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L1Rhc2tMaXN0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MDY3NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L1Rhc2tMaXN0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MudGFza2xpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnRhc2tsaXN0LlRhc2tMaXN0TWVzc2FnZXM7Ci0KLS8qKgotICogVGFzayBsaXN0IGNvbnRlbnQgcHJvdmlkZXIgcmV0dXJucyBlbGVtZW50cyB0aGF0IHNob3VsZCBiZQotICogaW4gdGhlIHRhc2sgbGlzdCBkZXBlbmRpbmcgb24gdGhlIHNlbGVjdGlvbiBtb2RlLgotICogSXQgZ29lcyBkaXJlY3RseSB0byB0aGUgbWFya2VyIG1hbmFnZXIgYW5kIHJldHJlaXZlcwotICogdGFza3MgYW5kIHByb2JsZW1zLgotICovCi1jbGFzcyBUYXNrTGlzdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLAotICAgICAgICBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFTS1MgPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVSUk9SUyA9IDE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR1MgPSAyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElORk9TID0gMzsKLQotICAgIHByaXZhdGUgVGFza0xpc3QgdGFza0xpc3Q7Ci0KLSAgICBwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcjsKLQotICAgIHByaXZhdGUgSVJlc291cmNlIGlucHV0OwotCi0gICAgLyogY2FjaGVkIGNvdW50cyBvZiB0YXNrcywgZXJyb3JzLCB3YXJuaW5ncyBhbmQgaW5mb3MgZm9yIHRoZSB2aXNpYmxlIAotICAgICAqIG1hcmtlcnMsIG1haW50YWluZWQgaW5jcmVtZW50YWxseSAqLwotICAgIHByaXZhdGUgaW50W10gdmlzaWJsZU1hcmtlckNvdW50cyA9IG51bGw7Ci0KLSAgICAvKiBjYWNoZWQgY291bnQgb2YgYWxsIG1hcmtlcnMgaW4gd29ya3NwYWNlIG1hdGNoaW5nIHN1cHBvcnRlZCByb290IHR5cGVzIAotICAgICAqICh0YXNrcyAmIHByb2JsZW1zKSwgbWFpbnRhaW5lZCBpbmNyZW1lbnRhbGx5ICovCi0gICAgcHJpdmF0ZSBpbnQgdG90YWxNYXJrZXJDb3VudCA9IC0xOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBUYXNrTGlzdENvbnRlbnRQcm92aWRlcihUYXNrTGlzdCB0YXNrTGlzdCkgewotICAgICAgICB0aGlzLnRhc2tMaXN0ID0gdGFza0xpc3Q7Ci0gICAgICAgIHRoaXMudmlld2VyID0gdGFza0xpc3QuZ2V0VGFibGVWaWV3ZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZ2V0RmlsdGVyT25NYXJrZXJMaW1pdCgpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tMaXN0LmdldEZpbHRlcigpLmdldEZpbHRlck9uTWFya2VyTGltaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRNYXJrZXJMaW1pdCgpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tMaXN0LmdldEZpbHRlcigpLmdldE1hcmtlckxpbWl0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWFya2VyTGltaXRFeGNlZWRlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tMaXN0LmlzTWFya2VyTGltaXRFeGNlZWRlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRNYXJrZXJMaW1pdEV4Y2VlZGVkKGJvb2xlYW4gbWFya2VyTGltaXRFeGNlZWRlZCkgewotICAgICAgICB0YXNrTGlzdC5zZXRNYXJrZXJMaW1pdEV4Y2VlZGVkKG1hcmtlckxpbWl0RXhjZWVkZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBvbmUtbGluZSBzdHJpbmcgY29udGFpbmluZyBhIHN1bW1hcnkgb2YgdGhlIG51bWJlcgotICAgICAqIG9mIHZpc2libGUgdGFza3MgYW5kIHByb2JsZW1zLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzU3VtbWFyeVZpc2libGUoKSB7Ci0gICAgICAgIGlmICh2aXNpYmxlTWFya2VyQ291bnRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE5MUy5iaW5kKFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3Rfc3RhdHVzU3VtbWFyeVZpc2libGUsbmV3IEludGVnZXIoc3VtKHZpc2libGVNYXJrZXJDb3VudHMpKSwKLQkJZ2V0U3RhdHVzU3VtbWFyeUJyZWFrZG93bih2aXNpYmxlTWFya2VyQ291bnRzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG9uZS1saW5lIHN0cmluZyBjb250YWluaW5nIGEgc3VtbWFyeSBvZiB0aGUgbnVtYmVyCi0gICAgICogb2Ygc2VsZWN0ZWQgdGFza3MgYW5kIHByb2JsZW1zLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXNTdW1tYXJ5U2VsZWN0ZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGludFtdIHNlbGVjdGVkTWFya2VyQ291bnRzID0gZ2V0TWFya2VyQ291bnRzKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0gICAgICAgIHJldHVybiBOTFMuYmluZChUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X3N0YXR1c1N1bW1hcnlTZWxlY3RlZCwgbmV3IEludGVnZXIoc3VtKHNlbGVjdGVkTWFya2VyQ291bnRzKSksCi0JCWdldFN0YXR1c1N1bW1hcnlCcmVha2Rvd24oc2VsZWN0ZWRNYXJrZXJDb3VudHMpICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG9uZS1saW5lIHN0cmluZyBjb250YWluaW5nIGEgc3VtbWFyeSBvZiB0aGUgbnVtYmVyIG9mIAotICAgICAqIGdpdmVuIHRhc2tzLCBlcnJvcnMsIHdhcm5pbmdzLCBhbmQgaW5mb3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhdHVzU3VtbWFyeUJyZWFrZG93bihpbnRbXSBjb3VudHMpIHsKLSAgICAgICAgcmV0dXJuIE5MUy5iaW5kKAotCQkJCVRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3Rfc3RhdHVzU3VtbWFyeUJyZWFrZG93biwgCi0JCQkJbmV3IE9iamVjdCBbXXsgCi0JCQkJCQluZXcgSW50ZWdlcihjb3VudHNbVEFTS1NdKSwKLQkJCQkJCW5ldyBJbnRlZ2VyKGNvdW50c1tFUlJPUlNdKSwKLQkJCQkJCW5ldyBJbnRlZ2VyKGNvdW50c1tXQVJOSU5HU10pLAotCQkJCQkJbmV3IEludGVnZXIoY291bnRzW0lORk9TXSl9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgb25lLWxpbmUgc3RyaW5nIGNvbnRhaW5pbmcgYSBzdW1tYXJ5IG9mIHRoZSBudW1iZXIgaXRlbXMKLSAgICAgKiBiZWluZyBzaG93biBieSB0aGUgZmlsdGVyLCBmb3IgZGlzcGxheSBpbiB0aGUgdGl0bGUgYmFyLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGVTdW1tYXJ5KCkgewotICAgICAgICBpZiAodmlzaWJsZU1hcmtlckNvdW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIGludCB2aXNpYmxlTWFya2VyQ291bnQgPSBzdW0odmlzaWJsZU1hcmtlckNvdW50cyk7Ci0gICAgICAgIFRhc2tzRmlsdGVyIGZpbHRlciA9IHRhc2tMaXN0LmdldEZpbHRlcigpOwotCi0gICAgICAgIGlmIChmaWx0ZXIuaXNTaG93aW5nQWxsKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZChUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X3RpdGxlU3VtbWFyeVVuZmlsdGVyZWQsIG5ldyBJbnRlZ2VyKHZpc2libGVNYXJrZXJDb3VudCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfdGl0bGVTdW1tYXJ5RmlsdGVyZWQsIG5ldyBJbnRlZ2VyKHZpc2libGVNYXJrZXJDb3VudCksCi0JCQluZXcgSW50ZWdlcihnZXRUb3RhbE1hcmtlckNvdW50KCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgZ2l2ZW4gY291bnRzLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHN1bShpbnRbXSBjb3VudHMpIHsKLSAgICAgICAgaW50IHN1bSA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAsIGwgPSBjb3VudHMubGVuZ3RoOyBpIDwgbDsgKytpKSB7Ci0gICAgICAgICAgICBzdW0gKz0gY291bnRzW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1bTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiBhbGwgbWFya2VycyBpbiB0aGUgd29ya3NwYWNlIHdoaWNoIGNhbiBiZSBzaG93biBpbiAKLSAgICAgKiB0aGUgdGFzayBsaXN0LiBUaGlzIGlzIGNvbXB1dGVkIG9uY2UsIHRoZW4gbWFpbnRhaW5lZCBpbmNyZW1lbnRhbGx5IGJ5IAotICAgICAqIHRoZSBkZWx0YSBwcm9jZXNzaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldFRvdGFsTWFya2VyQ291bnQoKSB7Ci0gICAgICAgIGlmICh0b3RhbE1hcmtlckNvdW50ID09IC0xKSB7Ci0gICAgICAgICAgICB0b3RhbE1hcmtlckNvdW50ID0gMDsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2Ugcm9vdCA9IHRhc2tMaXN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgICAgICAgICBJTWFya2VyW10gbWFya2VycyA9IHJvb3QuZmluZE1hcmtlcnMobnVsbCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUm9vdFR5cGUobWFya2Vyc1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrdG90YWxNYXJrZXJDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0b3RhbE1hcmtlckNvdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbWFya2VyIGlzIGEgc3VidHlwZSBvZiBvbmUgb2YgdGhlIHJvb3QgdHlwZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUm9vdFR5cGUoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgU3RyaW5nW10gcm9vdFR5cGVzID0gVGFza3NGaWx0ZXIuUk9PVF9UWVBFUzsKLQotICAgICAgICBmb3IgKGludCBpID0gMCwgbCA9IHJvb3RUeXBlcy5sZW5ndGg7IGkgPCBsOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChNYXJrZXJVdGlsLmlzTWFya2VyVHlwZShtYXJrZXIsIHJvb3RUeXBlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXJrZXJzIHRvIHNob3cgaW4gdGhlIHRhc2sgbGlzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElNYXJrZXJbXSBnZXRNYXJrZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSB0YXNrTGlzdC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgaW50IGwgPSByZXNvdXJjZXMubGVuZ3RoOwotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2U7Ci0gICAgICAgIGJvb2xlYW4gYkV4aXN0cyA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7Ci0gICAgICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLQotICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBiRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYkV4aXN0cykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJTWFya2VyWzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRhc2tMaXN0LnNob3dPd25lclByb2plY3QoKSkgewotICAgICAgICAgICAgSVJlc291cmNlW10gcHJvamVjdFJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbbF07Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcHJvamVjdDsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdFJlc291cmNlc1tpXSA9IHByb2plY3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0UmVzb3VyY2VzW2ldID0gcmVzb3VyY2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc291cmNlcyA9IHByb2plY3RSZXNvdXJjZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZGVwdGggPSB0YXNrTGlzdC5nZXRSZXNvdXJjZURlcHRoKCk7Ci0gICAgICAgIFRhc2tzRmlsdGVyIGZpbHRlciA9IHRhc2tMaXN0LmdldEZpbHRlcigpOwotICAgICAgICBTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGw7IGkrKykgewotICAgICAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhudWxsLCB0cnVlLCBkZXB0aCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1hcmtlcnMubGVuZ3RoOyArK2opIHsKLSAgICAgICAgICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2pdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIuc2VsZWN0KG1hcmtlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldC5hZGQobWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIElNYXJrZXJbXSByZXN1bHQgPSBuZXcgSU1hcmtlcltzZXQuc2l6ZSgpXTsKLSAgICAgICAgc2V0LnRvQXJyYXkocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGFza3MsIGVycm9ycywgd2FybmluZ3MsIGluZm9zCi0gICAgICogaW4gdGhlIGdpdmVuIG1hcmtlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnRbXSBnZXRNYXJrZXJDb3VudHMoTGlzdCBtYXJrZXJzKSB7Ci0gICAgICAgIGludFtdIG1hcmtlckNvdW50cyA9IG5ldyBpbnRbNF07Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFya2Vycy5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIElNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKE1hcmtlclV0aWwuaXNNYXJrZXJUeXBlKG1hcmtlciwgSU1hcmtlci5QUk9CTEVNKSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoTWFya2VyVXRpbC5nZXRTZXZlcml0eShtYXJrZXIpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOgotICAgICAgICAgICAgICAgICAgICArK21hcmtlckNvdW50c1tFUlJPUlNdOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzoKLSAgICAgICAgICAgICAgICAgICAgKyttYXJrZXJDb3VudHNbV0FSTklOR1NdOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfSU5GTzoKLSAgICAgICAgICAgICAgICAgICAgKyttYXJrZXJDb3VudHNbSU5GT1NdOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKE1hcmtlclV0aWwuaXNNYXJrZXJUeXBlKG1hcmtlciwgSU1hcmtlci5UQVNLKSkgewotICAgICAgICAgICAgICAgICsrbWFya2VyQ291bnRzW1RBU0tTXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXJrZXJDb3VudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgbWFya2VyIGNvdW50cyBmb3IgdGhlIGdpdmVuIGRlbHRhLgotICAgICAqIEFzc3VtcHRpb25zOgotICAgICAqICAgLSB0aGUgZGVsdGEgaXMgZWl0aGVyIGFuIGFkZGl0aW9uIG9yIGEgcmVtb3ZhbAotICAgICAqICAgLSBwcm9ibGVtIHNldmVyaXRpZXMgZG9uJ3QgY2hhbmdlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1hcmtlckNvdW50cyhJTWFya2VyRGVsdGEgbWFya2VyRGVsdGEsIGludCBkaWZmZXJlbmNlKSB7Ci0gICAgICAgIGlmICh2aXNpYmxlTWFya2VyQ291bnRzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKG1hcmtlckRlbHRhLmlzU3VidHlwZU9mKElNYXJrZXIuUFJPQkxFTSkpIHsKLSAgICAgICAgICAgIGludCBzZXZlcml0eSA9IG1hcmtlckRlbHRhLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLAotICAgICAgICAgICAgICAgICAgICBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHNldmVyaXR5KSB7Ci0gICAgICAgICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfRVJST1I6Ci0gICAgICAgICAgICAgICAgdmlzaWJsZU1hcmtlckNvdW50c1tFUlJPUlNdICs9IGRpZmZlcmVuY2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzoKLSAgICAgICAgICAgICAgICB2aXNpYmxlTWFya2VyQ291bnRzW1dBUk5JTkdTXSArPSBkaWZmZXJlbmNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX0lORk86Ci0gICAgICAgICAgICAgICAgdmlzaWJsZU1hcmtlckNvdW50c1tJTkZPU10gKz0gZGlmZmVyZW5jZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtYXJrZXJEZWx0YS5pc1N1YnR5cGVPZihJTWFya2VyLlRBU0spKQotICAgICAgICAgICAgdmlzaWJsZU1hcmtlckNvdW50c1tUQVNLU10gKz0gZGlmZmVyZW5jZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2aWV3ZXIgZ2l2ZW4gdGhlIGxpc3RzIG9mIGFkZGVkLCByZW1vdmVkLCBhbmQgY2hhbmdlcyAKLSAgICAgKiBtYXJrZXJzLiBUaGlzIGlzIGNhbGxlZCBpbnNpZGUgYW4gc3luY0V4ZWMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVZpZXdlcihMaXN0IGFkZGl0aW9ucywgTGlzdCByZW1vdmFscywgTGlzdCBjaGFuZ2VzKSB7Ci0KLSAgICAgICAgLy8gVGhlIHdpZGdldCBtYXkgaGF2ZSBiZWVuIGRlc3Ryb3llZCBieSB0aGUgdGltZSB0aGlzIGlzIHJ1bi4gIAotICAgICAgICAvLyBDaGVjayBmb3IgdGhpcyBhbmQgZG8gbm90aGluZyBpZiBzby4KLSAgICAgICAgQ29udHJvbCBjdHJsID0gdmlld2VyLmdldENvbnRyb2woKTsKLQotICAgICAgICBpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL3VwZGF0ZSB0aGUgdmlld2VyIGJhc2VkIG9uIHRoZSBtYXJrZXIgY2hhbmdlcy4KLSAgICAgICAgLy9wcm9jZXNzIHJlbW92YWxzIGJlZm9yZSBhZGRpdGlvbnMsIHRvIGF2b2lkIG11bHRpcGxlIGVxdWFsIGVsZW1lbnRzIGluIAotICAgICAgICAvL3RoZSB2aWV3ZXIKLSAgICAgICAgaWYgKHJlbW92YWxzLnNpemUoKSA+IDApIHsKLQotICAgICAgICAgICAgLy8gQ2FuY2VsIGFueSBvcGVuIGNlbGwgZWRpdG9yLiAgV2UgYXNzdW1lIHRoYXQgdGhlIG9uZSBiZWluZyBlZGl0ZWQgCi0gICAgICAgICAgICAvLyBpcyB0aGUgb25lIGJlaW5nIHJlbW92ZWQuCi0gICAgICAgICAgICB2aWV3ZXIuY2FuY2VsRWRpdGluZygpOwotICAgICAgICAgICAgdmlld2VyLnJlbW92ZShyZW1vdmFscy50b0FycmF5KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFkZGl0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICB2aWV3ZXIuYWRkKGFkZGl0aW9ucy50b0FycmF5KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNoYW5nZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgdmlld2VyLnVwZGF0ZShjaGFuZ2VzLnRvQXJyYXkoKSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmlzdWFsIHBhcnQgdGhhdCBpcyB1c2luZyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgaXMgYWJvdXQKLSAgICAgKiB0byBiZSBkaXNwb3NlZC4gRGVhbGxvY2F0ZSBhbGwgYWxsb2NhdGVkIFNXVCByZXNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlucHV0LmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBpbnB1dCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLSAgICAgICAgaWYgKHRoaXMuaW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5pbnB1dC5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5pbnB1dCA9IChJUmVzb3VyY2UpIG5ld0lucHV0OwotCi0gICAgICAgIGlmICh0aGlzLmlucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuaW5wdXQuZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnZpZXdlciA9IChUYWJsZVZpZXdlcikgdmlld2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSBtYXJrZXJzIHRoYXQgc2hvdWxkIGJlIHNob3duIGZvcgotICAgICAqIHRoZSBjdXJyZW50IHNldHRpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJTWFya2VyW10gbWFya2VycyA9IGdldE1hcmtlcnMoKTsKLSAgICAgICAgICAgIHRoaXMudmlzaWJsZU1hcmtlckNvdW50cyA9IGdldE1hcmtlckNvdW50cyhBcnJheXMuYXNMaXN0KG1hcmtlcnMpKTsKLQotICAgICAgICAgICAgaWYgKGdldEZpbHRlck9uTWFya2VyTGltaXQoKSAmJiBtYXJrZXJzLmxlbmd0aCA+IGdldE1hcmtlckxpbWl0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzTWFya2VyTGltaXRFeGNlZWRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE1hcmtlckxpbWl0RXhjZWVkZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSU1hcmtlclswXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzTWFya2VyTGltaXRFeGNlZWRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE1hcmtlckxpbWl0RXhjZWVkZWQoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWFya2VyczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IElNYXJrZXJbMF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd29ya2JlbmNoIGhhcyBjaGFuZ2VkLiAgUHJvY2VzcyB0aGUgZGVsdGEgYW5kIGlzc3VlIHVwZGF0ZXMgdG8gdGhlIAotICAgICAqIHZpZXdlciwgaW5zaWRlIHRoZSBVSSB0aHJlYWQuCi0gICAgICoKLSAgICAgKiBAc2VlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChmaW5hbCBJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAvKgotICAgICAgICAgKiBnYXRoZXIgYWxsIG1hcmtlciBjaGFuZ2VzIGZyb20gdGhlIGRlbHRhLiBiZSBzdXJlIHRvIGRvIHRoaXMgaW4gdGhlIAotICAgICAgICAgKiBjYWxsaW5nIHRocmVhZCwgYXMgdGhlIGRlbHRhIGlzIGRlc3Ryb3llZCB3aGVuIHRoaXMgbWV0aG9kIHJldHVybnMKLSAgICAgICAgICovCi0gICAgICAgIElNYXJrZXJEZWx0YVtdIG1hcmtlckRlbHRhcyA9IGV2ZW50LmZpbmRNYXJrZXJEZWx0YXMobnVsbCwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKG1hcmtlckRlbHRhcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGludCBvbGRUb3RhbCA9IHRvdGFsTWFya2VyQ291bnQ7Ci0gICAgICAgIGZpbmFsIExpc3QgYWRkaXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCBMaXN0IHJlbW92YWxzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCBMaXN0IGNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJEZWx0YXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElNYXJrZXJEZWx0YSBtYXJrZXJEZWx0YSA9IG1hcmtlckRlbHRhc1tpXTsKLQotICAgICAgICAgICAgaWYgKG1hcmtlckRlbHRhID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGludCBpS2luZCA9IG1hcmtlckRlbHRhLmdldEtpbmQoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBUYXNrc0ZpbHRlci5ST09UX1RZUEVTLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1hcmtlckRlbHRhLmlzU3VidHlwZU9mKFRhc2tzRmlsdGVyLlJPT1RfVFlQRVNbal0pKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogCi0gICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZXMgdGhlIHRvdGFsIGNvdW50IG9mIG1hcmtlcnMgZ2l2ZW4gdGhlIGFwcGxpY2FibGUgCi0gICAgICAgICAgICAgICAgICAgICAqIG1hcmtlciBkZWx0YXMuIAotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsTWFya2VyQ291bnQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaUtpbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxNYXJrZXJDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTWFya2VyQ291bnQtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFBhcnRpdGlvbiB0aGUgbWFya2VyIGRlbHRhcyBpbnRvIG9uZSBvZiB0aGUgdGhyZWUgZ2l2ZW4gCi0gICAgICAgICAgICAgICAgICAgICAqIGxpc3RzIGRlcGVuZGluZyBvbgotICAgICAgICAgICAgICAgICAgICAgKiB0aGUgdHlwZSBvZiBkZWx0YSAoYWRkLCByZW1vdmUsIG9yIGNoYW5nZSkuCi0gICAgICAgICAgICAgICAgICAgICAqIFRoZSByZXN1bHRpbmcgbGlzdHMgY29udGFpbiB0aGUgY29ycmVzcG9uZGluZyBtYXJrZXJzLCAKLSAgICAgICAgICAgICAgICAgICAgICogbm90IHRoZSBkZWx0YXMuCi0gICAgICAgICAgICAgICAgICAgICAqIERlbHRhcyB3aGljaCBhcmUgbm90IHVuZGVyIHRoZSBjdXJyZW50IGZvY3VzIHJlc291cmNlIGFyZSAKLSAgICAgICAgICAgICAgICAgICAgICogZGlzY2FyZGVkLgotICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGFsc28gdXBkYXRlcyB0aGUgbWFya2VyIGNvdW50cy4KLSAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gbWFya2VyRGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWZmZWN0ZWRCeSA9IHRhc2tMaXN0LmNoZWNrUmVzb3VyY2UocmVzb3VyY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGFza0xpc3QuZ2V0RmlsdGVyKCkuc2VsZWN0KG1hcmtlckRlbHRhKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYWZmZWN0ZWRCeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJEZWx0YS5nZXRNYXJrZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpS2luZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbnMuYWRkKG1hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFya2VyQ291bnRzKG1hcmtlckRlbHRhLCArMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZhbHMuYWRkKG1hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFya2VyQ291bnRzKG1hcmtlckRlbHRhLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5hZGQobWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBc3N1bWUgYXR0cmlidXRlIGNoYW5nZXMgZG9uJ3QgYWZmZWN0IG1hcmtlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjb3VudHMuIFRoaXMgaXMgb25seSB0cnVlIGlmIHByb2JsZW0gc2V2ZXJpdGllcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYW4ndCBjaGFuZ2UuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9sZFRvdGFsID09IHRvdGFsTWFya2VyQ291bnQKLSAgICAgICAgICAgICAgICAmJiBhZGRpdGlvbnMuc2l6ZSgpICsgcmVtb3ZhbHMuc2l6ZSgpICsgY2hhbmdlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgLy8gbm8gY2hhbmdlcyB0byBtYXJrZXJzIHRoYXQgd2UgY2FyZSBhYm91dAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZG8gdGhlIHJlcXVpcmVkIHZpZXdlciB1cGRhdGVzIGluIHRoZSBVSSB0aHJlYWQgbmVlZCB0byB1c2Ugc3luY0V4ZWM7IAotICAgICAgICAgKiBzZWUgMUc5NVBVODogSVRQVUk6V0lOMjAwMCAtIENoYW5naW5nIHRhc2sgZGVzY3JpcHRpb24gZmxhc2hlcyBvbGQgCi0gICAgICAgICAqIGRlc2NyaXB0aW9uCi0gICAgICAgICAqLwotICAgICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldEZpbHRlck9uTWFya2VyTGltaXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3VtKHZpc2libGVNYXJrZXJDb3VudHMpID4gZ2V0TWFya2VyTGltaXQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTWFya2VyTGltaXRFeGNlZWRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRNYXJrZXJMaW1pdEV4Y2VlZGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFza0xpc3QuaXNNYXJrZXJMaW1pdEV4Y2VlZGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0TWFya2VyTGltaXRFeGNlZWRlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlVmlld2VyKGFkZGl0aW9ucywgcmVtb3ZhbHMsIGNoYW5nZXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgdGFzayBsaXN0J3Mgc3RhdHVzIG1lc3NhZ2UuCi0gICAgICAgICAgICAgICAgICogWFhYOiBRdWljayBhbmQgZGlydHkgc29sdXRpb24gaGVyZS4gIAotICAgICAgICAgICAgICAgICAqIFdvdWxkIGJlIGJldHRlciB0byBoYXZlIGEgc2VwYXJhdGUgbW9kZWwgZm9yIHRoZSB0YXNrcyBhbmQKLSAgICAgICAgICAgICAgICAgKiBoYXZlIGJvdGggdGhlIGNvbnRlbnQgcHJvdmlkZXIgYW5kIHRoZSB0YXNrIGxpc3QgcmVnaXN0ZXIgZm9yIAotICAgICAgICAgICAgICAgICAqIHVwZGF0ZXMuIFhYWDogRG8gdGhpcyBpbnNpZGUgdGhlIHN5bmNFeGVjLCBzaW5jZSB3ZSdyZSAKLSAgICAgICAgICAgICAgICAgKiB0YWxraW5nIHRvIHN0YXR1cyBsaW5lIHdpZGdldC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB0YXNrTGlzdC5tYXJrZXJzQ2hhbmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvVGFza1Byb3BlcnRpZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9UYXNrUHJvcGVydGllc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjE0NWVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9UYXNrUHJvcGVydGllc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MudGFza2xpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGlzIGFjdGlvbiBvcGVucyB0aGUgcHJvcGVydGllcyBkaWFsb2cgZm9yIHRoZSBjdXJyZW50IHRhc2suCi0gKi8KLWNsYXNzIFRhc2tQcm9wZXJ0aWVzQWN0aW9uIGV4dGVuZHMgVGFza0FjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHRhc2tsaXN0IHRoZSB0YXNrIGxpc3QKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGlkCi0gICAgICovCi0gICAgcHVibGljIFRhc2tQcm9wZXJ0aWVzQWN0aW9uKFRhc2tMaXN0IHRhc2tsaXN0LCBTdHJpbmcgaWQpIHsKLSAgICAgICAgc3VwZXIodGFza2xpc3QsIGlkKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotICAgICAgICAgICAgICAgIElUYXNrTGlzdEhlbHBDb250ZXh0SWRzLlRBU0tfUFJPUEVSVElFU19BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHRoaXMgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRUYXNrTGlzdCgpCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICBPYmplY3QgbyA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0gICAgICAgICAgICBUYXNrUHJvcGVydGllc0RpYWxvZyBkaWFsb2cgPSBuZXcgVGFza1Byb3BlcnRpZXNEaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICBkaWFsb2cuc2V0TWFya2VyKChJTWFya2VyKSBvKTsKLSAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvVGFza1Byb3BlcnRpZXNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9UYXNrUHJvcGVydGllc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTZmNDZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9UYXNrUHJvcGVydGllc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnRhc2tsaXN0OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLlN0YXR1c1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MudGFza2xpc3QuVGFza0xpc3RNZXNzYWdlczsKLQotLyoqCi0gKiBTaG93cyB0aGUgcHJvcGVydGllcyBvZiBhIG5ldyBvciBleGlzdGluZyB0YXNrLCBvciBhIHByb2JsZW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrUHJvcGVydGllc0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGFzayBvciBwcm9ibGVtIGJlaW5nIHNob3duLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgYSBuZXcgdGFzay4KLSAgICAgKi8KLSAgICBwcml2YXRlIElNYXJrZXIgbWFya2VyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSByZXNvdXJjZSBvbiB3aGljaCB0byBjcmVhdGUgYSBuZXcgdGFzay4KLSAgICAgKi8KLSAgICBwcml2YXRlIElSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaW5pdGlhbCBhdHRyaWJ1dGVzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgbmV3IHRhc2suCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgaW5pdGlhbEF0dHJpYnV0ZXMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIHRleHQgY29udHJvbCBmb3IgdGhlIERlc2NyaXB0aW9uIGZpZWxkLgotICAgICAqLwotICAgIHByaXZhdGUgVGV4dCBkZXNjcmlwdGlvblRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29udHJvbCBmb3IgdGhlIENyZWF0aW9uIFRpbWUgZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMYWJlbCBjcmVhdGlvblRpbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29tYm8gYm94IGNvbnRyb2wgZm9yIHRoZSBQcmlvcml0eSBmaWVsZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIENvbWJvIHByaW9yaXR5Q29tYm87Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2hlY2tib3ggYnV0dG9uIGZvciB0aGUgQ29tcGxldGVkIGZpZWxkLgotICAgICAqLwotICAgIHByaXZhdGUgQnV0dG9uIGNvbXBsZXRlZENoZWNrYm94OwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnRyb2wgZm9yIHRoZSBTZXZlcml0eSBmaWVsZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIExhYmVsIHNldmVyaXR5TGFiZWw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGV4dCBjb250cm9sIGZvciB0aGUgUmVzb3VyY2UgZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUZXh0IHJlc291cmNlVGV4dDsKLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXh0IGNvbnRyb2wgZm9yIHRoZSBGb2xkZXIgZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUZXh0IGZvbGRlclRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGV4dCBjb250cm9sIGZvciB0aGUgTG9jYXRpb24gZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUZXh0IGxvY2F0aW9uVGV4dDsKLQotICAgIC8qKgotICAgICAqIERpcnR5IGZsYWcuICBUcnVlIGlmIGFueSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkaXJ0eTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGRpYWxvZy4gIEJ5IGRlZmF1bHQgdGhpcyBkaWFsb2cgY3JlYXRlcyBhIG5ldyB0YXNrLgotICAgICAqIFRvIHNldCB0aGUgcmVzb3VyY2UgYW5kIGluaXRpYWwgYXR0cmlidXRlcyBmb3IgdGhlIG5ldyB0YXNrLCAKLSAgICAgKiB1c2UgPGNvZGU+c2V0UmVzb3VyY2U8L2NvZGU+IGFuZCA8Y29kZT5zZXRJbml0aWFsQXR0cmlidXRlczwvY29kZT4uCi0gICAgICogVG8gc2hvdyBvciBtb2RpZnkgYW4gZXhpc3RpbmcgdGFzaywgdXNlIDxjb2RlPnNldE1hcmtlcjwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBwYXJlbnQgc2hlbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFza1Byb3BlcnRpZXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1hcmtlciB0byBzaG93IG9yIG1vZGlmeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNyZWF0ZSBhIG5ldyBtYXJrZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgdGhpcy5tYXJrZXIgPSBtYXJrZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFya2VyIGJlaW5nIGNyZWF0ZWQgb3IgbW9kaWZpZWQuCi0gICAgICogRm9yIGEgbmV3IG1hcmtlciwgdGhpcyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHVudGlsCi0gICAgICogdGhlIGRpYWxvZyByZXR1cm5zLCBidXQgaXMgbm9uLW51bGwgYWZ0ZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWFya2VyCi0gICAgICovCi0gICAgcHVibGljIElNYXJrZXIgZ2V0TWFya2VyKCkgewotICAgICAgICByZXR1cm4gbWFya2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJlc291cmNlIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgbmV3IHRhc2suCi0gICAgICogSWYgbm90IHNldCwgdGhlIG5ldyB0YXNrIGlzIGNyZWF0ZWQgb24gdGhlIHdvcmtzcGFjZSByb290LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgbmV3IHRhc2ssCi0gICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBoYXMgYmVlbiBzZXQuCi0gICAgICogSWYgbm90IHNldCwgdGhlIG5ldyB0YXNrIGlzIGNyZWF0ZWQgb24gdGhlIHdvcmtzcGFjZSByb290LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlCi0gICAgICovCi0gICAgcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgaW5pdGlhbCBhdHRyaWJ1dGVzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgbmV3IHRhc2suCi0gICAgICogSWYgbm90IHNldCwgdGhlIG5ldyB0YXNrIGlzIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IGF0dHJpYnV0ZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluaXRpYWxBdHRyaWJ1dGVzIHRoZSBpbml0aWFsIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsQXR0cmlidXRlcyhNYXAgaW5pdGlhbEF0dHJpYnV0ZXMpIHsKLSAgICAgICAgdGhpcy5pbml0aWFsQXR0cmlidXRlcyA9IGluaXRpYWxBdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluaXRpYWwgYXR0cmlidXRlcyB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIG5ldyB0YXNrLAotICAgICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0gICAgICogSWYgbm90IHNldCwgdGhlIG5ldyB0YXNrIGlzIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IGF0dHJpYnV0ZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5pdGlhbCBhdHRyaWJ1dGVzCi0gICAgICovCi0gICAgcHVibGljIE1hcCBnZXRJbml0aWFsQXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGluaXRpYWxBdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQotICAgICAgICBpZiAobWFya2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIG5ld1NoZWxsLnNldFRleHQoVGFza0xpc3RNZXNzYWdlcy5UYXNrUHJvcF9uZXdUYXNrVGl0bGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGtpbmQgPSBNYXJrZXJVdGlsLmdldEtpbmRUZXh0KG1hcmtlcik7Ci0gICAgICAgICAgICBuZXdTaGVsbC5zZXRUZXh0KE5MUy5iaW5kKFRhc2tMaXN0TWVzc2FnZXMuVGFza1Byb3BfcHJvcGVydGllc1RpdGxlLCAga2luZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuZXdTaGVsbCwKLSAgICAgICAgICAgICAgICBJVGFza0xpc3RIZWxwQ29udGV4dElkcy5QUk9QRVJUSUVTX0RJQUxPRyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICAgIGluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVEZXNjcmlwdGlvbkFyZWEoY29tcG9zaXRlKTsKLSAgICAgICAgaWYgKG1hcmtlciAhPSBudWxsKQotICAgICAgICAgICAgY3JlYXRlQ3JlYXRpb25UaW1lQXJlYShjb21wb3NpdGUpOwotICAgICAgICBpZiAoaXNUYXNrKCkpIHsKLSAgICAgICAgICAgIGNyZWF0ZVByaW9yaXR5QW5kU3RhdHVzQXJlYShjb21wb3NpdGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3JlYXRlU2V2ZXJpdHlBcmVhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY3JlYXRlUmVzb3VyY2VBcmVhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHVwZGF0ZURpYWxvZ0Zyb21NYXJrZXIoKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgY3JlYXRlQ3JlYXRpb25UaW1lQXJlYS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ3JlYXRpb25UaW1lQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuVGFza1Byb3BfY3JlYXRpb25UaW1lKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChmb250KTsKLQotICAgICAgICBjcmVhdGlvblRpbWUgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGNyZWF0aW9uVGltZS5zZXRGb250KGZvbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgb25seSB0aGUgT0sgYnV0dG9uIGlmIHNob3dpbmcgcHJvYmxlbSBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgY3JlYXRlcwotICAgICAqIGJvdGggT0sgYW5kIENhbmNlbCBidXR0b25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICBpZiAoaXNFZGl0YWJsZSgpKSB7Ci0gICAgICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLSAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFyZWEgZm9yIHRoZSBEZXNjcmlwdGlvbiBmaWVsZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRGVzY3JpcHRpb25BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIAotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoVGFza0xpc3RNZXNzYWdlcy5UYXNrUHJvcF9kZXNjcmlwdGlvbik7Ci0gICAgICAgIGxhYmVsLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIGludCBzdHlsZSA9IFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSOwotICAgICAgICBpZiAoIWlzRWRpdGFibGUoKSkgewotICAgICAgICAgICAgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLSAgICAgICAgfQotICAgICAgICBkZXNjcmlwdGlvblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIHN0eWxlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNDAwKTsKLSAgICAgICAgZGVzY3JpcHRpb25UZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBkZXNjcmlwdGlvblRleHQuc2V0Rm9udChmb250KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhcmVhIGZvciB0aGUgUHJpb3JpdHkgYW5kIFN0YXR1cyBmaWVsZHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByaW9yaXR5QW5kU3RhdHVzQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KFRhc2tMaXN0TWVzc2FnZXMuVGFza1Byb3BfcHJpb3JpdHkpOyAKLSAgICAgICAgbGFiZWwuc2V0Rm9udChmb250KTsKLSAgICAgICAgcHJpb3JpdHlDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBwcmlvcml0eUNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9oaWdoLAotICAgICAgICAgICAgICAgIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3Rfbm9ybWFsLAotICAgICAgICAgICAgICAgIFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3RfbG93Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIC8vIFByZXZlbnQgRXNjIGFuZCBSZXR1cm4gZnJvbSBjbG9zaW5nIHRoZSBkaWFsb2cgd2hlbiB0aGUgY29tYm8gaXMgYWN0aXZlLgotICAgICAgICBwcmlvcml0eUNvbWJvLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9FU0NBUEUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLSAgICAgICAgICAgICAgICAgICAgZS5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcHJpb3JpdHlDb21iby5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIGNvbXBsZXRlZENoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGNvbXBsZXRlZENoZWNrYm94LnNldFRleHQoVGFza0xpc3RNZXNzYWdlcy5UYXNrUHJvcF9jb21wbGV0ZWQpOyAKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDIwKTsKLSAgICAgICAgY29tcGxldGVkQ2hlY2tib3guc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGNvbXBsZXRlZENoZWNrYm94LnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgaWYgKCFpc0VkaXRhYmxlKCkpIHsKLSAgICAgICAgICAgIHByaW9yaXR5Q29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBjb21wbGV0ZWRDaGVja2JveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFyZWEgZm9yIHRoZSBTZXZlcml0eSBmaWVsZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2V2ZXJpdHlBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoVGFza0xpc3RNZXNzYWdlcy5UYXNrUHJvcF9zZXZlcml0eSk7Ci0gICAgICAgIGxhYmVsLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIC8vIHdvcmthcm91bmQgZm9yIGJ1ZyAxMTA3ODogQ2FuJ3QgZ2V0IGEgcmVhZC1vbmx5IGNvbWJvIGJveAotICAgICAgICBzZXZlcml0eUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBzZXZlcml0eUxhYmVsLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIC8qCi0gICAgICAgICBzZXZlcml0eUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgICBzZXZlcml0eUNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICBUYXNrTGlzdE1lc3NhZ2VzLmdldFN0cmluZygiVGFza0xpc3QuZXJyb3IiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5nZXRTdHJpbmcoIlRhc2tMaXN0Lndhcm5pbmciKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgVGFza0xpc3RNZXNzYWdlcy5nZXRTdHJpbmcoIlRhc2tMaXN0LmluZm8iKSAvLyROT04tTkxTLTEkCi0gICAgICAgICB9KTsKLSAgICAgICAgICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYXJlYSBmb3IgdGhlIFJlc291cmNlIGZpZWxkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSZXNvdXJjZUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgICBpZiAobWFya2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgKElSZXNvdXJjZS5GSUxFIHwgSVJlc291cmNlLkZPTERFUiB8IElSZXNvdXJjZS5QUk9KRUNUKSkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgIExhYmVsIHJlc291cmNlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHJlc291cmNlTGFiZWwKLSAgICAgICAgICAgICAgICAuc2V0VGV4dChUYXNrTGlzdE1lc3NhZ2VzLlRhc2tQcm9wX29uUmVzb3VyY2UpOwotICAgICAgICByZXNvdXJjZUxhYmVsLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIHJlc291cmNlVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5XUkFQCi0gICAgICAgICAgICAgICAgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIHJlc291cmNlVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgcmVzb3VyY2VUZXh0LnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgTGFiZWwgZm9sZGVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGZvbGRlckxhYmVsLnNldFRleHQoVGFza0xpc3RNZXNzYWdlcy5UYXNrUHJvcF9pbkZvbGRlcik7IAotICAgICAgICBmb2xkZXJMYWJlbC5zZXRGb250KGZvbnQpOwotICAgICAgICBmb2xkZXJUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULldSQVAgfCBTV1QuUkVBRF9PTkxZCi0gICAgICAgICAgICAgICAgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZm9sZGVyVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgZm9sZGVyVGV4dC5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIExhYmVsIGxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxvY2F0aW9uTGFiZWwuc2V0VGV4dChUYXNrTGlzdE1lc3NhZ2VzLlRhc2tQcm9wX2xvY2F0aW9uKTsKLSAgICAgICAgbG9jYXRpb25MYWJlbC5zZXRGb250KGZvbnQpOwotICAgICAgICBsb2NhdGlvblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUAotICAgICAgICAgICAgICAgIHwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBsb2NhdGlvblRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGxvY2F0aW9uVGV4dC5zZXRGb250KGZvbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGRpYWxvZyBmcm9tIHRoZSBtYXJrZXIgc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURpYWxvZ0Zyb21NYXJrZXIoKSB7Ci0gICAgICAgIGlmIChtYXJrZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdXBkYXRlRGlhbG9nRm9yTmV3TWFya2VyKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZGVzY3JpcHRpb25UZXh0LnNldFRleHQoTWFya2VyVXRpbC5nZXRNZXNzYWdlKG1hcmtlcikpOwotICAgICAgICBkZXNjcmlwdGlvblRleHQuc2VsZWN0QWxsKCk7Ci0gICAgICAgIGNyZWF0aW9uVGltZS5zZXRUZXh0KE1hcmtlclV0aWwuZ2V0Q3JlYXRpb25UaW1lKG1hcmtlcikpOwotICAgICAgICBpZiAoaXNUYXNrKCkpIHsKLSAgICAgICAgICAgIHByaW9yaXR5Q29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIHByaW9yaXR5Q29tYm8uc2VsZWN0KElNYXJrZXIuUFJJT1JJVFlfSElHSAotICAgICAgICAgICAgICAgICAgICAtIE1hcmtlclV0aWwuZ2V0UHJpb3JpdHkobWFya2VyKSk7Ci0gICAgICAgICAgICBjb21wbGV0ZWRDaGVja2JveC5zZXRTZWxlY3Rpb24oTWFya2VyVXRpbC5pc0NvbXBsZXRlKG1hcmtlcikpOwotICAgICAgICAgICAgbWFya0RpcnR5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiAJd29ya2Fyb3VuZCBmb3IgYnVnIDExMDc4OiBDYW4ndCBnZXQgYSByZWFkLW9ubHkgY29tYm8gYm94Ci0gICAgICAgICAgICAgc2V2ZXJpdHlDb21iby5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgIHNldmVyaXR5Q29tYm8uc2VsZWN0KElNYXJrZXIuU0VWRVJJVFlfRVJST1IgLSBNYXJrZXJVdGlsLmdldFNldmVyaXR5KG1hcmtlcikpOwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgc2V2ID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHN3aXRjaCAoTWFya2VyVXRpbC5nZXRTZXZlcml0eShtYXJrZXIpKSB7Ci0gICAgICAgICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfRVJST1I6Ci0gICAgICAgICAgICAgICAgc2V2ID0gVGFza0xpc3RNZXNzYWdlcy5UYXNrTGlzdF9lcnJvcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOgotICAgICAgICAgICAgICAgIHNldiA9IFRhc2tMaXN0TWVzc2FnZXMuVGFza0xpc3Rfd2FybmluZzsgCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfSU5GTzoKLSAgICAgICAgICAgICAgICBzZXYgPSBUYXNrTGlzdE1lc3NhZ2VzLlRhc2tMaXN0X2luZm87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXZlcml0eUxhYmVsLnNldFRleHQoc2V2KTsKLQotICAgICAgICB9Ci0gICAgICAgIHJlc291cmNlVGV4dC5zZXRUZXh0KE1hcmtlclV0aWwuZ2V0UmVzb3VyY2VOYW1lKG1hcmtlcikpOwotICAgICAgICBmb2xkZXJUZXh0LnNldFRleHQoTWFya2VyVXRpbC5nZXRDb250YWluZXJOYW1lKG1hcmtlcikpOwotICAgICAgICBsb2NhdGlvblRleHQuc2V0VGV4dChNYXJrZXJVdGlsLmdldExpbmVBbmRMb2NhdGlvbihtYXJrZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBkaWFsb2cgdG8gcmVmbGVjdCB0aGUgc3RhdGUgZm9yIGEgbmV3IG1hcmtlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRGlhbG9nRm9yTmV3TWFya2VyKCkgewotICAgICAgICBNYXAgYXR0cnMgPSBnZXRJbml0aWFsQXR0cmlidXRlcygpOwotCi0gICAgICAgIFN0cmluZyBkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gYXR0cnMuZ2V0KElNYXJrZXIuTUVTU0FHRSk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIGRlc2MgPSAoU3RyaW5nKSBvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlc2NyaXB0aW9uVGV4dC5zZXRUZXh0KGRlc2MpOwotICAgICAgICBkZXNjcmlwdGlvblRleHQuc2VsZWN0QWxsKCk7Ci0KLSAgICAgICAgaW50IHByaSA9IElNYXJrZXIuUFJJT1JJVFlfTk9STUFMOwotICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBhdHRycy5nZXQoSU1hcmtlci5QUklPUklUWSk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgICAgICBpbnQgdmFsID0gKChJbnRlZ2VyKSBvKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICh2YWwgPj0gSU1hcmtlci5QUklPUklUWV9MT1cgJiYgdmFsIDw9IElNYXJrZXIuUFJJT1JJVFlfSElHSCkgewotICAgICAgICAgICAgICAgICAgICBwcmkgPSB2YWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaW9yaXR5Q29tYm8uZGVzZWxlY3RBbGwoKTsKLSAgICAgICAgcHJpb3JpdHlDb21iby5zZWxlY3QoSU1hcmtlci5QUklPUklUWV9ISUdIIC0gcHJpKTsKLQotICAgICAgICBib29sZWFuIGNvbXBsZXRlZCA9IGZhbHNlOwotICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBhdHRycy5nZXQoSU1hcmtlci5ET05FKTsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgQm9vbGVhbikgewotICAgICAgICAgICAgICAgIGNvbXBsZXRlZCA9ICgoQm9vbGVhbikgbykuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29tcGxldGVkQ2hlY2tib3guc2V0U2VsZWN0aW9uKGNvbXBsZXRlZCk7Ci0KLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2VUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc291cmNlVGV4dC5zZXRUZXh0KHJlc291cmNlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcGFyZW50ID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBmb2xkZXJUZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5zZXRUZXh0KHBhcmVudCA9PSBudWxsID8gIiIgOiBwYXJlbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLnN1YnN0cmluZygxKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIGludCBsaW5lID0gLTE7Ci0gICAgICAgIFN0cmluZyBsb2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBhdHRycy5nZXQoSU1hcmtlci5MSU5FX05VTUJFUik7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gKChJbnRlZ2VyKSBvKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbyA9IGF0dHJzLmdldChJTWFya2VyLkxPQ0FUSU9OKTsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgbG9jID0gKFN0cmluZykgbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobG9jYXRpb25UZXh0ICE9IG51bGwpCi0gICAgICAgICAgICBsb2NhdGlvblRleHQuc2V0VGV4dChNYXJrZXJVdGlsLmdldExpbmVBbmRMb2NhdGlvbihsaW5lLCBsb2MpKTsKLQotICAgICAgICBtYXJrRGlydHkoKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0gICAgICAgIHNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtYXJrRGlydHkoKSB7Ci0gICAgICAgIGRpcnR5ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIGRpcnR5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbWFya2VyIGlzIGVkaXRhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotICAgICAgICByZXR1cm4gbWFya2VyID09IG51bGwgfHwgTWFya2VyVXRpbC5pc0VkaXRhYmxlKG1hcmtlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHRhc2sgaXMgYmVpbmcgY3JlYXRlZCBvciBtb2RpZmllZC4KLSAgICAgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHByb2JsZW0gaXMgYmVpbmcgc2hvd24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVGFzaygpIHsKLSAgICAgICAgcmV0dXJuIG1hcmtlciA9PSBudWxsIHx8IE1hcmtlclV0aWwuaXNNYXJrZXJUeXBlKG1hcmtlciwgSU1hcmtlci5UQVNLKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgY2hhbmdlcyBtYWRlIGluIHRoZSBkaWFsb2cgaWYgbmVlZGVkLgotICAgICAqIENyZWF0ZXMgYSBuZXcgdGFzayBpZiBuZWVkZWQuCi0gICAgICogVXBkYXRlcyB0aGUgZXhpc3RpbmcgdGFzayBvbmx5IGlmIHRoZXJlIGhhdmUgYmVlbiBjaGFuZ2VzLgotICAgICAqIERvZXMgbm90aGluZyBmb3IgcHJvYmxlbXMsIHNpbmNlIHRoZXkgY2Fubm90IGJlIG1vZGlmaWVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzYXZlQ2hhbmdlcygpIHsKLSAgICAgICAgaWYgKCFpc0VkaXRhYmxlKCkgfHwgIWlzRGlydHkoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBmaW5hbCBDb3JlRXhjZXB0aW9uW10gY29yZUV4Y2VwdGlvbnMgPSBuZXcgQ29yZUV4Y2VwdGlvblsxXTsKLSAgICAgICAgZmluYWwgTWFwIGF0dHJzID0gZ2V0TWFya2VyQXR0cmlidXRlc0Zyb21EaWFsb2coKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuYnVzeUN1cnNvcldoaWxlKAotICAgICAgICAgICAgICAgICAgICBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlT3JVcGRhdGVNYXJrZXIobW9uaXRvciwgYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlRXhjZXB0aW9uc1swXSA9IGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4ubG9nKGUuZ2V0TWVzc2FnZSgpLCBTdGF0dXNVdGlsLm5ld1N0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgSVN0YXR1cy5FUlJPUiwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4ubG9nKGUuZ2V0TWVzc2FnZSgpLCBTdGF0dXNVdGlsLm5ld1N0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgSVN0YXR1cy5FUlJPUiwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb3JlRXhjZXB0aW9uc1swXSAhPSBudWxsKQotICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIFRhc2tMaXN0TWVzc2FnZXMuVGFza1Byb3BfZXJyb3JNZXNzYWdlLCAKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgY29yZUV4Y2VwdGlvbnNbMF0uZ2V0U3RhdHVzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgb3IgdXBkYXRlcyB0aGUgbWFya2VyLiAgTXVzdCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIHJ1bm5hYmxlLgotICAgICAqIEBwYXJhbSBtb25pdG9yIFRoZSBtb25pdG9yIHRvIHJlcG9ydCB0by4KLSAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIGF0cnJpYnV0ZXMgZW50ZXJlZCBmcm9tIHRoZSBkaWFsb2cuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU9yVXBkYXRlTWFya2VyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWFwIGF0dHJzKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKFRhc2tMaXN0TWVzc2FnZXMuVGFza1Byb3BlcnRpZXNEaWFsb2dfV29ya2luZ09uTWFya2VyLCAxMDApOyAKLSAgICAgICAgaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb25pdG9yLnN1YlRhc2soVGFza0xpc3RNZXNzYWdlcy5UYXNrUHJvcGVydGllc0RpYWxvZ19DcmVhdGluZ01hcmtlcik7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtb25pdG9yLndvcmtlZCgyNSk7Ci0KLSAgICAgICAgICAgIG1hcmtlciA9IHJlc291cmNlLmNyZWF0ZU1hcmtlcihJTWFya2VyLlRBU0spOwotICAgICAgICAgICAgTWFwIGluaXRpYWxBdHRycyA9IGdldEluaXRpYWxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBpZiAoaW5pdGlhbEF0dHJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYXJrZXIuc2V0QXR0cmlidXRlcyhpbml0aWFsQXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMjUpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDUwKTsKLQotICAgICAgICAvLyBTZXQgdGhlIG1hcmtlciBhdHRyaWJ1dGVzIGZyb20gdGhlIGN1cnJlbnQgZGlhbG9nIGZpZWxkIHZhbHVlcy4KLSAgICAgICAgLy8gRG8gbm90IHVzZSBzZXRBdHRyaWJ1dGVzKE1hcCkgYXMgdGhhdCBvdmVyd3JpdGVzIGFueSBhdHRyaWJ1dGVzCi0gICAgICAgIC8vIG5vdCBjb3ZlcmVkIGJ5IHRoZSBkaWFsb2cuCi0KLSAgICAgICAgbW9uaXRvci5zdWJUYXNrKFRhc2tMaXN0TWVzc2FnZXMuVGFza1Byb3BlcnRpZXNEaWFsb2dfVXBkYXRpbmdBdHRyaWJ1dGVzKTsKLSAgICAgICAgaW50IGluY3JlbWVudCA9IDUwIC8gYXR0cnMua2V5U2V0KCkuc2l6ZSgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWwgPSBhdHRycy5nZXQoa2V5KTsKLSAgICAgICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoa2V5LCB2YWwpOwotICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoaW5jcmVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1hcmtlciBhdHRyaWJ1dGVzIHRvIHNhdmUgYmFjayB0byB0aGUgbWFya2VyLCAKLSAgICAgKiBiYXNlZCBvbiB0aGUgY3VycmVudCBkaWFsb2cgZmllbGRzLgotICAgICAqLwotICAgIHByaXZhdGUgTWFwIGdldE1hcmtlckF0dHJpYnV0ZXNGcm9tRGlhbG9nKCkgewotICAgICAgICBNYXAgYXR0cmlicyA9IG5ldyBIYXNoTWFwKDExKTsKLSAgICAgICAgaWYgKGlzVGFzaygpKSB7Ci0gICAgICAgICAgICBhdHRyaWJzLnB1dChJTWFya2VyLk1FU1NBR0UsIGRlc2NyaXB0aW9uVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgaW50IGkgPSBwcmlvcml0eUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICBpZiAoaSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGF0dHJpYnMucHV0KElNYXJrZXIuUFJJT1JJVFksIG5ldyBJbnRlZ2VyKElNYXJrZXIuUFJJT1JJVFlfSElHSAotICAgICAgICAgICAgICAgICAgICAgICAgLSBpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdHRyaWJzLnB1dChJTWFya2VyLkRPTkUsCi0gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZENoZWNrYm94LmdldFNlbGVjdGlvbigpID8gQm9vbGVhbi5UUlVFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXR0cmliczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvVGFza1NvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Rhc2tsaXN0L1Rhc2tTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzMTVkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvVGFza1NvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnRhc2tsaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgdGFzayBsaXN0J3Mgc29ydGVyLgotICovCi1jbGFzcyBUYXNrU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLSAgICBwcml2YXRlIGludFtdIHByaW9yaXRpZXM7Ci0KLSAgICBwcml2YXRlIGludFtdIGRpcmVjdGlvbnM7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50IEFTQ0VORElORyA9IDE7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfRElSRUNUSU9OID0gMDsKLQotICAgIGZpbmFsIHN0YXRpYyBpbnQgREVTQ0VORElORyA9IC0xOwotCi0gICAgZmluYWwgc3RhdGljIGludCBUWVBFID0gMDsKLQotICAgIGZpbmFsIHN0YXRpYyBpbnQgQ09NUExFVElPTiA9IDE7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50IFBSSU9SSVRZID0gMjsKLQotICAgIGZpbmFsIHN0YXRpYyBpbnQgREVTQ1JJUFRJT04gPSAzOwotCi0gICAgZmluYWwgc3RhdGljIGludCBSRVNPVVJDRSA9IDQ7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50IEZPTERFUiA9IDU7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50IExPQ0FUSU9OID0gNjsKLQotICAgIGZpbmFsIHN0YXRpYyBpbnQgQ1JFQVRJT05fVElNRSA9IDc7Ci0KLSAgICBmaW5hbCBzdGF0aWMgaW50W10gREVGQVVMVF9QUklPUklUSUVTID0geyBGT0xERVIsIFJFU09VUkNFLCBMT0NBVElPTiwKLSAgICAgICAgICAgIERFU0NSSVBUSU9OLCBUWVBFLCBQUklPUklUWSwgQ09NUExFVElPTiwgQ1JFQVRJT05fVElNRSB9OwotCi0gICAgZmluYWwgc3RhdGljIGludFtdIERFRkFVTFRfRElSRUNUSU9OUyA9IHsgREVTQ0VORElORywgLy90eXBlCi0gICAgICAgICAgICBERVNDRU5ESU5HLCAvL2NvbXBsZXRlZAotICAgICAgICAgICAgREVTQ0VORElORywgLy9wcmlvcml0eQotICAgICAgICAgICAgQVNDRU5ESU5HLCAvL2Rlc2NyaXB0aW9uCi0gICAgICAgICAgICBBU0NFTkRJTkcsIC8vcmVzb3VyY2UKLSAgICAgICAgICAgIEFTQ0VORElORywgLy9mb2xkZXIKLSAgICAgICAgICAgIEFTQ0VORElORywgLy9sb2NhdGlvbgotICAgICAgICAgICAgQVNDRU5ESU5HIH07IC8vY3JlYXRpb24gdGltZQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB0YXNrIHNvcnRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGFza1NvcnRlcigpIHsKLSAgICAgICAgcmVzZXRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gVmlld2VyU29ydGVyLgotICAgICAqLwotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBtYXJrZXJzLCBzb3J0aW5nIGZpcnN0IGJ5IHRoZSBtYWluIGNvbHVtbiBvZiB0aGlzIHNvcnRlciwKLSAgICAgKiB0aGVuIGJ5IHN1YnNlcXVlbnQgY29sdW1ucywgZGVwZW5kaW5nIG9uIHRoZSBjb2x1bW4gc29ydCBvcmRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLSAgICAgICAgSU1hcmtlciBtMSA9IChJTWFya2VyKSBlMTsKLSAgICAgICAgSU1hcmtlciBtMiA9IChJTWFya2VyKSBlMjsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmVDb2x1bW5WYWx1ZShtMSwgbTIsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRvcFByaW9yaXR5KGludCBwcmlvcml0eSkgewotICAgICAgICBpZiAocHJpb3JpdHkgPCAwIHx8IHByaW9yaXR5ID49IHByaW9yaXRpZXMubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByaW9yaXRpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwcmlvcml0aWVzW2ldID09IHByaW9yaXR5KSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICByZXNldFN0YXRlKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL3NoaWZ0IHRoZSBhcnJheQotICAgICAgICBmb3IgKGludCBpID0gaW5kZXg7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgICAgIHByaW9yaXRpZXNbaV0gPSBwcmlvcml0aWVzW2kgLSAxXTsKLSAgICAgICAgfQotICAgICAgICBwcmlvcml0aWVzWzBdID0gcHJpb3JpdHk7Ci0gICAgICAgIGRpcmVjdGlvbnNbcHJpb3JpdHldID0gREVGQVVMVF9ESVJFQ1RJT05TW3ByaW9yaXR5XTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRvcFByaW9yaXR5KCkgewotICAgICAgICByZXR1cm4gcHJpb3JpdGllc1swXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50W10gZ2V0UHJpb3JpdGllcygpIHsKLSAgICAgICAgcmV0dXJuIHByaW9yaXRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VG9wUHJpb3JpdHlEaXJlY3Rpb24oaW50IGRpcmVjdGlvbikgewotICAgICAgICBpZiAoZGlyZWN0aW9uID09IERFRkFVTFRfRElSRUNUSU9OKQotICAgICAgICAgICAgZGlyZWN0aW9uc1twcmlvcml0aWVzWzBdXSA9IERFRkFVTFRfRElSRUNUSU9OU1twcmlvcml0aWVzWzBdXTsKLSAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IEFTQ0VORElORyB8fCBkaXJlY3Rpb24gPT0gREVTQ0VORElORykKLSAgICAgICAgICAgIGRpcmVjdGlvbnNbcHJpb3JpdGllc1swXV0gPSBkaXJlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUb3BQcmlvcml0eURpcmVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRpcmVjdGlvbnNbcHJpb3JpdGllc1swXV07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2ZXJzZVRvcFByaW9yaXR5KCkgewotICAgICAgICBkaXJlY3Rpb25zW3ByaW9yaXRpZXNbMF1dICo9IC0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0U3RhdGUoKSB7Ci0gICAgICAgIHByaW9yaXRpZXMgPSBuZXcgaW50W0RFRkFVTFRfUFJJT1JJVElFUy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KERFRkFVTFRfUFJJT1JJVElFUywgMCwgcHJpb3JpdGllcywgMCwKLSAgICAgICAgICAgICAgICBwcmlvcml0aWVzLmxlbmd0aCk7Ci0gICAgICAgIGRpcmVjdGlvbnMgPSBuZXcgaW50W0RFRkFVTFRfRElSRUNUSU9OUy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KERFRkFVTFRfRElSRUNUSU9OUywgMCwgZGlyZWN0aW9ucywgMCwKLSAgICAgICAgICAgICAgICBkaXJlY3Rpb25zLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXJTb3J0ZXIuCi0gICAgICovCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIG1hcmtlcnMsIGJhc2VkIG9ubHkgb24gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGNvbXBhcmVDb2x1bW5WYWx1ZShJTWFya2VyIG0xLCBJTWFya2VyIG0yLCBpbnQgZGVwdGgpIHsKLSAgICAgICAgaWYgKGRlcHRoID49IHByaW9yaXRpZXMubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgaW50IGNvbHVtbk51bWJlciA9IHByaW9yaXRpZXNbZGVwdGhdOwotICAgICAgICBpbnQgZGlyZWN0aW9uID0gZGlyZWN0aW9uc1tjb2x1bW5OdW1iZXJdOwotICAgICAgICBzd2l0Y2ggKGNvbHVtbk51bWJlcikgewotICAgICAgICBjYXNlIFRZUEU6IHsKLSAgICAgICAgICAgIC8qIGNhdGVnb3J5ICovCi0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0Q2F0ZWdvcnlPcmRlcihtMSkgLSBnZXRDYXRlZ29yeU9yZGVyKG0yKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZUNvbHVtblZhbHVlKG0xLCBtMiwgZGVwdGggKyAxKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQgKiBkaXJlY3Rpb247Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDT01QTEVUSU9OOiB7Ci0gICAgICAgICAgICAvKiBjb21wbGV0ZWQgKi8KLSAgICAgICAgICAgIGludCByZXN1bHQgPSBnZXRDb21wbGV0ZWRPcmRlcihtMSkgLSBnZXRDb21wbGV0ZWRPcmRlcihtMik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVDb2x1bW5WYWx1ZShtMSwgbTIsIGRlcHRoICsgMSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICogZGlyZWN0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgUFJJT1JJVFk6IHsKLSAgICAgICAgICAgIC8qIHByaW9yaXR5ICovCi0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0UHJpb3JpdHlPcmRlcihtMSkgLSBnZXRQcmlvcml0eU9yZGVyKG0yKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZUNvbHVtblZhbHVlKG0xLCBtMiwgZGVwdGggKyAxKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQgKiBkaXJlY3Rpb247Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBERVNDUklQVElPTjogewotICAgICAgICAgICAgLyogZGVzY3JpcHRpb24gKi8KLSAgICAgICAgICAgIGludCByZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKE1hcmtlclV0aWwuZ2V0TWVzc2FnZShtMSksIE1hcmtlclV0aWwKLSAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UobTIpKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZUNvbHVtblZhbHVlKG0xLCBtMiwgZGVwdGggKyAxKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQgKiBkaXJlY3Rpb247Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBSRVNPVVJDRTogewotICAgICAgICAgICAgLyogcmVzb3VyY2UgbmFtZSAqLwotICAgICAgICAgICAgSVJlc291cmNlIHIxID0gbTEuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgIElSZXNvdXJjZSByMiA9IG0yLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbjEgPSByMS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbjIgPSByMi5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShuMSwgbjIpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlQ29sdW1uVmFsdWUobTEsIG0yLCBkZXB0aCArIDEpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIGRpcmVjdGlvbjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPTERFUjogewotICAgICAgICAgICAgLyogY29udGFpbmVyIG5hbWUgKi8KLSAgICAgICAgICAgIFN0cmluZyBjMSA9IE1hcmtlclV0aWwuZ2V0Q29udGFpbmVyTmFtZShtMSk7Ci0gICAgICAgICAgICBTdHJpbmcgYzIgPSBNYXJrZXJVdGlsLmdldENvbnRhaW5lck5hbWUobTIpOwotICAgICAgICAgICAgaW50IHJlc3VsdCA9IGMxLmVxdWFscyhjMikgPyAwIDogY29sbGF0b3IuY29tcGFyZShjMSwgYzIpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlQ29sdW1uVmFsdWUobTEsIG0yLCBkZXB0aCArIDEpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIGRpcmVjdGlvbjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIExPQ0FUSU9OOiB7Ci0gICAgICAgICAgICAvKiBsaW5lIGFuZCBsb2NhdGlvbiAqLwotICAgICAgICAgICAgaW50IHJlc3VsdCA9IGNvbXBhcmVMaW5lQW5kTG9jYXRpb24obTEsIG0yKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZUNvbHVtblZhbHVlKG0xLCBtMiwgZGVwdGggKyAxKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQgKiBkaXJlY3Rpb247Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDUkVBVElPTl9USU1FOiB7Ci0gICAgICAgICAgICAvKiBjcmVhdGlvbiB0aW1lICovCi0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gY29tcGFyZUNyZWF0aW9uVGltZShtMSwgbTIpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlQ29sdW1uVmFsdWUobTEsIG0yLCBkZXB0aCArIDEpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIGRpcmVjdGlvbjsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgY3JlYXRpb24gdGltZSBvZiB0d28gbWFya2Vycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBjb21wYXJlQ3JlYXRpb25UaW1lKElNYXJrZXIgbTEsIElNYXJrZXIgbTIpIHsKLSAgICAgICAgbG9uZyByZXN1bHQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBtMS5nZXRDcmVhdGlvblRpbWUoKSAtIG0yLmdldENyZWF0aW9uVGltZSgpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA+IDApCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgZWxzZSBpZiAocmVzdWx0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIGxpbmUgbnVtYmVyIGFuZCBsb2NhdGlvbiBvZiB0aGUgdHdvIG1hcmtlcnMuCi0gICAgICogSWYgbGluZSBudW1iZXIgaXMgc3BlY2lmaWVkIGZvciBib3RoLCB0aGlzIHNvcnRzIGZpcnN0IGJ5IGxpbmUgbnVtYmVyIChudW1lcmljYWxseSksIAotICAgICAqIHRoZW4gYnkgc3RhcnQgb2Zmc2V0IChudW1lcmljYWxseSksIHRoZW4gYnkgbG9jYXRpb24gKHRleHR1YWxseSkuCi0gICAgICogSWYgbGluZSBudW1iZXIgaXMgbm90IHNwZWNpZmllZCBmb3IgZWl0aGVyLCB0aGlzIHNvcnRzIGJ5IGxvY2F0aW9uLgotICAgICAqIE90aGVyd2lzZSwgaWYgb25seSBvbmUgaGFzIGEgbGluZSBudW1iZXIsIHRoaXMgc29ydHMgYnkgdGhlIGNvbWJpbmVkIHRleHQgZm9yIGxpbmUgbnVtYmVyIGFuZCBsb2NhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBjb21wYXJlTGluZUFuZExvY2F0aW9uKElNYXJrZXIgbTEsIElNYXJrZXIgbTIpIHsKLSAgICAgICAgaW50IGxpbmUxID0gTWFya2VyVXRpbC5nZXRMaW5lTnVtYmVyKG0xKTsKLSAgICAgICAgaW50IGxpbmUyID0gTWFya2VyVXRpbC5nZXRMaW5lTnVtYmVyKG0yKTsKLSAgICAgICAgaWYgKGxpbmUxICE9IC0xICYmIGxpbmUyICE9IC0xKSB7Ci0gICAgICAgICAgICBpZiAobGluZTEgIT0gbGluZTIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGluZTEgLSBsaW5lMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzdGFydDEgPSBNYXJrZXJVdGlsLmdldENoYXJTdGFydChtMSk7Ci0gICAgICAgICAgICBpbnQgc3RhcnQyID0gTWFya2VyVXRpbC5nZXRDaGFyU3RhcnQobTIpOwotICAgICAgICAgICAgaWYgKHN0YXJ0MSAhPSAtMSAmJiBzdGFydDIgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQxICE9IHN0YXJ0MikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQxIC0gc3RhcnQyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBsb2MxID0gTWFya2VyVXRpbC5nZXRMb2NhdGlvbihtMSk7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jMiA9IE1hcmtlclV0aWwuZ2V0TG9jYXRpb24obTIpOwotICAgICAgICAgICAgcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobG9jMSwgbG9jMik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxpbmUxID09IC0xICYmIGxpbmUyID09IC0xKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jMSA9IE1hcmtlclV0aWwuZ2V0TG9jYXRpb24obTEpOwotICAgICAgICAgICAgU3RyaW5nIGxvYzIgPSBNYXJrZXJVdGlsLmdldExvY2F0aW9uKG0yKTsKLSAgICAgICAgICAgIHJldHVybiBjb2xsYXRvci5jb21wYXJlKGxvYzEsIGxvYzIpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBsb2MxID0gTWFya2VyVXRpbC5nZXRMaW5lQW5kTG9jYXRpb24obTEpOwotICAgICAgICBTdHJpbmcgbG9jMiA9IE1hcmtlclV0aWwuZ2V0TGluZUFuZExvY2F0aW9uKG0yKTsKLSAgICAgICAgcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobG9jMSwgbG9jMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc29ydCBvcmRlciBmb3IgdGhlIGdpdmVuIG1hcmtlciBiYXNlZCBvbiBpdHMgY2F0ZWdvcnkuCi0gICAgICogTG93ZXIgbnVtYmVycyBhcHBlYXIgZmlyc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q2F0ZWdvcnlPcmRlcihJTWFya2VyIG1hcmtlcikgewotICAgICAgICBpZiAoTWFya2VyVXRpbC5pc01hcmtlclR5cGUobWFya2VyLCBJTWFya2VyLlBST0JMRU0pKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKE1hcmtlclV0aWwuZ2V0U2V2ZXJpdHkobWFya2VyKSkgewotICAgICAgICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOgotICAgICAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfSU5GTzoKLSAgICAgICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChNYXJrZXJVdGlsLmlzTWFya2VyVHlwZShtYXJrZXIsIElNYXJrZXIuVEFTSykpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAxMDAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNvcnQgb3JkZXIgZm9yIHRoZSBnaXZlbiBtYXJrZXIgYmFzZWQgb24gaXRzIGNvbXBsZXRpb24gc3RhdHVzLgotICAgICAqIExvd2VyIG51bWJlcnMgYXBwZWFyIGZpcnN0LgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldENvbXBsZXRlZE9yZGVyKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIGlmIChNYXJrZXJVdGlsLmlzTWFya2VyVHlwZShtYXJrZXIsIElNYXJrZXIuVEFTSykpCi0gICAgICAgICAgICByZXR1cm4gTWFya2VyVXRpbC5pc0NvbXBsZXRlKG1hcmtlcikgPyAyIDogMTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc29ydCBvcmRlciBmb3IgdGhlIGdpdmVuIG1hcmtlciBiYXNlZCBvbiBpdHMgcHJpb3JpdHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UHJpb3JpdHlPcmRlcihJTWFya2VyIG1hcmtlcikgewotICAgICAgICBpZiAoTWFya2VyVXRpbC5pc01hcmtlclR5cGUobWFya2VyLCBJTWFya2VyLlRBU0spKQotICAgICAgICAgICAgcmV0dXJuIE1hcmtlclV0aWwuZ2V0UHJpb3JpdHkobWFya2VyKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLSAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzZXR0aW5ncy5wdXQoImRpcmVjdGlvbiIgKyBpLCBkaXJlY3Rpb25zW2ldKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzZXR0aW5ncy5wdXQoInByaW9yaXR5IiArIGksIHByaW9yaXRpZXNbaV0pOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLSAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJpb3JpdGllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGRpcmVjdGlvbnNbaV0gPSBzZXR0aW5ncy5nZXRJbnQoImRpcmVjdGlvbiIgKyBpKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcHJpb3JpdGllc1tpXSA9IHNldHRpbmdzLmdldEludCgicHJpb3JpdHkiICsgaSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmVzZXRTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvVGFza3NGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9UYXNrc0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzVkNGIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9UYXNrc0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotICogCQlDYWdhdGF5IEthdnVrY3VvZ2x1IDxjYWdhdGF5a0BhY20ub3JnPiAtIEZpbHRlciBmb3IgbWFya2VycyBpbiBzYW1lIHByb2plY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnRhc2tsaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUNvbnRhaW5tZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotY2xhc3MgVGFza3NGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgaW1wbGVtZW50cyBDbG9uZWFibGUgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBST09UX1RZUEVTID0gbmV3IFN0cmluZ1tdIHsgSU1hcmtlci5QUk9CTEVNLAotICAgICAgICAgICAgSU1hcmtlci5UQVNLIH07Ci0KLSAgICAvLyBGaWx0ZXIgb24gcmVzb3VyY2UgY29uc3RhbnRzCi0gICAgc3RhdGljIGZpbmFsIGludCBPTl9BTllfUkVTT1VSQ0UgPSAwOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBPTl9TRUxFQ1RFRF9SRVNPVVJDRV9PTkxZID0gMTsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgT05fU0VMRUNURURfUkVTT1VSQ0VfQU5EX0NISUxEUkVOID0gMjsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgT05fQU5ZX1JFU09VUkNFX09GX1NBTUVfUFJPSkVDVCA9IDM7IC8vIGFkZGVkIGJ5IGNhZ2F0YXlrQGFjbS5vcmcKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgT05fV09SS0lOR19TRVQgPSA0OwotCi0gICAgLy8gRGVzY3JpcHRpb24gZmlsdGVyIGtpbmQgY29uc3RhbnRzCi0gICAgc3RhdGljIGZpbmFsIGludCBGSUxURVJfQ09OVEFJTlMgPSAwOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBGSUxURVJfRE9FU19OT1RfQ09OVEFJTiA9IDE7Ci0KLSAgICAvL2ZpbmFsIHN0YXRpYyBpbnQgTUlOSU1VTV9NQVJLRVJfTElNSVQgPSAxMDsKLSAgICBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfTUFSS0VSX0xJTUlUID0gMjAwMDsKLQotICAgIC8vZmluYWwgc3RhdGljIGludCBNQVhJTVVNX01BUktFUl9MSU1JVCA9IDIwMDAwOwotCi0gICAgU3RyaW5nW10gdHlwZXM7Ci0KLSAgICBpbnQgb25SZXNvdXJjZTsKLQotICAgIElXb3JraW5nU2V0IHdvcmtpbmdTZXQ7Ci0KLSAgICBib29sZWFuIGZpbHRlck9uRGVzY3JpcHRpb247Ci0KLSAgICBpbnQgZGVzY3JpcHRpb25GaWx0ZXJLaW5kOwotCi0gICAgU3RyaW5nIGRlc2NyaXB0aW9uRmlsdGVyOwotCi0gICAgYm9vbGVhbiBmaWx0ZXJPblNldmVyaXR5OwotCi0gICAgaW50IHNldmVyaXR5RmlsdGVyOwotCi0gICAgYm9vbGVhbiBmaWx0ZXJPblByaW9yaXR5OwotCi0gICAgaW50IHByaW9yaXR5RmlsdGVyOwotCi0gICAgYm9vbGVhbiBmaWx0ZXJPbkNvbXBsZXRpb247Ci0KLSAgICBpbnQgY29tcGxldGlvbkZpbHRlcjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJPbk1hcmtlckxpbWl0ID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgaW50IG1hcmtlckxpbWl0ID0gREVGQVVMVF9NQVJLRVJfTElNSVQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09OX1JFU09VUkNFID0gIm9uUmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1dPUktJTkdfU0VUID0gIndvcmtpbmdTZXQiOyAvLyROT04tTkxTLTEkCQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19GSUxURVJfT05fREVTQ1JJUFRJT04gPSAiZmlsdGVyT25EZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVTQ1JJUFRJT05fRklMVEVSX0tJTkQgPSAiZGVzY3JpcHRpb25GaWx0ZXJLaW5kIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19ERVNDUklQVElPTl9GSUxURVIgPSAiZGVzY3JpcHRpb25GaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0ZJTFRFUl9PTl9TRVZFUklUWSA9ICJmaWx0ZXJPblNldmVyaXR5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TRVZFUklUWV9GSUxURVIgPSAic2V2ZXJpdHlGaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0ZJTFRFUl9PTl9QUklPUklUWSA9ICJmaWx0ZXJPblByaW9yaXR5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUklPUklUWV9GSUxURVIgPSAicHJpb3JpdHlGaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0ZJTFRFUl9PTl9DT01QTEVUSU9OID0gImZpbHRlck9uQ29tcGxldGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09NUExFVElPTl9GSUxURVIgPSAiY29tcGxldGlvbkZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRklMVEVSX09OX01BUktFUl9MSU1JVCA9ICJmaWx0ZXJPbk1hcmtlckxpbWl0IjsgLy8kTk9OLU5MUy0xJCAKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTUFSS0VSX0xJTUlUID0gIm1hcmtlckxpbWl0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIFRhc2tzRmlsdGVyKCkgewotICAgICAgICByZXNldCgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gZ2V0RmlsdGVyT25NYXJrZXJMaW1pdCgpIHsKLSAgICAgICAgcmV0dXJuIGZpbHRlck9uTWFya2VyTGltaXQ7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRGaWx0ZXJPbk1hcmtlckxpbWl0KGJvb2xlYW4gZmlsdGVyT25NYXJrZXJMaW1pdCkgewotICAgICAgICB0aGlzLmZpbHRlck9uTWFya2VyTGltaXQgPSBmaWx0ZXJPbk1hcmtlckxpbWl0OwotICAgIH0KLQotICAgIGludCBnZXRNYXJrZXJMaW1pdCgpIHsKLSAgICAgICAgcmV0dXJuIG1hcmtlckxpbWl0OwotICAgIH0KLQotICAgIHZvaWQgc2V0TWFya2VyTGltaXQoaW50IG1hcmtlckxpbWl0KSB7Ci0gICAgICAgIGlmIChtYXJrZXJMaW1pdCA8IDEpIHsKLSAgICAgICAgICAgIG1hcmtlckxpbWl0ID0gVGFza3NGaWx0ZXIuREVGQVVMVF9NQVJLRVJfTElNSVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2lmIChtYXJrZXJMaW1pdCA8IFRhc2tzRmlsdGVyLk1JTklNVU1fTUFSS0VSX0xJTUlUKSB7Ci0gICAgICAgIC8vCW1hcmtlckxpbWl0ID0gVGFza3NGaWx0ZXIuTUlOSU1VTV9NQVJLRVJfTElNSVQ7Ci0gICAgICAgIC8vfSBlbHNlIGlmIChtYXJrZXJMaW1pdCA+IFRhc2tzRmlsdGVyLk1BWElNVU1fTUFSS0VSX0xJTUlUKSB7Ci0gICAgICAgIC8vCW1hcmtlckxpbWl0ID0gVGFza3NGaWx0ZXIuTUFYSU1VTV9NQVJLRVJfTElNSVQ7Ci0gICAgICAgIC8vfSAKLQotICAgICAgICB0aGlzLm1hcmtlckxpbWl0ID0gbWFya2VyTGltaXQ7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBjaGVja0Rlc2NyaXB0aW9uKFN0cmluZyBkZXNjKSB7Ci0gICAgICAgIGlmIChkZXNjID09IG51bGwpIHsgLy8gYmUgcGFyYW5vaWQKLSAgICAgICAgICAgIGRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gY29udGFpbnMgPSBjb250YWluc1N1YnN0cmluZyhkZXNjLCBkZXNjcmlwdGlvbkZpbHRlcik7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbkZpbHRlcktpbmQgPT0gRklMVEVSX0NPTlRBSU5TID8gY29udGFpbnMgOiAhY29udGFpbnM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOwotICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsgLy8gc2hvdWxkbid0IGhhcHBlbgotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBjb250YWluc1N1YnN0cmluZyhTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3Vic3RyaW5nKSB7Ci0gICAgICAgIGludCBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0gICAgICAgIGludCBzdWJMZW4gPSBzdWJzdHJpbmcubGVuZ3RoKCk7Ci0gICAgICAgIGludCBsZW4gPSBzdHJMZW4gLSBzdWJMZW47Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGxlbjsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoc3RyaW5nLnJlZ2lvbk1hdGNoZXModHJ1ZSwgaSwgc3Vic3RyaW5nLCAwLCBzdWJMZW4pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIGdpdmVuIHJlc291cmNlIGlzIGVuY2xvc2VkIGJ5IGEgd29ya2luZyBzZXQgZWxlbWVudC4KLSAgICAgKiBUaGUgSUNvbnRhaW5tZW50QWRhcHRlciBvZiBlYWNoIHdvcmtpbmcgc2V0IGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlCi0gICAgICogY29udGFpbm1lbnQgdGVzdC4gSWYgdGhlcmUgaXMgbm8gSUNvbnRhaW5tZW50QWRhcHRlciBmb3IgYSB3b3JraW5nIAotICAgICAqIHNldCBlbGVtZW50LCBhIHNpbXBsZSByZXNvdXJjZSBiYXNlZCB0ZXN0IGlzIHVzZWQuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IHJlc291cmNlIHRvIHRlc3QgZm9yIGVuY2xvc3VyZSBieSBhIHdvcmtpbmcgc2V0Ci0gICAgICogCWVsZW1lbnQgCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgaXMgZW5jbG9zZWQgYnkgYSB3b3JraW5nIHNldCBlbGVtZW50IGFuZCAKLSAgICAgKiAJZmFsc2Ugb3RoZXJ3aXNlLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbmNsb3NlZChJUmVzb3VyY2UgZWxlbWVudCkgewotICAgICAgICBJUGF0aCBlbGVtZW50UGF0aCA9IGVsZW1lbnQuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgSUFkYXB0YWJsZVtdIHdvcmtpbmdTZXRFbGVtZW50cyA9IHdvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKTsKLQotICAgICAgICBpZiAoZWxlbWVudFBhdGguaXNFbXB0eSgpIHx8IGVsZW1lbnRQYXRoLmlzUm9vdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JraW5nU2V0RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElBZGFwdGFibGUgd29ya2luZ1NldEVsZW1lbnQgPSB3b3JraW5nU2V0RWxlbWVudHNbaV07Ci0gICAgICAgICAgICBJQ29udGFpbm1lbnRBZGFwdGVyIGNvbnRhaW5tZW50QWRhcHRlciA9IChJQ29udGFpbm1lbnRBZGFwdGVyKSB3b3JraW5nU2V0RWxlbWVudAotICAgICAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJQ29udGFpbm1lbnRBZGFwdGVyLmNsYXNzKTsKLQotICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gSUNvbnRhaW5tZW50QWRhcHRlciBkZWZpbmVkIGZvciB0aGUgd29ya2luZyAgCi0gICAgICAgICAgICAvLyBzZXQgZWxlbWVudCB0eXBlIGZhbGwgYmFjayB0byB1c2luZyByZXNvdXJjZSBiYXNlZCAgCi0gICAgICAgICAgICAvLyBjb250YWlubWVudCBjaGVjayAKLSAgICAgICAgICAgIGlmIChjb250YWlubWVudEFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjb250YWlubWVudEFkYXB0ZXIuY29udGFpbnMod29ya2luZ1NldEVsZW1lbnQsIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBJQ29udGFpbm1lbnRBZGFwdGVyLkNIRUNLX0NPTlRFWFQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJQ29udGFpbm1lbnRBZGFwdGVyLkNIRUNLX0lGX0NISUxECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUNvbnRhaW5tZW50QWRhcHRlci5DSEVDS19JRl9ERVNDRU5EQU5UKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRW5jbG9zZWRSZXNvdXJjZShlbGVtZW50LCBlbGVtZW50UGF0aCwKLSAgICAgICAgICAgICAgICAgICAgd29ya2luZ1NldEVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIGdpdmVuIHJlc291cmNlIGlzIGVuY2xvc2VkIGJ5IGEgd29ya2luZyBzZXQgZWxlbWVudC4KLSAgICAgKiBBIHJlc291cmNlIGlzIGVuY2xvc2VkIGlmIGl0IGlzIGVpdGhlciBhIHBhcmVudCBvZiBhIHdvcmtpbmcgc2V0IAotICAgICAqIGVsZW1lbnQsIGEgY2hpbGQgb2YgYSB3b3JraW5nIHNldCBlbGVtZW50IG9yIGEgd29ya2luZyBzZXQgZWxlbWVudAotICAgICAqIGl0c2VsZi4KLSAgICAgKiBTaW1wbGUgcGF0aCBjb21wYXJpc29uIGlzIHVzZWQuIFRoaXMgaXMgb25seSBndWFyYW50ZWVkIHRvIHJldHVybgotICAgICAqIGNvcnJlY3QgcmVzdWx0cyBmb3IgcmVzb3VyY2Ugd29ya2luZyBzZXQgZWxlbWVudHMuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IHJlc291cmNlIHRvIHRlc3QgZm9yIGVuY2xvc3VyZSBieSBhIHdvcmtpbmcgc2V0Ci0gICAgICogCWVsZW1lbnQKLSAgICAgKiBAcGFyYW0gZWxlbWVudFBhdGggZnVsbCwgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZWxlbWVudCB0byB0ZXN0IAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlbGVtZW50IGlzIGVuY2xvc2VkIGJ5IGEgd29ya2luZyBzZXQgZWxlbWVudCBhbmQgCi0gICAgICogCWZhbHNlIG90aGVyd2lzZS4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRW5jbG9zZWRSZXNvdXJjZShJUmVzb3VyY2UgZWxlbWVudCwgSVBhdGggZWxlbWVudFBhdGgsCi0gICAgICAgICAgICBJQWRhcHRhYmxlIHdvcmtpbmdTZXRFbGVtZW50KSB7Ci0gICAgICAgIElSZXNvdXJjZSB3b3JraW5nU2V0UmVzb3VyY2UgPSBudWxsOwotCi0gICAgICAgIGlmICh3b3JraW5nU2V0RWxlbWVudC5lcXVhbHMoZWxlbWVudCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKHdvcmtpbmdTZXRFbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICB3b3JraW5nU2V0UmVzb3VyY2UgPSAoSVJlc291cmNlKSB3b3JraW5nU2V0RWxlbWVudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdvcmtpbmdTZXRSZXNvdXJjZSA9IChJUmVzb3VyY2UpIHdvcmtpbmdTZXRFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdvcmtpbmdTZXRSZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJUGF0aCByZXNvdXJjZVBhdGggPSB3b3JraW5nU2V0UmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZVBhdGguaXNQcmVmaXhPZihlbGVtZW50UGF0aCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICB0eXBlcyA9IFJPT1RfVFlQRVM7Ci0gICAgICAgIG9uUmVzb3VyY2UgPSBPTl9BTllfUkVTT1VSQ0U7Ci0gICAgICAgIGZpbHRlck9uRGVzY3JpcHRpb24gPSBmYWxzZTsKLSAgICAgICAgZGVzY3JpcHRpb25GaWx0ZXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaWx0ZXJPblNldmVyaXR5ID0gZmFsc2U7Ci0gICAgICAgIHNldmVyaXR5RmlsdGVyID0gMDsKLSAgICAgICAgZmlsdGVyT25Qcmlvcml0eSA9IGZhbHNlOwotICAgICAgICBwcmlvcml0eUZpbHRlciA9IDA7Ci0gICAgICAgIGZpbHRlck9uQ29tcGxldGlvbiA9IGZhbHNlOwotICAgICAgICBjb21wbGV0aW9uRmlsdGVyID0gMDsKLSAgICAgICAgZmlsdGVyT25NYXJrZXJMaW1pdCA9IHRydWU7Ci0gICAgICAgIG1hcmtlckxpbWl0ID0gREVGQVVMVF9NQVJLRVJfTElNSVQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUGVyc2lzdGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotICAgICAgICBJTWVtZW50byBjaGlsZHJlbltdID0gbWVtZW50by5nZXRDaGlsZHJlbihUQUdfVFlQRSk7Ci0gICAgICAgIHR5cGVzID0gbmV3IFN0cmluZ1tjaGlsZHJlbi5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0eXBlc1tpXSA9IGNoaWxkcmVuW2ldLmdldFN0cmluZyhUQUdfSUQpOwotICAgICAgICB9Ci0gICAgICAgIEludGVnZXIgaXZhbCA9IG1lbWVudG8uZ2V0SW50ZWdlcihUQUdfT05fUkVTT1VSQ0UpOwotICAgICAgICBvblJlc291cmNlID0gaXZhbCA9PSBudWxsID8gT05fQU5ZX1JFU09VUkNFIDogaXZhbC5pbnRWYWx1ZSgpOwotICAgICAgICByZXN0b3JlV29ya2luZ1NldChtZW1lbnRvLmdldFN0cmluZyhUQUdfV09SS0lOR19TRVQpKTsKLSAgICAgICAgaXZhbCA9IG1lbWVudG8uZ2V0SW50ZWdlcihUQUdfRklMVEVSX09OX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgZmlsdGVyT25EZXNjcmlwdGlvbiA9IGl2YWwgIT0gbnVsbCAmJiBpdmFsLmludFZhbHVlKCkgPT0gMTsKLSAgICAgICAgaXZhbCA9IG1lbWVudG8uZ2V0SW50ZWdlcihUQUdfREVTQ1JJUFRJT05fRklMVEVSX0tJTkQpOwotICAgICAgICBkZXNjcmlwdGlvbkZpbHRlcktpbmQgPSBpdmFsID09IG51bGwgPyBGSUxURVJfQ09OVEFJTlMgOiBpdmFsCi0gICAgICAgICAgICAgICAgLmludFZhbHVlKCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uRmlsdGVyID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX0RFU0NSSVBUSU9OX0ZJTFRFUik7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbkZpbHRlciA9PSBudWxsKQotICAgICAgICAgICAgZGVzY3JpcHRpb25GaWx0ZXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpdmFsID0gbWVtZW50by5nZXRJbnRlZ2VyKFRBR19GSUxURVJfT05fU0VWRVJJVFkpOwotICAgICAgICBmaWx0ZXJPblNldmVyaXR5ID0gaXZhbCAhPSBudWxsICYmIGl2YWwuaW50VmFsdWUoKSA9PSAxOwotICAgICAgICBpdmFsID0gbWVtZW50by5nZXRJbnRlZ2VyKFRBR19TRVZFUklUWV9GSUxURVIpOwotICAgICAgICBzZXZlcml0eUZpbHRlciA9IGl2YWwgPT0gbnVsbCA/IDAgOiBpdmFsLmludFZhbHVlKCk7Ci0gICAgICAgIGl2YWwgPSBtZW1lbnRvLmdldEludGVnZXIoVEFHX0ZJTFRFUl9PTl9QUklPUklUWSk7Ci0gICAgICAgIGZpbHRlck9uUHJpb3JpdHkgPSBpdmFsICE9IG51bGwgJiYgaXZhbC5pbnRWYWx1ZSgpID09IDE7Ci0gICAgICAgIGl2YWwgPSBtZW1lbnRvLmdldEludGVnZXIoVEFHX1BSSU9SSVRZX0ZJTFRFUik7Ci0gICAgICAgIHByaW9yaXR5RmlsdGVyID0gaXZhbCA9PSBudWxsID8gMCA6IGl2YWwuaW50VmFsdWUoKTsKLSAgICAgICAgaXZhbCA9IG1lbWVudG8uZ2V0SW50ZWdlcihUQUdfRklMVEVSX09OX0NPTVBMRVRJT04pOwotICAgICAgICBmaWx0ZXJPbkNvbXBsZXRpb24gPSBpdmFsICE9IG51bGwgJiYgaXZhbC5pbnRWYWx1ZSgpID09IDE7Ci0gICAgICAgIGl2YWwgPSBtZW1lbnRvLmdldEludGVnZXIoVEFHX0NPTVBMRVRJT05fRklMVEVSKTsKLSAgICAgICAgY29tcGxldGlvbkZpbHRlciA9IGl2YWwgPT0gbnVsbCA/IDAgOiBpdmFsLmludFZhbHVlKCk7Ci0gICAgICAgIGl2YWwgPSBtZW1lbnRvLmdldEludGVnZXIoVEFHX0ZJTFRFUl9PTl9NQVJLRVJfTElNSVQpOwotICAgICAgICBmaWx0ZXJPbk1hcmtlckxpbWl0ID0gaXZhbCA9PSBudWxsIHx8IGl2YWwuaW50VmFsdWUoKSA9PSAxOwotICAgICAgICBpdmFsID0gbWVtZW50by5nZXRJbnRlZ2VyKFRBR19NQVJLRVJfTElNSVQpOwotICAgICAgICBtYXJrZXJMaW1pdCA9IGl2YWwgPT0gbnVsbCA/IERFRkFVTFRfTUFSS0VSX0xJTUlUIDogaXZhbC5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmVzIHRoZSBzYXZlZCB3b3JraW5nIHNldCwgaWYgYW55LgotICAgICAqIAotICAgICAqIEBwYXJhbSB0aGUgc2F2ZWQgd29ya2luZyBzZXQgbmFtZSBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVXb3JraW5nU2V0KFN0cmluZyB3b3JraW5nU2V0TmFtZSkgewotICAgICAgICBpZiAod29ya2luZ1NldE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgSVdvcmtpbmdTZXRNYW5hZ2VyIHdvcmtpbmdTZXRNYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgICAgICAuZ2V0V29ya2luZ1NldE1hbmFnZXIoKTsKLSAgICAgICAgICAgIElXb3JraW5nU2V0IHdvcmtpbmdTZXQgPSB3b3JraW5nU2V0TWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAuZ2V0V29ya2luZ1NldCh3b3JraW5nU2V0TmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICh3b3JraW5nU2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLndvcmtpbmdTZXQgPSB3b3JraW5nU2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIG9iamVjdCBzdGF0ZSB3aXRoaW4gYSBtZW1lbnRvLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWVudG8gYSBtZW1lbnRvIHRvIHJlY2VpdmUgdGhlIG9iamVjdCBzdGF0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG1lbWVudG8uY3JlYXRlQ2hpbGQoVEFHX1RZUEUpLnB1dFN0cmluZyhUQUdfSUQsIHR5cGVzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBtZW1lbnRvLnB1dEludGVnZXIoVEFHX09OX1JFU09VUkNFLCBvblJlc291cmNlKTsKLSAgICAgICAgaWYgKHdvcmtpbmdTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVtZW50by5wdXRTdHJpbmcoVEFHX1dPUktJTkdfU0VULCB3b3JraW5nU2V0LmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtZW50by5wdXRJbnRlZ2VyKFRBR19GSUxURVJfT05fREVTQ1JJUFRJT04sIGZpbHRlck9uRGVzY3JpcHRpb24gPyAxCi0gICAgICAgICAgICAgICAgOiAwKTsKLSAgICAgICAgbWVtZW50by5wdXRJbnRlZ2VyKFRBR19ERVNDUklQVElPTl9GSUxURVJfS0lORCwgZGVzY3JpcHRpb25GaWx0ZXJLaW5kKTsKLSAgICAgICAgbWVtZW50by5wdXRTdHJpbmcoVEFHX0RFU0NSSVBUSU9OX0ZJTFRFUiwgZGVzY3JpcHRpb25GaWx0ZXIpOwotICAgICAgICBtZW1lbnRvLnB1dEludGVnZXIoVEFHX0ZJTFRFUl9PTl9TRVZFUklUWSwgZmlsdGVyT25TZXZlcml0eSA/IDEgOiAwKTsKLSAgICAgICAgbWVtZW50by5wdXRJbnRlZ2VyKFRBR19TRVZFUklUWV9GSUxURVIsIHNldmVyaXR5RmlsdGVyKTsKLSAgICAgICAgbWVtZW50by5wdXRJbnRlZ2VyKFRBR19GSUxURVJfT05fUFJJT1JJVFksIGZpbHRlck9uUHJpb3JpdHkgPyAxIDogMCk7Ci0gICAgICAgIG1lbWVudG8ucHV0SW50ZWdlcihUQUdfUFJJT1JJVFlfRklMVEVSLCBwcmlvcml0eUZpbHRlcik7Ci0gICAgICAgIG1lbWVudG8KLSAgICAgICAgICAgICAgICAucHV0SW50ZWdlcihUQUdfRklMVEVSX09OX0NPTVBMRVRJT04sIGZpbHRlck9uQ29tcGxldGlvbiA/IDEKLSAgICAgICAgICAgICAgICAgICAgICAgIDogMCk7Ci0gICAgICAgIG1lbWVudG8ucHV0SW50ZWdlcihUQUdfQ09NUExFVElPTl9GSUxURVIsIGNvbXBsZXRpb25GaWx0ZXIpOwotICAgICAgICBtZW1lbnRvLnB1dEludGVnZXIoVEFHX0ZJTFRFUl9PTl9NQVJLRVJfTElNSVQsIGZpbHRlck9uTWFya2VyTGltaXQgPyAxCi0gICAgICAgICAgICAgICAgOiAwKTsKLSAgICAgICAgbWVtZW50by5wdXRJbnRlZ2VyKFRBR19NQVJLRVJfTElNSVQsIG1hcmtlckxpbWl0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3QoKElNYXJrZXIpIGVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChJTWFya2VyIG1hcmtlcikgewotICAgICAgICAvLyByZXNvdXJjZSBzZXR0aW5ncyBhcmUgaGFuZGxlZCBieSB0aGUgY29udGVudCBwcm92aWRlcgotICAgICAgICByZXR1cm4gc2VsZWN0QnlUeXBlKG1hcmtlcikgJiYgc2VsZWN0QnlBdHRyaWJ1dGVzKG1hcmtlcikKLSAgICAgICAgICAgICAgICAmJiBzZWxlY3RCeVdvcmtpbmdTZXQobWFya2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoSU1hcmtlckRlbHRhIG1hcmtlckRlbHRhKSB7Ci0gICAgICAgIC8vIHJlc291cmNlIHNldHRpbmdzIGFyZSBoYW5kbGVkIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyCi0gICAgICAgIHJldHVybiBzZWxlY3RCeVR5cGUobWFya2VyRGVsdGEpICYmIHNlbGVjdEJ5QXR0cmlidXRlcyhtYXJrZXJEZWx0YSkKLSAgICAgICAgICAgICAgICAmJiBzZWxlY3RCeVdvcmtpbmdTZXQobWFya2VyRGVsdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBzZWxlY3RCeVR5cGUoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgaWYgKE1hcmtlclV0aWwuaXNNYXJrZXJUeXBlKG1hcmtlciwgdHlwZXNbaV0pKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2VsZWN0QnlUeXBlKElNYXJrZXJEZWx0YSBtYXJrZXJEZWx0YSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAobWFya2VyRGVsdGEuaXNTdWJ0eXBlT2YodHlwZXNbaV0pKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtYXJrZXIgc2hvdWxkIGJlIGZpbHRlciBvdXQgb3Igbm90LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXJrZXIgdGhlIG1hcmtlciB0byB0ZXN0Ci0gICAgICogQHJldHVybiAKLSAgICAgKiAJdHJ1ZT10aGUgbWFya2VyIHNob3VsZCBub3QgYmUgZmlsdGVyZWQgb3V0Ci0gICAgICogCWZhbHNlPXRoZSBtYXJrZXIgc2hvdWxkIGJlIGZpbHRlcmVkIG91dAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZWxlY3RCeVdvcmtpbmdTZXQoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgaWYgKHdvcmtpbmdTZXQgPT0gbnVsbCB8fCBvblJlc291cmNlICE9IE9OX1dPUktJTkdfU0VUKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0VuY2xvc2VkKHJlc291cmNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWFya2VyIGRlbHRhIHNob3VsZCBiZSBmaWx0ZXIgb3V0IAotICAgICAqIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFya2VyRGVsdGEgdGhlIG1hcmtlciBkZWx0YSB0byB0ZXN0Ci0gICAgICogQHJldHVybiAKLSAgICAgKiAJdHJ1ZT10aGUgbWFya2VyIGRlbHRhIHNob3VsZCBub3QgYmUgZmlsdGVyZWQgb3V0Ci0gICAgICogCWZhbHNlPXRoZSBtYXJrZXIgZGVsdGEgc2hvdWxkIGJlIGZpbHRlcmVkIG91dAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZWxlY3RCeVdvcmtpbmdTZXQoSU1hcmtlckRlbHRhIG1hcmtlckRlbHRhKSB7Ci0gICAgICAgIGlmICh3b3JraW5nU2V0ID09IG51bGwgfHwgb25SZXNvdXJjZSAhPSBPTl9XT1JLSU5HX1NFVCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gbWFya2VyRGVsdGEuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0VuY2xvc2VkKHJlc291cmNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogCi0gICAgICogV0FSTklORzogc2VsZWN0QnlBdHRyaWJ1dGVzKElNYXJrZXIpIGFuZCBzZWxlY3RCeUF0dHJpYnV0ZXMoSU1hcmtlckRlbHRhKSBtdXN0IGNvcnJlc3BvbmQuCi0gICAgICovCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2VsZWN0QnlBdHRyaWJ1dGVzKElNYXJrZXIgbWFya2VyKSB7Ci0KLSAgICAgICAgLy8gc2V2ZXJpdHkgZmlsdGVyIGFwcGxpZXMgb25seSB0byBwcm9ibGVtcwotICAgICAgICBpZiAoZmlsdGVyT25TZXZlcml0eQotICAgICAgICAgICAgICAgICYmIE1hcmtlclV0aWwuaXNNYXJrZXJUeXBlKG1hcmtlciwgSU1hcmtlci5QUk9CTEVNKSkgewotICAgICAgICAgICAgaW50IHNldiA9IE1hcmtlclV0aWwuZ2V0U2V2ZXJpdHkobWFya2VyKTsKLSAgICAgICAgICAgIGlmICgoc2V2ZXJpdHlGaWx0ZXIgJiAoMSA8PCBzZXYpKSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByaW9yaXR5IGFuZCBjb21wbGV0aW9uIGZpbHRlcnMgYXBwbHkgb25seSB0byB0YXNrcwotICAgICAgICAvLyBhdm9pZCBkb2luZyB0eXBlIGNoZWNrIG1vcmUgdGhhbiBvbmNlCi0gICAgICAgIGlmICgoZmlsdGVyT25Qcmlvcml0eSB8fCBmaWx0ZXJPbkNvbXBsZXRpb24pCi0gICAgICAgICAgICAgICAgJiYgTWFya2VyVXRpbC5pc01hcmtlclR5cGUobWFya2VyLCBJTWFya2VyLlRBU0spKSB7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyT25Qcmlvcml0eSkgewotICAgICAgICAgICAgICAgIGludCBwcmkgPSBNYXJrZXJVdGlsLmdldFByaW9yaXR5KG1hcmtlcik7Ci0gICAgICAgICAgICAgICAgaWYgKChwcmlvcml0eUZpbHRlciAmICgxIDw8IHByaSkpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWx0ZXJPbkNvbXBsZXRpb24pIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGNvbXBsZXRlID0gTWFya2VyVXRpbC5pc0NvbXBsZXRlKG1hcmtlcik7Ci0gICAgICAgICAgICAgICAgaWYgKChjb21wbGV0aW9uRmlsdGVyICYgKGNvbXBsZXRlID8gMiA6IDEpKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZXNjcmlwdGlvbiBhcHBsaWVzIHRvIGFsbCBtYXJrZXJzCi0gICAgICAgIGlmIChmaWx0ZXJPbkRlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZGVzYyA9IE1hcmtlclV0aWwuZ2V0TWVzc2FnZShtYXJrZXIpOwotICAgICAgICAgICAgaWYgKCFjaGVja0Rlc2NyaXB0aW9uKGRlc2MpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2VsZWN0QnlBdHRyaWJ1dGVzKElNYXJrZXJEZWx0YSBtYXJrZXJEZWx0YSkgewotCi0gICAgICAgIC8vIHNldmVyaXR5IGZpbHRlciBhcHBsaWVzIG9ubHkgdG8gcHJvYmxlbXMKLSAgICAgICAgaWYgKGZpbHRlck9uU2V2ZXJpdHkgJiYgbWFya2VyRGVsdGEuaXNTdWJ0eXBlT2YoSU1hcmtlci5QUk9CTEVNKSkgewotICAgICAgICAgICAgaW50IHNldiA9IG1hcmtlckRlbHRhLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLAotICAgICAgICAgICAgICAgICAgICBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcpOwotICAgICAgICAgICAgaWYgKChzZXZlcml0eUZpbHRlciAmICgxIDw8IHNldikpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHJpb3JpdHkgYW5kIGNvbXBsZXRpb24gZmlsdGVycyBhcHBseSBvbmx5IHRvIHRhc2tzCi0gICAgICAgIC8vIGF2b2lkIGRvaW5nIHR5cGUgY2hlY2sgbW9yZSB0aGFuIG9uY2UKLSAgICAgICAgaWYgKChmaWx0ZXJPblByaW9yaXR5IHx8IGZpbHRlck9uQ29tcGxldGlvbikKLSAgICAgICAgICAgICAgICAmJiBtYXJrZXJEZWx0YS5pc1N1YnR5cGVPZihJTWFya2VyLlRBU0spKSB7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyT25Qcmlvcml0eSkgewotICAgICAgICAgICAgICAgIGludCBwcmkgPSBtYXJrZXJEZWx0YS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5QUklPUklUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElNYXJrZXIuUFJJT1JJVFlfTk9STUFMKTsKLSAgICAgICAgICAgICAgICBpZiAoKHByaW9yaXR5RmlsdGVyICYgKDEgPDwgcHJpKSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpbHRlck9uQ29tcGxldGlvbikgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gY29tcGxldGUgPSBtYXJrZXJEZWx0YQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShJTWFya2VyLkRPTkUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAoKGNvbXBsZXRpb25GaWx0ZXIgJiAoY29tcGxldGUgPyAyIDogMSkpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlc2NyaXB0aW9uIGFwcGxpZXMgdG8gYWxsIG1hcmtlcnMKLSAgICAgICAgaWYgKGZpbHRlck9uRGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgIFN0cmluZyBkZXNjID0gbWFya2VyRGVsdGEuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoIWNoZWNrRGVzY3JpcHRpb24oZGVzYykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZmlsdGVyIGlzIGluY2x1ZGluZyBhbGwgbWFya2Vycy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbHRlciBpbmNsdWRlcyBhbGwgbWFya2VycywgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZ0FsbCgpIHsKLSAgICAgICAgaWYgKGZpbHRlck9uRGVzY3JpcHRpb24gfHwgZmlsdGVyT25TZXZlcml0eSB8fCBmaWx0ZXJPblByaW9yaXR5Ci0gICAgICAgICAgICAgICAgfHwgZmlsdGVyT25Db21wbGV0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9uUmVzb3VyY2UgIT0gT05fQU5ZX1JFU09VUkNFKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QodHlwZXMpKTsKLSAgICAgICAgaWYgKHNldC5zaXplKCkgIT0gUk9PVF9UWVBFUy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJPT1RfVFlQRVMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGlmICghc2V0LmNvbnRhaW5zKFJPT1RfVFlQRVNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvdGFza2xpc3QvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGMxN2Y5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy90YXNrbGlzdC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIHN0YW5kYXJkIFRhc2sgTGlzdCB2aWV3IGZvciBkaXNwbGF5aW5nCi10YXNrcyBhbmQgcHJvYmxlbSBhbm5vdGF0aW9ucyBvbiByZXNvdXJjZXMuCi08YnI+Jm5ic3A7Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9kYXRhdHJhbnNmZXIvRXh0ZXJuYWxQcm9qZWN0SW1wb3J0V2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9kYXRhdHJhbnNmZXIvRXh0ZXJuYWxQcm9qZWN0SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjQ5MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL0V4dGVybmFsUHJvamVjdEltcG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2Zlck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLldpemFyZFByb2plY3RzSW1wb3J0UGFnZTsKLQotLyoqCi0gKiBTdGFuZGFyZCB3b3JrYmVuY2ggd2l6YXJkIGZvciBpbXBvcnRpbmcgcHJvamVjdHMgZGVmaW5lZAotICogb3V0c2lkZSBvZiB0aGUgY3VycmVudGx5IGRlZmluZWQgcHJvamVjdHMgaW50byBFY2xpcHNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgYW5kIHVzZWQgd2l0aG91dCBmdXJ0aGVyIGNvbmZpZ3VyYXRpb247Ci0gKiB0aGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogPHA+Ci0gKiBFeGFtcGxlOgotICogPHByZT4KLSAqIElXaXphcmQgd2l6YXJkID0gbmV3IEV4dGVybmFsUHJvamVjdEltcG9ydFdpemFyZCgpOwotICogd2l6YXJkLmluaXQod29ya2JlbmNoLCBzZWxlY3Rpb24pOwotICogV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0gKiBkaWFsb2cub3BlbigpOwotICogPC9wcmU+Ci0gKiBEdXJpbmcgdGhlIGNhbGwgdG8gPGNvZGU+b3BlbjwvY29kZT4sIHRoZSB3aXphcmQgZGlhbG9nIGlzIHByZXNlbnRlZCB0byB0aGUKLSAqIHVzZXIuIFdoZW4gdGhlIHVzZXIgaGl0cyBGaW5pc2gsIGEgcHJvamVjdCBpcyBjcmVhdGVkIHdpdGggdGhlIGxvY2F0aW9uCi0gKiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCi0gKiA8L3A+Ci0gKi8KLQotcHVibGljIGNsYXNzIEV4dGVybmFsUHJvamVjdEltcG9ydFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzCi0gICAgICAgIElJbXBvcnRXaXphcmQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9QUk9KRUNUX1NFQ1RJT04gPSAiRXh0ZXJuYWxQcm9qZWN0SW1wb3J0V2l6YXJkIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2UgbWFpblBhZ2U7Ci0JCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEV4dGVybmFsUHJvamVjdEltcG9ydFdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXh0ZXJuYWxQcm9qZWN0SW1wb3J0V2l6YXJkKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAJCS5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICAKLQkJSURpYWxvZ1NldHRpbmdzIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLQkJICAgICAgICAuZ2V0U2VjdGlvbihFWFRFUk5BTF9QUk9KRUNUX1NFQ1RJT04pOwotCQlpZiAod2l6YXJkU2V0dGluZ3MgPT0gbnVsbCkKLQkJICAgIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLQkJICAgICAgICAgICAgLmFkZE5ld1NlY3Rpb24oRVhURVJOQUxfUFJPSkVDVF9TRUNUSU9OKTsKLQkJc2V0RGlhbG9nU2V0dGluZ3Mod2l6YXJkU2V0dGluZ3MpOyAgICAgICAgCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotICAgICAgICBzdXBlci5hZGRQYWdlcygpOwotICAgICAgICBtYWluUGFnZSA9IG5ldyBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2UoKTsKLSAgICAgICAgYWRkUGFnZShtYWluUGFnZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24pIHsKLSAgICAgICAgc2V0V2luZG93VGl0bGUoRGF0YVRyYW5zZmVyTWVzc2FnZXMuRGF0YVRyYW5zZmVyX2ltcG9ydFRpdGxlKTsKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoCi0JCQkJSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigid2l6YmFuL2ltcG9ydHByb2pfd2l6LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotICAgICAgICByZXR1cm4gbWFpblBhZ2UuY3JlYXRlUHJvamVjdHMoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL2RhdGF0cmFuc2Zlci9GaWxlU3RvcmVTdHJ1Y3R1cmVQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL0ZpbGVTdG9yZVN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NzIyZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL0ZpbGVTdG9yZVN0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogRmlsZVN0b3JlU3RydWN0dXJlUHJvdmlkZXIgaXMgdGhlIHN0cnVjdHVyZSBwcm92aWRlciBmb3Ige0BsaW5rIElGaWxlU3RvcmV9Ci0gKiBiYXNlZCBmaWxlIHN0cnVjdHVyZXMuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRmlsZVN0b3JlU3RydWN0dXJlUHJvdmlkZXIgaW1wbGVtZW50cyBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgewotCi0JLyoqCi0JICogSG9sZHMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIEZpbGVTdG9yZVN0cnVjdHVyZVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEZpbGVTdG9yZVN0cnVjdHVyZVByb3ZpZGVyKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLklJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCgoKElGaWxlU3RvcmUpIGVsZW1lbnQpLmNoaWxkU3RvcmVzKEVGUy5OT05FLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlsb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvZ0V4Y2VwdGlvbihDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlJREVXb3JrYmVuY2hQbHVnaW4ubG9nKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLklJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciNnZXRDb250ZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cyhPYmplY3QgZWxlbWVudCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUZpbGVTdG9yZSkgZWxlbWVudCkub3BlbklucHV0U3RyZWFtKEVGUy5OT05FLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLklJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciNnZXRGdWxsUGF0aChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFBhdGgoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuICgoSUZpbGVTdG9yZSkgZWxlbWVudCkudG9VUkkoKS5nZXRSYXdQYXRoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIjZ2V0TGFiZWwoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoKElGaWxlU3RvcmUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLklJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciNpc0ZvbGRlcihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9sZGVyKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoKElGaWxlU3RvcmUpIGVsZW1lbnQpLmZldGNoSW5mbygpLmlzRGlyZWN0b3J5KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9kYXRhdHJhbnNmZXIvRmlsZVN5c3RlbUV4cG9ydFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL0ZpbGVTeXN0ZW1FeHBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgzZWU4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9kYXRhdHJhbnNmZXIvRmlsZVN5c3RlbUV4cG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2Zlci5EYXRhVHJhbnNmZXJNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2Zlci5XaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VFeHBvcnRQYWdlMTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBTdGFuZGFyZCB3b3JrYmVuY2ggd2l6YXJkIGZvciBleHBvcnRpbmcgcmVzb3VyY2VzIGZyb20gdGhlIHdvcmtzcGFjZQotICogdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgYW5kIHVzZWQgd2l0aG91dCBmdXJ0aGVyIGNvbmZpZ3VyYXRpb247Ci0gKiB0aGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogPHA+Ci0gKiBFeGFtcGxlOgotICogPHByZT4KLSAqIElXaXphcmQgd2l6YXJkID0gbmV3IEZpbGVTeXN0ZW1FeHBvcnRXaXphcmQoKTsKLSAqIHdpemFyZC5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLSAqIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotICogZGlhbG9nLm9wZW4oKTsKLSAqIDwvcHJlPgotICogRHVyaW5nIHRoZSBjYWxsIHRvIDxjb2RlPm9wZW48L2NvZGU+LCB0aGUgd2l6YXJkIGRpYWxvZyBpcyBwcmVzZW50ZWQgdG8gdGhlCi0gKiB1c2VyLiBXaGVuIHRoZSB1c2VyIGhpdHMgRmluaXNoLCB0aGUgdXNlci1zZWxlY3RlZCB3b3Jrc3BhY2UgcmVzb3VyY2VzIAotICogYXJlIGV4cG9ydGVkIHRvIHRoZSB1c2VyLXNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0sCi0gKiB0aGUgZGlhbG9nIGNsb3NlcywgYW5kIHRoZSBjYWxsIHRvIDxjb2RlPm9wZW48L2NvZGU+IHJldHVybnMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlU3lzdGVtRXhwb3J0V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUV4cG9ydFdpemFyZCB7Ci0gICAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgICBwcml2YXRlIFdpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUV4cG9ydFBhZ2UxIG1haW5QYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHdpemFyZCBmb3IgZXhwb3J0aW5nIHdvcmtzcGFjZSByZXNvdXJjZXMgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlU3lzdGVtRXhwb3J0V2l6YXJkKCkgewotICAgICAgICBBYnN0cmFjdFVJUGx1Z2luIHBsdWdpbiA9IChBYnN0cmFjdFVJUGx1Z2luKSBQbGF0Zm9ybQotICAgICAgICAgICAgICAgIC5nZXRQbHVnaW4oUGxhdGZvcm1VSS5QTFVHSU5fSUQpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBwbHVnaW4uZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uKCJGaWxlU3lzdGVtRXhwb3J0V2l6YXJkIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoc2VjdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgc2VjdGlvbiA9IHdvcmtiZW5jaFNldHRpbmdzLmFkZE5ld1NlY3Rpb24oIkZpbGVTeXN0ZW1FeHBvcnRXaXphcmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHNldERpYWxvZ1NldHRpbmdzKHNlY3Rpb24pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLSAgICAgICAgc3VwZXIuYWRkUGFnZXMoKTsKLSAgICAgICAgbWFpblBhZ2UgPSBuZXcgV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlRXhwb3J0UGFnZTEoc2VsZWN0aW9uKTsKLSAgICAgICAgYWRkUGFnZShtYWluUGFnZSk7Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbikgewotICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247Ci0gICAgICAgIExpc3Qgc2VsZWN0ZWRSZXNvdXJjZXMgPSBJREUuY29tcHV0ZVNlbGVjdGVkUmVzb3VyY2VzKGN1cnJlbnRTZWxlY3Rpb24pOwotICAgICAgICBpZiAoIXNlbGVjdGVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZFJlc291cmNlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb29rIGl0IHVwIGlmIGN1cnJlbnQgc2VsZWN0aW9uIChhZnRlciByZXNvdXJjZSBhZGFwdGluZykgaXMgZW1wdHkKLSAgICAgICAgaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgIGlmIChwYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJRWRpdG9yUGFydCBjdXJyZW50RWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZWxlY3RlZFJlc291cmNlID0gY3VycmVudEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkUmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRSZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRXaW5kb3dUaXRsZShEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfZXhwb3J0KTsKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigid2l6YmFuL2V4cG9ydGRpcl93aXouZ2lmIikpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiBtYWluUGFnZS5maW5pc2goKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9kYXRhdHJhbnNmZXIvRmlsZVN5c3RlbUltcG9ydFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL0ZpbGVTeXN0ZW1JbXBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2NzQyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9kYXRhdHJhbnNmZXIvRmlsZVN5c3RlbUltcG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2Zlck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLldpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUltcG9ydFBhZ2UxOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFN0YW5kYXJkIHdvcmtiZW5jaCB3aXphcmQgZm9yIGltcG9ydGluZyByZXNvdXJjZXMgZnJvbSB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0KLSAqIGludG8gdGhlIHdvcmtzcGFjZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIGFuZCB1c2VkIHdpdGhvdXQgZnVydGhlciBjb25maWd1cmF0aW9uOwotICogdGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogRXhhbXBsZToKLSAqIDxwcmU+Ci0gKiBJV2l6YXJkIHdpemFyZCA9IG5ldyBGaWxlU3lzdGVtSW1wb3J0V2l6YXJkKCk7Ci0gKiB3aXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0gKiBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAqIGRpYWxvZy5vcGVuKCk7Ci0gKiA8L3ByZT4KLSAqIER1cmluZyB0aGUgY2FsbCB0byA8Y29kZT5vcGVuPC9jb2RlPiwgdGhlIHdpemFyZCBkaWFsb2cgaXMgcHJlc2VudGVkIHRvIHRoZQotICogdXNlci4gV2hlbiB0aGUgdXNlciBoaXRzIEZpbmlzaCwgdGhlIHVzZXItc2VsZWN0ZWQgZmlsZXMgYXJlIGltcG9ydGVkCi0gKiBpbnRvIHRoZSB3b3Jrc3BhY2UsIHRoZSBkaWFsb2cgY2xvc2VzLCBhbmQgdGhlIGNhbGwgdG8gPGNvZGU+b3BlbjwvY29kZT4KLSAqIHJldHVybnMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlU3lzdGVtSW1wb3J0V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotICAgIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gICAgcHJpdmF0ZSBXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMSBtYWluUGFnZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB3aXphcmQgZm9yIGltcG9ydGluZyByZXNvdXJjZXMgaW50byB0aGUgd29ya3NwYWNlIGZyb20KLSAgICAgKiB0aGUgZmlsZSBzeXN0ZW0uCi0gICAgICovCi0gICAgcHVibGljIEZpbGVTeXN0ZW1JbXBvcnRXaXphcmQoKSB7Ci0gICAgICAgIEFic3RyYWN0VUlQbHVnaW4gcGx1Z2luID0gKEFic3RyYWN0VUlQbHVnaW4pIFBsYXRmb3JtCi0gICAgICAgICAgICAgICAgLmdldFBsdWdpbihQbGF0Zm9ybVVJLlBMVUdJTl9JRCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IHBsdWdpbi5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oIkZpbGVTeXN0ZW1JbXBvcnRXaXphcmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChzZWN0aW9uID09IG51bGwpCi0gICAgICAgICAgICBzZWN0aW9uID0gd29ya2JlbmNoU2V0dGluZ3MuYWRkTmV3U2VjdGlvbigiRmlsZVN5c3RlbUltcG9ydFdpemFyZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0RGlhbG9nU2V0dGluZ3Moc2VjdGlvbik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotICAgICAgICBzdXBlci5hZGRQYWdlcygpOwotICAgICAgICBtYWluUGFnZSA9IG5ldyBXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMSh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0gICAgICAgIGFkZFBhZ2UobWFpblBhZ2UpOwotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjsKLQotICAgICAgICBMaXN0IHNlbGVjdGVkUmVzb3VyY2VzID0gSURFLmNvbXB1dGVTZWxlY3RlZFJlc291cmNlcyhjdXJyZW50U2VsZWN0aW9uKTsKLSAgICAgICAgaWYgKCFzZWxlY3RlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRSZXNvdXJjZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0V2luZG93VGl0bGUoRGF0YVRyYW5zZmVyTWVzc2FnZXMuRGF0YVRyYW5zZmVyX2ltcG9ydFRpdGxlKTsKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigid2l6YmFuL2ltcG9ydGRpcl93aXouZ2lmIikpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiBtYWluUGFnZS5maW5pc2goKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9kYXRhdHJhbnNmZXIvRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9kYXRhdHJhbnNmZXIvRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjViODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL0ZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgc3RydWN0dXJlIGFuZAotICogY29udGVudCBvZiBzcGVjaWZpZWQgZmlsZSBzeXN0ZW0gRmlsZSBvYmplY3RzLgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyIGltcGxlbWVudHMgSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHsKLQotICAgIC8qKgotICAgICAqIEhvbGRzIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPkZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlcjwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICBGaWxlIGZvbGRlciA9IChGaWxlKSBlbGVtZW50OwotICAgICAgICBTdHJpbmdbXSBjaGlsZHJlbiA9IGZvbGRlci5saXN0KCk7Ci0gICAgICAgIGludCBjaGlsZHJlbkxlbmd0aCA9IGNoaWxkcmVuID09IG51bGwgPyAwIDogY2hpbGRyZW4ubGVuZ3RoOwotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW5MZW5ndGgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IEZpbGUoZm9sZGVyLCBjaGlsZHJlbltpXSkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKChGaWxlKSBlbGVtZW50KTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxQYXRoKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiAoKEZpbGUpIGVsZW1lbnQpLmdldFBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IGVsZW1lbnQpIHsKLQotICAgICAgICAvL0dldCB0aGUgbmFtZSAtIGlmIGl0IGlzIGVtcHR5IHRoZW4gcmV0dXJuIHRoZSBwYXRoIGFzIGl0IGlzIGEgZmlsZSByb290Ci0gICAgICAgIEZpbGUgZmlsZSA9IChGaWxlKSBlbGVtZW50OwotICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZpbGUuZ2V0UGF0aCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRm9sZGVyKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiAoKEZpbGUpIGVsZW1lbnQpLmlzRGlyZWN0b3J5KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL0lJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL0lJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQ3MWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL2RhdGF0cmFuc2Zlci9JSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW50ZXJmYWNlIHdoaWNoIGNhbiBwcm92aWRlIHN0cnVjdHVyZSBhbmQgY29udGVudCBpbmZvcm1hdGlvbiAKLSAqIGZvciBhbiBlbGVtZW50IChmb3IgZXhhbXBsZSwgYSBmaWxlIHN5c3RlbSBlbGVtZW50KS4KLSAqIFVzZWQgYnkgdGhlIGltcG9ydCB3aXphcmRzIHRvIGFic3RyYWN0IHRoZSBjb21tb25hbGl0aWVzCi0gKiBiZXR3ZWVuIGltcG9ydGluZyBmcm9tIHRoZSBmaWxlIHN5c3RlbSBhbmQgaW1wb3J0aW5nIGZyb20gYW4gYXJjaGl2ZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgewotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb2xsZWN0aW9uIHdpdGggdGhlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgc3RydWN0dXJlZCBlbGVtZW50LgotICAgICAqLwotICAgIExpc3QgZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBzdHJ1Y3R1cmVkIGVsZW1lbnQsIG9yCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGRldGVybWluaW5nIHRoZSBlbGVtZW50J3MKLSAgICAgKiBjb250ZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IGEgc3RydWN0dXJlZCBlbGVtZW50Ci0gICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIHN0cnVjdHVyZWQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBJbnB1dFN0cmVhbSBnZXRDb250ZW50cyhPYmplY3QgZWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIHBhdGggb2YgdGhlIHNwZWNpZmllZCBzdHJ1Y3R1cmVkIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCBhIHN0cnVjdHVyZWQgZWxlbWVudAotICAgICAqIEByZXR1cm4gdGhlIGRpc3BsYXkgbGFiZWwgb2YgdGhlIHN0cnVjdHVyZWQgZWxlbWVudAotICAgICAqLwotICAgIFN0cmluZyBnZXRGdWxsUGF0aChPYmplY3QgZWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXNwbGF5IGxhYmVsIG9mIHRoZSBzcGVjaWZpZWQgc3RydWN0dXJlZCBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgYSBzdHJ1Y3R1cmVkIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IGxhYmVsIG9mIHRoZSBzdHJ1Y3R1cmVkIGVsZW1lbnQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYXNzZWQgc3RydWN0dXJlZCBlbGVtZW50IHJlcHJlc2VudHMKLSAgICAgKiBhIGNvbnRhaW5lciBlbGVtZW50IChhcyBvcHBvc2VkIHRvIGEgbGVhZiBlbGVtZW50KS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqIEBwYXJhbSBlbGVtZW50IGphdmEubGFuZy5PYmplY3QKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRm9sZGVyKE9iamVjdCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL2RhdGF0cmFuc2Zlci9JbXBvcnRPcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL2RhdGF0cmFuc2Zlci9JbXBvcnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmYzI0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9kYXRhdHJhbnNmZXIvSW1wb3J0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFJlZCBIYXQsIEluYyAtIGNoYW5nZWQgVGFyRmlsZVN0cnVjdHVyZVByb3ZpZGVyIHRvIFRhckxldmVsZWRTdHJ1Y3R1cmVQcm92aWRlciAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JT3ZlcndyaXRlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2Zlci5EYXRhVHJhbnNmZXJNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2Zlci5UYXJMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXI7Ci0KLS8qKgotICogQW4gb3BlcmF0aW9uIHdoaWNoIGRvZXMgdGhlIGFjdHVhbCB3b3JrIG9mIGNvcHlpbmcgb2JqZWN0cyBmcm9tIHRoZSBsb2NhbCBmaWxlCi0gKiBzeXN0ZW0gaW50byB0aGUgd29ya3NwYWNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0T3BlcmF0aW9uIGV4dGVuZHMgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9MSUNZX0RFRkFVTFQgPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPTElDWV9TS0lQX0NISUxEUkVOID0gMTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT0xJQ1lfRk9SQ0VfT1ZFUldSSVRFID0gMjsKLQotICAgIHByaXZhdGUgT2JqZWN0IHNvdXJjZTsKLQotICAgIHByaXZhdGUgSVBhdGggZGVzdGluYXRpb25QYXRoOwotCi0gICAgcHJpdmF0ZSBJQ29udGFpbmVyIGRlc3RpbmF0aW9uQ29udGFpbmVyOwotCi0gICAgcHJpdmF0ZSBMaXN0IHNlbGVjdGVkRmlsZXM7Ci0KLSAgICBwcml2YXRlIExpc3QgcmVqZWN0ZWRGaWxlczsKLQotICAgIHByaXZhdGUgSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0KLSAgICBwcm90ZWN0ZWQgSU92ZXJ3cml0ZVF1ZXJ5IG92ZXJ3cml0ZUNhbGxiYWNrOwotCi0gICAgcHJpdmF0ZSBTaGVsbCBjb250ZXh0OwotCi0gICAgcHJpdmF0ZSBMaXN0IGVycm9yVGFibGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlQ29udGFpbmVyU3RydWN0dXJlID0gdHJ1ZTsKLQotICAgIC8vVGhlIGNvbnN0YW50cyBmb3IgdGhlIG92ZXJ3cml0ZSAzIHN0YXRlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJXUklURV9OT1RfU0VUID0gMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPVkVSV1JJVEVfTk9ORSA9IDE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUldSSVRFX0FMTCA9IDI7Ci0KLSAgICBwcml2YXRlIGludCBvdmVyd3JpdGVTdGF0ZSA9IE9WRVJXUklURV9OT1RfU0VUOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24gdGhhdCByZWN1cnNpdmVseSBpbXBvcnRzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlCi0gICAgICogc3BlY2lmaWVkIHJvb3QgZmlsZSBzeXN0ZW0gb2JqZWN0LgotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5zb3VyY2U8L2NvZGU+IHBhcmFtZXRlciByZXByZXNlbnRzIHRoZSByb290IGZpbGUgc3lzdGVtIG9iamVjdCB0byAKLSAgICAgKiBpbXBvcnQuIEFsbCBjb250ZW50cyBvZiB0aGlzIG9iamVjdCBhcmUgaW1wb3J0ZWQuIFZhbGlkIHR5cGVzIGZvciB0aGlzIHBhcmFtZXRlcgotICAgICAqIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBzdXBwbGllZCA8Y29kZT5JSW1wb3J0U3RydWN0dXJlUHJvdmlkZXI8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+cHJvdmlkZXI8L2NvZGU+IHBhcmFtZXRlciBhbGxvd3MgdGhpcyBvcGVyYXRpb24gdG8gZGVhbCB3aXRoIHRoZQotICAgICAqIHNvdXJjZSBvYmplY3QgaW4gYW4gYWJzdHJhY3Qgd2F5LiBUaGlzIG9wZXJhdGlvbiBjYWxscyBtZXRob2RzIG9uIHRoZSBwcm92aWRlcgotICAgICAqIGFuZCB0aGUgcHJvdmlkZXIgaW4gdHVybiBjYWxscyBzcGVjaWZpYyBtZXRob2RzIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LgotICAgICAqIDwvcD4KLSAgICAgKiAgPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wb3J0IGJlaGF2aW9yIGlzIHRvIHJlY3JlYXRlIHRoZSBjb21wbGV0ZSBjb250YWluZXIgc3RydWN0dXJlCi0gICAgICogZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgcm9vdCBmaWxlIHN5c3RlbSBvYmplY3QgaW4gdGhlaXIgZGVzdGluYXRpb24uIAotICAgICAqIElmIDxjb2RlPnNldENyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZTwvY29kZT4gaXMgc2V0IHRvIGZhbHNlIHRoZW4gdGhlIGNvbnRhaW5lciAKLSAgICAgKiBzdHJ1Y3R1cmUgY3JlYXRlZCBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBmaWxlIHN5c3RlbSBvYmplY3QuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250YWluZXJQYXRoIHRoZSBmdWxsIHBhdGggb2YgdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciB3aXRoaW4gdGhlCi0gICAgICogICB3b3Jrc3BhY2UKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSByb290IGZpbGUgc3lzdGVtIG9iamVjdCB0byBpbXBvcnQKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIGZpbGUgc3lzdGVtIHN0cnVjdHVyZSBwcm92aWRlciB0byB1c2UKLSAgICAgKiBAcGFyYW0gb3ZlcndyaXRlSW1wbGVtZW50b3IgdGhlIG92ZXJ3cml0ZSBzdHJhdGVneSB0byB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1wb3J0T3BlcmF0aW9uKElQYXRoIGNvbnRhaW5lclBhdGgsIE9iamVjdCBzb3VyY2UsCi0gICAgICAgICAgICBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICBJT3ZlcndyaXRlUXVlcnkgb3ZlcndyaXRlSW1wbGVtZW50b3IpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5kZXN0aW5hdGlvblBhdGggPSBjb250YWluZXJQYXRoOwotICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLSAgICAgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICBvdmVyd3JpdGVDYWxsYmFjayA9IG92ZXJ3cml0ZUltcGxlbWVudG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgb3BlcmF0aW9uIHRoYXQgaW1wb3J0cyBzcGVjaWZpYyBmaWxlIHN5c3RlbSBvYmplY3RzLgotICAgICAqIEluIHRoaXMgdXNhZ2UgY29udGV4dCwgdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZSBzeXN0ZW0gb2JqZWN0IGlzIHVzZWQgYnkgdGhlCi0gICAgICogb3BlcmF0aW9uIHNvbGVseSB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciBzdHJ1Y3R1cmUgb2YgdGhlIGZpbGUgc3lzdGVtCi0gICAgICogb2JqZWN0cyBiZWluZyBpbXBvcnRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+c291cmNlPC9jb2RlPiBwYXJhbWV0ZXIgcmVwcmVzZW50cyB0aGUgcm9vdCBmaWxlIHN5c3RlbSBvYmplY3QgdG8gCi0gICAgICogaW1wb3J0LiBWYWxpZCB0eXBlcyBmb3IgdGhpcyBwYXJhbWV0ZXIgYXJlIGRldGVybWluZWQgYnkgdGhlIHN1cHBsaWVkIAotICAgICAqIDxjb2RlPklJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlcjwvY29kZT4uIFRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIHdoaWNoCi0gICAgICogYXJlIHRvIGJlIGltcG9ydGVkIGFyZSBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPmZpbGVzVG9JbXBvcnQ8L2NvZGU+Ci0gICAgICogcGFyYW1ldGVyLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+cHJvdmlkZXI8L2NvZGU+IHBhcmFtZXRlciBhbGxvd3MgdGhpcyBvcGVyYXRpb24gdG8gZGVhbCB3aXRoIHRoZQotICAgICAqIHNvdXJjZSBvYmplY3QgaW4gYW4gYWJzdHJhY3Qgd2F5LiBUaGlzIG9wZXJhdGlvbiBjYWxscyBtZXRob2RzIG9uIHRoZSBwcm92aWRlcgotICAgICAqIGFuZCB0aGUgcHJvdmlkZXIgaW4gdHVybiBjYWxscyBzcGVjaWZpYyBtZXRob2RzIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+ZmlsZXNUb0ltcG9ydDwvY29kZT4gcGFyYW1ldGVyIHNwZWNpZmllcyB3aGF0IGNvbnRlbnRzIG9mIHRoZSByb290Ci0gICAgICogZmlsZSBzeXN0ZW0gb2JqZWN0IGFyZSB0byBiZSBpbXBvcnRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wb3J0IGJlaGF2aW9yIGlzIHRvIHJlY3JlYXRlIHRoZSBjb21wbGV0ZSBjb250YWluZXIgc3RydWN0dXJlCi0gICAgICogZm9yIHRoZSBmaWxlIHN5c3RlbSBvYmplY3RzIGluIHRoZWlyIGRlc3RpbmF0aW9uLiBJZiA8Y29kZT5zZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmU8L2NvZGU+Ci0gICAgICogaXMgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlbiB0aGUgY29udGFpbmVyIHN0cnVjdHVyZSBjcmVhdGVkIGZvciBlYWNoIG9mIAotICAgICAqIHRoZSBmaWxlIHN5c3RlbSBvYmplY3RzIGlzIHJlbGF0aXZlIHRvIHRoZSBzdXBwbGllZCByb290IGZpbGUgc3lzdGVtIG9iamVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFpbmVyUGF0aCB0aGUgZnVsbCBwYXRoIG9mIHRoZSBkZXN0aW5hdGlvbiBjb250YWluZXIgd2l0aGluIHRoZQotICAgICAqICAgd29ya3NwYWNlCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgcm9vdCBmaWxlIHN5c3RlbSBvYmplY3QgdG8gaW1wb3J0IGZyb20KLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIGZpbGUgc3lzdGVtIHN0cnVjdHVyZSBwcm92aWRlciB0byB1c2UKLSAgICAgKiBAcGFyYW0gb3ZlcndyaXRlSW1wbGVtZW50b3IgdGhlIG92ZXJ3cml0ZSBzdHJhdGVneSB0byB1c2UKLSAgICAgKiBAcGFyYW0gZmlsZXNUb0ltcG9ydCB0aGUgbGlzdCBvZiBmaWxlIHN5c3RlbSBvYmplY3RzIHRvIGJlIGltcG9ydGVkCi0gICAgICogIChlbGVtZW50IHR5cGU6IDxjb2RlPk9iamVjdDwvY29kZT4pCi0gICAgICovCi0gICAgcHVibGljIEltcG9ydE9wZXJhdGlvbihJUGF0aCBjb250YWluZXJQYXRoLCBPYmplY3Qgc291cmNlLAotICAgICAgICAgICAgSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgSU92ZXJ3cml0ZVF1ZXJ5IG92ZXJ3cml0ZUltcGxlbWVudG9yLCBMaXN0IGZpbGVzVG9JbXBvcnQpIHsKLSAgICAgICAgdGhpcyhjb250YWluZXJQYXRoLCBzb3VyY2UsIHByb3ZpZGVyLCBvdmVyd3JpdGVJbXBsZW1lbnRvcik7Ci0gICAgICAgIHNldEZpbGVzVG9JbXBvcnQoZmlsZXNUb0ltcG9ydCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24gdGhhdCBpbXBvcnRzIHNwZWNpZmljIGZpbGUgc3lzdGVtIG9iamVjdHMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPnByb3ZpZGVyPC9jb2RlPiBwYXJhbWV0ZXIgYWxsb3dzIHRoaXMgb3BlcmF0aW9uIHRvIGRlYWwgd2l0aCB0aGUKLSAgICAgKiBzb3VyY2Ugb2JqZWN0IGluIGFuIGFic3RyYWN0IHdheS4gVGhpcyBvcGVyYXRpb24gY2FsbHMgbWV0aG9kcyBvbiB0aGUgcHJvdmlkZXIKLSAgICAgKiBhbmQgdGhlIHByb3ZpZGVyIGluIHR1cm4gY2FsbHMgc3BlY2lmaWMgbWV0aG9kcyBvbiB0aGUgc291cmNlIG9iamVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPmZpbGVzVG9JbXBvcnQ8L2NvZGU+IHBhcmFtZXRlciBzcGVjaWZpZXMgd2hhdCBmaWxlIHN5c3RlbSBvYmplY3RzIAotICAgICAqIGFyZSB0byBiZSBpbXBvcnRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wb3J0IGJlaGF2aW9yIGlzIHRvIHJlY3JlYXRlIHRoZSBjb21wbGV0ZSBjb250YWluZXIgc3RydWN0dXJlCi0gICAgICogZm9yIHRoZSBmaWxlIHN5c3RlbSBvYmplY3RzIGluIHRoZWlyIGRlc3RpbmF0aW9uLiBJZiA8Y29kZT5zZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmU8L2NvZGU+Ci0gICAgICogaXMgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlbiBubyBjb250YWluZXIgc3RydWN0dXJlIGlzIGNyZWF0ZWQgZm9yIGVhY2ggb2YgCi0gICAgICogdGhlIGZpbGUgc3lzdGVtIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRhaW5lclBhdGggdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZGVzdGluYXRpb24gY29udGFpbmVyIHdpdGhpbiB0aGUKLSAgICAgKiAgIHdvcmtzcGFjZQotICAgICAqIEBwYXJhbSBwcm92aWRlciB0aGUgZmlsZSBzeXN0ZW0gc3RydWN0dXJlIHByb3ZpZGVyIHRvIHVzZQotICAgICAqIEBwYXJhbSBvdmVyd3JpdGVJbXBsZW1lbnRvciB0aGUgb3ZlcndyaXRlIHN0cmF0ZWd5IHRvIHVzZQotICAgICAqIEBwYXJhbSBmaWxlc1RvSW1wb3J0IHRoZSBsaXN0IG9mIGZpbGUgc3lzdGVtIG9iamVjdHMgdG8gYmUgaW1wb3J0ZWQKLSAgICAgKiAgKGVsZW1lbnQgdHlwZTogPGNvZGU+T2JqZWN0PC9jb2RlPikKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1wb3J0T3BlcmF0aW9uKElQYXRoIGNvbnRhaW5lclBhdGgsCi0gICAgICAgICAgICBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICBJT3ZlcndyaXRlUXVlcnkgb3ZlcndyaXRlSW1wbGVtZW50b3IsIExpc3QgZmlsZXNUb0ltcG9ydCkgewotICAgICAgICB0aGlzKGNvbnRhaW5lclBhdGgsIG51bGwsIHByb3ZpZGVyLCBvdmVyd3JpdGVJbXBsZW1lbnRvcik7Ci0gICAgICAgIHNldEZpbGVzVG9JbXBvcnQoZmlsZXNUb0ltcG9ydCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvbXB0cyBpZiBleGlzdGluZyByZXNvdXJjZXMgc2hvdWxkIGJlIG92ZXJ3cml0dGVuLiBSZWN1cnNpdmVseSBjb2xsZWN0cwotICAgICAqIGV4aXN0aW5nIHJlYWQtb25seSBmaWxlcyB0byBvdmVyd3JpdGUgYW5kIHJlc291cmNlcyB0aGF0IHNob3VsZCBub3QgYmUKLSAgICAgKiBvdmVyd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlU3RhcnQgZGVzdGluYXRpb24gcGF0aCB0byBjaGVjayBmb3IgZXhpc3RpbmcgZmlsZXMKLSAgICAgKiBAcGFyYW0gc291cmNlcyBmaWxlIHN5c3RlbSBvYmplY3RzIHRoYXQgbWF5IGV4aXN0IGluIHRoZSBkZXN0aW5hdGlvbgotICAgICAqIEBwYXJhbSBub092ZXJ3cml0ZSBmaWxlcyB0aGF0IHdlcmUgc2VsZWN0ZWQgdG8gYmUgc2tpcHBlZCAoZG9uJ3Qgb3ZlcndyaXRlKS4KLSAgICAgKiAJb2JqZWN0IHR5cGUgSVBhdGgKLSAgICAgKiBAcGFyYW0gb3ZlcndyaXRlUmVhZG9ubHkgdGhlIGNvbGxlY3RlZCBleGlzdGluZyByZWFkLW9ubHkgZmlsZXMgdG8gb3ZlcndyaXRlLgotICAgICAqIAlvYmplY3QgdHlwZSBJUGF0aAotICAgICAqIEBwYXJhbSBwb2xpY3kgb24gb2YgdGhlIFBPTElDWSBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGUKLSAgICAgKiBjbGFzcy4KLSAgICAgKi8KLSAgICB2b2lkIGNvbGxlY3RFeGlzdGluZ1JlYWRvbmx5RmlsZXMoSVBhdGggc291cmNlU3RhcnQsIExpc3Qgc291cmNlcywKLSAgICAgICAgICAgIEFycmF5TGlzdCBub092ZXJ3cml0ZSwgQXJyYXlMaXN0IG92ZXJ3cml0ZVJlYWRvbmx5LCBpbnQgcG9saWN5KSB7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJdGVyYXRvciBzb3VyY2VJdGVyID0gc291cmNlcy5pdGVyYXRvcigpOwotICAgICAgICBJUGF0aCBzb3VyY2VSb290UGF0aCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHRoaXMuc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNvdXJjZVJvb3RQYXRoID0gbmV3IFBhdGgocHJvdmlkZXIuZ2V0RnVsbFBhdGgodGhpcy5zb3VyY2UpKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoc291cmNlSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBuZXh0U291cmNlID0gc291cmNlSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBJUGF0aCBzb3VyY2VQYXRoID0gbmV3IFBhdGgocHJvdmlkZXIuZ2V0RnVsbFBhdGgobmV4dFNvdXJjZSkpOwotICAgICAgICAgICAgSVBhdGggbmV3RGVzdGluYXRpb25QYXRoOwotICAgICAgICAgICAgSVJlc291cmNlIG5ld0Rlc3RpbmF0aW9uOwotCi0gICAgICAgICAgICBpZiAoc291cmNlUm9vdFBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5ld0Rlc3RpbmF0aW9uUGF0aCA9IHNvdXJjZVN0YXJ0LmFwcGVuZChwcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldExhYmVsKG5leHRTb3VyY2UpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHByZWZpeExlbmd0aCA9IHNvdXJjZVBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMoc291cmNlUm9vdFBhdGgpOwotICAgICAgICAgICAgICAgIElQYXRoIHJlbGF0aXZlU291cmNlUGF0aCA9IHNvdXJjZVBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVGaXJzdFNlZ21lbnRzKHByZWZpeExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbmV3RGVzdGluYXRpb25QYXRoID0gdGhpcy5kZXN0aW5hdGlvblBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocmVsYXRpdmVTb3VyY2VQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ld0Rlc3RpbmF0aW9uID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKG5ld0Rlc3RpbmF0aW9uUGF0aCk7Ci0gICAgICAgICAgICBpZiAobmV3RGVzdGluYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgSUZvbGRlciBmb2xkZXIgPSBnZXRGb2xkZXIobmV3RGVzdGluYXRpb24pOwotICAgICAgICAgICAgaWYgKGZvbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvbGljeSAhPSBQT0xJQ1lfRk9SQ0VfT1ZFUldSSVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm92ZXJ3cml0ZVN0YXRlID09IE9WRVJXUklURV9OT05FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXF1ZXJ5T3ZlcndyaXRlKG5ld0Rlc3RpbmF0aW9uUGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vT3ZlcndyaXRlLmFkZChmb2xkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyLmlzRm9sZGVyKG5leHRTb3VyY2UpKS8vUmVjdXJzZSBpbnRvIGNoaWxkcmVuCi0gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RFeGlzdGluZ1JlYWRvbmx5RmlsZXMobmV3RGVzdGluYXRpb25QYXRoLCBwcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZHJlbihuZXh0U291cmNlKSwgbm9PdmVyd3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlUmVhZG9ubHksIFBPTElDWV9GT1JDRV9PVkVSV1JJVEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gZ2V0RmlsZShuZXdEZXN0aW5hdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcXVlcnlPdmVyd3JpdGVGaWxlKGZpbGUsIHBvbGljeSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBub092ZXJ3cml0ZS5hZGQoZmlsZS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZmlsZS5pc1JlYWRPbmx5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVSZWFkb25seS5hZGQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZm9sZGVycyB0aGF0IGFwcGVhciBpbiB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHBhdGguCi0gICAgICogVGhlc2UgZm9sZGVycyBhcmUgY3JlYXRlZCByZWxhdGl2ZSB0byB0aGUgZGVzdGluYXRpb24gY29udGFpbmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHJlc291cmNlCi0gICAgICogQHJldHVybiB0aGUgY29udGFpbmVyIHJlc291cmNlIGNvcmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcGF0aAotICAgICAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBmYWlsZWQKLSAgICAgKi8KLSAgICBJQ29udGFpbmVyIGNyZWF0ZUNvbnRhaW5lcnNGb3IoSVBhdGggcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgIElDb250YWluZXIgY3VycmVudEZvbGRlciA9IGRlc3RpbmF0aW9uQ29udGFpbmVyOwotCi0gICAgICAgIGludCBzZWdtZW50Q291bnQgPSBwYXRoLnNlZ21lbnRDb3VudCgpOwotCi0gICAgICAgIC8vTm8gY29udGFpbmVycyB0byBjcmVhdGUKLSAgICAgICAgaWYgKHNlZ21lbnRDb3VudCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRGb2xkZXI7Ci0KLSAgICAgICAgLy9OZWVkcyB0byBiZSBoYW5kbGVzIGRpZmZlcmVudGx5IGF0IHRoZSByb290Ci0gICAgICAgIGlmIChjdXJyZW50Rm9sZGVyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUk9PVCkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVGcm9tUm9vdChwYXRoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBjdXJyZW50Rm9sZGVyID0gY3VycmVudEZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgocGF0aC5zZWdtZW50KGkpKSk7Ci0gICAgICAgICAgICBpZiAoIWN1cnJlbnRGb2xkZXIuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgKChJRm9sZGVyKSBjdXJyZW50Rm9sZGVyKS5jcmVhdGUoZmFsc2UsIHRydWUsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRGb2xkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZm9sZGVycyB0aGF0IGFwcGVhciBpbiB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHBhdGgKLSAgICAgKiBhc3N1bWluZyB0aGF0IHRoZSBkZXN0aW5hdGlvbkNvbnRhaW5lciBiZWdpbnMgYXQgdGhlIHJvb3QuIERvIG5vdCBjcmVhdGUgcHJvamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250YWluZXIgcmVzb3VyY2UgY29yZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwYXRoCi0gICAgICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGZhaWxlZAotICAgICAqLwotICAgIHByaXZhdGUgSUNvbnRhaW5lciBjcmVhdGVGcm9tUm9vdChJUGF0aCBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaW50IHNlZ21lbnRDb3VudCA9IHBhdGguc2VnbWVudENvdW50KCk7Ci0KLSAgICAgICAgLy9Bc3N1bWUgdGhlIHByb2plY3QgZXhpc3RzIAotICAgICAgICBJQ29udGFpbmVyIGN1cnJlbnRGb2xkZXIgPSAoKElXb3Jrc3BhY2VSb290KSBkZXN0aW5hdGlvbkNvbnRhaW5lcikKLSAgICAgICAgICAgICAgICAuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudENvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGN1cnJlbnRGb2xkZXIgPSBjdXJyZW50Rm9sZGVyLmdldEZvbGRlcihuZXcgUGF0aChwYXRoLnNlZ21lbnQoaSkpKTsKLSAgICAgICAgICAgIGlmICghY3VycmVudEZvbGRlci5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICAoKElGb2xkZXIpIGN1cnJlbnRGb2xkZXIpLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3VycmVudEZvbGRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIHRoZSBnaXZlbiByZXNvdXJjZS4gSWYgdGhlIHJlc291cmNlIGZhaWxzIHRvIGJlIGRlbGV0ZWQsIGFkZHMgYQotICAgICAqIHN0YXR1cyBvYmplY3QgdG8gdGhlIGxpc3QgdG8gYmUgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0UmVzdWx0PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UKLSAgICAgKi8KLSAgICB2b2lkIGRlbGV0ZVJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb3VyY2UuZGVsZXRlKElSZXNvdXJjZS5LRUVQX0hJU1RPUlksIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGVycm9yVGFibGUuYWRkKGUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXb3JrYmVuY2hNb2RpZnlPcGVyYXRpb24uCi0gICAgICogSW1wb3J0cyB0aGUgc3BlY2lmaWVkIGZpbGUgc3lzdGVtIG9iamVjdHMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCi0gICAgICAgIG1vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZEZpbGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvL1NldCB0aGUgYW1vdW50IHRvIDEwMDAgYXMgd2UgaGF2ZSBubyBpZGVhIG9mIGhvdyBsb25nIHRoaXMgd2lsbCB0YWtlCi0gICAgICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soRGF0YVRyYW5zZmVyTWVzc2FnZXMuRGF0YVRyYW5zZmVyX2ltcG9ydFRhc2ssIDEwMDApOwotICAgICAgICAgICAgICAgIENvbnRhaW5lckdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29udGFpbmVyR2VuZXJhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25QYXRoKTsKLSAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgzMCk7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVGaWxlcyhBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IHNvdXJjZSB9KSk7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoNTApOwotICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29udGFpbmVyID0gZ2VuZXJhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVDb250YWluZXIobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA1MCkpOwotICAgICAgICAgICAgICAgIGltcG9ydFJlY3Vyc2l2ZWx5RnJvbShzb3VyY2UsIFBPTElDWV9ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICAvL0JlIHN1cmUgaXQgZmluaXNoZXMKLSAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCg5MCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIENob29zZSB0d2ljZSB0aGUgc2VsZWN0ZWQgZmlsZXMgc2l6ZSB0byB0YWtlIGZvbGRlcnMgaW50byBhY2NvdW50Ci0gICAgICAgICAgICAgICAgaW50IGNyZWF0aW9uQ291bnQgPSBzZWxlY3RlZEZpbGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayhEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfaW1wb3J0VGFzaywgY3JlYXRpb25Db3VudCArIDEwMCk7Ci0gICAgICAgICAgICAgICAgQ29udGFpbmVyR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb250YWluZXJHZW5lcmF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhdGgpOwotICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDMwKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZUZpbGVzKHNlbGVjdGVkRmlsZXMpOwotICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDUwKTsKLSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkNvbnRhaW5lciA9IGdlbmVyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdlbmVyYXRlQ29udGFpbmVyKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNTApKTsKLSAgICAgICAgICAgICAgICBpbXBvcnRGaWxlU3lzdGVtT2JqZWN0cyhzZWxlY3RlZEZpbGVzKTsKLSAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvclRhYmxlLmFkZChlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGFpbmVyIHJlc291cmNlIHRoYXQgdGhlIHBhc3NlZCBmaWxlIHN5c3RlbSBvYmplY3Qgc2hvdWxkIGJlCi0gICAgICogaW1wb3J0ZWQgaW50by4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlU3lzdGVtT2JqZWN0IHRoZSBmaWxlIHN5c3RlbSBvYmplY3QgYmVpbmcgaW1wb3J0ZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250YWluZXIgcmVzb3VyY2UgdGhhdCB0aGUgcGFzc2VkIGZpbGUgc3lzdGVtIG9iamVjdCBzaG91bGQgYmUKLSAgICAgKiAgICAgaW1wb3J0ZWQgaW50bwotICAgICAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBmYWlsZWQKLSAgICAgKi8KLSAgICBJQ29udGFpbmVyIGdldERlc3RpbmF0aW9uQ29udGFpbmVyRm9yKE9iamVjdCBmaWxlU3lzdGVtT2JqZWN0KQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJUGF0aCBwYXRobmFtZSA9IG5ldyBQYXRoKHByb3ZpZGVyLmdldEZ1bGxQYXRoKGZpbGVTeXN0ZW1PYmplY3QpKTsKLQotICAgICAgICBpZiAoY3JlYXRlQ29udGFpbmVyU3RydWN0dXJlKQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRhaW5lcnNGb3IocGF0aG5hbWUucmVtb3ZlTGFzdFNlZ21lbnRzKDEpKTsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBmaWxlU3lzdGVtT2JqZWN0KQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBJUGF0aCBzb3VyY2VQYXRoID0gbmV3IFBhdGgocHJvdmlkZXIuZ2V0RnVsbFBhdGgoc291cmNlKSk7Ci0gICAgICAgIElQYXRoIGRlc3RDb250YWluZXJQYXRoID0gcGF0aG5hbWUucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotICAgICAgICBJUGF0aCByZWxhdGl2ZVBhdGggPSBkZXN0Q29udGFpbmVyUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKAotICAgICAgICAgICAgICAgIHNvdXJjZVBhdGguc2VnbWVudENvdW50KCkpLnNldERldmljZShudWxsKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRhaW5lcnNGb3IocmVsYXRpdmVQYXRoKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgZWl0aGVyIGNhc3RlZCB0byBvciBhZGFwdGVkIHRvIGFuIElGaWxlLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgdG8gY2FzdC9hZGFwdAotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIGVpdGhlciBjYXN0ZWQgdG8gb3IgYWRhcHRlZCB0byBhbiBJRmlsZS4KLSAgICAgKiAJPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc291cmNlIGRvZXMgbm90IGFkYXB0IHRvIElGaWxlIAotICAgICAqLwotICAgIElGaWxlIGdldEZpbGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKElGaWxlKSByZXNvdXJjZTsKLSAgICAgICAgfQotICAgICAgICBPYmplY3QgYWRhcHRlZCA9ICgoSUFkYXB0YWJsZSkgcmVzb3VyY2UpLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotICAgICAgICBpZihhZGFwdGVkID09IG51bGwpCi0gICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIChJRmlsZSkgYWRhcHRlZDsKLSAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGVpdGhlciBjYXN0ZWQgdG8gb3IgYWRhcHRlZCB0byBhbiBJRm9sZGVyLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgdG8gY2FzdC9hZGFwdAotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIGVpdGhlciBjYXN0ZWQgdG8gb3IgYWRhcHRlZCB0byBhbiBJRm9sZGVyLgotICAgICAqIAk8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzb3VyY2UgZG9lcyBub3QgYWRhcHQgdG8gSUZvbGRlciAKLSAgICAgKi8KLSAgICBJRm9sZGVyIGdldEZvbGRlcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgewotICAgICAgICAgICAgcmV0dXJuIChJRm9sZGVyKSByZXNvdXJjZTsKLSAgICAgICAgfQotICAgICAgICBPYmplY3QgYWRhcHRlZCA9ICgoSUFkYXB0YWJsZSkgcmVzb3VyY2UpLmdldEFkYXB0ZXIoSUZvbGRlci5jbGFzcyk7Ci0gICAgICAgIGlmKGFkYXB0ZWQgPT0gbnVsbCkKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKElGb2xkZXIpIGFkYXB0ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVqZWN0ZWQgZmlsZXMgYmFzZWQgb24gdGhlIGdpdmVuIG11bHRpIHN0YXR1cy4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIG11bHRpU3RhdHVzIG11bHRpIHN0YXR1cyB0byB1c2UgdG8gZGV0ZXJtaW5lIGZpbGUgcmVqZWN0aW9uCi0gICAgICogQHBhcmFtIGZpbGVzIHNvdXJjZSBmaWxlcwotICAgICAqIEByZXR1cm4gbGlzdCBvZiByZWplY3RlZCBmaWxlcyBhcyBhYnNvbHV0ZSBwYXRocy4gT2JqZWN0IHR5cGUgSVBhdGguCi0gICAgICovCi0gICAgQXJyYXlMaXN0IGdldFJlamVjdGVkRmlsZXMoSVN0YXR1cyBtdWx0aVN0YXR1cywgSUZpbGVbXSBmaWxlcykgewotICAgICAgICBBcnJheUxpc3QgZmlsdGVyZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBJU3RhdHVzW10gc3RhdHVzID0gbXVsdGlTdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXNbaV0uaXNPSygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAJZXJyb3JUYWJsZS5hZGQoc3RhdHVzW2ldKTsKLSAgICAgICAgICAgIAlmaWx0ZXJlZEZpbGVzLmFkZChmaWxlc1tpXS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmlsdGVyZWRGaWxlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIGltcG9ydCBvcGVyYXRpb24uCi0gICAgICogSWYgdGhlcmUgd2VyZSBhbnkgZXJyb3JzLCB0aGUgcmVzdWx0IGlzIGEgc3RhdHVzIG9iamVjdCBjb250YWluaW5nCi0gICAgICogaW5kaXZpZHVhbCBzdGF0dXMgb2JqZWN0cyBmb3IgZWFjaCBlcnJvci4KLSAgICAgKiBJZiB0aGVyZSB3ZXJlIG5vIGVycm9ycywgdGhlIHJlc3VsdCBpcyBhIHN0YXR1cyBvYmplY3Qgd2l0aCBlcnJvciBjb2RlIDxjb2RlPk9LPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHN0YXR1cwotICAgICAqLwotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgSVN0YXR1c1tdIGVycm9ycyA9IG5ldyBJU3RhdHVzW2Vycm9yVGFibGUuc2l6ZSgpXTsKLSAgICAgICAgZXJyb3JUYWJsZS50b0FycmF5KGVycm9ycyk7Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlTdGF0dXMoUGxhdGZvcm1VSS5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIGVycm9ycywKLSAgICAgICAgICAgICAgICBEYXRhVHJhbnNmZXJNZXNzYWdlcy5JbXBvcnRPcGVyYXRpb25faW1wb3J0UHJvYmxlbXMsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wb3J0cyB0aGUgc3BlY2lmaWVkIGZpbGUgc3lzdGVtIG9iamVjdCBpbnRvIHRoZSB3b3Jrc3BhY2UuCi0gICAgICogSWYgdGhlIGltcG9ydCBmYWlscywgYWRkcyBhIHN0YXR1cyBvYmplY3QgdG8gdGhlIGxpc3QgdG8gYmUgcmV0dXJuZWQgYnkKLSAgICAgKiA8Y29kZT5nZXRSZXN1bHQ8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVPYmplY3QgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCB0byBiZSBpbXBvcnRlZAotICAgICAqIEBwYXJhbSBwb2xpY3kgZGV0ZXJtaW5lcyBob3cgdGhlIGZpbGUgb2JqZWN0IGlzIGltcG9ydGVkCi0gICAgICovCi0gICAgdm9pZCBpbXBvcnRGaWxlKE9iamVjdCBmaWxlT2JqZWN0LCBpbnQgcG9saWN5KSB7Ci0gICAgICAgIElDb250YWluZXIgY29udGFpbmVyUmVzb3VyY2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250YWluZXJSZXNvdXJjZSA9IGdldERlc3RpbmF0aW9uQ29udGFpbmVyRm9yKGZpbGVPYmplY3QpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIElTdGF0dXMgY29yZVN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3TWVzc2FnZSA9IE5MUy5iaW5kKERhdGFUcmFuc2Zlck1lc3NhZ2VzLkltcG9ydE9wZXJhdGlvbl9jb3JlSW1wb3J0RXJyb3IsIGZpbGVPYmplY3QsIGNvcmVTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIElTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhjb3JlU3RhdHVzLmdldFNldmVyaXR5KCksIGNvcmVTdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgLmdldFBsdWdpbigpLCBjb3JlU3RhdHVzLmdldENvZGUoKSwgbmV3TWVzc2FnZSwgbnVsbCk7Ci0gICAgICAgICAgICBlcnJvclRhYmxlLmFkZChzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGZpbGVPYmplY3RQYXRoID0gcHJvdmlkZXIuZ2V0RnVsbFBhdGgoZmlsZU9iamVjdCk7Ci0gICAgICAgIG1vbml0b3Iuc3ViVGFzayhmaWxlT2JqZWN0UGF0aCk7Ci0gICAgICAgIElGaWxlIHRhcmdldFJlc291cmNlID0gY29udGFpbmVyUmVzb3VyY2UuZ2V0RmlsZShuZXcgUGF0aChwcm92aWRlcgotICAgICAgICAgICAgICAgIC5nZXRMYWJlbChmaWxlT2JqZWN0KSkpOwotICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLQotICAgICAgICBpZiAocmVqZWN0ZWRGaWxlcy5jb250YWlucyh0YXJnZXRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgc291cmNlIGFuZCB0YXJnZXQgYXJlIG5vdCB0aGUgc2FtZQotICAgICAgICBJUGF0aCB0YXJnZXRQYXRoID0gdGFyZ2V0UmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgLy8gVXNlIEZpbGVzIGZvciBjb21wYXJpc29uIHRvIGF2b2lkIHBsYXRmb3JtIHNwZWNpZmljIGNhc2UgaXNzdWVzCi0gICAgICAgIGlmICh0YXJnZXRQYXRoICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiAodGFyZ2V0UGF0aC50b0ZpbGUoKS5lcXVhbHMobmV3IEZpbGUoZmlsZU9iamVjdFBhdGgpKSkpIHsKLSAgICAgICAgICAgIGVycm9yVGFibGUuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUGxhdGZvcm1VSS5QTFVHSU5fSUQsIDAsCi0gICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKERhdGFUcmFuc2Zlck1lc3NhZ2VzLkltcG9ydE9wZXJhdGlvbl90YXJnZXRTYW1lQXNTb3VyY2VFcnJvciwgZmlsZU9iamVjdFBhdGgpLCBudWxsKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJbnB1dFN0cmVhbSBjb250ZW50U3RyZWFtID0gcHJvdmlkZXIuZ2V0Q29udGVudHMoZmlsZU9iamVjdCk7Ci0gICAgICAgIGlmIChjb250ZW50U3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIGVycm9yVGFibGUKLSAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3RhdHVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm1VSS5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZChEYXRhVHJhbnNmZXJNZXNzYWdlcy5JbXBvcnRPcGVyYXRpb25fb3BlblN0cmVhbUVycm9yLCBmaWxlT2JqZWN0UGF0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh0YXJnZXRSZXNvdXJjZS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICB0YXJnZXRSZXNvdXJjZS5zZXRDb250ZW50cyhjb250ZW50U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLktFRVBfSElTVE9SWSwgbnVsbCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGFyZ2V0UmVzb3VyY2UuY3JlYXRlKGNvbnRlbnRTdHJlYW0sIGZhbHNlLCBudWxsKTsKLSAgICAgICAgICAgIHNldFJlc291cmNlQXR0cmlidXRlcyh0YXJnZXRSZXNvdXJjZSxmaWxlT2JqZWN0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgVGFyTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyKSB7Ci0gICAgICAgICAgICAJdHJ5IHsKLSAgICAgICAgICAgIAkJdGFyZ2V0UmVzb3VyY2Uuc2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCgoVGFyTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyKSBwcm92aWRlcikuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKGZpbGVPYmplY3QpKTsKLSAgICAgICAgICAgIAl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAkJZXJyb3JUYWJsZS5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGVycm9yVGFibGUuYWRkKGUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JUYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3RhdHVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVVJLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuSW1wb3J0T3BlcmF0aW9uX2Nsb3NlU3RyZWFtRXJyb3IsIGZpbGVPYmplY3RQYXRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV1c2UgdGhlIGZpbGUgYXR0dHJpYnV0ZXMgc2V0IGluIHRoZSBpbXBvcnQuCi0gICAgICogQHBhcmFtIHRhcmdldFJlc291cmNlCi0gICAgICogQHBhcmFtIGZpbGVPYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0UmVzb3VyY2VBdHRyaWJ1dGVzKElGaWxlIHRhcmdldFJlc291cmNlLCBPYmplY3QgZmlsZU9iamVjdCkgewotICAgIAkKLSAgICAJaWYoZmlsZU9iamVjdCBpbnN0YW5jZW9mIEZpbGUpCi0JCQl0cnkgewotCQkJCXRhcmdldFJlc291cmNlLnNldFJlc291cmNlQXR0cmlidXRlcyhSZXNvdXJjZUF0dHJpYnV0ZXMuZnJvbUZpbGUoKEZpbGUpIGZpbGVPYmplY3QpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vSW5mb3JtIHRoZSBsb2cgdGhhdCB0aGUgYXR0cmlidXRlcyByZWFkaW5nIGZhaWxlZAotCQkJCUlERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQkKLQl9Ci0KLQkvKioKLSAgICAgKiBJbXBvcnRzIHRoZSBzcGVjaWZpZWQgZmlsZSBzeXN0ZW0gb2JqZWN0cyBpbnRvIHRoZSB3b3Jrc3BhY2UuCi0gICAgICogSWYgdGhlIGltcG9ydCBmYWlscywgYWRkcyBhIHN0YXR1cyBvYmplY3QgdG8gdGhlIGxpc3QgdG8gYmUgcmV0dXJuZWQgYnkKLSAgICAgKiA8Y29kZT5nZXRTdGF0dXM8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVzVG9JbXBvcnQgdGhlIGxpc3Qgb2YgZmlsZSBzeXN0ZW0gb2JqZWN0cyB0byBpbXBvcnQKLSAgICAgKiAgIChlbGVtZW50IHR5cGU6IDxjb2RlPk9iamVjdDwvY29kZT4pCi0gICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBpZiBjYW5jZWxlZAotICAgICAqLwotICAgIHZvaWQgaW1wb3J0RmlsZVN5c3RlbU9iamVjdHMoTGlzdCBmaWxlc1RvSW1wb3J0KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGZpbGVzRW51bSA9IGZpbGVzVG9JbXBvcnQuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGZpbGVzRW51bS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBmaWxlU3lzdGVtT2JqZWN0ID0gZmlsZXNFbnVtLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGp1c3QgaW1wb3J0IHdoYXQgd2UgYXJlIGdpdmVuIGludG8gdGhlIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICAgICAgSVBhdGggc291cmNlUGF0aCA9IG5ldyBQYXRoKHByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RnVsbFBhdGgoZmlsZVN5c3RlbU9iamVjdCkpLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIuaXNGb2xkZXIoZmlsZVN5c3RlbU9iamVjdCkgJiYgc291cmNlUGF0aC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHBhcmVudCB0aGVuIHdlIGhhdmUgc2VsZWN0ZWQgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpbGUgc3lzdGVtcyByb290LiBSb290cyBjYW4ndCBjb3BpZWQgKGF0IGxlYXN0IG5vdAotICAgICAgICAgICAgICAgICAgICAvLyB1bmRlciB3aW5kb3dzKS4KLSAgICAgICAgICAgICAgICAgICAgZXJyb3JUYWJsZS5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLklORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm1VSS5QTFVHSU5fSUQsIDAsIERhdGFUcmFuc2Zlck1lc3NhZ2VzLkltcG9ydE9wZXJhdGlvbl9jYW5ub3RDb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZVBhdGgudG9GaWxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbXBvcnRSZWN1cnNpdmVseUZyb20oZmlsZVN5c3RlbU9iamVjdCwgUE9MSUNZX0RFRkFVTFQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wb3J0cyB0aGUgc3BlY2lmaWVkIGZpbGUgc3lzdGVtIGNvbnRhaW5lciBvYmplY3QgaW50byB0aGUgd29ya3NwYWNlLgotICAgICAqIElmIHRoZSBpbXBvcnQgZmFpbHMsIGFkZHMgYSBzdGF0dXMgb2JqZWN0IHRvIHRoZSBsaXN0IHRvIGJlIHJldHVybmVkIGJ5Ci0gICAgICogPGNvZGU+Z2V0UmVzdWx0PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmb2xkZXJPYmplY3QgdGhlIGZpbGUgc3lzdGVtIGNvbnRhaW5lciBvYmplY3QgdG8gYmUgaW1wb3J0ZWQKLSAgICAgKiBAcGFyYW0gcG9saWN5IGRldGVybWluZXMgaG93IHRoZSBmb2xkZXIgb2JqZWN0IGFuZCBjaGlsZHJlbiBhcmUgaW1wb3J0ZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBwb2xpY3kgdG8gdXNlIHRvIGltcG9ydCB0aGUgZm9sZGVyJ3MgY2hpbGRyZW4KLSAgICAgKi8KLSAgICBpbnQgaW1wb3J0Rm9sZGVyKE9iamVjdCBmb2xkZXJPYmplY3QsIGludCBwb2xpY3kpIHsKLSAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXJSZXNvdXJjZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRhaW5lclJlc291cmNlID0gZ2V0RGVzdGluYXRpb25Db250YWluZXJGb3IoZm9sZGVyT2JqZWN0KTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvclRhYmxlLmFkZChlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIHJldHVybiBwb2xpY3k7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGFpbmVyUmVzb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwb2xpY3k7Ci0KLSAgICAgICAgbW9uaXRvci5zdWJUYXNrKHByb3ZpZGVyLmdldEZ1bGxQYXRoKGZvbGRlck9iamVjdCkpOwotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IGRlc3RpbmF0aW9uQ29udGFpbmVyLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBJUGF0aCBjb250YWluZXJQYXRoID0gY29udGFpbmVyUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgSVBhdGggcmVzb3VyY2VQYXRoID0gY29udGFpbmVyUGF0aC5hcHBlbmQocHJvdmlkZXIKLSAgICAgICAgICAgICAgICAuZ2V0TGFiZWwoZm9sZGVyT2JqZWN0KSk7Ci0KLSAgICAgICAgLy8gRG8gbm90IGF0dGVtcHQgdGhlIGltcG9ydCBpZiB0aGUgcmVzb3VyY2UgcGF0aCBpcyB1bmNoYW5nZWQuIFRoaXMgbWF5IGhhcHBlbgotICAgICAgICAvLyB3aGVuIGltcG9ydGluZyBmcm9tIGEgemlwIGZpbGUuCi0gICAgICAgIGlmIChyZXNvdXJjZVBhdGguZXF1YWxzKGNvbnRhaW5lclBhdGgpKQotICAgICAgICAgICAgcmV0dXJuIHBvbGljeTsKLQotICAgICAgICBpZiAod29ya3NwYWNlLmdldFJvb3QoKS5leGlzdHMocmVzb3VyY2VQYXRoKSkgewotICAgICAgICAgICAgaWYgKHJlamVjdGVkRmlsZXMuY29udGFpbnMocmVzb3VyY2VQYXRoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gUE9MSUNZX1NLSVBfQ0hJTERSRU47Ci0KLSAgICAgICAgICAgIHJldHVybiBQT0xJQ1lfRk9SQ0VfT1ZFUldSSVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHJlc291cmNlUGF0aCkuY3JlYXRlKGZhbHNlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvclRhYmxlLmFkZChlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwb2xpY3k7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wb3J0cyB0aGUgc3BlY2lmaWVkIGZpbGUgc3lzdGVtIG9iamVjdCByZWN1cnNpdmVseSBpbnRvIHRoZSB3b3Jrc3BhY2UuCi0gICAgICogSWYgdGhlIGltcG9ydCBmYWlscywgYWRkcyBhIHN0YXR1cyBvYmplY3QgdG8gdGhlIGxpc3QgdG8gYmUgcmV0dXJuZWQgYnkKLSAgICAgKiA8Y29kZT5nZXRTdGF0dXM8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVTeXN0ZW1PYmplY3QgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCB0byBiZSBpbXBvcnRlZAotICAgICAqIEBwYXJhbSBwb2xpY3kgZGV0ZXJtaW5lcyBob3cgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCBhbmQgY2hpbGRyZW4gYXJlIGltcG9ydGVkCi0gICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBpZiBjYW5jZWxlZAotICAgICAqLwotICAgIHZvaWQgaW1wb3J0UmVjdXJzaXZlbHlGcm9tKE9iamVjdCBmaWxlU3lzdGVtT2JqZWN0LCBpbnQgcG9saWN5KSB7Ci0gICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCi0gICAgICAgIGlmICghcHJvdmlkZXIuaXNGb2xkZXIoZmlsZVN5c3RlbU9iamVjdCkpIHsKLSAgICAgICAgICAgIGltcG9ydEZpbGUoZmlsZVN5c3RlbU9iamVjdCwgcG9saWN5KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBjaGlsZFBvbGljeSA9IGltcG9ydEZvbGRlcihmaWxlU3lzdGVtT2JqZWN0LCBwb2xpY3kpOwotICAgICAgICBpZiAoY2hpbGRQb2xpY3kgIT0gUE9MSUNZX1NLSVBfQ0hJTERSRU4pIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGNoaWxkcmVuID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZmlsZVN5c3RlbU9iamVjdCkKLSAgICAgICAgICAgICAgICAgICAgLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoY2hpbGRyZW4uaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIGltcG9ydFJlY3Vyc2l2ZWx5RnJvbShjaGlsZHJlbi5uZXh0KCksIGNoaWxkUG9saWN5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFF1ZXJpZXMgdGhlIHVzZXIgd2hldGhlciB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGggc2hvdWxkIGJlCi0gICAgICogb3ZlcndyaXR0ZW4gYnkgYSBmaWxlIHN5c3RlbSBvYmplY3QgdGhhdCBpcyBiZWluZyBpbXBvcnRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VQYXRoIHRoZSB3b3Jrc3BhY2UgcGF0aCBvZiB0aGUgcmVzb3VyY2UgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gb3ZlcndyaXRlLCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IG92ZXJ3cml0ZQotICAgICAqIEBleGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gaWYgY2FuY2VsZWQKLSAgICAgKi8KLSAgICBib29sZWFuIHF1ZXJ5T3ZlcndyaXRlKElQYXRoIHJlc291cmNlUGF0aCkKLSAgICAgICAgICAgIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBvdmVyd3JpdGVBbnN3ZXIgPSBvdmVyd3JpdGVDYWxsYmFjay5xdWVyeU92ZXJ3cml0ZShyZXNvdXJjZVBhdGgKLSAgICAgICAgICAgICAgICAubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgaWYgKG92ZXJ3cml0ZUFuc3dlci5lcXVhbHMoSU92ZXJ3cml0ZVF1ZXJ5LkNBTkNFTCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oRGF0YVRyYW5zZmVyTWVzc2FnZXMuRGF0YVRyYW5zZmVyX2VtcHR5U3RyaW5nKTsKLQotICAgICAgICBpZiAob3ZlcndyaXRlQW5zd2VyLmVxdWFscyhJT3ZlcndyaXRlUXVlcnkuTk8pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3ZlcndyaXRlQW5zd2VyLmVxdWFscyhJT3ZlcndyaXRlUXVlcnkuTk9fQUxMKSkgewotICAgICAgICAgICAgdGhpcy5vdmVyd3JpdGVTdGF0ZSA9IE9WRVJXUklURV9OT05FOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG92ZXJ3cml0ZUFuc3dlci5lcXVhbHMoSU92ZXJ3cml0ZVF1ZXJ5LkFMTCkpCi0gICAgICAgICAgICB0aGlzLm92ZXJ3cml0ZVN0YXRlID0gT1ZFUldSSVRFX0FMTDsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgc2hvdWxkIGJlIG92ZXJ3cml0dGVuLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldEZpbGUgdGhlIGZpbGUgdG8gYXNrIHRvIG92ZXJ3cml0ZSAKLSAgICAgKiBAcGFyYW0gcG9saWN5IGRldGVybWluZXMgaWYgdGhlIHVzZXIgaXMgcXVlcmllZCBmb3Igb3ZlcndyaXRlIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgc2hvdWxkIGJlIG92ZXJ3cml0dGVuLCBhbmQKLSAgICAgKiAJPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdC4KLSAgICAgKi8KLSAgICBib29sZWFuIHF1ZXJ5T3ZlcndyaXRlRmlsZShJRmlsZSB0YXJnZXRGaWxlLCBpbnQgcG9saWN5KSB7Ci0gICAgICAgIC8vSWYgZm9yY2Ugb3ZlcndyaXRlIGlzIG9uIGRvbid0IGJvdGhlcgotICAgICAgICBpZiAocG9saWN5ICE9IFBPTElDWV9GT1JDRV9PVkVSV1JJVEUpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLm92ZXJ3cml0ZVN0YXRlID09IE9WRVJXUklURV9OT1RfU0VUCi0gICAgICAgICAgICAgICAgICAgICYmICFxdWVyeU92ZXJ3cml0ZSh0YXJnZXRGaWxlLmdldEZ1bGxQYXRoKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmICh0aGlzLm92ZXJ3cml0ZVN0YXRlID09IE9WRVJXUklURV9OT05FKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb250ZXh0IGZvciB1c2UgYnkgdGhlIFZDTSBwcm92aWRlciB0byBwcm9tcHQgdGhlIHVzZXIKLSAgICAgKiBmb3IgY2hlY2stb3V0IG9mIGZpbGVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaGVsbCBjb250ZXh0IGZvciB1c2UgYnkgdGhlIFZDTSBwcm92aWRlciB0byBwcm9tcHQgdXNlcgotICAgICAqIAlmb3IgY2hlY2stb3V0LiBUaGUgdXNlciB3aWxsIG5vdCBiZSBwcm9tcHRlZCBpZiBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHNlZSBJV29ya3NwYWNlI3ZhbGlkYXRlRWRpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZVtdLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIGNvbnRleHQgPSBzaGVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGNvbnRhaW5tZW50IHN0cnVjdHVyZXMgdGhhdCBhcmUgaW1wbGllZCBmcm9tIHRoZSBmdWxsIHBhdGhzCi0gICAgICogb2YgZmlsZSBzeXN0ZW0gb2JqZWN0cyBiZWluZyBpbXBvcnRlZCBzaG91bGQgYmUgZHVwbGljYXRlZCBpbiB0aGUgd29ya2JlbmNoLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNvbnRhaW5lcnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFuZAotICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q3JlYXRlQ29udGFpbmVyU3RydWN0dXJlKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgY3JlYXRlQ29udGFpbmVyU3RydWN0dXJlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0cyB0byBpbXBvcnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZXNUb0ltcG9ydCB0aGUgbGlzdCBvZiBmaWxlIHN5c3RlbSBvYmplY3RzIHRvIGJlIGltcG9ydGVkCi0gICAgICogICAoZWxlbWVudCB0eXBlOiA8Y29kZT5PYmplY3Q8L2NvZGU+KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVzVG9JbXBvcnQoTGlzdCBmaWxlc1RvSW1wb3J0KSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IGZpbGVzVG9JbXBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIGltcG9ydGVkIGZpbGUgc3lzdGVtIG9iamVjdHMgc2hvdWxkIGF1dG9tYXRpY2FsbHkgb3ZlcndyaXRlCi0gICAgICogZXhpc3Rpbmcgd29ya2JlbmNoIHJlc291cmNlcyB3aGVuIGEgY29uZmxpY3Qgb2NjdXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIDxjb2RlPnRydWU8L2NvZGU+IHRvIGF1dG9tYXRpY2FsbHkgb3ZlcndyaXRlLCBhbmQgCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlUmVzb3VyY2VzKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgdGhpcy5vdmVyd3JpdGVTdGF0ZSA9IE9WRVJXUklURV9BTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGdpdmVuIHNvdXJjZSByZXNvdXJjZXMgY2FuIGJlIGNvcGllZCB0byB0aGUgCi0gICAgICogZGVzdGluYXRpb24gYXMgZGVjaWRlZCBieSB0aGUgVkNNIHByb3ZpZGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBleGlzdGluZ0ZpbGVzIGV4aXN0aW5nIGZpbGVzIHRvIHZhbGlkYXRlCi0gICAgICogQHJldHVybiBsaXN0IG9mIHJlamVjdGVkIGZpbGVzIGFzIGFic29sdXRlIHBhdGhzLiBPYmplY3QgdHlwZSBJUGF0aC4KLSAgICAgKi8KLSAgICBBcnJheUxpc3QgdmFsaWRhdGVFZGl0KExpc3QgZXhpc3RpbmdGaWxlcykgewotICAgICAgIAotICAgICAgICBpZiAoZXhpc3RpbmdGaWxlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBJRmlsZVtdIGZpbGVzID0gKElGaWxlW10pIGV4aXN0aW5nRmlsZXMKLSAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IElGaWxlW2V4aXN0aW5nRmlsZXMuc2l6ZSgpXSk7Ci0gICAgICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgIElTdGF0dXMgc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlRWRpdChmaWxlcywgY29udGV4dCk7Ci0KLSAgICAgICAgICAgIC8vSWYgdGhlcmUgd2FzIGEgbWl4IHJldHVybiB0aGUgYmFkIG9uZXMKLSAgICAgICAgICAgIGlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRSZWplY3RlZEZpbGVzKHN0YXR1cywgZmlsZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgIGlmKCFzdGF0dXMuaXNPSygpKXsKLSAgICAgICAgICAgCQkvL0lmIGp1c3QgYSBzaW5nbGUgc3RhdHVzIHJlamVjdCB0aGVtIGFsbAotICAgICAgICAgICAJCWVycm9yVGFibGUuYWRkKHN0YXR1cyk7Ci0gICAgICAgICAgIAkJQXJyYXlMaXN0IGZpbHRlcmVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgIAkJCWZpbHRlcmVkRmlsZXMuYWRkKGZpbGVzW2ldLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICAgICAJCX0KLSAgICAgICAgICAgCQlyZXR1cm4gZmlsdGVyZWRGaWxlczsKLSAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIGZpbGUgc3lzdGVtIG9iamVjdHMuCi0gICAgICogVGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzLgotICAgICAqIEV4aXN0aW5nIHJlYWQtb25seSBmaWxlcyBhcmUgdmFsaWRhdGVkIHdpdGggdGhlIFZDTSBwcm92aWRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlRmlsZXMgZmlsZXMgdG8gdmFsaWRhdGUKLSAgICAgKi8KLSAgICB2b2lkIHZhbGlkYXRlRmlsZXMoTGlzdCBzb3VyY2VGaWxlcykgewotICAgICAgICBBcnJheUxpc3Qgbm9PdmVyd3JpdGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEFycmF5TGlzdCBvdmVyd3JpdGVSZWFkb25seSA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBjb2xsZWN0RXhpc3RpbmdSZWFkb25seUZpbGVzKGRlc3RpbmF0aW9uUGF0aCwgc291cmNlRmlsZXMsIG5vT3ZlcndyaXRlLAotICAgICAgICAgICAgICAgIG92ZXJ3cml0ZVJlYWRvbmx5LCBQT0xJQ1lfREVGQVVMVCk7Ci0gICAgICAgIHJlamVjdGVkRmlsZXMgPSB2YWxpZGF0ZUVkaXQob3ZlcndyaXRlUmVhZG9ubHkpOwotICAgICAgICByZWplY3RlZEZpbGVzLmFkZEFsbChub092ZXJ3cml0ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL1BvcHVsYXRlUm9vdE9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL1BvcHVsYXRlUm9vdE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmQ0M2JjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL2RhdGF0cmFuc2Zlci9Qb3B1bGF0ZVJvb3RPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLk1vZGFsQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbGVTeXN0ZW1FbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXIuTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIFBvcHVsYXRlRmlsZXNPcGVyYXRpb24gaXMgYW4gb3BlcmF0aW9uIHVzZWQgdG8gcG9wdWxhdGUgYSBGaWxlU3lzdGVtRWxlbWVudCBvbmUKLSAqIGxldmVsIGRlZXAgcmF0aGVyIHRoYW4gdGhlIHdob2xlIHdheS4KLSAqLwotcHVibGljIGNsYXNzIFBvcHVsYXRlUm9vdE9wZXJhdGlvbiBleHRlbmRzIFNlbGVjdEZpbGVzT3BlcmF0aW9uIHsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgPGNvZGU+UG9wdWxhdGVGaWxlc09wZXJhdGlvbjwvY29kZT4uCi0gICAgICogQHBhcmFtIHJvb3RPYmplY3QgdGhlIG9iamVjdCB0byBiZSBwb3B1bGF0ZWQKLSAgICAgKiBAcGFyYW0gc3RydWN0dXJlUHJvdmlkZXIgdGhlIG9iamVjdCB0aGF0IGRlZmluZXMgaG93IHdlIGFyZSB0byBwb3B1bGF0ZSBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUG9wdWxhdGVSb290T3BlcmF0aW9uKE9iamVjdCByb290T2JqZWN0LAotICAgICAgICAgICAgSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKHJvb3RPYmplY3QsIHN0cnVjdHVyZVByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgPGNvZGU+RmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBmaWxlIHN5c3RlbSBvYmplY3QgbWVyaXRzIG9uZS4gIFRoZSBjcml0ZXJpYSBmb3IgdGhpcyBhcmU6Ci0gICAgICogLSBpZiB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0IGlzIGEgY29udGFpbmVyIHRoZW4gaXQgbXVzdCBoYXZlIGVpdGhlciBhCi0gICAgICogICBjaGlsZCBjb250YWluZXIgb3IgYW4gYXNzb2NpYXRlZCBmaWxlCi0gICAgICogLSBpZiB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0IGlzIGEgZmlsZSB0aGVuIGl0IG11c3QgaGF2ZSBhbiBleHRlbnNpb24KLSAgICAgKiAgIHN1aXRhYmxlIGZvciBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZVN5c3RlbUVsZW1lbnQgY3JlYXRlRWxlbWVudChGaWxlU3lzdGVtRWxlbWVudCBwYXJlbnQsCi0gICAgICAgICAgICBPYmplY3QgZmlsZVN5c3RlbU9iamVjdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQotICAgICAgICAvL0l0ZXJhdGUgb24gbGV2ZWwgZGVlcAotICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChwYXJlbnQsIGZpbGVTeXN0ZW1PYmplY3QsIDIpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkCi0gICAgICogZmlsZSBzeXN0ZW0gb2JqZWN0IG1lcml0cyBvbmUuICBUaGUgY3JpdGVyaWEgZm9yIHRoaXMgYXJlOgotICAgICAqIC0gaWYgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCBpcyBhIGNvbnRhaW5lciB0aGVuIGl0IG11c3QgaGF2ZSBlaXRoZXIgYQotICAgICAqICAgY2hpbGQgY29udGFpbmVyIG9yIGFuIGFzc29jaWF0ZWQgZmlsZQotICAgICAqIC0gaWYgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCBpcyBhIGZpbGUgdGhlbiBpdCBtdXN0IGhhdmUgYW4gZXh0ZW5zaW9uCi0gICAgICogICBzdWl0YWJsZSBmb3Igc2VsZWN0aW9uCi0gICAgICogCXJlY3Vyc2UgZG93biBmb3IgZGVwdGggdG8gcG9wdWxhdGUgY2hpbGRyZW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZVN5c3RlbUVsZW1lbnQgY3JlYXRlRWxlbWVudChGaWxlU3lzdGVtRWxlbWVudCBwYXJlbnQsCi0gICAgICAgICAgICBPYmplY3QgZmlsZVN5c3RlbU9iamVjdCwgaW50IGRlcHRoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBNb2RhbENvbnRleHQuY2hlY2tDYW5jZWxlZChtb25pdG9yKTsKLSAgICAgICAgYm9vbGVhbiBpc0NvbnRhaW5lciA9IHByb3ZpZGVyLmlzRm9sZGVyKGZpbGVTeXN0ZW1PYmplY3QpOwotICAgICAgICBTdHJpbmcgZWxlbWVudExhYmVsID0gcGFyZW50ID09IG51bGwgPyBwcm92aWRlcgotICAgICAgICAgICAgICAgIC5nZXRGdWxsUGF0aChmaWxlU3lzdGVtT2JqZWN0KSA6IHByb3ZpZGVyCi0gICAgICAgICAgICAgICAgLmdldExhYmVsKGZpbGVTeXN0ZW1PYmplY3QpOwotCi0gICAgICAgIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IHJlc3VsdCA9IG5ldyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCgKLSAgICAgICAgICAgICAgICBlbGVtZW50TGFiZWwsIHBhcmVudCwgaXNDb250YWluZXIpOwotICAgICAgICByZXN1bHQuc2V0RmlsZVN5c3RlbU9iamVjdChmaWxlU3lzdGVtT2JqZWN0KTsKLQotICAgICAgICBpZiAoaXNDb250YWluZXIpIHsKLSAgICAgICAgICAgIGlmIChkZXB0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBMaXN0IGNoaWxkcmVuID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZmlsZVN5c3RlbU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgxKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBjaGlsZHJlbkVudW0gPSBjaGlsZHJlbi5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZHJlbkVudW0uaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQocmVzdWx0LCBjaGlsZHJlbkVudW0ubmV4dCgpLCBkZXB0aCAtIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0UG9wdWxhdGVkKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL1NlbGVjdEZpbGVzT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9kYXRhdHJhbnNmZXIvU2VsZWN0RmlsZXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyNjk0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9kYXRhdHJhbnNmZXIvU2VsZWN0RmlsZXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLk1vZGFsQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbGVTeXN0ZW1FbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXIuRGF0YVRyYW5zZmVyTWVzc2FnZXM7Ci0KLS8qKgotICoJT3BlcmF0aW9uIHJlc3BvbnNpYmxlIGZvciB0cmF2ZXJzaW5nIGEgc3BlY2lmaWVkIGZpbGUgc3lzdGVtIHBvc2l0aW9uCi0gKglyZWN1cnNpdmVseSBhbmQgYnVpbGRpbmcKLSAqCS0JYSB0cmVlIHRoYXQgcmVwcmVzZW50cyB0aGUgY29udGFpbmVyIHN0cnVjdHVyZQotICoJLQlhIGNvbGxlY3Rpb24gY29udGFpbmluZyBhbGwgZmlsZXMgbWVldGluZyBhIHNwZWNpZmllZCBleHRlbnNpb24gY3JpdGVyaWEKLSAqCi0gKglUaGlzIGlzIGltcGxlbWVudGVkIGFzIGFuIE9wZXJhdGlvbiBpbiBvcmRlciB0byBwcm92aWRlIGFuIGVzY2FwZSB0byB0aGUgdXNlcgotICoJKHRoZSBDYW5jZWwgYnV0dG9uKSBpZiB0aGUgb3BlcmF0aW9uIGRyYWdzIG9uIGZvciB0b28gbG9uZwotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0RmlsZXNPcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotICAgIE9iamVjdCByb290OwotCi0gICAgSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyOwotCi0gICAgU3RyaW5nIGRlc2lyZWRFeHRlbnNpb25zW107Ci0KLSAgICBGaWxlU3lzdGVtRWxlbWVudCByZXN1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlbGVjdEZpbGVzT3BlcmF0aW9uPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2VsZWN0RmlsZXNPcGVyYXRpb24oT2JqZWN0IHJvb3RPYmplY3QsCi0gICAgICAgICAgICBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgcm9vdCA9IHJvb3RPYmplY3Q7Ci0gICAgICAgIHByb3ZpZGVyID0gc3RydWN0dXJlUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkCi0gICAgICogZmlsZSBzeXN0ZW0gb2JqZWN0IG1lcml0cyBvbmUuICBUaGUgY3JpdGVyaWEgZm9yIHRoaXMgYXJlOgotICAgICAqIC0gaWYgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCBpcyBhIGNvbnRhaW5lciB0aGVuIGl0IG11c3QgaGF2ZSBlaXRoZXIgYQotICAgICAqICAgY2hpbGQgY29udGFpbmVyIG9yIGFuIGFzc29jaWF0ZWQgZmlsZQotICAgICAqIC0gaWYgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCBpcyBhIGZpbGUgdGhlbiBpdCBtdXN0IGhhdmUgYW4gZXh0ZW5zaW9uCi0gICAgICogICBzdWl0YWJsZSBmb3Igc2VsZWN0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGVTeXN0ZW1FbGVtZW50IGNyZWF0ZUVsZW1lbnQoRmlsZVN5c3RlbUVsZW1lbnQgcGFyZW50LAotICAgICAgICAgICAgT2JqZWN0IGZpbGVTeXN0ZW1PYmplY3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZGFsQ29udGV4dC5jaGVja0NhbmNlbGVkKG1vbml0b3IpOwotICAgICAgICBib29sZWFuIGlzQ29udGFpbmVyID0gcHJvdmlkZXIuaXNGb2xkZXIoZmlsZVN5c3RlbU9iamVjdCk7Ci0gICAgICAgIFN0cmluZyBlbGVtZW50TGFiZWwgPSBwYXJlbnQgPT0gbnVsbCA/IHByb3ZpZGVyCi0gICAgICAgICAgICAgICAgLmdldEZ1bGxQYXRoKGZpbGVTeXN0ZW1PYmplY3QpIDogcHJvdmlkZXIKLSAgICAgICAgICAgICAgICAuZ2V0TGFiZWwoZmlsZVN5c3RlbU9iamVjdCk7Ci0KLSAgICAgICAgaWYgKCFpc0NvbnRhaW5lciAmJiAhaGFzRGVzaXJlZEV4dGVuc2lvbihlbGVtZW50TGFiZWwpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgRmlsZVN5c3RlbUVsZW1lbnQgcmVzdWx0ID0gbmV3IEZpbGVTeXN0ZW1FbGVtZW50KGVsZW1lbnRMYWJlbCwgcGFyZW50LAotICAgICAgICAgICAgICAgIGlzQ29udGFpbmVyKTsKLSAgICAgICAgcmVzdWx0LnNldEZpbGVTeXN0ZW1PYmplY3QoZmlsZVN5c3RlbU9iamVjdCk7Ci0KLSAgICAgICAgaWYgKGlzQ29udGFpbmVyKSB7Ci0gICAgICAgICAgICBib29sZWFuIGhhdmVDaGlsZE9yRmlsZSA9IGZhbHNlOwotICAgICAgICAgICAgTGlzdCBjaGlsZHJlbiA9IHByb3ZpZGVyLmdldENoaWxkcmVuKGZpbGVTeXN0ZW1PYmplY3QpOwotICAgICAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpCi0gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KDEpOwotICAgICAgICAgICAgSXRlcmF0b3IgY2hpbGRyZW5FbnVtID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChjaGlsZHJlbkVudW0uaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUVsZW1lbnQocmVzdWx0LCBjaGlsZHJlbkVudW0ubmV4dCgpKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBoYXZlQ2hpbGRPckZpbGUgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWhhdmVDaGlsZE9yRmlsZSAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVGb2xkZXIocmVzdWx0KTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBleHRlbnNpb24gcG9ydGlvbiBvZiB0aGUgcGFzc2VkIGZpbGVuYW1lIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbkZvcihTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgaW50IG5JbmRleCA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0KLSAgICAgICAgaWYgKG5JbmRleCA+PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lLnN1YnN0cmluZyhuSW5kZXggKyAxKTsKLQotICAgICAgICByZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0aW5nIHJvb3QgZmlsZSBzeXN0ZW0gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZVN5c3RlbUVsZW1lbnQgZ2V0UmVzdWx0KCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBwYXNzZWQgZmlsZW5hbWUKLSAgICAgKiBpcyBvbmUgb2YgdGhlIGV4dGVuc2lvbnMgc3BlY2lmaWVkIGFzIGRlc2lyZWQgYnkgdGhlIGZpbHRlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNEZXNpcmVkRXh0ZW5zaW9uKFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICBpZiAoZGVzaXJlZEV4dGVuc2lvbnMgPT0gbnVsbCkgLy8gaWUuLSBhbGwgZXh0ZW5zaW9ucyBhcmUgZmluZQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaW50IGV4dGVuc2lvbnNTaXplID0gZGVzaXJlZEV4dGVuc2lvbnMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnNTaXplOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChnZXRFeHRlbnNpb25Gb3IoZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKGRlc2lyZWRFeHRlbnNpb25zW2ldKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIHRoZSBvcGVyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayhEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfc2Nhbm5pbmdNYXRjaGluZywgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUVsZW1lbnQobnVsbCwgcm9vdCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgRmlsZVN5c3RlbUVsZW1lbnQocHJvdmlkZXIuZ2V0TGFiZWwocm9vdCksIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5pc0ZvbGRlcihyb290KSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnNldEZpbGVTeXN0ZW1PYmplY3Qocm9vdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbGUgZXh0ZW5zaW9ucyB3aGljaCBhcmUgZGVzaXJlZC4gIEEgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBpbmRpY2F0ZXMgdGhhdCBhbGwgZmlsZXMgc2hvdWxkIGJlIGtlcHQgcmVnYXJkbGVzcyBvZiBleHRlbnNpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzaXJlZEV4dGVuc2lvbnMoU3RyaW5nW10gZXh0ZW5zaW9ucykgewotICAgICAgICBkZXNpcmVkRXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL1dpemFyZEV4dGVybmFsUHJvamVjdEltcG9ydFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL2RhdGF0cmFuc2Zlci9XaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDY5MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL1dpemFyZEV4dGVybmFsUHJvamVjdEltcG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2Zlci5EYXRhVHJhbnNmZXJNZXNzYWdlczsKLQotLyoqCi0gKiBTdGFuZGFyZCBtYWluIHBhZ2UgZm9yIGEgd2l6YXJkIHRoYXQgY3JlYXRlcyBhIHByb2plY3QgcmVzb3VyY2UgZnJvbQotICogd2hvc2UgbG9jYXRpb24gYWxyZWFkeSBjb250YWlucyBhIHByb2plY3QuCi0gKiA8cD4KLSAqIFRoaXMgcGFnZSBtYXkgYmUgdXNlZCBieSBjbGllbnRzIGFzLWlzOyBpdCBtYXkgYmUgYWxzbyBiZSBzdWJjbGFzc2VkIHRvIHN1aXQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEV4YW1wbGUgdXNhZ2U6Ci0gKiA8cHJlPgotICogbWFpblBhZ2UgPSBuZXcgV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZSgiYmFzaWNOZXdQcm9qZWN0UGFnZSIpOwotICogbWFpblBhZ2Uuc2V0VGl0bGUoIlByb2plY3QiKTsKLSAqIG1haW5QYWdlLnNldERlc2NyaXB0aW9uKCJDcmVhdGUgYSBuZXcgcHJvamVjdCByZXNvdXJjZS4iKTsKLSAqIDwvcHJlPgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0gICAgcHJpdmF0ZSBGaWxlRmlsdGVyIHByb2plY3RGaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLSAgICAgICAgLy9Pbmx5IGFjY2VwdCB0aG9zZSBmaWxlcyB0aGF0IGFyZSAucHJvamVjdAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRoTmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIHBhdGhOYW1lLmdldE5hbWUoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24uREVTQ1JJUFRJT05fRklMRV9OQU1FKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvL0tlZXAgdHJhY2sgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IHdlIGJyb3dzZWQgdG8gbGFzdCB0aW1lCi0gICAgLy90aGUgd2l6YXJkIHdhcyBpbnZva2VkLgotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwcmV2aW91c2x5QnJvd3NlZERpcmVjdG9yeSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyB3aWRnZXRzCi0gICAgcHJpdmF0ZSBUZXh0IHByb2plY3ROYW1lRmllbGQ7Ci0KLSAgICBwcml2YXRlIFRleHQgbG9jYXRpb25QYXRoRmllbGQ7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb247Ci0KLSAgICBwcml2YXRlIExpc3RlbmVyIGxvY2F0aW9uTW9kaWZ5TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLy8gY29uc3RhbnRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIID0gMjUwOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0IGNyZWF0aW9uIHdpemFyZCBwYWdlLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFdpemFyZEV4dGVybmFsUHJvamVjdEltcG9ydFBhZ2UoKSB7Ci0gICAgICAgIHN1cGVyKCJ3aXphcmRFeHRlcm5hbFByb2plY3RQYWdlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgc2V0VGl0bGUoRGF0YVRyYW5zZmVyTWVzc2FnZXMuV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV90aXRsZSk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKERhdGFUcmFuc2Zlck1lc3NhZ2VzLldpemFyZEV4dGVybmFsUHJvamVjdEltcG9ydFBhZ2VfZGVzY3JpcHRpb24pOwotCi0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1dJWkFSRF9QQUdFKTsKLQotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIGNyZWF0ZVByb2plY3ROYW1lR3JvdXAoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAoY29tcG9zaXRlKTsKLSAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgIC8vIFNob3cgZGVzY3JpcHRpb24gb24gb3BlbmluZwotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBwcm9qZWN0IGxvY2F0aW9uIHNwZWNpZmljYXRpb24gY29udHJvbHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZVByb2plY3RMb2NhdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICAvLyBwcm9qZWN0IHNwZWNpZmljYXRpb24gZ3JvdXAKLSAgICAgICAgQ29tcG9zaXRlIHByb2plY3RHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBwcm9qZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHByb2plY3RHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgcHJvamVjdEdyb3VwLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgLy8gbmV3IHByb2plY3QgbGFiZWwKLSAgICAgICAgTGFiZWwgcHJvamVjdENvbnRlbnRzTGFiZWwgPSBuZXcgTGFiZWwocHJvamVjdEdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIHByb2plY3RDb250ZW50c0xhYmVsLnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9wcm9qZWN0Q29udGVudHNMYWJlbCk7Ci0gICAgICAgIHByb2plY3RDb250ZW50c0xhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgY3JlYXRlVXNlclNwZWNpZmllZFByb2plY3RMb2NhdGlvbkdyb3VwKHByb2plY3RHcm91cCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgcHJvamVjdCBuYW1lIHNwZWNpZmljYXRpb24gY29udHJvbHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZVByb2plY3ROYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIEZvbnQgZGlhbG9nRm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0KLSAgICAgICAgLy8gcHJvamVjdCBzcGVjaWZpY2F0aW9uIGdyb3VwCi0gICAgICAgIENvbXBvc2l0ZSBwcm9qZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgcHJvamVjdEdyb3VwLnNldEZvbnQoZGlhbG9nRm9udCk7Ci0gICAgICAgIHByb2plY3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgcHJvamVjdEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIC8vIG5ldyBwcm9qZWN0IGxhYmVsCi0gICAgICAgIExhYmVsIHByb2plY3RMYWJlbCA9IG5ldyBMYWJlbChwcm9qZWN0R3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgcHJvamVjdExhYmVsLnNldFRleHQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9uYW1lTGFiZWwpOwotICAgICAgICBwcm9qZWN0TGFiZWwuc2V0Rm9udChkaWFsb2dGb250KTsKLQotICAgICAgICAvLyBuZXcgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0gICAgICAgIHByb2plY3ROYW1lRmllbGQgPSBuZXcgVGV4dChwcm9qZWN0R3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotICAgICAgICBwcm9qZWN0TmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHByb2plY3ROYW1lRmllbGQuc2V0Rm9udChkaWFsb2dGb250KTsKLSAgICAgICAgcHJvamVjdE5hbWVGaWVsZC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoCi0gICAgICAgICAgICAgICAgU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgcHJvamVjdCBsb2NhdGlvbiBzcGVjaWZpY2F0aW9uIGNvbnRyb2xzLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3RHcm91cCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVVc2VyU3BlY2lmaWVkUHJvamVjdExvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHByb2plY3RHcm91cCkgewotCi0gICAgICAgIEZvbnQgZGlhbG9nRm9udCA9IHByb2plY3RHcm91cC5nZXRGb250KCk7Ci0KLSAgICAgICAgLy8gcHJvamVjdCBsb2NhdGlvbiBlbnRyeSBmaWVsZAotICAgICAgICB0aGlzLmxvY2F0aW9uUGF0aEZpZWxkID0gbmV3IFRleHQocHJvamVjdEdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotICAgICAgICB0aGlzLmxvY2F0aW9uUGF0aEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHRoaXMubG9jYXRpb25QYXRoRmllbGQuc2V0Rm9udChkaWFsb2dGb250KTsKLQotICAgICAgICAvLyBicm93c2UgYnV0dG9uCi0gICAgICAgIHRoaXMuYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwcm9qZWN0R3JvdXAsIFNXVC5QVVNIKTsKLSAgICAgICAgdGhpcy5icm93c2VCdXR0b24uc2V0VGV4dChEYXRhVHJhbnNmZXJNZXNzYWdlcy5EYXRhVHJhbnNmZXJfYnJvd3NlKTsKLSAgICAgICAgdGhpcy5icm93c2VCdXR0b24uc2V0Rm9udChkaWFsb2dGb250KTsKLSAgICAgICAgc2V0QnV0dG9uTGF5b3V0RGF0YSh0aGlzLmJyb3dzZUJ1dHRvbik7Ci0KLSAgICAgICAgdGhpcy5icm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBsb2NhdGlvblBhdGhGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBsb2NhdGlvbk1vZGlmeUxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByb2plY3QgbG9jYXRpb24gcGF0aCBhcyBlbnRlcmVkIGJ5IAotICAgICAqIHRoZSB1c2VyLCBvciBpdHMgYW50aWNpcGF0ZWQgaW5pdGlhbCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgbG9jYXRpb24gcGF0aCwgaXRzIGFudGljaXBhdGVkIGluaXRpYWwgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogICBpZiBubyBwcm9qZWN0IGxvY2F0aW9uIHBhdGggaXMga25vd24KLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGggZ2V0TG9jYXRpb25QYXRoKCkgewotCi0gICAgICAgIHJldHVybiBuZXcgUGF0aChnZXRQcm9qZWN0TG9jYXRpb25GaWVsZFZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwcm9qZWN0IHJlc291cmNlIGhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCBuYW1lIGZpZWxkIHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNyZWF0ZSB0aGUgcHJvamVjdCByZXNvdXJjZTsgdGhpcyBpcyB0aGUgcmVzcG9uc2liaWxpdHkKLSAgICAgKiBvZiA8Y29kZT5JUHJvamVjdDo6Y3JlYXRlPC9jb2RlPiBpbnZva2VkIGJ5IHRoZSBuZXcgcHJvamVjdCByZXNvdXJjZSB3aXphcmQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3IHByb2plY3QgcmVzb3VyY2UgaGFuZGxlCi0gICAgICovCi0gICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3RIYW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoCi0gICAgICAgICAgICAgICAgZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwcm9qZWN0IG5hbWUgYXMgZW50ZXJlZCBieSB0aGUgdXNlciwgb3IgaXRzIGFudGljaXBhdGVkCi0gICAgICogaW5pdGlhbCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgbmFtZSwgaXRzIGFudGljaXBhdGVkIGluaXRpYWwgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogICBpZiBubyBwcm9qZWN0IG5hbWUgaXMga25vd24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0UHJvamVjdE5hbWVGaWVsZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb2plY3QgbmFtZSBmaWVsZAotICAgICAqIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIHJlbW92ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBuYW1lIGluIHRoZSBmaWVsZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb2plY3ROYW1lRmllbGRWYWx1ZSgpIHsKLSAgICAgICAgaWYgKHByb2plY3ROYW1lRmllbGQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHJldHVybiBwcm9qZWN0TmFtZUZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb2plY3QgbG9jYXRpb24gZmllbGQKLSAgICAgKiB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyByZW1vdmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgbG9jYXRpb24gZGlyZWN0b3J5IGluIHRoZSBmaWVsZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb2plY3RMb2NhdGlvbkZpZWxkVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhdGlvblBhdGhGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCU9wZW4gYW4gYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGJyb3dzZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTG9jYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCkgewotICAgICAgICBEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhsb2NhdGlvblBhdGhGaWVsZAotICAgICAgICAgICAgICAgIC5nZXRTaGVsbCgpKTsKLSAgICAgICAgZGlhbG9nLnNldE1lc3NhZ2UoRGF0YVRyYW5zZmVyTWVzc2FnZXMuV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9kaXJlY3RvcnlMYWJlbCk7Ci0KLSAgICAgICAgU3RyaW5nIGRpck5hbWUgPSBnZXRQcm9qZWN0TG9jYXRpb25GaWVsZFZhbHVlKCk7Ci0gICAgICAgIGlmIChkaXJOYW1lLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICBkaXJOYW1lID0gcHJldmlvdXNseUJyb3dzZWREaXJlY3Rvcnk7Ci0KLSAgICAgICAgaWYgKGRpck5hbWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJQYXRoKGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC50b09TU3RyaW5nKCkpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIEZpbGUgcGF0aCA9IG5ldyBGaWxlKGRpck5hbWUpOwotICAgICAgICAgICAgaWYgKHBhdGguZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgZGlhbG9nLnNldEZpbHRlclBhdGgobmV3IFBhdGgoZGlyTmFtZSkudG9PU1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcmV2aW91c2x5QnJvd3NlZERpcmVjdG9yeSA9IHNlbGVjdGVkRGlyZWN0b3J5OwotICAgICAgICAgICAgbG9jYXRpb25QYXRoRmllbGQuc2V0VGV4dChwcmV2aW91c2x5QnJvd3NlZERpcmVjdG9yeSk7Ci0gICAgICAgICAgICBzZXRQcm9qZWN0TmFtZShwcm9qZWN0RmlsZShwcmV2aW91c2x5QnJvd3NlZERpcmVjdG9yeSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFnZSdzIGNvbnRyb2xzIGN1cnJlbnRseSBhbGwgY29udGFpbiB2YWxpZCAKLSAgICAgKiB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBjb250cm9scyBhcmUgdmFsaWQsIGFuZAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGF0IGxlYXN0IG9uZSBpcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQotICAgICAgICBTdHJpbmcgbG9jYXRpb25GaWVsZENvbnRlbnRzID0gZ2V0UHJvamVjdExvY2F0aW9uRmllbGRWYWx1ZSgpOwotCi0gICAgICAgIGlmIChsb2NhdGlvbkZpZWxkQ29udGVudHMuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKERhdGFUcmFuc2Zlck1lc3NhZ2VzLldpemFyZEV4dGVybmFsUHJvamVjdEltcG9ydFBhZ2VfcHJvamVjdExvY2F0aW9uRW1wdHkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoIXBhdGguaXNWYWxpZFBhdGgobG9jYXRpb25GaWVsZENvbnRlbnRzKSkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKERhdGFUcmFuc2Zlck1lc3NhZ2VzLldpemFyZEV4dGVybmFsUHJvamVjdEltcG9ydFBhZ2VfbG9jYXRpb25FcnJvcik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIHByb2plY3RGaWxlID0gcHJvamVjdEZpbGUobG9jYXRpb25GaWVsZENvbnRlbnRzKTsKLSAgICAgICAgaWYgKHByb2plY3RGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShOTFMuYmluZChEYXRhVHJhbnNmZXJNZXNzYWdlcy5XaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlX25vdEFQcm9qZWN0LCBsb2NhdGlvbkZpZWxkQ29udGVudHMpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzZXRQcm9qZWN0TmFtZShwcm9qZWN0RmlsZSk7Ci0KLSAgICAgICAgaWYgKGdldFByb2plY3RIYW5kbGUoKS5leGlzdHMoKSkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKERhdGFUcmFuc2Zlck1lc3NhZ2VzLldpemFyZEV4dGVybmFsUHJvamVjdEltcG9ydFBhZ2VfcHJvamVjdEV4aXN0c01lc3NhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXRQbHVnaW5Xb3Jrc3BhY2UoKTsKLSAgICAgICAgcmV0dXJuIHdvcmtzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmVkIGxvY2F0aW9uIGlzIGEgcHJlZml4Ci0gICAgICogb2YgdGhlIHJvb3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUHJlZml4T2ZSb290KElQYXRoIGxvY2F0aW9uUGF0aCkgewotICAgICAgICByZXR1cm4gUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKGxvY2F0aW9uUGF0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwcm9qZWN0IG5hbWUgdXNpbmcgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZQotICAgICAqIHBhcmVudCBvZiB0aGUgZmlsZSBvciB0aGUgbmFtZSBlbnRyeSBpbiB0aGUgeG1sIGZvciAKLSAgICAgKiB0aGUgZmlsZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRQcm9qZWN0TmFtZShGaWxlIHByb2plY3RGaWxlKSB7Ci0KLSAgICAgICAgLy9JZiB0aGVyZSBpcyBubyBmaWxlIG9yIHRoZSB1c2VyIGhhcyBhbHJlYWR5IHNwZWNpZmllZCBmb3JnZXQgaXQKLSAgICAgICAgaWYgKHByb2plY3RGaWxlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKHByb2plY3RGaWxlLmdldFBhdGgoKSk7Ci0KLSAgICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBuZXdEZXNjcmlwdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ld0Rlc2NyaXB0aW9uID0gZ2V0V29ya3NwYWNlKCkubG9hZFByb2plY3REZXNjcmlwdGlvbihwYXRoKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgIC8vbm8gZ29vZCBjb3VsZG4ndCBnZXQgdGhlIG5hbWUKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXdEZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIHRoaXMucHJvamVjdE5hbWVGaWVsZC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotICAgICAgICAgICAgdGhpcy5wcm9qZWN0TmFtZUZpZWxkLnNldFRleHQodGhpcy5kZXNjcmlwdGlvbi5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEucHJvamVjdCBmaWxlIGZyb20gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KLSAgICAgKiBJZiB0aGVyZSBpc24ndCBvbmUgcmV0dXJuIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHByb2plY3RGaWxlKFN0cmluZyBsb2NhdGlvbkZpZWxkQ29udGVudHMpIHsKLSAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShsb2NhdGlvbkZpZWxkQ29udGVudHMpOwotICAgICAgICBpZiAoZGlyZWN0b3J5LmlzRmlsZSgpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcyh0aGlzLnByb2plY3RGaWx0ZXIpOwotICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPT0gMSkKLSAgICAgICAgICAgIHJldHVybiBmaWxlc1swXTsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHByb2plY3QgcmVzb3VyY2Ugd2l0aCB0aGUgc2VsZWN0ZWQgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiBub3JtYWwgdXNhZ2UsIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHVzZXIgaGFzIHByZXNzZWQgRmluaXNoIG9uCi0gICAgICogdGhlIHdpemFyZDsgdGhlIGVuYWJsZW1lbnQgb2YgdGhlIEZpbmlzaCBidXR0b24gaW1wbGllcyB0aGF0IGFsbCBjb250cm9scwotICAgICAqIG9uIHRoZSBwYWdlcyBjdXJyZW50bHkgY29udGFpbiB2YWxpZCB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBwcm9qZWN0IHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvamVjdAotICAgICAqICAgIHdhcyBub3QgY3JlYXRlZAotICAgICAqLwotICAgIElQcm9qZWN0IGNyZWF0ZUV4aXN0aW5nUHJvamVjdCgpIHsKLQotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZUZpZWxkLmdldFRleHQoKTsKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBpZiAodGhpcy5kZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gd29ya3NwYWNlLm5ld1Byb2plY3REZXNjcmlwdGlvbihwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBJUGF0aCBsb2NhdGlvblBhdGggPSBnZXRMb2NhdGlvblBhdGgoKTsKLSAgICAgICAgICAgIC8vSWYgaXQgaXMgdW5kZXIgdGhlIHJvb3QgdXNlIHRoZSBkZWZhdWx0IGxvY2F0aW9uCi0gICAgICAgICAgICBpZiAoaXNQcmVmaXhPZlJvb3QobG9jYXRpb25QYXRoKSkKLSAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uLnNldExvY2F0aW9uKG51bGwpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24uc2V0TG9jYXRpb24obG9jYXRpb25QYXRoKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uLnNldE5hbWUocHJvamVjdE5hbWUpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgbmV3IHByb2plY3Qgb3BlcmF0aW9uCi0gICAgICAgIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCAyMDAwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHByb2plY3QuY3JlYXRlKGRlc2NyaXB0aW9uLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAxMDAwKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICBwcm9qZWN0Lm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICAvLyBydW4gdGhlIG5ldyBwcm9qZWN0IGNyZWF0aW9uIG9wZXJhdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWUuLSBvbmUgb2YgdGhlIHN0ZXBzIHJlc3VsdGVkIGluIGEgY29yZSBleGNlcHRpb24JCi0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoKChDb3JlRXhjZXB0aW9uKSB0KS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLkNBU0VfVkFSSUFOVF9FWElTVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVRyYW5zZmVyTWVzc2FnZXMuV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9lcnJvck1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJRGF0YVRyYW5zZmVyTWVzc2FnZXMuV2l6YXJkRXh0ZXJuYWxQcm9qZWN0SW1wb3J0UGFnZV9jYXNlVmFyaWFudEV4aXN0c0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlwcm9qZWN0TmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHJhbnNmZXJNZXNzYWdlcy5XaXphcmRFeHRlcm5hbFByb2plY3RJbXBvcnRQYWdlX2Vycm9yTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICgoQ29yZUV4Y2VwdGlvbikgdCkuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBzZWUgQERpYWxvZ1BhZ2Uuc2V0VmlzaWJsZShib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgIGlmICh2aXNpYmxlKQotICAgICAgICAgICAgdGhpcy5sb2NhdGlvblBhdGhGaWVsZC5zZXRGb2N1cygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL1ppcEZpbGVFeHBvcnRXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL2RhdGF0cmFuc2Zlci9aaXBGaWxlRXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNjhlOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL1ppcEZpbGVFeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2Zlck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLldpemFyZEFyY2hpdmVGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBTdGFuZGFyZCB3b3JrYmVuY2ggd2l6YXJkIGZvciBleHBvcnRpbmcgcmVzb3VyY2VzIGZyb20gdGhlIHdvcmtzcGFjZQotICogdG8gYSB6aXAgZmlsZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIGFuZCB1c2VkIHdpdGhvdXQgZnVydGhlciBjb25maWd1cmF0aW9uOwotICogdGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogRXhhbXBsZToKLSAqIDxwcmU+Ci0gKiBJV2l6YXJkIHdpemFyZCA9IG5ldyBaaXBGaWxlRXhwb3J0V2l6YXJkKCk7Ci0gKiB3aXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0gKiBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAqIGRpYWxvZy5vcGVuKCk7Ci0gKiA8L3ByZT4KLSAqIER1cmluZyB0aGUgY2FsbCB0byA8Y29kZT5vcGVuPC9jb2RlPiwgdGhlIHdpemFyZCBkaWFsb2cgaXMgcHJlc2VudGVkIHRvIHRoZQotICogdXNlci4gV2hlbiB0aGUgdXNlciBoaXRzIEZpbmlzaCwgdGhlIHVzZXItc2VsZWN0ZWQgd29ya3NwYWNlIHJlc291cmNlcyAKLSAqIGFyZSBleHBvcnRlZCB0byB0aGUgdXNlci1zcGVjaWZpZWQgemlwIGZpbGUsIHRoZSBkaWFsb2cgY2xvc2VzLCBhbmQgdGhlIGNhbGwKLSAqIHRvIDxjb2RlPm9wZW48L2NvZGU+IHJldHVybnMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBaaXBGaWxlRXhwb3J0V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUV4cG9ydFdpemFyZCB7Ci0gICAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgICBwcml2YXRlIFdpemFyZEFyY2hpdmVGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMSBtYWluUGFnZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB3aXphcmQgZm9yIGV4cG9ydGluZyB3b3Jrc3BhY2UgcmVzb3VyY2VzIHRvIGEgemlwIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIFppcEZpbGVFeHBvcnRXaXphcmQoKSB7Ci0gICAgICAgIEFic3RyYWN0VUlQbHVnaW4gcGx1Z2luID0gKEFic3RyYWN0VUlQbHVnaW4pIFBsYXRmb3JtCi0gICAgICAgICAgICAgICAgLmdldFBsdWdpbihQbGF0Zm9ybVVJLlBMVUdJTl9JRCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IHBsdWdpbi5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oIlppcEZpbGVFeHBvcnRXaXphcmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChzZWN0aW9uID09IG51bGwpCi0gICAgICAgICAgICBzZWN0aW9uID0gd29ya2JlbmNoU2V0dGluZ3MuYWRkTmV3U2VjdGlvbigiWmlwRmlsZUV4cG9ydFdpemFyZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0RGlhbG9nU2V0dGluZ3Moc2VjdGlvbik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotICAgICAgICBzdXBlci5hZGRQYWdlcygpOwotICAgICAgICBtYWluUGFnZSA9IG5ldyBXaXphcmRBcmNoaXZlRmlsZVJlc291cmNlRXhwb3J0UGFnZTEoc2VsZWN0aW9uKTsKLSAgICAgICAgYWRkUGFnZShtYWluUGFnZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uOwotICAgICAgICBMaXN0IHNlbGVjdGVkUmVzb3VyY2VzID0gSURFLmNvbXB1dGVTZWxlY3RlZFJlc291cmNlcyhjdXJyZW50U2VsZWN0aW9uKTsKLSAgICAgICAgaWYgKCFzZWxlY3RlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRSZXNvdXJjZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0V2luZG93VGl0bGUoRGF0YVRyYW5zZmVyTWVzc2FnZXMuRGF0YVRyYW5zZmVyX2V4cG9ydCk7Ci0gICAgICAgIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKElERVdvcmtiZW5jaFBsdWdpbi5nZXRJREVJbWFnZURlc2NyaXB0b3IoIndpemJhbi9leHBvcnR6aXBfd2l6LmdpZiIpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotICAgICAgICByZXR1cm4gbWFpblBhZ2UuZmluaXNoKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL1ppcEZpbGVJbXBvcnRXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL2RhdGF0cmFuc2Zlci9aaXBGaWxlSW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTc4ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL1ppcEZpbGVJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERVdvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2Zlci5EYXRhVHJhbnNmZXJNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2Zlci5XaXphcmRBcmNoaXZlRmlsZVJlc291cmNlSW1wb3J0UGFnZTE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogU3RhbmRhcmQgd29ya2JlbmNoIHdpemFyZCBmb3IgaW1wb3J0aW5nIHJlc291cmNlcyBmcm9tIGEgemlwIGZpbGUKLSAqIGludG8gdGhlIHdvcmtzcGFjZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIGFuZCB1c2VkIHdpdGhvdXQgZnVydGhlciBjb25maWd1cmF0aW9uOwotICogdGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogRXhhbXBsZToKLSAqIDxwcmU+Ci0gKiBJV2l6YXJkIHdpemFyZCA9IG5ldyBaaXBGaWxlSW1wb3J0V2l6YXJkKCk7Ci0gKiB3aXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0gKiBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAqIGRpYWxvZy5vcGVuKCk7Ci0gKiA8L3ByZT4KLSAqIER1cmluZyB0aGUgY2FsbCB0byA8Y29kZT5vcGVuPC9jb2RlPiwgdGhlIHdpemFyZCBkaWFsb2cgaXMgcHJlc2VudGVkIHRvIHRoZQotICogdXNlci4gV2hlbiB0aGUgdXNlciBoaXRzIEZpbmlzaCwgdGhlIHVzZXItc2VsZWN0ZWQgemlwIGZpbGUgaXMgaW1wb3J0ZWQKLSAqIGludG8gdGhlIHdvcmtzcGFjZSwgdGhlIGRpYWxvZyBjbG9zZXMsIGFuZCB0aGUgY2FsbCB0byA8Y29kZT5vcGVuPC9jb2RlPgotICogcmV0dXJucy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFppcEZpbGVJbXBvcnRXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLSAgICBwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0gICAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgICBwcml2YXRlIFdpemFyZEFyY2hpdmVGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMSBtYWluUGFnZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB3aXphcmQgZm9yIGltcG9ydGluZyByZXNvdXJjZXMgaW50byB0aGUgd29ya3NwYWNlIGZyb20KLSAgICAgKiBhIHppcCBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBaaXBGaWxlSW1wb3J0V2l6YXJkKCkgewotICAgICAgICBBYnN0cmFjdFVJUGx1Z2luIHBsdWdpbiA9IChBYnN0cmFjdFVJUGx1Z2luKSBQbGF0Zm9ybQotICAgICAgICAgICAgICAgIC5nZXRQbHVnaW4oUGxhdGZvcm1VSS5QTFVHSU5fSUQpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBwbHVnaW4uZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uKCJaaXBGaWxlSW1wb3J0V2l6YXJkIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoc2VjdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgc2VjdGlvbiA9IHdvcmtiZW5jaFNldHRpbmdzLmFkZE5ld1NlY3Rpb24oIlppcEZpbGVJbXBvcnRXaXphcmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHNldERpYWxvZ1NldHRpbmdzKHNlY3Rpb24pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLSAgICAgICAgc3VwZXIuYWRkUGFnZXMoKTsKLSAgICAgICAgbWFpblBhZ2UgPSBuZXcgV2l6YXJkQXJjaGl2ZUZpbGVSZXNvdXJjZUltcG9ydFBhZ2UxKHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLSAgICAgICAgYWRkUGFnZShtYWluUGFnZSk7Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbikgewotICAgICAgICB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uOwotICAgICAgICBMaXN0IHNlbGVjdGVkUmVzb3VyY2VzID0gSURFLmNvbXB1dGVTZWxlY3RlZFJlc291cmNlcyhjdXJyZW50U2VsZWN0aW9uKTsKLSAgICAgICAgaWYgKCFzZWxlY3RlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRSZXNvdXJjZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0V2luZG93VGl0bGUoRGF0YVRyYW5zZmVyTWVzc2FnZXMuRGF0YVRyYW5zZmVyX2ltcG9ydFRpdGxlKTsKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigid2l6YmFuL2ltcG9ydHppcF93aXouZ2lmIikpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0gICAgICAgIHJldHVybiBtYWluUGFnZS5jYW5jZWwoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIG1haW5QYWdlLmZpbmlzaCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL2RhdGF0cmFuc2Zlci9aaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL2RhdGF0cmFuc2Zlci9aaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM1ZDRjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9kYXRhdHJhbnNmZXIvWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGNvbnRleHQgc3RydWN0dXJlIGFuZAotICogY29udGVudCBvZiBzcGVjaWZpZWQgemlwIGZpbGUgZW50cnkgb2JqZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIFppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBpbXBsZW1lbnRzIElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBaaXBGaWxlIHppcEZpbGU7Ci0KLSAgICBwcml2YXRlIFppcEVudHJ5IHJvb3QgPSBuZXcgWmlwRW50cnkoIi8iKTsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIE1hcCBjaGlsZHJlbjsKLQotICAgIHByaXZhdGUgTWFwIGRpcmVjdG9yeUVudHJ5Q2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIDxjb2RlPlppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlcjwvY29kZT4sIHdoaWNoIHdpbGwgb3BlcmF0ZQotICAgICAqIG9uIHRoZSBwYXNzZWQgemlwIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIFppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlcihaaXBGaWxlIHNvdXJjZUZpbGUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgemlwRmlsZSA9IHNvdXJjZUZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGNoaWxkIHRvIHRoZSBpbnRlcm5hbCBjb2xsZWN0aW9uIG9mIHRoZSBwYXJlbnQncyBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb0NoaWxkcmVuKFppcEVudHJ5IHBhcmVudCwgWmlwRW50cnkgY2hpbGQpIHsKLSAgICAgICAgTGlzdCBjaGlsZExpc3QgPSAoTGlzdCkgY2hpbGRyZW4uZ2V0KHBhcmVudCk7Ci0gICAgICAgIGlmIChjaGlsZExpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgY2hpbGRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgY2hpbGRyZW4ucHV0KHBhcmVudCwgY2hpbGRMaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoaWxkTGlzdC5hZGQoY2hpbGQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHppcCBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgaWZmCi0gICAgICogaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250YWluZXIoSVBhdGggcGF0aG5hbWUpIHsKLSAgICAgICAgaWYgKGRpcmVjdG9yeUVudHJ5Q2FjaGUuY29udGFpbnNLZXkocGF0aG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFppcEVudHJ5IHBhcmVudDsKLSAgICAgICAgaWYgKHBhdGhuYW1lLnNlZ21lbnRDb3VudCgpID09IDEpCi0gICAgICAgICAgICBwYXJlbnQgPSByb290OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwYXJlbnQgPSAoWmlwRW50cnkpIGRpcmVjdG9yeUVudHJ5Q2FjaGUuZ2V0KHBhdGhuYW1lCi0gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVMYXN0U2VnbWVudHMoMSkpOwotCi0gICAgICAgIFppcEVudHJ5IG5ld0VudHJ5ID0gbmV3IFppcEVudHJ5KHBhdGhuYW1lLnRvU3RyaW5nKCkpOwotICAgICAgICBkaXJlY3RvcnlFbnRyeUNhY2hlLnB1dChwYXRobmFtZSwgbmV3RW50cnkpOwotICAgICAgICBhZGRUb0NoaWxkcmVuKHBhcmVudCwgbmV3RW50cnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZmlsZSB6aXAgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsZShaaXBFbnRyeSBlbnRyeSkgewotICAgICAgICBJUGF0aCBwYXRobmFtZSA9IG5ldyBQYXRoKGVudHJ5LmdldE5hbWUoKSk7Ci0gICAgICAgIFppcEVudHJ5IHBhcmVudDsKLSAgICAgICAgaWYgKHBhdGhuYW1lLnNlZ21lbnRDb3VudCgpID09IDEpCi0gICAgICAgICAgICBwYXJlbnQgPSByb290OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwYXJlbnQgPSAoWmlwRW50cnkpIGRpcmVjdG9yeUVudHJ5Q2FjaGUuZ2V0KHBhdGhuYW1lCi0gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVMYXN0U2VnbWVudHMoMSkpOwotCi0gICAgICAgIGFkZFRvQ2hpbGRyZW4ocGFyZW50LCBlbnRyeSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLSAgICAgICAgICAgIGluaXRpYWxpemUoKTsKLQotICAgICAgICByZXR1cm4gKChMaXN0KSBjaGlsZHJlbi5nZXQoZWxlbWVudCkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gemlwRmlsZS5nZXRJbnB1dFN0cmVhbSgoWmlwRW50cnkpIGVsZW1lbnQpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsUGF0aChPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gKChaaXBFbnRyeSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudC5lcXVhbHMocm9vdCkpCi0gICAgICAgICAgICByZXR1cm4gKChaaXBFbnRyeSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCi0gICAgICAgIHJldHVybiBuZXcgUGF0aCgoKFppcEVudHJ5KSBlbGVtZW50KS5nZXROYW1lKCkpLmxhc3RTZWdtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZW50cnkgdGhhdCB0aGlzIGltcG9ydGVyIHVzZXMgYXMgdGhlIHJvb3Qgc2VudGluZWwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC56aXAuWmlwRW50cnkKLSAgICAgKi8KLSAgICBwdWJsaWMgWmlwRW50cnkgZ2V0Um9vdCgpIHsKLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgemlwIGZpbGUgdGhhdCB0aGlzIHByb3ZpZGVyIHByb3ZpZGVzIHN0cnVjdHVyZSBmb3IuCi0gICAgICovCi0gICAgcHVibGljIFppcEZpbGUgZ2V0WmlwRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHppcEZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhpcyBvYmplY3QncyBjaGlsZHJlbiB0YWJsZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YKLSAgICAgKiB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICAgIGNoaWxkcmVuID0gbmV3IEhhc2hNYXAoMTAwMCk7Ci0KLSAgICAgICAgRW51bWVyYXRpb24gZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOwotICAgICAgICB3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChlbnRyeS5nZXROYW1lKCkpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgaW50IHBhdGhTZWdtZW50Q291bnQgPSBwYXRoLnNlZ21lbnRDb3VudCgpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXRoU2VnbWVudENvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbnRhaW5lcihwYXRoLnVwdG9TZWdtZW50KGkpKTsKLSAgICAgICAgICAgICAgICBjcmVhdGVGaWxlKGVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNGb2xkZXIoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuICgoWmlwRW50cnkpIGVsZW1lbnQpLmlzRGlyZWN0b3J5KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL2RhdGF0cmFuc2Zlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzQxMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvZGF0YXRyYW5zZmVyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgc3RhbmRhcmQgSW1wb3J0IGFuZCBFeHBvcnQgd2l6YXJkcyBmb3IKLW1vdmluZyByZXNvdXJjZXMgaW50byBhbmQgb3V0IG9mIHRoZSB3b3Jrc3BhY2UuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9uZXdyZXNvdXJjZS9CYXNpY05ld0ZpbGVSZXNvdXJjZVdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvbmV3cmVzb3VyY2UvQmFzaWNOZXdGaWxlUmVzb3VyY2VXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4M2U1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9uZXdyZXNvdXJjZS9CYXNpY05ld0ZpbGVSZXNvdXJjZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5EaWFsb2dVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5uZXdyZXNvdXJjZS5SZXNvdXJjZU1lc3NhZ2VzOwotCi0vKioKLSAqIFN0YW5kYXJkIHdvcmtiZW5jaCB3aXphcmQgdGhhdCBjcmVhdGUgYSBuZXcgZmlsZSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgYW5kIHVzZWQgd2l0aG91dCBmdXJ0aGVyIGNvbmZpZ3VyYXRpb247Ci0gKiB0aGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogPHA+Ci0gKiBFeGFtcGxlOgotICogPHByZT4KLSAqIElXb3JrYmVuY2hXaXphcmQgd2l6YXJkID0gbmV3IEJhc2ljTmV3RmlsZVJlc291cmNlV2l6YXJkKCk7Ci0gKiB3aXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0gKiBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAqIGRpYWxvZy5vcGVuKCk7Ci0gKiA8L3ByZT4KLSAqIER1cmluZyB0aGUgY2FsbCB0byA8Y29kZT5vcGVuPC9jb2RlPiwgdGhlIHdpemFyZCBkaWFsb2cgaXMgcHJlc2VudGVkIHRvIHRoZQotICogdXNlci4gV2hlbiB0aGUgdXNlciBoaXRzIEZpbmlzaCwgYSBmaWxlIHJlc291cmNlIGF0IHRoZSB1c2VyLXNwZWNpZmllZAotICogd29ya3NwYWNlIHBhdGggaXMgY3JlYXRlZCwgdGhlIGRpYWxvZyBjbG9zZXMsIGFuZCB0aGUgY2FsbCB0bwotICogPGNvZGU+b3BlbjwvY29kZT4gcmV0dXJucy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEJhc2ljTmV3RmlsZVJlc291cmNlV2l6YXJkIGV4dGVuZHMgQmFzaWNOZXdSZXNvdXJjZVdpemFyZCB7Ci0gICAgcHJpdmF0ZSBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIG1haW5QYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHdpemFyZCBmb3IgY3JlYXRpbmcgYSBuZXcgZmlsZSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBCYXNpY05ld0ZpbGVSZXNvdXJjZVdpemFyZCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0gICAgICAgIHN1cGVyLmFkZFBhZ2VzKCk7Ci0gICAgICAgIG1haW5QYWdlID0gbmV3IFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoIm5ld0ZpbGVQYWdlMSIsIGdldFNlbGVjdGlvbigpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIG1haW5QYWdlLnNldFRpdGxlKFJlc291cmNlTWVzc2FnZXMuRmlsZVJlc291cmNlX3BhZ2VUaXRsZSk7Ci0gICAgICAgIG1haW5QYWdlLnNldERlc2NyaXB0aW9uKFJlc291cmNlTWVzc2FnZXMuRmlsZVJlc291cmNlX2Rlc2NyaXB0aW9uKTsgCi0gICAgICAgIGFkZFBhZ2UobWFpblBhZ2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uKSB7Ci0gICAgICAgIHN1cGVyLmluaXQod29ya2JlbmNoLCBjdXJyZW50U2VsZWN0aW9uKTsKLSAgICAgICAgc2V0V2luZG93VGl0bGUoUmVzb3VyY2VNZXNzYWdlcy5GaWxlUmVzb3VyY2Vfc2hlbGxUaXRsZSk7Ci0gICAgICAgIHNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQmFzaWNOZXdSZXNvdXJjZVdpemFyZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJ3aXpiYW4vbmV3ZmlsZV93aXouZ2lmIik7Ly8kTk9OLU5MUy0xJAotCSAgIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotICAgICAgICBJRmlsZSBmaWxlID0gbWFpblBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHNlbGVjdEFuZFJldmVhbChmaWxlKTsKLQotICAgICAgICAvLyBPcGVuIGVkaXRvciBvbiBuZXcgZmlsZS4KLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyBkdyA9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGR3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZHcuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgICAgIGlmIChwYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBEaWFsb2dVdGlsLm9wZW5FcnJvcihkdy5nZXRTaGVsbCgpLCBSZXNvdXJjZU1lc3NhZ2VzLkZpbGVSZXNvdXJjZV9lcnJvck1lc3NhZ2UsIAotICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9uZXdyZXNvdXJjZS9CYXNpY05ld0ZvbGRlclJlc291cmNlV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLmlkZS9zcmMvb3JnL2VjbGlwc2UvdWkvd2l6YXJkcy9uZXdyZXNvdXJjZS9CYXNpY05ld0ZvbGRlclJlc291cmNlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZmFkODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvbmV3cmVzb3VyY2UvQmFzaWNOZXdGb2xkZXJSZXNvdXJjZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGb2xkZXJNYWluUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMubmV3cmVzb3VyY2UuUmVzb3VyY2VNZXNzYWdlczsKLQotLyoqCi0gKiBTdGFuZGFyZCB3b3JrYmVuY2ggd2l6YXJkIHRoYXQgY3JlYXRlIGEgbmV3IGZvbGRlciByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgYW5kIHVzZWQgd2l0aG91dCBmdXJ0aGVyIGNvbmZpZ3VyYXRpb247Ci0gKiB0aGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogPHA+Ci0gKiBFeGFtcGxlOgotICogPHByZT4KLSAqIElXb3JrYmVuY2hXaXphcmQgd2l6YXJkID0gbmV3IEJhc2ljTmV3Rm9sZGVyUmVzb3VyY2VXaXphcmQoKTsKLSAqIHdpemFyZC5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLSAqIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotICogZGlhbG9nLm9wZW4oKTsKLSAqIDwvcHJlPgotICogRHVyaW5nIHRoZSBjYWxsIHRvIDxjb2RlPm9wZW48L2NvZGU+LCB0aGUgd2l6YXJkIGRpYWxvZyBpcyBwcmVzZW50ZWQgdG8gdGhlCi0gKiB1c2VyLiBXaGVuIHRoZSB1c2VyIGhpdHMgRmluaXNoLCBhIGZvbGRlciByZXNvdXJjZSBhdCB0aGUgdXNlci1zcGVjaWZpZWQKLSAqIHdvcmtzcGFjZSBwYXRoIGlzIGNyZWF0ZWQsIHRoZSBkaWFsb2cgY2xvc2VzLCBhbmQgdGhlIGNhbGwgdG8KLSAqIDxjb2RlPm9wZW48L2NvZGU+IHJldHVybnMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY05ld0ZvbGRlclJlc291cmNlV2l6YXJkIGV4dGVuZHMgQmFzaWNOZXdSZXNvdXJjZVdpemFyZCB7Ci0gICAgcHJpdmF0ZSBXaXphcmROZXdGb2xkZXJNYWluUGFnZSBtYWluUGFnZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB3aXphcmQgZm9yIGNyZWF0aW5nIGEgbmV3IGZvbGRlciByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBCYXNpY05ld0ZvbGRlclJlc291cmNlV2l6YXJkKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLSAgICAgICAgc3VwZXIuYWRkUGFnZXMoKTsKLSAgICAgICAgbWFpblBhZ2UgPSBuZXcgV2l6YXJkTmV3Rm9sZGVyTWFpblBhZ2UoUmVzb3VyY2VNZXNzYWdlcy5OZXdGb2xkZXJfdGV4dCwgZ2V0U2VsZWN0aW9uKCkpOyAKLSAgICAgICAgYWRkUGFnZShtYWluUGFnZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIuaW5pdCh3b3JrYmVuY2gsIGN1cnJlbnRTZWxlY3Rpb24pOwotICAgICAgICBzZXRXaW5kb3dUaXRsZShSZXNvdXJjZU1lc3NhZ2VzLk5ld0ZvbGRlcl90aXRsZSk7Ci0gICAgICAgIHNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQmFzaWNOZXdSZXNvdXJjZVdpemFyZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICBJbWFnZURlc2NyaXB0b3IgZGVzYyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXRJREVJbWFnZURlc2NyaXB0b3IoIndpemJhbi9uZXdmb2xkZXJfd2l6LmdpZiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotICAgICAgIAotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotICAgICAgICBJRm9sZGVyIGZvbGRlciA9IG1haW5QYWdlLmNyZWF0ZU5ld0ZvbGRlcigpOwotICAgICAgICBpZiAoZm9sZGVyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgc2VsZWN0QW5kUmV2ZWFsKGZvbGRlcik7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvbmV3cmVzb3VyY2UvQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL25ld3Jlc291cmNlL0Jhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NjkyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvbmV3cmVzb3VyY2UvQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQbHVnaW5Db250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUFjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLldvcmtiZW5jaEFjdGl2aXR5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld1Byb2plY3RSZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVJbnRlcm5hbFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnV0aWwuUHJlZlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5uZXdyZXNvdXJjZS5SZXNvdXJjZU1lc3NhZ2VzOwotCi0vKioKLSAqIFN0YW5kYXJkIHdvcmtiZW5jaCB3aXphcmQgdGhhdCBjcmVhdGVzIGEgbmV3IHByb2plY3QgcmVzb3VyY2UgaW4gdGhlCi0gKiB3b3Jrc3BhY2UuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBhbmQgdXNlZCB3aXRob3V0IGZ1cnRoZXIgY29uZmlndXJhdGlvbjsgdGhpcwotICogY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEV4YW1wbGU6Ci0gKiAKLSAqIDxwcmU+Ci0gKiBJV29ya2JlbmNoV2l6YXJkIHdpemFyZCA9IG5ldyBCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZCgpOwotICogd2l6YXJkLmluaXQod29ya2JlbmNoLCBzZWxlY3Rpb24pOwotICogV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0gKiBkaWFsb2cub3BlbigpOwotICogPC9wcmU+Ci0gKiAKLSAqIER1cmluZyB0aGUgY2FsbCB0byA8Y29kZT5vcGVuPC9jb2RlPiwgdGhlIHdpemFyZCBkaWFsb2cgaXMgcHJlc2VudGVkIHRvCi0gKiB0aGUgdXNlci4gV2hlbiB0aGUgdXNlciBoaXRzIEZpbmlzaCwgYSBwcm9qZWN0IHJlc291cmNlIHdpdGggdGhlCi0gKiB1c2VyLXNwZWNpZmllZCBuYW1lIGlzIGNyZWF0ZWQsIHRoZSBkaWFsb2cgY2xvc2VzLCBhbmQgdGhlIGNhbGwgdG8KLSAqIDxjb2RlPm9wZW48L2NvZGU+IHJldHVybnMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZCBleHRlbmRzIEJhc2ljTmV3UmVzb3VyY2VXaXphcmQKLSAgICAgICAgaW1wbGVtZW50cyBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0gICAgcHJpdmF0ZSBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlIG1haW5QYWdlOwotCi0gICAgcHJpdmF0ZSBXaXphcmROZXdQcm9qZWN0UmVmZXJlbmNlUGFnZSByZWZlcmVuY2VQYWdlOwotCi0gICAgLy8gY2FjaGUgb2YgbmV3bHktY3JlYXRlZCBwcm9qZWN0Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBuZXdQcm9qZWN0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbmZpZyBlbGVtZW50IHdoaWNoIGRlY2xhcmVzIHRoaXMgd2l6YXJkLgotICAgICAqLwotICAgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgV0lORE9XX1BST0JMRU1TX1RJVExFID0gUmVzb3VyY2VNZXNzYWdlcy5OZXdQcm9qZWN0X2Vycm9yT3BlbmluZ1dpbmRvdzsgCi0KLSAgICAvKioKLSAgICAgKiBFeHRlbnNpb24gYXR0cmlidXRlIG5hbWUgZm9yIGZpbmFsIHBlcnNwZWN0aXZlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QRVJTUEVDVElWRSA9ICJmaW5hbFBlcnNwZWN0aXZlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogRXh0ZW5zaW9uIGF0dHJpYnV0ZSBuYW1lIGZvciBwcmVmZXJyZWQgcGVyc3BlY3RpdmVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJSRURfUEVSU1BFQ1RJVkVTID0gInByZWZlcnJlZFBlcnNwZWN0aXZlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB3aXphcmQgZm9yIGNyZWF0aW5nIGEgbmV3IHByb2plY3QgcmVzb3VyY2UgaW4gdGhlIHdvcmtzcGFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQoKSB7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uKCJCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHNlY3Rpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIHNlY3Rpb24gPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAuYWRkTmV3U2VjdGlvbigiQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHNldERpYWxvZ1NldHRpbmdzKHNlY3Rpb24pOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLSAgICAgICAgc3VwZXIuYWRkUGFnZXMoKTsKLQotICAgICAgICBtYWluUGFnZSA9IG5ldyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlKCJiYXNpY05ld1Byb2plY3RQYWdlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBtYWluUGFnZS5zZXRUaXRsZShSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfdGl0bGUpOwotICAgICAgICBtYWluUGFnZS5zZXREZXNjcmlwdGlvbihSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfZGVzY3JpcHRpb24pOwotICAgICAgICB0aGlzLmFkZFBhZ2UobWFpblBhZ2UpOwotCi0gICAgICAgIC8vIG9ubHkgYWRkIHBhZ2UgaWYgdGhlcmUgYXJlIGFscmVhZHkgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZQotICAgICAgICBpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHJlZmVyZW5jZVBhZ2UgPSBuZXcgV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZVBhZ2UoCi0gICAgICAgICAgICAgICAgICAgICJiYXNpY1JlZmVyZW5jZVByb2plY3RQYWdlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmVmZXJlbmNlUGFnZS5zZXRUaXRsZShSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfcmVmZXJlbmNlVGl0bGUpOwotICAgICAgICAgICAgcmVmZXJlbmNlUGFnZS5zZXREZXNjcmlwdGlvbihSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfcmVmZXJlbmNlRGVzY3JpcHRpb24pOwotICAgICAgICAgICAgdGhpcy5hZGRQYWdlKHJlZmVyZW5jZVBhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0IHJlc291cmNlIHdpdGggdGhlIHNlbGVjdGVkIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogSW4gbm9ybWFsIHVzYWdlLCB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIGFmdGVyIHRoZSB1c2VyIGhhcyBwcmVzc2VkIEZpbmlzaAotICAgICAqIG9uIHRoZSB3aXphcmQ7IHRoZSBlbmFibGVtZW50IG9mIHRoZSBGaW5pc2ggYnV0dG9uIGltcGxpZXMgdGhhdCBhbGwKLSAgICAgKiBjb250cm9scyBvbiB0aGUgcGFnZXMgY3VycmVudGx5IGNvbnRhaW4gdmFsaWQgdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyB3aXphcmQgY2FjaGVzIHRoZSBuZXcgcHJvamVjdCBvbmNlIGl0IGhhcyBiZWVuCi0gICAgICogc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQ7IHN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YgdGhpcyBtZXRob2Qgd2lsbCBhbnN3ZXIKLSAgICAgKiB0aGUgc2FtZSBwcm9qZWN0IHJlc291cmNlIHdpdGhvdXQgYXR0ZW1wdGluZyB0byBjcmVhdGUgaXQgYWdhaW4uCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgcHJvamVjdCByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0gICAgICogICAgICAgICBwcm9qZWN0IHdhcyBub3QgY3JlYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgSVByb2plY3QgY3JlYXRlTmV3UHJvamVjdCgpIHsKLSAgICAgICAgaWYgKG5ld1Byb2plY3QgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuZXdQcm9qZWN0OwotCi0gICAgICAgIC8vIGdldCBhIHByb2plY3QgaGFuZGxlCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IG5ld1Byb2plY3RIYW5kbGUgPSBtYWluUGFnZS5nZXRQcm9qZWN0SGFuZGxlKCk7Ci0KLSAgICAgICAgLy8gZ2V0IGEgcHJvamVjdCBkZXNjcmlwdG9yCi0gICAgICAgIElQYXRoIG5ld1BhdGggPSBudWxsOwotICAgICAgICBpZiAoIW1haW5QYWdlLnVzZURlZmF1bHRzKCkpCi0gICAgICAgICAgICBuZXdQYXRoID0gbWFpblBhZ2UuZ2V0TG9jYXRpb25QYXRoKCk7Ci0KLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB3b3Jrc3BhY2UKLSAgICAgICAgICAgICAgICAubmV3UHJvamVjdERlc2NyaXB0aW9uKG5ld1Byb2plY3RIYW5kbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgZGVzY3JpcHRpb24uc2V0TG9jYXRpb24obmV3UGF0aCk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSByZWZlcmVuY2VkIHByb2plY3QgaWYgcHJvdmlkZWQKLSAgICAgICAgaWYgKHJlZmVyZW5jZVBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgSVByb2plY3RbXSByZWZQcm9qZWN0cyA9IHJlZmVyZW5jZVBhZ2UuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0gICAgICAgICAgICBpZiAocmVmUHJvamVjdHMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVmUHJvamVjdHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBuZXcgcHJvamVjdCBvcGVyYXRpb24KLSAgICAgICAgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgY3JlYXRlUHJvamVjdChkZXNjcmlwdGlvbiwgbmV3UHJvamVjdEhhbmRsZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gcnVuIHRoZSBuZXcgcHJvamVjdCBjcmVhdGlvbiBvcGVyYXRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBvcCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGllLi0gb25lIG9mIHRoZSBzdGVwcyByZXN1bHRlZCBpbiBhIGNvcmUgZXhjZXB0aW9uCi0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoKChDb3JlRXhjZXB0aW9uKSB0KS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLkNBU0VfVkFSSUFOVF9FWElTVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNZXNzYWdlcy5OZXdQcm9qZWN0X2Vycm9yTWVzc2FnZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZChSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfY2FzZVZhcmlhbnRFeGlzdHNFcnJvciwgbmV3UHJvamVjdEhhbmRsZS5nZXROYW1lKCkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIFJlc291cmNlTWVzc2FnZXMuTmV3UHJvamVjdF9lcnJvck1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gbm8gc3BlY2lhbCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDb3JlRXhjZXB0aW9uKSB0KS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBDb3JlRXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBhYm92ZSwgYnV0IHVuZXhwZWN0ZWQgcnVudGltZQotICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbnMgYW5kIGVycm9ycyBtYXkgc3RpbGwgb2NjdXIuCi0gICAgICAgICAgICAgICAgSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERVdvcmtiZW5jaFBsdWdpbi5JREVfV09SS0JFTkNILCAwLCB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCksIHQpKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgICAgICAgICAgICAub3BlbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfZXJyb3JNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZChSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfaW50ZXJuYWxFcnJvciwgdC5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV3UHJvamVjdCA9IG5ld1Byb2plY3RIYW5kbGU7Ci0KLSAgICAgICAgcmV0dXJuIG5ld1Byb2plY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHByb2plY3QgcmVzb3VyY2UgZ2l2ZW4gdGhlIHByb2plY3QgaGFuZGxlIGFuZCBkZXNjcmlwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IGRlc2NyaXB0aW9uIHRvIGNyZWF0ZSBhIHByb2plY3QgcmVzb3VyY2UgZm9yCi0gICAgICogQHBhcmFtIHByb2plY3RIYW5kbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IGhhbmRsZSB0byBjcmVhdGUgYSBwcm9qZWN0IHJlc291cmNlIGZvcgotICAgICAqIEBwYXJhbSBtb25pdG9yCi0gICAgICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byBzaG93IHZpc3VhbCBwcm9ncmVzcyB3aXRoCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIG9wZXJhdGlvbiBmYWlscwotICAgICAqIEBleGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgb3BlcmF0aW9uIGlzIGNhbmNlbGVkCi0gICAgICovCi0gICAgdm9pZCBjcmVhdGVQcm9qZWN0KElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElQcm9qZWN0IHByb2plY3RIYW5kbGUsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLAotICAgICAgICAgICAgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIiIsIDIwMDApOy8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgcHJvamVjdEhhbmRsZS5jcmVhdGUoZGVzY3JpcHRpb24sIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgMTAwMCkpOwotCi0gICAgICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIHByb2plY3RIYW5kbGUub3BlbihJUmVzb3VyY2UuQkFDS0dST1VORF9SRUZSRVNILCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApKTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXdseSBjcmVhdGVkIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBwcm9qZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9qZWN0IG5vdAotICAgICAqICAgICAgICAgY3JlYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJUHJvamVjdCBnZXROZXdQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gbmV3UHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbikgewotICAgICAgICBzdXBlci5pbml0KHdvcmtiZW5jaCwgY3VycmVudFNlbGVjdGlvbik7Ci0gICAgICAgIHNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICAgICAgICBzZXRXaW5kb3dUaXRsZShSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3Rfd2luZG93VGl0bGUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gQmFzaWNOZXdSZXNvdXJjZVdpemFyZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gSURFV29ya2JlbmNoUGx1Z2luLmdldElERUltYWdlRGVzY3JpcHRvcigid2l6YmFuL25ld3Byal93aXouZ2lmIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgT3BlbnMgYSBuZXcgd2luZG93IHdpdGggYSBwYXJ0aWN1bGFyIHBlcnNwZWN0aXZlIGFuZCBpbnB1dC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG9wZW5Jbk5ld1dpbmRvdyhJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MpIHsKLQotICAgICAgICAvLyBPcGVuIHRoZSBwYWdlLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5vcGVuV29ya2JlbmNoV2luZG93KGRlc2MuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICAgICAgaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKHdpbmRvdy5nZXRTaGVsbCgpLCBXSU5ET1dfUFJPQkxFTVNfVElUTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSwgZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgY3JlYXRlTmV3UHJvamVjdCgpOwotCi0gICAgICAgIGlmIChuZXdQcm9qZWN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgdXBkYXRlUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgc2VsZWN0QW5kUmV2ZWFsKG5ld1Byb2plY3QpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBSZXBsYWNlcyB0aGUgY3VycmVudCBwZXJzcGVjdGl2ZSB3aXRoIHRoZSBuZXcgb25lLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVwbGFjZUN1cnJlbnRQZXJzcGVjdGl2ZShJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnNwKSB7Ci0KLSAgICAgICAgLy9HZXQgdGhlIGFjdGl2ZSBwYWdlLgotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBwZXJzcGVjdGl2ZS4KLSAgICAgICAgcGFnZS5zZXRQZXJzcGVjdGl2ZShwZXJzcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmVzIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgZm9yIHRoZSB3aXphcmQuIFRoZSBjb25maWcgZWxlbWVudCB3aWxsCi0gICAgICogYmUgdXNlZCBpbiA8Y29kZT5wZXJmb3JtRmluaXNoPC9jb2RlPiB0byBzZXQgdGhlIHJlc3VsdCBwZXJzcGVjdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNmaWcsCi0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgewotICAgICAgICBjb25maWdFbGVtZW50ID0gY2ZpZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBwZXJzcGVjdGl2ZSBmb3IgdGhlIGFjdGl2ZSBwYWdlIHdpdGhpbiB0aGUgd2luZG93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVBlcnNwZWN0aXZlKCkgewotICAgICAgICB1cGRhdGVQZXJzcGVjdGl2ZShjb25maWdFbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBwZXJzcGVjdGl2ZSBiYXNlZCBvbiB0aGUgY3VycmVudCBzZXR0aW5ncyBpbiB0aGUKLSAgICAgKiBXb3JrYmVuY2gvUGVyc3BlY3RpdmVzIHByZWZlcmVuY2UgcGFnZS4KLSAgICAgKiAKLSAgICAgKiBVc2UgdGhlIHNldHRpbmcgZm9yIHRoZSBuZXcgcGVyc3BlY3RpdmUgb3BlbmluZyBpZiB3ZQotICAgICAqIGFyZSBzZXQgdG8gb3BlbiBpbiBhIG5ldyBwZXJzcGVjdGl2ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIG5ldyBwcm9qZWN0IHdpemFyZCBjbGFzcyB3aWxsIG5lZWQgdG8gaW1wbGVtZW50IHRoZQotICAgICAqIDxjb2RlPklFeGVjdXRhYmxlRXh0ZW5zaW9uPC9jb2RlPiBpbnRlcmZhY2Ugc28gYXMgdG8gZ2FpbiBhY2Nlc3MgdG8gdGhlCi0gICAgICogd2l6YXJkJ3MgPGNvZGU+SUNvbmZpZ3VyYXRpb25FbGVtZW50PC9jb2RlPi4gVGhhdCBpcyB0aGUgY29uZmlndXJhdGlvbgotICAgICAqIGVsZW1lbnQgdG8gcGFzcyBpbnRvIHRoaXMgbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gY29uZmlnRWxlbWVudCAtIHRoZSBlbGVtZW50IHdlIGFyZSB1cGRhdGluZyB3aXRoCi0gICAgICogCi0gICAgICogQHNlZSBJUHJlZmVyZW5jZUNvbnN0YW50cyNPUE1fTkVXX1dJTkRPVwotICAgICAqIEBzZWUgSVByZWZlcmVuY2VDb25zdGFudHMjT1BNX0FDVElWRV9QQUdFCi0gICAgICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cyNOT19ORVdfUEVSU1BFQ1RJVkUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlUGVyc3BlY3RpdmUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLSAgICAgICAgLy8gRG8gbm90IGNoYW5nZSBwZXJzcGVjdGl2ZSBpZiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGlzCi0gICAgICAgIC8vIG5vdCBzcGVjaWZpZWQuCi0gICAgICAgIGlmIChjb25maWdFbGVtZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gUmV0cmlldmUgdGhlIG5ldyBwcm9qZWN0IG9wZW4gcGVyc3BlY3RpdmUgcHJlZmVyZW5jZSBzZXR0aW5nCi0gICAgICAgIFN0cmluZyBwZXJzcFNldHRpbmcgPSBQcmVmVXRpbC5nZXRBUElQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgSURFLlByZWZlcmVuY2VzLlBST0pFQ1RfT1BFTl9ORVdfUEVSU1BFQ1RJVkUpOwotCi0gICAgICAgIFN0cmluZyBwcm9tcHRTZXR0aW5nID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBJREVJbnRlcm5hbFByZWZlcmVuY2VzLlBST0pFQ1RfU1dJVENIX1BFUlNQX01PREUpOwotCi0gICAgICAgIC8vIFJldHVybiBpZiBkbyBub3Qgc3dpdGNoIHBlcnNwZWN0aXZlIHNldHRpbmcgYW5kIGFyZSBub3QgcHJvbXB0aW5nCi0gICAgICAgIGlmICghKHByb21wdFNldHRpbmcuZXF1YWxzKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVCkpCi0gICAgICAgICAgICAgICAgJiYgcGVyc3BTZXR0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLk5PX05FV19QRVJTUEVDVElWRSkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gUmVhZCB0aGUgcmVxdWVzdGVkIHBlcnNwZWN0aXZlIGlkIHRvIGJlIG9wZW5lZC4KLSAgICAgICAgU3RyaW5nIGZpbmFsUGVyc3BJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEZJTkFMX1BFUlNQRUNUSVZFKTsKLSAgICAgICAgaWYgKGZpbmFsUGVyc3BJZCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIE1hcCBwZXJzcGVjdGl2ZSBpZCB0byBkZXNjcmlwdG9yLgotICAgICAgICBJUGVyc3BlY3RpdmVSZWdpc3RyeSByZWcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLQotICAgICAgICAvLyBsZWF2ZSB0aGlzIGNvZGUgaW4gLSB0aGUgcGVyc3BlY3RpdmUgb2YgYSBnaXZlbiBwcm9qZWN0IG1heSBtYXAgdG8KLSAgICAgICAgLy8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHRob3NlIHRoYXQgdGhlIHdpemFyZCBpdHNlbGYgbWFwcyB0by4KLSAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBmaW5hbFBlcnNwID0gcmVnCi0gICAgICAgICAgICAgICAgLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChmaW5hbFBlcnNwSWQpOwotICAgICAgICBpZiAoZmluYWxQZXJzcCAhPSBudWxsICYmIGZpbmFsUGVyc3AgaW5zdGFuY2VvZiBJUGx1Z2luQ29udHJpYnV0aW9uKSB7Ci0gICAgICAgICAgICBJUGx1Z2luQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbiA9IChJUGx1Z2luQ29udHJpYnV0aW9uKSBmaW5hbFBlcnNwOwotICAgICAgICAgICAgaWYgKGNvbnRyaWJ1dGlvbi5nZXRQbHVnaW5JZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0IHdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCA9IFBsYXRmb3JtVUkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKTsKLSAgICAgICAgICAgICAgICBJQWN0aXZpdHlNYW5hZ2VyIGFjdGl2aXR5TWFuYWdlciA9IHdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFjdGl2aXR5TWFuYWdlcigpOwotICAgICAgICAgICAgICAgIElJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBhY3Rpdml0eU1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJZGVudGlmaWVyKFdvcmtiZW5jaEFjdGl2aXR5SGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVVbmlmaWVkSWQoY29udHJpYnV0aW9uKSk7Ci0gICAgICAgICAgICAgICAgU2V0IGlkQWN0aXZpdGllcyA9IGlkZW50aWZpZXIuZ2V0QWN0aXZpdHlJZHMoKTsKLQotICAgICAgICAgICAgICAgIGlmICghaWRBY3Rpdml0aWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBTZXQgZW5hYmxlZElkcyA9IG5ldyBIYXNoU2V0KGFjdGl2aXR5TWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmFibGVkQWN0aXZpdHlJZHMoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWRJZHMuYWRkQWxsKGlkQWN0aXZpdGllcykpCi0gICAgICAgICAgICAgICAgICAgICAgICB3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEVuYWJsZWRBY3Rpdml0eUlkcyhlbmFibGVkSWRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJREVXb3JrYmVuY2hQbHVnaW4ubG9nKCJVbmFibGUgdG8gZmluZCBwZXJzZWN0aXZlICIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICArIGZpbmFsUGVyc3BJZAotICAgICAgICAgICAgICAgICAgICArICIgaW4gQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQudXBkYXRlUGVyc3BlY3RpdmUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2F0aGVyIHRoZSBwcmVmZXJyZWQgcGVyc3BlY3RpdmVzCi0gICAgICAgIC8vIGFsd2F5cyBjb25zaWRlciB0aGUgZmluYWwgcGVyc3BlY3RpdmUgKGFuZCB0aG9zZSBkZXJpdmVkIGZyb20gaXQpCi0gICAgICAgIC8vIHRvIGJlIHByZWZlcnJlZAotICAgICAgICBBcnJheUxpc3QgcHJlZmVycmVkUGVyc3BJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFkZFBlcnNwZWN0aXZlQW5kRGVzY2VuZGFudHMocHJlZmVycmVkUGVyc3BJZHMsIGZpbmFsUGVyc3BJZCk7Ci0gICAgICAgIFN0cmluZyBwcmVmZXJyZWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShQUkVGRVJSRURfUEVSU1BFQ1RJVkVTKTsKLSAgICAgICAgaWYgKHByZWZlcnJlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcmVmZXJyZWQsICIgXHRcblxyXGYsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgYWRkUGVyc3BlY3RpdmVBbmREZXNjZW5kYW50cyhwcmVmZXJyZWRQZXJzcElkcywgdG9rLm5leHRUb2tlbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgIC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgIGlmIChwYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGN1cnJlbnRQZXJzcCA9IHBhZ2UuZ2V0UGVyc3BlY3RpdmUoKTsKLQotICAgICAgICAgICAgICAgIC8vIGRvbid0IHN3aXRjaCBpZiB0aGUgY3VycmVudCBwZXJzcGVjdGl2ZSBpcyBhIHByZWZlcnJlZAotICAgICAgICAgICAgICAgIC8vIHBlcnNwZWN0aXZlCi0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQZXJzcCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwcmVmZXJyZWRQZXJzcElkcy5jb250YWlucyhjdXJyZW50UGVyc3AuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcHJvbXB0IHRoZSB1c2VyIHRvIHN3aXRjaAotICAgICAgICAgICAgaWYgKCFjb25maXJtUGVyc3BlY3RpdmVTd2l0Y2god2luZG93LCBmaW5hbFBlcnNwKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCB3b3JrYmVuY2hQZXJzcGVjdGl2ZVNldHRpbmcgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgIElQcmVmZXJlbmNlQ29uc3RhbnRzLk9QRU5fUEVSU1BfTU9ERSk7Ci0KLSAgICAgICAgLy8gb3BlbiBwZXJzcGVjdGl2ZSBpbiBuZXcgd2luZG93IHNldHRpbmcKLSAgICAgICAgaWYgKHdvcmtiZW5jaFBlcnNwZWN0aXZlU2V0dGluZyA9PSBJUHJlZmVyZW5jZUNvbnN0YW50cy5PUE1fTkVXX1dJTkRPVykgewotICAgICAgICAgICAgb3BlbkluTmV3V2luZG93KGZpbmFsUGVyc3ApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVwbGFjZSBhY3RpdmUgcGVyc3BlY3RpdmUgc2V0dGluZyBvdGhlcndpc2UKLSAgICAgICAgcmVwbGFjZUN1cnJlbnRQZXJzcGVjdGl2ZShmaW5hbFBlcnNwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRvIHRoZSBsaXN0IGFsbCBwZXJzcGVjdGl2ZSBJRHMgaW4gdGhlIFdvcmtiZW5jaCB3aG8ncyBvcmlnaW5hbCBJRAotICAgICAqIG1hdGNoZXMgdGhlIGdpdmVuIElELgotICAgICAqIAotICAgICAqIEBwYXJhbSBwZXJzcGVjdGl2ZUlkcwotICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgcGVyc3BlY3RpdmUgSURzIHRvIHN1cHBsZW1lbnQuCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICB0aGUgaWQgdG8gcXVlcnkuCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUGVyc3BlY3RpdmVBbmREZXNjZW5kYW50cyhMaXN0IHBlcnNwZWN0aXZlSWRzLAotICAgICAgICAgICAgU3RyaW5nIGlkKSB7Ci0gICAgICAgIElQZXJzcGVjdGl2ZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgIC5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCk7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3JbXSBwZXJzcGVjdGl2ZXMgPSByZWdpc3RyeS5nZXRQZXJzcGVjdGl2ZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJzcGVjdGl2ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIC8vIEBpc3N1ZSBpbGxlZ2FsIHJlZiB0byB3b3JrYmVuY2ggaW50ZXJuYWwgY2xhc3M7Ci0gICAgICAgICAgICAvLyBjb25zaWRlciBhZGRpbmcgZ2V0T3JpZ2luYWxJZCgpIGFzIEFQSSBvbiBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yCi0gICAgICAgICAgICBQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9ICgoUGVyc3BlY3RpdmVEZXNjcmlwdG9yKSBwZXJzcGVjdGl2ZXNbaV0pOwotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0T3JpZ2luYWxJZCgpLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICBwZXJzcGVjdGl2ZUlkcy5hZGQoZGVzY3JpcHRvci5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb21wdHMgdGhlIHVzZXIgZm9yIHdoZXRoZXIgdG8gc3dpdGNoIHBlcnNwZWN0aXZlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2luZG93Ci0gICAgICogICAgICAgICAgICBUaGUgd29ya2JlbmNoIHdpbmRvdyBpbiB3aGljaCB0byBzd2l0Y2ggcGVyc3BlY3RpdmVzOyBtdXN0IG5vdAotICAgICAqICAgICAgICAgICAgYmUgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAcGFyYW0gZmluYWxQZXJzcAotICAgICAqICAgICAgICAgICAgVGhlIHBlcnNwZWN0aXZlIHRvIHN3aXRjaCB0bzsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCdzIE9LIHRvIHN3aXRjaCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbmZpcm1QZXJzcGVjdGl2ZVN3aXRjaChJV29ya2JlbmNoV2luZG93IHdpbmRvdywKLSAgICAgICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZmluYWxQZXJzcCkgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgU3RyaW5nIHBzcG0gPSBzdG9yZQotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5QUk9KRUNUX1NXSVRDSF9QRVJTUF9NT0RFKTsKLSAgICAgICAgaWYgKCFJREVJbnRlcm5hbFByZWZlcmVuY2VzLlBTUE1fUFJPTVBULmVxdWFscyhwc3BtKSkgewotICAgICAgICAgICAgLy8gUmV0dXJuIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBhbHdheXMgc3dpdGNoCi0gICAgICAgICAgICByZXR1cm4gSURFSW50ZXJuYWxQcmVmZXJlbmNlcy5QU1BNX0FMV0FZUy5lcXVhbHMocHNwbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBkaWFsb2cgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZQotICAgICAgICAgICAgICAgIC5vcGVuWWVzTm9RdWVzdGlvbih3aW5kb3cuZ2V0U2hlbGwoKSwgUmVzb3VyY2VNZXNzYWdlcy5OZXdQcm9qZWN0X3BlcnNwU3dpdGNoVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZChSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfcGVyc3BTd2l0Y2hNZXNzYWdlLCBmaW5hbFBlcnNwLmdldExhYmVsKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiB1c2UgdGhlIGRlZmF1bHQgbWVzc2FnZSBmb3IgdGhlIHRvZ2dsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHRvZ2dsZSBpcyBpbml0aWFsbHkgdW5jaGVja2VkICovLCBzdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElERUludGVybmFsUHJlZmVyZW5jZXMuUFJPSkVDVF9TV0lUQ0hfUEVSU1BfTU9ERSk7Ci0gICAgICAgIGludCByZXN1bHQgPSBkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpOwotCi0gICAgICAgIC8vSWYgd2UgYXJlIG5vdCBnb2luZyB0byBwcm9tcHQgYW55bW9yZSBwcm9wb2dhdGUgdGhlIGNob2ljZS4KLSAgICAgICAgaWYgKGRpYWxvZy5nZXRUb2dnbGVTdGF0ZSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZmVyZW5jZVZhbHVlOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCkKLSAgICAgICAgICAgICAgICAvL0RvZXNuJ3QgbWF0dGVyIGlmIGl0IGlzIHJlcGxhY2Ugb3IgbmV3IHdpbmRvdwotICAgICAgICAgICAgICAgIC8vYXMgd2UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgb3BlbiBwZXJzcGVjdGl2ZSBzZXR0aW5nCi0gICAgICAgICAgICAgICAgcHJlZmVyZW5jZVZhbHVlID0gSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuT1BFTl9QRVJTUEVDVElWRV9SRVBMQUNFOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByZWZlcmVuY2VWYWx1ZSA9IElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLk5PX05FV19QRVJTUEVDVElWRTsKLQotICAgICAgICAgICAgLy8gdXBkYXRlIFBST0pFQ1RfT1BFTl9ORVdfUEVSU1BFQ1RJVkUgdG8gY29ycmVzcG9uZAotICAgICAgICAgICAgUHJlZlV0aWwuZ2V0QVBJUHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0gICAgICAgICAgICAgICAgICAgIElERS5QcmVmZXJlbmNlcy5QUk9KRUNUX09QRU5fTkVXX1BFUlNQRUNUSVZFLAotICAgICAgICAgICAgICAgICAgICBwcmVmZXJlbmNlVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvbmV3cmVzb3VyY2UvQmFzaWNOZXdSZXNvdXJjZVdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvbmV3cmVzb3VyY2UvQmFzaWNOZXdSZXNvdXJjZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzhlMWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL25ld3Jlc291cmNlL0Jhc2ljTmV3UmVzb3VyY2VXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdGFuZGFyZCB3b3JrYmVuY2ggd2l6YXJkcwotICogdGhhdCBjcmVhdGUgbmV3IHJlc291cmNlcyBpbiB0aGUgd29ya3NwYWNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG91dHNpZGUgdGhpcyBwYWNrYWdlLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzaWNOZXdSZXNvdXJjZVdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzCi0gICAgICAgIElOZXdXaXphcmQgewotCi0gICAgLyoqCi0gICAgICogVGhlIHdvcmtiZW5jaC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IHdpemFyZCBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgaW4gdGhlIHdvcmtzcGFjZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmFzaWNOZXdSZXNvdXJjZVdpemFyZCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gd2hpY2ggd2FzIHBhc3NlZCB0byA8Y29kZT5pbml0PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd29ya2JlbmNoIHdoaWNoIHdhcyBwYXNzZWQgdG8gPGNvZGU+aW5pdDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB3b3JrYmVuY2gKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0gICAgICAgIHJldHVybiB3b3JrYmVuY2g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkJhc2ljTmV3UmVzb3VyY2VXaXphcmQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+SVdvcmtiZW5jaFdpemFyZDwvY29kZT4gbWV0aG9kIHJlY29yZHMgdGhlIGdpdmVuIHdvcmtiZW5jaCBhbmQKLSAgICAgKiBzZWxlY3Rpb24sIGFuZCBpbml0aWFsaXplcyB0aGUgZGVmYXVsdCBiYW5uZXIgaW1hZ2UgZm9yIHRoZSBwYWdlcwotICAgICAqIGJ5IGNhbGxpbmcgPGNvZGU+aW5pdGlhbGl6ZURlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yPC9jb2RlPi4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbikgewotICAgICAgICB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uOwotCi0gICAgICAgIGluaXRpYWxpemVEZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBkZWZhdWx0IHBhZ2UgaW1hZ2UgZGVzY3JpcHRvciB0byBhbiBhcHByb3ByaWF0ZSBiYW5uZXIuCi0gICAgICogQnkgY2FsbGluZyA8Y29kZT5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcjwvY29kZT4uCi0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdXNlcyBhIGdlbmVyaWMgbmV3IHdpemFyZCBpbWFnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXRJREVJbWFnZURlc2NyaXB0b3IoIndpemJhbi9uZXdfd2l6LmdpZiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzYyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyBhbmQgcmV2ZWFscyB0aGUgbmV3bHkgYWRkZWQgcmVzb3VyY2UgaW4gYWxsIHBhcnRzCi0gICAgICogb2YgdGhlIGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93J3MgYWN0aXZlIHBhZ2UuCi0gICAgICoKLSAgICAgKiBAc2VlIElTZXRTZWxlY3Rpb25UYXJnZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RBbmRSZXZlYWwoSVJlc291cmNlIG5ld1Jlc291cmNlKSB7Ci0gICAgICAgIHNlbGVjdEFuZFJldmVhbChuZXdSZXNvdXJjZSwgZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIHNlbGVjdCBhbmQgcmV2ZWFsIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgaW4gYWxsCi0gICAgICogcGFydHMgd2l0aGluIHRoZSBzdXBwbGllZCB3b3JrYmVuY2ggd2luZG93J3MgYWN0aXZlIHBhZ2UuCi0gICAgICogPHA+Ci0gICAgICogQ2hlY2tzIGFsbCBwYXJ0cyBpbiB0aGUgYWN0aXZlIHBhZ2UgdG8gc2VlIGlmIHRoZXkgaW1wbGVtZW50IDxjb2RlPklTZXRTZWxlY3Rpb25UYXJnZXQ8L2NvZGU+LAotICAgICAqIGVpdGhlciBkaXJlY3RseSBvciBhcyBhbiBhZGFwdGVyLiBJZiBzbywgdGVsbHMgdGhlIHBhcnQgdG8gc2VsZWN0IGFuZCByZXZlYWwgdGhlCi0gICAgICogc3BlY2lmaWVkIHJlc291cmNlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gYmUgc2VsZWN0ZWQgYW5kIHJldmVhbGVkCi0gICAgICogQHBhcmFtIHdpbmRvdyB0aGUgd29ya2JlbmNoIHdpbmRvdyB0byBzZWxlY3QgYW5kIHJldmVhbCB0aGUgcmVzb3VyY2UKLSAgICAgKiAKLSAgICAgKiBAc2VlIElTZXRTZWxlY3Rpb25UYXJnZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0QW5kUmV2ZWFsKElSZXNvdXJjZSByZXNvdXJjZSwKLSAgICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgIC8vIHZhbGlkYXRlIHRoZSBpbnB1dAotICAgICAgICBpZiAod2luZG93ID09IG51bGwgfHwgcmVzb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gZ2V0IGFsbCB0aGUgdmlldyBhbmQgZWRpdG9yIHBhcnRzCi0gICAgICAgIExpc3QgcGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZnNbXSA9IHBhZ2UuZ2V0Vmlld1JlZmVyZW5jZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gcmVmc1tpXS5nZXRQYXJ0KGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcGFydHMuYWRkKHBhcnQpOwotICAgICAgICB9Ci0gICAgICAgIHJlZnMgPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocmVmc1tpXS5nZXRQYXJ0KGZhbHNlKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHBhcnRzLmFkZChyZWZzW2ldLmdldFBhcnQoZmFsc2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVzb3VyY2UpOwotICAgICAgICBJdGVyYXRvciBpdHIgPSBwYXJ0cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IChJV29ya2JlbmNoUGFydCkgaXRyLm5leHQoKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwYXJ0J3MgSVNldFNlbGVjdGlvblRhcmdldCBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgSVNldFNlbGVjdGlvblRhcmdldCB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KQotICAgICAgICAgICAgICAgIHRhcmdldCA9IChJU2V0U2VsZWN0aW9uVGFyZ2V0KSBwYXJ0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRhcmdldCA9IChJU2V0U2VsZWN0aW9uVGFyZ2V0KSBwYXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJU2V0U2VsZWN0aW9uVGFyZ2V0LmNsYXNzKTsKLQotICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0IGFuZCByZXZlYWwgcmVzb3VyY2UKLSAgICAgICAgICAgICAgICBmaW5hbCBJU2V0U2VsZWN0aW9uVGFyZ2V0IGZpbmFsVGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICAgICAgICAgIHdpbmRvdy5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFRhcmdldC5zZWxlY3RSZXZlYWwoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvbmV3cmVzb3VyY2UvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5pZGUvc3JjL29yZy9lY2xpcHNlL3VpL3dpemFyZHMvbmV3cmVzb3VyY2UvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2JjYjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkuaWRlL3NyYy9vcmcvZWNsaXBzZS91aS93aXphcmRzL25ld3Jlc291cmNlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgc3RhbmRhcmQgd2l6YXJkcyBmb3IgY3JlYXRpbmcgZmlsZXMsCi1mb2xkZXJzLCBhbmQgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYWUzNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjUxNGU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi13Ym5hdmlnYXRvci5qYXIKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJiNDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4gCi0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4gCi0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE4OTVmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IE9jdCAyNyAxMjowNzowOSBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLy9wcm9wZXJ0eV9maWxlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzPTg4NTlfMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNWQ4ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNUaHUgT2N0IDIwIDE0OjM3OjI5IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVjOGJlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI1RodSBPY3QgMjAgMTQ6Mzc6MjkgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9dXNlcgotb3JnLmVjbGlwc2UuamR0LnVpLmphdmFkb2M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGdldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyY29tbWVudCIgbmFtZVw9ImdldHRlcmNvbW1lbnQiPi8qKlxuICogQHJldHVybiBSZXR1cm5zIHRoZSAke2JhcmVfZmllbGRfbmFtZX0uXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyY29tbWVudCIgbmFtZVw9InNldHRlcmNvbW1lbnQiPi8qKlxuICogQHBhcmFtICR7cGFyYW19IFRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yY29tbWVudCIgbmFtZVw9ImNvbnN0cnVjdG9yY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpbGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCI+LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIENvcHlyaWdodCAoYykgJHt5ZWFyfSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcbiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHBcOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuICpcbiAqIENvbnRyaWJ1dG9yc1w6XG4gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9ImZhbHNlIiBjb250ZXh0XD0idHlwZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgdHlwZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMudHlwZWNvbW1lbnQiIG5hbWVcPSJ0eXBlY29tbWVudCI+LyoqXG4gKiBAc2luY2UgMy4yXG4gKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWVsZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGZpZWxkcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWVsZGNvbW1lbnQiIG5hbWVcPSJmaWVsZGNvbW1lbnQiPi8qKlxuICogXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG5vbi1vdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJvdmVycmlkZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5vdmVycmlkZWNvbW1lbnQiIG5hbWVcPSJvdmVycmlkZWNvbW1lbnQiPi8qIChub24tSmF2YWRvYylcbiAqICR7c2VlX3RvX292ZXJyaWRkZW59XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im5ld3R5cGVfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubmV3dHlwZSIgbmFtZVw9Im5ld3R5cGUiPiR7ZmlsZWNvbW1lbnR9XG4ke3BhY2thZ2VfZGVjbGFyYXRpb259XG5cbiR7dHlwZWNvbW1lbnR9XG4ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgbWV0aG9kIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5Ij4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2MzNjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1RodSBPY3QgMjAgMTQ6Mzc6MjkgRURUIDIwMDUKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MAotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTEKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGYzOGM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQbHVnaW4ubmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlczsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLnBsdWdpbi5Xb3JrYmVuY2hOYXZpZ2F0b3JQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQbHVnaW4ucHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiAuLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuZXhwcmVzc2lvbnMsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5pbnRlcm5hbC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwucGx1Z2luLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwud29ya2JlbmNoCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucwotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMTQ4MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLW91dHB1dC4uID0gYmluLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2ljb25zL2Z1bGwvY2xjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9pY29ucy9mdWxsL2NsY2wxNi9jb2xsYXBzZWFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYWU1NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2ljb25zL2Z1bGwvY2xjbDE2L2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9pY29ucy9mdWxsL2NsY2wxNi9zeW5jZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2ljb25zL2Z1bGwvY2xjbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjVmM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2ljb25zL2Z1bGwvY2xjbDE2L3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvaWNvbnMvZnVsbC9jdmlldzE2L2ZpbGVuYXZfbmF2LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9pY29ucy9mdWxsL2N2aWV3MTYvZmlsZW5hdl9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWI5ZDVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9pY29ucy9mdWxsL2N2aWV3MTYvZmlsZW5hdl9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9pY29ucy9mdWxsL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDgwYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2ljb25zL2Z1bGwvZWxjbDE2L2ZpbHRlcl9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzllNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2ljb25zL2Z1bGwvZWxjbDE2L2ZpbHRlcl9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9pY29ucy9mdWxsL2VsY2wxNi9zeW5jZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzA5MzRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9pY29ucy9mdWxsL2VsY2wxNi9zeW5jZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL2ljb25zL2Z1bGwvZXZpZXcxNi9yZXNvdXJjZV9wZXJzcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvaWNvbnMvZnVsbC9ldmlldzE2L3Jlc291cmNlX3BlcnNwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4ZmUwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvaWNvbnMvZnVsbC9ldmlldzE2L3Jlc291cmNlX3BlcnNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9pY29ucy9mdWxsL292cjE2L2Vycm9yX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9pY29ucy9mdWxsL292cjE2L2Vycm9yX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxMmVhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvaWNvbnMvZnVsbC9vdnIxNi93YXJuaW5nX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9pY29ucy9mdWxsL292cjE2L3dhcm5pbmdfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWYyMjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9pY29ucy9mdWxsL292cjE2L3dhcm5pbmdfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2UxNzU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUGx1Z2luLm5hbWUgPSBOYXZpZ2F0b3IgV29ya2JlbmNoIENvbXBvbmVudHMKLVBsdWdpbi5wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotUGx1Z2luLmRlc2NyaXB0aW9uID0gQ29udGFpbnMgcmVzb3VyY2UgYW5kIHdvcmtiZW5jaCBpbnRlZ3JhdGlvbiBvbiB0b3Agb2YgTmF2aWdhdG9yIFZpZXdzIAotRXh0UG9pbnQubmF2aWdhdG9yQ29udGVudCA9IE5hdmlnYXRvciBDb250ZW50Ci1FeHRQb2ludC5uYXZpZ2F0b3JBY3Rpb25zID0gTmF2aWdhdG9yIEFjdGlvbnMKLUV4dFBvaW50Lm5hdmlnYXRvclZpZXdlciA9IE5hdmlnYXRvciBWaWV3ZXIKLVZpZXdzLk5hdmlnYXRvciA9IENvbW1vbiBOYXZpZ2F0b3IKLU1vdmU9TW92ZQotUmVuYW1lPVJlbmFtZQotUmVmYWN0b3I9UmVmYWN0b3IKLQotbW92ZUNvcHkubmFtZT1SZXNvdXJjZSBNb3ZlIG9yIENvcHkKLW1vdmVDb3B5LmRlc2M9TW92ZXMgYSByZXNvdXJjZSBieSBkZWZhdWx0LiAgSG9sZCB0aGUgY29udHJvbCBrZXkgd2hlbiBkcm9wcGluZyB0byBDb3B5LgotCi1qMmVlPUoyRUUKLWoyZWUudmlld191aV89UHJvamVjdCBFeHBsb3JlciAKLWoyZWUuY2F0ZWdvcnlfdWlfPUoyRUUKLQotY2F0ZWdvcnkubmFtZT1XZWIgVG9vbHMgUGxhdGZvcm0KLWNvbW1vbi5uYXZpZ2F0b3IubmFtZT1Qcm9qZWN0IEV4cGxvcmVyIChvbGQpCi0KLXJlc291cmNlLmV4dGVuc2lvbi5uYW1lPVJlc291cmNlcwotQ29tbW9uX1Jlc291cmNlX05hdmlnYXRvcj1FeHBlcmltZW50YWwgUmVzb3VyY2UgTmF2aWdhdG9yCi0KLUNvbW1vbl9SZXNvdXJjZV9OYXZpZ2F0b3I9RXhwZXJpbWVudGFsIFJlc291cmNlIE5hdmlnYXRvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1NzUwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VDb250ZW50IgotICAgICAgICAgICAgbmFtZT0iJUNvbW1vbl9SZXNvdXJjZV9OYXZpZ2F0b3IiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdlciI+Ci0gICAgICAgPHZpZXdlcgotICAgICAgICAgICAgIHZpZXdlcklkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VDb250ZW50Ij4KLSAgICAgICAgICA8cG9wdXBNZW51Ci0gICAgICAgICAgICAgICAgYWxsb3dzUGxhdGZvcm1Db250cmlidXRpb25zPSJ0cnVlIgotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VDb250ZW50I1BvcHVwTWVudSI+ICAKLSAgICAgICAgICAgICA8aW5zZXJ0aW9uUG9pbnQgbmFtZT0iZ3JvdXAubmV3Ii8+Ci0gICAgICAgICAgICAgPGluc2VydGlvblBvaW50Ci0gICAgICAgICAgICAgICAgICAgbmFtZT0iZ3JvdXAub3BlbiIKLSAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3I9InRydWUiLz4KLSAgICAgICAgICAgICA8aW5zZXJ0aW9uUG9pbnQgbmFtZT0iZ3JvdXAub3BlbldpdGgiLz4gICAgICAgICAgICAgCi0gICAgICAgICAgICAgPGluc2VydGlvblBvaW50Ci0gICAgICAgICAgICAgICAgICAgbmFtZT0iZ3JvdXAucG9ydCIKLSAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3I9InRydWUiLz4gCi0gICAgICAgICAgICAgPGluc2VydGlvblBvaW50Ci0gICAgICAgICAgICAgICAgICAgbmFtZT0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvcj0idHJ1ZSIvPiAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgPGluc2VydGlvblBvaW50Ci0gICAgICAgICAgICAgICAgICAgbmFtZT0iZ3JvdXAucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3I9InRydWUiLz4KLSAgICAgICAgICA8L3BvcHVwTWVudT4KLSAgICAgICA8L3ZpZXdlcj4KLSAgICAgICA8dmlld2VyQ29udGVudEJpbmRpbmcgCi0gICAgICAgICAgICAgdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZUNvbnRlbnQiPgotCQkgICAgICAgICAgPGluY2x1ZGVzPgotCQkgICAgICAgCSAgICAgIDxjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZUNvbnRlbnQiIC8+Ci0JCSAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgIDwvdmlld2VyQ29udGVudEJpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPCEtLSBSZXNvdXJjZSBDb250ZW50ICAtLT4KLSAgIDxleHRlbnNpb24gIAotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLSAgICAgIDxuYXZpZ2F0b3JDb250ZW50Ci0gICAgICAgICAgICBuYW1lPSIlcmVzb3VyY2UuZXh0ZW5zaW9uLm5hbWUiCi0gICAgICAgICAgICBwcmlvcml0eT0ibG93IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldmlldzE2L3Jlc291cmNlX3BlcnNwLmdpZiIKLSAgICAgICAgICAgIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLQkJCSAgICAgICAgICAgIGNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5pbnRlcm5hbC53b3JrYmVuY2guUmVzb3VyY2VFeHRlbnNpb25Db250ZW50UHJvdmlkZXIiCi0gICAgICAgICAgICAJCQlsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLndvcmtiZW5jaC5SZXNvdXJjZUV4dGVuc2lvbkxhYmVsUHJvdmlkZXIiCQkJCi0gICAgICAgICAgICAJCQlzb3J0ZXI9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwud29ya2JlbmNoLlJlc291cmNlU29ydGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZUNvbnRlbnQiPiAgICAgICAgIAotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0JCSAgICAgICAgIDxvcj4gICAgICAgICAKLQkJICAgICAgICAgICAgPGluc3RhbmNlb2YgCi0JCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4gCi0JCSAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0JCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIgLz4gCi0JCSAgICAgICAgICAgIDxpbnN0YW5jZW9mIAotCQkgICAgICAgICAgICAgICAgICAJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4gCi0JCSAgICAgICAgICAgIDxpbnN0YW5jZW9mICAKLQkJICAgICAgICAgICAgICAgICAgCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyIiAvPgotCQkgICAgICAgICAgICA8aW5zdGFuY2VvZiAKLQkJICAgICAgICAgICAgICAgICAgCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIgLz4gCi0JCSAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L25hdmlnYXRvckNvbnRlbnQ+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS0gSGFuZGxlIFJlc291cmNlIGRyYWcgYW5kIGRyb3AgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0icmVzb3VyY2VEcm9wSGFuZGxlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuZHJvcEhhbmRsZXIiPgotICAgICAgPGRyb3BIYW5kbGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5pbnRlcm5hbC53b3JrYmVuY2guUmVzb3VyY2VEcm9wQWN0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm5hdmlnYXRvci5yZXNvdXJjZXMuZHJvcEhhbmRsZXIiCi0gICAgICAgICAgICBuYW1lPSIlbW92ZUNvcHkubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbW92ZUNvcHkuZGVzYyI+Ci0gICAgICAgICA8ZHJhZ0VuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiIC8+IAotICAgICAgICAgICAgICAgPC9ub3Q+Ci0gICAgICAgICAgICAgICA8YWRhcHQgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4gCi0gICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgIDwvZHJhZ0VuYWJsZW1lbnQ+Ci0gICAgICAgICA8ZHJvcEVuYWJsZW1lbnQ+IAotICAgICAgICAgICAgICAgPGFkYXB0IAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPiAgCi0gICAgICAgICA8L2Ryb3BFbmFibGVtZW50PgotICAgICAgPC9kcm9wSGFuZGxlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIAotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgotICAgICAgPHZpZXdlckFjdGlvbkJpbmRpbmcKLSAgICAgICAgICAgIHZpZXdlcklkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VDb250ZW50Ij4KLSAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICA8YWN0aW9uRXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuKiIgLz4KLSAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3ZpZXdlckFjdGlvbkJpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLSAgICAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0JCTxhY3Rpb25Qcm92aWRlciAKLSAgICAgIAkJCWlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLk9wZW5BY3Rpb25zIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLmFjdGlvbnMuT3BlbkFjdGlvblByb3ZpZGVyIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIiAvPiAJCi0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9hY3Rpb25Qcm92aWRlcj4gCi0JCTxhY3Rpb25Qcm92aWRlciAKLSAgICAgICAgCQlpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5Qb3J0aW5nQWN0aW9ucyIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5pbnRlcm5hbC5hY3Rpb25zLlBvcnRpbmdBY3Rpb25Qcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+IAkKLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXIiIC8+Ci0gICAgICAgICAJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiIC8+IAotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+CQotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvYWN0aW9uUHJvdmlkZXI+Ci0gICAgICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLmFjdGlvbnMuTmV3QWN0aW9uUHJvdmlkZXIiCi0gICAgICAgICAgICAJaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuTmV3QWN0aW9ucyI+IAotICAgICAgICAJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiIC8+CQotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlciIgLz4KLSAgICAgICAgIAkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIgLz4gCi0gICAgICAgICAgICAgICAJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4JCi0JCQkJPC9vcj4KLQkgICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0JCTwvYWN0aW9uUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICAgCi0JPGV4dGVuc2lvbgotICAgIAkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4gCi0JCTxjb21tb25XaXphcmQKLSAgICAgICAgCQl0eXBlPSJuZXciCi0JCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZvbGRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIgLz4JCi0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyIiAvPgotICAgICAgICAgCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IiAvPiAKLSAgICAgICAgICAgICAgIAkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgkKLQkJCQk8L29yPgotCSAgICAgICAgIDwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+ICAgCi0gICAgICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5maWxlIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIiAvPgkKLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXIiIC8+Ci0gICAgICAgICAJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiIC8+IAotICAgICAgICAgICAgICAgCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+CQotCQkJCTwvb3I+Ci0JICAgICAgICAgPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQk8L2V4dGVuc2lvbj4gCi0gICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5leHByZXNzaW9ucy5SZXNvdXJjZVByb3BlcnR5VGVzdGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMiCi0gICAgICAgICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMiCi0gICAgICAgICAgICBwcm9wZXJ0aWVzPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPiAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9wcmVwYXJlZm9ycGlpLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjYzM2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gubmF2aWdhdG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vcHJvcGVydHlfZmlsZXMiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9wcm9wZXJ0eV9maWxlcyI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLSAgCQkKLQkJPGNvcHkgZmlsZT0iJHtwbHVnaW5kaXJ9L3BsdWdpbi5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0gIAkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvcHJvcGVydHlfZmlsZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9wcm9wZXJ0eV9maWxlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2EzODkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9wcm9wZXJ0eV9maWxlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUmVzb3VyY2VFeHRlbnNpb25GaWx0ZXJQcm92aWRlcl9IaWRlcz1IaWRlcyAKLQotSW1wb3J0UmVzb3VyY2VzTWVudV90ZXh0ID0gJkltcG9ydAotCi1FeHBvcnRSZXNvdXJjZXNNZW51X3RleHQgPSBFJnhwb3J0Ci0KLQotV29ya2JlbmNoX25ldyA9ICZOZXcKLU9wZW5XaXRoTWVudV9sYWJlbD1PcGVuIFdpdGgKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zY3JpcHRzL3NyYy5qYXJkZXNjIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NjcmlwdHMvc3JjLmphcmRlc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMmI3N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NjcmlwdHMvc3JjLmphcmRlc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGphcmRlc2M+Ci0JPGphciBwYXRoPSJDOi9kZXYvd29ya3NwYWNlcy9nZW5lcmFsLXB1cnBvc2UtbmF2aWdhdG9yL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5uYXZpZ2F0b3Ivd2JuYXZpZ2F0b3IuamFyIi8+Ci0JPG9wdGlvbnMgY29tcHJlc3M9InRydWUiCi0JCWRlc2NyaXB0aW9uTG9jYXRpb249Ii9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gubmF2aWdhdG9yL3NjcmlwdHMvc3JjLmphcmRlc2MiCi0JCWV4cG9ydEVycm9ycz0idHJ1ZSIgZXhwb3J0V2FybmluZ3M9InRydWUiIGxvZ0Vycm9ycz0idHJ1ZSIKLQkJbG9nV2FybmluZ3M9InRydWUiIG92ZXJ3cml0ZT0iZmFsc2UiIHNhdmVEZXNjcmlwdGlvbj0idHJ1ZSIgdXNlU291cmNlRm9sZGVycz0iZmFsc2UiLz4KLQk8bWFuaWZlc3QgZ2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiCi0JCW1hbmlmZXN0TG9jYXRpb249Ii9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gubmF2aWdhdG9yL3NyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIKLQkJbWFuaWZlc3RWZXJzaW9uPSIxLjAiIHJldXNlTWFuaWZlc3Q9ImZhbHNlIiBzYXZlTWFuaWZlc3Q9ImZhbHNlIiB1c2VzTWFuaWZlc3Q9ImZhbHNlIj4KLQkJPHNlYWxpbmcgc2VhbEphcj0iZmFsc2UiPjxwYWNrYWdlc1RvU2VhbC8+PHBhY2thZ2VzVG9VblNlYWwvPjwvc2VhbGluZz4KLQk8L21hbmlmZXN0PgotCTxzZWxlY3RlZEVsZW1lbnRzIGV4cG9ydENsYXNzRmlsZXM9InRydWUiIGV4cG9ydEphdmFGaWxlcz0iZmFsc2UiPgotCQk8amF2YUVsZW1lbnQgaGFuZGxlSWRlbnRpZmllcj0iPW9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5uYXZpZ2F0b3Ivc3JjIi8+Ci0JPC9zZWxlY3RlZEVsZW1lbnRzPgotPC9qYXJkZXNjPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2V4cHJlc3Npb25zL1Jlc291cmNlUHJvcGVydHlUZXN0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9leHByZXNzaW9ucy9SZXNvdXJjZVByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZjUwNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2V4cHJlc3Npb25zL1Jlc291cmNlUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmV4cHJlc3Npb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5JUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLS8qKgotICogVGVzdHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGZvciBJUmVzb3VyY2VzOgotICogCi0gKiA8cD4KLSAqIDx1bD4KLSAqIDxsaT48aT5wcm9qZWN0TmF0dXJlPC9pPjogRGV0ZXJtaW5lcyBpZiB0aGUgcmVjZWl2ZXIgaXMgYW4gYWNjZXNzaWJsZSBJUHJvamVjdCB3aGljaAotICogaGFzIGFzIHRoZSBnaXZlbiB2YWx1ZSBhcyBvbmUgb2YgaXRzIG5hdHVyZXMuPC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIGltcGxlbWVudHMKLQkJSVByb3BlcnR5VGVzdGVyIHsKLQotCXN0YXRpYyBjbGFzcyBQcm9wZXJ0aWVzIHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1BST1BFUlRZID0gLTE7Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQVRVUkVfTElURVJBTCA9ICJwcm9qZWN0TmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0pFQ1RfTkFUVVJFID0gMDsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXRWYWx1ZShTdHJpbmcgYVByb3BlcnR5TGl0ZXJhbCkgewotCQkJaWYgKFBST0pFQ1RfTkFUVVJFX0xJVEVSQUwuZXF1YWxzKGFQcm9wZXJ0eUxpdGVyYWwpKQotCQkJCXJldHVybiBQUk9KRUNUX05BVFVSRTsKLQkJCXJldHVybiBJTlZBTElEX1BST1BFUlRZOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywKLQkJCU9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0JCWlmIChyZWNlaXZlciBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpICgoSUFkYXB0YWJsZSkgcmVjZWl2ZXIpCi0JCQkJCS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQlzd2l0Y2ggKFByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydHkpKSB7Ci0JCQljYXNlIFByb3BlcnRpZXMuUFJPSkVDVF9OQVRVUkU6Ci0KLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVByb2plY3QpIHJlc291cmNlKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpCi0JCQkJCQkJCSYmIHByb2plY3QuaGFzTmF0dXJlKChTdHJpbmcpIGV4cGVjdGVkVmFsdWUpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9hY3Rpb25zL01vdmVSZXNvdXJjZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL2FjdGlvbnMvTW92ZVJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZDNjZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL2FjdGlvbnMvTW92ZVJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjIgCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTW92ZVJlc291cmNlQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Nb3ZlUmVzb3VyY2VBY3Rpb24gbW92ZUFjdGlvbiA9IG51bGw7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmICh0aGlzLm1vdmVBY3Rpb24gPT0gbnVsbCkKLQkJCXRoaXMubW92ZUFjdGlvbiA9IG5ldyBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLk1vdmVSZXNvdXJjZUFjdGlvbihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotCi0JCXRoaXMubW92ZUFjdGlvbi5ydW4oKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHRoaXMubW92ZUFjdGlvbiA9PSBudWxsKQotCQkJdGhpcy5tb3ZlQWN0aW9uID0gbmV3IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuTW92ZVJlc291cmNlQWN0aW9uKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0KLQkJdGhpcy5tb3ZlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9yZXNvdXJjZXMvaW50ZXJuYWwvYWN0aW9ucy9OZXdBY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL2FjdGlvbnMvTmV3QWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhMjNiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9yZXNvdXJjZXMvaW50ZXJuYWwvYWN0aW9ucy9OZXdBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuTmV3RXhhbXBsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLk5ld1Byb2plY3RBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25BY3Rpb25Qcm92aWRlckNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbk1lbnVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLldpemFyZEFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwucGx1Z2luLldvcmtiZW5jaE5hdmlnYXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZFJlZ2lzdHJ5OwotCi0vKioKLSAqIFByb3ZpZGVzIHRoZSBuZXcgKGFydGlmYWN0IGNyZWF0aW9uKSBtZW51IG9wdGlvbnMgZm9yIGEgY29udGV4dCBtZW51LgotICogCi0gKiA8cD4KLSAqIFRoZSBhZGRlZCBzdWJtZW51IGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZQotICogPC9wPgotICogCi0gKiA8dWw+Ci0gKiA8bGk+YSBuZXcgZ2VuZXJpYyBwcm9qZWN0IHdpemFyZCBzaG9ydGN1dCBhY3Rpb24sIDwvbGk+Ci0gKiA8bGk+YSBzZXBhcmF0b3IsIDwvbGk+Ci0gKiA8bGk+YSBzZXQgb2YgY29udGV4dCBzZW5zdGl2ZSB3aXphcmQgc2hvcnRjdXRzIChhcyBkZWZpbmVkIGJ5Ci0gKiA8Yj5vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuY29tbW9uV2l6YXJkPC9iPiksIDwvbGk+Ci0gKiA8bGk+YW5vdGhlciBzZXBhcmF0b3IsIDwvbGk+Ci0gKiA8bGk+YSBnZW5lcmljIGV4YW1wbGVzIHdpemFyZCBzaG9ydGN1dCBhY3Rpb24sIGFuZCBmaW5hbGx5IDwvbGk+Ci0gKiA8bGk+YSBnZW5lcmljICJPdGhlciIgbmV3IHdpemFyZCBzaG9ydGN1dCBhY3Rpb248L2xpPgotICogPC91bD4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdBY3Rpb25Qcm92aWRlciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMX0VYQU1QTEVTX1dJWkFSRF9DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS51aS5FeGFtcGxlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSUFjdGlvbiBzaG93RGxnQWN0aW9uOwotCi0JcHJpdmF0ZSBJQWN0aW9uIG5ld1Byb2plY3RBY3Rpb247Ci0KLQlwcml2YXRlIElBY3Rpb24gbmV3RXhhbXBsZUFjdGlvbjsKLQotCXByaXZhdGUgV2l6YXJkQWN0aW9uR3JvdXAgbmV3V2l6YXJkQWN0aW9uR3JvdXA7Ci0KLQlwdWJsaWMgdm9pZCBpbml0KENvbW1vbkFjdGlvblByb3ZpZGVyQ29uZmlnIGFDb25maWcpIHsKLQotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGFDb25maWcuZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKTsKLQkJc2hvd0RsZ0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVXLmNyZWF0ZSh3aW5kb3cpOwotCQluZXdQcm9qZWN0QWN0aW9uID0gbmV3IE5ld1Byb2plY3RBY3Rpb24od2luZG93KTsKLQkJbmV3RXhhbXBsZUFjdGlvbiA9IG5ldyBOZXdFeGFtcGxlQWN0aW9uKHdpbmRvdyk7Ci0KLQkJbmV3V2l6YXJkQWN0aW9uR3JvdXAgPSBuZXcgV2l6YXJkQWN0aW9uR3JvdXAod2luZG93LCBQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldE5ld1dpemFyZFJlZ2lzdHJ5KCksIFdpemFyZEFjdGlvbkdyb3VwLlRZUEVfTkVXKTsKLQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBzdWJtZW51IHRvIHRoZSBnaXZlbiBtZW51IHdpdGggdGhlIG5hbWUKLQkgKiB7QHZhbHVlIElDb21tb25NZW51Q29uc3RhbnRzI0dST1VQX05FVyB9IChzZWUKLQkgKiB7QGxpbmsgSUNvbW1vbk1lbnVDb25zdGFudHMjR1JPVVBfTkVXfSkuIFRoZSBzdWJtZW51IGNvbnRhaW5zIHRoZQotCSAqIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0JICogCi0JICogPHVsPgotCSAqIDxsaT5hIG5ldyBnZW5lcmljIHByb2plY3Qgd2l6YXJkIHNob3J0Y3V0IGFjdGlvbiwgPC9saT4KLQkgKiA8bGk+YSBzZXBhcmF0b3IsIDwvbGk+Ci0JICogPGxpPmEgc2V0IG9mIGNvbnRleHQgc2Vuc3RpdmUgd2l6YXJkIHNob3J0Y3V0cyAoYXMgZGVmaW5lZCBieQotCSAqIDxiPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5jb21tb25XaXphcmQ8L2I+KSwgPC9saT4KLQkgKiA8bGk+YW5vdGhlciBzZXBhcmF0b3IsIDwvbGk+Ci0JICogPGxpPmEgZ2VuZXJpYyBleGFtcGxlcyB3aXphcmQgc2hvcnRjdXQgYWN0aW9uLCBhbmQgZmluYWxseSA8L2xpPgotCSAqIDxsaT5hIGdlbmVyaWMgIk90aGVyIiBuZXcgd2l6YXJkIHNob3J0Y3V0IGFjdGlvbjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJV29ya2JlbmNoTmF2aWdhdG9yTWVzc2FnZXMuV29ya2JlbmNoX25ldywKLQkJCQlJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9ORVcpOwotCi0JCS8vIEFkZCBuZXcgcHJvamVjdCB3aXphcmQgc2hvcnRjdXQKLQkJc3VibWVudS5hZGQobmV3UHJvamVjdEFjdGlvbik7Ci0JCXN1Ym1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJLy8gZmlsbCB0aGUgbWVudSBmcm9tIHRoZSBjb21tb25XaXphcmQgY29udHJpYnV0aW9ucwotCQluZXdXaXphcmRBY3Rpb25Hcm91cC5zZXRDb250ZXh0KGdldENvbnRleHQoKSk7Ci0JCW5ld1dpemFyZEFjdGlvbkdyb3VwLmZpbGxDb250ZXh0TWVudShzdWJtZW51KTsKLQotCQlzdWJtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX0FERElUSU9OUykpOwotCi0JCS8vIGlmIHRoZXJlIGFyZSBleGFtcGxlcywgdGhlbiBhZGQgdGhlbSB0byB0aGUgZW5kIG9mIHRoZSBtZW51Ci0JCWlmIChoYXNFeGFtcGxlcygpKSB7Ci0JCQlzdWJtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJc3VibWVudS5hZGQobmV3RXhhbXBsZUFjdGlvbik7Ci0JCX0KLQotCQkvLyBBZGQgb3RoZXIgLi4KLQkJc3VibWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJc3VibWVudS5hZGQoc2hvd0RsZ0FjdGlvbik7Ci0KLQkJLy8gYXBwZW5kIHRoZSBzdWJtZW51IGFmdGVyIHRoZSBHUk9VUF9ORVcgZ3JvdXAuCi0JCW1lbnUuaW5zZXJ0QWZ0ZXIoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfTkVXLCBzdWJtZW51KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgYW55IGV4YW1wbGVzIGFyZSBpbiB0aGUgY3VycmVudCBpbnN0YWxsLgotCSAqIAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBleGlzdHMgYSBmdWxsIGV4YW1wbGVzIHdpemFyZCBjYXRlZ29yeS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzRXhhbXBsZXMoKSB7Ci0JCUlXaXphcmRSZWdpc3RyeSBuZXdSZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0TmV3V2l6YXJkUmVnaXN0cnkoKTsKLQkJSVdpemFyZENhdGVnb3J5IGNhdGVnb3J5ID0gbmV3UmVnaXN0cnkKLQkJCQkuZmluZENhdGVnb3J5KEZVTExfRVhBTVBMRVNfV0laQVJEX0NBVEVHT1JZKTsKLQkJcmV0dXJuIGNhdGVnb3J5ICE9IG51bGw7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9hY3Rpb25zL09wZW5BY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL2FjdGlvbnMvT3BlbkFjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwN2MzZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL2FjdGlvbnMvT3BlbkFjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLk9wZW5GaWxlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuT3BlbldpdGhNZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25BY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXJDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25BY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25NZW51Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5BZGFwdGFiaWxpdHlVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwucGx1Z2luLldvcmtiZW5jaE5hdmlnYXRvck1lc3NhZ2VzOwotCi0vKioKLSAqIFByb3ZpZGVzIHRoZSBvcGVuIGFuZCBvcGVuIHdpdGggbWVudXMgZm9yIElSZXNvdXJjZXMuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkFjdGlvblByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uQWN0aW9uUHJvdmlkZXIgICB7Ci0KLQlwcml2YXRlIE9wZW5GaWxlQWN0aW9uIG9wZW5GaWxlQWN0aW9uOwotIAotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnRTaXRlIHZpZXdTaXRlID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIGluaXQoQ29tbW9uQWN0aW9uUHJvdmlkZXJDb25maWcgYUNvbmZpZykgewotCQl2aWV3U2l0ZSA9IGFDb25maWcuZ2V0Vmlld1NpdGUoKTsKLQkJb3BlbkZpbGVBY3Rpb24gPSBuZXcgT3BlbkZpbGVBY3Rpb24odmlld1NpdGUuZ2V0UGFnZSgpKTsKLQl9Ci0gCi0KLQlwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIGFNZW51KSB7Ci0JCW9wZW5GaWxlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkKLQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlpZiAob3BlbkZpbGVBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCWFNZW51Lmluc2VydEFmdGVyKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX09QRU4sIG9wZW5GaWxlQWN0aW9uKTsKLQkJCWFkZE9wZW5XaXRoTWVudShhTWVudSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyB0aGVBY3Rpb25CYXJzKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Q29udGV4dCgpCi0JCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYoc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElGaWxlKSB7IAotCQkJb3BlbkZpbGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJdGhlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTiwgb3BlbkZpbGVBY3Rpb24pOwotCQl9IAotCQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRPcGVuV2l0aE1lbnUoSU1lbnVNYW5hZ2VyIGFNZW51KSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKHNzID09IG51bGwgfHwgc3Muc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm47Ci0KLQkJT2JqZWN0IG8gPSBzcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIobywKLQkJCQlJUmVzb3VyY2UuY2xhc3MpOwotCi0JCS8vIENyZWF0ZSBhIG1lbnUgZmx5b3V0LgotCQlJTWVudU1hbmFnZXIgc3VibWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlXb3JrYmVuY2hOYXZpZ2F0b3JNZXNzYWdlcy5PcGVuV2l0aE1lbnVfbGFiZWwsCi0JCQkJSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfT1BFTl9XSVRIKTsKLQkJc3VibWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX1RPUCkpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiAhKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQkJJiYgIShyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpKQotCQkJc3VibWVudS5hZGQobmV3IE9wZW5XaXRoTWVudSh2aWV3U2l0ZS5nZXRQYWdlKCksIHJlc291cmNlKSk7Ci0KLQkJc3VibWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX0FERElUSU9OUykpOwotCi0JCS8vIEFkZCB0aGUgc3VibWVudS4KLQkJaWYgKHN1Ym1lbnUuZ2V0SXRlbXMoKS5sZW5ndGggPiAyICYmIHN1Ym1lbnUuaXNFbmFibGVkKCkpCi0JCQlhTWVudS5hcHBlbmRUb0dyb3VwKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX09QRU5fV0lUSCwgc3VibWVudSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9yZXNvdXJjZXMvaW50ZXJuYWwvYWN0aW9ucy9Qb3J0aW5nQWN0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9hY3Rpb25zL1BvcnRpbmdBY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTE5YzVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9hY3Rpb25zL1BvcnRpbmdBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotICogIAlTZWJhc3RpYW4gRGF2aWRzIDxzZGF2aWRzQGdteC5kZT4gLSBDb2xsYXBzZSBhbGwgYWN0aW9uCi0gKiAgICAgIFNlYmFzdGlhbiBEYXZpZHMgPHNkYXZpZHNAZ214LmRlPiAtIEltYWdlcyBmb3IgbWVudSBpdGVtcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5FeHBvcnRSZXNvdXJjZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5JbXBvcnRSZXNvdXJjZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25BY3Rpb25Qcm92aWRlckNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbk1lbnVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLldpemFyZEFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwucGx1Z2luLldvcmtiZW5jaE5hdmlnYXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwucGx1Z2luLldvcmtiZW5jaE5hdmlnYXRvclBsdWdpbjsKLQotLyoqCi0gKiBBZGRzIGFjdGlvbnMgZm9yIEltcG9ydC9FeHBvcnQgd2l6YXJkcy4gVGhlIGdyb3VwIGlzIHNtYXJ0LCBpbiB0aGF0IGl0IHdpbGwKLSAqIGVpdGhlciBhZGQgYWN0aW9ucyBmb3IgSW1wb3J0IGFuZCBFeHBvcnQsIG9yIGlmIHRoZXJlIGFyZSBjb250ZXh0IHNlbnNpdGl2ZQotICogb3B0aW9ucyBhdmFpbGFibGUgKGFzIGRlZmluZWQgYnkgPGI+b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmNvbW1vbldpemFyZDwvYj4pLAotICogdGhlbiBpdCB3aWxsIGNvbXBvdW5kIHRoZXNlIG9wdGlvbnMgaW50byBhIHN1Ym1lbnUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbGVhZAotICogdGV4dCAoIkltcG9ydCIgb3IgIkV4cG9ydCIpLgotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFBvcnRpbmdBY3Rpb25Qcm92aWRlciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NT05fTkFWSUdBVE9SX0lNUE9SVF9NRU5VID0gImNvbW1vbi5pbXBvcnQubWVudSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NT05fTkFWSUdBVE9SX0VYUE9SVF9NRU5VID0gImNvbW1vbi5leHBvcnQubWVudSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIEltcG9ydFJlc291cmNlc0FjdGlvbiBpbXBvcnRBY3Rpb247Ci0KLQlwcml2YXRlIEV4cG9ydFJlc291cmNlc0FjdGlvbiBleHBvcnRBY3Rpb247Ci0KLQlwcml2YXRlIFdpemFyZEFjdGlvbkdyb3VwIGltcG9ydFdpemFyZEFjdGlvbkdyb3VwOwotCi0JcHJpdmF0ZSBXaXphcmRBY3Rpb25Hcm91cCBleHBvcnRXaXphcmRBY3Rpb25Hcm91cDsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZCA9IGZhbHNlOwotCi0JcHVibGljIHZvaWQgaW5pdChDb21tb25BY3Rpb25Qcm92aWRlckNvbmZpZyBhQ29uZmlnKSB7Ci0KLQkJQXNzZXJ0LmlzVHJ1ZSghZGlzcG9zZWQpOwotCQkKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSAoYUNvbmZpZy5nZXRWaWV3U2l0ZSgpICE9IG51bGwpID8gYUNvbmZpZwotCQkJCS5nZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpIDogbnVsbDsKLQkJaW1wb3J0QWN0aW9uID0gbmV3IEltcG9ydFJlc291cmNlc0FjdGlvbih3aW5kb3cpOwotCQlleHBvcnRBY3Rpb24gPSBuZXcgRXhwb3J0UmVzb3VyY2VzQWN0aW9uKHdpbmRvdyk7Ci0JCWltcG9ydFdpemFyZEFjdGlvbkdyb3VwID0gbmV3IFdpemFyZEFjdGlvbkdyb3VwKHdpbmRvdywgUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRJbXBvcnRXaXphcmRSZWdpc3RyeSgpLCBXaXphcmRBY3Rpb25Hcm91cC5UWVBFX0lNUE9SVCk7Ci0JCWV4cG9ydFdpemFyZEFjdGlvbkdyb3VwID0gbmV3IFdpemFyZEFjdGlvbkdyb3VwKHdpbmRvdywgUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRFeHBvcnRXaXphcmRSZWdpc3RyeSgpLCBXaXphcmRBY3Rpb25Hcm91cC5UWVBFX0VYUE9SVCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmRzIHRoZSBzdXBlcmNsYXNzIGltcGxlbWVudGF0aW9uIHRvIGRpc3Bvc2UgdGhlIHN1Ymdyb3Vwcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbXBvcnRXaXphcmRBY3Rpb25Hcm91cC5kaXNwb3NlKCk7Ci0JCWV4cG9ydFdpemFyZEFjdGlvbkdyb3VwLmRpc3Bvc2UoKTsKLQkJaW1wb3J0QWN0aW9uID0gbnVsbDsKLQkJZXhwb3J0QWN0aW9uID0gbnVsbDsKLQkJZGlzcG9zZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIHRoZUFjdGlvbkJhcnMpIHsKLQkKLQkJQXNzZXJ0LmlzVHJ1ZSghZGlzcG9zZWQpOwotCQkKLQkJdGhlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuSU1QT1JULmdldElkKCksCi0JCQkJaW1wb3J0QWN0aW9uKTsKLQkJdGhlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuRVhQT1JULmdldElkKCksCi0JCQkJZXhwb3J0QWN0aW9uKTsKLQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIGFNZW51KSB7Ci0JCi0JCUFzc2VydC5pc1RydWUoIWRpc3Bvc2VkKTsKLQkJCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSB8fCAhKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCWFkZFNpbXBsZVBvcnRpbmdNZW51cyhhTWVudSk7Ci0JCWVsc2UgaWYgKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID4gMSkKLQkJCWFkZFNpbXBsZVBvcnRpbmdNZW51cyhhTWVudSk7Ci0JCWVsc2UgewotCQkJYWRkSW1wb3J0TWVudShhTWVudSk7Ci0JCQlhZGRFeHBvcnRNZW51KGFNZW51KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4gcmVsYXRpdmUgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCVN0cmluZyBpY29uUGF0aCA9ICJpY29ucy9mdWxsLyI7IC8vJE5PTi1OTFMtMSQgCi0JCVVSTCB1cmwgPSBXb3JrYmVuY2hOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpbmQoCi0JCQkJbmV3IFBhdGgoaWNvblBhdGggKyByZWxhdGl2ZVBhdGgpKTsKLQkJaWYgKHVybCA9PSBudWxsKQotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTaW1wbGVQb3J0aW5nTWVudXMoSU1lbnVNYW5hZ2VyIGFNZW51KSB7Ci0JCWFNZW51LmFwcGVuZFRvR3JvdXAoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfUE9SVCwgaW1wb3J0QWN0aW9uKTsKLQkJYU1lbnUuYXBwZW5kVG9Hcm91cChJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9QT1JULCBleHBvcnRBY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJbXBvcnRNZW51KElNZW51TWFuYWdlciBhTWVudSkgewotCi0JCWltcG9ydFdpemFyZEFjdGlvbkdyb3VwLnNldENvbnRleHQoZ2V0Q29udGV4dCgpKTsKLQkJaWYgKGltcG9ydFdpemFyZEFjdGlvbkdyb3VwLmdldFdpemFyZEFjdGlvbklkcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlhTWVudS5hcHBlbmRUb0dyb3VwKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX1BPUlQsIGltcG9ydEFjdGlvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJTWVudU1hbmFnZXIgc3VibWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlXb3JrYmVuY2hOYXZpZ2F0b3JNZXNzYWdlcy5JbXBvcnRSZXNvdXJjZXNNZW51X3RleHQsCi0JCQkJQ09NTU9OX05BVklHQVRPUl9JTVBPUlRfTUVOVSk7Ci0JCWltcG9ydFdpemFyZEFjdGlvbkdyb3VwLmZpbGxDb250ZXh0TWVudShzdWJtZW51KTsKLQotCQlzdWJtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX0FERElUSU9OUykpOwotCQlzdWJtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlzdWJtZW51LmFkZChpbXBvcnRBY3Rpb24pOwotCQlhTWVudS5hcHBlbmRUb0dyb3VwKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX1BPUlQsIHN1Ym1lbnUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFeHBvcnRNZW51KElNZW51TWFuYWdlciBhTWVudSkgewotCi0JCWV4cG9ydFdpemFyZEFjdGlvbkdyb3VwLnNldENvbnRleHQoZ2V0Q29udGV4dCgpKTsKLQkJaWYgKGltcG9ydFdpemFyZEFjdGlvbkdyb3VwLmdldFdpemFyZEFjdGlvbklkcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlhTWVudS5hcHBlbmRUb0dyb3VwKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX1BPUlQsIGV4cG9ydEFjdGlvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJV29ya2JlbmNoTmF2aWdhdG9yTWVzc2FnZXMuRXhwb3J0UmVzb3VyY2VzTWVudV90ZXh0LAotCQkJCUNPTU1PTl9OQVZJR0FUT1JfRVhQT1JUX01FTlUpOwotCQlleHBvcnRXaXphcmRBY3Rpb25Hcm91cC5maWxsQ29udGV4dE1lbnUoc3VibWVudSk7Ci0KLQkJc3VibWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9BRERJVElPTlMpKTsKLQkJc3VibWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJc3VibWVudS5hZGQoZXhwb3J0QWN0aW9uKTsKLQkJYU1lbnUuYXBwZW5kVG9Hcm91cChJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9QT1JULCBzdWJtZW51KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9hY3Rpb25zL1F1aWNrTWVudUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL2FjdGlvbnMvUXVpY2tNZW51QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDUzZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL2FjdGlvbnMvUXVpY2tNZW51QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSUNvbW1hbmRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklLZXlTZXF1ZW5jZUJpbmRpbmc7Ci0KLS8qKgotICogQSBxdWljayBtZW51IGFjdGlvbnMgcHJvdmlkZXMgc3VwcG9ydCB0byBhc3NpZ24gc2hvcnQgY3V0cyB0byBzdWIgbWVudXMuCi0gKiAKLSAqIERlcml2ZWQgZnJvbSB0aGUgY2xhc3Mgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgSkRUIGludGVybmFscy4KLSAqIAotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBRdWlja01lbnVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIQVJfSU5ERU5UID0gMzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcXVpY2sgbWVudSBhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZCBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZElkCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCBpZCBvZiB0aGUgc2hvcnQgY3V0IHVzZWQgdG8gb3BlbiB0aGUgc3ViIG1lbnUKLQkgKi8KLQlwdWJsaWMgUXVpY2tNZW51QWN0aW9uKFN0cmluZyBjb21tYW5kSWQpIHsKLQkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKGNvbW1hbmRJZCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNvbnRyb2wgZm9jdXMgPSBkaXNwbGF5LmdldEZvY3VzQ29udHJvbCgpOwotCQlpZiAoZm9jdXMgPT0gbnVsbCB8fCBmb2N1cy5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJTWVudU1hbmFnZXIgbWVudSA9IG5ldyBNZW51TWFuYWdlcigpOwotCQlmaWxsTWVudShtZW51KTsKLQkJZmluYWwgTWVudSB3aWRnZXQgPSBtZW51LmNyZWF0ZUNvbnRleHRNZW51KGZvY3VzLmdldFNoZWxsKCkpOwotCQlQb2ludCBsb2NhdGlvbiA9IGNvbXB1dGVNZW51TG9jYXRpb24oZm9jdXMsIHdpZGdldCk7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl3aWRnZXQuc2V0TG9jYXRpb24obG9jYXRpb24pOwotCQl3aWRnZXQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJd2hpbGUgKCF3aWRnZXQuaXNEaXNwb3NlZCgpICYmIHdpZGdldC5pc1Zpc2libGUoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpZiAoIXdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXdpZGdldC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIb29rIHRvIGZpbGwgYSBtZW51IG1hbmFnZXIgd2l0aCB0aGUgaXRlbXMgb2YgdGhlIHN1YiBtZW51LgotCSAqIAotCSAqIEBwYXJhbSBtZW51Ci0JICogICAgICAgICAgICB0aGUgc3ViIG1lbnUgdG8gZmlsbAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpbGxNZW51KElNZW51TWFuYWdlciBtZW51KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNob3J0IGN1dCBhc3NpZ25lZCB0byB0aGUgc3ViIG1lbnUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc2hvcnQgY3V0IGlzCi0JICogYXNzaWduZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgc2hvcnQgY3V0IGFzIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydEN1dFN0cmluZygpIHsKLQkJZmluYWwgSUNvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRDb21tYW5kU3VwcG9ydCgpLmdldENvbW1hbmRNYW5hZ2VyKCk7Ci0JCWZpbmFsIElDb21tYW5kIGNvbW1hbmQgPSBjb21tYW5kTWFuYWdlci5nZXRDb21tYW5kKGdldEFjdGlvbkRlZmluaXRpb25JZCgpKTsKLQkJaWYgKGNvbW1hbmQuaXNEZWZpbmVkKCkpIHsKLQkJCUxpc3QgbCA9IGNvbW1hbmQuZ2V0S2V5U2VxdWVuY2VCaW5kaW5ncygpOwotCQkJaWYgKCFsLmlzRW1wdHkoKSkgewotCQkJCUlLZXlTZXF1ZW5jZUJpbmRpbmcgYmluZGluZyA9IChJS2V5U2VxdWVuY2VCaW5kaW5nKSBsLmdldCgwKTsKLQkJCQlyZXR1cm4gYmluZGluZy5nZXRLZXlTZXF1ZW5jZSgpLmZvcm1hdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOyAgCi0JfQotCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlTWVudUxvY2F0aW9uKENvbnRyb2wgZm9jdXMsIE1lbnUgbWVudSkgewotCQlQb2ludCBjdXJzb3JMb2NhdGlvbiA9IGZvY3VzLmdldERpc3BsYXkoKS5nZXRDdXJzb3JMb2NhdGlvbigpOwotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IG51bGw7Ci0JCVBvaW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChmb2N1cyBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IChTdHlsZWRUZXh0KSBmb2N1czsKLQkJCWNsaWVudEFyZWEgPSBzdHlsZWRUZXh0LmdldENsaWVudEFyZWEoKTsKLQkJCXJlc3VsdCA9IGNvbXB1dGVNZW51TG9jYXRpb24oc3R5bGVkVGV4dCk7Ci0JCX0gZWxzZSBpZiAoZm9jdXMgaW5zdGFuY2VvZiBUcmVlKSB7Ci0JCQlUcmVlIHRyZWUgPSAoVHJlZSkgZm9jdXM7Ci0JCQljbGllbnRBcmVhID0gdHJlZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQlyZXN1bHQgPSBjb21wdXRlTWVudUxvY2F0aW9uKHRyZWUpOwotCQl9IGVsc2UgaWYgKGZvY3VzIGluc3RhbmNlb2YgVGFibGUpIHsKLQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBmb2N1czsKLQkJCWNsaWVudEFyZWEgPSB0YWJsZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQlyZXN1bHQgPSBjb21wdXRlTWVudUxvY2F0aW9uKHRhYmxlKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGZvY3VzLnRvQ29udHJvbChjdXJzb3JMb2NhdGlvbik7Ci0JCX0KLQkJaWYgKGNsaWVudEFyZWEgIT0gbnVsbCAmJiAhY2xpZW50QXJlYS5jb250YWlucyhyZXN1bHQpKSB7Ci0JCQlyZXN1bHQgPSBuZXcgUG9pbnQoY2xpZW50QXJlYS54ICsgY2xpZW50QXJlYS53aWR0aCAvIDIsIGNsaWVudEFyZWEueSArIGNsaWVudEFyZWEuaGVpZ2h0IC8gMik7Ci0JCX0KLQkJUmVjdGFuZ2xlIHNoZWxsQXJlYSA9IGZvY3VzLmdldFNoZWxsKCkuZ2V0Q2xpZW50QXJlYSgpOwotCQlpZiAoIXNoZWxsQXJlYS5jb250YWlucyhmb2N1cy5nZXRTaGVsbCgpLnRvQ29udHJvbChmb2N1cy50b0Rpc3BsYXkocmVzdWx0KSkpKSB7Ci0JCQlyZXN1bHQgPSBuZXcgUG9pbnQoc2hlbGxBcmVhLnggKyBzaGVsbEFyZWEud2lkdGggLyAyLCBzaGVsbEFyZWEueSArIHNoZWxsQXJlYS5oZWlnaHQgLyAyKTsKLQkJfQotCQlyZXR1cm4gZm9jdXMudG9EaXNwbGF5KHJlc3VsdCk7Ci0JfQotCi0JLyoqCi0JICogSG9vayB0byBjb21wdXRlIHRoZSBtZW51IGxvY2F0aW9uIGlmIHRoZSBmb2N1cyB3aWRnZXQgaXMgYSBzdHlsZWQgdGV4dCB3aWRnZXQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZWQgdGV4dCB3aWRnZXQgdGhhdCBoYXMgdGhlIGZvY3VzCi0JICogCi0JICogQHJldHVybiBhIHdpZGdldCByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgbWVudSB0byBwb3AgdXAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm93Ci0JICogICAgICAgICBwb3NpdGlvbiBpbnNpZGUgdGhlIHdpZGdldCBjYW4gYmUgY29tcHV0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZU1lbnVMb2NhdGlvbihTdHlsZWRUZXh0IHRleHQpIHsKLQkJUG9pbnQgcmVzdWx0ID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCXJlc3VsdC55ICs9IHRleHQuZ2V0TGluZUhlaWdodCgpOwotCQlpZiAoIXRleHQuZ2V0Q2xpZW50QXJlYSgpLmNvbnRhaW5zKHJlc3VsdCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBIb29rIHRvIGNvbXB1dGUgdGhlIG1lbnUgbG9jYXRpb24gaWYgdGhlIGZvY3VzIHdpZGdldCBpcyBhIHRyZWUgd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSB0cmVlCi0JICogICAgICAgICAgICB0aGUgdHJlZSB3aWRnZXQgdGhhdCBoYXMgdGhlIGZvY3VzCi0JICogCi0JICogQHJldHVybiBhIHdpZGdldCByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgbWVudSB0byBwb3AgdXAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm93Ci0JICogICAgICAgICBwb3NpdGlvbiBpbnNpZGUgdGhlIHdpZGdldCBjYW4gYmUgY29tcHV0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZU1lbnVMb2NhdGlvbihUcmVlIHRyZWUpIHsKLQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gdHJlZS5nZXRDbGllbnRBcmVhKCk7Ci0JCXN3aXRjaCAoaXRlbXMubGVuZ3RoKSB7Ci0JCQljYXNlIDAgOgotCQkJCXJldHVybiBudWxsOwotCQkJY2FzZSAxIDoKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gaXRlbXNbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIGludGVyc2VjdCA9IGNsaWVudEFyZWEuaW50ZXJzZWN0aW9uKGJvdW5kcyk7Ci0JCQkJaWYgKGludGVyc2VjdCAhPSBudWxsICYmIGludGVyc2VjdC5oZWlnaHQgPT0gYm91bmRzLmhlaWdodCkgewotCQkJCQlyZXR1cm4gbmV3IFBvaW50KE1hdGgubWF4KDAsIGJvdW5kcy54ICsgZ2V0QXZhcmFnZUNoYXJXaXRoKHRyZWUpICogQ0hBUl9JTkRFTlQpLCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJUmVjdGFuZ2xlW10gcmVjdGFuZ2xlcyA9IG5ldyBSZWN0YW5nbGVbaXRlbXMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlY3RhbmdsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJcmVjdGFuZ2xlc1tpXSA9IGl0ZW1zW2ldLmdldEJvdW5kcygpOwotCQkJCX0KLQkJCQlQb2ludCBjdXJzb3JMb2NhdGlvbiA9IHRyZWUuZ2V0RGlzcGxheSgpLmdldEN1cnNvckxvY2F0aW9uKCk7Ci0JCQkJUG9pbnQgcmVzdWx0ID0gZmluZEJlc3RMb2NhdGlvbihnZXRJbmNsdWRlZFBvc2l0aW9ucyhyZWN0YW5nbGVzLCBjbGllbnRBcmVhKSwgdHJlZS50b0NvbnRyb2woY3Vyc29yTG9jYXRpb24pKTsKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCXJlc3VsdC54ID0gcmVzdWx0LnggKyBnZXRBdmFyYWdlQ2hhcldpdGgodHJlZSkgKiBDSEFSX0lOREVOVDsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogSG9vayB0byBjb21wdXRlIHRoZSBtZW51IGxvY2F0aW9uIGlmIHRoZSBmb2N1cyB3aWRnZXQgaXMgYSB0YWJsZSB3aWRnZXQuCi0JICogCi0JICogQHBhcmFtIHRhYmxlCi0JICogICAgICAgICAgICB0aGUgdGFibGUgd2lkZ2V0IHRoYXQgaGFzIHRoZSBmb2N1cwotCSAqIAotCSAqIEByZXR1cm4gYSB3aWRnZXQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIG1lbnUgdG8gcG9wIHVwIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdwotCSAqICAgICAgICAgcG9zaXRpb24gaW5zaWRlIHRoZSB3aWRnZXQgY2FuIGJlIGNvbXB1dGVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVNZW51TG9jYXRpb24oVGFibGUgdGFibGUpIHsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSB0YWJsZS5nZXRDbGllbnRBcmVhKCk7Ci0JCXN3aXRjaCAoaXRlbXMubGVuZ3RoKSB7Ci0JCQljYXNlIDAgOiB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQljYXNlIDEgOiB7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW1zWzBdLmdldEJvdW5kcygwKTsKLQkJCQlSZWN0YW5nbGUgaUJvdW5kcyA9IGl0ZW1zWzBdLmdldEltYWdlQm91bmRzKDApOwotCQkJCVJlY3RhbmdsZSBpbnRlcnNlY3QgPSBjbGllbnRBcmVhLmludGVyc2VjdGlvbihib3VuZHMpOwotCQkJCWlmIChpbnRlcnNlY3QgIT0gbnVsbCAmJiBpbnRlcnNlY3QuaGVpZ2h0ID09IGJvdW5kcy5oZWlnaHQpIHsKLQkJCQkJcmV0dXJuIG5ldyBQb2ludChNYXRoLm1heCgwLCBib3VuZHMueCArIGlCb3VuZHMud2lkdGggKyBnZXRBdmFyYWdlQ2hhcldpdGgodGFibGUpICogQ0hBUl9JTkRFTlQpLCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQlSZWN0YW5nbGVbXSByZWN0YW5nbGVzID0gbmV3IFJlY3RhbmdsZVtpdGVtcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjdGFuZ2xlcy5sZW5ndGg7IGkrKykgewotCQkJCQlyZWN0YW5nbGVzW2ldID0gaXRlbXNbaV0uZ2V0Qm91bmRzKDApOwotCQkJCX0KLQkJCQlSZWN0YW5nbGUgaUJvdW5kcyA9IGl0ZW1zWzBdLmdldEltYWdlQm91bmRzKDApOwotCQkJCVBvaW50IGN1cnNvckxvY2F0aW9uID0gdGFibGUuZ2V0RGlzcGxheSgpLmdldEN1cnNvckxvY2F0aW9uKCk7Ci0JCQkJUG9pbnQgcmVzdWx0ID0gZmluZEJlc3RMb2NhdGlvbihnZXRJbmNsdWRlZFBvc2l0aW9ucyhyZWN0YW5nbGVzLCBjbGllbnRBcmVhKSwgdGFibGUudG9Db250cm9sKGN1cnNvckxvY2F0aW9uKSk7Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQlyZXN1bHQueCA9IHJlc3VsdC54ICsgaUJvdW5kcy53aWR0aCArIGdldEF2YXJhZ2VDaGFyV2l0aCh0YWJsZSkgKiBDSEFSX0lOREVOVDsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQb2ludFtdIGdldEluY2x1ZGVkUG9zaXRpb25zKFJlY3RhbmdsZVtdIHJlY3RhbmdsZXMsIFJlY3RhbmdsZSB3aWRnZXRCb3VuZHMpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjdGFuZ2xlcy5sZW5ndGg7IGkrKykgewotCQkJUmVjdGFuZ2xlIHJlY3RhbmdsZSA9IHJlY3RhbmdsZXNbaV07Ci0JCQlSZWN0YW5nbGUgaW50ZXJzZWN0ID0gd2lkZ2V0Qm91bmRzLmludGVyc2VjdGlvbihyZWN0YW5nbGUpOwotCQkJaWYgKGludGVyc2VjdCAhPSBudWxsICYmIGludGVyc2VjdC5oZWlnaHQgPT0gcmVjdGFuZ2xlLmhlaWdodCkgewotCQkJCXJlc3VsdC5hZGQobmV3IFBvaW50KGludGVyc2VjdC54LCBpbnRlcnNlY3QueSArIGludGVyc2VjdC5oZWlnaHQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFBvaW50W10pIHJlc3VsdC50b0FycmF5KG5ldyBQb2ludFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBQb2ludCBmaW5kQmVzdExvY2F0aW9uKFBvaW50W10gcG9pbnRzLCBQb2ludCByZWxhdGl2ZUN1cnNvcikgewotCQlQb2ludCByZXN1bHQgPSBudWxsOwotCQlkb3VibGUgYmVzdERpc3QgPSBEb3VibGUuTUFYX1ZBTFVFOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykgewotCQkJUG9pbnQgcG9pbnQgPSBwb2ludHNbaV07Ci0JCQlpbnQgYSA9IDA7Ci0JCQlpbnQgYiA9IDA7Ci0JCQlpZiAocG9pbnQueCA+IHJlbGF0aXZlQ3Vyc29yLngpIHsKLQkJCQlhID0gcG9pbnQueCAtIHJlbGF0aXZlQ3Vyc29yLng7Ci0JCQl9IGVsc2UgewotCQkJCWEgPSByZWxhdGl2ZUN1cnNvci54IC0gcG9pbnQueDsKLQkJCX0KLQkJCWlmIChwb2ludC55ID4gcmVsYXRpdmVDdXJzb3IueSkgewotCQkJCWIgPSBwb2ludC55IC0gcmVsYXRpdmVDdXJzb3IueTsKLQkJCX0gZWxzZSB7Ci0JCQkJYiA9IHJlbGF0aXZlQ3Vyc29yLnkgLSBwb2ludC55OwotCQkJfQotCQkJZG91YmxlIGRpc3QgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7Ci0JCQlpZiAoZGlzdCA8IGJlc3REaXN0KSB7Ci0JCQkJcmVzdWx0ID0gcG9pbnQ7Ci0JCQkJYmVzdERpc3QgPSBkaXN0OwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0QXZhcmFnZUNoYXJXaXRoKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkJCXJldHVybiBnYy5nZXRGb250TWV0cmljcygpLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChnYyAhPSBudWxsKQotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9yZXNvdXJjZXMvaW50ZXJuYWwvYWN0aW9ucy9SZW5hbWVSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE1Mzk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFN0YW5kYXJkIGFjdGlvbiBmb3IgcmVuYW1pbmcgdGhlIHNlbGVjdGVkIHJlc291cmNlLiBUaGUgcmVzb3VyY2UgbWF5IGJlIGEgZmlsZSwgZm9sZGVyIG9yCi0gKiBwcm9qZWN0LiBBbiBJTmF2aWdhdG9yU2l0ZUVkaXRvciB3aWxsIGJlIHVzZWQgdG8gbGV0IHRoZSB1c2VyIHR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIHNlbGVjdGVkCi0gKiByZXNvdXJjZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4gCi0gKiAKLSAqIERlcml2ZWQgZnJvbSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlJlbmFtZVJlc291cmNlQWN0aW9uCi0gKiAKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgUmVuYW1lUmVzb3VyY2VBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZW5hbWVSZXNvdXJjZUFjdGlvbiByZW5hbWVBY3Rpb24gPSBudWxsOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAodGhpcy5yZW5hbWVBY3Rpb24gPT0gbnVsbCkKLQkJCXRoaXMucmVuYW1lQWN0aW9uID0gbmV3IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuUmVuYW1lUmVzb3VyY2VBY3Rpb24oUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLQkJdGhpcy5yZW5hbWVBY3Rpb24ucnVuKCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmICh0aGlzLnJlbmFtZUFjdGlvbiA9PSBudWxsKQotCQkJdGhpcy5yZW5hbWVBY3Rpb24gPSBuZXcgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZW5hbWVSZXNvdXJjZUFjdGlvbihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotCi0JCXRoaXMucmVuYW1lQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9hY3Rpb25zL1Jlc291cmNlT3Blbkxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9yZXNvdXJjZXMvaW50ZXJuYWwvYWN0aW9ucy9SZXNvdXJjZU9wZW5MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjAyMDcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9hY3Rpb25zL1Jlc291cmNlT3Blbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JT3Blbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuT3BlbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuT3BlbkZpbGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlOwotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlT3Blbkxpc3RlbmVyIGltcGxlbWVudHMgSU9wZW5MaXN0ZW5lciB7Ci0JT3BlbkZpbGVBY3Rpb24gb3BlbkZpbGVBY3Rpb24gOwotCXByaXZhdGUgQ29tbW9uTmF2aWdhdG9yIGNvbW1vbk5hdmlnYXRvcjsKLQlwcml2YXRlIElOYXZpZ2F0b3JDb250ZW50U2VydmljZSBjb250ZW50U2VydmljZTsKLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbW1vbk5hdmlnYXRvciBhQ29tbW9uTmF2aWdhdG9yLCBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgYUNvbnRlbnRTZXJ2aWNlKSB7Ci0JCWNvbW1vbk5hdmlnYXRvciA9IGFDb21tb25OYXZpZ2F0b3I7Ci0JCWNvbnRlbnRTZXJ2aWNlID0gYUNvbnRlbnRTZXJ2aWNlOwotCQlvcGVuRmlsZUFjdGlvbiA9IG5ldyBPcGVuRmlsZUFjdGlvbihjb21tb25OYXZpZ2F0b3IuZ2V0U2l0ZSgpLmdldFBhZ2UoKSk7Ci0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSU9wZW5MaXN0ZW5lciNvcGVuKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuT3BlbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW4oT3BlbkV2ZW50IGV2ZW50KSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJaWYgKG9wZW5GaWxlQWN0aW9uICE9IG51bGwgKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBzdHJ1Y3R1cmVTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkgICAgICAgICAgICBvcGVuRmlsZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHN0cnVjdHVyZVNlbGVjdGlvbik7Ci0JCSAgICAgICAgICAgIG9wZW5GaWxlQWN0aW9uLnJ1bigpOwotCQkgICAgICAgIH0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL3BsdWdpbi9OYXZpZ2F0b3JVSVBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL3BsdWdpbi9OYXZpZ2F0b3JVSVBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjVhYmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9wbHVnaW4vTmF2aWdhdG9yVUlQbHVnaW5JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvclBsdWdpbjsKLQotCi0vKioKLSAqIEhhbmRsZXMgYWxsIGltYWdlcyBhbmQgaWNvbnMgZm9yIHRoZSB1aS4KLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgTmF2aWdhdG9yVUlQbHVnaW5JbWFnZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIGZnSWNvbkxvY2F0aW9uOwotCi0KLQkvL0NyZWF0ZSBpbWFnZSByZWdpc3RyeQotCXByaXZhdGUgZmluYWwgc3RhdGljIEltYWdlUmVnaXN0cnkgTkFWSUdBVE9SVUlQTFVHSU5fUkVHSVNUUlkgPSBOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKTsKLQotCS8vQ3JlYXRlIHRoZSBpY29uIGxvY2F0aW9uCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHBhdGhTdWZmaXggPSAiaWNvbnMvZnVsbC8iOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlmZ0ljb25Mb2NhdGlvbiA9IG5ldyBVUkwoTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpLCBwYXRoU3VmZml4KTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gU3RyaW5nCi0JICogICAgICAgICAgICBrZXkgLSBOYW1lIG9mIHRoZSBpY29uLgotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBOQVZJR0FUT1JVSVBMVUdJTl9SRUdJU1RSWS5nZXQoa2V5KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZSBhbmQgcmV0dXJucyBhIGltYWdlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIFN0cmluZwotCSAqICAgICAgICAgICAgcHJlZml4IC0gSWNvbiBkaXIgc3RydWN0dXJlLgotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaWNvbi4KLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvcgotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG1ha2VJY29uRmlsZVVSTChwcmVmaXgsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBpY29uIHVybAotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIHByZWZpeCAtIEljb24gZGlyIHN0cnVjdHVyZS4KLQkgKiBAcGFyYW0gU3RyaW5nCi0JICogICAgICAgICAgICBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGljb24uCi0JICogQHJldHVybiBVUkwKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBVUkwgbWFrZUljb25GaWxlVVJMKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHByZWZpeCk7Ci0JCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChmZ0ljb25Mb2NhdGlvbiwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0aHJlZSBpbWFnZSBkZXNjcmlwdG9ycyBmb3IgZW5hYmxlZCwgZGlzYWJsZWQsIGFuZCBob3ZlcmVkIHRvIGFuIGFjdGlvbi4gVGhlIGFjdGlvbnMKLQkgKiBhcmUgcmV0cmlldmVkIGZyb20gdGhlICpsY2wxNiBmb2xkZXJzLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24KLQkgKiBAcGFyYW0gaWNvbk5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBpY29uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9jYWxJbWFnZURlc2NyaXB0b3JzKElBY3Rpb24gYWN0aW9uLCBTdHJpbmcgaWNvbk5hbWUpIHsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9ycyhhY3Rpb24sICJsY2wxNi8iLCBpY29uTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGFsbCBhdmFpbGFibGUgaW1hZ2UgZGVzY3JpcHRvcnMgZm9yIHRoZSBnaXZlbiBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIElBY3Rpb24KLQkgKiAgICAgICAgICAgIGFjdGlvbiAtIFRoZSBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBpY29uLgotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIHR5cGUgLSBUaGUgdHlwZSBvZiBpY29uLgotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIHJlbFBhdGggLSBUaGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgaWNvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9ycyhJQWN0aW9uIGFjdGlvbiwgU3RyaW5nIHR5cGUsIFN0cmluZyByZWxQYXRoKSB7Ci0JCS8vCQkvKnJlbFBhdGg9IHJlbFBhdGguc3Vic3RyaW5nKE5BVklHQVRPUlVJX05BTUVfUFJFRklYX0xFTkdUSCk7Ki8KLQkJLy8JCWFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihjcmVhdGUoImQiICsgdHlwZSwgcmVsUGF0aCkpOyAvLyROT04tTkxTLTEkCi0JCS8vCQlhY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoY3JlYXRlKCJjIiArIHR5cGUsIHJlbFBhdGgpKTsgLy8kTk9OLU5MUy0xJAotCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGNyZWF0ZSgiZSIgKyB0eXBlLCByZWxQYXRoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL3BsdWdpbi9Xb3JrYmVuY2hOYXZpZ2F0b3JNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL3BsdWdpbi9Xb3JrYmVuY2hOYXZpZ2F0b3JNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWNkNDJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9wbHVnaW4vV29ya2JlbmNoTmF2aWdhdG9yTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdoaWNoIGhlbHBzIG1hbmFnaW5nIG1lc3NhZ2VzCi0gKiAKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoTmF2aWdhdG9yTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJtZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlRXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXJfSGlkZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0UmVzb3VyY2VzTWVudV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydFJlc291cmNlc01lbnVfdGV4dDsKLQkKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtiZW5jaF9uZXc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbldpdGhNZW51X2xhYmVsOwotCQotCQotCXN0YXRpYyB7Ci0JCWluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV29ya2JlbmNoTmF2aWdhdG9yTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9wbHVnaW4vV29ya2JlbmNoTmF2aWdhdG9yUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9yZXNvdXJjZXMvaW50ZXJuYWwvcGx1Z2luL1dvcmtiZW5jaE5hdmlnYXRvclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTMyMmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC9wbHVnaW4vV29ya2JlbmNoTmF2aWdhdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOyAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyBmb3IgdGhlIHdvcmtiZW5jaCBOYXZpZ2F0b3IuCi0gKiAKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoTmF2aWdhdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdvcmtiZW5jaE5hdmlnYXRvclBsdWdpbiBwbHVnaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlcgotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hOYXZpZ2F0b3JQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya2JlbmNoTmF2aWdhdG9yUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyBlcnJvcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyggbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIDAsIG1lc3NhZ2UsIG51bGwpKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlICsgIlxuUmVhc29uOiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQlTeXN0ZW0uZXJyLnByaW50bG4oc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL3dvcmtiZW5jaC9DdXN0b21SZXNvdXJjZUV4dGVuc2lvbkZpbHRlclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9yZXNvdXJjZXMvaW50ZXJuYWwvd29ya2JlbmNoL0N1c3RvbVJlc291cmNlRXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3NmVjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9yZXNvdXJjZXMvaW50ZXJuYWwvd29ya2JlbmNoL0N1c3RvbVJlc291cmNlRXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmZpbHRlcnMuRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZmlsdGVycy5FeHRlbnNpb25GaWx0ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLnBsdWdpbi5Xb3JrYmVuY2hOYXZpZ2F0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlUGF0dGVybkZpbHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4yCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21SZXNvdXJjZUV4dGVuc2lvbkZpbHRlclByb3ZpZGVyIGltcGxlbWVudHMgRXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9GSUxURVJTX1BSRUZFUkVOQ0UgPSAiQ1VTVE9NX0ZJTFRFUlNfUFJFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BBVFRFUk4gPSAicGF0dGVybiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBjbGFzcyBDdXN0b21GaWx0ZXIgewotCQlwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7Ci0JCXB1YmxpYyBmaW5hbCBTdHJpbmcgcGF0dGVybjsKLQotCQlwdWJsaWMgQ3VzdG9tRmlsdGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0dGVybikgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0JCX0KLQl9Ci0KLSAKLQlwdWJsaWMgTGlzdCBnZXRFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9ycyhTdHJpbmcgZXh0ZW5zaW9uSWQsIFN0cmluZyB2aWV3ZXJJZCkgewotCQlMaXN0IGV4dEZpbHRlckRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yIGV4dEZpbHRlckRlc2NyaXB0b3IgPSBudWxsOwotCQlWaWV3ZXJGaWx0ZXIgdmYgPSBudWxsOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gV29ya2JlbmNoTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcga25vd25DdXN0b21GaWx0ZXJzID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKHZpZXdlcklkICsgQ1VTVE9NX0ZJTFRFUlNfUFJFRkVSRU5DRSk7Ci0JCUN1c3RvbUZpbHRlcltdIGN1c3RvbUZpbHRlcnMgPSBwYXJzZUN1c3RvbUZpbHRlcnMoa25vd25DdXN0b21GaWx0ZXJzKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbUZpbHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCXZmID0gbmV3IFJlc291cmNlUGF0dGVybkZpbHRlcigpOwotCQkJKChSZXNvdXJjZVBhdHRlcm5GaWx0ZXIpIHZmKS5zZXRQYXR0ZXJucyhuZXcgU3RyaW5nW117Y3VzdG9tRmlsdGVyc1tpXS5wYXR0ZXJufSk7Ci0KLQkJCWJvb2xlYW4gZW5hYmxlZEJ5RGVmYXVsdCA9IHRydWU7Ci0KLQkJCWV4dEZpbHRlckRlc2NyaXB0b3IgPSBuZXcgRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcihleHRlbnNpb25JZCArICIuIiArIGN1c3RvbUZpbHRlcnNbaV0ucGF0dGVybiwgZXh0ZW5zaW9uSWQsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWN1c3RvbUZpbHRlcnNbaV0ubmFtZSwgY3VzdG9tRmlsdGVyc1tpXS5wYXR0ZXJuLCB2aWV3ZXJJZCwgZW5hYmxlZEJ5RGVmYXVsdCwgdmYpOwotCi0JCQlpZiAoIWV4dEZpbHRlckRlc2NyaXB0b3JzLmNvbnRhaW5zKGV4dEZpbHRlckRlc2NyaXB0b3IpKQotCQkJCWV4dEZpbHRlckRlc2NyaXB0b3JzLmFkZChleHRGaWx0ZXJEZXNjcmlwdG9yKTsKLQkJfQotCQlyZXR1cm4gZXh0RmlsdGVyRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGtub3duQ3VzdG9tRmlsdGVycwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEN1c3RvbUZpbHRlcltdIHBhcnNlQ3VzdG9tRmlsdGVycyhTdHJpbmcga25vd25DdXN0b21GaWx0ZXJzKSB7Ci0KLQkJTGlzdCByZXN1bHRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCi0JCQlTb3VyY2Ugc291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKGtub3duQ3VzdG9tRmlsdGVycykpOwotCQkJRE9NUmVzdWx0IHJlc3VsdCA9IG5ldyBET01SZXN1bHQoKTsKLQkJCXRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0KLQkJCU5vZGUgbm9kZSA9IHJlc3VsdC5nZXROb2RlKCk7Ci0JCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCi0JCQlDdXN0b21GaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQkJCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJCVN0cmluZyBwYXR0ZXJuID0gbnVsbDsKLQkJCU5vZGUgY2hpbGQgPSBudWxsOwotCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBudWxsOwotCQkJTm9kZSB0ZW1wID0gbnVsbDsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCWF0dHJpYnV0ZXMgPSBjaGlsZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJbmFtZSA9ICgodGVtcCA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKEFUVF9OQU1FKSkgIT0gbnVsbCkgPyB0ZW1wLmdldE5vZGVWYWx1ZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlwYXR0ZXJuID0gKCh0ZW1wID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oQVRUX1BBVFRFUk4pKSAhPSBudWxsKSA/IHRlbXAuZ2V0Tm9kZVZhbHVlKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWZpbHRlciA9IG5ldyBDdXN0b21GaWx0ZXIoKG5hbWUgIT0gbnVsbCkgPyBuYW1lIDogIiIsIChwYXR0ZXJuICE9IG51bGwpID8gcGF0dGVybiA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmVzdWx0TGlzdC5hZGQoZmlsdGVyKTsKLQkJCX0KLQotCQkJcmVzdWx0TGlzdC50b0FycmF5KG5ldyBDdXN0b21GaWx0ZXJbcmVzdWx0TGlzdC5zaXplKCldKTsKLQotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBuZXcgQ3VzdG9tRmlsdGVyWzBdOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIHRyYW5zZm9ybShTb3VyY2UgcywgUmVzdWx0IHIpIHRocm93cyBFeGNlcHRpb24gewotCQlUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHMsIHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC93b3JrYmVuY2gvUmVzb3VyY2VDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9yZXNvdXJjZXMvaW50ZXJuYWwvd29ya2JlbmNoL1Jlc291cmNlQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmIxODJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC93b3JrYmVuY2gvUmVzb3VyY2VDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5pbnRlcm5hbC53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZVNvcnRlcjsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjIgCi0gKgotICovCi1jbGFzcyBSZXNvdXJjZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotCXByaXZhdGUgUmVzb3VyY2VTb3J0ZXIgc29ydGVyID0gbmV3IFJlc291cmNlU29ydGVyKFJlc291cmNlU29ydGVyLk5BTUUpOwotCi0JLyoqCi0JICogVGhlIGZvbGxvd2luZyBjb21wYXJlIHdpbGwgc29ydCBpdGVtcyBiYXNlZCBvbiB0aGVpciB0eXBlIChpbiB0aGUgb3JkZXIgb2Y6IFJPT1QsIFBST0pFQ1QsCi0JICogRk9MREVSLCBGSUxFKSBhbmQgdGhlbiBiYXNlZCBvbiB0aGVpciBTdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiAKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCXJldHVybiB0aGlzLnNvcnRlci5jb21wYXJlKG51bGwsIG8xLCBvMik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCi0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBSZXNvdXJjZUNvbXBhcmF0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC93b3JrYmVuY2gvUmVzb3VyY2VEcm9wQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9yZXNvdXJjZXMvaW50ZXJuYWwvd29ya2JlbmNoL1Jlc291cmNlRHJvcEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWM3MGZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC93b3JrYmVuY2gvUmVzb3VyY2VEcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5pbnRlcm5hbC53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Nb3ZlRmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuUmVhZE9ubHlTdGF0ZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JT3ZlcndyaXRlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Ecm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuQWRhcHRhYmlsaXR5VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kLklEcm9wVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQuTmF2aWdhdG9yRHJvcEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUmVzb3VyY2VUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlczsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4yCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZURyb3BBY3Rpb24gZXh0ZW5kcyBOYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRHJvcFZhbGlkYXRvciwgSU92ZXJ3cml0ZVF1ZXJ5IHsKLQotCS8qKgotCSAqIEEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgb3ZlcndyaXRlcyBzaG91bGQgYWx3YXlzIG9jY3VyLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhbHdheXNPdmVyd3JpdGUgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBsYXN0IHZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwcml2YXRlIGludCBsYXN0VmFsaWRPcGVyYXRpb24gPSBETkQuRFJPUF9OT05FOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzcyBJUkVTT1VSQ0VfQ0xBU1MgPSBJUmVzb3VyY2UuY2xhc3M7Ci0KLQlwcml2YXRlIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24gY29weU9wZXJhdGlvbjsKLQotCXByaXZhdGUgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbiBtb3ZlT3BlcmF0aW9uOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZURyb3BBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlcnJvciBzdGF0dXMgd2l0aCB0aGUgZ2l2ZW4gaW5mby4KLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgZXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGVycm9yKG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZXJyb3Igc3RhdHVzIHdpdGggdGhlIGdpdmVuIGluZm8uCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIGVycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBsYXRmb3JtVUkuUExVR0lOX0lELCAwLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdHVhbCB0YXJnZXQgb2YgdGhlIGRyb3AsIGdpdmVuIHRoZSByZXNvdXJjZSB1bmRlciB0aGUgbW91c2UuIElmIHRoZSBtb3VzZQotCSAqIHRhcmdldCBpcyBhIGZpbGUsIHRoZW4gdGhlIGRyb3AgYWN0dWFsbHkgb2NjdXJzIGluIGl0cyBwYXJlbnQuIElmIHRoZSBkcm9wIGxvY2F0aW9uIGlzIGJlZm9yZQotCSAqIG9yIGFmdGVyIHRoZSBtb3VzZSB0YXJnZXQgYW5kIGZlZWRiYWNrIGlzIGVuYWJsZWQsIHRoZSB0YXJnZXQgaXMgYWxzbyB0aGUgcGFyZW50LgotCSAqLwotCXByaXZhdGUgSUNvbnRhaW5lciBnZXRBY3R1YWxUYXJnZXQoSUNvbW1vbkRyb3BBZGFwdGVyIGRyb3BBZGFwdGVyLCBJUmVzb3VyY2UgbW91c2VUYXJnZXQpIHsKLQkJLyogaWYgY3Vyc29yIGlzIGJlZm9yZSBvciBhZnRlciBtb3VzZVRhcmdldCwgc2V0IHRhcmdldCB0byBwYXJlbnQgKi8KLQkJaWYgKGRyb3BBZGFwdGVyLmdldEZlZWRiYWNrRW5hYmxlZCgpKSB7Ci0JCQlpZiAoZHJvcEFkYXB0ZXIuZ2V0Q3VycmVudExvY2F0aW9uKCkgPT0gVmlld2VyRHJvcEFkYXB0ZXIuTE9DQVRJT05fQkVGT1JFIHx8IGRyb3BBZGFwdGVyLmdldEN1cnJlbnRMb2NhdGlvbigpID09IFZpZXdlckRyb3BBZGFwdGVyLkxPQ0FUSU9OX0FGVEVSKSB7Ci0JCQkJcmV0dXJuIG1vdXNlVGFyZ2V0LmdldFBhcmVudCgpOwotCQkJfQotCQl9Ci0JCS8qIGlmIGN1cnNvciBpcyBvbiBhIGZpbGUsIHJldHVybiB0aGUgcGFyZW50ICovCi0JCWlmIChtb3VzZVRhcmdldC5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCXJldHVybiBtb3VzZVRhcmdldC5nZXRQYXJlbnQoKTsKLQkJfQotCQkvKiBvdGhlcndpc2UgdGhlIG1vdXNlVGFyZ2V0IGlzIHRoZSByZWFsIHRhcmdldCAqLwotCQlyZXR1cm4gKElDb250YWluZXIpIG1vdXNlVGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIHNlbGVjdGlvbiBmcm9tIHRoZSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIHNlbGVjdGlvbiBmcm9tIHRoZSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyCi0JICovCi0JcHJpdmF0ZSBJUmVzb3VyY2VbXSBnZXRTZWxlY3RlZFJlc291cmNlcygpIHsKLQkJSVJlc291cmNlW10gc2VsZWN0ZWRSZXNvdXJjZXMgPSBudWxsOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUxpc3Qgc2VsZWN0aW9uTGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9MaXN0KCk7Ci0JCQlzZWxlY3RlZFJlc291cmNlcyA9IChJUmVzb3VyY2VbXSkgc2VsZWN0aW9uTGlzdC50b0FycmF5KG5ldyBJUmVzb3VyY2Vbc2VsZWN0aW9uTGlzdC5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlcnJvciBzdGF0dXMgd2l0aCB0aGUgZ2l2ZW4gaW5mby4KLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgaW5mbyhTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFBsYXRmb3JtVUkuUExVR0lOX0lELCAwLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBzdGF0dXMgdG8gdGhlIGxpc3Qgb2YgcHJvYmxlbXMuIERpc2NhcmRzIE9LIHN0YXR1c2VzLiBJZiB0aGUgc3RhdHVzIGlzIGEKLQkgKiBtdWx0aS1zdGF0dXMsIG9ubHkgaXRzIGNoaWxkcmVuIGFyZSBhZGRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbWVyZ2VTdGF0dXMoTXVsdGlTdGF0dXMgc3RhdHVzLCBJU3RhdHVzIHRvTWVyZ2UpIHsKLQkJaWYgKCF0b01lcmdlLmlzT0soKSkgewotCQkJc3RhdHVzLm1lcmdlKHRvTWVyZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBzdGF0dXMgaW5kaWNhdGluZyBzdWNjZXNzLgotCSAqLwotCXByaXZhdGUgSVN0YXR1cyBvaygpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUGxhdGZvcm1VSS5QTFVHSU5fSUQsIDAsIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuZ2V0U3RyaW5nKCJEcm9wQWRhcHRlci5vayIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE9wZW5zIGFuIGVycm9yIGRpYWxvZyBpZiBuZWNlc3NhcnkuIFRha2VzIGNhcmUgb2YgY29tcGxleCBydWxlcyBuZWNlc3NhcnkgZm9yIG1ha2luZyB0aGUKLQkgKiBlcnJvciBkaWFsb2cgbG9vayBuaWNlLgotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRXJyb3IoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBnZW5lcmljVGl0bGUgPSBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLmdldFN0cmluZygiRHJvcEFkYXB0ZXIudGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY29kZXMgPSBJU3RhdHVzLkVSUk9SIHwgSVN0YXR1cy5XQVJOSU5HOwotCi0JCS8vc2ltcGxlIGNhc2U6IG9uZSBlcnJvciwgbm90IGEgbXVsdGlzdGF0dXMKLQkJaWYgKCFzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgZ2VuZXJpY1RpdGxlLCBudWxsLCBzdGF0dXMsIGNvZGVzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vb25lIGVycm9yLCBzaW5nbGUgY2hpbGQgb2YgbXVsdGlzdGF0dXMKLQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCWlmIChjaGlsZHJlbi5sZW5ndGggPT0gMSkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIHN0YXR1cy5nZXRNZXNzYWdlKCksIG51bGwsIGNoaWxkcmVuWzBdLCBjb2Rlcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy9zZXZlcmFsIHByb2JsZW1zCi0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBnZW5lcmljVGl0bGUsIG51bGwsIHN0YXR1cywgY29kZXMpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIGEgZHJvcCB1c2luZyB0aGUgRmlsZVRyYW5zZmVyIHRyYW5zZmVyIHR5cGUuCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHBlcmZvcm1GaWxlRHJvcChJQ29tbW9uRHJvcEFkYXB0ZXIgZHJvcEFkYXB0ZXIsIE9iamVjdCBkYXRhKSB7Ci0JCU11bHRpU3RhdHVzIHByb2JsZW1zID0gbmV3IE11bHRpU3RhdHVzKFBsYXRmb3JtVUkuUExVR0lOX0lELCAwLCBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLmdldFN0cmluZygiRHJvcEFkYXB0ZXIucHJvYmxlbUltcG9ydGluZyIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQltZXJnZVN0YXR1cyhwcm9ibGVtcywgdmFsaWRhdGVUYXJnZXQoZHJvcEFkYXB0ZXIsIGRyb3BBZGFwdGVyLmdldEN1cnJlbnRUYXJnZXQoKSwgZHJvcEFkYXB0ZXIuZ2V0Q3VycmVudFRyYW5zZmVyKCkpKTsKLQotCQl0cnkgewotCQkJZmluYWwgSUNvbnRhaW5lciB0YXJnZXQgPSBnZXRBY3R1YWxUYXJnZXQoZHJvcEFkYXB0ZXIsIGdldFJlc291cmNlKGRyb3BBZGFwdGVyLmdldEN1cnJlbnRUYXJnZXQoKSkpOwotCQkJZmluYWwgU3RyaW5nW10gbmFtZXMgPSAoU3RyaW5nW10pIGRhdGE7Ci0JCQkvLyBSdW4gdGhlIGltcG9ydCBvcGVyYXRpb24gYXN5bmNocm9ub3VzbHkuCi0JCQkvLyBPdGhlcndpc2UgdGhlIGRyYWcgc291cmNlIChlLmcuLCBXaW5kb3dzIEV4cGxvcmVyKSB3aWxsIGJlCi0JCQkvLyBibG9ja2VkCi0JCQkvLyB3aGlsZSB0aGUgb3BlcmF0aW9uIGV4ZWN1dGVzLiBGaXhlcyBidWcgMTY0NzguCi0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlnZXRTaGVsbCgpLmZvcmNlQWN0aXZlKCk7Ci0JCQkJCUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24oZ2V0U2hlbGwoKSk7Ci0JCQkJCW9wZXJhdGlvbi5jb3B5RmlsZXMobmFtZXMsIHRhcmdldCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBwcm9ibGVtczsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhIHJlc291cmNlIGNvcHkKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgcGVyZm9ybVJlc291cmNlQ29weShJQ29tbW9uRHJvcEFkYXB0ZXIgZHJvcEFkYXB0ZXIsIElSZXNvdXJjZVtdIHNvdXJjZXMpIHsKLQkJTXVsdGlTdGF0dXMgcHJvYmxlbXMgPSBuZXcgTXVsdGlTdGF0dXMoUGxhdGZvcm1VSS5QTFVHSU5fSUQsIDEsIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuZ2V0U3RyaW5nKCJEcm9wQWRhcHRlci5wcm9ibGVtc01vdmluZyIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQltZXJnZVN0YXR1cyhwcm9ibGVtcywgdmFsaWRhdGVUYXJnZXQoZHJvcEFkYXB0ZXIsIGRyb3BBZGFwdGVyLmdldEN1cnJlbnRUYXJnZXQoKSwgZHJvcEFkYXB0ZXIuZ2V0Q3VycmVudFRyYW5zZmVyKCkpKTsKLQotCQlJQ29udGFpbmVyIHRhcmdldCA9IGdldEFjdHVhbFRhcmdldChkcm9wQWRhcHRlciwgZ2V0UmVzb3VyY2UoZHJvcEFkYXB0ZXIuZ2V0Q3VycmVudFRhcmdldCgpKSk7Ci0JCWdldENvcHlPcGVyYXRpb24oKS5jb3B5UmVzb3VyY2VzKHNvdXJjZXMsIHRhcmdldCk7Ci0JCWNvcHlPcGVyYXRpb24gPSBudWxsOwotCQlyZXR1cm4gcHJvYmxlbXM7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgYSByZXNvdXJjZSBtb3ZlCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHBlcmZvcm1SZXNvdXJjZU1vdmUoSUNvbW1vbkRyb3BBZGFwdGVyIGRyb3BBZGFwdGVyLCBJUmVzb3VyY2VbXSBzb3VyY2VzKSB7Ci0JCU11bHRpU3RhdHVzIHByb2JsZW1zID0gbmV3IE11bHRpU3RhdHVzKFBsYXRmb3JtVUkuUExVR0lOX0lELCAxLCBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLmdldFN0cmluZygiRHJvcEFkYXB0ZXIucHJvYmxlbXNNb3ZpbmciKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJbWVyZ2VTdGF0dXMocHJvYmxlbXMsIHZhbGlkYXRlVGFyZ2V0KGRyb3BBZGFwdGVyLCBkcm9wQWRhcHRlci5nZXRDdXJyZW50VGFyZ2V0KCksIGRyb3BBZGFwdGVyLmdldEN1cnJlbnRUcmFuc2ZlcigpKSk7Ci0KLQkJSUNvbnRhaW5lciB0YXJnZXQgPSBnZXRBY3R1YWxUYXJnZXQoZHJvcEFkYXB0ZXIsIGdldFJlc291cmNlKGRyb3BBZGFwdGVyLmdldEN1cnJlbnRUYXJnZXQoKSkpOwotCQlSZWFkT25seVN0YXRlQ2hlY2tlciBjaGVja2VyID0gbmV3IFJlYWRPbmx5U3RhdGVDaGVja2VyKGdldFNoZWxsKCksIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuZ2V0U3RyaW5nKCJNb3ZlUmVzb3VyY2VBY3Rpb24udGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLmdldFN0cmluZygiTW92ZVJlc291cmNlQWN0aW9uLmNoZWNrTW92ZU1lc3NhZ2UiKSk7Ly8kTk9OLU5MUy0xJAkKLQkJc291cmNlcyA9IGNoZWNrZXIuY2hlY2tSZWFkT25seVJlc291cmNlcyhzb3VyY2VzKTsKLQotCQlnZXRNb3ZlT3BlcmF0aW9uKCkuY29weVJlc291cmNlcyhzb3VyY2VzLCB0YXJnZXQpOwotCQltb3ZlT3BlcmF0aW9uID0gbnVsbDsKLQotCQlyZXR1cm4gcHJvYmxlbXM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElPdmVyd3JpdGVRdWVyeSNxdWVyeU92ZXJ3cml0ZShTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBxdWVyeU92ZXJ3cml0ZShTdHJpbmcgcGF0aFN0cmluZykgewotCQlpZiAodGhpcy5hbHdheXNPdmVyd3JpdGUpCi0JCQlyZXR1cm4gQUxMOwotCi0JCWZpbmFsIFN0cmluZyByZXR1cm5Db2RlW10gPSB7Q0FOQ0VMfTsKLQkJZmluYWwgU3RyaW5nIG1zZyA9IFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuZm9ybWF0KCJEcm9wQWRhcHRlci5vdmVyd3JpdGVRdWVyeSIsIG5ldyBPYmplY3RbXXtwYXRoU3RyaW5nfSk7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nW10gb3B0aW9ucyA9IHtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH07Ci0JCWdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuZ2V0U3RyaW5nKCJEcm9wQWRhcHRlci5xdWVzdGlvbiIpLCBudWxsLCBtc2csIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG9wdGlvbnMsIDApOyAvLyROT04tTkxTLTEkCi0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQlpbnQgcmV0dXJuVmFsID0gZGlhbG9nLmdldFJldHVybkNvZGUoKTsKLQkJCQlTdHJpbmdbXSByZXR1cm5Db2RlcyA9IHtZRVMsIEFMTCwgTk8sIENBTkNFTH07Ci0JCQkJcmV0dXJuQ29kZVswXSA9IHJldHVyblZhbCA8IDAgPyBDQU5DRUwgOiByZXR1cm5Db2Rlc1tyZXR1cm5WYWxdOwotCQkJfQotCQl9KTsKLQkJaWYgKHJldHVybkNvZGVbMF0gPT0gQUxMKQotCQkJdGhpcy5hbHdheXNPdmVyd3JpdGUgPSB0cnVlOwotCQlyZXR1cm4gcmV0dXJuQ29kZVswXTsKLQl9Ci0gCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEcm9wKElDb21tb25Ecm9wQWRhcHRlciBkcm9wQWRhcHRlciwgT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCQlyZXR1cm4gdmFsaWRhdGVUYXJnZXQoZHJvcEFkYXB0ZXIsIHRhcmdldCwgdHJhbnNmZXJUeXBlKS5pc09LKCk7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBydW4oSUNvbW1vbkRyb3BBZGFwdGVyIGRyb3BBZGFwdGVyLCBPYmplY3QgZGF0YSwgT2JqZWN0IHRhcmdldCkgewotCi0JCXRoaXMuYWx3YXlzT3ZlcndyaXRlID0gZmFsc2U7Ci0JCWlmIChkcm9wQWRhcHRlci5nZXRDdXJyZW50VGFyZ2V0KCkgPT0gbnVsbCB8fCBkYXRhID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0JCVRyYW5zZmVyRGF0YSBjdXJyZW50VHJhbnNmZXIgPSBkcm9wQWRhcHRlci5nZXRDdXJyZW50VHJhbnNmZXIoKTsKLQkJaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoY3VycmVudFRyYW5zZmVyKSkgewotCQkJcmVzb3VyY2VzID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLQkJfSBlbHNlIGlmIChSZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGN1cnJlbnRUcmFuc2ZlcikpIHsKLQkJCXJlc291cmNlcyA9IChJUmVzb3VyY2VbXSkgZGF0YTsKLQkJfSBlbHNlIGlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoY3VycmVudFRyYW5zZmVyKSkgewotCQkJc3RhdHVzID0gcGVyZm9ybUZpbGVEcm9wKGRyb3BBZGFwdGVyLCBkYXRhKTsKLQkJCXJlc3VsdCA9IHN0YXR1cy5pc09LKCk7Ci0JCX0KLQkJaWYgKHJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQlpZiAoZHJvcEFkYXB0ZXIuZ2V0Q3VycmVudE9wZXJhdGlvbigpID09IERORC5EUk9QX0NPUFkpCi0JCQkJc3RhdHVzID0gcGVyZm9ybVJlc291cmNlQ29weShkcm9wQWRhcHRlciwgcmVzb3VyY2VzKTsKLQkJCWVsc2UKLQkJCQlzdGF0dXMgPSBwZXJmb3JtUmVzb3VyY2VNb3ZlKGRyb3BBZGFwdGVyLCByZXNvdXJjZXMpOwotCQl9Ci0JCW9wZW5FcnJvcihzdGF0dXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCB0aGUgZHJvcCB0YXJnZXQgbWVldHMgY2VydGFpbiBjcml0ZXJpYQotCSAqLwotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVRhcmdldChJQ29tbW9uRHJvcEFkYXB0ZXIgZHJvcEFkYXB0ZXIsIE9iamVjdCB0YXJnZXQsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGUpIHsKLQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKSkgewotCQkJcmV0dXJuIGluZm8oUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5nZXRTdHJpbmcoIkRyb3BBZGFwdGVyLnRhcmdldE11c3RCZVJlc291cmNlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoZHJvcEFkYXB0ZXIuZ2V0Q3VycmVudFRhcmdldCgpKTsKLQkJaWYgKCFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuIGVycm9yKFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuZ2V0U3RyaW5nKCJEcm9wQWRhcHRlci5jYW5Ob3REcm9wSW50b0Nsb3NlZFByb2plY3QiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJQ29udGFpbmVyIGRlc3RpbmF0aW9uID0gZ2V0QWN0dWFsVGFyZ2V0KGRyb3BBZGFwdGVyLCByZXNvdXJjZSk7Ci0JCWlmIChkZXN0aW5hdGlvbi5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCXJldHVybiBlcnJvcihSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLmdldFN0cmluZygiRHJvcEFkYXB0ZXIucmVzb3VyY2VzQ2FuTm90QmVTaWJsaW5ncyIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJLy8gZHJhZyB3aXRoaW4gRWNsaXBzZT8KLQkJaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotCQkJSVJlc291cmNlW10gc2VsZWN0ZWRSZXNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpOwotCi0JCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZXMgPT0gbnVsbCkKLQkJCQltZXNzYWdlID0gUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5nZXRTdHJpbmcoIkRyb3BBZGFwdGVyLmRyb3BPcGVyYXRpb25FcnJvck90aGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgewotCQkJCUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24gb3BlcmF0aW9uOwotCQkJCWlmICh0aGlzLmxhc3RWYWxpZE9wZXJhdGlvbiA9PSBETkQuRFJPUF9DT1BZKSB7Ci0JCQkJCW9wZXJhdGlvbiA9IGdldENvcHlPcGVyYXRpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvcGVyYXRpb24gPSBnZXRNb3ZlT3BlcmF0aW9uKCk7Ci0JCQkJfQotCQkJCW1lc3NhZ2UgPSBvcGVyYXRpb24udmFsaWRhdGVEZXN0aW5hdGlvbihkZXN0aW5hdGlvbiwgc2VsZWN0ZWRSZXNvdXJjZXMpOwotCQkJfQotCQl9IC8vIGZpbGUgaW1wb3J0PwotCQllbHNlIGlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSAoU3RyaW5nW10pIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLm5hdGl2ZVRvSmF2YSh0cmFuc2ZlclR5cGUpOwotCQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpIHsKLQkJCQkvLyBzb3VyY2UgbmFtZXMgd2lsbCBiZSBudWxsIG9uIExpbnV4LiBVc2UgZW1wdHkgbmFtZXMgdG8gZG8KLQkJCQkvLyBkZXN0aW5hdGlvbiB2YWxpZGF0aW9uLgotCQkJCS8vIEZpeGVzIGJ1ZyAyOTc3OAotCQkJCXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1swXTsKLQkJCX0KLQkJCW1lc3NhZ2UgPSBnZXRDb3B5T3BlcmF0aW9uKCkudmFsaWRhdGVJbXBvcnREZXN0aW5hdGlvbihkZXN0aW5hdGlvbiwgc291cmNlTmFtZXMpOwotCQl9Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiBlcnJvcihtZXNzYWdlKTsKLQkJfQotCQlyZXR1cm4gb2soKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uIGdldE1vdmVPcGVyYXRpb24oKSB7Ci0JCWlmIChtb3ZlT3BlcmF0aW9uID09IG51bGwpCi0JCQltb3ZlT3BlcmF0aW9uID0gbmV3IE1vdmVGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24oZ2V0U2hlbGwoKSk7Ci0JCXJldHVybiBtb3ZlT3BlcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24gZ2V0Q29weU9wZXJhdGlvbigpIHsKLQkJaWYgKGNvcHlPcGVyYXRpb24gPT0gbnVsbCkKLQkJCWNvcHlPcGVyYXRpb24gPSBuZXcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbihnZXRTaGVsbCgpKTsKLQkJcmV0dXJuIGNvcHlPcGVyYXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiAoSVJlc291cmNlKSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUkVTT1VSQ0VfQ0xBU1MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL3dvcmtiZW5jaC9SZXNvdXJjZUV4dGVuc2lvbkNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL3dvcmtiZW5jaC9SZXNvdXJjZUV4dGVuc2lvbkNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjExMDQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC93b3JrYmVuY2gvUmVzb3VyY2VFeHRlbnNpb25Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwud29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlRXh0ZW5zaW9uQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VFeHRlbnNpb25Db250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5CYXNlV29ya2JlbmNoQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLkJhc2VXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL3dvcmtiZW5jaC9SZXNvdXJjZUV4dGVuc2lvbkZpbHRlclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9yZXNvdXJjZXMvaW50ZXJuYWwvd29ya2JlbmNoL1Jlc291cmNlRXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjMGI2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9yZXNvdXJjZXMvaW50ZXJuYWwvd29ya2JlbmNoL1Jlc291cmNlRXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmZpbHRlcnMuRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZmlsdGVycy5FeHRlbnNpb25GaWx0ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLnBsdWdpbi5Xb3JrYmVuY2hOYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VQYXR0ZXJuRmlsdGVyOwotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlRXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXIgaW1wbGVtZW50cyBFeHRlbnNpb25GaWx0ZXJQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElERSA9IFdvcmtiZW5jaE5hdmlnYXRvck1lc3NhZ2VzLlJlc291cmNlRXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXJfSGlkZXMgOwotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VFeHRlbnNpb25GaWx0ZXJQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLSAKLQlwdWJsaWMgTGlzdCBnZXRFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9ycyhTdHJpbmcgZXh0ZW5zaW9uSWQsIFN0cmluZyB2aWV3ZXJJZCkgewotCQlMaXN0IGV4dEZpbHRlckRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yIGV4dEZpbHRlckRlc2NyaXB0b3IgPSBudWxsOwotCQlWaWV3ZXJGaWx0ZXIgdmYgPSBudWxsOwotCi0JCUFic3RyYWN0VUlQbHVnaW4gcGx1Z2luID0gKEFic3RyYWN0VUlQbHVnaW4pIFBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UudWkuaWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uID0gcGx1Z2luLmdldERlc2NyaXB0b3IoKS5nZXRFeHRlbnNpb25Qb2ludCgicmVzb3VyY2VGaWx0ZXJzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uLmdldEV4dGVuc2lvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb25zW2ldLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlTdHJpbmcgcGF0dGVybiA9IGNvbmZpZ0VsZW1lbnRzW2pdLmdldEF0dHJpYnV0ZSgicGF0dGVybiIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChwYXR0ZXJuICE9IG51bGwpIHsKLQkJCQkJCQl2ZiA9IG5ldyBSZXNvdXJjZVBhdHRlcm5GaWx0ZXIoKTsKLQkJCQkJCQkoKFJlc291cmNlUGF0dGVybkZpbHRlcikgdmYpLnNldFBhdHRlcm5zKG5ldyBTdHJpbmdbXXtwYXR0ZXJufSk7Ci0JCQkJCQkJU3RyaW5nIHNlbGVjdGVkID0gY29uZmlnRWxlbWVudHNbal0uZ2V0QXR0cmlidXRlKCJzZWxlY3RlZCIpOy8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCS8vIG92ZXJyaWRlIHRoZSBlbmFibGVtZW50IG9mIC4qIG9yIHVzZSB0aGUgUmVzb3VyY2Ugc2V0dGluZwotCQkJCQkJCWJvb2xlYW4gaXNEb3RTdGFyID0gKHBhdHRlcm4gIT0gbnVsbCAmJiAiLioiLmVxdWFscyhwYXR0ZXJuKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlib29sZWFuIGVuYWJsZWRCeURlZmF1bHQgPSAoaXNEb3RTdGFyIHx8IChzZWxlY3RlZCAhPSBudWxsICYmIHNlbGVjdGVkLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkpOyAvLyROT04tTkxTLTEkIAotCQkJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IEhJREUgKyBwYXR0ZXJuOwotCQkJCQkJCWV4dEZpbHRlckRlc2NyaXB0b3IgPSBuZXcgRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcihleHRlbnNpb25JZCArICIuIiArIHBhdHRlcm4sIGV4dGVuc2lvbklkLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJcGF0dGVybiwgZGVzY3JpcHRpb24sIHZpZXdlcklkLCBlbmFibGVkQnlEZWZhdWx0LCB2Zik7Ci0KLQkJCQkJCQlpZiAoIWV4dEZpbHRlckRlc2NyaXB0b3JzLmNvbnRhaW5zKGV4dEZpbHRlckRlc2NyaXB0b3IpKQotCQkJCQkJCQlleHRGaWx0ZXJEZXNjcmlwdG9ycy5hZGQoZXh0RmlsdGVyRGVzY3JpcHRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCi0JCS8vCQkgIGlmIChwYXR0ZW5zRGVmaW5lZC5zaXplKCkgPiAwKSB7Ci0JCS8vCQkgIAlOYW1lUGF0dGVybkZpbHRlciBwYXR0ZXJuRmlsdGVyID0gbmV3IE5hbWVQYXR0ZXJuRmlsdGVyKCk7Ci0JCS8vCQkgIAlwYXR0ZXJuRmlsdGVyLnNldFBhdHRlcm5zKHBhdHRlcm5zRGVmaW5lZCk7Ci0JCS8vCQkgIAlleHRGaWx0ZXJEZXNjcmlwdG9yID0gbmV3IEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IoZGVzY3JpcHRvcnNbaV0uZ2V0SWQoKSwgZXh0ZW5zaW9uSWQsCi0JCS8vIGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKSwgZGVzY3JpcHRvcnNbaV0uZ2V0RGVzY3JpcHRpb24oKSwgdmlld2VySWQsIGZhbHNlLCB2Zik7Ci0JCS8vCQkgIAlleHRGaWx0ZXJEZXNjcmlwdG9ycy5hZGQoZXh0RmlsdGVyRGVzY3JpcHRvcik7Ci0JCS8vCQkgIH0KLQotCQlyZXR1cm4gZXh0RmlsdGVyRGVzY3JpcHRvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL3dvcmtiZW5jaC9SZXNvdXJjZUV4dGVuc2lvbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC93b3JrYmVuY2gvUmVzb3VyY2VFeHRlbnNpb25MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzJiODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL3dvcmtiZW5jaC9SZXNvdXJjZUV4dGVuc2lvbkxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuaW50ZXJuYWwud29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklFeHRlbnNpb25TdGF0ZU1vZGVsOwotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlRXh0ZW5zaW9uTGFiZWxQcm92aWRlciBleHRlbmRzIFdvcmtiZW5jaExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tbW9uTGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgUmVzb3VyY2VFeHRlbnNpb25MYWJlbFByb3ZpZGVyKCkgewotCQkvL3N1cGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpOwotCQkKLQl9Ci0KLSAKLQlwdWJsaWMgdm9pZCBpbml0KElFeHRlbnNpb25TdGF0ZU1vZGVsIGFNb2RlbCwgSVRyZWVDb250ZW50UHJvdmlkZXIgYUNvbnRlbnRQcm92aWRlcikgewotCQkvL2luaXQKLQl9Ci0KLSAKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKE9iamVjdCBhbkVsZW1lbnQpIHsKLQotCQlpZiAoYW5FbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKQotCQkJcmV0dXJuICgoSVJlc291cmNlKSBhbkVsZW1lbnQpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL3dvcmtiZW5jaC9SZXNvdXJjZVNvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcmVzb3VyY2VzL2ludGVybmFsL3dvcmtiZW5jaC9SZXNvdXJjZVNvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI0N2U3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3Jlc291cmNlcy9pbnRlcm5hbC93b3JrYmVuY2gvUmVzb3VyY2VTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5pbnRlcm5hbC53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiBEZXJpdmVkIGZyb20ge0BsaW5rIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZVNvcnRlcn0uCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlU29ydGVyIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBhcmd1bWVudCB2YWx1ZSB0aGF0IGluZGljYXRlcyB0byBzb3J0IGl0ZW1zIGJ5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTkFNRSA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBhcmd1bWVudCB2YWx1ZSB0aGF0IGluZGljYXRlcyB0byBzb3J0IGl0ZW1zIGJ5IGV4dGVuc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUWVBFID0gMjsKLQotICAgIHByaXZhdGUgaW50IGNyaXRlcmlhOwotCi0JcHJpdmF0ZSBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcmVzb3VyY2Ugc29ydGVyIHRoYXQgd2lsbCB1c2UgdGhlIGdpdmVuIHNvcnQgY3JpdGVyaWEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY3JpdGVyaWEgdGhlIHNvcnQgY3JpdGVyaW9uIHRvIHVzZTogb25lIG9mIDxjb2RlPk5BTUU8L2NvZGU+IG9yIAotICAgICAqICAgPGNvZGU+VFlQRTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VTb3J0ZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuY3JpdGVyaWEgPSBOQU1FOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHJlbGF0aXZlIHNvcnQgcHJpb3JpdHkgb2YgdGhlIAotICAgICAqIGdpdmVuIGVsZW1lbnQgYmFzZWQgb24gaXRzIGNsYXNzLgotICAgICAqIDxwPgotICAgICAqIDx1bD4KLSAgICAgKiAgIDxsaT5yZXNvdXJjZXMgKDxjb2RlPklSZXNvdXJjZTwvY29kZT4pIC0gMjwvbGk+Ci0gICAgICogICA8bGk+cHJvamVjdCByZWZlcmVuY2VzICg8Y29kZT5Qcm9qZWN0UmVmZXJlbmNlPC9jb2RlPikgLSAxPC9saT4KLSAgICAgKiAgIDxsaT5ldmVyeXRoaW5nIGVsc2UgLSAwPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICogQHJldHVybiB0aGUgc29ydCBwcmlvcml0eSAobGFyZ2VyIG51bWJlcnMgbWVhbnMgbW9yZSBpbXBvcnRhbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBjbGFzc0NvbXBhcmlzb24oT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gVmlld2VyU29ydGVyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAvL2hhdmUgdG8gZGVhbCB3aXRoIG5vbi1yZXNvdXJjZXMgaW4gbmF2aWdhdG9yCi0gICAgICAgIC8vaWYgb25lIG9yIGJvdGggb2JqZWN0cyBhcmUgbm90IHJlc291cmNlcywgcmV0dXJuZWQgYSBjb21wYXJpc29uIAotICAgICAgICAvL2Jhc2VkIG9uIGNsYXNzLgotICAgICAgICBpZiAoIShvMSBpbnN0YW5jZW9mIElSZXNvdXJjZSAmJiBvMiBpbnN0YW5jZW9mIElSZXNvdXJjZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlQ2xhc3MobzEsIG8yKTsKLSAgICAgICAgfQotICAgICAgICBJUmVzb3VyY2UgcjEgPSAoSVJlc291cmNlKSBvMTsKLSAgICAgICAgSVJlc291cmNlIHIyID0gKElSZXNvdXJjZSkgbzI7Ci0KLSAgICAgICAgaWYgKHIxIGluc3RhbmNlb2YgSUNvbnRhaW5lciAmJiByMiBpbnN0YW5jZW9mIElDb250YWluZXIpCi0gICAgICAgICAgICByZXR1cm4gY29tcGFyZU5hbWVzKHIxLCByMik7Ci0gICAgICAgIGVsc2UgaWYgKHIxIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgZWxzZSBpZiAocjIgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGVsc2UgaWYgKGNyaXRlcmlhID09IE5BTUUpCi0gICAgICAgICAgICByZXR1cm4gY29tcGFyZU5hbWVzKHIxLCByMik7Ci0gICAgICAgIGVsc2UgaWYgKGNyaXRlcmlhID09IFRZUEUpCi0gICAgICAgICAgICByZXR1cm4gY29tcGFyZVR5cGVzKHIxLCByMik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBudW1iZXIgcmVmbGVjdGluZyB0aGUgY29sbGF0aW9uIG9yZGVyIG9mIHRoZSBnaXZlbiBlbGVtZW50cwotICAgICAqIGJhc2VkIG9uIHRoZWlyIGNsYXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQxIHRoZSBmaXJzdCBlbGVtZW50IHRvIGJlIG9yZGVyZWQKLSAgICAgKiBAcGFyYW0gZWxlbWVudDIgdGhlIHNlY29uZCBlbGVtZW50IHRvIGJlIG9yZGVyZWQKLSAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGxlc3MgIHRoYW4gdGhlIAotICAgICAqICBzZWNvbmQgZWxlbWVudDsgdGhlIHZhbHVlIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzCi0gICAgICogIGVxdWFsIHRvIHRoZSBzZWNvbmQgZWxlbWVudDsgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdAotICAgICAqICBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVDbGFzcyhPYmplY3QgZWxlbWVudDEsIE9iamVjdCBlbGVtZW50MikgewotICAgICAgICByZXR1cm4gY2xhc3NDb21wYXJpc29uKGVsZW1lbnQxKSAtIGNsYXNzQ29tcGFyaXNvbihlbGVtZW50Mik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG51bWJlciByZWZsZWN0aW5nIHRoZSBjb2xsYXRpb24gb3JkZXIgb2YgdGhlIGdpdmVuIHJlc291cmNlcwotICAgICAqIGJhc2VkIG9uIHRoZWlyIHJlc291cmNlIG5hbWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlMSB0aGUgZmlyc3QgcmVzb3VyY2UgZWxlbWVudCB0byBiZSBvcmRlcmVkCi0gICAgICogQHBhcmFtIHJlc291cmNlMiB0aGUgc2Vjb25kIHJlc291cmNlIGVsZW1lbnQgdG8gYmUgb3JkZXJlZAotICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgbGVzcyAgdGhhbiB0aGUgCi0gICAgICogIHNlY29uZCBlbGVtZW50OyB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMKLSAgICAgKiAgZXF1YWwgdG8gdGhlIHNlY29uZCBlbGVtZW50OyBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0Ci0gICAgICogIGVsZW1lbnQgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQgZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZU5hbWVzKElSZXNvdXJjZSByZXNvdXJjZTEsIElSZXNvdXJjZSByZXNvdXJjZTIpIHsKLSAgICAgICAgcmV0dXJuIGNvbGxhdG9yIC5jb21wYXJlKHJlc291cmNlMS5nZXROYW1lKCksIHJlc291cmNlMi5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBudW1iZXIgcmVmbGVjdGluZyB0aGUgY29sbGF0aW9uIG9yZGVyIG9mIHRoZSBnaXZlbiByZXNvdXJjZXMKLSAgICAgKiBiYXNlZCBvbiB0aGVpciByZXNwZWN0aXZlIGZpbGUgZXh0ZW5zaW9ucy4gUmVzb3VyY2VzIHdpdGggdGhlIHNhbWUgZmlsZQotICAgICAqIGV4dGVuc2lvbiB3aWxsIGJlIGNvbGxhdGVkIGJhc2VkIG9uIHRoZWlyIG5hbWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlMSB0aGUgZmlyc3QgcmVzb3VyY2UgZWxlbWVudCB0byBiZSBvcmRlcmVkCi0gICAgICogQHBhcmFtIHJlc291cmNlMiB0aGUgc2Vjb25kIHJlc291cmNlIGVsZW1lbnQgdG8gYmUgb3JkZXJlZAotICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgbGVzcyAgdGhhbiB0aGUgCi0gICAgICogIHNlY29uZCBlbGVtZW50OyB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMKLSAgICAgKiAgZXF1YWwgdG8gdGhlIHNlY29uZCBlbGVtZW50OyBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0Ci0gICAgICogIGVsZW1lbnQgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQgZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZVR5cGVzKElSZXNvdXJjZSByZXNvdXJjZTEsIElSZXNvdXJjZSByZXNvdXJjZTIpIHsKLSAgICAgICAgU3RyaW5nIGV4dDEgPSBnZXRFeHRlbnNpb25Gb3IocmVzb3VyY2UxKTsKLSAgICAgICAgU3RyaW5nIGV4dDIgPSBnZXRFeHRlbnNpb25Gb3IocmVzb3VyY2UyKTsKLQotICAgICAgICAvLyBDb21wYXJlIGV4dGVuc2lvbnMuICBJZiB0aGV5J3JlIGRpZmZlcmVudCB0aGVuIHJldHVybiBhIHZhbHVlIHRoYXQKLSAgICAgICAgLy8gaW5kaWNhdGVzIGNvcnJlY3QgZXh0ZW5zaW9uIG9yZGVyaW5nLiAgSWYgdGhleSdyZSB0aGUgc2FtZSB0aGVuCi0gICAgICAgIC8vIHJldHVybiBhIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb3JyZWN0IE5BTUUgb3JkZXJpbmcuCi0gICAgICAgIGludCByZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKGV4dDEsIGV4dDIpOwotCi0gICAgICAgIGlmIChyZXN1bHQgIT0gMCkgLy8gaWUuLSBkaWZmZXJlbnQgZXh0ZW5zaW9ucwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgICAgICByZXR1cm4gY29tcGFyZU5hbWVzKHJlc291cmNlMSwgcmVzb3VyY2UyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzb3J0IGNyaXRlcmlhIG9mIHRoaXMgc29ydGVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc29ydCBjcml0ZXJpb246IG9uZSBvZiA8Y29kZT5OQU1FPC9jb2RlPiBvciA8Y29kZT5UWVBFPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q3JpdGVyaWEoKSB7Ci0gICAgICAgIHJldHVybiBjcml0ZXJpYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBleHRlbnNpb24gcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlCi0gICAgICogQHJldHVybiB0aGUgZmlsZSBleHRlbnNpb24sIHBvc3NpYmlseSB0aGUgZW1wdHkgc3RyaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZW5zaW9uRm9yKElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICBTdHJpbmcgZXh0ID0gcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgICAgICByZXR1cm4gZXh0ID09IG51bGwgPyAiIiA6IGV4dDsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNvcnQgY3JpdGVyaWEgb2YgdGhpcyBzb3J0ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNyaXRlcmlhIHRoZSBzb3J0IGNyaXRlcmlvbjogCi0gICAgICoJb25lIG9mIDxjb2RlPlJlc291cmNlU29ydGVyLk5BTUU8L2NvZGU+IG9yIAotICAgICAqCTxjb2RlPlJlc291cmNlU29ydGVyLlRZUEU8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q3JpdGVyaWEoaW50IGNyaXRlcmlhKSB7Ci0gICAgICAgIHRoaXMuY3JpdGVyaWEgPSBjcml0ZXJpYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvdGVzdC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMvdGVzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZDc0ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzL3Rlc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGVzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjAxMDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2Y5ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotbmF2aWdhdG9yLmphcgotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTkxZTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+IAotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+IAotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmVmNTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNUaHUgSnVuIDIzIDE0OjAwOjUxIEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MTFlZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI1RodSBKdWwgMjEgMTQ6MjE6NTYgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9dXNlcgotb3JnLmVjbGlwc2UuamR0LnVpLmphdmFkb2M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGdldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyY29tbWVudCIgbmFtZVw9ImdldHRlcmNvbW1lbnQiPi8qKlxuICogQHJldHVybiBSZXR1cm5zIHRoZSAke2JhcmVfZmllbGRfbmFtZX0uXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyY29tbWVudCIgbmFtZVw9InNldHRlcmNvbW1lbnQiPi8qKlxuICogQHBhcmFtICR7cGFyYW19IFRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yY29tbWVudCIgbmFtZVw9ImNvbnN0cnVjdG9yY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpbGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCI+LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIENvcHlyaWdodCAoYykgJHt5ZWFyfSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcbiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHBcOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuICpcbiAqIENvbnRyaWJ1dG9yc1w6XG4gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9ImZhbHNlIiBjb250ZXh0XD0idHlwZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgdHlwZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMudHlwZWNvbW1lbnQiIG5hbWVcPSJ0eXBlY29tbWVudCI+LyoqXG4gKiBAc2luY2UgMy4yXG4gKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWVsZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGZpZWxkcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWVsZGNvbW1lbnQiIG5hbWVcPSJmaWVsZGNvbW1lbnQiPi8qKlxuICogXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG5vbi1vdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJvdmVycmlkZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5vdmVycmlkZWNvbW1lbnQiIG5hbWVcPSJvdmVycmlkZWNvbW1lbnQiPi8qIChub24tSmF2YWRvYylcbiAqICR7c2VlX3RvX292ZXJyaWRkZW59XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im5ld3R5cGVfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubmV3dHlwZSIgbmFtZVw9Im5ld3R5cGUiPiR7ZmlsZWNvbW1lbnR9XG4ke3BhY2thZ2VfZGVjbGFyYXRpb259XG5cbiR7dHlwZWNvbW1lbnR9XG4ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgbWV0aG9kIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5Ij4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlODQ2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1R1ZSBOb3YgMTYgMTQ6MTI6MjkgRVNUIDIwMDQKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4YTU0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQbHVnaW4ubmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQbHVnaW4ucHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pZGUsb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcyIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmFjdGlvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmlkZSxvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzIiwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pZGUsb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcyIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmlkZSxvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzIiwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZmlsdGVyczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaWRlLG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYmMzOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1vdXRwdXQuLiA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNTNlZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy9jb21wb25lbnQiCi0gICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZWNsaXBzZS5vcmcvY29tcG9uZW50IC4uL2NvbXBvbmVudC54c2QgIgotICAgbmFtZT0iQ29tbW9uIE5hdmlnYXRvciI+Ci0gICAKLQk8cGx1Z2luCi0JCWlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IiIGZyYWdtZW50PSJmYWxzZSIgLz4JCi0JCQotCTxwbHVnaW4KLQkJaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciI+Ci0gCi0gICA8dHlwZSBuYW1lPSAiQ29tbW9uTmF2aWdhdG9yIiBzdWJjbGFzcz0idHJ1ZSIvPgotICAgPHR5cGUgbmFtZT0gIkNvbW1vblZpZXdlciIgc3ViY2xhc3M9InRydWUiLz4KLSAgIAotICAgPHR5cGUgbmFtZT0gIkNvbW1vbk5hdmlnYXRvck1hbmFnZXIiIHN1YmNsYXNzPSJmYWxzZSIvPiAgCi0gICA8dHlwZSBuYW1lPSAiUHJpb3JpdHkiIHN1YmNsYXNzPSJmYWxzZSIvPiAgICAKLSAgIDx0eXBlIG5hbWU9ICJJTmF2aWdhdG9yQWN0aW9uU2VydmljZSIgaW1wbGVtZW50cz0iZmFsc2UiLz4gICAgCi0gICA8dHlwZSBuYW1lPSAiSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIiBpbXBsZW1lbnRzPSJmYWxzZSIvPiAgICAKLSAgIAotICAgPCEtLSAgQ29udHJhY3RzIGZvciB0aGUgZnJhbWV3b3JrICAtLT4KLSAgIDx0eXBlIG5hbWU9ICJJQ29tbW9uQWN0aW9uUHJvdmlkZXIiIGltcGxlbWVudHM9InRydWUiLz4gICAgICAgIAotICAgPHR5cGUgbmFtZT0gIklDb21tb25Ecm9wQWN0aW9uRGVsZWdhdGUiIGltcGxlbWVudHM9InRydWUiLz4gICAgICAgIAotICAgPHR5cGUgbmFtZT0gIklDb21tb25MYWJlbFByb3ZpZGVyIiBpbXBsZW1lbnRzPSJ0cnVlIi8+ICAgICAgICAgCi0gICA8dHlwZSBuYW1lPSAiSUNvbW1vbk9wZW5MaXN0ZW5lciIgaW1wbGVtZW50cz0idHJ1ZSIvPiAgICAgICAgCi0gICA8dHlwZSBuYW1lPSAiSURlc2NyaXB0aW9uUHJvdmlkZXIiIGltcGxlbWVudHM9InRydWUiLz4gICAgICAgICAgICAKLSAgIDx0eXBlIG5hbWU9ICJJTGlua0hlbHBlciIgaW1wbGVtZW50cz0idHJ1ZSIvPiAgICAgICAgCi0gICA8dHlwZSBuYW1lPSAiSU1lbWVudG9Bd2FyZSIgaW1wbGVtZW50cz0idHJ1ZSIvPiAgICAgICAgCi0gICA8dHlwZSBuYW1lPSAiSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlciIgaW1wbGVtZW50cz0idHJ1ZSIvPiAgICAKLSAgIAotICAgPCEtLSAgQ29udHJhY3RzIGZvciB0aGUgY2xpZW50cyAtLT4KLSAgIDx0eXBlIG5hbWU9ICJJRXh0ZW5zaW9uU3RhdGVNb2RlbCIgaW1wbGVtZW50cz0iZmFsc2UiLz4gICAgCi0gICA8dHlwZSBuYW1lPSAiSUNvbW1vbk1lbnVDb25zdGFudHMiIGltcGxlbWVudHM9ImZhbHNlIi8+ICAKLSA8L3BhY2thZ2U+Ci0gCi0gPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvaWNvbnMvZnVsbC9jbGNsMTYvY29sbGFwc2VhbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvaWNvbnMvZnVsbC9jbGNsMTYvY29sbGFwc2VhbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmFlNTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL2ljb25zL2Z1bGwvY2xjbDE2L2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL2ljb25zL2Z1bGwvY2xjbDE2L2VsaXBzZXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvaWNvbnMvZnVsbC9jbGNsMTYvZWxpcHNlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDE1MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvaWNvbnMvZnVsbC9jbGNsMTYvZWxpcHNlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9pY29ucy9mdWxsL2NsY2wxNi9wYXVzZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9pY29ucy9mdWxsL2NsY2wxNi9wYXVzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDVmYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvaWNvbnMvZnVsbC9jbGNsMTYvcGF1c2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvaWNvbnMvZnVsbC9jbGNsMTYvc3luY2VkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL2ljb25zL2Z1bGwvY2xjbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjVmM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvaWNvbnMvZnVsbC9jbGNsMTYvc3luY2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODBhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9pY29ucy9mdWxsL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjOWU2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL2ljb25zL2Z1bGwvZWxjbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MDkzNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL2phdmFkb2MtaW1hZ2VzL2ZyYW1ld29yay1vdmVydmlldy5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9qYXZhZG9jLWltYWdlcy9mcmFtZXdvcmstb3ZlcnZpZXcuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTEyMmUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL2phdmFkb2MtaW1hZ2VzL2ZyYW1ld29yay1vdmVydmlldy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9qYXZhZG9jLWltYWdlcy9uYXZpZ2F0b3JfbG9naWNhbF9leHRlbnNpb24uanBnIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvamF2YWRvYy1pbWFnZXMvbmF2aWdhdG9yX2xvZ2ljYWxfZXh0ZW5zaW9uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmOWY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9qYXZhZG9jLWltYWdlcy9uYXZpZ2F0b3JfbG9naWNhbF9leHRlbnNpb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvamR0LXBhdGNoL29yZy5lY2xpcHNlLmpkdC51aV9wYXRjaC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9qZHQtcGF0Y2gvb3JnLmVjbGlwc2UuamR0LnVpX3BhdGNoLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdiNTVhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9qZHQtcGF0Y2gvb3JnLmVjbGlwc2UuamR0LnVpX3BhdGNoLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwNTkgKzAsMCBAQAotIyMjIEVjbGlwc2UgV29ya3NwYWNlIFBhdGNoIDEuMAotI1Agb3JnLmVjbGlwc2UuamR0LnVpCi1JbmRleDogdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3dvcmtpbmdzZXRzL0NvbmZpZ3VyZVdvcmtpbmdTZXRBY3Rpb24uamF2YQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUkNTIGZpbGU6IC9ob21lL2VjbGlwc2Uvb3JnLmVjbGlwc2UuamR0LnVpL3VpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS93b3JraW5nc2V0cy9Db25maWd1cmVXb3JraW5nU2V0QWN0aW9uLmphdmEsdgotcmV0cmlldmluZyByZXZpc2lvbiAxLjkKLWRpZmYgLXUgLXIxLjkgQ29uZmlndXJlV29ya2luZ1NldEFjdGlvbi5qYXZhCi0tLS0gdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3dvcmtpbmdzZXRzL0NvbmZpZ3VyZVdvcmtpbmdTZXRBY3Rpb24uamF2YQkxOCBOb3YgMjAwNSAxNDo0NTozNSAtMDAwMAkxLjkKLSsrKyB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvd29ya2luZ3NldHMvQ29uZmlndXJlV29ya2luZ1NldEFjdGlvbi5qYXZhCTggRGVjIDIwMDUgMjA6MTk6MzAgLTAwMDAKLUBAIC0xNCw2ICsxNCw4IEBACi0gaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0gaW1wb3J0IGphdmEudXRpbC5MaXN0OwotIAotK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLSsKLSBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLSBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotIAotQEAgLTIxLDEzICsyMywxOCBAQAotIGltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLSAKLSBwdWJsaWMgY2xhc3MgQ29uZmlndXJlV29ya2luZ1NldEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0tCi0tCXByaXZhdGUgZmluYWwgSVdvcmtiZW5jaFBhcnRTaXRlIGZTaXRlOwotKyAKLSAJcHJpdmF0ZSBXb3JraW5nU2V0TW9kZWwgZldvcmtpbmdTZXRNb2RlbDsKLSsJcHJpdmF0ZSBTaGVsbCBmU2hlbGw7IAotIAotIAlwdWJsaWMgQ29uZmlndXJlV29ya2luZ1NldEFjdGlvbihJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSkgewotIAkJc3VwZXIoV29ya2luZ1NldE1lc3NhZ2VzLkNvbmZpZ3VyZVdvcmtpbmdTZXRBY3Rpb25fbGFiZWwpOyAKLS0JCWZTaXRlPSBzaXRlOwotKwkJZlNoZWxsPSBzaXRlLmdldFNoZWxsKCk7Ci0rCX0KLSsJCi0rCXB1YmxpYyBDb25maWd1cmVXb3JraW5nU2V0QWN0aW9uKFNoZWxsIHNoZWxsKSB7Ci0rCQlzdXBlcihXb3JraW5nU2V0TWVzc2FnZXMuQ29uZmlndXJlV29ya2luZ1NldEFjdGlvbl9sYWJlbCk7IAotKwkJZlNoZWxsPSBzaGVsbDsKLSAJfQotIAkKLSAJcHVibGljIHZvaWQgc2V0V29ya2luZ1NldE1vZGVsKFdvcmtpbmdTZXRNb2RlbCBtb2RlbCkgewotQEAgLTM5LDkgKzQ2LDEwIEBACi0gCSAqLwotIAlwdWJsaWMgdm9pZCBydW4oKSB7Ci0gCQlMaXN0IHdvcmtpbmdTZXRzPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoZldvcmtpbmdTZXRNb2RlbC5nZXRBbGxXb3JraW5nU2V0cygpKSk7Ci0rCi0gCQlJV29ya2luZ1NldFtdIGFjdGl2ZVdvcmtpbmdTZXRzPSBmV29ya2luZ1NldE1vZGVsLmdldEFjdGl2ZVdvcmtpbmdTZXRzKCk7Ci0gCQlXb3JraW5nU2V0Q29uZmlndXJhdGlvbkRpYWxvZyBkaWFsb2c9IG5ldyBXb3JraW5nU2V0Q29uZmlndXJhdGlvbkRpYWxvZygKLS0JCQlmU2l0ZS5nZXRTaGVsbCgpLCAKLSsJCQlmU2hlbGwsIAotIAkJCShJV29ya2luZ1NldFtdKXdvcmtpbmdTZXRzLnRvQXJyYXkobmV3IElXb3JraW5nU2V0W3dvcmtpbmdTZXRzLnNpemUoKV0pLAotIAkJCWFjdGl2ZVdvcmtpbmdTZXRzKTsgCi0gCQlkaWFsb2cuc2V0U2VsZWN0aW9uKGFjdGl2ZVdvcmtpbmdTZXRzKTsKLUluZGV4OiB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvd29ya2luZ3NldHMvVmlld0FjdGlvbkdyb3VwLmphdmEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJDUyBmaWxlOiAvaG9tZS9lY2xpcHNlL29yZy5lY2xpcHNlLmpkdC51aS91aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvd29ya2luZ3NldHMvVmlld0FjdGlvbkdyb3VwLmphdmEsdgotcmV0cmlldmluZyByZXZpc2lvbiAxLjgKLWRpZmYgLXUgLXIxLjggVmlld0FjdGlvbkdyb3VwLmphdmEKLS0tLSB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvd29ya2luZ3NldHMvVmlld0FjdGlvbkdyb3VwLmphdmEJMTMgQXByIDIwMDUgMTc6MzU6MTEgLTAwMDAJMS44Ci0rKysgdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3dvcmtpbmdzZXRzL1ZpZXdBY3Rpb25Hcm91cC5qYXZhCTggRGVjIDIwMDUgMjA6MTk6MzAgLTAwMDAKLUBAIC00NSw3ICs0NSwxMiBAQAotIAotIAlwdWJsaWMgVmlld0FjdGlvbkdyb3VwKGludCBtb2RlLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciwgSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUpIHsKLSAJCWZDaGFuZ2VMaXN0ZW5lcj0gY2hhbmdlTGlzdGVuZXI7Ci0tCQlmRmlsdGVyQWN0aW9uR3JvdXA9IG5ldyBXb3JraW5nU2V0RmlsdGVyQWN0aW9uR3JvdXAoc2l0ZSwgY2hhbmdlTGlzdGVuZXIpOwotKwkJaWYoZkNoYW5nZUxpc3RlbmVyID09IG51bGwpIHsKLSsJCQlmQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0rCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHt9Ci0rCQkJfTsKLSsJCX0KLSsJCWZGaWx0ZXJBY3Rpb25Hcm91cD0gbmV3IFdvcmtpbmdTZXRGaWx0ZXJBY3Rpb25Hcm91cChzaXRlLCBmQ2hhbmdlTGlzdGVuZXIpOwotIAkJZlNob3dBY3Rpb25Hcm91cD0gbmV3IFdvcmtpbmdTZXRTaG93QWN0aW9uR3JvdXAoc2l0ZSk7Ci0gCQlmTW9kZT0gbW9kZTsKLSAJCWlmIChzaG93V29ya2luZ1NldHMoKSkKLUBAIC03MCwxNiArNzUsMjQgQEAKLSAJICovCi0gCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLSAJCXN1cGVyLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotLQkJZk1lbnVNYW5hZ2VyPSBhY3Rpb25CYXJzLmdldE1lbnVNYW5hZ2VyKCk7Ci0tCQlJTWVudU1hbmFnZXIgc2hvd01lbnU9IG5ldyBNZW51TWFuYWdlcihXb3JraW5nU2V0TWVzc2FnZXMuVmlld0FjdGlvbkdyb3VwX3Nob3dfbGFiZWwpOyAKLS0JCWZpbGxTaG93TWVudShzaG93TWVudSk7Ci0tCQlmTWVudU1hbmFnZXIuYWRkKHNob3dNZW51KTsKLS0JCWZNZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2luZ1NldEFjdGlvbkdyb3VwLkFDVElPTl9HUk9VUCkpOwotKwkJaWYoZk1lbnVNYW5hZ2VyID09IG51bGwpIHsKLSsJCQlmTWVudU1hbmFnZXI9IGFjdGlvbkJhcnMuZ2V0TWVudU1hbmFnZXIoKTsKLSsJCQlmaWxsVmlld01lbnUoZk1lbnVNYW5hZ2VyKTsKLSsJCX0KLSsKLSAJCWlmIChmQWN0aXZlQWN0aW9uR3JvdXAgPT0gbnVsbCkKLSAJCQlmQWN0aXZlQWN0aW9uR3JvdXA9IGZGaWx0ZXJBY3Rpb25Hcm91cDsKLSAJCSgoQWN0aW9uR3JvdXApZkFjdGl2ZUFjdGlvbkdyb3VwKS5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLSAJfQotIAkKLSsJcHJpdmF0ZSB2b2lkIGZpbGxWaWV3TWVudShJTWVudU1hbmFnZXIgbWVudSkgeyAKLSsJCQotKwkJSU1lbnVNYW5hZ2VyIHNob3dNZW51PSBuZXcgTWVudU1hbmFnZXIoV29ya2luZ1NldE1lc3NhZ2VzLlZpZXdBY3Rpb25Hcm91cF9zaG93X2xhYmVsKTsgCi0rCQlmaWxsU2hvd01lbnUoc2hvd01lbnUpOwotKwkJbWVudS5hZGQoc2hvd01lbnUpOwotKwkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2luZ1NldEFjdGlvbkdyb3VwLkFDVElPTl9HUk9VUCkpOwotKwl9Ci0rCQotIAlwcml2YXRlIHZvaWQgZmlsbFNob3dNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0gCQlWaWV3QWN0aW9uIHByb2plY3RzPSBuZXcgVmlld0FjdGlvbih0aGlzLCBTSE9XX1BST0pFQ1RTKTsKLSAJCXByb2plY3RzLnNldFRleHQoV29ya2luZ1NldE1lc3NhZ2VzLlZpZXdBY3Rpb25Hcm91cF9wcm9qZWN0c19sYWJlbCk7IAotQEAgLTExNiw3ICsxMjksOCBAQAotIAkJfQotIAkJZkFjdGl2ZUFjdGlvbkdyb3VwLmZpbGxWaWV3TWVudShmTWVudU1hbmFnZXIpOwotIAkJZk1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsKLS0JCWZDaGFuZ2VMaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0rCQlpZihmQ2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkKLSsJCQlmQ2hhbmdlTGlzdGVuZXIucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotIAl9Ci0gCQotIAlwdWJsaWMgV29ya2luZ1NldEZpbHRlckFjdGlvbkdyb3VwIGdldEZpbHRlckdyb3VwKCkgewotSW5kZXg6IHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS93b3JraW5nc2V0cy9Xb3JraW5nU2V0TW9kZWwuamF2YQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUkNTIGZpbGU6IC9ob21lL2VjbGlwc2Uvb3JnLmVjbGlwc2UuamR0LnVpL3VpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS93b3JraW5nc2V0cy9Xb3JraW5nU2V0TW9kZWwuamF2YSx2Ci1yZXRyaWV2aW5nIHJldmlzaW9uIDEuMTMKLWRpZmYgLXUgLXIxLjEzIFdvcmtpbmdTZXRNb2RlbC5qYXZhCi0tLS0gdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3dvcmtpbmdzZXRzL1dvcmtpbmdTZXRNb2RlbC5qYXZhCTI4IE9jdCAyMDA1IDIwOjU5OjA2IC0wMDAwCTEuMTMKLSsrKyB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvd29ya2luZ3NldHMvV29ya2luZ1NldE1vZGVsLmphdmEJOCBEZWMgMjAwNSAyMDoxOTozMCAtMDAwMAotQEAgLTEsMTMgKzEsMTEgQEAKLS0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0tICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0rLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSsgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS0gKgotLSAqIENvbnRyaWJ1dG9yczoKLS0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0rICogCi0rICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud29ya2luZ3NldHM7Ci0gCi0gaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1AQCAtMzYsMTIgKzM0LDEyIEBACi0gaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0gCi0gcHVibGljIGNsYXNzIFdvcmtpbmdTZXRNb2RlbCB7Ci0tCQotKwotIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfV09SS0lOR19TRVRfTU9ERUxfQ09OVEVOVD0gIndvcmtpbmdTZXRNb2RlbENoYW5nZWQiOyAvLyROT04tTkxTLTEkCi0tCQotKwotIAlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50Q29tcGFyZXIgQ09NUEFSRVI9IG5ldyBXb3JraW5nU2V0Q29tcGFyYXIoKTsKLS0JCi0tCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTE9DQUxfV09SS0lOR19TRVRfTUFOQUdFUj0gImxvY2FsV29ya2luZ1NldE1hbmFnZXIiOyAvLyROT04tTkxTLTEkCi0rCi0rCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19MT0NBTF9XT1JLSU5HX1NFVF9NQU5BR0VSPSAibG9jYWxXb3JraW5nU2V0TWFuYWdlciI7IC8vJE5PTi1OTFMtMSQKLSAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ1RJVkVfV09SS0lOR19TRVQ9ICJhY3RpdmVXb3JraW5nU2V0IjsgLy8kTk9OLU5MUy0xJAotIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1dPUktJTkdfU0VUX05BTUU9ICJ3b3JraW5nU2V0TmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT05GSUdVUkVEPSAiY29uZmlndXJlZCI7IC8vJE5PTi1OTFMtMSQKLUBAIC01MywyOCArNTEsMjkgQEAKLSAJcHJpdmF0ZSBPdGhlcnNXb3JraW5nU2V0VXBkYXRlciBmT3RoZXJzV29ya2luZ1NldFVwZGF0ZXI7Ci0gCi0gCXByaXZhdGUgRWxlbWVudE1hcHBlciBmRWxlbWVudE1hcHBlcj0gbmV3IEVsZW1lbnRNYXBwZXIoKTsKLS0JCi0rCi0gCXByaXZhdGUgYm9vbGVhbiBmQ29uZmlndXJlZDsKLSAKLSAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV29ya2luZ1NldENvbXBhcmFyIGltcGxlbWVudHMgSUVsZW1lbnRDb21wYXJlciB7Ci0gCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLS0JCQlJV29ya2luZ1NldCB3MT0gbzEgaW5zdGFuY2VvZiBJV29ya2luZ1NldCA/IChJV29ya2luZ1NldClvMSA6IG51bGw7Ci0tCQkJSVdvcmtpbmdTZXQgdzI9IG8yIGluc3RhbmNlb2YgSVdvcmtpbmdTZXQgPyAoSVdvcmtpbmdTZXQpbzIgOiBudWxsOwotKwkJCUlXb3JraW5nU2V0IHcxPSBvMSBpbnN0YW5jZW9mIElXb3JraW5nU2V0ID8gKElXb3JraW5nU2V0KSBvMSA6IG51bGw7Ci0rCQkJSVdvcmtpbmdTZXQgdzI9IG8yIGluc3RhbmNlb2YgSVdvcmtpbmdTZXQgPyAoSVdvcmtpbmdTZXQpIG8yIDogbnVsbDsKLSAJCQlpZiAodzEgPT0gbnVsbCB8fCB3MiA9PSBudWxsKQotIAkJCQlyZXR1cm4gbzEuZXF1YWxzKG8yKTsKLSAJCQlyZXR1cm4gdzEgPT0gdzI7Ci0gCQl9Ci0rCi0gCQlwdWJsaWMgaW50IGhhc2hDb2RlKE9iamVjdCBlbGVtZW50KSB7Ci0gCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya2luZ1NldCkKLSAJCQkJcmV0dXJuIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGVsZW1lbnQpOwotIAkJCXJldHVybiBlbGVtZW50Lmhhc2hDb2RlKCk7Ci0gCQl9Ci0gCX0KLS0JCi0rCi0gCXByaXZhdGUgc3RhdGljIGNsYXNzIEVsZW1lbnRNYXBwZXIgewotIAkJcHJpdmF0ZSBNYXAgZkVsZW1lbnRUb1dvcmtpbmdTZXQ9IG5ldyBIYXNoTWFwKCk7Ci0gCQlwcml2YXRlIE1hcCBmV29ya2luZ1NldFRvRWxlbWVudD0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwotLQkJCi0rCi0gCQlwcml2YXRlIE1hcCBmUmVzb3VyY2VUb1dvcmtpbmdTZXQ9IG5ldyBIYXNoTWFwKCk7Ci0gCi0gCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLUBAIC04MiwxNCArODEsMTYgQEAKLSAJCQlmV29ya2luZ1NldFRvRWxlbWVudC5jbGVhcigpOwotIAkJCWZSZXNvdXJjZVRvV29ya2luZ1NldC5jbGVhcigpOwotIAkJfQotKwotIAkJcHVibGljIHZvaWQgcmVidWlsZChJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzKSB7Ci0gCQkJY2xlYXIoKTsKLSAJCQlmb3IgKGludCBpPSAwOyBpIDwgd29ya2luZ1NldHMubGVuZ3RoOyBpKyspIHsKLSAJCQkJcHV0KHdvcmtpbmdTZXRzW2ldKTsKLSAJCQl9Ci0gCQl9Ci0rCi0gCQlwdWJsaWMgSUFkYXB0YWJsZVtdIHJlbW92ZShJV29ya2luZ1NldCB3cykgewotLQkJCUlBZGFwdGFibGVbXSBlbGVtZW50cz0gKElBZGFwdGFibGVbXSlmV29ya2luZ1NldFRvRWxlbWVudC5yZW1vdmUod3MpOwotKwkJCUlBZGFwdGFibGVbXSBlbGVtZW50cz0gKElBZGFwdGFibGVbXSkgZldvcmtpbmdTZXRUb0VsZW1lbnQucmVtb3ZlKHdzKTsKLSAJCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotIAkJCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAJCQkJCXJlbW92ZUVsZW1lbnQoZWxlbWVudHNbaV0sIHdzKTsKLUBAIC05Nyw4ICs5OCw5IEBACi0gCQkJfQotIAkJCXJldHVybiBlbGVtZW50czsKLSAJCX0KLSsKLSAJCXB1YmxpYyBJQWRhcHRhYmxlW10gcmVmcmVzaChJV29ya2luZ1NldCB3cykgewotLQkJCUlBZGFwdGFibGVbXSBvbGRFbGVtZW50cz0gKElBZGFwdGFibGVbXSlmV29ya2luZ1NldFRvRWxlbWVudC5nZXQod3MpOwotKwkJCUlBZGFwdGFibGVbXSBvbGRFbGVtZW50cz0gKElBZGFwdGFibGVbXSkgZldvcmtpbmdTZXRUb0VsZW1lbnQuZ2V0KHdzKTsKLSAJCQlpZiAob2xkRWxlbWVudHMgPT0gbnVsbCkKLSAJCQkJcmV0dXJuIG51bGw7Ci0gCQkJSUFkYXB0YWJsZVtdIG5ld0VsZW1lbnRzPSB3cy5nZXRFbGVtZW50cygpOwotQEAgLTEwNiwxNSArMTA4LDE2IEBACi0gCQkJTGlzdCB0b0FkZD0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KG5ld0VsZW1lbnRzKSk7Ci0gCQkJY29tcHV0ZURlbHRhKHRvUmVtb3ZlLCB0b0FkZCwgb2xkRWxlbWVudHMsIG5ld0VsZW1lbnRzKTsKLSAJCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IHRvQWRkLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLQkJCQlhZGRFbGVtZW50KChJQWRhcHRhYmxlKWl0ZXIubmV4dCgpLCB3cyk7Ci0rCQkJCWFkZEVsZW1lbnQoKElBZGFwdGFibGUpIGl0ZXIubmV4dCgpLCB3cyk7Ci0gCQkJfQotIAkJCWZvciAoSXRlcmF0b3IgaXRlcj0gdG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0tCQkJCXJlbW92ZUVsZW1lbnQoKElBZGFwdGFibGUpaXRlci5uZXh0KCksIHdzKTsKLSsJCQkJcmVtb3ZlRWxlbWVudCgoSUFkYXB0YWJsZSkgaXRlci5uZXh0KCksIHdzKTsKLSAJCQl9Ci0gCQkJaWYgKHRvUmVtb3ZlLnNpemUoKSA+IDAgfHwgdG9BZGQuc2l6ZSgpID4gMCkKLSAJCQkJZldvcmtpbmdTZXRUb0VsZW1lbnQucHV0KHdzLCBuZXdFbGVtZW50cyk7Ci0gCQkJcmV0dXJuIG9sZEVsZW1lbnRzOwotIAkJfQotKwotIAkJcHJpdmF0ZSB2b2lkIGNvbXB1dGVEZWx0YShMaXN0IHRvUmVtb3ZlLCBMaXN0IHRvQWRkLCBJQWRhcHRhYmxlW10gb2xkRWxlbWVudHMsIElBZGFwdGFibGVbXSBuZXdFbGVtZW50cykgewotIAkJCWZvciAoaW50IGk9IDA7IGkgPCBvbGRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotIAkJCQl0b0FkZC5yZW1vdmUob2xkRWxlbWVudHNbaV0pOwotQEAgLTEyMiwyMCArMTI1LDI1IEBACi0gCQkJZm9yIChpbnQgaT0gMDsgaSA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gCQkJCXRvUmVtb3ZlLnJlbW92ZShuZXdFbGVtZW50c1tpXSk7Ci0gCQkJfQotLQkJCQotKwotIAkJfQotKwotIAkJcHVibGljIElXb3JraW5nU2V0IGdldEZpcnN0V29ya2luZ1NldChPYmplY3QgZWxlbWVudCkgewotLQkJCXJldHVybiAoSVdvcmtpbmdTZXQpZ2V0Rmlyc3RFbGVtZW50KGZFbGVtZW50VG9Xb3JraW5nU2V0LCBlbGVtZW50KTsKLSsJCQlyZXR1cm4gKElXb3JraW5nU2V0KSBnZXRGaXJzdEVsZW1lbnQoZkVsZW1lbnRUb1dvcmtpbmdTZXQsIGVsZW1lbnQpOwotIAkJfQotKwotIAkJcHVibGljIExpc3QgZ2V0QWxsV29ya2luZ1NldHMoT2JqZWN0IGVsZW1lbnQpIHsKLSAJCQlyZXR1cm4gZ2V0QWxsRWxlbWVudHMoZkVsZW1lbnRUb1dvcmtpbmdTZXQsIGVsZW1lbnQpOwotIAkJfQotKwotIAkJcHVibGljIElXb3JraW5nU2V0IGdldEZpcnN0V29ya2luZ1NldEZvclJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgewotLQkJCXJldHVybiAoSVdvcmtpbmdTZXQpZ2V0Rmlyc3RFbGVtZW50KGZSZXNvdXJjZVRvV29ya2luZ1NldCwgcmVzb3VyY2UpOwotKwkJCXJldHVybiAoSVdvcmtpbmdTZXQpIGdldEZpcnN0RWxlbWVudChmUmVzb3VyY2VUb1dvcmtpbmdTZXQsIHJlc291cmNlKTsKLSAJCX0KLSsKLSAJCXB1YmxpYyBMaXN0IGdldEFsbFdvcmtpbmdTZXRzRm9yUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB7Ci0gCQkJcmV0dXJuIGdldEFsbEVsZW1lbnRzKGZSZXNvdXJjZVRvV29ya2luZ1NldCwgcmVzb3VyY2UpOwotIAkJfQotKwotIAkJcHJpdmF0ZSB2b2lkIHB1dChJV29ya2luZ1NldCB3cykgewotIAkJCWlmIChmV29ya2luZ1NldFRvRWxlbWVudC5jb250YWluc0tleSh3cykpCi0gCQkJCXJldHVybjsKLUBAIC0xNDUsMjAgKzE1MywyMyBAQAotIAkJCQlhZGRFbGVtZW50KGVsZW1lbnRzW2ldLCB3cyk7Ci0gCQkJfQotIAkJfQotKwotIAkJcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnQoSUFkYXB0YWJsZSBlbGVtZW50LCBJV29ya2luZ1NldCB3cykgewotIAkJCWFkZFRvTWFwKGZFbGVtZW50VG9Xb3JraW5nU2V0LCBlbGVtZW50LCB3cyk7Ci0tCQkJSVJlc291cmNlIHJlc291cmNlPSAoSVJlc291cmNlKWVsZW1lbnQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotKwkJCUlSZXNvdXJjZSByZXNvdXJjZT0gKElSZXNvdXJjZSkgZWxlbWVudC5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAJCQkJYWRkVG9NYXAoZlJlc291cmNlVG9Xb3JraW5nU2V0LCByZXNvdXJjZSwgd3MpOwotIAkJCX0KLSAJCX0KLSsKLSAJCXByaXZhdGUgdm9pZCByZW1vdmVFbGVtZW50KElBZGFwdGFibGUgZWxlbWVudCwgSVdvcmtpbmdTZXQgd3MpIHsKLSAJCQlyZW1vdmVGcm9tTWFwKGZFbGVtZW50VG9Xb3JraW5nU2V0LCBlbGVtZW50LCB3cyk7Ci0tCQkJSVJlc291cmNlIHJlc291cmNlPSAoSVJlc291cmNlKWVsZW1lbnQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotKwkJCUlSZXNvdXJjZSByZXNvdXJjZT0gKElSZXNvdXJjZSkgZWxlbWVudC5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAJCQkJcmVtb3ZlRnJvbU1hcChmUmVzb3VyY2VUb1dvcmtpbmdTZXQsIHJlc291cmNlLCB3cyk7Ci0gCQkJfQotIAkJfQotKwotIAkJcHJpdmF0ZSB2b2lkIGFkZFRvTWFwKE1hcCBtYXAsIElBZGFwdGFibGUga2V5LCBJV29ya2luZ1NldCB2YWx1ZSkgewotIAkJCU9iamVjdCBvYmo9IG1hcC5nZXQoa2V5KTsKLSAJCQlpZiAob2JqID09IG51bGwpIHsKLUBAIC0xNjksMjEgKzE4MCwyMiBAQAotIAkJCQlsLmFkZCh2YWx1ZSk7Ci0gCQkJCW1hcC5wdXQoa2V5LCBsKTsKLSAJCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExpc3QpIHsKLS0JCQkJKChMaXN0KW9iaikuYWRkKHZhbHVlKTsKLSsJCQkJKChMaXN0KSBvYmopLmFkZCh2YWx1ZSk7Ci0gCQkJfQotIAkJfQotKwotIAkJcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21NYXAoTWFwIG1hcCwgSUFkYXB0YWJsZSBrZXksIElXb3JraW5nU2V0IHZhbHVlKSB7Ci0gCQkJT2JqZWN0IGN1cnJlbnQ9IG1hcC5nZXQoa2V5KTsKLSAJCQlpZiAoY3VycmVudCA9PSBudWxsKSB7Ci0gCQkJCXJldHVybjsKLSAJCQl9IGVsc2UgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0tCQkJCUxpc3QgbGlzdD0gKExpc3QpY3VycmVudDsKLSsJCQkJTGlzdCBsaXN0PSAoTGlzdCkgY3VycmVudDsKLSAJCQkJbGlzdC5yZW1vdmUodmFsdWUpOwotIAkJCQlzd2l0Y2ggKGxpc3Quc2l6ZSgpKSB7Ci0tCQkJCQljYXNlIDA6Ci0rCQkJCQljYXNlIDAgOgotIAkJCQkJCW1hcC5yZW1vdmUoa2V5KTsKLSAJCQkJCQlicmVhazsKLS0JCQkJCWNhc2UgMToKLSsJCQkJCWNhc2UgMSA6Ci0gCQkJCQkJbWFwLnB1dChrZXksIGxpc3QuZ2V0KDApKTsKLSAJCQkJCQlicmVhazsKLSAJCQkJfQotQEAgLTE5MSwxNiArMjAzLDE4IEBACi0gCQkJCW1hcC5yZW1vdmUoa2V5KTsKLSAJCQl9Ci0gCQl9Ci0rCi0gCQlwcml2YXRlIE9iamVjdCBnZXRGaXJzdEVsZW1lbnQoTWFwIG1hcCwgT2JqZWN0IGtleSkgewotIAkJCU9iamVjdCBvYmo9IG1hcC5nZXQoa2V5KTsKLS0JCQlpZiAob2JqIGluc3RhbmNlb2YgTGlzdCkgCi0tCQkJCXJldHVybiAoKExpc3Qpb2JqKS5nZXQoMCk7Ci0rCQkJaWYgKG9iaiBpbnN0YW5jZW9mIExpc3QpCi0rCQkJCXJldHVybiAoKExpc3QpIG9iaikuZ2V0KDApOwotIAkJCXJldHVybiBvYmo7Ci0gCQl9Ci0rCi0gCQlwcml2YXRlIExpc3QgZ2V0QWxsRWxlbWVudHMoTWFwIG1hcCwgT2JqZWN0IGtleSkgewotIAkJCU9iamVjdCBvYmo9IG1hcC5nZXQoa2V5KTsKLSAJCQlpZiAob2JqIGluc3RhbmNlb2YgTGlzdCkKLS0JCQkJcmV0dXJuIChMaXN0KW9iajsKLSsJCQkJcmV0dXJuIChMaXN0KSBvYmo7Ci0gCQkJaWYgKG9iaiA9PSBudWxsKQotIAkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAJCQlMaXN0IHJlc3VsdD0gbmV3IEFycmF5TGlzdCgxKTsKLUBAIC0yMDgsMjcgKzIyMiwyNyBAQAotIAkJCXJldHVybiByZXN1bHQ7Ci0gCQl9Ci0gCX0KLS0JCi0rCi0gCXB1YmxpYyBXb3JraW5nU2V0TW9kZWwoKSB7Ci0gCQlmTG9jYWxXb3JraW5nU2V0TWFuYWdlcj0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5jcmVhdGVMb2NhbFdvcmtpbmdTZXRNYW5hZ2VyKCk7Ci0gCQlhZGRMaXN0ZW5lcnNUb1dvcmtpbmdTZXRNYW5hZ2VycygpOwotLSAgICAJZkFjdGl2ZVdvcmtpbmdTZXRzPSBuZXcgQXJyYXlMaXN0KDIpOwotLSAgICAJCi0tICAgIAlJV29ya2luZ1NldCBvdGhlcnM9IGZMb2NhbFdvcmtpbmdTZXRNYW5hZ2VyLmNyZWF0ZVdvcmtpbmdTZXQoV29ya2luZ1NldE1lc3NhZ2VzLldvcmtpbmdTZXRNb2RlbF9vdGhlcnNfbmFtZSwgbmV3IElBZGFwdGFibGVbMF0pOyAKLS0gICAgCW90aGVycy5zZXRJZChPdGhlcnNXb3JraW5nU2V0VXBkYXRlci5JRCk7Ci0tICAgIAlmTG9jYWxXb3JraW5nU2V0TWFuYWdlci5hZGRXb3JraW5nU2V0KG90aGVycyk7Ci0tICAgIAlmQWN0aXZlV29ya2luZ1NldHMuYWRkKG90aGVycyk7Ci0tICAgIAkKLS0gICAgCWZPdGhlcnNXb3JraW5nU2V0VXBkYXRlci5pbml0KHRoaXMpOwotLSAgICAJZkVsZW1lbnRNYXBwZXIucmVidWlsZChnZXRBY3RpdmVXb3JraW5nU2V0cygpKTsKLSsJCWZBY3RpdmVXb3JraW5nU2V0cz0gbmV3IEFycmF5TGlzdCgyKTsKLSsKLSsJCUlXb3JraW5nU2V0IG90aGVycz0gZkxvY2FsV29ya2luZ1NldE1hbmFnZXIuY3JlYXRlV29ya2luZ1NldChXb3JraW5nU2V0TWVzc2FnZXMuV29ya2luZ1NldE1vZGVsX290aGVyc19uYW1lLCBuZXcgSUFkYXB0YWJsZVswXSk7Ci0rCQlvdGhlcnMuc2V0SWQoT3RoZXJzV29ya2luZ1NldFVwZGF0ZXIuSUQpOwotKwkJZkxvY2FsV29ya2luZ1NldE1hbmFnZXIuYWRkV29ya2luZ1NldChvdGhlcnMpOwotKwkJZkFjdGl2ZVdvcmtpbmdTZXRzLmFkZChvdGhlcnMpOwotKwotKwkJZk90aGVyc1dvcmtpbmdTZXRVcGRhdGVyLmluaXQodGhpcyk7Ci0rCQlmRWxlbWVudE1hcHBlci5yZWJ1aWxkKGdldEFjdGl2ZVdvcmtpbmdTZXRzKCkpOwotIAl9Ci0tCQotKwotIAlwdWJsaWMgV29ya2luZ1NldE1vZGVsKElNZW1lbnRvIG1lbWVudG8pIHsKLSAJCXJlc3RvcmVTdGF0ZShtZW1lbnRvKTsKLSAJCWZPdGhlcnNXb3JraW5nU2V0VXBkYXRlci5pbml0KHRoaXMpOwotLSAgICAJZkVsZW1lbnRNYXBwZXIucmVidWlsZChnZXRBY3RpdmVXb3JraW5nU2V0cygpKTsKLSsJCWZFbGVtZW50TWFwcGVyLnJlYnVpbGQoZ2V0QWN0aXZlV29ya2luZ1NldHMoKSk7Ci0gCX0KLS0JCi0rCi0gCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnNUb1dvcmtpbmdTZXRNYW5hZ2VycygpIHsKLSAJCWZMaXN0ZW5lcnM9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLSAJCWZXb3JraW5nU2V0TWFuYWdlckxpc3RlbmVyPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci1AQCAtMjM5LDcgKzI1Myw3IEBACi0gCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmV29ya2luZ1NldE1hbmFnZXJMaXN0ZW5lcik7Ci0gCQlmTG9jYWxXb3JraW5nU2V0TWFuYWdlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZXb3JraW5nU2V0TWFuYWdlckxpc3RlbmVyKTsKLSAJfQotLQkKLSsKLSAJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAJCWlmIChmV29ya2luZ1NldE1hbmFnZXJMaXN0ZW5lciAhPSBudWxsKSB7Ci0gCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZldvcmtpbmdTZXRNYW5hZ2VyTGlzdGVuZXIpOwotQEAgLTI0OCwxMTggKzI2MiwxMTkgQEAKLSAJCQlmV29ya2luZ1NldE1hbmFnZXJMaXN0ZW5lcj0gbnVsbDsKLSAJCX0KLSAJfQotLQkKLS0JLy8tLS0tIG1vZGVsIHJlbGF0aW9uc2hpcHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tCQotKwotKwkvLyAtLS0tIG1vZGVsIHJlbGF0aW9uc2hpcHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0rCi0gICAgIHB1YmxpYyBJQWRhcHRhYmxlW10gZ2V0Q2hpbGRyZW4oSVdvcmtpbmdTZXQgd29ya2luZ1NldCkgewotLSAgICAJcmV0dXJuIHdvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKTsKLS0gICAgfQotLSAgICAKLS0gICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLS0gICAgCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdvcmtpbmdTZXQgJiYgZkFjdGl2ZVdvcmtpbmdTZXRzLmNvbnRhaW5zKGVsZW1lbnQpKQotLSAgICAJCXJldHVybiB0aGlzOwotLSAgICAJcmV0dXJuIGZFbGVtZW50TWFwcGVyLmdldEZpcnN0V29ya2luZ1NldChlbGVtZW50KTsKLS0gICAgfQotLSAgICAKLS0gICAgcHVibGljIE9iamVjdFtdIGdldEFsbFBhcmVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLS0gICAgCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdvcmtpbmdTZXQgJiYgZkFjdGl2ZVdvcmtpbmdTZXRzLmNvbnRhaW5zKGVsZW1lbnQpKQotLSAgICAJCXJldHVybiBuZXcgT2JqZWN0W10ge3RoaXN9OwotLSAgICAJcmV0dXJuIGZFbGVtZW50TWFwcGVyLmdldEFsbFdvcmtpbmdTZXRzKGVsZW1lbnQpLnRvQXJyYXkoKTsKLS0gICAgfQotLSAgICAKLS0gICAgcHVibGljIE9iamVjdFtdIGFkZFdvcmtpbmdTZXRzKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0tICAgIAlMaXN0IHJlc3VsdD0gbnVsbDsKLS0gICAgCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotLSAgICAJCU9iamVjdCBlbGVtZW50PSBlbGVtZW50c1tpXTsKLS0gICAgCQlMaXN0IHNldHM9IG51bGw7Ci0rCQlyZXR1cm4gd29ya2luZ1NldC5nZXRFbGVtZW50cygpOwotKwl9Ci0rCi0rCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0rCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXb3JraW5nU2V0ICYmIGZBY3RpdmVXb3JraW5nU2V0cy5jb250YWlucyhlbGVtZW50KSkKLSsJCQlyZXR1cm4gdGhpczsKLSsJCXJldHVybiBmRWxlbWVudE1hcHBlci5nZXRGaXJzdFdvcmtpbmdTZXQoZWxlbWVudCk7Ci0rCX0KLSsKLSsJcHVibGljIE9iamVjdFtdIGdldEFsbFBhcmVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLSsJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdvcmtpbmdTZXQgJiYgZkFjdGl2ZVdvcmtpbmdTZXRzLmNvbnRhaW5zKGVsZW1lbnQpKQotKwkJCXJldHVybiBuZXcgT2JqZWN0W117dGhpc307Ci0rCQlyZXR1cm4gZkVsZW1lbnRNYXBwZXIuZ2V0QWxsV29ya2luZ1NldHMoZWxlbWVudCkudG9BcnJheSgpOwotKwl9Ci0rCi0rCXB1YmxpYyBPYmplY3RbXSBhZGRXb3JraW5nU2V0cyhPYmplY3RbXSBlbGVtZW50cykgewotKwkJTGlzdCByZXN1bHQ9IG51bGw7Ci0rCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSsJCQlPYmplY3QgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0rCQkJTGlzdCBzZXRzPSBudWxsOwotIAkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0tICAgIAkJCXNldHM9IGZFbGVtZW50TWFwcGVyLmdldEFsbFdvcmtpbmdTZXRzRm9yUmVzb3VyY2UoKElSZXNvdXJjZSllbGVtZW50KTsKLS0gICAgCQl9IGVsc2UgewotLSAgICAJCQlzZXRzPSBmRWxlbWVudE1hcHBlci5nZXRBbGxXb3JraW5nU2V0cyhlbGVtZW50KTsKLS0gICAgCQl9Ci0rCQkJCXNldHM9IGZFbGVtZW50TWFwcGVyLmdldEFsbFdvcmtpbmdTZXRzRm9yUmVzb3VyY2UoKElSZXNvdXJjZSkgZWxlbWVudCk7Ci0rCQkJfSBlbHNlIHsKLSsJCQkJc2V0cz0gZkVsZW1lbnRNYXBwZXIuZ2V0QWxsV29ya2luZ1NldHMoZWxlbWVudCk7Ci0rCQkJfQotIAkJCWlmIChzZXRzICE9IG51bGwgJiYgc2V0cy5zaXplKCkgPiAwKSB7Ci0gCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLSAJCQkJCXJlc3VsdD0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGVsZW1lbnRzKSk7Ci0gCQkJCXJlc3VsdC5hZGRBbGwoc2V0cyk7Ci0gCQkJfQotIAkJfQotLSAgICAJaWYgKHJlc3VsdCA9PSBudWxsKQotLSAgICAJCXJldHVybiBlbGVtZW50czsKLS0gICAgCXJldHVybiByZXN1bHQudG9BcnJheSgpOwotLSAgICB9Ci0tICAgIAotLSAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc0NvbmZpZ3VyYXRpb24oKSB7Ci0tICAgIAlyZXR1cm4gIWZDb25maWd1cmVkICYmIGZBY3RpdmVXb3JraW5nU2V0cy5zaXplKCkgPT0gMSAmJgotLQkJCU90aGVyc1dvcmtpbmdTZXRVcGRhdGVyLklELmVxdWFscygoKElXb3JraW5nU2V0KWZBY3RpdmVXb3JraW5nU2V0cy5nZXQoMCkpLmdldElkKCkpOwotLSAgICB9Ci0tICAgIAotLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVkKCkgewotLSAgICAJZkNvbmZpZ3VyZWQ9IHRydWU7Ci0tICAgIH0KLS0gICAgCi0tICAgIC8vLS0tLSB3b3JraW5nIHNldCBtYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tICAgIAotKwkJaWYgKHJlc3VsdCA9PSBudWxsKQotKwkJCXJldHVybiBlbGVtZW50czsKLSsJCXJldHVybiByZXN1bHQudG9BcnJheSgpOwotKwl9Ci0rCi0rCXB1YmxpYyBib29sZWFuIG5lZWRzQ29uZmlndXJhdGlvbigpIHsKLSsJCXJldHVybiAhZkNvbmZpZ3VyZWQgJiYgZkFjdGl2ZVdvcmtpbmdTZXRzLnNpemUoKSA9PSAxICYmIE90aGVyc1dvcmtpbmdTZXRVcGRhdGVyLklELmVxdWFscygoKElXb3JraW5nU2V0KSBmQWN0aXZlV29ya2luZ1NldHMuZ2V0KDApKS5nZXRJZCgpKTsKLSsJfQotKwotKwlwdWJsaWMgdm9pZCBjb25maWd1cmVkKCkgewotKwkJZkNvbmZpZ3VyZWQ9IHRydWU7Ci0rCX0KLSsKLSsJLy8gLS0tLSB3b3JraW5nIHNldCBtYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0rCi0gCS8qKgotLSAgICAgKiBBZGRzIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyLgotLSAgICAgKiAKLS0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gYWRkCi0tICAgICAqLwotLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0tICAgIAlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0tICAgIH0KLS0gICAgCi0tICAgIC8qKgotLSAgICAgKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIuCi0tICAgICAqIAotLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byByZW1vdmUKLS0gICAgICovCi0tICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLS0gICAgCWZMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLS0gICAgfQotLSAgICAKLS0gICAgcHVibGljIElXb3JraW5nU2V0W10gZ2V0QWN0aXZlV29ya2luZ1NldHMoKSB7Ci0tICAgIAlyZXR1cm4gKElXb3JraW5nU2V0W10pZkFjdGl2ZVdvcmtpbmdTZXRzLnRvQXJyYXkobmV3IElXb3JraW5nU2V0W2ZBY3RpdmVXb3JraW5nU2V0cy5zaXplKCldKTsKLS0gICAgfQotLSAgICAKLS0gICAgcHVibGljIElXb3JraW5nU2V0W10gZ2V0QWxsV29ya2luZ1NldHMoKSB7Ci0tICAgIAlMaXN0IHJlc3VsdD0gbmV3IEFycmF5TGlzdCgpOwotLSAgICAJcmVzdWx0LmFkZEFsbChmQWN0aXZlV29ya2luZ1NldHMpOwotLSAgICAJSVdvcmtpbmdTZXRbXSBsb2NhbHM9IGZMb2NhbFdvcmtpbmdTZXRNYW5hZ2VyLmdldFdvcmtpbmdTZXRzKCk7Ci0tICAgIAlmb3IgKGludCBpPSAwOyBpIDwgbG9jYWxzLmxlbmd0aDsgaSsrKSB7Ci0rCSAqIEFkZHMgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIuCi0rCSAqIAotKwkgKiBAcGFyYW0gbGlzdGVuZXIKLSsJICogICAgICAgICAgICB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIGFkZAotKwkgKi8KLSsJcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotKwkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotKwl9Ci0rCi0rCS8qKgotKwkgKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIuCi0rCSAqIAotKwkgKiBAcGFyYW0gbGlzdGVuZXIKLSsJICogICAgICAgICAgICB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHJlbW92ZQotKwkgKi8KLSsJcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotKwkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotKwl9Ci0rCi0rCXB1YmxpYyBJV29ya2luZ1NldFtdIGdldEFjdGl2ZVdvcmtpbmdTZXRzKCkgewotKwkJcmV0dXJuIChJV29ya2luZ1NldFtdKSBmQWN0aXZlV29ya2luZ1NldHMudG9BcnJheShuZXcgSVdvcmtpbmdTZXRbZkFjdGl2ZVdvcmtpbmdTZXRzLnNpemUoKV0pOwotKwl9Ci0rCi0rCXB1YmxpYyBJV29ya2luZ1NldFtdIGdldEFsbFdvcmtpbmdTZXRzKCkgewotKwkJTGlzdCByZXN1bHQ9IG5ldyBBcnJheUxpc3QoKTsKLSsJCXJlc3VsdC5hZGRBbGwoZkFjdGl2ZVdvcmtpbmdTZXRzKTsKLSsJCUlXb3JraW5nU2V0W10gbG9jYWxzPSBmTG9jYWxXb3JraW5nU2V0TWFuYWdlci5nZXRXb3JraW5nU2V0cygpOwotKwkJZm9yIChpbnQgaT0gMDsgaSA8IGxvY2Fscy5sZW5ndGg7IGkrKykgewotIAkJCWlmICghcmVzdWx0LmNvbnRhaW5zKGxvY2Fsc1tpXSkpCi0gCQkJCXJlc3VsdC5hZGQobG9jYWxzW2ldKTsKLSAJCX0KLS0gICAgCUlXb3JraW5nU2V0W10gZ2xvYmFscz0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpLmdldFdvcmtpbmdTZXRzKCk7Ci0tICAgIAlmb3IgKGludCBpPSAwOyBpIDwgZ2xvYmFscy5sZW5ndGg7IGkrKykgewotKwkJSVdvcmtpbmdTZXRbXSBnbG9iYWxzPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCkuZ2V0V29ya2luZ1NldHMoKTsKLSsJCWZvciAoaW50IGk9IDA7IGkgPCBnbG9iYWxzLmxlbmd0aDsgaSsrKSB7Ci0gCQkJaWYgKCFyZXN1bHQuY29udGFpbnMoZ2xvYmFsc1tpXSkpCi0gCQkJCXJlc3VsdC5hZGQoZ2xvYmFsc1tpXSk7Ci0gCQl9Ci0tICAgIAlyZXR1cm4gKElXb3JraW5nU2V0W10pcmVzdWx0LnRvQXJyYXkobmV3IElXb3JraW5nU2V0W3Jlc3VsdC5zaXplKCldKTsKLS0gICAgfQotLSAgICAKLS0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlV29ya2luZ1NldHMoSVdvcmtpbmdTZXRbXSB3b3JraW5nU2V0cykgewotLSAgICAJZkFjdGl2ZVdvcmtpbmdTZXRzPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3Qod29ya2luZ1NldHMpKTsKLS0gICAgCWZFbGVtZW50TWFwcGVyLnJlYnVpbGQoZ2V0QWN0aXZlV29ya2luZ1NldHMoKSk7Ci0tICAgIAlmT3RoZXJzV29ya2luZ1NldFVwZGF0ZXIudXBkYXRlRWxlbWVudHMoKTsKLS0gICAgCWZpcmVFdmVudChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBDSEFOR0VfV09SS0lOR19TRVRfTU9ERUxfQ09OVEVOVCwgbnVsbCwgbnVsbCkpOwotLSAgICB9Ci0tCQotKwkJcmV0dXJuIChJV29ya2luZ1NldFtdKSByZXN1bHQudG9BcnJheShuZXcgSVdvcmtpbmdTZXRbcmVzdWx0LnNpemUoKV0pOwotKwl9Ci0rCi0rCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVdvcmtpbmdTZXRzKElXb3JraW5nU2V0W10gd29ya2luZ1NldHMpIHsKLSsJCWZBY3RpdmVXb3JraW5nU2V0cz0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHdvcmtpbmdTZXRzKSk7Ci0rCQlmRWxlbWVudE1hcHBlci5yZWJ1aWxkKGdldEFjdGl2ZVdvcmtpbmdTZXRzKCkpOwotKwkJZk90aGVyc1dvcmtpbmdTZXRVcGRhdGVyLnVwZGF0ZUVsZW1lbnRzKCk7Ci0rCQlmaXJlRXZlbnQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgQ0hBTkdFX1dPUktJTkdfU0VUX01PREVMX0NPTlRFTlQsIG51bGwsIG51bGwpKTsKLSsJfQotKwotIAlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotIAkJbWVtZW50by5wdXRTdHJpbmcoVEFHX0NPTkZJR1VSRUQsIEJvb2xlYW4udG9TdHJpbmcoZkNvbmZpZ3VyZWQpKTsKLSAJCWZMb2NhbFdvcmtpbmdTZXRNYW5hZ2VyLnNhdmVTdGF0ZShtZW1lbnRvLmNyZWF0ZUNoaWxkKFRBR19MT0NBTF9XT1JLSU5HX1NFVF9NQU5BR0VSKSk7Ci0gCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IGZBY3RpdmVXb3JraW5nU2V0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAJCQlJTWVtZW50byBhY3RpdmU9IG1lbWVudG8uY3JlYXRlQ2hpbGQoVEFHX0FDVElWRV9XT1JLSU5HX1NFVCk7Ci0tCQkJSVdvcmtpbmdTZXQgd29ya2luZ1NldD0gKElXb3JraW5nU2V0KWl0ZXIubmV4dCgpOwotKwkJCUlXb3JraW5nU2V0IHdvcmtpbmdTZXQ9IChJV29ya2luZ1NldCkgaXRlci5uZXh0KCk7Ci0gCQkJYWN0aXZlLnB1dFN0cmluZyhUQUdfV09SS0lOR19TRVRfTkFNRSwgd29ya2luZ1NldC5nZXROYW1lKCkpOwotIAkJfQotIAl9Ci0tCQotKwotIAlwcml2YXRlIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLSAJCVN0cmluZyBjb25maWd1cmVkPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfQ09ORklHVVJFRCk7Ci0gCQlpZiAoY29uZmlndXJlZCAhPSBudWxsKQotIAkJCWZDb25maWd1cmVkPSBCb29sZWFuLnZhbHVlT2YoY29uZmlndXJlZCkuYm9vbGVhblZhbHVlKCk7Ci0gCQlmTG9jYWxXb3JraW5nU2V0TWFuYWdlcj0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5jcmVhdGVMb2NhbFdvcmtpbmdTZXRNYW5hZ2VyKCk7Ci0tCQlhZGRMaXN0ZW5lcnNUb1dvcmtpbmdTZXRNYW5hZ2VycygpOwotKwkJYWRkTGlzdGVuZXJzVG9Xb3JraW5nU2V0TWFuYWdlcnMoKTsgCi0gCQlmTG9jYWxXb3JraW5nU2V0TWFuYWdlci5yZXN0b3JlU3RhdGUobWVtZW50by5nZXRDaGlsZChUQUdfTE9DQUxfV09SS0lOR19TRVRfTUFOQUdFUikpOwotIAkJSVdvcmtpbmdTZXQgaGlzdG9yeT0gZ2V0SGlzdG9yeVdvcmtpbmdTZXQoKTsKLSAJCWlmIChoaXN0b3J5ICE9IG51bGwpIHsKLUBAIC0zODAsNTQgKzM5NSw1NCBAQAotIAkJCX0KLSAJCX0KLSAJfQotLSAgICBwcml2YXRlIHZvaWQgd29ya2luZ1NldE1hbmFnZXJDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSsKLSsJcHJpdmF0ZSB2b2lkIHdvcmtpbmdTZXRNYW5hZ2VyQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gCQlTdHJpbmcgcHJvcGVydHk9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0tICAgIAlpZiAoSVdvcmtpbmdTZXRNYW5hZ2VyLkNIQU5HRV9XT1JLSU5HX1NFVF9VUERBVEVSX0lOU1RBTExFRC5lcXVhbHMocHJvcGVydHkpICYmIGV2ZW50LmdldFNvdXJjZSgpID09IGZMb2NhbFdvcmtpbmdTZXRNYW5hZ2VyKSB7Ci0tCQkJSVdvcmtpbmdTZXRVcGRhdGVyIHVwZGF0ZXI9IChJV29ya2luZ1NldFVwZGF0ZXIpZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLSsJCWlmIChJV29ya2luZ1NldE1hbmFnZXIuQ0hBTkdFX1dPUktJTkdfU0VUX1VQREFURVJfSU5TVEFMTEVELmVxdWFscyhwcm9wZXJ0eSkgJiYgZXZlbnQuZ2V0U291cmNlKCkgPT0gZkxvY2FsV29ya2luZ1NldE1hbmFnZXIpIHsKLSsJCQlJV29ya2luZ1NldFVwZGF0ZXIgdXBkYXRlcj0gKElXb3JraW5nU2V0VXBkYXRlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLSAJCQlpZiAodXBkYXRlciBpbnN0YW5jZW9mIE90aGVyc1dvcmtpbmdTZXRVcGRhdGVyKSB7Ci0tCQkJCWZPdGhlcnNXb3JraW5nU2V0VXBkYXRlcj0gKE90aGVyc1dvcmtpbmdTZXRVcGRhdGVyKXVwZGF0ZXI7Ci0rCQkJCWZPdGhlcnNXb3JraW5nU2V0VXBkYXRlcj0gKE90aGVyc1dvcmtpbmdTZXRVcGRhdGVyKSB1cGRhdGVyOwotIAkJCX0KLSAJCQlyZXR1cm47Ci0gCQl9Ci0tICAgIAkvLyBkb24ndCBoYW5kbGUgd29ya2luZyBzZXRzIG5vdCBtYW5hZ2VkIGJ5IHRoZSBtb2RlbAotLSAgICAJaWYgKCFpc0FmZmVjdGVkKGV2ZW50KSkKLS0gICAgCQlyZXR1cm47Ci0tICAgIAkKLSsJCS8vIGRvbid0IGhhbmRsZSB3b3JraW5nIHNldHMgbm90IG1hbmFnZWQgYnkgdGhlIG1vZGVsCi0rCQlpZiAoIWlzQWZmZWN0ZWQoZXZlbnQpKQotKwkJCXJldHVybjsKLSsKLSAJCWlmIChJV29ya2luZ1NldE1hbmFnZXIuQ0hBTkdFX1dPUktJTkdfU0VUX0NPTlRFTlRfQ0hBTkdFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLS0JCQlJV29ya2luZ1NldCB3b3JraW5nU2V0PSAoSVdvcmtpbmdTZXQpZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLSsJCQlJV29ya2luZ1NldCB3b3JraW5nU2V0PSAoSVdvcmtpbmdTZXQpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0gCQkJSUFkYXB0YWJsZVtdIGVsZW1lbnRzPSBmRWxlbWVudE1hcHBlci5yZWZyZXNoKHdvcmtpbmdTZXQpOwotIAkJCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0gCQkJCWZpcmVFdmVudChldmVudCk7Ci0gCQkJfQotIAkJfSBlbHNlIGlmIChJV29ya2luZ1NldE1hbmFnZXIuQ0hBTkdFX1dPUktJTkdfU0VUX1JFTU9WRS5lcXVhbHMocHJvcGVydHkpKSB7Ci0tCQkJSVdvcmtpbmdTZXQgd29ya2luZ1NldD0gKElXb3JraW5nU2V0KWV2ZW50LmdldE9sZFZhbHVlKCk7Ci0rCQkJSVdvcmtpbmdTZXQgd29ya2luZ1NldD0gKElXb3JraW5nU2V0KSBldmVudC5nZXRPbGRWYWx1ZSgpOwotIAkJCUxpc3QgZWxlbWVudHM9IG5ldyBBcnJheUxpc3QoZkFjdGl2ZVdvcmtpbmdTZXRzKTsKLSAJCQllbGVtZW50cy5yZW1vdmUod29ya2luZ1NldCk7Ci0tCQkJc2V0QWN0aXZlV29ya2luZ1NldHMoKElXb3JraW5nU2V0W10pZWxlbWVudHMudG9BcnJheShuZXcgSVdvcmtpbmdTZXRbZWxlbWVudHMuc2l6ZSgpXSkpOwotLSAgICAJfSBlbHNlIGlmIChJV29ya2luZ1NldE1hbmFnZXIuQ0hBTkdFX1dPUktJTkdfU0VUX05BTUVfQ0hBTkdFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLSsJCQlzZXRBY3RpdmVXb3JraW5nU2V0cygoSVdvcmtpbmdTZXRbXSkgZWxlbWVudHMudG9BcnJheShuZXcgSVdvcmtpbmdTZXRbZWxlbWVudHMuc2l6ZSgpXSkpOwotKwkJfSBlbHNlIGlmIChJV29ya2luZ1NldE1hbmFnZXIuQ0hBTkdFX1dPUktJTkdfU0VUX05BTUVfQ0hBTkdFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLSAJCQlmaXJlRXZlbnQoZXZlbnQpOwotIAkJfQotIAl9Ci0tICAgIAotLSAgICBwcml2YXRlIHZvaWQgZmlyZUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLS0gICAgCU9iamVjdFtdIGxpc3RlbmVycz0gZkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLS0gICAgCWZvciAoaW50IGk9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLS0JCQkoKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKWxpc3RlbmVyc1tpXSkucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotLQkJfQotLSAgICB9Ci0tICAgIAotLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBZmZlY3RlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0tICAgIAlpZiAoZkFjdGl2ZVdvcmtpbmdTZXRzID09IG51bGwpCi0tICAgIAkJcmV0dXJuIGZhbHNlOwotLSAgICAJT2JqZWN0IG9sZFZhbHVlPSBldmVudC5nZXRPbGRWYWx1ZSgpOwotLSAgICAJT2JqZWN0IG5ld1ZhbHVlPSBldmVudC5nZXROZXdWYWx1ZSgpOwotLSAgICAJaWYgKChvbGRWYWx1ZSAhPSBudWxsICYmIGZBY3RpdmVXb3JraW5nU2V0cy5jb250YWlucyhvbGRWYWx1ZSkpIAotLSAgICAJCXx8IChuZXdWYWx1ZSAhPSBudWxsICYmIGZBY3RpdmVXb3JraW5nU2V0cy5jb250YWlucyhuZXdWYWx1ZSkpKSB7Ci0tICAgIAkJcmV0dXJuIHRydWU7Ci0tICAgIAl9Ci0tICAgIAlyZXR1cm4gZmFsc2U7Ci0tICAgIH0KLS0JCi0rCi0rCXByaXZhdGUgdm9pZCBmaXJlRXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotKwkJT2JqZWN0W10gbGlzdGVuZXJzPSBmTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotKwkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotKwkJCSgoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotKwkJfQotKwl9Ci0rCi0rCXByaXZhdGUgYm9vbGVhbiBpc0FmZmVjdGVkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSsJCWlmIChmQWN0aXZlV29ya2luZ1NldHMgPT0gbnVsbCkKLSsJCQlyZXR1cm4gZmFsc2U7Ci0rCQlPYmplY3Qgb2xkVmFsdWU9IGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0rCQlPYmplY3QgbmV3VmFsdWU9IGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0rCQlpZiAoKG9sZFZhbHVlICE9IG51bGwgJiYgZkFjdGl2ZVdvcmtpbmdTZXRzLmNvbnRhaW5zKG9sZFZhbHVlKSkgfHwgKG5ld1ZhbHVlICE9IG51bGwgJiYgZkFjdGl2ZVdvcmtpbmdTZXRzLmNvbnRhaW5zKG5ld1ZhbHVlKSkpIHsKLSsJCQlyZXR1cm4gdHJ1ZTsKLSsJCX0KLSsJCXJldHVybiBmYWxzZTsKLSsJfQotKwotIAlwcml2YXRlIElXb3JraW5nU2V0IGdldEhpc3RvcnlXb3JraW5nU2V0KCkgewotIAkJSVdvcmtpbmdTZXRbXSB3b3JraW5nU2V0cz0gZkxvY2FsV29ya2luZ1NldE1hbmFnZXIuZ2V0V29ya2luZ1NldHMoKTsKLSAJCWZvciAoaW50IGk9IDA7IGkgPCB3b3JraW5nU2V0cy5sZW5ndGg7IGkrKykgewotSW5kZXg6IHVpL29yZy9lY2xpcHNlL2pkdC91aS9TdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyLmphdmEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJDUyBmaWxlOiAvaG9tZS9lY2xpcHNlL29yZy5lY2xpcHNlLmpkdC51aS91aS9vcmcvZWNsaXBzZS9qZHQvdWkvU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlci5qYXZhLHYKLXJldHJpZXZpbmcgcmV2aXNpb24gMS4yNwotZGlmZiAtdSAtcjEuMjcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlci5qYXZhCi0tLS0gdWkvb3JnL2VjbGlwc2UvamR0L3VpL1N0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIuamF2YQkxNyBKdW4gMjAwNSAxNTo1MTo1NiAtMDAwMAkxLjI3Ci0rKysgdWkvb3JnL2VjbGlwc2UvamR0L3VpL1N0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIuamF2YQk4IERlYyAyMDA1IDIwOjE5OjMwIC0wMDAwCi1AQCAtMTMsMTYgKzEzLDI4IEBACi0gaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0gaW1wb3J0IGphdmEudXRpbC5MaXN0OwotIAotK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLSsKLSBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0gaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci0gaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0taW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotIAotIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLSAKLS1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhcmVudDsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJlZmVyZW5jZTsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLSAgCi0gLyoqCi0gICogQSBiYXNlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIEphdmEgZWxlbWVudHMuIEl0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUKLUBAIC01MSwxMSArNjMsMTUgQEAKLSAgKiAKLSAgKiBAc2luY2UgMi4wCi0gICovCi0tcHVibGljIGNsYXNzIFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSVdvcmtpbmdDb3B5UHJvdmlkZXIgewotK3B1YmxpYyBjbGFzcyBTdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIsIElXb3JraW5nQ29weVByb3ZpZGVyIHsJCi0rCi0rCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfTUVNQkVSUz0gMTw8MTsKLSsJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19SRVNPVVJDRVM9IDE8PDI7Ci0gCi0gCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gTk9fQ0hJTERSRU49IG5ldyBPYmplY3RbMF07Ci0gCXByb3RlY3RlZCBib29sZWFuIGZQcm92aWRlTWVtYmVyczsKLSAJcHJvdGVjdGVkIGJvb2xlYW4gZlByb3ZpZGVXb3JraW5nQ29weTsKLSsJcHJvdGVjdGVkIGJvb2xlYW4gZkluY2x1ZGVSZXNvdXJjZXM7Ci0gCQotIAkvKioKLSAJICogQ3JlYXRlcyBhIG5ldyBjb250ZW50IHByb3ZpZGVyLiBUaGUgY29udGVudCBwcm92aWRlciBkb2VzIG5vdAotQEAgLTgxLDkgKzk3LDIyIEBACi0gCSAqIEBwYXJhbSBwcm92aWRlTWVtYmVycyBpZiA8Y29kZT50cnVlPC9jb2RlPiBtZW1iZXJzIGJlbG93IGNvbXBpbGF0aW9uIHVuaXRzIAotIAkgKiBhbmQgY2xhc3MgZmlsZXMgYXJlIHByb3ZpZGVkLiAKLSAJICovCi0tCXB1YmxpYyBTdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyKGJvb2xlYW4gcHJvdmlkZU1lbWJlcnMpIHsKLS0JCWZQcm92aWRlTWVtYmVycz0gcHJvdmlkZU1lbWJlcnM7Ci0tCQlmUHJvdmlkZVdvcmtpbmdDb3B5PSBwcm92aWRlTWVtYmVyczsKLSsJcHVibGljIFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIoYm9vbGVhbiBwcm92aWRlTWVtYmVycykgeyAKLSsJCXRoaXMoIChwcm92aWRlTWVtYmVycyA/IFNIT1dfTUVNQkVSUyA6IDApIHwgU0hPV19SRVNPVVJDRVMpOwotKwl9Ci0rCQotKwkKLSsJCi0rCS8qKgotKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXI8L2NvZGU+LgotKwkgKgotKwkgKiBAcGFyYW0gcHJvdmlkZU1lbWJlcnMgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gbWVtYmVycyBiZWxvdyBjb21waWxhdGlvbiB1bml0cyAKLSsJICogYW5kIGNsYXNzIGZpbGVzIGFyZSBwcm92aWRlZC4gCi0rCSAqLwotKwlwdWJsaWMgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcihpbnQgb3B0aW9ucykgewotKwkJZlByb3ZpZGVNZW1iZXJzPSAob3B0aW9ucyAmIFNIT1dfTUVNQkVSUykgIT0gMDsKLSsJCWZJbmNsdWRlUmVzb3VyY2VzID0gIChvcHRpb25zICYgU0hPV19SRVNPVVJDRVMpICE9IDA7Ci0rCQlmUHJvdmlkZVdvcmtpbmdDb3B5PSBmUHJvdmlkZU1lbWJlcnM7Ci0gCX0KLSAJCi0gCS8qKgotQEAgLTE1NSw3ICsxODQsNyBAQAotIAkvKiAobm9uLUphdmFkb2MpCi0gCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJVHJlZUNvbnRlbnRQcm92aWRlci4KLSAJICovCi0tCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotKwlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsgCi0gCQlpZiAoIWV4aXN0cyhlbGVtZW50KSkKLSAJCQlyZXR1cm4gTk9fQ0hJTERSRU47Ci0gCQkJCi1AQCAtMTcyLDggKzIwMSwxMCBAQAotIAkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgCi0gCQkJCXJldHVybiBnZXRQYWNrYWdlQ29udGVudHMoKElQYWNrYWdlRnJhZ21lbnQpZWxlbWVudCk7Ci0gCQkJCQotLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZvbGRlcikKLS0JCQkJcmV0dXJuIGdldFJlc291cmNlcygoSUZvbGRlcillbGVtZW50KTsKLSsJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLSsJCQkJcmV0dXJuIChmSW5jbHVkZVJlc291cmNlcykgPyAgZ2V0UmVzb3VyY2VzKChJRm9sZGVyKWVsZW1lbnQpIDogTk9fQ0hJTERSRU47Ci0rCQkJCQotKwkJCX0KLSAJCQkKLSAJCQlpZiAoZ2V0UHJvdmlkZU1lbWJlcnMoKSAmJiBlbGVtZW50IGluc3RhbmNlb2YgSVNvdXJjZVJlZmVyZW5jZSAmJiBlbGVtZW50IGluc3RhbmNlb2YgSVBhcmVudCkgewotIAkJCQlyZXR1cm4gKChJUGFyZW50KWVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci1AQCAtMjMzLDEyICsyNjQsMTUgQEAKLSAJCi0gCXByaXZhdGUgT2JqZWN0W10gZ2V0UGFja2FnZUZyYWdtZW50cyhJUGFja2FnZUZyYWdtZW50Um9vdCByb290KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAJCUlKYXZhRWxlbWVudFtdIGZyYWdtZW50cz0gcm9vdC5nZXRDaGlsZHJlbigpOwotLQkJT2JqZWN0W10gbm9uSmF2YVJlc291cmNlcz0gcm9vdC5nZXROb25KYXZhUmVzb3VyY2VzKCk7Ci0tCQlpZiAobm9uSmF2YVJlc291cmNlcyA9PSBudWxsKQotKwkJaWYoZkluY2x1ZGVSZXNvdXJjZXMpIHsKLSsJCQlPYmplY3RbXSBub25KYXZhUmVzb3VyY2VzPSByb290LmdldE5vbkphdmFSZXNvdXJjZXMoKTsKLSsJCQlpZiAobm9uSmF2YVJlc291cmNlcyA9PSBudWxsKQotKwkJCQlyZXR1cm4gZnJhZ21lbnRzOwotKwkJCXJldHVybiBjb25jYXRlbmF0ZShmcmFnbWVudHMsIG5vbkphdmFSZXNvdXJjZXMpOwotKwkJfSBlbHNlIAotIAkJCXJldHVybiBmcmFnbWVudHM7Ci0tCQlyZXR1cm4gY29uY2F0ZW5hdGUoZnJhZ21lbnRzLCBub25KYXZhUmVzb3VyY2VzKTsKLS0JfQotLQkKLSsJfQkKLSsKLSAJLyoqCi0gCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0gCSAqLwotQEAgLTI2MSw3ICsyOTUsNyBAQAotIAkJCQlsaXN0LmFkZChyb290KTsKLSAJCQl9IAotIAkJfQotLQkJcmV0dXJuIGNvbmNhdGVuYXRlKGxpc3QudG9BcnJheSgpLCBwcm9qZWN0LmdldE5vbkphdmFSZXNvdXJjZXMoKSk7Ci0rCQlyZXR1cm4gKGZJbmNsdWRlUmVzb3VyY2VzKSA/IGNvbmNhdGVuYXRlKGxpc3QudG9BcnJheSgpLCBwcm9qZWN0LmdldE5vbkphdmFSZXNvdXJjZXMoKSkgOiBsaXN0LnRvQXJyYXkoKTsKLSAJfQotIAotIAkvKioKLUluZGV4OiB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvcGFja2FnZXZpZXcvUGFja2FnZUV4cGxvcmVyQ29udGVudFByb3ZpZGVyLmphdmEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJDUyBmaWxlOiAvaG9tZS9lY2xpcHNlL29yZy5lY2xpcHNlLmpkdC51aS91aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvcGFja2FnZXZpZXcvUGFja2FnZUV4cGxvcmVyQ29udGVudFByb3ZpZGVyLmphdmEsdgotcmV0cmlldmluZyByZXZpc2lvbiAxLjQ5Ci1kaWZmIC11IC1yMS40OSBQYWNrYWdlRXhwbG9yZXJDb250ZW50UHJvdmlkZXIuamF2YQotLS0tIHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9QYWNrYWdlRXhwbG9yZXJDb250ZW50UHJvdmlkZXIuamF2YQkxMCBBdWcgMjAwNSAxMDo1MzozNyAtMDAwMAkxLjQ5Ci0rKysgdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L1BhY2thZ2VFeHBsb3JlckNvbnRlbnRQcm92aWRlci5qYXZhCTggRGVjIDIwMDUgMjA6MTk6MzAgLTAwMDAKLUBAIC04NCw3ICs4NCwyMiBAQAotIAkJc3VwZXIocHJvdmlkZU1lbWJlcnMpOwkKLSAJCWZQYXJ0PSBwYXJ0OwotIAl9Ci0rCi0gCQotKwkvKioKLSsJICogQ3JlYXRlcyBhIG5ldyBjb250ZW50IHByb3ZpZGVyIGZvciBKYXZhIGVsZW1lbnRzLgotKwkgKi8KLSsJcHVibGljIFBhY2thZ2VFeHBsb3JlckNvbnRlbnRQcm92aWRlcihib29sZWFuIHByb3ZpZGVNZW1iZXJzKSB7Ci0rCQlzdXBlcihwcm92aWRlTWVtYmVycyk7CSAKLSsJfQotKwkKLSsJLyoqCi0rCSAqIENyZWF0ZXMgYSBuZXcgY29udGVudCBwcm92aWRlciBmb3IgSmF2YSBlbGVtZW50cy4KLSsJICovCi0rCXB1YmxpYyBQYWNrYWdlRXhwbG9yZXJDb250ZW50UHJvdmlkZXIoaW50IG9wdGlvbnMpIHsKLSsJCXN1cGVyKG9wdGlvbnMpOwkgCi0rCX0KLSsJCQotIAkvKiBwYWNrYWdlICovIFBhY2thZ2VGcmFnbWVudFByb3ZpZGVyIGdldFBhY2thZ2VGcmFnbWVudFByb3ZpZGVyKCkgewotIAkJcmV0dXJuIGZQYWNrYWdlRnJhZ21lbnRQcm92aWRlcjsKLSAJfQotQEAgLTEzNiw4ICsxNTEsOSBAQAotIAkJaW50IHR5cGU9IC0xOwotIAkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpCi0gCQkJdHlwZT0gKChJSmF2YUVsZW1lbnQpZWxlbWVudCkuZ2V0RWxlbWVudFR5cGUoKTsKLS0JCXJldHVybiAoIWZJc0ZsYXRMYXlvdXQgJiYgKHR5cGUgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgfHwgdHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIHx8IHR5cGUgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkpOwotKwkJcmV0dXJuIChmSXNGbGF0TGF5b3V0ICYmICh0eXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIHx8IHR5cGUgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCB8fCB0eXBlID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpKTsKLSAJfQkJCi0rCQotIAotIAlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLSAJCU9iamVjdFtdIGNoaWxkcmVuPSBOT19DSElMRFJFTjsKLUBAIC0xNDgsMTIgKzE2NCwxNiBAQAotIAkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NQYXRoQ29udGFpbmVyKQotIAkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyUGFja2FnZUZyYWdtZW50Um9vdHMoKENsYXNzUGF0aENvbnRhaW5lcilwYXJlbnRFbGVtZW50KTsKLSAJCQkJCi0tCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgCi0tCQkJCXJldHVybiAoKElQcm9qZWN0KXBhcmVudEVsZW1lbnQpLm1lbWJlcnMoKTsKLSsJCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0rCQkJCWlmKGZJbmNsdWRlUmVzb3VyY2VzKSAKLSsJCQkJCXJldHVybiAoKElQcm9qZWN0KXBhcmVudEVsZW1lbnQpLm1lbWJlcnMoKTsKLSsJCQkJZWxzZQotKwkJCQkJcmV0dXJuIE5PX0NISUxEUkVOOwotKwkJCX0KLSAJCQkJCQotIAkJCWlmIChuZWVkc1RvRGVsZWdhdGVHZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KSkgewotLQkJCQlPYmplY3RbXSBwYWNrYWdlRnJhZ21lbnRzPSBmUGFja2FnZUZyYWdtZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0tCQkJCWNoaWxkcmVuPSBnZXRXaXRoUGFyZW50c1Jlc291cmNlcyhwYWNrYWdlRnJhZ21lbnRzLCBwYXJlbnRFbGVtZW50KTsKLSsJCQkJT2JqZWN0W10gcGFja2FnZUZyYWdtZW50cz0gZlBhY2thZ2VGcmFnbWVudFByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwkJCQotKwkJCQljaGlsZHJlbj0gZ2V0V2l0aFBhcmVudHNSZXNvdXJjZXMocGFja2FnZUZyYWdtZW50cywgcGFyZW50RWxlbWVudCk7IAotIAkJCX0gZWxzZSB7Ci0gCQkJCWNoaWxkcmVuPSBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLSAJCQl9Ci1AQCAtMTY5LDYgKzE4OSw3IEBACi0gCQkJcmV0dXJuIE5PX0NISUxEUkVOOwotIAkJfQotIAl9Ci0rIAotIAotIAlwcml2YXRlIE9iamVjdFtdIHJvb3RzQW5kQ29udGFpbmVycyhJSmF2YVByb2plY3QgcHJvamVjdCwgT2JqZWN0W10gcm9vdHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geyAKLSAJCUxpc3QgcmVzdWx0PSBuZXcgQXJyYXlMaXN0KHJvb3RzLmxlbmd0aCk7Ci1AQCAtMjQ2LDcgKzI2Nyw3IEBACi0gCQlpbnQgdHlwZT0gLTE7Ci0gCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkKLSAJCQl0eXBlPSAoKElKYXZhRWxlbWVudCllbGVtZW50KS5nZXRFbGVtZW50VHlwZSgpOwotLQkJcmV0dXJuICghZklzRmxhdExheW91dCAmJiB0eXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKTsKLSsJCXJldHVybiAoZklzRmxhdExheW91dCAmJiB0eXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKTsKLSAJfQkJCi0gCi0gCS8qKgotQEAgLTMwMyw3ICszMjQsNyBAQAotIAkJCQlyZXR1cm47CQotIAkJfQotIAkJCi0tCQlpZiAoIWZJc0ZsYXRMYXlvdXQgJiYgZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpIHsKLSsJCWlmIChmSXNGbGF0TGF5b3V0ICYmIGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7Ci0gCQkJZlBhY2thZ2VGcmFnbWVudFByb3ZpZGVyLnByb2Nlc3NEZWx0YShkZWx0YSk7Ci0gCQkJaWYgKHByb2Nlc3NSZXNvdXJjZURlbHRhcyhkZWx0YS5nZXRSZXNvdXJjZURlbHRhcygpLCBlbGVtZW50KSkKLSAJCQkgICAgcmV0dXJuOwotQEAgLTU2MCw2ICs1ODEsMTAgQEAKLSAJcHVibGljIHZvaWQgc2V0SXNGbGF0TGF5b3V0KGJvb2xlYW4gc3RhdGUpIHsKLSAJCWZJc0ZsYXRMYXlvdXQ9IHN0YXRlOwotIAl9Ci0rCQotKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc0ZsYXRMYXlvdXQoKSB7Ci0rCQlyZXR1cm4gZklzRmxhdExheW91dDsKLSsJfQotIAkvKioKLSAJICogUHJvY2VzcyByZXNvdXJjZSBkZWx0YXMuCi0gCSAqCi1JbmRleDogdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L1dvcmtpbmdTZXRBd2FyZUNvbnRlbnRQcm92aWRlci5qYXZhCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1SQ1MgZmlsZTogL2hvbWUvZWNsaXBzZS9vcmcuZWNsaXBzZS5qZHQudWkvdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L1dvcmtpbmdTZXRBd2FyZUNvbnRlbnRQcm92aWRlci5qYXZhLHYKLXJldHJpZXZpbmcgcmV2aXNpb24gMS4xMAotZGlmZiAtdSAtcjEuMTAgV29ya2luZ1NldEF3YXJlQ29udGVudFByb3ZpZGVyLmphdmEKLS0tLSB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvcGFja2FnZXZpZXcvV29ya2luZ1NldEF3YXJlQ29udGVudFByb3ZpZGVyLmphdmEJMjggT2N0IDIwMDUgMjA6NTk6MDYgLTAwMDAJMS4xMAotKysrIHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9Xb3JraW5nU2V0QXdhcmVDb250ZW50UHJvdmlkZXIuamF2YQk4IERlYyAyMDA1IDIwOjE5OjMwIC0wMDAwCi1AQCAtNTQsNiArNTQsMTcgQEAKLSAJCWZXb3JraW5nU2V0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmTGlzdGVuZXIpOwotIAl9Ci0gCQotKwlwdWJsaWMgV29ya2luZ1NldEF3YXJlQ29udGVudFByb3ZpZGVyKGJvb2xlYW4gcHJvdmlkZU1lbWJlcnMsIFdvcmtpbmdTZXRNb2RlbCBtb2RlbCkgewotKwkJc3VwZXIocHJvdmlkZU1lbWJlcnMpOwotKwkJZldvcmtpbmdTZXRNb2RlbD0gbW9kZWw7Ci0rCQlmTGlzdGVuZXI9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLSsJCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSsJCQkJCQl3b3JraW5nU2V0TW9kZWxDaGFuZ2VkKGV2ZW50KTsKLSsJCQkJCX0KLSsJCQkJfTsKLSsJCWZXb3JraW5nU2V0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmTGlzdGVuZXIpOwotKwl9Ci0rCQotIAkvKioKLSAJICoge0Bpbmhlcml0RG9jfQotIAkgKi8KLUluZGV4OiBNRVRBLUlORi9NQU5JRkVTVC5NRgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUkNTIGZpbGU6IC9ob21lL2VjbGlwc2Uvb3JnLmVjbGlwc2UuamR0LnVpL01FVEEtSU5GL01BTklGRVNULk1GLHYKLXJldHJpZXZpbmcgcmV2aXNpb24gMS4xMgotZGlmZiAtdSAtcjEuMTIgTUFOSUZFU1QuTUYKLS0tLSBNRVRBLUlORi9NQU5JRkVTVC5NRgkyNSBOb3YgMjAwNSAxMDoyNjozMSAtMDAwMAkxLjEyCi0rKysgTUVUQS1JTkYvTUFOSUZFU1QuTUYJOCBEZWMgMjAwNSAyMDoxOToyOSAtMDAwMAotQEAgLTk5LDggKzk5LDcgQEAKLSAgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YSwKLSAgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5ob3ZlciwKLSAgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMKLS1SZXF1aXJlLUJ1bmRsZTogCi0tIG9yZy5lY2xpcHNlLnVpLAotK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSAgb3JnLmVjbGlwc2UudWkuY29uc29sZSwKLSAgb3JnLmVjbGlwc2UuaGVscCwKLSAgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucywKLUBAIC0xMjEsNiArMTIwLDcgQEAKLSAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHksCi0gIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLAotICBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcsCi0tIG9yZy5lY2xpcHNlLnVpLmZvcm1zCi0tRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLSsgb3JnLmVjbGlwc2UudWkuZm9ybXMsCi0rIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcgotK0VjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlIAotIFBsdWdpbi1DbGFzczogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW4KLUluZGV4OiBwbHVnaW4ueG1sCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1SQ1MgZmlsZTogL2hvbWUvZWNsaXBzZS9vcmcuZWNsaXBzZS5qZHQudWkvcGx1Z2luLnhtbCx2Ci1yZXRyaWV2aW5nIHJldmlzaW9uIDEuNTc3Ci1kaWZmIC11IC1yMS41NzcgcGx1Z2luLnhtbAotLS0tIHBsdWdpbi54bWwJMjUgTm92IDIwMDUgMTE6MjE6MDEgLTAwMDAJMS41NzcKLSsrKyBwbHVnaW4ueG1sCTggRGVjIDIwMDUgMjA6MTk6MjkgLTAwMDAKLUBAIC00Njc3LDQgKzQ2NzcsNjIgQEAKLSAgICAgICAgICAgICBzdHJlYW1NZXJnZXJJZD0ib3JnLmVjbGlwc2UuamR0LnVpLnJlZmFjdG9yaW5nLm1vZGVsLkphdmFGaWxlU3RyZWFtTWVyZ2VyIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0gCi0rCi0rICAgIDwhLS0gQURESVRJT05TIEJFTE9XIFRISVMgTElORSAtLT4KLSsgICAgICAKLSsgICAgPGV4dGVuc2lvbgotKyAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdlciI+Ci0rICAgICAgIDx2aWV3ZXJDb250ZW50QmluZGluZyAKLSsgICAgICAgICAgICAgdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZUNvbnRlbnQiPgotKyAgICAgICAgICA8aW5jbHVkZXM+Ci0rICAgICAgIAkgICAgICA8Y29udGVudEV4dGVuc2lvbiBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5qZHQuamF2YS5uYXZpZ2F0b3IiIC8+ICAgICAgIAotKyAgICAgICAgICA8L2luY2x1ZGVzPiAgICAgICAKLSsgICAgICAgPC92aWV3ZXJDb250ZW50QmluZGluZz4KLSsgICAgPC9leHRlbnNpb24+IAotKyAgICAgIAotKyAgICA8ZXh0ZW5zaW9uCi0rICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0rICAgICAgIDxuYXZpZ2F0b3JDb250ZW50Ci0rICAgICAgICAgICAgIGNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnBhY2thZ2V2aWV3LlByZWZlcmVuY2VBd2FyZUNvbnRlbnRQcm92aWRlciIKLSsgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5qYXZhLm5hdmlnYXRvciIKLSsgICAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnBhY2thZ2V2aWV3LlByZWZlcmVuY2VBd2FyZUxhYmVsUHJvdmlkZXIiCi0rICAgICAgICAgICAgIG5hbWU9IkpEVCBFeHRlbnNpb24iCi0rICAgICAgICAgICAgIHByaW9yaXR5PSJoaWdoIj4KLSsgICAgICAgICAgPGVuYWJsZW1lbnQ+IAotKwkgICAgICAgICA8b3I+ICAgICAgICAgICAKLSsJICAgICAgICAgICAgICAgPGFkYXB0IAotKwkgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIgPiAKLSsJCSAgICAgICAgICAgICAgICAgIDx0ZXN0Ci0rCQkgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5wcm9qZWN0TmF0dXJlIgotKwkJICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIC8+Ci0rCSAgICAgICAgICAgICAgIDwvYWRhcHQ+ICAKLSsJICAgICAgICAgICA8aW5zdGFuY2VvZiAKLSsJICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0IiAvPiAKLSsJICAgICAgICAgICA8aW5zdGFuY2VvZiAKLSsJICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50IiAvPiAKLSsJICAgICAgICAgICA8aW5zdGFuY2VvZgotKwkgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXJFbnRyeUZpbGUiIC8+IAotKwkgICAgICAgICAgIDxpbnN0YW5jZW9mCi0rCSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGUiIC8+IAotKwkgICAgICAgICAgIDxpbnN0YW5jZW9mCi0rCSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldy5DbGFzc1BhdGhDb250YWluZXIiIC8+IAotKwkgICAgICAgICAgIDxpbnN0YW5jZW9mCi0rCSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXIiIC8+IAotKwkgICAgICAgICAgIDxpbnN0YW5jZW9mCi0rCSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIiAvPiAKLSsJICAgICAgICAgICAJCQkJCQkJPGluc3RhbmNlb2YgCi0rCSAgICAgICAgICAgICAgICAgCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53b3JraW5nc2V0cy5Xb3JraW5nU2V0TW9kZWwiIC8+IAotKwkgICAgICAgICA8L29yPgotKyAgICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0rCSAgICAgICAgICA8YWN0aW9uUHJvdmlkZXIgCi0rCSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucGFja2FnZXZpZXcuUGFja2FnZUV4cGxvcmVyQWN0aW9uUHJvdmlkZXIiPgotKwkgICAgICAgICAgICAgICA8ZW5hYmxlbWVudD4JICAgICAgICAgICAgICAgCi0rCSAgICAgICAgICAgICAgIDxhZGFwdCAKLSsJICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50IiAvPiAKLSsJICAgICAgICAgICAgICAgPC9lbmFibGVtZW50PgotKwkgICAgICAgICAgPC9hY3Rpb25Qcm92aWRlcj4KLSsgICAgICAgICAgPGR1cGxpY2F0ZUNvbnRlbnRGaWx0ZXIgdmlld2VyRmlsdGVyPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucGFja2FnZXZpZXcuSmF2YVJlc291cmNlRHVwbGljYXRpb25GaWx0ZXIiLz4KLSsgICAgICAgPC9uYXZpZ2F0b3JDb250ZW50PgotKyAgICA8L2V4dGVuc2lvbj4KLSsgICAgIAotIDwvcGx1Z2luPgotXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCi1JbmRleDogdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL2FjdGlvbnMvTXVsdGlBY3Rpb25Hcm91cC5qYXZhCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1SQ1MgZmlsZTogL2hvbWUvZWNsaXBzZS9vcmcuZWNsaXBzZS5qZHQudWkvdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL2FjdGlvbnMvTXVsdGlBY3Rpb25Hcm91cC5qYXZhLHYKLXJldHJpZXZpbmcgcmV2aXNpb24gMS43Ci1kaWZmIC11IC1yMS43IE11bHRpQWN0aW9uR3JvdXAuamF2YQotLS0tIHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9hY3Rpb25zL011bHRpQWN0aW9uR3JvdXAuamF2YQkxNyBKdW4gMjAwNSAxNTo1MTo1MSAtMDAwMAkxLjcKLSsrKyB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvYWN0aW9ucy9NdWx0aUFjdGlvbkdyb3VwLmphdmEJOCBEZWMgMjAwNSAyMDoxOTozMCAtMDAwMAotQEAgLTM3LDYgKzM3LDggQEAKLSAgKi8KLSBwdWJsaWMgY2xhc3MgTXVsdGlBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwIHsKLSAJCi0rCXB1YmxpYyBJQWN0aW9uW10gTk9fQUNUSU9OUyA9IG5ldyBJQWN0aW9uWzBdOwotKwkKLSAJcHJpdmF0ZSBJQWN0aW9uW10gZkFjdGlvbnM7IAotIAkKLSAJcHJpdmF0ZSBpbnQgZkN1cnJlbnRTZWxlY3Rpb247Ci1AQCAtNTcsNiArNTksMjggQEAKLSAJCWZDdXJyZW50U2VsZWN0aW9uPSBjdXJyZW50U2VsZWN0aW9uOwotIAkJZkFjdGlvbnM9IGFjdGlvbnM7Ci0gCX0KLSsJCi0rCS8qKgotKwkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBncm91cCB3aXRoIGEgZ2l2ZW4gc2V0IG9mIGFjdGlvbnMuCi0rCSAqIAotKwkgKiBAcGFyYW0gYWN0aW9ucwkJCXRoZSBhY3Rpb25zIGZvciB0aGlzIG11bHRpIGdyb3VwCi0rCSAqIEBwYXJhbSBjdXJyZW50U2VsZWN0aW9uCWRlY2lkZXMgd2hpY2ggYWN0aW9uIGlzIHNlbGVjdGVkIGluIHRoZSBtZW51IG9uIHN0YXJ0IHVwLgotKwkgKiAJCQkJCQkJRGVub3RlcyB0aGUgbG9jYXRpb24gaW4gdGhlIGFjdGlvbnMgYXJyYXkgb2YgdGhlIGN1cnJlbnQKLSsJICogCQkJCQkJCXNlbGVjdGVkIHN0YXRlLiBJdCBjYW5ub3QgYmUgbnVsbC4KLSsJICovCi0rCXB1YmxpYyBNdWx0aUFjdGlvbkdyb3VwKGludCBjdXJyZW50U2VsZWN0aW9uKSB7Ci0rCQlzdXBlcigpOwotKwkJCi0rCQlmQ3VycmVudFNlbGVjdGlvbj0gY3VycmVudFNlbGVjdGlvbjsKLSsJCWZBY3Rpb25zPSBOT19BQ1RJT05TOwotKwl9Ci0rCQotKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBY3Rpb25zKElBY3Rpb25bXSBhY3Rpb25zKSB7Ci0rCQlpZihhY3Rpb25zICE9IG51bGwpCi0rCQkJZkFjdGlvbnMgPSBhY3Rpb25zOwotKwkJZWxzZQotKwkJCWZBY3Rpb25zID0gTk9fQUNUSU9OUzsKLSsJfQotIAotIAkvKioKLSAJICogQWRkIHRoZSBhY3Rpb25zIHRvIHRoZSBnaXZlbiBtZW51IG1hbmFnZXIuCi1JbmRleDogdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L0NvbW1vbkxheW91dEFjdGlvbkdyb3VwLmphdmEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJDUyBmaWxlOiB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvcGFja2FnZXZpZXcvQ29tbW9uTGF5b3V0QWN0aW9uR3JvdXAuamF2YQotZGlmZiAtTiB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvcGFja2FnZXZpZXcvQ29tbW9uTGF5b3V0QWN0aW9uR3JvdXAuamF2YQotLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCi0rKysgdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L0NvbW1vbkxheW91dEFjdGlvbkdyb3VwLmphdmEJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAotQEAgLTAsMCArMSwxMzQgQEAKLSsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSsgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0rICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0rICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSsgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKyAqCi0rICogQ29udHJpYnV0b3JzOgotKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLStwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldzsKLSsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLStpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLStpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLStpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklFeHRlbnNpb25TdGF0ZU1vZGVsOwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSUphdmFIZWxwQ29udGV4dElkczsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW5JbWFnZXM7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5hY3Rpb25zLk11bHRpQWN0aW9uR3JvdXA7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldy5JRXh0ZW5zaW9uU3RhdGVDb25zdGFudHMuVmFsdWVzOwotKwotKy8qKgotKyAqIEFkZHMgdmlldyBtZW51cyB0byBzd2l0Y2ggYmV0d2VlbiBmbGF0IGFuZCBoaWVyYXJjaGljYWwgbGF5b3V0LgotKyAqIAotKyAqIEBzaW5jZSAyLjEKLSsgKi8KLStwdWJsaWMgY2xhc3MgQ29tbW9uTGF5b3V0QWN0aW9uR3JvdXAgZXh0ZW5kcyBNdWx0aUFjdGlvbkdyb3VwIHsKLSsKLSsJcHJpdmF0ZSBib29sZWFuIGZIYXNDb250cmlidXRlZFRvVmlld01lbnUgPSBmYWxzZTsKLSsJcHJpdmF0ZSBJQWN0aW9uIGZIaWVyYXJjaGljYWxMYXlvdXQgPSBudWxsOwotKwlwcml2YXRlIElBY3Rpb24gZkZsYXRMYXlvdXRBY3Rpb24gPSBudWxsOwotKwotKwlwcml2YXRlIElFeHRlbnNpb25TdGF0ZU1vZGVsIGZTdGF0ZU1vZGVsOwotKwotKwlwdWJsaWMgQ29tbW9uTGF5b3V0QWN0aW9uR3JvdXAoU3RydWN0dXJlZFZpZXdlciBhU3RydWN0dXJlZFZpZXdlciwgSUV4dGVuc2lvblN0YXRlTW9kZWwgYVN0YXRlTW9kZWwpIHsKLSsJCXN1cGVyKGFTdGF0ZU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShWYWx1ZXMuSVNfTEFZT1VUX0ZMQVQpID8gMCA6IDEpOwotKwkJSUFjdGlvbltdIGFjdGlvbnMgPSBjcmVhdGVBY3Rpb25zKGFTdHJ1Y3R1cmVkVmlld2VyLCBhU3RhdGVNb2RlbCk7Ci0rCQlzZXRBY3Rpb25zKGFjdGlvbnMpOwotKwkJZlN0YXRlTW9kZWwgPSBhU3RhdGVNb2RlbDsKLSsJfQotKwotKwkvKiAobm9uLUphdmFkb2MpCi0rCSAqIEBzZWUgQWN0aW9uR3JvdXAjZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMpCi0rCSAqLwotKwlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0rCQlzdXBlci5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLSsJCWlmKCFmSGFzQ29udHJpYnV0ZWRUb1ZpZXdNZW51KSB7Ci0rCQkJc3luY2hyb25pemVkKHRoaXMpIHsKLSsJCQkJaWYoIWZIYXNDb250cmlidXRlZFRvVmlld01lbnUpIHsKLSsJCQkJCWZIYXNDb250cmlidXRlZFRvVmlld01lbnUgPSB0cnVlOwotKwkJCQkJY29udHJpYnV0ZVRvVmlld01lbnUoYWN0aW9uQmFycy5nZXRNZW51TWFuYWdlcigpKTsKLSsJCQkJfQotKwkJCX0KLSsJCX0KLSsJfQotKwkKLSsJcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVUb1ZpZXdNZW51KElNZW51TWFuYWdlciB2aWV3TWVudSkgewotKwkJdmlld01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0rCi0rCQkvLyBDcmVhdGUgbGF5b3V0IHN1YiBtZW51Ci0rCQkKLSsJCUlNZW51TWFuYWdlciBsYXlvdXRTdWJNZW51PSBuZXcgTWVudU1hbmFnZXIoUGFja2FnZXNNZXNzYWdlcy5MYXlvdXRBY3Rpb25Hcm91cF9sYWJlbCk7IAotKwkJZmluYWwgU3RyaW5nIGxheW91dEdyb3VwTmFtZT0gImxheW91dCI7IC8vJE5PTi1OTFMtMSQKLSsJCVNlcGFyYXRvciBtYXJrZXI9IG5ldyBTZXBhcmF0b3IobGF5b3V0R3JvdXBOYW1lKTsKLSsKLSsJCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0rCQl2aWV3TWVudS5hZGQobWFya2VyKTsKLSsJCXZpZXdNZW51LmFwcGVuZFRvR3JvdXAobGF5b3V0R3JvdXBOYW1lLCBsYXlvdXRTdWJNZW51KTsKLSsJCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKyItZW5kIikpOy8vJE5PTi1OTFMtMSQJCQotKwkJYWRkQWN0aW9ucyhsYXlvdXRTdWJNZW51KTsKLSsJfQotKwkKLSsJCi0rCXByaXZhdGUgSUFjdGlvbltdIGNyZWF0ZUFjdGlvbnMoU3RydWN0dXJlZFZpZXdlciBhU3RydWN0dXJlZFZpZXdlciwgSUV4dGVuc2lvblN0YXRlTW9kZWwgYVN0YXRlTW9kZWwpIHsKLSsJCQotKwkJZkZsYXRMYXlvdXRBY3Rpb249IG5ldyBDb21tb25MYXlvdXRBY3Rpb24oYVN0cnVjdHVyZWRWaWV3ZXIsIGFTdGF0ZU1vZGVsLCB0cnVlKTsKLSsJCWZGbGF0TGF5b3V0QWN0aW9uLnNldFRleHQoUGFja2FnZXNNZXNzYWdlcy5MYXlvdXRBY3Rpb25Hcm91cF9mbGF0TGF5b3V0QWN0aW9uX2xhYmVsKTsgCi0rCQlKYXZhUGx1Z2luSW1hZ2VzLnNldExvY2FsSW1hZ2VEZXNjcmlwdG9ycyhmRmxhdExheW91dEFjdGlvbiwgImZsYXRMYXlvdXQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSsJCQotKwkJZkhpZXJhcmNoaWNhbExheW91dD0gbmV3IENvbW1vbkxheW91dEFjdGlvbihhU3RydWN0dXJlZFZpZXdlciwgYVN0YXRlTW9kZWwsIGZhbHNlKTsKLSsJCWZIaWVyYXJjaGljYWxMYXlvdXQuc2V0VGV4dChQYWNrYWdlc01lc3NhZ2VzLkxheW91dEFjdGlvbkdyb3VwX2hpZXJhcmNoaWNhbExheW91dEFjdGlvbl9sYWJlbCk7CSAgCi0rCQlKYXZhUGx1Z2luSW1hZ2VzLnNldExvY2FsSW1hZ2VEZXNjcmlwdG9ycyhmSGllcmFyY2hpY2FsTGF5b3V0LCAiaGllcmFyY2hpY2FsTGF5b3V0LmdpZiIpOyAvLyROT04tTkxTLTEkCi0rCQkKLSsJCWZIaWVyYXJjaGljYWxMYXlvdXQuc2V0Q2hlY2tlZCghYVN0YXRlTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFZhbHVlcy5JU19MQVlPVVRfRkxBVCkpOwotKwkJZkZsYXRMYXlvdXRBY3Rpb24uc2V0Q2hlY2tlZChhU3RhdGVNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoVmFsdWVzLklTX0xBWU9VVF9GTEFUKSk7Ci0rCQkKLSsJCXJldHVybiBuZXcgSUFjdGlvbltde2ZGbGF0TGF5b3V0QWN0aW9uLCBmSGllcmFyY2hpY2FsTGF5b3V0fTsKLSsJfQotKwkKLSsJcHVibGljIHZvaWQgc2V0RmxhdExheW91dChib29sZWFuIGZsYXRMYXlvdXQpIHsKLSsJCWZIaWVyYXJjaGljYWxMYXlvdXQuc2V0Q2hlY2tlZCghZmxhdExheW91dCk7Ci0rCQlmRmxhdExheW91dEFjdGlvbi5zZXRDaGVja2VkKGZsYXRMYXlvdXQpOwotKwl9Ci0rCSAKLSt9Ci0rCi0rY2xhc3MgQ29tbW9uTGF5b3V0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7Ci0rCi0rCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmSXNGbGF0TGF5b3V0OwotKwlwcml2YXRlIElFeHRlbnNpb25TdGF0ZU1vZGVsIGZTdGF0ZU1vZGVsOwotKwlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgZlN0cnVjdHVyZWRWaWV3ZXI7Ci0rCi0rCXB1YmxpYyBDb21tb25MYXlvdXRBY3Rpb24oU3RydWN0dXJlZFZpZXdlciBhU3RydWN0dXJlZFZpZXdlciwgSUV4dGVuc2lvblN0YXRlTW9kZWwgYVN0YXRlTW9kZWwsIGJvb2xlYW4gZmxhdCkgewotKwkJc3VwZXIoIiIsIEFTX1JBRElPX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQKLSsJCWZTdGF0ZU1vZGVsID0gYVN0YXRlTW9kZWw7Ci0rCQlmU3RydWN0dXJlZFZpZXdlciA9IGFTdHJ1Y3R1cmVkVmlld2VyOwotKwkJZklzRmxhdExheW91dD0gZmxhdDsgCi0rCQlpZiAoZklzRmxhdExheW91dCkKLSsJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIElKYXZhSGVscENvbnRleHRJZHMuTEFZT1VUX0ZMQVRfQUNUSU9OKTsKLSsJCWVsc2UKLSsJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIElKYXZhSGVscENvbnRleHRJZHMuTEFZT1VUX0hJRVJBUkNISUNBTF9BQ1RJT04pOwotKwl9Ci0rCi0rCS8qCi0rCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLSsJICovCi0rCXB1YmxpYyB2b2lkIHJ1bigpIHsKLSsJCWlmIChmU3RhdGVNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoVmFsdWVzLklTX0xBWU9VVF9GTEFUKSAhPSBmSXNGbGF0TGF5b3V0KSB7Ci0rCQkJZlN0YXRlTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KFZhbHVlcy5JU19MQVlPVVRfRkxBVCwgZklzRmxhdExheW91dCk7Ci0rICAJCQkgCQotKwkJCWZTdHJ1Y3R1cmVkVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotKwkJCWZTdHJ1Y3R1cmVkVmlld2VyLnJlZnJlc2goKTsKLSsJCQlmU3RydWN0dXJlZFZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotKwkJfQotKwl9Ci0rfQotSW5kZXg6IHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9QcmVmZXJlbmNlQXdhcmVDb250ZW50UHJvdmlkZXIuamF2YQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUkNTIGZpbGU6IHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9QcmVmZXJlbmNlQXdhcmVDb250ZW50UHJvdmlkZXIuamF2YQotZGlmZiAtTiB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvcGFja2FnZXZpZXcvUHJlZmVyZW5jZUF3YXJlQ29udGVudFByb3ZpZGVyLmphdmEKLS0tLSAvZGV2L251bGwJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAotKysrIHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9QcmVmZXJlbmNlQXdhcmVDb250ZW50UHJvdmlkZXIuamF2YQkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCi1AQCAtMCwwICsxLDE5OCBAQAotKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSsgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0rICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSsgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0rICogCi0rICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0rcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucGFja2FnZXZpZXc7Ci0rCi0raW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLSsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0rCi0raW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkNvbnRlbnRQcm92aWRlcjsKLStpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklFeHRlbnNpb25TdGF0ZU1vZGVsOwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0rCi0raW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcjsKLSsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW47Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldy5JRXh0ZW5zaW9uU3RhdGVDb25zdGFudHMuVmFsdWVzOwotKwotK3B1YmxpYyBjbGFzcyBQcmVmZXJlbmNlQXdhcmVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tbW9uQ29udGVudFByb3ZpZGVyIHsKLSsJCi0rCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpEVF9FWFRFTlNJT05fSUQgPSAib3JnLmVjbGlwc2UuamR0LmphdmEubmF2aWdhdG9yIjsgLy8kTk9OLU5MUy0xJAotKwotKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBOT19DSElMRFJFTj0gbmV3IE9iamVjdFswXTsKLSsKLSsJcHJpdmF0ZSBQYWNrYWdlRXhwbG9yZXJDb250ZW50UHJvdmlkZXIgZkRlbGVnYXRlQ29udGVudFByb3ZpZGVyOwotKwlwcml2YXRlIFdvcmtpbmdTZXRBd2FyZUNvbnRlbnRQcm92aWRlciBmV29ya2luZ1NldENvbnRlbnRQcm92aWRlcjsKLSsKLSsJcHJpdmF0ZSBJTWVtZW50byBmTWVtZW50bzsKLSsKLSsJcHJpdmF0ZSBJRXh0ZW5zaW9uU3RhdGVNb2RlbCBmU3RhdGVNb2RlbDsKLSsJcHJpdmF0ZSBmaW5hbCBDYWNoZSBmQ2FjaGU9IG5ldyBDYWNoZSgpOwotKwotKwlwcml2YXRlIFdvcmtpbmdTZXRNb2RlbE1hbmFnZXIgZk1hbmFnZXI7Ci0rCi0rCi0rCWNsYXNzIENhY2hlIHsKLSsJCXB1YmxpYyBWaWV3ZXIgZlZpZXdlcjsKLSsJCXB1YmxpYyBPYmplY3QgZk9sZElucHV0OwotKwkJcHVibGljIE9iamVjdCBmTmV3SW5wdXQ7Ci0rCi0rCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLSsJCQlmVmlld2VyPSB2aWV3ZXI7Ci0rCQkJZk9sZElucHV0PSBvbGRJbnB1dDsKLSsJCQlmTmV3SW5wdXQ9IG5ld0lucHV0OwotKwkJfQotKwotKwl9Ci0rCi0rCXB1YmxpYyBQcmVmZXJlbmNlQXdhcmVDb250ZW50UHJvdmlkZXIoKSB7Ci0rCX0KLSsKLSsJcHVibGljIHZvaWQgaW5pdChJRXh0ZW5zaW9uU3RhdGVNb2RlbCBhU3RhdGVNb2RlbCwgSU1lbWVudG8gYU1lbWVudG8pIHsKLSsJCWZTdGF0ZU1vZGVsPSBhU3RhdGVNb2RlbDsKLSsJCWZNYW5hZ2VyPSBuZXcgV29ya2luZ1NldE1vZGVsTWFuYWdlcihmU3RhdGVNb2RlbCwgdGhpcyk7CQotKwkJLy8gZXhwb3NlIHRoZSBtYW5hZ2VyIGZvciB0aGUgYWN0aW9uIHByb3ZpZGVyCi0rCQlmU3RhdGVNb2RlbC5zZXRQcm9wZXJ0eShXb3JraW5nU2V0TW9kZWxNYW5hZ2VyLklOU1RBTkNFX0tFWSwgZk1hbmFnZXIpOwotKwkJcmVzdG9yZVN0YXRlKGFNZW1lbnRvKTsKLSsJCWZTdGF0ZU1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotKwkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSsJCQkJaWYgKFZhbHVlcy5JU19MQVlPVVRfRkxBVC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpIHsKLSsJCQkJCWlmIChldmVudC5nZXROZXdWYWx1ZSgpICE9IG51bGwpIHsKLSsJCQkJCQlib29sZWFuIG5ld1ZhbHVlPSAoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpID8gdHJ1ZSA6IGZhbHNlOwotKwkJCQkJCWZEZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5zZXRJc0ZsYXRMYXlvdXQobmV3VmFsdWUpOwotKwkJCQkJfQotKwkJCQl9Ci0rCi0rCQkJfQotKwkJfSk7Ci0rCQlzZXRQcm92aWRlcnMoKTsKLSsJfQotKwotKwotKwlwdWJsaWMgdm9pZCBzZXRQcm92aWRlcnMoKSB7Ci0rCQlmRGVsZWdhdGVDb250ZW50UHJvdmlkZXI9IGNyZWF0ZUNvbnRlbnRQcm92aWRlcigpOwotKwkJZkRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmlucHV0Q2hhbmdlZChmQ2FjaGUuZlZpZXdlciwgZkNhY2hlLmZPbGRJbnB1dCwgZkNhY2hlLmZOZXdJbnB1dCk7Ci0rCQlmRGVsZWdhdGVDb250ZW50UHJvdmlkZXIuc2V0SXNGbGF0TGF5b3V0KGZTdGF0ZU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShWYWx1ZXMuSVNfTEFZT1VUX0ZMQVQpKTsKLSsKLSsJfQotKwotKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotKwkJZkRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLSsJfQotKwotKwlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLSsJCWZDYWNoZS5zZXRWYWx1ZXModmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotKwkJZkRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBmaW5kSW5wdXRFbGVtZW50KG5ld0lucHV0KSk7Ci0rCQlmTWFuYWdlci5zZXRWaWV3ZXIoKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcik7Ci0rCX0KLSsKLSsJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLSsKLSsJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkgewotKwkJCU9iamVjdCByb290PSBudWxsOwotKwkJCWlmIChmTWFuYWdlci5zaG93UHJvamVjdHMoKSkgCi0rCQkJCXJvb3Q9IEphdmFDb3JlLmNyZWF0ZSgoSVdvcmtzcGFjZVJvb3QpIGlucHV0RWxlbWVudCk7Ci0rCQkJZWxzZQotKwkJCQlyb290PSBmTWFuYWdlci5nZXRXb3JraW5nU2V0TW9kZWwoKTsKLSsJCQlyZXR1cm4gZkRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKHJvb3QpOwkJCQotKwkJCQotKwkJfSBlbHNlIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0rCQkJSUphdmFFbGVtZW50IGVsZW1lbnQ9IEphdmFDb3JlLmNyZWF0ZSgoSUNvbnRhaW5lcikgaW5wdXRFbGVtZW50KTsKLSsJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZXhpc3RzKCkpCi0rCQkJCXJldHVybiBmRGVsZWdhdGVDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KTsKLSsJCQlyZXR1cm4gTk9fQ0hJTERSRU47Ci0rCQl9Ci0rCi0rCQlyZXR1cm4gZkRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7Ci0rCX0KLSsKLSsJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7IAkJCi0rCQlpZihwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpCi0rCQkJcmV0dXJuIGZEZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihKYXZhQ29yZS5jcmVhdGUoKElQcm9qZWN0KXBhcmVudEVsZW1lbnQpKTsKLSsJCXJldHVybiBmRGVsZWdhdGVDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0rCX0KLSsJIAotKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotKwkJT2JqZWN0IHBhcmVudCA9IGZEZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0rCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpCi0rCQkJcmV0dXJuICgoSUphdmFQcm9qZWN0KXBhcmVudCkuZ2V0UHJvamVjdCgpOwotKwkJcmV0dXJuIHBhcmVudDsKLSsJfQotKwotKwlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotKwkJcmV0dXJuIGZEZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5oYXNDaGlsZHJlbihlbGVtZW50KTsKLSsJfQotKwotKwkvKioKLSsJICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluc2lkZSB0aGlzIGNsYXNzIGFuZCBmcm9tIHRlc3QgY2FzZXMuCi0rCSAqLwotKwlwdWJsaWMgUGFja2FnZUV4cGxvcmVyQ29udGVudFByb3ZpZGVyIGNyZWF0ZUNvbnRlbnRQcm92aWRlcigpIHsKLSsJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmU9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0rCQlib29sZWFuIHNob3dDVUNoaWxkcmVuPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuU0hPV19DVV9DSElMRFJFTik7Ci0rCQlpZiAoZk1hbmFnZXIuc2hvd1Byb2plY3RzKCkpIHsKLSsJCQlpbnQgb3B0aW9ucyA9IHNob3dDVUNoaWxkcmVuID8gU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlci5TSE9XX01FTUJFUlMgOiAwOwkJCQotKwkJCXJldHVybiBuZXcgUGFja2FnZUV4cGxvcmVyQ29udGVudFByb3ZpZGVyKG9wdGlvbnMpOwotKwkJfQotKwkJZWxzZQotKwkJCXJldHVybiBuZXcgV29ya2luZ1NldEF3YXJlQ29udGVudFByb3ZpZGVyKHNob3dDVUNoaWxkcmVuLCBmTWFuYWdlci5nZXRXb3JraW5nU2V0TW9kZWwoKSk7Ci0rCX0KLSsKLSsJLyogcGFja2FnZSAqL1BhY2thZ2VGcmFnbWVudFByb3ZpZGVyIGdldFBhY2thZ2VGcmFnbWVudFByb3ZpZGVyKCkgewotKwkJcmV0dXJuIGZEZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5nZXRQYWNrYWdlRnJhZ21lbnRQcm92aWRlcigpOwotKwl9Ci0rCi0rCXByaXZhdGUgT2JqZWN0IGZpbmRJbnB1dEVsZW1lbnQoT2JqZWN0IG5ld0lucHV0KSB7Ci0rCQlpZiAoZk1hbmFnZXIuc2hvd1dvcmtpbmdTZXRzKCkpIHsKLSsJCQlyZXR1cm4gZk1hbmFnZXIuZ2V0V29ya2luZ1NldE1vZGVsKCk7Ci0rCQl9IGVsc2UgewotKwkJCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSB7Ci0rCQkJCXJldHVybiBKYXZhQ29yZS5jcmVhdGUoKElXb3Jrc3BhY2VSb290KSBuZXdJbnB1dCk7Ci0rCQkJfSBlbHNlIGlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLSsJCQkJSUphdmFFbGVtZW50IGVsZW1lbnQ9IEphdmFDb3JlLmNyZWF0ZSgoSUNvbnRhaW5lcikgbmV3SW5wdXQpOwotKwkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZXhpc3RzKCkpCi0rCQkJCQlyZXR1cm4gZWxlbWVudDsKLSsJCQkJcmV0dXJuIG5ld0lucHV0OwotKwkJCX0KLSsJCQkvLyAxR0VSUFJUOiBJVFBKVUk6QUxMIC0gUGFja2FnZXMgVmlldyBpcyBlbXB0eSB3aGVuIHNob3duIGluIFR5cGUKLSsJCQkvLyBIaWVyYXJjaHkgUGVyc3BlY3RpdmUKLSsJCQkvLyB3ZSBjYW4ndCBoYW5kbGUgdGhlIGlucHV0Ci0rCQkJLy8gZmFsbCBiYWNrIHRvIHNob3cgdGhlIHdvcmtzcGFjZQotKwkJCXJldHVybiBKYXZhQ29yZS5jcmVhdGUoSmF2YVBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotKwkJfQotKwl9Ci0rCi0rCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgewotKwkJZk1lbWVudG89IGFNZW1lbnRvOwotKwkJZk1hbmFnZXIucmVzdG9yZVN0YXRlKGZNZW1lbnRvKTsKLSsKLSsJfQotKwotKwlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsKLSsKLSsJfQotKwotKwotKwotKwotKwlwdWJsaWMgUGFja2FnZUV4cGxvcmVyQ29udGVudFByb3ZpZGVyIGdldERlbGVnYXRlQ29udGVudFByb3ZpZGVyKCkgewotKwkJcmV0dXJuIGZEZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcjsKLSsJfQotKwotK30KLUluZGV4OiB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvcGFja2FnZXZpZXcvUGFja2FnZUV4cGxvcmVyQWN0aW9uUHJvdmlkZXIuamF2YQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUkNTIGZpbGU6IHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9QYWNrYWdlRXhwbG9yZXJBY3Rpb25Qcm92aWRlci5qYXZhCi1kaWZmIC1OIHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9QYWNrYWdlRXhwbG9yZXJBY3Rpb25Qcm92aWRlci5qYXZhCi0tLS0gL2Rldi9udWxsCTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAKLSsrKyB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvcGFja2FnZXZpZXcvUGFja2FnZUV4cGxvcmVyQWN0aW9uUHJvdmlkZXIuamF2YQkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCi1AQCAtMCwwICsxLDkxIEBACi0rLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSsgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0rICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSsgKiAKLSsgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLStwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldzsKLSsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci0rCi0raW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLStpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkFjdGlvblByb3ZpZGVyOwotK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUV4dGVuc2lvblN0YXRlTW9kZWw7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5hY3Rpb25zLkNvbW1vbkFjdGlvblByb3ZpZGVyOwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5DQ1BBY3Rpb25Hcm91cDsKLSsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW47Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldy5JRXh0ZW5zaW9uU3RhdGVDb25zdGFudHMuVmFsdWVzOwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud29ya2luZ3NldHMuVmlld0FjdGlvbkdyb3VwOwotKwotK3B1YmxpYyBjbGFzcyBQYWNrYWdlRXhwbG9yZXJBY3Rpb25Qcm92aWRlciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSUNvbW1vbkFjdGlvblByb3ZpZGVyIHsKLSsKLSsJcHJpdmF0ZSBWaWV3QWN0aW9uR3JvdXAgZlZpZXdBY3Rpb25Hcm91cDsKLSsJcHJpdmF0ZSBDb21tb25MYXlvdXRBY3Rpb25Hcm91cCBmTGF5b3V0QWN0aW9uR3JvdXA7Ci0rCXByaXZhdGUgYm9vbGVhbiBmSGFzRmlsbGVkVmlld01lbnUgPSBmYWxzZTsKLSsJcHJpdmF0ZSBJRXh0ZW5zaW9uU3RhdGVNb2RlbCBmU3RhdGVNb2RlbDsKLSsJCi0rCXByaXZhdGUgQ0NQQWN0aW9uR3JvdXAgY2NwR3JvdXA7Ci0rCi0rCXB1YmxpYyBib29sZWFuIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIHRoZUFjdGlvbkJhcnMpIHsKLSsJCWlmKCFmSGFzRmlsbGVkVmlld01lbnUpIHsKLSsJCQlmVmlld0FjdGlvbkdyb3VwLmZpbGxBY3Rpb25CYXJzKHRoZUFjdGlvbkJhcnMpOwotKwkJCWZMYXlvdXRBY3Rpb25Hcm91cC5maWxsQWN0aW9uQmFycyh0aGVBY3Rpb25CYXJzKTsKLSsJCQlmSGFzRmlsbGVkVmlld01lbnUgPSB0cnVlOwotKwkJCXJldHVybiB0cnVlOwotKwkJfQotKwkJcmV0dXJuIGZhbHNlOwotKwl9Ci0rCi0rCXB1YmxpYyBib29sZWFuIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgYU1lbnUpIHsKLSsJCSAKLSsJCWNjcEdyb3VwLmZpbGxDb250ZXh0TWVudShhTWVudSk7Ci0rCQlyZXR1cm4gdHJ1ZTsKLSsJfQotKwotKwlwdWJsaWMgdm9pZCBpbml0KGZpbmFsIFN0cmluZyBhbkV4dGVuc2lvbklkLCBmaW5hbCBJVmlld1BhcnQgYVZpZXdQYXJ0LCBmaW5hbCBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgYUNvbnRlbnRTZXJ2aWNlLCBmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIGFTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0rCi0rCQlmU3RhdGVNb2RlbD0gYUNvbnRlbnRTZXJ2aWNlLmZpbmRTdGF0ZU1vZGVsKGFuRXh0ZW5zaW9uSWQpOwotKwkJV29ya2luZ1NldE1vZGVsTWFuYWdlciB3b3JraW5nU2V0TW9kZWxNYW5hZ2VyPSAoV29ya2luZ1NldE1vZGVsTWFuYWdlcikgZlN0YXRlTW9kZWwuZ2V0UHJvcGVydHkoV29ya2luZ1NldE1vZGVsTWFuYWdlci5JTlNUQU5DRV9LRVkpOwotKwkJZlZpZXdBY3Rpb25Hcm91cD0gbmV3IFZpZXdBY3Rpb25Hcm91cChWaWV3QWN0aW9uR3JvdXAuU0hPV19QUk9KRUNUUywgd29ya2luZ1NldE1vZGVsTWFuYWdlciwgYVZpZXdQYXJ0LmdldFNpdGUoKSk7CQkgCi0rCi0rCQlmTGF5b3V0QWN0aW9uR3JvdXA9IG5ldyBDb21tb25MYXlvdXRBY3Rpb25Hcm91cChhU3RydWN0dXJlZFZpZXdlciwgZlN0YXRlTW9kZWwpOwotKwkJCi0rCQljY3BHcm91cCA9IG5ldyBDQ1BBY3Rpb25Hcm91cChhVmlld1BhcnQpOwotKwl9ICAKLSsJCi0rCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgeyAKLSsJCXN1cGVyLnJlc3RvcmVTdGF0ZShhTWVtZW50byk7Ci0rCQlyZXN0b3JlTGF5b3V0U3RhdGUoYU1lbWVudG8pOwotKwl9Ci0rCQotKwlwcml2YXRlIHZvaWQgcmVzdG9yZUxheW91dFN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLSsJCWJvb2xlYW4gaXNDdXJyZW50TGF5b3V0RmxhdD0gdHJ1ZTsKLSsJCUludGVnZXIgc3RhdGU9IG51bGw7Ci0rCQlpZiAobWVtZW50byAhPSBudWxsKQotKwkJCXN0YXRlPSBtZW1lbnRvLmdldEludGVnZXIoTWVtZW50b0ZsYWdzLlRBR19MQVlPVVQpOwotKwotKwkJLy8gSWYgbm8gbWVtZW50byB0cnkgYW4gcmVzdG9yZSBmcm9tIHByZWZlcmVuY2Ugc3RvcmUKLSsJCWlmIChzdGF0ZSA9PSBudWxsKSB7Ci0rCQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZT0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0rCQkJc3RhdGU9IG5ldyBJbnRlZ2VyKHN0b3JlLmdldEludChNZW1lbnRvRmxhZ3MuVEFHX0xBWU9VVCkpOwotKwkJfQotKwotKwkJaWYgKHN0YXRlLmludFZhbHVlKCkgPT0gTWVtZW50b0ZsYWdzLkZMQVRfTEFZT1VUKQotKwkJCWlzQ3VycmVudExheW91dEZsYXQ9IHRydWU7Ci0rCQllbHNlIGlmIChzdGF0ZS5pbnRWYWx1ZSgpID09IE1lbWVudG9GbGFncy5ISUVSQVJDSElDQUxfTEFZT1VUKQotKwkJCWlzQ3VycmVudExheW91dEZsYXQ9IGZhbHNlOyAKLSsJCSAKLSsJCWZTdGF0ZU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShWYWx1ZXMuSVNfTEFZT1VUX0ZMQVQsIGlzQ3VycmVudExheW91dEZsYXQpOwotKwkJZkxheW91dEFjdGlvbkdyb3VwLnNldEZsYXRMYXlvdXQoaXNDdXJyZW50TGF5b3V0RmxhdCk7Ci0rCX0KLSsKLSt9Ci1JbmRleDogdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L01lbWVudG9GbGFncy5qYXZhCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1SQ1MgZmlsZTogdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L01lbWVudG9GbGFncy5qYXZhCi1kaWZmIC1OIHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9NZW1lbnRvRmxhZ3MuamF2YQotLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCi0rKysgdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L01lbWVudG9GbGFncy5qYXZhCTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAKLUBAIC0wLDAgKzEsNDMgQEAKLSsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSsgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0rICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0rICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSsgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKyAqIAotKyAqIENvbnRyaWJ1dG9yczoKLSsgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLStwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldzsKLSsKLStwdWJsaWMgaW50ZXJmYWNlIE1lbWVudG9GbGFncyB7Ci0rCi0rCWludCBISUVSQVJDSElDQUxfTEFZT1VUID0gMHgxOwotKwotKwlpbnQgRkxBVF9MQVlPVVQgPSAweDI7Ci0rCi0rCS8vIFBlcnNpc3RhbmNlIHRhZ3MuCi0rCVN0cmluZyBUQUdfU0VMRUNUSU9OID0gInNlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSsKLSsJU3RyaW5nIFRBR19FWFBBTkRFRCA9ICJleHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLSsKLSsJU3RyaW5nIFRBR19FTEVNRU5UID0gImVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0rCi0rCVN0cmluZyBUQUdfUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotKwotKwlTdHJpbmcgVEFHX1ZFUlRJQ0FMX1BPU0lUSU9OID0gInZlcnRpY2FsUG9zaXRpb24iOyAvLyROT04tTkxTLTEkCi0rCi0rCVN0cmluZyBUQUdfSE9SSVpPTlRBTF9QT1NJVElPTiA9ICJob3Jpem9udGFsUG9zaXRpb24iOyAvLyROT04tTkxTLTEkCi0rCi0rCVN0cmluZyBUQUdfRklMVEVSUyA9ICJmaWx0ZXJzIjsgLy8kTk9OLU5MUy0xJAotKwotKwlTdHJpbmcgVEFHX0ZJTFRFUiA9ICJmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0rCi0rCVN0cmluZyBUQUdfTEFZT1VUID0gImxheW91dCI7IC8vJE5PTi1OTFMtMSQKLSsKLSsJU3RyaW5nIFRBR19DVVJSRU5UX0ZSQU1FID0gImN1cnJlbnRGcmFtZ2UiOyAvLyROT04tTkxTLTEkCi0rCi0rCVN0cmluZyBUQUdfUk9PVF9NT0RFID0gInJvb3RNb2RlIjsgLy8kTk9OLU5MUy0xJAotKwotKwlTdHJpbmcgU0VUVElOR19NRU1FTlRPID0gIm1lbWVudG8iOyAvLyROT04tTkxTLTEkCi0rfQotSW5kZXg6IHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9Xb3JraW5nU2V0TW9kZWxNYW5hZ2VyLmphdmEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJDUyBmaWxlOiB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvcGFja2FnZXZpZXcvV29ya2luZ1NldE1vZGVsTWFuYWdlci5qYXZhCi1kaWZmIC1OIHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9Xb3JraW5nU2V0TW9kZWxNYW5hZ2VyLmphdmEKLS0tLSAvZGV2L251bGwJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAotKysrIHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9Xb3JraW5nU2V0TW9kZWxNYW5hZ2VyLmphdmEJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAotQEAgLTAsMCArMSwyMDEgQEAKLSsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0rICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0rICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSsgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKyAqIAotKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0rICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnBhY2thZ2V2aWV3OwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLStpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci0rCi0raW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLSsKLStpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci0raW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldE1hbmFnZXI7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JRXh0ZW5zaW9uU3RhdGVNb2RlbDsKLSsKLSsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0rCi0raW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53b3JraW5nc2V0cy5Db25maWd1cmVXb3JraW5nU2V0QWN0aW9uOwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud29ya2luZ3NldHMuVmlld0FjdGlvbkdyb3VwOwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud29ya2luZ3NldHMuV29ya2luZ1NldE1vZGVsOwotKwotK3B1YmxpYyBjbGFzcyBXb3JraW5nU2V0TW9kZWxNYW5hZ2VyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotKwotKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX1BST0pFQ1RTPSBWaWV3QWN0aW9uR3JvdXAuU0hPV19QUk9KRUNUUzsKLSsJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19XT1JLSU5HX1NFVFM9IFZpZXdBY3Rpb25Hcm91cC5TSE9XX1dPUktJTkdfU0VUUzsKLSsJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERV9DSEFOR0VEPSBWaWV3QWN0aW9uR3JvdXAuY2xhc3MuZ2V0TmFtZSgpICsgIi5tb2RlX2NoYW5nZWQiOyAvLyROT04tTkxTLTEkCi0rIAotKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQU5DRV9LRVk9IFdvcmtpbmdTZXRNb2RlbE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpOwotKwotKwlwcml2YXRlIElFeHRlbnNpb25TdGF0ZU1vZGVsIGZTdGF0ZU1vZGVsOwotKwlwcml2YXRlIFdvcmtpbmdTZXRNb2RlbCBmV29ya2luZ1NldE1vZGVsOwotKwlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgZlZpZXdlcjsgCi0rCi0rCXByaXZhdGUgSU1lbWVudG8gZk1lbWVudG87Ci0rCXByaXZhdGUgUHJlZmVyZW5jZUF3YXJlQ29udGVudFByb3ZpZGVyIGZQcm92aWRlcjsKLSsKLSsJcHVibGljIFdvcmtpbmdTZXRNb2RlbE1hbmFnZXIoSUV4dGVuc2lvblN0YXRlTW9kZWwgc3RhdGVNb2RlbCwgUHJlZmVyZW5jZUF3YXJlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0rCQlmU3RhdGVNb2RlbD0gc3RhdGVNb2RlbDsKLSsJCWZQcm92aWRlciA9IHByb3ZpZGVyOwotKwl9Ci0rCi0rCXB1YmxpYyB2b2lkIHNldFZpZXdlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotKwkJZlZpZXdlcj0gdmlld2VyOwotKwl9Ci0rCi0rCS8qKgotKwkgKiAKLSsJICovCi0rCXByaXZhdGUgdm9pZCBoYW5kbGVSb290TW9kZUNoYW5nZWQoaW50IG5ld01vZGUpIHsKLSsJCXJvb3RNb2RlQ2hhbmdlZChuZXdNb2RlKTsKLSsJCU9iamVjdCBvbGRJbnB1dD0gbnVsbDsKLSsJCU9iamVjdCBuZXdJbnB1dD0gbnVsbDsKLSsJCWlmIChzaG93UHJvamVjdHMoKSkgewotKwkJCW9sZElucHV0PSBnZXRXb3JraW5nU2V0TW9kZWwoKTsKLSsJCQluZXdJbnB1dD0gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotKwkJfSBlbHNlIGlmIChzaG93V29ya2luZ1NldHMoKSkgewotKwkJCW9sZElucHV0PSBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0rCQkJbmV3SW5wdXQ9IGdldFdvcmtpbmdTZXRNb2RlbCgpOwotKwkJfQotKwkJLy8gSkRUUE9SVCBUaGUgQ29tbW9uIE5hdmlnYXRvciBkb2VzIG5vdCBzdXBwb3J0IFRyZWUgRnJhbWVzIHlldAotKwkJLy8gaWYgKG9sZElucHV0ICE9IG51bGwgJiYgbmV3SW5wdXQgIT0gbnVsbCkgewotKwkJLy8gRnJhbWUgZnJhbWU7Ci0rCQkvLyBmb3IgKGludCBpPSAwOyAoZnJhbWU9IGZGcmFtZUxpc3QuZ2V0RnJhbWUoaSkpICE9IG51bGw7IGkrKykgewotKwkJLy8gaWYgKGZyYW1lIGluc3RhbmNlb2YgVHJlZUZyYW1lKSB7Ci0rCQkvLyBUcmVlRnJhbWUgdHJlZUZyYW1lPSAoVHJlZUZyYW1lKWZyYW1lOwotKwkJLy8gaWYgKG9sZElucHV0LmVxdWFscyh0cmVlRnJhbWUuZ2V0SW5wdXQoKSkpCi0rCQkvLyB0cmVlRnJhbWUuc2V0SW5wdXQobmV3SW5wdXQpOwotKwkJLy8gfQotKwkJLy8gfQotKwkJLy8gfQotKwl9Ci0rCi0rCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSsJCWlmIChWaWV3QWN0aW9uR3JvdXAuTU9ERV9DSEFOR0VELmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkgewotKwkJCWhhbmRsZVJvb3RNb2RlQ2hhbmdlZCgoKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmludFZhbHVlKCkpOwotKwkJfSBlbHNlIHsKLSsJCQl1cGRhdGVUaXRsZShldmVudCk7Ci0rCi0rCQkJU3RyaW5nIHByb3BlcnR5PSBldmVudC5nZXRQcm9wZXJ0eSgpOwotKwkJCWlmIChJV29ya2luZ1NldE1hbmFnZXIuQ0hBTkdFX1dPUktJTkdfU0VUX0NPTlRFTlRfQ0hBTkdFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLSsJCQkJcmVmcmVzaFZpZXdlcigpOwotKwkJCX0KLSsJCX0KLSsKLSsJfQotKwotKwlwcml2YXRlIHZvaWQgcmVmcmVzaFZpZXdlcigpIHsKLSsJCWlmIChmVmlld2VyICE9IG51bGwpIHsKLSsJCQlmVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotKwkJCWZWaWV3ZXIucmVmcmVzaCgpOwotKwkJCWZWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLSsJCX0KLSsJfQotKwotKwkvKioKLSsJICogQHBhcmFtIGV2ZW50Ci0rCSAqLwotKwlwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGUoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotKwkJSVdvcmtpbmdTZXQgd29ya2luZ1NldD0gKElXb3JraW5nU2V0KSBldmVudC5nZXROZXdWYWx1ZSgpOwotKwotKwkJU3RyaW5nIHdvcmtpbmdTZXROYW1lPSBudWxsOwotKwkJaWYgKHdvcmtpbmdTZXQgIT0gbnVsbCkKLSsJCQl3b3JraW5nU2V0TmFtZT0gd29ya2luZ1NldC5nZXROYW1lKCk7Ci0rCQkvLyBKRFRQT1JUCi0rCQkvLyBmUGFydC5zZXRXb3JraW5nU2V0TmFtZSh3b3JraW5nU2V0TmFtZSk7Ci0rCQkvLyBmUGFydC51cGRhdGVUaXRsZSgpOwotKwl9Ci0rCi0rCXB1YmxpYyBib29sZWFuIHNob3dQcm9qZWN0cygpIHsKLSsJCXJldHVybiBmU3RhdGVNb2RlbC5nZXRJbnRQcm9wZXJ0eShJRXh0ZW5zaW9uU3RhdGVDb25zdGFudHMuUk9PVF9NT0RFKSA9PSBTSE9XX1BST0pFQ1RTOwotKwl9Ci0rCi0rCXB1YmxpYyBib29sZWFuIHNob3dXb3JraW5nU2V0cygpIHsKLSsJCXJldHVybiBmU3RhdGVNb2RlbC5nZXRJbnRQcm9wZXJ0eShJRXh0ZW5zaW9uU3RhdGVDb25zdGFudHMuUk9PVF9NT0RFKSA9PSBTSE9XX1dPUktJTkdfU0VUUzsKLSsJfQotKwotKwlwdWJsaWMgdm9pZCByb290TW9kZUNoYW5nZWQoaW50IG5ld01vZGUpIHsKLSsJCWJvb2xlYW4gaXNSb290SW5wdXRDaGFuZ2UgPSBnZXRSb290TW9kZSgpICE9IG5ld01vZGU7Ci0rCQlzZXRSb290TW9kZShuZXdNb2RlKTsKLSsJCWlmIChzaG93V29ya2luZ1NldHMoKSAmJiBmV29ya2luZ1NldE1vZGVsID09IG51bGwpIHsKLSsJCQljcmVhdGVXb3JraW5nU2V0TW9kZWwoKTsKLSsJCQkvLyBKRFRQT1JUCi0rCQkJLy8gaWYgKGZBY3Rpb25TZXQgIT0gbnVsbCkgewotKwkJCS8vIGZBY3Rpb25TZXQuZ2V0V29ya2luZ1NldEFjdGlvbkdyb3VwKCkuc2V0V29ya2luZ1NldE1vZGVsKGZXb3JraW5nU2V0TW9kZWwpOwotKwkJCS8vIH0KLSsKLSsJCQlpZiAoaXNSb290SW5wdXRDaGFuZ2UgJiYgZldvcmtpbmdTZXRNb2RlbC5uZWVkc0NvbmZpZ3VyYXRpb24oKSkgewotKwkJCQlTaGVsbCBzaGVsbD0gKGZWaWV3ZXIgIT0gbnVsbCkgPyBmVmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpIDogUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotKwotKwkJCQlDb25maWd1cmVXb3JraW5nU2V0QWN0aW9uIGFjdGlvbj0gbmV3IENvbmZpZ3VyZVdvcmtpbmdTZXRBY3Rpb24oc2hlbGwpOwotKwkJCQlhY3Rpb24uc2V0V29ya2luZ1NldE1vZGVsKGZXb3JraW5nU2V0TW9kZWwpOwotKwkJCQlhY3Rpb24ucnVuKCk7Ci0rCQkJCWZXb3JraW5nU2V0TW9kZWwuY29uZmlndXJlZCgpOwotKwkJCX0KLSsJCX0KLSsJCWlmKGlzUm9vdElucHV0Q2hhbmdlKSB7Ci0rCQkJZlByb3ZpZGVyLnNldFByb3ZpZGVycygpOwotKwkJCXJlZnJlc2hWaWV3ZXIoKTsKLSsJCX0KLSsJfQotKwotKwotKwlwdWJsaWMgdm9pZCBjcmVhdGVXb3JraW5nU2V0TW9kZWwoKSB7Ci0rCQlpZiAoZldvcmtpbmdTZXRNb2RlbCA9PSBudWxsKSB7Ci0rCQkJUGxhdGZvcm0ucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSsJCQkJCWJvb2xlYW4gY3JlYXRlUmVzdG9yZWRNb2RlbCA9IGZNZW1lbnRvICE9IG51bGwgJiYgZk1lbWVudG8uZ2V0Q2hpbGQoV29ya2luZ1NldE1vZGVsLlRBR19MT0NBTF9XT1JLSU5HX1NFVF9NQU5BR0VSKSAhPSBudWxsOwotKwkJCQkJZldvcmtpbmdTZXRNb2RlbD0gY3JlYXRlUmVzdG9yZWRNb2RlbCA/IG5ldyBXb3JraW5nU2V0TW9kZWwoZk1lbWVudG8pIDogbmV3IFdvcmtpbmdTZXRNb2RlbCgpOwotKwkJCQkJZlN0YXRlTW9kZWwuc2V0UHJvcGVydHkoSUV4dGVuc2lvblN0YXRlQ29uc3RhbnRzLldPUktJTkdfU0VUX01PREVMX0tFWSwgZldvcmtpbmdTZXRNb2RlbCk7Ci0rCQkJCX0KLSsKLSsJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSsJCQkJCWZXb3JraW5nU2V0TW9kZWw9IG5ldyBXb3JraW5nU2V0TW9kZWwoKTsKLSsJCQkJfQotKwkJCX0pOwotKwkJfQotKwl9Ci0rCi0rCXB1YmxpYyBXb3JraW5nU2V0TW9kZWwgZ2V0V29ya2luZ1NldE1vZGVsKCkgewotKwkJcmV0dXJuIGZXb3JraW5nU2V0TW9kZWw7Ci0rCX0KLSsKLSsJcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0rCQlmTWVtZW50bz0gYU1lbWVudG87Ci0rCQlyZXN0b3JlUm9vdE1vZGUoKTsKLSsJCWlmIChzaG93V29ya2luZ1NldHMoKSkgewotKwkJCWNyZWF0ZVdvcmtpbmdTZXRNb2RlbCgpOwotKwkJfQotKwotKwl9Ci0rCi0rCXB1YmxpYyBpbnQgZ2V0Um9vdE1vZGUoKSB7Ci0rCQlyZXR1cm4gZlN0YXRlTW9kZWwuZ2V0SW50UHJvcGVydHkoSUV4dGVuc2lvblN0YXRlQ29uc3RhbnRzLlJPT1RfTU9ERSk7Ci0rCX0KLSsKLSsJcHJvdGVjdGVkIHZvaWQgc2V0Um9vdE1vZGUoaW50IGFSb290TW9kZSkgewotKwkJZlN0YXRlTW9kZWwuc2V0SW50UHJvcGVydHkoSUV4dGVuc2lvblN0YXRlQ29uc3RhbnRzLlJPT1RfTU9ERSwgYVJvb3RNb2RlKTsKLSsJfQotKwotKwlwcml2YXRlIHZvaWQgcmVzdG9yZVJvb3RNb2RlKCkgewotKwkJaW50IHJvb3RNb2RlPSBTSE9XX1BST0pFQ1RTOwotKwkJaWYgKGZNZW1lbnRvICE9IG51bGwpIHsKLSsJCQlJbnRlZ2VyIHZhbHVlPSBmTWVtZW50by5nZXRJbnRlZ2VyKE1lbWVudG9GbGFncy5UQUdfUk9PVF9NT0RFKTsKLSsJCQlyb290TW9kZT0gdmFsdWUgIT0gbnVsbCA/ICgodmFsdWUuaW50VmFsdWUoKSA9PSBTSE9XX1BST0pFQ1RTKSA/IFNIT1dfUFJPSkVDVFMgOiBTSE9XX1dPUktJTkdfU0VUUykgOiBTSE9XX1BST0pFQ1RTOwotKwkJfQotKwkJc2V0Um9vdE1vZGUocm9vdE1vZGUpOwotKwl9Ci0rfQotSW5kZXg6IHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9QcmVmZXJlbmNlQXdhcmVMYWJlbFByb3ZpZGVyLmphdmEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJDUyBmaWxlOiB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvcGFja2FnZXZpZXcvUHJlZmVyZW5jZUF3YXJlTGFiZWxQcm92aWRlci5qYXZhCi1kaWZmIC1OIHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9QcmVmZXJlbmNlQXdhcmVMYWJlbFByb3ZpZGVyLmphdmEKLS0tLSAvZGV2L251bGwJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAotKysrIHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9QcmVmZXJlbmNlQXdhcmVMYWJlbFByb3ZpZGVyLmphdmEJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAotQEAgLTAsMCArMSwxODkgQEAKLSsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0rICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0rICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSsgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKyAqIAotKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0rICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnBhY2thZ2V2aWV3OwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0rCi0raW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLStpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci0rCi0raW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkxhYmVsUHJvdmlkZXI7Ci0raW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JRXh0ZW5zaW9uU3RhdGVNb2RlbDsKLSsKLSsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbHM7Ci0rCi0raW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldy5JRXh0ZW5zaW9uU3RhdGVDb25zdGFudHMuVmFsdWVzOwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudmlld3N1cHBvcnQuQXBwZWFyYW5jZUF3YXJlTGFiZWxQcm92aWRlcjsKLStpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LkphdmFFbGVtZW50SW1hZ2VQcm92aWRlcjsKLSsKLSsvKioKLSsgKiBQcm92aWRlcyB0aGUgbGFiZWxzIGZvciB0aGUgUGFja2FnZSBFeHBsb3Jlci4KLSsgKiA8cD4KLSsgKiBJdCBwcm92aWRlcyBsYWJlbHMgZm9yIHRoZSBwYWNrYWdlcyBpbiBoaWVyYXJjaGljYWwgbGF5b3V0IGFuZCBpbiBhbGwgb3RoZXIgY2FzZXMgZGVsZWdhdGVzIGl0IHRvCi0rICogaXRzIHN1cGVyIGNsYXNzLgotKyAqIDwvcD4KLSsgKiAKLSsgKiBAc2luY2UgMi4xCi0rICovCi0rcHVibGljIGNsYXNzIFByZWZlcmVuY2VBd2FyZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tbW9uTGFiZWxQcm92aWRlciB7Ci0rCi0rCXByaXZhdGUgZmluYWwgbG9uZyBMQUJFTF9GTEFHUz0gSmF2YUVsZW1lbnRMYWJlbHMuREVGQVVMVF9RVUFMSUZJRUQgfCBKYXZhRWxlbWVudExhYmVscy5ST09UX1BPU1RfUVVBTElGSUVEIHwgSmF2YUVsZW1lbnRMYWJlbHMuQVBQRU5EX1JPT1RfUEFUSCB8IEphdmFFbGVtZW50TGFiZWxzLk1fUEFSQU1FVEVSX1RZUEVTIHwgSmF2YUVsZW1lbnRMYWJlbHMuTV9QQVJBTUVURVJfTkFNRVMgfCBKYXZhRWxlbWVudExhYmVscy5NX0FQUF9SRVRVUk5UWVBFIHwgSmF2YUVsZW1lbnRMYWJlbHMuTV9FWENFUFRJT05TIHwgSmF2YUVsZW1lbnRMYWJlbHMuRl9BUFBfVFlQRV9TSUdOQVRVUkUgfCBKYXZhRWxlbWVudExhYmVscy5UX1RZUEVfUEFSQU1FVEVSUzsKLSsKLSsJcHJpdmF0ZSBQYWNrYWdlRXhwbG9yZXJMYWJlbFByb3ZpZGVyIGRlbGVnZXRlTGFiZWxQcm92aWRlcjsKLSsKLSsJcHJpdmF0ZSBQYWNrYWdlRXhwbG9yZXJDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlcjsKLSsKLSsJcHJpdmF0ZSBJRXh0ZW5zaW9uU3RhdGVNb2RlbCBmU3RhdGVNb2RlbDsKLSsKLSsJcHJpdmF0ZSBXb3JraW5nU2V0TW9kZWxNYW5hZ2VyIGZNYW5hZ2VyOwotKwotKwlwdWJsaWMgUHJlZmVyZW5jZUF3YXJlTGFiZWxQcm92aWRlcigpIHsKLSsKLSsJfQotKwotKwlwdWJsaWMgdm9pZCBpbml0KElFeHRlbnNpb25TdGF0ZU1vZGVsIGFTdGF0ZU1vZGVsLCBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLSsJCWZTdGF0ZU1vZGVsPSBhU3RhdGVNb2RlbDsKLSsKLSsJCWZNYW5hZ2VyPSAoV29ya2luZ1NldE1vZGVsTWFuYWdlcikgZlN0YXRlTW9kZWwuZ2V0UHJvcGVydHkoSUV4dGVuc2lvblN0YXRlQ29uc3RhbnRzLldPUktJTkdTRVRfTU9ERUxfTUFOQUdFUl9LRVkpOwotKwkJCi0rCQlmQ29udGVudFByb3ZpZGVyPSAoKFByZWZlcmVuY2VBd2FyZUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyKS5nZXREZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcigpOwotKwkJZGVsZWdldGVMYWJlbFByb3ZpZGVyPSBjcmVhdGVMYWJlbFByb3ZpZGVyKCk7Ci0rCi0rCQlkZWxlZ2V0ZUxhYmVsUHJvdmlkZXIuc2V0SXNGbGF0TGF5b3V0KGZTdGF0ZU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShWYWx1ZXMuSVNfTEFZT1VUX0ZMQVQpKTsKLSsJCWZTdGF0ZU1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotKwkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSsJCQkJaWYgKFZhbHVlcy5JU19MQVlPVVRfRkxBVC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpIHsKLSsJCQkJCWlmIChldmVudC5nZXROZXdWYWx1ZSgpICE9IG51bGwpIHsKLSsJCQkJCQlib29sZWFuIG5ld1ZhbHVlPSAoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpID8gdHJ1ZSA6IGZhbHNlOwotKwkJCQkJCWRlbGVnZXRlTGFiZWxQcm92aWRlci5zZXRJc0ZsYXRMYXlvdXQobmV3VmFsdWUpOwotKwkJCQkJfQotKwkJCQl9Ci0rCi0rCQkJfQotKwkJfSk7Ci0rCX0KLSsKLSsJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihPYmplY3QgYW5FbGVtZW50KSB7Ci0rCQlyZXR1cm4gZm9ybWF0TWVzc2FnZShhbkVsZW1lbnQpOwotKwl9Ci0rCi0rCi0rCS8qIHBhY2thZ2UgKi9ib29sZWFuIHNob3dQcm9qZWN0cygpIHsKLSsJCXJldHVybiBmTWFuYWdlci5zaG93UHJvamVjdHMoKTsKLSsJfQotKwotKwkvKiBwYWNrYWdlICovYm9vbGVhbiBzaG93V29ya2luZ1NldHMoKSB7Ci0rCQlyZXR1cm4gZk1hbmFnZXIuc2hvd1dvcmtpbmdTZXRzKCk7Ci0rCX0KLSsKLSsJcHJpdmF0ZSBQYWNrYWdlRXhwbG9yZXJMYWJlbFByb3ZpZGVyIGNyZWF0ZUxhYmVsUHJvdmlkZXIoKSB7Ci0rCQlpZiAoc2hvd1Byb2plY3RzKCkpCi0rCQkJcmV0dXJuIG5ldyBQYWNrYWdlRXhwbG9yZXJMYWJlbFByb3ZpZGVyKEFwcGVhcmFuY2VBd2FyZUxhYmVsUHJvdmlkZXIuREVGQVVMVF9URVhURkxBR1MgfCBKYXZhRWxlbWVudExhYmVscy5QX0NPTVBSRVNTRUQsIEFwcGVhcmFuY2VBd2FyZUxhYmVsUHJvdmlkZXIuREVGQVVMVF9JTUFHRUZMQUdTIHwgSmF2YUVsZW1lbnRJbWFnZVByb3ZpZGVyLlNNQUxMX0lDT05TLCBmQ29udGVudFByb3ZpZGVyKTsKLSsJCWVsc2UKLSsJCQlyZXR1cm4gbmV3IFdvcmtpbmdTZXRBd2FyZUxhYmVsUHJvdmlkZXIoQXBwZWFyYW5jZUF3YXJlTGFiZWxQcm92aWRlci5ERUZBVUxUX1RFWFRGTEFHUyB8IEphdmFFbGVtZW50TGFiZWxzLlBfQ09NUFJFU1NFRCwgQXBwZWFyYW5jZUF3YXJlTGFiZWxQcm92aWRlci5ERUZBVUxUX0lNQUdFRkxBR1MgfCBKYXZhRWxlbWVudEltYWdlUHJvdmlkZXIuU01BTExfSUNPTlMsIGZDb250ZW50UHJvdmlkZXIpOwotKwl9Ci0rCi0rCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0rCQlkZWxlZ2V0ZUxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotKwl9Ci0rCi0rCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSsJCWRlbGVnZXRlTGFiZWxQcm92aWRlci5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0rCX0KLSsKLSsJcHVibGljIHZvaWQgYWRkTGFiZWxEZWNvcmF0b3IoSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgewotKwkJZGVsZWdldGVMYWJlbFByb3ZpZGVyLmFkZExhYmVsRGVjb3JhdG9yKGRlY29yYXRvcik7Ci0rCX0KLSsKLSsJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotKwkJZGVsZWdldGVMYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSsJfQotKwotKwlwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZChPYmplY3QgZWxlbWVudCkgewotKwkJcmV0dXJuIGRlbGVnZXRlTGFiZWxQcm92aWRlci5nZXRCYWNrZ3JvdW5kKGVsZW1lbnQpOwotKwl9Ci0rCi0rCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0rCQlyZXR1cm4gZGVsZWdldGVMYWJlbFByb3ZpZGVyLmdldEZvcmVncm91bmQoZWxlbWVudCk7Ci0rCX0KLSsKLSsJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0rCQlyZXR1cm4gZGVsZWdldGVMYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotKwl9Ci0rCi0rCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0rCQlyZXR1cm4gZGVsZWdldGVMYWJlbFByb3ZpZGVyLmlzTGFiZWxQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0eSk7Ci0rCX0KLSsKLSsJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotKwkJZGVsZWdldGVMYWJlbFByb3ZpZGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSsJfQotKwotKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotKwkJcmV0dXJuIGRlbGVnZXRlTGFiZWxQcm92aWRlci5lcXVhbHMob2JqKTsKLSsJfQotKwotKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotKwkJcmV0dXJuIGRlbGVnZXRlTGFiZWxQcm92aWRlci5oYXNoQ29kZSgpOwotKwl9Ci0rCi0rCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0rCQlyZXR1cm4gZGVsZWdldGVMYWJlbFByb3ZpZGVyLnRvU3RyaW5nKCk7Ci0rCX0KLSsKLSsJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0rCQlyZXR1cm4gZGVsZWdldGVMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0rCX0KLSsKLSsJcHVibGljIHZvaWQgc2V0SXNGbGF0TGF5b3V0KGJvb2xlYW4gc3RhdGUpIHsKLSsJCWRlbGVnZXRlTGFiZWxQcm92aWRlci5zZXRJc0ZsYXRMYXlvdXQoc3RhdGUpOwotKwl9Ci0rCi0rCS8vIFRha2VuIGZyb20gU3RhdHVzQmFyVXBkYXRlcgotKwotKwlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdE1lc3NhZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSsJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0rCQkJcmV0dXJuIGZvcm1hdEphdmFFbGVtZW50TWVzc2FnZSgoSUphdmFFbGVtZW50KSBlbGVtZW50KTsKLSsJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotKwkJCXJldHVybiBmb3JtYXRSZXNvdXJjZU1lc3NhZ2UoKElSZXNvdXJjZSkgZWxlbWVudCk7Ci0rCQl9Ci0rCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSsJfQotKwotKwlwcml2YXRlIFN0cmluZyBmb3JtYXRKYXZhRWxlbWVudE1lc3NhZ2UoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLSsJCXJldHVybiBKYXZhRWxlbWVudExhYmVscy5nZXRFbGVtZW50TGFiZWwoZWxlbWVudCwgTEFCRUxfRkxBR1MpOwotKwl9Ci0rCi0rCXByaXZhdGUgU3RyaW5nIGZvcm1hdFJlc291cmNlTWVzc2FnZShJUmVzb3VyY2UgZWxlbWVudCkgewotKwkJSUNvbnRhaW5lciBwYXJlbnQ9IGVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0rCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUk9PVCkKLSsJCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCkgKyBKYXZhRWxlbWVudExhYmVscy5DT05DQVRfU1RSSU5HICsgcGFyZW50LmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLSsJCWVsc2UKLSsJCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0rCX0KLSsKLSsJcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0rCi0rCX0KLSsKLSsJcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0rCi0rCX0KLSt9Ci1JbmRleDogdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L0phdmFSZXNvdXJjZUR1cGxpY2F0aW9uRmlsdGVyLmphdmEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJDUyBmaWxlOiB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvcGFja2FnZXZpZXcvSmF2YVJlc291cmNlRHVwbGljYXRpb25GaWx0ZXIuamF2YQotZGlmZiAtTiB1aS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvdWkvcGFja2FnZXZpZXcvSmF2YVJlc291cmNlRHVwbGljYXRpb25GaWx0ZXIuamF2YQotLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCi0rKysgdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L0phdmFSZXNvdXJjZUR1cGxpY2F0aW9uRmlsdGVyLmphdmEJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAotQEAgLTAsMCArMSwzNCBAQAotKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0rICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSsgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSsgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0rICogCi0rICogQ29udHJpYnV0b3JzOgotKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnBhY2thZ2V2aWV3OwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLStpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLStpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uVmlld2VyOwotK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlcjsKLStpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmZpbHRlcnMuTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyOwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLSsKLStwdWJsaWMgY2xhc3MgSmF2YVJlc291cmNlRHVwbGljYXRpb25GaWx0ZXIgZXh0ZW5kcyBOYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXIgaW1wbGVtZW50cyBJTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyIHsKLSsgCi0rCXB1YmxpYyBib29sZWFuIHNlbGVjdChDb21tb25WaWV3ZXIgYVZpZXdlciwgT2JqZWN0IGFQYXJlbnRFbGVtZW50LAotKwkJCU9iamVjdCBhbkVsZW1lbnQpIHsKLSsJCWlmIChhbkVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSB8fCBhbkVsZW1lbnQgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0rCQkJSVJlc291cmNlIHJlcyA9IChJUmVzb3VyY2UpIGFuRWxlbWVudDsKLSsJCQlyZXR1cm4gImNsYXNzIi5lcXVhbHMocmVzLmdldEZpbGVFeHRlbnNpb24oKSkgfHwgIShKYXZhQ29yZS5jcmVhdGUocmVzKSAhPSBudWxsKTsgLy8kTk9OLU5MUy0xJAotKwkJfQotKwkJcmV0dXJuIHRydWU7Ci0rCX0KLSsKLSt9Ci1JbmRleDogdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L0lFeHRlbnNpb25TdGF0ZUNvbnN0YW50cy5qYXZhCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1SQ1MgZmlsZTogdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L0lFeHRlbnNpb25TdGF0ZUNvbnN0YW50cy5qYXZhCi1kaWZmIC1OIHVpL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC91aS9wYWNrYWdldmlldy9JRXh0ZW5zaW9uU3RhdGVDb25zdGFudHMuamF2YQotLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCi0rKysgdWkvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL3VpL3BhY2thZ2V2aWV3L0lFeHRlbnNpb25TdGF0ZUNvbnN0YW50cy5qYXZhCTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAKLUBAIC0wLDAgKzEsMjggQEAKLSsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0rICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0rICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSsgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKyAqIAotKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0rICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnBhY2thZ2V2aWV3OwotKwotK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud29ya2luZ3NldHMuVmlld0FjdGlvbkdyb3VwOwotKwotK3B1YmxpYyBpbnRlcmZhY2UgSUV4dGVuc2lvblN0YXRlQ29uc3RhbnRzIHsKLSsKLSsJU3RyaW5nIFdPUktJTkdfU0VUX01PREVMX0tFWT0gIndvcmtpbmdTZXRNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLSsJU3RyaW5nIFJPT1RfTU9ERT0gInJvb3RNb2RlIjsgLy8kTk9OLU5MUy0xJAotKwlTdHJpbmcgV09SS0lOR1NFVF9NT0RFTF9NQU5BR0VSX0tFWSA9IFdvcmtpbmdTZXRNb2RlbE1hbmFnZXIuSU5TVEFOQ0VfS0VZOwotKwotKwlpbnRlcmZhY2UgVmFsdWVzIHsKLSsKLSsJCVN0cmluZyBJU19MQVlPVVRfRkxBVD0gImlzTGF5b3V0RmxhdCI7IC8vJE5PTi1OTFMtMSQKLSsKLSsJCWludCBTSE9XX1BST0pFQ1RTPSBWaWV3QWN0aW9uR3JvdXAuU0hPV19QUk9KRUNUUzsKLSsJCWludCBTSE9XX1dPUktJTkdfU0VUUz0gVmlld0FjdGlvbkdyb3VwLlNIT1dfV09SS0lOR19TRVRTOwotKwotKwl9Ci0rCi0rfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvbW9kZWxzL0NvbW1vbk5hdmlnYXRvci5lbXggYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9tb2RlbHMvQ29tbW9uTmF2aWdhdG9yLmVteApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmY2MxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9tb2RlbHMvQ29tbW9uTmF2aWdhdG9yLmVteAorKysgL2Rldi9udWxsCkBAIC0xLDMzODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS14dG9vbHMyX3VuaXZlcnNhbF90eXBlX21hbmFnZXItLT4KLTx1bWw6TW9kZWwgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpub3RhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tL3h0b29scy8xLjUuMC9Ob3RhdGlvbiIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMS4wLjAvVU1MIiB4bWxuczp1bWxub3RhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tL3h0b29scy8xLjUuMC9VbWxub3RhdGlvbiIgeG1pOmlkPSJfU1dYM1VINUdFZG03OTdzemlrSGpvUSIgbmFtZT0iQ29tbW9uTmF2aWdhdG9yIiBhcHBsaWVkUHJvZmlsZT0iX1NXWDNWSDVHRWRtNzk3c3ppa0hqb1EgX1NXWDNWMzVHRWRtNzk3c3ppa0hqb1EgX1NXWDNXbjVHRWRtNzk3c3ppa0hqb1EgX1NXWDNYWDVHRWRtNzk3c3ppa0hqb1EgX1NXWDNZSDVHRWRtNzk3c3ppa0hqb1EiPgotICA8ZUFubm90YXRpb25zIHhtaTppZD0iX1NXWDNVWDVHRWRtNzk3c3ppa0hqb1EiIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iX1NXWDNVbjVHRWRtNzk3c3ppa0hqb1EiPgotICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfU1dYM1VuNUdFZG03OTdzemlrSGpvUSIgdHlwZT0iQ2xhc3MiIG5hbWU9IkNvcmUiPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1lJaXFRSDVHRWRtNzk3c3ppa0hqb1EiIHNvdXJjZUVkZ2VzPSJfZ21KdndINUdFZG03OTdzemlrSGpvUSBfcGJpY0VINUdFZG03OTdzemlrSGpvUSBfY1ZtT29INUlFZG03OTdzemlrSGpvUSBfcXFqdUFQeTRFZG0xODV6dnYwV01fUSIgdGFyZ2V0RWRnZXM9Il9nbVAyWTM1R0VkbTc5N3N6aWtIam9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1lJaXFRMzVHRWRtNzk3c3ppa0hqb1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25OYXZpZ2F0b3JbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfWUlpcVJINUdFZG03OTdzemlrSGpvUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWUlpcVJYNUdFZG03OTdzemlrSGpvUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWUlpcVJuNUdFZG03OTdzemlrSGpvUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWUlpcVIzNUdFZG03OTdzemlrSGpvUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ZSWlxU0g1R0VkbTc5N3N6aWtIam9RIiBmaWx0ZXJpbmc9IkF1dG9tYXRpYyIgZmlsdGVyaW5nS2V5cz0icHVibGljLHByb3RlY3RlZCxwcml2YXRlLHBhY2thZ2UiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ZSWlxU1g1R0VkbTc5N3N6aWtIam9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1lJaXFTbjVHRWRtNzk3c3ppa0hqb1EiIGZpbHRlcmluZz0iTWFudWFsIj4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1jcmVhdGVDb21tb25WaWV3ZXJec2lnbj0oUUNvbXBvc2l0ZSUzYilRQ29tbW9uVmlld2VyJTNiW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPWluaXRMaXN0ZW5lcnNec2lnbj0oUVRyZWVWaWV3ZXIlM2IpVltqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1oYW5kbGVEb3VibGVDbGlja15zaWduPShRRG91YmxlQ2xpY2tFdmVudCUzYilWW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPWNyZWF0ZUNvbW1vbk1hbmFnZXJec2lnbj0oKVFDb21tb25OYXZpZ2F0b3JNYW5hZ2VyJTNiW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPWNyZWF0ZUNvbW1vbkFjdGlvbkdyb3VwXnNpZ249KClRQWN0aW9uR3JvdXAlM2JbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgICA8ZmlsdGVyZWRPYmplY3RzIHhtaTp0eXBlPSJ1bWw6T3BlcmF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2ptZXRob2RedmNvcmUudGFyZ2V0PXVtbDIuT3BlcmF0aW9uXm5hbWU9Y3JlYXRlQ29tbW9uRmlsdGVyXnNpZ249KFFDb21tb25WaWV3ZXIlM2IpUVZpZXdlckZpbHRlciUzYltqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1jcmVhdGVEaXNwb3NlTGlzdGVuZXJec2lnbj0oKVFEaXNwb3NlTGlzdGVuZXIlM2JbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgICA8ZmlsdGVyZWRPYmplY3RzIHhtaTp0eXBlPSJ1bWw6T3BlcmF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2ptZXRob2RedmNvcmUudGFyZ2V0PXVtbDIuT3BlcmF0aW9uXm5hbWU9Z2V0SW5pdGlhbElucHV0XnNpZ249KClRSUFkYXB0YWJsZSUzYltqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT11cGRhdGVUaXRsZV5zaWduPSgpVltqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1nZXRGcmFtZVRvb2xUaXBUZXh0XnNpZ249KFFPYmplY3QlM2IpUVN0cmluZyUzYltqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L3N0eWxlcz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ZSWlxUzM1R0VkbTc5N3N6aWtIam9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ZSWlxVEg1R0VkbTc5N3N6aWtIam9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWUlpcVRYNUdFZG03OTdzemlrSGpvUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1lJaXFUbjVHRWRtNzk3c3ppa0hqb1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1lJaXFRWDVHRWRtNzk3c3ppa0hqb1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1lJaXFRbjVHRWRtNzk3c3ppa0hqb1EiIHg9IjM2MjUyIiB5PSIxNTkwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2dZeUNJSDVHRWRtNzk3c3ppa0hqb1EiIHNvdXJjZUVkZ2VzPSJfZ21QMlkzNUdFZG03OTdzemlrSGpvUSBfYnBSN01INUlFZG03OTdzemlrSGpvUSIgdGFyZ2V0RWRnZXM9Il9nbUp2d0g1R0VkbTc5N3N6aWtIam9RIF93OVhzc1B5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2dZeUNJMzVHRWRtNzk3c3ppa0hqb1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9nWXlDSkg1R0VkbTc5N3N6aWtIam9RIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nWXlDSlg1R0VkbTc5N3N6aWtIam9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2dZeUNKbjVHRWRtNzk3c3ppa0hqb1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZ1l5Q0ozNUdFZG03OTdzemlrSGpvUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9nWXlDS0g1R0VkbTc5N3N6aWtIam9RIiBmaWx0ZXJpbmc9IkF1dG9tYXRpYyIgZmlsdGVyaW5nS2V5cz0icHVibGljLHByb3RlY3RlZCxwcml2YXRlLHBhY2thZ2UiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2dZeUNLWDVHRWRtNzk3c3ppa0hqb1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZ1l5Q0tuNUdFZG03OTdzemlrSGpvUSIgZmlsdGVyaW5nPSJNYW51YWwiPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPWluaXRec2lnbj0oKVZbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1zZWxlY3Rpb25DaGFuZ2VkXnNpZ249KFFTZWxlY3Rpb25DaGFuZ2VkRXZlbnQlM2IpVltqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPXJlc3RvcmVTdGF0ZV5zaWduPShRSU1lbWVudG8lM2IpVltqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPXNhdmVTdGF0ZV5zaWduPShRSU1lbWVudG8lM2IpVltqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPWZpbGxDb250ZXh0TWVudV5zaWduPShRSU1lbnVNYW5hZ2VyJTNiKVZbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1pbml0Q29udGV4dE1lbnVec2lnbj0oKVZbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT11cGRhdGVTdGF0dXNCYXJec2lnbj0oUUlTZWxlY3Rpb24lM2IpVltqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPWdldERlZmF1bHRTdGF0dXNCYXJNZXNzYWdlXnNpZ249KFFJU3RydWN0dXJlZFNlbGVjdGlvbiUzYilRU3RyaW5nJTNiW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9zdHlsZXM+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nWXlDSzM1R0VkbTc5N3N6aWtIam9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9nWXlDTEg1R0VkbTc5N3N6aWtIam9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nWXlDTFg1R0VkbTc5N3N6aWtIam9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZ1l5Q0xuNUdFZG03OTdzemlrSGpvUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9nWXlDSVg1R0VkbTc5N3N6aWtIam9RIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2dZeUNJbjVHRWRtNzk3c3ppa0hqb1EiIHg9IjQzMjQ4IiB5PSI1NDA2Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3BYMFpzSDVHRWRtNzk3c3ppa0hqb1EiIHNvdXJjZUVkZ2VzPSJfY1ZzVlFINUlFZG03OTdzemlrSGpvUSIgdGFyZ2V0RWRnZXM9Il9wYmljRUg1R0VkbTc5N3N6aWtIam9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3BYMFpzMzVHRWRtNzk3c3ppa0hqb1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25WaWV3ZXJbamN1Xm5hbWU9Q29tbW9uVmlld2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfcFgwWnRINUdFZG03OTdzemlrSGpvUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcFgwWnRYNUdFZG03OTdzemlrSGpvUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vblZpZXdlcltqY3VebmFtZT1Db21tb25WaWV3ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcFgwWnRuNUdFZG03OTdzemlrSGpvUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vblZpZXdlcltqY3VebmFtZT1Db21tb25WaWV3ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcFgwWnQzNUdFZG03OTdzemlrSGpvUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9wWDBadUg1R0VkbTc5N3N6aWtIam9RIiBmaWx0ZXJpbmc9IkF1dG9tYXRpYyIgZmlsdGVyaW5nS2V5cz0icHVibGljLHByb3RlY3RlZCxwcml2YXRlLHBhY2thZ2UiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uVmlld2VyW2pjdV5uYW1lPUNvbW1vblZpZXdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9wWDBadVg1R0VkbTc5N3N6aWtIam9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3BYMFp1bjVHRWRtNzk3c3ppa0hqb1EiIGZpbHRlcmluZz0iTWFudWFsIj4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1pbml0XnNpZ249KClWW2pzcmN0eXBlXm5hbWU9Q29tbW9uVmlld2VyW2pjdV5uYW1lPUNvbW1vblZpZXdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPWludGVybmFsQWRkXnNpZ249KFFXaWRnZXQlM2JRT2JqZWN0JTNiJTViUU9iamVjdCUzYilWW2pzcmN0eXBlXm5hbWU9Q29tbW9uVmlld2VyW2pjdV5uYW1lPUNvbW1vblZpZXdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPWluaXREcmFnQW5kRHJvcF5zaWduPSgpVltqc3JjdHlwZV5uYW1lPUNvbW1vblZpZXdlcltqY3VebmFtZT1Db21tb25WaWV3ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1jcmVhdGVUcmVlSXRlbV5zaWduPShRV2lkZ2V0JTNiUU9iamVjdCUzYkkpVltqc3JjdHlwZV5uYW1lPUNvbW1vblZpZXdlcltqY3VebmFtZT1Db21tb25WaWV3ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L3N0eWxlcz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uVmlld2VyW2pjdV5uYW1lPUNvbW1vblZpZXdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9wWDBadTM1R0VkbTc5N3N6aWtIam9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9wWDBadkg1R0VkbTc5N3N6aWtIam9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vblZpZXdlcltqY3VebmFtZT1Db21tb25WaWV3ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcFgwWnZYNUdFZG03OTdzemlrSGpvUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3BYMFp2bjVHRWRtNzk3c3ppa0hqb1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uVmlld2VyW2pjdV5uYW1lPUNvbW1vblZpZXdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3BYMFpzWDVHRWRtNzk3c3ppa0hqb1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uVmlld2VyW2pjdV5uYW1lPUNvbW1vblZpZXdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3BYMFpzbjVHRWRtNzk3c3ppa0hqb1EiIHg9IjI4NjIwIiB5PSIxOTA4Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JscF9jSDVJRWRtNzk3c3ppa0hqb1EiIHNvdXJjZUVkZ2VzPSJfY1Z5YjRINUlFZG03OTdzemlrSGpvUSBfU2pmQVVQeTRFZG0xODV6dnYwV01fUSBfY1lNYm9meTRFZG0xODV6dnYwV01fUSIgdGFyZ2V0RWRnZXM9Il9icFI3TUg1SUVkbTc5N3N6aWtIam9RIF9WczRoa1B5MUVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JscF9jMzVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ibHBfZEg1SUVkbTc5N3N6aWtIam9RIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ibHBfZFg1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JscF9kbjVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYmxwX2QzNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ibHBfZUg1SUVkbTc5N3N6aWtIam9RIiBmaWx0ZXJpbmc9IkF1dG9tYXRpYyIgZmlsdGVyaW5nS2V5cz0icHVibGljLHByb3RlY3RlZCxwcml2YXRlLHBhY2thZ2UiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JscF9lWDVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfYmxwX2VuNUlFZG03OTdzemlrSGpvUSIgZmlsdGVyaW5nPSJNYW51YWwiPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPWluaXRec2lnbj0oKVZbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1hZGRDb21tb25BY3Rpb25Qcm92aWRlck1lbnVec2lnbj0oUUlNZW51TWFuYWdlciUzYlFJU3RydWN0dXJlZFNlbGVjdGlvbiUzYlFBY3Rpb25Db250ZXh0JTNiKVZbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1hZGRDb250ZW50RGVzY3JpcHRvck1lbnVec2lnbj0oUUlNZW51TWFuYWdlciUzYlFJU3RydWN0dXJlZFNlbGVjdGlvbiUzYlFBY3Rpb25Db250ZXh0JTNiKVZbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1maW5kUmVsZXZhbnRBY3Rpb25EZXNjcmlwdG9yc15zaWduPShRSVN0cnVjdHVyZWRTZWxlY3Rpb24lM2IpJTViUUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvciUzYltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPWdldEFjdGlvblByb3ZpZGVySW5zdGFuY2Vec2lnbj0oUUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvciUzYilRSUNvbW1vbkFjdGlvblByb3ZpZGVyJTNiW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgICA8ZmlsdGVyZWRPYmplY3RzIHhtaTp0eXBlPSJ1bWw6T3BlcmF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2ptZXRob2RedmNvcmUudGFyZ2V0PXVtbDIuT3BlcmF0aW9uXm5hbWU9YWRkQWN0aW9uRGVzY3JpcHRvcl5zaWduPShRQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yJTNiKVZbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1jb21wbGFpbklmRGlzcG9zZWRec2lnbj0oKVZbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1vbkxvYWRec2lnbj0oUU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9ySW5zdGFuY2UlM2IpVltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqbWV0aG9kXnZjb3JlLnRhcmdldD11bWwyLk9wZXJhdGlvbl5uYW1lPWluaXRpYWxpemVec2lnbj0oUUlDb21tb25BY3Rpb25Qcm92aWRlciUzYilWW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9zdHlsZXM+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ibHBfZTM1SUVkbTc5N3N6aWtIam9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ibHBfZkg1SUVkbTc5N3N6aWtIam9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ibHBfZlg1SUVkbTc5N3N6aWtIam9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfYmxwX2ZuNUlFZG03OTdzemlrSGpvUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ibHBfY1g1SUVkbTc5N3N6aWtIam9RIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2JscF9jbjVJRWRtNzk3c3ppa0hqb1EiIHg9IjQ1NzkyIiB5PSIxMDgxMiIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jUzFPZ0g1SUVkbTc5N3N6aWtIam9RIiBzb3VyY2VFZGdlcz0iX3pSYURFSDVJRWRtNzk3c3ppa0hqb1EgXzJJQkQwSDVJRWRtNzk3c3ppa0hqb1EgX1NUQ0dVZnkwRWRtMTg1enZ2MFdNX1EgX1VaSHBFUHkwRWRtMTg1enZ2MFdNX1EgX1VaTnZzdnkwRWRtMTg1enZ2MFdNX1EgXzF4VFk4UHk0RWRtMTg1enZ2MFdNX1EiIHRhcmdldEVkZ2VzPSJfY1ZtT29INUlFZG03OTdzemlrSGpvUSBfY1ZzVlFINUlFZG03OTdzemlrSGpvUSBfY1Z5YjRINUlFZG03OTdzemlrSGpvUSBfelJhREdINUlFZG03OTdzemlrSGpvUSBfMklCRDJINUlFZG03OTdzemlrSGpvUSBfVVpOdnd2eTBFZG0xODV6dnYwV01fUSBfbU5LZEFQeTFFZG0xODV6dnYwV01fUSBfU2pmQVdQeTRFZG0xODV6dnYwV01fUSBfcXFqdUNQeTRFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jUzFPZzM1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9jUzFPaEg1SUVkbTc5N3N6aWtIam9RIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jUzFPaFg1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY1MxT2huNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NTMU9oMzVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfY1MxT2lINUlFZG03OTdzemlrSGpvUSIgZmlsdGVyaW5nPSJBdXRvbWF0aWMiIGZpbHRlcmluZ0tleXM9InB1YmxpYyxwcm90ZWN0ZWQscHJpdmF0ZSxwYWNrYWdlIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NTMU9pWDVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfY1MxT2luNUlFZG03OTdzemlrSGpvUSIgZmlsdGVyaW5nPSJBdXRvbWF0aWMiIGZpbHRlcmluZ0tleXM9InByaXZhdGUscGFja2FnZSxwcm90ZWN0ZWQiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY1MxT2kzNUlFZG03OTdzemlrSGpvUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfY1MxT2pINUlFZG03OTdzemlrSGpvUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jUzFPalg1SUVkbTc5N3N6aWtIam9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfY1MxT2puNUlFZG03OTdzemlrSGpvUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2NTMU9nWDVJRWRtNzk3c3ppa0hqb1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9jUzFPZ241SUVkbTc5N3N6aWtIam9RIiB4PSIyODkzOCIgeT0iMTY4NTQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfelBUeFVINUlFZG03OTdzemlrSGpvUSIgc291cmNlRWRnZXM9Il96UmFER0g1SUVkbTc5N3N6aWtIam9RIiB0YXJnZXRFZGdlcz0iX3pSYURFSDVJRWRtNzk3c3ppa0hqb1EgX3lLbzdvUHkxRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfelBUeFUzNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfelBUeFZINUlFZG03OTdzemlrSGpvUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfelBaMzhINUlFZG03OTdzemlrSGpvUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3pQWjM4WDVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96UFozOG41SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3pQWjM4MzVJRWRtNzk3c3ppa0hqb1EiIGZpbHRlcmluZz0iQXV0b21hdGljIiBmaWx0ZXJpbmdLZXlzPSJwdWJsaWMscHJvdGVjdGVkLHByaXZhdGUscGFja2FnZSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96UFozOUg1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3pQWjM5WDVJRWRtNzk3c3ppa0hqb1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfelBaMzluNUlFZG03OTdzemlrSGpvUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfelBaMzkzNUlFZG03OTdzemlrSGpvUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96UFozLUg1SUVkbTc5N3N6aWtIam9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfelBaMy1YNUlFZG03OTdzemlrSGpvUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3pQVHhVWDVJRWRtNzk3c3ppa0hqb1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96UFR4VW41SUVkbTc5N3N6aWtIam9RIiB4PSIxMTA4NiIgeT0iMTc0NTciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMkYwcmNINUlFZG03OTdzemlrSGpvUSIgc291cmNlRWRnZXM9Il8ySUJEMkg1SUVkbTc5N3N6aWtIam9RIiB0YXJnZXRFZGdlcz0iXzJJQkQwSDVJRWRtNzk3c3ppa0hqb1EgX3lwZXp3UHkxRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMkYwcmMzNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlTGFiZWxQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il8yRjByZEg1SUVkbTc5N3N6aWtIam9RIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yRjByZFg1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlTGFiZWxQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yRjByZG41SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlTGFiZWxQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yRjByZDM1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzJGMHJlSDVJRWRtNzk3c3ppa0hqb1EiIGZpbHRlcmluZz0iQXV0b21hdGljIiBmaWx0ZXJpbmdLZXlzPSJwdWJsaWMscHJvdGVjdGVkLHByaXZhdGUscGFja2FnZSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJGMHJlWDVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMkYwcmVuNUlFZG03OTdzemlrSGpvUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJGMHJlMzVJRWRtNzk3c3ppa0hqb1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzJGMHJmSDVJRWRtNzk3c3ppa0hqb1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlTGFiZWxQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yRjByZlg1SUVkbTc5N3N6aWtIam9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMkYwcmZuNUlFZG03OTdzemlrSGpvUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfMkYwcmNYNUlFZG03OTdzemlrSGpvUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMkYwcmNuNUlFZG03OTdzemlrSGpvUSIgeD0iMTkzOTMiIHk9IjE3NDQ5Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NKdzFrUHkwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZUVkZ2VzPSJfU1RJTkFfeTBFZG0xODV6dnYwV01fUSBfU1RPVGt2eTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0RWRnZXM9Il9TVE9Ua3Z5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NKMjhNUHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnlbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9TSjI4TWZ5MEVkbTE4NXp2djBXTV9RIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TSjI4TXZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5W2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NKMjhNX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnlbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU0oyOE5QeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9TSjI4TmZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeVtqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TSjI4TnZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1NKMjhOX3kwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5W2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NKMjhPUHkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1NKMjhPZnkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5W2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NKMjhPdnkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9TSjI4T195MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeVtqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1NKdzFrZnkwRWRtMTg1enZ2MFdNX1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5W2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfU0p3MWt2eTBFZG0xODV6dnYwV01fUSIgeD0iMTE0NDgiIHk9IjMxODAwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NMcmhJUHkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldEVkZ2VzPSJfU1RDR1VmeTBFZG0xODV6dnYwV01fUSBfU1RJTkFfeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TTHJoSV95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvcltqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9TTHJoSlB5MEVkbTE4NXp2djBXTV9RIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TTHJoSmZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvcltqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU0xyaEp2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NMcmhKX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfU0xyaEtQeTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TTHJoS2Z5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1NMcmhLdnkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvcltqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU0xyaEtfeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfU0xyaExQeTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TTHJoTGZ5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfU0xyaEx2eTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1NMcmhJZnkwRWRtMTg1enZ2MFdNX1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvcltqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9TTHJoSXZ5MEVkbTE4NXp2djBXTV9RIiB4PSIyMTYyNCIgeT0iMzExNjQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVRZMGdQeTBFZG0xODV6dnYwV01fUSIgc291cmNlRWRnZXM9Il9VWk52dXZ5MEVkbTE4NXp2djBXTV9RIF9VWk52d3Z5MEVkbTE4NXp2djBXTV9RIF9VWlQyVmZ5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXRFZGdlcz0iX1VaTnZzdnkwRWRtMTg1enZ2MFdNX1EgX1VaVDJWZnkwRWRtMTg1enZ2MFdNX1EgX0tocFlNUHkxRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVRZMGdfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9VVFkwaFB5MEVkbTE4NXp2djBXTV9RIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VVFkwaGZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VVFkwaHZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VVFkwaF95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1VUWTBpUHkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VVFkwaWZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1VUWTBpdnkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VVFkwaV95MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9VVFkwalB5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVRZMGpmeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1VUWTBqdnkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1VUWTBnZnkwRWRtMTg1enZ2MFdNX1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1VUWTBndnkwRWRtMTg1enZ2MFdNX1EiIHg9IjM3NTI0IiB5PSIyNjM5NCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VWGxfRVB5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXRFZGdlcz0iX1VaSHBFUHkwRWRtMTg1enZ2MFdNX1EgX1VaTnZ1dnkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVhsX0VfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcltqY3VebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9VWGxfRlB5MEVkbTE4NXp2djBXTV9RIiB3aWR0aD0iNTMwIiBoZWlnaHQ9IjUzMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVhsX0ZmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcltqY3VebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVhsX0Z2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcltqY3VebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVhsX0ZfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcltqY3VebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVhsX0dQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9VWGxfR2Z5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcltqY3VebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVhsX0d2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9VWGxfR195MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcltqY3VebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVhsX0hQeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfVVhsX0hmeTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXJbamN1Xm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ2xhc3NpZmllclN0eWxlIiB4bWk6aWQ9Il9VWGxfRWZ5MEVkbTE4NXp2djBXTV9RIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiIHVzZUNsYXNzaWZpZXJTaGFwZT0idHJ1ZSIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyW2pjdV5uYW1lPUlFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1VYbF9FdnkwRWRtMTg1enZ2MFdNX1EiIHg9IjMwMjEwIiB5PSIzMTE2NCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9taDRsUVB5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2VFZGdlcz0iX3c5WHNzUHkwRWRtMTg1enZ2MFdNX1EiIGVsZW1lbnQ9Il9tSlZpWVB5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX21oNGxRX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkNvbW1lbnRCb2R5IiBlbGVtZW50PSJfbUpWaVlQeTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9taDRsUWZ5MEVkbTE4NXp2djBXTV9RIiBmaWxsQ29sb3I9IjE2NzYzODUwIiBsaW5lQ29sb3I9IjE2NzQ0NTc2IiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbWg0bFF2eTBFZG0xODV6dnYwV01fUSIgeD0iNDU0NzQiIHk9IjIyMjYiIHdpZHRoPSI0OTI4IiBoZWlnaHQ9IjE2NzQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQURmWFFQeTFFZG0xODV6dnYwV01fUSIgc291cmNlRWRnZXM9Il9LaHBZTVB5MUVkbTE4NXp2djBXTV9RIiBlbGVtZW50PSJfQURUS0FQeTFFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BRGZYUV95MUVkbTE4NXp2djBXTV9RIiB0eXBlPSJDb21tZW50Qm9keSIgZWxlbWVudD0iX0FEVEtBUHkxRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfQURmWFFmeTFFZG0xODV6dnYwV01fUSIgZmlsbENvbG9yPSIxNjc2Mzg1MCIgbGluZUNvbG9yPSIxNjc0NDU3NiIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0FEZlhRdnkxRWRtMTg1enZ2MFdNX1EiIHg9IjUwMjQ0IiB5PSIyNjcxMiIgd2lkdGg9IjU3MTUiIGhlaWdodD0iMjU0MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NUnJMWVB5MUVkbTE4NXp2djBXTV9RIiBzb3VyY2VFZGdlcz0iX1ZzNGhrUHkxRWRtMTg1enZ2MFdNX1EiIGVsZW1lbnQ9Il9NUmUtSVB5MUVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX01SckxZX3kxRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkNvbW1lbnRCb2R5IiBlbGVtZW50PSJfTVJlLUlQeTFFZG0xODV6dnYwV01fUSIvPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9NUnJMWWZ5MUVkbTE4NXp2djBXTV9RIiBmaWxsQ29sb3I9IjE2NzYzODUwIiBsaW5lQ29sb3I9IjE2NzQ0NTc2IiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTVJyTFl2eTFFZG0xODV6dnYwV01fUSIgeD0iNDE2NTgiIHk9IjEwODEyIiB3aWR0aD0iMzE3NSIgaGVpZ2h0PSI1NDMyIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1hKQzlrUHkxRWRtMTg1enZ2MFdNX1EiIHNvdXJjZUVkZ2VzPSJfbU5LZEFQeTFFZG0xODV6dnYwV01fUSIgZWxlbWVudD0iX1hJd3BzUHkxRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWEpDOWtfeTFFZG0xODV6dnYwV01fUSIgdHlwZT0iQ29tbWVudEJvZHkiIGVsZW1lbnQ9Il9YSXdwc1B5MUVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1hKQzlrZnkxRWRtMTg1enZ2MFdNX1EiIGZpbGxDb2xvcj0iMTY3NjM4NTAiIGxpbmVDb2xvcj0iMTY3NDQ1NzYiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9YSkM5a3Z5MUVkbTE4NXp2djBXTV9RIiB4PSIyMjI2MCIgeT0iMTExMzAiIHdpZHRoPSI1NzE1IiBoZWlnaHQ9IjQ3NjIiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdkExU0VQeTFFZG0xODV6dnYwV01fUSIgc291cmNlRWRnZXM9Il95S283b1B5MUVkbTE4NXp2djBXTV9RIF95cGV6d1B5MUVkbTE4NXp2djBXTV9RIiBlbGVtZW50PSJfdkFXdzhQeTFFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il92QTFTRV95MUVkbTE4NXp2djBXTV9RIiB0eXBlPSJDb21tZW50Qm9keSIgZWxlbWVudD0iX3ZBV3c4UHkxRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfdkExU0VmeTFFZG0xODV6dnYwV01fUSIgZmlsbENvbG9yPSIxNjc2Mzg1MCIgbGluZUNvbG9yPSIxNjc0NDU3NiIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3ZBMVNFdnkxRWRtMTg1enZ2MFdNX1EiIHg9IjE2ODI2IiB5PSI5OTAwIiB3aWR0aD0iNDQ3MSIgaGVpZ2h0PSIxMjcwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NoZTFNUHk0RWRtMTg1enZ2MFdNX1EiIHNvdXJjZUVkZ2VzPSJfU2pmQVdQeTRFZG0xODV6dnYwV01fUSIgdGFyZ2V0RWRnZXM9Il9TamZBVVB5NEVkbTE4NXp2djBXTV9RIF9jWVNpUV95NEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NoZTFNX3k0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlcltqY3VebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9TaGUxTlB5NEVkbTE4NXp2djBXTV9RIiB3aWR0aD0iNTMwIiBoZWlnaHQ9IjUzMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU2hlMU5meTRFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TaGUxTnZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXJbamN1Xm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NoZTFOX3k0RWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlcltqY3VebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU2hlMU9QeTRFZG0xODV6dnYwV01fUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9TaGUxT2Z5NEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TaGUxT3Z5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1NoZTFPX3k0RWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXJbamN1Xm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NoZTFQUHk0RWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1NoZTFQZnk0RWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXJbamN1Xm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ2xhc3NpZmllclN0eWxlIiB4bWk6aWQ9Il9TaGUxTWZ5NEVkbTE4NXp2djBXTV9RIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiIHVzZUNsYXNzaWZpZXJTaGFwZT0idHJ1ZSIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXJbamN1Xm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfU2hlMU12eTRFZG0xODV6dnYwV01fUSIgeD0iNDk2MDgiIHk9IjE4NDQ0Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NUNXhnUHk0RWRtMTg1enZ2MFdNX1EiIHNvdXJjZUVkZ2VzPSJfY1lTaVFfeTRFZG0xODV6dnYwV01fUSIgdGFyZ2V0RWRnZXM9Il9jWU1ib2Z5NEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NUXzRJUHk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3JbamN1Xm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuYWN0aW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9jVF80SWZ5NEVkbTE4NXp2djBXTV9RIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jVF80SXZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmFjdGlvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NUXzRJX3k0RWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3JbamN1Xm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuYWN0aW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY1RfNEpQeTRFZG0xODV6dnYwV01fUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9jVF80SmZ5NEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcltqY3VebmFtZT1Db21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5hY3Rpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jVF80SnZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2NUXzRKX3k0RWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmFjdGlvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NUXzRLUHk0RWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2NUXzRLZnk0RWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmFjdGlvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NUXzRLdnk0RWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9jVF80S195NEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcltqY3VebmFtZT1Db21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5hY3Rpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2NUNXhnZnk0RWRtMTg1enZ2MFdNX1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmFjdGlvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfY1Q1eGd2eTRFZG0xODV6dnYwV01fUSIgeD0iNTIwMzQiIHk9IjEwNzU5IiB3aWR0aD0iODgwNCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xbi03SVB5NEVkbTE4NXp2djBXTV9RIiBzb3VyY2VFZGdlcz0iX3FxanVDUHk0RWRtMTg1enZ2MFdNX1EiIHRhcmdldEVkZ2VzPSJfcXFqdUFQeTRFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xbi03SV95NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uU29ydGVyW2pjdV5uYW1lPUNvbW1vblNvcnRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3FuLTdKUHk0RWRtMTg1enZ2MFdNX1EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FuLTdKZnk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25Tb3J0ZXJbamN1Xm5hbWU9Q29tbW9uU29ydGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FuLTdKdnk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25Tb3J0ZXJbamN1Xm5hbWU9Q29tbW9uU29ydGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FuLTdKX3k0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcW4tN0tQeTRFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25Tb3J0ZXJbamN1Xm5hbWU9Q29tbW9uU29ydGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FuLTdLZnk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcW4tN0t2eTRFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25Tb3J0ZXJbamN1Xm5hbWU9Q29tbW9uU29ydGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FuLTdLX3k0RWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3FuLTdMUHk0RWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uU29ydGVyW2pjdV5uYW1lPUNvbW1vblNvcnRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xbi03TGZ5NEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcW4tN0x2eTRFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25Tb3J0ZXJbamN1Xm5hbWU9Q29tbW9uU29ydGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfcW4tN0lmeTRFZG0xODV6dnYwV01fUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25Tb3J0ZXJbamN1Xm5hbWU9Q29tbW9uU29ydGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcW4tN0l2eTRFZG0xODV6dnYwV01fUSIgeD0iMTM3MDUiIHk9IjI1MTM1Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzF1Y1NNUHk0RWRtMTg1enZ2MFdNX1EiIHRhcmdldEVkZ2VzPSJfMXhUWThQeTRFZG0xODV6dnYwV01fUSBfOE0xUjhQeTRFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8xdWNTTV95NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbFtqY3VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iXzF1Y1NOUHk0RWRtMTg1enZ2MFdNX1EiIHdpZHRoPSI1MzAiIGhlaWdodD0iNTMwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8xdWNTTmZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbFtqY3VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8xdWNTTnZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbFtqY3VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8xdWNTTl95NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbFtqY3VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8xdWNTT1B5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzF1Y1NPZnk0RWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbFtqY3VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8xdWNTT3Z5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzF1Y1NPX3k0RWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbFtqY3VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8xdWNTUFB5NEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8xdWNTUGZ5NEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUV4dGVuc2lvblN0YXRlTW9kZWxbamN1Xm5hbWU9SUV4dGVuc2lvblN0YXRlTW9kZWwuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDbGFzc2lmaWVyU3R5bGUiIHhtaTppZD0iXzF1Y1NNZnk0RWRtMTg1enZ2MFdNX1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIgdXNlQ2xhc3NpZmllclNoYXBlPSJ0cnVlIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlFeHRlbnNpb25TdGF0ZU1vZGVsW2pjdV5uYW1lPUlFeHRlbnNpb25TdGF0ZU1vZGVsLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMXVjU012eTRFZG0xODV6dnYwV01fUSIgeD0iNDQ1MiIgeT0iMTc0OTAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOE1FYzhQeTRFZG0xODV6dnYwV01fUSIgc291cmNlRWRnZXM9Il84TTFSOFB5NEVkbTE4NXp2djBXTV9RIF9FOUVZZ1B5NUVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzhNS2prUHk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfOE1LamtmeTRFZG0xODV6dnYwV01fUSIgd2lkdGg9IjUzMCIgaGVpZ2h0PSI1MzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzhNS2prdnk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzhNS2prX3k0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzhNS2psUHk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzhNS2psZnk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOE1Lamx2eTRFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzhNS2psX3k0RWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOE1Lam1QeTRFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzhNS2ptZnk0RWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzhNS2ptdnk0RWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JQ29tbW9uTGFiZWxQcm92aWRlcltqY3VebmFtZT1JQ29tbW9uTGFiZWxQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENsYXNzaWZpZXJTdHlsZSIgeG1pOmlkPSJfOE1FYzhmeTRFZG0xODV6dnYwV01fUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIiB1c2VDbGFzc2lmaWVyU2hhcGU9InRydWUiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUNvbW1vbkxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9SUNvbW1vbkxhYmVsUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il84TUVjOHZ5NEVkbTE4NXp2djBXTV9RIiB4PSI0MjI5NCIgeT0iMjE2MjQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTdLVUFQeTVFZG0xODV6dnYwV01fUSIgdGFyZ2V0RWRnZXM9Il9FOUVZZ1B5NUVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3S1VBX3k1RWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRTdLVUJQeTVFZG0xODV6dnYwV01fUSIgd2lkdGg9IjUzMCIgaGVpZ2h0PSI1MzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3S1VCZnk1RWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3S1VCdnk1RWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3S1VCX3k1RWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3S1VDUHk1RWRtMTg1enZ2MFdNX1EiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRTdLVUNmeTVFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3S1VDdnk1RWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRTdLVUNfeTVFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3S1VEUHk1RWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0U3S1VEZnk1RWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRGVzY3JpcHRpb25Qcm92aWRlcltqY3VebmFtZT1JRGVzY3JpcHRpb25Qcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENsYXNzaWZpZXJTdHlsZSIgeG1pOmlkPSJfRTdLVUFmeTVFZG0xODV6dnYwV01fUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIiB1c2VDbGFzc2lmaWVyU2hhcGU9InRydWUiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SURlc2NyaXB0aW9uUHJvdmlkZXJbamN1Xm5hbWU9SURlc2NyaXB0aW9uUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9FN0tVQXZ5NUVkbTE4NXp2djBXTV9RIiB4PSI0MjYxMiIgeT0iMTgxMjYiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX1NXWDNVMzVHRWRtNzk3c3ppa0hqb1EiLz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9nbUp2d0g1R0VkbTc5N3N6aWtIam9RIiBzb3VyY2U9Il9ZSWlxUUg1R0VkbTc5N3N6aWtIam9RIiB0YXJnZXQ9Il9nWXlDSUg1R0VkbTc5N3N6aWtIam9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2dtSnZ3MzVHRWRtNzk3c3ppa0hqb1EiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2dtUDJZSDVHRWRtNzk3c3ppa0hqb1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2dtUDJZbjVHRWRtNzk3c3ppa0hqb1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2dtUDJZWDVHRWRtNzk3c3ppa0hqb1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZ21KdnhINUdFZG03OTdzemlrSGpvUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfZ21KdndYNUdFZG03OTdzemlrSGpvUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfZ21KdnduNUdFZG03OTdzemlrSGpvUSIgcG9pbnRzPSJbLTE0LCAzNDEzLCAtNjgwMCwgLTQ1NzddJFs2Nzg2LCA1MDAwLCAwLCAtMjk5MF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfZ21QMlkzNUdFZG03OTdzemlrSGpvUSIgc291cmNlPSJfZ1l5Q0lINUdFZG03OTdzemlrSGpvUSIgdGFyZ2V0PSJfWUlpcVFINUdFZG03OTdzemlrSGpvUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nbVAyWm41R0VkbTc5N3N6aWtIam9RIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nbVAyYUg1R0VkbTc5N3N6aWtIam9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nbVAyYW41R0VkbTc5N3N6aWtIam9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nbVAyYVg1R0VkbTc5N3N6aWtIam9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2dtUDJaMzVHRWRtNzk3c3ppa0hqb1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2dtUDJaSDVHRWRtNzk3c3ppa0hqb1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2dtUDJaWDVHRWRtNzk3c3ppa0hqb1EiIHBvaW50cz0iWzAsIC0yOTkwLCA2Nzg2LCA1MDAwXSRbLTY4MDAsIC00NTc3LCAtMTQsIDM0MTNdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3BiaWNFSDVHRWRtNzk3c3ppa0hqb1EiIHNvdXJjZT0iX1lJaXFRSDVHRWRtNzk3c3ppa0hqb1EiIHRhcmdldD0iX3BYMFpzSDVHRWRtNzk3c3ppa0hqb1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcGJpY0UzNUdFZG03OTdzemlrSGpvUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcGJpY0ZYNUdFZG03OTdzemlrSGpvUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uVmlld2VyW2pjdV5uYW1lPUNvbW1vblZpZXdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3BiaWNGMzVHRWRtNzk3c3ppa0hqb1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vblZpZXdlcltqY3VebmFtZT1Db21tb25WaWV3ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9wYmljRm41R0VkbTc5N3N6aWtIam9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25WaWV3ZXJbamN1Xm5hbWU9Q29tbW9uVmlld2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uVmlld2VyW2pjdV5uYW1lPUNvbW1vblZpZXdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcGJpY0ZINUdFZG03OTdzemlrSGpvUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfcGJpY0VYNUdFZG03OTdzemlrSGpvUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25WaWV3ZXJbamN1Xm5hbWU9Q29tbW9uVmlld2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3BiaWNFbjVHRWRtNzk3c3ppa0hqb1EiIHBvaW50cz0iWy0xNCwgMzQxMywgMzE2MSwgLTQ1NzddJFstMzE4OSwgNTAwMCwgLTE0LCAtMjk5MF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfYnBSN01INUlFZG03OTdzemlrSGpvUSIgc291cmNlPSJfZ1l5Q0lINUdFZG03OTdzemlrSGpvUSIgdGFyZ2V0PSJfYmxwX2NINUlFZG03OTdzemlrSGpvUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9icFI3TTM1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9icFI3Tlg1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JwUjdOMzVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYnBSN05uNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JNYW5hZ2VyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYnBSN05INUlFZG03OTdzemlrSGpvUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfYnBSN01YNUlFZG03OTdzemlrSGpvUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9icFI3TW41SUVkbTc5N3N6aWtIam9RIiBwb2ludHM9IlswLCAyOTkwLCAzOTE1LCAtNTkyN10kWy0zOTE2LCA0NTc4LCAtMSwgLTQzMzldIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX2NWbU9vSDVJRWRtNzk3c3ppa0hqb1EiIHNvdXJjZT0iX1lJaXFRSDVHRWRtNzk3c3ppa0hqb1EiIHRhcmdldD0iX2NTMU9nSDVJRWRtNzk3c3ppa0hqb1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY1ZtT28zNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY1ZtT3BYNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jVm1PcDM1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NWbU9wbjVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2NWbU9wSDVJRWRtNzk3c3ppa0hqb1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2NWbU9vWDVJRWRtNzk3c3ppa0hqb1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfY1ZtT29uNUlFZG03OTdzemlrSGpvUSIgcG9pbnRzPSJbLTE0LCAzNDEzLCAxMDAwMSwgLTI1NTg1XSRbLTE0LCAyMTI0NywgMTAwMDEsIC03NzUxXSRbLTEwMDE1LCAyMjgzMywgMCwgLTYxNjVdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX2NWc1ZRSDVJRWRtNzk3c3ppa0hqb1EiIHNvdXJjZT0iX3BYMFpzSDVHRWRtNzk3c3ppa0hqb1EiIHRhcmdldD0iX2NTMU9nSDVJRWRtNzk3c3ppa0hqb1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY1ZzVlEzNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY1ZzVlJYNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25WaWV3ZXJbamN1Xm5hbWU9Q29tbW9uVmlld2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jVnNWUjM1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vblZpZXdlcltqY3VebmFtZT1Db21tb25WaWV3ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NWc1ZSbjVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uVmlld2VyW2pjdV5uYW1lPUNvbW1vblZpZXdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25WaWV3ZXJbamN1Xm5hbWU9Q29tbW9uVmlld2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2NWc1ZSSDVJRWRtNzk3c3ppa0hqb1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2NWc1ZRWDVJRWRtNzk3c3ppa0hqb1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25WaWV3ZXJbamN1Xm5hbWU9Q29tbW9uVmlld2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfY1ZzVlFuNUlFZG03OTdzemlrSGpvUSIgcG9pbnRzPSJbLTE0LCAyOTkwLCA2ODI2LCAtMTgwMThdJFsyNzM4LCA0NTc4LCA5NTc4LCAtMTY0MzBdJFsyNzM4LCAxMzI1NywgOTU3OCwgLTc3NTFdJFstNjg0MCwgMTQ4NDMsIDAsIC02MTY1XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9jVnliNEg1SUVkbTc5N3N6aWtIam9RIiBzb3VyY2U9Il9ibHBfY0g1SUVkbTc5N3N6aWtIam9RIiB0YXJnZXQ9Il9jUzFPZ0g1SUVkbTc5N3N6aWtIam9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NWeWI0MzVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NWeWI1WDVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jVnliNTM1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY1Z5YjVuNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2NWeWI1SDVJRWRtNzk3c3ppa0hqb1EiIHk9IjEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2NWeWI0WDVJRWRtNzk3c3ppa0hqb1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9jVnliNG41SUVkbTc5N3N6aWtIam9RIiBwb2ludHM9IlsyNiwgMjk2MywgMTYzMjUsIC02MjQ0XSRbMjYsIDY1NjIsIDE2MzI1LCAtMjY0NV0kWy0xMzMzNSwgNjU2MiwgMjk2NCwgLTI2NDVdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3pSYURFSDVJRWRtNzk3c3ppa0hqb1EiIHNvdXJjZT0iX2NTMU9nSDVJRWRtNzk3c3ppa0hqb1EiIHRhcmdldD0iX3pQVHhVSDVJRWRtNzk3c3ppa0hqb1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfelJhREUzNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfelJhREZYNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfelJhREYzNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfelJhREZuNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96UmFERkg1SUVkbTc5N3N6aWtIam9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il96UmFERVg1SUVkbTc5N3N6aWtIam9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il96UmFERW41SUVkbTc5N3N6aWtIam9RIiBwb2ludHM9IlswLCAtNjE2NSwgMTQ1NjUsIDU5MjZdJFstMTQ1NzksIC03NzUyLCAtMTQsIDQzMzldIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3pSYURHSDVJRWRtNzk3c3ppa0hqb1EiIHNvdXJjZT0iX3pQVHhVSDVJRWRtNzk3c3ppa0hqb1EiIHRhcmdldD0iX2NTMU9nSDVJRWRtNzk3c3ppa0hqb1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfelJhREczNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfelJhREhYNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfelJhREgzNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfelJhREhuNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96UmFESEg1SUVkbTc5N3N6aWtIam9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il96UmFER1g1SUVkbTc5N3N6aWtIam9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il96UmFER241SUVkbTc5N3N6aWtIam9RIiBwb2ludHM9IlstMTQsIDQzMzksIC0xNDU3OSwgLTc3NTJdJFsxNDU2NSwgNTkyNiwgMCwgLTYxNjVdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iXzJJQkQwSDVJRWRtNzk3c3ppa0hqb1EiIHNvdXJjZT0iX2NTMU9nSDVJRWRtNzk3c3ppa0hqb1EiIHRhcmdldD0iXzJGMHJjSDVJRWRtNzk3c3ppa0hqb1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMklCRDAzNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMklCRDFYNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlTGFiZWxQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8ySUJEMTM1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlTGFiZWxQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJJQkQxbjVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlTGFiZWxQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzJJQkQxSDVJRWRtNzk3c3ppa0hqb1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzJJQkQwWDVJRWRtNzk3c3ppa0hqb1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlTGFiZWxQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfMklCRDBuNUlFZG03OTdzemlrSGpvUSIgcG9pbnRzPSJbMCwgLTYxNjUsIDY1MDksIDU5MjZdJFstNjUwOSwgLTc3NTIsIDAsIDQzMzldIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iXzJJQkQySDVJRWRtNzk3c3ppa0hqb1EiIHNvdXJjZT0iXzJGMHJjSDVJRWRtNzk3c3ppa0hqb1EiIHRhcmdldD0iX2NTMU9nSDVJRWRtNzk3c3ppa0hqb1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMklCRDIzNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMklCRDNYNUlFZG03OTdzemlrSGpvUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8ySUJEMzM1SUVkbTc5N3N6aWtIam9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlTGFiZWxQcm92aWRlcltqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJJQkQzbjVJRWRtNzk3c3ppa0hqb1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlTGFiZWxQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzJJQkQzSDVJRWRtNzk3c3ppa0hqb1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzJJQkQyWDVJRWRtNzk3c3ppa0hqb1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfMklCRDJuNUlFZG03OTdzemlrSGpvUSIgcG9pbnRzPSJbMCwgNDMzOSwgLTY1MDksIC03NzUyXSRbNjUwOSwgNTkyNiwgMCwgLTYxNjVdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX1NUQ0dVZnkwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iX2NTMU9nSDVJRWRtNzk3c3ppa0hqb1EiIHRhcmdldD0iX1NMcmhJUHkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU1RDR1ZQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU1RJTThQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU1RJTTh2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU1RJTThmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9TVENHVmZ5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9TVENHVXZ5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9TVENHVV95MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlswLCA2MTY1LCAzNjEyLCAtNjMzN10kWy0zNjI1LCA3NzUyLCAtMTMsIC00NzUwXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9TVElOQV95MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9TSncxa1B5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9TTHJoSVB5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NUSU5CdnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NUSU5DUHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5W2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvcltqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TVE9Ua2Z5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeVtqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU1RPVGtQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnlbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5W2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvcltqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1NUSU5CX3kwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1NUSU5CUHkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnlbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9TVElOQmZ5MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlswLCA2MTY1LCAtMzYzOCwgLTYzMzddJFszNjI1LCA3NzUyLCAtMTMsIC00NzUwXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9TVE9Ua3Z5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9TSncxa1B5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9TSncxa1B5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NUT1RsZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NUT1RsX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5W2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5W2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU1RPVG1meTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnlbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnlbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TVE9UbVB5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeVtqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeVtqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5W2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5W2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9TVE9UbHZ5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9TVE9Ua195MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5W2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5W2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1NUT1RsUHkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzAsIDAsIDAsIDBdJFswLCAwLCAwLCAwXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9VWkhwRVB5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9jUzFPZ0g1SUVkbTc5N3N6aWtIam9RIiB0YXJnZXQ9Il9VWGxfRVB5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VaSHBFX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VaTnZzUHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbXBsZW1lbnRhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqaW1wbF52Y29yZS50YXJnZXQ9dW1sMi5JbXBsZW1lbnRhdGlvbltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcltqY3VebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VWk52c2Z5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW1wbGVtZW50YXRpb24iIGhyZWY9InZpenJlZjovLy8jamltcGxedmNvcmUudGFyZ2V0PXVtbDIuSW1wbGVtZW50YXRpb25banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXJbamN1Xm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkltcGxlbWVudGF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2ppbXBsXnZjb3JlLnRhcmdldD11bWwyLkltcGxlbWVudGF0aW9uW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyW2pjdV5uYW1lPUlFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfVVpIcEZQeTBFZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfVVpIcEVmeTBFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW1wbGVtZW50YXRpb24iIGhyZWY9InZpenJlZjovLy8jamltcGxedmNvcmUudGFyZ2V0PXVtbDIuSW1wbGVtZW50YXRpb25banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXJbamN1Xm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1VaSHBFdnkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzAsIDYxNjUsIC0zNDAwLCAtNjMzN10kWzMzODcsIDc3NTIsIC0xMywgLTQ3NTBdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX1VaTnZzdnkwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iX2NTMU9nSDVJRWRtNzk3c3ppa0hqb1EiIHRhcmdldD0iX1VUWTBnUHkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVpOdnRmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVpOdnRfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VWk52dWZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VaTnZ1UHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1VaTnZ0dnkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1VaTnZzX3kwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfVVpOdnRQeTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMCwgLTYxNjUsIC0zMzg3LCA1OTI2XSRbMzM4NywgLTc3NTIsIDAsIDQzMzldIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX1VaTnZ1dnkwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iX1VUWTBnUHkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldD0iX1VYbF9FUHkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVpOdnZmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVpOdnZfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcltqY3VebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VWk52d2Z5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyW2pjdV5uYW1lPUlFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VaTnZ3UHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXJbamN1Xm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcltqY3VebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1VaTnZ2dnkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1VaTnZ1X3kwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcltqY3VebmFtZT1JRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfVVpOdnZQeTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMCwgNDMzOSwgLTEzLCAtMjAyNTRdJFswLCAxOTg0MywgLTEzLCAtNDc1MF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfVVpOdnd2eTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfVVRZMGdQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfY1MxT2dINUlFZG03OTdzemlrSGpvUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VWlQyVVB5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VWlQyVXZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VaVDJWUHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVpUMlVfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfVVpUMlVmeTBFZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfVVpOdndfeTBFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9VWk52eFB5MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlswLCA0MzM5LCAzMzg3LCAtNzc1Ml0kWy0zMzg3LCA1OTI2LCAwLCAtNjE2NV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfVVpUMlZmeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfVVRZMGdQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfVVRZMGdQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VWlQyV1B5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VWlQyV3Z5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVpUMlhQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VaVDJXX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9VWlQyV2Z5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9VWlQyVnZ5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfVVpUMlZfeTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3c5WHNzUHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlJlZmVyZW5jZSIgc291cmNlPSJfbWg0bFFQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfZ1l5Q0lINUdFZG03OTdzemlrSGpvUSI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il93OVhzc2Z5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfdzlYc3N2eTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMCwgMzQxMywgMCwgLTQ1NzddJFswLCA1MDAwLCAwLCAtMjk5MF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfS2hwWU1QeTFFZG0xODV6dnYwV01fUSIgdHlwZT0iUmVmZXJlbmNlIiBzb3VyY2U9Il9BRGZYUVB5MUVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9VVFkwZ1B5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0tocFlNZnkxRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9LaHBZTXZ5MUVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlstMTMsIDI5OTAsIC0yNTkzLCAtNTkyN10kWzI1ODAsIDQ1NzgsIDAsIC00MzM5XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9WczRoa1B5MUVkbTE4NXp2djBXTV9RIiB0eXBlPSJSZWZlcmVuY2UiIHNvdXJjZT0iX01SckxZUHkxRWRtMTg1enZ2MFdNX1EiIHRhcmdldD0iX2JscF9jSDVJRWRtNzk3c3ppa0hqb1EiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfVnM0aGtmeTFFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1ZzNGhrdnkxRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWy0xNCwgMjk5MCwgLTg3NCwgLTU5MjddJFs4NTksIDQ1NzgsIC0xLCAtNDMzOV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfbU5LZEFQeTFFZG0xODV6dnYwV01fUSIgdHlwZT0iUmVmZXJlbmNlIiBzb3VyY2U9Il9YSkM5a1B5MUVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9jUzFPZ0g1SUVkbTc5N3N6aWtIam9RIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX21OS2RBZnkxRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9tTktkQXZ5MUVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlsyMTcwLCAyNDM0LCAtNDYwMywgLTcwNjRdJFsyMTcwLCAzNzgyLCAtNDYwMywgLTU3MTZdJFszODEwLCAzNzgyLCAtMjk2MywgLTU3MTZdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3lLbzdvUHkxRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlJlZmVyZW5jZSIgc291cmNlPSJfdkExU0VQeTFFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfelBUeFVINUlFZG03OTdzemlrSGpvUSI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il95S283b2Z5MUVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfeUtvN292eTFFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMCwgMjk5MCwgNDAzNSwgLTU5MjddJFstNDA0OSwgNDU3OCwgLTE0LCAtNDMzOV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfeXBlendQeTFFZG0xODV6dnYwV01fUSIgdHlwZT0iUmVmZXJlbmNlIiBzb3VyY2U9Il92QTFTRVB5MUVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il8yRjByY0g1SUVkbTc5N3N6aWtIam9RIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3lwZXp3ZnkxRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il95cGV6d3Z5MUVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlswLCAyOTkwLCAtNDAyMSwgLTU5MjddJFs0MDIxLCA0NTc4LCAwLCAtNDMzOV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfU2pmQVVQeTRFZG0xODV6dnYwV01fUSIgc291cmNlPSJfYmxwX2NINUlFZG03OTdzemlrSGpvUSIgdGFyZ2V0PSJfU2hlMU1QeTRFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TamZBVV95NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TamZBVmZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlcltqY3VebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TamZBVl95NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlcltqY3VebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TamZBVnZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlcltqY3VebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlcltqY3VebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1NqZkFWUHk0RWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1NqZkFVZnk0RWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXJbamN1Xm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1NqZkFVdnk0RWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzAsIDAsIDAsIDBdJFswLCAwLCAwLCAwXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9TamZBV1B5NEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9TaGUxTVB5NEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9jUzFPZ0g1SUVkbTc5N3N6aWtIam9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NqZkFXX3k0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NqZkFYZnk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU2psRzhQeTRFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXJbamN1Xm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TamZBWHZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlcltqY3VebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9TamZBWFB5NEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9TamZBV2Z5NEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1NqZkFXdnk0RWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzAsIDAsIDAsIDBdJFswLCAwLCAwLCAwXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9jWU1ib2Z5NEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9ibHBfY0g1SUVkbTc5N3N6aWtIam9RIiB0YXJnZXQ9Il9jVDV4Z1B5NEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NZTWJwUHk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NZU2lRUHk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmFjdGlvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY1lTaVF2eTRFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3JbamN1Xm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuYWN0aW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jWVNpUWZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcltqY3VebmFtZT1Db21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5hY3Rpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmFjdGlvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jWU1icGZ5NEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9jWU1ib3Z5NEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQWN0aW9uU2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmFjdGlvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2NZTWJvX3k0RWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzAsIDAsIDAsIDBdJFswLCAwLCAwLCAwXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9jWVNpUV95NEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9jVDV4Z1B5NEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9TaGUxTVB5NEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NZU2lSdnk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NZU2lTUHk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmFjdGlvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NZU2lTdnk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmFjdGlvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NZU2lTZnk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmFjdGlvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmFjdGlvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUNvbW1vbkFjdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY1lTaVJfeTRFZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfY1lTaVJQeTRFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcltqY3VebmFtZT1Db21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5hY3Rpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlDb21tb25BY3Rpb25Qcm92aWRlcltqY3VebmFtZT1JQ29tbW9uQWN0aW9uUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfY1lTaVJmeTRFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3FxanVBUHk0RWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iX1lJaXFRSDVHRWRtNzk3c3ppa0hqb1EiIHRhcmdldD0iX3FuLTdJUHk0RWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcXFqdUFfeTRFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcXFqdUJmeTRFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uU29ydGVyW2pjdV5uYW1lPUNvbW1vblNvcnRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FxanVCX3k0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vblNvcnRlcltqY3VebmFtZT1Db21tb25Tb3J0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xcWp1QnZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25Tb3J0ZXJbamN1Xm5hbWU9Q29tbW9uU29ydGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uU29ydGVyW2pjdV5uYW1lPUNvbW1vblNvcnRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcXFqdUJQeTRFZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfcXFqdUFmeTRFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25Tb3J0ZXJbamN1Xm5hbWU9Q29tbW9uU29ydGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3FxanVBdnk0RWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWy0yMjQ5LCAzNDM5LCAxNzI1MSwgLTE5MTU2XSRbLTIyNDksIDM2NDU5LCAxNzI1MSwgMTM4NjRdJFstMTk0NzMsIDM2NDU5LCAyNywgMTM4NjRdJFstMTk0NzMsIDI0OTc2LCAyNywgMjM4MV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfcXFqdUNQeTRFZG0xODV6dnYwV01fUSIgc291cmNlPSJfcW4tN0lQeTRFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfY1MxT2dINUlFZG03OTdzemlrSGpvUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xcWp1Q195NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xcWp1RGZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vblNvcnRlcltqY3VebmFtZT1Db21tb25Tb3J0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FxanVEX3k0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uU29ydGVyW2pjdV5uYW1lPUNvbW1vblNvcnRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcXFqdUR2eTRFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Tb3J0ZXJbamN1Xm5hbWU9Q29tbW9uU29ydGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vblNvcnRlcltqY3VebmFtZT1Db21tb25Tb3J0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcXFqdURQeTRFZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfcXFqdUNmeTRFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vblNvcnRlcltqY3VebmFtZT1Db21tb25Tb3J0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9xcWp1Q3Z5NEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfMXhUWThQeTRFZG0xODV6dnYwV01fUSIgc291cmNlPSJfY1MxT2dINUlFZG03OTdzemlrSGpvUSIgdGFyZ2V0PSJfMXVjU01QeTRFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8xeFRZOF95NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8xeFRZOWZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUV4dGVuc2lvblN0YXRlTW9kZWxbamN1Xm5hbWU9SUV4dGVuc2lvblN0YXRlTW9kZWwuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8xeFRZOV95NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUV4dGVuc2lvblN0YXRlTW9kZWxbamN1Xm5hbWU9SUV4dGVuc2lvblN0YXRlTW9kZWwuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8xeFRZOXZ5NEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUV4dGVuc2lvblN0YXRlTW9kZWxbamN1Xm5hbWU9SUV4dGVuc2lvblN0YXRlTW9kZWwuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUV4dGVuc2lvblN0YXRlTW9kZWxbamN1Xm5hbWU9SUV4dGVuc2lvblN0YXRlTW9kZWwuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzF4VFk5UHk0RWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzF4VFk4Znk0RWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZVtqY3VebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlFeHRlbnNpb25TdGF0ZU1vZGVsW2pjdV5uYW1lPUlFeHRlbnNpb25TdGF0ZU1vZGVsLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzF4VFk4dnk0RWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzAsIDAsIDAsIDBdJFswLCAwLCAwLCAwXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il84TTFSOFB5NEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il84TUVjOFB5NEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il8xdWNTTVB5NEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzhNMVI4X3k0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzhNMVI5Znk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SUNvbW1vbkxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9SUNvbW1vbkxhYmVsUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbFtqY3VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzhNMVI5X3k0RWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SUNvbW1vbkxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9SUNvbW1vbkxhYmVsUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbFtqY3VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzhNMVI5dnk0RWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SUNvbW1vbkxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9SUNvbW1vbkxhYmVsUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbFtqY3VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SUNvbW1vbkxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9SUNvbW1vbkxhYmVsUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbFtqY3VebmFtZT1JRXh0ZW5zaW9uU3RhdGVNb2RlbC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfOE0xUjlQeTRFZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfOE0xUjhmeTRFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyW2pjdV5uYW1lPUlDb21tb25MYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUV4dGVuc2lvblN0YXRlTW9kZWxbamN1Xm5hbWU9SUV4dGVuc2lvblN0YXRlTW9kZWwuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfOE0xUjh2eTRFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0U5RVlnUHk1RWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iXzhNRWM4UHk0RWRtMTg1enZ2MFdNX1EiIHRhcmdldD0iX0U3S1VBUHk1RWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTlFWWdfeTVFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTlFWWhmeTVFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JQ29tbW9uTGFiZWxQcm92aWRlcltqY3VebmFtZT1JQ29tbW9uTGFiZWxQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTlFWWh2eTVFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JQ29tbW9uTGFiZWxQcm92aWRlcltqY3VebmFtZT1JQ29tbW9uTGFiZWxQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JQ29tbW9uTGFiZWxQcm92aWRlcltqY3VebmFtZT1JQ29tbW9uTGFiZWxQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyW2pjdV5uYW1lPUlEZXNjcmlwdGlvblByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9FOUVZaFB5NUVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9FOUVZZ2Z5NUVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SUNvbW1vbkxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9SUNvbW1vbkxhYmVsUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRGVzY3JpcHRpb25Qcm92aWRlcltqY3VebmFtZT1JRGVzY3JpcHRpb25Qcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9FOUVZZ3Z5NUVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgPC9jb250ZW50cz4KLSAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzBMdzdvSU93RWRteWQtLWNYbHJxeVEiIHR5cGU9IkNvbXBvbmVudCIgbmFtZT0iRXh0ZW5zaW9uIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQUJnRUlPMEVkbXlkLS1jWGxycXlRIiB0eXBlPSJyZWN0YW5nbGUiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FCZ0U0TzBFZG15ZC0tY1hscnF5USIgdHlwZT0iRGlhZ3JhbU5hbWUiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dBQmdGSU8wRWRteWQtLWNYbHJxeVEiIHR5cGU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0dBQmdFWU8wRWRteWQtLWNYbHJxeVEiIGZpbGxDb2xvcj0iMTMzNjkzNDMiIGxpbmVDb2xvcj0iNjczNzE1MSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HQUJnRW9PMEVkbXlkLS1jWGxycXlRIiB4PSIxNDMxMCIgeT0iNjA0MiIgd2lkdGg9IjYwNTgiIGhlaWdodD0iODI1NCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iZFJoUUlPekVkbXlkLS1jWGxycXlRIiB0eXBlPSJyZWN0YW5nbGUiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYmRSaFE0T3pFZG15ZC0tY1hscnF5USIgdHlwZT0iRGlhZ3JhbU5hbWUiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JkUmhSSU96RWRteWQtLWNYbHJxeVEiIHR5cGU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX2JkUmhRWU96RWRteWQtLWNYbHJxeVEiIGZpbGxDb2xvcj0iMTM0MjA0NDMiIGxpbmVDb2xvcj0iNjczNzE1MSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9iZFJoUW9PekVkbXlkLS1jWGxycXlRIiB4PSI2MzYiIHk9IjYzNTAiIHdpZHRoPSI1NzE1IiBoZWlnaHQ9Ijc5MzciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdVg1aXdJTzBFZG15ZC0tY1hscnF5USIgdHlwZT0icmVjdGFuZ2xlIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3VYNWl3NE8wRWRteWQtLWNYbHJxeVEiIHR5cGU9IkRpYWdyYW1OYW1lIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91WDVpeElPMEVkbXlkLS1jWGxycXlRIiB0eXBlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il91WDVpd1lPMEVkbXlkLS1jWGxycXlRIiBmaWxsQ29sb3I9IjEzMzY5MzQzIiBsaW5lQ29sb3I9IjY3MzcxNTEiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdVg1aXdvTzBFZG15ZC0tY1hscnF5USIgeD0iNjM1IiB5PSI5NTI1IiB3aWR0aD0iNTcxNCIgaGVpZ2h0PSIyMjIyIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1DdzE4SU93RWRteWQtLWNYbHJxeVEiIHRhcmdldEVkZ2VzPSJfRGV5a1VJT3lFZG15ZC0tY1hscnF5USIgZWxlbWVudD0iXzkzMzBrSU93RWRteWQtLWNYbHJxeVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLURQWEVJT3dFZG15ZC0tY1hscnF5USIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzkzMzBrSU93RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1EUFhFWU93RWRteWQtLWNYbHJxeVEiIHR5cGU9IktpbmQiIGVsZW1lbnQ9Il85MzMwa0lPd0VkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tRFBYRW9Pd0VkbXlkLS1jWGxycXlRIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfOTMzMGtJT3dFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLURQWEU0T3dFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfOTMzMGtJT3dFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1EUFhGSU93RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1EUFhGWU93RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzkzMzBrSU93RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8tRFBYRm9Pd0VkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tRFBYRjRPd0VkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUmVhbGl6YXRpb25MaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il85MzMwa0lPd0VkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfLURQWEdJT3dFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLURWZHNJT3dFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlJlcXVpcmVkSW50ZXJmYWNlTGlzdENvbXBhcnRtZW50IiBlbGVtZW50PSJfOTMzMGtJT3dFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1EVmRzWU93RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1EVmRzb093RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQcm92aWRlZEludGVyZmFjZUxpc3RDb21wYXJ0bWVudCIgZWxlbWVudD0iXzkzMzBrSU93RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8tRFZkczRPd0VkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tRFZkdElPd0VkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il85MzMwa0lPd0VkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1EVmR0WU93RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29tcG9uZW50U3R5bGUiIHhtaTppZD0iXy1DdzE4WU93RWRteWQtLWNYbHJxeVEiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8tQ3cxOG9Pd0VkbXlkLS1jWGxycXlRIiB4PSIxMDg2IiB5PSIxMjQwMiIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9YNGhUQUlPeEVkbXlkLS1jWGxycXlRIiBzb3VyY2VFZGdlcz0iX2dTNDNRSU94RWRteWQtLWNYbHJxeVEiIGVsZW1lbnQ9Il9YNEk0Z0lPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1g0b0FzSU94RWRteWQtLWNYbHJxeVEiIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il9YNEk0Z0lPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9YNG9Bc1lPeEVkbXlkLS1jWGxycXlRIiB0eXBlPSJLaW5kIiBlbGVtZW50PSJfWDRJNGdJT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWDRvQXNvT3hFZG15ZC0tY1hscnF5USIgdHlwZT0iTmFtZSIgZWxlbWVudD0iX1g0STRnSU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1g0b0FzNE94RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCIgZWxlbWVudD0iX1g0STRnSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9YNG9BdElPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9YNG9BdFlPeEVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9YNEk0Z0lPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfWDRvQXRvT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWDRvQXQ0T3hFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlJlYWxpemF0aW9uTGlzdENvbXBhcnRtZW50IiBlbGVtZW50PSJfWDRJNGdJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1g0b0F1SU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1g0b0F1WU94RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJSZXF1aXJlZEludGVyZmFjZUxpc3RDb21wYXJ0bWVudCIgZWxlbWVudD0iX1g0STRnSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9YNG9BdW9PeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9YNG9BdTRPeEVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUHJvdmlkZWRJbnRlcmZhY2VMaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il9YNEk0Z0lPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfWDRvQXZJT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWDRvQXZZT3hFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfWDRJNGdJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9YNG9Bdm9PeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbXBvbmVudFN0eWxlIiB4bWk6aWQ9Il9YNGhUQVlPeEVkbXlkLS1jWGxycXlRIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfWDRoVEFvT3hFZG15ZC0tY1hscnF5USIgeD0iOTU0IiB5PSI5ODU4Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2I3SmE4SU94RWRteWQtLWNYbHJxeVEiIHRhcmdldEVkZ2VzPSJfZ1M0M1FJT3hFZG15ZC0tY1hscnF5USBfQWJyWW9JT3lFZG15ZC0tY1hscnF5USIgZWxlbWVudD0iX2I2TVlzSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYjdKYTg0T3hFZG15ZC0tY1hscnF5USIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iX2I2TVlzSU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2I3SmE5SU94RWRteWQtLWNYbHJxeVEiIHR5cGU9IktpbmQiIGVsZW1lbnQ9Il9iNk1Zc0lPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iN0phOVlPeEVkbXlkLS1jWGxycXlRIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfYjZNWXNJT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYjdKYTlvT3hFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfYjZNWXNJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2I3SmE5NE94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2I3SmEtSU94RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iX2I2TVlzSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9iN0phLVlPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iN0phLW9PeEVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUmVhbGl6YXRpb25MaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il9iNk1Zc0lPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfYjdKYS00T3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYjdKYV9JT3hFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlJlcXVpcmVkSW50ZXJmYWNlTGlzdENvbXBhcnRtZW50IiBlbGVtZW50PSJfYjZNWXNJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2I3SmFfWU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2I3SmFfb094RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQcm92aWRlZEludGVyZmFjZUxpc3RDb21wYXJ0bWVudCIgZWxlbWVudD0iX2I2TVlzSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9iN0phXzRPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iN0piQUlPeEVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9iNk1Zc0lPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2I3SmJBWU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29tcG9uZW50U3R5bGUiIHhtaTppZD0iX2I3SmE4WU94RWRteWQtLWNYbHJxeVEiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9iN0phOG9PeEVkbXlkLS1jWGxycXlRIiB4PSIxNTkwIiB5PSI3MDIxIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2podl84SU94RWRteWQtLWNYbHJxeVEiIHRhcmdldEVkZ2VzPSJfbUpLdUlJT3hFZG15ZC0tY1hscnF5USBfSnNxYjBJT3lFZG15ZC0tY1hscnF5USIgZWxlbWVudD0iX2poanlzSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfamh2Xzg0T3hFZG15ZC0tY1hscnF5USIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iX2poanlzSU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2podl85SU94RWRteWQtLWNYbHJxeVEiIHR5cGU9IktpbmQiIGVsZW1lbnQ9Il9qaGp5c0lPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9qaHZfOVlPeEVkbXlkLS1jWGxycXlRIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfamhqeXNJT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfamh2XzlvT3hFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfamhqeXNJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2podl85NE94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2podl8tSU94RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iX2poanlzSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9qaHZfLVlPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9qaHZfLW9PeEVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUmVhbGl6YXRpb25MaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il9qaGp5c0lPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfamh2Xy00T3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfamh2X19JT3hFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlJlcXVpcmVkSW50ZXJmYWNlTGlzdENvbXBhcnRtZW50IiBlbGVtZW50PSJfamhqeXNJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2podl9fWU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2podl9fb094RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQcm92aWRlZEludGVyZmFjZUxpc3RDb21wYXJ0bWVudCIgZWxlbWVudD0iX2poanlzSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9qaHZfXzRPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9qaHdBQUlPeEVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9qaGp5c0lPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2pod0FBWU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29tcG9uZW50U3R5bGUiIHhtaTppZD0iX2podl84WU94RWRteWQtLWNYbHJxeVEiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9qaHZfOG9PeEVkbXlkLS1jWGxycXlRIiB4PSIxNTcxMyIgeT0iOTYzMSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rZER4b0lPeEVkbXlkLS1jWGxycXlRIiBzb3VyY2VFZGdlcz0iX21KS3VJSU94RWRteWQtLWNYbHJxeVEiIGVsZW1lbnQ9Il9rYzNrWUlPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tkRHhvNE94RWRteWQtLWNYbHJxeVEiIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il9rYzNrWUlPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rZER4cElPeEVkbXlkLS1jWGxycXlRIiB0eXBlPSJLaW5kIiBlbGVtZW50PSJfa2Mza1lJT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa2REeHBZT3hFZG15ZC0tY1hscnF5USIgdHlwZT0iTmFtZSIgZWxlbWVudD0iX2tjM2tZSU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tkRHhwb094RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCIgZWxlbWVudD0iX2tjM2tZSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rZER4cDRPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rZER4cUlPeEVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9rYzNrWUlPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa2REeHFZT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa2REeHFvT3hFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlJlYWxpemF0aW9uTGlzdENvbXBhcnRtZW50IiBlbGVtZW50PSJfa2Mza1lJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tkRHhxNE94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tkRHhySU94RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJSZXF1aXJlZEludGVyZmFjZUxpc3RDb21wYXJ0bWVudCIgZWxlbWVudD0iX2tjM2tZSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rZER4cllPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rZER4cm9PeEVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUHJvdmlkZWRJbnRlcmZhY2VMaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il9rYzNrWUlPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa2REeHI0T3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa2REeHNJT3hFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfa2Mza1lJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rZER4c1lPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbXBvbmVudFN0eWxlIiB4bWk6aWQ9Il9rZER4b1lPeEVkbXlkLS1jWGxycXlRIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfa2REeG9vT3hFZG15ZC0tY1hscnF5USIgeD0iMTQ5NzIiIHk9IjEyNDA4Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX21vcjdzSU94RWRteWQtLWNYbHJxeVEiIHRhcmdldEVkZ2VzPSJfTGRLd0lJT3lFZG15ZC0tY1hscnF5USIgZWxlbWVudD0iX21vbDFFSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbW9yN3M0T3hFZG15ZC0tY1hscnF5USIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iX21vbDFFSU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX21vcjd0SU94RWRteWQtLWNYbHJxeVEiIHR5cGU9IktpbmQiIGVsZW1lbnQ9Il9tb2wxRUlPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9tb3I3dFlPeEVkbXlkLS1jWGxycXlRIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfbW9sMUVJT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbW9yN3RvT3hFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfbW9sMUVJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX21vcjd0NE94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX21vcjd1SU94RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iX21vbDFFSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9tb3I3dVlPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9tb3I3dW9PeEVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUmVhbGl6YXRpb25MaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il9tb2wxRUlPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbW9yN3U0T3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbW95Q1VJT3hFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlJlcXVpcmVkSW50ZXJmYWNlTGlzdENvbXBhcnRtZW50IiBlbGVtZW50PSJfbW9sMUVJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX21veUNVWU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX21veUNVb094RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQcm92aWRlZEludGVyZmFjZUxpc3RDb21wYXJ0bWVudCIgZWxlbWVudD0iX21vbDFFSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9tb3lDVTRPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9tb3lDVklPeEVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9tb2wxRUlPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX21veUNWWU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29tcG9uZW50U3R5bGUiIHhtaTppZD0iX21vcjdzWU94RWRteWQtLWNYbHJxeVEiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9tb3I3c29PeEVkbXlkLS1jWGxycXlRIiB4PSIxNDgzOSIgeT0iNjc2MiIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il80VHZvTUlPeEVkbXlkLS1jWGxycXlRIiBzb3VyY2VFZGdlcz0iX0FicllvSU95RWRteWQtLWNYbHJxeVEgX0RleWtVSU95RWRteWQtLWNYbHJxeVEgX0pzcWIwSU95RWRteWQtLWNYbHJxeVEgX0xkS3dJSU95RWRteWQtLWNYbHJxeVEgX0lWT1ZnSU8zRWRteWQtLWNYbHJxeVEiIGVsZW1lbnQ9Il80VFhOc0lPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzRUdm9NNE94RWRteWQtLWNYbHJxeVEiIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il80VFhOc0lPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il80VHZvTklPeEVkbXlkLS1jWGxycXlRIiB0eXBlPSJLaW5kIiBlbGVtZW50PSJfNFRYTnNJT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfNFR2b05ZT3hFZG15ZC0tY1hscnF5USIgdHlwZT0iTmFtZSIgZWxlbWVudD0iXzRUWE5zSU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzRUdm9Ob094RWRteWQtLWNYbHJxeVEiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfNFRYTnNJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzRUdm9ONE94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzRUdm9PSU94RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzRUWE5zSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il80VHZvT1lPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il80VHZvT29PeEVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUmVhbGl6YXRpb25MaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il80VFhOc0lPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfNFR2b080T3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfNFR2b1BJT3hFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlJlcXVpcmVkSW50ZXJmYWNlTGlzdENvbXBhcnRtZW50IiBlbGVtZW50PSJfNFRYTnNJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzRUdm9QWU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzRUdm9Qb094RWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQcm92aWRlZEludGVyZmFjZUxpc3RDb21wYXJ0bWVudCIgZWxlbWVudD0iXzRUWE5zSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il80VHZvUDRPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il80VDF1MElPeEVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il80VFhOc0lPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzRUMXUwWU94RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29tcG9uZW50U3R5bGUiIHhtaTppZD0iXzRUdm9NWU94RWRteWQtLWNYbHJxeVEiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il80VHZvTW9PeEVkbXlkLS1jWGxycXlRIiB4PSI3OTIzIiB5PSI4OTgzIiB3aWR0aD0iNDkyMSIgaGVpZ2h0PSIzMjU2Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0RuTjFvSU8wRWRteWQtLWNYbHJxeVEiIHR5cGU9InJlY3RhbmdsZSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Ebk4xbzRPMEVkbXlkLS1jWGxycXlRIiB0eXBlPSJEaWFncmFtTmFtZSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRG5OMXBJTzBFZG15ZC0tY1hscnF5USIgdHlwZT0iRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfRG5OMW9ZTzBFZG15ZC0tY1hscnF5USIgYm9sZD0idHJ1ZSIgZGVzY3JpcHRpb249Ik9wdGlvbmFsIiBmaWxsQ29sb3I9IjEzMzY5MzQzIiBsaW5lQ29sb3I9IjY3MzcxNTEiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRG5OMW9vTzBFZG15ZC0tY1hscnF5USIgeD0iMTgxMjYiIHk9IjE0OTQ2IiB3aWR0aD0iMjI0NyIgaGVpZ2h0PSI2MzUiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZDQyOWNJTzBFZG15ZC0tY1hscnF5USIgdHlwZT0icmVjdGFuZ2xlIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2Q0OUVFb08wRWRteWQtLWNYbHJxeVEiIHR5cGU9IkRpYWdyYW1OYW1lIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9kNDlFRTRPMEVkbXlkLS1jWGxycXlRIiB0eXBlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9kNDlFRUlPMEVkbXlkLS1jWGxycXlRIiBib2xkPSJ0cnVlIiBkZXNjcmlwdGlvbj0iUmVxdWlyZWQiIGZpbGxDb2xvcj0iMTM0MjA0NDMiIGxpbmVDb2xvcj0iNjczNzE1MSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9kNDlFRVlPMEVkbXlkLS1jWGxycXlRIiB4PSIxODEyNiIgeT0iMTU5MDAiIHdpZHRoPSIyMjIyIiBoZWlnaHQ9IjYzNSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oemtxRUlPMUVkbXlkLS1jWGxycXlRIiB0eXBlPSJyZWN0YW5nbGUiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaHprcUU0TzFFZG15ZC0tY1hscnF5USIgdHlwZT0iRGlhZ3JhbU5hbWUiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2h6a3FGSU8xRWRteWQtLWNYbHJxeVEiIHR5cGU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX2h6a3FFWU8xRWRteWQtLWNYbHJxeVEiIGZpbGxDb2xvcj0iMTM0MjA0NDMiIGxpbmVDb2xvcj0iNjczNzE1MSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oemtxRW9PMUVkbXlkLS1jWGxycXlRIiB4PSI3MzE0IiB5PSI5ODU4IiB3aWR0aD0iNjM0IiBoZWlnaHQ9IjMxNyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91TnNCWUlPMUVkbXlkLS1jWGxycXlRIiB0eXBlPSJyZWN0YW5nbGUiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdU5zQlk0TzFFZG15ZC0tY1hscnF5USIgdHlwZT0iRGlhZ3JhbU5hbWUiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3VOc0JaSU8xRWRteWQtLWNYbHJxeVEiIHR5cGU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3VOc0JZWU8xRWRteWQtLWNYbHJxeVEiIGZpbGxDb2xvcj0iMTM0MjA0NDMiIGxpbmVDb2xvcj0iNjczNzE1MSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il91TnNCWW9PMUVkbXlkLS1jWGxycXlRIiB4PSI3MzE0IiB5PSIxMDgxMiIgd2lkdGg9IjYzNSIgaGVpZ2h0PSIzMTciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMXJUcGdJTzFFZG15ZC0tY1hscnF5USIgZWxlbWVudD0iXzFyQlZvSU8xRWRteWQtLWNYbHJxeVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMXJUcGc0TzFFZG15ZC0tY1hscnF5USIgdHlwZT0iQ29tbWVudEJvZHkiIGVsZW1lbnQ9Il8xckJWb0lPMUVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iXzFyVHBnWU8xRWRteWQtLWNYbHJxeVEiIGZpbGxDb2xvcj0iMTY3NjM4NTAiIGxpbmVDb2xvcj0iMTY3NDQ1NzYiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8xclRwZ29PMUVkbXlkLS1jWGxycXlRIiB4PSI2MzYiIHk9IjE0OTQ2IiB3aWR0aD0iNjM3NiIgaGVpZ2h0PSIyNTY1Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJOX0RVSU8yRWRteWQtLWNYbHJxeVEiIHRhcmdldEVkZ2VzPSJfSVZPVmdJTzNFZG15ZC0tY1hscnF5USIgZWxlbWVudD0iXzJOc3ZjSU8yRWRteWQtLWNYbHJxeVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMk5fRFU0TzJFZG15ZC0tY1hscnF5USIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzJOc3ZjSU8yRWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJOX0RWSU8yRWRteWQtLWNYbHJxeVEiIHR5cGU9IktpbmQiIGVsZW1lbnQ9Il8yTnN2Y0lPMkVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yTl9EVllPMkVkbXlkLS1jWGxycXlRIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfMk5zdmNJTzJFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMk5fRFZvTzJFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfMk5zdmNJTzJFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzJOX0RWNE8yRWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJOX0RXSU8yRWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzJOc3ZjSU8yRWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yTl9EV1lPMkVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yTl9EV29PMkVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUmVhbGl6YXRpb25MaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il8yTnN2Y0lPMkVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMk5fRFc0TzJFZG15ZC0tY1hscnF5USIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMk5fRFhJTzJFZG15ZC0tY1hscnF5USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlJlcXVpcmVkSW50ZXJmYWNlTGlzdENvbXBhcnRtZW50IiBlbGVtZW50PSJfMk5zdmNJTzJFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzJOX0RYWU8yRWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJOX0RYb08yRWRteWQtLWNYbHJxeVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQcm92aWRlZEludGVyZmFjZUxpc3RDb21wYXJ0bWVudCIgZWxlbWVudD0iXzJOc3ZjSU8yRWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yTl9EWDRPMkVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yTl9EWUlPMkVkbXlkLS1jWGxycXlRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8yTnN2Y0lPMkVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzJOX0RZWU8yRWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29tcG9uZW50U3R5bGUiIHhtaTppZD0iXzJOX0RVWU8yRWRteWQtLWNYbHJxeVEiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8yTl9EVW9PMkVkbXlkLS1jWGxycXlRIiB4PSI3NzI1IiB5PSIxMzIyOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfMEx3N29ZT3dFZG15ZC0tY1hscnF5USIvPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX2dTNDNRSU94RWRteWQtLWNYbHJxeVEiIGVsZW1lbnQ9Il9nU21qWUlPeEVkbXlkLS1jWGxycXlRIiBzb3VyY2U9Il9YNGhUQUlPeEVkbXlkLS1jWGxycXlRIiB0YXJnZXQ9Il9iN0phOElPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2dTNDNRNE94RWRteWQtLWNYbHJxeVEiIHR5cGU9Ik5hbWVMYWJlbCIgZWxlbWVudD0iX2dTbWpZSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nUzQzUllPeEVkbXlkLS1jWGxycXlRIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfZ1NtallJT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nUzQzUm9PeEVkbXlkLS1jWGxycXlRIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfZ1NtallJT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZ1M0M1JJT3hFZG15ZC0tY1hscnF5USIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfZ1M0M1FZT3hFZG15ZC0tY1hscnF5USIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2dTNDNRb094RWRteWQtLWNYbHJxeVEiIHBvaW50cz0iWzIsIC0zMSwgNSwgOTBdJFs2MiwgLTk1LCA2NSwgMjZdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX21KS3VJSU94RWRteWQtLWNYbHJxeVEiIGVsZW1lbnQ9Il9tSS1nNElPeEVkbXlkLS1jWGxycXlRIiBzb3VyY2U9Il9rZER4b0lPeEVkbXlkLS1jWGxycXlRIiB0YXJnZXQ9Il9qaHZfOElPeEVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX21KS3VJNE94RWRteWQtLWNYbHJxeVEiIHR5cGU9Ik5hbWVMYWJlbCIgZWxlbWVudD0iX21JLWc0SU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9tSkt1SllPeEVkbXlkLS1jWGxycXlRIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfbUktZzRJT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9tSlEwd0lPeEVkbXlkLS1jWGxycXlRIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfbUktZzRJT3hFZG15ZC0tY1hscnF5USIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbUpLdUpJT3hFZG15ZC0tY1hscnF5USIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfbUpLdUlZT3hFZG15ZC0tY1hscnF5USIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX21KS3VJb094RWRteWQtLWNYbHJxeVEiIHBvaW50cz0iWy00MiwgLTgyMCwgMTEsIDIyNDldJFstNDIsIC0yMjQ5LCAxMSwgODIwXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9BYnJZb0lPeUVkbXlkLS1jWGxycXlRIiBlbGVtZW50PSJfQWJmTFlJT3lFZG15ZC0tY1hscnF5USIgc291cmNlPSJfNFR2b01JT3hFZG15ZC0tY1hscnF5USIgdGFyZ2V0PSJfYjdKYThJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BYnJZbzRPeUVkbXlkLS1jWGxycXlRIiB0eXBlPSJLaW5kTGFiZWwiIGVsZW1lbnQ9Il9BYmZMWUlPeUVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQWJyWXBZT3lFZG15ZC0tY1hscnF5USIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iX0FiZkxZSU95RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQWJyWXA0T3lFZG15ZC0tY1hscnF5USIgdHlwZT0iS2luZCIgZWxlbWVudD0iX0FiZkxZSU95RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQWJyWXBvT3lFZG15ZC0tY1hscnF5USIgdHlwZT0iTmFtZSIgZWxlbWVudD0iX0FiZkxZSU95RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0FicllwSU95RWRteWQtLWNYbHJxeVEiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0FicllvWU95RWRteWQtLWNYbHJxeVEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9BYnJZb29PeUVkbXlkLS1jWGxycXlRIiBwb2ludHM9IlstMjQzNCwgLTEwODUsIDQ2MDQsIDIwMTFdJFstMjg1NywgLTEwODUsIDQxODEsIDIwMTFdJFstMjg1NywgLTI5NjMsIDQxODEsIDEzM10kWy01MzE4LCAtMjk2MywgMTcyMCwgMTMzXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9EZXlrVUlPeUVkbXlkLS1jWGxycXlRIiBlbGVtZW50PSJfRGVVRE1JT3lFZG15ZC0tY1hscnF5USIgc291cmNlPSJfNFR2b01JT3hFZG15ZC0tY1hscnF5USIgdGFyZ2V0PSJfLUN3MThJT3dFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EZXlrVTRPeUVkbXlkLS1jWGxycXlRIiB0eXBlPSJLaW5kTGFiZWwiIGVsZW1lbnQ9Il9EZVVETUlPeUVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRGV5a1ZZT3lFZG15ZC0tY1hscnF5USIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iX0RlVURNSU95RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRGV5a1Y0T3lFZG15ZC0tY1hscnF5USIgdHlwZT0iS2luZCIgZWxlbWVudD0iX0RlVURNSU95RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRGV5a1ZvT3lFZG15ZC0tY1hscnF5USIgdHlwZT0iTmFtZSIgZWxlbWVudD0iX0RlVURNSU95RWRteWQtLWNYbHJxeVEiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0RleWtWSU95RWRteWQtLWNYbHJxeVEiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0RleWtVWU95RWRteWQtLWNYbHJxeVEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9EZXlrVW9PeUVkbXlkLS1jWGxycXlRIiBwb2ludHM9IlstMjQzNCwgMTAzMiwgNDUyNCwgLTEyNzBdJFstMjg1NywgMTAzMiwgNDEwMSwgLTEyNzBdJFstMjg1NywgMjI3NSwgNDEwMSwgLTI3XSRbLTQ2MzAsIDIyNzUsIDIzMjgsIC0yN10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfSnNxYjBJT3lFZG15ZC0tY1hscnF5USIgZWxlbWVudD0iX0pzU0JVSU95RWRteWQtLWNYbHJxeVEiIHNvdXJjZT0iXzRUdm9NSU94RWRteWQtLWNYbHJxeVEiIHRhcmdldD0iX2podl84SU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSnNxYjA0T3lFZG15ZC0tY1hscnF5USIgdHlwZT0iS2luZExhYmVsIiBlbGVtZW50PSJfSnNTQlVJT3lFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0pzcWIxWU95RWRteWQtLWNYbHJxeVEiIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il9Kc1NCVUlPeUVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0pzcWIxNE95RWRteWQtLWNYbHJxeVEiIHR5cGU9IktpbmQiIGVsZW1lbnQ9Il9Kc1NCVUlPeUVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0pzcWIxb095RWRteWQtLWNYbHJxeVEiIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il9Kc1NCVUlPeUVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9Kc3FiMUlPeUVkbXlkLS1jWGxycXlRIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9Kc3FiMFlPeUVkbXlkLS1jWGxycXlRIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSnNxYjBvT3lFZG15ZC0tY1hscnF5USIgcG9pbnRzPSJbMjE0MywgODAsIC00OTIxLCAxODVdJFs1MzcxLCA4MCwgLTE2OTMsIDE4NV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfTGRLd0lJT3lFZG15ZC0tY1hscnF5USIgZWxlbWVudD0iX0xjLWk0SU95RWRteWQtLWNYbHJxeVEiIHNvdXJjZT0iXzRUdm9NSU94RWRteWQtLWNYbHJxeVEiIHRhcmdldD0iX21vcjdzSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGRLd0k0T3lFZG15ZC0tY1hscnF5USIgdHlwZT0iS2luZExhYmVsIiBlbGVtZW50PSJfTGMtaTRJT3lFZG15ZC0tY1hscnF5USI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xkS3dKWU95RWRteWQtLWNYbHJxeVEiIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il9MYy1pNElPeUVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xkS3dKNE95RWRteWQtLWNYbHJxeVEiIHR5cGU9IktpbmQiIGVsZW1lbnQ9Il9MYy1pNElPeUVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xkS3dKb095RWRteWQtLWNYbHJxeVEiIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il9MYy1pNElPeUVkbXlkLS1jWGxycXlRIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9MZEt3SklPeUVkbXlkLS1jWGxycXlRIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9MZEt3SVlPeUVkbXlkLS1jWGxycXlRIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTGRLd0lvT3lFZG15ZC0tY1hscnF5USIgcG9pbnRzPSJbMjE0MywgLTUwMiwgLTQ4OTUsIDI0NjFdJFszMTIyLCAtNTAyLCAtMzkxNiwgMjQ2MV0kWzMxMjIsIC0yOTg5LCAtMzkxNiwgLTI2XSRbNDQ5OCwgLTI5ODksIC0yNTQwLCAtMjZdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0lWT1ZnSU8zRWRteWQtLWNYbHJxeVEiIGVsZW1lbnQ9Il9JVFVSQUlPM0VkbXlkLS1jWGxycXlRIiBzb3VyY2U9Il80VHZvTUlPeEVkbXlkLS1jWGxycXlRIiB0YXJnZXQ9Il8yTl9EVUlPMkVkbXlkLS1jWGxycXlRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0lWT1ZnNE8zRWRteWQtLWNYbHJxeVEiIHR5cGU9IktpbmRMYWJlbCIgZWxlbWVudD0iX0lUVVJBSU8zRWRteWQtLWNYbHJxeVEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JVk9WaFlPM0VkbXlkLS1jWGxycXlRIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfSVRVUkFJTzNFZG15ZC0tY1hscnF5USIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JVk9WaDRPM0VkbXlkLS1jWGxycXlRIiB0eXBlPSJLaW5kIiBlbGVtZW50PSJfSVRVUkFJTzNFZG15ZC0tY1hscnF5USIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JVk9WaG9PM0VkbXlkLS1jWGxycXlRIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfSVRVUkFJTzNFZG15ZC0tY1hscnF5USIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSVZPVmhJTzNFZG15ZC0tY1hscnF5USIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSVZPVmdZTzNFZG15ZC0tY1hscnF5USIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0lWT1Znb08zRWRteWQtLWNYbHJxeVEiIHBvaW50cz0iWy0xNSwgNjEsIC0xNywgLTU3XSRbLTEwMCwgMTIwLCAtMTAyLCAyXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICA8L2NvbnRlbnRzPgotICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfeUtQazhQeXpFZG0xODV6dnYwV01fUSIgdHlwZT0iQ2xhc3MiIGVsZW1lbnQ9Il9TV1gzVUg1R0VkbTc5N3N6aWtIam9RIiBuYW1lPSJEcmFnLW4tRHJvcCI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRlM1UTBQeTBFZG0xODV6dnYwV01fUSIgc291cmNlRWRnZXM9Il9HQlQyQVB5MEVkbTE4NXp2djBXTV9RIF9HQlQyQ1B5MEVkbTE4NXp2djBXTV9RIF9HQlo4b1B5MEVkbTE4NXp2djBXTV9RIF9HQlo4cVB5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZYR2JZUHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9GWEdiWWZ5MEVkbTE4NXp2djBXTV9RIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GWEdiWXZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZYR2JZX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRlhHYlpQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GWEdiWmZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GWEdiWnZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ZYR2JaX3kwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZYR2JhUHkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ZYR2JhZnkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZYTWlBUHkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GWE1pQWZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ZTNVEwZnkwRWRtMTg1enZ2MFdNX1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRlM1UTB2eTBFZG0xODV6dnYwV01fUSIgeD0iMTI3MiIgeT0iNzMxNCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GWXVNQVB5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2VFZGdlcz0iX0dCWjhzUHkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldEVkZ2VzPSJfR0JaOHVQeTBFZG0xODV6dnYwV01fUSBfR0JzUWdQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GWXVNQV95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZ1tqY3VebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ZZdU1CUHkwRWRtMTg1enZ2MFdNX1EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZZdU1CZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nW2pjdV5uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZZdU1CdnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nW2pjdV5uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZZdU1CX3kwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ZZdU1DUHkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZ1tqY3VebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GWXVNQ2Z5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GWXVNQ3Z5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2dbamN1Xm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZy5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRll1TUNfeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRll1TURQeTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nW2pjdV5uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZZdU1EZnkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GWXVNRHZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2dbamN1Xm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZy5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9GWXVNQWZ5MEVkbTE4NXp2djBXTV9RIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2dbamN1Xm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZy5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9GWXVNQXZ5MEVkbTE4NXp2djBXTV9RIiB4PSIxOTA4IiB5PSIxNjIxOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GWjlpSVB5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2VFZGdlcz0iX0dCWjh1UHkwRWRtMTg1enZ2MFdNX1EgX0dCZ0RRUHkwRWRtMTg1enZ2MFdNX1EgX0dCZ0RTUHkwRWRtMTg1enZ2MFdNX1EgX0dCZ0RVUHkwRWRtMTg1enZ2MFdNX1EgX0dCZ0RXUHkwRWRtMTg1enZ2MFdNX1EgX0dCbUo0X3kwRWRtMTg1enZ2MFdNX1EiIHRhcmdldEVkZ2VzPSJfR0NFckVmeTBFZG0xODV6dnYwV01fUSBfR0NFckdmeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GWjlpSV95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRlo5aUpQeTBFZG0xODV6dnYwV01fUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRlo5aUpmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GWjlpSnZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZaOWlKX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRlo5aUtQeTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRlo5aUtmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GWjlpS3Z5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GWjlpS195MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GWjlpTFB5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GWjlpTGZ5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRlo5aUx2eTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9GWjlpSWZ5MEVkbTE4NXp2djBXTV9RIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ZaOWlJdnkwRWRtMTg1enZ2MFdNX1EiIHg9IjEzMDM4IiB5PSI3MzE0Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZjS2hrUHkwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZUVkZ2VzPSJfR0JtSjd2eTBFZG0xODV6dnYwV01fUSBfR0JtSjl2eTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0RWRnZXM9Il9HQlo4c1B5MEVkbTE4NXp2djBXTV9RIF9HQmdEU1B5MEVkbTE4NXp2djBXTV9RIF9HQnNRbVB5MEVkbTE4NXp2djBXTV9RIF9HQjRkd1B5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZjS2hrX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3JbamN1Xm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ZjS2hsUHkwRWRtMTg1enZ2MFdNX1EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZjS2hsZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3JbamN1Xm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GY0tobHZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yW2pjdV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmNLaGxfeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRmNLaG1QeTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3JbamN1Xm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GY0tobWZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ZjS2htdnkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yW2pjdV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmNRb01QeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRmNRb01meTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3JbamN1Xm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GY1FvTXZ5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRmNRb01feTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3JbamN1Xm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ZjS2hrZnkwRWRtMTg1enZ2MFdNX1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yW2pjdV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9GY0toa3Z5MEVkbTE4NXp2djBXTV9RIiB4PSIzMjc1NCIgeT0iMzMwNzIiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmUxYkVQeTBFZG0xODV6dnYwV01fUSIgc291cmNlRWRnZXM9Il9HQm1KX3Z5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXRFZGdlcz0iX0dCeVhOZnkwRWRtMTg1enZ2MFdNX1EgX0dCNGQyUHkwRWRtMTg1enZ2MFdNX1EgX0dCLWtjdnkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmUxYkVfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ZlMWJGUHkwRWRtMTg1enZ2MFdNX1EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZlN2hzUHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmU3aHNmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GZTdoc3Z5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GZTdoc195MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GZTdodFB5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ZlN2h0ZnkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZlN2h0dnkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ZlN2h0X3kwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZlN2h1UHkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GZTdodWZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ZlMWJFZnkwRWRtMTg1enZ2MFdNX1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRmUxYkV2eTBFZG0xODV6dnYwV01fUSIgeD0iMzI3NTQiIHk9IjI5ODkyIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZmZ0pjUHkwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZUVkZ2VzPSJfR0JzUWdQeTBFZG0xODV6dnYwV01fUSBfR0JzUWlQeTBFZG0xODV6dnYwV01fUSBfR0JzUWtQeTBFZG0xODV6dnYwV01fUSBfR0JzUW1QeTBFZG0xODV6dnYwV01fUSBfR0JzUW9QeTBFZG0xODV6dnYwV01fUSBfR0J5WEl2eTBFZG0xODV6dnYwV01fUSBfR0J5WEt2eTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GZmdKY195MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9UGx1Z2luRHJvcEFjdGlvbltqY3VebmFtZT1QbHVnaW5Ecm9wQWN0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ZmZ0pkUHkwRWRtMTg1enZ2MFdNX1EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZmZ0pkZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZmZ0pkdnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZmZ0pkX3kwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ZmZ0plUHkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9UGx1Z2luRHJvcEFjdGlvbltqY3VebmFtZT1QbHVnaW5Ecm9wQWN0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GZm1RRVB5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GZm1RRWZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmZtUUV2eTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRmZtUUVfeTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZmbVFGUHkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GZm1RRmZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9GZmdKY2Z5MEVkbTE4NXp2djBXTV9RIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9GZmdKY3Z5MEVkbTE4NXp2djBXTV9RIiB4PSI5ODU4IiB5PSIxNjIxOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GZi1xa1B5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXRFZGdlcz0iX0dCWjhxUHkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmYtcWtfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyW2pjdV5uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ZmLXFsUHkwRWRtMTg1enZ2MFdNX1EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZmLXFsZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1GaWxlVHJhbnNmZXJEcmFnQWRhcHRlcltqY3VebmFtZT1GaWxlVHJhbnNmZXJEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmYtcWx2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyW2pjdV5uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GZi1xbF95MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GZi1xbVB5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyW2pjdV5uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GZi1xbWZ5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GZi1xbXZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyW2pjdV5uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GZi1xbV95MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GZi1xblB5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyW2pjdV5uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GZi1xbmZ5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRmYtcW52eTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1GaWxlVHJhbnNmZXJEcmFnQWRhcHRlcltqY3VebmFtZT1GaWxlVHJhbnNmZXJEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9GZi1xa2Z5MEVkbTE4NXp2djBXTV9RIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyW2pjdV5uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ZmLXFrdnkwRWRtMTg1enZ2MFdNX1EiIHk9IjEzNjc0Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Zoc2gwUHkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldEVkZ2VzPSJfR0JUMkNQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GaHNoMF95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9UmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyW2pjdV5uYW1lPVJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9GaHNoMVB5MEVkbTE4NXp2djBXTV9RIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GaHNoMWZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9UmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyW2pjdV5uYW1lPVJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmhzaDF2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlcltqY3VebmFtZT1SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Zoc2gxX3kwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0Zoc2gyUHkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9UmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyW2pjdV5uYW1lPVJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmhzaDJmeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRmhzaDJ2eTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9UmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GaHNoMl95MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GaHNoM1B5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlcltqY3VebmFtZT1SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Zoc2gzZnkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GaHNoM3Z5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlcltqY3VebmFtZT1SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRmhzaDBmeTBFZG0xODV6dnYwV01fUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9UmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0Zoc2gwdnkwRWRtMTg1enZ2MFdNX1EiIHg9IjU0MDYiIHk9IjEzNjc0Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Zpa0VnUHkwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZUVkZ2VzPSJfR0J5WE5meTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0RWRnZXM9Il9HQm1KN3Z5MEVkbTE4NXp2djBXTV9RIF9HQnlYUGZ5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Zpa0VnX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0Zpa0VoUHkwRWRtMTg1enZ2MFdNX1EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Zpa0VoZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GaWtFaHZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmlrRWhfeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRmlrRWlQeTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GaWtFaWZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0Zpa0VpdnkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmlrRWlfeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRmlrRWpQeTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GaWtFamZ5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRmlrRWp2eTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0Zpa0VnZnkwRWRtMTg1enZ2MFdNX1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9GaWtFZ3Z5MEVkbTE4NXp2djBXTV9RIiB4PSIzMzA3MiIgeT0iMjU0NDAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmp0VUFQeTBFZG0xODV6dnYwV01fUSIgc291cmNlRWRnZXM9Il9HQnlYUGZ5MEVkbTE4NXp2djBXTV9RIF9HQjRkd1B5MEVkbTE4NXp2djBXTV9RIF9HQjRkeVB5MEVkbTE4NXp2djBXTV9RIF9HQjRkMFB5MEVkbTE4NXp2djBXTV9RIF9HQjRkMlB5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXRFZGdlcz0iX0dCbUo0X3kwRWRtMTg1enZ2MFdNX1EgX0dCeVhJdnkwRWRtMTg1enZ2MFdNX1EgX0dCNGR5UHkwRWRtMTg1enZ2MFdNX1EgX0dDRXJDZnkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmp0VUFfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRmp0VUJQeTBFZG0xODV6dnYwV01fUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRmp0VUJmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZqdFVCdnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GanRVQl95MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GanRVQ1B5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZqdFVDZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRmp0VUN2eTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GanRVQ195MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GanRVRFB5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZqdFVEZnkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GanRVRHZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRmp0VUFmeTBFZG0xODV6dnYwV01fUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ZqdFVBdnkwRWRtMTg1enZ2MFdNX1EiIHg9IjI0OTk1IiB5PSIyNTQxOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GeWdsQVB5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2VFZGdlcz0iX0dCLWtZUHkwRWRtMTg1enZ2MFdNX1EgX0dCLWtZX3kwRWRtMTg1enZ2MFdNX1EgX0dCLWthdnkwRWRtMTg1enZ2MFdNX1EgX0dCLWtjdnkwRWRtMTg1enZ2MFdNX1EgX0dDRXJBZnkwRWRtMTg1enZ2MFdNX1EgX0dDRXJDZnkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldEVkZ2VzPSJfR0JUMkFQeTBFZG0xODV6dnYwV01fUSBfR0JnRFdQeTBFZG0xODV6dnYwV01fUSBfR0J5WEt2eTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GeW1yb1B5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0Z5bXJvZnkwRWRtMTg1enZ2MFdNX1EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Z5bXJvdnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Z5bXJvX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Z5bXJwUHkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0Z5bXJwZnkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GeW1ycHZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0Z5bXJwX3kwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GeW1ycVB5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GeW1ycWZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRnltcnF2eTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0Z5bXJxX3kwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0Z5Z2xBZnkwRWRtMTg1enZ2MFdNX1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0Z5Z2xBdnkwRWRtMTg1enZ2MFdNX1EiIHg9IjE3ODA4IiB5PSIyNTQ0MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GNWV2c1B5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2VFZGdlcz0iX0dDRXJFZnkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldEVkZ2VzPSJfR0JnRFFQeTBFZG0xODV6dnYwV01fUSBfR0JtSjl2eTBFZG0xODV6dnYwV01fUSBfR0JzUWlQeTBFZG0xODV6dnYwV01fUSBfR0I0ZDBQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GNWV2c195MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9GNWV2dFB5MEVkbTE4NXp2djBXTV9RIiB3aWR0aD0iNTMwIiBoZWlnaHQ9IjUzMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRjVldnRmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SURyb3BWYWxpZGF0b3JbamN1Xm5hbWU9SURyb3BWYWxpZGF0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Y1ZXZ0dnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlEcm9wVmFsaWRhdG9yW2pjdV5uYW1lPUlEcm9wVmFsaWRhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GNWV2dF95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRjVldnVQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GNWV2dWZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SURyb3BWYWxpZGF0b3JbamN1Xm5hbWU9SURyb3BWYWxpZGF0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Y1ZXZ1dnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRjVldnVfeTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlEcm9wVmFsaWRhdG9yW2pjdV5uYW1lPUlEcm9wVmFsaWRhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GNWV2dlB5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GNWV2dmZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SURyb3BWYWxpZGF0b3JbamN1Xm5hbWU9SURyb3BWYWxpZGF0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ2xhc3NpZmllclN0eWxlIiB4bWk6aWQ9Il9GNWV2c2Z5MEVkbTE4NXp2djBXTV9RIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiIHVzZUNsYXNzaWZpZXJTaGFwZT0idHJ1ZSIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9GNWV2c3Z5MEVkbTE4NXp2djBXTV9RIiB4PSIzMzMzOSIgeT0iNzQ1Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Y1eERrZnkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldEVkZ2VzPSJfR0JzUW9QeTBFZG0xODV6dnYwV01fUSBfR0Ita1lQeTBFZG0xODV6dnYwV01fUSBfR0NFckFmeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GNXhEbFB5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yU2VyaWFsaXplZFNlbGVjdGlvbltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRjV4RGxmeTBFZG0xODV6dnYwV01fUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRjV4RGx2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvclNlcmlhbGl6ZWRTZWxlY3Rpb25banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GNXhEbF95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yU2VyaWFsaXplZFNlbGVjdGlvbltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Y1eERtUHkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0Y1eERtZnkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yU2VyaWFsaXplZFNlbGVjdGlvbltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Y1eERtdnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRjV4RG1feTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JTZXJpYWxpemVkU2VsZWN0aW9uW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRjV4RG5QeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRjV4RG5meTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JTZXJpYWxpemVkU2VsZWN0aW9uW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRjV4RG52eTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0Y1eERuX3kwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yU2VyaWFsaXplZFNlbGVjdGlvbltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRjV4RGt2eTBFZG0xODV6dnYwV01fUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JTZXJpYWxpemVkU2VsZWN0aW9uW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9GNXhEa195MEVkbTE4NXp2djBXTV9RIiB4PSIxODEyNiIgeT0iMzMzOTAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRjZuX01QeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0RWRnZXM9Il9HQlo4b1B5MEVkbTE4NXp2djBXTV9RIF9HQmdEVVB5MEVkbTE4NXp2djBXTV9RIF9HQm1KX3Z5MEVkbTE4NXp2djBXTV9RIF9HQnNRa1B5MEVkbTE4NXp2djBXTV9RIF9HQi1rWV95MEVkbTE4NXp2djBXTV9RIF9HQi1rYXZ5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Y2bl9NX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlTZXJpYWxpemVyW2pjdV5uYW1lPUlTZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0Y2bl9OUHkwRWRtMTg1enZ2MFdNX1EiIHdpZHRoPSI1MzAiIGhlaWdodD0iNTMwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GNm5fTmZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRjZuX052eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVNlcmlhbGl6ZXJbamN1Xm5hbWU9SVNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Y2bl9OX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlTZXJpYWxpemVyW2pjdV5uYW1lPUlTZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GNm5fT1B5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0Y2bl9PZnkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRjZuX092eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GNm5fT195MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVNlcmlhbGl6ZXJbamN1Xm5hbWU9SVNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Y2bl9QUHkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0Y2bl9QZnkwRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDbGFzc2lmaWVyU3R5bGUiIHhtaTppZD0iX0Y2bl9NZnkwRWRtMTg1enZ2MFdNX1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIgdXNlQ2xhc3NpZmllclNoYXBlPSJ0cnVlIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlTZXJpYWxpemVyW2pjdV5uYW1lPUlTZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0Y2bl9NdnkwRWRtMTg1enZ2MFdNX1EiIHg9IjI4MjUxIiB5PSI3NDUiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRjY2VEVQeTBFZG0xODV6dnYwV01fUSIgc291cmNlRWRnZXM9Il9HQ0VyR2Z5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Y2NlRFX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGVbamN1Xm5hbWU9TmF2aWdhdG9yRHJvcEFjdGlvbkRlbGVnYXRlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0Y2NlRGUHkwRWRtMTg1enZ2MFdNX1EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Y2NlRGZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGVbamN1Xm5hbWU9TmF2aWdhdG9yRHJvcEFjdGlvbkRlbGVnYXRlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GNjZURnZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yRHJvcEFjdGlvbkRlbGVnYXRlW2pjdV5uYW1lPU5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRjY2VEZfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GNjZUR1B5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZVtqY3VebmFtZT1OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Y2NlRHZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRjY2VEd2eTBFZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGVbamN1Xm5hbWU9TmF2aWdhdG9yRHJvcEFjdGlvbkRlbGVnYXRlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9GNjZUR195MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GNjZUSFB5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZVtqY3VebmFtZT1OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0Y2NlRIZnkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9GNjZUSHZ5MEVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZVtqY3VebmFtZT1OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRjY2VEVmeTBFZG0xODV6dnYwV01fUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGVbamN1Xm5hbWU9TmF2aWdhdG9yRHJvcEFjdGlvbkRlbGVnYXRlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0Y2NlRFdnkwRWRtMTg1enZ2MFdNX1EiIHg9IjIwNjcwIiB5PSI2MzYiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX3lLUGs4Znl6RWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HQlQyQVB5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9GUzVRMFB5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9GeWdsQVB5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCVDJBX3kwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQlQyQmZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQlQyQl95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQlQyQnZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCVDJCUHkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCVDJBZnkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCVDJBdnkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWy0xNCwgMzY5MSwgLTg1NjAsIC01NDkxXSRbODUzMiwgNTI3OSwgLTE0LCAtMzkwM10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0JUMkNQeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRlM1UTBQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRmhzaDBQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQlQyQ195MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JUMkRmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9UmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCVDJEX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9UmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyW2pjdV5uYW1lPVJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQlQyRHZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlcltqY3VebmFtZT1SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9UmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR0JUMkRQeTBFZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR0JUMkNmeTBFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlcltqY3VebmFtZT1SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCVDJDdnkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWy0xNCwgMzY5MSwgNjQ4LCAtNTQ5MV0kWy02NzUsIDUyNzksIC0xMywgLTM5MDNdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0dCWjhvUHkwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iX0ZTNVEwUHkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldD0iX0Y2bl9NUHkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JaOG9feTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCWjhwZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SVNlcmlhbGl6ZXJbamN1Xm5hbWU9SVNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JaOHBfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQlo4cHZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlTZXJpYWxpemVyW2pjdV5uYW1lPUlTZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SVNlcmlhbGl6ZXJbamN1Xm5hbWU9SVNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQlo4cFB5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQlo4b2Z5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SVNlcmlhbGl6ZXJbamN1Xm5hbWU9SVNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCWjhvdnkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzI3LCAtMjQwNywgLTIzNjgwLCA1NTA0XSRbMjcsIC00NjMwLCAtMjM2ODAsIDMyODFdJFsyMzczMywgLTQ2MzAsIDI2LCAzMjgxXSRbMjM3MzMsIC02ODI2LCAyNiwgMTA4NV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0JaOHFQeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRlM1UTBQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRmYtcWtQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQlo4cV95MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JaOHJmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1GaWxlVHJhbnNmZXJEcmFnQWRhcHRlcltqY3VebmFtZT1GaWxlVHJhbnNmZXJEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQlo4cl95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyW2pjdV5uYW1lPUZpbGVUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCWjhydnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RmlsZVRyYW5zZmVyRHJhZ0FkYXB0ZXJbamN1Xm5hbWU9RmlsZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1GaWxlVHJhbnNmZXJEcmFnQWRhcHRlcltqY3VebmFtZT1GaWxlVHJhbnNmZXJEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCWjhyUHkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCWjhxZnkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1GaWxlVHJhbnNmZXJEcmFnQWRhcHRlcltqY3VebmFtZT1GaWxlVHJhbnNmZXJEcmFnQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR0JaOHF2eTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbLTE0LCAzNjkxLCA2NjQwLCAtNTQ5MV0kWy02NjU1LCA1Mjc5LCAtMSwgLTM5MDNdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0dCWjhzUHkwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iX0ZZdU1BUHkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldD0iX0ZjS2hrUHkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JaOHNfeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCWjh0ZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZ1tqY3VebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JaOHRfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nW2pjdV5uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yW2pjdV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQlo4dHZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2dbamN1Xm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZy5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3JbamN1Xm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZ1tqY3VebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQlo4dFB5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQlo4c2Z5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZ1tqY3VebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCWjhzdnkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzI3LCA1MDMsIC0zMDI0MiwgLTE4NDY4XSRbMjcsIDQ3ODksIC0zMDI0MiwgLTE0MTgyXSRbMTk5NzYsIDQ3ODksIC0xMDI5MywgLTE0MTgyXSRbMTk5NzYsIDE5MzE1LCAtMTAyOTMsIDM0NF0kWzI3ODg3LCAxOTMxNSwgLTIzODIsIDM0NF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0JaOHVQeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRlo5aUlQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRll1TUFQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQlo4dV95MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JaOHZmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nW2pjdV5uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JaOHZfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nW2pjdV5uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JaOHZ2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nW2pjdV5uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nW2pjdV5uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQlo4dlB5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQlo4dWZ5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZ1tqY3VebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HQlo4dXZ5MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlstMTQsIDM2OTEsIC0xMDc1NiwgLTU0OTFdJFsxMDcyOCwgNTI3OSwgLTE0LCAtMzkwM10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0JnRFFQeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRlo5aUlQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRjVldnNQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQmdEUV95MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JnRFJmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQmdEUl95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlEcm9wVmFsaWRhdG9yW2pjdV5uYW1lPUlEcm9wVmFsaWRhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCZ0RSdnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SURyb3BWYWxpZGF0b3JbamN1Xm5hbWU9SURyb3BWYWxpZGF0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCZ0RSUHkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCZ0RRZnkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR0JnRFF2eTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbLTE0LCAzNjkxLCAtMjY3MywgLTM1MDg0XSRbLTM2NjUsIDUyNzksIC02MzI0LCAtMzM0OTZdJFstMzY2NSwgMzQ0MTAsIC02MzI0LCAtNDM2NV0kWzI2NTksIDM1OTk3LCAwLCAtMjc3OF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0JnRFNQeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRlo5aUlQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRmNLaGtQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQmdEU195MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JnRFRmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3JbamN1Xm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCZ0RUX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yW2pjdV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQmdEVHZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3JbamN1Xm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR0JnRFRQeTBFZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR0JnRFNmeTBFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCZ0RTdnkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzMwOTYsIDMzMzUsIC0xNTkyOCwgLTIxMzUxXSRbODY1MiwgMzMzNSwgLTEwMzcyLCAtMjEzNTFdJFs4NjUyLCAxMDQ3OCwgLTEwMzcyLCAtMTQyMDhdJFsxNTM5OSwgMTA0NzgsIC0zNjI1LCAtMTQyMDhdJFsxNTM5OSwgMjQ2ODYsIC0zNjI1LCAwXSRbMTY2MTYsIDI0Njg2LCAtMjQwOCwgMF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0JnRFVQeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRlo5aUlQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRjZuX01QeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQmdEVV95MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JnRFZmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQmdEVl95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlTZXJpYWxpemVyW2pjdV5uYW1lPUlTZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCZ0RWdnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SVNlcmlhbGl6ZXJbamN1Xm5hbWU9SVNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCZ0RWUHkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCZ0RVZnkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR0JnRFV2eTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMjExNywgMzY3OCwgLTExNzIxLCAxMjg1OV0kWzIxMTcsIDExNTYzLCAtMTE3MjEsIDIwNzQ0XSRbMTUxNjEsIDExNTYzLCAxMzIzLCAyMDc0NF0kWzE1MTYxLCAtODA5NiwgMTMyMywgMTA4NV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0JnRFdQeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRlo5aUlQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRnlnbEFQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQmdEV195MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JtSjRQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JtSjR2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JtSjRmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQmdEWFB5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQmdEV2Z5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HQmdEV3Z5MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlstMTQsIDM2OTEsIC0xNCwgLTU0OTFdJFstMTQsIDUyNzksIC0xNCwgLTM5MDNdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0dCbUo0X3kwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iX0ZaOWlJUHkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldD0iX0ZqdFVBUHkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JtSjV2eTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCbUo2UHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlW2pjdV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQm1KNnZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JtSjZmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlW2pjdV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCbUo1X3kwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCbUo1UHkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HQm1KNWZ5MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlstMTQsIDM2OTEsIC05MDM2LCAtMTU1MTldJFszMjk0LCA1Mjc5LCAtNTcyOCwgLTEzOTMxXSRbMzI5NCwgMTMwODUsIC01NzI4LCAtNjEyNV0kWzkwMDksIDE0NjcyLCAtMTMsIC00NTM4XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HQm1KN3Z5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9GY0toa1B5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9GaWtFZ1B5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCbUo4ZnkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQm1KOF95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQm1KOWZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQm1KOVB5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCbUo4dnkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCbUo3X3kwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3JbamN1Xm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCbUo4UHkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWy0xLCA0NTM3LCA1Mjc4LCAtNDM2Nl0kWy01MjkyLCA2MTI1LCAtMTMsIC0yNzc4XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HQm1KOXZ5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9GY0toa1B5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9GNWV2c1B5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCbUotZnkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQm1KLV95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SURyb3BWYWxpZGF0b3JbamN1Xm5hbWU9SURyb3BWYWxpZGF0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JtSl9meTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3JbamN1Xm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlEcm9wVmFsaWRhdG9yW2pjdV5uYW1lPUlEcm9wVmFsaWRhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCbUpfUHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yW2pjdV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SURyb3BWYWxpZGF0b3JbamN1Xm5hbWU9SURyb3BWYWxpZGF0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQm1KLXZ5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQm1KOV95MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yW2pjdV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR0JtSi1QeTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbLTEsIDQ1MzcsIDExNjQxLCAtNDM2Nl0kWy0xMTY0MiwgNjEyNSwgMCwgLTI3NzhdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0dCbUpfdnkwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iX0ZlMWJFUHkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldD0iX0Y2bl9NUHkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JtS0FmeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCbUtBX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SVNlcmlhbGl6ZXJbamN1Xm5hbWU9SVNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JtS0JmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQm1LQlB5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlTZXJpYWxpemVyW2pjdV5uYW1lPUlTZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SVNlcmlhbGl6ZXJbamN1Xm5hbWU9SVNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQm1LQXZ5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQm1KX195MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SVNlcmlhbGl6ZXJbamN1Xm5hbWU9SVNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCbUtBUHkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWy0yMDkwLCAwLCAyNzc4LCAyODk5OV0kWy01NDUwLCAwLCAtNTgyLCAyODk5OV0kWy01NDUwLCAtMjc5MTQsIC01ODIsIDEwODVdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0dCc1FnUHkwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iX0ZmZ0pjUHkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldD0iX0ZZdU1BUHkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JzUWdfeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCc1FoZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9UGx1Z2luRHJvcEFjdGlvbltqY3VebmFtZT1QbHVnaW5Ecm9wQWN0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2dbamN1Xm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZy5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnNRaF95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nW2pjdV5uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JzUWh2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZ1tqY3VebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9UGx1Z2luRHJvcEFjdGlvbltqY3VebmFtZT1QbHVnaW5Ecm9wQWN0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2dbamN1Xm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZy5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCc1FoUHkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCc1FnZnkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZ1tqY3VebmFtZT1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HQnNRZ3Z5MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlswLCAzNjkxLCAtNDAwOSwgLTU0OTFdJFszOTk1LCA1Mjc5LCAtMTQsIC0zOTAzXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HQnNRaVB5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9GZmdKY1B5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9GNWV2c1B5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCc1FpX3kwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnNRamZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnNRal95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnNRanZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCc1FqUHkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCc1FpZnkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SURyb3BWYWxpZGF0b3JbamN1Xm5hbWU9SURyb3BWYWxpZGF0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCc1FpdnkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzI2LCAtNTAyLCAtMjMyMDQsIDE0NjA1XSRbMjYsIC0xMDIxMywgLTIzMjA0LCA0ODk0XSRbMjMyODMsIC0xMDIxMywgNTMsIDQ4OTRdJFsyMzI4MywgLTE0MjM0LCA1MywgODczXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HQnNRa1B5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9GZmdKY1B5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9GNm5fTVB5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCc1FrX3kwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnNRbGZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnNRbF95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnNRbHZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCc1FsUHkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCc1FrZnkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SVNlcmlhbGl6ZXJbamN1Xm5hbWU9SVNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCc1FrdnkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzEwNTgsIDUwMywgLTE3MDY2LCAxNTM5OV0kWzEwNTgsIDgxMjMsIC0xNzA2NiwgMjMwMTldJFsxODYwMCwgODEyMywgNDc2LCAyMzAxOV0kWzE4NjAwLCAtMTM4MTEsIDQ3NiwgMTA4NV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0JzUW1QeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRmZnSmNQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRmNLaGtQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnNRbV95MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0JzUW5meTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yW2pjdV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnNRbl95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3JbamN1Xm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCc1FudnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9UGx1Z2luRHJvcEFjdGlvbltqY3VebmFtZT1QbHVnaW5Ecm9wQWN0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yW2pjdV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCc1FuUHkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCc1FtZnkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yW2pjdV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR0JzUW12eTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMjYsIDUwMywgLTIzMjg0LCAtMTg0NjhdJFsyNiwgMTk3MTIsIC0yMzI4NCwgNzQxXSRbMjA5MjgsIDE5NzEyLCAtMjM4MiwgNzQxXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HQnNRb1B5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9GZmdKY1B5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9GNXhEa2Z5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCc1FvX3kwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnNRcGZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZXJpYWxpemVkU2VsZWN0aW9uW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnlYSWZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZXJpYWxpemVkU2VsZWN0aW9uW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnlYSVB5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZXJpYWxpemVkU2VsZWN0aW9uW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZXJpYWxpemVkU2VsZWN0aW9uW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCc1FwUHkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCc1FvZnkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VyaWFsaXplZFNlbGVjdGlvbltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCc1FvdnkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzI3LCAxMzc2LCA2MzI0LCAtMTY3NzVdJFsyNywgMjA4NzYsIDYzMjQsIDI3MjVdJFs3OTM4LCAyMDg3NiwgMTQyMzUsIDI3MjVdJFs3OTM4LCAxODU3NCwgMTQyMzUsIDQyM10kWy0zNDY2LCAxODU3NCwgMjgzMSwgNDIzXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HQnlYSXZ5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9GZmdKY1B5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9GanRVQVB5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCeVhKZnkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnlYSl95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCeVhLZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9UGx1Z2luRHJvcEFjdGlvbltqY3VebmFtZT1QbHVnaW5Ecm9wQWN0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0J5WEtQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlW2pjdV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR0J5WEp2eTBFZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR0J5WElfeTBFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HQnlYSlB5MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlswLCAxMzc2LCAtMjI0OSwgLTIwMTYxXSRbMCwgMTY5ODcsIC0yMjQ5LCAtNDU1MF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0J5WEt2eTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRmZnSmNQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRnlnbEFQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnlYTGZ5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0J5WExfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCeVhNZnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9UGx1Z2luRHJvcEFjdGlvbltqY3VebmFtZT1QbHVnaW5Ecm9wQWN0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnlYTVB5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1QbHVnaW5Ecm9wQWN0aW9uW2pjdV5uYW1lPVBsdWdpbkRyb3BBY3Rpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR0J5WEx2eTBFZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR0J5WEtfeTBFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVBsdWdpbkRyb3BBY3Rpb25bamN1Xm5hbWU9UGx1Z2luRHJvcEFjdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCeVhMUHkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzUzLCAxMzc2LCA2ODAwLCAtNzk5MV0kWzUzLCA2ODI3LCA2ODAwLCAtMjU0MF0kWy02NzIwLCA2ODI3LCAyNywgLTI1NDBdJFstNjcyMCwgNzYyMCwgMjcsIC0xNzQ3XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HQnlYTmZ5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9GaWtFZ1B5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9GZTFiRVB5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCeVhPUHkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnlYT3Z5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0J5WFBQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCeVhPX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQnlYT2Z5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQnlYTnZ5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR0J5WE5feTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbLTEzLCAyNzc4LCA3NjczLCAtMzM3NF0kWy03Njg2LCA0MzY2LCAwLCAtMTc4Nl0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0J5WFBmeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRmp0VUFQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRmlrRWdQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQnlYUVB5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0J5WFF2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0J5WFJQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0J5WFFfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQnlYUWZ5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQnlYUHZ5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlW2pjdV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HQnlYUF95MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlstMTMsIDQ1MzcsIC0xMywgLTE1MDI4XSRbLTEzLCAxNjc4NywgLTEzLCAtMjc3OF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0I0ZHdQeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRmp0VUFQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRmNLaGtQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQjRkd195MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0I0ZHhmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0I0ZHhfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0I0ZHh2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPURyb3BIYW5kbGVyRGVzY3JpcHRvcltqY3VebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQjRkeFB5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQjRkd2Z5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlW2pjdV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Ecm9wSGFuZGxlckRlc2NyaXB0b3JbamN1Xm5hbWU9RHJvcEhhbmRsZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HQjRkd3Z5MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlstMTMsIDQ1MzcsIC01MjkyLCAtNjEyNV0kWzUyNzgsIDYxMjQsIC0xLCAtNDUzOF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0I0ZHlQeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRmp0VUFQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRmp0VUFQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQjRkeV95MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0I0ZHpmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0I0ZHpfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0I0ZHp2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQjRkelB5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQjRkeWZ5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlW2pjdV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HQjRkeXZ5MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0I0ZDBQeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRmp0VUFQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRjVldnNQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQjRkMF95MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0I0ZDFmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlEcm9wVmFsaWRhdG9yW2pjdV5uYW1lPUlEcm9wVmFsaWRhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCNGQxX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlW2pjdV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQjRkMXZ5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SURyb3BWYWxpZGF0b3JbamN1Xm5hbWU9SURyb3BWYWxpZGF0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlEcm9wVmFsaWRhdG9yW2pjdV5uYW1lPUlEcm9wVmFsaWRhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR0I0ZDFQeTBFZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR0I0ZDBmeTBFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SURyb3BWYWxpZGF0b3JbamN1Xm5hbWU9SURyb3BWYWxpZGF0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCNGQwdnkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWy0xMywgNDUzNywgNjM1MCwgLTE1MDI4XSRbLTQ2MTcsIDYxMjQsIDE3NDYsIC0xMzQ0MV0kWy00NjE3LCAxNTIwMCwgMTc0NiwgLTQzNjVdJFstNjM2MywgMTY3ODcsIDAsIC0yNzc4XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HQjRkMlB5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9GanRVQVB5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9GZTFiRVB5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCNGQyX3kwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQjRkM2Z5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0I0ZDNfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPVNlcmlhbGl6ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCNGQzdnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlW2pjdV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQjRkM1B5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQjRkMmZ5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlW2pjdV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR0I0ZDJ2eTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMTYxNCwgMzQ2NiwgLTUzNzEsIDE1MzRdJFsxNjE0LCAzOTE2LCAtNTM3MSwgMTk4NF0kWzYyOTcsIDM5MTYsIC02ODgsIDE5ODRdJFs2Mjk3LCAyODU4LCAtNjg4LCA5MjZdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0dCLWtZUHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik93bmVkRWxlbWVudCIgc291cmNlPSJfRnlnbEFQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRjV4RGtmeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQi1rWWZ5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR0Ita1l2eTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbLTE0LCAzOTAyLCAtNDc3LCAtNjEyNl0kWzQ2MiwgNTQ5MCwgLTEsIC00NTM4XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HQi1rWV95MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9GeWdsQVB5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9GNm5fTVB5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCLWtadnkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQi1rYVB5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW1wbGVtZW50YXRpb24iIGhyZWY9InZpenJlZjovLy8jamltcGxedmNvcmUudGFyZ2V0PXVtbDIuSW1wbGVtZW50YXRpb25banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SVNlcmlhbGl6ZXJbamN1Xm5hbWU9SVNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0Ita2FmeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkltcGxlbWVudGF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2ppbXBsXnZjb3JlLnRhcmdldD11bWwyLkltcGxlbWVudGF0aW9uW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlTZXJpYWxpemVyW2pjdV5uYW1lPUlTZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbXBsZW1lbnRhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqaW1wbF52Y29yZS50YXJnZXQ9dW1sMi5JbXBsZW1lbnRhdGlvbltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCLWtaX3kwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCLWtaUHkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkltcGxlbWVudGF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2ppbXBsXnZjb3JlLnRhcmdldD11bWwyLkltcGxlbWVudGF0aW9uW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlTZXJpYWxpemVyW2pjdV5uYW1lPUlTZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HQi1rWmZ5MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlstMTQsIDM5MDIsIDQ5MjEsIC0zNjMwMV0kWy00OTM1LCA1NDkwLCAwLCAtMzQ3MTNdJFstNDkzNSwgMzkxMTgsIDAsIC0xMDg1XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HQi1rYXZ5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9GeWdsQVB5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9GNm5fTVB5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCLWtiZnkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQi1rYl95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQi1rY2Z5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQi1rY1B5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JU2VyaWFsaXplcltqY3VebmFtZT1JU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCLWtidnkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCLWthX3kwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SVNlcmlhbGl6ZXJbamN1Xm5hbWU9SVNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCLWtiUHkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzI3NzgsIDAsIC02NTg4LCAyNTE4OV0kWzEwMjM5LCAwLCA4NzMsIDI1MTg5XSRbMTAyMzksIC0yNDEwNCwgODczLCAxMDg1XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HQi1rY3Z5MEVkbTE4NXp2djBXTV9RIiBzb3VyY2U9Il9GeWdsQVB5MEVkbTE4NXp2djBXTV9RIiB0YXJnZXQ9Il9GZTFiRVB5MEVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dCLWtkZnkwRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQi1rZF95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQ0VyQVB5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQi1rZVB5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvcltqY3VebmFtZT1TZXJpYWxpemVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dCLWtkdnkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dCLWtjX3kwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3JbamN1Xm5hbWU9U2VyaWFsaXplckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dCLWtkUHkwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzIzMDIsIDE1NjEsIC0xMTkzMiwgLTIyNDldJFsyMzAyLCAxMzE3NiwgLTExOTMyLCA5MzY2XSRbNDg5NCwgMTMxNzYsIC05MzQwLCA5MzY2XSRbNDg5NCwgNTYwOSwgLTkzNDAsIDE3OTldJFsxNDI4NywgNTYwOSwgNTMsIDE3OTldJFsxNDI4NywgNDczNiwgNTMsIDkyNl0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0NFckFmeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRnlnbEFQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRjV4RGtmeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQ0VyQlB5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0NFckJ2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VyaWFsaXplZFNlbGVjdGlvbltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0NFckNQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VyaWFsaXplZFNlbGVjdGlvbltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0NFckJfeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VyaWFsaXplZFNlbGVjdGlvbltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VyaWFsaXplZFNlbGVjdGlvbltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQ0VyQmZ5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQ0VyQXZ5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlcmlhbGl6ZWRTZWxlY3Rpb25banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HQ0VyQV95MEVkbTE4NXp2djBXTV9RIiBwb2ludHM9IlstMTQsIDM5MDIsIC00NzcsIC02MTI2XSRbNDYyLCA1NDkwLCAtMSwgLTQ1MzhdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0dDRXJDZnkwRWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iX0Z5Z2xBUHkwRWRtMTg1enZ2MFdNX1EiIHRhcmdldD0iX0ZqdFVBUHkwRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0NFckRQeTBFZG0xODV6dnYwV01fUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dDRXJEdnkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0NFckVQeTBFZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyW2pjdV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlW2pjdV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQ0VyRF95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJbamN1Xm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VbamN1Xm5hbWU9Q29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HQ0VyRGZ5MEVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HQ0VyQ3Z5MEVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcltqY3VebmFtZT1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZVtqY3VebmFtZT1Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dDRXJDX3kwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWy0xNCwgMzkwMiwgLTkwMzYsIC02MTI2XSRbOTAwOSwgNTQ5MCwgLTEzLCAtNDUzOF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0NFckVmeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRjVldnNQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRlo5aUlQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQ0VyRlB5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0NFckZ2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQ0VyR1B5MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlEcm9wVmFsaWRhdG9yW2pjdV5uYW1lPUlEcm9wVmFsaWRhdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dDRXJGX3kwRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SURyb3BWYWxpZGF0b3JbamN1Xm5hbWU9SURyb3BWYWxpZGF0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dDRXJGZnkwRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dDRXJFdnkwRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JRHJvcFZhbGlkYXRvcltqY3VebmFtZT1JRHJvcFZhbGlkYXRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR0NFckVfeTBFZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMCwgLTI3NzgsIDI2NTksIDM1OTk3XSRbLTU5MDEsIC00MzY1LCAtMzI0MiwgMzQ0MTBdJFstNTkwMSwgLTMzNDk2LCAtMzI0MiwgNTI3OV0kWy0yNjczLCAtMzUwODQsIC0xNCwgMzY5MV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfR0NFckdmeTBFZG0xODV6dnYwV01fUSIgc291cmNlPSJfRjY2VEVQeTBFZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfRlo5aUlQeTBFZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQ0VySFB5MEVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0NFckh2eTBFZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGVbamN1Xm5hbWU9TmF2aWdhdG9yRHJvcEFjdGlvbkRlbGVnYXRlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dDRXJJUHkwRWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yRHJvcEFjdGlvbkRlbGVnYXRlW2pjdV5uYW1lPU5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcltqY3VebmFtZT1Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmRuZFtqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQ0VySF95MEVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZVtqY3VebmFtZT1OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGVbamN1Xm5hbWU9TmF2aWdhdG9yRHJvcEFjdGlvbkRlbGVnYXRlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyW2pjdV5uYW1lPUNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZG5kW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR0NFckhmeTBFZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR0NFckd2eTBFZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZVtqY3VebmFtZT1OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5kbmRbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dDRXJHX3kwRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWy0xMywgMTk5NywgLTE0LCAtNTI3OF0kWy0xMywgMzU4NCwgLTE0LCAtMzY5MV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgPC9jb250ZW50cz4KLSAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iX0gxMFZBUHktRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkNsYXNzIiBlbGVtZW50PSJfU1dYM1VINUdFZG03OTdzemlrSGpvUSIgbmFtZT0iTGluay13aXRoLUVkaXRvciI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfS0RpdzBQeS1FZG0xODV6dnYwV01fUSIgdGFyZ2V0RWRnZXM9Il9OQzc2SVB5LUVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0tEaXcwX3ktRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlMaW5rSGVscGVyW2pjdV5uYW1lPUlMaW5rSGVscGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfS0RpdzFQeS1FZG0xODV6dnYwV01fUSIgd2lkdGg9IjUzMCIgaGVpZ2h0PSI1MzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0tEaXcxZnktRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlMaW5rSGVscGVyW2pjdV5uYW1lPUlMaW5rSGVscGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0tEaXcxdnktRWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlMaW5rSGVscGVyW2pjdV5uYW1lPUlMaW5rSGVscGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0tEaXcxX3ktRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlMaW5rSGVscGVyW2pjdV5uYW1lPUlMaW5rSGVscGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0tEaXcyUHktRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfS0RpdzJmeS1FZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlMaW5rSGVscGVyW2pjdV5uYW1lPUlMaW5rSGVscGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0tEaXcydnktRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfS0RpdzJfeS1FZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlMaW5rSGVscGVyW2pjdV5uYW1lPUlMaW5rSGVscGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0tEaXczUHktRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0tEaXczZnktRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JTGlua0hlbHBlcltqY3VebmFtZT1JTGlua0hlbHBlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENsYXNzaWZpZXJTdHlsZSIgeG1pOmlkPSJfS0RpdzBmeS1FZG0xODV6dnYwV01fUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIiB1c2VDbGFzc2lmaWVyU2hhcGU9InRydWUiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUxpbmtIZWxwZXJbamN1Xm5hbWU9SUxpbmtIZWxwZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9LRGl3MHZ5LUVkbTE4NXp2djBXTV9RIiB4PSI1Njg4IiB5PSIzNDM5Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX003cmJrUHktRWRtMTg1enZ2MFdNX1EiIHNvdXJjZUVkZ2VzPSJfTkMxemdmeS1FZG0xODV6dnYwV01fUSBfTkM3NklQeS1FZG0xODV6dnYwV01fUSBfTkM3NktQeS1FZG0xODV6dnYwV01fUSBfTkM3Nk1QeS1FZG0xODV6dnYwV01fUSIgdGFyZ2V0RWRnZXM9Il9OQzc2S1B5LUVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX003cmJrX3ktRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9NN3JibFB5LUVkbTE4NXp2djBXTV9RIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NN3JibGZ5LUVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX003cmJsdnktRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTTdyYmxfeS1FZG0xODV6dnYwV01fUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9NN3JibVB5LUVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeVtqY3VebmFtZT1MaW5rSGVscGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NN3JibWZ5LUVkbTE4NXp2djBXTV9RIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX003cmJtdnktRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX003cmJtX3ktRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX003cmJuUHktRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX003cmJuZnktRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9NN3JibnZ5LUVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeVtqY3VebmFtZT1MaW5rSGVscGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX003cmJrZnktRWRtMTg1enZ2MFdNX1EiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTTdyYmt2eS1FZG0xODV6dnYwV01fUSIgeD0iMTAxNzYiIHk9IjMxODAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTTlmWmNQeS1FZG0xODV6dnYwV01fUSIgdGFyZ2V0RWRnZXM9Il9OQzF6Z2Z5LUVkbTE4NXp2djBXTV9RIF9OQzc2TVB5LUVkbTE4NXp2djBXTV9RIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX005ZlpjX3ktRWRtMTg1enZ2MFdNX1EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1EZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX005ZlpkUHktRWRtMTg1enZ2MFdNX1EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX005ZlpkZnktRWRtMTg1enZ2MFdNX1EiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1EZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NOWZaZHZ5LUVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RGVzY3JpcHRvcltqc3JjdHlwZV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeVtqY3VebmFtZT1MaW5rSGVscGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTTlmWmRfeS1FZG0xODV6dnYwV01fUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9NOWZaZVB5LUVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPURlc2NyaXB0b3JbanNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX005ZlplZnktRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfTTlmWmV2eS1FZG0xODV6dnYwV01fUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1EZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NOWZaZV95LUVkbTE4NXp2djBXTV9RIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9NOWZaZlB5LUVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPURlc2NyaXB0b3JbanNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX005ZlpmZnktRWRtMTg1enZ2MFdNX1EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9NOWZaZnZ5LUVkbTE4NXp2djBXTV9RIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPURlc2NyaXB0b3JbanNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfTTlmWmNmeS1FZG0xODV6dnYwV01fUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1EZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX005ZlpjdnktRWRtMTg1enZ2MFdNX1EiIHg9IjExNTYxIiB5PSIxMDQ2NiIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfSDEwVkFmeS1FZG0xODV6dnYwV01fUSIvPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX05DMXpnZnktRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik93bmVkRWxlbWVudCIgc291cmNlPSJfTTdyYmtQeS1FZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfTTlmWmNQeS1FZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9OQzF6Z3Z5LUVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTkMxemdfeS1FZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMCwgMjg1NywgMCwgLTYxMjVdJFswLCA0NDQ0LCAwLCAtNDUzOF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfTkM3NklQeS1FZG0xODV6dnYwV01fUSIgc291cmNlPSJfTTdyYmtQeS1FZG0xODV6dnYwV01fUSIgdGFyZ2V0PSJfS0RpdzBQeS1FZG0xODV6dnYwV01fUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OQzc2SV95LUVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OQzc2SmZ5LUVkbTE4NXp2djBXTV9RIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeVtqY3VebmFtZT1MaW5rSGVscGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlMaW5rSGVscGVyW2pjdV5uYW1lPUlMaW5rSGVscGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTkM3NkpfeS1FZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1JTGlua0hlbHBlcltqY3VebmFtZT1JTGlua0hlbHBlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX05DNzZKdnktRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUxpbmtIZWxwZXJbamN1Xm5hbWU9SUxpbmtIZWxwZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeVtqY3VebmFtZT1MaW5rSGVscGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUlMaW5rSGVscGVyW2pjdV5uYW1lPUlMaW5rSGVscGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9OQzc2SlB5LUVkbTE4NXp2djBXTV9RIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9OQzc2SWZ5LUVkbTE4NXp2djBXTV9RIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9SUxpbmtIZWxwZXJbamN1Xm5hbWU9SUxpbmtIZWxwZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTkM3Nkl2eS1FZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX05DNzZLUHktRWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iX003cmJrUHktRWRtMTg1enZ2MFdNX1EiIHRhcmdldD0iX003cmJrUHktRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTkM3NktfeS1FZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTkM3NkxmeS1FZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OQzc2TF95LUVkbTE4NXp2djBXTV9RIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeVtqY3VebmFtZT1MaW5rSGVscGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeVtqY3VebmFtZT1MaW5rSGVscGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX05DNzZMdnktRWRtMTg1enZ2MFdNX1EiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX05DNzZMUHktRWRtMTg1enZ2MFdNX1EiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX05DNzZLZnktRWRtMTg1enZ2MFdNX1EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTkM3Nkt2eS1FZG0xODV6dnYwV01fUSIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX05DNzZNUHktRWRtMTg1enZ2MFdNX1EiIHNvdXJjZT0iX003cmJrUHktRWRtMTg1enZ2MFdNX1EiIHRhcmdldD0iX005ZlpjUHktRWRtMTg1enZ2MFdNX1EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTkM3Nk1feS1FZG0xODV6dnYwV01fUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTkM3Nk5meS1FZG0xODV6dnYwV01fUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1EZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX05DNzZOX3ktRWRtMTg1enZ2MFdNX1EiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RGVzY3JpcHRvcltqc3JjdHlwZV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeVtqY3VebmFtZT1MaW5rSGVscGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OQzc2TnZ5LUVkbTE4NXp2djBXTV9RIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeVtqY3VebmFtZT1MaW5rSGVscGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPURlc2NyaXB0b3JbanNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1EZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5W2pjdV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmV4dGVuc2lvbnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTkM3Nk5QeS1FZG0xODV6dnYwV01fUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfTkM3Nk1meS1FZG0xODV6dnYwV01fUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUxpbmtIZWxwZXJSZWdpc3RyeVtqY3VebmFtZT1MaW5rSGVscGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5leHRlbnNpb25zW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPURlc2NyaXB0b3JbanNyY3R5cGVebmFtZT1MaW5rSGVscGVyUmVnaXN0cnlbamN1Xm5hbWU9TGlua0hlbHBlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX05DNzZNdnktRWRtMTg1enZ2MFdNX1EiIHBvaW50cz0iWzAsIDI4NTcsIDAsIC02MTI1XSRbMCwgNDQ0NCwgMCwgLTQ1MzhdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgIDwvY29udGVudHM+Ci0gICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il9Na3EwVVB5X0VkbTE4NXp2djBXTV9RIiB0eXBlPSJDbGFzcyIgZWxlbWVudD0iX1NXWDNVSDVHRWRtNzk3c3ppa0hqb1EiIG5hbWU9IkRpYWdyYW0yIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISldROFAwSUVkbUlYTVVRbnR6Z1hBIiBzb3VyY2VFZGdlcz0iX0hjaTV3UDBJRWRtSVhNVVFudHpnWEEgX0hjaTV5UDBJRWRtSVhNVVFudHpnWEEiIHRhcmdldEVkZ2VzPSJfY29oNTRQMEpFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISm9rMFAwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyW2pjdV5uYW1lPUNvbW1vblZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpvazBmMElFZG1JWE1VUW50emdYQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpvazB2MElFZG1JWE1VUW50emdYQSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vblZpZXdlckZpbHRlcltqY3VebmFtZT1Db21tb25WaWV3ZXJGaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISm9rMF8wSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyW2pjdV5uYW1lPUNvbW1vblZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKb2sxUDBJRWRtSVhNVVFudHpnWEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKb2sxZjBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyW2pjdV5uYW1lPUNvbW1vblZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKb2sxdjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpvazFfMElFZG1JWE1VUW50emdYQSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25WaWV3ZXJGaWx0ZXJbamN1Xm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpvazJQMElFZG1JWE1VUW50emdYQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpvazJmMElFZG1JWE1VUW50emdYQSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25WaWV3ZXJGaWx0ZXJbamN1Xm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpvazJ2MElFZG1JWE1VUW50emdYQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKb2syXzBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyW2pjdV5uYW1lPUNvbW1vblZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpXUThmMElFZG1JWE1VUW50emdYQSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21tb25WaWV3ZXJGaWx0ZXJbamN1Xm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISldROHYwSUVkbUlYTVVRbnR6Z1hBIiB4PSIyMjI2MCIgeT0iNjY3OCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzRpQVAwSUVkbUlYTVVRbnR6Z1hBIiBzb3VyY2VFZGdlcz0iX0hjcEFaZjBJRWRtSVhNVVFudHpnWEEgX0hjcEFiZjBJRWRtSVhNVVFudHpnWEEiIHRhcmdldEVkZ2VzPSJfSGNpNXdQMElFZG1JWE1VUW50emdYQSBfSGNwQVpmMElFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzRpQV8wSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEs0aUJQMElFZG1JWE1VUW50emdYQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs0aUJmMElFZG1JWE1VUW50emdYQSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzRpQnYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLNGlCXzBJRWRtSVhNVVFudHpnWEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLNGlDUDBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLNGlDZjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs0aUN2MElFZG1JWE1VUW50emdYQSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs0aUNfMElFZG1JWE1VUW50emdYQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs0aURQMElFZG1JWE1VUW50emdYQSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs0aURmMElFZG1JWE1VUW50emdYQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLNGlEdjBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEs0aUFmMElFZG1JWE1VUW50emdYQSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISzRpQXYwSUVkbUlYTVVRbnR6Z1hBIiB4PSIxNDc0NiIgeT0iNjY1MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITGpRWVAwSUVkbUlYTVVRbnR6Z1hBIiBzb3VyY2VFZGdlcz0iX0hjcEFkZjBJRWRtSVhNVVFudHpnWEEgX0hjcEFmZjBJRWRtSVhNVVFudHpnWEEgX0hjdkhBZjBJRWRtSVhNVVFudHpnWEEgX0hjdkhDZjBJRWRtSVhNVVFudHpnWEEgX0hjdkhFZjBJRWRtSVhNVVFudHpnWEEiIHRhcmdldEVkZ2VzPSJfSGNwQWJmMElFZG1JWE1VUW50emdYQSBfSGMxTnVfMElFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITGpRWV8wSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMalFaUDBJRWRtSVhNVVFudHpnWEEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMalFaZjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMalFadjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMalFaXzBJRWRtSVhNVVFudHpnWEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMalFhUDBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITGpRYWYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMalFhdjBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITGpRYV8wSUVkbUlYTVVRbnR6Z1hBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITGpRYlAwSUVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExqUWJmMElFZG1JWE1VUW50emdYQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMalFidjBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMalFZZjBJRWRtSVhNVVFudHpnWEEiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMalFZdjBJRWRtSVhNVVFudHpnWEEiIHg9IjE0OTQ2IiB5PSIxMzY3NCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IU0pBa1AwSUVkbUlYTVVRbnR6Z1hBIiBzb3VyY2VFZGdlcz0iX0hjdkhHZjBJRWRtSVhNVVFudHpnWEEiIHRhcmdldEVkZ2VzPSJfSGMxTnNfMElFZG1JWE1VUW50emdYQSBfQmxfck1QMEtFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IU0pBa18wSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSFNKQWxQMElFZG1JWE1VUW50emdYQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFNQSE1QMElFZG1JWE1VUW50emdYQSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlcltqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJGaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IU1BITWYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hTUEhNdjBJRWRtSVhNVVFudHpnWEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hTUEhNXzBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hTUEhOUDBJRWRtSVhNVVFudHpnWEEiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSFNQSE5mMElFZG1JWE1VUW50emdYQSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JWaWV3ZXJGaWx0ZXJbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFNQSE52MElFZG1JWE1VUW50emdYQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSFNQSE5fMElFZG1JWE1VUW50emdYQSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JWaWV3ZXJGaWx0ZXJbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFNQSE9QMElFZG1JWE1VUW50emdYQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hTUEhPZjBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSFNKQWtmMElFZG1JWE1VUW50emdYQSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JWaWV3ZXJGaWx0ZXJbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IU0pBa3YwSUVkbUlYTVVRbnR6Z1hBIiB4PSI3MzE0IiB5PSIyNzM0OCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IU3RvVVAwSUVkbUlYTVVRbnR6Z1hBIiB0YXJnZXRFZGdlcz0iX0hjdkhHZjBJRWRtSVhNVVFudHpnWEEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFN0b1VfMElFZG1JWE1VUW50emdYQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlcltqY3VebmFtZT1OYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hTdG9WUDBJRWRtSVhNVVFudHpnWEEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hTdG9WZjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXJbamN1Xm5hbWU9TmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFN0b1Z2MElFZG1JWE1VUW50emdYQSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlcltqY3VebmFtZT1OYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IU3RvVl8wSUVkbUlYTVVRbnR6Z1hBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IU3RvV1AwSUVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlcltqY3VebmFtZT1OYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IU3RvV2YwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hTdG9XdjBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hTdG9XXzBJRWRtSVhNVVFudHpnWEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hTdG9YUDBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hTenU4UDBJRWRtSVhNVVFudHpnWEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IU3p1OGYwSUVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlcltqY3VebmFtZT1OYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hTdG9VZjBJRWRtSVhNVVFudHpnWEEiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSFN0b1V2MElFZG1JWE1VUW50emdYQSIgeD0iNjk5NiIgeT0iMjI1NzgiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFRNSmNQMElFZG1JWE1VUW50emdYQSIgc291cmNlRWRnZXM9Il9IYzFOb1AwSUVkbUlYTVVRbnR6Z1hBIF9IYzFOb18wSUVkbUlYTVVRbnR6Z1hBIiB0YXJnZXRFZGdlcz0iX0hjdkhBZjBJRWRtSVhNVVFudHpnWEEgX3NwMzJrUDBKRWRtSVhNVVFudHpnWEEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFRNSmNfMElFZG1JWE1VUW50emdYQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5W2pjdV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IVE1KZFAwSUVkbUlYTVVRbnR6Z1hBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IVE1KZGYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IVE1KZHYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IVE1KZF8wSUVkbUlYTVVRbnR6Z1hBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IVE1KZVAwSUVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5W2pjdV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFRNSmVmMElFZG1JWE1VUW50emdYQSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IVE1KZXYwSUVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5W2pjdV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFRNSmVfMElFZG1JWE1VUW50emdYQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSFRNSmZQMElFZG1JWE1VUW50emdYQSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeVtqY3VebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hUTUpmZjBJRWRtSVhNVVFudHpnWEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IVE1KZnYwSUVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5W2pjdV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IVE1KY2YwSUVkbUlYTVVRbnR6Z1hBIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5W2pjdV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IVE1KY3YwSUVkbUlYTVVRbnR6Z1hBIiB4PSIxMzcyMiIgeT0iMjI1ODQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFQ4LWNQMElFZG1JWE1VUW50emdYQSIgdGFyZ2V0RWRnZXM9Il9IY3ZIQ2YwSUVkbUlYTVVRbnR6Z1hBIF9IYzFOb1AwSUVkbUlYTVVRbnR6Z1hBIF9IYzFOb18wSUVkbUlYTVVRbnR6Z1hBIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hUOC1jXzBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJEZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IVDgtZFAwSUVkbUlYTVVRbnR6Z1hBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IVDgtZGYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyRGVzY3JpcHRvcltqc3JjdHlwZV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5W2pjdV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hUOC1kdjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJEZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFQ4LWRfMElFZG1JWE1VUW50emdYQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSFQ4LWVQMElFZG1JWE1VUW50emdYQSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJEZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFQ4LWVmMElFZG1JWE1VUW50emdYQSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IVDgtZXYwSUVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlckRlc2NyaXB0b3JbanNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeVtqY3VebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IVDgtZV8wSUVkbUlYTVVRbnR6Z1hBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IVDgtZlAwSUVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlckRlc2NyaXB0b3JbanNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeVtqY3VebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IVDgtZmYwSUVkbUlYTVVRbnR6Z1hBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSFQ4LWZ2MElFZG1JWE1VUW50emdYQSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJEZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IVDgtY2YwSUVkbUlYTVVRbnR6Z1hBIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlckRlc2NyaXB0b3JbanNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeVtqY3VebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hUOC1jdjBJRWRtSVhNVVFudHpnWEEiIHg9IjEzOTkyIiB5PSIyNzAzMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IVkFIVVAwSUVkbUlYTVVRbnR6Z1hBIiBzb3VyY2VFZGdlcz0iX0hjMU5xXzBJRWRtSVhNVVFudHpnWEEgX0hjMU5zXzBJRWRtSVhNVVFudHpnWEEiIHRhcmdldEVkZ2VzPSJfSGNpNXlQMElFZG1JWE1VUW50emdYQSBfSGNwQWZmMElFZG1JWE1VUW50emdYQSBfSGMxTnFfMElFZG1JWE1VUW50emdYQSBfSGM3VVFQMElFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IVkFIVV8wSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IVkFIVlAwSUVkbUlYTVVRbnR6Z1hBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IVkFIVmYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFZBSFZ2MElFZG1JWE1VUW50emdYQSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hWQUhWXzBJRWRtSVhNVVFudHpnWEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hWQUhXUDBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFZBSFdmMElFZG1JWE1VUW50emdYQSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IVkFIV3YwSUVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hWQUhXXzBJRWRtSVhNVVFudHpnWEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hWQUhYUDBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFZBSFhmMElFZG1JWE1VUW50emdYQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hWQUhYdjBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IVkFIVWYwSUVkbUlYTVVRbnR6Z1hBIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSFZBSFV2MElFZG1JWE1VUW50emdYQSIgeD0iNjA0MiIgeT0iMTQ2MjgiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFhrNk1QMElFZG1JWE1VUW50emdYQSIgdGFyZ2V0RWRnZXM9Il9IY3ZIRWYwSUVkbUlYTVVRbnR6Z1hBIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hYazZNXzBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUV4dGVuc2lvbkZpbHRlclByb3ZpZGVyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IWGs2TlAwSUVkbUlYTVVRbnR6Z1hBIiB3aWR0aD0iNTMwIiBoZWlnaHQ9IjUzMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFhrNk5mMElFZG1JWE1VUW50emdYQSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IWGs2TnYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1FeHRlbnNpb25GaWx0ZXJQcm92aWRlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hYazZOXzBJRWRtSVhNVVFudHpnWEEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUV4dGVuc2lvbkZpbHRlclByb3ZpZGVyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFhrNk9QMElFZG1JWE1VUW50emdYQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSFhrNk9mMElFZG1JWE1VUW50emdYQSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUV4dGVuc2lvbkZpbHRlclByb3ZpZGVyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFhrNk92MElFZG1JWE1VUW50emdYQSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IWGs2T18wSUVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IWGs2UFAwSUVkbUlYTVVRbnR6Z1hBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IWGs2UGYwSUVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENsYXNzaWZpZXJTdHlsZSIgeG1pOmlkPSJfSFhrNk1mMElFZG1JWE1VUW50emdYQSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIiB1c2VDbGFzc2lmaWVyU2hhcGU9InRydWUiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hYazZNdjBJRWRtSVhNVVFudHpnWEEiIHg9IjIxNjkwIiB5PSIyMjU4OCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IWVdXUVAwSUVkbUlYTVVRbnR6Z1hBIiBzb3VyY2VFZGdlcz0iX0hjMU51XzBJRWRtSVhNVVFudHpnWEEgX0hjN1VRUDBJRWRtSVhNVVFudHpnWEEiIHRhcmdldEVkZ2VzPSJfSGNwQWRmMElFZG1JWE1VUW50emdYQSBfaWZHcnNQMEpFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IWVdXUV8wSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hZV1dSUDBJRWRtSVhNVVFudHpnWEEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hZV1dSZjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hZY2M0UDBJRWRtSVhNVVFudHpnWEEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hZY2M0ZjBJRWRtSVhNVVFudHpnWEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hZY2M0djBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IWWNjNF8wSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hZY2M1UDBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IWWNjNWYwSUVkbUlYTVVRbnR6Z1hBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IWWNjNXYwSUVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSFljYzVfMElFZG1JWE1VUW50emdYQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hZY2M2UDBJRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hZV1dRZjBJRWRtSVhNVVFudHpnWEEiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hZV1dRdjBJRWRtSVhNVVFudHpnWEEiIHg9IjYyMTAiIHk9IjY2NjEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVzNCMVVQMEpFZG1JWE1VUW50emdYQSIgc291cmNlRWRnZXM9Il9jb2g1NFAwSkVkbUlYTVVRbnR6Z1hBIiBlbGVtZW50PSJfV3JMeHNQMEpFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9XM0g3OFAwSkVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJDb21tZW50Qm9keSIgZWxlbWVudD0iX1dyTHhzUDBKRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfVzNCMVVmMEpFZG1JWE1VUW50emdYQSIgZmlsbENvbG9yPSIxNjc2Mzg1MCIgbGluZUNvbG9yPSIxNjc0NDU3NiIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1czQjFVdjBKRWRtSVhNVVFudHpnWEEiIHg9IjIyMjYwIiB5PSIzNDk4IiB3aWR0aD0iNDQ0NSIgaGVpZ2h0PSIyMjIyIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VNNTJzUDBKRWRtSVhNVVFudHpnWEEiIHNvdXJjZUVkZ2VzPSJfaWZHcnNQMEpFZG1JWE1VUW50emdYQSIgZWxlbWVudD0iX2VNaGNNUDBKRWRtSVhNVVFudHpnWEEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZU01MnNfMEpFZG1JWE1VUW50emdYQSIgdHlwZT0iQ29tbWVudEJvZHkiIGVsZW1lbnQ9Il9lTWhjTVAwSkVkbUlYTVVRbnR6Z1hBIi8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2VNNTJzZjBKRWRtSVhNVVFudHpnWEEiIGZpbGxDb2xvcj0iMTY3NjM4NTAiIGxpbmVDb2xvcj0iMTY3NDQ1NzYiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9lTTUyc3YwSkVkbUlYTVVRbnR6Z1hBIiB4PSI5NTIiIHk9IjY2NjciIHdpZHRoPSI0MTI3IiBoZWlnaHQ9IjI1MzkiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbEd0bklQMEpFZG1JWE1VUW50emdYQSIgc291cmNlRWRnZXM9Il9zcDMya1AwSkVkbUlYTVVRbnR6Z1hBIiBlbGVtZW50PSJfbEdWTW9QMEpFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9sR3RuSV8wSkVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJDb21tZW50Qm9keSIgZWxlbWVudD0iX2xHVk1vUDBKRWRtSVhNVVFudHpnWEEiLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfbEd0bklmMEpFZG1JWE1VUW50emdYQSIgZmlsbENvbG9yPSIxNjc2Mzg1MCIgbGluZUNvbG9yPSIxNjc0NDU3NiIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2xHdG5JdjBKRWRtSVhNVVFudHpnWEEiIHg9IjIxOTQyIiB5PSIyNDgwNCIgd2lkdGg9IjUzOTciIGhlaWdodD0iMjI0OCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8teHJ3Z1AwSkVkbUlYTVVRbnR6Z1hBIiBzb3VyY2VFZGdlcz0iX0JsX3JNUDBLRWRtSVhNVVFudHpnWEEiIGVsZW1lbnQ9Il8teFRXQVAwSkVkbUlYTVVRbnR6Z1hBIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy14cndnXzBKRWRtSVhNVVFudHpnWEEiIHR5cGU9IkNvbW1lbnRCb2R5IiBlbGVtZW50PSJfLXhUV0FQMEpFZG1JWE1VUW50emdYQSIvPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il8teHJ3Z2YwSkVkbUlYTVVRbnR6Z1hBIiBmaWxsQ29sb3I9IjE2NzYzODUwIiBsaW5lQ29sb3I9IjE2NzQ0NTc2IiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfLXhyd2d2MEpFZG1JWE1VUW50emdYQSIgeD0iNzMxNCIgeT0iMzAyMTAiIHdpZHRoPSIzNDkyIiBoZWlnaHQ9IjE1ODciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX01rcTBVZnlfRWRtMTg1enZ2MFdNX1EiLz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IY2k1d1AwSUVkbUlYTVVRbnR6Z1hBIiBzb3VyY2U9Il9ISldROFAwSUVkbUlYTVVRbnR6Z1hBIiB0YXJnZXQ9Il9ISzRpQVAwSUVkbUlYTVVRbnR6Z1hBIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjaTV3XzBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjaTV4ZjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyW2pjdV5uYW1lPUNvbW1vblZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGNpNXhfMElFZG1JWE1VUW50emdYQSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25WaWV3ZXJGaWx0ZXJbamN1Xm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY2k1eHYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vblZpZXdlckZpbHRlcltqY3VebmFtZT1Db21tb25WaWV3ZXJGaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyW2pjdV5uYW1lPUNvbW1vblZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IY2k1eFAwSUVkbUlYTVVRbnR6Z1hBIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IY2k1d2YwSUVkbUlYTVVRbnR6Z1hBIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyW2pjdV5uYW1lPUNvbW1vblZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hjaTV3djBJRWRtSVhNVVFudHpnWEEiIHBvaW50cz0iWzAsIDE3OTksIDQwMDgsIC01Mjc5XSRbLTQwMjIsIDMzODcsIC0xNCwgLTM2OTFdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0hjaTV5UDBJRWRtSVhNVVFudHpnWEEiIHNvdXJjZT0iX0hKV1E4UDBJRWRtSVhNVVFudHpnWEEiIHRhcmdldD0iX0hWQUhVUDBJRWRtSVhNVVFudHpnWEEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGNwQVlQMElFZG1JWE1VUW50emdYQSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGNwQVl2MElFZG1JWE1VUW50emdYQSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25WaWV3ZXJGaWx0ZXJbamN1Xm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjcEFaUDBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyW2pjdV5uYW1lPUNvbW1vblZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3BBWV8wSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vblZpZXdlckZpbHRlcltqY3VebmFtZT1Db21tb25WaWV3ZXJGaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21tb25WaWV3ZXJGaWx0ZXJbamN1Xm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSGNwQVlmMElFZG1JWE1VUW50emdYQSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSGNpNXlmMElFZG1JWE1VUW50emdYQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbW1vblZpZXdlckZpbHRlcltqY3VebmFtZT1Db21tb25WaWV3ZXJGaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hjaTV5djBJRWRtSVhNVVFudHpnWEEiIHBvaW50cz0iWzAsIDE3OTksIDEyMDc4LCAtMjg1MDldJFswLCAyMTAwOSwgMTIwNzgsIC05Mjk5XSRbLTEyMDkyLCAyMjU5NSwgLTE0LCAtNzcxM10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfSGNwQVpmMElFZG1JWE1VUW50emdYQSIgc291cmNlPSJfSEs0aUFQMElFZG1JWE1VUW50emdYQSIgdGFyZ2V0PSJfSEs0aUFQMElFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3BBYVAwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3BBYXYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjcEFiUDBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGNwQWFfMElFZG1JWE1VUW50emdYQSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSGNwQWFmMElFZG1JWE1VUW50emdYQSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSGNwQVp2MElFZG1JWE1VUW50emdYQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IY3BBWl8wSUVkbUlYTVVRbnR6Z1hBIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfSGNwQWJmMElFZG1JWE1VUW50emdYQSIgc291cmNlPSJfSEs0aUFQMElFZG1JWE1VUW50emdYQSIgdGFyZ2V0PSJfSExqUVlQMElFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3BBY1AwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3BBY3YwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3BBZFAwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3BBY18wSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hjcEFjZjBJRWRtSVhNVVFudHpnWEEiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hjcEFidjBJRWRtSVhNVVFudHpnWEEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hjcEFiXzBJRWRtSVhNVVFudHpnWEEiIHBvaW50cz0iWy0xNCwgMzY5MCwgMTQ0MiwgLTU5MTRdJFstMTQ2OSwgNTI3OCwgLTEzLCAtNDMyNl0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfSGNwQWRmMElFZG1JWE1VUW50emdYQSIgc291cmNlPSJfSExqUVlQMElFZG1JWE1VUW50emdYQSIgdGFyZ2V0PSJfSFlXV1FQMElFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3BBZVAwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3BBZXYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGNwQWZQMElFZG1JWE1VUW50emdYQSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjcEFlXzBJRWRtSVhNVVFudHpnWEEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IY3BBZWYwSUVkbUlYTVVRbnR6Z1hBIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IY3BBZHYwSUVkbUlYTVVRbnR6Z1hBIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSGNwQWRfMElFZG1JWE1VUW50emdYQSIgcG9pbnRzPSJbLTEzLCAtNDMyNiwgNjYxNCwgNTI3OF0kWy02NjI4LCAtNTkxNCwgLTEsIDM2OTBdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0hjcEFmZjBJRWRtSVhNVVFudHpnWEEiIHNvdXJjZT0iX0hMalFZUDBJRWRtSVhNVVFudHpnWEEiIHRhcmdldD0iX0hWQUhVUDBJRWRtSVhNVVFudHpnWEEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGNwQWdQMElFZG1JWE1VUW50emdYQSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGNwQWd2MElFZG1JWE1VUW50emdYQSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3ZIQVAwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjcEFnXzBJRWRtSVhNVVFudHpnWEEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hjcEFnZjBJRWRtSVhNVVFudHpnWEEiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hjcEFmdjBJRWRtSVhNVVFudHpnWEEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSGNwQWZfMElFZG1JWE1VUW50emdYQSIgcG9pbnRzPSJbLTEzLCA0MzI2LCA2NjAxLCAtOTMwMF0kWy02NjI4LCA1OTEzLCAtMTQsIC03NzEzXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IY3ZIQWYwSUVkbUlYTVVRbnR6Z1hBIiBzb3VyY2U9Il9ITGpRWVAwSUVkbUlYTVVRbnR6Z1hBIiB0YXJnZXQ9Il9IVE1KY1AwSUVkbUlYTVVRbnR6Z1hBIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjdkhCUDBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjdkhCdjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5W2pjdV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3ZIQ1AwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeVtqY3VebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGN2SEJfMElFZG1JWE1VUW50emdYQSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5W2pjdV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hjdkhCZjBJRWRtSVhNVVFudHpnWEEiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hjdkhBdjBJRWRtSVhNVVFudHpnWEEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IY3ZIQV8wSUVkbUlYTVVRbnR6Z1hBIiBwb2ludHM9IlstMTMsIDQzMjYsIC01MjksIC05MzAwXSRbNTE2LCA1OTEzLCAwLCAtNzcxM10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfSGN2SENmMElFZG1JWE1VUW50emdYQSIgc291cmNlPSJfSExqUVlQMElFZG1JWE1VUW50emdYQSIgdGFyZ2V0PSJfSFQ4LWNQMElFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3ZIRFAwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3ZIRHYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJEZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3ZIRVAwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJEZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3ZIRF8wSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJEZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJEZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hjdkhEZjBJRWRtSVhNVVFudHpnWEEiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hjdkhDdjBJRWRtSVhNVVFudHpnWEEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyRGVzY3JpcHRvcltqc3JjdHlwZV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5W2pjdV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hjdkhDXzBJRWRtSVhNVVFudHpnWEEiIHBvaW50cz0iWy0xMywgNDMyNiwgLTI1MTQsIC0yMDM4Nl0kWzQ0ODUsIDU5MTMsIDE5ODQsIC0xODc5OV0kWzQ0ODUsIDIxMzM5LCAxOTg0LCAtMzM3M10kWzI1MDAsIDIyOTI2LCAtMSwgLTE3ODZdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0hjdkhFZjBJRWRtSVhNVVFudHpnWEEiIHNvdXJjZT0iX0hMalFZUDBJRWRtSVhNVVFudHpnWEEiIHRhcmdldD0iX0hYazZNUDBJRWRtSVhNVVFudHpnWEEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGN2SEZQMElFZG1JWE1VUW50emdYQSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGN2SEZ2MElFZG1JWE1VUW50emdYQSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjdkhHUDBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclByb3ZpZGVyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3ZIRl8wSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJQcm92aWRlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyUHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSGN2SEZmMElFZG1JWE1VUW50emdYQSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSGN2SEV2MElFZG1JWE1VUW50emdYQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJQcm92aWRlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJQcm92aWRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hjdkhFXzBJRWRtSVhNVVFudHpnWEEiIHBvaW50cz0iWy0xMywgNDMyNiwgLTc3MjYsIC05MzAwXSRbNzcxMywgNTkxMywgMCwgLTc3MTNdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0hjdkhHZjBJRWRtSVhNVVFudHpnWEEiIHNvdXJjZT0iX0hTSkFrUDBJRWRtSVhNVVFudHpnWEEiIHRhcmdldD0iX0hTdG9VUDBJRWRtSVhNVVFudHpnWEEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGN2SEhQMElFZG1JWE1VUW50emdYQSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGN2SEh2MElFZG1JWE1VUW50emdYQSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JWaWV3ZXJGaWx0ZXJbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXJbamN1Xm5hbWU9TmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IY3ZISF8wSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlcltqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJGaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlcltqY3VebmFtZT1OYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IY3ZISGYwSUVkbUlYTVVRbnR6Z1hBIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IY3ZIR3YwSUVkbUlYTVVRbnR6Z1hBIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hjdkhHXzBJRWRtSVhNVVFudHpnWEEiIHBvaW50cz0iWzAsIC0xNzg2LCAzMDU2LCA5MzAwXSRbLTMwNzAsIC0zMzczLCAtMTQsIDc3MTNdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0hjMU5vUDBJRWRtSVhNVVFudHpnWEEiIHR5cGU9Ik93bmVkRWxlbWVudCIgc291cmNlPSJfSFRNSmNQMElFZG1JWE1VUW50emdYQSIgdGFyZ2V0PSJfSFQ4LWNQMElFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IYzFOb2YwSUVkbUlYTVVRbnR6Z1hBIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSGMxTm92MElFZG1JWE1VUW50emdYQSIgcG9pbnRzPSJbMCwgNzcxMywgLTE5ODUsIC0zMzczXSRbMTk4NCwgOTMwMCwgLTEsIC0xNzg2XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IYzFOb18wSUVkbUlYTVVRbnR6Z1hBIiBzb3VyY2U9Il9IVE1KY1AwSUVkbUlYTVVRbnR6Z1hBIiB0YXJnZXQ9Il9IVDgtY1AwSUVkbUlYTVVRbnR6Z1hBIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjMU5wdjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjMU5xUDBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlckRlc2NyaXB0b3JbanNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeVtqY3VebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjMU5xdjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlckRlc2NyaXB0b3JbanNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeVtqY3VebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjMU5xZjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlckRlc2NyaXB0b3JbanNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeVtqY3VebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlckRlc2NyaXB0b3JbanNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeVtqY3VebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSGMxTnBfMElFZG1JWE1VUW50emdYQSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSGMxTnBQMElFZG1JWE1VUW50emdYQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5W2pjdV5uYW1lPVRoaXJkUGFydHlGaWx0ZXJQcm92aWRlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1UaGlyZFBhcnR5RmlsdGVyUHJvdmlkZXJEZXNjcmlwdG9yW2pzcmN0eXBlXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSGMxTnBmMElFZG1JWE1VUW50emdYQSIgcG9pbnRzPSJbMCwgNzcxMywgLTE5ODUsIC0zMzczXSRbMTk4NCwgOTMwMCwgLTEsIC0xNzg2XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IYzFOcV8wSUVkbUlYTVVRbnR6Z1hBIiBzb3VyY2U9Il9IVkFIVVAwSUVkbUlYTVVRbnR6Z1hBIiB0YXJnZXQ9Il9IVkFIVVAwSUVkbUlYTVVRbnR6Z1hBIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjMU5ydjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjMU5zUDBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjMU5zdjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjMU5zZjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSGMxTnJfMElFZG1JWE1VUW50emdYQSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSGMxTnJQMElFZG1JWE1VUW50emdYQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSGMxTnJmMElFZG1JWE1VUW50emdYQSIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0hjMU5zXzBJRWRtSVhNVVFudHpnWEEiIHNvdXJjZT0iX0hWQUhVUDBJRWRtSVhNVVFudHpnWEEiIHRhcmdldD0iX0hTSkFrUDBJRWRtSVhNVVFudHpnWEEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGMxTnR2MElFZG1JWE1VUW50emdYQSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGMxTnVQMElFZG1JWE1VUW50emdYQSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlcltqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJGaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjMU51djBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1OYXZpZ2F0b3JWaWV3ZXJGaWx0ZXJbamN1Xm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IYzFOdWYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlcltqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJGaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSGMxTnRfMElFZG1JWE1VUW50emdYQSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSGMxTnRQMElFZG1JWE1VUW50emdYQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9TmF2aWdhdG9yVmlld2VyRmlsdGVyW2pjdV5uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hjMU50ZjBJRWRtSVhNVVFudHpnWEEiIHBvaW50cz0iWy0yNTY2LCAyNywgLTM1MTksIC0xMDM3Ml0kWy0zNzA0LCAyNywgLTQ2NTcsIC0xMDM3Ml0kWy0zNzA0LCAxMDQyNSwgLTQ2NTcsIDI2XSRbLTEyOTYsIDEwNDI1LCAtMjI0OSwgMjZdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0hjMU51XzBJRWRtSVhNVVFudHpnWEEiIHNvdXJjZT0iX0hZV1dRUDBJRWRtSVhNVVFudHpnWEEiIHRhcmdldD0iX0hMalFZUDBJRWRtSVhNVVFudHpnWEEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGMxTnZ2MElFZG1JWE1VUW50emdYQSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGMxTndQMElFZG1JWE1VUW50emdYQSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjMU53djBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5W2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IYzFOd2YwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnlbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSGMxTnZfMElFZG1JWE1VUW50emdYQSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSGMxTnZQMElFZG1JWE1VUW50emdYQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeVtqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hjMU52ZjBJRWRtSVhNVVFudHpnWEEiIHBvaW50cz0iWy0xLCAzNjkwLCAtNjYyOCwgLTU5MTRdJFs2NjE0LCA1Mjc4LCAtMTMsIC00MzI2XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IYzdVUVAwSUVkbUlYTVVRbnR6Z1hBIiBzb3VyY2U9Il9IWVdXUVAwSUVkbUlYTVVRbnR6Z1hBIiB0YXJnZXQ9Il9IVkFIVVAwSUVkbUlYTVVRbnR6Z1hBIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjN1VRXzBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hjN1VSZjBJRWRtSVhNVVFudHpnWEEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSGM3VVJfMElFZG1JWE1VUW50emdYQSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltqY3VebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IYzdVUnYwSUVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZmlsdGVyc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXV1banNyY3R5cGVebmFtZT1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yW2pjdV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IYzdVUlAwSUVkbUlYTVVRbnR6Z1hBIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IYzdVUWYwSUVkbUlYTVVRbnR6Z1hBIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dXVtqc3JjdHlwZV5uYW1lPUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hjN1VRdjBJRWRtSVhNVVFudHpnWEEiIHBvaW50cz0iWy0xLCAzNjkwLCAtMTQsIC0xOTU0MF0kWy0xLCAxNTUxNywgLTE0LCAtNzcxM10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfY29oNTRQMEpFZG1JWE1VUW50emdYQSIgdHlwZT0iUmVmZXJlbmNlIiBzb3VyY2U9Il9XM0IxVVAwSkVkbUlYTVVRbnR6Z1hBIiB0YXJnZXQ9Il9ISldROFAwSUVkbUlYTVVRbnR6Z1hBIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2NvaDU0ZjBKRWRtSVhNVVFudHpnWEEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9jb2g1NHYwSkVkbUlYTVVRbnR6Z1hBIiBwb2ludHM9IlstODUsIDgsIDI2MSwgLTI0XSRbLTEyOSwgOCwgMjE3LCAtMjRdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX2lmR3JzUDBKRWRtSVhNVVFudHpnWEEiIHR5cGU9IlJlZmVyZW5jZSIgc291cmNlPSJfZU01MnNQMEpFZG1JWE1VUW50emdYQSIgdGFyZ2V0PSJfSFlXV1FQMElFZG1JWE1VUW50emdYQSI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9pZkdyc2YwSkVkbUlYTVVRbnR6Z1hBIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaWZHcnN2MEpFZG1JWE1VUW50emdYQSIgcG9pbnRzPSJbNzksIDEwLCAtMTk0LCAtODBdJFsyMjIsIC00OSwgLTUxLCAtMTM5XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zcDMya1AwSkVkbUlYTVVRbnR6Z1hBIiB0eXBlPSJSZWZlcmVuY2UiIHNvdXJjZT0iX2xHdG5JUDBKRWRtSVhNVVFudHpnWEEiIHRhcmdldD0iX0hUTUpjUDBJRWRtSVhNVVFudHpnWEEiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3AzMmtmMEpFZG1JWE1VUW50emdYQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3NwMzJrdjBKRWRtSVhNVVFudHpnWEEiIHBvaW50cz0iWy0xMDMsIDEsIDIzMiwgNjJdJFstMjY0LCAzOCwgNzEsIDk5XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9CbF9yTVAwS0VkbUlYTVVRbnR6Z1hBIiB0eXBlPSJSZWZlcmVuY2UiIHNvdXJjZT0iXy14cndnUDBKRWRtSVhNVVFudHpnWEEiIHRhcmdldD0iX0hTSkFrUDBJRWRtSVhNVVFudHpnWEEiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfQmxfck1mMEtFZG1JWE1VUW50emdYQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0JsX3JNdjBLRWRtSVhNVVFudHpnWEEiIHBvaW50cz0iWzY3LCAyOCwgLTEyNiwgLTM1XSRbMTA4LCA1NiwgLTg1LCAtN10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgPC9jb250ZW50cz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfMXJCVm9JTzFFZG15ZC0tY1hscnF5USIgYm9keT0iVGhlIExvZ2ljYWwgRXh0ZW5zaW9uIHVzZXMgdmFyaW91cyBjbGFzc2VzIHRvIHN1cHBseSBpbmZvcm1hdGlvbiB0byB0aGUgQ29tbW9uIE5hdmlnYXRvci4gU2VlIHRoZSBleHRlbnNpb24gcG9pbnQ6ICYjeEQ7JiN4QTtvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MmI3hEOyYjeEE7IGZvciBtb3JlIGRldGFpbHMuIi8+Ci0gIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfbUpWaVlQeTBFZG0xODV6dnYwV01fUSIgYm9keT0iVGhlIENOTSBoYW5kbGVzIHRoZSBsb2dpYyBmb3Igc2VsZWN0aW9uIGxpc3RlbmVycyBhbmQgbWVudXMgZm9yIHRoZSBDb21tb25OYXZpZ2F0b3IgdmlldyBwYXJ0LiI+Ci0gICAgPGFubm90YXRlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbW1vbk5hdmlnYXRvck1hbmFnZXJbamN1Xm5hbWU9Q29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gIDwvb3duZWRDb21tZW50PgotICA8b3duZWRDb21tZW50IHhtaTppZD0iX0FEVEtBUHkxRWRtMTg1enZ2MFdNX1EiIGJvZHk9IlRoZSBOQVMgY2FuIG5vdGlmeSBpbnRlcmVzdGVkIHBhcnRpZXMgd2hlbiBDb250ZW50IEV4dGVuc2lvbnMgYXJlIGluaXRpYWxpemVkIGZvciBhIHNwZWNpZmljIGluc3RhbmNlIG9mIHRoZSBDb21tb25OYXZpZ2F0b3IuIChVc2VkIHRvIGZvcmNlIHRoZSBpbml0aWFsaXphdGlvbiBvZiBDb21tb25BY3Rpb25Qcm92aWRlcnMgZm9yIHRoZSB2YXJpb3VzIGV4dGVuc2lvbnMpLiI+Ci0gICAgPGFubm90YXRlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3MuaW50ZXJuYWwuZXh0ZW5zaW9uc1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICA8L293bmVkQ29tbWVudD4KLSAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9NUmUtSVB5MUVkbTE4NXp2djBXTV9RIiBib2R5PSJUaGUgTkFTIGhhbmRsZXMgdGhlIHdvcmsgb2YgYWxsb3dpbmcgQ29tbW9uQWN0aW9uUHJvdmlkZXJzIHRvIGluamVjdCBpdGVtcyBpbnRvIHRoZSBjb250ZXh0IG1lbnUgb2YgdGhlIHZpZXdlciBhbmQgdG8gdXBkYXRlIHRoZSBhY3Rpb24gYmFycyBhcyB0aGUgdXNlciBjaGFuZ2VzIHRoZWlyIHNlbGVjdGlvbiBpbiB0aGUgQ29tbW9uIE5hdmlnYXRvci4iPgotICAgIDxhbm5vdGF0ZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlW2pjdV5uYW1lPU5hdmlnYXRvckFjdGlvblNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICA8L293bmVkQ29tbWVudD4KLSAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9YSXdwc1B5MUVkbTE4NXp2djBXTV9RIiBib2R5PSJUaGUgTkNTIGlzIHRoZSBoZWFydCBvZiB0aGUgZnJhbWV3b3JrIGZvciBjb250ZW50LiBBbnkgdmlld2VyIGNhbiB1c2UgYSBpbnN0YW5jZSBvZiB0aGUgTkNTLiBUaGUgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBhIGRlcGVuZGVuY3kgdG8gYW4gRWNsaXBzZSB2aWV3IHBhcnQsIHNvIGFueSBTdHJ1Y3R1cmVkVmlld2VyIGNvdWxkIHVzZSB0aGUgc2VydmljZS4gVGhlIE5DUyB3aWxsIGNyZWF0ZSBzcGVjaWZpYyBDb250ZW50IFByb3ZpZGVycyBhbmQgTGFiZWwgUHJvdmlkZXJzIGZvciB1c2UgaW4gYW55IHZpZXdlci4gRWFjaCBvZiB0aGUgcHJvdmlkZXIgaW5zdGFuY2VzIGFyZSB0aWVkIHRvIHRoZSBOQ1MgdGhhdCBjcmVhdGVkIHRoZW0uIj4KLSAgICA8YW5ub3RhdGVkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICA8L293bmVkQ29tbWVudD4KLSAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il92QVd3OFB5MUVkbTE4NXp2djBXTV9RIiBib2R5PSJVc2VkIHRvIHN1cHBseSBhIHZpZXdlciB3aXRoIGNvbnRlbnQgb3IgbGFiZWxzIj4KLSAgICA8YW5ub3RhdGVkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c1tqc3Jjcm9vdF5zcmNmb2xkZXI9c3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzXV1dXSIvPgotICAgIDxhbm5vdGF0ZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXJbamN1Xm5hbWU9TmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgPC9vd25lZENvbW1lbnQ+Ci0gIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfV3JMeHNQMEpFZG1JWE1VUW50emdYQSIgYm9keT0iSW50ZWdyYXRlcyB0aGUgZmlsdGVycyBmcm9tIGV4dGVuc2lvbnMuIFRoZXJlIGlzIG9uZSBDb21tb25WaWV3ZXJGaWx0ZXIgcGVyIHZpZXdlciwgbm90IHBlciBmaWx0ZXIuIj4KLSAgICA8YW5ub3RhdGVkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tbW9uVmlld2VyRmlsdGVyW2pjdV5uYW1lPUNvbW1vblZpZXdlckZpbHRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdzLmludGVybmFsLmZpbHRlcnNbanNyY3Jvb3Rec3JjZm9sZGVyPXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3c11dXV0iLz4KLSAgPC9vd25lZENvbW1lbnQ+Ci0gIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfZU1oY01QMEpFZG1JWE1VUW50emdYQSIgYm9keT0iSGFuZGxlcyBhY3RpdmF0aW5nIGZpbHRlcnMgYW5kIG1hbmFnaW5nIHRoZSBwZXJzaXN0YW5jZSBhbmQgcmVzdG9yYXRpb24gb2YgdGhlc2UgYWN0aXZhdGlvbnMuIj4KLSAgICA8YW5ub3RhdGVkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXJbamN1Xm5hbWU9RXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gIDwvb3duZWRDb21tZW50PgotICA8b3duZWRDb21tZW50IHhtaTppZD0iX2xHVk1vUDBKRWRtSVhNVVFudHpnWEEiIGJvZHk9IlByb3ZpZGVzIGludGVncmF0aW9uIHBvaW50IGZvciBSZXNvdXJjZSBOYXZpZ2F0b3IgYW5kIFBhY2thZ2UgRXhwbG9yZXIgZmlsdGVycy4gTGlrZWx5IHRvIGJlIHJlbW92ZWQuIj4KLSAgICA8YW5ub3RhdGVkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnlbamN1Xm5hbWU9VGhpcmRQYXJ0eUZpbHRlclByb3ZpZGVyUmVnaXN0cnkuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gIDwvb3duZWRDb21tZW50PgotICA8b3duZWRDb21tZW50IHhtaTppZD0iXy14VFdBUDBKRWRtSVhNVVFudHpnWEEiIGJvZHk9IlVzZWQgdG8gd3JhcCBmaWx0ZXJzIHByb3ZpZGVkIGZyb20gVGhpcmRQYXJ0eVByb3ZpZGVycyI+Ci0gICAgPGFubm90YXRlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU5hdmlnYXRvclZpZXdlckZpbHRlcltqY3VebmFtZT1OYXZpZ2F0b3JWaWV3ZXJGaWx0ZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3cy5pbnRlcm5hbC5maWx0ZXJzW2pzcmNyb290XnNyY2ZvbGRlcj1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld3NdXV1dIi8+Ci0gIDwvb3duZWRDb21tZW50PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfU1dYM1ZINUdFZG03OTdzemlrSGpvUSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9TV1gzVlg1R0VkbTc5N3N6aWtIam9RIiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfU1dYM1ZuNUdFZG03OTdzemlrSGpvUSIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9CYXNpYy5wcm9maWxlLnVtbDIjXzZtRlJnSzg2RWRpaDktR0c1YWZRMGciLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0Jhc2ljLnByb2ZpbGUudW1sMiNfNm1GUmdLODZFZGloOS1HRzVhZlEwZyIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9TV1gzVjM1R0VkbTc5N3N6aWtIam9RIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX1NXWDNXSDVHRWRtNzk3c3ppa0hqb1EiIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9TV1gzV1g1R0VkbTc5N3N6aWtIam9RIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0ludGVybWVkaWF0ZS5wcm9maWxlLnVtbDIjX0N6N2NzSzg3RWRpaDktR0c1YWZRMGciLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0ludGVybWVkaWF0ZS5wcm9maWxlLnVtbDIjX0N6N2NzSzg3RWRpaDktR0c1YWZRMGciLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfU1dYM1duNUdFZG03OTdzemlrSGpvUSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9TV1gzVzM1R0VkbTc5N3N6aWtIam9RIiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfU1dYM1hINUdFZG03OTdzemlrSGpvUSIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9Db21wbGV0ZS5wcm9maWxlLnVtbDIjX003cFRrSzg3RWRpaDktR0c1YWZRMGciLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0NvbXBsZXRlLnByb2ZpbGUudW1sMiNfTTdwVGtLODdFZGloOS1HRzVhZlEwZyIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9TV1gzWFg1R0VkbTc5N3N6aWtIam9RIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX1NXWDNYbjVHRWRtNzk3c3ppa0hqb1EiIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9TV1gzWDM1R0VkbTc5N3N6aWtIam9RIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfYV9TM3dOV0xFZGl5NElxUDh3aGpGQT9EZWZhdWx0Ii8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX2FfUzN3TldMRWRpeTRJcVA4d2hqRkE/RGVmYXVsdCIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9TV1gzWUg1R0VkbTc5N3N6aWtIam9RIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX1NXWDNZWDVHRWRtNzk3c3ppa0hqb1EiIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9TV1gzWW41R0VkbTc5N3N6aWtIam9RIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfdmpidXdPdkhFZGlEWDViamkwaVZTQT9EZXBsb3ltZW50Ii8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVwbG95bWVudC5lcHgjX3ZqYnV3T3ZIRWRpRFg1YmppMGlWU0E/RGVwbG95bWVudCIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iX1NXWDNZMzVHRWRtNzk3c3ppa0hqb1EiPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0VmUlpvSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpDb21wb25lbnQiIHhtaTppZD0iXzkzMzBrSU93RWRteWQtLWNYbHJxeVEiIG5hbWU9IklUcmVlQ29udGVudFByb3ZpZGVyIi8+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkNvbXBvbmVudCIgeG1pOmlkPSJfWDRJNGdJT3hFZG15ZC0tY1hscnF5USIgbmFtZT0iSUNvbW1vbkxhYmVsUHJvdmlkZXIiIGNsaWVudERlcGVuZGVuY3k9Il9nU21qWUlPeEVkbXlkLS1jWGxycXlRIj4KLSAgICA8cmVhbGl6YXRpb24geG1pOmlkPSJfZ1NtallJT3hFZG15ZC0tY1hscnF5USIgY2xpZW50PSJfWDRJNGdJT3hFZG15ZC0tY1hscnF5USIgc3VwcGxpZXI9Il9iNk1Zc0lPeEVkbXlkLS1jWGxycXlRIiByZWFsaXppbmdDbGFzc2lmaWVyPSJfYjZNWXNJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgICA8bWFwcGluZyB4bWk6aWQ9Il9nU21qWVlPeEVkbXlkLS1jWGxycXlRIi8+Ci0gICAgPC9yZWFsaXphdGlvbj4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6Q29tcG9uZW50IiB4bWk6aWQ9Il9iNk1Zc0lPeEVkbXlkLS1jWGxycXlRIiBuYW1lPSJJTGFiZWxQcm92aWRlciIvPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpDb21wb25lbnQiIHhtaTppZD0iX2poanlzSU94RWRteWQtLWNYbHJxeVEiIG5hbWU9IklPcGVuTGlzdGVuZXIiLz4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6Q29tcG9uZW50IiB4bWk6aWQ9Il9rYzNrWUlPeEVkbXlkLS1jWGxycXlRIiBuYW1lPSJJQ29tbW9uT3Blbkxpc3RlbmVyIiBjbGllbnREZXBlbmRlbmN5PSJfbUktZzRJT3hFZG15ZC0tY1hscnF5USI+Ci0gICAgPHJlYWxpemF0aW9uIHhtaTppZD0iX21JLWc0SU94RWRteWQtLWNYbHJxeVEiIGNsaWVudD0iX2tjM2tZSU94RWRteWQtLWNYbHJxeVEiIHN1cHBsaWVyPSJfamhqeXNJT3hFZG15ZC0tY1hscnF5USIgcmVhbGl6aW5nQ2xhc3NpZmllcj0iX2poanlzSU94RWRteWQtLWNYbHJxeVEiPgotICAgICAgPG1hcHBpbmcgeG1pOmlkPSJfbUktZzRZT3hFZG15ZC0tY1hscnF5USIvPgotICAgIDwvcmVhbGl6YXRpb24+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkNvbXBvbmVudCIgeG1pOmlkPSJfbW9sMUVJT3hFZG15ZC0tY1hscnF5USIgbmFtZT0iSUNvbW1vbkFjdGlvblByb3ZpZGVyIi8+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkNvbXBvbmVudCIgeG1pOmlkPSJfNFRYTnNJT3hFZG15ZC0tY1hscnF5USIgbmFtZT0iTG9naWNhbCBFeHRlbnNpb24iIGNsaWVudERlcGVuZGVuY3k9Il9BYmZMWUlPeUVkbXlkLS1jWGxycXlRIF9EZVVETUlPeUVkbXlkLS1jWGxycXlRIF9Kc1NCVUlPeUVkbXlkLS1jWGxycXlRIF9MYy1pNElPeUVkbXlkLS1jWGxycXlRIF9JVFVSQUlPM0VkbXlkLS1jWGxycXlRIj4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfU3N2OFFJT3lFZG15ZC0tY1hscnF5USIgbmFtZT0iaWQiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX1Q4bHpnSU95RWRteWQtLWNYbHJxeVEiIG5hbWU9InByaW9yaXR5Ij4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9zVGEwY0lPeUVkbXlkLS1jWGxycXlRIiBuYW1lPSJuYW1lIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9CUDdEa0lPekVkbXlkLS1jWGxycXlRIiBuYW1lPSJlbmFibGVkQnlEZWZhdWx0Ij4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9McUV1UUlPekVkbXlkLS1jWGxycXlRIiBuYW1lPSJpY29uIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Il91NDdlSUlPeUVkbXlkLS1jWGxycXlRIiBuYW1lPSJPcGVyYXRpb24xIi8+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlVzYWdlIiB4bWk6aWQ9Il9BYmZMWUlPeUVkbXlkLS1jWGxycXlRIiBjbGllbnQ9Il80VFhOc0lPeEVkbXlkLS1jWGxycXlRIiBzdXBwbGllcj0iX2I2TVlzSU94RWRteWQtLWNYbHJxeVEiLz4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIHhtaTppZD0iX0RlVURNSU95RWRteWQtLWNYbHJxeVEiIGNsaWVudD0iXzRUWE5zSU94RWRteWQtLWNYbHJxeVEiIHN1cHBsaWVyPSJfOTMzMGtJT3dFZG15ZC0tY1hscnF5USIvPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpVc2FnZSIgeG1pOmlkPSJfSnNTQlVJT3lFZG15ZC0tY1hscnF5USIgY2xpZW50PSJfNFRYTnNJT3hFZG15ZC0tY1hscnF5USIgc3VwcGxpZXI9Il9qaGp5c0lPeEVkbXlkLS1jWGxycXlRIi8+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlVzYWdlIiB4bWk6aWQ9Il9MYy1pNElPeUVkbXlkLS1jWGxycXlRIiBjbGllbnQ9Il80VFhOc0lPeEVkbXlkLS1jWGxycXlRIiBzdXBwbGllcj0iX21vbDFFSU94RWRteWQtLWNYbHJxeVEiLz4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6Q29tcG9uZW50IiB4bWk6aWQ9Il8yTnN2Y0lPMkVkbXlkLS1jWGxycXlRIiBuYW1lPSJMb2dpY2FsIEVuYWJsZW1lbnQgQ2xhdXNlIi8+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlVzYWdlIiB4bWk6aWQ9Il9JVFVSQUlPM0VkbXlkLS1jWGxycXlRIiBjbGllbnQ9Il80VFhOc0lPeEVkbXlkLS1jWGxycXlRIiBzdXBwbGllcj0iXzJOc3ZjSU8yRWRteWQtLWNYbHJxeVEiLz4KLTwvdW1sOk1vZGVsPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJiOWVmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBsdWdpbi5uYW1lPUNvbW1vbiBOYXZpZ2F0b3IgVmlldwotUGx1Z2luLnByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotUGx1Z2luLmRlc2NyaXB0aW9uPUNvbnRhaW5zIHRoZSBiYXNlIGdlbmVyaWMgbmF2aWdhdG9yIGNvbXBvbmVudHMKLQotCi1Db21tb25fQWN0aW9uX1Byb3ZpZGVyPSBDb21tb24gQWN0aW9uIFByb3ZpZGVyCi1MaW5rX0hlbHBlcj0gTGluayBIZWxwZXIKLUV4dFBvaW50X2Ryb3BIYW5kbGVyID0gRHJvcCBIYW5kbGVyIEV4dGVuc2lvbiBQb2ludAotRXh0UG9pbnRfY29tbW9uRmlsdGVyID0gQ29tbW9uIEZpbHRlciBFeHRlbnNpb24gUG9pbnQKLUV4dFBvaW50X25hdmlnYXRvclZpZXdlciA9IE5hdmlnYXRvciBWaWV3ZXIgQ29uZmlndXJhdGlvbiBFeHRlbnNpb24gUG9ydAotRXh0UG9pbnRfbmF2aWdhdG9yQ29udGVudCA9IE5hdmlnYXRvciBDb250ZW50IEV4dGVuc2lvbiBQb2ludAotCi1Db21tb25fVmlld2VyX0NvbmZpZ3VyYXRpb249Q29tbW9uIFZpZXdlciBDb25maWd1cmF0aW9uCi0KLUNvbW1vbl9XaXphcmQgPSBDb21tb24gV2l6YXJkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkODZlNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJuYXZpZ2F0b3JDb250ZW50IiBuYW1lPSIlRXh0UG9pbnRfbmF2aWdhdG9yQ29udGVudCIgc2NoZW1hPSJzY2hlbWEvbmF2aWdhdG9yQ29udGVudC5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ2aWV3ZXIiIG5hbWU9IiVFeHRQb2ludF9uYXZpZ2F0b3JWaWV3ZXIiIHNjaGVtYT0ic2NoZW1hL3ZpZXdlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb21tb25GaWx0ZXIiIG5hbWU9IiVFeHRQb2ludF9jb21tb25GaWx0ZXIiIHNjaGVtYT0ic2NoZW1hL2NvbW1vbkZpbHRlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkcm9wSGFuZGxlciIgbmFtZT0iJUV4dFBvaW50X2Ryb3BIYW5kbGVyIiBzY2hlbWE9InNjaGVtYS9kcm9wSGFuZGxlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJsaW5rSGVscGVyIiBuYW1lPSIlTGlua19IZWxwZXIiIHNjaGVtYT0ic2NoZW1hL2xpbmtIZWxwZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY29tbW9uV2l6YXJkIiBuYW1lPSIlQ29tbW9uX1dpemFyZCIgc2NoZW1hPSJzY2hlbWEvY29tbW9uV2l6YXJkLmV4c2QiLz4KLSAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5kcm9wQWN0aW9ucyI+Ci0gICAgICA8YWN0aW9uCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmRuZC5QbHVnaW5Ecm9wQWN0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQuUGx1Z2luRHJvcEFjdGlvbiI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zY2hlbWEvY29tbW9uRmlsdGVyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zY2hlbWEvY29tbW9uRmlsdGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MmI3ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc2NoZW1hL2NvbW1vbkZpbHRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yIiBpZD0iZmlsdGVycyIgbmFtZT0iQ29tbW9uIE5hdmlnYXRvciBGaWx0ZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRGVmaW5lcyBhIGZpbHRlciBmb3IgYSBjb21tb24gdmlld2VyLiAKLQotVG8gYmUgcmVmaW5lZCBpbiBNNS4KLQotJmx0O3N0cm9uZyZndDtFWFBFUklNRU5UQUwmbHQ7L3N0cm9uZyZndDsuIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi1wYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLXdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLWNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPGluY2x1ZGUKLXNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3NjaGVtYS9leHByZXNzaW9uTGFuZ3VhZ2UuZXhzZCIvPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb21tb25GaWx0ZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbW1vbkZpbHRlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQ2xpZW50cyBtYXkgY29udHJpYnV0ZSBmaWx0ZXJzIGFzIHBhcnQgb2Ygb25lIGxvZ2ljYWwgZXh0ZW5zaW9uIGJ5IHNwZWNpZnlpbmcgdGhlIG5hdmlnYXRvckV4dGVuc2lvbklkLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hdmlnYXRvckV4dGVuc2lvbklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlld0lkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBNdXN0IHByb3ZpZGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmFibGVkQnlEZWZhdWx0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlbmFibGVtZW50Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5hYmxlZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvcGVydHkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NjaGVtYS9kcm9wSGFuZGxlci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc2NoZW1hL2Ryb3BIYW5kbGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTM4NmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc2NoZW1hL2Ryb3BIYW5kbGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IiIGlkPSJkcm9wSGFuZGxlciIgbmFtZT0iQ29tbW9uIE5hdmlnYXRvciBEcm9wIEhhbmRsZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVG8gYmUgcmVmaW5lZCBpbiBNNS4KLQotJmx0O3N0cm9uZyZndDtFWFBFUklNRU5UQUwmbHQ7L3N0cm9uZyZndDsuIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi1wYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLXdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLWNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPGluY2x1ZGUKLXNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3NjaGVtYS9leHByZXNzaW9uTGFuZ3VhZ2UuZXhzZCIvPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkcm9wSGFuZGxlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZHJvcEhhbmRsZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkcmFnRW5hYmxlbWVudCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkcm9wRW5hYmxlbWVudCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZXJpYWxpemVycyIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZHJvcEFjdGlvbklkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRyYWdFbmFibGVtZW50Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGRyYWdFbmFibGVtZW50IGZvciB0aGUgZXh0ZW5zaW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJub3QiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5kIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imluc3RhbmNlb2YiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idGVzdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzeXN0ZW1UZXN0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVxdWFscyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb3VudCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXRoIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlc29sdmUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWRhcHQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaXRlcmF0ZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRyb3BFbmFibGVtZW50Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibm90Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFuZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvciIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbnN0YW5jZW9mIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRlc3QiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3lzdGVtVGVzdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlcXVhbHMiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY291bnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l0aCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXNvbHZlIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Iml0ZXJhdGUiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbGlkYXRvckNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZXJpYWxpemVycyI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlcmlhbGl6ZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZXJpYWxpemVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW5hYmxlbWVudCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc2NoZW1hL2xpbmtIZWxwZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NjaGVtYS9saW5rSGVscGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYzc5NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc2NoZW1hL2xpbmtIZWxwZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciIgaWQ9ImxpbmtIZWxwZXIiIG5hbWU9Ik5hdmlnYXRvciBMaW5rIEhlbHBlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci1UbyBiZSByZWZpbmVkIGZvciBNNS4KLQotJmx0O3N0cm9uZyZndDtFWFBFUklNRU5UQUwmbHQ7L3N0cm9uZyZndDsuIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi1wYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLXdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLWNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLSAgIAotPGluY2x1ZGUKLXNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3NjaGVtYS9leHByZXNzaW9uTGFuZ3VhZ2UuZXhzZCIvPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsaW5rSGVscGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsaW5rSGVscGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWRpdG9ySW5wdXRFbmFibGVtZW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlbGVjdGlvbkVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZWRpdG9ySW5wdXRFbmFibGVtZW50Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibm90Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFuZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvciIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbnN0YW5jZW9mIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRlc3QiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3lzdGVtVGVzdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlcXVhbHMiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY291bnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l0aCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXNvbHZlIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Iml0ZXJhdGUiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZWxlY3Rpb25FbmFibGVtZW50Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibm90Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFuZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvciIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbnN0YW5jZW9mIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRlc3QiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3lzdGVtVGVzdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlcXVhbHMiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY291bnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l0aCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXNvbHZlIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Iml0ZXJhdGUiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb25JZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPjMuMjwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPiAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+IAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+IAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NjaGVtYS9uYXZpZ2F0b3JDb250ZW50LmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zY2hlbWEvbmF2aWdhdG9yQ29udGVudC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTlmN2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NjaGVtYS9uYXZpZ2F0b3JDb250ZW50LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IiIGlkPSJuYXZpZ2F0b3JDb250ZW50IiBuYW1lPSJuYXZpZ2F0b3JDb250ZW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEEgY29udGVudCBleHRlbnNpb24gcHJvdmlkZXMgYSBjb250ZW50IGFuZCBsYWJlbCBwcm92aWRlciAKLXRoYXQgY2FuIGJlIHVzZWQgYnkgYSBuYXZpZ2F0b3IgY29udGVudCBzZXJ2aWNlLiBUaGUKLSZhcG9zO25hdmlnYXRvckNvbnRlbnQmYXBvczsgZXh0ZW5zaW9uIGRlZmluZXMgdGhlIHNwZWNpZmljIGNsYXNzZXMgCi1mb3IgdGhlIGNvbnRlbnQgcHJvdmlkZXIsIGxhYmVsIHByb3ZpZGVyLCBhbmQgYWN0aW9uIHByb3ZpZGVyCi1pbiBhZGRpdGlvbiB0byB0aGUgdHlwZXMgb2YgZWxlbWVudHMgdGhlIGV4dGVuc2lvbiBrbm93cyBhYm91dC4gCi0mbHQ7cCZndDsKLVRoZSAmYXBvczt0cmlnZ2VyUG9pbnRzJmFwb3M7IGV4cHJlc3Npb24gZGVzY3JpYmVzIHRoZSBlbGVtZW50cyB0aGF0IHdpbGwKLWNhdXNlIHRoaXMgZXh0ZW5zaW9uIHRvIGJlIGludm9rZWQgZm9yIGVpdGhlciBjaGlsZHJlbiBvciBmb3IKLWxhYmVscy4gVGhlICZhcG9zO3Bvc3NpYmxlQ2hpbGRyZW4mYXBvczsgZXhwcmVzc2lvbiBkZXNjcmliZXMgdGhlIGVsZW1lbnRzIAotdGhhdCB0aGUgZXh0ZW5zaW9uIG1heSBiZSBhYmxlIHRvIHByb3ZpZGUgYSBwYXJlbnQgZm9yLiBDbGllbnRzCi1zaG91bGQgZGVzY3JpYmUgYWxsIGVsZW1lbnRzIHRoYXQgY291bGQgYmUgc2V0IGFzIHRoZSBzZWxlY3Rpb24KLXRvIGVuc3VyZSB0aGF0IHRoZSBsaW5rIHdpdGggZWRpdG9yIHN1cHBvcnQgY2FuIHByb3Blcmx5IAotZXhwYW5kIHRvIHRoZSByaWdodCBub2RlLgotJmx0O3AmZ3Q7Ci0mbHQ7c3Ryb25nJmd0O0VYUEVSSU1FTlRBTCZsdDsvc3Ryb25nJmd0Oy4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLXBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy9zY2hlbWEvZXhwcmVzc2lvbkxhbmd1YWdlLmV4c2QiLz4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5hdmlnYXRvckNvbnRlbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFjdGlvblByb3ZpZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb21tb25XaXphcmQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im5hdmlnYXRvckNvbnRlbnQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBuYXZpZ2F0b3IgY29udGVudCBleHRlbnNpb24gZGVmaW5lcyBhIGNvbnRlbnQgcHJvdmlkZXIgYW5kIGxhYmVsIHByb3ZpZGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBjaGlsZHJlbiB3aGVuZXZlciBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHRyaWdnZXJQb2ludHMgZXhwcmVzc2lvbiBhbmQgYWxzbyB0byBwcm92aWRlIGEgcGFyZW50IHdoZW5ldmVyIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgcG9zc2libGVDaGlsZHJlbiBleHByZXNzaW9uLiAKLSZsdDtwJmd0OwotT3B0aW9uYWxseSwgY2xpZW50cyBtYXkgYWxzbyBwcm92aWRlIGFuIGFjdGlvbiBwcm92aWRlciB3aGljaCBjYW4gcHJvdmlkZSBtZW51IGNvbnRyaWJ1dGlvbnMgYW5kIGFjdGlvbiBiYXIgY29udHJpYnV0aW9ucyB3aGVuIGFuIGVsZW1lbnQgaXMgc2VsZWN0ZWQgdGhhdCB0aGUgZXh0ZW5zaW9uIGNvbnRyaWJ1dGVkLCBvciB0aGF0IG1hdGNoZXMgdGhlIHRyaWdnZXJQb2ludHMgZXhwcmVzc2lvbi4gQ2xpZW50cyBtYXkgYWxzbyBjaG9vc2UgdG8gY29udHJpYnV0ZSBhIHNvcnRlciB0byBzb3J0IGVsZW1lbnRzIHRoYXQgYXJlIGNvbnRyaWJ1dGVkIGJ5IHRoZSBleHRlbnNpb24uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50Ii8+Ci0gICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9InRyaWdnZXJQb2ludHMiLz4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icG9zc2libGVDaGlsZHJlbiIvPgotICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY3Rpb25Qcm92aWRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkdXBsaWNhdGVDb250ZW50RmlsdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBJRCB0byBpZGVudGlmeSB0aGlzIGV4dGVuc2lvbi4gVXNlZCBmb3IgZXh0ZW5zaW9uIGFjdGl2YXRpb24gYW5kIGJ5IG90aGVyIGV4dGVuc2lvbnMgdGhhdCB3b3VsZCBsaWtlIHRvIGV4dGVuZCB0aGUgZGVmaW5lZCBleHRlbnNpb24gKGUuZy4gYWRkIGFub3RoZXIgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyKQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5Ij4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhlIHJlbGF0aXZlIHByaW9yaXR5IG9mIHRoaXMgZXh0ZW5zaW9uIHRvIG90aGVyIGV4dGVuc2lvbnMuIFVzZWQgYnkgdGhlIENvbW1vbiBOYXZpZ2F0b3IgdG8gaGFuZGxlIHNvcnRpbmcgYW5kIG9yZ2FuaXphdGlvbiBvZiB0aGUgY29udHJpYnV0ZWQgY29udGVudCBmcm9tIHRoaXMgZXh0ZW5zaW9uIGluIHJlbGF0aW9uIHRvIGNvbnRlbnQgZnJvbSBvdGhlciBleHRlbnNpb25zLiBEZWZhdWx0cyB0byAmcXVvdDtub3JtYWwmcXVvdDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imxvd2VzdCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJsb3dlciI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJsb3ciPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibm9ybWFsIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImhpZ2giPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaGlnaGVyIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImhpZ2hlc3QiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudFByb3ZpZGVyIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFN1cHBsaWVzIHRoZSBuYW1lIG9mIGEgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyIG9yIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQ29udGVudFByb3ZpZGVyLgotJmx0O3AmZ3Q7Ci1UaGUgY29udGVudCBwcm92aWRlciB3aWxsIGJlIGNvbnN1bHRlZCB3aGVuIGFkZGVkaW5nIGNoaWxkcmVuIHRvIHRoZSB0cmVlLiBVc2UgdGhlICZhcG9zO2VuYWJsZW1lbnQmYXBvczsgY2xhdXNlIHRvIGluZGljYXRlIHdoYXQga2luZHMgb2YgY29udGVudCBzaG91bGQgdHJpZ2dlciBhIHJlcXVlc3QgdG8geW91ciBjb250ZW50IHByb3ZpZGVyIG9yIGxhYmVsIHByb3ZpZGVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNvcnRlciIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhlIG5hbWUgb2YgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvciB0aGF0IGtub3dzIGhvdyB0byBzb3J0IHRoZSBpdGVtcyBzdXBwb3J0ZWQgYnkgdGhpcyBleHRlbnNpb24uIElmIHRoZSBleHRlbnNpb24gZW5hYmxlcyBvbiB0eXBlcyB0aGF0IGl0IGRvZXMgbm90IHByb3ZpZGUsIGJ1dCB1bmRlcnN0YW5kcywgaXQgbWF5IGJlIGNhbGxlZCB1cG9uIHRvIHNvcnQgaXRlbXMgdGhhdCBpdCBkaWQgbm90IGNvbnRyaWJ1dGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJqYXZhLnV0aWwuQ29tcGFyYXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBwbHVnaW4tcmVsYXRpdmUgcGF0aCB0byBhbiBpY29uIGZvciB1c2Ugd2hlbiBkaXNwbGF5aW5nIHRoZSBtZXRhZGF0YSBhYm91dCB0aGUgY29udGVudCBleHRlbnNpb24gdG8gdGhlIHVzZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWN0aXZlQnlEZWZhdWx0IiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCBleHRlbnNpb24gd2lsbCBiZSBhY3RpdmUgYnkgZGVmYXVsdC4gRWFjaCBjb250ZW50IGV4dGVuc2lvbiBtYXkgYmUgdHVybmVkIG9uIG9yIG9mZiBieSB0aGUgdXNlci4gVGhpcyBzdGF0ZSBpcyByZWZlcnJlZCB0byBhcyB0aGUgJmFwb3M7YWN0aXZlJmFwb3M7IHN0YXRlIG9mIGEgY29udGVudCBleHRlbnNpb24uIElmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byAmYXBvcztmYWxzZSZhcG9zOywgdGhlbiB0aGUgdXNlciB3aWxsIGhhdmUgdG8gZXhwbGljaXRseSBvcGVuIHRoZSBkaWFsb2cgYW5kIHR1cm4gdGhlIGV4dGVuc2lvbiBvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbFByb3ZpZGVyIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFN1cHBsaWVzIHRoZSBuYW1lIG9mIGEgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyJmx0Oy9jb2RlJmd0OyBvciBmb3IgbW9yZSBhZHZhbmNlZCBmdW5jdGlvbmFsaXR5LCB0aGUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25MYWJlbFByb3ZpZGVyJmx0Oy9jb2RlJmd0Oy4KLSZsdDtwJmd0OwotQ2xpZW50cyBtYXkgYWxzbyBpbXBsZW1lbnQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklEZXNjcmlwdGlvblByb3ZpZGVyJmx0Oy9jb2RlJmd0OyBpbiBvcmRlciB0byBhZGQgdGV4dCB0byB0aGUgc3RhdHVzIGJhciBhdCB0aGUgYm90dG9tIG9mIHRoZSBFY2xpcHNlIHdvcmtiZW5jaCBiYXNlZCBvbiB0aGUgc2VsZWN0aW9uIGluIHRoZSB2aWV3ZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZ5IGEgZGlzcGxheSBuYW1lIGZvciB0aGUgQ29udGVudCBFeHRlbnNpb24uIFRoZSBkaXNwbGF5IG5hbWUgaXMgdXNlZCBpbiB0aGUgYWN0aXZhdGlvbiBkaWFsb2cgdG8gYWxsb3cgY2xpZW50cyB0byB0dXJuIGFuIGV4dGVuc2lvbiBvbiBvciBvZmYuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVuYWJsZW1lbnQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBlbmFibGVtZW50IGV4cHJlc3Npb24gYWxsb3dzIGNsaWVudHMgdG8gc3BlY2lmeSB0aGUgc2FtZSBleHByZXNzaW9uIGZvciBib3RoIHRyaWdnZXJQb2ludHMgYW5kIHBvc3NpYmxlQ2hpbGRyZW4uCi0mbHQ7cCZndDsKLUluIHRoZSBjYXNlIG9mICZhcG9zO2FjdGlvblByb3ZpZGVyJmFwb3M7LCBjbGllbnRzIG11c3QgZGVmaW5lIGFuIGV4cHJlc3Npb24gdGhhdCB3aWxsIGluZGljYXRlIHRvIHRoZSBmcmFtZXdvcmsgd2hlbiB0aGVpciBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXIgc2hvdWxkIGJlIGludm9rZWQuIEJlY2F1c2Ugb2YgY29udHJpYnV0aW9ucyB0byB0aGUgSUFjdGlvbkJhcnMsIGNsaWVudHMgbXVzdCBiZSBpbnZva2VkIHdoZW5ldmVyIGFuIG9iamVjdCB0aGV5IGFyZSBpbnRlcmVzdGVkIGluIGlzIHNlbGVjdGVkLiBUaGVyZWZvcmUsIGNsaWVudHMgc2hvdWxkIHVzZSBkaXNjcmV0aW9uIGluIGRlY2lkaW5nIHdoZW4gdGhlaXIgZXh0ZW5zaW9uIHNob3VsZCBiZSBlbmFibGVkLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJub3QiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5kIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imluc3RhbmNlb2YiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idGVzdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzeXN0ZW1UZXN0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVxdWFscyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb3VudCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXRoIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlc29sdmUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWRhcHQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaXRlcmF0ZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InRyaWdnZXJQb2ludHMiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSB0cmlnZ2VyUG9pbnRzIGV4cHJlc3Npb24gZGVmaW5lcyB0aGUgbm9kZXMgaW4gYSB0cmVlIHRoYXQgc2hvdWxkIGNhdXNlIHRoaXMgZXh0ZW5zaW9uIHRvIGJlIGludm9rZWQgZm9yIGNoaWxkcmVuLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJub3QiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5kIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imluc3RhbmNlb2YiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idGVzdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzeXN0ZW1UZXN0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVxdWFscyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb3VudCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXRoIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlc29sdmUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWRhcHQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaXRlcmF0ZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InBvc3NpYmxlQ2hpbGRyZW4iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBwb3NzaWJsZUNoaWxkcmVuIGV4cHJlc3Npb24gZGVmaW5lcyB0aGUgbm9kZXMgaW4gYSB0cmVlIHRoYXQgY291bGQgYmUgY29udHJpYnV0ZWQgYnkgdGhpcyBleHRlbnNpb24uIENsaWVudHMgc2hvdWxkIGRlc2NyaWJlcyB3aGVuIHRoaXMgY29udGVudCBleHRlbnNpb24gY291bGQgcHJvdmlkZSBhIHBhcmVudCBmb3IgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgZXhwcmVzc2lvbi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibm90Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFuZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvciIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbnN0YW5jZW9mIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRlc3QiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3lzdGVtVGVzdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlcXVhbHMiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY291bnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l0aCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXNvbHZlIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Iml0ZXJhdGUiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkdXBsaWNhdGVDb250ZW50RmlsdGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBGb3IgZXh0ZW5zaW9ucyB0aGF0IHdoaWNoIHRvIGF1Z21lbnQgb3IgZW5oYW5jZSB0aGUgY29udGVudCBwcm92aWRlZCBieSBhbm90aGVyIGV4aXN0aW5nIGV4dGVuc2lvbiAoZS5nLiBSZXNvdXJjZXMpLCBhIGNsaWVudCBtYXkgc3BlY2lmeSBhICZxdW90O2R1cGxpY2F0ZUNvbnRlbnRGaWx0ZXImcXVvdDsgd2hpY2ggd2lsbCBiZSB0dXJuZWQgb24gYW5kIG9mZiB3aXRoIHRoZWlyIGV4dGVuc2lvbnMuIFVzZXJzIHdpbGwgbm90IGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gdHVybiB0aGlzIHNwZWNpYWwgdmlld2VyIGZpbHRlciBvbiBhbmQgb2ZmLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3ZXJGaWx0ZXIiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzdWJjbGFzcyBvZiBJTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhY3Rpb25Qcm92aWRlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iY2xhc3MiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgU3VwcGxpZXMgdGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyJmx0Oy9jb2RlJmd0Oy4gVGhlIGFjdGlvbiBwcm92aWRlciBoYXMgYW4gb3Bwb3J0dW5pdHkgdG8gY29udHJpYnV0ZSB0byB0aGUgY29udGV4dCBtZW51IGFuZCB0aGUgcmV0YXJnZXRhYmxlIGFjdGlvbnMgZGVmaW5lZCBpbiB0aGUgSUFjdGlvbkJhcnMgZm9yIHRoZSB2aWV3IHRoYXQgaG9sZHMgdGhlIG5hdmlnYXRvci4gQ2xpZW50cyBtYXkgYWxzbyBjb250cmlidXRlIGRpcmVjdGx5IHRvIHRoZSB2aWV3IG1lbnUgdGhyb3VnaCB0aGUgSUFjdGlvbkJhcnMgdmlldyBtZW51LgotJmx0O3AmZ3Q7Ci1BIHRvcCBsZXZlbCAmbHQ7YWN0aW9uUHJvdmlkZXIgLyZndDsgaXMgJmFwb3M7dmlzaWJsZSZhcG9zOyB0byBhbiBhYnN0cmFjdCB2aWV3ZXIgaWYgdGhlcmUgaXMgYSAmbHQ7dmlld2VyQWN0aW9uQmluZGluZyAvJmd0OyBmb3IgdGhhdCAmbHQ7YWN0aW9uUHJvdmlkZXIgLyZndDsuIEZvciBhY3Rpb25Qcm92aWRlcnMgdGhhdCBhcmUgbmVzdGVkIHVuZGVyIGEgbmF2aWdhdG9yQ29udGVudCBlbGVtZW50LCB0aGUgdmlzaWJpbGl0eSB3aWxsIGJlIGNvbnRyb2xsZWQgYnkgdGhlIGlkIG9mIHRoZSBuYXZpZ2F0b3JDb250ZW50IGV4dGVuc2lvbiBpZC4gQ2hpbGQgYWN0aW9uIHByb3ZpZGVycyB3aWxsIGF1dG9tYXRpY2FsbHkKLWJlIHBpY2tlZCB1cCBieSBtYXRjaGluZyB2aWV3ZXJDb250ZW50QmluZGluZ3MuIFNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld2VyIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHZpc2liaWxpdHkgYmluZGluZ3MuCi0mbHQ7cCZndDsKLUNsaWVudHMgbWF5IHByb3ZpZGVyICZhcG9zO2FjdGlvblByb3ZpZGVyJmFwb3M7KHMpIHVuZGVyIHRoZSByb290ICZhcG9zO2V4dGVudGlvbiZhcG9zOyBlbGVtZW50IChwZWVyIHRvICZhcG9zO25hdmlnYXRvckNvbnRlbnQmYXBvczspIGluIG9yZGVyIHRvIGJldHRlciBjb250cm9sIHRoZSBiaW5kaW5nIChzZWUgJmFwb3M7dmVpd2VyQWN0aW9uQmluZGluZyZhcG9zOykgYW5kIHRoZWlyIGVuYWJsZW1lbnQgKHRoZSByb290IGxldmVsICZhcG9zO2FjdGlvblByb3ZpZGVyJmFwb3M7IGVsZW1lbnQgc3VwcG9ydHMgYSBuZXN0ZWQgJmFwb3M7ZW5hYmxlbWVudCZhcG9zOyBFY2xpcHNlIGNvcmUgZXhwcmVzc2lvbikuCi0mbHQ7cCZndDsKLUZvciByb290ICZhcG9zO2FjdGlvblByb3ZpZGVycyZhcG9zOyB3aXRoIG5vIGlkLCB0aGUgaWQgZGVmYXVsdHMgdG8gJmFwb3M7b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmFjdGlvblByb3ZpZGVyJmFwb3M7LiBGb3IgdGhlc2UgYWN0aW9uUHJvdmlkZXJzIHRvIGJlIGdpdmVuIHRoZSBvcHBvcnR1bml0eSB0byBjb250cmlidXRlIHRoZSBtZW51cyBvciBhY3Rpb24gYmFycyBvZiBhIHZpZXdlciwgYSB2aWV3ZXJBY3Rpb25CaW5kaW5nIG11c3QgYmUgZGVmaW5lZCAoYXMgcGFydCBvZiB0aGUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdlciBleHRlbnNpb24gcG9pbnQpIHdoaWNoIGRlY2xhcmVzIGEgYmluZGluZyBiZXR3ZWVuIHRoZSBzcGVjaWZpYyB2aWV3ZXIgYW5kIHRoZSBkZWZhdWx0IGlkICgmcXVvdDtvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuYWN0aW9uUHJvdmlkZXImcXVvdDspLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yICZhcG9zO3ZpZXdlckFjdGlvbkJpbmRpbmcmYXBvczsgdW5kZXIgdGhlIHNjaGVtYSBkb2N1bWVudGF0aW9uIG9mIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25BY3Rpb25Qcm92aWRlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIENsaWVudHMgbWF5IG9wdGlvbmFsbHkgZGVmaW5lIGFuIGlkIHRvIHVzZSBmb3IgZmlsdGVyaW5nIHB1cnBvc2VzIChlaXRoZXIgdGhyb3VnaCBhY3Rpdml0aWVzIG9yIHZpZXdlckNvbnRlbnRCaW5kaW5ncykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwZW5kc09uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgSUQgb2YgYW4gYWN0aW9uIHByb3ZpZGVyIHRoYXQgY29uZmlndXJlcyBzb21lIG1lbnUgb3Igc3VibWVudSB0aGF0IG11c3QgYmUgcHJlcGFyZWQgYmVmb3JlIHRoaXMgYWN0aW9uIHByb3ZpZGVyIGlzIGFwcGxpZWQuIAotJmx0O3AmZ3Q7Ci1TcGVjaWZ5aW5nIGEgZGVwZW5kZW5jeSBvbiBhbm90aGVyIGFjdGlvbiBwcm92aWRlciBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGlzIGFjdGlvbiBwcm92aWRlciB3aWxsIGJlIGludm9rZWQgd2hlcmVldmVyIHRoZSByZXF1aXJlZCBhY3Rpb24gcHJvdmlkZXIgaXMgaW52b2tlZC4gVGhlIGRvd25zdHJlYW0gYWN0aW9uIHByb3ZpZGVyIG11c3QgYmUgYm91bmQgdG8gdGhlIHBhcnRpY3VsYXIgdmlld2VyIHRvIGJlIGludm9rZWQuIAotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1JZiB0aGUgcmVxdWlyZWQgYWN0aW9uIHByb3ZpZGVyIGlzIGRpc2FibGVkIG9yIHVuYm91bmQgdG8gdGhlIGN1cnJlbnQgdmlld2VyLCB0aGVuIHRoaXMgYWN0aW9uIHByb3ZpZGVyIHdpbGwgbm90IGJlIGFwcGxpZWQuIElmIGEgY3ljbGUgZXhpc3RzLCB0aGUgZnJhbWV3b3JrIHdpbGwgdHJ5IHRvIGNvbnRpbnVlLCBidXQgdGhlcmUgYXJlIG5vIGd1YXJhbnRlZXMgYXMgdG8gd2hhdCBtZW51IGl0ZW1zIG9yIGFjdGlvbiBiYXIgY29udHJpYnV0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZS4KLSZsdDsvcCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29tbW9uV2l6YXJkIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGNvbnRyaWJ1dGUgdG8gdGhlIG1lbnUgZGVmaW5lZCBieSB0eXBlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBhdHR0cmlidXRlIHNob3VsZCBiZSB0aGUgdmFsdWUgb2YgdGhlIHJvb3QgY2F0ZWdvcnkgb2YgdGhlIGV4cGVjdGVkIHdpemFyZC4gVGhlIHBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlICZxdW90O2ltcG9ydCZxdW90OyBmb3IgJmx0O2ImZ3Q7b3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyZsdDsvYiZndDssICZxdW90O2V4cG9ydCZxdW90OyAmbHQ7YiZndDtvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzJmx0Oy9iJmd0OywgYW5kICZxdW90O25ldyZxdW90OyBmb3IgJmx0O2ImZ3Q7b3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyZsdDsvYiZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImltcG9ydCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJleHBvcnQiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibmV3Ij4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9IndpemFyZElkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgZGVzaXJlZCB3aXphcmQgc2hvcnRjdXQgYXMgZGVmaW5lZCBieSAmbHQ7YiZndDtvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzJmx0Oy9iJmd0OywgJmx0O2ImZ3Q7b3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyZsdDsvYiZndDssIG9yICZsdDtiJmd0O29yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMmbHQ7L2ImZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZXNjcmliZXMgYSBjb250ZW50IGV4dGVuc2lvbiB0aGF0IAotcHJvdmlkZXMgcmVzb3VyY2UgY29udGVudC4gVGhlICZhcG9zO3RyaWdnZXJQb2ludHMmYXBvczsgZXhwcmVzc2lvbgotZGV0ZXJtaW5lcyB3aGVuIHRoaXMgZXh0ZW5zaW9uIGlzIGluaXRpYWxseSBpbnZva2VkLiBJZiAKLWEgJmFwb3M7dmlld2VyQ29udGVudEJpbmRpbmcmYXBvczsgbWF0Y2hlcyB0aGlzIGV4dGVuc2lvbiB3aXRoCi10aGUgJmFwb3M7aXNSb290JmFwb3M7IGF0dHJpYnV0ZSBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgZXh0ZW5zaW9uCi13aWxsIGJlIHVzZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcm9vdCBlbGVtZW50Ci1tYXRjaGVzIHRoZSAmYXBvczt0cmlnZ2VyUG9pbnRzJmFwb3M7IGV4cHJlc3Npb24uICAgCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uICAKLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50JnF1b3Q7Jmd0OwotICAgICAgJmx0O25hdmlnYXRvckNvbnRlbnQKLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JXJlc291cmNlLmV4dGVuc2lvbi5uYW1lJnF1b3Q7Ci0gICAgICAgICAgICBwcmlvcml0eT0mcXVvdDtsb3cmcXVvdDsKLSAgICAgICAgICAgIGljb249JnF1b3Q7aWNvbnMvZnVsbC9ldmlldzE2L3Jlc291cmNlX3BlcnNwLmdpZiZxdW90OwotICAgICAgICAgICAgYWN0aXZlQnlEZWZhdWx0PSZxdW90O3RydWUmcXVvdDsKLSAgICAgICAgICAgICAgIGNvbnRlbnRQcm92aWRlcj0mcXVvdDtvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLndvcmtiZW5jaC5SZXNvdXJjZUV4dGVuc2lvbkNvbnRlbnRQcm92aWRlciZxdW90OwotICAgICAgICAgICAgICAgbGFiZWxQcm92aWRlcj0mcXVvdDtvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLndvcmtiZW5jaC5SZXNvdXJjZUV4dGVuc2lvbkxhYmVsUHJvdmlkZXImcXVvdDsgICAKLSAgICAgICAgICAgICAgIHNvcnRlcj0mcXVvdDtvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmludGVybmFsLndvcmtiZW5jaC5SZXNvdXJjZVNvcnRlciZxdW90OwotICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlQ29udGVudCZxdW90OyZndDsgICAgICAgICAKLSAgICAgICAgICZsdDt0cmlnZ2VyUG9pbnRzJmd0OwotICAgICAgICAgICAmbHQ7b3ImZ3Q7ICAgICAgICAgCi0gICAgICAgICAgICAgICZsdDtpbnN0YW5jZW9mIAotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCZxdW90OyAvJmd0OyAKLSAgICAgICAgICAgICAgJmx0O2luc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QmcXVvdDsgLyZndDsgIAotICAgICAgICAgICAgICAmbHQ7aW5zdGFuY2VvZiAgCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyJnF1b3Q7IC8mZ3Q7IAotICAgICAgICAgICAmbHQ7L29yJmd0OwotICAgICAgICAgJmx0Oy90cmlnZ2VyUG9pbnRzJmd0OwotICAgICAgICAgJmx0O3Bvc3NpYmxlQ2hpbGRyZW4mZ3Q7Ci0gICAgICAgICAgICZsdDtvciZndDsgICAgICAgICAKLSAgICAgICAgICAgICAgJmx0O2luc3RhbmNlb2YgCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290JnF1b3Q7IC8mZ3Q7IAotICAgICAgICAgICAgICAmbHQ7aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCZxdW90OyAvJmd0OyAKLSAgICAgICAgICAgICAgJmx0O2luc3RhbmNlb2YgCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UmcXVvdDsgLyZndDsgCi0gICAgICAgICAgICAgICZsdDtpbnN0YW5jZW9mICAKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXImcXVvdDsgLyZndDsKLSAgICAgICAgICAgICAgJmx0O2luc3RhbmNlb2YgCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSZxdW90OyAvJmd0OyAKLSAgICAgICAgICAgJmx0Oy9vciZndDsKLSAgICAgICAgICZsdDsvcG9zc2libGVDaGlsZHJlbiZndDsKLSAgICAgICZsdDsvbmF2aWdhdG9yQ29udGVudCZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0KLSZsdDtwJmd0OwotVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gYWRkIHdpemFyZCBzaG9ydGN1dCBhY3Rpb25zIGZvciAKLSZxdW90O05ldyBGb2xkZXImcXVvdDsgYW5kICZxdW90O05ldyBGaWxlJnF1b3Q7LCB3aGljaCBhcmUgZW5hYmxlZCBvbiB0aGUgc3BlY2lmaWMgc3ViY2xhc3NlcyAKLW9mIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZS4gQ2xpZW50cyBtYXkgdXNlIHdoYXRldmVyIHBhcnRzIG9mIAotdGhlIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIGRlc2NyaWJlIHdoZW4gdGhlIAotbWVudSBvcHRpb25zIHNob3VsZCBiZSBhdmFpbGFibGUuIEZvciBjbGllbnRzIGJ1aWxkaW5nIHRoZWlyIG93biB2aWV3ZXJzIG9yCi12aWV3IHBhcnRzLCBiZSBzdXJlIHRvIHVzZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuV2l6YXJkQWN0aW9uR3JvdXAmbHQ7L2NvZGUmZ3Q7Ci10byBjb3JyZWN0bHkgcG9wdWxhdGUgdGhlIG1lbnUuIFNlZSB0aGF0IGNsYXNzIGZvciBtb3JlIGRvY3VtZW50YXRpb24gb24KLXVzaW5nIHRoaXMgZmVhdHVyZS4KLSZsdDtwJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zY2hlbWEvdmlld2VyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zY2hlbWEvdmlld2VyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNWU5NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc2NoZW1hL3ZpZXdlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yIiBpZD0idmlld2VyIiBuYW1lPSJDb21tb24gVmlld2VyIENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci1UaGUgJmFwb3M7dmlld2VyJmFwb3M7IGVsZW1lbnQgZGVmaW5lcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgYSBjb21tb24gdmlld2VyLiBUaGUgZXh0ZW5zaW9uCi1tYXkgcHJvdmlkZSBhIGN1c3RvbSBwb3B1cCBtZW51IGlkLCBvdmVycmlkZSB3aGV0aGVyIHRoZSB2aWV3ZXIgcHJvdmlkZXMgbGluayB3aXRoCi1lZGl0b3Igc3VwcG9ydCwgcHJvdmlkZXMgYSBmaWx0ZXIgZGlhbG9nLCBhbmQvb3IgcHJvdmlkZXMgYW4gJmFwb3M7YXZhaWxhYmxlIGV4dGVuc2lvbnMmYXBvczsgCi1kaWFsb2cuIEluIGFkZGl0aW9uLCBuZXN0ZWQgY29uZmlndXJhdGlvbiBlbGVtZW50cyBnaXZlIGZ1bGwgY29udHJvbCBvdmVyIHRoZSBzdHJ1Y3R1cmUKLWFuZCBiZWhhdmlvciBvZiB0aGUgcG9wdXAgY29udGV4dCBtZW51LgotJmx0O3AmZ3Q7Ci0mYXBvczt2aWV3ZXJDb250ZW50QmluZGluZyZhcG9zOyBiaW5kcyBkZWZpbmVkIGNvbnRlbnQgZXh0ZW5zaW9ucyAodGhyb3VnaCB0aGUgbmF2aWdhdG9yQ29udGVudCAKLWV4dGVuc2lvbiBwb2ludCkgdG8gdmlld2VycyAoZGVmaW5lZCB0aHJvdWdoIHRoZSAKLW9yZy5lY2xpcHNlLnVpLnZpZXdzIGV4dGVuc2lvbiBwb2ludCkuIEFueSBjb250ZW50IAotZXh0ZW5zaW9uIGJvdW5kIHRvIGEgdmlld2VyIGlzIGRlc2NyaWJlZCBhcyAmYXBvczt2aXNpYmxlJmFwb3M7LiBBCi1jb250ZW50IHNlcnZpY2UgKG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2UpCi13aWxsIG5vdCByZXR1cm4gYW55IGV4dGVuc2lvbnMgd2hpY2ggYXJlIG5vdCB2aXNpYmxlIGZvcgotaXRzIHZpZXdlciBpZC4KLSZsdDtwJmd0OwotJmx0O3N0cm9uZyZndDtFWFBFUklNRU5UQUwmbHQ7L3N0cm9uZyZndDsuIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi1wYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLXdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLWNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlld2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZpZXdlckNvbnRlbnRCaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZpZXdlckFjdGlvbkJpbmRpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmlld2VyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBQcm92aWRlcyBiYXNpYyBjb25maWd1cmF0aW9uIHRvIGVzdGFibGlzaCB0aGUgY2hhcmFjdGVyaXN0aWNzCi1vZiBhIHZpZXdlci4gQ2xpZW50cyBtdXN0IGFsc28gZGVmaW5lIGFuIG9yZy5lY2xpcHNlLnVpLnZpZXdzCi1leHRlbnNpb24gdG8gY3JlYXRlIHRoZSB2aWV3IHBhcnQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBvcHVwTWVudSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXdlcklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCB0aGF0IG1hdGNoZXMgdGhlIGlkIHByb3ZpZGVzIGluIGFuIG9yZy5lY2xpcHNlLnVpLnZpZXdzIGV4dGVuc2lvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3B1cE1lbnVJZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcG9wdXBNZW51SWQgb2YgdGhlIGRlZmluZWQgdmlld2VyLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgcG9wdXBNZW51SWQgZGVmYXVsdHMgdG8gdGhlIGlkIG9mIHRoZSB2aWV3ZXIuIENsaWVudHMgbWF5IHNwZWNpZnkgCi1vbmx5IHRoZSBwb3B1cE1lbnVJZCBPUiBhIHBvcHVwTWVudSBlbGVtZW50LCBidXQgbm90IGJvdGguIFRoZSBkZWZhdWx0IGxpc3Qgb2YgaW5zZXJ0aW9uIHBvaW50cyBpcyBkZWNsYXJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHBvcHVwTWVudSBlbGVtZW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2aWV3ZXJDb250ZW50QmluZGluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQ2xpZW50cyBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSAmYXBvczt2aXdlckNvbnRlbnRCaW5kaW5nJmFwb3M7IGVsZW1lbnRzIHRvIGRlc2NyaWJlIHdoaWNoIGNvbnRlbnQgZXh0ZW5zaW9ucyBhcmUgJmFwb3M7dmlzaWJsZSZhcG9zOyB0byB0aGUgdmlld2VyLiBBIGNvbnRlbnQgZXh0ZW5zaW9uIGlzICZhcG9zO3Zpc2libGUmYXBvczsgaWYgdGhlIGlkIG9mIHRoZSBjb250ZW50IGV4dGVuc2lvbiBtYXRjaGVzIGFuICZhcG9zO2luY2x1ZGVzJmFwb3M7IHN0YXRlbWVudCB1bmRlciBhIHZpZXdlckNvbnRlbnRCaW5kaW5nIGFuZCBpcyBub3QgZXhjbHVkZWQgYnkgYW4gJmFwb3M7ZXhjbHVkZXMmYXBvczsgc3RhdGVtZW50LiBJZiBhIGNvbnRlbnQgZXh0ZW5zaW9uIGlzIG5vdCAmYXBvczt2aXNpYmxlJmFwb3M7IHRvIGEgdmlld2VyLCB0aGVuIHRoZSBleHRlbnNpb24gd2lsbCBuZXZlciBiZSBhc2tlZCBmb3IgY29udGVudCBieSBhIGNvbnRlbnQgc2VydmljZSBmb3IgdGhhdCB2aWV3ZXIuIAotJmx0O3AmZ3Q7Ci1DbGllbnRzIG1heSBkZWZpbmUgYW4gJmFwb3M7aW5jbHVkZXMmYXBvczsgZWxlbWVudCB0byBzZWxlY3Qgd2hpY2ggZXh0ZW5zaW9ucyBhcmUgdmlzaWJsZSB0byB0aGUgdmlld2VyLCBhbmQgc2ltaWxhcmx5IGFuICZhcG9zO2V4Y2x1ZGVzJmFwb3M7IGVsZW1lbnQgZm9yIGV4dGVuc2lvbnMgdGhhdCBzaG91bGQgbm90IGJlIG1hZGUgdmlzaWJsZSB0byB0aGUgdmlld2VyLiBDbGllbnRzIG1heSBmdXJ0aGVyIGRlZmluZSB0aGUgZXh0ZW5zaW9ucyB0aGF0IHNob3VsZCBiZSBleHBsaWNpdGx5IHF1ZXJpZWQgZm9yIHJvb3QgZWxlbWVudHMgKHRocm91Z2ggIElUcmVlQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKCkpIGJ5IHRoZSAmYXBvcztpc1Jvb3QmYXBvczsgYXR0cmlidXRlLiBJZiBvbmUgb3IgbW9yZSAmYXBvcztjb250ZW50RXh0ZW5zaW9uJmFwb3M7IGVsZW1lbnRzIGhhdmUgJmFwb3M7aXNSb290JmFwb3M7IHNldCB0byB0cnVlIHdpdGhpbiB0aGUgJmFwb3M7aW5jbHVkZXMmYXBvczsgc3RhdGVtZW50LCBvbmx5IHRob3NlIGV4dGVuc2lvbnMgd2lsbCBiZSBxdWVyaWVkIGZvciByb290IGVsZW1lbnRzLiBUaGUgJmFwb3M7aXNSb290JmFwb3M7IGF0dHJpYnV0ZSBoYXMgbm8gZWZmZWN0IGZvciBleGNsdXNpb25zLgotJmx0O3AmZ3Q7Ci1BIHZpZXdlciBtYXkgaGF2ZSBtdWx0aXBsZSB2aWV3ZXJDb250ZW50QmluZGluZ3MgZGVmaW5lZCwgYW5kIHRoZWlyIGluY2x1ZGVzL2V4Y2x1ZGVzIHN0YXRlbWVudHMgd2lsbCBiZSBhZ2dyZWdhdGVkIHRvIHByb2R1Y2UgdGhlIGZpbmFsIGJlaGF2aW9yLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbmNsdWRlcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXhjbHVkZXMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3ZXJJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGVyZSBzaG91bGQgYmUgYSBjb3JyZXNwb25kaW5nIG9yZy5lY2xpcHNlLnVpLnZpZXdzIGV4dGVuc2lvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgSWQuIFRoYXQgZXh0ZW5zaW9uIHNob3VsZCBzcGVjaWZ5IGFuIGluc3RhbmNlIG9mIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZpZXdlckFjdGlvbkJpbmRpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIENsaWVudHMgbXVzdCBkZWZpbmUgd2hpY2ggYWN0aW9uIHByb3ZpZGVycyBhcmUgdmlzaWJsZSB0byB0aGVpciB2aWV3ZXIuIENsaWVudHMgbWF5IGRlZmluZSBhbiAmYXBvcztpbmNsdWRlcyZhcG9zOyBlbGVtZW50IHRvIHNlbGVjdCB3aGljaCBleHRlbnNpb25zIGFyZSB2aXNpYmxlIHRvIHRoZSB2aWV3ZXIsIGFuZCAgc2ltaWxhcmx5IGFuICZhcG9zO2V4Y2x1ZGVzJmFwb3M7IGVsZW1lbnQgZm9yIGV4dGVuc2lvbnMgdGhhdCBzaG91bGQgbm90IGJlIG1hZGUgdmlzaWJsZSB0byB0aGUgdmlld2VyLiAKLSZsdDtwJmd0OwotQSB2aWV3ZXIgbWF5IGhhdmUgbXVsdGlwbGUgdmlld2VyQWN0aW9uQmluZGluZ3MgZGVmaW5lZCwgYW5kIHRoZWlyIGluY2x1ZGVzL2V4Y2x1ZGVzIHN0YXRlbWVudHMgd2lsbCBiZSBhZ2dyZWdhdGVkIHRvIHByb2R1Y2UgdGhlIGZpbmFsIGJlaGF2aW9yLgotJmx0O3AmZ3Q7Ci1Gb3IgJmFwb3M7YWN0aW9uUHJvdmlkZXImYXBvczsgZGVmaW5pdGlvbnMgd2hpY2ggYXJlIG5vdCBuZXN0ZWQgdW5kZXIgYSAmYXBvcztuYXZpZ2F0b3JDb250ZW50JmFwb3M7IGRlZmluaXRpb24sIGNsaWVudHMgbWF5IHNwZWNpZnkgYSBjdXN0b20gaWQuIElmIGNsaWVudHMgZG8gbm90IHNwZWNpZnkgYW4gaWQsIHRoZSBpZCBkZWZhdWx0cyB0byAmYXBvcztvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuYWN0aW9uUHJvdmlkZXImYXBvczsuIEZvciBjbGllbnRzIHRoYXQgd2lzaCB0byBwaWNrIHVwIGFjdGlvblByb3ZpZGVycyB3aXRoIG5vIHNwZWNpZmljIGlkLCBjbGllbnRzIG11c3QgZGVmaW5lIGEgJmFwb3M7dmlld2VyQWN0aW9uQmluZGluZyZhcG9zOyBmb3IgdGhlIGRlZmF1bHQgaWQuIFNlZSB0aGUgZXhhbXBsZXMgc2VjdGlvbiBmb3IgaG93IHRoaXMgaXMgZG9uZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW5jbHVkZXMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImV4Y2x1ZGVzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlld2VySWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlcmUgc2hvdWxkIGJlIGEgY29ycmVzcG9uZGluZyBvcmcuZWNsaXBzZS51aS52aWV3cyBleHRlbnNpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIElkLiBUaGF0IGV4dGVuc2lvbiBzaG91bGQgc3BlY2lmeSBhbiBpbnN0YW5jZSBvZiBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uTmF2aWdhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpbmNsdWRlcyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lIGEgc2V0IG9mIHBhdHRlcm5zIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIHdoZW4gbG9va2luZyBmb3IgY29udGVudCBleHRlbnNpb25zIGZvciB0aGUgdmlld2VyIHRoYXQgbWF0Y2hlcyB0aGUgdmlld2VySWQgYXR0cmlidXRlLiBXaGVuIHRoZSBpbmNsdWRlcyBhbmQgZXhjbHVkZXMgc3RhdGVtZW50cyBpbnRlcnNlY3QsIHRoZSBpbmNsdWRlcyBzdGF0ZW1lbnQgd2lsbCBiZSBnaXZlbiBwcmVjZWRlbmNlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudEV4dGVuc2lvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWN0aW9uRXh0ZW5zaW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJleGNsdWRlcyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lIGEgc2V0IG9mIHBhdHRlcm5zIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIHdoZW4gbG9va2luZyBmb3IgY29udGVudCBleHRlbnNpb25zIGZvciB0aGUgdmlld2VyIHRoYXQgbWF0Y2hlcyB0aGUgdmlld2VySWQgYXR0cmlidXRlLiBXaGVuIHRoZSBpbmNsdWRlcyBhbmQgZXhjbHVkZXMgc3RhdGVtZW50cyBpbnRlcnNlY3QsIHRoZSBpbmNsdWRlcyBzdGF0ZW1lbnQgd2lsbCBiZSBnaXZlbiBwcmVjZWRlbmNlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudEV4dGVuc2lvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWN0aW9uRXh0ZW5zaW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZW50RXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGVudCBleHRlbnNpb24gc2hvdWxkIGJlIHF1ZXJpZWQgYnkgZ2V0RWxlbWVudHMoKSBvciBnZXRDaGlsZHJlbigpCi1mb3IgdGhlIHJvb3Qgb2YgdGhlIHZpZXdlci4gCi0mbHQ7cCZndDsKLUNsaWVudHMgbWF5IHNwZWNpZnkgJmFwb3M7aXNSb290JmFwb3M7IHRvIHNlbGVjdCBzcGVjaWZpYyByb290IGV4dGVuc2lvbnMgdG8gb3ZlcnJpZGUgCi10aGUgZXh0ZW5zaW9ucyB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmUgZW5hYmxlZCBmb3IgdGhlIHZpZXdlciBpbnB1dCBlbGVtZW50Ci0oYmFzZWQgb24gdGhlIG1hdGNoaW5nICZhcG9zO3RyaWdnZXJQb2ludHMmYXBvczsgZXhwcmVzc2lvbiBmb3IgdGhlIHZpZXdlciBpbnB1dCBlbGVtZW50KS4gCi0mbHQ7cCZndDsgICAKLVNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgJmFwb3M7dmlld2VyQ29udGVudEJpbmRpbmcmYXBvczsgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdHRlcm4iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQ29udGVudCBleHRlbnNpb25zIG1heSBiZSBzZWxlY3RlZCBleGFjdGx5IGJ5IHVzaW5nIHRoZWlyIGNvbnRlbnQgZXh0ZW5zaW9uIGlkLiBDbGllbnRzIG1heSBhbHNvIHVzZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIHNlbGVjdCBhbnkgY29udGVudCBleHRlbnNpb25zIHRoYXQgaGF2ZSBpZHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gCi0mbHQ7cCZndDsKLVBhdHRlcm5zIGFyZSByZWd1bGFyIGV4cHJlc3Npb25zIHdoaWNoIG1hdGNoIHVuaXF1ZSBpZGVudGlmaWVycy4gUGxlYXNlIHNlZSB0aGUgSmF2YSh0bSkgUGxhdGZvcm0gZG9jdW1lbnRhdGlvbiBmb3IgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gZm9yIGZ1cnRoZXIgZGV0YWlscy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpc1Jvb3QiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdmFsdWUgb2YgdHJ1ZSBpbmRpY2F0ZXMgdGhlIGNvbnRlbnQgZXh0ZW5zaW9uIHdpbGwgcHJvdmlkZSByb290IGNvbnRlbnQsIGFuZCBvdmVycmlkZSB0aGUgZGVmYXVsdCB0cmlnZ2VyUG9pbnRzIGV4cHJlc3Npb25zIGRlZmluZWQgaW4gdGhlIGJvdW5kIGNvbnRlbnQgZXh0ZW5zaW9ucyBmb3IgYSBnaXZlbiB2aWV3ZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFjdGlvbkV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGFjdGlvbiBleHRlbnNpb24gdGhhdCBzaG91bGQgYmUgZ2l2ZW4gb3Bwb3J0dW5pdGllcwotdG8gY29udHJpYnV0ZSB0byB0aGUgY29udGV4dCBtZW51IGFuZCBhY3Rpb24gYmFycy4gCi0mbHQ7cCZndDsgICAgICAgICAgICAgIAotU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciAmYXBvczt2aWV3ZXJBY3Rpb25CaW5kaW5nJmFwb3M7IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXR0ZXJuIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIENvbnRlbnQgZXh0ZW5zaW9ucyBtYXkgYmUgc2VsZWN0ZWQgZXhhY3RseSBieSB1c2luZyB0aGVpciBjb250ZW50IGV4dGVuc2lvbiBpZC4gQ2xpZW50cyBtYXkgYWxzbyB1c2UgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBzZWxlY3QgYW55IGNvbnRlbnQgZXh0ZW5zaW9ucyB0aGF0IGhhdmUgaWRzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uIAotJmx0O3AmZ3Q7Ci1QYXR0ZXJucyBhcmUgcmVndWxhciBleHByZXNzaW9ucyB3aGljaCBtYXRjaCB1bmlxdWUgaWRlbnRpZmllcnMuIFBsZWFzZSBzZWUgdGhlIEphdmEodG0pIFBsYXRmb3JtIGRvY3VtZW50YXRpb24gZm9yIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIGZvciBmdXJ0aGVyIGRldGFpbHMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InBvcHVwTWVudSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBwb3B1cE1lbnUgZWxlbWVudCBtYXkgb25seSBiZSBkZWZpbmVkIGlmIHRoZSAmYXBvcztwb3B1cE1lbnVJZCZhcG9zOyBhdHRyaWJ1dGUgb2YgdGhlIAotJmFwb3M7dmlld2VyJmFwb3M7IGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZC4gCi0mbHQ7cCZndDsKLVRoZSBwb3B1cE1lbnUgZWxlbWVudCBhbGxvd3MgZnVydGhlciBjdXN0b21pemF0aW9uIG9mIHRoZSBjb250ZXh0IG1lbnUgYXNzb2NpYXRlZCAKLXdpdGggdGhlIHZpZXdlci4gRm9yIHRoZSBvcHRpb25zIHRvIGJlIGFwcGxpZWQgY29ycmVjdGx5LCBhbiBpbnN0YW5jZSBvZiB0aGUgdmlld2VyCi1tdXN0IGRlbGVnYXRlIHRvIGEgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLk5hdmlnYXRvckFjdGlvblNlcnZpY2UsIHdoaWNoIGJlaGF2ZXMKLWxpa2UgYSBub3JtYWwgb3JnLmVjbGlwc2UudWkuQWN0aW9uR3JvdXAuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBBUEkgY2xhc3MKLWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGV4cGxvaXRpbmcgdGhpcyBmdW5jdGlvbmFsaXR5LiBGb3IgY2xpZW50cyB0aGF0IHVzZSBhbiAKLWluc3RhbmNlIG9mIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3IgZG8gbm90IG5lZWQgdG8gZG8gYW55IGV4dHJhIHdvcmsuIAotJmx0O3AmZ3Q7Ci1BIHBvcHVwTWVudSBkZWNsYXJlcyBvbmUgb3IgbW9yZSBpbnNlcnRpb25Qb2ludHMgdGhhdCB3aWxsIGJlIHVzZWQgYnkgY29udHJpYnV0b3JzIHRvIAotb3JnYW5pemUgdGhlaXIgY29udHJpYnV0aW9ucyBpbnRvIGEgbWVhbmluZ2Z1bCwgbW9yZSB1c2VyLWZyaWVuZGx5LCBjb25zaXN0ZW50IGxpc3QuIAotJmx0O3AmZ3Q7Ci1JZiBjbGllbnRzIG9ubHkgc3BlY2lmeSB0aGUgcG9wdXBNZW51SWQgYXR0cmlidXRlIG9mIHRoZSAmYXBvczt2aWV3ZXImYXBvczsgZWxlbWVudCwgdGhlbiB0aGUKLXNldCBvZiBpbnNlcnRpb25Qb2ludHMgdXNlZCBieSB0aGUgY29udGV4dCBtZW51IHdpbGwgZGVmYXVsdCB0byB0aGUgZm9sbG93aW5nIGxpc3QgCi1pbiB0aGUgZ2l2ZW4gb3JkZXI6Ci0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0mcXVvdDtncm91cC5uZXcmcXVvdDsgICAgICAgICAgICAgc2VwYXJhdG9yPSZxdW90O3RydWUmcXVvdDsKLSZxdW90O2dyb3VwLmdvdG8mcXVvdDsgICAgICAgICAgICAKLSZxdW90O2dyb3VwLm9wZW4mcXVvdDsgICAgICAgICAgICBzZXBhcmF0b3I9JnF1b3Q7dHJ1ZSZxdW90OwotJnF1b3Q7Z3JvdXAub3BlbldpdGgmcXVvdDsKLSZxdW90O2dyb3VwLnNob3cmcXVvdDsgICAgICAgICAgICBzZXBhcmF0b3I9JnF1b3Q7dHJ1ZSZxdW90OwotJnF1b3Q7Z3JvdXAuZWRpdCZxdW90OyAgICAgICAgICAgIHNlcGFyYXRvcj0mcXVvdDt0cnVlJnF1b3Q7Ci0mcXVvdDtncm91cC5yZW9yZ2FuaXplJnF1b3Q7Ci0mcXVvdDtncm91cC5wb3J0JnF1b3Q7Ci0mcXVvdDtncm91cC5nZW5lcmF0ZSZxdW90OyAgICAgICAgc2VwYXJhdG9yPSZxdW90O3RydWUmcXVvdDsKLSZxdW90O2dyb3VwLnNlYXJjaCZxdW90OyAgICAgICAgICBzZXBhcmF0b3I9JnF1b3Q7dHJ1ZSZxdW90OwotJnF1b3Q7Z3JvdXAuYnVpbGQmcXVvdDsgICAgICAgICAgIHNlcGFyYXRvcj0mcXVvdDt0cnVlJnF1b3Q7Ci0mcXVvdDthZGRpdGlvbnMmcXVvdDsgICAgICAgICAgICAgc2VwYXJhdG9yPSZxdW90O3RydWUmcXVvdDsgCi0mcXVvdDtncm91cC5wcm9wZXJ0aWVzJnF1b3Q7ICAgICAgc2VwYXJhdG9yPSZxdW90O3RydWUmcXVvdDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1DbGllbnRzIHRoYXQgd2lzaCB0byByZWZlciB0byB0aGVzZSB2YWx1ZXMgcHJvZ3JhbW1hdGljYWxseSBtYXkgdXNlIHRoZSBjb3JyZXNwb25kaW5nIGNvbnN0YW50cyBpbiBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbk1lbnVDb25zdGFudHMuIAotJmx0O3AmZ3Q7Ci1DbGllbnRzIHRoYXQgd2lzaCB0byBjdXN0b21pemUgdGhlaXIgbWVudXMgYXJlIGVuY291cmFnZWQgdG8gc3RhcnQgd2l0aCB0aGlzIGxpc3QgYW5kIGFkZCBvciByZW1vdmUgaW5zZXJ0aW9uIHBvaW50cyBhcyBuZWNlc3NhcnkuIENsaWVudHMgYXJlIGFsc28KLWVuY291cmFnZWQgdG8gZm9sbG93IHRoZSBwYXR0ZXJuIG9mIGJlZ2lubmluZyBlYWNoIGdyb3VwIG5hbWUgd2l0aCAmcXVvdDtncm91cC4mcXVvdDsuIAotJmx0O3AmZ3Q7Ci1JZiB0aGUgcG9wdXBNZW51IGVsZW1lbnQgaXMgc3BlY2lmaWVkIGFuZCBjb250YWlucyBOTyBpbnNlcnRpb25Qb2ludCBjaGlsZHJlbiBlbGVtZW50cywgdGhlbiB0aGUgY29udGV4dCBtZW51IHdpbGwgaGF2ZSBubyBwdWJsaXNoZWQgaW5zZXJ0aW9uIHBvaW50cy4gT2YgY291cnNlLCBwcm9ncmFtbWF0aWMgY2xpZW50cyBhcmUgbm90IHJlc3RyaWN0ZWQgZnJvbSBhZGRpbmcgdGhlaXIgb3duIGluc2VydGlvbiBwb2ludHMgYXMgbmVjZXNzYXJ5LiBDbGllbnRzIGRlZmluaW5nIHZpZXdlcnMgYXJlIGVuY291cmFnZWQgdG8gcHVibGlzaCB0aGVpciBpbnNlcnRpb24gcG9pbnRzIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzIGFuZCBjbGFyaXR5IGZvciBkb3duc3RyZWFtIGV4dGVuc2lvbnMgdG8gdGhlaXIgdmlld2Vycy9uYXZpZ2F0b3JzLCBvciB0byBleHBsaWNpdGx5IGRvY3VtZW50IHdoaWNoIGluc2VydGlvbiBwb2ludHMgYXJlIGNvbnNpZGVyZWQgQVBJIGFuZCB3aGljaCBhcmUgY29uc2lkZXJlZCBpbnRlcm5hbC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW5zZXJ0aW9uUG9pbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgbWVudS4gSGFzIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZSBwb3B1cE1lbnVJZCBhdHRyaWJ1dGUgb2YgJmFwb3M7dmlld2VyJmFwb3M7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsbG93c1BsYXRmb3JtQ29udHJpYnV0aW9ucyIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB2YWx1ZSBvZiAmYXBvczt0cnVlJmFwb3M7IHdpbGwgcmVnaXN0ZXIgdGhlIGRlY2xhcmVkIHBvcHVwTWVudSAoYnkgaWQpIGZvciBvYmplY3Qgb3Igdmlld2VyIGNvbnRyaWJ1dGlvbnMgYXMgZGVjbGFyZWQgYnkgdGhlICZsdDtiJmd0O29yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMmbHQ7L2ImZ3Q7IGV4dGVuc2lvbiBwb2ludC4gQSB2YWx1ZSBvZiAmYXBvcztmYWxzZSZhcG9zOyB3aWxsIHJlc3RyaWN0IHRoZSBwb3B1cE1lbnUgdG8gcHJvZ3JhbW1hdGljIGNvbnRyaWJ1dGlvbnMgYXMgZGVjbGFyZWQgYnkgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVycyAoc2VlICZsdDtiJmd0O29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50L2FjdGlvblByb3ZpZGVyJmx0Oy9iJmd0OyBhbmQgJmx0O2ImZ3Q7b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQvbmF2aWdhdG9yQ29udGVudC9hY3Rpb25Qcm92aWRlciZsdDsvYiZndDspLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpbnNlcnRpb25Qb2ludCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZpbmVzIGFuIGluc2VydGlvbiBwb2ludCBmb3IgdGhlIGNvbnRleHQgbWVudS4gSW5kY2x1ZGVzIHRoZSBuYW1lIG9mIHRoZSBwb2ludCBmb3IgY2xpZW50cyB0byByZWZlciB0bywgYW5kIHdoZXRoZXIgdGhlIGluc2VydGlvbiBwb2ludCBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYSBzZXBhcmF0b3Igb3IgYSBncm91cCBtYXJrZXIuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSW5kaWNhdGVzIHRoZSBuYW1lIG9mIHRoZSBpbnNlcnRpb24gcG9pbnQuIENsaWVudHMgd2lsbCB1c2UgdGhlIG5hbWUgdG8gcmVmZXIgdG8gdGhlIGluc2VydGlvbiBwb2ludCBhcyBwYXJ0IG9mIGEgbWVudSBwYXRoIHdoZW4gcHJvdmlkaW5nIGVpdGhlciBwcm9ncmFtbWF0aWMgY29udHJpYnV0aW9ucyB2aWEgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyIG9yIGRlY2xhcmF0aXZlIGNvbnRyaWJ1dGlvbnMgdmlhIHRoZSAmbHQ7YiZndDtvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzJmx0Oy9iJmd0OyBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VwYXJhdG9yIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHZhbHVlIG9mIHRydWUgd2lsbCBjYXVzZSB0aGUgaW5zZXJ0aW9uIHBvaW50IHRvIGJlIHJlcHJlc2VudGVkIGFzIGEgYmFyIGluIHRoZSBtZW51LiBUaGlzIGFsbG93cyBjbGllbnRzIHRvIHZpc3VhbGx5IGdyb3VwIGl0ZW1zIGluIHRoZSBjb250ZXh0IG1lbnUsIGJhc2VkIG9uIHRoZWlyIHJlbGV2YW5jZSB0byB0aGUgdXNlci4gQnkgZGVmYXVsdCwgdGhlIHZhbHVlIGlzIGZhbHNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci1UaGUgZm9sbG93aW5nIGV4YW1wbGUgY29uZmlndXJlcyB0aGUgcG9wdXAgbWVudSBpZCBmb3IgYSB2aWV3ZXIuICAgICAgCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0KLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7dmlld2VyIAotICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UudGVzdFZpZXdlciZxdW90OyAKLSAgICAgICAgIHBvcHVwTWVudUlkPSZxdW90O29yZy5lY2xpcHNlLnRlc3RWaWV3ZXIjUG9wdXBNZW51JnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLVNpbmNlIHRoZSBwb3B1cE1lbnUgY2hpbGQgZWxlbWVudCBvZiB2aWV3ZXIgaXMgbm90IHVzZWQgaW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSBkZWZhdWx0IHNldCBvZgotaW5zZXJ0aW9uUG9pbnRzIHdpbGwgYmUgdXNlZC4gVGhpcyBzZXQgaXMgZGVmaW5lZCBhcyBmb2xsb3dzLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yCi10aGUgcG9wdXBNZW51IGVsZW1lbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0mcXVvdDtncm91cC5uZXcmcXVvdDsgICAgICAgICAgICAgc2VwYXJhdG9yPSZxdW90O3RydWUmcXVvdDsKLSZxdW90O2dyb3VwLmdvdG8mcXVvdDsgICAgICAgICAgICAKLSZxdW90O2dyb3VwLm9wZW4mcXVvdDsgICAgICAgICAgICBzZXBhcmF0b3I9JnF1b3Q7dHJ1ZSZxdW90OwotJnF1b3Q7Z3JvdXAub3BlbldpdGgmcXVvdDsKLSZxdW90O2dyb3VwLnNob3cmcXVvdDsgICAgICAgICAgICBzZXBhcmF0b3I9JnF1b3Q7dHJ1ZSZxdW90OwotJnF1b3Q7Z3JvdXAuZWRpdCZxdW90OyAgICAgICAgICAgIHNlcGFyYXRvcj0mcXVvdDt0cnVlJnF1b3Q7Ci0mcXVvdDtncm91cC5yZW9yZ2FuaXplJnF1b3Q7Ci0mcXVvdDtncm91cC5wb3J0JnF1b3Q7Ci0mcXVvdDtncm91cC5nZW5lcmF0ZSZxdW90OyAgICAgICAgc2VwYXJhdG9yPSZxdW90O3RydWUmcXVvdDsKLSZxdW90O2dyb3VwLnNlYXJjaCZxdW90OyAgICAgICAgICBzZXBhcmF0b3I9JnF1b3Q7dHJ1ZSZxdW90OwotJnF1b3Q7Z3JvdXAuYnVpbGQmcXVvdDsgICAgICAgICAgIHNlcGFyYXRvcj0mcXVvdDt0cnVlJnF1b3Q7Ci0mcXVvdDthZGRpdGlvbnMmcXVvdDsgICAgICAgICAgICAgc2VwYXJhdG9yPSZxdW90O3RydWUmcXVvdDsgCi0mcXVvdDtncm91cC5wcm9wZXJ0aWVzJnF1b3Q7ICAgICAgc2VwYXJhdG9yPSZxdW90O3RydWUmcXVvdDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGEgdmlld2VyIGNvbmZpZ3VyYXRpb24gd2hpY2ggZGVjbGFyZXMgY3VzdG9tCi1wb3B1cE1lbnUgaW5zZXJ0aW9uIHBvaW50cywgYnV0IHJlc3RyaWN0cyBvYmplY3QgYW5kIHZpZXdlciBjb250cmlidXRpb25zCi13aXRoIHRoZSAmYXBvczthbGxvd3NQbGF0Zm9ybUNvbnRyaWJ1dGlvbnMmYXBvczsgYXR0cmlidXRlLiBDbGllbnRzIG1heSBvbmx5IGNvbnRyaWJ1dGUKLXRvIHRoZSBkZWZpbmVkIG1lbnUgdmlhIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25BY3Rpb25Qcm92aWRlcnMgZGVjbGFyZWQKLWZvciB0aGUgdmlld2VyIChlaXRoZXIgdG9wLWxldmVsIG9yIGFzc29jaWF0ZWQgd2l0aCBjb250ZW50IGV4dGVuc2lvbnMpLiAKLSZsdDtwJmd0OwotTm90ZSB0aGF0IHRoZSBwb3B1cE1lbnVJZCBhdHRyaWJ1dGUgaXMgbm90IGNvbmN1cnJlbnRseSBzcGVjaWZpZWQgd2l0aCB0aGUgCi1wb3B1cE1lbnUgZWxlbWVudC4gT25seSBvbmUgb3IgdGhlIG90aGVyLCBidXQgbm90IGJvdGgsIGlzIGEgdmFsaWQgY29uZmlndXJhdGlvbi4KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXImcXVvdDsmZ3Q7Ci0gICAgICAgJmx0O3ZpZXdlcgotICAgICAgICAgICAgIHZpZXdlcklkPSZxdW90O29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZUNvbnRlbnQmcXVvdDsmZ3Q7Ci0gICAgICAgICAgJmx0O3BvcHVwTWVudQotICAgICAgICAgICAgICAgIGFsbG93c1BsYXRmb3JtQ29udHJpYnV0aW9ucz0mcXVvdDtmYWxzZSZxdW90OwotICAgICAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZUNvbnRlbnQjUG9wdXBNZW51JnF1b3Q7Jmd0OyAgCi0gICAgICAgICAgICAgJmx0O2luc2VydGlvblBvaW50IG5hbWU9JnF1b3Q7Z3JvdXAubmV3JnF1b3Q7LyZndDsKLSAgICAgICAgICAgICAmbHQ7aW5zZXJ0aW9uUG9pbnQKLSAgICAgICAgICAgICAgICAgICBuYW1lPSZxdW90O2dyb3VwLm9wZW4mcXVvdDsKLSAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3I9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgJmx0O2luc2VydGlvblBvaW50IG5hbWU9JnF1b3Q7Z3JvdXAub3BlbldpdGgmcXVvdDsvJmd0OyAgICAgICAgICAgICAKLSAgICAgICAgICAgICAmbHQ7aW5zZXJ0aW9uUG9pbnQKLSAgICAgICAgICAgICAgICAgICBuYW1lPSZxdW90O2dyb3VwLnBvcnQmcXVvdDsKLSAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3I9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7IAotICAgICAgICAgICAgICZsdDtpbnNlcnRpb25Qb2ludAotICAgICAgICAgICAgICAgICAgIG5hbWU9JnF1b3Q7YWRkaXRpb25zJnF1b3Q7Ci0gICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yPSZxdW90O3RydWUmcXVvdDsvJmd0OyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgJmx0O2luc2VydGlvblBvaW50Ci0gICAgICAgICAgICAgICAgICAgbmFtZT0mcXVvdDtncm91cC5wcm9wZXJ0aWVzJnF1b3Q7Ci0gICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yPSZxdW90O3RydWUmcXVvdDsvJmd0OwotICAgICAgICAgICZsdDsvcG9wdXBNZW51Jmd0OwotICAgICAgICZsdDsvdmlld2VyJmd0OwotICAgICAgICZsdDt2aWV3ZXJDb250ZW50QmluZGluZyAKLSAgICAgICAgICAgICB2aWV3ZXJJZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VDb250ZW50JnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0O2luY2x1ZGVzJmd0OwotICAgICAgICAgICAgICAgICZsdDtjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49JnF1b3Q7b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlQ29udGVudCZxdW90OyAvJmd0OwotICAgICAgICAgICAgJmx0Oy9pbmNsdWRlcyZndDsKLSAgICAgICAmbHQ7L3ZpZXdlckNvbnRlbnRCaW5kaW5nJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0KLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotCi0mbHQ7cCZndDsKLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWNsYXJlcyB0aGF0IG9uZSBjb250ZW50IGV4dGVuc2lvbiAKLShpZDogb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlQ29udGVudCkgaXMgYm91bmQKLXRvIGEgdmlld2VyIG1hdGNoaW5nIHRoZSBpZCAmYXBvcztvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VDb250ZW50JmFwb3M7LiAKLUZ1cnRoZXIsIGFueSBpZCB0aGF0IGJlZ2lucyB3aXRoICZhcG9zO29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci50ZXN0cyZhcG9zOwotd2lsbCBiZSBpZ25vcmVkLiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXImcXVvdDsmZ3Q7Ci0gICAgICAgJmx0O3ZpZXdlckNvbnRlbnRCaW5kaW5nIAotICAgICAgICAgICAgIHZpZXdlcklkPSZxdW90O29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZUNvbnRlbnQmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7aW5jbHVkZXMmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2NvbnRlbnRFeHRlbnNpb24gcGF0dGVybj0mcXVvdDtvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VDb250ZW50JnF1b3Q7IC8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2luY2x1ZGVzJmd0OwotICAgICAgICAgICAgJmx0O2V4Y2x1ZGVzJmd0OwotICAgICAgICAgICAgICAgICZsdDtjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49JnF1b3Q7b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnRlc3RzLiomcXVvdDsgLyZndDsKLSAgICAgICAgICAgICZsdDsvZXhjbHVkZXMmZ3Q7Ci0gICAgICAgJmx0Oy92aWV3ZXJDb250ZW50QmluZGluZyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVjbGFyZXMgYSAmYXBvczt2aWV3ZXJBY3Rpb25CaW5kaW5nJmFwb3M7IGZvciBhbGwgYWN0aW9uUHJvdmlkZXJzIChub3QgCi1uZXN0ZWQgdW5kZXIgYSBuYXZpZ2F0b3JDb250ZW50IGV4dGVuc2lvbikgdGhhdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uCi0mcXVvdDtvcmcuYWNtZS5hY3Rpb25zLiomcXVvdDsgYnV0IG5vdCAmcXVvdDtvcmcuYWNtZS5hY3Rpb25zLnRlc3RzLiomcXVvdDsuIFRoaXMgZXhwcmVzc2lvbiAKLXdpbGwgbWFrZSBhbnkgYWN0aW9uUHJvdmlkZXIgd2hvc2UgaWQgYmVnaW5zIHdpdGggJnF1b3Q7b3JnLmFjbWUuYWN0aW9ucy4mcXVvdDsgYnV0IG5vdCAmcXVvdDtvcmcuYWNtZS5hY3Rpb25zLnRlc3RzLiZxdW90OyB2aXNpYmxlIHRvIHRoZSB2aWV3ZXIgd2l0aCB0aGUgaWQgJnF1b3Q7b3JnLmFjbWUudmlld2VyJnF1b3Q7LgotT2YgY291cnNlLCB0aGUgJmFwb3M7dmlld2VyQWN0aW9uQmluZGluZ3MmYXBvczsgb25seSBhcHBseSB0byAmYXBvczthY3Rpb25Qcm92aWRlciZhcG9zOyBlbGVtZW50cyB0aGF0IAotYXJlIG5vdCBuZXN0ZWQgdW5kZXIgYSAmYXBvcztuYXZpZ2F0b3JDb250ZW50JmFwb3M7IGVsZW1lbnQuIFRoZSB2aXNpYmlsaXR5IG9mIG5lc3RlZCAKLSZhcG9zO2FjdGlvblByb3ZpZGVyJmFwb3M7IGVsZW1lbnRzIGlzIGNvbnRyb2xsZWQgYnkgJmFwb3M7dmlld2VyQ29udGVudEJpbmRpbmdzJmFwb3M7IGZvciB0aGUgZW5jbG9zaW5nCi0mYXBvcztuYXZpZ2F0b3JDb250ZW50JmFwb3M7IGVsZW1lbnQuCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld2VyJnF1b3Q7Jmd0OwotICAgICAgICZsdDt2aWV3ZXJBY3Rpb25CaW5kaW5nIAotICAgICAgICAgICAgIHZpZXdlcklkPSZxdW90O29yZy5hY21lLnZpZXdlciZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDtpbmNsdWRlcyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7Y29udGVudEV4dGVuc2lvbiBwYXR0ZXJuPSZxdW90O29yZy5hY21lLmFjdGlvbnMuKiZxdW90OyAvJmd0OwotICAgICAgICAgICAgJmx0Oy9pbmNsdWRlcyZndDsKLSAgICAgICAgICAgICZsdDtleGNsdWRlcyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7Y29udGVudEV4dGVuc2lvbiBwYXR0ZXJuPSZxdW90O29yZy5hY21lLmFjdGlvbnMudGVzdHMuKiZxdW90OyAvJmd0OwotICAgICAgICAgICAgJmx0Oy9leGNsdWRlcyZndDsKLSAgICAgICAmbHQ7L3ZpZXdlckFjdGlvbkJpbmRpbmcmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVGhlIGZvbGxvd2luZyBleGFtcGxlIG1ha2VzIGFueSBhY3Rpb25Qcm92aWRlciB3aXRoIG5vICZhcG9zO2lkJmFwb3M7IGF0dHJpYnV0ZSB2aXNpYmxlCi10byB0aGUgdmlld2VyICZhcG9zO29yZy5hY21lLnZpZXdlciZhcG9zOy4gVGhlIGFjdGlvblByb3ZpZGVycyB3aXRoIG5vICZhcG9zO2lkJmFwb3M7IGF0dHJpYnV0ZQotaGF2ZSBhIGRlZmF1bHQgaWQgb2YgJnF1b3Q7b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmFjdGlvblByb3ZpZGVyJnF1b3Q7LiBPZiBjb3Vyc2UsCi10aGUgJmFwb3M7dmlld2VyQWN0aW9uQmluZGluZ3MmYXBvczsgb25seSBhcHBseSB0byAmYXBvczthY3Rpb25Qcm92aWRlciZhcG9zOyBlbGVtZW50cyB0aGF0IAotYXJlIG5vdCBuZXN0ZWQgdW5kZXIgYSAmYXBvcztuYXZpZ2F0b3JDb250ZW50JmFwb3M7IGVsZW1lbnQuIFRoZSB2aXNpYmlsaXR5IG9mIG5lc3RlZCAKLSZhcG9zO2FjdGlvblByb3ZpZGVyJmFwb3M7IGVsZW1lbnRzIGlzIGNvbnRyb2xsZWQgYnkgJmFwb3M7dmlld2VyQ29udGVudEJpbmRpbmdzJmFwb3M7IGZvciB0aGUgZW5jbG9zaW5nCi0mYXBvcztuYXZpZ2F0b3JDb250ZW50JmFwb3M7IGVsZW1lbnQuCi0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXImcXVvdDsmZ3Q7Ci0gICAgICAgJmx0O3ZpZXdlckFjdGlvbkJpbmRpbmcgCi0gICAgICAgICAgICAgdmlld2VySWQ9JnF1b3Q7b3JnLmFjbWUudmlld2VyJnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0O2luY2x1ZGVzJmd0OwotICAgICAgICAgICAgICAgICZsdDtjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49JnF1b3Q7b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmFjdGlvblByb3ZpZGVyJnF1b3Q7IC8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2luY2x1ZGVzJmd0OyAKLSAgICAgICAmbHQ7L3ZpZXdlckFjdGlvbkJpbmRpbmcmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc2NyaXB0cy9zcmMuamFyZGVzYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NjcmlwdHMvc3JjLmphcmRlc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzNkYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc2NyaXB0cy9zcmMuamFyZGVzYworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08amFyZGVzYz4KLQk8amFyIHBhdGg9IkM6L2Rldi93b3Jrc3BhY2VzL2dlbmVyYWwtcHVycG9zZS1uYXZpZ2F0b3Ivb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yL25hdmlnYXRvci5qYXIiLz4KLQk8b3B0aW9ucyBjb21wcmVzcz0idHJ1ZSIKLQkJZGVzY3JpcHRpb25Mb2NhdGlvbj0iL29yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci9zY3JpcHRzL3NyYy5qYXJkZXNjIgotCQlleHBvcnRFcnJvcnM9InRydWUiIGV4cG9ydFdhcm5pbmdzPSJ0cnVlIiBsb2dFcnJvcnM9InRydWUiCi0JCWxvZ1dhcm5pbmdzPSJ0cnVlIiBvdmVyd3JpdGU9ImZhbHNlIiBzYXZlRGVzY3JpcHRpb249InRydWUiIHVzZVNvdXJjZUZvbGRlcnM9ImZhbHNlIi8+Ci0JPG1hbmlmZXN0IGdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIgotCQltYW5pZmVzdExvY2F0aW9uPSIvb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yL3NyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIKLQkJbWFuaWZlc3RWZXJzaW9uPSIxLjAiIHJldXNlTWFuaWZlc3Q9ImZhbHNlIiBzYXZlTWFuaWZlc3Q9ImZhbHNlIiB1c2VzTWFuaWZlc3Q9ImZhbHNlIj4KLQkJPHNlYWxpbmcgc2VhbEphcj0iZmFsc2UiPjxwYWNrYWdlc1RvU2VhbC8+PHBhY2thZ2VzVG9VblNlYWwvPjwvc2VhbGluZz4KLQk8L21hbmlmZXN0PgotCTxzZWxlY3RlZEVsZW1lbnRzIGV4cG9ydENsYXNzRmlsZXM9InRydWUiIGV4cG9ydEphdmFGaWxlcz0iZmFsc2UiPgotCQk8amF2YUVsZW1lbnQgaGFuZGxlSWRlbnRpZmllcj0iPW9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci9zcmMiLz4KLQk8L3NlbGVjdGVkRWxlbWVudHM+Ci08L2phcmRlc2M+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0NvbW1vbkFjdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0NvbW1vbkFjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZWQ0NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9Db21tb25BY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci0KLS8qKgotICogPHA+Ci0gKiBQcm92aWRlcyBhY3Rpb25zIGZyb20gZXh0ZW5zaW9ucyBmb3IgbWVudSBhbmQKLSAqIHtAbGluayBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyc30gY29udHJpYnV0aW9ucy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBzaG91bGQgYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzIG9mIHRoZQotICogPGI+b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQ8L2I+IGV4dGVuc2lvbiBwb2ludCBmb3IKLSAqIHRvcC1sZXZlbCBhbmQgbmVzdGVkICZsdDthY3Rpb25Qcm92aWRlciAmZ3Q7IGVsZW1lbnRzLgotICogPC9wPgotICogPHA+IAotICoge0BsaW5rIENvbW1vbkFjdGlvblByb3ZpZGVyfXMgYXJlIGRlY2xhcmVkIHZpYSB0aGUKLSAqIDxiPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50PC9iPiBleHRlbnNpb24gcG9pbnQuIAotICoge0BsaW5rIENvbW1vbkFjdGlvblByb3ZpZGVyfXMgbWF5IGJlIGRlY2xhcmVkIGFzIHRvcC1sZXZlbCBlbGVtZW50cyBpbiB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0gKiAoZS5nLiBhbiAmbHQ7YWN0aW9uUHJvdmlkZXIgLyZndDsgZWxlbWVudCBhdCB0aGUgcm9vdCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50KS4KLSAqIEFsdGVybmF0aXZlbHksICZsdDthY3Rpb25Qcm92aWRlciAvJmd0OyBlbGVtZW50cyBtYXkgYmUgbmVzdGVkIHVuZGVyIGEKLSAqICZsdDtuYXZpZ2F0b3JDb250ZW50IC8mZ3Q7IGVsZW1lbnQsIGluIHdoaWNoIGNhc2UgdGhleSBhcmUgY29uc2lkZXJlZCB0byBiZQotICogImFzc29jaWF0ZWQiIHdpdGggdGhhdCBjb250ZW50IGV4dGVuc2lvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgCi0gKiA8Yj5vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudDwvYj4gZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBDbGllbnRzIG1heSBzdWJjbGFzcyB0aGlzIGNsYXNzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21tb25BY3Rpb25Qcm92aWRlciBleHRlbmRzIEFjdGlvbkdyb3VwIGltcGxlbWVudHMKLQkJSU1lbWVudG9Bd2FyZSB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJbml0aWFsaXplIHRoZSBjdXJyZW50IElDb21tb25BY3Rpb25Qcm92aWRlciB3aXRoIHRoZSBzdXBwbGllZAotCSAqIGluZm9ybWF0aW9uLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBpbml0KCkgaXMgZ3VhcmFudGVlZCB0byBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBtZXRob2Qgb2YgdGhlCi0JICogQWN0aW9uR3JvdXAgc3VwZXIgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIGFDb25maWcKLQkgKiAgICAgICAgICAgIFRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgaW5zdGFudGlhdGVkIENvbW1vbgotCSAqICAgICAgICAgICAgQWN0aW9uIFByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoQ29tbW9uQWN0aW9uUHJvdmlkZXJDb25maWcgYUNvbmZpZyk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXN0b3JlIHRoZSBwcmV2aW91cyBzdGF0ZSBvZiBhbnkgYWN0aW9ucyB1c2luZyB0aGUgZmxhZ3MgaW4gYU1lbWVudG8uCi0JICogVGhpcyBtZXRob2QgYWxsb3dzIHRoZSBzdGF0ZSBvZiBhbnkgYWN0aW9ucyB0aGF0IHBlcnNpc3QgZnJvbSBzZXNzaW9uIHRvCi0JICogc2Vzc2lvbiB0byBiZSByZXN0b3JlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZG8gbm90aGluZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNZW1lbnRvCi0JICogICAgICAgICAgICBBIG1lbWVudG8gdGhhdCB3YXMgZ2l2ZW4gdG8gdGhlIHZpZXcgcGFydCB0byByZXN0b3JlIGl0cwotCSAqICAgICAgICAgICAgc3RhdGUuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogU2F2ZSBmbGFncyBpbiBhTWVtZW50byB0byByZW1lbWJlciB0aGUgc3RhdGUgb2YgYW55IGFjdGlvbnMgdGhhdCBwZXJzaXN0Ci0JICogZnJvbSBzZXNzaW9uIHRvIHNlc3Npb24uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEV4dGVuc2lvbnMgc2hvdWxkIHF1YWxpZnkgYW55IGtleXMgc3RvcmVkIGluIHRoZSBtZW1lbnRvIHdpdGggdGhlaXIKLQkgKiBwbHVnaW4gaWQKLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZG8gbm90aGluZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNZW1lbnRvCi0JICogICAgICAgICAgICBBIG1lbWVudG8gdGhhdCB3YXMgZ2l2ZW4gdG8gdGhlIHZpZXcgcGFydCB0byBzYXZlIGl0cyBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvQ29tbW9uQWN0aW9uUHJvdmlkZXJDb25maWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvQ29tbW9uQWN0aW9uUHJvdmlkZXJDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlNDUwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0NvbW1vbkFjdGlvblByb3ZpZGVyQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotCi0vKioKLSAqIAotICogUHJvdmlkZXMgYWNjZXNzIHRvIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciB0aGUgaW5pdGlhbGl6YXRpb24gb2YKLSAqIENvbW1vbkFjdGlvblByb3ZpZGVycy4KLSAqIAotICogPHA+Ci0gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIDxiPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50PC9iPgotICogZXh0ZW5zaW9uIHBvaW50IGFuZCB7QGxpbmsgQ29tbW9uQWN0aW9uUHJvdmlkZXJ9IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCi0gKiBkZWNsYXJpbmcge0BsaW5rIENvbW1vbkFjdGlvblByb3ZpZGVyfXMuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tbW9uQWN0aW9uUHJvdmlkZXJDb25maWcgewotCi0JcHJpdmF0ZSBTdHJpbmcgZXh0ZW5zaW9uSWQ7Ci0KLQlwcml2YXRlIElWaWV3UGFydCB2aWV3UGFydDsKLQotCXByaXZhdGUgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGNvbnRlbnRTZXJ2aWNlOwotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVmlld2VyIHN0cnVjdHVyZWRWaWV3ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjb25maWcgZWxlbWVudCBmb3IgdGhlIGluaXRpYWxpemF0aW9uIG9mIENvbW1vbiBBY3Rpb24KLQkgKiBQcm92aWRlcnMuCi0JICogCi0JICogQHBhcmFtIGFuRXh0ZW5zaW9uSWQKLQkgKiAgICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYXNzb2NpYXRlZCBjb250ZW50IGV4dGVuc2lvbiBvcgotCSAqICAgICAgICAgICAgdGhlIHRvcC1sZXZlbCBhY3Rpb24gcHJvdmlkZXIuIDxiPk1heSBOT1QgYmUgbnVsbC48L2I+Ci0JICogQHBhcmFtIGFWaWV3UGFydAotCSAqICAgICAgICAgICAgVGhlIHZpZXcgcGFydCB0aGF0IHdpbGwgYmUgdXNpbmcgdGhlIGluc3RhbnRpYXRlZAotCSAqICAgICAgICAgICAgQ29tbW9uQWN0aW9uUHJvdmlkZXIuIDxiPk1heSBOT1QgYmUgbnVsbC48L2I+Ci0JICogQHBhcmFtIGFDb250ZW50U2VydmljZQotCSAqICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgY29udGVudCBzZXJ2aWNlIHRvIGFsbG93IGNvb3JkaW5hdGlvbiB3aXRoCi0JICogICAgICAgICAgICBjb250ZW50IGV4dGVuc2lvbnMgdmlhIHRoZSBJRXh0ZW5zaW9uU3RhdGVNb2RlbC4gQ2xpZW50cyBtYXkKLQkgKiAgICAgICAgICAgIGFjY2VzcyB0aGUgY29udGVudCBwcm92aWRlcnMgYW5kIGxhYmVsIHByb3ZpZGVycyBhcyBuZWNlc3NhcnkKLQkgKiAgICAgICAgICAgIGFsc28gdG8gcmVuZGVyIGxhYmVscyBvciBpbWFnZXMgaW4gdGhlaXIgVUkuIDxiPk1heSBOT1QgYmUKLQkgKiAgICAgICAgICAgIG51bGwuPC9iPgotCSAqIEBwYXJhbSBhU3RydWN0dXJlZFZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciBjb250cm9sIHRoYXQgd2lsbCB1c2UgdGhlIGluc3RhbnRpYXRlZCBDb21tb24KLQkgKiAgICAgICAgICAgIEFjdGlvbiBQcm92aWRlci4gPGI+TWF5IE5PVCBiZSBudWxsLjwvYj4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uQWN0aW9uUHJvdmlkZXJDb25maWcoU3RyaW5nIGFuRXh0ZW5zaW9uSWQsCi0JCQlJVmlld1BhcnQgYVZpZXdQYXJ0LCBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgYUNvbnRlbnRTZXJ2aWNlLAotCQkJU3RydWN0dXJlZFZpZXdlciBhU3RydWN0dXJlZFZpZXdlcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGFuRXh0ZW5zaW9uSWQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGFDb250ZW50U2VydmljZSk7Ci0JCUFzc2VydC5pc05vdE51bGwoYVZpZXdQYXJ0KTsKLQkJQXNzZXJ0LmlzTm90TnVsbChhU3RydWN0dXJlZFZpZXdlcik7Ci0JCWV4dGVuc2lvbklkID0gYW5FeHRlbnNpb25JZDsKLQkJdmlld1BhcnQgPSBhVmlld1BhcnQ7Ci0JCWNvbnRlbnRTZXJ2aWNlID0gYUNvbnRlbnRTZXJ2aWNlOwotCQlzdHJ1Y3R1cmVkVmlld2VyID0gYVN0cnVjdHVyZWRWaWV3ZXI7Ci0KLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCB0aGUgZXh0ZW5zaW9uIHN0YXRlIG1vZGVsIHJldHVybmVkIGlzIGZvciB0aGUgYXNzb2NpYXRlZAotCSAqIGNvbnRlbnQgZXh0ZW5zaW9uIChpZiB0aGlzIGlzIE5PVCBhIHRvcC1sZXZlbCBhY3Rpb24gcHJvdmlkZXIpLgotCSAqIE90aGVyd2lzZSwgY2xpZW50cyBtYXkgdXNlCi0JICoge0BsaW5rIElOYXZpZ2F0b3JDb250ZW50U2VydmljZSNmaW5kU3RhdGVNb2RlbChTdHJpbmcpfSB0byBsb2NhdGUgdGhlCi0JICogc3RhdGUgbW9kZWwgb2YgYW5vdGhlciBjb250ZW50IGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24gc3RhdGUgbW9kZWwgb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBFeHRlbnNpb24gKGlmCi0JICogICAgICAgICBhbnkpIG9yIGEgc3RhdGUgbW9kZWwgc3BlY2lmaWNhbGx5IGZvciB0aGlzCi0JICogICAgICAgICBJQ29tbW9uQWN0aW9uUHJvdmlkZXIuCi0JICogQHNlZSBJRXh0ZW5zaW9uU3RhdGVNb2RlbAotCSAqLwotCXB1YmxpYyBJRXh0ZW5zaW9uU3RhdGVNb2RlbCBnZXRFeHRlbnNpb25TdGF0ZU1vZGVsKCkgewotCQlyZXR1cm4gY29udGVudFNlcnZpY2UuZmluZFN0YXRlTW9kZWwoZ2V0RXh0ZW5zaW9uSWQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFzc29jaWF0ZWQgY29udGVudCBleHRlbnNpb24gb3IgdGhlCi0JICogICAgICAgICB0b3AtbGV2ZWwgQ29tbW9uIEFjdGlvbiBQcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbklkKCkgewotCQlyZXR1cm4gZXh0ZW5zaW9uSWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBjb250ZW50IHNlcnZpY2UgZm9yIHRoZSBpbnN0YW50aWF0ZWQgQ29tbW9uIEFjdGlvbgotCSAqICAgICAgICAgUHJvdmlkZXIuCi0JICovCi0JcHVibGljIElOYXZpZ2F0b3JDb250ZW50U2VydmljZSBnZXRDb250ZW50U2VydmljZSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRTZXJ2aWNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgc3RydWN0dXJlZCB2aWV3ZXIgZm9yIHRoZSBpbnN0YW50aWF0ZWQgQ29tbW9uCi0JICogICAgICAgICBBY3Rpb24gUHJvdmlkZXIuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRWaWV3ZXIgZ2V0U3RydWN0dXJlZFZpZXdlcigpIHsKLQkJcmV0dXJuIHN0cnVjdHVyZWRWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBJVmlld1BhcnQgZm9yIHRoZSBpbnN0YW50aWF0ZWQgQ29tbW9uIEFjdGlvbgotCSAqICAgICAgICAgUHJvdmlkZXIuCi0JICovCi0JcHVibGljIElWaWV3UGFydCBnZXRWaWV3UGFydCgpIHsKLQkJcmV0dXJuIHZpZXdQYXJ0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gVGhlIElWaWV3U2l0ZSBmcm9tIHRoZSBjb250YWluZWQgSVZpZXdQYXJ0LiBFcXVpdmFsZW50IHRvIGdldFZpZXdQYXJ0KCkuZ2V0Vmlld1NpdGUoKS4KLQkgKi8KLQlwdWJsaWMgSVZpZXdTaXRlIGdldFZpZXdTaXRlKCkgewotCQlyZXR1cm4gdmlld1BhcnQuZ2V0Vmlld1NpdGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0NvbW1vbk5hdmlnYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9Db21tb25OYXZpZ2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0M2YwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0NvbW1vbk5hdmlnYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuQ29tbW9uTmF2aWdhdG9yQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLkNvbW1vblNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmFjdGlvbnMuQ29sbGFwc2VBbGxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmFjdGlvbnMuTGlua0VkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZmlsdGVycy5Db21tb25WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmZpbHRlcnMuRXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5maWx0ZXJzLlNlbGVjdEZpbHRlcnNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBJVmlld1BhcnQgZm9yIHRoZSBDb21tb24gTmF2aWdhdG9yIAotICogZnJhbWV3b3JrIGluIHRoZSBFY2xpcHNlIHdvcmtiZW5jaC4gVGhpcyBjbGFzcyBhbHNvIHNlcnZlcwotICogYXMgdGhlIGJhY2tib25lIGZvciBuYXZpZ2F0aW9uYWwgdmlld2Vycy4gVGhlIGZvbGxvd2luZyB0eXBlcwotICogYXJlIHVzZWQgYnkgdGhpcyBjbGFzcyB0byByZW5kZXIgdGhlIENvbW1vbiBOYXZpZ2F0b3I6Ci0gKiA8dWw+Ci0gKiA8bGk+Ci0gKiA8cD4KLSAqIHtAbGluayBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uVmlld2VyfTogVGhlIHZpZXdlcgotICogdGhhdCByZW5kZXJzIHRoZSBleHRlbnNpYmxlIHRyZWUuIENyZWF0ZXMgYW5kIG1hbmFnZXMgdGhlIAotICogbGlmZWN5bGNlIG9mIHRoZSBOYXZpZ2F0b3IgQ29udGVudCBTZXJ2aWNlIChkZXNjcmliZWQgYmVsb3cpLgotICogPC9wPgotICogPC9saT4KLSAqIDxsaT4KLSAqIDxwPgotICoge0BsaW5rIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3JNYW5hZ2VyfTogCi0gKiBIYW5kbGVzIGF1eGlsbGFyeSBmdW5jdGlvbnMsIHN1Y2ggYXMgdXBkYXRpbmcgdGhlIHN0YXR1cyBiYXIsIAotICogcG9wdWxhdGluZyBwb3B1cCBtZW51cywgYW5kIG1hbmFnaW5nIHRoZSBOYXZpZ2F0b3IgQWN0aW9uIAotICogU2VydmljZSAoZGVzY3JpYmVkIGJlbG93KS4gTm90IGV4cGVjdGVkIHRvIGJlIG5lZWRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogPC9saT4KLSAqIDxsaT4KLSAqIDxwPgotICoge0BsaW5rIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlfTogCi0gKiBNYW5hZ2VzIGluc3RhbmNlcyBvZiB7QGxpbmsgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyfXMKLSAqIHByb3ZpZGVkIGJ5IGluZGl2aWR1YWwgZXh0ZW5zaW9ucyBhbmQgY29udGVudCBleHRlbnNpb25zLgotICogPC9wPgotICogPC9saT4KLSAqIDxsaT4KLSAqIDxwPgotICoge0BsaW5rIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2V9OiAKLSAqIE1hbmFnZXMgaW5zdGFuY2VzIG9mIE5hdmlnYXRvciBDb250ZW50IEV4dGVuc2lvbnMuIEluc3RhbmNlcyBhcmUgCi0gKiBjcmVhdGVkIGFzIG5lZWRlZCwgYW5kIGRpc3Bvc2VkIG9mIHVwb24gdGhlIGRpc3Bvc2FsIG9mIHRoZSAKLSAqIE5hdmlnYXRvciBDb250ZW50IFNlcnZpY2UuCi0gKiA8L3A+Ci0gKiA8L2xpPgotICogPC91bD4KLSAqIDxwPgotICogQ2xpZW50cyBhcmUgbm90IGV4cGVjdGVkIHRvIHN1YmNsYXNzIENvbW1vbk5hdmlnYXRvci4gQ2xpZW50cyAKLSAqIHRoYXQgd2lzaCB0byBkZWZpbmUgdGhlaXIgb3duIGN1c3RvbSBleHRlbnNpYmxlIG5hdmlnYXRvciAKLSAqIHZpZXcgbmVlZCB0byBzcGVjaWZ5IGFuIGluc3RhbmNlIG9mIHRoZSA8Yj5vcmcuZWNsaXBzZS51aS52aWV3czwvYj4KLSAqIGV4dGVuc2lvbiBwb2ludDoKLSAqIAotICogPHByZT4gCi0gKiAgICAgICAgJmx0O2V4dGVuc2lvbgotICogICAgICAgIAkJcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkudmlld3MmcXVvdDsmZ3Q7Ci0gKiAgICAgICAgCSZsdDt2aWV3Ci0gKiAgICAgICAgCQluYW1lPSZxdW90O015IEN1c3RvbSBWaWV3JnF1b3Q7Ci0gKiAgICAgICAgCQlpY29uPSZxdW90O3JlbGF0aXZlL3BhdGgvdG8vaWNvbi5naWYmcXVvdDsKLSAqICAgICAgICAJCWNhdGVnb3J5PSZxdW90O29yZy5hY21lLm15Y2F0ZWdvcnkmcXVvdDsKLSAqICAgICAgICAJCWNsYXNzPSZxdW90O29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3ImcXVvdDsKLSAqICAgICAgICAJCWlkPSZxdW90O29yZy5hY21lLk15Q3VzdG9tTmF2aWdhdG9ySUQmcXVvdDsmZ3Q7Ci0gKiAgICAgICAgCSZsdDsvdmlldyZndDsKLSAqICAgICAgICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0gKiAgCi0gKiA8L3ByZT4KLSAqIAotICogPC9wPgotICogPHA+Ci0gKiBJbiB0aGUgZXZlbnQgdGhhdCBhIGNvbnN1bWVyIG9mIHRoZSBDb21tb24gTmF2aWdhdG9yIGRvZXMgbmVlZCB0byBjaGFuZ2UgdGhlIGFjdHVhbCBiZWhhdmlvciwKLSAqIG1ldGhvZHMgYXJlIHByb3ZpZGVkIHRvIG92ZXJyaWRlIHNwZWNpZmljIHBpZWNlcyBvZiBmdW5jdGlvbmFsaXR5LiBFYWNoIG9mIHRoZXNlIG1ldGhvZHMgYmVnaW4KLSAqIHdpdGggPGk+Y3JlYXRlIDwvaT4gYW5kIGV4cGxhaW4gd2hhdCBtb2R1bGFyIGNvbXBvbmVudCB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcuIEVhY2ggb2YKLSAqIHRoZXNlIHBpZWNlcyBtYXkgdGFrZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIENvbW1vbiBWaWV3ZXIgKAotICoge0BsaW5rIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25WaWV3ZXJ9KSBhbmQgaGF2ZSBkZXBlZGVuY2llcyB0byB0aGF0IG9iamVjdCwKLSAqIGJ1dCB0aGUgaW5zdGFuY2Ugb2YgdGhlIENvbW1vbiBWaWV3ZXIgc2hvdWxkIG5ldmVyIGFzc3VtZSBtb3JlIHRoYW4gdGhlIHN0YW5kYXJkIEVjbGlwc2UKLSAqIGludGVyZmFjZXMgd2hlbiB3b3JraW5nIHdpdGggdGhlc2UgY29tcG9uZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2xpZW50cyB0aGF0IHdpc2ggdG8gZXh0ZW5kIHRoZSB2aWV3IG1lbnUgcHJvdmlkZWQgdmlhIHRoZSA8Yj5vcmcuZWNsaXBzZS51aS5wb3B1cE1lbnU8L2I+cyBleHRlbnNpb24KLSAqIG1heSBzcGVjaWZ5IHRoZSB0aGUgcG9wdXBNZW51SWQgc3BlY2lmaWVkIGJ5IDxiPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXI8L2I+IG9mIHRoZWlyCi0gKiB0YXJnZXQgdmlld2VyIGFzIHRoZWlyIHRhcmdldCBtZW51IGlkLgotICogCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+IAotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25OYXZpZ2F0b3IgZXh0ZW5kcyBWaWV3UGFydCBpbXBsZW1lbnRzIElTZXRTZWxlY3Rpb25UYXJnZXQgewotCi0JLyoqCi0JICogPHA+Ci0JICogVXNlZCB0byB0cmFjayBjaGFuZ2VzIHRvIHRoZSB7QGxpbmsgI2lzTGlua2luZ0VuYWJsZWR9Jm5ic3A7cHJvcGVydHkuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTX0xJTktJTkdfRU5BQkxFRF9QUk9QRVJUWSA9IDE7Ci0KLQlwcml2YXRlIENvbW1vblZpZXdlciBjb21tb25WaWV3ZXI7Ci0JcHJpdmF0ZSBDb21tb25OYXZpZ2F0b3JNYW5hZ2VyIGNvbW1vbk1hbmFnZXI7Ci0JcHJpdmF0ZSBBY3Rpb25Hcm91cCBjb21tb25BY3Rpb25Hcm91cDsKLQotCXByaXZhdGUgSU1lbWVudG8gbWVtZW50bzsKLQlwcml2YXRlIGJvb2xlYW4gaXNMaW5raW5nRW5hYmxlZCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIExJTktJTkdfRU5BQkxFRCA9ICJDb21tb25OYXZpZ2F0b3IuTElOS0lOR19FTkFCTEVEIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb21tb25OYXZpZ2F0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIHRoZSBDb21tb25WaWV3ZXIgcGFydCBjb250cm9sIGFuZCBzZXR1cCB0aGUgZGVmYXVsdCBwcm92aWRlcnMgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGFQYXJlbnQpIHsKLQotCQljb21tb25WaWV3ZXIgPSBjcmVhdGVDb21tb25WaWV3ZXIoYVBhcmVudCk7Ci0JCWNvbW1vblZpZXdlci5hZGRGaWx0ZXIoY3JlYXRlQ29tbW9uRmlsdGVyKGNvbW1vblZpZXdlcikpOwotCQljb21tb25WaWV3ZXIuc2V0U29ydGVyKGNyZWF0ZUNvbW1vblNvcnRlcihjb21tb25WaWV3ZXIpKTsKLSAKLQotCQkvKiBtYWtlIHN1cmUgaW5wdXQgaXMgc2V0IGFmdGVyIHNvcnRlcnMgYW5kIGZpbHRlcnMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVmcmVzaGVzICovCi0JCWNvbW1vblZpZXdlci5zZXRJbnB1dChnZXRJbml0aWFsSW5wdXQoKSk7Ci0JCWNvbW1vblZpZXdlci5nZXRDb250cm9sKCkuYWRkRGlzcG9zZUxpc3RlbmVyKGNyZWF0ZURpc3Bvc2VMaXN0ZW5lcigpKTsKLQotCQlnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIoY29tbW9uVmlld2VyKTsKLQotCi0JCXVwZGF0ZVRpdGxlKCk7Ci0KLQkJLyoKLQkJICogQ3JlYXRlIHRoZSBDb21tb25OYXZpZ2F0b3JNYW5hZ2VyIGxhc3QgYmVjYXVzZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgb2YgdGhlCi0JCSAqIENvbW1vbk5hdmlnYXRvciBpcyByZXF1aXJlZCBmb3IgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBDb21tb25OYXZpZ2F0b3JNYW5hZ2VyCi0JCSAqLwotCQljb21tb25NYW5hZ2VyID0gY3JlYXRlQ29tbW9uTWFuYWdlcigpOwotCQlpZiAobWVtZW50byAhPSBudWxsKSB7Ci0JCQljb21tb25NYW5hZ2VyLnJlc3RvcmVTdGF0ZShtZW1lbnRvKTsKLQkJCWNvbW1vblZpZXdlci5nZXROYXZpZ2F0b3JDb250ZW50U2VydmljZSgpLnJlc3RvcmVTdGF0ZShtZW1lbnRvKTsKLQkJfQotCi0JCWNvbW1vbkFjdGlvbkdyb3VwID0gY3JlYXRlQ29tbW9uQWN0aW9uR3JvdXAoKTsKLQkJY29tbW9uQWN0aW9uR3JvdXAuZmlsbEFjdGlvbkJhcnMoZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkpOwotCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIERpc3Bvc2VMaXN0ZW5lciBpcyBub3RpZmllZCBvZiB0aGUgZGlzcG9zYWwgb2YgdGhlCi0JICogRWNsaXBzZSB2aWV3IHBhcnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjb21tb25NYW5hZ2VyICE9IG51bGwpCi0JCQljb21tb25NYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZSwgb3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgYVNpdGUsIElNZW1lbnRvIGFNZW1lbnRvKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KGFTaXRlLCBhTWVtZW50byk7Ci0JCW1lbWVudG8gPSBhTWVtZW50bzsKLQkJaWYgKG1lbWVudG8gIT0gbnVsbCkgewotCQkJSW50ZWdlciBsaW5raW5nRW5hYmxlZEludGVnZXIgPSBtZW1lbnRvLmdldEludGVnZXIoTElOS0lOR19FTkFCTEVEKTsKLQkJCXNldExpbmtpbmdFbmFibGVkKCgobGlua2luZ0VuYWJsZWRJbnRlZ2VyICE9IG51bGwpID8gbGlua2luZ0VuYWJsZWRJbnRlZ2VyLmludFZhbHVlKCkgPT0gMSA6IGZhbHNlKSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIAotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzYXZlU3RhdGUob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0JCWFNZW1lbnRvLnB1dEludGVnZXIoTElOS0lOR19FTkFCTEVELCAoaXNMaW5raW5nRW5hYmxlZCkgPyAxIDogMCk7Ci0JCXN1cGVyLnNhdmVTdGF0ZShhTWVtZW50byk7Ci0JCWNvbW1vbk1hbmFnZXIuc2F2ZVN0YXRlKGFNZW1lbnRvKTsKLQkJY29tbW9uVmlld2VyLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCkuc2F2ZVN0YXRlKGFNZW1lbnRvKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBGb3JjZSB0aGUgd29ya2JlbmNoIHRvIGZvY3VzIG9uIHRoZSBDb21tb24gTmF2aWdhdG9yIHRyZWUuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKGNvbW1vblZpZXdlciAhPSBudWxsKQotCQkJY29tbW9uVmlld2VyLmdldFRyZWUoKS5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSBDb21tb24gTmF2aWdhdG9yIHRyZWUsIGFuZCBleHBhbmQgbm9kZXMgaWYgbmVjZXNzYXJ5LiBVc2UgY2F1dGlvbgotCSAqIHdoZW4gaW52b2tpbmcgdGhpcyBtZXRob2QgYXMgaXQgY2FuIGNhdXNlIE5hdmlnYXRvciBDb250ZW50IEV4dGVuc2lvbnMgdG8gbG9hZCwgdGh1cyBjYXVzaW5nCi0JICogcGx1Z2luIGFjdGl2YXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0I3NlbGVjdFJldmVhbChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0UmV2ZWFsKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChjb21tb25WaWV3ZXIgIT0gbnVsbCkKLQkJCWNvbW1vblZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBMaW5raW5nIGlzIGhhbmRsZWQgYnkKLQkgKiB7QGxpbmsgTGlua0VkaXRvckFjdGlvbn0sIHdoaWNoCi0JICogbGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUge0BsaW5rIENvbW1vbk5hdmlnYXRvciNJU19MSU5LSU5HX0VOQUJMRURfUFJPUEVSVFl9LiBDdXN0b20KLQkgKiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eSwgbmVlZCB0byBvdmVycmlkZSB0aGUgYWN0aW9uIHVzZWQgYnkKLQkgKiBDb21tb25OYXZpZ2F0b3JBY3Rpb25Hcm91cCBhbmQgbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBhYm92ZSBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9FbmFibGVMaW5raW5nCi0JICogICAgICAgICAgICBUcnVlIGVuYWJsZXMgbGlua2luZyB0aGUgY3VycmVudCBzZWxlY3Rpb24gd2l0aCBvcGVuIGVkaXRvcnMKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRMaW5raW5nRW5hYmxlZChib29sZWFuIHRvRW5hYmxlTGlua2luZykgewotCQlpc0xpbmtpbmdFbmFibGVkID0gdG9FbmFibGVMaW5raW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoSVNfTElOS0lOR19FTkFCTEVEX1BST1BFUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFdoZXRoZXIgbGlua2luZyB0aGUgY3VycmVudCBzZWxlY3Rpb24gd2l0aCBvcGVuIGVkaXRvcnMgaXMgZW5hYmxlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0xpbmtpbmdFbmFibGVkKCkgewotCQlyZXR1cm4gaXNMaW5raW5nRW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGNvbW1vblZpZXdlciB1c2VkIGJ5IHRoZSBjdXJyZW50IENvbW1vbk5hdmlnYXRvci4gVGhlIGZpZWxkIHdpbGwgbm90Ci0JICogYmUgdmFsaWQgdW50aWwgYWZ0ZXIge0BsaW5rICNpbml0KElWaWV3U2l0ZSwgSU1lbWVudG8pfSZuYnNwO2hhcyBiZWVuIGNhbGxlZCBieSB0aGUgV29ya2JlbmNoLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIENvbW1vbk5hdmlnYXRvciNjcmVhdGVDb21tb25WaWV3ZXIoQ29tcG9zaXRlKQotCSAqIEByZXR1cm4gVGhlIChhbHJlYWR5IGNyZWF0ZWQpIGluc3RhbmNlIG9mIENvbW1vbiBWaWV3ZXIuCi0JICovCi0JcHVibGljIENvbW1vblZpZXdlciBnZXRDb21tb25WaWV3ZXIoKSB7Ci0JCXJldHVybiBjb21tb25WaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUaGUgTmF2aWdhdG9yIENvbnRlbnQgU2VydmljZSB3aGljaCBwb3B1bGF0ZXMgdGhpcyBpbnN0YW5jZSBvZiBDb21tb24gTmF2aWdhdG9yCi0JICovCi0JcHVibGljIElOYXZpZ2F0b3JDb250ZW50U2VydmljZSBnZXROYXZpZ2F0b3JDb250ZW50U2VydmljZSgpIHsKLQkJcmV0dXJuIGdldENvbW1vblZpZXdlcigpLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmKGFkYXB0ZXIgPT0gQ29tbW9uVmlld2VyLmNsYXNzKQotCQkJcmV0dXJuIGdldENvbW1vblZpZXdlcigpOwotCQllbHNlIGlmKGFkYXB0ZXIgPT0gTmF2aWdhdG9yQ29udGVudFNlcnZpY2UuY2xhc3MpCi0JCQlyZXR1cm4gZ2V0Q29tbW9uVmlld2VyKCkuZ2V0TmF2aWdhdG9yQ29udGVudFNlcnZpY2UoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCQotCi0JLyoqCi0JICogQHJldHVybiBUaGUgTmF2aWdhdG9yIENvbnRlbnQgU2VydmljZSB3aGljaCBwb3B1bGF0ZXMgdGhpcyBpbnN0YW5jZSBvZiBDb21tb24gTmF2aWdhdG9yCi0JICovCi0JcHVibGljIE5hdmlnYXRvckFjdGlvblNlcnZpY2UgZ2V0TmF2aWdhdG9yQWN0aW9uU2VydmljZSgpIHsKLQkJcmV0dXJuIGNvbW1vbk1hbmFnZXIuZ2V0TmF2aWdhdG9yQWN0aW9uU2VydmljZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnN0cnVjdHMgYW5kIHJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIENvbW1vblZpZXdlcn0uIFRoZSBJRCBvZiB0aGUgRWNsaXBzZSB2aWV3IHBhcnQKLQkgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2aWV3ZXIuIFRoZSBJRCBpcyBpbXBvcnRhbnQgYXMgc29tZSBleHRlbnNpb25zIGluZGljYXRlIHRoZXkKLQkgKiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggYSBwYXJ0aWN1bGFyIHZpZXdlciBJRC4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gYVBhcmVudAotCSAqICAgICAgICAgICAgQSBjb21wb3NpdGUgcGFyZW50IHRvIGNvbnRhaW4gdGhlIENvbW1vbiBWaWV3ZXIKLQkgKiBAcmV0dXJuIEFuIGluaXRpYWxpemVkIGluc3RhbmNlIG9mIENvbW1vblZpZXdlcgotCSAqLwotCXByb3RlY3RlZCBDb21tb25WaWV3ZXIgY3JlYXRlQ29tbW9uVmlld2VyKENvbXBvc2l0ZSBhUGFyZW50KSB7Ci0JCUNvbW1vblZpZXdlciBhVmlld2VyID0gbmV3IENvbW1vblZpZXdlcihnZXRWaWV3U2l0ZSgpLmdldElkKCksIGFQYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWluaXRMaXN0ZW5lcnMoYVZpZXdlcik7Ci0JCWFWaWV3ZXIuZ2V0TmF2aWdhdG9yQ29udGVudFNlcnZpY2UoKS5yZXN0b3JlU3RhdGUobWVtZW50byk7Ci0JCXJldHVybiBhVmlld2VyOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIGxpc3RlbmVycyB0byB0aGUgQ29tbW9uIFZpZXdlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlcgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TGlzdGVuZXJzKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0KLQkJdmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJCi0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaGFuZGxlRG91YmxlQ2xpY2soZXZlbnQpOwotCQkJCX0gY2F0Y2goUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCQlyZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbkV2ZW50Ci0JICogICAgICAgICAgICBTdXBwbGllZCBieSB0aGUgRG91YmxlQ2xpY2sgbGlzdGVuZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBhbkV2ZW50KSB7Ci0JCQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFuRXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCVRyZWVWaWV3ZXIgdmlld2VyID0gZ2V0Q29tbW9uVmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIuaXNFeHBhbmRhYmxlKGVsZW1lbnQpKSB7Ci0JCQl2aWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShlbGVtZW50LCAhdmlld2VyLmdldEV4cGFuZGVkU3RhdGUoZWxlbWVudCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIENvbW1vbiBOYXZpZ2F0b3IgTWFuYWdlciBoYW5kbGVzIHRoZSBzZXR1cCBvZiB0aGUgQ29tbW9uIE5hdmlnYXRvciBNZW51LCBtYW5hZ2VzIHVwZGF0ZXMKLQkgKiB0byB0aGUgQWN0aW9uQmFycyBmcm9tCi0JICoge0BsaW5rIElDb21tb25BY3Rpb25Qcm92aWRlcn0mbmJzcDsKLQkgKiBleHRlbnNpb25zIGFzIHRoZSB1c2VyJ3Mgc2VsZWN0aW9uIGNoYW5nZXMsIGFuZCBhbHNvIHVwZGF0ZXMgdGhlIHN0YXR1cyBiYXIgYmFzZWQgb24gdGhlCi0JICogY3VycmVudCBzZWxlY3Rpb24uCi0JICogCi0JICogQHJldHVybiBUaGUgQ29tbW9uIE5hdmlnYXRvciBNYW5hZ2VyIGNsYXNzIHdoaWNoIGhhbmRsZXMgbWVudSBwb3B1bGF0aW9uIGFuZCBBY3Rpb25CYXJzCi0JICovCi0JcHJvdGVjdGVkIENvbW1vbk5hdmlnYXRvck1hbmFnZXIgY3JlYXRlQ29tbW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIG5ldyBDb21tb25OYXZpZ2F0b3JNYW5hZ2VyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBBY3Rpb25Hcm91cCBpcyB1c2VkIHRvIHBvcHVsYXRlIHRoZSBBY3Rpb25CYXJzIG9mIENvbW1vbiBOYXZpZ2F0b3IgVmlldyBQYXJ0LCBhbmQgdGhlCi0JICogcmV0dXJuZWQgaW1wbGVtZW50YXRpb24gd2lsbCBoYXZlIGFuIG9wcG9ydHVuaXR5IHRvIGZpbGwgdGhlIEFjdGlvbkJhcnMgb2YgdGhlIHZpZXcgYXMgc29vbgotCSAqIGFzIGl0IGlzIGNyZWF0ZWQuICh7QGxpbmsgQWN0aW9uR3JvdXAjZmlsbEFjdGlvbkJhcnMob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpfS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQ29tbW9uTmF2aWdhdG9yQWN0aW9uR3JvdXB9Jm5ic3A7d2hpY2gKLQkgKiB3aWxsIGFkZCB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0JICogPHVsPgotCSAqIDxsaT4KLQkgKiA8cD4KLQkgKiBMaW5rIHdpdGggZWRpdG9yIHN1cHBvcnQgKAotCSAqIHtAbGluayBMaW5rRWRpdG9yQWN0aW9ufSkuIEFsbG93cyB0aGUKLQkgKiB1c2VyIHRvIHRvZ2dsaW5nIGxpbmtpbmcgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHdpdGggdGhlIGFjdGl2ZSBlZGl0b3JzLgotCSAqIDwvcD4KLQkgKiA8bGk+Ci0JICogPHA+Ci0JICogQ29sbGFwc2UgYWxsICgKLQkgKiB7QGxpbmsgQ29sbGFwc2VBbGxBY3Rpb259KS4gQ29sbGFwc2VzCi0JICogYWxsIGV4cGFuZGVkIG5vZGVzLgotCSAqIDwvcD4KLQkgKiA8bGk+Ci0JICogPHA+Ci0JICogU2VsZWN0IEZpbHRlcnMgKAotCSAqIHtAbGluayBTZWxlY3RGaWx0ZXJzQWN0aW9ufSkuCi0JICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSAiU2VsZWN0IEZpbHRlcnMiIGRpYWxvZyB0aGF0IGFsbG93cyB1c2VycyB0byBlbmFibGUvZGlzYWJsZSBmaWx0ZXJzCi0JICogYW5kIGFsc28gdGhlIENvbnRlbnQgRXh0ZW5zaW9uIGFjdGl2YXRpb25zLgotCSAqIDwvcD4KLQkgKiA8L3VsPgotCSAqIAotCSAqIEByZXR1cm4gVGhlIEFjdGlvbiBHcm91cCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIENvbW1vbiBOYXZpZ2F0b3IgVmlldyBQYXJ0LgotCSAqLwotCXByb3RlY3RlZCBBY3Rpb25Hcm91cCBjcmVhdGVDb21tb25BY3Rpb25Hcm91cCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tb25OYXZpZ2F0b3JBY3Rpb25Hcm91cCh0aGlzLCBjb21tb25WaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhvb2tzIGludG8gdGhlIGV4dGVuc2libGUgbmF2aWdhdG9yJ3MgZnJhbWV3b3JrIGZvciBleHRlbnNpb25zIHRvCi0JICogcHJvdmlkZSBmaWx0ZXJzLiBDdXN0b20gaW1wbGVtZW50YXRpb25zIHdpbGwgcHJvYmFibHkgcmVxdWlyZSBzb21lIGNoYW5nZXMgdG8KLQkgKiB7QGxpbmsgU2VsZWN0RmlsdGVyc0FjdGlvbn0mbmJzcDthcwotCSAqIHdlbGwuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgQ29tbW9uVmlld2VyRmlsdGVyCi0JICogQHNlZSBFeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIKLQkgKiBAcmV0dXJuIFRoZSBWaWV3ZXJGaWx0ZXIgdG8gcHJvdmlkZSB0aGUgZGVzaXJlZCBleHRlbnNpYmlsaXR5IGZvciBGaWx0ZXJzCi0JICovCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBjcmVhdGVDb21tb25GaWx0ZXIoQ29tbW9uVmlld2VyIGFWaWV3ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb21tb25WaWV3ZXJGaWx0ZXIoYVZpZXdlcik7Ci0JfQotCi0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kIGNyZWF0ZXMgYSBiYXNpYyBzb3J0ZXIgZm9yIHRoZSBNMyByZWxlYXNlLiBUaGlzIGZ1bmN0aW9uYWxpdHkgd2lsbAotCSAqIGNoYW5nZSBzdWJzdGFudGlhbGx5IGZvciB0aGUgTTQgcmVsZWFzZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBUaGUgVmlld2VyU29ydGVyIHRvIHNvcnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBDb21tb24gVmlld2VyCi0JICovCi0JcHJvdGVjdGVkIFZpZXdlclNvcnRlciBjcmVhdGVDb21tb25Tb3J0ZXIoQ29tbW9uVmlld2VyIGFWaWV3ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb21tb25Tb3J0ZXIoYVZpZXdlci5nZXROYXZpZ2F0b3JDb250ZW50U2VydmljZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEEgbGlzdGVuZXIgdG8gdHJhY2sgdGhlIGRpc3Bvc2FsIG9mIHRoZSBFY2xpcHNlIHZpZXcgcGFydCBpbiBvcmRlciB0byBkaXNwb3NlIG9mIHRoZQotCSAqICAgICAgICAgZnJhbWV3b3JrIHN0YXRlLgotCSAqLwotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgY3JlYXRlRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lciN3aWRnZXREaXNwb3NlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUaGUgaW5pdGlhbCBpbnB1dCBmb3IgdGhlIHZpZXdlci4gRGVmYXVsdHMgdG8gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRJbnB1dCgpCi0JICovCi0JcHJvdGVjdGVkIElBZGFwdGFibGUgZ2V0SW5pdGlhbElucHV0KCkgewotCQlyZXR1cm4gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRJbnB1dCgpOwotCX0KLQotCi0JLyoqCi0JICogPHA+Ci0JICogVXBkYXRlcyB0aGUgdGl0bGUgdGV4dCBhbmQgdGl0bGUgdG9vbCB0aXAuIENhbGxlZCB3aGVuZXZlciB0aGUgaW5wdXQgb2YgdGhlIHZpZXdlciBjaGFuZ2VzLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUaXRsZSgpIHsKLQotCQlpZiAoY29tbW9uVmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJT2JqZWN0IGlucHV0ID0gY29tbW9uVmlld2VyLmdldElucHV0KCk7Ci0JCVN0cmluZyB2aWV3TmFtZSA9IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQgCi0JCS8vIElXb3JraW5nU2V0IHdvcmtpbmdTZXQgPSB3b3JraW5nU2V0RmlsdGVyLmdldFdvcmtpbmdTZXQoKTsKLQotCQlpZiAoaW5wdXQgPT0gbnVsbCkgewotCQkJc2V0UGFydE5hbWUodmlld05hbWUpOwotCQkJc2V0VGl0bGVUb29sVGlwKCIiKTsgLy8kTk9OLU5MUy0xJCAKLQkJfSBlbHNlIHsJCQkKLQkJCVN0cmluZyBpbnB1dFRvb2xUaXAgPSBnZXRGcmFtZVRvb2xUaXBUZXh0KGlucHV0KTsKLQkJCQotCQkJc2V0UGFydE5hbWUodmlld05hbWUpOwotCQkJc2V0VGl0bGVUb29sVGlwKGlucHV0VG9vbFRpcCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSB0b29sIHRpcCB0ZXh0IGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gVXNlZCBhcyB0aGUgdG9vbCB0aXAgdGV4dCBmb3IgdGhlIGN1cnJlbnQKLQkgKiBmcmFtZSwgYW5kIGZvciB0aGUgdmlldyB0aXRsZSB0b29sdGlwLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZyYW1lVG9vbFRpcFRleHQoT2JqZWN0IGFuRWxlbWVudCkgewotCQlpZiAoY29tbW9uVmlld2VyICE9IG51bGwpCi0JCQlyZXR1cm4gKChJTGFiZWxQcm92aWRlcikgY29tbW9uVmlld2VyLmdldExhYmVsUHJvdmlkZXIoKSkuZ2V0VGV4dChhbkVsZW1lbnQpOwotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvQ29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9Db21tb25OYXZpZ2F0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDUyMjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvQ29tbW9uTmF2aWdhdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklPcGVuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuT3BlbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlJldGFyZ2V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5Db21tb25OYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yQ29udGVudFNlcnZpY2VEZXNjcmlwdGlvblByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogTWFuYWdlcyB0aGUgbm9uLXZpZXdlciByZXNwb25zaWJpbGl0aWVzIG9mIHRoZSBDb21tb24gTmF2aWdhdG9yIFZpZXcgUGFydCwKLSAqIGluY2x1ZGluZyB0aGUgZGlzcGxheSBhbmQgcG9wdWxhdGlvbiBvZiB0aGUgY29udGV4dCBtZW51IGFuZCB0aGUgcmVnaXN0cmF0aW9uCi0gKiBvZiBleHRlbnNpb25zIGZvciBvcGVuaW5nIGNvbnRlbnQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMKLSAqIDwvcD4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tbW9uTmF2aWdhdG9yTWFuYWdlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBDb21tb25OYXZpZ2F0b3IgY29tbW9uTmF2aWdhdG9yOwotCi0JcHJpdmF0ZSBmaW5hbCBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgY29udGVudFNlcnZpY2U7Ci0KLQlwcml2YXRlIE5hdmlnYXRvckFjdGlvblNlcnZpY2UgYWN0aW9uU2VydmljZTsKLQotCXByaXZhdGUgZmluYWwgSURlc2NyaXB0aW9uUHJvdmlkZXIgY29tbW9uRGVzY3JpcHRpb25Qcm92aWRlcjsKLQotCXByaXZhdGUgZmluYWwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyOwotCi0JcHJpdmF0ZSBmaW5hbCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkcyBsaXN0ZW5lcnMgdG8gYU5hdmlnYXRvciB0byBsaXN0ZW4gZm9yIHNlbGVjdGlvbiBjaGFuZ2VzIGFuZCByZXNwb25kCi0JICogdG8gbW91c2UgZXZlbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU5hdmlnYXRvcgotCSAqICAgICAgICAgICAgVGhlIENvbW1vbk5hdmlnYXRvciBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuIFJlcXVpcmVzIGEgbm9uLW51bGwKLQkgKiAgICAgICAgICAgIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBDb21tb25OYXZpZ2F0b3JNYW5hZ2VyKENvbW1vbk5hdmlnYXRvciBhTmF2aWdhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbW1vbk5hdmlnYXRvciA9IGFOYXZpZ2F0b3I7Ci0JCWNvbnRlbnRTZXJ2aWNlID0gY29tbW9uTmF2aWdhdG9yLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCk7Ci0JCXN0YXR1c0xpbmVNYW5hZ2VyID0gY29tbW9uTmF2aWdhdG9yLmdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpCi0JCQkJLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCWNvbW1vbkRlc2NyaXB0aW9uUHJvdmlkZXIgPSBuZXcgTmF2aWdhdG9yQ29udGVudFNlcnZpY2VEZXNjcmlwdGlvblByb3ZpZGVyKAotCQkJCWNvbnRlbnRTZXJ2aWNlKTsKLQkJbGFiZWxQcm92aWRlciA9IChJTGFiZWxQcm92aWRlcikgY29tbW9uTmF2aWdhdG9yLmdldENvbW1vblZpZXdlcigpCi0JCQkJLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQljb21tb25OYXZpZ2F0b3IuZ2V0Q29tbW9uVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl1cGRhdGVTdGF0dXNCYXIoY29tbW9uTmF2aWdhdG9yLmdldENvbW1vblZpZXdlcigpLmdldFNlbGVjdGlvbigpKTsKLQkJYWN0aW9uU2VydmljZSA9IG5ldyBOYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlKGNvbW1vbk5hdmlnYXRvciwKLQkJCQljb21tb25OYXZpZ2F0b3IuZ2V0Q29tbW9uVmlld2VyKCksIGNvbnRlbnRTZXJ2aWNlKTsKLQkJLy8gY29tbW9uTmF2aWdhdG9yLmdldENvbW1vblZpZXdlcigpLmFkZE9wZW5MaXN0ZW5lcihjb21tb25PcGVuU2VydmljZSk7Ci0JCWluaXRDb250ZXh0TWVudSgpOwotCQlpbml0Vmlld01lbnUoKTsKLQotCQlmaW5hbCBSZXRhcmdldEFjdGlvbiBvcGVuQWN0aW9uID0gbmV3IFJldGFyZ2V0QWN0aW9uKAotCQkJCUlDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTiwKLQkJCQlDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5PcGVuX2FjdGlvbl9sYWJlbCk7Ci0JCWNvbW1vbk5hdmlnYXRvci5nZXRWaWV3U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIob3BlbkFjdGlvbik7Ci0JCW9wZW5BY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTik7Ci0KLQkJY29tbW9uTmF2aWdhdG9yLmdldENvbW1vblZpZXdlcigpLmFkZE9wZW5MaXN0ZW5lcihuZXcgSU9wZW5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oT3BlbkV2ZW50IGV2ZW50KSB7Ci0JCQkJb3BlbkFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ2FsbGVkIGJ5IHtAbGluayBDb21tb25OYXZpZ2F0b3J9IHdoZW4gdGhlIFZpZXcgUGFydCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQljb21tb25OYXZpZ2F0b3IuZ2V0Q29tbW9uVmlld2VyKCkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICBhY3Rpb25TZXJ2aWNlLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYW5FdmVudAotCSAqICAgICAgICAgICAgQW4gZXZlbnQgaW5kaWNhdGluZyB0aGUgY3VycmVudCBzZWxlY3Rpb24gb2YgdGhlCi0JICogICAgICAgICAgICB7QGxpbmsgQ29tbW9uVmlld2VyfQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgYW5FdmVudCkgewotCQl1cGRhdGVTdGF0dXNCYXIoYW5FdmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCWlmIChhbkV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFuRXZlbnQKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJYWN0aW9uU2VydmljZS5zZXRDb250ZXh0KG5ldyBBY3Rpb25Db250ZXh0KHN0cnVjdHVyZWRTZWxlY3Rpb24pKTsKLQkJCWFjdGlvblNlcnZpY2UuZmlsbEFjdGlvbkJhcnMoY29tbW9uTmF2aWdhdG9yLmdldFZpZXdTaXRlKCkKLQkJCQkJLmdldEFjdGlvbkJhcnMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYU1lbWVudG8KLQkgKiAgICAgICAgICAgIFVzZWQgdG8gcmVzdG9yZSBzdGF0ZSBvZiBhY3Rpb24gZXh0ZW5zaW9ucyB2aWEgdGhlCi0JICogICAgICAgICAgICB7QGxpbmsgTmF2aWdhdG9yQWN0aW9uU2VydmljZX0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0JCWFjdGlvblNlcnZpY2UucmVzdG9yZVN0YXRlKGFNZW1lbnRvKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYU1lbWVudG8KLQkgKiAgICAgICAgICAgIFVzZWQgdG8gc2F2ZSBzdGF0ZSBvZiBhY3Rpb24gZXh0ZW5zaW9ucyB2aWEgdGhlCi0JICogICAgICAgICAgICB7QGxpbmsgTmF2aWdhdG9yQWN0aW9uU2VydmljZX0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0JCWFjdGlvblNlcnZpY2Uuc2F2ZVN0YXRlKGFNZW1lbnRvKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBGaWxscyBhTWVudU1hbmFnZXIgd2l0aCBtZW51IGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUKLQkgKiB7QGxpbmsgTmF2aWdhdG9yQWN0aW9uU2VydmljZX0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTWVudU1hbmFnZXIKLQkgKiAgICAgICAgICAgIEEgcG9wdXAgbWVudQotCSAqIEBzZWUgTmF2aWdhdG9yQWN0aW9uU2VydmljZSNmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBhTWVudU1hbmFnZXIpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBjb21tb25OYXZpZ2F0b3IuZ2V0Q29tbW9uVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWFjdGlvblNlcnZpY2Uuc2V0Q29udGV4dChuZXcgQWN0aW9uQ29udGV4dChzZWxlY3Rpb24pKTsKLQkJYWN0aW9uU2VydmljZS5maWxsQ29udGV4dE1lbnUoYU1lbnVNYW5hZ2VyKTsgCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogSW5pdGlhbGl6ZXMgYW5kIHJlZ2lzdGVycyB0aGUgY29udGV4dCBtZW51LgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGV4dE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoY29udGVudFNlcnZpY2UKLQkJCQkuZ2V0Vmlld2VyRGVzY3JpcHRvcigpLmdldFBvcHVwTWVudUlkKCkpOwotCQltZW51TWdyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJbWVudU1nci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCWZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLQkJCX0KLQkJfSk7Ci0JCVRyZWVWaWV3ZXIgY29tbW9uVmlld2VyID0gY29tbW9uTmF2aWdhdG9yLmdldENvbW1vblZpZXdlcigpOwotCQlNZW51IG1lbnUgPSBtZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KGNvbW1vblZpZXdlci5nZXRUcmVlKCkpOwotCi0JCWNvbW1vblZpZXdlci5nZXRUcmVlKCkuc2V0TWVudShtZW51KTsgIAotCQkKLQkJYWN0aW9uU2VydmljZS5wcmVwYXJlTWVudUZvclBsYXRmb3JtQ29udHJpYnV0aW9ucyhtZW51TWdyLCBjb21tb25WaWV3ZXIsIGZhbHNlKTsKLQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFZpZXdNZW51KCkgewotCQlJTWVudU1hbmFnZXIgdmlld01lbnUgPSBjb21tb25OYXZpZ2F0b3IuZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkKLQkJCQkuZ2V0TWVudU1hbmFnZXIoKTsKLQkJdmlld01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJdmlld01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMKLQkJCQkrICItZW5kIikpOy8vJE5PTi1OTFMtMSQJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFTZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBmcm9tIHRoZSB7QGxpbmsgQ29tbW9uVmlld2VyfQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1c0JhcihJU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQotCQlJbWFnZSBpbWcgPSBudWxsOwotCQlpZiAoYVNlbGVjdGlvbiAhPSBudWxsICYmICFhU2VsZWN0aW9uLmlzRW1wdHkoKQotCQkJCSYmIGFTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCWltZyA9IGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgYVNlbGVjdGlvbikKLQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKTsKLQotCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGltZywgY29tbW9uRGVzY3JpcHRpb25Qcm92aWRlcgotCQkJCS5nZXREZXNjcmlwdGlvbihhU2VsZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgYWN0aW9uIHNlcnZpY2UgdXNlZCBieSB0aGlzIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yQWN0aW9uU2VydmljZSBnZXROYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlKCkgewotCQlyZXR1cm4gYWN0aW9uU2VydmljZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvQ29tbW9uVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0NvbW1vblZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2QyNzY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvQ29tbW9uVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQuQ29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBsdWdpblRyYW5zZmVyOwotCi0vKioKLSAqIDxwPgotICogUHJvdmlkZXMgdGhlIFRyZWUgVmlld2VyIGZvciB0aGUgQ29tbW9uIE5hdmlnYXRvci4gQ29udGVudCBhbmQgbGFiZWxzIGFyZQotICogcHJvdmlkZWQgYnkgYW4gaW5zdGFuY2Ugb2YKLSAqIHtAbGluayBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2V9Jm5ic3A7Ci0gKiB3aGljaCB1c2VzIHRoZSBJRCBzdXBwbGllZCBpbiB0aGUgY29uc3RydWN0b3IKLSAqIHtAbGluayBDb21tb25WaWV3ZXIjQ29tbW9uVmlld2VyKFN0cmluZywgQ29tcG9zaXRlLCBpbnQpfSBvciB0aHJvdWdoIAotICoge0BsaW5rIE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlRmFjdG9yeSNjcmVhdGVDb250ZW50U2VydmljZShTdHJpbmcsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcil9LgotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25WaWV3ZXIgZXh0ZW5kcyBUcmVlVmlld2VyIHsKLQotCXByaXZhdGUgZmluYWwgTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgY29udGVudFNlcnZpY2U7Ci0gCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RydWN0cyB0aGUgVHJlZSBWaWV3ZXIgZm9yIHRoZSBDb21tb24gTmF2aWdhdG9yIGFuZCB0aGUgY29ycmVzcG9uZGluZwotCSAqIE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLiBUaGUgTmF2aWdhdG9yQ29udGVudFNlcnZpY2Ugd2lsbCBwcm92aWRlIHRoZQotCSAqIENvbnRlbnQgUHJvdmlkZXIgYW5kIExhYmVsIFByb3ZpZGVyIC0tIHRoZXNlIG5lZWQgbm90IGJlIHN1cHBsaWVkIGJ5Ci0JICogY2xpZW50cy4KLQkgKiA8cD4KLQkgKiBGb3IgdGhlIHZhbGlkIGJpdHMgdG8gc3VwcGx5IGluIHRoZSBzdHlsZSBtYXNrIChhU3R5bGUpLCBzZWUKLQkgKiBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGJ5IHtAbGluayBUcmVlVmlld2VyfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFWaWV3ZXJJZAotCSAqICAgICAgICAgICAgQW4gaWQgdGllZCB0byB0aGUgZXh0ZW5zaW9ucyB0aGF0IGlzIHVzZWQgdG8gZm9jdXMgc3BlY2lmaWMKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgdG8gYSBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoZSBDb21tb24gTmF2aWdhdG9yCi0JICogQHBhcmFtIGFQYXJlbnQKLQkgKiAgICAgICAgICAgIEEgQ29tcG9zaXRlIHBhcmVudCB0byBjb250YWluIHRoZSBhY3R1YWwgU1dUIHdpZGdldAotCSAqIEBwYXJhbSBhU3R5bGUKLQkgKiAgICAgICAgICAgIEEgc3R5bGUgbWFzayB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIFRyZWVWaWV3ZXIKLQkgKiAgICAgICAgICAgIENvbXBvc2l0ZS4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uVmlld2VyKFN0cmluZyBhVmlld2VySWQsIENvbXBvc2l0ZSBhUGFyZW50LCBpbnQgYVN0eWxlKSB7Ci0JCXN1cGVyKGFQYXJlbnQsIGFTdHlsZSk7Ci0JCWNvbnRlbnRTZXJ2aWNlID0gbmV3IE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKGFWaWV3ZXJJZCwgdGhpcyk7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJbml0aWFsaXplcyB0aGUgY29udGVudCBwcm92aWRlciwgbGFiZWwgcHJvdmlkZXIsIGFuZCBkcmFnIGFuZCBkcm9wCi0JICogc3VwcG9ydC4gU2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkgY2xpZW50cyAtLSB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4KLQkgKiB0aGUgY29uc3RydWN0b3IgaXMgaW52b2tlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRTZXJ2aWNlLmNyZWF0ZUNvbW1vbkNvbnRlbnRQcm92aWRlcigpKTsKLQkJRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIgZGVjb3JhdGluZ1Byb3ZpZGVyID0gbmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKAotCQkJCWNvbnRlbnRTZXJ2aWNlLmNyZWF0ZUNvbW1vbkxhYmVsUHJvdmlkZXIoKSwgUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKQotCQkJCQkJLmdldExhYmVsRGVjb3JhdG9yKCkpOwotCQlzZXRMYWJlbFByb3ZpZGVyKGRlY29yYXRpbmdQcm92aWRlcik7IAotCQlpbml0RHJhZ0FuZERyb3AoKTsKLQkJCi0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEaXNwb3NlcyBvZiB0aGUgTmF2aWdhdG9yQ29udGVudFNlcnZpY2UsIHdoaWNoIHdpbGwgZGlzcG9zZSB0aGUgQ29udGVudAotCSAqIGFuZCBMYWJlbCBwcm92aWRlcnMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJaWYgKGNvbnRlbnRTZXJ2aWNlICE9IG51bGwpCi0JCQljb250ZW50U2VydmljZS5kaXNwb3NlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUge0BsaW5rIElOYXZpZ2F0b3JDb250ZW50U2VydmljZX1wcm92aWRlcyB0aGUgaG9vayBpbnRvIHRoZSBmcmFtZXdvcmsKLQkgKiB0byBwcm92aWRlIGNvbnRlbnQgZnJvbSB0aGUgdmFyaW91cyBleHRlbnNpb25zLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlfXRoYXQgd2FzIGNyZWF0ZWQgd2hlbiB0aGUKLQkgKiAgICAgICAgIHZpZXdlciB3YXMgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCkgewotCQlyZXR1cm4gY29udGVudFNlcnZpY2U7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogV2hlbmV2ZXIgdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiB0aGUgdHJlZSBjaGFuZ2VzIHRocm91Z2ggdGhpcyBtZXRob2QsCi0JICogYSByZWZyZXNoIG9mIHRoZSBwYXJlbnQgd2lsbCBvY2N1ci4gV2hlbiBvbmUgZXh0ZW5zaW9uIGhhcyBmb3VuZCB0aGUgbmVlZAotCSAqIHRvIG1vZGlmeSBhIHBhcmVudCwgb3RoZXIgZXh0ZW5zaW9ucyBtYXkgYWxzbyBjaG9vc2UgdG8gZG8gdXBkYXRlIHRoYXQKLQkgKiBub2RlIGFzIHdlbGwuIEV4dGVuc2lvbnMgYXJlIGFsc28gbm90IHBlcm1pdHRlZCB0byBhZGQgY2hpbGRyZW4gdG8gYQotCSAqIHZpZXdlciB0aGF0IHRoZXkgd291bGQgbm90IGhhdmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gdGhlIGV4dGVuc2lvbgotCSAqIGNvbnRlbnQgcHJvdmlkZXIgKHtAbGluayBJVHJlZUNvbnRlbnRQcm92aWRlcn0pLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXIjaW50ZXJuYWxBZGQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdFtdKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsQWRkKFdpZGdldCB3aWRnZXQsIE9iamVjdCBwYXJlbnRFbGVtZW50LAotCQkJT2JqZWN0W10gY2hpbGRFbGVtZW50cykgewotCQkvL3N1cGVyLmludGVybmFsUmVmcmVzaCh3aWRnZXQsIHBhcmVudEVsZW1lbnQsIHRydWUsIHRydWUpOwotCQlzdXBlci5pbnRlcm5hbEFkZCh3aWRnZXQsIHBhcmVudEVsZW1lbnQsIGNoaWxkRWxlbWVudHMpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZW1vdmFscyBhcmUgaGFuZGxlZCBieSByZWZyZXNoaW5nIHRoZSBwYXJlbnRzIG9mIGVhY2ggb2YgdGhlIGdpdmVuCi0JICogZWxlbWVudHMuIFRoZSBwYXJlbnRzIGFyZSBkZXRlcm1pbmVkIHZpYSBjYWxscyBvdCB0aGUgY29udGVudFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0W10pCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCXN1cGVyLnJlbW92ZShlbGVtZW50cyk7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXN1cGVyLmludGVybmFsUmVmcmVzaChjb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KGVsZW1lbnRzW2ldKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVXaXRob3V0UmVmcmVzaChPYmplY3RbXSBlbGVtZW50cykgewotCQlzdXBlci5yZW1vdmUoZWxlbWVudHMpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgRE5EIHN1cHBvcnQgdG8gdGhlIE5hdmlnYXRvci4gVXNlcyBob29rcyBpbnRvIHRoZSBleHRlbnNpYmxlCi0JICogZnJhbWV3b3JrIGZvciBETkQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEJ5IGRlZmF1bHQsIHRoZSBmb2xsb3dpbmcgVHJhbnNmZXIgdHlwZXMgYXJlIHN1cHBvcnRlZDoKLQkgKiA8dWw+Ci0JICogPGxpPkxvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkgKiA8bGk+UGx1Z2luVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkgKiA8bGk+RmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCksIGFuZAotCSAqIDxsaT5SZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCkKLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIENvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyCi0JICogQHNlZSBDb21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXREcmFnQW5kRHJvcCgpIHsKLQkJLyogSGFuZGxlIERyYWcgYW5kIERyb3AgKi8KLQkJaW50IG9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRTsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7Ci0JCS8vIFRPRE8gUmVtb3ZlZCBMb2NhbFNlbGVjdFRyYW5zZmVyIGFuZCBSZXNvdXJjZVRyYW5zZmVyIHRvIGJyZWFrIGRlcGVuZGVuY3kgb24gaWRlIGFuZCByZXNvdXJjZXMgcGx1Z2lucy4KLQkJLy8JCUxvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkJCQlQbHVnaW5UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkJLy8JCVJlc291cmNlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSAKLQkJfTsKLQkJYWRkRHJhZ1N1cHBvcnQob3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgQ29tbW9uTmF2aWdhdG9yRHJhZ0FkYXB0ZXIoCi0JCQkJdGhpcykpOwotCQlhZGREcm9wU3VwcG9ydChvcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBDb21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcigKLQkJCQl0aGlzKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyI2NyZWF0ZVRyZWVJdGVtKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUcmVlSXRlbShXaWRnZXQgcGFyZW50LCBmaW5hbCBPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5jcmVhdGVUcmVlSXRlbShwYXJlbnQsIGVsZW1lbnQsIGluZGV4KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoRXJyb3IgZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSAKLQotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2hhbmRsZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCi0JCU9iamVjdFtdIGNoYW5nZWQgPSBldmVudC5nZXRFbGVtZW50cygpOwotCQlpZiAoY2hhbmdlZCAhPSBudWxsKSB7Ci0JCQlBcnJheUxpc3Qgb3RoZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IGN1cnIgPSBjaGFuZ2VkW2ldOwotCQkJCS8vIFRPRE8gUmVzb3VyY2UgTWFwcGVyIHJlbW92ZWQuIFBlcmhhcHMgdGhpcyB3b3VsZCBiZSBhIGdvb2QgY2hhbmNlIHRvIHVzZSBSZXNvdXJjZU1hcHBpbmc/ICAKLS8vCQkJCWlmIChjdXJyIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0vLwkJCQkJZlJlc291cmNlVG9JdGVtc01hcHBlci5yZXNvdXJjZUNoYW5nZWQoKElSZXNvdXJjZSkgY3Vycik7Ci0vLwkJCQl9IGVsc2UgewotCQkJCQlvdGhlcnMuYWRkKGN1cnIpOwotLy8JCQkJfQotCQkJfQotCQkJaWYgKG90aGVycy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlldmVudCA9IG5ldyBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50KChJQmFzZUxhYmVsUHJvdmlkZXIpIGV2ZW50Ci0JCQkJCS5nZXRTb3VyY2UoKSwgb3RoZXJzLnRvQXJyYXkoKSk7Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTGFiZWxQcm92aWRlckNoYW5nZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpc3Bvc2UoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmhhbmRsZURpc3Bvc2UoZXZlbnQpOwotCQlkaXNwb3NlKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFN0cnVjdHVyZWRWaWV3ZXIuICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0aW9uVG9XaWRnZXQoTGlzdCB2LCBib29sZWFuIHJldmVhbCkgewotICAgICAgICBpZiAodiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRTZWxlY3Rpb24obmV3IEFycmF5TGlzdCgwKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNpemUgPSB2LnNpemUoKTsKLSAgICAgICAgTGlzdCBuZXdTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICAgICAgLy8gVXNlIGludGVybmFsRXhwYW5kIHNpbmNlIGl0ZW0gbWF5IG5vdCB5ZXQgYmUgY3JlYXRlZC4gU2VlCi0gICAgICAgICAgICAvLyAxRzZCMUFSLgotICAgICAgICAgICAgV2lkZ2V0IHcgPSBpbnRlcm5hbEV4cGFuZCh2LmdldChpKSwgcmV2ZWFsKTsKLSAgICAgICAgICAgIGlmICh3IGluc3RhbmNlb2YgSXRlbSkgewotICAgICAgICAgICAgICAgIG5ld1NlbGVjdGlvbi5hZGQodyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbik7Ci0gICAgICAgIAotLy8gICAgICAgIC8vIEFsdGhvdWdoIHNldHRpbmcgdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29udHJvbCBzaG91bGQgcmV2ZWFsIGl0LAotLy8gICAgICAgIC8vIHNldFNlbGVjdGlvbiBtYXkgYmUgYSBuby1vcCBpZiB0aGUgc2VsZWN0aW9uIGlzIHVuY2hhbmdlZCwKLS8vICAgICAgICAvLyBzbyBleHBsaWNpdGx5IHJldmVhbCB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgc2VsZWN0aW9uIGhlcmUuCi0vLyAgICAgICAgLy8gU2VlIGJ1ZyAxMDA1NjUgZm9yIG1vcmUgZGV0YWlscy4KLS8vICAgICAgICBpZiAocmV2ZWFsICYmIG5ld1NlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0vLyAgICAgICAgICAgIHNob3dJdGVtKChJdGVtKSBuZXdTZWxlY3Rpb24uZ2V0KDApKTsKLS8vICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lDb21tb25BY3Rpb25Db25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUNvbW1vbkFjdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2IyYzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUNvbW1vbkFjdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7Ci0KLS8qKgotICogCi0gKiBEZWZpbmVzIGNvbnN0YW50cyBmb3IgdGhlIHJldGFyZ2V0YWJsZSBhY3Rpb25zIGF2YWlsYWJsZSAKLSAqIGluIHRoZSBDb21tb24gVmlld2VyIGNvbnRleHQgbWVudS4KLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tb25BY3Rpb25Db25zdGFudHMgewotCQotCS8qKgotCSAqIFRoZSAnb3BlbicgcmV0YXJnZXRhYmxlIGFjdGlvbiBpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOID0gIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5PcGVuIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lDb21tb25Db250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUNvbW1vbkNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQ3MmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUNvbW1vbkNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLQotLyoqCi0gKiAKLSAqIFRoZSBDb21tb24gY29udGVudCBwcm92aWRlciBhbGxvd3MgZXh0ZW5zaW9ucyB0byB2YXJ5IHRoZWlyIGJlaGF2aW9yIGJhc2VkIG9uCi0gKiBwcm9wZXJ0aWVzIGluIHRoZSBleHRlbnNpb24gbW9kZWwgYW5kIHRoZSBnaXZlbiBtZW1lbnRvLiBUaGUgc3RhdGUgbW9kZWwKLSAqIHNob3VsZCBiZSBpbml0aWFsaXplZCBmcm9tIHZhbHVlcyBpbiB0aGUgbWVtZW50byBpZiBuZWNlc3NhcnkuCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBDbGllbnRzIGFyZSBub3QgcmVxdWlyZWQgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGlmIHRoZXJlIGlzIG5vIGNhdXNlIHRvCi0gKiBkbyBzby4ge0BsaW5rIElUcmVlQ29udGVudFByb3ZpZGVyfSBpcyByZXNwZWN0ZWQgYnkgdGhlIENvbW1vbiBOYXZpZ2F0b3IuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tb25Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBJVHJlZUNvbnRlbnRQcm92aWRlciwKLQkJSU1lbWVudG9Bd2FyZSB7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBjb250ZW50IHByb3ZpZGVyIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbiBtb2RlbCBhbmQKLQkgKiBtZW1lbnRvLgotCSAqIAotCSAqIEBwYXJhbSBhU3RhdGVNb2RlbAotCSAqICAgICAgICAgICAgVGhlIHN0YXRlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxvZ2ljYWwgZXh0ZW5zaW9uLgotCSAqIEBwYXJhbSBhTWVtZW50bwotCSAqICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgbWVtZW50byBmb3IgdGhlIGdpdmVuIHZpZXdlci4gQ2xpZW50cyBzaG91bGQKLQkgKiAgICAgICAgICAgIGVuc3VyZSB0aGF0IHRoZSBtZW1lbnRvIGtleXMgYXJlIHVuaXF1ZTsgcGVyaGFwcyB1c2luZyB0aGUgaWQKLQkgKiAgICAgICAgICAgIG9mIHRoZSBjb250ZW50IGV4dGVuc2lvbiBhcyBhIHByZWZpeC4KLQkgKiAKLQkgKiBAc2VlIElDb21tb25MYWJlbFByb3ZpZGVyCi0JICovCi0Jdm9pZCBpbml0KElFeHRlbnNpb25TdGF0ZU1vZGVsIGFTdGF0ZU1vZGVsLCBJTWVtZW50byBhTWVtZW50byk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUNvbW1vbkRyb3BBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JQ29tbW9uRHJvcEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDI2NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JQ29tbW9uRHJvcEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JRHJvcEFjdGlvbkRlbGVnYXRlOwotCi0KLS8qKgotICogPHA+Ci0gKiBVc2VkIGJ5IHRoZSA8Yj5vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuZHJvcEhhbmRsZXI8L2I+IGV4dGVuc2lvbiBwb2ludCB0bwotICogY2Fycnkgb3V0IHBsdWdnYWJsZSBEcmFnIGFuZCBEcm9wIGFjdGlvbnMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbW1vbkRyb3BBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIElEcm9wQWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogPHA+Ci0JICogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uIHVzaW5nIHRoZSB7QGxpbmsgQ29tbW9uVmlld2VyfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFWaWV3ZXIKLQkgKiAgICAgICAgICAgIFRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgQ29tbW9uVmlld2VyfXRoYXQgdGhlIGN1cnJlbnQKLQkgKiAgICAgICAgICAgIElDb21tb25Ecm9wQWN0aW9uRGVsZWdhdGUgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGgKLQkgKi8KLQl2b2lkIGluaXQoQ29tbW9uVmlld2VyIGFWaWV3ZXIpOwotCi0JLyoqCi0JICogQ2Fycnkgb3V0IHRoZSBETkQgb3BlcmF0aW9uCi0JICogCi0JICogQHBhcmFtIGRyb3BBZGFwdGVyCi0JICogICAgICAgICAgICBUaGUgYWRhcHRlciB0byBoYW5kbGUgdGhlIGRyb3AuCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCBiZWluZyBkcmFnZ2VkCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCBiZWluZyBkcmFnZ2VkIG9udG8KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQuCi0JICovCi0JYm9vbGVhbiBydW4oSUNvbW1vbkRyb3BBZGFwdGVyIGRyb3BBZGFwdGVyLCBPYmplY3Qgc291cmNlLCBPYmplY3QgdGFyZ2V0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUNvbW1vbkRyb3BBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lDb21tb25Ecm9wQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDIwNGFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUNvbW1vbkRyb3BBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRHJvcEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci0KLS8qKgotICogVGhlIGNvbW1vbiBkcm9wIGFkYXB0ZXIgcHJvdmlkZXMgYSBoYW5kbGUgdG8gdXNlZnVsCi0gKiBpbmZvcm1hdGlvbiBmb3Ige0BsaW5rIElDb21tb25Ecm9wQWN0aW9uRGVsZWdhdGV9cy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgcGFydGljdWxhcmx5IHVuc3RhYmxlIGFzIG9mIDMuMk00LiAKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogQHNpbmNlIDMuMgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbW9uRHJvcEFkYXB0ZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zZmVyVHlwZQotCSAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIG9iamVjdCBvbmx5IGlmIHRoZSB0cmFuc2ZlclR5cGUgaXMgb2YgdGhlIHR5cGUKLQkgKiAgICAgICAgIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKQotCSAqLwotCU9iamVjdCBnZXRTZWxlY3RlZE9iamVjdChUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKTsKLQotCS8qKgotCSAqIEBwYXJhbSB0cmFuc2ZlclR5cGUKLQkgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBpbnZvbHZlZCBpbiB0aGUgdHJhbnNmZXIuCi0JICogQHJldHVybiB0aGUgc2VsZWN0ZWQgb2JqZWN0IG9ubHkgaWYgdGhlIHRyYW5zZmVyVHlwZSBpcyBvZiB0aGUgdHlwZQotCSAqICAgICAgICAgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRJbnN0YW5jZSgpCi0JICovCi0JT2JqZWN0IGdldFNlbGVjdGVkT2JqZWN0KFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGUsIE9iamVjdCBkYXRhKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb25zdGFudCBkZXNjcmliaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgbW91c2UgcmVsYXRpdmUgdG8gdGhlCi0gICAgICogdGFyZ2V0IChiZWZvcmUsIG9uLCBvciBhZnRlciB0aGUgdGFyZ2V0LiAgCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG9uZSBvZiB0aGUgPGNvZGU+TE9DQVRJT05fKiA8L2NvZGU+IGNvbnN0YW50cyBkZWZpbmVkIGluIHRoaXMgdHlwZQotICAgICAqCi0JICogIAotCSAqLwotCWludCBnZXRDdXJyZW50TG9jYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBhIDxjb2RlPkRST1BfKjwvY29kZT4gY29uc3RhbnQgZnJvbSBjbGFzcyA8Y29kZT5ETkQ8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAc2VlIERORCNEUk9QX0NPUFkKLSAgICAgKiBAc2VlIERORCNEUk9QX01PVkUKLSAgICAgKiBAc2VlIERORCNEUk9QX0xJTksKLSAgICAgKiBAc2VlIERORCNEUk9QX05PTkUgCi0JICovCi0JaW50IGdldEN1cnJlbnRPcGVyYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRhcmdldCBvYmplY3QgY3VycmVudGx5IHVuZGVyIHRoZSBtb3VzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdGFyZ2V0IG9iamVjdCAKLQkgKi8KLQlPYmplY3QgZ2V0Q3VycmVudFRhcmdldCgpOwotIAotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IGN1cnJlbnRseSBzZWxlY3RlZCBieSB0aGUgdmlld2VyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc2VsZWN0ZWQgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBlaXRoZXIgbm8gb2JqZWN0IG9yIAotICAgICAqICAgbXVsdGlwbGUgb2JqZWN0cyBhcmUgc2VsZWN0ZWQKLSAgICAgKiAgICAKLQkgKi8KLQlPYmplY3QgZ2V0U2VsZWN0ZWRPYmplY3QoKTsKLQkKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCB0cmFuc2ZlciBkYXRhLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdHJhbnNmZXIgZGF0YSBmb3IgdGhpcyBkcm9wLgotCSAqICAKLQkgKi8gCi0JVHJhbnNmZXJEYXRhIGdldEN1cnJlbnRUcmFuc2ZlcigpOyAKLQkKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdmlzaWJsZSBpbnNlcnRpb24gZmVlZGJhY2sgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KLSAgICAgKiA8cD4KLSAgICAgKiBUeXBpY2FsIGluc2VydGlvbiBmZWVkYmFjayBpcyB0aGUgaG9yaXpvbnRhbCBpbnNlcnRpb24gYmFycyB0aGF0IGFwcGVhciAKLSAgICAgKiBiZXR3ZWVuIGFkamFjZW50IGl0ZW1zIHdoaWxlIGRyYWdnaW5nLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdmlzdWFsIGZlZWRiYWNrIGlzIGRlc2lyZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0gICAgICogQHNlZSBWaWV3ZXJEcm9wQWRhcHRlciNnZXRGZWVkYmFja0VuYWJsZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEZlZWRiYWNrRW5hYmxlZCgpOyAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lDb21tb25MYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lDb21tb25MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZjM0YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JQ29tbW9uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLQotLyoqCi0gKiA8cD4KLSAqIEEgY3VzdG9tIGludGVyZmFjZSBmb3IgQ29tbW9uIE5hdmlnYXRvciBleHRlbnNpb25zIHRoYXQgZWl0aGVyICgxKSByZXF1aXJlCi0gKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpYwotICoge0BsaW5rIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25WaWV3ZXJ9Jm5ic3A7dGhleSBhcmUKLSAqIGFzc29jaWF0ZWQgd2l0aCwgb3IgKDIpIHdvdWxkIGxpa2UgdG8gcmV0dXJuIGEgY3VzdG9tIGRlc2NyaXB0aW9uIGZvciB1c2UgaW4KLSAqIHRoZSBTdGF0dXMgQmFyLiBDbGllbnRzIG1heSBjaG9vc2UgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGZvciB0aGUKLSAqIDxpPmxhYmVsUHJvdmlkZXI8L2k+IGF0dHJpYnV0ZSBvZiB0aGUKLSAqIDxiPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50IDwvYj4gZXh0ZW5zaW9uCi0gKiBwb2ludC4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2xpZW50cyBuZWVkIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaWYgdGhlcmUgaXMgbm8gY2F1c2UgdG8gZG8gc28uCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcn0mbmJzcDtpcyByZXNwZWN0ZWQgYnkgdGhlCi0gKiBDb21tb24gTmF2aWdhdG9yLgotICogPC9wPiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKjwvcD4gCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbW1vbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBJTGFiZWxQcm92aWRlciwgSU1lbWVudG9Bd2FyZSwKLQkJSURlc2NyaXB0aW9uUHJvdmlkZXIgewotCi0JLyoqCi0JICogPHA+Ci0JICogUHJvdmlkZXMgdGhlIHN0YXRlIG1vZGVsIGZvciBhbnkgaW5pdGlhbGl6YXRpb24uIAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYVN0YXRlTW9kZWwKLQkgKiAJVGhlIHN0YXRlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxvZ2ljYWwgZXh0ZW5zaW9uLgotCSAqIEBwYXJhbSBhQ29udGVudFByb3ZpZGVyIAotCSAqIAlUaGUgYXNzb2NpYXRlZCBjb250ZW50IHByb3ZpZGVyIGZvciB0aGlzIGxhYmVsIHByb3ZpZGVyLgotCSAqIAotCSAqIEBzZWUgSUNvbW1vbkNvbnRlbnRQcm92aWRlcgotCSAqCi0JICovCi0Jdm9pZCBpbml0KElFeHRlbnNpb25TdGF0ZU1vZGVsIGFTdGF0ZU1vZGVsLAotCQkJSVRyZWVDb250ZW50UHJvdmlkZXIgYUNvbnRlbnRQcm92aWRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUNvbW1vbk1lbnVDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUNvbW1vbk1lbnVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2MmU0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lDb21tb25NZW51Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiA1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbW9uTWVudUNvbnN0YW50cyB7Ci0JCi0KLQkvKioKLQkgKiBQb3AtdXAgbWVudTogbmFtZSBvZiBncm91cCBmb3IgdGhlIHRvcCBvZiB0aGUgbWVudSAodmFsdWUKLQkgKiA8Y29kZT4iZ3JvdXAudG9wIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX1RPUCA9ICJncm91cC50b3AiOyAgLy8kTk9OLU5MUy0xJCAKLQotCS8qKgotCSAqIFBvcC11cCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBnb3RvIGFjdGlvbnMgKHZhbHVlCi0JICogPGNvZGU+Imdyb3VwLm9wZW4iPC9jb2RlPikuCi0JICogPHA+Ci0JICogRXhhbXBsZXMgZm9yIG9wZW4gYWN0aW9ucyBhcmU6Ci0JICogPHVsPgotCSAqIDxsaT5HbyBJbnRvPC9saT4KLQkgKiA8bGk+R28gVG88L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0dPVE8gPSAiZ3JvdXAuZ290byI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvcC11cCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBzaG93IGFjdGlvbnMgKHZhbHVlCi0JICogPGNvZGU+Imdyb3VwLnNob3ciPC9jb2RlPikuCi0JICogPHA+Ci0JICogRXhhbXBsZXMgZm9yIHNob3cgYWN0aW9ucyBhcmU6Ci0JICogPHVsPgotCSAqIDxsaT5TaG93IGluIE5hdmlnYXRvcjwvbGk+Ci0JICogPGxpPlNob3cgaW4gVHlwZSBIaWVyYXJjaHk8L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX1NIT1cgPSAiZ3JvdXAuc2hvdyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvcC11cCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBuZXcgYWN0aW9ucyAodmFsdWUKLQkgKiA8Y29kZT4iZ3JvdXAubmV3IjwvY29kZT4pLgotCSAqIDxwPgotCSAqIEV4YW1wbGVzIGZvciBuZXcgYWN0aW9ucyBhcmU6Ci0JICogPHVsPgotCSAqIDxsaT5DcmVhdGUgbmV3IGNsYXNzPC9saT4KLQkgKiA8bGk+Q3JlYXRlIG5ldyBpbnRlcmZhY2U8L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX05FVyA9ICJncm91cC5uZXciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3AtdXAgbWVudTogbmFtZSBvZiBncm91cCBmb3Igb3BlbiBhY3Rpb25zICh2YWx1ZQotCSAqIDxjb2RlPiJncm91cC5vcGVuIjwvY29kZT4pLgotCSAqIDxwPgotCSAqIEV4YW1wbGVzIGZvciBvcGVuIGFjdGlvbnMgYXJlOgotCSAqIDx1bD4KLQkgKiA8bGk+T3BlbiBUbzwvbGk+Ci0JICogPGxpPk9wZW4gV2l0aDwvbGk+Ci0JICogPC91bD4KLQkgKiA8L3A+Ci0JICogQHNlZSAjR1JPVVBfT1BFTl9XSVRICi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfT1BFTiA9ICJncm91cC5vcGVuIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFBvcC11cCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBvcGVuIGFjdGlvbnMgKHZhbHVlCi0JICogPGNvZGU+Imdyb3VwLm9wZW5XaXRoIjwvY29kZT4pLgotCSAqIDxwPgotCSAqIEV4YW1wbGVzIGZvciBvcGVuIGFjdGlvbnMgYXJlOgotCSAqIDx1bD4gCi0JICogPGxpPk9wZW4gV2l0aDwvbGk+Ci0JICogPC91bD4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfT1BFTl9XSVRIID0gImdyb3VwLm9wZW5XaXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9wLXVwIG1lbnU6IG5hbWUgb2YgZ3JvdXAgZm9yIHBvcnRpbmcgYWN0aW9ucyAodmFsdWUKLQkgKiA8Y29kZT4iZ3JvdXAucG9ydCI8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiBFeGFtcGxlcyBmb3Igb3BlbiBhY3Rpb25zIGFyZToKLQkgKiA8dWw+Ci0JICogPGxpPkltcG9ydDwvbGk+Ci0JICogPGxpPkV4cG9ydDwvbGk+Ci0JICogPC91bD4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfUE9SVCA9ICJncm91cC5wb3J0IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3AtdXAgbWVudTogbmFtZSBvZiBncm91cCBmb3IgcHJvcGVydGllcyBhY3Rpb25zICh2YWx1ZQotCSAqIDxjb2RlPiJncm91cC5lZGl0IjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0VESVQgPSAiZ3JvdXAuZWRpdCI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvKioKLQkgKiBQb3AtdXAgbWVudTogbmFtZSBvZiBncm91cCBmb3IgYnVpbGQgYWN0aW9ucyAodmFsdWUKLQkgKiA8Y29kZT4iZ3JvdXAuYnVpbGQiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfQlVJTEQgPSAiZ3JvdXAuYnVpbGQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3AtdXAgbWVudTogbmFtZSBvZiBncm91cCBmb3IgcmVvcmdhbml6ZSBhY3Rpb25zICh2YWx1ZQotCSAqIDxjb2RlPiJncm91cC5yZW9yZ2FuaXplIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX1JFT1JHQU5JWkUgPSBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdST1VQX1JFT1JHQU5JWkU7Ci0KLQkvKioKLQkgKiBQb3AtdXAgbWVudTogbmFtZSBvZiBncm91cCBmb3IgY29kZSBnZW5lcmF0aW9uIGFjdGlvbnMgKCB2YWx1ZQotCSAqIDxjb2RlPiJncm91cC5nZW5lcmF0ZSI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9HRU5FUkFURSA9ICJncm91cC5nZW5lcmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvcC11cCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBzb3VyY2UgYWN0aW9ucy4gVGhpcyBpcyBhbiBhbGlhcyBmb3IKLQkgKiA8Y29kZT5HUk9VUF9HRU5FUkFURTwvY29kZT4gdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggbWFpbiBtZW51IGJhcgotCSAqIHN0cnVjdHVyZS4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfU09VUkNFID0gR1JPVVBfR0VORVJBVEU7Ci0KLQkvKioKLQkgKiBQb3AtdXAgbWVudTogbmFtZSBvZiBncm91cCBmb3Igc2VhcmNoIGFjdGlvbnMgKHZhbHVlCi0JICogPGNvZGU+Imdyb3VwLnNlYXJjaCI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9TRUFSQ0ggPSAiZ3JvdXAuc2VhcmNoIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9wLXVwIG1lbnU6IG5hbWUgb2YgZ3JvdXAgZm9yIGFkZGl0aW9uYWwgYWN0aW9ucyAodmFsdWUKLQkgKiA8Y29kZT4iYWRkaXRpb25zIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0FERElUSU9OUyA9ICJhZGRpdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3AtdXAgbWVudTogbmFtZSBvZiBncm91cCBmb3Igdmlld2VyIHNldHVwIGFjdGlvbnMgKHZhbHVlCi0JICogPGNvZGU+Imdyb3VwLnZpZXdlclNldHVwIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX1ZJRVdFUl9TRVRVUCA9ICJncm91cC52aWV3ZXJTZXR1cCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvcC11cCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciBwcm9wZXJ0aWVzIGFjdGlvbnMgKHZhbHVlCi0JICogPGNvZGU+Imdyb3VwLnByb3BlcnRpZXMiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfUFJPUEVSVElFUyA9ICJncm91cC5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJCAKLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSURlc2NyaXB0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSURlc2NyaXB0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxODJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lEZXNjcmlwdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7Ci0KLS8qKgotICogCi0gKiBMYWJlbCBwcm92aWRlcnMgKGFzIHNwZWNpZmllZCBieSB0aGUgJ2xhYmVsUHJvdmlkZXInIGF0dHJpYnV0ZSBvZiB0aGUKLSAqIDxiPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50PC9iPiBleHRlbnNpb24gcG9pbnQpIG1heSAKLSAqIGNob29zZSB0byBhbHNvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBpbiBvcmRlciB0byBwcm92aWRlIHRleHQgZm9yIAotICogdGhlIHN0YXR1cyBiYXIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgRWNsaXBzZSB3aW5kb3cuIAotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgYnV0IGFyZSBub3QgcmVxdWlyZWQgdG8gZG8gc28uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVzY3JpcHRpb25Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBQcm92aWRlIGEgZGVzY3JpcHRpb24gZm9yIHRoZSBzdGF0dXMgYmFyIHZpZXcsIGlmIGF2YWlsYWJsZS4gQSBkZWZhdWx0Ci0JICogc3RyaW5nIG9mIHRoZSBmb3JtICIoeCkgaXRlbXMgc2VsZWN0ZWQiIHdpbGwgYmUgdXNlZCBpZiB0aGlzIG1ldGhvZAotCSAqIGNob29zZWQgdG8gcmV0dXJuIG51bGwuCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIFRoZSBlbXB0eSBzdHJpbmcgKCIiKSB3aWxsIGJlIHJlc3BlY3RlZCBhcyBhIHZhbGlkIHZhbHVlIGlmIHJldHVybmVkLgotCSAqIFJldHVybiA8Yj5udWxsIDwvYj4gaWYgdGhlIGV4dGVuc2lvbiBkZWZlcnMgdG8gdGhlIGRlZmF1bHQgbWV0aG9kIG9mCi0JICogc3VwcGx5aW5nIHN0YXR1cyBiYXIgZGVzY3JpcHRpb25zLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5FbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBzZWxlY3RlZCBpbiB0aGUgTmF2aWdhdG9yCi0JICogQHJldHVybiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgc3RhdHVzIGJhciB2aWV3LCBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKE9iamVjdCBhbkVsZW1lbnQpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDU0YWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yOwotCi0vKioKLSAqIAotICogQW4gZXh0ZW5zaW9uIGFjdGl2YXRpb24gbGlzdGVuZXIgaXMgbm90aWZpZWQgd2hlbmV2ZXIgdGhlIGFjdGl2YXRpb24gc3RhdGUKLSAqIGNoYW5nZXNlIGZvciBvbmUgb3IgbW9yZSBjb250ZW50IGV4dGVuc2lvbnMuCi0gKiAKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiBAc2VlIE5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlCi0gKiBAc2VlIE5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlI2FkZEV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcihTdHJpbmcsCi0gKiAgICAgIElFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXIpCi0gKiBAc2VlIE5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlI3JlbW92ZUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcihTdHJpbmcsCi0gKiAgICAgIElFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXIpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lciB7Ci0JLyoqCi0JICogQHBhcmFtIGFWaWV3ZXJJZAotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciBpZCBvZiB0aGUgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlCi0JICogQHBhcmFtIHRoZU5hdmlnYXRvckV4dGVuc2lvbklkcwotCSAqICAgICAgICAgICAgQW4gYXJyYXkgb2YgdXBkYXRlZCBleHRlbnNpb24gaWRzCi0JICogQHBhcmFtIGlzQWN0aXZlCi0JICogICAgICAgICAgICBUaGUgbmV3IGFjdGl2YXRpb24gc3RhdGUgb2YgdGhlIGV4dGVuc2lvbnMKLQkgKi8KLQl2b2lkIG9uRXh0ZW5zaW9uQWN0aXZhdGlvbihTdHJpbmcgYVZpZXdlcklkLAotCQkJU3RyaW5nW10gdGhlTmF2aWdhdG9yRXh0ZW5zaW9uSWRzLCBib29sZWFuIGlzQWN0aXZlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUV4dGVuc2lvblN0YXRlTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSUV4dGVuc2lvblN0YXRlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5MWFlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lFeHRlbnNpb25TdGF0ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLS8qKgotICogCi0gKiBUaGUgSUV4dGVuc2lvblN0YXRlTW9kZWwgYWxsb3dzIGNsaWVudHMgdG8gY29vcmRpbmF0ZSAKLSAqIHN0YXRlIGFjcm9zcyBjb21wb25lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHNhbWUgCi0gKiBsb2dpY2FsIGV4dGVuc2lvbi4gCi0gKiA8cD4KLSAqIFRoYXQgaXMsIGEgY29udGVudCBwcm92aWRlciBtaWdodAotICogdmFyeSBob3cgaXQgZXhwb3NlcyBpdHMgY29udGVudCBiYXNlZCBvbiB0aGUgc3RhdGUgCi0gKiBvZiBhIHNwZWNpZmljIHByb3BlcnR5IGluIHRoZSBtb2RlbC4gCi0gKiA8L3A+Ci0gKiAgCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqPC9wPgotICogQHNpbmNlIDMuMgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRXh0ZW5zaW9uU3RhdGVNb2RlbCB7Ci0KLQkvKioKLQkgKiBUaGUgaWQgaXMgdXNlZCB0byBsb29rIHVwIHRoZSBzdGF0ZSBtb2RlbCBhY3Jvc3MgCi0JICogZGlmZmVyZW50IGNvbXBvbmVudHMgb2YgdGhlIHNhbWUgbG9naWNhbCBleHRlbnNpb24uIAotCSAqIEdlbmVyYWxseSwgdGhlIGlkIG9mIHRoZSBjb250ZW50IGV4dGVuc2lvbiBpcyB1c2VkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgc3RhdGUgbW9kZWwuIAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgdmlld2VyIGlkIHRoYXQgdGhpcyBzdGF0ZSBtb2RlbCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JU3RyaW5nIGdldFZpZXdlcklkKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYVByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiBhIGdpdmVuIHByb3BlcnR5IAotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LiAKLQkgKi8KLQlTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIGFQcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFQcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgYSBnaXZlbiBwcm9wZXJ0eSAKLQkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4gCi0JICovCi0JYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIGFQcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFQcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgYSBnaXZlbiBwcm9wZXJ0eSAKLQkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4gCi0JICovCi0JaW50IGdldEludFByb3BlcnR5KFN0cmluZyBhUHJvcGVydHlOYW1lKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYVByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiBhIGdpdmVuIHByb3BlcnR5IAotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LiAKLQkgKi8KLQlPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGFQcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFQcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgYSBnaXZlbiBwcm9wZXJ0eSAKLQkgKiBAcGFyYW0gYVByb3BlcnR5VmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiBhIHRoZSBnaXZlbiBwcm9wZXJ0eS4gCi0JICovCi0Jdm9pZCBzZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcgYVByb3BlcnR5TmFtZSwgU3RyaW5nIGFQcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhUHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIGEgZ2l2ZW4gcHJvcGVydHkgCi0JICogQHBhcmFtIGFQcm9wZXJ0eVZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgYSB0aGUgZ2l2ZW4gcHJvcGVydHkuIAotCSAqLwotCXZvaWQgc2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBhUHJvcGVydHlOYW1lLCBib29sZWFuIGFQcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhUHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIGEgZ2l2ZW4gcHJvcGVydHkgCi0JICogQHBhcmFtIGFQcm9wZXJ0eVZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgYSB0aGUgZ2l2ZW4gcHJvcGVydHkuIAotCSAqLwotCXZvaWQgc2V0SW50UHJvcGVydHkoU3RyaW5nIGFQcm9wZXJ0eU5hbWUsIGludCBhUHJvcGVydHlWYWx1ZSk7Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFQcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgYSBnaXZlbiBwcm9wZXJ0eSAKLQkgKiBAcGFyYW0gYVByb3BlcnR5VmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiBhIHRoZSBnaXZlbiBwcm9wZXJ0eS4gCi0JICovCi0Jdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgYVByb3BlcnR5TmFtZSwgT2JqZWN0IGFQcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhTGlzdGVuZXIgCi0JICogCUFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcn0gCi0JICogCXRoYXQgc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gY2hhbmdlcyBvY2N1ciBpbiB0aGlzIG1vZGVsLgotCSAqLwotCXZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBhTGlzdGVuZXIpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFMaXN0ZW5lciAKLQkgKiAJQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfSAKLQkgKiAJdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkIHdoZW4gY2hhbmdlcyBvY2N1ciBpbiAKLQkgKiAgCXRoaXMgbW9kZWwuCi0JICovCi0Jdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGFMaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lMaW5rSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lMaW5rSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZjZmY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JTGlua0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotCi0vKioKLSAqIDxwPgotICogUHJvdmlkZXMgaW5mb3JtYXRpb24gdG8gdGhlIENvbW1vbiBOYXZpZ2F0b3Igb24gaG93IHRvIGxpbmsgc2VsZWN0aW9ucyB3aXRoCi0gKiBhY3RpdmUgZWRpdG9ycyBhbmQgdmljZSB2ZXJzYS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIENvbW1vbiBOYXZpZ2F0b3IgYWxsb3dzIGNsaWVudHMgdG8gcGx1Zy1pbiB0aGVpciBvd24gY3VzdG9tIGxvZ2ljIGZvcgotICogbGlua2luZyBzZWxlY3Rpb25zIGZyb20gdGhlIFZpZXdlciB0byBhY3RpdmUgZWRpdG9ycy4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZAotICogYnkgdGhlIDxiPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5saW5rSGVscGVyIDwvYj4gZXh0ZW5zaW9uCi0gKiBwb2ludCB0byBnYXRoZXIgaW5mb3JtYXRpb24gYW5kIHRyaWdnZXIgZWRpdG9yIGFjdGl2YXRpb25zLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaW5rSGVscGVyIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIERldGVybWluZSB0aGUgY29ycmVjdCBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBmb3IgdGhlIENvbW1vbiBOYXZpZ2F0b3IgZ2l2ZW4KLQkgKiBhbklucHV0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5JbnB1dAotCSAqICAgICAgICAgICAgQW4gRWRpdG9yIGlucHV0Ci0JICogQHJldHVybiBBIHNlbGVjdGlvbiB0byBiZSBzZXQgYWdhaW5zdCB0aGUge0BsaW5rIENvbW1vblZpZXdlcn0KLQkgKi8KLQlJU3RydWN0dXJlZFNlbGVjdGlvbiBmaW5kU2VsZWN0aW9uKElFZGl0b3JJbnB1dCBhbklucHV0KTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEFjdGl2YXRlIHRoZSBjb3JyZWN0IGVkaXRvciBmb3IgYVNlbGVjdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFQYWdlCi0JICogICAgICAgICAgICBBIFdvcmtiZW5jaFBhZ2UgdG8gdXNlIGZvciBlZGl0b3IgbG9jYXRpb24gYW5kIGFjdGl2YXRpb24KLQkgKiBAcGFyYW0gYVNlbGVjdGlvbgotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgc2VsZWN0aW9uIGZyb20gdGhlIHtAbGluayBDb21tb25WaWV3ZXJ9Ci0JICovCi0Jdm9pZCBhY3RpdmF0ZUVkaXRvcihJV29ya2JlbmNoUGFnZSBhUGFnZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lNZW1lbnRvQXdhcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSU1lbWVudG9Bd2FyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmYxZDQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSU1lbWVudG9Bd2FyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci0KLS8qKgotICogQ2xpZW50cyBtYXkgdXNlIG1lbWVudG9zIHRvIHBlcnNpc3QgaW50ZXJlc3Rpbmcgc3RhdGUgYmV0d2VlbiBzZXNzaW9ucy4KLSAqIENsaWVudHMgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBtZW1lbnRvIGtleXMgYXJlIHVuaXF1ZTsgcGVyaGFwcyB1c2luZyB0aGUgaWQKLSAqIG9mIHRoZSBjb250ZW50IGV4dGVuc2lvbiBhcyBhIHByZWZpeC4KLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZW1lbnRvQXdhcmUgewotCi0JLyoqCi0JICogPHA+Ci0JICogUmVzdG9yZSB0aGUgcHJldmlvdXMgc3RhdGUgb2YgYW55IGFjdGlvbnMgdXNpbmcgdGhlIGZsYWdzIGluIGFNZW1lbnRvLgotCSAqIFRoaXMgbWV0aG9kIGFsbG93cyB0aGUgc3RhdGUgb2YgYW55IGFjdGlvbnMgdGhhdCBwZXJzaXN0IGZyb20gc2Vzc2lvbiB0bwotCSAqIHNlc3Npb24gdG8gYmUgcmVzdG9yZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTWVtZW50bwotCSAqICAgICAgICAgICAgQSBtZW1lbnRvIHRoYXQgd2FzIGdpdmVuIHRvIHRoZSB2aWV3IHBhcnQgdG8gcmVzdG9yZSBpdHMKLQkgKiAgICAgICAgICAgIHN0YXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJTWVtZW50byBhTWVtZW50byk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTYXZlIGZsYWdzIGluIGFNZW1lbnRvIHRvIHJlbWVtYmVyIHRoZSBzdGF0ZSBvZiBhbnkgYWN0aW9ucyB0aGF0IHBlcnNpc3QKLQkgKiBmcm9tIHNlc3Npb24gdG8gc2Vzc2lvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogRXh0ZW5zaW9ucyBzaG91bGQgcXVhbGlmeSBhbnkga2V5cyBzdG9yZWQgaW4gdGhlIG1lbWVudG8gd2l0aCB0aGVpcgotCSAqIHBsdWdpbiBpZAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1lbWVudG8KLQkgKiAgICAgICAgICAgIEEgbWVtZW50byB0aGF0IHdhcyBnaXZlbiB0byB0aGUgdmlldyBwYXJ0IHRvIHNhdmUgaXRzIHN0YXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBhTWVtZW50byk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjA1NzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogCi0gKiBUaGUgZGVzY3JpcHRvciBwcm92aWRlcyBhIGhhbmRsZSB0byBhIGNvbnRlbnQgZXh0ZW5zaW9uLiBJbmZvcm1hdGlvbiBzdWNoIGFzCi0gKiB0aGUgSWQsIHRoZSBuYW1lLCB0aGUgcHJpb3JpdHksIGFuZCB3aGV0aGVyIHRoZSBkZXNjcmlwdG9yIHByb3ZpZGVzIG9uZSBvcgotICogbW9yZSByb290IGVsZW1lbnRzIGlzIHByb3ZpZGVkLgotICogCi0gKiAKLSAqIDxwPgotICogVGhlcmUgaXMgb25lIHtAbGluayBJTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbn0gZm9yIGVhY2ggY29udGVudCAKLSAqIHNlcnZpY2UuIFRoZXJlIGlzIG9ubHkgb25lIHtAbGluayBJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3J9Ci0gKiBmb3IgZWFjaCBleHRlbnNpb24uCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hdmdpYXRvciBjb250ZW50IGV4dGVuc2lvbiBpZAotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hdmdpYXRvciBjb250ZW50IGV4dGVuc2lvbiBpZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBuYXZpZ2F0b3IgZXh0ZW5zaW9uCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIG5hdmlnYXRvciBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByaW9yaXR5IG9mIHRoZSBuYXZpZ2F0b3IgY29udGVudCBleHRlbnNpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgcHJpb3JpdHkgb2YgdGhlIG5hdmlnYXRvciBjb250ZW50IGV4dGVuc2lvbi4gUmV0dXJucyAwICh6ZXJvKQotCSAqICAgICAgICAgaWYgbm8gcHJpb3JpdHkgd2FzIHNwZWNpZmllZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldFByaW9yaXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGlzIGEgcm9vdCBuYXZpZ2F0b3IgY29udGVudCBleHRlbnNpb24uCi0JICogTmF2aWdhdG9yIGNvbnRlbnQgZXh0ZW5zaW9ucyBhcmUgcm9vdCBleHRlbnNpb25zIGlmIHRoZXkgYXJlIHJlZmVyZW5jZWQKLQkgKiBpbiBhIG5hdmlnYXRvciB2aWV3IGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgcm9vdCBuYXZpZ2F0b3IgZXh0ZW5zaW9uIGZhbHNlIGlmIHRoZQotCSAqICAgICAgICAgcmVjZWl2ZXIgaXMgbm90IGEgcm9vdCBuYXZpZ2F0b3IgZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNSb290KCk7Ci0KLQkvKioKLQkgKiBUaGUgZW5hYmxlZEJ5RGVmYXVsdCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoZXRoZXIgYW4gZXh0ZW5zaW9uIHNob3VsZCBiZQotCSAqIGFjdGl2YXRlZCBpbiB0aGUgY29udGV4dCBvZiBhIHZpZXdlciBhdXRvbWF0aWNhbGx5LiBVc2VycyBtYXkgb3ZlcnJpZGUKLQkgKiB0aGlzIHNldHRpbmcgdGhyb3VnaCB0aGUgIlR5cGVzIG9mIENvbnRlbnQiIGRpYWxvZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV4dGVuc2lvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFbmFibGVkQnlEZWZhdWx0KCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGxvYWRpbmcgb2YgdGhpcyBjb25maWd1cmF0aW9uIGVsZW1lbnQgaGFzIGZhaWxlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNMb2FkaW5nRmFpbGVkKCk7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBjb250ZW50IGV4dGVuc2lvbiBjb3VsZCBwcm92aWRlIHRoZSBnaXZlbiBlbGVtZW50IGFzIGEKLQkgKiBjaGlsZC4KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGF0IHRoZSBwYXJlbnQgb2YgYW4gZWxlbWVudCBjb3VsZCBiZQotCSAqIGZvciBMaW5rIHdpdGggRWRpdG9yIHN1cHBvcnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbkVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBldmFsdWF0aW9uLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZXh0ZW5zaW9uIG1pZ2h0IHByb3ZpZGUgYW4gb2JqZWN0IG9mIHRoaXMKLQkgKiAgICAgICAgIHR5cGUgYXMgYSBjaGlsZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Bvc3NpYmxlQ2hpbGQoT2JqZWN0IGFuRWxlbWVudCk7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBjb250ZW50IGV4dGVuc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gc2VsZWN0aW9uLgotCSAqIFRoZSBjb250ZW50IGV4dGVuc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgc2VsZWN0aW9uIGlmIGFuZCBvbmx5IGlmIGl0IGlzCi0JICogZW5hYmxlZCBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGFTdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgc2VsZWN0aW9uIGZyb20gdGhlIHZpZXdlcgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgZm9yIGVhY2ggZWxlbWVudCBpbgotCSAqICAgICAgICAgdGhlIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRGb3IoSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIHRoaXMgY29udGVudCBleHRlbnNpb24gaXMgZW5hYmxlZCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFuRWxlbWVudAotCSAqICAgICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGV2YWx1YXRpb24uCi0JICogQHJldHVybiBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBleHRlbnNpb24gaXMgZW5hYmxlZCBmb3IgdGhlIGVsZW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkRm9yKE9iamVjdCBhbkVsZW1lbnQpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzY3MzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSU5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSBjb250ZW50IGV4dGVuc2lvbiByZXByZXNlbnRzIHRoZSBjb21wb25lbnRzIG9mIGEgPGI+bmF2aWdhdG9yQ29udGVudDwvYj4KLSAqIGV4dGVuc2lvbi4gVGhlc2UgaGFuZGxlcyBhcmUgbWFuYWdlZCBieSBhIGNvbnRlbnQgc2VydmljZQotICoge0BsaW5rIElOYXZpZ2F0b3JDb250ZW50U2VydmljZX0uCi0gKiAKLSAqIDxwPgotICogVGhlcmUgaXMgb25lIHtAbGluayBJTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbn0gZm9yIGVhY2ggY29udGVudCBzZXJ2aWNlLgotICogVGhlcmUgaXMgb25seSBvbmUge0BsaW5rIElOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcn0gZm9yIGVhY2ggZXh0ZW5zaW9uLgotICogPC9wPgotICogCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24gZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGlkIGF0dHJpYnV0ZSBvZiB0aGUgbmF2aWdhdG9yQ29udGVudCBleHRlbnNpb24uCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBUaGVyZSBpcyBvbmUgZGVzY3JpcHRvciBmb3IgYWxsIGluc3RhbmNlcyBvZiBhCi0JICogSU5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24uCi0JICogCi0JICogCi0JICogQHJldHVybiBBIGhhbmRsZSB0byB0aGUgZGVzY3JpcHRvciB1c2VkIHRvIG1hbmFnZSB0aGlzIGV4dGVuc2lvbi4KLQkgKi8KLQlJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQ2xpZW50cyBtYXkgY2hvb3NlIHRvIGltcGxlbWVudCB7QGxpbmsgSUNvbW1vbkNvbnRlbnRQcm92aWRlcn0sIGJ1dCBhcmUKLQkgKiBvbmx5IHJlcXVpcmVkIHRvIHN1cHBseSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVRyZWVDb250ZW50UHJvdmlkZXJ9LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbnRlbnQgcHJvdmlkZXIgZGVmaW5lZCBieSB0aGUgPGI+bmF2aWdhdG9yQ29udGVudDwvYj4KLQkgKiAgICAgICAgIGV4dGVuc2lvbi4KLQkgKiBAc2VlIElDb21tb25Db250ZW50UHJvdmlkZXIKLQkgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyCi0JICovCi0JSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBUaGUgcmVhbCB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG1heSBvbmx5IHN1cHBvcnQgdGhlCi0JICoge0BsaW5rIElMYWJlbFByb3ZpZGVyfSBpbnRlcmZhY2UsIGJ1dCBhIHNpbXBsZSBkZWxlZ2F0ZSBpcyB1c2VkIHdoZW4gdGhpcwotCSAqIGlzIHRoZSBjYXNlIHRvIGVuc3VyZSB0aGF0IGNsaWVudHMgbWF5IGFudGljcGF0ZSBhbgotCSAqIHtAbGluayBJQ29tbW9uTGFiZWxQcm92aWRlcn0gaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbnRlbnQgcHJvdmlkZXIgZGVmaW5lZCBieSB0aGUgPGI+bmF2aWdhdG9yQ29udGVudDwvYj4KLQkgKiAgICAgICAgIGV4dGVuc2lvbi4KLQkgKiBAc2VlIElDb21tb25MYWJlbFByb3ZpZGVyCi0JICogQHNlZSBJTGFiZWxQcm92aWRlcgotCSAqLwotCUlDb21tb25MYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKTsKLS8vIENvbnNpZGVyaW5nIHJlbW92aW5nCi0vLwkvKioKLS8vCSAqIEBwYXJhbSB0aGVBY3Rpb25TZXJ2aWNlCi0vLwkgKiAgICAgICAgICAgIEFuIGFjdGlvbiBzZXJ2aWNlIGlzIHJlcXVpcmVkIHRvIGluaXRpYWxpemUgdGhlIGFjdGlvbgotLy8JICogICAgICAgICAgICBwcm92aWRlci4gQ2xpZW50cyBzaG91bGQgb25seSB1c2Ugb25lIGFjdGlvbiBzZXJ2aWNlLiBOZXZlcgotLy8JICogICAgICAgICAgICBjYWxsIHRoaXMgbWV0aG9kIHdpdGggZGlmZmVyZW50IGFjdGlvbiBzZXJ2aWNlcy4KLS8vCSAqIAotLy8JICogCi0vLwkgKiBAcmV0dXJuIFRoZSBhY3Rpb24gcHJvdmlkZXIgZGVmaW5lZCBieSA8Yj5uYXZpZ2F0b3JDb250ZW50PC9iPgotLy8JICogICAgICAgICBleHRlbnNpb24sIGlmIGFueS4gQSBzaW5nbGV0b24gbm8tb3AgYWN0aW9uIHByb3ZpZGVyIG1heSBiZQotLy8JICogICAgICAgICByZXR1cm5lZCBpZiB0aGUgZXh0ZW5zaW9uIGRvZXMgbm90IGRlZmluZSBhbiBhY3Rpb24gcHJvdmlkZXIuCi0vLwkgKiBAc2VlIElDb21tb25BY3Rpb25Qcm92aWRlcgotLy8JICogQHNlZSBJQ29tbW9uQWN0aW9uQ29uc3RhbnRzCi0vLwkgKi8KLS8vCUlDb21tb25BY3Rpb25Qcm92aWRlciBnZXRBY3Rpb25Qcm92aWRlcigKLS8vCQkJSU5hdmlnYXRvckFjdGlvblNlcnZpY2UgdGhlQWN0aW9uU2VydmljZSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRydWUgaWYgYW55IGNsYXNzIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBieSB0aGlzIGV4dGVuc2lvbi4KLQkgKi8KLQlib29sZWFuIGlzTG9hZGVkKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdGF0ZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZW50IGV4dGVuc2lvbi4KLQkgKiBAc2VlIElFeHRlbnNpb25TdGF0ZU1vZGVsCi0JICovCi0JSUV4dGVuc2lvblN0YXRlTW9kZWwgZ2V0U3RhdGVNb2RlbCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JTmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTc3NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JTmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci0KLS8qKgotICogCi0gKiBUaGUgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIG1hbmFnZXMgZXh0ZW5zaW9ucyBmb3IgZXh0ZW5zaWJsZSB2aWV3ZXJzLiBUaGUKLSAqIHNlcnZpY2UgY2FuIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvdmlkZXJzIChmb3IgY29udGVudHMgb3IgbGFiZWxzKSBmb3IgYW4KLSAqIGVsZW1lbnQgYW5kIHByb3ZpZGUgYSByZWFkeS10by1nbyB7QGxpbmsgSVRyZWVDb250ZW50UHJvdmlkZXJ9IGFuZAotICoge0BsaW5rIElMYWJlbFByb3ZpZGVyfSBmb3Igdmlld2VycyB0aGF0IHdpc2ggdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlCi0gKiA8Yj5vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudDwvYj4gZXh0ZW5zaW9ucyBkZWZpbmVkIGZvciBhCi0gKiBwYXJ0aWN1bGFyIDxpPnZpZXdlcklkPC9pPi4KLSAqIAotICogPHA+Ci0gKiBDbGllbnRzIHNob3VsZCBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSB0aGlzIGNsYXNzIHVzaW5nIHRoZSBmYWN0b3J5IAotICogKHtAbGluayBOYXZpZ2F0b3JDb250ZW50U2VydmljZUZhY3Rvcnl9KS4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBDbGllbnRzIG1heSBjb250cmlidXRlIGxvZ2ljYWwgZXh0ZW5zaW9ucyB1c2luZwotICogPGI+b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQ8L2I+LiBFYWNoIGV4dGVuc2lvbiBoYXMgdGhyZWUKLSAqIHN0YXRlcyB3aGljaCBkZXRlcm1pbmUgd2hldGhlciB0aGUgZXh0ZW5zaW9uIGlzIHVzZWQgYnkgdGhlIGNvbnRlbnQgc2VydmljZToKLSAqIDx1bD4KLSAqIDxsaT48aT52aXNpYmxlPC9pPjogSWYgYSBjb250ZW50IGV4dGVuc2lvbiBpZCBtYXRjaGVzIGEgPGI+dmlld2VyQ29udGVudEJpbmRpbmc8L2I+IAotICogICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIDxpPnZpZXdlcklkPC9pPiBvZiB0aGlzIGNvbnRlbnQgc2VydmljZSwgdGhlbiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBpcyAndmlzaWJsZScuIFZpc2libGUgZXh0ZW5zaW9ucyBtYXkgb25seSBiZQotICogICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVkIHRocm91Z2ggPGI+dmlld2VyQ29udGVudEJpbmRpbmc8L2I+cy4gCi0gKiA8L2xpPgotICogPGxpPjxpPmFjdGl2ZTwvaT46IFRoZSBhY3RpdmUgc3RhdGUgbWF5IGJlIHNldCB0byBhIGRlZmF1bHQgdXNpbmcgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgPGk+YWN0aXZlQnlEZWZhdWx0PC9pPiBhdHRyaWJ1dGUgb2YgPGI+bmF2aWdhdG9yQ29udGVudDwvYj4uIAotICogICAgICAgICAgICAgICAgICAgIFVzZXJzIG1heSB0b2dnbGUgdGhlICdhY3RpdmUnIHN0YXRlIHRocm91Z2ggdGhlIAotICogICAgICAgICAgICAgICAgICAgICdBdmFpbGFibGUgZXh0ZW5zaW9ucycgZGlhbG9nLiBDbGllbnRzIG1heSBhbHNvIAotICogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSB0aGUgYWN0aXZlIGV4dGVuc2lvbnMgdXNpbmcKLSAqICAgICAgICAgICAgICAgICAgICAge0BsaW5rICNhY3RpdmF0ZUV4dGVuc2lvbnMoU3RyaW5nW10sIGJvb2xlYW4pfSBvcgotICogICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI2RlYWN0aXZhdGVFeHRlbnNpb25zKFN0cmluZ1tdLCBib29sZWFuKX0uIAotICogPC9saT4KLSAqIDxsaT48aT5lbmFibGVkPC9pPjogQW4gZXh0ZW5zaW9uIGlzICdlbmFibGVkJyBmb3IgYW4gZWxlbWVudCBpZiB0aGUgZXh0ZW5zaW9uIAotICogICAgICAgICAgICAgICAgICAgICBjb250cmlidXRlZCB0aGF0IGVsZW1lbnQgb3IgaWYgdGhlIGVsZW1lbnQgaXMgZGVzY3JpYmVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICA8aT50cmlnZ2VyUG9pbnRzPC9pPiBlbGVtZW50IG9mIHRoZSA8Yj5uYXZpZ2F0b3JDb250ZW50PC9iPiAKLSAqICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLiBUaGUgZmluZFhYWCgpIG1ldGhvZHMgc2VhcmNoIGZvciAnZW5hYmxlZCcgCi0gKiAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuIAotICogPC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIEEgbmV3IGluc3RhbmNlIG9mIHRoZSBjb250ZW50IHNlcnZpY2Ugc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIGVhY2ggdmlld2VyLgotICogQ2xpZW50cyBzaG91bGQgdXNlIHtAbGluayAjY3JlYXRlQ29tbW9uQ29udGVudFByb3ZpZGVyKCl9IGFuZCAKLSAqIHtAbGluayAjY3JlYXRlQ29tbW9uTGFiZWxQcm92aWRlcigpfSBmb3IgdGhlIHZpZXdlci4gRWFjaCBjb250ZW50IHNlcnZpY2UgdHJhY2tzIAotICogdGhlIHZpZXdlciBpdCBpcyBhdHRhY2hlZCB0by4gQ2xpZW50cyBtYXkgY3JlYXRlIHRoZSBjb250ZW50IHNlcnZpY2Ugd2l0aCBhIAotICogdmlld2VyIHVzaW5nICh7QGxpbmsgTmF2aWdhdG9yQ29udGVudFNlcnZpY2VGYWN0b3J5I2NyZWF0ZUNvbnRlbnRTZXJ2aWNlKFN0cmluZywgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyKX0pLgotICogQWx0ZXJuYXRpdmVseSwgd2hlbiB0aGUgY29udGVudCBwcm92aWRlciBpcyBjcmVhdGVkIGFuZCBzZXQgb24gYSB2aWV3ZXIsCi0gKiB7QGxpbmsgSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIE9iamVjdCwgT2JqZWN0KX0KLSAqIHdpbGwgYmUgY2FsbGVkIGFuZCB0aGUgY29udGVudCBwcm92aWRlciB3aWxsIHVwZGF0ZSB0aGUgdmlld2VyIHVzZWQgYnkgaXRzCi0gKiBiYWNraW5nIGNvbnRlbnQgc2VydmljZS4gVGhlcmVmb3JlLCBvbmx5IGVhY2ggY29udGVudCBzZXJ2aWNlIGhhcyBleGFjdGx5IG9uZQotICogY29udGVudCBwcm92aWRlciBhbmQgb25lIGxhYmVsIHByb3ZpZGVyLiAKLSAqIDwvcD4KLSAqIDxwPgotICogRXh0ZW5zaW9ucyBtYXkgYWxzbyBjb29yZGluYXRlIHRoZWlyIGJlaGF2aW9yIHRocm91Z2ggYSAKLSAqIHtAbGluayBJRXh0ZW5zaW9uU3RhdGVNb2RlbCBzdGF0ZSBtb2RlbH0uIFRoZSBzdGF0ZSBtb2RlbAotICogaG9sZHMgcHJvcGVydGllcyBhbmQgc3VwcG9ydHMgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycy4gCi0gKiBBY3Rpb25zIGNhbiB0b2dnbGUgdGhlIHNldHRpbmcgb2YgcHJvcGVydGllcyBhbmQgdGhlIAotICogY29ycmVzcG9uZGluZyBjb250ZW50L2xhYmVsIHByb3ZpZGVycyB3aWxsIHJlc3BvbmQgdG8gCi0gKiBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuIEVhY2ggPGI+bmF2aWdhdG9yQ29udGVudDwvYj4gZXh0ZW5zaW9uCi0gKiBoYXMgaXRzIG93biBjb250YWluZWQgc3RhdGUgbW9kZWwga2V5ZWQgb2ZmIG9mIHRoZSBjb250ZW50Ci0gKiBleHRlbnNpb24gaWQuICAgCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IHJlc3BvbmQgd2hlbiBjb250ZW50IGV4dGVuc2lvbnMgYXJlIGxvYWRlZCBieQotICogYXR0YWNoaW5nIGEge0BsaW5rIElOYXZpZ2F0b3JDb250ZW50U2VydmljZUxpc3RlbmVyfSB0bwotICogdGhlIGNvbnRlbnQgc2VydmljZS4gCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFNvbWUgZXh0ZW5zaW9ucyBtYXkgcHJvdmlkZSBjb250ZW50IG9yIGxhYmVsIHByb3ZpZGVycyB3aGljaAotICogaW1wbGVtZW50IHtAbGluayBJTWVtZW50b30uIENsaWVudHMgbXVzdCBjYWxsIHtAbGluayAjcmVzdG9yZVN0YXRlKElNZW1lbnRvKX0KLSAqIGFuZCB7QGxpbmsgI3NhdmVTdGF0ZShJTWVtZW50byl9IGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lcyAKLSAqIGZvciB0aGVzZSBleHRlbnNpb25zIHRvIHByZXBhcmUgdGhlbXNlbHZlcyB3aXRoIHRoZSBtZW1lbnRvLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgewotCi0JLyoqCi0JICogQ3JlYXRlIGEgQ29udGVudCBQcm92aWRlciB3aGljaCB3aWxsIHVzZSBhbiBlbmhhbmNlZCBkZWxlZ2F0aW9uIG1vZGVsIHRvCi0JICogbG9jYXRlIGV4dGVuc2lvbiBjb250ZW50IHByb3ZpZGVycyB1c2luZyB0aGlzIGNvbnRlbnQgc2VydmljZSBmb3IgZWFjaAotCSAqIGVsZW1lbnQgaW4gdGhlIHRyZWUuCi0JICogIAotCSAqIDxwPgotCSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIHJldHVybmVkIHdpbGwgcG9wdWxhdGUgdGhlIHJvb3QgCi0JICogb2YgdGhlIHZpZXdlciBpbiBvbmUgb2YgdHdvIHdheXMuIAotCSAqIDxwPgotCSAqIEluIHRoZSBmaXJzdCBhcHByb2FjaCwgdGhlIGNvbnRlbnQgcHJvdmlkZXIgd2lsbCBzZWVrIAotCSAqIG91dCBjb250ZW50IGV4dGVuc2lvbnMgd2hpY2ggYXJlIGJvdW5kIHVzaW5nIGEgCi0JICogPGI+dmlld2VyQ29udGVudEJpbmRpbmc8L2I+LiBJZiBhbnkgb2YgdGhlIGZvdW5kIAotCSAqIDxiPnZpZXdlckNvbnRlbnRCaW5kaW5nczwvYj4gZGVjbGFyZSB0aGUgPGk+aXNSb290PC9pPiAKLQkgKiBhdHRyaWJ1dGUgb24gYXMgdHJ1ZSwgdGhlbiB0aGF0IHNldCBvZiBleHRlbnNpb25zIHdpbGwgCi0JICogYmUgY29uc3VsdGVkIGZvciB0aGUgcm9vdCBlbGVtZW50cyBvZiB0aGUgdHJlZS4gCi0JICogVGhlIGlucHV0IG9mIHRoZSB2aWV3ZXIgd2lsbCBiZSBzdXBwbGllZCB0byBlYWNoCi0JICogb2YgdGhlaXIge0BsaW5rIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCl9Ci0JICogbWV0aG9kcyBhbmQgYWdncmVnYXRlIHRoZSByZXN1bHRzIGZvciB0aGUgcm9vdCBvZiB0aGUgdmlld2VyLiAKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSW4gdGhlIHNlY29uZCBhcHByb2FjaCwgaWYgbm8gPGI+dmlld2VyQ29udGVudEJpbmRpbmdzPC9iPiAKLQkgKiBkZWNsYXJlIDxpPmlzUm9vdDwvaT4gYXMgdHJ1ZSwgdGhlbiBhbGwgbWF0Y2hpbmcgZXh0ZW5zaW9ucwotCSAqIGFyZSBjb25zdWx0ZWQgYmFzZWQgb24gdGhlaXIgPGI+dHJpZ2dlclBvaW50czwvYj4gZXhwcmVzc2lvbgotCSAqIGluIHRoZSA8Yj5uYXZpZ2F0b3JDb250ZW50PC9iPiBleHRlbnNpb24uIEFueSBtYXRjaGluZyBleHRlbnNpb25zCi0JICogYXJlIHRoZW4gY29uc3VsdGVkIHZpYSB0aGVpciB7QGxpbmsgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KX0KLQkgKiBtZXRob2RzIGFuZCB0aGUgcmVzdWx0cyBhcmUgYWdncmVnYXRlZCBpbnRvIHRoZSByb290LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBZnRlciB0aGUgcm9vdCBpcyBwb3B1bGF0ZWQsIHRoZSBjaGlsZHJlbiBvZiBlYWNoIHJvb3QgZWxlbWVudAotCSAqIGFyZSBkZXRlcm1pbmVkIGJ5IGNvbnN1bHRpbmcgdGhlIHNvdXJjZSBleHRlbnNpb24gYW5kIGFsbCAKLQkgKiBleHRlbnNpb24gd2hpY2ggZGVzY3JpYmUgdGhlIGVsZW1lbnQgaW4gdGhlaXIgCi0JICogPGI+dHJpZ2dlclBvaW50czwvYj4gZXhwcmVzc2lvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgY2xpZW50cyB3aXNoIHRvIHVzZSBhIHZpZXdlciBvdGhlciB0aGFuIHRoZSBDb21tb25WaWV3ZXIsIHRoZW4KLQkgKiB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIGNvbnRlbnQgcHJvdmlkZXIsIGFuZCBzZXR0aW5nIGl0Ci0JICogb24gdGhlaXIgdmlld2VyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGVuaGFuY2VkIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCB3aWxsIHVzZSAKLQkgKiAJCQl0aGlzIGNvbnRlbnQgc2VydmljZSB0byBkcml2ZSB0aGUgdmlld2VyLgotCSAqLwotCUlUcmVlQ29udGVudFByb3ZpZGVyIGNyZWF0ZUNvbW1vbkNvbnRlbnRQcm92aWRlcigpOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgTGFiZWwgUHJvdmlkZXIgd2hpY2ggd2lsbCB1c2UgYW4gZW5oYW5jZWQgZGVsZWdhdGlvbiBtb2RlbAotCSAqIHRvIGxvY2F0ZSBleHRlbnNpb24gbGFiZWwgcHJvdmlkZXJzIHVzaW5nIHRoaXMgY29udGVudCBzZXJ2aWNlIGZvciAKLQkgKiBlYWNoIGVsZW1lbnQgaW4gdGhlIHRyZWUuIAotCSAqIAotCSAqIDxwPgotCSAqIFRoZSBsYWJlbCBvZiBlYWNoIGVsZW1lbnQgaXMgZGV0ZXJtaW5lZCBieSBjb25zdWx0aW5nIHRoZSBzb3VyY2UKLQkgKiBvZiB0aGUgZWxlbWVudC4gSWYgdGhlIHNvdXJjZSBjaG9vc2VzIHRvIHJldHVybiBudWxsLCB0aGVuIAotCSAqIG90aGVyIGV4dGVuc2lvbnMgd2hpY2ggZGVjbGFyZSB0aGUgZWxlbWVudCBpbiB0aGVpciAKLQkgKiA8Yj50cmlnZ2VyUG9pbnRzPC9iPiBleHRlbnNpb24gYXJlIGNvbnN1bHRlZC4gVGhlIGZpcnN0Ci0JICogbm9uLW51bGwgdmFsdWUgaXMgdXNlZCAoaW5jbHVkaW5nIHRoZSBlbXB0eSBsYWJlbCkuCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIElmIGNsaWVudHMgd2lzaCB0byB1c2UgYSB2aWV3ZXIgb3RoZXIgdGhhbiB0aGUgQ29tbW9uVmlld2VyLCB0aGVuCi0JICogdGhleSBhcmUgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBsYWJlbCBwcm92aWRlciwgYW5kIHNldHRpbmcgaXQKLQkgKiBvbiB0aGVpciB2aWV3ZXIuCi0JICogPC9wPgotCSAqIEByZXR1cm4gQW4gZW5oYW5jZWQgbGFiZWwgcHJvdmlkZXIgdGhhdCB3aWxsIHVzZSAKLQkgKiAJCQl0aGlzIGNvbnRlbnQgc2VydmljZSB0byBkcml2ZSBsYWJlbHMgaW4gdGhlIHZpZXdlci4KLQkgKi8KLQlJTGFiZWxQcm92aWRlciBjcmVhdGVDb21tb25MYWJlbFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBUaGUgc3RhdGUgbW9kZWwgc3RvcmVzIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAKLQkgKiBleHRlbnNpb24uIEVhY2ggY29udGVudCBleHRlbnNpb24gaGFzIGl0cyBvd24gY29udGFpbmVkCi0JICogc3RhdGUgbW9kZWwuIENvbXBvbmVudHMgb2YgdGhlIGV4dGVuc2lvbiAoY29udGVudCBwcm92aWRlciwKLQkgKiBsYWJlbCBwcm92aWRlciwgYWN0aW9uIHByb3ZpZGVycywgZXRjKSBtYXkgYXR0YWNoIHRoZW1zZWx2ZXMKLQkgKiBhcyBsaXN0ZW5lcnMgdG8gdGhlIG1vZGVsIAotCSAqICh7QGxpbmsgSUV4dGVuc2lvblN0YXRlTW9kZWwjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKX0pCi0JICogYW5kIHJlc3BvbmQgdG8gY2hhbmdlcyB0byB0aGUgdmFsdWVzIG9mIHRoZSBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBhbkV4dGVuc2lvbklkIFRoZSBleHRlbnNpb24gaWQgZGVmaW5lZCBieSBhIDxiPm5hdmlnYXRvckNvbnRlbnQ8L2I+IGV4dGVuc2lvbi4KLQkgKiBAcmV0dXJuIFRoZSBzdGF0ZSBtb2RlbCBmb3IgdGhlIGdpdmVuIGV4dGVuc2lvbiBpZC4KLQkgKi8KLQlJRXh0ZW5zaW9uU3RhdGVNb2RlbCBmaW5kU3RhdGVNb2RlbChTdHJpbmcgYW5FeHRlbnNpb25JZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgb2YgY29udGVudCBwcm92aWRlcnMgdGhhdCBjb3VsZCBwcm92aWRlCi0JICogYSBwYXJlbnQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBUaGVzZSBjb250ZW50IGV4dGVuc2lvbnMKLQkgKiBhcmUgZGV0ZXJtaW5lZCBieSBjb25zdWx0aW5nIHRoZSA8Yj5wb3NzaWJsZUNoaWxkcmVuPC9iPiAKLQkgKiBleHByZXNzaW9uIGluIHRoZSA8Yj5uYXZpZ2F0b3JDb250ZW50PC9iPiBleHRlbnNpb24uCi0JICogCi0JICogPHA+Ci0JICogQ2xpZW50cyB0aGF0IHdpc2ggdG8gdGFwIGludG8gdGhlIGxpbmsgd2l0aCBlZGl0b3Igc3VwcG9ydAotCSAqIG11c3QgZGVzY3JpYmUgYWxsIG9mIHRoZWlyIHBvc3NpYmxlIGNoaWxkcmVuIGluIHRoZWlyIAotCSAqIDxiPnBvc3NpYmxlQ2hpbGRyZW48L2I+IGV4cHJlc3Npb25zLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5FbGVtZW50IEFuIGVsZW1lbnQgZnJvbSB0aGUgdHJlZSAoZ2VuZXJhbGx5IGZyb20gYSBzZXRTZWxlY3Rpb24oKSBtZXRob2QpLiAKLQkgKiBAcmV0dXJuIFRoZSBzZXQgb2YgY29udGVudCBwcm92aWRlcnMgdGhhdCBtYXkgYmUgYWJsZSB0byBwcm92aWRlIGEgcGFyZW50LiAKLQkgKi8KLQlJVHJlZUNvbnRlbnRQcm92aWRlcltdIGZpbmRQYXJlbnRDb250ZW50UHJvdmlkZXJzKE9iamVjdCBhbkVsZW1lbnQpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJuIGFsbCBvZiB0aGUgY29udGVudCBwcm92aWRlcnMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZSB2aWV3ZXIuIFRoZQotCSAqIHZpZXdlciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBJRCB1c2VkIHRvIGNyZWF0ZSB0aGUgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIAotCSAqICh7QGxpbmsgI2dldFZpZXdlcklkKCkgfSkuIFNlZSB7QGxpbmsgI2NyZWF0ZUNvbW1vbkNvbnRlbnRQcm92aWRlcigpIH0KLQkgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgY29udGVudCBwcm92aWRlcnMgYXJlIGxvY2F0ZWQKLQkgKiBmb3IgdGhlIHJvb3Qgb2YgdGhlIHZpZXdlci4gVGhlIHJvb3QgY29udGVudCBwcm92aWRlcnMgYXJlIGNhbGN1bGF0ZWQgb25jZS4gSWYKLQkgKiBhIG5ldyBlbGVtZW50IGlzIHN1cHBsaWVkLCBhIGNsaWVudCBtdXN0IGNhbGwge0BsaW5rICN1cGRhdGUoKSB9IHByaW9yIGluCi0JICogb3JkZXIgdG8gcmVzZXQgdGhlIGNhbGN1bGF0ZWQgcm9vdCBwcm92aWRlcnMuIAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5FbGVtZW50IEFuIGVsZW1lbnQgZnJvbSB0aGUgdHJlZSAoZ2VuZXJhbGx5IHRoZSBpbnB1dCBvZiB0aGUgdmlld2VyKQotCSAqIEByZXR1cm4gVGhlIHNldCBvZiBjb250ZW50IHByb3ZpZGVycyB0aGF0IGNhbiBwcm92aWRlIHJvb3QgZWxlbWVudHMgZm9yIGEgdmlld2VyLgotCSAqLwotCUlUcmVlQ29udGVudFByb3ZpZGVyW10gZmluZFJvb3RDb250ZW50UHJvdmlkZXJzKE9iamVjdCBhbkVsZW1lbnQpOwotCi0JLyoqIAotCSAqIFJldHVybiBhbGwgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXJzIHRoYXQgYXJlIGVuYWJsZWQgZm9yIHRoZSBnaXZlbgotCSAqIGVsZW1lbnQuIEFuICdlbmFibGVkJyBjb250ZW50IHByb3ZpZGVyIGlzIGVpdGhlciB0aGUgKDEpIHNvdXJjZQotCSAqIG9mIHRoZSBlbGVtZW50ICh0aGUgZWxlbWVudCB3YXMgcmV0dXJuZWQgYXMgYSBjaGlsZCBvZiBpdHMgCi0JICogcGFyZW50IGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyKSBvciAoMikgYSBjb250ZW50IGV4dGVuc2lvbgotCSAqIHdoaWNoIGRlc2NyaWJlcyB0aGUgZWxlbWVudCBpbiBpdHMgPGI+dHJpZ2dlclBvaW50czwvYj4gZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYW5FbGVtZW50IEFuIGVsZW1lbnQgZnJvbSB0aGUgdHJlZSAoZ2VuZXJhbGx5IHRoZSBlbGVtZW50IGV4cGFuZGVkIGJ5IHRoZSB1c2VyKQotCSAqIEByZXR1cm4gVGhlIHNldCBvZiBjb250ZW50IHByb3ZpZGVycyB0aGF0IGNhbiBwcm92aWRlIHZhbGlkIGNoaWxkcmVuIGZvciB0aGUgZWxlbWVudC4KLQkgKi8KLQlJVHJlZUNvbnRlbnRQcm92aWRlcltdIGZpbmRSZWxldmFudENvbnRlbnRQcm92aWRlcnMoT2JqZWN0IGFuRWxlbWVudCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBSZXR1cm4gYWxsIG9mIHRoZSBsYWJlbCBwcm92aWRlcnMgdGhhdCBhcmUgZW5hYmxlZCBmb3IgdGhlIGdpdmVuCi0JICogZWxlbWVudC4gQSBsYWJlbCBwcm92aWRlciBpcyAnZW5hYmxlZCcgaWYgaXRzIGNvcnJlc3BvbmRpbmcgY29udGVudCAKLQkgKiBwcm92aWRlciByZXR1cm5lZCB0aGUgZWxlbWVudCwgb3IgdGhlIGVsZW1lbnQgaXMgZGVzY3JpYmVkIGluIHRoZQotCSAqIGNvbnRlbnQgZXh0ZW5zaW9uJ3MgPGI+dHJpZ2dlclBvaW50czwvYj4gZXhwcmVzc2lvbi4gIAotCSAqIAotCSAqIEBwYXJhbSBhbkVsZW1lbnQgQW4gZWxlbWVudCBmcm9tIHRoZSB0cmVlIChhbnkgZWxlbWVudCBjb250cmlidXRlZCB0byB0aGUgdHJlZSkuIAotCSAqIEByZXR1cm4gVGhlIHNldCBvZiBsYWJlbCBwcm92aWRlcnMgdGhhdCBtYXkgYmUgYWJsZSB0byBwcm92aWRlIGEgdmFsaWQgKG5vbi1udWxsKSBsYWJlbC4KLQkgKi8KLQotCUlMYWJlbFByb3ZpZGVyW10gZmluZFJlbGV2YW50TGFiZWxQcm92aWRlcnMoT2JqZWN0IGFuRWxlbWVudCk7Ci0KLQkvKioKLQkgKiBUaGUgdmlld2VyIGlkIGlzIHVzZWQgdG8gbG9jYXRlIG1hdGNoaW5nIDxiPnZpZXdlckNvbnRlbnRCaW5kaW5nczwvYj4uIAotCSAqIEluIGdlbmVyYWwsIHRoaXMgd291bGQgYmUgdGhlIGlkIG9mIHRoZSB2aWV3IGRlZmluZWQgYnkgYSAKLQkgKiA8Yj5vcmcuZWNsaXBzZS51aS52aWV3czwvYj4gZXh0ZW5zaW9uLiBIb3dldmVyLCB0aGVyZSBpcyBubyAKLQkgKiBmb3JtYWwgcmVxdWlyZW1lbnQgdGhhdCB0aGlzIGlzIHRoZSBjYXNlLiAKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSB2aWV3ZXJJZCB1c2VkIHRvIGNyZWF0ZSB0aGlzIGNvbnRlbnQgc2VydmljZS4KLQkgKi8KLQlTdHJpbmcgZ2V0Vmlld2VySWQoKTsKLQotCS8qKgotCSAqIFRoZSB2aWV3ZXIgZGVzY3JpcHRvciBwcm92aWRlcyBzb21lIGJhc2ljIGluZm9ybWF0aW9uIGFib3V0Ci0JICogdGhlIGFic3RyYWN0IHZpZXdlciB0aGF0IHVzZXMgdGhpcyBjb250ZW50IHNlcnZpY2UuIAotCSAqIAotCSAqIEByZXR1cm4gVGhlIHZpZXdlciBkZXNjcmlwdG9yIGZvciB0aGlzIGNvbnRlbnQgc2VydmljZS4gCi0JICogQHNlZSBJTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvcgotCSAqLwotCUlOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yIGdldFZpZXdlckRlc2NyaXB0b3IoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBzZXQgb2YgdmlzaWJsZSBleHRlbnNpb24gaWRzIGZvciB0aGlzIGNvbnRlbnQgc2VydmljZQotCSAqLwotCVN0cmluZ1tdIGdldFZpc2libGVFeHRlbnNpb25JZHMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBzZXQgb2YgJ3Zpc2libGUnIGNvbnRlbnQgZGVzY3JpcHRvcnMgZm9yIHRoaXMgY29udGVudCBzZXJ2aWNlCi0JICovCi0JSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yW10gZ2V0VmlzaWJsZUV4dGVuc2lvbnMoKTsKLQotCS8qKgotCSAqIEFjdGl2YXRlIHRoZSBleHRlbnNpb25zIHNwZWNpZmllZCBieSB0aGUgZXh0ZW5zaW9uSWRzIGFycmF5LiBDbGllbnRzCi0JICogbWF5IGFsc28gY2hvb3NlIHRvIGRpc2FibGUgYWxsIG90aGVyIGV4dGVuc2lvbnMuIFRoZSBzZXQgb2YgZGVzY3JpcHRvcnMKLQkgKiByZXR1cm5lZCBpcyB0aGUgc2V0IHRoYXQgd2VyZSBhY3RpdmF0ZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjYWxsLiBJbgotCSAqIHRoZSBjYXNlIG9mIHRoaXMgbWV0aG9kLCB0aGF0IG1lYW5zIHRoYXQgYSBkZXNjcmlwdG9yIHdpbGwgYmUgcmV0dXJuZWQKLQkgKiBmb3IgZWFjaCBleHRlbnNpb25JZCBpbiB0aGUgYXJyYXksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGF0IGV4dGVuc2lvbiAKLQkgKiBpcyBhbHJlYWR5IGVuYWJsZWQuIAotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb25JZHMKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgdG8gYWN0aXZhdGUKLQkgKiBAcGFyYW0gdG9EZWFjdGl2YXRlQWxsT3RoZXJzCi0JICogICAgICAgICAgICBUcnVlIHdpbGwgZGVhY3RpdmF0ZSBhbGwgb3RoZXIgZXh0ZW5zaW9uczsgRmFsc2Ugd2lsbCBsZWF2ZSB0aGUKLQkgKiAgICAgICAgICAgIG90aGVyIGFjdGl2YXRpb25zIGFzLWlzCi0JICogQHJldHVybiBBIGxpc3Qgb2YgYWxsIElOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcnMgdGhhdCB3ZXJlIGVuYWJsZWQgYXMgYQotCSAqICAgICAgICAgcmVzdWx0IG9mIHRoaXMgY2FsbC4gVGhpcyB3aWxsIGJlIHRoZSBzZXQgb2YgSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9ycwotCSAqICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyBleGFjdGx5IHRvIHRoZSBzZXQgb2YgZ2l2ZW4gZXh0ZW5zaW9uSWRzLgotCSAqLyAKLQlJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbXSBhY3RpdmF0ZUV4dGVuc2lvbnMoU3RyaW5nW10gZXh0ZW5zaW9uSWRzLAotCQkJYm9vbGVhbiB0b0RlYWN0aXZhdGVBbGxPdGhlcnMpOwotCi0JLyoqCi0JICogRGVhY3RpdmF0ZSB0aGUgZXh0ZW5zaW9ucyBzcGVjaWZpZWQgYnkgdGhlIGV4dGVuc2lvbklkcy4gQ2xpZW50cyBtYXkgCi0JICogY2hvb3NlIHRvIGFjdGl2YXRlIGFsbCBvdGhlciBleHRlbnNpb25zIHdoaWNoIGFyZSBub3QgZXhwbGljaXRseSAKLQkgKiBkaXNhYmxlZC4gSWYgdG9BY3RpdmF0ZUFsbE90aGVycyBpcyB0cnVlLCB0aGUgYXJyYXkgb2YgcmV0dXJuZWQgCi0JICogZGVzY3JpcHRvcnMgd2lsbCBiZSB0aGUgY29sbGVjdGlvbiBvZiBhbGwgZXh0ZW5zaW9ucyBub3QgCi0JICogc3BlY2lmaWVkIGluIHRoZSBleHRlbnNpb25JZHMgYXJyYXkuIElmIGl0IGlzIGZhbHNlLCB0aGUgYXJyYXkKLQkgKiB3aWxsIGJlIGVtcHR5LgotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb25JZHMKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgdG8gYWN0aXZhdGUKLQkgKiBAcGFyYW0gdG9BY3RpdmF0ZUFsbE90aGVycwotCSAqICAgICAgICAgICAgVHJ1ZSB3aWxsIGFjdGl2YXRlIGFsbCBvdGhlciBleHRlbnNpb25zOyBGYWxzZSB3aWxsIGxlYXZlIHRoZQotCSAqICAgICAgICAgICAgb3RoZXIgYWN0aXZhdGlvbnMgYXMtaXMKLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBhbGwgSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9ycyB0aGF0IHdlcmUgZW5hYmxlZCBhcyBhCi0JICogICAgICAgICByZXN1bHQgb2YgdGhpcyBjYWxsLiBJZiB0b0FjdGl2YXRlQWxsT3RoZXJzIGlzIGZhbHNlLCB0aGUgcmVzdWx0IAotCSAqICAgICAgICAgd2lsbCBiZSBhbiBlbXB0eSBhcnJheS4gT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIHRoZSBzZXQgb2YgYWxsIHZpc2libGUKLQkgKiAgICAgICAgIGV4dGVuc2lvbnMgbWludXMgdGhvc2UgZ2l2ZW4gaW4gdGhlICdleHRlbnNpb25JZHMnIHBhcmFtZXRlci4gCi0JICovCi0JSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yW10gZGVhY3RpdmF0ZUV4dGVuc2lvbnMoU3RyaW5nW10gZXh0ZW5zaW9uSWRzLAotCQkJYm9vbGVhbiB0b0FjdGl2YXRlQWxsT3RoZXJzKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhTWVtZW50byBUaGUgbWVtZW50byBmb3IgZXh0ZW5zaW9ucyB0byB1c2Ugd2hlbiByZXN0b3JpbmcgcHJldmlvdXMgc2V0dGluZ3MuIAotCSAqLwotCXZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhTWVtZW50byBUaGUgbWVtZW50byBmb3IgZXh0ZW5zaW9ucyB0byB1c2Ugd2hlbiBwZXJzaXN0aW5nIHByZXZpb3VzIHNldHRpbmdzLgotCSAqLwotCXZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKTsKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIGFuIGV4dGVuc2lvbiBpcyBsb2FkZWQuCi0JICogQHBhcmFtIGFMaXN0ZW5lciBBIGxpc3RlbmVyIHRvIGJlIGF0dGFjaGVkLgotCSAqLwotCXZvaWQgYWRkTGlzdGVuZXIoSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlTGlzdGVuZXIgYUxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIChieSBpZGVudGl0eSkgZnJvbSB0aGUgc2V0IG9mIGxpc3RlbmVycy4KLQkgKiBAcGFyYW0gYUxpc3RlbmVyIEEgbGlzdGVuZXIgdG8gYmUgZGV0YWNoZWQuCi0JICovCi0Jdm9pZCByZW1vdmVMaXN0ZW5lcihJTmF2aWdhdG9yQ29udGVudFNlcnZpY2VMaXN0ZW5lciBhTGlzdGVuZXIpOwotCi0JLyoqCi0JICogVGhlIHJvb3QgY29udGVudCBwcm92aWRlcnMgYXJlIGNhbGN1bGF0ZWQgb25jZSBpbiB7QGxpbmsgI2ZpbmRSb290Q29udGVudFByb3ZpZGVycyhPYmplY3QpIH0KLQkgKiBhbmQgcmVzZXQgYnkgdGhpcyBtZXRob2QuIFRoZSBhdHRhY2hlZCB2aWV3ZXIgaXMgYWxzbyByZWZyZXNoZWQKLQkgKiBhcyBhIHJlc3VsdCBvZiB0aGlzIG1ldGhvZC4gCi0JICoKLQkgKi8KLQl2b2lkIHVwZGF0ZSgpOwotCi0JLyoqCi0JICogUmVsZWFzZSBhbnkgYWNxdWlyZWQgcmVzb3VyY2VzIGFuZCBpbnN0YW50aWF0ZWQgY29udGVudCBleHRlbnNpb25zLiAKLQkgKgotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lOYXZpZ2F0b3JDb250ZW50U2VydmljZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL0lOYXZpZ2F0b3JDb250ZW50U2VydmljZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMmQzNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JTmF2aWdhdG9yQ29udGVudFNlcnZpY2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yOwotCi0KLQotLyoqCi0gKiA8cD4KLSAqIFVzZWQgYnkgY2xpZW50cyB3aG8gd291bGQgbGlrZSB0byBsaXN0ZW4gZm9yIHRoZSBsb2FkIGV2ZW50IG9mIGFtCi0gKiB7QGxpbmsgSU5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24gfS4KLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2VMaXN0ZW5lciB7Ci0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgbGlzdGVuZXIgdGhhdCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uCi0JICogaGFzIG5vdyBiZWVuIGxvYWRlZC4gRXh0ZW5zaW9ucyBhcmUgbG9hZGVkIGFzIAotCSAqIG5lZWRlZCBhcyB0aGUgdXNlciBleHBhbmRzIG5vZGVzIGluIHRoZSB0cmVlIHZpZXdlci4gCi0JICogCi0JICogQHBhcmFtIGFuRXh0ZW5zaW9uIFRoZSBleHRlbnNpb24gdGhhdCB3YXMgbG9hZGVkLgotCSAqLwotCXZvaWQgb25Mb2FkKElOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uIGFuRXh0ZW5zaW9uKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MjAyZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yOwotCi0KLQotLyoqCi0gKiA8cD4KLSAqIEhhbmRsZXMgdGhlIGZpbHRlcmluZyByZXNwb25zaWJpbGl0aWVzIGZvciBleHRlbnNpb25zIG9mIHRoZQotICogPGI+b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmNvbW1vbkZpbHRlciA8L2I+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqICAgCi0gKjxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICo8L3A+Ci0gKjxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICo8L3A+Ci0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlciB7Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSB2aWV3ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhVmlld2VyCi0JICogICAgICAgICAgICBUaGUgaW5zdGFuY2Ugb2Yge0BsaW5rIENvbW1vblZpZXdlcn10aGF0IGlzIHJlcXVlc3RpbmcgdGhlIGZpbHRlcmluZyBhY3Rpb24KLQkgKiBAcGFyYW0gYVBhcmVudEVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgb2JqZWN0IGluIHRoZSB0cmVlIHRoYXQgd2lsbCBoYXZlIGNoaWxkcmVuIHNwZWNpZmllZCBieSB0aGVFbGVtZW50cwotCSAqIEBwYXJhbSB0aGVFbGVtZW50cwotCSAqICAgICAgICAgICAgVGhlIG9yaWdpbmFsIGxpc3Qgb2YgZWxlbWVudHMgYXMgcmV0dXJuZWQgYnkgdGhlIHZpZXdlcidzIGNvbnRlbnQgcHJvdmlkZXIKLQkgKiBAcmV0dXJuIEEgc3Vic2V0IG9mIHRoZUVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgdmlld2VyLgotCSAqLwotCU9iamVjdFtdIHNlbGVjdChDb21tb25WaWV3ZXIgYVZpZXdlciwgT2JqZWN0IGFQYXJlbnRFbGVtZW50LCBPYmplY3RbXSB0aGVFbGVtZW50cyk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNoaWxkIGFuRWxlbWVudCBzaG91bGQgYmUgZGlzcGxheWVkIHdpdGhpbiB0aGUgdmlld2VyIGFWaWV3ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhVmlld2VyCi0JICogICAgICAgICAgICBUaGUgaW5zdGFuY2Ugb2Yge0BsaW5rIENvbW1vblZpZXdlcn10aGF0IGlzIHJlcXVlc3RpbmcgdGhlIGZpbHRlcmluZyBhY3Rpb24KLQkgKiBAcGFyYW0gYVBhcmVudEVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgb2JqZWN0IGluIHRoZSB0cmVlIHRoYXQgaGFzIHRoZSBjaGlsZCBhbkVsZW1lbnQKLQkgKiBAcGFyYW0gYW5FbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgY2hpbGQgdW5kZXIgaW50ZXJyb2dhdGlvbiBvZiB0aGUgRmlsdGVyIGlucXVpc2l0aW9uCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBjaGlsZCBhbkVsZW1lbnQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgdmlld2VyIGFWaWV3ZXIgYXMgYSBjaGlsZCBvZgotCSAqICAgICAgICAgYVBhcmVudEVsZW1lbnQKLQkgKi8KLQlib29sZWFuIHNlbGVjdChDb21tb25WaWV3ZXIgYVZpZXdlciwgT2JqZWN0IGFQYXJlbnRFbGVtZW50LCBPYmplY3QgYW5FbGVtZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9JTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDYzNDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvSU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLkluc2VydGlvblBvaW50OwotCi0vKioKLSAqIFByb3ZpZGVzIGEgYmFzaWMgbWV0YWRhdGEgYWJvdXQgdGhlIGFic3RyYWN0IHZpZXdlciBmb3IgYSBwYXJ0aWN1bGFyCi0gKiBjb250ZW50IHNlcnZpY2UuCi0gKiAKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvciB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgdmlld2VyIHRhcmdldGVkIGJ5IHRoaXMgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSB2aWV3ZXIgdGFyZ2V0ZWQgYnkgdGhpcyBleHRlbnNpb24uCi0JICovCi0JU3RyaW5nIGdldFZpZXdlcklkKCk7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcG9wdXAgbWVudSBpZCBpcyB0aGUgdmlld2VyIGlkLiBDbGllbnRzIG1heQotCSAqIG92ZXJyaWRlIHRoaXMgdmFsdWUgdXNpbmcgYSA8Yj5uYXZpZ2F0b3JDb25maWd1cmF0aW9uPC9iPiBleHRlbnNpb24uCi0JICogCi0JICogQHJldHVybiBUaGUgaWQgb2YgdGhlIGNvbnRleHQgbWVudSBvZiB0aGUgdmlld2VyLgotCSAqLwotCVN0cmluZyBnZXRQb3B1cE1lbnVJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb250ZW50IGV4dGVuc2lvbiBvZiB0aGUgZ2l2ZW4gaWQgaXMgJ3Zpc2libGUnLiBBCi0JICogY29udGVudCBleHRlbnNpb24gaXMgJ3Zpc2libGUnIGlmIGl0IG1hdGNoZXMgYSB2aWV3ZXJDb250ZW50QmluZGluZyBmb3IKLQkgKiB0aGUgZ2l2ZW4gdmlld2VyIGlkLgotCSAqIAotCSAqIEBwYXJhbSBhQ29udGVudEV4dGVuc2lvbklkCi0JICogICAgICAgICAgICBUaGUgaWQgdG8gcXVlcnkKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnRlbnQgZXh0ZW5zaW9uIG1hdGNoZXMgYSB2aWV3ZXJDb250ZW50QmluZGluZyBmb3IKLQkgKiAgICAgICAgIHRoZSB2aWV3ZXIgaWQgb2YgdGhpcyBkZXNjcmlwdG9yLgotCSAqLwotCWJvb2xlYW4gaXNWaXNpYmxlQ29udGVudEV4dGVuc2lvbihTdHJpbmcgYUNvbnRlbnRFeHRlbnNpb25JZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFjdGlvbiBleHRlbnNpb24gb2YgdGhlIGdpdmVuIGlkIGlzICd2aXNpYmxlJy4gQW4KLQkgKiBhY3Rpb24gZXh0ZW5zaW9uIGlzICd2aXNpYmxlJyBpZiBpdCBtYXRjaGVzIGEgdmlld2VyQWN0aW9uQmluZGluZyBmb3IgdGhlCi0JICogZ2l2ZW4gdmlld2VyIGlkLgotCSAqIAotCSAqIEBwYXJhbSBhbkFjdGlvbkV4dGVuc2lvbklkCi0JICogICAgICAgICAgICBUaGUgaWQgdG8gcXVlcnkKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFjdGlvbiBleHRlbnNpb24gbWF0Y2hlcyBhIHZpZXdlckFjdGlvbkJpbmRpbmcgZm9yCi0JICogICAgICAgICB0aGUgdmlld2VyIGlkIG9mIHRoaXMgZGVzY3JpcHRvci4KLQkgKi8KLQlib29sZWFuIGlzVmlzaWJsZUFjdGlvbkV4dGVuc2lvbihTdHJpbmcgYW5BY3Rpb25FeHRlbnNpb25JZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRlbnQgZXh0ZW5zaW9uIG9mIHRoZSBnaXZlbiBpZCBtYXRjaGVzIGEKLQkgKiB2aWV3ZXJDb250ZW50QmluZGluZyBleHRlbnNpb24gdGhhdCBkZWNsYXJlcyBpc1Jvb3QgYXMgdHJ1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gYUNvbnRlbnRFeHRlbnNpb25JZAotCSAqICAgICAgICAgICAgVGhlIGlkIHRvIHF1ZXJ5Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBjb250ZW50IGV4dGVuc2lvbiBtYXRjaGVzIGEgdmlld2VyQ29udGVudEJpbmRpbmcKLQkgKiAgICAgICAgIHdoaWNoIGRlY2xhcmVzICdpc1Jvb3QnIGFzIHRydWUgZm9yIHRoZSB2aWV3ZXIgaWQgb2YgdGhpcwotCSAqICAgICAgICAgZGVzY3JpcHRvci4KLQkgKi8KLQlib29sZWFuIGlzUm9vdEV4dGVuc2lvbihTdHJpbmcgYUNvbnRlbnRFeHRlbnNpb25JZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgZXhpc3RzIGF0IGxlYXN0IG9uZSBtYXRjaGluZyB2aWV3ZXJDb250ZW50QmluZGluZwotCSAqIHdoaWNoIGRlY2xhcmVzIGlzUm9vdCBhcyB0cnVlLiBUaGlzIGJlaGF2aW9yIHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQKLQkgKiBlbmFibGVtZW50IGZvciB0aGUgdmlld2VyIHJvb3QuCi0JICogCi0JICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGV4aXN0cyBhIG1hdGNoaW5nIHZpZXdlckNvbnRlbnRCaW5kaW5nIHdoaWNoCi0JICogICAgICAgICBkZWNsYXJlcyBpc1Jvb3QgYXMgdHJ1ZS4KLQkgKi8KLQlib29sZWFuIGhhc092ZXJyaWRkZW5Sb290RXh0ZW5zaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGJ5IGRlZmF1bHQuIEEgdHJ1ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBvYmplY3QgYW5kIHZpZXcKLQkgKiBjb250cmlidXRpb25zIHNob3VsZCBiZSBzdXBwb3J0ZWQgYnkgdGhlIHBvcHVwIG1lbnUgb2YgYW55IHZpZXdlcgotCSAqIGRlc2NyaWJlZCBieSB0aGlzIHZpZXdlciBkZXNjcmlwdG9yLiBUaGUgdmFsdWUgbWF5IGJlIG92ZXJyaWRkZW4gZnJvbSB0aGUKLQkgKiAmbHQ7cG9wdXBNZW51IC8mZ3Q7IGNoaWxkIGVsZW1lbnQgb2YgdGhlICZsdDt2aWV3ZXIgLyZndDsgZWxlbWVudCBpbiB0aGUKLQkgKiA8Yj5vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld2VyPC9iPiBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogQHJldHVybiBUcnVlIGlmIG9iamVjdC92aWV3IGNvbnRyaWJ1dGlvbnMgc2hvdWxkIGJlIGFsbG93ZWQgb3IgRmFsc2UKLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIGFsbG93c1BsYXRmb3JtQ29udHJpYnV0aW9uc1RvQ29udGV4dE1lbnUoKTsKLQotCS8qKgotCSAqIAotCSAqIEN1c3RvbSBpbnNlcnRpb24gcG9pbnRzIGFyZSBkZWNsYXJlZCB0aHJvdWdoIGEgbmVzdGVkICdwb3B1cE1lbnUnIGVsZW1lbnQKLQkgKiBpbiB0aGUgPGI+b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdlcjwvYj4gZXh0ZW5zaW9uIHBvaW50LiBFYWNoCi0JICogaW5zZXJ0aW9uIHBvaW50IHJlcHJlc2VudHMgZWl0aGVyIGEge0BsaW5rIFNlcGFyYXRvcn0gb3Ige0BsaW5rIEdyb3VwTWFya2VyfSBpbgotCSAqIHRoZSBjb250ZXh0IG1lbnUgb2YgdGhlIHZpZXdlci48cD4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzZXQgb2YgY3VzdG9tIGluc2VydGlvbiBwb2ludHMsIGlmIGFueS4gQSBudWxsIGxpc3QgaW5kaWNhdGVzCi0JICogICAgICAgICB0aGUgZGVmYXVsdCBzZXQgKGFzIGRlZmluZWQgYnkge0BsaW5rIE5hdmlnYXRvckFjdGlvblNlcnZpY2V9KQotCSAqICAgICAgICAgc2hvdWxkIGJlIHVzZWQuIEFuIGVtcHR5IGxpc3QgaW5kaWNhdGVzIHRoZXJlIGFyZSBubyBkZWNsYXJhdGl2ZQotCSAqICAgICAgICAgaW5zZXJ0aW9uIHBvaW50cy4KLQkgKi8KLQlJbnNlcnRpb25Qb2ludFtdIGdldEN1c3RvbUluc2VydGlvblBvaW50cygpOwotIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvTmF2aWdhdG9yQWN0aW9uU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YmU4MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmFjdGlvbnMuQ29tbW9uQWN0aW9uRGVzY3JpcHRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmFjdGlvbnMuQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLkluc2VydGlvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLlNrZWxldG9uQWN0aW9uUHJvdmlkZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBQcm92aWRlcyBjb250ZXh0IG1lbnUgaXRlbXMgYW5kIHtAbGluayBJQWN0aW9uQmFyc30gY29udHJpYnV0aW9ucyBmb3IgYQotICogcGFydGljdWxhciBhYnN0cmFjdCB2aWV3ZXIuIFRoZSBpbnRlcmZhY2UgbWF0Y2hlcyB0aGF0IG9mIHtAbGluayBBY3Rpb25Hcm91cH0KLSAqIGFuZCBtYXkgYmUgdXNlZCBpbiB0aGUgc2FtZSBtYW5uZXIuIENsaWVudHMgbXVzdCBjYWxsCi0gKiB7QGxpbmsgTmF2aWdhdG9yQWN0aW9uU2VydmljZSNwcmVwYXJlTWVudUZvclBsYXRmb3JtQ29udHJpYnV0aW9ucyhNZW51TWFuYWdlciwgSVNlbGVjdGlvblByb3ZpZGVyLCBib29sZWFuKX0KLSAqIHdoZW4gdXNpbmcgdGhpcyBjbGFzcyB0byBhbGxvdyBvYmplY3Qgb3Igdmlld2VyIGNvbnRyaWJ1dGlvbnMuIFRoZQotICogPGI+b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdlci92aWV3ZXIvcG9wdXBNZW51PC9iPiBlbGVtZW50IG1heSBvdmVycmlkZQotICogd2hldGhlciBwbGF0Zm9ybSBjb250cmlidXRpb25zIGFyZSBhbGxvd2VkIHRvIHRoZSBtZW51IHdpdGggaXRzCi0gKiAnYWxsb3dzUGxhdGZvcm1Db250cmlidXRpb25zJyBhdHRyaWJ1dGUuICJQbGF0Zm9ybSBDb250cmlidXRpb25zIiBhcmUgbWVudQotICogaXRlbXMgdGhhdCBhcmUgYWRkZWQgdGhyb3VnaCB0aGUgPGI+b3JnLmVjbGlwc2UudWkucG9wdXBNZW51czwvYj4gZXh0ZW5zaW9uCi0gKiBwb2ludC4KLSAqIDwvcD4gIAotICogPHA+Ci0gKiBBIHtAbGluayBDb21tb25BY3Rpb25Qcm92aWRlcn0gaGFzIG9wcG9ydHVuaXRpZXMgdG8gY29udHJpYnV0ZSB0byB0aGUKLSAqIGNvbnRleHQgbWVudSBhbmQge0BsaW5rIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzfSB3aGVuZXZlciB0aGUgc2VsZWN0aW9uIGluCi0gKiB0aGUgdmlld2VyIGNoYW5nZXMuIEFjdGlvbiBQcm92aWRlcnMgYXJlIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSBlbmFibGVtZW50Ci0gKiBleHByZXNzaW9ucyBvZiB0aGVpciBhc3NvY2lhdGVkIGNvbnRlbnQgZXh0ZW5zaW9uIG9yIHRoZWlyIG93biBlbmFibGVtZW50Ci0gKiBleHByZXNzaW9uIGlmIGl0IGlzIGRlY2xhcmVkIGFzIGEgdG9wLWxldmVsICZsdDthY3Rpb25Qcm92aWRlciAvJmd0OyBlbGVtZW50IChvZiB0aGUKLSAqIDxiPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50PC9iPiBleHRlbnNpb24gcG9pbnQpLiBTZWUgdGhlIHNjaGVtYQotICogZG9jdW1lbnRhdGlvbiBvZiA8Yj5vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudDwvYj4gZm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIGhvdyB0byBzcGVjaWZ5IGFuIEFjdGlvbiBQcm92aWRlci4KLSAqIDwvcD4gCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmF2aWdhdG9yQWN0aW9uU2VydmljZSBleHRlbmRzIEFjdGlvbkdyb3VwIGltcGxlbWVudHMKLQkJSU1lbWVudG9Bd2FyZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQ29udHJpYnV0aW9uSXRlbVtdIERFRkFVTFRfR1JPVVBTID0gbmV3IElDb250cmlidXRpb25JdGVtW10gewotCQkJbmV3IFNlcGFyYXRvcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9ORVcpLAotCQkJbmV3IEdyb3VwTWFya2VyKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX0dPVE8pLAotCQkJbmV3IFNlcGFyYXRvcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOKSwKLQkJCW5ldyBTZXBhcmF0b3IoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfT1BFTl9XSVRIKSwKLQkJCW5ldyBHcm91cE1hcmtlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9TSE9XKSwKLQkJCW5ldyBHcm91cE1hcmtlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9SRU9SR0FOSVpFKSwKLQkJCW5ldyBHcm91cE1hcmtlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9QT1JUKSwKLQkJCW5ldyBTZXBhcmF0b3IoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfR0VORVJBVEUpLAotCQkJbmV3IFNlcGFyYXRvcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9TRUFSQ0gpLAotCQkJbmV3IFNlcGFyYXRvcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9CVUlMRCksCi0JCQluZXcgU2VwYXJhdG9yKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX0FERElUSU9OUyksCi0JCQluZXcgU2VwYXJhdG9yKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX1BST1BFUlRJRVMpIH07Ci0KLQlwcml2YXRlIGZpbmFsIElWaWV3UGFydCB2aWV3UGFydDsKLQotCXByaXZhdGUgZmluYWwgU3RydWN0dXJlZFZpZXdlciBzdHJ1Y3R1cmVkVmlld2VyOwotCi0JcHJpdmF0ZSBmaW5hbCBOYXZpZ2F0b3JDb250ZW50U2VydmljZSBjb250ZW50U2VydmljZTsKLQotCXByaXZhdGUgZmluYWwgSU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3Igdmlld2VyRGVzY3JpcHRvcjsKLQotCXByaXZhdGUgZmluYWwgU2V0IGFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JLyoKLQkgKiBNYXAgb2YgQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9ycyB0byBDb21tb25BY3Rpb25Qcm92aWRlcnMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCBhY3Rpb25Qcm92aWRlckluc3RhbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIElNZW1lbnRvIG1lbWVudG87Ci0KLQlwcml2YXRlIElDb250cmlidXRpb25JdGVtW10gbWVudUdyb3VwczsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFWaWV3UGFydAotCSAqICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgSVZpZXdQYXJ0IChmb3IgdGhlIElBY3Rpb25CYXJzKS4gPGI+TWF5IE5PVCBiZQotCSAqICAgICAgICAgICAgbnVsbC48L2I+Ci0JICogQHBhcmFtIGFTdHJ1Y3R1cmVkVmlld2VyCi0JICogICAgICAgICAgICBUaGUgYXNzb2NpYXRlZCBTdHJ1Y3R1cmVkVmlld2VyLiBVc2VkIHRvIGluaXRpYWxpemUKLQkgKiAgICAgICAgICAgIGV4dGVuc2lvbnMuIDxiPk1heSBOT1QgYmUgbnVsbC48L2I+Ci0JICogQHBhcmFtIGFDb250ZW50U2VydmljZQotCSAqICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIChmb3IgZXh0ZW5zaW9ucyB0aGF0Ci0JICogICAgICAgICAgICBjb29yZGluYXRlIGJlaGF2aW9yIHdpdGggY29udGVudCBleHRlbnNpb25zIC0tIGVpdGhlciBuZXN0ZWQKLQkgKiAgICAgICAgICAgIG9yIHRvcC1sZXZlbCBhY3Rpb24gcHJvdmlkZXJzKS4gPGI+TWF5IE5PVCBiZSBudWxsLjwvYj4KLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yQWN0aW9uU2VydmljZShJVmlld1BhcnQgYVZpZXdQYXJ0LAotCQkJU3RydWN0dXJlZFZpZXdlciBhU3RydWN0dXJlZFZpZXdlciwKLQkJCUlOYXZpZ2F0b3JDb250ZW50U2VydmljZSBhQ29udGVudFNlcnZpY2UpIHsKLQkJc3VwZXIoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChhVmlld1BhcnQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGFTdHJ1Y3R1cmVkVmlld2VyKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChhQ29udGVudFNlcnZpY2UpOwotCi0JCXZpZXdQYXJ0ID0gYVZpZXdQYXJ0OwotCQljb250ZW50U2VydmljZSA9IChOYXZpZ2F0b3JDb250ZW50U2VydmljZSkgYUNvbnRlbnRTZXJ2aWNlOwotCQlzdHJ1Y3R1cmVkVmlld2VyID0gYVN0cnVjdHVyZWRWaWV3ZXI7Ci0JCXZpZXdlckRlc2NyaXB0b3IgPSBjb250ZW50U2VydmljZS5nZXRWaWV3ZXJEZXNjcmlwdG9yKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBQcmVwYXJlcyB0aGUgbWVudSBmb3Igb2JqZWN0IGNvbnRyaWJ1dGlvbnMsIGlmIHRoZSBvcHRpb24gaXMgc2V0IGluIHRoZQotCSAqIGV4dGVuc2lvbi4gVGhlIG9wdGlvbiBpcyBjb250cm9sbGVkIGJ5IHRoZSAmbGd0O3BvcHVwTWVudSAvJmd0OyBlbGVtZW50J3MKLQkgKiAnYWxsb3dQbGF0Zm9ybUNvbnRyaWJ1dGlvbnMnIGF0dHJpYnV0ZS4gQ2xpZW50cyBtYXkgY2hvb3NlIHRvIGlnbm9yZSB0aGlzCi0JICogc2V0dGluZyBieSBzdXBwbHlpbmcgYSB2YWx1ZSBvZiA8Yj50cnVlPC9iPiBmb3IgdGhlIDxjb2RlPmZvcmNlPC9jb2RlPgotCSAqIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVudQotCSAqICAgICAgICAgICAgVGhlIGNvbnRleHQgbWVudSBvZiB0aGUgSVZpZXdQYXJ0Ci0JICogQHBhcmFtIGFTZWxlY3Rpb25Qcm92aWRlcgotCSAqICAgICAgICAgICAgVGhlIHNlbGVjdGlvbiBwcm92aWRlciB0aGF0IHdpbGwgc3VwcGxlbWVudCBhY3Rpb25zIHdpdGggYQotCSAqICAgICAgICAgICAgdmFsaWQsIGN1cnJlbnQgc2VsZWN0aW9uLgotCSAqIEBwYXJhbSBmb3JjZQotCSAqICAgICAgICAgICAgQSB2YWx1ZSBvZiAndHJ1ZScgZm9yY2VzIHRoZSBtZW51IHRvIGJlIHJlZ2lzdGVyZWQgZm9yCi0JICogICAgICAgICAgICBvYmplY3QvdmlldyBjb250cmlidXRpb25zLiBPdGhlcndpc2UsIHRoZSBvcHRpb24gZnJvbSB0aGUKLQkgKiAgICAgICAgICAgIGV4dGVuc2lvbiBwb2ludCB3aWxsIGJlIHJlc3BlY3RlZC4gU2VlCi0JICogICAgICAgICAgICA8Yj5vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld2VyL3ZpZXdlcjwvYj4gZm9yIG1vcmUKLQkgKiAgICAgICAgICAgIGluZm9ybWF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHByZXBhcmVNZW51Rm9yUGxhdGZvcm1Db250cmlidXRpb25zKE1lbnVNYW5hZ2VyIG1lbnUsCi0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgYVNlbGVjdGlvblByb3ZpZGVyLCBib29sZWFuIGZvcmNlKSB7Ci0JCUFzc2VydC5pc1RydWUoIWRpc3Bvc2VkKTsKLQotCQkvKgotCQkgKiBIb29rcyBpbnRvIHRoZSBFY2xpcHNlIGZyYW1ld29yayBmb3IgT2JqZWN0IGNvbnRyaWJ1dGlvbnMsIGFuZCBWaWV3Ci0JCSAqIGNvbnRyaWJ1dGlvbnMuCi0JCSAqLwotCQlpZiAoZm9yY2UKLQkJCQl8fCB2aWV3ZXJEZXNjcmlwdG9yLmFsbG93c1BsYXRmb3JtQ29udHJpYnV0aW9uc1RvQ29udGV4dE1lbnUoKSkKLQkJCXZpZXdQYXJ0LmdldFZpZXdTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgKLQkJCQkJY29udGVudFNlcnZpY2UuZ2V0Vmlld2VyRGVzY3JpcHRvcigpLmdldFBvcHVwTWVudUlkKCksCi0JCQkJCW1lbnUsIGFTZWxlY3Rpb25Qcm92aWRlcik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyB0aGF0IHRoZSBzZXJ2aWNlIGludm9rZSBleHRlbnNpb25zIHRvIGZpbGwgdGhlIGdpdmVuIG1lbnUgd2l0aAotCSAqIEFjdGlvbiBQcm92aWRlcnMgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiBlbGVtZW50cyBmcm9tIHRoZSBnaXZlbgotCSAqIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiA8cD4KLQkgKiBPYmplY3QgY29udHJpYnV0aW9ucyAoc2VlIDxiPm9yZy5lY2xpcGVzLnVpLnBvcHVwTWVudXM8L2I+KSBtYXkgYWxzbwotCSAqIHJlc3BlY3RlZCBieSB0aGlzIG1ldGhvZCBpZiA8Y29kZT50b1Jlc3BlY3RPYmplY3RDb250cmlidXRpb25zPC9jb2RlPgotCSAqIGlzIHRydWUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTWVudQotCSAqICAgICAgICAgICAgVGhlIG1lbnUgYmVpbmcgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgotCSAqIEBwYXJhbSBhU3RydWN0dXJlZFNlbGVjdGlvbgotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgc2VsZWN0aW9uIGZyb20gdGhlIHZpZXdlci4KLQkgKiBAc2VlIEFjdGlvbkdyb3VwI2ZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBhTWVudSkgewotCQlBc3NlcnQuaXNUcnVlKCFkaXNwb3NlZCk7Ci0KLQkJaWYgKG1lbnVHcm91cHMgPT0gbnVsbCkKLQkJCWNyZWF0ZU1lbnVHcm91cHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbnVHcm91cHMubGVuZ3RoOyBpKyspCi0JCQlhTWVudS5hZGQobWVudUdyb3Vwc1tpXSk7Ci0KLQkJYWRkQ29tbW9uQWN0aW9uUHJvdmlkZXJNZW51KGFNZW51KTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVNZW51R3JvdXBzKCkgewotCQlJbnNlcnRpb25Qb2ludFtdIGN1c3RvbVBvaW50cyA9IHZpZXdlckRlc2NyaXB0b3IKLQkJCQkuZ2V0Q3VzdG9tSW5zZXJ0aW9uUG9pbnRzKCk7Ci0KLQkJaWYgKGN1c3RvbVBvaW50cyA9PSBudWxsKQotCQkJbWVudUdyb3VwcyA9IERFRkFVTFRfR1JPVVBTOwotCQllbHNlIHsKLQkJCW1lbnVHcm91cHMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bY3VzdG9tUG9pbnRzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbVBvaW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChjdXN0b21Qb2ludHNbaV0uaXNTZXBhcmF0b3IoKSkKLQkJCQkJbWVudUdyb3Vwc1tpXSA9IG5ldyBTZXBhcmF0b3IoY3VzdG9tUG9pbnRzW2ldLmdldE5hbWUoKSk7Ci0JCQkJZWxzZQotCQkJCQltZW51R3JvdXBzW2ldID0gbmV3IEdyb3VwTWFya2VyKGN1c3RvbVBvaW50c1tpXS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFNZW51Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENvbW1vbkFjdGlvblByb3ZpZGVyTWVudShJTWVudU1hbmFnZXIgYU1lbnUpIHsKLQotCQlDb21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3JbXSBwcm92aWRlckRlc2NyaXB0b3JzID0gQ29tbW9uQWN0aW9uRGVzY3JpcHRvck1hbmFnZXIKLQkJCQkuZ2V0SW5zdGFuY2UoKS5maW5kUmVsZXZhbnRBY3Rpb25EZXNjcmlwdG9ycyh2aWV3ZXJEZXNjcmlwdG9yLAotCQkJCQkJZ2V0Q29udGV4dCgpKTsKLQkJaWYgKHByb3ZpZGVyRGVzY3JpcHRvcnMubGVuZ3RoID4gMCkgewotCQkJQ29tbW9uQWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlckRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvdmlkZXIgPSBnZXRBY3Rpb25Qcm92aWRlckluc3RhbmNlKHByb3ZpZGVyRGVzY3JpcHRvcnNbaV0pOwotCQkJCQlwcm92aWRlci5zZXRDb250ZXh0KGdldENvbnRleHQoKSk7Ci0JCQkJCXByb3ZpZGVyLmZpbGxDb250ZXh0TWVudShhTWVudSk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCU5hdmlnYXRvclBsdWdpbi5sb2dFcnJvcigwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVxdWVzdCB0aGF0IHRoZSBzZXJ2aWNlIGludm9rZSBleHRlbnNpb25zIHRvIGZpbGwgdGhlIGdpdmVuIElBY3Rpb25CYXJzCi0JICogd2l0aCByZXRhcmdldGFibGUgYWN0aW9ucyBvciB2aWV3IG1lbnUgY29udHJpYnV0aW9ucyBmcm9tIEFjdGlvbgotCSAqIFByb3ZpZGVycyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHRoZUFjdGlvbkJhcnMKLQkgKiAgICAgICAgICAgIFRoZSBhY3Rpb24gYmFycyBpbiB1c2UgYnkgdGhlIGN1cnJlbnQgdmlldyBzaXRlLgotCSAqIEBwYXJhbSBhU3RydWN0dXJlZFNlbGVjdGlvbgotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgc2VsZWN0aW9uIGZyb20gdGhlIHZpZXdlci4KLQkgKiBAc2VlIEFjdGlvbkdyb3VwI2ZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIHRoZUFjdGlvbkJhcnMpIHsKLQkJQXNzZXJ0LmlzVHJ1ZSghZGlzcG9zZWQpOwotCi0JCXRoZUFjdGlvbkJhcnMuY2xlYXJHbG9iYWxBY3Rpb25IYW5kbGVycygpOwotCi0JCUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcltdIHByb3ZpZGVyRGVzY3JpcHRvcnMgPSBDb21tb25BY3Rpb25EZXNjcmlwdG9yTWFuYWdlcgotCQkJCS5nZXRJbnN0YW5jZSgpLmZpbmRSZWxldmFudEFjdGlvbkRlc2NyaXB0b3JzKHZpZXdlckRlc2NyaXB0b3IsCi0JCQkJCQlnZXRDb250ZXh0KCkpOwotCQlpZiAocHJvdmlkZXJEZXNjcmlwdG9ycy5sZW5ndGggPiAwKSB7Ci0JCQlDb21tb25BY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3ZpZGVyRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlwcm92aWRlciA9IGdldEFjdGlvblByb3ZpZGVySW5zdGFuY2UocHJvdmlkZXJEZXNjcmlwdG9yc1tpXSk7Ci0JCQkJCXByb3ZpZGVyLnNldENvbnRleHQoZ2V0Q29udGV4dCgpKTsKLQkJCQkJcHJvdmlkZXIuZmlsbEFjdGlvbkJhcnModGhlQWN0aW9uQmFycyk7Ci0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJTmF2aWdhdG9yUGx1Z2luLmxvZ0Vycm9yKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhlQWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCXRoZUFjdGlvbkJhcnMuZ2V0TWVudU1hbmFnZXIoKS51cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIG9mIGFueSBzdGF0ZSBvciByZXNvdXJjZXMgaGVsZCBieSB0aGUgc2VydmljZS4KLQkgKiAKLQkgKiBAc2VlIEFjdGlvbkdyb3VwI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN5bmNocm9uaXplZCAoYWN0aW9uUHJvdmlkZXJJbnN0YW5jZXMpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGlvblByb3ZpZGVySW5zdGFuY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlDb21tb25BY3Rpb25Qcm92aWRlciBlbGVtZW50ID0gKENvbW1vbkFjdGlvblByb3ZpZGVyKSBpdGVyCi0JCQkJCQkubmV4dCgpOwotCQkJCWVsZW1lbnQuZGlzcG9zZSgpOwotCQkJfQotCQkJYWN0aW9uUHJvdmlkZXJJbnN0YW5jZXMuY2xlYXIoKTsKLQkJfQotCQlhY3Rpb25Qcm92aWRlckRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCWRpc3Bvc2VkID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBnaXZlbiBtZW1lbnRvIHRvIHJlc3RvcmUgdGhlIHN0YXRlIG9mIGVhY2ggQWN0aW9uIFByb3ZpZGVyIGFzIGl0Ci0JICogaXMgaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHBhcmFtIGFNZW1lbnRvCi0JICogICAgICAgICAgICBUaGUgbWVtZW50byByZXRyaWV2ZWQgZnJvbSB0aGUgZGlhbG9nIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0JCUFzc2VydC5pc1RydWUoIWRpc3Bvc2VkKTsKLQkJbWVtZW50byA9IGFNZW1lbnRvOwotCi0JCXN5bmNocm9uaXplZCAoYWN0aW9uUHJvdmlkZXJJbnN0YW5jZXMpIHsKLQkJCWZvciAoSXRlcmF0b3IgYWN0aW9uUHJvdmlkZXJJdGVyYXRvciA9IGFjdGlvblByb3ZpZGVySW5zdGFuY2VzCi0JCQkJCS52YWx1ZXMoKS5pdGVyYXRvcigpOyBhY3Rpb25Qcm92aWRlckl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlmaW5hbCBDb21tb25BY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IChDb21tb25BY3Rpb25Qcm92aWRlcikgYWN0aW9uUHJvdmlkZXJJdGVyYXRvcgotCQkJCQkJLm5leHQoKTsKLQkJCQlJU2FmZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJcHJvdmlkZXIucmVzdG9yZVN0YXRlKG1lbWVudG8pOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCU5hdmlnYXRvclBsdWdpbgotCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQkiQ291bGQgbm90IHJlc3RvcmUgc3RhdGUgZm9yIGFjdGlvbiBwcm92aWRlciAiICsgcHJvdmlkZXIuZ2V0Q2xhc3MoKSwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCX0KLQkJCQl9OwotCQkJCVBsYXRmb3JtLnJ1bihydW5uYWJsZSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcXVlc3QgdGhhdCBBY3Rpb24gUHJvdmlkZXJzIHNhdmUgYW55IHN0YXRlIHRoYXQgdGhleSBmaW5kIGludGVyZXN0aW5nLgotCSAqIAotCSAqIEBwYXJhbSBhTWVtZW50bwotCSAqICAgICAgICAgICAgVGhlIG1lbWVudG8gcmV0cmlldmVkIGZyb20gdGhlIGRpYWxvZyBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgewotCQlBc3NlcnQuaXNUcnVlKCFkaXNwb3NlZCk7Ci0KLQkJbWVtZW50byA9IGFNZW1lbnRvOwotCQlDb21tb25BY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoYWN0aW9uUHJvdmlkZXJJbnN0YW5jZXMpIHsKLQkJCWZvciAoSXRlcmF0b3IgYWN0aW9uUHJvdmlkZXJJdGVyYXRvciA9IGFjdGlvblByb3ZpZGVySW5zdGFuY2VzCi0JCQkJCS52YWx1ZXMoKS5pdGVyYXRvcigpOyBhY3Rpb25Qcm92aWRlckl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlwcm92aWRlciA9IChDb21tb25BY3Rpb25Qcm92aWRlcikgYWN0aW9uUHJvdmlkZXJJdGVyYXRvci5uZXh0KCk7Ci0JCQkJcHJvdmlkZXIuc2F2ZVN0YXRlKG1lbWVudG8pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21tb25BY3Rpb25Qcm92aWRlciBnZXRBY3Rpb25Qcm92aWRlckluc3RhbmNlKAotCQkJQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yIGFQcm92aWRlckRlc2NyaXB0b3IpIHsKLQkJQ29tbW9uQWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSAoQ29tbW9uQWN0aW9uUHJvdmlkZXIpIGFjdGlvblByb3ZpZGVySW5zdGFuY2VzCi0JCQkJLmdldChhUHJvdmlkZXJEZXNjcmlwdG9yKTsKLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCXN5bmNocm9uaXplZCAoYWN0aW9uUHJvdmlkZXJJbnN0YW5jZXMpIHsKLQkJCXByb3ZpZGVyID0gKENvbW1vbkFjdGlvblByb3ZpZGVyKSBhY3Rpb25Qcm92aWRlckluc3RhbmNlcwotCQkJCQkuZ2V0KGFQcm92aWRlckRlc2NyaXB0b3IpOwotCQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlwcm92aWRlciA9IGFQcm92aWRlckRlc2NyaXB0b3IuY3JlYXRlQWN0aW9uUHJvdmlkZXIoKTsKLQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlpbml0aWFsaXplKGFQcm92aWRlckRlc2NyaXB0b3IuZ2V0SWQoKSwgcHJvdmlkZXIpOwotCQkJCQlhY3Rpb25Qcm92aWRlckluc3RhbmNlcy5wdXQoYVByb3ZpZGVyRGVzY3JpcHRvciwgcHJvdmlkZXIpOwotCQkJCX0gZWxzZQotCQkJCQlhY3Rpb25Qcm92aWRlckluc3RhbmNlcy5wdXQoYVByb3ZpZGVyRGVzY3JpcHRvciwKLQkJCQkJCQkocHJvdmlkZXIgPSBTa2VsZXRvbkFjdGlvblByb3ZpZGVyLklOU1RBTkNFKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKFN0cmluZyBpZCwgQ29tbW9uQWN0aW9uUHJvdmlkZXIgYW5BY3Rpb25Qcm92aWRlcikgewotCQlpZiAoYW5BY3Rpb25Qcm92aWRlciAhPSBudWxsCi0JCQkJJiYgYW5BY3Rpb25Qcm92aWRlciAhPSBTa2VsZXRvbkFjdGlvblByb3ZpZGVyLklOU1RBTkNFKSB7Ci0JCQlDb21tb25BY3Rpb25Qcm92aWRlckNvbmZpZyBjb25maWd1cmF0aW9uID0gbmV3IENvbW1vbkFjdGlvblByb3ZpZGVyQ29uZmlnKAotCQkJCQlpZCwgdmlld1BhcnQsIGNvbnRlbnRTZXJ2aWNlLCBzdHJ1Y3R1cmVkVmlld2VyKTsKLQkJCWFuQWN0aW9uUHJvdmlkZXIuaW5pdChjb25maWd1cmF0aW9uKTsKLQkJCWFuQWN0aW9uUHJvdmlkZXIucmVzdG9yZVN0YXRlKG1lbWVudG8pOwotCQkJYW5BY3Rpb25Qcm92aWRlci5zZXRDb250ZXh0KG5ldyBBY3Rpb25Db250ZXh0KAotCQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSk7Ci0JCQlhbkFjdGlvblByb3ZpZGVyLmZpbGxBY3Rpb25CYXJzKHZpZXdQYXJ0LmdldFZpZXdTaXRlKCkKLQkJCQkJLmdldEFjdGlvbkJhcnMoKSk7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvTmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvTmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhOWQ2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL05hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5OYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvck1hbmFnZXI7Ci0KLS8qKgotICogCi0gKiBUaGUgYWN0aXZhdGlvbiBzZXJ2aWNlIGRldGVybWluZXMgaWYgYW4gZXh0ZW5zaW9uIGlzICdhY3RpdmUnIHdpdGhpbiB0aGUKLSAqIGNvbnRleHQgb2YgYSBnaXZlbiB2aWV3ZXIuIElmIGFuIGV4dGVuc2lvbiBpcyAnYWN0aXZlJyB0aGVuIHRoZSBleHRlbnNpb24KLSAqIHdpbGwgY29udHJpYnV0ZSBmdW5jdGlvbmFsaXR5IHRvIHRoZSB2aWV3ZXIuIElmIGFuIGV4dGVuc2lvbiBpcyBub3QgJ2FjdGl2ZScsCi0gKiB0aGVuIHRoZSBleHRlbnNpb24gd2lsbCBub3QgYmUgZ2l2ZW4gb3Bwb3J0dW5pdGllcyB0byBjb250cmlidXRlCi0gKiBmdW5jdGlvbmFsaXR5IHRvIHRoZSBnaXZlbiB2aWV3ZXIuIFNlZSB7QGxpbmsgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlfSBmb3IKLSAqIG1vcmUgZGV0YWlsIG9uIHdoYXQgJ3N0YXRlcycgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRlbnQgZXh0ZW5zaW9uLgotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVkFURURfRVhURU5TSU9OUyA9ICIuYWN0aXZhdGVkRXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fQUNUSVZBVEVEX1NVRkZJWCA9ICIuZXh0ZW5zaW9uQWN0aXZhdGVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UgSU5TVEFOQ0UgPSBuZXcgTmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yTWFuYWdlciBDT05URU5UX0RFU0NSSVBUT1JfUkVHSVNUUlkgPSBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvck1hbmFnZXIKLQkJCS5nZXRJbnN0YW5jZSgpOwotCi0JLyoKLQkgKiBNYXAgb2YgYWN0aXZhdGVkIGV4dGVuc2lvbnMgc3RvcmVkIGJ5IHRoZSBWaWV3ZXIgSUQgYXMgYSBTZXQuCi0JICogCi0JICogVGhhdCBpcywgKFZpZXdlcklELCBTZXQgb2YgRXh0ZW5zaW9uIEFjdGl2YXRpb25zKS1wYWlycy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCBhY3RpdmF0ZWRFeHRlbnNpb25zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qCi0JICogTWFwIG9mIChWaWV3ZXJJRCwgTGlzdGVuZXJMaXN0cyBvZiBJRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyKS1wYWlycy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCBjb250ZW50U2VydmljZUxpc3RlbmVyc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2UuCi0JICovCi0JcHJpdmF0ZSBOYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGtub3duIGFjdGl2YXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgYWN0aXZhdGlvbiBzZXJ2aWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBDaGVja3MgdGhlIGtub3duIGFjdGl2YXRpb24gc3RhdGUgZm9yIHRoZSBnaXZlbiB2aWV3ZXIgaWQgdG8gZGV0ZXJtaW5lIGlmCi0JICogdGhlIGdpdmVuIG5hdmlnYXRvciBleHRlbnNpb24gaXMgJ2FjdGl2ZScuCi0JICogCi0JICogQHBhcmFtIGFWaWV3ZXJJZAotCSAqICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGRlZmluZWQgdmlld2VyIHRoYXQgdXNlcyBhbgotCSAqICAgICAgICAgICAgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGZvciBpdHMgY29udGVudC4KLQkgKiBAcGFyYW0gYU5hdmlnYXRvckV4dGVuc2lvbklkCi0JICogICAgICAgICAgICBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZXh0ZW5zaW9uIGlzIGFjdGl2ZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgdmlld2VyIGlkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmF2aWdhdG9yRXh0ZW5zaW9uQWN0aXZlKFN0cmluZyBhVmlld2VySWQsCi0JCQlTdHJpbmcgYU5hdmlnYXRvckV4dGVuc2lvbklkKSB7Ci0JCXJldHVybiBnZXRBY3RpdmVFeHRlbnNpb25zKGFWaWV3ZXJJZCwgdHJ1ZSkuY29udGFpbnMoCi0JCQkJZ2V0RXh0ZW5zaW9uQWN0aXZhdGlvblByZWZlcmVuY2VLZXkoYU5hdmlnYXRvckV4dGVuc2lvbklkKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBhY3RpdmF0aW9uIHN0YXRlIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIGluIHRoZSBjb250ZXh0IG9mIHRoZQotCSAqIGdpdmVuIHZpZXdlciBpZC4gRWFjaCBpbnN0YW5jZSBvZiBhbiBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgbGlzdGVucyBmb3IKLQkgKiB0aGUgYWN0aXZhdGlvbiBzZXJ2aWNlIHRvIHVwZGF0ZTsgYW5kIGlmIHRob3NlIGluc3RhbmNlcyB3ZXJlIGNyZWF0ZWQKLQkgKiB3aXRoIHZpZXdlcnMsIHRoZXkgd2lsbCBpc3N1ZSBhIHJlZnJlc2guIE90aGVyd2lzZSwgY2xpZW50cyBhcmUKLQkgKiByZXNwb25zaWJsZSBmb3IgcmVmcmVzaGluZyB0aGUgdmlld2Vycy4KLQkgKiAKLQkgKiA8cD4KLQkgKiBDbGllbnRzIG11c3QgY2FsbCB7QGxpbmsgI3BlcnNpc3RFeHRlbnNpb25BY3RpdmF0aW9ucyhTdHJpbmcpfSB0byBzYXZlCi0JICogdGhlIHRoZSBhY3RpdmF0aW9uIHN0YXRlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiBXaGVuIGNsaWVudHMgYXJlIHVwZGF0aW5nIGEgYmF0Y2ggb2YgZXh0ZW5zaW9ucywgY29uc2lkZXIgdXNpbmcKLQkgKiB7QGxpbmsgI2FjdGl2YXRlTmF2aWdhdG9yRXh0ZW5zaW9uKFN0cmluZywgU3RyaW5nW10sIGJvb2xlYW4pfSB3aGVuCi0JICogcG9zc2libGUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgbm90aWZpY2F0aW9ucy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFWaWV3ZXJJZAotCSAqICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGRlZmluZWQgdmlld2VyIHRoYXQgdXNlcyBhbgotCSAqICAgICAgICAgICAgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGZvciBpdHMgY29udGVudC4KLQkgKiBAcGFyYW0gYU5hdmlnYXRvckV4dGVuc2lvbklkCi0JICogICAgICAgICAgICBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIEBwYXJhbSB0b0VuYWJsZQotCSAqICAgICAgICAgICAgVHJ1ZSBpbmRpY2F0ZXMgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgZW5hYmxlZDsgRmFsc2UKLQkgKiAgICAgICAgICAgIGluZGljYXRlcyBvdGhlcndpc2UuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGVOYXZpZ2F0b3JFeHRlbnNpb24oU3RyaW5nIGFWaWV3ZXJJZCwKLQkJCVN0cmluZyBhTmF2aWdhdG9yRXh0ZW5zaW9uSWQsIGJvb2xlYW4gdG9FbmFibGUpIHsKLQotCQlib29sZWFuIGN1cnJlbnRseUFjdGl2ZSA9IGlzTmF2aWdhdG9yRXh0ZW5zaW9uQWN0aXZlKGFWaWV3ZXJJZCwKLQkJCQlhTmF2aWdhdG9yRXh0ZW5zaW9uSWQpOwotCQlpZiAoY3VycmVudGx5QWN0aXZlID09IHRvRW5hYmxlKQotCQkJcmV0dXJuOwotCi0JCVNldCBhY3RpdmF0ZWRFeHRlbnNpb25zID0gZ2V0QWN0aXZlRXh0ZW5zaW9ucyhhVmlld2VySWQsIHRydWUpOwotCQlpZiAodG9FbmFibGUpCi0JCQlhY3RpdmF0ZWRFeHRlbnNpb25zCi0JCQkJCS5hZGQoZ2V0RXh0ZW5zaW9uQWN0aXZhdGlvblByZWZlcmVuY2VLZXkoYU5hdmlnYXRvckV4dGVuc2lvbklkKSk7Ci0JCWVsc2UKLQkJCWFjdGl2YXRlZEV4dGVuc2lvbnMKLQkJCQkJLnJlbW92ZShnZXRFeHRlbnNpb25BY3RpdmF0aW9uUHJlZmVyZW5jZUtleShhTmF2aWdhdG9yRXh0ZW5zaW9uSWQpKTsKLQkJbm90aWZ5TGlzdGVuZXJzKGFWaWV3ZXJJZCwgbmV3IFN0cmluZ1tdIHsgYU5hdmlnYXRvckV4dGVuc2lvbklkIH0sCi0JCQkJdG9FbmFibGUpOwotCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBhY3RpdmF0aW9uIHN0YXRlIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIGluIHRoZSBjb250ZXh0IG9mIHRoZQotCSAqIGdpdmVuIHZpZXdlciBpZC4gRWFjaCBpbnN0YW5jZSBvZiBhbiBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgbGlzdGVucyBmb3IKLQkgKiB0aGUgYWN0aXZhdGlvbiBzZXJ2aWNlIHRvIHVwZGF0ZTsgYW5kIGlmIHRob3NlIGluc3RhbmNlcyB3ZXJlIGNyZWF0ZWQKLQkgKiB3aXRoIHZpZXdlcnMsIHRoZXkgd2lsbCBpc3N1ZSBhIHJlZnJlc2guIE90aGVyd2lzZSwgY2xpZW50cyBhcmUKLQkgKiByZXNwb25zaWJsZSBmb3IgcmVmcmVzaGluZyB0aGUgdmlld2Vycy4KLQkgKiAKLQkgKiA8cD4KLQkgKiBDbGllbnRzIG11c3QgY2FsbCB7QGxpbmsgI3BlcnNpc3RFeHRlbnNpb25BY3RpdmF0aW9ucyhTdHJpbmcpfSB0byBzYXZlCi0JICogdGhlIHRoZSBhY3RpdmF0aW9uIHN0YXRlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYVZpZXdlcklkCi0JICogICAgICAgICAgICBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgZGVmaW5lZCB2aWV3ZXIgdGhhdCB1c2VzIGFuCi0JICogICAgICAgICAgICBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgZm9yIGl0cyBjb250ZW50LgotCSAqIEBwYXJhbSBhTmF2aWdhdG9yRXh0ZW5zaW9uSWRzCi0JICogICAgICAgICAgICBBbiBhcnJheSBvZiB1bmlxdWUgaWRlbnRpZmllcnMgYXNzb2NpYXRlZCB3aXRoIGV4aXN0aW5nCi0JICogICAgICAgICAgICBleHRlbnNpb24uCi0JICogQHBhcmFtIHRvRW5hYmxlCi0JICogICAgICAgICAgICBUcnVlIGluZGljYXRlcyB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBlbmFibGVkOyBGYWxzZQotCSAqICAgICAgICAgICAgaW5kaWNhdGVzIG90aGVyd2lzZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZU5hdmlnYXRvckV4dGVuc2lvbihTdHJpbmcgYVZpZXdlcklkLAotCQkJU3RyaW5nW10gYU5hdmlnYXRvckV4dGVuc2lvbklkcywgYm9vbGVhbiB0b0VuYWJsZSkgewotCi0JCVNldCBhY3RpdmF0ZWRFeHRlbnNpb25zID0gZ2V0QWN0aXZlRXh0ZW5zaW9ucyhhVmlld2VySWQsIHRydWUpOwotCQlpZiAodG9FbmFibGUpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFOYXZpZ2F0b3JFeHRlbnNpb25JZHMubGVuZ3RoOyBpKyspCi0JCQkJYWN0aXZhdGVkRXh0ZW5zaW9ucwotCQkJCQkJLmFkZChnZXRFeHRlbnNpb25BY3RpdmF0aW9uUHJlZmVyZW5jZUtleShhTmF2aWdhdG9yRXh0ZW5zaW9uSWRzW2ldKSk7Ci0KLQkJZWxzZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhTmF2aWdhdG9yRXh0ZW5zaW9uSWRzLmxlbmd0aDsgaSsrKQotCQkJCWFjdGl2YXRlZEV4dGVuc2lvbnMKLQkJCQkJCS5yZW1vdmUoZ2V0RXh0ZW5zaW9uQWN0aXZhdGlvblByZWZlcmVuY2VLZXkoYU5hdmlnYXRvckV4dGVuc2lvbklkc1tpXSkpOwotCQlub3RpZnlMaXN0ZW5lcnMoYVZpZXdlcklkLCBhTmF2aWdhdG9yRXh0ZW5zaW9uSWRzLCB0b0VuYWJsZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBhY3RpdmF0aW9uIHN0YXRlIGZvciB0aGUgZ2l2ZW4gdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBhVmlld2VySWQKLQkgKiAgICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBkZWZpbmVkIHZpZXdlciB0aGF0IHVzZXMgYW4KLQkgKiAgICAgICAgICAgIElOYXZpZ2F0b3JDb250ZW50U2VydmljZSBmb3IgaXRzIGNvbnRlbnQuCi0JICovCi0JcHVibGljIHZvaWQgcGVyc2lzdEV4dGVuc2lvbkFjdGl2YXRpb25zKFN0cmluZyBhVmlld2VySWQpIHsKLQotCQlTZXQgYWN0aXZhdGVkRXh0ZW5zaW9ucyA9IGdldEFjdGl2ZUV4dGVuc2lvbnMoYVZpZXdlcklkLCBmYWxzZSk7Ci0JCWlmIChhY3RpdmF0ZWRFeHRlbnNpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJc3luY2hyb25pemVkIChhY3RpdmF0ZWRFeHRlbnNpb25zKSB7Ci0JCQlJdGVyYXRvciBhY3RpdmF0ZWRFeHRlbnNpb25zSXRlcmF0b3IgPSBhY3RpdmF0ZWRFeHRlbnNpb25zCi0JCQkJCS5pdGVyYXRvcigpOwotCQkJLyogZW5zdXJlIHRoYXQgdGhlIHByZWZlcmVuY2Ugd2lsbCBiZSBub24tZW1wdHkgKi8KLQkJCVN0cmluZ0J1ZmZlciBhY3RpdmF0ZWRFeHRlbnNpb25zU3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiOyIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoYWN0aXZhdGVkRXh0ZW5zaW9uc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWFjdGl2YXRlZEV4dGVuc2lvbnNTdHJpbmdCdWZmZXIuYXBwZW5kKAotCQkJCQkJYWN0aXZhdGVkRXh0ZW5zaW9uc0l0ZXJhdG9yLm5leHQoKSkuYXBwZW5kKCI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoZ2V0UHJlZmVyZW5jZUtleShhVmlld2VySWQpLAotCQkJCQlhY3RpdmF0ZWRFeHRlbnNpb25zU3RyaW5nQnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JCU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiB0aGUgYWN0aXZhdGlvbiBzdGF0ZSBjaGFuZ2VzIGZvciB0aGUgZ2l2ZW4KLQkgKiB2aWV3ZXIgaWQuCi0JICogCi0JICogQHBhcmFtIGFWaWV3ZXJJZAotCSAqICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGRlZmluZWQgdmlld2VyIHRoYXQgdXNlcyBhbgotCSAqICAgICAgICAgICAgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGZvciBpdHMgY29udGVudC4KLQkgKiBAcGFyYW0gYUxpc3RlbmVyCi0JICogICAgICAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcn0KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXIoU3RyaW5nIGFWaWV3ZXJJZCwKLQkJCUlFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAoY29udGVudFNlcnZpY2VMaXN0ZW5lcnNNYXApIHsKLQkJCUxpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBnZXRFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXJzKGFWaWV3ZXJJZCwKLQkJCQkJdHJ1ZSk7Ci0JCQlsaXN0ZW5lcnMuYWRkKGFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBObyBsb25nZXIgcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiBhY3RpdmF0aW9uIHN0YXRlIGNoYW5nZXMuCi0JICogCi0JICogQHBhcmFtIGFWaWV3ZXJJZAotCSAqICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGRlZmluZWQgdmlld2VyIHRoYXQgdXNlcyBhbgotCSAqICAgICAgICAgICAgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGZvciBpdHMgY29udGVudC4KLQkgKiBAcGFyYW0gYUxpc3RlbmVyCi0JICogICAgICAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcn0KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXIoU3RyaW5nIGFWaWV3ZXJJZCwKLQkJCUlFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAoY29udGVudFNlcnZpY2VMaXN0ZW5lcnNNYXApIHsKLQkJCUxpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBnZXRFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXJzKGFWaWV3ZXJJZCwKLQkJCQkJdHJ1ZSk7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKFN0cmluZyBhVmlld2VySWQsCi0JCQlTdHJpbmdbXSBuYXZpZ2F0b3JFeHRlbnNpb25JZHMsIGJvb2xlYW4gdG9FbmFibGUpIHsKLQkJc3luY2hyb25pemVkIChjb250ZW50U2VydmljZUxpc3RlbmVyc01hcCkgewotCQkJTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IChMaXN0ZW5lckxpc3QpIGNvbnRlbnRTZXJ2aWNlTGlzdGVuZXJzTWFwCi0JCQkJCS5nZXQoYVZpZXdlcklkKTsKLQkJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCU9iamVjdFtdIGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lckFycmF5Lmxlbmd0aDsgaSsrKQotCQkJCQkoKElFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXIpIGxpc3RlbmVyQXJyYXlbaV0pCi0JCQkJCQkJLm9uRXh0ZW5zaW9uQWN0aXZhdGlvbihhVmlld2VySWQsCi0JCQkJCQkJCQluYXZpZ2F0b3JFeHRlbnNpb25JZHMsIHRvRW5hYmxlKTsKLQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZ2V0RXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVycyhTdHJpbmcgYVZpZXdlcklkLAotCQkJYm9vbGVhbiBpbml0aWFsaXplSWZOZWNlc3NhcnkpIHsKLQkJTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IChMaXN0ZW5lckxpc3QpIGNvbnRlbnRTZXJ2aWNlTGlzdGVuZXJzTWFwCi0JCQkJLmdldChhVmlld2VySWQpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwgfHwgIWluaXRpYWxpemVJZk5lY2Vzc2FyeSkKLQkJCXJldHVybiBsaXN0ZW5lcnM7Ci0KLQkJc3luY2hyb25pemVkIChjb250ZW50U2VydmljZUxpc3RlbmVyc01hcCkgewotCQkJbGlzdGVuZXJzID0gKExpc3RlbmVyTGlzdCkgY29udGVudFNlcnZpY2VMaXN0ZW5lcnNNYXAKLQkJCQkJLmdldChhVmlld2VySWQpOwotCQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQotCQkJCWNvbnRlbnRTZXJ2aWNlTGlzdGVuZXJzTWFwLnB1dChhVmlld2VySWQsCi0JCQkJCQkobGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpKSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0KLQlwcml2YXRlIFNldCBnZXRBY3RpdmVFeHRlbnNpb25zKFN0cmluZyBhVmlld2VySWQsCi0JCQlib29sZWFuIGluaXRpYWxpemVJZk5lY2Vzc2FyeSkgewotCQkvKiBlbmFibGVkIGJ5IGRlZmF1bHQgaWYgbm8gc2V0dGluZyBpcyBwcmVzZW50IC4uLiAqLwotCQlTZXQgYWN0aXZhdGVkRXh0ZW5zaW9ucyA9IChTZXQpIGFjdGl2YXRlZEV4dGVuc2lvbnNNYXAuZ2V0KGFWaWV3ZXJJZCk7Ci0JCWlmIChhY3RpdmF0ZWRFeHRlbnNpb25zICE9IG51bGwgfHwgIWluaXRpYWxpemVJZk5lY2Vzc2FyeSkKLQkJCXJldHVybiBhY3RpdmF0ZWRFeHRlbnNpb25zOwotCi0JCXN5bmNocm9uaXplZCAoYWN0aXZhdGVkRXh0ZW5zaW9uc01hcCkgewotCQkJYWN0aXZhdGVkRXh0ZW5zaW9ucyA9IChTZXQpIGFjdGl2YXRlZEV4dGVuc2lvbnNNYXAuZ2V0KGFWaWV3ZXJJZCk7Ci0JCQlpZiAoYWN0aXZhdGVkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQkJYWN0aXZhdGVkRXh0ZW5zaW9ucyA9IHJldmVydEV4dGVuc2lvbkFjdGl2YXRpb25zKGFWaWV3ZXJJZCk7Ci0JCQkJYWN0aXZhdGVkRXh0ZW5zaW9uc01hcC5wdXQoYVZpZXdlcklkLCBhY3RpdmF0ZWRFeHRlbnNpb25zKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aXZhdGVkRXh0ZW5zaW9uczsKLQl9Ci0KLQlwcml2YXRlIFNldCByZXZlcnRFeHRlbnNpb25BY3RpdmF0aW9ucyhTdHJpbmcgYVZpZXdlcklkKSB7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJU2V0IGFjdGl2YXRlZEV4dGVuc2lvbnMgPSBuZXcgSGFzaFNldCgpOwotCQlTdHJpbmcgYWN0aXZhdGVkRXh0ZW5zaW9uc1N0cmluZyA9IHByZWZlcmVuY2VzCi0JCQkJLmdldFN0cmluZyhnZXRQcmVmZXJlbmNlS2V5KGFWaWV3ZXJJZCkpOwotCi0JCWlmIChhY3RpdmF0ZWRFeHRlbnNpb25zU3RyaW5nICE9IG51bGwKLQkJCQkmJiBhY3RpdmF0ZWRFeHRlbnNpb25zU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIGFjdGl2YXRlZEV4dGVuc2lvbktleSA9IG51bGw7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLQkJCQkJYWN0aXZhdGVkRXh0ZW5zaW9uc1N0cmluZywgIjsiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlhY3RpdmF0ZWRFeHRlbnNpb25LZXkgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJaWYgKGFjdGl2YXRlZEV4dGVuc2lvbktleS5sZW5ndGgoKSA+IDApCi0JCQkJCWFjdGl2YXRlZEV4dGVuc2lvbnMuYWRkKGFjdGl2YXRlZEV4dGVuc2lvbktleSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbXSBjb250ZW50RGVzY3JpcHRvcnMgPSBDT05URU5UX0RFU0NSSVBUT1JfUkVHSVNUUlkKLQkJCQkJLmdldEFsbENvbnRlbnREZXNjcmlwdG9ycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspCi0JCQkJaWYgKGNvbnRlbnREZXNjcmlwdG9yc1tpXS5pc0VuYWJsZWRCeURlZmF1bHQoKSkKLQkJCQkJYWN0aXZhdGVkRXh0ZW5zaW9ucwotCQkJCQkJCS5hZGQoZ2V0RXh0ZW5zaW9uQWN0aXZhdGlvblByZWZlcmVuY2VLZXkoY29udGVudERlc2NyaXB0b3JzW2ldCi0JCQkJCQkJCQkuZ2V0SWQoKSkpOwotCQl9Ci0JCXJldHVybiBhY3RpdmF0ZWRFeHRlbnNpb25zOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFByZWZlcmVuY2VLZXkoU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlyZXR1cm4gYVZpZXdlcklkICsgQUNUSVZBVEVEX0VYVEVOU0lPTlM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZW5zaW9uQWN0aXZhdGlvblByZWZlcmVuY2VLZXkoCi0JCQlTdHJpbmcgYU5hdmlnYXRvckV4dGVuc2lvbklkKSB7Ci0JCXJldHVybiBhTmF2aWdhdG9yRXh0ZW5zaW9uSWQgKyBFWFRFTlNJT05fQUNUSVZBVEVEX1NVRkZJWDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvTmF2aWdhdG9yQ29udGVudFNlcnZpY2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL05hdmlnYXRvckNvbnRlbnRTZXJ2aWNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODQyZTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvTmF2aWdhdG9yQ29udGVudFNlcnZpY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBhIGZhY3RvcnkgcGF0dGVybiBmb3IgY3JlYXRpbmcge0BsaW5rIElOYXZpZ2F0b3JDb250ZW50U2VydmljZX1zIAotICogZm9yIGdpdmVuIHZpZXdlciBpZHMuICAKLSAqIAotICogPHA+Ci0gKiBDbGllbnRzIG1heSBzdXBwbHkgdGhlIHZpZXdlciBpbiB7QGxpbmsgI2NyZWF0ZUNvbnRlbnRTZXJ2aWNlKFN0cmluZywgU3RydWN0dXJlZFZpZXdlcikgfQotICogb3Igd2FpdCB1bnRpbCB0aGUgY29udGVudCBwcm92aWRlciBpcyBjcmVhdGVkIGJ5IHRoZSBzZXJ2aWNlIAotICogYW5kIHNldCBvbiB0aGUgdmlld2VyLiBXaGVuIHRoZSBjb250ZW50IHByb3ZpZGVyIGlzIHNldCwgdGhlIAotICogdmlld2VyIHdpbGwgY2FsbCBpbnB1dENoYW5nZWQoKSwgYW5kIHRoZSBjb250ZW50IHNlcnZpY2UKLSAqIHdpbGwgdXBkYXRlIGl0cyBtYW5hZ2VkIHZpZXdlciBhY2NvcmRpbmdseS4gVGhlcmVmb3JlLCBlYWNoCi0gKiBjb250ZW50IHNlcnZpY2Ugc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGF0IG1vc3Qgb25lIHZpZXdlci4gCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMiAgCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmF2aWdhdG9yQ29udGVudFNlcnZpY2VGYWN0b3J5IHsKLQkKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIGZvciBjcmVhdGluZyBOYXZpZ2F0b3JDb250ZW50U2VydmljZXMuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTmF2aWdhdG9yQ29udGVudFNlcnZpY2VGYWN0b3J5IElOU1RBTkNFID0gbmV3IE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlRmFjdG9yeSgpOyAKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIElOYXZpZ2F0b3JDb250ZW50U2VydmljZSBjb25maWd1cmVkIAotCSAqIGZvciB0aGUgZ2l2ZW4gaWQuIEluc3RhbmNlcyBhcmUgbm90IHNoYXJlZCBmb3IgdGhlIHNhbWUgCi0JICogdmlld2VySWQuIAotCSAqIAotCSAqIEBwYXJhbSBhVmlld2VySWQgVGhlIHZpZXdlciBpZCBvZiBpbnRlcmVzdAotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBnaXZlbiBpZC4gCi0JICovCi0JcHVibGljIElOYXZpZ2F0b3JDb250ZW50U2VydmljZSBjcmVhdGVDb250ZW50U2VydmljZShTdHJpbmcgYVZpZXdlcklkKSB7IAotCQlyZXR1cm4gY3JlYXRlQ29udGVudFNlcnZpY2UoYVZpZXdlcklkLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgY29uZmlndXJlZCAKLQkgKiBmb3IgdGhlIGdpdmVuIGlkLiBJbnN0YW5jZXMgYXJlIG5vdCBzaGFyZWQgZm9yIHRoZSBzYW1lIAotCSAqIHZpZXdlcklkLiAKLQkgKiAKLQkgKiBAcGFyYW0gYVZpZXdlcklkIFRoZSB2aWV3ZXIgaWQgb2YgaW50ZXJlc3QKLQkgKiBAcGFyYW0gYVZpZXdlciBUaGUgY29udGVudCBzZXJ2aWNlIGNhbiB1c2UgdGhlIGdpdmVuIHZpZXdlciB0byBpbml0aWFsaXplIGNvbnRlbnQgcHJvdmlkZXJzIAotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBnaXZlbiBpZC4gCi0JICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIElOYXZpZ2F0b3JDb250ZW50U2VydmljZSBjcmVhdGVDb250ZW50U2VydmljZShTdHJpbmcgYVZpZXdlcklkLCBTdHJ1Y3R1cmVkVmlld2VyIGFWaWV3ZXIpIHsKLQkJaWYoYVZpZXdlciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOYXZpZ2F0b3JDb250ZW50U2VydmljZShhVmlld2VySWQpOwotCQlyZXR1cm4gbmV3IE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKGFWaWV3ZXJJZCwgYVZpZXdlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL1ByaW9yaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL1ByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZjdkYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9Qcmlvcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7Ci0KLS8qKgotICogPHA+Ci0gKiBFbnVtZXJhdGlvbiBvZiB0aGUgUHJpb3JpdHkgdmFsdWVzIHN1cHBvcnRlZCBieSB0aGUgQ29tbW9uIE5hdmlnYXRvci4KLSAqIDwvcD4KLSAqIAotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByaW9yaXR5IHsKLQotCS8qKgotCSAqIEluZGljYXRlcyBIaWdoZXN0IHByaW9yaXR5IGFzIGFuIGludC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISUdIRVNUX1BSSU9SSVRZX1ZBTFVFID0gNzsKLQotCS8qKgotCSAqIEluZGljYXRlcyBIaWdoZXIgcHJpb3JpdHkgYXMgYW4gaW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJR0hFUl9QUklPUklUWV9WQUxVRSA9IDY7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgSGlnaCBwcmlvcml0eSBhcyBhbiBpbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElHSF9QUklPUklUWV9WQUxVRSA9IDU7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgTm9ybWFsIHByaW9yaXR5IGFzIGFuIGludC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUxfUFJJT1JJVFlfVkFMVUUgPSA0OwotCi0JLyoqCi0JICogSW5kaWNhdGVzIExvdyBwcmlvcml0eSBhcyBhbiBpbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9XX1BSSU9SSVRZX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIEluZGljYXRlcyBMb3dlciBwcmlvcml0eSBhcyBhbiBpbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9XRVJfUFJJT1JJVFlfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIExvd2VzdCBwcmlvcml0eSBhcyBhbiBpbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9XRVNUX1BSSU9SSVRZX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIEluZGljYXRlcyBIaWdoZXN0IHByaW9yaXR5IGFzIGEgU3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJR0hFU1RfUFJJT1JJVFlfTElURVJBTCA9ICJoaWdoZXN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIEhpZ2hlciBwcmlvcml0eSBhcyBhIFN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISUdIRVJfUFJJT1JJVFlfTElURVJBTCA9ICJoaWdoZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgSGlnaCBwcmlvcml0eSBhcyBhIFN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISUdIX1BSSU9SSVRZX0xJVEVSQUwgPSAiaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBOb3JtYWwgcHJpb3JpdHkgYXMgYSBTdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9STUFMX1BSSU9SSVRZX0xJVEVSQUwgPSAibm9ybWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIExvdyBwcmlvcml0eSBhcyBhIFN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT1dfUFJJT1JJVFlfTElURVJBTCA9ICJsb3ciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgTG93ZXIgcHJpb3JpdHkgYXMgYSBTdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9XRVJfUFJJT1JJVFlfTElURVJBTCA9ICJsb3dlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBMb3dlc3QgcHJpb3JpdHkgYXMgYSBTdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9XRVNUX1BSSU9SSVRZX0xJVEVSQUwgPSAibG93ZXN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIEhpZ2hlc3QgcHJpb3JpdHkgYXMgYSBQcmlvcml0eSBlbnVtZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByaW9yaXR5IEhJR0hFU1QgPSBuZXcgUHJpb3JpdHkoSElHSEVTVF9QUklPUklUWV9WQUxVRSwKLQkJCUhJR0hFU1RfUFJJT1JJVFlfTElURVJBTCk7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgSGlnaGVyIHByaW9yaXR5IGFzIGEgUHJpb3JpdHkgZW51bWVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmlvcml0eSBISUdIRVIgPSBuZXcgUHJpb3JpdHkoSElHSEVSX1BSSU9SSVRZX1ZBTFVFLAotCQkJSElHSEVSX1BSSU9SSVRZX0xJVEVSQUwpOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIEhpZ2ggcHJpb3JpdHkgYXMgYSBQcmlvcml0eSBlbnVtZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByaW9yaXR5IEhJR0ggPSBuZXcgUHJpb3JpdHkoSElHSF9QUklPUklUWV9WQUxVRSwKLQkJCUhJR0hfUFJJT1JJVFlfTElURVJBTCk7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgTm9ybWFsIHByaW9yaXR5IGFzIGEgUHJpb3JpdHkgZW51bWVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmlvcml0eSBOT1JNQUwgPSBuZXcgUHJpb3JpdHkoTk9STUFMX1BSSU9SSVRZX1ZBTFVFLAotCQkJTk9STUFMX1BSSU9SSVRZX0xJVEVSQUwpOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIExvdyBwcmlvcml0eSBhcyBhIFByaW9yaXR5IGVudW1lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJpb3JpdHkgTE9XID0gbmV3IFByaW9yaXR5KExPV19QUklPUklUWV9WQUxVRSwKLQkJCUxPV19QUklPUklUWV9MSVRFUkFMKTsKLQotCS8qKgotCSAqIEluZGljYXRlcyBMb3dlciBwcmlvcml0eSBhcyBhIFByaW9yaXR5IGVudW1lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJpb3JpdHkgTE9XRVIgPSBuZXcgUHJpb3JpdHkoTE9XRVJfUFJJT1JJVFlfVkFMVUUsCi0JCQlMT1dFUl9QUklPUklUWV9MSVRFUkFMKTsKLQotCS8qKgotCSAqIEluZGljYXRlcyBMb3dlc3QgcHJpb3JpdHkgYXMgYSBQcmlvcml0eSBlbnVtZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByaW9yaXR5IExPV0VTVCA9IG5ldyBQcmlvcml0eShMT1dFU1RfUFJJT1JJVFlfVkFMVUUsCi0JCQlMT1dFU1RfUFJJT1JJVFlfTElURVJBTCk7Ci0KLQkvKioKLQkgKiBUaGUgb3JkZXJlZCBhcnJheSBvZiBwb3NzaWJsZSBlbnVtZXJhdGlvbiB2YWx1ZXMgKDA9PiBIaWdoZXN0LAotCSAqIGxlbmd0aC0xPT5Mb3dlc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmlvcml0eVtdIEVOVU1fQVJSQVkgPSBuZXcgUHJpb3JpdHlbXSB7IEhJR0hFU1QsCi0JCQlISUdIRVIsIEhJR0gsIE5PUk1BTCwgTE9XLCBMT1dFUiwgTE9XRVNUIH07Ci0KLQkvKioKLQkgKiAKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0IGluc3RhbmNlIG9mIHRoZSBQcmlvcml0eSBFTlVNIGZvciBhTGl0ZXJhbC4KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBOT1JNQUwgaWYgdGhlIHN1cHBsaWVkIHZhbHVlIG9mIGFMaXRlcmFsIGlzCi0JICogaW52YWxpZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFMaXRlcmFsCi0JICogICAgICAgICAgICBPbmUgb2YgdGhlIGRlZmluZWQgKl9MSVRFUkFMIGNvbnN0YW50cyBvZiB0aGlzIGNsYXNzCi0JICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBQcmlvcml0eSBFbnVtIG9yIE5PUk1BTCBpZiBhTGl0ZXJhbCBpcyBpbnZhbGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBQcmlvcml0eSBnZXQoU3RyaW5nIGFMaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgRU5VTV9BUlJBWS5sZW5ndGg7IGkrKykgewotCQkJaWYgKEVOVU1fQVJSQVlbaV0uZ2V0TGl0ZXJhbCgpLmVxdWFscyhhTGl0ZXJhbCkpCi0JCQkJcmV0dXJuIEVOVU1fQVJSQVlbaV07Ci0JCX0KLQkJcmV0dXJuIE5PUk1BTDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0IGluc3RhbmNlIG9mIHRoZSBQcmlvcml0eSBFTlVNIGZvciBhVmFsdWUuCi0JICogCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gTk9STUFMIGlmIHRoZSBzdXBwbGllZCB2YWx1ZSBvZiBhVmFsdWUgaXMKLQkgKiBpbnZhbGlkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYVZhbHVlCi0JICogICAgICAgICAgICBPbmUgb2YgdGhlIGRlZmluZWQgKl9WQUxVRSBjb25zdGFudHMgb2YgdGhpcyBjbGFzcwotCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgUHJpb3JpdHkgRW51bSBvciBOT1JNQUwgaWYgYVZhbHVlIGlzIGludmFsaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByaW9yaXR5IGdldChpbnQgYVZhbHVlKSB7Ci0KLQkJc3dpdGNoIChhVmFsdWUpIHsKLQkJY2FzZSBISUdIRVNUX1BSSU9SSVRZX1ZBTFVFOgotCQkJcmV0dXJuIEhJR0hFU1Q7Ci0JCWNhc2UgSElHSEVSX1BSSU9SSVRZX1ZBTFVFOgotCQkJcmV0dXJuIEhJR0hFUjsKLQkJY2FzZSBISUdIX1BSSU9SSVRZX1ZBTFVFOgotCQkJcmV0dXJuIEhJR0g7Ci0JCWNhc2UgTE9XRVJfUFJJT1JJVFlfVkFMVUU6Ci0JCQlyZXR1cm4gTE9XRVI7Ci0JCWNhc2UgTE9XRVNUX1BSSU9SSVRZX1ZBTFVFOgotCQkJcmV0dXJuIExPV0VTVDsKLQkJY2FzZSBOT1JNQUxfUFJJT1JJVFlfVkFMVUU6Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gTk9STUFMOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JcHJvdGVjdGVkIFByaW9yaXR5KGludCBhVmFsdWUsIFN0cmluZyBhTGl0ZXJhbCkgewotCQl2YWx1ZSA9IGFWYWx1ZTsKLQkJbGl0ZXJhbCA9IGFMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGxpdGVyYWwgc3RyaW5nIGZvciB0aGlzIHNwZWNpZmljIFByaW9yaXR5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogMCBpcyB0aGUgbG93ZXN0IHByaW9yaXR5OyA3IGlzIHRoZSBoaWdoZXN0LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGludGVnZXIgdmFsdWUgZm9yIHRoaXMgc3BlY2lmaWMgUHJpb3JpdHkuIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL1dpemFyZEFjdGlvbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL1dpemFyZEFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YWE5M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9XaXphcmRBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC53aXphcmRzLkNvbW1vbldpemFyZERlc2NyaXB0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC53aXphcmRzLldpemFyZFNob3J0Y3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5JV2l6YXJkUmVnaXN0cnk7Ci0KLS8qKgotICogCi0gKiBQb3B1bGF0ZXMgY29udGV4dCBtZW51cyB3aXRoIHNob3J0Y3V0IGFjdGlvbnMgZm9yIGRlZmluZWQgd2l6YXJkcy4gV2l6YXJkcwotICogbWF5IGJlIGRlZmluZWQgYnkgYW55IG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIHBvaW50czoKLSAqIDxwPgotICogPHVsPgotICogPGxpPjxiPm9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHM8L2I+PC9saT4KLSAqIDxsaT48Yj5vcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzPC9iPjwvbGk+Ci0gKiA8bGk+PGI+b3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkczwvYj48L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogSGVyZSBhcmUgdGhlIHJlcXVpcmVkIHN0ZXBzIGZvciB1c2luZyB0aGlzIGZlYXR1cmUgY29ycmVjdGx5OgotICogPG9sPgotICogPGxpPkRlY2xhcmUgYWxsIG5ldy9pbXBvcnQvZXhwb3J0IHdpemFyZHMgZnJvbSB0aGUgZXh0ZW5zaW9uIHBvaW50cyBhYm92ZSwKLSAqIG9yIGxvY2F0ZSB0aGUgZXhpc3Rpbmcgd2l6YXJkcyB0aGF0IHlvdSBpbnRlbmQgdG8gcmV1c2UuPC9saT4KLSAqIDxsaT5EZWNsYXJlIDxiPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50L2NvbW1vbldpemFyZDwvYj4KLSAqIGVsZW1lbnRzIHRvIGlkZW50aWZ5IHdoaWNoIHdpemFyZHMgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB3aGF0IGl0ZW1zIGluCi0gKiB5b3VyIHZpZXdlciBvciBuYXZpZ2F0b3IuPC9saT4KLSAqIDxsaT5JZiB5b3UgYXJlIHVzaW5nIFJlc291cmNlcyBpbiB5b3VyIHZpZXdlciBhbmQgaGF2ZSBib3VuZCB0aGUgcmVzb3VyY2UKLSAqICBleHRlbnNpb24gZGVjbGFyZWQgaW4gPGI+b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlczwvYj4sIHRoZW4geW91IHdpbGwKLSAqICBnZXQgbW9zdCBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgZm9yIGZyZWUuPC9saT4KLSAqIDxsaT5PdGhlcndpc2UsIHlvdSBtYXkgY2hvb3NlIHRvIGJ1aWxkIHlvdXIgb3duIGN1c3RvbSBtZW51LiBJbiB3aGljaCBjYXNlLAotICogeW91IG1heSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzLCBhbmQgaGFuZCBpdCB0aGUgbWVudSBvciBzdWJtZW51IHRoYXQgeW91IHdhbnQKLSAqIHRvIGxpc3Qgb3V0IHRoZSBhdmFpbGFibGUgd2l6YXJkIHNob3J0Y3V0cyB2aWEKLSAqIHtAbGluayBXaXphcmRBY3Rpb25Hcm91cCNmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyKX0uPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGluc3RhbnRpYXRlLCBidXQgbm90IHN1YmNsYXNzIFdpemFyZEFjdGlvbkdyb3VwLgotICogCi0gKiA8cD4gCi0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPiAgCi0gKiAKLSAqIEBzZWUgUGxhdGZvcm1VSSNnZXRXb3JrYmVuY2goKQotICogQHNlZSBJV29ya2JlbmNoI2dldE5ld1dpemFyZFJlZ2lzdHJ5KCkKLSAqIEBzZWUgSVdvcmtiZW5jaCNnZXRJbXBvcnRXaXphcmRSZWdpc3RyeSgpCi0gKiBAc2VlIElXb3JrYmVuY2gjZ2V0RXhwb3J0V2l6YXJkUmVnaXN0cnkoKQotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXaXphcmRBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwIHsKLQotCS8qKgotCSAqIFRoZSB0eXBlIGZvciBjb21tb25XaXphcmQgZXh0ZW5zaW9ucyB3aXRoIHRoZSB2YWx1ZSAibmV3IiBmb3IgdGhlaXIgdHlwZQotCSAqIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05FVyA9ICJuZXciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgdHlwZSBmb3IgY29tbW9uV2l6YXJkIGV4dGVuc2lvbnMgd2l0aCB0aGUgdmFsdWUgIm5ldyIgZm9yIHRoZWlyIHR5cGUKLQkgKiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JTVBPUlQgPSAiaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHR5cGUgZm9yIGNvbW1vbldpemFyZCBleHRlbnNpb25zIHdpdGggdGhlIHZhbHVlICJuZXciIGZvciB0aGVpciB0eXBlCi0JICogYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRVhQT1JUID0gImV4cG9ydCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5PX0lEUyA9IG5ldyBTdHJpbmdbMF07Ci0KLQkvKiBhIG1hcCBvZiAoaWQsIElBY3Rpb24pLXBhaXJzLiAqLwotCXByaXZhdGUgTWFwIGFjdGlvbnM7Ci0KLQkvKgotCSAqIHRoZSB3aW5kb3cgaXMgcGFzc2VkIHRvIGNyZWF0ZWQgV2l6YXJkU2hvcnRjdXRBY3Rpb25zIGZvciB0aGUgc2hlbGwgYW5kCi0JICogc2VsZWN0aW9uIHNlcnZpY2UuCi0JICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCS8qIHRoZSBjb3JyZWN0IHdpemFyZCByZWdpc3RyeSBmb3IgdGhpcyBhY3Rpb24gZ3JvdXAgKGdldFJlZ2lzdHJ5KCkpICovCi0JcHJpdmF0ZSBJV2l6YXJkUmVnaXN0cnkgd2l6YXJkUmVnaXN0cnk7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIHdpemFyZEFjdGlvbklkczsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhV2luZG93Ci0JICogICAgICAgICAgICBUaGUgd2luZG93IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFjcXVpcmUgYSBTaGVsbCBhbmQgYQotCSAqICAgICAgICAgICAgU2VsZWN0aW9uIFNlcnZpY2UKLQkgKiBAcGFyYW0gYVdpemFyZFJlZ2lzdHJ5Ci0JICogICAgICAgICAgICBUaGUgd2l6YXJkIHJlZ2lzdHJ5IHdpbGwgYmUgdXNlZCB0byBsb2NhdGUgdGhlIGNvcnJlY3Qgd2l6YXJkCi0JICogICAgICAgICAgICBkZXNjcmlwdGlvbnMuCi0JICogQHBhcmFtIGFUeXBlCi0JICogICAgICAgICAgICBJbmRpY2F0ZXMgdGhlIHZhbHVlIG9mIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiB0aGUgY29tbW9uV2l6YXJkCi0JICogICAgICAgICAgICBleHRlbnNpb24gcG9pbnQuIFVzZSBhbnkgb2YgdGhlIFRZUEVfWFhYIGNvbnN0YW50cyBkZWZpbmVkIG9uCi0JICogICAgICAgICAgICB0aGlzIGNsYXNzLgotCSAqIEBzZWUgUGxhdGZvcm1VSSNnZXRXb3JrYmVuY2goKQotCSAqIEBzZWUgSVdvcmtiZW5jaCNnZXROZXdXaXphcmRSZWdpc3RyeSgpCi0JICogQHNlZSBJV29ya2JlbmNoI2dldEltcG9ydFdpemFyZFJlZ2lzdHJ5KCkKLQkgKiBAc2VlIElXb3JrYmVuY2gjZ2V0RXhwb3J0V2l6YXJkUmVnaXN0cnkoKQotCSAqLwotCXB1YmxpYyBXaXphcmRBY3Rpb25Hcm91cChJV29ya2JlbmNoV2luZG93IGFXaW5kb3csCi0JCQlJV2l6YXJkUmVnaXN0cnkgYVdpemFyZFJlZ2lzdHJ5LCBTdHJpbmcgYVR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChhV2luZG93KTsKLQkJQXNzZXJ0LmlzTm90TnVsbChhV2l6YXJkUmVnaXN0cnkpOwotCQlBc3NlcnQKLQkJCQkuaXNUcnVlKGFUeXBlICE9IG51bGwKLQkJCQkJCSYmIChUWVBFX05FVy5lcXVhbHMoYVR5cGUpIHx8IFRZUEVfSU1QT1JULmVxdWFscyhhVHlwZSkgfHwgVFlQRV9FWFBPUlQKLQkJCQkJCQkJLmVxdWFscyhhVHlwZSkpKTsKLQkJd2luZG93ID0gYVdpbmRvdzsKLQkJd2l6YXJkUmVnaXN0cnkgPSBhV2l6YXJkUmVnaXN0cnk7Ci0JCXR5cGUgPSBhVHlwZTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRleHQoQWN0aW9uQ29udGV4dCBhQ29udGV4dCkgewotCQlBc3NlcnQuaXNUcnVlKCFkaXNwb3NlZCk7Ci0KLQkJc3VwZXIuc2V0Q29udGV4dChhQ29udGV4dCk7Ci0JCWlmKGFDb250ZXh0ICE9IG51bGwpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBhQ29udGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQllbGVtZW50ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJLy8gbnVsbCBzaG91bGQgYmUgb2theSBoZXJlCi0JCXNldFdpemFyZEFjdGlvbklkcyhDb21tb25XaXphcmREZXNjcmlwdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEVuYWJsZWRDb21tb25XaXphcmREZXNjcmlwdG9ySWRzKGVsZW1lbnQsIHR5cGUpKTsKLQkJfSBlbHNlIHsKLQkJCXNldFdpemFyZEFjdGlvbklkcyhOT19JRFMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwI2ZpbGxDb250ZXh0TWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlBc3NlcnQuaXNUcnVlKCFkaXNwb3NlZCk7Ci0KLQkJSUFjdGlvbiBhY3Rpb24gPSBudWxsOwotCQlpZiAod2l6YXJkQWN0aW9uSWRzICE9IG51bGwpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdpemFyZEFjdGlvbklkcy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoKGFjdGlvbiA9IGdldEFjdGlvbih3aXphcmRBY3Rpb25JZHNbaV0pKSAhPSBudWxsKQotCQkJCQltZW51LmFkZChhY3Rpb24pOwotCi0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlhY3Rpb25zID0gbnVsbDsKLQkJd2luZG93ID0gbnVsbDsKLQkJd2l6YXJkQWN0aW9uSWRzID0gbnVsbDsKLQkJd2l6YXJkUmVnaXN0cnkgPSBudWxsOwotCQlkaXNwb3NlZCA9IHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIFJldHVybnMgdGhlIGFjdGlvbiBmb3IgdGhlIGdpdmVuIHdpemFyZCBpZCwgb3IgbnVsbCBpZiBub3QKLQkgKiBmb3VuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSUFjdGlvbiBnZXRBY3Rpb24oU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBLZWVwIGEgY2FjaGUsIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IGFjdGlvbiBlYWNoIHRpbWUsCi0JCS8vIHNvIHRoYXQgaW1hZ2UgY2FjaGluZyBpbiBBY3Rpb25Db250cmlidXRpb25JdGVtIHdvcmtzLgotCQlJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKSBnZXRBY3Rpb25zKCkuZ2V0KGlkKTsKLQkJaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0JCQlJV2l6YXJkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gd2l6YXJkUmVnaXN0cnkuZmluZFdpemFyZChpZCk7Ci0JCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJYWN0aW9uID0gbmV3IFdpemFyZFNob3J0Y3V0QWN0aW9uKHdpbmRvdywgZGVzY3JpcHRvcik7Ci0JCQkJZ2V0QWN0aW9ucygpLnB1dChpZCwgYWN0aW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhIG1hcCBvZiAoaWQsIElBY3Rpb24pLXBhaXJzLgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0QWN0aW9ucygpIHsKLQkJaWYgKGFjdGlvbnMgPT0gbnVsbCkKLQkJCWFjdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gYWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdpemFyZEFjdGlvbklkcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0V2l6YXJkQWN0aW9uSWRzKCkgewotCQlyZXR1cm4gd2l6YXJkQWN0aW9uSWRzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3aXphcmRBY3Rpb25JZHMKLQkgKiAgICAgICAgICAgIFRoZSB3aXphcmRBY3Rpb25JZHMgdG8gc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFdpemFyZEFjdGlvbklkcyhTdHJpbmdbXSB3aXphcmRBY3Rpb25JZHMpIHsKLQkJdGhpcy53aXphcmRBY3Rpb25JZHMgPSB3aXphcmRBY3Rpb25JZHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL0FkYXB0YWJpbGl0eVV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvQWRhcHRhYmlsaXR5VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTM2ZjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvQWRhcHRhYmlsaXR5VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIDxwPgotICogUHJvdmlkZXMgdXRpbGl0aWVzIGZvciB3b3JraW5nIHdpdGggYWRhcHRhYmxlIGFuZCBub24tYWRhcHRhYmxlIG9iamVjdHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGFiaWxpdHlVdGlsaXR5IHsKLQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBhZGFwdGVyIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZSAoYW5BZGFwdGVyVHlwZSkKLQkgKiBAcGFyYW0gYW5FbGVtZW50IFRoZSBlbGVtZW50IHRvIGFkYXB0LCB3aGljaCBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQge0BsaW5rIElBZGFwdGFibGV9Ci0JICogQHBhcmFtIGFuQWRhcHRlclR5cGUgVGhlIGNsYXNzIHR5cGUgdG8gcmV0dXJuIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhbkVsZW1lbnQsIENsYXNzIGFuQWRhcHRlclR5cGUpIHsKLQkJaWYgKGFuRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGFuRWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlyZXR1cm4gKChJQWRhcHRhYmxlKSBhbkVsZW1lbnQpLmdldEFkYXB0ZXIoYW5BZGFwdGVyVHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoYW5FbGVtZW50LCBhbkFkYXB0ZXJUeXBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvQ29tbW9uQWN0aXZpdGllc1V0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9Db21tb25BY3Rpdml0aWVzVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OGFjZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9Db21tb25BY3Rpdml0aWVzVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5OYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8cD4KLSAqIEEgcGxhY2Vob2xkZXIgZm9yIGFjdGl2aXRpZXMgQVBJLiBTdGlsbCB1bmRlciBjb25zdHJ1Y3Rpb24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25BY3Rpdml0aWVzVXRpbGl0aWVzIHsKLQotCi0JLyoqCi0JICogPHA+Ci0JICogRmlsdGVycyB0aGUgc3VwcGxpZWQgYXJyYXkgb2YgdGhlRGVzY3JpcHRvcnMgYnkgdGhlIGN1cnJlbnRseSBlbmFibGVkIEFjdGl2aXRpZXMKLQkgKiBAcGFyYW0gdGhlRGVzY3JpcHRvcnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcltdIGZpbHRlckJ5QWN0aXZpdHkoTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbXSB0aGVEZXNjcmlwdG9ycykgewotCQlyZXR1cm4gdGhlRGVzY3JpcHRvcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL0NvbW1vbk5hdmlnYXRvckFjdGlvbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL0NvbW1vbk5hdmlnYXRvckFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNTc1YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9Db21tb25OYXZpZ2F0b3JBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5hY3Rpb25zLkNvbGxhcHNlQWxsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5hY3Rpb25zLkxpbmtFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmZpbHRlcnMuU2VsZWN0RmlsdGVyc0FjdGlvbjsKLQotLyoqIAotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uTmF2aWdhdG9yQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0KLQlwcml2YXRlIExpbmtFZGl0b3JBY3Rpb24gdG9nZ2xlTGlua2luZ0FjdGlvbjsKLQlwcml2YXRlIENvbGxhcHNlQWxsQWN0aW9uIGNvbGxhcHNlQWxsQWN0aW9uOwotCXByaXZhdGUgU2VsZWN0RmlsdGVyc0FjdGlvbiBzZWxlY3RGaWx0ZXJzQWN0aW9uOwotCXByaXZhdGUgZmluYWwgQ29tbW9uVmlld2VyIGNvbW1vblZpZXdlcjsKLQlwcml2YXRlIENvbW1vbk5hdmlnYXRvciBjb21tb25OYXZpZ2F0b3I7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIENvbW1vbk5hdmlnYXRvckFjdGlvbkdyb3VwKENvbW1vbk5hdmlnYXRvciBhTmF2aWdhdG9yLCBDb21tb25WaWV3ZXIgYVZpZXdlcikgewotCQlzdXBlcigpOwotCQljb21tb25OYXZpZ2F0b3IgPSBhTmF2aWdhdG9yOwotCQljb21tb25WaWV3ZXIgPSBhVmlld2VyOwotCQltYWtlQWN0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4gcmVsYXRpdmUgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCVN0cmluZyBpY29uUGF0aCA9ICJpY29ucy9mdWxsLyI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCU5hdmlnYXRvclBsdWdpbiBwbHVnaW4gPSBOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQkJVVJMIGluc3RhbGxVUkwgPSBwbHVnaW4uZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKTsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIGljb25QYXRoICsgcmVsYXRpdmVQYXRoKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4KLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQotCQl0b2dnbGVMaW5raW5nQWN0aW9uID0gbmV3IExpbmtFZGl0b3JBY3Rpb24oY29tbW9uTmF2aWdhdG9yLCBjb21tb25WaWV3ZXIpOwotCQlJbWFnZURlc2NyaXB0b3Igc3luY0ljb24gPSBnZXRJbWFnZURlc2NyaXB0b3IoImVsY2wxNi9zeW5jZWQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJdG9nZ2xlTGlua2luZ0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc3luY0ljb24pOwotCQl0b2dnbGVMaW5raW5nQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKHN5bmNJY29uKTsKLQotCQljb2xsYXBzZUFsbEFjdGlvbiA9IG5ldyBDb2xsYXBzZUFsbEFjdGlvbihjb21tb25WaWV3ZXIpOwotCQlJbWFnZURlc2NyaXB0b3IgY29sbGFwc2VBbGxJY29uID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJlbGNsMTYvY29sbGFwc2VhbGwuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJY29sbGFwc2VBbGxBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGNvbGxhcHNlQWxsSWNvbik7Ci0JCWNvbGxhcHNlQWxsQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKGNvbGxhcHNlQWxsSWNvbik7Ci0KLQkJc2VsZWN0RmlsdGVyc0FjdGlvbiA9IG5ldyBTZWxlY3RGaWx0ZXJzQWN0aW9uKGNvbW1vbk5hdmlnYXRvcik7Ci0JCUltYWdlRGVzY3JpcHRvciBzZWxlY3RGaWx0ZXJzSWNvbiA9IGdldEltYWdlRGVzY3JpcHRvcigiZWxjbDE2L2ZpbHRlcl9wcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RGaWx0ZXJzQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzZWxlY3RGaWx0ZXJzSWNvbik7Ci0JCXNlbGVjdEZpbHRlcnNBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3Ioc2VsZWN0RmlsdGVyc0ljb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cCNmaWxsQWN0aW9uQmFycyhvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyB0aGVBY3Rpb25CYXJzKSB7Ci0JCUlNZW51TWFuYWdlciBtZW51ID0gdGhlQWN0aW9uQmFycy5nZXRNZW51TWFuYWdlcigpOwotCi0JCW1lbnUuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIHNlbGVjdEZpbHRlcnNBY3Rpb24pOwotCQltZW51Lmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKyItZW5kIiwgdG9nZ2xlTGlua2luZ0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQl0aGVBY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkuYWRkKGNvbGxhcHNlQWxsQWN0aW9uKTsKLQkJdGhlQWN0aW9uQmFycy5nZXRUb29sQmFyTWFuYWdlcigpLmFkZCh0b2dnbGVMaW5raW5nQWN0aW9uKTsKLQotCQl0aGVBY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwZmRmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL0NvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5uYXZpZ2F0b3JfbWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMaW5rX1dpdGhfRWRpdG9yX0pvYl87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3VsZF9ub3RfcHJvdmlkZV9jaGlsZHJlbl9mb3JfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvdWxkX25vdF9wcm92aWRlX3BhcmVudF9mb3JfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyZWVWaWV3ZXJFbGVtZW50Q29sbGVjdG9yXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmVlVmlld2VyRWxlbWVudENvbGxlY3Rvcl8xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvcl9Qb3B1cF9NZW51X092ZXJyaWRkZW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVmlld2VyTWFuYWdlcl8wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVuZGluZ1VwZGF0ZUFkYXB0ZXJfUGVuZGluZ0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEFjdGlvbl9zZWxlY3RBbGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDdXQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFzdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NhbFNlbGVjdGlvblRyYW5zZmVyX2Vycm9yTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnR5RGlhbG9nX21lc3NhZ2VUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb25SZWNvcmRfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1vbkVsZW1lbnRBZGFwdGVyXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9wZXJ0eURpYWxvZ19ub1Byb3BlcnR5TWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJfMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZldGNoRWxlbWVudHNKb2JfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXJfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERyb3BIYW5kbGVyRGVzY3JpcHRvcl8xMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvcl9zdGF0dXNMaW5lTXVsdGlTZWxlY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEcm9wSGFuZGxlclJlZ2lzdHJ5XzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9wZXJ0eURpYWxvZ190b29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvcGVydHlEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1vbkZpbHRlclNlbGVjdGlvbkRpYWxvZ180OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcl8xMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1vbkZpbHRlclNlbGVjdGlvbkRpYWxvZ18zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcl8xMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1vbkZpbHRlclNlbGVjdGlvbkRpYWxvZ18yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbW9uRmlsdGVyU2VsZWN0aW9uRGlhbG9nXzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RGaWx0ZXJzQWN0aW9uRGVsZWdhdGVfMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1vbkZpbHRlclNlbGVjdGlvbkRpYWxvZ18wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0RmlsdGVyc0FjdGlvbkRlbGVnYXRlXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2xsYXBzZUFsbEFjdGlvbkRlbGVnYXRlXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJpYWxpemVyRGVzY3JpcHRvcl81OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VyaWFsaXplckRlc2NyaXB0b3JfMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcmlhbGl6ZXJEZXNjcmlwdG9yXzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJpYWxpemVyRGVzY3JpcHRvcl8wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUFjdGlvbl90b29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFzdGVBY3Rpb25fdG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2dfMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2dfMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5XzE2OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGlua0VkaXRvckFjdGlvbkRlbGVnYXRlXzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMaW5rRWRpdG9yQWN0aW9uRGVsZWdhdGVfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnR5RGlhbG9nX3Byb3BlcnR5TWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckV4dGVuc2lvblNpdGVfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1vbkRyb3BIYW5kbGVyU2VydmljZV8wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX01pc3NpbmdfV2FybmluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvb19tYW55X2VsZW1lbnRzX1dhcm5pbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuX2FjdGlvbl9sYWJlbDsgCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQcm9qZWN0V2l6YXJkX2Vycm9yVGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UHJvamVjdEFjdGlvbl90ZXh0OwotCi0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9Db21tb25Tb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvQ29tbW9uU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NGIzYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9Db21tb25Tb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLk5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb247Ci0KLS8vIFRPRE8gRml4IHVwIENvbW1vbiBTb3J0ZXIKLQotLyoqCi0gKiA8cD4KLSAqIFByb3ZpZGVzIGdlbmVyaWMsIGV4dGVuc2libGUgc29ydGluZyBzdHJhdGVnaWVzIGZvciB0aGUgQ29tbW9uIE5hdmlnYXRvci4KLSAqIDwvcD4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yTWFuYWdlciBDT05URU5UX0RFU0NSSVBUT1JfUkVHSVNUUlkgPSBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvck1hbmFnZXIKLQkJCS5nZXRJbnN0YW5jZSgpOwotCi0JcHJpdmF0ZSBDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBudWxsOwotCi0JcHJpdmF0ZSBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgY29udGVudFNlcnZpY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29tbW9uU29ydGVyKElOYXZpZ2F0b3JDb250ZW50U2VydmljZSBhQ29udGVudFNlcnZpY2UpIHsKLQkJc3VwZXIoKTsKLQkJY29udGVudFNlcnZpY2UgPSBhQ29udGVudFNlcnZpY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlciNjYXRlZ29yeShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IGFuRWxlbWVudCkgewotCQlTZXQgZGVzY3JpcHRvcnMgPSBDT05URU5UX0RFU0NSSVBUT1JfUkVHSVNUUlkKLQkJCQkuZ2V0RW5hYmxlZENvbnRlbnREZXNjcmlwdG9ycyhhbkVsZW1lbnQsIGNvbnRlbnRTZXJ2aWNlCi0JCQkJCQkuZ2V0Vmlld2VyRGVzY3JpcHRvcigpKTsKLQkJSXRlcmF0b3IgZEl0ciA9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7Ci0JCWlmIChkSXRyLmhhc05leHQoKSkKLQkJCXJldHVybiAoKElOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcikgZEl0ci5uZXh0KCkpLmdldFByaW9yaXR5KCk7Ci0JCXJldHVybiBQcmlvcml0eS5OT1JNQUxfUFJJT1JJVFlfVkFMVUU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlciNjb21wYXJlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGx2YWx1ZSwgT2JqZWN0IHJ2YWx1ZSkgewotCQlpbnQgcmFuayA9IGNhdGVnb3J5KHJ2YWx1ZSkgLSBjYXRlZ29yeShsdmFsdWUpOwotCQlpZiAocmFuayA9PSAwKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJbmV3IE9iamVjdFtdIHsgbHZhbHVlLCBydmFsdWUgfSk7Ci0JCQlOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW10gZGVzY3JpcHRvckluc3RhbmNlcyA9ICgoTmF2aWdhdG9yQ29udGVudFNlcnZpY2UpIGNvbnRlbnRTZXJ2aWNlKQotCQkJCQkuZmluZFJlbGV2YW50Q29udGVudEV4dGVuc2lvbnMoc2VsZWN0aW9uKTsKLQkJCWlmIChkZXNjcmlwdG9ySW5zdGFuY2VzLmxlbmd0aCA+IDApCi0JCQkJcmV0dXJuIGRlc2NyaXB0b3JJbnN0YW5jZXNbMF0uZ2V0Q29tcGFyYXRvcigpLmNvbXBhcmUobHZhbHVlLAotCQkJCQkJcnZhbHVlKTsKLQkJCXJldHVybiByYW5rOwotCi0JCX0KLQkJcmV0dXJuIHJhbms7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlciNzb3J0KG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNvcnQoVmlld2VyIHZpZXdlciwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJQXJyYXlzLnNvcnQoZWxlbWVudHMsIGdldENvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKLQkJaWYgKGNvbXBhcmF0b3IgPT0gbnVsbCkgewotCQkJY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LAotCQkJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQkJcmV0dXJuIENvbW1vblNvcnRlci50aGlzLmNvbXBhcmUobnVsbCwgbzEsIG8yKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBjb21wYXJhdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9DdXN0b21BbmRFeHByZXNzaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL0N1c3RvbUFuZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5YjhlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL0N1c3RvbUFuZEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSUV2YWx1YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBDcmVhdGUgYW4gQU5ELXR5cGUgY29yZSBleHByZXNzaW9uIGZyb20gYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50IG9mIGFyYml0cmFyeSBuYW1lLiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21BbmRFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBmRXhwcmVzc2lvbnM7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gQU5ELXR5cGUgY29yZSBleHByZXNzaW9uIGZyb20gYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50IG9mIGFyYml0cmFyeSBuYW1lLiAKLQkgKgotCSAqQHBhcmFtIGVsZW1lbnQgQW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50IG9mIGFyYml0cmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBDdXN0b21BbmRFeHByZXNzaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZWxlbWVudCk7Ci0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKCk7Ci0KLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApCi0JCQlmRXhwcmVzc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJZkV4cHJlc3Npb25zLmFkZChFbGVtZW50SGFuZGxlci5nZXREZWZhdWx0KCkuY3JlYXRlKAotCQkJCQkJRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCksIGNoaWxkcmVuW2ldKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAwLCBjZS5nZXRNZXNzYWdlKCksIGNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBFdmFsdWF0aW9uUmVzdWx0IGV2YWx1YXRlKElFdmFsdWF0aW9uQ29udGV4dCBzY29wZSkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZFeHByZXNzaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIEV2YWx1YXRpb25SZXN1bHQuVFJVRTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSBFdmFsdWF0aW9uUmVzdWx0LlRSVUU7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZFeHByZXNzaW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSBpdGVyLm5leHQoKTsKLQkJCXJlc3VsdCA9IHJlc3VsdC5hbmQoZXhwcmVzc2lvbi5ldmFsdWF0ZShzY29wZSkpOwotCQkJLy8ga2VlcCBpdGVyYXRpbmcgZXZlbiBpZiB3ZSBoYXZlIGEgbm90IGxvYWRlZCBmb3VuZC4gSXQgY2FuIGJlCi0JCQkvLyB0aGF0IHdlIGZpbmQgYSBmYWxzZSB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIGJldHRlciByZXN1bHQuCi0JCQlpZiAocmVzdWx0ID09IEV2YWx1YXRpb25SZXN1bHQuRkFMU0UpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9JTmF2aWdhdG9ySGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvSU5hdmlnYXRvckhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZWRlOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9JTmF2aWdhdG9ySGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBJTmF2aWdhdG9ySGVscENvbnRleHRJZHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IE5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DVVRfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJ0ZXh0X2N1dF9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09QWV9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInRleHRfY29weV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUEFTVEVfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJ0ZXh0X3Bhc3RlX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERUxFVEVfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJ0ZXh0X2RlbGV0ZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU0VMRUNUX0FMTF9BQ1RJT04gPSBQUkVGSVgKLSAgICAgICAgICAgICsgInRleHRfc2VsZWN0X2FsbF9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvTmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvTmF2aWdhdG9yQ29udGVudFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5MGFmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL05hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUV4dGVuc2lvbkFjdGl2YXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUV4dGVuc2lvblN0YXRlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklNZW1lbnRvQXdhcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLk5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLk5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLk5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5OYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLk5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLlN0cnVjdHVyZWRWaWV3ZXJNYW5hZ2VyOwotCi0vKioKLSAqIDxwPgotICogUHJvdmlkZXMgY2VudHJhbGl6ZWQgYWNjZXNzIHRvIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQotICogTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbnMuIENhbiBiZSBpbnN0YW50aWF0ZWQgYXMgbmVlZGVkLCBidXQgc2hvdWxkIGJlCi0gKiBjYWNoZWQgZm9yIGFjdGl2ZSB2aWV3ZXJzLiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIGdpdmVuIHZpZXdlciB3aWxsIGJlCi0gKiBjYWNoZWQgYnkgdGhlIE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlLCBub3QgaW5jbHVkaW5nIENvbnRlbnRQcm92aWRlcnMgYW5kCi0gKiBMYWJlbCBQcm92aWRlcnMgY3JlYXRlZCBieSB7QGxpbmsgI2NyZWF0ZUNvbW1vbkNvbnRlbnRQcm92aWRlcigpfWFuZAotICoge0BsaW5rICNjcmVhdGVDb21tb25MYWJlbFByb3ZpZGVyKCl9cmVzcGVjdGl2ZWx5LgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0b3JDb250ZW50U2VydmljZSBpbXBsZW1lbnRzIElFeHRlbnNpb25BY3RpdmF0aW9uTGlzdGVuZXIsCi0JCUlNZW1lbnRvQXdhcmUsIElOYXZpZ2F0b3JDb250ZW50U2VydmljZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZSBOQVZJR0FUT1JfQUNUSVZBVElPTl9TRVJWSUNFID0gTmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UKLQkJCS5nZXRJbnN0YW5jZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyIENPTlRFTlRfREVTQ1JJUFRPUl9SRUdJU1RSWSA9IE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yTWFuYWdlcgotCQkJLmdldEluc3RhbmNlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnkgVklFV0VSX0RFU0NSSVBUT1JfUkVHSVNUUlkgPSBOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnkKLQkJCS5nZXRJbnN0YW5jZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbltdIE5PX0RFU0NSSVBUT1JfSU5TVEFOQ0VTID0gbmV3IE5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb25bMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJVHJlZUNvbnRlbnRQcm92aWRlcltdIE5PX0NPTlRFTlRfUFJPVklERVJTID0gbmV3IElUcmVlQ29udGVudFByb3ZpZGVyWzBdOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUxhYmVsUHJvdmlkZXJbXSBOT19MQUJFTF9QUk9WSURFUlMgPSBuZXcgSUxhYmVsUHJvdmlkZXJbMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbXSBOT19ERVNDUklQVE9SUyA9IG5ldyBJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTk9fRVhURU5TSU9OX0lEUyA9IG5ldyBTdHJpbmdbMF07Ci0KLQlwcml2YXRlIGZpbmFsIE5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3Igdmlld2VyRGVzY3JpcHRvcjsKLQotCXByaXZhdGUgZmluYWwgTGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKgotCSAqIEEgbWFwIG9mIChTdHJpbmctYmFzZWQtTmF2aWdhdG9yLUNvbnRlbnQtRXh0ZW5zaW9uLUlEcywKLQkgKiBOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uLW9iamVjdHMpLXBhaXJzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAgY29udGVudEV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVmlld2VyTWFuYWdlciBzdHJ1Y3R1cmVkVmlld2VyTWFuYWdlcjsKLQotCXByaXZhdGUgSVRyZWVDb250ZW50UHJvdmlkZXJbXSByb290Q29udGVudFByb3ZpZGVyczsKLQotCXByaXZhdGUgV2Vha0hhc2hNYXAgY29udHJpYnV0aW9uTWVtb3J5OwotCi0JcHJpdmF0ZSBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yQ29udGVudFNlcnZpY2UoU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlzdXBlcigpOwotCQlhVmlld2VySWQgPSBhVmlld2VySWQgIT0gbnVsbCA/IGFWaWV3ZXJJZCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCXZpZXdlckRlc2NyaXB0b3IgPSBWSUVXRVJfREVTQ1JJUFRPUl9SRUdJU1RSWQotCQkJCS5nZXROYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yKGFWaWV3ZXJJZCk7Ci0JCU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuYWRkRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyKHZpZXdlckRlc2NyaXB0b3IuZ2V0Vmlld2VySWQoKSwKLQkJCQkJCXRoaXMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBOYXZpZ2F0b3JDb250ZW50U2VydmljZShTdHJpbmcgYVZpZXdlcklkLCBTdHJ1Y3R1cmVkVmlld2VyIGFWaWV3ZXIpIHsKLQkJdGhpcyhhVmlld2VySWQpOwotCQlzdHJ1Y3R1cmVkVmlld2VyTWFuYWdlciA9IG5ldyBTdHJ1Y3R1cmVkVmlld2VyTWFuYWdlcihhVmlld2VyKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldFZpc2libGVFeHRlbnNpb25JZHMoKSB7Ci0KLQkJTGlzdCB2aXNpYmxlRXh0ZW5zaW9uSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IENPTlRFTlRfREVTQ1JJUFRPUl9SRUdJU1RSWS5nZXRBbGxDb250ZW50RGVzY3JpcHRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHZpZXdlckRlc2NyaXB0b3IuaXNWaXNpYmxlQ29udGVudEV4dGVuc2lvbihkZXNjcmlwdG9yc1tpXS5nZXRJZCgpKSkgCi0JCQkJdmlzaWJsZUV4dGVuc2lvbklkcy5hZGQoZGVzY3JpcHRvcnNbaV0uZ2V0SWQoKSk7Ci0JCX0gCi0JCWlmKHZpc2libGVFeHRlbnNpb25JZHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIE5PX0VYVEVOU0lPTl9JRFM7Ci0JCXJldHVybiAoU3RyaW5nW10pIHZpc2libGVFeHRlbnNpb25JZHMudG9BcnJheShuZXcgU3RyaW5nW3Zpc2libGVFeHRlbnNpb25JZHMuc2l6ZSgpXSk7Ci0JCQotCi0JfQotCQotCXB1YmxpYyBJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbXSBnZXRWaXNpYmxlRXh0ZW5zaW9ucygpIHsKLQkJTGlzdCB2aXNpYmxlRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gQ09OVEVOVF9ERVNDUklQVE9SX1JFR0lTVFJZLmdldEFsbENvbnRlbnREZXNjcmlwdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodmlld2VyRGVzY3JpcHRvci5pc1Zpc2libGVDb250ZW50RXh0ZW5zaW9uKGRlc2NyaXB0b3JzW2ldLmdldElkKCkpKSAKLQkJCQl2aXNpYmxlRGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3JzW2ldKTsKLQkJfSAKLQkJaWYodmlzaWJsZURlc2NyaXB0b3JzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBOT19ERVNDUklQVE9SUzsKLQkJcmV0dXJuIChJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbXSkgdmlzaWJsZURlc2NyaXB0b3JzLnRvQXJyYXkobmV3IElOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvclt2aXNpYmxlRGVzY3JpcHRvcnMuc2l6ZSgpXSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yW10gYWN0aXZhdGVFeHRlbnNpb25zKFN0cmluZ1tdIGV4dGVuc2lvbklkcywgYm9vbGVhbiB0b0RlYWN0aXZhdGVBbGxPdGhlcnMpIHsKLQkJCi0JCVNldCBhY3RpdmF0ZWREZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZpbmFsIFN0cmluZyB2aWV3ZXJJZCA9IHZpZXdlckRlc2NyaXB0b3IuZ2V0Vmlld2VySWQoKTsKLQkJTmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hY3RpdmF0ZU5hdmlnYXRvckV4dGVuc2lvbih2aWV3ZXJJZCwgZXh0ZW5zaW9uSWRzLCB0cnVlKTsKLQkJZm9yKGludCBleHRJZCA9IDA7IGV4dElkIDwgZXh0ZW5zaW9uSWRzLmxlbmd0aDsgZXh0SWQrKykgewkJCQotCQkJYWN0aXZhdGVkRGVzY3JpcHRvcnMuYWRkKENPTlRFTlRfREVTQ1JJUFRPUl9SRUdJU1RSWS5nZXRDb250ZW50RGVzY3JpcHRvcihleHRlbnNpb25JZHNbZXh0SWRdKSk7Ci0JCX0KLQkJCi0JCWlmKHRvRGVhY3RpdmF0ZUFsbE90aGVycykgewotCQkJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IENPTlRFTlRfREVTQ1JJUFRPUl9SRUdJU1RSWS5nZXRBbGxDb250ZW50RGVzY3JpcHRvcnMoKTsJCQkKLQkJCUxpc3QgZGVzY3JpcHRvckxpc3QgPSAgbmV3IEFycmF5TGlzdCggQXJyYXlzLmFzTGlzdChkZXNjcmlwdG9ycykgKTsKLQotCQkJCQkKLQkJCWZvcihpbnQgZGVzY3JpcHRvckluZHg9MDsgZGVzY3JpcHRvckluZHg8ZGVzY3JpcHRvcnMubGVuZ3RoOyBkZXNjcmlwdG9ySW5keCsrKQotCQkJCWZvcihpbnQgZXh0SWQ9MDsgZXh0SWQgPGV4dGVuc2lvbklkcy5sZW5ndGg7IGV4dElkKyspCi0JCQkJCWlmKGRlc2NyaXB0b3JzW2Rlc2NyaXB0b3JJbmR4XS5nZXRJZCgpLmVxdWFscyhleHRlbnNpb25JZHNbZXh0SWRdKSkKLQkJCQkJCWRlc2NyaXB0b3JMaXN0LnJlbW92ZShkZXNjcmlwdG9yc1tkZXNjcmlwdG9ySW5keF0pOwotCQkJCi0JCQlTdHJpbmdbXSBkZWFjdGl2YXRlZEV4dGVuc2lvbnMgPSBuZXcgU3RyaW5nW2Rlc2NyaXB0b3JMaXN0LnNpemUoKV07Ci0JCQlmb3IoaW50IGk9MDsgaTxkZXNjcmlwdG9yTGlzdC5zaXplKCk7IGkrKykgewotCQkJCUlOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKElOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcikgZGVzY3JpcHRvckxpc3QuZ2V0KGkpOwotCQkJCWRlYWN0aXZhdGVkRXh0ZW5zaW9uc1tpXSA9IGRlc2NyaXB0b3IuZ2V0SWQoKTsJCQotCQkJfQkJCQkJCQkKLQkJCU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkuYWN0aXZhdGVOYXZpZ2F0b3JFeHRlbnNpb24odmlld2VySWQsIGRlYWN0aXZhdGVkRXh0ZW5zaW9ucywgZmFsc2UpOwkJCi0JCX0KLQotCQlpZihhY3RpdmF0ZWREZXNjcmlwdG9ycy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBOT19ERVNDUklQVE9SUzsKLQkJcmV0dXJuIChJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbXSkgYWN0aXZhdGVkRGVzY3JpcHRvcnMudG9BcnJheShuZXcgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbYWN0aXZhdGVkRGVzY3JpcHRvcnMuc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyBJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbXSBkZWFjdGl2YXRlRXh0ZW5zaW9ucyhTdHJpbmdbXSBleHRlbnNpb25JZHMsIGJvb2xlYW4gdG9FbmFibGVBbGxPdGhlcnMpIHsKLQotCQlTZXQgYWN0aXZhdGVkRGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCQlmaW5hbCBTdHJpbmcgdmlld2VySWQgPSB2aWV3ZXJEZXNjcmlwdG9yLmdldFZpZXdlcklkKCk7Ci0JCU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkuYWN0aXZhdGVOYXZpZ2F0b3JFeHRlbnNpb24odmlld2VySWQsIGV4dGVuc2lvbklkcywgZmFsc2UpOyAKLQkJCi0JCWlmKHRvRW5hYmxlQWxsT3RoZXJzKSB7Ci0JCQlOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gQ09OVEVOVF9ERVNDUklQVE9SX1JFR0lTVFJZLmdldEFsbENvbnRlbnREZXNjcmlwdG9ycygpOwkJCQotCQkJTGlzdCBkZXNjcmlwdG9yTGlzdCA9ICBuZXcgQXJyYXlMaXN0KCBBcnJheXMuYXNMaXN0KGRlc2NyaXB0b3JzKSApOwotCi0JCQkJCQotCQkJZm9yKGludCBkZXNjcmlwdG9ySW5keD0wOyBkZXNjcmlwdG9ySW5keDxkZXNjcmlwdG9ycy5sZW5ndGg7IGRlc2NyaXB0b3JJbmR4KyspCi0JCQkJZm9yKGludCBleHRJZD0wOyBleHRJZCA8ZXh0ZW5zaW9uSWRzLmxlbmd0aDsgZXh0SWQrKykKLQkJCQkJaWYoZGVzY3JpcHRvcnNbZGVzY3JpcHRvckluZHhdLmdldElkKCkuZXF1YWxzKGV4dGVuc2lvbklkc1tleHRJZF0pKQotCQkJCQkJZGVzY3JpcHRvckxpc3QucmVtb3ZlKGRlc2NyaXB0b3JzW2Rlc2NyaXB0b3JJbmR4XSk7IAotCQkJCi0KLQkJCVN0cmluZ1tdIGFjdGl2YXRlZEV4dGVuc2lvbnMgPSBuZXcgU3RyaW5nW2Rlc2NyaXB0b3JMaXN0LnNpemUoKV07Ci0JCQlmb3IoaW50IGk9MDsgaTxkZXNjcmlwdG9yTGlzdC5zaXplKCk7IGkrKykgewotCQkJCU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IpIGRlc2NyaXB0b3JMaXN0LmdldChpKTsKLQkJCQlhY3RpdmF0ZWRFeHRlbnNpb25zW2ldID0gZGVzY3JpcHRvci5nZXRJZCgpOwkKLQkJCQlhY3RpdmF0ZWREZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQl9Ci0JCQlOYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpLmFjdGl2YXRlTmF2aWdhdG9yRXh0ZW5zaW9uKHZpZXdlcklkLCBhY3RpdmF0ZWRFeHRlbnNpb25zLCB0cnVlKTsKLQkJfQotCQlpZihhY3RpdmF0ZWREZXNjcmlwdG9ycy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBOT19ERVNDUklQVE9SUzsKLQkJCi0JCXJldHVybiAoSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yW10pIGFjdGl2YXRlZERlc2NyaXB0b3JzLnRvQXJyYXkobmV3IE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yW2FjdGl2YXRlZERlc2NyaXB0b3JzLnNpemUoKV0pOwotCX0KLQkKLQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLklOYXZpZ2F0b3JDb250ZW50U2VydmljZSNjcmVhdGVDb21tb25Db250ZW50UHJvdmlkZXIoKQotCSAqLwotCXB1YmxpYyBJVHJlZUNvbnRlbnRQcm92aWRlciBjcmVhdGVDb21tb25Db250ZW50UHJvdmlkZXIoKSB7Ci0JCWlmKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCWlmKGNvbnRlbnRQcm92aWRlciA9PSBudWxsKQotCQkJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBOYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gY29udGVudFByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLklOYXZpZ2F0b3JDb250ZW50U2VydmljZSNjcmVhdGVDb21tb25MYWJlbFByb3ZpZGVyKCkKLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgY3JlYXRlQ29tbW9uTGFiZWxQcm92aWRlcigpIHsKLQkJaWYobGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0JCXN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCQlpZihsYWJlbFByb3ZpZGVyID09IG51bGwpCi0JCQkJbGFiZWxQcm92aWRlciA9IG5ldyBOYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7IAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLklOYXZpZ2F0b3JDb250ZW50U2VydmljZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKEl0ZXJhdG9yIGNvbnRlbnRJdHIgPSBjb250ZW50RXh0ZW5zaW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOyBjb250ZW50SXRyCi0JCQkJLmhhc05leHQoKTspCi0JCQkoKE5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24pIGNvbnRlbnRJdHIubmV4dCgpKS5kaXNwb3NlKCk7Ci0JCU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkucmVtb3ZlRXh0ZW5zaW9uQWN0aXZhdGlvbkxpc3RlbmVyKAotCQkJCQkJdmlld2VyRGVzY3JpcHRvci5nZXRWaWV3ZXJJZCgpLCB0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZXJ2aWNlKFZpZXdlciBhVmlld2VyLCBPYmplY3QgYW5PbGRJbnB1dCwKLQkJCU9iamVjdCBhTmV3SW5wdXQpIHsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQotCQkJaWYgKHN0cnVjdHVyZWRWaWV3ZXJNYW5hZ2VyID09IG51bGwpIHsKLQkJCQlzdHJ1Y3R1cmVkVmlld2VyTWFuYWdlciA9IG5ldyBTdHJ1Y3R1cmVkVmlld2VyTWFuYWdlcihhVmlld2VyKTsKLQkJCQlzdHJ1Y3R1cmVkVmlld2VyTWFuYWdlci5pbnB1dENoYW5nZWQoYW5PbGRJbnB1dCwgYU5ld0lucHV0KTsKLQkJCX0gZWxzZQotCQkJCXN0cnVjdHVyZWRWaWV3ZXJNYW5hZ2VyLmlucHV0Q2hhbmdlZChhVmlld2VyLCBhbk9sZElucHV0LAotCQkJCQkJYU5ld0lucHV0KTsKLQotCQkJZm9yIChJdGVyYXRvciBjb250ZW50SXRyID0gY29udGVudEV4dGVuc2lvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgY29udGVudEl0cgotCQkJCQkuaGFzTmV4dCgpOykKLQkJCQlzdHJ1Y3R1cmVkVmlld2VyTWFuYWdlcgotCQkJCQkJLmluaXRpYWxpemUoKChOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uKSBjb250ZW50SXRyCi0JCQkJCQkJCS5uZXh0KCkpLmdldENvbnRlbnRQcm92aWRlcigpKTsKLQotCQkJTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbltdIHJlc3VsdEluc3RhbmNlcyA9IGZpbmRSb290Q29udGVudERlc2NyaXB0b3JzKGFOZXdJbnB1dCk7Ci0JCQlyb290Q29udGVudFByb3ZpZGVycyA9IGV4dHJhY3RDb250ZW50UHJvdmlkZXJzKHJlc3VsdEluc3RhbmNlcyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2UjZmluZFN0YXRlTW9kZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUV4dGVuc2lvblN0YXRlTW9kZWwgZmluZFN0YXRlTW9kZWwoU3RyaW5nIGFuRXh0ZW5zaW9uSWQpIHsKLQkJcmV0dXJuIGdldEV4dGVuc2lvbigKLQkJCQlDT05URU5UX0RFU0NSSVBUT1JfUkVHSVNUUlkuZ2V0Q29udGVudERlc2NyaXB0b3IoYW5FeHRlbnNpb25JZCkpCi0JCQkJLmdldFN0YXRlTW9kZWwoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2UjZmluZFBhcmVudENvbnRlbnRQcm92aWRlcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVRyZWVDb250ZW50UHJvdmlkZXJbXSBmaW5kUGFyZW50Q29udGVudFByb3ZpZGVycyhPYmplY3QgYW5FbGVtZW50KSB7Ci0JCU5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb25bXSByZXN1bHRJbnN0YW5jZXMgPSBmaW5kUmVsZXZhbnRDb250ZW50RXh0ZW5zaW9ucyhhbkVsZW1lbnQpOwotCQlyZXR1cm4gZXh0cmFjdENvbnRlbnRQcm92aWRlcnMocmVzdWx0SW5zdGFuY2VzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2UjZmluZFJvb3RDb250ZW50UHJvdmlkZXJzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElUcmVlQ29udGVudFByb3ZpZGVyW10gZmluZFJvb3RDb250ZW50UHJvdmlkZXJzKE9iamVjdCBhbkVsZW1lbnQpIHsKLQkJaWYgKHJvb3RDb250ZW50UHJvdmlkZXJzICE9IG51bGwpCi0JCQlyZXR1cm4gcm9vdENvbnRlbnRQcm92aWRlcnM7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKHJvb3RDb250ZW50UHJvdmlkZXJzID09IG51bGwpIHsKLQkJCQlOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW10gcmVzdWx0SW5zdGFuY2VzID0gZmluZFJvb3RDb250ZW50RGVzY3JpcHRvcnMoYW5FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0SW5zdGFuY2VzLmxlbmd0aCA+IDApCi0JCQkJCXJvb3RDb250ZW50UHJvdmlkZXJzID0gZXh0cmFjdENvbnRlbnRQcm92aWRlcnMocmVzdWx0SW5zdGFuY2VzKTsKLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0SW5zdGFuY2VzID0gZmluZFJvb3RDb250ZW50RGVzY3JpcHRvcnMoYW5FbGVtZW50LAotCQkJCQkJCWZhbHNlKTsKLQkJCQkJcm9vdENvbnRlbnRQcm92aWRlcnMgPSBleHRyYWN0Q29udGVudFByb3ZpZGVycyhyZXN1bHRJbnN0YW5jZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9vdENvbnRlbnRQcm92aWRlcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlI2ZpbmRSZWxldmFudENvbnRlbnRQcm92aWRlcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVRyZWVDb250ZW50UHJvdmlkZXJbXSBmaW5kUmVsZXZhbnRDb250ZW50UHJvdmlkZXJzKE9iamVjdCBhbkVsZW1lbnQpIHsKLQkJTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbltdIHJlc3VsdEluc3RhbmNlcyA9IGZpbmRSZWxldmFudENvbnRlbnRFeHRlbnNpb25zKGFuRWxlbWVudCk7Ci0JCXJldHVybiBleHRyYWN0Q29udGVudFByb3ZpZGVycyhyZXN1bHRJbnN0YW5jZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLklOYXZpZ2F0b3JDb250ZW50U2VydmljZSNmaW5kUmVsZXZhbnRMYWJlbFByb3ZpZGVycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCi0JcHVibGljIElMYWJlbFByb3ZpZGVyW10gZmluZFJlbGV2YW50TGFiZWxQcm92aWRlcnMoT2JqZWN0IGFuRWxlbWVudCkgeyAKLQkJTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbltdIHJlc3VsdEluc3RhbmNlcyA9IGZpbmRSZWxldmFudENvbnRlbnRFeHRlbnNpb25zKAotCQkJCWFuRWxlbWVudCwgZmFsc2UpOwotCQlyZXR1cm4gZXh0cmFjdExhYmVsUHJvdmlkZXJzKHJlc3VsdEluc3RhbmNlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlI2ZpbmRSZWxldmFudENvbnRlbnRFeHRlbnNpb25zKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb25bXSBmaW5kUmVsZXZhbnRDb250ZW50RXh0ZW5zaW9ucygKLQkJCU9iamVjdCBhbkVsZW1lbnQpIHsKLQkJcmV0dXJuIGZpbmRSZWxldmFudENvbnRlbnRFeHRlbnNpb25zKGFuRWxlbWVudCwgdHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlI2ZpbmRSZWxldmFudENvbnRlbnRFeHRlbnNpb25zKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW10gZmluZFJlbGV2YW50Q29udGVudEV4dGVuc2lvbnMoCi0JCQlPYmplY3QgYW5FbGVtZW50LCBib29sZWFuIHRvTG9hZElmTmVjZXNzYXJ5KSB7Ci0JCVNldCBlbmFibGVkRGVzY3JpcHRvcnMgPSBnZXRFbmFibGVkRGVzY3JpcHRvcnMoYW5FbGVtZW50KTsKLQkJcmV0dXJuIGV4dHJhY3REZXNjcmlwdG9ySW5zdGFuY2VzKGVuYWJsZWREZXNjcmlwdG9ycywgdG9Mb2FkSWZOZWNlc3NhcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLklOYXZpZ2F0b3JDb250ZW50U2VydmljZSNmaW5kUmVsZXZhbnRDb250ZW50RXh0ZW5zaW9ucyhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW10gZmluZFJlbGV2YW50Q29udGVudEV4dGVuc2lvbnMoCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCVNldCBjb250ZW50RGVzY3JpcHRvcnMgPSBnZXRFbmFibGVkRGVzY3JpcHRvcnMoYVNlbGVjdGlvbik7Ci0JCWlmIChjb250ZW50RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gTk9fREVTQ1JJUFRPUl9JTlNUQU5DRVM7IAotCQlyZXR1cm4gZXh0cmFjdERlc2NyaXB0b3JJbnN0YW5jZXMoY29udGVudERlc2NyaXB0b3JzKTsKLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1lbWJlckNvbnRyaWJ1dGlvbigKLQkJCU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yIHNvdXJjZSwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQotCQlpZiAoc291cmNlICE9IG51bGwgJiYgZWxlbWVudHMgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCQkJZ2V0Q29udHJpYnV0aW9uTWVtb3J5KCkucHV0KGVsZW1lbnRzW2ldLCBzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1lbWJlckNvbnRyaWJ1dGlvbigKLQkJCU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yIHNvdXJjZSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIGVsZW1lbnQgIT0gbnVsbCkKLQkJCWdldENvbnRyaWJ1dGlvbk1lbW9yeSgpLnB1dChlbGVtZW50LCBzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciBnZXRTb3VyY2VPZkNvbnRyaWJ1dGlvbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gKE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yKSBnZXRDb250cmlidXRpb25NZW1vcnkoKS5nZXQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjb250cmlidXRpb25NZW1vcnkuCi0JICovCi0JcHVibGljIE1hcCBnZXRDb250cmlidXRpb25NZW1vcnkoKSB7Ci0JCWlmIChjb250cmlidXRpb25NZW1vcnkgIT0gbnVsbCkKLQkJCXJldHVybiBjb250cmlidXRpb25NZW1vcnk7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKGNvbnRyaWJ1dGlvbk1lbW9yeSA9PSBudWxsKQotCQkJCWNvbnRyaWJ1dGlvbk1lbW9yeSA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRyaWJ1dGlvbk1lbW9yeTsKLQl9Ci0KLQlwcml2YXRlIFNldCBnZXRFbmFibGVkRGVzY3JpcHRvcnMoT2JqZWN0IGFuRWxlbWVudCkgewotCQlTZXQgZW5hYmxlZEJ5RXhwcmVzc2lvbiA9IENPTlRFTlRfREVTQ1JJUFRPUl9SRUdJU1RSWQotCQkJCS5nZXRFbmFibGVkQ29udGVudERlc2NyaXB0b3JzKGFuRWxlbWVudCwgdmlld2VyRGVzY3JpcHRvcik7Ci0JCU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRTb3VyY2VPZkNvbnRyaWJ1dGlvbihhbkVsZW1lbnQpOwotCQlpZihkZXNjcmlwdG9yICE9IG51bGwpCi0JCQllbmFibGVkQnlFeHByZXNzaW9uLmFkZChkZXNjcmlwdG9yKTsKLQkJcmV0dXJuIGVuYWJsZWRCeUV4cHJlc3Npb247Ci0JfQotCi0JcHJpdmF0ZSBTZXQgZ2V0RW5hYmxlZERlc2NyaXB0b3JzKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJcmV0dXJuIENPTlRFTlRfREVTQ1JJUFRPUl9SRUdJU1RSWQotCQkJCS5nZXRFbmFibGVkQ29udGVudERlc2NyaXB0b3JzKGFTZWxlY3Rpb24sIHZpZXdlckRlc2NyaXB0b3IpOwotCX0gCi0KLSAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2UjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGluaXRpYWxpemUoSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgYUNvbnRlbnRQcm92aWRlcikgewotCQlyZXR1cm4gc3RydWN0dXJlZFZpZXdlck1hbmFnZXIuaW5pdGlhbGl6ZShhQ29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2Ujb25FeHRlbnNpb25BY3RpdmF0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRXh0ZW5zaW9uQWN0aXZhdGlvbihTdHJpbmcgYVZpZXdlcklkLAotCQkJU3RyaW5nW10gYU5hdmlnYXRvckV4dGVuc2lvbklkLCBib29sZWFuIHRvRW5hYmxlKSB7Ci0JCXVwZGF0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLklOYXZpZ2F0b3JDb250ZW50U2VydmljZSN1cGRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJcm9vdENvbnRlbnRQcm92aWRlcnMgPSBudWxsOwotCQlzdHJ1Y3R1cmVkVmlld2VyTWFuYWdlci5zYWZlUmVmcmVzaCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLklOYXZpZ2F0b3JDb250ZW50U2VydmljZSNnZXRWaWV3ZXJJZCgpCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRWaWV3ZXJJZCgpIHsKLQkJcmV0dXJuIHZpZXdlckRlc2NyaXB0b3IuZ2V0Vmlld2VySWQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2UjZ2V0RXh0ZW5zaW9uKG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLk5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBmaW5hbCBOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uIGdldEV4dGVuc2lvbigKLQkJCU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yIGFEZXNjcmlwdG9yS2V5KSB7Ci0JCXJldHVybiBnZXRFeHRlbnNpb24oYURlc2NyaXB0b3JLZXksIHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLklOYXZpZ2F0b3JDb250ZW50U2VydmljZSNnZXRFeHRlbnNpb24ob3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBmaW5hbCBOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uIGdldEV4dGVuc2lvbigKLQkJCU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yIGFEZXNjcmlwdG9yS2V5LCBib29sZWFuIHRvTG9hZElmTmVjZXNzYXJ5KSB7Ci0JCS8qIFF1ZXJ5IGFuZCByZXR1cm4gdGhlIHJlbGV2YW50IGRlc2NyaXB0b3IgaW5zdGFuY2UgKi8KLQkJTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbiBleHRlbnNpb24gPSAoTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbikgY29udGVudEV4dGVuc2lvbnMKLQkJCQkuZ2V0KGFEZXNjcmlwdG9yS2V5KTsKLQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsIHx8ICF0b0xvYWRJZk5lY2Vzc2FyeSkKLQkJCXJldHVybiBleHRlbnNpb247Ci0KLQkJLyoKLQkJICogSWYgdGhlIGRlc2NyaXB0b3IgaW5zdGFuY2UgaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQsIHRoZW4gd2UgbmVlZCB0bwotCQkgKiAoMSkgdmVyaWZ5IHRoYXQgaXQgd2Fzbid0IGFkZGVkIGJ5IGFub3RoZXIgdGhyZWFkLCAoMikgY3JlYXRlIGFuZCBhZGQKLQkJICogdGhlIHJlc3VsdCBpbnRvIHRoZSBtYXAKLQkJICovCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJZXh0ZW5zaW9uID0gKE5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24pIGNvbnRlbnRFeHRlbnNpb25zCi0JCQkJCS5nZXQoYURlc2NyaXB0b3JLZXkpOwotCQkJaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGVudEV4dGVuc2lvbnMKLQkJCQkJCS5wdXQoYURlc2NyaXB0b3JLZXksCi0JCQkJCQkJCShleHRlbnNpb24gPSBuZXcgTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbigKLQkJCQkJCQkJCQlhRGVzY3JpcHRvcktleSwgdGhpcywKLQkJCQkJCQkJCQlzdHJ1Y3R1cmVkVmlld2VyTWFuYWdlcikpKTsKLQkJCQlub3RpZnlMaXN0ZW5lcnMoZXh0ZW5zaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXh0ZW5zaW9uOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlI2dldFZpZXdlckRlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvciBnZXRWaWV3ZXJEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gdmlld2VyRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2UjcmVzdG9yZVN0YXRlKG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShmaW5hbCBJTWVtZW50byBhTWVtZW50bykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWZvciAoSXRlcmF0b3IgZXh0ZW5zaW9uSXRyID0gZ2V0RXh0ZW5zaW9ucygpLml0ZXJhdG9yKCk7IGV4dGVuc2lvbkl0cgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWZpbmFsIE5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24gZWxlbWVudCA9IChOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uKSBleHRlbnNpb25JdHIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJSVNhZmVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCWVsZW1lbnQucmVzdG9yZVN0YXRlKGFNZW1lbnRvKTsKLQotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCU5hdmlnYXRvclBsdWdpbgotCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQkiQ291bGQgbm90IHJlc3RvcmUgc3RhdGUgZm9yIENvbW1vbiBOYXZpZ2F0b3IgY29udGVudCBleHRlbnNpb24iIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCSsgZWxlbWVudC5nZXRJZCgpLAotCQkJCQkJCQkJCWV4Y2VwdGlvbik7Ci0KLQkJCQkJfQotCQkJCX07Ci0JCQkJUGxhdGZvcm0ucnVuKHJ1bm5hYmxlKTsKLQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlI3NhdmVTdGF0ZShvcmcuZWNsaXBzZS51aS5JTWVtZW50bykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGV4dGVuc2lvbkl0ciA9IGdldEV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOyBleHRlbnNpb25JdHIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uIGVsZW1lbnQgPSAoTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbikgZXh0ZW5zaW9uSXRyCi0JCQkJCQkubmV4dCgpOwotCQkJCWVsZW1lbnQuc2F2ZVN0YXRlKGFNZW1lbnRvKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW10gZmluZFJvb3RDb250ZW50RGVzY3JpcHRvcnMoCi0JCQlPYmplY3QgYW5FbGVtZW50KSB7Ci0JCXJldHVybiBmaW5kUm9vdENvbnRlbnREZXNjcmlwdG9ycyhhbkVsZW1lbnQsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW10gZmluZFJvb3RDb250ZW50RGVzY3JpcHRvcnMoCi0JCQlPYmplY3QgYW5FbGVtZW50LCBib29sZWFuIHRvUmVzcGVjdFZpZXdlclJvb3RzKSB7IAotCQlOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW10gcmVzdWx0SW5zdGFuY2VzID0gbnVsbDsKLQotCQlpZiAodG9SZXNwZWN0Vmlld2VyUm9vdHMgJiYgdmlld2VyRGVzY3JpcHRvci5oYXNPdmVycmlkZGVuUm9vdEV4dGVuc2lvbnMoKSkgewotCQkJTGlzdCByZXN1bHRJbnN0YW5jZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gQ09OVEVOVF9ERVNDUklQVE9SX1JFR0lTVFJZLmdldEFsbENvbnRlbnREZXNjcmlwdG9ycygpOwotCQkJCi0JCQlOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uIGV4dGVuc2lvbiA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGlzQWN0aXZlKGRlc2NyaXB0b3JzW2ldLmdldElkKCkpICYmIAotCQkJCQkJdmlld2VyRGVzY3JpcHRvci5pc1Jvb3RFeHRlbnNpb24oZGVzY3JpcHRvcnNbaV0uZ2V0SWQoKSkpIHsKLQkJCQkJZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKGRlc2NyaXB0b3JzW2ldKTsKLQkJCQkJaWYgKCFleHRlbnNpb24uaGFzTG9hZGluZ0ZhaWxlZCgpKQotCQkJCQkJcmVzdWx0SW5zdGFuY2VzTGlzdC5hZGQoZXh0ZW5zaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJlc3VsdEluc3RhbmNlcyA9IChOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW10pIHJlc3VsdEluc3RhbmNlc0xpc3QKLQkJCQkJLnRvQXJyYXkoKHJlc3VsdEluc3RhbmNlcyA9IG5ldyBOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW3Jlc3VsdEluc3RhbmNlc0xpc3QKLQkJCQkJCQkuc2l6ZSgpXSkpOwotCQl9IGVsc2UKLQkJCXJlc3VsdEluc3RhbmNlcyA9IGZpbmRSZWxldmFudENvbnRlbnRFeHRlbnNpb25zKGFuRWxlbWVudCk7Ci0JCXJldHVybiByZXN1bHRJbnN0YW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBY3RpdmUoU3RyaW5nIGFuRXh0ZW5zaW9uSWQpIHsKLQkJcmV0dXJuIE5BVklHQVRPUl9BQ1RJVkFUSU9OX1NFUlZJQ0UuaXNOYXZpZ2F0b3JFeHRlbnNpb25BY3RpdmUoCi0JCQkJCQlnZXRWaWV3ZXJJZCgpLCBhbkV4dGVuc2lvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbiBnZXRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gKGNvbnRlbnRFeHRlbnNpb25zLnNpemUoKSA+IDApID8gQ29sbGVjdGlvbnMKLQkJCQkudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihjb250ZW50RXh0ZW5zaW9ucy52YWx1ZXMoKSkKLQkJCQk6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLklOYXZpZ2F0b3JDb250ZW50U2VydmljZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOYXZpZ2F0b3JDb250ZW50U2VydmljZUxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMuYWRkKGFMaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLklOYXZpZ2F0b3JDb250ZW50U2VydmljZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOYXZpZ2F0b3JDb250ZW50U2VydmljZUxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGFMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUxpc3RlbmVycyhOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uIGFEZXNjcmlwdG9ySW5zdGFuY2UpIHsKLQotCQlpZiAobGlzdGVuZXJzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuOwotCQlJTmF2aWdhdG9yQ29udGVudFNlcnZpY2VMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0JCUxpc3QgZmFpbGVkTGlzdGVuZXJzID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBsaXN0ZW5lcnNJdHIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgbGlzdGVuZXJzSXRyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdGVuZXIgPSAoSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlTGlzdGVuZXIpIGxpc3RlbmVyc0l0cgotCQkJCQkJLm5leHQoKTsKLQkJCQlsaXN0ZW5lci5vbkxvYWQoYURlc2NyaXB0b3JJbnN0YW5jZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQkJaWYgKGZhaWxlZExpc3RlbmVycyA9PSBudWxsKQotCQkJCQlmYWlsZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZmFpbGVkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZhaWxlZExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlQWxsKGZhaWxlZExpc3RlbmVycyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhlRGVzY3JpcHRvckluc3RhbmNlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElUcmVlQ29udGVudFByb3ZpZGVyW10gZXh0cmFjdENvbnRlbnRQcm92aWRlcnMoCi0JCQlOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW10gdGhlRGVzY3JpcHRvckluc3RhbmNlcykgewotCQlpZiAodGhlRGVzY3JpcHRvckluc3RhbmNlcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBOT19DT05URU5UX1BST1ZJREVSUzsKLQkJTGlzdCByZXN1bHRQcm92aWRlcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZURlc2NyaXB0b3JJbnN0YW5jZXMubGVuZ3RoOyBpKyspCi0JCQlpZiAodGhlRGVzY3JpcHRvckluc3RhbmNlc1tpXS5nZXRDb250ZW50UHJvdmlkZXIoKSAhPSBudWxsKQotCQkJCXJlc3VsdFByb3ZpZGVyc0xpc3QuYWRkKHRoZURlc2NyaXB0b3JJbnN0YW5jZXNbaV0KLQkJCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXJldHVybiAoSVRyZWVDb250ZW50UHJvdmlkZXJbXSkgcmVzdWx0UHJvdmlkZXJzTGlzdAotCQkJCS50b0FycmF5KG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcltyZXN1bHRQcm92aWRlcnNMaXN0LnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aGVEZXNjcmlwdG9ycwotCSAqICAgICAgICAgICAgYSBMaXN0IG9mIE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yIG9iamVjdHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW10gZXh0cmFjdERlc2NyaXB0b3JJbnN0YW5jZXMoCi0JCQlTZXQgdGhlRGVzY3JpcHRvcnMpIHsKLQkJcmV0dXJuIGV4dHJhY3REZXNjcmlwdG9ySW5zdGFuY2VzKHRoZURlc2NyaXB0b3JzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhlRGVzY3JpcHRvcnMKLQkgKiAgICAgICAgICAgIGEgTGlzdCBvZiBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciBvYmplY3RzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbltdIGV4dHJhY3REZXNjcmlwdG9ySW5zdGFuY2VzKAotCQkJU2V0IHRoZURlc2NyaXB0b3JzLCBib29sZWFuIHRvTG9hZEFsbElmTmVjZXNzYXJ5KSB7Ci0JCWlmICh0aGVEZXNjcmlwdG9ycy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBOT19ERVNDUklQVE9SX0lOU1RBTkNFUzsKLQkJU2V0IHJlc3VsdEluc3RhbmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgZGVzY3JpcHRvckl0ZXIgPSB0aGVEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBkZXNjcmlwdG9ySXRlci5oYXNOZXh0KCk7ICkgewotCQkJTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbiBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oCi0JCQkJCShOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcikgZGVzY3JpcHRvckl0ZXIubmV4dCgpLAotCQkJCQl0b0xvYWRBbGxJZk5lY2Vzc2FyeSk7Ci0JCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLQkJCQlyZXN1bHRJbnN0YW5jZXMuYWRkKGV4dGVuc2lvbik7Ci0KLQkJCX0KLQkJfQotCQlOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IChOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW10pIHJlc3VsdEluc3RhbmNlcy50b0FycmF5KG5ldyBOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uW3Jlc3VsdEluc3RhbmNlcy5zaXplKCldKTsKLQkJQXJyYXlzLnNvcnQoZXh0ZW5zaW9ucywgRVhURU5TSU9OX0NPTVBBUkFUT1IpOwotCQlyZXR1cm4gZXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhlRGVzY3JpcHRvckluc3RhbmNlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyW10gZXh0cmFjdExhYmVsUHJvdmlkZXJzKAotCQkJTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbltdIHRoZURlc2NyaXB0b3JJbnN0YW5jZXMpIHsKLQkJaWYgKHRoZURlc2NyaXB0b3JJbnN0YW5jZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gTk9fTEFCRUxfUFJPVklERVJTOwotCQlMaXN0IHJlc3VsdFByb3ZpZGVyc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlRGVzY3JpcHRvckluc3RhbmNlcy5sZW5ndGg7IGkrKykKLQkJCWlmICh0aGVEZXNjcmlwdG9ySW5zdGFuY2VzW2ldLmdldExhYmVsUHJvdmlkZXIoKSAhPSBudWxsKQotCQkJCXJlc3VsdFByb3ZpZGVyc0xpc3QuYWRkKHRoZURlc2NyaXB0b3JJbnN0YW5jZXNbaV0KLQkJCQkJCS5nZXRMYWJlbFByb3ZpZGVyKCkpOwotCQlyZXR1cm4gKElMYWJlbFByb3ZpZGVyW10pIHJlc3VsdFByb3ZpZGVyc0xpc3QKLQkJCQkudG9BcnJheShuZXcgSUxhYmVsUHJvdmlkZXJbcmVzdWx0UHJvdmlkZXJzTGlzdC5zaXplKCldKTsKLQl9Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIEVYVEVOU0lPTl9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBsdmFsdWUsIE9iamVjdCBydmFsdWUpIHsgCi0JCQlyZXR1cm4gKChOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uKSBsdmFsdWUpLmdldERlc2NyaXB0b3IoKS5nZXRQcmlvcml0eSgpIC0gKChOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uKSBydmFsdWUpLmdldERlc2NyaXB0b3IoKS5nZXRQcmlvcml0eSgpOwotCQl9Ci0JfTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvTmF2aWdhdG9yQ29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvTmF2aWdhdG9yQ29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzZGIwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL05hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbjsKLQotLyoqCi0gKiA8cD4KLSAqIFByb3ZpZGVzIHJlbGV2YW50IGNvbnRlbnQgYmFzZWQgb24gdGhlIGFzc29jaWF0ZWQKLSAqIHtAbGluayBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yQ29udGVudFNlcnZpY2V9Jm5ic3A7IGZvciBhIFRyZWVWaWV3ZXIgLgotICogPC9wPgotICogPHA+Ci0gKiBFeGNlcHQgZm9yIHRoZSBkZXBlbmRlbmN5IG9uCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlfSwgdGhpcyBjbGFzcyBoYXMgbm8KLSAqIGRlcGVuZGVuY2llcyBvbiB0aGUgcmVzdCBvZiB0aGUgQ29tbW9uIE5hdmlnYXRvciBmcmFtZXdvcmsuIFRyZWUgdmlld2VycyB0aGF0IHdvdWxkIGxpa2UgdG8gdXNlCi0gKiB0aGUgZXh0ZW5zaW9ucyBkZWZpbmVkIGJ5IHRoZSBDb21tb24gTmF2aWdhdG9yLCB3aXRob3V0IHVzaW5nIHRoZSBhY3R1YWwgdmlldyBwYXJ0IG9yIG90aGVyCi0gKiBwaWVjZXMgb2YgZnVuY3Rpb25hbGl0eSAoZmlsdGVycywgc29ydGluZywgZXRjKSBtYXkgY2hvb3NlIHRvIHVzZSB0aGlzIGNsYXNzLCBpbiBlZmZlY3QgdXNpbmcgYW4KLSAqIGV4dGVuc2libGUsIGFnZ3JlZ2F0aW5nLCBkZWxlZ2F0ZSBjb250ZW50IHByb3ZpZGVyLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JDb250ZW50U2VydmljZQotICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gTk9fQ0hJTERSRU4gPSBuZXcgT2JqZWN0WzBdOwotCXByaXZhdGUgZmluYWwgTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgY29udGVudFNlcnZpY2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQ29udGVudFNlcnZpY2VTZWxmTWFuYWdlZDsKLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBjYWNoZWQge0BsaW5rIE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlfSZuYnNwO2Zyb20gdGhlIGdpdmVuIHZpZXdlciBJZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFWaWV3ZXJJZAotCSAqICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgdmlld2VyIGlkIHRoYXQgdGhpcyBOYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlciB3aWxsCi0JICogICAgICAgICAgICBwcm92aWRlIGNvbnRlbnQgZm9yCi0JICovCi0JcHVibGljIE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyKFN0cmluZyBhVmlld2VySWQpIHsKLQkJc3VwZXIoKTsKLQkJY29udGVudFNlcnZpY2UgPSBuZXcgTmF2aWdhdG9yQ29udGVudFNlcnZpY2UoYVZpZXdlcklkKTsKLQkJaXNDb250ZW50U2VydmljZVNlbGZNYW5hZ2VkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBVc2VzIHRoZSBzdXBwbGllZCBjb250ZW50IHNlcnZpY2UgdG8gYWNxdWlyZSB0aGUgYXZhaWxhYmxlIGV4dGVuc2lvbnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhQ29udGVudFNlcnZpY2UKLQkgKiAgICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gYWNxdWlyZSBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yQ29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXIoTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgYUNvbnRlbnRTZXJ2aWNlKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbnRlbnRTZXJ2aWNlID0gYUNvbnRlbnRTZXJ2aWNlOwotCQlpc0NvbnRlbnRTZXJ2aWNlU2VsZk1hbmFnZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiA8cD4KLQkgKiBSZXR1cm4gdGhlIHJvb3Qgb2JqZWN0cyBmb3IgdGhlIHN1cHBsaWVkIGFuSW5wdXRFbGVtZW50LiBhbklucHV0RWxlbWVudCBpcyB0aGUgcm9vdCB0aGluZwotCSAqIHRoYXQgdGhlIHZpZXdlciB2aXN1YWxpemVzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGNhbGwgb3V0IHRvIGl0cyB7QGxpbmsgTmF2aWdhdG9yQ29udGVudFNlcnZpY2V9Jm5ic3A7Zm9yIGV4dGVuc2lvbnMgdGhhdCBhcmUKLQkgKiBlbmFibGVkIG9uIHRoZSBzdXBwbGllZCBhbklucHV0RWxlbWVudCBvciBlbmFibGVkIG9uIHRoZSB2aWV3ZXJJZCBzdXBwbGllZCB3aGVuIHRoZQotCSAqIHtAbGluayBOYXZpZ2F0b3JDb250ZW50U2VydmljZX0mbmJzcDsgd2FzIGNyZWF0ZWQgKGVpdGhlciBieSB0aGlzIGNsYXNzIG9yIGl0cyBjbGllbnQpLiBUaGUKLQkgKiBleHRlbnNpb25zIHdpbGwgdGhlbiBiZSBxdWVyaWVkIGZvciByZWxldmFudCBjb250ZW50LiBUaGUgY2hpbGRyZW4gcmV0dXJuZWQgZnJvbSBlYWNoCi0JICogZXh0ZW5zaW9uIHdpbGwgYmUgYWdncmVnYXRlZCBhbmQgcmV0dXJuZWQgYXMgaXMgLS0gdGhlcmUgaXMgbm8gYWRkaXRpb25hbCBzb3J0aW5nIG9yCi0JICogZmlsdGVyaW5nIGF0IHRoaXMgbGV2ZWwuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSByb290IG9mIHRoZSBUcmVlVmlld2VyLgotCSAqIDwvcD4KLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogQHBhcmFtIGFuSW5wdXRFbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgcmVsZXZhbnQgZWxlbWVudCB0aGF0IGEgY2xpZW50IHdvdWxkIGxpa2UgY2hpbGRyZW4gZm9yIC0gdGhlIGlucHV0IGVsZW1lbnQgb2YKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyCi0JICogQHJldHVybiBBIG5vbi1udWxsIGFycmF5IG9mIG9iamVjdHMgdGhhdCBhcmUgbG9naWNhbCBjaGlsZHJlbiBvZiBhbklucHV0RWxlbWVudAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGFuSW5wdXRFbGVtZW50KSB7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyW10gZGVsZWdhdGVQcm92aWRlcnMgPSBjb250ZW50U2VydmljZS5maW5kUm9vdENvbnRlbnRQcm92aWRlcnMoYW5JbnB1dEVsZW1lbnQpOwotCQlpZiAoZGVsZWdhdGVQcm92aWRlcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gTk9fQ0hJTERSRU47Ci0JCUxpc3QgcmVzdWx0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIGRlbGVnYXRlQ2hpbGRyZW4gPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbGVnYXRlUHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWRlbGVnYXRlQ2hpbGRyZW4gPSBkZWxlZ2F0ZVByb3ZpZGVyc1tpXS5nZXRFbGVtZW50cyhhbklucHV0RWxlbWVudCk7Ci0JCQkJaWYgKGRlbGVnYXRlQ2hpbGRyZW4gIT0gbnVsbCAmJiBkZWxlZ2F0ZUNoaWxkcmVuLmxlbmd0aCA+IDApIAotCQkJCQlyZXN1bHRFbGVtZW50cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChkZWxlZ2F0ZUNoaWxkcmVuKSk7IAotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCVN0cmluZyBtc2cgPSBDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5Db3VsZF9ub3RfcHJvdmlkZV9jaGlsZHJlbl9mb3JfZWxlbWVudCArIGRlbGVnYXRlUHJvdmlkZXJzW2ldLmdldENsYXNzKCk7Ci0JCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhtc2csIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTmF2aWdhdG9yUGx1Z2luLlBMVUdJTl9JRCwgMCwgbXNnLCByZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRFbGVtZW50cy50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJuIHRoZSBjaGlsZHJlbiBvZiB0aGUgc3VwcGxpZWQgYVBhcmVudEVsZW1lbnQKLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCBjYWxsIG91dCB0byBpdHMge0BsaW5rIE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlfSZuYnNwO2ZvciBleHRlbnNpb25zIHRoYXQgYXJlCi0JICogZW5hYmxlZCBvbiB0aGUgc3VwcGxpZWQgYVBhcmVudEVsZW1lbnQuIFRoZSBleHRlbnNpb25zIHdpbGwgdGhlbiBiZSBxdWVyaWVkIGZvciBjaGlsZHJlbiBmb3IKLQkgKiBhUGFyZW50RWxlbWVudC4gVGhlIGNoaWxkcmVuIHJldHVybmVkIGZyb20gZWFjaCBleHRlbnNpb24gd2lsbCBiZSBhZ2dyZWdhdGVkIGFuZCByZXR1cm5lZCBhcwotCSAqIGlzIC0tIHRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgc29ydGluZyBvciBmaWx0ZXJpbmcgYXQgdGhpcyBsZXZlbC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2Qgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgY2hpbGRyZW4gb2YgdGhlIHN1cHBsaWVkIGVsZW1lbnQgaW4gdGhlCi0JICogVHJlZVZpZXdlci4KLQkgKiA8L3A+Ci0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIEBwYXJhbSBhUGFyZW50RWxlbWVudAotCSAqICAgICAgICAgICAgQW4gZWxlbWVudCB0aGF0IHJlcXVpcmVzIGNoaWxkcmVuIGNvbnRlbnQgaW4gdGhlIHZpZXdlciAoZS5nLiBhbiBlbmQtdXNlciBleHBhbmRlZAotCSAqICAgICAgICAgICAgYSBub2RlKQotCSAqIEByZXR1cm4gQSBub24tbnVsbCBhcnJheSBvZiBvYmplY3RzIHRoYXQgYXJlIGxvZ2ljYWwgY2hpbGRyZW4gb2YgYVBhcmVudEVsZW1lbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBhUGFyZW50RWxlbWVudCkgewotCQlJVHJlZUNvbnRlbnRQcm92aWRlcltdIGRlbGVnYXRlUHJvdmlkZXJzID0gY29udGVudFNlcnZpY2UuZmluZFJlbGV2YW50Q29udGVudFByb3ZpZGVycyhhUGFyZW50RWxlbWVudCk7Ci0JCWlmIChkZWxlZ2F0ZVByb3ZpZGVycy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBOT19DSElMRFJFTjsKLQkJTGlzdCByZXN1bHRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0W10gZGVsZWdhdGVDaGlsZHJlbiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVQcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGVDaGlsZHJlbiA9IGRlbGVnYXRlUHJvdmlkZXJzW2ldLmdldENoaWxkcmVuKGFQYXJlbnRFbGVtZW50KTsKLQkJCQlpZiAoZGVsZWdhdGVDaGlsZHJlbiAhPSBudWxsICYmIGRlbGVnYXRlQ2hpbGRyZW4ubGVuZ3RoID4gMCkKLQkJCQkJcmVzdWx0Q2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3QoZGVsZWdhdGVDaGlsZHJlbikpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5Db3VsZF9ub3RfcHJvdmlkZV9jaGlsZHJlbl9mb3JfZWxlbWVudCwgbmV3IE9iamVjdFtdIHtkZWxlZ2F0ZVByb3ZpZGVyc1tpXS5nZXRDbGFzcygpfSk7Ci0JCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhtc2csIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTmF2aWdhdG9yUGx1Z2luLlBMVUdJTl9JRCwgMCwgbXNnLCByZSkpOwotCQkJfSBjYXRjaCAoRXJyb3IgZSkgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5Db3VsZF9ub3RfcHJvdmlkZV9jaGlsZHJlbl9mb3JfZWxlbWVudCwgbmV3IE9iamVjdFtdIHsgZGVsZWdhdGVQcm92aWRlcnNbaV0uZ2V0Q2xhc3MoKX0pOwotCQkJCU5hdmlnYXRvclBsdWdpbi5sb2cobXNnLCBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQsIDAsIG1zZywgZSkpOwotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdENoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBsb2dpY2FsIHBhcmVudCBvZiBhbkVsZW1lbnQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHRoYXQgYW55IGV4dGVuc2lvbiB0aGF0IHdvdWxkIGxpa2UgYW4gb3Bwb3J0dW5pdHkgdG8gc3VwcGx5IGEgcGFyZW50IGZvcgotCSAqIGFuRWxlbWVudCBleHByZXNzbHkgaW5kaWNhdGUgdGhhdCBpbiB0aGUgYWN0aW9uIGV4cHJlc3Npb24gJmx0O2VuYWJsZXMmZ3Q7IHN0YXRlbWVudCBvZiB0aGUKLQkgKiA8Yj5vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCA8L2I+IGV4dGVuc2lvbiBwb2ludC4KLQkgKiA8L3A+Ci0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIEBwYXJhbSBhbkVsZW1lbnQKLQkgKiAgICAgICAgICAgIEFuIGVsZW1lbnQgdGhhdCByZXF1aXJlcyBpdHMgbG9naWNhbCBwYXJlbnQgLSBnZW5lcmFsbHkgYXMgYSByZXN1bHQgb2YKLQkgKiAgICAgICAgICAgIHNldFNlbGVjdGlvbihleHBhbmQ9dHJ1ZSkgb24gdGhlIHZpZXdlcgotCSAqIEByZXR1cm4gVGhlIGxvZ2ljYWwgcGFyZW50IGlmIGF2YWlsYWJsZSBvciBudWxsIGlmIHRoZSBwYXJlbnQgY2Fubm90IGJlIGRldGVybWluZWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBhbkVsZW1lbnQpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXJbXSBkZWxlZ2F0ZVByb3ZpZGVycyA9IGNvbnRlbnRTZXJ2aWNlLmZpbmRQYXJlbnRDb250ZW50UHJvdmlkZXJzKGFuRWxlbWVudCk7Ci0KLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVQcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKChwYXJlbnQgPSBkZWxlZ2F0ZVByb3ZpZGVyc1tpXS5nZXRQYXJlbnQoYW5FbGVtZW50KSkgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCQlTdHJpbmcgbXNnID0gQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuQ291bGRfbm90X3Byb3ZpZGVfcGFyZW50X2Zvcl9lbGVtZW50ICsgZGVsZWdhdGVQcm92aWRlcnNbaV0uZ2V0Q2xhc3MoKTsKLQkJCQlOYXZpZ2F0b3JQbHVnaW4ubG9nKG1zZywgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBOYXZpZ2F0b3JQbHVnaW4uUExVR0lOX0lELCAwLCBtc2csIHJlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVXNlZCB0byBkZXRlcm1pbmUgb2YgYW5FbGVtZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQgd2l0aCBhICcrJyBvciBub3QuCi0JICogPC9wPgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiBAcGFyYW0gYW5FbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBpbiBxdWVzdGlvbgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBhbkVsZW1lbnQgaGFzIGxvZ2ljYWwgY2hpbGRyZW4gYXMgcmV0dXJuZWQgYnkgdGhpcyBjb250ZW50IHByb3ZpZGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgYW5FbGVtZW50KSB7Ci0JCU5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb25bXSByZXN1bHRJbnN0YW5jZXMgPSBjb250ZW50U2VydmljZS5maW5kUmVsZXZhbnRDb250ZW50RXh0ZW5zaW9ucyhhbkVsZW1lbnQpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0SW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXJlc3VsdEluc3RhbmNlc1tpXS5pc0xvYWRlZCgpKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZSBpZiAocmVzdWx0SW5zdGFuY2VzW2ldLmdldENvbnRlbnRQcm92aWRlcigpLmhhc0NoaWxkcmVuKGFuRWxlbWVudCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogSGFuZGxlcyBhbnkgbmVjZXNzYXJ5IGNsZWFuIHVwIG9mIHRoZSB7QGxpbmsgTmF2aWdhdG9yQ29udGVudFNlcnZpY2V9Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIDxiPklmIGEgY2xpZW50IHVzZXMgdGhpcyBjbGFzcyBvdXRzaWRlIG9mIHRoZSBmcmFtZXdvcmsgb2Yge0BsaW5rIENvbW1vblZpZXdlcn0sIHRoZSBjbGllbnQgbXVzdCBlbnN1cmUgdGhhdCB0aGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCB3aGVuIGZpbmlzaGVkLiA8L2I+Ci0JICogPC9wPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoaXNDb250ZW50U2VydmljZVNlbGZNYW5hZ2VkKQotCQkJY29udGVudFNlcnZpY2UuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGNvbnRlbnQgcHJvdmlkZXIgaXMgbm93IHJlcHJlc2VudGluZyBhIGRpZmZlcmVudCBpbnB1dCBlbGVtZW50LgotCSAqIFRoZSBpbnB1dCBlbGVtZW50IGlzIHRoZSByb290IHRoaW5nIHRoYXQgdGhlIHZpZXdlciBkaXNwbGF5cy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGhhbmRsZSBhbnkgY2xlYW51cCBhc3NvY2lhdGVkIHdpdGggdGhlIG9sZCBpbnB1dCBlbGVtZW50IGFuZCBhbnkKLQkgKiBpbml0aWFpbGl6YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgaW5wdXQgZWxlbWVudC4KLQkgKiA8L3A+Ci0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIEBwYXJhbSBhVmlld2VyCi0JICogICAgICAgICAgICBUaGUgdmlld2VyIHRoYXQgdGhlIGN1cnJlbnQgY29udGVudCBwcm92aWRlciBpcyBhc3NvY2lhdGVkIHdpdGgKLQkgKiBAcGFyYW0gYW5PbGRJbnB1dAotCSAqICAgICAgICAgICAgVGhlIG9yaWdpbmFsIGlucHV0IGVsZW1lbnQgdGhhdCB0aGUgdmlld2VyIHdhcyB2aXN1YWxpemluZwotCSAqIEBwYXJhbSBhTmV3SW5wdXQKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgaW5wdXQgZWxlbWVudCB0aGF0IHRoZSB2aWV3ZXIgd2lsbCB2aXN1YWxpemUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKiAgCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYVZpZXdlciwgT2JqZWN0IGFuT2xkSW5wdXQsIE9iamVjdCBhTmV3SW5wdXQpIHsKLQkJY29udGVudFNlcnZpY2UudXBkYXRlU2VydmljZShhVmlld2VyLCBhbk9sZElucHV0LCBhTmV3SW5wdXQpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL05hdmlnYXRvckNvbnRlbnRTZXJ2aWNlRGVzY3JpcHRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9OYXZpZ2F0b3JDb250ZW50U2VydmljZURlc2NyaXB0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3NGJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL05hdmlnYXRvckNvbnRlbnRTZXJ2aWNlRGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIgCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmF2aWdhdG9yQ29udGVudFNlcnZpY2VEZXNjcmlwdGlvblByb3ZpZGVyIGltcGxlbWVudHMKLQkJSURlc2NyaXB0aW9uUHJvdmlkZXIgewotCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyIENPTlRFTlRfREVTQ1JJUFRPUl9SRUdJU1RSWSA9IE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotIAotCXByaXZhdGUgZmluYWwgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGNvbnRlbnRTZXJ2aWNlOwotCi0JcHVibGljIE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlRGVzY3JpcHRpb25Qcm92aWRlcihJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgYUNvbnRlbnRTZXJ2aWNlKSB7IAotCQlBc3NlcnQuaXNOb3ROdWxsKGFDb250ZW50U2VydmljZSk7IAotCQljb250ZW50U2VydmljZSA9IGFDb250ZW50U2VydmljZTsJCQotCX0JCi0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihPYmplY3QgYW5FbGVtZW50KSB7IAotCQkKLQkJT2JqZWN0IHRhcmdldDsKLQkJCi0JCWlmKGFuRWxlbWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0KLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFuRWxlbWVudDsKLQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFN0YXR1c0Jhck1lc3NhZ2Uoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkpOyAKLQkJCX0gCi0JCQl0YXJnZXQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0ID0gYW5FbGVtZW50OwotCQl9Ci0JCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJSUxhYmVsUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBjb250ZW50U2VydmljZS5maW5kUmVsZXZhbnRMYWJlbFByb3ZpZGVycyh0YXJnZXQpOwotCQlpZiAocHJvdmlkZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGdldERlZmF1bHRTdGF0dXNCYXJNZXNzYWdlKDApOwotCQlmb3IoaW50IGk9MDsgaTxwcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHByb3ZpZGVyc1tpXSBpbnN0YW5jZW9mIElDb21tb25MYWJlbFByb3ZpZGVyKSB7Ci0JCQkJbWVzc2FnZSA9ICAoKElDb21tb25MYWJlbFByb3ZpZGVyKXByb3ZpZGVyc1tpXSkuZ2V0RGVzY3JpcHRpb24odGFyZ2V0KTsKLQkJCQlicmVhazsKLQkJCX0gIAotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiBnZXREZWZhdWx0U3RhdHVzQmFyTWVzc2FnZSgxKTsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JCSAKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFTdHJ1Y3R1cmVkU2VsZWN0aW9uIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBmcm9tIHRoZSB7QGxpbmsgQ29tbW9uVmlld2VyfQotCSAqIEByZXR1cm4gQSBzdHJpbmcgb2YgdGhlIGZvcm0gIiMgaXRlbXMgc2VsZWN0ZWQiCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0U3RhdHVzQmFyTWVzc2FnZShpbnQgYVNpemUpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLk5hdmlnYXRvcl9zdGF0dXNMaW5lTXVsdGlTZWxlY3QsIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihhU2l6ZSl9KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvTmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMWFkNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9OYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5FdmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7Ci0KLS8qKgotICogPHA+Ci0gKiBQcm92aWRlcyByZWxldmFudCBsYWJlbHMgYmFzZWQgb24gdGhlIGFzc29jaWF0ZWQKLSAqIHtAbGluayBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2V9Zm9yIHRoZSBjb250ZW50cyBvZiBhCi0gKiBUcmVlVmlld2VyIC4KLSAqIDxwPgotICogCi0gKiA8cD4KLSAqIEV4Y2VwdCBmb3IgdGhlIGRlcGVuZGVuY3kgb24KLSAqIHtAbGluayBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2V9LCB0aGlzIGNsYXNzIGhhcyBubwotICogZGVwZW5kZW5jaWVzIG9uIHRoZSByZXN0IG9mIHRoZSBDb21tb24gTmF2aWdhdG9yIGZyYW1ld29yay4gVHJlZSB2aWV3ZXJzIHRoYXQgd291bGQgbGlrZSB0byB1c2UKLSAqIHRoZSBleHRlbnNpb25zIGRlZmluZWQgYnkgdGhlIENvbW1vbiBOYXZpZ2F0b3IsIHdpdGhvdXQgdXNpbmcgdGhlIGFjdHVhbCB2aWV3IHBhcnQgb3Igb3RoZXIKLSAqIHBpZWNlcyBvZiBmdW5jdGlvbmFsaXR5IChmaWx0ZXJzLCBzb3J0aW5nLCBldGMpIG1heSBjaG9vc2UgdG8gdXNlIHRoaXMgY2xhc3MsIGluIGVmZmVjdCB1c2luZyBhbgotICogZXh0ZW5zaWJsZSBsYWJlbCBwcm92aWRlci4KLSAqIDwvcD4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JDb250ZW50U2VydmljZUNvbnRlbnRQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgTmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyIGV4dGVuZHMgRXZlbnRNYW5hZ2VyCi0JCWltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yOwotCXByaXZhdGUgZmluYWwgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGNvbnRlbnRTZXJ2aWNlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0NvbnRlbnRTZXJ2aWNlU2VsZk1hbmFnZWQ7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGEgY2FjaGVkIHtAbGluayBOYXZpZ2F0b3JDb250ZW50U2VydmljZX0mbmJzcDtmcm9tIHRoZSBnaXZlbiB2aWV3ZXIgSWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhVmlld2VySWQKLQkgKiAgICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIHZpZXdlciBpZCB0aGF0IHRoaXMgTmF2aWdhdG9yQ29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyIHdpbGwKLQkgKiAgICAgICAgICAgIHByb3ZpZGUgbGFiZWxzIGZvcgotCSAqLwotCXB1YmxpYyBOYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXIoU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlzdXBlcigpOwotCQljb250ZW50U2VydmljZSA9IG5ldyBOYXZpZ2F0b3JDb250ZW50U2VydmljZShhVmlld2VySWQpOwotCQlkZWNvcmF0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpOwotCQlpc0NvbnRlbnRTZXJ2aWNlU2VsZk1hbmFnZWQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFVzZXMgdGhlIHN1cHBsaWVkIGNvbnRlbnQgc2VydmljZSB0byBhY3F1aXJlIHRoZSBhdmFpbGFibGUgZXh0ZW5zaW9ucy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFDb250ZW50U2VydmljZQotCSAqICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBhY3F1aXJlIGluZm9ybWF0aW9uLgotCSAqLwotCXB1YmxpYyBOYXZpZ2F0b3JDb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXIoSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGFDb250ZW50U2VydmljZSkgewotCQljb250ZW50U2VydmljZSA9IGFDb250ZW50U2VydmljZTsKLQkJZGVjb3JhdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKTsKLQkJaXNDb250ZW50U2VydmljZVNlbGZNYW5hZ2VkID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBpbWFnZSBmb3IgYW5FbGVtZW50LiBUaGUgaW1hZ2Ugd2lsbCBiZSB1c2VkIGFzIHRoZSBpY29uIGZvciBhbkVsZW1lbnQKLQkgKiB3aGVuIGRpc3BsYXllZCBpbiB0aGUgdHJlZSB2aWV3ZXIuIFRoaXMgbWV0aG9kIHVzZXMgaW5mb3JtYXRpb24gZnJvbSBpdHMgY29udGVudFNlcnZpY2UgdG8KLQkgKiBrbm93IHdoYXQgZXh0ZW5zaW9ucyB0byB1c2UgdG8gc3VwcGx5IHRoZSBjb3JyZWN0IGxhYmVsLgotCSAqIDwvcD4KLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogQHBhcmFtIGFuRWxlbWVudCAKLQkgKiAgICAgICAgICAgIEFuIGVsZW1lbnQgZnJvbSB0aGUgVHJlZSBWaWV3ZXIgCi0JICogQHJldHVybiBUaGUgSW1hZ2UgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGljb24gd2hlbiBhbkVsZW1lbnQgaXMgZGlzcGxheWVkIGluIHRoZSB2aWV3ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBhbkVsZW1lbnQpIHsKLQkJSUxhYmVsUHJvdmlkZXJbXSBsYWJlbFByb3ZpZGVycyA9IGNvbnRlbnRTZXJ2aWNlLmZpbmRSZWxldmFudExhYmVsUHJvdmlkZXJzKGFuRWxlbWVudCk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbFByb3ZpZGVycy5sZW5ndGggJiYgaW1hZ2UgPT0gbnVsbDsgaSsrKQotCQkJaW1hZ2UgPSBsYWJlbFByb3ZpZGVyc1tpXS5nZXRJbWFnZShhbkVsZW1lbnQpOwotCQlyZXR1cm4gaW1hZ2UgPT0gbnVsbCA/IG51bGwgOiBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgYW5FbGVtZW50KTsgIAotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbkVsZW1lbnQgdG8gYmUgdXNlZCBhcyB0aGUgZGlzcGxheSBuYW1lIGluIHRoZSB0cmVlCi0JICogdmlld2VyLgotCSAqIDwvcD4KLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogQHBhcmFtIGFuRWxlbWVudAotCSAqICAgICAgICAgICAgQW4gZWxlbWVudCBmcm9tIHRoZSBUcmVlIFZpZXdlciAKLQkgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbGFiZWwgdG8gZGlzcGxheSBmb3IgdGhlIG9iamVjdCB3aGVuIHJlcHJlc2VudGVkIGluIHRoZSB2aWV3ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGFuRWxlbWVudCkgewotCQlJTGFiZWxQcm92aWRlcltdIGxhYmVsUHJvdmlkZXJzID0gY29udGVudFNlcnZpY2UuZmluZFJlbGV2YW50TGFiZWxQcm92aWRlcnMoYW5FbGVtZW50KTsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxhYmVsUHJvdmlkZXJzLmxlbmd0aCAmJiB0ZXh0ID09IG51bGw7IGkrKykKLQkJCXRleHQgPSBsYWJlbFByb3ZpZGVyc1tpXS5nZXRUZXh0KGFuRWxlbWVudCk7Ci0JCS8vIGRlY29yYXRlIHRoZSBlbGVtZW50Ci0JCXJldHVybiB0ZXh0ID09IG51bGwgPyAiIiA6IHRleHQ7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBhbkVsZWxlbWVudCBoYXMgYVByb3BlcnR5IHRoYXQgYWZmZWN0cyB0aGUgZGlzcGxheSBvZiB0aGUgbGFiZWwuCi0JICogPC9wPgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiBAcGFyYW0gYW5FbGVtZW50Ci0JICogICAgICAgICAgICBBbiBlbGVtZW50IGZyb20gdGhlIFRyZWUgVmlld2VyCi0JICogQHBhcmFtIGFQcm9wZXJ0eQotCSAqICAgICAgICAgICAgQSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCB0aGF0IGNvdWxkIGJlIGEgbGFiZWwgcHJvdmlkZXIKLQkgKiBAcmV0dXJuIFRydWUgaWYgYW55IG9mIHRoZSBleHRlbnNpb25zIGVuYWJsZWQgb24gYW5FbGVtZW50IGNvbnNpZGVyIGFQcm9wZXJ0eSBhCi0JICogICAgICAgICBsYWJlbC1jaGFuZ2luZyBwcm9wZXJ0eS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGFuRWxlbWVudCwgU3RyaW5nIGFQcm9wZXJ0eSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlJTGFiZWxQcm92aWRlcltdIGxhYmVsUHJvdmlkZXJzID0gY29udGVudFNlcnZpY2UuZmluZFJlbGV2YW50TGFiZWxQcm92aWRlcnMoYW5FbGVtZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbFByb3ZpZGVycy5sZW5ndGggJiYgIXJlc3VsdDsgaSsrKQotCQkJcmVzdWx0ID0gbGFiZWxQcm92aWRlcnNbaV0uaXNMYWJlbFByb3BlcnR5KGFuRWxlbWVudCwgYVByb3BlcnR5KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIExhYmVsIHByb3ZpZGVyIGxpc3RlbmVycyBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJYWRkTGlzdGVuZXJPYmplY3QoYUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBMYWJlbCBwcm92aWRlciBsaXN0ZW5lcnMgYXJlIGN1cnJlbnRseSB1bnN1cHBvcnRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCXJlbW92ZUxpc3RlbmVyT2JqZWN0KGFMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGlzcG9zZSBvZiB0aGUgY29udGVudCBzZXJ2aWNlLCBpZiBpdCB3YXMgY3JlYXRlZCBhbmQgbm90IHN1cHBsaWVkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5JZiBhIGNsaWVudCB1c2VzIHRoaXMgY2xhc3Mgb3V0c2lkZSBvZiB0aGUgZnJhbWV3b3JrIG9mIHtAbGluayBDb21tb25WaWV3ZXJ9LCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUgY2FsbGVkIHdoZW4gZmluaXNoZWQuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGlzQ29udGVudFNlcnZpY2VTZWxmTWFuYWdlZCkKLQkJCWNvbnRlbnRTZXJ2aWNlLmRpc3Bvc2UoKTsKLQotCX0KLQkKLQkvKioKLSAgICAgKiBGaXJlcyBhIGxhYmVsIHByb3ZpZGVyIGNoYW5nZWQgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0gICAgICogT25seSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IGEgbGFiZWwgcHJvdmlkZXIgY2hhbmdlZCBldmVudAotICAgICAqCi0gICAgICogQHNlZSBJTGFiZWxQcm92aWRlckxpc3RlbmVyI2xhYmVsUHJvdmlkZXJDaGFuZ2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKAotICAgICAgICAgICAgZmluYWwgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBPYmplY3RbXSB0aGVMaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVMaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGZpbmFsIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbCA9IChJTGFiZWxQcm92aWRlckxpc3RlbmVyKSB0aGVMaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICBQbGF0Zm9ybS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGwubGFiZWxQcm92aWRlckNoYW5nZWQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvTmF2aWdhdG9ySW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL05hdmlnYXRvckltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzhhNjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvTmF2aWdhdG9ySW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKiAKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIE5hdmlnYXRvckltYWdlcyB7Ci0KLQkvL0NyZWF0ZSBpbWFnZSByZWdpc3RyeQotCXByaXZhdGUgZmluYWwgc3RhdGljIEltYWdlUmVnaXN0cnkgTkFWSUdBVE9SX1BMVUdJTl9SRUdJU1RSWSA9IE5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIElDT05fTE9DQVRJT047Ci0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCUlDT05fTE9DQVRJT04gPSBuZXcgVVJMKE5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKSwgImljb25zL2Z1bGwvIik7IC8vJE5PTi1OTFMtMSQgCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIFN0cmluZwotCSAqICAgICAgICAgICAga2V5IC0gTmFtZSBvZiB0aGUgaWNvbi4KLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXQoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gTkFWSUdBVE9SX1BMVUdJTl9SRUdJU1RSWS5nZXQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW5kIHJldHVybnMgYSBpbWFnZSBkZXNjcmlwdG9yIGFuZCBhZGRzIHRoZSBpbWFnZSB0byB0aGUgcmVnaXN0ZXJ5LgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIHByZWZpeCAtIEljb24gZGlyIHN0cnVjdHVyZS4KLQkgKiBAcGFyYW0gU3RyaW5nCi0JICogICAgICAgICAgICBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGljb24uCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGVNYW5hZ2VkKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKSB7Ci0JCUltYWdlRGVzY3JpcHRvciByZXN1bHQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChtYWtlSWNvbkZpbGVVUkwocHJlZml4LCBuYW1lKSk7Ci0JCU5BVklHQVRPUl9QTFVHSU5fUkVHSVNUUlkucHV0KG5hbWUsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgaWNvbiB1cmwKLQkgKiAKLQkgKiBAcGFyYW0gU3RyaW5nCi0JICogICAgICAgICAgICBwcmVmaXggLSBJY29uIGRpciBzdHJ1Y3R1cmUuCi0JICogQHBhcmFtIFN0cmluZwotCSAqICAgICAgICAgICAgbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBpY29uLgotCSAqIEByZXR1cm4gVVJMCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIG1ha2VJY29uRmlsZVVSTChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwcmVmaXgpOwotCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkwoSUNPTl9MT0NBVElPTiwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9OYXZpZ2F0b3JQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvTmF2aWdhdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZmFlZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9OYXZpZ2F0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyBmb3IgdGhlIE5hdmlnYXRvci4KLSAqIAotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgTmF2aWdhdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE5hdmlnYXRvclBsdWdpbiBwbHVnaW47IAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlcgotCSAqLwotCXB1YmxpYyBOYXZpZ2F0b3JQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmF2aWdhdG9yUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotIAotCi0JLyoqCi0JICogTG9nIHRoZSBnaXZlbiBzdGF0dXMgdG8gdGhlIElTViBsb2cuCi0JICogCi0JICogV2hlbiB0byB1c2UgdGhpczoKLQkgKiAKLQkgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gYSBQbHVnaW5FeGNlcHRpb24gb3IgYSBFeHRlbnNpb25FeGNlcHRpb24gb2NjdXIgYnV0IGZvciB3aGljaCBhbgotCSAqIGVycm9yIGRpYWxvZyBjYW5ub3QgYmUgc2FmZWx5IHNob3duLgotCSAqIAotCSAqIElmIHlvdSBjYW4gc2hvdyBhbiBFcnJvckRpYWxvZyB0aGVuIGRvIHNvLCBhbmQgZG8gbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogCi0JICogSWYgeW91IGhhdmUgYSBwbHVnaW4gZXhjZXB0aW9uIG9yIGNvcmUgZXhjZXB0aW9uIGluIGhhbmQgY2FsbCBsb2coU3RyaW5nLCBJU3RhdHVzKQotCSAqIAotCSAqIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIFdvcmtiZW5jaCBvbmx5IGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQKLQkgKiBvdXRzaWRlIHRoZSB3b3JrYmVuY2guCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgc3VwcG9ydGVkIGluIHRoZSBldmVudCB0aGUgbG9nIGFsbG93cyBwbHVnaW4gcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBiZSBsb2dnZWQKLQkgKiAoMUZUVEpLVikuIFRoaXMgd291bGQgYmUgZG9uZSBieSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlcm5hbCB0byB0aGUgd29ya2JlbmNoIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQgYnkgYW55IHBsdWdpbnMsIG9yIGV4YW1wbGVzLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBBIGhpZ2ggbGV2ZWwgVUkgbWVzc2FnZSBkZXNjcmliaW5nIHdoZW4gdGhlIHByb2JsZW0gaGFwcGVuZWQuCi0JICogIAotCSAqLwotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCBtZXNzYWdlLCBudWxsKSk7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLQkJLy8xRlRUSktWOiBJVFBDT1JFOkFMTCAtIGxvZyhzdGF0dXMpIGRvZXMgbm90IGFsbG93IHBsdWdpbiBpbmZvcm1hdGlvbiB0byBiZSByZWNvcmRlZAotCX0KLQotCS8qKgotCSAqIExvZ3MgZXJyb3JzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIDAsIG1lc3NhZ2UsIG51bGwpKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlICsgIlxuUmVhc29uOiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQlTeXN0ZW0uZXJyLnByaW50bG4oc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSAKLQkKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGFuRXhjZXB0aW9uKSB7IAotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGNyZWF0ZUVycm9yU3RhdHVzKGFDb2RlLCBhTWVzc2FnZSwgYW5FeGNlcHRpb24pKTsgCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWxvZyhjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIGFTdGF0dXMpIHsgCi0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coYVN0YXR1cyk7IAotCX0gCi0JIAotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwgYU1lc3NhZ2UgIT0gbnVsbCA/IGFNZXNzYWdlIDogIk5vIG1lc3NhZ2UuIiwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCX0KLSAKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3JTdGF0dXMoaW50IGFDb2RlLCBTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvTmF2aWdhdG9yU2l0ZUVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9OYXZpZ2F0b3JTaXRlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTUxYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9OYXZpZ2F0b3JTaXRlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UcmVlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLklOYXZpZ2F0b3JTaXRlRWRpdG9yOwotCi0KLS8qKgotICogQSBOYXZpZ2F0b3JTaXRlRWRpdG9yIGlzIHVzZWQgdG8gZWRpdCAoaS5lLiwgcmVuYW1lKSBlbGVtZW50cyBpbiBhIE5hdmlnYXRvciB2aWV3LiBJdCBkaXNwbGF5cyBhCi0gKiB0ZXh0IGVkaXRvciBib3ggb3ZlcmxheSBvbiB0aGUgTmF2aWdhdG9yIHRyZWUgd2lkZ2V0LgotICogCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0b3JTaXRlRWRpdG9yIGltcGxlbWVudHMgSU5hdmlnYXRvclNpdGVFZGl0b3IgewotCi0JcHJpdmF0ZSBUcmVlIG5hdmlnYXRvclRyZWU7Ci0JcHJpdmF0ZSBUcmVlRWRpdG9yIHRyZWVFZGl0b3I7Ci0JcHJpdmF0ZSBUZXh0IHRleHRFZGl0b3I7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgdGV4dEVkaXRvclBhcmVudDsKLQlwcml2YXRlIFRleHRBY3Rpb25IYW5kbGVyIHRleHRBY3Rpb25IYW5kbGVyOwotCXByaXZhdGUgU3RyaW5nIHRleHQ7IC8vIHRoZSB0ZXh0IGJlaW5nIGVkaXRlZAotCXByaXZhdGUgQ29tbW9uVmlld2VyIGNvbW1vblZpZXdlcjsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIE5hdmlnYXRvclNpdGVFZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHNpdGUKLQkgKiAgICAgICAgICAgIHRoZSBuYXZpZ2F0b3Igc2l0ZSB0aGlzIGVkaXRvciBhcHBsaWVzIHRvCi0JICogQHBhcmFtIG5hdmlnYXRvclRyZWUKLQkgKiAgICAgICAgICAgIHRoZSB0cmVlIHRoYXQgaXMgYmVpbmcgZWRpdGVkCi0JICovCi0JcHVibGljIE5hdmlnYXRvclNpdGVFZGl0b3IoQ29tbW9uVmlld2VyIGFDb21tb25WaWV3ZXIsIFRyZWUgbmF2aWdhdG9yVHJlZSkgewotCQljb21tb25WaWV3ZXIgPSBhQ29tbW9uVmlld2VyOwotCQl0aGlzLm5hdmlnYXRvclRyZWUgPSBuYXZpZ2F0b3JUcmVlOwotCQl0cmVlRWRpdG9yID0gbmV3IFRyZWVFZGl0b3IobmF2aWdhdG9yVHJlZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGFyZW50IGNvbXBvc2l0ZSBmb3IgdGhlIGVkaXRvciBvdmVybGF5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBjb21wb3NpdGUgZm9yIHRoZSBlZGl0b3Igb3ZlcmxheQotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVQYXJlbnQoKSB7Ci0JCUNvbXBvc2l0ZSByZXN1bHQgPSBuZXcgQ29tcG9zaXRlKG5hdmlnYXRvclRyZWUsIFNXVC5OT05FKTsKLQkJVHJlZUl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbmF2aWdhdG9yVHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJdHJlZUVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCXRyZWVFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQl0cmVlRWRpdG9yLnNldEVkaXRvcihyZXN1bHQsIHNlbGVjdGVkSXRlbXNbMF0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRleHQgZWRpdG9yIHdpZGdldC4KLQkgKiAKLQkgKiBAcGFyYW0gcnVubmFibGUKLQkgKiAgICAgICAgICAgIHRoZSBSdW5uYWJsZSB0byBleGVjdXRlIHdoZW4gZWRpdGluZyBlbmRzIGJ5IHRoZSB1c2VyIHByZXNzaW5nIGVudGVyIG9yIGNsaWNraW5nCi0JICogICAgICAgICAgICBvdXRzaWRlIHRoZSB0ZXh0IGVkaXRvciBib3guCi0JICovCi0Jdm9pZCBjcmVhdGVUZXh0RWRpdG9yKGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCS8vIENyZWF0ZSB0ZXh0IGVkaXRvciBwYXJlbnQuIFRoaXMgZHJhd3MgYSBuaWNlIGJvdW5kaW5nIHJlY3QuCi0JCXRleHRFZGl0b3JQYXJlbnQgPSBjcmVhdGVQYXJlbnQoKTsKLQkJdGV4dEVkaXRvclBhcmVudC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJdGV4dEVkaXRvclBhcmVudC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlQb2ludCB0ZXh0U2l6ZSA9IHRleHRFZGl0b3IuZ2V0U2l6ZSgpOwotCQkJCVBvaW50IHBhcmVudFNpemUgPSB0ZXh0RWRpdG9yUGFyZW50LmdldFNpemUoKTsKLQkJCQllLmdjLmRyYXdSZWN0YW5nbGUoMCwgMCwgTWF0aC5taW4odGV4dFNpemUueCArIDQsIHBhcmVudFNpemUueCAtIDEpLCBwYXJlbnRTaXplLnkgLSAxKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQ3JlYXRlIGlubmVyIHRleHQgZWRpdG9yLgotCQl0ZXh0RWRpdG9yID0gbmV3IFRleHQodGV4dEVkaXRvclBhcmVudCwgU1dULk5PTkUpOwotCQl0ZXh0RWRpdG9yUGFyZW50LnNldEJhY2tncm91bmQodGV4dEVkaXRvci5nZXRCYWNrZ3JvdW5kKCkpOwotCQl0ZXh0RWRpdG9yLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlQb2ludCB0ZXh0U2l6ZSA9IHRleHRFZGl0b3IuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQl0ZXh0U2l6ZS54ICs9IHRleHRTaXplLnk7IC8vIEFkZCBleHRyYSBzcGFjZSBmb3IgbmV3IGNoYXJhY3RlcnMuCi0JCQkJUG9pbnQgcGFyZW50U2l6ZSA9IHRleHRFZGl0b3JQYXJlbnQuZ2V0U2l6ZSgpOwotCQkJCXRleHRFZGl0b3Iuc2V0Qm91bmRzKDIsIDEsIE1hdGgubWluKHRleHRTaXplLngsIHBhcmVudFNpemUueCAtIDQpLCBwYXJlbnRTaXplLnkgLSAyKTsKLQkJCQl0ZXh0RWRpdG9yUGFyZW50LnJlZHJhdygpOwotCQkJfQotCQl9KTsKLQkJdGV4dEVkaXRvci5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9Xb3JrYXJvdW5kIGZvciBCdWcgMjAyMTQgZHVlIHRvIGV4dHJhCi0JCQkJLy90cmF2ZXJzZSBldmVudHMKLQkJCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEUgOgotCQkJCQkJLy9EbyBub3RoaW5nIGluIHRoaXMgY2FzZQotCQkJCQkJZGlzcG9zZVRleHRXaWRnZXQoKTsKLQkJCQkJCWV2ZW50LmRvaXQgPSB0cnVlOwotCQkJCQkJZXZlbnQuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOIDoKLQkJCQkJCXNhdmVDaGFuZ2VzQW5kRGlzcG9zZShydW5uYWJsZSk7Ci0JCQkJCQlldmVudC5kb2l0ID0gdHJ1ZTsKLQkJCQkJCWV2ZW50LmRldGFpbCA9IFNXVC5UUkFWRVJTRV9OT05FOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdGV4dEVkaXRvci5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBmZSkgewotCQkJCXNhdmVDaGFuZ2VzQW5kRGlzcG9zZShydW5uYWJsZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmICh0ZXh0QWN0aW9uSGFuZGxlciAhPSBudWxsKSB7Ci0JCQl0ZXh0QWN0aW9uSGFuZGxlci5hZGRUZXh0KHRleHRFZGl0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSB0ZXh0IGVkaXRvciB3aWRnZXQuCi0JICovCi0Jdm9pZCBkaXNwb3NlVGV4dFdpZGdldCgpIHsKLQkJaWYgKHRleHRBY3Rpb25IYW5kbGVyICE9IG51bGwpIHsKLQkJCXRleHRBY3Rpb25IYW5kbGVyLnJlbW92ZVRleHQodGV4dEVkaXRvcik7Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3JQYXJlbnQgIT0gbnVsbCkgewotCQkJdGV4dEVkaXRvclBhcmVudC5kaXNwb3NlKCk7Ci0JCQl0ZXh0RWRpdG9yUGFyZW50ID0gbnVsbDsKLQkJCXRleHRFZGl0b3IgPSBudWxsOwotCQkJdHJlZUVkaXRvci5zZXRFZGl0b3IobnVsbCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyBhIHRleHQgZWRpdG9yIG92ZXJsYXkgb24gdGhlIHRyZWUgd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBydW5uYWJsZQotCSAqICAgICAgICAgICAgUnVubmFibGUgdG8gZXhlY3V0ZSB3aGVuIGVkaXRpbmcgZW5kcyBlaXRoZXIgYnkgdGhlIHVzZXIgcHJlc3NpbmcgZW50ZXIgb3IKLQkgKiAgICAgICAgICAgIGNsaWNraW5nIG91dHNpZGUgdGhlIGVkaXRvciBib3guCi0JICovCi0JcHVibGljIHZvaWQgZWRpdChSdW5uYWJsZSBydW5uYWJsZSkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbW1vblZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGV4dCA9IGdldExhYmVsKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCWlmICh0ZXh0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBNYWtlIHN1cmUgdGV4dCBlZGl0b3IgaXMgY3JlYXRlZCBvbmx5IG9uY2UuIFNpbXBseSByZXNldCB0ZXh0Ci0JCS8vIGVkaXRvciB3aGVuIGFjdGlvbiBpcyBleGVjdXRlZCBtb3JlIHRoYW4gb25jZS4gRml4ZXMgYnVnIDIyMjY5LgotCQlpZiAodGV4dEVkaXRvclBhcmVudCA9PSBudWxsKSB7Ci0JCQljcmVhdGVUZXh0RWRpdG9yKHJ1bm5hYmxlKTsKLQkJfQotCQl0ZXh0RWRpdG9yLnNldFRleHQodGV4dCk7Ci0JCS8vIE9wZW4gdGV4dCBlZGl0b3Igd2l0aCBpbml0aWFsIHNpemUuCi0JCXRleHRFZGl0b3JQYXJlbnQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJUG9pbnQgdGV4dFNpemUgPSB0ZXh0RWRpdG9yLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCXRleHRTaXplLnggKz0gdGV4dFNpemUueTsgLy8gQWRkIGV4dHJhIHNwYWNlIGZvciBuZXcgY2hhcmFjdGVycy4KLQkJUG9pbnQgcGFyZW50U2l6ZSA9IHRleHRFZGl0b3JQYXJlbnQuZ2V0U2l6ZSgpOwotCQl0ZXh0RWRpdG9yLnNldEJvdW5kcygyLCAxLCBNYXRoLm1pbih0ZXh0U2l6ZS54LCBwYXJlbnRTaXplLnggLSA0KSwgcGFyZW50U2l6ZS55IC0gMik7Ci0JCXRleHRFZGl0b3JQYXJlbnQucmVkcmF3KCk7Ci0JCXRleHRFZGl0b3Iuc2VsZWN0QWxsKCk7Ci0JCXRleHRFZGl0b3Iuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5ZWQgbGFiZWwgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHRoYXQgaXMgZGlzcGxheWVkIGluIHRoZSBuYXZpZ2F0b3IKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5ZWQgbGFiZWwgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICovCi0JU3RyaW5nIGdldExhYmVsKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoKElMYWJlbFByb3ZpZGVyKSBjb21tb25WaWV3ZXIuZ2V0TGFiZWxQcm92aWRlcigpKS5nZXRUZXh0KGVsZW1lbnQpOwotCX0KLQotIAotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGNoYW5nZXMgYW5kIGRpc3Bvc2VzIG9mIHRoZSB0ZXh0IHdpZGdldC4KLQkgKiAKLQkgKiBAcGFyYW0gcnVubmFibGUKLQkgKiAgICAgICAgICAgIFJ1bm5hYmxlIHRvIGV4ZWN1dGUKLQkgKi8KLQl2b2lkIHNhdmVDaGFuZ2VzQW5kRGlzcG9zZShmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSkgewotCQlmaW5hbCBTdHJpbmcgbmV3VGV4dCA9IHRleHRFZGl0b3IuZ2V0VGV4dCgpOwotCQkvLyBSdW4gdGhpcyBpbiBhbiBhc3luYyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgb3BlcmF0aW9uIHRoYXQgdHJpZ2dlcmVkCi0JCS8vIHRoaXMgYWN0aW9uIGlzIGNvbXBsZXRlZC4gT3RoZXJ3aXNlIHRoaXMgbGVhZHMgdG8gcHJvYmxlbXMgd2hlbiB0aGUKLQkJLy8gaWNvbiBvZiB0aGUgaXRlbSBiZWluZyByZW5hbWVkIGlzIGNsaWNrZWQgKGkuZS4sIHdoaWNoIGNhdXNlcyB0aGUgcmVuYW1lCi0JCS8vIHRleHQgd2lkZ2V0IHRvIGxvc2UgZm9jdXMgYW5kIHRyaWdnZXIgdGhpcyBtZXRob2QpLgotCQlSdW5uYWJsZSBlZGl0UnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGlzcG9zZVRleHRXaWRnZXQoKTsKLQkJCQlpZiAobmV3VGV4dC5sZW5ndGgoKSA+IDAgJiYgbmV3VGV4dC5lcXVhbHModGV4dCkgPT0gZmFsc2UpIHsKLQkJCQkJdGV4dCA9IG5ld1RleHQ7Ci0JCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJCX0KLQkJCQl0ZXh0ID0gbnVsbDsKLQkJCX0KLQkJfTsKLQkJbmF2aWdhdG9yVHJlZS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoZWRpdFJ1bm5hYmxlKTsKLQl9Ci0KLSAKLQlwdWJsaWMgdm9pZCBzZXRUZXh0QWN0aW9uSGFuZGxlcihUZXh0QWN0aW9uSGFuZGxlciBhY3Rpb25IYW5kbGVyKSB7Ci0JCXRleHRBY3Rpb25IYW5kbGVyID0gYWN0aW9uSGFuZGxlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvVGV4dEFjdGlvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvVGV4dEFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyMDIwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL1RleHRBY3Rpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBIYW5kbGVzIHRoZSByZWRpcmVjdGlvbiBvZiB0aGUgZ2xvYmFsIEN1dCwgQ29weSwgUGFzdGUsIGFuZAotICogU2VsZWN0IEFsbCBhY3Rpb25zIHRvIGVpdGhlciB0aGUgY3VycmVudCBpbmxpbmUgdGV4dCBjb250cm9sCi0gKiBvciB0aGUgcGFydCdzIHN1cHBsaWVkIGFjdGlvbiBoYW5kbGVyLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPjxwPgotICogRXhhbXBsZSB1c2FnZToKLSAqIDxwcmU+Ci0gKiB0ZXh0QWN0aW9uSGFuZGxlciA9IG5ldyBUZXh0QWN0aW9uSGFuZGxlcih0aGlzLmdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpKTsKLSAqIHRleHRBY3Rpb25IYW5kbGVyLmFkZFRleHQoKFRleHQpdGV4dENlbGxFZGl0b3IxLmdldENvbnRyb2woKSk7Ci0gKiB0ZXh0QWN0aW9uSGFuZGxlci5hZGRUZXh0KChUZXh0KXRleHRDZWxsRWRpdG9yMi5nZXRDb250cm9sKCkpOwotICogdGV4dEFjdGlvbkhhbmRsZXIuc2V0U2VsZWN0QWxsQWN0aW9uKHNlbGVjdEFsbEFjdGlvbik7Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFRleHRBY3Rpb25IYW5kbGVyIHsKLSAgICBwcml2YXRlIERlbGV0ZUFjdGlvbkhhbmRsZXIgdGV4dERlbGV0ZUFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb25IYW5kbGVyKCk7Ci0KLSAgICBwcml2YXRlIEN1dEFjdGlvbkhhbmRsZXIgdGV4dEN1dEFjdGlvbiA9IG5ldyBDdXRBY3Rpb25IYW5kbGVyKCk7Ci0KLSAgICBwcml2YXRlIENvcHlBY3Rpb25IYW5kbGVyIHRleHRDb3B5QWN0aW9uID0gbmV3IENvcHlBY3Rpb25IYW5kbGVyKCk7Ci0KLSAgICBwcml2YXRlIFBhc3RlQWN0aW9uSGFuZGxlciB0ZXh0UGFzdGVBY3Rpb24gPSBuZXcgUGFzdGVBY3Rpb25IYW5kbGVyKCk7Ci0KLSAgICBwcml2YXRlIFNlbGVjdEFsbEFjdGlvbkhhbmRsZXIgdGV4dFNlbGVjdEFsbEFjdGlvbiA9IG5ldyBTZWxlY3RBbGxBY3Rpb25IYW5kbGVyKCk7Ci0KLSAgICBwcml2YXRlIElBY3Rpb24gZGVsZXRlQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJQWN0aW9uIGN1dEFjdGlvbjsKLQotICAgIHByaXZhdGUgSUFjdGlvbiBjb3B5QWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJQWN0aW9uIHBhc3RlQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJQWN0aW9uIHNlbGVjdEFsbEFjdGlvbjsKLQotICAgIHByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZGVsZXRlQWN0aW9uTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgIHRleHREZWxldGVBY3Rpb24pOwotCi0gICAgcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjdXRBY3Rpb25MaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgdGV4dEN1dEFjdGlvbik7Ci0KLSAgICBwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNvcHlBY3Rpb25MaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgdGV4dENvcHlBY3Rpb24pOwotCi0gICAgcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwYXN0ZUFjdGlvbkxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICB0ZXh0UGFzdGVBY3Rpb24pOwotCi0gICAgcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzZWxlY3RBbGxBY3Rpb25MaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgdGV4dFNlbGVjdEFsbEFjdGlvbik7Ci0KLSAgICBwcml2YXRlIExpc3RlbmVyIHRleHRDb250cm9sTGlzdGVuZXIgPSBuZXcgVGV4dENvbnRyb2xMaXN0ZW5lcigpOwotCi0gICAgcHJpdmF0ZSBUZXh0IGFjdGl2ZVRleHRDb250cm9sOwotCi0gICAgcHJpdmF0ZSBNb3VzZUFkYXB0ZXIgbW91c2VBZGFwdGVyID0gbmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGlvbnNFbmFibGVTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgS2V5QWRhcHRlciBrZXlBZGFwdGVyID0gbmV3IEtleUFkYXB0ZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGlvbnNFbmFibGVTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgY2xhc3MgVGV4dENvbnRyb2xMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgICAgICAgICAgY2FzZSBTV1QuQWN0aXZhdGU6Ci0gICAgICAgICAgICAgICAgYWN0aXZlVGV4dENvbnRyb2wgPSAoVGV4dCkgZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgICAgIHVwZGF0ZUFjdGlvbnNFbmFibGVTdGF0ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTV1QuRGVhY3RpdmF0ZToKLSAgICAgICAgICAgICAgICBhY3RpdmVUZXh0Q29udHJvbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQWN0aW9uc0VuYWJsZVN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotICAgICAgICBwcml2YXRlIElBY3Rpb24gYWN0aW9uSGFuZGxlcjsKLQotICAgICAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJQWN0aW9uIGFjdGlvbkhhbmRsZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLmFjdGlvbkhhbmRsZXIgPSBhY3Rpb25IYW5kbGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYgKGFjdGl2ZVRleHRDb250cm9sICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKElBY3Rpb24uRU5BQkxFRCkpIHsKLSAgICAgICAgICAgICAgICBCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBhY3Rpb25IYW5kbGVyLnNldEVuYWJsZWQoYm9vbC5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIERlbGV0ZUFjdGlvbkhhbmRsZXIgZXh0ZW5kcyBBY3Rpb24gewotICAgICAgICBwcm90ZWN0ZWQgRGVsZXRlQWN0aW9uSGFuZGxlcigpIHsKLSAgICAgICAgICAgIHN1cGVyKENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLkRlbGV0ZSk7Ci0gICAgICAgICAgICBzZXRJZCgiVGV4dERlbGV0ZUFjdGlvbkhhbmRsZXIiKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLSAgICAgICAgICAgIAkJSU5hdmlnYXRvckhlbHBDb250ZXh0SWRzLlRFWFRfREVMRVRFX0FDVElPTik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVUZXh0Q29udHJvbCAhPSBudWxsICYmICFhY3RpdmVUZXh0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVUZXh0Q29udHJvbC5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZWxldGVBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZUFjdGlvbi5ydW5XaXRoRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVcGRhdGUgc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVFbmFibGVkU3RhdGUoKSB7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlVGV4dENvbnRyb2wgIT0gbnVsbCAmJiAhYWN0aXZlVGV4dENvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZChhY3RpdmVUZXh0Q29udHJvbC5nZXRTZWxlY3Rpb25Db3VudCgpID4gMAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgYWN0aXZlVGV4dENvbnRyb2wuZ2V0Q2FyZXRQb3NpdGlvbigpIDwgYWN0aXZlVGV4dENvbnRyb2wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENoYXJDb3VudCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVsZXRlQWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkKGRlbGV0ZUFjdGlvbi5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEN1dEFjdGlvbkhhbmRsZXIgZXh0ZW5kcyBBY3Rpb24gewotICAgICAgICBwcm90ZWN0ZWQgQ3V0QWN0aW9uSGFuZGxlcigpIHsKLSAgICAgICAgICAgIHN1cGVyKENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLkN1dCk7Ci0gICAgICAgICAgICBzZXRJZCgiVGV4dEN1dEFjdGlvbkhhbmRsZXIiKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLSAgICAgICAgICAgIAkJSU5hdmlnYXRvckhlbHBDb250ZXh0SWRzLlRFWFRfQ1VUX0FDVElPTik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVUZXh0Q29udHJvbCAhPSBudWxsICYmICFhY3RpdmVUZXh0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVUZXh0Q29udHJvbC5jdXQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY3V0QWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdXRBY3Rpb24ucnVuV2l0aEV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVXBkYXRlIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlKCkgewotICAgICAgICAgICAgaWYgKGFjdGl2ZVRleHRDb250cm9sICE9IG51bGwgJiYgIWFjdGl2ZVRleHRDb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgIHNldEVuYWJsZWQoYWN0aXZlVGV4dENvbnRyb2wuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjdXRBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldEVuYWJsZWQoY3V0QWN0aW9uLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQ29weUFjdGlvbkhhbmRsZXIgZXh0ZW5kcyBBY3Rpb24gewotICAgICAgICBwcm90ZWN0ZWQgQ29weUFjdGlvbkhhbmRsZXIoKSB7Ci0gICAgICAgICAgICBzdXBlcihDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5Db3B5KTsKLSAgICAgICAgICAgIHNldElkKCJUZXh0Q29weUFjdGlvbkhhbmRsZXIiKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLSAgICAgICAgICAgIAkJSU5hdmlnYXRvckhlbHBDb250ZXh0SWRzLlRFWFRfQ09QWV9BQ1RJT04pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlVGV4dENvbnRyb2wgIT0gbnVsbCAmJiAhYWN0aXZlVGV4dENvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZlVGV4dENvbnRyb2wuY29weSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb3B5QWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb3B5QWN0aW9uLnJ1bldpdGhFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVFbmFibGVkU3RhdGUoKSB7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlVGV4dENvbnRyb2wgIT0gbnVsbCAmJiAhYWN0aXZlVGV4dENvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZChhY3RpdmVUZXh0Q29udHJvbC5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvcHlBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldEVuYWJsZWQoY29weUFjdGlvbi5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFBhc3RlQWN0aW9uSGFuZGxlciBleHRlbmRzIEFjdGlvbiB7Ci0gICAgICAgIHByb3RlY3RlZCBQYXN0ZUFjdGlvbkhhbmRsZXIoKSB7Ci0gICAgICAgICAgICBzdXBlcihDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5QYXN0ZSk7Ci0gICAgICAgICAgICBzZXRJZCgiVGV4dFBhc3RlQWN0aW9uSGFuZGxlciIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotICAgICAgICAgICAgCQlJTmF2aWdhdG9ySGVscENvbnRleHRJZHMuVEVYVF9QQVNURV9BQ1RJT04pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlVGV4dENvbnRyb2wgIT0gbnVsbCAmJiAhYWN0aXZlVGV4dENvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZlVGV4dENvbnRyb2wucGFzdGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFzdGVBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhc3RlQWN0aW9uLnJ1bldpdGhFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgc3RhdGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUVuYWJsZWRTdGF0ZSgpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVUZXh0Q29udHJvbCAhPSBudWxsICYmICFhY3RpdmVUZXh0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXN0ZUFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZChwYXN0ZUFjdGlvbi5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNlbGVjdEFsbEFjdGlvbkhhbmRsZXIgZXh0ZW5kcyBBY3Rpb24gewotICAgICAgICBwcm90ZWN0ZWQgU2VsZWN0QWxsQWN0aW9uSGFuZGxlcigpIHsKLSAgICAgICAgICAgIHN1cGVyKENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLlRleHRBY3Rpb25fc2VsZWN0QWxsKTsKLSAgICAgICAgICAgIHNldElkKCJUZXh0U2VsZWN0QWxsQWN0aW9uSGFuZGxlciIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotCQkJCQlJTmF2aWdhdG9ySGVscENvbnRleHRJZHMuVEVYVF9TRUxFQ1RfQUxMX0FDVElPTik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVUZXh0Q29udHJvbCAhPSBudWxsICYmICFhY3RpdmVUZXh0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVUZXh0Q29udHJvbC5zZWxlY3RBbGwoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VsZWN0QWxsQWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RBbGxBY3Rpb24ucnVuV2l0aEV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUVuYWJsZWRTdGF0ZSgpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVUZXh0Q29udHJvbCAhPSBudWxsICYmICFhY3RpdmVUZXh0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWxlY3RBbGxBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldEVuYWJsZWQoc2VsZWN0QWxsQWN0aW9uLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sIGFjdGlvbiBoYW5kbGVyCi0gICAgICogZm9yIHRoZSBnbG9iYWwgQ3V0LCBDb3B5LCBQYXN0ZSwgRGVsZXRlLCBhbmQgU2VsZWN0IEFsbCAKLSAgICAgKiBvZiB0aGUgYWN0aW9uIGJhci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb25CYXIgdGhlIGFjdGlvbiBiYXIgdG8gcmVnaXN0ZXIgZ2xvYmFsCi0gICAgICogICAgYWN0aW9uIGhhbmRsZXJzIGZvciBDdXQsIENvcHksIFBhc3RlLCBEZWxldGUsIAotICAgICAqIAkgIGFuZCBTZWxlY3QgQWxsCi0gICAgICovCi0gICAgcHVibGljIFRleHRBY3Rpb25IYW5kbGVyKElBY3Rpb25CYXJzIGFjdGlvbkJhcikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBhY3Rpb25CYXIuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLAotICAgICAgICAgICAgICAgIHRleHRDdXRBY3Rpb24pOwotICAgICAgICBhY3Rpb25CYXIuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICB0ZXh0Q29weUFjdGlvbik7Ci0gICAgICAgIGFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICB0ZXh0UGFzdGVBY3Rpb24pOwotICAgICAgICBhY3Rpb25CYXIuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICB0ZXh0U2VsZWN0QWxsQWN0aW9uKTsKLSAgICAgICAgYWN0aW9uQmFyLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICB0ZXh0RGVsZXRlQWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sIHRvIHRoZSBoYW5kbGVyCi0gICAgICogc28gdGhhdCB0aGUgQ3V0LCBDb3B5LCBQYXN0ZSwgRGVsZXRlLCBhbmQgU2VsZWN0IEFsbCAKLSAgICAgKiBhY3Rpb25zIGFyZSByZWRpcmVjdGVkIHRvIGl0IHdoZW4gYWN0aXZlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHRDb250cm9sIHRoZSBpbmxpbmUgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoVGV4dCB0ZXh0Q29udHJvbCkgewotICAgICAgICBpZiAodGV4dENvbnRyb2wgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBhY3RpdmVUZXh0Q29udHJvbCA9IHRleHRDb250cm9sOwotICAgICAgICB0ZXh0Q29udHJvbC5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIHRleHRDb250cm9sTGlzdGVuZXIpOwotICAgICAgICB0ZXh0Q29udHJvbC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgdGV4dENvbnRyb2xMaXN0ZW5lcik7Ci0KLSAgICAgICAgLy8gV2UgcmVhbGx5IHdhbnQgYSBzZWxlY3Rpb24gbGlzdGVuZXIgYnV0IGl0IGlzIG5vdCBzdXBwb3J0ZWQgc28gd2UKLSAgICAgICAgLy8gdXNlIGEga2V5IGxpc3RlbmVyIGFuZCBhIG1vdXNlIGxpc3RlbmVyIHRvIGtub3cgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcwotICAgICAgICAvLyBtYXkgaGF2ZSBvY2N1cmVkCi0gICAgICAgIHRleHRDb250cm9sLmFkZEtleUxpc3RlbmVyKGtleUFkYXB0ZXIpOwotICAgICAgICB0ZXh0Q29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKG1vdXNlQWRhcHRlcik7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlIG9mIHRoaXMgYWN0aW9uIGhhbmRsZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzZXRDdXRBY3Rpb24obnVsbCk7Ci0gICAgICAgIHNldENvcHlBY3Rpb24obnVsbCk7Ci0gICAgICAgIHNldFBhc3RlQWN0aW9uKG51bGwpOwotICAgICAgICBzZXRTZWxlY3RBbGxBY3Rpb24obnVsbCk7Ci0gICAgICAgIHNldERlbGV0ZUFjdGlvbihudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbCBmcm9tIHRoZSBoYW5kbGVyCi0gICAgICogc28gdGhhdCB0aGUgQ3V0LCBDb3B5LCBQYXN0ZSwgRGVsZXRlLCBhbmQgU2VsZWN0IEFsbCAKLSAgICAgKiBhY3Rpb25zIGFyZSBubyBsb25nZXIgcmVkaXJlY3RlZCB0byBpdCB3aGVuIGFjdGl2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0Q29udHJvbCB0aGUgaW5saW5lIDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVUZXh0KFRleHQgdGV4dENvbnRyb2wpIHsKLSAgICAgICAgaWYgKHRleHRDb250cm9sID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgdGV4dENvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULkFjdGl2YXRlLCB0ZXh0Q29udHJvbExpc3RlbmVyKTsKLSAgICAgICAgdGV4dENvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHRleHRDb250cm9sTGlzdGVuZXIpOwotCi0gICAgICAgIHRleHRDb250cm9sLnJlbW92ZU1vdXNlTGlzdGVuZXIobW91c2VBZGFwdGVyKTsKLSAgICAgICAgdGV4dENvbnRyb2wucmVtb3ZlS2V5TGlzdGVuZXIoa2V5QWRhcHRlcik7Ci0KLSAgICAgICAgYWN0aXZlVGV4dENvbnRyb2wgPSBudWxsOwotICAgICAgICB1cGRhdGVBY3Rpb25zRW5hYmxlU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlZmF1bHQgPGNvZGU+SUFjdGlvbjwvY29kZT4gaGFuZGxlciBmb3IgdGhlIENvcHkKLSAgICAgKiBhY3Rpb24uIFRoaXMgPGNvZGU+SUFjdGlvbjwvY29kZT4gaXMgcnVuIG9ubHkgaWYgbm8gYWN0aXZlCi0gICAgICogaW5saW5lIHRleHQgY29udHJvbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb24gdGhlIDxjb2RlPklBY3Rpb248L2NvZGU+IHRvIHJ1biBmb3IgdGhlCi0gICAgICogICAgQ29weSBhY3Rpb24sIG9yIDxjb2RlPm51bGw8L251bGw+IGlmIG5vdCBpbnRlcmVzdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvcHlBY3Rpb24oSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgaWYgKGNvcHlBY3Rpb24gPT0gYWN0aW9uKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChjb3B5QWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBjb3B5QWN0aW9uLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoY29weUFjdGlvbkxpc3RlbmVyKTsKLQotICAgICAgICBjb3B5QWN0aW9uID0gYWN0aW9uOwotCi0gICAgICAgIGlmIChjb3B5QWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBjb3B5QWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoY29weUFjdGlvbkxpc3RlbmVyKTsKLQotICAgICAgICB0ZXh0Q29weUFjdGlvbi51cGRhdGVFbmFibGVkU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlZmF1bHQgPGNvZGU+SUFjdGlvbjwvY29kZT4gaGFuZGxlciBmb3IgdGhlIEN1dAotICAgICAqIGFjdGlvbi4gVGhpcyA8Y29kZT5JQWN0aW9uPC9jb2RlPiBpcyBydW4gb25seSBpZiBubyBhY3RpdmUKLSAgICAgKiBpbmxpbmUgdGV4dCBjb250cm9sLgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdGlvbiB0aGUgPGNvZGU+SUFjdGlvbjwvY29kZT4gdG8gcnVuIGZvciB0aGUKLSAgICAgKiAgICBDdXQgYWN0aW9uLCBvciA8Y29kZT5udWxsPC9udWxsPiBpZiBub3QgaW50ZXJlc3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXRBY3Rpb24oSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgaWYgKGN1dEFjdGlvbiA9PSBhY3Rpb24pCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKGN1dEFjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgY3V0QWN0aW9uLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoY3V0QWN0aW9uTGlzdGVuZXIpOwotCi0gICAgICAgIGN1dEFjdGlvbiA9IGFjdGlvbjsKLQotICAgICAgICBpZiAoY3V0QWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBjdXRBY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihjdXRBY3Rpb25MaXN0ZW5lcik7Ci0KLSAgICAgICAgdGV4dEN1dEFjdGlvbi51cGRhdGVFbmFibGVkU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlZmF1bHQgPGNvZGU+SUFjdGlvbjwvY29kZT4gaGFuZGxlciBmb3IgdGhlIFBhc3RlCi0gICAgICogYWN0aW9uLiBUaGlzIDxjb2RlPklBY3Rpb248L2NvZGU+IGlzIHJ1biBvbmx5IGlmIG5vIGFjdGl2ZQotICAgICAqIGlubGluZSB0ZXh0IGNvbnRyb2wuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0aW9uIHRoZSA8Y29kZT5JQWN0aW9uPC9jb2RlPiB0byBydW4gZm9yIHRoZQotICAgICAqICAgIFBhc3RlIGFjdGlvbiwgb3IgPGNvZGU+bnVsbDwvbnVsbD4gaWYgbm90IGludGVyZXN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFzdGVBY3Rpb24oSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgaWYgKHBhc3RlQWN0aW9uID09IGFjdGlvbikKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAocGFzdGVBY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHBhc3RlQWN0aW9uLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGFzdGVBY3Rpb25MaXN0ZW5lcik7Ci0KLSAgICAgICAgcGFzdGVBY3Rpb24gPSBhY3Rpb247Ci0KLSAgICAgICAgaWYgKHBhc3RlQWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBwYXN0ZUFjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBhc3RlQWN0aW9uTGlzdGVuZXIpOwotCi0gICAgICAgIHRleHRQYXN0ZUFjdGlvbi51cGRhdGVFbmFibGVkU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlZmF1bHQgPGNvZGU+SUFjdGlvbjwvY29kZT4gaGFuZGxlciBmb3IgdGhlIFNlbGVjdCBBbGwKLSAgICAgKiBhY3Rpb24uIFRoaXMgPGNvZGU+SUFjdGlvbjwvY29kZT4gaXMgcnVuIG9ubHkgaWYgbm8gYWN0aXZlCi0gICAgICogaW5saW5lIHRleHQgY29udHJvbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb24gdGhlIDxjb2RlPklBY3Rpb248L2NvZGU+IHRvIHJ1biBmb3IgdGhlCi0gICAgICogICAgU2VsZWN0IEFsbCBhY3Rpb24sIG9yIDxjb2RlPm51bGw8L251bGw+IGlmIG5vdCBpbnRlcmVzdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdEFsbEFjdGlvbihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBpZiAoc2VsZWN0QWxsQWN0aW9uID09IGFjdGlvbikKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoc2VsZWN0QWxsQWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBzZWxlY3RBbGxBY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoc2VsZWN0QWxsQWN0aW9uTGlzdGVuZXIpOwotCi0gICAgICAgIHNlbGVjdEFsbEFjdGlvbiA9IGFjdGlvbjsKLQotICAgICAgICBpZiAoc2VsZWN0QWxsQWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBzZWxlY3RBbGxBY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihzZWxlY3RBbGxBY3Rpb25MaXN0ZW5lcik7Ci0KLSAgICAgICAgdGV4dFNlbGVjdEFsbEFjdGlvbi51cGRhdGVFbmFibGVkU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlZmF1bHQgPGNvZGU+SUFjdGlvbjwvY29kZT4gaGFuZGxlciBmb3IgdGhlIERlbGV0ZQotICAgICAqIGFjdGlvbi4gVGhpcyA8Y29kZT5JQWN0aW9uPC9jb2RlPiBpcyBydW4gb25seSBpZiBubyBhY3RpdmUKLSAgICAgKiBpbmxpbmUgdGV4dCBjb250cm9sLgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdGlvbiB0aGUgPGNvZGU+SUFjdGlvbjwvY29kZT4gdG8gcnVuIGZvciB0aGUKLSAgICAgKiAgICBEZWxldGUgYWN0aW9uLCBvciA8Y29kZT5udWxsPC9udWxsPiBpZiBub3QgaW50ZXJlc3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWxldGVBY3Rpb24oSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgaWYgKGRlbGV0ZUFjdGlvbiA9PSBhY3Rpb24pCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKGRlbGV0ZUFjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgZGVsZXRlQWN0aW9uLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZGVsZXRlQWN0aW9uTGlzdGVuZXIpOwotCi0gICAgICAgIGRlbGV0ZUFjdGlvbiA9IGFjdGlvbjsKLQotICAgICAgICBpZiAoZGVsZXRlQWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBkZWxldGVBY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihkZWxldGVBY3Rpb25MaXN0ZW5lcik7Ci0KLSAgICAgICAgdGV4dERlbGV0ZUFjdGlvbi51cGRhdGVFbmFibGVkU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIGVuYWJsZSBzdGF0ZSBvZiB0aGUgQ3V0LCBDb3B5LAotICAgICAqIFBhc3RlLCBEZWxldGUsIGFuZCBTZWxlY3QgQWxsIGFjdGlvbiBoYW5kbGVycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBY3Rpb25zRW5hYmxlU3RhdGUoKSB7Ci0gICAgICAgIHRleHRDdXRBY3Rpb24udXBkYXRlRW5hYmxlZFN0YXRlKCk7Ci0gICAgICAgIHRleHRDb3B5QWN0aW9uLnVwZGF0ZUVuYWJsZWRTdGF0ZSgpOwotICAgICAgICB0ZXh0UGFzdGVBY3Rpb24udXBkYXRlRW5hYmxlZFN0YXRlKCk7Ci0gICAgICAgIHRleHRTZWxlY3RBbGxBY3Rpb24udXBkYXRlRW5hYmxlZFN0YXRlKCk7Ci0gICAgICAgIHRleHREZWxldGVBY3Rpb24udXBkYXRlRW5hYmxlZFN0YXRlKCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL1V0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9VdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwNmE4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL1V0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5OYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZTsKLQotcHVibGljIGNsYXNzIFV0aWxpdGllcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKElOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yIGFWaWV3ZXJEZXNjcmlwdG9yLCBJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IgYUNvbnRlbnREZXNjcmlwdG9yLCBPYmplY3QgYW5FbGVtZW50KSB7CQkKLQkJcmV0dXJuIGlzQWN0aXZlKGFWaWV3ZXJEZXNjcmlwdG9yLCBhQ29udGVudERlc2NyaXB0b3IpICYmIGlzVmlzaWJsZShhVmlld2VyRGVzY3JpcHRvciwgYUNvbnRlbnREZXNjcmlwdG9yKSAmJiBpc0VuYWJsZWQoIGFDb250ZW50RGVzY3JpcHRvciwgYW5FbGVtZW50KTsgCQotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXBwbGljYWJsZShJTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvciBhVmlld2VyRGVzY3JpcHRvciwgSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yIGFDb250ZW50RGVzY3JpcHRvciwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewkJCi0JCXJldHVybiBpc0FjdGl2ZShhVmlld2VyRGVzY3JpcHRvciwgYUNvbnRlbnREZXNjcmlwdG9yKSAmJiBpc1Zpc2libGUoYVZpZXdlckRlc2NyaXB0b3IsIGFDb250ZW50RGVzY3JpcHRvcikgJiYgaXNFbmFibGVkKCBhQ29udGVudERlc2NyaXB0b3IsIGFTZWxlY3Rpb24pOyAJCi0JfQotCQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmUoSU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IgYVZpZXdlckRlc2NyaXB0b3IsIElOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciBhQ29udGVudERlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIE5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkuaXNOYXZpZ2F0b3JFeHRlbnNpb25BY3RpdmUoYVZpZXdlckRlc2NyaXB0b3IuZ2V0Vmlld2VySWQoKSwgYUNvbnRlbnREZXNjcmlwdG9yLmdldElkKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmUoSU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IgYVZpZXdlckRlc2NyaXB0b3IsIFN0cmluZyBhQ29udGVudEV4dGVuc2lvbklkKSB7Ci0JCXJldHVybiBOYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpLmlzTmF2aWdhdG9yRXh0ZW5zaW9uQWN0aXZlKGFWaWV3ZXJEZXNjcmlwdG9yLmdldFZpZXdlcklkKCksIGFDb250ZW50RXh0ZW5zaW9uSWQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaXNpYmxlKElOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yIGFWaWV3ZXJEZXNjcmlwdG9yLCBJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IgYUNvbnRlbnREZXNjcmlwdG9yKSB7Ci0JCXJldHVybiBhVmlld2VyRGVzY3JpcHRvci5pc1Zpc2libGVDb250ZW50RXh0ZW5zaW9uKGFDb250ZW50RGVzY3JpcHRvci5nZXRJZCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaXNpYmxlKElOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yIGFWaWV3ZXJEZXNjcmlwdG9yLCBTdHJpbmcgYUNvbnRlbnRFeHRlbnNpb25JZCkgewotCQlyZXR1cm4gYVZpZXdlckRlc2NyaXB0b3IuaXNWaXNpYmxlQ29udGVudEV4dGVuc2lvbihhQ29udGVudEV4dGVuc2lvbklkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkKElOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciBhQ29udGVudERlc2NyaXB0b3IsIE9iamVjdCBhbkVsZW1lbnQpIHsKLQkJcmV0dXJuIGFDb250ZW50RGVzY3JpcHRvci5pc0VuYWJsZWRGb3IoYW5FbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5hYmxlZChJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IgYUNvbnRlbnREZXNjcmlwdG9yLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCXJldHVybiBhQ29udGVudERlc2NyaXB0b3IuaXNFbmFibGVkRm9yKGFTZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvYWN0aW9ucy9Db2xsYXBzZUFsbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9hY3Rpb25zL0NvbGxhcHNlQWxsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYWMzYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9hY3Rpb25zL0NvbGxhcHNlQWxsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXM7Ci0KLS8qKgotICogVGhpcyBhY3Rpb24gZGVsZWdhdGUgY29sbGFwc2VzIGFsbCBleHBhbmRlZCBlbGVtZW50cyBpbiBhIE5hdmlnYXRvciB2aWV3LgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsYXBzZUFsbEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb24gewotCi0JcHJpdmF0ZSBmaW5hbCBDb21tb25WaWV3ZXIgY29tbW9uVmlld2VyOwotCi0JcHVibGljIENvbGxhcHNlQWxsQWN0aW9uKENvbW1vblZpZXdlciBhVmlld2VyKSB7Ci0JCXN1cGVyKENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLkNvbGxhcHNlQWxsQWN0aW9uRGVsZWdhdGVfMCk7Ci0JCXNldFRvb2xUaXBUZXh0KENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLkNvbGxhcHNlQWxsQWN0aW9uRGVsZWdhdGVfMCk7IAotCQljb21tb25WaWV3ZXIgPSBhVmlld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGNvbW1vblZpZXdlciAhPSBudWxsKQotCQkJY29tbW9uVmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9hY3Rpb25zL0NvbW1vbkFjdGlvbkRlc2NyaXB0b3JNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2FjdGlvbnMvQ29tbW9uQWN0aW9uRGVzY3JpcHRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhYWNjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2FjdGlvbnMvQ29tbW9uQWN0aW9uRGVzY3JpcHRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuTmF2aWdhdG9yQ29udGVudFJlZ2lzdHJ5UmVhZGVyOwotCi0vKioKLSAqIE1hbmFnZXMgZGVzY3JpcHRvcnMgY29uc3VtZWQgZnJvbSB0aGUgJ2FjdGlvblByb3ZpZGVyJyBlbGVtZW50cyBvZiB0aGUKLSAqIDxiPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50PC9iPiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uQWN0aW9uRGVzY3JpcHRvck1hbmFnZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW10gTk9fREVTQ1JJUFRPUlMgPSBuZXcgQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yWzBdOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tbW9uQWN0aW9uRGVzY3JpcHRvck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgQ29tbW9uQWN0aW9uRGVzY3JpcHRvck1hbmFnZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZDsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1vbkFjdGlvbkRlc2NyaXB0b3JNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJc3luY2hyb25pemVkIChJTlNUQU5DRSkgewotCQkJaWYgKCFpc0luaXRpYWxpemVkKSB7Ci0JCQkJSU5TVEFOQ0UuaW5pdCgpOwotCQkJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JLyogUHJvdmlkZXMgYSBtYXAgb2YgKGlkcywgQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yKS1wYWlycy4gICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAgZGVwZW5kZW50RGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcCgpOyAKLQkgICAKLQkvKiBQcm92aWRlcyBhIG1hcCBvZiAoaWRzLCBDb21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3IpLXBhaXJzLiAgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCByb290RGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcCgpOyAKLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQluZXcgQWN0aW9uUHJvdmlkZXJSZWdpc3RyeSgpLnJlYWRSZWdpc3RyeSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhRGVzY3JpcHRvcgotCSAqICAgICAgICAgICAgQSB2YWxpZCBkZXNjcmlwdG9yIHRvIGJlZ2luIG1hbmFnaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGlvbkRlc2NyaXB0b3IoQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yIGFEZXNjcmlwdG9yKSB7Ci0JCQkJCi0JCWlmKGFEZXNjcmlwdG9yLmdldERlcGVuZHNPbklkKCkgPT0gbnVsbCkKLQkJCXJvb3REZXNjcmlwdG9ycy5wdXQoYURlc2NyaXB0b3IuZ2V0SWQoKSwgYURlc2NyaXB0b3IpOwotCQllbHNlIAotCQkJZGVwZW5kZW50RGVzY3JpcHRvcnMucHV0KGFEZXNjcmlwdG9yLmdldElkKCksIGFEZXNjcmlwdG9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZU9yZGVyaW5nKCkgeyAKLQkJQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yIGRlcGVuZGVudERlc2NyaXB0b3I7Ci0JCUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvciByZXF1aXJlZERlc2NyaXB0b3I7Ci0KLQkJQ29sbGVjdGlvbiB1bnJlc29sdmVkRGVwZW5kZW50RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KGRlcGVuZGVudERlc2NyaXB0b3JzLnZhbHVlcygpKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlcGVuZGVudERlc2NyaXB0b3JzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJZGVwZW5kZW50RGVzY3JpcHRvciA9IChDb21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJcmVxdWlyZWREZXNjcmlwdG9yID0gKENvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcikgcm9vdERlc2NyaXB0b3JzLmdldChkZXBlbmRlbnREZXNjcmlwdG9yLmdldERlcGVuZHNPbklkKCkpOwotCQkJaWYocmVxdWlyZWREZXNjcmlwdG9yID09IG51bGwpCi0JCQkJcmVxdWlyZWREZXNjcmlwdG9yID0gKENvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcikgZGVwZW5kZW50RGVzY3JpcHRvcnMuZ2V0KGRlcGVuZGVudERlc2NyaXB0b3IuZ2V0RGVwZW5kc09uSWQoKSk7Ci0JCQlpZihyZXF1aXJlZERlc2NyaXB0b3IgIT0gbnVsbCkgeyAKLQkJCQlyZXF1aXJlZERlc2NyaXB0b3IuYWRkRGVwZW5kZW50RGVzY3JpcHRvcihkZXBlbmRlbnREZXNjcmlwdG9yKTsKLQkJCQl1bnJlc29sdmVkRGVwZW5kZW50RGVzY3JpcHRvcnMucmVtb3ZlKGRlcGVuZGVudERlc2NyaXB0b3IpOwotCQkJfQotCQkJCi0JCX0KLQkJCi0JCWRlcGVuZGVudERlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCQotCQlpZighdW5yZXNvbHZlZERlcGVuZGVudERlc2NyaXB0b3JzLmlzRW1wdHkoKSkKLQkJCU5hdmlnYXRvclBsdWdpbi5sb2coSVN0YXR1cy5XQVJOSU5HLCAwLCAiVGhlcmUgd2VyZSB1bnJlc29sdmVkIGRlcGVuZGVuY2llcyBmb3IgYWN0aW9uIHByb3ZpZGVyIGV4dGVuc2lvbnMgdG8gYSBDb21tb24gTmF2aWdhdG9yLiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXVucmVzb2x2ZWREZXBlbmRlbnREZXNjcmlwdG9ycy5jbGVhcigpOwotCQkKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhVmlld2VyRGVzY3JpcHRvcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciBkZXNjcmlwdG9yIHRvIHVzZSB3aGVuIGZpbHRlcmluZyBhY3Rpb24gcHJvdmlkZXJzOwotCSAqICAgICAgICAgICAgb25seSBhY3Rpb24gcHJvdmlkZXJzIGJvdW5kIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgd2lsbCBiZQotCSAqICAgICAgICAgICAgcmV0dXJuZWQuCi0JICogQHBhcmFtIGFDb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgYWN0aW9uIGNvbnRleHQgdGhhdCBjb250YWlucyBhIHZhbGlkIHNlbGVjdGlvbi4KLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHZpc2libGUsIGFjdGl2ZSwgYW5kIGVuYWJsZWQgQ29tbW9uQWN0aW9uUHJvdmlkZXJzLgotCSAqICAgICAgICAgU2VlIDxiPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50PC9iPiBmb3IgdGhlCi0JICogICAgICAgICBkZXRhaWxzIG9mIHdoYXQgZWFjaCBvZiB0aGVzZSBhZGplY3RpdmVzIGltcGxpZXMuCi0JICovCi0JcHVibGljIENvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcltdIGZpbmRSZWxldmFudEFjdGlvbkRlc2NyaXB0b3JzKAotCQkJSU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IgYVZpZXdlckRlc2NyaXB0b3IsIEFjdGlvbkNvbnRleHQgYUNvbnRleHQpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IG51bGw7Ci0JCWlmIChhQ29udGV4dC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYUNvbnRleHQKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQllbHNlCi0JCQlzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCQlDb21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3IgYWN0aW9uRGVzY3JpcHRvciA9IG51bGw7Ci0JCUxpc3QgcHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIHByb3ZpZGVySXRyID0gcm9vdERlc2NyaXB0b3JzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHByb3ZpZGVySXRyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWFjdGlvbkRlc2NyaXB0b3IgPSAoQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yKSBwcm92aWRlckl0cgotCQkJCQkubmV4dCgpOwotCQkJYWRkUHJvdmlkZXJJZlJlbGV2YW50KGFWaWV3ZXJEZXNjcmlwdG9yLCBzdHJ1Y3R1cmVkU2VsZWN0aW9uLCBhY3Rpb25EZXNjcmlwdG9yLCBwcm92aWRlcnMpOwotCQl9Ci0JCWlmIChwcm92aWRlcnMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW10pIHByb3ZpZGVycwotCQkJCQkudG9BcnJheShuZXcgQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yW3Byb3ZpZGVycwotCQkJCQkJCS5zaXplKCldKTsKLQkJcmV0dXJuIE5PX0RFU0NSSVBUT1JTOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhVmlld2VyRGVzY3JpcHRvcgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JICogQHBhcmFtIGFjdGlvbkRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gcHJvdmlkZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3ZpZGVySWZSZWxldmFudChJTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvciBhVmlld2VyRGVzY3JpcHRvciwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiwgQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yIGFjdGlvbkRlc2NyaXB0b3IsIExpc3QgcHJvdmlkZXJzKSB7Ci0JCWlmIChpc1Zpc2libGUoYVZpZXdlckRlc2NyaXB0b3IsIGFjdGlvbkRlc2NyaXB0b3IpCi0JCQkJJiYgYWN0aW9uRGVzY3JpcHRvci5pc0VuYWJsZWRGb3Ioc3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCXByb3ZpZGVycy5hZGQoYWN0aW9uRGVzY3JpcHRvcik7Ci0JCQlpZihhY3Rpb25EZXNjcmlwdG9yLmhhc0RlcGVuZGVudERlc2NyaXB0b3JzKCkpIAotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGlvbkRlc2NyaXB0b3IuZGVwZW5kZW50RGVzY3JpcHRvcnMoKTsgaXRlci5oYXNOZXh0KCk7KSAJCQkJCQotCQkJCQlhZGRQcm92aWRlcklmUmVsZXZhbnQoYVZpZXdlckRlc2NyaXB0b3IsIHN0cnVjdHVyZWRTZWxlY3Rpb24sIChDb21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3IpIGl0ZXIubmV4dCgpLCBwcm92aWRlcnMpOwkJCQkJCQkJCQkJCQkJCQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlzaWJsZShJTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvciBhVmlld2VyRGVzY3JpcHRvciwKLQkJCUNvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWlmIChkZXNjcmlwdG9yLmlzTmVzdGVkKCkpIHsKLQkJCXJldHVybiBVdGlsaXRpZXMuaXNBY3RpdmUoYVZpZXdlckRlc2NyaXB0b3IsIGRlc2NyaXB0b3IuZ2V0SWQoKSkKLQkJCQkJJiYgVXRpbGl0aWVzLmlzVmlzaWJsZShhVmlld2VyRGVzY3JpcHRvciwgZGVzY3JpcHRvcgotCQkJCQkJCS5nZXRJZCgpKTsKLQkJfQotCQlyZXR1cm4gYVZpZXdlckRlc2NyaXB0b3IuaXNWaXNpYmxlQWN0aW9uRXh0ZW5zaW9uKGRlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBBY3Rpb25Qcm92aWRlclJlZ2lzdHJ5IGV4dGVuZHMgTmF2aWdhdG9yQ29udGVudFJlZ2lzdHJ5UmVhZGVyIHsKLSAKLQkJIAotCQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCQlzdXBlci5yZWFkUmVnaXN0cnkoKTsKLQkJCWNvbXB1dGVPcmRlcmluZygpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgYW5FbGVtZW50KSB7Ci0JCQlpZiAoVEFHX0FDVElPTl9QUk9WSURFUi5lcXVhbHMoYW5FbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQlhZGRBY3Rpb25EZXNjcmlwdG9yKG5ldyBDb21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3IoCi0JCQkJCQlhbkVsZW1lbnQpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoVEFHX05BVklHQVRPUl9DT05URU5ULmVxdWFscyhhbkVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGFjdGlvblByb3ZpZGVycyA9IGFuRWxlbWVudAotCQkJCQkJLmdldENoaWxkcmVuKFRBR19BQ1RJT05fUFJPVklERVIpOwotCQkJCWlmIChhY3Rpb25Qcm92aWRlcnMubGVuZ3RoID09IDApCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBkZWZhdWx0RW5hYmxlbWVudCA9IG51bGw7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZW5hYmxlbWVudCA9IGFuRWxlbWVudAotCQkJCQkJLmdldENoaWxkcmVuKFRBR19FTkFCTEVNRU5UKTsKLQkJCQlpZiAoZW5hYmxlbWVudC5sZW5ndGggPT0gMCkKLQkJCQkJZW5hYmxlbWVudCA9IGFuRWxlbWVudC5nZXRDaGlsZHJlbihUQUdfVFJJR0dFUl9QT0lOVFMpOwotCQkJCWlmIChlbmFibGVtZW50Lmxlbmd0aCA9PSAxKQotCQkJCQlkZWZhdWx0RW5hYmxlbWVudCA9IGVuYWJsZW1lbnRbMF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25Qcm92aWRlcnMubGVuZ3RoOyBpKyspCi0JCQkJCWFkZEFjdGlvbkRlc2NyaXB0b3IobmV3IENvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcigKLQkJCQkJCQlhY3Rpb25Qcm92aWRlcnNbaV0sIGRlZmF1bHRFbmFibGVtZW50LCBhbkVsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoQVRUX0lEKSwgdHJ1ZSkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLnJlYWRFbGVtZW50KGFuRWxlbWVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2FjdGlvbnMvQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2FjdGlvbnMvQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YmMwMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9hY3Rpb25zL0NvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSUV2YWx1YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuSU5hdmlnYXRvckNvbnRlbnRFeHRQdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5Ta2VsZXRvbkFjdGlvblByb3ZpZGVyOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25BY3Rpb25Qcm92aWRlckRlc2NyaXB0b3IgaW1wbGVtZW50cyBJTmF2aWdhdG9yQ29udGVudEV4dFB0Q29uc3RhbnRzIHsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JRCA9ICJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuYWN0aW9uUHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0gIAotCXByaXZhdGUgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzTmVzdGVkOyAKLQotCXByaXZhdGUgU2V0IGRlcGVuZGVudERlc2NyaXB0b3JzOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZW5hYmxlbWVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEV4cHJlc3Npb24gZW5hYmxlbWVudDsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNMb2FkaW5nRmFpbGVkOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQkKLQlwcml2YXRlIFN0cmluZyBkZXBlbmRzT25JZDsKLQotCXByaXZhdGUgU3RyaW5nIHRvU3RyaW5nOwotCi0JLyoqCi0JICogQHBhcmFtIGFDb25maWdFbGVtZW50Ci0JICogICAgICAgICAgICBBIGNvbmZpZ3VyYXRpb24gZWxlbWVudCB3aXRoIHRoZSBuYW1lICdhY3Rpb25Qcm92aWRlcicgYW5kIGEKLQkgKiAgICAgICAgICAgICdjbGFzcycgYXR0cmlidXRlIGNvbmZvcm1pbmcgdG8gdGhlCi0JICogICAgICAgICAgICB7QGxpbmsgSUNvbW1vbkFjdGlvblByb3ZpZGVyfSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIENvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgYUNvbmZpZ0VsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJQXNzZXJ0LmlzVHJ1ZShUQUdfQUNUSU9OX1BST1ZJREVSLmVxdWFscyhhQ29uZmlnRWxlbWVudC5nZXROYW1lKCkpKTsKLQkJY29uZmlndXJhdGlvbkVsZW1lbnQgPSBhQ29uZmlnRWxlbWVudDsKLQkJaXNOZXN0ZWQgPSBmYWxzZTsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhQ29uZmlnRWxlbWVudAotCSAqICAgICAgICAgICAgQSBjb25maWd1cmF0aW9uIGVsZW1lbnQgd2l0aCB0aGUgbmFtZSAnYWN0aW9uUHJvdmlkZXInIGFuZCBhCi0JICogICAgICAgICAgICAnY2xhc3MnIGF0dHJpYnV0ZSBjb25mb3JtaW5nIHRvIHRoZQotCSAqICAgICAgICAgICAge0BsaW5rIElDb21tb25BY3Rpb25Qcm92aWRlcn0gaW50ZXJmYWNlLgotCSAqIEBwYXJhbSBhbkVuYWJsZW1lbnRFeHByZXNzaW9uCi0JICogICAgICAgICAgICBBIGNvbmZpZ3VyYXRpb24gZWxlbWVudCB3aXRoIHRoZSBuYW1lICdlbmFibGVtZW50JyBvcgotCSAqICAgICAgICAgICAgJ3RyaWdnZXJQb2ludHMnIGFuZCBjb250YWluaW5nIGFuIEVjbGlwc2UgQ29yZSBFeHByZXNzaW9uCi0JICogQHBhcmFtIGFuT3ZlcnJpZGVJZAotCSAqICAgICAgICAgICAgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBkZXNjcmlwdG9yLiBJZHMgY2FuIGJlIHVzZWQgYXMgYQotCSAqICAgICAgICAgICAgZmlsdGVyaW5nIGRldmljZSBmb3IgYWN0aXZpdGllcyBvciB2aWV3ZXIqKipCaW5kaW5ncy4KLQkgKiBAcGFyYW0gbmVzdGVkVW5kZXJOYXZpZ2F0b3JDb250ZW50Ci0JICogICAgICAgICAgICBBIHZhbHVlIG9mIDxiPnRydWU8L2I+IGluZGljYXRlcyB0aGF0IHRoaXMgQ29tbW9uQWN0aW9uUHJvdmlkZXIKLQkgKiAgICAgICAgICAgIHdhcyBkZWNsYXJlZCBhcyBhIG5lc3RlZCAmbHQ7YWN0aW9uUHJvdmlkZXIgLyZndDsgZWxlbWVudCB1bmRlcgotCSAqICAgICAgICAgICAgYSAmbHQ7bmF2aWdhdG9yQ29udGVudCAvJmd0OyBlbGVtZW50LiAKLQkgKi8KLQlwdWJsaWMgQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBhQ29uZmlnRWxlbWVudCwKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBhbkVuYWJsZW1lbnRFeHByZXNzaW9uLCBTdHJpbmcgYW5PdmVycmlkZUlkLAotCQkJYm9vbGVhbiBuZXN0ZWRVbmRlck5hdmlnYXRvckNvbnRlbnQpIHsKLQkJc3VwZXIoKTsKLQkJQXNzZXJ0LmlzVHJ1ZShUQUdfQUNUSU9OX1BST1ZJREVSLmVxdWFscyhhQ29uZmlnRWxlbWVudC5nZXROYW1lKCkpKTsKLQkJQXNzZXJ0LmlzVHJ1ZShUQUdfVFJJR0dFUl9QT0lOVFMuZXF1YWxzKGFuRW5hYmxlbWVudEV4cHJlc3Npb24KLQkJCQkuZ2V0TmFtZSgpKQotCQkJCXx8IFRBR19FTkFCTEVNRU5ULmVxdWFscyhhbkVuYWJsZW1lbnRFeHByZXNzaW9uLmdldE5hbWUoKSkpOwotCQljb25maWd1cmF0aW9uRWxlbWVudCA9IGFDb25maWdFbGVtZW50OwotCQllbmFibGVtZW50RWxlbWVudCA9IGFuRW5hYmxlbWVudEV4cHJlc3Npb247Ci0JCWlkID0gYW5PdmVycmlkZUlkOwotCQlpc05lc3RlZCA9IG5lc3RlZFVuZGVyTmF2aWdhdG9yQ29udGVudDsKLQkJaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCi0JCXRyeSB7Ci0KLQkJCS8vIHdlIHRyeSB0aGUgaWQgYXR0cmlidXRlIGlmIG5vIG92ZXJyaWRlIGlkIHdhcyBzdXBwbGllZC4KLQkJCWlmIChpZCA9PSBudWxsKQotCQkJCWlkID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCQkvLyBpZiB0aGVyZSB3YXMgbm8gaWQgYXR0cmlidXRlLCB1c2UgdGhlIGRlZmF1bHQgaWQuCi0JCQlpZiAoaWQgPT0gbnVsbCkKLQkJCQlpZCA9IERFRkFVTFRfSUQ7Ci0JCQkKLQkJCWRlcGVuZHNPbklkID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERVBFTkRTX09OKTsKLQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWd1cmF0aW9uRWxlbWVudAotCQkJCQkuZ2V0Q2hpbGRyZW4oVEFHX0VOQUJMRU1FTlQpOwotCQkJLy8gaWYgbm8gY2hpbGQgZW5hYmxlbWVudCBpcyBzcGVjaWZpZWQsIGFuZCB3ZSBoYXZlIGFuIG92ZXJyaWRlLCB1c2UKLQkJCS8vIGl0Ci0JCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDAgJiYgZW5hYmxlbWVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWVuYWJsZW1lbnQgPSBFbGVtZW50SGFuZGxlci5nZXREZWZhdWx0KCkuY3JlYXRlKAotCQkJCQkJRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCksIGVuYWJsZW1lbnRFbGVtZW50KTsKLQkJCQkvLyBvdGhlcndpc2UgdGhlIGNoaWxkIGVuYWJsZW1lbnQgdGFrZXMgcHJpb3JpdHkKLQkJCX0gZWxzZSBpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDEpIHsKLQkJCQllbmFibGVtZW50ID0gRWxlbWVudEhhbmRsZXIuZ2V0RGVmYXVsdCgpLmNyZWF0ZSgKLQkJCQkJCUV4cHJlc3Npb25Db252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLCBjaGlsZHJlblswXSk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJJbmNvcnJlY3QgbnVtYmVyIG9mIGV4cHJlc3Npb25zOiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJVEFHX0VOQUJMRU1FTlQKLQkJCQkJCSsgIiBpbiBuYXZpZ2F0b3IgZXh0ZW5zaW9uOiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkKLQkJCQkJCQkJLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBpbnN0YW50aWF0ZWQgQ29tbW9uQWN0aW9uUHJvdmlkZXIgZm9yIHRoaXMgZGVzY3JpcHRvciBhcwotCSAqICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIEFUVF9DTEFTUyBhdHRyaWJ1dGUgb3IKLQkgKiAgICAgICAgIHtAbGluayBTa2VsZXRvbkFjdGlvblByb3ZpZGVyfSBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIGxvYWRpbmcKLQkgKiAgICAgICAgIHRoZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uQWN0aW9uUHJvdmlkZXIgY3JlYXRlQWN0aW9uUHJvdmlkZXIoKSB7Ci0JCWlmIChoYXNMb2FkaW5nRmFpbGVkKQotCQkJcmV0dXJuIFNrZWxldG9uQWN0aW9uUHJvdmlkZXIuSU5TVEFOQ0U7Ci0JCUNvbW1vbkFjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXByb3ZpZGVyID0gKENvbW1vbkFjdGlvblByb3ZpZGVyKSBjb25maWd1cmF0aW9uRWxlbWVudAotCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJTmF2aWdhdG9yUGx1Z2luLmxvZygiVW5hYmxlIHRvIGNyZWF0ZSBuYXZpZ2F0b3IgZXh0ZW5zaW9uOiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRDbGFzc05hbWUoKSwgZXhjZXB0aW9uLmdldFN0YXR1cygpKTsKLQkJCWhhc0xvYWRpbmdGYWlsZWQgPSB0cnVlOwotCQkJcHJvdmlkZXIgPSBTa2VsZXRvbkFjdGlvblByb3ZpZGVyLklOU1RBTkNFOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTmF2aWdhdG9yUGx1Z2luLmxvZygiVW5hYmxlIHRvIGNyZWF0ZSBuYXZpZ2F0b3IgZXh0ZW5zaW9uOiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRDbGFzc05hbWUoKSwgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlOYXZpZ2F0b3JQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJaGFzTG9hZGluZ0ZhaWxlZCA9IHRydWU7Ci0JCQlwcm92aWRlciA9IFNrZWxldG9uQWN0aW9uUHJvdmlkZXIuSU5TVEFOQ0U7Ci0JCX0KLQotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIHRoaXMgY29udGVudCBleHRlbnNpb24gaXMgZW5hYmxlZCBmb3IgdGhlIGdpdmVuIHNlbGVjdGlvbi4KLQkgKiBUaGUgY29udGVudCBleHRlbnNpb24gaXMgZW5hYmxlZCBmb3IgdGhlIHNlbGVjdGlvbiBpZiBhbmQgb25seSBpZiBpdCBpcwotCSAqIGVuYWJsZWQgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgc2VsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBhU3RydWN0dXJlZFNlbGVjdGlvbgotCSAqICAgICAgICAgICAgVGhlIHNlbGVjdGlvbiBmcm9tIHRoZSB2aWV3ZXIKLQkgKiBAcmV0dXJuIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGV4dGVuc2lvbiBpcyBlbmFibGVkIGZvciBlYWNoIGVsZW1lbnQgaW4KLQkgKiAgICAgICAgIHRoZSBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkRm9yKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCWlmIChlbmFibGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQgPSBudWxsOwotCi0JCUl0ZXJhdG9yIGVsZW1lbnRzID0gYVN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJY29udGV4dCA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBlbGVtZW50cy5uZXh0KCkpOwotCQkJdHJ5IHsKLQkJCQlpZiAoZW5hYmxlbWVudC5ldmFsdWF0ZShjb250ZXh0KSA9PSBFdmFsdWF0aW9uUmVzdWx0LkZBTFNFCi0JCQkJCQl8fCBlbmFibGVtZW50LmV2YWx1YXRlKGNvbnRleHQpID09IEV2YWx1YXRpb25SZXN1bHQuTk9UX0xPQURFRCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiB0aGlzIGNvbnRlbnQgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBhbkVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBldmFsdWF0aW9uLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEZvcihPYmplY3QgYW5FbGVtZW50KSB7Ci0JCWlmIChlbmFibGVtZW50ID09IG51bGwgfHwgYW5FbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoZW5hYmxlbWVudC5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgYW5FbGVtZW50KSkgPT0gRXZhbHVhdGlvblJlc3VsdC5UUlVFKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlOYXZpZ2F0b3JQbHVnaW4ubG9nKElTdGF0dXMuRVJST1IsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBBbiBpZGVudGlmaWVyIGZvciB0aGlzIElDb21tb25BY3Rpb25Qcm92aWRlci4gRGVmYXVsdHMgdG8KLQkgKiAgICAgICAgICdvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuYWN0aW9uUHJvdmlkZXInLiBNYXkgbm90IGJlIHVuaXF1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUcnVlIGlmIHRoaXMgaXMgYSBuZXN0ZWQgJmx0O2FjdGlvblByb3ZpZGVyIC8mZ3Q7IGVsZW1lbnQuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkKCkgewotCQlyZXR1cm4gaXNOZXN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSAnZGVwZW5kc09uJyBhdHRyaWJ1dGUgb2YgdGhlICZsdDthY3Rpb25Qcm92aWRlciAvJmd0OyBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVwZW5kc09uSWQoKSB7Ci0JCXJldHVybiBkZXBlbmRzT25JZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCi0JCWlmKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIENvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcikgewotCQkJQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yIG90aGVyID0gKENvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvcikgb2JqOwotCQkJcmV0dXJuIGdldElkKCkuZXF1YWxzKG90aGVyLmdldElkKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldElkKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXBlbmRlbnREZXNjcmlwdG9yKENvbW1vbkFjdGlvblByb3ZpZGVyRGVzY3JpcHRvciBkZXBlbmRlbnREZXNjcmlwdG9yKSB7Ci0JCUFzc2VydC5pc1RydWUodGhpcyAhPSBkZXBlbmRlbnREZXNjcmlwdG9yKTsKLQkJaWYoZGVwZW5kZW50RGVzY3JpcHRvcnMgPT0gbnVsbCkKLQkJCWRlcGVuZGVudERlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQoKTsKLQkJZGVwZW5kZW50RGVzY3JpcHRvcnMuYWRkKGRlcGVuZGVudERlc2NyaXB0b3IpOwkJCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRGVwZW5kZW50RGVzY3JpcHRvcnMoKSB7IAotCQlyZXR1cm4gZGVwZW5kZW50RGVzY3JpcHRvcnMgIT0gbnVsbCAmJiAhZGVwZW5kZW50RGVzY3JpcHRvcnMuaXNFbXB0eSgpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvciBkZXBlbmRlbnREZXNjcmlwdG9ycygpIHsgCi0JCXJldHVybiBkZXBlbmRlbnREZXNjcmlwdG9ycy5pdGVyYXRvcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZih0b1N0cmluZyA9PSBudWxsKQotCQkJdG9TdHJpbmcgPSAiQ29tbW9uQWN0aW9uUHJvdmlkZXJEZXNjcmlwdG9yWyIrZ2V0SWQoKSsiLCBkZXBlbmRzT249IitnZXREZXBlbmRzT25JZCgpKyJdIjsgICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHRvU3RyaW5nOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9hY3Rpb25zL0xpbmtFZGl0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvYWN0aW9ucy9MaW5rRWRpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZWZlZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9hY3Rpb25zL0xpbmtFZGl0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUxpbmtIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuTGlua0hlbHBlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLQotLyoqCi0gKiBUaGlzIGFjdGlvbiBsaW5rcyB0aGUgYWN0aXZhdGUgZWRpdG9yIHdpdGggdGhlIE5hdmlnYXRvciBzZWxlY3Rpb24uCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rRWRpdG9yQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSUFjdGlvbiwgSVByb3BlcnR5TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lcjsKLQlwcml2YXRlIGZpbmFsIENvbW1vblZpZXdlciBjb21tb25WaWV3ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBDb21tb25OYXZpZ2F0b3IgY29tbW9uTmF2aWdhdG9yOwotCXByaXZhdGUgTGlua0hlbHBlclJlZ2lzdHJ5IGxpbmtIZWxwZXJSZWdpc3RyeTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIExpbmtFZGl0b3JBY3Rpb24gZm9yIHRoZSBnaXZlbiBuYXZpZ2F0b3IgYW5kIHZpZXdlci4gCi0JICogQHBhcmFtIGFOYXZpZ2F0b3IgVGhlIG5hdmlnYXRvciB3aGljaCBkZWZpbmVzIHdoZXRoZXIgbGlua2luZyBpcyBlbmFibGVkIGFuZCBpbXBsZW1lbnRzIHtAbGluayBJU2V0U2VsZWN0aW9uVGFyZ2V0fS4KLQkgKiBAcGFyYW0gYVZpZXdlciBUaGUgY29tbW9uIHZpZXdlciBpbnN0YW5jZSB3aXRoIGEge0BsaW5rIElOYXZpZ2F0b3JDb250ZW50U2VydmljZX0uCi0JICovCi0JcHVibGljIExpbmtFZGl0b3JBY3Rpb24oQ29tbW9uTmF2aWdhdG9yIGFOYXZpZ2F0b3IsIENvbW1vblZpZXdlciBhVmlld2VyKSB7Ci0JCXN1cGVyKENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLkxpbmtFZGl0b3JBY3Rpb25EZWxlZ2F0ZV8wKTsKLQkJc2V0VG9vbFRpcFRleHQoQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuTGlua0VkaXRvckFjdGlvbkRlbGVnYXRlXzEpOyAKLQkJY29tbW9uTmF2aWdhdG9yID0gYU5hdmlnYXRvcjsKLQkJY29tbW9uVmlld2VyID0gYVZpZXdlcjsKLQkJaW5pdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlRWRpdG9yKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGNvbW1vblZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJYWN0aXZhdGVFZGl0b3IoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgYWN0aXZlIGVkaXRvciBiYXNlZCBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIE5hdmlnYXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUVkaXRvcihmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCWlmIChhU2VsZWN0aW9uID09IG51bGwgfHwgYVNlbGVjdGlvbi5zaXplKCkgIT0gMSkKLQkJCXJldHVybjsKLQotCQlmaW5hbCBSdW5uYWJsZSBhY3RpdmF0ZUVkaXRvciA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlMaW5rSGVscGVyW10gaGVscGVycyA9IGxpbmtIZWxwZXJSZWdpc3RyeS5nZXRMaW5rSGVscGVyc0ZvcihhU2VsZWN0aW9uKTsKLQkJCQlpZiAoaGVscGVycy5sZW5ndGggPiAwKQotCQkJCQloZWxwZXJzWzBdLmFjdGl2YXRlRWRpdG9yKGNvbW1vbk5hdmlnYXRvci5nZXRTaXRlKCkuZ2V0UGFnZSgpLCBhU2VsZWN0aW9uKTsKLQkJCX0KLQkJfTsKLQotCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkgewotCQkJYWN0aXZhdGVFZGl0b3IucnVuKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBDcmVhdGUgYW5kIHNjaGVkdWxlIGEgVUkgSm9iIHRvIGFjdGl2YXRlIHRoZSBlZGl0b3IgaW4gYSB2YWxpZCBEaXNwbGF5IHRocmVhZCAqLwotCQkJbmV3IFVJSm9iKENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLkxpbmtfV2l0aF9FZGl0b3JfSm9iXykgewotCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCWFjdGl2YXRlRWRpdG9yLnJ1bigpOwotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQl9LnNjaGVkdWxlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJcGFydExpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpCi0JCQkJCWxpbmtUb0VkaXRvcigoSUVkaXRvclBhcnQpIHBhcnQpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KQotCQkJCQlsaW5rVG9FZGl0b3IoKElFZGl0b3JQYXJ0KSBwYXJ0KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkJIAotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCX0KLQkJfTsKLQotCQl1cGRhdGVMaW5raW5nRW5hYmxlZChjb21tb25OYXZpZ2F0b3IuaXNMaW5raW5nRW5hYmxlZCgpKTsKLQotCQljb21tb25OYXZpZ2F0b3IuYWRkUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQkJIAotCQkKLQkJbGlua0hlbHBlclJlZ2lzdHJ5ID0gbmV3IExpbmtIZWxwZXJSZWdpc3RyeShjb21tb25WaWV3ZXIuZ2V0TmF2aWdhdG9yQ29udGVudFNlcnZpY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogTGluayB0aGUgTmF2aWdhdG9yIHRvIHRoZSBjdXJyZW50IG9wZW4gZWRpdG9yLiBEbyB0aGlzIGJ5IHVwZGF0aW5nIHRoZSBOYXZpZ2F0b3IncyBzZWxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxpbmtUb0VkaXRvcihJRWRpdG9yUGFydCBhbkVkaXRvcikgewotCQlpZiAoYW5FZGl0b3IgIT0gbnVsbCkgewotCi0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBhbkVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJSUxpbmtIZWxwZXJbXSBoZWxwZXJzID0gbGlua0hlbHBlclJlZ2lzdHJ5LmdldExpbmtIZWxwZXJzRm9yKGlucHV0KTsKLQotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1NlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaGVscGVycy5sZW5ndGg7IGkrKykgewotCQkJCXNlbGVjdGlvbiA9IGhlbHBlcnNbaV0uZmluZFNlbGVjdGlvbihpbnB1dCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJCQluZXdTZWxlY3Rpb24gPSBtZXJnZVNlbGVjdGlvbihuZXdTZWxlY3Rpb24sIHNlbGVjdGlvbik7Ci0JCQl9Ci0KLQkJCWNvbW1vbk5hdmlnYXRvci5zZWxlY3RSZXZlYWwobmV3U2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbWVyZ2VTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gYUJhc2UsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb25Ub0FwcGVuZCkgewotCQlpZiAoYUJhc2UgPT0gbnVsbCB8fCBhQmFzZS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gKGFTZWxlY3Rpb25Ub0FwcGVuZCAhPSBudWxsKSA/IGFTZWxlY3Rpb25Ub0FwcGVuZCA6IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCWVsc2UgaWYgKGFTZWxlY3Rpb25Ub0FwcGVuZCA9PSBudWxsIHx8IGFTZWxlY3Rpb25Ub0FwcGVuZC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gYUJhc2U7Ci0JCWVsc2UgewotCQkJTGlzdCBuZXdJdGVtcyA9IG5ldyBBcnJheUxpc3QoYUJhc2UudG9MaXN0KCkpOwotCQkJbmV3SXRlbXMuYWRkQWxsKGFTZWxlY3Rpb25Ub0FwcGVuZC50b0xpc3QoKSk7Ci0JCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3SXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJY29tbW9uTmF2aWdhdG9yLnNldExpbmtpbmdFbmFibGVkKCFjb21tb25OYXZpZ2F0b3IuaXNMaW5raW5nRW5hYmxlZCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChjb21tb25OYXZpZ2F0b3IuaXNMaW5raW5nRW5hYmxlZCgpKQotCQkJYWN0aXZhdGVFZGl0b3IoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlZChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBhU291cmNlLCBpbnQgYVByb3BlcnR5SWQpIHsKLQkJc3dpdGNoIChhUHJvcGVydHlJZCkgewotCQkJY2FzZSBDb21tb25OYXZpZ2F0b3IuSVNfTElOS0lOR19FTkFCTEVEX1BST1BFUlRZIDoKLQkJCQl1cGRhdGVMaW5raW5nRW5hYmxlZCgoKENvbW1vbk5hdmlnYXRvcikgYVNvdXJjZSkuaXNMaW5raW5nRW5hYmxlZCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b0VuYWJsZUxpbmtpbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlTGlua2luZ0VuYWJsZWQoYm9vbGVhbiB0b0VuYWJsZUxpbmtpbmcpIHsKLQkJc2V0Q2hlY2tlZCh0b0VuYWJsZUxpbmtpbmcpOwotCi0JCWlmICh0b0VuYWJsZUxpbmtpbmcpIHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGNvbW1vbk5hdmlnYXRvci5nZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJbGlua1RvRWRpdG9yKGVkaXRvcik7Ci0KLQkJCWNvbW1vblZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQljb21tb25OYXZpZ2F0b3IuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJfSBlbHNlIHsKLQkJCWNvbW1vblZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQljb21tb25OYXZpZ2F0b3IuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQ29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiNTU5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9Db21tb25Ecm9wSGFuZGxlclNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uRHJvcEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5Db21tb25OYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLlJlZ2lzdHJ5UmVhZGVyOwotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25Ecm9wSGFuZGxlclNlcnZpY2UgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEcm9wSGFuZGxlckRlc2NyaXB0b3JbXSBOT19EUk9QX0hBTkRMRVJfREVTQ1JJUFRPUlMgPSBuZXcgRHJvcEhhbmRsZXJEZXNjcmlwdG9yWzBdOwotCi0JcHJpdmF0ZSBNYXAgZGVzY3JpcHRvcnM7Ci0KLQlwcml2YXRlIE1hcCBhY3Rpb25zOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIHJlZ2lzdHJpZXM7Ci0KLQlwcml2YXRlIFN0cmluZyB2aWV3ZXJJZDsKLQotCXByb3RlY3RlZCBDb21tb25Ecm9wSGFuZGxlclNlcnZpY2UoU3RyaW5nIHZpZXdlcklkKSB7Ci0JCXN1cGVyKE5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQsIERyb3BIYW5kbGVyRGVzY3JpcHRvci5FeHRlbnNpb25Qb2ludEVsZW1lbnRzLkRST1BfSEFORExFUik7Ci0JCXRoaXMudmlld2VySWQgPSB2aWV3ZXJJZDsKLQl9Ci0KLQlwdWJsaWMgRHJvcEhhbmRsZXJEZXNjcmlwdG9yW10gZ2V0RHJvcEhhbmRsZXJzRW5hYmxlZEZvcihPYmplY3Qgc291cmNlLCBPYmplY3QgdGFyZ2V0KSB7Ci0JCXRyeSB7Ci0JCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlEcm9wSGFuZGxlckRlc2NyaXB0b3IgZGVzY3IgPSBudWxsOwotCQkJZm9yIChJdGVyYXRvciBkZXNjcmlwdG9ySXRlcmF0b3IgPSBnZXREZXNjcmlwdG9ycygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJZGVzY3IgPSAoRHJvcEhhbmRsZXJEZXNjcmlwdG9yKSBkZXNjcmlwdG9ySXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChkZXNjci5pc0Ryb3BFbmFibGVkRm9yKHRhcmdldCkgJiYgKHNvdXJjZSA9PSBudWxsIHx8IGRlc2NyLmlzRHJhZ0VuYWJsZWRGb3Ioc291cmNlKSkpCi0JCQkJCXJlc3VsdHMuYWRkKGRlc2NyKTsKLQkJCX0KLQkJCWlmIChyZXN1bHRzLnNpemUoKSA+IDApCi0JCQkJcmV0dXJuIChEcm9wSGFuZGxlckRlc2NyaXB0b3JbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBEcm9wSGFuZGxlckRlc2NyaXB0b3JbcmVzdWx0cy5zaXplKCldKTsKLQkJCXJldHVybiBOT19EUk9QX0hBTkRMRVJfREVTQ1JJUFRPUlM7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlOYXZpZ2F0b3JQbHVnaW4ubG9nKENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLkNvbW1vbkRyb3BIYW5kbGVyU2VydmljZV8wICsgdCk7IAotCQkJcmV0dXJuIE5PX0RST1BfSEFORExFUl9ERVNDUklQVE9SUzsKLQkJfQotCX0KLQotCXB1YmxpYyBEcm9wSGFuZGxlckRlc2NyaXB0b3JbXSBnZXREcm9wSGFuZGxlcnNCeVNlcmlhbGl6ZXJJZChTdHJpbmcgaWQpIHsKLQkJdHJ5IHsKLQkJCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCURyb3BIYW5kbGVyRGVzY3JpcHRvciBkZXNjciA9IG51bGw7Ci0JCQlTZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3Igc2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yID0gbnVsbDsKLQkJCWZvciAoSXRlcmF0b3IgZGVzY3JpcHRvckl0ZXJhdG9yID0gZ2V0RGVzY3JpcHRvcnMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBkZXNjcmlwdG9ySXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCWRlc2NyID0gKERyb3BIYW5kbGVyRGVzY3JpcHRvcikgZGVzY3JpcHRvckl0ZXJhdG9yLm5leHQoKTsKLQkJCQlzZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3IgPSBkZXNjci5nZXRTZXJpYWxpemVyc0Rlc2NyaXB0b3IoKTsKLQkJCQlpZiAoc2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yICE9IG51bGwgJiYgc2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yLmdldFNlcmlhbGl6ZXJCeUlkKGlkKSAhPSBudWxsKQotCQkJCQlyZXN1bHRzLmFkZChkZXNjcik7Ci0JCQl9Ci0JCQlpZiAocmVzdWx0cy5zaXplKCkgPiAwKQotCQkJCXJldHVybiAoRHJvcEhhbmRsZXJEZXNjcmlwdG9yW10pIHJlc3VsdHMudG9BcnJheShuZXcgRHJvcEhhbmRsZXJEZXNjcmlwdG9yW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JCQlyZXR1cm4gTk9fRFJPUF9IQU5ETEVSX0RFU0NSSVBUT1JTOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5Db21tb25Ecm9wSGFuZGxlclNlcnZpY2VfMCArIHQpOyAKLQkJCXJldHVybiBOT19EUk9QX0hBTkRMRVJfREVTQ1JJUFRPUlM7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBTZXJpYWxpemVyRGVzY3JpcHRvciBnZXRTZXJpYWxpemVyQnlJZChTdHJpbmcgaWQpIHsKLQkJRHJvcEhhbmRsZXJEZXNjcmlwdG9yIGRlc2NyID0gbnVsbDsKLQkJU2VyaWFsaXplckRlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQkJU2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yIHNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvciA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgZGVzY3JpcHRvckl0ZXJhdG9yID0gZ2V0RGVzY3JpcHRvcnMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBkZXNjcmlwdG9ySXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJZGVzY3IgPSAoRHJvcEhhbmRsZXJEZXNjcmlwdG9yKSBkZXNjcmlwdG9ySXRlcmF0b3IubmV4dCgpOwotCQkJc2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yID0gZGVzY3IuZ2V0U2VyaWFsaXplcnNEZXNjcmlwdG9yKCk7Ci0JCQlpZiAoc2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yICE9IG51bGwgJiYgKHJlc3VsdCA9IHNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvci5nZXRTZXJpYWxpemVyQnlJZChpZCkpICE9IG51bGwpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1vbkRyb3BBY3Rpb25EZWxlZ2F0ZSBnZXRBY3Rpb25Gb3JTZXJpYWxpemVySWQoU3RyaW5nIHNlcmlhbGl6ZXJJZCkgewotCi0JCURyb3BIYW5kbGVyRGVzY3JpcHRvciBkZXNjciA9IG51bGw7Ci0JCVNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvciBzZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3IgPSBudWxsOwotCQlJQ29tbW9uRHJvcEFjdGlvbkRlbGVnYXRlIGFjdGlvbiA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgZGVzY3JpcHRvckl0ZXJhdG9yID0gZ2V0RGVzY3JpcHRvcnMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBkZXNjcmlwdG9ySXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJZGVzY3IgPSAoRHJvcEhhbmRsZXJEZXNjcmlwdG9yKSBkZXNjcmlwdG9ySXRlcmF0b3IubmV4dCgpOwotCQkJc2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yID0gZGVzY3IuZ2V0U2VyaWFsaXplcnNEZXNjcmlwdG9yKCk7Ci0JCQlpZiAoc2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yICE9IG51bGwgJiYgc2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yLmdldFNlcmlhbGl6ZXJCeUlkKHNlcmlhbGl6ZXJJZCkgIT0gbnVsbCkgewotCQkJCWFjdGlvbiA9IGRlc2NyLmNyZWF0ZUFjdGlvbigpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JcHVibGljIFNlcmlhbGl6ZXJEZXNjcmlwdG9yW10gZ2V0U2VyaWFsaXplcnNFbmFibGVkRm9yKE9iamVjdCBzb3VyY2UpIHsKLQkJU2VyaWFsaXplckRlc2NyaXB0b3JbXSBzZXJpYWxpemVycyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBkZXNjcmlwdG9ySXRlcmF0b3IgPSBnZXREZXNjcmlwdG9ycygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQlEcm9wSGFuZGxlckRlc2NyaXB0b3IgZGVzY3IgPSBudWxsOwotCQkJU2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yIHNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvciA9IG51bGw7Ci0JCQl3aGlsZSAoZGVzY3JpcHRvckl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWRlc2NyID0gKERyb3BIYW5kbGVyRGVzY3JpcHRvcikgZGVzY3JpcHRvckl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZGVzY3IuaXNEcmFnRW5hYmxlZEZvcihzb3VyY2UpKSB7Ci0JCQkJCXNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvciA9IGRlc2NyLmdldFNlcmlhbGl6ZXJzRGVzY3JpcHRvcigpOwotCQkJCQlpZiAoc2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yICE9IG51bGwpCi0JCQkJCQlyZXN1bHRzLmFkZEFsbChBcnJheXMuYXNMaXN0KHNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvci5nZXRTZXJpYWxpemVyc0VuYWJsZWRGb3Ioc291cmNlKSkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyZXN1bHRzLnNpemUoKSA+IDApIHsKLQkJCQlyZXN1bHRzLnRvQXJyYXkoKHNlcmlhbGl6ZXJzID0gbmV3IFNlcmlhbGl6ZXJEZXNjcmlwdG9yW3Jlc3VsdHMuc2l6ZSgpXSkpOwotCQkJfSBlbHNlCi0JCQkJc2VyaWFsaXplcnMgPSBuZXcgU2VyaWFsaXplckRlc2NyaXB0b3JbMF07Ci0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCU5hdmlnYXRvclBsdWdpbi5sb2coQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuQ29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlXzAgKyB0KTsKLQkJCXNlcmlhbGl6ZXJzID0gbmV3IFNlcmlhbGl6ZXJEZXNjcmlwdG9yWzBdOwotCQl9Ci0JCXJldHVybiBzZXJpYWxpemVyczsKLQl9Ci0KLQlwdWJsaWMgSURyb3BWYWxpZGF0b3IgZ2V0RHJvcFZhbGlkYXRvcihDb21tb25WaWV3ZXIgYVZpZXdlciwgRHJvcEhhbmRsZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ29tbW9uRHJvcEFjdGlvbkRlbGVnYXRlIGFjdGlvbiA9IG51bGw7Ci0JCUlEcm9wVmFsaWRhdG9yIGRyb3BWYWxpZGF0b3IgPSBkZXNjcmlwdG9yLmdldERyb3BWYWxpZGF0b3IoKTsKLQkJaWYgKGRyb3BWYWxpZGF0b3IgPT0gbnVsbCAmJiAoYWN0aW9uID0gZ2V0RHJvcEFjdGlvbkRlbGVnYXRlKGFWaWV3ZXIsIGRlc2NyaXB0b3IpKSBpbnN0YW5jZW9mIElEcm9wVmFsaWRhdG9yKQotCQkJZHJvcFZhbGlkYXRvciA9IChJRHJvcFZhbGlkYXRvcikgYWN0aW9uOwotCQlyZXR1cm4gZHJvcFZhbGlkYXRvcjsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1vbkRyb3BBY3Rpb25EZWxlZ2F0ZSBnZXREcm9wQWN0aW9uRGVsZWdhdGUoQ29tbW9uVmlld2VyIGFWaWV3ZXIsIERyb3BIYW5kbGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCUFzc2VydC5pc1RydWUodGhpcy52aWV3ZXJJZC5lcXVhbHMoYVZpZXdlci5nZXROYXZpZ2F0b3JDb250ZW50U2VydmljZSgpLmdldFZpZXdlcklkKCkpKTsKLQkJSUNvbW1vbkRyb3BBY3Rpb25EZWxlZ2F0ZSBhY3Rpb24gPSAoSUNvbW1vbkRyb3BBY3Rpb25EZWxlZ2F0ZSkgZ2V0QWN0aW9ucygpLmdldChkZXNjcmlwdG9yLmdldElkKCkpOwotCQlpZiAoYWN0aW9uID09IG51bGwpIHsKLQkJCWlmICgoYWN0aW9uID0gZGVzY3JpcHRvci5jcmVhdGVBY3Rpb24oKSkgIT0gbnVsbCkgewotCQkJCWFjdGlvbi5pbml0KGFWaWV3ZXIpOwotCQkJCWdldEFjdGlvbnMoKS5wdXQoZGVzY3JpcHRvci5nZXRJZCgpLCBhY3Rpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChEcm9wSGFuZGxlckRlc2NyaXB0b3IuRXh0ZW5zaW9uUG9pbnRFbGVtZW50cy5EUk9QX0hBTkRMRVIuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJYWRkRGVzY3JpcHRvcihuZXcgRHJvcEhhbmRsZXJEZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdG9yKERyb3BIYW5kbGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWdldERlc2NyaXB0b3JzKCkucHV0KGRlc2NyaXB0b3IuZ2V0SWQoKSwgZGVzY3JpcHRvcik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9ycy4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldERlc2NyaXB0b3JzKCkgewotCQlpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbCkKLQkJCWRlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldEFjdGlvbnMoKSB7Ci0JCWlmIChhY3Rpb25zID09IG51bGwpCi0JCQlhY3Rpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByZWdpc3RyaWVzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGdldFJlZ2lzdHJpZXMoKSB7Ci0JCWlmIChyZWdpc3RyaWVzID09IG51bGwpCi0JCQlyZWdpc3RyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIHJlZ2lzdHJpZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21tb25Ecm9wSGFuZGxlclNlcnZpY2UgZ2V0SW5zdGFuY2UoU3RyaW5nIHZpZXdlcklkKSB7Ci0JCUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZSBpbnN0YW5jZSA9IChDb21tb25Ecm9wSGFuZGxlclNlcnZpY2UpIGdldFJlZ2lzdHJpZXMoKS5nZXQodmlld2VySWQpOwotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZ2V0UmVnaXN0cmllcygpLnB1dCh2aWV3ZXJJZCwgKGluc3RhbmNlID0gbmV3IENvbW1vbkRyb3BIYW5kbGVyU2VydmljZSh2aWV3ZXJJZCkpKTsKLQkJCWluc3RhbmNlLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0NvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9Db21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDg3Yjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0NvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGx1Z2luVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QbHVnaW5UcmFuc2ZlckRhdGE7Ci0KLS8qKgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqICAKLSAqLwotLy8gRGVwZW5kZW5jaWVzIHRvIFJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlciBhbmQgRmlsZVRyYW5zZmVyRHJhZ0FkYXB0ZXIgaGF2ZQotLy8gYmVlbiByZW1vdmVkIHRvIHN1cHBvcnQgUkNQIGFwcGxpY2F0aW9ucy4gVGhlc2Ugd2lsbCBiZSByZXZpc3RlZCBmb3IgTTUuICAKLXB1YmxpYyBjbGFzcyBDb21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlciBleHRlbmRzIERyYWdTb3VyY2VBZGFwdGVyIHsKLQotLy8JcHJpdmF0ZSBSZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIgZGVsZWdhdGVSZXNvdXJjZURyYWdBZGFwdGVyOwotLy8KLS8vCXByaXZhdGUgRmlsZVRyYW5zZmVyRHJhZ0FkYXB0ZXIgZGVsZWdhdGVGaWxlRHJhZ0FkYXB0ZXI7Ci0KLQlwcml2YXRlIElTZXJpYWxpemVyIHNlcmlhbGl6ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIENvbW1vblZpZXdlciBjb21tb25WaWV3ZXI7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIENvbW1vbk5hdmlnYXRvckRyYWdBZGFwdGVyKENvbW1vblZpZXdlciBhVmlld2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbW1vblZpZXdlciA9IGFWaWV3ZXI7Ci0vLwkJdGhpcy5kZWxlZ2F0ZVJlc291cmNlRHJhZ0FkYXB0ZXIgPSBuZXcgUmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyKGNvbW1vblZpZXdlcik7Ci0vLwkJdGhpcy5kZWxlZ2F0ZUZpbGVEcmFnQWRhcHRlciA9IG5ldyBGaWxlVHJhbnNmZXJEcmFnQWRhcHRlcihjb21tb25WaWV3ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlQWRhcHRlciNkcmFnU3RhcnQob3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQl0cnkgewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBjb21tb25WaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlldmVudC5kb2l0ID0gIXNlbGVjdGlvbi5pc0VtcHR5KCk7Ci0JCQlMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlOYXZpZ2F0b3JQbHVnaW4ubG9nKCJDb21tb25OYXZpZ2F0b3JEcmFnQWRhcHRlci5kcmFnU3RhcnQoKToiICsgZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSsiLmRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQ9XCIiK2V2ZW50KyJcIik7Ci0JCS8vIHdpZGdldCA9ICIgKyBldmVudC53aWRnZXQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlQWRhcHRlciNkcmFnU2V0RGF0YShvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQlldmVudC5kYXRhID0gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmdldFNlbGVjdGlvbigpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpKyIuZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50Ci0JCQkvLyBldmVudD1cIiIrZXZlbnQrIlwiKTogU2V0dGluZyBMb2NhbFNlbGVjdGlvblRyYW5zZmVyIik7Ci0JCX0gZWxzZSBpZiAoUGx1Z2luVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWJ5dGUgZGF0YVtdID0gZ2V0U2VyaWFsaXplcigpLnRvQnl0ZUFycmF5KHNlbGVjdGlvbik7Ci0JCQlldmVudC5kYXRhID0gbmV3IFBsdWdpblRyYW5zZmVyRGF0YSgib3JnLmVjbGlwc2UubmF2aWdhdG9yLnVpLmRuZC5QbHVnaW5Ecm9wQWN0aW9uIiwgZGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSsiLmRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudAotCQkJLy8gZXZlbnQ9XCIiK2V2ZW50KyJcIik6IFNldHRpbmcgUGx1Z2luVHJhbnNmZXIiKTsKLS8vIFJlbW92ZWQgdG8gYWxsb3cgUkNQIGludGVncmF0aW9uCQkJCi0vLwkJfSBlbHNlIGlmIChSZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotLy8JCQl0aGlzLmRlbGVnYXRlUmVzb3VyY2VEcmFnQWRhcHRlci5kcmFnU2V0RGF0YShldmVudCk7Ci0vLwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSsiLmRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudAotLy8JCQkvLyBldmVudD1cIiIrZXZlbnQrIlwiKTogU2V0dGluZyBSZXNvdXJjZVRyYW5zZmVyIik7Ci0vLwkJfSBlbHNlIGlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0vLwkJCXRoaXMuZGVsZWdhdGVGaWxlRHJhZ0FkYXB0ZXIuZHJhZ1NldERhdGEoZXZlbnQpOwotLy8JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIi5kcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQKLS8vCQkJLy8gZXZlbnQ9XCIiK2V2ZW50KyJcIik6IFNldHRpbmcgRmlsZVRyYW5zZmVyIik7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElTZXJpYWxpemVyIGdldFNlcmlhbGl6ZXIoKSB7Ci0JCWlmIChzZXJpYWxpemVyID09IG51bGwpCi0JCQlzZXJpYWxpemVyID0gbmV3IE5hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIoY29tbW9uVmlld2VyLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCkuZ2V0Vmlld2VySWQoKSk7Ci0JCXJldHVybiBzZXJpYWxpemVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlQWRhcHRlciNkcmFnRmluaXNoZWQob3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQlMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkuc2V0U2VsZWN0aW9uKG51bGwpOwotCQkvKiB0aGlzLmRlbGVnYXRlUmVzb3VyY2VEcmFnQWRhcHRlci5kcmFnRmluaXNoZWQoZXZlbnQpOyAqLwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQ29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0NvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZjQ2NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQ29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Ecm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGx1Z2luRHJvcEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QbHVnaW5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBsdWdpblRyYW5zZmVyRGF0YTsKLQotLyoqIAotICogIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIENvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyIGV4dGVuZHMgUGx1Z2luRHJvcEFkYXB0ZXIgaW1wbGVtZW50cyBJQ29tbW9uRHJvcEFkYXB0ZXIgewotCi0JcHJpdmF0ZSBJU2VyaWFsaXplciBzZXJpYWxpemVyOwotCi0JcHJpdmF0ZSBmaW5hbCBDb21tb25WaWV3ZXIgY29tbW9uVmlld2VyOwotCi0JLyoqCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBDb21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcihDb21tb25WaWV3ZXIgYVZpZXdlcikgewotCQlzdXBlcihhVmlld2VyKTsKLQkJY29tbW9uVmlld2VyID0gYVZpZXdlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRHJvcEFkYXB0ZXIjcGVyZm9ybURyb3AoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRHJvcChPYmplY3QgZGF0YSkgewotCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChQbHVnaW5UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShnZXRDdXJyZW50VHJhbnNmZXIoKSkpCi0JCQlyZXN1bHQgPSBzdXBlci5wZXJmb3JtRHJvcChkYXRhKTsKLQkJZWxzZSB7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gZ2V0Q3VycmVudFRhcmdldCgpOwotCQkJT2JqZWN0IGRyYWdnZWRPYmplY3QgPSBnZXRTZWxlY3RlZE9iamVjdChnZXRDdXJyZW50VHJhbnNmZXIoKSwgZGF0YSk7Ci0JCQlpZiAoZ2V0Q3VycmVudFRhcmdldCgpID09IGRyYWdnZWRPYmplY3QpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJSURyb3BWYWxpZGF0b3IgZHJvcFZhbGlkYXRvciA9IG51bGw7Ci0JCQlDb21tb25Ecm9wSGFuZGxlclNlcnZpY2UgcmVnaXN0cnkgPSBDb21tb25Ecm9wSGFuZGxlclNlcnZpY2UuZ2V0SW5zdGFuY2UoY29tbW9uVmlld2VyLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCkuZ2V0Vmlld2VySWQoKSk7Ci0JCQlEcm9wSGFuZGxlckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHJlZ2lzdHJ5LmdldERyb3BIYW5kbGVyc0VuYWJsZWRGb3IoZHJhZ2dlZE9iamVjdCwgdGFyZ2V0KTsKLQkJCUFycmF5TGlzdCB2YWxpZGF0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLyogdGhlcmUgbWF5IGJlIG11bHRpcGxlIGRyb3AgaGFuZGxlciBkZXNjcmlwdG9ycyAqLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCS8qCi0JCQkJICogaWYgYSBkcm9wIHZhbGlkYXRvciBpcyBkZWZpbmVkLCBhbGxvdyBpdCB0byBwZXJmb3JtIGZ1cnRoZXIgdmFsaWRhdGlvbnMgLS0KLQkJCQkgKiBvdGhlcndpc2UsIHJ1biB0aGUgYWN0aW9uCi0JCQkJICovCi0JCQkJZHJvcFZhbGlkYXRvciA9IHJlZ2lzdHJ5LmdldERyb3BWYWxpZGF0b3IoY29tbW9uVmlld2VyLCBkZXNjcmlwdG9yc1tpXSk7Ci0JCQkJaWYgKGRyb3BWYWxpZGF0b3IgPT0gbnVsbCB8fCBkcm9wVmFsaWRhdG9yLnZhbGlkYXRlRHJvcCh0aGlzLCBnZXRDdXJyZW50VGFyZ2V0KCksIGdldEN1cnJlbnRPcGVyYXRpb24oKSwgZ2V0Q3VycmVudFRyYW5zZmVyKCkpKSB7Ci0JCQkJCXZhbGlkYXRlZExpc3QuYWRkKGRlc2NyaXB0b3JzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gc2tpcE9uU2luZ2xlID0gTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLmdldEJvb2xlYW4oTmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZy5TS0lQX09OX1NJTkdMRV9TRUxFQ1RJT04pOwotCi0JCQlpZiAodmFsaWRhdGVkTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJRHJvcEhhbmRsZXJEZXNjcmlwdG9yW10gdmFsaWRhdGVkRGVzY3JpcHRvcnMgPSBuZXcgRHJvcEhhbmRsZXJEZXNjcmlwdG9yW3ZhbGlkYXRlZExpc3Quc2l6ZSgpXTsKLQkJCQl2YWxpZGF0ZWRMaXN0LnRvQXJyYXkodmFsaWRhdGVkRGVzY3JpcHRvcnMpOwotCQkJCURyb3BIYW5kbGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yVG9Vc2UgPSB2YWxpZGF0ZWREZXNjcmlwdG9yc1swXTsKLQotCQkJCWlmICh2YWxpZGF0ZWREZXNjcmlwdG9ycy5sZW5ndGggIT0gMSB8fCAhc2tpcE9uU2luZ2xlKSB7Ci0JCQkJCVNoZWxsIHNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQkJCQlOYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBOYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nKHNoZWxsLCB2YWxpZGF0ZWREZXNjcmlwdG9ycyk7Ci0JCQkJCWlmIChXaW5kb3cuT0sgPT0gZGlhbG9nLm9wZW4oKSkgewotCQkJCQkJZGVzY3JpcHRvclRvVXNlID0gZGlhbG9nLmdldFNlbGVjdGVkRGVzY3JpcHRvcigpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZGVzY3JpcHRvclRvVXNlID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobnVsbCAhPSBkZXNjcmlwdG9yVG9Vc2UpIHsKLQkJCQkJLyogd2hlbiBhdCBsZWFzdCBvbmUgYWN0aW9uIHJ1bnMsIHdlIHdpbGwgcmV0dXJuIHRydWUgKi8KLQkJCQkJcmVzdWx0IHw9IHJlZ2lzdHJ5LmdldERyb3BBY3Rpb25EZWxlZ2F0ZShjb21tb25WaWV3ZXIsIGRlc2NyaXB0b3JUb1VzZSkucnVuKHRoaXMsIGRhdGEsIHRhcmdldCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRHJvcEFkYXB0ZXIjdmFsaWRhdGVEcm9wKGphdmEubGFuZy5PYmplY3QsIGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHJvcChPYmplY3QgdGFyZ2V0LCBpbnQgb3BlcmF0aW9uLCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKSB7Ci0KLQkJLyoKLQkJICogc2hvdWxkIGJlIGNhbGxlZCBmaXJzdCBzZW5zZSB0aGUgY3VycmVudFRyYW5zZmVyIGZpZWxkIGlzIHNldCBpbiB0aGUgcGFyZW50IGluIHRoaXMKLQkJICogbWV0aG9kCi0JCSAqLwotCQlpZiAoc3VwZXIudmFsaWRhdGVEcm9wKHRhcmdldCwgb3BlcmF0aW9uLCB0cmFuc2ZlclR5cGUpKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIi52YWxpZGF0ZURyb3AoT2JqZWN0IHRhcmdldD1cIiIrdGFyZ2V0KyJcIiwKLQkJCS8vIGludCBvcGVyYXRpb249XCIiK29wZXJhdGlvbisiXCIsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGU9XCIiK3RyYW5zZmVyVHlwZSsiXCIpOgotCQkJLy8gVmFsaWRhdGluZyBmb3IgUGx1Z2luVHJhbnNmZXIiKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpKyIudmFsaWRhdGVEcm9wKE9iamVjdCB0YXJnZXQ9XCIiK3RhcmdldCsiXCIsIGludAotCQkvLyBvcGVyYXRpb249XCIiK29wZXJhdGlvbisiXCIsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGU9XCIiK3RyYW5zZmVyVHlwZSsiXCIpOiBWYWxpZGF0aW5nCi0JCS8vIGZvciBFeHRlbnNpYmxlVHJhbnNmZXIiKTsKLQkJT2JqZWN0IHNvdXJjZSA9IGdldFNlbGVjdGVkT2JqZWN0KHRyYW5zZmVyVHlwZSk7Ci0JCWlmIChzb3VyY2UgPT0gdGFyZ2V0KQotCQkJcmV0dXJuIGZhbHNlOwotCQlJRHJvcFZhbGlkYXRvciBkcm9wVmFsaWRhdG9yID0gbnVsbDsKLQkJQ29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlIHJlZ2lzdHJ5ID0gQ29tbW9uRHJvcEhhbmRsZXJTZXJ2aWNlLmdldEluc3RhbmNlKGNvbW1vblZpZXdlci5nZXROYXZpZ2F0b3JDb250ZW50U2VydmljZSgpLmdldFZpZXdlcklkKCkpOwotCQlEcm9wSGFuZGxlckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHJlZ2lzdHJ5LmdldERyb3BIYW5kbGVyc0VuYWJsZWRGb3Ioc291cmNlLCB0YXJnZXQpOwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWRyb3BWYWxpZGF0b3IgPSByZWdpc3RyeS5nZXREcm9wVmFsaWRhdG9yKGNvbW1vblZpZXdlciwgZGVzY3JpcHRvcnNbaV0pOwotCQkJCWlmIChkcm9wVmFsaWRhdG9yID09IG51bGwgfHwgZHJvcFZhbGlkYXRvci52YWxpZGF0ZURyb3AodGhpcywgdGFyZ2V0LCBvcGVyYXRpb24sIHRyYW5zZmVyVHlwZSkpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmRuZC5JQ29tbW9uRHJvcEFkYXB0ZXIjZ2V0U2VsZWN0ZWRPYmplY3Qob3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZE9iamVjdChUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0JCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpCi0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5uYXRpdmVUb0phdmEodHJhbnNmZXJUeXBlKTsKLQotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kLklDb21tb25Ecm9wQWRhcHRlciNnZXRTZWxlY3RlZE9iamVjdChvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkT2JqZWN0KFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGUsIE9iamVjdCBkYXRhKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0JCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpCi0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5uYXRpdmVUb0phdmEodHJhbnNmZXJUeXBlKTsKLQotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRHJvcEFkYXB0ZXIjZHJhZ0VudGVyKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZHJhZ0VudGVyKGV2ZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudC5kYXRhVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlc1tpXSkpIHsKLQkJCQlldmVudC5kYXRhID0gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmdldFNlbGVjdGlvbigpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpKyIuZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudAotCQkJCS8vIGV2ZW50PVwiIitldmVudCsiXCIpOiBTZXR0aW5nIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIiKTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoUGx1Z2luVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGVzW2ldKSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmdldFNlbGVjdGlvbigpOwotCQkJCWJ5dGUgZGF0YVtdID0gZ2V0U2VyaWFsaXplcigpLnRvQnl0ZUFycmF5KHNlbGVjdGlvbik7Ci0JCQkJZXZlbnQuZGF0YSA9IG5ldyBQbHVnaW5UcmFuc2ZlckRhdGEoIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5QbHVnaW5Ecm9wQWN0aW9uIiwgZGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSsiLmRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQKLQkJCQkvLyBldmVudD1cIiIrZXZlbnQrIlwiKTogU2V0dGluZyBQbHVnaW5UcmFuc2ZlciIpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGVzW2ldKSkgewotCQkJCWV2ZW50LmRhdGEgPSBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5uYXRpdmVUb0phdmEoZXZlbnQuZGF0YVR5cGVzW2ldKTsKLQkJCQkvLyBGaWxlVHJhbnNmZXIgZnJvbSBvdXRzaWRlIHRoZSB3b3JrYmVuY2ggb25seSBhbGxvd3MgYSBDb3B5IGFjdGlvbgotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIi5kcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50Ci0JCQkJLy8gZXZlbnQ9XCIiK2V2ZW50KyJcIik6IFNldHRpbmcgRmlsZVRyYW5zZmVyIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRhdGE6ICIgKyAoKFN0cmluZ1tdKWV2ZW50LmRhdGEpWzBdKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0QWRhcHRlciNkcmFnTGVhdmUob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlzdXBlci5kcmFnTGVhdmUoZXZlbnQpOwotCQlpZiAoTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWJ5dGUgZGF0YVtdID0gZ2V0U2VyaWFsaXplcigpLnRvQnl0ZUFycmF5KHNlbGVjdGlvbik7Ci0JCQlldmVudC5kYXRhID0gbmV3IFBsdWdpblRyYW5zZmVyRGF0YSgib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkdlbmVyaWNEcm9wQWN0aW9uIiwgZGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJEcm9wQWRhcHRlciNnZXRDdXJyZW50TG9jYXRpb24oKQotCSAqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQuSUNvbW1vbkRyb3BBZGFwdGVyI2dldEN1cnJlbnRMb2NhdGlvbigpCi0JICovCi0JcHVibGljIGludCBnZXRDdXJyZW50TG9jYXRpb24oKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDdXJyZW50TG9jYXRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRHJvcEFkYXB0ZXIjZ2V0Q3VycmVudE9wZXJhdGlvbigpCi0JICovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmRuZC5JQ29tbW9uRHJvcEFkYXB0ZXIjZ2V0Q3VycmVudE9wZXJhdGlvbigpCi0JICovCi0JcHVibGljIGludCBnZXRDdXJyZW50T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q3VycmVudE9wZXJhdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJEcm9wQWRhcHRlciNnZXRDdXJyZW50VGFyZ2V0KCkKLQkgKi8KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kLklDb21tb25Ecm9wQWRhcHRlciNnZXRDdXJyZW50VGFyZ2V0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEN1cnJlbnRUYXJnZXQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDdXJyZW50VGFyZ2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlBsdWdpbkRyb3BBZGFwdGVyI2dldEN1cnJlbnRUcmFuc2ZlcigpCi0JICovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmRuZC5JQ29tbW9uRHJvcEFkYXB0ZXIjZ2V0Q3VycmVudFRyYW5zZmVyKCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJEYXRhIGdldEN1cnJlbnRUcmFuc2ZlcigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEN1cnJlbnRUcmFuc2ZlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJEcm9wQWRhcHRlciNnZXRTZWxlY3RlZE9iamVjdCgpCi0JICovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmRuZC5JQ29tbW9uRHJvcEFkYXB0ZXIjZ2V0U2VsZWN0ZWRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRPYmplY3QoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRTZWxlY3RlZE9iamVjdCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVNlcmlhbGl6ZXIgZ2V0U2VyaWFsaXplcigpIHsKLQkJaWYgKHNlcmlhbGl6ZXIgPT0gbnVsbCkKLQkJCXNlcmlhbGl6ZXIgPSBuZXcgTmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcihjb21tb25WaWV3ZXIuZ2V0TmF2aWdhdG9yQ29udGVudFNlcnZpY2UoKS5nZXRWaWV3ZXJJZCgpKTsKLQkJcmV0dXJuIHNlcmlhbGl6ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9Ecm9wSGFuZGxlckRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0Ryb3BIYW5kbGVyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTlkYjk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0Ryb3BIYW5kbGVyRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQ7Ci0gCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkRyb3BBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvclBsdWdpbjsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogIAotICovCi1wdWJsaWMgY2xhc3MgRHJvcEhhbmRsZXJEZXNjcmlwdG9yIHsKLQotCXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaW9uUG9pbnRFbGVtZW50cyB7Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUF9IQU5ETEVSID0gImRyb3BIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1ZBTElEQVRPUl9DTEFTUyA9ICJ2YWxpZGF0b3JDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUkFHX0VOQUJMRU1FTlQgPSAiZHJhZ0VuYWJsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUF9FTkFCTEVNRU5UID0gImRyb3BFbmFibGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUklBTElaRVJTID0gInNlcmlhbGl6ZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUklBTElaRVIgPSAic2VyaWFsaXplciI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLQlwcml2YXRlIEV4cHJlc3Npb24gZHJhZ0VuYWJsZW1lbnQ7Ci0KLQlwcml2YXRlIEV4cHJlc3Npb24gZHJvcEVuYWJsZW1lbnQ7Ci0KLQlwcml2YXRlIFNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvciBzZXJpYWxpemVyczsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRyb3BFbmFibGVtZW50Q29uZmlnRWxlbWVudDsKLQotCXByaXZhdGUgSURyb3BWYWxpZGF0b3IgZHJvcFZhbGlkYXRvcjsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRHJvcEhhbmRsZXJEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBhQ29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJQXNzZXJ0LmlzTGVnYWwoRXh0ZW5zaW9uUG9pbnRFbGVtZW50cy5EUk9QX0hBTkRMRVIuZXF1YWxzKGFDb25maWd1cmF0aW9uRWxlbWVudC5nZXROYW1lKCkpKTsKLQkJY29uZmlndXJhdGlvbkVsZW1lbnQgPSBhQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCWlkID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEV4dGVuc2lvblBvaW50RWxlbWVudHMuQVRUX0lEKTsKLQkJbmFtZSA9IGNvbmZpZ3VyYXRpb25FbGVtZW50LmdldEF0dHJpYnV0ZShFeHRlbnNpb25Qb2ludEVsZW1lbnRzLk5BTUUpOwotCQlkZXNjcmlwdGlvbiA9IGNvbmZpZ3VyYXRpb25FbGVtZW50LmdldEF0dHJpYnV0ZShFeHRlbnNpb25Qb2ludEVsZW1lbnRzLkRFU0NSSVBUSU9OKTsKLQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBkcmFnRW5hYmxlbWVudENoaWxkcmVuID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0Q2hpbGRyZW4oRXh0ZW5zaW9uUG9pbnRFbGVtZW50cy5EUkFHX0VOQUJMRU1FTlQpOwotCQlpZiAoZHJhZ0VuYWJsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwICYmIGRyYWdFbmFibGVtZW50Q2hpbGRyZW5bMF0gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkcmFnRW5hYmxlbWVudCA9IEVsZW1lbnRIYW5kbGVyLmdldERlZmF1bHQoKS5jcmVhdGUoCi0JCQkJCQlFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKSwgZHJhZ0VuYWJsZW1lbnRDaGlsZHJlblswXSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlOYXZpZ2F0b3JQbHVnaW4ubG9nKElTdGF0dXMuRVJST1IsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfSAKLQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBkcm9wRW5hYmxlbWVudENoaWxkcmVuID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0Q2hpbGRyZW4oRXh0ZW5zaW9uUG9pbnRFbGVtZW50cy5EUk9QX0VOQUJMRU1FTlQpOwotCQlpZiAoZHJvcEVuYWJsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwICYmIGRyb3BFbmFibGVtZW50Q2hpbGRyZW5bMF0gIT0gbnVsbCkgewotCQkJdGhpcy5kcm9wRW5hYmxlbWVudENvbmZpZ0VsZW1lbnQgPSBkcm9wRW5hYmxlbWVudENoaWxkcmVuWzBdOwotCQkJdHJ5IHsKLQkJCQlkcm9wRW5hYmxlbWVudCA9IEVsZW1lbnRIYW5kbGVyLmdldERlZmF1bHQoKS5jcmVhdGUoCi0JCQkJCQlFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKSwgZHJvcEVuYWJsZW1lbnRDaGlsZHJlblswXSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlOYXZpZ2F0b3JQbHVnaW4ubG9nKElTdGF0dXMuRVJST1IsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0JCQkgCi0JCX0KLQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBzZXJpYWxpemVyc0NoaWxkID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0Q2hpbGRyZW4oRXh0ZW5zaW9uUG9pbnRFbGVtZW50cy5TRVJJQUxJWkVSUyk7Ci0JCWlmIChzZXJpYWxpemVyc0NoaWxkLmxlbmd0aCA+IDAgJiYgc2VyaWFsaXplcnNDaGlsZFswXSAhPSBudWxsKQotCQkJdGhpcy5zZXJpYWxpemVycyA9IG5ldyBTZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3IodGhpcy5pZCwgc2VyaWFsaXplcnNDaGlsZFswXSwgZHJhZ0VuYWJsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRHJhZ0VuYWJsZWRGb3IoT2JqZWN0IGFuRWxlbWVudCkgewotCQkKLQkJaWYgKGRyYWdFbmFibGVtZW50ID09IG51bGwgfHwgYW5FbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoZHJhZ0VuYWJsZW1lbnQuZXZhbHVhdGUobmV3IEV2YWx1YXRpb25Db250ZXh0KG51bGwsIGFuRWxlbWVudCkpID09IEV2YWx1YXRpb25SZXN1bHQuVFJVRSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRHJvcEVuYWJsZWRGb3IoT2JqZWN0IGFuRWxlbWVudCkgeyAKLQkJCi0JCWlmIChkcm9wRW5hYmxlbWVudCA9PSBudWxsIHx8IGFuRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKGRyb3BFbmFibGVtZW50LmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBhbkVsZW1lbnQpKSA9PSBFdmFsdWF0aW9uUmVzdWx0LlRSVUUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCU5hdmlnYXRvclBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElEcm9wVmFsaWRhdG9yIGdldERyb3BWYWxpZGF0b3IoKSB7Ci0JCWlmIChkcm9wVmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGNsYXNzVmFsdWUgPSB0aGlzLmRyb3BFbmFibGVtZW50Q29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uUG9pbnRFbGVtZW50cy5BVFRfVkFMSURBVE9SX0NMQVNTKTsKLQkJCQlpZiAoY2xhc3NWYWx1ZSAhPSBudWxsICYmIGNsYXNzVmFsdWUubGVuZ3RoKCkgPiAwKQotCQkJCQlkcm9wVmFsaWRhdG9yID0gKElEcm9wVmFsaWRhdG9yKSB0aGlzLmRyb3BFbmFibGVtZW50Q29uZmlnRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEV4dGVuc2lvblBvaW50RWxlbWVudHMuQVRUX1ZBTElEQVRPUl9DTEFTUyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZHJvcFZhbGlkYXRvcjsKLQl9Ci0KLQlwdWJsaWMgU2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yIGdldFNlcmlhbGl6ZXJzRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHRoaXMuc2VyaWFsaXplcnM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHJvdGVjdGVkIElDb21tb25Ecm9wQWN0aW9uRGVsZWdhdGUgY3JlYXRlQWN0aW9uKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChJQ29tbW9uRHJvcEFjdGlvbkRlbGVnYXRlKSB0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oRXh0ZW5zaW9uUG9pbnRFbGVtZW50cy5BVFRfQ0xBU1MpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5Ecm9wSGFuZGxlckRlc2NyaXB0b3JfMTAsIG5ldyBPYmplY3RbXXtnZXRJZCgpfSk7IAotCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhtc2csIGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbiAhPSBudWxsID8gZGVzY3JpcHRpb24gOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWUgIT0gbnVsbCA/IG5hbWUgOiBpZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9JRHJvcFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvSURyb3BWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxM2MzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9JRHJvcFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uRHJvcEFkYXB0ZXI7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEcm9wVmFsaWRhdG9yIHsKLQotCWJvb2xlYW4gdmFsaWRhdGVEcm9wKElDb21tb25Ecm9wQWRhcHRlciBkcm9wQWRhcHRlciwgT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0lTZXJpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9JU2VyaWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTVlNjRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0lTZXJpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi0KLS8qKgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VyaWFsaXplciB7Ci0KLQlPYmplY3QgZnJvbUJ5dGVBcnJheShieXRlW10gZGF0YSk7Ci0KLQlieXRlW10gdG9CeXRlQXJyYXkoT2JqZWN0IGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjllNjZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0xvY2FsU2VsZWN0aW9uVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvclBsdWdpbjsKLQotLyoqCi0gKiBBIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIgbWF5IGJlIHVzZWQgZm9yIGRyYWcgYW5kIGRyb3Agb3BlcmF0aW9ucwotICogd2l0aGluIHRoZSBzYW1lIGluc3RhbmNlIG9mIEVjbGlwc2UuCi0gKiBUaGUgc2VsZWN0aW9uIGlzIG1hZGUgYXZhaWxhYmxlIGRpcmVjdGx5IGZvciB1c2UgaW4gdGhlIERyb3BUYXJnZXRMaXN0ZW5lci4KLSAqIGRyb3BBY2NlcHQgbWV0aG9kLiBUaGUgRHJvcFRhcmdldEV2ZW50IHBhc3NlZCB0byBkcm9wQWNjZXB0IGRvZXMgbm90IGNvbnRhaW4KLSAqIHRoZSBkcm9wIGRhdGEuIFRoZSBzZWxlY3Rpb24gbWF5IGJlIHVzZWQgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMgc28gdGhhdCB0aGUKLSAqIGRyb3AgY2FuIGJlIGFib3J0ZWQgaWYgYXBwcm9wcmlhdGUuCi0gKgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIAotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxTZWxlY3Rpb25UcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotICAgIC8vIEZpcnN0IGF0dGVtcHQgdG8gY3JlYXRlIGEgVVVJRCBmb3IgdGhlIHR5cGUgbmFtZSB0byBtYWtlIHN1cmUgdGhhdAotICAgIC8vIGRpZmZlcmVudCBFY2xpcHNlIGFwcGxpY2F0aW9ucyB1c2UgZGlmZmVyZW50ICJ0eXBlcyIgb2YKLSAgICAvLyA8Y29kZT5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyPC9jb2RlPgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05BTUUgPSAibG9jYWwtc2VsZWN0aW9uLXRyYW5zZmVyLWZvcm1hdCIgKyAobmV3IExvbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVJRCA9IHJlZ2lzdGVyVHlwZShUWVBFX05BTUUpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxTZWxlY3Rpb25UcmFuc2ZlciBJTlNUQU5DRSA9IG5ldyBMb2NhbFNlbGVjdGlvblRyYW5zZmVyKCk7Ci0KLSAgICBwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gICAgcHJpdmF0ZSBsb25nIHNlbGVjdGlvblNldFRpbWU7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBtYXkgYmUgdXNlZC4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbi4KLSAgICAgKiBAcmV0dXJuIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBJTlNUQU5DRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbCB0cmFuc2ZlciBkYXRhLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIHRyYW5zZmVyIGRhdGEKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciBuYXRpdmUgZHJvcCBkYXRhIG1hdGNoZXMgdGhpcyB0cmFuc2ZlciB0eXBlLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXN1bHQgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIG5hdGl2ZSBkcm9wIGRhdGEgdG8gSmF2YQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmF0aXZlIGRyb3AgZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGlzIHRyYW5zZmVyIHR5cGUuCi0gICAgICogCWZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbnZhbGlkTmF0aXZlVHlwZShPYmplY3QgcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiAhKHJlc3VsdCBpbnN0YW5jZW9mIGJ5dGVbXSkKLSAgICAgICAgICAgICAgICB8fCAhVFlQRV9OQU1FLmVxdWFscyhuZXcgU3RyaW5nKChieXRlW10pIHJlc3VsdCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgaWQgdXNlZCB0byBpZGVudGlmeSB0aGlzIHRyYW5zZmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgaWQgdXNlZCB0byBpZGVudGlmeSB0aGlzIHRyYW5zZmVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgewotICAgICAgICByZXR1cm4gbmV3IGludFtdIHsgVFlQRUlEIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyB0cmFuc2Zlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHRyYW5zZmVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBUWVBFX05BTUUgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZXMgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlciNqYXZhVG9OYXRpdmUoT2JqZWN0LAotICAgICAqIFRyYW5zZmVyRGF0YSkuCi0gICAgICogT25seSBlbmNvZGUgdGhlIHRyYW5zZmVyIHR5cGUgbmFtZSBzaW5jZSB0aGUgc2VsZWN0aW9uIGlzIHJlYWQgYW5kCi0gICAgICogd3JpdHRlbiBpbiB0aGUgc2FtZSBwcm9jZXNzLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlciNqYXZhVG9OYXRpdmUoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgamF2YVRvTmF0aXZlKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLSAgICAgICAgYnl0ZVtdIGNoZWNrID0gVFlQRV9OQU1FLmdldEJ5dGVzKCk7Ci0gICAgICAgIHN1cGVyLmphdmFUb05hdGl2ZShjaGVjaywgdHJhbnNmZXJEYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZXMgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlciNuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhKS4KLSAgICAgKiBUZXN0IGlmIHRoZSBuYXRpdmUgZHJvcCBkYXRhIG1hdGNoZXMgdGhpcyB0cmFuc2ZlciB0eXBlLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlciNuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHN1cGVyLm5hdGl2ZVRvSmF2YSh0cmFuc2ZlckRhdGEpOwotICAgICAgICBpZiAoaXNJbnZhbGlkTmF0aXZlVHlwZShyZXN1bHQpKSB7Ci0gICAgICAgIAlOYXZpZ2F0b3JQbHVnaW4ubG9nKG5ldyBTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXZpZ2F0b3JQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuTG9jYWxTZWxlY3Rpb25UcmFuc2Zlcl9lcnJvck1lc3NhZ2UsIG51bGwpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRyYW5zZmVyIGRhdGEgZm9yIGxvY2FsIHVzZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgdHJhbnNmZXIgZGF0YQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHMpIHsKLSAgICAgICAgc2VsZWN0aW9uID0gczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIHdoZW4gdGhlIHNlbGVjdGlvbiBvcGVyYXRpb24KLSAgICAgKiB0aGlzIHRyYW5zZmVyIGlzIGFzc29jaWF0ZWQgd2l0aCB3YXMgc3RhcnRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aW1lIHdoZW4gdGhlIHNlbGVjdGlvbiBvcGVyYXRpb24gaGFzIHN0YXJ0ZWQKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHlwZWRFdmVudCN0aW1lCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0U2VsZWN0aW9uU2V0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGlvblNldFRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGltZSB3aGVuIHRoZSBzZWxlY3Rpb24gb3BlcmF0aW9uIHRoaXMKLSAgICAgKiB0cmFuc2ZlciBpcyBhc3NvY2lhdGVkIHdpdGggd2FzIHN0YXJ0ZWQuCi0gICAgICogSWYgYXNzaWduaW5nIHRoaXMgZnJvbSBhbiBTV1QgZXZlbnQsIGJlIHN1cmUgdG8gdXNlCi0gICAgICogPGNvZGU+c2V0U2VsZWN0aW9uVGltZShldmVudC50aW1lICYgMHhGRkZGKTwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGltZSB0aGUgdGltZSB3aGVuIHRoZSBzZWxlY3Rpb24gb3BlcmF0aW9uIHdhcyBzdGFydGVkCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlR5cGVkRXZlbnQjdGltZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblNldFRpbWUobG9uZyB0aW1lKSB7Ci0gICAgICAgIHNlbGVjdGlvblNldFRpbWUgPSB0aW1lOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL05hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzU2NjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL05hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uRHJvcEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uRHJvcEFkYXB0ZXI7Ci0KLS8qKgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqICAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElDb21tb25Ecm9wQWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBDb21tb25WaWV3ZXIgY29tbW9uVmlld2VyOwotCi0gCi0JcHVibGljIGZpbmFsIHZvaWQgaW5pdChDb21tb25WaWV3ZXIgYVZpZXdlcikgewotCQljb21tb25WaWV3ZXIgPSBhVmlld2VyOwotCQlkb0luaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnQgYW55IGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24uIFRoZSBleHRlbnNpb25TaXRlIGlzIGFjY2Vzc2libGUgYnkKLQkgKiBnZXRFeHRlbnNpb25TaXRlKCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9Jbml0KCkgewotCX0KLQotCS8qKgotCSAqIENhcnJ5IG91dCB0aGUgRE5EIG9wZXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiAgICAgICAgICAgIG9uZSBvZiBETkQuRFJPUF9NT1ZFfERORC5EUk9QX0NPUFl8RE5ELkRST1BfTElOSwotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqICAgICAgICAgICAgb25lIG9mIFZpZXdlckRyb3BBZGFwdGVyLkxPQ0FUSU9OXyogdG8gaW5kaWNhdGUgd2hlcmUgaW4gdGhlIHRyZWUgYW4gaXRlbSBpcwotCSAqICAgICAgICAgICAgZHJvcHBlZAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgYmVpbmcgZHJhZ2dlZAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgYmVpbmcgZHJhZ2dlZCBvbnRvCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJ1bihJQ29tbW9uRHJvcEFkYXB0ZXIgZHJvcEFkYXB0ZXIsIE9iamVjdCBzb3VyY2UsIE9iamVjdCB0YXJnZXQpOwotCi0JcHJvdGVjdGVkIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCXByb3RlY3RlZCBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJaWYgKGNvbW1vblZpZXdlciAhPSBudWxsKQotCQkJcmV0dXJuIGNvbW1vblZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSURyb3BBY3Rpb25EZWxlZ2F0ZSNydW4oamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBydW4oT2JqZWN0IHNvdXJjZSwgT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE3YmM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL05hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvclBsdWdpbjsKLQotCi0vKioKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIE5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9PTl9TSU5HTEVfU0VMRUNUSU9OID0gIk5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cuU0tJUF9PTl9TSU5HTEVfU0VMRUNUSU9OIjsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRHJvcEhhbmRsZXJEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnM7Ci0JcHJpdmF0ZSBCdXR0b25bXSByYWRpb3M7Ci0JcHJpdmF0ZSBCdXR0b24gc2tpcERpYWxvZ09uU2luZ2xlU2VsZWN0aW9uOwotCXByaXZhdGUgVGV4dCBkZXNjcmlwdGlvblRleHQ7Ci0JcHJpdmF0ZSBEcm9wSGFuZGxlckRlc2NyaXB0b3Igc2VsZWN0ZWREZXNjcmlwdG9yOwotCXByaXZhdGUgYm9vbGVhbiBjaGVja2VkRGVmYXVsdCA9IGZhbHNlOwotCi0JcHVibGljIE5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIERyb3BIYW5kbGVyRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5kZXNjcmlwdG9ycyA9IGRlc2NyaXB0b3JzOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlnZXRTaGVsbCgpLnNldFRleHQoQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuTmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZ18xKTsKLQkJQ29tcG9zaXRlIHN1cGVyQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHN1cGVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJcmFkaW9zID0gbmV3IEJ1dHRvbltkZXNjcmlwdG9ycy5sZW5ndGhdOwotCi0JCUdyb3VwIHJhZGlvR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuU0hBRE9XX05PTkUpOwotCQlyYWRpb0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlHcmlkTGF5b3V0IGdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JvdXBMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZ3JvdXBMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlncm91cExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQlncm91cExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWdyb3VwTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlyYWRpb0dyb3VwLnNldExheW91dChncm91cExheW91dCk7Ci0KLQkJZmluYWwgaW50IGFycmF5TGVuZ3RoID0gZGVzY3JpcHRvcnMubGVuZ3RoOyAvLyA9IHJhZGlvcy5sZW5ndGgKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0JCQlyYWRpb3NbaV0gPSBuZXcgQnV0dG9uKHJhZGlvR3JvdXAsIFNXVC5SQURJTyk7Ci0JCQlyYWRpb3NbaV0uc2V0VGV4dChkZXNjcmlwdG9yc1tpXS5nZXROYW1lKCkpOwotCi0JCQlyYWRpb3NbaV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhcnJheUxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAoc291cmNlID09IHJhZGlvc1tqXSkgewotCQkJCQkJCXNlbGVjdGVkRGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW2pdOwotCQkJCQkJCWRlc2NyaXB0aW9uVGV4dC5zZXRUZXh0KHNlbGVjdGVkRGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc2VsZWN0ZWREZXNjcmlwdG9yID0gbnVsbDsKLQkJCQkJZGVzY3JpcHRpb25UZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlkZXNjcmlwdGlvblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JCUdyaWREYXRhIGRlc2NyaXB0aW9uVGV4dEdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRlc2NyaXB0aW9uVGV4dEdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDMpOwotCQlkZXNjcmlwdGlvblRleHQuc2V0TGF5b3V0RGF0YShkZXNjcmlwdGlvblRleHRHcmlkRGF0YSk7Ci0JCWRlc2NyaXB0aW9uVGV4dC5zZXRCYWNrZ3JvdW5kKHN1cGVyQ29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0KLQkJc2tpcERpYWxvZ09uU2luZ2xlU2VsZWN0aW9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCXNraXBEaWFsb2dPblNpbmdsZVNlbGVjdGlvbi5zZXRUZXh0KENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLk5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2dfMyk7Ci0JCXNraXBEaWFsb2dPblNpbmdsZVNlbGVjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY2hlY2tlZERlZmF1bHQgPSBOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkuZ2V0Qm9vbGVhbihOYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nLlNLSVBfT05fU0lOR0xFX1NFTEVDVElPTik7Ci0JCXNraXBEaWFsb2dPblNpbmdsZVNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oY2hlY2tlZERlZmF1bHQpOwotCi0JCXNldERlZmF1bHRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWlmIChjaGVja2VkRGVmYXVsdCAhPSBza2lwRGlhbG9nT25TaW5nbGVTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKS5wdXQoTmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZy5TS0lQX09OX1NJTkdMRV9TRUxFQ1RJT04sIHNraXBEaWFsb2dPblNpbmdsZVNlbGVjdGlvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRTZWxlY3Rpb24oKSB7Ci0JCXJhZGlvc1swXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXNlbGVjdGVkRGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzWzBdOwotCQlkZXNjcmlwdGlvblRleHQuc2V0VGV4dChzZWxlY3RlZERlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzZWxlY3RlZERlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIERyb3BIYW5kbGVyRGVzY3JpcHRvciBnZXRTZWxlY3RlZERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBzZWxlY3RlZERlc2NyaXB0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzUyNDU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL05hdmlnYXRvclNlbGVjdGlvblNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvclBsdWdpbjsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICogIAotICovCi1wdWJsaWMgY2xhc3MgTmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplciBpbXBsZW1lbnRzIElTZXJpYWxpemVyIHsKLQotCXByaXZhdGUgU3RyaW5nIHZpZXdlcklkOwotCi0JcHVibGljIGNsYXNzIE5hdmlnYXRvclNlcmlhbGl6ZWRTZWxlY3Rpb24gewotCi0JCXB1YmxpYyBmaW5hbCBTdHJpbmcgdmlld2VySWQ7Ci0KLQkJcHVibGljIGZpbmFsIE1hcCBzZWxlY3Rpb25NYXA7Ci0KLQkJcHVibGljIE5hdmlnYXRvclNlcmlhbGl6ZWRTZWxlY3Rpb24oU3RyaW5nIHZpZXdlcklkLCBNYXAgc2VsZWN0aW9uTWFwKSB7Ci0JCQl0aGlzLnZpZXdlcklkID0gdmlld2VySWQ7Ci0JCQl0aGlzLnNlbGVjdGlvbk1hcCA9IHNlbGVjdGlvbk1hcDsKLQkJfQotCX0KLQotCXB1YmxpYyBOYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyKCkgewotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcihTdHJpbmcgYVZpZXdlcklkKSB7Ci0JCXRoaXMudmlld2VySWQgPSBhVmlld2VySWQ7Ci0JfQotCi0JcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICh2aWV3ZXJJZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybiBuZXcgYnl0ZVswXTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG9iamVjdDsKLQkJLy8JICBUT0RPIE1ERSBTZXJpYWxpemUgbXVsaXBsZSBlbGVtZW50cyAtLSBnZXRGaXJzdEVsZW1lbnQoKSBpcyBqdXN0IHRvCi0JCS8vIHRlc3QgdGhlIGlkZWEKLQkJYnl0ZVtdIHJlc3VsdCA9IG51bGw7Ci0KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRGF0YU91dHB1dFN0cmVhbSBkYXRhT3V0cHV0U3RyZWFtID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYnl0ZUFycmF5T3V0cHV0U3RyZWFtKTsKLQotCQl0cnkgewotCQkJZGF0YU91dHB1dFN0cmVhbS53cml0ZVVURih2aWV3ZXJJZCk7Ci0KLQkJCWJ5dGVbXSBkYXRhID0gbnVsbDsKLQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCVNlcmlhbGl6ZXJEZXNjcmlwdG9yW10gc2VyaWFsaXplckRlc2NyaXB0b3JzID0gbnVsbDsKLQkJCS8qIHdyaXRlIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0byBiZSBzZXJpYWxpemVkICovCi0JCQlkYXRhT3V0cHV0U3RyZWFtLndyaXRlSW50KHNlbGVjdGlvbi5zaXplKCkpOwotCQkJZm9yIChJdGVyYXRvciBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBzZWxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJZWxlbWVudCA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCQlzZXJpYWxpemVyRGVzY3JpcHRvcnMgPSBDb21tb25Ecm9wSGFuZGxlclNlcnZpY2UuZ2V0SW5zdGFuY2Uodmlld2VySWQpLmdldFNlcmlhbGl6ZXJzRW5hYmxlZEZvcihlbGVtZW50KTsKLQotCQkJCS8qIHdyaXRlIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IHJlcHJlc2VudGF0aW9ucyB0byBiZSBzdG9yZWQgKi8KLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbG9jYWxSZXByZXNlbnRhdGlvbk91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCQkJaW50IGRpZmZlcmVudFJlcHJlc2VudGF0aW9ucyA9IDA7Ci0JCQkJRGF0YU91dHB1dFN0cmVhbSBzZXJpYWxpemVkRGF0YU91dHB1dFN0cmVhbSA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKChsb2NhbFJlcHJlc2VudGF0aW9uT3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJpYWxpemVyRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IHNlcmlhbGl6ZXJEZXNjcmlwdG9yc1tpXS5nZXRTZXJpYWxpemVyKCk7Ci0JCQkJCWRhdGEgPSBzZXJpYWxpemVyLnRvQnl0ZUFycmF5KGVsZW1lbnQpOwotCQkJCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogd3JpdGUgdGhlIGlkIG9mIHRoZSBzZXJpYWxpemVyIHRoYXQgbWFyc2hhbGxlZCB0aGUgZGF0YQotCQkJCQkJICovCi0JCQkJCQlzZXJpYWxpemVkRGF0YU91dHB1dFN0cmVhbS53cml0ZVVURihzZXJpYWxpemVyRGVzY3JpcHRvcnNbaV0uaWQpOwotCQkJCQkJLyogd3JpdGUgdGhlIGFtb3VudCBvZiBkYXRhICovCi0JCQkJCQlzZXJpYWxpemVkRGF0YU91dHB1dFN0cmVhbS53cml0ZUludChkYXRhLmxlbmd0aCk7Ci0JCQkJCQkvKiB3cml0ZSB0aGUgZGF0YSAqLwotCQkJCQkJc2VyaWFsaXplZERhdGFPdXRwdXRTdHJlYW0ud3JpdGUoZGF0YSk7Ci0JCQkJCQkrK2RpZmZlcmVudFJlcHJlc2VudGF0aW9uczsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWRhdGFPdXRwdXRTdHJlYW0ud3JpdGVJbnQoZGlmZmVyZW50UmVwcmVzZW50YXRpb25zKTsKLQkJCQlkYXRhT3V0cHV0U3RyZWFtLndyaXRlKGxvY2FsUmVwcmVzZW50YXRpb25PdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBieXRlQXJyYXlPdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyXzEgKyBlLnRvU3RyaW5nKCkpOyAgCi0JCQlyZXN1bHQgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0gCi0JcHVibGljIE9iamVjdCBmcm9tQnl0ZUFycmF5KGJ5dGVbXSBkYXRhKSB7Ci0JCU1hcCByZXN1bHRzID0gbmV3IEhhc2hNYXAoKTsKLQotCQlEYXRhSW5wdXRTdHJlYW0gZGF0YUlucHV0U3RyZWFtID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSkpOwotCQl0cnkgewotCQkJaW50IGxvY2FsRGF0YUxlbiA9IDA7Ci0JCQlieXRlW10gbG9jYWxEYXRhID0gbnVsbDsKLQkJCVN0cmluZyBzZXJpYWxpemVySWQgPSBudWxsOwotCQkJT2JqZWN0IGRhdGFPYmplY3QgPSBudWxsOwotCi0JCQlTdHJpbmcgbG9jYWxWaWV3ZXJJZCA9IGRhdGFJbnB1dFN0cmVhbS5yZWFkVVRGKCk7Ci0JCQlpbnQgbnVtYmVyT2ZPYmplY3RzID0gZGF0YUlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZPYmplY3RzOyBpKyspIHsKLQkJCQlpbnQgbnVtYmVyT2ZSZXByZXNlbnRhdGlvbnMgPSBkYXRhSW5wdXRTdHJlYW0ucmVhZEludCgpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbnVtYmVyT2ZSZXByZXNlbnRhdGlvbnM7IGorKykgewotCQkJCQlzZXJpYWxpemVySWQgPSBkYXRhSW5wdXRTdHJlYW0ucmVhZFVURigpOwotCQkJCQlTZXJpYWxpemVyRGVzY3JpcHRvciBzZXJpYWxpemVyRGVzY3JpcHRvciA9IENvbW1vbkRyb3BIYW5kbGVyU2VydmljZS5nZXRJbnN0YW5jZShsb2NhbFZpZXdlcklkKS5nZXRTZXJpYWxpemVyQnlJZChzZXJpYWxpemVySWQpOwotCQkJCQlJU2VyaWFsaXplciBzZXJpYWxpemVyID0gc2VyaWFsaXplckRlc2NyaXB0b3IuZ2V0U2VyaWFsaXplcigpOwotCQkJCQlsb2NhbERhdGFMZW4gPSBkYXRhSW5wdXRTdHJlYW0ucmVhZEludCgpOwotCQkJCQlsb2NhbERhdGEgPSBuZXcgYnl0ZVtsb2NhbERhdGFMZW5dOwotCQkJCQlkYXRhSW5wdXRTdHJlYW0ucmVhZChsb2NhbERhdGEsIDAsIGxvY2FsRGF0YS5sZW5ndGgpOwotCQkJCQlkYXRhT2JqZWN0ID0gc2VyaWFsaXplci5mcm9tQnl0ZUFycmF5KGxvY2FsRGF0YSk7Ci0JCQkJCWdldERhdGFMaXN0KHJlc3VsdHMsIHNlcmlhbGl6ZXJJZCkuYWRkKGRhdGFPYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IE5hdmlnYXRvclNlcmlhbGl6ZWRTZWxlY3Rpb24odmlld2VySWQsIHJlc3VsdHMpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldERhdGFMaXN0KE1hcCBzZXJpYWxpemVyTWFwLCBTdHJpbmcgaWQpIHsKLQkJTGlzdCByZXN1bHQgPSAoTGlzdCkgc2VyaWFsaXplck1hcC5nZXQoaWQpOwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlzZXJpYWxpemVyTWFwLnB1dChpZCwgKHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvUGx1Z2luRHJvcEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvUGx1Z2luRHJvcEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg1ODcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL1BsdWdpbkRyb3BBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkRyb3BBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSURyb3BBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBsdWdpblRyYW5zZmVyOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkRyb3BBY3Rpb24gaW1wbGVtZW50cyBJRHJvcEFjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgSVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUGx1Z2luRHJvcEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSURyb3BBY3Rpb25EZWxlZ2F0ZSNydW4oamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBydW4oT2JqZWN0IHNvdXJjZURhdGEsIE9iamVjdCB0YXJnZXQpIHsKLQkJTmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplci5OYXZpZ2F0b3JTZXJpYWxpemVkU2VsZWN0aW9uIG5hdlNlbGVjdGlvbiA9IChOYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyLk5hdmlnYXRvclNlcmlhbGl6ZWRTZWxlY3Rpb24pIGdldFNlcmlhbGl6ZXIoKS5mcm9tQnl0ZUFycmF5KChieXRlW10pIHNvdXJjZURhdGEpOwotCQlDb21tb25Ecm9wSGFuZGxlclNlcnZpY2UgcmVnaXN0cnkgPSBDb21tb25Ecm9wSGFuZGxlclNlcnZpY2UuZ2V0SW5zdGFuY2UobmF2U2VsZWN0aW9uLnZpZXdlcklkKTsKLQotCQlUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhID0gUGx1Z2luVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5nZXRTdXBwb3J0ZWRUeXBlcygpWzBdOwotCQlTdHJpbmcgc2VyaWFsaXplcklkID0gbnVsbDsKLQkJSUNvbW1vbkRyb3BBY3Rpb25EZWxlZ2F0ZSBhY3Rpb24gPSBudWxsOwotCQlMaXN0IHZhbGlkYXRlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUhhc2h0YWJsZSBkZXNjcmlwdG9yVG9TZXJpemxpYXplcklESGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLQkJZm9yIChJdGVyYXRvciBrZXlJdHIgPSBuYXZTZWxlY3Rpb24uc2VsZWN0aW9uTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGtleUl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlzZXJpYWxpemVySWQgPSBrZXlJdHIubmV4dCgpLnRvU3RyaW5nKCk7Ci0JCQlEcm9wSGFuZGxlckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHJlZ2lzdHJ5LmdldERyb3BIYW5kbGVyc0J5U2VyaWFsaXplcklkKHNlcmlhbGl6ZXJJZCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCF2YWxpZGF0ZWRMaXN0LmNvbnRhaW5zKGRlc2NyaXB0b3JzW2ldKSkgewotCQkJCQlJRHJvcFZhbGlkYXRvciB2YWxpZGF0b3IgPSBkZXNjcmlwdG9yc1tpXS5nZXREcm9wVmFsaWRhdG9yKCk7Ci0JCQkJCWlmIChudWxsID09IHZhbGlkYXRvciB8fCB2YWxpZGF0b3IudmFsaWRhdGVEcm9wKG51bGwsIHRhcmdldCwgLTEsIHRyYW5zZmVyRGF0YSkpIHsKLQkJCQkJCXZhbGlkYXRlZExpc3QuYWRkKGRlc2NyaXB0b3JzW2ldKTsKLQkJCQkJCWRlc2NyaXB0b3JUb1Nlcml6bGlhemVySURIYXNoLnB1dChkZXNjcmlwdG9yc1tpXSwgc2VyaWFsaXplcklkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWlmIChudWxsID09IHNldHRpbmdzLmdldChOYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nLlNLSVBfT05fU0lOR0xFX1NFTEVDVElPTikpIHsKLQkJCXNldHRpbmdzLnB1dChOYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nLlNLSVBfT05fU0lOR0xFX1NFTEVDVElPTiwgdHJ1ZSk7Ci0JCX0KLQotCQlib29sZWFuIHNraXBPblNpbmdsZSA9IHNldHRpbmdzLmdldEJvb2xlYW4oTmF2aWdhdG9yRHJvcFNlbGVjdGlvbkRpYWxvZy5TS0lQX09OX1NJTkdMRV9TRUxFQ1RJT04pOwotCi0JCWlmICh2YWxpZGF0ZWRMaXN0LnNpemUoKSA+IDApIHsKLQkJCURyb3BIYW5kbGVyRGVzY3JpcHRvcltdIHZhbGlkYXRlZERlc2NyaXB0b3JzID0gbmV3IERyb3BIYW5kbGVyRGVzY3JpcHRvclt2YWxpZGF0ZWRMaXN0LnNpemUoKV07Ci0JCQl2YWxpZGF0ZWRMaXN0LnRvQXJyYXkodmFsaWRhdGVkRGVzY3JpcHRvcnMpOwotCQkJRHJvcEhhbmRsZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3JUb1VzZSA9IHZhbGlkYXRlZERlc2NyaXB0b3JzWzBdOwotCi0JCQlpZiAodmFsaWRhdGVkRGVzY3JpcHRvcnMubGVuZ3RoICE9IDEgfHwgIXNraXBPblNpbmdsZSkgewotCQkJCVNoZWxsIHNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQkJCU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IE5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2coc2hlbGwsIHZhbGlkYXRlZERlc2NyaXB0b3JzKTsKLQkJCQlpZiAoV2luZG93Lk9LID09IGRpYWxvZy5vcGVuKCkpIHsKLQkJCQkJZGVzY3JpcHRvclRvVXNlID0gZGlhbG9nLmdldFNlbGVjdGVkRGVzY3JpcHRvcigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRlc2NyaXB0b3JUb1VzZSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG51bGwgIT0gZGVzY3JpcHRvclRvVXNlKSB7Ci0JCQkJc2VyaWFsaXplcklkID0gKFN0cmluZykgZGVzY3JpcHRvclRvU2VyaXpsaWF6ZXJJREhhc2guZ2V0KGRlc2NyaXB0b3JUb1VzZSk7Ci0JCQkJTGlzdCBvYmplY3RzID0gKExpc3QpIG5hdlNlbGVjdGlvbi5zZWxlY3Rpb25NYXAuZ2V0KHNlcmlhbGl6ZXJJZCk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0cy50b0FycmF5KCkpOwotCQkJCWFjdGlvbiA9IENvbW1vbkRyb3BIYW5kbGVyU2VydmljZS5nZXRJbnN0YW5jZShuYXZTZWxlY3Rpb24udmlld2VySWQpLmdldEFjdGlvbkZvclNlcmlhbGl6ZXJJZChzZXJpYWxpemVySWQpOwotCQkJCWFjdGlvbi5ydW4oc2VsZWN0aW9uLCB0YXJnZXQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVNlcmlhbGl6ZXIgZ2V0U2VyaWFsaXplcigpIHsKLQkJaWYgKHNlcmlhbGl6ZXIgPT0gbnVsbCkKLQkJCXNlcmlhbGl6ZXIgPSBuZXcgTmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcigpOwotCQlyZXR1cm4gc2VyaWFsaXplcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL1NlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvU2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZTJlMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvU2VyaWFsaXplckNvbGxlY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JQbHVnaW47Ci0KLS8qKgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvciB7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2lvblBvaW50RWxlbWVudHMgewotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSSUFMSVpFUlMgPSAic2VyaWFsaXplcnMiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSSUFMSVpFUiA9ICJzZXJpYWxpemVyIjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRU1FTlQgPSAiZW5hYmxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudDsKLQotCXByaXZhdGUgU2VyaWFsaXplckRlc2NyaXB0b3JbXSBzZXJpYWxpemVyRWxlbWVudHM7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkcm9wSGFuZGxlcklkOwotCi0JcHJpdmF0ZSBNYXAgc2VyaWFsaXplckluZGV4OwotCi0JcHVibGljIFNlcmlhbGl6ZXJDb2xsZWN0aW9uRGVzY3JpcHRvcihTdHJpbmcgYURyb3BIYW5kbGVySWQsIElDb25maWd1cmF0aW9uRWxlbWVudCBhQ29uZmlndXJhdGlvbkVsZW1lbnQsIEV4cHJlc3Npb24gdGhlRGVmYXVsdEVuYWJsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJZHJvcEhhbmRsZXJJZCA9IGFEcm9wSGFuZGxlcklkOwotCQlBc3NlcnQuaXNOb3ROdWxsKGFDb25maWd1cmF0aW9uRWxlbWVudCk7Ci0JCWNvbmZpZ3VyYXRpb25FbGVtZW50ID0gYUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCQlpbml0KHRoZURlZmF1bHRFbmFibGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoRXhwcmVzc2lvbiBkZWZhdWx0RW5hYmxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGNvbmZpZ3VyYXRpb25FbGVtZW50LmdldENoaWxkcmVuKEV4dGVuc2lvblBvaW50RWxlbWVudHMuU0VSSUFMSVpFUik7Ci0JCXNlcmlhbGl6ZXJFbGVtZW50cyA9IG5ldyBTZXJpYWxpemVyRGVzY3JpcHRvcltlbGVtZW50cy5sZW5ndGhdOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJCXNlcmlhbGl6ZXJFbGVtZW50c1tpXSA9IG5ldyBTZXJpYWxpemVyRGVzY3JpcHRvcihkcm9wSGFuZGxlcklkLCBlbGVtZW50c1tpXSwgZGVmYXVsdEVuYWJsZW1lbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIFNlcmlhbGl6ZXJEZXNjcmlwdG9yW10gZ2V0U2VyaWFsaXplcnNFbmFibGVkRm9yKE9iamVjdCBlbGVtZW50KSB7Ci0KLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTZXJpYWxpemVyRGVzY3JpcHRvcltdIHNlcmlhbGl6ZXJBcnJheSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VyaWFsaXplckVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQotCQkJdHJ5IHsKLQkJCQkgaWYgKHNlcmlhbGl6ZXJFbGVtZW50c1tpXS5lbmFibGVtZW50LmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBlbGVtZW50KSkgPT0gRXZhbHVhdGlvblJlc3VsdC5UUlVFKQotCQkJCQkJcmVzdWx0cy5hZGQoc2VyaWFsaXplckVsZW1lbnRzW2ldKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCU5hdmlnYXRvclBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfSAgCi0JCSAKLQkJfQotCQlpZiAocmVzdWx0cy5zaXplKCkgPiAwKQotCQkJcmVzdWx0cy50b0FycmF5KChzZXJpYWxpemVyQXJyYXkgPSBuZXcgU2VyaWFsaXplckRlc2NyaXB0b3JbcmVzdWx0cy5zaXplKCldKSk7Ci0JCWVsc2UKLQkJCXNlcmlhbGl6ZXJBcnJheSA9IG5ldyBTZXJpYWxpemVyRGVzY3JpcHRvclswXTsKLQkJcmV0dXJuIHNlcmlhbGl6ZXJBcnJheTsKLQl9Ci0KLQlwdWJsaWMgU2VyaWFsaXplckRlc2NyaXB0b3IgZ2V0U2VyaWFsaXplckJ5SWQoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiAoU2VyaWFsaXplckRlc2NyaXB0b3IpIGdldFNlcmlhbGl6ZXJJbmRleCgpLmdldChpZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0U2VyaWFsaXplckluZGV4KCkgewotCQlpZiAoc2VyaWFsaXplckluZGV4ID09IG51bGwpIHsKLQkJCXNlcmlhbGl6ZXJJbmRleCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcmlhbGl6ZXJFbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJCQlzZXJpYWxpemVySW5kZXgucHV0KHNlcmlhbGl6ZXJFbGVtZW50c1tpXS5pZCwgc2VyaWFsaXplckVsZW1lbnRzW2ldKTsKLQkJfQotCQlyZXR1cm4gc2VyaWFsaXplckluZGV4OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvU2VyaWFsaXplckRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL1NlcmlhbGl6ZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjMxYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvU2VyaWFsaXplckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLkNvbW1vbk5hdmlnYXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmRuZC5TZXJpYWxpemVyQ29sbGVjdGlvbkRlc2NyaXB0b3IuRXh0ZW5zaW9uUG9pbnRFbGVtZW50czsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yIAotICoKLSAqLwotcHVibGljIGNsYXNzIFNlcmlhbGl6ZXJEZXNjcmlwdG9yIHsKLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgaWQ7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHNlcmlhbGl6ZXJFbGVtZW50OwotCi0JcHVibGljIEV4cHJlc3Npb24gZW5hYmxlbWVudDsKLQotCXByaXZhdGUgSVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKLQotCXB1YmxpYyBTZXJpYWxpemVyRGVzY3JpcHRvcihTdHJpbmcgZHJvcEhhbmRsZXJJZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHNlcmlhbGl6ZXIsIEV4cHJlc3Npb24gZHJhZ0VuYWJsZW1lbnQpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKHNlcmlhbGl6ZXIsIENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLlNlcmlhbGl6ZXJEZXNjcmlwdG9yXzApOwotCi0JCVN0cmluZyBsb2NhbElkID0gc2VyaWFsaXplci5nZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uUG9pbnRFbGVtZW50cy5BVFRfSUQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGxvY2FsSWQsIENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLlNlcmlhbGl6ZXJEZXNjcmlwdG9yXzEpOyAgCi0KLQkJdGhpcy5pZCA9IGRyb3BIYW5kbGVySWQgKyAiOiIgKyBsb2NhbElkOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuc2VyaWFsaXplckVsZW1lbnQgPSBzZXJpYWxpemVyOwotCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVuYWJsZW1lbnRDb25maWdFbGVtZW50ID0gdGhpcy5zZXJpYWxpemVyRWxlbWVudC5nZXRDaGlsZHJlbihFeHRlbnNpb25Qb2ludEVsZW1lbnRzLkVOQUJMRU1FTlQpOwotCi0JCWlmIChlbmFibGVtZW50Q29uZmlnRWxlbWVudC5sZW5ndGggPT0gMCkKLQkJCXRoaXMuZW5hYmxlbWVudCA9IGRyYWdFbmFibGVtZW50OyAKLQkJZWxzZSBpZiAoZW5hYmxlbWVudENvbmZpZ0VsZW1lbnQubGVuZ3RoID09IDEpIHsJCQkKLQkJCXRyeSB7Ci0JCQkJZW5hYmxlbWVudCA9IEVsZW1lbnRIYW5kbGVyLmdldERlZmF1bHQoKS5jcmVhdGUoCi0JCQkJCQlFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKSwgZW5hYmxlbWVudENvbmZpZ0VsZW1lbnRbMF0pOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJZW5hYmxlbWVudCA9IGRyYWdFbmFibGVtZW50OwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhOTFMuYmluZChDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5TZXJpYWxpemVyRGVzY3JpcHRvcl8zLCBuZXcgT2JqZWN0W117dGhpcy5pZH0pKTsKLQkJCWVuYWJsZW1lbnQgPSBkcmFnRW5hYmxlbWVudDsKLQkJfQotCX0KLQotCXB1YmxpYyBJU2VyaWFsaXplciBnZXRTZXJpYWxpemVyKCkgewotCQlpZiAoc2VyaWFsaXplciA9PSBudWxsKQotCQkJdHJ5IHsKLQkJCQlzZXJpYWxpemVyID0gKElTZXJpYWxpemVyKSBzZXJpYWxpemVyRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEV4dGVuc2lvblBvaW50RWxlbWVudHMuQVRUX0NMQVNTKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCU5hdmlnYXRvclBsdWdpbi5sb2coTkxTLmJpbmQoQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuU2VyaWFsaXplckRlc2NyaXB0b3JfNSwgbmV3IE9iamVjdFtde2lkLCBlLnRvU3RyaW5nKCl9KSk7ICAgCi0JCQkJc2VyaWFsaXplciA9IG51bGw7Ci0JCQl9Ci0JCXJldHVybiBzZXJpYWxpemVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL0JpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9CaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZmQwMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL0JpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLkNvbW1vbk5hdmlnYXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JQbHVnaW47Ci0KLWNsYXNzIEJpbmRpbmcgewotCi0JcHJpdmF0ZSBmaW5hbCBTZXQgcm9vdFBhdHRlcm5zID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgZmluYWwgU2V0IGluY2x1ZGVQYXR0ZXJucyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcml2YXRlIGZpbmFsIFNldCBleGNsdWRlUGF0dGVybnMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHX0VYVEVOU0lPTjsKLQotCXByb3RlY3RlZCBCaW5kaW5nKFN0cmluZyB0YWdFeHRlbnNpb24pIHsKLQkJVEFHX0VYVEVOU0lPTiA9IHRhZ0V4dGVuc2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLklOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yI2lzVmlzaWJsZUV4dGVuc2lvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZUV4dGVuc2lvbihTdHJpbmcgYW5FeHRlbnNpb25JZCkgewotCQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGluY2x1ZGVQYXR0ZXJucy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJcGF0dGVybiA9IChQYXR0ZXJuKSBpdHIubmV4dCgpOwotCQkJaWYgKHBhdHRlcm4ubWF0Y2hlcihhbkV4dGVuc2lvbklkKS5tYXRjaGVzKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGV4Y2x1ZGVQYXR0ZXJucy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJcGF0dGVybiA9IChQYXR0ZXJuKSBpdHIubmV4dCgpOwotCQkJaWYgKHBhdHRlcm4ubWF0Y2hlcihhbkV4dGVuc2lvbklkKS5tYXRjaGVzKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLklOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yI2lzUm9vdEV4dGVuc2lvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9vdEV4dGVuc2lvbihTdHJpbmcgYW5FeHRlbnNpb25JZCkgewotCQlpZiAocm9vdFBhdHRlcm5zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJvb3RQYXR0ZXJucy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJcGF0dGVybiA9IChQYXR0ZXJuKSBpdHIubmV4dCgpOwotCQkJaWYgKHBhdHRlcm4ubWF0Y2hlcihhbkV4dGVuc2lvbklkKS5tYXRjaGVzKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuSU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IjaGFzT3ZlcnJpZGRlblJvb3RFeHRlbnNpb25zKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPdmVycmlkZGVuUm9vdEV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiByb290UGF0dGVybnMuc2l6ZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25zdW1lSW5jbHVkZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsCi0JCQlib29sZWFuIHRvUmVzcGVjdFJvb3RzKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNUcnVlKE5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IuVEFHX0lOQ0xVREVTLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb250ZW50RXh0ZW5zaW9uUGF0dGVybnMgPSBlbGVtZW50Ci0JCQkJLmdldENoaWxkcmVuKFRBR19FWFRFTlNJT04pOwotCQlTdHJpbmcgaXNSb290U3RyaW5nID0gbnVsbDsKLQkJYm9vbGVhbiBpc1Jvb3QgPSBmYWxzZTsKLQkJU3RyaW5nIHBhdHRlcm5TdHJpbmcgPSBudWxsOwotCQlQYXR0ZXJuIGNvbXBpbGVkUGF0dGVybiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudEV4dGVuc2lvblBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9SZXNwZWN0Um9vdHMpIHsKLQkJCQlpc1Jvb3RTdHJpbmcgPSBjb250ZW50RXh0ZW5zaW9uUGF0dGVybnNbaV0KLQkJCQkJCS5nZXRBdHRyaWJ1dGUoTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvci5BVFRfSVNfUk9PVCk7Ci0JCQkJaXNSb290ID0gKGlzUm9vdFN0cmluZyAhPSBudWxsKSA/IEJvb2xlYW4udmFsdWVPZigKLQkJCQkJCWlzUm9vdFN0cmluZy50cmltKCkpLmJvb2xlYW5WYWx1ZSgpIDogZmFsc2U7Ci0JCQl9Ci0KLQkJCXBhdHRlcm5TdHJpbmcgPSBjb250ZW50RXh0ZW5zaW9uUGF0dGVybnNbaV0KLQkJCQkJLmdldEF0dHJpYnV0ZShOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yLkFUVF9QQVRURVJOKTsKLQkJCWlmIChwYXR0ZXJuU3RyaW5nID09IG51bGwpCi0JCQkJTmF2aWdhdG9yUGx1Z2luLmxvZ0Vycm9yKDAsIE5MUy5iaW5kKAotCQkJCQkJQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuQXR0cmlidXRlX01pc3NpbmdfV2FybmluZywKLQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IuQVRUX1BBVFRFUk4sCi0JCQkJCQkJCWVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkKLQkJCQkJCQkJCQkuZ2V0VW5pcXVlSWRlbnRpZmllcigpLAotCQkJCQkJCQllbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpCi0JCQkJCQkJCQkJLmdldE5hbWVzcGFjZSgpIH0pLCBudWxsKTsKLQkJCWVsc2UgewotCQkJCWNvbXBpbGVkUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuU3RyaW5nKTsKLQkJCQlpbmNsdWRlUGF0dGVybnMuYWRkKGNvbXBpbGVkUGF0dGVybik7Ci0JCQkJaWYgKHRvUmVzcGVjdFJvb3RzICYmIGlzUm9vdCkKLQkJCQkJcm9vdFBhdHRlcm5zLmFkZChjb21waWxlZFBhdHRlcm4pOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25zdW1lRXhjbHVkZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JCQl0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzVHJ1ZShOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yLlRBR19FWENMVURFUy5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29udGVudEV4dGVuc2lvblBhdHRlcm5zID0gZWxlbWVudAotCQkJCS5nZXRDaGlsZHJlbihUQUdfRVhURU5TSU9OKTsKLQkJU3RyaW5nIHBhdHRlcm5TdHJpbmcgPSBudWxsOwotCQlQYXR0ZXJuIGNvbXBpbGVkUGF0dGVybiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudEV4dGVuc2lvblBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0KLQkJCXBhdHRlcm5TdHJpbmcgPSBjb250ZW50RXh0ZW5zaW9uUGF0dGVybnNbaV0KLQkJCQkJLmdldEF0dHJpYnV0ZShOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yLkFUVF9QQVRURVJOKTsKLQkJCWlmIChwYXR0ZXJuU3RyaW5nID09IG51bGwpCi0JCQkJTmF2aWdhdG9yUGx1Z2luLmxvZ0Vycm9yKDAsIE5MUy5iaW5kKAotCQkJCQkJQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuQXR0cmlidXRlX01pc3NpbmdfV2FybmluZywKLQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IuQVRUX1BBVFRFUk4sCi0JCQkJCQkJCWVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkKLQkJCQkJCQkJCQkuZ2V0VW5pcXVlSWRlbnRpZmllcigpLAotCQkJCQkJCQllbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpCi0JCQkJCQkJCQkJLmdldE5hbWVzcGFjZSgpIH0pLCBudWxsKTsKLQkJCWVsc2UgewotCQkJCWNvbXBpbGVkUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuU3RyaW5nKTsKLQkJCQlleGNsdWRlUGF0dGVybnMuYWRkKGNvbXBpbGVkUGF0dGVybik7Ci0JCQl9Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvRGVsZWdhdGVDb21tb25MYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvRGVsZWdhdGVDb21tb25MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MTQxYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL0RlbGVnYXRlQ29tbW9uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JRXh0ZW5zaW9uU3RhdGVNb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGVDb21tb25MYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbW1vbkxhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBJTGFiZWxQcm92aWRlciBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXF1aXJlcyBhIG5vbi1udWxsIGxhYmVsIHByb3ZpZGVyIGFzIHRoZSBwYXJhbWV0ZXIuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBEZWxlZ2F0ZUNvbW1vbkxhYmVsUHJvdmlkZXIoSUxhYmVsUHJvdmlkZXIgYUxhYmVsUHJvdmlkZXIpIHsKLQkJc3VwZXIoKTsKLQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyID0gYUxhYmVsUHJvdmlkZXI7Ci0JfSAKLQotCS8qKgotCSAqIDxwPgotCSAqIE5vLW9wLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTGFiZWxQcm92aWRlciNpbml0aWFsaXplKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRXh0ZW5zaW9uU3RhdGVNb2RlbCBhU3RhdGVNb2RlbCwgSVRyZWVDb250ZW50UHJvdmlkZXIgYUNvbnRlbnRQcm92aWRlcikgewotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGI+bnVsbCA8L2I+LCBmb3JjaW5nIHRoZSBDb21tb25OYXZpZ2F0b3IgdG8gcHJvdmlkZSB0aGUgZGVmYXVsdCBtZXNzYWdlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTGFiZWxQcm92aWRlciNnZXREZXNjcmlwdGlvbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmVxdWFscyhvYmopOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmhhc2hDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGRlbGVnYXRlTGFiZWxQcm92aWRlci5pc0xhYmVsUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cmluZyBhVmlld2VySWQsIElUcmVlQ29udGVudFByb3ZpZGVyIGFDb250ZW50UHJvdmlkZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvRXh0ZW5zaW9uU3RhdGVNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL0V4dGVuc2lvblN0YXRlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhMjZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvRXh0ZW5zaW9uU3RhdGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkV2ZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUV4dGVuc2lvblN0YXRlTW9kZWw7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25TdGF0ZU1vZGVsIGV4dGVuZHMgRXZlbnRNYW5hZ2VyIGltcGxlbWVudHMKLQkJSUV4dGVuc2lvblN0YXRlTW9kZWwgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyB2aWV3ZXJJZDsKLQotCXByaXZhdGUgZmluYWwgTWFwIHZhbHVlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgRXh0ZW5zaW9uU3RhdGVNb2RlbChTdHJpbmcgYW5JZCwgU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlpZCA9IGFuSWQ7Ci0JCXZpZXdlcklkID0gYVZpZXdlcklkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZpZXdlcklkKCkgewotCQlyZXR1cm4gdmlld2VySWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcgYVByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gKFN0cmluZykgdmFsdWVzLmdldChhUHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIGFQcm9wZXJ0eU5hbWUpIHsKLQotCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgdmFsdWVzLmdldChhUHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIGIgIT0gbnVsbCA/IGIuYm9vbGVhblZhbHVlKCkgOiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEludFByb3BlcnR5KFN0cmluZyBhUHJvcGVydHlOYW1lKSB7Ci0JCUludGVnZXIgaSA9IChJbnRlZ2VyKSB2YWx1ZXMuZ2V0KGFQcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gaSAhPSBudWxsID8gaS5pbnRWYWx1ZSgpIDogLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIGFQcm9wZXJ0eU5hbWUsIFN0cmluZyBhUHJvcGVydHlWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSAoU3RyaW5nKSB2YWx1ZXMuZ2V0KGFQcm9wZXJ0eU5hbWUpOwotCQlTdHJpbmcgbmV3VmFsdWUgPSBhUHJvcGVydHlWYWx1ZTsKLQkJaWYoaGFzUHJvcGVydHlDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCXZhbHVlcy5wdXQoYVByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgYVByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIGFQcm9wZXJ0eU5hbWUsIGJvb2xlYW4gYVByb3BlcnR5VmFsdWUpIHsKLQkJQm9vbGVhbiBvbGRWYWx1ZSA9IChCb29sZWFuKSB2YWx1ZXMuZ2V0KGFQcm9wZXJ0eU5hbWUpOwotCQlCb29sZWFuIG5ld1ZhbHVlID0gYVByb3BlcnR5VmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQlpZihoYXNQcm9wZXJ0eUNoYW5nZWQob2xkVmFsdWUsIG5ld1ZhbHVlKSkgewotCi0JCQl2YWx1ZXMKLQkJCQkJLnB1dChhUHJvcGVydHlOYW1lLCBhUHJvcGVydHlWYWx1ZSA/IEJvb2xlYW4uVFJVRQotCQkJCQkJCTogQm9vbGVhbi5GQUxTRSk7IAotCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgYVByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludFByb3BlcnR5KFN0cmluZyBhUHJvcGVydHlOYW1lLCBpbnQgYVByb3BlcnR5VmFsdWUpIHsKLQkJSW50ZWdlciBvbGRWYWx1ZSA9IChJbnRlZ2VyKSB2YWx1ZXMuZ2V0KGFQcm9wZXJ0eU5hbWUpOwotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gbmV3IEludGVnZXIoYVByb3BlcnR5VmFsdWUpOwotCQlpZihoYXNQcm9wZXJ0eUNoYW5nZWQob2xkVmFsdWUsIG5ld1ZhbHVlKSkgewotCQkJdmFsdWVzLnB1dChhUHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBhUHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCWFkZExpc3RlbmVyT2JqZWN0KGFMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJcmVtb3ZlTGlzdGVuZXJPYmplY3QoYUxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBhUHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB2YWx1ZXMuZ2V0KGFQcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBhUHJvcGVydHlOYW1lLCBPYmplY3QgYVByb3BlcnR5VmFsdWUpIHsKLQotCQlPYmplY3Qgb2xkVmFsdWUgPSB2YWx1ZXMuZ2V0KGFQcm9wZXJ0eU5hbWUpOwotCQlPYmplY3QgbmV3VmFsdWUgPSBhUHJvcGVydHlWYWx1ZTsKLQkJaWYoaGFzUHJvcGVydHlDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCXZhbHVlcy5wdXQoYVByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgYVByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc1Byb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gb2xkVmFsdWUgPT0gbnVsbCB8fCAhb2xkVmFsdWUuZXF1YWxzKG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGFuRXZlbnQpIHsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKQotCQkJKChJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKS5wcm9wZXJ0eUNoYW5nZShhbkV2ZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JTmF2aWdhdG9yQ29udGVudEV4dFB0Q29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvSU5hdmlnYXRvckNvbnRlbnRFeHRQdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2MxYjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JTmF2aWdhdG9yQ29udGVudEV4dFB0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIElOYXZpZ2F0b3JDb250ZW50RXh0UHRDb25zdGFudHMgewotCi0JU3RyaW5nIFRBR19BQ1RJT05fUFJPVklERVIgPSAiYWN0aW9uUHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHX05BVklHQVRPUl9DT05URU5UID0gIm5hdmlnYXRvckNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHX0NPTU1PTl9XSVpBUkQgPSAiY29tbW9uV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFRBR19FTkFCTEVNRU5UID0gImVuYWJsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHX1RSSUdHRVJfUE9JTlRTID0gInRyaWdnZXJQb2ludHMiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHX1BPU1NJQkxFX0NISUxEUkVOID0gInBvc3NpYmxlQ2hpbGRyZW4iOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHX0RVUExJQ0FURV9DT05URU5UX0ZJTFRFUiA9ICJkdXBsaWNhdGVDb250ZW50RmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAkgCi0KLQlTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVF9ST09UX0xBQkVMID0gInJvb3RMYWJlbCI7IC8vJE5PTi1OTFMtMSQJIAotCi0JU3RyaW5nIEFUVF9QUklPUklUWSA9ICJwcmlvcml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRfSUNPTiA9ICJpY29uIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVF9BQ1RJVkVfQllfREVGQVVMVCA9ICJhY3RpdmVCeURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVRUX0NPTlRFTlRfUFJPVklERVIgPSAiY29udGVudFByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVF9MQUJFTF9QUk9WSURFUiA9ICJsYWJlbFByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVF9WSUVXRVJfRklMVEVSID0gInZpZXdlckZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRfQUNUSU9OX1BST1ZJREVSID0gImFjdGlvblByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJCAKLQotCVN0cmluZyBBVFRfU09SVEVSID0gInNvcnRlciI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRfREVQRU5EU19PTiA9ICJkZXBlbmRzT24iOyAvLyROT04tTkxTLTEkIAotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL0lOYXZpZ2F0b3JTaXRlRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvSU5hdmlnYXRvclNpdGVFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjNGNmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvSU5hdmlnYXRvclNpdGVFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLlRleHRBY3Rpb25IYW5kbGVyOwotCi0KLS8qKgotICogQW4gSU5hdmlnYXRvclNpdGVFZGl0b3IgaXMgdXNlZCB0byBlZGl0IChpLmUuLCByZW5hbWUpIGVsZW1lbnRzIGluIGEgTmF2aWdhdG9yVmlld2VyLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIDwvcD4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5hdmlnYXRvclNpdGVFZGl0b3IgewotCS8qKgotCSAqIFN0YXJ0cyB0aGUgZWRpdGluZy4gQW4gZWRpdG9yIGJveCB3aWxsIGJlIG92ZXJsYWlkIG9uIHRoZSBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSBOYXZpZ2F0b3IKLQkgKiB0cmVlLgotCSAqIAotCSAqIEBwYXJhbSBydW5uYWJsZQotCSAqICAgICAgICAgICAgUnVubmFibGUgdG8gZXhlY3V0ZSB3aGVuIGVkaXRpbmcgZW5kcyBzdWNjZXNzZnVsbHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0KFJ1bm5hYmxlIHJ1bm5hYmxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5ldyB0ZXh0LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIGVkaXRpbmcgd2FzIGNhbmNlbGxlZC4gRWRpdGluZyBpcwotCSAqIGNhbmNlbGxlZCB3aGVuIHRoZSB1c2VyIHByZXNzZWQgdGhlIEVzY2FwZSBrZXkuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV3IHRleHQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZWRpdGluZyB3YXMgY2FuY2VsbGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRleHQgaGFuZGxlciB0aGF0IGhhbmRsZXMgY3V0LCBjb3B5LCBwYXN0ZSwgZGVsZXRlIGFuZCBzZWxlY3QgYWxsIG9wZXJhdGlvbnMgd2l0aGluCi0JICogdGhlIGVkaXRvciBib3guCi0JICogCi0JICogQHBhcmFtIGFjdGlvbkhhbmRsZXIKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGFjdGlvbiBoYW5kbGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dEFjdGlvbkhhbmRsZXIoVGV4dEFjdGlvbkhhbmRsZXIgYWN0aW9uSGFuZGxlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvSWRlbnRpdHlDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvSWRlbnRpdHlDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YmM0MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL0lkZW50aXR5Q29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLS8qKgotKiA8cD4KLSogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0qIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSogPC9wPgotKiAKLSogQHNpbmNlIDMuMgotKi8KLXB1YmxpYyBjbGFzcyBJZGVudGl0eUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSWRlbnRpdHlDb21wYXJhdG9yIElOU1RBTkNFID0gbmV3IElkZW50aXR5Q29tcGFyYXRvcigpOwotCQotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbHZhbHVlLCBPYmplY3QgcnZhbHVlKSB7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCXJldHVybiB0aGlzID09IGFuT2JqZWN0OyAKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JbnNlcnRpb25Qb2ludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL0luc2VydGlvblBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZDZlMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL0luc2VydGlvblBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zOwotCi0vKioKLSAqIEEgZGVzY3JpcHRpdmUgY29uc3RydWN0IHRvIHJlbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgbWVudSBpbnNlcnRpb24gcG9pbnQ7Ci0gKiBpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlIGluc2VydGlvbiBwb2ludCBhbmQgd2hldGhlciB0aGUgaXRlbSBzaG91bGQgYmUKLSAqIHJlbmRlcmVkIGFzIGEgc2VwYXJhdG9yIG9yIGdyb3VwIG1hcmtlci4KLSAqIAotICogQHNpbmNlIDMuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnNlcnRpb25Qb2ludCB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1NlcGFyYXRvcjsKLQkKLQlwcml2YXRlIFN0cmluZyB0b1N0cmluZzsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgdGhhdCBjbGllbnRzIHdpbGwgcmVmZXIgdG8gd2hlbiBpbnNlcnRpbmcgaXRlbXMgaW50bwotCSAqICAgICAgICAgICAgdGhlIG1lbnUgYXQgdGhpcyBwb2ludC4KLQkgKiBAcGFyYW0gdG9NYWtlQVNlcGFyYXRvcgotCSAqICAgICAgICAgICAgQSB2YWx1ZSBvZiB0cnVlIHdpbGwgY2F1c2UgdGhlIHBvaW50IHRvIGJlIHJlbmRlcmVkIGFzIGEKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3IgKGEgImJhciIgaW4gdGhlIG1lbnUpOwotCSAqICAgICAgICAgICAgZmFsc2Ugd2lsbCBjYXVzZSB0aGUgcG9pbnQgdG8gYmUgcmVuZGVyZWQgYXMgYQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyLgotCSAqLwotCXB1YmxpYyBJbnNlcnRpb25Qb2ludChTdHJpbmcgYU5hbWUsIGJvb2xlYW4gdG9NYWtlQVNlcGFyYXRvcikgewotCQluYW1lID0gYU5hbWU7Ci0JCWlzU2VwYXJhdG9yID0gdG9NYWtlQVNlcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBvaW50IHNob3VsZCBiZSByZW5kZXJlZCBhcyBhCi0JICogICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yIChhICJiYXIiIGluIHRoZSBtZW51KTsgb3IKLQkgKiAgICAgICAgIGZhbHNlIGlmIHRoZSBwb2ludCBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYQotCSAqICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VwYXJhdG9yKCkgewotCQlyZXR1cm4gaXNTZXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgbmFtZSB0aGF0IGNsaWVudHMgd2lsbCByZWZlciB0byB3aGVuIGluc2VydGluZyBpdGVtcyBpbnRvIHRoZQotCSAqICAgICAgICAgbWVudSBhdCB0aGlzIHBvaW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgCi0JCWlmKHRvU3RyaW5nID09IG51bGwpCi0JCQl0b1N0cmluZyA9ICJJbnNlcnRpb25Qb2ludFtuYW1lPVwiIituYW1lKyJcIiwgaXNTZXBhcmF0b3I9Iitpc1NlcGFyYXRvcisiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiB0b1N0cmluZzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL0xpbmtIZWxwZXJEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTGlua0hlbHBlckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4ODI0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTGlua0hlbHBlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSUV2YWx1YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklMaW5rSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBMaW5rSGVscGVyRGVzY3JpcHRvciB7Ci0KLQlwcml2YXRlIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQkvKiBNYXkgYmUgbnVsbCAqLwotCXByaXZhdGUgU3RyaW5nIG5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb25JZDsKLQotCXByaXZhdGUgSUxpbmtIZWxwZXIgbGlua0hlbHBlcjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfSEVMUEVSID0gImxpbmtIZWxwZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQVZJR0FUT1JfQ09OVEVOVF9FWFRFTlNJT05fSUQgPSAibmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbklkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHByZXNzaW9uIGVkaXRvcklucHV0RW5hYmxlbWVudDsKLQotCS8qIFRoZSBmb2xsb3dpbmcgZmllbGQgbWF5IGJlIG51bGwgKi8KLQlwcml2YXRlIEV4cHJlc3Npb24gc2VsZWN0aW9uRW5hYmxlbWVudDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSU5QVVRfRU5BQkxFTUVOVCA9ICJlZGl0b3JJbnB1dEVuYWJsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OX0VOQUJMRU1FTlQgPSAic2VsZWN0aW9uRW5hYmxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBMaW5rSGVscGVyRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGVsZW1lbnQsICJMaW5rSGVscGVyUmVnaXN0cnkuRGVzY3JpcHRvciBvYmplY3RzIGNhbm5vdCBiZSBudWxsLiIpOyAgIC8vJE5PTi1OTFMtMSQKLQkJQXNzZXJ0LmlzTGVnYWwoTElOS19IRUxQRVIuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSwgIkxpbmtIZWxwZXJSZWdpc3RyeS5EZXNjcmlwdG9yIG9iamVjdHMgbXVzdCBoYXZlIHRoZSBuYW1lIFwibGlua0hlbHBlclwiLiIpOyAgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmNvbmZpZ0VsZW1lbnQgPSBlbGVtZW50OwotCQlpbml0KCk7Ci0JfQotCi0Jdm9pZCBpbml0KCkgewotCQlpZCA9IHRoaXMuY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZXhwcmVzc2lvbnMgPSB0aGlzLmNvbmZpZ0VsZW1lbnQuZ2V0Q2hpbGRyZW4oRURJVE9SX0lOUFVUX0VOQUJMRU1FTlQpOwotCQlBc3NlcnQuaXNMZWdhbChleHByZXNzaW9ucy5sZW5ndGggPT0gMSwgIlRoZSBsaW5rSGVscGVyIGV4dGVuc2lvbiBwb2ludCByZXF1aXJlcyBleGFjdGx5IG9uZSBlZGl0b3JJbnB1dEVuYWJsZW1lbnQgY2hpbGQuIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWVkaXRvcklucHV0RW5hYmxlbWVudCA9IEVsZW1lbnRIYW5kbGVyLmdldERlZmF1bHQoKS5jcmVhdGUoCi0JCQkJCUV4cHJlc3Npb25Db252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLCBleHByZXNzaW9uc1swXSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQlleHByZXNzaW9ucyA9IHRoaXMuY29uZmlnRWxlbWVudC5nZXRDaGlsZHJlbihTRUxFQ1RJT05fRU5BQkxFTUVOVCk7Ci0JCWlmIChleHByZXNzaW9ucy5sZW5ndGggPiAwKSB7Ci0JCQkvKiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZSBpcyBvcHRpb25hbCAqLwotCQkJbmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbklkID0gZXhwcmVzc2lvbnNbMF0uZ2V0QXR0cmlidXRlKEFUVF9OQVZJR0FUT1JfQ09OVEVOVF9FWFRFTlNJT05fSUQpOwotCQkJaWYgKGV4cHJlc3Npb25zWzBdLmdldENoaWxkcmVuKCkgIT0gbnVsbCAmJiBleHByZXNzaW9uc1swXS5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKLQkJCQl0cnkgewotCQkJCQlzZWxlY3Rpb25FbmFibGVtZW50ID0gRWxlbWVudEhhbmRsZXIuZ2V0RGVmYXVsdCgpLmNyZWF0ZSgKLQkJCQkJCQlFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKSwgZXhwcmVzc2lvbnNbMF0pOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlOYXZpZ2F0b3JQbHVnaW4ubG9nKElTdGF0dXMuRVJST1IsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9CQkJCQkgCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgSUxpbmtIZWxwZXIgZ2V0TGlua0hlbHBlcigpIHsKLQkJaWYgKGxpbmtIZWxwZXIgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlsaW5rSGVscGVyID0gKElMaW5rSGVscGVyKSB0aGlzLmNvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlua0hlbHBlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRGb3IoSUVkaXRvcklucHV0IGFuSW5wdXQpIHsKLQotCQlpZiAoZWRpdG9ySW5wdXRFbmFibGVtZW50ID09IG51bGwgfHwgYW5JbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKGVkaXRvcklucHV0RW5hYmxlbWVudC5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgYW5JbnB1dCkpID09IEV2YWx1YXRpb25SZXN1bHQuVFJVRSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOyAKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRGb3IoU3RyaW5nIGFOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uSWQpIHsKLQkJcmV0dXJuIChuYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uSWQgIT0gbnVsbCkgPyBuYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uSWQuZXF1YWxzKGFOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uSWQpIDogZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkRm9yKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbkVuYWJsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0KLQkJSXRlcmF0b3IgZWxlbWVudHMgPSBhU2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCWNvbnRleHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgZWxlbWVudHMubmV4dCgpKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHNlbGVjdGlvbkVuYWJsZW1lbnQuZXZhbHVhdGUoY29udGV4dCkgPT0gRXZhbHVhdGlvblJlc3VsdC5GQUxTRSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOyAKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL0xpbmtIZWxwZXJSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL0xpbmtIZWxwZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmJiYTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9MaW5rSGVscGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTGlua0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvclBsdWdpbjsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGlua0hlbHBlclJlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyIENPTlRFTlRfREVTQ1JJUFRPUl9SRUdJU1RSWSA9IE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yTWFuYWdlcgotCQkJLmdldEluc3RhbmNlKCk7Ci0gCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTGlua0hlbHBlcltdIE5PX0xJTktfSEVMUEVSUyA9IG5ldyBJTGlua0hlbHBlclswXTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBMaXN0IGRlc2NyaXB0b3JzOyAKLQotCXByaXZhdGUgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGNvbnRlbnRTZXJ2aWNlOwotCi0JcHVibGljIExpbmtIZWxwZXJSZWdpc3RyeShJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgYUNvbnRlbnRTZXJ2aWNlKSB7Ci0JCXN1cGVyKE5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQsIExpbmtIZWxwZXJEZXNjcmlwdG9yLkxJTktfSEVMUEVSKTsKLQkJY29udGVudFNlcnZpY2UgPSBhQ29udGVudFNlcnZpY2U7Ci0JfQotIAotCi0JLy8gVE9ETyBEZWZpbmUgbW9yZSBleHBsaWNpdGx5IHRoZSBleHBlY3RlZCBvcmRlciB0aGF0IExpbmtIZWxwZXJzIHdpbGwgYmUKLQkvLyByZXR1cm5lZAotCXB1YmxpYyBJTGlua0hlbHBlcltdIGdldExpbmtIZWxwZXJzRm9yKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQotCQlpZiAoYVNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gTk9fTElOS19IRUxQRVJTOwotCi0JCVNldCBjb250ZW50RGVzY3JpcHRvcnMgPSBDT05URU5UX0RFU0NSSVBUT1JfUkVHSVNUUlkKLQkJCQkuZ2V0RW5hYmxlZENvbnRlbnREZXNjcmlwdG9ycyhhU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpLAotCQkJCQkJY29udGVudFNlcnZpY2UuZ2V0Vmlld2VyRGVzY3JpcHRvcigpKTsKLQkJaWYgKGNvbnRlbnREZXNjcmlwdG9ycy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gTk9fTElOS19IRUxQRVJTOwotCi0JCS8qIFVzZSB0aGUgZmlyc3QgTmF2aWdhdG9yIENvbnRlbnQgTGlua0hlbHBlckRlc2NyaXB0b3IgZm9yIG5vdyAqLwotCQlJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IgY29udGVudERlc2NyaXB0b3IgPSAoSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yKSBjb250ZW50RGVzY3JpcHRvcnMKLQkJCQkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJTGlzdCBoZWxwZXJzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUxpbmtIZWxwZXJbXSBoZWxwZXJzID0gTk9fTElOS19IRUxQRVJTOwotCQlMaW5rSGVscGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdHIgPSBnZXREZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlkZXNjcmlwdG9yID0gKExpbmtIZWxwZXJEZXNjcmlwdG9yKSBpdHIubmV4dCgpOwotCQkJaWYgKGRlc2NyaXB0b3IuaXNFbmFibGVkRm9yKGNvbnRlbnREZXNjcmlwdG9yLmdldElkKCkpKQotCQkJCWhlbHBlcnNMaXN0LmFkZChkZXNjcmlwdG9yLmdldExpbmtIZWxwZXIoKSk7Ci0JCQllbHNlIGlmIChkZXNjcmlwdG9yLmlzRW5hYmxlZEZvcihhU2VsZWN0aW9uKSkKLQkJCQloZWxwZXJzTGlzdC5hZGQoZGVzY3JpcHRvci5nZXRMaW5rSGVscGVyKCkpOwotCQl9Ci0JCWlmIChoZWxwZXJzTGlzdC5zaXplKCkgPiAwKQotCQkJaGVscGVyc0xpc3QKLQkJCQkJLnRvQXJyYXkoKGhlbHBlcnMgPSBuZXcgSUxpbmtIZWxwZXJbaGVscGVyc0xpc3Quc2l6ZSgpXSkpOwotCi0JCXJldHVybiBoZWxwZXJzOwotCX0KLQotCXB1YmxpYyBJTGlua0hlbHBlcltdIGdldExpbmtIZWxwZXJzRm9yKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlMaXN0IGhlbHBlcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJTGlua0hlbHBlcltdIGhlbHBlcnMgPSBuZXcgSUxpbmtIZWxwZXJbMF07Ci0JCUxpbmtIZWxwZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGdldERlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCWRlc2NyaXB0b3IgPSAoTGlua0hlbHBlckRlc2NyaXB0b3IpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoZGVzY3JpcHRvci5pc0VuYWJsZWRGb3IoaW5wdXQpKQotCQkJCWhlbHBlcnNMaXN0LmFkZChkZXNjcmlwdG9yLmdldExpbmtIZWxwZXIoKSk7Ci0JCX0KLQkJaWYgKGhlbHBlcnNMaXN0LnNpemUoKSA+IDApCi0JCQloZWxwZXJzTGlzdAotCQkJCQkudG9BcnJheSgoaGVscGVycyA9IG5ldyBJTGlua0hlbHBlcltoZWxwZXJzTGlzdC5zaXplKCldKSk7Ci0KLQkJcmV0dXJuIGhlbHBlcnM7Ci0JfQotCi0gCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKExpbmtIZWxwZXJEZXNjcmlwdG9yLkxJTktfSEVMUEVSLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCWdldERlc2NyaXB0b3JzKCkuYWRkKG5ldyBMaW5rSGVscGVyRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldERlc2NyaXB0b3JzKCkgewotCQlpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbCkKLQkJCWRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL05hdmlnYXRvckFjdGl2aXR5SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTmF2aWdhdG9yQWN0aXZpdHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5NDZmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTmF2aWdhdG9yQWN0aXZpdHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMTIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBsdWdpbkNvbnRyaWJ1dGlvbjsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgTmF2aWdhdG9yQWN0aXZpdHlIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aXZpdHlFbmFibGVkKE5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCS8vIFRPRE8gRklYVVAgTURFCi0JCXJldHVybiB0cnVlOwotCQkvLwkJZmluYWwgU3RyaW5nIGxvY2FsSUQgPSBleHRlbnNpb24uZ2V0TmF2aWdhdG9yRXh0ZW5zaW9uSWQoKTsKLQkJLy8JCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudCgpOwotCQkvLwkJU3RyaW5nIHRlbXBQbHVnaW5JRCA9IG51bGw7Ci0JCS8vCQl0cnkgewotCQkvLwkJCXRlbXBQbHVnaW5JRCA9ICgoQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JCS8vIGVsZW1lbnQpLmdldFBhcmVudEV4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0JCS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkvLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCS8vCQl9Ci0JCS8vCQlib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCQkvLwkJaWYgKG51bGwgIT0gdGVtcFBsdWdpbklEKSB7Ci0JCS8vCQkJZmluYWwgU3RyaW5nIHBsdWdpbklEID0gdGVtcFBsdWdpbklEOwotCQkvLwkJCUlQbHVnaW5Db250cmlidXRpb24gY29udHJpYnV0aW9uID0gbmV3IElQbHVnaW5Db250cmlidXRpb24oKSB7Ci0JCS8vCQkJCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxJZCgpIHsKLQkJLy8JCQkJCXJldHVybiBsb2NhbElEOwotCQkvLwkJCQl9Ci0JCS8vCi0JCS8vCQkJCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCS8vCQkJCQlyZXR1cm4gcGx1Z2luSUQ7Ci0JCS8vCQkJCX0KLQkJLy8JCQl9OwotCQkvLwkJCUlXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0ID0KLQkJLy8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKTsKLQkJLy8JCQlJSWRlbnRpZmllciBpZGVudGlmaWVyID0KLQkJLy8gd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0LmdldEFjdGl2aXR5TWFuYWdlcigpLmdldElkZW50aWZpZXIoY3JlYXRlVW5pZmllZElkKGNvbnRyaWJ1dGlvbikpOwotCQkvLwkJCWVuYWJsZWQgPSBpZGVudGlmaWVyLmlzRW5hYmxlZCgpOwotCQkvLwkJfQotCQkvLwkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY3JlYXRlVW5pZmllZElkKElQbHVnaW5Db250cmlidXRpb24gY29udHJpYnV0aW9uKSB7Ci0JCWlmIChjb250cmlidXRpb24uZ2V0UGx1Z2luSWQoKSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbnRyaWJ1dGlvbi5nZXRQbHVnaW5JZCgpICsgJy8nICsgY29udHJpYnV0aW9uLmdldExvY2FsSWQoKTsKLQkJcmV0dXJuIGNvbnRyaWJ1dGlvbi5nZXRMb2NhbElkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL05hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5M2Q0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSUV2YWx1YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGx1Z2luQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLkNvbW1vbk5hdmlnYXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5DdXN0b21BbmRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JQbHVnaW47Ci0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudDwvY29kZT4KLSAqIGV4dGVuc2lvbiBwb2ludC4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IgaW1wbGVtZW50cwotCQlJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IsIElOYXZpZ2F0b3JDb250ZW50RXh0UHRDb25zdGFudHMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlcltdIE5PX1ZJRVdFUl9GSUxURVJTID0gbmV3IElOYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXJbMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBOT19EVVBMSUNBVEVfQ09OVEVOVF9GSUxURVJTID0gbmV3IElDb25maWd1cmF0aW9uRWxlbWVudFswXTsKLSAKLQlwcml2YXRlIFN0cmluZyBpZDsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgcm9vdExhYmVsOwotCi0JcHJpdmF0ZSBpbnQgcHJpb3JpdHkgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQotCXByaXZhdGUgRXhwcmVzc2lvbiBlbmFibGVtZW50OwotCi0JcHJpdmF0ZSBFeHByZXNzaW9uIHBvc3NpYmxlQ2hpbGRyZW47Ci0KLQlwcml2YXRlIGJvb2xlYW4gcm9vdDsKLQotCXByaXZhdGUgU3RyaW5nIGljb247Ci0KLQlwcml2YXRlIFN0cmluZyBkZWNsYXJpbmdQbHVnaW5JZDsKLQotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkQnlEZWZhdWx0OwotCi0JcHJpdmF0ZSBJUGx1Z2luQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNMb2FkaW5nRmFpbGVkOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBkdXBsaWNhdGVDb250ZW50RmlsdGVyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRlbnQgZGVzY3JpcHRvciBmcm9tIGEgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdFbGVtZW50Ci0JICogICAgICAgICAgICBjb25maWd1cmF0aW9uIGVsZW1lbnQgdG8gY3JlYXRlIGEgZGVzY3JpcHRvciBmcm9tCi0JICogCi0JICogQHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQuIFJlYXNvbnMKLQkgKiAgICAgICAgICAgICBpbmNsdWRlOgotCSAqICAgICAgICAgICAgIDx1bD4KLQkgKiAgICAgICAgICAgICA8bGk+QSByZXF1aXJlZCBhdHRyaWJ1dGUgaXMgbWlzc2luZy48L2xpPgotCSAqICAgICAgICAgICAgIDxsaT5Nb3JlIGVsZW1lbnRzIGFyZSBkZWZpbmUgdGhhbiBpcyBhbGxvd2VkLjwvbGk+Ci0JICogICAgICAgICAgICAgPC91bD4KLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpCi0JCQl0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudDsKLQkJcmVhZENvbmZpZ0VsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBjb250ZW50IGV4dGVuc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gc2VsZWN0aW9uLgotCSAqIFRoZSBjb250ZW50IGV4dGVuc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgc2VsZWN0aW9uIGlmIGFuZCBvbmx5IGlmIGl0IGlzCi0JICogZW5hYmxlZCBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGFTdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgc2VsZWN0aW9uIGZyb20gdGhlIHZpZXdlcgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgZm9yIGVhY2ggZWxlbWVudCBpbgotCSAqICAgICAgICAgdGhlIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRGb3IoSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJaWYgKGVuYWJsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0KLQkJSXRlcmF0b3IgZWxlbWVudHMgPSBhU3RydWN0dXJlZFNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQl3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0JCQljb250ZXh0ID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KG51bGwsIGVsZW1lbnRzLm5leHQoKSk7Ci0JCQl0cnkgewotCQkJCWlmIChlbmFibGVtZW50LmV2YWx1YXRlKGNvbnRleHQpID09IEV2YWx1YXRpb25SZXN1bHQuRkFMU0UpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCU5hdmlnYXRvclBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBjb250ZW50IGV4dGVuc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYW5FbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgZXZhbHVhdGlvbi4KLQkgKiBAcmV0dXJuIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGV4dGVuc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRGb3IoT2JqZWN0IGFuRWxlbWVudCkgewotCi0JCWlmIChlbmFibGVtZW50ID09IG51bGwgfHwgYW5FbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoZW5hYmxlbWVudC5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgYW5FbGVtZW50KSkgPT0gRXZhbHVhdGlvblJlc3VsdC5UUlVFKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlOYXZpZ2F0b3JQbHVnaW4ubG9nKElTdGF0dXMuRVJST1IsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIHRoaXMgY29udGVudCBleHRlbnNpb24gY291bGQgcHJvdmlkZSB0aGUgZ2l2ZW4gZWxlbWVudCBhcyBhCi0JICogY2hpbGQuCi0JICogCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcGFyZW50IG9mIGFuIGVsZW1lbnQgY291bGQgYmUKLQkgKiBmb3IgTGluayB3aXRoIEVkaXRvciBzdXBwb3J0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5FbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgZXZhbHVhdGlvbi4KLQkgKiBAcmV0dXJuIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGV4dGVuc2lvbiBtaWdodCBwcm92aWRlIGFuIG9iamVjdCBvZiB0aGlzCi0JICogICAgICAgICB0eXBlIGFzIGEgY2hpbGQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQb3NzaWJsZUNoaWxkKE9iamVjdCBhbkVsZW1lbnQpIHsKLQotCQlpZiAoKGVuYWJsZW1lbnQgPT0gbnVsbCAmJiBwb3NzaWJsZUNoaWxkcmVuID09IG51bGwpCi0JCQkJfHwgYW5FbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCWlmIChwb3NzaWJsZUNoaWxkcmVuICE9IG51bGwpCi0JCQkJcmV0dXJuIChwb3NzaWJsZUNoaWxkcmVuLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLAotCQkJCQkJYW5FbGVtZW50KSkgPT0gRXZhbHVhdGlvblJlc3VsdC5UUlVFKTsKLQkJCWVsc2UgaWYgKGVuYWJsZW1lbnQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gKGVuYWJsZW1lbnQuZXZhbHVhdGUobmV3IEV2YWx1YXRpb25Db250ZXh0KG51bGwsCi0JCQkJCQlhbkVsZW1lbnQpKSA9PSBFdmFsdWF0aW9uUmVzdWx0LlRSVUUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCU5hdmlnYXRvclBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLklOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5JTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IjZ2V0UHJpb3JpdHkoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7Ci0JCXJldHVybiBwcmlvcml0eTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLklOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciNpc1Jvb3QoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9vdCgpIHsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhIGxhYmVsIHRvIGJlIHVzZWQgdG8gZGVsYXkgdGhlIGxvYWRpbmcgLS0gdXNlZCBmb3IgYSBjb250ZW50Ci0JICogICAgICAgICBleHRlbnNpb24gdGhhdCBjb250cmlidXRlcyBhIHNpbmdsZSByb290IGVsZW1lbnQKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJvb3RMYWJlbCgpIHsKLQkJcmV0dXJuIHJvb3RMYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKiAKLQkgKiBAdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgY291bGQgbm90IGJlIHBhcnNlZC4gUmVhc29ucwotCSAqICAgICAgICAgICAgIGluY2x1ZGU6Ci0JICogICAgICAgICAgICAgPHVsPgotCSAqICAgICAgICAgICAgIDxsaT5BIHJlcXVpcmVkIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLjwvbGk+Ci0JICogICAgICAgICAgICAgPGxpPk1vcmUgZWxlbWVudHMgYXJlIGRlZmluZSB0aGFuIGlzIGFsbG93ZWQuPC9saT4KLQkgKiAgICAgICAgICAgICA8L3VsPgotCSAqLwotCXZvaWQgcmVhZENvbmZpZ0VsZW1lbnQoKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQkJaWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQluYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotCQlTdHJpbmcgcHJpb3JpdHlTdHJpbmcgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJJT1JJVFkpOwotCQlpY29uID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lDT04pOwotCQlyb290TGFiZWwgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUk9PVF9MQUJFTCk7Ci0KLQkJZGVjbGFyaW5nUGx1Z2luSWQgPSBjb25maWdFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpCi0JCQkJLmdldE5hbWVzcGFjZSgpOwotCQlTdHJpbmcgZW5hYmxlZEJ5RGVmYXVsdFN0cmluZyA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkuZ2V0QXR0cmlidXRlKEFUVF9BQ1RJVkVfQllfREVGQVVMVCk7Ci0JCWVuYWJsZWRCeURlZmF1bHQgPSAoZW5hYmxlZEJ5RGVmYXVsdFN0cmluZyAhPSBudWxsICYmIGVuYWJsZWRCeURlZmF1bHRTdHJpbmcKLQkJCQkubGVuZ3RoKCkgPiAwKSA/IEJvb2xlYW4udmFsdWVPZigKLQkJCQljb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQUNUSVZFX0JZX0RFRkFVTFQpKQotCQkJCS5ib29sZWFuVmFsdWUoKSA6IHRydWU7Ci0KLQkJaWYgKHByaW9yaXR5U3RyaW5nICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJUHJpb3JpdHkgcCA9IFByaW9yaXR5LmdldChwcmlvcml0eVN0cmluZyk7Ci0JCQkJcHJpb3JpdHkgPSBwICE9IG51bGwgPyBwLmdldFZhbHVlKCkgOiAtMTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCX0KLQkJfQotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFdvcmtiZW5jaEV4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuQXR0cmlidXRlX01pc3NpbmdfV2FybmluZywKLQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQlBVFRfSUQsCi0JCQkJCQkJY29uZmlnRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKQotCQkJCQkJCQkJLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwKLQkJCQkJCQljb25maWdFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpCi0JCQkJCQkJCQkuZ2V0TmFtZXNwYWNlKCkgfSkpOwotCQl9Ci0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWdFbGVtZW50Ci0JCQkJLmdldENoaWxkcmVuKFRBR19FTkFCTEVNRU5UKTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7Ci0KLQkJCWNoaWxkcmVuID0gY29uZmlnRWxlbWVudC5nZXRDaGlsZHJlbihUQUdfVFJJR0dFUl9QT0lOVFMpOwotCQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAxKSB7Ci0JCQkJZW5hYmxlbWVudCA9IG5ldyBDdXN0b21BbmRFeHByZXNzaW9uKGNoaWxkcmVuWzBdKTsKLQkJCX0gZWxzZSBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkgewotCQkJCXRocm93IG5ldyBXb3JrYmVuY2hFeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQlDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5BdHRyaWJ1dGVfTWlzc2luZ19XYXJuaW5nLAotCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJVEFHX1RSSUdHRVJfUE9JTlRTLAotCQkJCQkJCQljb25maWdFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpCi0JCQkJCQkJCQkJLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwKLQkJCQkJCQkJY29uZmlnRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKQotCQkJCQkJCQkJCS5nZXROYW1lc3BhY2UoKSB9KSk7Ci0JCQl9Ci0KLQkJCWNoaWxkcmVuID0gY29uZmlnRWxlbWVudC5nZXRDaGlsZHJlbihUQUdfUE9TU0lCTEVfQ0hJTERSRU4pOwotCQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAxKSB7Ci0JCQkJcG9zc2libGVDaGlsZHJlbiA9IG5ldyBDdXN0b21BbmRFeHByZXNzaW9uKGNoaWxkcmVuWzBdKTsKLQkJCX0gZWxzZSBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkgewotCQkJCXRocm93IG5ldyBXb3JrYmVuY2hFeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQlDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5BdHRyaWJ1dGVfTWlzc2luZ19XYXJuaW5nLAotCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJVEFHX1BPU1NJQkxFX0NISUxEUkVOLAotCQkJCQkJCQljb25maWdFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpCi0JCQkJCQkJCQkJLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwKLQkJCQkJCQkJY29uZmlnRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKQotCQkJCQkJCQkJCS5nZXROYW1lc3BhY2UoKSB9KSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDEpIHsKLQkJCXRyeSB7Ci0JCQkJZW5hYmxlbWVudCA9IEVsZW1lbnRIYW5kbGVyLmdldERlZmF1bHQoKS5jcmVhdGUoCi0JCQkJCQlFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKSwgY2hpbGRyZW5bMF0pOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkgewotCQkJdGhyb3cgbmV3IFdvcmtiZW5jaEV4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuQXR0cmlidXRlX01pc3NpbmdfV2FybmluZywKLQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQlUQUdfRU5BQkxFTUVOVCwKLQkJCQkJCQljb25maWdFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpCi0JCQkJCQkJCQkuZ2V0VW5pcXVlSWRlbnRpZmllcigpLAotCQkJCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkKLQkJCQkJCQkJCS5nZXROYW1lc3BhY2UoKSB9KSk7Ci0JCX0KLQotCQljb250cmlidXRpb24gPSBuZXcgSVBsdWdpbkNvbnRyaWJ1dGlvbigpIHsKLQotCQkJcHVibGljIFN0cmluZyBnZXRMb2NhbElkKCkgewotCQkJCXJldHVybiBjb25maWdFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpCi0JCQkJCQkuZ2V0U2ltcGxlSWRlbnRpZmllcigpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQkJCXJldHVybiBjb25maWdFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpCi0JCQkJCQkuZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCQkJfQotCi0JCX07Ci0KLQkJY2hpbGRyZW4gPSBjb25maWdFbGVtZW50LmdldENoaWxkcmVuKFRBR19EVVBMSUNBVEVfQ09OVEVOVF9GSUxURVIpOwotCQlkdXBsaWNhdGVDb250ZW50RmlsdGVyRWxlbWVudHMgPSBjaGlsZHJlbiAhPSBudWxsID8gY2hpbGRyZW4KLQkJCQk6IE5PX0RVUExJQ0FURV9DT05URU5UX0ZJTFRFUlM7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgb3Igbm90IHRoZSByZWNlaXZlciBpcyBhIHJvb3QgbmF2aWdhdG9yIGV4dGVuc2lvbgotCSAqIAotCSAqIEBwYXJhbSByb290Ci0JICogICAgICAgICAgICB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIHJvb3QgbmF2aWdhdG9yIGV4dGVuc2lvbi4gZmFsc2UgaWYKLQkgKiAgICAgICAgICAgIHRoZSByZWNlaXZlciBpcyBub3QgYSByb290IG5hdmlnYXRvciBleHRlbnNpb24uCi0JICovCi0Jdm9pZCBzZXRSb290KGJvb2xlYW4gcm9vdCkgewotCQl0aGlzLnJvb3QgPSByb290OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWNvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEljb24oKSB7Ci0JCXJldHVybiBpY29uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVjbGFyaW5nUGx1Z2luSWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIGRlY2xhcmluZ1BsdWdpbklkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yI2lzRW5hYmxlZEJ5RGVmYXVsdCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkQnlEZWZhdWx0KCkgewotCQlyZXR1cm4gZW5hYmxlZEJ5RGVmYXVsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbnRyaWJ1dGlvbi4KLQkgKi8KLQlwdWJsaWMgSVBsdWdpbkNvbnRyaWJ1dGlvbiBnZXRDb250cmlidXRpb24oKSB7Ci0JCXJldHVybiBjb250cmlidXRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5JTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IjaGFzTG9hZGluZ0ZhaWxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTG9hZGluZ0ZhaWxlZCgpIHsKLQkJcmV0dXJuIGhhc0xvYWRpbmdGYWlsZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldER1cGxpY2F0ZUNvbnRlbnRGaWx0ZXJFbGVtZW50cygpIHsKLQkJcmV0dXJuIGR1cGxpY2F0ZUNvbnRlbnRGaWx0ZXJFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBkdXBsaWNhdGUgY29udGVudCBmaWx0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIElOYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXJbXSBjcmVhdGVEdXBsaWNhdGVDb250ZW50RmlsdGVycygpIHsKLQotCQlMaXN0IHZpZXdlckZpbHRlcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBkdXBlRmlsdGVycyA9IGdldER1cGxpY2F0ZUNvbnRlbnRGaWx0ZXJFbGVtZW50cygpOwotCQlJTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyIHZGaWx0ZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGR1cGVGaWx0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCi0JCQkJdkZpbHRlciA9IChJTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyKSBkdXBlRmlsdGVyc1tpXQotCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX1ZJRVdFUl9GSUxURVIpOwotCQkJCXZpZXdlckZpbHRlcnNMaXN0LmFkZCh2RmlsdGVyKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCX0KLQkJcmV0dXJuIChJTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyW10pICh2aWV3ZXJGaWx0ZXJzTGlzdC5zaXplKCkgPiAwID8gdmlld2VyRmlsdGVyc0xpc3QKLQkJCQkudG9BcnJheShuZXcgSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlclt2aWV3ZXJGaWx0ZXJzTGlzdC5zaXplKCldKQotCQkJCTogTk9fVklFV0VSX0ZJTFRFUlMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGNvdWxkIGJlIGFuIGluc3RhbmNlIG9mCi0JICoge0BsaW5rIElDb21tb25Db250ZW50UHJvdmlkZXJ9LCBidXQgb25seSB7QGxpbmsgSVRyZWVDb250ZW50UHJvdmlkZXJ9IGlzCi0JICogcmVxdWlyZWQuCi0JICogCi0JICogCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB0aGUgQ29udGVudCBwcm92aWRlciBkZWZpbmVkIGZvciB0aGlzIGV4dGVuc2lvbi4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBpbnN0YW5jZSBvZiB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24gY291bGQgbm90IGJlCi0JICogICAgICAgICAgICAgY3JlYXRlZCBmb3IgYW55IHJlYXNvbgotCSAqIAotCSAqLwotCXB1YmxpYyBJVHJlZUNvbnRlbnRQcm92aWRlciBjcmVhdGVDb250ZW50UHJvdmlkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoSVRyZWVDb250ZW50UHJvdmlkZXIpIGNvbmZpZ0VsZW1lbnQKLQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ09OVEVOVF9QUk9WSURFUik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgY291bGQgYmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIElDb21tb25MYWJlbFByb3ZpZGVyfSwKLQkgKiBidXQgb25seSB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9IGlzIHJlcXVpcmVkLgotCSAqIAotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIExhYmVsIHByb3ZpZGVyIGRlZmluZWQgZm9yIHRoaXMgZXh0ZW5zaW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gaW5zdGFuY2Ugb2YgdGhlIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgICAgIGNyZWF0ZWQgZm9yIGFueSByZWFzb24KLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgY3JlYXRlTGFiZWxQcm92aWRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChJTGFiZWxQcm92aWRlcikgY29uZmlnRWxlbWVudAotCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9MQUJFTF9QUk9WSURFUik7Ci0JfQotICAKLQkvKioKLQkgKiBFeHRlbnNpb25zIG1heSBvciBtYXkgbm90IGRlZmluZSBhIGNvbXBhcmF0b3IuIFdpdGhvdXQgYSBjb21wYXJhdG9yLAotCSAqIGl0ZW1zIGFyZSBzb3J0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSBhcmUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGVudAotCSAqIHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIENvbXBhcmF0b3IgZGVmaW5lZCBmb3IgdGhpcyBleHRlbnNpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBpbnN0YW5jZSBvZiB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24gY291bGQgbm90IGJlCi0JICogICAgICAgICAgICAgY3JlYXRlZCBmb3IgYW55IHJlYXNvbgotCSAqLwotCXB1YmxpYyBDb21wYXJhdG9yIGNyZWF0ZUNvbXBhcmF0b3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU09SVEVSKSAhPSBudWxsKQotCQkJcmV0dXJuIChDb21wYXJhdG9yKSBjb25maWdFbGVtZW50Ci0JCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9TT1JURVIpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MDFhYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL05hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvck1hbmFnZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBmaW5hbCBNYXAgY29udGVudERlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgRVhURU5TSU9OX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGx2YWx1ZSwgT2JqZWN0IHJ2YWx1ZSkgewotCQkJcmV0dXJuICgoSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yKSBsdmFsdWUpLmdldFByaW9yaXR5KCkKLQkJCQkJLSAoKElOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcikgcnZhbHVlKS5nZXRQcmlvcml0eSgpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5OwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSByZWdpc3RyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJc3luY2hyb25pemVkIChJTlNUQU5DRSkgewotCQkJaWYgKCFpc0luaXRpYWxpemVkKSB7Ci0JCQkJSU5TVEFOQ0UuaW5pdCgpOwotCQkJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJbmV3IE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yUmVnaXN0cnkoKS5yZWFkUmVnaXN0cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYWxsIGNvbnRlbnQgZGVzY3JpcHRvcihzKS4KLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JbXSBnZXRBbGxDb250ZW50RGVzY3JpcHRvcnMoKSB7Ci0JCU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yW10gZmluYWxEZXNjcmlwdG9ycyA9IG5ldyBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcltjb250ZW50RGVzY3JpcHRvcnMKLQkJCQkuc2l6ZSgpXTsKLQkJY29udGVudERlc2NyaXB0b3JzLnZhbHVlcygpLnRvQXJyYXkoZmluYWxEZXNjcmlwdG9ycyk7Ci0JCUFycmF5cy5zb3J0KGZpbmFsRGVzY3JpcHRvcnMsIEVYVEVOU0lPTl9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGZpbmFsRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmV0dXJucyBhbGwgY29udGVudCBkZXNjcmlwdG9yKHMpIHdoaWNoIGVuYWJsZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFTdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgZWxlbWVudCB0byByZXR1cm4gdGhlIGJlc3QgY29udGVudCBkZXNjcmlwdG9yIGZvcgotCSAqIEBwYXJhbSBhVmlld2VyRGVzY3JpcHRvcgotCSAqICAgICAgICAgICAgVGhlIHJlbGV2YW50IHZpZXdlciBkZXNjcmlwdG9yOyB1c2VkIHRvIGZpbHRlciBvdXQgdW5ib3VuZAotCSAqICAgICAgICAgICAgY29udGVudCBkZXNjcmlwdG9ycy4KLQkgKiBAcmV0dXJuIHRoZSBiZXN0IGNvbnRlbnQgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFNldCBnZXRFbmFibGVkQ29udGVudERlc2NyaXB0b3JzKAotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVN0cnVjdHVyZWRTZWxlY3Rpb24sCi0JCQlJTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvciBhVmlld2VyRGVzY3JpcHRvcikgewotCQlTZXQgZGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8qIEZpbmQgb3RoZXIgQ29udGVudFByb3ZpZGVycyB3aGljaCBlbmFibGUgZm9yIHRoaXMgb2JqZWN0ICovCi0JCWZvciAoSXRlcmF0b3IgY29udGVudERlc2NyaXB0b3JzSXRyID0gY29udGVudERlc2NyaXB0b3JzLnZhbHVlcygpCi0JCQkJLml0ZXJhdG9yKCk7IGNvbnRlbnREZXNjcmlwdG9yc0l0ci5oYXNOZXh0KCk7KSB7Ci0JCQlOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yKSBjb250ZW50RGVzY3JpcHRvcnNJdHIKLQkJCQkJLm5leHQoKTsKLQotCQkJaWYgKFV0aWxpdGllcy5pc0FwcGxpY2FibGUoYVZpZXdlckRlc2NyaXB0b3IsIGRlc2NyaXB0b3IsCi0JCQkJCWFTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCX0KLQkJLy8gQ29sbGVjdGlvbnMuc29ydChkZXNjcmlwdG9ycywgRVhURU5TSU9OX0NPTVBBUkFUT1IpOwotCi0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZXR1cm5zIGFsbCBjb250ZW50IGRlc2NyaXB0b3Iocykgd2hpY2ggZW5hYmxlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYW5FbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCB0byByZXR1cm4gdGhlIGJlc3QgY29udGVudCBkZXNjcmlwdG9yIGZvcgotCSAqIAotCSAqIEBwYXJhbSBhVmlld2VyRGVzY3JpcHRvcgotCSAqICAgICAgICAgICAgVGhlIHJlbGV2YW50IHZpZXdlciBkZXNjcmlwdG9yOyB1c2VkIHRvIGZpbHRlciBvdXQgdW5ib3VuZAotCSAqICAgICAgICAgICAgY29udGVudCBkZXNjcmlwdG9ycy4KLQkgKiBAcmV0dXJuIHRoZSBiZXN0IGNvbnRlbnQgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFNldCBnZXRFbmFibGVkQ29udGVudERlc2NyaXB0b3JzKE9iamVjdCBhbkVsZW1lbnQsCi0JCQlJTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvciBhVmlld2VyRGVzY3JpcHRvcikgewotCQlTZXQgZGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8qIEZpbmQgb3RoZXIgQ29udGVudFByb3ZpZGVycyB3aGljaCBlbmFibGUgZm9yIHRoaXMgb2JqZWN0ICovCi0JCWZvciAoSXRlcmF0b3IgY29udGVudERlc2NyaXB0b3JzSXRyID0gY29udGVudERlc2NyaXB0b3JzLnZhbHVlcygpCi0JCQkJLml0ZXJhdG9yKCk7IGNvbnRlbnREZXNjcmlwdG9yc0l0ci5oYXNOZXh0KCk7KSB7Ci0JCQlOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yKSBjb250ZW50RGVzY3JpcHRvcnNJdHIKLQkJCQkJLm5leHQoKTsKLQotCQkJaWYgKFV0aWxpdGllcwotCQkJCQkuaXNBcHBsaWNhYmxlKGFWaWV3ZXJEZXNjcmlwdG9yLCBkZXNjcmlwdG9yLCBhbkVsZW1lbnQpKQotCQkJCWRlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJfQotCQkvLyBDb2xsZWN0aW9ucy5zb3J0KGRlc2NyaXB0b3JzLCBFWFRFTlNJT05fQ09NUEFSQVRPUik7Ci0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hdmlnYXRvciBjb250ZW50IGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRvciB0aGF0IHNob3VsZCBiZSByZXR1cm5lZAotCSAqIEByZXR1cm4gVGhlIGNvbnRlbnQgZGVzY3JpcHRvciBvZiB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IgZ2V0Q29udGVudERlc2NyaXB0b3IoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiAoTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IpIGNvbnRlbnREZXNjcmlwdG9ycy5nZXQoaWQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBkZXNjcmlwdG9yIHRvIHJlbW92ZSBmcm9tIHRoZSBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRlbnREZXNjcmlwdG9yKFN0cmluZyBpZCkgewotCQljb250ZW50RGVzY3JpcHRvcnMucmVtb3ZlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcklkCi0JICogICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIGEgcGFydGljdWxhciBkZXNjcmlwdG9yCi0JICogQHJldHVybiBUaGUgbmFtZSAodmFsdWUgb2YgdGhlICduYW1lJyBhdHRyaWJ1dGUpIG9mIHRoZSBnaXZlbiBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KFN0cmluZyBkZXNjcmlwdG9ySWQpIHsKLQkJSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRDb250ZW50RGVzY3JpcHRvcihkZXNjcmlwdG9ySWQpOwotCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJcmV0dXJuIGRlc2NyaXB0b3IuZ2V0TmFtZSgpOwotCQlyZXR1cm4gZGVzY3JpcHRvcklkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9ySWQKLQkgKiAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgYSBwYXJ0aWN1bGFyIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIFRoZSBpbWFnZSAoY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUgb2YgdGhlICdpY29uJyBhdHRyaWJ1dGUpIG9mCi0JICogICAgICAgICB0aGUgZ2l2ZW4gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgZGVzY3JpcHRvcklkKSB7Ci0JCXJldHVybiByZXRyaWV2ZUFuZFN0b3JlSW1hZ2UoZGVzY3JpcHRvcklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgcmV0cmlldmVBbmRTdG9yZUltYWdlKFN0cmluZyBkZXNjcmlwdG9ySWQpIHsKLQkJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IgY29udGVudERlc2NyaXB0b3IgPSBnZXRDb250ZW50RGVzY3JpcHRvcihkZXNjcmlwdG9ySWQpOwotCi0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJaWYgKGNvbnRlbnREZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCVN0cmluZyBpY29uID0gY29udGVudERlc2NyaXB0b3IuZ2V0SWNvbigpOwotCQkJaWYgKGljb24gIT0gbnVsbCkgewotCQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChpY29uKTsKLQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCB8fCBpbWFnZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4KLQkJCQkJCQkuaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihjb250ZW50RGVzY3JpcHRvcgotCQkJCQkJCQkJLmdldERlY2xhcmluZ1BsdWdpbklkKCksIGljb24pOwotCQkJCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCWltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGljb24sIGltYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2MKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IoTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IgZGVzYykgewotCQlpZiAoZGVzYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzeW5jaHJvbml6ZWQgKGNvbnRlbnREZXNjcmlwdG9ycykgewotCQkJY29udGVudERlc2NyaXB0b3JzLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCQl9Ci0JfQotCi0JLy8gVE9ETyBNREUgU2hvdWxkIGJlIG1vdmVkIG9yIG9wdGltaXplZCBpbiBzb21ld2F5IHRvIG1pbmltaXplIHRoZSBhbW91bnQKLQkvLyBvZiB0aW1lIHRoYXQgaW1hZ2UKLQkvLyByZXNvdXJjZXMgYXJlIGhlbGQgb250bwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKQotCQkJaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBpbWFnZVJlZ2lzdHJ5OwotCX0KLQotCXByaXZhdGUgY2xhc3MgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JSZWdpc3RyeSBleHRlbmRzIE5hdmlnYXRvckNvbnRlbnRSZWdpc3RyeVJlYWRlciB7Ci0gIAotCQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgYW5FbGVtZW50KSB7Ci0JCQlpZiAoVEFHX05BVklHQVRPUl9DT05URU5ULmVxdWFscyhhbkVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCWFkZE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yKG5ldyBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcigKLQkJCQkJCQlhbkVsZW1lbnQpKTsKLQotCQkJCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGxvZyBhbiBlcnJvciBzaW5jZSBpdHMgbm90IHNhZmUgdG8gb3BlbiBhIGRpYWxvZyBoZXJlCi0JCQkJCU5hdmlnYXRvclBsdWdpbgotCQkJCQkJCS5sb2coCi0JCQkJCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBuYXZpZ2F0b3IgZGVzY3JpcHRvci4iLCBlLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5yZWFkRWxlbWVudChhbkVsZW1lbnQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL05hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUxZjNiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklFeHRlbnNpb25TdGF0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTWVtZW50b0F3YXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JDb250ZW50U2VydmljZTsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIE5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24gaW1wbGVtZW50cyBJTWVtZW50b0F3YXJlLCBJTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbiB7Ci0KLQlwcml2YXRlIE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGNvbnRlbnRTZXJ2aWNlOwotCi0JcHJpdmF0ZSBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmlld2VySWQ7Ci0KLQlwcml2YXRlIElDb21tb25Db250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJQ29tbW9uTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJRXh0ZW5zaW9uU3RhdGVNb2RlbCBzdGF0ZU1vZGVsOwotCi0JcHJpdmF0ZSBDb21wYXJhdG9yIGNvbXBhcmF0b3I7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGFiZWxQcm92aWRlckluaXRpYWxpemF0aW9uRmFpbGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGVudFByb3ZpZGVySW5pdGlhbGl6YXRpb25GYWlsZWQgPSBmYWxzZTsgCi0KLQlwcml2YXRlIGJvb2xlYW4gY29tcGFyYXRvckluaXRpYWxpemF0aW9uRmFpbGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEaXNwb3NlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJTWVtZW50byBhcHBsaWVkTWVtZW50bzsKLQotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlck1hbmFnZXIgdmlld2VyTWFuYWdlcjsKLQotCXByaXZhdGUgSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlcltdIHZpZXdlckZpbHRlcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gb2JqZWN0IHRvIG1hbmFnZSB0aGUgaW5zdGFudGlhdGVkIAotCSAqIGVsZW1lbnRzIGZyb20gdGhlIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYURlc2NyaXB0b3IgVGhlIGRlc2NyaXB0b3IgdGhhdCBrbm93cyBob3cgdG8gY3JlYXRlIGVsZW1lbnRzIGFuZCBrbm93cyB0aGUgaWQgb2YgdGhlIGV4dGVuc2lvbgotCSAqIEBwYXJhbSBhQ29udGVudFNlcnZpY2UgVGhlIGNvbnRlbnQgc2VydmljZSB0aGF0IHdpbGwgbWFuYWdlIHRoaXMgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGFWaWV3ZXJNYW5hZ2VyIFRoZSB2aWV3ZXIgbWFuYWdlciB0aGF0IGtub3dzIGhvdyB0byBpbml0aWFsaXplIHRoZSBjb250ZW50IHByb3ZpZGVyIGNyZWF0ZWQgYnkgdGhpcyBleHRlbnNpb24uCi0JICovCi0JcHVibGljIE5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24oTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IgYURlc2NyaXB0b3IsCi0JCQlOYXZpZ2F0b3JDb250ZW50U2VydmljZSBhQ29udGVudFNlcnZpY2UsCi0JCQlTdHJ1Y3R1cmVkVmlld2VyTWFuYWdlciBhVmlld2VyTWFuYWdlcikgewotCQlzdXBlcigpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGFEZXNjcmlwdG9yKTsKLQotCQlkZXNjcmlwdG9yID0gYURlc2NyaXB0b3I7Ci0JCWNvbnRlbnRTZXJ2aWNlID0gYUNvbnRlbnRTZXJ2aWNlOwotCQl2aWV3ZXJJZCA9IGNvbnRlbnRTZXJ2aWNlLmdldFZpZXdlcklkKCk7Ci0JCXZpZXdlck1hbmFnZXIgPSBhVmlld2VyTWFuYWdlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5JTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbiNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3IuZ2V0SWQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5JTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbiNnZXREZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLklOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uI2dldENvbnRlbnRQcm92aWRlcigpCi0JICovCi0JcHVibGljIElUcmVlQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsIHx8IGNvbnRlbnRQcm92aWRlckluaXRpYWxpemF0aW9uRmFpbGVkKQotCQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQl0cnkgewotCQkJCWlmIChjb250ZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCQlJVHJlZUNvbnRlbnRQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyID0gZGVzY3JpcHRvcgotCQkJCQkJCS5jcmVhdGVDb250ZW50UHJvdmlkZXIoKTsKLQkJCQkJaWYgKHRyZWVDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQkJY29udGVudFByb3ZpZGVyID0gbmV3IE5hdmlnYXRvckNvbnRlbnRQcm92aWRlcigKLQkJCQkJCQkJdHJlZUNvbnRlbnRQcm92aWRlciwgZGVzY3JpcHRvciwgY29udGVudFNlcnZpY2UpOwotCQkJCQkJY29udGVudFByb3ZpZGVyLmluaXQoZ2V0U3RhdGVNb2RlbCgpLCBhcHBsaWVkTWVtZW50byk7Ci0JCQkJCQl2aWV3ZXJNYW5hZ2VyLmluaXRpYWxpemUoY29udGVudFByb3ZpZGVyKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljb250ZW50UHJvdmlkZXIgPSBTa2VsZXRvblRyZWVDb250ZW50UHJvdmlkZXIuSU5TVEFOQ0U7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGVudFByb3ZpZGVySW5pdGlhbGl6YXRpb25GYWlsZWQgPSB0cnVlOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQljb250ZW50UHJvdmlkZXJJbml0aWFsaXphdGlvbkZhaWxlZCA9IHRydWU7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlmIChjb250ZW50UHJvdmlkZXJJbml0aWFsaXphdGlvbkZhaWxlZCkKLQkJCQljb250ZW50UHJvdmlkZXIgPSBTa2VsZXRvblRyZWVDb250ZW50UHJvdmlkZXIuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKLQl9Ci0KLSAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5JTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbiNnZXRMYWJlbFByb3ZpZGVyKCkKLQkgKi8KLQlwdWJsaWMgSUNvbW1vbkxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCB8fCBsYWJlbFByb3ZpZGVySW5pdGlhbGl6YXRpb25GYWlsZWQpCi0JCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQl0cnkgewotCi0JCQkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCQlJTGFiZWxQcm92aWRlciB0ZW1wTGFiZWxQcm92aWRlciA9IGRlc2NyaXB0b3IKLQkJCQkJCQkuY3JlYXRlTGFiZWxQcm92aWRlcigpOwotCi0JCQkJCWlmICh0ZW1wTGFiZWxQcm92aWRlciBpbnN0YW5jZW9mIElDb21tb25MYWJlbFByb3ZpZGVyKSB7Ci0JCQkJCQlsYWJlbFByb3ZpZGVyID0gKElDb21tb25MYWJlbFByb3ZpZGVyKSB0ZW1wTGFiZWxQcm92aWRlcjsKLQkJCQkJCWlmIChnZXRDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIE5hdmlnYXRvckNvbnRlbnRQcm92aWRlcikKLQkJCQkJCQlsYWJlbFByb3ZpZGVyCi0JCQkJCQkJCQkuaW5pdCgKLQkJCQkJCQkJCQkJZ2V0U3RhdGVNb2RlbCgpLAotCQkJCQkJCQkJCQkoKE5hdmlnYXRvckNvbnRlbnRQcm92aWRlcikgZ2V0Q29udGVudFByb3ZpZGVyKCkpCi0JCQkJCQkJCQkJCQkJLmdldERlbGVnYXRlQ29udGVudFByb3ZpZGVyKCkpOwotCQkJCQkJZWxzZQotCQkJCQkJCWxhYmVsUHJvdmlkZXIuaW5pdChnZXRTdGF0ZU1vZGVsKCksCi0JCQkJCQkJCQlTa2VsZXRvblRyZWVDb250ZW50UHJvdmlkZXIuSU5TVEFOQ0UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbGFiZWxQcm92aWRlciA9IG5ldyBEZWxlZ2F0ZUNvbW1vbkxhYmVsUHJvdmlkZXIoCi0JCQkJCQkJCXRlbXBMYWJlbFByb3ZpZGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWxhYmVsUHJvdmlkZXJJbml0aWFsaXphdGlvbkZhaWxlZCA9IHRydWU7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCWxhYmVsUHJvdmlkZXJJbml0aWFsaXphdGlvbkZhaWxlZCA9IHRydWU7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJaWYgKGxhYmVsUHJvdmlkZXJJbml0aWFsaXphdGlvbkZhaWxlZCkKLQkJCQlsYWJlbFByb3ZpZGVyID0gU2tlbGV0b25MYWJlbFByb3ZpZGVyLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyOwotCX0KLSAKLQlwdWJsaWMgSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlcltdIGdldER1cGxpY2F0ZUNvbnRlbnRGaWx0ZXJzKCkgewotCQlpZiAodmlld2VyRmlsdGVycyAhPSBudWxsKQotCQkJcmV0dXJuIHZpZXdlckZpbHRlcnM7Ci0KLQkJTGlzdCB2aWV3ZXJGaWx0ZXJzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAodmlld2VyRmlsdGVycyA9PSBudWxsKQotCQkJCXZpZXdlckZpbHRlcnMgPSBkZXNjcmlwdG9yLmNyZWF0ZUR1cGxpY2F0ZUNvbnRlbnRGaWx0ZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIHZpZXdlckZpbHRlcnM7Ci0JfQotCi0gCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCi0JCQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOyAKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlzRGlzcG9zZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JLy8gTTQgUmV2aXNpdCB0aGUgc29ydGluZyBzdHJhdGVneSBbQ29tbW9uTmF2aWdhdG9yOlNPUlRJTkddCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKLQkJaWYgKGNvbXBhcmF0b3IgIT0gbnVsbCB8fCBjb21wYXJhdG9ySW5pdGlhbGl6YXRpb25GYWlsZWQpCi0JCQlyZXR1cm4gY29tcGFyYXRvcjsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQl0cnkgewotCQkJCWlmIChjb21wYXJhdG9yID09IG51bGwpCi0JCQkJCWNvbXBhcmF0b3IgPSBkZXNjcmlwdG9yLmNyZWF0ZUNvbXBhcmF0b3IoKTsKLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29tcGFyYXRvckluaXRpYWxpemF0aW9uRmFpbGVkID0gdHJ1ZTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29tcGFyYXRvckluaXRpYWxpemF0aW9uRmFpbGVkID0gdHJ1ZTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJaWYgKGNvbXBhcmF0b3JJbml0aWFsaXphdGlvbkZhaWxlZCB8fCBjb21wYXJhdG9yID09IG51bGwpCi0JCQkJY29tcGFyYXRvciA9IElkZW50aXR5Q29tcGFyYXRvci5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gY29tcGFyYXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLklOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29udGVudFByb3ZpZGVySW5pdGlhbGl6YXRpb25GYWlsZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ29udGVudFByb3ZpZGVySW5pdGlhbGl6YXRpb25GYWlsZWQoKSB7Ci0JCXJldHVybiBjb250ZW50UHJvdmlkZXJJbml0aWFsaXphdGlvbkZhaWxlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxhYmVsUHJvdmlkZXJJbml0aWFsaXphdGlvbkZhaWxlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNMYWJlbFByb3ZpZGVySW5pdGlhbGl6YXRpb25GYWlsZWQoKSB7Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVySW5pdGlhbGl6YXRpb25GYWlsZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTG9hZGluZ0ZhaWxlZCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlckluaXRpYWxpemF0aW9uRmFpbGVkOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLklOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uI2lzTG9hZGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRlZCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlciAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWFwcGxpZWRNZW1lbnRvID0gYU1lbWVudG87Ci0JCQlhcHBseU1lbWVudG8oY29udGVudFByb3ZpZGVyKTsKLQkJCWFwcGx5TWVtZW50byhsYWJlbFByb3ZpZGVyKTsgCi0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBseU1lbWVudG8oSU1lbWVudG9Bd2FyZSB0YXJnZXQpIHsKLQkJaWYgKHRhcmdldCAhPSBudWxsKQotCQkJdGFyZ2V0LnJlc3RvcmVTdGF0ZShhcHBsaWVkTWVtZW50byk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjb21wbGFpbkRpc3Bvc2VkSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChpc0Rpc3Bvc2VkKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLQkJCQkJCQkiSU5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBkZXNjcmlwdG9yLmdldElkKCkKLQkJCQkJCQkrICIgaXMgZGlzcG9zZWQhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5JTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbiNnZXRTdGF0ZU1vZGVsKCkKLQkgKi8KLQlwdWJsaWMgSUV4dGVuc2lvblN0YXRlTW9kZWwgZ2V0U3RhdGVNb2RlbCgpIHsKLQkJaWYgKHN0YXRlTW9kZWwgPT0gbnVsbCkKLQkJCXN0YXRlTW9kZWwgPSBuZXcgRXh0ZW5zaW9uU3RhdGVNb2RlbChkZXNjcmlwdG9yLmdldElkKCksIHZpZXdlcklkKTsKLQkJcmV0dXJuIHN0YXRlTW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL05hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL05hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2RiZTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9OYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklFeHRlbnNpb25TdGF0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTWVtZW50b0F3YXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JDb250ZW50U2VydmljZTsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbW1vbkNvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQlwcml2YXRlIE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGNvbnRlbnRTZXJ2aWNlOwotCXByaXZhdGUgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IgZGVzY3JpcHRvcjsgCi0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIE5hdmlnYXRvckNvbnRlbnRQcm92aWRlcihJVHJlZUNvbnRlbnRQcm92aWRlciBhQ29udGVudFByb3ZpZGVyLCBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciBhRGVzY3JpcHRvciwgTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgdGhlQ29udGVudFNlcnZpY2UpIHsKLQkJc3VwZXIoKTsKLQkJY29udGVudFByb3ZpZGVyID0gYUNvbnRlbnRQcm92aWRlcjsgCi0JCWNvbnRlbnRTZXJ2aWNlID0gdGhlQ29udGVudFNlcnZpY2U7Ci0JCWRlc2NyaXB0b3IgPSBhRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCQlyZXR1cm4gY29udGVudFByb3ZpZGVyLmVxdWFscyhhbk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFQYXJlbnRFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgYVBhcmVudEVsZW1lbnQpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBjb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oYVBhcmVudEVsZW1lbnQpOwotCQljb250ZW50U2VydmljZS5yZW1lbWJlckNvbnRyaWJ1dGlvbihkZXNjcmlwdG9yLCBjaGlsZHJlbik7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5JbnB1dEVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBhbklucHV0RWxlbWVudCkgewotCQlPYmplY3RbXSBlbGVtZW50cyA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhhbklucHV0RWxlbWVudCk7Ci0JCWNvbnRlbnRTZXJ2aWNlLnJlbWVtYmVyQ29udHJpYnV0aW9uKGRlc2NyaXB0b3IsIGVsZW1lbnRzKTsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbkVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGFuRWxlbWVudCkgewotCQlyZXR1cm4gY29udGVudFByb3ZpZGVyLmdldFBhcmVudChhbkVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbkVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGFuRWxlbWVudCkgewotCQlyZXR1cm4gY29udGVudFByb3ZpZGVyLmhhc0NoaWxkcmVuKGFuRWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gY29udGVudFByb3ZpZGVyLmhhc2hDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFWaWV3ZXIKLQkgKiBAcGFyYW0gYW5PbGRJbnB1dAotCSAqIEBwYXJhbSBhTmV3SW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFWaWV3ZXIsIE9iamVjdCBhbk9sZElucHV0LCBPYmplY3QgYU5ld0lucHV0KSB7Ci0JCWNvbnRlbnRQcm92aWRlci5pbnB1dENoYW5nZWQoYVZpZXdlciwgYW5PbGRJbnB1dCwgYU5ld0lucHV0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBjb250ZW50UHJvdmlkZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIElUcmVlQ29udGVudFByb3ZpZGVyIGdldERlbGVnYXRlQ29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gY29udGVudFByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgewotCQlpZihjb250ZW50UHJvdmlkZXIgIT0gbnVsbCAmJiBjb250ZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBJTWVtZW50b0F3YXJlKQotCQkJKChJTWVtZW50b0F3YXJlKWNvbnRlbnRQcm92aWRlcikucmVzdG9yZVN0YXRlKGFNZW1lbnRvKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7IAotCQlpZihjb250ZW50UHJvdmlkZXIgIT0gbnVsbCAmJiBjb250ZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBJTWVtZW50b0F3YXJlKQotCQkJKChJTWVtZW50b0F3YXJlKWNvbnRlbnRQcm92aWRlcikuc2F2ZVN0YXRlKGFNZW1lbnRvKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJRXh0ZW5zaW9uU3RhdGVNb2RlbCBhU3RhdGVNb2RlbCwgSU1lbWVudG8gYU1lbWVudG8pIHsKLQkJaWYoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgSUNvbW1vbkNvbnRlbnRQcm92aWRlcikgewotCQkJKChJQ29tbW9uQ29udGVudFByb3ZpZGVyKWNvbnRlbnRQcm92aWRlcikuaW5pdChhU3RhdGVNb2RlbCwgYU1lbWVudG8pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL05hdmlnYXRvckNvbnRlbnRSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL05hdmlnYXRvckNvbnRlbnRSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGRjOWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9OYXZpZ2F0b3JDb250ZW50UmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JQbHVnaW47Ci0KLS8qKgotICogUHJvdmlkZXMgYSBjb21tb24gc3VwZXJjbGFzcyBmb3IgYWxsIGNvbnN1bWVycyBvZiB0aGUKLSAqIDxiPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50PC9iPiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTmF2aWdhdG9yQ29udGVudFJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgaW1wbGVtZW50cwotCQlJTmF2aWdhdG9yQ29udGVudEV4dFB0Q29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBOYXZpZ2F0b3JDb250ZW50UmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKE5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQsIFRBR19OQVZJR0FUT1JfQ09OVEVOVCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGVsZW1lbnROYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0KLQkJLyogVGhlc2UgYXJlIGFsbCBvZiB0aGUgdmFsaWQgcm9vdCB0YWdzIHRoYXQgZXhpc3QgKi8KLQkJcmV0dXJuIFRBR19BQ1RJT05fUFJPVklERVIuZXF1YWxzKGVsZW1lbnROYW1lKQotCQkJCXx8IFRBR19OQVZJR0FUT1JfQ09OVEVOVC5lcXVhbHMoZWxlbWVudE5hbWUpCi0JCQkJfHwgVEFHX0NPTU1PTl9XSVpBUkQuZXF1YWxzKGVsZW1lbnROYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL05hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkNTliNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5OYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5Db21tb25OYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yUGx1Z2luOwotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgPGNvZGU+b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdlcjwvY29kZT4gZXh0ZW5zaW9uLgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yIGltcGxlbWVudHMgSU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSU5DTFVERVMgPSAiaW5jbHVkZXMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19FWENMVURFUyA9ICJleGNsdWRlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lTX1JPT1QgPSAiaXNSb290IjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUEFUVEVSTiA9ICJwYXR0ZXJuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT05URU5UX0VYVEVOU0lPTiA9ICJjb250ZW50RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ1RJT05fRVhURU5TSU9OID0gImFjdGlvbkV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHZpZXdlcklkOwotCi0JcHJpdmF0ZSBTdHJpbmcgcG9wdXBNZW51SWQgPSBudWxsOwotCi0JcHJpdmF0ZSBCaW5kaW5nIGFjdGlvbkJpbmRpbmcgPSBuZXcgQmluZGluZyhUQUdfQUNUSU9OX0VYVEVOU0lPTik7Ci0KLQlwcml2YXRlIEJpbmRpbmcgY29udGVudEJpbmRpbmcgPSBuZXcgQmluZGluZyhUQUdfQ09OVEVOVF9FWFRFTlNJT04pOwotCi0JcHJpdmF0ZSBJbnNlcnRpb25Qb2ludFtdIGN1c3RvbUluc2VydGlvblBvaW50cyA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dzUGxhdGZvcm1Db250cmlidXRpb25zID0gdHJ1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGVudCBkZXNjcmlwdG9yIGZyb20gYSBjb25maWd1cmF0aW9uIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFWaWV3ZXJJZAotCSAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvcihTdHJpbmcgYVZpZXdlcklkKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmlld2VySWQgPSBhVmlld2VySWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5JTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvciNnZXRWaWV3ZXJJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWaWV3ZXJJZCgpIHsKLQkJcmV0dXJuIHZpZXdlcklkOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcG9wdXBNZW51SWQuIElmIGEgdmFsdWUgaXMgYWxyZWFkeSBzZXQsIHRoZW4gYSB3YXJuaW5nIG1lc3NhZ2UKLQkgKiB3aWxsIGJlIGxvZ2dlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3UG9wdXBNZW51SWQKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgcG9wdXAgbWVudSBpZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3B1cE1lbnVJZChTdHJpbmcgbmV3UG9wdXBNZW51SWQpIHsKLQotCQlpZiAobmV3UG9wdXBNZW51SWQgIT0gbnVsbCkgewotCQkJaWYgKHBvcHVwTWVudUlkICE9IG51bGwpCi0JCQkJTmF2aWdhdG9yUGx1Z2luCi0JCQkJCQkubG9nKE5MUwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yX1BvcHVwX01lbnVfT3ZlcnJpZGRlbiwKLQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBnZXRWaWV3ZXJJZCgpLAotCQkJCQkJCQkJCQkJcG9wdXBNZW51SWQsIG5ld1BvcHVwTWVudUlkIH0pKTsKLQkJCXBvcHVwTWVudUlkID0gbmV3UG9wdXBNZW51SWQ7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLklOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yI2dldFBvcHVwTWVudUlkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcHVwTWVudUlkKCkgewotCQlyZXR1cm4gcG9wdXBNZW51SWQgIT0gbnVsbCA/IHBvcHVwTWVudUlkIDogdmlld2VySWQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3VtZSBhbiBhY3Rpb24gYmluZGluZyBmb3IgdGhpcyB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29udGFpbmluZyBhIHZpZXdlckFjdGlvbkJpbmRpbmcKLQkgKiAgICAgICAgICAgIGVsZW1lbnQuCi0JICogQHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiBzb21ldGhpbmcgZ29lcyBob3JyaWJseSB3cm9uZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25zdW1lQWN0aW9uQmluZGluZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQkJCXRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24gewotCQljb25zdW1lQmluZGluZyhlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3VtZSBhIGNvbnRlbnQgYmluZGluZyBmb3IgdGhpcyB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29udGFpbmluZyBhIHZpZXdlckNvbnRlbnRCaW5kaW5nCi0JICogICAgICAgICAgICBlbGVtZW50LgotCSAqIEB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgc29tZXRoaW5nIGdvZXMgaG9ycmlibHkgd3JvbmcuCi0JICovCi0JcHVibGljIHZvaWQgY29uc3VtZUNvbnRlbnRCaW5kaW5nKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCQkJdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0JCWNvbnN1bWVCaW5kaW5nKGVsZW1lbnQsIHRydWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUm9vdEV4dGVuc2lvbihTdHJpbmcgYUNvbnRlbnRFeHRlbnNpb25JZCkgewotCQlyZXR1cm4gY29udGVudEJpbmRpbmcuaXNSb290RXh0ZW5zaW9uKGFDb250ZW50RXh0ZW5zaW9uSWQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFsbG93c1BsYXRmb3JtQ29udHJpYnV0aW9uc1RvQ29udGV4dE1lbnUoKSB7Ci0JCXJldHVybiBhbGxvd3NQbGF0Zm9ybUNvbnRyaWJ1dGlvbnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlQ29udGVudEV4dGVuc2lvbihTdHJpbmcgYUNvbnRlbnRFeHRlbnNpb25JZCkgewotCQlyZXR1cm4gY29udGVudEJpbmRpbmcuaXNWaXNpYmxlRXh0ZW5zaW9uKGFDb250ZW50RXh0ZW5zaW9uSWQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZUFjdGlvbkV4dGVuc2lvbihTdHJpbmcgYW5BY3Rpb25FeHRlbnNpb25JZCkgewotCQlyZXR1cm4gYWN0aW9uQmluZGluZy5pc1Zpc2libGVFeHRlbnNpb24oYW5BY3Rpb25FeHRlbnNpb25JZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzT3ZlcnJpZGRlblJvb3RFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gY29udGVudEJpbmRpbmcuaGFzT3ZlcnJpZGRlblJvb3RFeHRlbnNpb25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnN1bWVCaW5kaW5nKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGlzQ29udGVudCkKLQkJCXRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24gewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBpbmNsdWRlc0VsZW1lbnQgPSBlbGVtZW50Ci0JCQkJLmdldENoaWxkcmVuKFRBR19JTkNMVURFUyk7Ci0KLQkJaWYgKGluY2x1ZGVzRWxlbWVudC5sZW5ndGggPT0gMSkgewotCQkJaWYgKGlzQ29udGVudCkKLQkJCQljb250ZW50QmluZGluZy5jb25zdW1lSW5jbHVkZXMoaW5jbHVkZXNFbGVtZW50WzBdLCB0cnVlKTsKLQkJCWVsc2UKLQkJCQlhY3Rpb25CaW5kaW5nLmNvbnN1bWVJbmNsdWRlcyhpbmNsdWRlc0VsZW1lbnRbMF0sIGZhbHNlKTsKLQkJfSBlbHNlIGlmIChpbmNsdWRlc0VsZW1lbnQubGVuZ3RoID49IDEpIHsKLQkJCU5hdmlnYXRvclBsdWdpbi5sb2dFcnJvcigwLCBOTFMuYmluZCgKLQkJCQkJQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuVG9vX21hbnlfZWxlbWVudHNfV2FybmluZywKLQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQlUQUdfSU5DTFVERVMsCi0JCQkJCQkJZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKQotCQkJCQkJCQkJLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwKLQkJCQkJCQllbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpIH0pLAotCQkJCQludWxsKTsKLQkJfQotCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGV4Y2x1ZGVzRWxlbWVudCA9IGVsZW1lbnQKLQkJCQkuZ2V0Q2hpbGRyZW4oVEFHX0VYQ0xVREVTKTsKLQotCQlpZiAoZXhjbHVkZXNFbGVtZW50Lmxlbmd0aCA9PSAxKSB7Ci0KLQkJCWlmIChpc0NvbnRlbnQpCi0JCQkJY29udGVudEJpbmRpbmcuY29uc3VtZUV4Y2x1ZGVzKGV4Y2x1ZGVzRWxlbWVudFswXSk7Ci0JCQllbHNlCi0JCQkJYWN0aW9uQmluZGluZy5jb25zdW1lRXhjbHVkZXMoZXhjbHVkZXNFbGVtZW50WzBdKTsKLQkJfSBlbHNlIGlmIChleGNsdWRlc0VsZW1lbnQubGVuZ3RoID49IDEpIHsKLQkJCU5hdmlnYXRvclBsdWdpbi5sb2dFcnJvcigwLCBOTFMuYmluZCgKLQkJCQkJQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuVG9vX21hbnlfZWxlbWVudHNfV2FybmluZywKLQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQlUQUdfRVhDTFVERVMsCi0JCQkJCQkJZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKQotCQkJCQkJCQkJLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwKLQkJCQkJCQllbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpIH0pLAotCQkJCQludWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJbnNlcnRpb25Qb2ludFtdIGdldEN1c3RvbUluc2VydGlvblBvaW50cygpIHsKLQkJcmV0dXJuIGN1c3RvbUluc2VydGlvblBvaW50czsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q3VzdG9tSW5zZXJ0aW9uUG9pbnRzCi0JICogICAgICAgICAgICBUaGUgc2V0IG9mIGN1c3RvbSBpbnNlcnRpb24gcG9pbnRzLCBpZiBhbnkuIEEgbnVsbCBsaXN0Ci0JICogICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgc2V0IChhcyBkZWZpbmVkIGJ5Ci0JICogICAgICAgICAgICB7QGxpbmsgTmF2aWdhdG9yQWN0aW9uU2VydmljZX0pIHNob3VsZCBiZSB1c2VkLiBBbiBlbXB0eSBsaXN0Ci0JICogICAgICAgICAgICBpbmRpY2F0ZXMgdGhlcmUgYXJlIG5vIGRlY2xhcmF0aXZlIGluc2VydGlvbiBwb2ludHMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9tSW5zZXJ0aW9uUG9pbnRzKAotCQkJSW5zZXJ0aW9uUG9pbnRbXSBuZXdDdXN0b21JbnNlcnRpb25Qb2ludHMpIHsKLQkJaWYgKGN1c3RvbUluc2VydGlvblBvaW50cyAhPSBudWxsKSB7Ci0JCQlOYXZpZ2F0b3JQbHVnaW4KLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCTAsCi0JCQkJCQkJIkF0dGVtcHQgdG8gb3ZlcnJpZGUgY3VzdG9tIGluc2VydGlvbiBwb2ludHMgZGVuaWVkLiBWZXJpZnkgdGhlcmUgYXJlIG5vIGNvbGxpZGluZyBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld2VyIGV4dGVuc2lvbiBwb2ludHMuIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsgLy8gZG8gbm90IGxldCB0aGVtIG92ZXJyaWRlIHRoZSBpbnNlcnRpb24gcG9pbnRzLgotCQl9Ci0JCWN1c3RvbUluc2VydGlvblBvaW50cyA9IG5ld0N1c3RvbUluc2VydGlvblBvaW50czsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdG9BbGxvd1BsYXRmb3JtQ29udHJpYnV0aW9ucwotCSAqICAgICAgICAgICAgQSB2YWx1ZSBvZiAndHJ1ZScgZW5hYmxlcyBvYmplY3Qvdmlld2VyIGNvbnRyaWJ1dGlvbnMuICdmYWxzZScKLQkgKiAgICAgICAgICAgIHdpbGwgb25seSBhbGxvdyBwcm9ncmFtbWF0aWMgY29udHJpYnV0aW9ucyBmcm9tCi0JICogICAgICAgICAgICB7QGxpbmsgQ29tbW9uQWN0aW9uUHJvdmlkZXJ9cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd3NQbGF0Zm9ybUNvbnRyaWJ1dGlvbnMoCi0JCQlib29sZWFuIHRvQWxsb3dQbGF0Zm9ybUNvbnRyaWJ1dGlvbnMpIHsKLQkJYWxsb3dzUGxhdGZvcm1Db250cmlidXRpb25zID0gdG9BbGxvd1BsYXRmb3JtQ29udHJpYnV0aW9uczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9OYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzNWU3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvclBsdWdpbjsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIE5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3JSZWdpc3RyeSBJTlNUQU5DRSA9IG5ldyBOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnkoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVklFV0VSID0gInZpZXdlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVklFV0VSX0NPTlRFTlRfQklORElORyA9ICJ2aWV3ZXJDb250ZW50QmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVklFV0VSX0FDVElPTl9CSU5ESU5HID0gInZpZXdlckFjdGlvbkJpbmRpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BPUFVQX01FTlUgPSAicG9wdXBNZW51IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQUxMT1dTX1BMQVRGT1JNX0NPTlRSSUJVVElPTlMgPSAiYWxsb3dzUGxhdGZvcm1Db250cmlidXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JTlNFUlRJT05fUE9JTlQgPSAiaW5zZXJ0aW9uUG9pbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU0VQQVJBVE9SID0gInNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVklFV0VSX0lEID0gInZpZXdlcklkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QT1BVUF9NRU5VX0lEID0gInBvcHVwTWVudUlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcCB2aWV3ZXJEZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBpbnRpYWxpemVkIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgdmlld2VyIGRlc2NyaXB0b3IgcmVnaXN0cnkuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJc3luY2hyb25pemVkIChJTlNUQU5DRSkgewotCQkJaWYgKCFpc0luaXRpYWxpemVkKSB7Ci0JCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUGx1Z2luSWQKLQkgKiBAcGFyYW0gYW5FeHRlbnNpb25Qb2ludAotCSAqLwotCXByb3RlY3RlZCBOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKE5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQsIFRBR19WSUVXRVIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXJJZCBUaGUgdmlld2VyIGlkIGZvciB0aGUgdmlld2VyIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2aWV3ZXIgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHZpZXdlciBpZC4KLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvciBnZXROYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yKAotCQkJU3RyaW5nIHZpZXdlcklkKSB7Ci0JCXJldHVybiBnZXRWaWV3ZXJEZXNjcmlwdG9yKHZpZXdlcklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoVEFHX1ZJRVdFUi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQlTdHJpbmcgdmlld2VySWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVklFV0VSX0lEKTsKLQkJCU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldFZpZXdlckRlc2NyaXB0b3Iodmlld2VySWQpOwotCQkJU3RyaW5nIGF0dFBvcHVwTWVudUlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BPUFVQX01FTlVfSUQpOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gdGFnUG9wdXBNZW51ID0gZWxlbWVudAotCQkJCQkuZ2V0Q2hpbGRyZW4oVEFHX1BPUFVQX01FTlUpOwotCQkJaWYgKHRhZ1BvcHVwTWVudS5sZW5ndGggPT0gMCAmJiBhdHRQb3B1cE1lbnVJZCAhPSBudWxsKQotCQkJCWRlc2NyaXB0b3Iuc2V0UG9wdXBNZW51SWQoYXR0UG9wdXBNZW51SWQpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKGF0dFBvcHVwTWVudUlkICE9IG51bGwpCi0JCQkJCU5hdmlnYXRvclBsdWdpbgotCQkJCQkJCS5sb2dFcnJvcigwLCAiQSBwb3B1cE1lbnVJZCBhdHRyaWJ1dGUgYW5kIHBvcHVwTWVudSBlbGVtZW50IG1heSBOT1QgYmUgY29uY3VycmVudGx5IHNwZWNpZmllZC4gKHNlZSAiICsgZWxlbWVudC5nZXROYW1lc3BhY2UoKSArICIpIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWVsc2UgaWYgKHRhZ1BvcHVwTWVudS5sZW5ndGggPiAxKSAKLQkJCQkJTmF2aWdhdG9yUGx1Z2luCi0JCQkJCS5sb2dFcnJvcigwLCAiT25seSBvbmUgJ3BvcHVwTWVudScgY2hpbGQgb2YgJ3ZpZXdlcicgaWQgbWF5IGJlIHNwZWNpZmllZC4gKHNlZSAiICsgZWxlbWVudC5nZXROYW1lc3BhY2UoKSArICIpIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWVsc2UgeyAvLyB2YWxpZCBjYXNlCi0JCQkJCQotCQkJCQlTdHJpbmcgcG9wdXBNZW51SWQgPSB0YWdQb3B1cE1lbnVbMF0uZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCQkJCVN0cmluZyBhbGxvd3NQbGF0Zm9ybUNvbnRyaWJ1dGlvbnMgPSB0YWdQb3B1cE1lbnVbMF0uZ2V0QXR0cmlidXRlKEFUVF9BTExPV1NfUExBVEZPUk1fQ09OVFJJQlVUSU9OUyk7Ci0JCQkJCQotCQkJCQlpZihwb3B1cE1lbnVJZCAhPSBudWxsKQotCQkJCQkJZGVzY3JpcHRvci5zZXRQb3B1cE1lbnVJZChwb3B1cE1lbnVJZCk7Ci0JCQkJCQotCQkJCQlpZihhbGxvd3NQbGF0Zm9ybUNvbnRyaWJ1dGlvbnMgIT0gbnVsbCkgCi0JCQkJCQlkZXNjcmlwdG9yLnNldEFsbG93c1BsYXRmb3JtQ29udHJpYnV0aW9ucyhCb29sZWFuLnZhbHVlT2YoYWxsb3dzUGxhdGZvcm1Db250cmlidXRpb25zKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCQotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBpbnNlcnRpb25Qb2ludEVsZW1lbnRzID0gdGFnUG9wdXBNZW51WzBdLmdldENoaWxkcmVuKFRBR19JTlNFUlRJT05fUE9JTlQpOwotCQkJCQlJbnNlcnRpb25Qb2ludFtdIGluc2VydGlvblBvaW50cyA9IG5ldyBJbnNlcnRpb25Qb2ludFtpbnNlcnRpb25Qb2ludEVsZW1lbnRzLmxlbmd0aF07Ci0JCQkJCVN0cmluZyBuYW1lOwotCQkJCQlTdHJpbmcgc3RyaW5nQXR0U2VwYXJhdG9yOyAKLQkJCQkJCi0JCQkJCWJvb2xlYW4gaXNTZXBhcmF0b3I7Ci0JCQkJCWZvcihpbnQgaW5keD0wOyBpbmR4PCBpbnNlcnRpb25Qb2ludEVsZW1lbnRzLmxlbmd0aDsgaW5keCsrKSB7Ci0JCQkJCQluYW1lID0gaW5zZXJ0aW9uUG9pbnRFbGVtZW50c1tpbmR4XS5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotCQkJCQkJc3RyaW5nQXR0U2VwYXJhdG9yID0gaW5zZXJ0aW9uUG9pbnRFbGVtZW50c1tpbmR4XS5nZXRBdHRyaWJ1dGUoQVRUX1NFUEFSQVRPUik7Ci0JCQkJCQlpc1NlcGFyYXRvciA9IHN0cmluZ0F0dFNlcGFyYXRvciAhPSBudWxsID8gQm9vbGVhbi52YWx1ZU9mKHN0cmluZ0F0dFNlcGFyYXRvcikuYm9vbGVhblZhbHVlKCkgOiBmYWxzZTsKLQkJCQkJCWluc2VydGlvblBvaW50c1tpbmR4XSA9IG5ldyBJbnNlcnRpb25Qb2ludChuYW1lLCBpc1NlcGFyYXRvcik7Ci0JCQkJCX0KLQkJCQkJZGVzY3JpcHRvci5zZXRDdXN0b21JbnNlcnRpb25Qb2ludHMoaW5zZXJ0aW9uUG9pbnRzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoVEFHX1ZJRVdFUl9DT05URU5UX0JJTkRJTkcuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdmlld2VySWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVklFV0VSX0lEKTsKLQkJCQlOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRWaWV3ZXJEZXNjcmlwdG9yKHZpZXdlcklkKTsKLQkJCQlkZXNjcmlwdG9yLmNvbnN1bWVDb250ZW50QmluZGluZyhlbGVtZW50KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbG9nIGFuIGVycm9yIHNpbmNlIGl0cyBub3Qgc2FmZSB0byBvcGVuIGEgZGlhbG9nIGhlcmUKLQkJCQlOYXZpZ2F0b3JQbHVnaW4KLQkJCQkJCS5sb2coCi0JCQkJCQkJCSJVbmFibGUgdG8gY3JlYXRlIG5hdmlnYXRvciB2aWV3IGRlc2NyaXB0b3IuIiwgZS5nZXRTdGF0dXMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlpZiAoVEFHX1ZJRVdFUl9BQ1RJT05fQklORElORy5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB2aWV3ZXJJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9WSUVXRVJfSUQpOwotCQkJCU5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldFZpZXdlckRlc2NyaXB0b3Iodmlld2VySWQpOwotCQkJCWRlc2NyaXB0b3IuY29uc3VtZUFjdGlvbkJpbmRpbmcoZWxlbWVudCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBhbiBlcnJvciBzaW5jZSBpdHMgbm90IHNhZmUgdG8gb3BlbiBhIGRpYWxvZyBoZXJlCi0JCQkJTmF2aWdhdG9yUGx1Z2luCi0JCQkJCQkubG9nKAotCQkJCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBuYXZpZ2F0b3IgdmlldyBkZXNjcmlwdG9yLiIsIGUuZ2V0U3RhdHVzKCkpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yIGdldFZpZXdlckRlc2NyaXB0b3IoU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlOYXZpZ2F0b3JWaWV3ZXJEZXNjcmlwdG9yIHZpZXdlckRlc2NyaXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHZpZXdlckRlc2NyaXB0b3JzKSB7Ci0JCQl2aWV3ZXJEZXNjcmlwdG9yID0gKE5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IpIHZpZXdlckRlc2NyaXB0b3JzCi0JCQkJCS5nZXQoYVZpZXdlcklkKTsKLQkJCWlmICh2aWV3ZXJEZXNjcmlwdG9yICE9IG51bGwpCi0JCQkJcmV0dXJuIHZpZXdlckRlc2NyaXB0b3I7Ci0JCQl2aWV3ZXJEZXNjcmlwdG9yID0gbmV3IE5hdmlnYXRvclZpZXdlckRlc2NyaXB0b3IoYVZpZXdlcklkKTsKLQkJCXZpZXdlckRlc2NyaXB0b3JzLnB1dCh2aWV3ZXJEZXNjcmlwdG9yLmdldFZpZXdlcklkKCksCi0JCQkJCXZpZXdlckRlc2NyaXB0b3IpOwotCQl9Ci0JCXJldHVybiB2aWV3ZXJEZXNjcmlwdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL1JlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZjYzUzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yUGx1Z2luOwotCi0vKioKLSAqIFRlbXBsYXRlIGltcGxlbWVudGF0aW9uIG9mIGEgcmVnaXN0cnkgcmVhZGVyIHRoYXQgY3JlYXRlcyBvYmplY3RzIHJlcHJlc2VudGluZyByZWdpc3RyeSBjb250ZW50cy4KLSAqIFR5cGljYWxseSwgYW4gZXh0ZW5zaW9uIGNvbnRhaW5zIG9uZSBlbGVtZW50LCBidXQgdGhpcyByZWFkZXIgaGFuZGxlcyBtdWx0aXBsZSBlbGVtZW50cyBwZXIKLSAqIGV4dGVuc2lvbi4KLSAqIAotICogVG8gc3RhcnQgcmVhZGluZyB0aGUgZXh0ZW5zaW9ucyBmcm9tIHRoZSByZWdpc3RyeSBmb3IgYW4gZXh0ZW5zaW9uIHBvaW50LCBjYWxsIHRoZSBtZXRob2QKLSAqIDxjb2RlPnJlYWRSZWdpc3RyeTwvY29kZT4uCi0gKiAKLSAqIFRvIHJlYWQgY2hpbGRyZW4gb2YgYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBjYWxsIHRoZSBtZXRob2QgPGNvZGU+cmVhZEVsZW1lbnRDaGlsZHJlbjwvY29kZT4KLSAqIGZyb20geW91ciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kIDxjb2RlPnJlYWRFbGVtZW50PC9jb2RlPiwgYXMgaXQgd2lsbCBub3QgYmUgZG9uZSBieQotICogZGVmYXVsdC4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBleHRlbnNpb25Qb2ludElkOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgZmluYWwgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBSZWdpc3RyeVJlYWRlcihTdHJpbmcgYVBsdWdpbklkLCBTdHJpbmcgYW5FeHRlbnNpb25Qb2ludCkgewotCQl0aGlzLnJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJdGhpcy5wbHVnaW5JZCA9IGFQbHVnaW5JZDsKLQkJdGhpcy5leHRlbnNpb25Qb2ludElkID0gYW5FeHRlbnNpb25Qb2ludDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyBkZXNjcmlwdGlvbiBhcyBhIHN1YmVsZW1lbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiBzdHJpbmcgaWYgZGVmaW5lZCwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oVEFHX0RFU0NSSVBUSU9OKTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW5bMF0uZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGVycm9yIGluIHRoZSB3b3JrYmVuY2ggbG9nIHVzaW5nIHRoZSBwcm92aWRlZCB0ZXh0IGFuZCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlCi0JICogY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsvLyROT04tTkxTLTEkCi0JCU5hdmlnYXRvclBsdWdpbi5sb2coYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgYSB2ZXJ5IGNvbW1vbiByZWdpc3RyeSBlcnJvciB3aGVuIGEgcmVxdWlyZWQgYXR0cmlidXRlIGlzIG1pc3NpbmcuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvZ01pc3NpbmdBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCWxvZ0Vycm9yKGVsZW1lbnQsICJSZXF1aXJlZCBhdHRyaWJ1dGUgJyIgKyBhdHRyaWJ1dGVOYW1lICsgIicgbm90IGRlZmluZWQiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIExvZ3MgYSB2ZXJ5IGNvbW1vbiByZWdpc3RyeSBlcnJvciB3aGVuIGEgcmVxdWlyZWQgY2hpbGQgaXMgbWlzc2luZy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nTWlzc2luZ0VsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlsb2dFcnJvcihlbGVtZW50LCAiUmVxdWlyZWQgc3ViIGVsZW1lbnQgJyIgKyBlbGVtZW50TmFtZSArICInIG5vdCBkZWZpbmVkIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIGEgcmVnaXN0cnkgZXJyb3Igd2hlbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGlzIHVua25vd24uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvZ1Vua25vd25FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWxvZ0Vycm9yKGVsZW1lbnQsICJVbmtub3duIGV4dGVuc2lvbiB0YWcgZm91bmQ6ICIgKyBlbGVtZW50LmdldE5hbWUoKSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFwcGx5IGEgcmVwcm9kdWNhYmxlIG9yZGVyIHRvIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgcHJvdmlkZWQsIHN1Y2ggdGhhdCB0aGUgb3JkZXIgd2lsbCBub3QKLQkgKiBjaGFuZ2UgYXMgZXh0ZW5zaW9ucyBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSUV4dGVuc2lvbltdIG9yZGVyRXh0ZW5zaW9ucyhJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucykgewotCQkvLyBCeSBkZWZhdWx0LCB0aGUgb3JkZXIgaXMgYmFzZWQgb24gcGx1Z2luIGlkIHNvcnRlZAotCQkvLyBpbiBhc2NlbmRpbmcgb3JkZXIuIFRoZSBvcmRlciBmb3IgYSBwbHVnaW4gcHJvdmlkaW5nCi0JCS8vIG1vcmUgdGhhbiBvbmUgZXh0ZW5zaW9uIGZvciBhbiBleHRlbnNpb24gcG9pbnQgaXMKLQkJLy8gZGVwZW5kZW50IGluIHRoZSBvcmRlciBsaXN0ZWQgaW4gdGhlIFhNTCBmaWxlLgotCQlJRXh0ZW5zaW9uW10gc29ydGVkRXh0ZW5zaW9uID0gbmV3IElFeHRlbnNpb25bZXh0ZW5zaW9ucy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGV4dGVuc2lvbnMsIDAsIHNvcnRlZEV4dGVuc2lvbiwgMCwgZXh0ZW5zaW9ucy5sZW5ndGgpOwotCQlDb21wYXJhdG9yIGNvbXBhcmVyID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQkJU3RyaW5nIHMxID0gKChJRXh0ZW5zaW9uKSBhcmcwKS5nZXROYW1lc3BhY2UoKTsKLQkJCQlTdHJpbmcgczIgPSAoKElFeHRlbnNpb24pIGFyZzEpLmdldE5hbWVzcGFjZSgpOwotCQkJCXJldHVybiBzMS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyKTsKLQkJCX0KLQkJfTsKLQkJQ29sbGVjdGlvbnMuc29ydChBcnJheXMuYXNMaXN0KHNvcnRlZEV4dGVuc2lvbiksIGNvbXBhcmVyKTsKLQkJcmV0dXJuIHNvcnRlZEV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVhZCBlbGVtZW50J3MgYXR0cmlidXRlcy4gSWYgY2hpbGRyZW4gc2hvdWxkIGFsc28gYmUgcmVhZCwgdGhlbgotCSAqIGltcGxlbWVudG9yIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIDxjb2RlPnJlYWRFbGVtZW50Q2hpbGRyZW48L2NvZGU+LiBJbXBsZW1lbnRvciBpcwotCSAqIGFsc28gcmVzcG9uc2libGUgZm9yIGxvZ2dpbmcgbWlzc2luZyBhdHRyaWJ1dGVzLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBlbGVtZW50IHdhcyByZWNvZ25pemVkLCBmYWxzZSBpZiBub3QuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogUmVhZCB0aGUgZWxlbWVudCdzIGNoaWxkcmVuLiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgc3ViY2xhc3MnIHJlYWRFbGVtZW50IG1ldGhvZCB3aGVuIGl0IHdhbnRzCi0JICogdG8gcmVhZCB0aGUgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnRDaGlsZHJlbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlyZWFkRWxlbWVudHMoZWxlbWVudC5nZXRDaGlsZHJlbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkIGVhY2ggZWxlbWVudCBvbmUgYXQgYSB0aW1lIGJ5IGNhbGxpbmcgdGhlIHN1YmNsYXNzIGltcGxlbWVudGF0aW9uIG9mCi0JICogPGNvZGU+cmVhZEVsZW1lbnQ8L2NvZGU+LgotCSAqIAotCSAqIExvZ3MgYW4gZXJyb3IgaWYgdGhlIGVsZW1lbnQgd2FzIG5vdCByZWNvZ25pemVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50cyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKSkKLQkJCQlsb2dVbmtub3duRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWFkIG9uZSBleHRlbnNpb24gYnkgbG9vcGluZyB0aHJvdWdoIGl0cyBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRFeHRlbnNpb24oSUV4dGVuc2lvbiBleHRlbnNpb24pIHsKLQkJcmVhZEVsZW1lbnRzKGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSk7Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgdGhlIHJlZ2lzdHJ5IHJlYWRpbmcgcHJvY2VzcyB1c2luZyB0aGUgc3VwcGxpZWQgcGx1Z2luIElEIGFuZCBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybjsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoIWlzSW5pdGlhbGl6ZWQpIHsKLQkJCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnRJZCk7Ci0JCQkJaWYgKHBvaW50ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQlleHRlbnNpb25zID0gb3JkZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkJCQkJcmVhZEV4dGVuc2lvbihleHRlbnNpb25zW2ldKTsKLQkJCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQkJCX0KLQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL1NrZWxldG9uQWN0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9Ta2VsZXRvbkFjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MDM0MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL1NrZWxldG9uQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25BY3Rpb25Qcm92aWRlckNvbmZpZzsKLQotLyoqCi0gKiAKLSAqIEEgc2tlbGV0b24gYWN0aW9uIHByb3ZpZGVyIGlzIHVzZWQgYXMgYSBzaG9ydGN1dCB0byBhdm9pZCBhIGJ1bmNoIG9mIG51bGwKLSAqIGNoZWNrcy4gSW5zdGVhZCwgaWYgYSBjbGllbnQgZmFpbHMgdG8gcHJvdmlkZSBhIHZhbGlkIEFjdGlvbiBQcm92aWRlciBvcgotICogdGhlcmUgaXMgc29tZSBwcm9ibGVtIGluc3RhbnRpYXRpbmcgdGhlIGNsYXNzLCBhIHNrZWxldG9uIChuby1vcCBzaW5nbGV0b24pCi0gKiBpcyB1c2VkIGluIGl0cyBwbGFjZS4KLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgU2tlbGV0b25BY3Rpb25Qcm92aWRlciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEEgc2tlbGV0b24gYWN0aW9uIHByb3ZpZGVyIGlzIHVzZWQgYXMgYSBzaG9ydGN1dCB0byBhdm9pZCBhIGJ1bmNoIG9mIG51bGwKLQkgKiBjaGVja3MuIEluc3RlYWQsIGlmIGEgY2xpZW50IGZhaWxzIHRvIHByb3ZpZGUgYSB2YWxpZCBBY3Rpb24gUHJvdmlkZXIgb3IKLQkgKiB0aGVyZSBpcyBzb21lIHByb2JsZW0gaW5zdGFudGlhdGluZyB0aGUgY2xhc3MsIGEgc2tlbGV0b24gKG5vLW9wCi0JICogc2luZ2xldG9uKSBpcyB1c2VkIGluIGl0cyBwbGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1vbkFjdGlvblByb3ZpZGVyIElOU1RBTkNFID0gbmV3IFNrZWxldG9uQWN0aW9uUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU2tlbGV0b25BY3Rpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KENvbW1vbkFjdGlvblByb3ZpZGVyQ29uZmlnIGFDb25maWcpIHsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9Ta2VsZXRvbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9Ta2VsZXRvbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRhZDQwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvU2tlbGV0b25MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JRXh0ZW5zaW9uU3RhdGVNb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgU2tlbGV0b25MYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbW1vbkxhYmVsUHJvdmlkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTa2VsZXRvbkxhYmVsUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgU2tlbGV0b25MYWJlbFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFNrZWxldG9uTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCX0KLQotIAotCXB1YmxpYyB2b2lkIGluaXQoSUV4dGVuc2lvblN0YXRlTW9kZWwgYVN0YXRlTW9kZWwsIElUcmVlQ29udGVudFByb3ZpZGVyIGFDb250ZW50UHJvdmlkZXIpIHsKLQotCX0KLQotIAotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGFuRWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsgCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgeyAKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvU2tlbGV0b25UcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvU2tlbGV0b25UcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzN2VkOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9leHRlbnNpb25zL1NrZWxldG9uVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklFeHRlbnNpb25TdGF0ZU1vZGVsOwotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTa2VsZXRvblRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tbW9uQ29udGVudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2tlbGV0b25UcmVlQ29udGVudFByb3ZpZGVyIElOU1RBTkNFID0gbmV3IFNrZWxldG9uVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gTk9fQ0hJTERSRU4gPSBuZXcgT2JqZWN0WzBdOwotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgU2tlbGV0b25UcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCi0JCXJldHVybiBOT19DSElMRFJFTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQotCQlyZXR1cm4gTk9fQ0hJTERSRU47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgeyAKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7IAotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElFeHRlbnNpb25TdGF0ZU1vZGVsIGFTdGF0ZU1vZGVsLCBJTWVtZW50byBhTWVtZW50bykgeyAKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2V4dGVuc2lvbnMvU3RydWN0dXJlZFZpZXdlck1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9TdHJ1Y3R1cmVkVmlld2VyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjBiNzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZXh0ZW5zaW9ucy9TdHJ1Y3R1cmVkVmlld2VyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5Db21tb25OYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotCi0vKioKLSAqIDxwPgotICogUHJvdmlkZXMgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSB0byBpbnRlcmFjdCB3aXRoIFN0cnVjdHVyZWRWaWV3ZXJzIG92ZXIgdGltZS4gVGhlIENvbW1vbgotICogTmF2aWdhdG9yIGZyYW1ld29yayBhdHRlbXB0cyB0byBkZWZlciB0aGUgbG9hZGluZyBvZiBleHRlbnNpb25zLCB3aGljaCBhbHNvIG1lYW5zIGRlZmVyaW5nIHRoZQotICogbG9hZGluZyBvZiBDb250ZW50IFByb3ZpZGVycy4gVG8gZm9sbG93IHRoZSBjb250cmFjdHMgYWxyZWFkeSBpbiBwbGFjZSBieQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXJ9LCB0aGUgVmlld2VyLCBPbGQgSW5wdXQsIGFuZCBOZXcgSW5wdXQKLSAqIHBhcmFtZXRlcnMgZm9yCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCl9Ci0gKiBhcmUgY2FjaGVkIGZvciBjb250ZW50IHByb3ZpZGVycyB0aGF0IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+V0FSTklORzogPC9iPiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIG5vdCBpbmhlcmVudGx5IHRocmVhZC1zYWZlLiBBcHByb3ByaWF0ZSBtZWFzdXJlcyBzaG91bGQKLSAqIGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IHtAbGluayAjaW5wdXRDaGFuZ2VkKE9iamVjdCwgT2JqZWN0KX1hbmQKLSAqIHtAbGluayAjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpfWFyZSBub3QgY2FsbGVkIGNvbmN1cnJlbnRseSB3aXRoCi0gKiB7QGxpbmsgI2luaXRpYWxpemUoSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIpfS4KLSAqIAotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFZpZXdlck1hbmFnZXIgewotCi0JcHJpdmF0ZSBWaWV3ZXIgdmlld2VyOwotCXByaXZhdGUgT2JqZWN0IGNhY2hlZE9sZElucHV0OwotCXByaXZhdGUgT2JqZWN0IGNhY2hlZE5ld0lucHV0OwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRWaWV3ZXJNYW5hZ2VyKFZpZXdlciBhVmlld2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCXZpZXdlcj0gYVZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChPYmplY3QgYW5PbGRJbnB1dCwgT2JqZWN0IGFOZXdJbnB1dCkgewotCQljYWNoZWRPbGRJbnB1dD0gYW5PbGRJbnB1dDsKLQkJY2FjaGVkTmV3SW5wdXQ9IGFOZXdJbnB1dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFWaWV3ZXIsIE9iamVjdCBhbk9sZElucHV0LCBPYmplY3QgYU5ld0lucHV0KSB7Ci0JCXZpZXdlcj0gYVZpZXdlcjsKLQkJY2FjaGVkT2xkSW5wdXQ9IGFuT2xkSW5wdXQ7Ci0JCWNhY2hlZE5ld0lucHV0PSBhTmV3SW5wdXQ7Ci0JfQotCi0gCi0JcHVibGljIGJvb2xlYW4gaW5pdGlhbGl6ZShJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBhQ29udGVudFByb3ZpZGVyKSB7Ci0JCWJvb2xlYW4gcmVzdWx0PSB0cnVlOwotCQl0cnkgewotCQkJaWYgKGFDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCQlhQ29udGVudFByb3ZpZGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIGNhY2hlZE9sZElucHV0LCBjYWNoZWROZXdJbnB1dCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhlLnRvU3RyaW5nKCksIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTmF2aWdhdG9yUGx1Z2luLlBMVUdJTl9JRCwgMCwgZS50b1N0cmluZygpLCBlKSk7Ci0JCQlyZXN1bHQ9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2FmZVJlZnJlc2goKSB7Ci0JCVVJSm9iIHJlZnJlc2hKb2I9IG5ldyBVSUpvYihDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5TdHJ1Y3R1cmVkVmlld2VyTWFuYWdlcl8wKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXRyeSB7Ci0JCQkJCWlmKHZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CQkJCQkKLQkJCQkJRGlzcGxheSBkaXNwbGF5ID0gdmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCk7Ci0JCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkgJiYgdmlld2VyICE9IG51bGwpCi0JCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlOYXZpZ2F0b3JQbHVnaW4ubG9nKGUudG9TdHJpbmcoKSwgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBOYXZpZ2F0b3JQbHVnaW4uUExVR0lOX0lELCAwLCBlLnRvU3RyaW5nKCksIGUpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCXJlZnJlc2hKb2Iuc2NoZWR1bGUoKTsKLQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2ZpbHRlcnMvQ29tbW9uRmlsdGVyQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2ZpbHRlcnMvQ29tbW9uRmlsdGVyQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MzEzOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL0NvbW1vbkZpbHRlckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JDb250ZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5OYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvck1hbmFnZXI7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25GaWx0ZXJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvck1hbmFnZXIgQ09OVEVOVF9ERVNDUklQVE9SX1JFR0lTVFJZID0gTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JcHJpdmF0ZSBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgY29udGVudFNlcnZpY2U7Ci0KLQlwdWJsaWMgQ29tbW9uRmlsdGVyQ29udGVudFByb3ZpZGVyKCkgewotCX0KLSAKLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgTmF2aWdhdG9yQ29udGVudFNlcnZpY2UpCi0JCQljb250ZW50U2VydmljZSA9IChJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UpIG5ld0lucHV0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0KLQkJRXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkgZmlsdGVyUmVnaXN0cnkgPSBFeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRWaWV3ZXJSZWdpc3RyeShjb250ZW50U2VydmljZS5nZXRWaWV3ZXJJZCgpKTsKLQotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gQ09OVEVOVF9ERVNDUklQVE9SX1JFR0lTVFJZLmdldEFsbENvbnRlbnREZXNjcmlwdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKQotCQkJaWYgKFV0aWxpdGllcy5pc0FjdGl2ZShjb250ZW50U2VydmljZQotCQkJCQkuZ2V0Vmlld2VyRGVzY3JpcHRvcigpLCBkZXNjcmlwdG9yc1tpXSkKLQkJCQkJJiYgVXRpbGl0aWVzLmlzVmlzaWJsZShjb250ZW50U2VydmljZQotCQkJCQkJCS5nZXRWaWV3ZXJEZXNjcmlwdG9yKCksIGRlc2NyaXB0b3JzW2ldKSkKLQkJCXJlc3VsdHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZmlsdGVyUmVnaXN0cnkuZ2V0QWxsRGVzY3JpcHRvcnMoZGVzY3JpcHRvcnNbaV0uZ2V0SWQoKSkpKTsKLQotCQlyZXR1cm4gcmVzdWx0cy50b0FycmF5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL0NvbW1vbkZpbHRlckxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZmlsdGVycy9Db21tb25GaWx0ZXJMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZjBmM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL0NvbW1vbkZpbHRlckxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5OYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5OYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvck1hbmFnZXI7Ci0vKioKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIgCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uRmlsdGVyTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIsIElMYWJlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yTWFuYWdlciBDT05URU5UX0RFU0NSSVBUT1JfUkVHSVNUUlkgPSBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQotCXB1YmxpYyBDb21tb25GaWx0ZXJMYWJlbFByb3ZpZGVyKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yKQotCQkJcmV0dXJuIENPTlRFTlRfREVTQ1JJUFRPUl9SRUdJU1RSWS5nZXRJbWFnZSgoKElOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0SWQoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IpCi0JCQlyZXR1cm4gKChJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IpCi0JCQlyZXR1cm4gKChFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIGdldEltYWdlKGVsZW1lbnQpOwotCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gZ2V0VGV4dChlbGVtZW50KTsKLQkJCWNhc2UgMSA6IHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IpIHsKLQkJCQkJU3RyaW5nIGQgPSAoKEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IpIGVsZW1lbnQpLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJCXJldHVybiBkID09IG51bGwgPyAiIiA6IGQ7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2ZpbHRlcnMvQ29tbW9uRmlsdGVyU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2ZpbHRlcnMvQ29tbW9uRmlsdGVyU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MjRhNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL0NvbW1vbkZpbHRlclNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgOSwgMjAwNAotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLk5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5Db21tb25OYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLk5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLk5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yTWFuYWdlcjsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsCi0gKiB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0Ci0gKiBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uRmlsdGVyU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlIE5BVklHQVRPUl9BQ1RJVkFUSU9OX1NFUlZJQ0UgPSBOYXZpZ2F0b3JBY3RpdmF0aW9uU2VydmljZQotCQkJLmdldEluc3RhbmNlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvck1hbmFnZXIgQ09OVEVOVF9ERVNDUklQVE9SX1JFR0lTVFJZID0gTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyCi0JCQkuZ2V0SW5zdGFuY2UoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIE5PX0NISUxEUkVOID0gbmV3IE9iamVjdFswXTsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBleHRlbnNpb25zQ2hlY2tib3hUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgVGV4dCBkZXNjcmlwdGlvblRleHQ7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgdXBkYXRlRGVzY3JpcHRpb25TZWxlY3Rpb25MaXN0ZW5lcjsKLQotCXByaXZhdGUgVGFiRm9sZGVyIGZpbHRlcnNUYWJGb2xkZXI7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgZmlsdGVyc0NoZWNrYm94VGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIENvbW1vbk5hdmlnYXRvciBjb21tb25OYXZpZ2F0b3I7Ci0KLQlwcml2YXRlIGZpbmFsIENvbW1vblZpZXdlciBjb21tb25WaWV3ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIElOYXZpZ2F0b3JDb250ZW50U2VydmljZSBjb250ZW50U2VydmljZTsKLQotCS8qKgotCSAqIEBwYXJhbSBhcmcwCi0JICovCi0JcHVibGljIENvbW1vbkZpbHRlclNlbGVjdGlvbkRpYWxvZyhDb21tb25OYXZpZ2F0b3IgYUNvbW1vbk5hdmlnYXRvcikgewotCQlzdXBlcihhQ29tbW9uTmF2aWdhdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuUkVTSVpFIHwgZ2V0U2hlbGxTdHlsZSgpKTsKLQotCQljb21tb25OYXZpZ2F0b3IgPSBhQ29tbW9uTmF2aWdhdG9yOwotCQljb21tb25WaWV3ZXIgPSBjb21tb25OYXZpZ2F0b3IuZ2V0Q29tbW9uVmlld2VyKCk7Ci0JCWNvbnRlbnRTZXJ2aWNlID0gY29tbW9uVmlld2VyLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KAotCQkJCUNvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLkNvbW1vbkZpbHRlclNlbGVjdGlvbkRpYWxvZ18wKTsKLQkJQ29tcG9zaXRlIHN1cGVyQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCWNyZWF0ZUZpbHRlcnNUYWJGb2xkZXIoc3VwZXJDb21wb3NpdGUpOwotCi0JCUNvbXBvc2l0ZSBleHRlbnNpb25zQ29tcG9zaXRlID0gY3JlYXRlQ29udGFpbmVyQ29tcG9zaXRlKGZpbHRlcnNUYWJGb2xkZXIpOwotCQkvKiBjcmVhdGVUaXRsZUxhYmVsKGV4dGVuc2lvbnNDb21wb3NpdGUpOyAqLwotCQljcmVhdGVFeHRlbnNpb25zVGFibGVWaWV3ZXIoZXh0ZW5zaW9uc0NvbXBvc2l0ZSk7Ci0KLQkJQ29tcG9zaXRlIGZpbHRlcnNDb21wb3NpdGUgPSBjcmVhdGVDb250YWluZXJDb21wb3NpdGUoZmlsdGVyc1RhYkZvbGRlcik7Ci0JCWNyZWF0ZUZpbHRlcnNUYWJsZVZpZXdlcihmaWx0ZXJzQ29tcG9zaXRlKTsKLQotCQljcmVhdGVEZXNjcmlwdGlvblRleHQoc3VwZXJDb21wb3NpdGUpOwotCi0JCWNyZWF0ZVRhYkl0ZW0oZmlsdGVyc1RhYkZvbGRlciwKLQkJCQlDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5Db21tb25GaWx0ZXJTZWxlY3Rpb25EaWFsb2dfMCwKLQkJCQlmaWx0ZXJzQ29tcG9zaXRlKTsKLQkJY3JlYXRlVGFiSXRlbShmaWx0ZXJzVGFiRm9sZGVyLAotCQkJCUNvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLkNvbW1vbkZpbHRlclNlbGVjdGlvbkRpYWxvZ18xLAotCQkJCWV4dGVuc2lvbnNDb21wb3NpdGUpOwotCi0JCWRlc2NyaXB0aW9uVGV4dC5zZXRCYWNrZ3JvdW5kKHN1cGVyQ29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0KLQkJdXBkYXRlQ2hlY2tlZEl0ZW1zKCk7Ci0KLQkJcmV0dXJuIGV4dGVuc2lvbnNDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN1cGVyQ29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbHRlcnNUYWJGb2xkZXIoQ29tcG9zaXRlIHN1cGVyQ29tcG9zaXRlKSB7Ci0JCWZpbHRlcnNUYWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHN1cGVyQ29tcG9zaXRlLCBTV1QuUkVTSVpFKTsKLQkJY3JlYXRlU3RhbmRhcmRMYXlvdXQoZmlsdGVyc1RhYkZvbGRlcik7Ci0JCWZpbHRlcnNUYWJGb2xkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZGVzY3JpcHRpb25UZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsdGVyc1RhYkZvbGRlckFyZwotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFiSXRlbShUYWJGb2xkZXIgZmlsdGVyc1RhYkZvbGRlckFyZywgU3RyaW5nIGxhYmVsLAotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlUYWJJdGVtIGV4dGVuc2lvbnNUYWJJdGVtID0gbmV3IFRhYkl0ZW0oZmlsdGVyc1RhYkZvbGRlckFyZywgU1dULk5PTkUpOwotCQlleHRlbnNpb25zVGFiSXRlbS5zZXRUZXh0KGxhYmVsKTsKLQkJZXh0ZW5zaW9uc1RhYkl0ZW0uc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU3RhbmRhcmRMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN1cGVyQ29tcG9zaXRlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbnRhaW5lckNvbXBvc2l0ZShDb21wb3NpdGUgc3VwZXJDb21wb3NpdGUpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc3VwZXJDb21wb3NpdGUsIFNXVC5SRVNJWkUpOwotCi0JCWNyZWF0ZVN0YW5kYXJkTGF5b3V0KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFeHRlbnNpb25zSW5zdHJ1Y3Rpb25zTGFiZWwoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlMYWJlbCBleHRlbnNpb25zSW5zdHJ1Y3Rpb25MYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5CT0xECi0JCQkJfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxKSArIDM7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscygyKTsKLQkJLyogZ3JpZERhdGEudmVydGljYWxTcGFuID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDIpOyAqLwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEw7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEw7Ci0KLQkJZXh0ZW5zaW9uc0luc3RydWN0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWV4dGVuc2lvbnNJbnN0cnVjdGlvbkxhYmVsCi0JCQkJLnNldFRleHQoQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuQ29tbW9uRmlsdGVyU2VsZWN0aW9uRGlhbG9nXzMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRmlsdGVyc0luc3RydWN0aW9uc0xhYmVsKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJTGFiZWwgZmlsdGVyc0luc3RydWN0aW9uTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuQk9MRAotCQkJCXwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMSkgKyAzOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoMik7Ci0JCS8qIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygyKTsgKi8KLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCi0JCWZpbHRlcnNJbnN0cnVjdGlvbkxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlmaWx0ZXJzSW5zdHJ1Y3Rpb25MYWJlbAotCQkJCS5zZXRUZXh0KENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLkNvbW1vbkZpbHRlclNlbGVjdGlvbkRpYWxvZ180KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlc2NyaXB0aW9uVGV4dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWRlc2NyaXB0aW9uVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwKLQkJCQl8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkZXNjcmlwdGlvblRleHRHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkZXNjcmlwdGlvblRleHRHcmlkRGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygzKTsKLQkJZGVzY3JpcHRpb25UZXh0LnNldExheW91dERhdGEoZGVzY3JpcHRpb25UZXh0R3JpZERhdGEpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRmlsdGVyc1RhYmxlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJZmlsdGVyc0NoZWNrYm94VGFibGVWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdCgKLQkJCQljb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVTSVpFIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlmaWx0ZXJzQ2hlY2tib3hUYWJsZVZpZXdlcgotCQkJCS5zZXRDb250ZW50UHJvdmlkZXIobmV3IENvbW1vbkZpbHRlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJZmlsdGVyc0NoZWNrYm94VGFibGVWaWV3ZXIKLQkJCQkuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29tbW9uRmlsdGVyTGFiZWxQcm92aWRlcigpKTsKLQkJZmlsdGVyc0NoZWNrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQoY29udGVudFNlcnZpY2UpOwotCi0JCWNyZWF0ZUZpbHRlcnNJbnN0cnVjdGlvbnNMYWJlbChjb21wb3NpdGUpOwotCi0JCWNyZWF0ZUNoZWNrYm94VGFibGUoZmlsdGVyc0NoZWNrYm94VGFibGVWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRXh0ZW5zaW9uc1RhYmxlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJZXh0ZW5zaW9uc0NoZWNrYm94VGFibGVWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdCgKLQkJCQljb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVTSVpFKTsKLQotCQlleHRlbnNpb25zQ2hlY2tib3hUYWJsZVZpZXdlcgotCQkJCS5zZXRDb250ZW50UHJvdmlkZXIobmV3IEV4dGVuc2lvbkNvbnRlbnRQcm92aWRlcigpKTsKLQkJZXh0ZW5zaW9uc0NoZWNrYm94VGFibGVWaWV3ZXIKLQkJCQkuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29tbW9uRmlsdGVyTGFiZWxQcm92aWRlcigpKTsKLQkJZXh0ZW5zaW9uc0NoZWNrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQoY29udGVudFNlcnZpY2UpOwotCi0JCWNyZWF0ZUV4dGVuc2lvbnNJbnN0cnVjdGlvbnNMYWJlbChjb21wb3NpdGUpOwotCi0JCWNyZWF0ZUNoZWNrYm94VGFibGUoZXh0ZW5zaW9uc0NoZWNrYm94VGFibGVWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDaGVja2JveFRhYmxlKENoZWNrYm94VGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIpIHsKLQkJVGFibGUgdGFibGUgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCQlHcmlkTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJdGFibGVMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsgLy8gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJdGFibGVMYXlvdXQubWFyZ2luV2lkdGggPSAwOyAvLyBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJdGFibGVMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsgLy8gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCXRhYmxlTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsgLy8gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQl0YWJsZUxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJR3JpZERhdGEgdGFibGVHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl0YWJsZUdyaWREYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDEwMCk7Ci0JCXRhYmxlR3JpZERhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyg1MCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCXRhYmxlLnNldExheW91dERhdGEodGFibGVHcmlkRGF0YSk7Ci0JfQotCi0JcHVibGljIGNsYXNzIFVwZGF0ZURlc2NyaXB0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJT2JqZWN0IGVsZW1lbnQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcikgewotCQkJCUlOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciBuY2QgPSAoSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCVN0cmluZyBkZXNjID0gTkxTLmJpbmQoCi0JCQkJCQlDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5Db21tb25GaWx0ZXJTZWxlY3Rpb25EaWFsb2dfMiwKLQkJCQkJCW5ldyBPYmplY3RbXSB7IG5jZC5nZXROYW1lKCkgfSk7Ci0JCQkJZGVzY3JpcHRpb25UZXh0LnNldFRleHQoZGVzYyk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yKSB7Ci0JCQkJRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvciBlZmQgPSAoRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQlkZXNjcmlwdGlvblRleHQuc2V0VGV4dChlZmQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2hlY2tlZEl0ZW1zKCkgewotCi0JCWV4dGVuc2lvbnNDaGVja2JveFRhYmxlVmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihnZXRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZmlsdGVyc0NoZWNrYm94VGFibGVWaWV3ZXIKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGdldFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCXVwZGF0ZUV4dGVuc2lvbnNDaGVja1N0YXRlKCk7Ci0JCXVwZGF0ZUZpbHRlcnNDaGVja1N0YXRlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUV4dGVuc2lvbnNDaGVja1N0YXRlKCkgewotCQlOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQlib29sZWFuIGVuYWJsZWQ7Ci0KLQkJVGFibGVJdGVtW10gZGVzY3JpcHRvclRhYmxlSXRlbXMgPSBleHRlbnNpb25zQ2hlY2tib3hUYWJsZVZpZXdlcgotCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvclRhYmxlSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkZXNjcmlwdG9yVGFibGVJdGVtc1tpXS5nZXREYXRhKCkgaW5zdGFuY2VvZiBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcikgewotCQkJCWRlc2NyaXB0b3IgPSAoTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IpIGRlc2NyaXB0b3JUYWJsZUl0ZW1zW2ldCi0JCQkJCQkuZ2V0RGF0YSgpOwotCQkJCWVuYWJsZWQgPSBOQVZJR0FUT1JfQUNUSVZBVElPTl9TRVJWSUNFCi0JCQkJCQkuaXNOYXZpZ2F0b3JFeHRlbnNpb25BY3RpdmUoY29udGVudFNlcnZpY2UKLQkJCQkJCQkJLmdldFZpZXdlcklkKCksIGRlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0JCQkJZXh0ZW5zaW9uc0NoZWNrYm94VGFibGVWaWV3ZXIuc2V0Q2hlY2tlZChkZXNjcmlwdG9yLCBlbmFibGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVGaWx0ZXJzQ2hlY2tTdGF0ZSgpIHsKLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gKElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKSBmaWx0ZXJzQ2hlY2tib3hUYWJsZVZpZXdlcgotCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBjb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMoY29udGVudFNlcnZpY2UpOwotCQlFeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeSBmaWx0ZXJSZWdpc3RyeSA9IEV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldFZpZXdlclJlZ2lzdHJ5KGNvbnRlbnRTZXJ2aWNlLmdldFZpZXdlcklkKCkpOwotCQlFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yIGZpbHRlckRlc2NyaXB0b3IgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaWx0ZXJEZXNjcmlwdG9yID0gKEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IpIGNoaWxkcmVuW2ldOwotCQkJZmlsdGVyc0NoZWNrYm94VGFibGVWaWV3ZXIuc2V0Q2hlY2tlZChjaGlsZHJlbltpXSwgZmlsdGVyUmVnaXN0cnkKLQkJCQkJLmdldEFjdGl2YXRpb25NYW5hZ2VyKCkuaXNGaWx0ZXJBY3RpdmUoZmlsdGVyRGVzY3JpcHRvcikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBnZXRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJaWYgKHVwZGF0ZURlc2NyaXB0aW9uU2VsZWN0aW9uTGlzdGVuZXIgPT0gbnVsbCkKLQkJCXVwZGF0ZURlc2NyaXB0aW9uU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgVXBkYXRlRGVzY3JpcHRpb25MaXN0ZW5lcigpOwotCQlyZXR1cm4gdXBkYXRlRGVzY3JpcHRpb25TZWxlY3Rpb25MaXN0ZW5lcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCi0JCWJvb2xlYW4gdXBkYXRlRXh0ZW5zaW9uQWN0aXZhdGlvbiA9IGZhbHNlOwotCQlib29sZWFuIHVwZGF0ZUZpbHRlckFjdGl2YXRpb24gPSBmYWxzZTsKLQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQlFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yIGZpbHRlckRlc2NyaXB0b3IgPSBudWxsOwotCi0JCUV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5IGZpbHRlclJlZ2lzdHJ5ID0gRXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Vmlld2VyUmVnaXN0cnkoY29udGVudFNlcnZpY2UuZ2V0Vmlld2VySWQoKSk7Ci0JCVRhYmxlSXRlbVtdIGV4dGVuc2lvblRhYmxlSXRlbXMgPSBleHRlbnNpb25zQ2hlY2tib3hUYWJsZVZpZXdlcgotCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGRlc2NyaXB0b3JJbmRleCA9IDA7IGRlc2NyaXB0b3JJbmRleCA8IGV4dGVuc2lvblRhYmxlSXRlbXMubGVuZ3RoOyBkZXNjcmlwdG9ySW5kZXgrKykgewotCi0JCQlpZiAoZXh0ZW5zaW9uVGFibGVJdGVtc1tkZXNjcmlwdG9ySW5kZXhdLmdldERhdGEoKSBpbnN0YW5jZW9mIE5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yKSB7Ci0JCQkJZGVzY3JpcHRvciA9IChOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcikgZXh0ZW5zaW9uVGFibGVJdGVtc1tkZXNjcmlwdG9ySW5kZXhdCi0JCQkJCQkuZ2V0RGF0YSgpOwotCi0JCQkJZW5hYmxlZCA9IGV4dGVuc2lvbnNDaGVja2JveFRhYmxlVmlld2VyLmdldENoZWNrZWQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKGVuYWJsZWQgIT0gTkFWSUdBVE9SX0FDVElWQVRJT05fU0VSVklDRQotCQkJCQkJLmlzTmF2aWdhdG9yRXh0ZW5zaW9uQWN0aXZlKGNvbnRlbnRTZXJ2aWNlCi0JCQkJCQkJCS5nZXRWaWV3ZXJJZCgpLCBkZXNjcmlwdG9yLmdldElkKCkpKSB7Ci0JCQkJCXVwZGF0ZUV4dGVuc2lvbkFjdGl2YXRpb24gPSB0cnVlOwotCQkJCQlOQVZJR0FUT1JfQUNUSVZBVElPTl9TRVJWSUNFLmFjdGl2YXRlTmF2aWdhdG9yRXh0ZW5zaW9uKAotCQkJCQkJCWNvbnRlbnRTZXJ2aWNlLmdldFZpZXdlcklkKCksIGRlc2NyaXB0b3IuZ2V0SWQoKSwKLQkJCQkJCQllbmFibGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlUYWJsZUl0ZW1bXSBmaWx0ZXJUYWJsZUl0ZW1zID0gZmlsdGVyc0NoZWNrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKQotCQkJCS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBkZXNjcmlwdG9ySW5kZXggPSAwOyBkZXNjcmlwdG9ySW5kZXggPCBmaWx0ZXJUYWJsZUl0ZW1zLmxlbmd0aDsgZGVzY3JpcHRvckluZGV4KyspIHsKLQotCQkJaWYgKGZpbHRlclRhYmxlSXRlbXNbZGVzY3JpcHRvckluZGV4XS5nZXREYXRhKCkgaW5zdGFuY2VvZiBFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yKSB7Ci0JCQkJZmlsdGVyRGVzY3JpcHRvciA9IChFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yKSBmaWx0ZXJUYWJsZUl0ZW1zW2Rlc2NyaXB0b3JJbmRleF0KLQkJCQkJCS5nZXREYXRhKCk7Ci0JCQkJZW5hYmxlZCA9IGZpbHRlcnNDaGVja2JveFRhYmxlVmlld2VyCi0JCQkJCQkuZ2V0Q2hlY2tlZChmaWx0ZXJEZXNjcmlwdG9yKTsKLQkJCQlpZiAoZmlsdGVyUmVnaXN0cnkuZ2V0QWN0aXZhdGlvbk1hbmFnZXIoKS5pc0ZpbHRlckFjdGl2ZSgKLQkJCQkJCWZpbHRlckRlc2NyaXB0b3IpICE9IGVuYWJsZWQpIHsKLQkJCQkJdXBkYXRlRmlsdGVyQWN0aXZhdGlvbiA9IHRydWU7Ci0JCQkJCWZpbHRlclJlZ2lzdHJ5LmdldEFjdGl2YXRpb25NYW5hZ2VyKCkuYWN0aXZhdGVGaWx0ZXIoCi0JCQkJCQkJZmlsdGVyRGVzY3JpcHRvciwgZW5hYmxlZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh1cGRhdGVFeHRlbnNpb25BY3RpdmF0aW9uKQotCQkJTkFWSUdBVE9SX0FDVElWQVRJT05fU0VSVklDRQotCQkJCQkucGVyc2lzdEV4dGVuc2lvbkFjdGl2YXRpb25zKGNvbnRlbnRTZXJ2aWNlLmdldFZpZXdlcklkKCkpOwotCQlpZiAodXBkYXRlRmlsdGVyQWN0aXZhdGlvbikKLQkJCWZpbHRlclJlZ2lzdHJ5LmdldEFjdGl2YXRpb25NYW5hZ2VyKCkucGVyc2lzdEZpbHRlckFjdGl2YXRpb25zKCk7Ci0JCWlmICh1cGRhdGVFeHRlbnNpb25BY3RpdmF0aW9uIHx8IHVwZGF0ZUZpbHRlckFjdGl2YXRpb24pIHsKLQkJCWNvbnRlbnRTZXJ2aWNlLnVwZGF0ZSgpOwotCQkJLy8gdGhlIGFjdGlvbiBwcm92aWRlcnMgbWF5IG5vIGxvbmdlciBiZSBlbmFibGVkLCBzbyB3ZSByZXNldCB0aGUgc2VsZWN0aW9uLgotCQkJY29tbW9uVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJfQotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCWNsYXNzIEV4dGVuc2lvbkNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotIAkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhVmlld2VyLCBPYmplY3QgYW5PbGRJbnB1dCwKLQkJCQlPYmplY3QgYU5ld0lucHV0KSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgYVBhcmVudEVsZW1lbnQpIHsKLQkJCXJldHVybiBOT19DSElMRFJFTjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBhbkVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgYW5FbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oYW5FbGVtZW50KS5sZW5ndGggIT0gMDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBhbklucHV0RWxlbWVudCkgewotCQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBDT05URU5UX0RFU0NSSVBUT1JfUkVHSVNUUlkKLQkJCQkJLmdldEFsbENvbnRlbnREZXNjcmlwdG9ycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoVXRpbGl0aWVzLmlzVmlzaWJsZShjb250ZW50U2VydmljZQotCQkJCQkJCQkuZ2V0Vmlld2VyRGVzY3JpcHRvcigpLCBkZXNjcmlwdG9yc1tpXSkpCi0JCQkJCXJlc3VsdHMuYWRkKGRlc2NyaXB0b3JzW2ldKTsKLQotCQkJcmV0dXJuIHJlc3VsdHMuc2l6ZSgpID4gMCA/IHJlc3VsdHMudG9BcnJheSgpIDogTk9fQ0hJTERSRU47Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL0NvbW1vblZpZXdlckZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL0NvbW1vblZpZXdlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmZlNmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZmlsdGVycy9Db21tb25WaWV3ZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLk5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb247Ci0KLS8qKgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIENvbW1vblZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvck1hbmFnZXIgQ09OVEVOVF9ERVNDUklQVE9SX1JFR0lTVFJZID0gTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JcHJpdmF0ZSBmaW5hbCBDb21tb25WaWV3ZXIgY29tbW9uVmlld2VyOwotCXByaXZhdGUgZmluYWwgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGNvbnRlbnRTZXJ2aWNlOwotCi0JLyoqCi0JICogIEBwYXJhbSBhVmlld2VyIFRoZSB2aWV3ZXIgdGhhdCB0aGlzIGZpbHRlciB3aWxsIHNlcnZpY2UuCi0JICovCi0JcHVibGljIENvbW1vblZpZXdlckZpbHRlcihDb21tb25WaWV3ZXIgYVZpZXdlcikgewotCQlzdXBlcigpOwotCQljb21tb25WaWV3ZXIgPSBhVmlld2VyOwotCQljb250ZW50U2VydmljZSA9IGFWaWV3ZXIuZ2V0TmF2aWdhdG9yQ29udGVudFNlcnZpY2UoKTsKLQl9Ci0KLQkvKiogCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlciNzZWxlY3Qob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiBzZWxlY3QgPSB0cnVlOwotCQlTZXQgY29udGVudERlc2NyaXB0b3JzID0gQ09OVEVOVF9ERVNDUklQVE9SX1JFR0lTVFJZLmdldEVuYWJsZWRDb250ZW50RGVzY3JpcHRvcnMoZWxlbWVudCwgY29udGVudFNlcnZpY2UuZ2V0Vmlld2VyRGVzY3JpcHRvcigpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjb250ZW50RGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCkgJiYgc2VsZWN0OykgewotCQkJTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChOYXZpZ2F0b3JDb250ZW50RGVzY3JpcHRvcikgZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoVXRpbGl0aWVzLmlzQWN0aXZlKGNvbnRlbnRTZXJ2aWNlLmdldFZpZXdlckRlc2NyaXB0b3IoKSwgZGVzY3JpcHRvcikgJiYKLQkJCQkJVXRpbGl0aWVzLmlzVmlzaWJsZShjb250ZW50U2VydmljZS5nZXRWaWV3ZXJEZXNjcmlwdG9yKCksIGRlc2NyaXB0b3IpKSAKLQkJCXsKLQkJCQlFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yW10gZW5hYmxlZEZpbHRlcnMgPSBFeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRWaWV3ZXJSZWdpc3RyeShjb250ZW50U2VydmljZS5nZXRWaWV3ZXJJZCgpKS5nZXRBY3RpdmVEZXNjcmlwdG9ycyhkZXNjcmlwdG9yLmdldElkKCkpOwotCi0JCQkJZm9yIChpbnQgZmlsdGVyaW5keCA9IDA7IGZpbHRlcmluZHggPCBlbmFibGVkRmlsdGVycy5sZW5ndGg7IGZpbHRlcmluZHgrKykgewotCQkJCQlJTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyIGZpbHRlciA9IGVuYWJsZWRGaWx0ZXJzW2ZpbHRlcmluZHhdLmdldEluc3RhbmNlKCk7Ci0JCQkJCS8qCi0JCQkJCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiRWxlbWVudDogIiArIGVsZW1lbnQgKyAiIGlzRmlsdGVyZWQ6ICIgKwotCQkJCQkgKiAhZmlsdGVyLnNlbGVjdChnZXRFeHRlbnNpb25TaXRlKCksIHBhcmVudEVsZW1lbnQsIGVsZW1lbnQpKTsKLQkJCQkJICovCi0JCQkJCWlmICghZmlsdGVyLnNlbGVjdChjb21tb25WaWV3ZXIsIHBhcmVudEVsZW1lbnQsIGVsZW1lbnQpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7IAotCQkJCQl9Ci0JCQkJfQotCQkJCU5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24gZXh0ZW5zaW9uID0gKChOYXZpZ2F0b3JDb250ZW50U2VydmljZSljb250ZW50U2VydmljZSkuZ2V0RXh0ZW5zaW9uKGRlc2NyaXB0b3IpOwotCQkJCQotCQkJCUlOYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXJbXSBlbmZvcmNlZEZpbHRlcnMgPSBleHRlbnNpb24uZ2V0RHVwbGljYXRlQ29udGVudEZpbHRlcnMoKTsKLQkJCQlmb3IoaW50IGk9MDsgaTxlbmZvcmNlZEZpbHRlcnMubGVuZ3RoOyBpKyspCi0JCQkJCWlmKCFlbmZvcmNlZEZpbHRlcnNbaV0uc2VsZWN0KGNvbW1vblZpZXdlciwgcGFyZW50RWxlbWVudCwgZWxlbWVudCkpIAotCQkJCQkJcmV0dXJuIGZhbHNlOwkJCQkKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzZWxlY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2ZpbHRlcnMvRXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZmlsdGVycy9FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTM4ZDQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZmlsdGVycy9FeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLk5hdmlnYXRvclBsdWdpbjsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZBVEVEX0ZJTFRFUlMgPSAiYWN0aXZhdGVkRmlsdGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIEFzc29jaWF0ZXMgdGhpcyBFeHRlbnNpb25GaWx0ZXJSZWdpc3RyeSB3aXRoIGEgc3BlY2lmaWMgQ29tbW9uIE5hdmlnYXRvciBpbnN0YW5jZSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHZpZXdlcklkOwotCi0JLyogTWFpbnRhaW5zIGEgbGlzdCBvZiB0aGUgYWN0aXZlIGZpbHRlcnMgZm9yIHRoZSB2aWV3ZXIgd2l0aCB0aGUgdmlld2VyaWQgKi8KLQlwcml2YXRlIGZpbmFsIFNldCBhY3RpdmF0ZWRGaWx0ZXJzID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgZmluYWwgRXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkgcGFyZW50UmVnaXN0cnk7Ci0KLQlwdWJsaWMgRXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIoU3RyaW5nIHRoZVZpZXdlcklkLCBFeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeSB0aGVQYXJlbnRSZWdpc3RyeSkgewotCQl0aGlzLnZpZXdlcklkID0gdGhlVmlld2VySWQ7Ci0JCXRoaXMucGFyZW50UmVnaXN0cnkgPSB0aGVQYXJlbnRSZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZUZpbHRlcihFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAoZW5hYmxlZCkKLQkJCWdldEFjdGl2YXRlZEZpbHRlcnMoKS5hZGQoZ2V0RmlsdGVyQWN0aXZhdGlvblByZWZlcmVuY2VLZXkoZGVzY3JpcHRvcikpOwotCQllbHNlCi0JCQlnZXRBY3RpdmF0ZWRGaWx0ZXJzKCkucmVtb3ZlKGdldEZpbHRlckFjdGl2YXRpb25QcmVmZXJlbmNlS2V5KGRlc2NyaXB0b3IpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlckFjdGl2ZShFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIGdldEFjdGl2YXRlZEZpbHRlcnMoKS5jb250YWlucyhnZXRGaWx0ZXJBY3RpdmF0aW9uUHJlZmVyZW5jZUtleShkZXNjcmlwdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmV2ZXJ0RmlsdGVyQWN0aXZhdGlvbnMoU3RyaW5nIG5hdmlnYXRvckV4dGVuc2lvbklkS2V5KSB7Ci0KLQkJdHJ5IHsKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQlTdHJpbmcgYWN0aXZhdGVkRmlsdGVyc1N0cmluZyA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhnZXRFeHRlbnNpb25QcmVmZXJlbmNlS2V5Rm9yRmlsdGVyQWN0aXZhdGlvbnMobmF2aWdhdG9yRXh0ZW5zaW9uSWRLZXkpKTsKLQkJCXN5bmNocm9uaXplZCAoYWN0aXZhdGVkRmlsdGVycykgewotCQkJCWlmIChhY3RpdmF0ZWRGaWx0ZXJzU3RyaW5nICE9IG51bGwgJiYgYWN0aXZhdGVkRmlsdGVyc1N0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJU3RyaW5nIGFjdGl2YXRlZEV4dGVuc2lvbktleSA9IG51bGw7Ci0JCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGFjdGl2YXRlZEZpbHRlcnNTdHJpbmcsICI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCWFjdGl2YXRlZEV4dGVuc2lvbktleSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCWlmIChhY3RpdmF0ZWRFeHRlbnNpb25LZXkubGVuZ3RoKCkgPiAwKQotCQkJCQkJCWFjdGl2YXRlZEZpbHRlcnMuYWRkKGFjdGl2YXRlZEV4dGVuc2lvbktleSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgeyAvLyBsZWF2ZSB0aGUgZmlsdGVycyBvZmYgYnkgZGVmYXVsdAotCQkJCQlMaXN0IGF2YWlsYWJsZUZpbHRlcnMgPSBnZXRQYXJlbnRSZWdpc3RyeSgpLmdldEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JzKG5hdmlnYXRvckV4dGVuc2lvbklkS2V5KTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVGaWx0ZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yIGZpbHRlckRlc2NyaXB0b3IgPSAoRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcikgYXZhaWxhYmxlRmlsdGVycy5nZXQoaSk7Ci0JCQkJCQlpZiAoZmlsdGVyRGVzY3JpcHRvci5pc0VuYWJsZWRCeURlZmF1bHQoKSkKLQkJCQkJCQlhY3RpdmF0ZWRGaWx0ZXJzLmFkZChnZXRGaWx0ZXJBY3RpdmF0aW9uUHJlZmVyZW5jZUtleShmaWx0ZXJEZXNjcmlwdG9yKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcnNpc3RGaWx0ZXJBY3RpdmF0aW9ucygpIHsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IE5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlzeW5jaHJvbml6ZWQgKGFjdGl2YXRlZEZpbHRlcnMpIHsKLQkJCS8qIGVuc3VyZSB0aGF0IHRoZSBwcmVmZXJlbmNlIHdpbGwgYmUgbm9uLWVtcHR5ICovCi0JCQlTdHJpbmdCdWZmZXIgYWN0aXZhdGVkRmlsdGVyc1N0cmluZ0J1ZmZlciA9IG51bGw7Ci0KLQkJCUl0ZXJhdG9yIG5hdmlnYXRvckV4dGVuc2lvbklkSXRlcmF0b3IgPSBnZXRQYXJlbnRSZWdpc3RyeSgpLmdldE5hdmlnYXRvckZpbHRlcnMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJU3RyaW5nIG5hdmlnYXRvckV4dGVuc2lvbklkID0gbnVsbDsKLQkJCXdoaWxlIChuYXZpZ2F0b3JFeHRlbnNpb25JZEl0ZXJhdG9yLmhhc05leHQoKSkgewotCi0JCQkJbmF2aWdhdG9yRXh0ZW5zaW9uSWQgPSAoU3RyaW5nKSBuYXZpZ2F0b3JFeHRlbnNpb25JZEl0ZXJhdG9yLm5leHQoKTsKLQkJCQlhY3RpdmF0ZWRGaWx0ZXJzU3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiOyIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlMaXN0IGF2YWlsYWJsZUZpbHRlcnMgPSBnZXRQYXJlbnRSZWdpc3RyeSgpLmdldEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JzKG5hdmlnYXRvckV4dGVuc2lvbklkKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZUZpbHRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvciBmaWx0ZXJEZXNjcmlwdG9yID0gKEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IpIGF2YWlsYWJsZUZpbHRlcnMuZ2V0KGkpOwotCQkJCQlpZiAoaXNGaWx0ZXJBY3RpdmUoZmlsdGVyRGVzY3JpcHRvcikpCi0JCQkJCQlhY3RpdmF0ZWRGaWx0ZXJzU3RyaW5nQnVmZmVyLmFwcGVuZChnZXRGaWx0ZXJBY3RpdmF0aW9uUHJlZmVyZW5jZUtleShmaWx0ZXJEZXNjcmlwdG9yKSkuYXBwZW5kKCI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShnZXRFeHRlbnNpb25QcmVmZXJlbmNlS2V5Rm9yRmlsdGVyQWN0aXZhdGlvbnMobmF2aWdhdG9yRXh0ZW5zaW9uSWQpLCBhY3RpdmF0ZWRGaWx0ZXJzU3RyaW5nQnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJfQotCi0KLQkJfQotCQlOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuYXZpZ2F0b3JFeHRlbnNpb25JZEtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvblByZWZlcmVuY2VLZXlGb3JGaWx0ZXJBY3RpdmF0aW9ucyhTdHJpbmcgbmF2aWdhdG9yRXh0ZW5zaW9uSWRLZXkpIHsKLQkJcmV0dXJuIGdldFZpZXdlcklkKCkgKyAiLiIgKyBuYXZpZ2F0b3JFeHRlbnNpb25JZEtleSArICIuIiArIEFDVElWQVRFRF9GSUxURVJTOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldEZpbHRlckFjdGl2YXRpb25QcmVmZXJlbmNlS2V5KEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IgZmlsdGVyRGVzY3JpcHRvcikgewotCQlyZXR1cm4gZ2V0RmlsdGVyQWN0aXZhdGlvblByZWZlcmVuY2VLZXkoZmlsdGVyRGVzY3JpcHRvci5nZXROYXZpZ2F0b3JFeHRlbnNpb25JZCgpLCBmaWx0ZXJEZXNjcmlwdG9yLmdldElkKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RmlsdGVyQWN0aXZhdGlvblByZWZlcmVuY2VLZXkoU3RyaW5nIG5hdmlnYXRvckV4dGVuc2lvbklkLCBTdHJpbmcgZmlsdGVySWQpIHsKLQkJcmV0dXJuIGdldFZpZXdlcklkKCkgKyAiLiIgKyBuYXZpZ2F0b3JFeHRlbnNpb25JZCArICIuIiArIGZpbHRlcklkICsgIi5maWx0ZXJBY3RpdmF0ZWQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmlld2VySWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaWV3ZXJJZCgpIHsKLQkJcmV0dXJuIHZpZXdlcklkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYWN0aXZhdGVkRmlsdGVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2V0IGdldEFjdGl2YXRlZEZpbHRlcnMoKSB7Ci0JCXJldHVybiBhY3RpdmF0ZWRGaWx0ZXJzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyZW50UmVnaXN0cnkuCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5IGdldFBhcmVudFJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gcGFyZW50UmVnaXN0cnk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZmlsdGVycy9FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2ZpbHRlcnMvRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGNhOGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZmlsdGVycy9FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxMiwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5Db21tb25OYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yUGx1Z2luOwotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFWSUdBVE9SX0VYVEVOU0lPTl9JRCA9ICJuYXZpZ2F0b3JFeHRlbnNpb25JZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lEID0gInZpZXdJZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRURfQllfREVGQVVMVCA9ICJlbmFibGVkQnlEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFkgPSAicHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmF2aWdhdG9yRXh0ZW5zaW9uSWQgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB2aWV3SWQgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWRCeURlZmF1bHQgPSBmYWxzZTsKLQotCXByaXZhdGUgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbnVsbDsKLQotCXByaXZhdGUgSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwcml2YXRlIFZpZXdlckZpbHRlciB2aWV3ZXJGaWx0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB0b3N0cmluZzsKLQotCXB1YmxpYyBFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwdWJsaWMgRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcihTdHJpbmcgZmlsdGVySWQsIFN0cmluZyBuYXZpZ2F0b3JFeHRlbnNpb25JZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIHZpZXdlcklkLCBib29sZWFuIGVuYWJsZWRCeURlZmF1bHQsIFZpZXdlckZpbHRlciB2aWV3ZXJGaWx0ZXIpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChmaWx0ZXJJZCwgQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcl8xMCk7IAotCQlBc3NlcnQuaXNOb3ROdWxsKG5hdmlnYXRvckV4dGVuc2lvbklkLCBDb21tb25OYXZpZ2F0b3JNZXNzYWdlcy5FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yXzExKTsKLQkJdGhpcy5pZCA9IGZpbHRlcklkOwotCQl0aGlzLm5hdmlnYXRvckV4dGVuc2lvbklkID0gbmF2aWdhdG9yRXh0ZW5zaW9uSWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJdGhpcy52aWV3SWQgPSB2aWV3ZXJJZDsKLQkJdGhpcy5lbmFibGVkQnlEZWZhdWx0ID0gZW5hYmxlZEJ5RGVmYXVsdDsKLQkJdGhpcy52aWV3ZXJGaWx0ZXIgPSB2aWV3ZXJGaWx0ZXI7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJaWYgKHRoaXMuZWxlbWVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLmlkID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShJRCk7Ci0JCQl0aGlzLm5hdmlnYXRvckV4dGVuc2lvbklkID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShOQVZJR0FUT1JfRVhURU5TSU9OX0lEKTsKLQkJCXRoaXMubmFtZSA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRSk7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShERVNDUklQVElPTik7Ci0JCQl0aGlzLnZpZXdJZCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoVklFV19JRCk7Ci0JCQl0aGlzLmVuYWJsZWRCeURlZmF1bHQgPSBCb29sZWFuLnZhbHVlT2YodGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShFTkFCTEVEX0JZX0RFRkFVTFQpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7Ci0JCWlmICh0aGlzLnByb3BlcnRpZXMgPT0gbnVsbCkgewotCi0JCQl0aGlzLnByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJaWYgKHRoaXMuZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSB0aGlzLmVsZW1lbnQuZ2V0Q2hpbGRyZW4oUFJPUEVSVFkpOwotCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBudWxsOwotCQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlsb2NhbE5hbWUgPSBjaGlsZHJlbltpXS5nZXRBdHRyaWJ1dGUoUFJPUEVSVFlfTkFNRSk7Ci0JCQkJCXZhbHVlID0gY2hpbGRyZW5baV0uZ2V0QXR0cmlidXRlKFBST1BFUlRZX1ZBTFVFKTsKLQkJCQkJdGhpcy5wcm9wZXJ0aWVzLnB1dChsb2NhbE5hbWUsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMucHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVuYWJsZWRCeURlZmF1bHQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkQnlEZWZhdWx0KCkgewotCQlyZXR1cm4gZW5hYmxlZEJ5RGVmYXVsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZpZXdJZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZpZXdJZCgpIHsKLQkJcmV0dXJuIHZpZXdJZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hdmlnYXRvckV4dGVuc2lvbklkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmF2aWdhdG9yRXh0ZW5zaW9uSWQoKSB7Ci0JCXJldHVybiBuYXZpZ2F0b3JFeHRlbnNpb25JZDsKLQl9Ci0KLQlwdWJsaWMgSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWlmICh0aGlzLmVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluc3RhbmNlID0gKElOYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXIpIHRoaXMuZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTX05BTUUpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlOYXZpZ2F0b3JQbHVnaW4ubG9nKGUudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh2aWV3ZXJGaWx0ZXIgIT0gbnVsbCkKLQkJCQlpbnN0YW5jZSA9IG5ldyBOYXZpZ2F0b3JWaWV3ZXJGaWx0ZXIodmlld2VyRmlsdGVyKTsKLQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAodG9zdHJpbmcgPT0gbnVsbCkKLQkJCXRvc3RyaW5nID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiW2lkPVwiIiArIGdldElkKCkgKyAiXCIsIG5hbWU9XCIiICsgZ2V0TmFtZSgpICsgIlwiLCBlbmFibGVkQnlEZWZhdWx0PVwiIiArIGlzRW5hYmxlZEJ5RGVmYXVsdCgpICsgIlwiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJcmV0dXJuIHRvc3RyaW5nOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yKQotCQkJcmV0dXJuIGlkLmVxdWFscygoKEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IpIG9iaikuaWQpOwotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZmlsdGVycy9FeHRlbnNpb25GaWx0ZXJQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL0V4dGVuc2lvbkZpbHRlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYmFkYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL0V4dGVuc2lvbkZpbHRlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbnNpb25GaWx0ZXJQcm92aWRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VySWQKLQkgKiBAcmV0dXJuIGEgTGlzdCBvZiBFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yCi0JICovCi0JTGlzdCBnZXRFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9ycyhTdHJpbmcgZXh0ZW5zaW9uSWQsIFN0cmluZyB2aWV3ZXJJZCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2ZpbHRlcnMvRXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2ZpbHRlcnMvRXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OWM1MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL0V4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxNCwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kCi0gKiBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiA8cD4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIGEgd29yayBpbgotICogcHJvZ3Jlc3MuIFRoZXJlIGlzIGEgZ3VhcmFudGVlIG5laXRoZXIgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uRmlsdGVyUmVnaXN0cnlNYW5hZ2VyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlciBJTlNUQU5DRSA9IG5ldyBFeHRlbnNpb25GaWx0ZXJSZWdpc3RyeU1hbmFnZXIoKTsKLQotCXByaXZhdGUgZmluYWwgTWFwIGV4dGVuc2lvbkZpbHRlclJlZ2lzdHJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0KLQlwcml2YXRlIEV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5TWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBFeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeSBnZXRWaWV3ZXJSZWdpc3RyeShTdHJpbmcgdmlld2VySWQpIHsKLQotCQkvKiBUaGUgc2ltcGxlIGNhc2UgaXMgdGhhdCB0aGUgcmVnaXN0cnkgaGFzIGJlZW4gbG9hZGVkIGFuZCBpcyByZWFkeSB0byBnbyAqLwotCQlFeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeSByZWdpc3RyeSA9IChFeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeSkgZ2V0RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cmllcygpLmdldCh2aWV3ZXJJZCk7Ci0JCWlmIChyZWdpc3RyeSAhPSBudWxsKQotCQkJcmV0dXJuIHJlZ2lzdHJ5OwotCQkvKiBPdGhlcndpc2UgdGhlIHJlZ2lzdHJ5IGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQsIHNvIGFjcXVpcmUgYSBsb2NrICovCi0JCXN5bmNocm9uaXplZCAoZ2V0RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cmllcygpKSB7Ci0JCQkvKgotCQkJICogRW5zdXJlIHRoYXQgYW5vdGhlciB0aHJlYWQgd2Fzbid0IGluIHRoZSBwcm9jZXNzIG9mIGluaXRpYWxpemluZyB0aGUgcmVnaXN0cnkgZm9yIHRoZQotCQkJICogZ2l2ZW4gdmlld2VyaWQKLQkJCSAqLwotCQkJcmVnaXN0cnkgPSAoRXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkpIGdldEV4dGVuc2lvbkZpbHRlclJlZ2lzdHJpZXMoKS5nZXQodmlld2VySWQpOwotCQkJLyogSWYgdGhlIHJlZ2lzdHJ5IGlzIHN0aWxsIG51bGwsIHRoZW4gd2UgY3JlYXRlLCByZWFkLCBhbmQgYWRkIHRvIHRoZSByZWdpc3RyeSBtYXAgKi8KLQkJCWlmIChyZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVnaXN0cnkgPSBuZXcgRXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkodmlld2VySWQpOwotCQkJCQlnZXRFeHRlbnNpb25GaWx0ZXJSZWdpc3RyaWVzKCkucHV0KHZpZXdlcklkLCByZWdpc3RyeSk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgbmNkZmUpIHsKLQkJCQkJbmNkZmUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2VWaWV3ZXJSZWdpc3RyeShTdHJpbmcgdmlld2VySWQpIHsKLQkJc3luY2hyb25pemVkIChnZXRFeHRlbnNpb25GaWx0ZXJSZWdpc3RyaWVzKCkpIHsKLQkJCWdldEV4dGVuc2lvbkZpbHRlclJlZ2lzdHJpZXMoKS5yZW1vdmUodmlld2VySWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBleHRlbnNpb25GaWx0ZXJSZWdpc3RyaWVzLgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0RXh0ZW5zaW9uRmlsdGVyUmVnaXN0cmllcygpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbkZpbHRlclJlZ2lzdHJpZXM7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL0V4dGVuc2lvbkZpbHRlclZpZXdlclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2ZpbHRlcnMvRXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmZGU3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2ZpbHRlcnMvRXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5leHRlbnNpb25zLlJlZ2lzdHJ5UmVhZGVyOwotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25GaWx0ZXJWaWV3ZXJSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVklHQVRPUl9GSUxURVIgPSAiY29tbW9uRmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQXNzb2NpYXRlcyB0aGlzIEV4dGVuc2lvbkZpbHRlclJlZ2lzdHJ5IHdpdGggYSBzcGVjaWZpYyBDb21tb24gTmF2aWdhdG9yIGluc3RhbmNlICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmlld2VySWQ7Ci0KLQkvKgotCSAqIFN0b3JlcyB0aGUgYXZhaWxhYmxlIG5hdmlnYXRvciBmaWx0ZXJzIGZvciB0aGUgdmlld2VyIHdpdGggdGhlIHZpZXdlcmlkIGJlbG93Ci0JICogbmF2aWdhdG9yRXh0ZW5zaW9uSWQgKFN0cmluZykgdG8gRmlsdGVyRGVzY3JpcHRvciBwYWlycwotCSAqLwotCXByaXZhdGUgZmluYWwgTWFwIG5hdmlnYXRvckZpbHRlcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBmaW5hbCBFeHRlbnNpb25GaWx0ZXJBY3RpdmF0aW9uTWFuYWdlciBhY3RpdmF0aW9uTWFuYWdlcjsKLQotCSAKLQlwdWJsaWMgRXh0ZW5zaW9uRmlsdGVyVmlld2VyUmVnaXN0cnkoU3RyaW5nIHZpZXdlcklkKSB7Ci0JCXN1cGVyKE5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQsIE5BVklHQVRPUl9GSUxURVIpOyAgIAotCQl0aGlzLnZpZXdlcklkID0gdmlld2VySWQ7Ci0JCWFjdGl2YXRpb25NYW5hZ2VyID0gbmV3IEV4dGVuc2lvbkZpbHRlckFjdGl2YXRpb25NYW5hZ2VyKHRoaXMudmlld2VySWQsIHRoaXMpOwotCQlyZWFkUmVnaXN0cnkoKTsKLQkJaW5pdGlhbGl6ZUFjdGl2YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQWN0aXZhdGlvbnMoKSB7Ci0JCVN0cmluZyBuYXZpZ2F0b3JFeHRlbnNpb25JZCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3Iga2V5c0l0ciA9IG5hdmlnYXRvckZpbHRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsga2V5c0l0ci5oYXNOZXh0KCk7KSB7Ci0JCQluYXZpZ2F0b3JFeHRlbnNpb25JZCA9IChTdHJpbmcpIGtleXNJdHIubmV4dCgpOwotCQkJZ2V0QWN0aXZhdGlvbk1hbmFnZXIoKS5yZXZlcnRGaWx0ZXJBY3RpdmF0aW9ucyhuYXZpZ2F0b3JFeHRlbnNpb25JZCk7Ci0JCX0KLQl9Ci0KLSAKLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKE5BVklHQVRPUl9GSUxURVIpKSB7Ci0JCQlFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWdldEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JzKGRlc2NyaXB0b3IuZ2V0TmF2aWdhdG9yRXh0ZW5zaW9uSWQoKSkuYWRkKGRlc2NyaXB0b3IpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yW10gZ2V0QWN0aXZlRGVzY3JpcHRvcnMoU3RyaW5nIG5hdmlnYXRvckV4dGVuc2lvbklkKSB7Ci0KLQkJTGlzdCBhdmFpbGFibGVEZXNjcmlwdG9ycyA9IGdldEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JzKG5hdmlnYXRvckV4dGVuc2lvbklkKTsKLQkJTGlzdCBhY3RpdmVEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVEZXNjcmlwdG9ycy5zaXplKCk7IGkrKykgewotCQkJaWYgKGdldEFjdGl2YXRpb25NYW5hZ2VyKCkuaXNGaWx0ZXJBY3RpdmUoKEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3IpIGF2YWlsYWJsZURlc2NyaXB0b3JzLmdldChpKSkpCi0JCQkJYWN0aXZlRGVzY3JpcHRvcnMuYWRkKGF2YWlsYWJsZURlc2NyaXB0b3JzLmdldChpKSk7Ci0JCX0KLQkJRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzQXJyYXkgPSBuZXcgRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvclthY3RpdmVEZXNjcmlwdG9ycy5zaXplKCldOwotCQlhY3RpdmVEZXNjcmlwdG9ycy50b0FycmF5KGRlc2NyaXB0b3JzQXJyYXkpOwotCQlyZXR1cm4gZGVzY3JpcHRvcnNBcnJheTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgRXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcltdIGdldEFsbERlc2NyaXB0b3JzKFN0cmluZyBuYXZpZ2F0b3JFeHRlbnNpb25JZCkgewotCi0JCUxpc3QgZGVzY3JpcHRvcnMgPSBnZXRFeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9ycyhuYXZpZ2F0b3JFeHRlbnNpb25JZCk7Ci0JCUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9yc0FycmF5ID0gbmV3IEV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbZGVzY3JpcHRvcnMuc2l6ZSgpXTsKLQkJZGVzY3JpcHRvcnMudG9BcnJheShkZXNjcmlwdG9yc0FycmF5KTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JzQXJyYXk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgZ2V0RXh0ZW5zaW9uRmlsdGVyRGVzY3JpcHRvcnMoU3RyaW5nIG5hdmlnYXRvckV4dGVuc2lvbklkKSB7Ci0JCUxpc3QgZGVzY3JpcHRvcnMgPSAoTGlzdCkgZ2V0TmF2aWdhdG9yRmlsdGVycygpLmdldChuYXZpZ2F0b3JFeHRlbnNpb25JZCk7Ci0KLQkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JCXN5bmNocm9uaXplZCAoZ2V0TmF2aWdhdG9yRmlsdGVycygpKSB7Ci0JCQlkZXNjcmlwdG9ycyA9IChMaXN0KSBnZXROYXZpZ2F0b3JGaWx0ZXJzKCkuZ2V0KG5hdmlnYXRvckV4dGVuc2lvbklkKTsKLQkJCWlmIChkZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQkJZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZ2V0TmF2aWdhdG9yRmlsdGVycygpLnB1dChuYXZpZ2F0b3JFeHRlbnNpb25JZCwgZGVzY3JpcHRvcnMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckNhY2hlZE5hdmlnYXRvckZpbHRlcnMoKSB7Ci0KLQkJcHJpbnRGaWx0ZXJzKCk7Ci0JCW5hdmlnYXRvckZpbHRlcnMuY2xlYXIoKTsKLQkJcmVhZFJlZ2lzdHJ5KCk7Ci0JCXByaW50RmlsdGVycygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmlld2VySWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaWV3ZXJJZCgpIHsKLQkJcmV0dXJuIHZpZXdlcklkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmF2aWdhdG9yRmlsdGVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldE5hdmlnYXRvckZpbHRlcnMoKSB7Ci0JCXJldHVybiBuYXZpZ2F0b3JGaWx0ZXJzOwotCX0KLQotIAotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhY3RpdmF0aW9uTWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5zaW9uRmlsdGVyQWN0aXZhdGlvbk1hbmFnZXIgZ2V0QWN0aXZhdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBhY3RpdmF0aW9uTWFuYWdlcjsKLQl9Ci0gCi0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50RmlsdGVycygpIHsKLQotCQkvLwkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJLy8JCU9iamVjdCBrZXkgPSBudWxsOwotCQkvLwkJSXRlcmF0b3Iga2V5cyA9IGdldE5hdmlnYXRvckZpbHRlcnMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkvLwkJd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0JCS8vCQkJa2V5ID0ga2V5cy5uZXh0KCk7Ci0JCS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJLZXk6ICIgKyBrZXkpOwotCQkvLwkJCUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JbXSBmaWx0ZXJzID0gZ2V0QWxsRGVzY3JpcHRvcnMoa2V5LnRvU3RyaW5nKCkpOwotCQkvLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykKLQkJLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBmaWx0ZXJzW2ldKTsKLQkJLy8JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL05hdmlnYXRvckV4dGVuc2lvbkZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL05hdmlnYXRvckV4dGVuc2lvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjcwOTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZmlsdGVycy9OYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXI7Ci0KLQotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXIgaW1wbGVtZW50cyBJTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyIHsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotIAotCXB1YmxpYyBPYmplY3RbXSBzZWxlY3QoQ29tbW9uVmlld2VyIGFWaWV3ZXIsIE9iamVjdCBhUGFyZW50RWxlbWVudCwgT2JqZWN0W10gdGhlRWxlbWVudHMpIHsKLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZUVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJaWYgKHNlbGVjdChhVmlld2VyLCBhUGFyZW50RWxlbWVudCwgdGhlRWxlbWVudHNbaV0pKQotCQkJCXJlc3VsdHMuYWRkKHRoZUVsZW1lbnRzW2ldKTsKLQkJcmV0dXJuIHJlc3VsdHMudG9BcnJheSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL05hdmlnYXRvclZpZXdlckZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9maWx0ZXJzL05hdmlnYXRvclZpZXdlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjFiNDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZmlsdGVycy9OYXZpZ2F0b3JWaWV3ZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvckV4dGVuc2lvbkZpbHRlcjsKLQotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgYSB3b3JrIGluCi0gKiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLSAqIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0b3JWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBOYXZpZ2F0b3JFeHRlbnNpb25GaWx0ZXIgaW1wbGVtZW50cyBJTmF2aWdhdG9yRXh0ZW5zaW9uRmlsdGVyIHsKLQotCXByaXZhdGUgZmluYWwgVmlld2VyRmlsdGVyIHZpZXdlckZpbHRlcjsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yVmlld2VyRmlsdGVyKFZpZXdlckZpbHRlciBhVmlld2VyRmlsdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXZpZXdlckZpbHRlciA9IGFWaWV3ZXJGaWx0ZXI7Ci0JfQotCi0gCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0KENvbW1vblZpZXdlciBhVmlld2VyLCBPYmplY3QgYVBhcmVudEVsZW1lbnQsIE9iamVjdCBhbkVsZW1lbnQpIHsKLQkJaWYgKHZpZXdlckZpbHRlciAhPSBudWxsKQotCQkJcmV0dXJuIHZpZXdlckZpbHRlci5zZWxlY3QoYVZpZXdlciwgYVBhcmVudEVsZW1lbnQsIGFuRWxlbWVudCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZmlsdGVycy9TZWxlY3RGaWx0ZXJzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL2ZpbHRlcnMvU2VsZWN0RmlsdGVyc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2ZlN2U1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvZmlsdGVycy9TZWxlY3RGaWx0ZXJzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDksIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLkNvbW1vbk5hdmlnYXRvck1lc3NhZ2VzOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMgcGFydCBvZiBhIHdvcmsgaW4KLSAqIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG5vciB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLgotICogUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nIHdpdGggdGhlIFBsYXRmb3JtL1VJIHRlYW0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdEZpbHRlcnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHsKLQotCXByaXZhdGUgZmluYWwgQ29tbW9uTmF2aWdhdG9yIGNvbW1vbk5hdmlnYXRvcjsKLQotCXB1YmxpYyBTZWxlY3RGaWx0ZXJzQWN0aW9uKENvbW1vbk5hdmlnYXRvciBhQ29tbW9uTmF2aWdhdG9yKSB7Ci0JCXN1cGVyKENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLlNlbGVjdEZpbHRlcnNBY3Rpb25EZWxlZ2F0ZV8wKTsgCi0JCXNldFRvb2xUaXBUZXh0KENvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLlNlbGVjdEZpbHRlcnNBY3Rpb25EZWxlZ2F0ZV8xKTsgCi0JCWNvbW1vbk5hdmlnYXRvciA9IGFDb21tb25OYXZpZ2F0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlDb21tb25GaWx0ZXJTZWxlY3Rpb25EaWFsb2cgZmlsdGVyU2VsZWN0aW9uRGlhbG9nID0gbmV3IENvbW1vbkZpbHRlclNlbGVjdGlvbkRpYWxvZyhjb21tb25OYXZpZ2F0b3IpOwotCQlmaWx0ZXJTZWxlY3Rpb25EaWFsb2cub3BlbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9uYXZpZ2F0b3JfbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvbmF2aWdhdG9yX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmM2E4MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC9uYXZpZ2F0b3JfbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgCi1Db3VsZF9ub3RfcHJvdmlkZV9jaGlsZHJlbl9mb3JfZWxlbWVudD1Db3VsZCBub3QgYWNxdWlyZSBjaGlsZHJlbiBmcm9tIGV4dGVuc2lvbjogezB9Ci1Db3VsZF9ub3RfcHJvdmlkZV9wYXJlbnRfZm9yX2VsZW1lbnQ9Q291bGQgbm90IGFjcXVpcmUgcGFyZW50IGZyb20gZXh0ZW5zaW9uOiB7MH0KLUxpbmtfV2l0aF9FZGl0b3JfSm9iXz1MaW5rIFdpdGggRWRpdG9yIEpvYiAgIAotTmF2aWdhdG9yVmlld2VyRGVzY3JpcHRvcl9Qb3B1cF9NZW51X092ZXJyaWRkZW49V2FybmluZzogcG9wdXBNZW51SWQgb2YgInswfSIgd2FzIG92ZXJyaWRkZW46IG9sZCB2YWx1ZSA9ICJ7MX0iLCBuZXcgdmFsdWUgPSAiezJ9Ii4KLVRyZWVWaWV3ZXJFbGVtZW50Q29sbGVjdG9yXzA9VXBkYXRpbmcgdHJlZQotVHJlZVZpZXdlckVsZW1lbnRDb2xsZWN0b3JfMT1SZW1vdmUgcGxhY2Vob2xkZXIKLVN0cnVjdHVyZWRWaWV3ZXJNYW5hZ2VyXzA9UmVmcmVzaCBDb21tb24gVmlld2VyIFRyZWUKLVBlbmRpbmdVcGRhdGVBZGFwdGVyX1BlbmRpbmdMYWJlbD1QZW5kaW5nLi4uCi1UZXh0QWN0aW9uX3NlbGVjdEFsbCA9IFNlbGVjdCBBbGwKLUN1dCA9IEN1dAotQ29weSA9IENvcHkgCi1QYXN0ZSA9IFBhc3RlIAotRGVsZXRlID0gRGVsZXRlCi0KLUNvcHlBY3Rpb25fdG9vbFRpcD1Db3B5Ci1QYXN0ZUFjdGlvbl90b29sVGlwPVBhc3RlCi0KLUxvY2FsU2VsZWN0aW9uVHJhbnNmZXJfZXJyb3JNZXNzYWdlPVJlY2VpdmVkIHdyb25nIHRyYW5zZmVyIGRhdGEuIAotUHJvcGVydHlEaWFsb2dfbWVzc2FnZVRpdGxlPVByb3BlcnR5IFBhZ2VzCi1OYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uUmVjb3JkXzA9VGhlIGV4dGVuc2lvbiBjYW5ub3QgYmUgbnVsbAotQ29tbW9uRWxlbWVudEFkYXB0ZXJfMD08cGVuZGluZy4uLj4KLVByb3BlcnR5RGlhbG9nX25vUHJvcGVydHlNZXNzYWdlPU5vIHByb3BlcnR5IHBhZ2VzIGZvciB7MH0uCi1OYXZpZ2F0b3JTZWxlY3Rpb25TZXJpYWxpemVyXzE9Q291bGQgbm90IGNyZWF0ZSBieXRlIGFycmF5LgotRmV0Y2hFbGVtZW50c0pvYl8wPUZldGNoaW5nIGNoaWxkcmVuIC4uLgotTmF2aWdhdG9yU2VsZWN0aW9uU2VyaWFsaXplcl8wPUEgdmFsaWQgSU5hdmlnYXRvckV4dGVuc2lvblNpdGUgbXVzdCBiZSB1c2VkIHRvIGNyZWF0ZSBhIE5hdmlnYXRvclNlcmlhbGl6ZXIuCi0KLURyb3BIYW5kbGVyRGVzY3JpcHRvcl8xMD1Qcm9ibGVtIGNyZWF0aW5nIElOYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGUgZm9yICJ7MH0iLgotTmF2aWdhdG9yX3N0YXR1c0xpbmVNdWx0aVNlbGVjdD17MH0gaXRlbXMgc2VsZWN0ZWQKLURyb3BIYW5kbGVyUmVnaXN0cnlfMD1Qcm9ibGVtIGRldGVybWluZyBEcm9wIEhhbmRsZXJzCi0gCi1Qcm9wZXJ0eURpYWxvZ190b29sVGlwPU9wZW4gUHJvcGVydGllcyBEaWFsb2cgCi1Qcm9wZXJ0eURpYWxvZ190ZXh0PVAmcm9wZXJ0aWVzCi1Db21tb25GaWx0ZXJTZWxlY3Rpb25EaWFsb2dfND1TZWxlY3QgdGhlIGZpbHRlcnMgdG8gYXBwbHkgKG1hdGNoaW5nIGl0ZW1zIHdpbGwgYmUgaGlkZGVuKToKLUNvbW1vbkZpbHRlclNlbGVjdGlvbkRpYWxvZ18zPVNlbGVjdCB0aGUgYXZhaWxhYmxlIGV4dGVuc2lvbnMgdG8gc2hvdyAodW5jaGVja2VkIGV4dGVuc2lvbnMgd2lsbCBub3QgZGlzcGxheSBjb250ZW50KToKLUV4dGVuc2lvbkZpbHRlckRlc2NyaXB0b3JfMTE9VGhlIG5hdmlnYXRvckV4dGVuc2lvbklkIGNhbm5vdCBiZSBudWxsCi1FeHRlbnNpb25GaWx0ZXJEZXNjcmlwdG9yXzEwPVRoZSBmaWx0ZXJJZCBjYW5ub3QgYmUgbnVsbAotCi1Db21tb25GaWx0ZXJTZWxlY3Rpb25EaWFsb2dfMj1IaWRlcyBhbGwgY29udGVudCBhc3NvY2lhdGVkIHdpdGggdGhlICJ7MH0iIGNvbnRlbnQgZXh0ZW5zaW9uLgotQ29tbW9uRmlsdGVyU2VsZWN0aW9uRGlhbG9nXzE9VHlwZXMgb2YgY29udGVudAotU2VsZWN0RmlsdGVyc0FjdGlvbkRlbGVnYXRlXzE9U2VsZWN0IGFuZCBkZXNlbGVjdCBmaWx0ZXJzIHRvIGFwcGx5IHRvIHRoZSBjb250ZW50IGluIHRoZSB0cmVlCi1Db2xsYXBzZUFsbEFjdGlvbkRlbGVnYXRlXzA9Q29sbGFwc2UgQWxsIAotQ29tbW9uRmlsdGVyU2VsZWN0aW9uRGlhbG9nXzA9RmlsdGVycwotU2VsZWN0RmlsdGVyc0FjdGlvbkRlbGVnYXRlXzA9RmlsdGVycy4uLgotCi1TZXJpYWxpemVyRGVzY3JpcHRvcl8wPUEgdmFsaWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IG11c3QgYmUgdXNlZCB0byBjcmVhdGUgYSBTZXJpYWxpemVyRGVzY3JpcHRvcgotU2VyaWFsaXplckRlc2NyaXB0b3JfMT1BIHZhbGlkIGlkIGlzIHJlcXVpcmVkIGZvciBhIFNlcmlhbGl6ZXJEZXNjcmlwdG9yCi0gCi1TZXJpYWxpemVyRGVzY3JpcHRvcl8zPVdhcm5pbmc6IFNlcmlhbGl6ZXIgRGVzY3JpcHRvciB7MH0gaGFzIG1vcmUgdGhhbiBvbmUgQWN0aW9uRXhwcmVzc2lvbi4KLVNlcmlhbGl6ZXJEZXNjcmlwdG9yXzU9Q291bGQgbm90IGNyZWF0ZSBzZXJpYWxpemVyIHdpdGggaWQ6IHswfSA6IHsxfQotCi1OYXZpZ2F0b3JEcm9wU2VsZWN0aW9uRGlhbG9nXzM9U2tpcCB0aGlzIGRpYWxvZyB3aGVuIG9ubHkgb25lIGFjdGlvbiBpcyBhdmFpbGFibGUKLU5hdmlnYXRvckRyb3BTZWxlY3Rpb25EaWFsb2dfMT1BdmFpbGFibGUgQWN0aW9ucwotCi1FeHRlbnNpb25GaWx0ZXJSZWdpc3RyeV8xNj1XYXJuaW5nOiBBbGwgVGhpcmQgUGFydHkgRXh0ZW5zaW9uIEZpbHRlcnMgbXVzdCBwcm92aWRlIGEgdmFsaWQgbmF2aWdhdG9yRXh0ZW5zaW9uaWQuCi1MaW5rRWRpdG9yQWN0aW9uRGVsZWdhdGVfMT1MaW5rIG9wZW4gZWRpdG9ycyB3aXRoIGNvbnRlbnQgaW4gdGhlIE5hdmlnYXRvcgotTGlua0VkaXRvckFjdGlvbkRlbGVnYXRlXzA9TGluayBFZGl0b3IKLVByb3BlcnR5RGlhbG9nX3Byb3BlcnR5TWVzc2FnZT1Qcm9wZXJ0aWVzIGZvciB7MH0KLU5hdmlnYXRvckV4dGVuc2lvblNpdGVfMD1QcmVsb2FkaW5nIFNlbGVjdGVkIE5hdmlnYXRvciBFeHRlbnNpb25zCi0KLUNvbW1vbkRyb3BIYW5kbGVyU2VydmljZV8wPUNvbW1vbiBEcm9wIEhhbmRsZXIgU2VydmljZQotCi1BdHRyaWJ1dGVfTWlzc2luZ19XYXJuaW5nPU1pc3NpbmcgYXR0cmlidXRlOiB7MH0gaW4gZXh0ZW5zaW9uICJ7MX0iIGRlZmluZWQgaW4gYnVuZGxlICJ7Mn0iLgotVG9vX21hbnlfZWxlbWVudHNfV2FybmluZz1Ub28gbWFueSBlbGVtZW50cyBvZiB0eXBlOiB7MH0gaW4gZXh0ZW5zaW9uICJ7MX0iIGRlZmluZWQgaW4gYnVuZGxlICJ7Mn0iLgotT3Blbl9hY3Rpb25fbGFiZWw9T3BlbgotCi0KLU5ld1Byb2plY3RXaXphcmRfZXJyb3JUaXRsZSA9IE5ldyBQcm9qZWN0IFByb2JsZW1zCi0KLU5ld1Byb2plY3RBY3Rpb25fdGV4dCA9IFAmcm9qZWN0Li4uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC93aXphcmRzL0NvbW1vbldpemFyZERlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvaW50ZXJuYWwvd2l6YXJkcy9Db21tb25XaXphcmREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzRlOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC93aXphcmRzL0NvbW1vbldpemFyZERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLklFdmFsdWF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JQbHVnaW47Ci0KLS8qKgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25XaXphcmREZXNjcmlwdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfV0laQVJEX0lEID0gIndpemFyZElkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19FTkFCTEVNRU5UID0gImVuYWJsZW1lbnQiOyAvLyROT04tTkxTLTEkIAotCi0JcHJpdmF0ZSBTdHJpbmcgd2l6YXJkSWQ7Ci0KLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCi0JcHJpdmF0ZSBFeHByZXNzaW9uIGVuYWJsZW1lbnQ7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50OwotCi0JLyoqCi0JICogQHBhcmFtIGFDb25maWdFbGVtZW50IFRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgZnJvbSB0aGUgZXh0ZW5zaW9uIHBvaW50LiAKLQkgKiAqIEB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBjb3VsZCBub3QgYmUgcGFyc2VkLiBSZWFzb25zCi0JICogICAgICAgICAgICAgaW5jbHVkZToKLQkgKiAgICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICAgPGxpPkEgcmVxdWlyZWQgYXR0cmlidXRlIGlzIG1pc3NpbmcuPC9saT4KLQkgKiAgICAgICAgICAgICA8bGk+TW9yZSBlbGVtZW50cyBhcmUgZGVmaW5lIHRoYW4gaXMgYWxsb3dlZC48L2xpPgotCSAqICAgICAgICAgICAgIDwvdWw+Ci0JICovCi0JcHVibGljIENvbW1vbldpemFyZERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFDb25maWdFbGVtZW50KQotCQkJdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCWNvbmZpZ0VsZW1lbnQgPSBhQ29uZmlnRWxlbWVudDsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiB0aGlzIGNvbnRlbnQgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICogVGhlIGNvbnRlbnQgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBzZWxlY3Rpb24gaWYgYW5kIG9ubHkgaWYgaXQgaXMKLQkgKiBlbmFibGVkIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYVN0cnVjdHVyZWRTZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBzZWxlY3Rpb24gZnJvbSB0aGUgdmlld2VyCi0JICogQHJldHVybiBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBleHRlbnNpb24gaXMgZW5hYmxlZCBmb3IgZWFjaCBlbGVtZW50IGluCi0JICogICAgICAgICB0aGUgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEZvcihJU3RydWN0dXJlZFNlbGVjdGlvbiBhU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQlpZiAoZW5hYmxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLQotCQlJdGVyYXRvciBlbGVtZW50cyA9IGFTdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCWNvbnRleHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgZWxlbWVudHMubmV4dCgpKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGVuYWJsZW1lbnQuZXZhbHVhdGUoY29udGV4dCkgPT0gRXZhbHVhdGlvblJlc3VsdC5GQUxTRSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiB0aGlzIGNvbnRlbnQgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBhbkVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBldmFsdWF0aW9uLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEZvcihPYmplY3QgYW5FbGVtZW50KSB7Ci0KLQkJaWYgKGVuYWJsZW1lbnQgPT0gbnVsbCB8fCBhbkVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQl0cnkgewotCQkJcmV0dXJuIChlbmFibGVtZW50LmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBhbkVsZW1lbnQpKSA9PSBFdmFsdWF0aW9uUmVzdWx0LlRSVUUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCU5hdmlnYXRvclBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQl2b2lkIGluaXQoKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQkJd2l6YXJkSWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfV0laQVJEX0lEKTsKLQkJdHlwZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKTsKLQotCQlpZiAod2l6YXJkSWQgPT0gbnVsbCB8fCB3aXphcmRJZC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgV29ya2JlbmNoRXhjZXB0aW9uKCJNaXNzaW5nIGF0dHJpYnV0ZTogIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJQVRUX1dJWkFSRF9JRCArICIgaW4gY29tbW9uIHdpemFyZCBleHRlbnNpb246ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsKLQkJfQotCi0JCWlmICh0eXBlID09IG51bGwgfHwgdHlwZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgV29ya2JlbmNoRXhjZXB0aW9uKCJNaXNzaW5nIGF0dHJpYnV0ZTogIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJQVRUX1RZUEUgKyAiIGluIGNvbW1vbiB3aXphcmQgZXh0ZW5zaW9uOiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQljb25maWdFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7Ci0JCX0KLQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkuZ2V0Q2hpbGRyZW4oVEFHX0VOQUJMRU1FTlQpOwotCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDEpIHsKLQkJCXRyeSB7Ci0JCQkJZW5hYmxlbWVudCA9IEVsZW1lbnRIYW5kbGVyLmdldERlZmF1bHQoKS5jcmVhdGUoCi0JCQkJCQlFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKSwgY2hpbGRyZW5bMF0pOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTmF2aWdhdG9yUGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkgewotCQkJdGhyb3cgbmV3IFdvcmtiZW5jaEV4Y2VwdGlvbigiTW9yZSB0aGFuIG9uZSBlbGVtZW50OiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQlUQUdfRU5BQkxFTUVOVCArICIgaW4gY29tbW9uIHdpemFyZCBleHRlbnNpb246ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsKLQkJfSAKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbW1vbiB3aXphcmQgd2l6YXJkSWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZElkKCkgewotCQlyZXR1cm4gd2l6YXJkSWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC93aXphcmRzL0NvbW1vbldpemFyZERlc2NyaXB0b3JNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL3dpemFyZHMvQ29tbW9uV2l6YXJkRGVzY3JpcHRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlNjc0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL3dpemFyZHMvQ29tbW9uV2l6YXJkRGVzY3JpcHRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5pbnRlcm5hbC5OYXZpZ2F0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLmV4dGVuc2lvbnMuTmF2aWdhdG9yQ29udGVudFJlZ2lzdHJ5UmVhZGVyOwotCi0vKioKLSAqIDxwPgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgYSBndWFyYW50ZWUgbmVpdGhlciB0aGF0IHRoaXMgQVBJIHdpbGwKLSAqIHdvcmsgbm9yIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQKLSAqIGNvbnN1bHRpbmcgd2l0aCB0aGUgUGxhdGZvcm0vVUkgdGVhbS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uV2l6YXJkRGVzY3JpcHRvck1hbmFnZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tbW9uV2l6YXJkRGVzY3JpcHRvck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgQ29tbW9uV2l6YXJkRGVzY3JpcHRvck1hbmFnZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTk9fREVTQ1JJUFRPUlMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqCi0JICogRmluZCB3aXphcmRzIG9mIHR5cGUgJ25ldycuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX1RZUEVfTkVXID0gIm5ldyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWFwIGNvbW1vbldpemFyZERlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1vbldpemFyZERlc2NyaXB0b3JNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJc3luY2hyb25pemVkIChJTlNUQU5DRSkgewotCQkJaWYgKCFpc0luaXRpYWxpemVkKSB7Ci0JCQkJSU5TVEFOQ0UuaW5pdCgpOwotCQkJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJbmV3IENvbW1vbldpemFyZFJlZ2lzdHJ5KCkucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbW1vbldpemFyZERlc2NyaXB0b3IoQ29tbW9uV2l6YXJkRGVzY3JpcHRvciBhRGVzYykgewotCQlpZiAoYURlc2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc3luY2hyb25pemVkIChjb21tb25XaXphcmREZXNjcmlwdG9ycykgewotCQkJU2V0IGRlc2NyaXB0b3JzID0gKEhhc2hTZXQpIGNvbW1vbldpemFyZERlc2NyaXB0b3JzLmdldChhRGVzYwotCQkJCQkuZ2V0VHlwZSgpKTsKLQkJCWlmIChkZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQkJZGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWNvbW1vbldpemFyZERlc2NyaXB0b3JzLnB1dChhRGVzYy5nZXRUeXBlKCksIGRlc2NyaXB0b3JzKTsKLQkJCX0KLQkJCWlmIChkZXNjcmlwdG9ycy5jb250YWlucyhhRGVzYykgPT0gZmFsc2UpIHsKLQkJCQlkZXNjcmlwdG9ycy5hZGQoYURlc2MpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmV0dXJucyBhbGwgd2l6YXJkIGlkKHMpIHdoaWNoIGVuYWJsZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFuRWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdG8gcmV0dXJuIHRoZSBiZXN0IGNvbnRlbnQgZGVzY3JpcHRvciBmb3IKLQkgKiBAcGFyYW0gYVR5cGUKLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIG9mIHdpemFyZHMgdG8gbG9jYXRlIChlLmcuICduZXcnLCAnaW1wb3J0Jywgb3IKLQkgKiAgICAgICAgICAgICdleHBvcnQnIGV0YykuCi0JICogQHJldHVybiB0aGUgYmVzdCBjb250ZW50IGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFbmFibGVkQ29tbW9uV2l6YXJkRGVzY3JpcHRvcklkcyhPYmplY3QgYW5FbGVtZW50LAotCQkJU3RyaW5nIGFUeXBlKSB7Ci0KLQkJU2V0IGNvbW1vbkRlc2NyaXB0b3JzID0gKFNldCkgY29tbW9uV2l6YXJkRGVzY3JpcHRvcnMuZ2V0KGFUeXBlKTsKLQkJaWYgKGNvbW1vbkRlc2NyaXB0b3JzID09IG51bGwpCi0JCQlyZXR1cm4gTk9fREVTQ1JJUFRPUlM7Ci0JCS8qIEZpbmQgb3RoZXIgQ29tbW9uIFdpemFyZCBwcm92aWRlcnMgd2hpY2ggZW5hYmxlIGZvciB0aGlzIG9iamVjdCAqLwotCQlMaXN0IGRlc2NyaXB0b3JJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgY29tbW9uV2l6YXJkRGVzY3JpcHRvcnNJdHIgPSBjb21tb25EZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBjb21tb25XaXphcmREZXNjcmlwdG9yc0l0cgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlDb21tb25XaXphcmREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoQ29tbW9uV2l6YXJkRGVzY3JpcHRvcikgY29tbW9uV2l6YXJkRGVzY3JpcHRvcnNJdHIKLQkJCQkJLm5leHQoKTsKLQotCQkJaWYgKGRlc2NyaXB0b3IuaXNFbmFibGVkRm9yKGFuRWxlbWVudCkpCi0JCQkJZGVzY3JpcHRvcklkcy5hZGQoZGVzY3JpcHRvci5nZXRXaXphcmRJZCgpKTsKLQkJfQotCQlTdHJpbmdbXSB3aXphcmRJZHMgPSBuZXcgU3RyaW5nW2Rlc2NyaXB0b3JJZHMuc2l6ZSgpXTsKLQkJcmV0dXJuIChTdHJpbmdbXSkgZGVzY3JpcHRvcklkcy50b0FycmF5KHdpemFyZElkcyk7IC8vIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoZGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIFJldHVybnMgYWxsIGNvbnRlbnQgZGVzY3JpcHRvcihzKSB3aGljaCBlbmFibGUgZm9yIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBhU3RydWN0dXJlZFNlbGVjdGlvbgotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdG8gcmV0dXJuIHRoZSBiZXN0IGNvbnRlbnQgZGVzY3JpcHRvciBmb3IKLQkgKiBAcGFyYW0gYVR5cGUKLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIG9mIHdpemFyZHMgdG8gbG9jYXRlIChlLmcuICduZXcnLCAnaW1wb3J0Jywgb3IKLQkgKiAgICAgICAgICAgICdleHBvcnQnIGV0YykuCi0JICogQHJldHVybiB0aGUgYmVzdCBjb250ZW50IGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFbmFibGVkQ29tbW9uV2l6YXJkRGVzY3JpcHRvcklkcygKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTdHJ1Y3R1cmVkU2VsZWN0aW9uLCBTdHJpbmcgYVR5cGUpIHsKLQkJU2V0IGNvbW1vbkRlc2NyaXB0b3JzID0gKFNldCkgY29tbW9uV2l6YXJkRGVzY3JpcHRvcnMuZ2V0KGFUeXBlKTsKLQkJaWYgKGNvbW1vbkRlc2NyaXB0b3JzID09IG51bGwpCi0JCQlyZXR1cm4gTk9fREVTQ1JJUFRPUlM7Ci0JCS8qIEZpbmQgb3RoZXIgQ29tbW9uIFdpemFyZCBwcm92aWRlcnMgd2hpY2ggZW5hYmxlIGZvciB0aGlzIG9iamVjdCAqLwotCQlMaXN0IGRlc2NyaXB0b3JJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgY29tbW9uV2l6YXJkRGVzY3JpcHRvcnNJdHIgPSBjb21tb25EZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBjb21tb25XaXphcmREZXNjcmlwdG9yc0l0cgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlDb21tb25XaXphcmREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoQ29tbW9uV2l6YXJkRGVzY3JpcHRvcikgY29tbW9uV2l6YXJkRGVzY3JpcHRvcnNJdHIKLQkJCQkJLm5leHQoKTsKLQotCQkJaWYgKGRlc2NyaXB0b3IuaXNFbmFibGVkRm9yKGFTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCQlkZXNjcmlwdG9ySWRzLmFkZChkZXNjcmlwdG9yLmdldFdpemFyZElkKCkpOwotCQl9Ci0JCVN0cmluZ1tdIHdpemFyZElkcyA9IG5ldyBTdHJpbmdbZGVzY3JpcHRvcklkcy5zaXplKCldOwotCQlyZXR1cm4gKFN0cmluZ1tdKSBkZXNjcmlwdG9ySWRzLnRvQXJyYXkod2l6YXJkSWRzKTsgLy8gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChkZXNjcmlwdG9ycyk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDb21tb25XaXphcmRSZWdpc3RyeSBleHRlbmRzIE5hdmlnYXRvckNvbnRlbnRSZWdpc3RyeVJlYWRlciB7Ci0gCi0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFuRWxlbWVudCkgewotCQkJaWYgKFRBR19DT01NT05fV0laQVJELmVxdWFscyhhbkVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCWFkZENvbW1vbldpemFyZERlc2NyaXB0b3IobmV3IENvbW1vbldpemFyZERlc2NyaXB0b3IoCi0JCQkJCQkJYW5FbGVtZW50KSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGxvZyBhbiBlcnJvciBzaW5jZSBpdHMgbm90IHNhZmUgdG8gb3BlbiBhIGRpYWxvZyBoZXJlCi0JCQkJCU5hdmlnYXRvclBsdWdpbgotCQkJCQkJCS5sb2coCi0JCQkJCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBjb21tb24gd2l6YXJkIGRlc2NyaXB0b3IuIiwgZS5nZXRTdGF0dXMoKSk7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5yZWFkRWxlbWVudChhbkVsZW1lbnQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL25hdmlnYXRvci9pbnRlcm5hbC93aXphcmRzL1dpemFyZFNob3J0Y3V0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL3dpemFyZHMvV2l6YXJkU2hvcnRjdXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5MTJmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL2ludGVybmFsL3dpemFyZHMvV2l6YXJkU2hvcnRjdXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGx1Z2luQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmludGVybmFsLkNvbW1vbk5hdmlnYXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZERlc2NyaXB0b3I7Ci0KLS8qKgotICogPHA+Ci0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBhIGd1YXJhbnRlZSBuZWl0aGVyIHRoYXQgdGhpcyBBUEkgd2lsbAotICogd29yayBub3IgdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dAotICogY29uc3VsdGluZyB3aXRoIHRoZSBQbGF0Zm9ybS9VSSB0ZWFtLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdpemFyZFNob3J0Y3V0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSVBsdWdpbkNvbnRyaWJ1dGlvbiB7Ci0JcHJpdmF0ZSBJV2l6YXJkRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhV2luZG93Ci0JICogICAgICAgICAgICBUaGUgd2luZG93IHRvIHVzZSBmb3IgdGhlIHNoZWxsIGFuZCBzZWxlY3Rpb24gc2VydmljZS4KLQkgKiBAcGFyYW0gYURlc2NyaXB0b3IKLQkgKiAgICAgICAgICAgIFRoZSBkZXNjcmlwdG9yIHdpdGggaW5mb3JtYXRpb24gZm9yIHRyaWdnZXJpbmcgdGhlIGRlc2lyZWQKLQkgKiAgICAgICAgICAgIHdpemFyZC4KLQkgKi8KLQlwdWJsaWMgV2l6YXJkU2hvcnRjdXRBY3Rpb24oSVdvcmtiZW5jaFdpbmRvdyBhV2luZG93LAotCQkJSVdpemFyZERlc2NyaXB0b3IgYURlc2NyaXB0b3IpIHsKLQkJc3VwZXIoYURlc2NyaXB0b3IuZ2V0TGFiZWwoKSk7Ci0JCWRlc2NyaXB0b3IgPSBhRGVzY3JpcHRvcjsKLQkJc2V0VG9vbFRpcFRleHQoZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IuZ2V0SW1hZ2VEZXNjcmlwdG9yKCkpOwotCQlzZXRJZChBY3Rpb25GYWN0b3J5Lk5FVy5nZXRJZCgpKTsKLQkJdGhpcy53aW5kb3cgPSBhV2luZG93OwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWN0aW9uIGhhcyBiZWVuIGludm9rZWQgYnkgdGhlIHVzZXIKLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgV2luZG93Ci0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyBjcmVhdGUgaW5zdGFuY2Ugb2YgdGFyZ2V0IHdpemFyZAotCi0JCUlXb3JrYmVuY2hXaXphcmQgd2l6YXJkOwotCQl0cnkgewotCQkJd2l6YXJkID0gZGVzY3JpcHRvci5jcmVhdGVXaXphcmQoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Iod2luZG93LmdldFNoZWxsKCksCi0JCQkJCUNvbW1vbk5hdmlnYXRvck1lc3NhZ2VzLk5ld1Byb2plY3RXaXphcmRfZXJyb3JUaXRsZSwKLQkJCQkJQ29tbW9uTmF2aWdhdG9yTWVzc2FnZXMuTmV3UHJvamVjdEFjdGlvbl90ZXh0LCBlCi0JCQkJCQkJLmdldFN0YXR1cygpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQl3aXphcmQKLQkJCQkJLmluaXQod2luZG93LmdldFdvcmtiZW5jaCgpLAotCQkJCQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQkJZWxzZQotCQkJd2l6YXJkLmluaXQod2luZG93LmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQotCQlTaGVsbCBwYXJlbnQgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cocGFyZW50LCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLQkJLy8gSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzLk5FV19XSVpBUkRfU0hPUlRDVVQpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5zdXBwb3J0LklQbHVnaW5Db250cmlidXRpb24jZ2V0TG9jYWxJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbElkKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvci5nZXRJZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5zdXBwb3J0LklQbHVnaW5Db250cmlidXRpb24jZ2V0UGx1Z2luSWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yLmdldElkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvbmF2aWdhdG9yL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTgxY2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS9uYXZpZ2F0b3IvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgQ29tbW9uIE5hdmlnYXRvciBmcmFtZXdvcmsuIFNlcnZpY2VzIGFsbG93IGNsaWVudHMgdG8gY29udHJpYnV0ZQotcmV1c2FibGUgY29udGVudC9sYWJlbCBwcm92aWRlcnMgYW5kIGRlZmluZSB2aWV3ZXJzIHRoYXQgdXNlIHRoZSBhdmFpbGFibGUgY29udGVudC9sYWJlbAotcHJvdmlkZXJzLgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ3YmMyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjE8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3ZTZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNNb24gT2N0IDI0IDE1OjA3OjMwIEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwY2UxMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVHVlIE9jdCAxOCAxNToxNjowOSBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcz48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBnZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50Ij4vKipcbiAqIEByZXR1cm4gUmV0dXJucyB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBzZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmNvbW1lbnQiIG5hbWVcPSJzZXR0ZXJjb21tZW50Ij4vKipcbiAqIEBwYXJhbSAke3BhcmFtfSBUaGUgJHtiYXJlX2ZpZWxkX25hbWV9IHRvIHNldC5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIGNvbnN0cnVjdG9ycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmNvbW1lbnQiIG5hbWVcPSJjb25zdHJ1Y3RvcmNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBKYXZhIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpbGVjb21tZW50IiBuYW1lXD0iZmlsZWNvbW1lbnQiPi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBDb3B5cmlnaHQgKGMpICR7eWVhcn0gSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG4gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcbiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwXDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbiAqXG4gKiBDb250cmlidXRvcnNcOlxuICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJmYWxzZSIgY29udGV4dFw9InR5cGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIHR5cGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnR5cGVjb21tZW50IiBuYW1lXD0idHlwZWNvbW1lbnQiPi8qKlxuICogQHNpbmNlIDMuMlxuICpcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBmaWVsZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50Ij4vKipcbiAqIFxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBub24tb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGNvbW1lbnQiIG5hbWVcPSJtZXRob2Rjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ib3ZlcnJpZGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMub3ZlcnJpZGVjb21tZW50IiBuYW1lXD0ib3ZlcnJpZGVjb21tZW50Ij4vKiAobm9uLUphdmFkb2MpXG4gKiAke3NlZV90b19vdmVycmlkZGVufVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJuZXd0eXBlX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJOZXdseSBjcmVhdGVkIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm5ld3R5cGUiIG5hbWVcPSJuZXd0eXBlIj4ke2ZpbGVjb21tZW50fVxuJHtwYWNrYWdlX2RlY2xhcmF0aW9ufVxuXG4ke3R5cGVjb21tZW50fVxuJHt0eXBlX2RlY2xhcmF0aW9ufTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2F0Y2hibG9ja19jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2F0Y2ggYmxvY2tzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNhdGNoYmxvY2siIG5hbWVcPSJjYXRjaGJsb2NrIj4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrXG4ke2V4Y2VwdGlvbl92YXJ9LnByaW50U3RhY2tUcmFjZSgpOzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIG1ldGhvZCBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rib2R5IiBuYW1lXD0ibWV0aG9kYm9keSI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YlxuJHtib2R5X3N0YXRlbWVudH08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGNvbnN0cnVjdG9yIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yYm9keSIgbmFtZVw9ImNvbnN0cnVjdG9yYm9keSI+JHtib2R5X3N0YXRlbWVudH1cbi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGdldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyYm9keSIgbmFtZVw9ImdldHRlcmJvZHkiPnJldHVybiAke2ZpZWxkfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBzZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmJvZHkiIG5hbWVcPSJzZXR0ZXJib2R5Ij4ke2ZpZWxkfSBcPSAke3BhcmFtfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNsYXNzYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2xhc3MgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2xhc3Nib2R5IiBuYW1lXD0iY2xhc3Nib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iaW50ZXJmYWNlYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgaW50ZXJmYWNlIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmludGVyZmFjZWJvZHkiIG5hbWVcPSJpbnRlcmZhY2Vib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZW51bWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGVudW0gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZW51bWJvZHkiIG5hbWVcPSJlbnVtYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImFubm90YXRpb25ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBhbm5vdGF0aW9uIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmFubm90YXRpb25ib2R5IiBuYW1lXD0iYW5ub3RhdGlvbmJvZHkiPlxuPC90ZW1wbGF0ZT48L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdiNjVmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jVHVlIE5vdiAxNiAxNDoxMTo1MSBFU1QgMjAwNAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0OGMxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMucjIxLlIyMVByZXNlbnRhdGlvblBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMucjIxO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy5yMjEud2lkZ2V0czt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9SRUFETUUuVFhUIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9SRUFETUUuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2IxN2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvUkVBRE1FLlRYVAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLVRoZSByMjFwcmVzZW50YXRpb24gcGx1Z2luIHByb3ZpZGVzIGFuIFIyLjEgc3R5bGUgbG9vayBhbmQgZmVlbCBmb3IKLUVjbGlwc2UuICBUaGlzIGxvb2sgYW5kIGZlZWwgaXMgYWNjb21wbGlzaGVkIGVudGlyZWx5IHRocm91Z2ggdGhlCi1QcmVzZW50YXRpb25zIEFQSSwgbm8gY2hhbmdlcyBhcmUgbmVlZGVkIHRvIHRoZSBiYXNlIGVjbGlwc2UgcmVsZWFzZS4KLQotVXNlOgotCi0xLiBFbnN1cmUgdGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQgKGxvb2sgaW4geW91ciBlY2xpcHNlL3BsdWdpbnMKLSAgIGRpcmVjdG9yeSBmb3Igb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjFfMy4wLjApLgotMi4gQWRkIHRoZSBjb250ZW50cyBvZiB0aGUgcjIxcHJlc2VudGF0aW9uLmluaSBmaWxlIHRvIHlvdXIgcHJpbWFyeQotICAgcGx1Z2luJ3MgInBsdWdpbl9jdXN0b21pemF0aW9uLmluaSIgZmlsZS4gIEluIHRoZSBiYXNpYyBFY2xpcHNlCi0gICBJREUsIHRoaXMgZmlsZSBpcyBsb2NhdGVkIGluIHBsdWdpbnMvb3JnLmVjbGlwc2UucGxhdGZvcm1fMy4wLjAuCi0zLiBSZXNvbHZlIGFueSBjb25mbGljdHMgaW4gdGhlIHBsdWdpbl9jdXN0b21pemF0aW9uLmluaSBmaWxlIHRvIGZhdm91cgotICAgdGhlIHNldHRpbmdzIGZvciB0aGlzIHByb2plY3QuICBFLmcuLCBET0NLX1BFUlNQRUNUSVZFX0JBUiBpcyBzZXQKLSAgIHRvICJ0b3BSaWdodCIgaW4gdGhlIGJhc2ljIHBsYXRmb3JtIGJ1dCBzaG91bGQgYmUgImxlZnQiIGZvciB0aGUKLSAgIFIyMSBwcmVzZW50YXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2NkODgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHIyMXByZXNlbnRhdGlvbi5pbmksXAotICAgICAgICAgICAgICAgUkVBRE1FLlRYVCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZTY4NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL2NvbXBvbmVudCIKLSAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9lY2xpcHNlLm9yZy9jb21wb25lbnQgLi4vY29tcG9uZW50LnhzZCAiCi0gICBuYW1lPSJQbGF0Zm9ybSBVSSBSMi4xIFByZXNlbnRhdGlvbiI+Ci0gPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEiIC8+Ci0KLSA8IS0tIE5vIEFQSSBwYWNrYWdlcyAtLT4KLQotIDxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiLz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNmYzMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9IFIyMSBQcmVzZW50YXRpb24gUGx1Zy1pbgotcHJvdmlkZXJOYW1lPSBFY2xpcHNlLm9yZwotCi1QcmVzZW50YXRpb24ucjIxLm5hbWU9RWNsaXBzZSAyLjEgU3R5bGUgUHJlc2VudGF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWJjZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbkZhY3RvcmllcyI+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgbmFtZT0iJVByZXNlbnRhdGlvbi5yMjEubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLlIyMVByZXNlbnRhdGlvbkZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucjIxcHJlc2VudGF0aW9uRmFjdG9yeSI+Ci0gICAgICA8L2ZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3IyMXByZXNlbnRhdGlvbi5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3IyMXByZXNlbnRhdGlvbi5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOGM4ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9yMjFwcmVzZW50YXRpb24uaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBSMjEgcHJlc2VudGF0aW9uIHNldHRpbmdzOiBjb3B5IHRoZXNlIHZhbHVlcyB0byB5b3VyIHByb2R1Y3QncwotIyBwbHVnaW5fY3VzdG9taXphdGlvbi5pbmkgZmlsZSBiZWZvcmUgc3RhcnRpbmcgZWNsaXBzZQotIwotIyBJdHMgcG9zc2libGUgdGhhdCBwbGF0Zm9ybSBoYXMgaXRzIG93biBzZXR0aW5nIGZvciBzb21lIG9mIHRoZXNlCi0jIHZhbHVlcy4gIEJlIHN1cmUgdG8gcmVzb2x2ZSBjb25mbGljdHMgdG8gZmF2b3VyIHRoZSB2YWx1ZXMgaW4gdGhpcwotIyBmaWxlLgotCi0jIHVzZSB0aGUgUjIuMSBzdHlsZQotb3JnLmVjbGlwc2UudWkvcHJlc2VudGF0aW9uRmFjdG9yeUlkPW9yZy5lY2xpcHNlLnVpLmludGVybmFsLnIyMXByZXNlbnRhdGlvbkZhY3RvcnkKLQotIyBwdXQgdGhlIHZpZXcgdGFicyBvbiB0aGUgYm90dG9tICgxMDI0ID09IFNXVC5CT1RUT00pCi1vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gvVklFV19UQUJfUE9TSVRJT049MTAyNAotCi0jIHB1dCB0aGUgcGVyc3BlY3RpdmUgc3dpdGNoZXIgb24gdGhlIGxlZnQKLW9yZy5lY2xpcHNlLnVpL0RPQ0tfUEVSU1BFQ1RJVkVfQkFSPWxlZnQKLQotIyBwdXQgdGhlIGZhc3QgdmlldyBiYXIgb24gdGhlIGxlZnQKLW9yZy5lY2xpcHNlLnVpL2luaXRpYWxGYXN0Vmlld0JhckxvY2F0aW9uPWxlZnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ByZXNlbnRhdGlvbnMvUjIxQmFzaWNTdGFja1ByZXNlbnRhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9SMjFCYXNpY1N0YWNrUHJlc2VudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OTBmZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9SMjFCYXNpY1N0YWNrUHJlc2VudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBHdW5uYXIgV2FnZW5rbmVjaHQgLSBzb21lIGNvbnRyaWJ1dGlvbnMgKGJ1ZyBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5HZW9tZXRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hHcmFwaGljQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kbmQuRHJhZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy5yMjEuUjIxQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMucjIxLlIyMVByZXNlbnRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMucjIxLndpZGdldHMuQ1RhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy5yMjEud2lkZ2V0cy5SMjFQYW5lRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklQYXJ0TWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklQcmVzZW50YWJsZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JUHJlc2VudGF0aW9uU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklTdGFja1ByZXNlbnRhdGlvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5QcmVzZW50YXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuU3RhY2tEcm9wUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuU3RhY2tQcmVzZW50YXRpb247Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgU3RhY2tQcmVzZW50YXRpb25zIHRoYXQgZGlzcGxheSBJUHJlc2VudGFibGVQYXJ0cyBpbiBhCi0gKiBDVGFiRm9sZGVyLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSMjFCYXNpY1N0YWNrUHJlc2VudGF0aW9uIGV4dGVuZHMgU3RhY2tQcmVzZW50YXRpb24gewotCi0JcHJpdmF0ZSBSMjFQYW5lRm9sZGVyIHBhbmVGb2xkZXI7Ci0KLQlwcml2YXRlIElQcmVzZW50YWJsZVBhcnQgY3VycmVudDsKLQotCXByaXZhdGUgYm9vbGVhbiBhY3RpdmVTdGF0ZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBNZW51TWFuYWdlciBzeXN0ZW1NZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOwotCi0JcHJpdmF0ZSBDTGFiZWwgdGl0bGVMYWJlbDsKLQotCXByaXZhdGUgYm9vbGVhbiBzaGVsbEFjdGl2ZSA9IHRydWU7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFCX0RBVEEgPSBSMjFCYXNpY1N0YWNrUHJlc2VudGF0aW9uLmNsYXNzCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIucGFydElkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJpdmF0ZSBQYW5lRm9sZGVyQnV0dG9uTGlzdGVuZXIgYnV0dG9uTGlzdGVuZXIgPSBuZXcKLQkvLyBQYW5lRm9sZGVyQnV0dG9uTGlzdGVuZXIoKSB7Ci0JLy8gcHVibGljIHZvaWQgc3RhdGVCdXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCS8vIGdldFNpdGUoKS5zZXRTdGF0ZShidXR0b25JZCk7Ci0JLy8gfQotCS8vCi0JLy8gcHVibGljIHZvaWQgY2xvc2VCdXR0b25QcmVzc2VkKENUYWJJdGVtIGl0ZW0pIHsKLQkvLyBJUHJlc2VudGFibGVQYXJ0IHBhcnQgPSBnZXRQYXJ0Rm9yVGFiKGl0ZW0pOwotCS8vCQkJCi0JLy8gZ2V0U2l0ZSgpLmNsb3NlKHBhcnQpOwotCS8vIH0KLQkvLyB9OwotCS8vCQotCXByaXZhdGUgTW91c2VMaXN0ZW5lciBtb3VzZUxpc3RlbmVyID0gbmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgQ29udHJvbCkgewotCQkJCUNvbnRyb2wgY3RybCA9IChDb250cm9sKSBlLndpZGdldDsKLQkJCQlQb2ludCBnbG9iYWxQb3MgPSBjdHJsLnRvRGlzcGxheShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLQotCQkJCS8vIFBSIzFHREVaMjUgLSBJZiBzZWxlY3Rpb24gd2lsbCBjaGFuZ2UgaW4gbW91c2UgdXAgaWdub3JlCi0JCQkJLy8gbW91c2UgZG93bi4KLQkJCQkvLyBFbHNlLCBzZXQgZm9jdXMuCi0JCQkJQ1RhYkl0ZW0gbmV3SXRlbSA9IHBhbmVGb2xkZXIuZ2V0SXRlbShwYW5lRm9sZGVyLmdldENvbnRyb2woKQotCQkJCQkJLnRvQ29udHJvbChnbG9iYWxQb3MpKTsKLQkJCQlpZiAobmV3SXRlbSAhPSBudWxsKSB7Ci0JCQkJCUNUYWJJdGVtIG9sZEl0ZW0gPSBwYW5lRm9sZGVyLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAobmV3SXRlbSAhPSBvbGRJdGVtKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQkJCWN1cnJlbnQuc2V0Rm9jdXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJaWYgKGdldFNpdGUoKS5nZXRTdGF0ZSgpID09IElTdGFja1ByZXNlbnRhdGlvblNpdGUuU1RBVEVfTUFYSU1JWkVEKSB7Ci0JCQkJZ2V0U2l0ZSgpLnNldFN0YXRlKElTdGFja1ByZXNlbnRhdGlvblNpdGUuU1RBVEVfUkVTVE9SRUQpOwotCQkJfSBlbHNlIHsKLQkJCQlnZXRTaXRlKCkuc2V0U3RhdGUoSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9NQVhJTUlaRUQpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTW91c2VMaXN0ZW5lciB0aXRsZU1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0JCQkJQ29udHJvbCBjdHJsID0gKENvbnRyb2wpIGUud2lkZ2V0OwotCQkJCVBvaW50IGdsb2JhbFBvcyA9IGN0cmwudG9EaXNwbGF5KG5ldyBQb2ludCgwLCB0aXRsZUxhYmVsCi0JCQkJCQkuZ2V0Qm91bmRzKCkuaGVpZ2h0KSk7Ci0KLQkJCQlpZiAoKGUuYnV0dG9uID09IDEpICYmIG92ZXJJbWFnZShlLngpKQotCQkJCQlzaG93U3lzdGVtTWVudShnbG9iYWxQb3MpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXIgbWVudUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHBvcyA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLQotCQkJc2hvd1N5c3RlbU1lbnUocG9zKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIGRyYWdMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQotCQkJUG9pbnQgbG9jYWxQb3MgPSBuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlDVGFiSXRlbSB0YWJVbmRlclBvaW50ZXIgPSBwYW5lRm9sZGVyLmdldEl0ZW0obG9jYWxQb3MpOwotCi0JCQkvLyBEcmFncyBvbiB0aGUgdGl0bGUgYXJlYSBkcmFnIHRoZSBzZWxlY3RlZCBwYXJ0IG9ubHkKLQkJCWlmICh0YWJVbmRlclBvaW50ZXIgPT0gbnVsbCkgewotCQkJCWlmIChwYW5lRm9sZGVyLmdldFRhYlBvc2l0aW9uKCkgPT0gU1dULkJPVFRPTQotCQkJCQkJJiYgbG9jYWxQb3MueSA8IHBhbmVGb2xkZXIuZ2V0Q29udHJvbCgpLmdldEJvdW5kcygpLmhlaWdodAotCQkJCQkJCQktIHBhbmVGb2xkZXIuZ2V0VGFiSGVpZ2h0KCkpCi0JCQkJCXRhYlVuZGVyUG9pbnRlciA9IHBhbmVGb2xkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZWxzZSBpZiAocGFuZUZvbGRlci5nZXRUYWJQb3NpdGlvbigpID09IFNXVC5UT1AKLQkJCQkJCSYmIGxvY2FsUG9zLnkgPiBwYW5lRm9sZGVyLmdldFRhYkhlaWdodCgpKQotCQkJCQl0YWJVbmRlclBvaW50ZXIgPSBwYW5lRm9sZGVyLmdldFNlbGVjdGlvbigpOwotCQkJfQotCi0JCQkvLyBOb3QgaW4gYSB0YWIsIG5vdCBpbiBhIHRpdGxlIGFyZWEsIG11c3QgYmUgZHJhZ2dpbmcgdGhlIHdob2xlCi0JCQkvLyBzdGFjawotCQkJaWYgKHRhYlVuZGVyUG9pbnRlciA9PSBudWxsKSB7Ci0JCQkJZ2V0U2l0ZSgpLmRyYWdTdGFydCgKLQkJCQkJCXBhbmVGb2xkZXIuZ2V0Q29udHJvbCgpLnRvRGlzcGxheShsb2NhbFBvcyksIGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUlQcmVzZW50YWJsZVBhcnQgcGFydCA9IGdldFBhcnRGb3JUYWIodGFiVW5kZXJQb2ludGVyKTsKLQotCQkJaWYgKGdldFNpdGUoKS5pc1BhcnRNb3ZlYWJsZShwYXJ0KSkgewotCQkJCWdldFNpdGUoKS5kcmFnU3RhcnQocGFydCwKLQkJCQkJCXBhbmVGb2xkZXIuZ2V0Q29udHJvbCgpLnRvRGlzcGxheShsb2NhbFBvcyksIGZhbHNlKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlJUHJlc2VudGFibGVQYXJ0IGl0ZW0gPSBnZXRQYXJ0Rm9yVGFiKChDVGFiSXRlbSkgZS5pdGVtKTsKLQotCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCWdldFNpdGUoKS5zZWxlY3RQYXJ0KGl0ZW0pOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXIgcmVzaXplTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCXNldENvbnRyb2xTaXplKCk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJUHJvcGVydHlMaXN0ZW5lciBjaGlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgc291cmNlLCBpbnQgcHJvcGVydHkpIHsKLQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBJUHJlc2VudGFibGVQYXJ0KSB7Ci0JCQkJSVByZXNlbnRhYmxlUGFydCBwYXJ0ID0gKElQcmVzZW50YWJsZVBhcnQpIHNvdXJjZTsKLQkJCQljaGlsZFByb3BlcnR5Q2hhbmdlZChwYXJ0LCBwcm9wZXJ0eSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBEaXNwb3NlTGlzdGVuZXIgdGFiRGlzcG9zZUxpc3RlbmVyID0gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIENUYWJJdGVtKSB7Ci0JCQkJQ1RhYkl0ZW0gaXRlbSA9IChDVGFiSXRlbSkgZS53aWRnZXQ7Ci0KLQkJCQlJUHJlc2VudGFibGVQYXJ0IHBhcnQgPSBnZXRQYXJ0Rm9yVGFiKGl0ZW0pOwotCi0JCQkJcGFydC5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKGNoaWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqIHRoZSBzaGVsbCBsaXN0ZW5lciBmb3IgdXBncmFkaW5nIHRoZSBncmFkaWVudCAqLwotCXByaXZhdGUgU2hlbGxBZGFwdGVyIHNoZWxsTGlzdGVuZXIgPSBuZXcgU2hlbGxBZGFwdGVyKCkgewotCi0JCXB1YmxpYyB2b2lkIHNoZWxsQWN0aXZhdGVkKFNoZWxsRXZlbnQgZXZlbnQpIHsKLQkJCXNoZWxsQWN0aXZlID0gdHJ1ZTsKLQkJCXVwZGF0ZUdyYWRpZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzaGVsbERlYWN0aXZhdGVkKFNoZWxsRXZlbnQgZXZlbnQpIHsKLQkJCXNoZWxsQWN0aXZlID0gZmFsc2U7Ci0JCQl1cGRhdGVHcmFkaWVudCgpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgVG9vbEJhciB2aWV3VG9vbEJhcjsKLQotCXByaXZhdGUgVG9vbEl0ZW0gcHVsbERvd25CdXR0b247Ci0KLQlwcml2YXRlIFRvb2xJdGVtIGNsb3NlQnV0dG9uOwotCi0JcHVibGljIFIyMUJhc2ljU3RhY2tQcmVzZW50YXRpb24oUjIxUGFuZUZvbGRlciBjb250cm9sLAotCQkJSVN0YWNrUHJlc2VudGF0aW9uU2l0ZSBzdGFja1NpdGUpIHsKLQkJc3VwZXIoc3RhY2tTaXRlKTsKLQkJcGFuZUZvbGRlciA9IGNvbnRyb2w7Ci0KLQkJc2hlbGxBY3RpdmUgPSBwYW5lRm9sZGVyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLmVxdWFscygKLQkJCQljb250cm9sLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0KLQkJLy8gdGFiRm9sZGVyLnNldE1pbmltaXplVmlzaWJsZShzdGFja1NpdGUuc3VwcG9ydHNTdGF0ZShJU3RhY2tQcmVzZW50YXRpb25TaXRlLlNUQVRFX01JTklNSVpFRCkpOwotCQkvLyB0YWJGb2xkZXIuc2V0TWF4aW1pemVWaXNpYmxlKHN0YWNrU2l0ZS5zdXBwb3J0c1N0YXRlKElTdGFja1ByZXNlbnRhdGlvblNpdGUuU1RBVEVfTUFYSU1JWkVEKSk7Ci0JCS8vCQkJCQotCQl0aXRsZUxhYmVsID0gbmV3IENMYWJlbChwYW5lRm9sZGVyLmdldENvbnRyb2woKSwgU1dULlNIQURPV19OT05FKTsKLQkJdGl0bGVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJdGl0bGVMYWJlbC5tb3ZlQWJvdmUobnVsbCk7Ci0JCXRpdGxlTGFiZWwuYWRkTW91c2VMaXN0ZW5lcih0aXRsZU1vdXNlTGlzdGVuZXIpOwotCQl0aXRsZUxhYmVsLmFkZE1vdXNlTGlzdGVuZXIobW91c2VMaXN0ZW5lcik7Ci0JCXRpdGxlTGFiZWwuYWRkTGlzdGVuZXIoU1dULk1lbnVEZXRlY3QsIG1lbnVMaXN0ZW5lcik7Ci0JCVByZXNlbnRhdGlvblV0aWwuYWRkRHJhZ0xpc3RlbmVyKHRpdGxlTGFiZWwsIGRyYWdMaXN0ZW5lcik7Ci0KLQkJLy8gQ29sb3JTY2hlbWVTZXJ2aWNlLnNldFZpZXdUaXRsZUZvbnQodGhpcywgdGl0bGVMYWJlbCk7Ci0KLQkJdmlld1Rvb2xCYXIgPSBuZXcgVG9vbEJhcihjb250cm9sLmdldENvbnRyb2woKSwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5GTEFUKTsKLQkJdmlld1Rvb2xCYXIubW92ZUFib3ZlKG51bGwpOwotCi0JCXB1bGxEb3duQnV0dG9uID0gbmV3IFRvb2xJdGVtKHZpZXdUb29sQmFyLCBTV1QuUFVTSCk7Ci0JCS8vIEltYWdlIGltZyA9Ci0JCS8vIFdvcmtiZW5jaEltYWdlcy5nZXRJbWFnZShJV29ya2JlbmNoR3JhcGhpY0NvbnN0YW50cy5JTUdfTENMX1ZJRVdfTUVOVSk7Ci0JCUltYWdlIGhvdmVySW1hZ2UgPSBXb3JrYmVuY2hJbWFnZXMKLQkJCQkuZ2V0SW1hZ2UoSVdvcmtiZW5jaEdyYXBoaWNDb25zdGFudHMuSU1HX0xDTF9WSUVXX01FTlUpOwotCQlwdWxsRG93bkJ1dHRvbi5zZXREaXNhYmxlZEltYWdlKG51bGwpOyAvLyBUT0RPOiBjb21tZW50IHRoaXMgb3V0PwotCQkvLyBQUiMxR0U1NlFUIC0gQXZvaWQgY3JlYXRpb24gb2YgdW5uZWNlc3NhcnkgaW1hZ2UuCi0JCXB1bGxEb3duQnV0dG9uLnNldEltYWdlKGhvdmVySW1hZ2UpOwotCQlwdWxsRG93bkJ1dHRvbi5zZXRUb29sVGlwVGV4dChSMjFQcmVzZW50YXRpb25NZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIkJhc2ljU3RhY2tQcmVzZW50YXRpb24ubWVudS50b29sdGlwIikpOyAvLyROT04tTkxTLTEkCi0JCXB1bGxEb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNob3dQYW5lTWVudSgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBsaXN0ZW5lciB0byBzd2l0Y2ggYmV0d2VlbiB2aXNpYmxlIHRhYkl0ZW1zCi0JCXBhbmVGb2xkZXIuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyBsaXN0ZW5lciB0byByZXNpemUgdmlzaWJsZSBjb21wb25lbnRzCi0JCXBhbmVGb2xkZXIuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIHJlc2l6ZUxpc3RlbmVyKTsKLQotCQkvLyBsaXN0ZW4gZm9yIG1vdXNlIGRvd24gb24gdGFiIHRvIHNldCBmb2N1cy4KLQkJcGFuZUZvbGRlci5nZXRDb250cm9sKCkuYWRkTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLQotCQlwYW5lRm9sZGVyLmdldENvbnRyb2woKS5hZGRMaXN0ZW5lcihTV1QuTWVudURldGVjdCwgbWVudUxpc3RlbmVyKTsKLQotCQkvLyB0YWJGb2xkZXIuYWRkQnV0dG9uTGlzdGVuZXIoYnV0dG9uTGlzdGVuZXIpOwotCi0JCVByZXNlbnRhdGlvblV0aWwuYWRkRHJhZ0xpc3RlbmVyKHBhbmVGb2xkZXIuZ2V0Q29udHJvbCgpLCBkcmFnTGlzdGVuZXIpOwotCi0JCS8vIGFkZCB0aGUgc2hlbGwgbGlzdGVuZXIgdG8gdHJhY2sgc2hlbGwgYWN0aXZhdGlvbnMKLQkJLy8gVE9ETzogY2hlY2sgaWYgd29ya2Fyb3VuZCBjYW4gYmUgcmVtb3ZlZCAoc2VlIGJ1ZyA1NTQ1OCkKLQkJcGFuZUZvbGRlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKS5hZGRTaGVsbExpc3RlbmVyKHNoZWxsTGlzdGVuZXIpOwotCi0JCS8vIFVuY29tbWVudCB0byBhbGxvdyBkcmFnZ2luZyBmcm9tIHRoZSB0aXRsZSBsYWJlbAotCQkvLyBQcmVzZW50YXRpb25VdGlsLmFkZERyYWdMaXN0ZW5lcih0aXRsZUxhYmVsLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCS8vIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGlmIChsYXlvdXQuaXNUcmltT25Ub3AoKSkgewotCQkvLyBQb2ludCBsb2NhbFBvcyA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLQkJLy8gZ2V0U2l0ZSgpLmRyYWdTdGFydCh0aXRsZUxhYmVsLnRvRGlzcGxheShsb2NhbFBvcyksIGZhbHNlKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0pOwotCi0JCS8vIC8vIENvbXB1dGUgdGhlIHRhYiBoZWlnaHQKLQkJLy8gaW50IHRhYkhlaWdodCA9IHZpZXdUb29sQmFyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLQkJLy8KLQkJLy8gLy8gRW5mb3JjZSBhIG1pbmltdW0gdGFiIGhlaWdodAotCQkvLyBpZiAodGFiSGVpZ2h0IDwgMjApIHsKLQkJLy8gdGFiSGVpZ2h0ID0gMjA7Ci0JCS8vIH0KLQkJLy8gcGFuZUZvbGRlci5zZXRUYWJIZWlnaHQodGFiSGVpZ2h0KTsKLQkJLy8JCQotCQlwb3B1bGF0ZVN5c3RlbU1lbnUoc3lzdGVtTWVudU1hbmFnZXIpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRydWUgaWYgPGNvZGU+eDwvY29kZT4gaXMgb3ZlciB0aGUgbGFiZWwgaW1hZ2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG92ZXJJbWFnZShpbnQgeCkgewotCQlyZXR1cm4geCA8IHRpdGxlTGFiZWwuZ2V0SW1hZ2UoKS5nZXRCb3VuZHMoKS53aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3lzdGVtTWVudU1hbmFnZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVTeXN0ZW1NZW51KElNZW51TWFuYWdlciBzeXN0ZW1NZW51TWFuYWdlcikgewotCi0JCXN5c3RlbU1lbnVNYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoIm1pc2MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3lzdGVtTWVudU1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcigicmVzdG9yZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzeXN0ZW1NZW51TWFuYWdlci5hZGQobmV3IFVwZGF0aW5nQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQluZXcgU3lzdGVtTWVudVJlc3RvcmUoZ2V0U2l0ZSgpKSkpOwotCi0JCXN5c3RlbU1lbnVNYW5hZ2VyLmFkZChuZXcgU3lzdGVtTWVudU1vdmUoZ2V0U2l0ZSgpLCBnZXRQYW5lTmFtZSgpKSk7Ci0JCXN5c3RlbU1lbnVNYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoInNpemUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3lzdGVtTWVudU1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcigic3RhdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3lzdGVtTWVudU1hbmFnZXIuYWRkKG5ldyBVcGRhdGluZ0FjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oCi0JCQkJbmV3IFN5c3RlbU1lbnVNaW5pbWl6ZShnZXRTaXRlKCkpKSk7Ci0KLQkJc3lzdGVtTWVudU1hbmFnZXIuYWRkKG5ldyBVcGRhdGluZ0FjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oCi0JCQkJbmV3IFN5c3RlbU1lbnVNYXhpbWl6ZShnZXRTaXRlKCkpKSk7Ci0JCXN5c3RlbU1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJjbG9zZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzeXN0ZW1NZW51TWFuYWdlci5hZGQobmV3IFVwZGF0aW5nQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQluZXcgU3lzdGVtTWVudUNsb3NlKGdldFNpdGUoKSkpKTsKLQotCQlnZXRTaXRlKCkuYWRkU3lzdGVtQWN0aW9ucyhzeXN0ZW1NZW51TWFuYWdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYW5lTmFtZSgpIHsKLQkJcmV0dXJuIFIyMVByZXNlbnRhdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiQmFzaWNTdGFja1ByZXNlbnRhdGlvbi5wYW5lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgdmlldyBtZW51IGFzIGEgcG9wdXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93UGFuZU1lbnUoKSB7Ci0JCUlQYXJ0TWVudSBtZW51ID0gZ2V0UGFydE1lbnUoKTsKLQotCQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gRHJhZ1V0aWwuZ2V0RGlzcGxheUJvdW5kcyh2aWV3VG9vbEJhcik7Ci0JCQltZW51LnNob3dNZW51KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhcnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIElQcmVzZW50YWJsZVBhcnQgZ2V0Q3VycmVudCgpIHsKLQkJcmV0dXJuIGN1cnJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHRhYiBmb3IgdGhlIGdpdmVuIHBhcnQsIG9yIHJldHVybnMKLQkgKiB0YWJGb2xkZXIuZ2V0SXRlbUNvdW50KCkgaWYgdGhlcmUgaXMgbm8gc3VjaCB0YWIuCi0JICogCi0JICogQHBhcmFtIHBhcnQKLQkgKiAgICAgICAgICAgIHBhcnQgYmVpbmcgc2VhcmNoZWQgZm9yCi0JICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHRhYiBmb3IgdGhlIGdpdmVuIHBhcnQsIG9yIHRoZSBudW1iZXIgb2YgdGFicyBpZgotCSAqICAgICAgICAgdGhlcmUgaXMgbm8gc3VjaCB0YWIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBpbmRleE9mKElQcmVzZW50YWJsZVBhcnQgcGFydCkgewotCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFuZUZvbGRlci5nZXRJdGVtQ291bnQoKTsKLQkJfQotCi0JCUNUYWJJdGVtW10gaXRlbXMgPSBwYW5lRm9sZGVyLmdldEl0ZW1zKCk7Ci0KLQkJZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgaXRlbXMubGVuZ3RoOyBpZHgrKykgewotCQkJSVByZXNlbnRhYmxlUGFydCB0YWJQYXJ0ID0gZ2V0UGFydEZvclRhYihpdGVtc1tpZHhdKTsKLQotCQkJaWYgKHBhcnQgPT0gdGFiUGFydCkgewotCQkJCXJldHVybiBpZHg7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhYiBmb3IgdGhlIGdpdmVuIHBhcnQsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCB0YWIKLQkgKiAKLQkgKiBAcGFyYW0gcGFydAotCSAqICAgICAgICAgICAgdGhlIHBhcnQgYmVpbmcgc2VhcmNoZWQgZm9yCi0JICogQHJldHVybiB0aGUgdGFiIGZvciB0aGUgZ2l2ZW4gcGFydCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHRhYgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDVGFiSXRlbSBnZXRUYWIoSVByZXNlbnRhYmxlUGFydCBwYXJ0KSB7Ci0JCUNUYWJJdGVtW10gaXRlbXMgPSBwYW5lRm9sZGVyLmdldEl0ZW1zKCk7Ci0KLQkJaW50IGlkeCA9IGluZGV4T2YocGFydCk7Ci0KLQkJaWYgKGlkeCA8IGl0ZW1zLmxlbmd0aCkgewotCQkJcmV0dXJuIGl0ZW1zW2lkeF07Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFydAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkUHJvcGVydHlDaGFuZ2VkKElQcmVzZW50YWJsZVBhcnQgcGFydCwgaW50IHByb3BlcnR5KSB7Ci0KLQkJQ1RhYkl0ZW0gdGFiID0gZ2V0VGFiKHBhcnQpOwotCQlpbml0VGFiKHRhYiwgcGFydCk7Ci0KLQkJc3dpdGNoIChwcm9wZXJ0eSkgewotCQljYXNlIElQcmVzZW50YWJsZVBhcnQuUFJPUF9CVVNZOgotCQkJYnJlYWs7Ci0JCWNhc2UgSVByZXNlbnRhYmxlUGFydC5QUk9QX0hJR0hMSUdIVF9JRl9CQUNLOgotCQkJLy8gRm9udFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0KLQkJCS8vIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuCi0JCQkvLyBnZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS4KLQkJCS8vIGdldEZvbnRSZWdpc3RyeSgpOwotCQkJLy8JICAgICAJCi0JCQkvLyBpZighZ2V0Q3VycmVudCgpLmVxdWFscyhwYXJ0KSkvL1NldCBib2xkIGlmIGl0IGRvZXMgY3VycmVudGx5Ci0JCQkvLyBoYXZlIGZvY3VzCi0JCQkvLyB0YWIuc2V0Rm9udChyZWdpc3RyeS5nZXRCb2xkKElXb3JrYmVuY2hUaGVtZUNvbnN0YW50cy5UQUJfVEVYVF9GT05UKSk7Ci0JCQkvLyBicmVhazsKLQkJY2FzZSBJUHJlc2VudGFibGVQYXJ0LlBST1BfVE9PTEJBUjoKLQkJY2FzZSBJUHJlc2VudGFibGVQYXJ0LlBST1BfUEFORV9NRU5VOgotCQljYXNlIElQcmVzZW50YWJsZVBhcnQuUFJPUF9USVRMRToKLQkJCXNldENvbnRyb2xTaXplKCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBJUHJlc2VudGFibGVQYXJ0IGdldFBhcnRGb3JUYWIoQ1RhYkl0ZW0gaXRlbSkgewotCQlJUHJlc2VudGFibGVQYXJ0IHBhcnQgPSAoSVByZXNlbnRhYmxlUGFydCkgaXRlbS5nZXREYXRhKFRBQl9EQVRBKTsKLQotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRhYiBmb2xkZXIgZm9yIHRoaXMgcHJlc2VudGF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUjIxUGFuZUZvbGRlciBnZXRQYW5lRm9sZGVyKCkgewotCQlyZXR1cm4gcGFuZUZvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bmRlcmx5aW5nIHRhYiBmb2xkZXIgaGFzIGJlZW4gZGlzcG9zZWQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBwYW5lRm9sZGVyID09IG51bGwgfHwgcGFuZUZvbGRlci5pc0Rpc3Bvc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSB0YWIgZm9sZGVyJ3MgY29sb3VycyB0byBtYXRjaCB0aGUgY3VycmVudCB0aGVtZSBzZXR0aW5ncyBhbmQKLQkgKiBhY3RpdmUgc3RhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVHcmFkaWVudCgpIHsKLQotCQlpZiAoaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCUNvbG9yIGZnQ29sb3I7Ci0JCUNvbG9yW10gYmdDb2xvcnM7Ci0JCWludFtdIGJnUGVyY2VudHM7Ci0JCWJvb2xlYW4gdmVydGljYWwgPSBmYWxzZTsKLQkJaWYgKGlzQWN0aXZlKCkpIHsKLQkJCWlmIChnZXRTaGVsbEFjdGl2YXRlZCgpKSB7Ci0JCQkJZmdDb2xvciA9IFIyMUNvbG9ycy5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfVElUTEVfRk9SRUdST1VORCk7Ci0JCQkJYmdDb2xvcnMgPSBSMjFDb2xvcnMuZ2V0QWN0aXZlVmlld0dyYWRpZW50KCk7Ci0JCQkJYmdQZXJjZW50cyA9IFIyMUNvbG9ycy5nZXRBY3RpdmVWaWV3R3JhZGllbnRQZXJjZW50cygpOwotCQkJfSBlbHNlIHsKLQkJCQlmZ0NvbG9yID0gUjIxQ29sb3JzCi0JCQkJCQkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0ZPUkVHUk9VTkQpOwotCQkJCWJnQ29sb3JzID0gUjIxQ29sb3JzLmdldERlYWN0aXZhdGVkVmlld0dyYWRpZW50KCk7Ci0JCQkJYmdQZXJjZW50cyA9IFIyMUNvbG9ycy5nZXREZWFjdGl2YXRlZFZpZXdHcmFkaWVudFBlcmNlbnRzKCk7Ci0JCQl9Ci0KLQkJfSBlbHNlIHsKLQkJCWZnQ29sb3IgPSBSMjFDb2xvcnMuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCQliZ0NvbG9ycyA9IG51bGw7Ci0JCQliZ1BlcmNlbnRzID0gbnVsbDsKLQkJfQotCi0JCWRyYXdHcmFkaWVudChmZ0NvbG9yLCBiZ0NvbG9ycywgYmdQZXJjZW50cywgdmVydGljYWwpOwotCi0JCS8vIENvbG9yIGZnQ29sb3I7Ci0JCS8vIElUaGVtZSBjdXJyZW50VGhlbWUgPQotCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFRoZW1lTWFuYWdlcigpLmdldEN1cnJlbnRUaGVtZSgpOwotCQkvLyBGb250UmVnaXN0cnkgZm9udFJlZ2lzdHJ5ID0gY3VycmVudFRoZW1lLmdldEZvbnRSZWdpc3RyeSgpOwotCQkvLyBDb2xvclJlZ2lzdHJ5IGNvbG9yUmVnaXN0cnkgPSBjdXJyZW50VGhlbWUuZ2V0Q29sb3JSZWdpc3RyeSgpOwotCQkvLyBDb2xvciBbXSBiZ0NvbG9ycyA9IG5ldyBDb2xvclsyXTsKLQkJLy8gaW50IFtdIHBlcmNlbnQgPSBuZXcgaW50WzFdOwotCQkvLyBib29sZWFuIHZlcnRpY2FsOwotCi0JCS8vIGlmIChpc0FjdGl2ZSgpKXsKLQkJLy8gICAgICAgIAkKLQkJLy8gQ1RhYkl0ZW0gaXRlbSA9IGdldFBhbmVGb2xkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJLy8gaWYoaXRlbSAhPSBudWxsICYmICFnZXRQYXJ0Rm9yVGFiKGl0ZW0pLmlzQnVzeSgpKXsKLQkJLy8gRm9udCB0YWJGb250ID0KLQkJLy8gZm9udFJlZ2lzdHJ5LmdldChJV29ya2JlbmNoVGhlbWVDb25zdGFudHMuVEFCX1RFWFRfRk9OVCk7Ci0JCS8vIC8vIGl0ZW0uc2V0Rm9udCh0YWJGb250KTsKLQkJLy8gfQotCQkvLyAgICAgICAgICAgIAotCQkvLyBmZ0NvbG9yID0KLQkJLy8gY29sb3JSZWdpc3RyeS5nZXQoSVdvcmtiZW5jaFRoZW1lQ29uc3RhbnRzLkFDVElWRV9UQUJfVEVYVF9DT0xPUik7Ci0JCS8vIGJnQ29sb3JzWzBdID0KLQkJLy8gY29sb3JSZWdpc3RyeS5nZXQoSVdvcmtiZW5jaFRoZW1lQ29uc3RhbnRzLkFDVElWRV9UQUJfQkdfU1RBUlQpOwotCQkvLyBiZ0NvbG9yc1sxXSA9Ci0JCS8vIGNvbG9yUmVnaXN0cnkuZ2V0KElXb3JrYmVuY2hUaGVtZUNvbnN0YW50cy5BQ1RJVkVfVEFCX0JHX0VORCk7Ci0JCS8vIHBlcmNlbnRbMF0gPQotCQkvLyBjdXJyZW50VGhlbWUuZ2V0SW50KElXb3JrYmVuY2hUaGVtZUNvbnN0YW50cy5BQ1RJVkVfVEFCX1BFUkNFTlQpOwotCQkvLyB2ZXJ0aWNhbCA9Ci0JCS8vIGN1cnJlbnRUaGVtZS5nZXRCb29sZWFuKElXb3JrYmVuY2hUaGVtZUNvbnN0YW50cy5BQ1RJVkVfVEFCX1ZFUlRJQ0FMKTsKLQkJLy8gfSBlbHNlIHsKLQkJLy8gZmdDb2xvciA9Ci0JCS8vIGNvbG9yUmVnaXN0cnkuZ2V0KElXb3JrYmVuY2hUaGVtZUNvbnN0YW50cy5JTkFDVElWRV9UQUJfVEVYVF9DT0xPUik7Ci0JCS8vIGJnQ29sb3JzWzBdID0KLQkJLy8gY29sb3JSZWdpc3RyeS5nZXQoSVdvcmtiZW5jaFRoZW1lQ29uc3RhbnRzLklOQUNUSVZFX1RBQl9CR19TVEFSVCk7Ci0JCS8vIGJnQ29sb3JzWzFdID0KLQkJLy8gY29sb3JSZWdpc3RyeS5nZXQoSVdvcmtiZW5jaFRoZW1lQ29uc3RhbnRzLklOQUNUSVZFX1RBQl9CR19FTkQpOwotCQkvLyBwZXJjZW50WzBdID0KLQkJLy8gY3VycmVudFRoZW1lLmdldEludChJV29ya2JlbmNoVGhlbWVDb25zdGFudHMuSU5BQ1RJVkVfVEFCX1BFUkNFTlQpOwotCQkvLyB2ZXJ0aWNhbCA9Ci0JCS8vIGN1cnJlbnRUaGVtZS5nZXRCb29sZWFuKElXb3JrYmVuY2hUaGVtZUNvbnN0YW50cy5JTkFDVElWRV9UQUJfVkVSVElDQUwpOwotCQkvLyB9Ci0JCS8vICAgICAgCi0JCS8vCQkKLQkJLy8gZHJhd0dyYWRpZW50KGZnQ29sb3IsIGJnQ29sb3JzLCBiZ1BlcmNlbnRzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3MgdGhlIGFwcGxpY2FibGUgZ3JhZGllbnQgb24gdGhlIHRpdGxlIGFyZWEKLQkgKiAKLQkgKiBAcGFyYW0gZmdDb2xvcgotCSAqIEBwYXJhbSBiZ0NvbG9ycwotCSAqIEBwYXJhbSBwZXJjZW50YWdlcwotCSAqIEBwYXJhbSB2ZXJ0aWNhbAotCSAqLwotCXB1YmxpYyB2b2lkIGRyYXdHcmFkaWVudChDb2xvciBmZ0NvbG9yLCBDb2xvcltdIGJnQ29sb3JzLAotCQkJaW50W10gcGVyY2VudGFnZXMsIGJvb2xlYW4gdmVydGljYWwpIHsKLQkJLy8gcGFuZUZvbGRlci5zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKGZnQ29sb3IpOwotCQkvLyBwYW5lRm9sZGVyLnNldFNlbGVjdGlvbkJhY2tncm91bmQoYmdDb2xvcnMsIHBlcmNlbnRhZ2VzLCB2ZXJ0aWNhbCk7Ci0KLQkJaWYgKHRpdGxlTGFiZWwgPT0gbnVsbCB8fCB2aWV3VG9vbEJhciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRpdGxlTGFiZWwuc2V0QmFja2dyb3VuZChiZ0NvbG9ycywgcGVyY2VudGFnZXMsIHZlcnRpY2FsKTsKLQkJdGl0bGVMYWJlbC5zZXRGb3JlZ3JvdW5kKGZnQ29sb3IpOwotCi0JCXRpdGxlTGFiZWwudXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiBhY3RpdmVTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNpemUgb2YgYSBwYWdlIGluIHRoZSBmb2xkZXIuCi0JICogCi0JICogVE9ETzogS2ltIGhlcmUuLi5JIGhhZCB0byBtYWtlIHRoaXMgcHVibGljIHNvIHRoYXQgdGhlIHdoZW4gdGhlIGZvbnQgd2FzCi0JICogdXBkYXRlZCB2aWEgdGhlIGNvbG9yIHNjaGVtZSBzZXJ2aWNlIGl0IGNvdWxkIHJlbGF5b3V0IHRoZQotCSAqIHByZXNlbnRhdGlvbi4uLiBjYWxsaW5nIGNvbnRyb2wuZ2V0TGF5b3V0KCkgZG9lc24ndCBkbyB0aGUgdHJpY2suCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJvbFNpemUoKSB7Ci0JCS8vIFNldCB1cCB0aGUgdG9wLXJpZ2h0IGNvbnRyb2xzCi0JCS8vIExpc3QgdG9wUmlnaHQgPSBuZXcgQXJyYXlMaXN0KDMpOwotCi0JCWlmIChjdXJyZW50ICE9IG51bGwpIHsKLQkJCXBhbmVGb2xkZXIuc2V0VG9wTGVmdCh0aXRsZUxhYmVsKTsKLQkJCXRpdGxlTGFiZWwuc2V0VGV4dChjdXJyZW50LmdldFRpdGxlKCkpOwotCQkJdGl0bGVMYWJlbC5zZXRJbWFnZShjdXJyZW50LmdldFRpdGxlSW1hZ2UoKSk7Ci0JCQl0aXRsZUxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0KLQkJCS8vIHNldCB0b29sdGlwIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc1MTMpCi0JCQlTdHJpbmcgdG9vbFRpcFRleHQgPSBjdXJyZW50LmdldFRpdGxlVG9vbFRpcCgpOwotCQkJdGl0bGVMYWJlbC5zZXRUb29sVGlwVGV4dCh0b29sVGlwVGV4dAotCQkJCQkuZXF1YWxzKFV0aWwuWkVST19MRU5HVEhfU1RSSU5HKSA/IG51bGwgOiB0b29sVGlwVGV4dCk7Ci0JCQkKLQkJfQotCi0JCUNvbnRyb2wgY3VycmVudFRvb2xiYXIgPSBnZXRDdXJyZW50VG9vbGJhcigpOwotCQlwYW5lRm9sZGVyLnNldFRvcENlbnRlcihjdXJyZW50VG9vbGJhcik7Ci0KLQkJSVBhcnRNZW51IHBhcnRNZW51ID0gZ2V0UGFydE1lbnUoKTsKLQotCQlpZiAocGFydE1lbnUgIT0gbnVsbCkgewotCQkJcHVsbERvd25CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXB1bGxEb3duQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCXBhbmVGb2xkZXIuc2V0VG9wUmlnaHQodmlld1Rvb2xCYXIpOwotCQl2aWV3VG9vbEJhci5zZXRWaXNpYmxlKHRydWUpOwotCi0JCXBhbmVGb2xkZXIubGF5b3V0KHRydWUpOwotCi0JCWlmIChjdXJyZW50ICE9IG51bGwpIHsKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcGFuZUZvbGRlci5nZXRDbGllbnRBcmVhKCk7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gcGFuZUZvbGRlci5nZXRDb250cm9sKCkuZ2V0Qm91bmRzKCk7Ci0JCQljbGllbnRBcmVhLnggKz0gYm91bmRzLng7Ci0JCQljbGllbnRBcmVhLnkgKz0gYm91bmRzLnk7Ci0KLQkJCWN1cnJlbnQuc2V0Qm91bmRzKGNsaWVudEFyZWEpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJUGFydE1lbnUgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCwgb3IgbnVsbCBpZiB0aGUKLQkgKiBjdXJyZW50IHBhcnQgZG9lcyBub3QgaGF2ZSBhIG1lbnUuCi0JICogCi0JICogQHJldHVybiB0aGUgSVBhcnRNZW51IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhcnQgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHJvdGVjdGVkIElQYXJ0TWVudSBnZXRQYXJ0TWVudSgpIHsKLQkJSVByZXNlbnRhYmxlUGFydCBwYXJ0ID0gZ2V0Q3VycmVudFBhcnQoKTsKLQkJaWYgKHBhcnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gcGFydC5nZXRNZW51KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5za2lucy5QcmVzZW50YXRpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gcmVtb3ZlIHNoZWxsIGxpc3RlbmVyCi0JCXBhbmVGb2xkZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkucmVtb3ZlU2hlbGxMaXN0ZW5lcihzaGVsbExpc3RlbmVyKTsKLQotCQlQcmVzZW50YXRpb25VdGlsLnJlbW92ZURyYWdMaXN0ZW5lcihwYW5lRm9sZGVyLmdldENvbnRyb2woKSwKLQkJCQlkcmFnTGlzdGVuZXIpOwotCQlQcmVzZW50YXRpb25VdGlsLnJlbW92ZURyYWdMaXN0ZW5lcih0aXRsZUxhYmVsLCBkcmFnTGlzdGVuZXIpOwotCi0JCXN5c3RlbU1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJc3lzdGVtTWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCXBhbmVGb2xkZXIuZ2V0Q29udHJvbCgpLmRpc3Bvc2UoKTsKLQkJcGFuZUZvbGRlciA9IG51bGw7Ci0KLQkJdGl0bGVMYWJlbC5kaXNwb3NlKCk7Ci0JCXRpdGxlTGFiZWwgPSBudWxsOwotCi0JCXZpZXdUb29sQmFyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnNraW5zLlByZXNlbnRhdGlvbiNzZXRBY3RpdmUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmUoYm9vbGVhbiBpc0FjdGl2ZSkgewotCQlhY3RpdmVTdGF0ZSA9IGlzQWN0aXZlOwotCQl1cGRhdGVHcmFkaWVudCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB3aW5kb3cncyBzaGVsbCBpcyBhY3RpdmF0ZWQKLQkgKi8KLQkvKiBwYWNrYWdlICovYm9vbGVhbiBnZXRTaGVsbEFjdGl2YXRlZCgpIHsKLQkJcmV0dXJuIHNoZWxsQWN0aXZlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvcCBsZXZlbCB3aW5kb3cuCi0JICovCi0JcHVibGljIFdpbmRvdyBnZXRXaW5kb3coKSB7Ci0JCUNvbnRyb2wgY3RybCA9IGdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwgIT0gbnVsbCkgewotCQkJT2JqZWN0IGRhdGEgPSBjdHJsLmdldFNoZWxsKCkuZ2V0RGF0YSgpOwotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBXaW5kb3cpCi0JCQkJcmV0dXJuIChXaW5kb3cpIGRhdGE7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBDVGFiSXRlbSBjcmVhdGVQYXJ0VGFiKElQcmVzZW50YWJsZVBhcnQgcGFydCwgaW50IHRhYkluZGV4KSB7Ci0JCUNUYWJJdGVtIHRhYkl0ZW07Ci0KLQkJaW50IHN0eWxlID0gU1dULk5PTkU7Ci0KLQkJaWYgKGdldFNpdGUoKS5pc0Nsb3NlYWJsZShwYXJ0KSkKLQkJCXN0eWxlIHw9IFNXVC5DTE9TRTsKLQotCQl0YWJJdGVtID0gcGFuZUZvbGRlci5jcmVhdGVJdGVtKHN0eWxlLCB0YWJJbmRleCk7Ci0KLQkJdGFiSXRlbS5zZXREYXRhKFRBQl9EQVRBLCBwYXJ0KTsKLQotCQlwYXJ0LmFkZFByb3BlcnR5TGlzdGVuZXIoY2hpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGFiSXRlbS5hZGREaXNwb3NlTGlzdGVuZXIodGFiRGlzcG9zZUxpc3RlbmVyKTsKLQotCQlpbml0VGFiKHRhYkl0ZW0sIHBhcnQpOwotCi0JCXJldHVybiB0YWJJdGVtOwotCX0KLQotCS8vIENyZWF0ZSBhIGNsb3NlIGJ1dHRvbiBpbiB0aGUgdGl0bGUgYmFyIGZvciB0aGUgYXJndW1lbnQgcGFydCAoaWYgbmVlZGVkKS4KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2xvc2VCdXR0b24oKSB7Ci0JCS8vIHJlbW92ZSB0aGUgY2xvc2UgYnV0dG9uIGlmIG5lZWRlZAotCQlpZiAoY3VycmVudCA9PSBudWxsIHx8ICFnZXRTaXRlKCkuaXNDbG9zZWFibGUoY3VycmVudCkpIHsKLQkJCWlmIChjbG9zZUJ1dHRvbiAhPSBudWxsKSB7Ci0JCQkJY2xvc2VCdXR0b24uZGlzcG9zZSgpOwotCQkJCWNsb3NlQnV0dG9uID0gbnVsbDsKLQotCQkJCXBhbmVGb2xkZXIuZmx1c2goKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGEgY2xvc2UgYnV0dG9uIGlzIG5lZWRlZCwgc28gaWYgaXRzIGFscmVhZHkgdGhlcmUsIHdlJ3JlIGRvbmUKLQkJaWYgKGNsb3NlQnV0dG9uICE9IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gb3RoZXJ3aXNlIGNyZWF0ZSBpdAotCQljbG9zZUJ1dHRvbiA9IG5ldyBUb29sSXRlbSh2aWV3VG9vbEJhciwgU1dULlBVU0gpOwotCQljbG9zZUJ1dHRvbi5zZXREaXNhYmxlZEltYWdlKG51bGwpOwotCQljbG9zZUJ1dHRvbi5zZXRJbWFnZShXb3JrYmVuY2hJbWFnZXMKLQkJCQkuZ2V0SW1hZ2UoSVdvcmtiZW5jaEdyYXBoaWNDb25zdGFudHMuSU1HX0xDTF9DTE9TRV9WSUVXKSk7Ci0JCWNsb3NlQnV0dG9uLnNldFRvb2xUaXBUZXh0KFIyMVByZXNlbnRhdGlvbk1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiQmFzaWNTdGFja1ByZXNlbnRhdGlvbi5jbG9zZS50b29sdGlwIikpOyAvLyROT04tTkxTLTEkCi0JCWNsb3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNsb3NlKGdldEN1cnJlbnQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXBhbmVGb2xkZXIuZmx1c2goKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBhIHRhYiBmb3IgdGhlIGdpdmVuIHBhcnQuIFNldHMgdGhlIHRleHQsIGljb24sIHRvb2wgdGlwLCBldGMuCi0JICogVGhpcyB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW5ldmVyIGEgcmVsZXZhbnQgcHJvcGVydHkgY2hhbmdlcyBpbiB0aGUgcGFydAotCSAqIHRvIHJlZmxlY3QgdGhvc2UgY2hhbmdlcyBpbiB0aGUgdGFiLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBjaGFuZ2UKLQkgKiB0aGUgYXBwZWFyYW5jZSBvZiB0YWJzIGZvciBhIHBhcnRpY3VsYXIgcGFydC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFiSXRlbQotCSAqICAgICAgICAgICAgdGFiIGZvciB0aGUgcGFydAotCSAqIEBwYXJhbSBwYXJ0Ci0JICogICAgICAgICAgICB0aGUgcGFydCBiZWluZyBkaXNwbGF5ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0VGFiKENUYWJJdGVtIHRhYkl0ZW0sIElQcmVzZW50YWJsZVBhcnQgcGFydCkgewotCQl0YWJJdGVtLnNldFRleHQocGFydC5nZXROYW1lKCkpOwotCi0JCS8vIHRhYkl0ZW0uc2V0SW1hZ2UocGFydC5nZXRUaXRsZUltYWdlKCkpOwotCi0JCS8vIFN0cmluZyB0b29sVGlwVGV4dCA9IHBhcnQuZ2V0VGl0bGVUb29sVGlwKCk7Ci0JCS8vIGlmICghdG9vbFRpcFRleHQuZXF1YWxzKFV0aWwuWkVST19MRU5HVEhfU1RSSU5HKSkgewotCQkvLyB0YWJJdGVtLnNldFRvb2xUaXBUZXh0KHRvb2xUaXBUZXh0KTsKLQkJLy8gfQotCi0JCS8vIEZvbnRSZWdpc3RyeSByZWdpc3RyeSA9Ci0JCS8vIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuCi0JCS8vIGdldFRoZW1lTWFuYWdlcigpLmdldEN1cnJlbnRUaGVtZSgpLgotCQkvLyBnZXRGb250UmVnaXN0cnkoKTsKLQkJLy8JCQotCQkvLyBpZihwYXJ0LmlzQnVzeSgpKQotCQkvLyB0YWJJdGVtLnNldEZvbnQocmVnaXN0cnkuZ2V0SXRhbGljKElXb3JrYmVuY2hUaGVtZUNvbnN0YW50cy5UQUJfVEVYVF9GT05UKSk7Ci0JCS8vIGVsc2V7Ci0JCS8vIHRhYkl0ZW0uc2V0Rm9udChyZWdpc3RyeS5nZXQoSVdvcmtiZW5jaFRoZW1lQ29uc3RhbnRzLlRBQl9URVhUX0ZPTlQpKTsKLQkJLy8gfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5za2lucy5TdGFja1ByZXNlbnRhdGlvbiNhZGRQYXJ0KG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnNraW5zLklQcmVzZW50YWJsZVBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5za2lucy5JUHJlc2VudGFibGVQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhcnQoSVByZXNlbnRhYmxlUGFydCBuZXdQYXJ0LCBPYmplY3QgY29va2llKSB7Ci0KLQkJaW50IGlkeDsKLQotCQlpZiAoY29va2llIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJaWR4ID0gKChJbnRlZ2VyKSBjb29raWUpLmludFZhbHVlKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBTZWxlY3QgYSBsb2NhdGlvbiBmb3IgbmV3bHkgaW5zZXJ0ZWQgcGFydHMKLQkJCWlkeCA9IHBhbmVGb2xkZXIuZ2V0SXRlbUNvdW50KCk7Ci0JCX0KLQotCQlhZGRQYXJ0KG5ld1BhcnQsIGlkeCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcHJlc2VudGFibGUgcGFydCB0byB0aGlzIHByZXNlbnRhdGlvbiBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0JICogRG9lcyBub3RoaW5nIGlmIGEgdGFiIGFscmVhZHkgZXhpc3RzIGZvciB0aGUgZ2l2ZW4gcGFydC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3UGFydAotCSAqIEBwYXJhbSBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhcnQoSVByZXNlbnRhYmxlUGFydCBuZXdQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGEgdGFiIGZvciB0aGlzIHBhcnQsIGRvIG5vdGhpbmcKLQkJaWYgKGdldFRhYihuZXdQYXJ0KSAhPSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY3JlYXRlUGFydFRhYihuZXdQYXJ0LCBpbmRleCk7Ci0KLQkJc2V0Q29udHJvbFNpemUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnNraW5zLlN0YWNrUHJlc2VudGF0aW9uI3JlbW92ZVBhcnQob3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuc2tpbnMuSVByZXNlbnRhYmxlUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQYXJ0KElQcmVzZW50YWJsZVBhcnQgb2xkUGFydCkgewotCQlpZiAoY3VycmVudCA9PSBvbGRQYXJ0KSB7Ci0JCQl0aXRsZUxhYmVsLnNldEltYWdlKG51bGwpOwotCQkJY3VycmVudCA9IG51bGw7Ci0JCX0KLQotCQlDVGFiSXRlbSBpdGVtID0gZ2V0VGFiKG9sZFBhcnQpOwotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJb2xkUGFydC5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQlpdGVtLmRpc3Bvc2UoKTsKLQotCQkvLyBMYXlvdXQgdGhlIGZvbGRlciBhZ2FpbiBpbiBjYXNlIHRoZXJlIGlzIG9ubHkgb25lIGl0ZW0KLQkJc2V0Q29udHJvbFNpemUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnNraW5zLlN0YWNrUHJlc2VudGF0aW9uI3NlbGVjdFBhcnQob3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuc2tpbnMuSVByZXNlbnRhYmxlUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RQYXJ0KElQcmVzZW50YWJsZVBhcnQgdG9TZWxlY3QpIHsKLQkJaWYgKHRvU2VsZWN0ID09IGN1cnJlbnQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlQcmVzZW50YWJsZVBhcnQgb2xkUGFydCA9IGN1cnJlbnQ7Ci0KLQkJY3VycmVudCA9IHRvU2VsZWN0OwotCi0JCWlmIChjdXJyZW50ICE9IG51bGwpIHsKLQkJCXBhbmVGb2xkZXIuc2V0U2VsZWN0aW9uKGluZGV4T2YoY3VycmVudCkpOwotCQkJY3VycmVudC5zZXRWaXNpYmxlKHRydWUpOwotCQkJdXBkYXRlQ2xvc2VCdXR0b24oKTsKLQkJCXNldENvbnRyb2xTaXplKCk7Ci0JCX0KLQotCQlpZiAob2xkUGFydCAhPSBudWxsKSB7Ci0JCQlvbGRQYXJ0LnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHVibGljIElQcmVzZW50YWJsZVBhcnQgZ2V0Q3VycmVudFBhcnQoKSB7Ci0JCXJldHVybiBjdXJyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuc2tpbnMuUHJlc2VudGF0aW9uI3NldEJvdW5kcyhvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvdW5kcyhSZWN0YW5nbGUgYm91bmRzKSB7Ci0JCWlmIChnZXRTaXRlKCkuZ2V0U3RhdGUoKSA9PSBJU3RhY2tQcmVzZW50YXRpb25TaXRlLlNUQVRFX01JTklNSVpFRCkgewotCQkJYm91bmRzID0gR2VvbWV0cnkuY29weShib3VuZHMpOwotCQkJYm91bmRzLmhlaWdodCA9IGNvbXB1dGVQcmVmZXJyZWRTaXplKGZhbHNlLCBJbnRlZ2VyLk1BWF9WQUxVRSwKLQkJCQkJYm91bmRzLndpZHRoLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCX0KLQotCQlwYW5lRm9sZGVyLmdldENvbnRyb2woKS5zZXRCb3VuZHMoYm91bmRzKTsKLQkJc2V0Q29udHJvbFNpemUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnNraW5zLlByZXNlbnRhdGlvbiNjb21wdXRlTWluaW11bVNpemUoKQotCSAqLwotCXB1YmxpYyBQb2ludCBjb21wdXRlTWluaW11bVNpemUoKSB7Ci0JCVBvaW50IHJlc3VsdCA9IEdlb21ldHJ5LmdldFNpemUocGFuZUZvbGRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKSk7Ci0KLQkJcmVzdWx0LnggKz0gMTAwOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5za2lucy5QcmVzZW50YXRpb24jc2V0VmlzaWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgewotCQkJY3VycmVudC5zZXRWaXNpYmxlKGlzVmlzaWJsZSk7Ci0JCX0KLQkJcGFuZUZvbGRlci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShpc1Zpc2libGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuc2tpbnMuUHJlc2VudGF0aW9uI3NldFN0YXRlKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0ZShpbnQgc3RhdGUpIHsKLQkJLy8gdGFiRm9sZGVyLnNldFN0YXRlKHN0YXRlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnNraW5zLlByZXNlbnRhdGlvbiNnZXRTeXN0ZW1NZW51TWFuYWdlcigpCi0JICovCi0JcHVibGljIElNZW51TWFuYWdlciBnZXRTeXN0ZW1NZW51TWFuYWdlcigpIHsKLQkJcmV0dXJuIHN5c3RlbU1lbnVNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwb2ludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dTeXN0ZW1NZW51KFBvaW50IHBvaW50KSB7Ci0JCU1lbnUgYU1lbnUgPSBzeXN0ZW1NZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShwYW5lRm9sZGVyCi0JCQkJLmdldENvbnRyb2woKS5nZXRQYXJlbnQoKSk7Ci0JCXN5c3RlbU1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLQkJYU1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSk7Ci0JCWFNZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5za2lucy5QcmVzZW50YXRpb24jZ2V0Q29udHJvbCgpCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHBhbmVGb2xkZXIuZ2V0Q29udHJvbCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuc2tpbnMuU3RhY2tQcmVzZW50YXRpb24jZHJhZ092ZXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCkKLQkgKi8KLQlwdWJsaWMgU3RhY2tEcm9wUmVzdWx0IGRyYWdPdmVyKENvbnRyb2wgY3VycmVudENvbnRyb2wsIFBvaW50IGxvY2F0aW9uKSB7Ci0KLQkJLy8gRGV0ZXJtaW5lIHdoaWNoIHRhYiB3ZSdyZSBjdXJyZW50bHkgZHJhZ2dpbmcgb3ZlcgotCQlQb2ludCBsb2NhbFBvcyA9IHBhbmVGb2xkZXIuZ2V0Q29udHJvbCgpLnRvQ29udHJvbChsb2NhdGlvbik7Ci0JCWZpbmFsIENUYWJJdGVtIHRhYlVuZGVyUG9pbnRlciA9IHBhbmVGb2xkZXIuZ2V0SXRlbShsb2NhbFBvcyk7Ci0KLQkJLy8gVGhpcyBkcm9wIHRhcmdldCBvbmx5IGRlYWxzIHdpdGggdGFicy4uLiBpZiB3ZSdyZSBub3QgZHJhZ2dpbmcgb3ZlcgotCQkvLyBhIHRhYiwgZXhpdC4KLQkJaWYgKHRhYlVuZGVyUG9pbnRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gd29ya2Fyb3VuZCB3aGVuIGxlZnQgdGFiIGlzIGRyYWdnZWQgb3ZlciBuZXh0Ci0JCWludCBkcmFnT3ZlckluZGV4ID0gcGFuZUZvbGRlci5pbmRleE9mKHRhYlVuZGVyUG9pbnRlcik7Ci0KLQkJcmV0dXJuIG5ldyBTdGFja0Ryb3BSZXN1bHQoR2VvbWV0cnkudG9EaXNwbGF5KHBhbmVGb2xkZXIuZ2V0Q29udHJvbCgpLAotCQkJCXRhYlVuZGVyUG9pbnRlci5nZXRCb3VuZHMoKSksIG5ldyBJbnRlZ2VyKGRyYWdPdmVySW5kZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b29sYmFyIGNvbnRyb2wgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCwgb3IgbnVsbCBpZgotCSAqIG5vbmUgKG5vdCBhbGwgcGFydHMgaGF2ZSBhIHRvb2xiYXIpLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdG9vbGJhciBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXRDdXJyZW50VG9vbGJhcigpIHsKLQkJSVByZXNlbnRhYmxlUGFydCBwYXJ0ID0gZ2V0Q3VycmVudFBhcnQoKTsKLQkJaWYgKHBhcnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gcGFydC5nZXRUb29sQmFyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLlN0YWNrUHJlc2VudGF0aW9uI3Nob3dTeXN0ZW1NZW51KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93U3lzdGVtTWVudSgpIHsKLQkJSVByZXNlbnRhYmxlUGFydCBwYXJ0ID0gZ2V0Q3VycmVudFBhcnQoKTsKLQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IERyYWdVdGlsLmdldERpc3BsYXlCb3VuZHMocGFuZUZvbGRlcgotCQkJCQkuZ2V0Q29udHJvbCgpKTsKLQotCQkJaW50IGlkeCA9IHBhbmVGb2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCWlmIChpZHggPiAtMSkgewotCQkJCUNUYWJJdGVtIGl0ZW0gPSBwYW5lRm9sZGVyLmdldEl0ZW0oaWR4KTsKLQkJCQlSZWN0YW5nbGUgaXRlbUJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0KLQkJCQlib3VuZHMueCArPSBpdGVtQm91bmRzLng7Ci0JCQkJYm91bmRzLnkgKz0gaXRlbUJvdW5kcy55OwotCQkJfQotCi0JCQlQb2ludCBsb2NhdGlvbiA9IG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkKLQkJCQkJKyBwYW5lRm9sZGVyLmdldFRhYkhlaWdodCgpKTsKLQkJCXNob3dTeXN0ZW1NZW51KGxvY2F0aW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5TdGFja1ByZXNlbnRhdGlvbiNnZXRUYWJMaXN0KElQcmVzZW50YWJsZVBhcnQpCi0JICovCi0JcHVibGljIENvbnRyb2xbXSBnZXRUYWJMaXN0KElQcmVzZW50YWJsZVBhcnQgcGFydCkgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHBhbmVGb2xkZXIuZ2V0VGFiUG9zaXRpb24oKSA9PSBTV1QuQk9UVE9NKSB7Ci0JCQlpZiAocGFydC5nZXRUb29sQmFyKCkgIT0gbnVsbCkKLQkJCQlsaXN0LmFkZChwYXJ0LmdldFRvb2xCYXIoKSk7Ci0JCQlpZiAocGFydC5nZXRDb250cm9sKCkgIT0gbnVsbCkKLQkJCQlsaXN0LmFkZChwYXJ0LmdldENvbnRyb2woKSk7Ci0JCQlpZiAoZ2V0UGFuZUZvbGRlcigpICE9IG51bGwpCi0JCQkJbGlzdC5hZGQoZ2V0UGFuZUZvbGRlcigpLmdldENvbnRyb2woKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFuZUZvbGRlcigpICE9IG51bGwpCi0JCQkJbGlzdC5hZGQoZ2V0UGFuZUZvbGRlcigpLmdldENvbnRyb2woKSk7Ci0JCQlpZiAocGFydC5nZXRUb29sQmFyKCkgIT0gbnVsbCkKLQkJCQlsaXN0LmFkZChwYXJ0LmdldFRvb2xCYXIoKSk7Ci0JCQlpZiAocGFydC5nZXRDb250cm9sKCkgIT0gbnVsbCkKLQkJCQlsaXN0LmFkZChwYXJ0LmdldENvbnRyb2woKSk7Ci0JCX0KLQkJcmV0dXJuIChDb250cm9sW10pIGxpc3QudG9BcnJheShuZXcgQ29udHJvbFtsaXN0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNob3dMaXN0KFNoZWxsIHBhcmVudFNoZWxsLCBpbnQgeCwgaW50IHkpIHsKLQkJLy8gZmluYWwgUjIxUGFuZUZvbGRlciB0YWJGb2xkZXIgPSBnZXRUYWJGb2xkZXIoKTsKLQkJLy8KLQkJLy8gaW50IHNoZWxsU3R5bGUgPSBTV1QuUkVTSVpFIHwgU1dULk9OX1RPUCB8IFNXVC5OT19UUklNOwotCQkvLyBpbnQgdGFibGVTdHlsZSA9IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTDsKLQkJLy8gZmluYWwgQmFzaWNTdGFja0xpc3QgZWRpdG9yTGlzdCA9IG5ldwotCQkvLyBCYXNpY1N0YWNrTGlzdCh0YWJGb2xkZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0JCS8vIHNoZWxsU3R5bGUsIHRhYmxlU3R5bGUpOwotCQkvLyBlZGl0b3JMaXN0LnNldElucHV0KHRoaXMpOwotCQkvLyBQb2ludCBzaXplID0gZWRpdG9yTGlzdC5jb21wdXRlU2l6ZUhpbnQoKTsKLQkJLy8gICAgICAgIAotCQkvLyBSZWN0YW5nbGUgYm91bmRzID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCk7Ci0JCS8vIGlmICh4ICsgc2l6ZS54ID4gYm91bmRzLndpZHRoKSB4ID0gYm91bmRzLndpZHRoIC0gc2l6ZS54OwotCQkvLyBpZiAoeSArIHNpemUueSA+IGJvdW5kcy5oZWlnaHQpIHkgPSBib3VuZHMuaGVpZ2h0IC0gc2l6ZS55OwotCQkvLyBlZGl0b3JMaXN0LnNldExvY2F0aW9uKG5ldyBQb2ludCh4LCB5KSk7Ci0JCS8vIGVkaXRvckxpc3Quc2V0VmlzaWJsZSh0cnVlKTsKLQkJLy8gZWRpdG9yTGlzdC5zZXRGb2N1cygpOwotCQkvLyBlZGl0b3JMaXN0LmdldFRhYmxlVmlld2VyKCkuZ2V0VGFibGUoKS5nZXRTaGVsbCgpLmFkZExpc3RlbmVyKAotCQkvLyBTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkvLwotCQkvLyBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkvLyBlZGl0b3JMaXN0LnNldFZpc2libGUoZmFsc2UpOwotCQkvLyB9Ci0JCS8vIH0pOwotCX0KLQotCS8qCi0JICogU2hvd3MgdGhlIGxpc3Qgb2YgdGFicyBhdCB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBlZGl0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93TGlzdERlZmF1bHRMb2NhdGlvbigpIHsKLQkJUjIxUGFuZUZvbGRlciB0YWJGb2xkZXIgPSBnZXRQYW5lRm9sZGVyKCk7Ci0JCVNoZWxsIHNoZWxsID0gdGFiRm9sZGVyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHRhYkZvbGRlci5nZXRDbGllbnRBcmVhKCk7Ci0JCVBvaW50IGxvY2F0aW9uID0gdGFiRm9sZGVyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkubWFwKAotCQkJCXRhYkZvbGRlci5nZXRDb250cm9sKCksIG51bGwsIGNsaWVudEFyZWEueCwgY2xpZW50QXJlYS55KTsKLQkJc2hvd0xpc3Qoc2hlbGwsIGxvY2F0aW9uLngsIGxvY2F0aW9uLnkpOwotCX0KLQotCXZvaWQgc2V0U2VsZWN0aW9uKENUYWJJdGVtIHRhYkl0ZW0pIHsKLQkJZ2V0U2l0ZSgpLnNlbGVjdFBhcnQoZ2V0UGFydEZvclRhYih0YWJJdGVtKSk7Ci0JfQotCi0Jdm9pZCBjbG9zZShJUHJlc2VudGFibGVQYXJ0IHByZXNlbnRhYmxlUGFydCkgewotCQlnZXRTaXRlKCkuY2xvc2UobmV3IElQcmVzZW50YWJsZVBhcnRbXSB7IHByZXNlbnRhYmxlUGFydCB9KTsKLQl9Ci0KLQlJbWFnZSBnZXRMYWJlbEltYWdlKElQcmVzZW50YWJsZVBhcnQgcHJlc2VudGFibGVQYXJ0KSB7Ci0JCXJldHVybiBwcmVzZW50YWJsZVBhcnQuZ2V0VGl0bGVJbWFnZSgpOwotCX0KLQotCVN0cmluZyBnZXRMYWJlbFRleHQoSVByZXNlbnRhYmxlUGFydCBwcmVzZW50YWJsZVBhcnQsIGJvb2xlYW4gaW5jbHVkZVBhdGgpIHsKLQkJU3RyaW5nIHRpdGxlID0gcHJlc2VudGFibGVQYXJ0LmdldFRpdGxlKCkudHJpbSgpOwotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLlN0YWNrUHJlc2VudGF0aW9uI3NldEFjdGl2ZShpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlKGludCBuZXdTdGF0ZSkgewotCQlzZXRBY3RpdmUobmV3U3RhdGUgPT0gQVNfQUNUSVZFX0ZPQ1VTKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuU3RhY2tQcmVzZW50YXRpb24jcmVzdG9yZVN0YXRlKG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVByZXNlbnRhdGlvblNlcmlhbGl6ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JTWVtZW50bykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSVByZXNlbnRhdGlvblNlcmlhbGl6ZXIgc2VyaWFsaXplciwKLQkJCUlNZW1lbnRvIHNhdmVkU3RhdGUpIHsKLQkJSU1lbWVudG9bXSBwYXJ0cyA9IHNhdmVkU3RhdGUuZ2V0Q2hpbGRyZW4oSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfUEFSVCk7Ci0KLQkJZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgcGFydHMubGVuZ3RoOyBpZHgrKykgewotCQkJU3RyaW5nIGlkID0gcGFydHNbaWR4XS5nZXRTdHJpbmcoSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfSUQpOwotCi0JCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCUlQcmVzZW50YWJsZVBhcnQgcGFydCA9IHNlcmlhbGl6ZXIuZ2V0UGFydChpZCk7Ci0KLQkJCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJCWFkZFBhcnQocGFydCwgZ2V0UGFuZUZvbGRlcigpLmdldEl0ZW1Db3VudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuU3RhY2tQcmVzZW50YXRpb24jc2F2ZVN0YXRlKG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVByZXNlbnRhdGlvblNlcmlhbGl6ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JTWVtZW50bykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSVByZXNlbnRhdGlvblNlcmlhbGl6ZXIgY29udGV4dCwgSU1lbWVudG8gbWVtZW50bykgewotCQlzdXBlci5zYXZlU3RhdGUoY29udGV4dCwgbWVtZW50byk7Ci0KLQkJTGlzdCBwYXJ0cyA9IGdldFByZXNlbnRhYmxlUGFydHMoKTsKLQotCQlJdGVyYXRvciBpdGVyID0gcGFydHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJUHJlc2VudGFibGVQYXJ0IG5leHQgPSAoSVByZXNlbnRhYmxlUGFydCkgaXRlci5uZXh0KCk7Ci0KLQkJCUlNZW1lbnRvIGNoaWxkTWVtID0gbWVtZW50bwotCQkJCQkuY3JlYXRlQ2hpbGQoSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfUEFSVCk7Ci0JCQljaGlsZE1lbS5wdXRTdHJpbmcoSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfSUQsIGNvbnRleHQuZ2V0SWQobmV4dCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTGlzdCBvZiBJUHJlc2VudGFibGVQYXJ0IGN1cnJlbnRseSBpbiB0aGlzIHByZXNlbnRhdGlvbgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRQcmVzZW50YWJsZVBhcnRzKCkgewotCQlBc3NlcnQuaXNUcnVlKCFpc0Rpc3Bvc2VkKCkpOwotCi0JCUNUYWJJdGVtW10gaXRlbXMgPSBnZXRQYW5lRm9sZGVyKCkuZ2V0SXRlbXMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGl0ZW1zLmxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgZ2V0UGFuZUZvbGRlcigpLmdldEl0ZW1Db3VudCgpOyBpZHgrKykgewotCQkJcmVzdWx0LmFkZChnZXRQYXJ0Rm9yVGFiKGl0ZW1zW2lkeF0pKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9SMjFFZGl0b3JTdGFja1ByZXNlbnRhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9SMjFFZGl0b3JTdGFja1ByZXNlbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2NkN2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ByZXNlbnRhdGlvbnMvUjIxRWRpdG9yU3RhY2tQcmVzZW50YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5HZW9tZXRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kbmQuRHJhZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy5yMjEuUjIxQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMucjIxLlIyMVByZXNlbnRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMucjIxLndpZGdldHMuQ1RhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLnIyMS53aWRnZXRzLkNUYWJGb2xkZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLnIyMS53aWRnZXRzLkNUYWJGb2xkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLnIyMS53aWRnZXRzLkNUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVBhcnRNZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVByZXNlbnRhYmxlUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklQcmVzZW50YXRpb25TZXJpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVN0YWNrUHJlc2VudGF0aW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLlByZXNlbnRhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5TdGFja0Ryb3BSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5TdGFja1ByZXNlbnRhdGlvbjsKLQotLyoqCi0gKiBBIHN0YWNrIHByZXNlbnRhdGlvbiBmb3IgZWRpdG9ycyB1c2luZyBhIHdpZGdldCBzZXQgdGhhdCBpcyBjbG9zZSB0byB3aGF0IHdhcwotICogcHJvdmlkZWQgaW4gMi4xLgotICogPHA+Ci0gKiBFWFBFUklNRU5UQUwKLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgUjIxRWRpdG9yU3RhY2tQcmVzZW50YXRpb24gZXh0ZW5kcyBTdGFja1ByZXNlbnRhdGlvbiB7Ci0KLQkvKiogdGhlIHRhYiBmb2xkZXIgKi8KLQlwcml2YXRlIENUYWJGb2xkZXIgdGFiRm9sZGVyOwotCi0JLyoqIHRoZSBkcmFnIGxpc3RlbmVyICovCi0JcHJpdmF0ZSBMaXN0ZW5lciBkcmFnTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IGxvY2FsUG9zID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotCQkJQ1RhYkl0ZW0gdGFiVW5kZXJQb2ludGVyID0gdGFiRm9sZGVyLmdldEl0ZW0obG9jYWxQb3MpOwotCi0JCQlpZiAodGFiVW5kZXJQb2ludGVyID09IG51bGwpIHsKLQkJCQkvLyBkcmFnIHRoZSBlbnRpcmUgc3RhY2sKLQkJCQlpZiAoZ2V0U2l0ZSgpLmlzU3RhY2tNb3ZlYWJsZSgpKQotCQkJCQlnZXRTaXRlKCkuZHJhZ1N0YXJ0KHRhYkZvbGRlci50b0Rpc3BsYXkobG9jYWxQb3MpLCBmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlJUHJlc2VudGFibGVQYXJ0IHBhcnQgPSBnZXRQYXJ0Rm9yVGFiKHRhYlVuZGVyUG9pbnRlcik7Ci0KLQkJCWlmIChnZXRTaXRlKCkuaXNQYXJ0TW92ZWFibGUocGFydCkpIHsKLQkJCQkvLyBkcmFnIHRoZSBwYXJ0Ci0JCQkJZ2V0U2l0ZSgpLmRyYWdTdGFydChwYXJ0LCB0YWJGb2xkZXIudG9EaXNwbGF5KGxvY2FsUG9zKSwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKiB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGNsb3NlIHRoZSB0YWIgKi8KLQlwcml2YXRlIENUYWJGb2xkZXJMaXN0ZW5lciBjbG9zZUxpc3RlbmVyID0gbmV3IENUYWJGb2xkZXJMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBpdGVtQ2xvc2VkKENUYWJGb2xkZXJFdmVudCBlKSB7Ci0JCQlDVGFiSXRlbSBpdGVtID0gKENUYWJJdGVtKSBlLml0ZW07Ci0JCQlpZiAobnVsbCAhPSBpdGVtKSB7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7IC8vIG90aGVyd2lzZSB0YWIgaXMgYXV0byBkaXNwb3NlZCBvbiByZXR1cm4KLQkJCQlnZXRTaXRlKCkuY2xvc2UobmV3IElQcmVzZW50YWJsZVBhcnRbXSB7IGdldFBhcnRGb3JUYWIoaXRlbSkgfSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqIHRoZSBjdXJyZW50IHBhcnQgKi8KLQlwcml2YXRlIElQcmVzZW50YWJsZVBhcnQgY3VycmVudDsKLQotCS8qKiB0aGUgc3lzdGVtIG1lbnUgKi8KLQlwcml2YXRlIE1lbnVNYW5hZ2VyIHN5c3RlbU1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0KLQkvKiogdGhlIHNoYXJlZCBwcmVmZXJlbmNlIHN0b3JlICovCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUgPSBXb3JrYmVuY2hQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkvLyBkb24ndCByZXNldCB0aGlzIGR5bmFtaWNhbGx5LCBzbyBqdXN0IGtlZXAgdGhlIGluZm9ybWF0aW9uIHN0YXRpYy4KLQkvLyBzZWUgYnVnOgotCS8vIDc1NDIyIFtQcmVzZW50YXRpb25zXSBTd2l0Y2hpbmcgcHJlc2VudGF0aW9uIHRvIFIyMSBzd2l0Y2hlcyBpbW1lZGlhdGVseSwKLQkvLyBidXQgb25seSBwYXJ0aWFsbHkKLQlwcml2YXRlIHN0YXRpYyBpbnQgdGFiUG9zID0gcHJlZmVyZW5jZVN0b3JlCi0JCQkuZ2V0SW50KElQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9UQUJfUE9TSVRJT04pOwotCi0JLyoqIHRoZSB0YWIgaXRlbSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBwYXJ0ICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBQl9EQVRBID0gUjIxRWRpdG9yU3RhY2tQcmVzZW50YXRpb24uY2xhc3MKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5wYXJ0SWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogdGhlIG1vdXNlIGxpc3RlbmVyIGZvciBzZXR0aW5nIGZvY3VzICovCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIG1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VBZGFwdGVyKCkgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyI21vdXNlRG93bihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0JCQkJQ29udHJvbCBjdHJsID0gKENvbnRyb2wpIGUud2lkZ2V0OwotCi0JCQkJUG9pbnQgZ2xvYmFsUG9zID0gY3RybC50b0Rpc3BsYXkobmV3IFBvaW50KGUueCwgZS55KSk7Ci0KLQkJCQlDVGFiSXRlbSBuZXdJdGVtID0gdGFiRm9sZGVyLmdldEl0ZW0odGFiRm9sZGVyCi0JCQkJCQkudG9Db250cm9sKGdsb2JhbFBvcykpOwotCQkJCWlmIChuZXdJdGVtICE9IG51bGwpIHsKLQotCQkJCQkvLyBzaG93IG1lbnUgb3ZlciBpY29uCi0JCQkJCWlmICgoZS5idXR0b24gPT0gMSkgJiYgb3ZlckltYWdlKG5ld0l0ZW0sIGUueCkpIHsKLQkJCQkJCWdldFNpdGUoKS5zZWxlY3RQYXJ0KGdldFBhcnRGb3JUYWIobmV3SXRlbSkpOwotCQkJCQkJc2hvd1N5c3RlbU1lbnUoKTsKLQkJCQkJfQotCi0JCQkJCS8vIFBSIzFHREVaMjUgLSBJZiBzZWxlY3Rpb24gd2lsbCBjaGFuZ2UgaW4gbW91c2UgdXAgaWdub3JlCi0JCQkJCS8vIG1vdXNlIGRvd24uCi0JCQkJCUNUYWJJdGVtIG9sZEl0ZW0gPSB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChuZXdJdGVtICE9IG9sZEl0ZW0pCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gc2V0IGZvY3VzCi0JCQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgewotCQkJCQljdXJyZW50LnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlciNtb3VzZURvdWJsZUNsaWNrKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQlpZiAoZ2V0U2l0ZSgpLmdldFN0YXRlKCkgPT0gSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9NQVhJTUlaRUQpIHsKLQkJCQlnZXRTaXRlKCkuc2V0U3RhdGUoSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9SRVNUT1JFRCk7Ci0JCQl9IGVsc2UgewotCQkJCWdldFNpdGUoKS5zZXRTdGF0ZShJU3RhY2tQcmVzZW50YXRpb25TaXRlLlNUQVRFX01BWElNSVpFRCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgPGNvZGU+eDwvY29kZT4gaXMgb3ZlciB0aGUgdGFiIGl0ZW0gaW1hZ2UuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIDxjb2RlPng8L2NvZGU+IGlzIG92ZXIgdGhlIHRhYiBpdGVtIGltYWdlCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gb3ZlckltYWdlKENUYWJJdGVtIGl0ZW0sIGludCB4KSB7Ci0JCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGl0ZW0uZ2V0SW1hZ2UoKS5nZXRCb3VuZHMoKTsKLQkJcmV0dXJuIHggPCAoaXRlbS5nZXRCb3VuZHMoKS54ICsgaW1hZ2VCb3VuZHMueCArIGltYWdlQm91bmRzLndpZHRoKTsKLQl9Ci0KLQkvKiogdGhlIG1lbnUgbGlzdGVuZXIgZm9yIHNob3dpbmcgdGhlIG1lbnUgKi8KLQlwcml2YXRlIExpc3RlbmVyIG1lbnVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHBvcyA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLQkJCXNob3dTeXN0ZW1NZW51KHBvcyk7Ci0JCX0KLQl9OwotCi0JLyoqIHRoZSBzZWxlY3Rpb24gbGlzdGVuZXIgKi8KLQlwcml2YXRlIExpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCUlQcmVzZW50YWJsZVBhcnQgaXRlbSA9IGdldFBhcnRGb3JUYWIoKENUYWJJdGVtKSBlLml0ZW0pOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCkKLQkJCQlnZXRTaXRlKCkuc2VsZWN0UGFydChpdGVtKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIHJlc2l6ZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCXNldENvbnRyb2xTaXplKCk7Ci0JCX0KLQl9OwotCi0JLyoqIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZvciB0aGUgcGFydHMgKi8KLQlwcml2YXRlIElQcm9wZXJ0eUxpc3RlbmVyIGNoaWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BlcnR5KSB7Ci0JCQlpZiAoc291cmNlIGluc3RhbmNlb2YgSVByZXNlbnRhYmxlUGFydCkgewotCQkJCUlQcmVzZW50YWJsZVBhcnQgcGFydCA9IChJUHJlc2VudGFibGVQYXJ0KSBzb3VyY2U7Ci0JCQkJY2hpbGRQcm9wZXJ0eUNoYW5nZWQocGFydCwgcHJvcGVydHkpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKiBhIGRpc3Bvc2UgbGlzdGVuZXIgdG8gZG8gc29tZSBjbGVhbnVwcyB3aGVuIGEgdGFiIGlzIGRpc3Bvc2VkICovCi0JcHJpdmF0ZSBEaXNwb3NlTGlzdGVuZXIgdGFiRGlzcG9zZUxpc3RlbmVyID0gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgQ1RhYkl0ZW0pIHsKLQkJCQlDVGFiSXRlbSBpdGVtID0gKENUYWJJdGVtKSBlLndpZGdldDsKLQkJCQlJUHJlc2VudGFibGVQYXJ0IHBhcnQgPSBnZXRQYXJ0Rm9yVGFiKGl0ZW0pOwotCQkJCXBhcnQucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcihjaGlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKiB0aGUgc2hlbGwgbGlzdGVuZXIgZm9yIHVwZ3JhZGluZyB0aGUgZ3JhZGllbnQgKi8KLQlwcml2YXRlIFNoZWxsQWRhcHRlciBzaGVsbExpc3RlbmVyID0gbmV3IFNoZWxsQWRhcHRlcigpIHsKLQotCQlwdWJsaWMgdm9pZCBzaGVsbEFjdGl2YXRlZChTaGVsbEV2ZW50IGV2ZW50KSB7Ci0JCQl1cGRhdGVHcmFkaWVudCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2hlbGxEZWFjdGl2YXRlZChTaGVsbEV2ZW50IGV2ZW50KSB7Ci0JCQl1cGRhdGVHcmFkaWVudCgpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBwcmVzZW50YXRpb24gc3RhY2suCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCB3aWRnZXQKLQkgKiBAcGFyYW0gc3RhY2tTaXRlCi0JICogICAgICAgICAgICB0aGUgc2l0ZQotCSAqLwotCXB1YmxpYyBSMjFFZGl0b3JTdGFja1ByZXNlbnRhdGlvbihDb21wb3NpdGUgcGFyZW50LAotCQkJSVN0YWNrUHJlc2VudGF0aW9uU2l0ZSBzdGFja1NpdGUpIHsKLQkJc3VwZXIoc3RhY2tTaXRlKTsKLQotCQkvLyBjcmVhdGUgdGhlIHRhYiBmb2xkZXIKLQkJdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIocGFyZW50LCB0YWJQb3MgfCBTV1QuQk9SREVSKTsKLQotCQkvLyBtaW5pbXVtIHRhYiB3aWR0aAotCQl0YWJGb2xkZXIuTUlOX1RBQl9XSURUSCA9IHByZWZlcmVuY2VTdG9yZQotCQkJCS5nZXRJbnQoSVByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1RBQl9XSURUSCk7Ci0KLQkJLy8gcHJldmVudCBjbG9zZSBidXR0b24gYW5kIHNjcm9sbCBidXR0b25zIGZyb20gdGFraW5nIGZvY3VzCi0JCXRhYkZvbGRlci5zZXRUYWJMaXN0KG5ldyBDb250cm9sWzBdKTsKLQotCQkvLyBlbmFibGUgY2xvc2UgYnV0dG9uIGluIHRhYiBmb2xkZXIKLQkJdGFiRm9sZGVyLmFkZENUYWJGb2xkZXJMaXN0ZW5lcihjbG9zZUxpc3RlbmVyKTsKLQotCQkvLyBsaXN0ZW5lciB0byBzd2l0Y2ggYmV0d2VlbiB2aXNpYmxlIHRhYkl0ZW1zCi0JCXRhYkZvbGRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJLy8gbGlzdGVuZXIgdG8gcmVzaXplIHZpc2libGUgY29tcG9uZW50cwotCQl0YWJGb2xkZXIuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgcmVzaXplTGlzdGVuZXIpOwotCi0JCS8vIGxpc3RlbiBmb3IgbW91c2UgZG93biBvbiB0YWIgdG8gc2V0IGZvY3VzLCBzaG93IHN5c3RlbSBtZW51IGFuZAotCQkvLyBtYXhpbWl6ZS9yZXN0b3JlLgotCQl0YWJGb2xkZXIuYWRkTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLQotCQkvLyB0aGUgbWVudQotCQl0YWJGb2xkZXIuYWRkTGlzdGVuZXIoU1dULk1lbnVEZXRlY3QsIG1lbnVMaXN0ZW5lcik7Ci0KLQkJLy8gcmVnaXN0ZXIgZHJhZyBsaXN0ZW5lcgotCQlQcmVzZW50YXRpb25VdGlsLmFkZERyYWdMaXN0ZW5lcih0YWJGb2xkZXIsIGRyYWdMaXN0ZW5lcik7Ci0KLQkJLy8gYWRkIHRoZSBzaGVsbCBsaXN0ZW5lciB0byB0cmFjayBzaGVsbCBhY3RpdmF0aW9ucwotCQkvLyBUT0RPOiBjaGVjayBpZiB3b3JrYXJvdW5kIGNhbiBiZSByZW1vdmVkIChzZWUgYnVnIDU1NDU4KQotCQl0YWJGb2xkZXIuZ2V0U2hlbGwoKS5hZGRTaGVsbExpc3RlbmVyKHNoZWxsTGlzdGVuZXIpOwotCi0JCS8vIGluaXRpYWxpemUgc3lzdGVtIG1lbnUKLQkJcG9wdWxhdGVTeXN0ZW1NZW51KHN5c3RlbU1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIG1lbnUgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVudU1hbmFnZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVTeXN0ZW1NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCi0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoIm1pc2MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcigicmVzdG9yZSIpKTsgLy8kTk9OLU5MUy0xJAotCQltZW51TWFuYWdlci5hZGQobmV3IFVwZGF0aW5nQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQluZXcgU3lzdGVtTWVudVJlc3RvcmUoZ2V0U2l0ZSgpKSkpOwotCQltZW51TWFuYWdlci5hZGQobmV3IFN5c3RlbU1lbnVNb3ZlKGdldFNpdGUoKSwgZ2V0UGFuZU5hbWUoKSkpOwotCQltZW51TWFuYWdlci5hZGQobmV3IEdyb3VwTWFya2VyKCJzaXplIikpOyAvLyROT04tTkxTLTEkCi0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoInN0YXRlIikpOyAvLyROT04tTkxTLTEkCi0JCS8vIHN5c3RlbU1lbnVNYW5hZ2VyLmFkZChuZXcgVXBkYXRpbmdBY3Rpb25Db250cmlidXRpb25JdGVtKG5ldwotCQkvLyBTeXN0ZW1NZW51TWluaW1pemUoZ2V0U2l0ZSgpKSkpOwotCQltZW51TWFuYWdlci5hZGQobmV3IFVwZGF0aW5nQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQluZXcgU3lzdGVtTWVudU1heGltaXplKGdldFNpdGUoKSkpKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImNsb3NlIikpOyAvLyROT04tTkxTLTEkCi0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgVXBkYXRpbmdBY3Rpb25Db250cmlidXRpb25JdGVtKG5ldyBTeXN0ZW1NZW51Q2xvc2UoCi0JCQkJZ2V0U2l0ZSgpKSkpOwotCi0JCWdldFNpdGUoKS5hZGRTeXN0ZW1BY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgdGFiIGZvciB0aGUgZ2l2ZW4gcGFydCwgb3IgcmV0dXJucwotCSAqIHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKSBpZiB0aGVyZSBpcyBubyBzdWNoIHRhYi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydAotCSAqICAgICAgICAgICAgcGFydCBiZWluZyBzZWFyY2hlZCBmb3IKLQkgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgdGFiIGZvciB0aGUgZ2l2ZW4gcGFydCwgb3IgdGhlIG51bWJlciBvZiB0YWJzIGlmCi0JICogICAgICAgICB0aGVyZSBpcyBubyBzdWNoIHRhYgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IGluZGV4T2YoSVByZXNlbnRhYmxlUGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0ID09IG51bGwpCi0JCQlyZXR1cm4gdGFiRm9sZGVyLmdldEl0ZW1Db3VudCgpOwotCi0JCUNUYWJJdGVtW10gaXRlbXMgPSB0YWJGb2xkZXIuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgaXRlbXMubGVuZ3RoOyBpZHgrKykKLQkJCWlmIChwYXJ0ID09IGdldFBhcnRGb3JUYWIoaXRlbXNbaWR4XSkpCi0JCQkJcmV0dXJuIGlkeDsKLQotCQlyZXR1cm4gaXRlbXMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhYiBmb3IgdGhlIGdpdmVuIHBhcnQsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCB0YWIKLQkgKiAKLQkgKiBAcGFyYW0gcGFydAotCSAqICAgICAgICAgICAgdGhlIHBhcnQgYmVpbmcgc2VhcmNoZWQgZm9yCi0JICogQHJldHVybiB0aGUgdGFiIGZvciB0aGUgZ2l2ZW4gcGFydCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHRhYgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDVGFiSXRlbSBnZXRUYWIoSVByZXNlbnRhYmxlUGFydCBwYXJ0KSB7Ci0JCUNUYWJJdGVtW10gaXRlbXMgPSB0YWJGb2xkZXIuZ2V0SXRlbXMoKTsKLQkJaW50IGlkeCA9IGluZGV4T2YocGFydCk7Ci0JCXJldHVybiBpZHggPCBpdGVtcy5sZW5ndGggPyBpdGVtc1tpZHhdIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFydAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkUHJvcGVydHlDaGFuZ2VkKElQcmVzZW50YWJsZVBhcnQgcGFydCwgaW50IHByb3BlcnR5KSB7Ci0JCWluaXRUYWIoZ2V0VGFiKHBhcnQpLCBwYXJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSVByZXNlbnRhYmxlUGFydCBnZXRQYXJ0Rm9yVGFiKENUYWJJdGVtIGl0ZW0pIHsKLQkJcmV0dXJuIChJUHJlc2VudGFibGVQYXJ0KSBpdGVtLmdldERhdGEoVEFCX0RBVEEpOwotCX0KLQotCXByb3RlY3RlZCBDVGFiRm9sZGVyIGdldFRhYkZvbGRlcigpIHsKLQkJcmV0dXJuIHRhYkZvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGUgcmVjZWl2ZXIgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGRpc3Bvc2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIHRhYkZvbGRlciA9PSBudWxsIHx8IHRhYkZvbGRlci5pc0Rpc3Bvc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzaXplIG9mIGEgcGFnZSBpbiB0aGUgZm9sZGVyLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDb250cm9sU2l6ZSgpIHsKLQkJaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiB0YWJGb2xkZXIgIT0gbnVsbCkKLQkJCWN1cnJlbnQuc2V0Qm91bmRzKGNhbGN1bGF0ZVBhZ2VCb3VuZHModGFiRm9sZGVyKSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBib3VuZHMgb2YgdGhlIGNsaWVudCBhcmVhIGluc2lkZSB0aGUgZm9sZGVyCi0JICogCi0JICogQHBhcmFtIGZvbGRlcgotCSAqIEByZXR1cm4gUmVjdGFuZ2xlIHRoZSBib3VuZHMgb2YgdGhlIGNsaWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVjdGFuZ2xlIGNhbGN1bGF0ZVBhZ2VCb3VuZHMoQ1RhYkZvbGRlciBmb2xkZXIpIHsKLQkJaWYgKGZvbGRlciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCk7Ci0KLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGZvbGRlci5nZXRCb3VuZHMoKTsKLQkJUmVjdGFuZ2xlIG9mZnNldCA9IGZvbGRlci5nZXRDbGllbnRBcmVhKCk7Ci0JCWJvdW5kcy54ICs9IG9mZnNldC54OwotCQlib3VuZHMueSArPSBvZmZzZXQueTsKLQkJYm91bmRzLndpZHRoID0gb2Zmc2V0LndpZHRoOwotCQlib3VuZHMuaGVpZ2h0ID0gb2Zmc2V0LmhlaWdodDsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnNraW5zLlByZXNlbnRhdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCS8vIHJlbW92ZSBzaGVsbCBsaXN0ZW5lcgotCQl0YWJGb2xkZXIuZ2V0U2hlbGwoKS5yZW1vdmVTaGVsbExpc3RlbmVyKHNoZWxsTGlzdGVuZXIpOwotCi0JCS8vIHJlbW92ZSBjbG9zZSBsaXN0ZW5lcgotCQl0YWJGb2xkZXIucmVtb3ZlQ1RhYkZvbGRlckxpc3RlbmVyKGNsb3NlTGlzdGVuZXIpOwotCi0JCS8vIHJlbW92ZSBkcmFnIGxpc3RlbmVyCi0JCVByZXNlbnRhdGlvblV0aWwucmVtb3ZlRHJhZ0xpc3RlbmVyKHRhYkZvbGRlciwgZHJhZ0xpc3RlbmVyKTsKLQotCQkvLyBkaXNwb3NlIHN5c3RlbSBtZW51IG1hbmFnZXIKLQkJc3lzdGVtTWVudU1hbmFnZXIuZGlzcG9zZSgpOwotCQlzeXN0ZW1NZW51TWFuYWdlci5yZW1vdmVBbGwoKTsKLQotCQkvLyBkaXNwb3NlIHRhYiBmb2xkZXIKLQkJdGFiRm9sZGVyLmRpc3Bvc2UoKTsKLQkJdGFiRm9sZGVyID0gbnVsbDsKLQl9Ci0KLQkvKiogdGhlIGFjdGl2ZSBzdGF0ZSAqLwotCXByaXZhdGUgaW50IGFjdGl2ZVN0YXRlID0gQVNfSU5BQ1RJVkU7Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHRhYiBmb2xkZXIncyBjb2xvdXJzIHRvIG1hdGNoIHRoZSBjdXJyZW50IHRoZW1lIHNldHRpbmdzIGFuZAotCSAqIGFjdGl2ZSBzdGF0ZQotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmFkaWVudCgpIHsKLQotCQlpZiAoaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCUNvbG9yIGZnQ29sb3I7Ci0JCUNvbG9yW10gYmdDb2xvcnM7Ci0JCWludFtdIGJnUGVyY2VudHM7Ci0JCWJvb2xlYW4gdmVydGljYWwgPSBmYWxzZTsKLQkJaWYgKGFjdGl2ZVN0YXRlID09IEFTX0FDVElWRV9GT0NVUykgewotCQkJaWYgKGdldFNoZWxsQWN0aXZhdGVkKCkpIHsKLQkJCQlmZ0NvbG9yID0gUjIxQ29sb3JzLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9USVRMRV9GT1JFR1JPVU5EKTsKLQkJCQliZ0NvbG9ycyA9IFIyMUNvbG9ycy5nZXRBY3RpdmVFZGl0b3JHcmFkaWVudCgpOwotCQkJCWJnUGVyY2VudHMgPSBSMjFDb2xvcnMuZ2V0QWN0aXZlRWRpdG9yR3JhZGllbnRQZXJjZW50cygpOwotCQkJfSBlbHNlIHsKLQkJCQlmZ0NvbG9yID0gUjIxQ29sb3JzCi0JCQkJCQkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0ZPUkVHUk9VTkQpOwotCQkJCWJnQ29sb3JzID0gUjIxQ29sb3JzLmdldERlYWN0aXZhdGVkRWRpdG9yR3JhZGllbnQoKTsKLQkJCQliZ1BlcmNlbnRzID0gUjIxQ29sb3JzLmdldERlYWN0aXZhdGVkRWRpdG9yR3JhZGllbnRQZXJjZW50cygpOwotCQkJfQotCi0JCX0gZWxzZSBpZiAoYWN0aXZlU3RhdGUgPT0gQVNfQUNUSVZFX05PRk9DVVMpIHsKLQkJCWZnQ29sb3IgPSBSMjFDb2xvcnMuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCQliZ0NvbG9ycyA9IFIyMUNvbG9ycy5nZXRBY3RpdmVOb0ZvY3VzRWRpdG9yR3JhZGllbnQoKTsKLQkJCWJnUGVyY2VudHMgPSBSMjFDb2xvcnMuZ2V0QWN0aXZlTm9Gb2N1c0VkaXRvckdyYWRpZW50UGVyY2VudHMoKTsKLQkJfSBlbHNlIHsKLQkJCWZnQ29sb3IgPSBudWxsOwotCQkJYmdDb2xvcnMgPSBudWxsOwotCQkJYmdQZXJjZW50cyA9IG51bGw7Ci0JCX0KLQotCQlkcmF3R3JhZGllbnQoZmdDb2xvciwgYmdDb2xvcnMsIGJnUGVyY2VudHMsIHZlcnRpY2FsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBncmFkaWVudCBmb3IgdGhlIHNlbGVjdGVkIHRhYgotCSAqIAotCSAqIEBwYXJhbSBmZ0NvbG9yCi0JICogQHBhcmFtIGJnQ29sb3JzCi0JICogQHBhcmFtIHBlcmNlbnRhZ2VzCi0JICogQHBhcmFtIHZlcnRpY2FsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0dyYWRpZW50KENvbG9yIGZnQ29sb3IsIENvbG9yW10gYmdDb2xvcnMsCi0JCQlpbnRbXSBwZXJjZW50YWdlcywgYm9vbGVhbiB2ZXJ0aWNhbCkgewotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uRm9yZWdyb3VuZChmZ0NvbG9yKTsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbkJhY2tncm91bmQoYmdDb2xvcnMsIHBlcmNlbnRhZ2VzKTsKLQkJdGFiRm9sZGVyLnVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB3aW5kb3cncyBzaGVsbCBpcyBhY3RpdmF0ZWQKLQkgKi8KLQkvKiBwYWNrYWdlICovYm9vbGVhbiBnZXRTaGVsbEFjdGl2YXRlZCgpIHsKLQkJV2luZG93IHdpbmRvdyA9IGdldFdpbmRvdygpOwotCQlpZiAod2luZG93IGluc3RhbmNlb2YgV29ya2JlbmNoV2luZG93KQotCQkJcmV0dXJuICgoV29ya2JlbmNoV2luZG93KSB3aW5kb3cpLmdldFNoZWxsQWN0aXZhdGVkKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b3AgbGV2ZWwgd2luZG93LgotCSAqIAotCSAqIEByZXR1cm4gV2luZG93IHRoZSB3aW5kb3cgZm9yIHRoZSByZWNlaXZlcgotCSAqLwotCXB1YmxpYyBXaW5kb3cgZ2V0V2luZG93KCkgewotCQlDb250cm9sIGN0cmwgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjdHJsICE9IG51bGwpIHsKLQkJCU9iamVjdCBkYXRhID0gY3RybC5nZXRTaGVsbCgpLmdldERhdGEoKTsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgV2luZG93KQotCQkJCXJldHVybiAoV2luZG93KSBkYXRhOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBpdGVtIGZvciB0aGUgc3BlY2lmaWVkIHBhcnQuCi0JICogCi0JICogQHBhcmFtIHBhcnQKLQkgKiBAcGFyYW0gdGFiSW5kZXgKLQkgKiBAcmV0dXJuIHRoZSB0YWIgaXRlbSBmb3IgdGhlIHBhcnQKLQkgKi8KLQlwcml2YXRlIENUYWJJdGVtIGNyZWF0ZVBhcnRUYWIoSVByZXNlbnRhYmxlUGFydCBwYXJ0LCBpbnQgdGFiSW5kZXgpIHsKLQkJQ1RhYkl0ZW0gdGFiSXRlbSA9IG5ldyBDVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FLCB0YWJJbmRleCk7Ci0JCXRhYkl0ZW0uc2V0RGF0YShUQUJfREFUQSwgcGFydCk7Ci0JCXBhcnQuYWRkUHJvcGVydHlMaXN0ZW5lcihjaGlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0YWJJdGVtLmFkZERpc3Bvc2VMaXN0ZW5lcih0YWJEaXNwb3NlTGlzdGVuZXIpOwotCQlpbml0VGFiKHRhYkl0ZW0sIHBhcnQpOwotCQlyZXR1cm4gdGFiSXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBhIHRhYiBmb3IgdGhlIGdpdmVuIHBhcnQuIFNldHMgdGhlIHRleHQsIGljb24sIHRvb2wgdGlwLCBldGMuCi0JICogVGhpcyB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW5ldmVyIGEgcmVsZXZhbnQgcHJvcGVydHkgY2hhbmdlcyBpbiB0aGUgcGFydAotCSAqIHRvIHJlZmxlY3QgdGhvc2UgY2hhbmdlcyBpbiB0aGUgdGFiLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBjaGFuZ2UKLQkgKiB0aGUgYXBwZWFyYW5jZSBvZiB0YWJzIGZvciBhIHBhcnRpY3VsYXIgcGFydC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFiSXRlbQotCSAqICAgICAgICAgICAgdGFiIGZvciB0aGUgcGFydAotCSAqIEBwYXJhbSBwYXJ0Ci0JICogICAgICAgICAgICB0aGUgcGFydCBiZWluZyBkaXNwbGF5ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0VGFiKENUYWJJdGVtIHRhYkl0ZW0sIElQcmVzZW50YWJsZVBhcnQgcGFydCkgewotCi0JCS8vIHNldCB0YWIgdGV4dCBhbmQgdG9vbHRpcAotCQl0YWJJdGVtLnNldFRleHQoZ2V0TGFiZWxUZXh0KHBhcnQsIHRydWUsIGZhbHNlKSk7Ci0JCXRhYkl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0TGFiZWxUb29sVGlwVGV4dChwYXJ0KSk7Ci0KLQkJLy8gc2V0IHRhYiBpbWFnZQotCQl0YWJJdGVtLnNldEltYWdlKGdldExhYmVsSW1hZ2UocGFydCkpOwotCi0JCS8vIGZvbGxvd2luZyBjb2RlIGFsbG93cyBhIGRpc2FibGVkIGltYWdlCi0JCS8vIGJ1dCB0aGUgcmVzdWx0IHdhcyBkaXN0cmFjdGluZzogZGlkbid0IHNlZSBhbnkgZGlzYWJsZWQgaW1hZ2UKLQotCQkvLyBJbWFnZSBpbWFnZSA9IGdldExhYmVsSW1hZ2UocGFydCk7Ci0JCS8vIGJvb2xlYW4gdXNlQ29sb3JJY29ucyA9IGZhbHNlOyAvLyBzaG91bGQgd2UgdXNlIGEgcHJlZmVyZW5jZSBzZXR0aW5nPwotCQkvLwotCQkvLyBpZiAoaW1hZ2UgPT0gbnVsbCB8fCBpbWFnZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJLy8gLy8gbm9ybWFsIGltYWdlCi0JCS8vIHRhYkl0ZW0uc2V0SW1hZ2UobnVsbCk7Ci0JCS8vIC8vIGRpc2FibGVkIGltYWdlCi0JCS8vIGlmICghdXNlQ29sb3JJY29ucykgewotCQkvLyBJbWFnZSBkaXNhYmxlSW1hZ2UgPSB0YWJJdGVtLmdldERpc2FibGVkSW1hZ2UoKTsKLQkJLy8gaWYgKGRpc2FibGVJbWFnZSAhPSBudWxsKSB7Ci0JCS8vIGRpc2FibGVJbWFnZS5kaXNwb3NlKCk7Ci0JCS8vIHRhYkl0ZW0uc2V0RGlzYWJsZWRJbWFnZShudWxsKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0gZWxzZSBpZiAoIWltYWdlLmVxdWFscyh0YWJJdGVtLmdldEltYWdlKCkpKSB7Ci0JCS8vIC8vIG5vcm1hbCBpbWFnZQotCQkvLyB0YWJJdGVtLnNldEltYWdlKGltYWdlKTsKLQkJLy8gLy8gZGlzYWJsZWQgaW1hZ2UKLQkJLy8gaWYgKCF1c2VDb2xvckljb25zKSB7Ci0JCS8vIEltYWdlIGRpc2FibGVJbWFnZSA9IHRhYkl0ZW0uZ2V0RGlzYWJsZWRJbWFnZSgpOwotCQkvLyBpZiAoZGlzYWJsZUltYWdlICE9IG51bGwpCi0JCS8vIGRpc2FibGVJbWFnZS5kaXNwb3NlKCk7Ci0JCS8vIERpc3BsYXkgZGlzcGxheSA9IHRhYkl0ZW0uZ2V0RGlzcGxheSgpOwotCQkvLyBkaXNhYmxlSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2UsIFNXVC5JTUFHRV9ESVNBQkxFKTsKLQkJLy8gdGFiSXRlbS5zZXREaXNhYmxlZEltYWdlKGRpc2FibGVJbWFnZSk7Ci0JCS8vIH0KLQkJLy8gfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFiZWwgdGV4dCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgdGFiIGl0ZW0gZm9yIHRoZQotCSAqIHNwZWNpZmllZCBwYXJ0Ci0JICogCi0JICogQHBhcmFtIHByZXNlbnRhYmxlUGFydAotCSAqIEBwYXJhbSBkaXJ0eUxlZnQKLQkgKiBAcGFyYW0gaW5jbHVkZVBhdGgKLQkgKiBAcmV0dXJuIGEgZm9ybWF0ZWQgbGFiZWwgdGV4dAotCSAqLwotCVN0cmluZyBnZXRMYWJlbFRleHQoSVByZXNlbnRhYmxlUGFydCBwcmVzZW50YWJsZVBhcnQsIGJvb2xlYW4gZGlydHlMZWZ0LAotCQkJYm9vbGVhbiBpbmNsdWRlUGF0aCkgewotCQlTdHJpbmcgdGl0bGUgPSBwcmVzZW50YWJsZVBhcnQuZ2V0TmFtZSgpLnRyaW0oKTsKLQkJU3RyaW5nIHRleHQgPSB0aXRsZTsKLQotCQlpZiAoaW5jbHVkZVBhdGgpIHsKLQkJCVN0cmluZyB0aXRsZVRvb2x0aXAgPSBwcmVzZW50YWJsZVBhcnQuZ2V0VGl0bGVUb29sVGlwKCkudHJpbSgpOwotCi0JCQlpZiAodGl0bGVUb29sdGlwLmVuZHNXaXRoKHRpdGxlKSkKLQkJCQl0aXRsZVRvb2x0aXAgPSB0aXRsZVRvb2x0aXAuc3Vic3RyaW5nKDAsCi0JCQkJCQl0aXRsZVRvb2x0aXAubGFzdEluZGV4T2YodGl0bGUpKS50cmltKCk7Ci0KLQkJCWlmICh0aXRsZVRvb2x0aXAuZW5kc1dpdGgoIlxcIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl0aXRsZVRvb2x0aXAgPSB0aXRsZVRvb2x0aXAuc3Vic3RyaW5nKDAsCi0JCQkJCQl0aXRsZVRvb2x0aXAubGFzdEluZGV4T2YoIlxcIikpLnRyaW0oKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAodGl0bGVUb29sdGlwLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl0aXRsZVRvb2x0aXAgPSB0aXRsZVRvb2x0aXAuc3Vic3RyaW5nKDAsCi0JCQkJCQl0aXRsZVRvb2x0aXAubGFzdEluZGV4T2YoIi8iKSkudHJpbSgpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICh0aXRsZVRvb2x0aXAubGVuZ3RoKCkgPj0gMSkKLQkJCQl0ZXh0ICs9ICIgLSAiICsgdGl0bGVUb29sdGlwOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAocHJlc2VudGFibGVQYXJ0LmlzRGlydHkoKSkgewotCQkJaWYgKGRpcnR5TGVmdCkKLQkJCQl0ZXh0ID0gIiogIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQl0ZXh0ID0gdGV4dCArICIgKiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHVzZWQgZm9yIHRoZSB0YWIgaXRlbQotCSAqIAotCSAqIEBwYXJhbSBwcmVzZW50YWJsZVBhcnQKLQkgKiBAcmV0dXJuIGFuIGltYWdlCi0JICovCi0JSW1hZ2UgZ2V0TGFiZWxJbWFnZShJUHJlc2VudGFibGVQYXJ0IHByZXNlbnRhYmxlUGFydCkgewotCQlyZXR1cm4gcHJlc2VudGFibGVQYXJ0LmdldFRpdGxlSW1hZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b29sIHRpcCB0ZXh0IHVzZWQgZm9yIHRoZSB0YWIgaXRlbQotCSAqIAotCSAqIEBwYXJhbSBwcmVzZW50YWJsZVBhcnQKLQkgKiBAcmV0dXJuIGEgdG9vbCB0aXAgdGV4dAotCSAqLwotCVN0cmluZyBnZXRMYWJlbFRvb2xUaXBUZXh0KElQcmVzZW50YWJsZVBhcnQgcHJlc2VudGFibGVQYXJ0KSB7Ci0JCXJldHVybiBwcmVzZW50YWJsZVBhcnQuZ2V0VGl0bGVUb29sVGlwKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5za2lucy5TdGFja1ByZXNlbnRhdGlvbiNhZGRQYXJ0KG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnNraW5zLklQcmVzZW50YWJsZVBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5za2lucy5JUHJlc2VudGFibGVQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhcnQoSVByZXNlbnRhYmxlUGFydCBuZXdQYXJ0LCBPYmplY3QgY29va2llKSB7Ci0KLQkJaW50IGlkeDsKLQotCQlpZiAoY29va2llIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJaWR4ID0gKChJbnRlZ2VyKSBjb29raWUpLmludFZhbHVlKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBTZWxlY3QgYSBsb2NhdGlvbiBmb3IgbmV3bHkgaW5zZXJ0ZWQgcGFydHMKLQkJCWlkeCA9IHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKTsKLQkJfQotCi0JCWFkZFBhcnQobmV3UGFydCwgaWR4KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBwcmVzZW50YWJsZSBwYXJ0IHRvIHRoaXMgcHJlc2VudGF0aW9uIGF0IHRoZSBnaXZlbiBpbmRleC4KLQkgKiBEb2VzIG5vdGhpbmcgaWYgYSB0YWIgYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBnaXZlbiBwYXJ0LgotCSAqIAotCSAqIEBwYXJhbSBuZXdQYXJ0Ci0JICogQHBhcmFtIGluZGV4Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUGFydChJUHJlc2VudGFibGVQYXJ0IG5ld1BhcnQsIGludCBpbmRleCkgewotCQkvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSB0YWIgZm9yIHRoaXMgcGFydCwgZG8gbm90aGluZwotCQlpZiAoZ2V0VGFiKG5ld1BhcnQpICE9IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQljcmVhdGVQYXJ0VGFiKG5ld1BhcnQsIGluZGV4KTsKLQotCQkvLyBzZXRDb250cm9sU2l6ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuc2tpbnMuU3RhY2tQcmVzZW50YXRpb24jcmVtb3ZlUGFydChvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5za2lucy5JUHJlc2VudGFibGVQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBhcnQoSVByZXNlbnRhYmxlUGFydCBvbGRQYXJ0KSB7Ci0JCWlmIChjdXJyZW50ID09IG9sZFBhcnQpCi0JCQljdXJyZW50ID0gbnVsbDsKLQotCQlDVGFiSXRlbSBpdGVtID0gZ2V0VGFiKG9sZFBhcnQpOwotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJb2xkUGFydC5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQlpdGVtLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnNraW5zLlN0YWNrUHJlc2VudGF0aW9uI3NlbGVjdFBhcnQob3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuc2tpbnMuSVByZXNlbnRhYmxlUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RQYXJ0KElQcmVzZW50YWJsZVBhcnQgdG9TZWxlY3QpIHsKLQkJaWYgKHRvU2VsZWN0ID09IGN1cnJlbnQpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSVByZXNlbnRhYmxlUGFydCBvbGRQYXJ0ID0gY3VycmVudDsKLQotCQljdXJyZW50ID0gdG9TZWxlY3Q7Ci0JCQotCQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGluZGV4T2YoY3VycmVudCkpOwotCQkJY3VycmVudC5zZXRWaXNpYmxlKHRydWUpOwotCQkJc2V0Q29udHJvbFNpemUoKTsKLQotCQl9Ci0KLQkJaWYgKG9sZFBhcnQgIT0gbnVsbCkgewotCQkJb2xkUGFydC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuc2tpbnMuUHJlc2VudGF0aW9uI3NldEJvdW5kcyhvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvdW5kcyhSZWN0YW5nbGUgYm91bmRzKSB7Ci0JCXRhYkZvbGRlci5zZXRCb3VuZHMoYm91bmRzKTsKLQkJc2V0Q29udHJvbFNpemUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnNraW5zLlByZXNlbnRhdGlvbiNjb21wdXRlTWluaW11bVNpemUoKQotCSAqLwotCXB1YmxpYyBQb2ludCBjb21wdXRlTWluaW11bVNpemUoKSB7Ci0JCXJldHVybiBHZW9tZXRyeS5nZXRTaXplKHRhYkZvbGRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5za2lucy5QcmVzZW50YXRpb24jc2V0VmlzaWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkKLQkJCWN1cnJlbnQuc2V0VmlzaWJsZShpc1Zpc2libGUpOwotCi0JCWdldFRhYkZvbGRlcigpLnNldFZpc2libGUoaXNWaXNpYmxlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnNraW5zLlByZXNlbnRhdGlvbiNzZXRTdGF0ZShpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdGUoaW50IHN0YXRlKSB7Ci0JCS8vIHRhYkZvbGRlci5zZXRNaW5pbWl6ZWQoc3RhdGUgPT0gSVByZXNlbnRhdGlvblNpdGUuU1RBVEVfTUlOSU1JWkVEKTsKLQkJLy8gdGFiRm9sZGVyLnNldE1heGltaXplZChzdGF0ZSA9PSBJUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9NQVhJTUlaRUQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN5c3RlbSBtZW51IG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgc3lzdGVtIG1lbnUgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJTWVudU1hbmFnZXIgZ2V0U3lzdGVtTWVudU1hbmFnZXIoKSB7Ci0JCXJldHVybiBzeXN0ZW1NZW51TWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBTaG93cyB0aGUgc3lzdGVtIGNvbnRleHQgbWVudSBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uCi0JICogCi0JICogQHBhcmFtIHBvaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1N5c3RlbU1lbnUoUG9pbnQgcG9pbnQpIHsKLQkJTWVudSBhTWVudSA9IHN5c3RlbU1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KHRhYkZvbGRlci5nZXRQYXJlbnQoKSk7Ci0JCXN5c3RlbU1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLQkJYU1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSk7Ci0JCWFNZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5za2lucy5QcmVzZW50YXRpb24jZ2V0Q29udHJvbCgpCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHRhYkZvbGRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnNraW5zLlN0YWNrUHJlc2VudGF0aW9uI2RyYWdPdmVyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wsCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQpCi0JICovCi0JcHVibGljIFN0YWNrRHJvcFJlc3VsdCBkcmFnT3ZlcihDb250cm9sIGN1cnJlbnRDb250cm9sLCBQb2ludCBsb2NhdGlvbikgewotCi0JCS8vIERldGVybWluZSB3aGljaCB0YWIgd2UncmUgY3VycmVudGx5IGRyYWdnaW5nIG92ZXIKLQkJUG9pbnQgbG9jYWxQb3MgPSB0YWJGb2xkZXIudG9Db250cm9sKGxvY2F0aW9uKTsKLQkJZmluYWwgQ1RhYkl0ZW0gdGFiVW5kZXJQb2ludGVyID0gdGFiRm9sZGVyLmdldEl0ZW0obG9jYWxQb3MpOwotCi0JCS8vIFRoaXMgZHJvcCB0YXJnZXQgb25seSBkZWFscyB3aXRoIHRhYnMuLi4gaWYgd2UncmUgbm90IGRyYWdnaW5nIG92ZXIKLQkJLy8gYSB0YWIsIGV4aXQuCi0JCWlmICh0YWJVbmRlclBvaW50ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIHdvcmthcm91bmQgd2hlbiBsZWZ0IHRhYiBpcyBkcmFnZ2VkIG92ZXIgbmV4dAotCQlpbnQgZHJhZ092ZXJJbmRleCA9IHRhYkZvbGRlci5pbmRleE9mKHRhYlVuZGVyUG9pbnRlcik7Ci0KLQkJcmV0dXJuIG5ldyBTdGFja0Ryb3BSZXN1bHQoR2VvbWV0cnkudG9EaXNwbGF5KHRhYkZvbGRlciwKLQkJCQl0YWJVbmRlclBvaW50ZXIuZ2V0Qm91bmRzKCkpLCBuZXcgSW50ZWdlcihkcmFnT3ZlckluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLlN0YWNrUHJlc2VudGF0aW9uI3Nob3dTeXN0ZW1NZW51KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93U3lzdGVtTWVudSgpIHsKLQkJaWYgKG51bGwgIT0gY3VycmVudCkgewotCQkJLy8gc3dpdGNoIHRvIHRoZSBlZGl0b3IKLQkJCUNUYWJJdGVtIGl0ZW0gPSBnZXRUYWIoY3VycmVudCk7Ci0JCQlnZXRTaXRlKCkuc2VsZWN0UGFydChnZXRDdXJyZW50UGFydCgpKTsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpdGVtLmdldEJvdW5kcygpOwotCQkJaW50IHkgPSBib3VuZHMuaGVpZ2h0OwotCQkJaWYgKGdldFRhYkZvbGRlcigpLmdldFRhYlBvc2l0aW9uKCkgPT0gU1dULkJPVFRPTSkKLQkJCQl5ICs9IGJvdW5kcy55OwotCQkJc2hvd1N5c3RlbU1lbnUoZ2V0VGFiRm9sZGVyKCkudG9EaXNwbGF5KGJvdW5kcy54LCB5KSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuU3RhY2tQcmVzZW50YXRpb24jc2hvd1BhbmVNZW51KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93UGFuZU1lbnUoKSB7Ci0JCUlQYXJ0TWVudSBtZW51ID0gZ2V0UGFydE1lbnUoKTsKLQotCQlpZiAobnVsbCAhPSBtZW51KSB7Ci0JCQlDVGFiSXRlbSB0YWIgPSBnZXRUYWIoZ2V0Q3VycmVudFBhcnQoKSk7Ci0KLQkJCWlmIChudWxsICE9IHRhYiAmJiBudWxsICE9IHRhYi5nZXRDb250cm9sKCkpIHsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gRHJhZ1V0aWwuZ2V0RGlzcGxheUJvdW5kcyh0YWIuZ2V0Q29udHJvbCgpKTsKLQkJCQltZW51LnNob3dNZW51KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJUGFydE1lbnUgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCwgb3IgbnVsbCBpZiB0aGUKLQkgKiBjdXJyZW50IHBhcnQgZG9lcyBub3QgaGF2ZSBhIG1lbnUuCi0JICogCi0JICogQHJldHVybiB0aGUgSVBhcnRNZW51IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhcnQgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHJvdGVjdGVkIElQYXJ0TWVudSBnZXRQYXJ0TWVudSgpIHsKLQkJSVByZXNlbnRhYmxlUGFydCBwYXJ0ID0gZ2V0Q3VycmVudFBhcnQoKTsKLQkJaWYgKHBhcnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gcGFydC5nZXRNZW51KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLlN0YWNrUHJlc2VudGF0aW9uI2dldFRhYkxpc3QoSVByZXNlbnRhYmxlUGFydCkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbFtdIGdldFRhYkxpc3QoSVByZXNlbnRhYmxlUGFydCBwYXJ0KSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZ2V0Q29udHJvbCgpICE9IG51bGwpCi0JCQlsaXN0LmFkZChnZXRDb250cm9sKCkpOwotCQlpZiAocGFydC5nZXRUb29sQmFyKCkgIT0gbnVsbCkKLQkJCWxpc3QuYWRkKHBhcnQuZ2V0VG9vbEJhcigpKTsKLQkJaWYgKHBhcnQuZ2V0Q29udHJvbCgpICE9IG51bGwpCi0JCQlsaXN0LmFkZChwYXJ0LmdldENvbnRyb2woKSk7Ci0JCXJldHVybiAoQ29udHJvbFtdKSBsaXN0LnRvQXJyYXkobmV3IENvbnRyb2xbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuU3RhY2tQcmVzZW50YXRpb24jZ2V0Q3VycmVudFBhcnQoKQotCSAqLwotCXB1YmxpYyBJUHJlc2VudGFibGVQYXJ0IGdldEN1cnJlbnRQYXJ0KCkgewotCQlyZXR1cm4gY3VycmVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhbmVOYW1lKCkgewotCQlyZXR1cm4gUjIxUHJlc2VudGF0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0b3JQYW5lLm1vdmVFZGl0b3IiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuU3RhY2tQcmVzZW50YXRpb24jc2V0QWN0aXZlKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmUoaW50IG5ld1N0YXRlKSB7Ci0JCWFjdGl2ZVN0YXRlID0gbmV3U3RhdGU7Ci0JCXVwZGF0ZUdyYWRpZW50KCk7Ci0JfQotCQotICAgIC8qKgotICAgICAqIFJlc3RvcmVzIGEgcHJlc2VudGF0aW9uIGZyb20gYSBwcmV2aW91c2x5IHN0b3JlZCBzdGF0ZQotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXJpYWxpemVyIChub3QgbnVsbCkKLSAgICAgKiBAcGFyYW0gc2F2ZWRTdGF0ZSAobm90IG51bGwpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElQcmVzZW50YXRpb25TZXJpYWxpemVyIHNlcmlhbGl6ZXIsIElNZW1lbnRvIHNhdmVkU3RhdGUpIHsKLSAgICAgICAgSU1lbWVudG9bXSBwYXJ0cyA9IHNhdmVkU3RhdGUuZ2V0Q2hpbGRyZW4oSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfUEFSVCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBwYXJ0cy5sZW5ndGg7IGlkeCsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBwYXJ0c1tpZHhdLmdldFN0cmluZyhJV29ya2JlbmNoQ29uc3RhbnRzLlRBR19JRCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVByZXNlbnRhYmxlUGFydCBwYXJ0ID0gc2VyaWFsaXplci5nZXRQYXJ0KGlkKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFBhcnQocGFydCwgdGFiRm9sZGVyLmdldEl0ZW1Db3VudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuU3RhY2tQcmVzZW50YXRpb24jc2F2ZVN0YXRlKG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVByZXNlbnRhdGlvblNlcmlhbGl6ZXIsIG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJUHJlc2VudGF0aW9uU2VyaWFsaXplciBjb250ZXh0LCBJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIHN1cGVyLnNhdmVTdGF0ZShjb250ZXh0LCBtZW1lbnRvKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgcGFydHMgPSBnZXRQcmVzZW50YWJsZVBhcnRzKCk7Ci0gICAgICAgIAotICAgICAgICBJdGVyYXRvciBpdGVyID0gcGFydHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBJUHJlc2VudGFibGVQYXJ0IG5leHQgPSAoSVByZXNlbnRhYmxlUGFydClpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgSU1lbWVudG8gY2hpbGRNZW0gPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKElXb3JrYmVuY2hDb25zdGFudHMuVEFHX1BBUlQpOwotICAgICAgICAgICAgY2hpbGRNZW0ucHV0U3RyaW5nKElXb3JrYmVuY2hDb25zdGFudHMuVEFHX0lELCBjb250ZXh0LmdldElkKG5leHQpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBMaXN0IG9mIElQcmVzZW50YWJsZVBhcnQgY3VycmVudGx5IGluIHRoaXMgcHJlc2VudGF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGdldFByZXNlbnRhYmxlUGFydHMoKSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoIWlzRGlzcG9zZWQoKSk7Ci0gICAgICAgIAotICAgICAgICBDVGFiSXRlbVtdIGl0ZW1zID0gdGFiRm9sZGVyLmdldEl0ZW1zKCk7Ci0gICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChpdGVtcy5sZW5ndGgpOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgdGFiRm9sZGVyLmdldEl0ZW1Db3VudCgpOyBpZHgrKykgewotICAgICAgICAgICAgcmVzdWx0LmFkZChnZXRQYXJ0Rm9yVGFiKGl0ZW1zW2lkeF0pKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9SMjFQcmVzZW50YXRpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL1IyMVByZXNlbnRhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmMmI4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL1IyMVByZXNlbnRhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVN0YWNrUHJlc2VudGF0aW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLlN0YWNrUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuV29ya2JlbmNoUHJlc2VudGF0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBBIHByZXNlbnRhdGlvbiBmYWN0b3J5IHRoYXQgY3JlYXRlcyBhIGxvb2sgc2ltaWxhciB0byBwcmV2aW91cyB2ZXJpc29ucyBvZiBlY2xpcHNlLgotICovCi1wdWJsaWMgY2xhc3MgUjIxUHJlc2VudGF0aW9uRmFjdG9yeSBleHRlbmRzIFdvcmtiZW5jaFByZXNlbnRhdGlvbkZhY3RvcnkgewotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5BYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RhY2tQcmVzZW50YXRpb24gY3JlYXRlRWRpdG9yUHJlc2VudGF0aW9uKENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgICAgICBJU3RhY2tQcmVzZW50YXRpb25TaXRlIHNpdGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSMjFFZGl0b3JTdGFja1ByZXNlbnRhdGlvbihwYXJlbnQsIHNpdGUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIFN0YWNrUHJlc2VudGF0aW9uIGNyZWF0ZVZpZXdQcmVzZW50YXRpb24oQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIElTdGFja1ByZXNlbnRhdGlvblNpdGUgc2l0ZSkgewotICAgICAgICByZXR1cm4gbmV3IFIyMVZpZXdTdGFja1ByZXNlbnRhdGlvbihwYXJlbnQsIHNpdGUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIFN0YWNrUHJlc2VudGF0aW9uIGNyZWF0ZVN0YW5kYWxvbmVWaWV3UHJlc2VudGF0aW9uKENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgICAgICBJU3RhY2tQcmVzZW50YXRpb25TaXRlIHNpdGUsIGJvb2xlYW4gc2hvd1RpdGxlKSB7Ci0gICAgICAgIC8vIFRPRE86IGhvbm91ciBzaG93VGl0bGUKLSAgICAgICAgcmV0dXJuIG5ldyBSMjFWaWV3U3RhY2tQcmVzZW50YXRpb24ocGFyZW50LCBzaXRlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ByZXNlbnRhdGlvbnMvUjIxVmlld1N0YWNrUHJlc2VudGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL1IyMVZpZXdTdGFja1ByZXNlbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTZhYjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ByZXNlbnRhdGlvbnMvUjIxVmlld1N0YWNrUHJlc2VudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy5yMjEuUjIxUHJlc2VudGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy5yMjEud2lkZ2V0cy5DVGFiRm9sZGVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy5yMjEud2lkZ2V0cy5SMjFQYW5lRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMucjIxLndpZGdldHMuUjIxUGFuZUZvbGRlckJ1dHRvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVN0YWNrUHJlc2VudGF0aW9uU2l0ZTsKLQotLyoqCi0gKiBDb250cm9scyB0aGUgYXBwZWFyYW5jZSBvZiB2aWV3cyBzdGFja2VkIGludG8gdGhlIHdvcmtiZW5jaC4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgUjIxVmlld1N0YWNrUHJlc2VudGF0aW9uIGV4dGVuZHMgUjIxQmFzaWNTdGFja1ByZXNlbnRhdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCS8vIGRvbid0IHJlc2V0IHRoaXMgZHluYW1pY2FsbHksIHNvIGp1c3Qga2VlcCB0aGUgaW5mb3JtYXRpb24gc3RhdGljLgotCS8vIHNlZSBidWc6Ci0JLy8gICA3NTQyMiBbUHJlc2VudGF0aW9uc10gU3dpdGNoaW5nIHByZXNlbnRhdGlvbiB0byBSMjEgc3dpdGNoZXMgaW1tZWRpYXRlbHksIGJ1dCBvbmx5IHBhcnRpYWxseQotICAgIHByaXZhdGUgc3RhdGljIGludCB0YWJQb3MgPSBwcmVmZXJlbmNlU3RvcmUuZ2V0SW50KElQcmVmZXJlbmNlQ29uc3RhbnRzLlZJRVdfVEFCX1BPU0lUSU9OKTsKLSAgCi0gICAgcHJpdmF0ZSBSMjFQYW5lRm9sZGVyQnV0dG9uTGlzdGVuZXIgc2hvd0xpc3RMaXN0ZW5lciA9IG5ldyBSMjFQYW5lRm9sZGVyQnV0dG9uTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2hvd0xpc3QoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBldmVudC5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICBzaG93TGlzdERlZmF1bHRMb2NhdGlvbigpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotCSAqIENyZWF0ZSBhIG5ldyB2aWV3IHN0YWNrIHByZXNlbnRhdGlvbi4KLQkgKgotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiBAcGFyYW0gbmV3U2l0ZQotICAgICAqLwotICAgIHB1YmxpYyBSMjFWaWV3U3RhY2tQcmVzZW50YXRpb24oQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIElTdGFja1ByZXNlbnRhdGlvblNpdGUgbmV3U2l0ZSkgewotCi0gICAgICAgIHN1cGVyKG5ldyBSMjFQYW5lRm9sZGVyKHBhcmVudCwgU1dULkJPUkRFUiksIG5ld1NpdGUpOwotICAgICAgICBSMjFQYW5lRm9sZGVyIHRhYkZvbGRlciA9IGdldFBhbmVGb2xkZXIoKTsKLQotICAgICAgICB0YWJGb2xkZXIuYWRkQnV0dG9uTGlzdGVuZXIoc2hvd0xpc3RMaXN0ZW5lcik7Ci0KLSAgICAgICAgdGFiRm9sZGVyLnNldFRhYlBvc2l0aW9uKHRhYlBvcyk7Ci0gICAgICAgIHVwZGF0ZUdyYWRpZW50KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuc2tpbnMuUHJlc2VudGF0aW9uI3NldEFjdGl2ZShib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZShib29sZWFuIGlzQWN0aXZlKSB7Ci0gICAgICAgIHN1cGVyLnNldEFjdGl2ZShpc0FjdGl2ZSk7Ci0KLSAgICAgICAgdXBkYXRlR3JhZGllbnQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLkRlZmF1bHRQYXJ0UHJlc2VudGF0aW9uI2dldFBhcnRNZW51KCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhbmVOYW1lKCkgewotICAgICAgICByZXR1cm4gUjIxUHJlc2VudGF0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJWaWV3UGFuZS5tb3ZlVmlldyIpOyAvLyROT04tTkxTLTEkIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ByZXNlbnRhdGlvbnMvcjIxL1IyMUNvbG9ycy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvUjIxQ29sb3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTU1ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvUjIxQ29sb3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMucjIxOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgUjIxIHdvcmtiZW5jaCBjb2xvcnMgKHRoZXkgYXJlIGZpeGVkKS4KLSAqLwotcHVibGljIGNsYXNzIFIyMUNvbG9ycyB7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBib29sZWFuIGluaXQgPSBmYWxzZTsKLQotICAgIHN0YXRpYyBwcml2YXRlIEhhc2hNYXAgY29sb3JNYXA7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBIYXNoTWFwIHN5c3RlbUNvbG9yTWFwOwotCi0gICAgc3RhdGljIHByaXZhdGUgQ29sb3Igd29ya2JlbmNoQ29sb3JzW107Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBDb2xvcltdIGFjdGl2ZVZpZXdHcmFkaWVudDsKLQotICAgIHN0YXRpYyBwcml2YXRlIENvbG9yW10gZGVhY3RpdmF0ZWRWaWV3R3JhZGllbnQ7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBDb2xvcltdIGFjdGl2ZUVkaXRvckdyYWRpZW50OwotCi0gICAgc3RhdGljIHByaXZhdGUgQ29sb3JbXSBhY3RpdmVOb0ZvY3VzRWRpdG9yR3JhZGllbnQ7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBDb2xvcltdIGRlYWN0aXZhdGVkRWRpdG9yR3JhZGllbnQ7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBhY3RpdmVWaWV3UGVyY2VudGFnZXM7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBkZWFjdGl2YXRlZFZpZXdQZXJjZW50YWdlczsKLQotICAgIHN0YXRpYyBwcml2YXRlIGludFtdIGFjdGl2ZUVkaXRvclBlcmNlbnRhZ2VzOwotCi0gICAgc3RhdGljIHByaXZhdGUgaW50W10gYWN0aXZlTm9Gb2N1c0VkaXRvclBlcmNlbnRhZ2VzOwotCi0gICAgc3RhdGljIHByaXZhdGUgaW50W10gZGVhY3RpdmF0ZWRFZGl0b3JQZXJjZW50YWdlczsKLQotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBDTFJfVklFV19HUkFEX1NUQVJUID0gImNsclZpZXdHcmFkU3RhcnQiOy8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBDTFJfVklFV19HUkFEX0VORCA9ICJjbHJWaWV3R3JhZEVuZCI7Ly8kTk9OLU5MUy0xJAotCi0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIENMUl9FRElUT1JfR1JBRF9TVEFSVCA9ICJjbHJFZGl0b3JHcmFkU3RhcnQiOy8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBDTFJfRURJVE9SX0dSQURfRU5EID0gImNsckVkaXRvckdyYWRFbmQiOy8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIERpc3Bvc2UgYWxsIGNvbG9yIHByZS1hbGxvY2F0ZWQgYnkgdGhlIHdvcmtiZW5jaC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRpc3Bvc2VXb3JrYmVuY2hDb2xvcnMoKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29ya2JlbmNoQ29sb3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB3b3JrYmVuY2hDb2xvcnNbaV0uZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aXZlIGVkaXRvciBncmFkaWVudC4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIENvbG9yW10gZ2V0QWN0aXZlRWRpdG9yR3JhZGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBhY3RpdmVFZGl0b3JHcmFkaWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgZWRpdG9yIGdyYWRpZW50IGVuZCBjb2xvci4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIENvbG9yIGdldEFjdGl2ZUVkaXRvckdyYWRpZW50RW5kKCkgewotICAgICAgICBDb2xvciBjbHIgPSAoQ29sb3IpIHN5c3RlbUNvbG9yTWFwLmdldChDTFJfRURJVE9SX0dSQURfRU5EKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChjbHIpOwotICAgICAgICByZXR1cm4gY2xyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjdGl2ZSBlZGl0b3IgZ3JhZGllbnQgcGVyY2VudHMuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBpbnRbXSBnZXRBY3RpdmVFZGl0b3JHcmFkaWVudFBlcmNlbnRzKCkgewotICAgICAgICByZXR1cm4gYWN0aXZlRWRpdG9yUGVyY2VudGFnZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aXZlIGVkaXRvciBncmFkaWVudCBzdGFydCBjb2xvci4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIENvbG9yIGdldEFjdGl2ZUVkaXRvckdyYWRpZW50U3RhcnQoKSB7Ci0gICAgICAgIENvbG9yIGNsciA9IChDb2xvcikgc3lzdGVtQ29sb3JNYXAuZ2V0KENMUl9FRElUT1JfR1JBRF9TVEFSVCk7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoY2xyKTsKLSAgICAgICAgcmV0dXJuIGNscjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgbm8gZm9jdXMgZWRpdG9yIGdyYWRpZW50LgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgQ29sb3JbXSBnZXRBY3RpdmVOb0ZvY3VzRWRpdG9yR3JhZGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBhY3RpdmVOb0ZvY3VzRWRpdG9yR3JhZGllbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aXZlIG5vIGZvY3VzIGVkaXRvciBncmFkaWVudCBwZXJjZW50cy4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGludFtdIGdldEFjdGl2ZU5vRm9jdXNFZGl0b3JHcmFkaWVudFBlcmNlbnRzKCkgewotICAgICAgICByZXR1cm4gYWN0aXZlTm9Gb2N1c0VkaXRvclBlcmNlbnRhZ2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjdGl2ZSBncmFkaWVudCBmb3Igdmlld3MuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBDb2xvcltdIGdldEFjdGl2ZVZpZXdHcmFkaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGFjdGl2ZVZpZXdHcmFkaWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgdmlldyBncmFkaWVudCBlbmQgY29sb3IuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBDb2xvciBnZXRBY3RpdmVWaWV3R3JhZGllbnRFbmQoKSB7Ci0gICAgICAgIENvbG9yIGNsciA9IChDb2xvcikgc3lzdGVtQ29sb3JNYXAuZ2V0KENMUl9WSUVXX0dSQURfRU5EKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChjbHIpOwotICAgICAgICByZXR1cm4gY2xyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjdGl2ZSB2aWV3IGdyYWRpZW50IHBlcmNlbnRzLgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgaW50W10gZ2V0QWN0aXZlVmlld0dyYWRpZW50UGVyY2VudHMoKSB7Ci0gICAgICAgIHJldHVybiBhY3RpdmVWaWV3UGVyY2VudGFnZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aXZlIHZpZXcgZ3JhZGllbnQgc3RhcnQgY29sb3IuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBDb2xvciBnZXRBY3RpdmVWaWV3R3JhZGllbnRTdGFydCgpIHsKLSAgICAgICAgQ29sb3IgY2xyID0gKENvbG9yKSBzeXN0ZW1Db2xvck1hcC5nZXQoQ0xSX1ZJRVdfR1JBRF9TVEFSVCk7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoY2xyKTsKLSAgICAgICAgcmV0dXJuIGNscjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBncmFkaWVudCBmb3IgZWRpdG9ycyB3aGVuIHRoZSB3aW5kb3cgaXMgZGVhY3RpdmF0ZWQuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBDb2xvcltdIGdldERlYWN0aXZhdGVkRWRpdG9yR3JhZGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlZEVkaXRvckdyYWRpZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVkaXRvciBncmFkaWVudCBwZXJjZW50cyB3aGVuIHRoZSB3aW5kb3cgaXMgZGVhY3RpdmF0ZWQuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBpbnRbXSBnZXREZWFjdGl2YXRlZEVkaXRvckdyYWRpZW50UGVyY2VudHMoKSB7Ci0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlZEVkaXRvclBlcmNlbnRhZ2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdyYWRpZW50IGZvciB2aWV3cyB3aGVuIHRoZSB3aW5kb3cgaXMgZGVhY3RpdmF0ZWQuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBDb2xvcltdIGdldERlYWN0aXZhdGVkVmlld0dyYWRpZW50KCkgewotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZWRWaWV3R3JhZGllbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmlldyBncmFkaWVudCBwZXJjZW50cyB3aGVuIHRoZSB3aW5kb3cgaXMgZGVhY3RpdmF0ZWQuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBpbnRbXSBnZXREZWFjdGl2YXRlZFZpZXdHcmFkaWVudFBlcmNlbnRzKCkgewotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZWRWaWV3UGVyY2VudGFnZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbG9yIGlkZW50aWZpZWQgYnkgYW4gUkdCIHZhbHVlLgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgQ29sb3IgZ2V0Q29sb3IoUkdCIHJnYlZhbHVlKSB7Ci0gICAgICAgIENvbG9yIGNsciA9IChDb2xvcikgY29sb3JNYXAuZ2V0KHJnYlZhbHVlKTsKLSAgICAgICAgaWYgKGNsciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBEaXNwbGF5IGRpc3AgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLSAgICAgICAgICAgIGNsciA9IG5ldyBDb2xvcihkaXNwLCByZ2JWYWx1ZSk7Ci0gICAgICAgICAgICBjb2xvck1hcC5wdXQocmdiVmFsdWUsIGNscik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNscjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3lzdGVtIGNvbG9yIGlkZW50aWZpZWQgYnkgYSBTV1QgY29uc3RhbnQuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBDb2xvciBnZXRTeXN0ZW1Db2xvcihpbnQgc3d0SWQpIHsKLSAgICAgICAgSW50ZWdlciBiaWdJbnQgPSBuZXcgSW50ZWdlcihzd3RJZCk7Ci0gICAgICAgIENvbG9yIGNsciA9IChDb2xvcikgc3lzdGVtQ29sb3JNYXAuZ2V0KGJpZ0ludCk7Ci0gICAgICAgIGlmIChjbHIgPT0gbnVsbCkgewotICAgICAgICAgICAgRGlzcGxheSBkaXNwID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICBjbHIgPSBkaXNwLmdldFN5c3RlbUNvbG9yKHN3dElkKTsKLSAgICAgICAgICAgIHN5c3RlbUNvbG9yTWFwLnB1dChiaWdJbnQsIGNscik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNscjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIGFsbCBjb2xvcnMgdXNlZCBpbiB0aGUgd29ya2JlbmNoIGluIGNhc2UgdGhlIE9TIGlzIHVzaW5nIGEgMjU2Ci0gICAgICogY29sb3IgcGFsZXR0ZSBtYWtpbmcgc3VyZSB0aGUgd29ya2JlbmNoIGNvbG9ycyBhcmUgYWxsb2NhdGVkLgotICAgICAqIAotICAgICAqIFRoaXMgbGlzdCBjb21lcyBmcm9tIHRoZSBkZXNpZ25lcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0V29ya2JlbmNoQ29sb3JzKERpc3BsYXkgZCkgewotICAgICAgICBpZiAod29ya2JlbmNoQ29sb3JzICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgd29ya2JlbmNoQ29sb3JzID0gbmV3IENvbG9yW10gewotICAgICAgICAvL1Byb2R1Y3QgcGFsbGV0Ci0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDI1NSwgMjU1LCAyNTUpLCBuZXcgQ29sb3IoZCwgMjU1LCAyNTEsIDI0MCksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDIyMywgMjIzLCAxOTEpLCBuZXcgQ29sb3IoZCwgMjIzLCAxOTEsIDE5MSksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDE5MiwgMjIwLCAxOTIpLCBuZXcgQ29sb3IoZCwgMTkyLCAxOTIsIDE5MiksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDE5MSwgMTkxLCAxOTEpLCBuZXcgQ29sb3IoZCwgMTkxLCAxOTEsIDE1OSksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDE5MSwgMTU5LCAxOTEpLCBuZXcgQ29sb3IoZCwgMTYwLCAxNjAsIDE2NCksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDE1OSwgMTU5LCAxOTEpLCBuZXcgQ29sb3IoZCwgMTU5LCAxNTksIDE1OSksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDE1OSwgMTU5LCAxMjcpLCBuZXcgQ29sb3IoZCwgMTU5LCAxMjcsIDE1OSksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDE1OSwgMTI3LCAxMjcpLCBuZXcgQ29sb3IoZCwgMTI4LCAxMjgsIDEyOCksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDEyNywgMTU5LCAxNTkpLCBuZXcgQ29sb3IoZCwgMTI3LCAxNTksIDEyNyksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDEyNywgMTI3LCAxNTkpLCBuZXcgQ29sb3IoZCwgMTI3LCAxMjcsIDEyNyksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDEyNywgMTI3LCA5NSksIG5ldyBDb2xvcihkLCAxMjcsIDk1LCAxMjcpLAotICAgICAgICAgICAgICAgIG5ldyBDb2xvcihkLCAxMjcsIDk1LCA5NSksIG5ldyBDb2xvcihkLCA5NSwgMTI3LCAxMjcpLAotICAgICAgICAgICAgICAgIG5ldyBDb2xvcihkLCA5NSwgMTI3LCA5NSksIG5ldyBDb2xvcihkLCA5NSwgOTUsIDEyNyksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDk1LCA5NSwgOTUpLCBuZXcgQ29sb3IoZCwgOTUsIDk1LCA2MyksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDk1LCA2MywgOTUpLCBuZXcgQ29sb3IoZCwgOTUsIDYzLCA2MyksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDYzLCA5NSwgOTUpLCBuZXcgQ29sb3IoZCwgNjMsIDk1LCA2MyksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDYzLCA2MywgOTUpLCBuZXcgQ29sb3IoZCwgMCwgMCwgMCksCi0gICAgICAgICAgICAgICAgLy93aXpiYW4gcGFsbGV0Ci0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDE5NSwgMjA0LCAyMjQpLCBuZXcgQ29sb3IoZCwgMjE0LCAyMjEsIDIzNSksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDE0OSwgMTY4LCAxOTkpLCBuZXcgQ29sb3IoZCwgMTI4LCAxNDgsIDE3OCksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDEwNiwgMTI4LCAxNTgpLCBuZXcgQ29sb3IoZCwgMjU1LCAyNTUsIDI1NSksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKGQsIDAsIDAsIDApLCBuZXcgQ29sb3IoZCwgMCwgMCwgMCksCi0gICAgICAgICAgICAgICAgLy9QZXJzcGVjdGl2ZQotICAgICAgICAgICAgICAgIG5ldyBDb2xvcihkLCAxMzIsIDEzMCwgMTMyKSwgbmV3IENvbG9yKGQsIDE0MywgMTQxLCAxMzgpLAotICAgICAgICAgICAgICAgIG5ldyBDb2xvcihkLCAxNzEsIDE2OCwgMTY1KSwKLSAgICAgICAgICAgICAgICAvL1ByZWZlcmVuY2VEaWFsb2cgYW5kIFRpdGxlQXJlYURpYWxvZwotICAgICAgICAgICAgICAgIG5ldyBDb2xvcihkLCAyMzAsIDIyNiwgMjIxKSB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3Bvc2VzIG9mIHRoZSBjb2xvcnMuIElnbm9yZSBhbGwgc3lzdGVtIGNvbG9ycyBhcyB0aGV5IGRvIG5vdCBuZWVkIHRvCi0gICAgICogYmUgZGlzcG9zZWQuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotICAgICAgICBpZiAoIWluaXQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgZGlzcG9zZVdvcmtiZW5jaENvbG9ycygpOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBjb2xvck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIENvbG9yIGNsciA9IChDb2xvcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY2xyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbHIuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29sb3JNYXAuY2xlYXIoKTsKLSAgICAgICAgc3lzdGVtQ29sb3JNYXAuY2xlYXIoKTsKLSAgICAgICAgaW5pdCA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBjb2xvcnMuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0gICAgICAgIGlmIChpbml0KQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGNhY2hlcyBmaXJzdC4KLSAgICAgICAgaW5pdCA9IHRydWU7Ci0gICAgICAgIGNvbG9yTWFwID0gbmV3IEhhc2hNYXAoMTApOwotICAgICAgICBzeXN0ZW1Db2xvck1hcCA9IG5ldyBIYXNoTWFwKDEwKTsKLQotICAgICAgICBpbml0V29ya2JlbmNoQ29sb3JzKERpc3BsYXkuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgLy8gRGVmaW5lIGFjdGl2ZSB2aWV3IGdyYWRpZW50IHVzaW5nIHNhbWUgT1MgdGl0bGUgZ3JhZGllbnQgY29sb3JzLgotICAgICAgICBDb2xvciBjbHIxID0gZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1RJVExFX0JBQ0tHUk9VTkQpOwotICAgICAgICBDb2xvciBjbHIyID0gZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1RJVExFX0JBQ0tHUk9VTkRfR1JBRElFTlQpOwotICAgICAgICBDb2xvciBjbHIzID0gZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKTsKLSAgICAgICAgc3lzdGVtQ29sb3JNYXAucHV0KENMUl9WSUVXX0dSQURfU1RBUlQsIGNscjEpOwotICAgICAgICBzeXN0ZW1Db2xvck1hcC5wdXQoQ0xSX1ZJRVdfR1JBRF9FTkQsIGNscjMpOwotICAgICAgICBhY3RpdmVWaWV3R3JhZGllbnQgPSBuZXcgQ29sb3JbXSB7IGNscjEsIGNscjIsIGNscjMgfTsKLSAgICAgICAgYWN0aXZlVmlld1BlcmNlbnRhZ2VzID0gbmV3IGludFtdIHsgNTAsIDEwMCB9OwotCi0gICAgICAgIC8vIERlZmluZSBhY3RpdmUgZWRpdG9yIGdyYWRpZW50IHVzaW5nIHNhbWUgT1MgdGl0bGUgZ3JhZGllbnQgY29sb3JzLgotICAgICAgICBzeXN0ZW1Db2xvck1hcC5wdXQoQ0xSX0VESVRPUl9HUkFEX1NUQVJULCBjbHIxKTsKLSAgICAgICAgc3lzdGVtQ29sb3JNYXAucHV0KENMUl9FRElUT1JfR1JBRF9FTkQsIG51bGwpOyAvLyB1c2Ugd2lkZ2V0IGRlZmF1bHQKLSAgICAgICAgLy8gYmFja2dyb3VuZAotICAgICAgICBhY3RpdmVFZGl0b3JHcmFkaWVudCA9IG5ldyBDb2xvcltdIHsgY2xyMSwgY2xyMiwgbnVsbCwgbnVsbCB9OwotICAgICAgICBhY3RpdmVFZGl0b3JQZXJjZW50YWdlcyA9IG5ldyBpbnRbXSB7IDUwLCA5MCwgMTAwIH07Ci0KLSAgICAgICAgLy8gRGVmaW5lIGFjdGl2ZSBubyBmb2N1cyBlZGl0b3IgZ3JhZGllbnQKLSAgICAgICAgYWN0aXZlTm9Gb2N1c0VkaXRvckdyYWRpZW50ID0gbmV3IENvbG9yW10geyBnZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSB9OwotICAgICAgICBhY3RpdmVOb0ZvY3VzRWRpdG9yUGVyY2VudGFnZXMgPSBuZXcgaW50WzBdOwotCi0gICAgICAgIC8vIERlZmluZSB2aWV3IGdyYWRpZW50IGZvciBkZWFjdGl2YXRlZCB3aW5kb3cgdXNpbmcgc2FtZSBPUyB0aXRsZQotICAgICAgICAvLyBncmFkaWVudCBjb2xvcnMuCi0gICAgICAgIGNscjEgPSBnZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfVElUTEVfSU5BQ1RJVkVfQkFDS0dST1VORCk7Ci0gICAgICAgIGNscjIgPSBnZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfVElUTEVfSU5BQ1RJVkVfQkFDS0dST1VORF9HUkFESUVOVCk7Ci0gICAgICAgIGNscjMgPSBnZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpOwotICAgICAgICBkZWFjdGl2YXRlZFZpZXdHcmFkaWVudCA9IG5ldyBDb2xvcltdIHsgY2xyMSwgY2xyMiwgY2xyMyB9OwotICAgICAgICBkZWFjdGl2YXRlZFZpZXdQZXJjZW50YWdlcyA9IG5ldyBpbnRbXSB7IDcwLCAxMDAgfTsKLQotICAgICAgICAvLyBEZWZpbmUgZWRpdG9yIGdyYWRpZW50IGZvciBkZWFjdGl2YXRlZCB3aW5kb3cgdXNpbmcgc2FtZSBPUyB0aXRsZQotICAgICAgICAvLyBncmFkaWVudCBjb2xvcnMuCi0gICAgICAgIGRlYWN0aXZhdGVkRWRpdG9yR3JhZGllbnQgPSBuZXcgQ29sb3JbXSB7IGNscjEsIGNscjIsIG51bGwsIG51bGwgfTsKLSAgICAgICAgZGVhY3RpdmF0ZWRFZGl0b3JQZXJjZW50YWdlcyA9IG5ldyBpbnRbXSB7IDcwLCA5NSwgMTAwIH07Ci0KLSAgICAgICAgLy8gUHJlbG9hZC4KLSAgICAgICAgZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKTsKLSAgICAgICAgZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL3IyMS9SMjFQcmVzZW50YXRpb25NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvUjIxUHJlc2VudGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyYTc5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL3IyMS9SMjFQcmVzZW50YXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMucjIxOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aGljaCBoZWxwcyBtYW5hZ2luZyBtZXNzYWdlcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUjIxUHJlc2VudGF0aW9uTWVzc2FnZXMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLnIyMS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlCi0gICAgICAgICAgICAuZ2V0QnVuZGxlKFJFU09VUkNFX0JVTkRMRSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHBhcmFtIGFyZ3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIGFyZ3VtZW50cwotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugb2JqZWN0IHdpdGggdGhlIGdpdmVuIGtleSBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLiBJZgotICAgICAqIHRoZXJlIGlzbid0IGFueSB2YWx1ZSB1bmRlciB0aGUgZ2l2ZW4ga2V5LCB0aGUga2V5IGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4ga2V5OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugb2JqZWN0IHdpdGggdGhlIGdpdmVuIGtleSBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLiBJZgotICAgICAqIHRoZXJlIGlzbid0IGFueSB2YWx1ZSB1bmRlciB0aGUgZ2l2ZW4ga2V5LCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqIEBwYXJhbSBkZWYKLSAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBkZWYpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvUjIxUHJlc2VudGF0aW9uUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL3IyMS9SMjFQcmVzZW50YXRpb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxMjYwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL3IyMS9SMjFQcmVzZW50YXRpb25QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLnIyMTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBSMjFQcmVzZW50YXRpb25QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLSAgICAvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAgcHJpdmF0ZSBzdGF0aWMgUjIxUHJlc2VudGF0aW9uUGx1Z2luIHBsdWdpbjsKLQotICAgIC8vUmVzb3VyY2UgYnVuZGxlLgotICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFIyMVByZXNlbnRhdGlvblBsdWdpbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUKLSAgICAgICAgICAgICAgICAgICAgLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucjIxcHJlc2VudGF0aW9uLlIyMWxvb2tQbHVnaW5SZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUjIxUHJlc2VudGF0aW9uUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLSAgICAgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSMjFQcmVzZW50YXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlQnVuZGxlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBrZXk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgUjIxQ29sb3JzLnN0YXJ0dXAoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgICAgICBSMjFDb2xvcnMuc2h1dGRvd24oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL3IyMS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM1NDdjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL3IyMS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIHBhY2thZ2U6IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnIyMXByZXNlbnRhdGlvbgotCi1CYXNpY1N0YWNrUHJlc2VudGF0aW9uLm1lbnUudG9vbHRpcD1NZW51Ci1CYXNpY1N0YWNrUHJlc2VudGF0aW9uLmNsb3NlLnRvb2x0aXA9Q2xvc2UKLUJhc2ljU3RhY2tQcmVzZW50YXRpb24ucGFuZT0mUGFuZQotCi1WaWV3UGFuZS5tb3ZlVmlldz0mVmlldwotRWRpdG9yUGFuZS5tb3ZlRWRpdG9yPSZFZGl0b3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ByZXNlbnRhdGlvbnMvcjIxL3dpZGdldHMvQ1RhYkZvbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvd2lkZ2V0cy9DVGFiRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYjYzMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvd2lkZ2V0cy9DVGFiRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLnIyMS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UeXBlZExpc3RlbmVyOwotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGltcGxlbWVudCB0aGUgbm90ZWJvb2sgdXNlciBpbnRlcmZhY2UKLSAqIG1ldGFwaG9yLiAgSXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIG5vdGVib29rIHBhZ2UgZnJvbQotICogc2V0IG9mIHBhZ2VzLgotICogPHA+Ci0gKiBUaGUgaXRlbSBjaGlsZHJlbiB0aGF0IG1heSBiZSBhZGRlZCB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcwotICogbXVzdCBiZSBvZiB0eXBlIDxjb2RlPkNUYWJJdGVtPC9jb2RlPi4KLSAqIDxjb2RlPkNvbnRyb2w8L2NvZGU+IGNoaWxkcmVuIGFyZSBjcmVhdGVkIGFuZCB0aGVuIHNldCBpbnRvIGEKLSAqIHRhYiBpdGVtIHVzaW5nIDxjb2RlPkNUYWJJdGVtI3NldENvbnRyb2w8L2NvZGU+LgotICogPC9wPjxwPgotICogTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LAotICogaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBzZXQgYSBsYXlvdXQgb24gaXQuCi0gKiA8L3A+PHA+Ci0gKiA8ZGw+Ci0gKiA8ZHQ+PGI+U3R5bGVzOjwvYj48L2R0PgotICogPGRkPlRPUCwgQk9UVE9NLCBGTEFUPC9kZD4KLSAqIDxkdD48Yj5FdmVudHM6PC9iPjwvZHQ+Ci0gKiA8ZGQ+U2VsZWN0aW9uPC9kZD4KLSAqIDxkZD4iQ1RhYkZvbGRlciI8L2RkPgotICogPC9kbD4KLSAqIDxwPgotICogTm90ZTogT25seSBvbmUgb2YgdGhlIHN0eWxlcyBUT1AgYW5kIEJPVFRPTSAKLSAqIG1heSBiZSBzcGVjaWZpZWQuCi0gKiA8L3A+PHA+Ci0gKiBJTVBPUlRBTlQ6IFRoaXMgY2xhc3MgaXMgPGVtPm5vdDwvZW0+IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKi8KLQotcHVibGljIGNsYXNzIENUYWJGb2xkZXIgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0gICAgLyoqCi0gICAgICogbWFyZ2luV2lkdGggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIG9mIGhvcml6b250YWwgbWFyZ2luCi0gICAgICogdGhhdCB3aWxsIGJlIHBsYWNlZCBhbG9uZyB0aGUgbGVmdCBhbmQgcmlnaHQgZWRnZXMgb2YgdGhlIGZvcm0uCi0gICAgICoKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgbWFyZ2luV2lkdGggPSAwOwotCi0gICAgLyoqCi0gICAgICogbWFyZ2luSGVpZ2h0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHBpeGVscyBvZiB2ZXJ0aWNhbCBtYXJnaW4KLSAgICAgKiB0aGF0IHdpbGwgYmUgcGxhY2VkIGFsb25nIHRoZSB0b3AgYW5kIGJvdHRvbSBlZGdlcyBvZiB0aGUgZm9ybS4KLSAgICAgKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuCi0gICAgICovCi0gICAgcHVibGljIGludCBtYXJnaW5IZWlnaHQgPSAwOwotCi0gICAgLyoqCi0gICAgICogQ29sb3Igb2YgaW5uZXJtb3N0IGxpbmUgb2YgZHJvcCBzaGFkb3cgYm9yZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUkdCIGJvcmRlckluc2lkZVJHQiA9IG5ldyBSR0IoMTMyLCAxMzAsIDEzMik7Ci0KLSAgICAvKioKLSAgICAgKiBDb2xvciBvZiBtaWRkbGUgbGluZSBvZiBkcm9wIHNoYWRvdyBib3JkZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSR0IgYm9yZGVyTWlkZGxlUkdCID0gbmV3IFJHQigxNDMsIDE0MSwgMTM4KTsKLQotICAgIC8qKgotICAgICAqIENvbG9yIG9mIG91dGVybW9zdCBsaW5lIG9mIGRyb3Agc2hhZG93IGJvcmRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJHQiBib3JkZXJPdXRzaWRlUkdCID0gbmV3IFJHQigxNzEsIDE2OCwgMTY1KTsKLQotICAgIC8qCi0gICAgICogQSBtdWx0aXBsZSBvZiB0aGUgdGFiIGhlaWdodCB0aGF0IHNwZWNpZmllcyB0aGUgbWluaW11bSB3aWR0aCB0byB3aGljaCBhIHRhYiAKLSAgICAgKiB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIHNjcm9sbGluZyBhcnJvd3MgYXJlIHVzZWQgdG8gbmF2aWdhdGUgdGhlIHRhYnMuCi0gICAgICovCi0gICAgcHVibGljIGludCBNSU5fVEFCX1dJRFRIID0gMzsKLQotICAgIC8qIHNpemluZywgcG9zaXRpb25pbmcgKi8KLSAgICBpbnQgeENsaWVudCwgeUNsaWVudDsKLQotICAgIGJvb2xlYW4gb25Cb3R0b20gPSBmYWxzZTsKLQotICAgIGJvb2xlYW4gZml4ZWRUYWJIZWlnaHQ7Ci0KLSAgICBpbnQgdGFiSGVpZ2h0OwotCi0gICAgLyogaXRlbSBtYW5hZ2VtZW50ICovCi0gICAgcHJpdmF0ZSBDVGFiSXRlbSBpdGVtc1tdID0gbmV3IENUYWJJdGVtWzBdOwotCi0gICAgcHJpdmF0ZSBpbnQgc2VsZWN0ZWRJbmRleCA9IC0xOwotCi0gICAgaW50IHRvcFRhYkluZGV4ID0gLTE7IC8vIGluZGV4IG9mIHRoZSBsZWZ0IG1vc3QgdmlzaWJsZSB0YWIuCi0KLSAgICAvKiBFeHRlcm5hbCBMaXN0ZW5lciBtYW5hZ2VtZW50ICovCi0gICAgcHJpdmF0ZSBDVGFiRm9sZGVyTGlzdGVuZXJbXSB0YWJMaXN0ZW5lcnMgPSBuZXcgQ1RhYkZvbGRlckxpc3RlbmVyWzBdOwotCi0gICAgLyogQ29sb3IgYXBwZWFyYW5jZSAqLwotICAgIEltYWdlIGJhY2tncm91bmRJbWFnZTsKLQotICAgIENvbG9yW10gZ3JhZGllbnRDb2xvcnM7Ci0KLSAgICBpbnRbXSBncmFkaWVudFBlcmNlbnRzOwotCi0gICAgQ29sb3Igc2VsZWN0aW9uRm9yZWdyb3VuZDsKLQotICAgIENvbG9yIGJhY2tncm91bmQ7Ci0KLSAgICAvLyBpbnRlcm5hbCBjb25zdGFudHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XSURUSCA9IDY0OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUID0gNjQ7Ci0KLSAgICAvLyBzY3JvbGxpbmcgYXJyb3dzCi0gICAgcHJpdmF0ZSBUb29sQmFyIGFycm93QmFyOwotCi0gICAgcHJpdmF0ZSBJbWFnZSBhcnJvd0xlZnRJbWFnZTsKLQotICAgIHByaXZhdGUgSW1hZ2UgYXJyb3dSaWdodEltYWdlOwotCi0gICAgcHJpdmF0ZSBDb250cm9sIHRvcFJpZ2h0OwotCi0gICAgLy8gY2xvc2UgYnV0dG9uCi0gICAgYm9vbGVhbiBzaG93Q2xvc2UgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgSW1hZ2UgY2xvc2VJbWFnZTsKLQotICAgIFRvb2xCYXIgY2xvc2VCYXI7Ci0KLSAgICBwcml2YXRlIFRvb2xCYXIgaW5hY3RpdmVDbG9zZUJhcjsKLQotICAgIHByaXZhdGUgQ1RhYkl0ZW0gaW5hY3RpdmVJdGVtOwotCi0gICAgLy8gYm9yZGVycwotICAgIGJvb2xlYW4gc2hvd0JvcmRlcnMgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgaW50IGJvcmRlckJvdHRvbSA9IDA7Ci0KLSAgICBwcml2YXRlIGludCBib3JkZXJMZWZ0ID0gMDsKLQotICAgIHByaXZhdGUgaW50IGJvcmRlclJpZ2h0ID0gMDsKLQotICAgIHByaXZhdGUgaW50IGJvcmRlclRvcCA9IDA7Ci0KLSAgICBwcml2YXRlIENvbG9yIGJvcmRlckNvbG9yMTsKLQotICAgIHByaXZhdGUgQ29sb3IgYm9yZGVyQ29sb3IyOwotCi0gICAgcHJpdmF0ZSBDb2xvciBib3JkZXJDb2xvcjM7Ci0KLSAgICAvLyB3aGVuIGRpc3Bvc2luZyBDVGFiRm9sZGVyLCBkb24ndCB0cnkgdG8gbGF5b3V0IHRoZSBpdGVtcyBvciAKLSAgICAvLyBjaGFuZ2UgdGhlIHNlbGVjdGlvbiBhcyBlYWNoIGNoaWxkIGlzIGRlc3Ryb3llZC4KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5EaXNwb3NlID0gZmFsc2U7Ci0KLSAgICAvLyBrZWVwIHRyYWNrIG9mIHNpemUgY2hhbmdlcyBpbiBvcmRlciB0byByZWRyYXcgb25seSBhZmZlY3RlZCBhcmVhCi0gICAgLy8gb24gUmVzaXplCi0gICAgcHJpdmF0ZSBQb2ludCBvbGRTaXplOwotCi0gICAgcHJpdmF0ZSBGb250IG9sZEZvbnQ7Ci0KLSAgICAvLyBpbnNlcnRpb24gbWFya2VyCi0gICAgaW50IGluc2VydGlvbkluZGV4ID0gLTI7IC8vIEluZGV4IG9mIGluc2VydCBtYXJrZXIuICBNYXJrZXIgYWx3YXlzIHNob3duIGFmdGVyIGluZGV4LgotCi0gICAgLy8gLTIgbWVhbnMgbm8gaW5zZXJ0IG1hcmtlcgotCi0gICAgLy8gdG9vbCB0aXAKLSAgICBwcml2YXRlIFNoZWxsIHRpcDsKLQotICAgIHByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvd1Rvb2xUaXAgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgQ1RhYkl0ZW0gdG9vbFRpcEl0ZW07Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gaXRzIHBhcmVudAotICAgICAqIGFuZCBhIHN0eWxlIHZhbHVlIGRlc2NyaWJpbmcgaXRzIGJlaGF2aW9yIGFuZCBhcHBlYXJhbmNlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzdHlsZSB2YWx1ZSBpcyBlaXRoZXIgb25lIG9mIHRoZSBzdHlsZSBjb25zdGFudHMgZGVmaW5lZCBpbgotICAgICAqIGNsYXNzIDxjb2RlPlNXVDwvY29kZT4gd2hpY2ggaXMgYXBwbGljYWJsZSB0byBpbnN0YW5jZXMgb2YgdGhpcwotICAgICAqIGNsYXNzLCBvciBtdXN0IGJlIGJ1aWx0IGJ5IDxlbT5iaXR3aXNlIE9SPC9lbT4naW5nIHRvZ2V0aGVyIAotICAgICAqICh0aGF0IGlzLCB1c2luZyB0aGUgPGNvZGU+aW50PC9jb2RlPiAifCIgb3BlcmF0b3IpIHR3byBvciBtb3JlCi0gICAgICogb2YgdGhvc2UgPGNvZGU+U1dUPC9jb2RlPiBzdHlsZSBjb25zdGFudHMuIFRoZSBjbGFzcyBkZXNjcmlwdGlvbgotICAgICAqIGxpc3RzIHRoZSBzdHlsZSBjb25zdGFudHMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgY2xhc3MuCi0gICAgICogU3R5bGUgYml0cyBhcmUgYWxzbyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiB3aWRnZXQgdG8gY29uc3RydWN0Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgcGFyZW50IGlzIG51bGw8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHBhcmVudDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgU1dUI1RPUAotICAgICAqIEBzZWUgU1dUI0JPVFRPTQotICAgICAqIEBzZWUgU1dUI0ZMQVQKLSAgICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAgICovCi0gICAgcHVibGljIENUYWJGb2xkZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgY2hlY2tTdHlsZShzdHlsZSkpOwotCi0gICAgICAgIG9uQm90dG9tID0gKGdldFN0eWxlKCkgJiBTV1QuQk9UVE9NKSAhPSAwOwotCi0gICAgICAgIGJvcmRlckNvbG9yMSA9IG5ldyBDb2xvcihnZXREaXNwbGF5KCksIGJvcmRlckluc2lkZVJHQik7Ci0gICAgICAgIGJvcmRlckNvbG9yMiA9IG5ldyBDb2xvcihnZXREaXNwbGF5KCksIGJvcmRlck1pZGRsZVJHQik7Ci0gICAgICAgIGJvcmRlckNvbG9yMyA9IG5ldyBDb2xvcihnZXREaXNwbGF5KCksIGJvcmRlck91dHNpZGVSR0IpOwotCi0gICAgICAgIC8vIHRvb2wgdGlwIHN1cHBvcnQKLSAgICAgICAgdGlwID0gbmV3IFNoZWxsKGdldFNoZWxsKCksIFNXVC5PTl9UT1ApOwotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbCh0aXAsIFNXVC5DRU5URVIpOwotCi0gICAgICAgIC8vIEFkZCBhbGwgbGlzdGVuZXJzCi0gICAgICAgIExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5EaXNwb3NlOgotICAgICAgICAgICAgICAgICAgICBvbkRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTV1QuUGFpbnQ6Ci0gICAgICAgICAgICAgICAgICAgIG9uUGFpbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5SZXNpemU6Ci0gICAgICAgICAgICAgICAgICAgIG9uUmVzaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1dULk1vdXNlRG91YmxlQ2xpY2s6Ci0gICAgICAgICAgICAgICAgICAgIG9uTW91c2VEb3VibGVDbGljayhldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1dULk1vdXNlRG93bjoKLSAgICAgICAgICAgICAgICAgICAgb25Nb3VzZURvd24oZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5Nb3VzZUV4aXQ6Ci0gICAgICAgICAgICAgICAgICAgIG9uTW91c2VFeGl0KGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTV1QuTW91c2VIb3ZlcjoKLSAgICAgICAgICAgICAgICAgICAgb25Nb3VzZUhvdmVyKGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTV1QuTW91c2VNb3ZlOgotICAgICAgICAgICAgICAgICAgICBvbk1vdXNlTW92ZShldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1dULkZvY3VzSW46Ci0gICAgICAgICAgICAgICAgICAgIG9uRm9jdXMoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5Gb2N1c091dDoKLSAgICAgICAgICAgICAgICAgICAgb25Gb2N1cyhldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1dULktleURvd246Ci0gICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bihldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1dULlRyYXZlcnNlOgotICAgICAgICAgICAgICAgICAgICBvblRyYXZlcnNlKGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGludFtdIGZvbGRlckV2ZW50cyA9IG5ldyBpbnRbXSB7IFNXVC5EaXNwb3NlLCBTV1QuUGFpbnQsIFNXVC5SZXNpemUsCi0gICAgICAgICAgICAgICAgU1dULk1vdXNlRG91YmxlQ2xpY2ssIFNXVC5Nb3VzZURvd24sIFNXVC5Nb3VzZUV4aXQsCi0gICAgICAgICAgICAgICAgU1dULk1vdXNlSG92ZXIsIFNXVC5Nb3VzZU1vdmUsIFNXVC5Gb2N1c0luLCBTV1QuRm9jdXNPdXQsCi0gICAgICAgICAgICAgICAgU1dULktleURvd24sIFNXVC5UcmF2ZXJzZSwgfTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb2xkZXJFdmVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFkZExpc3RlbmVyKGZvbGRlckV2ZW50c1tpXSwgbGlzdGVuZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgY3JlYXRlQXJyb3dCYXIoKTsKLSAgICAgICAgY3JlYXRlQ2xvc2VCYXIoKTsKLQotICAgICAgICBzZXRCb3JkZXJWaXNpYmxlKChzdHlsZSAmIFNXVC5CT1JERVIpICE9IDApOwotCi0gICAgICAgIGluaXRBY2Nlc3NpYmxlKCk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tTdHlsZShpbnQgc3R5bGUpIHsKLSAgICAgICAgaW50IG1hc2sgPSBTV1QuVE9QIHwgU1dULkJPVFRPTSB8IFNXVC5GTEFUIHwgU1dULkxFRlRfVE9fUklHSFQKLSAgICAgICAgICAgICAgICB8IFNXVC5SSUdIVF9UT19MRUZUOwotICAgICAgICBzdHlsZSA9IHN0eWxlICYgbWFzazsKLSAgICAgICAgLy8gVE9QIGFuZCBCT1RUT00gYXJlIG11dHVhbGx5IGV4bHVzaXZlLgotICAgICAgICAvLyBUT1AgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgaWYgKChzdHlsZSAmIFNXVC5UT1ApICE9IDApCi0gICAgICAgICAgICBzdHlsZSA9IHN0eWxlICYgfihTV1QuVE9QIHwgU1dULkJPVFRPTSkgfCBTV1QuVE9QOwotICAgICAgICAvLyByZWR1Y2UgdGhlIGZsYXNoIGJ5IG5vdCByZWRyYXdpbmcgdGhlIGVudGlyZSBhcmVhIG9uIGEgUmVzaXplIGV2ZW50Ci0gICAgICAgIHN0eWxlIHw9IFNXVC5OT19SRURSQVdfUkVTSVpFOwotICAgICAgICByZXR1cm4gc3R5bGU7Ci0gICAgfQotCi0gICAgLyoqCSAKLSAgICAgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU1dURXJyb3IgPHVsPgotICAgICAqCQk8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIHdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZDwvbGk+Ci0gICAgICoJCTxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAJCTxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gICAgICoJPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgICAgICAgfQotICAgICAgICBUeXBlZExpc3RlbmVyIHR5cGVkTGlzdGVuZXIgPSBuZXcgVHlwZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHR5cGVkTGlzdGVuZXIpOwotICAgICAgICBhZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgdHlwZWRMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsCi0gICAgICogYmUgbm90aWZpZWQgd2hlbiBhIHRhYiBpdGVtIGlzIGNsb3NlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gICAgICoJCTxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1Mgd2hlbiBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkPC9saT4KLSAgICAgKgkJPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCB3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgQ1RhYkZvbGRlckxpc3RlbmVyCi0gICAgICogQHNlZSAjcmVtb3ZlQ1RhYkZvbGRlckxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ1RhYkZvbGRlckxpc3RlbmVyKENUYWJGb2xkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gICAgICAgIC8vIGFkZCB0byBhcnJheQotICAgICAgICBDVGFiRm9sZGVyTGlzdGVuZXJbXSBuZXdUYWJMaXN0ZW5lcnMgPSBuZXcgQ1RhYkZvbGRlckxpc3RlbmVyW3RhYkxpc3RlbmVycy5sZW5ndGggKyAxXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0YWJMaXN0ZW5lcnMsIDAsIG5ld1RhYkxpc3RlbmVycywgMCwKLSAgICAgICAgICAgICAgICB0YWJMaXN0ZW5lcnMubGVuZ3RoKTsKLSAgICAgICAgdGFiTGlzdGVuZXJzID0gbmV3VGFiTGlzdGVuZXJzOwotICAgICAgICB0YWJMaXN0ZW5lcnNbdGFiTGlzdGVuZXJzLmxlbmd0aCAtIDFdID0gbGlzdGVuZXI7Ci0gICAgICAgIHNob3dDbG9zZSA9IHRydWU7Ci0gICAgICAgIHNldEJ1dHRvbkJvdW5kcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjbG9zZU5vdGlmeShDVGFiSXRlbSBpdGVtLCBpbnQgdGltZSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIENUYWJGb2xkZXJFdmVudCBldmVudCA9IG5ldyBDVGFiRm9sZGVyRXZlbnQodGhpcyk7Ci0gICAgICAgIGV2ZW50LndpZGdldCA9IHRoaXM7Ci0gICAgICAgIGV2ZW50LnRpbWUgPSB0aW1lOwotICAgICAgICBldmVudC5pdGVtID0gaXRlbTsKLSAgICAgICAgZXZlbnQuZG9pdCA9IHRydWU7Ci0gICAgICAgIGlmICh0YWJMaXN0ZW5lcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0YWJMaXN0ZW5lcnNbaV0uaXRlbUNsb3NlZChldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2ZW50LmRvaXQpIHsKLSAgICAgICAgICAgIGl0ZW0uZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaW50IG1pbldpZHRoID0gMDsKLSAgICAgICAgaW50IG1pbkhlaWdodCA9IDA7Ci0KLSAgICAgICAgLy8gcHJlZmVycmVkIHdpZHRoIG9mIHRhYiBhcmVhIHRvIHNob3cgYWxsIHRhYnMKLSAgICAgICAgR0MgZ2MgPSBuZXcgR0ModGhpcyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG1pbldpZHRoICs9IGl0ZW1zW2ldLnByZWZlcnJlZFdpZHRoKGdjKTsKLSAgICAgICAgfQotICAgICAgICBnYy5kaXNwb3NlKCk7Ci0KLSAgICAgICAgLy8gcHJlZmVycmVkIHNpemUgb2YgY29udHJvbHMgaW4gdGFiIGl0ZW1zCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCA9IGl0ZW1zW2ldLmdldENvbnRyb2woKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgUG9pbnQgc2l6ZSA9IGNvbnRyb2wuY29tcHV0ZVNpemUod0hpbnQsIGhIaW50KTsKLSAgICAgICAgICAgICAgICBtaW5XaWR0aCA9IE1hdGgubWF4KG1pbldpZHRoLCBzaXplLngpOwotICAgICAgICAgICAgICAgIG1pbkhlaWdodCA9IE1hdGgubWF4KG1pbkhlaWdodCwgc2l6ZS55KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobWluV2lkdGggPT0gMCkKLSAgICAgICAgICAgIG1pbldpZHRoID0gREVGQVVMVF9XSURUSDsKLSAgICAgICAgaWYgKG1pbkhlaWdodCA9PSAwKQotICAgICAgICAgICAgbWluSGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7Ci0KLSAgICAgICAgaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUKQotICAgICAgICAgICAgbWluV2lkdGggPSB3SGludDsKLSAgICAgICAgaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQotICAgICAgICAgICAgbWluSGVpZ2h0ID0gaEhpbnQ7Ci0KLSAgICAgICAgUmVjdGFuZ2xlIHRyaW0gPSBjb21wdXRlVHJpbSgwLCAwLCBtaW5XaWR0aCwgbWluSGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0cmltLndpZHRoLCB0cmltLmhlaWdodCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlY3RhbmdsZSBjb21wdXRlVHJpbShpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIGlmICghc2hvd0JvcmRlcnMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBpbnQgdHJpbVggPSB4IC0gYm9yZGVyUmlnaHQgLSAxOwotICAgICAgICAgICAgaW50IHRyaW1ZID0geSAtIGJvcmRlckJvdHRvbSAtIDE7Ci0gICAgICAgICAgICBpbnQgdHJpbVdpZHRoID0gd2lkdGggKyBib3JkZXJSaWdodCArIDI7Ci0gICAgICAgICAgICBpbnQgdHJpbUhlaWdodCA9IGhlaWdodCArIGJvcmRlckJvdHRvbSArIDI7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh0cmltWCwgdHJpbVksIHRyaW1XaWR0aCwgdHJpbUhlaWdodCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgdHJpbVggPSB4IC0gbWFyZ2luV2lkdGggLSBib3JkZXJMZWZ0OwotICAgICAgICAgICAgaW50IHRyaW1ZID0geSAtIG1hcmdpbkhlaWdodCAtIHRhYkhlaWdodCAtIGJvcmRlclRvcCAtIDE7Ci0gICAgICAgICAgICAvLyAtMSBpcyBmb3IgdGhlIGxpbmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgdGFicwotICAgICAgICAgICAgaWYgKG9uQm90dG9tKSB7Ci0gICAgICAgICAgICAgICAgdHJpbVkgPSB5IC0gbWFyZ2luSGVpZ2h0IC0gYm9yZGVyVG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHRyaW1XaWR0aCA9IHdpZHRoICsgYm9yZGVyTGVmdCArIGJvcmRlclJpZ2h0ICsgMiAqIG1hcmdpbldpZHRoOwotICAgICAgICAgICAgaW50IHRyaW1IZWlnaHQgPSBoZWlnaHQgKyBib3JkZXJUb3AgKyBib3JkZXJCb3R0b20gKyAyCi0gICAgICAgICAgICAgICAgICAgICogbWFyZ2luSGVpZ2h0ICsgdGFiSGVpZ2h0ICsgMTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKHRyaW1YLCB0cmltWSwgdHJpbVdpZHRoLCB0cmltSGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgc3BlY2lmaWVkIGl0ZW0gYXQgJ2luZGV4Jy4KLSAgICAgKi8KLSAgICB2b2lkIGNyZWF0ZUl0ZW0oQ1RhYkl0ZW0gaXRlbSwgaW50IGluZGV4KSB7Ci0gICAgICAgIGlmICgwID4gaW5kZXggfHwgaW5kZXggPiBnZXRJdGVtQ291bnQoKSkgewotICAgICAgICAgICAgU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX1JBTkdFKTsKLSAgICAgICAgfQotICAgICAgICAvLyBncm93IGJ5IG9uZSBhbmQgcmVhcnJhbmdlIHRoZSBhcnJheS4KLSAgICAgICAgQ1RhYkl0ZW1bXSBuZXdJdGVtcyA9IG5ldyBDVGFiSXRlbVtpdGVtcy5sZW5ndGggKyAxXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShpdGVtcywgMCwgbmV3SXRlbXMsIDAsIGluZGV4KTsKLSAgICAgICAgbmV3SXRlbXNbaW5kZXhdID0gaXRlbTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShpdGVtcywgaW5kZXgsIG5ld0l0ZW1zLCBpbmRleCArIDEsIGl0ZW1zLmxlbmd0aAotICAgICAgICAgICAgICAgIC0gaW5kZXgpOwotICAgICAgICBpdGVtcyA9IG5ld0l0ZW1zOwotCi0gICAgICAgIGl0ZW0ucGFyZW50ID0gdGhpczsKLQotICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSBpbmRleCkgewotICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgdG9wVGFiSW5kZXggPSAwOwotICAgICAgICAgICAgcmVzZXRUYWJTaXplKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0SXRlbUJvdW5kcygpOwotICAgICAgICAgICAgc2hvd0l0ZW0oaXRlbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIHJlZHJhdygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVkcmF3VGFiQXJlYSgtMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQXJyb3dCYXIoKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhcnJvdyBidXR0b25zIGZvciBzY3JvbGxpbmcgCi0gICAgICAgIGFycm93QmFyID0gbmV3IFRvb2xCYXIodGhpcywgU1dULkZMQVQpOwotICAgICAgICBhcnJvd0Jhci5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgYXJyb3dCYXIuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLSAgICAgICAgVG9vbEl0ZW0gc2Nyb2xsTGVmdCA9IG5ldyBUb29sSXRlbShhcnJvd0JhciwgU1dULlBVU0gpOwotICAgICAgICBzY3JvbGxMZWZ0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBUb29sSXRlbSBzY3JvbGxSaWdodCA9IG5ldyBUb29sSXRlbShhcnJvd0JhciwgU1dULlBVU0gpOwotICAgICAgICBzY3JvbGxSaWdodC5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICBzY3JvbGxMZWZ0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgc2Nyb2xsX3Njcm9sbExlZnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHNjcm9sbFJpZ2h0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgc2Nyb2xsX3Njcm9sbFJpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNsb3NlQmFyKCkgewotICAgICAgICBjbG9zZUJhciA9IG5ldyBUb29sQmFyKHRoaXMsIFNXVC5GTEFUKTsKLSAgICAgICAgY2xvc2VCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIGlmIChncmFkaWVudENvbG9ycyAhPSBudWxsICYmIGdyYWRpZW50Q29sb3JzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGNsb3NlQmFyLnNldEJhY2tncm91bmQoZ3JhZGllbnRDb2xvcnNbZ3JhZGllbnRDb2xvcnMubGVuZ3RoIC0gMV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xvc2VCYXIuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLSAgICAgICAgfQotICAgICAgICBUb29sSXRlbSBjbG9zZUl0ZW0gPSBuZXcgVG9vbEl0ZW0oY2xvc2VCYXIsIFNXVC5QVVNIKTsKLQotICAgICAgICBpbmFjdGl2ZUNsb3NlQmFyID0gbmV3IFRvb2xCYXIodGhpcywgU1dULkZMQVQpOwotICAgICAgICBpbmFjdGl2ZUNsb3NlQmFyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICBpbmFjdGl2ZUNsb3NlQmFyLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0gICAgICAgIFRvb2xJdGVtIGluYWN0aXZlQ2xvc2VJdGVtID0gbmV3IFRvb2xJdGVtKGluYWN0aXZlQ2xvc2VCYXIsIFNXVC5QVVNIKTsKLQotICAgICAgICBjbG9zZUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBjbG9zZU5vdGlmeShnZXRTZWxlY3Rpb24oKSwgZXZlbnQudGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpbmFjdGl2ZUNsb3NlSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGNsb3NlTm90aWZ5KGluYWN0aXZlSXRlbSwgZXZlbnQudGltZSk7Ci0gICAgICAgICAgICAgICAgaW5hY3RpdmVDbG9zZUJhci5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpbmFjdGl2ZUl0ZW0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaW5hY3RpdmVDbG9zZUJhci5hZGRMaXN0ZW5lcihTV1QuTW91c2VFeGl0LCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChpbmFjdGl2ZUl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGUgaXRlbUJvdW5kcyA9IGluYWN0aXZlSXRlbS5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1Cb3VuZHMuY29udGFpbnMoZXZlbnQueCwgZXZlbnQueSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluYWN0aXZlQ2xvc2VCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaW5hY3RpdmVJdGVtID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXN0cm95IHRoZSBzcGVjaWZpZWQgaXRlbS4KLSAgICAgKi8KLSAgICB2b2lkIGRlc3Ryb3lJdGVtKENUYWJJdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKGluRGlzcG9zZSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpbnQgaW5kZXggPSBpbmRleE9mKGl0ZW0pOwotICAgICAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICAgICAgICByZXR1cm47IC8vIHNob3VsZCB0aGlzIHRyaWdnZXIgYW4gZXJyb3I/Ci0KLSAgICAgICAgaW5zZXJ0aW9uSW5kZXggPSAtMjsKLQotICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIGl0ZW1zID0gbmV3IENUYWJJdGVtWzBdOwotICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IC0xOwotICAgICAgICAgICAgdG9wVGFiSW5kZXggPSAwOwotCi0gICAgICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBpdGVtLmdldENvbnRyb2woKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsb3NlQmFyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgaWYgKCFmaXhlZFRhYkhlaWdodCkKLSAgICAgICAgICAgICAgICB0YWJIZWlnaHQgPSAwOwotICAgICAgICAgICAgcmVkcmF3KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzaHJpbmsgYnkgb25lIGFuZCByZWFycmFuZ2UgdGhlIGFycmF5LgotICAgICAgICBDVGFiSXRlbVtdIG5ld0l0ZW1zID0gbmV3IENUYWJJdGVtW2l0ZW1zLmxlbmd0aCAtIDFdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCBuZXdJdGVtcywgMCwgaW5kZXgpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCBpbmRleCArIDEsIG5ld0l0ZW1zLCBpbmRleCwgaXRlbXMubGVuZ3RoCi0gICAgICAgICAgICAgICAgLSBpbmRleCAtIDEpOwotICAgICAgICBpdGVtcyA9IG5ld0l0ZW1zOwotCi0gICAgICAgIGlmICh0b3BUYWJJbmRleCA9PSBpdGVtcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIC0tdG9wVGFiSW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtb3ZlIHRoZSBzZWxlY3Rpb24gaWYgdGhpcyBpdGVtIGlzIHNlbGVjdGVkCi0gICAgICAgIGlmIChzZWxlY3RlZEluZGV4ID09IGluZGV4KSB7Ci0gICAgICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBpdGVtLmdldENvbnRyb2woKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbGVjdGVkSW5kZXggPSAtMTsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvbihNYXRoLm1heCgwLCBpbmRleCAtIDEpLCB0cnVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEluZGV4ID4gaW5kZXgpIHsKLSAgICAgICAgICAgIHNlbGVjdGVkSW5kZXgtLTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldEl0ZW1Cb3VuZHMoKTsKLSAgICAgICAgcmVkcmF3VGFiQXJlYSgtMSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uS2V5RG93bihFdmVudCBlKSB7Ci0gICAgICAgIGlmIChlLmtleUNvZGUgIT0gU1dULkFSUk9XX0xFRlQgJiYgZS5rZXlDb2RlICE9IFNXVC5BUlJPV19SSUdIVCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaW50IGxlYWRLZXkgPSAoZ2V0U3R5bGUoKSAmIFNXVC5NSVJST1JFRCkgIT0gMCA/IFNXVC5BUlJPV19SSUdIVAotICAgICAgICAgICAgICAgIDogU1dULkFSUk9XX0xFRlQ7Ci0gICAgICAgIGlmIChlLmtleUNvZGUgPT0gbGVhZEtleSkgewotICAgICAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKHNlbGVjdGVkSW5kZXggLSAxLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZEluZGV4IDwgaXRlbXMubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIHNldFNlbGVjdGlvbihzZWxlY3RlZEluZGV4ICsgMSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlIHRoZSBpdGVtcyBvZiB0aGUgcmVjZWl2ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25EaXNwb3NlKCkgewotICAgICAgICAvKgotICAgICAgICAgKiBVc3VhbGx5IHdoZW4gYW4gaXRlbSBpcyBkaXNwb3NlZCwgZGVzdHJveUl0ZW0gd2lsbCBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGl0ZW1zIGFycmF5LCAKLSAgICAgICAgICogcmVzZXQgdGhlIGJvdW5kcyBvZiBhbGwgdGhlIHRhYnMgYW5kIG1hbmFnZSB0aGUgd2lkZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFiLgotICAgICAgICAgKiBTaW5jZSB0aGUgd2hvbGUgZm9sZGVyIGlzIGJlaW5nIGRpc3Bvc2VkLCB0aGlzIGlzIG5vdCBuZWNlc3NhcnkuICBGb3Igc3BlZWQKLSAgICAgICAgICogdGhlIGluRGlzcG9zZSBmbGFnIGlzIHVzZWQgdG8gc2tpcCBvdmVyIHRoaXMgcGFydCBvZiB0aGUgaXRlbSBkaXNwb3NlLgotICAgICAgICAgKi8KLSAgICAgICAgaW5EaXNwb3NlID0gdHJ1ZTsKLQotICAgICAgICBpbnQgbGVuZ3RoID0gaXRlbXMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbXNbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNsZWFuIHVwIHJlc291cmNlcwotICAgICAgICBpZiAodGlwICE9IG51bGwgJiYgIXRpcC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHRpcC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB0aXAgPSBudWxsOwotICAgICAgICAgICAgbGFiZWwgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFycm93TGVmdEltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBhcnJvd0xlZnRJbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIGFycm93TGVmdEltYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKGFycm93UmlnaHRJbWFnZSAhPSBudWxsKQotICAgICAgICAgICAgYXJyb3dSaWdodEltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgYXJyb3dSaWdodEltYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKGNsb3NlSW1hZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIGNsb3NlSW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICBjbG9zZUltYWdlID0gbnVsbDsKLQotICAgICAgICBncmFkaWVudENvbG9ycyA9IG51bGw7Ci0gICAgICAgIGdyYWRpZW50UGVyY2VudHMgPSBudWxsOwotICAgICAgICBiYWNrZ3JvdW5kSW1hZ2UgPSBudWxsOwotCi0gICAgICAgIGlmIChib3JkZXJDb2xvcjEgIT0gbnVsbCkKLSAgICAgICAgICAgIGJvcmRlckNvbG9yMS5kaXNwb3NlKCk7Ci0gICAgICAgIGJvcmRlckNvbG9yMSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGJvcmRlckNvbG9yMiAhPSBudWxsKQotICAgICAgICAgICAgYm9yZGVyQ29sb3IyLmRpc3Bvc2UoKTsKLSAgICAgICAgYm9yZGVyQ29sb3IyID0gbnVsbDsKLQotICAgICAgICBpZiAoYm9yZGVyQ29sb3IzICE9IG51bGwpCi0gICAgICAgICAgICBib3JkZXJDb2xvcjMuZGlzcG9zZSgpOwotICAgICAgICBib3JkZXJDb2xvcjMgPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkZvY3VzKEV2ZW50IGUpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPj0gMCkgewotICAgICAgICAgICAgcmVkcmF3VGFiQXJlYShzZWxlY3RlZEluZGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvbigwLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBEcmF3IGEgYm9yZGVyIGFyb3VuZCB0aGUgcmVjZWl2ZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRyYXdCb3JkZXIoR0MgZ2MpIHsKLQotICAgICAgICBSZWN0YW5nbGUgZCA9IHN1cGVyLmdldENsaWVudEFyZWEoKTsKLQotICAgICAgICBpZiAoc2hvd0JvcmRlcnMpIHsKLSAgICAgICAgICAgIGlmICgoZ2V0U3R5bGUoKSAmIFNXVC5GTEFUKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChib3JkZXJDb2xvcjEpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdSZWN0YW5nbGUoZC54LCBkLnksIGQueCArIGQud2lkdGggLSAxLCBkLnkgKyBkLmhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgLSAxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChib3JkZXJDb2xvcjEpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdSZWN0YW5nbGUoZC54LCBkLnksIGQueCArIGQud2lkdGggLSAzLCBkLnkgKyBkLmhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgLSAzKTsKLQotICAgICAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IyKTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZShkLnggKyAxLCBkLnkgKyBkLmhlaWdodCAtIDIsIGQueCArIGQud2lkdGggLSAxLCBkLnkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZC5oZWlnaHQgLSAyKTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZShkLnggKyBkLndpZHRoIC0gMiwgZC55ICsgMSwgZC54ICsgZC53aWR0aCAtIDIsIGQueQotICAgICAgICAgICAgICAgICAgICAgICAgKyBkLmhlaWdodCAtIDEpOwotCi0gICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChib3JkZXJDb2xvcjMpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKGQueCArIDIsIGQueSArIGQuaGVpZ2h0IC0gMSwgZC54ICsgZC53aWR0aCAtIDIsIGQueQotICAgICAgICAgICAgICAgICAgICAgICAgKyBkLmhlaWdodCAtIDEpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKGQueCArIGQud2lkdGggLSAxLCBkLnkgKyAyLCBkLnggKyBkLndpZHRoIC0gMSwgZC55Ci0gICAgICAgICAgICAgICAgICAgICAgICArIGQuaGVpZ2h0IC0gMik7Ci0KLSAgICAgICAgICAgICAgICAvLyBmaWxsIGluIGNvcm5lcnMgd2l0aCBwYXJlbnQncyBiYWNrZ3JvdW5kCi0gICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChnZXRQYXJlbnQoKS5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKGQueCArIGQud2lkdGggLSAyLCBkLnksIGQueCArIGQud2lkdGggLSAxLCBkLnkpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKGQueCArIGQud2lkdGggLSAxLCBkLnkgKyAxLCBkLnggKyBkLndpZHRoIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGQueSArIDEpOwotCi0gICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoZC54LCBkLnkgKyBkLmhlaWdodCAtIDIsIGQueCwgZC55ICsgZC5oZWlnaHQgLSAyKTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZShkLngsIGQueSArIGQuaGVpZ2h0IC0gMSwgZC54ICsgMSwgZC55ICsgZC5oZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gMSk7Ci0KLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZShkLnggKyBkLndpZHRoIC0gMSwgZC55ICsgZC5oZWlnaHQgLSAxLCBkLngKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZC53aWR0aCAtIDEsIGQueSArIGQuaGVpZ2h0IC0gMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRyYXcgYSBzZXBhcmF0b3IgbGluZQotICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgaW50IGxpbmVZID0gZC55ICsgYm9yZGVyVG9wICsgdGFiSGVpZ2h0OwotICAgICAgICAgICAgaWYgKG9uQm90dG9tKSB7Ci0gICAgICAgICAgICAgICAgbGluZVkgPSBkLnkgKyBkLmhlaWdodCAtIGJvcmRlckJvdHRvbSAtIHRhYkhlaWdodCAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGJvcmRlckNvbG9yMSk7Ci0gICAgICAgICAgICBnYy5kcmF3TGluZShkLnggKyBib3JkZXJMZWZ0LCBsaW5lWSwgZC54ICsgZC53aWR0aCAtIGJvcmRlclJpZ2h0LAotICAgICAgICAgICAgICAgICAgICBsaW5lWSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlY3RhbmdsZSBnZXRDbGllbnRBcmVhKCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBQb2ludCBzaXplID0gZ2V0U2l6ZSgpOwotICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIGlmICghc2hvd0JvcmRlcnMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgIGludCB3aWR0aCA9IHNpemUueCAtIGJvcmRlclJpZ2h0IC0gMjsKLSAgICAgICAgICAgIGludCBoZWlnaHQgPSBzaXplLnkgLSBib3JkZXJCb3R0b20gLSAyOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUoYm9yZGVyUmlnaHQgKyAxLCBib3JkZXJCb3R0b20gKyAxLCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCB3aWR0aCA9IHNpemUueCAtIDIgKiBtYXJnaW5XaWR0aCAtIGJvcmRlckxlZnQgLSBib3JkZXJSaWdodDsKLSAgICAgICAgICAgIGludCBoZWlnaHQgPSBzaXplLnkgLSAyICogbWFyZ2luSGVpZ2h0IC0gYm9yZGVyVG9wIC0gYm9yZGVyQm90dG9tCi0gICAgICAgICAgICAgICAgICAgIC0gdGFiSGVpZ2h0IC0gMTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKHhDbGllbnQsIHlDbGllbnQsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSB0YWIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIHRhYgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gU1dURXJyb3IgPHVsPgotICAgICAqCQk8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIHdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZDwvbGk+Ci0gICAgICoJCTxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKgk8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VGFiSGVpZ2h0KCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICByZXR1cm4gdGFiSGVpZ2h0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdGFiIHRoYXQgaXMgbG9jYXRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqLwotICAgIHB1YmxpYyBDVGFiSXRlbSBnZXRJdGVtKGludCBpbmRleCkgewotICAgICAgICAvL2NoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaXRlbXMubGVuZ3RoKQotICAgICAgICAgICAgU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX1JBTkdFKTsKLSAgICAgICAgcmV0dXJuIGl0ZW1zW2luZGV4XTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpdGVtIGF0IGEgcG9pbnQgaW4gdGhlIHdpZGdldC4KLSAgICAgKiA8cD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGl0ZW0gYXQgYSBwb2ludAotICAgICAqLwotICAgIHB1YmxpYyBDVGFiSXRlbSBnZXRJdGVtKFBvaW50IHB0KSB7Ci0gICAgICAgIC8vY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGludCBsYXN0SXRlbSA9IGdldExhc3RJdGVtKCk7Ci0gICAgICAgIGxhc3RJdGVtID0gTWF0aC5taW4oaXRlbXMubGVuZ3RoIC0gMSwgbGFzdEl0ZW0gKyAxKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IHRvcFRhYkluZGV4OyBpIDw9IGxhc3RJdGVtOyBpKyspIHsKLSAgICAgICAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBpdGVtc1tpXS5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgIGlmIChib3VuZHMuY29udGFpbnMocHQpKQotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtc1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0YWJzIGluIHRoZSBmb2xkZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRhYnMgaW4gdGhlIGZvbGRlcgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SXRlbUNvdW50KCkgewotICAgICAgICAvL2NoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIHJldHVybiBpdGVtcy5sZW5ndGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB0YWIgaXRlbXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGFiIGl0ZW1zCi0gICAgICovCi0gICAgcHVibGljIENUYWJJdGVtW10gZ2V0SXRlbXMoKSB7Ci0gICAgICAgIC8vY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgQ1RhYkl0ZW1bXSB0YWJJdGVtcyA9IG5ldyBDVGFiSXRlbVtpdGVtcy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCB0YWJJdGVtcywgMCwgaXRlbXMubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHRhYkl0ZW1zOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldExhc3RJdGVtKCkgewotICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIFJlY3RhbmdsZSBhcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICBpZiAoYXJlYS53aWR0aCA8PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIFJlY3RhbmdsZSB0b29sc3BhY2UgPSBnZXRUb29sU3BhY2UoKTsKLSAgICAgICAgaWYgKHRvb2xzcGFjZS53aWR0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aCAtIDE7Ci0gICAgICAgIGludCB3aWR0aCA9IGFyZWEud2lkdGggLSB0b29sc3BhY2Uud2lkdGg7Ci0gICAgICAgIGludCBpbmRleCA9IHRvcFRhYkluZGV4OwotICAgICAgICBpbnQgdGFiV2lkdGggPSBpdGVtc1tpbmRleF0ud2lkdGg7Ci0gICAgICAgIHdoaWxlIChpbmRleCA8IGl0ZW1zLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgIHRhYldpZHRoICs9IGl0ZW1zW2luZGV4ICsgMV0ud2lkdGg7Ci0gICAgICAgICAgICBpZiAodGFiV2lkdGggPiB3aWR0aCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgc2VsZWN0ZWQgdGFiIGl0ZW0sIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlCi0gICAgICogaXMgbm8gc2VsZWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIHRhYiBpdGVtCi0gICAgICovCi0gICAgcHVibGljIENUYWJJdGVtIGdldFNlbGVjdGlvbigpIHsKLSAgICAgICAgLy9jaGVja1dpZGdldCgpOwotICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gaXRlbXNbc2VsZWN0ZWRJbmRleF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgdGFiIGl0ZW0sIG9yIC0xIGlmIHRoZXJlCi0gICAgICogaXMgbm8gc2VsZWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCB0YWIgaXRlbSBvciAtMQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0gICAgICAgIC8vY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkSW5kZXg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZWN0YW5nbGUgZ2V0VG9vbFNwYWNlKCkgewotICAgICAgICBib29sZWFuIHNob3dBcnJvd3MgPSBzY3JvbGxfbGVmdFZpc2libGUoKSB8fCBzY3JvbGxfcmlnaHRWaXNpYmxlKCk7Ci0gICAgICAgIGlmICghc2hvd0Fycm93cyAmJiB0b3BSaWdodCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCk7Ci0gICAgICAgIFJlY3RhbmdsZSB0b29sc3BhY2U7Ci0gICAgICAgIGlmIChzaG93QXJyb3dzKSB7Ci0gICAgICAgICAgICB0b29sc3BhY2UgPSBhcnJvd0Jhci5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgIHRvb2xzcGFjZS53aWR0aCArPSBib3JkZXJSaWdodDsKLSAgICAgICAgICAgIGlmICh0b3BSaWdodCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRvb2xzcGFjZS53aWR0aCArPSB0b3BSaWdodC5nZXRTaXplKCkueDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRvb2xzcGFjZSA9IHRvcFJpZ2h0LmdldEJvdW5kcygpOwotICAgICAgICAgICAgdG9vbHNwYWNlLndpZHRoICs9IGJvcmRlclJpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b29sc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udHJvbCBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgdGFiIGZvbGRlci4gCi0gICAgICogVHlwaWNhbGx5IHRoaXMgaXMgYSBjbG9zZSBidXR0b24gb3IgYSBjb21wb3NpdGUgd2l0aCBhIG1lbnUgYW5kIGNsb3NlIGJ1dHRvbi4KLSAgICAgKgotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNvbnRyb2wgaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIHRhYiBmb2xkZXIgb3IgbnVsbAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gIFNXVEVycm9yIDx1bD4KLSAgICAgKgkJPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyB3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQ8L2xpPgotICAgICAqCQk8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIHdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICoJPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udHJvbCBnZXRUb3BSaWdodCgpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgcmV0dXJuIHRvcFJpZ2h0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCB0YWIgb3IgLTEgaWYgdGhlIHRhYiBpcyBub3QgCi0gICAgICogaW4gdGhlIHJlY2VpdmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgdGFiIGl0ZW0gb3IgLTEKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEVycm9yIDx1bD4KLSAgICAgKiAgICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gdGhlIGl0ZW0gaXMgbnVsbDwvbGk+Ci0gICAgICoJPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoQ1RhYkl0ZW0gaXRlbSkgewotICAgICAgICAvL2NoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1zW2ldID09IGl0ZW0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0QWNjZXNzaWJsZSgpIHsKLSAgICAgICAgZmluYWwgQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gZ2V0QWNjZXNzaWJsZSgpOwotICAgICAgICBhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGludCBjaGlsZElEID0gZS5jaGlsZElEOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZElEID49IDAgJiYgY2hpbGRJRCA8IGl0ZW1zLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gaXRlbXNbY2hpbGRJRF0uZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoJyYnKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZS5yZXN1bHQgPSBuYW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBnZXRIZWxwKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhlbHAgPSBudWxsOwotICAgICAgICAgICAgICAgIGludCBjaGlsZElEID0gZS5jaGlsZElEOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpIHsKLSAgICAgICAgICAgICAgICAgICAgaGVscCA9IGdldFRvb2xUaXBUZXh0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZElEID49IDAgJiYgY2hpbGRJRCA8IGl0ZW1zLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBoZWxwID0gaXRlbXNbY2hpbGRJRF0uZ2V0VG9vbFRpcFRleHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZS5yZXN1bHQgPSBoZWxwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBnZXRLZXlib2FyZFNob3J0Y3V0KEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNob3J0Y3V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpbnQgY2hpbGRJRCA9IGUuY2hpbGRJRDsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRJRCA+PSAwICYmIGNoaWxkSUQgPCBpdGVtcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBpdGVtc1tjaGlsZElEXS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbW5lbW9uaWMgPSBnZXRNbmVtb25pYyh0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtbmVtb25pYyAhPSAnXDAnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgPSAiQWx0KyIgKyBtbmVtb25pYzsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGUucmVzdWx0ID0gc2hvcnRjdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRBdFBvaW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFBvaW50IHRlc3RQb2ludCA9IHRvQ29udHJvbChuZXcgUG9pbnQoZS54LCBlLnkpKTsKLSAgICAgICAgICAgICAgICBpbnQgY2hpbGRJRCA9IEFDQy5DSElMRElEX05PTkU7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbXNbaV0uZ2V0Qm91bmRzKCkuY29udGFpbnModGVzdFBvaW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRJRCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBsb2NhdGlvbiA9IGdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5oZWlnaHQgPSBsb2NhdGlvbi5oZWlnaHQgLSBnZXRDbGllbnRBcmVhKCkuaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24uY29udGFpbnModGVzdFBvaW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRJRCA9IEFDQy5DSElMRElEX1NFTEY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZS5jaGlsZElEID0gY2hpbGRJRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZ2V0TG9jYXRpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGxvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpbnQgY2hpbGRJRCA9IGUuY2hpbGRJRDsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjaGlsZElEID49IDAgJiYgY2hpbGRJRCA8IGl0ZW1zLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IGl0ZW1zW2NoaWxkSURdLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBQb2ludCBwdCA9IHRvRGlzcGxheShuZXcgUG9pbnQobG9jYXRpb24ueCwgbG9jYXRpb24ueSkpOwotICAgICAgICAgICAgICAgICAgICBlLnggPSBwdC54OwotICAgICAgICAgICAgICAgICAgICBlLnkgPSBwdC55OwotICAgICAgICAgICAgICAgICAgICBlLndpZHRoID0gbG9jYXRpb24ud2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIGUuaGVpZ2h0ID0gbG9jYXRpb24uaGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRDb3VudChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBlLmRldGFpbCA9IGl0ZW1zLmxlbmd0aDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZ2V0RGVmYXVsdEFjdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpbnQgY2hpbGRJRCA9IGUuY2hpbGRJRDsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRJRCA+PSAwICYmIGNoaWxkSUQgPCBpdGVtcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gIlN3aXRjaCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZS5yZXN1bHQgPSBhY3Rpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdldEZvY3VzKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGludCBjaGlsZElEID0gQUNDLkNISUxESURfTk9ORTsKLSAgICAgICAgICAgICAgICBpZiAoaXNGb2N1c0NvbnRyb2woKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRJRCA9IEFDQy5DSElMRElEX1NFTEY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZElEID0gc2VsZWN0ZWRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlLmNoaWxkSUQgPSBjaGlsZElEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBnZXRSb2xlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGludCByb2xlID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgY2hpbGRJRCA9IGUuY2hpbGRJRDsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJvbGUgPSBBQ0MuUk9MRV9UQUJGT0xERVI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZElEID49IDAgJiYgY2hpbGRJRCA8IGl0ZW1zLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByb2xlID0gQUNDLlJPTEVfVEFCSVRFTTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZS5kZXRhaWwgPSByb2xlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBnZXRTZWxlY3Rpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZS5jaGlsZElEID0gKHNlbGVjdGVkSW5kZXggPT0gLTEpID8gQUNDLkNISUxESURfTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgOiBzZWxlY3RlZEluZGV4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBnZXRTdGF0ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSAwOwotICAgICAgICAgICAgICAgIGludCBjaGlsZElEID0gZS5jaGlsZElEOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBBQ0MuU1RBVEVfTk9STUFMOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRJRCA+PSAwICYmIGNoaWxkSUQgPCBpdGVtcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBBQ0MuU1RBVEVfU0VMRUNUQUJMRTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNDb250cm9sKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIHw9IEFDQy5TVEFURV9GT0NVU0FCTEU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPT0gY2hpbGRJRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgfD0gQUNDLlNUQVRFX1NFTEVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNDb250cm9sKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSB8PSBBQ0MuU1RBVEVfRk9DVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlLmRldGFpbCA9IHN0YXRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBnZXRDaGlsZHJlbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBjaGlsZHJlbiA9IG5ldyBPYmplY3RbaXRlbXMubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gbmV3IEludGVnZXIoaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGUuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNGb2N1c0NvbnRyb2woKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJsZS5zZXRGb2N1cyhBQ0MuQ0hJTERJRF9TRUxGKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2libGUuc2V0Rm9jdXMoc2VsZWN0ZWRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGFkZExpc3RlbmVyKFNXVC5Gb2N1c0luLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjY2Vzc2libGUuc2V0Rm9jdXMoQUNDLkNISUxESURfU0VMRik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJsZS5zZXRGb2N1cyhzZWxlY3RlZEluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRCdXR0b25Cb3VuZHMoKSB7Ci0KLSAgICAgICAgdXBkYXRlQXJyb3dCYXIoKTsKLSAgICAgICAgdXBkYXRlQ2xvc2VCYXIoKTsKLQotICAgICAgICBSZWN0YW5nbGUgYXJlYSA9IHN1cGVyLmdldENsaWVudEFyZWEoKTsKLQotICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgICAgaWYgKHRvcFJpZ2h0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBvaW50IHNpemUgPSB0b3BSaWdodC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgdGFiSGVpZ2h0KTsKLSAgICAgICAgICAgIGludCB4ID0gYXJlYS54ICsgYXJlYS53aWR0aCAtIGJvcmRlclJpZ2h0IC0gc2l6ZS54OwotICAgICAgICAgICAgaW50IHkgPSBvbkJvdHRvbSA/IGFyZWEueSArIGFyZWEuaGVpZ2h0IC0gYm9yZGVyQm90dG9tIC0gc2l6ZS55Ci0gICAgICAgICAgICAgICAgICAgIDogYXJlYS55ICsgYm9yZGVyVG9wOwotICAgICAgICAgICAgdG9wUmlnaHQuc2V0Qm91bmRzKHgsIHksIHNpemUueCwgc2l6ZS55KTsKLSAgICAgICAgICAgIG9mZnNldCA9IHNpemUueDsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIGxlZnRWaXNpYmxlID0gc2Nyb2xsX2xlZnRWaXNpYmxlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmlnaHRWaXNpYmxlID0gc2Nyb2xsX3JpZ2h0VmlzaWJsZSgpOwotICAgICAgICBpZiAobGVmdFZpc2libGUgfHwgcmlnaHRWaXNpYmxlKSB7Ci0gICAgICAgICAgICBQb2ludCBzaXplID0gYXJyb3dCYXIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIHRhYkhlaWdodCk7Ci0gICAgICAgICAgICBpbnQgeCA9IGFyZWEueCArIGFyZWEud2lkdGggLSBib3JkZXJSaWdodCAtIHNpemUueCAtIG9mZnNldDsKLSAgICAgICAgICAgIGludCB5ID0gKG9uQm90dG9tKSA/IGFyZWEueSArIGFyZWEuaGVpZ2h0IC0gYm9yZGVyQm90dG9tIC0gc2l6ZS55Ci0gICAgICAgICAgICAgICAgICAgIDogYXJlYS55ICsgYm9yZGVyVG9wOwotCi0gICAgICAgICAgICBhcnJvd0Jhci5zZXRCb3VuZHMoeCwgeSwgc2l6ZS54LCBzaXplLnkpOwotICAgICAgICAgICAgVG9vbEl0ZW1bXSBpdGVtcyA9IGFycm93QmFyLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBpdGVtc1swXS5zZXRFbmFibGVkKGxlZnRWaXNpYmxlKTsKLSAgICAgICAgICAgIGl0ZW1zWzFdLnNldEVuYWJsZWQocmlnaHRWaXNpYmxlKTsKLSAgICAgICAgICAgIGFycm93QmFyLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhcnJvd0Jhci5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdoZW4gdGhlIGNsb3NlIGJ1dHRvbiBpcyByaWdodCBhdCB0aGUgZWRnZSBvZiB0aGUgVGFiIGZvbGRlciwgaGlkZSBpdCBiZWNhdXNlCi0gICAgICAgIC8vIG90aGVyd2lzZSBpdCBtYXkgYmxvY2sgb2ZmIGEgcGFydCBvZiB0aGUgYm9yZGVyIG9uIHRoZSByaWdodAotICAgICAgICBpZiAoc2hvd0Nsb3NlKSB7Ci0gICAgICAgICAgICBpbmFjdGl2ZUNsb3NlQmFyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgQ1RhYkl0ZW0gaXRlbSA9IGdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNsb3NlQmFyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgdG9vbGJhckhlaWdodCA9IHRhYkhlaWdodCAtIENUYWJJdGVtLlRPUF9NQVJHSU4KLSAgICAgICAgICAgICAgICAgICAgICAgIC0gQ1RhYkl0ZW0uQk9UVE9NX01BUkdJTiArIDI7IC8vICsyIHRvIGlnbm9yZSBnYXAgYmV0d2VlbiBmb2N1cyByZWN0YW5nbGUKLSAgICAgICAgICAgICAgICBQb2ludCBzaXplID0gY2xvc2VCYXIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIHRvb2xiYXJIZWlnaHQpOwotICAgICAgICAgICAgICAgIGludCB4ID0gaXRlbS54ICsgaXRlbS53aWR0aCAtIHNpemUueCAtIDI7IC8vIC0yIHRvIG5vdCBvdmVybGFwIGZvY3VzIHJlY3RhbmdsZSBhbmQgdHJpbQotICAgICAgICAgICAgICAgIGludCB5ID0gaXRlbS55ICsgTWF0aC5tYXgoMCwgKGl0ZW0uaGVpZ2h0IC0gdG9vbGJhckhlaWdodCkgLyAyKTsKLSAgICAgICAgICAgICAgICBjbG9zZUJhci5zZXRCb3VuZHMoeCwgeSwgc2l6ZS54LCB0b29sYmFySGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgdG9vbHNwYWNlID0gZ2V0VG9vbFNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgUG9pbnQgZm9sZGVyU2l6ZSA9IGdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSAodG9vbHNwYWNlLndpZHRoID09IDAgfHwgeCA8IHRvb2xzcGFjZS54KQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgeCArIHNpemUueCA8IGZvbGRlclNpemUueCAtIGJvcmRlclJpZ2h0OwotICAgICAgICAgICAgICAgIGNsb3NlQmFyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0SXRlbUxvY2F0aW9uKCkgewotICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFJlY3RhbmdsZSBhcmVhID0gc3VwZXIuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICBpbnQgeCA9IGFyZWEueDsKLSAgICAgICAgaW50IHkgPSBhcmVhLnkgKyBib3JkZXJUb3A7Ci0gICAgICAgIGlmIChvbkJvdHRvbSkKLSAgICAgICAgICAgIHkgPSBNYXRoLm1heCgwLCBhcmVhLnkgKyBhcmVhLmhlaWdodCAtIGJvcmRlckJvdHRvbSAtIHRhYkhlaWdodCk7Ci0KLSAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSB0b3BUYWJJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgZmlyc3QgdmlzaWJsZSB0YWIgaXMgbm90IHRoZSBmaXJzdCB0YWIKLSAgICAgICAgICAgIENUYWJJdGVtIHRhYiA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgeCAtPSB0YWIud2lkdGg7Ci0gICAgICAgICAgICBpZiAoIWNoYW5nZWQgJiYgKHRhYi54ICE9IHggfHwgdGFiLnkgIT0geSkpCi0gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAvLyBsYXlvdXQgdGFiIGl0ZW1zIGZyb20gcmlnaHQgdG8gbGVmdCB0aHVzIG1ha2luZyB0aGVtIGludmlzaWJsZQotICAgICAgICAgICAgdGFiLnggPSB4OwotICAgICAgICAgICAgdGFiLnkgPSB5OwotICAgICAgICB9Ci0KLSAgICAgICAgeCA9IGFyZWEueCArIGJvcmRlckxlZnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSB0b3BUYWJJbmRleDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBjb250aW51ZSBsYXlpbmcgb3V0IHJlbWFpbmluZywgdmlzaWJsZSBpdGVtcyBsZWZ0IHRvIHJpZ2h0IAotICAgICAgICAgICAgQ1RhYkl0ZW0gdGFiID0gaXRlbXNbaV07Ci0gICAgICAgICAgICB0YWIueCA9IHg7Ci0gICAgICAgICAgICB0YWIueSA9IHk7Ci0gICAgICAgICAgICB4ID0geCArIHRhYi53aWR0aDsKLSAgICAgICAgfQotICAgICAgICBzZXRCdXR0b25Cb3VuZHMoKTsKLSAgICAgICAgcmV0dXJuIGNoYW5nZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldExhc3RJdGVtKGludCBpbmRleCkgewotICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gaXRlbXMubGVuZ3RoIC0gMSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgUmVjdGFuZ2xlIGFyZWEgPSBnZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgIGlmIChhcmVhLndpZHRoIDw9IDApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGludCBtYXhXaWR0aCA9IGFyZWEud2lkdGg7Ci0gICAgICAgIFJlY3RhbmdsZSB0b29sc3BhY2UgPSBnZXRUb29sU3BhY2UoKTsKLSAgICAgICAgaWYgKHRvb2xzcGFjZS53aWR0aCA+IDApIHsKLSAgICAgICAgICAgIG1heFdpZHRoIC09IHRvb2xzcGFjZS53aWR0aDsKLSAgICAgICAgfQotICAgICAgICBpbnQgdGFiV2lkdGggPSBpdGVtc1tpbmRleF0ud2lkdGg7Ci0gICAgICAgIHdoaWxlIChpbmRleCA+IDApIHsKLSAgICAgICAgICAgIHRhYldpZHRoICs9IGl0ZW1zW2luZGV4IC0gMV0ud2lkdGg7Ci0gICAgICAgICAgICBpZiAodGFiV2lkdGggPiBtYXhXaWR0aCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGluZGV4LS07Ci0gICAgICAgIH0KLSAgICAgICAgdG9wVGFiSW5kZXggPSBpbmRleDsKLSAgICAgICAgc2V0SXRlbUxvY2F0aW9uKCk7Ci0gICAgICAgIHJlZHJhd1RhYkFyZWEoLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExheW91dCB0aGUgaXRlbXMgYW5kIHN0b3JlIHRoZSBjbGllbnQgYXJlYSBzaXplLgotICAgICAqLwotICAgIGJvb2xlYW4gc2V0SXRlbUJvdW5kcygpIHsKLSAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICByZXR1cm4gY2hhbmdlZDsKLSAgICAgICAgUmVjdGFuZ2xlIGFyZWEgPSBzdXBlci5nZXRDbGllbnRBcmVhKCk7Ci0KLSAgICAgICAgeENsaWVudCA9IGFyZWEueCArIGJvcmRlckxlZnQgKyBtYXJnaW5XaWR0aDsKLSAgICAgICAgaWYgKG9uQm90dG9tKSB7Ci0gICAgICAgICAgICB5Q2xpZW50ID0gYXJlYS55ICsgYm9yZGVyVG9wICsgbWFyZ2luSGVpZ2h0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeUNsaWVudCA9IGFyZWEueSArIGJvcmRlclRvcCArIHRhYkhlaWdodCArIDEgKyBtYXJnaW5IZWlnaHQ7Ci0gICAgICAgICAgICAvLyArMSBpcyBmb3IgdGhlIGxpbmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgdGFicwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFyZWEud2lkdGggPD0gMCB8fCBhcmVhLmhlaWdodCA8PSAwIHx8IGl0ZW1zLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZWQ7Ci0KLSAgICAgICAgaW50W10gd2lkdGhzID0gbmV3IGludFtpdGVtcy5sZW5ndGhdOwotICAgICAgICBHQyBnYyA9IG5ldyBHQyh0aGlzKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgd2lkdGhzW2ldID0gaXRlbXNbaV0ucHJlZmVycmVkV2lkdGgoZ2MpOwotICAgICAgICB9Ci0gICAgICAgIGdjLmRpc3Bvc2UoKTsKLQotICAgICAgICBpbnQgb2xkQXZlcmFnZVdpZHRoID0gMDsKLSAgICAgICAgaW50IGF2ZXJhZ2VXaWR0aCA9IChhcmVhLndpZHRoIC0gYm9yZGVyTGVmdCAtIGJvcmRlclJpZ2h0KQotICAgICAgICAgICAgICAgIC8gaXRlbXMubGVuZ3RoOwotICAgICAgICB3aGlsZSAoYXZlcmFnZVdpZHRoID4gb2xkQXZlcmFnZVdpZHRoKSB7Ci0gICAgICAgICAgICBpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gYm9yZGVyTGVmdCAtIGJvcmRlclJpZ2h0OwotICAgICAgICAgICAgaW50IGNvdW50ID0gaXRlbXMubGVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh3aWR0aHNbaV0gPCBhdmVyYWdlV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgd2lkdGggLT0gd2lkdGhzW2ldOwotICAgICAgICAgICAgICAgICAgICBjb3VudC0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9sZEF2ZXJhZ2VXaWR0aCA9IGF2ZXJhZ2VXaWR0aDsKLSAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBhdmVyYWdlV2lkdGggPSB3aWR0aCAvIGNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGF2ZXJhZ2VXaWR0aCA9IE1hdGgubWF4KGF2ZXJhZ2VXaWR0aCwgTUlOX1RBQl9XSURUSCAqIHRhYkhlaWdodCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh3aWR0aHNbaV0gPiBhdmVyYWdlV2lkdGgpIHsKLSAgICAgICAgICAgICAgICB3aWR0aHNbaV0gPSBhdmVyYWdlV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgdG90YWxXaWR0aCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENUYWJJdGVtIHRhYiA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgaWYgKHRhYi5oZWlnaHQgIT0gdGFiSGVpZ2h0IHx8IHRhYi53aWR0aCAhPSB3aWR0aHNbaV0pCi0gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICB0YWIuaGVpZ2h0ID0gdGFiSGVpZ2h0OwotICAgICAgICAgICAgdGFiLndpZHRoID0gd2lkdGhzW2ldOwotICAgICAgICAgICAgdG90YWxXaWR0aCArPSB3aWR0aHNbaV07Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYXJlYVdpZHRoID0gYXJlYS54ICsgYXJlYS53aWR0aCAtIGJvcmRlclJpZ2h0OwotICAgICAgICBpZiAodG90YWxXaWR0aCA8PSBhcmVhV2lkdGgpIHsKLSAgICAgICAgICAgIHRvcFRhYkluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2V0SXRlbUxvY2F0aW9uKCkpCi0gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLQotICAgICAgICAvLyBJcyB0aGVyZSBhIGdhcCBhZnRlciBsYXN0IGl0ZW0gc2hvd2luZwotICAgICAgICBpZiAoY29ycmVjdExhc3RJdGVtKCkpCi0gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGNoYW5nZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG9uTW5lbW9uaWMoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgY2hhciBrZXkgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBtbmVtb25pYyA9IGdldE1uZW1vbmljKGl0ZW1zW2ldLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1uZW1vbmljICE9ICdcMCcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b1VwcGVyQ2FzZShrZXkpID09IENoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZShtbmVtb25pYykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogUGFpbnQgdGhlIHJlY2VpdmVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblBhaW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IGdldEZvbnQoKTsKLSAgICAgICAgaWYgKG9sZEZvbnQgPT0gbnVsbCB8fCAhb2xkRm9udC5lcXVhbHMoZm9udCkpIHsKLSAgICAgICAgICAgIG9sZEZvbnQgPSBmb250OwotICAgICAgICAgICAgcmVzZXRUYWJTaXplKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIEdDIGdjID0gZXZlbnQuZ2M7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0ID0gc3VwZXIuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIGlmIChzaG93Qm9yZGVycykgewotICAgICAgICAgICAgICAgIGlmICgoZ2V0U3R5bGUoKSAmIFNXVC5GTEFUKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IxKTsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd1JlY3RhbmdsZShyZWN0LngsIHJlY3QueSwgcmVjdC54ICsgcmVjdC53aWR0aCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC55ICsgcmVjdC5oZWlnaHQgLSAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGJvcmRlckNvbG9yMSk7Ci0gICAgICAgICAgICAgICAgICAgIGdjLmRyYXdSZWN0YW5nbGUocmVjdC54LCByZWN0LnksIHJlY3QueCArIHJlY3Qud2lkdGggLSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueSArIHJlY3QuaGVpZ2h0IC0gMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZmlsbCBpbiByaWdodCBhbmQgYm90dG9tIGVkZ2VzIHdpdGggcGFyZW50J3MgYmFja2dyb3VuZAotICAgICAgICAgICAgICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKGdldFBhcmVudCgpLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGdjLmZpbGxSZWN0YW5nbGUocmVjdC54ICsgcmVjdC53aWR0aCAtIDIsIHJlY3QueSwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGdjLmZpbGxSZWN0YW5nbGUocmVjdC54LCByZWN0LnkgKyByZWN0LmhlaWdodCAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53aWR0aCwgMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlZHJhdyB0aGUgQm9yZGVyCi0gICAgICAgIGRyYXdCb3JkZXIoZ2MpOwotCi0gICAgICAgIHJlY3QueCArPSBib3JkZXJMZWZ0OwotICAgICAgICByZWN0LnkgKz0gYm9yZGVyVG9wOwotICAgICAgICByZWN0LndpZHRoIC09IGJvcmRlckxlZnQgKyBib3JkZXJSaWdodDsKLSAgICAgICAgcmVjdC5oZWlnaHQgLT0gYm9yZGVyVG9wICsgYm9yZGVyQm90dG9tOwotICAgICAgICBSZWN0YW5nbGUgY2xpcCA9IGdjLmdldENsaXBwaW5nKCk7Ci0gICAgICAgIGdjLnNldENsaXBwaW5nKGNsaXAuaW50ZXJzZWN0aW9uKHJlY3QpKTsKLQotICAgICAgICAvLyBEcmF3IHRoZSB1bnNlbGVjdGVkIHRhYnMgZmlyc3QuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpICE9IHNlbGVjdGVkSW5kZXgKLSAgICAgICAgICAgICAgICAgICAgJiYgZXZlbnQuZ2V0Qm91bmRzKCkuaW50ZXJzZWN0cyhpdGVtc1tpXS5nZXRCb3VuZHMoKSkpIHsKLSAgICAgICAgICAgICAgICBpdGVtc1tpXS5vblBhaW50KGdjLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2VsZWN0ZWQgdGFiIGNvbWVzIGxhc3QKLSAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgIGl0ZW1zW3NlbGVjdGVkSW5kZXhdLm9uUGFpbnQoZ2MsIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHJhdyBpbnNlcnRpb24gbWFyawotICAgICAgICBpZiAoaW5zZXJ0aW9uSW5kZXggPiAtMikgewotICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoCi0gICAgICAgICAgICAgICAgICAgIFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTikpOwotICAgICAgICAgICAgaWYgKGluc2VydGlvbkluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW1zWzBdLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLngsIGJvdW5kcy55Ci0gICAgICAgICAgICAgICAgICAgICAgICArIGJvdW5kcy5oZWlnaHQgLSAxKTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZShib3VuZHMueCAtIDIsIGJvdW5kcy55LCBib3VuZHMueCArIDIsIGJvdW5kcy55KTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZShib3VuZHMueCAtIDEsIGJvdW5kcy55ICsgMSwgYm91bmRzLnggKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnkgKyAxKTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZShib3VuZHMueCAtIDEsIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMueCArIDEsIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCAtIDIpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKGJvdW5kcy54IC0gMiwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy54ICsgMiwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC0gMSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW1zW2luc2VydGlvbkluZGV4XS5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZShib3VuZHMueCArIGJvdW5kcy53aWR0aCwgYm91bmRzLnksIGJvdW5kcy54Ci0gICAgICAgICAgICAgICAgICAgICAgICArIGJvdW5kcy53aWR0aCwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC0gMSk7Ci0gICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoYm91bmRzLnggKyBib3VuZHMud2lkdGggLSAyLCBib3VuZHMueSwgYm91bmRzLngKLSAgICAgICAgICAgICAgICAgICAgICAgICsgYm91bmRzLndpZHRoICsgMiwgYm91bmRzLnkpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKGJvdW5kcy54ICsgYm91bmRzLndpZHRoIC0gMSwgYm91bmRzLnkgKyAxLCBib3VuZHMueAotICAgICAgICAgICAgICAgICAgICAgICAgKyBib3VuZHMud2lkdGggKyAxLCBib3VuZHMueSArIDEpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKGJvdW5kcy54ICsgYm91bmRzLndpZHRoIC0gMSwgYm91bmRzLnkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgYm91bmRzLmhlaWdodCAtIDIsIGJvdW5kcy54ICsgYm91bmRzLndpZHRoICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCAtIDIpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKGJvdW5kcy54ICsgYm91bmRzLndpZHRoIC0gMiwgYm91bmRzLnkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgYm91bmRzLmhlaWdodCAtIDEsIGJvdW5kcy54ICsgYm91bmRzLndpZHRoICsgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOwotICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZHJhd1RhYkFyZWEoaW50IGluZGV4KSB7Ci0gICAgICAgIGludCB4ID0gMCwgeSA9IDAsIHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgYXJlYSA9IHN1cGVyLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgIGlmIChhcmVhLndpZHRoID09IDAgfHwgYXJlYS5oZWlnaHQgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB3aWR0aCA9IGFyZWEueCArIGFyZWEud2lkdGggLSBib3JkZXJMZWZ0IC0gYm9yZGVyUmlnaHQ7Ci0gICAgICAgICAgICBoZWlnaHQgPSB0YWJIZWlnaHQgKyAxOyAvLyArMSBjYXVzZXMgdG9wIGxpbmUgYmV0d2VlbiBjb250ZW50IGFuZCB0YWJzIHRvIGJlIHJlZHJhd24KLSAgICAgICAgICAgIHggPSBhcmVhLnggKyBib3JkZXJMZWZ0OwotICAgICAgICAgICAgeSA9IGFyZWEueSArIGJvcmRlclRvcDsKLSAgICAgICAgICAgIGlmIChvbkJvdHRvbSkgewotICAgICAgICAgICAgICAgIHkgPSBNYXRoLm1heCgwLCBhcmVhLnkgKyBhcmVhLmhlaWdodCAtIGJvcmRlckJvdHRvbSAtIGhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDVGFiSXRlbSBpdGVtID0gaXRlbXNbaW5kZXhdOwotICAgICAgICAgICAgeCA9IGl0ZW0ueDsKLSAgICAgICAgICAgIHkgPSBpdGVtLnk7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgYXJlYSA9IHN1cGVyLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgIHdpZHRoID0gYXJlYS54ICsgYXJlYS53aWR0aCAtIHg7Ci0gICAgICAgICAgICBoZWlnaHQgPSBpdGVtLmhlaWdodDsKLSAgICAgICAgfQotICAgICAgICByZWRyYXcoeCwgeSwgd2lkdGgsIGhlaWdodCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgkgCi0gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEVycm9yCi0gICAgICoJPHVsPjxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MJd2hlbiBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkPC9saT4KLSAgICAgKiAJCTxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAJCTxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gbGlzdGVuZXIgaXMgbnVsbDwvbGk+PC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgICAgICAgfQotICAgICAgICByZW1vdmVMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0gICAgICAgIHJlbW92ZUxpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCSAKLSAgICAgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU1dURXJyb3IKLSAgICAgKgk8dWw+PGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUwl3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQ8L2xpPgotICAgICAqIAkJPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCB3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqIAkJPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgd2hlbiBsaXN0ZW5lciBpcyBudWxsPC9saT48L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lcihDVGFiRm9sZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpCi0gICAgICAgICAgICBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICAgICAgICBpZiAodGFiTGlzdGVuZXJzLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpbnQgaW5kZXggPSAtMTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PSB0YWJMaXN0ZW5lcnNbaV0pIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAodGFiTGlzdGVuZXJzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICB0YWJMaXN0ZW5lcnMgPSBuZXcgQ1RhYkZvbGRlckxpc3RlbmVyWzBdOwotICAgICAgICAgICAgc2hvd0Nsb3NlID0gZmFsc2U7Ci0gICAgICAgICAgICBzZXRCdXR0b25Cb3VuZHMoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBDVGFiRm9sZGVyTGlzdGVuZXJbXSBuZXdUYWJMaXN0ZW5lcnMgPSBuZXcgQ1RhYkZvbGRlckxpc3RlbmVyW3RhYkxpc3RlbmVycy5sZW5ndGggLSAxXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0YWJMaXN0ZW5lcnMsIDAsIG5ld1RhYkxpc3RlbmVycywgMCwgaW5kZXgpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRhYkxpc3RlbmVycywgaW5kZXggKyAxLCBuZXdUYWJMaXN0ZW5lcnMsIGluZGV4LAotICAgICAgICAgICAgICAgIHRhYkxpc3RlbmVycy5sZW5ndGggLSBpbmRleCAtIDEpOwotICAgICAgICB0YWJMaXN0ZW5lcnMgPSBuZXdUYWJMaXN0ZW5lcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHdpZGdldCB3YXMgcmVzaXplZC4gQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25SZXNpemUoKSB7Ci0KLSAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXRJdGVtQm91bmRzKCkpIHsKLSAgICAgICAgICAgIHJlZHJhd1RhYkFyZWEoLTEpOwotICAgICAgICB9Ci0KLSAgICAgICAgUG9pbnQgc2l6ZSA9IGdldFNpemUoKTsKLSAgICAgICAgaWYgKG9sZFNpemUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVkcmF3KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAob25Cb3R0b20gJiYgc2l6ZS55ICE9IG9sZFNpemUueSkgewotICAgICAgICAgICAgICAgIHJlZHJhdygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgeDEgPSBNYXRoLm1pbihzaXplLngsIG9sZFNpemUueCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUueCAhPSBvbGRTaXplLngpCi0gICAgICAgICAgICAgICAgICAgIHgxIC09IDEwOwotICAgICAgICAgICAgICAgIGludCB5MSA9IE1hdGgubWluKHNpemUueSwgb2xkU2l6ZS55KTsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZS55ICE9IG9sZFNpemUueSkKLSAgICAgICAgICAgICAgICAgICAgeTEgLT0gMTA7Ci0gICAgICAgICAgICAgICAgaW50IHgyID0gTWF0aC5tYXgoc2l6ZS54LCBvbGRTaXplLngpOwotICAgICAgICAgICAgICAgIGludCB5MiA9IE1hdGgubWF4KHNpemUueSwgb2xkU2l6ZS55KTsKLSAgICAgICAgICAgICAgICByZWRyYXcoMCwgeTEsIHgyICsgMTAsIHkyIC0geTEsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZWRyYXcoeDEsIDAsIHgyIC0geDEsIHkyLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgb2xkU2l6ZSA9IHNpemU7Ci0KLSAgICAgICAgLy8gcmVzaXplIGNvbnRlbnQKLSAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCA9IGl0ZW1zW3NlbGVjdGVkSW5kZXhdLmdldENvbnRyb2woKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbC5zZXRCb3VuZHMoZ2V0Q2xpZW50QXJlYSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoQ29sb3IgY29sb3IpIHsKLSAgICAgICAgc3VwZXIuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gICAgICAgIGJhY2tncm91bmQgPSBjb2xvcjsKLSAgICAgICAgLy8gaW5pdCBpbmFjdGl2ZSBjbG9zZSBidXR0b24KLSAgICAgICAgaW5hY3RpdmVDbG9zZUJhci5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQotICAgICAgICAvLyBpbml0IHNjcm9sbCBidXR0b25zCi0gICAgICAgIGFycm93QmFyLnNldEJhY2tncm91bmQoY29sb3IpOwotCi0gICAgICAgIC8vaW5pdCB0b3BSaWdodCBjb250cm9sCi0gICAgICAgIGlmICh0b3BSaWdodCAhPSBudWxsKQotICAgICAgICAgICAgdG9wUmlnaHQuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0KLSAgICAgICAgLy8gaW5pdCBjbG9zZSBidXR0b24KLSAgICAgICAgaWYgKGdyYWRpZW50Q29sb3JzID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsb3NlQmFyLnNldEJhY2tncm91bmQoY29sb3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSBhIGdyYWRpZW50IG9mIGNvbG91cnMgdG8gYmUgZHJhdyBpbiB0aGUgYmFja2dyb3VuZCBvZiB0aGUgc2VsZWN0ZWQgdGFiLgotICAgICAqIEZvciBleGFtcGxlIHRvIGRyYXcgYSBncmFkaWVudCB0aGF0IHZhcmllcyBmcm9tIGRhcmsgYmx1ZSB0byBibHVlIGFuZCB0aGVuIHRvCi0gICAgICogd2hpdGUsIHVzZSB0aGUgZm9sbG93aW5nIGNhbGwgdG8gc2V0QmFja2dyb3VuZDoKLSAgICAgKiA8cHJlPgotICAgICAqCWNmb2xkZXIuc2V0QmFja2dyb3VuZChuZXcgQ29sb3JbXXtkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0JMVUUpLCAKLSAgICAgKgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSksCi0gICAgICoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSwgCi0gICAgICoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKX0sCi0gICAgICoJCSAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7MjUsIDUwLCAxMDB9KTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xvcnMgYW4gYXJyYXkgb2YgQ29sb3IgdGhhdCBzcGVjaWZpZXMgdGhlIGNvbG9ycyB0byBhcHBlYXIgaW4gdGhlIGdyYWRpZW50IAotICAgICAqICAgICAgICAgICAgICAgaW4gb3JkZXIgb2YgYXBwZWFyYW5jZSBsZWZ0IHRvIHJpZ2h0LiAgVGhlIHZhbHVlIDxjb2RlPm51bGw8L2NvZGU+IGNsZWFycyB0aGUKLSAgICAgKiAgICAgICAgICAgICAgIGJhY2tncm91bmQgZ3JhZGllbnQuIFRoZSB2YWx1ZSA8Y29kZT5udWxsPC9jb2RlPiBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGFycmF5IG9mIAotICAgICAqICAgICAgICAgICAgICAgQ29sb3IgdG8gc3BlY2lmeSB0aGUgYmFja2dyb3VuZCBjb2xvci4KLSAgICAgKiBAcGFyYW0gcGVyY2VudHMgYW4gYXJyYXkgb2YgaW50ZWdlcnMgYmV0d2VlbiAwIGFuZCAxMDAgc3BlY2lmeWluZyB0aGUgcGVyY2VudCBvZiB0aGUgd2lkdGggCi0gICAgICogICAgICAgICAgICAgICAgIG9mIHRoZSB3aWRnZXQgYXQgd2hpY2ggdGhlIGNvbG9yIHNob3VsZCBjaGFuZ2UuICBUaGUgc2l6ZSBvZiB0aGUgcGVyY2VudHMgYXJyYXkgbXVzdCBiZSBvbmUgCi0gICAgICogICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgY29sb3JzIGFycmF5LgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gU1dURXJyb3IgPHVsPgotICAgICAqCQk8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIHdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZDwvbGk+Ci0gICAgICoJCTxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKgk8L3VsPgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uQmFja2dyb3VuZChDb2xvcltdIGNvbG9ycywgaW50W10gcGVyY2VudHMpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKGNvbG9ycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocGVyY2VudHMgPT0gbnVsbCB8fCBwZXJjZW50cy5sZW5ndGggIT0gY29sb3JzLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGdldERpc3BsYXkoKS5nZXREZXB0aCgpIDwgMTUpIHsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCB1c2UgZ3JhZGllbnRzIG9uIGxvdyBjb2xvciBkaXNwbGF5cwotICAgICAgICAgICAgICAgIGNvbG9ycyA9IG5ldyBDb2xvcltdIHsgY29sb3JzWzBdIH07Ci0gICAgICAgICAgICAgICAgcGVyY2VudHMgPSBuZXcgaW50W10ge307Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlcmNlbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRzW2ldIDwgMCB8fCBwZXJjZW50c1tpXSA+IDEwMCkgewotICAgICAgICAgICAgICAgICAgICBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgcGVyY2VudHNbaV0gPCBwZXJjZW50c1tpIC0gMV0pIHsKLSAgICAgICAgICAgICAgICAgICAgU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBcmUgdGhlc2Ugc2V0dGluZ3MgdGhlIHNhbWUgYXMgYmVmb3JlPwotICAgICAgICBpZiAoYmFja2dyb3VuZEltYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmICgoZ3JhZGllbnRDb2xvcnMgIT0gbnVsbCkgJiYgKGNvbG9ycyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAmJiAoZ3JhZGllbnRDb2xvcnMubGVuZ3RoID09IGNvbG9ycy5sZW5ndGgpKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzYW1lID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncmFkaWVudENvbG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhZGllbnRDb2xvcnNbaV0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2FtZSA9IGNvbG9yc1tpXSA9PSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2FtZSA9IGdyYWRpZW50Q29sb3JzW2ldLmVxdWFscyhjb2xvcnNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2FtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2FtZSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyYWRpZW50UGVyY2VudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgPSBncmFkaWVudFBlcmNlbnRzW2ldID09IHBlcmNlbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzYW1lKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN0b3JlIHRoZSBuZXcgc2V0dGluZ3MKLSAgICAgICAgaWYgKGNvbG9ycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBncmFkaWVudENvbG9ycyA9IG51bGw7Ci0gICAgICAgICAgICBncmFkaWVudFBlcmNlbnRzID0gbnVsbDsKLSAgICAgICAgICAgIGNsb3NlQmFyLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBncmFkaWVudENvbG9ycyA9IG5ldyBDb2xvcltjb2xvcnMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgKytpKQotICAgICAgICAgICAgICAgIGdyYWRpZW50Q29sb3JzW2ldID0gY29sb3JzW2ldOwotICAgICAgICAgICAgZ3JhZGllbnRQZXJjZW50cyA9IG5ldyBpbnRbcGVyY2VudHMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVyY2VudHMubGVuZ3RoOyArK2kpCi0gICAgICAgICAgICAgICAgZ3JhZGllbnRQZXJjZW50c1tpXSA9IHBlcmNlbnRzW2ldOwotICAgICAgICAgICAgaWYgKGdldERpc3BsYXkoKS5nZXREZXB0aCgpIDwgMTUpCi0gICAgICAgICAgICAgICAgY2xvc2VCYXIuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjbG9zZUJhcgotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEJhY2tncm91bmQoZ3JhZGllbnRDb2xvcnNbZ3JhZGllbnRDb2xvcnMubGVuZ3RoIC0gMV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVmcmVzaCB3aXRoIHRoZSBuZXcgc2V0dGluZ3MKLSAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPiAtMSkKLSAgICAgICAgICAgIHJlZHJhd1RhYkFyZWEoc2VsZWN0ZWRJbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbWFnZSB0byBiZSBkcmF3biBpbiB0aGUgYmFja2dyb3VuZCBvZiB0aGUgc2VsZWN0ZWQgdGFiLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgaW1hZ2UgdG8gYmUgZHJhd24gaW4gdGhlIGJhY2tncm91bmQKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uQmFja2dyb3VuZChJbWFnZSBpbWFnZSkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAoaW1hZ2UgPT0gYmFja2dyb3VuZEltYWdlKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAoaW1hZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZ3JhZGllbnRDb2xvcnMgPSBudWxsOwotICAgICAgICAgICAgZ3JhZGllbnRQZXJjZW50cyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgYmFja2dyb3VuZEltYWdlID0gaW1hZ2U7Ci0gICAgICAgIHJlZHJhd1RhYkFyZWEoc2VsZWN0ZWRJbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBib3JkZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2hvdyB0cnVlIGlmIHRoZSBib3JkZXIgc2hvdWxkIGJlIGRpc3BsYXllZAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCb3JkZXJWaXNpYmxlKGJvb2xlYW4gc2hvdykgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICAvLwlpZiAoc2hvd0JvcmRlcnMgPT0gc2hvdykgcmV0dXJuOwotCi0gICAgICAgIHNob3dCb3JkZXJzID0gc2hvdzsKLSAgICAgICAgaWYgKHNob3dCb3JkZXJzKSB7Ci0gICAgICAgICAgICBpZiAoKGdldFN0eWxlKCkgJiBTV1QuRkxBVCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbSA9IGJvcmRlclRvcCA9IGJvcmRlckxlZnQgPSBib3JkZXJSaWdodCA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJvcmRlckxlZnQgPSBib3JkZXJUb3AgPSAxOwotICAgICAgICAgICAgICAgIGJvcmRlclJpZ2h0ID0gYm9yZGVyQm90dG9tID0gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJvcmRlckJvdHRvbSA9IGJvcmRlclRvcCA9IGJvcmRlckxlZnQgPSBib3JkZXJSaWdodCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgb2xkU2l6ZSA9IG51bGw7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVycyhTV1QuUmVzaXplLCBuZXcgRXZlbnQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9udChGb250IGZvbnQpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKGZvbnQgIT0gbnVsbCAmJiBmb250LmVxdWFscyhnZXRGb250KCkpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdXBlci5zZXRGb250KGZvbnQpOwotICAgICAgICBvbGRGb250ID0gZ2V0Rm9udCgpOwotICAgICAgICByZXNldFRhYlNpemUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWxlY3RlZCB0YWIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBvZiB0aGUgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIHNlbGVjdGVkIHRhYgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKENvbG9yIGNvbG9yKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25Gb3JlZ3JvdW5kID09IGNvbG9yKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAoY29sb3IgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbG9yID0gZ2V0Rm9yZWdyb3VuZCgpOwotICAgICAgICBzZWxlY3Rpb25Gb3JlZ3JvdW5kID0gY29sb3I7Ci0gICAgICAgIGlmIChzZWxlY3RlZEluZGV4ID4gLTEpIHsKLSAgICAgICAgICAgIHJlZHJhd1RhYkFyZWEoc2VsZWN0ZWRJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5IGFuIGluc2VydCBtYXJrZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGFiIGl0ZW0uIAotICAgICAqIAotICAgICAqIEEgdmFsdWUgb2YgbnVsbCB3aWxsIGNsZWFyIHRoZSBtYXJrLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpdGVtIHRoZSBpdGVtIHdpdGggd2hpY2ggdGhlIG1hcmsgaXMgYXNzb2NpYXRlZCBvciBudWxsCi0gICAgICogCi0gICAgICogQHBhcmFtIGFmdGVyIHRydWUgaWYgdGhlIG1hcmsgc2hvdWxkIGJlIGRpc3BsYXllZCBhZnRlciB0aGUgc3BlY2lmaWVkIGl0ZW0KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5zZXJ0TWFyayhDVGFiSXRlbSBpdGVtLCBib29sZWFuIGFmdGVyKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGluZGV4T2YoaXRlbSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0SW5zZXJ0TWFyayhpbmRleCwgYWZ0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3BsYXkgYW4gaW5zZXJ0IG1hcmtlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0YWIgaXRlbS4KLSAgICAgKiAKLSAgICAgKiBBIHZhbHVlIG9mIC0xIHdpbGwgY2xlYXIgdGhlIG1hcmsuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB3aXRoIHdoaWNoIHRoZSBtYXJrIGlzIGFzc29jaWF0ZWQgb3IgbnVsbAotICAgICAqIAotICAgICAqIEBwYXJhbSBhZnRlciB0cnVlIGlmIHRoZSBtYXJrIHNob3VsZCBiZSBkaXNwbGF5ZWQgYWZ0ZXIgdGhlIHNwZWNpZmllZCBpdGVtCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluc2VydE1hcmsoaW50IGluZGV4LCBib29sZWFuIGFmdGVyKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChpbmRleCA8IC0xIHx8IGluZGV4ID49IGdldEl0ZW1Db3VudCgpKSB7Ci0gICAgICAgICAgICBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICBpbmRleCA9IC0yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5kZXggPSBhZnRlciA/IGluZGV4IDogLS1pbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnNlcnRpb25JbmRleCA9PSBpbmRleCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaW50IG9sZEluZGV4ID0gaW5zZXJ0aW9uSW5kZXg7Ci0gICAgICAgIGluc2VydGlvbkluZGV4ID0gaW5kZXg7Ci0gICAgICAgIGlmIChpbmRleCA+IC0xKQotICAgICAgICAgICAgcmVkcmF3VGFiQXJlYShpbmRleCk7Ci0gICAgICAgIGlmIChvbGRJbmRleCA+IDEpCi0gICAgICAgICAgICByZWRyYXdUYWJBcmVhKG9sZEluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgdGFiIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgdGFiIGl0ZW0gdG8gYmUgc2VsZWN0ZWQKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBpbmRleCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGl0ZW1zLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPT0gaW5kZXgpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaW50IG9sZEluZGV4ID0gc2VsZWN0ZWRJbmRleDsKLSAgICAgICAgc2VsZWN0ZWRJbmRleCA9IGluZGV4OwotCi0gICAgICAgIENvbnRyb2wgY29udHJvbCA9IGl0ZW1zW2luZGV4XS5jb250cm9sOwotICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmICFjb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgY29udHJvbC5zZXRCb3VuZHMoZ2V0Q2xpZW50QXJlYSgpKTsKLSAgICAgICAgICAgIGNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvbGRJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgY29udHJvbCA9IGl0ZW1zW29sZEluZGV4XS5jb250cm9sOwotICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBjb250cm9sLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNob3dJdGVtKGl0ZW1zW3NlbGVjdGVkSW5kZXhdKTsKLSAgICAgICAgc2V0QnV0dG9uQm91bmRzKCk7Ci0gICAgICAgIHJlZHJhd1RhYkFyZWEoLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY29udHJvbCB0aGF0IGFwcGVhcnMgaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIHRhYiBmb2xkZXIuCi0gICAgICogVHlwaWNhbGx5IHRoaXMgaXMgYSBjbG9zZSBidXR0b24gb3IgYSBjb21wb3NpdGUgd2l0aCBhIE1lbnUgYW5kIGNsb3NlIGJ1dHRvbi4gCi0gICAgICogVGhlIHRvcFJpZ2h0IGNvbnRyb2wgaXMgb3B0aW9uYWwuICBTZXR0aW5nIHRoZSB0b3AgcmlnaHQgY29udHJvbCB0byBudWxsIHdpbGwgcmVtb3ZlIGl0IGZyb20gdGhlIHRhYiBmb2xkZXIuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRyb2wgdGhlIGNvbnRyb2wgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyIG9yIG51bGwKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgY29udHJvbCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIENUYWJGb2xkZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9wUmlnaHQoQ29udHJvbCBjb250cm9sKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgY29udHJvbC5nZXRQYXJlbnQoKSAhPSB0aGlzKSB7Ci0gICAgICAgICAgICBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotICAgICAgICB9Ci0gICAgICAgIHRvcFJpZ2h0ID0gY29udHJvbDsKLSAgICAgICAgcmVzZXRUYWJTaXplKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3dzIHRoZSBpdGVtLiAgSWYgdGhlIGl0ZW0gaXMgYWxyZWFkeSBzaG93aW5nIGluIHRoZSByZWNlaXZlciwKLSAgICAgKiB0aGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJucy4gIE90aGVyd2lzZSwgdGhlIGl0ZW1zIGFyZSBzY3JvbGxlZCB1bnRpbAotICAgICAqIHRoZSBpdGVtIGlzIHZpc2libGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbSB0aGUgaXRlbSB0byBiZSBzaG93bgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGl0ZW0gaXMgbnVsbDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgaXRlbSBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIENUYWJGb2xkZXIjc2hvd1NlbGVjdGlvbigpCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dJdGVtKENUYWJJdGVtIGl0ZW0pIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkKLSAgICAgICAgICAgIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gICAgICAgIGlmIChpdGVtLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gaW5kZXhPZihpdGVtKTsKLSAgICAgICAgaWYgKGluZGV4IDwgdG9wVGFiSW5kZXgpIHsKLSAgICAgICAgICAgIHRvcFRhYkluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICBzZXRJdGVtTG9jYXRpb24oKTsKLSAgICAgICAgICAgIHJlZHJhd1RhYkFyZWEoLTEpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFJlY3RhbmdsZSBhcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICBpZiAoYXJlYS53aWR0aCA8PSAwKSB7Ci0gICAgICAgICAgICB0b3BUYWJJbmRleCA9IGluZGV4OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCByaWdodEVkZ2UgPSBhcmVhLnggKyBhcmVhLndpZHRoOwotICAgICAgICBSZWN0YW5nbGUgcmVjdCA9IGdldFRvb2xTcGFjZSgpOwotICAgICAgICBpZiAocmVjdC53aWR0aCA+IDApIHsKLSAgICAgICAgICAgIHJpZ2h0RWRnZSAtPSByZWN0LndpZHRoOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtLnggKyBpdGVtLndpZHRoIDwgcmlnaHRFZGdlKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzZXRMYXN0SXRlbShpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvd3MgdGhlIHNlbGVjdGlvbi4gIElmIHRoZSBzZWxlY3Rpb24gaXMgYWxyZWFkeSBzaG93aW5nIGluIHRoZSByZWNlaXZlciwKLSAgICAgKiB0aGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJucy4gIE90aGVyd2lzZSwgdGhlIGl0ZW1zIGFyZSBzY3JvbGxlZCB1bnRpbAotICAgICAqIHRoZSBzZWxlY3Rpb24gaXMgdmlzaWJsZS4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgQ1RhYkZvbGRlciNzaG93SXRlbShDVGFiSXRlbSkKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgIHNob3dJdGVtKGdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNoYXIgZ2V0TW5lbW9uaWMoU3RyaW5nIHN0cmluZykgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBpbnQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB3aGlsZSAoKGluZGV4IDwgbGVuZ3RoKSAmJiAoc3RyaW5nLmNoYXJBdChpbmRleCkgIT0gJyYnKSkKLSAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgaWYgKCsraW5kZXggPj0gbGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiAnXDAnOwotICAgICAgICAgICAgaWYgKHN0cmluZy5jaGFyQXQoaW5kZXgpICE9ICcmJykKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLmNoYXJBdChpbmRleCk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9IHdoaWxlIChpbmRleCA8IGxlbmd0aCk7Ci0gICAgICAgIHJldHVybiAnXDAnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB0YWIgYXQgdGhlIHNwZWNpZmllZCBpdGVtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpdGVtIHRoZSB0YWIgaXRlbSB0byBiZSBzZWxlY3RlZAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiBhcmd1bWVudCBpcyBudWxsPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihDVGFiSXRlbSBpdGVtKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpCi0gICAgICAgICAgICBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICAgICAgICBpbnQgaW5kZXggPSBpbmRleE9mKGl0ZW0pOwotICAgICAgICBzZXRTZWxlY3Rpb24oaW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB0YWIgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uKGludCBpbmRleCwgYm9vbGVhbiBub3RpZnkpIHsKLSAgICAgICAgaW50IG9sZFNlbGVjdGVkSW5kZXggPSBzZWxlY3RlZEluZGV4OwotICAgICAgICBzZXRTZWxlY3Rpb24oaW5kZXgpOwotICAgICAgICBpZiAobm90aWZ5ICYmIHNlbGVjdGVkSW5kZXggIT0gb2xkU2VsZWN0ZWRJbmRleCAmJiBzZWxlY3RlZEluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICAgICAgZXZlbnQuaXRlbSA9IGdldEl0ZW0oc2VsZWN0ZWRJbmRleCk7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbiwgZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbWFnZSBzY2FsZUltYWdlKEltYWdlIGltYWdlLCBpbnQgb2xkU2l6ZSwgaW50IG5ld1NpemUpIHsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotICAgICAgICBDb2xvciBmb3JlZ3JvdW5kID0gZ2V0Rm9yZWdyb3VuZCgpOwotICAgICAgICBDb2xvciBibGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKLSAgICAgICAgQ29sb3IgYmFja2dyb3VuZCA9IGdldEJhY2tncm91bmQoKTsKLSAgICAgICAgUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10geyBmb3JlZ3JvdW5kLmdldFJHQigpLAotICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ2V0UkdCKCksIGJsYWNrLmdldFJHQigpIH0pOwotICAgICAgICBJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShuZXdTaXplLCBuZXdTaXplLCA0LCBwYWxldHRlKTsKLSAgICAgICAgaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAxOwotICAgICAgICBJbWFnZSB0ZW1wID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0gICAgICAgIEdDIGdjID0gbmV3IEdDKHRlbXApOwotICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotICAgICAgICBnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIG5ld1NpemUsIG5ld1NpemUpOwotICAgICAgICBnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIG9sZFNpemUsIG9sZFNpemUsIDAsIDAsIG5ld1NpemUsIG5ld1NpemUpOwotICAgICAgICBnYy5kaXNwb3NlKCk7Ci0gICAgICAgIHJldHVybiB0ZW1wOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDbG9zZUJhcigpIHsKLSAgICAgICAgLy9UZW1wb3JhcnkgY29kZSAtIG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZSB0b29sQmFyIHRyaW0KLSAgICAgICAgaW50IHRvb2xiYXJUcmltID0gNDsKLSAgICAgICAgU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtKCk7Ci0gICAgICAgIGlmICgicGhvdG9uIi5lcXVhbHMocGxhdGZvcm0pKXRvb2xiYXJUcmltID0gNjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoImd0ayIuZXF1YWxzKHBsYXRmb3JtKSl0b29sYmFyVHJpbSA9IDg7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpbnQgbWF4SGVpZ2h0ID0gdGFiSGVpZ2h0IC0gQ1RhYkl0ZW0uVE9QX01BUkdJTgotICAgICAgICAgICAgICAgIC0gQ1RhYkl0ZW0uQk9UVE9NX01BUkdJTiAtIHRvb2xiYXJUcmltOwotICAgICAgICBpZiAobWF4SGVpZ2h0IDwgMykKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaW50IGltYWdlSGVpZ2h0ID0gKG1heEhlaWdodCA8IDkpID8gOSA6IG1heEhlaWdodDsKLQotICAgICAgICBpZiAoY2xvc2VJbWFnZSAhPSBudWxsICYmIGNsb3NlSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChjbG9zZUJhciAhPSBudWxsKQotICAgICAgICAgICAgY2xvc2VCYXIuZGlzcG9zZSgpOwotICAgICAgICBjbG9zZUJhciA9IG51bGw7Ci0gICAgICAgIGlmIChpbmFjdGl2ZUNsb3NlQmFyICE9IG51bGwpCi0gICAgICAgICAgICBpbmFjdGl2ZUNsb3NlQmFyLmRpc3Bvc2UoKTsKLSAgICAgICAgaW5hY3RpdmVDbG9zZUJhciA9IG51bGw7Ci0gICAgICAgIGNyZWF0ZUNsb3NlQmFyKCk7Ci0KLSAgICAgICAgVG9vbEl0ZW0gY2xvc2VJdGVtID0gY2xvc2VCYXIuZ2V0SXRlbXMoKVswXTsKLSAgICAgICAgVG9vbEl0ZW0gaW5hY3RpdmVDbG9zZUl0ZW0gPSBpbmFjdGl2ZUNsb3NlQmFyLmdldEl0ZW1zKClbMF07Ci0KLSAgICAgICAgaWYgKGNsb3NlSW1hZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIGNsb3NlSW1hZ2UuZGlzcG9zZSgpOwotCi0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkoKTsKLSAgICAgICAgQ29sb3IgZm9yZWdyb3VuZCA9IGdldEZvcmVncm91bmQoKTsKLSAgICAgICAgQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7Ci0gICAgICAgIENvbG9yIGJhY2tncm91bmQgPSBnZXRCYWNrZ3JvdW5kKCk7Ci0KLSAgICAgICAgUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10geyBmb3JlZ3JvdW5kLmdldFJHQigpLAotICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ2V0UkdCKCksIGJsYWNrLmdldFJHQigpIH0pOwotICAgICAgICBJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShpbWFnZUhlaWdodCwgaW1hZ2VIZWlnaHQsIDQsCi0gICAgICAgICAgICAgICAgcGFsZXR0ZSk7Ci0gICAgICAgIGltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gMTsKLSAgICAgICAgY2xvc2VJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotICAgICAgICBHQyBnYyA9IG5ldyBHQyhjbG9zZUltYWdlKTsKLSAgICAgICAgZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLSAgICAgICAgZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBpbWFnZUhlaWdodCwgaW1hZ2VIZWlnaHQpOwotICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGJsYWNrKTsKLQotICAgICAgICAvL2RyYXcgYW4gOXg4ICd4JyBjZW50ZXJlZCBpbiBpbWFnZQotICAgICAgICBpbnQgaCA9IChpbWFnZUhlaWdodCAvIDIpICogMjsKLSAgICAgICAgaW50IGluc2V0ID0gKGggLSA4KSAvIDI7Ci0gICAgICAgIGdjLmRyYXdMaW5lKGluc2V0LCBpbnNldCwgaCAtIGluc2V0IC0gMSwgaCAtIGluc2V0IC0gMSk7Ci0gICAgICAgIGdjLmRyYXdMaW5lKGluc2V0ICsgMSwgaW5zZXQsIGggLSBpbnNldCwgaCAtIGluc2V0IC0gMSk7Ci0gICAgICAgIGdjLmRyYXdMaW5lKGluc2V0LCBoIC0gaW5zZXQgLSAxLCBoIC0gaW5zZXQgLSAxLCBpbnNldCk7Ci0gICAgICAgIGdjLmRyYXdMaW5lKGluc2V0ICsgMSwgaCAtIGluc2V0IC0gMSwgaCAtIGluc2V0LCBpbnNldCk7Ci0KLSAgICAgICAgZ2MuZGlzcG9zZSgpOwotCi0gICAgICAgIGlmIChtYXhIZWlnaHQgPCBpbWFnZUhlaWdodCkgewotICAgICAgICAgICAgLy9yZXNjYWxlIGltYWdlCi0gICAgICAgICAgICBJbWFnZSB0ZW1wID0gc2NhbGVJbWFnZShjbG9zZUltYWdlLCBpbWFnZUhlaWdodCwgbWF4SGVpZ2h0KTsKLSAgICAgICAgICAgIGNsb3NlSW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICAgICAgY2xvc2VJbWFnZSA9IHRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgY2xvc2VJdGVtLnNldEltYWdlKGNsb3NlSW1hZ2UpOwotICAgICAgICBpbmFjdGl2ZUNsb3NlSXRlbS5zZXRJbWFnZShjbG9zZUltYWdlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQXJyb3dCYXIoKSB7Ci0gICAgICAgIC8vVGVtcG9yYXJ5IGNvZGUgLSBuZWVkIGEgYmV0dGVyIHdheSB0byBkZXRlcm1pbmUgdG9vbEJhciB0cmltCi0gICAgICAgIGludCB0b29sYmFyVHJpbSA9IDY7IC8vIFdpbmRvd3MgbmVlZHMgNiwgcGhvdG9uIG5lZWRzIDYsIGd0ayBuZWVkcyA4Ci0gICAgICAgIFN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotICAgICAgICBpZiAoImd0ayIuZXF1YWxzKHBsYXRmb3JtKSl0b29sYmFyVHJpbSA9IDg7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpbnQgbWF4SGVpZ2h0ID0gdGFiSGVpZ2h0IC0gdG9vbGJhclRyaW07Ci0gICAgICAgIGlmIChtYXhIZWlnaHQgPCAzKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpbnQgaW1hZ2VIZWlnaHQgPSAobWF4SGVpZ2h0IDwgOSkgPyA5IDogbWF4SGVpZ2h0OwotCi0gICAgICAgIGlmIChhcnJvd0xlZnRJbWFnZSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgYXJyb3dMZWZ0SW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChhcnJvd0JhciAhPSBudWxsKQotICAgICAgICAgICAgYXJyb3dCYXIuZGlzcG9zZSgpOwotICAgICAgICBhcnJvd0JhciA9IG51bGw7Ci0gICAgICAgIGlmIChhcnJvd0xlZnRJbWFnZSAhPSBudWxsKQotICAgICAgICAgICAgYXJyb3dMZWZ0SW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICBpZiAoYXJyb3dSaWdodEltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBhcnJvd1JpZ2h0SW1hZ2UuZGlzcG9zZSgpOwotCi0gICAgICAgIGNyZWF0ZUFycm93QmFyKCk7Ci0gICAgICAgIFRvb2xJdGVtW10gaXRlbXMgPSBhcnJvd0Jhci5nZXRJdGVtcygpOwotICAgICAgICBUb29sSXRlbSBsZWZ0ID0gaXRlbXNbMF07Ci0gICAgICAgIFRvb2xJdGVtIHJpZ2h0ID0gaXRlbXNbMV07Ci0KLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotICAgICAgICBDb2xvciBmb3JlZ3JvdW5kID0gZ2V0Rm9yZWdyb3VuZCgpOwotICAgICAgICBDb2xvciBibGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKLSAgICAgICAgQ29sb3IgYmFja2dyb3VuZCA9IGdldEJhY2tncm91bmQoKTsKLQotICAgICAgICBQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7IGZvcmVncm91bmQuZ2V0UkdCKCksCi0gICAgICAgICAgICAgICAgYmFja2dyb3VuZC5nZXRSR0IoKSwgYmxhY2suZ2V0UkdCKCkgfSk7Ci0gICAgICAgIEltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKDcsIGltYWdlSGVpZ2h0LCA0LCBwYWxldHRlKTsKLSAgICAgICAgaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAxOwotICAgICAgICBhcnJvd0xlZnRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotICAgICAgICBHQyBnYyA9IG5ldyBHQyhhcnJvd0xlZnRJbWFnZSk7Ci0gICAgICAgIGdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0gICAgICAgIGdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgNywgaW1hZ2VIZWlnaHQpOwotICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKGJsYWNrKTsKLSAgICAgICAgLy9kcmF3IGEgOXg1ICc8JyBjZW50ZXJlZCB2ZXJ0aWNhbGx5IGluIGltYWdlCi0gICAgICAgIGludCBoID0gKGltYWdlSGVpZ2h0IC8gMikgKiAyOwotICAgICAgICBpbnQgbWlkcG9pbnQgPSBoIC8gMiAtIDE7Ci0gICAgICAgIGludFtdIHBvaW50QXJyID0gbmV3IGludFtdIHsgNiwgbWlkcG9pbnQgLSA1LCAxLCBtaWRwb2ludCwgNiwKLSAgICAgICAgICAgICAgICBtaWRwb2ludCArIDUsIH07Ci0gICAgICAgIGdjLmZpbGxQb2x5Z29uKHBvaW50QXJyKTsKLSAgICAgICAgZ2MuZGlzcG9zZSgpOwotCi0gICAgICAgIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHsgZm9yZWdyb3VuZC5nZXRSR0IoKSwKLSAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdldFJHQigpLCBibGFjay5nZXRSR0IoKSB9KTsKLSAgICAgICAgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSg3LCBpbWFnZUhlaWdodCwgNCwgcGFsZXR0ZSk7Ci0gICAgICAgIGltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gMTsKLSAgICAgICAgYXJyb3dSaWdodEltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0gICAgICAgIGdjID0gbmV3IEdDKGFycm93UmlnaHRJbWFnZSk7Ci0gICAgICAgIGdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0gICAgICAgIGdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgNywgaW1hZ2VIZWlnaHQpOwotICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKGJsYWNrKTsKLSAgICAgICAgLy9kcmF3IGEgOXg1ICc+JyBjZW50ZXJlZCB2ZXJ0aWNhbGx5IGluIGltYWdlCi0gICAgICAgIHBvaW50QXJyID0gbmV3IGludFtdIHsgMSwgbWlkcG9pbnQgLSA1LCA2LCBtaWRwb2ludCwgMSwgbWlkcG9pbnQgKyA1LCB9OwotICAgICAgICBnYy5maWxsUG9seWdvbihwb2ludEFycik7Ci0gICAgICAgIGdjLmRpc3Bvc2UoKTsKLQotICAgICAgICBpZiAobWF4SGVpZ2h0IDwgaW1hZ2VIZWlnaHQpIHsKLSAgICAgICAgICAgIC8vcmVzY2FsZSBpbWFnZQotICAgICAgICAgICAgSW1hZ2UgbGVmdFRlbXAgPSBzY2FsZUltYWdlKGFycm93TGVmdEltYWdlLCBpbWFnZUhlaWdodCwgbWF4SGVpZ2h0KTsKLSAgICAgICAgICAgIGFycm93TGVmdEltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGFycm93TGVmdEltYWdlID0gbGVmdFRlbXA7Ci0KLSAgICAgICAgICAgIEltYWdlIHJpZ2h0VGVtcCA9IHNjYWxlSW1hZ2UoYXJyb3dSaWdodEltYWdlLCBpbWFnZUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0KTsKLSAgICAgICAgICAgIGFycm93UmlnaHRJbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBhcnJvd1JpZ2h0SW1hZ2UgPSByaWdodFRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgbGVmdC5zZXRJbWFnZShhcnJvd0xlZnRJbWFnZSk7Ci0gICAgICAgIHJpZ2h0LnNldEltYWdlKGFycm93UmlnaHRJbWFnZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uTW91c2VEb3VibGVDbGljayhFdmVudCBldmVudCkgewotICAgICAgICBFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGUuaXRlbSA9IGdldEl0ZW0obmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBlKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQSBtb3VzZSBidXR0b24gd2FzIHByZXNzZWQgZG93bi4gCi0gICAgICogSWYgYSB0YWIgd2FzIGhpdCBzZWxlY3QgdGhlIHRhYi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25Nb3VzZURvd24oRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLmdldEJvdW5kcygpLmNvbnRhaW5zKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBzZWxlY3RlZEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3JjZUZvY3VzKCk7Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKGksIHRydWUpOwotICAgICAgICAgICAgICAgIGlmIChpc0ZvY3VzQ29udHJvbCgpKQotICAgICAgICAgICAgICAgICAgICBzZXRGb2N1cygpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbk1vdXNlRXhpdChFdmVudCBldmVudCkgewotICAgICAgICBSZWN0YW5nbGUgaW5hY3RpdmVCb3VuZHMgPSBpbmFjdGl2ZUNsb3NlQmFyLmdldEJvdW5kcygpOwotICAgICAgICBpZiAoaW5hY3RpdmVCb3VuZHMuY29udGFpbnMoZXZlbnQueCwgZXZlbnQueSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGluYWN0aXZlQ2xvc2VCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIGluYWN0aXZlSXRlbSA9IG51bGw7Ci0KLSAgICAgICAgc2hvd1Rvb2xUaXAgPSBmYWxzZTsKLSAgICAgICAgdG9vbFRpcEl0ZW0gPSBudWxsOwotICAgICAgICBpZiAodGlwICE9IG51bGwgJiYgIXRpcC5pc0Rpc3Bvc2VkKCkgJiYgdGlwLmlzVmlzaWJsZSgpKQotICAgICAgICAgICAgdGlwLnNldFZpc2libGUoZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbk1vdXNlSG92ZXIoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKHRpcCA9PSBudWxsIHx8IHRpcC5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHNob3dUb29sVGlwID0gdHJ1ZTsKLSAgICAgICAgc2hvd1Rvb2xUaXAoZXZlbnQueCwgZXZlbnQueSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNob3dUb29sVGlwKGludCB4LCBpbnQgeSkgewotICAgICAgICBDVGFiSXRlbSBpdGVtID0gZ2V0SXRlbShuZXcgUG9pbnQoeCwgeSkpOwotICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbSA9PSB0b29sVGlwSXRlbSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB0b29sVGlwSXRlbSA9IGl0ZW07Ci0gICAgICAgICAgICBTdHJpbmcgdG9vbHRpcCA9IGl0ZW0uZ2V0VG9vbFRpcFRleHQoKTsKLSAgICAgICAgICAgIGlmICh0b29sdGlwICE9IG51bGwgJiYgdG9vbHRpcC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSB0aXAuZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgICAgIGxhYmVsLnNldEZvcmVncm91bmQoZGlzcGxheQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKLSAgICAgICAgICAgICAgICBsYWJlbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0gICAgICAgICAgICAgICAgbGFiZWwuc2V0VGV4dCh0b29sdGlwKTsKLSAgICAgICAgICAgICAgICBQb2ludCBsYWJlbFNpemUgPSBsYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICAgICAgICAgIGxhYmVsU2l6ZS54ICs9IDI7Ci0gICAgICAgICAgICAgICAgbGFiZWxTaXplLnkgKz0gMjsKLSAgICAgICAgICAgICAgICBsYWJlbC5zZXRTaXplKGxhYmVsU2l6ZSk7Ci0gICAgICAgICAgICAgICAgdGlwLnBhY2soKTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIE9uIHNvbWUgcGxhdGZvcm1zLCB0aGVyZSBpcyBhIG1pbmltdW0gc2l6ZSBmb3IgYSBzaGVsbCAgCi0gICAgICAgICAgICAgICAgICogd2hpY2ggbWF5IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbGFiZWwgc2l6ZS4KLSAgICAgICAgICAgICAgICAgKiBUbyBhdm9pZCBoYXZpbmcgdGhlIGJhY2tncm91bmQgb2YgdGhlIHRpcCBzaGVsbCBzaG93aW5nCi0gICAgICAgICAgICAgICAgICogYXJvdW5kIHRoZSBsYWJlbCwgZm9yY2UgdGhlIGxhYmVsIHRvIGZpbGwgdGhlIGVudGlyZSBjbGllbnQgYXJlYS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgYXJlYSA9IHRpcC5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgICAgbGFiZWwuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBQb3NpdGlvbiB0aGUgdG9vbHRpcCBhbmQgZW5zdXJlIHRoYXQgaXQgaXMgbm90IGxvY2F0ZWQgb2ZmCi0gICAgICAgICAgICAgICAgICogdGhlIHNjcmVlbi4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBQb2ludCBwdCA9IG5ldyBQb2ludChpdGVtLnggKyBpdGVtLndpZHRoIC8gNCwgaXRlbS55Ci0gICAgICAgICAgICAgICAgICAgICAgICArIGl0ZW0uaGVpZ2h0ICsgMik7Ci0gICAgICAgICAgICAgICAgcHQgPSB0b0Rpc3BsYXkocHQpOwotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gZGlzcGxheS5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgICAgICBQb2ludCB0aXBTaXplID0gdGlwLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBwdC54ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocHQueCwgcmVjdC53aWR0aCAtIHRpcFNpemUueCkpOwotICAgICAgICAgICAgICAgIHB0LnkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwdC55LCByZWN0LmhlaWdodCAtIHRpcFNpemUueSkpOwotICAgICAgICAgICAgICAgIHRpcC5zZXRMb2NhdGlvbihwdCk7Ci0gICAgICAgICAgICAgICAgdGlwLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdG9vbFRpcEl0ZW0gPSBudWxsOwotICAgICAgICBpZiAodGlwICE9IG51bGwgJiYgIXRpcC5pc0Rpc3Bvc2VkKCkgJiYgdGlwLmlzVmlzaWJsZSgpKQotICAgICAgICAgICAgdGlwLnNldFZpc2libGUoZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbk1vdXNlTW92ZShFdmVudCBldmVudCkgewotICAgICAgICBpZiAoc2hvd1Rvb2xUaXApIHsKLSAgICAgICAgICAgIHNob3dUb29sVGlwKGV2ZW50LngsIGV2ZW50LnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzaG93Q2xvc2UpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ1RhYkl0ZW0gaXRlbSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gaXRlbXNbaV0uZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICBpZiAocmVjdC5jb250YWlucyhuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpKSB7Ci0gICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IGluYWN0aXZlSXRlbSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpbmFjdGl2ZUNsb3NlQmFyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICBpbmFjdGl2ZUl0ZW0gPSBudWxsOwotCi0gICAgICAgIGlmIChpdGVtID09IG51bGwgfHwgaXRlbSA9PSBnZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpbnQgdG9vbGJhckhlaWdodCA9IHRhYkhlaWdodCAtIENUYWJJdGVtLlRPUF9NQVJHSU4KLSAgICAgICAgICAgICAgICAtIENUYWJJdGVtLkJPVFRPTV9NQVJHSU4gKyAyOyAvLyArMiB0byBpZ25vcmUgZ2FwIGJldHdlZW4gZm9jdXMgcmVjdGFuZ2xlCi0gICAgICAgIFBvaW50IHNpemUgPSBpbmFjdGl2ZUNsb3NlQmFyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCB0b29sYmFySGVpZ2h0KTsKLSAgICAgICAgaW50IHggPSBpdGVtLnggKyBpdGVtLndpZHRoIC0gc2l6ZS54IC0gMjsgLy8gLTIgdG8gbm90IG92ZXJsYXAgZm9jdXMgcmVjdGFuZ2xlIGFuZCB0cmltCi0gICAgICAgIGludCB5ID0gaXRlbS55ICsgTWF0aC5tYXgoMCwgKGl0ZW0uaGVpZ2h0IC0gdG9vbGJhckhlaWdodCkgLyAyKTsKLSAgICAgICAgUmVjdGFuZ2xlIHRvb2xzcGFjZSA9IGdldFRvb2xTcGFjZSgpOwotICAgICAgICBQb2ludCBmb2xkZXJTaXplID0gZ2V0U2l6ZSgpOwotICAgICAgICBpZiAoKHRvb2xzcGFjZS53aWR0aCA9PSAwIHx8IHggPCB0b29sc3BhY2UueCkKLSAgICAgICAgICAgICAgICAmJiB4ICsgc2l6ZS54IDwgZm9sZGVyU2l6ZS54IC0gYm9yZGVyUmlnaHQpIHsKLSAgICAgICAgICAgIGluYWN0aXZlQ2xvc2VCYXIuc2V0Qm91bmRzKHgsIHksIHNpemUueCwgdG9vbGJhckhlaWdodCk7Ci0gICAgICAgICAgICBpbmFjdGl2ZUNsb3NlQmFyLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBpbmFjdGl2ZUl0ZW0gPSBpdGVtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uVHJhdmVyc2UoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLSAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotICAgICAgICAvLyBURU1QT1JBUlkgQ09ERSBTZWUgYnVnIHJlcG9ydCAxNzM3MgotICAgICAgICAvLwkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9UQUJfTkVYVDoKLSAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTOgotICAgICAgICAgICAgZXZlbnQuZG9pdCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfTU5FTU9OSUM6Ci0gICAgICAgICAgICBldmVudC5kb2l0ID0gb25NbmVtb25pYyhldmVudCk7Ci0gICAgICAgICAgICBpZiAoZXZlbnQuZG9pdCkKLSAgICAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9QQUdFX05FWFQ6Ci0gICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX1BBR0VfUFJFVklPVVM6Ci0gICAgICAgICAgICBldmVudC5kb2l0ID0gb25QYWdlVHJhdmVyc2FsKGV2ZW50KTsKLSAgICAgICAgICAgIGlmIChldmVudC5kb2l0KQotICAgICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IFNXVC5UUkFWRVJTRV9OT05FOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gb25QYWdlVHJhdmVyc2FsKEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGludCBjb3VudCA9IGdldEl0ZW1Db3VudCgpOwotICAgICAgICBpZiAoY291bnQgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaW50IGluZGV4ID0gZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKGV2ZW50LmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfUEFHRV9ORVhUKSA/IDEgOiAtMTsKLSAgICAgICAgICAgIGluZGV4ID0gKGluZGV4ICsgb2Zmc2V0ICsgY291bnQpICUgY291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0U2VsZWN0aW9uKGluZGV4LCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VyIHRydWUgaWYgbm90IGFsbCB0YWJzIGNhbiBiZSB2aXNpYmxlIGluIHRoZSByZWNlaXZlCi0gICAgICogdGh1cyByZXF1aXJpbmcgdGhlIHNjcm9sbCBidXR0b25zIHRvIGJlIHZpc2libGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNjcm9sbF9sZWZ0VmlzaWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRvcFRhYkluZGV4ID4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbnN3ZXIgdHJ1ZSBpZiBub3QgYWxsIHRhYnMgY2FuIGJlIHZpc2libGUgaW4gdGhlIHJlY2VpdmUKLSAgICAgKiB0aHVzIHJlcXVpcmluZyB0aGUgc2Nyb2xsIGJ1dHRvbnMgdG8gYmUgdmlzaWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2Nyb2xsX3JpZ2h0VmlzaWJsZSgpIHsKLSAgICAgICAgLy8gb25seSBzaG93IFNjcm9sbCBidXR0b25zIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgaXRlbQotICAgICAgICAvLyBhbmQgaWYgd2UgYXJlIG5vdCBhbHJlYWR5IGF0IHRoZSBsYXN0IGl0ZW0KLSAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA8IDIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFJlY3RhbmdsZSBhcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICBpbnQgcmlnaHRFZGdlID0gYXJlYS54ICsgYXJlYS53aWR0aDsKLSAgICAgICAgaWYgKHJpZ2h0RWRnZSA8PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAodG9wVGFiSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICByaWdodEVkZ2UgLT0gYXJyb3dCYXIuZ2V0U2l6ZSgpLng7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRvcFJpZ2h0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJpZ2h0RWRnZSAtPSB0b3BSaWdodC5nZXRTaXplKCkueDsKLSAgICAgICAgfQotICAgICAgICBDVGFiSXRlbSBpdGVtID0gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07Ci0gICAgICAgIHJldHVybiAoaXRlbS54ICsgaXRlbS53aWR0aCA+IHJpZ2h0RWRnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2Nyb2xsIHRoZSB0YWIgaXRlbXMgdG8gdGhlIGxlZnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNjcm9sbF9zY3JvbGxMZWZ0KCkgewotICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHNldExhc3RJdGVtKHRvcFRhYkluZGV4IC0gMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2Nyb2xsIHRoZSB0YWIgaXRlbXMgdG8gdGhlIHJpZ2h0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzY3JvbGxfc2Nyb2xsUmlnaHQoKSB7Ci0gICAgICAgIGludCBsYXN0SW5kZXggPSBnZXRMYXN0SXRlbSgpOwotICAgICAgICB0b3BUYWJJbmRleCA9IGxhc3RJbmRleCArIDE7Ci0gICAgICAgIHNldEl0ZW1Mb2NhdGlvbigpOwotICAgICAgICBjb3JyZWN0TGFzdEl0ZW0oKTsKLSAgICAgICAgcmVkcmF3VGFiQXJlYSgtMSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvcnJlY3RMYXN0SXRlbSgpIHsKLSAgICAgICAgUmVjdGFuZ2xlIGFyZWEgPSBnZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgIGludCByaWdodEVkZ2UgPSBhcmVhLnggKyBhcmVhLndpZHRoOwotICAgICAgICBpZiAocmlnaHRFZGdlIDw9IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFJlY3RhbmdsZSB0b29sc3BhY2UgPSBnZXRUb29sU3BhY2UoKTsKLSAgICAgICAgaWYgKHRvb2xzcGFjZS53aWR0aCA+IDApIHsKLSAgICAgICAgICAgIHJpZ2h0RWRnZSAtPSB0b29sc3BhY2Uud2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgQ1RhYkl0ZW0gaXRlbSA9IGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdOwotICAgICAgICBpZiAoaXRlbS54ICsgaXRlbS53aWR0aCA8IHJpZ2h0RWRnZSkgewotICAgICAgICAgICAgc2V0TGFzdEl0ZW0oaXRlbXMubGVuZ3RoIC0gMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSBhIGZpeGVkIGhlaWdodCBmb3IgdGhlIHRhYiBpdGVtcy4gIElmIG5vIGhlaWdodCBpcyBzcGVjaWZpZWQsCi0gICAgICogdGhlIGRlZmF1bHQgaGVpZ2h0IGlzIHRoZSBoZWlnaHQgb2YgdGhlIHRleHQgb3IgdGhlIGltYWdlLCB3aGljaGV2ZXIgCi0gICAgICogaXMgZ3JlYXRlci4gU3BlY2lmeWluZyBhIGhlaWdodCBvZiAwIHdpbGwgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0IGhlaWdodC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBwaXhlbCB2YWx1ZSBvZiB0aGUgaGVpZ2h0IG9yIDAKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgY2FsbGVkIHdpdGggYSBoZWlnaHQgb2YgbGVzcyB0aGFuIDA8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFiSGVpZ2h0KGludCBoZWlnaHQpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKGhlaWdodCA8IDApIHsKLSAgICAgICAgICAgIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0gICAgICAgIH0KLSAgICAgICAgZml4ZWRUYWJIZWlnaHQgPSB0cnVlOwotICAgICAgICBpZiAodGFiSGVpZ2h0ID09IGhlaWdodCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgdGFiSGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICBvbGRTaXplID0gbnVsbDsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzKFNXVC5SZXNpemUsIG5ldyBFdmVudCgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlc2V0VGFiU2l6ZShib29sZWFuIGNoZWNrSGVpZ2h0KSB7Ci0gICAgICAgIGludCBvbGRIZWlnaHQgPSB0YWJIZWlnaHQ7Ci0gICAgICAgIGlmICghZml4ZWRUYWJIZWlnaHQgJiYgY2hlY2tIZWlnaHQpIHsKLSAgICAgICAgICAgIGludCB0ZW1wSGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIEdDIGdjID0gbmV3IEdDKHRoaXMpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRlbXBIZWlnaHQgPSBNYXRoLm1heCh0ZW1wSGVpZ2h0LCBpdGVtc1tpXS5wcmVmZXJyZWRIZWlnaHQoZ2MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdjLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGlmICh0b3BSaWdodCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRlbXBIZWlnaHQgPSBNYXRoLm1heCh0ZW1wSGVpZ2h0LCB0b3BSaWdodC5jb21wdXRlU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueSk7Ci0gICAgICAgICAgICB0YWJIZWlnaHQgPSB0ZW1wSGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRhYkhlaWdodCAhPSBvbGRIZWlnaHQpIHsKLSAgICAgICAgICAgIG9sZFNpemUgPSBudWxsOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKFNXVC5SZXNpemUsIG5ldyBFdmVudCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldEl0ZW1Cb3VuZHMoKTsKLSAgICAgICAgICAgIHJlZHJhdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSBwb3NpdGlvbiB2YWx1ZSBpcyBub3QgZWl0aGVyIFNXVC5UT1Agb3IgU1dULkJPVFRPTTwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiAKLSAgICAgKiBVTkRFUiBDT05TVFJVQ1RJT04KLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFiUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChwb3NpdGlvbiAhPSBTV1QuVE9QICYmIHBvc2l0aW9uICE9IFNXVC5CT1RUT00pIHsKLSAgICAgICAgICAgIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9uQm90dG9tICE9IChwb3NpdGlvbiA9PSBTV1QuQk9UVE9NKSkgewotICAgICAgICAgICAgb25Cb3R0b20gPSBwb3NpdGlvbiA9PSBTV1QuQk9UVE9NOwotICAgICAgICAgICAgc2V0Qm9yZGVyVmlzaWJsZShzaG93Qm9yZGVycyk7Ci0gICAgICAgICAgICByZXNldFRhYlNpemUodHJ1ZSk7Ci0gICAgICAgICAgICAvLwkJdXBkYXRlVGFiSGVpZ2h0KHRydWUpOwotICAgICAgICAgICAgLy8JCVJlY3RhbmdsZSByZWN0QmVmb3JlID0gZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgLy8JCXVwZGF0ZUl0ZW1zKCk7Ci0gICAgICAgICAgICAvLwkJUmVjdGFuZ2xlIHJlY3RBZnRlciA9IGdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgIC8vCQlpZiAoIXJlY3RCZWZvcmUuZXF1YWxzKHJlY3RBZnRlcikpIHsKLSAgICAgICAgICAgIC8vCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5SZXNpemUsIG5ldyBFdmVudCgpKTsKLSAgICAgICAgICAgIC8vCQl9Ci0gICAgICAgICAgICAvLwkJc2V0SXRlbUJvdW5kcygpOwotICAgICAgICAgICAgLy8JCXJlZHJhd1RhYkFyZWEoLTEpOwotICAgICAgICAgICAgLy8JCXJlZHJhdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUYWJQb3NpdGlvbigpIHsKLSAgICAgICAgaWYgKG9uQm90dG9tKQotICAgICAgICAgICAgcmV0dXJuIFNXVC5CT1RUT007Ci0gICAgICAgIHJldHVybiBTV1QuVE9QOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvd2lkZ2V0cy9DVGFiRm9sZGVyRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ByZXNlbnRhdGlvbnMvcjIxL3dpZGdldHMvQ1RhYkZvbGRlckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMjg3ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvd2lkZ2V0cy9DVGFiRm9sZGVyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLnIyMS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UeXBlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotcHVibGljIGNsYXNzIENUYWJGb2xkZXJFdmVudCBleHRlbmRzIFR5cGVkRXZlbnQgewotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcmlhbCB2ZXJzaW9uIFVJRCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODY4ODc5MzE5OTcxOTczMEw7Ci0KLSAgICBwdWJsaWMgV2lkZ2V0IGl0ZW07Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkb2l0OwotCi0gICAgQ1RhYkZvbGRlckV2ZW50KFdpZGdldCB3KSB7Ci0gICAgICAgIHN1cGVyKHcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ByZXNlbnRhdGlvbnMvcjIxL3dpZGdldHMvQ1RhYkZvbGRlckxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL3IyMS93aWRnZXRzL0NUYWJGb2xkZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzVkNjY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ByZXNlbnRhdGlvbnMvcjIxL3dpZGdldHMvQ1RhYkZvbGRlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy5yMjEud2lkZ2V0czsKLQotcHVibGljIGludGVyZmFjZSBDVGFiRm9sZGVyTGlzdGVuZXIgewotICAgIHB1YmxpYyB2b2lkIGl0ZW1DbG9zZWQoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ByZXNlbnRhdGlvbnMvcjIxL3dpZGdldHMvQ1RhYkl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ByZXNlbnRhdGlvbnMvcjIxL3dpZGdldHMvQ1RhYkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyMTc1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL3IyMS93aWRnZXRzL0NUYWJJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMucjIxLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi1wdWJsaWMgY2xhc3MgQ1RhYkl0ZW0gZXh0ZW5kcyBJdGVtIHsKLSAgICBDVGFiRm9sZGVyIHBhcmVudDsKLQotICAgIGludCB4LCB5LCB3aWR0aCwgaGVpZ2h0ID0gMDsKLQotICAgIFN0cmluZyB0b29sVGlwVGV4dDsKLQotICAgIENvbnRyb2wgY29udHJvbDsgLy8gdGhlIHRhYiBwYWdlCi0KLSAgICBwcml2YXRlIEltYWdlIGRpc2FibGVkSW1hZ2U7Ci0KLSAgICAvLyBpbnRlcm5hbCBjb25zdGFudHMKLSAgICBzdGF0aWMgZmluYWwgaW50IExFRlRfTUFSR0lOID0gNDsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfTUFSR0lOID0gNDsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgVE9QX01BUkdJTiA9IDM7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IEJPVFRPTV9NQVJHSU4gPSAzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVEVSTkFMX1NQQUNJTkcgPSAyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVsbGlwc2lzID0gIi4uLiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIFN0cmluZyBzaG9ydGVuZWRUZXh0OwotCi0gICAgaW50IHNob3J0ZW5lZFRleHRXaWR0aDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBnaXZlbiBpdHMgcGFyZW50Ci0gICAgICogKHdoaWNoIG11c3QgYmUgYSA8Y29kZT5DVGFiRm9sZGVyPC9jb2RlPikgYW5kIGEgc3R5bGUgdmFsdWUKLSAgICAgKiBkZXNjcmliaW5nIGl0cyBiZWhhdmlvciBhbmQgYXBwZWFyYW5jZS4gVGhlIGl0ZW0gaXMgYWRkZWQKLSAgICAgKiB0byB0aGUgZW5kIG9mIHRoZSBpdGVtcyBtYWludGFpbmVkIGJ5IGl0cyBwYXJlbnQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHN0eWxlIHZhbHVlIGlzIGVpdGhlciBvbmUgb2YgdGhlIHN0eWxlIGNvbnN0YW50cyBkZWZpbmVkIGluCi0gICAgICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCi0gICAgICogY2xhc3MsIG9yIG11c3QgYmUgYnVpbHQgYnkgPGVtPmJpdHdpc2UgT1I8L2VtPidpbmcgdG9nZXRoZXIgCi0gICAgICogKHRoYXQgaXMsIHVzaW5nIHRoZSA8Y29kZT5pbnQ8L2NvZGU+ICJ8IiBvcGVyYXRvcikgdHdvIG9yIG1vcmUKLSAgICAgKiBvZiB0aG9zZSA8Y29kZT5TV1Q8L2NvZGU+IHN0eWxlIGNvbnN0YW50cy4gVGhlIGNsYXNzIGRlc2NyaXB0aW9uCi0gICAgICogbGlzdHMgdGhlIHN0eWxlIGNvbnN0YW50cyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBjbGFzcy4KLSAgICAgKiBTdHlsZSBiaXRzIGFyZSBhbHNvIGluaGVyaXRlZCBmcm9tIHN1cGVyY2xhc3Nlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IGEgQ1RhYkZvbGRlciB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiBjb250cm9sIHRvIGNvbnN0cnVjdAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhcmVudCBpcyBudWxsPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSBwYXJlbnQ8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIFNXVAotICAgICAqIEBzZWUgV2lkZ2V0I2dldFN0eWxlCi0gICAgICovCi0gICAgcHVibGljIENUYWJJdGVtKENUYWJGb2xkZXIgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIHN0eWxlLCBwYXJlbnQuZ2V0SXRlbUNvdW50KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBnaXZlbiBpdHMgcGFyZW50Ci0gICAgICogKHdoaWNoIG11c3QgYmUgYSA8Y29kZT5DVGFiRm9sZGVyPC9jb2RlPiksIGEgc3R5bGUgdmFsdWUKLSAgICAgKiBkZXNjcmliaW5nIGl0cyBiZWhhdmlvciBhbmQgYXBwZWFyYW5jZSwgYW5kIHRoZSBpbmRleAotICAgICAqIGF0IHdoaWNoIHRvIHBsYWNlIGl0IGluIHRoZSBpdGVtcyBtYWludGFpbmVkIGJ5IGl0cyBwYXJlbnQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHN0eWxlIHZhbHVlIGlzIGVpdGhlciBvbmUgb2YgdGhlIHN0eWxlIGNvbnN0YW50cyBkZWZpbmVkIGluCi0gICAgICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCi0gICAgICogY2xhc3MsIG9yIG11c3QgYmUgYnVpbHQgYnkgPGVtPmJpdHdpc2UgT1I8L2VtPidpbmcgdG9nZXRoZXIgCi0gICAgICogKHRoYXQgaXMsIHVzaW5nIHRoZSA8Y29kZT5pbnQ8L2NvZGU+ICJ8IiBvcGVyYXRvcikgdHdvIG9yIG1vcmUKLSAgICAgKiBvZiB0aG9zZSA8Y29kZT5TV1Q8L2NvZGU+IHN0eWxlIGNvbnN0YW50cy4gVGhlIGNsYXNzIGRlc2NyaXB0aW9uCi0gICAgICogbGlzdHMgdGhlIHN0eWxlIGNvbnN0YW50cyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBjbGFzcy4KLSAgICAgKiBTdHlsZSBiaXRzIGFyZSBhbHNvIGluaGVyaXRlZCBmcm9tIHN1cGVyY2xhc3Nlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IGEgQ1RhYkZvbGRlciB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiBjb250cm9sIHRvIGNvbnN0cnVjdAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggdG8gc3RvcmUgdGhlIHJlY2VpdmVyIGluIGl0cyBwYXJlbnQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50PC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBTV1QKLSAgICAgKiBAc2VlIFdpZGdldCNnZXRTdHlsZQotICAgICAqLwotICAgIHB1YmxpYyBDVGFiSXRlbShDVGFiRm9sZGVyIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBjaGVja1N0eWxlKHN0eWxlKSk7Ci0gICAgICAgIHBhcmVudC5jcmVhdGVJdGVtKHRoaXMsIGluZGV4KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tTdHlsZShpbnQgc3R5bGUpIHsKLSAgICAgICAgcmV0dXJuIFNXVC5OT05FOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHBhcmVudC5kZXN0cm95SXRlbSh0aGlzKTsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICBwYXJlbnQgPSBudWxsOwotICAgICAgICBjb250cm9sID0gbnVsbDsKLSAgICAgICAgdG9vbFRpcFRleHQgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSByZWN0YW5nbGUgZGVzY3JpYmluZyB0aGUgcmVjZWl2ZXIncyBzaXplIGFuZCBsb2NhdGlvbgotICAgICAqIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGJvdW5kaW5nIGNvbHVtbiByZWN0YW5nbGUKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldEJvdW5kcygpIHsKLSAgICAgICAgLy9jaGVja1dpZGdldCgpOwotICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250cm9sIHRoYXQgaXMgZGlzcGxheWVkIGluIHRoZSBjb250ZW50IGFyZSBvZiB0aGUgdGFiIGl0ZW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250cm9sCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEVycm9yKEVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUykKLSAgICAgKgl3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEVycm9yKEVSUk9SX1dJREdFVF9ESVNQT1NFRCkKLSAgICAgKgl3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICByZXR1cm4gY29udHJvbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGlzcGxheSBnZXREaXNwbGF5KCkgewotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICBTV1QuZXJyb3IoU1dULkVSUk9SX1dJREdFVF9ESVNQT1NFRCk7Ci0gICAgICAgIHJldHVybiBwYXJlbnQuZ2V0RGlzcGxheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW1hZ2UgZGlzcGxheWVkIGluIHRoZSB0YWIgaWYgdGhlIHRhYiBpcyBkaXNhYmxlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXNhYmxlZCBpbWFnZSBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldERpc2FibGVkSW1hZ2UoKSB7Ci0gICAgICAgIC8vY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgcmV0dXJuIGRpc2FibGVkSW1hZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVjZWl2ZXIncyBwYXJlbnQsIHdoaWNoIG11c3QgYmUgYSA8Y29kZT5DVGFiRm9sZGVyPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgcGFyZW50Ci0gICAgICovCi0gICAgcHVibGljIENUYWJGb2xkZXIgZ2V0UGFyZW50KCkgewotICAgICAgICAvL2NoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVjZWl2ZXIncyB0b29sIHRpcCB0ZXh0LCBvciBudWxsIGlmIGl0IGhhcwotICAgICAqIG5vdCBiZWVuIHNldC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgdG9vbCB0aXAgdGV4dAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIHJldHVybiB0b29sVGlwVGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYWludCB0aGUgcmVjZWl2ZXIuCi0gICAgICovCi0gICAgdm9pZCBvblBhaW50KEdDIGdjLCBib29sZWFuIGlzU2VsZWN0ZWQpIHsKLQotICAgICAgICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0gICAgICAgIENvbG9yIGhpZ2hsaWdodFNoYWRvdyA9IGRpc3BsYXkKLSAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9ISUdITElHSFRfU0hBRE9XKTsKLSAgICAgICAgQ29sb3Igbm9ybWFsU2hhZG93ID0gZGlzcGxheQotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1cpOwotCi0gICAgICAgIGludCBpbmRleCA9IHBhcmVudC5pbmRleE9mKHRoaXMpOwotCi0gICAgICAgIGlmIChpc1NlbGVjdGVkKSB7Ci0KLSAgICAgICAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBudWxsOwotICAgICAgICAgICAgaWYgKCFwYXJlbnQub25Cb3R0b20pIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gcGFyZW50LnRvcFRhYkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoeCArIDEsIHkgKyAxLCB3aWR0aCAtIDIsIGhlaWdodCAtIDEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoeCArIDIsIHkgKyAxLCB3aWR0aCAtIDMsIGhlaWdodCAtIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHBhcmVudC50b3BUYWJJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHggKyAxLCB5ICsgMSwgd2lkdGggLSAyLCBoZWlnaHQgLSAyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHggKyAyLCB5ICsgMSwgd2lkdGggLSAzLCBoZWlnaHQgLSAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyZW50LmJhY2tncm91bmRJbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZHJhdyBhIGJhY2tncm91bmQgaW1hZ2UgYmVoaW5kIHRoZSB0ZXh0Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGltYWdlUmVjdCA9IHBhcmVudC5iYWNrZ3JvdW5kSW1hZ2UuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICAgICAgZ2MuZHJhd0ltYWdlKHBhcmVudC5iYWNrZ3JvdW5kSW1hZ2UsIDAsIDAsIGltYWdlUmVjdC53aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUmVjdC5oZWlnaHQsIGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmhlaWdodCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC5ncmFkaWVudENvbG9ycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZHJhdyBhIGdyYWRpZW50IGJlaGluZCB0aGUgdGV4dAotICAgICAgICAgICAgICAgIENvbG9yIG9sZEJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5ncmFkaWVudENvbG9ycy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmdyYWRpZW50Q29sb3JzWzBdICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKHBhcmVudC5ncmFkaWVudENvbG9yc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgIGdjLmZpbGxSZWN0YW5nbGUoYm91bmRzLngsIGJvdW5kcy55LCBib3VuZHMud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ29sb3Igb2xkRm9yZWdyb3VuZCA9IGdjLmdldEZvcmVncm91bmQoKTsKLSAgICAgICAgICAgICAgICAgICAgQ29sb3IgbGFzdENvbG9yID0gcGFyZW50LmdyYWRpZW50Q29sb3JzWzBdOwotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdENvbG9yID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q29sb3IgPSBvbGRCYWNrZ3JvdW5kOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgcG9zID0gMDsgaSA8IHBhcmVudC5ncmFkaWVudFBlcmNlbnRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGxhc3RDb2xvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q29sb3IgPSBwYXJlbnQuZ3JhZGllbnRDb2xvcnNbaSArIDFdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RDb2xvciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDb2xvciA9IG9sZEJhY2tncm91bmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKGxhc3RDb2xvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JhZGllbnRXaWR0aCA9IChwYXJlbnQuZ3JhZGllbnRQZXJjZW50c1tpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvdW5kcy53aWR0aCAvIDEwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoYm91bmRzLnggKyBwb3MsIGJvdW5kcy55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkaWVudFdpZHRoLCBib3VuZHMuaGVpZ2h0LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gZ3JhZGllbnRXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKG9sZEZvcmVncm91bmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKG9sZEJhY2tncm91bmQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBkcmF3IHRhYiBsaW5lcwotICAgICAgICAgICAgaWYgKCFwYXJlbnQub25Cb3R0b20pIHsKLSAgICAgICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKG5vcm1hbFNoYWRvdyk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IHBhcmVudC50b3BUYWJJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4ICsgMSwgeSwgeCArIDEsIHkpOwotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4LCB5ICsgMSwgeCwgeSArIGhlaWdodCAtIDIpOwotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4LCB5ICsgaGVpZ2h0IC0gMSwgeCwgeSArIGhlaWdodCAtIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4ICsgd2lkdGggLSAxLCB5LCB4ICsgd2lkdGggLSAxLCB5KTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4ICsgd2lkdGgsIHkgKyAxLCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSAyKTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSAxLCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gMSk7Ci0KLSAgICAgICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGhpZ2hsaWdodFNoYWRvdyk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IHBhcmVudC50b3BUYWJJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4ICsgMiwgeSwgeCArIDIsIHkpOwotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4ICsgMSwgeSArIDEsIHggKyAxLCB5ICsgaGVpZ2h0IC0gMik7Ci0gICAgICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKHggKyAxLCB5ICsgaGVpZ2h0IC0gMSwgeCArIDEsIHkgKyBoZWlnaHQgLSAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4LCB5LCB4LCB5ICsgaGVpZ2h0IC0gMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoeCArIHdpZHRoIC0gMiwgeSwgeCArIHdpZHRoIC0gMiwgeSk7Ci0gICAgICAgICAgICAgICAgZ2MKLSAgICAgICAgICAgICAgICAgICAgICAgIC5kcmF3TGluZSh4ICsgd2lkdGggLSAxLCB5ICsgMSwgeCArIHdpZHRoIC0gMSwgeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhlaWdodCAtIDIpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKHggKyB3aWR0aCAtIDEsIHkgKyBoZWlnaHQgLSAxLCB4ICsgd2lkdGggLSAxLCB5Ci0gICAgICAgICAgICAgICAgICAgICAgICArIGhlaWdodCAtIDEpOwotCi0gICAgICAgICAgICAgICAgLy8gbGlnaHQgbGluZSBhY3Jvc3MgdG9wCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IHBhcmVudC50b3BUYWJJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4ICsgMywgeSwgeCArIHdpZHRoIC0gMywgeSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoeCArIDEsIHksIHggKyB3aWR0aCAtIDMsIHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChub3JtYWxTaGFkb3cpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSBwYXJlbnQudG9wVGFiSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoeCwgeSwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKHgsIHkgKyAxLCB4LCB5ICsgaGVpZ2h0IC0gMik7Ci0gICAgICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKHggKyAxLCB5ICsgaGVpZ2h0IC0gMSwgeCArIDEsIHkgKyBoZWlnaHQgLSAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKHggKyB3aWR0aCwgeSArIDEsIHggKyB3aWR0aCwgeSArIGhlaWdodCAtIDIpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKHggKyB3aWR0aCAtIDEsIHkgKyBoZWlnaHQgLSAxLCB4ICsgd2lkdGggLSAxLCB5Ci0gICAgICAgICAgICAgICAgICAgICAgICArIGhlaWdodCAtIDEpOwotCi0gICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChoaWdobGlnaHRTaGFkb3cpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSBwYXJlbnQudG9wVGFiSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoeCArIDEsIHksIHggKyAxLCB5KTsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoeCArIDEsIHkgKyAxLCB4ICsgMSwgeSArIGhlaWdodCAtIDIpOwotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4ICsgMiwgeSArIGhlaWdodCAtIDEsIHggKyAyLCB5ICsgaGVpZ2h0IC0gMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoeCwgeSwgeCwgeSArIGhlaWdodCAtIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKHggKyB3aWR0aCAtIDEsIHksIHggKyB3aWR0aCAtIDEsIHkpOwotICAgICAgICAgICAgICAgIGdjCi0gICAgICAgICAgICAgICAgICAgICAgICAuZHJhd0xpbmUoeCArIHdpZHRoIC0gMSwgeSArIDEsIHggKyB3aWR0aCAtIDEsIHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBoZWlnaHQgLSAyKTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4ICsgd2lkdGggLSAyLCB5ICsgaGVpZ2h0IC0gMSwgeCArIHdpZHRoIC0gMiwgeQotICAgICAgICAgICAgICAgICAgICAgICAgKyBoZWlnaHQgLSAxKTsKLQotICAgICAgICAgICAgICAgIC8vIGxpZ2h0IGxpbmUgYWNyb3NzIHRvcCBhbmQgYm90dG9tCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IHBhcmVudC50b3BUYWJJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4ICsgMSwgeSwgeCArIHdpZHRoIC0gMiwgeSk7Ci0gICAgICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKHggKyAyLCB5ICsgaGVpZ2h0IC0gMSwgeCArIHdpZHRoIC0gMywgeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaGVpZ2h0IC0gMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoeCArIDEsIHksIHggKyB3aWR0aCAtIDIsIHkpOwotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4ICsgMSwgeSArIGhlaWdodCAtIDEsIHggKyB3aWR0aCAtIDMsIHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhlaWdodCAtIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnQuaXNGb2N1c0NvbnRyb2woKSkgewotICAgICAgICAgICAgICAgIC8vIGRyYXcgYSBmb2N1cyByZWN0YW5nbGUKLSAgICAgICAgICAgICAgICBpbnQgeDEsIHkxLCB3aWR0aDEsIGhlaWdodDE7Ci0gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQub25Cb3R0b20pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHBhcmVudC50b3BUYWJJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgeDEgPSB4ICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHkxID0geSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDEgPSB3aWR0aCAtIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQxID0gaGVpZ2h0IC0gMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHgxID0geCArIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgxID0gd2lkdGggLSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0MSA9IGhlaWdodCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gcGFyZW50LnRvcFRhYkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4MSA9IHggKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB5ICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoMSA9IHdpZHRoIC0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDEgPSBoZWlnaHQgLSAyOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeDEgPSB4ICsgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHkxID0geSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDEgPSB3aWR0aCAtIDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQxID0gaGVpZ2h0IC0gMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0gICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdGb2N1cyh4MSwgeTEsIHdpZHRoMSwgaGVpZ2h0MSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBkcmF3IHRhYiBsaW5lcyBmb3IgdW5zZWxlY3RlZCBpdGVtcwotICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChub3JtYWxTaGFkb3cpOwotICAgICAgICAgICAgaWYgKCFwYXJlbnQub25Cb3R0b20pIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gcGFyZW50LnRvcFRhYkluZGV4Ci0gICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPSBwYXJlbnQuZ2V0U2VsZWN0aW9uSW5kZXgoKSArIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoeCwgeSwgeCwgeSArIChoZWlnaHQgLyAyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gcGFyZW50LnRvcFRhYkluZGV4Ci0gICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPSBwYXJlbnQuZ2V0U2VsZWN0aW9uSW5kZXgoKSArIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoeCwgeSArIChoZWlnaHQgLyAyKSwgeCwgeSArIGhlaWdodCAtIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHJhdyBJbWFnZQotICAgICAgICBpbnQgeERyYXcgPSB4ICsgTEVGVF9NQVJHSU47Ci0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZSgpOwotICAgICAgICBpZiAoIWlzU2VsZWN0ZWQgJiYgaW1hZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgSW1hZ2UgdGVtcCA9IGdldERpc2FibGVkSW1hZ2UoKTsKLSAgICAgICAgICAgIGlmICh0ZW1wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbWFnZSA9IHRlbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotICAgICAgICAgICAgaW50IGltYWdlWCA9IHhEcmF3OwotICAgICAgICAgICAgaW50IGltYWdlSGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0IC0gQk9UVE9NX01BUkdJTiAtIFRPUF9NQVJHSU4sCi0gICAgICAgICAgICAgICAgICAgIGltYWdlQm91bmRzLmhlaWdodCk7Ci0gICAgICAgICAgICBpbnQgaW1hZ2VZID0geSArIChoZWlnaHQgLSBpbWFnZUhlaWdodCkgLyAyOwotICAgICAgICAgICAgaW50IGltYWdlV2lkdGggPSBpbWFnZUJvdW5kcy53aWR0aCAqIGltYWdlSGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgIC8gaW1hZ2VCb3VuZHMuaGVpZ2h0OwotICAgICAgICAgICAgZ2MuZHJhd0ltYWdlKGltYWdlLCBpbWFnZUJvdW5kcy54LCBpbWFnZUJvdW5kcy55LAotICAgICAgICAgICAgICAgICAgICBpbWFnZUJvdW5kcy53aWR0aCwgaW1hZ2VCb3VuZHMuaGVpZ2h0LCBpbWFnZVgsIGltYWdlWSwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpOwotICAgICAgICAgICAgeERyYXcgKz0gaW1hZ2VXaWR0aCArIElOVEVSTkFMX1NQQUNJTkc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkcmF3IFRleHQKLSAgICAgICAgaW50IHRleHRXaWR0aCA9IHggKyB3aWR0aCAtIHhEcmF3IC0gUklHSFRfTUFSR0lOOwotICAgICAgICBpZiAoaXNTZWxlY3RlZCAmJiBwYXJlbnQuc2hvd0Nsb3NlKSB7Ci0gICAgICAgICAgICB0ZXh0V2lkdGggPSB4ICsgd2lkdGggLSB4RHJhdyAtIHBhcmVudC5jbG9zZUJhci5nZXRTaXplKCkueAotICAgICAgICAgICAgICAgICAgICAtIFJJR0hUX01BUkdJTjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2hvcnRlbmVkVGV4dCA9PSBudWxsIHx8IHNob3J0ZW5lZFRleHRXaWR0aCAhPSB0ZXh0V2lkdGgpIHsKLSAgICAgICAgICAgIHNob3J0ZW5lZFRleHQgPSBzaG9ydGVuVGV4dChnYywgZ2V0VGV4dCgpLCB0ZXh0V2lkdGgpOwotICAgICAgICAgICAgc2hvcnRlbmVkVGV4dFdpZHRoID0gdGV4dFdpZHRoOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gc2hvcnRlbmVkVGV4dDsKLQotICAgICAgICBpZiAoaXNTZWxlY3RlZCAmJiBwYXJlbnQuc2VsZWN0aW9uRm9yZWdyb3VuZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKHBhcmVudC5zZWxlY3Rpb25Gb3JlZ3JvdW5kKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQocGFyZW50LmdldEZvcmVncm91bmQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHRleHRZID0geSArIChoZWlnaHQgLSBnYy50ZXh0RXh0ZW50KHRleHQsIFNXVC5EUkFXX01ORU1PTklDKS55KSAvIDI7Ci0gICAgICAgIGdjLmRyYXdUZXh0KHRleHQsIHhEcmF3LCB0ZXh0WSwgU1dULkRSQVdfVFJBTlNQQVJFTlQKLSAgICAgICAgICAgICAgICB8IFNXVC5EUkFXX01ORU1PTklDKTsKLQotICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKHBhcmVudC5nZXRGb3JlZ3JvdW5kKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzaG9ydGVuVGV4dChHQyBnYywgU3RyaW5nIHRleHQsIGludCB3aWR0aCkgewotICAgICAgICBpZiAoZ2MudGV4dEV4dGVudCh0ZXh0LCBTV1QuRFJBV19NTkVNT05JQykueCA8PSB3aWR0aCkKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotCi0gICAgICAgIGludCBlbGxpcHNlV2lkdGggPSBnYy50ZXh0RXh0ZW50KGVsbGlwc2lzLCBTV1QuRFJBV19NTkVNT05JQykueDsKLSAgICAgICAgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGludCBlbmQgPSBsZW5ndGggLSAxOwotICAgICAgICB3aGlsZSAoZW5kID4gMCkgewotICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGVuZCk7Ci0gICAgICAgICAgICBpbnQgbDEgPSBnYy50ZXh0RXh0ZW50KHRleHQsIFNXVC5EUkFXX01ORU1PTklDKS54OwotICAgICAgICAgICAgaWYgKGwxICsgZWxsaXBzZVdpZHRoIDw9IHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRleHQgKyBlbGxpcHNpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVuZC0tOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXh0ICsgZWxsaXBzaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IG9mIHRoZSByZWNlaXZlciBmb3IgdGhlIEdDLgotICAgICAqLwotICAgIGludCBwcmVmZXJyZWRIZWlnaHQoR0MgZ2MpIHsKLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZSgpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gMDsKLSAgICAgICAgaWYgKGltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBoZWlnaHQgPSBpbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQ7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gZ2V0VGV4dCgpOwotICAgICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIGdjLnRleHRFeHRlbnQodGV4dCwgU1dULkRSQVdfTU5FTU9OSUMpLnkpOwotICAgICAgICByZXR1cm4gaGVpZ2h0ICsgVE9QX01BUkdJTiArIEJPVFRPTV9NQVJHSU47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBwcmVmZXJyZWQgd2lkdGggb2YgdGhlIHJlY2VpdmVyIGZvciB0aGUgR0MuCi0gICAgICovCi0gICAgaW50IHByZWZlcnJlZFdpZHRoKEdDIGdjKSB7Ci0gICAgICAgIGludCB3aWR0aCA9IDA7Ci0gICAgICAgIEltYWdlIGltYWdlID0gZ2V0SW1hZ2UoKTsKLSAgICAgICAgaWYgKGltYWdlICE9IG51bGwpCi0gICAgICAgICAgICB3aWR0aCArPSBpbWFnZS5nZXRCb3VuZHMoKS53aWR0aDsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBnZXRUZXh0KCk7Ci0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChpbWFnZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHdpZHRoICs9IElOVEVSTkFMX1NQQUNJTkc7Ci0gICAgICAgICAgICB3aWR0aCArPSBnYy50ZXh0RXh0ZW50KHRleHQsIFNXVC5EUkFXX01ORU1PTklDKS54OwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJlbnQuc2hvd0Nsb3NlKQotICAgICAgICAgICAgd2lkdGggKz0gSU5URVJOQUxfU1BBQ0lORyArIHByZWZlcnJlZEhlaWdodChnYyk7IC8vIGNsb3NlYmFyIHdpbGwgYmUgc3F1YXJlIGFuZCB3aWxsIGZpbGwgcHJlZmVycmVkIGhlaWdodAotICAgICAgICByZXR1cm4gd2lkdGggKyBMRUZUX01BUkdJTiArIFJJR0hUX01BUkdJTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb250cm9sIHRoYXQgaXMgdXNlZCB0byBmaWxsIHRoZSBjbGllbnQgYXJlYSBvZgotICAgICAqIHRoZSB0YWIgZm9sZGVyIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGUgdGFiIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogQHBhcmFtIGNvbnRyb2wgdGhlIG5ldyBjb250cm9sIChvciBudWxsKQotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIGNvbnRyb2wgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPiAKLSAgICAgKiAgICA8bGk+RVJST1JfSU5WQUxJRF9QQVJFTlQgLSBpZiB0aGUgY29udHJvbCBpcyBub3QgaW4gdGhlIHNhbWUgd2lkZ2V0IHRyZWU8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb250cm9sLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2wuZ2V0UGFyZW50KCkgIT0gcGFyZW50KQotICAgICAgICAgICAgICAgIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9QQVJFTlQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLmNvbnRyb2wgIT0gbnVsbCAmJiAhdGhpcy5jb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgdGhpcy5jb250cm9sLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuY29udHJvbCA9IGNvbnRyb2w7Ci0gICAgICAgIGlmICh0aGlzLmNvbnRyb2wgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gcGFyZW50LmluZGV4T2YodGhpcyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gcGFyZW50LmdldFNlbGVjdGlvbkluZGV4KCkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuc2V0Qm91bmRzKHBhcmVudC5nZXRDbGllbnRBcmVhKCkpOwotICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAoaW1hZ2UgIT0gbnVsbCAmJiBpbWFnZS5lcXVhbHMoZ2V0SW1hZ2UoKSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN1cGVyLnNldEltYWdlKGltYWdlKTsKLSAgICAgICAgcGFyZW50LnJlc2V0VGFiU2l6ZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbWFnZSB0aGF0IGlzIGRpc3BsYXllZCBpZiB0aGUgdGFiIGl0ZW0gaXMgZGlzYWJsZWQuCi0gICAgICogTnVsbCB3aWxsIGNsZWFyIHRoZSBpbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlIHRvIGJlIGRpc3BsYXllZCB3aGVuIHRoZSBpdGVtIGlzIGRpc2FibGVkIG9yIG51bGwKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNhYmxlZEltYWdlKEltYWdlIGltYWdlKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChpbWFnZSAhPSBudWxsICYmIGltYWdlLmVxdWFscyhnZXREaXNhYmxlZEltYWdlKCkpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBkaXNhYmxlZEltYWdlID0gaW1hZ2U7Ci0gICAgICAgIHBhcmVudC5yZWRyYXcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHdpZGdldCB0ZXh0LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIHdpZGdldCBsYWJlbC4gIFRoZSBsYWJlbCBtYXkgaW5jbHVkZQotICAgICAqIG1uZW1vbmljIGNoYXJhY3RlcnMgYnV0IG11c3Qgbm90IGNvbnRhaW4gbGluZSBkZWxpbWl0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZyB0aGUgbmV3IGxhYmVsIGZvciB0aGUgd2lkZ2V0Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgdGV4dCBpcyBudWxsPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgaWYgKHN0cmluZy5lcXVhbHMoZ2V0VGV4dCgpKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc3VwZXIuc2V0VGV4dChzdHJpbmcpOwotICAgICAgICBzaG9ydGVuZWRUZXh0ID0gbnVsbDsKLSAgICAgICAgc2hvcnRlbmVkVGV4dFdpZHRoID0gMDsKLSAgICAgICAgcGFyZW50LnJlc2V0VGFiU2l6ZShmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmVjZWl2ZXIncyB0b29sIHRpcCB0ZXh0IHRvIHRoZSBhcmd1bWVudCwgd2hpY2gKLSAgICAgKiBtYXkgYmUgbnVsbCBpbmRpY2F0aW5nIHRoYXQgbm8gdG9vbCB0aXAgdGV4dCBzaG91bGQgYmUgc2hvd24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBuZXcgdG9vbCB0aXAgdGV4dCAob3IgbnVsbCkKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dChTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIHRvb2xUaXBUZXh0ID0gc3RyaW5nOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ByZXNlbnRhdGlvbnMvcjIxL3dpZGdldHMvUjIxUGFuZUZvbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvd2lkZ2V0cy9SMjFQYW5lRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MGY4MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvd2lkZ2V0cy9SMjFQYW5lRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMucjIxLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubGF5b3V0LlNpemVDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLnV0aWwuUHJveHlDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVN0YWNrUHJlc2VudGF0aW9uU2l0ZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHRhYiBmb2xkZXJzIHRoYXQgY29udGFpbnMgY2FuIGNvbnRhaW4gdHdvIHRvb2xiYXJzIGFuZAotICogc3RhdHVzIHRleHQuIFdoZXJldmVyIHBvc3NpYmxlLCB0aGUgdG9vbGJhcnMgYXJlIGFsaWduZWQgd2l0aCB0aGUgdGFicy4gCi0gKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gYmVzaWRlIHRoZSB0YWJzLCB0aGUgdG9vbGJhcnMgYXJlIGFsaWduZWQgd2l0aCB0aGUgc3RhdHVzIHRleHQuIFRoaXMKLSAqIGlzIHRoZSBzYW1lIHRhYiBmb2xkZXIgdGhhdCBpcyB1c2VkIHRvIGFycmFuZ2Ugdmlld3MgYW5kIGVkaXRvcnMgaW4gRWNsaXBzZS4gCi0gKiA8cD4KLSAqIFRoaXMgaXMgY2xvc2VseSByZWxhdGVkIHRvIERlZmF1bHRQYXJ0UHJlc2VudGF0aW9uLCBidXQgdGhleSBoYXZlIGRpZmZlcmVudCByZXNwb25zaWJpbGl0aWVzLiBUaGlzCi0gKiBpcyBlc3NlbnRpYWxseSBhIENUYWJGb2xkZXIgdGhhdCBjYW4gbWFuYWdlIGEgdG9vbGJhci4gSXQgc2hvdWxkIG5vdCBkZXBlbmQgb24gCi0gKiBkYXRhIHN0cnVjdHVyZXMgZnJvbSB0aGUgd29ya2JlbmNoLCBhbmQgaXRzIHB1YmxpYyBpbnRlcmZhY2Ugc2hvdWxkIG9ubHkgdXNlIFNXVCBvYmplY3RzIG9yCi0gKiBsaXN0ZW5lcnMuIERlZmF1bHRQYXJ0UHJlc2VudGF0aW9uIHVzZXMgYSBQYW5lRm9sZGVyIHRvIGFycmFuZ2Ugdmlld3Mgb3IgZWRpdG9ycy4gS25vd2xlZGdlCi0gKiBvZiBoaWdoZXItbGV2ZWwgZGF0YSBzdHJ1Y3R1cmVzIHNob3VsZCBnbyB0aGVyZS4gCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEFsdGhvdWdoIGl0IGlzIG5vdCBhY3R1YWxseSBhIGNvbnRyb2wsIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGlzIG11Y2ggbGlrZSAKLSAqIGFuIFNXVCBjb250cm9sLiBJbXBsZW1lbnRhdGlvbi13aXNlLCB0aGlzIGlzIGFjdHVhbGx5IGEgY29tYmluYXRpb24gb2YgYSBDVGFiRm9sZGVyIGFuZCAKLSAqIGEgVmlld0Zvcm0uIEl0IGVuY2Fwc3VsYXRlcyB0aGUgZGV0YWlscyBvZiBtb3ZpbmcgdGhlIHRvb2xiYXIgYmV0d2VlbiB0aGUgQ1RhYkZvbGRlciBhbmQKLSAqIHRoZSBWaWV3Rm9ybSwgYW5kIHByb3ZpZGVzIGEgc2ltcGxlciBpbnRlcmZhY2UgdG8gdGhlIFZpZXdGb3JtL0NUYWJGb2xkZXIuIAotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSMjFQYW5lRm9sZGVyIHsKLSAgICAvLyBUYWIgZm9sZGVyIGFuZCBhc3NvY2lhdGVkIHByb3h5IGNvbnRyb2xzCi0gICAgcHJpdmF0ZSBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQotICAgIC8vCXByaXZhdGUgQ29udHJvbCB0aXRsZUFyZWFQcm94eTsJCi0KLSAgICAvLyBWaWV3IGZvcm0gYW5kIGFzc29jaWF0ZWQgcHJveHkgY29udHJvbHMKLSAgICBwcml2YXRlIFZpZXdGb3JtIHZpZXdGb3JtOwotCi0gICAgcHJpdmF0ZSBQcm94eUNvbnRyb2wgY29udGVudFByb3h5OwotCi0gICAgcHJpdmF0ZSBQcm94eUNvbnRyb2wgdmlld0Zvcm1Ub3BMZWZ0UHJveHk7Ci0KLSAgICBwcml2YXRlIFByb3h5Q29udHJvbCB2aWV3Rm9ybVRvcFJpZ2h0UHJveHk7Ci0KLSAgICBwcml2YXRlIFByb3h5Q29udHJvbCB2aWV3Rm9ybVRvcENlbnRlclByb3h5OwotCi0gICAgLy8gQ2FjaGVkIHNpemVzIG9mIHRoZSB0b3AtcmlnaHQgYW5kIHRvcC1jZW50ZXIgY29udHJvbHMKLSAgICBwcml2YXRlIFNpemVDYWNoZSB0b3BSaWdodENhY2hlID0gbmV3IFNpemVDYWNoZSgpOwotCi0gICAgcHJpdmF0ZSBTaXplQ2FjaGUgdG9wQ2VudGVyQ2FjaGUgPSBuZXcgU2l6ZUNhY2hlKCk7Ci0KLSAgICBwcml2YXRlIFNpemVDYWNoZSB0b3BMZWZ0Q2FjaGUgPSBuZXcgU2l6ZUNhY2hlKCk7Ci0KLSAgICBwcml2YXRlIGludCB0YWJQb3M7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcHV0VHJpbU9uVG9wID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIFBhbmVGb2xkZXJCdXR0b25MaXN0ZW5lcgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBidXR0b25MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCi0gICAgcHJpdmF0ZSBpbnQgc3RhdGUgPSBJU3RhY2tQcmVzZW50YXRpb25TaXRlLlNUQVRFX1JFU1RPUkVEOwotCi0gICAgLyoqCi0gICAgICogU3RhdGUgb2YgdGhlIGZvbGRlciBhdCB0aGUgbGFzdCBtb3VzZWRvd24gZXZlbnQuIFRoaXMgaXMgdXNlZCB0byBwcmV2ZW50Ci0gICAgICogYSBtb3VzZXVwIG92ZXIgdGhlIG1pbmltaXplIG9yIG1heGltaXplIGJ1dHRvbnMgZnJvbSB1bmRvaW5nIGEgc3RhdGUgY2hhbmdlIAotICAgICAqIHRoYXQgd2FzIGNhdXNlZCBieSB0aGUgbW91c2Vkb3duLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1vdXNlZG93blN0YXRlID0gLTE7Ci0KLSAgICAvLwkvLyBDVGFiRm9sZGVyIGxpc3RlbmVyCi0gICAgLy8JcHJpdmF0ZSBDVGFiRm9sZGVyMkFkYXB0ZXIgZXhwYW5kTGlzdGVuZXIgPSBuZXcgQ1RhYkZvbGRlcjJBZGFwdGVyKCkgewotICAgIC8vCQlwdWJsaWMgdm9pZCBtaW5pbWl6ZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLSAgICAvLwkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLSAgICAvLwkJCW5vdGlmeUJ1dHRvbkxpc3RlbmVycyhJU3RhY2tQcmVzZW50YXRpb25TaXRlLlNUQVRFX01JTklNSVpFRCk7Ci0gICAgLy8JCX0KLSAgICAvLwkJCi0gICAgLy8JCXB1YmxpYyB2b2lkIHJlc3RvcmUoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7Ci0gICAgLy8JCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0gICAgLy8JCQlub3RpZnlCdXR0b25MaXN0ZW5lcnMoSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9SRVNUT1JFRCk7Ci0gICAgLy8JCX0KLSAgICAvLwkJCi0gICAgLy8JCXB1YmxpYyB2b2lkIG1heGltaXplKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotICAgIC8vCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgIC8vCQkJbm90aWZ5QnV0dG9uTGlzdGVuZXJzKElTdGFja1ByZXNlbnRhdGlvblNpdGUuU1RBVEVfTUFYSU1JWkVEKTsKLSAgICAvLwkJfQotICAgIC8vCQkKLSAgICAvLwkJLyogKG5vbi1KYXZhZG9jKQotICAgIC8vCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjJBZGFwdGVyI2Nsb3NlKG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckV2ZW50KQotICAgIC8vCQkgKi8KLSAgICAvLwkJcHVibGljIHZvaWQgY2xvc2UoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7Ci0gICAgLy8JCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0gICAgLy8JCQlub3RpZnlDbG9zZUxpc3RlbmVycygoQ1RhYkl0ZW0pZXZlbnQuaXRlbSk7Ci0gICAgLy8JCX0KLSAgICAvLwkJCi0gICAgLy8JCXB1YmxpYyB2b2lkIHNob3dMaXN0KENUYWJGb2xkZXJFdmVudCBldmVudCkgewotICAgIC8vCQkJbm90aWZ5U2hvd0xpc3RlbmVycyhldmVudCk7Ci0gICAgLy8JCX0KLSAgICAvLwkJCi0gICAgLy8JfTsKLSAgICAvLwkKLSAgICBwcml2YXRlIE1vdXNlTGlzdGVuZXIgbW91c2VMaXN0ZW5lciA9IG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIG1vdXNlZG93blN0YXRlID0gZ2V0U3RhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHBhbmUgZm9sZGVyLiBUaGlzIHdpbGwgY3JlYXRlIGV4YWN0bHkgb25lIGNoaWxkIGNvbnRyb2wgaW4gdGhlCi0gICAgICogZ2l2ZW4gcGFyZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiBAcGFyYW0gZmxhZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgUjIxUGFuZUZvbGRlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0YWIgZm9sZGVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhYkZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHBhcmVudCwgZmxhZ3MpOwotCi0gICAgICAgICAgICAvLwkJCS8vIENyZWF0ZSBhIHByb3h5IGNvbnRyb2wgdG8gbWVhc3VyZSB0aGUgdGl0bGUgYXJlYSBvZiB0aGUgdGFiIGZvbGRlcgotICAgICAgICAgICAgLy8JCQl0aXRsZUFyZWFQcm94eSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAvLwkJCXRpdGxlQXJlYVByb3h5LnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgLy8JCQl0YWJGb2xkZXIuc2V0VG9wUmlnaHQodGl0bGVBcmVhUHJveHksIFNXVC5GSUxMKTsKLQotICAgICAgICAgICAgLy8JCQl0YWJGb2xkZXIuYWRkQ1RhYkZvbGRlcjJMaXN0ZW5lcihleHBhbmRMaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLwkJCQotICAgICAgICAgICAgdGFiRm9sZGVyLmFkZE1vdXNlTGlzdGVuZXIobW91c2VMaXN0ZW5lcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbml0aWFsaXplIHZpZXcgZm9ybQotICAgICAgICB7Ci0gICAgICAgICAgICB2aWV3Rm9ybSA9IG5ldyBWaWV3Rm9ybSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQotICAgICAgICAgICAgLy8gT25seSBhdHRhY2ggdGhlc2UgdG8gdGhlIHZpZXdGb3JtIHdoZW4gdGhlcmUncyBhY3R1YWxsIGEgY29udHJvbCB0byBkaXNwbGF5Ci0gICAgICAgICAgICB2aWV3Rm9ybVRvcExlZnRQcm94eSA9IG5ldyBQcm94eUNvbnRyb2wodmlld0Zvcm0pOwotICAgICAgICAgICAgdmlld0Zvcm1Ub3BDZW50ZXJQcm94eSA9IG5ldyBQcm94eUNvbnRyb2wodmlld0Zvcm0pOwotICAgICAgICAgICAgdmlld0Zvcm1Ub3BSaWdodFByb3h5ID0gbmV3IFByb3h5Q29udHJvbCh2aWV3Rm9ybSk7Ci0KLSAgICAgICAgICAgIGNvbnRlbnRQcm94eSA9IG5ldyBQcm94eUNvbnRyb2wodmlld0Zvcm0pOwotICAgICAgICAgICAgdmlld0Zvcm0uc2V0Q29udGVudChjb250ZW50UHJveHkuZ2V0Q29udHJvbCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbWFpbiBjb250cm9sIGZvciB0aGlzIHBhbmUgZm9sZGVyCi0gICAgICogCi0gICAgICogQHJldHVybiBDb21wb3NpdGUgdGhlIGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7Ci0gICAgICAgIHJldHVybiB0YWJGb2xkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdG9wLWNlbnRlciBjb250cm9sICh1c3VhbGx5IGEgdG9vbGJhciksIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGNvbnRyb2wgY2FuIGhhdmUgYW55IHBhcmVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9wQ2VudGVyIHRoZSB0b3AtY2VudGVyIGNvbnRyb2wgb3IgbnVsbCBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9wQ2VudGVyKENvbnRyb2wgdG9wQ2VudGVyKSB7Ci0gICAgICAgIHRvcENlbnRlckNhY2hlLnNldENvbnRyb2wodG9wQ2VudGVyKTsKLSAgICAgICAgaWYgKHRvcENlbnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIXB1dFRyaW1PblRvcCkgewotICAgICAgICAgICAgICAgIHZpZXdGb3JtVG9wQ2VudGVyUHJveHkuc2V0VGFyZ2V0KHRvcENlbnRlckNhY2hlKTsKLSAgICAgICAgICAgICAgICB2aWV3Rm9ybS5zZXRUb3BDZW50ZXIodmlld0Zvcm1Ub3BDZW50ZXJQcm94eS5nZXRDb250cm9sKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFwdXRUcmltT25Ub3ApIHsKLSAgICAgICAgICAgICAgICB2aWV3Rm9ybS5zZXRUb3BDZW50ZXIobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0b3AtcmlnaHQgY29udHJvbCAodXN1YWxseSBhIGRyb3Bkb3duKSwgb3IgbnVsbCBpZiBub25lCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvcFJpZ2h0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9wUmlnaHQoQ29udHJvbCB0b3BSaWdodCkgewotICAgICAgICB0b3BSaWdodENhY2hlLnNldENvbnRyb2wodG9wUmlnaHQpOwotICAgICAgICBpZiAodG9wUmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFwdXRUcmltT25Ub3ApIHsKLSAgICAgICAgICAgICAgICB2aWV3Rm9ybVRvcFJpZ2h0UHJveHkuc2V0VGFyZ2V0KHRvcFJpZ2h0Q2FjaGUpOwotICAgICAgICAgICAgICAgIHZpZXdGb3JtLnNldFRvcFJpZ2h0KHZpZXdGb3JtVG9wUmlnaHRQcm94eS5nZXRDb250cm9sKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFwdXRUcmltT25Ub3ApIHsKLSAgICAgICAgICAgICAgICB2aWV3Rm9ybS5zZXRUb3BSaWdodChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRvcC1sZWZ0IGNvbnRyb2wgKHVzdWFsbHkgYSB0aXRsZSBsYWJlbCksIG9yIG51bGwgaWYgbm9uZQotICAgICAqIAotICAgICAqIEBwYXJhbSB0b3BMZWZ0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9wTGVmdChDb250cm9sIHRvcExlZnQpIHsKLSAgICAgICAgaWYgKHRvcExlZnRDYWNoZS5nZXRDb250cm9sKCkgIT0gdG9wTGVmdCkgewotICAgICAgICAgICAgdG9wTGVmdENhY2hlLnNldENvbnRyb2wodG9wTGVmdCk7Ci0gICAgICAgICAgICAvLyBUaGUgdG9wLWxlZnQgY29udHJvbCBhbHdheXMgZ29lcyBkaXJlY3RseSBpbiB0aGUgVmlld0Zvcm0KLSAgICAgICAgICAgIGlmICh0b3BMZWZ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3Rm9ybVRvcExlZnRQcm94eS5zZXRUYXJnZXQodG9wTGVmdENhY2hlKTsKLSAgICAgICAgICAgICAgICB2aWV3Rm9ybS5zZXRUb3BMZWZ0KHZpZXdGb3JtVG9wTGVmdFByb3h5LmdldENvbnRyb2woKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZpZXdGb3JtVG9wTGVmdFByb3h5LnNldFRhcmdldENvbnRyb2wobnVsbCk7Ci0gICAgICAgICAgICAgICAgdmlld0Zvcm0uc2V0VG9wTGVmdChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZsdXNoIGFsbCBvZiB0aGlzIGZvbGRlcidzIHNpemUgY2FjaGVzIHRvIGVuc3VyZSB0aGV5IHdpbGwgYmUgcmUtY29tcHV0ZWQKLSAgICAgKiBvbiB0aGUgbmV4dCBsYXlvdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgICAgIHRvcExlZnRDYWNoZS5mbHVzaCgpOwotICAgICAgICB0b3BSaWdodENhY2hlLmZsdXNoKCk7Ci0gICAgICAgIHRvcENlbnRlckNhY2hlLmZsdXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGF5b3V0IHRoZSByZWNlaXZlciwgZmx1c2luZyB0aGUgY2FjaGUgaWYgbmVlZGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmbHVzaENhY2hlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbGF5b3V0KGJvb2xlYW4gZmx1c2hDYWNoZSkgewotICAgICAgICAvLyBGbHVzaCB0aGUgY2FjaGVkIHNpemVzIGlmIG5lY2Vzc2FyeQotICAgICAgICBpZiAoZmx1c2hDYWNoZSkKLSAgICAgICAgICAgIGZsdXNoKCk7Ci0KLSAgICAgICAgUmVjdGFuZ2xlIHRhYkZvbGRlckNsaWVudEFyZWEgPSB0YWJGb2xkZXIuZ2V0Q2xpZW50QXJlYSgpOwotCi0gICAgICAgIC8vIEhpZGUgdGFicyBpZiB0aGVyZSBpcyBvbmx5IG9uZQotICAgICAgICBpZiAodGFiRm9sZGVyLmdldEl0ZW1Db3VudCgpIDwgMikgewotICAgICAgICAgICAgLy9SZWN0YW5nbGUgdGFiRm9sZGVyQm91bmRzID0gdGFiRm9sZGVyLmdldEJvdW5kcygpOwotCi0gICAgICAgICAgICBpbnQgZGVsdGEgPSBnZXRUYWJIZWlnaHQoKSArIDE7Ci0gICAgICAgICAgICB0YWJGb2xkZXJDbGllbnRBcmVhLmhlaWdodCArPSBkZWx0YTsKLQotICAgICAgICAgICAgaWYgKGdldFRhYlBvc2l0aW9uKCkgPT0gU1dULlRPUCkgewotICAgICAgICAgICAgICAgIHRhYkZvbGRlckNsaWVudEFyZWEueSAtPSBkZWx0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZpZXdGb3JtLnNldEJvdW5kcyh0YWJGb2xkZXJDbGllbnRBcmVhKTsKLSAgICAgICAgdmlld0Zvcm1Ub3BSaWdodFByb3h5LmxheW91dCgpOwotICAgICAgICB2aWV3Rm9ybVRvcExlZnRQcm94eS5sYXlvdXQoKTsKLSAgICAgICAgdmlld0Zvcm1Ub3BDZW50ZXJQcm94eS5sYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGllbnQgYXJlYSBmb3IgdGhpcyBQYW5lRm9sZGVyLCByZWxhdGl2ZSB0byB0aGUgcGFuZSBmb2xkZXIncyBjb250cm9sLgotICAgICAqIAotICAgICAqIEByZXR1cm4gUmVjdGFuZ2xlIHRoZSBjbGllbnQgYXJlYSAKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldENsaWVudEFyZWEoKSB7Ci0gICAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBjb250ZW50UHJveHkuZ2V0Q29udHJvbCgpLmdldEJvdW5kcygpOwotCi0gICAgICAgIFJlY3RhbmdsZSBmb3JtQXJlYSA9IHZpZXdGb3JtLmdldEJvdW5kcygpOwotCi0gICAgICAgIGJvdW5kcy54ICs9IGZvcm1BcmVhLng7Ci0gICAgICAgIGJvdW5kcy55ICs9IGZvcm1BcmVhLnk7Ci0KLSAgICAgICAgcmV0dXJuIGJvdW5kczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBmb2xkZXIgKGFzIHNob3duIG9uIHRoZSBidXR0b24gaWNvbnMpCi0gICAgICogCi0gICAgICogQHJldHVybiBvbmUgb2YgdGhlIElTdGFja1ByZXNlbnRhdGlvblNpdGUuU1RBVEVfKiBjb25zdGFudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFN0YXRlKCkgewotICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGJ1dHRvbklkIG9uZSBvZiB0aGUgSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV8qIGNvbnN0YW50cwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeUJ1dHRvbkxpc3RlbmVycyhpbnQgYnV0dG9uSWQpIHsKLSAgICAgICAgaWYgKG1vdXNlZG93blN0YXRlID09IGdldFN0YXRlKCkpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBidXR0b25MaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgUjIxUGFuZUZvbGRlckJ1dHRvbkxpc3RlbmVyIGxpc3RlbmVyID0gKFIyMVBhbmVGb2xkZXJCdXR0b25MaXN0ZW5lcikgaXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGxpc3RlbmVyLnN0YXRlQnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyBhbGwgbGlzdGVuZXJzIHRoYXQgdGhlIHVzZXIgY2xpY2tlZCBvbiB0aGUgY2hldnJvbgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeVNob3dMaXN0ZW5lcnMoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBidXR0b25MaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFIyMVBhbmVGb2xkZXJCdXR0b25MaXN0ZW5lciBsaXN0ZW5lciA9IChSMjFQYW5lRm9sZGVyQnV0dG9uTGlzdGVuZXIpIGl0ZXIKLSAgICAgICAgICAgICAgICAgICAgLm5leHQoKTsKLQotICAgICAgICAgICAgbGlzdGVuZXIuc2hvd0xpc3QoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgYWxsIGxpc3RlbmVycyB0aGF0IHRoZSBjbG9zZSBidXR0b24gd2FzIHByZXNzZWQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFiSXRlbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeUNsb3NlTGlzdGVuZXJzKENUYWJJdGVtIHRhYkl0ZW0pIHsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGJ1dHRvbkxpc3RlbmVycy5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgUjIxUGFuZUZvbGRlckJ1dHRvbkxpc3RlbmVyIGxpc3RlbmVyID0gKFIyMVBhbmVGb2xkZXJCdXR0b25MaXN0ZW5lcikgaXRlcgotICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwotCi0gICAgICAgICAgICBsaXN0ZW5lci5jbG9zZUJ1dHRvblByZXNzZWQodGFiSXRlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRCdXR0b25MaXN0ZW5lcihSMjFQYW5lRm9sZGVyQnV0dG9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgYnV0dG9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQnV0dG9uTGlzdGVuZXIoUjIxUGFuZUZvbGRlckJ1dHRvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGJ1dHRvbkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuZXdUYWJQb3NpdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhYlBvc2l0aW9uKGludCBuZXdUYWJQb3NpdGlvbikgewotICAgICAgICB0YWJQb3MgPSBuZXdUYWJQb3NpdGlvbjsKLSAgICAgICAgdGFiRm9sZGVyLnNldFRhYlBvc2l0aW9uKHRhYlBvcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpbnQgdGhlIHBvc3Rpb24gb2YgdGhlIHRhYgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VGFiUG9zaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB0YWJQb3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0gICAgICAgIHJldHVybiB0YWJGb2xkZXIgPT0gbnVsbCB8fCB0YWJGb2xkZXIuaXNEaXNwb3NlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzdHlsZQotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEByZXR1cm4gQ1RhYkl0ZW0gdGhlIGNyZWF0ZWQgaXRlbQotICAgICAqLwotICAgIHB1YmxpYyBDVGFiSXRlbSBjcmVhdGVJdGVtKGludCBzdHlsZSwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBzdHlsZSwgaW5kZXgpOwotICAgIH0KLQotICAgIC8vIFRoZSByZW1haW5kZXIgb2YgdGhlIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyByZWRpcmVjdCBkaXJlY3RseSB0byBDVGFiRm9sZGVyIG1ldGhvZHMKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IHNlbGVjdGlvbikgewotICAgICAgICB0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGkKLSAgICAgKiBAcGFyYW0gagotICAgICAqIEBwYXJhbSBrCi0gICAgICogQHBhcmFtIGwKLSAgICAgKiBAcmV0dXJuIFJlY3RhbmdsZSB0aGUgdHJpbSByZWN0YW5nbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVjdGFuZ2xlIGNvbXB1dGVUcmltKGludCBpLCBpbnQgaiwgaW50IGssIGludCBsKSB7Ci0gICAgICAgIHJldHVybiB0YWJGb2xkZXIuY29tcHV0ZVRyaW0oaSwgaiwgaywgbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZnQ29sb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKENvbG9yIGZnQ29sb3IpIHsKLSAgICAgICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbkZvcmVncm91bmQoZmdDb2xvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGlkeAotICAgICAqIEByZXR1cm4gQ1RhYkl0ZW0gdGhlIGluZGV4ZWQgaXRlbQotICAgICAqLwotICAgIHB1YmxpYyBDVGFiSXRlbSBnZXRJdGVtKGludCBpZHgpIHsKLSAgICAgICAgcmV0dXJuIHRhYkZvbGRlci5nZXRJdGVtKGlkeCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpbnQgdGhlIHNlbGVjdGVkIGl0ZW1zIGluZGV4Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTZWxlY3Rpb25JbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gaW50IHRoZSBoZWlnaHQgb2YgdGhlIHRhYnMKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFRhYkhlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuIHRhYkZvbGRlci5nZXRUYWJIZWlnaHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdG9GaW5kCi0gICAgICogQHJldHVybiBpbnQgdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGZpbmQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoQ1RhYkl0ZW0gdG9GaW5kKSB7Ci0gICAgICAgIHJldHVybiB0YWJGb2xkZXIuaW5kZXhPZih0b0ZpbmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBoZWlnaHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWJIZWlnaHQoaW50IGhlaWdodCkgewotICAgICAgICB0YWJGb2xkZXIuc2V0VGFiSGVpZ2h0KGhlaWdodCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpbnQgdGhlIGl0ZW0gY291bnQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEl0ZW1Db3VudCgpIHsKLSAgICAgICAgcmV0dXJuIHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIENUYWJJdGVtIHRoZSBpdGVtcwotICAgICAqLwotICAgIHB1YmxpYyBDVGFiSXRlbVtdIGdldEl0ZW1zKCkgewotICAgICAgICByZXR1cm4gdGFiRm9sZGVyLmdldEl0ZW1zKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRvR2V0Ci0gICAgICogQHJldHVybiBDVGFiSXRlbSB0aGUgaW5kZXhlZCBpdGVtCi0gICAgICovCi0gICAgcHVibGljIENUYWJJdGVtIGdldEl0ZW0oUG9pbnQgdG9HZXQpIHsKLSAgICAgICAgcmV0dXJuIHRhYkZvbGRlci5nZXRJdGVtKHRvR2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIENUYWJJdGVtIHRoZSBzZWxlY3RlZCBpdGVtCi0gICAgICovCi0gICAgcHVibGljIENUYWJJdGVtIGdldFNlbGVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL3IyMS93aWRnZXRzL1IyMVBhbmVGb2xkZXJCdXR0b25MaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvd2lkZ2V0cy9SMjFQYW5lRm9sZGVyQnV0dG9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyMmYyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL3IyMS93aWRnZXRzL1IyMVBhbmVGb2xkZXJCdXR0b25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMucjIxLndpZGdldHM7Ci0KLS8qKgotICogVGhpcyBsaXN0ZW5lciByZWNlaXZlcyBub3RpZmljYXRpb25zIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIG9uZSBvZgotICogdGhlIGJ1dHRvbnMgKG1pbmltaXplLCBtYXhpbWl6ZSwgb3IgcmVzdG9yZSkgb24gYSBwYW5lIGZvbGRlci4gIAotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSMjFQYW5lRm9sZGVyQnV0dG9uTGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIG1pbmltaXplLCBtYXhpbWl6ZSwgb3IgcmVzdG9yZSBidXR0b25zIGFyZSBwcmVzc2VkLgotICAgICAqICAgCi0gICAgICogQHBhcmFtIGJ1dHRvbklkIG9uZSBvZiB0aGUgSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV8qIGNvbnN0YW50cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXRlQnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBwcmVzc2VkLgotICAgICAqICAgCi0gICAgICogQHBhcmFtIGl0ZW0gdGhlIHRhYiB3aG9zZSBjbG9zZSBidXR0b24gd2FzIHByZXNzZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZUJ1dHRvblByZXNzZWQoQ1RhYkl0ZW0gaXRlbSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaG93TGlzdChDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL3IyMS93aWRnZXRzL1ZpZXdGb3JtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9wcmVzZW50YXRpb25zL3IyMS93aWRnZXRzL1ZpZXdGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzliYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvcHJlc2VudGF0aW9ucy9yMjEvd2lkZ2V0cy9WaWV3Rm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLnIyMS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGltcGxlbWVudCBhIENvbXBvc2l0ZSB0aGF0IGxheXMgb3V0IHRocmVlCi0gKiBjaGlsZHJlbiBob3Jpem9udGFsbHkgYW5kIGFsbG93cyBwcm9ncmFtbWF0aWMgY29udHJvbCBvZiBsYXlvdXQgYW5kCi0gKiBib3JkZXIgcGFyYW1ldGVycy4gVmlld0Zvcm0gaXMgdXNlZCBpbiB0aGUgd29ya2JlbmNoIHRvIGltcGxlbWVudCBhCi0gKiB2aWV3J3MgbGFiZWwvbWVudS90b29sYmFyIGxvY2FsIGJhci4KLSAqIDxwPgotICogTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LAotICogaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBzZXQgYSBsYXlvdXQgb24gaXQuCi0gKiA8L3A+PHA+Ci0gKiA8ZGw+Ci0gKiA8ZHQ+PGI+U3R5bGVzOjwvYj48L2R0PgotICogPGRkPkJPUkRFUiwgRkxBVDwvZGQ+Ci0gKiA8ZHQ+PGI+RXZlbnRzOjwvYj48L2R0PgotICogPGRkPihOb25lKTwvZGQ+Ci0gKiA8L2RsPgotICogPHA+Ci0gKiBJTVBPUlRBTlQ6IFRoaXMgY2xhc3MgaXMgPGVtPm5vdDwvZW0+IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKi8KLQotcHVibGljIGNsYXNzIFZpZXdGb3JtIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotICAgIC8qKgotICAgICAqIG1hcmdpbldpZHRoIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHBpeGVscyBvZiBob3Jpem9udGFsIG1hcmdpbgotICAgICAqIHRoYXQgd2lsbCBiZSBwbGFjZWQgYWxvbmcgdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzIG9mIHRoZSBmb3JtLgotICAgICAqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG1hcmdpbldpZHRoID0gMDsKLQotICAgIC8qKgotICAgICAqIG1hcmdpbkhlaWdodCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwaXhlbHMgb2YgdmVydGljYWwgbWFyZ2luCi0gICAgICogdGhhdCB3aWxsIGJlIHBsYWNlZCBhbG9uZyB0aGUgdG9wIGFuZCBib3R0b20gZWRnZXMgb2YgdGhlIGZvcm0uCi0gICAgICoKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgbWFyZ2luSGVpZ2h0ID0gMDsKLQotICAgIC8qKgotICAgICAqIENvbG9yIG9mIGlubmVybW9zdCBsaW5lIG9mIGRyb3Agc2hhZG93IGJvcmRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJHQiBib3JkZXJJbnNpZGVSR0IgPSBuZXcgUkdCKDEzMiwgMTMwLCAxMzIpOwotCi0gICAgLyoqCi0gICAgICogQ29sb3Igb2YgbWlkZGxlIGxpbmUgb2YgZHJvcCBzaGFkb3cgYm9yZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUkdCIGJvcmRlck1pZGRsZVJHQiA9IG5ldyBSR0IoMTQzLCAxNDEsIDEzOCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb2xvciBvZiBvdXRlcm1vc3QgbGluZSBvZiBkcm9wIHNoYWRvdyBib3JkZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSR0IgYm9yZGVyT3V0c2lkZVJHQiA9IG5ldyBSR0IoMTcxLCAxNjgsIDE2NSk7Ci0KLSAgICAvLyBTV1Qgd2lkZ2V0cwotICAgIHByaXZhdGUgQ29udHJvbCB0b3BMZWZ0OwotCi0gICAgcHJpdmF0ZSBDb250cm9sIHRvcENlbnRlcjsKLQotICAgIHByaXZhdGUgQ29udHJvbCB0b3BSaWdodDsKLQotICAgIHByaXZhdGUgQ29udHJvbCBjb250ZW50OwotCi0gICAgLy8gQ29uZmlndXJhdGlvbiBhbmQgc3RhdGUgaW5mbwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXBhcmF0ZVRvcENlbnRlciA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBpbnQgZHJhd0xpbmUxID0gLTE7Ci0KLSAgICBwcml2YXRlIGludCBkcmF3TGluZTIgPSAtMTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93Qm9yZGVyID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGludCBCT1JERVJfVE9QID0gMDsKLQotICAgIHByaXZhdGUgaW50IEJPUkRFUl9CT1RUT00gPSAwOwotCi0gICAgcHJpdmF0ZSBpbnQgQk9SREVSX0xFRlQgPSAwOwotCi0gICAgcHJpdmF0ZSBpbnQgQk9SREVSX1JJR0hUID0gMDsKLQotICAgIHByaXZhdGUgQ29sb3IgYm9yZGVyQ29sb3IxOwotCi0gICAgcHJpdmF0ZSBDb2xvciBib3JkZXJDb2xvcjI7Ci0KLSAgICBwcml2YXRlIENvbG9yIGJvcmRlckNvbG9yMzsKLQotICAgIHByaXZhdGUgUmVjdGFuZ2xlIG9sZEFyZWE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0ZGU0NSRUVOID0gLTIwMDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBnaXZlbiBpdHMgcGFyZW50Ci0gICAgICogYW5kIGEgc3R5bGUgdmFsdWUgZGVzY3JpYmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHN0eWxlIHZhbHVlIGlzIGVpdGhlciBvbmUgb2YgdGhlIHN0eWxlIGNvbnN0YW50cyBkZWZpbmVkIGluCi0gICAgICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCi0gICAgICogY2xhc3MsIG9yIG11c3QgYmUgYnVpbHQgYnkgPGVtPmJpdHdpc2UgT1I8L2VtPidpbmcgdG9nZXRoZXIgCi0gICAgICogKHRoYXQgaXMsIHVzaW5nIHRoZSA8Y29kZT5pbnQ8L2NvZGU+ICJ8IiBvcGVyYXRvcikgdHdvIG9yIG1vcmUKLSAgICAgKiBvZiB0aG9zZSA8Y29kZT5TV1Q8L2NvZGU+IHN0eWxlIGNvbnN0YW50cy4gVGhlIGNsYXNzIGRlc2NyaXB0aW9uCi0gICAgICogbGlzdHMgdGhlIHN0eWxlIGNvbnN0YW50cyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBjbGFzcy4KLSAgICAgKiBTdHlsZSBiaXRzIGFyZSBhbHNvIGluaGVyaXRlZCBmcm9tIHN1cGVyY2xhc3Nlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IGEgd2lkZ2V0IHdoaWNoIHdpbGwgYmUgdGhlIHBhcmVudCBvZiB0aGUgbmV3IGluc3RhbmNlIChjYW5ub3QgYmUgbnVsbCkKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIHdpZGdldCB0byBjb25zdHJ1Y3QKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50PC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBTV1QjQk9SREVSCi0gICAgICogQHNlZSBTV1QjRkxBVAotICAgICAqIEBzZWUgI2dldFN0eWxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgVmlld0Zvcm0oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgY2hlY2tTdHlsZShzdHlsZSkpOwotCi0gICAgICAgIGJvcmRlckNvbG9yMSA9IG5ldyBDb2xvcihnZXREaXNwbGF5KCksIGJvcmRlckluc2lkZVJHQik7Ci0gICAgICAgIGJvcmRlckNvbG9yMiA9IG5ldyBDb2xvcihnZXREaXNwbGF5KCksIGJvcmRlck1pZGRsZVJHQik7Ci0gICAgICAgIGJvcmRlckNvbG9yMyA9IG5ldyBDb2xvcihnZXREaXNwbGF5KCksIGJvcmRlck91dHNpZGVSR0IpOwotICAgICAgICBzZXRCb3JkZXJWaXNpYmxlKChzdHlsZSAmIFNXVC5CT1JERVIpICE9IDApOwotCi0gICAgICAgIGFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIG9uUGFpbnQoZXZlbnQuZ2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgb25SZXNpemUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBvbkRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHN0eWxlIGJpdHMgdG8gZW5zdXJlIHRoYXQgbm8gaW52YWxpZCBzdHlsZXMgYXJlIGFwcGxpZWQuCi0gICAgICogQHByaXZhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tTdHlsZShpbnQgc3R5bGUpIHsKLSAgICAgICAgaW50IG1hc2sgPSBTV1QuRkxBVCB8IFNXVC5MRUZUX1RPX1JJR0hUIHwgU1dULlJJR0hUX1RPX0xFRlQ7Ci0gICAgICAgIHJldHVybiBzdHlsZSAmIG1hc2sgfCBTV1QuTk9fUkVEUkFXX1JFU0laRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICAvLyBzaXplIG9mIHRpdGxlIGJhciBhcmVhCi0gICAgICAgIFBvaW50IGxlZnRTaXplID0gbmV3IFBvaW50KDAsIDApOwotICAgICAgICBpZiAodG9wTGVmdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsZWZ0U2l6ZSA9IHRvcExlZnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgICAgIGxlZnRTaXplLnggKz0gMTsgLy8gKzEgZm9yIGhpZ2hsaWdodCBsaW5lCi0gICAgICAgIH0KLSAgICAgICAgUG9pbnQgY2VudGVyU2l6ZSA9IG5ldyBQb2ludCgwLCAwKTsKLSAgICAgICAgaWYgKHRvcENlbnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjZW50ZXJTaXplID0gdG9wQ2VudGVyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgICAgIH0KLSAgICAgICAgUG9pbnQgcmlnaHRTaXplID0gbmV3IFBvaW50KDAsIDApOwotICAgICAgICBpZiAodG9wUmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmlnaHRTaXplID0gdG9wUmlnaHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgfQotICAgICAgICBQb2ludCBzaXplID0gbmV3IFBvaW50KDAsIDApOwotICAgICAgICAvLyBjYWxjdWxhdGUgd2lkdGggb2YgdGl0bGUgYmFyCi0gICAgICAgIGlmIChzZXBhcmF0ZVRvcENlbnRlcgotICAgICAgICAgICAgICAgIHx8ICh3SGludCAhPSBTV1QuREVGQVVMVCAmJiBsZWZ0U2l6ZS54ICsgY2VudGVyU2l6ZS54Ci0gICAgICAgICAgICAgICAgICAgICAgICArIHJpZ2h0U2l6ZS54ID4gd0hpbnQpKSB7Ci0gICAgICAgICAgICBzaXplLnggPSBsZWZ0U2l6ZS54ICsgcmlnaHRTaXplLng7Ci0gICAgICAgICAgICBzaXplLnggPSBNYXRoLm1heChjZW50ZXJTaXplLngsIHNpemUueCk7Ci0gICAgICAgICAgICBzaXplLnkgPSBNYXRoLm1heChsZWZ0U2l6ZS55LCByaWdodFNpemUueSkgKyAxOyAvLyArMSBmb3IgaGlnaGxpZ2h0IGxpbmUKLSAgICAgICAgICAgIGlmICh0b3BDZW50ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNpemUueSArPSBjZW50ZXJTaXplLnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaXplLnggPSBsZWZ0U2l6ZS54ICsgY2VudGVyU2l6ZS54ICsgcmlnaHRTaXplLng7Ci0gICAgICAgICAgICBzaXplLnkgPSBNYXRoLm1heChsZWZ0U2l6ZS55LCBNYXRoLm1heChjZW50ZXJTaXplLnksIHJpZ2h0U2l6ZS55KSkgKyAxOyAvLyArMSBmb3IgaGlnaGxpZ2h0IGxpbmUKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBvaW50IGNvbnRlbnRTaXplID0gbmV3IFBvaW50KDAsIDApOwotICAgICAgICAgICAgY29udGVudFNpemUgPSBjb250ZW50LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgICAgICAgICBzaXplLnggPSBNYXRoLm1heChzaXplLngsIGNvbnRlbnRTaXplLngpOwotICAgICAgICAgICAgc2l6ZS55ICs9IGNvbnRlbnRTaXplLnkgKyAxOyAvLyArMSBmb3IgbGluZSBiZXd0ZWVuIGNvbnRlbnQgYW5kIGhlYWRlcgotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZS54ICs9IDIgKiBtYXJnaW5XaWR0aDsKLSAgICAgICAgc2l6ZS55ICs9IDIgKiBtYXJnaW5IZWlnaHQ7Ci0KLSAgICAgICAgaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUKQotICAgICAgICAgICAgc2l6ZS54ID0gd0hpbnQ7Ci0gICAgICAgIGlmIChoSGludCAhPSBTV1QuREVGQVVMVCkKLSAgICAgICAgICAgIHNpemUueSA9IGhIaW50OwotCi0gICAgICAgIFJlY3RhbmdsZSB0cmltID0gY29tcHV0ZVRyaW0oMCwgMCwgc2l6ZS54LCBzaXplLnkpOwotICAgICAgICByZXR1cm4gbmV3IFBvaW50KHRyaW0ud2lkdGgsIHRyaW0uaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVjdGFuZ2xlIGNvbXB1dGVUcmltKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGludCB0cmltWCA9IHggLSBCT1JERVJfTEVGVDsKLSAgICAgICAgaW50IHRyaW1ZID0geSAtIEJPUkRFUl9UT1A7Ci0gICAgICAgIGludCB0cmltV2lkdGggPSB3aWR0aCArIEJPUkRFUl9MRUZUICsgQk9SREVSX1JJR0hUOwotICAgICAgICBpbnQgdHJpbUhlaWdodCA9IGhlaWdodCArIEJPUkRFUl9UT1AgKyBCT1JERVJfQk9UVE9NOwotICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh0cmltWCwgdHJpbVksIHRyaW1XaWR0aCwgdHJpbUhlaWdodCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlY3RhbmdsZSBnZXRDbGllbnRBcmVhKCkgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHN1cGVyLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgY2xpZW50QXJlYS54ICs9IEJPUkRFUl9MRUZUOwotICAgICAgICBjbGllbnRBcmVhLnkgKz0gQk9SREVSX1RPUDsKLSAgICAgICAgY2xpZW50QXJlYS53aWR0aCAtPSBCT1JERVJfTEVGVCArIEJPUkRFUl9SSUdIVDsKLSAgICAgICAgY2xpZW50QXJlYS5oZWlnaHQgLT0gQk9SREVSX1RPUCArIEJPUkRFUl9CT1RUT007Ci0gICAgICAgIHJldHVybiBjbGllbnRBcmVhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgYXJlYS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250cm9sIGluIHRoZSBjb250ZW50IGFyZWEgb2YgdGhlIHBhbmUgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBDb250cm9sIGdldENvbnRlbnQoKSB7Ci0gICAgICAgIC8vY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBDb250cm9sIHRoYXQgYXBwZWFycyBpbiB0aGUgdG9wIGNlbnRlciBvZiB0aGUgcGFuZS4KLSAgICAgKiBUeXBpY2FsbHkgdGhpcyBpcyBhIHRvb2xiYXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udHJvbCBpbiB0aGUgdG9wIGNlbnRlciBvZiB0aGUgcGFuZSBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgZ2V0VG9wQ2VudGVyKCkgewotICAgICAgICAvL2NoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIHJldHVybiB0b3BDZW50ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQ29udHJvbCB0aGF0IGFwcGVhcnMgaW4gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcGFuZS4KLSAgICAgKiBUeXBpY2FsbHkgdGhpcyBpcyBhIGxhYmVsIHN1Y2ggYXMgQ0xhYmVsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRyb2wgaW4gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcGFuZSBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgZ2V0VG9wTGVmdCgpIHsKLSAgICAgICAgLy9jaGVja1dpZGdldCgpOwotICAgICAgICByZXR1cm4gdG9wTGVmdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250cm9sIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyIG9mIHRoZSBwYW5lLgotICAgICAqIFR5cGljYWxseSB0aGlzIGlzIGEgQ2xvc2UgYnV0dG9uIG9yIGEgY29tcG9zaXRlIHdpdGggYSBNZW51IGFuZCBDbG9zZSBidXR0b24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udHJvbCBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgcGFuZSBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgZ2V0VG9wUmlnaHQoKSB7Ci0gICAgICAgIC8vY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgcmV0dXJuIHRvcFJpZ2h0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxheW91dChib29sZWFuIGNoYW5nZWQpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBnZXRDbGllbnRBcmVhKCk7Ci0KLSAgICAgICAgZHJhd0xpbmUxID0gLTE7Ci0gICAgICAgIGRyYXdMaW5lMiA9IC0xOwotCi0gICAgICAgIFBvaW50IGxlZnRTaXplID0gbmV3IFBvaW50KDAsIDApOwotICAgICAgICBpZiAodG9wTGVmdCAhPSBudWxsICYmICF0b3BMZWZ0LmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgbGVmdFNpemUgPSB0b3BMZWZ0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgICAgIH0KLSAgICAgICAgUG9pbnQgY2VudGVyU2l6ZSA9IG5ldyBQb2ludCgwLCAwKTsKLSAgICAgICAgaWYgKHRvcENlbnRlciAhPSBudWxsICYmICF0b3BDZW50ZXIuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBjZW50ZXJTaXplID0gdG9wQ2VudGVyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgICAgIH0KLSAgICAgICAgUG9pbnQgcmlnaHRTaXplID0gbmV3IFBvaW50KDAsIDApOwotICAgICAgICBpZiAodG9wUmlnaHQgIT0gbnVsbCAmJiAhdG9wUmlnaHQuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICByaWdodFNpemUgPSB0b3BSaWdodC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1pblRvcFdpZHRoID0gbGVmdFNpemUueCArIGNlbnRlclNpemUueCArIHJpZ2h0U2l6ZS54ICsgMgotICAgICAgICAgICAgICAgICogbWFyZ2luV2lkdGggKyAxOyAvLyArMSBmb3IgaGlnaGxpZ2h0IGxpbmUJCi0gICAgICAgIGludCBoZWlnaHQgPSByZWN0LnkgKyBtYXJnaW5IZWlnaHQ7Ci0KLSAgICAgICAgYm9vbGVhbiB0b3AgPSBmYWxzZTsKLSAgICAgICAgaWYgKHNlcGFyYXRlVG9wQ2VudGVyIHx8IG1pblRvcFdpZHRoID4gcmVjdC53aWR0aCkgewotICAgICAgICAgICAgaW50IHRvcEhlaWdodCA9IE1hdGgubWF4KHJpZ2h0U2l6ZS55LCBsZWZ0U2l6ZS55KTsKLSAgICAgICAgICAgIGlmICh0b3BSaWdodCAhPSBudWxsICYmICF0b3BSaWdodC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICB0b3AgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRvcFJpZ2h0LnNldEJvdW5kcyhyZWN0LnggKyByZWN0LndpZHRoIC0gbWFyZ2luV2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gcmlnaHRTaXplLngsIHJlY3QueSArIDEgKyBtYXJnaW5IZWlnaHQsIHJpZ2h0U2l6ZS54LAotICAgICAgICAgICAgICAgICAgICAgICAgdG9wSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBoZWlnaHQgKz0gMSArIHRvcEhlaWdodDsgLy8gKzEgZm9yIGhpZ2hsaWdodCBsaW5lCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodG9wTGVmdCAhPSBudWxsICYmICF0b3BMZWZ0LmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgIHRvcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbGVmdFNpemUgPSB0b3BMZWZ0LmNvbXB1dGVTaXplKHJlY3Qud2lkdGggLSAyICogbWFyZ2luV2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gcmlnaHRTaXplLnggLSAxLCBTV1QuREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgdG9wTGVmdC5zZXRCb3VuZHMocmVjdC54ICsgMSArIG1hcmdpbldpZHRoLCByZWN0LnkgKyAxCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1hcmdpbkhlaWdodCwgbGVmdFNpemUueCwgdG9wSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSBNYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAubWF4KGhlaWdodCwgcmVjdC55ICsgbWFyZ2luSGVpZ2h0ICsgMSArIHRvcEhlaWdodCk7IC8vICsxIGZvciBoaWdobGlnaHQgbGluZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRvcENlbnRlciAhPSBudWxsICYmICF0b3BDZW50ZXIuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgdG9wID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoaGVpZ2h0ID4gcmVjdC55ICsgbWFyZ2luSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lMSA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICs9IDE7IC8vICsxIGZvciBkaXZpZGVyIGxpbmUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2VudGVyU2l6ZSA9IHRvcENlbnRlci5jb21wdXRlU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Qud2lkdGggLSAyICogbWFyZ2luV2lkdGgsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICB0b3BDZW50ZXIuc2V0Qm91bmRzKHJlY3QueCArIHJlY3Qud2lkdGggLSBtYXJnaW5XaWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgLSBjZW50ZXJTaXplLngsIGhlaWdodCwgY2VudGVyU2l6ZS54LCBjZW50ZXJTaXplLnkpOwotICAgICAgICAgICAgICAgIGhlaWdodCArPSBjZW50ZXJTaXplLnk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCB0b3BIZWlnaHQgPSBNYXRoLm1heChyaWdodFNpemUueSwgTWF0aC5tYXgoY2VudGVyU2l6ZS55LAotICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZS55KSk7Ci0gICAgICAgICAgICBpZiAodG9wUmlnaHQgIT0gbnVsbCAmJiAhdG9wUmlnaHQuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgdG9wID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0b3BSaWdodC5zZXRCb3VuZHMocmVjdC54ICsgcmVjdC53aWR0aCAtIG1hcmdpbldpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAtIHJpZ2h0U2l6ZS54LCByZWN0LnkgKyBtYXJnaW5IZWlnaHQgKyAxLCAvLyArMSBmb3IgaGlnaGxpZ2h0IGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0U2l6ZS54LCB0b3BIZWlnaHQpOwotICAgICAgICAgICAgICAgIGhlaWdodCArPSAxICsgdG9wSGVpZ2h0OyAvLyArMSBmb3IgaGlnaGxpZ2h0IGxpbmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0b3BDZW50ZXIgIT0gbnVsbCAmJiAhdG9wQ2VudGVyLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgIHRvcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdG9wQ2VudGVyLnNldEJvdW5kcyhyZWN0LnggKyByZWN0LndpZHRoIC0gbWFyZ2luV2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gcmlnaHRTaXplLnggLSBjZW50ZXJTaXplLngsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0LnkgKyBtYXJnaW5IZWlnaHQgKyAxLCAvLyArMSBmb3IgaGlnaGxpZ2h0IGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlclNpemUueCwgdG9wSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSBNYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAubWF4KGhlaWdodCwgcmVjdC55ICsgbWFyZ2luSGVpZ2h0ICsgMSArIHRvcEhlaWdodCk7IC8vICsxIGZvciBoaWdobGlnaHQgbGluZSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodG9wTGVmdCAhPSBudWxsICYmICF0b3BMZWZ0LmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgIHRvcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbGVmdFNpemUgPSB0b3BMZWZ0LmNvbXB1dGVTaXplKHJlY3Qud2lkdGggLSAyICogbWFyZ2luV2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gcmlnaHRTaXplLnggLSBjZW50ZXJTaXplLnggLSAxLCB0b3BIZWlnaHQpOwotICAgICAgICAgICAgICAgIHRvcExlZnQuc2V0Qm91bmRzKHJlY3QueCArIG1hcmdpbldpZHRoICsgMSwgLy8gKzEgZm9yIGhpZ2hsaWdodCBsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0LnkgKyBtYXJnaW5IZWlnaHQgKyAxLCAvLyArMSBmb3IgaGlnaGxpZ2h0IGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplLngsIHRvcEhlaWdodCk7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aAotICAgICAgICAgICAgICAgICAgICAgICAgLm1heChoZWlnaHQsIHJlY3QueSArIG1hcmdpbkhlaWdodCArIDEgKyB0b3BIZWlnaHQpOyAvLyArMSBmb3IgaGlnaGxpZ2h0IGxpbmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250ZW50ICE9IG51bGwgJiYgIWNvbnRlbnQuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBpZiAodG9wKSB7Ci0gICAgICAgICAgICAgICAgZHJhd0xpbmUyID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgIGhlaWdodCArPSAxOyAvLyArMSBmb3IgZGl2aWRlciBsaW5lCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgIC5zZXRCb3VuZHMocmVjdC54ICsgbWFyZ2luV2lkdGgsIGhlaWdodCwgcmVjdC53aWR0aCAtIDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1hcmdpbldpZHRoLCByZWN0LnkgKyByZWN0LmhlaWdodCAtIGhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbWFyZ2luSGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChib3JkZXJDb2xvcjEgIT0gbnVsbCkgewotICAgICAgICAgICAgYm9yZGVyQ29sb3IxLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBib3JkZXJDb2xvcjEgPSBudWxsOwotCi0gICAgICAgIGlmIChib3JkZXJDb2xvcjIgIT0gbnVsbCkgewotICAgICAgICAgICAgYm9yZGVyQ29sb3IyLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBib3JkZXJDb2xvcjIgPSBudWxsOwotCi0gICAgICAgIGlmIChib3JkZXJDb2xvcjMgIT0gbnVsbCkgewotICAgICAgICAgICAgYm9yZGVyQ29sb3IzLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBib3JkZXJDb2xvcjMgPSBudWxsOwotCi0gICAgICAgIHRvcExlZnQgPSBudWxsOwotICAgICAgICB0b3BDZW50ZXIgPSBudWxsOwotICAgICAgICB0b3BSaWdodCA9IG51bGw7Ci0gICAgICAgIGNvbnRlbnQgPSBudWxsOwotICAgICAgICBvbGRBcmVhID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEcmF3cyB0aGUgZm9jdXMgYm9yZGVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblBhaW50KEdDIGdjKSB7Ci0gICAgICAgIFJlY3RhbmdsZSBkID0gc3VwZXIuZ2V0Q2xpZW50QXJlYSgpOwotCi0gICAgICAgIGlmIChzaG93Qm9yZGVyKSB7Ci0gICAgICAgICAgICBpZiAoKGdldFN0eWxlKCkgJiBTV1QuRkxBVCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IxKTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKGQueCwgZC55LCBkLnggKyBkLndpZHRoIC0gMSwgZC55ICsgZC5oZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IxKTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKGQueCwgZC55LCBkLnggKyBkLndpZHRoIC0gMywgZC55ICsgZC5oZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gMyk7Ci0KLSAgICAgICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGJvcmRlckNvbG9yMik7Ci0gICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoZC54ICsgMSwgZC55ICsgZC5oZWlnaHQgLSAyLCBkLnggKyBkLndpZHRoIC0gMSwgZC55Ci0gICAgICAgICAgICAgICAgICAgICAgICArIGQuaGVpZ2h0IC0gMik7Ci0gICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoZC54ICsgZC53aWR0aCAtIDIsIGQueSArIDEsIGQueCArIGQud2lkdGggLSAyLCBkLnkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZC5oZWlnaHQgLSAxKTsKLQotICAgICAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IzKTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZShkLnggKyAyLCBkLnkgKyBkLmhlaWdodCAtIDEsIGQueCArIGQud2lkdGggLSAyLCBkLnkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZC5oZWlnaHQgLSAxKTsKLSAgICAgICAgICAgICAgICBnYy5kcmF3TGluZShkLnggKyBkLndpZHRoIC0gMSwgZC55ICsgMiwgZC54ICsgZC53aWR0aCAtIDEsIGQueQotICAgICAgICAgICAgICAgICAgICAgICAgKyBkLmhlaWdodCAtIDIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRyYXdMaW5lMSAhPSAtMSkgewotICAgICAgICAgICAgLy8gdG9wIHNlcGVyYXRvciBsaW5lCi0gICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGJvcmRlckNvbG9yMSk7Ci0gICAgICAgICAgICBnYy5kcmF3TGluZShkLnggKyBCT1JERVJfTEVGVCwgZHJhd0xpbmUxLCBkLnggKyBkLndpZHRoCi0gICAgICAgICAgICAgICAgICAgIC0gQk9SREVSX1JJR0hULCBkcmF3TGluZTEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkcmF3TGluZTIgIT0gLTEpIHsKLSAgICAgICAgICAgIC8vIGNvbnRlbnQgc2VwYXJhdG9yIGxpbmUKLSAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IxKTsKLSAgICAgICAgICAgIGdjLmRyYXdMaW5lKGQueCArIEJPUkRFUl9MRUZULCBkcmF3TGluZTIsIGQueCArIGQud2lkdGgKLSAgICAgICAgICAgICAgICAgICAgLSBCT1JERVJfUklHSFQsIGRyYXdMaW5lMik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaGlnaGxpZ2h0IG9uIHRvcAotICAgICAgICBpbnQgeSA9IGRyYXdMaW5lMTsKLSAgICAgICAgaWYgKHkgPT0gLTEpIHsKLSAgICAgICAgICAgIHkgPSBkcmF3TGluZTI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHkgIT0gLTEpIHsKLSAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKAotICAgICAgICAgICAgICAgICAgICBTV1QuQ09MT1JfV0lER0VUX0hJR0hMSUdIVF9TSEFET1cpKTsKLSAgICAgICAgICAgIGdjLmRyYXdMaW5lKGQueCArIEJPUkRFUl9MRUZUICsgbWFyZ2luV2lkdGgsIGQueSArIEJPUkRFUl9UT1AKLSAgICAgICAgICAgICAgICAgICAgKyBtYXJnaW5IZWlnaHQsIGQueCArIEJPUkRFUl9MRUZUICsgbWFyZ2luV2lkdGgsIHkgLSAxKTsKLSAgICAgICAgICAgIGdjLmRyYXdMaW5lKGQueCArIEJPUkRFUl9MRUZUICsgbWFyZ2luV2lkdGgsIGQueSArIEJPUkRFUl9UT1AKLSAgICAgICAgICAgICAgICAgICAgKyBtYXJnaW5IZWlnaHQsIGQueCArIGQud2lkdGggLSBCT1JERVJfUklHSFQgLSBtYXJnaW5XaWR0aAotICAgICAgICAgICAgICAgICAgICAtIDEsIGQueSArIEJPUkRFUl9UT1AgKyBtYXJnaW5IZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvblJlc2l6ZSgpIHsKLSAgICAgICAgbGF5b3V0KCk7Ci0KLSAgICAgICAgUmVjdGFuZ2xlIGFyZWEgPSBzdXBlci5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgIGlmIChvbGRBcmVhID09IG51bGwgfHwgb2xkQXJlYS53aWR0aCA9PSAwIHx8IG9sZEFyZWEuaGVpZ2h0ID09IDApIHsKLSAgICAgICAgICAgIHJlZHJhdygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHdpZHRoID0gMDsKLSAgICAgICAgICAgIGlmIChvbGRBcmVhLndpZHRoIDwgYXJlYS53aWR0aCkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gYXJlYS53aWR0aCAtIG9sZEFyZWEud2lkdGggKyBCT1JERVJfUklHSFQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG9sZEFyZWEud2lkdGggPiBhcmVhLndpZHRoKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGggPSBCT1JERVJfUklHSFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWRyYXcoYXJlYS54ICsgYXJlYS53aWR0aCAtIHdpZHRoLCBhcmVhLnksIHdpZHRoLCBhcmVhLmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIGlmIChvbGRBcmVhLmhlaWdodCA8IGFyZWEuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gYXJlYS5oZWlnaHQgLSBvbGRBcmVhLmhlaWdodCArIEJPUkRFUl9CT1RUT007Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2xkQXJlYS5oZWlnaHQgPiBhcmVhLmhlaWdodCkgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IEJPUkRFUl9CT1RUT007Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWRyYXcoYXJlYS54LCBhcmVhLnkgKyBhcmVhLmhlaWdodCAtIGhlaWdodCwgYXJlYS53aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgb2xkQXJlYSA9IGFyZWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudC4KLSAgICAgKiBTZXR0aW5nIHRoZSBjb250ZW50IHRvIG51bGwgd2lsbCByZW1vdmUgaXQgZnJvbSAKLSAgICAgKiB0aGUgcGFuZSAtIGhvd2V2ZXIsIHRoZSBjcmVhdG9yIG9mIHRoZSBjb250ZW50IG11c3QgZGlzcG9zZSBvZiB0aGUgY29udGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGVudCB0aGUgY29udHJvbCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNvbnRlbnQgYXJlYSBvciBudWxsCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnQoQ29udHJvbCBjb250ZW50KSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChjb250ZW50ICE9IG51bGwgJiYgY29udGVudC5nZXRQYXJlbnQoKSAhPSB0aGlzKSB7Ci0gICAgICAgICAgICBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLmNvbnRlbnQgIT0gbnVsbCAmJiAhdGhpcy5jb250ZW50LmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgdGhpcy5jb250ZW50LnNldEJvdW5kcyhPRkZTQ1JFRU4sIE9GRlNDUkVFTiwgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDsKLSAgICAgICAgbGF5b3V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB3aWRnZXQgZm9udC4KLSAgICAgKiBUaGlzIHdpbGwgYXBwbHkgdGhlIGZvbnQgdG8gdGhlIHRvcExlZnQsIHRvcFJpZ2h0IGFuZCB0b3BDZW50ZXIgd2lkZ2V0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZikgewotICAgICAgICBzdXBlci5zZXRGb250KGYpOwotICAgICAgICBpZiAodG9wTGVmdCAhPSBudWxsICYmICF0b3BMZWZ0LmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHRvcExlZnQuc2V0Rm9udChmKTsKLSAgICAgICAgaWYgKHRvcENlbnRlciAhPSBudWxsICYmICF0b3BDZW50ZXIuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgdG9wQ2VudGVyLnNldEZvbnQoZik7Ci0gICAgICAgIGlmICh0b3BSaWdodCAhPSBudWxsICYmICF0b3BSaWdodC5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICB0b3BSaWdodC5zZXRGb250KGYpOwotCi0gICAgICAgIGxheW91dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxheW91dCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyIHRvIGJlCi0gICAgICogdGhlIGFyZ3VtZW50IHdoaWNoIG1heSBiZSBudWxsLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgOiBWaWV3Rm9ybSBkb2VzIG5vdCB1c2UgYSBsYXlvdXQgY2xhc3MgdG8gc2l6ZSBhbmQgcG9zaXRpb24gaXRzIGNoaWxkcmVuLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsYXlvdXQgdGhlIHJlY2VpdmVyJ3MgbmV3IGxheW91dCBvciBudWxsCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGF5b3V0KExheW91dCBsYXlvdXQpIHsKLSAgICAgICAgY2hlY2tXaWRnZXQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY29udHJvbCB0aGF0IGFwcGVhcnMgaW4gdGhlIHRvcCBjZW50ZXIgb2YgdGhlIHBhbmUuCi0gICAgICogVHlwaWNhbGx5IHRoaXMgaXMgYSB0b29sYmFyLgotICAgICAqIFRoZSB0b3BDZW50ZXIgaXMgb3B0aW9uYWwuICBTZXR0aW5nIHRoZSB0b3BDZW50ZXIgdG8gbnVsbCB3aWxsIHJlbW92ZSBpdCBmcm9tIAotICAgICAqIHRoZSBwYW5lIC0gaG93ZXZlciwgdGhlIGNyZWF0b3Igb2YgdGhlIHRvcENlbnRlciBtdXN0IGRpc3Bvc2Ugb2YgdGhlIHRvcENlbnRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9wQ2VudGVyIHRoZSBjb250cm9sIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdG9wIGNlbnRlciBvciBudWxsCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvcENlbnRlcihDb250cm9sIHRvcENlbnRlcikgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAodG9wQ2VudGVyICE9IG51bGwgJiYgdG9wQ2VudGVyLmdldFBhcmVudCgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMudG9wQ2VudGVyICE9IG51bGwgJiYgIXRoaXMudG9wQ2VudGVyLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgdGhpcy50b3BDZW50ZXIuc2V0Qm91bmRzKE9GRlNDUkVFTiwgT0ZGU0NSRUVOLCAwLCAwKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnRvcENlbnRlciA9IHRvcENlbnRlcjsKLSAgICAgICAgbGF5b3V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjb250cm9sIHRoYXQgYXBwZWFycyBpbiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBwYW5lLgotICAgICAqIFR5cGljYWxseSB0aGlzIGlzIGEgbGFiZWwgc3VjaCBhcyBDTGFiZWwuCi0gICAgICogVGhlIHRvcExlZnQgaXMgb3B0aW9uYWwuICBTZXR0aW5nIHRoZSB0b3AgbGVmdCBjb250cm9sIHRvIG51bGwgd2lsbCByZW1vdmUgaXQgZnJvbSAKLSAgICAgKiB0aGUgcGFuZSAtIGhvd2V2ZXIsIHRoZSBjcmVhdG9yIG9mIHRoZSBjb250cm9sIG11c3QgZGlzcG9zZSBvZiB0aGUgY29udHJvbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyB0aGUgY29udHJvbCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRvcCBsZWZ0IGNvcm5lciBvciBudWxsCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICAgICAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICAgICAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvcExlZnQoQ29udHJvbCBjKSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5nZXRQYXJlbnQoKSAhPSB0aGlzKSB7Ci0gICAgICAgICAgICBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLnRvcExlZnQgIT0gbnVsbCAmJiAhdGhpcy50b3BMZWZ0LmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgdGhpcy50b3BMZWZ0LnNldEJvdW5kcyhPRkZTQ1JFRU4sIE9GRlNDUkVFTiwgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy50b3BMZWZ0ID0gYzsKLSAgICAgICAgbGF5b3V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjb250cm9sIHRoYXQgYXBwZWFycyBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgcGFuZS4KLSAgICAgKiBUeXBpY2FsbHkgdGhpcyBpcyBhIENsb3NlIGJ1dHRvbiBvciBhIGNvbXBvc2l0ZSB3aXRoIGEgTWVudSBhbmQgQ2xvc2UgYnV0dG9uLgotICAgICAqIFRoZSB0b3BSaWdodCBpcyBvcHRpb25hbC4gIFNldHRpbmcgdGhlIHRvcCByaWdodCBjb250cm9sIHRvIG51bGwgd2lsbCByZW1vdmUgaXQgZnJvbSAKLSAgICAgKiB0aGUgcGFuZSAtIGhvd2V2ZXIsIHRoZSBjcmVhdG9yIG9mIHRoZSBjb250cm9sIG11c3QgZGlzcG9zZSBvZiB0aGUgY29udHJvbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyB0aGUgY29udHJvbCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgb3IgbnVsbAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgY29udHJvbCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIFZpZXdGb3JtPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvcFJpZ2h0KENvbnRyb2wgYykgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMuZ2V0UGFyZW50KCkgIT0gdGhpcykgewotICAgICAgICAgICAgU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy50b3BSaWdodCAhPSBudWxsICYmICF0aGlzLnRvcFJpZ2h0LmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgdGhpcy50b3BSaWdodC5zZXRCb3VuZHMoT0ZGU0NSRUVOLCBPRkZTQ1JFRU4sIDAsIDApOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMudG9wUmlnaHQgPSBjOwotICAgICAgICBsYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIGJvcmRlciBzaG91bGQgYmUgZGlzcGxheWVkIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2hvdyB0cnVlIGlmIHRoZSBib3JkZXIgc2hvdWxkIGJlIGRpc3BsYXllZAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAgICAgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAgICAgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCb3JkZXJWaXNpYmxlKGJvb2xlYW4gc2hvdykgewotICAgICAgICBjaGVja1dpZGdldCgpOwotICAgICAgICBpZiAoc2hvd0JvcmRlciA9PSBzaG93KQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHNob3dCb3JkZXIgPSBzaG93OwotICAgICAgICBpZiAoc2hvd0JvcmRlcikgewotICAgICAgICAgICAgaWYgKChnZXRTdHlsZSgpICYgU1dULkZMQVQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBCT1JERVJfTEVGVCA9IEJPUkRFUl9UT1AgPSBCT1JERVJfUklHSFQgPSBCT1JERVJfQk9UVE9NID0gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQk9SREVSX0xFRlQgPSBCT1JERVJfVE9QID0gMTsKLSAgICAgICAgICAgICAgICBCT1JERVJfUklHSFQgPSBCT1JERVJfQk9UVE9NID0gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJPUkRFUl9CT1RUT00gPSBCT1JERVJfVE9QID0gQk9SREVSX0xFRlQgPSBCT1JERVJfUklHSFQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgbGF5b3V0KCk7Ci0gICAgICAgIHJlZHJhdygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRydWUsIHRoZSB0b3BDZW50ZXIgd2lsbCBhbHdheXMgYXBwZWFyIG9uIGEgc2VwYXJhdGUgbGluZSBieSBpdHNlbGYsIG90aGVyd2lzZSB0aGUgCi0gICAgICogdG9wQ2VudGVyIHdpbGwgYXBwZWFyIGluIHRoZSB0b3Agcm93IGlmIHRoZXJlIGlzIHJvb20gYW5kIHdpbGwgYmUgbW92ZWQgdG8gdGhlIHNlY29uZCByb3cgaWYKLSAgICAgKiByZXF1aXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2hvdyB0cnVlIGlmIHRoZSB0b3BDZW50ZXIgd2lsbCBhbHdheXMgYXBwZWFyIG9uIGEgc2VwYXJhdGUgbGluZSBieSBpdHNlbGYKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gICAgICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gICAgICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9wQ2VudGVyU2VwYXJhdGUoYm9vbGVhbiBzaG93KSB7Ci0gICAgICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgICAgIHNlcGFyYXRlVG9wQ2VudGVyID0gc2hvdzsKLSAgICAgICAgbGF5b3V0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjU4OWUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDE8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL1J1biBSY3BUdXRvcmlhbDEubG5rIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL1J1biBSY3BUdXRvcmlhbDEubG5rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmM1ZjRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS9SdW4gUmNwVHV0b3JpYWwxLmxuaworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDQwYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgcGFydDEuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGh0bWwvCi1zb3VyY2UucGFydDEuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL2h0bWwvZGVmYXVsdF9zdHlsZS5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvaHRtbC9kZWZhdWx0X3N0eWxlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2NWY1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvaHRtbC9kZWZhdWx0X3N0eWxlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLXAsIHRhYmxlLCB0ZCwgdGggeyAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0fQotcHJlIHsgIGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vOyBmb250LXNpemU6IDEwcHQ7IGJhY2tncm91bmQ6ICNFRUVFRUU7fQotaDIgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDE4cHQ7IGZvbnQtd2VpZ2h0OiBib2xkIDsgbGluZS1oZWlnaHQ6IDE0cHh9Ci1jb2RlIHsgIGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vOyBmb250LXNpemU6IDEwcHR9Ci1zdXAgeyAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYSxnZW5ldmE7IGZvbnQtc2l6ZTogMTBweH0KLWgzIHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGR9Ci1saSB7ICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDEwcHR9Ci1oMSB7ICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDI4cHg7IGZvbnQtd2VpZ2h0OiBib2xkfQotYm9keSB7ICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDEwcHQ7IGNsaXA6ICAgcmVjdCggICApOyBtYXJnaW4tdG9wOiA1bW07IG1hcmdpbi1sZWZ0OiAzbW19Ci0uaW5kZXh0b3AgeyBmb250LXNpemU6IHgtbGFyZ2U7OyBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGR9Ci0uaW5kZXhzdWIgeyBmb250LXNpemU6IHh4LXNtYWxsOzsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGNvbG9yOiAjODA4MEZGfQotYS5iYXI6bGluayB7ICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOiAjRkZGRkZGfQotYS5iYXI6dmlzaXRlZCB7ICBjb2xvcjogI0ZGRkZGRjsgdGV4dC1kZWNvcmF0aW9uOiBub25lfQotYS5iYXI6aG92ZXIgeyAgY29sb3I6ICNGRkZGRkY7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lfQotYS5iYXIgeyAgY29sb3I6ICNGRkZGRkZ9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvaHRtbC9pbWFnZXMvSWRlYS5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvaHRtbC9pbWFnZXMvSWRlYS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWNlNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL2h0bWwvaW1hZ2VzL0lkZWEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL2h0bWwvaW1hZ2VzL25vdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL2h0bWwvaW1hZ2VzL25vdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjI2MGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS9odG1sL2ltYWdlcy9ub3RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS9odG1sL2ltYWdlcy9zcGluLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS9odG1sL2ltYWdlcy9zcGluLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwNTUxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvaHRtbC9pbWFnZXMvc3Bpbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvaHRtbC9pbWFnZXMvdGlwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS9odG1sL2ltYWdlcy90aXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2IyNDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS9odG1sL2ltYWdlcy90aXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL2h0bWwvdHV0b3JpYWwxLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvaHRtbC90dXRvcmlhbDEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyNzRjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvaHRtbC90dXRvcmlhbDEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotCi08aGVhZD4KLTx0aXRsZT5SaWNoIENsaWVudCBQbGF0Zm9ybTwvdGl0bGU+Ci08bGluayBocmVmPSJkZWZhdWx0X3N0eWxlLmNzcyIgcmVsPXN0eWxlc2hlZXQ+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08ZGl2IGFsaWduPSJyaWdodCI+Ci0gIDxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiwgVGltZXMsIHNlcmlmIiBzaXplPSIyIj5Db3B5cmlnaHQgqSAyMDAzLTIwMDQgRWQKLSAgQnVybmV0dGUuPC9mb250PgotICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICA8dGJvZHk+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGNvbHNwYW49IjIiIGJnY29sb3I9IiMwMDgwYzAiPjxiPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkVjbGlwc2UKLSAgICAgICAgICBBcnRpY2xlPC9mb250PjwvZm9udD48L2I+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90Ym9keT4KLSAgPC90YWJsZT4KLTwvZGl2PgotPGRpdiBhbGlnbj0ibGVmdCI+Ci0gIDxoMSB0aXRsZT0iUkNQIFR1dG9yaWFsIj48aW1nIHNyYz0iaW1hZ2VzL0lkZWEuanBnIiBhbGlnbj0ibWlkZGxlIiB3aWR0aD0iMTIwIiBoZWlnaHQ9Ijg2Ij48L2gxPgotPC9kaXY+Ci08aDEgYWxpZ249ImNlbnRlciI+UmljaCBDbGllbnQgVHV0b3JpYWwgUGFydCAxPC9oMT4KLTxwIGNsYXNzPSJzdW1tYXJ5Ij5UaGUgUmljaCBDbGllbnQgUGxhdGZvcm0gKFJDUCkgaXMgYW4gZXhjaXRpbmcgbmV3IHdheSB0bwotYnVpbGQgSmF2YSBhcHBsaWNhdGlvbnMgdGhhdCBjYW4gY29tcGV0ZSB3aXRoIG5hdGl2ZSBhcHBsaWNhdGlvbnMgb24gYW55Ci1wbGF0Zm9ybS4gVGhpcyB0dXRvcmlhbCBpcyBkZXNpZ25lZCB0byBnZXQgeW91IHN0YXJ0ZWQgYnVpbGRpbmcgUkNQIGFwcGxpY2F0aW9ucwotcXVpY2tseS48L3A+Ci08cD48Yj5CeSBFZCBCdXJuZXR0ZSwgU0FTPC9iPjxicj4KLTxmb250IHNpemU9Ii0xIj5KdWx5IDI4LCAyMDA0PC9mb250PjwvcD4KLTxociB3aWR0aD0iMTAwJSI+Ci08aDI+SW50cm9kdWN0aW9uPC9oMj4KLTxwPlRyeSB0aGlzIGV4cGVyaW1lbnQ6IFNob3cgRWNsaXBzZSB0byBzb21lIGZyaWVuZHMgb3IgY28td29ya2VycyB3aG8gaGF2ZW4ndAotc2VlbiBpdCBiZWZvcmUgYW5kIGFzayB0aGVtIHRvIGd1ZXNzIHdoYXQgbGFuZ3VhZ2UgaXQgaXMgd3JpdHRlbiBpbi4gQ2hhbmNlcwotYXJlLCB0aGV5J2xsIGd1ZXNzIFZCLCBDKyssIG9yIEMjLCBiZWNhdXNlIHRob3NlIGxhbmd1YWdlcyBhcmUgdXNlZCBtb3N0IG9mdGVuCi1mb3IgaGlnaCBxdWFsaXR5IGNsaWVudCBzaWRlIGFwcGxpY2F0aW9ucy4gVGhlbiB3YXRjaCB0aGUgbG9vayBvbiB0aGVpciBmYWNlcwotd2hlbiB5b3UgdGVsbCB0aGVtIGl0IHdhcyBjcmVhdGVkIGluIEphdmEsIGVzcGVjaWFsbHkgaWYgdGhleSBhcmUgSmF2YQotcHJvZ3JhbW1lcnMuPC9wPgotPHA+QmVjYXVzZSBvZiBpdHMgdW5pcXVlIG9wZW4gc291cmNlIGxpY2Vuc2UsIHlvdSBjYW4gdXNlIHRoZSB0ZWNobm9sb2dpZXMgdGhhdAotd2VudCBpbnRvIEVjbGlwc2UgdG8gY3JlYXRlIHlvdXIgb3duIGNvbW1lcmNpYWwgcXVhbGl0eSBwcm9ncmFtcyBXaXRoIHByZXZpb3VzCi12ZXJzaW9uIG9mIEVjbGlwc2UsIHRoaXMgd2FzIHBvc3NpYmxlIGJ1dCBkaWZmaWN1bHQsIGVzcGVjaWFsbHkgd2hlbiB5b3Ugd2FudGVkCi10byBoZWF2aWx5IGN1c3RvbWl6ZSB0aGUgbWVudXMsIGxheW91dHMsIGFuZCBvdGhlciB1c2VyIGludGVyZmFjZSBlbGVtZW50cy4gVGhhdAotd2FzIGJlY2F1c2UgdGhlICZxdW90O0lERS1uZXNzJnF1b3Q7IG9mIEVjbGlwc2Ugd2FzIGhhcmQtd2lyZWQgaW50byBpdC4gVmVyc2lvbgotMyBpbnRyb2R1Y2VzIHRoZSBSaWNoIENsaWVudCBQbGF0Zm9ybSwgd2hpY2ggaXMgYmFzaWNhbGx5IGEgcmVmYWN0b3Jpbmcgb2YgdGhlCi1mdW5kYW1lbnRhbCBwYXJ0cyBvZiBFY2xpcHNlJ3MgVUksIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgZm9yIG5vbi1JREUKLWFwcGxpY2F0aW9ucy48L3A+Ci08cD5JZiB5b3Ugd2FudCB0byBjdXQgdG8gdGhlIGNoYXNlIGFuZCBsb29rIGF0IHRoZSBjb2RlIGZvciB0aGlzIHBhcnQKLXlvdSBjYW4gdXNlIEVjbGlwc2UncyBidWlsdC1pbiAKLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvY3ZzaG93dG8uaHRtbCI+Q1ZTIGNsaWVudDwvYT4KLXRvIGRvd25sb2FkIHRoZSAKLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MSI+c291cmNlIGNvZGU8L2E+Ci10byB5b3VyIHdvcmtzcGFjZS4KLU90aGVyd2lzZSwgbGV0J3MgdGFrZSBhIGxvb2sgYXQgaG93IHRvIGNvbnN0cnVjdAotYW4gUkNQIGFwcGxpY2F0aW9uLjwvcD4KLQotPGgyPjxhIG5hbWU9InNlY3Rpb25fMSI+PC9hPiBHZXR0aW5nIHN0YXJ0ZWQ8L2gyPgotPHA+UkNQIGFwcGxpY2F0aW9ucyBhcmUgYmFzZWQgb24gdGhlIGZhbWlsaWFyIEVjbGlwc2UgcGx1Zy1pbiBhcmNoaXRlY3R1cmUsIChpZgotaXQncyBub3QgZmFtaWxpYXIgdG8geW91LCBzZWUgdGhlIHJlZmVyZW5jZXMgc2VjdGlvbikuIFRoZXJlZm9yZSwgeW91J2xsIG5lZWQgdG8KLWNyZWF0ZSBhIHBsdWctaW4gdG8gYmUgeW91ciBtYWluIHByb2dyYW0uCi1TZWxlY3QgTmV3ICZndDsgUHJvamVjdCAmZ3Q7IFBsdWctaW4KLURldmVsb3BtZW50ICZndDsgUGx1Zy1pbiBQcm9qZWN0IHRvIGJyaW5nIHVwIHRoZSBQbHVnLWluIFByb2plY3Qgd2l6YXJkLiBPbiB0aGUKLXN1YnNlcXVlbnQgcGFnZXMsIGVudGVyIGEgUHJvamVjdCBuYW1lIHN1Y2ggYXMgPGI+b3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MTwvYj4sCi1pbmRpY2F0ZSB5b3Ugd2FudCBhIEphdmEgcHJvamVjdCwgYW5kCi1lbnRlciBhIFBsdWctaW4gSWQgKHRoaXMgc2hvdWxkIG1hdGNoIHRoZSBwcm9qZWN0IG5hbWUpLgotPC9wPgotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL25vdGUuZ2lmIiBhbHQ9Ik5vdGU6ICIgd2lkdGg9IjYyIiBoZWlnaHQ9IjEzIj4KLURvbid0IHNlbGVjdCB0aGUgQWx0ZXJuYXRlIEZvcm1hdCBvcHRpb24gdGhhdCBzYXlzCi1DcmVhdGUgYW4gT1NHaSBidW5kbGUgbWFuaWZlc3QgZm9yIHRoZSBwbHVnLWluLgotU2VlIHRoZSBzZWN0aW9uIG9uIENvbXBhdGliaWxpdHkgYW5kIG1pZ3JhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgotPC9wPgotCi08cD4KLVRoZSBnZW5lcmF0ZWQgcGx1Zy1pbiBjbGFzcyB0aGF0IHlvdSBtYXkgYmUgZmFtaWxpYXIgd2l0aCBpbiBwcmV2aW91cwotcmVsZWFzZXMgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGluIEVjbGlwc2UgMy4wLgotWW91IGNhbiBzdGlsbCBoYXZlIG9uZSB0byBob2xkIGdsb2JhbCBkYXRhIGlmIHlvdSBsaWtlLCBidXQgZm9yIHRoaXMKLWV4YW1wbGUganVzdCByZW1vdmUgaXQgYWx0b2dldGhlciB0byBzYXZlIGEgbGl0dGxlIHNwYWNlLgotVG8gZG8gdGhpcywgdHVybiBvZmYgdGhlIG9wdGlvbiB0aGF0IHNheXMKLUdlbmVyYXRlIHRoZSBKYXZhIGNsYXNzIHRoYXQgY29udHJvbHMgdGhlIHBsdWctaW5zIGxpZmUgY3ljbGUuCi1UaGVuIENsaWNrIG9uIEZpbmlzaCB0bwotZ2VuZXJhdGUgdGhlIHRlbXBsYXRlLgotSWYgeW91IGdldCBhIGRpYWxvZyBhc2tpbmcgaWYgRWNsaXBzZSBjYW4gc3dpdGNoIHRvIHRoZSBQbHVnLWluIERldmVsb3BtZW50Ci1QZXJzcGVjdGl2ZSBjbGljayBZZXMgKHRoaXMgaXMgb3B0aW9uYWwpLjwvcD4KLQotPGgyPlBsdWctaW4gbWFuaWZlc3Q8L2gyPgotPHA+VGhlIHBsdWctaW4gbWFuaWZlc3QsIHBsdWdpbi54bWwsIHRpZXMgYWxsIHRoZSBjb2RlIGFuZCByZXNvdXJjZXMgdG9nZXRoZXIuCi1XaGVuIHlvdSBmaXJzdCBjcmVhdGUgYSBwbHVnLWluLCBFY2xpcHNlIHdpbGwgZWRpdCB0aGUgbWFuaWZlc3QgZm9yIHlvdQotYXV0b21hdGljYWxseS4KLVlvdSBuZWVkIHRvIGRlZmluZSB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgbWFpbiBwcm9ncmFtCi13aXRoIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zPC9jb2RlPiBleHRlbnNpb24KLWFuZCB0aGUgcGVyc3BlY3RpdmUgd2l0aCA8Y29kZT5vcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXM8L2NvZGU+LgotVG8gYWRkIHRoZXNlIGV4dGVuc2lvbnMgdXNlIHRoZSBBZGQgYnV0dG9uIG9uIHRoZSBFeHRlbnNpb25zIHRhYiwKLW9yIGp1c3QgdHlwZSBpbiB0aGUgWE1MIGluIHRoZSBwbHVnaW4ueG1sIHRhYi4KLUFsc28sIHlvdSBuZWVkIHRvIHRlbGwgRWNsaXBzZSB0aGF0IHRoZSBwbHVnLWluIHdpbGwgZGVwZW5kIG9uIHR3byBvdGhlciBFY2xpcHNlIHBsdWdpbnMsCi08Y29kZT5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L2NvZGU+IGFuZAotPGNvZGU+b3JnLmVjbGlwc2UudWk8L2NvZGU+LCBzbyB0aG9zZSBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZQotRGVwZW5kZW5jaWVzIHRhYiBvciBpbiB0aGUgWE1MLgotV2hpbGUgeW91J3JlIGVkaXRpbmcgaXQgeW91IGNhbiBjaGFuZ2UgdGhlIHZlcnNpb24gbnVtYmVyLAotcHJvdmlkZXIgbmFtZSwgYW5kIG90aGVyIG9wdGlvbnMgdG8geW91ciBsaWtpbmcuCi1XaGVuIHlvdSdyZSBkb25lIHlvdXIgcGx1Z2luLnhtbCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSBsaXN0aW5nIDEuCi1UaGUgY2xhc3NlcyByZWZlcmVkIHRvIGhlcmUgd2lsbCBiZSBkZWZpbmVkIGluIHRoZSBuZXh0IHNlY3Rpb24KLWFuZCB0aGUgdGFncyBzdGFydGluZyB3aXRoIHBlcmNlbnRzICglKSB3aWxsIGJlIGRlZmluZWQgbGF0ZXIgaW4gcGx1Z2luLnByb3BlcnRpZXMuCi08L3A+Ci0KLTxwPjxiPkxpc3RpbmcgMS4gcGx1Z2luLnhtbAotPC9iPjwvcD4KLTxwcmU+Ci0mbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7Ci0mbHQ7P2VjbGlwc2UgdmVyc2lvbj0mcXVvdDszLjAmcXVvdDs/Jmd0OwotJmx0O3BsdWdpbgotICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEmcXVvdDsKLSAgICBuYW1lPSZxdW90OyVwbHVnaW5OYW1lJnF1b3Q7Ci0gICAgdmVyc2lvbj0mcXVvdDswLjAuMCZxdW90OwotICAgIHByb3ZpZGVyLW5hbWU9JnF1b3Q7JXByb3ZpZGVyTmFtZSZxdW90OyZndDsKLQotICAgICZsdDtydW50aW1lJmd0OwotICAgICAgICAmbHQ7bGlicmFyeSBuYW1lPSZxdW90O3BhcnQxLmphciZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDtleHBvcnQgbmFtZT0mcXVvdDsqJnF1b3Q7LyZndDsKLSAgICAgICAgJmx0Oy9saWJyYXJ5Jmd0OwotICAgICZsdDsvcnVudGltZSZndDsKLSAgICAmbHQ7cmVxdWlyZXMmZ3Q7Ci0gICAgICAgICZsdDtpbXBvcnQgcGx1Z2luPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucnVudGltZSZxdW90Oy8mZ3Q7Ci0gICAgICAgICZsdDtpbXBvcnQgcGx1Z2luPSZxdW90O29yZy5lY2xpcHNlLnVpJnF1b3Q7LyZndDsKLSAgICAmbHQ7L3JlcXVpcmVzJmd0OwotCi0KLSAgICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgIGlkPSZxdW90O1JjcEFwcGxpY2F0aW9uJnF1b3Q7Ci0gICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMmcXVvdDsmZ3Q7Ci0gICAgICAgICZsdDthcHBsaWNhdGlvbiZndDsKLSAgICAgICAgICAgICZsdDtydW4KLSAgICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxLlJjcEFwcGxpY2F0aW9uJnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0Oy9ydW4mZ3Q7Ci0gICAgICAgICZsdDsvYXBwbGljYXRpb24mZ3Q7Ci0gICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gICAgJmx0O2V4dGVuc2lvbgotICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMmcXVvdDsmZ3Q7Ci0gICAgICAgICZsdDtwZXJzcGVjdGl2ZQotICAgICAgICAgICAgbmFtZT0mcXVvdDslcGVyc3BlY3RpdmVOYW1lJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxLlJjcFBlcnNwZWN0aXZlJnF1b3Q7Ci0gICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxLlJjcFBlcnNwZWN0aXZlJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7L3BlcnNwZWN0aXZlJmd0OwotICAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wbHVnaW4mZ3Q7Ci08L3ByZT4KLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL25vdGUuZ2lmIiBhbHQ9Ik5vdGU6ICIgd2lkdGg9IjYyIiBoZWlnaHQ9IjEzIj4KLUFsdGhvdWdoIGl0J3Mgbm90IGFuIGFic29sdXRlIHJlcXVpcmVtZW50LAotSSByZWNvbW1lbmQga2VlcGluZyB5b3VyIGlkJ3MgYW5kIHlvdXIgY2xhc3MgbmFtZXMgdGhlIHNhbWUuCi1Gb3IgZXhhbXBsZSwgPGNvZGU+b3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS5SY3BBcHBsaWNhdGlvbjwvY29kZT4KLWlzIGJvdGggdGhlIGZ1bGx5IHF1YWxpZmllZCBpZCBmb3IgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY2xhc3MgbmFtZSBvZiB0aGUKLW1haW4gcHJvZ3JhbS4KLUZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIEVjbGlwc2UgcHJlcGVuZHMgdGhlIHBsdWctaW4ncyBpZCB0byB0aGUgaWQgb2YgeW91cgotdG9wIGxldmVsIHBsdWctaW4gZWxlbWVudHMgKGxpa2UgPGNvZGU+ZXh0ZW5zaW9uPC9jb2RlPikgc28gZXZlbiB0aG91Z2gKLXBsdWdpbi54bWwgc2F5cyA8Y29kZT5pZD0iUmNwQXBwbGljYXRpb24iPC9jb2RlPiB0aGUgZnVsbHkgcXVhbGlmaWVkIGlkCi1mb3IgdGhhdCBleHRlbnNpb24gaXMgPGNvZGU+b3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS5SY3BBcHBsaWNhdGlvbjwvY29kZT4uCi1TaW5jZSB0aGUgcGVyc3BlY3RpdmUncyBpZCBpcyB3cml0dGVuIG9uIGEgc3ViLWVsZW1lbnQKLSg8Y29kZT5wZXJzcGVjdGl2ZTwvY29kZT4pIGl0IGhhcyB0byBiZSBzcGVsbGVkIG91dCBjb21wbGV0ZWx5Ci1pbiB0aGUgbWFuaWZlc3QKLSg8Y29kZT5vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxLlJjcFBlcnNwZWN0aXZlPC9jb2RlPikuCi08L3A+Ci0KLTxoMj5UaGUgbWFpbiBwcm9ncmFtPC9oMj4KLTxwPgotVGhlIDxjb2RlPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnM8L2NvZGU+IGV4dGVuc2lvbiB0ZWxscwotdGhlIEVjbGlwc2UgcnVudGltZSB0aGUgbmFtZSBvZiB5b3VyIG1haW4gcHJvZ3JhbS4KLUNyZWF0ZSBhIG5ldyBKYXZhIGNsYXNzIHdpdGggdGhhdCBuYW1lLAotbWFrZSBpdCBpbXBsZW1lbnQgPGNvZGU+SVBsYXRmb3JtUnVubmFibGU8L2NvZGU+LAotYW5kIHB1dCB5b3VyIHByb2dyYW0gY29kZSBpbiB0aGUgPGNvZGU+cnVuKCk8L2NvZGU+IG1ldGhvZC4KLUxpc3RpbmcgMiBzaG93cyBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBtaW5pbXVtIHlvdSBoYXZlIHRvIGRvLgotVGhlIDxjb2RlPlJjcFdvcmtiZW5jaEFkdmlzb3I8L2NvZGU+IGNsYXNzIHdpbGwgYmUgZGVmaW5lZCBzaG9ydGx5LgotPC9wPgotPHA+PGI+TGlzdGluZyAyLiBSY3BBcHBsaWNhdGlvbiBjbGFzcwotPC9iPjwvcD4KLTxwcmU+Ci1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsYXRmb3JtUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3I7Ci0KLXB1YmxpYyBjbGFzcyBSY3BBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElQbGF0Zm9ybVJ1bm5hYmxlIHsKLQotICAgIHB1YmxpYyBPYmplY3QgcnVuKE9iamVjdCBhcmdzKSB7Ci0gICAgICAgIFdvcmtiZW5jaEFkdmlzb3Igd29ya2JlbmNoQWR2aXNvciA9IG5ldyBSY3BXb3JrYmVuY2hBZHZpc29yKCk7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuY3JlYXRlRGlzcGxheSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICB3b3JrYmVuY2hBZHZpc29yKTsKLSAgICAgICAgICAgIGlmIChyZXR1cm5Db2RlID09IFBsYXRmb3JtVUkuUkVUVVJOX1JFU1RBUlQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSVBsYXRmb3JtUnVubmFibGUuRVhJVF9SRVNUQVJUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQotPC9wcmU+Ci0KLTxoMj5DcmVhdGluZyBhIGRlZmF1bHQgcGVyc3BlY3RpdmU8L2gyPgotPHA+Ci1OZXh0LCB5b3UgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIHBlcnNwZWN0aXZlIGFuZCBtYWtlIGl0IHRoZSBkZWZhdWx0LgotUGVyc3BlY3RpdmVzIGFyZSBjcmVhdGVkIGJ5IGltcGxlbWVudGluZyA8Y29kZT5JUGVyc3BlY3RpdmVGYWN0b3J5PC9jb2RlPgotdXNpbmcgdGhlIGNsYXNzIG5hbWUgcmVmZXJyZWQgdG8gYnkgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlczwvY29kZT4gZXh0ZW5zaW9uCi0oc2VlIGxpc3RpbmcgMykuCi1UaGUgaW1wb3J0YW50IHBhcnQKLW9mIHRoaXMgaW50ZXJmYWNlIGlzIHRoZSA8Y29kZT5jcmVhdGVJbml0aWFsTGF5b3V0KCk8L2NvZGU+IG1ldGhvZCB3aGVyZSB5b3UgcG9zaXRpb24gYW5kCi1vcGVuIGFueSB2aWV3cyBhbmQvb3IgZWRpdG9ycyB5b3UnZCBsaWtlIHRoZSB1c2VyIHRvIHN0YXJ0IHdpdGguCi1JbiB0aGlzIGV4YW1wbGUKLXdlJ3JlIG5vdCBnb2luZyB0byBjcmVhdGUgYW55IHZpZXdzIHNvIGl0IHdpbGwgYmUgYSBwcmV0dHkgYm9yaW5nIHBlcnNwZWN0aXZlLgotPC9wPgotCi08cD48Yj5MaXN0aW5nIDMuIFJjcFBlcnNwZWN0aXZlIGNsYXNzCi08L2I+PC9wPgotPHByZT4KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBSY3BQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0gICAgcHVibGljIFJjcFBlcnNwZWN0aXZlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0gICAgfQotfQotCi08L3ByZT4KLQotPGgyPldvcmtiZW5jaCBBZHZpc29yPC9oMj4KLTxwPgotVGhlIFdvcmtiZW5jaCBBZHZpc29yIGNsYXNzLAotd2hpY2ggeW91IHJlZmVycmVkIHRvIGluIHRoZSBtYWluIHByb2dyYW0sCi1oZWxwcyBjdXN0b21pemUgdGhlIHdvcmtiZW5jaCB0byBhZGQgYW5kIHN1YnRyYWN0Ci10b29sYmFycywgcGVyc3BlY3RpdmVzLCBhbmQgc28gZm9ydGguCi1UaGlzIHdpbGwgY292ZXJlZCBpbiBtb3JlIGRldGFpbCBpbiBwYXJ0IDIgb2YgdGhlIHR1dG9yaWFsLgotRm9yIG5vdywgdGhlIGFic29sdXRlIG1pbmltdW0geW91IGhhdmUgdG8gZG8gaGVyZQotaXMgZGVmaW5lIHdoaWNoIHBlcnNwZWN0aXZlIGlzIHRoZSBkZWZhdWx0IG9uZS4KLVNlZSBsaXN0aW5nIDQgZm9yIHRoZSBjb2RlLgotPC9wPgotCi08cD48Yj5MaXN0aW5nIDQuIFJjcFdvcmtiZW5jaEFkdmlzb3IgY2xhc3MKLTwvYj48L3A+Ci08cHJlPgotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3I7Ci0KLXB1YmxpYyBjbGFzcyBSY3BXb3JrYmVuY2hBZHZpc29yIGV4dGVuZHMgV29ya2JlbmNoQWR2aXNvciB7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxXaW5kb3dQZXJzcGVjdGl2ZUlkKCkgewotICAgICAgICByZXR1cm4gJnF1b3Q7b3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS5SY3BQZXJzcGVjdGl2ZSZxdW90OzsKLSAgICB9Ci19Ci08L3ByZT4KLQotCi08aDI+TWlzY2VsbGFuZW91czwvaDI+Ci08cD5UaGUgYnVpbGQucHJvcGVydGllcyBmaWxlIChzZWUgbGlzdGluZyA1KQotd2lsbCBiZSBuZWVkZWQgd2hlbiBleHBvcnRpbmcgdGhlIGFwcGxpY2F0aW9uIGZvcgotb3RoZXJzIHRvIHVzZS48L3A+Ci0KLTxwPjxiPkxpc3RpbmcgNS4gYnVpbGQucHJvcGVydGllcwotPC9iPjwvcD4KLTxwcmU+Ci1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIHBhcnQxLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc291cmNlLnBhcnQxLmphciA9IHNyYy8KLTwvcHJlPgotCi08cD4KLUZpbmFsbHksIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgKGxpc3RpbmcgNikgZm9yIGFueSBuYXR1cmFsIGxhbmd1YWdlIHN0cmluZ3MgYXQgdGhlCi1wbHVnLWluIHJlZ2lzdHJ5IGxldmVsIChpLmUuLCB0aGluZ3MgdGhlIHJ1bi10aW1lIGhhcyB0byBrbm93IGFib3V0IHlvdXIgcGx1Zy1pbgotYmVmb3JlIGV2ZW4gbG9hZGluZyBpdCkuCi1Zb3UgY291bGQgaGFyZC1jb2RlIHRoZXNlIGludG8geW91ciBwbHVnLWluIG1hbmlmZXN0Ci1idXQgaXQncyBiZXN0IHRvIGdldCBpbnRvIHRoZSBpMThuIGhhYml0IGZyb20gdGhlIHN0YXJ0LgotPC9wPgotCi08cD48Yj5MaXN0aW5nIDYuIHBsdWdpbi5wcm9wZXJ0aWVzCi08L2I+PC9wPgotPHByZT4KLXBsdWdpbk5hbWUgPSBSY3BUdXRvcmlhbDEgUGx1Zy1pbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBlcnNwZWN0aXZlTmFtZSA9IFJjcFR1dG9yaWFsMQotPC9wcmU+Ci0KLTxoMj5UYWtpbmcgaXQgZm9yIGEgc3BpbjwvaDI+Ci08cD5UbyB0ZXN0IGFuZCBkZWJ1ZyB0aGlzIHBsdWctaW4sIHNlbGVjdCBSdW4gJmd0OwotRGVidWcuLi4sIHNlbGVjdCBSdW4tdGltZSBXb3JrYmVuY2gsCi10aGVuIGNsaWNrIE5ldyB0byBjcmVhdGUgYSBuZXcgY29uZmlndXJhdGlvbi4KLUluIHRoZSBBcmd1bWVudHMgdGFiLCBzZWxlY3QKLTxjb2RlPm9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEuUmNwQXBwbGljYXRpb248L2NvZGU+Ci1mb3IgdGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHRvIHJ1bi4KLVRoaXMgY29tZXMgZnJvbSB0aGUgaWQgc3BlY2lmaWVkIG9uIHRoZQotPGNvZGU+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9uczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50Ci0oaW4gdGhpcyBleGFtcGxlLCA8Y29kZT5SY3BBcHBsaWNhdGlvbjwvY29kZT4pLCBwcmVwZW5kZWQgd2l0aCB0aGUKLXBsdWctaW4gaWQgKDxjb2RlPm9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDE8L2NvZGU+KS4KLTwvcD4KLTxwPk5vdyBzd2l0Y2ggb3ZlciB0byB0aGUgUGx1Zy1pbnMgdGFiLgotU2VsZWN0IHRoZSBvcHRpb24gdG8KLUNob29zZSBwbHVnLWlucyBhbmQgZnJhZ21lbnRzIHRvIGxhdW5jaCBmcm9tIHRoZSBsaXN0LgotV2Ugd2FudCB0aGUgc21hbGxlc3QgcG9zc2libGUgc2V0IG9mIHBsdWctaW5zIGludm9sdmVkCi1pbiB5b3VyIHByb2dyYW0gc28gY2xpY2sgb24gRGVzZWxlY3QgQWxsLAotc2Nyb2xsIGRvd24gYW5kIHBsYWNlIGEgY2hlY2ttYXJrIG5leHQgdG8geW91ciBwbHVnLWluCi0oPGNvZGU+b3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MTwvY29kZT4pLAotYW5kIGNsaWNrIEFkZCBSZXF1aXJlZCBQbHVnLWlucy4KLVRoZW4gY2xpY2sgb24gRGVidWcgYW5kCi15b3Ugc2hvdWxkIHNlZSBhIGJhcmUtYm9uZXMgV29ya2JlbmNoIHN0YXJ0IHVwIChzZWUgZmlndXJlIDEpLgotWW91ciB3aW5kb3cgd2lsbCBwcm9iYWJseSBiZSBiaWdnZXIgdGhhbiB0aGlzOyB3ZSdsbCBzZWUgaW4KLXBhcnQgMiBvZiB0aGUgdHV0b3JpYWwgaG93IHRvIGNvbnRyb2wgdGhhdC4KLTwvcD4KLQotPHA+PGI+RmlndXJlIDEuIFdvcmxkJ3Mgc2ltcGxlc3QgUkNQIGFwcGxpY2F0aW9uLgotPC9iPjwvcD4KLTxpbWcgc3JjPSJpbWFnZXMvc3Bpbi5wbmciPgotCi08cD5JZiB5b3UgZG9uJ3Qgc2VlIHRoaXMsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBmaW5kIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlCi1ydW4tdGltZSB3b3JrYmVuY2gncyBsb2cgZmlsZS4KLVRoaXMgZmlsZSBpcyBpbiBkaWZmZXJlbnQgcGxhY2VzIGZvciBkaWZmZXJlbnQgcmVsZWFzZXMgYnV0Ci1hcyBvZiB0aGlzIHdyaXRpbmcgY2FuIGJlIGZvdW5kIGluIDxjb2RlPi4vY29uZmlndXJhdGlvbi9ubm5ubi5sb2c8L2NvZGU+Ci13aGVyZSA8aT5ubm5ubjwvaT4gaXMgYSBsb25nIHJhbmRvbSBudW1iZXIuIFNpbXBseSBicmluZwotaXQgdXAgaW4gYSB0ZXh0IGVkaXRvciBhbmQgbG9vayBmb3IgdGhlIG1vc3QgcmVjZW50IGVycm9ycy4gWW91IG1heSBmaW5kIGl0Ci11c2VmdWwgdG8gZGVsZXRlIHRoZSBsb2cgZmlsZXMgYmVmb3JlIHJ1bm5pbmcgdGhlIHByb2dyYW0gc28geW91IHdvbid0IGdldAotY29uZnVzZWQgYnkgb2xkZXIgbWVzc2FnZXMuPC9wPgotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL3RpcC5naWYiIGFsdD0iVGlwOiAiIHdpZHRoPSI2MiIgaGVpZ2h0PSIxMyI+Ci1TcGVjaWZ5IHRoZSA8Y29kZT4tY29uc29sZUxvZzwvY29kZT4gb3B0aW9uCi1pbiB0aGUgQXJndW1lbnRzIHRhYiB1bmRlciBQcm9ncmFtIEFyZ3VtZW50cyAoaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uKQotdG8gaGF2ZSBhbGwgZXJyb3IgbWVzc2FnZXMgc2VudCB0byB0aGUgQ29uc29sZS4KLVRoaXMgaXMgZWFzaWVyIHRoYW4gc2VhcmNoaW5nIGFyb3VuZCBmb3IgdGhlIGxvZyBmaWxlLgotPC9wPgotCi08aDI+UnVubmluZyBpdCBvdXRzaWRlIG9mIEVjbGlwc2U8L2gyPgotPHA+VGhlIHdob2xlIHBvaW50IG9mIGFsbCB0aGlzIGlzIHRvIGJlIGFibGUgdG8gcnVuIHN0YW5kLWFsb25lIGFwcGxpY2F0aW9ucwotd2l0aG91dCB0aGUgdXNlciBoYXZpbmcgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgSmF2YSBhbmQgRWNsaXBzZSBjb2RlIGJlaW5nCi11c2VkIHVuZGVyIHRoZSBjb3ZlcnMuIEZvciBhIHJlYWwgYXBwbGljYXRpb24geW91IHdpbGwgcHJvYmFibHkgd2FudCB0byBwcm92aWRlCi1hIHNlbGYtY29udGFpbmVkIGV4ZWN1dGFibGUgZ2VuZXJhdGVkIGJ5IGFuIGluc3RhbGwgcHJvZ3JhbSBsaWtlIEluc3RhbGxTaGllbGQuCi1UaGF0J3MgcmVhbGx5IGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBhcnRpY2xlIHRob3VnaCwgc28gd2UnbGwgZG8gc29tZXRoaW5nCi1zaW1wbGVyLjwvcD4KLTxwPldlIG5lZWQgdG8gY3JlYXRlIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBFY2xpcHNlIGluc3RhbGwgZGlyZWN0b3J5Ci1iZWNhdXNlIHRoZSBFY2xpcHNlIHBsdWctaW4gbG9hZGVyIGV4cGVjdHMgdGhpbmdzIHRvIGJlIGluIGEgY2VydGFpbiBsYXlvdXQuCi1IZXJlIGFyZSB0aGUgc3RlcHMgdG8gZ2V0IHN0YXJ0ZWQ6PC9wPgotPG9sPgotICA8bGk+UmlnaHQgY2xpY2sgb24gdGhlIHBsdWctaW4gcHJvamVjdCBhbmQgc2VsZWN0IEV4cG9ydC4KLSAgPGxpPlNlbGVjdCBEZXBsb3lhYmxlIHBsdWctaW5zIGFuZCBmcmFnbWVudHMgYW5kIHRoZW4gcHJlc3MgTmV4dC4KLSAgPGxpPlNlbGVjdCB0aGUgcGx1Zy1pbihzKSB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZC4gRm9yIHRoaXMKLSAgZXhhbXBsZSB0aGF0IHdvdWxkIGJlIG9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEuCi0gIDxsaT5TZWxlY3QgdGhlIG9wdGlvbiB0byBkZXBsb3kgYXMgYSBkaXJlY3Rvcnkgc3RydWN0dXJlLCBhbmQgZm9yIHRoZQotICBkaXJlY3RvcnkgZW50ZXIgYSBuYW1lIGVuZGluZyB3aXRoIFJjcFR1dG9yaWFsMSAoZm9yIGV4YW1wbGUsIEM6XFJjcFR1dG9yaWFsMSBvbgotICBXaW5kb3dzKS4KLSAgPGxpPklmIHlvdSB3YW50IHRvIHByb3ZpZGUgc291cmNlIGNvZGUgZm9yIHlvdXIgYXBwbGljYXRpb24sCi0gIHNlbGVjdCB0aGUgSW5jbHVkZSBzb3VyY2UgY29kZSBvcHRpb24uCi0gIDxsaT5QcmVzcyBGaW5pc2ggdG8gZXhwb3J0IHRoZSBwbHVnLWluLgotICBFY2xpcHNlIHdpbGwgcGVyZm9ybSBhIGZ1bGwgYnVpbGQgaW4gdGhlIGJhY2tncm91bmQKLSAgYW5kIHBvcHVsYXRlIHRoZSBkaXJlY3RvcnkgZm9yIHlvdS4KLTwvb2w+Ci08cD5UbyBjb21wbGV0ZSB0aGUgUmNwVHV0b3JpYWwxIGRpcmVjdG9yeSwgY29weSB0aGUgc3RhcnR1cC5qYXIgZmlsZSBmcm9tIHRoZSBFY2xpcHNlCi1pbnN0YWxsIGRpcmVjdG9yeSBpbnRvIHRoZSB0b3AgbGV2ZWwsIGFuZCBjb3B5IGFsbCB0aGUgb3JnLmVjbGlwc2UgcGx1Zy1pbnMKLXRoYXQgYXJlIHJlcXVpcmVkIGludG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LgotPC9wPgotPHA+Ci1XaGljaCBwbHVnLWlucyBhcmUgcmVxdWlyZWQsIHlvdSBhc2s/Ci1FYXJsaWVyLCB3aGVuIHlvdSBjcmVhdGVkIGEgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdG8gZGVidWcKLXRoZSBSQ1AgYXBwbGljYXRpb24geW91IGNsaWNrZWQgb24KLXRoZSBBZGQgUmVxdWlyZWQgUGx1Zy1pbnMgYnV0dG9uLgotU2ltcGx5IG9wZW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGFnYWluIHRvIHNlZSB0aGUgbGlzdC4KLUNvcHkgYWxsIHRoZSBwbHVnLWlucyB0aGF0IGFyZSBjaGVja2VkIG9mZiB0aGVyZS4KLUluIGFkZGl0aW9uLCB5b3UgbmVlZCB0byBjb3B5IHRoZQotPGNvZGU+b3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcjwvY29kZT4KLXBsdWctaW4gaWYgeW91IHdhbnQgYXV0b21hdGljIGRpc2NvdmVyeSBvZiBwbHVnLWlucyBhdCBydW50aW1lCi0od2hpY2ggd2UgZG8pLgotPC9wPgotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL25vdGUuZ2lmIiBhbHQ9Ik5vdGU6ICIgd2lkdGg9IjYyIiBoZWlnaHQ9IjEzIj4KLVVuZm9ydHVuYXRlbHksIGFzIG9mIHRoaXMgd3JpdGluZyB0aGVyZSBpcyBubyBhdXRvbWF0aWMgd2F5IHRvIGRvIHRoaXMKLXNvIHlvdSBuZWVkIHRvIGRvIHRoZSBjb3BpZXMgYnkgaGFuZC4KLVRoaXMgcHJvY2VzcyBpcyBlcnJvciBwcm9uZSBhbmQgYSBuZXZlci1lbmRpbmcgc291cmNlIG9mCi1mcnVzdHJhdGlvbiB0byBSQ1AgZGV2ZWxvcGVycy4KLVNlZSB0aGUgdHJvdWJsZXNob290aW5nIHNlY3Rpb24gZm9yIHNvbWUgaGVscGZ1bCBhZHZpY2UuCi1Ib3BlZnVsbHkgYSBmdXR1cmUgdmVyc2lvbiBvZiBFY2xpcHNlIHdpbGwgcHJvdmlkZQotYmV0dGVyIHN1cHBvcnQgZm9yIHRoaXMuCi08L3A+Ci08cD4KLVdoZW4geW91J3JlCi1kb25lIHlvdSBzaG91bGQgaGF2ZSBhIHN0cnVjdHVyZSB0aGF0IGxvb2tzIGxpa2UgdGhpczo8L3A+Ci08cHJlPgotICAgIFJjcFR1dG9yaWFsMQotICAgIHwgICAgc3RhcnR1cC5qYXIKLSAgICArLS0tIHBsdWdpbnMKLSAgICAgICAgICstLS0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9uc18zLjAuMAotICAgICAgICAgKy0tLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWVfMy4wLjAKLSAgICAgICAgICstLS0gb3JnLmVjbGlwc2UuaGVscF8zLjAuMAotICAgICAgICAgKy0tLSBvcmcuZWNsaXBzZS5qZmFjZV8zLjAuMAotICAgICAgICAgKy0tLSBvcmcuZWNsaXBzZS5vc2dpXzMuMC4wCi0gICAgICAgICArLS0tIG9yZy5lY2xpcHNlLnN3dC53aW4zMl8zLjAuMAotICAgICAgICAgKy0tLSBvcmcuZWNsaXBzZS5zd3RfMy4wLjAKLSAgICAgICAgICstLS0gb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MV8wLjAuMAotICAgICAgICAgKy0tLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2hfMy4wLjAKLSAgICAgICAgICstLS0gb3JnLmVjbGlwc2UudWlfMy4wLjAKLSAgICAgICAgICstLS0gb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcl8zLjAuMAotPC9wcmU+Ci08cD5UaGF0J3MgYWxsIHlvdSBuZWVkIHRvIHJ1biBhbiBSQ1AgYXBwbGljYXRpb24sIGJ1dCBpdCB3b3VsZCBiZSBkaWZmaWN1bHQgZm9yCi1hbnlvbmUgdG8gdXNlIGl0IHdpdGhvdXQgc29tZSBraW5kIG9mIGxhdW5jaGluZyBwcm9ncmFtLiBFY2xpcHNlIHVzZXMKLWVjbGlwc2UuZXhlLCBidXQgZm9yIHRoaXMgZXhhbXBsZSB3ZSdsbCBqdXN0IHVzZSBhIGJhdGNoIGZpbGUuCi1PbiBXaW5kb3dzLCBjcmVhdGUgYSBjb21tYW5kIGZpbGUKLWNhbGxlZCByY3B0dXRvcmlhbDEuY21kIGFuZCBwbGFjZSBpdCBpbiB0aGUgdG9wIGxldmVsIFJjcFR1dG9yaWFsMSBkaXJlY3RvcnkuCi08L3A+Ci08cHJlPgotICAgZWNobyBvbgotICAgc2V0bG9jYWwKLSAgIGNkICV+ZHAwCi0gICBzdGFydCBqYXZhdyAtY3Agc3RhcnR1cC5qYXIgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5NYWluCi0gICAgICAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS5SY3BBcHBsaWNhdGlvbiAlKgotICAgZW5kbG9jYWwKLTwvcHJlPgotPHA+VGhlIHN0YXJ0IGNvbW1hbmQgc2hvdWxkIGJlIGFsbCBvbiBvbmUgbGluZS4gQXMgYmVmb3JlLCB0aGUgLWFwcGxpY2F0aW9uCi1vcHRpb24gcmVmZXJzIGJhY2sgdG8gdGhlIGlkIHNwZWNpZmllZCBvbiB0aGUKLTxjb2RlPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMgZXh0ZW5zaW9uIHBvaW50LjwvY29kZT48L3A+Ci0KLTxwPgotPGltZyBzcmM9ImltYWdlcy90aXAuZ2lmIiBhbHQ9IlRpcDogIiB3aWR0aD0iNjIiIGhlaWdodD0iMTMiPgotU3BlY2lmeSB0aGUgPGNvZGU+LWNsZWFuPC9jb2RlPiBvcHRpb24KLW9uIHRoZSBjb21tYW5kIGxpbmUgdG8gY2F1c2UgdGhlIGNvcmUgcnVudGltZSB0byBkaXNjYXJkIGl0cyBjYWNoZXMKLWFuZCByZS1yZWFkIGFsbCB0aGUgcGx1Zy1pbiBtYW5pZmVzdHMuCi1Ob3JtYWxseSwgRWNsaXBzZSBjYWNoZXMgbWFuaWZlc3QgaW5mb3JtYXRpb24gdG8gc3BlZWQgc3RhcnR1cCwKLWJ1dCBpZiB5b3UgYXJlIGFkZGluZyBhbmQgcmVtb3ZpbmcgcGx1Zy1pbnMgb3IgY2hhbmdpbmcgY29uZmlndXJhdGlvbgotb3B0aW9ucyB0aGUgY2FjaGUgbWF5IGdldCBvdXQgb2Ygc3luYy4KLVJlbW92ZSA8Y29kZT4tY2xlYW48L2NvZGU+IGZvciBiZXN0IHBlcmZvcm1hbmNlIGluIHByb2R1Y3Rpb24gYXBwbGljYXRpb25zLgotPC9wPgotCi08cD4KLTxpbWcgc3JjPSJpbWFnZXMvbm90ZS5naWYiIGFsdD0iTm90ZTogIiB3aWR0aD0iNjIiIGhlaWdodD0iMTMiPgotVGhlIExpbnV4IHNoZWxsIHZlcnNpb24gaXMgc2ltaWxhciwgYnV0IGZvciBzb21lIHJlYXNvbiB5b3UgaGF2ZSB0byBhZGQKLWEgZmV3IGV4dHJhIG9wdGlvbnMgdG8gaWRlbnRpZnkgdGhlIG9wZXJhdGluZyBhbmQgd2luZG93IHN5c3RlbS4KLUkgY2FuJ3QgdmVyaWZ5IHRoaXMgYmVjYXVzZSBJIGRvbid0IGhhdmUgYSBMaW51eCBzeXN0ZW0gYnV0IHRoaXMgY29tbWFuZAotbGluZSBpcyByZXBvcnRlZCB0byB3b3JrOgotPC9wPgotPHByZT4KLSAgIGphdmEgLWNwIHN0YXJ0dXAuamFyIG9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIuTWFpbgotICAgICAgLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEuUmNwQXBwbGljYXRpb24KLSAgICAgIC1vcyBsaW51eCAtd3MgZ3RrIC1hcmNoIHg4NiAtbmwgZW5fVVMgJCoKLTwvcHJlPgotCi08cD4KLTxpbWcgc3JjPSJpbWFnZXMvbm90ZS5naWYiIGFsdD0iTm90ZTogIiB3aWR0aD0iNjIiIGhlaWdodD0iMTMiPgotVG8gcnVuIGl0IHVuZGVyIE1hYyBPUywgeW91IG11c3QgdXNlIHRoZSBqYXZhX3N3dCBleGVjdXRhYmxlIHRoYXQgY29tZXMKLXdpdGggdGhlIEVjbGlwc2UgU0RLIGluc3RlYWQgb2YgdGhlIHJlZ3VsYXIgamF2YSBleGVjdXRhYmxlIHRoYXQgY29tZXMgd2l0aAotdGhlIEphdmEgU0RLLgotPC9wPgotCi08cD5Zb3UgY2FuIGdldCBhcyBmYW5jeSBhcyB5b3Ugd2FudCBpbiB0aGlzIHNjcmlwdCBmaWxlLiBIZXJlJ3MgYSB2YXJpYW50IHRoYXQgSQotbGlrZSB0byB1c2Ugd2hlbiBkZWJ1Z2dpbmcgYmVjYXVzZSBpdCB3aWxsIGRpc3BsYXkgYW55IGVycm9yIG1lc3NhZ2VzIGZyb20gdGhlCi1FY2xpcHNlIGxvYWRlciBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KLVRoaXMgaXMgZm9yIFdpbmRvd3M7IHRoZSBMaW51eCB2ZXJzaW9uIHdvdWxkIGJlIHNpbWlsYXIuPC9wPgotPHByZT4KLSAgIGVjaG8gb24KLSAgIHNldGxvY2FsCi0gICBjZCAlfmRwMAotICAgamF2YSAtY3Agc3RhcnR1cC5qYXIgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5NYWluCi0gICAgICAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS5SY3BBcHBsaWNhdGlvbgotICAgICAgLWNvbnNvbGVMb2cgJSogfHwgcGF1c2UKLSAgIGVuZGxvY2FsCi08L3ByZT4KLTxwPlRoZSBqYXZhIGNvbW1hbmQgc2hvdWxkIGJlIGFsbCBvbiBvbmUgbGluZS48L3A+Ci08cD5UbyBlbGltaW5hdGUgdGhlIHN0YXJ0dXAgd2luZG93IG9uIFdpbmRvd3MsIHlvdSBjYW4gdXNlIGEgc2hvcnRjdXQgaW5zdGVhZCBvZgotYSBzY3JpcHQgZmlsZS4gUmlnaHQgY2xpY2sgaW5zaWRlIHRoZSBSY3BUdXRvcmlhbDEgZm9sZGVyLCBzZWxlY3QgTmV3ICZndDsgU2hvcnRjdXQKLWFuZCBlbnRlciB0aGlzIGFzIHRoZSBsb2NhdGlvbiBvZiB0aGUgaXRlbSAob24gb25lIGxpbmUpOjwvcD4KLTxwcmU+Ci0gICAgJXdpbmRpciVcc3lzdGVtMzJcamF2YXcuZXhlIC1jcCBzdGFydHVwLmphciBvcmcuZWNsaXBzZS5jb3JlLmxhdW5jaGVyLk1haW4KLSAgICAgICAgLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEuUmNwQXBwbGljYXRpb24KLTwvcHJlPgotPHA+Ci1FbnRlciBhIGRlc2NyaXB0aXZlIG5hbWUgb24gdGhlIG5leHQgcGFnZSBhbmQgdGhlbiBwcmVzcyBGaW5pc2guIFRoZW4gdHJ5Ci1kb3VibGUtY2xpY2tpbmcgb24geW91ciBuZXcgc2hvcnRjdXQgdG8gdHJ5IGl0IG91dC4gWW91IG1heSB3YW50IHRvIGVkaXQgdGhlCi1zaG9ydGN1dCAocmlnaHQgY2xpY2sgb24gaXQgYW5kIHNlbGVjdCBQcm9wZXJ0aWVzKSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgd29ya2luZwotZGlyZWN0b3J5LgotQWxsIHRoZXNlIGZpbGVzIGNhbiBiZSBmb3VuZCBpbiB0aGUKLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MSI+ZXhhbXBsZSBwcm9qZWN0PC9hPi4KLTwvcD4KLTxwPgotPGltZyBzcmM9ImltYWdlcy9ub3RlLmdpZiIgYWx0PSJOb3RlOiAiIHdpZHRoPSI2MiIgaGVpZ2h0PSIxMyI+Ci1Gb3IgZnVsbHkgYnJhbmRpbmcgYSBwcm9ncmFtIHdpdGggYSBzcGxhc2ggc2NyZWVuLCBjdXN0b20gaWNvbnMsIGFuZCBzbyBmb3J0aAoteW91J2xsIG5lZWQgdG8gc2V0IHVwIHNvbWUgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgdXNlCi10aGUgZWNsaXBzZS5leGUgbGF1bmNoZXIuCi1TZWUgdGhlIG9ubGluZSBoZWxwIHVuZGVyIFBsYXRmb3JtIFBsdWctaW4gRGV2ZWxvcGVyIEd1aWRlICZndDsKLVByb2dyYW1tZXIncyBHdWlkZSAmZ3Q7IFBhY2thZ2luZyBhbmQgZGVsaXZlcmluZyBFY2xpcHNlIGJhc2VkIHByb2R1Y3RzCi1mb3IgbW9yZSBpbmZvcm1hdGlvbi4KLTwvcD4KLQotPGgyPlRyb3VibGVzaG9vdGluZzwvaDI+Ci08cD4KLUFmdGVyIEkgd3JvdGUgdGhpcyB0dXRvcmlhbCBJIHN0YXJ0ZWQgZ2V0dGluZyBtYWlsIGZyb20gcGVvcGxlIHdobyBjb3VsZG4ndAotcnVuIGl0IGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIuCi1UaGlzIHNlY3Rpb24gd2lsbCBjb2xsZWN0IHRoZSBlcnJvcnMgdGhhdCB0aGV5J3ZlIHNlZW4gYW5kCi10aGUgc29sdXRpb25zLgotUmVtZW1iZXIgdG8gdXNlIHRoZSA8Y29kZT4tY29uc29sZUxvZzwvY29kZT4gY29tbWFuZCBsaW5lIG9wdGlvbiB0byBzZWUKLWV4dHJhIGRpYWdub3N0aWNzIGluIHRoZSBjb25zb2xlIHdpbmRvdyB3aGVyZSB5b3UgaW52b2tlZCB5b3VyCi1SQ1AgYXBwbGljYXRpb24sCi1hbmQgPGNvZGU+LWNsZWFuPC9jb2RlPiB0byBwdXJnZSB0aGUgY29yZSBydW50aW1lJ3MgY2FjaGUgb2YgYW55IHN0YWxlCi1pbmZvcm1hdGlvbiB3aGVuIGNoYW5naW5nIHBsdWctaW5zIGFuZCBjb25maWd1cmF0aW9ucy4KLTwvcD4KLTxkbD4KLQotPGR0PgotPGI+TGF1bmNoaW5nIGZhaWxlZCBiZWNhdXNlIHRoZSBmb2xsb3dpbmcgcGx1Zy1pbnMgYXJlIG5laXRoZXIgaW4gdGhlCi13b3Jrc3BhY2Ugbm9yIHNlbGVjdGVkIG9uIHRoZSBUYXJnZXQgUGxhdGZvcm0gcHJlZmVyZW5jZSBwYWdlOiAuLi48L2I+Ci08ZGQ+Ci1UaGlzIG9uZSBpcyBhIHNhbml0eSBjaGVjayBwZXJmb3JtZWQgYnkgUERFLgotSXQncyBwcmV0dHkgc2VsZiBleHBsYW5pdG9yeSBzbyBqdXN0IGxvb2sgYXQgdGhlIGxpc3QKLXByb3ZpZGVkLCBnbyB0byB0aGUgUGx1Zy1pbnMgdGFiIG9mIHlvdXIgbGF1bmNoIGNvbmZpZ3VyYXRpb24sCi1hbmQgcHV0IGEgY2hlY2ttYXJrIG5leHQgdG8gYWxsIG9mIHRoZSBwbHVnLWlucyBsaXN0ZWQKLWluIHRoZSBlcnJvci4KLQotPGR0PgotPGI+IU1FU1NBR0UgVW5hYmxlIHRvIGxvY2F0ZSBhcHBsaWNhdGlvbiBleHRlbnNpb246IG9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEuUmNwQXBwbGljYXRpb248L2I+Ci08ZGQ+Ci1GaXJzdCwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHBsdWctaW4gY29udGFpbmluZyB5b3VyCi1hcHBsaWNhdGlvbiBpcyBpbmNsdWRlZCBpbiB5b3VyIGxhdW5jaCBjb25maWd1cmF0aW9uLgotTmV4dCwgY2hlY2sgdGhlIHNwZWxsaW5nLCBhbmQgcmVtZW1iZXIgdGhhdCB0aGUgYXBwbGljYXRpb24gbmFtZQotaXMgdGhlIHBsdWctaW4gaWQgZm9sbG93ZWQgYnkgYSBwZXJpb2QgYW5kIHRoZSBpZCB5b3Ugc3BlY2lmaWVkIG9uIHRoZQotPGNvZGU+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9uczwvY29kZT4gZXh0ZW5zaW9uLgotVGhpcyBtZXNzYWdlIG1pZ2h0IGFsc28gYmUgcHJpbnRlZCBpZiBhbGwgdGhlIHJlcXVpcmVkCi1wbHVnLWlucyBhcmUgbm90IGF2YWlsYWJsZSBhdCBydW4tdGltZS4KLUNoZWNrIHRoZSBsb2cgZm9yIGFkZGl0aW9uYWwgZXJyb3IgbWVzc2FnZXMgdGhhdCBtYXkgaWRlbnRpZnkgdGhlCi1zcGVjaWZpYyBwbHVnLWlucyB0aGF0IGFyZSBtaXNzaW5nLgotCi08ZHQ+Ci08Yj4hTUVTU0FHRSBCdW5kbGUgdXBkYXRlQC9jOi9SY3BUdXRvcmlhbDEvcGx1Z2lucy9vcmcuZWNsaXBzZS51aV8zLjAuMC8gWzEzXSB3YXMgbm90IHJlc29sdmVkLjwvYj4KLTxkZD4KLVRoaXMgb25lIGlzIGEgbGl0dGxlIHRvdWdoZXIuCi1JdCB1c3VhbGx5IG1lYW5zIHRoYXQgc29tZSBwcmVyZXF1aXNpdGUgb2YgdGhlIHBsdWctaW4gbGlzdGVkIHdhcyBub3QgdGhlcmUuCi1Vc3VhbGx5IHRoZSBsb2cgd2lsbCBjb250YWluIGFkZGl0aW9uYWwgbWVzc2FnZXMgdGhhdCB3aWxsIHRlbGwgeW91Ci13aGljaCBwbHVnLWlucyB3ZXJlIG1pc3NpbmcuCi1Zb3UgY2FuIGFsc28gZmluZCBvdXQgZXhhY3RseSB3aGF0J3MgZ29pbmcgb24gYnkgcmUtcnVubmluZyB0aGUgcHJvZ3JhbQotd2l0aCB0aGUgPGNvZGU+LWNvbnNvbGU8L2NvZGU+IGNvbW1hbmQgbGluZSBvcHRpb24uCi1UaGlzIHdpbGwgYWxsb3cgeW91IHRvIGVudGVyIE9TR2kgY29uc29sZSBjb21tYW5kcyB0byBkaWFnbm9zZSB0aGUgcHJvYmxlbS4KLUFmdGVyIHRoZSBlcnJvciBvY2N1cnMgYWdhaW4sIGdvIHRvIHRoZSBjb25zb2xlIHdpbmRvdyBhbmQgZW50ZXIgdGhlCi08Y29kZT5zczwvY29kZT4gY29tbWFuZC4KLVlvdSdsbCBzZWUgb25lIG9yIG1vcmUgcGx1Zy1pbnMgKGJ1bmRsZXMpIHdoaWNoIHdlcmUgaW5zdGFsbGVkIGJ1dCBub3QgcmVzb2x2ZWQuCi1QaWNrIG9uZSBvZiB0aGVtIChpbiB0aGUgYWJvdmUgbWVzc2FnZSBpdCB3b3VsZCBiZSBudW1iZXIgMTMpLCBhbmQgZW50ZXIgdGhlCi08Y29kZT5kaWFnIDxpPm5ubjwvaT48L2NvZGU+IGNvbW1hbmQsIHdoZXJlIDxpPm5ubjwvaT4KLWlzIHRoZSBidW5kbGUgbnVtYmVyLiBGb3IgZXhhbXBsZSwgIjxiPmRpYWcgMTM8L2I+Ii4KLVRoaXMgd2lsbCB0ZWxsIHlvdSB3aGF0IHRoZSBtaXNzaW5nIGJ1bmRsZSBpcy4KLU5vdGUgdGhhdCB5b3UgY2FuJ3QgcnVuIE9TR2kgY29tbWFuZHMgaWYgdGhlIHByb2dyYW0gaGFzIGFscmVhZHkgdGVybWluYXRlZC4KLQotPGR0PgotPGI+JzEuNCcgdGFyZ2V0IG1vZGUgcmVxdWlyZXMgJy0xLjQnIGNvbXBsaWFuY2UgbW9kZTogMS4zPC9iPgotPGRkPgotVGhpcyBpcyBvbmUgb2YgdGhlIG1vcmUgYW5ub3lpbmcgUERFIGJ1aWxkIGVycm9ycywgZXNwZWNpYWxseSBzaW5jZSB5b3UgaGF2ZSB0byBnbyBodW50Ci1pbiBhIHppcCBmaWxlIGZvciBpdC4KLVRvIGNvcnJlY3QgaXQsIGdvIHRvIFdpbmRvdyAmZ3Q7IFByZWZlcmVuY2VzICZndDsgSmF2YSAmZ3Q7IENvbXBpbGVyCi0mZ3Q7IENvbXBsaWFuY2UgYW5kIENsYXNzZmlsZXMuCi1BZGp1c3QgdGhlIGNvbXBsaWFuY2UgbGV2ZWxzIGFzIGZvbGxvd3M6PGJyPgotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHI+PHRkPkNvbXBpbGVyIGNvbXBsaWFuY2UgbGV2ZWw6IDx0ZD4xLjQKLTx0cj48dGQ+VXNlIGRlZmF1bHQgY29tcGxpYW5jZSBzZXR0aW5nczogPHRkPm9mZgotPHRyPjx0ZD5HZW5lcmF0ZWQgLmNsYXNzIGZpbGVzIGNvbXBhdGliaWxpdHk6IDx0ZD4xLjQKLTx0cj48dGQ+U291cmNlIGNvbXBhdGliaWxpdHk6IDx0ZD4xLjQKLTx0cj48dGQ+RGlzYWxsb3cgaWRlbnRpZmllcnMgY2FsbGVkICdhc3NlcnQnOiA8dGQ+RXJyb3IKLTwvdGFibGU+Ci0KLTxkdD4KLTxiPgotamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IEFwcGxpY2F0aW9uICJvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxLlJjcEFwcGxpY2F0aW9uIiBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBUaGUgYXBwbGljYXRpb25zIGF2YWlsYWJsZSBhcmU6Ci0mbHQ7Tk9ORSZndDsuCi08L2I+Ci08ZGQ+Ci1UaGlzIGlzIGNhdXNlZCBieSBhIG1pc3NpbmcgcGx1Zy1pbiwgbW9zdCBjb21tb25seQotPGNvZGU+b3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcjwvY29kZT4uCi1UaGUgdXBkYXRlIGNvbmZpZ3VyYXRvciBpcyByZXNwb25zaWJsZSBmb3Igc2Nhbm5pbmcgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHRvCi1kaXNjb3ZlciB3aGF0IHBsdWctaW5zIGFyZSBhdmFpbGFibGUuCi1XaXRob3V0IGl0LCB5b3UgaGF2ZSB0byBsaXN0IHRoZW0gb3V0IG1hbnVhbGx5IGluIGEgY29uZmlndXJhdGlvbiBmaWxlCi0oY29uZmlnLmluaSkuCi1VbmZvcnR1bmF0ZWx5IHRoaXMgcGx1Zy1pbiBpcyBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQKLVJDUCBTREssIHNvIHlvdSBoYXZlIHRvIGNvcHkgaXQgZnJvbSB0aGUgcmVndWxhciBFY2xpcHNlIFNESy4KLQotPGR0PgotPGI+amF2YS5sYW5nLk5vQ2xhc3NEZWZGb3VuZEVycm9yOiBvcmcvZWNsaXBzZS9zd3Qvd2lkZ2V0cy9Db250cm9sPC9iPgotPGJyPihhIG51bWJlciBvZiBkaWZmZXJlbnQgU1dUIGNsYXNzZXMgbWF5IGJlIG1lbnRpb25lZCBpbiB0aGUgZXJyb3IpCi08ZGQ+Ci1XaGVuIHJ1bm5pbmcgYW4gUkNQIGFwcGxpY2F0aW9uIHVuZGVyIExpbnV4IEdUSyB5b3UgbmVlZCBzcGVjaWZ5IGNvbW1hbmQKLWxpbmUgb3B0aW9ucyB0aGF0IGlkZW50aWZ5IHlvdXIgb3BlcmF0aW5nIGFuZCB3aW5kb3dpbmcgc3lzdGVtLCBmb3IgZXhhbXBsZSwKLTxjb2RlPi1vcyBsaW51eCAtd3MgZ3RrPC9jb2RlPi4KLVdoZW4gcnVubmluZyB1bmRlciBNYWMgT1MsIHlvdSBuZWVkIHRvIHVzZSB0aGUgamF2YV9zd3QgcHJvZ3JhbSB0aGF0IGNhbWUgd2l0aAotdGhlIEVjbGlwc2UgU0RLIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBqYXZhIHByb2dyYW0uCi0KLTwvZGw+Ci0KLQotPGgyPkNvbXBhdGliaWxpdHkgYW5kIG1pZ3JhdGlvbjwvaDI+Ci08cD4KLUFzdHV0ZSByZWFkZXJzIHdpbGwgbm90aWNlIGEgbmV3IDMuMCB2ZXJzaW9uIGNvbW1lbnQgaW4gcGx1Z2luLnhtbAotYW5kIGEgZmV3IHJlZmVyZW5jZXMgaW4gRWNsaXBzZQotd2l6YXJkcyBhbmQgZG9jdW1lbnRhdGlvbiB0byBPU0dpIGFuZCBhbiBvcHRpb25hbCBtYW5pZmVzdCBmaWxlCi1jYWxsZWQgTUFOSUZFU1QuTUYuCi1XaGF0J3MgYWxsIHRoYXQgYWJvdXQ/Ci1Gb3IgdGhlIG1vc3QgcGFydCB0aGlzIGlzIHRyYW5zcGFyZW50IGFuZCBSQ1AKLWRldmVsb3BlcnMgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBpdC4KLUJ1dCBqdXN0IGluIGNhc2UsIGxldCdzIHRha2UgYSBmZXcgbW9tZW50cyB0byBkaXNjdXNzIHRoZXNlIGNoYW5nZXMKLWZyb20gRWNsaXBzZSAyLjEuCi08L3A+Ci08cD4KLVRoZSAzLjAgdGFnIGluIHBsdWdpbi54bWwKLSg8Y29kZT4mbHQ7P2VjbGlwc2UgdmVyc2lvbj0mcXVvdDszLjAmcXVvdDs/Jmd0OzwvY29kZT4pCi1zYXlzIHdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4ueG1sIGl0c2VsZiBpcyBpbiAzLjAgZm9ybS4KLUZvciBFY2xpcHNlIDMuMCB0aGVyZSB3ZXJlIHZhcmlvdXMgY2hhbmdlcyB0byB0aGUgcGx1Z2lucwotKGNvZGUgbW92ZWQsIG5ldyBwbHVnaW5zLCBldGMuKSBhbmQgdmFyaW91cyBleHRlbnNpb24gcG9pbnRzIG1vdmVkLgotVGhlIHByZXNlbmNlIG9mIHRoZSAzLjAgdGFnIHRlbGxzIHRoZSBydW50aW1lIHRoYXQgaXQgZG9lcyBub3QKLW5lZWQgdG8gZG8gYW55ICJtdW5naW5nIiBvZiB0aGUgcGx1Z2luLnhtbCB0byBtYXAgdGhlIG9sZAotZm9ybS9uYW1lcyBvbnRvIHRoZSBuZXcgZm9ybS9uYW1lcy4gCi08L3A+Ci08cD4KLUlmIHlvdSBuZWVkIHRvIGNvbnZlcnQgYSB2ZXJzaW9uIDIuMSBwbHVnLWluIHRvIDMuMCwgd2Ugc3VnZ2VzdCB5b3UKLXVzZSB0aGUgUERFIDMuMCBtaWdyYXRpb24gd2l6YXJkIGluc3RlYWQgb2YgZG9pbmcgaXQgbWFudWFsbHkuCi1UbyBydW4gaXQgZnJvbSB0aGUgUGFja2FnZSBFeHBsb3JlciwgcmlnaHQgY2xpY2sgb24gcGx1Z2luLnhtbAotYW5kIHNlbGVjdCBQREUgVG9vbHMgJmd0OyBNaWdyYXRlIHRvIDMuMC4KLUFmdGVyIHlvdSBkbyB0aGlzIHRoZSBwbHVnLWluIHdpbGwgbm90IGZ1bmN0aW9uIGluIGVhcmxpZXIKLXZlcnNpb25zIG9mIEVjbGlwc2UuCi1UaGUgdG9vbCBkb2VzIGFsbCB0aGUgbXVuZ2luZyB0byB1c2UgYSBjb21wYXRpYmlsaXR5IGxheWVyCi0oPGNvZGU+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L2NvZGU+KSwKLXVwZGF0ZXMgeW91ciBjbGFzc3BhdGhzLCBhbmQgc28gZm9ydGguCi1MYXRlciB5b3UgY2FuIGNvbnN1bHQgdGhlIEVjbGlwc2UgMy4wIFBsdWctaW4gTWlncmF0aW9uIEd1aWRlCi0oc2VlIHRoZSByZWZlcmVuY2VzIG9yIG9ubGluZSBoZWxwKQotZm9yIGFzc2lzdGFuY2UgaW4gY29udmVydGluZyBhbnkgZGVwcmVjYXRlZCBBUEkgY2FsbHMuCi1BZnRlciBhbGwgdGhlIG9sZCBjYWxscyBoYXZlIGJlZW4gcmVtb3ZlZCB5b3UgY2FuIHJlcGxhY2UKLXRoZSBjb21wYXRpYmlsaXR5IGxheWVyIHdpdGggdGhlIHJlZ3VsYXIgcnVudGltZSBjb2RlCi0oPGNvZGU+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9jb2RlPikuCi08L3A+Ci08cD4KLUZpbmFsbHksIEVjbGlwc2UgMy4wICBpbnRyb2R1Y2VkIGEgbmV3IHJ1bi10aW1lIHN5c3RlbSBiYXNlZCBvbiBPU0dpIHN0YW5kYXJkcyB0aGF0Ci11c2VzIGJ1bmRsZXMgYW5kIGEgbmV3IG1hbmlmZXN0IGZpbGUgKE1BTklGRVNULk1GKSB0byBpbXBsZW1lbnQgcGx1Zy1pbnMuCi1UaGUgdXNlIG9mIE1BTklGRVNULk1GLCBpbiBub3JtYWwgY2lyY3Vtc3RhbmNlcywgaXMgY29tcGxldGVseSBvcHRpb25hbC4KLVlvdSB3aWxsIG5vdGljZSB0aGF0IGFsbW9zdCBhbGwgb2YgdGhlIDMuMCBTREsgcGx1Zy1pbnMgZG8gTk9UIGhhdmUgb25lCi15ZXQgYWxsIGFyZSBtYXJrZWQgYXMgMy4wIGFuZCBtYW55IGRvIG5vdCByZXF1aXJlIHRoZSBjb21wYXRpYmlsaXR5IGxheWVyLgotVGhlIG9ubHkgcmVhc29uIHlvdSB3b3VsZCB3YW50IHRvIGhhdmUgYSBNQU5JRkVTVC5NRiBpcyBpZiB5b3UgbmVlZCB0bwotdXNlIGEgcGFydGljdWxhciBPU0dpIGNhcGFiaWxpdHkgdGhhdCBpcyBub3QgZXhwb3NlZCB0aHJvdWdoIHBsdWdpbi54bWwKLShmb3IgZXhhbXBsZSwgaW1wb3J0LXBhY2thZ2UpLgotT3RoZXJ3aXNlIGl0J3MgcmVjb21tZW5kZWQgYXQgdGhpcyB0aW1lIHRoYXQgeW91IGRvbid0IGhhdmUgb25lLgotPC9wPgotCi08aDI+Q29uY2x1c2lvbjwvaDI+Ci08cD5JbiBwYXJ0IDEgb2YgdGhpcyB0dXRvcmlhbCwgd2UgbG9va2VkIGF0IHdoYXQgaXMgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhCi1iYXJlLWJvbmVzIFJpY2ggQ2xpZW50IGFwcGxpY2F0aW9uLiBUaGUgbmV4dCBwYXJ0IHdpbGwgZGVsdmUgaW50byBjdXN0b21pemF0aW9ucwotdXNpbmcgdGhlIFdvcmtiZW5jaEFkdmlzb3IgY2xhc3MuCi1BbGwgdGhlIHNhbXBsZSBjb2RlIGZvciB0aGlzIHBhcnQgbWF5IGJlIHZpZXdlZCBhdCB0aGUKLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MSI+RWNsaXBzZSBwcm9qZWN0IGhlcmU8L2E+LgotWW91IGNhbiB1c2UKLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvY3ZzaG93dG8uaHRtbCI+RWNsaXBzZSdzIGJ1aWx0LWluIENWUyBjbGllbnQ8L2E+Ci10byBkb3dubG9hZCB0aGUgc291cmNlIHRvIHlvdXIgd29ya3NwYWNlLgotPC9wPgotCi08aDI+UmVmZXJlbmNlczwvaDI+Ci08YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1SQ1AtMi90dXRvcmlhbDIuaHRtbCI+Ci1SQ1AgVHV0b3JpYWwgUGFydCAyPC9hPjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9hcnRpY2xlcy9BcnRpY2xlLVJDUC0zL3R1dG9yaWFsMy5odG1sIj4KLVJDUCBUdXRvcmlhbCBQYXJ0IDM8L2E+PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9wbGF0Zm9ybS11aS1ob21lL3JjcC9pbmRleC5odG1sIj4KLUVjbGlwc2UgUmljaCBDbGllbnQgUGxhdGZvcm08L2E+PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9yZWFkbWUuaHRtbCI+UkNQIEJyb3dzZXIgZXhhbXBsZQotKHByb2plY3Qgb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIpPC9hPjxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1QREUtZG9lcy1wbHVnaW5zL1BERS1pbnRyby5odG1sIj5QREUKLURvZXMgUGx1Zy1pbnM8L2E+PGJyPgotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hcnRpY2xlcy9BcnRpY2xlLUludGVybmF0aW9uYWxpemF0aW9uL2hvdzJJMThuLmh0bWwiPkhvdwotdG8gSW50ZXJuYXRpb25hbGl6ZSB5b3VyIEVjbGlwc2UgUGx1Zy1pbjwvYT48YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtUGx1Zy1pbi1hcmNoaXRlY3R1cmUvcGx1Z2luX2FyY2hpdGVjdHVyZS5odG1sIj5Ob3Rlcwotb24gdGhlIEVjbGlwc2UgUGx1Zy1pbiBBcmNoaXRlY3R1cmU8L2E+PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MuaXN2L3BvcnRpbmcvZWNsaXBzZV8zXzBfcG9ydGluZ19ndWlkZS5odG1sIj4KLUVjbGlwc2UgMy4wIFBsdWctaW4gTWlncmF0aW9uIEd1aWRlPC9hPjxicj4KLQotPHA+PHNtYWxsPklCTSBpcyB0cmFkZW1hcmsgb2YgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBpbiB0aGUKLVVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFuZCBsb2dvcyBhcmUgdHJhZGVtYXJrcyBvcgotcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyCi1jb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08cD48c21hbGw+TWljcm9zb2Z0IGFuZCBXaW5kb3dzIGFyZSB0cmFkZW1hcmtzIG9mIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiBpbiB0aGUKLVVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTxwPjxzbWFsbD5PdGhlciBjb21wYW55LCBwcm9kdWN0LCBhbmQgc2VydmljZSBuYW1lcyBtYXkgYmUgdHJhZGVtYXJrcyBvciBzZXJ2aWNlCi1tYXJrcyBvZiBvdGhlcnMuPC9zbWFsbD48L3A+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWYwNDI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGx1Z2luTmFtZSA9IFJjcFR1dG9yaWFsMSBQbHVnLWluCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGVyc3BlY3RpdmVOYW1lID0gUmNwVHV0b3JpYWwxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3N2M4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MSIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMC4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwYXJ0MS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IlJjcEFwcGxpY2F0aW9uIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPgotICAgICAgPGFwcGxpY2F0aW9uPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEuUmNwQXBwbGljYXRpb24iPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzIj4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgbmFtZT0iJXBlcnNwZWN0aXZlTmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxLlJjcFBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEuUmNwUGVyc3BlY3RpdmUiPgotICAgICAgPC9wZXJzcGVjdGl2ZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS9yY3B0dXRvcmlhbDEuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL3JjcHR1dG9yaWFsMS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNDY0Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL3JjcHR1dG9yaWFsMS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWVjaG8gb24KLXNldGxvY2FsCi1jZCAlfmRwMAotc3RhcnQgamF2YXcgLWNwIHN0YXJ0dXAuamFyIG9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIuTWFpbiAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS5SY3BBcHBsaWNhdGlvbiAlKgotZW5kbG9jYWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS9yY3B0dXRvcmlhbDFkZWJ1Zy5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvcmNwdHV0b3JpYWwxZGVidWcuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTljOGU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS9yY3B0dXRvcmlhbDFkZWJ1Zy5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWVjaG8gb24KLXNldGxvY2FsCi1jZCAlfmRwMAotamF2YSAtY3Agc3RhcnR1cC5qYXIgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5NYWluIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxLlJjcEFwcGxpY2F0aW9uIC1jb25zb2xlTG9nICUqIHx8IHBhdXNlCi1lbmRsb2NhbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQxL1JjcEFwcGxpY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDEvUmNwQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhYjgwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDEvUmNwQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGxhdGZvcm1SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvcjsKLQotcHVibGljIGNsYXNzIFJjcEFwcGxpY2F0aW9uIGltcGxlbWVudHMgSVBsYXRmb3JtUnVubmFibGUgewotCi0gICAgcHVibGljIE9iamVjdCBydW4oT2JqZWN0IGFyZ3MpIHsKLSAgICAgICAgV29ya2JlbmNoQWR2aXNvciB3b3JrYmVuY2hBZHZpc29yID0gbmV3IFJjcFdvcmtiZW5jaEFkdmlzb3IoKTsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5jcmVhdGVEaXNwbGF5KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgIHdvcmtiZW5jaEFkdmlzb3IpOwotICAgICAgICAgICAgaWYgKHJldHVybkNvZGUgPT0gUGxhdGZvcm1VSS5SRVRVUk5fUkVTVEFSVCkgewotICAgICAgICAgICAgICAgIHJldHVybiBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX1JFU1RBUlQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZGlzcGxheS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQxL1JjcFBlcnNwZWN0aXZlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDEvUmNwUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1OTFhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDEvUmNwUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBSY3BQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JcHVibGljIFJjcFBlcnNwZWN0aXZlKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQxL1JjcFdvcmtiZW5jaEFkdmlzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MS9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0MS9SY3BXb3JrYmVuY2hBZHZpc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNGNlYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQxL1JjcFdvcmtiZW5jaEFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQxOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3I7Ci0KLXB1YmxpYyBjbGFzcyBSY3BXb3JrYmVuY2hBZHZpc29yIGV4dGVuZHMgV29ya2JlbmNoQWR2aXNvciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxXaW5kb3dQZXJzcGVjdGl2ZUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDEuUmNwUGVyc3BlY3RpdmUiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwY2UzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9SdW4gUmNwVHV0b3JpYWwyLmxuayBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9SdW4gUmNwVHV0b3JpYWwyLmxuawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhMzc4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvUnVuIFJjcFR1dG9yaWFsMi5sbmsKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjU3MjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIHBhcnQyLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBodG1sLwotc291cmNlLnBhcnQyLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9odG1sL2RlZmF1bHRfc3R5bGUuY3NzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL2h0bWwvZGVmYXVsdF9zdHlsZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNjVmNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL2h0bWwvZGVmYXVsdF9zdHlsZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1wLCB0YWJsZSwgdGQsIHRoIHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdH0KLXByZSB7ICBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ubzsgZm9udC1zaXplOiAxMHB0OyBiYWNrZ3JvdW5kOiAjRUVFRUVFO30KLWgyIHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxOHB0OyBmb250LXdlaWdodDogYm9sZCA7IGxpbmUtaGVpZ2h0OiAxNHB4fQotY29kZSB7ICBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ubzsgZm9udC1zaXplOiAxMHB0fQotc3VwIHsgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2EsZ2VuZXZhOyBmb250LXNpemU6IDEwcHh9Ci1oMyB7ICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkfQotbGkgeyAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0fQotaDEgeyAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAyOHB4OyBmb250LXdlaWdodDogYm9sZH0KLWJvZHkgeyAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0OyBjbGlwOiAgIHJlY3QoICAgKTsgbWFyZ2luLXRvcDogNW1tOyBtYXJnaW4tbGVmdDogM21tfQotLmluZGV4dG9wIHsgZm9udC1zaXplOiB4LWxhcmdlOzsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkfQotLmluZGV4c3ViIHsgZm9udC1zaXplOiB4eC1zbWFsbDs7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjogIzgwODBGRn0KLWEuYmFyOmxpbmsgeyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogI0ZGRkZGRn0KLWEuYmFyOnZpc2l0ZWQgeyAgY29sb3I6ICNGRkZGRkY7IHRleHQtZGVjb3JhdGlvbjogbm9uZX0KLWEuYmFyOmhvdmVyIHsgIGNvbG9yOiAjRkZGRkZGOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZX0KLWEuYmFyIHsgIGNvbG9yOiAjRkZGRkZGfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL2h0bWwvaW1hZ2VzL0FwcGxpY2F0aW9uLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9odG1sL2ltYWdlcy9BcHBsaWNhdGlvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTUzMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL2h0bWwvaW1hZ2VzL0FwcGxpY2F0aW9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9odG1sL2ltYWdlcy9JZGVhLmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9odG1sL2ltYWdlcy9JZGVhLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5Y2U3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvaHRtbC9pbWFnZXMvSWRlYS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvaHRtbC9pbWFnZXMvTGlmZWN5Y2xlLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9odG1sL2ltYWdlcy9MaWZlY3ljbGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmZhYmU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9odG1sL2ltYWdlcy9MaWZlY3ljbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL2h0bWwvaW1hZ2VzL2hlbGxvdGl0bGUucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL2h0bWwvaW1hZ2VzL2hlbGxvdGl0bGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGI1MTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9odG1sL2ltYWdlcy9oZWxsb3RpdGxlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9odG1sL2ltYWdlcy9ub3RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9odG1sL2ltYWdlcy9ub3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYyNjBkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvaHRtbC9pbWFnZXMvbm90ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvaHRtbC9pbWFnZXMvdGlwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9odG1sL2ltYWdlcy90aXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2IyNDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9odG1sL2ltYWdlcy90aXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL2h0bWwvdHV0b3JpYWwyLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvaHRtbC90dXRvcmlhbDIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiZjY5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvaHRtbC90dXRvcmlhbDIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotCi08aGVhZD4KLTx0aXRsZT5SaWNoIENsaWVudCBQbGF0Zm9ybTwvdGl0bGU+Ci08bGluayBocmVmPSJkZWZhdWx0X3N0eWxlLmNzcyIgcmVsPXN0eWxlc2hlZXQ+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08ZGl2IGFsaWduPSJyaWdodCI+Ci0gIDxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiwgVGltZXMsIHNlcmlmIiBzaXplPSIyIj5Db3B5cmlnaHQgqSAyMDA0IEVkCi0gIEJ1cm5ldHRlLjwvZm9udD4KLSAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgPHRib2R5PgotICAgICAgPHRyPgotICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiBjb2xzcGFuPSIyIiBiZ2NvbG9yPSIjMDA4MGMwIj48Yj48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5FY2xpcHNlCi0gICAgICAgICAgQXJ0aWNsZTwvZm9udD48L2ZvbnQ+PC9iPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGJvZHk+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KLTxkaXYgYWxpZ249ImxlZnQiPgotICA8aDEgdGl0bGU9IlJDUCBUdXRvcmlhbCI+PGltZyBzcmM9ImltYWdlcy9JZGVhLmpwZyIgYWxpZ249Im1pZGRsZSIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI4NiI+PC9oMT4KLTwvZGl2PgotPGgxIGFsaWduPSJjZW50ZXIiPlJpY2ggQ2xpZW50IFR1dG9yaWFsIFBhcnQgMjwvaDE+Ci08cCBjbGFzcz0ic3VtbWFyeSI+Ci1UaGUgUmljaCBDbGllbnQgUGxhdGZvcm0gKFJDUCkKLWFsbG93cyB5b3UgdG8KLWJ1aWxkIEphdmEgYXBwbGljYXRpb25zIHRoYXQgY2FuIGNvbXBldGUgd2l0aCBuYXRpdmUKLWFwcGxpY2F0aW9ucyBvbiBhbnkgcGxhdGZvcm0uCi1QYXJ0IDEgb2YgdGhlIHR1dG9yaWFsIGludHJvZHVjZWQgeW91IHRvIHRoZSBwbGF0Zm9ybQotYW5kIHRoZSBzdGVwcyB1c2VkIHRvIGJ1aWxkIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBSQ1AgcHJvZ3JhbS4KLUluIHBhcnQgMiB3ZSdsbCBsb29rIGF0IHdoYXQgd2UgZGlkIGluIG1vcmUgZGV0YWlsCi1hbmQgaW50cm9kdWNlIHNvbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY2xhc3NlcwotdGhhdCBsZXQgeW91IHRha2UgY29udHJvbCBvZiBtdWNoIG9mIHRoZSBsYXlvdXQgYW5kCi1mdW5jdGlvbmFsaXR5IG9mIGFuIFJDUCBhcHBsaWNhdGlvbi4KLTwvcD4KLTxwPjxiPkJ5IEVkIEJ1cm5ldHRlLCBTQVM8L2I+PGJyPgotPGZvbnQgc2l6ZT0iLTEiPkF1Z3VzdCA5LCAyMDA0PC9mb250PjwvcD4KLTxociB3aWR0aD0iMTAwJSI+Ci0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPgotPHA+Ci1JbiBFY2xpcHNlIDIuMSwgbWFueSBmdW5jdGlvbnMgb2YgdGhlIEVjbGlwc2UgSURFIHdlcmUgaGFyZC13aXJlZAotaW50byB0aGUgY29kZS4KLVRoZXNlIGluY2x1ZGVkIHRoZSBuYW1lIGFuZCBsb2NhdGlvbiBvZiB0aGUgRmlsZSBtZW51LAotdGhlIHRpdGxlIG9mIHRoZSBXb3JrYmVuY2ggV2luZG93LCBhbmQgdGhlIGV4aXN0ZW5jZSBvZgotdGhlIHN0YXR1cyBiYXIuCi1UaGlzIHdhcyBmaW5lIGZvciB0aGUgSURFIGJ1dCB3aGVuIHBlb3BsZSBzdGFydGVkIHRvCi11c2UgRWNsaXBzZSBhcyBhIGJhc2lzIGZvciBub24tSURFIHByb2dyYW1zLCBzb21ldGltZXMKLXRoZXNlIHRoaW5ncyBkaWRuJ3QgbWFrZSBzZW5zZS4KLUFsdGhvdWdoIGFsbCB0aGUgc291cmNlIGNvZGUgd2FzIHByb3ZpZGVkLCBpdCB3YXMKLWluY29udmVuaWVudCB0byBmaW5kIHRoZSByaWdodCBwbGFjZXMgdGhhdCBoYWQgdG8gYmUKLWNoYW5nZWQuCi1TbyBmb3IgRWNsaXBzZSAzLCB0aGUgZGVzaWduZXJzIHJlZmFjdG9yZWQgdGhlIEFQSSB0bwotbWFrZSB0aGVzZSBhbmQgb3RoZXIgaGFyZC13aXJlZCBhc3BlY3RzIG9mIHRoZSB1c2VyCi1pbnRlcmZhY2UgY29udHJvbGxhYmxlIHRocm91Z2ggcHVibGljIEFQSS4KLTwvcD4KLTxwPgotVG8gdGhpcyBlbmQsIEVjbGlwc2UgMyBpbnRyb2R1Y2VzIGEgYnJhbmQgbmV3Ci08Y29kZT5Xb3JrYmVuY2hBZHZpc29yPC9jb2RlPiBjbGFzcyBhbmQgYSBzZXQgb2YKLTxjb2RlPipDb25maWd1cmVyPC9jb2RlPiBpbnRlcmZhY2VzLgotVGhlIG1vc3QgaW1wb3J0YW50IGNsYXNzIGZvciBhbiBSQ1AgZGV2ZWxvcGVyIHRvIHVuZGVyc3RhbmQgaXMKLTxjb2RlPldvcmtiZW5jaEFkdmlzb3I8L2NvZGU+LgotWW91IGV4dGVuZCB0aGUgYmFzZSB2ZXJzaW9uIG9mIHRoZSA8Y29kZT5Xb3JrYmVuY2hBZHZpc29yPC9jb2RlPiBjbGFzcwotaW4geW91ciBSQ1AgYXBwbGljYXRpb24gYW5kIG92ZXJyaWRlIG9uZSBvciBtb3JlIG9mIHRoZSBtZXRob2RzCi10byBzZXQgd2hhdGV2ZXIgb3B0aW9ucyB5b3Ugd2FudC4KLUluIHBhcnQgMSwgd2UgaW1wbGVtZW50ZWQgb25lIG9mIHRoZSBzaW1wbGVyIG1ldGhvZHMsCi08Y29kZT5nZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZDwvY29kZT4sCi1pbiBvcmRlciB0byByZXR1cm4gdGhlIG9uZSBhbmQgb25seSBwZXJzcGVjdGl2ZSAoc2V0IG9mIHZpZXdzLCBlZGl0b3JzLCBhbmQgbWVudXMpCi1mb3IgdGhlIGFwcGxpY2F0aW9uLgotPC9wPgotPHA+Ci1JbiB0aGUgbmV4dCBzZWN0aW9uIHdlJ2xsIHRha2UgYSBsb29rIGF0IHRoZSBvdGhlciBhZHZpc29yIG1ldGhvZHMKLXRvIGdldCBhIHF1aWNrIG92ZXJ2aWV3IG9mIHdoYXQgaXMgcG9zc2libGUgd2l0aCB0aGVtLgotSWYgeW91IHdhbnQgdG8gY3V0IHRvIHRoZSBjaGFzZSBhbmQgbG9vayBhdCBvciBkb3dubG9hZAotdGhlIGNvZGUgZm9yIHRoaXMgcGFydCB5b3UgY2FuIHZpZXcgdGhlCi08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIiPkVjbGlwc2UgcHJvamVjdCBoZXJlPC9hPi4KLTwvcD4KLTxwPgotT3RoZXJ3aXNlLCBsZXQncyBzdGFydCBieSBjbGVhcmluZyB1cAotc29tZSBwb3NzaWJsZSBjb25mdXNpb24gYWJvdXQKLXRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbgotQXBwbGljYXRpb25zLCBXb3JrYmVuY2hlcywgYW5kIFdvcmtiZW5jaCBXaW5kb3dzLgotPC9wPgotCi08aDI+QXBwbGljYXRpb25zLCBXb3JrYmVuY2hlcywgYW5kIFdvcmtiZW5jaCBXaW5kb3dzPC9oMj4KLTxwPgotVGhlIEFwcGxpY2F0aW9uIGlzIGEgY2xhc3MgeW91IGNyZWF0ZSB0aGF0IGFjdHMgYXMgeW91ciBSQ1AgcHJvZ3JhbSdzIG1haW4gcm91dGluZS4KLVlvdSBjYW4gdGhpbmsgb2YgaXQgYXMgdGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBwcm9ncmFtLgotSnVzdCBsaWtlIHRoZSBjb250cm9sbGVyIGluIGEgTW9kZWwyIGFyY2hpdGVjdHVyZSwgaXQgaXMgc2hvcnQgYW5kIHN3ZWV0Ci1hbmQgZG9lc24ndCBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBmb3IgZGlmZmVyZW50IHByb2plY3RzLgotQWxsIGl0IGRvZXMgaXMgY3JlYXRlIGEgV29ya2JlbmNoIGFuZCBhdHRhY2ggYSBXb3JrYmVuY2ggQWR2aXNvciB0byBpdC4KLTwvcD4KLTxwPgotVGhlIFdvcmtiZW5jaCBpcyBkZWNsYXJlZCBhbmQgbWFpbnRhaW5lZCBmb3IgeW91IGFzIHBhcnQgb2YgdGhlIFJDUCBmcmFtZXdvcmsuCi1UaGVyZSBpcyBvbmx5IG9uZSBXb3JrYmVuY2ggYnV0IGl0IGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgdmlzaWJsZSB0b3AtbGV2ZWwKLVdvcmtiZW5jaCBXaW5kb3cuCi1Gb3IgZXhhbXBsZSwgaW4gdGhlIEVjbGlwc2UgSURFLCB3aGVuIHlvdSBmaXJzdCBzdGFydCBFY2xpcHNlIHlvdSB3aWxsIHNlZQotb25lIFdvcmtiZW5jaCBXaW5kb3csIGJ1dCBpZiB5b3Ugc2VsZWN0IDxiPldpbmRvdyAmZ3Q7IE5ldyBXaW5kb3c8L2I+IGEgc2Vjb25kCi13aW5kb3cgcG9wcyB1cCAtLQotdHdvIFdvcmtiZW5jaCBXaW5kb3dzLCBidXQgb25seSBvbmUgV29ya2JlbmNoLgotPC9wPgotPHA+Ci1GaWd1cmUgMSBzaG93cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4geW91ciBBcHBsaWNhdGlvbiwgdGhlIFdvcmtiZW5jaCwgYW5kCi1Xb3JrYmVuY2ggV2luZG93cy4KLTwvcD4KLTxpbWcgc3JjPSJpbWFnZXMvQXBwbGljYXRpb24ucG5nIj4KLTxwPjxiPkZpZ3VyZSAxLiBBbiBSQ1AgcHJvZ3JhbSBoYXMgb25lIEFwcGxpY2F0aW9uIGNsYXNzIHRoYXQgeW91IHByb3ZpZGUsIGFuZCBvbmUKLVdvcmtiZW5jaCBjbGFzcyBwcm92aWRlZCBieSB0aGUgZnJhbWV3b3JrLgotVHlwaWNhbGx5IHRoZXJlIGlzIG9ubHkgb25lIFdvcmtiZW5jaCBXaW5kb3cgYnV0Ci10aGUgZnJhbWV3b3JrIHN1cHBvcnRzIGhhdmluZyBtb3JlIHRoYW4gb25lLgotPC9iPjwvcD4KLQotPHA+Ci1Paywgbm93IHRoYXQgdGhhdCdzIG91dCBvZiB0aGUgd2F5LCBsZXQncyBnZXQgb3VyIGZlZXQgd2V0IHdpdGgKLWNoYW5naW5nIGhvdyB0aGUgV29ya2JlbmNoIFdpbmRvdyBsb29rcy4KLTwvcD4KLQotPGgyPkN1c3RvbWl6aW5nIHRoZSBXb3JrYmVuY2ggV2luZG93PC9oMj4KLTxwPgotVGhlIHNpbXBsZSBleGFtcGxlIGluIHBhcnQgMSBsZWZ0IHJvb20gZm9yIGEgc3RhdHVzIGxpbmUsIHRvb2wgYmFyLCBhbmQKLW90aGVyIHZpc3VhbCBlbGVtZW50cyBldmVuIHRob3VnaCB0aGV5IHdlcmVuJ3QgdXNlZC4KLVdlIGNvdWxkIGFyZ3VlIHRoYXQgdGhvc2Ugc2hvdWxkIGJlIG9mZiBieSBkZWZhdWx0LCBidXQKLWZvciBzb21lIHJlYXNvbiB0aGV5J3JlIG5vdCBzbyBpZiB5b3UgZG9uJ3Qgd2FudCB0aGVtCi10aGVuIHlvdSBoYXZlIHRvIHR1cm4gdGhlbSBvZmYgeW91cnNlbGYuCi1BbHNvIHRoZSB3aW5kb3cgZGlkbid0IGhhdmUgYSB0aXRsZSBhbmQgaXQKLW9wZW5lZCBtdWNoIGxhcmdlciB0aGFuIGl0IG5lZWRlZCB0byBiZS4KLUEgZ29vZCBwbGFjZSB0byB0YWtlIGNhcmUgb2YgYWxsCi10aGlzIGlzIHRoZSA8Y29kZT5wcmVXaW5kb3dPcGVuPC9jb2RlPiBtZXRob2QKLW9mIDxjb2RlPldvcmtiZW5jaEFkdmlzb3I8L2NvZGU+LAotYXMgc2hvd24gaW4gbGlzdGluZyAxLgotPC9wPgotPHA+PGI+TGlzdGluZyAxLiBwcmVXaW5kb3dPcGVuIGV4YW1wbGUuCi08L2I+PC9wPgotPHByZT4KLSAgICBwdWJsaWMgdm9pZCBwcmVXaW5kb3dPcGVuKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLSAgICAgICAgc3VwZXIucHJlV2luZG93T3Blbihjb25maWd1cmVyKTsKLSAgICAgICAgY29uZmlndXJlci5zZXRJbml0aWFsU2l6ZShuZXcgUG9pbnQoNDAwLCAzMDApKTsKLSAgICAgICAgY29uZmlndXJlci5zZXRTaG93Q29vbEJhcihmYWxzZSk7Ci0gICAgICAgIGNvbmZpZ3VyZXIuc2V0U2hvd1N0YXR1c0xpbmUoZmFsc2UpOwotICAgICAgICBjb25maWd1cmVyLnNldFRpdGxlKCJIZWxsbywgUkNQIik7Ci0gICAgfQotPC9wcmU+Ci0KLTxwPgotTm90aWNlIGhvdyBhIENvbmZpZ3VyZXIgaW50ZXJmYWNlIChpbiB0aGlzIGNhc2UsIDxjb2RlPklXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyPC9jb2RlPikKLWlzIHBhc3NlZCBpbiB0byB0aGUgYWR2aXNvciBtZXRob2QuCi1Zb3UgY2FsbCBtZXRob2RzIG9uIHRoZSBDb25maWd1cmVyIGludGVyZmFjZXMgdG8gYWN0dWFsbHkKLWNoYW5nZSB0aGUgb3B0aW9ucy4KLVRoZXNlIGludGVyZmFjZXMgYXJlIG5vdCBjb3ZlcmVkIGluIGFueSBkZXRhaWwgaW4gdGhpcyB0dXRvcmlhbAotYnV0IHlvdSBjYW4gcmVmZXIgdG8gdGhlaXIgSmF2YWRvYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLVNlZSBmaWd1cmUgMiBmb3IgdGhlIGZpbmFsIHJlc3VsdC4KLTwvcD4KLQotPGltZyBzcmM9ImltYWdlcy9oZWxsb3RpdGxlLnBuZyI+Ci08cD48Yj4KLUZpZ3VyZSAyLiBXb3JrYmVuY2ggd2luZG93IHdpdGggYSB0aXRsZS4KLVVudXNlZCBjb250cm9scyBhcmUgdHVybmVkIG9mZiBhbmQgYSB0aXRsZSBpcyBhZGRlZCB1c2luZyB0aGUKLTxjb2RlPnByZVdpbmRvd09wZW48L2NvZGU+IGV2ZW50IG9mCi08Y29kZT5Xb3JrYmVuY2hBZHZpc29yPC9jb2RlPi4KLTwvYj48L3A+Ci0KLTxoMj5EaWdnaW5nIGludG8gdGhlIDxjb2RlPldvcmtiZW5jaEFkdmlzb3I8L2NvZGU+IGNsYXNzPC9oMj4KLTxwPgotU2luY2UgUkNQIGlzIG5ldyBhbmQgZG9jdW1lbnRhdGlvbiBpcyBzcGFyc2UsCi13ZSdyZSBnb2luZyB0byBkZXBhcnQgZnJvbSBvdXIgdHV0b3JpYWwgZm9ybWF0IGF0IHRoaXMgcG9pbnQgdG8KLWV4YW1pbmUgc29tZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZQotPGNvZGU+V29ya2JlbmNoQWR2aXNvcjwvY29kZT4gY2xhc3MuCi1NZXRob2RzIGluIHRoaXMgY2xhc3MgYXJlIGNhbGxlZCBmcm9tIHRoZSBwbGF0Zm9ybSB0bwotbm90aWZ5IHlvdSBhdCBldmVyeSBwb2ludCBpbiB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBXb3JrYmVuY2gKLWFuZCB0b3AgbGV2ZWwgV29ya2JlbmNoIFdpbmRvd3MuCi1UaGV5IGFsc28gcHJvdmlkZSBhIHdheSB0byBoYW5kbGUgZXhjZXB0aW9ucyBpbiB0aGUKLWV2ZW50IGxvb3AsCi1hbmQgcHJvdmlkZSBpbXBvcnRhbnQgcGFyYW1ldGVycyB0byB0aGUgV29ya2JlbmNoIHN1Y2ggYXMKLXRoZSBkZWZhdWx0IHBlcnNwZWN0aXZlLgotRmlyc3QgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIGxpZmVjeWNsZSBldmVudHMuCi08L3A+Ci0KLTxwPgotPGltZyBzcmM9ImltYWdlcy9ub3RlLmdpZiIgYWx0PSJOb3RlOiAiIHdpZHRoPSI2MiIgaGVpZ2h0PSIxMyI+Ci1XaHkgbm90IGFuIGludGVyZmFjZT8KLVlvdSdsbCBub3RpY2UgdGhhdCA8Y29kZT5Xb3JrYmVuY2hBZHZpc29yPC9jb2RlPiBpcyBhbiBhYnN0cmFjdCBjbGFzcy4KLUZvciB0aGUgbW9zdCBwYXJ0LCBFY2xpcHNlIEFQSXMgc2h1biBhYnN0cmFjdCBjbGFzc2VzIGluIGZhdm9yIG9mIGludGVyZmFjZXMgYW5kCi1iYXNlIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhvc2UgaW50ZXJmYWNlcy4KLUluIHRoaXMgY2FzZSwgdGhlIGRlc2lnbmVycyBpbnRlbmQgZm9yIDxjb2RlPldvcmtiZW5jaEFkdmlzb3I8L2NvZGU+Ci10byA8aT5hbHdheXM8L2k+IGJlIGltcGxlbWVudGVkCi1ieSB0aGUgUkNQIGFwcGxpY2F0aW9uLCB0aGUgYmFzZSBjbGFzcyBkb2Vzbid0IGNvbnRhaW4gYW55IHNpZ25pZmljYW50IGZ1bmN0aW9uYWxpdHksCi1hbmQgaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCBuZXcgbWV0aG9kcyB3aWxsIG5lZWQgdG8gYmUgYWRkZWQgdG8gdGhlIGJhc2UgY2xhc3MgaW4gdGhlCi1mdXR1cmUgKHNvbWV0aGluZyB0aGF0IGlzIGRpZmZpY3VsdCB1c2luZyBpbnRlcmZhY2VzKS4KLVNvIHRoaXMgd2FzIGEgZGVsaWJlcmF0ZSBkZXNpZ24gY2hvaWNlLgotU2VlIHRoZSBhcnRpY2xlIG9uIGV2b2x2aW5nIEphdmEgQVBJcyBpbiB0aGUgcmVmZXJlbmNlIHNlY3Rpb24KLWZvciBtb3JlIHRpcHMuCi08L3A+Ci0KLTxoMz5MaWZlY3ljbGUgZXZlbnRzPC9oMz4KLQotPHA+Ci1UaGVyZSBpcyBvbmx5IG9uZSBXb3JrYmVuY2gsIGFuZAotdHlwaWNhbGx5IHRoZXJlIGlzIGFsc28gb25seSBvbmUgV29ya2JlbmNoIFdpbmRvdywgdGhvdWdoIHlvdSBjYW4gb3BlbgotbW9yZSB0aGFuIG9uZSBpZiB5b3UgbGlrZSAob24gZGlmZmVyZW50IG1vbml0b3JzIGZvciBleGFtcGxlKS4KLVNlZSBmaWd1cmUgMyBmb3IgdGhlIG1vc3QgaW1wb3J0YW50IGV2ZW50cyBpbiB0aGUgbGlmZXRpbWUgb2YKLVdvcmtiZW5jaGVzIGFuZCB0aGVpciB3aW5kb3dzLgotVGFibGUgMSBzaG93cyBhbGwgdGhlIG1ldGhvZHMgdGhhdCB5b3UgY2FuIGRlZmluZSBpbiB5b3VyCi1vd24gc3ViY2xhc3Mgb2YgPGNvZGU+V29ya2JlbmNoQWR2aXNvcjwvY29kZT4gdG8gbGV0IHlvdQotaG9vayBpbnRvIGxpZmVjeWNsZSBldmVudHMgZm9yIHRoZSBXb3JrYmVuY2guCi1UYWJsZSAyIHNob3dzIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZHMgZm9yCi1Xb3JrYmVuY2ggV2luZG93cy4KLTwvcD4KLQotPGltZyBzcmM9ImltYWdlcy9MaWZlY3ljbGUucG5nIj4KLTxwPjxiPkZpZ3VyZSAzLiBJbXBvcnRhbnQgZXZlbnRzIGluIHRoZSBsaWZlY3ljbGUgb2YgdGhlIFdvcmtiZW5jaCBhbmQgV29ya2JlbmNoIFdpbmRvdyhzKS4KLVRoZXNlIGNvcnJlc3BvbmQgdG8gbWV0aG9kcyBpbiA8Y29kZT5Xb3JrYmVuY2hBZHZpc29yPC9jb2RlPiB0aGF0IGFyZSBjYWxsZWQgYnkgdGhlIFBsYXRmb3JtCi10byBsZXQgeW91IHBlcmZvcm0gY3VzdG9tIGNvZGUgYXQgdGhlc2UgcG9pbnRzIGluIHRpbWUuCi08L2I+PC9wPgotCi08cD48Yj5UYWJsZSAxLgotV29ya2JlbmNoIGxpZmVjeWNsZSBob29rcyBwcm92aWRlZCBieSA8Y29kZT5vcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yPC9jb2RlPi4KLTwvYj48L3A+Ci08dGFibGUgYm9yZGVyPSIxIj4KLQk8dHI+PHRoPk1ldGhvZAotCQk8dGg+RGVzY3JpcHRpb24KLQkJPHRoPlBhcmFtZXRlcihzKQotCQkKLQk8dHI+PHRkPmluaXRpYWxpemUKLQkJPHRkPkNhbGxlZCBmaXJzdCB0byBwZXJmb3JtIGFueSBzZXR1cCBzdWNoIGFzCi0JCXBhcnNpbmcgdGhlIGNvbW1hbmQgbGluZSwgcmVnaXN0ZXJpbmcgYWRhcHRlcnMsIGRlY2xhcmluZyBpbWFnZXMsIGV0Yy4uCi0JCTx0ZD48Y29kZT5JV29ya2JlbmNoQ29uZmlndXJlcjxjb2RlPgotCQkKLQk8dHI+PHRkPnByZVN0YXJ0dXAKLQkJPHRkPkNhbGxlZCBhZnRlciBpbml0aWFsaXphdGlvbiBidXQgYmVmb3JlIHRoZSBmaXJzdCB3aW5kb3cgaXMgb3BlbmVkLgotCQlNYXkgYmUgdXNlZCB0byBzZXQgb3B0aW9ucyBhZmZlY3Rpbmcgd2hpY2ggZWRpdG9ycyBhbmQgdmlld3MKLQkJYXJlIGluaXRpYWxseSBvcGVuZWQuCi0JCTx0ZD4mbmJzcDsKLQkJCi0JPHRyPjx0ZD5wb3N0U3RhcnR1cAotCQk8dGQ+Q2FsbGVkIGFmdGVyIGFsbCB3aW5kb3dzIGhhdmUgYmVlbiBvcGVuZWQgb3IgcmVzdG9yZWQsCi0JCWJ1dCBiZWZvcmUgdGhlIGV2ZW50IGxvb3Agc3RhcnRzLgotCQlJdCBjYW4gYmUgdXNlZCB0byBzdGFydCBhdXRvbWF0aWMgcHJvY2Vzc2VzIGFuZCB0bwotCQlvcGVuIHRpcHMgb3Igb3RoZXIgd2luZG93cy4KLQkJPHRkPiZuYnNwOwotCi0JPHRyPjx0ZD5wcmVTaHV0ZG93bgotCQk8dGQ+Q2FsbGVkIGFmdGVyIHRoZSBldmVudCBsb29wIGhhcyB0ZXJtaW5hdGVkIGJ1dCBiZWZvcmUgYW55Ci0JCXdpbmRvd3MgaGF2ZSBiZWVuIGNsb3NlZC4KLQkJPHRkPiZuYnNwOwotCi0JPHRyPjx0ZD5wb3N0U2h1dGRvd24KLQkJPHRkPkNhbGxlZCBhZnRlciBhbGwgd2luZG93cyBhcmUgY2xvc2VkIGR1cmluZyBXb3JrYmVuY2ggc2h1dGRvd24uCi0JCVRoaXMgY2FuIGJlIHVzZWQgdG8gc2F2ZSB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBzdGF0ZSBhbmQKLQkJY2xlYW4gdXAgYW55dGhpbmcgY3JlYXRlZAotCQlieSA8Y29kZT5pbml0aWFsaXplPC9jb2RlPi4KLQkJPHRkPiZuYnNwOwotCi08L3RhYmxlPgotCi08cD48Yj5UYWJsZSAyLgotV29ya2JlbmNoIHdpbmRvdyBsaWZlY3ljbGUgaG9va3MgcHJvdmlkZWQgYnkgPGNvZGU+b3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvcjwvY29kZT4uIAotPC9iPjwvcD4KLTx0YWJsZSBib3JkZXI9IjEiPgotCTx0cj48dGg+TWV0aG9kCi0JCTx0aD5EZXNjcmlwdGlvbgotCQk8dGg+UGFyYW1ldGVyKHMpCi0KLQk8dHI+PHRkPnByZVdpbmRvd09wZW4KLQkJPHRkPkNhbGxlZCBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIFdvcmtiZW5jaCBXaW5kb3cuCi0JCVVzZSB0aGlzIG1ldGhvZCB0byBzZXQgb3B0aW9ucyBzdWNoIGFzIHdoZXRoZXIgb3Igbm90IHRoZSB3aW5kb3cgd2lsbCBoYXZlCi0JCWEgbWVudSBiYXIuCi0JCUhvd2V2ZXIgbm9uZSBvZiB0aGUgd2luZG93J3Mgd2lkZ2V0cyBoYXZlIGJlZW4gY3JlYXRlZCB5ZXQgc28gdGhleQotCQljYW4ndCBiZSByZWZlcmVuY2VkIGluIHRoaXMgbWV0aG9kLgotCQk8dGQ+PGNvZGU+SVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI8L2NvZGU+Ci0KLQk8dHI+PHRkPmZpbGxBY3Rpb25CYXJzCi0JCTx0ZD5DYWxsZWQgcmlnaHQgYWZ0ZXIgPGNvZGU+cHJlV2luZG93T3BlbjwvY29kZT4uCi0JCVRoaXMgaXMgd2hlcmUgeW91IHNldCB1cCBhbnkgaGFyZC13aXJlZCBtZW51cyBhbmQgdG9vbGJhcnMuCi0JCVRoaXMgaXMgcHJvYmFibHkgdGhlIG1vc3QgY29tcGxpY2F0ZWQgbWV0aG9kIGhlcmUgYmVjYXVzZSBvZiB0aGUgZmxhZ3MKLQkJaXQgaXMgcGFzc2VkLgotCQlOb3RlOiB0YWtlcyBhIFdvcmtiZW5jaCB3aW5kb3csIG5vdCBhIGNvbmZpZ3VyZXIuCi0JCTx0ZD48Y29kZT5JV29ya2JlbmNoV2luZG93PC9jb2RlPiwKLQkJPGNvZGU+SUFjdGlvbkJhckNvbmZpZ3VyZXI8L2NvZGU+LCBmbGFncwotCi0JPHRyPjx0ZD5wb3N0V2luZG93UmVzdG9yZQotCQk8dGQ+T3B0aW9uYWxseSBjYWxsZWQgZm9yIGNhc2VzIHdoZW4gYSB3aW5kb3cgaGFzIGJlZW4gcmVzdG9yZWQKLQkJZnJvbSBzYXZlZCBzdGF0ZSBidXQgYmVmb3JlIGl0IGlzIG9wZW5lZC4KLQkJPHRkPjxjb2RlPklXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyPC9jb2RlPgotCQkKLQk8dHI+PHRkPnBvc3RXaW5kb3dDcmVhdGUKLQkJPHRkPkNhbGxlZCBhZnRlciBhIHdpbmRvdyBoYXMgYmVlbiByZXN0b3JlZAotCQlmcm9tIHNhdmVkIHN0YXRlIG9yIGNyZWF0ZWQgZnJvbSBzY3JhdGNoCi0JCWJ1dCBiZWZvcmUgaXQgaXMgb3BlbmVkLgotCQk8dGQ+PGNvZGU+SVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI8L2NvZGU+Ci0JCQotCTx0cj48dGQ+b3BlbkludHJvCi0JCTx0ZD5DYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGEgd2luZG93IGlzIG9wZW5lZAotCQlpbiBvcmRlciB0byBjcmVhdGUgdGhlIEludHJvIGNvbXBvbmVudCAoaWYgYW55KS4KLQkJPHRkPjxjb2RlPklXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyPC9jb2RlPgotCQkKLQk8dHI+PHRkPnBvc3RXaW5kb3dPcGVuCi0JCTx0ZD5DYWxsZWQgcmlnaHQgYWZ0ZXIgdGhlIFdvcmtiZW5jaCB3aW5kb3cgaXMgb3BlbmVkLgotCQlDYW4gYmUgdXNlZCB0byB0d2VhayBhbnkgb2YgdGhlIHdpbmRvdydzIHdpZGdldHMsIGZvciBleGFtcGxlCi0JCXRvIHNldCBhIHRpdGxlIG9yIGNoYW5nZSBpdHMgc2l6ZS4KLQkJPHRkPjxjb2RlPklXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyPC9jb2RlPgotCi0JPHRyPjx0ZD5wcmVXaW5kb3dTaGVsbENsb3NlCi0JCTx0ZD5DYWxsZWQgYmVmb3JlIHRoZSBXb3JrYmVuY2ggd2luZG93IGlzIGNsb3NlZAotCQkodGVjaG5pY2FsbHksIGJlZm9yZSBpdHMgc2hlbGwgaXMgY2xvc2VkKS4KLQkJVGhpcyBpcyB0aGUgb25seSBmdW5jdGlvbiB0aGF0IGNhbiB2ZXRvIHRoZSBjbG9zZSwgc28gaXQncwotCQlhIGdvb2QgcGxhY2UgZm9yIGFuICJBcmUgeW91IHN1cmUiIGtpbmQgb2YgZGlhbG9nLgotCQk8dGQ+PGNvZGU+SVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI8L2NvZGU+Ci0KLQk8dHI+PHRkPnBvc3RXaW5kb3dDbG9zZQotCQk8dGQ+Q2FsbGVkIGFmdGVyIHRoZSBXb3JrYmVuY2ggd2luZG93IGlzIGNsb3NlZAotCQlDYW4gYmUgdXNlZCB0byBjbGVhbiB1cCBhbnl0aGluZyBjcmVhdGVkIGJ5Ci0JCTxjb2RlPnByZVdpbmRvd09wZW48L2NvZGU+LgotCQk8dGQ+PGNvZGU+SVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI8L2NvZGU+Ci08L3RhYmxlPgotCi08aDM+RXZlbnQgbG9vcCBob29rczwvaDM+Ci0KLTxwPgotVGhlIGV2ZW50IGxvb3AgaXMgdGhlIGNvZGUgdGhhdCBpcyBydW5uaW5nIG1vc3Qgb2YgdGhlIHRpbWUgZHVyaW5nCi10aGUgbGlmZSBvZiB0aGUgV29ya2JlbmNoLgotSXQgaGFuZGxlcyBhbGwgdXNlciBpbnB1dHMgYW5kIGRpc3BhdGNoZXMgdGhlbSB0byB0aGUgcmlnaHQgbGlzdGVuZXJzLgotUkNQIHByb3ZpZGVzIGEgY291cGxlIG9mIGhvb2tzIHRvIGhhbmRsZSBjcmFzaGVzIGFuZCBwZXJmb3JtIHdvcmsgZHVyaW5nIGlkbGUgdGltZQotKHNlZSB0YWJsZSAzKS4KLTwvcD4KLQotPHA+PGI+VGFibGUgMy4KLUV2ZW50IGxvb3AgaG9va3MgcHJvdmlkZWQgYnkgPGNvZGU+b3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvcjwvY29kZT4uCi08L2I+PC9wPgotPHRhYmxlIGJvcmRlcj0iMSI+Ci0JPHRyPjx0aD5NZXRob2QKLQkJPHRoPkRlc2NyaXB0aW9uCi0JCTx0aD5QYXJhbWV0ZXIocykKLQkJCi0JPHRyPjx0ZD5ldmVudExvb3BFeGNlcHRpb24KLQkJPHRkPkNhbGxlZCBpZiB0aGVyZSBpcyBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uIGluIHRoZSBldmVudCBsb29wLgotCQlUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGxvZyB0aGUgZXJyb3IuCi0JCTx0ZD48Y29kZT5UaHJvd2FibGU8L2NvZGU+Ci0KLQk8dHI+PHRkPmV2ZW50TG9vcElkbGUKLQkJPHRkPkNhbGxlZCB3aGVuIHRoZSBldmVudCBsb29wIGhhcyBub3RoaW5nIHRvIGRvLgotCQk8dGQ+PGNvZGU+RGlzcGxheTwvY29kZT4KLTwvdGFibGU+Ci0KLTxoMz5JbmZvcm1hdGlvbiBnZXR0aW5nIGhvb2tzPC9oMz4KLTxwPgotTmV4dCwgdGhlcmUgYXJlIGZldyBtZXRob2RzIHlvdSBjYW4gaW1wbGVtZW50IHRoYXQKLXRoZSBwbGF0Zm9ybSB3aWxsIGNhbGwgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHlvdXIgYXBwbGljYXRpb24KLShzZWUgdGFibGUgNCkuCi1UaGUgbW9zdCBpbXBvcnRhbnQgb25lIChhbmQgdGhlIG9ubHkgb25lIHRoYXQgaXMgbm90IG9wdGlvbmFsKQotaXMgPGNvZGU+Z2V0SW5pdGlhbFdpbmRvd1BlcnNwZWN0aXZlSWQ8L2NvZGU+LgotV2UgdXNlZCB0aGlzIGluIHBhcnQgMSB0byByZXR1cm4gdGhlIGlkIG9mIHRoZSBzdGFydGluZyAoYW5kIG9ubHkpCi1wZXJzcGVjdGl2ZSBpbiBSY3BUZXN0LgotPC9wPgotCi08cD48Yj5UYWJsZSA0LgotSW5mb3JtYXRpb24gcmVxdWVzdHMgcHJvdmlkZWQgYnkgPGNvZGU+b3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvcjwvY29kZT4uCi08L2I+PC9wPgotPHRhYmxlIGJvcmRlcj0iMSI+Ci0JPHRyPjx0aD5NZXRob2QKLQkJPHRoPkRlc2NyaXB0aW9uCi0JCTx0aD5QYXJhbWV0ZXIocykKLQkJCi0JCi0JPHRyPjx0ZD5nZXREZWZhdWx0UGFnZUlucHV0Ci0JCTx0ZD5SZXR1cm4gdGhlIGRlZmF1bHQgaW5wdXQgZm9yIG5ldyB3b3JrYmVuY2ggcGFnZXMuCi0JCURlZmF1bHRzIHRvIG51bGwuCi0JCTx0ZD4mbmJzcDsKLQotCTx0cj48dGQ+Z2V0SW5pdGlhbFdpbmRvd1BlcnNwZWN0aXZlSWQKLQkJPHRkPlJldHVybiB0aGUgaW5pdGlhbCBwZXJzcGVjdGl2ZSB1c2VkIGZvciBuZXcgd29ya2JlbmNoIHdpbmRvd3MuCi0JCVRoaXMgaXMgYSByZXF1aXJlZCBmdW5jdGlvbiB0aGF0IGhhcyBubyBkZWZhdWx0LgotCQk8dGQ+Jm5ic3A7Ci0KLQk8dHI+PHRkPmdldE1haW5QcmVmZXJlbmNlUGFnZUlkCi0JCTx0ZD5SZXR1cm4gdGhlIHByZWZlcmVuY2UgcGFnZSB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgZmlyc3QuCi0JCURlZmF1bHRzIHRvIG51bGwsIG1lYW5pbmcgdGhlIHBhZ2VzIHNob3VsZCBiZSBhcnJhbmdlZCBhbHBoYWJldGljYWxseS4KLQkJPHRkPiZuYnNwOwotCi0JPHRyPjx0ZD5pc0FwcGxpY2F0aW9uTWVudQotCQk8dGQ+UmV0dXJuIHRydWUgaWYgdGhlIG1lbnUgaXMgb25lIG9mIHlvdXJzLgotCQlPTEUgc3BlY2lmaWM7IHNlZSBKYXZhZG9jIGZvciBkZXRhaWxzLgotCQk8dGQ+PGNvZGU+SVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI8L2NvZGU+LAotCQk8Y29kZT5TdHJpbmc8L2NvZGU+Ci08L3RhYmxlPgotCi08aDM+QWR2YW5jZWQgY29uZmlndXJhdGlvbjwvaDM+Ci08cD4KLVRoZSA8Y29kZT5Xb3JrYmVuY2hBZHZpc29yPC9jb2RlPiBldmVudHMgYWJvdmUgc2hvdWxkIGJlCi1zdWZmaWNpZW50IGZvciBtb3N0IGFwcGxpY2F0aW9ucywgYnV0IGp1c3QgaW4gY2FzZSwKLVJDUCBwcm92aWRlcyB0d28gbW9yZSBtZXRob2RzIHRvIHRha2UgY29tcGxldGUgY29udHJvbAotb2YgaG93IHlvdXIgYXBwbGljYXRpb24gd2luZG93cyBhbmQgY29udHJvbHMgYXJlIGNyZWF0ZWQuCi1UaGV5J3JlIGxpc3RlZCBpbiB0YWJsZSA1IGZvciBjb21wbGV0ZW5lc3MgYnV0IEkKLWRvbid0IGV4cGVjdCBtYW55IHByb2dyYW1zIHdpbGwgbmVlZCB0aGVtLgotPC9wPgotCi08cD48Yj5UYWJsZSA1LgotQWR2YW5jZWQgbWV0aG9kcyBpbiA8Y29kZT5vcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yPC9jb2RlPi4KLTwvYj48L3A+Ci08dGFibGUgYm9yZGVyPSIxIj4KLQk8dHI+PHRoPk1ldGhvZAotCQk8dGg+RGVzY3JpcHRpb24KLQkJPHRoPlBhcmFtZXRlcihzKQotCQotCTx0cj48dGQ+Y3JlYXRlV2luZG93Q29udGVudHMKLQkJPHRkPkNyZWF0ZXMgdGhlIGNvbnRlbnRzIG9mIG9uZSB3aW5kb3cuCi0JCU92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGRlZmluZSBjdXN0b20gY29udGVudHMgYW5kIGxheW91dC4KLQkJPHRkPjxjb2RlPklXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyPC9jb2RlPiwKLQkJPGNvZGU+U2hlbGw8L2NvZGU+Ci0KLQk8dHI+PHRkPm9wZW5XaW5kb3dzCi0JCTx0ZD5PcGVuIGFsbCBXb3JrYmVuY2ggd2luZG93cyBvbiBzdGFydHVwLgotCQlUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmllcyB0byByZXN0b3JlIHRoZSBwcmV2aW91c2x5Ci0JCXNhdmVkIHdvcmtiZW5jaCBzdGF0ZS4KLQkJPHRkPiZuYnNwOwotCi08L3RhYmxlPgotCi0KLTxoMj5QcmVwYXJpbmcgZm9yIGludGVybmF0aW9uYWxpemF0aW9uPC9oMj4KLTxwPgotSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4gZm9yIHNob3J0KSBvcGVucwotdXAgeW91ciBhcHBsaWNhdGlvbiB0byBhIG11Y2ggd2lkZXIgbWFya2V0LgotVGhlIGZpcnN0IHN0ZXAgaXMgc2ltcGx5IHRvIHB1bGwgYWxsIHlvdXIgaHVtYW4gcmVhZGFibGUgdGV4dCBtZXNzYWdlcyBvdXQgb2YKLXlvdXIgY29kZSBhbmQgaW50byBhIHN0YW5kYXJkIGZvcm1hdCBwcm9wZXJ0aWVzIGZpbGUuCi1FdmVuIGlmIHlvdSBhcmUgbm90IHBsYW5uaW5nIHRvIG1ha2UgeW91ciBjb2RlIGF2YWlsYWJsZSBpbiBtdWx0aXBsZSBsYW5ndWFnZXMsCi1zZXBhcmF0aW5nIHRoZSBtZXNzYWdlcyBtYWtlcyBpdCBtdWNoIGVhc2llciBmb3IgeW91IHRvIHNwZWxsIGNoZWNrIHRoZW0gYW5kCi1jaGVjayB0aGVtIGZvciBjb25zaXN0ZW50IGdyYW1tYXIgYW5kIHdvcmQgdXNhZ2UuCi08L3A+Ci08cD4KLVRoZXJlJ3Mgbm90aGluZyBtYWdpYyBhYm91dCBtZXNzYWdlcyBpbiBFY2xpcHNlIC0geW91IGp1c3QKLXVzZSB0aGUgcGxhaW4gb2xkIEphdmEgcmVzb3VyY2UgYnVuZGxlIG1lY2hhbmlzbSB0aGF0IHlvdSBtYXkKLWFscmVhZHkgYmUgZmFtaWxpYXIgd2l0aC4KLVRoZSBFY2xpcHNlIElERSBwcm92aWRlcyBhIG5pY2UgRXh0ZXJuYWxpemF0aW9uIHdpemFyZCB0byBtYWtlCi10aGlzIGxlc3Mgb2YgYSBjaG9yZS4KLVNlZSB0aGUgcmVmZXJlbmNlcyBzZWN0aW9uIGJlbG93IGZvciBhIGxpbmsgdG8gYW4gYXJ0aWNsZQotdGhhdCBkZXNjcmliZXMgaG93IHRvIHVzZSBpdCBpbiBkZXRhaWwuCi08L3A+Ci08cD4KLUJyaWVmbHksIHdoZW4geW91J3JlIHdyaXRpbmcgYSBuZXcgc2VjdGlvbiBvZiBjb2RlCi15b3Ugd2lsbCBvZnRlbiBoYXJkLWNvZGUgc3RyaW5ncyBqdXN0IHRvIGdldCBzb21ldGhpbmcgZ29pbmcuCi1Gb3IgZXhhbXBsZSwgaW4gbGlzdGluZyAxIHdlIHVzZWQ6Ci08L3A+Ci08cHJlPgotCWNvbmZpZ3VyZXIuc2V0VGl0bGUoIkhlbGxvLCBSQ1AiKTsKLTwvcHJlPgotPHA+Ci1PbmNlIHlvdSBoYXZlIGEgc2VjdGlvbiBvZiBjb2RlIHdvcmtpbmcsIHRob3VnaCwgeW91IHNob3VsZCBnZXQgaW50byB0aGUgaGFiaXQKLW9mIGludm9raW5nIHRoZSBFeHRlcm5hbGl6YXRpb24gd2l6YXJkIHRvIHB1bGwgdGhlc2Ugc3RyaW5ncyBvdXQuCi1TaW1wbHkgcmlnaHQgY2xpY2sgb24gdGhlIHByb2plY3QgYW5kIHNlbGVjdAotPGI+U291cmNlID4gRmluZCBTdHJpbmdzIHRvIEV4dGVybmFsaXplLi4uPC9iPi4KLUFueSBzb3VyY2UgZmlsZXMgdGhhdCBuZWVkIGF0dGVudGlvbiB3aWxsIGJlIGxpc3RlZC4KLVBpY2sgb25lIGFuZCBwcmVzcyA8Yj5FeHRlcm5hbGl6ZS4uLjwvYj4gdG8gb3BlbiB0aGUgRXh0ZXJuYWxpemF0aW9uIHdpemFyZC4KLUZvbGxvdyB0aGUgZGlyZWN0aW9ucyB0aGVyZSB0byBoYXZlIHRoZSB3aXphcmQgY29udmVydCB5b3VyIGNvZGUgdG8KLXVzZSBhIHJlc291cmNlIGJ1bmRsZSByZWZlcmVuY2UuCi1BbHRlcm5hdGl2ZWx5IHlvdSBjb3VsZCByaWdodCBjbGljayBvbiBhIHNpbmdsZSBzb3VyY2UgZmlsZSBhbmQgc2VsZWN0Ci08Yj5Tb3VyY2UgPiBFeHRlcm5hbGl6ZSBTdHJpbmdzLi4uPC9iPi4KLVdoZW4geW91J3JlIGRvbmUgeW91ciBzb3VyY2UgY29kZSB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKLTwvcD4KLTxwcmU+Ci0JY29uZmlndXJlci5zZXRUaXRsZShNZXNzYWdlcy5nZXRTdHJpbmcoIkhlbGxvX1JDUCIpKTsgLy8kTk9OLU5MUy0xJAotPC9wcmU+Ci08cD4KLVRoZSBzdHJpbmcgPGNvZGU+JE5PTi1OTFMtMSQ8L2NvZGU+IGlzIGEgaGludCBmb3IgYm90aCB0aGUgY29tcGlsZXIgYW5kCi10aGUgRXh0ZXJuYWxpemF0aW9uIHdpemFyZCB0aGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgc3RyaW5nIG9uIHRoaXMgbGluZQotaXMgYSB0YWcgb3Iga2V5d29yZCBvZiBzb21lIHNvcnQgYW5kIHNob3VsZCBub3QgYmUgbG9jYWxpemVkLgotPC9wPgotPHA+Ci1BbHNvIHlvdSB3aWxsIGhhdmUgYSBzdGFuZGFyZCBmb3JtYXQgLnByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nCi10aGUga2V5cyBhbmQgdmFsdWVzIGZvciBhbGwgeW91ciBtZXNzYWdlcy4KLUluIHRoZSBleGFtcGxlIGNvZGUgeW91IHdpbGwgZmluZCBhIGZpbGUgY2FsbGVkIFJjcFR1dG9yaWFsLnByb3BlcnRpZXMKLXRoYXQgY29udGFpbnM6Ci0KLTwvcD4KLTxwcmU+Ci1IZWxsb19SQ1A9SGVsbG8sIFJDUAotPC9wcmU+Ci08cD4KLUZpbmFsbHksIHRoZSB3aXphcmQgd2lsbCBjcmVhdGUgYSBjbGFzcyB0aGF0IHdyYXBzIGEgSmF2YSByZXNvdXJjZSBidW5kbGUKLXRvIGxvYWQgYW5kIGZpbmQgdGhpbmdzIGluIHRoZSAucHJvcGVydGllcyBmaWxlLgotPC9wPgotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL3RpcC5naWYiIGFsdD0iVGlwOiAiIHdpZHRoPSI2MiIgaGVpZ2h0PSIxMyI+Ci1UbyBwZXJmb3JtIHN1YnN0aXR1dGlvbnMgdXNlIHRoZSBzdGFuZGFyZAotPGNvZGU+amF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ8L2NvZGU+IGNsYXNzLgotVGhlIDxjb2RlPmZvcm1hdCgpPC9jb2RlPiBtZXRob2QgaXMgc29tZXdoYXQgc2ltaWxhcgotdG8gdGhlIEMgcm91dGluZSA8Y29kZT5zcHJpbnRmPC9jb2RlPiwgZXhjZXB0Ci1pbnN0ZWFkIG9mIHRha2luZyBmb3JtYXQgc3BlY2lmaWVycyBzdGFydGluZyB3aXRoIHBlcmNlbnQgc2lnbnMsCi08Y29kZT5mb3JtYXQoKTwvY29kZT4gdXNlcyBudW1iZXJlZCBwYXJhbWV0ZXJzIGluIGN1cmx5IGJyYWNlcy4KLUhlcmUncyBhbiBleGFtcGxlIGZyb20gdGhlIDxjb2RlPlhNTFN0cnVjdHVyZUNyZWF0b3I8L2NvZGU+IGNsYXNzIGluIHRoZQotY29tcGFyZSBleGFtcGxlIHBsdWctaW4gKHNwbGl0IG9udG8gbXVsdGlwbGUgbGluZXMgZm9yIHJlYWRhYmlsaXR5KToKLTxwcmU+Ci0JYm9keW5vZGUuc2V0TmFtZShNZXNzYWdlRm9ybWF0LmZvcm1hdCgiezB9ICh7MX0pIiwKLQkJbmV3IFN0cmluZ1tdIHtYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxTdHJ1Y3R1cmVDcmVhdG9yLmJvZHkiKSwKLQkJSW50ZWdlci50b1N0cmluZyhmY3VycmVudFBhcmVudC5ib2RpZXMpfSkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLTwvcHJlPgotPHA+Ci1UaGlzIGlzbid0IGEgZ29vZCBleGFtcGxlLCB0aG91Z2gsIGJlY2F1c2UgdHlwaWNhbGx5IHRoZSBmb3JtYXQgc3RyaW5nCi1pdHNlbGYgc2hvdWxkIGJlIGluIGEgbWVzc2FnZSBmaWxlIHRvby4KLUhvd2V2ZXIsIG1lc3NhZ2VzIGludGVuZGVkIHRvIGJlIHJlYWQgYnkgYW5vdGhlciBwcm9ncmFtCi0oY29tbWFuZHMsIGtleXdvcmRzLCBzY3JpcHRzLCBhbmQgc28gZm9ydGgpIHNob3VsZAotPGI+bm90PC9iPiBiZSBwdXQgaW4gYSBtZXNzYWdlIGZpbGUuCi08L3A+Ci08cD4KLVRvIGtlZXAgdGhlc2UgbGluZXMgZnJvbSBnZXR0aW5nIGluY3JlZGlibHkgbG9uZyB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvCi1jcmVhdGUgaGVscGVyIG1ldGhvZHMuCi1Gb3IgZXhhbXBsZXMgb2YgaGVscGVyIG1ldGhvZHMgc2VlIDxjb2RlPm9yZy5lY2xpcHNlLmludGVybmFsLnJ1bnRpbWUuUG9saWN5PC9jb2RlPi4KLTwvcD4KLQotPGgyPkNvbmNsdXNpb248L2gyPgotPHA+Ci1JbiBwYXJ0IDIgb2YgdGhpcyB0dXRvcmlhbCwgd2UgbG9va2VkIGF0IHNvbWUgb2YgdGhlIG5ld2x5IHJlZmFjdG9yZWQgQVBJCi1vZiB0aGUgUmljaCBDbGllbnQgUGxhdGZvcm0gdGhhdCBhbGxvd3MgeW91IHRvIGRldmVsb3AgY3VzdG9taXplZAotbmF0aXZlLWxvb2tpbmcgY2xpZW50LXNpZGUgSmF2YSBwcm9ncmFtcy4KLVRoZSBuZXh0IHBhcnQgd2lsbCBkZWx2ZSBpbnRvIGRlZmluaW5nIGFuZCBwb3B1bGF0aW5nIG1lbnVzIGFuZCB0b29sYmFycy4KLUFsbCB0aGUgc2FtcGxlIGNvZGUgZm9yIHRoaXMgcGFydCBtYXkgYmUgdmlld2VkIGF0IHRoZQotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyIj5FY2xpcHNlIHByb2plY3QgaGVyZTwvYT4uCi1Zb3UgY2FuIHVzZQotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9jdnNob3d0by5odG1sIj5FY2xpcHNlJ3MgYnVpbHQtaW4gQ1ZTIGNsaWVudDwvYT4KLXRvIGRvd25sb2FkIHRoZSBzb3VyY2UgdG8geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci0KLTxoMj5SZWZlcmVuY2VzPC9oMj4KLTxwPgotPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtUkNQLTEvdHV0b3JpYWwxLmh0bWwiPgotUkNQIFR1dG9yaWFsIFBhcnQgMTwvYT48YnI+Ci08YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1SQ1AtMy90dXRvcmlhbDMuaHRtbCI+Ci1SQ1AgVHV0b3JpYWwgUGFydCAzPC9hPjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0UvcGxhdGZvcm0tdWktaG9tZS9yY3AvaW5kZXguaHRtbCI+Ci1FY2xpcHNlIFJpY2ggQ2xpZW50IFBsYXRmb3JtPC9hPjxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1JbnRlcm5hdGlvbmFsaXphdGlvbi9ob3cySTE4bi5odG1sIj4KLUhvdyB0byBJbnRlcm5hdGlvbmFsaXplIHlvdXIgRWNsaXBzZSBQbHVnLWluPC9hPjxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZmF3Y2V0dGUuY29tL2phdmFwcm8vMjAwMl8wNi9vbmxpbmUvc2VydmxldHNfMDZfMTFfMDIvIj5BbG1vc3QgQWxsIEphdmEgV2ViIEFwcHMgTmVlZCBNb2RlbCAyCi0oaW50cm9kdWN0aW9uIHRvIHRoZSBNb2RlbCAyIGFyY2hpdGVjdHVyZSk8L2E+PGJyPgotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlL2RldmVsb3BtZW50L2phdmEtYXBpLWV2b2x1dGlvbi5odG1sIj4KLUV2b2x2aW5nIEphdmEtYmFzZWQgQVBJczwvYT48YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Vwb3dlcmVkLm9yZyI+Ci1FY2xpcHNlIFBvd2VyZWQgKHJpY2ggY2xpZW50IHBsdWctaW5zIGFuZCByZXNvdXJjZXMpPC9hPjxicj4KLTwvcD4KLQotPHA+PHNtYWxsPklCTSBpcyB0cmFkZW1hcmsgb2YgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBpbiB0aGUKLVVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFuZCBsb2dvcyBhcmUgdHJhZGVtYXJrcyBvcgotcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyCi1jb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08cD48c21hbGw+TWljcm9zb2Z0IGFuZCBXaW5kb3dzIGFyZSB0cmFkZW1hcmtzIG9mIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiBpbiB0aGUKLVVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTxwPjxzbWFsbD5PdGhlciBjb21wYW55LCBwcm9kdWN0LCBhbmQgc2VydmljZSBuYW1lcyBtYXkgYmUgdHJhZGVtYXJrcyBvciBzZXJ2aWNlCi1tYXJrcyBvZiBvdGhlcnMuPC9zbWFsbD48L3A+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVmMmQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGx1Z2luTmFtZSA9IFJjcFR1dG9yaWFsMiBQbHVnLWluCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGVyc3BlY3RpdmVOYW1lID0gUmNwVHV0b3JpYWwyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4YTk5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MiIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMC4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwYXJ0Mi5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IlJjcEFwcGxpY2F0aW9uIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPgotICAgICAgPGFwcGxpY2F0aW9uPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIuUmNwQXBwbGljYXRpb24iPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzIj4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgbmFtZT0iJXBlcnNwZWN0aXZlTmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyLlJjcFBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIuUmNwUGVyc3BlY3RpdmUiPgotICAgICAgPC9wZXJzcGVjdGl2ZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9yY3B0dXRvcmlhbDIuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3JjcHR1dG9yaWFsMi5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYzI0MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3JjcHR1dG9yaWFsMi5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWVjaG8gb24KLXNldGxvY2FsCi1jZCAlfmRwMAotc3RhcnQgamF2YXcgLWNwIHN0YXJ0dXAuamFyIG9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIuTWFpbiAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi5SY3BBcHBsaWNhdGlvbiAlKgotZW5kbG9jYWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9yY3B0dXRvcmlhbDJkZWJ1Zy5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvcmNwdHV0b3JpYWwyZGVidWcuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODAzMWMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9yY3B0dXRvcmlhbDJkZWJ1Zy5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWVjaG8gb24KLXNldGxvY2FsCi1jZCAlfmRwMAotamF2YSAtY3Agc3RhcnR1cC5qYXIgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5NYWluIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyLlJjcEFwcGxpY2F0aW9uIC1jb25zb2xlTG9nICUqIHx8IHBhdXNlCi1lbmRsb2NhbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQyL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDIvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxMWY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDIvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAzMSwgMjAwMwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNhc2ViYgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDIuUmNwVHV0b3JpYWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPQotCQlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0Mi9SY3BBcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQyL1JjcEFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2NmMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQyL1JjcEFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsYXRmb3JtUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3I7Ci0KLXB1YmxpYyBjbGFzcyBSY3BBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElQbGF0Zm9ybVJ1bm5hYmxlIHsKLQotICAgIHB1YmxpYyBPYmplY3QgcnVuKE9iamVjdCBhcmdzKSB7Ci0gICAgICAgIFdvcmtiZW5jaEFkdmlzb3Igd29ya2JlbmNoQWR2aXNvciA9IG5ldyBSY3BXb3JrYmVuY2hBZHZpc29yKCk7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuY3JlYXRlRGlzcGxheSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICB3b3JrYmVuY2hBZHZpc29yKTsKLSAgICAgICAgICAgIGlmIChyZXR1cm5Db2RlID09IFBsYXRmb3JtVUkuUkVUVVJOX1JFU1RBUlQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSVBsYXRmb3JtUnVubmFibGUuRVhJVF9SRVNUQVJUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0Mi9SY3BQZXJzcGVjdGl2ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQyL1JjcFBlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDRlNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQyL1JjcFBlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUmNwUGVyc3BlY3RpdmUgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotCXB1YmxpYyBSY3BQZXJzcGVjdGl2ZSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0Mi9SY3BUdXRvcmlhbC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQyL1JjcFR1dG9yaWFsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZGU3MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQyL1JjcFR1dG9yaWFsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1IZWxsb19SQ1A9SGVsbG8sIFJDUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQyL1JjcFdvcmtiZW5jaEFkdmlzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0Mi9SY3BXb3JrYmVuY2hBZHZpc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZTQzZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQyL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQyL1JjcFdvcmtiZW5jaEFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvcjsKLQotcHVibGljIGNsYXNzIFJjcFdvcmtiZW5jaEFkdmlzb3IgZXh0ZW5kcyBXb3JrYmVuY2hBZHZpc29yIHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbFdpbmRvd1BlcnNwZWN0aXZlSWQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0Mi5SY3BQZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmVXaW5kb3dPcGVuKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQkJc3VwZXIucHJlV2luZG93T3Blbihjb25maWd1cmVyKTsKLSAgICAgICAgY29uZmlndXJlci5zZXRJbml0aWFsU2l6ZShuZXcgUG9pbnQoNDAwLCAzMDApKTsKLSAgICAgICAgY29uZmlndXJlci5zZXRTaG93Q29vbEJhcihmYWxzZSk7Ci0gICAgICAgIGNvbmZpZ3VyZXIuc2V0U2hvd1N0YXR1c0xpbmUoZmFsc2UpOwotCQljb25maWd1cmVyLnNldFRpdGxlKE1lc3NhZ2VzLmdldFN0cmluZygiSGVsbG9fUkNQIikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYwNjEyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9SdW4gUmNwVHV0b3JpYWwzLmxuayBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9SdW4gUmNwVHV0b3JpYWwzLmxuawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkZjg4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvUnVuIFJjcFR1dG9yaWFsMy5sbmsKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvYm9vay54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvYm9vay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWQzNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2Jvb2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08dG9jIGxhYmVsPSJSQ1AgSGVscCBTYW1wbGUiICB0b3BpYz0iaHRtbC9ib29rLmh0bWwiPgotCTx0b3BpYyBsYWJlbD0iT3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iVHV0b3JpYWwiIGhyZWY9Imh0bWwvdHV0b3JpYWwzLmh0bWwiLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjA0M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgcGFydDMuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGJvb2sueG1sLFwKLSAgICAgICAgICAgICAgIGh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLwotc291cmNlLnBhcnQzLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2Jvb2suaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2Jvb2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3ZmNlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9ib29rLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5Cb29rLmh0bWwgZ29lcyBoZXJlPC9oMT4KLTwvYm9keT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9kZWZhdWx0X3N0eWxlLmNzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2RlZmF1bHRfc3R5bGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzY1ZjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2RlZmF1bHRfc3R5bGUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcCwgdGFibGUsIHRkLCB0aCB7ICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDEwcHR9Ci1wcmUgeyAgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm87IGZvbnQtc2l6ZTogMTBwdDsgYmFja2dyb3VuZDogI0VFRUVFRTt9Ci1oMiB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMThwdDsgZm9udC13ZWlnaHQ6IGJvbGQgOyBsaW5lLWhlaWdodDogMTRweH0KLWNvZGUgeyAgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm87IGZvbnQtc2l6ZTogMTBwdH0KLXN1cCB7ICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhLGdlbmV2YTsgZm9udC1zaXplOiAxMHB4fQotaDMgeyAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZH0KLWxpIHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdH0KLWgxIHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMjhweDsgZm9udC13ZWlnaHQ6IGJvbGR9Ci1ib2R5IHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdDsgY2xpcDogICByZWN0KCAgICk7IG1hcmdpbi10b3A6IDVtbTsgbWFyZ2luLWxlZnQ6IDNtbX0KLS5pbmRleHRvcCB7IGZvbnQtc2l6ZTogeC1sYXJnZTs7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogYm9sZH0KLS5pbmRleHN1YiB7IGZvbnQtc2l6ZTogeHgtc21hbGw7OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6ICM4MDgwRkZ9Ci1hLmJhcjpsaW5rIHsgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6ICNGRkZGRkZ9Ci1hLmJhcjp2aXNpdGVkIHsgIGNvbG9yOiAjRkZGRkZGOyB0ZXh0LWRlY29yYXRpb246IG5vbmV9Ci1hLmJhcjpob3ZlciB7ICBjb2xvcjogI0ZGRkZGRjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmV9Ci1hLmJhciB7ICBjb2xvcjogI0ZGRkZGRn0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy9JZGVhLmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy9JZGVhLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5Y2U3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9pbWFnZXMvSWRlYS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9pbWFnZXMvY29tcGxldGUucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2h0bWwvaW1hZ2VzL2NvbXBsZXRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzMzQ1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9pbWFnZXMvY29tcGxldGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2h0bWwvaW1hZ2VzL2hlbHAucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2h0bWwvaW1hZ2VzL2hlbHAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2I0ZmE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy9oZWxwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy9ub3RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy9ub3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYyNjBkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9pbWFnZXMvbm90ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9pbWFnZXMvdGFnXzEuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2h0bWwvaW1hZ2VzL3RhZ18xLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1OWQ2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9pbWFnZXMvdGFnXzEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2h0bWwvaW1hZ2VzL3RhZ18yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy90YWdfMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYTQzZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2h0bWwvaW1hZ2VzL3RhZ18yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy90YWdfMy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9pbWFnZXMvdGFnXzMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjliNjhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy90YWdfMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9pbWFnZXMvdGFnXzQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2h0bWwvaW1hZ2VzL3RhZ180LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhZDYzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9pbWFnZXMvdGFnXzQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2h0bWwvaW1hZ2VzL3RhZ181LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy90YWdfNS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmE3NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2h0bWwvaW1hZ2VzL3RhZ181LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy90YWdfNi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9pbWFnZXMvdGFnXzYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWViNGVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy90YWdfNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC9pbWFnZXMvdGlwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy90aXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2IyNDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL2ltYWdlcy90aXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2h0bWwvb3ZlcnZpZXcuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MTI5Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL2h0bWwvb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTwvaGVhZD4KLTxib2R5PgotPGgxPk92ZXJ2aWV3Lmh0bWwgZ29lcyBoZXJlPC9oMT4KLTwvYm9keT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaHRtbC90dXRvcmlhbDMuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL3R1dG9yaWFsMy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDY4N2JiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9odG1sL3R1dG9yaWFsMy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci0KLTxoZWFkPgotPHRpdGxlPlJpY2ggQ2xpZW50IFBsYXRmb3JtPC90aXRsZT4KLTxsaW5rIGhyZWY9ImRlZmF1bHRfc3R5bGUuY3NzIiByZWw9c3R5bGVzaGVldD4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxkaXYgYWxpZ249InJpZ2h0Ij4KLSAgPGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuLCBUaW1lcywgc2VyaWYiIHNpemU9IjIiPkNvcHlyaWdodCCpIDIwMDQgRWQKLSAgQnVybmV0dGUuPC9mb250PgotICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICA8dGJvZHk+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGNvbHNwYW49IjIiIGJnY29sb3I9IiMwMDgwYzAiPjxiPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkVjbGlwc2UKLSAgICAgICAgICBBcnRpY2xlPC9mb250PjwvZm9udD48L2I+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90Ym9keT4KLSAgPC90YWJsZT4KLTwvZGl2PgotPGRpdiBhbGlnbj0ibGVmdCI+Ci0gIDxoMSB0aXRsZT0iUkNQIFR1dG9yaWFsIj48aW1nIHNyYz0iaW1hZ2VzL0lkZWEuanBnIiBhbGlnbj0ibWlkZGxlIiB3aWR0aD0iMTIwIiBoZWlnaHQ9Ijg2Ij48L2gxPgotPC9kaXY+Ci08aDEgYWxpZ249ImNlbnRlciI+UmljaCBDbGllbnQgVHV0b3JpYWwgUGFydCAzPC9oMT4KLTxwIGNsYXNzPSJzdW1tYXJ5Ij4KLVRoZSBSaWNoIENsaWVudCBQbGF0Zm9ybSAoUkNQKQotbGV0cyB5b3UgcGljayBhbmQgY2hvb3NlIGZ1bmN0aW9uYWxpdHkgZnJvbSBFY2xpcHNlCi1mb3IgdXNlIGluIHlvdXIgb3duIGFwcGxpY2F0aW9ucy4KLVBhcnRzIDEgYW5kIDIgb2YgdGhpcyB0dXRvcmlhbCBpbnRyb2R1Y2VkIHlvdSB0byB0aGUgcGxhdGZvcm0KLWFuZCBzb21lIG9mIHRoZSBjb25maWd1cmF0aW9uIGNsYXNzZXMgaXQgcHJvdmlkZXMuCi1QYXJ0IDMgZGlzY3Vzc2VzIGhvdyB0byBhZGQKLWZ1bmN0aW9uYWxpdHkgc3VjaCBhcyBtZW51cywgdmlld3MsIGFuZCBoZWxwIGZpbGVzLgotPC9wPgotPHA+PGI+QnkgRWQgQnVybmV0dGUsIFNBUzwvYj48YnI+Ci08Zm9udCBzaXplPSItMSI+SnVseSAyOCwgMjAwNDwvZm9udD48L3A+Ci08aHIgd2lkdGg9IjEwMCUiPgotCi08aDI+SW50cm9kdWN0aW9uPC9oMj4KLTxwPgotTXVjaCBvZiBvdXIgZGlzY3Vzc2lvbiBpbiB0aGUgcHJldmlvdXMKLXR3byBwYXJ0cyBmb2N1c2VkIG9uIHRha2luZyB0aGluZ3MgYXdheSBmcm9tCi10aGUgcGxhdGZvcm0gLSB0dXJuaW5nIG9mZiB0b29sYmFycywgZ2V0dGluZwotcmlkIG9mIG1lbnVzLCBhbmQgc28gZm9ydGguCi1Gb3IgdGhpcyBpbnN0YWxsbWVudCB3ZSdyZSBnb2luZyB0byBsb29rIGF0IHB1dHRpbmcgdGhpbmdzIGJhY2sgaW4uCi1BbGwgc291cmNlIGNvZGUgZm9yIHRoZSB0dXRvcmlhbCAKLWNhbiBiZSBkb3dubG9hZGVkIGZyb20gdGhlCi08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMiPkVjbGlwc2UgcHJvamVjdCBoZXJlPC9hPi4KLTwvcD4KLQotPGgyPlZpZXdzPC9oMj4KLTxwPgotTGV0J3Mgc3RhcnQgd2l0aCBhIHZpZXcuCi1FY2xpcHNlJ3MgUGx1Zy1pbiBEZXZlbG9wbWVudCBFbnZpcm9ubWVudAotcHJvdmlkZXMgYSBuaWNlIHNldCBvZiBleHRlbnNpb24gdGVtcGxhdGVzIHRvIGdldCB5b3Ugc3RhcnRlZCB3cml0aW5nCi1zYW1wbGUgdmlld3MsIGVkaXRvcnMsIG1lbnVzLAotYW5kIG90aGVyIGNvbXBvbmVudHMuCi1VbmZvcnR1bmF0ZWx5LCBhcyBvZiB0aGlzIHdyaXRpbmcsIHRoZXkgYXJlIGFsbW9zdCB1c2VsZXNzIGZvcgotUkNQIGRldmVsb3BtZW50IGJlY2F1c2UgdGhlIGNvZGUgcHJvZHVjZWQgaW50cm9kdWNlcyBhbGwKLXNvcnRzIG9mIGRlcGVuZGVuY2llcyBvbiBJREUgYW5kIHJlc291cmNlIHBhY2thZ2VzCi1hbmQgcGx1Zy1pbnMuCi08L3A+Ci08cD4KLTxpbWcgc3JjPSJpbWFnZXMvdGlwLmdpZiIgYWx0PSJUaXA6ICIgd2lkdGg9IjYyIiBoZWlnaHQ9IjEzIj4KLVRoZSBydWxlIG9mIHRodW1iIGlzIHRoYXQgYW55dGhpbmcgdGhhdCByZWZlcmVuY2VzIGEgcmVzb3VyY2UgaXMKLW5vdCBpbnRlbmRlZCBmb3IgUkNQIGRldmVsb3BlcnMgYmVjYXVzZSBvZiB0aGUgZXh0cmEgY29kZQotYW5kIGRlcGVuZGVuY2llcyBvbiB3b3Jrc3BhY2VzIGl0Ci1wdWxscyBpbi4KLVNvIGlmIHlvdSBzZWUgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzPC9jb2RlPgotcGx1Zy1pbiBpbiB5b3VyIGRlcGVuZGVuY3kgbGlzdCwgb3Igc2VlIGFuIGltcG9ydCBmb3IKLXNvbWUgY2xhc3MgZnJvbSB0aGF0IHBhY2thZ2UsIHlvdSdyZSBwcm9iYWJseSBkb2luZyBzb21ldGhpbmcgd3JvbmcuCi1UaGlzIGlzIG5vdCBhIGhhcmQgYW5kIGZhc3QgcnVsZSB0aG91Z2gsIHNvCi1yZXNvdXJjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYW4gPGk+b3B0aW9uYWw8L2k+Ci1wYXJ0IG9mIHRoZSBSaWNoIENsaWVudCBQbGF0Zm9ybS4KLTwvcD4KLTxwPgotVG8gY3JlYXRlIGEgdmlldyB3aXRob3V0IHRoZSB0ZW1wbGF0ZXMsIHlvdSBjYW4KLXVzZSB0aGUgc2NoZW1hLWJhc2VkIGV4dGVuc2lvbiB3aXphcmRzIGZyb20gdGhlCi1QbHVnLWluIE1hbmlmZXN0IGVkaXRvciAoRXh0ZW5zaW9ucyBwYW5lID4gQWRkID4gR2VuZXJpYyBXaXphcmRzID4gU2NoZW1hLWJhc2VkCi1FeHRlbnNpb25zKSBvciBzaW1wbHkgZWRpdCB0aGUgWE1MIGluIHRoZSBTb3VyY2UgcGFuZS4KLUVpdGhlciB3YXksIHlvdSB3YW50IHRvIGVuZCB1cCB3aXRoIGV4dGVuc2lvbiBYTUwgbGlrZSB0aGlzOgotPC9wPgotPHByZT4KLQkmbHQ7ZXh0ZW5zaW9uCi0JICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIiZndDsKLQkgICAmbHQ7Y2F0ZWdvcnkKLQkgICAgICAgICBuYW1lPSJTYW1wbGVDYXRlZ29yeSIKLTxpbWcgc3JjPSJpbWFnZXMvdGFnXzEuZ2lmIiBoZWlnaHQ9IjEzIiB3aWR0aD0iMjQiIGFsaWduPSJjZW50ZXIiIGFsdD0iIzEiPgkgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My52aWV3Q2F0ZWdvcnkiJmd0OwotCSAgICZsdDsvY2F0ZWdvcnkmZ3Q7Ci0JICAgJmx0O3ZpZXcKLQkgICAgICAgICBuYW1lPSJTYW1wbGUiCi0JICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKLQkgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My52aWV3Q2F0ZWdvcnkiCi08aW1nIHNyYz0iaW1hZ2VzL3RhZ18yLmdpZiIgaGVpZ2h0PSIxMyIgd2lkdGg9IjI0IiBhbGlnbj0iY2VudGVyIiBhbHQ9IiMyIj4JICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMudmlld3MuU2FtcGxlVmlldyIKLQkgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My52aWV3cy5TYW1wbGVWaWV3IiZndDsKLQkgICAmbHQ7L3ZpZXcmZ3Q7Ci0JJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTxwPgotVGhlIHZpZXcgY2F0ZWdvcnkgKDxpbWcgc3JjPSJpbWFnZXMvdGFnXzEuZ2lmIiBoZWlnaHQ9IjEzIiB3aWR0aD0iMjQiIGFsaWduPSJjZW50ZXIiIGFsdD0iIzEiPikKLWlzIGEgd2F5IHRvIG9yZ2FuaXplIHlvdXIgdmlld3MgaW4gdGhlCi1TaG93IFZpZXdzIGRpYWxvZy4KLVRoZSBjbGFzcyAoPGltZyBzcmM9ImltYWdlcy90YWdfMi5naWYiIGhlaWdodD0iMTMiIHdpZHRoPSIyNCIgYWxpZ249ImNlbnRlciIgYWx0PSIjMiI+KQotZXh0ZW5kcyB0aGUgPGNvZGU+Vmlld1BhcnQ8L2NvZGU+IGFic3RyYWN0IGNsYXNzIGFzIHNob3duIGJlbG93OgotPC9wPgotCi08cHJlPgotCXB1YmxpYyBjbGFzcyBTYW1wbGVWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotPGltZyBzcmM9ImltYWdlcy90YWdfMS5naWYiIGhlaWdodD0iMTMiIHdpZHRoPSIyNCIgYWxpZ249ImNlbnRlciIgYWx0PSIjMSI+CSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9WSUVXID0KLQkgICAgICAgICJvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzLnZpZXdzLlNhbXBsZVZpZXciOyAvLyROT04tTkxTLTEkCi0JCi0JICAgIHByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotCQotCSAgICBwdWJsaWMgU2FtcGxlVmlldygpIHsKLQkgICAgfQotCQotPGltZyBzcmM9ImltYWdlcy90YWdfMi5naWYiIGhlaWdodD0iMTMiIHdpZHRoPSIyNCIgYWxpZ249ImNlbnRlciIgYWx0PSIjMiI+CSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JICAgICAgICB2aWV3ZXIgPQotCSAgICAgICAgICAgIG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JICAgICAgICB2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWaWV3Q29udGVudFByb3ZpZGVyKCkpOwotCSAgICAgICAgdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFZpZXdMYWJlbFByb3ZpZGVyKCkpOwotCSAgICAgICAgdmlld2VyLnNldElucHV0KHRoaXMpOwotCSAgICB9Ci0JCi0JICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCSAgICB9Ci0JfQotPC9wcmU+Ci08cD4KLURlZmluaW5nIGNvbnN0YW50cyB0aGF0IHN0YXJ0IHdpdGggPGNvZGU+SURfPC9jb2RlPgotKDxpbWcgc3JjPSJpbWFnZXMvdGFnXzEuZ2lmIiBoZWlnaHQ9IjEzIiB3aWR0aD0iMjQiIGFsaWduPSJjZW50ZXIiIGFsdD0iIzEiPikKLWlzIGEgcGF0dGVybiB5b3UnbGwgc2VlCi11c2VkIG92ZXIgYW5kIG92ZXIgYWdhaW4gaW4gdGhlIEVjbGlwc2Ugc291cmNlIGNvZGUuCi1IZXJlIHdlIHVzZSBpdCB0byBkdXBsaWNhdGUgdGhlIHNhbWUgaWQgdXNlZCBpbiB0aGUKLXBsdWctaW4gbWFuaWZlc3QuCi1UaGlzIHdpbGwgYmUgdXNlZCBsYXRlciB3aGVuIHdlIG5lZWQgYSByZWZlcmVuY2UgdG8gdGhlIHZpZXcuCi08L3A+Ci08cD4KLVRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIHRoaXMgY2xhc3MgaXMgdGhlIDxjb2RlPmNyZWF0ZVBhcnRDb250cm9sPC9jb2RlPiBtZXRob2QKLSg8aW1nIHNyYz0iaW1hZ2VzL3RhZ18yLmdpZiIgaGVpZ2h0PSIxMyIgd2lkdGg9IjI0IiBhbGlnbj0iY2VudGVyIiBhbHQ9IiMyIj4pLgotSXQncyB3aGVyZSB5b3UgY3JlYXRlIHlvdXIgSkZhY2Ugb3IgU1dUIGNvbnRyb2xzIHRoYXQgbWFrZQotdXAgdGhlIHZpZXcuCi1UaGUgcmVzdCBvZiB0aGUgc291cmNlIHdhcyBjYW4gYmUgZm91bmQgaW4gdGhlIGV4YW1wbGUgcHJvamVjdC4KLVZpZXcgcHJvZ3JhbW1pbmcgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIHR1dG9yaWFsCi1idXQgeW91IGNhbiBzZWUgdGhlIHJlZmVyZW5jZSBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgotPC9wPgotCi08aDI+UGVyc3BlY3RpdmUgYWRkaXRpb25zPC9oMj4KLTxwPgotSWYgeW91IHJ1biB0aGUgY29kZSBub3cgeW91IHdvbid0IGFjdHVhbGx5IHNlZSBhbnl0aGluZyBkaWZmZXJlbnQuCi1XaHk/IEJlY2F1c2UgeW91ciBuZXcgdmlldyBjYW4ndCBhcHBlYXIgdW5sZXNzIGl0IGlzIGFkZGVkCi10byB0aGUgY3VycmVudCBwZXJzcGVjdGl2ZS4KLVlvdSBjYW4gZG8gdGhpcyB0aHJvdWdoIGNvZGUgb3IgdGhvdWdoIHRoZSBvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMKLWV4dGVuc2lvbi4KLVdlJ2xsIGNob29zZSB0aGUgZm9ybWVyIGJlY2F1c2UgaXQncyBhIGxpdHRsZSBtb3JlIGZsZXhpYmxlLgotVG8gZG8gdGhpcywgZ28gYmFjayB0byB0aGUgPGNvZGU+UmNwUGVyc3BlY3RpdmU8L2NvZGU+IGNsYXNzCi1kZWZpbmVkIGVhcmxpZXIgYW5kIG1vZGlmeSBpdCB0byBsb29rIGxpa2UgdGhpczoKLTwvcD4KLQotPHByZT4KLQlwdWJsaWMgY2xhc3MgUmNwUGVyc3BlY3RpdmUgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLTxpbWcgc3JjPSJpbWFnZXMvdGFnXzEuZ2lmIiBoZWlnaHQ9IjEzIiB3aWR0aD0iMjQiIGFsaWduPSJjZW50ZXIiIGFsdD0iIzEiPgkgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfUEVSU1BFQ1RJVkUgPQotCSAgICAgICAgIm9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMuUmNwUGVyc3BlY3RpdmUiOyAvLyROT04tTkxTLTEkCi0JCi0JICAgIHB1YmxpYyBSY3BQZXJzcGVjdGl2ZSgpIHsKLQkgICAgfQotCQotCSAgICBwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotPGltZyBzcmM9ImltYWdlcy90YWdfMi5naWYiIGhlaWdodD0iMTMiIHdpZHRoPSIyNCIgYWxpZ249ImNlbnRlciIgYWx0PSIjMiI+CSAgICAgICAgbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKGZhbHNlKTsKLTxpbWcgc3JjPSJpbWFnZXMvdGFnXzMuZ2lmIiBoZWlnaHQ9IjEzIiB3aWR0aD0iMjQiIGFsaWduPSJjZW50ZXIiIGFsdD0iIzMiPgkgICAgICAgIGxheW91dC5hZGRWaWV3KAotCSAgICAgICAgICAgIFNhbXBsZVZpZXcuSURfVklFVywKLQkgICAgICAgICAgICBJUGFnZUxheW91dC5UT1AsCi0JICAgICAgICAgICAgSVBhZ2VMYXlvdXQuUkFUSU9fTUFYLAotCSAgICAgICAgICAgIElQYWdlTGF5b3V0LklEX0VESVRPUl9BUkVBKTsKLTxpbWcgc3JjPSJpbWFnZXMvdGFnXzQuZ2lmIiBoZWlnaHQ9IjEzIiB3aWR0aD0iMjQiIGFsaWduPSJjZW50ZXIiIGFsdD0iIzQiPgkgICAgICAgIGxheW91dC5hZGRQZXJzcGVjdGl2ZVNob3J0Y3V0KElEX1BFUlNQRUNUSVZFKTsKLTxpbWcgc3JjPSJpbWFnZXMvdGFnXzUuZ2lmIiBoZWlnaHQ9IjEzIiB3aWR0aD0iMjQiIGFsaWduPSJjZW50ZXIiIGFsdD0iIzUiPgkgICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KFNhbXBsZVZpZXcuSURfVklFVyk7Ci0JICAgIH0KLQl9Ci08L3ByZT4KLTxwPgotTm90ZXM6Ci08L3A+Ci08dGFibGUgYm9yZGVyPSIwIj4KLTx0ciB2YWxpZ249InRvcCI+PHRkPjxpbWcgc3JjPSJpbWFnZXMvdGFnXzEuZ2lmIiBoZWlnaHQ9IjEzIiB3aWR0aD0iMjQiIGFsaWduPSJjZW50ZXIiIGFsdD0iIzEiPgotPHRkPkFnYWluLCBqdXN0IGdldCBpbiB0aGUgaGFiaXQgb2YKLWRlZmluaW5nIGEgY29uc3RhbnQgZm9yIGFsbCBzdHJpbmdzLCBlc3BlY2lhbGx5IGlkcy4KLTx0ciB2YWxpZ249InRvcCI+PHRkPjxpbWcgc3JjPSJpbWFnZXMvdGFnXzIuZ2lmIiBoZWlnaHQ9IjEzIiB3aWR0aD0iMjQiIGFsaWduPSJjZW50ZXIiIGFsdD0iIzIiPgotPHRkPlRoZSBQbGF0Zm9ybSBzdXBwb3J0cyBlZGl0b3JzIGJ1dCB3ZSdyZSBub3QgdXNpbmcKLW9uZSBmb3IgdGhpcyBleGFtcGxlLiBUaGVyZWZvcmUgeW91IG5lZWQgdG8gdHVybiBvZmYgdGhlCi1lZGl0b3IgYXJlYSBzbyB5b3Ugd29uJ3QgaGF2ZSBhIGJpZyBibGFuayBzcGFjZSBpbiB0aGUgbWlkZGxlCi1vZiB5b3VyIFdvcmtiZW5jaCBXaW5kb3cuCi08dHIgdmFsaWduPSJ0b3AiPjx0ZD48aW1nIHNyYz0iaW1hZ2VzL3RhZ18zLmdpZiIgaGVpZ2h0PSIxMyIgd2lkdGg9IjI0IiBhbGlnbj0iY2VudGVyIiBhbHQ9IiMzIj4KLTx0ZD5UaGlzIGlzIHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIHRoZSBjbGFzcy4KLUl0IGFkZHMgdGhlIHZpZXcgdG8gdGhlIHBlcnNwZWN0aXZlIHNvIGl0IHdpbGwgYmUgdmlzaWJsZSBieSBkZWZhdWx0LgotVGhlIHBvc2l0aW9uaW5nIHBhcmFtZXRlcnMgc2F5IHRvIHBsYWNlIHRoaXMgdmlldyBhYm92ZSB0aGUKLWVkaXRvciBhcmVhIGFuZCBsZXQgaXQgdGFrZSAxMDAlIG9mIHRoZSBXb3JrYmVuY2ggV2luZG93LgotVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBzdHJhbmdlIHNpbmNlIHdlIGRvbid0IGhhdmUgYW4gZWRpdG9yIGFyZWEgYnV0Ci1pdCdzIGx1cmtpbmcgYXJvdW5kIHNvbWV3aGVyZSBldmVuIGlmIGl0J3MgaW52aXNpYmxlLgotQXMgeW91IGFkZCBtb3JlIHRoYW4gb25lIHZpZXcgdG8geW91ciBhcHBsaWNhdGlvbiB5b3UgY2FuCi1kZWZpbmUgdGhlIGRlZmF1bHQgc3RhY2tpbmcgYW5kIGxheW91dCBvZiB5b3VyIHZpZXdzIGhlcmUuCi08dHIgdmFsaWduPSJ0b3AiPjx0ZD48aW1nIHNyYz0iaW1hZ2VzL3RhZ180LmdpZiIgaGVpZ2h0PSIxMyIgd2lkdGg9IjI0IiBhbGlnbj0iY2VudGVyIiBhbHQ9IiM0Ij4KLTx0ZD5UaGlzIG1ldGhvZCBjYXVzZXMgdGhlIHBlcnNwZWN0aXZlIHRvIGJlCi1vbiB0aGUgc2hvcnQgbGlzdCBpZiB5b3UgaW1wbGVtZW50IHRoZSA8Y29kZT5QRVJTUEVDVElWRVNfU0hPUlRMSVNUPC9jb2RlPgotbWVudSBpdGVtIChzZWUgdGhlIHNhbXBsZSBjb2RlIGZvciBhbiBleGFtcGxlKS4KLVdpdGhvdXQgaXQsIHRoZSBwZXJzcGVjdGl2ZSB3aWxsIG9ubHkgYmUgb24gdGhlIGxvbmcgbGlzdCBzZWVuCi13aGVuIHRoZSB1c2VyIHNlbGVjdHMgV2luZG93ID4gT3BlbiBQZXJzcGVjdGl2ZSA+IE90aGVyIChvciB3aGF0ZXZlcgotdGhlIGVxdWl2YWxlbnQgbWVudSBwYXRoIGlzIGluIHlvdXIgYXBwbGljYXRpb24pLgotPHRyIHZhbGlnbj0idG9wIj48dGQ+PGltZyBzcmM9ImltYWdlcy90YWdfNS5naWYiIGhlaWdodD0iMTMiIHdpZHRoPSIyNCIgYWxpZ249ImNlbnRlciIgYWx0PSIjNSI+Ci08dGQ+U2FtZSB0aGluZywgb25seSBmb3Igdmlld3MuCi08L3RhYmxlPgotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL3RpcC5naWYiIGFsdD0iVGlwOiAiIHdpZHRoPSI2MiIgaGVpZ2h0PSIxMyI+Ci1UbyByZW1lbWJlciB0aGUgdXNlcidzIGxheW91dCBhbmQgd2luZG93IHNpemVzCi1mb3IgdGhlIG5leHQgdGltZSB0aGV5IHN0YXJ0IHlvdXIgYXBwbGljYXRpb24sIGFkZAotPGNvZGU+Y29uZmlndXJlci5zZXRTYXZlQW5kUmVzdG9yZSh0cnVlKTs8L2NvZGU+Ci10byB0aGUgPGNvZGU+aW5pdGlhbGl6ZTwvY29kZT4gbWV0aG9kIG9mIDxjb2RlPldvcmtiZW5jaEFkdmlzb3I8L2NvZGU+LgotQW4gZXhhbXBsZSBvZiB0aGlzIGNhbiBiZSBmb3VuZCBpbiB0aGUgc2FtcGxlIHByb2plY3QuCi08L3A+Ci0KLTxoMz5GaXhlZCB2aWV3czwvaDM+Ci08cD4KLUJ5IGRlZmF1bHQsIHZpZXdzIHdpbGwgYmUgbW92ZWFibGUsIHJlc2l6ZWFibGUsIGFuZCBjbG9zYWJsZS4KLU9mdGVuIHlvdSBkb24ndCB3YW50IHRoYXQgZmxleGliaWxpdHkuCi1Gb3IgZXhhbXBsZSwgaWYgeW91J3JlIHdyaXRpbmcgYW4gb3JkZXIgZW50cnkgYXBwbGljYXRpb24KLWZvciB1bnNvcGhpc3RpY2F0ZWQgdXNlcnMsIHlvdSBkb24ndCB3YW50IHRvIGhhdmUgdG8gYW5zd2VyCi1oZWxwIGRlc2sgcXVlc3Rpb25zIGFib3V0IHdoYXQgdG8gZG8gaWYgc29tZWJvZHkgYWNjaWRlbnRhbGx5IGNsb3NlcwotdGhlIGZvcm0gdmlldy4KLUZvciB0aGlzIHJlYXNvbiBFY2xpcHNlIDMuMCBpbnRyb2R1Y2VzIHRoZSBub3Rpb24gb2YgZml4ZWQKLXBlcnNwZWN0aXZlcyBhbmQgZml4ZWQgdmlld3MuCi08L3A+Ci08cD4KLUEgZml4ZWQgdmlldyBpcyBhIHZpZXcgdGhhdCBjYW5ub3QgYmUgY2xvc2VkLgotVGhlIHRpdGxlIGJhciBvZiB0aGUgdmlldyBkb2Vzbid0IGV2ZW4gaGF2ZSBhIGNsb3NlIGJ1dHRvbi4KLVRvIGNyZWF0ZSBvbmUgb2YgdGhlc2UgeW91IGNhbiB1c2UgdGhlIDxjb2RlPnNldEZpeGVkKCk8L2NvZGU+Ci1tZXRob2Qgb24gPGNvZGU+SVBhZ2VMYXlvdXQ8L2NvZGU+LgotPC9wPgotPHA+Ci1BIGJldHRlciB3YXkgbWlnaHQgYmUgdG8gdXNlIGEgZml4ZWQgcGVyc3BlY3RpdmUuCi1BIGZpeGVkIHBlcnNwZWN0aXZlIG1ha2VzIGFsbCBvZiB0aGUgdmlld3MgaXQgY29udGFpbnMgZml4ZWQsCi1wbHVzIGl0IHByZXZlbnRzIGFueSBvZiB0aGVtIGZyb20gYmVpbmcgbW92ZWQgb3IgcmVzaXplZC4KLVRvIG1ha2UgYSBwZXJzcGVjdGl2ZSBmaXhlZCwgc2ltcGx5IGFkZCB0aGUgPGNvZGU+Zml4ZWQ9InRydWUiPC9jb2RlPgotYXR0cmlidXRlIHRvIGl0cyBkZWZpbml0aW9uLAotZm9yIGV4YW1wbGU6Ci08L3A+Ci08cHJlPgotICAgICZsdDtleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JXBlcnNwZWN0aXZlTmFtZSZxdW90OwotICAgICAgICAgICAgaWNvbj0mcXVvdDtpY29ucy9zYW1wbGUuZ2lmJnF1b3Q7Ci0gICAgICAgICAgICA8Yj5maXhlZD0mcXVvdDt0cnVlJnF1b3Q7PC9iPgotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My5SY3BQZXJzcGVjdGl2ZSZxdW90OwotICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My5SY3BQZXJzcGVjdGl2ZSZxdW90OyZndDsKLSAgICAgICAgJmx0Oy9wZXJzcGVjdGl2ZSZndDsKLSAgICAmbHQ7L2V4dGVuc2lvbiZndDsKLTwvcHJlPgotPHA+Ci1CeSB1c2luZyBhIGZpeGVkIHBlcnNwZWN0aXZlIGFuZCB0dXJuaW5nIG9mZiB0aGUgc2hvcnRjdXQgYmFyLCB5b3UKLWNhbiBsb2NrIHRoZSB1c2VyIGludG8gb25lIHBlcnNwZWN0aXZlIGFuZCBoaWRlIHRoZSBjb25jZXB0IG9mIHBlcnNwZWN0aXZlcwotZnJvbSB0aGVtIGFsdG9nZXRoZXIuCi08L3A+Ci0KLTxoMj5NZW51czwvaDI+Ci08cD4KLUxldHRpbmcgeW91IGNvbmZpZ3VyZSBhbGwgdGhlIG1lbnVzIHdhcyBvbmUgb2YgdGhlIGZpcnN0Ci1yZXF1aXJlbWVudHMgb2YgdGhlIFJDUC4KLVRoZXJlIGFyZSB0d28gd2F5cyB0byBhZGQgbWVudXMgaW4gYW4gUkNQIGFwcGxpY2F0aW9uOgotPC9wPgotPHVsPgotPGxpPjxjb2RlPldvcmtiZW5jaEFkdmlzb3IuZmlsbEFjdGlvbkJhcnM8L2NvZGU+Ci08bGk+PGNvZGU+b3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0czwvY29kZT4gaW4gdGhlIHBsdWctaW4gbWFuaWZlc3QKLTwvdWw+Ci08cD4KLTxjb2RlPmZpbGxBY3Rpb25CYXJzPC9jb2RlPiBpcyB0aGUgb25seSB3YXkgdG8gcmVmZXJlbmNlIGJ1aWx0LWluIAotV29ya2JlbmNoIGFjdGlvbnMsIHNvIHdlJ2xsIHVzZSBpdCBmb3IgdGhhdCBwdXJwb3NlLgotRXZlcnl0aGluZyBlbHNlIGNhbiBiZSBjb250cmlidXRlZCBieSB0aGUgPGNvZGU+YWN0aW9uU2V0czwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotQm90aCBtZXRob2RzIHdpbGwgYmUgZGVtb25zdHJhdGVkIGhlcmUuCi1BbHRob3VnaCB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCB1c2UKLXRvb2xiYXJzLCB0aGV5IGFyZSB2ZXJ5IHNpbWlsYXIgdG8gbWVudXMuCi08L3A+Ci08cD4KLUZpcnN0IGxldCdzIHRha2UgYSBsb29rIGF0IDxjb2RlPmZpbGxBY3Rpb25CYXJzPC9jb2RlPjoKLTwvcD4KLTxwcmU+Ci0JcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoCi0JICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93LAotCSAgICBJQWN0aW9uQmFyQ29uZmlndXJlciBjb25maWd1cmVyLAotCSAgICBpbnQgZmxhZ3MpIHsKLQkgICAgc3VwZXIuZmlsbEFjdGlvbkJhcnMod2luZG93LCBjb25maWd1cmVyLCBmbGFncyk7Ci08aW1nIHNyYz0iaW1hZ2VzL3RhZ18xLmdpZiIgaGVpZ2h0PSIxMyIgd2lkdGg9IjI0IiBhbGlnbj0iY2VudGVyIiBhbHQ9IiMxIj4gICAgICAgICBpZiAoKGZsYWdzICYgRklMTF9NRU5VX0JBUikgIT0gMCkgewotCSAgICAgICAgZmlsbE1lbnVCYXIod2luZG93LCBjb25maWd1cmVyKTsKLQkgICAgfQotCX0KLTwvcHJlPgotPHA+Ci08Y29kZT5maWxsQWN0aW9uQmFyczwvY29kZT4gaXMgdGFrZXMgYSBmbGFncyBwYXJhbWV0ZXIKLSg8aW1nIHNyYz0iaW1hZ2VzL3RhZ18xLmdpZiIgaGVpZ2h0PSIxMyIgd2lkdGg9IjI0IiBhbGlnbj0iY2VudGVyIiBhbHQ9IiMxIj4pCi10aGF0IGluZGljYXRlcyB3aGF0Ci10aGUgY29kZSBzaG91bGQgcmVhbGx5IGRvLgotVGhlcmUgYXJlIGZsYWcgYml0cyBmb3IgZmlsbGluZyBpbiB0aGUgbWVudSBiYXIsIHRoZSB0b29sIGJhciwKLXRoZSBzdGF0dXMgbGluZSwgYW5kIGV2ZW4gYSBiaXQgZm9yIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgYSBmYWtlCi1yZXF1ZXN0IGZvciBwcmVmZXJlbmNlIGRpYWxvZ3MgKDxjb2RlPkZJTExfUFJPWFk8L2NvZGU+KS4KLVRoZSBhdXRob3IgaGFzIGhhZCBzb21lIGJhZCBleHBlcmllbmNlcyB3aXRoIGZsYWdzIGxpa2UgdGhpcywKLXNvIHRoZSBleGFtcGxlIGNvZGUganVzdCBjYWxscyBhIGhlbHBlciBmdW5jdGlvbiBjYWxsZWQgPGNvZGU+ZmlsbE1lbnVCYXI8L2NvZGU+Ci10byBkbyB0aGUgYWN0dWFsIGZpbGxpbmcuCi1IZXJlJ3MgdGhlIGNvZGUgZm9yIDxjb2RlPmZpbGxNZW51QmFyPC9jb2RlPjoKLTwvcD4KLTxwcmU+Ci0JcHJpdmF0ZSB2b2lkIGZpbGxNZW51QmFyKAotCSAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdywKLQkgICAgSUFjdGlvbkJhckNvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCSAgICBJTWVudU1hbmFnZXIgbWVudUJhciA9IGNvbmZpZ3VyZXIuZ2V0TWVudU1hbmFnZXIoKTsKLQkgICAgbWVudUJhci5hZGQoY3JlYXRlRmlsZU1lbnUod2luZG93KSk7Ci0JICAgIG1lbnVCYXIuYWRkKGNyZWF0ZUVkaXRNZW51KHdpbmRvdykpOwotCSAgICBtZW51QmFyLmFkZChjcmVhdGVXaW5kb3dNZW51KHdpbmRvdykpOwotCSAgICBtZW51QmFyLmFkZChjcmVhdGVIZWxwTWVudSh3aW5kb3cpKTsKLQl9Ci08L3ByZT4KLTxwPgotRm9yIHRoaXMgZXhhbXBsZSB3ZSB3YW50IHRvIGNyZWF0ZSBmb3VyIHRvcC1sZXZlbAotbWVudXM6IEZpbGUsIEVkaXQsIFdpbmRvdywgYW5kIEhlbHAuCi1UaGVzZSBjb3JyZXNwb25kIHRvIHRoZSBtZW51cyBvZiB0aGUgc2FtZSBuYW1lCi1pbiB0aGUgRWNsaXBzZSBJREUuCi1Gb3IgYSByZWFsIGFwcGxpY2F0aW9uIHlvdSBtYXkgbm90IHdhbnQgYWxsIHRoZXNlLAotb3IgeW91IG1pZ2h0IHdhbnQgdG8gY2FsbCB0aGVtIHNvbWV0aGluZyBkaWZmZXJlbnQuCi1TZWUgZmlndXJlIDEgZm9yIGFuIGV4YW1wbGUuCi08L3A+Ci0KLTxpbWcgc3JjPSJpbWFnZXMvY29tcGxldGUucG5nIj4KLTxwPjxiPkZpZ3VyZSAxLiBUaGUgV29ya2JlbmNoIG1lbnUgYmFyIGlzIGRlZmluZWQKLWluIHRoZSA8Y29kZT5maWxsQWN0aW9uQmFyczwvY29kZT4gbWV0aG9kIG9mIDxjb2RlPldvcmtiZW5jaEFkdmlzb3I8L2NvZGU+LAotYW5kIHRoZW4gYWRkZWQgdG8gYnkgdGhlIG1hbmlmZXN0cyBvZgotYWxsIHBsdWctaW5zIHRoYXQgZXh0ZW5kIDxjb2RlPm9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHM8L2NvZGU+LgotPC9iPjwvcD4KLQotPHA+Ci1UaGUgY29kZSBmb3IgYWxsIHRoZXNlIG1ldGhvZHMgY2FuIGJlIGZvdW5kIGluIHRoZSBleGFtcGxlIHByb2plY3QuCi1MZXQncyBqdXN0IHRha2UgYSBjbG9zZXIgbG9vayBhdCBvbmUgb2Ygb2YgdGhlbSwgdGhlIEZpbGUgbWVudToKLTwvcD4KLQotPHByZT4KLQlwcml2YXRlIE1lbnVNYW5hZ2VyIGNyZWF0ZUZpbGVNZW51KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci08aW1nIHNyYz0iaW1hZ2VzL3RhZ18xLmdpZiIgaGVpZ2h0PSIxMyIgd2lkdGg9IjI0IiBhbGlnbj0iY2VudGVyIiBhbHQ9IiMxIj4JICAgIE1lbnVNYW5hZ2VyIG1lbnUgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJGaWxlIiksIC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9GSUxFKTsKLTxpbWcgc3JjPSJpbWFnZXMvdGFnXzIuZ2lmIiBoZWlnaHQ9IjEzIiB3aWR0aD0iMjQiIGFsaWduPSJjZW50ZXIiIGFsdD0iIzIiPgkgICAgbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRklMRV9TVEFSVCkpOwotCSAgICBtZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLTxpbWcgc3JjPSJpbWFnZXMvdGFnXzMuZ2lmIiBoZWlnaHQ9IjEzIiB3aWR0aD0iMjQiIGFsaWduPSJjZW50ZXIiIGFsdD0iIzMiPgkgICAgbWVudS5hZGQoQWN0aW9uRmFjdG9yeS5RVUlULmNyZWF0ZSh3aW5kb3cpKTsKLQkgICAgbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRklMRV9FTkQpKTsKLQkgICAgcmV0dXJuIG1lbnU7Ci0JfQotPC9wcmU+Ci08cD4KLUFsbCB0aGVzZSBtZW51cyB3b3JrIHRoZSBzYW1lIHdheS4KLUZpcnN0IHlvdSBjcmVhdGUgYSBNZW51TWFuYWdlciBmb3IgdGhlIG1lbnUKLSg8aW1nIHNyYz0iaW1hZ2VzL3RhZ18xLmdpZiIgaGVpZ2h0PSIxMyIgd2lkdGg9IjI0IiBhbGlnbj0iY2VudGVyIiBhbHQ9IiMxIj4pCi11c2luZyB0aGUgbWVzc2FnZSBmaWxlIHRvIGxvb2t1cCB0aGUgYWN0dWFsIGh1bWFuLXJlYWRhYmxlIHRpdGxlLgotVGhlbiB5b3UgYWRkIGFsbCB0aGUgbWVudSBpdGVtcyBhbmQgcmV0dXJuIHRoZSBtYW5hZ2VyLgotU2VlIHRoZSByZWZlcmVuY2VzIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZGVmaW5pbmcgdmlld3MgYW5kIG1lbnVzLgotTmV4dCwgeW91IGNyZWF0ZSBzb21lIHBsYWNlaG9sZGVycwotKDxpbWcgc3JjPSJpbWFnZXMvdGFnXzIuZ2lmIiBoZWlnaHQ9IjEzIiB3aWR0aD0iMjQiIGFsaWduPSJjZW50ZXIiIGFsdD0iIzIiPikKLXdoZXJlIGFkZGl0aW9uYWwKLW1lbnUgaXRlbXMgY2FuIGJlIGFkZGVkIGJ5IHBsdWctaW5zLAotYW5kIG9uZSByZWFsIGFjdGlvbiBzdXBwbGllZCBieSB0aGUgV29ya2JlbmNoOiB0aGUgUXVpdCBhY3Rpb24KLSg8aW1nIHNyYz0iaW1hZ2VzL3RhZ18zLmdpZiIgaGVpZ2h0PSIxMyIgd2lkdGg9IjI0IiBhbGlnbj0iY2VudGVyIiBhbHQ9IiMzIj4pLgotQSBsaXN0IG9mIHN1cHBvcnRlZCBXb3JrYmVuY2ggYWN0aW9ucyBjYW4gYmUgZm91bmQgYnkKLWxvb2tpbmcgYXQgdGhlIEphdmFkb2MgZm9yIDxjb2RlPkFjdGlvbkZhY3Rvcnk8L2NvZGU+IGFuZAotPGNvZGU+Q29udHJpYnV0aW9uSXRlbUZhY3Rvcnk8L2NvZGU+LgotPC9wPgotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL25vdGUuZ2lmIiBhbHQ9Ik5vdGU6ICIgd2lkdGg9IjYyIiBoZWlnaHQ9IjEzIj4KLVRoZXJlIGFyZSBhIG51bWJlciBvZiBzdGFuZGFyZCBwbGFjZWhvbGRlciBuYW1lcwotZm9yIG1lbnVzIGFuZCB0b29sYmFycwotdGhhdCB5b3Ugc2hvdWxkIHVzZSB3aGVuIHRyeWluZyB0byBtYWtlIHlvdXJzIHdvcmsganVzdAotbGlrZSB0aGUgb25lcyBpbiB0aGUgSURFLgotQnkgdXNpbmcgdGhlc2UgcHJlZGVmaW5lZCBncm91cHMsIHBsdWctaW5zIHRoYXQgY29udHJpYnV0ZSBtZW51Ci1hbmQgdG9vbGJhciBpdGVtcyB0byB0aGUgRWNsaXBzZSBJREUgY2FuIGFsc28gY29udHJpYnV0ZSB0aGVtCi10byB5b3VyIFJDUCBhcHBsaWNhdGlvbi4KLVRoZXNlIGFyZW4ndCBkb2N1bWVudGVkIGFueXdoZXJlIG90aGVyIHRoYW4gaW4gdGhlIEphdmFkb2MgZm9yCi08Y29kZT5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzPC9jb2RlPiwgYW5kIGV2ZW4gdGhlcmUgeW91IHdvbid0IGZpbmQgYW55IGd1aWRhbmNlCi1mb3IgdGhlaXIgaW50ZW5kZWQgb3JkZXIuCi1UaGUgc2FtcGxlIGNvZGUgdGhhdCBhY2NvbXBhbmllcyB0aGlzIHR1dG9yaWFsIHdhcyBjcmVhdGVkIGJ5IGxvb2tpbmcgYXQgdGhlCi08Y29kZT5JREVXb3JrYmVuY2hBZHZpc29yPC9jb2RlPiBjbGFzcyB1c2VkIGJ5IHRoZSBFY2xpcHNlIElERS4KLTwvcD4KLQotPGgyPkhlbHA8L2gyPgotPHA+Ci1PbmUgb2YgdGhlIGNvb2xlc3QgZmVhdHVyZXMgb2YgdGhlIFJDUCBpcyBpdHMgaGVscCBzeXN0ZW0uCi1TaW1wbHkgYnkgcHJvdmlkaW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cyBpbgotWE1MIGZvcm1hdCBhbmQgdGhlIGRvY3VtZW50cyBpbiBIVE1MLAoteW91IGNhbiBnaXZlIHlvdXIgdXNlcnMgYSBzZWFyY2hhYmxlIGhlbHAKLXN5c3RlbSB3aXRoIG5vIGNvZGluZyBvbiB5b3VyIHBhcnQuCi1GaXJzdCwgeW91IGFkZCBhbiBleHRlbnNpb24gdG8geW91ciBwbHVnLWluIG1hbmlmZXN0IGxpa2UgdGhpczoKLTwvcD4KLTxwcmU+Ci0JJmx0O2V4dGVuc2lvbgotCSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyImZ3Q7Ci0JICAgJmx0O3RvYwotCSAgICAgICAgIGZpbGU9ImJvb2sueG1sIgotCSAgICAgICAgIHByaW1hcnk9InRydWUiJmd0OwotCSAgICZsdDsvdG9jJmd0OwotCSZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci0KLTxwPgotVGhlbiB5b3UgY3JlYXRlIGEgdGFibGUgb2YgY29udGVudHMgZmlsZSAoYm9vay54bWwgaW4gdGhpcyBleGFtcGxlKQotdG8gZGVmaW5lIGEgaGllcmFyY2h5IG9mIGhlbHAgdG9waWNzLgotTm90IGFsbCB0aGUgdG9waWNzIGhhdmUgdG8gYmUgaW4gdGhlIGNvbnRlbnRzIGJ1dCBpdCBpcwotZ29vZCBwcmFjdGljZSB0byBkbyBzby4KLUhlcmUncyBhbiBleGFtcGxlIHlvdSBjYW4gdXNlIHRvIGdldCBzdGFydGVkOgotPC9wPgotPHByZT4KLQkmbHQ7dG9jIGxhYmVsPSJSQ1AgSGVscCBTYW1wbGUiICB0b3BpYz0iaHRtbC9ib29rLmh0bWwiJmd0OwotCSAgICZsdDt0b3BpYyBsYWJlbD0iT3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcuaHRtbCIvJmd0OwotCSZsdDsvdG9jJmd0OwotPC9wcmU+Ci08cD4KLVNlZSB0aGUgcmVmZXJlbmNlcyBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHdyaXRpbmcKLWFuZCBvcmdhbml6aW5nIGhlbHAgZmlsZXMsIGluY2x1ZGluZyBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLTwvcD4KLTxwPgotV2hlbiB5b3UncmUgZGVidWdnaW5nIG9yIGRlcGxveWluZyBhbiBSQ1AgYXBwbGljYXRpb24KLXRoYXQgaW5jbHVkZXMgaGVscCB5b3UnbGwgbmVlZCB0byBpbmNsdWRlIAotc2V2ZXJhbCBtb3JlIGhlbHAgcmVsYXRlZCBwbHVnLWlucwotaW4gYWRkaXRpb24gdG8gdGhvc2UgbGlzdGVkIGluIHBhcnQgMSBvZiB0aGUgdHV0b3JpYWwuCi1IZXJlJ3MgdGhlIGN1cnJlbnQgbGlzdCAoc3ViamVjdCB0byBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zKToKLTwvcD4KLTx1bD4KLTxsaT48Y29kZT5vcmcuYXBhY2hlLmFudDwvY29kZT4KLTxsaT48Y29kZT5vcmcuYXBhY2hlLmx1Y2VuZTwvY29kZT4KLTxsaT48Y29kZT5vcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlcjwvY29kZT4KLTxsaT48Y29kZT5vcmcuZWNsaXBzZS5oZWxwLmJhc2U8L2NvZGU+Ci08bGk+PGNvZGU+b3JnLmVjbGlwc2UuaGVscC51aTwvY29kZT4KLTxsaT48Y29kZT5vcmcuZWNsaXBzZS5oZWxwLndlYmFwcDwvY29kZT4KLTxsaT48Y29kZT5vcmcuZWNsaXBzZS50b21jYXQ8L2NvZGU+Ci08L3VsPgotPHA+Ci1TZWUgPGNvZGU+Y3JlYXRlSGVscE1lbnUoKTwvY29kZT4gaW4gdGhlIGV4YW1wbGUgZm9yIGNvZGUKLXRvIGFkZCB0aGUgSGVscCBDb250ZW50cyBhY3Rpb24gdG8geW91ciBIZWxwIG1lbnUuCi1XaGVuIHlvdSBzZWxlY3QgaXQsIHRoaXMgYWN0aW9uIHdpbGwgZmlyZSB1cCBhCi1oZWxwIGJyb3dzZXIgbGlrZSB0aGUgb25lIHNob3duIGluIGZpZ3VyZSAyLgotPC9wPgotCi08aW1nIHNyYz0iaW1hZ2VzL2hlbHAucG5nIj4KLTxwPjxiPkZpZ3VyZSAyLiBUaGUgUmljaCBDbGllbnQgUGxhdGZvcm0gcHJvdmlkZXMgYQotZnVsbCBmZWF0dXJlZCBvbmxpbmUgaGVscCBmcmFtZXdvcmsgc28geW91IGRvbid0IGhhdmUgdG8uCi1BbGwgeW91IGRvIGlzIHByb3ZpZGUgdGhlIGNvbnRlbnQuCi08L2I+PC9wPgotCi08aDI+QnVpbGQucHJvcGVydGllczwvaDI+Ci08cD4KLUFzIHlvdSBhZGQgbW9yZSByZXNvdXJjZXMgdG8geW91ciBwbHVnLWluIHN1Y2ggYXMgaHRtbCBmaWxlcywKLWljb25zLCB0aGUgaGVscCB0YWJsZSBvZiBjb250ZW50cywgYW5kIHNvIGZvcnRoLAotZG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSB5b3VyIGJ1aWxkLnByb3BlcnRpZXMgZmlsZSB0bwotaW5jbHVkZSBhbGwgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IG5lZWQgdG8gYmUKLWF2YWlsYWJsZSB0byB0aGUgcGx1Zy1pbiBhdCBydW4gdGltZS4KLUhlcmUgaXMgdGhlIHVwZGF0ZWQgYnVpbGQucHJvcGVydGllcyBYTUwgZmlsZSBjb250YWluaW5nIGV2ZXJ5dGhpbmcKLW5lZWRlZCBmb3IgdGhlIGV4YW1wbGUgaW4gdGhpcyBzZWN0aW9uOgotPC9wPgotPHByZT4KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgcGFydDMuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIDxiPmJvb2sueG1sLFw8L2I+Ci0gICAgICAgICAgICAgICA8Yj5odG1sLyxcPC9iPgotICAgICAgICAgICAgICAgPGI+aWNvbnMvPC9iPgotc291cmNlLnBhcnQzLmphciA9IHNyYy8KLTwvcHJlPgotCi08aDI+Q29uY2x1c2lvbjwvaDI+Ci08cD4KLUluIHRoaXMgcGFydCBvZiB0aGUgdHV0b3JpYWwsIHdlIAotYWRkZWQgYSBzaW1wbGUgdmlldywgc29tZSBtZW51cywgYW5kIGhlbHAgZmlsZXMKLXRvIGEgY3JlYXRlIGEgc2FtcGxlIFJDUCBhcHBsaWNhdGlvbi4KLUhvcGVmdWxseSB5b3UgY2FuIGNhbiB1c2UgdGhpcyBleGFtcGxlIGFzIGEgcmVmZXJlbmNlIGluCi15b3VyIG93biBwcm9qZWN0cy4KLUFsbCB0aGUgc2FtcGxlIGNvZGUgZm9yIHRoaXMgcGFydCBtYXkgYmUgdmlld2VkIGF0IHRoZQotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzIj5FY2xpcHNlIHByb2plY3QgaGVyZTwvYT4uCi1Zb3UgY2FuIHVzZQotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9jdnNob3d0by5odG1sIj5FY2xpcHNlJ3MgYnVpbHQtaW4gQ1ZTIGNsaWVudDwvYT4KLXRvIGRvd25sb2FkIHRoZSBzb3VyY2UgdG8geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLUNvbmdyYXR1bGF0aW9ucyEKLUlmIHlvdSBtYWRlIGl0IHRoaXMgZmFyLCB5b3UgYXJlCi13ZWxsIG9uIHlvdXIgd2F5IHRvIGRldmVsb3BpbmcgeW91ciBvd24KLVJpY2ggQ2xpZW50IFBsYXRmb3JtIGFwcGxpY2F0aW9ucy4KLVRha2UgYSBsb29rIGF0IHRoZSByZWZlcmVuY2VzIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uCi1hbmQgY29tbXVuaXR5IHNpdGVzIGFuZCBtYWlsaW5nIGxpc3RzIHdoZXJlCi15b3UgY2FuIG1lZXQgb3RoZXIgcGVvcGxlIHVzaW5nIFJDUC4KLTwvcD4KLQotPGgyPlJlZmVyZW5jZXM8L2gyPgotPHA+Ci08YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1SQ1AtMS90dXRvcmlhbDEuaHRtbCI+Ci1SQ1AgVHV0b3JpYWwgUGFydCAxPC9hPjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9hcnRpY2xlcy9BcnRpY2xlLVJDUC0yL3R1dG9yaWFsMi5odG1sIj4KLVJDUCBUdXRvcmlhbCBQYXJ0IDI8L2E+PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9wbGF0Zm9ybS11aS1ob21lL3JjcC9pbmRleC5odG1sIj4KLUVjbGlwc2UgUmljaCBDbGllbnQgUGxhdGZvcm08L2E+PGJyPgotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hcnRpY2xlcy92aWV3QXJ0aWNsZS9WaWV3QXJ0aWNsZTIuaHRtbCI+Ci1DcmVhdGluZyBhbiBFY2xpcHNlIFZpZXc8L2E+PGJyPgotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hcnRpY2xlcy9BcnRpY2xlLU9ubGluZSUyMEhlbHAlMjBmb3IlMjAyXzAvaGVscDEuaHRtIj4KLUNvbnRyaWJ1dGluZyBhIExpdHRsZSBIZWxwPC9hPjxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZXBvd2VyZWQub3JnIj4KLUVjbGlwc2UgUG93ZXJlZCAocmljaCBjbGllbnQgcGx1Zy1pbnMgYW5kIHJlc291cmNlcyk8L2E+PGJyPgotPC9wPgotCi08cD48c21hbGw+SUJNIGlzIHRyYWRlbWFyayBvZiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGluIHRoZQotVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYW5kIGxvZ29zIGFyZSB0cmFkZW1hcmtzIG9yCi1yZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIKLWNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTxwPjxzbWFsbD5NaWNyb3NvZnQgYW5kIFdpbmRvd3MgYXJlIHRyYWRlbWFya3Mgb2YgTWljcm9zb2Z0IENvcnBvcmF0aW9uIGluIHRoZQotVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPHA+PHNtYWxsPk90aGVyIGNvbXBhbnksIHByb2R1Y3QsIGFuZCBzZXJ2aWNlIG5hbWVzIG1heSBiZSB0cmFkZW1hcmtzIG9yIHNlcnZpY2UKLW1hcmtzIG9mIG90aGVycy48L3NtYWxsPjwvcD4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvaWNvbnMvc2FtcGxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9pY29ucy9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZiM2M5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9pY29ucy9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWZmY2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGx1Z2luTmFtZSA9IFJjcFR1dG9yaWFsMyBQbHVnLWluCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGVyc3BlY3RpdmVOYW1lID0gUmNwVHV0b3JpYWwzCi1jYXRlZ29yeU5hbWUgPSBTYW1wbGUgQ2F0ZWdvcnkKLXZpZXdOYW1lID0gU2FtcGxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4MTM0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MyIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMC4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwYXJ0My5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5oZWxwIi8+Ci0gICAgICA8IS0tIFRoZXNlIGFyZSBuZWVkZWQgYXQgcnVuLXRpbWUgYnV0IG5vdCBhdCBidWlsZC10aW1lIC0tPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmhlbHAudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRvbWNhdCIvPgotICAgPC9yZXF1aXJlcz4KLQotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iUmNwQXBwbGljYXRpb24iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My5SY3BBcHBsaWNhdGlvbiI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPgotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBuYW1lPSIlcGVyc3BlY3RpdmVOYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKLSAgICAgICAgICAgIGZpeGVkPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMuUmNwUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My5SY3BQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L3BlcnNwZWN0aXZlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlY2F0ZWdvcnlOYW1lIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMudmlld0NhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXdOYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzLnZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzLnZpZXdzLlNhbXBsZVZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My52aWV3cy5TYW1wbGVWaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IlJDUCBBY3Rpb24gU2V0IgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzLmFjdGlvblNldCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJmFtcDtBYm91dCBSQ1AgVHV0b3JpYWwzIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMuYWN0aW9ucy5BYm91dEFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJoZWxwL2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzLmFjdGlvbnMuQWJvdXRBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MKLSAgICAgICAgICAgIGZpbGU9ImJvb2sueG1sIgotICAgICAgICAgICAgcHJpbWFyeT0idHJ1ZSI+Ci0gICAgICA8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9yY3B0dXRvcmlhbDMuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL3JjcHR1dG9yaWFsMy5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTkxNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL3JjcHR1dG9yaWFsMy5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWVjaG8gb24KLXNldGxvY2FsCi1jZCAlfmRwMAotc3RhcnQgamF2YXcgLWNwIHN0YXJ0dXAuamFyIG9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIuTWFpbiAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My5SY3BBcHBsaWNhdGlvbiAlKgotZW5kbG9jYWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9yY3B0dXRvcmlhbDNkZWJ1Zy5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvcmNwdHV0b3JpYWwzZGVidWcuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTk5ZjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9yY3B0dXRvcmlhbDNkZWJ1Zy5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWVjaG8gb24KLXNldGxvY2FsCi1jZCAlfmRwMAotamF2YSAtY3Agc3RhcnR1cC5qYXIgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5NYWluIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzLlJjcEFwcGxpY2F0aW9uIC1jb25zb2xlTG9nICUqIHx8IHBhdXNlCi1lbmRsb2NhbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQzL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDMvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU1ZmVmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MzsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMuUmNwVHV0b3JpYWwiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPQotICAgICAgICBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDMvUmNwQXBwbGljYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0My9SY3BBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI2MmY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0My9SY3BBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbGF0Zm9ybVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yOwotCi1wdWJsaWMgY2xhc3MgUmNwQXBwbGljYXRpb24gaW1wbGVtZW50cyBJUGxhdGZvcm1SdW5uYWJsZSB7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJ1bihPYmplY3QgYXJncykgewotICAgICAgICBXb3JrYmVuY2hBZHZpc29yIHdvcmtiZW5jaEFkdmlzb3IgPSBuZXcgUmNwV29ya2JlbmNoQWR2aXNvcigpOwotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgd29ya2JlbmNoQWR2aXNvcik7Ci0gICAgICAgICAgICBpZiAocmV0dXJuQ29kZSA9PSBQbGF0Zm9ybVVJLlJFVFVSTl9SRVNUQVJUKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfUkVTVEFSVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDMvUmNwUGVyc3BlY3RpdmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0My9SY3BQZXJzcGVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzU4ZGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0My9SY3BQZXJzcGVjdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzLnZpZXdzLlNhbXBsZVZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBSY3BQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BFUlNQRUNUSVZFID0gIm9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMuUmNwUGVyc3BlY3RpdmUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgUmNwUGVyc3BlY3RpdmUoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLSAgICAgICAgbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgbGF5b3V0LmFkZFZpZXcoCi0gICAgICAgICAgICBTYW1wbGVWaWV3LklEX1ZJRVcsCi0gICAgICAgICAgICBJUGFnZUxheW91dC5UT1AsCi0gICAgICAgICAgICBJUGFnZUxheW91dC5SQVRJT19NQVgsCi0gICAgICAgICAgICBJUGFnZUxheW91dC5JRF9FRElUT1JfQVJFQSk7Ci0gICAgICAgIGxheW91dC5hZGRQZXJzcGVjdGl2ZVNob3J0Y3V0KElEX1BFUlNQRUNUSVZFKTsKLSAgICAgICAgbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoU2FtcGxlVmlldy5JRF9WSUVXKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDMvUmNwVHV0b3JpYWwucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0My9SY3BUdXRvcmlhbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWRjZTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0My9SY3BUdXRvcmlhbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotSGVsbG9fUkNQPUhlbGxvLCBSQ1AKLUZpbGU9JkZpbGUKLUVkaXQ9JkVkaXQKLVdpbmRvdz0mV2luZG93Ci1PcGVuX1BlcnNwZWN0aXZlPSZPcGVuIFBlcnNwZWN0aXZlCi1TaG93X1ZpZXc9U2hvdyAmVmlldwotSGVscD0mSGVscAotQWJvdXRUaXRsZT1SY3BUdXRvcmlhbDMKLUFib3V0TWVzc2FnZT1SQ1AgdHV0b3JpYWwgYWJvdXQgYm94IGdvZXMgaGVyZS4KLU9uZT1PbmUKLVR3bz1Ud28KLVRocmVlPVRocmVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDMvUmNwV29ya2JlbmNoQWR2aXNvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQzL1JjcFdvcmtiZW5jaEFkdmlzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQxNjAyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDMvUmNwV29ya2JlbmNoQWR2aXNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0MzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkNvbnRyaWJ1dGlvbkl0ZW1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklXb3JrYmVuY2hDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3I7Ci0KLXB1YmxpYyBjbGFzcyBSY3BXb3JrYmVuY2hBZHZpc29yIGV4dGVuZHMgV29ya2JlbmNoQWR2aXNvciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxXaW5kb3dQZXJzcGVjdGl2ZUlkKCkgewotCQlyZXR1cm4gUmNwUGVyc3BlY3RpdmUuSURfUEVSU1BFQ1RJVkU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJV29ya2JlbmNoQ29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoY29uZmlndXJlcik7Ci0JCWNvbmZpZ3VyZXIuc2V0U2F2ZUFuZFJlc3RvcmUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJlV2luZG93T3BlbihJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0JCXN1cGVyLnByZVdpbmRvd09wZW4oY29uZmlndXJlcik7Ci0JCWNvbmZpZ3VyZXIuc2V0SW5pdGlhbFNpemUobmV3IFBvaW50KDQwMCwgMzAwKSk7Ci0JCWNvbmZpZ3VyZXIuc2V0U2hvd0Nvb2xCYXIoZmFsc2UpOwotCQljb25maWd1cmVyLnNldFNob3dTdGF0dXNMaW5lKGZhbHNlKTsKLQkJY29uZmlndXJlci5zZXRUaXRsZShNZXNzYWdlcy5nZXRTdHJpbmcoIkhlbGxvX1JDUCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElXb3JrYmVuY2hXaW5kb3cgd2luZG93LCBJQWN0aW9uQmFyQ29uZmlndXJlciBjb25maWd1cmVyLCBpbnQgZmxhZ3MpIHsKLQkJc3VwZXIuZmlsbEFjdGlvbkJhcnMod2luZG93LCBjb25maWd1cmVyLCBmbGFncyk7Ci0JCWlmICgoZmxhZ3MgJiBGSUxMX01FTlVfQkFSKSAhPSAwKSB7Ci0JCQlmaWxsTWVudUJhcih3aW5kb3csIGNvbmZpZ3VyZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxNZW51QmFyKElXb3JrYmVuY2hXaW5kb3cgd2luZG93LCBJQWN0aW9uQmFyQ29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0JCUlNZW51TWFuYWdlciBtZW51QmFyID0gY29uZmlndXJlci5nZXRNZW51TWFuYWdlcigpOwotCQltZW51QmFyLmFkZChjcmVhdGVGaWxlTWVudSh3aW5kb3cpKTsKLQkJbWVudUJhci5hZGQoY3JlYXRlRWRpdE1lbnUod2luZG93KSk7Ci0JCW1lbnVCYXIuYWRkKGNyZWF0ZVdpbmRvd01lbnUod2luZG93KSk7Ci0JCW1lbnVCYXIuYWRkKGNyZWF0ZUhlbHBNZW51KHdpbmRvdykpOwotCX0KLQotCXByaXZhdGUgTWVudU1hbmFnZXIgY3JlYXRlRmlsZU1lbnUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJTWVudU1hbmFnZXIgbWVudSA9IG5ldyBNZW51TWFuYWdlcihNZXNzYWdlcy5nZXRTdHJpbmcoIkZpbGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9GSUxFKTsKLQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRklMRV9TVEFSVCkpOwotCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJbWVudS5hZGQoQWN0aW9uRmFjdG9yeS5RVUlULmNyZWF0ZSh3aW5kb3cpKTsKLQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRklMRV9FTkQpKTsKLQkJcmV0dXJuIG1lbnU7Ci0JfQotCi0JcHJpdmF0ZSBNZW51TWFuYWdlciBjcmVhdGVFZGl0TWVudShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlNZW51TWFuYWdlciBtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdCIpLCAvLyROT04tTkxTLTEkCi0JCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQpOwotCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5FRElUX1NUQVJUKSk7Ci0KLQkJbWVudS5hZGQoQWN0aW9uRmFjdG9yeS5VTkRPLmNyZWF0ZSh3aW5kb3cpKTsKLQkJbWVudS5hZGQoQWN0aW9uRmFjdG9yeS5SRURPLmNyZWF0ZSh3aW5kb3cpKTsKLQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuVU5ET19FWFQpKTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQltZW51LmFkZChBY3Rpb25GYWN0b3J5LkNVVC5jcmVhdGUod2luZG93KSk7Ci0JCW1lbnUuYWRkKEFjdGlvbkZhY3RvcnkuQ09QWS5jcmVhdGUod2luZG93KSk7Ci0JCW1lbnUuYWRkKEFjdGlvbkZhY3RvcnkuUEFTVEUuY3JlYXRlKHdpbmRvdykpOwotCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DVVRfRVhUKSk7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJbWVudS5hZGQoQWN0aW9uRmFjdG9yeS5ERUxFVEUuY3JlYXRlKHdpbmRvdykpOwotCQltZW51LmFkZChBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuY3JlYXRlKHdpbmRvdykpOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0JCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkFERF9FWFQpKTsKLQotCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5FRElUX0VORCkpOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCXJldHVybiBtZW51OwotCX0KLQotCXByaXZhdGUgTWVudU1hbmFnZXIgY3JlYXRlV2luZG93TWVudShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlNZW51TWFuYWdlciBtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmdldFN0cmluZygiV2luZG93IiksIC8vJE5PTi1OTFMtMSQKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fV0lORE9XKTsKLQotCQltZW51LmFkZChBY3Rpb25GYWN0b3J5Lk9QRU5fTkVXX1dJTkRPVy5jcmVhdGUod2luZG93KSk7Ci0KLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJTWVudU1hbmFnZXIgcGVyc3BlY3RpdmVNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmdldFN0cmluZygiT3Blbl9QZXJzcGVjdGl2ZSIpLCAib3BlblBlcnNwZWN0aXZlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJQ29udHJpYnV0aW9uSXRlbSBwZXJzcGVjdGl2ZUxpc3QgPSBDb250cmlidXRpb25JdGVtRmFjdG9yeS5QRVJTUEVDVElWRVNfU0hPUlRMSVNULmNyZWF0ZSh3aW5kb3cpOwotCQlwZXJzcGVjdGl2ZU1lbnUuYWRkKHBlcnNwZWN0aXZlTGlzdCk7Ci0JCW1lbnUuYWRkKHBlcnNwZWN0aXZlTWVudSk7Ci0KLQkJTWVudU1hbmFnZXIgdmlld01lbnUgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaG93X1ZpZXciKSk7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gdmlld0xpc3QgPSBDb250cmlidXRpb25JdGVtRmFjdG9yeS5WSUVXU19TSE9SVExJU1QuY3JlYXRlKHdpbmRvdyk7Ci0JCXZpZXdNZW51LmFkZCh2aWV3TGlzdCk7Ci0JCW1lbnUuYWRkKHZpZXdNZW51KTsKLQotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLQkJbWVudS5hZGQoQWN0aW9uRmFjdG9yeS5QUkVGRVJFTkNFUy5jcmVhdGUod2luZG93KSk7Ci0KLQkJbWVudS5hZGQoQ29udHJpYnV0aW9uSXRlbUZhY3RvcnkuT1BFTl9XSU5ET1dTLmNyZWF0ZSh3aW5kb3cpKTsKLQotCQlyZXR1cm4gbWVudTsKLQl9Ci0KLQlwcml2YXRlIE1lbnVNYW5hZ2VyIGNyZWF0ZUhlbHBNZW51KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnUgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJIZWxwIiksIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9IRUxQKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBXZWxjb21lIG9yIGludHJvIHBhZ2Ugd291bGQgZ28gaGVyZQotCQltZW51LmFkZChBY3Rpb25GYWN0b3J5LkhFTFBfQ09OVEVOVFMuY3JlYXRlKHdpbmRvdykpOwotCQkvLyBUaXBzIGFuZCB0cmlja3MgcGFnZSB3b3VsZCBnbyBoZXJlCi0JCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkhFTFBfU1RBUlQpKTsKLQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuSEVMUF9FTkQpKTsKLQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCS8vIEFib3V0IHNob3VsZCBhbHdheXMgYmUgYXQgdGhlIGJvdHRvbQotCQkvLyBUbyB1c2UgdGhlIHJlYWwgUkNQIEFib3V0IGRpYWxvZyB1bmNvbW1lbnQgdGhlc2UgbGluZXMKLQkJLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJLy8gbWVudS5hZGQoQWN0aW9uRmFjdG9yeS5BQk9VVC5jcmVhdGUod2luZG93KSk7Ci0KLQkJcmV0dXJuIG1lbnU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0My9hY3Rpb25zL0Fib3V0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDMvYWN0aW9ucy9BYm91dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQzYmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My9zcmMvb3JnL2VjbGlwc2UvdWkvdHV0b3JpYWxzL3JjcC9wYXJ0My9hY3Rpb25zL0Fib3V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEFib3V0QWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLSAgICBwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0gICAgcHVibGljIEFib3V0QWN0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbih3aW5kb3cuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgIE1lc3NhZ2VzLmdldFN0cmluZygiQWJvdXRUaXRsZSIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBNZXNzYWdlcy5nZXRTdHJpbmcoIkFib3V0TWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgIHRoaXMud2luZG93ID0gd2luZG93OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDMvdmlld3MvU2FtcGxlVmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzL3NyYy9vcmcvZWNsaXBzZS91aS90dXRvcmlhbHMvcmNwL3BhcnQzL3ZpZXdzL1NhbXBsZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwZjBjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMvc3JjL29yZy9lY2xpcHNlL3VpL3R1dG9yaWFscy9yY3AvcGFydDMvdmlld3MvU2FtcGxlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50dXRvcmlhbHMucmNwLnBhcnQzLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnR1dG9yaWFscy5yY3AucGFydDMuTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTYW1wbGVWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1ZJRVcgPSAib3JnLmVjbGlwc2UudWkudHV0b3JpYWxzLnJjcC5wYXJ0My52aWV3cy5TYW1wbGVWaWV3IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0KLSAgICBjbGFzcyBWaWV3Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHYsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IE1lc3NhZ2VzLmdldFN0cmluZygiT25lIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRTdHJpbmcoIlR3byIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJUaHJlZSIpfTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotICAgIGNsYXNzIFZpZXdMYWJlbFByb3ZpZGVyCi0gICAgICAgIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotICAgICAgICBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VGV4dChvYmopOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZShvYmopOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZSgKLSAgICAgICAgICAgICAgICBJU2hhcmVkSW1hZ2VzLklNR19PQkpfRUxFTUVOVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2FtcGxlVmlldygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHZpZXdlciA9Ci0gICAgICAgICAgICBuZXcgVGFibGVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICB2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWaWV3Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICB2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVmlld0xhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIHZpZXdlci5zZXRJbnB1dCh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDE2YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVpLnZpZXdzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5oZWxwPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3ZTZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNNb24gT2N0IDI0IDE1OjA3OjMwIEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNGI1MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVHVlIE9jdCAxOCAxNToxNjozNiBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcz48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBnZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50Ij4vKipcbiAqIEByZXR1cm4gUmV0dXJucyB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBzZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmNvbW1lbnQiIG5hbWVcPSJzZXR0ZXJjb21tZW50Ij4vKipcbiAqIEBwYXJhbSAke3BhcmFtfSBUaGUgJHtiYXJlX2ZpZWxkX25hbWV9IHRvIHNldC5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIGNvbnN0cnVjdG9ycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmNvbW1lbnQiIG5hbWVcPSJjb25zdHJ1Y3RvcmNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBKYXZhIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpbGVjb21tZW50IiBuYW1lXD0iZmlsZWNvbW1lbnQiPi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBDb3B5cmlnaHQgKGMpICR7eWVhcn0gSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG4gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcbiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwXDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbiAqXG4gKiBDb250cmlidXRvcnNcOlxuICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJmYWxzZSIgY29udGV4dFw9InR5cGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIHR5cGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnR5cGVjb21tZW50IiBuYW1lXD0idHlwZWNvbW1lbnQiPi8qKlxuICogQHNpbmNlIDMuMlxuICpcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBmaWVsZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50Ij4vKipcbiAqIFxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBub24tb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGNvbW1lbnQiIG5hbWVcPSJtZXRob2Rjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ib3ZlcnJpZGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMub3ZlcnJpZGVjb21tZW50IiBuYW1lXD0ib3ZlcnJpZGVjb21tZW50Ij4vKiAobm9uLUphdmFkb2MpXG4gKiAke3NlZV90b19vdmVycmlkZGVufVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJuZXd0eXBlX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJOZXdseSBjcmVhdGVkIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm5ld3R5cGUiIG5hbWVcPSJuZXd0eXBlIj4ke2ZpbGVjb21tZW50fVxuJHtwYWNrYWdlX2RlY2xhcmF0aW9ufVxuXG4ke3R5cGVjb21tZW50fVxuJHt0eXBlX2RlY2xhcmF0aW9ufTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2F0Y2hibG9ja19jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2F0Y2ggYmxvY2tzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNhdGNoYmxvY2siIG5hbWVcPSJjYXRjaGJsb2NrIj4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrXG4ke2V4Y2VwdGlvbl92YXJ9LnByaW50U3RhY2tUcmFjZSgpOzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIG1ldGhvZCBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rib2R5IiBuYW1lXD0ibWV0aG9kYm9keSI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YlxuJHtib2R5X3N0YXRlbWVudH08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGNvbnN0cnVjdG9yIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yYm9keSIgbmFtZVw9ImNvbnN0cnVjdG9yYm9keSI+JHtib2R5X3N0YXRlbWVudH1cbi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGdldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyYm9keSIgbmFtZVw9ImdldHRlcmJvZHkiPnJldHVybiAke2ZpZWxkfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBzZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmJvZHkiIG5hbWVcPSJzZXR0ZXJib2R5Ij4ke2ZpZWxkfSBcPSAke3BhcmFtfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNsYXNzYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2xhc3MgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2xhc3Nib2R5IiBuYW1lXD0iY2xhc3Nib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iaW50ZXJmYWNlYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgaW50ZXJmYWNlIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmludGVyZmFjZWJvZHkiIG5hbWVcPSJpbnRlcmZhY2Vib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZW51bWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGVudW0gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZW51bWJvZHkiIG5hbWVcPSJlbnVtYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImFubm90YXRpb25ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBhbm5vdGF0aW9uIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmFubm90YXRpb25ib2R5IiBuYW1lXD0iYW5ub3RhdGlvbmJvZHkiPlxuPC90ZW1wbGF0ZT48L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlOWIyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jVHVlIE5vdiAxNiAxNDoxMjoxNSBFU1QgMjAwNAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1NTYzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVpLnZpZXdzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLlZpZXdzUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuaGVscCwKLSBvcmcuZWNsaXBzZS51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmYTBhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmYzMyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvY29tcG9uZW50IgotICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2NvbXBvbmVudCAuLi9jb21wb25lbnQueHNkICIKLSAgIG5hbWU9IlBsYXRmb3JtIFVJIFZpZXdzIj4KLSA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cyIgLz4KLQotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lIiA+Ci0gICA8dHlwZSBuYW1lPSJDb250ZW50T3V0bGluZSIgaW5zdGFudGlhdGU9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSA8L3BhY2thZ2U+Ci0KLSA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzIiBleGNsdXNpdmU9ImZhbHNlIiA+Ci0gICA8dHlwZSBuYW1lPSJDb2xvclByb3BlcnR5RGVzY3JpcHRvciIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvciIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJJUHJvcGVydHlTaGVldEVudHJ5TGlzdGVuZXIiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgIDx0eXBlIG5hbWU9IlByb3BlcnR5U2hlZXQiIGluc3RhbnRpYXRlPSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJQcm9wZXJ0eVNoZWV0UGFnZSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJUZXh0UHJvcGVydHlEZXNjcmlwdG9yIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSA8L3BhY2thZ2U+Ci0KLSA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIi8+Ci0KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvaWNvbnMvZnVsbC9kbGNsMTYvZGVmYXVsdHNfcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9pY29ucy9mdWxsL2RsY2wxNi9kZWZhdWx0c19wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWJhNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9pY29ucy9mdWxsL2RsY2wxNi9kZWZhdWx0c19wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL2ljb25zL2Z1bGwvZGxjbDE2L2ZpbHRlcl9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL2ljb25zL2Z1bGwvZGxjbDE2L2ZpbHRlcl9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNmQ4OTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9pY29ucy9mdWxsL2RsY2wxNi9maWx0ZXJfcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9pY29ucy9mdWxsL2RsY2wxNi90cmVlX21vZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9pY29ucy9mdWxsL2RsY2wxNi90cmVlX21vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmJkYmUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvaWNvbnMvZnVsbC9kbGNsMTYvdHJlZV9tb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvaWNvbnMvZnVsbC9lbGNsMTYvZGVmYXVsdHNfcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9pY29ucy9mdWxsL2VsY2wxNi9kZWZhdWx0c19wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNjQ4OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9pY29ucy9mdWxsL2VsY2wxNi9kZWZhdWx0c19wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL2ljb25zL2Z1bGwvZWxjbDE2L2ZpbHRlcl9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL2ljb25zL2Z1bGwvZWxjbDE2L2ZpbHRlcl9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTZmMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9pY29ucy9mdWxsL2VsY2wxNi90cmVlX21vZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9pY29ucy9mdWxsL2VsY2wxNi90cmVlX21vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE4YmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvaWNvbnMvZnVsbC9lbGNsMTYvdHJlZV9tb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvaWNvbnMvZnVsbC9ldmlldzE2L291dGxpbmVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9pY29ucy9mdWxsL2V2aWV3MTYvb3V0bGluZV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzg2MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9pY29ucy9mdWxsL2V2aWV3MTYvb3V0bGluZV9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL2ljb25zL2Z1bGwvZXZpZXcxNi9wcm9wX3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvaWNvbnMvZnVsbC9ldmlldzE2L3Byb3BfcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTFjOTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvaWNvbnMvZnVsbC9ldmlldzE2L3Byb3BfcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYWUyZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9IFZpZXdzCi1wcm92aWRlck5hbWU9IEVjbGlwc2Uub3JnCi0KLVZpZXdzLlByb3BlcnR5U2hlZXQgPSBQcm9wZXJ0aWVzCi1WaWV3cy5Db250ZW50T3V0bGluZSA9IE91dGxpbmUKLQotVmlld0NvbW1hbmQucHJvcGVydHlTaGVldC5uYW1lPSBQcm9wZXJ0aWVzCi1WaWV3Q29tbWFuZC5wcm9wZXJ0eVNoZWV0LmRlc2NyaXB0aW9uPSBTaG93IHRoZSBQcm9wZXJ0aWVzIHZpZXcKLVZpZXdDb21tYW5kLmNvbnRlbnRPdXRsaW5lLm5hbWU9IE91dGxpbmUKLVZpZXdDb21tYW5kLmNvbnRlbnRPdXRsaW5lLmRlc2NyaXB0aW9uPSBTaG93IHRoZSBPdXRsaW5lIHZpZXcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhZGJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIAotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiVWaWV3cy5Qcm9wZXJ0eVNoZWV0IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldmlldzE2L3Byb3BfcHMuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Ij4KLSAgICAgIDwvdmlldz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIlVmlld3MuQ29udGVudE91dGxpbmUiCi0gICAgICAgICAgICBpY29uPSIkbmwkL2ljb25zL2Z1bGwvZXZpZXcxNi9vdXRsaW5lX2NvLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Db250ZW50T3V0bGluZSI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTcxZTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRWNsaXBzZSBWaWV3cyIgZGVmYXVsdD0iZXhwb3J0IiBiYXNlZGlyPSIuLiI+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iLi4vLi4vcGx1Z2luLWV4cG9ydCIgLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgIHZhbHVlPSJvcmcuZWNsaXBzZS51aS52aWV3cyIgLz4KLQkJPHByb3BlcnR5IG5hbWU9InZlcnNpb24iICB2YWx1ZT0iXzIuMS4wIiAvPgotCQk8cHJvcGVydHkgbmFtZT0iZGVzdCIgIHZhbHVlPSIke2Rlc3RkaXJ9LyR7cGx1Z2lufSR7dmVyc2lvbn0iIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAJPGVjbGlwc2UuaW5jcmVtZW50YWxCdWlsZCBwcm9qZWN0PSIke3BsdWdpbn0iIGtpbmQ9ImluY3IiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZXhwb3J0IiBkZXBlbmRzPSJidWlsZCI+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdGRpcn0iIC8+Ci0JCTxkZWxldGUgZGlyPSIke2Rlc3R9IiAvPgotCQk8bWtkaXIgZGlyPSIke2Rlc3R9IiAvPgotCQk8amFyIAotCQkJamFyZmlsZT0iJHtkZXN0fS92aWV3cy5qYXIiCi0JCQliYXNlZGlyPSJiaW4iCi0JCS8+Ci0JCTxjb3B5IGZpbGU9InBsdWdpbi54bWwiIHRvZGlyPSIke2Rlc3R9Ii8+Ci0JCTxjb3B5IGZpbGU9InBsdWdpbi5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtkZXN0fSIvPgotCQk8emlwIHppcGZpbGU9IiR7ZGVzdH0vdmlld3NzcmMuemlwIj4KLQkJICAgIDxmaWxlc2V0IGRpcj0ic3JjIiAvPgotCQkgICAgPGZpbGVzZXQgZGlyPSJleHRlbnNpb25zIiAvPgotICAJCTwvemlwPgkJCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL1ZpZXdzUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9WaWV3c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDljOWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL1ZpZXdzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogVGhlIHBsdWctaW4gcnVudGltZSBjbGFzcyBmb3IgdGhlIHZpZXdzIFVJIHBsdWctaW4gKGlkIDxjb2RlPiJvcmcuZWNsaXBzZS51aS52aWV3cyI8L2NvZGU+KS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBhbmQgZmllbGRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmlld3NQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLSAgICAvKioKLSAgICAgKiBWaWV3cyBVSSBwbHVnLWluIGlkICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UudWkudmlld3MiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJQ09OU19QQVRIID0gIiRubCQvaWNvbnMvZnVsbC8iOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIFZpZXdzUGx1Z2luIGluc3RhbmNlOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFZpZXdzUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jUGx1Z2luKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgVmlld3NQbHVnaW4oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGluc3RhbmNlID0gdGhpczsKLSAgICB9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB3b3JrYmVuY2ggaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4gcGF0aCByZWxhdGl2ZSB0bwotCSAqIElDT05fUEFUSC4KLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRWaWV3SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZWxhdGl2ZVBhdGgpewotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIElDT05TX1BBVEggKyByZWxhdGl2ZVBhdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NvbnRlbnRPdXRsaW5lTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NvbnRlbnRPdXRsaW5lTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRiYTg0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9Db250ZW50T3V0bGluZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQ29udGVudE91dGxpbmVNZXNzYWdlcyBpcyB0aGUgbWVzc2FnZSBjbGFzcyBmb3IgdGhlIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGNvbnRlbnQgb3V0bGluZS4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50T3V0bGluZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIE91dGxpbmUgVmlldwotCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRPdXRsaW5lX25vT3V0bGluZTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDb250ZW50T3V0bGluZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMjI5YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1ICBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgcGFja2FnZTogb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUKLQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBPdXRsaW5lIFZpZXcKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Db250ZW50T3V0bGluZV9ub091dGxpbmUgPSBBbiBvdXRsaW5lIGlzIG5vdCBhdmFpbGFibGUuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MzI0YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcm5hbCBzdXBwb3J0IGZvciB0aGUgQ29udGVudCBPdXRsaW5lIHZpZXcuCi08YnI+Jm5ic3A7Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9Qcm9wZXJ0aWVzTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2ZTVhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQkvLyBwYWNrYWdlOiBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzCi0KLQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBQcm9wZXJ0aWVzIFZpZXcKLQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGVnb3JpZXNfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRlZ29yaWVzX3Rvb2xUaXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5UHJvcGVydHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRzX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdHNfdG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlcl90b29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvcGVydHlWaWV3ZXJfcHJvcGVydHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvcGVydHlWaWV3ZXJfdmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvcGVydHlWaWV3ZXJfbWlzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlUb0NsaXBib2FyZFByb2JsZW1EaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weVRvQ2xpcGJvYXJkUHJvYmxlbURpYWxvZ19tZXNzYWdlOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFByb3BlcnRpZXNNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmZGNkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgcGFja2FnZTogb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBQcm9wZXJ0aWVzIFZpZXcKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNhdGVnb3JpZXNfdGV4dCA9IFNob3cgJkNhdGVnb3JpZXMKLUNhdGVnb3JpZXNfdG9vbFRpcCA9IFNob3cgQ2F0ZWdvcmllcwotCi1Db3B5UHJvcGVydHlfdGV4dCA9ICZDb3B5Ci0KLURlZmF1bHRzX3RleHQgPSAmUmVzdG9yZSBEZWZhdWx0IFZhbHVlCi1EZWZhdWx0c190b29sVGlwID0gUmVzdG9yZSBEZWZhdWx0IFZhbHVlCi0KLUZpbHRlcl90ZXh0ID0gU2hvdyAmQWR2YW5jZWQgUHJvcGVydGllcwotRmlsdGVyX3Rvb2xUaXAgPSBTaG93IEFkdmFuY2VkIFByb3BlcnRpZXMKLQotUHJvcGVydHlWaWV3ZXJfcHJvcGVydHkgPSBQcm9wZXJ0eQotUHJvcGVydHlWaWV3ZXJfdmFsdWUgPSBWYWx1ZQotUHJvcGVydHlWaWV3ZXJfbWlzYyA9IE1pc2MKLQotQ29weVRvQ2xpcGJvYXJkUHJvYmxlbURpYWxvZ190aXRsZT1Qcm9ibGVtIENvcHlpbmcgdG8gQ2xpcGJvYXJkCi1Db3B5VG9DbGlwYm9hcmRQcm9ibGVtRGlhbG9nX21lc3NhZ2U9VGhlcmUgd2FzIGEgcHJvYmxlbSB3aGVuIGFjY2Vzc2luZyB0aGUgc3lzdGVtIGNsaXBib2FyZC4gUmV0cnk/CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9jb250ZW50b3V0bGluZS9Db250ZW50T3V0bGluZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvY29udGVudG91dGxpbmUvQ29udGVudE91dGxpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1NjE0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9jb250ZW50b3V0bGluZS9Db250ZW50T3V0bGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSUNvbnRyaWJ1dGVkQ29udGVudHNWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZUJvb2tWaWV3UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk1lc3NhZ2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9va1ZpZXc7Ci0KLS8qKgotICogTWFpbiBjbGFzcyBmb3IgdGhlIENvbnRlbnQgT3V0bGluZSBWaWV3LgotICogPHA+Ci0gKiBUaGlzIHN0YW5kYXJkIHZpZXcgaGFzIGlkIDxjb2RlPiJvcmcuZWNsaXBzZS51aS52aWV3cy5Db250ZW50T3V0bGluZSI8L2NvZGU+LgotICogPC9wPgotICogV2hlbiBhIDxiPmNvbnRlbnQgb3V0bGluZSB2aWV3PC9iPiBub3RpY2VzIGFuIGVkaXRvciBiZWluZyBhY3RpdmF0ZWQsIGl0IAotICogYXNrcyB0aGUgZWRpdG9yIHdoZXRoZXIgaXQgaGFzIGEgPGI+Y29udGVudCBvdXRsaW5lIHBhZ2U8L2I+IHRvIGluY2x1ZGUKLSAqIGluIHRoZSBvdXRsaW5lIHZpZXcuIFRoaXMgaXMgZG9uZSB1c2luZyA8Y29kZT5nZXRBZGFwdGVyPC9jb2RlPjoKLSAqIDxwcmU+Ci0gKiBJRWRpdG9yUGFydCBlZGl0b3IgPSAuLi47Ci0gKiBJQ29udGVudE91dGxpbmVQYWdlIG91dGxpbmVQYWdlID0gKElDb250ZW50T3V0bGluZVBhZ2UpIGVkaXRvci5nZXRBZGFwdGVyKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpOwotICogaWYgKG91dGxpbmVQYWdlICE9IG51bGwpIHsKLSAqICAgIC8vIGVkaXRvciB3aXNoZXMgdG8gY29udHJpYnV0ZSBvdXRsaW5lUGFnZSB0byBjb250ZW50IG91dGxpbmUgdmlldwotICogfQotICogPC9wcmU+Ci0gKiBJZiB0aGUgZWRpdG9yIHN1cHBvcnRzIGEgY29udGVudCBvdXRsaW5lIHBhZ2UsIHRoZSBlZGl0b3IgaW5zdGFudGlhdGVzCi0gKiBhbmQgY29uZmlndXJlcyB0aGUgcGFnZSwgYW5kIHJldHVybnMgaXQuIFRoaXMgcGFnZSBpcyB0aGVuIGFkZGVkIHRvIHRoZSAKLSAqIGNvbnRlbnQgb3V0bGluZSB2aWV3IChhIHBhZ2Vib29rIHdoaWNoIHByZXNlbnRzIG9uZSBwYWdlIGF0IGEgdGltZSkgYW5kIAotICogaW1tZWRpYXRlbHkgbWFkZSB0aGUgY3VycmVudCBwYWdlICh0aGUgY29udGVudCBvdXRsaW5lIHZpZXcgbmVlZCBub3QgYmUKLSAqIHZpc2libGUpLiBJZiB0aGUgZWRpdG9yIGRvZXMgbm90IHN1cHBvcnQgYSBjb250ZW50IG91dGxpbmUgcGFnZSwgdGhlIGNvbnRlbnQKLSAqIG91dGxpbmUgdmlldyBzaG93cyBhIHNwZWNpYWwgZGVmYXVsdCBwYWdlIHdoaWNoIG1ha2VzIGl0IGNsZWFyIHRvIHRoZSB1c2VyCi0gKiB0aGF0IHRoZSBjb250ZW50IG91dGxpbmUgdmlldyBpcyBkaXNlbmdhZ2VkLiBBIGNvbnRlbnQgb3V0bGluZSBwYWdlIGlzIGZyZWUKLSAqIHRvIHJlcG9ydCBzZWxlY3Rpb24gZXZlbnRzOyB0aGUgY29udGVudCBvdXRsaW5lIHZpZXcgZm9yd2FyZHMgdGhlc2UgZXZlbnRzIAotICogYWxvbmcgdG8gaW50ZXJlc3RlZCBwYXJ0aWVzLiBXaGVuIHRoZSBjb250ZW50IG91dGxpbmUgdmlldyBub3RpY2VzIGEKLSAqIGRpZmZlcmVudCBlZGl0b3IgYmVpbmcgYWN0aXZhdGVkLCBpdCBmbGlwcyB0byB0aGUgZWRpdG9yJ3MgY29ycmVzcG9uZGluZwotICogY29udGVudCBvdXRsaW5lIHBhZ2UuIFdoZW4gdGhlIGNvbnRlbnQgb3V0bGluZSB2aWV3IG5vdGljZXMgYW4gZWRpdG9yIGJlaW5nCi0gKiBjbG9zZWQsIGl0IGRlc3Ryb3lzIHRoZSBlZGl0b3IncyBjb3JyZXNwb25kaW5nIGNvbnRlbnQgb3V0bGluZSBwYWdlLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgd29ya2JlbmNoIHdpbGwgYXV0b21hdGljYWxseSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIHdoZW4gYSBDb250ZW50Ci0gKiBPdXRsaW5lIHZpZXcgaXMgbmVlZGVkIGZvciBhIHdvcmtiZW5jaCB3aW5kb3cuIFRoaXMgY2xhc3Mgd2FzIG5vdCBpbnRlbmRlZAotICogdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRPdXRsaW5lIGV4dGVuZHMgUGFnZUJvb2tWaWV3IGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyLAotICAgICAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgcGx1Z2luIHByZWZpeC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBQbGF0Zm9ybVVJLlBMVUdJTl9JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogSGVscCBjb250ZXh0IGlkIHVzZWQgZm9yIHRoZSBjb250ZW50IG91dGxpbmUgdmlldwotICAgICAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UudWkuY29udGVudF9vdXRsaW5lX2NvbnRleHQiPC9jb2RlPikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9PVVRMSU5FX1ZJRVdfSEVMUF9DT05URVhUX0lEID0gUFJFRklYCi0gICAgICAgICAgICArICJjb250ZW50X291dGxpbmVfY29udGV4dCI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogTWVzc2FnZSB0byBzaG93IG9uIHRoZSBkZWZhdWx0IHBhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQgPUNvbnRlbnRPdXRsaW5lTWVzc2FnZXMuQ29udGVudE91dGxpbmVfbm9PdXRsaW5lOyAKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb250ZW50IG91dGxpbmUgdmlldyB3aXRoIG5vIGNvbnRlbnQgb3V0bGluZSBwYWdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudE91dGxpbmUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU2VsZWN0aW9uUHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gUGFnZUJvb2tWaWV3LgotICAgICAqLwotICAgIHByb3RlY3RlZCBJUGFnZSBjcmVhdGVEZWZhdWx0UGFnZShQYWdlQm9vayBib29rKSB7Ci0gICAgICAgIE1lc3NhZ2VQYWdlIHBhZ2UgPSBuZXcgTWVzc2FnZVBhZ2UoKTsKLSAgICAgICAgaW5pdFBhZ2UocGFnZSk7Ci0gICAgICAgIHBhZ2UuY3JlYXRlQ29udHJvbChib29rKTsKLSAgICAgICAgcGFnZS5zZXRNZXNzYWdlKGRlZmF1bHRUZXh0KTsKLSAgICAgICAgcmV0dXJuIHBhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlBhZ2VCb29rVmlldzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JV29ya2JlbmNoUGFydDwvY29kZT4KLSAgICAgKiBtZXRob2QgY3JlYXRlcyBhIDxjb2RlPlBhZ2VCb29rPC9jb2RlPiBjb250cm9sIHdpdGggaXRzIGRlZmF1bHQgcGFnZSBzaG93aW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRQYWdlQm9vaygpLAotICAgICAgICAgICAgICAgIENPTlRFTlRfT1VUTElORV9WSUVXX0hFTFBfQ09OVEVYVF9JRCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQYWdlQm9va1ZpZXcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBhZ2VSZWMgZG9DcmVhdGVQYWdlKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgLy8gVHJ5IHRvIGdldCBhbiBvdXRsaW5lIHBhZ2UuCi0gICAgICAgIE9iamVjdCBvYmogPSBwYXJ0LmdldEFkYXB0ZXIoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcyk7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJQ29udGVudE91dGxpbmVQYWdlKSB7Ci0gICAgICAgICAgICBJQ29udGVudE91dGxpbmVQYWdlIHBhZ2UgPSAoSUNvbnRlbnRPdXRsaW5lUGFnZSkgb2JqOwotICAgICAgICAgICAgaWYgKHBhZ2UgaW5zdGFuY2VvZiBJUGFnZUJvb2tWaWV3UGFnZSkKLSAgICAgICAgICAgICAgICBpbml0UGFnZSgoSVBhZ2VCb29rVmlld1BhZ2UpIHBhZ2UpOwotICAgICAgICAgICAgcGFnZS5jcmVhdGVDb250cm9sKGdldFBhZ2VCb29rKCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQYWdlUmVjKHBhcnQsIHBhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZXJlIGlzIG5vIGNvbnRlbnQgb3V0bGluZQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFBhZ2VCb29rVmlldy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0Rlc3Ryb3lQYWdlKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFBhZ2VSZWMgcmVjKSB7Ci0gICAgICAgIElDb250ZW50T3V0bGluZVBhZ2UgcGFnZSA9IChJQ29udGVudE91dGxpbmVQYWdlKSByZWMucGFnZTsKLSAgICAgICAgcGFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIHJlYy5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWRhcHRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBJQ29udHJpYnV0ZWRDb250ZW50c1ZpZXcuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gbmV3IElDb250cmlidXRlZENvbnRlbnRzVmlldygpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgSVdvcmtiZW5jaFBhcnQgZ2V0Q29udHJpYnV0aW5nUGFydCgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbnRyaWJ1dGluZ0VkaXRvcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQYWdlQm9va1ZpZXcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IGdldEJvb3RzdHJhcFBhcnQoKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpOwotICAgICAgICBpZiAocGFnZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWRpdG9yIHdoaWNoIGNvbnRyaWJ1dGVkIHRoZSBjdXJyZW50IAotICAgICAqIHBhZ2UgdG8gdGhpcyB2aWV3LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZWRpdG9yIHdoaWNoIGNvbnRyaWJ1dGVkIHRoZSBjdXJyZW50IHBhZ2UKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBlZGl0b3IgY29udHJpYnV0ZWQgdGhlIGN1cnJlbnQgcGFnZQotICAgICAqLwotICAgIHByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZ2V0Q29udHJpYnV0aW5nRWRpdG9yKCkgewotICAgICAgICByZXR1cm4gZ2V0Q3VycmVudENvbnRyaWJ1dGluZ1BhcnQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElTZWxlY3Rpb25Qcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgc2VsZWN0aW9uIGZyb20gdGhlIHNlbGVjdGlvbiBwcm92aWRlcgotICAgICAgICByZXR1cm4gZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFBhZ2VCb29rVmlldy4KLSAgICAgKiBXZSBvbmx5IHdhbnQgdG8gdHJhY2sgZWRpdG9ycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ltcG9ydGFudChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIC8vV2Ugb25seSBjYXJlIGFib3V0IGVkaXRvcnMKLSAgICAgICAgcmV0dXJuIChwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVZpZXdQYXJ0LgotICAgICAqIFRyZWF0IHRoaXMgdGhlIHNhbWUgYXMgcGFydCBhY3RpdmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICBwYXJ0QWN0aXZhdGVkKHBhcnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVNlbGVjdGlvblByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLSAgICAgICAgICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBnZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVNlbGVjdGlvblByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBnZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db250ZW50T3V0bGluZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5QYWdlQm9va1ZpZXc8L2NvZGU+IG1ldGhvZAotICAgICAqIGV4dGVuZHMgdGhlIGJlaGF2aW9yIG9mIGl0cyBwYXJlbnQgdG8gdXNlIHRoZSBjdXJyZW50IHBhZ2UgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhZ2VSZWMgdGhlIHBhZ2UgcmVjb3JkIGNvbnRhaW5pbmcgdGhlIHBhZ2UgdG8gc2hvdwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNob3dQYWdlUmVjKFBhZ2VSZWMgcGFnZVJlYykgewotICAgICAgICBJUGFnZVNpdGUgcGFnZVNpdGUgPSBnZXRQYWdlU2l0ZShwYWdlUmVjLnBhZ2UpOwotICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBwYWdlU2l0ZS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCAmJiAocGFnZVJlYy5wYWdlIGluc3RhbmNlb2YgSUNvbnRlbnRPdXRsaW5lUGFnZSkpCi0gICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIHBhZ2UgZGlkIG5vdCBzZXQgYSBwcm92aWRlciBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIAotICAgICAgICAgICAgLy8gc28gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2Ugd2lsbCBzZXQgdGhlIHBhZ2UgaXRzZWxmIGFzIHRoZSBwcm92aWRlci4KLSAgICAgICAgICAgIHBhZ2VTaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKChJQ29udGVudE91dGxpbmVQYWdlKSBwYWdlUmVjLnBhZ2UpOwotICAgICAgICBzdXBlci5zaG93UGFnZVJlYyhwYWdlUmVjKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9jb250ZW50b3V0bGluZS9Db250ZW50T3V0bGluZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTcxZDJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2VTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZTsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb250ZW50IG91dGxpbmUgcGFnZXMuCi0gKiA8cD4KLSAqIENsaWVudHMgd2hvIGFyZSBkZWZpbmluZyBhbiBlZGl0b3IgbWF5IGVsZWN0IHRvIHByb3ZpZGUgYSBjb3JyZXNwb25kaW5nCi0gKiBjb250ZW50IG91dGxpbmUgcGFnZS4gVGhpcyBjb250ZW50IG91dGxpbmUgcGFnZSB3aWxsIGJlIHByZXNlbnRlZCB0byB0aGUKLSAqIHVzZXIgdmlhIHRoZSBzdGFuZGFyZCBDb250ZW50IE91dGxpbmUgVmlldyAodGhlIHVzZXIgZGVjaWRlcyB3aGV0aGVyIHRoZWlyCi0gKiB3b3JrYmVuY2ggd2luZG93IGNvbnRhaW5zIHRoaXMgdmlldykgd2hlbmV2ZXIgdGhhdCBlZGl0b3IgaXMgYWN0aXZlLgotICogVGhpcyBjbGFzcyBzaG91bGQgYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogSW50ZXJuYWxseSwgZWFjaCBjb250ZW50IG91dGxpbmUgcGFnZSBjb25zaXN0cyBvZiBhIHN0YW5kYXJkIHRyZWUgdmlld2VyOyAKLSAqIHNlbGVjdGlvbnMgbWFkZSBpbiB0aGUgdHJlZSB2aWV3ZXIgYXJlIHJlcG9ydGVkIGFzIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRzIAotICogYnkgdGhlIHBhZ2UgKHdoaWNoIGlzIGEgc2VsZWN0aW9uIHByb3ZpZGVyKS4gVGhlIHRyZWUgdmlld2VyIGlzIG5vdCBjcmVhdGVkIAotICogdW50aWwgPGNvZGU+Y3JlYXRlUGFnZTwvY29kZT4gaXMgY2FsbGVkOyBjb25zZXF1ZW50bHksIHN1YmNsYXNzZXMgbXVzdCBleHRlbmQKLSAqIDxjb2RlPmNyZWF0ZUNvbnRyb2w8L2NvZGU+IHRvIGNvbmZpZ3VyZSB0aGUgdHJlZSB2aWV3ZXIgd2l0aCBhIHByb3BlciBjb250ZW50IAotICogcHJvdmlkZXIsIGxhYmVsIHByb3ZpZGVyLCBhbmQgaW5wdXQgZWxlbWVudC4KLSAqIDwvcD4KLSAqIDxwPgotICogTm90ZSB0aGF0IHRob3NlIHdhbnRpbmcgdG8gdXNlIGEgY29udHJvbCBvdGhlciB0aGFuIGludGVybmFsbHkgY3JlYXRlZAotICogPGNvZGU+VHJlZVZpZXdlcjwvY29kZT4gd2lsbCBuZWVkIHRvIGltcGxlbWVudCAKLSAqIDxjb2RlPklDb250ZW50T3V0bGluZVBhZ2U8L2NvZGU+IGRpcmVjdGx5IHJhdGhlciB0aGFuIHN1YmNsYXNzaW5nIHRoaXMgY2xhc3MuCi0gKiA8L3A+IAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgUGFnZSBpbXBsZW1lbnRzCi0gICAgICAgIElDb250ZW50T3V0bGluZVBhZ2UsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotICAgIHByaXZhdGUgTGlzdGVuZXJMaXN0IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBjb250ZW50IG91dGxpbmUgcGFnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udGVudE91dGxpbmVQYWdlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVNlbGVjdGlvblByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+Q29udGVudE91dGxpbmVQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPklDb250ZW50T3V0bGluZVBhZ2U8L2NvZGU+IG1ldGhvZCBjcmVhdGVzIGEgdHJlZSB2aWV3ZXIuIFN1YmNsYXNzZXMKLSAgICAgKiBtdXN0IGV4dGVuZCB0aGlzIG1ldGhvZCBjb25maWd1cmUgdGhlIHRyZWUgdmlld2VyIHdpdGggYSBwcm9wZXIgY29udGVudCAKLSAgICAgKiBwcm92aWRlciwgbGFiZWwgcHJvdmlkZXIsIGFuZCBpbnB1dCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMCi0gICAgICAgICAgICAgICAgfCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICB0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaXJlcyBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgbmV3IHNlbGVjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVTZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhbiBldmVudAotICAgICAgICBmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsCi0gICAgICAgICAgICAgICAgc2VsZWN0aW9uKTsKLQotICAgICAgICAvLyBmaXJlIHRoZSBldmVudAotICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnMgPSBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLSAgICAgICAgICAgIFBsYXRmb3JtLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgbC5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVBhZ2UgKGFuZCBQYWdlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotICAgICAgICBpZiAodHJlZVZpZXdlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiB0cmVlVmlld2VyLmdldENvbnRyb2woKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElTZWxlY3Rpb25Qcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIGlmICh0cmVlVmlld2VyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLSAgICAgICAgcmV0dXJuIHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHBhZ2UncyB0cmVlIHZpZXdlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhpcyBwYWdlJ3MgdHJlZSB2aWV3ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAotICAgICAqICAgPGNvZGU+Y3JlYXRlQ29udHJvbDwvY29kZT4gaGFzIG5vdCBiZWVuIGNhbGxlZCB5ZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkgewotICAgICAgICByZXR1cm4gdHJlZVZpZXdlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlQm9va1ZpZXdQYWdlI2luaXQob3JnLmVjbGlwc2UudWkucGFydC5JUGFnZVNpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJUGFnZVNpdGUgcGFnZVNpdGUpIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYWdlU2l0ZSk7Ci0gICAgICAgIHBhZ2VTaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVNlbGVjdGlvblByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLSAgICAgICAgICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyLgotICAgICAqIEdpdmVzIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSB0cmVlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBmaXJlU2VsZWN0aW9uQ2hhbmdlZChldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBmb2N1cyB0byBhIHBhcnQgaW4gdGhlIHBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU2VsZWN0aW9uUHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGlmICh0cmVlVmlld2VyICE9IG51bGwpCi0gICAgICAgICAgICB0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0lDb250ZW50T3V0bGluZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0lDb250ZW50T3V0bGluZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4ZWM2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9jb250ZW50b3V0bGluZS9JQ29udGVudE91dGxpbmVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlOwotCi0vKioKLSAqIE1hcmtlci1zdHlsZSBpbnRlcmZhY2UgZm9yIGEgY29udGVudCBvdXRsaW5lIHBhZ2UuIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMKLSAqIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50IGZvciBwYWdlcyB3aXRoaW4gdGhlIGNvbnRlbnQgb3V0bGluZSB2aWV3LCBuYW1lbHkKLSAqIHRoZXkgbXVzdCBiZSBwYWdlcyAoaW1wbGVtZW50IDxjb2RlPklQYWdlPC9jb2RlPikgYW5kIHByb3ZpZGUgc2VsZWN0aW9ucwotICogKGltcGxlbWVudCA8Y29kZT5JU2VsZWN0aW9uUHJvdmlkZXI8L2NvZGU+KS4KLSAqIDxwPgotICogQWNjZXNzIHRvIGEgY29udGVudCBvdXRsaW5lIHBhZ2UgYmVnaW5zIHdoZW4gYW4gZWRpdG9yIGlzIGFjdGl2YXRlZC4gV2hlbgotICogYWN0aXZhdGlvbiBvY2N1cnMsIHRoZSBjb250ZW50IG91dGxpbmUgdmlldyB3aWxsIGFzayB0aGUgZWRpdG9yIGZvciBpdHMKLSAqIGNvbnRlbnQgb3V0bGluZSBwYWdlLiBUaGlzIGlzIGRvbmUgYnkgaW52b2tpbmcgCi0gKiA8Y29kZT5nZXRBZGFwdGVyKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpPC9jb2RlPiBvbiB0aGUgZWRpdG9yLiAgCi0gKiBJZiB0aGUgZWRpdG9yIHJldHVybnMgYSBwYWdlLCB0aGUgdmlldyB0aGVuIGNyZWF0ZXMgdGhlIGNvbnRyb2xzIGZvciB0aGF0Ci0gKiBwYWdlICh1c2luZyA8Y29kZT5jcmVhdGVDb250cm9sPC9jb2RlPikgYW5kIG1ha2VzIHRoZSBwYWdlIHZpc2libGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBmcm9tIHNjcmF0Y2gsIG9yIHN1YmNsYXNzIHRoZQotICogYWJzdHJhY3QgYmFzZSBjbGFzcyA8Y29kZT5Db250ZW50T3V0bGluZVBhZ2U8L2NvZGU+LgotICogPC9wPgotICogPHA+IAotICogTm90ZSB0aGF0IHRoaXMgaW50ZXJmYWNlIGV4dGVuZHMgPGNvZGU+SVNlbGVjdGlvblByb3ZpZGVyPC9jb2RlPi4KLSAqIFRoaXMgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGluIHRoZSBjYXNlIG9mIGltcGxlbWVudG9ycyB3aG8gYWxzbyAKLSAqIGltcGxlbWVudCA8Y29kZT5JUGFnZUJvb2tWaWV3UGFnZTwvY29kZT4gKG9yIGV4dGVuZCA8Y29kZT5QYWdlPC9jb2RlPikKLSAqIGFzIHRoZXkgYXJlIG5vdyBwYXNzZWQgYW4gPGNvZGU+SVBhZ2VTaXRlPC9jb2RlPiBkdXJpbmcgdGhlaXIgaW5pdGlhbGl6YXRpb24gCi0gKiBhbmQgdGhpcyBzaXRlIGNhbiBiZSBjb25maWd1cmVkIHdpdGggYSBzZWxlY3Rpb24gcHJvdmlkZXIuIAotICogSG93ZXZlciB0byBhdm9pZCBhIGJyZWFraW5nIGNoYW5nZSAKLSAqICAxKSB0aGlzIGludGVyZmFjZSB3aWxsIGNvbnRpbnVlIHRvIGV4dGVuZCBJU2VsZWN0aW9uUHJvdmlkZXIgCi0gKiAgMikgaWYgYW4gSUNvbnRlbnRPdXRsaW5lUGFnZSBkb2VzIG5vdCBzZXQgYSBzZWxlY3Rpb24gcHJvdmlkZXIgZm9yIGl0cyAKLSAqIHNpdGUsIHRoZSBDb250ZW50T3V0bGluZSB3aWxsIGNvbnRpbnVlIHRvIHVzZSB0aGUgcGFnZSBpdHNlbGYgZm9yIAotICogdGhpcyBwdXJwb3NlLiAKLSAqIDwvcD4gCi0gKgotICogQHNlZSBDb250ZW50T3V0bGluZVBhZ2UKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgSVBhZ2UsIElTZWxlY3Rpb25Qcm92aWRlciB7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9jb250ZW50b3V0bGluZS9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9jb250ZW50b3V0bGluZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZDIxNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvY29udGVudG91dGxpbmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBzdGFuZGFyZCBDb250ZW50IE91dGxpbmUgdmlldyB3aGljaCBjYW4KLXNob3cgdGhlIGFjdGl2ZSBlZGl0b3IncyBjdXN0b20gb3V0bGluZSBmb3IgdGhlIGRvY3VtZW50IGJlaW5nIGVkaXRlZC4KLTxicj4mbmJzcDsKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvQ2F0ZWdvcmllc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9DYXRlZ29yaWVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOTQ5ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9DYXRlZ29yaWVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhpcyBhY3Rpb24gaGlkZXMgb3Igc2hvd3MgY2F0ZWdvcmllcyBpbiB0aGUgPGNvZGU+UHJvcGVydHlTaGVldFZpZXdlcjwvY29kZT4uCi0gKi8KLS8qcGFja2FnZSovY2xhc3MgQ2F0ZWdvcmllc0FjdGlvbiBleHRlbmRzIFByb3BlcnR5U2hlZXRBY3Rpb24gewotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIENhdGVnb3JpZXMgYWN0aW9uLiBUaGlzIGFjdGlvbiBpcyB1c2VkIHRvIHNob3cKLSAgICAgKiBvciBoaWRlIGNhdGVnb3JpZXMgcHJvcGVydGllcy4KLSAgICAgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBDYXRlZ29yaWVzQWN0aW9uKFByb3BlcnR5U2hlZXRWaWV3ZXIgdmlld2VyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcih2aWV3ZXIsIG5hbWUpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKQotICAgICAgICAgICAgICAgIC5zZXRIZWxwKHRoaXMsIElQcm9wZXJ0aWVzSGVscENvbnRleHRJZHMuQ0FURUdPUklFU19BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvZ2dsZXMgdGhlIGRpc3BsYXkgb2YgY2F0ZWdvcmllcyBmb3IgdGhlIHByb3BlcnRpZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBQcm9wZXJ0eVNoZWV0Vmlld2VyIHBzID0gZ2V0UHJvcGVydHlTaGVldCgpOwotICAgICAgICBwcy5kZWFjdGl2YXRlQ2VsbEVkaXRvcigpOwotICAgICAgICBpZiAoaXNDaGVja2VkKCkpIHsKLSAgICAgICAgICAgIHBzLnNob3dDYXRlZ29yaWVzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcy5oaWRlQ2F0ZWdvcmllcygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9Db2xvclByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9Db2xvclByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhjYmViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvQ29sb3JQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sb3JDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBEZXNjcmlwdG9yIGZvciBhIHByb3BlcnR5IHRoYXQgaGFzIGEgY29sb3IgdmFsdWUgd2hpY2ggc2hvdWxkIGJlIGVkaXRlZAotICogd2l0aCBhIGNvbG9yIGNlbGwgZWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogPHA+Ci0gKiBFeGFtcGxlOgotICogPHByZT4KLSAqIElQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBuZXcgQ29sb3JQcm9wZXJ0eURlc2NyaXB0b3IoImZnIiwgIkZvcmVncm91bmQgQ29sb3IiKTsKLSAqIDwvcHJlPgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ29sb3JQcm9wZXJ0eURlc2NyaXB0b3IgZXh0ZW5kcyBQcm9wZXJ0eURlc2NyaXB0b3IgewotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlbiBpZCBhbmQgZGlzcGxheSBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogQHBhcmFtIGRpc3BsYXlOYW1lIHRoZSBuYW1lIHRvIGRpc3BsYXkgZm9yIHRoZSBwcm9wZXJ0eQotICAgICAqLwotICAgIHB1YmxpYyBDb2xvclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSkgewotICAgICAgICBzdXBlcihpZCwgZGlzcGxheU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db2xvclByb3BlcnR5RGVzY3JpcHRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5JUHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPiBtZXRob2QgY3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldwotICAgICAqIDxjb2RlPkNvbG9yQ2VsbEVkaXRvcjwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogVGhlIGVkaXRvciBpcyBjb25maWd1cmVkIHdpdGggdGhlIGN1cnJlbnQgdmFsaWRhdG9yIGlmIHRoZXJlIGlzIG9uZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIENlbGxFZGl0b3IgY3JlYXRlUHJvcGVydHlFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDZWxsRWRpdG9yIGVkaXRvciA9IG5ldyBDb2xvckNlbGxFZGl0b3IocGFyZW50KTsKLSAgICAgICAgaWYgKGdldFZhbGlkYXRvcigpICE9IG51bGwpCi0gICAgICAgICAgICBlZGl0b3Iuc2V0VmFsaWRhdG9yKGdldFZhbGlkYXRvcigpKTsKLSAgICAgICAgcmV0dXJuIGVkaXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0NvbWJvQm94TGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9Db21ib0JveExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiMjdlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0NvbWJvQm94TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQW4gPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+IHRoYXQgYXNzaXN0cyBpbiByZW5kZXJpbmcgbGFiZWxzIGZvciAKLSAqIDxjb2RlPkNvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yczwvY29kZT4uICBUaGUgbGFiZWwgZm9yIGEgZ2l2ZW4gCi0gKiA8Y29kZT5JbnRlZ2VyPC9jb2RlPiB2YWx1ZSBpcyB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBhdCB0aGUgdmFsdWUgaW4gCi0gKiB0aGUgcHJvdmlkZWQgdmFsdWVzIGFycmF5LiAgCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIENvbWJvQm94TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0gICAgLyoqCi0gICAgICogVGhlIGFycmF5IG9mIFN0cmluZyBsYWJlbHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSB2YWx1ZXM7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmFsdWVzIHRoZSBwb3NzaWJsZSBsYWJlbCB2YWx1ZXMgdGhhdCB0aGlzIAotICAgICAqIDxjb2RlPklMYWJlbFByb3ZpZGVyPC9jb2RlPiBtYXkgcmV0dXJuLgotICAgICAqLwotICAgIHB1YmxpYyBDb21ib0JveExhYmVsUHJvdmlkZXIoU3RyaW5nW10gdmFsdWVzKSB7Ci0gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHBvc3NpYmxlIGxhYmVsIHZhbHVlcyB0aGF0IHRoaXMgCi0gICAgICogPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+IG1heSByZXR1cm4uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmFsdWVzIHRoZSBwb3NzaWJsZSBsYWJlbCB2YWx1ZXMgdGhhdCB0aGlzIAotICAgICAqIDxjb2RlPklMYWJlbFByb3ZpZGVyPC9jb2RlPiBtYXkgcmV0dXJuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhTdHJpbmdbXSB2YWx1ZXMpIHsKLSAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGF0IG1hcHMgdG8gdGhlIGdpdmVuIAotICAgICAqIDxjb2RlPkludGVnZXI8L2NvZGU+IG9mZnNldCBpbiB0aGUgdmFsdWVzIGFycmF5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IGFuIDxjb2RlPkludGVnZXI8L2NvZGU+IG9iamVjdCB3aG9zZSB2YWx1ZSBpcyBhIHZhbGlkIAotICAgICAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgdmFsdWVzIGFycmF5IG9mIHRoZSByZWNlaXZlcgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGZyb20gdGhlIHByb3ZpZGVkIHZhbHVlcyBhcnJheSwgb3IgdGhlIAotICAgICAqIGVtcHR5IDxjb2RlPlN0cmluZzwvY29kZT4gCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9ICgoSW50ZWdlcikgZWxlbWVudCkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdmFsdWVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbaW5kZXhdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiYTlmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0NvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERlc2NyaXB0b3IgZm9yIGEgcHJvcGVydHkgdGhhdCBoYXMgYSB2YWx1ZSB3aGljaCBzaG91bGQgYmUgZWRpdGVkCi0gKiB3aXRoIGEgY29tYm8gYm94IGNlbGwgZWRpdG9yLiAgVGhpcyBjbGFzcyBwcm92aWRlcyBhIGRlZmF1bHQgCi0gKiA8Y29kZT5JTGFiZWxQcm92aWRlcjwvY29kZT4gdGhhdCB3aWxsIHJlbmRlciB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIAotICogZGVzY3JpcHRvciBhcyB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBmb3VuZCBpbiB0aGUgbGFiZWxzIGFycmF5IGF0IHRoZSAKLSAqIGN1cnJlbnRseSBzZWxlY3RlZCBpbmRleC4KLSAqIDxwPgotICogVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpcyBhIDAtYmFzZWQgPGNvZGU+SW50ZWdlcjwvY29kZT4gaW5kZXggaW50bwotICogdGhlIGxhYmVscyBhcnJheS4gCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEV4YW1wbGU6Ci0gKiA8cHJlPgotICogU3RyaW5nW10gdmFsdWVzID0geyJUb3AgbGVmdCIsICJUb3AgcmlnaHQiLCAiQm90dG9tIGxlZnQiLCAiQm90dG9tIHJpZ2h0In07Ci0gKiBJUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gbmV3IENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKCJvcmlnaW4iLCAiT3JpZ2luIiwgdmFsdWVzKTsKLSAqIDwvcHJlPgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgZXh0ZW5kcyBQcm9wZXJ0eURlc2NyaXB0b3IgewotCi0gICAgLyoqCi0gICAgICogVGhlIGxhYmVscyB0byBkaXNwbGF5IGluIHRoZSBjb21ibyBib3gKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGxhYmVsczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlbiBpZCwgZGlzcGxheSBuYW1lLCBhbmQgbGlzdAotICAgICAqIG9mIHZhbHVlIGxhYmVscyB0byBkaXNwbGF5IGluIHRoZSBjb21ibyBib3ggY2VsbCBlZGl0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gZGlzcGxheU5hbWUgdGhlIG5hbWUgdG8gZGlzcGxheSBmb3IgdGhlIHByb3BlcnR5Ci0gICAgICogQHBhcmFtIGxhYmVsc0FycmF5IHRoZSBsYWJlbHMgdG8gZGlzcGxheSBpbiB0aGUgY29tYm8gYm94Ci0gICAgICovCi0gICAgcHVibGljIENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBpZCwgU3RyaW5nIGRpc3BsYXlOYW1lLAotICAgICAgICAgICAgU3RyaW5nW10gbGFiZWxzQXJyYXkpIHsKLSAgICAgICAgc3VwZXIoaWQsIGRpc3BsYXlOYW1lKTsKLSAgICAgICAgbGFiZWxzID0gbGFiZWxzQXJyYXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkNvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPklQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IG1ldGhvZCBjcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3Ci0gICAgICogPGNvZGU+Q29tYm9Cb3hDZWxsRWRpdG9yPC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZWRpdG9yIGlzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgY3VycmVudCB2YWxpZGF0b3IgaWYgdGhlcmUgaXMgb25lLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENlbGxFZGl0b3IgZWRpdG9yID0gbmV3IENvbWJvQm94Q2VsbEVkaXRvcihwYXJlbnQsIGxhYmVscywKLSAgICAgICAgICAgICAgICBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgaWYgKGdldFZhbGlkYXRvcigpICE9IG51bGwpCi0gICAgICAgICAgICBlZGl0b3Iuc2V0VmFsaWRhdG9yKGdldFZhbGlkYXRvcigpKTsKLSAgICAgICAgcmV0dXJuIGVkaXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+Q29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+SVByb3BlcnR5RGVzY3JpcHRvcjwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIHZhbHVlIHNldCBieQotICAgICAqIHRoZSA8Y29kZT5zZXRQcm92aWRlcjwvY29kZT4gbWV0aG9kIG9yLCBpZiBubyB2YWx1ZSBoYXMgYmVlbiBzZXQKLSAgICAgKiBpdCByZXR1cm5zIGEgPGNvZGU+Q29tYm9Cb3hMYWJlbFByb3ZpZGVyPC9jb2RlPiBjcmVhdGVkIGZyb20gdGhlIAotICAgICAqIHZhbHVlc0FycmF5IG9mIHRoaXMgPGNvZGU+Q29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+LgotICAgICAqCi0gICAgICogQHNlZSAjc2V0TGFiZWxQcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotICAgICAgICBpZiAoaXNMYWJlbFByb3ZpZGVyU2V0KCkpCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFiZWxQcm92aWRlcigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbmV3IENvbWJvQm94TGFiZWxQcm92aWRlcihsYWJlbHMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvQ29weVByb3BlcnR5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0NvcHlQcm9wZXJ0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2NmNTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvQ29weVByb3BlcnR5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnRpZXNNZXNzYWdlczsKLQotLyoqCi0gKiBDb3BpZXMgYSBwcm9wZXJ0eSB0byB0aGUgY2xpcGJvYXJkLgotICovCi0vKnBhY2thZ2UqL2NsYXNzIENvcHlQcm9wZXJ0eUFjdGlvbiBleHRlbmRzIFByb3BlcnR5U2hlZXRBY3Rpb24gewotICAgIC8qKgotICAgICAqIFN5c3RlbSBjbGlwYm9hcmQKLSAgICAgKi8KLSAgICBwcml2YXRlIENsaXBib2FyZCBjbGlwYm9hcmQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHZpZXdlciB0aGUgdmlld2VyCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKLSAgICAgKiBAcGFyYW0gY2xpcGJvYXJkIHRoZSBjbGlwYm9hcmQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29weVByb3BlcnR5QWN0aW9uKFByb3BlcnR5U2hlZXRWaWV3ZXIgdmlld2VyLCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgIENsaXBib2FyZCBjbGlwYm9hcmQpIHsKLSAgICAgICAgc3VwZXIodmlld2VyLCBuYW1lKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLAotICAgICAgICAgICAgICAgIElQcm9wZXJ0aWVzSGVscENvbnRleHRJZHMuQ09QWV9QUk9QRVJUWV9BQ1RJT04pOwotICAgICAgICB0aGlzLmNsaXBib2FyZCA9IGNsaXBib2FyZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGlzIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIC8vIEdldCB0aGUgc2VsZWN0ZWQgcHJvcGVydHkKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRQcm9wZXJ0eVNoZWV0KCkKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvLyBBc3N1bWUgc2luZ2xlIHNlbGVjdGlvbgotICAgICAgICBJUHJvcGVydHlTaGVldEVudHJ5IGVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgIC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAvLyBQbGFjZSB0ZXh0IG9uIHRoZSBjbGlwYm9hcmQKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChlbnRyeS5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWZmZXIuYXBwZW5kKGVudHJ5LmdldFZhbHVlQXNTdHJpbmcoKSk7Ci0KLSAgICAgICAgc2V0Q2xpcGJvYXJkKGJ1ZmZlci50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogVXBkYXRlcyBlbmFibGVtZW50IGJhc2VkIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VsIHRoZSBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCkgewotICAgICAgICBzZXRFbmFibGVkKCFzZWwuaXNFbXB0eSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0Q2xpcGJvYXJkKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3RbXSBkYXRhID0gbmV3IE9iamVjdFtdIHsgdGV4dCB9OwotICAgICAgICAgICAgVHJhbnNmZXJbXSB0cmFuc2ZlclR5cGVzID0gbmV3IFRyYW5zZmVyW10geyBUZXh0VHJhbnNmZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCkgfTsKLSAgICAgICAgICAgIGNsaXBib2FyZC5zZXRDb250ZW50cyhkYXRhLCB0cmFuc2ZlclR5cGVzKTsKLSAgICAgICAgfSBjYXRjaCAoU1dURXJyb3IgZSkgewotICAgICAgICAgICAgaWYgKGUuY29kZSAhPSBETkQuRVJST1JfQ0FOTk9UX1NFVF9DTElQQk9BUkQpCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIGlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRQcm9wZXJ0eVNoZWV0KCkuZ2V0Q29udHJvbCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTaGVsbCgpLCBQcm9wZXJ0aWVzTWVzc2FnZXMuQ29weVRvQ2xpcGJvYXJkUHJvYmxlbURpYWxvZ190aXRsZSwKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllc01lc3NhZ2VzLkNvcHlUb0NsaXBib2FyZFByb2JsZW1EaWFsb2dfbWVzc2FnZSkpCi0gICAgICAgICAgICAgICAgc2V0Q2xpcGJvYXJkKHRleHQpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0RlZmF1bHRzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0RlZmF1bHRzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNGNjMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9EZWZhdWx0c0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhpcyBhY3Rpb24gcmVzZXRzIHRoZSA8Y29kZT5Qcm9wZXJ0eVNoZWV0Vmlld2VyPC9jb2RlPiB2YWx1ZXMgYmFjawotICogdG8gdGhlIGRlZmF1bHQgdmFsdWVzLgotICoKLSAqIFtJc3N1ZTogc2hvdWxkIGxpc3RlbiBmb3Igc2VsZWN0aW9uIGNoYW5nZXMgaW4gdGhlIHZpZXdlciBhbmQgc2V0IGVuYWJsZW1lbnRdCi0gKi8KLS8qcGFja2FnZSovY2xhc3MgRGVmYXVsdHNBY3Rpb24gZXh0ZW5kcyBQcm9wZXJ0eVNoZWV0QWN0aW9uIHsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIERlZmF1bHRzIGFjdGlvbi4gVGhpcyBhY3Rpb24gaXMgdXNlZCB0byBzZXQKLSAgICAgKiB0aGUgcHJvcGVydGllcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2aWV3ZXIgdGhlIHZpZXdlcgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRzQWN0aW9uKFByb3BlcnR5U2hlZXRWaWV3ZXIgdmlld2VyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcih2aWV3ZXIsIG5hbWUpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsCi0JCQkJSVByb3BlcnRpZXNIZWxwQ29udGV4dElkcy5ERUZBVUxUU19BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2V0IHRoZSBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgZ2V0UHJvcGVydHlTaGVldCgpLmRlYWN0aXZhdGVDZWxsRWRpdG9yKCk7Ci0gICAgICAgIGdldFByb3BlcnR5U2hlZXQoKS5yZXNldFByb3BlcnRpZXMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0ZpbHRlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9GaWx0ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljMzQ0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0ZpbHRlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhpcyBhY3Rpb24gaGlkZXMgb3Igc2hvd3MgZXhwZXJ0IHByb3BlcnRpZXMgaW4gdGhlIDxjb2RlPlByb3BlcnR5U2hlZXRWaWV3ZXI8L2NvZGU+LgotICovCi0vKnBhY2thZ2UqL2NsYXNzIEZpbHRlckFjdGlvbiBleHRlbmRzIFByb3BlcnR5U2hlZXRBY3Rpb24gewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgRmlsdGVyIGFjdGlvbi4gVGhpcyBhY3Rpb24gaXMgdXNlZCB0byBzaG93Ci0gICAgICogb3IgaGlkZSBleHBlcnQgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBGaWx0ZXJBY3Rpb24oUHJvcGVydHlTaGVldFZpZXdlciB2aWV3ZXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKHZpZXdlciwgbmFtZSk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywKLQkJCQlJUHJvcGVydGllc0hlbHBDb250ZXh0SWRzLkZJTFRFUl9BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvZ2dsZSB0aGUgZGlzcGxheSBvZiBleHBlcnQgcHJvcGVydGllcy4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgUHJvcGVydHlTaGVldFZpZXdlciBwcyA9IGdldFByb3BlcnR5U2hlZXQoKTsKLSAgICAgICAgcHMuZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLSAgICAgICAgaWYgKGlzQ2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICBwcy5zaG93RXhwZXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcy5oaWRlRXhwZXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lDZWxsRWRpdG9yQWN0aXZhdGlvbkxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lDZWxsRWRpdG9yQWN0aXZhdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YzMzNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9JQ2VsbEVkaXRvckFjdGl2YXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci0KLS8qKgotICogQSBsaXN0ZW5lciB3aGljaCBpcyBub3RpZmllZCB3aGVuIGEgY2VsbCBlZGl0b3IgaXMgCi0gKiBhY3RpdmF0ZWQvZGVhY3RpdmF0ZWQKLSAqLwotLypwYWNrYWdlKi9pbnRlcmZhY2UgSUNlbGxFZGl0b3JBY3RpdmF0aW9uTGlzdGVuZXIgewotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoYXQgdGhlIGNlbGwgZWRpdG9yIGhhcyBiZWVuIGFjdGl2YXRlZAotICAgICAqCi0gICAgICogQHBhcmFtIGNlbGxFZGl0b3IgdGhlIGNlbGwgZWRpdG9yIHdoaWNoIGhhcyBiZWVuIGFjdGl2YXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNlbGxFZGl0b3JBY3RpdmF0ZWQoQ2VsbEVkaXRvciBjZWxsRWRpdG9yKTsKLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoYXQgdGhlIGNlbGwgZWRpdG9yIGhhcyBiZWVuIGRlYWN0aXZhdGVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2VsbEVkaXRvciB0aGUgY2VsbCBlZGl0b3Igd2hpY2ggaGFzIGJlZW4gZGVhY3RpdmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjZWxsRWRpdG9yRGVhY3RpdmF0ZWQoQ2VsbEVkaXRvciBjZWxsRWRpdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvSVByb3BlcnRpZXNIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9JUHJvcGVydGllc0hlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzQzM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9JUHJvcGVydGllc0hlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIHByb3BlcnRpZXMgdmlldy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZAotICogb3IgZXh0ZW5kZWQuCi0gKiA8L3A+Ci0gKiAKLSAqLwotLypwYWNrYWdlKi9pbnRlcmZhY2UgSVByb3BlcnRpZXNIZWxwQ29udGV4dElkcyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gUGxhdGZvcm1VSS5QTFVHSU5fSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIEFjdGlvbnMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SSUVTX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAicHJvcGVydGllc19jYXRlZ29yaWVzX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVFNfQUNUSU9OID0gUFJFRklYCi0gICAgICAgICAgICArICJwcm9wZXJ0aWVzX2RlZmF1bHRzX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAicHJvcGVydGllc19maWx0ZXJfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZX1BST1BFUlRZX0FDVElPTiA9IFBSRUZJWAotICAgICAgICAgICAgKyAicHJvcGVydGllc19jb3B5X2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVmlld3MKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TSEVFVF9WSUVXID0gUFJFRklYCi0gICAgICAgICAgICArICJwcm9wZXJ0eV9zaGVldF92aWV3X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvSVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODA0YTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvSVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgZGVzY3JpcHRvciBmb3IgYSBwcm9wZXJ0eSB0byBiZSBwcmVzZW50ZWQgYnkgYSBzdGFuZGFyZCBwcm9wZXJ0eSBzaGVldCBwYWdlCi0gKiAoPGNvZGU+UHJvcGVydHlTaGVldFBhZ2U8L2NvZGU+KS4gVGhlc2UgZGVzY3JpcHRvcnMgb3JpZ2luYXRlIHdpdGggcHJvcGVydHkgCi0gKiBzb3VyY2VzICg8Y29kZT5JUHJvcGVydHlTb3VyY2U8L2NvZGU+KS4KLSAqIDxwPgotICogQSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGNhcnJpZXMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKLSAqIDx1bD4KLSAqICAgPGxpPnByb3BlcnR5IGlkIChyZXF1aXJlZCk8L2xpPgotICogICA8bGk+ZGlzcGxheSBuYW1lIChyZXF1aXJlZCk8L2xpPgotICogICA8bGk+YnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5IChvcHRpb25hbCk8L2xpPgotICogICA8bGk+Y2F0ZWdvcnkgZm9yIGdyb3VwaW5nIHJlbGF0ZWQgcHJvcGVydGllcyAob3B0aW9uYWwpPC9saT4KLSAqICAgPGxpPmxhYmVsIHByb3ZpZGVyIHVzZWQgdG8gZGlzcGxheSB0aGUgcHJvcGVydHkgdmFsdWUgKG9wdGlvbmFsKTwvbGk+Ci0gKiAgIDxsaT5jZWxsIGVkaXRvciBmb3IgY2hhbmdpbmcgdGhlIHByb3BlcnR5IHZhbHVlIChvcHRpb25hbCk8L2xpPgotICogICA8bGk+aGVscCBjb250ZXh0IGlkIChvcHRpb25hbCk8L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIHByb3ZpZGUgc3BlY2lhbGl6ZWQgcHJvcGVydHkgCi0gKiBkZXNjcmlwdG9yczsgaG93ZXZlciwgdGhlcmUgYXJlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBkZWNsYXJlZCBpbgotICogdGhpcyBwYWNrYWdlIHRoYXQgdGFrZSBjYXJlIG9mIHRoZSBtb3N0IGNvbW1vbiBjYXNlczoKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPlByb3BlcnR5RGVzY3JpcHRvciAtIHJlYWQtb25seSBwcm9wZXJ0eTwvbGk+Ci0gKiAgIDxsaT48Y29kZT5UZXh0UHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPiAtIGVkaXRzIHdpdGggYSAKLSAqICAgICAgPGNvZGU+VGV4dENlbGxFZGl0b3I8L2NvZGU+PC9saT4KLSAqICAgPGxpPjxjb2RlPkNoZWNrYm94UHJvcGVydHlEZXNjcmlwdG9yIC0gZWRpdHMgd2l0aCBhIAotICogICAgICA8Y29kZT5DaGVja2JveENlbGxFZGl0b3I8L2NvZGU+PC9jb2RlPjwvbGk+Ci0gKiAgIDxsaT48Y29kZT5Db21ib0JveFByb3BlcnR5RGVzY3JpcHRvciAtIGVkaXRzIHdpdGggYQotICogICAgICA8Y29kZT5Db21ib0JveENlbGxFZGl0b3I8L2NvZGU+PC9jb2RlPjwvbGk+Ci0gKiAgIDxsaT48Y29kZT5Db2xvclByb3BlcnR5RGVzY3JpcHRvciAtIGVkaXRzIHdpdGggYSAKLSAqICAgICAgPGNvZGU+Q29sb3JDZWxsRWRpdG9yPC9jb2RlPjwvY29kZT48L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIElQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5RGVzY3JpcHRvciB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBjZWxsIGVkaXRvciBmb3IgZWRpdGluZyB0aGlzIHByb3BlcnR5LiBSZXR1cm5zIAotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZWRpdGFibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgd2lkZ2V0IGZvciB0aGUgY2VsbCBlZGl0b3IKLSAgICAgKiBAcmV0dXJuIHRoZSBjZWxsIGVkaXRvciBmb3IgdGhpcyBwcm9wZXJ0eSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcwotICAgICAqICBwcm9wZXJ0eSBjYW5ub3QgYmUgZWRpdGVkCi0gICAgICovCi0gICAgcHVibGljIENlbGxFZGl0b3IgY3JlYXRlUHJvcGVydHlFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHByb3BlcnR5IGJlbG9uZ3MuIFByb3BlcnRpZXMKLSAgICAgKiBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgY2F0ZWdvcnkgYXJlIGdyb3VwZWQgdG9nZXRoZXIgdmlzdWFsbHkuIFRoaXMgbG9jYWxpemVkIAotICAgICAqIHN0cmluZyBpcyBzaG93biB0byB0aGUgdXNlcgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNhdGVnb3J5IG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkZWZhdWx0IGNhdGVnb3J5IGlzIHRvCi0gICAgICogICBiZSB1c2VkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuIFRoaXMgbG9jYWxpemVkIHN0cmluZyBpcyBzaG93biAKLSAgICAgKiB0byB0aGUgdXNlciB3aGVuIHRoaXMgcHJvcGVydHkgaXMgc2VsZWN0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGJyaWVmIGRlc2NyaXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lIGZvciB0aGlzIHByb3BlcnR5LiBUaGlzIGxvY2FsaXplZCBzdHJpbmcgaXMgc2hvd24gdG8KLSAgICAgKiB0aGUgdXNlciBhcyB0aGUgbmFtZSBvZiB0aGlzIHByb3BlcnR5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZmlsdGVyIHR5cGVzIHRvIHdoaWNoIHRoaXMgcHJvcGVydHkgYmVsb25ncy4KLSAgICAgKiBUaGUgdXNlciBpcyBhYmxlIHRvIHRvZ2dsZSB0aGUgZmlsdGVycyB0byBzaG93L2hpZGUgcHJvcGVydGllcyBiZWxvbmdpbmcgdG8KLSAgICAgKiBhIGZpbHRlciB0eXBlLgotICAgICAqIDxwPgotICAgICAqIFZhbGlkIHZhbHVlcyBmb3IgdGhlc2UgZmxhZ3MgYXJlIGRlY2xhcmVkIGFzIGNvbnN0YW50cyBvbiAKLSAgICAgKiAgPGNvZGU+SVByb3BlcnR5U2hlZXRFbnRyeTwvY29kZT4KLSAgICAgKiA8L3A+IAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGZpbHRlciB0eXBlcyB0byB3aGljaCB0aGlzIHByb3BlcnR5IGJlbG9uZ3MsIG9yCi0gICAgICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEZpbHRlckZsYWdzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoZWxwIGNvbnRleHQgaWQgZm9yIHRoaXMgcHJvcGVydHkgb3IgCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgbm8gaGVscCBjb250ZXh0IGlkLgotICAgICAqIDxwPgotICAgICAqIE5PVEU6IEhlbHAgc3VwcG9ydCBzeXN0ZW0gQVBJJ3MgY2hhbmdlZCBzaW5jZSAyLjAgYW5kIGFycmF5cwotICAgICAqIG9mIGNvbnRleHRzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaHVzIHRoZSBvbmx5IHZhbGlkIG5vbi08Y29kZT5udWxsPC9jb2RlPiByZXR1cm4gdHlwZSBmb3IgdGhpcyBtZXRob2QKLSAgICAgKiBpcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50aW5nIGEgY29udGV4dCBpZC4gVGhlIHByZXZpb3VzbHkKLSAgICAgKiB2YWxpZCByZXR1cm4gdHlwZXMgYXJlIGRlcHJlY2F0ZWQuIFRoZSBwbHVyYWwgbmFtZSBmb3IgdGhpcyBtZXRob2QKLSAgICAgKiBpcyB1bmZvcnR1bmF0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGVscCBjb250ZXh0IGlkIGZvciB0aGlzIGVudHJ5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRIZWxwQ29udGV4dElkcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaWQgZm9yIHRoaXMgcHJvcGVydHkuIFRoaXMgb2JqZWN0IGlzCi0gICAgICogdXNlZCBpbnRlcm5hbGx5IHRvIGRpc3Rpbmd1aXNoIG9uZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIAotICAgICAqIGZyb20gYW5vdGhlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGlkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRJZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoaXMgcHJvcGVydHkuIFRoZSBsYWJlbCBwcm92aWRlciBpcyB1c2VkCi0gICAgICogdG8gb2J0YWluIHRoZSB0ZXh0IChhbmQgcG9zc2libGUgaW1hZ2UpIGZvciBkaXNwbGF5aW5nIHRoZSA8aXQ+dmFsdWU8L2l0PgotICAgICAqIG9mIHRoaXMgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsYWJlbCBwcm92aWRlciB1c2VkIHRvIGRpc3BsYXkgdGhpcyBwcm9wZXJ0eQotICAgICAqLwotICAgIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBkZXNjcmlwdG9yIGFuZCB0aGUgZ2l2ZW4gb25lIGFyZSBjb21wYXRpYmxlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBwcm9wZXJ0eSBzaGVldCB1c2VzIHRoaXMgbWV0aG9kIGR1cmluZyBtdWx0aXBsZSBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lCi0gICAgICogd2hldGhlciB0d28gcHJvcGVydHkgZGVzY3JpcHRvcnMgd2l0aCB0aGUgc2FtZSBpZCBhcmUgaW4gZmFjdCB0aGUgc2FtZSAKLSAgICAgKiBwcm9wZXJ0eSBhbmQgY2FuIGJlIGRpc3BsYXllZCBhcyBhIHNpbmdsZSBlbnRyeSBpbiB0aGUgcHJvcGVydHkgc2hlZXQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGFub3RoZXJQcm9wZXJ0eSB0aGUgb3RoZXIgcHJvcGVydHkgZGVzY3JpcHRvciAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBhcmUgY29tcGF0aWJsZSwgYW5kIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZVdpdGgoSVByb3BlcnR5RGVzY3JpcHRvciBhbm90aGVyUHJvcGVydHkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9JUHJvcGVydHlTaGVldEVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNoZWV0RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3ZmVkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNoZWV0RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIDxjb2RlPklQcm9wZXJ0eVNoZWV0RW50cnk8L2NvZGU+IGRlc2NyaWJlcyB0aGUgbW9kZWwgaW50ZXJmYWNlIGZvciB0aGUKLSAqIHByb3BlcnR5IHNoZWV0LgotICogPHA+Ci0gKiBNYXkgYmUgaW1wbGVtZW50ZWQgd2hlbiBzdXBwbHlpbmcgYSBjdXN0b20gcm9vdCBlbnRyeSB0byBhIHByb3BlcnR5IHBhZ2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5U2hlZXRFbnRyeSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmlsdGVyIGlkIGZvciBleHBlcnQgcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgRklMVEVSX0lEX0VYUEVSVCA9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLmV4cGVydCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGxpc3RlbmVyIHRvIHRoaXMgZW50cnkncyBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lcigKLSAgICAgICAgICAgIElQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBBcHBseSB0aGUgY3VycmVudCBjZWxsIGVkaXRvciB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBseUVkaXRvclZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZW50cnkgaXMgbm8gbG9uZ2VyIG5lZWRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVudHJ5J3MgY2F0ZWdvcnkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZW50cnkncyBjYXRlZ29yeQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoaWxkIGVudHJpZXMgZm9yIHRoaXMgZW50cnkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hpbGQgZW50cmllcyBmb3IgdGhpcyBlbnRyeQotICAgICAqLwotICAgIHB1YmxpYyBJUHJvcGVydHlTaGVldEVudHJ5W10gZ2V0Q2hpbGRFbnRyaWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkgc2hlZXQgZW50cnkuIFR5cGljYWxseSB0aGlzCi0gICAgICogZGVzY3JpcHRpb24gaXMgc2hvd24gaW4gYSBzdGF0dXMgbGluZSB3aGVuIHRoZSBlbnRyeSBpcyBzZWxlY3RlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbnRyeSdzIGRlc2NyaXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSB1c2VkIHRvIGRpc3BsYXkgdGhlIHByb3BlcnR5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgdXNlZCB0byBkaXNwbGF5IHRoZSBwcm9wZXJ0eQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgPGNvZGU+Q2VsbEVkaXRvcjwvY29kZT4gdXNlZCB0byBlZGl0IHRoZSBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IHdpZGdldCBmb3IgdGhlIGVkaXRvcgotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IHVzZWQgdG8gZWRpdCB0aGUgcHJvcGVydHkKLSAgICAgKi8KLSAgICBDZWxsRWRpdG9yIGdldEVkaXRvcihDb21wb3NpdGUgcGFyZW50KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVycm9yIHRleHQgdG8gZGlzcGxheSBpZiB0aGUgdmFsdWUgaXMgaW52YWxpZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlcnJvciB0ZXh0IHRvIGRpc3BsYXkgd2hlbiB0aGUgdmFsdWUgaXMgaW52YWxpZCBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yVGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBmaWx0ZXIgaWRzIHVzZWQgdG8gZ3JvdXAgZW50cmllcyBpbnRvIGxldmVscyBzdWNoIGFzIEV4cGVydC4KLSAgICAgKiBWYWxpZCB2YWx1ZXMgYXJlIGRlZmluZWQgYXMgY29uc3RhbnRzIG9uIHRoaXMgaW50ZXJmYWNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbHRlciBpZHMgdXNlZCB0byBncm91cCBlbnRyaWVzIGludG8gbGV2ZWxzIHN1Y2ggYXMgRXhwZXJ0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRGaWx0ZXJzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoZWxwIGNvbnRleHQgaWQgZm9yIHRoaXMgZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0gICAgICogdGhpcyBlbnRyeSBoYXMgbm8gaGVscCBjb250ZXh0IGlkLgotICAgICAqIDxwPgotICAgICAqIE5PVEU6IEhlbHAgc3VwcG9ydCBzeXN0ZW0gQVBJJ3MgY2hhbmdlZCBzaW5jZSAyLjAgYW5kIGFycmF5cyBvZiBjb250ZXh0cwotICAgICAqIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaHVzIHRoZSBvbmx5IHZhbGlkIG5vbi0gPGNvZGU+bnVsbDwvY29kZT4gcmV0dXJuIHR5cGUgZm9yIHRoaXMgbWV0aG9kCi0gICAgICogaXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGluZyBhIGNvbnRleHQgaWQuIFRoZSBwcmV2aW91c2x5Ci0gICAgICogdmFsaWQgcmV0dXJuIHR5cGVzIGFyZSBkZXByZWNhdGVkLiBUaGUgcGx1cmFsIG5hbWUgZm9yIHRoaXMgbWV0aG9kIGlzCi0gICAgICogdW5mb3J0dW5hdGUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhlbHAgY29udGV4dCBpZCBmb3IgdGhpcyBlbnRyeQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0SGVscENvbnRleHRJZHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGltYWdlIGZvciB0aGUgcHJvcGVydHkgdmFsdWUsIGlmIHRoZXJlIGlzIG9uZS4gVGhpcyBpbWFnZSBpcwotICAgICAqIG1hbmFnZWQgYnkgdGhlIGVudHJ5IGl0IGNhbWUgZnJvbS4gQ2FsbGVycyBvZiB0aGlzIG1ldGhvZCBtdXN0IG5ldmVyCi0gICAgICogZGlzcG9zZSB0aGUgcmV0dXJuZWQgaW1hZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW1hZ2UgZm9yIHRoaXMgcHJvcGVydHkgdmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBvYmplY3RzIGV4cHJlc3NlZCBhcyBhIFN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb2JqZWN0cyBleHByZXNzZWQgYXMgYSBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlQXNTdHJpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGVudHJ5IGhhcyBjaGlsZHJlbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbnRyeSBoYXMgY2hpbGRyZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZEVudHJpZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhpcyBlbnRyeSdzIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lcgotICAgICAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5U2hlZXRFbnRyeUxpc3RlbmVyKAotICAgICAgICAgICAgSVByb3BlcnR5U2hlZXRFbnRyeUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgcHJvcGVydHkgdmFsdWUgdG8gaXRzIGRlZmF1bHQgdmFsdWUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBEb2VzIG5vdGhpbmcgaWYgdGhlIG5vdGlvbiBvZiBhIGRlZmF1bHQgdmFsdWUgaXMgbm90IG1lYW5pbmdmdWwgZm9yIAotICAgICAqIHRoZSBwcm9wZXJ0eS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG9iamVjdHMgd2hpY2ggcmVwcmVzZW50IHRoZSBwcm9wZXJ0eSB2YWx1ZXMgZm9yIHRoaXMgZW50cnkuIEluCi0gICAgICogdGhlIGNhc2Ugb2YgdGhlIHJvb3QgZW50cnkgdGhlc2Ugb2JqZWN0cyBhcmUgdGhlIGlucHV0IHRvIHRoZSB2aWV3ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzIGZvciB0aGlzIGVudHJ5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWVzKE9iamVjdFtdIHZhbHVlcyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9JUHJvcGVydHlTaGVldEVudHJ5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViMmQxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLS8qKgotICogTGlzdGVuZXIgZm9yIGNoYW5nZXMgaW4gb2JqZWN0cyBvZiB0eXBlIAotICogPGNvZGU+SVByb3BlcnR5U2hlZXRFbnRyeTwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHB1YmxpYyBzaW5jZSBpdCBhcHBlYXJzIGluIHRoZSBhcGkKLSAqIG9mIDxjb2RlPklQcm9wZXJ0eVNoZWV0RW50cnk8L2NvZGU+LiAgSXQgaXMgbm90IGludGVuZGVkCi0gKiB0byBiZSBpbXBsZW1lbnRlZCBvdXRzaWRlIG9mIHRoaXMgcGFja2FnZS4KLSAqIDxwPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lciB7Ci0gICAgLyoqCi0gICAgICogQSBub2RlJ3MgY2hpbGRyZW4gaGF2ZSBjaGFuZ2VkIChjaGlsZHJlbiBhZGRlZCBvciByZW1vdmVkKSAKLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHdob3NlJ3MgY2hpbGRyZW4gaGF2ZSBjaGFuZ2VkCi0gICAgICovCi0gICAgdm9pZCBjaGlsZEVudHJpZXNDaGFuZ2VkKElQcm9wZXJ0eVNoZWV0RW50cnkgbm9kZSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGVudHJ5J3MgZXJyb3IgbWVzc2FnZSBoYXMgY2hhbmdlZAotICAgICAqCi0gICAgICogQHBhcmFtIGVudHJ5IHRoZSBlbnRyeSB3aG9zZSdzIGVycm9yIG1lc3NhZ2UgaGFzIGNoYW5nZWQKLSAgICAgKi8KLSAgICB2b2lkIGVycm9yTWVzc2FnZUNoYW5nZWQoSVByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGVudHJ5J3MgdmFsdWUgaGFzIGNoYW5nZWQgCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW50cnkgdGhlIGVudHJ5IHdob3NlJ3MgdmFsdWUgaGFzIGNoYW5nZWQKLSAgICAgKi8KLSAgICB2b2lkIHZhbHVlQ2hhbmdlZChJUHJvcGVydHlTaGVldEVudHJ5IGVudHJ5KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvSVByb3BlcnR5U2hlZXRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmNkZjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvSVByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBwcm9wZXJ0eSBzaGVldCBwYWdlIHRoYXQgYXBwZWFycyBpbiBhIHByb3BlcnR5IHNoZWV0IHZpZXcuCi0gKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50IGZvciBwYWdlcyB3aXRoaW4gdGhlCi0gKiBwcm9wZXJ0eSBzaGVldCB2aWV3LCBuYW1lbHkgdGhleSBtdXN0IGJlIHBhZ2VzIChpbXBsZW1lbnQgPGNvZGU+SVBhZ2U8L2NvZGU+KQotICogYmUgcHJlcGFyZWQgdG8gY29udHJpYnV0ZSBhY3Rpb25zIHRvIHRoZSBwcm9wZXJ0eSBzaGVldCB2aWV3J3MgdG9vbCBiYXIKLSAqIGFuZCBzdGF0dXMgbGluZSwgYW5kIGxpc3RlbiBmb3Igc2VsZWN0aW9uIGNoYW5nZXMgaW4gdGhlIGFjdGl2ZSBwYXJ0LgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgZnJvbSBzY3JhdGNoIGlmIHRoZSBwcm9wZXJ0eSBzaGVldAotICogdmlld2VyJ3MgZGVmYXVsdCBwYWdlIGlzIHVuc3VpdGFibGUgZm9yIGRpc3BsYXlpbmcgYSBwYXJ0J3MgcHJvcGVydGllcy4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIFByb3BlcnR5U2hlZXRQYWdlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5U2hlZXRQYWdlIGV4dGVuZHMgSVBhZ2UsIElTZWxlY3Rpb25MaXN0ZW5lciB7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9JUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJiZjIwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBHdW5uYXIgV2FnZW5rbmVjaHQgLSBmaXggZm9yIGJ1ZyAyMTc1NiAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNzU2KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGFuIG9iamVjdCB3aGljaCBpcyBjYXBhYmxlIG9mIHN1cHBseWluZyBwcm9wZXJ0aWVzIGZvciBkaXNwbGF5Ci0gKiBieSB0aGUgc3RhbmRhcmQgcHJvcGVydHkgc2hlZXQgcGFnZSBpbXBsZW1lbnRhdGlvbiAoPGNvZGU+UHJvcGVydHlTaGVldFBhZ2U8L2NvZGU+KS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8Y29kZT5Qcm9wZXJ0eVNoZWV0UGFnZTwvY29kZT4gZGlzY292ZXJzIHRoZSBwcm9wZXJ0aWVzIHRvIGRpc3BsYXkgZnJvbQotICogY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzLiBFbGVtZW50cyB0aGF0IGltcGxlbWVudAotICogPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPiBkaXJlY3RseSBhcmUgaW5jbHVkZWQsIGFzIGFyZSBlbGVtZW50cyB0aGF0Ci0gKiBpbXBsZW1lbnQgPGNvZGU+SUFkYXB0YWJsZTwvY29kZT4gYW5kIGhhdmUgYW4gPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPgotICogYWRhcHRlci4gQ2xpZW50cyBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGZvciBhbnkgbmV3bHktZGVmaW5lZAotICogZWxlbWVudHMgdGhhdCBhcmUgdG8gaGF2ZSBwcm9wZXJ0aWVzIGRpc3BsYXlhYmxlIGJ5Ci0gKiA8Y29kZT5Qcm9wZXJ0eVNoZWV0UGFnZTwvY29kZT4uIE5vdGUgdGhhdCBpbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBjbGllbnQKLSAqIHdpbGwgYWxzbyBuZWVkIHRvIHJlZ2lzdGVyIGEgc3VpdGFibGUgYWRhcHRlciBmYWN0b3J5IHdpdGggdGhlIHBsYXRmb3JtJ3MKLSAqIGFkYXB0ZXIgbWFuYWdlciAoPGNvZGU+UGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXI8L2NvZGU+KS4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZQotICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm0jZ2V0QWRhcHRlck1hbmFnZXIoKQotICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eVNvdXJjZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkgc291cmNlIHRoYXQgY2FuIGJlIGVkaXRlZCBpbiBhIHByb3BlcnR5Ci0JICogc2hlZXQuCi0JICogPHA+Ci0JICogVGhpcyB2YWx1ZSBpcyB1c2VkIHdoZW4gdGhpcyA8Y29kZT5JUHJvcGVydHlTb3VyY2U8L2NvZGU+IGlzIGFwcGVhcmluZwotCSAqIGluIHRoZSBwcm9wZXJ0eSBzaGVldCBhcyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiBzb21lIG90aGVyCi0JICogPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIHZhbHVlIGlzIHBhc3NlZCBhcyB0aGUgaW5wdXQgdG8gYSBjZWxsIGVkaXRvciBvcGVuaW5nIG9uIGFuCi0JICogPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyB2YWx1ZSBpcyBhbHNvIHVzZWQgd2hlbiBhbiA8Y29kZT5JUHJvcGVydHlTb3VyY2U8L2NvZGU+IGlzIGJlaW5nCi0JICogdXNlZCBhcyB0aGUgdmFsdWUgaW4gYSA8Y29kZT5zZXRQcm9wZXJ0eVZhbHVlPC9jb2RlPiBtZXNzYWdlLiBUaGUKLQkgKiByZWNpZXZlciBvZiB0aGUgbWVzc2FnZSB3b3VsZCB0aGVuIHR5cGljYWxseSB1c2UgdGhlIGVkaXRhYmxlIHZhbHVlIHRvCi0JICogdXBkYXRlIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSBzb3VyY2Ugb3IgY29uc3RydWN0IGEgbmV3IGluc3RhbmNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSBhbiBlbWFpbCBhZGRyZXNzIHdoaWNoIGlzIGEgcHJvcGVydHkgc291cmNlIG1heSBoYXZlIGFuCi0JICogZWRpdGFibGUgdmFsdWUgd2hpY2ggaXMgYSBzdHJpbmcgc28gdGhhdCBpdCBjYW4gYmUgZWRpdGVkIGluIGEgdGV4dCBjZWxsCi0JICogZWRpdG9yLiBUaGUgZW1haWwgYWRkcmVzcyB3b3VsZCBhbHNvIGhhdmUgYSBjb25zdHJ1Y3RvciBvciBzZXR0ZXIgdGhhdAotCSAqIHRha2VzIHRoZSBlZGl0ZWQgc3RyaW5nIHNvIHRoYXQgYW4gYXBwcm9wcmlhdGUgaW5zdGFuY2UgY2FuIGJlIGNyZWF0ZWQgb3IKLQkgKiB0aGUgb3JpZ2luYWwgaW5zdGFuY2UgbW9kaWZpZWQgd2hlbiB0aGUgZWRpdGVkIHZhbHVlIGlzIHNldC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBiZWhhdmlvciBpcyBpbXBvcnRhbnQgZm9yIGFub3RoZXIgcmVhc29uLiBXaGVuIHRoZSBwcm9wZXJ0eSBzaGVldCBpcwotCSAqIHNob3dpbmcgcHJvcGVydGllcyBmb3IgbW9yZSB0aGFuIG9uZSBvYmplY3QgKG11bHRpcGxlIHNlbGVjdGlvbiksIGEKLQkgKiBwcm9wZXJ0eSBzaGVldCBlbnRyeSB3aWxsIGRpc3BsYXkgYW5kIGVkaXQgYSBzaW5nbGUgdmFsdWUgKHR5cGljYWxseQotCSAqIGNvbWluZyBmcm9tIHRoZSBmaXJzdCBzZWxlY3RlZCBvYmplY3QpLiBBZnRlciBhIHByb3BlcnR5IGhhcyBiZWVuIGVkaXRlZAotCSAqIGluIGEgY2VsbCBlZGl0b3IsIHRoZSBzYW1lIHZhbHVlIGlzIHNldCBhcyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIGFsbCBvZgotCSAqIHRoZSBvYmplY3RzLiBUaGlzIGlzIGZpbmUgZm9yIHByaW1pdGl2ZSB0eXBlcyBidXQgb3RoZXJ3aXNlIGFsbCBvZiB0aGUKLQkgKiBvYmplY3RzIGVuZCB1cCB3aXRoIGEgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIHZhbHVlLiBUaHVzIGJ5IGNyZWF0aW5nIGFuCi0JICogZWRpdGFibGUgdmFsdWUgYW5kIHVzaW5nIGl0IHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnR5Ci0JICogc291cmNlIG9iamVjdCwgb25lIGlzIGFibGUgdG8gZWRpdCBzZXZlcmFsIHByb3BlcnR5IHNvdXJjZSBvYmplY3RzIGF0Ci0JICogb25jZSAobXVsdGlwbGUgc2VsZWN0aW9uKS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmFsdWUgdGhhdCBjYW4gYmUgZWRpdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIHByb3BlcnR5IHNvdXJjZS4gVGhlCi0JICogPGNvZGU+Z2V0UHJvcGVydHlWYWx1ZTwvY29kZT4gYW5kIDxjb2RlPnNldFByb3BlcnR5VmFsdWU8L2NvZGU+Ci0JICogbWV0aG9kcyBhcmUgdXNlZCB0byByZWFkIGFuZCB3cml0ZSB0aGUgYWN0dWFsIHByb3BlcnR5IHZhbHVlcyBieQotCSAqIHNwZWNpZnlpbmcgdGhlIHByb3BlcnR5IGlkcyBmcm9tIHRoZXNlIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIDxwPgotCSAqIEltcGxlbWVudG9ycyBzaG91bGQgY2FjaGUgdGhlIGRlc2NyaXB0b3JzIGFzIHRoZXkgd2lsbCBiZSBhc2tlZCBmb3IgdGhlCi0JICogZGVzY3JpcHRvcnMgd2l0aCBhbnkgZWRpdC91cGRhdGUuIFNpbmNlIGRlc2NyaXB0b3JzIHByb3ZpZGUgY2VsbCBlZGl0b3JzLAotCSAqIHJldHVybmluZyB0aGUgc2FtZSBkZXNjcmlwdG9ycyBpZiBwb3NzaWJsZSBhbGxvd3MgZm9yIGVmZmljaWVudCB1cGRhdGluZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBpZCBpZiBpdCBoYXMgb25lLgotCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb3BlcnR5J3MgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiB2YWx1ZSBvciBpZiB0aGlzIHNvdXJjZSBkb2VzIG5vdCBoYXZlIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCi0JICogCi0JICogQHNlZSAjc2V0UHJvcGVydHlWYWx1ZQotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBzZXQKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBpZCBoYXMgY2hhbmdlZAotCSAqIGZyb20gaXRzIGRlZmF1bHQgdmFsdWUuIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgc291cmNlIGRvZXMKLQkgKiBub3QgaGF2ZSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgotCSAqIDxwPgotCSAqIElmIHRoZSBub3Rpb24gb2YgZGVmYXVsdCB2YWx1ZSBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdGhlIHNwZWNpZmllZAotCSAqIHByb3BlcnR5IHRoZW4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcwotCSAqICAgICAgICAgY2hhbmdlZCBmcm9tIGl0cyBvcmlnaW5hbCBkZWZhdWx0IHZhbHVlLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSwKLQkgKiAgICAgICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyBzb3VyY2UgZG9lcyBub3QgaGF2ZSB0aGUKLQkgKiAgICAgICAgIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqIEBzZWUgSVByb3BlcnR5U291cmNlMiNpc1Byb3BlcnR5UmVzZXR0YWJsZShPYmplY3QpCi0JICogQHNlZSAjcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGlkIHRvIGl0cyBkZWZhdWx0IHZhbHVlIGlmIHBvc3NpYmxlLgotCSAqIDxwPgotCSAqIERvZXMgbm90aGluZyBpZiB0aGUgbm90aW9uIG9mIGEgZGVmYXVsdCB2YWx1ZSBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdGhlCi0JICogc3BlY2lmaWVkIHByb3BlcnR5LCBvciBpZiB0aGUgcHJvcGVydHkncyB2YWx1ZSBjYW5ub3QgYmUgY2hhbmdlZCwgb3IgaWYKLQkgKiB0aGlzIHNvdXJjZSBkb2VzIG5vdCBoYXZlIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIENhbGxlcnMgd2lsbCBjaGVjayBpZiB0aGlzIDxjb2RlPklQcm9wZXJ0eVNvdXJjZTwvY29kZT4gaW1wbGVtZW50cwotCSAqIDxjb2RlPklQcm9wZXJ0eVNvdXJjZTI8L2NvZGU+IGFuZCB0aGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmCi0JICogPGNvZGU+SVByb3BlcnR5U291cmNlMiNpc1Byb3BlcnR5UmVzZXR0YWJsZShPYmplY3QpPC9jb2RlPiByZXR1cm5zCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIHByb3BlcnR5IGJlaW5nIHJlc2V0Ci0JICogQHNlZSAjaXNQcm9wZXJ0eVNldChPYmplY3QpCi0JICogQHNlZSBJUHJvcGVydHlTb3VyY2UyI2lzUHJvcGVydHlSZXNldHRhYmxlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGlkIGlmIHBvc3NpYmxlLiBEb2VzIG5vdGhpbmcgaWYgdGhlCi0JICogcHJvcGVydHkncyB2YWx1ZSBjYW5ub3QgYmUgY2hhbmdlZCBvciBpZiB0aGlzIHNvdXJjZSBkb2VzIG5vdCBoYXZlIHRoZQotCSAqIHNwZWNpZmllZCBwcm9wZXJ0eS4KLQkgKiA8cD4KLQkgKiBJbiBnZW5lcmFsLCBhIHByb3BlcnR5IHNvdXJjZSBzaG91bGQgbm90IGRpcmVjdGx5IHJlZmVyZW5jZSB0aGUgdmFsdWUKLQkgKiBwYXJhbWV0ZXIgdW5sZXNzIGl0IGlzIGFuIGF0b21pYyBvYmplY3QgdGhhdCBjYW4gYmUgc2hhcmVkLCBzdWNoIGFzIGEKLQkgKiBzdHJpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIGltcG9ydGFudCByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBzZXZlcmFsIHByb3BlcnR5IHNvdXJjZXMgd2l0aAotCSAqIGNvbXBhdGlibGUgZGVzY3JpcHRvcnMgY291bGQgYmUgYXBwZWFyaW5nIGluIHRoZSBwcm9wZXJ0eSBzaGVldCBhdCB0aGUKLQkgKiBzYW1lIHRpbWUuIEFuIGVkaXRvciBwcm9kdWNlcyBhIHNpbmdsZSBlZGl0ZWQgdmFsdWUgd2hpY2ggaXMgcGFzc2VkIGFzCi0JICogdGhlIHZhbHVlIHBhcmFtZXRlciBvZiB0aGlzIG1lc3NhZ2UgdG8gYWxsIHRoZSBwcm9wZXJ0eSBzb3VyY2VzLiBUaHVzIHRvCi0JICogYXZvaWQgYSBzaXR1YXRpb24gd2hlcmUgYWxsIG9mIHRoZSBwcm9wZXJ0eSBzb3VyY2VzIHJlZmVyZW5jZSB0aGUgc2FtZQotCSAqIHZhbHVlIHRoZXkgc2hvdWxkIHVzZSB0aGUgdmFsdWUgcGFyYW1ldGVyIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUKLQkgKiByZWFsIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZXJlIGlzIGFub3RoZXIgcmVhc29uIHdoeSBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGlzIHVzZWZ1bC4gVGhlIHJlYWwKLQkgKiB2YWx1ZSBvZiBwcm9wZXJ0eSBtYXkgYmUgYSB0eXBlIHRoYXQgY2Fubm90IGJlIGVkaXRlZCB3aXRoIGEgc3RhbmRhcmQKLQkgKiBjZWxsIGVkaXRvci4gSG93ZXZlciBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgcmVhbCB2YWx1ZSBpbgotCSAqIDxjb2RlPmdldFByb3BlcnR5VmFsdWU8L2NvZGU+LCB0aGUgdmFsdWUgY291bGQgYmUgY29udmVydGVkIHRvIGEKLQkgKiA8Y29kZT5TdHJpbmc8L2NvZGU+IHdoaWNoIGNvdWxkIGJlIGVkaXRlZCB3aXRoIGEgc3RhbmRhcmQgY2VsbCBlZGl0b3IuCi0JICogVGhlIGVkaXRlZCB2YWx1ZSB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZCB3aGljaCBjYW4gdGhlbiB0dXJuIGl0Ci0JICogYmFjayBpbnRvIHRoZSByZWFsIHByb3BlcnR5IHZhbHVlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbm90aGVyIHZhcmlhdGlvbiBvbiByZXR1cm5pbmcgYSB2YWx1ZSBvdGhlciB0aGFuIHRoZSByZWFsIHByb3BlcnR5IHZhbHVlCi0JICogaW4gPGNvZGU+Z2V0UHJvcGVydHlWYWx1ZTwvY29kZT4gaXMgdG8gcmV0dXJuIGEgdmFsdWUgd2hpY2ggaXMgYW4KLQkgKiA8Y29kZT5JUHJvcGVydHlTb3VyY2U8L2NvZGU+IChvciBmb3Igd2hpY2ggdGhlIHByb3BlcnR5IHNoZWV0IGNhbgotCSAqIG9idGFpbiBhbiA8Y29kZT5JUHJvcGVydHlTb3VyY2U8L2NvZGU+KS4gSW4gdGhpcyBjYXNlIHRoZSB2YWx1ZSB0bwotCSAqIGVkaXQgaXMgb2J0YWluZWQgZnJvbSB0aGUgY2hpbGQgcHJvcGVydHkgc291cmNlIHVzaW5nCi0JICogPGNvZGU+Z2V0RWRpdGFibGVWYWx1ZTwvY29kZT4uIEl0IGlzIHRoaXMgZWRpdGFibGUgdmFsdWUgdGhhdCB3aWxsIGJlCi0JICogcGFzc2VkIGJhY2sgdmlhIHRoaXMgbWV0aG9kIHdoZW4gaXQgaGFzIGJlZW4gZWRpdHRlZAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eVZhbHVlCi0JICogQHNlZSAjZ2V0RWRpdGFibGVWYWx1ZQotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBzZXQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eTsgPGNvZGU+bnVsbDwvY29kZT4gaXMgYWxsb3dlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkLCBPYmplY3QgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9JUHJvcGVydHlTb3VyY2UyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNvdXJjZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5NzNhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNvdXJjZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBHdW5uYXIgV2FnZW5rbmVjaHQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzOwotCi0vKioKLSAqIEV4dGVuc2lvbiB0byB0aGUgc3RhbmRhcmQgPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPiBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGV4dGVuZGVkIEFQSSB0byA8Y29kZT5JUHJvcGVydHlTb3VyY2U8L2NvZGU+IHRvCi0gKiBhbGxvdyBhbiBlYXNpZXIgaW5kaWNhdGlvbiBvZiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgYW5kIGNhbiBiZQotICogcmVzZXR0ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvcGVydHlTb3VyY2UyIGV4dGVuZHMgSVByb3BlcnR5U291cmNlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBpZCBpcwotICAgICAqIHJlc2V0dGFibGUgdG8gYSBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZAotICAgICAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBpZCBoYXMgYQotICAgICAqICAgICAgICAgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIHRvIHdoaWNoIGl0IGNhbiBiZSByZXNldHRlZCwgYW5kCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogQHNlZSBJUHJvcGVydHlTb3VyY2UjcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCkKLSAgICAgKiBAc2VlIElQcm9wZXJ0eVNvdXJjZSNpc1Byb3BlcnR5U2V0KE9iamVjdCkKLSAgICAgKi8KLSAgICBib29sZWFuIGlzUHJvcGVydHlSZXNldHRhYmxlKE9iamVjdCBpZCk7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5JUHJvcGVydHlTb3VyY2UyPC9jb2RlPiBvdmVycmlkZXMgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhpcyA8Y29kZT5JUHJvcGVydHlTb3VyY2U8L2NvZGU+IAotICAgICAqIG1ldGhvZCB0byByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW5zdGVhZCBvZiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCAKLSAgICAgKiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlLgotICAgICAqIDxjb2RlPmlzUHJvcGVydHlSZXNldHRhYmxlPC9jb2RlPiB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIDxjb2RlPmlzUHJvcGVydHlTZXQ8L2NvZGU+IHJldHVybnMKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKiA8cD4gCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gaWQgaGFzIGNoYW5nZWQKLSAgICAgKiBmcm9tIGl0cyBkZWZhdWx0IHZhbHVlLiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIHNvdXJjZSBkb2VzCi0gICAgICogbm90IGhhdmUgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG5vdGlvbiBvZiBkZWZhdWx0IHZhbHVlIGlzIG5vdCBtZWFuaW5nZnVsIGZvciB0aGUgc3BlY2lmaWVkCi0gICAgICogcHJvcGVydHkgdGhlbiA8Y29kZT50cnVlPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMKLSAgICAgKiAgICAgICAgIGNoYW5nZWQgZnJvbSBpdHMgb3JpZ2luYWwgZGVmYXVsdCB2YWx1ZSwgPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLSAgICAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSwKLSAgICAgKiAgICAgICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyBzb3VyY2UgZG9lcyBub3QgaGF2ZSB0aGUKLSAgICAgKiAgICAgICAgIHNwZWNpZmllZCBwcm9wZXJ0eQotICAgICAqIEBzZWUgSVByb3BlcnR5U291cmNlMiNpc1Byb3BlcnR5UmVzZXR0YWJsZShPYmplY3QpCi0gICAgICogQHNlZSAjcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCkKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgaWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9JUHJvcGVydHlTb3VyY2VQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9JUHJvcGVydHlTb3VyY2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjc5YjEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvSVByb3BlcnR5U291cmNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIGJ5IHtAbGluayBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRFbnRyeX0KLSAqIHRvIG9idGFpbiBhbiB7QGxpbmsgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2V9IGZvciBhCi0gKiBnaXZlbiBvYmplY3QuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIHsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgcHJvcGVydHkgc291cmNlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBzb3VyY2UgZm9yIHRoZSBvYmplY3QgcGFzc2VkIGluIChtYXliZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4pCi0JICovCi0JcHVibGljIElQcm9wZXJ0eVNvdXJjZSBnZXRQcm9wZXJ0eVNvdXJjZShPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGM5MWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gZm9yIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotICogPHA+Ci0gKiBUaGUgcmVxdWlyZWQgYXR0cmlidXRlcyBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoaWQgYW5kIGRpc3BsYXkgbmFtZSkgYXJlCi0gKiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yOyB0aGUgb3B0aW9uYWwgYXR0cmlidXRlcyBjYW4gYmUgY29uZmlndXJlZCB1c2luZwotICogdGhlIHZhcmlvdXMgc2V0IG1ldGhvZHMgKGFsbCBoYXZlIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMpOgotICogPHVsPgotICogICA8bGk+PGNvZGU+c2V0RGVzY3JpcHRpb248L2NvZGU+PC9saT4KLSAqICAgPGxpPjxjb2RlPnNldENhdGVnb3J5PC9jb2RlPjwvbGk+Ci0gKiAgIDxsaT48Y29kZT5zZXRMYWJlbFByb3ZpZGVyPC9jb2RlPjwvbGk+Ci0gKiAgIDxsaT48Y29kZT5zZXRIZWxwQ29udGV4dHM8L2NvZGU+PC9saT4KLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIHNob3VsZCByZWltcGxlbWVudCA8Y29kZT5nZXRQcm9wZXJ0eUVkaXRvcjwvY29kZT4gdG8gcHJvdmlkZSBhCi0gKiBjZWxsIGVkaXRvciBmb3IgY2hhbmdpbmcgdGhlIHZhbHVlOyBvdGhlcndpc2UgdGhlIHByb3BlcnR5IHdpbGwgYmUgCi0gKiBlZmZlY3RpdmVseSByZWFkIG9ubHkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZXJlIGFyZSBzZXZlcmFsIGNvbmNyZXRlIHN1YmNsYXNzZXMgcHJvdmlkZWQgaW4gdGhpcyBwYWNrYWdlIHRoYXQgY292ZXIKLSAqIHRoZSBtb3N0IGNvbW1vbiBjYXNlczoKLSAqIDx1bD4KLSAqICAgPGxpPjxjb2RlPlRleHRQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IC0gZWRpdHMgd2l0aCBhIAotICogICAgICA8Y29kZT5UZXh0Q2VsbEVkaXRvcjwvY29kZT48L2xpPgotICogICA8bGk+PGNvZGU+Q29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgLSBlZGl0cyB3aXRoIGEKLSAqICAgICAgPGNvZGU+Q29tYm9Cb3hDZWxsRWRpdG9yPC9jb2RlPjwvY29kZT48L2xpPgotICogICA8bGk+PGNvZGU+Q29sb3JQcm9wZXJ0eURlc2NyaXB0b3IgLSBlZGl0cyB3aXRoIGEgCi0gKiAgICAgIDxjb2RlPkNvbG9yQ2VsbEVkaXRvcjwvY29kZT48L2NvZGU+PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eURlc2NyaXB0b3IgaW1wbGVtZW50cyBJUHJvcGVydHlEZXNjcmlwdG9yIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBwcm9wZXJ0eSBpZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBpZDsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIHRvIGRpc3BsYXkgZm9yIHRoZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkaXNwbGF5OwotCi0gICAgLyoqCi0gICAgICogQ2F0ZWdvcnkgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSAodGhlIGRlZmF1bHQpLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNhdGVnb3J5ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBwcm9wZXJ0eSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSAodGhlIGRlZmF1bHQpLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaGVscCBjb250ZXh0IGlkcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSAodGhlIGRlZmF1bHQpLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBoZWxwSWRzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZsYWdzIHVzZWQgdG8gZmlsdGVyIHRoZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGZpbHRlckZsYWdzOwotCi0gICAgLyoqCi0gICAgICogVGhlIG9iamVjdCB0aGF0IHByb3ZpZGVzIHRoZSBwcm9wZXJ0eSB2YWx1ZSdzIHRleHQgYW5kIGltYWdlLCBvciAKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGVmYXVsdCBsYWJlbCBwcm92aWRlciBpcyB1c2VkICh0aGUgZGVmYXVsdCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBvYmplY3QgdG8gdmFsaWRhdGUgdGhlIHZhbHVlcyBpbiB0aGUgY2VsbCBlZGl0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgbm9uZSAodGhlIGRlZmF1bHQpLgotICAgICAqLwotICAgIHByaXZhdGUgSUNlbGxFZGl0b3JWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIGlmIHRoZSBkZXNjcmlwdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBvdGhlciBkZXNjcmlwdG9ycyBvZiB0aGlzCi0gICAgICogdHlwZS4gPGNvZGU+ZmFsc2U8L2NvZGU+IGJ5IGRlZmF1bHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGluY29tcGF0aWJsZSA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBwcm9wZXJ0eSBkZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIGlkIGFuZCBkaXNwbGF5IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBpZCwgU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoaWQpOwotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGRpc3BsYXlOYW1lKTsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgICAgICB0aGlzLmRpc3BsYXkgPSBkaXNwbGF5TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+UHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPklQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIFNpbmNlIG5vIGNlbGwgZWRpdG9yIGlzIHJldHVybmVkLCB0aGUgcHJvcGVydHkgaXMgcmVhZCBvbmx5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBwcm9wZXJ0eSBkZXNjcmlwdG9yIGlzIHRvIGJlIGFsd2F5cyAKLSAgICAgKiBjb25zaWRlcmVkIGluY29tcGF0aWJsZSB3aXRoIGFueSBvdGhlciBwcm9wZXJ0eSBkZXNjcmlwdG9yLgotICAgICAqIFRoaXMgcHJldmVudHMgYSBwcm9wZXJ0eSBmcm9tIGRpc3BsYXlpbmcgZHVyaW5nIG11bHRpcGxlIAotICAgICAqIHNlbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaW5kaWNhdGUgYWx3YXlzIGluY29tcGF0aWJsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdldEFsd2F5c0luY29tcGF0aWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGluY29tcGF0aWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+UHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPklQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IG1ldGhvZCByZXR1cm5zIHRoZSB2YWx1ZSBzZXQgYnkKLSAgICAgKiB0aGUgPGNvZGU+c2V0Q2F0ZWdvcnk8L2NvZGU+IG1ldGhvZC4gSWYgdW5zZXQsIHRoaXMgbWV0aG9kIHJldHVybnMKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoZSBkZWZhdWx0IGNhdGVnb3J5LgotICAgICAqCi0gICAgICogQHNlZSAjc2V0Q2F0ZWdvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotICAgICAgICByZXR1cm4gY2F0ZWdvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlByb3BlcnR5RGVzY3JpcHRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5JUHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgdmFsdWUgc2V0IGJ5Ci0gICAgICogdGhlIDxjb2RlPnNldERlc2NyaXB0aW9uPC9jb2RlPiBtZXRob2QuIElmIHVuc2V0LCB0aGlzIG1ldGhvZCByZXR1cm5zCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyBubyBkZXNjcmlwdGlvbi4KLSAgICAgKgotICAgICAqIEBzZWUgI3NldERlc2NyaXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5TaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+SVByb3BlcnR5RGVzY3JpcHRvcjwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIHZhbHVlIHN1cHBsaWVkCi0gICAgICogb24gdGhlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBkaXNwbGF5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5TaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+SVByb3BlcnR5RGVzY3JpcHRvcjwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIHZhbHVlIHNldCBieQotICAgICAqIHRoZSA8Y29kZT5zZXRGaWx0ZXJGbGFnczwvY29kZT4gbWV0aG9kLiBJZiB1bnNldCwgdGhpcyBtZXRob2QgcmV0dXJucwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIFZhbGlkIHZhbHVlcyBmb3IgdGhlc2UgZmxhZ3MgYXJlIGRlY2xhcmVkIGFzIGNvbnN0YW50cyBvbiAKLSAgICAgKiAgPGNvZGU+SVByb3BlcnR5U2hlZXRFbnRyeTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RmlsdGVyRmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBmaWx0ZXJGbGFnczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+U2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPklQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IG1ldGhvZCByZXR1cm5zIHRoZSB2YWx1ZSBzZXQgYnkKLSAgICAgKiB0aGUgPGNvZGU+c2V0SGVscENvbnRleHRJZDwvY29kZT4gbWV0aG9kLiBJZiB1bnNldCwgdGhpcyBtZXRob2QgcmV0dXJucwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqCi0gICAgICogQHNlZSAjc2V0SGVscENvbnRleHRJZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEhlbHBDb250ZXh0SWRzKCkgewotICAgICAgICByZXR1cm4gaGVscElkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+UHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPklQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IG1ldGhvZCByZXR1cm5zIHRoZSB2YWx1ZSBzdXBwbGllZAotICAgICAqIG9uIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlByb3BlcnR5RGVzY3JpcHRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5JUHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgdmFsdWUgc2V0IGJ5Ci0gICAgICogdGhlIDxjb2RlPnNldFByb3ZpZGVyPC9jb2RlPiBtZXRob2Qgb3IsIGlmIG5vIHZhbHVlIGhhcyBiZWVuIHNldAotICAgICAqIGl0IHJldHVybnMgYSA8Y29kZT5MYWJlbFByb3ZpZGVyPC9jb2RlPgotICAgICAqCi0gICAgICogQHNlZSAjc2V0TGFiZWxQcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotICAgICAgICBpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbGlkYXRvciBmb3IgZWRpdGluZyB0aGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWxpZGF0b3IgdXNlZCB0byB2ZXJpZnkgY29ycmVjdCB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHksCi0gICAgICogICBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFJldHVybnMgd2hldGhlciBhIGxhYmVsIHByb3ZpZGVyIGhhcyBiZWVuIHNldCBvbiB0aGUgcmVjZWl2ZXIuCi0gICAgICogQHJldHVybiB3aGV0aGVyIGEgbGFiZWwgcHJvdmlkZXIgaGFzIGJlZW4gc2V0IG9uIHRoZSByZWNlaXZlci4KLSAgICAgKiBAc2VlICNzZXRMYWJlbFByb3ZpZGVyCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm92aWRlclNldCgpIHsKLSAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXIgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+U2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPklQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIG90aGVyCi0gICAgICogcHJvcGVydHkgaGFzIHRoZSBzYW1lIGlkIGFuZCBjYXRlZ29yeSBhbmQgPGNvZGU+Z2V0QWx3YXlzSW5jb21wYXRpYmxlKCk8L2NvZGU+Ci0gICAgICogcmV0dXJucyBmYWxzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZVdpdGgoSVByb3BlcnR5RGVzY3JpcHRvciBhbm90aGVyUHJvcGVydHkpIHsKLSAgICAgICAgaWYgKGdldEFsd2F5c0luY29tcGF0aWJsZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vIENvbXBhcmUgaWQJCQotICAgICAgICBPYmplY3QgaWQxID0gZ2V0SWQoKTsKLSAgICAgICAgT2JqZWN0IGlkMiA9IGFub3RoZXJQcm9wZXJ0eS5nZXRJZCgpOwotICAgICAgICBpZiAoIWlkMS5lcXVhbHMoaWQyKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBDb21wYXJlIENhdGVnb3J5IChtYXkgYmUgbnVsbCkKLSAgICAgICAgaWYgKGdldENhdGVnb3J5KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGFub3RoZXJQcm9wZXJ0eS5nZXRDYXRlZ29yeSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFnZXRDYXRlZ29yeSgpLmVxdWFscyhhbm90aGVyUHJvcGVydHkuZ2V0Q2F0ZWdvcnkoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgcHJvcGVydHkgZGVzY3JpcHRvciBpcyB0byBiZSBhbHdheXMgCi0gICAgICogY29uc2lkZXJlZCBpbmNvbXBhdGlibGUgd2l0aCBhbnkgb3RoZXIgcHJvcGVydHkgZGVzY3JpcHRvci4KLSAgICAgKiBTZXR0aW5nIHRoaXMgZmxhZyBwcmV2ZW50cyBhIHByb3BlcnR5IGZyb20gZGlzcGxheWluZyBkdXJpbmcgbXVsdGlwbGUgCi0gICAgICogc2VsZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGZsYWcgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaW5kaWNhdGUgYWx3YXlzIGluY29tcGF0aWJsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFsd2F5c0luY29tcGF0aWJsZShib29sZWFuIGZsYWcpIHsKLSAgICAgICAgaW5jb21wYXRpYmxlID0gZmxhZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjYXRlZ29yeSBmb3IgdGhpcyBwcm9wZXJ0eSBkZXNjcmlwdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYXRlZ29yeSB0aGUgY2F0ZWdvcnkgZm9yIHRoZSBkZXNjcmlwdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICogQHNlZSAjZ2V0Q2F0ZWdvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGlzIHByb3BlcnR5IGRlc2NyaXB0b3IuCi0gICAgICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBiZSBsaW1pdGVkIHRvIGEgc2luZ2xlIGxpbmUgc28gdGhhdCBpdCBjYW4gYmUKLSAgICAgKiBkaXNwbGF5ZWQgaW4gdGhlIHN0YXR1cyBsaW5lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiB0aGUgZGVzY3JpcHRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAc2VlICNnZXREZXNjcmlwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGhlIGZpbHRlciBmbGFncyBmb3IgdGhpcyBwcm9wZXJ0eSBkZXNjcmlwdG9yLgotICAgICAqIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgYmUgbGltaXRlZCB0byBhIHNpbmdsZSBsaW5lIHNvIHRoYXQgaXQgY2FuIGJlCi0gICAgICogZGlzcGxheWVkIGluIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKiA8cD4KLSAgICAgKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZXNlIGZsYWdzIGFyZSBkZWNsYXJlZCBhcyBjb25zdGFudHMgb24gCi0gICAgICogIDxjb2RlPklQcm9wZXJ0eVNoZWV0RW50cnk8L2NvZGU+Ci0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgZmlsdGVyIGZsYWdzCi0gICAgICogQHNlZSAjZ2V0RmlsdGVyRmxhZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJGbGFncyhTdHJpbmcgdmFsdWVbXSkgewotICAgICAgICBmaWx0ZXJGbGFncyA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGhlbHAgY29udGV4dCBpZCBmb3IgdGhpcyBwcm9wZXJ0eSBkZXNjcmlwdG9yLgotICAgICAqCi0gICAgICogTk9URTogSGVscCBzdXBwb3J0IHN5c3RlbSBBUEkncyBjaGFuZ2VkIHNpbmNlIDIuMCBhbmQgYXJyYXlzCi0gICAgICogb2YgY29udGV4dHMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRodXMgdGhlIG9ubHkgdmFsaWQgcGFyYW1ldGVyIHR5cGUgZm9yIHRoaXMgbWV0aG9kCi0gICAgICogaXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGluZyBhIGNvbnRleHQgaWQuIAotICAgICAqIFRoZSBwcmV2aW91c2x5IHZhbGlkIHBhcmFtZXRlciB0eXBlcyBhcmUgZGVwcmVjYXRlZC4gCi0gICAgICogVGhlIHBsdXJhbCBuYW1lIGZvciB0aGlzIG1ldGhvZCBpcyB1bmZvcnR1bmF0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHRJZHMgdGhlIGhlbHAgY29udGV4dCBpZHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBAc2VlICNnZXRIZWxwQ29udGV4dElkcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhlbHBDb250ZXh0SWRzKE9iamVjdCBjb250ZXh0SWRzKSB7Ci0gICAgICAgIGhlbHBJZHMgPSBjb250ZXh0SWRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGlzIHByb3BlcnR5IGRlc2NyaXB0b3IuCi0gICAgICogPHA+Ci0gICAgICogSWYgbm8gbGFiZWwgcHJvdmlkZXIgaXMgc2V0IGFuIGluc3RhbmNlIG9mIDxjb2RlPkxhYmVsUHJvdmlkZXI8L2NvZGU+Ci0gICAgICogd2lsbCBiZSBjcmVhdGVkIGFzIHRoZSBkZWZhdWx0IHdoZW4gbmVlZGVkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgZGVzY3JpcHRvciwgb3IgCi0gICAgICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGVmYXVsdCBsYWJlbCBwcm92aWRlciBzaG91bGQgYmUgdXNlZAotICAgICAqIEBzZWUgI2dldExhYmVsUHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgIGxhYmVsUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbnB1dCB2YWxpZGF0b3IgZm9yIHRoZSBjZWxsIGVkaXRvciBmb3IgdGhpcyBwcm9wZXJ0eSBkZXNjcmlwdG9yLgotICAgICAqIDxwPgotICAgICAqIFtJc3N1ZTogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVubmVjZXNzYXJ5IGlzIHRoZSBjZWxsIGVkaXRvcidzIG93bgotICAgICAqICB2YWxpZGF0b3IgaXMgdXNlZC4KLSAgICAgKiBdCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWxpZGF0b3IgdGhlIGNlbGwgaW5wdXQgdmFsaWRhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKElDZWxsRWRpdG9yVmFsaWRhdG9yIHZhbGlkYXRvcikgewotICAgICAgICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5U2hlZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWRlODQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklDb250cmlidXRlZENvbnRlbnRzVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2VCb29rVmlld1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rVmlldzsKLQotLyoqCi0gKiBNYWluIGNsYXNzIGZvciB0aGUgUHJvcGVydHkgU2hlZXQgVmlldy4KLSAqIDxwPgotICogVGhpcyBzdGFuZGFyZCB2aWV3IGhhcyBpZCA8Y29kZT4ib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCI8L2NvZGU+LgotICogPC9wPgotICogPHA+Ci0gKiBOb3RlIHRoYXQgcHJvcGVydHkgPGl0PnNoZWV0czwvaXQ+IGFuZCBwcm9wZXJ0eSBzaGVldCBwYWdlcyBhcmUgbm90IHRoZQotICogc2FtZSB0aGluZyBhcyBwcm9wZXJ0eSA8aXQ+ZGlhbG9nczwvaXQ+IGFuZCB0aGVpciBwcm9wZXJ0eSBwYWdlcyAodGhlIHByb3BlcnR5Ci0gKiBwYWdlcyBleHRlbnNpb24gcG9pbnQgaXMgZm9yIGNvbnRyaWJ1dGluZyBwcm9wZXJ0eSBwYWdlcyB0byBwcm9wZXJ0eSBkaWFsb2dzKS4KLSAqIFdpdGhpbiB0aGUgcHJvcGVydHkgc2hlZXQgdmlldywgYWxsIHBhZ2VzIGFyZSA8Y29kZT5JUHJvcGVydHlTaGVldFBhZ2U8L2NvZGU+cy4KLSAqIDwvcD4KLSAqIDxwPgotICogUHJvcGVydHkgc2hlZXQgcGFnZXMgYXJlIGRpc2NvdmVyZWQgYnkgdGhlIHByb3BlcnR5IHNoZWV0IHZpZXcgYXV0b21hdGljYWxseQotICogd2hlbiBhIHBhcnQgaXMgZmlyc3QgYWN0aXZhdGVkLiBUaGUgcHJvcGVydHkgc2hlZXQgdmlldyBhc2tzIHRoZSBhY3RpdmUgcGFydAotICogZm9yIGl0cyBwcm9wZXJ0eSBzaGVldCBwYWdlOyB0aGlzIGlzIGRvbmUgYnkgaW52b2tpbmcgCi0gKiA8Y29kZT5nZXRBZGFwdGVyKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcyk8L2NvZGU+IG9uIHRoZSBwYXJ0LiBJZiB0aGUgcGFydCAKLSAqIHJldHVybnMgYSBwYWdlLCB0aGUgcHJvcGVydHkgc2hlZXQgdmlldyB0aGVuIGNyZWF0ZXMgdGhlIGNvbnRyb2xzIGZvciB0aGF0Ci0gKiBwcm9wZXJ0eSBzaGVldCBwYWdlICh1c2luZyA8Y29kZT5jcmVhdGVDb250cm9sPC9jb2RlPiksIGFuZCBhZGRzIHRoZSBwYWdlIHRvIAotICogdGhlIHByb3BlcnR5IHNoZWV0IHZpZXcuIFdoZW5ldmVyIHRoaXMgcGFydCBiZWNvbWVzIGFjdGl2ZSwgaXRzIGNvcnJlc3BvbmRpbmcKLSAqIHByb3BlcnR5IHNoZWV0IHBhZ2UgaXMgc2hvd24gaW4gdGhlIHByb3BlcnR5IHNoZWV0IHZpZXcgKHdoaWNoIG1heSBvciBtYXkgbm90Ci0gKiBiZSB2aXNpYmxlIGF0IHRoZSB0aW1lKS4gQSBwYXJ0J3MgcHJvcGVydHkgc2hlZXQgcGFnZSBpcyBkaXNjYXJkZWQgd2hlbiB0aGUKLSAqIHBhcnQgY2xvc2VzLiBUaGUgcHJvcGVydHkgc2hlZXQgdmlldyBoYXMgYSBkZWZhdWx0IHBhZ2UgKGFuIGluc3RhbmNlIG9mIAotICogPGNvZGU+UHJvcGVydHlTaGVldFBhZ2U8L2NvZGU+KSB3aGljaCBzZXJ2aWNlcyBhbGwgcGFydHMgd2l0aG91dCBhIHByb3BlcnR5Ci0gKiBzaGVldCBwYWdlIG9mIHRoZWlyIG93bi4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIHdvcmtiZW5jaCB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zdGFudGlhdGVzIHRoaXMgY2xhc3Mgd2hlbiBhIFByb3BlcnR5Ci0gKiBTaGVldCB2aWV3IGlzIG5lZWRlZCBmb3IgYSB3b3JrYmVuY2ggd2luZG93LiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZAotICogdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIElQcm9wZXJ0eVNoZWV0UGFnZQotICogQHNlZSBQcm9wZXJ0eVNoZWV0UGFnZQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlTaGVldCBleHRlbmRzIFBhZ2VCb29rVmlldyBpbXBsZW1lbnRzIElTZWxlY3Rpb25MaXN0ZW5lciB7Ci0gICAgLyoqCi0gICAgICogTm8gbG9uZ2VyIHVzZWQgYnV0IHByZXNlcnZlZCB0byBhdm9pZCBhcGkgY2hhbmdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMUF9DT05URVhUX1BST1BFUlRZX1NIRUVUX1ZJRVcgPSBJUHJvcGVydGllc0hlbHBDb250ZXh0SWRzLlBST1BFUlRZX1NIRUVUX1ZJRVc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaW5pdGlhbCBzZWxlY3Rpb24gd2hlbiB0aGUgcHJvcGVydHkgc2hlZXQgb3BlbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIElTZWxlY3Rpb24gYm9vdHN0cmFwU2VsZWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHByb3BlcnR5IHNoZWV0IHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnR5U2hlZXQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQYWdlQm9va1ZpZXcuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBwcm9wZXJ0eSBzaGVldCBwYWdlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJUGFnZSBjcmVhdGVEZWZhdWx0UGFnZShQYWdlQm9vayBib29rKSB7Ci0gICAgICAgIFByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSBuZXcgUHJvcGVydHlTaGVldFBhZ2UoKTsKLSAgICAgICAgaW5pdFBhZ2UocGFnZSk7Ci0gICAgICAgIHBhZ2UuY3JlYXRlQ29udHJvbChib29rKTsKLSAgICAgICAgcmV0dXJuIHBhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlByb3BlcnR5U2hlZXQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SVdvcmtiZW5jaFBhcnQ8L2NvZGU+Ci0gICAgICogbWV0aG9kIGNyZWF0ZXMgYSA8Y29kZT5QYWdlQm9vazwvY29kZT4gY29udHJvbCB3aXRoIGl0cyBkZWZhdWx0IHBhZ2Ugc2hvd2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0gICAgICAgIGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJLnNldEhlbHAoZ2V0UGFnZUJvb2soKSwKLQkJCQkJCUlQcm9wZXJ0aWVzSGVscENvbnRleHRJZHMuUFJPUEVSVFlfU0hFRVRfVklFVyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoUGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAvLyBydW4gc3VwZXIuCi0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLQotICAgICAgICAvLyByZW1vdmUgb3Vyc2VsdmVzIGFzIGEgc2VsZWN0aW9uIGxpc3RlbmVyCi0gICAgICAgIGdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQYWdlQm9va1ZpZXcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBhZ2VSZWMgZG9DcmVhdGVQYWdlKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgLy8gVHJ5IHRvIGdldCBhIGN1c3RvbSBwcm9wZXJ0eSBzaGVldCBwYWdlLgotICAgICAgICBJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSA9IChJUHJvcGVydHlTaGVldFBhZ2UpIHBhcnQKLSAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpOwotICAgICAgICBpZiAocGFnZSA9PSBudWxsKSB7Ci0gICAgICAgIAkvLyBMb29rIGZvciBhIGRlY2xhcmF0aXZlbHktY29udHJpYnV0ZWQgYWRhcHRlci4KLSAgICAgICAgCS8vIFNlZSBidWcgODYzNjIgW1Byb3BlcnRpZXNWaWV3XSBDYW4gbm90IGFjY2VzcyBBZGFwdGVyRmFjdG9yeSwgd2hlbiBwbHVnaW4gaXMgbm90IGxvYWRlZC4KLQkJCXBhZ2UgPSAoSVByb3BlcnR5U2hlZXRQYWdlKSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpCi0JCQkJCS5sb2FkQWRhcHRlcihwYXJ0LCBJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJfQotICAgICAgICBpZiAocGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocGFnZSBpbnN0YW5jZW9mIElQYWdlQm9va1ZpZXdQYWdlKQotICAgICAgICAgICAgICAgIGluaXRQYWdlKChJUGFnZUJvb2tWaWV3UGFnZSkgcGFnZSk7Ci0gICAgICAgICAgICBwYWdlLmNyZWF0ZUNvbnRyb2woZ2V0UGFnZUJvb2soKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VSZWMocGFydCwgcGFnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgcGFnZQkJCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gUGFnZUJvb2tWaWV3LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRGVzdHJveVBhZ2UoSVdvcmtiZW5jaFBhcnQgcGFydCwgUGFnZVJlYyByZWMpIHsKLSAgICAgICAgSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSAoSVByb3BlcnR5U2hlZXRQYWdlKSByZWMucGFnZTsKLSAgICAgICAgcGFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIHJlYy5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQYWdlQm9va1ZpZXcuCi0gICAgICogUmV0dXJucyB0aGUgYWN0aXZlIHBhcnQgb24gdGhlIHNhbWUgd29ya2JlbmNoIHBhZ2UgYXMgdGhpcyBwcm9wZXJ0eSAKLSAgICAgKiBzaGVldCB2aWV3LgotICAgICAqLwotICAgIHByb3RlY3RlZCBJV29ya2JlbmNoUGFydCBnZXRCb290c3RyYXBQYXJ0KCkgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgYm9vdHN0cmFwU2VsZWN0aW9uID0gcGFnZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIHJldHVybiBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKLSAgICAgICAgfSAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJVmlld1BhcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgc2l0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgc2l0ZS5nZXRQYWdlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIHN1cGVyLmluaXQoc2l0ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQYWdlQm9va1ZpZXcuCi0gICAgICogVGhlIHByb3BlcnR5IHNoZWV0IG1heSBzaG93IHByb3BlcnRpZXMgZm9yIGFueSB2aWV3IG90aGVyIHRoYW4gdGhpcyB2aWV3LgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW1wb3J0YW50KElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgcmV0dXJuIHBhcnQgIT0gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+UHJvcGVydHlTaGVldDwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JUGFydExpc3RlbmVyPC9jb2RlPgotICAgICAqIG1ldGhvZCBmaXJzdCBzZWVzIGlmIHRoZSBhY3RpdmUgcGFydCBpcyBhbiA8Y29kZT5JQ29udHJpYnV0ZWRDb250ZW50c1ZpZXc8L2NvZGU+Ci0gICAgICogYWRhcHRlciBhbmQgaWYgc28sIGFza3MgaXQgZm9yIGl0cyBjb250cmlidXRpbmcgcGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgSUNvbnRyaWJ1dGVkQ29udGVudHNWaWV3IHZpZXcgPSAoSUNvbnRyaWJ1dGVkQ29udGVudHNWaWV3KSBwYXJ0Ci0gICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSUNvbnRyaWJ1dGVkQ29udGVudHNWaWV3LmNsYXNzKTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgc291cmNlID0gbnVsbDsKLSAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkKLSAgICAgICAgICAgIHNvdXJjZSA9IHZpZXcuZ2V0Q29udHJpYnV0aW5nUGFydCgpOwotICAgICAgICBpZiAoc291cmNlICE9IG51bGwpCi0gICAgICAgICAgICBzdXBlci5wYXJ0QWN0aXZhdGVkKHNvdXJjZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN1cGVyLnBhcnRBY3RpdmF0ZWQocGFydCk7Ci0KLSAgICAgICAgLy8gV2hlbiB0aGUgdmlldyBpcyBmaXJzdCBvcGVuZWQsIHBhc3MgdGhlIHNlbGVjdGlvbiB0byB0aGUgcGFnZQkJCi0gICAgICAgIGlmIChib290c3RyYXBTZWxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSAoSVByb3BlcnR5U2hlZXRQYWdlKSBnZXRDdXJyZW50UGFnZSgpOwotICAgICAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwYWdlLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgYm9vdHN0cmFwU2VsZWN0aW9uKTsKLSAgICAgICAgICAgIGJvb3RzdHJhcFNlbGVjdGlvbiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElTZWxlY3Rpb25MaXN0ZW5lci4KLSAgICAgKiBOb3RpZnkgdGhlIGN1cnJlbnQgcGFnZSB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbCkgewotICAgICAgICAvLyB3ZSBpZ25vcmUgb3VyIG93biBzZWxlY3Rpb24gb3IgbnVsbCBzZWxlY3Rpb24KLSAgICAgICAgaWYgKHBhcnQgPT0gdGhpcyB8fCBzZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBwYXNzIHRoZSBzZWxlY3Rpb24gdG8gdGhlIHBhZ2UJCQotICAgICAgICBJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSA9IChJUHJvcGVydHlTaGVldFBhZ2UpIGdldEN1cnJlbnRQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgICAgICBwYWdlLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5U2hlZXRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODdkMTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3Mgb2YgYWxsIHRoZSBsb2NhbCBhY3Rpb25zIHVzZWQKLSAqIGluIHRoZSBQcm9wZXJ0eVNoZWV0LgotICovCi0vKnBhY2thZ2UqL2Fic3RyYWN0IGNsYXNzIFByb3BlcnR5U2hlZXRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotICAgIHByb3RlY3RlZCBQcm9wZXJ0eVNoZWV0Vmlld2VyIHZpZXdlcjsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgUHJvcGVydHlTaGVldFZpZXdlciBhY3Rpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5U2hlZXRBY3Rpb24oUHJvcGVydHlTaGVldFZpZXdlciB2aWV3ZXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICB0aGlzLmlkID0gbmFtZTsKLSAgICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB1bmlxdWUgYWN0aW9uIElEIHRoYXQgd2lsbCBiZQotICAgICAqIHVzZWQgaW4gY29udHJpYnV0aW9uIG1hbmFnZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIFByb3BlcnR5U2hlZXRWaWV3ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHlTaGVldFZpZXdlciBnZXRQcm9wZXJ0eVNoZWV0KCkgewotICAgICAgICByZXR1cm4gdmlld2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdW5pcXVlIElEIHRoYXQgc2hvdWxkIGJlIHVzZWQKLSAgICAgKiBpbiB0aGUgY29udHJpYnV0aW9uIG1hbmFnZXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotICAgICAgICBpZCA9IG5ld0lkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldENhdGVnb3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5U2hlZXRDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDViNTAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldENhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQSBjYXRlZ29yeSBpbiBhIFByb3BlcnR5U2hlZXQgdXNlZCB0byBncm91cCA8Y29kZT5JUHJvcGVydHlTaGVldEVudHJ5PC9jb2RlPgotICogZW50cmllcyBzbyB0aGV5IGFyZSBkaXNwbGF5ZWQgdG9nZXRoZXIuCi0gKi8KLS8qcGFja2FnZSovY2xhc3MgUHJvcGVydHlTaGVldENhdGVnb3J5IHsKLSAgICBwcml2YXRlIFN0cmluZyBjYXRlZ29yeU5hbWU7Ci0KLSAgICBwcml2YXRlIExpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRBdXRvRXhwYW5kID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFByb3BlcnR5U2hlZXQgY2F0ZWdvcnkgd2l0aCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0eVNoZWV0Q2F0ZWdvcnkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgY2F0ZWdvcnlOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYW4gPGNvZGU+SVByb3BlcnR5U2hlZXRFbnRyeTwvY29kZT4gdG8gdGhlIGxpc3QKLSAgICAgKiBvZiBlbnRyaWVzIGluIHRoaXMgY2F0ZWdvcnkuIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEVudHJ5KElQcm9wZXJ0eVNoZWV0RW50cnkgZW50cnkpIHsKLSAgICAgICAgZW50cmllcy5hZGQoZW50cnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2F0ZWdvcnkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGNhdGVnb3J5TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2F0ZWdvcnkgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgCi0gICAgICogZXhwYW5kZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjYXRlZ29yeSBzaG91bGQgYmUgYXV0b21hdGljYWxseSAKLSAgICAgKiBleHBhbmRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEF1dG9FeHBhbmQoKSB7Ci0gICAgICAgIHJldHVybiBzaG91bGRBdXRvRXhwYW5kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgaWYgdGhpcyBjYXRlZ29yeSBzaG91bGQgYmUgYXV0b21hdGljYWxseSAKLSAgICAgKiBleHBhbmRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRXhwYW5kKGJvb2xlYW4gYXV0b0V4cGFuZCkgewotICAgICAgICBzaG91bGRBdXRvRXhwYW5kID0gYXV0b0V4cGFuZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbnRyaWVzIGluIHRoaXMgY2F0ZWdvcnkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBlbnRyaWVzIGluIHRoaXMgY2F0ZWdvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVByb3BlcnR5U2hlZXRFbnRyeVtdIGdldENoaWxkRW50cmllcygpIHsKLSAgICAgICAgcmV0dXJuIChJUHJvcGVydHlTaGVldEVudHJ5W10pIGVudHJpZXMKLSAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgSVByb3BlcnR5U2hlZXRFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbnRyaWVzIGluIHRoaXMgY2F0ZWdvcnkuCi0gICAgICogRG9pbmcgc28gYWxsb3dzIHVzIHRvIHJldXNlIHRoaXMgY2F0ZWdvcnkgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsRW50cmllcygpIHsKLSAgICAgICAgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5U2hlZXRFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9Qcm9wZXJ0eVNoZWV0RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzOTI1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5U2hlZXRFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBHdW5uYXIgV2FnZW5rbmVjaHQgLSBmaXggZm9yIGJ1ZyAyMTc1NiBbUHJvcGVydGllc1ZpZXddIHByb3BlcnR5IHZpZXcgc29ydGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uRXZlbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIDxjb2RlPlByb3BlcnR5U2hlZXRFbnRyeTwvY29kZT4gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YKLSAqIDxjb2RlPklQcm9wZXJ0eVNoZWV0RW50cnk8L2NvZGU+IHdoaWNoIHVzZXMgPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPgotICogYW5kIDxjb2RlPklQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IHRvIGludGVyYWN0IHdpdGggZG9tYWluIG1vZGVsIG9iamVjdHMuCi0gKiA8cD4KLSAqIEV2ZXJ5IHByb3BlcnR5IHNoZWV0IGVudHJ5IGhhcyBhIHNpbmdsZSBkZXNjcmlwdG9yIChleGNlcHQgdGhlIHJvb3QgZW50cnkKLSAqIHdoaWNoIGhhcyBub25lKS4gVGhpcyBkZXNjcmlwdG9yIGRldGVybWluZXMgd2hhdCBwcm9wZXJ0eQotICogb2YgaXRzIG9iamVjdHMgaXQgd2lsbCBkaXNwbGF5L2VkaXQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEVudHJpZXMgZG8gbm90IGxpc3RlbiBmb3IgY2hhbmdlcyBpbiB0aGVpciBvYmplY3RzLiBTaW5jZSB0aGVyZSBpcyBubwotICogcmVzdHJpY3Rpb24gb24gcHJvcGVydGllcyBiZWluZyBpbmRlcGVuZGVudCwgYSBjaGFuZ2UgaW4gb25lIHByb3BlcnR5Ci0gKiBtYXkgYWZmZWN0IG90aGVyIHByb3BlcnRpZXMuIFRoZSB2YWx1ZSBvZiBhIHBhcmVudCdzIHByb3BlcnR5IG1heSBhbHNvCi0gKiBjaGFuZ2UuIEFzIGEgcmVzdWx0IHdlIGFyZSBmb3JjZWQgdG8gcmVmcmVzaCB0aGUgZW50aXJlIGVudHJ5IHRyZWUKLSAqIHdoZW4gYSBwcm9wZXJ0eSBjaGFuZ2VzIHZhbHVlLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4wICh3YXMgcHJldmlvdXNseSBpbnRlcm5hbCkKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5U2hlZXRFbnRyeSBleHRlbmRzIEV2ZW50TWFuYWdlciBpbXBsZW1lbnRzCi0JCUlQcm9wZXJ0eVNoZWV0RW50cnkgewotCi0gICAgLyoqCi0gICAgICogVGhlIHZhbHVlcyB3ZSBhcmUgZGlzcGxheWluZy9lZGl0aW5nLgotICAgICAqIFRoZXNlIG9iamVjdHMgcmVwZXNlbnQgdGhlIHZhbHVlIG9mIG9uZSBvZiB0aGUKLSAgICAgKiBwcm9wZXJ0aWVzIG9mIHRoZSB2YWx1ZXMgb2Ygb3VyIHBhcmVudCBlbnRyeS4KLSAgICAgKiBFeGNlcHQgZm9yIHRoZSByb290IGVudHJ5IHdoZXJlIHRoZXkgcmVwcmVzZW50IHRoZQotICAgICAqIGlucHV0IChzZWxlY3RlZCkgb2JqZWN0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbMF07Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcHJvcGVydHkgc291cmNlcyBmb3IgdGhlIHZhbHVlcyB3ZSBhcmUgZGlzcGxheWluZy9lZGl0aW5nLgotICAgICAqLwotICAgIHByaXZhdGUgTWFwIHNvdXJjZXMgPSBuZXcgSGFzaE1hcCgwKTsKLQotICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGVudHJ5IGlzIGRlZmluZWQgYXMgdGhlIHRoZSBmaXJzdCBvYmplY3QKLSAgICAgKiBpbiBpdHMgdmFsdWUgYXJyYXkgb3IsIGlmIHRoYXQgb2JqZWN0IGlzIGFuIAotICAgICAqIDxjb2RlPklQcm9wZXJ0eVNvdXJjZTwvY29kZT4sIHRoZSB2YWx1ZSBpdCByZXR1cm5zIHdoZW4gc2VudAotICAgICAqIDxjb2RlPmdldEVkaXRhYmxlVmFsdWU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgZWRpdFZhbHVlOwotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eVNoZWV0RW50cnkgcGFyZW50OwotCi0gICAgcHJpdmF0ZSBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBwcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0KLSAgICBwcml2YXRlIENlbGxFZGl0b3IgZWRpdG9yOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JUZXh0OwotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eVNoZWV0RW50cnlbXSBjaGlsZEVudHJpZXMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBDZWxsRWRpdG9yTGlzdGVuZXIgZm9yIHRoaXMgZW50cnkuIEl0IGxpc3RlbnMgZm9yCi0gICAgICogdmFsdWUgY2hhbmdlcyBpbiB0aGUgQ2VsbEVkaXRvciwgYW5kIGNhbmNlbCBhbmQgZmluaXNoIHJlcXVlc3RzLgotICAgICAqLwotICAgIHByaXZhdGUgSUNlbGxFZGl0b3JMaXN0ZW5lciBjZWxsRWRpdG9yTGlzdGVuZXIgPSBuZXcgSUNlbGxFZGl0b3JMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkVmFsaWRTdGF0ZSwKLSAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbGlkU3RhdGUpIHsKLSAgICAgICAgICAgIGlmICghbmV3VmFsaWRTdGF0ZSkKLSAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgbm90IHZhbGlkIHNvIHNob3cgYW4gZXJyb3IgbWVzc2FnZQotICAgICAgICAgICAgICAgIHNldEVycm9yVGV4dChlZGl0b3IuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSB2YWxpZCAKLSAgICAgICAgICAgICAgICBzZXRFcnJvclRleHQobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWxFZGl0b3IoKSB7Ci0gICAgICAgICAgICBzZXRFcnJvclRleHQobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhcHBseUVkaXRvclZhbHVlKCkgewotICAgICAgICAgICAgUHJvcGVydHlTaGVldEVudHJ5LnRoaXMuYXBwbHlFZGl0b3JWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U2hlZXRFbnRyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lcigKLSAgICAgICAgICAgIElQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBhZGRMaXN0ZW5lck9iamVjdChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTaGVldEVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGx5RWRpdG9yVmFsdWUoKSB7Ci0gICAgICAgIGlmIChlZGl0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBDaGVjayBpZiBlZGl0b3IgaGFzIGEgdmFsaWQgdmFsdWUKLSAgICAgICAgaWYgKCFlZGl0b3IuaXNWYWx1ZVZhbGlkKCkpIHsKLSAgICAgICAgICAgIHNldEVycm9yVGV4dChlZGl0b3IuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0RXJyb3JUZXh0KG51bGwpOwotCi0gICAgICAgIC8vIFNlZSBpZiB0aGUgdmFsdWUgY2hhbmdlZCBhbmQgaWYgc28gdXBkYXRlCi0gICAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IGVkaXRvci5nZXRWYWx1ZSgpOwotICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChlZGl0VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWVkaXRWYWx1ZS5lcXVhbHMobmV3VmFsdWUpKQotICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBlZGl0b3IgdmFsdWUKLSAgICAgICAgaWYgKGNoYW5nZWQpCi0gICAgICAgICAgICBzZXRWYWx1ZShuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB1bnNvcnRlZCBpbnRlcnNlY3Rpb24gb2YgYWxsIHRoZSA8Y29kZT5JUHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPnMgCi0gICAgICogZm9yIHRoZSBvYmplY3RzLgotICAgICAqIEByZXR1cm4gTGlzdAotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBjb21wdXRlTWVyZ2VkUHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLSAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCi0gICAgICAgIElQcm9wZXJ0eVNvdXJjZSBmaXJzdFNvdXJjZSA9IGdldFByb3BlcnR5U291cmNlKHZhbHVlc1swXSk7Ci0gICAgICAgIGlmIChmaXJzdFNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZmlyc3RTb3VyY2UuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gZ2V0IGFsbCBkZXNjcmlwdG9ycyBmcm9tIGVhY2ggb2JqZWN0Ci0gICAgICAgIE1hcFtdIHByb3BlcnR5RGVzY3JpcHRvck1hcHMgPSBuZXcgTWFwW3ZhbHVlcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHZhbHVlc1tpXTsKLSAgICAgICAgICAgIElQcm9wZXJ0eVNvdXJjZSBzb3VyY2UgPSBnZXRQcm9wZXJ0eVNvdXJjZShvYmplY3QpOwotICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgb25lIG9mIHRoZSBzZWxlY3RlZCBpdGVtcyBpcyBub3QgYSBwcm9wZXJ0eSBzb3VyY2UKLSAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHNob3cgbm8gcHJvcGVydGllcwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBrZXllZCBieSBpZAotICAgICAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yTWFwc1tpXSA9IGNvbXB1dGVQcm9wZXJ0eURlc2NyaXB0b3JzRm9yKHNvdXJjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbnRlcnNlY3QKLSAgICAgICAgTWFwIGludGVyc2VjdGlvbiA9IHByb3BlcnR5RGVzY3JpcHRvck1hcHNbMF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcHJvcGVydHlEZXNjcmlwdG9yTWFwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IGlkcwotICAgICAgICAgICAgT2JqZWN0W10gaWRzID0gaW50ZXJzZWN0aW9uLmtleVNldCgpLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaWRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHByb3BlcnR5RGVzY3JpcHRvck1hcHNbaV0uZ2V0KGlkc1tqXSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHRoZSBkZXNjcmlwdG9ycyAod2hpY2ggaGF2ZSB0aGUgc2FtZSBpZCkgYXJlIGNvbXBhdGlibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICEoKElQcm9wZXJ0eURlc2NyaXB0b3IpIGludGVyc2VjdGlvbi5nZXQoaWRzW2pdKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzQ29tcGF0aWJsZVdpdGgoKElQcm9wZXJ0eURlc2NyaXB0b3IpIG9iamVjdCkpCi0gICAgICAgICAgICAgICAgICAgIGludGVyc2VjdGlvbi5yZW1vdmUoaWRzW2pdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNvcnRpbmcgaXMgaGFuZGxlZCBpbiB0aGUgUHJvcGVydHlTaGVldFZpZXdlciwgcmV0dXJuIHVuc29ydGVkIChpbiB0aGUgb3JpZ2luYWwgb3JkZXIpCi0gICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGludGVyc2VjdGlvbi5zaXplKCkpOwotICAgICAgICBJUHJvcGVydHlEZXNjcmlwdG9yW10gZmlyc3REZXNjcyA9IGZpcnN0U291cmNlLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaXJzdERlc2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2MgPSBmaXJzdERlc2NzW2ldOwotICAgICAgICAgICAgaWYgKGludGVyc2VjdGlvbi5jb250YWluc0tleShkZXNjLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChkZXNjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gbWFwIG9mIHByb3BlcnR5IGRlc2NyaXRwdG9ycyAoa2V5ZWQgb24gaWQpIGZvciB0aGUgCi0gICAgICogZ2l2ZW4gcHJvcGVydHkgc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZSBhIHByb3BlcnR5IHNvdXJjZSBmb3Igd2hpY2ggdG8gb2J0YWluIGRlc2NyaXB0b3JzCi0gICAgICogQHJldHVybiBhIHRhYmxlIG9mIGRlY3JpcHRvcnMga2V5ZWQgb24gdGhlaXIgaWQKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBjb21wdXRlUHJvcGVydHlEZXNjcmlwdG9yc0ZvcihJUHJvcGVydHlTb3VyY2Ugc291cmNlKSB7Ci0gICAgICAgIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHNvdXJjZS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcChkZXNjcmlwdG9ycy5sZW5ndGggKiAyICsgMSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoZGVzY3JpcHRvcnNbaV0uZ2V0SWQoKSwgZGVzY3JpcHRvcnNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIG91ciBjaGlsZCBlbnRyaWVzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDaGlsZEVudHJpZXMoKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgY3VycmVudCBkZXNjcmlwdG9ycwotICAgICAgICBMaXN0IGRlc2NyaXB0b3JzID0gY29tcHV0ZU1lcmdlZFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQotICAgICAgICAvLyByZWJ1aWxkIGNoaWxkIGVudHJpZXMgdXNpbmcgb2xkIHdoZW4gcG9zc2libGUKLSAgICAgICAgUHJvcGVydHlTaGVldEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBQcm9wZXJ0eVNoZWV0RW50cnlbZGVzY3JpcHRvcnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSVByb3BlcnR5RGVzY3JpcHRvciBkID0gKElQcm9wZXJ0eURlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldChpKTsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnkKLSAgICAgICAgICAgIFByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeSA9IGNyZWF0ZUNoaWxkRW50cnkoKTsKLQkJCWVudHJ5LnNldERlc2NyaXB0b3IoZCk7Ci0gICAgICAgICAgICBlbnRyeS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgICAgICBlbnRyeS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKHByb3BlcnR5U291cmNlUHJvdmlkZXIpOwotICAgICAgICAgICAgZW50cnkucmVmcmVzaFZhbHVlcygpOwotICAgICAgICAgICAgbmV3RW50cmllc1tpXSA9IGVudHJ5OwotICAgICAgICB9Ci0gICAgICAgIC8vIG9ubHkgYXNzaWduIGlmIHN1Y2Nlc3NmdWwKLSAgICAgICAgY2hpbGRFbnRyaWVzID0gbmV3RW50cmllczsKLSAgICB9Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgY2hpbGQgPGNvZGU+UHJvcGVydHlTaGVldEVudHJ5PC9jb2RlPgotCSAqIGluc3RhbmNlLgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJ3cml0ZSB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGVpciBvd24gY2xhc3MuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgPGNvZGU+UHJvcGVydHlTaGVldEVudHJ5PC9jb2RlPiBpbnN0YW5jZSBmb3IgdGhlCi0JICogICAgICAgICBkZXNjcmlwdG9yIHBhc3NlZCBpbgotICAgICAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldEVudHJ5IGNyZWF0ZUNoaWxkRW50cnkoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlTaGVldEVudHJ5KCk7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTaGVldEVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChlZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZWRpdG9yLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGVkaXRvciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcmVjdXJzaXZlIGNhbGwgdG8gZGlzcG9zZSBjaGlsZHJlbgotICAgICAgICBQcm9wZXJ0eVNoZWV0RW50cnlbXSBlbnRyaWVzVG9EaXNwb3NlID0gY2hpbGRFbnRyaWVzOwotICAgICAgICBjaGlsZEVudHJpZXMgPSBudWxsOwotICAgICAgICBpZiAoZW50cmllc1RvRGlzcG9zZSAhPSBudWxsKQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzVG9EaXNwb3NlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy8gYW4gZXJyb3IgaW4gYSBwcm9wZXJ0eSBzb3VyY2UgbWF5IGNhdXNlIHJlZnJlc2hDaGlsZEVudHJpZXMKLSAgICAgICAgICAgICAgICAvLyB0byBmYWlsLiBTaW5jZSB0aGUgV29ya2JlbmNoIGhhbmRsZXMgc3VjaCBlcnJvcnMgd2UKLSAgICAgICAgICAgICAgICAvLyBjYW4gYmUgbGVmdCBpbiBhIHN0YXRlIHdoZXJlIGEgY2hpbGQgZW50cnkgaXMgbnVsbC4KLSAgICAgICAgICAgICAgICBpZiAoZW50cmllc1RvRGlzcG9zZVtpXSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBlbnRyaWVzVG9EaXNwb3NlW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2hpbGQgZW50cmllcyBvZiB0aGlzIGVudHJ5IGhhdmUgY2hhbmdlZCAKLSAgICAgKiAoY2hpbGRyZW4gYWRkZWQgb3IgcmVtb3ZlZCkuCi0gICAgICogTm90aWZ5IGFsbCBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmlyZUNoaWxkRW50cmllc0NoYW5nZWQoKSB7Ci0gICAgICAgIE9iamVjdFtdIGFycmF5ID0gZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lciBsaXN0ZW5lciA9IChJUHJvcGVydHlTaGVldEVudHJ5TGlzdGVuZXIpIGFycmF5W2ldOwotICAgICAgICAgICAgbGlzdGVuZXIuY2hpbGRFbnRyaWVzQ2hhbmdlZCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBlcnJvciBtZXNzYWdlIG9mIHRoaXMgZW50cnkgaGFzIGNoYW5nZWQuCi0gICAgICogTm90aWZ5IGFsbCBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmlyZUVycm9yTWVzc2FnZUNoYW5nZWQoKSB7Ci0gICAgICAgIE9iamVjdFtdIGFycmF5ID0gZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lciBsaXN0ZW5lciA9IChJUHJvcGVydHlTaGVldEVudHJ5TGlzdGVuZXIpIGFycmF5W2ldOwotICAgICAgICAgICAgbGlzdGVuZXIuZXJyb3JNZXNzYWdlQ2hhbmdlZCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZXMgb2YgdGhpcyBlbnRyeSBoYXZlIGNoYW5nZWQuCi0gICAgICogTm90aWZ5IGFsbCBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmlyZVZhbHVlQ2hhbmdlZCgpIHsKLSAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSVByb3BlcnR5U2hlZXRFbnRyeUxpc3RlbmVyIGxpc3RlbmVyID0gKElQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lcikgYXJyYXlbaV07Ci0gICAgICAgICAgICBsaXN0ZW5lci52YWx1ZUNoYW5nZWQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNoZWV0RW50cnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0Q2F0ZWdvcnkoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNoZWV0RW50cnkuCi0gICAgICovCi0gICAgcHVibGljIElQcm9wZXJ0eVNoZWV0RW50cnlbXSBnZXRDaGlsZEVudHJpZXMoKSB7Ci0gICAgICAgIGlmIChjaGlsZEVudHJpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIGNyZWF0ZUNoaWxkRW50cmllcygpOwotICAgICAgICByZXR1cm4gY2hpbGRFbnRyaWVzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U2hlZXRFbnRyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgZW50cnkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIGVudHJ5Ci0gICAgICogQHNpbmNlIDMuMSAod2FzIHByZXZpb3VzbHkgcHJpdmF0ZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVByb3BlcnR5RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNoZWV0RW50cnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0RGlzcGxheU5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0RW50cnkjZ2V0RWRpdG9yKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2VsbEVkaXRvciBnZXRFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIGlmIChlZGl0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgZWRpdG9yID0gZGVzY3JpcHRvci5jcmVhdGVQcm9wZXJ0eUVkaXRvcihwYXJlbnQpOwotICAgICAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZWRpdG9yLmFkZExpc3RlbmVyKGNlbGxFZGl0b3JMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlZGl0b3Iuc2V0VmFsdWUoZWRpdFZhbHVlKTsKLSAgICAgICAgICAgIHNldEVycm9yVGV4dChlZGl0b3IuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlZGl0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWRpdCB2YWx1ZSBmb3IgdGhlIG9iamVjdCBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHZhbHVlIG9iamVjdCBpbmRleAotICAgICAqIEByZXR1cm4gdGhlIGVkaXQgdmFsdWUgZm9yIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIGluZGV4Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRFZGl0VmFsdWUoaW50IGluZGV4KSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IHZhbHVlc1tpbmRleF07Ci0gICAgICAgIElQcm9wZXJ0eVNvdXJjZSBzb3VyY2UgPSBnZXRQcm9wZXJ0eVNvdXJjZSh2YWx1ZSk7Ci0gICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWUgPSBzb3VyY2UuZ2V0RWRpdGFibGVWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNoZWV0RW50cnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvclRleHQoKSB7Ci0gICAgICAgIHJldHVybiBlcnJvclRleHQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTaGVldEVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVycygpW10gewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXRGaWx0ZXJGbGFncygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U2hlZXRFbnRyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEhlbHBDb250ZXh0SWRzKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXRIZWxwQ29udGV4dElkcygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U2hlZXRFbnRyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0gICAgICAgIElMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gZGVzY3JpcHRvci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBwcm92aWRlci5nZXRJbWFnZShlZGl0VmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGlzIGVudHJ5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vIHBhcmVudAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlTaGVldEVudHJ5IGdldFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBwcm9wZXJ0eSBzb3VyY2UgZm9yIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0IGFuIG9iamVjdCBmb3Igd2hpY2ggdG8gb2J0YWluIGEgcHJvcGVydHkgc291cmNlIG9yCi0gICAgICogIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEgcHJvcGVydHkgc291cmNlIGlzIG5vdCBhdmFpbGFibGUKLSAgICAgKiBAcmV0dXJuIGFuIHByb3BlcnR5IHNvdXJjZSBmb3IgdGhlIGdpdmVuIG9iamVjdAotICAgICAqIEBzaW5jZSAzLjEgKHdhcyBwcmV2aW91c2x5IHByaXZhdGUpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElQcm9wZXJ0eVNvdXJjZSBnZXRQcm9wZXJ0eVNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChzb3VyY2VzLmNvbnRhaW5zS2V5KG9iamVjdCkpCi0gICAgICAgICAgICByZXR1cm4gKElQcm9wZXJ0eVNvdXJjZSkgc291cmNlcy5nZXQob2JqZWN0KTsKLQotICAgICAgICBJUHJvcGVydHlTb3VyY2UgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKHByb3BlcnR5U291cmNlUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9IHByb3BlcnR5U291cmNlUHJvdmlkZXIuZ2V0UHJvcGVydHlTb3VyY2Uob2JqZWN0KTsKLSAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVByb3BlcnR5U291cmNlKQotICAgICAgICAgICAgcmVzdWx0ID0gKElQcm9wZXJ0eVNvdXJjZSkgb2JqZWN0OwotICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotICAgICAgICAgICAgcmVzdWx0ID0gKElQcm9wZXJ0eVNvdXJjZSkgKChJQWRhcHRhYmxlKSBvYmplY3QpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElQcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0KLSAgICAgICAgc291cmNlcy5wdXQob2JqZWN0LCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U2hlZXRFbnRyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlQXNTdHJpbmcoKSB7Ci0gICAgICAgIGlmIChlZGl0VmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsvLyROT04tTkxTLTEkCi0gICAgICAgIElMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gZGVzY3JpcHRvci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGVkaXRWYWx1ZS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IHByb3ZpZGVyLmdldFRleHQoZWRpdFZhbHVlKTsKLSAgICAgICAgaWYodGV4dCA9PSBudWxsKQotICAgICAgICAJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2JqZWN0cyBvZiB0aGlzIGVudHJ5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2JqZWN0cyBvZiB0aGlzIGVudHJ5Ci0gICAgICogQHNpbmNlIDMuMSAod2FzIHByZXZpb3VzbHkgcHJpdmF0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0VmFsdWVzKCkgewotICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U2hlZXRFbnRyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZEVudHJpZXMoKSB7Ci0gICAgICAgIGlmIChjaGlsZEVudHJpZXMgIT0gbnVsbCAmJiBjaGlsZEVudHJpZXMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAvLyBzZWUgaWYgd2UgY291bGQgaGF2ZSBlbnRpcmVzIGlmIHdlIHdlcmUgYXNrZWQKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVNZXJnZWRQcm9wZXJ0eURlc2NyaXB0b3JzKCkuc2l6ZSgpID4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgb3VyIGNoaWxkIGVudHJpZXMuCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB0cmllcyB0byByZXVzZSBjaGlsZCBlbnRyaWVzIGlmIHBvc3NpYmxlIAotICAgICAqIChpZiB0aGUgaWQgb2YgdGhlIG5ldyBkZXNjcmlwdG9yIG1hdGNoZXMgdGhlIGRlc2NyaXB0b3IgaWQgb2YgdGhlCi0gICAgICogb2xkIGVudHJ5KS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaENoaWxkRW50cmllcygpIHsKLSAgICAgICAgaWYgKGNoaWxkRW50cmllcyA9PSBudWxsKQotICAgICAgICAgICAgLy8gbm8gY2hpbGRyZW4gdG8gcmVmcmVzaAotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIGdldCB0aGUgY3VycmVudCBkZXNjcmlwdG9ycwotICAgICAgICBMaXN0IGRlc2NyaXB0b3JzID0gY29tcHV0ZU1lcmdlZFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQotICAgICAgICAvLyBjYWNoZSBvbGQgZW50cmllcyBieSB0aGVpciBkZXNjcmlwdG9yIGlkCi0gICAgICAgIE1hcCBlbnRyeUNhY2hlID0gbmV3IEhhc2hNYXAoY2hpbGRFbnRyaWVzLmxlbmd0aCAqIDIgKyAxKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5U2hlZXRFbnRyeSBjaGlsZEVudHJ5ID0gY2hpbGRFbnRyaWVzW2ldOwotICAgICAgICAgICAgaWYgKGNoaWxkRW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVudHJ5Q2FjaGUucHV0KGNoaWxkRW50cnkuZ2V0RGVzY3JpcHRvcigpLmdldElkKCksIGNoaWxkRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgbGlzdCBvZiBlbnRyaWVzIHRvIGRpc3Bvc2UKLSAgICAgICAgTGlzdCBlbnRyaWVzVG9EaXNwb3NlID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGNoaWxkRW50cmllcykpOwotCi0gICAgICAgIC8vIGNsZWFyIHRoZSBvbGQgZW50cmllcwotICAgICAgICB0aGlzLmNoaWxkRW50cmllcyA9IG51bGw7Ci0KLSAgICAgICAgLy8gcmVidWlsZCBjaGlsZCBlbnRyaWVzIHVzaW5nIG9sZCB3aGVuIHBvc3NpYmxlCi0gICAgICAgIFByb3BlcnR5U2hlZXRFbnRyeVtdIG5ld0VudHJpZXMgPSBuZXcgUHJvcGVydHlTaGVldEVudHJ5W2Rlc2NyaXB0b3JzLnNpemUoKV07Ci0gICAgICAgIGJvb2xlYW4gZW50cmllc0NoYW5nZWQgPSBkZXNjcmlwdG9ycy5zaXplKCkgIT0gZW50cnlDYWNoZS5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIElQcm9wZXJ0eURlc2NyaXB0b3IgZCA9IChJUHJvcGVydHlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQoaSk7Ci0gICAgICAgICAgICAvLyBzZWUgaWYgd2UgaGF2ZSBhbiBlbnRyeSBtYXRjaGluZyB0aGlzIGRlc2NyaXB0b3IKLSAgICAgICAgICAgIFByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeSA9IChQcm9wZXJ0eVNoZWV0RW50cnkpIGVudHJ5Q2FjaGUuZ2V0KGQKLSAgICAgICAgICAgICAgICAgICAgLmdldElkKCkpOwotICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyByZXVzZSBvbGQgZW50cnkKLSAgICAgICAgICAgICAgICBlbnRyeS5zZXREZXNjcmlwdG9yKGQpOwotICAgICAgICAgICAgICAgIGVudHJpZXNUb0Rpc3Bvc2UucmVtb3ZlKGVudHJ5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBlbnRyeQotICAgICAgICAgICAgICAgIGVudHJ5ID0gY3JlYXRlQ2hpbGRFbnRyeSgpOwotICAgICAgICAgICAgICAgIGVudHJ5LnNldERlc2NyaXB0b3IoZCk7Ci0gICAgICAgICAgICAgICAgZW50cnkuc2V0UGFyZW50KHRoaXMpOwotICAgICAgICAgICAgICAgIGVudHJ5LnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIocHJvcGVydHlTb3VyY2VQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgZW50cmllc0NoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW50cnkucmVmcmVzaFZhbHVlcygpOwotICAgICAgICAgICAgbmV3RW50cmllc1tpXSA9IGVudHJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb25seSBhc3NpZ24gaWYgc3VjY2Vzc2Z1bAotICAgICAgICB0aGlzLmNoaWxkRW50cmllcyA9IG5ld0VudHJpZXM7Ci0gICAgICAgIAotICAgICAgICBpZiAoZW50cmllc0NoYW5nZWQpCi0gICAgICAgICAgICBmaXJlQ2hpbGRFbnRyaWVzQ2hhbmdlZCgpOwotCi0gICAgICAgIC8vRGlzcG9zZSBvZiBlbnRyaWVzIHdoaWNoIGFyZSBubyBsb25nZXIgbmVlZGVkCQkKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzVG9EaXNwb3NlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAoKElQcm9wZXJ0eVNoZWV0RW50cnkpIGVudHJpZXNUb0Rpc3Bvc2UuZ2V0KGkpKS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZyZXNoIHRoZSBlbnRyeSB0cmVlIGZyb20gdGhlIHJvb3QgZG93bi4KLSAgICAgKgotICAgICAqIEBzaW5jZSAzLjEgKHdhcyBwcmV2aW91c2x5IHByaXZhdGUpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZyb21Sb290KCkgewotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICByZWZyZXNoQ2hpbGRFbnRyaWVzKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBhcmVudC5yZWZyZXNoRnJvbVJvb3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgb3VyIHZhbHVlIG9iamVjdHMuCi0gICAgICogV2UgYXNrIG91ciBwYXJlbnQgZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZXMgYmFzZWQgb24KLSAgICAgKiBvdXIgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFZhbHVlcygpIHsKLSAgICAgICAgLy8gZ2V0IG91ciBwYXJlbnQncyB2YWx1ZSBvYmplY3RzCi0gICAgICAgIE9iamVjdFtdIGN1cnJlbnRTb3VyY2VzID0gcGFyZW50LmdldFZhbHVlcygpOwotCi0gICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgb2JqZWN0cyBnZXR0aW5nIG91ciBwcm9wZXJ0eSB2YWx1ZSBmcm9tIGVhY2gKLSAgICAgICAgT2JqZWN0W10gbmV3VmFsdWVzID0gbmV3IE9iamVjdFtjdXJyZW50U291cmNlcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRTb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJUHJvcGVydHlTb3VyY2Ugc291cmNlID0gcGFyZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eVNvdXJjZShjdXJyZW50U291cmNlc1tpXSk7Ci0gICAgICAgICAgICBuZXdWYWx1ZXNbaV0gPSBzb3VyY2UuZ2V0UHJvcGVydHlWYWx1ZShkZXNjcmlwdG9yLmdldElkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IG91ciBuZXcgdmFsdWVzCi0gICAgICAgIHNldFZhbHVlcyhuZXdWYWx1ZXMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U2hlZXRFbnRyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lcigKLSAgICAgICAgICAgIElQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICByZW1vdmVMaXN0ZW5lck9iamVjdChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTaGVldEVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZSgpIHsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgLy8gcm9vdCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vCVVzZSBvdXIgcGFyZW50J3MgdmFsdWVzIHRvIHJlc2V0IG91ciB2YWx1ZXMuCi0gICAgICAgIGJvb2xlYW4gY2hhbmdlID0gZmFsc2U7Ci0gICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSBwYXJlbnQuZ2V0VmFsdWVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSVByb3BlcnR5U291cmNlIHNvdXJjZSA9IGdldFByb3BlcnR5U291cmNlKG9iamVjdHNbaV0pOwotICAgICAgICAgICAgaWYgKHNvdXJjZS5pc1Byb3BlcnR5U2V0KGRlc2NyaXB0b3IuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTc1NgotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBJUHJvcGVydHlTb3VyY2UyKSB7Ci0gICAgICAgICAgICAgICAgICAgIElQcm9wZXJ0eVNvdXJjZTIgZXh0ZW5kZWRTb3VyY2UgPSAoSVByb3BlcnR5U291cmNlMikgc291cmNlOwotICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZSB3aXRoIG5leHQgaWYgcHJvcGVydHkgaXMgbm90IHJlc2V0dGFibGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFleHRlbmRlZFNvdXJjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc1Byb3BlcnR5UmVzZXR0YWJsZShkZXNjcmlwdG9yLmdldElkKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNvdXJjZS5yZXNldFByb3BlcnR5VmFsdWUoZGVzY3JpcHRvci5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGFuZ2UpCi0gICAgICAgICAgICByZWZyZXNoRnJvbVJvb3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlc2NyaXB0b3IuCi0gICAgICogQHBhcmFtIG5ld0Rlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0RGVzY3JpcHRvcihJUHJvcGVydHlEZXNjcmlwdG9yIG5ld0Rlc2NyaXB0b3IpIHsKLSAgICAgICAgLy8gaWYgb3VyIGRlc2NyaXB0b3IgaXMgY2hhbmdpbmcsIHdlIGhhdmUgdG8gZ2V0IHJpZAotICAgICAgICAvLyBvZiBvdXIgY3VycmVudCBlZGl0b3IgaWYgdGhlcmUgaXMgb25lCi0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG5ld0Rlc2NyaXB0b3IgJiYgZWRpdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVkaXRvci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBlZGl0b3IgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGRlc2NyaXB0b3IgPSBuZXdEZXNjcmlwdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZXJyb3IgdGV4dC4gIFRoaXMgc2hvdWxkIGJlIHNldCB0byBudWxsIHdoZW4KLSAgICAgKiB0aGUgY3VycmVudCB2YWx1ZSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGl0IHNob3VsZCBiZQotICAgICAqIHNldCB0byBhIGVycm9yIHN0cmluZwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRFcnJvclRleHQoU3RyaW5nIG5ld0Vycm9yVGV4dCkgewotICAgICAgICBlcnJvclRleHQgPSBuZXdFcnJvclRleHQ7Ci0gICAgICAgIC8vIGluZm9ybSBsaXN0ZW5lcnMKLSAgICAgICAgZmlyZUVycm9yTWVzc2FnZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXJlbnQgb2YgdGhlIGVudHJ5IHRvIGJlIHByb3BlcnR5U2hlZXRFbnRyeS4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlTaGVldEVudHJ5Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFBhcmVudChQcm9wZXJ0eVNoZWV0RW50cnkgcHJvcGVydHlTaGVldEVudHJ5KSB7Ci0gICAgICAgIHBhcmVudCA9IHByb3BlcnR5U2hlZXRFbnRyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgcHJvcGVydHkgc291cmNlIHByb3ZpZGVyIGZvciB0aGlzIGVudHJ5LiAKLSAgICAgKiBUaGlzIHByb3ZpZGVyIGlzIHVzZWQgdG8gb2J0YWluIGFuIDxjb2RlPklQcm9wZXJ0eVNvdXJjZTwvY29kZT4KLSAgICAgKiBmb3IgZWFjaCBvZiB0aGlzIGVudHJpZXMgb2JqZWN0cy4gSWYgbm8gcHJvdmlkZXIgaXMKLSAgICAgKiBzZXQgdGhlbiBhIGRlZmF1bHQgcHJvdmlkZXIgaXMgdXNlZC4KLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgSVByb3BlcnR5U291cmNlUHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgIHByb3BlcnR5U291cmNlUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIGZvciB0aGlzIGVudHJ5LgotICAgICAqIDxwPgotICAgICAqIFdlIHNldCB0aGUgZ2l2ZW4gdmFsdWUgYXMgdGhlIHZhbHVlIGZvciBhbGwgb3VyIHZhbHVlIG9iamVjdHMuCi0gICAgICogV2UgdGhlbiBjYWxsIG91ciBwYXJlbnQgdG8gdXBkYXRlIHRoZSBwcm9wZXJ0eSB3ZSByZXByZXNlbnQKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgKiBXZSB0aGVuIHRyaWdnZXIgYSBtb2RlbCByZWZyZXNoLgotICAgICAqIDxwPgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWUoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIC8vIFNldCB0aGUgdmFsdWUKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHZhbHVlc1tpXSA9IG5ld1ZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5mb3JtIG91ciBwYXJlbnQKLSAgICAgICAgcGFyZW50LnZhbHVlQ2hhbmdlZCh0aGlzKTsKLQotICAgICAgICAvLyBSZWZyZXNoIHRoZSBtb2RlbAotICAgICAgICByZWZyZXNoRnJvbVJvb3QoKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPlByb3BlcnR5U2hlZXRFbnRyeTwvY29kZT4gaW1wbG1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogbWV0aG9kIGRlY2xhcmVkIG9uPGNvZGU+SVByb3BlcnR5U2hlZXRFbnRyeTwvY29kZT4gd2lsbAotICAgICAqIG9idGFpbiBhbiBlZGl0YWJsZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIG9iamVjdHMgYW5kIHVwZGF0ZQotICAgICAqIHRoZSBjaGlsZCBlbnRyaWVzLgotICAgICAqIDxwPgotICAgICAqIFVwZGF0aW5nIHRoZSBjaGlsZCBlbnRyaWVzIHdpbGwgdHlwaWNhbGx5IGNhbGwgdGhpcyBtZXRob2QKLSAgICAgKiBvbiB0aGUgY2hpbGQgZW50cmllcyBhbmQgdGh1cyB0aGUgZW50aXJlIGVudHJ5IHRyZWUgaXMgdXBkYXRlZAotICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gb2JqZWN0cyB0aGUgbmV3IHZhbHVlcyBmb3IgdGhpcyBlbnRyeQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0gICAgICAgIHZhbHVlcyA9IG9iamVjdHM7Ci0gICAgICAgIHNvdXJjZXMgPSBuZXcgSGFzaE1hcCh2YWx1ZXMubGVuZ3RoICogMiArIDEpOwotCi0gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDApCi0gICAgICAgICAgICBlZGl0VmFsdWUgPSBudWxsOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHNldCB0aGUgZmlyc3QgdmFsdWUgb2JqZWN0IGFzIHRoZSBlbnRyeSdzIHZhbHVlCi0gICAgICAgICAgICBPYmplY3QgbmV3VmFsdWUgPSB2YWx1ZXNbMF07Ci0KLSAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBzaG91bGQgY29udmVydCB0aGUgdmFsdWUgdG8gYW4gZWRpdGFibGUgdmFsdWUKLSAgICAgICAgICAgIElQcm9wZXJ0eVNvdXJjZSBzb3VyY2UgPSBnZXRQcm9wZXJ0eVNvdXJjZShuZXdWYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2UuZ2V0RWRpdGFibGVWYWx1ZSgpOwotICAgICAgICAgICAgZWRpdFZhbHVlID0gbmV3VmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB1cGRhdGUgb3VyIGNoaWxkIGVudHJpZXMKLSAgICAgICAgcmVmcmVzaENoaWxkRW50cmllcygpOwotCi0gICAgICAgIC8vIGluZm9ybSBsaXN0ZW5lcnMgdGhhdCBvdXIgdmFsdWUgY2hhbmdlZAotICAgICAgICBmaXJlVmFsdWVDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjaGlsZCBlbnRyeSBoYXMgY2hhbmdlZC4KLSAgICAgKiBUaGVyZWZvcmUgd2UgbXVzdCBzZXQgdGhpcyBjaGFuZ2UgaW50byBvdXIgdmFsdWUgb2JqZWN0cy4KLSAgICAgKiA8cD4KLSAgICAgKiBXZSBtdXN0IGluZm9ybSBvdXIgcGFyZW50IHNvIHRoYXQgaXQgY2FuIHVwZGF0ZSBpdHMgdmFsdWUgb2JqZWN0cwotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBzZXQgdGhlIHByb3BlcnR5IHZhbHVlIGluIHNvbWUKLSAgICAgKiBjdXN0b20gd2F5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjaGlsZCB0aGUgY2hpbGQgZW50cnkgdGhhdCBjaGFuZ2VkIGl0cyB2YWx1ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eVNoZWV0RW50cnkgY2hpbGQpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElQcm9wZXJ0eVNvdXJjZSBzb3VyY2UgPSBnZXRQcm9wZXJ0eVNvdXJjZSh2YWx1ZXNbaV0pOwotICAgICAgICAgICAgc291cmNlLnNldFByb3BlcnR5VmFsdWUoY2hpbGQuZ2V0RGVzY3JpcHRvcigpLmdldElkKCksIGNoaWxkCi0gICAgICAgICAgICAgICAgICAgIC5nZXRFZGl0VmFsdWUoaSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW5mb3JtIG91ciBwYXJlbnQKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICAgICAgcGFyZW50LnZhbHVlQ2hhbmdlZCh0aGlzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5U2hlZXRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5U2hlZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNTFlMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9Qcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBHdW5uYXIgV2FnZW5rbmVjaHQgLSBmaXggZm9yIGJ1ZyAyMTc1NiBbUHJvcGVydGllc1ZpZXddIHByb3BlcnR5IHZpZXcgc29ydGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmhlbHAuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSUNvbnRleHRDb21wdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLlZpZXdzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydGllc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlOwotCi0vKioKLSAqIFRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiBwcm9wZXJ0eSBzaGVldCBwYWdlIHdoaWNoIHByZXNlbnRzCi0gKiBhIHRhYmxlIG9mIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgb2J0YWluZWQgZnJvbSB0aGUgY3VycmVudCBzZWxlY3Rpb24KLSAqIGluIHRoZSBhY3RpdmUgd29ya2JlbmNoIHBhcnQuCi0gKiA8cD4KLSAqIFRoaXMgcGFnZSBvYnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHRvIHByb3BlcnRpZXMgZGlzcGxheSBmcm9tIAotICogdGhlIGN1cnJlbnQgc2VsZWN0aW9uICh3aGljaCBpdCB0cmFja3MpLiAKLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIG1vZGVsIGZvciB0aGlzIHBhZ2UgaXMgYSBoaWVyYXJjaHkgb2YgPGNvZGU+SVByb3BlcnR5U2hlZXRFbnRyeTwvY29kZT4uCi0gKiBUaGUgcGFnZSBtYXkgYmUgY29uZmlndXJlZCB3aXRoIGEgY3VzdG9tIG1vZGVsIGJ5IHNldHRpbmcgdGhlIHJvb3QgZW50cnkuCi0gKiA8cD4KLSAqIElmIG5vIHJvb3QgZW50cnkgaXMgc2V0IHRoZW4gYSBkZWZhdWx0IG1vZGVsIGlzIGNyZWF0ZWQgd2hpY2ggdXNlcyB0aGUKLSAqIDxjb2RlPklQcm9wZXJ0eVNvdXJjZTwvY29kZT4gaW50ZXJmYWNlIHRvIG9idGFpbiB0aGUgcHJvcGVydGllcyBvZgotICogdGhlIGN1cnJlbnQgc2xlY3Rpb24uIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgc2VsZWN0ZWQgb2JqZWN0cyBwcm92aWRlIGFuCi0gKiA8Y29kZT5JUHJvcGVydHlTb3VyY2U8L2NvZGU+IGFkYXB0ZXIgKG9yIGltcGxlbWVudCAKLSAqIDxjb2RlPklQcm9wZXJ0eVNvdXJjZTwvY29kZT4gZGlyZWN0bHkpLiBUaGlzIHJlc3RpY3Rpb24gY2FuIGJlIG92ZXJjb21lCi0gKiBieSBwcm92aWRpbmcgdGhpcyBwYWdlIHdpdGggYW4gPGNvZGU+SVByb3BlcnR5U291cmNlUHJvdmlkZXI8L2NvZGU+LiBJZgotICogc3VwcGxpZWQsIHRoaXMgcHJvdmlkZXIgd2lsbCBiZSB1c2VkIGJ5IHRoZSBkZWZhdWx0IG1vZGVsIHRvIG9idGFpbiBhCi0gKiBwcm9wZXJ0eSBzb3VyY2UgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAKLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIElQcm9wZXJ0eVNvdXJjZQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlTaGVldFBhZ2UgZXh0ZW5kcyBQYWdlIGltcGxlbWVudHMgSVByb3BlcnR5U2hlZXRQYWdlIHsKLSAgICAvKioKLSAgICAgKiBIZWxwIGNvbnRleHQgaWQgCi0gICAgICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eV9zaGVldF9wYWdlX2hlbHBfY29udGV4dCI8L2NvZGU+KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUxQX0NPTlRFWFRfUFJPUEVSVFlfU0hFRVRfUEFHRSA9ICJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eV9zaGVldF9wYWdlX2hlbHBfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgUHJvcGVydHlTaGVldFZpZXdlciB2aWV3ZXI7Ci0gICAgCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eVNoZWV0U29ydGVyIHNvcnRlcjsKLQotICAgIHByaXZhdGUgSVByb3BlcnR5U2hlZXRFbnRyeSByb290RW50cnk7Ci0KLSAgICBwcml2YXRlIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIHByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBEZWZhdWx0c0FjdGlvbiBkZWZhdWx0c0FjdGlvbjsKLQotICAgIHByaXZhdGUgRmlsdGVyQWN0aW9uIGZpbHRlckFjdGlvbjsKLQotICAgIHByaXZhdGUgQ2F0ZWdvcmllc0FjdGlvbiBjYXRlZ29yaWVzQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBDb3B5UHJvcGVydHlBY3Rpb24gY29weUFjdGlvbjsKLQotICAgIHByaXZhdGUgSUNlbGxFZGl0b3JBY3RpdmF0aW9uTGlzdGVuZXIgY2VsbEVkaXRvckFjdGl2YXRpb25MaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIgY2VsbEVkaXRvckFjdGlvbkhhbmRsZXI7Ci0KLSAgICBwcml2YXRlIENsaXBib2FyZCBjbGlwYm9hcmQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHByb3BlcnR5IHNoZWV0IHBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnR5U2hlZXRQYWdlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gPGNvZGU+SVBhZ2U8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBjcmVhdGUgYSBuZXcgdmlld2VyCi0gICAgICAgIHZpZXdlciA9IG5ldyBQcm9wZXJ0eVNoZWV0Vmlld2VyKHBhcmVudCk7Ci0gICAgICAgIHZpZXdlci5zZXRTb3J0ZXIoc29ydGVyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHNldCB0aGUgbW9kZWwgZm9yIHRoZSB2aWV3ZXIKLSAgICAgICAgaWYgKHJvb3RFbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgcm9vdAotICAgICAgICAgICAgUHJvcGVydHlTaGVldEVudHJ5IHJvb3QgPSBuZXcgUHJvcGVydHlTaGVldEVudHJ5KCk7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHByb3BlcnR5IHNvdXJjZSBwcm92aWRlcgotICAgICAgICAgICAgICAgIHJvb3Quc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICByb290RW50cnkgPSByb290OwotICAgICAgICB9Ci0gICAgICAgIHZpZXdlci5zZXRSb290RW50cnkocm9vdEVudHJ5KTsKLSAgICAgICAgdmlld2VyLmFkZEFjdGl2YXRpb25MaXN0ZW5lcihnZXRDZWxsRWRpdG9yQWN0aXZhdGlvbkxpc3RlbmVyKCkpOwotICAgICAgICAvLyBhZGQgYSBsaXN0ZW5lciB0byB0cmFjayB3aGVuIHRoZSBlbnRyeSBzZWxlY3Rpb24gY2hhbmdlcwotICAgICAgICB2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFbnRyeVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpbml0RHJhZ0FuZERyb3AoKTsKLSAgICAgICAgbWFrZUFjdGlvbnMoKTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIHBvcHVwIG1lbnUgZm9yIHRoZSBwYWdlLgotICAgICAgICBNZW51TWFuYWdlciBtZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wdXBNZW51Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbWVudU1nci5hZGQoY29weUFjdGlvbik7Ci0gICAgICAgIG1lbnVNZ3IuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIG1lbnVNZ3IuYWRkKGRlZmF1bHRzQWN0aW9uKTsKLSAgICAgICAgTWVudSBtZW51ID0gbWVudU1nci5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCi0gICAgICAgIC8vIFNldCBoZWxwIG9uIHRoZSB2aWV3ZXIgCi0gICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuYWRkSGVscExpc3RlbmVyKG5ldyBIZWxwTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQHNlZSBIZWxwTGlzdGVuZXIjaGVscFJlcXVlc3RlZChIZWxwRXZlbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhlbHBSZXF1ZXN0ZWQoSGVscEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGNvbnRleHQgZm9yIHRoZSBzZWxlY3RlZCBpdGVtCi0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSVByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeSA9IChJUHJvcGVydHlTaGVldEVudHJ5KSBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBoZWxwQ29udGV4dElkID0gZW50cnkuZ2V0SGVscENvbnRleHRJZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhlbHBDb250ZXh0SWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlbHBDb250ZXh0SWQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCS5nZXRIZWxwU3lzdGVtKCkuZGlzcGxheUhlbHAoCi0JCQkJCQkJCQkJCShTdHJpbmcpIGhlbHBDb250ZXh0SWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgMi4wIHRoZSBvbmx5IHZhbGlkIHR5cGUgZm9yIGhlbHBDb250ZXh0SWRzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBhIFN0cmluZyAoYSBzaW5nbGUgaWQpLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3ZSBoYXZlIHRvIGhhbmRsZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGFycmF5IG9mIGNvbnRleHRzIChTdHJpbmdzIGFuZC9vciBJQ29udGV4dHMpIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgYSBjb250ZXh0IGNvbXB1dGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gY29udGV4dHMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlbHBDb250ZXh0SWQgaW5zdGFuY2VvZiBJQ29udGV4dENvbXB1dGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGxvY2FsIGNvbnRleHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMgPSAoKElDb250ZXh0Q29tcHV0ZXIpIGhlbHBDb250ZXh0SWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxDb250ZXh0cyhlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMgPSAoT2JqZWN0W10pIGhlbHBDb250ZXh0SWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHRzWzBdIGluc3RhbmNlb2YgSUNvbnRleHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAJaGVscC5kaXNwbGF5SGVscCgoSUNvbnRleHQpIGNvbnRleHRzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIAloZWxwLmRpc3BsYXlIZWxwKChTdHJpbmcpIGNvbnRleHRzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vIGhlbHAgZm9yIHRoZSBzZWxlY3Rpb24gc28gc2hvdyBwYWdlIGhlbHAKLSAgICAgICAgICAgICAgICBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLmRpc3BsYXlIZWxwKEhFTFBfQ09OVEVYVF9QUk9QRVJUWV9TSEVFVF9QQUdFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlByb3BlcnR5U2hlZXRQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklQYWdlPC9jb2RlPiBtZXRob2QgCi0gICAgICogZGlzcG9zZXMgb2YgdGhpcyBwYWdlJ3MgZW50cmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIGlmIChyb290RW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgcm9vdEVudHJ5LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHJvb3RFbnRyeSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsaXBib2FyZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbGlwYm9hcmQuZGlzcG9zZSgpOwotICAgICAgICAgICAgY2xpcGJvYXJkID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNlbGwgZWRpdG9yIGFjdGl2YXRpb24gbGlzdGVuZXIgZm9yIHRoaXMgcGFnZQotICAgICAqIEByZXR1cm4gSUNlbGxFZGl0b3JBY3RpdmF0aW9uTGlzdGVuZXIgdGhlIGNlbGwgZWRpdG9yIGFjdGl2YXRpb24gbGlzdGVuZXIgZm9yIHRoaXMgcGFnZQotICAgICAqLwotICAgIHByaXZhdGUgSUNlbGxFZGl0b3JBY3RpdmF0aW9uTGlzdGVuZXIgZ2V0Q2VsbEVkaXRvckFjdGl2YXRpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgaWYgKGNlbGxFZGl0b3JBY3RpdmF0aW9uTGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgY2VsbEVkaXRvckFjdGl2YXRpb25MaXN0ZW5lciA9IG5ldyBJQ2VsbEVkaXRvckFjdGl2YXRpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjZWxsRWRpdG9yQWN0aXZhdGVkKENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbEVkaXRvckFjdGlvbkhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxFZGl0b3JBY3Rpb25IYW5kbGVyLmFkZENlbGxFZGl0b3IoY2VsbEVkaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2VsbEVkaXRvckRlYWN0aXZhdGVkKENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbEVkaXRvckFjdGlvbkhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxFZGl0b3JBY3Rpb25IYW5kbGVyLnJlbW92ZUNlbGxFZGl0b3IoY2VsbEVkaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2VsbEVkaXRvckFjdGl2YXRpb25MaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQYWdlIChhbmQgUGFnZSkuCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLSAgICAgICAgaWYgKHZpZXdlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYSBzZWxlY3Rpb24gY2hhbmdlIGluIHRoZSBlbnRyeSB0YWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIG5ldyBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFbnRyeVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBpZiAoZGVmYXVsdHNBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0c0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzZWUgaWYgaXRlbSBpcyBlZGl0YWJsZQotICAgICAgICAgICAgYm9vbGVhbiBlZGl0YWJsZSA9IHZpZXdlci5nZXRBY3RpdmVDZWxsRWRpdG9yKCkgIT0gbnVsbDsKLSAgICAgICAgICAgIGRlZmF1bHRzQWN0aW9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBkcmFnIGFuZCBkcm9wIHN1cHBvcnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdERyYWdBbmREcm9wKCkgewotICAgICAgICBpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFk7Ci0gICAgICAgIFRyYW5zZmVyW10gdHJhbnNmZXJUeXBlcyA9IG5ldyBUcmFuc2ZlcltdIHsgVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLSAgICAgICAgRHJhZ1NvdXJjZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IERyYWdTb3VyY2VBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybURyYWdTZXREYXRhKGV2ZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIC8vTm90aGluZyB0byBkbyBoZXJlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIERyYWdTb3VyY2UgZHJhZ1NvdXJjZSA9IG5ldyBEcmFnU291cmNlKAotICAgICAgICAgICAgICAgIHZpZXdlci5nZXRDb250cm9sKCksIG9wZXJhdGlvbnMpOwotICAgICAgICBkcmFnU291cmNlLnNldFRyYW5zZmVyKHRyYW5zZmVyVHlwZXMpOwotICAgICAgICBkcmFnU291cmNlLmFkZERyYWdMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHVzZXIgaXMgYXR0ZW1wdGluZyB0byBkcmFnLiAgQWRkIHRoZSBhcHByb3ByaWF0ZQotICAgICAqIGRhdGEgdG8gdGhlIGV2ZW50LgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgc2VudCBmcm9tIHRoZSBkcmFnIGFuZCBkcm9wIHN1cHBvcnQuCi0gICAgICovCi0gICAgdm9pZCBwZXJmb3JtRHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vIEdldCB0aGUgc2VsZWN0ZWQgcHJvcGVydHkKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvLyBBc3N1bWUgc2luZ2xlIHNlbGVjdGlvbgotICAgICAgICBJUHJvcGVydHlTaGVldEVudHJ5IGVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgIC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAvLyBQbGFjZSB0ZXh0IGFzIHRoZSBkYXRhCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoZW50cnkuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmZmVyLmFwcGVuZChlbnRyeS5nZXRWYWx1ZUFzU3RyaW5nKCkpOwotCi0gICAgICAgIGV2ZW50LmRhdGEgPSBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlIGFjdGlvbiBvYmplY3RzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtYWtlQWN0aW9ucygpIHsKLSAgICAgICAgSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgLmdldFNoYXJlZEltYWdlcygpOwotCi0gICAgICAgIC8vIFJlc3RvcmUgRGVmYXVsdCBWYWx1ZQotICAgICAgICBkZWZhdWx0c0FjdGlvbiA9IG5ldyBEZWZhdWx0c0FjdGlvbih2aWV3ZXIsICJkZWZhdWx0cyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRlZmF1bHRzQWN0aW9uLnNldFRleHQoUHJvcGVydGllc01lc3NhZ2VzLkRlZmF1bHRzX3RleHQpOwotICAgICAgICBkZWZhdWx0c0FjdGlvbi5zZXRUb29sVGlwVGV4dChQcm9wZXJ0aWVzTWVzc2FnZXMuRGVmYXVsdHNfdG9vbFRpcCk7Ci0gICAgICAgIGRlZmF1bHRzQWN0aW9uCi0gICAgICAgICAgICAgICAgLnNldEltYWdlRGVzY3JpcHRvcihWaWV3c1BsdWdpbi5nZXRWaWV3SW1hZ2VEZXNjcmlwdG9yKCJlbGNsMTYvZGVmYXVsdHNfcHMuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRlZmF1bHRzQWN0aW9uCi0gICAgICAgICAgICAgICAgLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFZpZXdzUGx1Z2luLmdldFZpZXdJbWFnZURlc2NyaXB0b3IoImRsY2wxNi9kZWZhdWx0c19wcy5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGVmYXVsdHNBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgLy8gU2hvdyBBZHZhbmNlZCBQcm9wZXJ0aWVzCi0gICAgICAgIGZpbHRlckFjdGlvbiA9IG5ldyBGaWx0ZXJBY3Rpb24odmlld2VyLCAiZmlsdGVyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmlsdGVyQWN0aW9uLnNldFRleHQoUHJvcGVydGllc01lc3NhZ2VzLkZpbHRlcl90ZXh0KTsKLSAgICAgICAgZmlsdGVyQWN0aW9uLnNldFRvb2xUaXBUZXh0KFByb3BlcnRpZXNNZXNzYWdlcy5GaWx0ZXJfdG9vbFRpcCk7Ci0gICAgICAgIGZpbHRlckFjdGlvbgotICAgICAgICAgICAgICAgIC5zZXRJbWFnZURlc2NyaXB0b3IoVmlld3NQbHVnaW4uZ2V0Vmlld0ltYWdlRGVzY3JpcHRvcigiZWxjbDE2L2ZpbHRlcl9wcy5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmlsdGVyQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCi0gICAgICAgIC8vIFNob3cgQ2F0ZWdvcmllcwotICAgICAgICBjYXRlZ29yaWVzQWN0aW9uID0gbmV3IENhdGVnb3JpZXNBY3Rpb24odmlld2VyLCAiY2F0ZWdvcmllcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNhdGVnb3JpZXNBY3Rpb24uc2V0VGV4dChQcm9wZXJ0aWVzTWVzc2FnZXMuQ2F0ZWdvcmllc190ZXh0KTsKLSAgICAgICAgY2F0ZWdvcmllc0FjdGlvbi5zZXRUb29sVGlwVGV4dChQcm9wZXJ0aWVzTWVzc2FnZXMuQ2F0ZWdvcmllc190b29sVGlwKTsKLSAgICAgICAgY2F0ZWdvcmllc0FjdGlvbgotICAgICAgICAgICAgICAgIC5zZXRJbWFnZURlc2NyaXB0b3IoVmlld3NQbHVnaW4uZ2V0Vmlld0ltYWdlRGVzY3JpcHRvcigiZWxjbDE2L3RyZWVfbW9kZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY2F0ZWdvcmllc0FjdGlvbi5zZXRDaGVja2VkKHRydWUpOwotCi0gICAgICAgIC8vIENvcHkJCi0gICAgICAgIFNoZWxsIHNoZWxsID0gdmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotICAgICAgICBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHNoZWxsLmdldERpc3BsYXkoKSk7Ci0gICAgICAgIGNvcHlBY3Rpb24gPSBuZXcgQ29weVByb3BlcnR5QWN0aW9uKHZpZXdlciwgImNvcHkiLCBjbGlwYm9hcmQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvcHlBY3Rpb24uc2V0VGV4dChQcm9wZXJ0aWVzTWVzc2FnZXMuQ29weVByb3BlcnR5X3RleHQpOwotICAgICAgICBjb3B5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWSkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVBhZ2UgKGFuZCBQYWdlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsCi0gICAgICAgICAgICBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgewotCi0gICAgICAgIC8vIGFkZCBhY3Rpb25zIHRvIHRoZSB0b29sIGJhcgotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQoY2F0ZWdvcmllc0FjdGlvbik7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChmaWx0ZXJBY3Rpb24pOwotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQoZGVmYXVsdHNBY3Rpb24pOwotCi0gICAgICAgIC8vIGFkZCBhY3Rpb25zIHRvIHRoZSBtZW51Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChjYXRlZ29yaWVzQWN0aW9uKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKGZpbHRlckFjdGlvbik7Ci0KLSAgICAgICAgLy8gc2V0IHN0YXR1cyBsaW5lIG1hbmFnZXIgaW50byB0aGUgdmlld2VyCi0gICAgICAgIHZpZXdlci5zZXRTdGF0dXNMaW5lTWFuYWdlcihzdGF0dXNMaW5lTWFuYWdlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgbW9kZWwgZm9yIHRoZSB2aWV3ZXIuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoaXMgbWVhbnMgZW5zdXJpbmcgdGhhdCB0aGUgbW9kZWwgcmVmbGVjdHMgdGhlIHN0YXRlCi0gICAgICogb2YgdGhlIGN1cnJlbnQgdmlld2VyIGlucHV0LiAKLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgaWYgKHZpZXdlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvLyBjYWxsaW5nIHNldElucHV0IG9uIHRoZSB2aWV3ZXIgd2lsbCBjYXVzZSB0aGUgbW9kZWwgdG8gcmVmcmVzaAotICAgICAgICB2aWV3ZXIuc2V0SW5wdXQodmlld2VyLmdldElucHV0KCkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVNlbGVjdGlvbkxpc3RlbmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgaWYgKHZpZXdlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIGNoYW5nZSB0aGUgdmlld2VyIGlucHV0IHNpbmNlIHRoZSB3b3JrYmVuY2ggc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLgotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIHZpZXdlci5zZXRJbnB1dCgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+UHJvcGVydHlTaGVldFBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SVBhZ2U8L2NvZGU+IG1ldGhvZAotICAgICAqIGNhbGxzIDxjb2RlPm1ha2VDb250cmlidXRpb25zPC9jb2RlPiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAotICAgICAqIHByZXZpb3VzIHZlcnNpb25zIG9mIDxjb2RlPklQYWdlPC9jb2RlPi4gCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotICAgICAgICBzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotICAgICAgICBjZWxsRWRpdG9yQWN0aW9uSGFuZGxlciA9IG5ldyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcihhY3Rpb25CYXJzKTsKLSAgICAgICAgY2VsbEVkaXRvckFjdGlvbkhhbmRsZXIuc2V0Q29weUFjdGlvbihjb3B5QWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGZvY3VzIHRvIGEgcGFydCBpbiB0aGUgcGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGdpdmVuIHByb3BlcnR5IHNvdXJjZSBwcm92aWRlciBhcwotICAgICAqIHRoZSBwcm9wZXJ0eSBzb3VyY2UgcHJvdmlkZXIuCi0gICAgICogPHA+Ci0gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBvbmx5IHZhbGlkIGlmIHlvdSBhcmUgdXNpbmcKLSAgICAgKiB0aGlzIHBhZ2UncyBkZWZhdWx0IHJvb3QgZW50cnkuCi0gICAgICogPC9wPgotICAgICAqIEBwYXJhbSBuZXdQcm92aWRlciB0aGUgcHJvcGVydHkgc291cmNlIHByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihJUHJvcGVydHlTb3VyY2VQcm92aWRlciBuZXdQcm92aWRlcikgewotICAgICAgICBwcm92aWRlciA9IG5ld1Byb3ZpZGVyOwotICAgICAgICBpZiAocm9vdEVudHJ5IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldEVudHJ5KSB7Ci0gICAgICAgICAgICAoKFByb3BlcnR5U2hlZXRFbnRyeSkgcm9vdEVudHJ5KQotICAgICAgICAgICAgICAgICAgICAuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHdpbGwgdHJpZ2dlciBhbiB1cGRhdGUKLSAgICAgICAgICAgIHZpZXdlci5zZXRSb290RW50cnkocm9vdEVudHJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGdpdmVuIGVudHJ5IGFzIHRoZSBtb2RlbCBmb3IgdGhlIHBhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW50cnkgdGhlIHJvb3QgZW50cnkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb290RW50cnkoSVByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeSkgewotICAgICAgICByb290RW50cnkgPSBlbnRyeTsKLSAgICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRyaWdnZXIgYW4gdXBkYXRlCi0gICAgICAgICAgICB2aWV3ZXIuc2V0Um9vdEVudHJ5KHJvb3RFbnRyeSk7Ci0gICAgfQotCi0gICAgLyoqCi0JICogU2V0cyB0aGUgc29ydGVyIHVzZWQgZm9yIHNvcnRpbmcgY2F0ZWdvcmllcyBhbmQgZW50cmllcyBpbiB0aGUgdmlld2VyCi0JICogb2YgdGhpcyBwYWdlLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IHNvcnRlciBzb3J0cyBjYXRlZ29yaWVzIGFuZCBlbnRyaWVzIGFscGhhYmV0aWNhbGx5LiAKLQkgKiA8L3A+Ci0JICogQHBhcmFtIHNvcnRlciB0aGUgc29ydGVyIHRvIHNldCAoPGNvZGU+bnVsbDwvY29kZT4gd2lsbCByZXNldCB0byB0aGUKLQkgKiBkZWZhdWx0IHNvcnRlcikKLSAgICAgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U29ydGVyKFByb3BlcnR5U2hlZXRTb3J0ZXIgc29ydGVyKSB7Ci0JCXRoaXMuc29ydGVyID0gc29ydGVyOwotICAgICAgICBpZiAodmlld2VyICE9IG51bGwpIHsKLSAgICAgICAgCXZpZXdlci5zZXRTb3J0ZXIoc29ydGVyKTsKLSAgICAgICAgCQotICAgICAgICAJLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRyaWdnZXIgYW4gdXBkYXRlCi0gICAgICAgIAlpZihudWxsICE9IHZpZXdlci5nZXRSb290RW50cnkoKSkKLSAgICAgICAgCQl2aWV3ZXIuc2V0Um9vdEVudHJ5KHJvb3RFbnRyeSk7Ci0gICAgICAgIH0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldFNvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9Qcm9wZXJ0eVNoZWV0U29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ODI3ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9Qcm9wZXJ0eVNoZWV0U29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBHdW5uYXIgV2FnZW5rbmVjaHQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR3VubmFyIFdhZ2Vua25lY2h0IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIENsYXNzIHVzZWQgYnkge0BsaW5rIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2V9IHRvCi0gKiBzb3J0IHByb3BlcnRpZXMuCi0gKiA8cD4KLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNvcnRzIGFscGhhYmV0aWNhbGx5LiBTdWJjbGFzc2VzIG1heSBvdmVyd3JpdGUgdG8KLSAqIGltcGxlbWVudCBjdXN0b20gc29ydGluZy4KLSAqIDwvcD4KLSAqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVNoZWV0U29ydGVyICB7Ci0KLQkvKioKLQkgKiBUaGUgY29sbGF0b3IgdXNlZCB0byBzb3J0IHN0cmluZ3MuCi0JICovCi0JcHJpdmF0ZSBDb2xsYXRvciBjb2xsYXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc29ydGVyLCB3aGljaCB1c2VzIHRoZSBkZWZhdWx0IGNvbGxhdG9yIHRvIHNvcnQgc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlTaGVldFNvcnRlcigpIHsKLQkJdGhpcyhDb2xsYXRvci5nZXRJbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNvcnRlciwgd2hpY2ggdXNlcyB0aGUgZ2l2ZW4gY29sbGF0b3IgdG8gc29ydCBzdHJpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xsYXRvcgotCSAqICAgICAgICAgICAgdGhlIGNvbGxhdG9yIHRvIHVzZSB0byBzb3J0IHN0cmluZ3MKLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlTaGVldFNvcnRlcihDb2xsYXRvciBjb2xsYXRvcikgewotCQl0aGlzLmNvbGxhdG9yID0gY29sbGF0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5lZ2F0aXZlLCB6ZXJvLCBvciBwb3NpdGl2ZSBudW1iZXIgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlCi0JICogZmlyc3QgZWxlbWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHVzZXMgdGhlIGNvbGxhdG9yIHRvCi0JICogY29tcGFyZSB0aGUgZGlzcGxheSBuYW1lcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlbnRyeUEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBlbGVtZW50Ci0JICogQHBhcmFtIGVudHJ5QgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBlbGVtZW50Ci0JICogQHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZAotCSAqICAgICAgICAgZWxlbWVudDsgdGhlIHZhbHVlIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGVxdWFsCi0JICogICAgICAgICB0byB0aGUgc2Vjb25kIGVsZW1lbnQ7IGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudAotCSAqICAgICAgICAgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQgZWxlbWVudAotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShJUHJvcGVydHlTaGVldEVudHJ5IGVudHJ5QSwgSVByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeUIpIHsKLQkJcmV0dXJuIGdldENvbGxhdG9yKCkuY29tcGFyZShlbnRyeUEuZ2V0RGlzcGxheU5hbWUoKSwKLQkJCQllbnRyeUIuZ2V0RGlzcGxheU5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5lZ2F0aXZlLCB6ZXJvLCBvciBwb3NpdGl2ZSBudW1iZXIgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlCi0JICogZmlyc3QgZWxlbWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHVzZXMgdGhlIGNvbGxhdG9yIHRvCi0JICogY29tcGFyZSB0aGUgc3RyaW5ncy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeUEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBlbGVtZW50Ci0JICogQHBhcmFtIGNhdGVnb3J5QgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBlbGVtZW50Ci0JICogQHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZAotCSAqICAgICAgICAgZWxlbWVudDsgdGhlIHZhbHVlIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGVxdWFsCi0JICogICAgICAgICB0byB0aGUgc2Vjb25kIGVsZW1lbnQ7IGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudAotCSAqICAgICAgICAgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQgZWxlbWVudAotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZUNhdGVnb3JpZXMoU3RyaW5nIGNhdGVnb3J5QSwgU3RyaW5nIGNhdGVnb3J5QikgewotCQlyZXR1cm4gZ2V0Q29sbGF0b3IoKS5jb21wYXJlKGNhdGVnb3J5QSwgY2F0ZWdvcnlCKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsYXRvciB1c2VkIHRvIHNvcnQgc3RyaW5ncy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsYXRvciB1c2VkIHRvIHNvcnQgc3RyaW5ncwotCSAqLwotCXByb3RlY3RlZCBDb2xsYXRvciBnZXRDb2xsYXRvcigpIHsKLQkJcmV0dXJuIGNvbGxhdG9yOwotCX0KLQotCS8qKgotCSAqIFNvcnRzIHRoZSBnaXZlbiBlbGVtZW50cyBpbi1wbGFjZSwgbW9kaWZ5aW5nIHRoZSBnaXZlbiBhcnJheS4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB1c2VzIHRoZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQKLQkgKiBhbGdvcml0aG0gb24gdGhlIGdpdmVuIGFycmF5LCBjYWxsaW5nIDxjb2RlPmNvbXBhcmU8L2NvZGU+IHRvIGNvbXBhcmUKLQkgKiBlbGVtZW50cy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhIG1vcmUgb3B0aW1pemVkCi0JICogaW1wbGVtZW50YXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlbnRyaWVzCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gc29ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNvcnQoSVByb3BlcnR5U2hlZXRFbnRyeVtdIGVudHJpZXMpIHsKLQkJQXJyYXlzLnNvcnQoZW50cmllcywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkJcmV0dXJuIFByb3BlcnR5U2hlZXRTb3J0ZXIudGhpcy5jb21wYXJlKAotCQkJCQkJKElQcm9wZXJ0eVNoZWV0RW50cnkpIGEsIChJUHJvcGVydHlTaGVldEVudHJ5KSBiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogU29ydHMgdGhlIGdpdmVuIGNhdGVnb3JpZXMgaW4tcGxhY2UsIG1vZGlmeWluZyB0aGUgZ2l2ZW4gYXJyYXkuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3JpZXMKLQkgKiAgICAgICAgICAgIHRoZSBjYXRlZ29yaWVzIHRvIHNvcnQKLQkgKi8KLQl2b2lkIHNvcnQoUHJvcGVydHlTaGVldENhdGVnb3J5W10gY2F0ZWdvcmllcykgewotCQlBcnJheXMuc29ydChjYXRlZ29yaWVzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQlyZXR1cm4gUHJvcGVydHlTaGVldFNvcnRlci50aGlzLmNvbXBhcmVDYXRlZ29yaWVzKAotCQkJCQkJKChQcm9wZXJ0eVNoZWV0Q2F0ZWdvcnkpIGEpLmdldENhdGVnb3J5TmFtZSgpLAotCQkJCQkJKChQcm9wZXJ0eVNoZWV0Q2F0ZWdvcnkpIGIpLmdldENhdGVnb3J5TmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9Qcm9wZXJ0eVNoZWV0Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5U2hlZXRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzNGQ1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5U2hlZXRWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEd1bm5hciBXYWdlbmtuZWNodCAtIGZpeCBmb3IgYnVnIDIxNzU2IFtQcm9wZXJ0aWVzVmlld10gcHJvcGVydHkgdmlldyBzb3J0aW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRyZWVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLS8qKgotICogVGhlIFByb3BlcnR5U2hlZXRWaWV3ZXIgZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0cy4gVGhlIG1vZGVsIGZvciB0aGUKLSAqIHZpZXdlciBjb25zaXN0cyBvZiBhIGhpZXJhcmNoeSBvZiA8Y29kZT5JUHJvcGVydHlTaGVldEVudHJ5PC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyB2aWV3ZXIgYWxzbyBzdXBwb3J0cyB0aGUgb3B0aW9uYWwgY2F0b2dvcml6YXRpb24gb2YgdGhlIGZpcnN0IGxldmVsCi0gKiA8Y29kZT5JUHJvcGVydHlTaGVldEVudHJ5PC9jb2RlPiBzIGJ5IHVzaW5nIGluc3RhbmNlcyBvZgotICogPGNvZGU+UHJvcGVydHlTaGVldENhdGVnb3J5PC9jb2RlPi4KLSAqICAKLSAqLwotLyogcGFja2FnZSAqLwotY2xhc3MgUHJvcGVydHlTaGVldFZpZXdlciBleHRlbmRzIFZpZXdlciB7Ci0gICAgLy8gVGhlIGlucHV0IG9iamVjdHMgZm9yIHRoZSB2aWV3ZXIKLSAgICBwcml2YXRlIE9iamVjdFtdIGlucHV0OwotCi0gICAgLy8gVGhlIHJvb3QgZW50cnkgb2YgdGhlIHZpZXdlcgotICAgIHByaXZhdGUgSVByb3BlcnR5U2hlZXRFbnRyeSByb290RW50cnk7Ci0KLSAgICAvLyBUaGUgY3VycmVudCBjYXRlZ29yaWVzCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eVNoZWV0Q2F0ZWdvcnlbXSBjYXRlZ29yaWVzOwotCi0gICAgLy8gU1dUIHdpZGdldHMKLSAgICBwcml2YXRlIFRyZWUgdHJlZTsKLQotICAgIHByaXZhdGUgVHJlZUVkaXRvciB0cmVlRWRpdG9yOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gY29sdW1uTGFiZWxzID0gewotICAgICAgICAgICAgUHJvcGVydGllc01lc3NhZ2VzLlByb3BlcnR5Vmlld2VyX3Byb3BlcnR5LCBQcm9wZXJ0aWVzTWVzc2FnZXMuUHJvcGVydHlWaWV3ZXJfdmFsdWUgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBNSVNDRUxMQU5FT1VTX0NBVEVHT1JZX05BTUUgPSBQcm9wZXJ0aWVzTWVzc2FnZXMuUHJvcGVydHlWaWV3ZXJfbWlzYzsKLQotICAgIC8vIENlbGwgZWRpdG9yIHN1cHBvcnQuCi0gICAgcHJpdmF0ZSBpbnQgY29sdW1uVG9FZGl0ID0gMTsKLQotICAgIHByaXZhdGUgQ2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0gICAgcHJpdmF0ZSBJUHJvcGVydHlTaGVldEVudHJ5TGlzdGVuZXIgZW50cnlMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgSUNlbGxFZGl0b3JMaXN0ZW5lciBlZGl0b3JMaXN0ZW5lcjsKLQotICAgIC8vIEZsYWcgdG8gaW5kaWNhdGUgaWYgY2F0ZWdvcmllcyAoaWYgYW55KSBzaG91bGQgYmUgc2hvd24KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTaG93aW5nQ2F0ZWdvcmllcyA9IHRydWU7Ci0KLSAgICAvLyBGbGFnIHRvIGluZGljYXRlIGV4cGVydCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzaG93bgotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Nob3dpbmdFeHBlcnRQcm9wZXJ0aWVzID0gZmFsc2U7Ci0KLSAgICAvLyBUaGUgc3RhdHVzIGxpbmUgbWFuYWdlciBmb3Igc2hvd2luZyBtZXNzYWdlcwotICAgIHByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyOwotCi0gICAgLy8gQ2VsbCBlZGl0b3IgYWN0aXZhdGlvbiBsaXN0ZW5lcnMKLSAgICBwcml2YXRlIExpc3RlbmVyTGlzdCBhY3RpdmF0aW9uTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotICAgIAotICAgIC8vIHRoZSBwcm9wZXJ0eSBzaGVldCBzb3J0ZXIKLSAgICBwcml2YXRlIFByb3BlcnR5U2hlZXRTb3J0ZXIgc29ydGVyID0gbmV3IFByb3BlcnR5U2hlZXRTb3J0ZXIoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwcm9wZXJ0eSBzaGVldCB2aWV3ZXIgb24gYSBuZXdseS1jcmVhdGVkIHRyZWUgY29udHJvbAotICAgICAqIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQuIFRoZSB2aWV3ZXIgaGFzIG5vIGlucHV0LCBhbmQgbm8gcm9vdCBlbnRyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHlTaGVldFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5TSU5HTEUKLSAgICAgICAgICAgICAgICB8IFNXVC5ISURFX1NFTEVDVElPTik7Ci0KLSAgICAgICAgLy8gY29uZmlndXJlIHRoZSB3aWRnZXQKLSAgICAgICAgdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICAgIHRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICAvLyBjb25maWd1cmUgdGhlIGNvbHVtbnMKLSAgICAgICAgYWRkQ29sdW1ucygpOwotCi0gICAgICAgIC8vIGFkZCBvdXIgbGlzdGVuZXJzIHRvIHRoZSB3aWRnZXQKLSAgICAgICAgaG9va0NvbnRyb2woKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSBuZXcgdHJlZSBlZGl0b3IKLSAgICAgICAgdHJlZUVkaXRvciA9IG5ldyBUcmVlRWRpdG9yKHRyZWUpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgZW50cnkgYW5kIGVkaXRvciBsaXN0ZW5lcgotICAgICAgICBjcmVhdGVFbnRyeUxpc3RlbmVyKCk7Ci0gICAgICAgIGNyZWF0ZUVkaXRvckxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWN0aXZhdGUgYSBjZWxsIGVkaXRvciBmb3IgdGhlIGdpdmVuIHNlbGVjdGVkIHRyZWUgaXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlbQotICAgICAqICAgICAgICAgICAgdGhlIHNlbGVjdGVkIHRyZWUgaXRlbQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhY3RpdmF0ZUNlbGxFZGl0b3IoVHJlZUl0ZW0gaXRlbSkgewotICAgICAgICAvLyBlbnN1cmUgdGhlIGNlbGwgZWRpdG9yIGlzIHZpc2libGUKLSAgICAgICAgdHJlZS5zaG93U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBlbnRyeSBmb3IgdGhpcyBpdGVtCi0gICAgICAgIElQcm9wZXJ0eVNoZWV0RW50cnkgYWN0aXZlRW50cnkgPSAoSVByb3BlcnR5U2hlZXRFbnRyeSkgaXRlbS5nZXREYXRhKCk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBjZWxsIGVkaXRvciBmb3IgdGhlIGVudHJ5LgotICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGVkaXRvciBwYXJlbnQgbXVzdCBiZSB0aGUgVHJlZSBjb250cm9sCi0gICAgICAgIGNlbGxFZGl0b3IgPSBhY3RpdmVFbnRyeS5nZXRFZGl0b3IodHJlZSk7Ci0KLSAgICAgICAgaWYgKGNlbGxFZGl0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgIC8vIHVuYWJsZSB0byBjcmVhdGUgdGhlIGVkaXRvcgotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIGFjdGl2YXRlIHRoZSBjZWxsIGVkaXRvcgotICAgICAgICBjZWxsRWRpdG9yLmFjdGl2YXRlKCk7Ci0KLSAgICAgICAgLy8gaWYgdGhlIGNlbGwgZWRpdG9yIGhhcyBubyBjb250cm9sIHdlIGNhbiBzdG9wIG5vdwotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBjZWxsRWRpdG9yLmdldENvbnRyb2woKTsKLSAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgY2VsbEVkaXRvci5kZWFjdGl2YXRlKCk7Ci0gICAgICAgICAgICBjZWxsRWRpdG9yID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBvdXIgZWRpdG9yIGxpc3RlbmVyCi0gICAgICAgIGNlbGxFZGl0b3IuYWRkTGlzdGVuZXIoZWRpdG9yTGlzdGVuZXIpOwotCi0gICAgICAgIC8vIHNldCB0aGUgbGF5b3V0IG9mIHRoZSB0cmVlIGVkaXRvciB0byBtYXRjaCB0aGUgY2VsbCBlZGl0b3IKLSAgICAgICAgQ2VsbEVkaXRvci5MYXlvdXREYXRhIGxheW91dCA9IGNlbGxFZGl0b3IuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICB0cmVlRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBsYXlvdXQuaG9yaXpvbnRhbEFsaWdubWVudDsKLSAgICAgICAgdHJlZUVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IGxheW91dC5ncmFiSG9yaXpvbnRhbDsKLSAgICAgICAgdHJlZUVkaXRvci5taW5pbXVtV2lkdGggPSBsYXlvdXQubWluaW11bVdpZHRoOwotICAgICAgICB0cmVlRWRpdG9yLnNldEVkaXRvcihjb250cm9sLCBpdGVtLCBjb2x1bW5Ub0VkaXQpOwotCi0gICAgICAgIC8vIHNldCB0aGUgZXJyb3IgdGV4dCBmcm9tIHRoZSBjZWwgZWRpdG9yCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShjZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpKTsKLQotICAgICAgICAvLyBnaXZlIGZvY3VzIHRvIHRoZSBjZWxsIGVkaXRvcgotICAgICAgICBjZWxsRWRpdG9yLnNldEZvY3VzKCk7Ci0KLSAgICAgICAgLy8gbm90aWZ5IG9mIGFjdGl2YXRpb24KLSAgICAgICAgZmlyZUNlbGxFZGl0b3JBY3RpdmF0ZWQoY2VsbEVkaXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGNlbGwgZWRpdG9yIGFjdGl2YXRpb24gbGlzdGVuZXIuIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsCi0gICAgICogYWN0aXZhdGlvbiBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyCi0gICAgICogICAgICAgICAgICBhIGNlbGwgZWRpdG9yIGFjdGl2YXRpb24gbGlzdGVuZXIKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovCi0gICAgdm9pZCBhZGRBY3RpdmF0aW9uTGlzdGVuZXIoSUNlbGxFZGl0b3JBY3RpdmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgYWN0aXZhdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBjb2x1bW5zIHRvIHRoZSB0cmVlIGFuZCBzZXQgdXAgdGhlIGxheW91dCBtYW5hZ2VyIGFjY29yZGluZ2x5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRDb2x1bW5zKCkgewotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgY29sdW1ucwotICAgICAgICBUcmVlQ29sdW1uW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkxhYmVscy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHN0cmluZyA9IGNvbHVtbkxhYmVsc1tpXTsKLSAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRyZWVDb2x1bW4gY29sdW1uOwotICAgICAgICAgICAgICAgIGlmIChpIDwgY29sdW1ucy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IGNvbHVtbnNbaV07Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCAwKTsKLSAgICAgICAgICAgICAgICBjb2x1bW4uc2V0VGV4dChzdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJlZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgYXJlYSA9IHRyZWUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICAgIFRyZWVDb2x1bW5bXSBjb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZWEud2lkdGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbMF0uc2V0V2lkdGgoYXJlYS53aWR0aCAqIDQwIC8gMTAwKTsKLSAgICAgICAgICAgICAgICAgICAgY29sdW1uc1sxXS5zZXRXaWR0aChhcmVhLndpZHRoIC0gY29sdW1uc1swXS5nZXRXaWR0aCgpIC0gNCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyZWUucmVtb3ZlQ29udHJvbExpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc2tzIHRoZSBlbnRyeSBjdXJyZW50bHkgYmVpbmcgZWRpdGVkIHRvIGFwcGx5IGl0cyBjdXJyZW50IGNlbGwgZWRpdG9yCi0gICAgICogdmFsdWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5RWRpdG9yVmFsdWUoKSB7Ci0gICAgICAgIFRyZWVJdGVtIHRyZWVJdGVtID0gdHJlZUVkaXRvci5nZXRJdGVtKCk7Ci0gICAgICAgIC8vIHRyZWVJdGVtIGNhbiBiZSBudWxsIHdoZW4gdmlldyBpcyBvcGVuZWQKLSAgICAgICAgaWYgKHRyZWVJdGVtID09IG51bGwgfHwgdHJlZUl0ZW0uaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBJUHJvcGVydHlTaGVldEVudHJ5IGVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpIHRyZWVJdGVtLmdldERhdGEoKTsKLSAgICAgICAgZW50cnkuYXBwbHlFZGl0b3JWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGNoaWxkIGl0ZW1zIGZvciB0aGUgZ2l2ZW4gd2lkZ2V0IChpdGVtIG9yIHRyZWUpLiBUaGlzCi0gICAgICogbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBpdGVtIGlzIGV4cGFuZGVkIGZvciB0aGUgZmlyc3QgdGltZSBvciB3aGVuIGFuCi0gICAgICogaXRlbSBpcyBhc3NpZ25lZCBhcyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4KLSAgICAgKiBAcGFyYW0gd2lkZ2V0IFRyZWVJdGVtIG9yIFRyZWUgdG8gY3JlYXRlIHRoZSBjaGlsZHJlbiBpbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ2hpbGRyZW4oV2lkZ2V0IHdpZGdldCkgewotICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgY2hpbGQgaXRlbXMKLSAgICAgICAgVHJlZUl0ZW1bXSBjaGlsZEl0ZW1zID0gZ2V0Q2hpbGRJdGVtcyh3aWRnZXQpOwotCi0gICAgICAgIGlmIChjaGlsZEl0ZW1zLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIE9iamVjdCBkYXRhID0gY2hpbGRJdGVtc1swXS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKQotICAgICAgICAgICAgICAgIC8vIGNoaWxkcmVuIGFscmVhZHkgdGhlcmUhCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBkdW1teQotICAgICAgICAgICAgY2hpbGRJdGVtc1swXS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIGNoaWxkcmVuIGFuZCBjcmVhdGUgdGhlaXIgdHJlZSBpdGVtcwotICAgICAgICBPYmplY3Qgbm9kZSA9IHdpZGdldC5nZXREYXRhKCk7Ci0gICAgICAgIExpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihub2RlKTsKLSAgICAgICAgaWYgKGNoaWxkcmVuLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIC8vIHRoaXMgaXRlbSBkb2VzJ3QgYWN0dWFsbHkgaGF2ZSBhbnkgY2hpbGRyZW4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IHRyZWUgaXRlbQotICAgICAgICAgICAgY3JlYXRlSXRlbShjaGlsZHJlbi5nZXQoaSksIHdpZGdldCwgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGNlbGwgZWRpdG9yIGxpc3RlbmVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVFZGl0b3JMaXN0ZW5lcigpIHsKLSAgICAgICAgZWRpdG9yTGlzdGVuZXIgPSBuZXcgSUNlbGxFZGl0b3JMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbEVkaXRvcigpIHsKLSAgICAgICAgICAgICAgICBkZWFjdGl2YXRlQ2VsbEVkaXRvcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBlZGl0b3JWYWx1ZUNoYW5nZWQoYm9vbGVhbiBvbGRWYWxpZFN0YXRlLAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbGlkU3RhdGUpIHsKLSAgICAgICAgICAgICAgICAvL0RvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZSgpIHsKLSAgICAgICAgICAgICAgICAvL0RvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHByb3BlcnR5IHNoZWV0IGVudHJ5IGxpc3RlbmVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVFbnRyeUxpc3RlbmVyKCkgewotICAgICAgICBlbnRyeUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoaWxkRW50cmllc0NoYW5nZWQoSVByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeSkgewotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGVudHJ5Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5ID09IHJvb3RFbnRyeSkKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW5PZihlbnRyeSwgdHJlZSk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyZWVJdGVtIGl0ZW0gPSBmaW5kSXRlbShlbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlbk9mKGVudHJ5LCBpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChJUHJvcGVydHlTaGVldEVudHJ5IGVudHJ5KSB7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBnaXZlbiBlbnRyeQotICAgICAgICAgICAgICAgIFRyZWVJdGVtIGl0ZW0gPSBmaW5kSXRlbShlbnRyeSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlRW50cnkoZW50cnksIGl0ZW0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBlcnJvck1lc3NhZ2VDaGFuZ2VkKElQcm9wZXJ0eVNoZWV0RW50cnkgZW50cnkpIHsKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoZW50cnkuZ2V0RXJyb3JUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgdHJlZSBpdGVtLCBzZXRzIHRoZSBnaXZlbiBlbnRyeSBvciBjYXRlZ29yeSAobm9kZSlpbgotICAgICAqIGl0cyB1c2VyIGRhdGEgZmllbGQsIGFuZCBhZGRzIGEgbGlzdGVuZXIgdG8gdGhlIG5vZGUgaWYgaXQgaXMgYW4gZW50cnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbnRyeSBvciBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpdGVtCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCB3aWRnZXQKLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB0aGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSBpdGVtIGludG8gaXRzIHBhcmVudAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVJdGVtKE9iamVjdCBub2RlLCBXaWRnZXQgcGFyZW50LCBpbnQgaW5kZXgpIHsKLSAgICAgICAgLy8gY3JlYXRlIHRoZSBpdGVtCi0gICAgICAgIFRyZWVJdGVtIGl0ZW07Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBUcmVlSXRlbSkKLSAgICAgICAgICAgIGl0ZW0gPSBuZXcgVHJlZUl0ZW0oKFRyZWVJdGVtKSBwYXJlbnQsIFNXVC5OT05FLCBpbmRleCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGl0ZW0gPSBuZXcgVHJlZUl0ZW0oKFRyZWUpIHBhcmVudCwgU1dULk5PTkUsIGluZGV4KTsKLQotICAgICAgICAvLyBzZXQgdGhlIHVzZXIgZGF0YSBmaWVsZAotICAgICAgICBpdGVtLnNldERhdGEobm9kZSk7Ci0KLSAgICAgICAgLy8gYWRkIG91ciBsaXN0ZW5lcgotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElQcm9wZXJ0eVNoZWV0RW50cnkpCi0gICAgICAgICAgICAoKElQcm9wZXJ0eVNoZWV0RW50cnkpIG5vZGUpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lcihlbnRyeUxpc3RlbmVyKTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhlIHZpc3VhbCBwcmVzZW50YXRpb24KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJUHJvcGVydHlTaGVldEVudHJ5KQotICAgICAgICAgICAgdXBkYXRlRW50cnkoKElQcm9wZXJ0eVNoZWV0RW50cnkpIG5vZGUsIGl0ZW0pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1cGRhdGVDYXRlZ29yeSgoUHJvcGVydHlTaGVldENhdGVnb3J5KSBub2RlLCBpdGVtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWFjdGl2YXRlIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgZWRpdG9yLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8KLSAgICB2b2lkIGRlYWN0aXZhdGVDZWxsRWRpdG9yKCkgewotICAgICAgICB0cmVlRWRpdG9yLnNldEVkaXRvcihudWxsLCBudWxsLCBjb2x1bW5Ub0VkaXQpOwotICAgICAgICBpZiAoY2VsbEVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjZWxsRWRpdG9yLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIGZpcmVDZWxsRWRpdG9yRGVhY3RpdmF0ZWQoY2VsbEVkaXRvcik7Ci0gICAgICAgICAgICBjZWxsRWRpdG9yLnJlbW92ZUxpc3RlbmVyKGVkaXRvckxpc3RlbmVyKTsKLSAgICAgICAgICAgIGNlbGxFZGl0b3IgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNsZWFyIGFueSBlcnJvciBtZXNzYWdlIGZyb20gdGhlIGVkaXRvcgotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgb3V0IGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgZm9yIHRoZSBlbnRyeSB0cmVlIHRvIGFsbCByZWdpc3RlcmVkCi0gICAgICogbGlzdGVuZXJzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbnRyeVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0gICAgICAgIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBjaGFuZ2VFdmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywKLSAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGZpcmVTZWxlY3Rpb25DaGFuZ2VkKGNoYW5nZUV2ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSB0cmVlIGl0ZW0gaW4gdGhlIHByb3BlcnR5IHNoZWV0IHRoYXQgaGFzIHRoZSBzYW1lIGVudHJ5IGluCi0gICAgICogaXRzIHVzZXIgZGF0YSBmaWVsZCBhcyB0aGUgc3VwcGxpZWQgZW50cnkuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqIHRoZXJlIGlzIG5vIHN1Y2ggaXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50cnkKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbnRyeSB0byBzZXJhY2ggZm9yCi0gICAgICogQHJldHVybiB0aGUgVHJlZUl0ZW0gZm9yIHRoZSBlbnRyeSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqIHRoZXJlIGlzbid0IG9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRyZWVJdGVtIGZpbmRJdGVtKElQcm9wZXJ0eVNoZWV0RW50cnkgZW50cnkpIHsKLSAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRyZWVJdGVtcyB0byBmaW5kIGl0ZW0KLSAgICAgICAgVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWUuZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgVHJlZUl0ZW0gZmluZEl0ZW0gPSBmaW5kSXRlbShlbnRyeSwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAoZmluZEl0ZW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmluZEl0ZW07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgdHJlZSBpdGVtIGluIHRoZSBwcm9wZXJ0eSBzaGVldCB0aGF0IGhhcyB0aGUgc2FtZSBlbnRyeSBpbgotICAgICAqIGl0cyB1c2VyIGRhdGEgZmllbGQgYXMgdGhlIHN1cHBsaWVkIGVudHJ5LiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAgKiB0aGVyZSBpcyBubyBzdWNoIGl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5Ci0gICAgICogICAgICAgICAgICB0aGUgZW50cnkgdG8gc2VhcmNoIGZvcgotICAgICAqIEBwYXJhbSBpdGVtCi0gICAgICogICAgICAgICAgICB0aGUgaXRlbSBsb29rIGluCi0gICAgICogQHJldHVybiB0aGUgVHJlZUl0ZW0gZm9yIHRoZSBlbnRyeSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqIHRoZXJlIGlzbid0IG9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRyZWVJdGVtIGZpbmRJdGVtKElQcm9wZXJ0eVNoZWV0RW50cnkgZW50cnksIFRyZWVJdGVtIGl0ZW0pIHsKLSAgICAgICAgLy8gY29tcGFyZSB3aXRoIGN1cnJlbnQgaXRlbQotICAgICAgICBpZiAoZW50cnkgPT0gaXRlbS5nZXREYXRhKCkpCi0gICAgICAgICAgICByZXR1cm4gaXRlbTsKLQotICAgICAgICAvLyByZWN1cnNlIG92ZXIgY2hpbGRyZW4KLSAgICAgICAgVHJlZUl0ZW1bXSBpdGVtcyA9IGl0ZW0uZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVHJlZUl0ZW0gY2hpbGRJdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICBUcmVlSXRlbSBmaW5kSXRlbSA9IGZpbmRJdGVtKGVudHJ5LCBjaGlsZEl0ZW0pOwotICAgICAgICAgICAgaWYgKGZpbmRJdGVtICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRJdGVtOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIGFsbCByZWdpc3RlcmVkIGNlbGwgZWRpdG9yIGFjdGl2YXRpb24gbGlzdGVuZXJzIG9mIGEgY2VsbCBlZGl0b3IKLSAgICAgKiBhY3RpdmF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY3RpdmF0ZWRDZWxsRWRpdG9yCi0gICAgICogICAgICAgICAgICB0aGUgYWN0aXZhdGVkIGNlbGwgZWRpdG9yCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVDZWxsRWRpdG9yQWN0aXZhdGVkKENlbGxFZGl0b3IgYWN0aXZhdGVkQ2VsbEVkaXRvcikgewotICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnMgPSBhY3RpdmF0aW9uTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgKChJQ2VsbEVkaXRvckFjdGl2YXRpb25MaXN0ZW5lcikgbGlzdGVuZXJzW2ldKQotICAgICAgICAgICAgICAgICAgICAuY2VsbEVkaXRvckFjdGl2YXRlZChhY3RpdmF0ZWRDZWxsRWRpdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIGFsbCByZWdpc3RlcmVkIGNlbGwgZWRpdG9yIGFjdGl2YXRpb24gbGlzdGVuZXJzIG9mIGEgY2VsbCBlZGl0b3IKLSAgICAgKiBkZWFjdGl2YXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjdGl2YXRlZENlbGxFZGl0b3IKLSAgICAgKiAgICAgICAgICAgIHRoZSBkZWFjdGl2YXRlZCBjZWxsIGVkaXRvcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmaXJlQ2VsbEVkaXRvckRlYWN0aXZhdGVkKENlbGxFZGl0b3IgYWN0aXZhdGVkQ2VsbEVkaXRvcikgewotICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnMgPSBhY3RpdmF0aW9uTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgKChJQ2VsbEVkaXRvckFjdGl2YXRpb25MaXN0ZW5lcikgbGlzdGVuZXJzW2ldKQotICAgICAgICAgICAgICAgICAgICAuY2VsbEVkaXRvckRlYWN0aXZhdGVkKGFjdGl2YXRlZENlbGxFZGl0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aXZlIGNlbGwgZWRpdG9yIG9mIHRoaXMgcHJvcGVydHkgc2hlZXQgdmlld2VyIG9yCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY2VsbCBlZGl0b3IgaXMgYWN0aXZlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFjdGl2ZSBjZWxsIGVkaXRvcgotICAgICAqLwotICAgIHB1YmxpYyBDZWxsRWRpdG9yIGdldEFjdGl2ZUNlbGxFZGl0b3IoKSB7Ci0gICAgICAgIHJldHVybiBjZWxsRWRpdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgVHJlZUl0ZW1bXSBnZXRDaGlsZEl0ZW1zKFdpZGdldCB3aWRnZXQpIHsKLSAgICAgICAgaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRyZWUpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFRyZWUpIHdpZGdldCkuZ2V0SXRlbXMoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotICAgICAgICAgICAgcmV0dXJuICgoVHJlZUl0ZW0pIHdpZGdldCkuZ2V0SXRlbXMoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuCi0gICAgICAgIHJldHVybiBuZXcgVHJlZUl0ZW1bMF07Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNvcnRlZCBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgb3IgZW50cnkKLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIGEgY2F0ZWdvcnkgb3IgZW50cnkKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgb3IgZW50cnkKLSAgICAgKiAgKGVsZW1lbnQgdHlwZSA8Y29kZT5JUHJvcGVydHlTaGVldEVudHJ5PC9jb2RlPiBvciAKLSAgICAgKiAgPGNvZGU+UHJvcGVydHlTaGVldENhdGVnb3J5PC9jb2RlPikKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgZ2V0Q2hpbGRyZW4oT2JqZWN0IG5vZGUpIHsKLSAgICAgICAgLy8gY2FzdCB0aGUgZW50cnkgb3IgY2F0ZWdvcnkKLSAgICAgICAgSVByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeSA9IG51bGw7Ci0gICAgICAgIFByb3BlcnR5U2hlZXRDYXRlZ29yeSBjYXRlZ29yeSA9IG51bGw7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSVByb3BlcnR5U2hlZXRFbnRyeSkKLSAgICAgICAgICAgIGVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpIG5vZGU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNhdGVnb3J5ID0gKFByb3BlcnR5U2hlZXRDYXRlZ29yeSkgbm9kZTsKLQotICAgICAgICAvLyBnZXQgdGhlIGNoaWxkIGVudHJpZXMgb3IgY2F0ZWdvcmllcwotICAgICAgICBMaXN0IGNoaWxkcmVuOwotICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLSAgICAgICAgICAgIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oZW50cnkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGNhdGVnb3J5KTsKLQotICAgICAgICByZXR1cm4gY2hpbGRyZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hpbGQgZW50cmllcyBvZiB0aGUgZ2l2ZW4gZW50cnkKLSAgICAgKiBAcGFyYW0gZW50cnkgVGhlIGVudHJ5IHRvIHNlYXJjaAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBlbnRyeSAoZWxlbWVudCB0eXBlCi0gICAgICogICAgICAgICA8Y29kZT5JUHJvcGVydHlTaGVldEVudHJ5PC9jb2RlPikKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgZ2V0Q2hpbGRyZW4oSVByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeSkgewotICAgICAgICAvLyBpZiB0aGUgZW50cnkgaXMgdGhlIHJvb3QgYW5kIHdlIGFyZSBzaG93aW5nIGNhdGVnb3JpZXMsIGFuZCB3ZSBoYXZlCi0gICAgICAgIC8vIG1vcmUgdGhhbiB0aGUKLSAgICAgICAgLy8gZGVmdWFsdCBjYXRlZ29yeSwgcmV0dXJuIHRoZSBjYXRlZ29yaWVzCi0gICAgICAgIGlmIChlbnRyeSA9PSByb290RW50cnkgJiYgaXNTaG93aW5nQ2F0ZWdvcmllcykgewotICAgICAgICAgICAgaWYgKGNhdGVnb3JpZXMubGVuZ3RoID4gMQotICAgICAgICAgICAgICAgICAgICB8fCAoY2F0ZWdvcmllcy5sZW5ndGggPT0gMSAmJiAhY2F0ZWdvcmllc1swXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDYXRlZ29yeU5hbWUoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVNDRUxMQU5FT1VTX0NBVEVHT1JZX05BTUUpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChjYXRlZ29yaWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJldHVybiB0aGUgc29ydGVkICYgZmlsdGVyZWQgY2hpbGQgZW50cmllcwotICAgICAgICByZXR1cm4gZ2V0U29ydGVkRW50cmllcyhnZXRGaWx0ZXJlZEVudHJpZXMoZW50cnkuZ2V0Q2hpbGRFbnRyaWVzKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGlsZCBlbnRyaWVzIG9mIHRoZSBnaXZlbiBjYXRlZ29yeQotICAgICAqIAotICAgICAqIEBwYXJhbSBjYXRlZ29yeSBUaGUgY2F0ZWdvcnkgdG8gc2VhcmNoCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGNhdGVnb3J5IChlbGVtZW50IHR5cGUKLSAgICAgKiAgICAgICAgIDxjb2RlPklQcm9wZXJ0eVNoZWV0RW50cnk8L2NvZGU+KQotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBnZXRDaGlsZHJlbihQcm9wZXJ0eVNoZWV0Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZEVudHJpZXMoZ2V0RmlsdGVyZWRFbnRyaWVzKGNhdGVnb3J5LmdldENoaWxkRW50cmllcygpKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXIuCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLSAgICAgICAgcmV0dXJuIHRyZWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZW50cmllcyB3aGljaCBtYXRjaCB0aGUgY3VycmVudCBmaWx0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW50cmllcyB0aGUgZW50cmllcyB0byBmaWx0ZXIKLSAgICAgKiBAcmV0dXJuIHRoZSBlbnRyaWVzIHdoaWNoIG1hdGNoIHRoZSBjdXJyZW50IGZpbHRlcgotICAgICAqICAoZWxlbWVudCB0eXBlIDxjb2RlPklQcm9wZXJ0eVNoZWV0RW50cnk8L2NvZGU+KQotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBnZXRGaWx0ZXJlZEVudHJpZXMoSVByb3BlcnR5U2hlZXRFbnRyeVtdIGVudHJpZXMpIHsKLSAgICAgICAgLy8gaWYgbm8gZmlsdGVyIGp1c3QgcmV0dXJuIGFsbCBlbnRyaWVzCi0gICAgICAgIGlmIChpc1Nob3dpbmdFeHBlcnRQcm9wZXJ0aWVzKQotICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZW50cmllcyk7Ci0KLSAgICAgICAgLy8gY2hlY2sgZWFjaCBlbnRyeSBmb3IgdGhlIGZpbHRlcgotICAgICAgICBMaXN0IGZpbHRlcmVkRW50cmllcyA9IG5ldyBBcnJheUxpc3QoZW50cmllcy5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElQcm9wZXJ0eVNoZWV0RW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBmaWx0ZXJzID0gZW50cnkuZ2V0RmlsdGVycygpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwZXJ0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbHRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpbHRlcnMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJzW2pdLmVxdWFscyhJUHJvcGVydHlTaGVldEVudHJ5LkZJTFRFUl9JRF9FWFBFUlQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWV4cGVydCkKLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRFbnRyaWVzLmFkZChlbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbHRlcmVkRW50cmllczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0JICogUmV0dXJucyBhIHNvcnRlZCBsaXN0IG9mIDxjb2RlPklQcm9wZXJ0eVNoZWV0RW50cnk8L2NvZGU+IGVudHJpZXMuCi0JICogCi0JICogQHBhcmFtIHVuc29ydGVkRW50cmllcwotCSAqICAgICAgICAgICAgdW5zb3J0ZWQgbGlzdCBvZiA8Y29kZT5JUHJvcGVydHlTaGVldEVudHJ5PC9jb2RlPgotCSAqIEByZXR1cm4gYSBzb3J0ZWQgbGlzdCBvZiB0aGUgc3BlY2lmaWVkIGVudHJpZXMKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0U29ydGVkRW50cmllcyhMaXN0IHVuc29ydGVkRW50cmllcykgewotCQlJUHJvcGVydHlTaGVldEVudHJ5W10gcHJvcGVydHlTaGVldEVudHJpZXMgPSAoSVByb3BlcnR5U2hlZXRFbnRyeVtdKSB1bnNvcnRlZEVudHJpZXMKLQkJCQkudG9BcnJheShuZXcgSVByb3BlcnR5U2hlZXRFbnRyeVt1bnNvcnRlZEVudHJpZXMuc2l6ZSgpXSk7Ci0JCXNvcnRlci5zb3J0KHByb3BlcnR5U2hlZXRFbnRyaWVzKTsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QocHJvcGVydHlTaGVldEVudHJpZXMpOwotCX0KLSAgICAKLQotICAgIC8qKgotCSAqIFRoZSA8Y29kZT5Qcm9wZXJ0eVNoZWV0Vmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZAotCSAqIGRlY2xhcmVkIG9uIDxjb2RlPklJbnB1dFByb3ZpZGVyPC9jb2RlPiByZXR1cm5zIHRoZSBvYmplY3RzIGZvciB3aGljaAotCSAqIHRoZSB2aWV3ZXIgaXMgY3VycmVudGx5IHNob3dpbmcgcHJvcGVydGllcy4gSXQgcmV0dXJucyBhbgotCSAqIDxjb2RlPk9iamVjdFtdPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewotICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcm9vdCBlbnRyeSBmb3IgdGhpcyBwcm9wZXJ0eSBzaGVldCB2aWV3ZXIuIFRoZSByb290IGVudHJ5IGlzCi0gICAgICogbm90IHZpc2libGUgaW4gdGhlIHZpZXdlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByb290IGVudHJ5IG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBJUHJvcGVydHlTaGVldEVudHJ5IGdldFJvb3RFbnRyeSgpIHsKLSAgICAgICAgcmV0dXJuIHJvb3RFbnRyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+UHJvcGVydHlTaGVldFZpZXdlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPklTZWxlY3Rpb25Qcm92aWRlcjwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhCi0gICAgICogPGNvZGU+U3RydWN0dXJlZFNlbGVjdGlvbjwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG9ubHkgaW5jbHVkZXMgPGNvZGU+SVByb3BlcnR5U2hlZXRFbnRyeTwvY29kZT4gaW4KLSAgICAgKiB0aGUgc2VsZWN0aW9uIChubyBjYXRlZ29yaWVzKS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotICAgICAgICBpZiAodHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLSAgICAgICAgVHJlZUl0ZW1bXSBzZWwgPSB0cmVlLmdldFNlbGVjdGlvbigpOwotICAgICAgICBMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KHNlbC5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVHJlZUl0ZW0gdGkgPSBzZWxbaV07Ci0gICAgICAgICAgICBPYmplY3QgZGF0YSA9IHRpLmdldERhdGEoKTsKLSAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgSVByb3BlcnR5U2hlZXRFbnRyeSkKLSAgICAgICAgICAgICAgICBlbnRyaWVzLmFkZChkYXRhKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZW50cmllcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0aW9uIGluIHRoZSB2aWV3ZXIgb2NjdXJyZWQuIENoZWNrIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBjZWxsCi0gICAgICogZWRpdG9yLiBJZiB5ZXMsIGRlYWN0aXZhdGUgaXQgYW5kIGNoZWNrIGlmIGEgbmV3IGNlbGwgZWRpdG9yIG11c3QgYmUKLSAgICAgKiBhY3RpdmF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIFRyZWVJdGVtIHRoYXQgaXMgc2VsZWN0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0KFRyZWVJdGVtIHNlbGVjdGlvbikgewotICAgICAgICAvLyBkZWFjdGl2YXRlIHRoZSBjdXJyZW50IGNlbGwgZWRpdG9yCi0gICAgICAgIGlmIChjZWxsRWRpdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFwcGx5RWRpdG9yVmFsdWUoKTsKLSAgICAgICAgICAgIGRlYWN0aXZhdGVDZWxsRWRpdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIG5ldyBzZWxlY3Rpb24KLSAgICAgICAgVHJlZUl0ZW1bXSBzZWwgPSBuZXcgVHJlZUl0ZW1bXSB7IHNlbGVjdGlvbiB9OwotICAgICAgICBpZiAoc2VsLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHNlbFswXS5nZXREYXRhKCk7IC8vIGFzc3VtZSBzaW5nbGUgc2VsZWN0aW9uCi0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVByb3BlcnR5U2hlZXRFbnRyeSkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZW50cnkgZm9yIHRoaXMgaXRlbQotICAgICAgICAgICAgICAgIElQcm9wZXJ0eVNoZWV0RW50cnkgYWN0aXZlRW50cnkgPSAoSVByb3BlcnR5U2hlZXRFbnRyeSkgb2JqZWN0OwotCi0gICAgICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBpdGVtCi0gICAgICAgICAgICAgICAgc2V0TWVzc2FnZShhY3RpdmVFbnRyeS5nZXREZXNjcmlwdGlvbigpKTsKLQotICAgICAgICAgICAgICAgIC8vIGFjdGl2YXRlIGEgY2VsbCBlZGl0b3Igb24gdGhlIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgIGFjdGl2YXRlQ2VsbEVkaXRvcihzZWxbMF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVudHJ5U2VsZWN0aW9uQ2hhbmdlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBleHBhbmQgaWNvbiBmb3IgYSBub2RlIGluIHRoaXMgdmlld2VyIGhhcyBiZWVuIHNlbGVjdGVkIHRvIGNvbGxhcHNlIGEKLSAgICAgKiBzdWJ0cmVlLiBEZWFjdGl2YXRlIHRoZSBjZWxsIGVkaXRvcgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudAotICAgICAqICAgICAgICAgICAgdGhlIFNXVCB0cmVlIGV2ZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRyZWVDb2xsYXBzZShUcmVlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGNlbGxFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgYXBwbHlFZGl0b3JWYWx1ZSgpOwotICAgICAgICAgICAgZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBleHBhbmQgaWNvbiBmb3IgYSBub2RlIGluIHRoaXMgdmlld2VyIGhhcyBiZWVuIHNlbGVjdGVkIHRvIGV4cGFuZCB0aGUKLSAgICAgKiBzdWJ0cmVlLiBDcmVhdGUgdGhlIGNoaWxkcmVuIDEgbGV2ZWwgZGVlcC4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgd2UgdXNlIGEgImR1bW15IiBpdGVtIChubyB1c2VyIGRhdGEpIHRvIHNob3cgYSAiKyIgaWNvbiBiZXNpZGUKLSAgICAgKiBhbiBpdGVtIHdoaWNoIGhhcyBjaGlsZHJlbiBiZWZvcmUgdGhlIGl0ZW0gaXMgZXhwYW5kZWQgbm93IHRoYXQgaXQgaXMKLSAgICAgKiBiZWluZyBleHBhbmRlZCB3ZSBoYXZlIHRvIGNyZWF0ZSB0aGUgcmVhbCBjaGlsZCBpdGVtcwotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBTV1QgdHJlZSBldmVudAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVUcmVlRXhwYW5kKFRyZWVFdmVudCBldmVudCkgewotICAgICAgICBjcmVhdGVDaGlsZHJlbihldmVudC5pdGVtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIaWRlcyB0aGUgY2F0ZWdvcmllcy4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovCi0gICAgdm9pZCBoaWRlQ2F0ZWdvcmllcygpIHsKLSAgICAgICAgaXNTaG93aW5nQ2F0ZWdvcmllcyA9IGZhbHNlOwotICAgICAgICBjYXRlZ29yaWVzID0gbnVsbDsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhpZGVzIHRoZSBleHBlcnQgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovCi0gICAgdm9pZCBoaWRlRXhwZXJ0KCkgewotICAgICAgICBpc1Nob3dpbmdFeHBlcnRQcm9wZXJ0aWVzID0gZmFsc2U7Ci0gICAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFc3RhYmxpc2ggdGhpcyB2aWV3ZXIgYXMgYSBsaXN0ZW5lciBvbiB0aGUgY29udHJvbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBob29rQ29udHJvbCgpIHsKLSAgICAgICAgLy8gSGFuZGxlIHNlbGVjdGlvbnMgaW4gdGhlIFRyZWUKLSAgICAgICAgLy8gUGFydDE6IERvdWJsZSBjbGljayBvbmx5IChhbGxvdyB0cmF2ZXJzYWwgdmlhIGtleWJvYXJkIHdpdGhvdXQKLSAgICAgICAgLy8gYWN0aXZhdGlvbgotICAgICAgICB0cmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIAkvLyBUaGUgdmlld2VyIG9ubHkgb3ducyB0aGUgc3RhdHVzIGxpbmUgd2hlbiB0aGVyZSBpcwotICAgICAgICAgICAgCS8vIG5vICdhY3RpdmUnIGNlbGwgZWRpdG9yCi0gICAgICAgICAgICAJaWYgKGNlbGxFZGl0b3IgPT0gbnVsbCB8fCAhY2VsbEVkaXRvci5pc0FjdGl2YXRlZCgpKQotICAgICAgICAgICAgCQl1cGRhdGVTdGF0dXNMaW5lKGUuaXRlbSk7Ci0JCQl9Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoKFRyZWVJdGVtKSBlLml0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgLy8gUGFydDI6IGhhbmRsZSBzaW5nbGUgY2xpY2sgYWN0aXZhdGlvbiBvZiBjZWxsIGVkaXRvcgotICAgICAgICB0cmVlLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gb25seSBhY3RpdmF0ZSBpZiB0aGVyZSBpcyBhIGNlbGwgZWRpdG9yCi0gICAgICAgICAgICAgICAgUG9pbnQgcHQgPSBuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSk7Ci0gICAgICAgICAgICAgICAgVHJlZUl0ZW0gaXRlbSA9IHRyZWUuZ2V0SXRlbShwdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBBZGQgYSB0cmVlIGxpc3RlbmVyIHRvIGV4cGFuZCBhbmQgY29sbGFwc2Ugd2hpY2gKLSAgICAgICAgLy8gYWxsb3dzIGZvciBsYXp5IGNyZWF0aW9uIG9mIGNoaWxkcmVuCi0gICAgICAgIHRyZWUuYWRkVHJlZUxpc3RlbmVyKG5ldyBUcmVlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoZmluYWwgVHJlZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVHJlZUV4cGFuZChldmVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyZWVDb2xsYXBzZWQoZmluYWwgVHJlZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVHJlZUNvbGxhcHNlKGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gUmVmcmVzaCB0aGUgdHJlZSB3aGVuIEY1IHByZXNzZWQKLSAgICAgICAgdHJlZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkVTQykKLSAgICAgICAgICAgICAgICAgICAgZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChlLmtleUNvZGUgPT0gU1dULkY1KQotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHdpbGwgc2ltdWxhdGUgYSByZXNlbGVjdAotICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dChnZXRJbnB1dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBzdGF0dXMgbGluZSBiYXNlZCBvbiB0aGUgZGF0YSBvZiBpdGVtLgotICAgICAqIEBwYXJhbSBpdGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzTGluZShXaWRnZXQgaXRlbSkgewotICAgIAlzZXRNZXNzYWdlKG51bGwpOwotICAgIAlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgCQotICAgIAkvLyBVcGRhdGUgdGhlIHN0YXR1cyBsaW5lCi0gICAgCWlmIChpdGVtICE9IG51bGwpIHsKLSAgICAJCWlmIChpdGVtLmdldERhdGEoKSBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXRFbnRyeSkgewotICAgIAkJCVByb3BlcnR5U2hlZXRFbnRyeSBwc0VudHJ5ID0gKFByb3BlcnR5U2hlZXRFbnRyeSkgaXRlbS5nZXREYXRhKCk7Ci0gICAgCQkJCi0gICAgCQkJLy8gRm9yIGVudHJpZXMsIHNob3cgdGhlIGRlc2NyaXB0aW9uIGlmIGFueSwgZWxzZSBzaG93IHRoZSBsYWJlbAotICAgIAkJCVN0cmluZyBkZXNjID0gcHNFbnRyeS5nZXREZXNjcmlwdGlvbigpOwotICAgIAkJCWlmIChkZXNjICE9IG51bGwgJiYgZGVzYy5sZW5ndGgoKSA+IDApCi0gICAgCQkJCXNldE1lc3NhZ2UocHNFbnRyeS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAJCQllbHNlCi0JICAgIAkJCXNldE1lc3NhZ2UocHNFbnRyeS5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAJCX0KLSAgICAJCQkKLSAgICAJCWVsc2UgaWYgKGl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldENhdGVnb3J5KSB7Ci0gICAgCQkJUHJvcGVydHlTaGVldENhdGVnb3J5IHBzQ2F0ID0gKFByb3BlcnR5U2hlZXRDYXRlZ29yeSkgaXRlbS5nZXREYXRhKCk7Ci0gICAgCQkJc2V0TWVzc2FnZShwc0NhdC5nZXRDYXRlZ29yeU5hbWUoKSk7Ci0gICAgCQl9Ci0gICAgCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIGFsbCBvZiB0aGUgaXRlbXMgaW4gdGhlIHRyZWUuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoaXMgbWVhbnMgZW5zdXJpbmcgdGhhdCB0aGUgdHJlZSBpdGVtcyByZWZsZWN0IHRoZSBzdGF0ZSBvZgotICAgICAqIHRoZSBtb2RlbCAoZW50cnkgdHJlZSkgaXQgZG9lcyBub3QgbWVhbiB0ZWxsaW5nIHRoZSBtb2RlbCB0byB1cGRhdGUKLSAgICAgKiBpdHNlbGYuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIGlmIChyb290RW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW5PZihyb290RW50cnksIHRyZWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY2VsbCBlZGl0b3IgYWN0aXZhdGlvbiBsaXN0ZW5lciBmcm9tIHRoaXMgdmlld2VyLiBIYXMKLSAgICAgKiBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGFjdGl2YXRpb24gbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyCi0gICAgICogICAgICAgICAgICBhIGNlbGwgZWRpdG9yIGFjdGl2YXRpb24gbGlzdGVuZXIKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovCi0gICAgdm9pZCByZW1vdmVBY3RpdmF0aW9uTGlzdGVuZXIoSUNlbGxFZGl0b3JBY3RpdmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgYWN0aXZhdGlvbkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gaXRlbSBmcm9tIHRoZSB0cmVlLiBSZW1vdmUgb3VyIGxpc3RlbmVyIGlmIHRoZQotICAgICAqIGl0ZW0ncyB1c2VyIGRhdGEgaXMgYSBhbiBlbnRyeSB0aGVuIHNldCB0aGUgdXNlciBkYXRhIHRvIG51bGwKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlbQotICAgICAqICAgICAgICAgICAgdGhlIGl0ZW0gdG8gcmVtb3ZlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUl0ZW0oVHJlZUl0ZW0gaXRlbSkgewotICAgICAgICBPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIElQcm9wZXJ0eVNoZWV0RW50cnkpCi0gICAgICAgICAgICAoKElQcm9wZXJ0eVNoZWV0RW50cnkpIGRhdGEpCi0gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lcihlbnRyeUxpc3RlbmVyKTsKLSAgICAgICAgaXRlbS5zZXREYXRhKG51bGwpOwotICAgICAgICBpdGVtLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldCB0aGUgc2VsZWN0ZWQgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIC8vIERldGVybWluZSB0aGUgc2VsZWN0aW9uCi0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGVudHJpZXMgYW5kIHJlc2V0IHRoZW0KLSAgICAgICAgSXRlcmF0b3IgaXRyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKQotICAgICAgICAgICAgKChJUHJvcGVydHlTaGVldEVudHJ5KSBpdHIubmV4dCgpKS5yZXNldFByb3BlcnR5VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgc3RhdHVzIGxpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVycm9yTWVzc2FnZQotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotICAgICAgICAvLyBzaG93IHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICAgIGlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKQotICAgICAgICAgICAgc3RhdHVzTGluZU1hbmFnZXIuc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlByb3BlcnR5U2hlZXRWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kCi0gICAgICogZGVjbGFyZWQgb24gPGNvZGU+Vmlld2VyPC9jb2RlPiBtZXRob2Qgc2V0cyB0aGUgb2JqZWN0cyBmb3Igd2hpY2ggdGhlCi0gICAgICogdmlld2VyIGlzIGN1cnJlbnRseSBzaG93aW5nIHByb3BlcnRpZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGlucHV0IG11c3QgYmUgYW4gPGNvZGU+T2JqZWN0W108L2NvZGU+IG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3SW5wdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBvZiB0aGlzIHZpZXdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAvLyBuZWVkIHRvIHNhdmUgYW55IGNoYW5nZWQgdmFsdWUgd2hlbiB1c2VyIGNsaWNrcyBlbHNld2hlcmUKLSAgICAgICAgYXBwbHlFZGl0b3JWYWx1ZSgpOwotICAgICAgICAvLyBkZWFjdGl2YXRlIG91ciBjZWxsIGVkaXRvcgotICAgICAgICBkZWFjdGl2YXRlQ2VsbEVkaXRvcigpOwotCi0gICAgICAgIC8vIHNldCB0aGUgbmV3IGlucHV0IHRvIHRoZSByb290IGVudHJ5Ci0gICAgICAgIGlucHV0ID0gKE9iamVjdFtdKSBuZXdJbnB1dDsKLSAgICAgICAgaWYgKGlucHV0ID09IG51bGwpCi0gICAgICAgICAgICBpbnB1dCA9IG5ldyBPYmplY3RbMF07Ci0KLSAgICAgICAgaWYgKHJvb3RFbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByb290RW50cnkuc2V0VmFsdWVzKGlucHV0KTsKLSAgICAgICAgICAgIC8vIGVuc3VyZSBmaXJzdCBsZXZlbCBjaGlsZHJlbiBhcmUgdmlzaWJsZQotICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW5PZihyb290RW50cnksIHRyZWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHN0YXR1cyBsaW5lLiBUaGlzIG1lc3NhZ2UgaXMKLSAgICAgKiBkaXNwbGF5ZWQgd2hlbiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgLy8gc2hvdyB0aGUgbWVzc2FnZQotICAgICAgICBpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcm9vdCBlbnRyeSBmb3IgdGhpcyBwcm9wZXJ0eSBzaGVldCB2aWV3ZXIuIFRoZSByb290IGVudHJ5IGlzIG5vdAotICAgICAqIHZpc2libGUgaW4gdGhlIHZpZXdlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcm9vdAotICAgICAqICAgICAgICAgICAgdGhlIHJvb3QgZW50cnkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb290RW50cnkoSVByb3BlcnR5U2hlZXRFbnRyeSByb290KSB7Ci0gICAgICAgIC8vIElmIHdlIGhhdmUgYSByb290IGVudHJ5LCByZW1vdmUgb3VyIGVudHJ5IGxpc3RlbmVyCi0gICAgICAgIGlmIChyb290RW50cnkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJvb3RFbnRyeS5yZW1vdmVQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lcihlbnRyeUxpc3RlbmVyKTsKLQotICAgICAgICByb290RW50cnkgPSByb290OwotCi0gICAgICAgIC8vIFNldCB0aGUgcm9vdCBhcyB1c2VyIGRhdGEgb24gdGhlIHRyZWUKLSAgICAgICAgdHJlZS5zZXREYXRhKHJvb3RFbnRyeSk7Ci0KLSAgICAgICAgLy8gQWRkIGFuIElQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lciB0byBsaXN0ZW4gZm9yIGVudHJ5IGNoYW5nZQotICAgICAgICAvLyBub3RpZmljYXRpb25zCi0gICAgICAgIHJvb3RFbnRyeS5hZGRQcm9wZXJ0eVNoZWV0RW50cnlMaXN0ZW5lcihlbnRyeUxpc3RlbmVyKTsKLQotICAgICAgICAvLyBQYXNzIG91ciBpbnB1dCB0byB0aGUgcm9vdCwgdGhpcyB3aWxsIHRyaWdnZXIgZW50cnkgY2hhbmdlCi0gICAgICAgIC8vIGNhbGxiYWNrcyB0byB1cGRhdGUgdGhpcyB2aWV3ZXIKLSAgICAgICAgc2V0SW5wdXQoaW5wdXQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24sIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIHJldmVhbCkgewotICAgICAgICAvL0RvIG5vdGhpbmcgYnkgZGVmYXVsdAotICAgIH0KLQotICAgIC8qKgotCSAqIFNldHMgdGhlIHNvcnRlciBmb3IgdGhpcyB2aWV3ZXIuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgc29ydGVyIHNvcnRzIGNhdGVnb3JpZXMgYW5kIGVudHJpZXMgYWxwaGFiZXRpY2FsbHkuIAotCSAqIEEgdmlld2VyIHVwZGF0ZSBuZWVkcyB0byBiZSB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIHNvcnRlciBoYXMgY2hhbmdlZC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHNvcnRlciB0aGUgc29ydGVyIHRvIHNldCAoPGNvZGU+bnVsbDwvY29kZT4gd2lsbCByZXNldCB0byB0aGUKLQkgKiBkZWZhdWx0IHNvcnRlcikKLSAgICAgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0U29ydGVyKFByb3BlcnR5U2hlZXRTb3J0ZXIgc29ydGVyKSB7Ci0JCWlmIChudWxsID09IHNvcnRlcikKLQkJCXNvcnRlciA9IG5ldyBQcm9wZXJ0eVNoZWV0U29ydGVyKCk7Ci0JCXRoaXMuc29ydGVyID0gc29ydGVyOwotCX0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN0YXR1cyBsaW5lIG1hbmFnZXIgdGhpcyB2aWV3IHdpbGwgdXNlIHRvIHNob3cgbWVzc2FnZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hbmFnZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGF0dXMgbGluZSBtYW5hZ2VyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgc3RhdHVzTGluZU1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3dzIHRoZSBjYXRlZ29yaWVzLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8KLSAgICB2b2lkIHNob3dDYXRlZ29yaWVzKCkgewotICAgICAgICBpc1Nob3dpbmdDYXRlZ29yaWVzID0gdHJ1ZTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3dzIHRoZSBleHBlcnQgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovCi0gICAgdm9pZCBzaG93RXhwZXJ0KCkgewotICAgICAgICBpc1Nob3dpbmdFeHBlcnRQcm9wZXJ0aWVzID0gdHJ1ZTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGNhdGVnb3JpZXMuIFJldXNlcyBvbGQgY2F0ZWdvcmllcyBpZiBwb3NzaWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ2F0ZWdvcmllcygpIHsKLSAgICAgICAgLy8gbGF6eSBpbml0aWFsaXplCi0gICAgICAgIGlmIChjYXRlZ29yaWVzID09IG51bGwpCi0gICAgICAgICAgICBjYXRlZ29yaWVzID0gbmV3IFByb3BlcnR5U2hlZXRDYXRlZ29yeVswXTsKLQotICAgICAgICAvLyBnZXQgYWxsIHRoZSBmaWx0ZXJlZCBjaGlsZCBlbnRyaWVzIG9mIHRoZSByb290Ci0gICAgICAgIExpc3QgY2hpbGRFbnRyaWVzID0gZ2V0RmlsdGVyZWRFbnRyaWVzKHJvb3RFbnRyeS5nZXRDaGlsZEVudHJpZXMoKSk7Ci0KLSAgICAgICAgLy8gaWYgdGhlIGxpc3QgaXMgZW1wdHksIGp1c3Qgc2V0IGFuIGVtcHR5IGNhdGVnb3JpZXMgYXJyYXkKLSAgICAgICAgaWYgKGNoaWxkRW50cmllcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgY2F0ZWdvcmllcyA9IG5ldyBQcm9wZXJ0eVNoZWV0Q2F0ZWdvcnlbMF07Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjYWNoZSBvbGQgY2F0ZWdvcmllcyBieSB0aGVpciBkZXNjcmlwdG9yIG5hbWUKLSAgICAgICAgTWFwIGNhdGVnb3J5Q2FjaGUgPSBuZXcgSGFzaE1hcChjYXRlZ29yaWVzLmxlbmd0aCAqIDIgKyAxKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjYXRlZ29yaWVzW2ldLnJlbW92ZUFsbEVudHJpZXMoKTsKLSAgICAgICAgICAgIGNhdGVnb3J5Q2FjaGUucHV0KGNhdGVnb3JpZXNbaV0uZ2V0Q2F0ZWdvcnlOYW1lKCksIGNhdGVnb3JpZXNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgbGlzdCBvZiBjYXRlZ29yaWVzIHRvIGdldCByaWQgb2YKLSAgICAgICAgTGlzdCBjYXRlZ29yaWVzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoY2F0ZWdvcmllcykpOwotCi0gICAgICAgIC8vIERldGVybWluZSB0aGUgY2F0ZWdvcmllcwotICAgICAgICBQcm9wZXJ0eVNoZWV0Q2F0ZWdvcnkgbWlzYyA9IChQcm9wZXJ0eVNoZWV0Q2F0ZWdvcnkpIGNhdGVnb3J5Q2FjaGUKLSAgICAgICAgICAgICAgICAuZ2V0KE1JU0NFTExBTkVPVVNfQ0FURUdPUllfTkFNRSk7Ci0gICAgICAgIGlmIChtaXNjID09IG51bGwpCi0gICAgICAgICAgICBtaXNjID0gbmV3IFByb3BlcnR5U2hlZXRDYXRlZ29yeShNSVNDRUxMQU5FT1VTX0NBVEVHT1JZX05BTUUpOwotICAgICAgICBib29sZWFuIGFkZE1pc2MgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRW50cmllcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSVByb3BlcnR5U2hlZXRFbnRyeSBjaGlsZEVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpIGNoaWxkRW50cmllcwotICAgICAgICAgICAgICAgICAgICAuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIGNhdGVnb3J5TmFtZSA9IGNoaWxkRW50cnkuZ2V0Q2F0ZWdvcnkoKTsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1pc2MuYWRkRW50cnkoY2hpbGRFbnRyeSk7Ci0gICAgICAgICAgICAgICAgYWRkTWlzYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcmllc1RvUmVtb3ZlLnJlbW92ZShtaXNjKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlTaGVldENhdGVnb3J5IGNhdGVnb3J5ID0gKFByb3BlcnR5U2hlZXRDYXRlZ29yeSkgY2F0ZWdvcnlDYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChjYXRlZ29yeU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gbmV3IFByb3BlcnR5U2hlZXRDYXRlZ29yeShjYXRlZ29yeU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeUNhY2hlLnB1dChjYXRlZ29yeU5hbWUsIGNhdGVnb3J5KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWVzVG9SZW1vdmUucmVtb3ZlKGNhdGVnb3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcnkuYWRkRW50cnkoY2hpbGRFbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgdGhlIFBTRV9NSVNDIGNhdGVnb3J5IGlmIGl0IGhhcyBlbnRyaWVzCi0gICAgICAgIGlmIChhZGRNaXNjKQotICAgICAgICAgICAgY2F0ZWdvcnlDYWNoZS5wdXQoTUlTQ0VMTEFORU9VU19DQVRFR09SWV9OQU1FLCBtaXNjKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNvcnQgdGhlIGNhdGVnb3JpZXMuCi0gICAgICAgIC8vIFJhdGhlciB0aGFuIGp1c3Qgc29ydGluZyBjYXRlZ29yeUNhY2hlLnZhbHVlcygpLCB3ZSdkIGxpa2UgdGhlIG9yaWdpbmFsIG9yZGVyIHRvIGJlIHByZXNlcnZlZAotICAgICAgICAvLyAod2l0aCBtaXNjIGFkZGVkIGF0IHRoZSBlbmQsIGlmIG5lZWRlZCkgYmVmb3JlIHBhc3NpbmcgdG8gdGhlIHNvcnRlci4KLSAgICAgICAgQXJyYXlMaXN0IGNhdGVnb3J5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgU2V0IHNlZW4gPSBuZXcgSGFzaFNldChjaGlsZEVudHJpZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEVudHJpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIElQcm9wZXJ0eVNoZWV0RW50cnkgY2hpbGRFbnRyeSA9IChJUHJvcGVydHlTaGVldEVudHJ5KSBjaGlsZEVudHJpZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldChpKTsKLSAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeU5hbWUgPSBjaGlsZEVudHJ5LmdldENhdGVnb3J5KCk7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnlOYW1lICE9IG51bGwgJiYgIXNlZW4uY29udGFpbnMoY2F0ZWdvcnlOYW1lKSkgewotICAgICAgICAgICAgICAgIHNlZW4uYWRkKGNhdGVnb3J5TmFtZSk7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlTaGVldENhdGVnb3J5IGNhdGVnb3J5ID0gKFByb3BlcnR5U2hlZXRDYXRlZ29yeSkgY2F0ZWdvcnlDYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChjYXRlZ29yeU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeSAhPSBudWxsKSB7IAotICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeUxpc3QuYWRkKGNhdGVnb3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFkZE1pc2MgJiYgIXNlZW4uY29udGFpbnMoTUlTQ0VMTEFORU9VU19DQVRFR09SWV9OQU1FKSkgewotICAgICAgICAgICAgY2F0ZWdvcnlMaXN0LmFkZChtaXNjKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgUHJvcGVydHlTaGVldENhdGVnb3J5W10gY2F0ZWdvcnlBcnJheSA9IChQcm9wZXJ0eVNoZWV0Q2F0ZWdvcnlbXSkgY2F0ZWdvcnlMaXN0Ci0gICAgICAgIAkudG9BcnJheShuZXcgUHJvcGVydHlTaGVldENhdGVnb3J5W2NhdGVnb3J5TGlzdC5zaXplKCldKTsKLSAgICAgICAgc29ydGVyLnNvcnQoY2F0ZWdvcnlBcnJheSk7Ci0gICAgICAgIGNhdGVnb3JpZXMgPSBjYXRlZ29yeUFycmF5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgY2F0ZWdvcnkgKGJ1dCBub3QgaXRzIHBhcmVudCBvciBjaGlsZHJlbikuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdGVnb3J5Ci0gICAgICogICAgICAgICAgICB0aGUgY2F0ZWdvcnkgdG8gdXBkYXRlCi0gICAgICogQHBhcmFtIGl0ZW0KLSAgICAgKiAgICAgICAgICAgIHRoZSB0cmVlIGl0ZW0gZm9yIHRoZSBnaXZlbiBlbnRyeQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDYXRlZ29yeShQcm9wZXJ0eVNoZWV0Q2F0ZWdvcnkgY2F0ZWdvcnksCi0gICAgICAgICAgICBUcmVlSXRlbSBpdGVtKSB7Ci0gICAgICAgIC8vIGVuc3VyZSB0aGF0IGJhY2twb2ludGVyIGlzIGNvcnJlY3QKLSAgICAgICAgaXRlbS5zZXREYXRhKGNhdGVnb3J5KTsKLQotICAgICAgICAvLyBVcGRhdGUgdGhlIG5hbWUgYW5kIHZhbHVlIGNvbHVtbnMKLSAgICAgICAgaXRlbS5zZXRUZXh0KDAsIGNhdGVnb3J5LmdldENhdGVnb3J5TmFtZSgpKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KDEsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgIisiIGljb24KLSAgICAgICAgaWYgKGNhdGVnb3J5LmdldEF1dG9FeHBhbmQoKSkgewotICAgICAgICAgICAgLy8gd2UgYXV0byBleHBhbmQgY2F0ZWdvcmllcyB3aGVuIHRoZXkgZmlyc3QgYXBwZWFyCi0gICAgICAgICAgICBjcmVhdGVDaGlsZHJlbihpdGVtKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0gICAgICAgICAgICBjYXRlZ29yeS5zZXRBdXRvRXhwYW5kKGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHdlIGRvIG5vdCB3YW50IHRvIGF1dG8gZXhwYW5kIGNhdGVnb3JpZXMgaWYgdGhlIHVzZXIgaGFzCi0gICAgICAgICAgICAvLyBjb2xscGFzZWQgdGhlbQotICAgICAgICAgICAgdXBkYXRlUGx1cyhjYXRlZ29yeSwgaXRlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIGNoaWxkIGVudHJpZXMgb3IgY2F0ZWdvcmllcyBvZiB0aGUgZ2l2ZW4gZW50cnkgb3IgY2F0ZWdvcnkuIElmCi0gICAgICogdGhlIGdpdmVuIG5vZGUgaXMgdGhlIHJvb3QgZW50cnkgYW5kIHdlIGFyZSBzaG93aW5nIGNhdGVnb3JpZXMgdGhlbiB0aGUKLSAgICAgKiBjaGlsZCBlbnRyaWVzIGFyZSBjYXRlZ29yaWVzLCBvdGhlcndpc2UgdGhleSBhcmUgZW50cmllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqICAgICAgICAgICAgdGhlIGVudHJ5IG9yIGNhdGVnb3J5IHdob3NlIGNoaWxkcmVuIHdlIHdpbGwgdXBkYXRlCi0gICAgICogQHBhcmFtIHdpZGdldAotICAgICAqICAgICAgICAgICAgdGhlIHdpZGdldCBmb3IgdGhlIGdpdmVuIGVudHJ5LCBlaXRoZXIgYQotICAgICAqICAgICAgICAgICAgPGNvZGU+VGFibGVUcmVlPC9jb2RlPiBpZiB0aGUgbm9kZSBpcyB0aGUgcm9vdCBub2RlIG9yIGEKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlRyZWVJdGVtPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoaWxkcmVuT2YoT2JqZWN0IG5vZGUsIFdpZGdldCB3aWRnZXQpIHsKLSAgICAgICAgLy8gY2FzdCB0aGUgZW50cnkgb3IgY2F0ZWdvcnkKLSAgICAgICAgSVByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeSA9IG51bGw7Ci0gICAgICAgIFByb3BlcnR5U2hlZXRDYXRlZ29yeSBjYXRlZ29yeSA9IG51bGw7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSVByb3BlcnR5U2hlZXRFbnRyeSkKLSAgICAgICAgICAgIGVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpIG5vZGU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNhdGVnb3J5ID0gKFByb3BlcnR5U2hlZXRDYXRlZ29yeSkgbm9kZTsKLQotICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgY2hpbGQgdHJlZSBpdGVtcwotICAgICAgICBUcmVlSXRlbVtdIGNoaWxkSXRlbXMgPSBnZXRDaGlsZEl0ZW1zKHdpZGdldCk7Ci0KLSAgICAgICAgLy8gb3B0aW1pemF0aW9uISBwcnVuZSBjb2xsYXBzZWQgc3VidHJlZXMKLSAgICAgICAgVHJlZUl0ZW0gaXRlbSA9IG51bGw7Ci0gICAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotICAgICAgICAgICAgaXRlbSA9IChUcmVlSXRlbSkgd2lkZ2V0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgIWl0ZW0uZ2V0RXhwYW5kZWQoKSkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCBjaGlsZHJlbgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoaWxkSXRlbXNbaV0uZ2V0RGF0YSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSXRlbShjaGlsZEl0ZW1zW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFwcGVuZCBhIGR1bW15IGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgaWYgKGNhdGVnb3J5ICE9IG51bGwgfHwgZW50cnkuaGFzQ2hpbGRFbnRyaWVzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBtYXkgYWxyZWFkeSBoYXZlIGEgZHVtbXkKLSAgICAgICAgICAgICAgICAvLyBJdCBpcyBlaXRoZXIgYSBjYXRlZ29yeSAod2hpY2ggYWx3YXlzIGhhcyBhdCBsZWFzdCBvbmUgY2hpbGQpCi0gICAgICAgICAgICAgICAgLy8gb3IgYW4gZW50cnkgd2l0aCBjaGlkcmVuLgotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHRlc3QgaXMgbm90IHBlcmZlY3QsIGlmIHdlIGhhdmUgZmlsdGVyaW5nIG9uCi0gICAgICAgICAgICAgICAgLy8gdGhlbiB0aGVyZSBpbiBmYWN0IG1heSBiZSBubyBlbnRpcmVzIHRvIHNob3cgd2hlbiB0aGUgdXNlcgotICAgICAgICAgICAgICAgIC8vIHByZXNzZXMgdGhlICIrIiBleHBhbmQgaWNvbi4gQnV0IHRoaXMgaXMgYW4gYWNjZXB0YWJsZQotICAgICAgICAgICAgICAgIC8vIGNvbXByb21pc2UuCi0gICAgICAgICAgICAgICAgY2hpbGRJdGVtcyA9IGdldENoaWxkSXRlbXMod2lkZ2V0KTsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRJdGVtcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5VTEwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgY2hpbGQgZW50cmllcyBvciBjYXRlZ29yaWVzCi0gICAgICAgIGlmIChub2RlID09IHJvb3RFbnRyeSAmJiBpc1Nob3dpbmdDYXRlZ29yaWVzKQotICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBjYXRlZ29yaWVzCi0gICAgICAgICAgICB1cGRhdGVDYXRlZ29yaWVzKCk7Ci0gICAgICAgIExpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihub2RlKTsKLQotICAgICAgICAvLyByZW1vdmUgaXRlbXMKLSAgICAgICAgU2V0IHNldCA9IG5ldyBIYXNoU2V0KGNoaWxkSXRlbXMubGVuZ3RoICogMiArIDEpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRJdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSBjaGlsZEl0ZW1zW2ldLmdldERhdGEoKTsKLSAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZSA9IGRhdGE7Ci0gICAgICAgICAgICAgICAgaW50IGl4ID0gY2hpbGRyZW4uaW5kZXhPZihlKTsKLSAgICAgICAgICAgICAgICBpZiAoaXggPCAwKSB7IC8vIG5vdCBmb3VuZAotICAgICAgICAgICAgICAgICAgICByZW1vdmVJdGVtKGNoaWxkSXRlbXNbaV0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhID09IG51bGwpIHsgLy8gdGhlIGR1bW15Ci0gICAgICAgICAgICAgICAgY2hpbGRJdGVtc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXT1JLQVJPVU5ECi0gICAgICAgIGludCBvbGRDbnQgPSAtMTsKLSAgICAgICAgaWYgKHdpZGdldCA9PSB0cmVlKQotICAgICAgICAgICAgb2xkQ250ID0gdHJlZS5nZXRJdGVtQ291bnQoKTsKLQotICAgICAgICAvLyBhZGQgbmV3IGl0ZW1zCi0gICAgICAgIGludCBuZXdTaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld1NpemU7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IGVsID0gY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgaWYgKCFzZXQuY29udGFpbnMoZWwpKQotICAgICAgICAgICAgICAgIGNyZWF0ZUl0ZW0oZWwsIHdpZGdldCwgaSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXT1JLQVJPVU5ECi0gICAgICAgIGlmICh3aWRnZXQgPT0gdHJlZSAmJiBvbGRDbnQgPT0gMCAmJiB0cmVlLmdldEl0ZW1Db3VudCgpID09IDEpIHsKLSAgICAgICAgICAgIHRyZWUuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgICAgIHRyZWUuc2V0UmVkcmF3KHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBjaGlsZCB0cmVlIGl0ZW1zIGFmdGVyIG91ciBjaGFuZ2VzCi0gICAgICAgIGNoaWxkSXRlbXMgPSBnZXRDaGlsZEl0ZW1zKHdpZGdldCk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBjaGlsZCBpdGVtcwotICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgY2hpbGRyZW4gYXJlIGluIHRoZSBjb3JyZWN0IG9yZGVyCi0gICAgICAgIC8vIGFyZSBzaG93aW5nIHRoZSBjb3JyZWN0IHZhbHVlcy4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdTaXplOyBpKyspIHsKLSAgICAgICAgICAgIE9iamVjdCBlbCA9IGNoaWxkcmVuLmdldChpKTsKLSAgICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIElQcm9wZXJ0eVNoZWV0RW50cnkpCi0gICAgICAgICAgICAgICAgdXBkYXRlRW50cnkoKElQcm9wZXJ0eVNoZWV0RW50cnkpIGVsLCBjaGlsZEl0ZW1zW2ldKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNhdGVnb3J5KChQcm9wZXJ0eVNoZWV0Q2F0ZWdvcnkpIGVsLCBjaGlsZEl0ZW1zW2ldKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlbk9mKGVsLCBjaGlsZEl0ZW1zW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgdHJlZSdzIG9yaWdpbmFsIHNlbGVjdGlvbiBtYXkgbm8gbG9uZ2VyIGFwcGx5IGFmdGVyIHRoZSB1cGRhdGUsCi0gICAgICAgIC8vIHNvIGZpcmUgdGhlIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50LgotICAgICAgICBlbnRyeVNlbGVjdGlvbkNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIGdpdmVuIGVudHJ5IChidXQgbm90IGl0cyBjaGlsZHJlbiBvciBwYXJlbnQpCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5Ci0gICAgICogICAgICAgICAgICB0aGUgZW50cnkgd2Ugd2lsbCB1cGRhdGUKLSAgICAgKiBAcGFyYW0gaXRlbQotICAgICAqICAgICAgICAgICAgdGhlIHRyZWUgaXRlbSBmb3IgdGhlIGdpdmVuIGVudHJ5Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUVudHJ5KElQcm9wZXJ0eVNoZWV0RW50cnkgZW50cnksIFRyZWVJdGVtIGl0ZW0pIHsKLSAgICAgICAgLy8gZW5zdXJlIHRoYXQgYmFja3BvaW50ZXIgaXMgY29ycmVjdAotICAgICAgICBpdGVtLnNldERhdGEoZW50cnkpOwotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgbmFtZSBhbmQgdmFsdWUgY29sdW1ucwotICAgICAgICBpdGVtLnNldFRleHQoMCwgZW50cnkuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCgxLCBlbnRyeS5nZXRWYWx1ZUFzU3RyaW5nKCkpOwotICAgICAgICBJbWFnZSBpbWFnZSA9IGVudHJ5LmdldEltYWdlKCk7Ci0gICAgICAgIGlmIChpdGVtLmdldEltYWdlKDEpICE9IGltYWdlKQotICAgICAgICAgICAgaXRlbS5zZXRJbWFnZSgxLCBpbWFnZSk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSAiKyIgaWNvbgotICAgICAgICB1cGRhdGVQbHVzKGVudHJ5LCBpdGVtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSAiKyIvIi0iIGljb24gb2YgdGhlIHRyZWUgaXRlbSBmcm9tIHRoZSBnaXZlbiBlbnRyeQotICAgICAqIG9yIGNhdGVnb3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgdGhlIGVudHJ5IG9yIGNhdGVnb3J5Ci0gICAgICogQHBhcmFtIGl0ZW0gdGhlIHRyZWUgaXRlbSBiZWluZyB1cGRhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsdXMoT2JqZWN0IG5vZGUsIFRyZWVJdGVtIGl0ZW0pIHsKLSAgICAgICAgLy8gY2FzdCB0aGUgZW50cnkgb3IgY2F0ZWdvcnkKLSAgICAgICAgSVByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeSA9IG51bGw7Ci0gICAgICAgIFByb3BlcnR5U2hlZXRDYXRlZ29yeSBjYXRlZ29yeSA9IG51bGw7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSVByb3BlcnR5U2hlZXRFbnRyeSkKLSAgICAgICAgICAgIGVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpIG5vZGU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNhdGVnb3J5ID0gKFByb3BlcnR5U2hlZXRDYXRlZ29yeSkgbm9kZTsKLQotICAgICAgICBib29sZWFuIGhhc1BsdXMgPSBpdGVtLmdldEl0ZW1Db3VudCgpID4gMDsKLSAgICAgICAgYm9vbGVhbiBuZWVkc1BsdXMgPSBjYXRlZ29yeSAhPSBudWxsIHx8IGVudHJ5Lmhhc0NoaWxkRW50cmllcygpOwotICAgICAgICBib29sZWFuIHJlbW92ZUFsbCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGFkZER1bW15ID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGhhc1BsdXMgIT0gbmVlZHNQbHVzKSB7Ci0gICAgICAgICAgICBpZiAobmVlZHNQbHVzKSB7Ci0gICAgICAgICAgICAgICAgYWRkRHVtbXkgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZW1vdmVBbGwgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZW1vdmVBbGwpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgY2hpbGRyZW4KLSAgICAgICAgICAgIFRyZWVJdGVtW10gaXRlbXMgPSBpdGVtLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlSXRlbShpdGVtc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWRkRHVtbXkpIHsKLSAgICAgICAgICAgIG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTlVMTCk7IC8vIGFwcGVuZCBhIGR1bW15IHRvIGNyZWF0ZSB0aGUKLSAgICAgICAgICAgIC8vIHBsdXMgc2lnbgotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS52aWV3cy9zcmMvb3JnL2VjbGlwc2UvdWkvdmlld3MvcHJvcGVydGllcy9UZXh0UHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1RleHRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMzhjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1RleHRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERlc2NyaXB0b3IgZm9yIGEgcHJvcGVydHkgdGhhdCBoYXMgYSB2YWx1ZSB3aGljaCBzaG91bGQgYmUgZWRpdGVkIHdpdGggYSAKLSAqIHRleHQgY2VsbCBlZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEV4YW1wbGU6Ci0gKiA8cHJlPgotICogSVByb3BlcnR5RGVzY3JpcHRvciBwZCA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKCJzdXJuYW1lIiwgIkxhc3QgTmFtZSIpOwotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgUHJvcGVydHlEZXNjcmlwdG9yIHsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIHByb3BlcnR5IGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4gaWQgYW5kIGRpc3BsYXkgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZSB0aGUgbmFtZSB0byBkaXNwbGF5IGZvciB0aGUgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSkgewotICAgICAgICBzdXBlcihpZCwgZGlzcGxheU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5UZXh0UHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPklQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IG1ldGhvZCBjcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3Ci0gICAgICogPGNvZGU+VGV4dENlbGxFZGl0b3I8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIFRoZSBlZGl0b3IgaXMgY29uZmlndXJlZCB3aXRoIHRoZSBjdXJyZW50IHZhbGlkYXRvciBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBDZWxsRWRpdG9yIGNyZWF0ZVByb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ2VsbEVkaXRvciBlZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IocGFyZW50KTsKLSAgICAgICAgaWYgKGdldFZhbGlkYXRvcigpICE9IG51bGwpCi0gICAgICAgICAgICBlZGl0b3Iuc2V0VmFsaWRhdG9yKGdldFZhbGlkYXRvcigpKTsKLSAgICAgICAgcmV0dXJuIGVkaXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS91aS92aWV3cy9wcm9wZXJ0aWVzL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTZhMWI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkudmlld3Mvc3JjL29yZy9lY2xpcHNlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBzdGFuZGFyZCBQcm9wZXJ0eSBTaGVldCB2aWV3IHdoaWNoIGRpc3BsYXlzCi1jdXN0b20gcHJvcGVydGllcyBvZiB0aGUgYWN0aXZlIHdvcmtiZW5jaCBwYXJ0J3MgY3VycmVudCBzZWxlY3Rpb24uCi08YnI+Jm5ic3A7Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndpbjMyLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndpbjMyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud2luMzIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud2luMzIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZGY0OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVpLndpbjMyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmhlbHA8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS5pZGU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLnZpZXdzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29yZTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndpbjMyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjMzczNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndpbjMyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNXZWQgTWF5IDI1IDIxOjExOjExIEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndpbjMyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndpbjMyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwY2UyZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVHVlIEFwciAyNiAwOTo1NDozMyBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBnZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50Ij4vKipcbiAqIEByZXR1cm4gUmV0dXJucyB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgY29udGV4dFw9InNldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyY29tbWVudCIgbmFtZVw9InNldHRlcmNvbW1lbnQiPi8qKlxuICogQHBhcmFtICR7cGFyYW19IFRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBKYXZhIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpbGVjb21tZW50IiBuYW1lXD0iZmlsZWNvbW1lbnQiPi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBDb3B5cmlnaHQgKGMpICR7eWVhcn0gSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG4gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcbiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwXDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbiAqXG4gKiBDb250cmlidXRvcnNcOlxuICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcbiAqIEBzaW5jZSAzLjFcbiAqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBmaWVsZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50Ij4vKipcbiAqIFxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG5vbi1vdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGNvbnRleHRcPSJuZXd0eXBlX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJOZXdseSBjcmVhdGVkIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm5ld3R5cGUiIG5hbWVcPSJuZXd0eXBlIj4ke2ZpbGVjb21tZW50fVxuJHtwYWNrYWdlX2RlY2xhcmF0aW9ufVxuXG4ke3R5cGVjb21tZW50fVxuJHt0eXBlX2RlY2xhcmF0aW9ufTwvdGVtcGxhdGU+PHRlbXBsYXRlIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgY29udGV4dFw9ImNvbnN0cnVjdG9yYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGNvbnN0cnVjdG9yIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yYm9keSIgbmFtZVw9ImNvbnN0cnVjdG9yYm9keSI+JHtib2R5X3N0YXRlbWVudH1cbi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YjwvdGVtcGxhdGU+PHRlbXBsYXRlIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud2luMzIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndpbjMyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzg3ZjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud2luMzIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51aS53aW4zMgotQnVuZGxlLVZlcnNpb246IDMuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQtd2luMzIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5lZGl0b3JzdXBwb3J0LndpbjMyO3gtaW50ZXJuYWw6PXRydWUKLUVjbGlwc2UtUGxhdGZvcm1GaWx0ZXI6IChvc2dpLndzPXdpbjMyKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud2luMzIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTM3N2I2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud2luMzIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uPXNyYy8KLXNyYy5pbmNsdWRlcz1hYm91dC5odG1sCi1iaW4uaW5jbHVkZXMgPSBmcmFnbWVudC54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgZnJhZ21lbnQtd2luMzIucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndpbjMyL2ZyYWdtZW50LXdpbjMyLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndpbjMyL2ZyYWdtZW50LXdpbjMyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjU5ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi9mcmFnbWVudC13aW4zMi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLWZyYWdtZW50TmFtZT1FY2xpcHNlIFVJIFdpbjMyIEVuaGFuY2VtZW50cwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZWRpdG9yc3VwcG9ydC93aW4zMi9PbGVFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2VkaXRvcnN1cHBvcnQvd2luMzIvT2xlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MDlmOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZWRpdG9yc3VwcG9ydC93aW4zMi9PbGVFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZWRpdG9yc3VwcG9ydC53aW4zMjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9MRTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUF1dG9tYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVDbGllbnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5WYXJpYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIE9sZUVkaXRvciBleHRlbmRzIEVkaXRvclBhcnQgewotCi0gICAgLyoqCi0gICAgICogVGhlIHJlc291cmNlIGxpc3RlbmVyIHVwZGF0ZXMgdGhlIHJlY2VpdmVyIHdoZW4KLSAgICAgKiBhIGNoYW5nZSBoYXMgb2NjdXJyZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUxpc3RlbmVyID0gbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgewotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEBzZWUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50KQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2VEZWx0YSBtYWluRGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotICAgICAgICAgICAgaWYgKG1haW5EZWx0YSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIElSZXNvdXJjZURlbHRhIGFmZmVjdGVkRWxlbWVudCA9IG1haW5EZWx0YS5maW5kTWVtYmVyKHJlc291cmNlCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICAgIGlmIChhZmZlY3RlZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwcm9jZXNzRGVsdGEoYWZmZWN0ZWRFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFByb2Nlc3MgdGhlIGRlbHRhIGZvciB0aGUgcmVjZWl2ZXIKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzRGVsdGEoZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQotICAgICAgICAgICAgUnVubmFibGUgY2hhbmdlUnVubmFibGUgPSBudWxsOwotCi0gICAgICAgICAgICBzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgotICAgICAgICAgICAgICAgIGlmICgoSVJlc291cmNlRGVsdGEuTU9WRURfVE8gJiBkZWx0YS5nZXRGbGFncygpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZVJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIHBhdGggPSBkZWx0YS5nZXRNb3ZlZFRvUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGaWxlIG5ld0ZpbGUgPSBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFdvcmtzcGFjZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0ZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDaGFuZ2VkKG5ld0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VEZWxldGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKE9sZUVkaXRvci50aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoYW5nZVJ1bm5hYmxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdXBkYXRlKGNoYW5nZVJ1bm5hYmxlKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGJlY2F1c2Ugd2UgYXJlIHNpdHRpbmcgb24gZmlsZXMgYW55d2F5Ci0gICAgICAgIH0KLQotICAgIH07Ci0KLSAgICBwcml2YXRlIE9sZUZyYW1lIGNsaWVudEZyYW1lOwotCi0gICAgcHJpdmF0ZSBPbGVDbGllbnRTaXRlIGNsaWVudFNpdGU7Ci0KLSAgICBwcml2YXRlIEZpbGUgc291cmNlOwotCi0gICAgcHJpdmF0ZSBJRmlsZSByZXNvdXJjZTsKLQotICAgIHByaXZhdGUgSW1hZ2Ugb2xlVGl0bGVJbWFnZTsKLQotICAgIC8vVGhlIHNvdXJjZURlbGV0ZWQgZmxhZyBtYWtlcyBzdXJlIHRoYXQgdGhlIHJlY2VpdmVyIGlzIG5vdAotICAgIC8vZGlydHkgd2hlbiBzaHV0dGluZyBkb3duCi0gICAgYm9vbGVhbiBzb3VyY2VEZWxldGVkID0gZmFsc2U7Ci0KLSAgICAvL1RoZSBzb3VyY2VDaGFuZ2VkIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBzYXZlIGZyb20gdGhlIG9sZSBjb21wb25lbnQKLSAgICAvL2NhbiBiZSB1c2VkIG9yIGlmIHRoZSBpbnB1dCBjaGFuZ2VkCi0gICAgYm9vbGVhbiBzb3VyY2VDaGFuZ2VkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgaGF2ZSBhbiBhY3RpdmUgY2xpZW50IHNvIHdlIGRvIG5vdAotICAgICAqIGRlYWN0aXZhdGUgbXVsdGlwbGUgdGltZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2xpZW50QWN0aXZlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgaGF2ZSBhY3RpdmF0ZWQgT0xFIG9yIG5vdCBhcyBzb21lIGFwcGxpY2F0aW9ucwotICAgICAqIHdpbGwgb25seSBhbGxvdyBzaW5nbGUgYWN0aXZhdGlvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG9sZUFjdGl2YXRlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9IG5ldyBJUGFydExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgICAgIGFjdGl2YXRlQ2xpZW50KHBhcnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgICAgIGRlYWN0aXZhdGVDbGllbnQocGFydCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRV9FUlJPUl9USVRMRSA9IE9sZU1lc3NhZ2VzCi0gICAgICAgICAgICAuZ2V0U3RyaW5nKCJPbGVFZGl0b3IuZXJyb3JTYXZpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9MRV9FWENFUFRJT05fVElUTEUgPSBPbGVNZXNzYWdlcwotICAgICAgICAgICAgLmdldFN0cmluZygiT2xlRWRpdG9yLm9sZUV4Y2VwdGlvblRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTEVfRVhDRVBUSU9OX01FU1NBR0UgPSBPbGVNZXNzYWdlcwotICAgICAgICAgICAgLmdldFN0cmluZygiT2xlRWRpdG9yLm9sZUV4Y2VwdGlvbk1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9MRV9DUkVBVEVfRVhDRVBUSU9OX01FU1NBR0UgPSBPbGVNZXNzYWdlcwotICAgICAgICAgICAgLmdldFN0cmluZygiT2xlRWRpdG9yLm9sZUNyZWF0aW9uRXhjZXB0aW9uTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9FUlJPUl9USVRMRSA9IE9sZU1lc3NhZ2VzCi0gICAgICAgICAgICAuZ2V0U3RyaW5nKCJPbGVFZGl0b3Iuc2F2aW5nVGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfRVJST1JfTUVTU0FHRSA9IE9sZU1lc3NhZ2VzCi0gICAgICAgICAgICAuZ2V0U3RyaW5nKCJPbGVFZGl0b3Iuc2F2aW5nTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBuZXcgb2xlIGVkaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2xlRWRpdG9yKCkgewotICAgICAgICAvL0RvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWN0aXZhdGVDbGllbnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICBpZiAocGFydCA9PSB0aGlzKSB7Ci0gICAgICAgICAgICBvbGVBY3RpdmF0ZSgpOwotICAgICAgICAgICAgdGhpcy5jbGllbnRBY3RpdmUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3JlYXRlUGFydENvbnRyb2wgbWV0aG9kIGNvbW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIC8vIENyZWF0ZSBhIGZyYW1lLgotICAgICAgICBjbGllbnRGcmFtZSA9IG5ldyBPbGVGcmFtZShwYXJlbnQsIFNXVC5DTElQX0NISUxEUkVOKTsKLSAgICAgICAgY2xpZW50RnJhbWUuc2V0QmFja2dyb3VuZChKRmFjZUNvbG9ycy5nZXRCYW5uZXJCYWNrZ3JvdW5kKGNsaWVudEZyYW1lCi0gICAgICAgICAgICAgICAgLmdldERpc3BsYXkoKSkpOwotCi0gICAgICAgIGluaXRpYWxpemVXb3JrYmVuY2hNZW51cygpOwotCi0gICAgICAgIGNyZWF0ZUNsaWVudFNpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGNsaWVudCBzaXRlIGZvciB0aGUgcmVjZWl2ZXIKLSAgICAgKi8KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDbGllbnRTaXRlKCkgewotICAgICAgICAvL0lmIHRoZXJlIHdhcyBhbiBPTEUgRXJyb3Igb3Igbm90aGluZyBoYXMgYmVlbiBjcmVhdGVkIHlldAotICAgICAgICBpZiAoY2xpZW50RnJhbWUgPT0gbnVsbCB8fCBjbGllbnRGcmFtZS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC8vIENyZWF0ZSBhIE9MRSBjbGllbnQgc2l0ZS4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsaWVudFNpdGUgPSBuZXcgT2xlQ2xpZW50U2l0ZShjbGllbnRGcmFtZSwgU1dULk5PTkUsIHNvdXJjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQotICAgICAgICAgICAgSVN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgV29ya2JlbmNoUGx1Z2luLlBJX1dPUktCRU5DSCwgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgT0xFX0NSRUFURV9FWENFUFRJT05fTUVTU0FHRSwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihudWxsLCBPTEVfRVhDRVBUSU9OX1RJVExFLCBlcnJvclN0YXR1cwotICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpLCBlcnJvclN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2xpZW50U2l0ZS5zZXRCYWNrZ3JvdW5kKEpGYWNlQ29sb3JzLmdldEJhbm5lckJhY2tncm91bmQoY2xpZW50RnJhbWUKLSAgICAgICAgICAgICAgICAuZ2V0RGlzcGxheSgpKSk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVhY3RpdmF0ZUNsaWVudChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIC8vQ2hlY2sgdGhlIGNsaWVudCBhY3RpdmUgZmxhZy4gU2V0IGl0IHRvIGZhbHNlIHdoZW4gd2UgaGF2ZSBkZWFjdGl2YXRlZAotICAgICAgICAvL3RvIHByZXZlbnQgbXVsdGlwbGUgZGUtYWN0aXZhdGlvbnMuCi0gICAgICAgIGlmIChwYXJ0ID09IHRoaXMgJiYgY2xpZW50QWN0aXZlKSB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50U2l0ZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNsaWVudFNpdGUuZGVhY3RpdmF0ZUluUGxhY2VDbGllbnQoKTsKLSAgICAgICAgICAgIHRoaXMuY2xpZW50QWN0aXZlID0gZmFsc2U7Ci0gICAgICAgICAgICB0aGlzLm9sZUFjdGl2YXRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cgd2l0aCB0aGUgc3VwcGxpZWQgdGl0bGUgYW5kIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIHRpdGxlCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzcGxheUVycm9yRGlhbG9nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgU2hlbGwgcGFyZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGdldENsaWVudFNpdGUoKSAhPSBudWxsKQotICAgICAgICAgICAgcGFyZW50ID0gZ2V0Q2xpZW50U2l0ZSgpLmdldFNoZWxsKCk7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFBhcnQjZGlzcG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICByZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2NhbiBkaXNwb3NlIHRoZSB0aXRsZSBpbWFnZSBiZWNhdXNlIGl0IHdhcyBjcmVhdGVkIGluIGluaXQKLSAgICAgICAgaWYgKG9sZVRpdGxlSW1hZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgb2xlVGl0bGVJbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBvbGVUaXRsZUltYWdlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRTaXRlKCkgIT0gbnVsbCAmJiBnZXRTaXRlKCkuZ2V0UGFnZSgpICE9IG51bGwpCi0gICAgICAgICAgICBnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoJUHJpbnQgdGhpcyBvYmplY3QncyBjb250ZW50cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvUHJpbnQoKSB7Ci0gICAgICAgIGlmIChjbGllbnRTaXRlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGNsaWVudFNpdGUuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50U2l0ZS5leGVjKE9MRS5PTEVDTURJRF9QUklOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9MRS5PTEVDTURFWEVDT1BUX1BST01QVFVTRVIsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgIC8vIG5vdGU6IHRvIGNoZWNrIGZvciBzdWNjZXNzOiBhYm92ZSA9PSBTV1RPTEUuU19PSwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTYXZlIHRoZSB2aWV3ZXIncyBjb250ZW50cyB0byB0aGUgc291cmNlIGZpbGUgc3lzdGVtIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIGlmIChjbGllbnRTaXRlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGNsaWVudFNpdGUuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotCi0gICAgICAgICAgICAgICAgLy9EbyBub3QgdHJ5IGFuZCB1c2UgdGhlIGNvbXBvbmVudCBwcm92aWRlZCBzYXZlIGlmIHRoZSBzb3VyY2UgaGFzCi0gICAgICAgICAgICAgICAgLy9jaGFuZ2VkIGluIEVjbGlwc2UKLSAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZUNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IGNsaWVudFNpdGUucXVlcnlTdGF0dXMoT0xFLk9MRUNNRElEX1NBVkUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdCAmIE9MRS5PTEVDTURGX0VOQUJMRUQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNsaWVudFNpdGUuZXhlYyhPTEUuT0xFQ01ESURfU0FWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0xFLk9MRUNNREVYRUNPUFRfUFJPTVBUVVNFUiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9MRS5TX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EbyBub3RoaW5nIG9uIGEgZmFpbGVkIHJlZnJlc2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUVycm9yRGlhbG9nKE9MRV9FWENFUFRJT05fVElUTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9MRV9FWENFUFRJT05fTUVTU0FHRSArIFN0cmluZy52YWx1ZU9mKHJlc3VsdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzYXZlRmlsZShzb3VyY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0RvIG5vdGhpbmcgb24gYSBmYWlsZWQgcmVmcmVzaAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvckRpYWxvZyhTQVZFX0VSUk9SX1RJVExFLCBTQVZFX0VSUk9SX01FU1NBR0UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNvdXJjZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglTYXZlIHRoZSB2aWV3ZXIncyBjb250ZW50cyBpbnRvIHRoZSBwcm92aWRlZCByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLSAgICAgICAgaWYgKGNsaWVudFNpdGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wID0gc2F2ZU5ld0ZpbGVPcGVyYXRpb24oKTsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBjbGllbnRTaXRlLmdldFNoZWxsKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaW50ZXJydXB0KSB7Ci0gICAgICAgICAgICAvL05vdGhpbmcgdG8gcmVzZXQgc28gZG8gbm90aGluZwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGludm9jYXRpb25FeGNlcHRpb24pIHsKLSAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBSRU5BTUVfRVJST1JfVElUTEUsCi0gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25FeGNlcHRpb24uZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoJQW5zd2VyIHNlbGYncyBjbGllbnQgc2l0ZQotICAgICAqCi0gICAgICoJQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUNsaWVudFNpdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2xlQ2xpZW50U2l0ZSBnZXRDbGllbnRTaXRlKCkgewotICAgICAgICByZXR1cm4gY2xpZW50U2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgdGhlIGZpbGUgc3lzdGVtIHJlcHJlc2VudGF0aW9uIG9mIHNlbGYncyBpbnB1dCBlbGVtZW50Ci0gICAgICoKLSAgICAgKglAcmV0dXJuIGphdmEuaW8uRmlsZQotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldFNvdXJjZUZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdvcmQoKSB7Ci0gICAgICAgIE9sZUF1dG9tYXRpb24gZGlzcEludGVyZmFjZSA9IG5ldyBPbGVBdXRvbWF0aW9uKGNsaWVudFNpdGUpOwotICAgICAgICAvLyBHZXQgQXBwbGljYXRpb24KLSAgICAgICAgaW50W10gYXBwSWQgPSBkaXNwSW50ZXJmYWNlCi0gICAgICAgICAgICAgICAgLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIkFwcGxpY2F0aW9uIiB9KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoYXBwSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgVmFyaWFudCBwVmFyUmVzdWx0ID0gZGlzcEludGVyZmFjZS5nZXRQcm9wZXJ0eShhcHBJZFswXSk7Ci0gICAgICAgICAgICBpZiAocFZhclJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT2xlQXV0b21hdGlvbiBhcHBsaWNhdGlvbiA9IHBWYXJSZXN1bHQuZ2V0QXV0b21hdGlvbigpOwotICAgICAgICAgICAgICAgIGludFtdIGRpc3BpZCA9IGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiRGlzcGxheVNjcm9sbEJhcnMiIH0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaWYgKGRpc3BpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFZhcmlhbnQgcmd2YXJnID0gbmV3IFZhcmlhbnQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLnNldFByb3BlcnR5KGRpc3BpZFswXSwgcmd2YXJnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXBwbGljYXRpb24uZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRpc3BJbnRlcmZhY2UuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yIHdoZW4gY3JlYXRlZCBmcm9tIHNjcmF0Y2guCi0gICAgICogCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHNvb24gYWZ0ZXIgcGFydCBjb25zdHJ1Y3Rpb24gYW5kIG1hcmtzIAotICAgICAqIHRoZSBzdGFydCBvZiB0aGUgZXh0ZW5zaW9uIGxpZmVjeWNsZS4gIEF0IHRoZSBlbmQgb2YgdGhlCi0gICAgICogZXh0ZW5zaW9uIGxpZmVjeWNsZSA8Y29kZT5zaHV0ZG93bjwvY29kZT4gd2lsbCBiZSBpbnZva2VkCi0gICAgICogdG8gdGVybWluYXRlIHRoZSBsaWZlY3ljbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFpbmVyIGFuIGludGVyZmFjZSBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBwYXJ0IGNvbnRhaW5lcgotICAgICAqIEBwYXJhbSBpbnB1dCBUaGUgaW5pdGlhbCBpbnB1dCBlbGVtZW50IGZvciB0aGUgZWRpdG9yLiAgSW4gbW9zdCBjYXNlcwotICAgICAqICAgIGl0IGlzIGFuIDxjb2RlPklGaWxlPC9jb2RlPiBidXQgb3RoZXIgdHlwZXMgYXJlIGFjY2VwdGFibGUuCi0gICAgICogQHNlZSBJV29ya2JlbmNoUGFydCNzaHV0ZG93bgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotICAgICAgICAgICAgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAJCi0gICAgCXZhbGlkYXRlUGF0aEVkaXRvcklucHV0KGlucHV0KTsKLQotICAgICAgICAvLyBTYXZlIGlucHV0LgotICAgICAgICBzZXRTaXRlKHNpdGUpOwotICAgICAgICBzZXRJbnB1dFdpdGhOb3RpZnkoaW5wdXQpOwotCi0gICAgICAgIC8vIFVwZGF0ZSB0aXRsZXMuCi0gICAgICAgIHNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0gICAgICAgIHNldFRpdGxlVG9vbFRpcChpbnB1dC5nZXRUb29sVGlwVGV4dCgpKTsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBpbnB1dC5nZXRJbWFnZURlc2NyaXB0b3IoKTsKLSAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgb2xlVGl0bGVJbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgICAgIHNldFRpdGxlSW1hZ2Uob2xlVGl0bGVJbWFnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMaXN0ZW4gZm9yIHBhcnQgYWN0aXZhdGlvbi4KLSAgICAgICAgc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBnaXZlbiBpbnB1dAotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgZWRpdG9yIGlucHV0IHRvIHZhbGlkYXRlCi0gICAgICogQHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiBpZiB0aGUgZWRpdG9yIGlucHV0IGlzIG5vdCBPSwotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVBhdGhFZGl0b3JJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENoZWNrIGlucHV0IHR5cGUuCi0gICAgICAgIGlmICghKGlucHV0IGluc3RhbmNlb2YgSVBhdGhFZGl0b3JJbnB1dCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oT2xlTWVzc2FnZXMuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiT2xlRWRpdG9yLmludmFsaWRJbnB1dCIsIG5ldyBPYmplY3RbXSB7IGlucHV0IH0pKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgSVBhdGggcGF0aD0gKChJUGF0aEVkaXRvcklucHV0KWlucHV0KS5nZXRQYXRoKCk7Ci0KLSAgICAgICAgLy9DYW5ub3QgY3JlYXRlIHRoaXMgd2l0aCBhIGZpbGUgYW5kIG5vIHBoeXNpY2FsIGxvY2F0aW9uCi0gICAgICAgIGlmIChwYXRoID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCAhKG5ldyBGaWxlKHBhdGgudG9PU1N0cmluZygpKS5leGlzdHMoKSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE9sZU1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbGVFZGl0b3Iubm9GaWxlSW5wdXQiLCBuZXcgT2JqZWN0W10geyBwYXRoLnRvT1NTdHJpbmcoKSB9KSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqCUluaXRpYWxpemUgdGhlIHdvcmtiZW5jaCBtZW51cyBmb3IgcHJvcGVyIG1lcmdpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplV29ya2JlbmNoTWVudXMoKSB7Ci0gICAgICAgIC8vSWYgdGhlcmUgd2FzIGFuIE9MRSBFcnJvciBvciBub3RoaW5nIGhhcyBiZWVuIGNyZWF0ZWQgeWV0Ci0gICAgICAgIGlmIChjbGllbnRGcmFtZSA9PSBudWxsIHx8IGNsaWVudEZyYW1lLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgLy8gR2V0IHRoZSBicm93c2VyIG1lbnUgYmFyLiAgSWYgb25lIGRvZXMgbm90IGV4aXN0IHRoZW4KLSAgICAgICAgLy8gY3JlYXRlIGl0LgotICAgICAgICBTaGVsbCBzaGVsbCA9IGNsaWVudEZyYW1lLmdldFNoZWxsKCk7Ci0gICAgICAgIE1lbnUgbWVudUJhciA9IHNoZWxsLmdldE1lbnVCYXIoKTsKLSAgICAgICAgaWYgKG1lbnVCYXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLSAgICAgICAgICAgIHNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTd2FwIHRoZSBmaWxlIGFuZCB3aW5kb3cgbWVudXMuCi0gICAgICAgIE1lbnVJdGVtW10gd2luZG93TWVudSA9IG5ldyBNZW51SXRlbVsxXTsKLSAgICAgICAgTWVudUl0ZW1bXSBmaWxlTWVudSA9IG5ldyBNZW51SXRlbVsxXTsKLSAgICAgICAgVmVjdG9yIGNvbnRhaW5lckl0ZW1zID0gbmV3IFZlY3RvcigpOwotCi0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVudUJhci5nZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNZW51SXRlbSBpdGVtID0gbWVudUJhci5nZXRJdGVtKGkpOwotICAgICAgICAgICAgU3RyaW5nIGlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChpdGVtLmdldERhdGEoKSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcikKLSAgICAgICAgICAgICAgICBpZCA9ICgoSU1lbnVNYW5hZ2VyKSBpdGVtLmdldERhdGEoKSkuZ2V0SWQoKTsKLSAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0ZJTEUpKQotICAgICAgICAgICAgICAgIGZpbGVNZW51WzBdID0gaXRlbTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGlkLmVxdWFscyhJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fV0lORE9XKSkKLSAgICAgICAgICAgICAgICB3aW5kb3dNZW51WzBdID0gaXRlbTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaXNBcHBsaWNhdGlvbk1lbnUoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckl0ZW1zLmFkZEVsZW1lbnQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1lbnVJdGVtW10gY29udGFpbmVyTWVudSA9IG5ldyBNZW51SXRlbVtjb250YWluZXJJdGVtcy5zaXplKCldOwotICAgICAgICBjb250YWluZXJJdGVtcy5jb3B5SW50byhjb250YWluZXJNZW51KTsKLSAgICAgICAgY2xpZW50RnJhbWUuc2V0RmlsZU1lbnVzKGZpbGVNZW51KTsKLSAgICAgICAgY2xpZW50RnJhbWUuc2V0Q29udGFpbmVyTWVudXMoY29udGFpbmVyTWVudSk7Ci0gICAgICAgIGNsaWVudEZyYW1lLnNldFdpbmRvd01lbnVzKHdpbmRvd01lbnUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNEaXJ0eSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLSAgICAgICAgLypSZXR1cm4gb25seSBpZiB3ZSBoYXZlIGEgY2xpZW50U2l0ZSB3aGljaCBpcyBkaXJ0eSAKLSAgICAgICAgIGFzIHRoaXMgY2FuIGJlIGFza2VkIGJlZm9yZSBhbnl0aGluZyBpcyBvcGVuZWQqLwotICAgICAgICByZXR1cm4gdGhpcy5jbGllbnRTaXRlICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyogCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICpTaW5jZSB3ZSBkb24ndCBrbm93IHdoZW4gYSBjaGFuZ2UgaGFzIGJlZW4gbWFkZSwgYWx3YXlzIGFuc3dlciB0cnVlCi0gICAgICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd2FzIG5vdCBvcGVuZWQgYW5kIDxjb2RlPnRydWU8L2NvZGU+IAotICAgICAqIG9ubHkgaWYgaXQgaXMgZGlydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDbGllbnRTaXRlKCkgIT0gbnVsbCAmJiBpc0RpcnR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSB0aGUgc3VwcGxpZWQgZmlsZSB1c2luZyB0aGUgU1dUIEFQSS4KLSAgICAgKiBAcGFyYW0gZmlsZSBqYXZhLmlvLkZpbGUKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzYXZlIHdhcyBzdWNjZXNzZnVsCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNhdmVGaWxlKEZpbGUgZmlsZSkgewotCi0gICAgICAgIEZpbGUgdGVtcEZpbGUgPSBuZXcgRmlsZShmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIi50bXAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaWxlLnJlbmFtZVRvKHRlbXBGaWxlKTsKLSAgICAgICAgYm9vbGVhbiBzYXZlZCA9IGZhbHNlOwotICAgICAgICBpZiAoT0xFLmlzT2xlRmlsZShmaWxlKSB8fCB1c2VzU3RvcmFnZUZpbGVzKGNsaWVudFNpdGUuZ2V0UHJvZ3JhbUlEKCkpKSB7Ci0gICAgICAgICAgICBzYXZlZCA9IGNsaWVudFNpdGUuc2F2ZShmaWxlLCB0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNhdmVkID0gY2xpZW50U2l0ZS5zYXZlKGZpbGUsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzYXZlZCkgewotICAgICAgICAgICAgLy8gc2F2ZSB3YXMgc3VjY2Vzc2Z1bCBzbyBkaXNjYXJkIHRoZSBiYWNrdXAKLSAgICAgICAgICAgIHRlbXBGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gc2F2ZSBmYWlsZWQgc28gcmVzdG9yZSB0aGUgYmFja3VwCi0gICAgICAgIHRlbXBGaWxlLnJlbmFtZVRvKGZpbGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSB0aGUgbmV3IEZpbGUgdXNpbmcgdGhlIGNsaWVudCBzaXRlLgotICAgICAqIEByZXR1cm4gV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gc2F2ZU5ld0ZpbGVPcGVyYXRpb24oKSB7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIFNhdmVBc0RpYWxvZyBkaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGNsaWVudEZyYW1lLmdldFNoZWxsKCkpOwotICAgICAgICAgICAgICAgIElGaWxlIHNGaWxlID0gUmVzb3VyY2VVdGlsLmdldEZpbGUoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlhbG9nLnNldE9yaWdpbmFsRmlsZShzRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIElQYXRoIG5ld1BhdGggPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdQYXRoID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbmV3UGF0aC5zZWdtZW50KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aCA9IG5ld1BhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aCA9IHByb2plY3QuZ2V0TG9jYXRpb24oKS5hcHBlbmQobmV3UGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIG5ld0ZpbGUgPSBuZXdQYXRoLnRvRmlsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVGaWxlKG5ld0ZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZpbGUgbmV3UmVzb3VyY2UgPSByZXNvdXJjZS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWxlRm9yTG9jYXRpb24obmV3UGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1Jlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2hhbmdlZChuZXdSZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Jlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvckRpYWxvZyhTQVZFX0VSUk9SX1RJVExFLCBTQVZFX0VSUk9SX01FU1NBR0UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV3RmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgLy9EbyBub3QgdGFrZSBmb2N1cwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2Ugb2xlIGFjdGl2ZSBzbyB0aGF0IHRoZSBjb250cm9scyBhcmUgcmVuZGVyZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9sZUFjdGl2YXRlKCkgewotICAgICAgICAvL0lmIHRoZXJlIHdhcyBhbiBPTEUgRXJyb3Igb3Igbm90aGluZyBoYXMgYmVlbiBjcmVhdGVkIHlldAotICAgICAgICBpZiAoY2xpZW50U2l0ZSA9PSBudWxsIHx8IGNsaWVudEZyYW1lID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCBjbGllbnRGcmFtZS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKCFvbGVBY3RpdmF0ZWQpIHsKLSAgICAgICAgICAgIGNsaWVudFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9TSE9XKTsKLSAgICAgICAgICAgIG9sZUFjdGl2YXRlZCA9IHRydWU7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvZ0lkID0gY2xpZW50U2l0ZS5nZXRQcm9ncmFtSUQoKTsKLSAgICAgICAgICAgIGlmIChwcm9nSWQgIT0gbnVsbCAmJiBwcm9nSWQuc3RhcnRzV2l0aCgiV29yZC5Eb2N1bWVudCIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBoYW5kbGVXb3JkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjc2V0SW5wdXRXaXRoTm90aWZ5KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dFdpdGhOb3RpZnkoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0gICAgCWlmIChpbnB1dCBpbnN0YW5jZW9mIElQYXRoRWRpdG9ySW5wdXQpCi0gICAgCQlzb3VyY2UgPSBuZXcgRmlsZSgoKElQYXRoRWRpdG9ySW5wdXQpaW5wdXQpLmdldFBhdGgoKS50b09TU3RyaW5nKCkpOwotICAgIAkKLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotICAgICAgICAJaWYgKHJlc291cmNlID09IG51bGwpCi0gICAgICAgIAkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VMaXN0ZW5lcik7Ci0gICAgICAgIAlyZXNvdXJjZSA9ICgoSUZpbGVFZGl0b3JJbnB1dClpbnB1dCkuZ2V0RmlsZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlTGlzdGVuZXIpOwotICAgICAgICAJcmVzb3VyY2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzdXBlci5zZXRJbnB1dFdpdGhOb3RpZnkoaW5wdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBpZiBpdCBpcyBvbmUgb2YgdGhlIGtub3duIHR5cGVzIHRoYXQgdXNlIE9MRSBTdG9yYWdlLgotICAgICAqIEBwYXJhbSBwcm9nSUQgdGhlIHR5cGUgdG8gdGVzdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgb25lIG9mIHRoZSBrbm93biB0eXBlcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXNlc1N0b3JhZ2VGaWxlcyhTdHJpbmcgcHJvZ0lEKSB7Ci0gICAgICAgIHJldHVybiAocHJvZ0lEICE9IG51bGwgJiYgKHByb2dJRC5zdGFydHNXaXRoKCJXb3JkLiIsIDApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB8fCBwcm9nSUQuc3RhcnRzV2l0aCgiTVNHcmFwaCIsIDApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB8fCBwcm9nSUQuc3RhcnRzV2l0aCgiUG93ZXJQb2ludCIsIDApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfHwgcHJvZ0lELnN0YXJ0c1dpdGgoIkV4Y2VsIiwgMCkpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBzb3VyY2UgaGFzIGNoYW5nZWQgdG8gdGhlIG5ld0ZpbGUuIFVwZGF0ZQotICAgICAqIGVkaXRvcnMgYW5kIHNldCBhbnkgcmVxdWlyZWQgZmxhZ3MKLSAgICAgKiBAcGFyYW0gbmV3RmlsZSBUaGUgZmlsZSB0byBnZXQgdGhlIG5ldyBjb250ZW50cyBmcm9tLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzb3VyY2VDaGFuZ2VkKElGaWxlIG5ld0ZpbGUpIHsKLQotICAgICAgICBGaWxlRWRpdG9ySW5wdXQgbmV3SW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KG5ld0ZpbGUpOwotICAgICAgICBzZXRJbnB1dFdpdGhOb3RpZnkobmV3SW5wdXQpOwotICAgICAgICBzb3VyY2VDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgc2V0UGFydE5hbWUobmV3SW5wdXQuZ2V0TmFtZSgpKTsKLQotICAgIH0KLQotICAgIC8qIAotICAgICAqIFNlZSBJRWRpdG9yUGFydC5pc1NhdmVPbkNsb3NlTmVlZGVkKCkgCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYXZlT25DbG9zZU5lZWRlZCgpIHsKLSAgICAgICAgcmV0dXJuICFzb3VyY2VEZWxldGVkICYmIHN1cGVyLmlzU2F2ZU9uQ2xvc2VOZWVkZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3N0cyB0aGUgdXBkYXRlIGNvZGUgImJlaGluZCIgdGhlIHJ1bm5pbmcgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHJ1bm5hYmxlIHRoZSB1cGRhdGUgY29kZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGUoUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICBJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IHdvcmtiZW5jaC5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0gICAgICAgIGlmICh3aW5kb3dzICE9IG51bGwgJiYgd2luZG93cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSB3aW5kb3dzWzBdLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgZGlzcGxheS5hc3luY0V4ZWMocnVubmFibGUpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZWRpdG9yc3VwcG9ydC93aW4zMi9PbGVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZWRpdG9yc3VwcG9ydC93aW4zMi9PbGVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDAzNmE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2VkaXRvcnN1cHBvcnQvd2luMzIvT2xlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5lZGl0b3JzdXBwb3J0LndpbjMyOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aGljaCBoZWxwcyBtYW5hZ2luZyBtZXNzYWdlcwotICovCi1wdWJsaWMgY2xhc3MgT2xlTWVzc2FnZXMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9CVU5ETEUgPSAib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZWRpdG9yc3VwcG9ydC53aW4zMi5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUKLSAgICAgICAgICAgIC5nZXRCdW5kbGUoUkVTT1VSQ0VfQlVORExFKTsKLQotICAgIHByaXZhdGUgT2xlTWVzc2FnZXMoKSB7Ci0gICAgICAgIC8vIHByZXZlbnQgaW5zdGFudGlhdGlvbiBvZiBjbGFzcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIHJlc291cmNlIG5hbWUKLSAgICAgKiBAcGFyYW0gYXJncwotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgYXJndW1lbnRzCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4ga2V5IGluIHRoZSByZXNvdXJjZSBidW5kbGUuIElmCi0gICAgICogdGhlcmUgaXNuJ3QgYW55IHZhbHVlIHVuZGVyIHRoZSBnaXZlbiBrZXksIHRoZSBrZXkgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIHJlc291cmNlIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBrZXk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4ga2V5IGluIHRoZSByZXNvdXJjZSBidW5kbGUuIElmCi0gICAgICogdGhlcmUgaXNuJ3QgYW55IHZhbHVlIHVuZGVyIHRoZSBnaXZlbiBrZXksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHBhcmFtIGRlZgotICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIGRlZikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWY7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9lZGl0b3JzdXBwb3J0L3dpbjMyL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9lZGl0b3JzdXBwb3J0L3dpbjMyL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZDhhZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZWRpdG9yc3VwcG9ydC93aW4zMi9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1PbGVFZGl0b3IucmVuYW1lVGl0bGUgPSBSZW5hbWUgRmlsZQotT2xlRWRpdG9yLnJlbmFtZU1lc3NhZ2UgPSBFbnRlciBuZXcgZmlsZSBuYW1lOgotT2xlRWRpdG9yLmVycm9yU2F2aW5nID0gRXhjZXB0aW9uIHNhdmluZyBmaWxlCi1PbGVFZGl0b3Iub2xlRXhjZXB0aW9uVGl0bGUgPSBPTEUgRXhjZXB0aW9uCi1PbGVFZGl0b3Iub2xlRXhjZXB0aW9uTWVzc2FnZSA9IE9MRSBFcnJvciBTYXZpbmcgCi1PbGVFZGl0b3Iub2xlQ3JlYXRpb25FeGNlcHRpb25NZXNzYWdlID0gT0xFIEVycm9yIE9wZW5pbmcgCi1PbGVFZGl0b3Iuc2F2aW5nVGl0bGUgPSBFcnJvciBTYXZpbmcKLU9sZUVkaXRvci5zYXZpbmdNZXNzYWdlID0gQ291bGQgbm90IHNhdmUgCi1PbGVFZGl0b3IuaW52YWxpZElucHV0ID0gSW52YWxpZCBJbnB1dDogezB9LiAgSW5wdXQgbXVzdCBhZGFwdCB0byBJRmlsZQotT2xlRWRpdG9yLm5vRmlsZUlucHV0ID0gSW52YWxpZCBJbnB1dDogezB9LiAgSW5wdXQgbXVzdCBhbHNvIGV4aXN0IGluIHRoZSBmaWxlc3lzdGVtCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5Ly5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OTVkYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuaGVscDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamZhY2U8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnN3dDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkud29ya2JlbmNoPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjdlNmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotI01vbiBPY3QgMjQgMTU6MDc6MzAgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkZmRkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUdWUgT2N0IDE4IDE1OjE2OjUyIEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmphdmFkb2M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGdldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyY29tbWVudCIgbmFtZVw9ImdldHRlcmNvbW1lbnQiPi8qKlxuICogQHJldHVybiBSZXR1cm5zIHRoZSAke2JhcmVfZmllbGRfbmFtZX0uXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyY29tbWVudCIgbmFtZVw9InNldHRlcmNvbW1lbnQiPi8qKlxuICogQHBhcmFtICR7cGFyYW19IFRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yY29tbWVudCIgbmFtZVw9ImNvbnN0cnVjdG9yY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpbGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCI+LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIENvcHlyaWdodCAoYykgJHt5ZWFyfSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcbiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHBcOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuICpcbiAqIENvbnRyaWJ1dG9yc1w6XG4gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9ImZhbHNlIiBjb250ZXh0XD0idHlwZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgdHlwZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMudHlwZWNvbW1lbnQiIG5hbWVcPSJ0eXBlY29tbWVudCI+LyoqXG4gKiBAc2luY2UgMy4yXG4gKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWVsZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGZpZWxkcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWVsZGNvbW1lbnQiIG5hbWVcPSJmaWVsZGNvbW1lbnQiPi8qKlxuICogXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG5vbi1vdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJvdmVycmlkZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5vdmVycmlkZWNvbW1lbnQiIG5hbWVcPSJvdmVycmlkZWNvbW1lbnQiPi8qIChub24tSmF2YWRvYylcbiAqICR7c2VlX3RvX292ZXJyaWRkZW59XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im5ld3R5cGVfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubmV3dHlwZSIgbmFtZVw9Im5ld3R5cGUiPiR7ZmlsZWNvbW1lbnR9XG4ke3BhY2thZ2VfZGVjbGFyYXRpb259XG5cbiR7dHlwZWNvbW1lbnR9XG4ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgbWV0aG9kIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5Ij4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2xhc3Nib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjbGFzcyB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jbGFzc2JvZHkiIG5hbWVcPSJjbGFzc2JvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJpbnRlcmZhY2Vib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBpbnRlcmZhY2UgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuaW50ZXJmYWNlYm9keSIgbmFtZVw9ImludGVyZmFjZWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJlbnVtYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgZW51bSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5lbnVtYm9keSIgbmFtZVw9ImVudW1ib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iYW5ub3RhdGlvbmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGFubm90YXRpb24gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuYW5ub3RhdGlvbmJvZHkiIG5hbWVcPSJhbm5vdGF0aW9uYm9keSI+XG48L3RlbXBsYXRlPjwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjllZjI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNUdWUgTm92IDIzIDExOjIxOjI3IEVTVCAyMDA0Ci1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTc5MjJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5Ci1CdW5kbGUtVmVyc2lvbjogMy4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlszLjAuMCw0LjAuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudC1jb21wYXRpYmlsaXR5Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1NTY5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXNvdXJjZS5jb21wYXRpYmlsaXR5Lmphcj1zcmMvCi1zcmMuaW5jbHVkZXM9YWJvdXQuaHRtbAotYmluLmluY2x1ZGVzID0gZnJhZ21lbnQueG1sLFwKLSAgICAgICAgICAgICAgIGZyYWdtZW50LWNvbXBhdGliaWxpdHkucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHkuamFyLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eS9mcmFnbWVudC1jb21wYXRpYmlsaXR5LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5L2ZyYWdtZW50LWNvbXBhdGliaWxpdHkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2NzU4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5L2ZyYWdtZW50LWNvbXBhdGliaWxpdHkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLWZyYWdtZW50TmFtZT1Xb3JrYmVuY2ggQ29tcGF0aWJpbGl0eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvQ29tcGF0aWJsZVdvcmtiZW5jaFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL0NvbXBhdGlibGVXb3JrYmVuY2hQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYjM3ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvQ29tcGF0aWJsZVdvcmtiZW5jaFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogSW50ZXJuYWwgY2xhc3MgdXNlZCBpbiBwcm92aWRpbmcgaW5jcmVhc2VkIGJpbmFyeSBjb21wYXRpYmlsaXR5IGZvciBwcmUtMy4wCi0gKiBwbHVnLWlucy4gVGhpcyBkZWNsYXJhdGlvbiBtYXNrcyB0aGUgZW1wdHkgY2xhc3Mgb2YgdGhlIHNhbWUgbmFtZSBkZWNsYXJlZCBpbgotICogdGhlIFdvcmtiZW5jaCBwcm9wZXIuIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBJV29ya2JlbmNoUGFnZSB0aGF0IGV4aXN0ZWQgaW4KLSAqIDIuMSBidXQgd2VyZSByZW1vdmVkIGluIDMuMCBiZWNhdXNlIHRoZXkgcmVmZXJlbmNlZCByZXNvdXJjZSBBUEkuCi0gKiA8cD4KLSAqIFBsdWctaW5zIHNob3VsZCBub3QgcmVmZXIgdG8gdGhpcyB0eXBlIG9yIGl0cyBjb250YWluaW5nIGZyYWdtZW50IGZyb20gdGhlaXIKLSAqIGNsYXNzIHBhdGguIEl0IGlzIGludGVuZGVkIG9ubHkgdG8gcHJvdmlkZSBiaW5hcnkgY29tcGF0aWJpbGl0eSBmb3IgcHJlLTMuMAotICogcGx1Zy1pbnMsIGFuZCBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgYXQgZGV2ZWxvcG1lbnQgdGltZS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJsZVdvcmtiZW5jaFBhZ2UgaW1wbGVtZW50cyBJQ29tcGF0aWJsZVdvcmtiZW5jaFBhZ2UgewotCi0gICAgLyoqCi0gICAgICogb3BlbkVkaXRvcihJRmlsZSkgaXMgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFBhZ2UgaW4gMi4xLiBUaGlzIG1ldGhvZCB3YXMKLSAgICAgKiByZW1vdmVkIGluIDMuMCBiZWNhdXNlIGl0IHJlZmVyZW5jZXMgcmVzb3VyY2UgQVBJLgotICAgICAqLwotICAgIHB1YmxpYyBJRWRpdG9yUGFydCBvcGVuRWRpdG9yKElGaWxlIGlucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICAvLyBpbnZva2Ugb3JnLmVjbGlwc2UudWkuaWRlLklERS5vcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlLCBJRmlsZSwKLSAgICAgICAgLy8gYm9vbGVhbik7Ci0gICAgICAgIHJldHVybiBvcGVuRWRpdG9yKG5ldyBDbGFzc1tdIHsgSVdvcmtiZW5jaFBhZ2UuY2xhc3MsIElGaWxlLmNsYXNzLAotICAgICAgICAgICAgICAgIGJvb2xlYW4uY2xhc3MgfSwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB0aGlzLCBpbnB1dCwgbmV3IEJvb2xlYW4odHJ1ZSkgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogb3BlbkVkaXRvcihJRmlsZSxTdHJpbmcpIGlzIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hQYWdlIGluIDIuMS4gVGhpcwotICAgICAqIG1ldGhvZCB3YXMgcmVtb3ZlZCBpbiAzLjAgYmVjYXVzZSBpdCByZWZlcmVuY2VzIHJlc291cmNlIEFQSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUVkaXRvclBhcnQgb3BlbkVkaXRvcihJRmlsZSBpbnB1dCwgU3RyaW5nIGVkaXRvcklEKQotICAgICAgICAgICAgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG9wZW5FZGl0b3IoaW5wdXQsIGVkaXRvcklELCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBvcGVuRWRpdG9yKElGaWxlLFN0cmluZyxib29sZWFuKSBpcyBkZWNsYXJlZCBvbiBJV29ya2JlbmNoUGFnZSBpbiAyLjEuCi0gICAgICogVGhpcyBtZXRob2Qgd2FzIHJlbW92ZWQgaW4gMy4wIGJlY2F1c2UgaXQgcmVmZXJlbmNlcyByZXNvdXJjZSBBUEkuCi0gICAgICovCi0gICAgcHVibGljIElFZGl0b3JQYXJ0IG9wZW5FZGl0b3IoSUZpbGUgaW5wdXQsIFN0cmluZyBlZGl0b3JJRCwgYm9vbGVhbiBhY3RpdmF0ZSkKLSAgICAgICAgICAgIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoKElXb3JrYmVuY2hQYWdlKSB0aGlzKS5vcGVuRWRpdG9yKGdldEZpbGVFZGl0b3JJbnB1dChpbnB1dCksCi0gICAgICAgICAgICAgICAgZWRpdG9ySUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG9wZW5FZGl0b3IoSU1hcmtlcikgaXMgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFBhZ2UgaW4gMi4xLiBUaGlzIG1ldGhvZCB3YXMKLSAgICAgKiByZW1vdmVkIGluIDMuMCBiZWNhdXNlIGl0IHJlZmVyZW5jZXMgcmVzb3VyY2UgQVBJLgotICAgICAqLwotICAgIHB1YmxpYyBJRWRpdG9yUGFydCBvcGVuRWRpdG9yKElNYXJrZXIgbWFya2VyKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gb3BlbkVkaXRvcihtYXJrZXIsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG9wZW5FZGl0b3IoSU1hcmtlcixib29sZWFuKSBpcyBkZWNsYXJlZCBvbiBJV29ya2JlbmNoUGFnZSBpbiAyLjEuIFRoaXMKLSAgICAgKiBtZXRob2Qgd2FzIHJlbW92ZWQgaW4gMy4wIGJlY2F1c2UgaXQgcmVmZXJlbmNlcyByZXNvdXJjZSBBUEkuCi0gICAgICovCi0gICAgcHVibGljIElFZGl0b3JQYXJ0IG9wZW5FZGl0b3IoSU1hcmtlciBtYXJrZXIsIGJvb2xlYW4gYWN0aXZhdGUpCi0gICAgICAgICAgICB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICAvLyBpbnZva2Ugb3JnLmVjbGlwc2UudWkuaWRlLklERS5vcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlLCBJTWFya2VyLAotICAgICAgICAvLyBib29sZWFuKTsKLSAgICAgICAgcmV0dXJuIG9wZW5FZGl0b3IobmV3IENsYXNzW10geyBJV29ya2JlbmNoUGFnZS5jbGFzcywgSU1hcmtlci5jbGFzcywKLSAgICAgICAgICAgICAgICBib29sZWFuLmNsYXNzIH0sIG5ldyBPYmplY3RbXSB7IHRoaXMsIG1hcmtlciwKLSAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihhY3RpdmF0ZSkgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogb3BlblN5c3RlbUVkaXRvcihJRmlsZSkgaXMgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFBhZ2UgaW4gMi4xLiBUaGlzIG1ldGhvZAotICAgICAqIHdhcyByZW1vdmVkIGluIDMuMCBiZWNhdXNlIGl0IHJlZmVyZW5jZXMgcmVzb3VyY2UgQVBJLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9wZW5TeXN0ZW1FZGl0b3IoSUZpbGUgZmlsZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgKChJV29ya2JlbmNoUGFnZSkgdGhpcykub3BlbkVkaXRvcihnZXRGaWxlRWRpdG9ySW5wdXQoZmlsZSksCi0gICAgICAgICAgICAgICAgSUVkaXRvclJlZ2lzdHJ5LlNZU1RFTV9FWFRFUk5BTF9FRElUT1JfSUQpOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBzdXBwb3J0OiBVc2UgcmVmbGVjdGlvbiBmb3IgdGhlIGZvbGxvd2luZyBjb2RlIHBhdHRlcm46Ci0gICAgICogbmV3IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0KGZpbGUpIFRoZSBjbGFzcyBGaWxlRWRpdG9ySW5wdXQKLSAgICAgKiBpcyBmb3VuZCBpbiB0aGUgb3JnLmVjbGlwc2UudWkuaWRlIHBsdWctaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBJRWRpdG9ySW5wdXQgZ2V0RmlsZUVkaXRvcklucHV0KElGaWxlIGZpbGUpCi0gICAgICAgICAgICB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBJUGx1Z2luRGVzY3JpcHRvciBkZXNjID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKQotICAgICAgICAgICAgICAgIC5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS51aS5pZGUiKTsgLy8kTk9OLU5MUy0xJAkJCi0gICAgICAgIEV4Y2VwdGlvbiBwcm9ibGVtOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBkZXNjLmdldFBsdWdpbkNsYXNzTG9hZGVyKCkubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjbGF6egotICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10geyBJRmlsZS5jbGFzcyB9KTsKLSAgICAgICAgICAgIHJldHVybiAoSUVkaXRvcklucHV0KSBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgZmlsZSB9KTsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcHJvYmxlbSA9IGU7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcHJvYmxlbSA9IGU7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBwcm9ibGVtID0gZTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHByb2JsZW0gPSBlOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHByb2JsZW0gPSBlOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHByb2JsZW0gPSBlOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHByb2JsZW0gPSBlOwotICAgICAgICB9Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cygKLSAgICAgICAgICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgIFdvcmtiZW5jaFBsdWdpbi5QSV9XT1JLQkVOQ0gsCi0gICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAib3BlbkVkaXRvcigpIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBmYWlsZWQgLSBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpIiwgcHJvYmxlbSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgV29ya2JlbmNoUGx1Z2luLmxvZyhzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGF0dXMpOwotICAgICAgICB0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oc3RhdHVzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEltcGxlbWVudGF0aW9uIHN1cHBvcnQ6IFVzZSByZWZsZWN0aW9uIHRvIGludm9rZSB0aGUgYXBwcm9wcmlhdGUgc3RhdGljCi0gICAgICogb3BlbkVkaXRvciguLi4pIG1ldGhvZCBvbiBJREUgVGhlIElERSBjbGFzcyBpcyBmb3VuZCBpbiB0aGUKLSAgICAgKiBvcmcuZWNsaXBzZS51aS5pZGUgcGx1Zy1pbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIElFZGl0b3JQYXJ0IG9wZW5FZGl0b3IoQ2xhc3NbXSBhcmdUeXBlcywgT2JqZWN0W10gYXJncykKLSAgICAgICAgICAgIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIElQbHVnaW5EZXNjcmlwdG9yIGRlc2MgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpCi0gICAgICAgICAgICAgICAgLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLnVpLmlkZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFRocm93YWJsZSBwcm9ibGVtOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBkZXNjLmdldFBsdWdpbkNsYXNzTG9hZGVyKCkubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UudWkuaWRlLklERSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJvcGVuRWRpdG9yIiwgYXJnVHlwZXMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gKElFZGl0b3JQYXJ0KSBtZXRob2QuaW52b2tlKG51bGwsIGFyZ3MpOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBwcm9ibGVtID0gZTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBwcm9ibGVtID0gZTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHByb2JsZW0gPSBlOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcHJvYmxlbSA9IGU7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcHJvYmxlbSA9IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcHJvYmxlbSA9IGU7Ci0gICAgICAgIH0KLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKAotICAgICAgICAgICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgV29ya2JlbmNoUGx1Z2luLlBJX1dPUktCRU5DSCwKLSAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICJvcGVuRWRpdG9yKCkgY29tcGF0aWJpbGl0eSBzdXBwb3J0IGZhaWxlZCAtIElERS5vcGVuRWRpdG9yKCkiLCBwcm9ibGVtKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBXb3JrYmVuY2hQbHVnaW4ubG9nKHN0YXR1cy5nZXRNZXNzYWdlKCksIHN0YXR1cyk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbihzdGF0dXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL0lDb21wYXRpYmxlV29ya2JlbmNoUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvSUNvbXBhdGlibGVXb3JrYmVuY2hQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjE5OTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvSUNvbXBhdGlibGVXb3JrYmVuY2hQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbnRlcm5hbCBpbnRlcmZhY2UgdXNlZCBpbiBwcm92aWRpbmcgaW5jcmVhc2VkIGJpbmFyeSBjb21wYXRpYmlsaXR5IGZvcgotICogcHJlLTMuMCBwbHVnLWlucy4gVGhpcyBkZWNsYXJhdGlvbiBtYXNrcyB0aGUgZW1wdHkgaW50ZXJmYWNlIG9mIHRoZSBzYW1lIG5hbWUKLSAqIGRlY2xhcmVkIGluIHRoZSBXb3JrYmVuY2ggcHJvcGVyLiBUaGlzIGludGVyZmFjZSBkZWNsYXJlcyBJV29ya2JlbmNoUGFnZSB0aGF0Ci0gKiBleGlzdGVkIGluIDIuMSBidXQgd2VyZSByZW1vdmVkIGluIDMuMCBiZWNhdXNlIHRoZXkgcmVmZXJlbmNlZCByZXNvdXJjZSBBUEkuCi0gKiA8cD4KLSAqIFBsdWctaW5zIHNob3VsZCBub3QgcmVmZXIgdG8gdGhpcyB0eXBlIG9yIGl0cyBjb250YWluaW5nIGZyYWdtZW50IGZyb20gdGhlaXIKLSAqIGNsYXNzIHBhdGguIEl0IGlzIGludGVuZGVkIG9ubHkgdG8gcHJvdmlkZSBiaW5hcnkgY29tcGF0aWJpbGl0eSBmb3IgcHJlLTMuMAotICogcGx1Zy1pbnMsIGFuZCBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgYXQgZGV2ZWxvcG1lbnQgdGltZS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wYXRpYmxlV29ya2JlbmNoUGFnZSB7Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlZGl0b3Igb24gdGhlIGdpdmVuIGZpbGUgcmVzb3VyY2UuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBwYWdlIGFscmVhZHkgaGFzIGFuIGVkaXRvciBvcGVuIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgZWRpdG9yCi0gICAgICogaXMgYWN0aXZhdGVkOyBvdGhlcndpc2UsIGEgbmV3IGVkaXRvciBpcyBvcGVuZWQuCi0gICAgICogPHA+Ci0gICAgICogPHA+Ci0gICAgICogQW4gYXBwcm9wcmlhdGUgZWRpdG9yIGZvciB0aGUgaW5wdXQgaXMgZGV0ZXJtaW5lZCB1c2luZyBhIG11bHRpc3RlcAotICAgICAqIHByb2Nlc3MuCi0gICAgICogPC9wPgotICAgICAqIDxvbD4KLSAgICAgKiA8bGk+VGhlIHdvcmtiZW5jaCBlZGl0b3IgcmVnaXN0cnkgaXMgY29uc3VsdGVkIHRvIGRldGVybWluZSBpZiBhbiBlZGl0b3IKLSAgICAgKiBleHRlbnNpb24gaGFzIGJlZW4gcmVnaXN0ZXJlZCBmb3IgdGhlIGZpbGUgdHlwZS4gSWYgc28sIGFuIGluc3RhbmNlIG9mCi0gICAgICogdGhlIGVkaXRvciBleHRlbnNpb24gaXMgb3BlbmVkIG9uIHRoZSBmaWxlLiBTZWUKLSAgICAgKiA8Y29kZT5JRWRpdG9yUmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihJRmlsZSk8L2NvZGU+LgotICAgICAqIDxsaT5OZXh0LCB0aGUgbmF0aXZlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBiZSBjb25zdWx0ZWQgdG8gZGV0ZXJtaW5lIGlmCi0gICAgICogYSBuYXRpdmUgZWRpdG9yIGV4aXN0cyBmb3IgdGhlIGZpbGUgdHlwZS4gSWYgc28sIGEgbmV3IHByb2Nlc3MgaXMgc3RhcnRlZAotICAgICAqIGFuZCB0aGUgbmF0aXZlIGVkaXRvciBpcyBvcGVuZWQgb24gdGhlIGZpbGUuCi0gICAgICogPGxpPklmIGFsbCBlbHNlIGZhaWxzIHRoZSBmaWxlIHdpbGwgYmUgb3BlbmVkIGluIGEgZGVmYXVsdCB0ZXh0IGVkaXRvci4KLSAgICAgKiA8L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dAotICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gZWRpdAotICAgICAqIEByZXR1cm4gYW4gb3BlbiBhbmQgYWN0aXZlIGVkaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYSBzeXN0ZW0KLSAgICAgKiAgICAgICAgIGVkaXRvciB3YXMgb3BlbmVkCi0gICAgICogQGV4Y2VwdGlvbiBQYXJ0SW5pdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBlZGl0b3IgY291bGQgbm90IGJlIGluaXRpYWxpemVkCi0gICAgICogQGRlcHJlY2F0ZWQgSW4gMy4wIHRoaXMgcmVzb3VyY2Utc3BlY2lmaWMgbWV0aG9kIG1vdmVkIGZyb20gdGhpcwotICAgICAqICAgICAgICAgICAgIGludGVyZmFjZSB0bwotICAgICAqICAgICAgICAgICAgIDxjb2RlPm9yZy5lY2xpcHNlLnVpLmlkZS5JREUub3BlbkVkaXRvcihJV29ya2JlbmNoUGFnZSxJRmlsZSk8L2NvZGU+LgotICAgICAqICAgICAgICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBhdCBkZXZlbG9wbWVudCB0aW1lLiBTZWUKLSAgICAgKiAgICAgICAgICAgICB0aGUgY2xhc3MgY29tbWVudCBmb3IgbW9yZSBkZXRhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyBJRWRpdG9yUGFydCBvcGVuRWRpdG9yKElGaWxlIGlucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlZGl0b3Igb24gdGhlIGdpdmVuIGZpbGUgcmVzb3VyY2UuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBwYWdlIGFscmVhZHkgaGFzIGFuIGVkaXRvciBvcGVuIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgZWRpdG9yCi0gICAgICogaXMgYnJvdWdodCB0byBmcm9udDsgb3RoZXJ3aXNlLCBhIG5ldyBlZGl0b3IgaXMgb3BlbmVkLiBJZgotICAgICAqIDxjb2RlPmFjdGl2YXRlID09IHRydWU8L2NvZGU+IHRoZSBlZGl0b3Igd2lsbCBiZSBhY3RpdmF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIGVkaXRvciB0eXBlIGlzIGRldGVybWluZWQgYnkgbWFwcGluZyA8Y29kZT5lZGl0b3JJZDwvY29kZT4gdG8gYW4KLSAgICAgKiBlZGl0b3IgZXh0ZW5zaW9uIHJlZ2lzdGVyZWQgd2l0aCB0aGUgd29ya2JlbmNoLiBBbiBlZGl0b3IgaWQgaXMgcGFzc2VkCi0gICAgICogcmF0aGVyIHRoYW4gYW4gZWRpdG9yIG9iamVjdCB0byBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGNyZWF0aW9uIG9mIG1vcmUKLSAgICAgKiB0aGFuIG9uZSBlZGl0b3IgZm9yIHRoZSBzYW1lIGlucHV0LiBJdCBhbHNvIGd1YXJhbnRlZXMgYSBjb25zaXN0ZW50Ci0gICAgICogbGlmZWN5Y2xlIGZvciBlZGl0b3JzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgY3JlYXRlZCBieSB0aGUgdXNlcgotICAgICAqIG9yIHJlc3RvcmVkIGZyb20gc2F2ZWQgZGF0YS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGlucHV0Ci0gICAgICogICAgICAgICAgICB0aGUgZmlsZSB0byBlZGl0Ci0gICAgICogQHBhcmFtIGVkaXRvcklkCi0gICAgICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGVkaXRvciBleHRlbnNpb24gdG8gdXNlIG9yIG51bGwKLSAgICAgKiBAcGFyYW0gYWN0aXZhdGUKLSAgICAgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBlZGl0b3Igd2lsbCBiZSBhY3RpdmF0ZWQKLSAgICAgKiBAcmV0dXJuIGFuIG9wZW4gYW5kIGFjdGl2ZSBlZGl0b3IKLSAgICAgKiBAZXhjZXB0aW9uIFBhcnRJbml0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGVkaXRvciBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQKLSAgICAgKiBAZGVwcmVjYXRlZCBJbiAzLjAgdGhpcyByZXNvdXJjZS1zcGVjaWZpYyBtZXRob2QgbW92ZWQgZnJvbSB0aGlzCi0gICAgICogICAgICAgICAgICAgaW50ZXJmYWNlIHRvCi0gICAgICogICAgICAgICAgICAgPGNvZGU+b3JnLmVjbGlwc2UudWkuaWRlLklERS5vcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlLElGaWxlLFN0cmluZyxib29sZWFuKTwvY29kZT4uCi0gICAgICogICAgICAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkIGF0IGRldmVsb3BtZW50IHRpbWUuIFNlZQotICAgICAqICAgICAgICAgICAgIHRoZSBjbGFzcyBjb21tZW50IGZvciBtb3JlIGRldGFpbHMuCi0gICAgICovCi0gICAgcHVibGljIElFZGl0b3JQYXJ0IG9wZW5FZGl0b3IoSUZpbGUgaW5wdXQsIFN0cmluZyBlZGl0b3JJZCwgYm9vbGVhbiBhY3RpdmF0ZSkKLSAgICAgICAgICAgIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIE9wZW5zIGFuIGVkaXRvciBvbiB0aGUgZ2l2ZW4gZmlsZSByZXNvdXJjZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGlzIHBhZ2UgYWxyZWFkeSBoYXMgYW4gZWRpdG9yIG9wZW4gb24gdGhlIHRhcmdldCBvYmplY3QgdGhhdCBlZGl0b3IKLSAgICAgKiBpcyBhY3RpdmF0ZWQ7IG90aGVyd2lzZSwgYSBuZXcgZWRpdG9yIGlzIG9wZW5lZC4KLSAgICAgKiA8cD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZWRpdG9yIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSBtYXBwaW5nIDxjb2RlPmVkaXRvcklkPC9jb2RlPiB0byBhbgotICAgICAqIGVkaXRvciBleHRlbnNpb24gcmVnaXN0ZXJlZCB3aXRoIHRoZSB3b3JrYmVuY2guIEFuIGVkaXRvciBpZCBpcyBwYXNzZWQKLSAgICAgKiByYXRoZXIgdGhhbiBhbiBlZGl0b3Igb2JqZWN0IHRvIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgY3JlYXRpb24gb2YgbW9yZQotICAgICAqIHRoYW4gb25lIGVkaXRvciBmb3IgdGhlIHNhbWUgaW5wdXQuIEl0IGFsc28gZ3VhcmFudGVlcyBhIGNvbnNpc3RlbnQKLSAgICAgKiBsaWZlY3ljbGUgZm9yIGVkaXRvcnMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBjcmVhdGVkIGJ5IHRoZSB1c2VyCi0gICAgICogb3IgcmVzdG9yZWQgZnJvbSBzYXZlZCBkYXRhLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWRpdG9ySWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgZWRpdG9yIGV4dGVuc2lvbiB0byB1c2UKLSAgICAgKiBAcGFyYW0gaW5wdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGVkaXQKLSAgICAgKiBAcmV0dXJuIGFuIG9wZW4gYW5kIGFjdGl2ZSBlZGl0b3IKLSAgICAgKiBAZXhjZXB0aW9uIFBhcnRJbml0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGVkaXRvciBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQKLSAgICAgKiBAZGVwcmVjYXRlZCBJbiAzLjAgdGhpcyByZXNvdXJjZS1zcGVjaWZpYyBtZXRob2QgbW92ZWQgZnJvbSB0aGlzCi0gICAgICogICAgICAgICAgICAgaW50ZXJmYWNlIHRvCi0gICAgICogICAgICAgICAgICAgPGNvZGU+b3JnLmVjbGlwc2UudWkuaWRlLklERS5vcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlLElGaWxlLFN0cmluZyk8L2NvZGU+LgotICAgICAqICAgICAgICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBhdCBkZXZlbG9wbWVudCB0aW1lLiBTZWUKLSAgICAgKiAgICAgICAgICAgICB0aGUgY2xhc3MgY29tbWVudCBmb3IgbW9yZSBkZXRhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyBJRWRpdG9yUGFydCBvcGVuRWRpdG9yKElGaWxlIGlucHV0LCBTdHJpbmcgZWRpdG9ySWQpCi0gICAgICAgICAgICB0aHJvd3MgUGFydEluaXRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlZGl0b3Igb24gdGhlIGZpbGUgcmVzb3VyY2Ugb2YgdGhlIGdpdmVuIG1hcmtlci4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGlzIHBhZ2UgYWxyZWFkeSBoYXMgYW4gZWRpdG9yIG9wZW4gb24gdGhlIHRhcmdldCBvYmplY3QgdGhhdCBlZGl0b3IKLSAgICAgKiBpcyBhY3RpdmF0ZWQ7IG90aGVyd2lzZSwgYSBuZXcgZWRpdG9yIGlzIG9wZW5lZC4gVGhlIGN1cnNvciBhbmQgc2VsZWN0aW9uCi0gICAgICogc3RhdGUgb2YgdGhlIGVkaXRvciBpcyB0aGVuIHVwZGF0ZWQgZnJvbSBpbmZvcm1hdGlvbiByZWNvcmRlZCBpbiB0aGUKLSAgICAgKiBtYXJrZXIuCi0gICAgICogPHA+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1hcmtlciBjb250YWlucyBhbiA8Y29kZT5FRElUT1JfSURfQVRUUjwvY29kZT4gYXR0cmlidXRlIHRoZQotICAgICAqIGF0dHJpYnV0ZSB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBlZGl0b3IgdHlwZSB0byBiZSBvcGVuZWQuCi0gICAgICogSWYgbm90LCB0aGUgcmVnaXN0ZXJlZCBlZGl0b3IgZm9yIHRoZSBtYXJrZXIgcmVzb3VyY2Ugd2lsbCBiZSB1c2VkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFya2VyCi0gICAgICogICAgICAgICAgICB0aGUgbWFya2VyIHRvIG9wZW4KLSAgICAgKiBAcmV0dXJuIGFuIG9wZW4gYW5kIGFjdGl2ZSBlZGl0b3IsIG9yIG51bGwgaWYgYSBzeXN0ZW0gZWRpdG9yIHdhcyBvcGVuZWQKLSAgICAgKiBAZXhjZXB0aW9uIFBhcnRJbml0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGVkaXRvciBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQKLSAgICAgKiBAc2VlIElFZGl0b3JQYXJ0I2dvdG9NYXJrZXIKLSAgICAgKiBAZGVwcmVjYXRlZCBJbiAzLjAgdGhpcyByZXNvdXJjZS1zcGVjaWZpYyBtZXRob2QgbW92ZWQgZnJvbSB0aGlzCi0gICAgICogICAgICAgICAgICAgaW50ZXJmYWNlIHRvCi0gICAgICogICAgICAgICAgICAgPGNvZGU+b3JnLmVjbGlwc2UudWkuaWRlLklERS5vcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlLElNYXJrZXIpPC9jb2RlPi4KLSAgICAgKiAgICAgICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgYXQgZGV2ZWxvcG1lbnQgdGltZS4gU2VlCi0gICAgICogICAgICAgICAgICAgdGhlIGNsYXNzIGNvbW1lbnQgZm9yIG1vcmUgZGV0YWlscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUVkaXRvclBhcnQgb3BlbkVkaXRvcihJTWFya2VyIG1hcmtlcikgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYW4gZWRpdG9yIG9uIHRoZSBmaWxlIHJlc291cmNlIG9mIHRoZSBnaXZlbiBtYXJrZXIuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBwYWdlIGFscmVhZHkgaGFzIGFuIGVkaXRvciBvcGVuIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgZWRpdG9yCi0gICAgICogaXMgYnJvdWdodCB0byBmcm9udDsgb3RoZXJ3aXNlLCBhIG5ldyBlZGl0b3IgaXMgb3BlbmVkLiBJZgotICAgICAqIDxjb2RlPmFjdGl2YXRlID09IHRydWU8L2NvZGU+IHRoZSBlZGl0b3Igd2lsbCBiZSBhY3RpdmF0ZWQuIFRoZSBjdXJzb3IKLSAgICAgKiBhbmQgc2VsZWN0aW9uIHN0YXRlIG9mIHRoZSBlZGl0b3IgYXJlIHRoZW4gdXBkYXRlZCBmcm9tIGluZm9ybWF0aW9uCi0gICAgICogcmVjb3JkZWQgaW4gdGhlIG1hcmtlci4KLSAgICAgKiA8cD4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWFya2VyIGNvbnRhaW5zIGFuIDxjb2RlPkVESVRPUl9JRF9BVFRSPC9jb2RlPiBhdHRyaWJ1dGUgdGhlCi0gICAgICogYXR0cmlidXRlIHZhbHVlIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGVkaXRvciB0eXBlIHRvIGJlIG9wZW5lZC4KLSAgICAgKiBJZiBub3QsIHRoZSByZWdpc3RlcmVkIGVkaXRvciBmb3IgdGhlIG1hcmtlciByZXNvdXJjZSB3aWxsIGJlIHVzZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXJrZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXJrZXIgdG8gb3BlbgotICAgICAqIEBwYXJhbSBhY3RpdmF0ZQotICAgICAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGVkaXRvciB3aWxsIGJlIGFjdGl2YXRlZAotICAgICAqIEByZXR1cm4gYW4gb3BlbiBlZGl0b3IsIG9yIG51bGwgaWYgYSBzeXN0ZW0gZWRpdG9yIHdhcyBvcGVuZWQKLSAgICAgKiBAZXhjZXB0aW9uIFBhcnRJbml0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGVkaXRvciBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQKLSAgICAgKiBAc2VlIElFZGl0b3JQYXJ0I2dvdG9NYXJrZXIKLSAgICAgKiBAZGVwcmVjYXRlZCBJbiAzLjAgdGhpcyByZXNvdXJjZS1zcGVjaWZpYyBtZXRob2QgbW92ZWQgZnJvbSB0aGlzCi0gICAgICogICAgICAgICAgICAgaW50ZXJmYWNlIHRvCi0gICAgICogICAgICAgICAgICAgPGNvZGU+b3JnLmVjbGlwc2UudWkuaWRlLklERS5vcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlLElNYXJrZXIsYm9vbGVhbik8L2NvZGU+LgotICAgICAqICAgICAgICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBhdCBkZXZlbG9wbWVudCB0aW1lLiBTZWUKLSAgICAgKiAgICAgICAgICAgICB0aGUgY2xhc3MgY29tbWVudCBmb3IgbW9yZSBkZXRhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyBJRWRpdG9yUGFydCBvcGVuRWRpdG9yKElNYXJrZXIgbWFya2VyLCBib29sZWFuIGFjdGl2YXRlKQotICAgICAgICAgICAgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYW4gb3BlcmF0aW5nIHN5c3RlbSBlZGl0b3Igb24gYSBnaXZlbiBmaWxlLiBPbmNlIG9wZW4sIHRoZQotICAgICAqIHdvcmtiZW5jaCBoYXMgbm8ga25vd2xlZGdlIG9mIHRoZSBlZGl0b3Igb3IgdGhlIHN0YXRlIG9mIHRoZSBmaWxlIGJlaW5nCi0gICAgICogZWRpdGVkLiBVc2VycyBhcmUgZXhwZWN0ZWQgdG8gcGVyZm9ybSBhICJMb2NhbCBSZWZyZXNoIiBmcm9tIHRoZQotICAgICAqIHdvcmtiZW5jaCB1c2VyIGludGVyZmFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGVkaXQKLSAgICAgKiBAZXhjZXB0aW9uIFBhcnRJbml0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGVkaXRvciBjb3VsZCBub3QgYmUgb3BlbmVkLgotICAgICAqIEBkZXByZWNhdGVkIEluIDMuMCB0aGlzIHJlc291cmNlLXNwZWNpZmljIG1ldGhvZCB3YXMgcmVtb3ZlZC4gVXNlCi0gICAgICogICAgICAgICAgICAgPGNvZGU+b3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBJRWRpdG9yUmVnaXN0cnkuU1lTVEVNX0VYVEVSTkFMX0VESVRPUl9JRCk8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgaW5zdGVhZC4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkIGF0IGRldmVsb3BtZW50Ci0gICAgICogICAgICAgICAgICAgdGltZS4gU2VlIHRoZSBjbGFzcyBjb21tZW50IGZvciBtb3JlIGRldGFpbHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3BlblN5c3RlbUVkaXRvcihJRmlsZSBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gvRWNsaXBzZSBVSS9vcmcvZWNsaXBzZS91aS9JQWN0aW9uQmFycy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gvRWNsaXBzZSBVSS9vcmcvZWNsaXBzZS91aS9JQWN0aW9uQmFycy5qYXZhCmluZGV4IDM0NTA2OTkuLjlkNTU1YmUgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoL0VjbGlwc2UgVUkvb3JnL2VjbGlwc2UvdWkvSUFjdGlvbkJhcnMuamF2YQorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC9FY2xpcHNlIFVJL29yZy9lY2xpcHNlL3VpL0lBY3Rpb25CYXJzLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5zZXJ2aWNlcy5JU2VydmljZUxvY2F0b3I7CiAKIC8qKgogICogVXNlZCBieSBhIHBhcnQgdG8gYWNjZXNzIGl0cyBtZW51LCB0b29sYmFyLCBhbmQgc3RhdHVzIGxpbmUgbWFuYWdlcnMuICAKQEAgLTg2LDE3ICs4NywyNSBAQAogICAgICAqIEByZXR1cm4gdGhlIG1lbnUgbWFuYWdlcgogICAgICAqLwogICAgIHB1YmxpYyBJTWVudU1hbmFnZXIgZ2V0TWVudU1hbmFnZXIoKTsKKyAgICAKKyAgICAvKioKKwkgKiBSZXR1cm5zIHRoZSBzZXJ2aWNlIGxvY2F0b3IgZm9yIHRoZXNlIGFjdGlvbiBiYXJzLiBUaGUgbG9jYXRvciBpcyBmb3VuZAorCSAqIGJ5IGxvb2tpbmcgbG9jYWxseSwgYW5kIHRoZW4gYXNjZW5kaW5nIHRoZSBhY3Rpb24gYmFyIGhpZXJhcmNoeS4KKwkgKiAKKwkgKiBAcmV0dXJuIFRoZSBzZXJ2aWNlIGxvY2F0b3I7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBJU2VydmljZUxvY2F0b3IgZ2V0U2VydmljZUxvY2F0b3IoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXR1cyBsaW5lIG1hbmFnZXIuCi0gICAgICogPHA+Ci0gICAgICogTm90ZTogQ2xpZW50cyB3aG8gYWRkIG9yIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSByZXR1cm5lZCBzdGF0dXMgbGluZSBtYW5hZ2VyIAotICAgICAqIGFyZSByZXNwb25zaWJsZSBmb3IgY2FsbGluZyA8Y29kZT51cGRhdGVBY3Rpb25CYXJzPC9jb2RlPiBzbyB0aGF0IHRoZSBjaGFuZ2VzCi0gICAgICogY2FuIGJlIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgd29ya2JlbmNoLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHN0YXR1cyBsaW5lIG1hbmFnZXIKLSAgICAgKi8KKwkgKiBSZXR1cm5zIHRoZSBzdGF0dXMgbGluZSBtYW5hZ2VyLgorCSAqIDxwPgorCSAqIE5vdGU6IENsaWVudHMgd2hvIGFkZCBvciByZW1vdmUgaXRlbXMgZnJvbSB0aGUgcmV0dXJuZWQgc3RhdHVzIGxpbmUKKwkgKiBtYW5hZ2VyIGFyZSByZXNwb25zaWJsZSBmb3IgY2FsbGluZyA8Y29kZT51cGRhdGVBY3Rpb25CYXJzPC9jb2RlPiBzbworCSAqIHRoYXQgdGhlIGNoYW5nZXMgY2FuIGJlIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgd29ya2JlbmNoLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgbGluZSBtYW5hZ2VyCisJICovCiAgICAgcHVibGljIElTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcigpOwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC9FY2xpcHNlIFVJL29yZy9lY2xpcHNlL3VpL1N1YkFjdGlvbkJhcnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoL0VjbGlwc2UgVUkvb3JnL2VjbGlwc2UvdWkvU3ViQWN0aW9uQmFycy5qYXZhCmluZGV4IDU0YjQ0ZGQuLmNmYzE0MjggMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoL0VjbGlwc2UgVUkvb3JnL2VjbGlwc2UvdWkvU3ViQWN0aW9uQmFycy5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoL0VjbGlwc2UgVUkvb3JnL2VjbGlwc2UvdWkvU3ViQWN0aW9uQmFycy5qYXZhCkBAIC0zNSwxOSArMzUsMjYgQEAKICAqIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPklBY3Rpb25CYXJzPC9jb2RlPiBpbnRlcmZhY2UuCiAgKi8KIHB1YmxpYyBjbGFzcyBTdWJBY3Rpb25CYXJzIGV4dGVuZHMgRXZlbnRNYW5hZ2VyIGltcGxlbWVudHMgSUFjdGlvbkJhcnMgewotCXByaXZhdGUgSUFjdGlvbkJhcnMgcGFyZW50OwotCi0JcHJpdmF0ZSBib29sZWFuIGFjdGl2ZSA9IGZhbHNlOworCS8qKgorCSAqIFByb3BlcnR5IGNvbnN0YW50IGZvciBjaGFuZ2VzIHRvIGFjdGlvbiBoYW5kbGVycy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0FDVElPTl9IQU5ETEVSUyA9ICJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5hY3Rpb25IYW5kbGVycyI7IC8vJE5PTi1OTFMtMSQKIAogCXByaXZhdGUgTWFwIGFjdGlvbkhhbmRsZXJzOwogCisJcHJpdmF0ZSBib29sZWFuIGFjdGlvbkhhbmRsZXJzQ2hhbmdlZDsKKworCS8qKgorCSAqIEEgbWFwIG9mIGhhbmRsZXIgYWN0aXZhdGlvbnMgaW5kZXhlZCBieSBhY3Rpb24gaWQuIFRoaXMgdmFsdWUgaXMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gYWN0aXZhdGlvbnMuCisJICovCisJcHJpdmF0ZSBNYXAgYWN0aXZhdGlvbnNCeUFjdGlvbklkOworCisJcHJpdmF0ZSBib29sZWFuIGFjdGl2ZSA9IGZhbHNlOworCiAJcHJpdmF0ZSBTdWJNZW51TWFuYWdlciBtZW51TWdyOwogCi0JcHJpdmF0ZSBTdWJTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWdyOwotCi0JcHJpdmF0ZSBTdWJUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyOwotCi0JcHJpdmF0ZSBib29sZWFuIGFjdGlvbkhhbmRsZXJzQ2hhbmdlZDsKKwlwcml2YXRlIElBY3Rpb25CYXJzIHBhcmVudDsKIAogCS8qKgogCSAqIEEgc2VydmljZSBsb2NhdG9yIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFjdGlvbiBiYXIuIFRoaXMgdmFsdWUgaXMgbmV2ZXIKQEAgLTU2LDE2ICs2MywyMCBAQAogCSAqLwogCXByaXZhdGUgZmluYWwgSVNlcnZpY2VMb2NhdG9yIHNlcnZpY2VMb2NhdG9yOwogCi0JLyoqCi0JICogQSBtYXAgb2YgaGFuZGxlciBhY3RpdmF0aW9ucyBpbmRleGVkIGJ5IGFjdGlvbiBpZC4gVGhpcyB2YWx1ZSBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBhY3RpdmF0aW9ucy4KLQkgKi8KLQlwcml2YXRlIE1hcCBhY3RpdmF0aW9uc0J5QWN0aW9uSWQ7CisJcHJpdmF0ZSBTdWJTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWdyOworCisJcHJpdmF0ZSBTdWJUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyOwogCiAJLyoqCi0JICogUHJvcGVydHkgY29uc3RhbnQgZm9yIGNoYW5nZXMgdG8gYWN0aW9uIGhhbmRsZXJzLgorCSAqIENvbnN0cnVjdCBhIG5ldyA8Y29kZT5TdWJBY3Rpb25CYXJzPC9jb2RlPiBvYmplY3QuIFRoZSBzZXJ2aWNlIGxvY2F0b3IKKwkgKiB3aWxsIHNpbXBseSBiZSB0aGUgc2VydmljZSBsb2NhdG9yIG9mIHRoZSBwYXJlbnQuCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBvZiB0aGlzIGFjdGlvbiBiYXI7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQUNUSU9OX0hBTkRMRVJTID0gIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLmFjdGlvbkhhbmRsZXJzIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBTdWJBY3Rpb25CYXJzKGZpbmFsIElBY3Rpb25CYXJzIHBhcmVudCkgeworCQl0aGlzKHBhcmVudCwgbnVsbCk7CisJfQogCiAJLyoqCiAJICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5TdWJBY3Rpb25CYXJzPC9jb2RlPi4KQEAgLTc4LDYgKzg5LDEwIEBACiAJICovCiAJcHVibGljIFN1YkFjdGlvbkJhcnMoZmluYWwgSUFjdGlvbkJhcnMgcGFyZW50LAogCQkJZmluYWwgSVNlcnZpY2VMb2NhdG9yIHNlcnZpY2VMb2NhdG9yKSB7CisJCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGUgcGFyZW50IGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCiAJCXRoaXMucGFyZW50ID0gcGFyZW50OwogCQl0aGlzLnNlcnZpY2VMb2NhdG9yID0gc2VydmljZUxvY2F0b3I7CiAJfQpAQCAtMTE0LDYgKzEyOSwxNCBAQAogCX0KIAogCS8qKgorCSAqIFNldHMgdGhlIGFjdGl2ZSBmbGFnLiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSB1bmxlc3MKKwkgKiB0aGV5IGFyZSBvdmVycmlkaW5nIHRoZSBzZXRBY3RpdmUoKSBtZXRob2QuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgYmFzaWNTZXRBY3RpdmUoYm9vbGVhbiBhY3RpdmUpIHsKKwkJdGhpcy5hY3RpdmUgPSBhY3RpdmU7CisJfQorCisJLyoqCiAJICogQ2xlYXIgdGhlIGdsb2JhbCBhY3Rpb24gaGFuZGxlcnMuCiAJICovCiAJcHVibGljIHZvaWQgY2xlYXJHbG9iYWxBY3Rpb25IYW5kbGVycygpIHsKQEAgLTEyMiw3ICsxNDUsOCBAQAogCQkJYWN0aW9uSGFuZGxlcnNDaGFuZ2VkID0gdHJ1ZTsKIAogCQkJLy8gQ2xlYW4gdXAgdGhlIGFjdGl2YXRpb25zLgotCQkJZmluYWwgSUhhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSAoSUhhbmRsZXJTZXJ2aWNlKSBzZXJ2aWNlTG9jYXRvcgorCQkJZmluYWwgSVNlcnZpY2VMb2NhdG9yIGxvY2F0b3IgPSBnZXRTZXJ2aWNlTG9jYXRvcigpOworCQkJZmluYWwgSUhhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSAoSUhhbmRsZXJTZXJ2aWNlKSBsb2NhdG9yCiAJCQkJCS5nZXRTZXJ2aWNlKElIYW5kbGVyU2VydmljZS5jbGFzcyk7CiAJCQlmaW5hbCBJdGVyYXRvciBhY3RpdmF0aW9uSXRyID0gYWN0aXZhdGlvbnNCeUFjdGlvbklkLnZhbHVlcygpCiAJCQkJCS5pdGVyYXRvcigpOwpAQCAtMTk3LDYgKzIyMSwxOSBAQAogCX0KIAogCS8qKgorCSAqIE5vdGlmaWVzIGFueSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIGlmIHRoZSBnbG9iYWwgYWN0aW9uIGhhbmRsZXJzIGhhdmUKKwkgKiBjaGFuZ2VkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZmlyZUFjdGlvbkhhbmRsZXJzQ2hhbmdlZCgpIHsKKwkJaWYgKGFjdGlvbkhhbmRsZXJzQ2hhbmdlZCkgeworCQkJLy8gRG9lc24ndCBhY3R1YWxseSBwYXNzIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMKKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZShuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBQX0FDVElPTl9IQU5ETEVSUywKKwkJCQkJbnVsbCwgbnVsbCkpOworCQkJYWN0aW9uSGFuZGxlcnNDaGFuZ2VkID0gZmFsc2U7CisJCX0KKwl9CisKKwkvKioKIAkgKiBOb3RpZmllcyBhbnkgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyB0aGF0IGEgcHJvcGVydHkgaGFzIGNoYW5nZWQuIE9ubHkKIAkgKiBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgogCSAqIApAQCAtMjEzLDE5ICsyNTAsNiBAQAogCX0KIAogCS8qKgotCSAqIE5vdGlmaWVzIGFueSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIGlmIHRoZSBnbG9iYWwgYWN0aW9uIGhhbmRsZXJzIGhhdmUKLQkgKiBjaGFuZ2VkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFjdGlvbkhhbmRsZXJzQ2hhbmdlZCgpIHsKLQkJaWYgKGFjdGlvbkhhbmRsZXJzQ2hhbmdlZCkgewotCQkJLy8gRG9lc24ndCBhY3R1YWxseSBwYXNzIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBQX0FDVElPTl9IQU5ETEVSUywKLQkJCQkJbnVsbCwgbnVsbCkpOwotCQkJYWN0aW9uSGFuZGxlcnNDaGFuZ2VkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKIAkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWFuYWdlciBpcyBjdXJyZW50bHkgYWN0aXZlIG9yIG5vdC4KIAkgKi8KIAlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBnZXRBY3RpdmUoKSB7CkBAIC0yNzUsNiArMjk5LDE0IEBACiAJCXJldHVybiBwYXJlbnQ7CiAJfQogCisJcHVibGljIGZpbmFsIElTZXJ2aWNlTG9jYXRvciBnZXRTZXJ2aWNlTG9jYXRvcigpIHsKKwkJaWYgKHNlcnZpY2VMb2NhdG9yICE9IG51bGwpIHsKKwkJCXJldHVybiBzZXJ2aWNlTG9jYXRvcjsKKwkJfQorCisJCXJldHVybiBwYXJlbnQuZ2V0U2VydmljZUxvY2F0b3IoKTsKKwl9CisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBzdGF0dXMgbGluZSBtYW5hZ2VyLiBJZiBpdGVtcyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZQogCSAqIG1hbmFnZXIgYmUgc3VyZSB0byBjYWxsIDxjb2RlPnVwZGF0ZUFjdGlvbkJhcnM8L2NvZGU+LgpAQCAtMzEyLDEzICszNDQsNiBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzdWIgdG9vbGJhciBtYW5hZ2VyIGhhcyBiZWVuIGNyZWF0ZWQgeWV0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzU3ViVG9vbEJhck1hbmFnZXJDcmVhdGVkKCkgewotCQlyZXR1cm4gdG9vbEJhck1nciAhPSBudWxsOwotCX0KLQotCS8qKgogCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzdWIgc3RhdHVzIGxpbmUgbWFuYWdlciBoYXMgYmVlbiBjcmVhdGVkIHlldC4KIAkgKi8KIAlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1N1YlN0YXR1c0xpbmVNYW5hZ2VyQ3JlYXRlZCgpIHsKQEAgLTMyNiw2ICszNTEsMTMgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3ViIHRvb2xiYXIgbWFuYWdlciBoYXMgYmVlbiBjcmVhdGVkIHlldC4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1N1YlRvb2xCYXJNYW5hZ2VyQ3JlYXRlZCgpIHsKKwkJcmV0dXJuIHRvb2xCYXJNZ3IgIT0gbnVsbDsKKwl9CisKKwkvKioKIAkgKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgdGFyZ2V0IHBhcnQgZm9yIHRoZSBhY3Rpb24gYmFycyBoYXMgY2hhbmdlZC4KIAkgKi8KIAlwdWJsaWMgdm9pZCBwYXJ0Q2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7CkBAIC0zNDMsMTQgKzM3NSw2IEBACiAJfQogCiAJLyoqCi0JICogU2V0cyB0aGUgYWN0aXZlIGZsYWcuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5IHVubGVzcwotCSAqIHRoZXkgYXJlIG92ZXJyaWRpbmcgdGhlIHNldEFjdGl2ZSgpIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBiYXNpY1NldEFjdGl2ZShib29sZWFuIGFjdGl2ZSkgewotCQl0aGlzLmFjdGl2ZSA9IGFjdGl2ZTsKLQl9Ci0KLQkvKioKIAkgKiBBY3RpdmF0ZSAvIGRlYWN0aXZhdGUgdGhlIGNvbnRyaWJ1dGlvbnMuCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gc2V0KSB7CkBAIC0zNzUsNiArMzk5LDcgQEAKIAkgKiAgICAgICAgICAgIG1heSBiZSBwYXNzZWQgdG8gZGVyZWdpc3RlciBhIGhhbmRsZXIuCiAJICovCiAJcHVibGljIHZvaWQgc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihTdHJpbmcgYWN0aW9uSUQsIElBY3Rpb24gaGFuZGxlcikgeworCQlmaW5hbCBJU2VydmljZUxvY2F0b3IgbG9jYXRvciA9IGdldFNlcnZpY2VMb2NhdG9yKCk7CiAJCWlmIChoYW5kbGVyICE9IG51bGwpIHsKIAkJCS8vIFVwZGF0ZSB0aGUgYWN0aW9uIGhhbmRsZXJzLgogCQkJaWYgKGFjdGlvbkhhbmRsZXJzID09IG51bGwpCkBAIC0zODIsNyArNDA3LDcgQEAKIAkJCWFjdGlvbkhhbmRsZXJzLnB1dChhY3Rpb25JRCwgaGFuZGxlcik7CiAKIAkJCS8vIFVwZGF0ZSB0aGUgaGFuZGxlciBhY3RpdmF0aW9ucy4KLQkJCWZpbmFsIElIYW5kbGVyU2VydmljZSBzZXJ2aWNlID0gKElIYW5kbGVyU2VydmljZSkgc2VydmljZUxvY2F0b3IKKwkJCWZpbmFsIElIYW5kbGVyU2VydmljZSBzZXJ2aWNlID0gKElIYW5kbGVyU2VydmljZSkgbG9jYXRvcgogCQkJCQkuZ2V0U2VydmljZShJSGFuZGxlclNlcnZpY2UuY2xhc3MpOwogCQkJaWYgKGFjdGl2YXRpb25zQnlBY3Rpb25JZCA9PSBudWxsKSB7CiAJCQkJYWN0aXZhdGlvbnNCeUFjdGlvbklkID0gbmV3IEhhc2hNYXAoKTsKQEAgLTM5OCwxMCArNDIzLDEwIEBACiAJCQl9CiAKIAkJCS8vIEFkZCBhIG1hcHBpbmcgZnJvbSB0aGlzIGFjdGlvbiBpZCB0byB0aGUgY29tbWFuZCBpZC4KLQkJCWZpbmFsIElBY3Rpb25Db21tYW5kTWFwcGluZ1NlcnZpY2UgbWFwcGluZ1NlcnZpY2UgPSAoSUFjdGlvbkNvbW1hbmRNYXBwaW5nU2VydmljZSkgc2VydmljZUxvY2F0b3IKKwkJCWZpbmFsIElBY3Rpb25Db21tYW5kTWFwcGluZ1NlcnZpY2UgbWFwcGluZ1NlcnZpY2UgPSAoSUFjdGlvbkNvbW1hbmRNYXBwaW5nU2VydmljZSkgbG9jYXRvcgogCQkJCQkuZ2V0U2VydmljZShJQWN0aW9uQ29tbWFuZE1hcHBpbmdTZXJ2aWNlLmNsYXNzKTsKIAkJCWZpbmFsIFN0cmluZyBjb21tYW5kSWQgPSBtYXBwaW5nU2VydmljZS5nZXRDb21tYW5kSWQoYWN0aW9uSUQpOwotCQkJCisKIAkJCWlmIChjb21tYW5kSWQgIT0gbnVsbCkgewogCQkJCS8vIFJlZ2lzdGVyIHRoaXMgYXMgYSBoYW5kbGVyIHdpdGggdGhlIGdpdmVuIGRlZmluaXRpb24gaWQuCiAJCQkJZmluYWwgSUhhbmRsZXIgYWN0aW9uSGFuZGxlciA9IG5ldyBBY3Rpb25IYW5kbGVyKGhhbmRsZXIpOwpAQCAtNDE1LDcgKzQ0MCw3IEBACiAJCQkJYWN0aW9uSGFuZGxlcnMucmVtb3ZlKGFjdGlvbklEKTsKIAogCQkJLy8gUmVtb3ZlIHRoZSBoYW5kbGVyIGFjdGl2YXRpb24uCi0JCQlmaW5hbCBJSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IChJSGFuZGxlclNlcnZpY2UpIHNlcnZpY2VMb2NhdG9yCisJCQlmaW5hbCBJSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IChJSGFuZGxlclNlcnZpY2UpIGxvY2F0b3IKIAkJCQkJLmdldFNlcnZpY2UoSUhhbmRsZXJTZXJ2aWNlLmNsYXNzKTsKIAkJCWlmIChhY3RpdmF0aW9uc0J5QWN0aW9uSWQgIT0gbnVsbCkgewogCQkJCWlmIChhY3RpdmF0aW9uc0J5QWN0aW9uSWQuY29udGFpbnNLZXkoYWN0aW9uSUQpKSB7CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC9FY2xpcHNlIFVJL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL1dXaW5BY3Rpb25CYXJzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC9FY2xpcHNlIFVJL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL1dXaW5BY3Rpb25CYXJzLmphdmEKaW5kZXggNmNmOTgzMC4uOGQ0ZGFhOSAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gvRWNsaXBzZSBVSS9vcmcvZWNsaXBzZS91aS9pbnRlcm5hbC9XV2luQWN0aW9uQmFycy5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoL0VjbGlwc2UgVUkvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvV1dpbkFjdGlvbkJhcnMuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMyOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLm1pc2MuQXNzZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzLklTZXJ2aWNlTG9jYXRvcjsKIAogcHVibGljIGNsYXNzIFdXaW5BY3Rpb25CYXJzIGltcGxlbWVudHMgSUFjdGlvbkJhcnMyIHsKICAgICBwcml2YXRlIFdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7CkBAIC0zNiwxNiArMzcsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvb2wgYmFyIG1hbmFnZXIuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIElUb29sQmFyTWFuYWdlciBnZXRUb29sQmFyTWFuYWdlcigpIHsKLSAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkCi0gICAgICAgIEFzc2VydC5pc1RydWUoZmFsc2UpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjb29sIGJhciBtYW5hZ2VyLgogICAgICAqIAogICAgICAqLwpAQCAtNzQsNiArNjUsMTAgQEAKICAgICAgICAgcmV0dXJuIHdpbmRvdy5nZXRNZW51TWFuYWdlcigpOwogICAgIH0KIAorCXB1YmxpYyBmaW5hbCBJU2VydmljZUxvY2F0b3IgZ2V0U2VydmljZUxvY2F0b3IoKSB7CisJCXJldHVybiB3aW5kb3c7CisJfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc3RhdHVzIGxpbmUgbWFuYWdlci4gIElmIGl0ZW1zIGFyZSBhZGRlZCBvcgogICAgICAqIHJlbW92ZWQgZnJvbSB0aGUgbWFuYWdlciBiZSBzdXJlIHRvIGNhbGwgPGNvZGU+dXBkYXRlQWN0aW9uQmFyczwvY29kZT4uCkBAIC04NSw2ICs4MCwxNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRvb2wgYmFyIG1hbmFnZXIuCisgICAgICogCisgICAgICovCisgICAgcHVibGljIElUb29sQmFyTWFuYWdlciBnZXRUb29sQmFyTWFuYWdlcigpIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkCisgICAgICAgIEFzc2VydC5pc1RydWUoZmFsc2UpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBZGQgYSBoYW5kbGVyIGZvciBhIHdpbmRvdyBhY3Rpb24uCiAgICAgICoKICAgICAgKiBUaGUgc3RhbmRhcmQgYWN0aW9uIElEJ3MgZm9yIHRoZSB3b3JrYmVuY2ggYXJlIGRlZmluZWQgaW4KQEAgLTk5LDcgKzEwNCw3IEBACiAgICAgcHVibGljIHZvaWQgc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihTdHJpbmcgYWN0aW9uSUQsIElBY3Rpb24gaGFuZGxlcikgewogICAgIH0KIAotICAgIC8qKgorCS8qKgogICAgICAqIENvbW1pdHMgYWxsIFVJIGNoYW5nZXMuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQKICAgICAgKiBhZnRlciBhZGRpdGlvbnMgb3Igc3VidHJhY3Rpb25zIGhhdmUgYmVlbiBtYWRlIHRvIGEgCiAgICAgICogbWVudSwgc3RhdHVzIGxpbmUsIG9yIHRvb2xiYXIuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC9FY2xpcHNlIFVJL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL2RpYWxvZ3MvQ3VzdG9taXplUGVyc3BlY3RpdmVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoL0VjbGlwc2UgVUkvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZGlhbG9ncy9DdXN0b21pemVQZXJzcGVjdGl2ZURpYWxvZy5qYXZhCmluZGV4IGVlOGRiZDUuLjA5NDZiZTYgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoL0VjbGlwc2UgVUkvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZGlhbG9ncy9DdXN0b21pemVQZXJzcGVjdGl2ZURpYWxvZy5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoL0VjbGlwc2UgVUkvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvZGlhbG9ncy9DdXN0b21pemVQZXJzcGVjdGl2ZURpYWxvZy5qYXZhCkBAIC0xMDYsNiArMTA2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC51dGlsLkJ1bmRsZVV0aWxpdHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hWaWV3ZXJTb3J0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuc2VydmljZXMuSVNlcnZpY2VMb2NhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLklWaWV3Q2F0ZWdvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuSVZpZXdEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLklWaWV3UmVnaXN0cnk7CkBAIC00NzQsNiArNDc1LDEwIEBACiAJICAgICAgICBtZW51TWFuYWdlci5kaXNwb3NlKCk7CQogCSAgICAgICAgc3RhdHVzTGluZU1hbmFnZXIuZGlzcG9zZSgpOwogCSAgICB9CisKKwkJcHVibGljIGZpbmFsIElTZXJ2aWNlTG9jYXRvciBnZXRTZXJ2aWNlTG9jYXRvcigpIHsKKwkJCXJldHVybiBjb25maWd1cmVyLmdldFdpbmRvdygpOworCQl9CiAgICAgfQogCiAgICAgY2xhc3MgU2hvcnRjdXRNZW51SXRlbUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZDIzYmRkNy4uNDhkMmQxZCAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTY1LDYgKzY1LDcgQEAKICBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcywKICBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLAogIG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLAorIG9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzLAogIG9yZy5lY2xpcHNlLnVpLnRlc3RpbmcsCiAgb3JnLmVjbGlwc2UudWkudGhlbWVzLAogIG9yZy5lY2xpcHNlLnVpLnZpZXdzLApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwMzA1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS51aSBwbHVnaW4uCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIHRoZSBvcmcuZWNsaXBzZS51aSBwbHVnaW4uCi1vcmcuZWNsaXBzZS51aS9kZWJ1Zz1mYWxzZQotCi0jIFNob3cgc3lzdGVtIGpvYnMgaW4gYWxsIGRpYWxvZ3MKLW9yZy5lY2xpcHNlLnVpL2RlYnVnL3Nob3dTeXN0ZW1Kb2JzPWZhbHNlCi0KLSNSZXBvcnQgaWYgYSBzdGFsZSBqb2Igd2FzIGZvdW5kCi1vcmcuZWNsaXBzZS51aS9kZWJ1Zy9qb2Iuc3RhbGU9ZmFsc2UKLQotI1JlcG9ydCBpZiBhbiBpbWFnZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2hlbiBpdCBpcyBkZWNsYXJlZAotb3JnLmVjbGlwc2UudWkvZGVidWcvZGVjbGFyZWRJbWFnZXM9ZmFsc2UKLQotIyBFbmFibGUgZXh0ZW5kZWQgU1dUIGRlYnVnZ2luZy4KLW9yZy5lY2xpcHNlLnVpL2RlYnVnL3N3dGRlYnVnPWZhbHNlCi0KLSMgRW5hYmxlIGxvZ2dpbmcgb2YgY2VydGFpbiBjb250cmlidXRpb24gcmVsYXRlZCBtZXNzYWdlcwotb3JnLmVjbGlwc2UudWkvZGVidWcvY29udHJpYnV0aW9ucz1mYWxzZQotCi0jIEVuYWJsZSB0aGUgdHJhY2Ugb2YgU1dUIGdyYXBoaWNzLgotb3JnLmVjbGlwc2UudWkvdHJhY2UvZ3JhcGhpY3M9ZmFsc2UKLQotIyMgTm90ZSB0aGF0IGxvZ2dpbmcgb2YgYWxsIHBlcmZvcm1hbmNlIGV2ZW50cyBhcmUgY29udHJvbGxlZCBieSBhIGNlbnRyYWwgZmxhZwotIyMgVHVybiB0aGlzIGZsYWcgb24gdG8gZW5hYmxlIHRyYWNraW5nIG9mIHBlcmZvcm1hbmNlIGV2ZW50cwotIyMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3BlcmY9dHJ1ZQotCi0KLSMgUmVwb3J0cyB0aGUgdGltZSB0byByZXN0b3JlIHRoZSB3b3JrYmVuY2guCi1vcmcuZWNsaXBzZS51aS9wZXJmL3dvcmtiZW5jaC5yZXN0b3JlPTMwMDAwCi0KLSMgUmVwb3J0cyB0aGUgdGltZSB0byBzdGFydCB1cCB0aGUgd29ya2JlbmNoLgotb3JnLmVjbGlwc2UudWkvcGVyZi93b3JrYmVuY2guc3RhcnQ9NDUwMDAKLQotIyBSZXBvcnRzIHRoZSB0aW1lIHRvIGFjdGl2YXRlIHBhcnRzLgotb3JnLmVjbGlwc2UudWkvcGVyZi9wYXJ0LmFjdGl2YXRlPTIwMAotCi0jIFJlcG9ydHMgdGhlIHRpbWUgdG8gY3JlYXRlIGEgcGFydC4KLW9yZy5lY2xpcHNlLnVpL3BlcmYvcGFydC5jcmVhdGU9ODAwCi0KLSMgUmVwb3J0cyB0aGUgdGltZSB0byBpbml0aWFsaXplIGEgcGFydC4KLW9yZy5lY2xpcHNlLnVpL3BlcmYvcGFydC5pbml0PTgwMAotCi0jIFJlcG9ydHMgdGhlIHRpbWUgdG8gY3JlYXRlIGEgcGFydCdzIGlucHV0Ci1vcmcuZWNsaXBzZS51aS9wZXJmL3BhcnQuaW5wdXQ9MjAwCi0KLSMgUmVwb3J0cyB0aGUgdGltZSB0byBjcmVhdGUgYSBwYXJ0J3MgY29udHJvbAotb3JnLmVjbGlwc2UudWkvcGVyZi9wYXJ0LmNvbnRyb2w9ODAwCi0KLSMgUmVwb3J0cyB0aGUgdGltZSB0byBub3RpZnkgcGFydCBsaXN0ZW5lcnMuCi1vcmcuZWNsaXBzZS51aS9wZXJmL3BhcnQubGlzdGVuZXJzPTIwMAotCi0jIFJlcG9ydHMgdGhlIHRpbWUgdG8gbm90aWZ5IHBhZ2UgbGlzdGVuZXJzLgotb3JnLmVjbGlwc2UudWkvcGVyZi9wYWdlLmxpc3RlbmVycz0yMDAKLQotIyBSZXBvcnRzIHRoZSB0aW1lIHRvIGNyZWF0ZSBwZXJzcGVjdGl2ZXMKLW9yZy5lY2xpcHNlLnVpL3BlcmYvcGVyc3BlY3RpdmUuY3JlYXRlPTgwMAotCi0jIFJlcG9ydHMgdGhlIHRpbWUgdG8gbm90aWZ5IHBlcnNwZWN0aXZlIGxpc3RlbmVycy4KLW9yZy5lY2xpcHNlLnVpL3BlcmYvcGVyc3BlY3RpdmUubGlzdGVuZXJzPTIwMAotCi0jIFJlcG9ydHMgdGhlIHRpbWUgdG8gc3dpdGNoIHBlcnNwZWN0aXZlcwotb3JnLmVjbGlwc2UudWkvcGVyZi9wZXJzcGVjdGl2ZS5zd2l0Y2g9ODAwCi0KLSMgUmVwb3J0cyB0aGUgdGltZSB0byBydW4gVUkgam9icwotb3JnLmVjbGlwc2UudWkvcGVyZi91aWpvYj0yMDAKLQotIyBSZXBvcnRzIHRoZSB0aW1lIHRvIGRldGVybWluZSB0aGUgY29udGVudCB0eXBlIG9mIGEgZmlsZQotb3JnLmVjbGlwc2UudWkvcGVyZi9jb250ZW50VHlwZXM9MjAwCi0KLSMgQ29udHJvbHMgd2hldGhlciB0aGUgaGVhcCBzdGF0dXMgaW5kaWNhdG9yIGlzIHNob3duCi1vcmcuZWNsaXBzZS51aS9wZXJmL3Nob3dIZWFwU3RhdHVzPXRydWUKLQotIyBSZXBvcnRzIGFsbCBldmVudHMgZW50ZXJpbmcgdGhyb3VnaCB0aGUgY29tbW9uIGV2ZW50IGZyYW1ld29yayB1c2VkIGJ5IHRoZQotIyBjb21tYW5kcyBhcmNoaXRlY3R1cmUuICBTZWUgSVNvdXJjZVByb3ZpZGVyIGFuZCBBYnN0cmFjdFNvdXJjZVByb3ZpZGVyLkRFQlVHLgotb3JnLmVjbGlwc2UudWkvdHJhY2Uvc291cmNlcz1mYWxzZQotCi0jIFJlcG9ydHMgZXZlbnRzIHJlY2VpdmVkIGFuZCBkaXNwYXRjaGVkIGJ5IHRoZSBrZXkgYmluZGluZyBhcmNoaXRlY3R1cmUKLW9yZy5lY2xpcHNlLnVpL3RyYWNlL2tleUJpbmRpbmdzPWZhbHNlCi0KLSMgUmVwb3J0IGV2ZXJ5IGV2ZW50IHJlY2VpdmVkIGJ5IHRoZSBrZXkgYmluZGluZyBhcmNoaXRlY3R1cmUKLW9yZy5lY2xpcHNlLnVpL3RyYWNlL2tleUJpbmRpbmdzLnZlcmJvc2U9ZmFsc2UKLQotIyBSZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgY29tbWFuZCBleGVjdXRpb24KLW9yZy5lY2xpcHNlLnVpL3RyYWNlL2NvbW1hbmRzPWZhbHNlCi0KLSMgUmVwb3J0IGV2ZXJ5IGNoYW5nZSBpbiB0aGUgbGlzdCBvZiBjb250ZXh0cy4KLW9yZy5lY2xpcHNlLnVpL3RyYWNlL2NvbnRleHRzPWZhbHNlCi0KLSMgUmVwb3J0IGEgYml0IG9mIHN0YWNrIGFyb3VuZCBldmVyeSBjaGFuZ2UgaW4gdGhlIGxpc3Qgb2YgY29udGV4dHMuCi1vcmcuZWNsaXBzZS51aS90cmFjZS9jb250ZXh0cy52ZXJib3NlPWZhbHNlCi0KLSMgUmVwb3J0IGhhbmRsZXIgY29uZmxpY3RzIHdpdGhpbiB0aGUgd29ya2JlbmNoCi1vcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycz1mYWxzZQotCi0jIFJlcG9ydCB2ZXJib3NlIGluZm9ybWF0aW9uIGFib3V0IGNoYW5naW5nIGhhbmRsZXJzIGluIHRoZSBzeXN0ZW0uCi1vcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycy52ZXJib3NlPWZhbHNlCi0KLSMgUmVzdHJpY3QgdGhlIHZlcmJvc2UgaW5mb3JtYXRpb24gdG8gYSBwYXJ0aWN1bGFyIGNvbW1hbmQKLW9yZy5lY2xpcHNlLnVpL3RyYWNlL2hhbmRsZXJzLnZlcmJvc2UuY29tbWFuZElkPQotCi0jIFJlcG9ydCB1bmV4cGVjdGVkICh1bmRvKSBvcGVyYXRpb25zIGhpc3RvcnkgZXZlbnRzLgotb3JnLmVjbGlwc2UudWkvdHJhY2Uvb3BlcmF0aW9ucz1mYWxzZQotCi0jIFJlcG9ydCB2ZXJib3NlIGluZm9ybWF0aW9uIGFib3V0ICh1bmRvKSBvcGVyYXRpb25zIGhpc3RvcnkgY2hhbmdlcy4KLW9yZy5lY2xpcHNlLnVpL3RyYWNlL29wZXJhdGlvbnMudmVyYm9zZT1mYWxzZQotCi0jIEVuYWJsZSBsb2dnaW5nIG9mIGV2ZW50cyBmaXJlZCBmcm9tIGFuIElXb3JrYmVuY2hQYWdlIHRvIGFuIElQYXJ0TGlzdGVuZXIKLW9yZy5lY2xpcHNlLnVpL2xpc3RlbmVycy9JV29ya2JlbmNoUGFnZS5JUGFydExpc3RlbmVyPWZhbHNlCi0KLSMgRW5hYmxlIGxvZ2dpbmcgb2YgZXZlbnRzIGZpcmVkIGZyb20gYW4gSVdvcmtiZW5jaFBhZ2UgdG8gYW4gSVBhcnRMaXN0ZW5lcjIKLW9yZy5lY2xpcHNlLnVpL2xpc3RlbmVycy9JV29ya2JlbmNoUGFnZS5JUGFydExpc3RlbmVyMj1mYWxzZQotCi0jIEVuYWJsZSBsb2dnaW5nIG9mIGV2ZW50cyBmaXJlZCBmcm9tIGFuIElXb3JrYmVuY2hQYWdlIHRvIGFuIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi1vcmcuZWNsaXBzZS51aS9saXN0ZW5lcnMvSVdvcmtiZW5jaFBhZ2UuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI9ZmFsc2UKLQotIyBFbmFibGUgbG9nZ2luZyBvZiBldmVudHMgZmlyZWQgZnJvbSBhbiBJV29ya2JlbmNoUGFydFJlZmVyZW5jZQotb3JnLmVjbGlwc2UudWkvbGlzdGVuZXJzL0lXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlPWZhbHNlCi0KLSMgRW5hYmxlIGxvZ2dpbmcgb2YgZXZlbnRzIGZpcmVkIGZyb20gYW4gSVdvcmtiZW5jaFdpbmRvdyB0byBhbiBJUGVyc3BlY3RpdmVMaXN0ZW5lcgotb3JnLmVjbGlwc2UudWkvbGlzdGVuZXJzL0lXb3JrYmVuY2hXaW5kb3cuSVBlcnNwZWN0aXZlTGlzdGVuZXI9ZmFsc2UKLQotIyBFbmFibGUgbG9nZ2luZyBvZiBldmVudHMgZmlyZWQgZnJvbSBhbiBJV29ya2JlbmNoV2luZG93IHRvIGFuIElQYXJ0TGlzdGVuZXIKLW9yZy5lY2xpcHNlLnVpL2xpc3RlbmVycy9JV29ya2JlbmNoV2luZG93LklQYXJ0TGlzdGVuZXI9ZmFsc2UKLQotIyBFbmFibGUgbG9nZ2luZyBvZiBldmVudHMgZmlyZWQgZnJvbSBhbiBJV29ya2JlbmNoV2luZG93IHRvIGFuIElQYXJ0TGlzdGVuZXIyCi1vcmcuZWNsaXBzZS51aS9saXN0ZW5lcnMvSVdvcmtiZW5jaFdpbmRvdy5JUGFydExpc3RlbmVyMj1mYWxzZQotCi0jIEVuYWJsZSBsb2dnaW5nIG9mIGV2ZW50cyBmaXJlZCBmcm9tIGFuIElXb3JrYmVuY2hXaW5kb3cgdG8gYW4gSVBhZ2VMaXN0ZW5lcgotb3JnLmVjbGlwc2UudWkvbGlzdGVuZXJzL0lXb3JrYmVuY2hXaW5kb3cuSVBhZ2VMaXN0ZW5lcj1mYWxzZQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGI1ZmVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuaGVscDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamZhY2U8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnN3dDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkud29ya2JlbmNoPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjdlNmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotI01vbiBPY3QgMjQgMTU6MDc6MzAgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwYjJkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUdWUgT2N0IDE4IDE1OjE0OjM3IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmphdmFkb2M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGdldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyY29tbWVudCIgbmFtZVw9ImdldHRlcmNvbW1lbnQiPi8qKlxuICogQHJldHVybiBSZXR1cm5zIHRoZSAke2JhcmVfZmllbGRfbmFtZX0uXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyY29tbWVudCIgbmFtZVw9InNldHRlcmNvbW1lbnQiPi8qKlxuICogQHBhcmFtICR7cGFyYW19IFRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yY29tbWVudCIgbmFtZVw9ImNvbnN0cnVjdG9yY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpbGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCI+LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIENvcHlyaWdodCAoYykgJHt5ZWFyfSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcbiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHBcOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuICpcbiAqIENvbnRyaWJ1dG9yc1w6XG4gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9ImZhbHNlIiBjb250ZXh0XD0idHlwZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgdHlwZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMudHlwZWNvbW1lbnQiIG5hbWVcPSJ0eXBlY29tbWVudCI+LyoqXG4gKiBAc2luY2UgMy4yXG4gKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWVsZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGZpZWxkcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWVsZGNvbW1lbnQiIG5hbWVcPSJmaWVsZGNvbW1lbnQiPi8qKlxuICogXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG5vbi1vdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJvdmVycmlkZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5vdmVycmlkZWNvbW1lbnQiIG5hbWVcPSJvdmVycmlkZWNvbW1lbnQiPi8qIChub24tSmF2YWRvYylcbiAqICR7c2VlX3RvX292ZXJyaWRkZW59XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im5ld3R5cGVfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubmV3dHlwZSIgbmFtZVw9Im5ld3R5cGUiPiR7ZmlsZWNvbW1lbnR9XG4ke3BhY2thZ2VfZGVjbGFyYXRpb259XG5cbiR7dHlwZWNvbW1lbnR9XG4ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgbWV0aG9kIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5Ij4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2xhc3Nib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjbGFzcyB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jbGFzc2JvZHkiIG5hbWVcPSJjbGFzc2JvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJpbnRlcmZhY2Vib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBpbnRlcmZhY2UgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuaW50ZXJmYWNlYm9keSIgbmFtZVw9ImludGVyZmFjZWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJlbnVtYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgZW51bSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5lbnVtYm9keSIgbmFtZVw9ImVudW1ib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iYW5ub3RhdGlvbmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGFubm90YXRpb24gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuYW5ub3RhdGlvbmJvZHkiIG5hbWVcPSJhbm5vdGF0aW9uYm9keSI+XG48L3RlbXBsYXRlPjwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTQ0MjQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNUdWUgTm92IDE2IDE0OjEwOjM3IEVTVCAyMDA0Ci1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJmNWExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUGx1Z2luLm5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUGx1Z2luLnByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5oZWxwLAotIG9yZy5lY2xpcHNlLnN3dDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5qZmFjZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NmZjMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvYnVpbGRub3Rlc193b3JrYmVuY2guaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvYnVpbGRub3Rlc193b3JrYmVuY2guaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiNWI3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2J1aWxkbm90ZXNfd29ya2JlbmNoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OTYgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotCi08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQnVpbGQiIGNvbnRlbnQ9IkJ1aWxkIj4KLSAgIDx0aXRsZT5FY2xpcHNlIFBsYXRmb3JtIFJlbGVhc2UgTm90ZXMgKDMuMikgLSBKRmFjZSBhbmQgV29ya2JlbmNoPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMT5FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzICgzLjIpPGJyPgotSkZhY2UgYW5kIFdvcmtiZW5jaDwvaDE+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChKYW51YXJ5IDEwLCAyMDA2LCA4OjAwIGEubS4pPC9wPgotICA8cD5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L3A+Ci0gIDxwPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTgyMCI+QnVnIDExMTgyMDwvYT4uIFtDb21tb25OYXZpZ2F0b3JdIGFjdGlvblByb3ZpZGVyIGV4dGVuc2lvbiBzaG91bGQgc3VwcG9ydCBkZXBlbmRlbmNpZXM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3NTA1Ij5CdWcgMTE3NTA1PC9hPi4gW0NvbW1hbmRzXSBoYW5kbGVyczogTGVnYWN5IGFjdGlvbnMgYXJlIGFjdGl2ZSBldmVuIHdoZW4gdGhleSBzaG91bGRuJ3QgYmU8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4NDM1Ij5CdWcgMTE4NDM1PC9hPi4gW01hcmtlcnNdIFRyeWluZyB0byBpbXBsZW1lbnQgV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTg5MzQiPkJ1ZyAxMTg5MzQ8L2E+LiBbRGlhbG9nc10gSW50cm9kdWNlIGRpYWxvZyB0cmF5czxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTk4NjQiPkJ1ZyAxMTk4NjQ8L2E+LiBBIG1vcmUgbGlnaHR3ZWlnaHQgaGllcmFyY2hpY2FsIHByb2JsZW1zIHZpZXc8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5OTI3Ij5CdWcgMTE5OTI3PC9hPi4gW0tleUJpbmRpbmdzXSBUVlQzLjEueDpUQ1QyNDE6IFJlYWRpbmcgb3JkZXIgaW4ga2V5IHNlcXVlbmNlcyBjb250YWluaW5nIG5ldXRyYWwgY2hhcnM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5OTYwIj5CdWcgMTE5OTYwPC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gTmF2aWdhdG9yIHBsdWdpbnMgc2hvdWxkIGJlIEpBUmVkPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDE0MiI+QnVnIDEyMDE0MjwvYT4uIFtEYXRhQmluZGluZ10gRGF0YUJpbmRpbmcgaXMgc3RhdGljPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDYzMiI+QnVnIDEyMDYzMjwvYT4uIFtEbkRdIERyYWcgaW5kaWNhdG9ycyBoYXJkIHRvIHNlZSBvbiBPUyBYPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDY1MiI+QnVnIDEyMDY1MjwvYT4uIFtDb21tYW5kc10gaGFuZGxlcnM6IENhbm5vdCBhZGQgZXZhbHVhdGlvbnMgdG8gRGlzcGxheSBvciBFeHByZXNzaW9ucyBWaWV3PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDkzMiI+QnVnIDEyMDkzMjwvYT4uIFtDb21tb25OYXZpZ2F0b3JdIFByb3ZpZGVyIGZvciB1aS5uYXZpZ2F0b3IgaXMgZGlmZmVyZW50PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDkzNCI+QnVnIDEyMDkzNDwvYT4uIFtXb3JrYmVuY2hQYXJ0c10gTlBFIGluIFByZXNlbnRhYmxlUGFydC5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjE1NjIiPkJ1ZyAxMjE1NjI8L2E+LiBbSURFXSBOZWVkIGEgd2F5IHRvIGRpc2FibGUgZm9yY2VkIEdDIGRvbmUgYnkgSURFSWRsZUhlbHBlcjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjE2MjMiPkJ1ZyAxMjE2MjM8L2E+LiBbRGVjb3JhdG9yc10gUGF0Y2ggdG8gc3VwcG9ydCBsb2dpY2FsIG1vZGVsIGRlY29yYXRpb248YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIxNjMyIj5CdWcgMTIxNjMyPC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gY2xhc3NlcyB3aXRoIHRlbXBsYXRlIGNsYXNzIGNvbW1ldG48YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIxNzA5Ij5CdWcgMTIxNzA5PC9hPi4gW0NvbW1hbmRzXSBwYXJhbWV0ZXJzOiBBZGQgdHlwZXM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIxODgzIj5CdWcgMTIxODgzPC9hPi4gW01hcmtlcnNdIG9yZy5lY2xpcHNlLnVpLnRlc3RzIHBsdWctaW4gbWFrZXMgbG90cyBvZiBwZXJmb3JtYW5jZSB0ZXN0cyByZWQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyMDUzIj5CdWcgMTIyMDUzPC9hPi4gW0tleUJpbmRpbmdzXSBTaG9ydGN1dCBLZXkgTm90IFdvcmtpbmcgSW4gMy4yTTQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyNTE1Ij5CdWcgMTIyNTE1PC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gQ29tbW9uQWN0aW9uUHJvdmlkZXIgc2hvdWxkIGJlIG1hZGUgYW4gQVBJLWxldmVsIGFic3RyYWN0IGNsYXNzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMjUxNyI+QnVnIDEyMjUxNzwvYT4uIFtDb21tb25OYXZpZ2F0b3JdIENvbW1vbkFjdGlvblByb3ZpZGVyIHNob3VsZCBzdWJjbGFzcyBBY3Rpb25Hcm91cDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjI1MTgiPkJ1ZyAxMjI1MTg8L2E+LiBbQ29tbW9uTmF2aWdhdG9yXSBJbXByb3ZlIENvbW1vbkFjdGlvblByb3ZpZGVyJ3MgaW5pdCgpIG1ldGhvZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjI1MjAiPkJ1ZyAxMjI1MjA8L2E+LiBbQ29tbW9uTmF2aWdhdG9yXSBPcGVuIHVwIElOYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlIGFzIGluc3RhbnRpYXRhYmxlIEFQSTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjI1MjUiPkJ1ZyAxMjI1MjU8L2E+LiBbQ29tbW9uTmF2aWdhdG9yXSBBbGxvdyBtZW51IGluc2VydGlvbiBwb2ludHMgdG8gYmUgZXh0ZW5zaWJsZSBwZXIgdmlld2VyPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMjY2NSI+QnVnIDEyMjY2NTwvYT4uIFtDb21tb25OYXZpZ2F0b3JdIE1vdmUgY29tbW9uV2l6YXJkIGV4dCBwdCB0byBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyNjc0Ij5CdWcgMTIyNjc0PC9hPi4gW0NvbnRyaWJ1dGlvbnNdIGVycm9yczogRWNsaXBzZSBzdG9wcyBzdGFydHVwIHNpbGVudGx5IHdoZW4gZXJyb3IgaW4gYWN0aW9uIHNldDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjI2ODMiPkJ1ZyAxMjI2ODM8L2E+LiBbQ29tbW9uTmF2aWdhdG9yXSBUaGUgcmVnaXN0cnkgcmVhZGVycyBmb3IgY29uc29saWRhdGVkIGV4dCBwdHMgc2hvdWxkIGJlIHJlZmFjdG9yZWQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyNjg4Ij5CdWcgMTIyNjg4PC9hPi4gW1dvcmtiZW5jaF0gU2hvdWxkIGNhc3QgdG8gSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5zdGVhZCBvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMjc5MSI+QnVnIDEyMjc5MTwvYT4uIFtEbkRdIHVuY2F1Z2h0IGV4Y2VwdGlvbnMgZHVyaW5nIHRyaW0gZHJhZ2dpbmcgY2F1c2Ugc3Vic2VxdWVudCBpc3N1ZXM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyODE0Ij5CdWcgMTIyODE0PC9hPi4gTlBFIGluIFJlc291cmNlTWFwcGluZ01hcmtlcnNUZXN0LnRlc3RSZXNvdXJjZU1hcHBpbmdzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMjkxNSI+QnVnIDEyMjkxNTwvYT4uIERlZmF1bHRTY29wZS5nZXROb2RlIG5vdCBhY2Nlc3NpYmxlIGluIHN0cmljdCBtb2RlPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMjk4MiI+QnVnIDEyMjk4MjwvYT4uIFtLZXlCaW5kaW5nc10gZXJyb3JzOiBObyB3YXJuaW5nIHdoZW4gY3JlYXRpbmcgYW4gaW52YWxpZCBrZXliaW5kaW5nIHNlcXVlbmNlPGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChKYW51YXJ5IDQsIDIwMDYsIDQ6MDAgcC5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIxOTM5Ij5CdWcgMTIxOTM5PC9hPi4gW1ZpZXdlcnNdIFRyZWVTZWxlY3Rpb24gc2hvdWxkIHN1YmNsYXNzIFN0cnVjdHVyZWRTZWxlY3Rpb248YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwOTM0Ij5CdWcgMTIwOTM0PC9hPi4gW1dvcmtiZW5jaFBhcnRzXSBOUEUgaW4gUHJlc2VudGFibGVQYXJ0LnJlbW92ZVByb3BlcnR5TGlzdGVuZXIoPGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChEZWNlbWJlciAyMCwgMjAwNSwgMDg6MDAgYS5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNjI2Ij5CdWcgMTAyNjI2PC9hPi4gW0NvbW1hbmRzXSByZWdpc3RyeTogb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMgRXh0ZW5zaW9uIHBvaW50IGlzIGJlaW5nIHJlYWQgaW5jb3JyZWN0bHk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyMDA1Ij5CdWcgMTEyMDA1PC9hPi4gW0dyYXBoaWNzXSBJY29uIGZvciBncm91cHMgb2YgY29tbWFuZHM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1NzMwIj5CdWcgMTE1NzMwPC9hPi4gW0tleUJpbmRpbmdzXSBtaXNjOiBXb3JrYmVuY2hLZXlib2FyZCBjaXJjdW1uYXZpZ2F0ZXMgSUV4ZWN1dGlvbkxpc3RlbmVyLm5vdEhhbmRsZWQoLi4uKTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjAxNTQiPkJ1ZyAxMjAxNTQ8L2E+LiBbQ29tbWFuZHNdIHBhcmFtZXRlcnM6IGV4dGVuc2lvbi1wb2ludCBzY2hlbWEgZm9yIG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIHJlcXVpcmVzIGNvbW1hbmRzIHRvIGhhdmUgZXhhY3RseSAxIGNvbW1hbmRQYXJhbWV0ZXI8YnI+Ci0gIDwvcD4KLQotPHA+SW50ZWdyYXRpb24gQnVpbGQgKERlY2VtYmVyIDE0LCAyMDA1LCAxMjowMCBwLm0uKTwvcD4KLSAgPHA+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9wPgotICA8cD4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjAwNzQiPkJ1ZyAxMjAwNzQ8L2E+LiBbR3JhcGhpY3NdIEZhc3QgdmlldyB0YXJnZXQgbG9va3MgbGlrZSBmYXN0IHZpZXcgaWNvbjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjA0NDEiPkJ1ZyAxMjA0NDE8L2E+LiBbRG5EXSBDYW5jZWxsaW5nIHRoZSBEcmFnIHBsYWNlcyB0cmltIGluIHRoZSB3cm9uZyBwbGFjZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjA3MTAiPkJ1ZyAxMjA3MTA8L2E+LiBbRmFzdFZpZXdzXSBTV1QgZXJyb3Igd2hlbiByaWdodC1jbGlja2luZyBpbiB0aGUgZmFzdCB2aWV3IHRvb2xiYXI8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwNzM1Ij5CdWcgMTIwNzM1PC9hPi4gW0RuRF0gRGlzcG9zaW5nIHRoZSBUcmltQ29tbW9uVUlIYW5kbGUgY2F1c2VzIHRoZSAnY2FwdHVyZScgdG8gZmFpbDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjA3MzYiPkJ1ZyAxMjA3MzY8L2E+LiBbTWFya2Vyc10gTlBFIGR1cmluZzogJnF1b3Q7RmV0Y2hpbmcgY2hpbGRyZW4gb2YgUHJvYmxlbXMmcXVvdDsuPGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChEZWNlbWJlciAxNCwgMjAwNSwgMTI6MTAgYS5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyOTU4Ij5CdWcgMTEyOTU4PC9hPi4gW1BlcnNwZWN0aXZlc10gQWNjZXNzIHRvIHBlcnNwZWN0aXZlIGRlc2NyaXB0b3Igd2hlbiBjcmVhdGluZyBpbml0aWFsIGxheW91dDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTgwMjUiPkJ1ZyAxMTgwMjU8L2E+LiBbRGlhbG9nc10gUG9wdXBEaWFsb2cgc2hvdWxkIHNldCBhIGdyaWQgZGF0YSB0byB0aGUgY29udHJvbCByZXR1cm5lZCBmcm9tIGNyZWF0ZURpYWxvZ0FyZWE8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5NDk0Ij5CdWcgMTE5NDk0PC9hPi4gW1dvcmtiZW5jaF0gZGFuZ2Vyb3VzIHVzZXMgb2YgJnF1b3Q7bmV3IEdDKERpc3BsYXkpJnF1b3Q7PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTY4NiI+QnVnIDExOTY4NjwvYT4uIFtQb3B1cERpYWxvZ10gLSBzbWFsbCBpbmZvIGZvbnQgc2hvdWxkIGJlIG1hbmFnZWQgYnkgSkZhY2U8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwNTMyIj5CdWcgMTIwNTMyPC9hPi4gW01hcmtlcnNdIFNXVEVycm9yIGluIFRhc2tWaWV3IG9uIHNodXRkb3duPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDU2NSI+QnVnIDEyMDU2NTwvYT4uIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50IGV4dGVuc2lvbiBwb2ludCBjb250YWlucyBjaGtwaWkgZXJyb3JzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDU2NyI+QnVnIDEyMDU2NzwvYT4uIFtDb21tb25OYXZpZ2F0b3JdIEphdmFkb2Mgd2FybmluZ3MgaW4gMy4yIE00IFRlc3QgQ2FuZGlkYXRlPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDY1NiI+QnVnIDEyMDY1NjwvYT4uIFtEaWFsb2dzXSBTV1RFeGVwdGlvbjogV2lkZ2V0IGlzIGRpc3Bvc2VkIHdoZW4gcmVzaXppbmcgcXVpY2sgb3V0bGluZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjA2OTUiPkJ1ZyAxMjA2OTU8L2E+LiBOZWVkIHRvIHN3YXAgbmV3IHByb2plY3QgcG5nIHdpemFyZCBiYW5uZXIgZmlsZSBvdXQgZm9yIE00PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDcyNyI+QnVnIDEyMDcyNzwvYT4uIEluZm8gdGV4dCBhcmVhIGRvZXMgbm90IGFwcGVhciBpbiBQb3B1cERpYWxvZzxicj4KLSAgPC9wPgotCi08cD5JbnRlZ3JhdGlvbiBCdWlsZCAoRGVjZW1iZXIgMTIsIDIwMDUsIDg6MDAgcC5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5NjYxIj5CdWcgMTA5NjYxPC9hPi4gW1ByZXNlbnRhdGlvbl0gSW1wcm92ZSBjdXN0b21pemFibGUgd2luZG93IHRyaW08YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4MDc4Ij5CdWcgMTE4MDc4PC9hPi4gIFtDb21tYW5kc10gaGFuZGxlcnM6IERlYnVnIGtleWJpbmRpbmdzIG5vdCB3b3JraW5nPGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChEZWNlbWJlciAxMiwgMjAwNSwgNDowMCBwLm0uKTwvcD4KLSAgPHA+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9wPgotICA8cD4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk2NjEiPkJ1ZyAxMDk2NjE8L2E+LiBbUHJlc2VudGF0aW9uXSBJbXByb3ZlIGN1c3RvbWl6YWJsZSB3aW5kb3cgdHJpbTxicj4KLSAgPC9wPgotCi08cD5JbnRlZ3JhdGlvbiBCdWlsZCAoRGVjZW1iZXIgMTIsIDIwMDUsIDEyOjAwIHAubS4pPC9wPgotICA8cD5DaGFuZ2VzIHRvIHRoZSBbQ29tbW9uTmF2aWdhdG9yXSBjb21wb25lbnQuPC9wPgotCi08cD5JbnRlZ3JhdGlvbiBCdWlsZCAoRGVjZW1iZXIgMTIsIDIwMDUsIDEyOjEwIGEubS4pPC9wPgotICA8cD5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L3A+Ci0gIDxwPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5NDc2Ij5CdWcgNTk0NzY8L2E+LiBbVmlld01nbXRdIFtSQ1BdIFNob3VsZCBoYXZlIGFuIGFwcC1sZXZlbCBwcmVmZXJlbmNlIGZvciB3aGV0aGVyIGRldGFjaGVkIHZpZXdzIGFyZSBzdXBwb3J0ZWQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODkyNTAiPkJ1ZyA4OTI1MDwvYT4uIFtWaWV3ZXJzXSAtIEFQSSBSZXZpZXcgLSBMYXp5U29ydGVkQ29sbGVjdGlvbiByZXZpZXcgY29tbWVudHM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODk3NzMiPkJ1ZyA4OTc3MzwvYT4uIFtWaWV3ZXJzXSBTZWFyY2gga2VlcHMgc2hvd2luZyBzZWxlY3Rpb24gd2hpbGUgcmVzdWx0cyBzdGlsbCBiZWluZyBhZGRlZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMyOTkiPkJ1ZyAxMDMyOTk8L2E+LiBbTWFya2Vyc10gQ2FuJ3QgY29weSBtdWx0aXBsZSBwcm9ibGVtcyBmcm9tIHRoZSBwcm9ibGVtcyB2aWV3PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjE5OSI+QnVnIDEwNjE5OTwvYT4uIFtwbGFuIGl0ZW1dIEltcHJvdmUgdGFzayBhc3Npc3RhbmNlIGluIHRleHQgZmllbGRzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzI3MSI+QnVnIDEwNzI3MTwvYT4uIFtQcmVmZXJlbmNlc10gW1JDUF0gRmlsdGVyZWRQcmVmZXJlbmNlRGlhbG9nIHNob3VsZCBhbGxvdyBoaXN0b3J5IGFuZCBmaWx0ZXJpbmcgdG8gYmUgdHVybmVkIG9mZjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDkwNzQiPkJ1ZyAxMDkwNzQ8L2E+LiBbUHJvZ3Jlc3NdIFdpZGdldCBpcyBkaXNwb3NlZCBFeGNlcHRpb24gaW4gUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLnVwZGF0ZUZvclNldEJsb2NrZWQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5MTQ0Ij5CdWcgMTA5MTQ0PC9hPi4gW0ltcG9ydC9FeHBvcnRdIFVzZSBGaWx0ZXJlZFRyZWUgaW4gd2l6YXJkIHNlbGVjdGlvbiBwYWdlcyBpZiBwb3NzaWJsZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDkyODEiPkJ1ZyAxMDkyODE8L2E+LiBbVmlld2Vyc10gQ29udGVudFZpZXdlciBkb2VzIG5vdCBudWxsIG91dCBpbnB1dCBvbiBoYW5kbGVEaXNwb3NlZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDkzMjEiPkJ1ZyAxMDkzMjE8L2E+LiBbUHJlZmVyZW5jZXMvUHJvcGVydGllcyBEaWFsb2dzXSBVc2luZyBvbGQgdmVyc2lvbiBvZiBkaXNhYmxlZCBhcnJvdyBpY29uPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTY2MSI+QnVnIDEwOTY2MTwvYT4uIFtQcmVzZW50YXRpb25dIEltcHJvdmUgY3VzdG9taXphYmxlIHdpbmRvdyB0cmltPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDE4NiI+QnVnIDExMDE4NjwvYT4uIFtJREVdIFByb21wdCB3aGVuIGNsZWFyaW5nIGV4ZWN1dGFibGUgYXR0cmlidXRlIG9uIGZvbGRlcnM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyMjUxIj5CdWcgMTEyMjUxPC9hPi4gW1Byb2dyZXNzXSBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uIG5lZWRzIHRvIHJlbW92ZSBpdCdzIGRlcGVuZGVuY3kgb24gdGhlIFVJIFRocmVhZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTI5MjIiPkJ1ZyAxMTI5MjI8L2E+LiBbTWFya2Vyc10gUHJvYmxlbXMgdmlldyByZWZyZXNoZXMgb24gYWRkIGFuZCByZW1vdmU8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzNjYxIj5CdWcgMTEzNjYxPC9hPi4gW0RlY29yYXRvcnNdIFtEeW5hbWljVUldIEV4Y2VwdGlvbiBpbiBEZWNvcmF0b3JNYW5hZ2VyIGNhdXNlZCBieSBpbmNvcnJlY3QgcHJvY2Vzc2luZyBvZiBidW5kbGUgZXZlbnRzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDMwMiI+QnVnIDExNDMwMjwvYT4uIFtFZGl0b3JNZ210XSBpbXByb3ZlIEFQSSBkb2MgRWRpdG9ySW5wdXQjZ2V0TmFtZSBzaG91bGQgbmV2ZXIgcmV0dXJuIG51bGw8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2ODY3Ij5CdWcgMTE2ODY3PC9hPi4gW1dvcmtpbmdTZXRzXSBSZW5hbWVkIHdvcmtpbmcgc2V0IGFwcGVhcnMgd2l0aCBvbGQgbmFtZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTg4NDUiPkJ1ZyAxMTg4NDU8L2E+LiBbSW1wb3J0L0V4cG9ydF0gd2l6YXJkIGxpc3RzIG5vdCBmaWx0ZXJlZCBhY2NvcmRpbmcgdG8gY2FwYWJpbGl0aWVzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODkzNCI+QnVnIDExODkzNDwvYT4uIEludHJvZHVjZSBkaWFsb2cgdHJheXM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5MDc2Ij5CdWcgMTE5MDc2PC9hPi4gW01hcmtlcnNdIEFycmF5U3RvcmVFeGNlcHRpb24gd2hlbiBtdWx0aXNlbGVjdGlvbiBpbiBQcm9ibGVtcyB2aWV3IGluY2x1ZGVzIGNhdGVnb3J5PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTI1OCI+QnVnIDExOTI1ODwvYT4uIFtNYXJrZXJzXSBNYXJrZXIgZmlsdGVycyBzaG91bGQgc3VwcG9ydCBhY3Rpdml0aWVzLjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkzNDAiPkJ1ZyAxMTkzNDA8L2E+LiBbUG9wdXBEaWFsb2ddIC0gbmVlZCBjb25zdGFudCBmb3IgaG9yaXpvbnRhbCBzcGFjaW5nPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTQ1NiI+QnVnIDExOTQ1NjwvYT4uIFtEaWFsb2dzXSBXcm9uZyBjbGFzcyBzZWxlY3RlZCBmcm9tIFRlc3QgU2VsZWN0aW9uIGNsYXNzIGNob29zZXIgZGlhbG9nPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTQ3OCI+QnVnIDExOTQ3ODwvYT4uIHVpLndpbjMyIGFuZCB1aS5jYXJib24gZnJhZ21lbnRzIG5lZWQgdmVyc2lvbiB1cGRhdGVzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTUwNiI+QnVnIDExOTUwNjwvYT4uIFtDb21tb25OYXZpZ2F0b3JdIE5hdmlnYXRvciBzY2hlbWFzIHNob3VsZCByZWZlcmVuY2UsIG5vdCBjb3B5LCBzY2hlbWFzIGZyb20gY29yZS5leHByZXNzaW9uczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTk1OTkiPkJ1ZyAxMTk1OTk8L2E+LiBbRGlhbG9nc10gRXZlcnkgUG9wdXBEaWFsaW9nIGlzIGxlYWtlZCBpZiBQb3B1cERpYWxvbGcuSE9WRVJfU0hFTExTVFlMRSBvciBTV1QuT05fVE9QIGlzIHNldDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTk2MTUiPkJ1ZyAxMTk2MTU8L2E+LiBbUHJvcGVydGllc0RpYWxvZ10gQ2FuIG5vIGxvbmdlciBjaGFuZ2UgcmVhZC1vbmx5IHByb3BlcnR5PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTY4NiI+QnVnIDExOTY4NjwvYT4uIFtQb3B1cERpYWxvZ10gLSBzbWFsbCBpbmZvIGZvbnQgc2hvdWxkIGJlIG1hbmFnZWQgYnkgSkZhY2U8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5OTcxIj5CdWcgMTE5OTcxPC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gUmVzaGFwZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCBmb3IgYWN0aW9uczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjAxMDEiPkJ1ZyAxMjAxMDE8L2E+LiBbV29ya2luZ1NldHNdW0dyYXBoaWNzXSBBZ2dyZWdhdGVzIHNob3VsZCBoYXZlIGFuIGljb248YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwMTE3Ij5CdWcgMTIwMTE3PC9hPi4gW0RhdGFCaW5kaW5nXSBOZWVkIHRvIHN1cHBvcnQgaW1hZ2VzIGluIHRhYmxlIGNlbGxzPGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChOb3ZlbWJlciAyOSwgMjAwNSwgMTI6MDAgcC5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4NDE0Ij5CdWcgMTE4NDE0PC9hPi4gW1dvcmtpbmdTZXRzXSBEZWFkbG9jayBvbiBlYWNoIHN0YXJ0dXAgY2F1c2VkIGJ5IEFic3RyYWN0V29ya2luZ1NldE1hbmFnZXI8YnI+Ci0gIDwvcD4KLQotPHA+SW50ZWdyYXRpb24gQnVpbGQgKE5vdmVtYmVyIDI5LCAyMDA1LCA4OjAwIGEubS4pPC9wPgotICA8cD5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L3A+Ci0gIDxwPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQyNjQzIj5CdWcgNDI2NDM8L2E+LiBbRWRpdG9yIE1nbXRdIE5lZWQgZXh0ZW5zaW9uIHRvIGludGVyY2VwdCBlZGl0b3Igb3BlbmluZzxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTQ5NyI+QnVnIDQ5NDk3PC9hPi4gW1JDUF0gSkZhY2UgZGVwZW5kZW5jeSBvbiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUgZW5sYXJnZXMgc3RhbmRhbG9uZSBKRmFjZSBhcHBsaWNhdGlvbnM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg1NzciPkJ1ZyA4ODU3NzwvYT4uIFtWaWV3ZXJzXSBEZWZlcnJlZCB2aWV3ZXJzIGluIEpGYWNlIGhhdmUgYSBkZXBlbmRlbmN5IG9uIEpvYjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc4MzkiPkJ1ZyAxMDc4Mzk8L2E+LiBbV29ya2JlbmNoTGF1bmNoZXJdIFN0YXJ0dXAgcHJvZ3Jlc3MgYmFyIHNob3VsZCBhbm5vdW5jZSBsb2FkaW5nLCBub3QgbG9hZGVkPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTY2MSI+QnVnIDEwOTY2MTwvYT4uIFtQcmVzZW50YXRpb25dIEltcHJvdmUgY3VzdG9taXphYmxlIHdpbmRvdyB0cmltPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjAwMCI+QnVnIDExMjAwMDwvYT4uIFtWaWV3ZXJzXSBUcmVlVmlld2VyIFNXVC5WSVJUVUFMIHN1cHBvcnQuPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjIyMiI+QnVnIDExMjIyMjwvYT4uIFtXb3JrYmVuY2hQYXJ0c10gSVNhdmVhYmxlUGFydDIncyBERUZBVUxUIGNvbnN0YW50IGlzIHJlc3BlY3RlZCBvbmx5IGlmIGEgc2luZ2xlIHBhcnQgaXMgYmVpbmcgY2xvc2VkPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjIzNyI+QnVnIDExMjIzNzwvYT4uIFtHcmFwaGljc10gRXhwb3J0aW5nIGtleSBwcmVmZXJlbmNlcyBzaG93cyBpY29uIG9mIGRpZmZlcmVudCB0eXBlIG9mIGtleTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTM4MzIiPkJ1ZyAxMTM4MzI8L2E+LiBbV29ya2luZ1NldHNdIE5vIHdheSB0byBkaXNhYmxlIHdpbmRvdyB3b3JraW5nIHNldHMuPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDUyNyI+QnVnIDExNDUyNzwvYT4uIFtEeW5hbWljVUldIFJhY2UgY29uZGl0aW9uIGluIFdvcmtiZW5jaCBsZWFkcyB0byBpbnRlcm1pdHRlbnQgY3Jhc2hlcyAob3JnLmVjbGlwc2UudWkuc3RhcnR1cCk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0ODEzIj5CdWcgMTE0ODEzPC9hPi4gW0R5bmFtaWNVSV0gSW5jb3JyZWN0IHN5bmNocm9uaXphdGlvbiB3aWxsIGxlYWQgdG8gSlVuaXQgZmFpbHVyZSAob3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1BsdWdpbnNUZXN0U3VpdGUpPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDkzMSI+QnVnIDExNDkzMTwvYT4uIFtDb21tb25OYXZpZ2F0b3JdIEZpbHRlcmluZyBieSB0eXBlcyBvZiBjb250ZW50IHNod3MgYWxsIGNvbnRlbnQgdHlwZXM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0OTQwIj5CdWcgMTE0OTQwPC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gW0Rpc2N1c3Npb25dIE5hdmlnYXRvciBleHRlbnNpb25zIG9ubHkgb3BlcmF0ZSBhdCBvbmUgbGV2ZWw8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0OTkzIj5CdWcgMTE0OTkzPC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gTWlzc2luZyBOTFMgbWVzc2FnZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTUxMjMiPkJ1ZyAxMTUxMjM8L2E+LiBbQ29tbW9uTmF2aWdhdG9yXSBbQVBJXSBVcGRhdGUgZXh0ZW5zaW9uIHBvaW50IHNjaGVtYSBkb2MgZm9yIG5hdmlnYXRvckNvbnRlbnQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MTMwIj5CdWcgMTE1MTMwPC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gUG9ydCB0aGUgQWN0aW9uRXhwcmVzc2lvbiBlbmFibGVtZW50IGNsYXNzZXMgdG8gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9uczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTU0ODYiPkJ1ZyAxMTU0ODY8L2E+LiBbQ29tbW9uTmF2aWdhdG9yXSBbYXJjaF0gTmF2aWdhdG9yIHZpZXdlcnMgc2hvdWxkIGJlIG1vcmUgY29uZmlndXJhYmxlPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTc4NSI+QnVnIDExNTc4NTwvYT4uIFF1aWNrIGRpYWxvZ3MgZG9uJ3QgYXBwZWFyIGFmdGVyIGhhdmluZyB1c2VkIHRoZSBtZW51PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjQ2MCI+QnVnIDExNjQ2MDwvYT4uIFtDb21tb25OYXZpZ2F0b3JdIENvZGUgcmV2aWV3IGNvbW1lbnRzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjY4NSI+QnVnIDExNjY4NTwvYT4uIFtDb21tb25OYXZpZ2F0b3JdIENsYXNzQ2FzdEV4Y2VwdGlvbiB0cnlpbmcgdG8gZXhlY3V0ZSBhY3Rpb248YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NjkwIj5CdWcgMTE2NjkwPC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gVmlldyB0aXRsZSBpcyBibGFuazxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTcwNDMiPkJ1ZyAxMTcwNDM8L2E+LiBbTVBFXSBBbGxvdyBNdWx0aVBhZ2VFZGl0b3JzIHRvIGN1c3RvbWl6ZSBsYXlvdXQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MDY1Ij5CdWcgMTE3MDY1PC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gU2hvdWxkIHN1cHBvcnQgYmV0dGVyIGZpbHRlcmluZyBvZiBkdXBsaWNhdGUgY29udGVudDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTczNTgiPkJ1ZyAxMTczNTg8L2E+LiBbSURFXSBDb3B5RmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uIG5lZWRzIHRvIHJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIGphdmEuaW8uRmlsZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTczNjAiPkJ1ZyAxMTczNjA8L2E+LiBbSURFXSBSZWZyZXNoQWN0aW9uIG5lZWRzIHRvIHJlbW92ZSByZWZlcmVuY2UgdG8gamF2YS5pby5maWxlPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzM2MiI+QnVnIDExNzM2MjwvYT4uIFtJREVdIFJlbW92ZSByZWZlcmVuY2VzIHRvIGphdmEuaW8uRmlsZSBpbiBvcmcuZWNsaXBzZS51aS5kaWFsb2dzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzM2MyI+QnVnIDExNzM2MzwvYT4uIFBhdGhWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyBoYXMgcmVmZXJlbmNlcyB0byBqYXZhLmlvLmZpbGU8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzY0Ij5CdWcgMTE3MzY0PC9hPi4gW0lERV0gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLmRpYWxvZ3MgaGFzIHJlZmVyZW5jZXMgdG8gamF2YS5pby5GaWxlPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzUxOSI+QnVnIDExNzUxOTwvYT4uIFByb3ZpZGUgY2xlYXIoKSBtZXRob2Qgb24gTGlzdGVuZXJMaXN0PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzUzOSI+QnVnIDExNzUzOTwvYT4uIEludGVybWl0dGVudCBmYWlsdXJlcyBpbiBJbXBvcnRFeGlzdGluZ1Rlc3Q8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3NTQzIj5CdWcgMTE3NTQzPC9hPi4gW0RpYWxvZ3NdIE1ha2UgbG9uZyBQb3B1cERpYWxvZyB0aXRsZXMgcmVhZGFibGU8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3NTU0Ij5CdWcgMTE3NTU0PC9hPi4gW1dvcmtpbmdTZXRzXSBVSSB1c2FnZSBvZiBnZXROYW1lKCkgc2hvdWxkIGJlIG1pZ3JhdGVkIHRvIGdldExhYmVsKCk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3NTU5Ij5CdWcgMTE3NTU5PC9hPi4gW1dvcmtpbmdTZXRzXSBXb3JraW5nU2V0Q29tcGFyYXRvciBsb2dpYyBpcyBiYWNrd2FyZHM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3NTc2Ij5CdWcgMTE3NTc2PC9hPi4gW1dvcmtpbmdTZXRzXSBsYWJlbCBjaGFuZ2VzIGRvbnQgY2F1c2UgZXZlbnQgZmlyaW5nczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTc1OTEiPkJ1ZyAxMTc1OTE8L2E+LiBbQ29tbW9uTmF2aWdhdG9yXSBSZWZlcmVuY2VzIHRvIHRoZSBBV1QgYW5kIFN3aW5nIGxpYnJhcmllcyBzaG91bGQgYmUgcmVtb3ZlZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTc2MDEiPkJ1ZyAxMTc2MDE8L2E+LiBbVW5kb10gLSB1cGRhdGUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zIHRvIHVzZSBuZXcgZXF1aW5veCBjb21tb24gdXRpbHM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3NzA3Ij5CdWcgMTE3NzA3PC9hPi4gQ2Fubm90IGxhdW5jaCBVaVRlc3RTdWl0ZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTc4MTYiPkJ1ZyAxMTc4MTY8L2E+LiBDcmFzaCB3aGlsZSBydW5uaW5nIEpGYWNlIHRlc3Qgc3VpdGU8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3ODk5Ij5CdWcgMTE3ODk5PC9hPi4gW1dvcmtpbmdTZXRzXSBkb2N1bWVudCBuZXcgZW1wdHktYWdncmVnYXRlIHN0cmF0ZWd5PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODAyNSI+QnVnIDExODAyNTwvYT4uIFtEaWFsb2dzXSBQb3B1cERpYWxvZyBzaG91bGQgc2V0IGEgZ3JpZCBkYXRhIHRvIHRoZSBjb250cm9sIHJldHVybmVkIGZyb20gY3JlYXRlRGlhbG9nQXJlYTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTgwNDMiPkJ1ZyAxMTgwNDM8L2E+LiBbQ29tbWFuZHNdIHBhcmFtZXRlcnM6IEVsZW1lbnQgJ2NvbW1hbmRQYXJhbWV0ZXInIGlzIG5vdCBsZWdhbCBhcyBhIGNoaWxkIG9mIGVsZW1lbnQgJ2NvbW1hbmQnPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODA1NyI+QnVnIDExODA1NzwvYT4uIFtDb21tb25OYXZpZ2F0b3JdIElDb21tb25Db250ZW50UHJvdmlkZXIgc2hvdWxkIGJlIEFQSTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTgwODEiPkJ1ZyAxMTgwODE8L2E+LiBbQ29tbW9uTmF2aWdhdG9yXSBGYWlsdXJlIGluIE9wZW5UZXN0LnRlc3ROYXZpZ2F0b3JFeHRlbnNpb25FbmFibGVtZW50PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODExMiI+QnVnIDExODExMjwvYT4uIFtDb21tb25OYXZpZ2F0b3JdIEFkZCBBUEkgdG8gcHJvZ3JhbW1hdGljYWxseSBlbmFibGUvZGlzYWJsZSBleHRlbnNpb25zPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODE2MyI+QnVnIDExODE2MzwvYT4uIFtEaWFsb2dzXSAtIFBvcHVwRGlhbG9nIHNob3VsZCBkZWZpbmUgY29uc3RhbnRzIGZvciB6ZXJvIG1hcmdpbnM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4MTcwIj5CdWcgMTE4MTcwPC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gW1Jlc291cmNlXSBTdXBwb3J0IE9wZW4vT3BlbiBXaXRoIG1lbnUgZXh0ZW5zaW9uczxicj4KLSAgPC9wPgotCi08cD5JbnRlZ3JhdGlvbiBCdWlsZCAoTm92ZW1iZXIgMjIsIDIwMDUsIDE6MDAgcC5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3NDk2Ij5CdWcgMTE3NDk2PC9hPi4gW0NvbW1hbmRzXSBoYW5kbGVyczogU3RhY2sgb3ZlcmZsb3cgaW4gY29tbWFuZHM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3NTI2Ij5CdWcgMTE3NTI2PC9hPi4gW0NvbnRyaWJ1dGlvbnNdIFtDb21tYW5kc10gSmF2YWRvYyB3YXJuaW5ncyBpbiBOMjAwNTExMjItMDAxMDxicj4KLSAgPC9wPgotICAKLTxwPkludGVncmF0aW9uIEJ1aWxkIChOb3ZlbWJlciAyMiwgMjAwNSwgODowMCBhLm0uKTwvcD4KLSAgPHA+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9wPgotICA8cD4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzg4OSI+QnVnIDIzODg5PC9hPi4gW01hcmtlcnNdIE11bHRpLXNlbGVjdCBvbiBUYXNrIGRvZXNuJ3QgYWxsb3cgcXVpY2tmaXg8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM5OTIiPkJ1ZyA4Mzk5MjwvYT4uIFtNYXJrZXJzXSBFcnJvciBkZXNjcmlwdGlvbiBjb2x1bW4gaW4gUHJvYmxlbXMgaXMgZW1wdHk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE4OTkiPkJ1ZyA5MTg5OTwvYT4uIFtNYXJrZXJzXSBJTWFya2VyLnNldEF0dHJpYnV0ZSBmYWlscyB3aGVuIGF0dHJpYnV0ZU5hbWUgPSBJTWFya2VyLkxPQ0FUSU9OPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2ODkxIj5CdWcgOTY4OTE8L2E+LiBTdHJhbmdlIGVkaXRvckFjdGlvbnMgZXh0ZW5zaW9uczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDgwOTciPkJ1ZyAxMDgwOTc8L2E+LiBbTmF2aWdhdG9yXSBBSU9PQkUgd2hlbiBjYW5jZWxsaW5nIHBhc3RlIGFjdGlvbiBvdmVycmlkZSBxdWVzdGlvbjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDkyNDgiPkJ1ZyAxMDkyNDg8L2E+LiBbSURFXVtEaWFsb2dzXSBPdmVyd3JpdGUgRmlsZSBEaWFsb2cgc2hvdWxkIGRpc3BsYXkgZmlsZSBhdHRyaWJ1dGVzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTY2MSI+QnVnIDEwOTY2MTwvYT4uIFtQcmVzZW50YXRpb25dIEltcHJvdmUgY3VzdG9taXphYmxlIHdpbmRvdyB0cmltPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTcwMiI+QnVnIDEwOTcwMjwvYT4uIFtJREVdIFtQcm9ncmVzc10gc3RhcnR1cCB3b3Jrc3BhY2UgcmVmcmVzaCBibG9ja3MgdWk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEwMzg3Ij5CdWcgMTEwMzg3PC9hPi4gW1dvcmtiZW5jaFBhcnRzXSBFZGl0b3JQYXJ0I2lzRGlydHkoKSBtZXRob2QgY2FsbGVkIDUgdGltZXMgdXBvbiBvcGVuaW5nLjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTIwMDAiPkJ1ZyAxMTIwMDA8L2E+LiBbVmlld2Vyc10gVHJlZVZpZXdlciBTV1QuVklSVFVBTCBzdXBwb3J0Ljxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTIxNDYiPkJ1ZyAxMTIxNDY8L2E+LiBbRGlhbG9nc10gRWNsaXBzZSBjaGFuZ2VzIHNlbGVjdGlvbiBhZnRlciB1c2VyIG1ha2VzIGEgc2VsZWN0aW9uLjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTIyMzciPkJ1ZyAxMTIyMzc8L2E+LiBbR3JhcGhpY3NdIEV4cG9ydGluZyBrZXkgcHJlZmVyZW5jZXMgc2hvd3MgaWNvbiBvZiBkaWZmZXJlbnQgdHlwZSBvZiBrZXk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzNjQzIj5CdWcgMTEzNjQzPC9hPi4gW0RpYWxvZ3NdIElucHV0RGlhbG9nIE5QRSBpbiBzZXRFcnJvck1lc3NhZ2UoLi4uKSB3aGVuIE9LIEJ1dHRvbiBpcyBjcmVhdGVkIGluIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoLi4uKTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTM3ODgiPkJ1ZyAxMTM3ODg8L2E+LiBbTWFya2Vyc10gTXVsdGktUXVpY2tGaXggZGlhbG9nIG5lZWRzIGEgc2VsZWN0L2Rlc2VsZWN0IGFsbCBidXR0b248YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzODMyIj5CdWcgMTEzODMyPC9hPi4gW1dvcmtpbmdTZXRzXSBObyB3YXkgdG8gZGlzYWJsZSB3aW5kb3cgd29ya2luZyBzZXRzLjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQyOTUiPkJ1ZyAxMTQyOTU8L2E+LiBbQ29tbW9uTmF2aWdhdG9yXSBWZXJpZnkgY29weXJpZ2h0IG5vdGljZXM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0NTY1Ij5CdWcgMTE0NTY1PC9hPi4gW01hcmtlcnNdIFF1aWNrIGZpeCBjb21wdXRhdGlvbiBkb25lIGluIFVJIHRocmVhZCB3aXRoIG5vIHByb2dyZXNzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDY0OCI+QnVnIDExNDY0ODwvYT4uIGV4cG9ydCBmaWxlIHN5c3RlbS9hcmNoaXZlIHdpemFyZCBpbml0YWxseSBoYXMgZXJyb3Igd2hlbiBubyBzZWxlY3Rpb24gc2VlZGVkPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDc1NCI+QnVnIDExNDc1NDwvYT4uIFtNYXJrZXJzXSBRdWlja0ZpeCBuZWVkcyBBUEkgdG8gdXBkYXRlIHJlc29sdXRpb25zPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDgwMSI+QnVnIDExNDgwMTwvYT4uIFVwZGF0ZXMgdG8gcmVzb3VyY2UgaW5mbyBwcm9wZXJ0eSBwYWdlPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTYzMCI+QnVnIDExNTYzMDwvYT4uIFtNYXJrZXJzXSBOZXcgbWFya2VyU3VwcG9ydCBmZWF0dXJlcyBhcmUgbm90IGR5bmFtaWM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1Njk0Ij5CdWcgMTE1Njk0PC9hPi4gW0ltcG9ydC9FeHBvcnRdIEdlbmVyYWwgbm9kZSBpbiBuZXcgd2l6YXJkcyBzaG91bGQgYXBwZWFyIGZpcnN0PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTgwMCI+QnVnIDExNTgwMDwvYT4uIFtpbXBvcnQvZXhwb3J0XSBTdGFjayBvdmVyZmxvdyBkdXJpbmcgaW1wb3J0IHppcDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTYwOTUiPkJ1ZyAxMTYwOTU8L2E+LiBbUHJlZmVyZW5jZXNdIFNjb3BlZFByZWZlcmVuY2VTdG9yZSBjYXVzaW5nIG1lbW9yeSBsZWFrIGFuZCBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTYxMzYiPkJ1ZyAxMTYxMzY8L2E+LiBbRGlhbG9nc10gRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbnMoKSBkb2VzIG5vdCB3b3JrPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjIzMCI+QnVnIDExNjIzMDwvYT4uIEZhaWx1cmVzIGluIFNlc3Npb24gVGVzdHMgKE4yMDA1MTExMy0wMDEwKTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY2NzMiPkJ1ZyAxMTY2NzM8L2E+LiBbVW5kb10gV29ya2JlbmNoIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gT3BlcmF0aW9uSGlzdG9yeUFjdGlvbkhhbmRsZXI8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2Njg1Ij5CdWcgMTE2Njg1PC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gQ2xhc3NDYXN0RXhjZXB0aW9uIHRyeWluZyB0byBleGVjdXRlIGFjdGlvbjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY3NzAiPkJ1ZyAxMTY3NzA8L2E+LiBbVmlld2Vyc10gTWVtb3J5IGxlYWsgaW4gVHJlZVZpZXdlclRlc3QsIG9yIFRyZWVWaWV3ZXIsIG9yIFRyZWU8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2OTExIj5CdWcgMTE2OTExPC9hPi4gW01hcmtlcnNdIFVudXNlZCBOTFMgbWVzc2FnZXMgcmVwb3J0ZWQgaW4gbG9nPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzA2NSI+QnVnIDExNzA2NTwvYT4uIFtDb21tb25OYXZpZ2F0b3JdIFNob3VsZCBzdXBwb3J0IGJldHRlciBmaWx0ZXJpbmcgb2YgZHVwbGljYXRlIGNvbnRlbnQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MDc5Ij5CdWcgMTE3MDc5PC9hPi4gW0tleUJpbmRpbmdzXSByZWdpc3RyeTogQmluZGluZ1BlcnNpc3RhbmNlIHNob3VsZCBjbGVhbiB1cCBpdHMgcHJlZmVyZW5jZSBzdG9yZSBsaXN0ZW5lcjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTcwODciPkJ1ZyAxMTcwODc8L2E+LiBbUGVyc3BlY3RpdmVzXSBQZXJzcGVjdGl2ZVJlZ2lzdHJ5IGxlYWtpbmcgYSBwcmVmZXJlbmNlIHN0b3JlIGxpc3RlbmVyPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzMxNCI+QnVnIDExNzMxNDwvYT4uIFtDb21tYW5kc10gaGFuZGxlcnM6IEZhaWx1cmUgaW4gdGVzdFNlbGVjdEFsbEhhbmRsZXJTZW5kc1NlbGVjdGlvbkV2ZW50PGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChOb3ZlbWJlciAxNSwgMjAwNSwgODowMCBhLm0uKTwvcD4KLSAgPHA+TmV3PC9wPgotICA8cD5WZXJzaW9uIG51bWJlcnMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gaW5jbHVkZSB0aGUgcXVhbGlmaWVyLiAgVGhpcyBzaG91bGQKLSAgbWVhbiB0aGF0IGV2ZXJ5IGJ1aWxkIGZyb20gbm93IG9uIHdpbGwgaGF2ZSBhIHVuaXF1ZSB2ZXJzaW9uIGZvciBvdXIgCi0gIHBsdWctaW5zLiAgVGhlIHZlcnNpb24gbnVtYmVyIGZvciBhbGwgcGx1Zy1pbnMgZm9yIHRoaXMgcmVsZWFzZSB3aWxsIGJlCi0gIDMuMi4wLnF1YWxpZmllci48L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjkwNzYiPkJ1ZyA2OTA3NjwvYT4uIFtWaWV3ZXJzXSBCdWdzIGluIGpmYWNlIExpc3RWaWV3ZXIgJnF1b3Q7cmV2ZWFsJnF1b3Q7IG1ldGhvZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NjcwNCI+QnVnIDk2NzA0PC9hPi4gW0ltcG9ydC9FeHBvcnRdIEltcG9ydCBkb2Vzbid0IGltcG9ydCBlbXB0eSBkaXJlY3Rvcmllczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDM1MDEiPkJ1ZyAxMDM1MDE8L2E+LiBJbXBvcnQgYW5kIEV4cG9ydCBtZW51IG9wdGlvbnMgc2hvdWxkIGJlIG1lcmdlZC48YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4MDMzIj5CdWcgMTA4MDMzPC9hPi4gW1dvcmtiZW5jaFBhcnRzXSByZWdyZXNzaW9uOiBWaWV3IFRhYiBPcmRlcnMgbG9zdCBhZnRlciByZXN0YXJ0PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTY2MSI+QnVnIDEwOTY2MTwvYT4uIFtQcmVzZW50YXRpb25dIEltcHJvdmUgY3VzdG9taXphYmxlIHdpbmRvdyB0cmltPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzU3NiI+QnVnIDExMzU3NjwvYT4uIFtEaWFsb2dzXSBQb3B1cERpYWxvZydzIHNlcGFyYXRvciBpcyB0b28gdGhpbjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ1OTEiPkJ1ZyAxMTQ1OTE8L2E+LiBbSW1wb3J0L0V4cG9ydF0gJnF1b3Q7Q29weSBwcm9qZWN0cyBpbnRvIHdvcmtzcGFjZSZxdW90OyByZW1haW5zIGNoZWNrZWQgYWZ0ZXIgc3dpdGNoaW5nIGZyb20gYXJjaGl2ZSB0byBkaXJlY3Rvcnk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0NjU4Ij5CdWcgMTE0NjU4PC9hPi4gW0ltcG9ydC9FeHBvcnRdIEltcG9ydCBFeGlzdGluZyBQcm9qZWN0cyBpbnRvIFdvcmtzcGFjZSAtIG1pc2xlYWRpbmcgd2l6YXJkIGRlc2NyaXB0aW9uPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDc2MCI+QnVnIDExNDc2MDwvYT4uIFtNYXJrZXJzXSBIZWlyYXJjaHkgaW4gcHJvYmxlbXMgdmlldyBzaG91bGQgbm90IGJlIGJhc2VkIG9uIHNvcnQgb3JkZXI8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MTIzIj5CdWcgMTE1MTIzPC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gVXBkYXRlIGV4dGVuc2lvbiBwb2ludCBzY2hlbWEgZG9jIGZvciBuYXZpZ2F0b3JDb250ZW50PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTIwNSI+QnVnIDExNTIwNTwvYT4uIFtEaWFsb2dzXSBTaG93IFZpZXcgd2luZG93cyBjb250ZW50cyBub3QgcmVzaXplZCBjb3JyZWN0bHk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MjE4Ij5CdWcgMTE1MjE4PC9hPi4gW0NvbW1vbk5hdmlnYXRvcl0gQnJpbmcgYmFjayB0aGUgbWVtb3J5IG1lY2hhbmlzbSByZW1vdmVkIGR1cmluZyB0aGUgcG9ydCB0byBXVFA8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MjgzIj5CdWcgMTE1MjgzPC9hPi4gW01QRV0gTlBFIGluIE11bHRpUGFnZUVkaXRvclBhcnQjcGFnZUNoYW5nZShpbnQpPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTM5OSI+QnVnIDExNTM5OTwvYT4uIFN5c3RlbS5vdXQgc3R1ZmYgaW4gTXVsdGlFZGl0b3JUZXN0PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTU1NyI+QnVnIDExNTU1NzwvYT4uIFtXb3JraW5nU2V0c10gU2VsZWN0IGFsbCAvIERlc2VsZWN0IGFsbCBmb3IgJ1NlbGVjdCB3b3JraW5nIHNldCcgZGlhbG9nPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTU3NSI+QnVnIDExNTU3NTwvYT4uIFtKRmFjZV0gV2luZG93IGRvY3VtZW50YXRpb24gcmVmZXJyaW5nIHRvIG5vbmV4aXN0ZW50IG1ldGhvZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTU2MDAiPkJ1ZyAxMTU2MDA8L2E+LiBbQ29tbW9uTmF2XSBOYXZpZ2F0b3IgZmlsbHMgLmxvZyB3aXRoIG1pc3NpbmcgTkxTIG1lc3NhZ2VzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTY3MiI+QnVnIDExNTY3MjwvYT4uIFtJbXBvcnQvRXhwb3J0XSBTcGFjZXMgaW4gYSB0YXIgZmlsZSBjaGVja3N1bSBjb25mdXNlIHRoZSB0YXIgaW1wb3J0ZXI8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1NjgxIj5CdWcgMTE1NjgxPC9hPi4gW1ZpZXdlcnNdIE5QRSBpbiBzaG93IHZpZXcgZmlsdGVyPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTczMCI+QnVnIDExNTczMDwvYT4uIFtLZXlCaW5kaW5nc10gbWlzYzogV29ya2JlbmNoS2V5Ym9hcmQgY2lyY3VtbmF2aWdhdGVzIElFeGVjdXRpb25MaXN0ZW5lci5ub3RIYW5kbGVkKC4uLik8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1NzMxIj5CdWcgMTE1NzMxPC9hPi4gV29ya2luZ0NvcHlQcmVmZXJlbmNlcy5yZW1vdmVOb2RlIGlzIGJyb2tlbjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTU3NjEiPkJ1ZyAxMTU3NjE8L2E+LiBbVW5kb10gTlBFIGluIE9wZXJhdGlvbkhpc3RvcnlBY3Rpb25IYW5kbGVyPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTgwMCI+QnVnIDExNTgwMDwvYT4uIFtpbXBvcnQvZXhwb3J0XSBTdGFjayBvdmVyZmxvdyBkdXJpbmcgaW1wb3J0IHppcDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTU4OTEiPkJ1ZyAxMTU4OTE8L2E+LiBbV29ya2luZ1NldHNdIFNlbGVjdGlvbiBkaWFsb2cgc2hvdWxkIHVzZSByYWRpbyBidXR0b25zLCBub3QgYSBjb21ibzxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTU4OTgiPkJ1ZyAxMTU4OTg8L2E+LiBbQ29tbW9uTmF2aWdhdG9yXSBjb21wb25lbnQueG1sIHJlcXVpcmVkPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjA2MSI+QnVnIDExNjA2MTwvYT4uIEdlbmVyYWwgJmd0OyBBcHBlYXJhbmNlIHByZWYgcGFnZS4gUmVzdG9yZSBEZWZhdWx0cyBkb2VzIG5vdCBjaGFuZ2UgJnF1b3Q7Q3VycmVudCBUaGVtZSZxdW90OyBjb21ibzxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTYxMDUiPkJ1ZyAxMTYxMDU8L2E+LiBCdWcgaW4gTGlzdC5qYXZhIG9uIHRoZSBNYWMgcmVnYXJkaW5nIHNob3dTZWxlY3Rpb248YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjM0Ij5CdWcgMTE2MjM0PC9hPi4gRmFpbHVyZSBpbiB0ZXN0SW1wb3J0U2luZ2xlRGlyZWN0b3J5V2l0aENvcHlEZWxldGVQcm9qZWN0S2VlcENvbnRlbnRzPGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChOb3ZlbWJlciAwOCwgMjAwNSwgODowMCBhLm0uKTwvcD4KLSAgPHA+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9wPgotICA8cD4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgzNSI+QnVnIDE5ODM1PC9hPi4gW01QRV0gTXVsdGlQYWdlRWRpdG9yUGFydC5yZW1vdmVQYWdlKCkgZG9lcyBub3QgZGlzcG9zZSBjb250cm9sczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjM4MCI+QnVnIDYyMzgwPC9hPi4gW0Zhc3RWaWV3c10gVmlldyBtZW51IGtleWJvYXJkIHNob3J0Y3V0IG5vdCB3b3JraW5nIGluIGZhc3Qgdmlld3M8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzIyOTciPkJ1ZyA3MjI5NzwvYT4uIFtEbkRdIFZpZXdlckRyb3BBZGFwdGVyIGltcG9zc2libGUgdG8gc2V0IERORC5GRUVEQkFDS19OT05FPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcyNDk4Ij5CdWcgNzI0OTg8L2E+LiBbRGV0YWNoZWRWaWV3XSBEZXRhY2hlZCB3aW5kb3dzIGhhdmUgbm8gbWluaW11bSBzaXplPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc1NDIyIj5CdWcgNzU0MjI8L2E+LiBbUHJlc2VudGF0aW9uc10gU3dpdGNoaW5nIHByZXNlbnRhdGlvbiB0byBSMjEgc3dpdGNoZXMgaW1tZWRpYXRlbHksIGJ1dCBvbmx5IHBhcnRpYWxseTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDY0NCI+QnVnIDgwNjQ0PC9hPi4gW0tleUJpbmRpbmdzXSBtaXNjOiBXcm9uZyBzaG9ydGN1dCBkaXNwbGF5ZWQgaW4gbWVudSBmb3IgY29weSB1c2luZyBFbWFjczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDgzMyI+QnVnIDgwODMzPC9hPi4gW0ltcG9ydC9FeHBvcnRdIEltcG9ydCBleGlzaXRpbmcgc2hvdWxkIHByZS1jaGVjayBmb3IgcHJvamVjdCBhbHJlYWR5IGluIHdvcmtzcGFjZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04Njk5OSI+QnVnIDg2OTk5PC9hPi4gW0tleUJpbmRpbmdzXSBtaXNjOiBDdHJsK0luc2VydCBzaG93biBhcyBwcmltYXJ5IGJpbmRpbmc8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTY3MDQiPkJ1ZyA5NjcwNDwvYT4uIFtJbXBvcnQvRXhwb3J0XSBJbXBvcnQgZG9lc24ndCBpbXBvcnQgZW1wdHkgZGlyZWN0b3JpZXM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAwOTE2Ij5CdWcgMTAwOTE2PC9hPi4gW01hcmtlcnNdIE1hcmtlckltYWdlUHJvdmlkZXJUZXN0IGlzIHVzaW5nIGEgbWlzc2luZyBpbWFnZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDgwMTYiPkJ1ZyAxMDgwMTY8L2E+LiBbTWFya2Vyc10gTmVlZCB0byBiZSBhYmxlIHRvIGNhdGVnb3JpemUgbWFya2VyIHR5cGVzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTU0NCI+QnVnIDEwOTU0NDwvYT4uIFtUaGVtZXNdIE1ha2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudGhlbWVzLkNvbG9yVXRpbHMgcHVibGljIEFQSTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk5NzciPkJ1ZyAxMDk5Nzc8L2E+LiBbSW1wb3J0L0V4cG9ydF0gd2l6YXJkOiBPcmRlciBvZiBncm91cCBub2Rlczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTE4MzkiPkJ1ZyAxMTE4Mzk8L2E+LiBbQWN0aXZpdHlNZ210XSBlLnByaW50U3RhY2tUcmFjZSgpIGluIEFjdGl2aXR5Q2F0ZWdvcnlQcmVmZXJlbmNlUGFnZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ0ODgiPkJ1ZyAxMTQ0ODg8L2E+LiBbV29ya2luZ1NldHNdIHNlbGVjdCB3b3JraW5nIHNldCBkaWFsb2cgc2hvdWxkIGJlIHJlc2l6YWJsZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ1MTQiPkJ1ZyAxMTQ1MTQ8L2E+LiBbV29ya2luZ1NldHNdIE5lZWQgQVBJIHRvIGRldGVjdCB3aGV0aGVyIGEgd29ya2luZyBzZXQgcHJvdmlkZSBhbiB1cGRhdGVyIG9yIG5vdDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ2MTUiPkJ1ZyAxMTQ2MTU8L2E+LiBbTWFya2Vyc10gTm8gZmVlZGJhY2sgZm9yICdDb21wbGV0ZWQnIHRhc2tzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDYzNyI+QnVnIDExNDYzNzwvYT4uIFtQcmVmZXJlbmNlc10gUGxhdGZvcm1VSS5nZXRQcmVmZXJlbmNlU3RvcmUoKSAhPSBXb3JrYmVuY2hQbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0NjU4Ij5CdWcgMTE0NjU4PC9hPi4gW0ltcG9ydC9FeHBvcnRdIEltcG9ydCBFeGlzdGluZyBQcm9qZWN0cyBpbnRvIFdvcmtzcGFjZSAtIG1pc2xlYWRpbmcgd2l6YXJkIGRlc2NyaXB0aW9uPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDY2NSI+QnVnIDExNDY2NTwvYT4uIFtJbXBvcnQvRXhwb3J0XSAtIEltcG9ydCBleGlzdGluZyBwcm9qZWN0cyBpbnRvIHdvcmtzcGFjZSAtIGRpZG4ndCBjb3B5IGZpbGVzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDc4NCI+QnVnIDExNDc4NDwvYT4uIFtNYXJrZXJzXVtXb3JraW5nU2V0c10gU3RyYW5nZSB3b3JraW5nIHNldCBuYW1lICZxdW90O0FnZ3JlZ2F0ZSBmb3Igd2luZG93IDExMzA5NDg4OTgyMTgmcXVvdDs8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0ODE5Ij5CdWcgMTE0ODE5PC9hPi4gW1Byb2dyZXNzXSBHcm91cHMgc2hvdyB1cCB0d2ljZSBpbiB0aGUgcHJvZ3Jlc3Mgdmlldzxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ4OTkiPkJ1ZyAxMTQ4OTk8L2E+LiBbS2V5QmluZGluZ3NdIG1pc2M6IFNoaWZ0K0N0cmwrQyBkb2VzIG5vdCB3b3JrIHVubGVzcyBleHBsaWNpdGx5IHJlZGVmaW5lZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ5NjIiPkJ1ZyAxMTQ5NjI8L2E+LiBbRGVjb3JhdG9yc10gUmVtb3ZlIERlY29yYXRvclVwZGF0ZUxpc3RlbmVyIGNsYXNzIGZyb20gSURFIHBsdWctaW48YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MzA0Ij5CdWcgMTE1MzA0PC9hPi4gW1Byb2dyZXNzXSBDb2xvciBhbmQgQ3Vyc29yIGxlYWtzIGluIFByb2dyZXNzSW5mb0l0ZW08YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzMDk0ODg5ODIxOCI+QnVnIDExMzA5NDg4OTgyMTg8L2E+LiBJbnZhbGlkIEJ1ZyBJRDxicj4KLSAgPC9wPgotCi08cD5JbnRlZ3JhdGlvbiBCdWlsZCAoTm92ZW1iZXIgMiwgMjAwNSwgNDowMCBwLm0uKTwvcD4KLSAgPHA+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9wPgotICA8cD4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQyNDAiPkJ1ZyAxMTQyNDA8L2E+LiBbVGhlbWVzXSBOZXcgRGlhbG9nIGZvbnRzIGRvbid0IHRha2U8YnI+Ci0gIDwvcD4KLQotPHA+SW50ZWdyYXRpb24gQnVpbGQgKE5vdmVtYmVyIDAyLCAyMDA1LCAxMjowMCBwLm0uKTwvcD4KLSAgPHA+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9wPgotICA8cD4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ3NDIiPkJ1ZyAxMTQ3NDI8L2E+LiBQbGVhc2UgZGlzYWJsZSBNdWx0aSBRdWljayBmaXggc3VwcG9ydCBpbiB0aGUgcHJvYmxlbXMgdmlldyBmb3IgTTM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0NzczIj5CdWcgMTE0NzczPC9hPi4gW01hcmtlcnNdIFJlZHVuZGFudCBpbmZvcm1hdGlvbiBpbiB0aGUgUHJvYmxlbXMgdmlldyB3aGVuIEZsYXQ8YnI+Ci0gIDwvcD4KLQotPHA+SW50ZWdyYXRpb24gQnVpbGQgKE5vdmVtYmVyIDAyLCAyMDA1LCAxMjoxMCBhLm0uKTwvcD4KLSAgPHA+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9wPgotICA8cD4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ1NDEiPkJ1ZyAxMTQ1NDE8L2E+LiBbTWFya2Vyc10gQ2xhc3NDYXN0RXhjZXB0aW9uIHNlbGVjdGluZyBlbGVtZW50IGluIHByb2JsZW1zIHRyZWU8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0NTQyIj5CdWcgMTE0NTQyPC9hPi4gW01hcmtlcnNdIFBvc3NpYmxlIHRvIGdldCBlbXB0eSBwYXRoIG5vZGVzIGluIHByb2JsZW1zIHZpZXcgaGllcmFyY2FobCBtb2RlPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDU1MCI+QnVnIDExNDU1MDwvYT4uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gUHJvYmxlbXMgSGllcmFyY2hhbCBNb2RlPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDU5OCI+QnVnIDExNDU5ODwvYT4uIENsYXNzQ2FzdEV4Y2VwdGlvbiB3aGVuIG1lbnUgcG9wcGVkIHVwIG9uIFBlbmRpbmcuPGJyPgotICA8L3A+Ci0gIAotPHA+SW50ZWdyYXRpb24gQnVpbGQgKE9jdG9iZXIgMzEsIDIwMDUsIDg6MDAgcC5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzczNDUiPkJ1ZyA3NzM0NTwvYT4uIFtLZXlCaW5kaW5nc10gYXNzaXN0OiBMb29rIG9mIEtleSBBc3Npc3QgZGlhbG9nIGlzIG5vdCBjb25zaXN0ZW50IHdpdGggb3RoZXIgaW5mbyBkaWFsb2dzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDM5MCI+QnVnIDExNDM5MDwvYT4uIFtNYXJrZXJzXSBTaG93IEluIG1lbnUgaXRlbSBlbmFibGVkIGZvciBjYXRlZ29yaWVzPGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChBdWd1c3QgMjUsIDIwMDUsIDg6MDAgYS5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzA1OTciPkJ1ZyA3MDU5NzwvYT4uIFtEbkRdIERyYWcgYW5kIERyb3AgUGx1Z2luVHJhbnNmZXJEYXRhIGNvbmZ1c2lvbjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MTYwMCI+QnVnIDcxNjAwPC9hPi4gW0RldGFjaGVkVmlld10gQ2Fubm90IGdldCBGb2N1cyBvbiBtYWluIHdpbmRvdyB0aXRsZS9tZW51cyBhZnRlciBkaWFsb2cgYm94IGNsb3Nlczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MjM3NCI+QnVnIDcyMzc0PC9hPi4gW0RpYWxvZ3NdIFByb3ZpZGUgYSBnZW5lcmljIGluZm8gcG9wIGRpYWxvZzxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjMwNyI+QnVnIDg2MzA3PC9hPi4gW1dvcmtiZW5jaFBhcnRzXSBJV29ya2JlbmNoUGFnZS5vcGVuRWRpdG9yKCkgY2FsbGVkIHdpdGggdGhlIGFjdGl2YXRlPT1mYWxzZSwgdW5tYXhpbWl6ZXMgdGhlIGN1cnJlbnQgdmlldy48YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTY0OTEiPkJ1ZyA5NjQ5MTwvYT4uIFtQcmVzZW50YXRpb25zXSBGbG9hdGluZyB0b29sYmFyIGJ1dHRvbnMgb3ZlciBtYXhpbWl6ZWQgdmlldzxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDIwODEiPkJ1ZyAxMDIwODE8L2E+LiBBYmFuZG9uIHRoZSBjb21ibyBib3ggb2YgcHJlZmVyZW5jZURpYWxvZzxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDI4OTMiPkJ1ZyAxMDI4OTM8L2E+LiBbV29ya2luZ1NldHNdIE5lc3RlZCBXb3JraW5nU2V0czxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDUzNTEiPkJ1ZyAxMDUzNTE8L2E+LiBbUHJlc2VudGF0aW9uc10gRXhjZXB0aW9uIEFic3RyYWN0VGFiRm9sZGVyLmdldEl0ZW08YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1ODc0Ij5CdWcgMTA1ODc0PC9hPi4gW0RuRF0gW1JDUF0gVW5hYmxlIHRvIHBlcmZvcm0gRFJPUF9MSU5LIG9wZXJhdGlvbnMgaW4gdGhlIGVkaXRvciBhcmVhPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjM0NiI+QnVnIDEwNjM0NjwvYT4uIE1vdmUgUmVzb3VyY2VNYXBwaW5nIGJhY2sgdG8gQVBJIHBhY2thZ2U8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4MTYyIj5CdWcgMTA4MTYyPC9hPi4gW1Byb2dyZXNzXSBbSURFXSBEZWFkbG9jayB1c2luZyBNb3ZlRmlsZXNBbmRGb2xkZXJzT3BlcmF0aW9uIGZyb20gYSByZWZhY3RvcmluZyBwYXJ0aWNpcGFudDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDkxNzQiPkJ1ZyAxMDkxNzQ8L2E+LiBbV29ya2luZ1NldHNdIGNvbXBhdGliaWxpdHkgd29ya2luZyBzZXQgdG8gYnJpZGdlIG5ldyBwYWdlLWxldmVsIGZ1bmN0aW9uYWxpdHk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMDU0Ij5CdWcgMTExMDU0PC9hPi4gW01hcmtlcnNdIEZpbHRlcmluZyBpbiBwcm9ibGVtcyB2aWV3IHNob3VsZCBjb25zaWRlciByZXNvdXJjZSBtYXBwaW5nczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTE0MjUiPkJ1ZyAxMTE0MjU8L2E+LiBbTWFya2Vyc10gUHJvYmxlbXMgVmlldyBuZWVkcyB0byBzdXBwb3J0IGEgY2F0ZWdvcnkgYXR0cmlidXRlIGZvciBtYXJrZXJzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjkyMiI+QnVnIDExMjkyMjwvYT4uIFByb2JsZW1zIHZpZXcgcmVmcmVzaGVzIG9uIGFkZCBhbmQgcmVtb3ZlPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjk0MSI+QnVnIDExMjk0MTwvYT4uIFtNYXJrZXJzXSBOZWVkIGEgaGllcmFyY2hhbCBtb2RlIGZvciB0aGUgcHJvYmxlbXMgdmlldzxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTMwODUiPkJ1ZyAxMTMwODU8L2E+LiBbUGVyc3BlY3RpdmVzXSBwZXJzcGVjdGl2ZUV4dGVuc2lvbjogcmVxdWlyZWQgYXR0cmlidXRlICZxdW90O3JlbGF0aXZlJnF1b3Q7Pzxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTMyMzEiPkJ1ZyAxMTMyMzE8L2E+LiBbTWFya2Vyc10gUHJvYmxlbSB2aWV3IGRvZXMgbm90IHJlbW92ZSBvbGQgZWxlbWVudHMgd2hlbiByZWZyZXNoZWQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzMjU1Ij5CdWcgMTEzMjU1PC9hPi4gRG91YmxlIGNsaWNrIHNob3VsZCBleHBhbmQgaW1wb3J0L2V4cG9ydCB0cmVlczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTMyNzYiPkJ1ZyAxMTMyNzY8L2E+LiBNb2RlbFByb3ZpZGVyIHBhdGNoIHRvIHN1cHBvcnQgbG9naWNhbCBtb2RlbHM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzNTgyIj5CdWcgMTEzNTgyPC9hPi4gRGVhZGxvY2sgdXBkYXRpbmcgbWFya2VyIGxpc3QgZHVyaW5nIGJ1aWxkcy48YnI+Ci0gIDwvcD4KLQotPHA+SW50ZWdyYXRpb24gQnVpbGQgKE9jdG9iZXIgMTgsIDIwMDUsIDg6MDAgYS5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0MjgiPkJ1ZyAxMTQyODwvYT4uIFdpbGRjYXJkIHNlYXJjaCBkb2VzIG5vdCB3b3JrPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTgzIj5CdWcgMTE5ODM8L2E+LiBSdW4gdGltZSB3b3JrYmVuY2ggd2l6YXJkIGhhcyB0aXRsZSBjdXQgb2ZmIGZvciBsYXJnZSBmb250cy48YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM3MTEiPkJ1ZyA4MzcxMTwvYT4uIFtKRmFjZV0gTlBFIGluIERldmljZVJlc291cmNlTWFuYWdlci5hbGxvY2F0ZSgpPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDA0NyI+QnVnIDEwNDA0NzwvYT4uIFtEaWFsb2dzXSBJbmNvcnJlY3QgT3V0cHV0IGZyb20gRGlhbG9nU2V0dGluZ3Muc2F2ZSgpPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjM0NiI+QnVnIDEwNjM0NjwvYT4uIE1vdmUgUmVzb3VyY2VNYXBwaW5nIGJhY2sgdG8gQVBJIHBhY2thZ2U8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEwMDc2Ij5CdWcgMTEwMDc2PC9hPi4gW1VuZG9dIFVuZG8vUmVkb0FjdGlvbkhhbmRsZXIgbml0czxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEwNTQiPkJ1ZyAxMTEwNTQ8L2E+LiBbTWFya2Vyc10gRmlsdGVyaW5nIGluIHByb2JsZW1zIHZpZXcgc2hvdWxkIGNvbnNpZGVyIHJlc291cmNlIG1hcHBpbmdzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTQyNSI+QnVnIDExMTQyNTwvYT4uIFtNYXJrZXJzXSBQcm9ibGVtcyBWaWV3IG5lZWRzIHRvIHN1cHBvcnQgYSBjYXRlZ29yeSBhdHRyaWJ1dGUgZm9yIG1hcmtlcnM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExNDI5Ij5CdWcgMTExNDI5PC9hPi4gW01hcmtlcnNdIE11bHRpLXNlbGVjdCBxdWlja2ZpeCBkb2VzIG5vdCBiYXRjaCBjb25maXJtYXRpb24gYW5kIHN0b3BzIG9uIGZpcnN0IGZhaWx1cmU8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExNTcxIj5CdWcgMTExNTcxPC9hPi4gW01hcmtlcnNdIEFwcGx5aW5nIG11bHRpcGxlIHF1aWNrIGZpeGVzIHNob3VsZCBhbGxvdyBzaW5nbGUgYXBwbGljYXRpb248YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExNzU3Ij5CdWcgMTExNzU3PC9hPi4gRml4IGNvbXBpbGUgZXJyb3JzIGluIE1BTklGRVNULk1GPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjEwNiI+QnVnIDExMjEwNjwvYT4uIFtLZXlCaW5kaW5nc10gQ2hhbmdlZCBzaG9ydGN1dCBrZXlzIGRvbid0IHRha2UgZWZmZWN0PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjEzNiI+QnVnIDExMjEzNjwvYT4uIEltcG9ydFRlc3RTb3VyY2UgZGlyZWN0b3J5IGxlZnQgaW4gaG9tZSBkaXJlY3RvcnkgYWZ0ZXIgcnVubmluZyB0ZXN0czxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTIyNDAiPkJ1ZyAxMTIyNDA8L2E+LiBbVmlld2Vyc10gVGFibGVMYXlvdXQgc2hvdWxkIGFsc28gc3VwcG9ydCB0cmVlcy48YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyMjQ3Ij5CdWcgMTEyMjQ3PC9hPi4gW1ByZWZlcmVuY2VzXSBbUkNQXSBTaG91bGQgcmVtb3ZlIHVudXNlZCBwcmVmcyBmb3Igc2hvd2luZyBhY3Rpb24gYmFyczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTI0OTAiPkJ1ZyAxMTI0OTA8L2E+LiBQYXRjaCB0byBmaXggdGhlIG1lc3MgSSBtYWRlPGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChPY3RvYmVyIDA0LCAyMDA1LCA4OjAwIGEubS4pPC9wPgotICA8cD5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L3A+Ci0gIDxwPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzODkiPkJ1ZyAyMzg5PC9hPi4gW01QRV0gVGFrZSBvdXQgd29ya2Fyb3VuZCBpbiBNdWx0aVBhZ2VFZGl0b3JQYXJ0LnBhZ2VDaGFuZ2UoaW50KSAoMUdFVjk0SSk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MzUiPkJ1ZyAxOTgzNTwvYT4uIFtNUEVdIE11bHRpUGFnZUVkaXRvclBhcnQucmVtb3ZlUGFnZSgpIGRvZXMgbm90IGRpc3Bvc2UgY29udHJvbHM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4MzEiPkJ1ZyAyMDgzMTwvYT4uIFtNUEVdIE11bHRpUGFnZUVkaXRvclBhcnQuc2V0QWN0aXZlUGFnZSgpIGRvZXNuJ3Qgc2VuZCBwYWdlQ2hhbmdlKCk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM4ODkiPkJ1ZyAyMzg4OTwvYT4uIFtNYXJrZXJzXSBNdWx0aS1zZWxlY3Qgb24gVGFzayBkb2Vzbid0IGFsbG93IHF1aWNrZml4PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4NjQyIj5CdWcgMzg2NDI8L2E+LiBbTVBFXSBNdWx0aUVkaXRvciBkb2VzIG5vdCBzaWduYWwgaW5uZXIgZWRpdG9ycyBjbG9zaW5nIGV2ZW50czxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NjI4NCI+QnVnIDk2Mjg0PC9hPi4gW1Byb3BlcnRpZXNdIENsaWNraW5nIE9LIG9uIFByb3BlcnRpZXMgcGFnZSBvZiBwbHVnaW4ueG1sIGdpdmVzIHVuZXhwZWN0ZWQgJnF1b3Q7Q29uZmxpY3QgaW4gRW5jb2RpbmcmcXVvdDs8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTk4NTgiPkJ1ZyA5OTg1ODwvYT4uIFtJREVdIEVycm9yIHVwb24gZGVsZXRpbmcgYSBwcm9qZWN0Ljxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDA2OTMiPkJ1ZyAxMDA2OTM8L2E+LiBbSW1wb3J0L0V4cG9ydF0ganVuaXQgdGVzdHMgZm9yIFdpemFyZFByb2plY3RzSW1wb3J0UGFnZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDczNzciPkJ1ZyAxMDczNzc8L2E+LiBbR2xvYmFsQWN0aW9uc10gTlBFIGRlbGV0aW5nIGEgZmlsZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc5NzgiPkJ1ZyAxMDc5Nzg8L2E+LiBbTWFya2Vyc10gTmV3IGZpbHRlciBpcyBub3Qgc2VsZWN0ZWQgaW4gcHJvYmxlbXMgZmlsdGVycyBkaWFsb2c8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4MzE0Ij5CdWcgMTA4MzE0PC9hPi4gW0NvbnRyaWJ1dGlvbnNdIFBvcHVwTWVudUV4dGVuZGVyIGRvZXMgbm90IHVwZGF0ZSBsaXN0IG9mIHN0YXRpYyBhY3Rpb25zIHdoZW4gbmV3IG1lbnUgaWRzIGFyZSBhZGRlZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDg1NTYiPkJ1ZyAxMDg1NTY8L2E+LiBbUHJvZ3Jlc3N9IFByb2dyZXNzVmlldzogd2lkdGggb2YgZW50cmllcyBubyBsb25nZXIgZml4ZWQsIHJlc3VsdHMgaW4gaG9yLiBzY3JvbGxiYXJzIGFuZCBsb3RzIG9mIGZsaWNrZXI8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NzA1Ij5CdWcgMTA4NzA1PC9hPi4gW0NvbnRyaWJ1dGlvbnNdIGVycm9yczogT2JqZWN0QWN0aW9uQ29udHJpYnV0b3Igc2hvdWxkIHNhZmVndWFyZCBhZ2FpbnN0IG1pc2JlaGF2aW5nIHBsdWdpbnM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NzA5Ij5CdWcgMTA4NzA5PC9hPi4gW0NvbnRyaWJ1dGlvbnNdIEV2ZXJ5IHNpbmdsZSBKYXZhIGVkaXRvciBpcyBsZWFrZWQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5MDUyIj5CdWcgMTA5MDUyPC9hPi4gRXhwb3N1cmUgb2Ygd29ya2JlbmNoIHBhcnQgY29udHJvbHMgdG8gY2xpZW50czxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDkzMjkiPkJ1ZyAxMDkzMjk8L2E+LiBbUHJvZ3Jlc3NdIFRvb2x0aXAgaW4gcHJvZ3Jlc3MgZGlhbG9nIGlzIHNob3J0ZW5lZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk0NzQiPkJ1ZyAxMDk0NzQ8L2E+LiBbRWRpdG9yTWdtdF0gTXVsdGlwbGUgRWRpdG9ycyBjbG9zaW5nIGF0IG9uY2U8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5ODQ2Ij5CdWcgMTA5ODQ2PC9hPi4gW0tleUJpbmRpbmdzXSBFbWFjcyBDLXggQy1mIGJpbmRpbmc8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEwMzMxIj5CdWcgMTEwMzMxPC9hPi4gYWRkIHRlc3RzIGZvciBpbXBvcnQvZXhwb3J0PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDc5MyI+QnVnIDExMDc5MzwvYT4uIE5lZWQgdGVzdCBzdWl0ZXMgZm9yIGRlY2xhcmF0aXZlIGZpbHRlcnM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMDU3Ij5CdWcgMTExMDU3PC9hPi4gW01hcmtlcnNdIFNob3cgSW4gU3VwcG9ydCBuZWVkcyB0byBiZSBwbHVnZ2FibGU8YnI+Ci0gIDwvcD4KLQotPHA+SW50ZWdyYXRpb24gQnVpbGQgKFNlcHRlbWJlciAyNywgMjAwNSwgMTI6MDAgYS5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEwMzU0Ij5CdWcgMTEwMzU0PC9hPi4gW1dvcmtiZW5jaFBhcnRzXSBOUEUgZHJhZ2dpbmcgdmlldyBmcm9tIGZhc3QgdmlldyBiYXIuPGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChTZXB0ZW1iZXIgMjcsIDIwMDUsIDg6MDAgYS5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA3MTIxIj5CdWcgMTA3MTIxPC9hPi4gW0VkaXRvck1nbXRdIG5vdCByZXNwb25kaW5nIHdoZW4gb3BlbmluZyBhIGZvbGRlciB3aXRoIGEgbG90IG9mIGZpbGVzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODAxNSI+QnVnIDEwODAxNTwvYT4uIFtNYXJrZXJzXSBGaWx0ZXJzIG5lZWQgdG8gYmUgY3JlYXRlZCwgZW5hYmxlZCBhbmQgZGlzYWJsZWQgZGVjbGFyYXRpdmVseTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk2MzkiPkJ1ZyAxMDk2Mzk8L2E+LiBbS2V5QmluZGluZ3NdIGtleWJpbmRpbmcgc2VydmljZSBpcyBkZWFjdGl2YXRlZCBidXQgbm90IHJlYWN0aXZhdGVkIHdoZW4gdW5yZWdpc3RlciBhY3Rpb248YnI+Ci0gIDwvcD4KLQotPHA+SW50ZWdyYXRpb24gQnVpbGQgKFNlcHRlbWJlciAyMiwgMjAwNSwgMTI6MDAgcC5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEwMjQzIj5CdWcgMTEwMjQzPC9hPi4gaGVhcCBtb25pdG9yIGNhdXNlcyBlcnJvcnMgZHVyaW5nIHRlc3RzPGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChTZXB0ZW1iZXIgMjEsIDIwMDUsIDQ6MDAgcC5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5MDExIj5CdWcgMTA5MDExPC9hPi4gW0tleUJpbmRpbmdzXSBBSU9PQkUgb24gc3RhcnR1cDxicj4KLSAgPC9wPgotCi08cD5JbnRlZ3JhdGlvbiBCdWlsZCAoQXVndXN0IDMwLCAyMDA1LCA4OjAwIGEubS4pPC9wPgotICA8cD5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L3A+Ci0gIDxwPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc2MDkyIj5CdWcgNzYwOTI8L2E+LiBbVGhlbWVzXSBGb250cyBwcmVmZXJlbmNlIHBhZ2Ugc2hvd3MgYWx3YXlzICZxdW90O2RlZmF1bHRzIHRvIC4uLiBmb250JnF1b3Q7PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2NjAwIj5CdWcgOTY2MDA8L2E+LiBbRHluYW1pY1VJXSBbQ29tbWFuZHNdIFtDb250ZXh0c10gW0tleUJpbmRpbmdzXSBDb21tYW5kcyBhcmNoaXRlY3R1cmUgaXNuJ3QgZHluYW1pYzxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODYyMSI+QnVnIDk4NjIxPC9hPi4gW3JlZmFjdG9yaW5nXSBbcmVuYW1lXSBSZW5hbWUgVHlwZSBoYW5nczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDI0ODUiPkJ1ZyAxMDI0ODU8L2E+LiBbSW1wb3J0L0V4cG9ydF0gRXhwb3J0IHRvIGZpbGVzeXN0ZW0gbG9zZXMgY3VycmVudCBzZWxlY3Rpb24gaW4gUGFja2FnZSBFeHBsb3Jlcjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY5NTkiPkJ1ZyAxMDY5NTk8L2E+LiBbQ29udHJpYnV0aW9uc10gbWlzc2luZyBtbmVtb25pY3MgaW4gdGhlIG1haW4gbWVudSBiYXI8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA3ODU0Ij5CdWcgMTA3ODU0PC9hPi4gW0NvbnRyaWJ1dGlvbnNdIGVycm9yczogQ29udGV4dCBtZW51IG1pc3Npbmc8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA3OTc3Ij5CdWcgMTA3OTc3PC9hPi4gTXV0bGlFZGl0b3JUZXN0cyBhcmUgZmFpbGluZyBvbiBOMjAwNTA4MjU8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4MDEyIj5CdWcgMTA4MDEyPC9hPi4gW01hcmtlcnNdIE11bHRpIGZpbHRlcnMgZG8gbm90IHVwZGF0ZSB3aGVuIGZpbHRlciBpcyBkaXNhYmxlZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDgwMTMiPkJ1ZyAxMDgwMTM8L2E+LiBbTWFya2Vyc10gRmlsdGVycyBuZWVkIHRvIGJlIGVuYWJsZWQgZmFzdGVyIHRoYW4gb3BlbmluZyB0aGUgZGlhbG9nPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODAxNyI+QnVnIDEwODAxNzwvYT4uIFtNYXJrZXJzXSBEaXNhYmxpbmcgYSBtYXJrZXIgdHlwZSBkaXNhYmxlcyB0aGUgd2hvbGUgZmlsdGVyPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODE0MyI+QnVnIDEwODE0MzwvYT4uIFtJbXBvcnQvRXhwb3J0XSBlcnJvciBtZXNzYWdlIGRvZXMgbm90IGdvIGF3YXkgd2hlbiByZXNvdXJjZXMgYXJlIHNlbGVjdGVkIGZvciBpbXBvcnQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4MTQ0Ij5CdWcgMTA4MTQ0PC9hPi4gW1VuZG9dIC0gYWN0aW9uIGhhbmRsZXJzIHNob3VsZCByZWZlciBhZGFwdGVyIHJlcXVlc3RzIHRvIHRoZWlyIHBhcnQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAwNTA4MjUiPkJ1ZyAyMDA1MDgyNTwvYT4uIEludmFsaWQgQnVnIElEPGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChBdWd1c3QgMjMsIDIwMDUsIDg6MDAgYS5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQ4NzQiPkJ1ZyA2NDg3NDwvYT4uIFtUaGVtZXNdIFtQcmVmZXJlbmNlc10gQ29sb3JzIGFuZCBGb250cyBwcmVmZXJlbmNlIHBhZ2U6IERvdWJsZWNsaWNrIHNob3VsZCBlZGl0PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2NTI2Ij5CdWcgNjY1MjY8L2E+LiBbRGlhbG9nc10gUmV2aWV3IHRoZSBkZXNpZ24gb2YgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzM3NSI+QnVnIDY3Mzc1PC9hPi4gW1RoZW1lc10gRGVzY3JpcHRpb24gYXJlYSBpbiB0aGUgJnF1b3Q7Y29sb3JzIGFuZCBmb250IHByZWZlcmVuY2VzJnF1b3Q7IGlzIG5vdCBiaWcgZW5vdWdoPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4Nzg3Ij5CdWcgNjg3ODc8L2E+LiBbTWFya2Vyc10gTWVzc2FnZXMgbmVlZCB0byBiZSBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBmb3JtYXQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzAzMjEiPkJ1ZyA3MDMyMTwvYT4uIFtQcmVmZXJlbmNlc10gVFZUIDMuMDogUHJvamVjdCByZWZlcmVuY2UgcHJvcGVydGllcyBwYWdlIGNsaXBwZWQgaW4gSXRhbGlhbiBsYW5ndWFnZSBwYWNrPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc2OTc4Ij5CdWcgNzY5Nzg8L2E+LiBbRXJyb3JIYW5kbGluZ10gV29ya2JlbmNoUGx1Z2luIGxvZ3MgdG8gU3lzdGVtLmVycjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODc3NyI+QnVnIDc4Nzc3PC9hPi4gW0R5bmFtaWNVSV0gVW5jYXRlZ29yaXplZCB2aWV3cyBkb24ndCBzaG93IHVwIHdoZW4gYWRkZWQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODI1MDIiPkJ1ZyA4MjUwMjwvYT4uIFtNYXJrZXJzXSB0YXNrbGlzdCBlbnRyaWVzIG5vdCBzaG93aW5nIHVwIGNvbnNpc3RlbnRseTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04Mjc0MyI+QnVnIDgyNzQzPC9hPi4gW01hcmtlcnNdIGltcHJvdmVkIHByb2JsZW0gZmlsdGVyIG5lZWRlZCAoT1IgY2xhdXNlcyk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA2NDYiPkJ1ZyA5MDY0NjwvYT4uIFtWaWV3ZXJzXSBTV1RFeGNlcHRpb24gZnJvbSBEZWZlcnJlZENvbnRlbnRQcm92aWRlcjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NzMwOCI+QnVnIDk3MzA4PC9hPi4gW1ByZWZlcmVuY2VzXSAmcXVvdDtOZXcgdGV4dCBmaWxlIGVuY29kaW5nIC8gbGluZSBkZWxpbWl0ZXImcXVvdDsgcHJlZmVyZW5jZXMgc2hvdWxkIGJlIG9uIEdlbmVyYWwgJmd0OyBXb3Jrc3BhY2U8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTg4MDAiPkJ1ZyA5ODgwMDwvYT4uIFtXb3JrYmVuY2hdIEFudCBidWlsZGZpbGUgcmVtb3ZlZCBmcm9tIGZhc3QgdmlldyBBbnQgVmlldyBhZnRlciByZXN0YXJ0PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4OTQzIj5CdWcgOTg5NDM8L2E+LiBbRG9jXSBbV29ya2luZ1NldHNdIE5pdHBpY2tpbmcgZXh0ZW5zaW9uIHBvaW50IGRvYzxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDExODAiPkJ1ZyAxMDExODA8L2E+LiBbSW1wb3J0L0V4cG9ydF0gSW1wb3J0IEV4aXN0aW5nIFByb2plY3QgaW50byBXb3Jrc3BhY2UgZGVmYXVsdCB3aWRnZXQgaXMgYmFjayBidXR0b24gLCBzaG91bGQgYmUgdGV4dCBmaWVsZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDE2ODMiPkJ1ZyAxMDE2ODM8L2E+LiBbV29ya2JlbmNoUGFydHNdIFZpZXdzIG9wZW5lZCBieSBjb250ZXh0IGVuYWJsZW1lbnQgYXJlIGNvdmVyZWQgdXAgYnkgYnV0dG9ucyBmcm9tIEJyZWFrcG9pbnRzIFZpZXc8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyMTAyIj5CdWcgMTAyMTAyPC9hPi4gW0ltcG9ydC9FeHBvcnRdIGJ1aWxkIHJ1bm5pbmcgYWZ0ZXIgZWFjaCBpbXBvcnRlZCBwcm9qZWN0PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTY0OSI+QnVnIDEwNTY0OTwvYT4uIFtVbmRvXSAtIE5QRSBpbiBPYmplY3RVbmRvQ29udGV4dCNnZXRMYWJlbCgpIGlmIG9iamVjdCBpcyBudWxsPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjUzMiI+QnVnIDEwNjUzMjwvYT4uIFtJbXBvcnQvRXhwb3J0XSBwcmVmZXJlbmNlIHBhZ2UgaGFzIGV4dHJhIGJvcmRlcjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY4OTAiPkJ1ZyAxMDY4OTA8L2E+LiBbSW1wb3J0L0V4cG9ydF0gSW1wb3J0IHdpemFyZCBtYXkgZGlzcGxheSB1bmV4cGVjdGVkIHNlY29uZCBwYWdlIGlmIHlvdSBqdXN0IHByZXNzIE5leHQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA3MTIxIj5CdWcgMTA3MTIxPC9hPi4gW0VkaXRvck1nbXRdIG5vdCByZXNwb25kaW5nIHdoZW4gb3BlbmluZyBhIGZvbGRlciB3aXRoIGEgbG90IG9mIGZpbGVzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzM2OSI+QnVnIDEwNzM2OTwvYT4uIFtUZXN0c10gUkNQIHRlc3Qgc3VpdGUgaGFuZ3Mgb24gR1RLPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzM3NiI+QnVnIDEwNzM3NjwvYT4uIFZpcnR1YWxUYWJsZVZpZXdlclRlc3QgbmVlZHMgdG8gZm9yY2UgaXRlbSBjcmVhdGlvbjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc0NzEiPkJ1ZyAxMDc0NzE8L2E+LiBbUHJvZ3Jlc3NdIFJldXNpbmcgaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBtYWtlcyBmb3Igc3RyYW5nZSBzZWxlY3Rpb248YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA3NjYwIj5CdWcgMTA3NjYwPC9hPi4gW1RoZW1lc10gQnVzeSBjdXJzb3Igb24gRm9udCBFZGl0aW5nIGRvZXNuJ3QgZ28gYXdheTxicj4KLSAgPC9wPgotCi0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChBdWd1c3QgMTAsIDIwMDUsIDEyOjAwIHAubS4pPC9wPgotICA8cD5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L3A+Ci0gIDxwPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0ODgxIj5CdWcgODQ4ODE8L2E+LiBbV29ya2JlbmNoTGF1bmNoZXJdIFNwbGFzaCBzY3JlZW4gcmVjZWl2ZXMgZm9jdXMgYWZ0ZXIgdGFzayBzd2l0Y2ggKGluc3RlYWQgb2Ygd29ya3NwYWNlIGxhdW5jaGVyIGRpYWxvZykgW3JldmVydF08YnI+Ci0gIDwvcD4KLQotPHA+SW50ZWdyYXRpb24gQnVpbGQgKEF1Z3VzdCAxMCwgMjAwNSwgMTI6MTAgYS5tLik8L3A+Ci0gIDxwPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvcD4KLSAgPHA+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQ4ODEiPkJ1ZyA4NDg4MTwvYT4uIFtXb3JrYmVuY2hMYXVuY2hlcl0gU3BsYXNoIHNjcmVlbiByZWNlaXZlcyBmb2N1cyBhZnRlciB0YXNrIHN3aXRjaCAoaW5zdGVhZCBvZiB3b3Jrc3BhY2UgbGF1bmNoZXIgZGlhbG9nKTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NTYwOCI+QnVnIDg1NjA4PC9hPi4gW1ZpZXdNZ210XSBbRWRpdG9yTWdtdF0gQ3JlYXRlIG9wdGlvbiB0byBkaXNhYmxlIHZpZXdzIHRoYXQgb3BlbiBhdXRvbWF0aWNhbGx5PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDk4NyI+QnVnIDEwNDk4NzwvYT4uIHZpZXcgY29udGVudHMgbWlzc2luZyB3aGVuIHN3aXRjaGluZyBwZXJzcGVjdGl2ZXM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1OTQ5Ij5CdWcgMTA1OTQ5PC9hPi4gW0FjdGlvblNldHNdIFByb2JsZW0gd2l0aCBBY3Rpb25TZXRzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjM2MCI+QnVnIDEwNjM2MDwvYT4uIE5QRSB3aGVuIGRlZmluaW5nIGEgZGVjb3JhdG9yIHdpdGggbm8gZW5hYmxlbWVudDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDYzNjMiPkJ1ZyAxMDYzNjM8L2E+LiBbRGVjb3JhdG9yc10gRGVjb3JhdG9yIHNjaGVtYSBpbmNvbnNpc3RlbnQgd2l0aCBleHRlbnNpb24gcG9pbnQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2Mzg4Ij5CdWcgMTA2Mzg4PC9hPi4gRGlyZWN0b3J5IGRpYWxvZyBpcyB1bnVzYWJseSBzbG93PGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChBdWd1c3QgMDgsIDIwMDUsIDEyOjAwIHAubS4pPC9wPgotICA8cD5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L3A+Ci0gIDxwPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjA4MSI+QnVnIDEwMjA4MTwvYT4uIEFiYW5kb24gdGhlIGNvbWJvIGJveCBvZiBwcmVmZXJlbmNlRGlhbG9nPGJyLz4KLSAgPC9wPgotCi08cD5JbnRlZ3JhdGlvbiBCdWlsZCAoQXVndXN0IDA4LCAyMDA1LCAxMjoxMCBhLm0uKTwvcD4KLSAgPHA+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9wPgotICA8cD4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDIyIj5CdWcgNzAyMjwvYT4uIFtXb3JrYmVuY2hdIFNwbGFzaCBzY3JlZW4gd2l0aCBwcm9ncmVzcyBiYXI8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MjYiPkJ1ZyAxNzgyNjwvYT4uIFtXaXphcmRzXSBOZXcgZm9sZGVyIHdpemFyZCBpcyB2ZXJ5IGxhcmdlIGlmIHlvdSBhcmUgY3JlYXRpbmcgdGhlIGZvbGRlciBpbiBhIGNvbnRhaW5lciB3aXRoIGEgdmVyeSBsb25nIHBhdGg8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzOTgiPkJ1ZyAyOTM5ODwvYT4uIFtNUEVdIEFsbG93IGJvb2ttYXJrcyBhbmQgdGFza3MgaW4gcGx1Z2luLnhtbCBzb3VyY2U8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY2NjYiPkJ1ZyA2NjY2NjwvYT4uIFtEZXRhY2hlZFZpZXddIENhbm5vdCBjb3B5IGZyb20gYSBkZXRhY2hlZCB2aWV3IGlmIGEgc2VsZWN0aW9uIGlzIG1hZGUgaW4gdGhlIG1haW4gd2luZG93PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc2NDk2Ij5CdWcgNzY0OTY8L2E+LiBbRGlhbG9nc10gJnF1b3Q7T3BlbiBSZXNvdXJjZSZxdW90OyBmb2xkZXIgc29ydGluZyBnZXRzIHJldmVyc2VkPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0ODI0Ij5CdWcgODQ4MjQ8L2E+LiBbUHJlZmVyZW5jZXNdIFdvcmtiZW5jaCBQcmVmZXJlbmNlIERpYWxvZyBvbmx5IHNhdmVzIFdvcmtiZW5jaCBwcmVmZXJlbmNlIHN0b3JlPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg1NjA4Ij5CdWcgODU2MDg8L2E+LiBbVmlld01nbXRdIFtFZGl0b3JNZ210XSBDcmVhdGUgb3B0aW9uIHRvIGRpc2FibGUgdmlld3MgdGhhdCBvcGVuIGF1dG9tYXRpY2FsbHk8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODYxNTkiPkJ1ZyA4NjE1OTwvYT4uIFtEZWNvcmF0b3JzXSBNYWtlIGxpZ2h0d2VpZ2h0IGRlY29yYXRvcnMgd29yayBmb3IgUmVzb3VyY2VNYXBwaW5nPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwMzU1Ij5CdWcgOTAzNTU8L2E+LiBbQ29udHJpYnV0aW9uc10gW0Nvb2xiYXJzXSBJbnZlc3RpZ2F0ZSB0aGUgcGVyZm9ybWFuY2Ugb2Ygc3ViYWN0aW9uYmFyczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05Mzk5OCI+QnVnIDkzOTk4PC9hPi4gW0VkaXRvciBNZ210XSBbTVBFXSBNdWx0aVBhZ2VFZGl0b3JTaXRlLnJlZ2lzdGVyQ29udGV4dE1lbnUgbWV0aG9kcyBhcmUgaW5jb25zaXN0ZW50IGluIHdoZXRoZXIgdGhleSBkZWxlZ2F0ZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NDU0NyI+QnVnIDk0NTQ3PC9hPi4gW0RlY29yYXRvcnNdIFtOYXZpZ2F0b3JdIChsZWFrKSBEYW5nbGluZyByZWZlcmVuY2VzIHRvIFJlc291cmNlTmF2aWdhdG9yPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1ODE1Ij5CdWcgOTU4MTU8L2E+LiBbUHJvZ3Jlc3NdIENhbmNlbGluZyBhIGpvYiByZS1lbnRlcnMgSm9iTWFuYWdlci5jYW5jZWw8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTc4ODIiPkJ1ZyA5Nzg4MjwvYT4uIFtWaWV3ZXJzXSBWaXJ0dWFsIFRhYmxlIFZpZXdlciB0ZXN0J3MgUmVzZXQgSW5wdXQgZG9lcyBub3QgcmVzdG9yZSBpdGVtcyBhdCBlbmQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTk4NTgiPkJ1ZyA5OTg1ODwvYT4uIFtJREVdIEVycm9yIHVwb24gZGVsZXRpbmcgYSBwcm9qZWN0Ljxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTg2NCI+QnVnIDk5ODY0PC9hPi4gW1ZpZXdlcnNdIE5QRSBpbiBEZWZlcnJlZFRyZWVDb250ZW50TWFuYWdlciQxLmlzUGFyZW50PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTA2NSI+QnVnIDEwMTA2NTwvYT4uIFtNYXJrZXJzXSBNYXJrZXIgaW1hZ2UgbG9va3VwIG5vdCBubCBlbmFibGVkPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjA4MSI+QnVnIDEwMjA4MTwvYT4uIEFiYW5kb24gdGhlIGNvbWJvIGJveCBvZiBwcmVmZXJlbmNlRGlhbG9nPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTU3NiI+QnVnIDEwNTU3NjwvYT4uIFRWVCAzLjEgLSBUQ1QgNDY3IC0gRGlzYWJsZSBBbGwgYW5kIEVuYWJsZSBBbGwgc3RyaW5ncyBub3QgZXh0ZXJuYWxpemVkIGZvciB0cmFuc2xhdGlvbjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU2NjUiPkJ1ZyAxMDU2NjU8L2E+LiBbRGlhbG9nc10gJnF1b3Q7T3BlbiByZXNvdXJjZSZxdW90OyBkaWFsb2cgZG9lc250IHJlbWVtYmVyIGl0IHBvc2l0aW9uIGFuZCBzaXplPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTczMSI+QnVnIDEwNTczMTwvYT4uIFRWVCAzLjEgLSBUQ1QgNTI4IC0gRHVwbGljYXRlZCBNbmV1bW9uaWMgaW4gUHJvYmxlbSAtJmd0OyBGaWx0ZXJzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTc3NiI+QnVnIDEwNTc3NjwvYT4uIFtQcm9ncmVzc10gQ2xpZW50cyBvZiBQcm9ncmVzc01vbml0b3JGb2N1c0pvYkRpYWxvZy5ydW5Bc3luYyBjYW4gY2FuIGNhdXNlIHdpZGdldCBkaXNwb3NlZCBlcnJvcjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU4MDkiPkJ1ZyAxMDU4MDk8L2E+LiBNbmVtb25pY3MgYXJlIHByb2dyYW1tYXRpY2FsbHkgY2hhbmdlZCwgc2hvdWxkIG5vdCBiZTxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU4MTYiPkJ1ZyAxMDU4MTY8L2E+LiBFeHRyYW5lb3VzIE5MUyB0YWcgaW5jb3JyZWN0bHkgZm91bmQgaW4gY29tbWVudHM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1ODM3Ij5CdWcgMTA1ODM3PC9hPi4gW01hcmtlcnNdIE1uZW1vbmljIGNvbmZsaWN0cyBpbiBNYXJrZXIgdmlld3M8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1OTEzIj5CdWcgMTA1OTEzPC9hPi4gRGVwcmVjYXRpb25zIGluIFJlYWRPbmx5U3RhdGVDaGVja2VyPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTkzNiI+QnVnIDEwNTkzNjwvYT4uIFtDb250cmlidXRpb25zXSBpbnRlcmFjdGlvbnM6IE5vIHN1Ym1lbnUgZm9yICZxdW90O1J1biBBcyZxdW90Ozxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDYxNTciPkJ1ZyAxMDYxNTc8L2E+LiBbUHJvZ3Jlc3NdIFtEaWFsb2dzXSBDYW4ndCBjbG9zZSBlcnJvciBkaWFsb2c8YnI+Ci0gIDwvcD4KLQotPHA+SW50ZWdyYXRpb24gQnVpbGQgKEF1Z3VzdCAwMiwgMjAwNSwgODowMCBhLm0uKTwvcD4KLSAgPHA+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9wPgotICA8cD4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTk1MCI+QnVnIDYxOTUwPC9hPi4gW01hcmtlcnNdIEltYWdlcyBiZWluZyBjcmVhdGVkIHR3aWNlIHBvdGVudGlhbGx5PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTIxNSI+QnVnIDEwMTIxNTwvYT4uIFtVbmRvXSBVbmRvIGFmZmVjdGluZyBvdXRzaWRlIGZpbGVzIHNob3VsZCBhbGxvdyAmcXVvdDtDYW5jZWwgYWN0aW9uJnF1b3Q7PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzUwMSI+QnVnIDEwMzUwMTwvYT4uIEltcG9ydCBhbmQgRXhwb3J0IG1lbnUgb3B0aW9ucyBzaG91bGQgYmUgbWVyZ2VkLjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQ1NTgiPkJ1ZyAxMDQ1NTg8L2E+LiBbV29ya2JlbmNoXSBbUkNQXSBEZWZhdWx0IHZhbHVlcyBmb3IgV29ya2JlbmNoV2luZG93LmdldFBlcnNwZWN0aXZlQmFyVmlzaWJsZS9Db29sQmFyVmlzaWJsZSBkbyBub3QgbWF0Y2ggdGhlIHZhbHVlcyBwcm92aWRlZCBieSB0aGUgY29uZmlndXJlcjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQ5ODciPkJ1ZyAxMDQ5ODc8L2E+LiB2aWV3IGNvbnRlbnRzIG1pc3Npbmcgd2hlbiBzd2l0Y2hpbmcgcGVyc3BlY3RpdmVzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTIyMiI+QnVnIDEwNTIyMjwvYT4uIFtCSURJXSBuZWVkIHRvIG5sICVWaWV3cy5SZXNvdXJjZU5hdmlnYXRvciBhbmQgVmlld3MgLSAlVmlld3MuQ29udGVudE91dGxpbmU8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1NTAzIj5CdWcgMTA1NTAzPC9hPi4gW1ZpZXdNZ210XSBPdXRsaW5lIHZpZXcgbG9zZXMgdG9vbGJhcnMgb24gcmVzdGFydDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU2NDgiPkJ1ZyAxMDU2NDg8L2E+LiBbVW5kb10gLSBPYmplY3RVbmRvQ29udGV4dCBzaG91bGQgbWF0Y2ggaWYgb2JqZWN0cyBhcmUgZXF1YWw8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1NjQ5Ij5CdWcgMTA1NjQ5PC9hPi4gW1VuZG9dIC0gTlBFIGluIE9iamVjdFVuZG9Db250ZXh0I2dldExhYmVsKCkgaWYgb2JqZWN0IGlzIG51bGw8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1Njk3Ij5CdWcgMTA1Njk3PC9hPi4gW1VuZG9dIC0gT3BlcmF0aW9uSGlzdG9yeUV2ZW50IC0gY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gY2FuY2VsZWQgZXZlbnQgb3IgZmFpbGVkIGV2ZW50PGJyPgotICA8L3A+Ci0KLTxwPkludGVncmF0aW9uIEJ1aWxkIChKdWx5IDI2LCAyMDA1LCAxMjowMCBwLm0uKTwvcD4KLSAgPHA+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9wPgotICA8cD4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDMyMyI+QnVnIDUwMzIzPC9hPi4gW1dvcmtiZW5jaF0gQWRkIGEgLXNob3dsYWJlbCAmcXVvdDtXb3Jrc3BhY2UgTGFiZWwmcXVvdDsgc3RhcnR1cCBvcHRpb248YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY2MTYiPkJ1ZyA2NjYxNjwvYT4uIFtQcm9wZXJ0aWVzVmlld10gQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgZG9lc24ndCB3b3JrIGluIFByb3BlcnR5U2hlZXRWaWV3PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5ODkyIj5CdWcgNjk4OTI8L2E+LiBbVGVzdHNdIEludmVzdGlnYXRlIFVJIHRlc3Qgc3VpdGVzIG9uIE1hYyBPUyBYPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcxOTQ2Ij5CdWcgNzE5NDY8L2E+LiA0IGRldGFjaGVkIHdpbmRvd3MgdGVzdHMgZmFpbCBvbiBNYWMgT1MgMTAuMy4zPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc2NzE0Ij5CdWcgNzY3MTQ8L2E+LiBbRGlhbG9nc10gQ29udGFpbmVyU2VsZWN0RGlhbG9nOiBEb3VibGUgY2xpY2tpbmcgbm9kZSBpbiB0cmVlIGNhdXNlcyBBc3NlcnRpb25FeGNlcHRpb248YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg3OTEiPkJ1ZyA4ODc5MTwvYT4uIFtXaXphcmRzXSBUVlQzLjEgIzkzIC0gVmFyaWFibGVzIGJ1dHRvbiBpcyB0cnVuY2F0ZWQgaW4gTmV3IEZpbGUgYWR2YW5jZWQgb3B0aW9ucyBpbiBSVVM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTAzNTMiPkJ1ZyA5MDM1MzwvYT4uIFtQcmVzZW50YXRpb25BUEldIENhY2hlIHdpZGdldHMgZm9yIHJlY2VudGx5IG9wZW5lZCBwZXJzcGVjdGl2ZXM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTAzNTUiPkJ1ZyA5MDM1NTwvYT4uIFtKRmFjZV0gW0Nvb2xiYXJzXSBJbnZlc3RpZ2F0ZSB0aGUgcGVyZm9ybWFuY2Ugb2Ygc3ViYWN0aW9uYmFyczxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MjI4NiI+QnVnIDkyMjg2PC9hPi4gW1dvcmtiZW5jaFBhcnRzXSBSZXF1ZXN0IG5ldyBBUEkgZm9yIEVkaXRvclBhcnQ8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTM2NzQiPkJ1ZyA5MzY3NDwvYT4uIFtEaWFsb2dzXSBQcm9ncmVzc01vbml0b3JEaWFsb2cgbm90IGNhbmNlbGxhYmxlIHdoZW4gZm9yayBpcyBzZXQgdG8gZmFsc2U8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTYxMjkiPkJ1ZyA5NjEyOTwvYT4uIFtNUEVdIChyZWdyZXNzaW9uKSBNdWx0aUVkaXRvci5nZXRJbm5lckVkaXRvcnMoKSByZXR1cm5zIG51bGwuPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDE1NiI+QnVnIDEwMDE1NjwvYT4uIFtJREVdIFJlbmFtZVJlc291cmNlQWN0aW9uIHNob3VsZCB1c2UgSUFkYXB0YWJsZSBmb3IgSVJlc291cmNlIGxvb2t1b3A8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAwMzI1Ij5CdWcgMTAwMzI1PC9hPi4gW0NlbGxFZGl0b3JzXSBUYWJsZSBjZWxsIGVkaXRvciBkb2VzIG5vdCBnZXQgZGVhY3RpdmF0ZWQgb24gbG9zdCBmb2N1czxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDA4ODkiPkJ1ZyAxMDA4ODk8L2E+LiBbVW5kb10gLSBBYnN0cmFjdE9wZXJhdGlvbiB0b1N0cmluZygpIGFwcGVuZHMgYm9ndXMgY29tbWE8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAxMzQ2Ij5CdWcgMTAxMzQ2PC9hPi4gW0Zhc3RWaWV3c11bV29ya2JlbmNoUGFydHNdIFByb2JsZW1zIHdpdGggdmlld3MgZHJhd2luZyB3aGVuIHRoZXkgc2hvdWxkbid0PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTQzNCI+QnVnIDEwMTQzNDwvYT4uIFtDb250ZXh0c10gcGVyZm9ybWFuY2U6IFNsb3cgY3Vyc29yIG5hdmlnYXRpb24gaW4gVGV4dCBmaWVsZHM8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAxNTg0Ij5CdWcgMTAxNTg0PC9hPi4gW0V4YW1wbGVzXSAtIEJ1aWxkIHByb2JsZW0gd2l0aCBuZXcgdW5kbyBleGFtcGxlPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTk1MCI+QnVnIDEwMTk1MDwvYT4uIEFib3V0IG1lbnUgaXRlbSBpbiBQREUtZ2VuZXJhdGVkIHByb2R1Y3Qgc2F5cyAmcXVvdDtBYm91dCBFY2xpcHNlIFBsYXRmb3JtJnF1b3Q7PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjAzMyI+QnVnIDEwMjAzMzwvYT4uIFtQZXJmb3JtYW5jZV0gVGFibGVWaWV3ZXJUZXN0cyB0b28gZmFzdCBvbiB3aW5kb3dzPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjA4MSI+QnVnIDEwMjA4MTwvYT4uIEFiYW5kb24gdGhlIGNvbWJvIGJveCBvZiBwcmVmZXJlbmNlRGlhbG9nPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjEyNyI+QnVnIDEwMjEyNzwvYT4uIFtEZXRhY2hlZFZpZXdzXSBhdHRhY2hpbmcgYW4gZWRpdG9yIHRvIGRldGFjaGVkIHZpZXcgY2F1c2UgQ2xhc3NDYXN0RXhjZXB0aW9uPGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjQzOSI+QnVnIDEwMjQzOTwvYT4uIFtQcm9wZXJ0aWVzVmlld10gUHJvcGVydHlTaGVldEVudHJ5IHNob3VsZCBmb3JtYXQgZXJyb3IgbWVzc2FnZSB3aGVuIGNhbGxpbmcgc2V0RXJyb3JUZXh0PGJyPgotPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjkxMSI+QnVnIDEwMjkxMTwvYT4uIFtLZXlCaW5kaW5nc10gYXNzaXN0OiBOb3QgY29ycmVjdGx5IHNpemVkIHdoZW4gd2luZG93IGlzIG5hcnJvdyBvciBzaG9ydDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMzNzkiPkJ1ZyAxMDMzNzk8L2E+LiBbTVBFXSBbRWRpdG9yTWdtdF0gQW4gZWRpdG9yIGluc3RhbmNlIGlzIGJlaW5nIGxlYWtlZCBlYWNoIHRpbWUgYW4gZWRpdG9yIGlzIG9wZW4gYW5kIGNsb3NlZDxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQyODAiPkJ1ZyAxMDQyODA8L2E+LiBTdXBwb3J0IHRoZSAndG9vbGJhcicgYnV0dG9uIG9uIE9TIFg8YnI+Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA0NjU3Ij5CdWcgMTA0NjU3PC9hPi4gW1VuZG9dIE5QRSBpbiBPcGVyYXRpb25IaXN0b3J5QWN0aW9uSGFuZGxlcjxicj4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQ5OTEiPkJ1ZyAxMDQ5OTE8L2E+LiBbV29ya2JlbmNoUGFydHNdIENhbm5vdCByZW9wZW4gY2xvc2VkIHZpZXdzPGJyPgotICA8L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmZWQ5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL2NvbXBvbmVudCIKLSAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9lY2xpcHNlLm9yZy9jb21wb25lbnQgLi4vY29tcG9uZW50LnhzZCAiCi0gICBuYW1lPSJQbGF0Zm9ybSBVSSBXb3JrYmVuY2giPgotIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpIiAvPgotIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIgLz4KLQotPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkiIGV4Y2x1c2l2ZT0iZmFsc2UiPgotICA8dHlwZSBuYW1lPSJJQWN0aW9uQmFycyIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJQWN0aW9uQmFyczIiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSUFjdGlvbkRlbGVnYXRlIi8+Ci0gIDx0eXBlIG5hbWU9IklBY3Rpb25EZWxlZ2F0ZTIiLz4KLSAgPHR5cGUgbmFtZT0iSUFjdGlvbkRlbGVnYXRlV2l0aEV2ZW50Ii8+Ci0gIDx0eXBlIG5hbWU9IklBY3Rpb25GaWx0ZXIiLz4KLSAgPHR5cGUgbmFtZT0iSUNvbnRhaW5tZW50QWRhcHRlciIvPgotICA8dHlwZSBuYW1lPSJJRGVjb3JhdG9yTWFuYWdlciIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiLz4KLSAgPHR5cGUgbmFtZT0iSUVkaXRvckFjdGlvbkRlbGVnYXRlIiAvPgotICA8dHlwZSBuYW1lPSJJRWRpdG9yRGVzY3JpcHRvciIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJRWRpdG9ySW5wdXQiIC8+Ci0gIDx0eXBlIG5hbWU9IklFZGl0b3JMYXVuY2hlciIvPgotICA8dHlwZSBuYW1lPSJJRWRpdG9yUGFydCIvPgotICA8dHlwZSBuYW1lPSJJRWRpdG9yUmVmZXJlbmNlIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklFZGl0b3JSZWdpc3RyeSIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJRWRpdG9yU2l0ZSIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJRWxlbWVudEZhY3RvcnkiLz4KLSAgPHR5cGUgbmFtZT0iSUV4cG9ydFdpemFyZCIvPgotICA8dHlwZSBuYW1lPSJJRmlsZUVkaXRvck1hcHBpbmciIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSUZvbGRlckxheW91dCIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJSW1wb3J0V2l6YXJkIi8+Ci0gIDx0eXBlIG5hbWU9IklJblBsYWNlRWRpdG9yIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklJblBsYWNlRWRpdG9ySW5wdXQiLz4KLSAgPHR5cGUgbmFtZT0iSUtleUJpbmRpbmdTZXJ2aWNlIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklMb2NhbFdvcmtpbmdTZXRNYW5hZ2VyIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklNZW1lbnRvIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklOYXZpZ2F0aW9uSGlzdG9yeSIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJTmF2aWdhdGlvbkxvY2F0aW9uIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklOYXZpZ2F0aW9uTG9jYXRpb25Qcm92aWRlciIvPgotICA8dHlwZSBuYW1lPSJJTmVzdGFibGVLZXlCaW5kaW5nU2VydmljZSIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJTmV3V2l6YXJkIi8+Ci0gIDx0eXBlIG5hbWU9IklOdWxsU2VsZWN0aW9uTGlzdGVuZXIiLz4KLSAgPHR5cGUgbmFtZT0iSU9iamVjdEFjdGlvbkRlbGVnYXRlIi8+Ci0gIDx0eXBlIG5hbWU9IklQYWdlTGF5b3V0IiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklQYWdlTGlzdGVuZXIiLz4KLSAgPHR5cGUgbmFtZT0iSVBhZ2VTZXJ2aWNlIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklQYXJ0TGlzdGVuZXIiLz4KLSAgPHR5cGUgbmFtZT0iSVBhcnRMaXN0ZW5lcjIiLz4KLSAgPHR5cGUgbmFtZT0iSVBhcnRTZXJ2aWNlIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklQYXRoRWRpdG9ySW5wdXQiLz4KLSAgPHR5cGUgbmFtZT0iSVBlcnNpc3RhYmxlRWxlbWVudCIvPgotICA8dHlwZSBuYW1lPSJJUGVyc2lzdGFibGVGYWN0b3J5SWRlbnRpZmllciIvPgotICA8dHlwZSBuYW1lPSJJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklQZXJzcGVjdGl2ZUZhY3RvcnkiLz4KLSAgPHR5cGUgbmFtZT0iSVBlcnNwZWN0aXZlTGlzdGVuZXIiLz4KLSAgPHR5cGUgbmFtZT0iSVBlcnNwZWN0aXZlTGlzdGVuZXIyIi8+Ci0gIDx0eXBlIG5hbWU9IklQZXJzcGVjdGl2ZUxpc3RlbmVyMyIvPgotICA8dHlwZSBuYW1lPSJJUGVyc3BlY3RpdmVSZWdpc3RyeSIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJUGxhY2Vob2xkZXJGb2xkZXJMYXlvdXQiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVBsdWdpbkNvbnRyaWJ1dGlvbiIvPgotICA8dHlwZSBuYW1lPSJJUHJvcGVydHlMaXN0ZW5lciIvPgotICA8dHlwZSBuYW1lPSJJUmV1c2FibGVFZGl0b3IiLz4KLSAgPHR5cGUgbmFtZT0iSVNhdmVhYmxlUGFydCIvPgotICA8dHlwZSBuYW1lPSJJU2VsZWN0aW9uTGlzdGVuZXIiLz4KLSAgPHR5cGUgbmFtZT0iSVNlbGVjdGlvblNlcnZpY2UiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVNlcnZpY2UiLz4KLSAgPHR5cGUgbmFtZT0iSVNlcnZpY2VQcm92aWRlciIvPgotICA8dHlwZSBuYW1lPSJJU2hhcmVkSW1hZ2VzIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklTaXplUHJvdmlkZXIiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVN0YXJ0dXAiLz4KLSAgPHR5cGUgbmFtZT0iSVZpZXdBY3Rpb25EZWxlZ2F0ZSIvPgotICA8dHlwZSBuYW1lPSJJVmlld0xheW91dCIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJVmlld1BhcnQiLz4KLSAgPHR5cGUgbmFtZT0iSVZpZXdSZWZlcmVuY2UiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVZpZXdTaXRlIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklXaW5kb3dMaXN0ZW5lciIvPgotICA8dHlwZSBuYW1lPSJJV29ya2JlbmNoIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaFBhZ2UiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaFBhcnQiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaFBhcnQyIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JrYmVuY2hQYXJ0Q29uc3RhbnRzIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvciIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJV29ya2JlbmNoUGFydFJlZmVyZW5jZSIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJV29ya2JlbmNoUGFydFNpdGUiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaFNlcnZpY2VzIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JrYmVuY2hTaXRlIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JrYmVuY2hXaW5kb3ciIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JrYmVuY2hXaW5kb3dQdWxsZG93bkRlbGVnYXRlIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JrYmVuY2hXaW5kb3dQdWxsZG93bkRlbGVnYXRlMiIvPgotICA8dHlwZSBuYW1lPSJJV29ya2JlbmNoV2l6YXJkIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JraW5nU2V0IiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JraW5nU2V0TWFuYWdlciIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJV29ya2luZ1NldFVwZGF0ZXIiLz4KLSAgPHR5cGUgbmFtZT0iTmF2aWdhdGlvbkxvY2F0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IlBhcnRJbml0RXhjZXB0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iUGVyc3BlY3RpdmVBZGFwdGVyIi8+Ci0gIDx0eXBlIG5hbWU9IlBsYXRmb3JtVUkiLz4KLSAgPHR5cGUgbmFtZT0iU2VsZWN0aW9uRW5hYmxlciIvPgotICA8dHlwZSBuYW1lPSJTdWJBY3Rpb25CYXJzIi8+Ci0gIDx0eXBlIG5hbWU9IlN1YkFjdGlvbkJhcnMyIi8+Ci0gIDx0eXBlIG5hbWU9IldvcmtiZW5jaEVuY29kaW5nIi8+Ci0gIDx0eXBlIG5hbWU9IldvcmtiZW5jaEV4Y2VwdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlhNTE1lbWVudG8iLz4KLTwvcGFja2FnZT4KLQotPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkuYWJvdXQiPgotPC9wYWNrYWdlPgotCi08cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aS5hY3Rpb25zIiBleGNsdXNpdmU9ImZhbHNlIj4KLSAgPHR5cGUgbmFtZT0iRXhwb3J0UmVzb3VyY2VzQWN0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSW1wb3J0UmVzb3VyY2VzQWN0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iTGFiZWxSZXRhcmdldEFjdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9Ik5ld1dpemFyZEFjdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9Ik5ld1dpemFyZERyb3BEb3duQWN0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9Ik9wZW5Jbk5ld1dpbmRvd0FjdGlvbiIvPgotICA8dHlwZSBuYW1lPSJPcGVuTmV3UGFnZU1lbnUiIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJPcGVuTmV3V2luZG93TWVudSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9Ik9wZW5QZXJzcGVjdGl2ZUFjdGlvbiIvPgotICA8dHlwZSBuYW1lPSJPcGVuUGVyc3BlY3RpdmVNZW51IiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iUGFydEV2ZW50QWN0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IlBlcnNwZWN0aXZlTWVudSIvPgotICA8dHlwZSBuYW1lPSJSZXRhcmdldEFjdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IlNpbXBsZVdpbGRjYXJkVGVzdGVyIi8+Ci0gIDx0eXBlIG5hbWU9IldvcmtpbmdTZXRGaWx0ZXJBY3Rpb25Hcm91cC5qYXZhICAgIi8+Ci0gPC9wYWNrYWdlPgotCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcyI+Ci0gIDx0eXBlIG5hbWU9IkFjdGl2aXRpZXNQcmVmZXJlbmNlUGFnZSIvPgotICA8dHlwZSBuYW1lPSJBY3Rpdml0eUV2ZW50Ii8+Ci0gIDx0eXBlIG5hbWU9IkFjdGl2aXR5TWFuYWdlckV2ZW50Ii8+Ci0gIDx0eXBlIG5hbWU9IkNhdGVnb3J5RXZlbnQiLz4KLSAgPHR5cGUgbmFtZT0iSUFjdGl2aXR5IiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklBY3Rpdml0eUxpc3RlbmVyIi8+Ci0gIDx0eXBlIG5hbWU9IklBY3Rpdml0eU1hbmFnZXIiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSUFjdGl2aXR5TWFuYWdlckxpc3RlbmVyIi8+Ci0gIDx0eXBlIG5hbWU9IklBY3Rpdml0eVBhdHRlcm5CaW5kaW5nIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklBY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZyIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJQ2F0ZWdvcnkiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSUNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklDYXRlZ29yeUxpc3RlbmVyIi8+Ci0gIDx0eXBlIG5hbWU9IklkZW50aWZpZXJFdmVudCIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJSWRlbnRpZmllciIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJSWRlbnRpZmllckxpc3RlbmVyIi8+Ci0gIDx0eXBlIG5hbWU9IklNdXRhYmxlQWN0aXZpdHlNYW5hZ2VyIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklUcmlnZ2VyUG9pbnQiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVRyaWdnZXJQb2ludEFkdmlzb3IiLz4KLSAgPHR5cGUgbmFtZT0iSVRyaWdnZXJQb2ludE1hbmFnZXIiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJOb3REZWZpbmVkRXhjZXB0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIiLz4KLSAgPHR5cGUgbmFtZT0iV29ya2JlbmNoVHJpZ2dlclBvaW50QWR2aXNvciIvPgotPC9wYWNrYWdlPgotCi08cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbiI+Ci0gIDx0eXBlIG5hbWU9IkFjdGlvbkJhckFkdmlzb3IiLz4KLSAgPHR5cGUgbmFtZT0iSUFjdGlvbkJhckNvbmZpZ3VyZXIiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaENvbmZpZ3VyZXIiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iV29ya2JlbmNoQWR2aXNvciIvPgotICA8dHlwZSBuYW1lPSJXb3JrYmVuY2hXaW5kb3dBZHZpc29yIi8+Ci08L3BhY2thZ2U+Ci0KLSA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aS5icmFuZGluZyI+Ci0gPC9wYWNrYWdlPgotCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkuYnJvd3NlciI+Ci0gIDx0eXBlIG5hbWU9IkFic3RyYWN0V2ViQnJvd3NlciIvPgotICA8dHlwZSBuYW1lPSJBYnN0cmFjdFdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0Ii8+Ci0gIDx0eXBlIG5hbWU9IklXZWJCcm93c2VyIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JrYmVuY2hCcm93c2VyU3VwcG9ydCIgaW1wbGVtZW50PSJmYWxzZSIvPgotPC9wYWNrYWdlPgotIAotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgPHR5cGUgbmFtZT0iQWJzdHJhY3RIYW5kbGVyIi8+Ci0gIDx0eXBlIG5hbWU9IkFjdGlvbkhhbmRsZXIiLz4KLSAgPHR5cGUgbmFtZT0iQ2F0ZWdvcnlFdmVudCIvPgotICA8dHlwZSBuYW1lPSJDb21tYW5kRXZlbnQiLz4KLSAgPHR5cGUgbmFtZT0iQ29tbWFuZEV4Y2VwdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IkNvbW1hbmRNYW5hZ2VyRXZlbnQiLz4KLSAgPHR5cGUgbmFtZT0iRXhlY3V0aW9uRXhjZXB0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IkV4dGVuc2lvblBhcmFtZXRlclZhbHVlcyIvPgotICA8dHlwZSBuYW1lPSJIYW5kbGVyQWN0aXZhdGlvbiIvPgotICA8dHlwZSBuYW1lPSJIYW5kbGVyRXZlbnQiLz4KLSAgPHR5cGUgbmFtZT0iSGFuZGxlclN1Ym1pc3Npb24iLz4KLSAgPHR5cGUgbmFtZT0iSUNhdGVnb3J5IiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklDYXRlZ29yeUxpc3RlbmVyIi8+Ci0gIDx0eXBlIG5hbWU9IklDb21tYW5kIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklDb21tYW5kTGlzdGVuZXIiLz4KLSAgPHR5cGUgbmFtZT0iSUNvbW1hbmRNYW5hZ2VyIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklDb21tYW5kTWFuYWdlckxpc3RlbmVyIi8+Ci0gIDx0eXBlIG5hbWU9IklDb21tYW5kU2VydmljZSIvPgotICA8dHlwZSBuYW1lPSJJSGFuZGxlciIvPgotICA8dHlwZSBuYW1lPSJJSGFuZGxlckFjdGl2YXRpb24iLz4KLSAgPHR5cGUgbmFtZT0iSUhhbmRsZXJMaXN0ZW5lciIvPgotICA8dHlwZSBuYW1lPSJJS2V5Q29uZmlndXJhdGlvbiIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJS2V5Q29uZmlndXJhdGlvbkxpc3RlbmVyIi8+Ci0gIDx0eXBlIG5hbWU9IklLZXlTZXF1ZW5jZUJpbmRpbmciIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaENvbW1hbmRTdXBwb3J0IiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IktleUNvbmZpZ3VyYXRpb25FdmVudCIgLz4KLSAgPHR5cGUgbmFtZT0iTm90RGVmaW5lZEV4Y2VwdGlvbiIvPgotICA8dHlwZSBuYW1lPSJOb3RIYW5kbGVkRXhjZXB0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IlByaW9yaXR5Ii8+Ci08L3BhY2thZ2U+Ci0KLTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmNvbXBvbmVudHMiPgotICA8dHlwZSBuYW1lPSJDbGFzc0lkZW50aWZpZXIiLz4KLSAgPHR5cGUgbmFtZT0iQ29tcG9uZW50RXhjZXB0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iQ29tcG9uZW50RmFjdG9yeSIvPgotICA8dHlwZSBuYW1lPSJDb21wb25lbnRIYW5kbGUiLz4KLSAgPHR5cGUgbmFtZT0iQ29tcG9uZW50cyIgaW5zdGFudGlhdGU9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iQ29udGFpbmVyIi8+Ci0gIDx0eXBlIG5hbWU9IkZhY3RvcnlNYXAiLz4KLSAgPHR5cGUgbmFtZT0iSURpc3Bvc2FibGUiLz4KLSAgPHR5cGUgbmFtZT0iSVNlcnZpY2VQcm92aWRlciIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJOb25EaXNwb3NpbmdIYW5kbGUiLz4KLSAgPHR5cGUgbmFtZT0iUmVmbGVjdGlvbkZhY3RvcnkiIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJTZXJ2aWNlRmFjdG9yeSIvPgotICA8dHlwZSBuYW1lPSJTaW5nbGV0b25GYWN0b3J5Ii8+Ci08L3BhY2thZ2U+Ci0KLTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmNvbXBvbmVudHMudXRpbCI+Ci0gIDx0eXBlIG5hbWU9Ikluc3RhbmNlVG9Db21wb25lbnRGYWN0b3J5QWRhcHRlciIvPgotICA8dHlwZSBuYW1lPSJJbnN0YW5jZVRvU2VydmljZUZhY3RvcnlBZGFwdGVyIi8+Ci0gIDx0eXBlIG5hbWU9Ikluc3RhbmNlVG9TZXJ2aWNlUHJvdmlkZXJBZGFwdGVyIi8+Ci0gIDx0eXBlIG5hbWU9IlNlcnZpY2VNYXAiLz4KLSAgPHR5cGUgbmFtZT0iU2VydmljZVByb3ZpZGVyVG9TZXJ2aWNlRmFjdG9yeUFkYXB0ZXIiLz4KLTwvcGFja2FnZT4KLQotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIj4KLSAgPHR5cGUgbmFtZT0iQ29udGV4dEV2ZW50IiAvPgotICA8dHlwZSBuYW1lPSJDb250ZXh0RXhjZXB0aW9uIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iQ29udGV4dE1hbmFnZXJFdmVudCIvPgotICA8dHlwZSBuYW1lPSJFbmFibGVkU3VibWlzc2lvbiIvPgotICA8dHlwZSBuYW1lPSJJQ29udGV4dCIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJQ29udGV4dExpc3RlbmVyIi8+Ci0gIDx0eXBlIG5hbWU9IklDb250ZXh0TWFuYWdlciIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJQ29udGV4dE1hbmFnZXJMaXN0ZW5lciIvPgotICA8dHlwZSBuYW1lPSJJQ29udGV4dFNlcnZpY2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaENvbnRleHRTdXBwb3J0IiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9Ik5vdERlZmluZWRFeGNlcHRpb24iLz4KLTwvcGFja2FnZT4KLQotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MiIGV4Y2x1c2l2ZT0iZmFsc2UiPgotICA8dHlwZSBuYW1lPSJBYnN0cmFjdEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIi8+Ci0gIDx0eXBlIG5hbWU9IkNoZWNrZWRUcmVlU2VsZWN0aW9uRGlhbG9nIi8+Ci0gIDx0eXBlIG5hbWU9IkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIi8+Ci0gIDx0eXBlIG5hbWU9IkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIi8+Ci0gIDx0eXBlIG5hbWU9IkZpbGVFZGl0b3JNYXBwaW5nQ29udGVudFByb3ZpZGVyIi8+Ci0gIDx0eXBlIG5hbWU9IkZpbGVFZGl0b3JNYXBwaW5nTGFiZWxQcm92aWRlciIvPgotICA8dHlwZSBuYW1lPSJGaWxlU3lzdGVtRWxlbWVudCIvPgotICA8dHlwZSBuYW1lPSJGaWx0ZXJlZExpc3QiLz4KLSAgPHR5cGUgbmFtZT0iSU92ZXJ3cml0ZVF1ZXJ5Ii8+Ci0gIDx0eXBlIG5hbWU9IklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IiLz4KLSAgPHR5cGUgbmFtZT0iSVNlbGVjdGlvblZhbGlkYXRvciIvPgotICA8dHlwZSBuYW1lPSJJV29ya2luZ1NldEVkaXRXaXphcmQiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtpbmdTZXROZXdXaXphcmQiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtpbmdTZXRQYWdlIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JraW5nU2V0U2VsZWN0aW9uRGlhbG9nIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9Ikxpc3REaWFsb2ciLz4KLSAgPHR5cGUgbmFtZT0iTGlzdFNlbGVjdGlvbkRpYWxvZyIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlByZWZlcmVuY2VzVXRpbCIvPgotICA8dHlwZSBuYW1lPSJQcm9wZXJ0eURpYWxvZ0FjdGlvbiIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlByb3BlcnR5UGFnZSIvPgotICA8dHlwZSBuYW1lPSJTZWxlY3Rpb25EaWFsb2ciLz4KLSAgPHR5cGUgbmFtZT0iU2VsZWN0aW9uU3RhdHVzRGlhbG9nIi8+Ci0gIDx0eXBlIG5hbWU9IlR3b0FycmF5UXVpY2tTb3J0ZXIiLz4KLSAgPHR5cGUgbmFtZT0iVHdvUGFuZUVsZW1lbnRTZWxlY3RvciIvPgotICA8dHlwZSBuYW1lPSJUeXBlRmlsdGVyaW5nRGlhbG9nIi8+Ci0gIDx0eXBlIG5hbWU9Illlc05vQ2FuY2VsTGlzdFNlbGVjdGlvbkRpYWxvZyIvPgotPC9wYWNrYWdlPgotIAotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmhlbHAiPgotICA8dHlwZSBuYW1lPSJBYnN0cmFjdEhlbHBVSSIvPgotICA8dHlwZSBuYW1lPSJEaWFsb2dQYWdlQ29udGV4dENvbXB1dGVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSUNvbnRleHRDb21wdXRlciIvPgotICA8dHlwZSBuYW1lPSJJV29ya2JlbmNoSGVscFN5c3RlbSIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJWaWV3Q29udGV4dENvbXB1dGVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iV29ya2JlbmNoSGVscCIgaW5zdGFudGlhdGU9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiLz4KLTwvcGFja2FnZT4KLSAKLSA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aS5pbnRybyI+Ci0gIDx0eXBlIG5hbWU9IklJbnRyb01hbmFnZXIiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSUludHJvUGFydCIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJSW50cm9TaXRlIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci08L3BhY2thZ2U+Ci0gCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkua2V5cyI+Ci0gIDx0eXBlIG5hbWU9IkNoYXJhY3RlcktleSIvPgotICA8dHlwZSBuYW1lPSJJQmluZGluZ1NlcnZpY2UiLz4KLSAgPHR5cGUgbmFtZT0iSUtleUZvcm1hdHRlciIvPgotICA8dHlwZSBuYW1lPSJLZXkiIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJLZXlGb3JtYXR0ZXJGYWN0b3J5Ii8+Ci0gIDx0eXBlIG5hbWU9IktleVNlcXVlbmNlIi8+Ci0gIDx0eXBlIG5hbWU9IktleVN0cm9rZSIvPgotICA8dHlwZSBuYW1lPSJNb2RpZmllcktleSIvPgotICA8dHlwZSBuYW1lPSJOYXR1cmFsS2V5IiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iUGFyc2VFeGNlcHRpb24iLz4KLSAgPHR5cGUgbmFtZT0iU3BlY2lhbEtleSIvPgotICA8dHlwZSBuYW1lPSJTV1RLZXlTdXBwb3J0Ii8+Ci08L3BhY2thZ2U+Ci0gCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkubW9kZWwiIGV4Y2x1c2l2ZT0iZmFsc2UiPgotICA8dHlwZSBuYW1lPSJBZGFwdGFibGVMaXN0IiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iQmFzZVdvcmtiZW5jaENvbnRlbnRQcm92aWRlciIvPgotICA8dHlwZSBuYW1lPSJJV29ya2JlbmNoQWRhcHRlciIvPgotICA8dHlwZSBuYW1lPSJJV29ya2JlbmNoQWRhcHRlcjIiLz4KLSAgPHR5cGUgbmFtZT0iUGVyc3BlY3RpdmVMYWJlbFByb3ZpZGVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iV29ya2JlbmNoQWRhcHRlciIvPgotICA8dHlwZSBuYW1lPSJXb3JrYmVuY2hMYWJlbFByb3ZpZGVyIi8+Ci0gIDx0eXBlIG5hbWU9IldvcmtiZW5jaFBhcnRMYWJlbFByb3ZpZGVyIi8+Ci0gIDx0eXBlIG5hbWU9IldvcmtiZW5jaFZpZXdlclNvcnRlciIvPgotPC9wYWNrYWdlPgotIAotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLm9wZXJhdGlvbnMiPgotICA8dHlwZSBuYW1lPSJJV29ya2JlbmNoT3BlcmF0aW9uU3VwcG9ydCIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJPcGVyYXRpb25IaXN0b3J5QWN0aW9uSGFuZGxlciIvPgotICA8dHlwZSBuYW1lPSJSZWRvQWN0aW9uSGFuZGxlciIvPgotICA8dHlwZSBuYW1lPSJVbmRvQWN0aW9uSGFuZGxlciIvPgotICA8dHlwZSBuYW1lPSJXb3JrYmVuY2hPcGVyYXRpb25TdXBwb3J0Ii8+Ci08L3BhY2thZ2U+Ci0gCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkucGFydCIgZXhjbHVzaXZlPSJmYWxzZSI+Ci0gIDx0eXBlIG5hbWU9IkNlbGxFZGl0b3JBY3Rpb25IYW5kbGVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iQ29tcG9uZW50UGFydCIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IkNvb2xJdGVtR3JvdXBNYXJrZXIiIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJEcmlsbERvd25BZGFwdGVyIi8+Ci0gIDx0eXBlIG5hbWU9IkRyaWxsRG93bkNvbXBvc2l0ZSIvPgotICA8dHlwZSBuYW1lPSJEcmlsbEZyYW1lIi8+Ci0gIDx0eXBlIG5hbWU9IkRyaWxsU3RhY2siLz4KLSAgPHR5cGUgbmFtZT0iRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiLz4KLSAgPHR5cGUgbmFtZT0iRWRpdG9ySW5wdXRUcmFuc2ZlciIvPgotICA8dHlwZSBuYW1lPSJFZGl0b3JQYXJ0Ii8+Ci0gIDx0eXBlIG5hbWU9IklDb250cmlidXRlZENvbnRlbnRzVmlldyIvPgotICA8dHlwZSBuYW1lPSJJRHJvcEFjdGlvbkRlbGVnYXRlIi8+Ci0gIDx0eXBlIG5hbWU9IkludHJvUGFydCIvPgotICA8dHlwZSBuYW1lPSJJUGFnZSIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJUGFnZUJvb2tWaWV3UGFnZSIvPgotICA8dHlwZSBuYW1lPSJJUGFnZVNpdGUiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVNldFNlbGVjdGlvblRhcmdldCIvPgotICA8dHlwZSBuYW1lPSJJU2hvd0luU291cmNlIi8+Ci0gIDx0eXBlIG5hbWU9IklTaG93SW5UYXJnZXQiLz4KLSAgPHR5cGUgbmFtZT0iSVNob3dJblRhcmdldExpc3QiLz4KLSAgPHR5cGUgbmFtZT0iSVdvcmtiZW5jaFBhcnRPcmllbnRhdGlvbiIvPgotICA8dHlwZSBuYW1lPSJNZXNzYWdlUGFnZSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9Ik11bHRpRWRpdG9yIi8+Ci0gIDx0eXBlIG5hbWU9Ik11bHRpRWRpdG9ySW5wdXQiIHN1YmNsYXNzPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJNdWx0aVBhZ2VFZGl0b3IiLz4KLSAgPHR5cGUgbmFtZT0iTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiLz4KLSAgPHR5cGUgbmFtZT0iTXVsdGlQYWdlRWRpdG9yUGFydCIvPgotICA8dHlwZSBuYW1lPSJNdWx0aVBhZ2VFZGl0b3JTaXRlIi8+Ci0gIDx0eXBlIG5hbWU9Ik11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iUGFnZSIvPgotICA8dHlwZSBuYW1lPSJQYWdlQm9vayIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlBhZ2VCb29rVmlldyIvPgotICA8dHlwZSBuYW1lPSJQYWdlU2l0ZSIvPgotICA8dHlwZSBuYW1lPSJQYXJ0IiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iUGx1Z2luRHJvcEFkYXB0ZXIiLz4KLSAgPHR5cGUgbmFtZT0iUGx1Z2luVHJhbnNmZXIiLz4KLSAgPHR5cGUgbmFtZT0iUGx1Z2luVHJhbnNmZXJEYXRhIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJTaG93SW5Db250ZXh0Ii8+Ci0gIDx0eXBlIG5hbWU9IlZpZXdQYXJ0Ii8+Ci0gIDx0eXBlIG5hbWU9IldvcmtiZW5jaFBhcnQiIHN1YmNsYXNzPSJmYWxzZSIvPgotPC9wYWNrYWdlPgotIAotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnBhcnQuaW50ZXJmYWNlcyI+Ci0gIDx0eXBlIG5hbWU9IklGb2N1c2FibGUiLz4KLSAgPHR5cGUgbmFtZT0iSVBlcnNpc3RhYmxlIi8+Ci08L3BhY2thZ2U+Ci0gCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkucGFydC5zZXJ2aWNlcyI+Ci0gIDx0eXBlIG5hbWU9IklEaXJ0eUhhbmRsZXIiLz4KLSAgPHR5cGUgbmFtZT0iSUlucHV0SGFuZGxlciIvPgotICA8dHlwZSBuYW1lPSJJTmFtZWFibGUiLz4KLSAgPHR5cGUgbmFtZT0iSVBhcnREZXNjcmlwdG9yIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklQbHVnaW5SZXNvdXJjZXMiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVNhdmVkU3RhdGUiLz4KLSAgPHR5cGUgbmFtZT0iSVNlY29uZGFyeUlkIi8+Ci0gIDx0eXBlIG5hbWU9IklTZWxlY3Rpb25IYW5kbGVyIi8+Ci0gIDx0eXBlIG5hbWU9IklTdGF0dXNGYWN0b3J5IiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklTeXN0ZW1Mb2ciIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVVzZXJNZXNzYWdlcyIvPgotICA8dHlwZSBuYW1lPSJJV29ya2JlbmNoUGFydEZhY3RvcnkiIGltcGxlbWVudD0iZmFsc2UiLz4KLTwvcGFja2FnZT4KLSAKLSA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aS5wbHVnaW4iPgotICA8dHlwZSBuYW1lPSJBYnN0cmFjdFVJUGx1Z2luIi8+Ci08L3BhY2thZ2U+Ci0gCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMiPgotICA8dHlwZSBuYW1lPSJJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lciIvPgotICA8dHlwZSBuYW1lPSJJV29ya2luZ0NvcHlNYW5hZ2VyIi8+Ci0gIDx0eXBlIG5hbWU9IlByZWZlcmVuY2VUcmFuc2ZlckVsZW1lbnQiLz4KLSAgPHR5cGUgbmFtZT0iUHJlZmVyZW5jZVRyYW5zZmVyTWFuYWdlciIvPgotICA8dHlwZSBuYW1lPSJTY29wZWRQcmVmZXJlbmNlU3RvcmUiLz4KLSAgPHR5cGUgbmFtZT0iVmlld1ByZWZlcmVuY2VzQWN0aW9uIi8+Ci0gIDx0eXBlIG5hbWU9IlZpZXdTZXR0aW5nc0RpYWxvZyIvPgotPC9wYWNrYWdlPgotIAotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMiPgotICA8dHlwZSBuYW1lPSJBYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkiLz4KLSAgPHR5cGUgbmFtZT0iSVBhcnRNZW51IiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklQcmVzZW50YWJsZVBhcnQiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVByZXNlbnRhdGlvblNlcmlhbGl6ZXIiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVN0YWNrUHJlc2VudGF0aW9uU2l0ZSIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJQcmVzZW50YXRpb25VdGlsIi8+Ci0gIDx0eXBlIG5hbWU9IlN0YWNrRHJvcFJlc3VsdCIvPgotICA8dHlwZSBuYW1lPSJTdGFja1ByZXNlbnRhdGlvbiIvPgotICA8dHlwZSBuYW1lPSJXb3JrYmVuY2hQcmVzZW50YXRpb25GYWN0b3J5Ii8+Ci08L3BhY2thZ2U+Ci0gCi0gPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MiPgotICA8dHlwZSBuYW1lPSJEZWZlcnJlZFRyZWVDb250ZW50TWFuYWdlciIvPgotICA8dHlwZSBuYW1lPSJJRGVmZXJyZWRXb3JrYmVuY2hBZGFwdGVyIi8+Ci0gIDx0eXBlIG5hbWU9IklFbGVtZW50Q29sbGVjdG9yIi8+Ci0gIDx0eXBlIG5hbWU9IklQcm9ncmVzc0NvbnN0YW50cyIvPgotICA8dHlwZSBuYW1lPSJJUHJvZ3Jlc3NTZXJ2aWNlIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IlVJSm9iIi8+Ci0gIDx0eXBlIG5hbWU9IldvcmtiZW5jaEpvYiIvPgotPC9wYWNrYWdlPgotIAotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RpbmciPgotICA8dHlwZSBuYW1lPSJJVGVzdEhhcm5lc3MiLz4KLSAgPHR5cGUgbmFtZT0iVGVzdGFibGVPYmplY3QiLz4KLTwvcGFja2FnZT4KLSAKLSA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aS50aGVtZXMiPgotICA8dHlwZSBuYW1lPSJJQ29sb3JGYWN0b3J5Ii8+Ci0gIDx0eXBlIG5hbWU9IklUaGVtZSIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJVGhlbWVNYW5hZ2VyIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDx0eXBlIG5hbWU9IklUaGVtZVByZXZpZXciLz4KLSAgPHR5cGUgbmFtZT0iUkdCQmxlbmRDb2xvckZhY3RvcnkiLz4KLTwvcGFja2FnZT4KLSAKLSA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gIDx0eXBlIG5hbWU9IklTdGlja3lWaWV3RGVzY3JpcHRvciIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8dHlwZSBuYW1lPSJJVmlld0Rlc2NyaXB0b3IiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVZpZXdSZWdpc3RyeSIgaW1wbGVtZW50PSJmYWxzZSIvPgotPC9wYWNrYWdlPgotIAotIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMiPgotICA8dHlwZSBuYW1lPSJJV2l6YXJkQ2F0ZWdvcnkiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdpemFyZERlc2NyaXB0b3IiIGltcGxlbWVudD0iZmFsc2UiLz4KLSAgPHR5cGUgbmFtZT0iSVdpemFyZFJlZ2lzdHJ5IiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci08L3BhY2thZ2U+Ci0KLSA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIi8+Ci0KLTwvY29tcG9uZW50PgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2FkZHRza190c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9hZGR0c2tfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlNmNjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2FkZHRza190c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTcyZmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvYmFja3dhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvY2xvc2Vfdmlldy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2Nsb3NlX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWNhMjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvY2xvc2Vfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGMwZGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9kZWZhdWx0c19wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2RlZmF1bHRzX3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxYmE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2RlZmF1bHRzX3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2ZDg5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2ZpbHRlcl9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2ZvcndhcmRfbmF2LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvZm9yd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTlmZThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvZm9yd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9nb3Rvb2JqX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2dvdG9vYmpfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1NzEyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2dvdG9vYmpfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvaG9tZV9uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9ob21lX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOWU4NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9ob21lX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2xpbmt0b19oZWxwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvbGlua3RvX2hlbHAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjdjMDQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvbGlua3RvX2hlbHAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9taW5fdmlldy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L21pbl92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwMmRjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L21pbl92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvcGluX3ZpZXcuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9waW5fdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZTMzMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9waW5fdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Byb2dyZXNzX3JlbS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Byb2dyZXNzX3JlbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OWU0NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9wcm9ncmVzc19yZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9wcm9ncmVzc19yZW1hbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9wcm9ncmVzc19yZW1hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2QxYmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvcHJvZ3Jlc3NfcmVtYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvcHJvZ3Jlc3Nfc3RvcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Byb2dyZXNzX3N0b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjNkY2JhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvcHJvZ3Jlc3Nfc3RvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3JlZnJlc2hfbmF2LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvcmVmcmVzaF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWM3MGUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvcmVmcmVzaF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zZWxlY3RlZF9tb2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvc2VsZWN0ZWRfbW9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYWI5YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zZWxlY3RlZF9tb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvc2hvd2NoaWxkX21vZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zaG93Y2hpbGRfbW9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOTJlNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zaG93Y2hpbGRfbW9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3djb21wbGV0ZV90c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zaG93Y29tcGxldGVfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4M2RlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3djb21wbGV0ZV90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zaG93ZXJyX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3dlcnJfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyMzMxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3dlcnJfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvc2hvd3Rza190c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zaG93dHNrX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjY4ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zaG93dHNrX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3d3YXJuX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3d3YXJuX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MDdlNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zaG93d2Fybl90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zdGVwX2N1cnJlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zdGVwX2N1cnJlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTlmZThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvc3RlcF9jdXJyZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvc3RlcF9kb25lLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvc3RlcF9kb25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4M2RlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3N0ZXBfZG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3N5bmNlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNmU0M2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zeW5jZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi90cmFzaC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3RyYXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlMzViMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3RyYXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvdHJlZV9tb2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvdHJlZV9tb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiZGJlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3RyZWVfbW9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3VwX25hdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3VwX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2UyMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi91cF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi92aWV3X21lbnUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2RsY2wxNi92aWV3X21lbnUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDkyODM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvdmlld19tZW51LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NsZWFyX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NsZWFyX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3NWVkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jbGVhcl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb3B5X2VkaXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvY29weV9lZGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2MjZhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb3B5X2VkaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvY3V0X2VkaXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvY3V0X2VkaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDQzMTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2N1dF9lZGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2RlbGV0ZV9lZGl0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2RlbGV0ZV9lZGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUxNDI5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9kZWxldGVfZWRpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBvcnRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjg5Y2Q5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvaGVscF9jb250ZW50cy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9oZWxwX2NvbnRlbnRzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiZjYxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9oZWxwX2NvbnRlbnRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2ltcG9ydF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvaW1wb3J0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNDQ3NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjU2NDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvcGFzdGVfZWRpdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9wYXN0ZV9lZGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3NjY4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9wYXN0ZV9lZGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3Bpbl9lZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvcGluX2VkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzdjOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvcGluX2VkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9wcmludF9lZGl0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3ByaW50X2VkaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDI3MjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3ByaW50X2VkaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvcmVkb19lZGl0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3JlZG9fZWRpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTg4NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvcmVkb19lZGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3NhdmVfZWRpdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zYXZlX2VkaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDUwNWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3NhdmVfZWRpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zYXZlYWxsX2VkaXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvc2F2ZWFsbF9lZGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxZjQxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zYXZlYWxsX2VkaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvc2F2ZWFzX2VkaXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvc2F2ZWFzX2VkaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjgzYTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3NhdmVhc19lZGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3VuZG9fZWRpdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi91bmRvX2VkaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgxOTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3VuZG9fZWRpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2FkZHRza190c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9hZGR0c2tfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhYzI4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2FkZHRza190c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmI0MTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvYmFja3dhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvY2xvc2Vfdmlldy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2Nsb3NlX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWNhMjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvY2xvc2Vfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmQ4MGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9kZWZhdWx0c19wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2RlZmF1bHRzX3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2NDg5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2RlZmF1bHRzX3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlNmYwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2ZpbHRlcl9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2ZvcndhcmRfbmF2LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvZm9yd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmY4YzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvZm9yd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9nb3Rvb2JqX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2dvdG9vYmpfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2MmI2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2dvdG9vYmpfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvaG9tZV9uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9ob21lX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NzJlOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9ob21lX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2xpbmt0b19oZWxwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvbGlua3RvX2hlbHAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjU1MGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvbGlua3RvX2hlbHAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9taW5fdmlldy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L21pbl92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwMmRjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L21pbl92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvcGluX3ZpZXcuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9waW5fdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MWM0YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9waW5fdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Byb2dyZXNzX3JlbS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Byb2dyZXNzX3JlbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDljNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9wcm9ncmVzc19yZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9wcm9ncmVzc19yZW1hbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9wcm9ncmVzc19yZW1hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGEzNzg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvcHJvZ3Jlc3NfcmVtYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvcHJvZ3Jlc3Nfc3RvcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Byb2dyZXNzX3N0b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzQ3ZWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvcHJvZ3Jlc3Nfc3RvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3JlZnJlc2hfbmF2LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvcmVmcmVzaF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDljYWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvcmVmcmVzaF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zZWxlY3RlZF9tb2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvc2VsZWN0ZWRfbW9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNDI0MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zZWxlY3RlZF9tb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd2NoaWxkX21vZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zaG93Y2hpbGRfbW9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MTRmN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zaG93Y2hpbGRfbW9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Nob3djb21wbGV0ZV90c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zaG93Y29tcGxldGVfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Nob3djb21wbGV0ZV90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zaG93ZXJyX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Nob3dlcnJfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmNjY3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Nob3dlcnJfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd3Rza190c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zaG93dHNrX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MDI4YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zaG93dHNrX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Nob3d3YXJuX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Nob3d3YXJuX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNmJkNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zaG93d2Fybl90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zdGVwX2N1cnJlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zdGVwX2N1cnJlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2E3Y2M3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvc3RlcF9jdXJyZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvc3RlcF9kb25lLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvc3RlcF9kb25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3N0ZXBfZG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3N5bmNlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MDkzNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zeW5jZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90aGluX2Nsb3NlX3ZpZXcuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90aGluX2Nsb3NlX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI2MTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvdGhpbl9jbG9zZV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvdGhpbl9oaWRlX3Rvb2xiYXIuR0lGIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90aGluX2hpZGVfdG9vbGJhci5HSUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NThlNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90aGluX2hpZGVfdG9vbGJhci5HSUYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3RoaW5fbWF4X3ZpZXcuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90aGluX21heF92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlZDQ0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3RoaW5fbWF4X3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90aGluX21pbl92aWV3LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvdGhpbl9taW5fdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMmVkMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90aGluX21pbl92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvdGhpbl9yZXN0b3JlX3ZpZXcuR0lGIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90aGluX3Jlc3RvcmVfdmlldy5HSUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MmQ2MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90aGluX3Jlc3RvcmVfdmlldy5HSUYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3RoaW5fc2hvd190b29sYmFyLkdJRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvdGhpbl9zaG93X3Rvb2xiYXIuR0lGCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGExMGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvdGhpbl9zaG93X3Rvb2xiYXIuR0lGCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90aGluX3ZpZXdfbWVudS5HSUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3RoaW5fdmlld19tZW51LkdJRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlYzdmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3RoaW5fdmlld19tZW51LkdJRgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvdHJhc2guZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90cmFzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOTYxYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90cmFzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3RyZWVfbW9kZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3RyZWVfbW9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYThiYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi90cmVlX21vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi91cF9uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2VsY2wxNi91cF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODQ5NTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvdXBfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvdmlld19tZW51LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvdmlld19tZW51LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5MjgzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3ZpZXdfbWVudS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jbGVhcl9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jbGVhcl9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzBhNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvY2xlYXJfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvY29weV9lZGl0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvcHlfZWRpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZDdjOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvY29weV9lZGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2N1dF9lZGl0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2N1dF9lZGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NGU1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jdXRfZWRpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9kZWxldGVfZWRpdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9kZWxldGVfZWRpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTIyYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvZGVsZXRlX2VkaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvZXhwb3J0X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwODM3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBvcnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2hlbHBfY29udGVudHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvaGVscF9jb250ZW50cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzAzMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvaGVscF9jb250ZW50cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9oZWxwX3NlYXJjaC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9oZWxwX3NlYXJjaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZjVkODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvaGVscF9zZWFyY2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvaW1wb3J0X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9pbXBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4MDg1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9pbXBvcnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19mYXN0dmlldy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZmFzdHZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjhjZTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19mYXN0dmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWVhODk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvcGFzdGVfZWRpdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9wYXN0ZV9lZGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlkZDRkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9wYXN0ZV9lZGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Bpbl9lZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvcGluX2VkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzFkYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvcGluX2VkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9wcmludF9lZGl0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ByaW50X2VkaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGNiODRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ByaW50X2VkaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvcmVkb19lZGl0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3JlZG9fZWRpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NGU1YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvcmVkb19lZGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3NhdmVfZWRpdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zYXZlX2VkaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTlkZDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3NhdmVfZWRpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zYXZlYWxsX2VkaXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvc2F2ZWFsbF9lZGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwZWFiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zYXZlYWxsX2VkaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvc2F2ZWFzX2VkaXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvc2F2ZWFzX2VkaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjZiZmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3NhdmVhc19lZGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3VuZG9fZWRpdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi91bmRvX2VkaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWUxMThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3VuZG9fZWRpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9ia21ya19uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V2aWV3MTYvYmttcmtfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVlZmFkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9ia21ya19uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V2aWV3MTYvZGVmYXVsdF9wZXJzcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9kZWZhdWx0X3BlcnNwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmMzc4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9kZWZhdWx0X3BlcnNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldmlldzE2L2RlZmF1bHR2aWV3X21pc2MuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V2aWV3MTYvZGVmYXVsdHZpZXdfbWlzYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2E4ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V2aWV3MTYvZGVmYXVsdHZpZXdfbWlzYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9maWxlbmF2X25hdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9maWxlbmF2X25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOThhNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V2aWV3MTYvZmlsZW5hdl9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V2aWV3MTYvbmV3X3BlcnNwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldmlldzE2L25ld19wZXJzcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0N2Q0NzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V2aWV3MTYvbmV3X3BlcnNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldmlldzE2L291dGxpbmVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V2aWV3MTYvb3V0bGluZV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzg2MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V2aWV3MTYvb3V0bGluZV9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9wcm9ibGVtc192aWV3LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldmlldzE2L3Byb2JsZW1zX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDdiMjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldmlldzE2L3Byb2JsZW1zX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL2V2aWV3MTYvcHJvcF9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9wcm9wX3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExYzk5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9wcm9wX3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldmlldzE2L3Rhc2tzX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi90YXNrc190c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2QxMGY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9ldmlldzE2L3Rhc2tzX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYWN0aXZpdHkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzMzU2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2FjdGl2aXR5X2NhdGVnb3J5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9hY3Rpdml0eV9jYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YzIyM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2FjdGl2aXR5X2NhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9hZGRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9hZGRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyZDdlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYWRkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYmttcmtfdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9ia21ya190c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmM3ZmJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9ia21ya190c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2JsYW5rLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9ibGFuay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNjRiNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2JsYW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9jaGFuZ2Vfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9jaGFuZ2Vfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4YmRiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2hhbmdlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29tcGxldGVfdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9jb21wbGV0ZV90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FjYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9jb21wbGV0ZV90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2RlbGV0ZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2RlbGV0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjkyMmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWxldGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50c19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYmU3ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZXJyb3JfdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9lcnJvcl90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjA0OGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9lcnJvcl90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2ZpbGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9maWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjY2M2YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2ZpbGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWU3MDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Mzg5NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2ZvbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2hlYWRlcl9jb21wbGV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvaGVhZGVyX2NvbXBsZXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzNjUxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvaGVhZGVyX2NvbXBsZXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9oZWFkZXJfcHJpb3JpdHkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2hlYWRlcl9wcmlvcml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTc5MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2hlYWRlcl9wcmlvcml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvaHByaW9fdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9ocHJpb190c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDlkYmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9ocHJpb190c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2luY29tcGxldGVfdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9pbmNvbXBsZXRlX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YjlmOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2luY29tcGxldGVfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9pbmZvX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5mb190c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGEwMDFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9pbmZvX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYva2V5Z3JvdXBzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYva2V5Z3JvdXBzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODdjNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2tleWdyb3Vwc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2xheW91dF9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGF5b3V0X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4Y2RkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGF5b3V0X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9scHJpb190c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2xwcmlvX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ODE1YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L2xwcmlvX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbWVudS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbWVudS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NmVjNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L21lbnUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L3N1Ym1lbnUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L3N1Ym1lbnUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjI4ZGM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9zdWJtZW51LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi90YXNrbXJrX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFza21ya190c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzNlMzMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi90YXNrbXJrX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGhlbWVfY2F0ZWdvcnkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L3RoZW1lX2NhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwNzlmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGhlbWVfY2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L3Rvb2xiYXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L3Rvb2xiYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODczNWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi90b29sYmFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi93YXJuX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2Fybl90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDAwOWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vYmoxNi93YXJuX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd29ya2luZ3NldHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL29iajE2L3dvcmtpbmdzZXRzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4YzlmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd29ya2luZ3NldHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL292cjE2L2xvY2tfb3ZyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NrX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZWRiYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL292cjE2L2xvY2tfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vdnIxNi9waW5uZWRfb3ZyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9vdnIxNi9waW5uZWRfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzYjIwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvcGlubmVkX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9ib3R0b21fbWFzay5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9ib3R0b21fbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZWI0MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvYm90dG9tX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvYm90dG9tX3NvdXJjZS5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9ib3R0b21fc291cmNlLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyNDNjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9ib3R0b21fc291cmNlLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL2ludmFsaWRfbWFzay5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9pbnZhbGlkX21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmViNDBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL2ludmFsaWRfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9pbnZhbGlkX3NvdXJjZS5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9pbnZhbGlkX3NvdXJjZS5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1M2RmNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvaW52YWxpZF9zb3VyY2UuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvbGVmdF9tYXNrLmJtcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL2xlZnRfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZWI0MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvbGVmdF9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL2xlZnRfc291cmNlLmJtcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL2xlZnRfc291cmNlLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkMzA5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9sZWZ0X3NvdXJjZS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9vZmZzY3JlZW5fbWFzay5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9vZmZzY3JlZW5fbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYTdiOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvb2Zmc2NyZWVuX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvb2Zmc2NyZWVuX3NvdXJjZS5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9vZmZzY3JlZW5fc291cmNlLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkZTU3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9vZmZzY3JlZW5fc291cmNlLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL3JpZ2h0X21hc2suYm1wIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvcmlnaHRfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZWI0MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvcmlnaHRfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9yaWdodF9zb3VyY2UuYm1wIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvcmlnaHRfc291cmNlLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjNTBmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9yaWdodF9zb3VyY2UuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvc3RhY2tfbWFzay5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9zdGFja19tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhZDUxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9zdGFja19tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL3N0YWNrX3NvdXJjZS5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci9zdGFja19zb3VyY2UuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YThmYzg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL3N0YWNrX3NvdXJjZS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci90b2Zhc3R2aWV3X21hc2suYm1wIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvdG9mYXN0dmlld19tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlYjQwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci90b2Zhc3R2aWV3X21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvdG9mYXN0dmlld19zb3VyY2UuYm1wIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3BvaW50ZXIvdG9mYXN0dmlld19zb3VyY2UuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDYxMTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL3RvZmFzdHZpZXdfc291cmNlLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL3RvcF9tYXNrLmJtcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL3RvcF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlYjQwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci90b3BfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcG9pbnRlci90b3Bfc291cmNlLmJtcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL3RvcF9zb3VyY2UuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjU1MjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wb2ludGVyL3RvcF9zb3VyY2UuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3Byb2dyZXNzL2Vycm9yc3RhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3Byb2dyZXNzL2Vycm9yc3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2I2MjFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wcm9ncmVzcy9lcnJvcnN0YXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wcm9ncmVzcy9sb2NrZWRzdGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcHJvZ3Jlc3MvbG9ja2Vkc3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjM3OTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wcm9ncmVzcy9sb2NrZWRzdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcHJvZ3Jlc3MvcHJvZ3Jlc3NfZXJyb3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3Byb2dyZXNzL3Byb2dyZXNzX2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzMjUyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcHJvZ3Jlc3MvcHJvZ3Jlc3NfZXJyb3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3Byb2dyZXNzL3Byb2dyZXNzX25vbmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3Byb2dyZXNzL3Byb2dyZXNzX25vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWE1NGE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wcm9ncmVzcy9wcm9ncmVzc19ub25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wcm9ncmVzcy9wcm9ncmVzc19vay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcHJvZ3Jlc3MvcHJvZ3Jlc3Nfb2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmM0NWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wcm9ncmVzcy9wcm9ncmVzc19vay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcHJvZ3Jlc3MvcHJvZ3Jlc3NfdGFzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcHJvZ3Jlc3MvcHJvZ3Jlc3NfdGFzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDU4NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3Byb2dyZXNzL3Byb2dyZXNzX3Rhc2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3Byb2dyZXNzL3B2aWV3LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wcm9ncmVzcy9wdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTU0YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3Byb2dyZXNzL3B2aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wcm9ncmVzcy9zbGVlcGluZy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcHJvZ3Jlc3Mvc2xlZXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjgzZmNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC9wcm9ncmVzcy9zbGVlcGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcHJvZ3Jlc3Mvd2FpdGluZy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvcHJvZ3Jlc3Mvd2FpdGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MzBkYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3Byb2dyZXNzL3dhaXRpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYmIyM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0ZGlyX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydGRpcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTgxODk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0ZGlyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydHByZWZfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0cHJlZl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODYyZjc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0cHJlZl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnR6aXBfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0emlwX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYmM5YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnR6aXBfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTYyZWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydGRpcl93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRkaXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwNDVlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydGRpcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRwcmVmX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydHByZWZfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2Y2ViYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydHByZWZfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0cHJval93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRwcm9qX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjVmYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRwcm9qX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydHppcF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnR6aXBfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxMTRjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydHppcF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDc1ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X3dpei5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld193aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY4NTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2ZpbGVfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZmlsZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZlOTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZmlsZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdmb2xkZXJfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3Zm9sZGVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODhkYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdmb2xkZXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3cHJqX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld3Byal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzdkM2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3cHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dvcmtzZXRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vd29ya3NldF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmJlYWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvaWNvbnMvZnVsbC93aXpiYW4vd29ya3NldF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NGJkNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QbHVnaW4ubmFtZSA9IEVjbGlwc2UgVUkKLVBsdWdpbi5wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCi1FeHRQb2ludC5hY2NlbGVyYXRvckNvbmZpZ3VyYXRpb25zID0gQWNjZWxlcmF0b3IgQ29uZmlndXJhdGlvbnMKLUV4dFBvaW50LmFjY2VsZXJhdG9yU2NvcGVzID0gQWNjZWxlcmF0b3IgU2NvcGVzCi1FeHRQb2ludC5hY2NlbGVyYXRvclNldHMgPSBBY2NlbGVyYXRvciBTZXRzCi1FeHRQb2ludC5hY3Rpb25EZWZpbml0aW9ucyA9IEFjdGlvbiBEZWZpbml0aW9ucwotRXh0UG9pbnQuYWN0aXZpdGllcyA9IEFjdGl2aXRpZXMKLUV4dFBvaW50LmFjdGl2aXR5U3VwcG9ydCA9IEFjdGl2aXR5IFN1cHBvcnQKLUV4dFBvaW50LmFjdGlvblNldHMgPSBBY3Rpb24gU2V0cwotRXh0UG9pbnQuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyA9IEFjdGlvbiBTZXQgUGFydCBBc3NvY2lhdGlvbnMKLUV4dFBvaW50LmJpbmRpbmdzID0gQmluZGluZ3MKLUV4dFBvaW50LmNvbW1hbmRzID0gQ29tbWFuZHMKLUV4dFBvaW50LmNvbW1hbmRJbWFnZXMgPSBDb21tYW5kIEltYWdlcwotRXh0UG9pbnQuY29udGV4dHMgPSBDb250ZXh0cwotRXh0UG9pbnQuZGVjb3JhdG9ycyA9IERlY29yYXRvcnMKLUV4dFBvaW50LmRyb3BBY3Rpb25zID0gRHJvcCBBY3Rpb25zCi1FeHRQb2ludC5lZGl0b3JBY3Rpb25zID0gRWRpdG9yIE1lbnVzIGFuZCBBY3Rpb25zCi1FeHRQb2ludC5lZGl0b3JzID0gRWRpdG9ycwotRXh0UG9pbnQuZWxlbWVudEZhY3RvcmllcyA9IEVsZW1lbnQgRmFjdG9yaWVzCi1FeHRQb2ludC5lbmNvZGluZ3MgPSBFbmNvZGluZ3MKLUV4dFBvaW50LmV4cG9ydFdpemFyZHMgPSBFeHBvcnQgV2l6YXJkcwotRXh0UG9pbnQuZm9udERlZmluaXRpb25zID0gRm9udCBEZWZpbml0aW9ucwotRXh0UG9pbnQuaGVscFN1cHBvcnQgPSBIZWxwIFVJCi1FeHRQb2ludC5oYW5kbGVycyA9IEhhbmRsZXJzCi1FeHRQb2ludC5pbXBvcnRXaXphcmRzID0gSW1wb3J0IFdpemFyZHMKLUV4dFBvaW50LmludHJvID0gSW50cm9kdWN0aW9uIEV4dGVuc2lvbnMKLUV4dFBvaW50LmtleXdvcmRzID0gS2V5d29yZHMKLUV4dFBvaW50Lm1lbnVzID0gTWVudXMKLUV4dFBvaW50Lm5ld1dpemFyZHMgPSBSZXNvdXJjZSBDcmVhdGlvbiBXaXphcmRzCi1FeHRQb2ludC5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMgPSBQZXJzcGVjdGl2ZSBFeHRlbnNpb25zCi1FeHRQb2ludC5wZXJzcGVjdGl2ZXMgPSBQZXJzcGVjdGl2ZXMKLUV4dFBvaW50LnBvcHVwTWVudXMgPSBQb3B1cCBNZW51cwotRXh0UG9pbnQucHJlZmVyZW5jZVBhZ2VzID0gUHJlZmVyZW5jZSBQYWdlcwotRXh0UG9pbnQucHJlZmVyZW5jZVRyYW5zZmVyID0gUHJlZmVyZW5jZSBUcmFuc2ZlcgotRXh0UG9pbnQudGhlbWVzID0gVGhlbWVzCi1FeHRQb2ludC5wcmVzZW50YXRpb25GYWN0b3JpZXMgPSBQcmVzZW50YXRpb24gRmFjdG9yaWVzCi1FeHRQb2ludC5wcm9wZXJ0eVBhZ2VzID0gUHJvcGVydHkgUGFnZXMKLUV4dFBvaW50LnN0YXJ0dXAgPSBTdGFydHVwCi1FeHRQb2ludC5zeXN0ZW1TdW1tYXJ5U2VjdGlvbnMgPSBTeXN0ZW0gU3VtbWFyeSBTZWN0aW9ucwotRXh0UG9pbnQuc2VydmljZXMgPSBTZXJ2aWNlcwotRXh0UG9pbnQudmlld0FjdGlvbnMgPSBWaWV3IE1lbnVzIGFuZCBBY3Rpb25zCi1FeHRQb2ludC52aWV3cyA9IFZpZXdzCi1FeHRQb2ludC53b3JraW5nU2V0cyA9IFdvcmtpbmcgc2V0IGRpYWxvZ3MKLUV4dFBvaW50LmJyb3dzZXJTdXBwb3J0ID0gQnJvd3NlciBTdXBwb3J0Ci0KLVZpZXdzLkNhdGVnb3J5LkJhc2ljID0gR2VuZXJhbAotVmlld3MuSW50cm9BZGFwdGVyID0gV2VsY29tZQotCi1Gb250c1ByZWZlcmVuY2UuQmFubmVyRm9udExhYmVsID0gQmFubmVyIEZvbnQKLUZvbnRzUHJlZmVyZW5jZS5EaWFsb2dGb250TGFiZWwgPSBEaWFsb2cgRm9udAotRm9udHNQcmVmZXJlbmNlLkhlYWRlckZvbnRMYWJlbCA9IEhlYWRlciBGb250Ci1Gb250c1ByZWZlcmVuY2UuVGV4dEZvbnRMYWJlbCA9IFRleHQgRm9udAotRm9udHNQcmVmZXJlbmNlLlRpdGxlRm9udCA9IFBhcnQgdGl0bGUgZm9udAotRm9udHNQcmVmZXJlbmNlLlZpZXdNZXNzYWdlRm9udCA9IFZpZXcgbWVzc2FnZSBmb250Ci1Gb250c1ByZWZlcmVuY2UuQmFubmVyRm9udERlc2NyaXB0aW9uID0gVGhlIGJhbm5lciBmb250IGlzIHVzZWQgaW4gd2l6YXJkIGJhbm5lcnMuCi1Gb250c1ByZWZlcmVuY2UuRGlhbG9nRm9udERlc2NyaXB0aW9uICA9IFRoZSBkaWFsb2cgZm9udCBpcyB0aGUgZm9udCBmb3Igd2lkZ2V0cyBpbiBkaWFsb2dzLgotRm9udHNQcmVmZXJlbmNlLkhlYWRlckZvbnREZXNjcmlwdGlvbiAgPSBUaGUgaGVhZGVyIGZvbnQgaXMgdXNlZCBmb3Igc2VjdGlvbiBoZWFkZXJzIGluIGNvbXBvc2l0ZSB0ZXh0IHBhZ2VzLgotRm9udHNQcmVmZXJlbmNlLlRleHRGb250RGVzY3JpcHRpb24gID0gVGhlIHRleHQgZm9udCBpcyB1c2VkIGJ5IHRleHQgZWRpdG9ycy4KLUZvbnRzUHJlZmVyZW5jZS5UaXRsZUZvbnREZXNjcmlwdGlvbiAgPSBUaGUgZm9udCB0aGF0IGlzIHVzZWQgZm9yIHZpZXcgYW5kIGVkaXRvciB0aXRsZXMuICBQbGVhc2Ugbm90ZSB0aGF0IGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBmb250IG5vdCBiZSBib2xkIG9yIGl0YWxpYyBiZWNhdXNlIHRoZSB3b3JrYmVuY2ggd2lsbCB1c2UgYm9sZCBhbmQgaXRhbGljIHZlcnNpb25zIG9mIHRoaXMgZm9udCB0byBkaXNwbGF5IHByb2dyZXNzLgotRm9udHNQcmVmZXJlbmNlLlZpZXdNZXNzYWdlRm9udERlc2NyaXB0aW9uID0gVGhlIGZvbnQgdGhhdCBpcyB1c2VkIGZvciBtZXNzYWdlcyBpbiB0aGUgdmlldyB0aXRsZSBiYXIgKGlmIHByZXNlbnQpLgotUHJlc2VudGF0aW9uLm1pc2M9QmFzaWMKLVByZXNlbnRhdGlvbi5taXNjLmRlc2M9QmFzaWMgY29sb3JzIGFuZCBmb250cyB1c2VkIHRocm91Z2hvdXQgd29ya2JlbmNoIGRpYWxvZ3MgYW5kIGVkaXRvcnMuCi1QcmVzZW50YXRpb24uZGVmYXVsdD1WaWV3IGFuZCBFZGl0b3IgRm9sZGVycwotUHJlc2VudGF0aW9uLmRlZmF1bHQuZGVzYz1Db2xvcnMgYW5kIGZvbnRzIHVzZWQgYnkgdGhlIGRlZmF1bHQgRWNsaXBzZSBwcmVzZW50YXRpb24uCi1QcmVzZW50YXRpb24uZGVmYXVsdC5uYW1lPURlZmF1bHQKLVByZXNlbnRhdGlvbi5vbGRkZWZhdWx0Lm5hbWU9T2xkIERlZmF1bHQgKEVjbGlwc2UgMy4wKQotUHJlc2VudGF0aW9uLm5hdGl2ZS5uYW1lPU5hdGl2ZSBwcmVzZW50YXRpb24gKGV4cGVyaW1lbnRhbCkKLQotU3lzdGVtU3VtbWFyeS5zZWN0aW9uVGl0bGUucGxhdGZvcm09UGxhdGZvcm0gRGV0YWlscwotCi1jYXRlZ29yeS5maWxlLm5hbWU9RmlsZQotY2F0ZWdvcnkuZmlsZS5kZXNjcmlwdGlvbj0KLWNhdGVnb3J5LmVkaXQubmFtZT1FZGl0Ci1jYXRlZ29yeS5lZGl0LmRlc2NyaXB0aW9uPQotY2F0ZWdvcnkubmF2aWdhdGUubmFtZT1OYXZpZ2F0ZQotY2F0ZWdvcnkubmF2aWdhdGUuZGVzY3JpcHRpb249Ci1jYXRlZ29yeS53aW5kb3cubmFtZT1XaW5kb3cKLWNhdGVnb3J5LndpbmRvdy5kZXNjcmlwdGlvbj0KLWNhdGVnb3J5LmhlbHAubmFtZT1IZWxwCi1jYXRlZ29yeS5oZWxwLmRlc2NyaXB0aW9uPQotY2F0ZWdvcnkudmlldy5uYW1lPVZpZXdzCi1jYXRlZ29yeS52aWV3LmRlc2NyaXB0aW9uPUNvbW1hbmRzIGZvciBvcGVuaW5nIHZpZXdzCi0KLWNvbW1hbmQuYWJvdXRBY3Rpb24uZGVzY3JpcHRpb24gPSBPcGVuIHRoZSBhYm91dCBkaWFsb2cKLWNvbW1hbmQuYWJvdXRBY3Rpb24ubmFtZSA9IEFib3V0Ci1jb21tYW5kLmFjdGl2YXRlRWRpdG9yLmRlc2NyaXB0aW9uID0gQWN0aXZhdGUgdGhlIGVkaXRvcgotY29tbWFuZC5hY3RpdmF0ZUVkaXRvci5uYW1lID0gQWN0aXZhdGUgRWRpdG9yCi1jb21tYW5kLmFkZEJvb2ttYXJrLmRlc2NyaXB0aW9uID0gQWRkIGEgYm9va21hcmsKLWNvbW1hbmQuYWRkQm9va21hcmsubmFtZSA9IEFkZCBCb29rbWFyawotY29tbWFuZC5iYWNrLmRlc2NyaXB0aW9uID0gTmF2aWdhdGUgYmFjawotY29tbWFuZC5iYWNrLm5hbWUgPSBCYWNrCi1jb21tYW5kLmJhY2t3YXJkSGlzdG9yeS5kZXNjcmlwdGlvbiA9IE1vdmUgYmFja3dhcmQgaW4gdGhlIGVkaXRvciBuYXZpZ2F0aW9uIGhpc3RvcnkKLWNvbW1hbmQuYmFja3dhcmRIaXN0b3J5Lm5hbWUgPSBCYWNrd2FyZCBIaXN0b3J5Ci1jb21tYW5kLmNsb3NlLmRlc2NyaXB0aW9uID0gQ2xvc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLWNvbW1hbmQuY2xvc2UubmFtZSA9IENsb3NlCi1jb21tYW5kLmNsb3NlQWxsLmRlc2NyaXB0aW9uID0gQ2xvc2UgYWxsIGVkaXRvcnMKLWNvbW1hbmQuY2xvc2VBbGwubmFtZSA9IENsb3NlIEFsbAotY29tbWFuZC5jbG9zZUFsbFBlcnNwZWN0aXZlcy5kZXNjcmlwdGlvbiA9IENsb3NlIGFsbCBvcGVuIHBlcnNwZWN0aXZlcwotY29tbWFuZC5jbG9zZUFsbFBlcnNwZWN0aXZlcy5uYW1lID0gQ2xvc2UgQWxsIFBlcnNwZWN0aXZlcwotY29tbWFuZC5jbG9zZVBlcnNwZWN0aXZlLmRlc2NyaXB0aW9uID0gQ2xvc2UgdGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUKLWNvbW1hbmQuY2xvc2VQZXJzcGVjdGl2ZS5uYW1lID0gQ2xvc2UgUGVyc3BlY3RpdmUKLWNvbW1hbmQuY29weS5kZXNjcmlwdGlvbiA9IENvcHkgdGhlIHNlbGVjdGlvbiB0byB0aGUgY2xpcGJvYXJkCi1jb21tYW5kLmNvcHkubmFtZSA9IENvcHkKLWNvbW1hbmQuY3VzdG9taXplUGVyc3BlY3RpdmUuZGVzY3JpcHRpb24gPSBDdXN0b21pemUgdGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUKLWNvbW1hbmQuY3VzdG9taXplUGVyc3BlY3RpdmUubmFtZSA9IEN1c3RvbWl6ZSBQZXJzcGVjdGl2ZQotY29tbWFuZC5jdXQuZGVzY3JpcHRpb24gPSBDdXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgY2xpcGJvYXJkCi1jb21tYW5kLmN1dC5uYW1lID0gQ3V0Ci1jb21tYW5kLmRlbGV0ZS5kZXNjcmlwdGlvbiA9IERlbGV0ZSB0aGUgc2VsZWN0aW9uCi1jb21tYW5kLmRlbGV0ZS5uYW1lID0gRGVsZXRlCi1jb21tYW5kLmRpc3BsYXlIZWxwLmRlc2NyaXB0aW9uPSBEaXNwbGF5IGEgSGVscCB0b3BpYwotY29tbWFuZC5kaXNwbGF5SGVscC5ocmVmUGFyYW1ldGVyPSBIZWxwIHRvcGljIGhyZWYKLWNvbW1hbmQuZGlzcGxheUhlbHAubmFtZT0gRGlzcGxheSBIZWxwCi1jb21tYW5kLmV4aXQuZGVzY3JpcHRpb24gPSBFeGl0IHRoZSBhcHBsaWNhdGlvbgotY29tbWFuZC5leGl0Lm5hbWUgPSBFeGl0Ci1jb21tYW5kLmV4cG9ydC5kZXNjcmlwdGlvbiA9IEV4cG9ydAotY29tbWFuZC5leHBvcnQubmFtZSA9IEV4cG9ydAotY29tbWFuZC5maW5kUmVwbGFjZS5kZXNjcmlwdGlvbiA9IEZpbmQgYW5kIHJlcGxhY2UgdGV4dAotY29tbWFuZC5maW5kUmVwbGFjZS5uYW1lID0gRmluZCBhbmQgUmVwbGFjZQotY29tbWFuZC5mb3J3YXJkLmRlc2NyaXB0aW9uID0gTmF2aWdhdGUgZm9yd2FyZAotY29tbWFuZC5mb3J3YXJkLm5hbWUgPSBGb3J3YXJkCi1jb21tYW5kLmZvcndhcmRIaXN0b3J5LmRlc2NyaXB0aW9uID0gTW92ZSBmb3J3YXJkIGluIHRoZSBlZGl0b3IgbmF2aWdhdGlvbiBoaXN0b3J5Ci1jb21tYW5kLmZvcndhcmRIaXN0b3J5Lm5hbWUgPSBGb3J3YXJkIEhpc3RvcnkKLWNvbW1hbmQuZ29JbnRvLmRlc2NyaXB0aW9uID0gTmF2aWdhdGUgaW50byB0aGUgc2VsZWN0ZWQgaXRlbQotY29tbWFuZC5nb0ludG8ubmFtZSA9IEdvIEludG8KLWNvbW1hbmQuaGVscENvbnRlbnRzLmRlc2NyaXB0aW9uID0gT3BlbiB0aGUgaGVscCBjb250ZW50cwotY29tbWFuZC5oZWxwQ29udGVudHMubmFtZSA9IEhlbHAgQ29udGVudHMKLWNvbW1hbmQuaGVscFNlYXJjaC5kZXNjcmlwdGlvbiA9IE9wZW4gdGhlIGhlbHAgc2VhcmNoCi1jb21tYW5kLmhlbHBTZWFyY2gubmFtZSA9IEhlbHAgU2VhcmNoCi1jb21tYW5kLmR5bmFtaWNIZWxwLmRlc2NyaXB0aW9uID0gT3BlbiB0aGUgZHluYW1pYyBoZWxwCi1jb21tYW5kLmR5bmFtaWNIZWxwLm5hbWUgPSBEeW5hbWljIEhlbHAKLWNvbW1hbmQuaGlkZVNob3dFZGl0b3JzLmRlc2NyaXB0aW9uID0gSGlkZSBhbGwgZWRpdG9ycwotY29tbWFuZC5oaWRlU2hvd0VkaXRvcnMubmFtZSA9IEhpZGUgRWRpdG9ycwotY29tbWFuZC5pbXBvcnQuZGVzY3JpcHRpb24gPSBJbXBvcnQKLWNvbW1hbmQuaW1wb3J0Lm5hbWUgPSBJbXBvcnQKLWNvbW1hbmQubG9ja1Rvb2xCYXIuZGVzY3JpcHRpb24gPSBMb2NrIHRoZSBUb29sYmFycwotY29tbWFuZC5sb2NrVG9vbEJhci5uYW1lID0gTG9jayB0aGUgVG9vbGJhcnMKLWNvbW1hbmQubWF4aW1pemVQYXJ0Lm5hbWUgPSBNYXhpbWl6ZSBBY3RpdmUgVmlldyBvciBFZGl0b3IKLWNvbW1hbmQubWF4aW1pemVQYXJ0LmRlc2NyaXB0aW9uID0gVG9nZ2xlcyBtYXhpbWl6ZS9yZXN0b3JlIHN0YXRlIG9mIGFjdGl2ZSB2aWV3IG9yIGVkaXRvcgotY29tbWFuZC5taW5pbWl6ZVBhcnQubmFtZSA9IE1pbmltaXplIEFjdGl2ZSBWaWV3IG9yIEVkaXRvcgotY29tbWFuZC5taW5pbWl6ZVBhcnQuZGVzY3JpcHRpb24gPSBNaW5pbWl6ZXMgdGhlIGFjdGl2ZSB2aWV3IG9yIGVkaXRvcgotY29tbWFuZC5tb3ZlLmRlc2NyaXB0aW9uID0gTW92ZSB0aGUgc2VsZWN0ZWQgaXRlbQotY29tbWFuZC5tb3ZlLm5hbWUgPSBNb3ZlCi1jb21tYW5kLm5ld0VkaXRvci5kZXNjcmlwdGlvbiA9IE9wZW4gYW5vdGhlciBlZGl0b3Igb24gdGhlIGFjdGl2ZSBlZGl0b3IncyBpbnB1dAotY29tbWFuZC5uZXdFZGl0b3IubmFtZSA9IE5ldyBFZGl0b3IKLWNvbW1hbmQubmV3V2luZG93LmRlc2NyaXB0aW9uID0gT3BlbiBhbm90aGVyIHdpbmRvdwotY29tbWFuZC5uZXdXaW5kb3cubmFtZSA9IE5ldyBXaW5kb3cKLWNvbW1hbmQubmV3V2l6YXJkLmRlc2NyaXB0aW9uID0gT3BlbiB0aGUgTmV3IGl0ZW0gd2l6YXJkCi1jb21tYW5kLm5ld1dpemFyZC5uYW1lID0gTmV3Ci1jb21tYW5kLm5leHQuZGVzY3JpcHRpb24gPSBOYXZpZ2F0ZSB0byB0aGUgbmV4dCBpdGVtCi1jb21tYW5kLm5leHQubmFtZSA9IE5leHQKLWNvbW1hbmQubmV4dEVkaXRvci5kZXNjcmlwdGlvbiA9IFN3aXRjaCB0byB0aGUgbmV4dCBlZGl0b3IKLWNvbW1hbmQubmV4dEVkaXRvci5uYW1lID0gTmV4dCBFZGl0b3IKLWNvbW1hbmQubmV4dFBlcnNwZWN0aXZlLmRlc2NyaXB0aW9uID0gU3dpdGNoIHRvIHRoZSBuZXh0IHBlcnNwZWN0aXZlCi1jb21tYW5kLm5leHRQZXJzcGVjdGl2ZS5uYW1lID0gTmV4dCBQZXJzcGVjdGl2ZQotY29tbWFuZC5uZXh0Vmlldy5kZXNjcmlwdGlvbiA9IFN3aXRjaCB0byB0aGUgbmV4dCB2aWV3Ci1jb21tYW5kLm5leHRWaWV3Lm5hbWUgPSBOZXh0IFZpZXcKLWNvbW1hbmQub3BlbkVkaXRvckRyb3BEb3duLmRlc2NyaXB0aW9uID0gT3BlbiB0aGUgZWRpdG9yIGRyb3AgZG93biBsaXN0Ci1jb21tYW5kLm9wZW5FZGl0b3JEcm9wRG93bi5uYW1lID0gT3BlbiBFZGl0b3IgRHJvcCBEb3duCi1jb21tYW5kLnBhc3RlLmRlc2NyaXB0aW9uID0gUGFzdGUgZnJvbSB0aGUgY2xpcGJvYXJkCi1jb21tYW5kLnBhc3RlLm5hbWUgPSBQYXN0ZQotY29tbWFuZC5waW5FZGl0b3IuZGVzY3JpcHRpb24gPSBQaW4gdGhlIGN1cnJlbnQgZWRpdG9yCi1jb21tYW5kLnBpbkVkaXRvci5uYW1lID0gUGluIEVkaXRvcgotY29tbWFuZC5wcmVmZXJlbmNlcy5kZXNjcmlwdGlvbiA9IE9wZW4gdGhlIHByZWZlcmVuY2VzIGRpYWxvZwotY29tbWFuZC5wcmVmZXJlbmNlcy5uYW1lID0gUHJlZmVyZW5jZXMKLWNvbW1hbmQucHJldmlvdXMuZGVzY3JpcHRpb24gPSBOYXZpZ2F0ZSB0byB0aGUgcHJldmlvdXMgaXRlbQotY29tbWFuZC5wcmV2aW91cy5uYW1lID0gUHJldmlvdXMKLWNvbW1hbmQucHJldmlvdXNFZGl0b3IuZGVzY3JpcHRpb24gPSBTd2l0Y2ggdG8gdGhlIHByZXZpb3VzIGVkaXRvcgotY29tbWFuZC5wcmV2aW91c0VkaXRvci5uYW1lID0gUHJldmlvdXMgRWRpdG9yCi1jb21tYW5kLnByZXZpb3VzUGVyc3BlY3RpdmUuZGVzY3JpcHRpb24gPSBTd2l0Y2ggdG8gdGhlIHByZXZpb3VzIHBlcnNwZWN0aXZlCi1jb21tYW5kLnByZXZpb3VzUGVyc3BlY3RpdmUubmFtZSA9IFByZXZpb3VzIFBlcnNwZWN0aXZlCi1jb21tYW5kLnByZXZpb3VzVmlldy5kZXNjcmlwdGlvbiA9IFN3aXRjaCB0byB0aGUgcHJldmlvdXMgdmlldwotY29tbWFuZC5wcmV2aW91c1ZpZXcubmFtZSA9IFByZXZpb3VzIFZpZXcKLWNvbW1hbmQucHJpbnQuZGVzY3JpcHRpb24gPSBQcmludAotY29tbWFuZC5wcmludC5uYW1lID0gUHJpbnQKLWNvbW1hbmQucHJvcGVydGllcy5kZXNjcmlwdGlvbiA9IERpc3BsYXkgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLWNvbW1hbmQucHJvcGVydGllcy5uYW1lID0gUHJvcGVydGllcwotY29tbWFuZC5xdWlja1N0YXJ0LmRlc2NyaXB0aW9uID0gT3BlbiBhIHdlbGNvbWUgcGFnZQotY29tbWFuZC5xdWlja1N0YXJ0Lm5hbWUgPSBXZWxjb21lCi1jb21tYW5kLnJlZG8uZGVzY3JpcHRpb24gPSBSZWRvIHRoZSBsYXN0IG9wZXJhdGlvbgotY29tbWFuZC5yZWRvLm5hbWUgPSBSZWRvCi1jb21tYW5kLnJlZnJlc2guZGVzY3JpcHRpb24gPSBSZWZyZXNoIHRoZSBzZWxlY3RlZCBpdGVtcwotY29tbWFuZC5yZWZyZXNoLm5hbWUgPSBSZWZyZXNoCi1jb21tYW5kLnJlbmFtZS5kZXNjcmlwdGlvbiA9IFJlbmFtZSB0aGUgc2VsZWN0ZWQgaXRlbQotY29tbWFuZC5yZW5hbWUubmFtZSA9IFJlbmFtZQotY29tbWFuZC5yZXNldFBlcnNwZWN0aXZlLmRlc2NyaXB0aW9uID0gUmVzZXQgdGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUgdG8gaXRzIGRlZmF1bHQgc3RhdGUKLWNvbW1hbmQucmVzZXRQZXJzcGVjdGl2ZS5uYW1lID0gUmVzZXQgUGVyc3BlY3RpdmUKLWNvbW1hbmQucmV2ZXJ0LmRlc2NyaXB0aW9uID0gUmV2ZXJ0IHRvIHRoZSBsYXN0IHNhdmVkIHN0YXRlCi1jb21tYW5kLnJldmVydC5uYW1lID0gUmV2ZXJ0Ci1jb21tYW5kLnNhdmUuZGVzY3JpcHRpb24gPSBTYXZlIHRoZSBjdXJyZW50IGNvbnRlbnRzCi1jb21tYW5kLnNhdmUubmFtZSA9IFNhdmUKLWNvbW1hbmQuc2F2ZUFsbC5kZXNjcmlwdGlvbiA9IFNhdmUgYWxsIGN1cnJlbnQgY29udGVudHMKLWNvbW1hbmQuc2F2ZUFsbC5uYW1lID0gU2F2ZSBBbGwKLWNvbW1hbmQuc2F2ZUFzLmRlc2NyaXB0aW9uID0gU2F2ZSB0aGUgY3VycmVudCBjb250ZW50cyB0byBhbm90aGVyIGxvY2F0aW9uCi1jb21tYW5kLnNhdmVBcy5uYW1lID0gU2F2ZSBBcwotY29tbWFuZC5zYXZlUGVyc3BlY3RpdmUuZGVzY3JpcHRpb24gPSBTYXZlIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlCi1jb21tYW5kLnNhdmVQZXJzcGVjdGl2ZS5uYW1lID0gU2F2ZSBQZXJzcGVjdGl2ZSBBcwotY29tbWFuZC5zZWxlY3RBbGwuZGVzY3JpcHRpb24gPSBTZWxlY3QgYWxsCi1jb21tYW5kLnNlbGVjdEFsbC5uYW1lID0gU2VsZWN0IEFsbAotY29tbWFuZC5zaG93S2V5QXNzaXN0LmRlc2NyaXB0aW9uID0gU2hvdyB0aGUga2V5IGFzc2lzdCBkaWFsb2cKLWNvbW1hbmQuc2hvd0tleUFzc2lzdC5uYW1lID0gU2hvdyBLZXkgQXNzaXN0Ci1jb21tYW5kLnNob3dTeXN0ZW1NZW51LmRlc2NyaXB0aW9uID0gU2hvdyB0aGUgc3lzdGVtIG1lbnUKLWNvbW1hbmQuc2hvd1N5c3RlbU1lbnUubmFtZSA9IFNob3cgU3lzdGVtIE1lbnUKLWNvbW1hbmQuc2hvd1ZpZXdNZW51LmRlc2NyaXB0aW9uID0gU2hvdyB0aGUgdmlldyBtZW51Ci1jb21tYW5kLnNob3dWaWV3TWVudS5uYW1lID0gU2hvdyBWaWV3IE1lbnUKLWNvbW1hbmQuc2hvd1ZpZXcubmFtZSA9IFNob3cgVmlldwotY29tbWFuZC5zaG93Vmlldy5kZXNjcmlwdGlvbiA9IFNob3dzIGEgcGFydGljdWxhciB2aWV3Ci1jb21tYW5kLnNob3dWaWV3LnZpZXdJZFBhcmFtZXRlciA9IFZpZXcKLWNvbW1hbmQuc3dpdGNoVG9FZGl0b3IuZGVzY3JpcHRpb24gPSBTd2l0Y2ggdG8gYW4gZWRpdG9yCi1jb21tYW5kLnN3aXRjaFRvRWRpdG9yLm5hbWUgPSBTd2l0Y2ggdG8gRWRpdG9yCi1jb21tYW5kLnRpcHNBbmRUcmlja3MuZGVzY3JpcHRpb24gPSBPcGVuIHRoZSB0aXBzIGFuZCB0cmlja3MgaGVscCBwYWdlCi1jb21tYW5kLnRpcHNBbmRUcmlja3MubmFtZSA9IFRpcHMgYW5kIFRyaWNrcwotY29tbWFuZC51bmRvLmRlc2NyaXB0aW9uID0gVW5kbyB0aGUgbGFzdCBvcGVyYXRpb24KLWNvbW1hbmQudW5kby5uYW1lID0gVW5kbwotY29tbWFuZC51cC5kZXNjcmlwdGlvbiA9IE5hdmlnYXRlIHVwIG9uZSBsZXZlbAotY29tbWFuZC51cC5uYW1lID0gVXAKLQotY29udGV4dC5lZGl0aW5nVGV4dC5kZXNjcmlwdGlvbiA9IEVkaXRpbmcgVGV4dCBDb250ZXh0Ci1jb250ZXh0LmVkaXRpbmdUZXh0Lm5hbWUgPSBFZGl0aW5nIFRleHQKLWNvbnRleHQuZGlhbG9nQW5kV2luZG93Lm5hbWUgPSBJbiBEaWFsb2dzIGFuZCBXaW5kb3dzCi1jb250ZXh0LmRpYWxvZ0FuZFdpbmRvdy5kZXNjcmlwdGlvbiA9IEVpdGhlciBhIGRpYWxvZyBvciBhIHdpbmRvdyBpcyBvcGVuCi1jb250ZXh0LmRpYWxvZy5uYW1lID0gSW4gRGlhbG9ncwotY29udGV4dC5kaWFsb2cuZGVzY3JpcHRpb24gPSBBIGRpYWxvZyBpcyBvcGVuCi1jb250ZXh0LndpbmRvdy5uYW1lID0gSW4gV2luZG93cwotY29udGV4dC53aW5kb3cuZGVzY3JpcHRpb24gPSBBIHdpbmRvdyBpcyBvcGVuCi0KLWtleUNvbmZpZ3VyYXRpb24uZGVmYXVsdC5kZXNjcmlwdGlvbiA9IERlZmF1bHQgS2V5IENvbmZpZ3VyYXRpb24KLWtleUNvbmZpZ3VyYXRpb24uZGVmYXVsdC5uYW1lID0gRGVmYXVsdAota2V5Q29uZmlndXJhdGlvbi5lbWFjcy5kZXNjcmlwdGlvbiA9IEVtYWNzIEtleSBDb25maWd1cmF0aW9uCi1rZXlDb25maWd1cmF0aW9uLmVtYWNzLm5hbWUgPSBFbWFjcwotCi1Db2xvci5hY3RpdmVUYWJUZXh0PUFjdGl2ZSBwYXJ0IGZvcmVncm91bmQKLUNvbG9yLmFjdGl2ZVRhYlRleHREZXNjPVRoZSBjb2xvciB1c2VkIGZvciBhY3RpdmUgdmlldyBhbmQgZWRpdG9yIHRpdGxlIHRleHQuCi1Db2xvci5hY3RpdmVOb2ZvY3VzVGFiVGV4dD1BY3RpdmUgKG5vbi1mb2N1cykgcGFydCBmb3JlZ3JvdW5kCi1Db2xvci5hY3RpdmVOb2ZvY3VzVGFiVGV4dERlc2M9VGhlIGNvbG9yIHVzZWQgZm9yIGFjdGl2ZSAoYnV0IHdpdGhvdXQgZm9jdXMpIHZpZXcgYW5kIGVkaXRvciB0aXRsZSB0ZXh0LgotQ29sb3IuaW5hY3RpdmVUYWJUZXh0PUluYWN0aXZlIHBhcnQgZm9yZWdyb3VuZAotQ29sb3IuaW5hY3RpdmVUYWJUZXh0RGVzYz1UaGUgY29sb3IgdXNlZCBmb3IgaW5hY3RpdmUgdmlldyBhbmQgZWRpdG9yIHRpdGxlIHRleHQuCi0KLUNvbG9yLmFjdGl2ZVRhYkJHU3RhcnQ9QWN0aXZlIHBhcnQgYmFja2dyb3VuZCBiZWdpbgotQ29sb3IuYWN0aXZlVGFiQkdFbmQ9QWN0aXZlIHBhcnQgYmFja2dyb3VuZCBlbmQKLUNvbG9yLmFjdGl2ZVRhYkJHU3RhcnREZXNjPVRoZSBmaXJzdCBjb2xvciB1c2VkIGZvciBhY3RpdmUgdmlldyBhbmQgZWRpdG9yIHRpdGxlIGdyYWRpZW50cy4KLUNvbG9yLmFjdGl2ZVRhYkJHRW5kRGVzYz1UaGUgc2Vjb25kIGNvbG9yIHVzZWQgZm9yIGFjdGl2ZSB2aWV3IGFuZCBlZGl0b3IgdGl0bGUgZ3JhZGllbnRzLgotQ29sb3IuYWN0aXZlTm9mb2N1c1RhYkJHU3RhcnQ9QWN0aXZlIChub24tZm9jdXMpIHBhcnQgYmFja2dyb3VuZCBiZWdpbgotQ29sb3IuYWN0aXZlTm9mb2N1c1RhYkJHRW5kPUFjdGl2ZSAobm9uLWZvY3VzKSBwYXJ0IGJhY2tncm91bmQgZW5kCi1Db2xvci5hY3RpdmVOb2ZvY3VzVGFiQkdTdGFydERlc2M9VGhlIGZpcnN0IGNvbG9yIHVzZWQgZm9yIGFjdGl2ZSAoYnV0IHdpdGhvdXQgZm9jdXMpIHZpZXcgYW5kIGVkaXRvciB0aXRsZSBncmFkaWVudHMuCi1Db2xvci5hY3RpdmVOb2ZvY3VzVGFiQkdFbmREZXNjPVRoZSBzZWNvbmQgY29sb3IgdXNlZCBmb3IgYWN0aXZlIChidXQgd2l0aG91dCBmb2N1cykgdmlldyBhbmQgZWRpdG9yIHRpdGxlIGdyYWRpZW50cy4KLUNvbG9yLmluYWN0aXZlVGFiQkdTdGFydD1JbmFjdGl2ZSBwYXJ0IGJhY2tncm91bmQgYmVnaW4KLUNvbG9yLmluYWN0aXZlVGFiQkdFbmQ9SW5hY3RpdmUgcGFydCBiYWNrZ3JvdW5kIGVuZAotQ29sb3IuaW5hY3RpdmVUYWJCR1N0YXJ0RGVzYz1UaGUgZmlyc3QgY29sb3IgdXNlZCBmb3IgaW5hY3RpdmUgdmlldyBhbmQgZWRpdG9yIHRpdGxlIGdyYWRpZW50cy4gIFRoaXMgY29sb3IgaXMgYWxzbyB1c2VkIGZvciBhY3RpdmUgZWRpdG9ycyB0aGF0IGRvIG5vdCBoYXZlIGZvY3VzLgotQ29sb3IuaW5hY3RpdmVUYWJCR0VuZERlc2M9VGhlIHNlY29uZCBjb2xvciB1c2VkIGZvciBpbmFjdGl2ZSB2aWV3IGFuZCBlZGl0b3IgdGl0bGUgZ3JhZGllbnRzLiAgVGhpcyBjb2xvciBpcyBhbHNvIHVzZWQgZm9yIHRoZSB2aWV3IG1lbnUgYmFja2dyb3VuZC4KLQotQ29sb3IuZXJyb3JUZXh0PUVycm9yIHRleHQgY29sb3IKLUNvbG9yLmVycm9yVGV4dERlc2M9Q29sb3IgdXNlZCB0byBzaG93IGVycm9yIG1lc3NhZ2VzLgotQ29sb3IuaHlwZXJsaW5rVGV4dD1IeXBlcmxpbmsgdGV4dCBjb2xvcgotQ29sb3IuaHlwZXJsaW5rVGV4dERlc2M9Q29sb3IgdXNlZCB0byBzaG93IGxpbmtzLgotQ29sb3IuYWN0aXZlSHlwZXJsaW5rVGV4dD1BY3RpdmUgaHlwZXJsaW5rIHRleHQgY29sb3IKLUNvbG9yLmFjdGl2ZUh5cGVybGlua1RleHREZXNjPUNvbG9yIHVzZWQgdG8gc2hvdyBhY3RpdmUgbGlua3MuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzAwOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIAotICAgIAotPCEtLSBXb3JrYmVuY2ggZXh0ZW5zaW9uIHBvaW50cyAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbnMiIG5hbWU9IiVFeHRQb2ludC5hY2NlbGVyYXRvckNvbmZpZ3VyYXRpb25zIiBzY2hlbWE9InNjaGVtYS9hY2NlbGVyYXRvckNvbmZpZ3VyYXRpb25zLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFjY2VsZXJhdG9yU2NvcGVzIiBuYW1lPSIlRXh0UG9pbnQuYWNjZWxlcmF0b3JTY29wZXMiIHNjaGVtYT0ic2NoZW1hL2FjY2VsZXJhdG9yU2NvcGVzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFjY2VsZXJhdG9yU2V0cyIgbmFtZT0iJUV4dFBvaW50LmFjY2VsZXJhdG9yU2V0cyIgc2NoZW1hPSJzY2hlbWEvYWNjZWxlcmF0b3JTZXRzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFjdGlvbkRlZmluaXRpb25zIiBuYW1lPSIlRXh0UG9pbnQuYWN0aW9uRGVmaW5pdGlvbnMiIHNjaGVtYT0ic2NoZW1hL2FjdGlvbkRlZmluaXRpb25zLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFjdGl2aXRpZXMiIG5hbWU9IiVFeHRQb2ludC5hY3Rpdml0aWVzIiBzY2hlbWE9InNjaGVtYS9hY3Rpdml0aWVzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFjdGl2aXR5U3VwcG9ydCIgbmFtZT0iJUV4dFBvaW50LmFjdGl2aXR5U3VwcG9ydCIgc2NoZW1hPSJzY2hlbWEvYWN0aXZpdHlTdXBwb3J0LmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiIG5hbWU9IiVFeHRQb2ludC5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIiBzY2hlbWE9InNjaGVtYS9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFjdGlvblNldHMiIG5hbWU9IiVFeHRQb2ludC5hY3Rpb25TZXRzIiBzY2hlbWE9InNjaGVtYS9hY3Rpb25TZXRzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImJpbmRpbmdzIiBuYW1lPSIlRXh0UG9pbnQuYmluZGluZ3MiIHNjaGVtYT0ic2NoZW1hL2JpbmRpbmdzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbW1hbmRzIiBuYW1lPSIlRXh0UG9pbnQuY29tbWFuZHMiIHNjaGVtYT0ic2NoZW1hL2NvbW1hbmRzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbW1hbmRJbWFnZXMiIG5hbWU9IiVFeHRQb2ludC5jb21tYW5kSW1hZ2VzIiBzY2hlbWE9InNjaGVtYS9jb21tYW5kSW1hZ2VzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbnRleHRzIiBuYW1lPSIlRXh0UG9pbnQuY29udGV4dHMiIHNjaGVtYT0ic2NoZW1hL2NvbnRleHRzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImhhbmRsZXJzIiBuYW1lPSIlRXh0UG9pbnQuaGFuZGxlcnMiIHNjaGVtYT0ic2NoZW1hL2hhbmRsZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImRlY29yYXRvcnMiIG5hbWU9IiVFeHRQb2ludC5kZWNvcmF0b3JzIiBzY2hlbWE9InNjaGVtYS9kZWNvcmF0b3JzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImRyb3BBY3Rpb25zIiBuYW1lPSIlRXh0UG9pbnQuZHJvcEFjdGlvbnMiIHNjaGVtYT0ic2NoZW1hL2Ryb3BBY3Rpb25zLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRvckFjdGlvbnMiIG5hbWU9IiVFeHRQb2ludC5lZGl0b3JBY3Rpb25zIiBzY2hlbWE9InNjaGVtYS9lZGl0b3JBY3Rpb25zLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRvcnMiIG5hbWU9IiVFeHRQb2ludC5lZGl0b3JzIiBzY2hlbWE9InNjaGVtYS9lZGl0b3JzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVsZW1lbnRGYWN0b3JpZXMiIG5hbWU9IiVFeHRQb2ludC5lbGVtZW50RmFjdG9yaWVzIiBzY2hlbWE9InNjaGVtYS9lbGVtZW50RmFjdG9yaWVzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVuY29kaW5ncyIgbmFtZT0iJUV4dFBvaW50LmVuY29kaW5ncyIgc2NoZW1hPSJzY2hlbWEvZW5jb2RpbmdzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4cG9ydFdpemFyZHMiIG5hbWU9IiVFeHRQb2ludC5leHBvcnRXaXphcmRzIiBzY2hlbWE9InNjaGVtYS9leHBvcnRXaXphcmRzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImZvbnREZWZpbml0aW9ucyIgbmFtZT0iJUV4dFBvaW50LmZvbnREZWZpbml0aW9ucyIgc2NoZW1hPSJzY2hlbWEvZm9udERlZmluaXRpb25zLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImhlbHBTdXBwb3J0IiBuYW1lPSIlRXh0UG9pbnQuaGVscFN1cHBvcnQiIHNjaGVtYT0ic2NoZW1hL2hlbHBTdXBwb3J0LmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImltcG9ydFdpemFyZHMiIG5hbWU9IiVFeHRQb2ludC5pbXBvcnRXaXphcmRzIiBzY2hlbWE9InNjaGVtYS9pbXBvcnRXaXphcmRzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImludHJvIiBuYW1lPSIlRXh0UG9pbnQuaW50cm8iIHNjaGVtYT0ic2NoZW1hL2ludHJvLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImtleXdvcmRzIiBuYW1lPSIlRXh0UG9pbnQua2V5d29yZHMiIHNjaGVtYT0ic2NoZW1hL2tleXdvcmRzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1lbnVzIiBuYW1lPSIlRXh0UG9pbnQubWVudXMiIHNjaGVtYT0ic2NoZW1hL21lbnVzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im5ld1dpemFyZHMiIG5hbWU9IiVFeHRQb2ludC5uZXdXaXphcmRzIiBzY2hlbWE9InNjaGVtYS9uZXdXaXphcmRzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InBlcnNwZWN0aXZlRXh0ZW5zaW9ucyIgbmFtZT0iJUV4dFBvaW50LnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyIgc2NoZW1hPSJzY2hlbWEvcGVyc3BlY3RpdmVFeHRlbnNpb25zLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InBlcnNwZWN0aXZlcyIgbmFtZT0iJUV4dFBvaW50LnBlcnNwZWN0aXZlcyIgc2NoZW1hPSJzY2hlbWEvcGVyc3BlY3RpdmVzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InBvcHVwTWVudXMiIG5hbWU9IiVFeHRQb2ludC5wb3B1cE1lbnVzIiBzY2hlbWE9InNjaGVtYS9wb3B1cE1lbnVzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByZWZlcmVuY2VQYWdlcyIgbmFtZT0iJUV4dFBvaW50LnByZWZlcmVuY2VQYWdlcyIgc2NoZW1hPSJzY2hlbWEvcHJlZmVyZW5jZVBhZ2VzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByZWZlcmVuY2VUcmFuc2ZlciIgbmFtZT0iJUV4dFBvaW50LnByZWZlcmVuY2VUcmFuc2ZlciIgc2NoZW1hPSJzY2hlbWEvcHJlZmVyZW5jZVRyYW5zZmVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByZXNlbnRhdGlvbkZhY3RvcmllcyIgbmFtZT0iJUV4dFBvaW50LnByZXNlbnRhdGlvbkZhY3RvcmllcyIgc2NoZW1hPSJzY2hlbWEvcHJlc2VudGF0aW9uRmFjdG9yaWVzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByb3BlcnR5UGFnZXMiIG5hbWU9IiVFeHRQb2ludC5wcm9wZXJ0eVBhZ2VzIiBzY2hlbWE9InNjaGVtYS9wcm9wZXJ0eVBhZ2VzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InN0YXJ0dXAiIG5hbWU9IiVFeHRQb2ludC5zdGFydHVwIiBzY2hlbWE9InNjaGVtYS9zdGFydHVwLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InN5c3RlbVN1bW1hcnlTZWN0aW9ucyIgbmFtZT0iJUV4dFBvaW50LnN5c3RlbVN1bW1hcnlTZWN0aW9ucyIgc2NoZW1hPSJzY2hlbWEvc3lzdGVtU3VtbWFyeVNlY3Rpb25zLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InRoZW1lcyIgbmFtZT0iJUV4dFBvaW50LnRoZW1lcyIgc2NoZW1hPSJzY2hlbWEvdGhlbWVzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InZpZXdBY3Rpb25zIiBuYW1lPSIlRXh0UG9pbnQudmlld0FjdGlvbnMiIHNjaGVtYT0ic2NoZW1hL3ZpZXdBY3Rpb25zLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InZpZXdzIiBuYW1lPSIlRXh0UG9pbnQudmlld3MiIHNjaGVtYT0ic2NoZW1hL3ZpZXdzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndvcmtpbmdTZXRzIiBuYW1lPSIlRXh0UG9pbnQud29ya2luZ1NldHMiIHNjaGVtYT0ic2NoZW1hL3dvcmtpbmdTZXRzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlcnZpY2VzIiBuYW1lPSIlRXh0UG9pbnQuc2VydmljZXMiIHNjaGVtYT0ic2NoZW1hL3NlcnZpY2VzLm14c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImJyb3dzZXJTdXBwb3J0IiBuYW1lPSIlRXh0UG9pbnQuYnJvd3NlclN1cHBvcnQiIHNjaGVtYT0ic2NoZW1hL2Jyb3dzZXJTdXBwb3J0LmV4c2QiLz4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIj4KLSAgICAgIDxjb250ZXh0Ci0gICAgICAgICAgICBuYW1lPSIlY29udGV4dC5lZGl0aW5nVGV4dC5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb250ZXh0LmVkaXRpbmdUZXh0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRFZGl0b3JTY29wZSIKLSAgICAgICAgICAgIHBhcmVudElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy53aW5kb3ciPgotICAgICAgPC9jb250ZXh0PgotPCEtLSBUaGlzIGlzIHRoZSByb290IGNvbnRleHQuICBCYXNpY2FsbHksIGFsbCBrZXkgYmluZGluZ3Mgc2hvdWxkIGhhdmUKLSAgICAgICAgICAgdGhpcyBjb250ZXh0IGFzIHRoZWlyIHBhcmVudC4gIEtleSBiaW5kaW5ncyBpbiB0aGlzIGNvbnRleHQgd2lsbAotICAgICAgICAgICBhcHBseSB0byBib3RoIHdpbmRvd3MgYW5kIGRpYWxvZ3MuCi0gICAgICAgIC0tPgotICAgICAgPGNvbnRleHQKLSAgICAgICAgICAgIG5hbWU9IiVjb250ZXh0LmRpYWxvZ0FuZFdpbmRvdy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb250ZXh0LmRpYWxvZ0FuZFdpbmRvdy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5kaWFsb2dBbmRXaW5kb3ciPgotICAgICAgPC9jb250ZXh0PgotPCEtLSBUaGlzIGlzIHRoZSByb290IGNvbnRleHQgZm9yIGtleSBiaW5kaW5ncyB0aGF0IHNob3VsZCBhcHBseSBpbgotICAgICAgICAgICB3aW5kb3dzIChlLmcuLCBJV29ya2JlbmNoV2luZG93KS4gIEtleSBiaW5kaW5ncyBpbiB0aGlzIGNvbnRleHQKLSAgICAgICAgICAgd2lsbCBvbmx5IGFwcGx5IHRvIHdpbmRvd3MgKG5vdCBkaWFsb2dzKS4KLSAgICAgICAgLS0+Ci0gICAgICA8Y29udGV4dAotICAgICAgICAgICAgbmFtZT0iJWNvbnRleHQud2luZG93Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbnRleHQud2luZG93LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLndpbmRvdyIKLSAgICAgICAgICAgIHBhcmVudElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5kaWFsb2dBbmRXaW5kb3ciPgotICAgICAgPC9jb250ZXh0PgotPCEtLSBUaGlzIGlzIHRoZSByb290IGNvbnRleHQgZm9yIGtleSBiaW5kaW5ncyB0aGF0IHNob3VsZCBhcHBseSBpbgotICAgICAgICAgICBkaWFsb2dzIChlLmcuLCBzaGVsbHMgd2l0aG91dCBwYXJlbnRzKS4gIEtleSBiaW5kaW5ncyBpbiB0aGlzCi0gICAgICAgICAgIGNvbnRleHQgd2lsbCBvbmx5IGFwcGx5IHRvIGRpYWxvZ3MgKG5vdCB3aW5kb3dzKS4KLSAgICAgICAgLS0+Ci0gICAgICA8Y29udGV4dAotICAgICAgICAgICAgbmFtZT0iJWNvbnRleHQuZGlhbG9nLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbnRleHQuZGlhbG9nLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLmRpYWxvZyIKLSAgICAgICAgICAgIHBhcmVudElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5kaWFsb2dBbmRXaW5kb3ciPgotICAgICAgPC9jb250ZXh0PgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmJpbmRpbmdzIj4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK04iCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5jbG9zZSIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMStXIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmZpbGUuY2xvc2UiCi0gICAgICAgICAgICBzZXF1ZW5jZT0iTTErRjQiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5jbG9zZUFsbCIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMStNMitXIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmZpbGUuY2xvc2VBbGwiCi0gICAgICAgICAgICBzZXF1ZW5jZT0iTTErTTIrRjQiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5zYXZlIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK1MiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5zYXZlQWxsIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK00yK1MiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5yZW5hbWUiCi0gICAgICAgICAgICBzZXF1ZW5jZT0iRjIiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5wcmludCIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMStQIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmZpbGUucHJvcGVydGllcyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMytDUiIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5maWxlLnJlZnJlc2giCi0gICAgICAgICAgICBzZXF1ZW5jZT0iRjUiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC51bmRvIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK1oiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5yZWRvIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK1kiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5jdXQiCi0gICAgICAgICAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLmRpYWxvZ0FuZFdpbmRvdyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMStYIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuY29weSIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMuZGlhbG9nQW5kV2luZG93IgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK0MiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5wYXN0ZSIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMuZGlhbG9nQW5kV2luZG93IgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK1YiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5zZWxlY3RBbGwiCi0gICAgICAgICAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLmRpYWxvZ0FuZFdpbmRvdyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMStBIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuZGVsZXRlIgotICAgICAgICAgICAgc2VxdWVuY2U9IkRFTCIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5lZGl0LmZpbmRSZXBsYWNlIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK0YiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdGUubmV4dCIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMSsuIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLnByZXZpb3VzIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xKywiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdGUuYmFja3dhcmRIaXN0b3J5IgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0zK0FSUk9XX0xFRlQiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdGUuZm9yd2FyZEhpc3RvcnkiCi0gICAgICAgICAgICBzZXF1ZW5jZT0iTTMrQVJST1dfUklHSFQiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkud2luZG93Lm9wZW5FZGl0b3JEcm9wRG93biIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMStFIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5zd2l0Y2hUb0VkaXRvciIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMStNMitFIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5zaG93U3lzdGVtTWVudSIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMystIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5zaG93Vmlld01lbnUiCi0gICAgICAgICAgICBzZXF1ZW5jZT0iTTErRjEwIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5hY3RpdmF0ZUVkaXRvciIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJGMTIiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkud2luZG93Lm1heGltaXplUGFydCIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMStNIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5uZXh0RWRpdG9yIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK0Y2IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5wcmV2aW91c0VkaXRvciIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMStNMitGNiIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cubmV4dFZpZXciCi0gICAgICAgICAgICBzZXF1ZW5jZT0iTTErRjciCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkud2luZG93LnByZXZpb3VzVmlldyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMStNMitGNyIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cubmV4dFBlcnNwZWN0aXZlIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK0Y4IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5wcmV2aW91c1BlcnNwZWN0aXZlIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK00yK0Y4IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBwbGF0Zm9ybT0iY2FyYm9uIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK0Y0IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBwbGF0Zm9ybT0iY2FyYm9uIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK00yK0Y0IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBwbGF0Zm9ybT0iY2FyYm9uIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xKywiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdGUucHJldmlvdXMiCi0gICAgICAgICAgICBwbGF0Zm9ybT0iY2FyYm9uIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK00yKy4iCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5jdXQiCi0gICAgICAgICAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLmRpYWxvZ0FuZFdpbmRvdyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMitERUwiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5jb3B5IgotICAgICAgICAgICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5kaWFsb2dBbmRXaW5kb3ciCi0gICAgICAgICAgICBzZXF1ZW5jZT0iTTErSU5TRVJUIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQucGFzdGUiCi0gICAgICAgICAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLmRpYWxvZ0FuZFdpbmRvdyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJNMitJTlNFUlQiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5jbG9zZSIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJDVFJMK1ggSyIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5lbWFjc0FjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5jbG9zZUFsbCIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJDVFJMK1ggQ1RSTCtDIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmVtYWNzQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5maWxlLnNhdmUiCi0gICAgICAgICAgICBzZXF1ZW5jZT0iQ1RSTCtYIENUUkwrUyIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5lbWFjc0FjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5zYXZlQWxsIgotICAgICAgICAgICAgc2VxdWVuY2U9IkNUUkwrWCBTIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmVtYWNzQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5maWxlLnByaW50IgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0zK0Y5IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmVtYWNzQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5maWxlLnByaW50IgotICAgICAgICAgICAgc2VxdWVuY2U9IkVTQyBGOSIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5lbWFjc0FjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC51bmRvIgotICAgICAgICAgICAgc2VxdWVuY2U9IkY5IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmVtYWNzQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnVuZG8iCi0gICAgICAgICAgICBzZXF1ZW5jZT0iQ1RSTCtYIFUiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZW1hY3NBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudW5kbyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJDVFJMK00yKy0iCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZW1hY3NBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQucmVkbyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJGMTAiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZW1hY3NBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQucmVkbyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJDVFJMK1ggUiIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5lbWFjc0FjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5yZWRvIgotICAgICAgICAgICAgc2VxdWVuY2U9IkNUUkwrTTIrKyIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5lbWFjc0FjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5jdXQiCi0gICAgICAgICAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLmRpYWxvZ0FuZFdpbmRvdyIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJDVFJMK1ciCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZW1hY3NBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuY29weSIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMuZGlhbG9nQW5kV2luZG93IgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0zK1ciCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZW1hY3NBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuY29weSIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMuZGlhbG9nQW5kV2luZG93IgotICAgICAgICAgICAgc2VxdWVuY2U9IkVTQyBXIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmVtYWNzQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnBhc3RlIgotICAgICAgICAgICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5kaWFsb2dBbmRXaW5kb3ciCi0gICAgICAgICAgICBzZXF1ZW5jZT0iQ1RSTCtZIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmVtYWNzQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnNlbGVjdEFsbCIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMuZGlhbG9nQW5kV2luZG93IgotICAgICAgICAgICAgc2VxdWVuY2U9IkNUUkwrWCBIIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmVtYWNzQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5lZGl0LmZpbmRSZXBsYWNlIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0zK1IiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZW1hY3NBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuZmluZFJlcGxhY2UiCi0gICAgICAgICAgICBzZXF1ZW5jZT0iRVNDIFIiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZW1hY3NBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5vcGVuRWRpdG9yRHJvcERvd24iCi0gICAgICAgICAgICBzZXF1ZW5jZT0iQ1RSTCtYIEIiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZW1hY3NBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5zd2l0Y2hUb0VkaXRvciIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJDVFJMK1ggQ1RSTCtCIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmVtYWNzQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIiAvPgotICAgICAgPHNjaGVtZQotICAgICAgICAgICAgbmFtZT0iJWtleUNvbmZpZ3VyYXRpb24uZGVmYXVsdC5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVrZXlDb25maWd1cmF0aW9uLmRlZmF1bHQuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8L3NjaGVtZT4KLSAgICAgIDxzY2hlbWUKLSAgICAgICAgICAgIG5hbWU9IiVrZXlDb25maWd1cmF0aW9uLmVtYWNzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWtleUNvbmZpZ3VyYXRpb24uZW1hY3MuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBwYXJlbnRJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lbWFjc0FjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8L3NjaGVtZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlY2F0ZWdvcnkuZmlsZS5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjYXRlZ29yeS5maWxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmZpbGUiIC8+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVjYXRlZ29yeS5lZGl0Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNhdGVnb3J5LmVkaXQuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIgLz4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWNhdGVnb3J5Lm5hdmlnYXRlLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNhdGVnb3J5Lm5hdmlnYXRlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5Lm5hdmlnYXRlIiAvPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlY2F0ZWdvcnkud2luZG93Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNhdGVnb3J5LndpbmRvdy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS53aW5kb3ciIC8+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVjYXRlZ29yeS5oZWxwLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNhdGVnb3J5LmhlbHAuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuaGVscCIgLz4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWNhdGVnb3J5LnZpZXcubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY2F0ZWdvcnkudmlldy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS52aWV3cyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLmhlbHBDb250ZW50cy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLmhlbHBDb250ZW50cy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmhlbHAiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaGVscC5oZWxwQ29udGVudHMiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuaGVscFNlYXJjaC5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLmhlbHBTZWFyY2guZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5oZWxwIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmhlbHAuaGVscFNlYXJjaCIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5keW5hbWljSGVscC5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLmR5bmFtaWNIZWxwLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuaGVscCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5oZWxwLmR5bmFtaWNIZWxwIiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLnF1aWNrU3RhcnQubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5xdWlja1N0YXJ0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuaGVscCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5oZWxwLnF1aWNrU3RhcnRBY3Rpb24iIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQudGlwc0FuZFRyaWNrcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLnRpcHNBbmRUcmlja3MuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5oZWxwIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmhlbHAudGlwc0FuZFRyaWNrc0FjdGlvbiIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5hYm91dEFjdGlvbi5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLmFib3V0QWN0aW9uLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuaGVscCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5oZWxwLmFib3V0QWN0aW9uIiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLm5ld1dpemFyZC5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLm5ld1dpemFyZC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmZpbGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkIiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLmNsb3NlLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuY2xvc2UuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5maWxlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZpbGUuY2xvc2UiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuY2xvc2VBbGwubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5jbG9zZUFsbC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmZpbGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5jbG9zZUFsbCIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5pbXBvcnQubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5pbXBvcnQuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5maWxlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZpbGUuaW1wb3J0IiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLmV4cG9ydC5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLmV4cG9ydC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmZpbGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5leHBvcnQiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuc2F2ZS5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLnNhdmUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5maWxlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZpbGUuc2F2ZSIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5zYXZlQXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5zYXZlQXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5maWxlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZpbGUuc2F2ZUFzIiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLnNhdmVBbGwubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5zYXZlQWxsLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZmlsZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5maWxlLnNhdmVBbGwiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQucHJpbnQubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5wcmludC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmZpbGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5wcmludCIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5yZXZlcnQubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5yZXZlcnQuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5maWxlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZpbGUucmV2ZXJ0IiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLnJlZnJlc2gubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5yZWZyZXNoLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZmlsZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5maWxlLnJlZnJlc2giIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQucHJvcGVydGllcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLnByb3BlcnRpZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5maWxlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZpbGUucHJvcGVydGllcyIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5leGl0Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuZXhpdC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmZpbGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZmlsZS5leGl0IiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLnVuZG8ubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC51bmRvLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnVuZG8iIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQucmVkby5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLnJlZG8uZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQucmVkbyIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5jdXQubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5jdXQuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuY3V0IgotICAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmhhbmRsZXJzLldpZGdldE1ldGhvZEhhbmRsZXI6Y3V0IiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLmNvcHkubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5jb3B5LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0LmNvcHkiCi0gICAgICAgICAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuV2lkZ2V0TWV0aG9kSGFuZGxlcjpjb3B5IiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLnBhc3RlLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQucGFzdGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQucGFzdGUiCi0gICAgICAgICAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuV2lkZ2V0TWV0aG9kSGFuZGxlcjpwYXN0ZSIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5kZWxldGUubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5kZWxldGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuZGVsZXRlIiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLm1vdmUubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5tb3ZlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZmlsZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0Lm1vdmUiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQucmVuYW1lLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQucmVuYW1lLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZmlsZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnJlbmFtZSIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5zZWxlY3RBbGwubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5zZWxlY3RBbGwuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuc2VsZWN0QWxsIgotICAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmhhbmRsZXJzLlNlbGVjdEFsbEhhbmRsZXIiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuZmluZFJlcGxhY2UubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5maW5kUmVwbGFjZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5maW5kUmVwbGFjZSIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5hZGRCb29rbWFyay5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLmFkZEJvb2ttYXJrLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0LmFkZEJvb2ttYXJrIiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLmdvSW50by5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLmdvSW50by5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5Lm5hdmlnYXRlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLmdvSW50byIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5iYWNrLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuYmFjay5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5Lm5hdmlnYXRlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLmJhY2siIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuZm9yd2FyZC5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLmZvcndhcmQuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5uYXZpZ2F0ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0ZS5mb3J3YXJkIiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLnVwLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQudXAuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5uYXZpZ2F0ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0ZS51cCIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5uZXh0Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQubmV4dC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5Lm5hdmlnYXRlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLm5leHQiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuYmFja3dhcmRIaXN0b3J5Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuYmFja3dhcmRIaXN0b3J5LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkubmF2aWdhdGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdGUuYmFja3dhcmRIaXN0b3J5IiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVjb21tYW5kLmZvcndhcmRIaXN0b3J5Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuZm9yd2FyZEhpc3RvcnkuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5uYXZpZ2F0ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0ZS5mb3J3YXJkSGlzdG9yeSIgLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlY29tbWFuZC5wcmV2aW91cy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLnByZXZpb3VzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkubmF2aWdhdGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdGUucHJldmlvdXMiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQubmV3V2luZG93Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQubmV3V2luZG93LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkud2luZG93IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5uZXdXaW5kb3ciIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQubmV3RWRpdG9yLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQubmV3RWRpdG9yLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkud2luZG93IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5uZXdFZGl0b3IiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQub3BlbkVkaXRvckRyb3BEb3duLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQub3BlbkVkaXRvckRyb3BEb3duLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkud2luZG93IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5vcGVuRWRpdG9yRHJvcERvd24iIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuc3dpdGNoVG9FZGl0b3IubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5zd2l0Y2hUb0VkaXRvci5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LndpbmRvdyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cuc3dpdGNoVG9FZGl0b3IiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuc2hvd1N5c3RlbU1lbnUubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5zaG93U3lzdGVtTWVudS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LndpbmRvdyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cuc2hvd1N5c3RlbU1lbnUiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuc2hvd1ZpZXdNZW51Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuc2hvd1ZpZXdNZW51LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkud2luZG93IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5zaG93Vmlld01lbnUiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuYWN0aXZhdGVFZGl0b3IubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5hY3RpdmF0ZUVkaXRvci5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LndpbmRvdyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cuYWN0aXZhdGVFZGl0b3IiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQubWF4aW1pemVQYXJ0Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQubWF4aW1pemVQYXJ0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkud2luZG93IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5tYXhpbWl6ZVBhcnQiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQubWluaW1pemVQYXJ0Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQubWluaW1pemVQYXJ0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkud2luZG93IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5taW5pbWl6ZVBhcnQiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQubmV4dEVkaXRvci5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLm5leHRFZGl0b3IuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS53aW5kb3ciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud2luZG93Lm5leHRFZGl0b3IiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQucHJldmlvdXNFZGl0b3IubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5wcmV2aW91c0VkaXRvci5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LndpbmRvdyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cucHJldmlvdXNFZGl0b3IiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQubmV4dFZpZXcubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5uZXh0Vmlldy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LndpbmRvdyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cubmV4dFZpZXciIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQucHJldmlvdXNWaWV3Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQucHJldmlvdXNWaWV3LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkud2luZG93IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5wcmV2aW91c1ZpZXciIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQubmV4dFBlcnNwZWN0aXZlLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQubmV4dFBlcnNwZWN0aXZlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkud2luZG93IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5uZXh0UGVyc3BlY3RpdmUiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQucHJldmlvdXNQZXJzcGVjdGl2ZS5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLnByZXZpb3VzUGVyc3BlY3RpdmUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS53aW5kb3ciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud2luZG93LnByZXZpb3VzUGVyc3BlY3RpdmUiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuY2xvc2VBbGxQZXJzcGVjdGl2ZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5jbG9zZUFsbFBlcnNwZWN0aXZlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LndpbmRvdyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cuY2xvc2VBbGxQZXJzcGVjdGl2ZXMiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuY2xvc2VQZXJzcGVjdGl2ZS5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLmNsb3NlUGVyc3BlY3RpdmUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS53aW5kb3ciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud2luZG93LmNsb3NlUGVyc3BlY3RpdmUiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuY3VzdG9taXplUGVyc3BlY3RpdmUubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5jdXN0b21pemVQZXJzcGVjdGl2ZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LndpbmRvdyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cuY3VzdG9taXplUGVyc3BlY3RpdmUiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuaGlkZVNob3dFZGl0b3JzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuaGlkZVNob3dFZGl0b3JzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkud2luZG93IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5oaWRlU2hvd0VkaXRvcnMiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQubG9ja1Rvb2xCYXIubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5sb2NrVG9vbEJhci5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LndpbmRvdyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cubG9ja1Rvb2xCYXIiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQucGluRWRpdG9yLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQucGluRWRpdG9yLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkud2luZG93IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5waW5FZGl0b3IiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQucHJlZmVyZW5jZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5wcmVmZXJlbmNlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LndpbmRvdyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cucHJlZmVyZW5jZXMiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQucmVzZXRQZXJzcGVjdGl2ZS5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21tYW5kLnJlc2V0UGVyc3BlY3RpdmUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS53aW5kb3ciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud2luZG93LnJlc2V0UGVyc3BlY3RpdmUiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuc2F2ZVBlcnNwZWN0aXZlLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbW1hbmQuc2F2ZVBlcnNwZWN0aXZlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkud2luZG93IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5zYXZlUGVyc3BlY3RpdmUiIC8+Ci0gICAgICA8Y29tbWFuZAotICAgICAgCQluYW1lPSIlY29tbWFuZC5zaG93S2V5QXNzaXN0Lm5hbWUiCi0gICAgICAJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5zaG93S2V5QXNzaXN0LmRlc2NyaXB0aW9uIgotICAgICAgCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS53aW5kb3ciCi0gICAgICAJCWlkPSJvcmcuZWNsaXBzZS51aS53aW5kb3cuc2hvd0tleUFzc2lzdCIKLSAgICAgIAkJZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmhhbmRsZXJzLlNob3dLZXlBc3Npc3RIYW5kbGVyIiAvPgotICAgICAgPGNvbW1hbmQKLSAgICAgIAkJbmFtZT0iJWNvbW1hbmQuc2hvd1ZpZXcubmFtZSIKLSAgICAgIAkJZGVzY3JpcHRpb249IiVjb21tYW5kLnNob3dWaWV3LmRlc2NyaXB0aW9uIgotICAgICAgCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS52aWV3cyIKLSAgICAgIAkJaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnNob3dWaWV3IgotICAgICAgCQlkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuU2hvd1ZpZXdIYW5kbGVyIj4KLSAgICAgIAkJPGNvbW1hbmRQYXJhbWV0ZXIKLSAgICAgIAkJCWlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93Vmlldy52aWV3SWQiCi0gICAgICAJCQluYW1lPSIlY29tbWFuZC5zaG93Vmlldy52aWV3SWRQYXJhbWV0ZXIiCi0gICAgICAJCQl2YWx1ZXM9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnJlZ2lzdHJ5LlZpZXdQYXJhbWV0ZXJWYWx1ZXMiIC8+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmhhbmRsZXJzLkRpc3BsYXlIZWxwSGFuZGxlciIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY29tbWFuZC5kaXNwbGF5SGVscC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5oZWxwLmRpc3BsYXlIZWxwIgotICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuZGlzcGxheUhlbHAubmFtZSIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmhlbHAiPgotICAgICAgICAgPGNvbW1hbmRQYXJhbWV0ZXIKLSAgICAgICAgICAgICAgIGlkPSJocmVmIgotICAgICAgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuZGlzcGxheUhlbHAuaHJlZlBhcmFtZXRlciIKLSAgICAgICAgICAgICAgIG9wdGlvbmFsPSJ0cnVlIi8+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRJbWFnZXMiPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuY29weSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9jb3B5X2VkaXQuZ2lmIiAvPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuY3V0IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L2N1dF9lZGl0LmdpZiIgLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5lZGl0LmRlbGV0ZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9kZWxldGVfZWRpdC5naWYiIC8+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5wYXN0ZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9wYXN0ZV9lZGl0LmdpZiIgLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5maWxlLnByaW50IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L3ByaW50X2VkaXQuZ2lmIiAvPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudW5kbyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi91bmRvX2VkaXQuZ2lmIiAvPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQucmVkbyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9yZWRvX2VkaXQuZ2lmIiAvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVWaWV3cy5DYXRlZ29yeS5CYXNpYyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5WaWV3SW50cm9BZGFwdGVyUGFydCIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aSIKLSAgICAgICAgICAgIG5hbWU9IiVWaWV3cy5JbnRyb0FkYXB0ZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaW50cm92aWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgICAgIDxzdGlja3lWaWV3Ci0gICAgICAJCWxvY2F0aW9uPSJSSUdIVCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pbnRyb3ZpZXciPgotICAgICAgPC9zdGlja3lWaWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWxlbWVudEZhY3RvcmllcyI+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5Ij4KLSAgICAgIDwvZmFjdG9yeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnRoZW1lcyI+Ci08IS0tIGRvIG5vdCBhZGQgdG8gdGhpcyBjYXRlZ29yeSEgIFRoaXMgaXMgYm91bmQgdG8gdGhlIGRlZmF1bHQgcHJlc2VudGF0aW9uIGFuZCB3aWxsIGRpc2FwcGVhciBpZiBhbm90aGVyIHByZXNlbnRhdGlvbiBpcyB1c2VkLiAtLT4KLSAgICAgIDx0aGVtZUVsZW1lbnRDYXRlZ29yeQotICAgICAgICAgICAgbGFiZWw9IiVQcmVzZW50YXRpb24uZGVmYXVsdCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC50aGVtZXMuV29ya2JlbmNoUHJldmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb24uZGVmYXVsdCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlUHJlc2VudGF0aW9uLmRlZmF1bHQuZGVzYwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvdGhlbWVFbGVtZW50Q2F0ZWdvcnk+Ci0gICAgICA8dGhlbWVFbGVtZW50Q2F0ZWdvcnkKLSAgICAgICAgICAgIGxhYmVsPSIlUHJlc2VudGF0aW9uLm1pc2MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoTWlzYyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlUHJlc2VudGF0aW9uLm1pc2MuZGVzYwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvdGhlbWVFbGVtZW50Q2F0ZWdvcnk+Ci0gICAgICA8Y2F0ZWdvcnlQcmVzZW50YXRpb25CaW5kaW5nCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb24uZGVmYXVsdCIKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbklkPSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLmRlZmF1bHQiPgotICAgICAgPC9jYXRlZ29yeVByZXNlbnRhdGlvbkJpbmRpbmc+Ci0gICAgICA8Zm9udERlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlRm9udHNQcmVmZXJlbmNlLkJhbm5lckZvbnRMYWJlbCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaE1pc2MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UuYmFubmVyZm9udCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlRm9udHNQcmVmZXJlbmNlLkJhbm5lckZvbnREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZm9udERlZmluaXRpb24+Ci0gICAgICA8Zm9udERlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlRm9udHNQcmVmZXJlbmNlLkRpYWxvZ0ZvbnRMYWJlbCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaE1pc2MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UuZGlhbG9nZm9udCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlRm9udHNQcmVmZXJlbmNlLkRpYWxvZ0ZvbnREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZm9udERlZmluaXRpb24+Ci0gICAgICA8Zm9udERlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlRm9udHNQcmVmZXJlbmNlLkhlYWRlckZvbnRMYWJlbCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaE1pc2MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UuaGVhZGVyZm9udCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlRm9udHNQcmVmZXJlbmNlLkhlYWRlckZvbnREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZm9udERlZmluaXRpb24+Ci0gICAgICA8Zm9udERlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlRm9udHNQcmVmZXJlbmNlLlRleHRGb250TGFiZWwiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2hNaXNjIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHRmb250Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVGb250c1ByZWZlcmVuY2UuVGV4dEZvbnREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZm9udERlZmluaXRpb24+Ci0gICAgICA8Zm9udERlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlRm9udHNQcmVmZXJlbmNlLlRpdGxlRm9udCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbi5kZWZhdWx0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5UQUJfVEVYVF9GT05UIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVGb250c1ByZWZlcmVuY2UuVGl0bGVGb250RGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2ZvbnREZWZpbml0aW9uPgotICAgICAgPGZvbnREZWZpbml0aW9uCi0gICAgICAgICAgICBsYWJlbD0iJUZvbnRzUHJlZmVyZW5jZS5WaWV3TWVzc2FnZUZvbnQiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb24uZGVmYXVsdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2guVklFV19NRVNTQUdFX1RFWFRfRk9OVCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlRm9udHNQcmVmZXJlbmNlLlZpZXdNZXNzYWdlRm9udERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9mb250RGVmaW5pdGlvbj4KLSAgICAgIDxjb2xvckRlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlQ29sb3IuZXJyb3JUZXh0IgotICAgICAgICAgICAgdmFsdWU9IkNPTE9SX1JFRCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaE1pc2MiCi0gICAgICAgICAgICBpZD0iRVJST1JfQ09MT1IiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUNvbG9yLmVycm9yVGV4dERlc2MKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbG9yRGVmaW5pdGlvbj4KLSAgICAgIDxjb2xvckRlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlQ29sb3IuaHlwZXJsaW5rVGV4dCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaE1pc2MiCi0gICAgICAgICAgICB2YWx1ZT0iQ09MT1JfREFSS19CTFVFIgotICAgICAgICAgICAgaWQ9IkhZUEVSTElOS19DT0xPUiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlQ29sb3IuaHlwZXJsaW5rVGV4dERlc2MKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbG9yRGVmaW5pdGlvbj4KLSAgICAgIDxjb2xvckRlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlQ29sb3IuYWN0aXZlSHlwZXJsaW5rVGV4dCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaE1pc2MiCi0gICAgICAgICAgICB2YWx1ZT0iQ09MT1JfQkxVRSIKLSAgICAgICAgICAgIGlkPSJBQ1RJVkVfSFlQRVJMSU5LX0NPTE9SIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVDb2xvci5hY3RpdmVIeXBlcmxpbmtUZXh0RGVzYwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29sb3JEZWZpbml0aW9uPgotPCEtLSBBY3RpdmUgVGFiIENvbG9ycyAtLT4KLSAgICAgIDxjb2xvckRlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlQ29sb3IuYWN0aXZlVGFiVGV4dCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbi5kZWZhdWx0IgotICAgICAgICAgICAgdmFsdWU9IkNPTE9SX1RJVExFX0ZPUkVHUk9VTkQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLkFDVElWRV9UQUJfVEVYVF9DT0xPUiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlQ29sb3IuYWN0aXZlVGFiVGV4dERlc2MKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8Y29sb3JWYWx1ZQotICAgICAgICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgICAgICAgdmFsdWU9IkNPTE9SX1RJVExFX0lOQUNUSVZFX0ZPUkVHUk9VTkQiPgotICAgICAgICAgPC9jb2xvclZhbHVlPgotICAgICAgPC9jb2xvckRlZmluaXRpb24+Ci0gICAgICA8Y29sb3JEZWZpbml0aW9uCi0gICAgICAgICAgICBsYWJlbD0iJUNvbG9yLmFjdGl2ZVRhYkJHRW5kIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9uLmRlZmF1bHQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLkFDVElWRV9UQUJfQkdfRU5EIj4KLSAgICAgICAgIDxjb2xvckZhY3RvcnkKLSAgICAgICAgICAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGhlbWVzLlJHQkJsZW5kQ29sb3JGYWN0b3J5Ij4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgIG5hbWU9ImNvbG9yMSIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJDT0xPUl9USVRMRV9CQUNLR1JPVU5EX0dSQURJRU5UIj4KLSAgICAgICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgbmFtZT0iY29sb3IyIgotICAgICAgICAgICAgICAgICAgdmFsdWU9IkNPTE9SX1RJVExFX0JBQ0tHUk9VTkRfR1JBRElFTlQiPgotICAgICAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgICA8L2NvbG9yRmFjdG9yeT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVDb2xvci5hY3RpdmVUYWJCR0VuZERlc2MKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8Y29sb3JWYWx1ZQotICAgICAgICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgICAgICAgdmFsdWU9IkNPTE9SX1RJVExFX0lOQUNUSVZFX0JBQ0tHUk9VTkRfR1JBRElFTlQiPgotICAgICAgICAgPC9jb2xvclZhbHVlPgotICAgICAgPC9jb2xvckRlZmluaXRpb24+Ci0gICAgICA8Y29sb3JEZWZpbml0aW9uCi0gICAgICAgICAgICBsYWJlbD0iJUNvbG9yLmFjdGl2ZVRhYkJHU3RhcnQiCi0gICAgICAgICAgICB2YWx1ZT0iQ09MT1JfVElUTEVfQkFDS0dST1VORCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbi5kZWZhdWx0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5BQ1RJVkVfVEFCX0JHX1NUQVJUIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVDb2xvci5hY3RpdmVUYWJCR1N0YXJ0RGVzYwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxjb2xvclZhbHVlCi0gICAgICAgICAgICAgICB3cz0ibW90aWYiCi0gICAgICAgICAgICAgICB2YWx1ZT0iQ09MT1JfVElUTEVfSU5BQ1RJVkVfQkFDS0dST1VORCI+Ci0gICAgICAgICA8L2NvbG9yVmFsdWU+Ci0gICAgICA8L2NvbG9yRGVmaW5pdGlvbj4KLTwhLS0gQWN0aXZlIChOb2ZvY3VzKSBUYWIgQ29sb3JzIC0tPgotICAgICAgPGNvbG9yRGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9IiVDb2xvci5hY3RpdmVOb2ZvY3VzVGFiVGV4dCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbi5kZWZhdWx0IgotICAgICAgICAgICAgdmFsdWU9IkNPTE9SX1RJVExFX0lOQUNUSVZFX0ZPUkVHUk9VTkQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLkFDVElWRV9OT0ZPQ1VTX1RBQl9URVhUX0NPTE9SIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVDb2xvci5hY3RpdmVOb2ZvY3VzVGFiVGV4dERlc2MKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbG9yRGVmaW5pdGlvbj4KLSAgICAgIDxjb2xvckRlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlQ29sb3IuYWN0aXZlTm9mb2N1c1RhYkJHRW5kIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9uLmRlZmF1bHQiCi0gICAgICAgICAgICB2YWx1ZT0iQ09MT1JfVElUTEVfSU5BQ1RJVkVfQkFDS0dST1VORF9HUkFESUVOVCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2guQUNUSVZFX05PRk9DVVNfVEFCX0JHX0VORCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlQ29sb3IuYWN0aXZlTm9mb2N1c1RhYkJHRW5kRGVzYwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29sb3JEZWZpbml0aW9uPgotICAgICAgPGNvbG9yRGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9IiVDb2xvci5hY3RpdmVOb2ZvY3VzVGFiQkdTdGFydCIKLSAgICAgICAgICAgIHZhbHVlPSJDT0xPUl9USVRMRV9JTkFDVElWRV9CQUNLR1JPVU5EIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9uLmRlZmF1bHQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLkFDVElWRV9OT0ZPQ1VTX1RBQl9CR19TVEFSVCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlQ29sb3IuYWN0aXZlTm9mb2N1c1RhYkJHU3RhcnREZXNjCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9jb2xvckRlZmluaXRpb24+ICAgICAgCi08IS0tIEluYWN0aXZlIFRhYiBDb2xvcnMgLS0+Ci0gICAgICA8Y29sb3JEZWZpbml0aW9uCi0gICAgICAgICAgICBsYWJlbD0iJUNvbG9yLmluYWN0aXZlVGFiVGV4dCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbi5kZWZhdWx0IgotICAgICAgICAgICAgdmFsdWU9IkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5JTkFDVElWRV9UQUJfVEVYVF9DT0xPUiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlQ29sb3IuaW5hY3RpdmVUYWJUZXh0RGVzYwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29sb3JEZWZpbml0aW9uPgotICAgICAgPGNvbG9yRGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9IiVDb2xvci5pbmFjdGl2ZVRhYkJHU3RhcnQiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb24uZGVmYXVsdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2guSU5BQ1RJVkVfVEFCX0JHX1NUQVJUIj4KLSAgICAgICAgIDxjb2xvckZhY3RvcnkKLSAgICAgICAgICAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudGhlbWVzLlJHQkNvbnRyYXN0RmFjdG9yeSI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICBuYW1lPSJmb3JlZ3JvdW5kIgotICAgICAgICAgICAgICAgICAgdmFsdWU9IkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EIj4KLSAgICAgICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgbmFtZT0iYmFja2dyb3VuZDEiCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0iQ09MT1JfV0hJVEUiPgotICAgICAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICBuYW1lPSJiYWNrZ3JvdW5kMiIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJDT0xPUl9XSURHRVRfQkFDS0dST1VORCI+Ci0gICAgICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgIDwvY29sb3JGYWN0b3J5PgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUNvbG9yLmluYWN0aXZlVGFiQkdTdGFydERlc2MKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbG9yRGVmaW5pdGlvbj4KLSAgICAgIDxjb2xvckRlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlQ29sb3IuaW5hY3RpdmVUYWJCR0VuZCIKLSAgICAgICAgICAgIHZhbHVlPSJDT0xPUl9XSURHRVRfQkFDS0dST1VORCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbi5kZWZhdWx0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5JTkFDVElWRV9UQUJfQkdfRU5EIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVDb2xvci5pbmFjdGl2ZVRhYkJHRW5kRGVzYwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29sb3JEZWZpbml0aW9uPgotPCEtLSBwZXJjZW50YWdlIHZhbHVlIGZvciB0aGUgYWN0aXZlIHRhYiBncmFkaWVudCAtLT4KLSAgICAgIDxkYXRhCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2guQUNUSVZFX1RBQl9QRVJDRU5UIgotICAgICAgICAgICAgdmFsdWU9IjEwMCI+Ci0gICAgICA8L2RhdGE+Ci08IS0tIHBlcmNlbnRhZ2UgdmFsdWUgZm9yIHRoZSBhY3RpdmUgKG5vZm9jdXMpIHRhYiBncmFkaWVudCAtLT4KLSAgICAgIDxkYXRhCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2guQUNUSVZFX05PRk9DVVNfVEFCX1BFUkNFTlQiCi0gICAgICAgICAgICB2YWx1ZT0iMTAwIj4KLSAgICAgIDwvZGF0YT4gICAgICAKLTwhLS0gcGVyY2VudGFnZSB2YWx1ZSBmb3IgdGhlIGluYWN0aXZlIHRhYiBncmFkaWVudCAtLT4KLSAgICAgIDxkYXRhCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2guSU5BQ1RJVkVfVEFCX1BFUkNFTlQiCi0gICAgICAgICAgICB2YWx1ZT0iMTAwIj4KLSAgICAgIDwvZGF0YT4KLTwhLS0gd2hldGhlciB0aGUgYWN0aXZlIGdyYWRpZW50IGlzIHZlcnRpY2FsIC0tPgotICAgICAgPGRhdGEKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5BQ1RJVkVfVEFCX1ZFUlRJQ0FMIgotICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgPC9kYXRhPgotPCEtLSB3aGV0aGVyIHRoZSBhY3RpdmUgKG5vZm9jdXMpIGdyYWRpZW50IGlzIHZlcnRpY2FsIC0tPgotICAgICAgPGRhdGEKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5BQ1RJVkVfTk9GT0NVU19UQUJfVkVSVElDQUwiCi0gICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+Ci0gICAgICA8L2RhdGE+ICAgICAgCi08IS0tIHdoZXRoZXIgdGhlIGluYWN0aXZlIGdyYWRpZW50IGlzIHZlcnRpY2FsIC0tPgotICAgICAgPGRhdGEKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5JTkFDVElWRV9UQUJfVkVSVElDQUwiCi0gICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+Ci0gICAgICA8L2RhdGE+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiPgotICAgICAgPC9pbml0aWFsaXplcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN5c3RlbVN1bW1hcnlTZWN0aW9ucyI+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgICAgc2VjdGlvblRpdGxlPSIlU3lzdGVtU3VtbWFyeS5zZWN0aW9uVGl0bGUucGxhdGZvcm0iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYWJvdXQuQ29uZmlndXJhdGlvbkxvZ0RlZmF1bHRTZWN0aW9uIgotICAgICAgICAgICAgaWQ9IjEwLkRlZmF1bHRTZWN0aW9uIj4KLSAgICAgIDwvc2VjdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbkZhY3RvcmllcyI+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgbmFtZT0iJVByZXNlbnRhdGlvbi5kZWZhdWx0Lm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5Xb3JrYmVuY2hQcmVzZW50YXRpb25GYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuZGVmYXVsdCI+Ci0gICAgICA8L2ZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lbmNvZGluZ3MiPgotICAgICAgPGVuY29kaW5nIG5hbWU9IklTTy04ODU5LTEiLz4KLSAgICAgIDxlbmNvZGluZyBuYW1lPSJVVEYtOCIvPgotICAgICAgPGVuY29kaW5nIG5hbWU9IlVURi0xNiIvPgotICAgICAgPGVuY29kaW5nIG5hbWU9IlVURi0xNkJFIi8+Ci0gICAgICA8ZW5jb2RpbmcgbmFtZT0iVVRGLTE2TEUiLz4KLSAgICAgIDxlbmNvZGluZyBuYW1lPSJVUy1BU0NJSSIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8IS0tCi0gICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9uRmFjdG9yaWVzIj4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy5kZWZhdWx0cHJlc2VudGF0aW9uLk5hdGl2ZVByZXNlbnRhdGlvbkZhY3RvcnkiCi0gICAgICAgICAgICBuYW1lPSIlUHJlc2VudGF0aW9uLm5hdGl2ZS5uYW1lIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMuZGVmYXVsdHByZXNlbnRhdGlvbi5OYXRpdmVQcmVzZW50YXRpb25GYWN0b3J5Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc2VydmljZXMiPgotICAgICAgPGNvbXBvbmVudAotICAgICAgICAgICAgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0LmNvbXBvbmVudHMuc2VydmljZXMuSVN0YXR1c0ZhY3RvcnkiCi0gICAgICAJCXNjb3BlPSJvcmcuZWNsaXBzZS51aS5jb21wb25lbnRzLnBsdWdpbiIKLSAgICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlJlZmxlY3Rpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuc2VydmljZXMuU3RhdHVzRmFjdG9yeSI+Ci0gICAgICA8L2NvbXBvbmVudD4KLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgIGludGVyZmFjZT0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5jb21wb25lbnRzLnNlcnZpY2VzLklTeXN0ZW1Mb2ciCi0gICAgICAJCXNjb3BlPSJvcmcuZWNsaXBzZS51aS5jb21wb25lbnRzLnBsdWdpbiIKLSAgICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlJlZmxlY3Rpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuc2VydmljZXMuU3lzdGVtTG9nIj4KLSAgICAgIDwvY29tcG9uZW50PgotICAgICAgCi0gICAgICA8c2NvcGUgaWQ9Im9yZy5lY2xpcHNlLnVpLmNvbXBvbmVudHMucGx1Z2luIj4KLSAgICAgIAkJPHJlcXVpcmVzSW50ZXJmYWNlIGlkPSJvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlIi8+Ci0gICAgICA8L3Njb3BlPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0gc2l0ZSBzZXJ2aWNlcyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5zZXJ2aWNlcyI+Ci0gICAgICAKLSAgICAgIDwhLS0gc2NvcGUgZm9yIHVzZXItZGVmaW5lZCBzZXJ2aWNlcyBvbiBhIHNpdGUgLS0+Ci0gICAgICA8c2NvcGUgaWQ9Im9yZy5lY2xpcHNlLnVpLnNpdGUiPgotICAgICAgICAgICAgPHJlcXVpcmVzSW50ZXJmYWNlIGlkPSJvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUiLz4KLQkgICAgICAgIDxyZXF1aXJlc0ludGVyZmFjZSBpZD0ib3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2UiLz4KLSAgICAgIAkJPHJlcXVpcmVzU2NvcGUgaWQ9Im9yZy5lY2xpcHNlLnVpLmNvbXBvbmVudHMucGx1Z2luIi8+Ci0gICAgICA8L3Njb3BlPgotCi0gICAgICAKLSAgICAgIDwhLS0gc2NvcGUgZm9yIHVzZXItZGVmaW5lZCBzZXJ2aWNlcyBvbiBhIHNpdGUgY2FwYWJsZSBvZiBtdWx0aXBsZXhpbmcgKGFsbCBjb21wb25lbnRzIG11c3QgaW1wbGVtZW50IElOZXN0ZWRDb21wb25lbnQpIC0tPgotICAgICAgPHNjb3BlIGlkPSJvcmcuZWNsaXBzZS51aS5zaXRlLm11bHRpcGxleGVyIj4KLSAgICAgIAkJPHJlcXVpcmVzU2NvcGUgaWQ9Im9yZy5lY2xpcHNlLnVpLnNpdGUiLz4KLSAgICAgIAkJPHJlcXVpcmVzSW50ZXJmYWNlIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0Lm11bHRpcGxleGVyLklTaGFyZWRDb250ZXh0Ii8+Ci0gICAgICA8L3Njb3BlPgotICAgICAgCi0gICAgICA8IS0tIHNjb3BlIGZvciB1c2VyLWRlZmluZWQgYWRhcHRlcnMgb24gYSBwYXJ0IC0tPgotICAgICAgPHNjb3BlIGlkPSJvcmcuZWNsaXBzZS51aS5wYXJ0Ij4KLSAgICAgIAkJPHJlcXVpcmVzU2NvcGUgaWQ9Im9yZy5lY2xpcHNlLnVpLnNpdGUiLz4KLSAgICAgIDwvc2NvcGU+Ci0KLQkgIDwhLS0gc2NvcGUgZm9yIHBhcnQgYWRhcHRlcnMgY2FwYWJsZSBvZiBkZWxlZ2F0aW9uIChhbGwgY29tcG9uZW50cyBtYXkgb3B0aW9uYWxseSBpbXBsZW1lbnQgSURlbGVnYXRpbmdDb21wb25lbnQpIC0tPgotCSAgPHNjb3BlIGlkPSJvcmcuZWNsaXBzZS51aS5wYXJ0LmRlbGVnYXRvciI+Ci0JICAJCTxyZXF1aXJlc1Njb3BlIGlkPSJvcmcuZWNsaXBzZS51aS5wYXJ0Ii8+Ci0JICAJCTxyZXF1aXJlc0ludGVyZmFjZSBpZD0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5tdWx0aXBsZXhlci5JRGVsZWdhdGluZ0NvbnRleHQiLz4KLQkgIDwvc2NvcGU+Ci0gICAgICAKLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlNpbmdsZXRvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5zZXJ2aWNlcy5OdWxsTmFtZWFibGVTZXJ2aWNlIgotICAgICAgICAgICAgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0LmNvbXBvbmVudHMuc2VydmljZXMuSU5hbWVhYmxlIi8+Ci0gICAgICA8Y29tcG9uZW50Ci0gICAgICAgICAgICBzY29wZT0ib3JnLmVjbGlwc2UudWkuc2l0ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb21wb25lbnRzLmZyYW1ld29yay5TaW5nbGV0b25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuc2VydmljZXMuTnVsbFNlY29uZGFyeUlkIgotICAgICAgICAgICAgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0LmNvbXBvbmVudHMuc2VydmljZXMuSVNlY29uZGFyeUlkIi8+Ci0gICAgICA8Y29tcG9uZW50Ci0gICAgICAgICAgICBzY29wZT0ib3JnLmVjbGlwc2UudWkuc2l0ZSIKLSAgICAgICAgICAgIGludGVyZmFjZT0ib3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuc2VydmljZXMuUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSIvPgotICAgICAgPGNvbXBvbmVudAotICAgICAgICAgICAgc2NvcGU9Im9yZy5lY2xpcHNlLnVpLnNpdGUiCi0gICAgICAgICAgICBpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuY29tcG9uZW50cy5zZXJ2aWNlcy5JRGlydHlIYW5kbGVyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlNpbmdsZXRvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5zZXJ2aWNlcy5OdWxsRGlydHlIYW5kbGVyIi8+ICAgICAgCi0gICAgICAgICAgICAKLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlIgotICAgICAgICAgICAgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0LmNvbXBvbmVudHMuc2VydmljZXMuSVVzZXJNZXNzYWdlcyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb21wb25lbnRzLmZyYW1ld29yay5SZWZsZWN0aW9uRmFjdG9yeTpvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0LnNlcnZpY2VzLkRlZmF1bHRNZXNzYWdlRGlhbG9ncyI+Ci0gICAgICA8L2NvbXBvbmVudD4KLQotICAgICAgPGNvbXBvbmVudAotICAgICAgICAgICAgc2NvcGU9Im9yZy5lY2xpcHNlLnVpLnNpdGUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuU2luZ2xldG9uRmFjdG9yeTpvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0LnNlcnZpY2VzLk51bGxLZXlCaW5kaW5nU2VydmljZSIKLSAgICAgICAgICAgIGludGVyZmFjZT0ib3JnLmVjbGlwc2UudWkuSUtleUJpbmRpbmdTZXJ2aWNlIi8+Ci0gICAgICAKLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlIgotICAgICAgCQlpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuY29tcG9uZW50cy5zZXJ2aWNlcy5JUGFydEFjdGlvbkJhcnMiCi0gICAgICAJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb21wb25lbnRzLmZyYW1ld29yay5TaW5nbGV0b25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuc2VydmljZXMuTnVsbFBhcnRBY3Rpb25CYXJzIi8+Ci0KLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlIgotICAgICAgCQlpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuY29tcG9uZW50cy5zZXJ2aWNlcy5JQWN0aW9uQmFyQ29udHJpYnV0b3JGYWN0b3J5IgotICAgICAgCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5zZXJ2aWNlcy5BY3Rpb25CYXJDb250cmlidXRvckZhY3RvcnkiLz4KLQotICAgICAgPGNvbXBvbmVudAotICAgICAgICAgICAgc2NvcGU9Im9yZy5lY2xpcHNlLnVpLnNpdGUiCi0gICAgICAJCWludGVyZmFjZT0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5jb21wb25lbnRzLnNlcnZpY2VzLklTdGF0dXNIYW5kbGVyIgotICAgICAgCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5zZXJ2aWNlcy5OdWxsU3RhdHVzSGFuZGxlciIvPgotICAgICAgCQkKLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlNpbmdsZXRvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5zZXJ2aWNlcy5OdWxsU2F2ZWRTdGF0ZSIKLSAgICAgICAgICAgIGludGVyZmFjZT0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5jb21wb25lbnRzLnNlcnZpY2VzLklTYXZlZFN0YXRlIi8+Ci0KLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0LnNlcnZpY2VzLlBhcnRGYWN0b3J5RmFjdG9yeSIKLSAgICAgICAgICAgIGludGVyZmFjZT0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5jb21wb25lbnRzLnNlcnZpY2VzLklXb3JrYmVuY2hQYXJ0RmFjdG9yeSIKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlIi8+Ci0gICAgICAgICAgICAKLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlJlZmxlY3Rpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuUGFydFByb3BlcnR5UHJvdmlkZXIiCi0gICAgICAgICAgICBpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuSVBhcnRQcm9wZXJ0eVByb3ZpZGVyIj4KLSAgICAgIDwvY29tcG9uZW50PgotICAgICAgICAgICAgCi0gICAgICA8Y29tcG9uZW50Ci0gICAgICAJCXNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlNpbmdsZXRvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5zZXJ2aWNlcy5OdWxsUGFydERlc2NyaXB0b3IiCi0gICAgICAgICAgICBpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuY29tcG9uZW50cy5zZXJ2aWNlcy5JUGFydERlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIAotICAgICAgPGNvbXBvbmVudAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlNpbmdsZXRvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5zZXJ2aWNlcy5OdWxsRWRpdG9ySW5wdXQiCi0gICAgICAgICAgICBpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCIKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlIi8+Ci0gICAgICAgICAgICAKLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgIGludGVyZmFjZT0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5jb21wb25lbnRzLnNlcnZpY2VzLklTZWxlY3Rpb25IYW5kbGVyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlNpbmdsZXRvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5zZXJ2aWNlcy5OdWxsU2VsZWN0aW9uSGFuZGxlciIKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSBwYXJ0IHNlcnZpY2VzIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzIj4KLQotICAgICAgPGNvbXBvbmVudAotICAgICAgICAgICAgc2NvcGU9Im9yZy5lY2xpcHNlLnVpLnBhcnQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5QYXJ0UHJvcGVydHlQcm92aWRlciIKLSAgICAgICAgICAgIGludGVyZmFjZT0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5JUGFydFByb3BlcnR5UHJvdmlkZXIiPgotICAgICAgPC9jb21wb25lbnQ+Ci0KLQkgIDxjb21wb25lbnQKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5wYXJ0IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlNpbmdsZXRvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5OdWxsRm9jdXNhYmxlIgotICAgICAgICAgICAgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0LmNvbXBvbmVudHMuaW50ZXJmYWNlcy5JRm9jdXNhYmxlIi8+Ci0KLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5wYXJ0IgotICAgICAgICAgICAgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuU2luZ2xldG9uRmFjdG9yeTpvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0Lk51bGxQZXJzaXN0YWJsZSIvPgotICAgICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBkZWxlZ2F0aW5nIHNlcnZpY2VzIC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuc2VydmljZXMiPgotICAgCQk8Y29tcG9uZW50Ci0gICAJCQlzY29wZT0ib3JnLmVjbGlwc2UudWkucGFydC5kZWxlZ2F0b3IiCi0gICAJCQlpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuY29tcG9uZW50cy5pbnRlcmZhY2VzLklGb2N1c2FibGUiCi0gICAJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5EZWxlZ2F0aW5nRm9jdXNhYmxlIj4KLSAgCQk8L2NvbXBvbmVudD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIG11bHRpcGxleGVyIHNlcnZpY2VzIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzIj4KLQotCSAgPGNvbXBvbmVudAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlJlZmxlY3Rpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuc2VydmljZXMuQ2hpbGROYW1lYWJsZSIKLSAgICAgICAgICAgIGludGVyZmFjZT0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5jb21wb25lbnRzLnNlcnZpY2VzLklOYW1lYWJsZSIKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlLm11bHRpcGxleGVyIi8+Ci0KLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlLm11bHRpcGxleGVyIgotICAgICAgCQlpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuY29tcG9uZW50cy5zZXJ2aWNlcy5JU3RhdHVzSGFuZGxlciIKLSAgICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlJlZmxlY3Rpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuc2VydmljZXMuQ2hpbGRTdGF0dXNIYW5kbGVyIi8+Ci0gICAgICAgICAgICAKLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS5zaXRlLm11bHRpcGxleGVyIgotICAgICAgCQlpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuY29tcG9uZW50cy5zZXJ2aWNlcy5JUGFydEFjdGlvbkJhcnMiCi0gICAgICAJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb21wb25lbnRzLmZyYW1ld29yay5SZWZsZWN0aW9uRmFjdG9yeTpvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0LnNlcnZpY2VzLkNoaWxkUGFydEFjdGlvbkJhcnMiLz4KLQotICAgICAgPGNvbXBvbmVudAotICAgICAgICAgICAgc2NvcGU9Im9yZy5lY2xpcHNlLnVpLnNpdGUubXVsdGlwbGV4ZXIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5zZXJ2aWNlcy5DaGlsZEtleUJpbmRpbmdTZXJ2aWNlIgotICAgICAgICAgICAgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS5JS2V5QmluZGluZ1NlcnZpY2UiLz4KLQotICAgICAgPGNvbXBvbmVudAotICAgICAgICAgICAgc2NvcGU9Im9yZy5lY2xpcHNlLnVpLnNpdGUubXVsdGlwbGV4ZXIiCi0gICAgICAJCWludGVyZmFjZT0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucGFydC5jb21wb25lbnRzLnNlcnZpY2VzLklBY3Rpb25CYXJDb250cmlidXRvckZhY3RvcnkiCi0gICAgICAJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb21wb25lbnRzLmZyYW1ld29yay5SZWZsZWN0aW9uRmFjdG9yeTpvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0LnNlcnZpY2VzLkNoaWxkQWN0aW9uQmFyQ29udHJpYnV0b3JGYWN0b3J5Ii8+Ci0gICAgICAJCQotICAgICAgPGNvbXBvbmVudAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlJlZmxlY3Rpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuc2VydmljZXMuQ2hpbGRTZWxlY3Rpb25IYW5kbGVyIgotICAgICAgICAgICAgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0LmNvbXBvbmVudHMuc2VydmljZXMuSVNlbGVjdGlvbkhhbmRsZXIiCi0gICAgICAgICAgICBzY29wZT0ib3JnLmVjbGlwc2UudWkuc2l0ZS5tdWx0aXBsZXhlciIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gcGx1Z2luIHNlcnZpY2VzIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzIj4KLQotICAgICAgPGNvbXBvbmVudAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlJlZmxlY3Rpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLmludGVybmFsLnBhcnQuc2VydmljZXMuUGx1Z2luUmVzb3VyY2VzIgotICAgICAgICAgICAgc2NvcGU9Im9yZy5lY2xpcHNlLnVpLmNvbXBvbmVudHMucGx1Z2luIgotICAgICAgICAgICAgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wYXJ0LmNvbXBvbmVudHMuc2VydmljZXMuSVBsdWdpblJlc291cmNlcyIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpdml0eVN1cHBvcnQiPgotICAgICAgPHRyaWdnZXJQb2ludCBpZD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICAgICA8aGludAotICAgICAgICAgICAgICAgaWQ9ImludGVyYWN0aXZlIgotICAgICAgICAgICAgICAgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvdHJpZ2dlclBvaW50PgotICAgICAgPHRyaWdnZXJQb2ludCBpZD0ib3JnLmVjbGlwc2UudWkub3BlblBlcnNwZWN0aXZlRGlhbG9nIj4KLSAgICAgICAgIDxoaW50Ci0gICAgICAgICAgICAgICBpZD0iaW50ZXJhY3RpdmUiCi0gICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC90cmlnZ2VyUG9pbnQ+Ci0gICAgICA8dHJpZ2dlclBvaW50IGlkPSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgICAgIDxoaW50Ci0gICAgICAgICAgICAgICBpZD0iaW50ZXJhY3RpdmUiCi0gICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC90cmlnZ2VyUG9pbnQ+ICAKLSAgICAgIDx0cmlnZ2VyUG9pbnQgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgICAgPGhpbnQKLSAgICAgICAgICAgICAgIGlkPSJpbnRlcmFjdGl2ZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L3RyaWdnZXJQb2ludD4gICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2FjY2VsZXJhdG9yQ29uZmlndXJhdGlvbnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2FjY2VsZXJhdG9yQ29uZmlndXJhdGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhODIwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9hY2NlbGVyYXRvckNvbmZpZ3VyYXRpb25zLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0iYWNjZWxlcmF0b3JDb25maWd1cmF0aW9ucyIgbmFtZT0iQWNjZWxlcmF0b3IgQ29uZmlndXJhdGlvbnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci0mbHQ7YiZndDtXQVJOSU5HOiBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBERVBSRUNBVEVELiZsdDsvYiZndDsmbHQ7YnImZ3Q7Ci1EbyBub3QgdXNlIHRoaXMgZXh0ZW5zaW9uIHBvaW50LCBpdCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgcHJvZHVjdC4KLUluc3RlYWQsIHVzZSB0aGUgZXh0ZW5zaW9uIHBvaW50ICZsdDthIGhyZWY9JnF1b3Q7b3JnX2VjbGlwc2VfdWlfY29tbWFuZHMuaHRtbCZxdW90OyZndDtvcmcuZWNsaXBzZS51aS5jb21tYW5kcyZsdDsvYSZndDsKLSZsdDsvcCZndDsKLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcmVnaXN0ZXIgYWNjZWxlcmF0b3IgY29uZmlndXJhdGlvbiBleHRlbnNpb25zLiBBY2NlbGVyYXRvciBjb25maWd1cmF0aW9ucyBhcmUgY29uZmlndXJhdGlvbnMgdG8gd2hpY2ggYWNjZWxlcmF0b3Igc2V0cyBtYXkgYmUgcmVnaXN0ZXJlZC4gVGhlIHdvcmtiZW5jaCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGFuIGFjY2VsZXJhdG9yIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgV29ya2JlbmNoIHByZWZlcmVuY2UgcGFnZS4gT25seSBvbmUgYWNjZWxlcmF0b3IgY29uZmlndXJhdGlvbiBtYXkgYmUgYWN0aXZlIGF0IGEgdGltZS4gCi0mbHQ7cCZndDsKLUFuIGFjY2VsZXJhdG9yIGNvbmZpZ3VyYXRpb24gcmVwcmVzZW50cyBhIGdlbmVyYWwgc3R5bGUgb3IgdGhlbWUgb2YgYWNjZWxlcmF0b3JzIGZvciBXb3JrYmVuY2ggYWN0aW9ucy4gRm9yIGV4YW1wbGUsIHRoZSBXb3JrYmVuY2ggcHJvdmlkZXMgdGhlICZxdW90O0VtYWNzJnF1b3Q7IGFjY2VsZXJhdG9yIGNvbmZpZ3VyYXRpb24uIFdoZW4gdGhlICZxdW90O0VtYWNzJnF1b3Q7IGFjY2VsZXJhdG9yIGNvbmZpZ3VyYXRpb24gaXMgYWN0aXZlLCBhY2NlbGVyYXRvcnMgYmVsb25naW5nIHRvIGFjY2VsZXJhdG9yIHNldHMgcmVnaXN0ZXJlZCB0byB0aGUgJnF1b3Q7RW1hY3MmcXVvdDsgY29uZmlndXJhdGlvbiBhcmUgYWN0aXZlLiBUaGVzZSBhY2NlbGVyYXRvcnMgYXJlIGRlZmluZWQgdG8gbWltaWMgdGhlIGFjY2VsZXJhdG9ycyBpbiBFbWFjcyAoYSBwb3B1bGFyIHRleHQgZWRpdG9yIGFtb25nc3QgZGV2ZWxvcGVycykuIAotJmx0O3AmZ3Q7Ci1BbiBhY2NlbGVyYXRvciBzZXQgcmVnaXN0ZXJzIHdpdGggYW4gYWNjZWxlcmF0b3IgY29uZmlndXJhdGlvbiBieSBsaXN0aW5nIHRoZSBjb25maWd1cmF0aW9uJmFwb3M7cyBpZCBhcyB0aGUgdmFsdWUgb2YgaXRzICZxdW90O2NvbmZpZ3VyYXRpb25JZCZxdW90OyBhdHRyaWJ1dGUgKHNlZSB0aGUgQWNjZWxlcmF0b3IgU2V0cyBleHRlbnNpb24gcG9pbnQpLiBNYW55IGFjY2VsZXJhdG9yIHNldHMgY2FuIGJlIHJlZ2lzdGVyZWQgdG8gdGhlIHNhbWUgYWNjZWxlcmF0b3IgY29uZmlndXJhdGlvbi4gCi0mbHQ7cCZndDsKLU5vdGUgdGhlIGFjY2VsZXJhdG9yIGNvbmZpZ3VyYXRpb24gbmFtZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaXMgdGhlIHNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJnF1b3Q7bmFtZSZxdW90OyBvZiB0aGUgZXh0ZW5zaW9uIGVsZW1lbnQgb2Ygb3JnLmVjbGlwc2UudWkuYWNjZWxlcmF0b3JDb25maWd1cmF0aW9ucyBleHRlbnNpb24gcG9pbnQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgYWNjZWxlcmF0b3IgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgb2YgdGhlIGFjY2VsZXJhdG9yIGNvbmZpZ3VyYXRpb24gdG8gYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgYWNjZWxlcmF0b3IgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBSZWxlYXNlIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBGb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBhY2NlbGVyYXRvciBjb25maWd1cmF0aW9uIGV4dGVuc2lvbjogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbnMmcXVvdDsmZ3Q7IAotICAgICAgJmx0O2FjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiAKLSAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkudmlBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24mcXVvdDsgCi0gICAgICAgIG5hbWU9JnF1b3Q7VkkmcXVvdDsgCi0gICAgICAgIGRlc2NyaXB0aW9uPSZxdW90O1ZJIHN0eWxlIGFjY2VsZXJhdG9yIGNvbmZpZ3VyYXRpb24mcXVvdDsmZ3Q7IAotICAgICAgJmx0Oy9hY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24mZ3Q7IAotICAgICAgJmx0O2FjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiAKLSAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuam9uRG9lQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uJnF1b3Q7IAotICAgICAgICBuYW1lPSZxdW90O0pvbiBEb2UmcXVvdDsgCi0gICAgICAgIGRlc2NyaXB0aW9uPSZxdW90O1BlcnNvbmFsIGFjY2VsZXJhdG9yIGNvbmZpZ3VyYXRpb24gZm9yIEpvbiBEb2UmcXVvdDsmZ3Q7IAotICAgICAgJmx0Oy9hY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24mZ3Q7IAotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHdvcmtiZW5jaCBwcm92aWRlcyB0aGUgRGVmYXVsdCBhbmQgRW1hY3MgYWNjZWxlcmF0b3IgY29uZmlndXJhdGlvbnMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYWNjZWxlcmF0b3JTY29wZXMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2FjY2VsZXJhdG9yU2NvcGVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjViMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYWNjZWxlcmF0b3JTY29wZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJhY2NlbGVyYXRvclNjb3BlcyIgbmFtZT0iQWNjZWxlcmF0b3IgU2NvcGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0OwotJmx0O2ImZ3Q7V0FSTklORzogVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgREVQUkVDQVRFRC4mbHQ7L2ImZ3Q7Jmx0O2JyJmd0OwotRG8gbm90IHVzZSB0aGlzIGV4dGVuc2lvbiBwb2ludCwgaXQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIHByb2R1Y3QuCi1JbnN0ZWFkLCB1c2UgdGhlIGV4dGVuc2lvbiBwb2ludCAmbHQ7YSBocmVmPSZxdW90O29yZ19lY2xpcHNlX3VpX2NvbW1hbmRzLmh0bWwmcXVvdDsmZ3Q7b3JnLmVjbGlwc2UudWkuY29tbWFuZHMmbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHJlZ2lzdGVyIGFjY2VsZXJhdG9yIHNjb3BlIGV4dGVuc2lvbnMuIEFjY2VsZXJhdG9yIHNjb3BlcyBhcmUgc2NvcGVzIGZvciB3aGljaCBhY2NlbGVyYXRvciBzZXRzIG1heSBiZSBhcHBsaWNhYmxlLiBGb3IgZXhhbXBsZSwgaWYgYW4gYWNjZWxlcmF0b3Igc2V0IGlzIGFwcGxpY2FibGUgZm9yIHRoZSBzY29wZSBlbnRpdGxlZCAmcXVvdDtUZXh0IEVkaXRvciBTY29wZSZxdW90OywgdGhlIGFjY2VsZXJhdG9ycyBvZiB0aGF0IGFjY2VsZXJhdG9yIHNldCB3aWxsIG9ubHkgb3BlcmF0ZSBpZiB0aGUgJnF1b3Q7VGV4dCBFZGl0b3IgU2NvcGUmcXVvdDsgb3Igb25lIG9mIGl0cyBjaGlsZHJlbiBpcyBhY3RpdmUgKGluIG90aGVyIHdvcmRzLCBpZiB0aGUgYWN0aXZlIHBhcnQgaXMgYSBwYXJ0aWNpcGF0aW5nIHRleHQgZWRpdG9yKS4gCi0mbHQ7cCZndDsKLUFuIGFjY2VsZXJhdG9yIHNldCBkZWNsYXJlcyB3aGF0IHNjb3BlIGl0IGlzIGFwcGxpY2FibGUgZm9yIGJ5IGxpc3RpbmcgdGhlIHNjb3BlJmFwb3M7cyBpZCBhcyB0aGUgdmFsdWUgb2YgaXRzICZxdW90O3Njb3BlSWQmcXVvdDsgYXR0cmlidXRlIChzZWUgdGhlIEFjY2VsZXJhdG9yIFNldHMgZXh0ZW5zaW9uIHBvaW50KS4gTWFueSBhY2NlbGVyYXRvciBzZXRzIGNhbiBiZSBhcHBsaWNhYmxlIGZvciB0aGUgc2FtZSBhY2NlbGVyYXRvciBzY29wZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWNjZWxlcmF0b3JTY29wZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYWNjZWxlcmF0b3JTY29wZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGlzIGFjY2VsZXJhdG9yIHNjb3BlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSBvZiB0aGUgYWNjZWxlcmF0b3Igc2NvcGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBhY2NlbGVyYXRvciBzY29wZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhcmVudFNjb3BlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSB3aGljaCByZXByZXNlbnRzIGEgc2NvcGUgd2hpY2ggaXMgYWN0aXZlIHdoZW5ldmVyIHRoaXMgc2NvcGUgaXMgYWN0aXZlLiBGb3IgbW9zdCBzY29wZXMsIG9yZy5lY2xpcHNlLnVpLmdsb2JhbFNjb3BlIHdpbGwgYmUgdGhlIHBhcmVudCBzY29wZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBSZWxlYXNlIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBGb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBhY2NlbGVyYXRvciBzY29wZSBleHRlbnNpb246IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5hY2NlbGVyYXRvclNjb3BlcyZxdW90OyZndDsgCi0gICAgICAmbHQ7YWNjZWxlcmF0b3JTY29wZSAKLSAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuZ2xvYmFsU2NvcGUmcXVvdDsgCi0gICAgICAgIG5hbWU9JnF1b3Q7R2xvYmFsJnF1b3Q7IAotICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDtBY3Rpb24gYWNjZWxlcmF0b3Iga2V5IGFwcGxpY2FibGUgdG8gYWxsIHZpZXdzIGFuZCBlZGl0b3JzIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4uJnF1b3Q7Jmd0OyAKLSAgICAgICZsdDsvYWNjZWxlcmF0b3JTY29wZSZndDsgCi0gICAgICAmbHQ7YWNjZWxlcmF0b3JTY29wZSAKLSAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuamF2YUVkaXRvclNjb3BlJnF1b3Q7IAotICAgICAgICBuYW1lPSZxdW90O0phdmEgRWRpdG9yJnF1b3Q7IAotICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDtBY3Rpb24gYWNjZWxlcmF0b3Iga2V5IGFwcGxpY2FibGUgb25seSB3aGVuIGphdmEgZWRpdG9yIGFjdGl2ZS4mcXVvdDsgCi0gICAgICAgIHBhcmVudFNjb3BlPSZxdW90O29yZy5lY2xpcHNlLnVpLmdsb2JhbFNjb3BlJnF1b3Q7Jmd0OyAKLSAgICAgICZsdDsvYWNjZWxlcmF0b3JTY29wZSZndDsgCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgbWV0aG9kIHB1YmxpYyBJS2V5QmluZGluZ1NlcnZpY2UgZ2V0S2V5QmluZGluZ1NlcnZpY2UoKSB3YXMgYWRkZWQgdG8gSUVkaXRvclNpdGUuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB3b3JrYmVuY2ggcHJvdmlkZXMgdGhlIEdsb2JhbCBhY2NlbGVyYXRvciBzY29wZSBhbmQgdGhlIFRleHQgRWRpdG9yIGFjY2VsZXJhdG9yIHNjb3BlLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2FjY2VsZXJhdG9yU2V0cy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYWNjZWxlcmF0b3JTZXRzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDUzMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYWNjZWxlcmF0b3JTZXRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0iYWNjZWxlcmF0b3JTZXRzIiBuYW1lPSJBY2NlbGVyYXRvciBTZXRzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0OwotJmx0O2ImZ3Q7V0FSTklORzogVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgREVQUkVDQVRFRC4mbHQ7L2ImZ3Q7Jmx0O2JyJmd0OwotRG8gbm90IHVzZSB0aGlzIGV4dGVuc2lvbiBwb2ludCwgaXQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIHByb2R1Y3QuCi1JbnN0ZWFkLCB1c2UgdGhlIGV4dGVuc2lvbiBwb2ludCAmbHQ7YSBocmVmPSZxdW90O29yZ19lY2xpcHNlX3VpX2NvbW1hbmRzLmh0bWwmcXVvdDsmZ3Q7b3JnLmVjbGlwc2UudWkuY29tbWFuZHMmbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHJlZ2lzdGVyIGFjY2VsZXJhdG9yIHNldCBleHRlbnNpb25zLiBBY2NlbGVyYXRvciBzZXRzIGFyZSBqdXN0IHdoYXQgdGhlIG5hbWUgaW1wbGllcywgc2V0cyBvZiBhY2NlbGVyYXRvcnMuIEFuIGFjY2VsZXJhdG9yIGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gb25lIG9yIG1vcmUgc2VxdWVuY2VzIG9mIGFjY2VsZXJhdG9yIGtleXMgYW5kIGEgd29ya2JlbmNoIGFjdGlvbi4gQW4gYWNjZWxlcmF0b3Iga2V5IHNlcXVlbmNlIG1heSBiZSBvZiBsZW5ndGggb25lIG9yIGdyZWF0ZXIuIAotJmx0O3AmZ3Q7Ci1BbiBhY2NlbGVyYXRvciBzZXQgaXMgcmVnaXN0ZXJlZCB3aXRoIGFuIGFjY2VsZXJhdG9yIGNvbmZpZ3VyYXRpb24gKHNlZSB0aGUgQWNjZWxlcmF0b3IgQ29uZmlndXJhdGlvbiBleHRlbnNpb24gcG9pbnQpIGFuZCBpcyBhcHBsaWNhYmxlIGZvciBhbiBhY2NlbGVyYXRvciBzY29wZSAoc2VlIHRoZSBBY2NlbGVyYXRvciBTY29wZSBleHRlbnNpb24gcG9pbnQpLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY2NlbGVyYXRvclNldCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYWNjZWxlcmF0b3JTZXQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHRoZSAmcXVvdDtvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyZxdW90OyBleHRlbnNpb24gcG9pbnQgaW5zdGVhZC4gIFVzZSB0aGUgJmx0O2NvZGUmZ3Q7a2V5Jmx0Oy9jb2RlJmd0OyBlbGVtZW50LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY2NlbGVyYXRvciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29uZmlndXJhdGlvbklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIG5hbWUgdGhhdCBpZGVudGlmaWVzIHRoZSBhY2NlbGVyYXRvciBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHRoaXMgYWNjZWxlcmF0b3Igc2V0IGlzIHJlZ2lzdGVyZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NvcGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBuYW1lIHRoYXQgaWRlbnRpZmllcyB0aGUgYWNjZWxlcmF0b3Igc2NvcGUgZm9yIHdoaWNoIHRoaXMgYWNjZWxlcmF0b3Igc2V0IGlzIGFwcGxpY2FibGUuCi1AZGVwcmVjYXRlZCBXaGVuIG1pZ3JhdGluZyB0byB0aGUgbmV3IGJpbmRpbmdzIGV4dGVuc2lvbiBwb2ludCwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgY2hhbmdlIGFueSBvY2N1cnJlbmNlcyBvZiAmcXVvdDtvcmcuZWNsaXBzZS51aS5nbG9iYWxTY29wZSZxdW90OyB0byAmcXVvdDtvcmcuZWNsaXBzZS51aS5jb250ZXh0cy53aW5kb3cmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFjY2VsZXJhdG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUgJnF1b3Q7b3JnLmVjbGlwc2UudWkuYmluZGluZ3MmcXVvdDsgZXh0ZW5zaW9uIHBvaW50IGluc3RlYWQuICBVc2UgdGhlICZsdDtjb2RlJmd0O2tleSZsdDsvY29kZSZndDsgZWxlbWVudC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhY3Rpb24gZGVmaW5pdGlvbiBvZiB0aGUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjY2VsZXJhdG9yLiBJZiB0aGUgaWQgaXMgbm90IHNwZWNpZmllZCB0aGlzIGFjY2VsZXJhdG9yIGRlbGV0ZXMgYW55ICBtYXBwaW5ncyB3aXRoIHRoZSBzYW1lIGtleS4gVGhpcyBpcyB1c2VkIHRvIGRlbGV0ZSBhIGtleSBiaW5kaW5nIGZvciBhIHNwZWNpZmljIExvY2FsZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gYXR0cmlidXRlIHJlcHJlc2VudGluZyB0aGUgc2VxdWVuY2Uocykgb2YgYWNjZWxlcmF0b3Iga2V5cyB1c2VkIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY2NlbGVyYXRvci4gU2VxdWVuY2VzIGFyZSBzZXBhcmF0ZWQgYnkgJmFwb3M7fHwmYXBvczssIGFuZCBpbmRpdmlkdWFsIGtleXMgaW4gYSBzZXF1ZW5jZSBhcmUgc2VwYXJhdGVkIGJ5IGEgc3BhY2UuIEEga2V5IG1heSBiZSBtb2RpZmllZCBieSB0aGUgQ1RSTCwgQUxULCBvciBTSElGVCBrZXlzLiBEZXBlbmRpbmcgb24ga2V5Ym9hcmQgbGF5b3V0LCBzb21lIGtleXMgKCZhcG9zOz8mYXBvczsgZm9yIGV4YW1wbGUpIG1heSBuZWVkIHRoZSBTSElGVCB0byBiZSBhY2Nlc3NlZCBidXQgdGhlIGFjY2VsZXJhdG9yIHNob3VsZCBiZSBzcGVjaWZpZWQgd2l0aG91dCB0aGUgU0hJRlQgc28gaXQgd2lsbCBiZSBpbmRlcGVuZGVudCBvZiBrZXlib2FyZCBsYXlvdXQuIEUuZy4gaWYgQ1RSTCs/IGlzIHNwZWNpZmllZCBhcyBhbiBhY2NlbGVyYXRvciwgdGhlIHVzZXIgbWF5IGhhdmUgdG8gcHJlc3MgQ1RSTCtTSElGVCs/IGRlcGVuZGluZyBvbiB0aGUga2V5Ym9hcmQgbGF5b3V0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2FsZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgd2hpY2ggc3BlY2lmaWVzIGEgbG9jYWxlIGZvciB3aGljaCB0aGUgYWNjZWxlcmF0b3IgaXMgYXBwbGljYWJsZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGFjY2VsZXJhdG9yIGlzIGFwcGxpY2FibGUgZm9yIGFsbCBsb2NhbGVzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBsYXRmb3JtIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSB3aGljaCBzcGVjaWZpZXMgYSBwbGF0Zm9ybSBvbiB3aGljaCB0aGUgYWNjZWxlcmF0b3IgaXMgYXBwbGljYWJsZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGFjY2VsZXJhdG9yIGlzIGFwcGxpY2FibGUgb24gYWxsIHBsYXRmb3Jtcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUmVsZWFzZSAyLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gYWNjZWxlcmF0b3Igc2V0IGV4dGVuc2lvbjogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmFjY2VsZXJhdG9yU2V0cyZxdW90OyZndDsgCi0gICAgICAmbHQ7YWNjZWxlcmF0b3JTZXQgCi0gICAgICAgIGNvbmZpZ3VyYXRpb25JZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5leGFtcGxlQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uJnF1b3Q7IAotICAgICAgICBzY29wZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLmdsb2JhbFNjb3BlJnF1b3Q7Jmd0OyAKLSAgICAgICAgICAmbHQ7YWNjZWxlcmF0b3IgCi0gICAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLnVpLkV4YW1wbGVBY3Rpb25BJnF1b3Q7IAotICAgICAgICAgICAgICBrZXk9JnF1b3Q7Q1RSTCtSIENUUkwrQSZxdW90OyZndDsgCi0gICAgICAgICAgJmx0Oy9hY2NlbGVyYXRvciZndDsgCi0gICAgICAgICAgJmx0O2FjY2VsZXJhdG9yIAotICAgICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5FeGFtcGxlQWN0aW9uQiZxdW90OyAKLSAgICAgICAgICAgICAga2V5PSZxdW90O0NUUkwrUiBDVFJMK0ImcXVvdDsmZ3Q7IAotICAgICAgICAgICZsdDsvYWNjZWxlcmF0b3ImZ3Q7IAotICAgICAgICAgICZsdDthY2NlbGVyYXRvciAKLSAgICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuRXhhbXBsZUFjdGlvbkMmcXVvdDsgCi0gICAgICAgICAgICAgIGtleT0mcXVvdDtDVFJMK1IgQ1RSTCtDIHx8IENUUkwrU0hJRlQrREVMRVRFJnF1b3Q7Jmd0OyAKLSAgICAgICAgICAmbHQ7L2FjY2VsZXJhdG9yJmd0OyAKLSAgICAgICZsdDsvYWNjZWxlcmF0b3JTZXQmZ3Q7IAotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgTW9yZSB0aGFuIG9uZSBhY2NlbGVyYXRvciBtYXkgYmUgc3BlY2lmaWVkIGZvciB0aGUgc2FtZSBhY3Rpb24gaW4gdGhlIGFjY2VsZXJhdG9yIHNldCBidXQgb25seSBvbmUgd2lsbCBiZSB1c2VkLiAKLSZsdDtwJmd0OwotSWYgdGhlIGxvY2FsZSBhbmQvb3IgdGhlIHBsYXRmb3JtIGlzIHNwZWNpZmllZCwgdGhlIGFjY2VsZXJhdG9yIHRoYXQgYmV0dGVyIG1hdGNoZXMgdGhlIGN1cnJlbnQgbG9jYWxlIGFuZCBwbGF0Zm9ybSB3aWxsIGJlIHVzZWQuIFRoZSBjdXJyZW50IGxvY2FsZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBBUEkgTG9jYWxlLmdldERlZmF1bHQoKSBhbmQgdGhlIHBsYXRmb3JtIGJ5IHRoZSBBUEkgU1dULmdldFBsYXRmb3JtKCkuIElmIHRoZSBwbGF0Zm9ybSBhbmQvb3IgdGhlIGxvY2FsZSBpcyBzcGVjaWZpZWQgYW5kIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBjdXJyZW50IGxvY2FsZSBhbmQvb3IgcGxhdGZvcm0sIHRoZSBhY2NlbGVyYXRvciBpcyBkaXNjYXJkZWQuIElmIGFjY2VsZXJhdG9yIEEgZGVmaW5lcyBvbmx5IHRoZSBsb2NhbGUgYW5kIEIgZGVmaW5lcyBvbmx5IHRoZSBwbGF0Zm9ybSwgQiBpcyB1c2VkLiBJZiBhY2NlbGVyYXRvciBBIGRlZmluZXMgJnF1b3Q7amEmcXVvdDsgYXMgaXRzIGxvY2FsZSBhbmQgQiBkZWZpbmVzICZxdW90O2phX0pQJnF1b3Q7LCBCIGlzIHVzZWQgaW4gY2FzZSB0aGUgY3VycmVudCBsb2NhbGUgaXMgJnF1b3Q7amFfSlAmcXVvdDsuIAotJmx0O3AmZ3Q7Ci1JZiB0d28gYWNjZWxlcmF0b3JzIGFyZSBkZWZpbmVkIGluIGFjY2VsZXJhdG9ycyBzZXRzIGluIGRpZmZlcmVudCBwbHVnaW5zLCB0aGUgY2hvc2VuIGFjY2VsZXJhdG9yIHdpbGwgZGVwZW5kIG9uIHRoZSBwbHVnaW5zLiBJZiBwbHVnaW4gQSBkZXBlbmRzIG9uIEIsIHRoZSBhY2NlbGVyYXRvcnMgZGVmaW5lZCBpbiBCIGlzIHVzZWQuIElmIEEgYW5kIEIgZG9uJmFwb3M7dCBkZXBlbmQgb24gZWFjaCBvdGhlciwgdGhleSB3aWxsIGJlIGFscGhhYmV0aWNhbGx5IHNvcnRlZCBieSB0aGUgcGx1Z2luIGlkLiAKLSZsdDtwJmd0OwotSWYgdHdvIGFjY2VsZXJhdG9ycyBhcmUgZGVmaW5lZCBpbiBkaWZmZXJlbnQgc2NvcGVzLCB0aGUgYWNjZWxlcmF0b3IgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBzY29wZSB3aWxsIGJlIHVzZWQuIElmIGFuIGFjY2VsZXJhdG9yIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBjdXJyZW50IHNjb3BlIG9yIG9uZSBvZiBpdHMgcGFyZW50cyBpdCBpcyBkaXNjYXJkZWQuIElmIGFuIGFjY2VsZXJhdG9yIGlzIGRlZmluZWQgaW4gYSBwYXJlbnQgYW5kIGNoaWxkIHNjb3BlLCB0aGUgb25lIGluIHRoZSBjaGlsZCBpcyB1c2VkLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgd29ya2JlbmNoIHByb3ZpZGVzIGFjY2VsZXJhdG9yIHNldHMgZm9yIHRoZSBEZWZhdWx0IGFuZCBFbWFjcyBhY2NlbGVyYXRvciBjb25maWd1cmF0aW9ucy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9hY3Rpb25EZWZpbml0aW9ucy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYWN0aW9uRGVmaW5pdGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjNDkzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9hY3Rpb25EZWZpbml0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9ImFjdGlvbkRlZmluaXRpb25zIiBuYW1lPSJBY3Rpb24gRGVmaW5pdGlvbnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci0mbHQ7YiZndDtXQVJOSU5HOiBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBERVBSRUNBVEVELiZsdDsvYiZndDsmbHQ7YnImZ3Q7Ci1EbyBub3QgdXNlIHRoaXMgZXh0ZW5zaW9uIHBvaW50LCBpdCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgcHJvZHVjdC4KLUluc3RlYWQsIHVzZSB0aGUgZXh0ZW5zaW9uIHBvaW50ICZsdDthIGhyZWY9JnF1b3Q7b3JnX2VjbGlwc2VfdWlfY29tbWFuZHMuaHRtbCZxdW90OyZndDtvcmcuZWNsaXBzZS51aS5jb21tYW5kcyZsdDsvYSZndDsKLSZsdDsvcCZndDsKLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcmVnaXN0ZXIgYWN0aW9uIGRlZmluaXRpb25zLiBBY2NlbGVyYXRvcnMgKHNlZSB0aGUgQWNjZWxlcmF0b3IgU2V0cyBleHRlbnNpb24gcG9pbnQpIHVzZSBhY3Rpb24gZGVmaW5pdGlvbnMgdG8gcmVmZXJlbmNlIGFjdGlvbnMuIEFuIGFjdGlvbiBhc3NvY2lhdGVzIGl0c2VsZiB3aXRoIGEgZ2l2ZW4gYWNjZWxlcmF0b3IgYnkgcmVnaXN0ZXJpbmcgd2l0aCB0aGF0IGFjY2VsZXJhdG9yJmFwb3M7cyBhc3NvY2lhdGVkIGFjdGlvbiBkZWZpbml0aW9uLiBBbiBhY3Rpb24gcmVnaXN0ZXJzIGl0c2VsZiB3aXRoIGFuIGFjdGlvbiBkZWZpbml0aW9uIGJ5IGNhbGxpbmcgdGhlIHNldEFjdGlvbkRlZmluaXRpb25JZChTdHJpbmcgaWQpIG1ldGhvZCBhbmQgc3VwcGx5aW5nIHRoZSBhY3Rpb24gZGVmaW5pdGlvbiZhcG9zO3MgaWQgYXMgYW4gYXJndW1lbnQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFjdGlvbkRlZmluaXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFjdGlvbkRlZmluaXRpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBhY3Rpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uIGFzIGRpc3BsYXllZCB0byB0aGUgdXNlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIGFjdGlvbiB0byBkaXNwbGF5IHRvIHRoZSB1c2VyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFJlbGVhc2UgMi4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGFjdGlvbiBkZWZpbml0aW9uIGV4dGVuc2lvbjogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmFjdGlvbkRlZmluaXRpb25zJnF1b3Q7Jmd0OyAKLSAgICAgICZsdDthY3Rpb25EZWZpbml0aW9uIAotICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5maWxlLnNhdmUmcXVvdDsmZ3Q7IAotICAgICAgJmx0Oy9hY3Rpb25EZWZpbml0aW9uJmd0OyAKLSAgICAgICZsdDthY3Rpb25EZWZpbml0aW9uIAotICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5maWxlLnNhdmVBbGwmcXVvdDsmZ3Q7IAotICAgICAgJmx0Oy9hY3Rpb25EZWZpbml0aW9uJmd0OyAKLSAgICAgICZsdDthY3Rpb25EZWZpbml0aW9uIAotICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5maWxlLmNsb3NlJnF1b3Q7Jmd0OyAKLSAgICAgICZsdDsvYWN0aW9uRGVmaW5pdGlvbiZndDsgCi0gICAgICAmbHQ7YWN0aW9uRGVmaW5pdGlvbiAKLSAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuZmlsZS5jbG9zZUFsbCZxdW90OyZndDsgCi0gICAgICAmbHQ7L2FjdGlvbkRlZmluaXRpb24mZ3Q7IAotICAgICAgJmx0O2FjdGlvbkRlZmluaXRpb24gCi0gICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLnVpLmZpbGUucHJpbnQmcXVvdDsmZ3Q7IAotICAgICAgJmx0Oy9hY3Rpb25EZWZpbml0aW9uJmd0OyAKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBtZXRob2RzIHB1YmxpYyB2b2lkIHNldEFjdGlvbkRlZmluaXRpb25JZChTdHJpbmcgaWQpIGFuZCBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkRlZmluaXRpb25JZCgpIGhhdmUgYmVlbiBhZGRlZCB0byBJQWN0aW9uLiAKLSZsdDtwJmd0OwotJmx0O0ImZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7I0ZGMDAwMCZxdW90OyZndDtOT1RFJmx0Oy9mb250Jmd0OyAtJmx0Oy9iJmd0OyBvdGhlciBhdHRyaWJ1dGVzIG1heSBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLCBhcyBuZWVkZWQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB3b3JrYmVuY2ggcHJvdmlkZXMgbWFueSBhY3Rpb24gZGVmaW5pdGlvbnMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmNjYjM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIiBuYW1lPSJBY3Rpb24gU2V0IFBhcnQgQXNzb2NpYXRpb25zIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gZGVmaW5lIGFuIGFjdGlvbiBzZXQgd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIGEgcGVyc3BlY3RpdmUgd2hlbiBhIHBhcnQgKHZpZXcgb3IgZWRpdG9yKSBpcyBvcGVuZWQgaW4gdGhlIHBlcnNwZWN0aXZlLgotSW4gdGhlIGNhc2Ugb2YgYW4gZWRpdG9yLCB0aGUgYWN0aW9uIHNldCB3aWxsIHJlbWFpbiB2aXNpYmxlIHdoaWxlIHRoZSBlZGl0b3IgaXMgdGhlIGN1cnJlbnQgZWRpdG9yLgotSW4gdGhlIGNhc2Ugb2YgYSB2aWV3LCB0aGUgYWN0aW9uIHNldCB3aWxsIGJlIHZpc2libGUgd2hlbiB0aGUgdmlldyBpcyB0aGUgYWN0aXZlIHBhcnQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFjdGlvblNldFBhcnRBc3NvY2lhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0SUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhY3Rpb24gc2V0IChhcyBzcGVjaWZpZWQgaW4gdGhlCi1yZWdpc3RyeSkgd2hpY2ggaXMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHBhcnRpY3VsYXIgd29ya2JlbmNoCi12aWV3cyBhbmQvb3IgZWRpdG9ycy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icGFydCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcGFydCAodmlldyBvciBlZGl0b3IpIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWN0aW9uIHNldC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGFjdGlvbiBzZXQgcGFydCBhc3NvY2lhdGlvbiAobm90ZSB0aGUgc3ViZWxlbWVudCBhbmQgdGhlIHdheSBhdHRyaWJ1dGVzIGFyZSB1c2VkKToKLQotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyZxdW90OyZndDsKLSAgJmx0O2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbiB0YXJnZXRJRD0mcXVvdDtvcmcuZWNsaXBzZS5qZHQudWkucmVmYWN0b3JpbmcuYWN0aW9uU2V0JnF1b3Q7Jmd0OwotICAgJmx0O3BhcnQgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuamR0LnVpLlBhY2thZ2VFeHBsb3JlciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7cGFydCBpZD0mcXVvdDtvcmcuZWNsaXBzZS5qZHQudWkuQ29tcGlsYXRpb25Vbml0RXJyb3ImcXVvdDsvJmd0OwotICAmbHQ7L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbiZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotCi1JbiB0aGUgZXhhbXBsZSBhYm92ZSwgYSB2aWV3IG9yIGVkaXRvciBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWZhY3RvcmluZyBhY3Rpb24gc2V0LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB1c2VyIG1heSBvdmVycmlkZSB0aGVzZSBhc3NvY2lhdGlvbnMgdXNpbmcgdGhlIGN1c3RvbWl6ZSBwZXJzcGVjdGl2ZSBkaWFsb2cuICBSZWdhcmRsZXNzIG9mIHRoZXNlIGFzc29jaWF0aW9ucywKLWFjdGlvbiBzZXRzIHdoaWNoIHRoZSB1c2VyIHR1cm5zIG9mZiB3aWxsIG5ldmVyIGFwcGVhciBhbmQgYWN0aW9uIHNldHMgd2hpY2ggdGhlIHVzZXIgdHVybnMgb24gd2lsbCBhbHdheXMgYmUgdmlzaWJsZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYWN0aW9uU2V0cy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYWN0aW9uU2V0cy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZiMGU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2FjdGlvblNldHMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJhY3Rpb25TZXRzIiBuYW1lPSJBY3Rpb24gU2V0cyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gYWRkIG1lbnVzLCBtZW51IGl0ZW1zIAotYW5kIHRvb2xiYXIgYnV0dG9ucyB0byB0aGUgY29tbW9uIGFyZWFzIGluIHRoZSBXb3JrYmVuY2gKLXdpbmRvdy4gVGhlc2UgY29udHJpYnV0aW9ucyBhcmUgY29sbGVjdGl2ZWx5IGtub3duIAotYXMgYW4gJmx0O2kmZ3Q7YWN0aW9uIHNldCZsdDsvaSZndDsgYW5kIGFwcGVhciB3aXRoaW4gdGhlIAotV29ya2JlbmNoIHdpbmRvdyBieSB0aGUgdXNlciBjdXN0b21pemluZyBhIHBlcnNwZWN0aXZlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGVyZSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9uIHdoaWNoIGN1cnJlbnRseSBhZmZlY3RzIGFjdGlvbiBzZXRzLiAgSXQgaXMgaW1wb3J0YW50IHRvIGRlZmluZSB0aGUgZW50aXJlIG1lbnUgc3RydWN0dXJlIHRoYXQgaXMgdG8gYmUgcmVmZXJlbmNlZCB3aXRoaW4gdGhlIGFjdGlvbiBzZXQuICBTbywgZm9yIGV4YW1wbGUsIGlmIGFub3RoZXIgYWN0aW9uIHNldCBkZWZpbmVzIGEgbWVudSBjYWxsZWQgJnF1b3Q7ZXhhbXBsZSZxdW90OywgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlbHkgb24gJnF1b3Q7ZXhhbXBsZSZxdW90OyBleGlzdGluZy4gIEl0IGlzIG5lY2Vzc2FyeSB0byByZWRlZmluZSB0aGUgJnF1b3Q7ZXhhbXBsZSZxdW90OyBtZW51IGluIGV2ZXJ5IGFjdGlvbiBzZXQgdGhhdCB3aXNoZXMgdG8gdXNlIGl0LgotJmx0Oy9wJmd0OwotCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJjb21tb25BY3Rpb24uZXhzZCIvPgotCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iY29tbW9uRXhwcmVzc2lvbi5leHNkIi8+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFjdGlvblNldCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYWN0aW9uU2V0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJsYWJlbCIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCB0byBkZWZpbmUgYSBncm91cCBvZiBhY3Rpb25zIGFuZC9vciBtZW51cy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWVudSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgYWN0aW9uIHNldC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgYnkgdGhlIFdvcmtiZW5jaCB0byByZXByZXNlbnQgdGhpcyBhY3Rpb24gc2V0IHRvIHRoZSB1c2VyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlzaWJsZSIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciB0aGUgYWN0aW9uIHNldCBpcyBpbml0aWFsbHkgdmlzaWJsZSB3aGVuIGEgcGVyc3BlY3RpdmUgaXMgb3Blbi4gVGhpcyBvcHRpb24gaXMgb25seSBob25vdXJlZCB3aGVuIHRoZSB1c2VyIG9wZW5zIGEgcGVyc3BlY3RpdmUgd2hpY2ggaGFzIG5vdCBiZWVuIGN1c3RvbWl6ZWQuIFRoZSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIG9wdGlvbiBmcm9tIHRoZSAmcXVvdDtDdXN0b21pemUgUGVyc3BlY3RpdmUgRGlhbG9nJnF1b3Q7LiBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgYmUgdXNlZCB3aXRoIGdyZWF0IGNhcmUgc28gYXMgbm90IHRvIG92ZXJ3aGVsbSB0aGUgdXNlciB3aXRoIHRvbyBtYW55IGFjdGlvbnMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgZGVzY3JpcHRpb24gdXNlZCBieSB0aGUgV29ya2JlbmNoIHRvIHJlcHJlc2VudCB0aGlzIGFjdGlvbiBzZXQgdG8gdGhlIHVzZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYWN0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJsYWJlbCIgaWNvbj0iaWNvbiIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyBhbiBhY3Rpb24gdGhhdCB0aGUgdXNlciBjYW4gaW52b2tlIGluIHRoZSBVSS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlbGVjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgdGhpcyBhY3Rpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIGVpdGhlciBhcyB0aGUgbWVudSBpdGVtIHRleHQgb3IgdG9vbGJhciBidXR0b24gbGFiZWwuIFRoZSBuYW1lIGNhbiBpbmNsdWRlIG1uZW5vbWljIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWNjZWxlcmF0b3IiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgJmx0O2ImZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7I0ZGMDAwMCZxdW90OyZndDtEZXByZWNhdGVkOiZsdDsvZm9udCZndDsmbHQ7L2ImZ3Q7IFVzZSB0aGUgJmx0O3NhbXAmZ3Q7ZGVmaW5pdGlvbklkJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUgaW5zdGVhZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZpbml0aW9uSWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBjb21tYW5kIHRoYXQgdGhpcyBhY3Rpb24gd2lsbCBoYW5kbGUuIEJ5IHNwZWNpZnlpbmcgYW5kIGFjdGlvbiwgdGhlIGtleSBiaW5kaW5nIHNlcnZpY2UgY2FuIGFzc2lnbiBhIGtleSBzZXF1ZW5jZSB0byB0aGlzIGFjdGlvbi4gU2VlIHRoZSBleHRlbnNpb24gcG9pbnQgJmx0O2EgaHJlZj0mcXVvdDtvcmdfZWNsaXBzZV91aV9jb21tYW5kcy5odG1sJnF1b3Q7Jmd0O29yZy5lY2xpcHNlLnVpLmNvbW1hbmRzJmx0Oy9hJmd0OyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtZW51YmFyUGF0aCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHNsYXNoLWRlbGltaXRlZCBwYXRoICgmYXBvczsvJmFwb3M7KSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoaXMgYWN0aW9uIGluIHRoZSBtZW51IGJhci4KLUVhY2ggdG9rZW4gaW4gdGhlIHBhdGgsIGV4Y2VwdCB0aGUgbGFzdCBvbmUsIG11c3QgcmVwcmVzZW50IGEgdmFsaWQgaWRlbnRpZmllciBvZiBhbiBleGlzdGluZyBtZW51IGluIHRoZSBoaWVyYXJjaHkuIFRoZSBsYXN0IHRva2VuIHJlcHJlc2VudHMgdGhlIG5hbWVkIGdyb3VwIGludG8gd2hpY2ggdGhpcyBhY3Rpb24gd2lsbCBiZSBhZGRlZC4gSWYgdGhlIHBhdGggaXMgb21pdHRlZCwgdGhpcyBhY3Rpb24gd2lsbCBub3QgYXBwZWFyIGluIHRoZSBtZW51IGJhci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b29sYmFyUGF0aCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHNsYXNoLWRlbGltaXRlZCBwYXRoICgmYXBvczsvJmFwb3M7KSB0aGF0IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhpcyBhY3Rpb24gaW4gdGhlIHRvb2xiYXIuIFRoZSBmaXJzdCB0b2tlbiByZXByZXNlbnRzIHRoZSB0b29sYmFyIGlkZW50aWZpZXIgKHdpdGggJnF1b3Q7Tm9ybWFsJnF1b3Q7IGJlaW5nIHRoZSBkZWZhdWx0IHRvb2xiYXIpLCB3aGlsZSB0aGUgc2Vjb25kIHRva2VuIGlzIHRoZSBuYW1lZCBncm91cCB3aXRoaW4gdGhlIHRvb2xiYXIgdGhhdCB0aGlzIGFjdGlvbiB3aWxsIGJlIGFkZGVkIHRvLiBJZiB0aGUgZ3JvdXAgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHRvb2xiYXIsIGl0IHdpbGwgYmUgY3JlYXRlZC4KLUlmIHRvb2xiYXJQYXRoIGlzIG9taXR0ZWQsIHRoZSBhY3Rpb24gd2lsbCBub3QgYXBwZWFyIGluIHRoZSB0b29sYmFyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSByZWxhdGl2ZSBwYXRoIG9mIGFuIGljb24gdXNlZCB0byB2aXN1YWxseSByZXByZXNlbnQgdGhlIGFjdGlvbiBpbiBpdHMgY29udGV4dC4KLUlmIG9taXR0ZWQgYW5kIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgdG9vbGJhciwgdGhlIFdvcmtiZW5jaCB3aWxsIHVzZSBhIHBsYWNlaG9sZGVyIGljb24uIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGx1Z2luLnhtbCBmaWxlIG9mIHRoZSBjb250cmlidXRpbmcgcGx1Zy1pbi4gVGhlIGljb24gd2lsbCBhcHBlYXIgaW4gdG9vbGJhcnMgYnV0IG5vdCBpbiBtZW51cy4gRW5hYmxlZCBhY3Rpb25zIHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gbWVudXMgYnkgdGhlIGhvdmVySWNvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZWRJY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcmVsYXRpdmUgcGF0aCBvZiBhbiBpY29uIHVzZWQgdG8gdmlzdWFsbHkgcmVwcmVzZW50IHRoZSBhY3Rpb24gaW4gaXRzIGNvbnRleHQgd2hlbiB0aGUgYWN0aW9uIGlzIGRpc2FibGVkLiBJZiBvbWl0dGVkLCB0aGUgbm9ybWFsIGljb24gd2lsbCBzaW1wbHkgYXBwZWFyIGdyZXllZCBvdXQuIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGx1Z2luLnhtbCBmaWxlIG9mIHRoZSBjb250cmlidXRpbmcgcGx1Zy1pbi4gVGhlIGRpc2FibGVkIGljb24gd2lsbCBhcHBlYXIgaW4gdG9vbGJhcnMgYnV0IG5vdCBpbiBtZW51cy4gSWNvbnMgZm9yIGRpc2FibGVkIGFjdGlvbnMgaW4gbWVudXMgd2lsbCBiZSBzdXBwbGllZCBieSB0aGUgT1MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhvdmVySWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHJlbGF0aXZlIHBhdGggb2YgYW4gaWNvbiB1c2VkIHRvIHZpc3VhbGx5IHJlcHJlc2VudCB0aGUgYWN0aW9uIGluIGl0cyBjb250ZXh0IHdoZW4gdGhlIG1vdXNlIHBvaW50ZXIgaXMgb3ZlciB0aGUgYWN0aW9uLiBJZiBvbWl0dGVkLCB0aGUgbm9ybWFsIGljb24gd2lsbCBiZSB1c2VkLiBUaGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHBsdWdpbi54bWwgZmlsZSBvZiB0aGUgY29udHJpYnV0aW5nIHBsdWctaW4uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRvb2x0aXAiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgdGV4dCByZXByZXNlbnRpbmcgdGhlIGFjdGlvbiZhcG9zO3MgdG9vbCB0aXAuIE9ubHkgdXNlZCBpZiB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIHRvb2xiYXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoZWxwQ29udGV4dElkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgaW5kaWNhdGluZyB0aGUgaGVscCBjb250ZXh0IGZvciB0aGlzIGFjdGlvbi4gSWYgdGhlIGFjdGlvbiBhcHBlYXJzIGFzIGEgbWVudSBpdGVtLCB0aGVuIHByZXNzaW5nIEYxIHdoaWxlIHRoZSBtZW51IGl0ZW0gaXMgaGlnaGxpZ2h0ZWQgd2lsbCBkaXNwbGF5IGhlbHAuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGUiIHVzZT0iZGVmYXVsdCIgdmFsdWU9InB1c2giPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIGF0dHJpYnV0ZSB0byBkZWZpbmUgdGhlIHVzZXIgaW50ZXJmYWNlIHN0eWxlIHR5cGUgZm9yIHRoZSBhY3Rpb24uIElmIG9taXR0ZWQsIHRoZW4gaXQgaXMgJmx0O3NhbXAmZ3Q7cHVzaCZsdDsvc2FtcCZndDsgYnkgZGVmYXVsdC4gVGhlIGF0dHJpYnV0ZSB2YWx1ZSB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICZsdDt0YWJsZSBib3JkZXI9JnF1b3Q7MCZxdW90OyB3aWR0aD0mcXVvdDs4MCUmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0O3B1c2gmbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSBhcyBhIHJlZ3VsYXIgbWVudSBpdGVtIG9yIHRvb2wgaXRlbS4mbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7cmFkaW8mbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSBhcyBhIHJhZGlvIHN0eWxlIG1lbnUgaXRlbSBvciB0b29sIGl0ZW0uIEFjdGlvbnMgd2l0aCB0aGUgcmFkaW8gc3R5bGUgd2l0aGluIHRoZSBzYW1lIG1lbnUgb3IgdG9vbGJhciBncm91cCBiZWhhdmUgYXMgYSByYWRpbyBzZXQuIFRoZSBpbml0aWFsIHZhbHVlIGlzIHNwZWNpZmllZCBieSB0aGUgJmx0O3NhbXAmZ3Q7c3RhdGUmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZS4mbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7dG9nZ2xlJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7Jmd0Oy0gYXMgYSBjaGVja2VkIHN0eWxlIG1lbnUgaXRlbSBvciBhcyBhIHRvZ2dsZSB0b29sIGl0ZW0uIFRoZSBpbml0aWFsIHZhbHVlIGlzIHNwZWNpZmllZCBieSB0aGUgJmx0O3NhbXAmZ3Q7c3RhdGUmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZS4mbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7cHVsbGRvd24mbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSBhcyBhIGNhc2NhZGluZyBzdHlsZSBtZW51IGl0ZW0gb3IgYXMgYSBkcm9wIGRvd24gbWVudSBiZXNpZGUgdGhlIHRvb2wgaXRlbS4mbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAmbHQ7L3RhYmxlJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0icHVzaCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJyYWRpbyI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ0b2dnbGUiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0icHVsbGRvd24iPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhdGUiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBpbml0aWFsIHN0YXRlIChlaXRoZXIgJmx0O3NhbXAmZ3Q7dHJ1ZSZsdDsvc2FtcCZndDsgb3IgJmx0O3NhbXAmZ3Q7ZmFsc2UmbHQ7L3NhbXAmZ3Q7KS4gVXNlZCBvbmx5IHdoZW4gdGhlICZsdDtzYW1wJmd0O3N0eWxlJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUgaGFzIHRoZSB2YWx1ZSAmbHQ7c2FtcCZndDtyYWRpbyZsdDsvc2FtcCZndDsgb3IgJmx0O3NhbXAmZ3Q7dG9nZ2xlJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwdWxsZG93biIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgJmx0O2ImZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7I0ZGMDAwMCZxdW90OyZndDtEZXByZWNhdGVkOiZsdDsvZm9udCZndDsmbHQ7L2ImZ3Q7IFVzZSB0aGUgJmx0O3NhbXAmZ3Q7c3R5bGUmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZSAmbHQ7c2FtcCZndDtwdWxsZG93biZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlJmx0Oy9zYW1wJmd0OyBvciAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZSZsdDsvc2FtcCZndDsuIFRoZSBsYXR0ZXIgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIGNhc2VzIHdoZXJlIHRoZSAmbHQ7c2FtcCZndDtzdHlsZSZsdDsvc2FtcCZndDsgYXR0cmlidXRlIGhhcyB0aGUgdmFsdWUgJmx0O3NhbXAmZ3Q7cHVsbGRvd24mbHQ7L3NhbXAmZ3Q7LiBUaGlzIGNsYXNzIGlzIHRoZSBoYW5kbGVyIHJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5nIHRoZSBhY3Rpb24uIElmIHRoZSAmbHQ7c2FtcCZndDtyZXRhcmdldCZsdDsvc2FtcCZndDsgYXR0cmlidXRlIGlzIHRydWUsIHRoaXMgYXR0cmlidXRlIGlzIGlnbm9yZWQgYW5kIHNob3VsZCBub3QgYmUgc3VwcGxpZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXRhcmdldCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgYXR0cmlidXRlIHRvIHJldGFyZ2V0IHRoaXMgYWN0aW9uLiBXaGVuIHRydWUsIHZpZXcgYW5kIGVkaXRvciBwYXJ0cyBtYXkgc3VwcGx5IGEgaGFuZGxlciBmb3IgdGhpcyBhY3Rpb24gdXNpbmcgdGhlIHN0YW5kYXJkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyBhIGdsb2JhbCBhY3Rpb24gaGFuZGxlciBvbiB0aGVpciBzaXRlIHVzaW5nIHRoaXMgYWN0aW9uJmFwb3M7cyBpZGVudGlmaWVyLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyB0cnVlLCB0aGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHN1cHBsaWVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsbG93TGFiZWxVcGRhdGUiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJldGFyZ2V0IGFjdGlvbiBhbGxvd3MgdGhlIGhhbmRsZXIgdG8gb3ZlcnJpZGUgaXQmYXBvcztzIGxhYmVsIGFuZCB0b29sdGlwLiBPbmx5IGFwcGxpZXMgaWYgJmx0O3NhbXAmZ3Q7cmV0YXJnZXQmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBpcyB0cnVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuYWJsZXNGb3IiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBzZWxlY3Rpb24gY291bnQgd2hpY2ggbXVzdCBiZSBtZXQgdG8gZW5hYmxlIHRoZSBhY3Rpb24uIElmIHNwZWNpZmllZCBhbmQgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LCB0aGUgYWN0aW9uIGlzIGRpc2FibGVkLiBJZiBvbWl0dGVkLCB0aGUgYWN0aW9uIGVuYWJsZW1lbnQgc3RhdGUgaXMgbm90IGFmZmVjdGVkLiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQ6IAotICAgICZsdDt0YWJsZSBib3JkZXI9JnF1b3Q7MCZxdW90OyB3aWR0aD0mcXVvdDs4MCUmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0OyEmbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSAwIGl0ZW1zIHNlbGVjdGVkJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0Oz8mbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSAwIG9yIDEgaXRlbXMgc2VsZWN0ZWQmbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7KyZsdDsvYiZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyZndDstIDEgb3IgbW9yZSBpdGVtcyBzZWxlY3RlZCZsdDsvdGQmZ3Q7Ci0gICAgICAmbHQ7L3RyJmd0OwotICAgICAgJmx0O3RyJmd0OwotICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzI1JnF1b3Q7Jmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IG5vd3JhcCZndDsmbHQ7YiZndDttdWx0aXBsZSwgMismbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSAyIG9yIG1vcmUgaXRlbXMgc2VsZWN0ZWQmbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7biZsdDsvYiZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyZndDstIGEgcHJlY2lzZSBudW1iZXIgb2YgaXRlbXMgc2VsZWN0ZWQuYSBwcmVjaXNlIG51bWJlciBvZiBpdGVtcyBzZWxlY3RlZC4mYW1wO25ic3A7Ci0gICAgICAgICAgRm9yIGV4YW1wbGU6IGVuYWJsZXNGb3I9JmFtcDtxdW90OyA0JmFtcDtxdW90OyBlbmFibGVzIHRoZSBhY3Rpb24gb25seSB3aGVuIDQKLSAgICAgICAgICBpdGVtcyBhcmUgc2VsZWN0ZWQmbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7KiZsdDsvYiZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyZndDstIGFueSBudW1iZXIgb2YgaXRlbXMgc2VsZWN0ZWQmbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAmbHQ7L3RhYmxlJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gYWN0aW9uIHNldCAobm90ZSAKLXRoZSBzdWItZWxlbWVudHMgYW5kIHRoZSB3YXkgYXR0cmlidXRlcyBhcmUgdXNlZCk6IAotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAgJmx0O2V4dGVuc2lvbiBwb2ludCA9ICZxdW90O29yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMmcXVvdDsmZ3Q7IAotICAgICAgICAmbHQ7YWN0aW9uU2V0Ci0gICAgICAgICAgICBpZD0mcXVvdDtjb20ueHl6LmFjdGlvblNldCZxdW90OyAKLSAgICAgICAgICAgIGxhYmVsPSZxdW90O015IEFjdGlvbnMmcXVvdDsmZ3Q7IAotICAgICAgICAgICAgJmx0O21lbnUKLSAgICAgICAgICAgICAgIGlkPSZxdW90O2NvbS54eXoueHl6TWVudSZxdW90OyAKLSAgICAgICAgICAgICAgIGxhYmVsPSZxdW90O1hZWiBNZW51JnF1b3Q7Ci0gICAgICAgICAgICAgICBwYXRoPSZxdW90O2FkZGl0aW9ucyZxdW90OyZndDsgCi0gICAgICAgICAgICAgICAmbHQ7c2VwYXJhdG9yIG5hbWU9JnF1b3Q7Z3JvdXAxJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICAgICZsdDtzZXBhcmF0b3IgbmFtZT0mcXVvdDtvcHRpb24xJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICZsdDsvbWVudSZndDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgJmx0O2FjdGlvbgotICAgICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei5ydW5YWVomcXVvdDsgCi0gICAgICAgICAgICAgICBsYWJlbD0mcXVvdDsmYW1wO2FtcDtSdW4gWFlaIFRvb2wmcXVvdDsKLSAgICAgICAgICAgICAgIHN0eWxlPSZxdW90O3RvZ2dsZSZxdW90OwotICAgICAgICAgICAgICAgc3RhdGU9JnF1b3Q7ZmFsc2UmcXVvdDsKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSZxdW90O2NvbS54eXoueHl6TWVudS9ncm91cDEmcXVvdDsgCi0gICAgICAgICAgICAgICBpY29uPSZxdW90O2ljb25zL3J1blhZWi5naWYmcXVvdDsgCi0gICAgICAgICAgICAgICB0b29sdGlwPSZxdW90O1J1biBYWVogVG9vbCZxdW90OyAKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9JnF1b3Q7Y29tLnh5ei5ydW5fYWN0aW9uX2NvbnRleHQmcXVvdDsgCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LmFjdGlvbnMuUnVuWFlaJnF1b3Q7IAotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0mcXVvdDsxJnF1b3Q7Jmd0OyAKLSAgICAgICAgICAgICAgICZsdDtzZWxlY3Rpb24gY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUmcXVvdDsgbmFtZT0mcXVvdDsqLmphdmEmcXVvdDsvJmd0OyAKLSAgICAgICAgICAgICZsdDsvYWN0aW9uJmd0OwotICAgICAgICAgICAgJmx0O2FjdGlvbiAKLSAgICAgICAgICAgICAgIGlkPSZxdW90O2NvbS54eXoucnVuQUJDJnF1b3Q7Ci0gICAgICAgICAgICAgICBsYWJlbD0mcXVvdDsmYW1wO2FtcDtSdW4gQUJDIFRvb2wmcXVvdDsKLSAgICAgICAgICAgICAgIHN0eWxlPSZxdW90O3B1c2gmcXVvdDsKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSZxdW90O2NvbS54eXoueHl6TWVudS9ncm91cDEmcXVvdDsKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSZxdW90O05vcm1hbC9YWVomcXVvdDsKLSAgICAgICAgICAgICAgIGljb249JnF1b3Q7aWNvbnMvcnVuQUJDLmdpZiZxdW90OwotICAgICAgICAgICAgICAgdG9vbHRpcD0mcXVvdDtSdW4gQUJDIFRvb2wmcXVvdDsKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9JnF1b3Q7Y29tLnh5ei5ydW5fYWJjX2FjdGlvbl9jb250ZXh0JnF1b3Q7Ci0gICAgICAgICAgICAgICByZXRhcmdldD0mcXVvdDt0cnVlJnF1b3Q7Ci0gICAgICAgICAgICAgICBhbGxvd0xhYmVsVXBkYXRlPSZxdW90O3RydWUmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAmbHQ7ZW5hYmxlbWVudCZndDsKLSAgICAgICAgICAgICAgICAgICZsdDthbmQmZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAmbHQ7b2JqZWN0Q2xhc3MgbmFtZT0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAmbHQ7bm90Jmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O29iamVjdFN0YXRlIG5hbWU9JnF1b3Q7ZXh0ZW5zaW9uJnF1b3Q7IHZhbHVlPSZxdW90O2phdmEmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgICAgICAgJmx0Oy9ub3QmZ3Q7Ci0gICAgICAgICAgICAgICAgICAmbHQ7L2FuZCZndDsKLSAgICAgICAgICAgICAgICZsdDsvZW5hYmxlbWVudCZndDsKLSAgICAgICAgICAgICZsdDsvYWN0aW9uJmd0OyAgICAgICAgICAgICAKLQotICAgICAgICAgICAgJmx0O2FjdGlvbiAKLSAgICAgICAgICAgICAgIGlkPSZxdW90O2NvbS54eXoucnVuREVGJnF1b3Q7Ci0gICAgICAgICAgICAgICBsYWJlbD0mcXVvdDsmYW1wO2FtcDtSdW4gREVGIFRvb2wmcXVvdDsKLSAgICAgICAgICAgICAgIHN0eWxlPSZxdW90O3JhZGlvJnF1b3Q7Ci0gICAgICAgICAgICAgICBzdGF0ZT0mcXVvdDt0cnVlJnF1b3Q7Ci0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0mcXVvdDtjb20ueHl6Lnh5ek1lbnUvb3B0aW9uMSZxdW90OwotICAgICAgICAgICAgICAgaWNvbj0mcXVvdDtpY29ucy9ydW5ERUYuZ2lmJnF1b3Q7Ci0gICAgICAgICAgICAgICB0b29sdGlwPSZxdW90O1J1biBERUYgVG9vbCZxdW90OwotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei5hY3Rpb25zLlJ1bkRFRiZxdW90OyAKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9JnF1b3Q7Y29tLnh5ei5ydW5fZGVmX2FjdGlvbl9jb250ZXh0JnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0Oy9hY3Rpb24mZ3Q7ICAgICAgICAgICAgIAotICAgICAgICAgICAgJmx0O2FjdGlvbiAKLSAgICAgICAgICAgICAgIGlkPSZxdW90O2NvbS54eXoucnVuR0hJJnF1b3Q7Ci0gICAgICAgICAgICAgICBsYWJlbD0mcXVvdDsmYW1wO2FtcDtSdW4gR0hJIFRvb2wmcXVvdDsKLSAgICAgICAgICAgICAgIHN0eWxlPSZxdW90O3JhZGlvJnF1b3Q7Ci0gICAgICAgICAgICAgICBzdGF0ZT0mcXVvdDtmYWxzZSZxdW90OwotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9JnF1b3Q7Y29tLnh5ei54eXpNZW51L29wdGlvbjEmcXVvdDsKLSAgICAgICAgICAgICAgIGljb249JnF1b3Q7aWNvbnMvcnVuR0hJLmdpZiZxdW90OwotICAgICAgICAgICAgICAgdG9vbHRpcD0mcXVvdDtSdW4gR0hJIFRvb2wmcXVvdDsKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS54eXouYWN0aW9ucy5SdW5HSEkmcXVvdDsgCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSZxdW90O2NvbS54eXoucnVuX2doaV9hY3Rpb25fY29udGV4dCZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDsvYWN0aW9uJmd0OyAgICAgICAgICAgICAKLSAgICAgICAgICAgICZsdDthY3Rpb24gCi0gICAgICAgICAgICAgICBpZD0mcXVvdDtjb20ueHl6LnJ1bkpLTCZxdW90OwotICAgICAgICAgICAgICAgbGFiZWw9JnF1b3Q7JmFtcDthbXA7UnVuIEpLTCBUb29sJnF1b3Q7Ci0gICAgICAgICAgICAgICBzdHlsZT0mcXVvdDtyYWRpbyZxdW90OwotICAgICAgICAgICAgICAgc3RhdGU9JnF1b3Q7ZmFsc2UmcXVvdDsKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSZxdW90O2NvbS54eXoueHl6TWVudS9vcHRpb24xJnF1b3Q7Ci0gICAgICAgICAgICAgICBpY29uPSZxdW90O2ljb25zL3J1bkpLTC5naWYmcXVvdDsKLSAgICAgICAgICAgICAgIHRvb2x0aXA9JnF1b3Q7UnVuIEpLTCBUb29sJnF1b3Q7Ci0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LmFjdGlvbnMuUnVuSktMJnF1b3Q7IAotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0mcXVvdDtjb20ueHl6LnJ1bl9qa2xfYWN0aW9uX2NvbnRleHQmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2FjdGlvbiZndDsgICAgICAgICAgICAgCi0gICAgICAgICZsdDsvYWN0aW9uU2V0Jmd0OyAKLSAgICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBzcGVjaWZpZWQgYWN0aW9uIHNldCwgbmFtZWQgJnF1b3Q7TXkgQWN0aW9ucyZxdW90OywgaXMgbm90IGluaXRpYWxseSB2aXNpYmxlIHdpdGhpbiBlYWNoIHBlcnNwZWN0aXZlIGJlY2F1c2UgdGhlICZsdDtzYW1wJmd0O3Zpc2libGUmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgWFlaIGFjdGlvbiB3aWxsIGFwcGVhciBhcyBhIGNoZWNrIGJveCBtZW51IGl0ZW0sIGluaXRpYWxseSBub3QgY2hlY2tlZC4gSXQgaXMgZW5hYmxlZCBvbmx5IGlmIHRoZSBzZWxlY3Rpb24gY291bnQgaXMgMSBhbmQgaWYgdGhlIHNlbGVjdGlvbiBjb250YWlucyBhIEphdmEgZmlsZSByZXNvdXJjZS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVGhlIEFCQyBhY3Rpb24gd2lsbCBhcHBlYXIgYm90aCBpbiB0aGUgbWVudSBhbmQgb24gdGhlIHRvb2xiYXIuIEl0IGlzIGVuYWJsZWQgb25seSBpZiB0aGUgc2VsZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gYW55IEphdmEgZmlsZSByZXNvdXJjZXMuIE5vdGUgYWxzbyB0aGlzIGlzIGEgbGFiZWwgcmV0YXJnZXQgYWN0aW9uIHRoZXJlZm9yZSBpdCBkb2VzIG5vdCBzdXBwbHkgYSAmbHQ7c2FtcCZndDtjbGFzcyZsdDsvc2FtcCZndDsgYXR0cmlidXRlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgYWN0aW9ucyBERUYsIEdISSwgYW5kIEpLTCBhcHBlYXIgYXMgcmFkaW8gYnV0dG9uIG1lbnUgaXRlbXMuIFRoZXkgYXJlIGVuYWJsZWQgYWxsIHRoZSB0aW1lLCBpbmRlcGVuZGVudCBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gc3RhdGUuCi0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBjbGFzcyBhdHRyaWJ1dGUgbXVzdCBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlJmx0Oy9zYW1wJmd0OyBvciAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZSZsdDsvc2FtcCZndDsuIFRoZSBsYXR0ZXIgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIGNhc2VzIHdoZXJlIHRoZSAmbHQ7c2FtcCZndDtzdHlsZSZsdDsvc2FtcCZndDsgYXR0cmlidXRlIGhhcyB0aGUgdmFsdWUgJmx0O3NhbXAmZ3Q7cHVsbGRvd24mbHQ7L3NhbXAmZ3Q7LiBUaGlzIGNsYXNzIGlzIHRoZSBoYW5kbGVyIHJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5nIHRoZSBhY3Rpb24uIElmIHRoZSAmbHQ7c2FtcCZndDtyZXRhcmdldCZsdDsvc2FtcCZndDsgYXR0cmlidXRlIGlzIHRydWUsIHRoaXMgYXR0cmlidXRlIGlzIGlnbm9yZWQgYW5kIHNob3VsZCBub3QgYmUgc3VwcGxpZWQuIFRoaXMgY2xhc3MgaXMgbG9hZGVkIGFzIGxhdGUgYXMgcG9zc2libGUgdG8gYXZvaWQgbG9hZGluZyB0aGUgZW50aXJlIHBsdWctaW4gYmVmb3JlIGl0IGlzIHJlYWxseSBuZWVkZWQuCi0mbHQ7cCZndDsKLVRoZSBlbmFibGVtZW50IGNyaXRlcmlhIGZvciBhbiBhY3Rpb24gZXh0ZW5zaW9uIGlzIGluaXRpYWxseSBkZWZpbmVkIGJ5ICZsdDtzYW1wJmd0O2VuYWJsZXNGb3ImbHQ7L3NhbXAmZ3Q7LCBhbmQgYWxzbyBlaXRoZXIgJmx0O3NhbXAmZ3Q7c2VsZWN0aW9uJmx0Oy9zYW1wJmd0OyBvciAmbHQ7c2FtcCZndDtlbmFibGVtZW50Jmx0Oy9zYW1wJmd0Oy4gSG93ZXZlciwgb25jZSB0aGUgYWN0aW9uIGRlbGVnYXRlIGhhcyBiZWVuIGluc3RhbnRpYXRlZCwgaXQgbWF5IGNvbnRyb2wgdGhlIGFjdGlvbiBlbmFibGUgc3RhdGUgZGlyZWN0bHkgd2l0aGluIGl0cyAmbHQ7c2FtcCZndDtzZWxlY3Rpb25DaGFuZ2VkJmx0Oy9zYW1wJmd0OyBtZXRob2QuCi0mbHQ7cCZndDsKLUl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIHdvcmtiZW5jaCBkb2VzIG5vdCBnZW5lcmF0ZSBtZW51cyBvbiBhIHBsdWctaW4mYXBvcztzIGJlaGFsZi4gTWVudSBwYXRocyBtdXN0IHJlZmVyZW5jZSBtZW51cyB0aGF0IGFscmVhZHkgZXhpc3QuCi0mbHQ7cCZndDsKLUFjdGlvbiBhbmQgbWVudSBsYWJlbHMgbWF5IGNvbnRhaW4gc3BlY2lhbCBjaGFyYWN0ZXJzIHRoYXQgZW5jb2RlIG1uZW1vbmljcyB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotJmx0O29sJmd0OwotJmx0O2xpJmd0OwotTW5lbW9uaWNzIGFyZSBzcGVjaWZpZWQgdXNpbmcgdGhlIGFtcGVyc2FuZCAoJmFwb3M7JmFtcDthbXA7JmFwb3M7KSBjaGFyYWN0ZXIgaW4gZnJvbnQgb2YgYSBzZWxlY3RlZCBjaGFyYWN0ZXIgaW4gdGhlIHRyYW5zbGF0ZWQgdGV4dC4gU2luY2UgYW1wZXJzYW5kIGlzIG5vdCBhbGxvd2VkIGluIFhNTCBzdHJpbmdzLCB1c2UgJmx0O3NhbXAmZ3Q7JmFtcDthbXA7YW1wOyZsdDsvc2FtcCZndDsgY2hhcmFjdGVyIGVudGl0eS4mbHQ7L2xpJmd0OwotJmx0Oy9vbCZndDsKLUlmIHR3byBvciBtb3JlIGFjdGlvbnMgYXJlIGNvbnRyaWJ1dGVkIHRvIGEgbWVudSBvciB0b29sYmFyIGJ5IGEgc2luZ2xlIGV4dGVuc2lvbiB0aGUgYWN0aW9ucyB3aWxsIGFwcGVhciBpbiB0aGUgcmV2ZXJzZSBvcmRlciBvZiBob3cgdGhleSBhcmUgbGlzdGVkIGluIHRoZSBwbHVnaW4ueG1sIGZpbGUuIFRoaXMgYmVoYXZpb3IgaXMgYWRtaXR0ZWRseSB1bmludHVpdGl2ZS4gIEhvd2V2ZXIsIGl0IHdhcyBkaXNjb3ZlcmVkIGFmdGVyIHRoZSBFY2xpcHNlIFBsYXRmb3JtIEFQSSB3YXMgZnJvemVuLiBDaGFuZ2luZyB0aGUgYmVoYXZpb3Igbm93IHdvdWxkIGJyZWFrIGV2ZXJ5IHBsdWctaW4gd2hpY2ggcmVsaWVzIHVwb24gdGhlIGV4aXN0aW5nIGJlaGF2aW9yLgotJmx0O3AmZ3Q7Ci1UaGUgJmx0O3NhbXAmZ3Q7c2VsZWN0aW9uJmx0Oy9zYW1wJmd0OyBhbmQgJmx0O3NhbXAmZ3Q7ZW5hYmxlbWVudCZsdDsvc2FtcCZndDsgZWxlbWVudHMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gVGhlICZsdDtzYW1wJmd0O2VuYWJsZW1lbnQmbHQ7L3NhbXAmZ3Q7IGVsZW1lbnQgY2FuIHJlcGxhY2UgdGhlICZsdDtzYW1wJmd0O3NlbGVjdGlvbiZsdDsvc2FtcCZndDsgZWxlbWVudCB1c2luZyB0aGUgc3ViLWVsZW1lbnRzICZsdDtzYW1wJmd0O29iamVjdENsYXNzJmx0Oy9zYW1wJmd0OyBhbmQgJmx0O3NhbXAmZ3Q7b2JqZWN0U3RhdGUmbHQ7L3NhbXAmZ3Q7LiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZzoKLSZsdDtwcmUmZ3Q7Ci0gJmx0O3NlbGVjdGlvbgotICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSZxdW90OwotICBuYW1lPSZxdW90OyouamF2YSZxdW90OyZndDsKLSAmbHQ7L3NlbGVjdGlvbiZndDsKLSZsdDsvcHJlJmd0OwotY2FuIGJlIGV4cHJlc3NlZCB1c2luZzoKLSZsdDtwcmUmZ3Q7Ci0gJmx0O2VuYWJsZW1lbnQmZ3Q7Ci0gICZsdDthbmQmZ3Q7Ci0gICAmbHQ7b2JqZWN0Q2xhc3MgbmFtZT0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSZxdW90Oy8mZ3Q7Ci0gICAmbHQ7b2JqZWN0U3RhdGUgbmFtZT0mcXVvdDtleHRlbnNpb24mcXVvdDsgdmFsdWU9JnF1b3Q7amF2YSZxdW90Oy8mZ3Q7Ci0gICZsdDsvYW5kJmd0OwotICZsdDsvZW5hYmxlbWVudCZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBQbHVnLWlucyBtYXkgdXNlIHRoaXMgZXh0ZW5zaW9uIHBvaW50IHRvIGFkZCBuZXcgdG9wIGxldmVsIG1lbnVzLiBQbHVnLWlucyBjYW4gYWxzbyBkZWZpbmUgbmFtZWQgZ3JvdXBzIHdoaWNoIGFsbG93IG90aGVyIHBsdWctaW5zIHRvIGNvbnRyaWJ1dGUgdGhlaXIgYWN0aW9ucyBpbnRvIHRoZW0uIAotJmx0O3AmZ3Q7Ci1Ub3AgbGV2ZWwgbWVudXMgYXJlIGNyZWF0ZWQgYnkgdXNpbmcgdGhlIGZvbGxvd2luZyB2YWx1ZXMKLWZvciB0aGUgcGF0aCBhdHRyaWJ1dGU6IAotJmx0O3VsJmd0OwotJmx0O2xpJmd0O2FkZGl0aW9ucyAtIHJlcHJlc2VudHMgYSBncm91cCBpbW1lZGlhdGVseSB0byB0aGUgbGVmdCBvZiB0aGUgJmx0O3NhbXAmZ3Q7V2luZG93Jmx0Oy9zYW1wJmd0OyBtZW51LiAKLSZsdDsvdWwmZ3Q7Ci1PbWl0dGluZyB0aGUgcGF0aCBhdHRyaWJ1dGUgd2lsbCByZXN1bHQgaW4gYWRkaW5nIHRoZSBuZXcgbWVudSBpbnRvIHRoZSBhZGRpdGlvbnMgbWVudSBiYXIgZ3JvdXAuIAotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgZGVmYXVsdCBncm91cHMgaW4gYSB3b3JrYmVuY2ggd2luZG93IGFyZSBkZWZpbmVkIGluIHRoZQotJmx0O3NhbXAmZ3Q7SVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cyZsdDsvc2FtcCZndDsgaW50ZXJmYWNlLiBUaGVzZQotY29uc3RhbnRzIGNhbiBiZSB1c2VkIGluIGNvZGUgZm9yIGR5bmFtaWMgY29udHJpYnV0aW9uLgotVGhlIHZhbHVlcyBjYW4gYWxzbyBiZSBjb3BpZWQgaW50byBhbiBYTUwgZmlsZSBmb3IgZmluZQotZ3JhaW5lZCBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBleGlzdGluZyB3b3JrYmVuY2ggbWVudXMKLWFuZCB0b29sYmFyLiAKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVmFyaW91cyBtZW51IGFuZCB0b29sYmFyIGl0ZW1zIHdpdGhpbiB0aGUgd29ya2JlbmNoIAotd2luZG93IGFyZSBkZWZpbmVkIGFsZ29yaXRobWljYWxseS4gIEluIHRoZXNlIGNhc2VzIAotYSBzZXBhcmF0ZSBtZWNoYW5pc20gbXVzdCBiZSB1c2VkIHRvIGV4dGVuZCB0aGUgCi13aW5kb3cuIEZvciBleGFtcGxlLCBhZGRpbmcgYSBuZXcgd29ya2JlbmNoIHZpZXcgCi1yZXN1bHRzIGluIGEgbmV3IG1lbnUgaXRlbSBhcHBlYXJpbmcgaW4gdGhlCi1QZXJzcGVjdGl2ZSBtZW51LiBJbXBvcnQsIEV4cG9ydCwgYW5kIE5ldyBXaXphcmRzIAotZXh0ZW5zaW9ucyBhcmUgYWxzbyBhZGRlZCBhdXRvbWF0aWNhbGx5IHRvIHRoZSB3aW5kb3cuCi0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYWN0aXZpdGllcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYWN0aXZpdGllcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQzZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2FjdGl2aXRpZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJhY3Rpdml0aWVzIiBuYW1lPSJBY3Rpdml0aWVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0OwotVGhlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMmbHQ7L2NvZGUmZ3Q7IGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGRlY2xhcmUgYWN0aXZpdGllcyBhbmQgYXNzb2NpYXRlZCBlbGVtZW50cy4gIEFjdGl2aXRpZXMgYXJlIHVzZWQgYnkgdGhlIHBsYXRmb3JtIHRvIGZpbHRlciBjZXJ0YWluIHBsdWdpbiBjb250cmlidXRpb25zIGZyb20gdGhlIHVzZXJzIHZpZXcgdW50aWwgc3VjaCBhIHRpbWUgdGhhdCB0aGV5IGV4cHJlc3MgaW50ZXJlc3QgaW4gdGhlbS4gIFRoaXMgYWxsb3dzIEVjbGlwc2UgdG8gZ3JvdyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgdXNhZ2UgcGF0dGVybiBvZiBhIHVzZXIuCi0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFjdGl2aXR5UGF0dGVybkJpbmRpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVmYXVsdEVuYWJsZW1lbnQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFjdGl2aXR5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCB0byBkZWZpbmUgYWN0aXZpdGllcy4gSWYgbW9yZSB0aGFuIG9uZSBvZiB0aGVzZSBlbGVtZW50cyBleGlzdCB3aXRoIHRoZSBzYW1lICZsdDtjb2RlJmd0O2lkJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUsIG9ubHkgdGhlIGxhc3QgZGVjbGFyZWQgZWxlbWVudCAoaW4gb3JkZXIgb2YgcmVhZGluZyB0aGUgcmVnaXN0cnkpIGlzIGNvbnNpZGVyZWQgdmFsaWQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoaXMgYWN0aXZpdHkgZm9yIGRpc3BsYXkgaW4gdGhlIFVJCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBhY3Rpdml0eQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHRyYW5zbGF0YWJsZSBuYW1lIG9mIHRoaXMgYWN0aXZpdHkgZm9yIGRpc3BsYXkgaW4gdGhlIFVJCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYWN0aXZpdHlSZXF1aXJlbWVudEJpbmRpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBhbGxvd3Mgb25lIHRvIGJpbmQgYWN0aXZpdGllcyB0byBhY3Rpdml0aWVzLiBUaGUgcmVsYXRpb25zaGlwIGlzIHN1Y2ggdGhhdCBpZiB0aGUgYWN0aXZpdHlJZCBpcyBldmVyIGVuYWJsZWQgdGhlbiB0aGUgcmVxdWlyZWRBY3Rpdml0eUlkIGlzIGVuYWJsZWQgYXMgd2VsbC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWRBY3Rpdml0eUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiByZXF1aXJlZCBhY3Rpdml0eSB0byBiaW5kCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFjdGl2aXR5IHRvIGJpbmQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYWN0aXZpdHlQYXR0ZXJuQmluZGluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGFsbG93cyBvbmUgdG8gYmluZCBhY3Rpdml0aWVzIHRvIHBhdHRlcm5zLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYWN0aXZpdHkgdG8gYmluZAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdHRlcm4iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHBhdHRlcm4gdG8gYmUgYm91bmQuIFBhdHRlcm5zIGFyZSByZWd1bGFyIGV4cHJlc3Npb25zIHdoaWNoIG1hdGNoIHVuaXF1ZSBpZGVudGlmaWVycy4gIFBsZWFzZSBzZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgJmx0O2NvZGUmZ3Q7amF2YS51dGlsLnJlZ2V4LlBhdHRlcm4mbHQ7L2NvZGUmZ3Q7IGZvciBmdXJ0aGVyIGRldGFpbHMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNhdGVnb3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCB0byBkZWZpbmUgY2F0ZWdvcmllcy4gSWYgbW9yZSB0aGFuIG9uZSBvZiB0aGVzZSBlbGVtZW50cyBleGlzdCB3aXRoIHRoZSBzYW1lICZsdDtjb2RlJmd0O2lkJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUsIG9ubHkgdGhlIGxhc3QgZGVjbGFyZWQgZWxlbWVudCAoaW4gb3JkZXIgb2YgcmVhZGluZyB0aGUgcmVnaXN0cnkpIGlzIGNvbnNpZGVyZWQgdmFsaWQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoaXMgY2F0ZWdvcnkgZm9yIGRpc3BsYXkgaW4gdGhlIFVJCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBjYXRlZ29yeQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHRyYW5zbGF0YWJsZSBuYW1lIG9mIHRoaXMgY2F0ZWdvcnkgZm9yIGRpc3BsYXkgaW4gdGhlIFVJCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBhbGxvd3Mgb25lIHRvIGJpbmQgY2F0ZWdvcmllcyB0byBhY3Rpdml0aWVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYWN0aXZpdHkgdG8gYmluZAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5SWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjYXRlZ29yeSB0byBiaW5kCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlZmF1bHRFbmFibGVtZW50Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgYWxsb3dzIG9uZSB0byBzcGVjaWZ5IHRoYXQgYSBnaXZlbiBhY3Rpdml0eSBzaG91bGQgYmUgZW5hYmxlZCBieSBkZWZhdWx0LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFjdGl2aXR5Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0OwotMy4wCi0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBzZXZlcmFsIGFjdGl2aXR5IGFuZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBhcyB3ZWxsIGFzIGFzc29jaWF0ZWQgYmluZGluZ3MuCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzJnF1b3Q7Jmd0OwotICAmbHQ7YWN0aXZpdHkgaWQ9JnF1b3Q7Y29tLnh5ei5BY3Rpdml0eSZxdW90OwotICAgICAgZGVzY3JpcHRpb249JnF1b3Q7RmlsdGVycyBjb250cmlidXRpb25zIGZyb20gY29tLnh5eiZxdW90OwotICAgbmFtZT0mcXVvdDtNeSBBY3Rpdml0eSZxdW90OyAvJmd0OwotCi0gICZsdDthY3Rpdml0eSBpZD0mcXVvdDtjb20ueHl6Lk90aGVyQWN0aXZpdHkmcXVvdDsKLSAgICAgIGRlc2NyaXB0aW9uPSZxdW90O0ZpbHRlcnMgb3RoZXIgY29udHJpYnV0aW9ucyBmcm9tIGNvbS54eXomcXVvdDsKLSAgIG5hbWU9JnF1b3Q7TXkgT3RoZXIgQWN0aXZpdHkmcXVvdDsgLyZndDsKLSAgJmx0OyEtLSBvdGhlciBhY3Rpdml0eSByZXF1aXJlcyBhY3Rpdml0eSAtLSZndDsgIAotICAmbHQ7YWN0aXZpdHlSZXF1aXJlbWVudEJpbmRpbmcgYWN0aXZpdHlJZD0mcXVvdDtjb20ueHl6Lk90aGVyQWN0aXZpdHkmcXVvdDsKLSAgIHJlcXVpcmVkQWN0aXZpdHlJZD0mcXVvdDtjb20ueHl6LkFjdGl2aXR5JnF1b3Q7IC8mZ3Q7Ci0gICZsdDtjYXRlZ29yeSBpZD0mcXVvdDtjb20ueHl6LkNhdGVnb3J5JnF1b3Q7Ci0gICBkZXNjcmlwdGlvbj0mcXVvdDtjb20ueHl6IEFjdGl2aXRpZXMmcXVvdDsKLSAgIG5hbWU9JnF1b3Q7TXkgQ2F0ZWdvcnkmcXVvdDsgLyZndDsKLSAgIAotICAgICAmbHQ7IS0tIHB1dCB0aGUgYWN0aXZpdHkgaW4gdGhlIGNhdGVnb3J5IC0tJmd0OwotICAmbHQ7Y2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmcgYWN0aXZpdHlJZD0mcXVvdDtjb20ueHl6LkFjdGl2aXR5JnF1b3Q7Ci0gICBjYXRlZ29yeUlkPSZxdW90O2NvbS54eXouQ2F0ZWdvcnkmcXVvdDsgLyZndDsKLSAgIAotICAgICAmbHQ7IS0tIGJpbmQgYWxsIGNvbnRyaWJ1dGlvbnMgZnJvbSBwbHVnaW4gY29tLnh5eiAtLSZndDsKLSAgJmx0O2FjdGl2aXR5UGF0dGVybkJpbmRpbmcgaWQ9JnF1b3Q7Y29tLnh5ei5BY3Rpdml0eSZxdW90OwotICAgcGF0dGVybj0mcXVvdDtjb21cLnh5ei8uKiZxdW90OyAvJmd0OwotICAKLSAgJmx0OyEtLSBiaW5kIG15LmNvbnRyaWJ1dGlvbiBmcm9tIHBsdWdpbiBjb20ueHl6Lm90aGVyIC0tJmd0OwotICAmbHQ7YWN0aXZpdHlQYXR0ZXJuQmluZGluZyBpZD0mcXVvdDtjb20ueHl6Lk90aGVyQWN0aXZpdHkmcXVvdDsKLSAgIHBhdHRlcm49JnF1b3Q7Y29tXC54eXpcLm90aGVyL215LmNvbnRyaWJ1dGlvbiZxdW90OyAvJmd0OwotICAgCi0gICZsdDshLS0gb3VyIGFjdGl2aXR5IHNob3VsZCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQgLS0mZ3Q7Ci0gICZsdDtkZWZhdWx0RW5hYmxlbWVudCBpZD0mcXVvdDtjb20ueHl6LkFjdGl2aXR5JnF1b3Q7IC8mZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLVRoZXJlIGlzIGN1cnJlbnRseSBubyBwdWJsaWMgQVBJIGZvciBkZWNsYXJpbmcgYWN0aXZpdGllcyBvciBhc3NvY2lhdGVkIGVsZW1lbnRzIG90aGVyIHRoYW4gdGhpcyBleHRlbnNpb24gcG9pbnQuICBUaGUgc3RhdGUgb2YgYWN0aXZpdGllcyBpbiB0aGUgd29ya2JlbmNoIGlzIGFjY2Vzc2libGUgdmlhICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2guZ2V0QWN0aXZpdHlTdXBwb3J0KCkmbHQ7L2NvZGUmZ3Q7LiAgRnJvbSBoZXJlIHlvdSBtYXkgcXVlcnkgYW5kIHVwZGF0ZSB0aGUgc2V0IG9mIGN1cnJlbnRseSBlbmFibGVkIGFjdGl2aXRpZXMuCi0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZXJlIGFyZSBubyAmcXVvdDtkZWZhdWx0IGFjdGl2aXRpZXMmcXVvdDsgcHJvdmlkZWQgYnkgdGhlIHdvcmtiZW5jaC4gIEFjdGl2aXRpZXMgYXJlIGludGVuZGVkIHRvIGJlIGRlZmluZWQgYXQgdGhlIHByb2R1Y3QgbGV2ZWwsIHN1Y2ggYXMgdGhlIEVjbGlwc2UgU0RLLCBzbyBhcyB0byB0aWdodGx5IGludGVncmF0ZSBhbGwgb2YgdGhlIChrbm93bikgY29tcG9uZW50cyB0aGF0IHByb2R1Y3QgY29udGFpbnMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYWN0aXZpdHlTdXBwb3J0LmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9hY3Rpdml0eVN1cHBvcnQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjZmFiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9hY3Rpdml0eVN1cHBvcnQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJhY3Rpdml0eVN1cHBvcnQiIG5hbWU9IkFjdGl2aXR5IFN1cHBvcnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byByZWdpc3RlciB2YXJpb3VzIHN1cHBvcnQgZXh0ZW5zaW9ucyByZWxhdGluZyB0byB0aGUgYWN0aXZpdGllcyBpbmZyYXN0dWN0dXJlLgotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idHJpZ2dlclBvaW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRyaWdnZXJQb2ludEFkdmlzb3IiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idHJpZ2dlclBvaW50QWR2aXNvclByb2R1Y3RCaW5kaW5nIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNhdGVnb3J5SW1hZ2VCaW5kaW5nIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFjdGl2aXR5SW1hZ2VCaW5kaW5nIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idHJpZ2dlclBvaW50Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyBhIHRyaWdnZXIgcG9pbnQuICBBIHRyaWdnZXIgcG9pbnQgaXMgYW4gaWRlbnRpZmVyIHRoYXQgaXMgdXNlZCBieSB0aGUgYWN0aXZpdHkgZW5naW5lIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBhbiBhY3Rpb24gc2hvdWxkIGNhdXNlIHRoZSBlbmFibGVtZW50IG9mIGFjdGl2aXRpZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdHJpZ2dlciBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJoaW50Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAmbHQ7cCZndDtBIGhpbnQgcmVwcmVzZW50cyBzb21lIGRhdGEgdGhhdCBtYXkgYmUgdXNlZCBieSB0aGUgZWNsaXBzZSBpbmZyYXN0cnVjdHVyZSB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW91ciBvZiB0aGUgYWN0aXZpdHkgc3VwcG9ydCByZWxhdGluZyB0byB0aGUgaG9zdGluZyB0cmlnZ2VyIHBvaW50LiZsdDsvcCZndDsKLSZsdDtwJmd0O1RoZSBmb2xsb3dpbmcgaGludHMgYXJlICZxdW90O3dlbGwga25vd24mcXVvdDsgYW5kIGl0IGlzIGV4cGVjdGVkIHRoYXQgdHJpZ2dlciBwb2ludCBhZHZpc29ycyBhY2tub3dsZWRnZSB0aGVtOgotJmx0O2RsJmd0OwotJmx0O2R0Jmd0O2ludGVyYWN0aXZlJmx0Oy9kdCZndDsmbHQ7ZGQmZ3Q7V2hldGhlciB0aGlzIHRyaWdnZXIgcG9pbnQgaXMgaGludCBpbiBhbiAmcXVvdDtpbnRlcmFjdGl2ZSZxdW90OyB3YXkuICBJZTogaXQgaXMgdGhlIGV4cGxpY2l0IHJlc3VsdCBvZiBhbiBhY3Rpb24gdW5kZXJ0YWtlbiBieSB0aGUgdXNlciBzdWNoIGFzIGFjdGl2YXRpbmcgYSB3aXphcmQgaW4gdGhlIHdpemFyZCBkaWFsb2cuICBBY2NlcHRlZCB2YWx1ZXMgYXJlICZsdDtjb2RlJmd0O3RydWUmbHQ7L2NvZGUmZ3Q7IGFuZCAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZndDsmbHQ7L2RkJmd0OwotJmx0Oy9kbCZndDsKLSZsdDsvcCZndDsKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBoaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoaXMgaGludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ0cmlnZ2VyUG9pbnRBZHZpc29yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIHRyaWdnZXIgcG9pbnQgYWR2aXNvciBpcyBhIHBvbGljeSBtZWNoYW5pc20gdGhhdCBpcyBjb25zdWx0ZWQgd2hlbmV2ZXIgdGhlIHN5c3RlbSB1bmRlcnRha2VzIGFuIGFjdGlvbiB0aGF0IGhhcyBkaXNhYmxlZCBhY3Rpdml0aWVzIGFzc29jaWF0ZWQgd2l0aCBpdC4gIEl0IGlzIHRoZSBhZHZpc29ycyByZXNwb25zaWJpbGl0eSB0byBhbnN3ZXIgd2hldGhlciBhbiBhY3Rpb24gc2hvdWxkIHByb2NlZWQsIGFuZCBpZiBpdCBjYW4sIHdoYXQgYWN0aXZpdGllcyB0byBlbmFibGUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdHJpZ2dlciBwb2ludCBhZHZpc29yCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklUcmlnZ2VyUG9pbnRBZHZpc29yJmx0Oy9jb2RlJmd0OyBpbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklUcmlnZ2VyUG9pbnRBZHZpc29yIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InRyaWdnZXJQb2ludEFkdmlzb3JQcm9kdWN0QmluZGluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0icHJvZHVjdElkIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyBhIGJpbmRpbmcgYmV0d2VlbiBhIHByb2R1Y3QgYW5kIGFuIGFkdmlzb3IuICBUaGVzZSBiaW5kaW5ncyBkZXRlcm1pbmUgd2hpY2ggYWR2aXNvciBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgcHJvZHVjdCAoYXMgZGVmaW5lZCBieSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm0uZ2V0UHJvZHVjdCgpJmx0Oy9jb2RlJmd0OykuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb2R1Y3RJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB1bmlxdWUgaWQgb2YgYSBwcm9kdWN0Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHJpZ2dlclBvaW50QWR2aXNvcklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHVuaXF1ZSBpZCBvZiBhIHRyaWdnZXIgcG9pbnQgYWR2aXNvcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRlZ29yeUltYWdlQmluZGluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiIGljb249Imljb24iLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGFsbG93cyBiaW5kaW5nIG9mIGljb25zIHRvIGNhdGVnb3JpZXMgIFRoZXNlIGljb25zIG1heSBiZSB1c2VkIGJ5IHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudHMgdGhhdCB3aXNoIHRvIHZpc3VhbGl6ZSBjYXRlZ29yaWVzIGluIHNvbWUgd2F5LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGNhdGVnb3J5IHRvIGJpbmQgYW4gaWNvbiB0bwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGljb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoaXMgY2F0ZWdvcnkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFjdGl2aXR5SW1hZ2VCaW5kaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIgaWNvbj0iaWNvbiIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgYWxsb3dzIGJpbmRpbmcgb2YgaWNvbnMgdG8gYWN0aXZpdGllcy4gIFRoZXNlIGljb25zIG1heSBiZSB1c2VkIGJ5IHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudHMgdGhhdCB3aXNoIHRvIHZpc3VhbGl6ZSBhY3Rpdml0aWVzIGluIHNvbWUgd2F5LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGFjdGl2aXR5IHRvIGJpbmQgYW4gaWNvbiB0bwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGljb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoaXMgYWN0aXZpdHkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBub24taW50ZXJhY3RpdmUgdHJpZ2dlciBwb2ludDoKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5hY3Rpdml0eVN1cHBvcnQmcXVvdDsmZ3Q7Ci0gICAgICZsdDt0cmlnZ2VyUG9pbnQKLSAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUueHl6Lm15VHJpZ2dlclBvaW50JnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7aGludCBpZD0mcXVvdDtpbnRlcmFjdGl2ZSZxdW90OyAKLSAgICAgICAgICAgICAgdmFsdWU9JnF1b3Q7ZmFsc2UmcXVvdDsgLyZndDsKLSAgICAgJmx0Oy90cmlnZ2VyUG9pbnQmZ3Q7Ci0gICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0KLVRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHRyaWdnZXIgcG9pbnQgYWR2aXNvciBib3VuZCB0byBhIHBhcnRpY3VsYXIgcHJvZHVjdDoKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5hY3Rpdml0eVN1cHBvcnQmcXVvdDsmZ3Q7Ci0gICAgICZsdDt0cmlnZ2VyUG9pbnRBZHZpc29yCi0gICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLnh5ei5teVRyaWdnZXJQb2ludEFkdmlzb3ImcXVvdDsgCi0gICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLnh5ei5BZHZpc29ySW1wbCZxdW90Oy8mZ3Q7Ci0gICAgICZsdDt0cmlnZ2VyUG9pbnRBZHZpc29yUHJvZHVjdEJpbmRpbmcgCi0gICAgICBwcm9kdWN0SWQ9JnF1b3Q7bXlQcm9kdWN0JnF1b3Q7Ci0gICAgICB0cmlnZ2VyUG9pbnRBZHZpc29ySWQ9JnF1b3Q7Y29tLmV4YW1wbGUueHl6Lm15VHJpZ2dlclBvaW50QWR2aXNvciZxdW90OyAvJmd0OwotICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotCi1UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYmluZGluZyBpbWFnZXMgdG8gYWN0aXZpdGllcyBhbmQgY2F0ZWdvcmllczoKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5hY3Rpdml0eVN1cHBvcnQmcXVvdDsmZ3Q7Ci0gIAkgJmx0O2FjdGl2aXR5SW1hZ2VCaW5kaW5nCi0gIAkgICAgaWQ9JnF1b3Q7c29tZS5hY3Rpdml0eS5pZCZxdW90OwotICAJICAgIGljb249JnF1b3Q7aWNvbnMvc29tZUljb24uZ2lmJnF1b3Q7LyZndDsgICAgCi0gIAkgJmx0O2NhdGVnb3J5SW1hZ2VCaW5kaW5nCi0gIAkgICAgaWQ9JnF1b3Q7c29tZS5jYXRlZ29yeS5pZCZxdW90OwotICAJICAgIGljb249JnF1b3Q7aWNvbnMvc29tZUljb24uZ2lmJnF1b3Q7LyZndDsKLSAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgdmFsdWUgb2YgdGhlICZsdDtjb2RlJmd0O2NsYXNzJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUgb2YgdGhlIHRyaWdnZXJQb2ludEFkdmlzb3IgdGFnIG11c3QgYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklUcmlnZ2VyUG9pbnRBZHZpc29yJmx0Oy9jb2RlJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHdvcmtiZW5jaCBpbXBsZW1lbnRhdGlvbiAoJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5Xb3JrYmVuY2hUcmlnZ2VyUG9pbnRBZHZpc29yJmx0Oy9jb2RlJmd0OykgaXMgYXZhaWxhYmxlIGZvciBjbGllbnRzIHRvIHN1YmNsYXNzIGFuZCByZXVzZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9iaW5kaW5ncy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYmluZGluZ3MuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwOGEwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9iaW5kaW5ncy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9ImJpbmRpbmdzIiBuYW1lPSJCaW5kaW5ncyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLVRoZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyZsdDsvY29kZSZndDsgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gZGVjbGFyZSBiaW5kaW5ncyBhbmQgc2NoZW1lcy4gIFNjaGVtZXMgYXJlIHNldHMgb2Ygb25lIG9yIG1vcmUgYmluZGluZ3MuICBBIGJpbmRpbmcgaXMgYSBtYXBwaW5nIGJldHdlZW4gYSBjZXJ0YWluIGdyb3VwIG9mIGNvbmRpdGlvbnMsIHNvbWUgdXNlciBpbnB1dCBhbmQgYSB0cmlnZ2VyZWQgY29tbWFuZC4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotQWxsIGJpbmRpbmdzIHJlcXVpcmUgYSB0cmlnZ2VyIG9mIHNvbWUga2luZCwgYSBjb250ZXh0IGluIHdoaWNoIHRoZXkgYXJlIGFjdGl2ZSBhbmQgc2NoZW1lIGluIHdoaWNoIHRoZXkgZXhpc3QuICBJZiB5b3UmYXBvcztyZSBub3Qgc3VyZSB3aGljaCBjb250ZXh0IHRvIGNob3NlLCB0aGVuIGp1c3QgbGVhdmUgaXQgYmxhbmsuICBJdCB3aWxsIGRlZmF1bHQgdG8gJmx0O2NvZGUmZ3Q7JnF1b3Q7b3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93JnF1b3Q7Jmx0Oy9jb2RlJmd0OyBjb250ZXh0LiAgVGhpcyBjb250ZXh0IG1lYW5zIHRoYXQgdGhlIGJpbmRpbmcgd2lsbCBhcHBseSBpbiBhbnkgRWNsaXBzZSBtYWluIHdpbmRvdy4gIFdoZW4gdGhlIGNvbnRleHQgYmVjb21lcyBhY3RpdmUsIHRoZSBiaW5kaW5nIHdpbGwgYmVjb21lIGFjdGl2ZSBhcyB3ZWxsLiAgQmluZGluZ3MgZnJvbSBjaGlsZCBjb250ZXh0cyB3aWxsIG92ZXJyaWRlIGJpbmRpbmdzIGZyb20gcGFyZW50IGNvbnRleHRzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udGV4dHMsIHBsZWFzZSBzZWUgdGhlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLmNvbnRleHRzJmx0Oy9jb2RlJmd0OyBleHRlbnNpb24gcG9pbnQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUlmIGEgYmluZGluZyBkb2VzIG5vdCBkZWZpbmUgYSBjb21tYW5kIGlkZW50aWZpZXIsIHRoZW4gaXQgaXMgYSBkZWxldGlvbiBtYXJrZXIuICBUaGlzIG1lYW5zIHRoYXQgaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBtZXQsIGl0IHdpbGwgY2FuY2VsIGFueSBiaW5kaW5ncyB3aXRoIHRoZSBzYW1lIHRyaWdnZXIgaW4gdGhlIHNhbWUgY29udGV4dC4gIFRoaXMgbWVjaGFuaXNtIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gY2hhbmdlIGEgYmluZGluZyBvbiBhIHBhcnRpY3VsYXIgcGxhdGZvcm0uCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLU9uZSB0eXBlIG9mIGJpbmRpbmcgaXMgYSAmbHQ7Y29kZSZndDtrZXkmbHQ7L2NvZGUmZ3Q7IGJpbmRpbmcgKGkuZS4sIGEga2V5Ym9hcmQgc2hvcnRjdXQpLiAgRm9yIGV4YW1wbGUsIGJpbmRpbmcgJmx0O2NvZGUmZ3Q7Q3RybCtDJmx0Oy9jb2RlJmd0OyB0byAmbHQ7Y29kZSZndDtDb3B5Jmx0Oy9jb2RlJmd0OyBpcyBjb25zaWRlcmVkIGEgJmx0O2NvZGUmZ3Q7a2V5Jmx0Oy9jb2RlJmd0OyBiaW5kaW5nLiAgVGhlIHRyaWdnZXIgZm9yIGEga2V5IGJpbmRpbmcgaXMgYSBzZXF1ZW5jZSBvZiBrZXkgc3Ryb2tlcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotQSBzY2hlbWUgaXMgYSBncm91cCBvZiB0aGVzZSBiaW5kaW5ncyBpbnRvIGEgc2V0IHRoYXQgdGhlIGVuZCB1c2VyIGNhbiBzZWxlY3QuICBGb3IgZXhhbXBsZSwgYSB1c2VyIG1pZ2h0IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IHNjaGVtZSwgYnV0IHRoZXkgbWlnaHQgYWxzbyB3YW50IGFuIEVtYWNzLXN0eWxlIHNjaGVtZSBvciBhIEJyaWVmLXN0eWxlIHNjaGVtZS4KLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2NoZW1lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImtleSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzY2hlbWUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgJmx0O3AmZ3Q7Ci1BIHNjaGVtZSBpcyBhIGdyb3VwaW5nIG9mIGJpbmRpbmdzIHRoYXQgYW4gZW5kIHVzZXIgY2FuIGNob3NlIHRvIHVzZS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotSXQgaXMgcG9zc2libGUgZm9yIHNjaGVtZXMgdG8gaW5oZXJpdCBiaW5kaW5ncyBmcm9tIGEgcGFyZW50IHNjaGVtZS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHBsdWctaW4gZGV2ZWxvcGVycyB0byBjcmVhdGUgY3VzdG9taXplZCBiaW5kaW5nIHNldHMuICBBbiBhY3RpdmUgYmluZGluZyBkZWZpbmVkIGluIGEgY2hpbGQgc2NoZW1lIHdpbGwgYWx3YXlzIG92ZXJyaWRlIGFuIGFjdGl2ZSBiaW5kaW5nIGluIGEgcGFyZW50IHNjaGVtZSwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHRyaWdnZXIuICBUaGlzIHRlY2huaXF1ZSBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIEVtYWNzIHNjaGVtZSBpbiB0aGUgd29ya2JlbmNoLgotJmx0Oy9wJmd0OwotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgc2NoZW1lLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgZm9yIHRoaXMgc2NoZW1lLCBhcyBpdCBzaG91bGQgYmUgZGlzcGxheWVkIHRvIGFuIGVuZC11c2VyLiAgVGhpcyB2YWx1ZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBzY2hlbWUsIGFzIGl0IHdvdWxkIGJlIGRpc3BsYXllZCB0byBhbiBlbmQgdXNlci4gIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnRJZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBmb3IgdGhlIHBhcmVudCBvZiB0aGlzIHNjaGVtZS4gIElmIHRoZXJlIGlzIG5vIHBhcmVudCwgdGhlbiBkbyBub3Qgc3BlY2lmeSB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ia2V5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjb21tYW5kSWQiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgJmx0O3AmZ3Q7QSBiaW5kaW5nIGJldHdlZW4gc29tZSBrZXlib2FyZCBpbnB1dCBhbmQgdGhlIHRyaWdnZXJpbmcgb2YgYSBjb21tYW5kLiZsdDsvcCZndDsKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNlcXVlbmNlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICZsdDtwJmd0OwotVGhlIGtleSBzZXF1ZW5jZSBmb3IgdGhpcyBiaW5kaW5nLiAgVGhpcyBrZXkgc2VxdWVuY2Ugc2hvdWxkIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUga2V5IHN0cm9rZXMuICBLZXkgc3Ryb2tlcyBhcmUgc2VwYXJhdGVkIGJ5IHNwYWNlcy4gIEtleSBzdHJva2VzIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUga2V5cyBoZWxkIGRvd24gYXQgdGhlIHNhbWUgdGltZS4gIFRoaXMgc2hvdWxkIGJlIHplcm8gb3IgbW9yZSBtb2RpZmllciBrZXlzLCBhbmQgb25lIG90aGVyIGtleS4gIFRoZSBrZXlzIGFyZSBzZXBhcmF0ZWQgYnkgdGhlICZsdDtjb2RlJmd0OysmbHQ7L2NvZGUmZ3Q7IGNoYXJhY3Rlci4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVGhlIHJlY29nbml6ZWQgbW9kaWZpZXJzIGtleXMgYXJlICZsdDtjb2RlJmd0O00xJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7TTImbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtNMyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O000Jmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7QUxUJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7Q09NTUFORCZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0NUUkwmbHQ7L2NvZGUmZ3Q7LCBhbmQgJmx0O2NvZGUmZ3Q7U0hJRlQmbHQ7L2NvZGUmZ3Q7LiAgVGhlICZxdW90O00mcXVvdDsgbW9kaWZpZXIga2V5cyBhcmUgYSBwbGF0Zm9ybS1pbmRlcGVuZGVudCB3YXkgb2YgcmVwcmVzZW50aW5nIGtleXMsIGFuZCB0aGVzZSBhcmUgZ2VuZXJhbGx5IHByZWZlcnJlZC4gICZsdDtjb2RlJmd0O00xJmx0Oy9jb2RlJmd0OyBpcyB0aGUgJmx0O2NvZGUmZ3Q7Q09NTUFORCZsdDsvY29kZSZndDsga2V5IG9uIE1hY09TIFgsIGFuZCB0aGUgJmx0O2NvZGUmZ3Q7Q1RSTCZsdDsvY29kZSZndDsga2V5IG9uIG1vc3Qgb3RoZXIgcGxhdGZvcm1zLiAgJmx0O2NvZGUmZ3Q7TTImbHQ7L2NvZGUmZ3Q7IGlzIHRoZSAmbHQ7Y29kZSZndDtTSElGVCZsdDsvY29kZSZndDsga2V5LiAgJmx0O2NvZGUmZ3Q7TTMmbHQ7L2NvZGUmZ3Q7IGlzIHRoZSAmbHQ7Y29kZSZndDtPcHRpb24mbHQ7L2NvZGUmZ3Q7IGtleSBvbiBNYWNPUyBYLCBhbmQgdGhlICZsdDtjb2RlJmd0O0FMVCZsdDsvY29kZSZndDsga2V5IG9uIG1vc3Qgb3RoZXIgcGxhdGZvcm1zLiAgJmx0O2NvZGUmZ3Q7TTQmbHQ7L2NvZGUmZ3Q7IGlzIHRoZSAmbHQ7Y29kZSZndDtDVFJMJmx0Oy9jb2RlJmd0OyBrZXkgb24gTWFjT1MgWCwgYW5kIGlzIHVuZGVmaW5lZCBvbiBvdGhlciBwbGF0Zm9ybXMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLVRoZSBhY3R1YWwga2V5IGlzIGdlbmVyYWxseSBzcGVjaWZpZWQgc2ltcGx5IGFzIHRoZSBBU0NJSSBjaGFyYWN0ZXIsIGluIHVwcGVyY2FzZS4gIFNvLCBmb3IgZXhhbXBsZSAmbHQ7Y29kZSZndDtGJmx0Oy9jb2RlJmd0OyBvciAmbHQ7Y29kZSZndDssJmx0Oy9jb2RlJmd0OyBhcmUgZXhhbXBsZXMgb2Ygc3VjaCBrZXlzLiAgSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgc3BlY2lhbCBrZXlzOyBrZXlzIHRoYXQgaGF2ZSBubyBwcmludGFibGUgQVNDSUkgcmVwcmVzZW50YXRpb24uICBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiB0aGUgY3VycmVudCBzcGVjaWFsIGtleXM6ICZsdDtjb2RlJmd0O0FSUk9XX0RPV04mbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtBUlJPV19MRUZUJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7QVJST1dfUklHSFQmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtBUlJPV19VUCZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0JSRUFLJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7QlMmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtDQVBTX0xPQ0smbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtDUiZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0RFTCZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0VORCZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0VTQyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0YxJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7RjImbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtGMyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0Y0Jmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7RjUmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtGNiZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0Y3Jmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7RjgmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtGOSZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0YxMCZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0YxMSZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0YxMiZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0YxMyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0YxNCZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0YxNSZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0ZGJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7SE9NRSZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0lOU0VSVCZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0xGJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7TlVMJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7TlVNX0xPQ0smbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtOVU1QQURfMCZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O05VTVBBRF8xJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7TlVNUEFEXzImbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtOVU1QQURfMyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O05VTVBBRF80Jmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7TlVNUEFEXzUmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtOVU1QQURfNiZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O05VTVBBRF83Jmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7TlVNUEFEXzgmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtOVU1QQURfOSZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O05VTVBBRF9BREQmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtOVU1QQURfREVDSU1BTCZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O05VTVBBRF9ESVZJREUmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtOVU1QQURfRU5URVImbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtOVU1QQURfRVFVQUwmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtOVU1QQURfTVVMVElQTFkmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtOVU1QQURfU1VCVFJBQ1QmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtQQUdFX1VQJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7UEFHRV9ET1dOJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7UEFVU0UmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtQUklOVF9TQ1JFRU4mbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtTQ1JPTExfTE9DSyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O1NQQUNFJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7VEFCJmx0Oy9jb2RlJmd0OyBhbmQgJmx0O2NvZGUmZ3Q7VlQmbHQ7L2NvZGUmZ3Q7LgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1XZSBhbHNvIHVuZGVyc3RhbmQgc29tZSBhbHRlcm5hdGl2ZSBuYW1lcyBmb3Igc29tZSBjb21tb24gc3BlY2lhbCBrZXlzLiAgRm9yIGV4YW1wbGUsIHdlIGFjY2VwdCBib3RoICZsdDtjb2RlJmd0O0VTQyZsdDsvY29kZSZndDsgYW5kICZsdDtjb2RlJmd0O0VTQ0FQRSZsdDsvY29kZSZndDssIGFuZCAmbHQ7Y29kZSZndDtDUiZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O0VOVEVSJmx0Oy9jb2RlJmd0OyBhbmQgJmx0O2NvZGUmZ3Q7UkVUVVJOJmx0Oy9jb2RlJmd0OyBhcmUgYWxsIHRoZSBzYW1lLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1JdCBpcyBhbHNvIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgeW91IGtlZXAgdGhlIGtleSBzZXF1ZW5jZXMgc2hvcnQuICBPbmUgb3IgdHdvIGlzIHRoZSBtb3N0IHlvdSBzaG91bGQgbmVlZC4gIFVzZSBjb250ZXh0cyB0byBnaXZlIGtleSBzZXF1ZW5jZXMgZGlmZmVyZW50IG1lYW5pbmdzIGluIGRpZmZlcmVudCBwYXJ0cyBvZiB5b3VyIGFwcGxpY2F0aW9uLiAgQXQgdGhlIHZlcnkgbW9zdCwgeW91IHNob3VsZCBub3QgdXNlIGFueSBrZXkgc2VxdWVuY2UgdGhhdCBjb250YWlucyBtb3JlIHRoYW4gZm91ciBrZXkgc3Ryb2tlcy4KLSZsdDsvcCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzY2hlbWVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2NoZW1lIGluIHdoaWNoIHRoaXMga2V5IGJpbmRpbmcgaXMgYWN0aXZlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRleHRJZCIgdHlwZT0ic3RyaW5nIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy53aW5kb3ciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoaXMga2V5IGJpbmRpbmcgaXMgYWN0aXZlLiAgUGxlYXNlIHNlZSB0aGUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkuY29udGV4dHMmbHQ7L2NvZGUmZ3Q7IGV4dGVuc2lvbiBwb2ludC4gIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBpdCBkZWZhdWx0cyB0byAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS5jb250ZXh0cy53aW5kb3cmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1hbmRJZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAmbHQ7cCZndDsKLVRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb21tYW5kIHdoaWNoIHNob3VsZCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgYmluZGluZyBpcyB0cmlnZ2VyZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUlmIG5vIGNvbW1hbmQgaWRlbnRpZmllciBpcyBzcGVjaWZpZWQsIHRoaXMgaXMgYSBkZWxldGlvbiBtYXJrZXIuICBUaGlzIG1lYW5zIHRoYXQgYW55IGJpbmRpbmcgaW4gdGhlIHNhbWUgY29udGV4dCB3aXRoIHRoZSBzYW1lIHNlcXVlbmNlLCBwbGF0Zm9ybSBhbmQgbG9jYWxlIHdpbGwgYmVjb21lIGluYWN0aXZlIHdoZW4gdGhpcyBiaW5kaW5nIGJlY29tZXMgYWN0aXZlLiAgSWYgdGhlIHBsYXRmb3JtIG9yIGxvY2FsZSBvbiBhIGRlbGV0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaXQgbWF0Y2hlcyBhbnkgcGxhdGZvcm0gb3IgbG9jYWxlLgotJmx0Oy9wJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBsYXRmb3JtIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwbGF0Zm9ybSBvbiB3aGljaCB0aGlzIGJpbmRpbmcgYXBwbGllcy4gIFRoZSBwbGF0Zm9ybSBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgc3RyaW5nIGZyb20gJmx0O2NvZGUmZ3Q7U1dULmdldFBsYXRmb3JtKCkmbHQ7L2NvZGUmZ3Q7LiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc3RyaW5ncyBhcmUgY29uc2lkZXJlZCB2YWxpZDogJmx0O2NvZGUmZ3Q7d2luMzImbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtndGsmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDttb3RpZiZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O2NhcmJvbiZsdDsvY29kZSZndDsgYW5kICZsdDtjb2RlJmd0O3Bob3RvbiZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYWxlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBsb2NhbGUgb24gd2hpY2ggdGhpcyBiaW5kaW5ncyBhcHBsaWVzLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNoYW5naW5nIGJpbmRpbmdzIHRoYXQgY29uZmxpY3Qgd2l0aCBsb2NhbGUtc3BlY2lmaWMgaW5wdXQgbWV0aG9kIGVkaXRvcnMgKElNRXMpLiAgVGhlIGxvY2FsZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHNhbWUgd2F5IGFzICZsdDtjb2RlJmd0O0xvY2FsZS50b1N0cmluZygpJmx0Oy9jb2RlJmd0Oy4gIEZvciBleGFtcGxlLCAmbHQ7Y29kZSZndDsmcXVvdDtlbiZxdW90OyZsdDsvY29kZSZndDsgb3IgJmx0O2NvZGUmZ3Q7JnF1b3Q7ZW5fQ0EmcXVvdDsmbHQ7L2NvZGUmZ3Q7IGFyZSBib3RoIHVuZGVyc3Rvb2QuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InBhcmFtZXRlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBwYXJhbWV0ZXIgbmFtZSBhbmQgdmFsdWUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kIHdoZW4gaXQgaXMgZXhlY3V0ZWQuICBUaGlzIGFsbG93cyBmb3IgdGhlIGNvbW1hbmQgdG8gYmUgcXVhbGlmaWVkIGluIHNvbWUgd2F5LiAgRm9yIGV4YW1wbGUsIGEgJnF1b3Q7U2hvdyBWaWV3JnF1b3Q7IGNvbW1hbmQgbWlnaHQgYWNjZXB0IHRoZSB2aWV3IGlkIGFzIGEgcGFyYW1ldGVyLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcGFyYW1ldGVyIG5hbWUgYXMgdW5kZXJzdG9vZCBieSB0aGUgY29tbWFuZC4gIFRoaXMgaXMgbm90IGEgdHJhbnNsYXRhYmxlIG5hbWUsIGJ1dCB0aGUga2V5IHRvIG5hbWUtdmFsdWUgbWFwLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlci4gIFRoaXMgdmFsdWUgaXMgYSBmcmVlLWZvcm0gc3RyaW5nLCBidXQgaXQgc2hvdWxkIGJlIHBhcnNlYWJsZSBieSB0aGUgY29tbWFuZC4gIENvbnN1bHQgdGhlIGNvbW1hbmQgdG8gc2VlIHdoYXQgZm9ybWF0IGl0IGV4cGVjdHMgdGhlc2UgdmFsdWVzIHRvIHRha2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbgotIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmJpbmRpbmdzJnF1b3Q7Jmd0OwotICZsdDtrZXkKLSAgc2VxdWVuY2U9JnF1b3Q7TTIrRjUmcXVvdDsKLSAgY29tbWFuZElkPSZxdW90O2NvbW1hbmRJZCZxdW90OwotICBzY2hlbWVJZD0mcXVvdDtkZWZhdWx0JnF1b3Q7Ci0gIGNvbnRleHRJZD0mcXVvdDt3aW5kb3dzJnF1b3Q7IC8mZ3Q7Ci0gJmx0O3NjaGVtZQotICBuYW1lPSZxdW90O0RlZmF1bHQmcXVvdDsKLSAgZGVzY3JpcHRpb249JnF1b3Q7RGVmYXVsdCBzaG9ydGN1dHMgZm9yIEVjbGlwc2UmcXVvdDsKLSAgaWQ9JnF1b3Q7ZGVmYXVsdCZxdW90OyAvJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLVRoZXJlIGlzIG5vIHB1YmxpYyBBUEkgZm9yIGRlZmluaW5nIGJpbmRpbmdzLiAgVG8gdHJ5IHRvIGFjaGlldmUgc3RhYmlsaXR5IGZvciB0aGUgdXNlciwgYmluZGluZ3MgYXJlIG9ubHkgZGVmaW5lZCB0aHJvdWdoIHRoZSBleHRlbnNpb24gcG9pbnRzLiAgSWYgeW91IGFyZSBhbiBSQ1AgYXBwbGljYXRpb24sIHlvdSBzaG91bGQgYmUgYWJsZSB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW91ciBpbiB0aGUgJmx0O2NvZGUmZ3Q7V29ya2JlbmNoQWR2aXNvciZsdDsvY29kZSZndDsuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUZvciBiaW5kaW5ncyB0byB3b3JrLCB5b3UgbXVzdCBoYXZlIGRlZmluZWQgYSAmbHQ7YSBocmVmPSZxdW90O29yZ19lY2xpcHNlX3VpX2NvbW1hbmRzLmh0bWwmcXVvdDsmZ3Q7Y29tbWFuZCZsdDsvYSZndDsuICBGb3IgdGhlIGJpbmRpbmcgdG8gd29yaywgdGhlIGNvbW1hbmQgbXVzdCBoYXZlIGFuIGFjdGl2ZSAmbHQ7YSBocmVmPSZxdW90O29yZ19lY2xpcHNlX3VpX2JpbmRpbmdzLmh0bWwmcXVvdDsmZ3Q7aGFuZGxlciZsdDsvYSZndDsuICBIYW5kbGVycyBjYW4gYmUgcmVnaXN0ZXJlZCBwcm9ncmFtbWF0aWNhbGx5OyBwbGVhc2Ugc2VlIHRoZSAmbHQ7YSBocmVmPSZxdW90O29yZ19lY2xpcHNlX3VpX2JpbmRpbmdzLmh0bWwmcXVvdDsmZ3Q7b3JnLmVjbGlwc2UudWkuaGFuZGxlcnMmbHQ7L2EmZ3Q7IGV4dGVuc2lvbiBwb2ludC4KLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYnJvd3NlclN1cHBvcnQuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2Jyb3dzZXJTdXBwb3J0LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTk0MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvYnJvd3NlclN1cHBvcnQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJicm93c2VyU3VwcG9ydCIgbmFtZT0iQnJvd3NlciBTdXBwb3J0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gY29udHJpYnV0ZSB3b3JrYmVuY2ggYnJvd3NlciBzdXBwb3J0LiBUaGUgc3VwcG9ydCBpcyByZXNwb25zaWJsZSBmb3Igb3BlbmluZyBVUkxzIGZvciBhbGwgdGhlIEVjbGlwc2UgcGx1Zy1pbnMuIFdvcmtiZW5jaCBwcm92aWRlcyBhIHZlcnkgcnVkaW1lbnRhcnkgaW1wbGVtZW50YXRpb24gd2l0aCBhIG1vcmUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIGFzIGFuIG9wdGlvbmFsIFJDUCBwbHVnLWluLgotJmx0O3AmZ3Q7Ci1Db250cmlidXRpb25zIHRoYXQgYXJlIG1lYW50IHRvIGJlIHNoaXBwZWQgd2l0aCB0aGUgcHJvZHVjdCBhcyB0aGUgc3RhbmRhcmQgc3VwcG9ydCBzaG91bGQgYmUgbWFya2VkIGFzICZsdDtjb2RlJmd0O2RlZmF1bHQmbHQ7L2NvZGUmZ3Q7LiBUaGlzIHdheSwgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIHN1cHBvcnQgd2l0aCBhbm90aGVyIGNvbnRyaWJ1dGlvbiB0aGF0IGlzIG5vdCBtYXJrZWQgYXMgJmx0O2NvZGUmZ3Q7ZGVmYXVsdCZsdDsvY29kZSZndDsuIE5vdGUgaG93ZXZlciB0aGF0IG9ubHkgb25lIHN1cHBvcnQgY2FuIGJlIGFjdGl2ZSBhdCBhbnkgcG9pbnQgaW4gdGltZS4gSW4gY2FzZSBvZiBtdWx0aXBsZSBkZWZhdWx0IGFuZC9vciBub24tZGVmYXVsdCBjb250cmlidXRpb25zLCB0aGUgcmVzdWx0IGlzIG5vbi1kZXRlcm1pbmlzdGljLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzdXBwb3J0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdXBwb3J0Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHByb3ZpZGluZyB0aGUgYnJvd3NlciBzdXBwb3J0IGZvciB0aGUgd29ya2JlbmNoLiBUaGlzIGNsYXNzIHNob3VsZCBleHRlbmQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkuYnJvd3Nlci5BYnN0cmFjdFdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0Jmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuQWJzdHJhY3RXb3JrYmVuY2hCcm93c2VyU3VwcG9ydCIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9ImJvb2xlYW4iIHVzZT0iZGVmYXVsdCIgdmFsdWU9ImZhbHNlIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIHN1cHBvcnQgaXMgdGhlIGRlZmF1bHQuIEJyb3dzZXIgc3VwcG9ydCBzaG91bGQgYmUgbWFya2VkIGFzIGRlZmF1bHQgaWYgaXQgaXMgbm9ybWFsbHkgc2hpcHBlZCB3aXRoIHRoZSBwcm9kdWN0IGFzIHRoZSBzdGFuZGFyZCBicm93c2VyIHN1cHBvcnQuIEJyb3dzZXIgc3VwcG9ydHMgdGhhdCBuZWVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHN1cHBvcnQgc2hvdWxkIGhhdmUgdGhpcyBmbGFnIHNldCB0byAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZndDsuIFdoZW4gd29ya2JlbmNoIGVuY291bnRlcnMgdHdvIGV4dGVuc2lvbnMsIGl0IHdpbGwgcGljayBhIG5vbi1kZWZhdWx0IG92ZXIgYSBkZWZhdWx0IG9uZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4xCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIGJyb3dzZXIgc3VwcG9ydCBjb250cmlidXRpb246Ci0KLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmJyb3dzZXJTdXBwb3J0JnF1b3Q7Jmd0OwotICAgICAgJmx0O3N1cHBvcnQKLSAgICAgICAgICBkZWZhdWx0PSZxdW90O3RydWUmcXVvdDsKLSAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS54eXouTXlCcm93c2VyU3VwcG9ydCZxdW90OyZndDsKLSAgICAgICZsdDsvc3VwcG9ydCZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGNvbnRyaWJ1dG9ycyBhcmUgZXhwZWN0ZWQgdG8gcHJvdmlkZSBhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS5icm93c2VyLkFic3RyYWN0V29ya2JlbmNoQnJvd3NlclN1cHBvcnQmbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgd29ya2JlbmNoIHByb3ZpZGVzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBicm93c2VyIHN1cHBvcnQgdGhhdCBpcyB1c2VkIHdoZW4gbm8gY29udHJpYnV0aW9ucyBhcmUgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2NvbW1hbmRJbWFnZXMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2NvbW1hbmRJbWFnZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczNDdhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9jb21tYW5kSW1hZ2VzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0iY29tbWFuZEltYWdlcyIgbmFtZT0iQ29tbWFuZCBJbWFnZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGltYWdlcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgb2YgbGlua2luZyBkaWZmZXJlbnQgdHlwZXMgb2YgaW1hZ2VzIGFuZCBpY29ucyB0byBhIHBhcnRpY3VsYXIgY29tbWFuZC4gIFRoZXNlIGltYWdlcyBjYW4gYmUgdXNlZCwgYXMgYXBwcm9wcmlhdGUsIHdoZXJldmVyIHRoZSBjb21tYW5kIGFwcGVhcnMgaW4gdGhlIHVzZXIgaW50ZXJmYWNlLiAgVG8gYWNjb21tb2RhdGUgc29tZSBib3VuZGFyeSBjYXNlcyAoZS5nLiwgdG9vbCBiYXIgZHJvcC1kb3duIGl0ZW1zKSwgaXQgaXMgcG9zc2libGUgdG8gZ3JvdXAgdGhlIGltYWdlcyBmb3IgYSBwYXJ0aWN1bGFyIGNvbW1hbmRzIGludG8gJnF1b3Q7c3R5bGVzJnF1b3Q7LiAgVGhlc2Ugc3R5bGVzIGNhbiB0aGVuIGJlIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQgd2hlbiBhIGNvbW1hbmQgaXMgdG8gYmUgZGlzcGxheWVkLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbWFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpbWFnZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iY29tbWFuZElkIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBpbWFnZXMgdG8gYXNzb2NpYXRlIHdpdGggYSBwYXJ0aWN1bGFyIGNvbW1hbmQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1hbmRJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29tbWFuZCB3aXRoIHdoaWNoIHRoZSBpbWFnZXMgc2hvdWxkIGJlIGFzc29jaWF0ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcGF0aCB0byB0aGUgaWNvbiB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgZGVmYXVsdCBjYXNlLiAgVGhpcyB3aWxsIGFwcGVhciB3aGVuIHRoZSBpY29uIGlzIGVuYWJsZWQgYW5kIG1vdXNlIGlzIG5vdCBob3ZlcmluZyBvdmVyIGl0LiAgSXQgd2lsbCBhbHNvIGJlIHVzZWQgaW4gYW55IHNpdHVhdGlvbiB3aGVyZSBzdWNoIGEgbW9yZSBzcGVjaWZpYyBpY29uIGlzIG5vdCBhdmFpbGFibGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpc2FibGVkSWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWNvbiB0byBkaXNwbGF5IHdoZW4gdGhlIGNvbW1hbmQgaXMgZGlzYWJsZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhvdmVySWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWNvbiB0byBkaXNwbGF5IHdoZW4gdGhlIHVzZXIgaXMgaG92ZXJpbmcgb3ZlciB0aGUgY29tbWFuZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHBhcnRpY3VsYXIgc2NlbmFyaW8gaW4gd2hpY2ggdGhpcyBibG9jayBvZiBpY29ucyBhcHBseS4gIEZvciBleGFtcGxlLCBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGhhdmUgZGlmZmVyZW50IGljb25zIHdoZW4gdGhlIGNvbW1hbmQgaXMgZGlzcGxheWVkIGFzIGEgdG9vbGJhciBkcm9wLWRvd24gaXRlbS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uCi0gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuY29tbWFuZHNJbWFnZXMmcXVvdDsmZ3Q7Ci0gJmx0O2ltYWdlCi0gIGNvbW1hbmRJZD0mcXVvdDtQcm9maWxlTGFzdCZxdW90OwotICBob3Zlckljb249JnF1b3Q7aWNvbnMvZnVsbC9ldG9vbDE2L3Byb2ZpbGUuZ2lmJnF1b3Q7Ci0gIGRpc2FibGVkSWNvbj0mcXVvdDtpY29ucy9mdWxsL2R0b29sMTYvcHJvZmlsZS5naWYmcXVvdDsKLSAgaWNvbj0mcXVvdDtpY29ucy9mdWxsL2V0b29sMTYvcHJvZmlsZS5naWYmcXVvdDsgLyZndDsKLSAmbHQ7aW1hZ2UKLSAgY29tbWFuZElkPSZxdW90O1Byb2ZpbGVMYXN0JnF1b3Q7Ci0gIGhvdmVySWNvbj0mcXVvdDtpY29ucy9mdWxsL2V0b29sMTYvaGlzdG9yeS5naWYmcXVvdDsKLSAgZGlzYWJsZWRJY29uPSZxdW90O2ljb25zL2Z1bGwvZHRvb2wxNi9oaXN0b3J5LmdpZiZxdW90OwotICBpY29uPSZxdW90O2ljb25zL2Z1bGwvZXRvb2wxNi9oaXN0b3J5LmdpZiZxdW90OwotICBpbWFnZVN0eWxlPSZxdW90O3Rvb2xiYXImcXVvdDsgLyZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci1XaXRoaW4gdGhlIHdvcmtiZW5jaCwgaXQgaXMgcG9zc2libGUgdG8gZ2V0IGltYWdlcyBmb3IgY29tbWFuZHMgdXNpbmcgdGhlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLklDb21tYW5kSW1hZ2VTZXJ2aWNlJmx0Oy9jb2RlJmd0OyBpbnRlcmZhY2UuICBUaGlzIGludGVyZmFjZSBjYW4gYmUgcmV0cmlldmVkIGZyb20gc3VwcG9ydGluZyB3b3JrYmVuY2ggb2JqZWN0cywgc3VjaCBhcyAmbHQ7Y29kZSZndDtJV29ya2JlbmNoJmx0Oy9jb2RlJmd0OyBpdHNlbGYuICBUbyByZXRyaWV2ZSB0aGUgc2VydmljZSwgeW91IHdvdWxkIG1ha2UgYSBjYWxsIGxpa2UgJmx0O2NvZGUmZ3Q7SVdvcmtiZW5jaC5nZXRBZGFwdGVyKElDb21tYW5kSW1hZ2VTZXJ2aWNlLmNsYXNzKSZsdDsvY29kZSZndDsuCi0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2NvbW1hbmRzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9jb21tYW5kcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAyM2Y3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2NvbW1hbmRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw3NzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0iY29tbWFuZHMiIG5hbWU9IkNvbW1hbmRzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0OwotVGhlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLmNvbW1hbmRzJmx0Oy9jb2RlJmd0OyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBkZWNsYXJlIGNvbW1hbmRzIGFuZCBjb21tYW5kIGNhdGVnb3JpZXMsIHVzaW5nIHRoZSAmbHQ7Y29kZSZndDtjb21tYW5kJmx0Oy9jb2RlJmd0OyBhbmQgJmx0O2NvZGUmZ3Q7Y2F0ZWdvcnkmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnRzLiBBIGNvbW1hbmQgaXMgYW4gYWJzdHJhY3QgcmVwcmVzZW50YXRpb24gb2Ygc29tZSBzZW1hbnRpYyBiZWhhdmlvdXIsIGJ1dCBub3QgaXQmYXBvcztzIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgYWxsb3dzIGRpZmZlcmVudCBkZXZlbG9wZXJzIHRvIGNvbnRyaWJ1dGUgc3BlY2lmaWMgYmVoYXZpb3VyIGZvciB0aGVpciBpbmRpdmlkdWFsIHBhcnRzLiAgRm9yIGV4YW1wbGUsIHRoZXJlIG1pZ2h0IGJlIGEgJnF1b3Q7cGFzdGUmcXVvdDsgY29tbWFuZCB3aXRoIG9uZSBpbXBsZW1lbnRhdGlvbiBpbiBhbiBlZGl0b3IgYW5kIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGluIGFuIGV4cGxvcmVyIHdpZGdldC4gIFRoZXNlIGltcGxlbWVudGF0aW9ucyBhcmUgY2FsbGVkIGhhbmRsZXJzLgotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY3RpdmVLZXlDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYXRlZ29yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb21tYW5kIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbW1hbmRQYXJhbWV0ZXJUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImtleUJpbmRpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ia2V5Q29uZmlndXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250ZXh0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNjb3BlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhY3RpdmVLZXlDb25maWd1cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgJmx0O3AmZ3Q7Ci1UaGlzIGVsZW1lbnQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGluaXRpYWwgYWN0aXZlIGtleSBjb25maWd1cmF0aW9uIGZvciBFY2xpcHNlLiBJZiBtb3JlIHRoYW4gb25lIG9mIHRoZXNlIGVsZW1lbnRzIGV4aXN0LCBvbmx5IHRoZSBsYXN0IGRlY2xhcmVkIGVsZW1lbnQgKGluIG9yZGVyIG9mIHJlYWRpbmcgdGhlIHBsdWdpbiByZWdpc3RyeSkgaXMgY29uc2lkZXJlZCB2YWxpZC4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVGhpcyBlbGVtZW50IGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBwcmVmZXJlbmNlLiAgSWYgeW91ciBhcHBsaWNhdGlvbiBuZWVkcyB0byBjaGFuZ2UgdGhlIGRlZmF1bHQga2V5IGNvbmZpZ3VyYXRpb24sIHRoZW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIGluIHlvdXIgJmx0O2NvZGUmZ3Q7cGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pJmx0Oy9jb2RlJmd0OyBmaWxlOiAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS9LRVlfQ09ORklHVVJBVElPTl9JRD15b3VyLmRlZmF1bHQua2V5LmNvbmZpZ3VyYXRpb24uaWQmbHQ7L2NvZGUmZ3Q7LgotJmx0Oy9wJmd0OwotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkICgmbHQ7Y29kZSZndDtpZCZsdDsvY29kZSZndDthdHRyaWJ1dGUpIG9mIHRoZSBrZXlDb25maWd1cmF0aW9uIGVsZW1lbnQgb25lIHdpc2hlcyB0byBiZSBpbml0aWFsbHkgYWN0aXZlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImtleUNvbmZpZ3VyYXRpb25JZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkICgmbHQ7Y29kZSZndDtpZCZsdDsvY29kZSZndDthdHRyaWJ1dGUpIG9mIHRoZSBrZXlDb25maWd1cmF0aW9uIGVsZW1lbnQgb25lIHdpc2hlcyB0byBiZSBpbml0aWFsbHkgYWN0aXZlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRlZ29yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgSW4gdGhlIFVJLCBjb21tYW5kcyBhcmUgb2Z0ZW4gb3JnYW5pemVkIGJ5IGNhdGVnb3J5IHRvIG1ha2UgdGhlbSBtb3JlIG1hbmFnZWFibGUuIFRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIGRlZmluZSB0aGVzZSBjYXRlZ29yaWVzLiBDb21tYW5kcyBjYW4gYWRkIHRoZW1zZWx2ZXMgdG8gYXQgbW9zdCBvbmUgY2F0ZWdvcnkuIElmIG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UgZWxlbWVudHMgZXhpc3Qgd2l0aCB0aGUgc2FtZSAmbHQ7Y29kZSZndDtpZCZsdDsvY29kZSZndDsgYXR0cmlidXRlLCBvbmx5IHRoZSBsYXN0IGRlY2xhcmVkIGVsZW1lbnQgKGluIG9yZGVyIG9mIHJlYWRpbmcgdGhlIHBsdWdpbiByZWdpc3RyeSkgaXMgY29uc2lkZXJlZCB2YWxpZC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB0cmFuc2xhdGFibGUgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhpcyBjYXRlZ29yeSBmb3IgZGlzcGxheSBpbiB0aGUgVUkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBjYXRlZ29yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0cmFuc2xhdGFibGUgbmFtZSBvZiB0aGlzIGNhdGVnb3J5IGZvciBkaXNwbGF5IGluIHRoZSBVSS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb21tYW5kIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCB0byBkZWZpbmUgY29tbWFuZHMuIEEgY29tbWFuZCByZXByZXNlbnRzIGFuIHJlcXVlc3QgZnJvbSB0aGUgdXNlciB0aGF0IGNhbiBiZSBoYW5kbGVkIGJ5IGFuIGFjdGlvbiwgYW5kIHNob3VsZCBiZSBzZW1hbnRpY2FsbHkgdW5pcXVlIGFtb25nIG90aGVyIGNvbW1hbmRzLiBEbyBub3QgZGVmaW5lIGEgY29tbWFuZCBpZiB0aGVyZSBpcyBhbHJlYWR5IG9uZSBkZWZpbmVkIHdpdGggdGhlIHNhbWUgbWVhbmluZy4gSWYgbW9yZSB0aGFuIG9uZSBvZiB0aGVzZSBlbGVtZW50cyBleGlzdCB3aXRoIHRoZSBzYW1lICZsdDtjb2RlJmd0O2lkJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUsIG9ubHkgdGhlIGxhc3QgZGVjbGFyZWQgZWxlbWVudCAoaW4gb3JkZXIgb2YgcmVhZGluZyB0aGUgcGx1Z2luIHJlZ2lzdHJ5KSBpcyBjb25zaWRlcmVkIHZhbGlkLiBTZWUgdGhlIGV4dGVuc2lvbiBwb2ludHMgJmx0O2EgaHJlZj0mcXVvdDtvcmdfZWNsaXBzZV91aV9hY3Rpb25TZXRzLmh0bWwmcXVvdDsmZ3Q7b3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyZsdDsvYSZndDsgYW5kICZsdDthIGhyZWY9JnF1b3Q7b3JnX2VjbGlwc2VfdWlfZWRpdG9yQWN0aW9ucy5odG1sJnF1b3Q7Jmd0O29yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMmbHQ7L2EmZ3Q7IHRvIHVuZGVyc3RhbmQgaG93IGFjdGlvbnMgYXJlIGNvbm5lY3RlZCB0byBjb21tYW5kcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVmYXVsdEhhbmRsZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0YXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbW1hbmRQYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhlIGNhdGVnb3J5IGZvciB0aGlzIGNvbW1hbmQuIElmIHRoaXMgY29tbWFuZCBkb2VzIG5vdCBzcGVjaWZ5IGEgY2F0ZWdvcnksIGl0IHdpbGwgc3RpbGwgYXBwZWFyIGluIGFsbCBVSSwgYWxvbmdzaWRlIG90aGVyIHNwZWNpZmljYWxseSBjYXRlZ29yaXplZCBjb21tYW5kcy4KLUBkZXByZWNhdGVkIFBsZWFzZSB1c2UgJnF1b3Q7Y2F0ZWdvcnlJZCZxdW90OyBpbnN0ZWFkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdHJhbnNsYXRhYmxlIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoaXMgY29tbWFuZCBmb3IgZGlzcGxheSBpbiB0aGUgVUkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBjb21tYW5kLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHRyYW5zbGF0YWJsZSBuYW1lIG9mIHRoaXMgY29tbWFuZCBmb3IgZGlzcGxheSBpbiB0aGUgVUkuIENvbW1hbmQgYXJlIHR5cGljYWxseSBuYW1lZCBpbiB0aGUgZm9ybSBvZiBhbiBpbXBlcmF0aXZlIHZlcmIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXRlZ29yeUlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhlIGNhdGVnb3J5IGZvciB0aGlzIGNvbW1hbmQuIElmIHRoaXMgY29tbWFuZCBkb2VzIG5vdCBzcGVjaWZ5IGEgY2F0ZWdvcnksIGl0IHdpbGwgc3RpbGwgYXBwZWFyIGluIGFsbCBVSSwgYWxvbmdzaWRlIG90aGVyIHNwZWNpZmljYWxseSBjYXRlZ29yaXplZCBjb21tYW5kcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0SGFuZGxlciIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciB0aGlzIGNvbW1hbmQgKHNlZSB0aGUgJmx0O2EgaHJlZj0mcXVvdDtvcmdfZWNsaXBzZV91aV9iaW5kaW5ncy5odG1sJnF1b3Q7Jmd0O29yZy5lY2xpcHNlLnVpLmJpbmRpbmdzJmx0Oy9hJmd0OyBleHRlbnNpb24gcG9pbnQpLiAgSWYgbm8gb3RoZXIgaGFuZGxlciBpcyBhY3RpdmUsIHRoaXMgaGFuZGxlciB3aWxsIGJlIGFjdGl2ZS4gIFRoaXMgaGFuZGxlciB3aWxsIGNvbmZsaWN0IHdpdGggb3RoZXIgaGFuZGxlciBkZWZpbml0aW9ucyB0aGF0IHNwZWNpZnkgbm8gJmx0O2NvZGUmZ3Q7YWN0aXZlV2hlbiZsdDsvY29kZSZndDsgY29uZGl0aW9ucy4gIElmIHlvdSBhcmUgY3JlYXRpbmcgYW4gJmx0O2NvZGUmZ3Q7SUV4ZWN1dGFibGVFeHRlbnNpb24mbHQ7L2NvZGUmZ3Q7LCB5b3UgY2FuIHVzZSB0aGUgJmx0O2NvZGUmZ3Q7ZGVmYXVsdEhhbmRsZXImbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQgaW5zdGVhZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ia2V5QmluZGluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBhbGxvd3Mgb25lIHRvIGFzc2lnbiBrZXkgc2VxdWVuY2VzIHRvIGNvbW1hbmRzLiAgUGxlYXNlIHVzZSB0aGUgJmx0O2NvZGUmZ3Q7a2V5Jmx0Oy9jb2RlJmd0OyBlbGVtZW50IGluIHRoZSAmcXVvdDtvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyZxdW90OyBleHRlbnNpb24gcG9pbnQgaW5zdGVhZC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29uZmlndXJhdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoZSBrZXkgY29uZmlndXJhdGlvbiBvZiB0aGlzIGtleSBiaW5kaW5nLgotQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBrZXlDb25maWd1cmF0aW9uSWQgaW5zdGVhZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tYW5kIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29tbWFuZCB0byB3aGljaCB0aGUga2V5IHNlcXVlbmNlIHNwZWNpZmllZCBieSB0aGlzIGtleSBiaW5kaW5nIGlzIGFzc2lnbmVkLiBJZiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgYW4gZW1wdHkgc3RyaW5nLCB0aGUga2V5IHNlcXVlbmNlIGlzIGFzc2lnbmVkIHRvIGFuIGludGVybmFsICZhcG9zO25vIG9wZXJhdGlvbiZhcG9zOyBjb21tYW5kLiBUaGlzIGlzIHVzZWZ1bCBmb3IgJmFwb3M7dW5kZWZpbmluZyZhcG9zOyBrZXkgYmluZGluZ3MgaW4gc3BlY2lmaWMga2V5IGNvbmZpZ3VyYXRpb25zIGFuZCBjb250ZXh0cyB3aGljaCBtYXkgaGF2ZSBiZWVuIGJvcnJvd2VkIGZyb20gdGhlaXIgcGFyZW50cy4KLUBkZXByZWNhdGVkIFBsZWFzZSB1c2UgJnF1b3Q7Y29tbWFuZElkJnF1b3Q7IGluc3RlYWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYWxlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBrZXkgYmluZGluZyBpcyBvbmx5IGRlZmluZWQgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYWxlLiBMb2NhbGVzIGFyZSBzcGVjaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgZGVjbGFyZWQgaW4gJmx0O2NvZGUmZ3Q7amF2YS51dGlsLkxvY2FsZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGxhdGZvcm0iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRpbmcgdGhhdCB0aGlzIGtleSBiaW5kaW5nIGlzIG9ubHkgZGVmaW5lZCBmb3IgdGhlIHNwZWNpZmllZCBwbGF0Zm9ybS4gVGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgJmx0O2NvZGUmZ3Q7cGxhdGZvcm0mbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSBhcmUgdGhlIHNldCBvZiB0aGUgcG9zc2libGUgdmFsdWVzIHJldHVybmVkIGJ5ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnN3dC5TV1QuZ2V0UGxhdGZvcm0oKSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGV4dElkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhlIGNvbnRleHQgb2YgdGhpcyBrZXkgYmluZGluZy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHJpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGtleSBzZXF1ZW5jZSB0byBhc3NpZ24gdG8gdGhlIGNvbW1hbmQuIEtleSBzZXF1ZW5jZXMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSBrZXkgc3Ryb2tlcywgd2hlcmUgYSBrZXkgc3Ryb2tlIGNvbnNpc3RzIG9mIGEga2V5IG9uIHRoZSBrZXlib2FyZCwgb3B0aW9uYWxseSBwcmVzc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBtb2RpZmllcnM6IEN0cmwsIEFsdCwgU2hpZnQsIGFuZCBDb21tYW5kLiBLZXkgc3Ryb2tlcyBhcmUgc2VwYXJhdGVkIGJ5IHNwYWNlcywgYW5kIG1vZGlmaWVycyBhcmUgc2VwYXJhdGVkIGJ5ICZhcG9zOysmYXBvczsgY2hhcmFjdGVycy4KLUBkZXByZWNhdGVkIFBsZWFzZSB1c2UgJnF1b3Q7a2V5U2VxdWVuY2UmcXVvdDsgaW5zdGVhZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzY29wZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoZSBjb250ZXh0IG9mIHRoaXMga2V5IGJpbmRpbmcuCi1AZGVwcmVjYXRlZCBQbGVhc2UgdXNlICZxdW90O2NvbnRleHRJZCZxdW90OyBpbnN0ZWFkLiAgVGhlIG9sZCBkZWZhdWx0IHNjb3BlLCAmcXVvdDtvcmcuZWNsaXBzZS51aS5nbG9iYWxTY29wZSZxdW90OywgaGFzIGJlZW4gY2hhbmdlZCB0byAmcXVvdDtvcmcuZWNsaXBzZS51aS5jb250ZXh0cy53aW5kb3cmcXVvdDsuICBUaGUgb2xkIG5hbWUgaXMgc3RpbGwgc3VwcG9ydGVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXlDb25maWd1cmF0aW9uSWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUga2V5IGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBrZXkgYmluZGluZy4KLUBkZXByZWNhdGVkIFBsZWFzZSB1c2UgdGhlICZsdDtjb2RlJmd0O3NjaGVtZUlkJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUgb24gdGhlICZsdDtjb2RlJmd0O2tleSZsdDsvY29kZSZndDsgZWxlbWVudCBpbiB0aGUgbmV3ICZxdW90O29yZy5lY2xpcHNlLnVpLmJpbmRpbmdzJnF1b3Q7IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tYW5kSWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb21tYW5kIHRvIHdoaWNoIHRoZSBrZXkgc2VxdWVuY2Ugc3BlY2lmaWVkIGJ5IHRoaXMga2V5IGJpbmRpbmcgaXMgYXNzaWduZWQuIElmIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSBrZXkgc2VxdWVuY2UgaXMgYXNzaWduZWQgdG8gYW4gaW50ZXJuYWwgJmFwb3M7bm8gb3BlcmF0aW9uJmFwb3M7IGNvbW1hbmQuIFRoaXMgaXMgdXNlZnVsIGZvciAmYXBvczt1bmRlZmluaW5nJmFwb3M7IGtleSBiaW5kaW5ncyBpbiBzcGVjaWZpYyBrZXkgY29uZmlndXJhdGlvbnMgYW5kIGNvbnRleHRzIHdoaWNoIG1heSBoYXZlIGJlZW4gYm9ycm93ZWQgZnJvbSB0aGVpciBwYXJlbnRzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImtleVNlcXVlbmNlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICZsdDtwJmd0O1RoZSBrZXkgc2VxdWVuY2UgdG8gYXNzaWduIHRvIHRoZSBjb21tYW5kLiBLZXkgc2VxdWVuY2VzIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUga2V5IHN0cm9rZXMsIHdoZXJlIGEga2V5IHN0cm9rZSBjb25zaXN0cyBvZiBhIGtleSBvbiB0aGUga2V5Ym9hcmQsIG9wdGlvbmFsbHkgcHJlc3NlZCBpbiBjb21iaW5hdGlvbiB3aXRoIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgbW9kaWZpZXJzOiBDdHJsLCBBbHQsIFNoaWZ0LCBhbmQgQ29tbWFuZC4gS2V5IHN0cm9rZXMgYXJlIHNlcGFyYXRlZCBieSBzcGFjZXMsIGFuZCBtb2RpZmllcnMgYXJlIHNlcGFyYXRlZCBieSAmYXBvczsrJmFwb3M7IGNoYXJhY3RlcnMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlIG1vZGlmaWVyIGtleXMgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIGEgcGxhdGZvcm0taW5kZXBlbmRlbnQgd2F5LiAgT24gTWFjT1MgWCwgZm9yIGV4YW1wbGUsICZxdW90O0NvbW1hbmQmcXVvdDsgaXMgYWxtb3N0IGFsd2F5cyB1c2VkIGluIHBsYWNlIG9mICZxdW90O0N0cmwmcXVvdDsuICBTbywgd2UgcHJvdmlkZSAmcXVvdDtNMSZxdW90OyB3aGljaCB3aWxsIG1hcCB0byBlaXRoZXIgJnF1b3Q7Q3RybCZxdW90OyBvciAmcXVvdDtDb21tYW5kJnF1b3Q7LCBhcyBhcHByb3ByaWF0ZS4gIFNpbWlsYXJseSwgJnF1b3Q7TTImcXVvdDsgaXMgJnF1b3Q7U2hpZnQmcXVvdDs7ICZxdW90O00zJnF1b3Q7IGlzICZxdW90O0FsdCZxdW90OzsgYW5kICZxdW90O000JnF1b3Q7IGlzICZxdW90O0N0cmwmcXVvdDsgKE1hY09TIFgpLiAgSWYgbW9yZSBwbGF0Zm9ybXMgYXJlIGFkZGVkLCB0aGVuIHlvdSBjYW4gY291bnQgb24gdGhlc2UgYWxpYXNlcyBiZWluZyBtYXBwZWQgdG8gZ29vZCBwbGF0Zm9ybSBkZWZhdWx0cy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGUgc3ludGF4IGZvciB0aGlzIHN0cmluZyBpcyBkZWZpbmVkIGluICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLmludGVybmFsLmtleXMmbHQ7L2NvZGUmZ3Q7LiAgQnJpZWZseSwgdGhlIHN0cmluZyBpcyBjYXNlIGluc2Vuc2l0aXZlIC0tIHRob3VnaCBhbGwgY2FwaXRhbHMgaXMgcHJlZmVycmVkIHN0eWxpc3RpY2FsbHkuICBJZiB0aGUga2V5IGlzIGEgbGV0dGVyLCB0aGVuIHNpbXBseSBhcHBlbmQgdGhlIGxldHRlci4gIElmIHRoZSBrZXkgaXMgYSBzcGVjaWFsIGtleSAoaS5lLiwgbm9uLUFTQ0lJKSwgdGhlbiB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmc6IEFSUk9XX0RPV04sIEFSUk9XX0xFRlQsIEFSUk9XX1JJR0hULCBBUlJPV19VUCwgQlJFQUssIENBUFNfTE9DSywgRU5ELCBGMSwgRjIsIEYzLCBGNCwgRjUsIEY2LCBGNywgRjgsIEY5LCBGMTAsIEYxMSwgRjEyLCBGMTMsIEYxNCwgRjE1LCBIT01FLCBJTlNFUlQsIE5VTV9MT0NLLCBOVU1QQURfMCwgTlVNUEFEXzEsIE5VTVBBRF8yLCBOVU1QQURfMywgTlVNUEFEXzQsIE5VTVBBRF81LCBOVU1QQURfNiwgTlVNUEFEXzcsIE5VTVBBRF84LCBOVU1QQURfOSwgTlVNUEFEX0FERCwgTlVNUEFEX0RFQ0lNQUwsIE5VTVBBRF9ESVZJREUsIE5VTVBBRF9FTlRFUiwgTlVNUEFEX0VRVUFMLCBOVU1QQURfTVVMVElQTFksIE5VTVBBRF9TVUJUUkFDVCwgUEFHRV9VUCwgUEFHRV9ET1dOLCBQQVVTRSwgUFJJTlRfU0NSRUVOLCBvciBTQ1JPTExfTE9DSy4gIElmIHRoZSBrZXkgaXMgYSBub24tcHJpbnRhYmxlIEFTQ0lJIGtleSwgdGhlbiB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmc6IEJTLCBDUiwgREVMLCBFU0MsIEZGLCBMRiwgTlVMLCBTUEFDRSwgVEFCLCBvciBWVC4gIE5vdGUgdGhhdCB0aGUgbWFpbiBrZXlib2FyZCBlbnRlci9yZXR1cm4ga2V5IGlzIENSLiZsdDsvcCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ia2V5Q29uZmlndXJhdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIGRlZmluZSBrZXkgY29uZmlndXJhdGlvbnMuIElmIG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UgZWxlbWVudHMgZXhpc3Qgd2l0aCB0aGUgc2FtZSAmbHQ7Y29kZSZndDtpZCZsdDsvY29kZSZndDsgYXR0cmlidXRlLCBvbmx5IHRoZSBsYXN0IGRlY2xhcmVkIGVsZW1lbnQgKGluIG9yZGVyIG9mIHJlYWRpbmcgdGhlIHBsdWdpbiByZWdpc3RyeSkgaXMgY29uc2lkZXJlZCB2YWxpZC4gIFBsZWFzZSB1c2UgdGhlICZxdW90O29yZy5lY2xpcHNlLnVpLmJpbmRpbmdzJnF1b3Q7IGV4dGVuc2lvbiBwb2ludCBpbnN0ZWFkLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHRyYW5zbGF0YWJsZSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGlzIGtleSBjb25maWd1cmF0aW9uIGZvciBkaXNwbGF5IGluIHRoZSBVSS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIGtleSBjb25maWd1cmF0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHRyYW5zbGF0YWJsZSBuYW1lIG9mIHRoaXMga2V5IGNvbmZpZ3VyYXRpb24gZm9yIGRpc3BsYXkgaW4gdGhlIFVJLiBJZiB0aGlzIGtleSBjb25maWd1cmF0aW9uIGhhcyBhIHBhcmVudCwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBhZGQgJnF1b3Q7KGV4dGVuZHMgLi4uKSZxdW90OyB0byB0aGUgbmFtZS4gVGhpcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgYnkgdGhlIFVJIHdoZXJlIG5lY2Vzc2FyeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhcmVudCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoZSBwYXJlbnQga2V5IGNvbmZpZ3VyYXRpb24uIElmIHRoaXMga2V5IGNvbmZpZ3VyYXRpb24gaGFzIGEgcGFyZW50LCBpdCB3aWxsIGJvcnJvdyBhbGwga2V5IGJpbmRpbmdzIGZyb20gaXRzIHBhcmVudCwgaW4gYWRkaXRpb24gdG8gdGhlIGtleSBiaW5kaW5ncyBkZWZpbmVkIGluIGl0cyBvd24ga2V5IGNvbmZpZ3VyYXRpb24uCi1AZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHBhcmVudElkIGluc3RlYWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50SWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcGFyZW50IGtleSBjb25maWd1cmF0aW9uLiBJZiB0aGlzIGtleSBjb25maWd1cmF0aW9uIGhhcyBhIHBhcmVudCwgaXQgd2lsbCBib3Jyb3cgYWxsIGtleSBiaW5kaW5ncyBmcm9tIGl0cyBwYXJlbnQsIGluIGFkZGl0aW9uIHRvIHRoZSBrZXkgYmluZGluZ3MgZGVmaW5lZCBpbiBpdHMgb3duIGtleSBjb25maWd1cmF0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZXh0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gZGVmaW5lIGNvbnRleHRzLiBJZiBtb3JlIHRoYW4gb25lIG9mIHRoZXNlIGVsZW1lbnRzIGV4aXN0IHdpdGggdGhlIHNhbWUgJmx0O2NvZGUmZ3Q7aWQmbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSwgb25seSB0aGUgbGFzdCBkZWNsYXJlZCBlbGVtZW50IChpbiBvcmRlciBvZiByZWFkaW5nIHRoZSBwbHVnaW4gcmVnaXN0cnkpIGlzIGNvbnNpZGVyZWQgdmFsaWQuICBQbGVhc2UgdXNlIHRoZSAmbHQ7YSBocmVmPSZxdW90O29yZ19lY2xpcHNlX3VpX2NvbnRleHRzLmh0bWwmcXVvdDsmZ3Q7b3JnLmVjbGlwc2UudWkuY29udGV4dHMmbHQ7L2EmZ3Q7IGV4dGVuc2lvbiBwb2ludCBpbnN0ZWFkLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHRyYW5zbGF0YWJsZSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGlzIGNvbnRleHQgZm9yIGRpc3BsYXkgaW4gdGhlIFVJLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgY29udGV4dC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0cmFuc2xhdGFibGUgbmFtZSBvZiB0aGlzIGNvbnRleHQgZm9yIGRpc3BsYXkgaW4gdGhlIFVJLiBJZiB0aGlzIGNvbnRleHQgaGFzIGEgcGFyZW50LCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGFkZCAmcXVvdDsoZXh0ZW5kcyBwYXJlbnQpJnF1b3Q7IHRvIHRoZSBuYW1lLiBUaGlzIHdpbGwgYmUgYXV0b21hdGljYWxseSBhZGRlZCBieSB0aGUgVUkgd2hlcmUgbmVjZXNzYXJ5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHBhcmVudCBjb250ZXh0LiBJZiB0aGlzIGNvbnRleHQgaGFzIGEgcGFyZW50LCBpdCB3aWxsIGJvcnJvdyBhbGwga2V5IGJpbmRpbmdzIGZyb20gaXRzIHBhcmVudCwgaW4gYWRkaXRpb24gdG8gdGhlIGtleSBiaW5kaW5ncyBkZWZpbmVkIGluIGl0cyBvd24gY29udGV4dC4KLUBkZXByZWNhdGVkIFBsZWFzZSB1c2UgJnF1b3Q7cGFyZW50SWQmcXVvdDsgaW5zdGVhZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnRJZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoZSBwYXJlbnQgY29udGV4dC4gSWYgdGhpcyBjb250ZXh0IGhhcyBhIHBhcmVudCwgaXQgd2lsbCBib3Jyb3cgYWxsIGtleSBiaW5kaW5ncyBmcm9tIGl0cyBwYXJlbnQsIGluIGFkZGl0aW9uIHRvIHRoZSBrZXkgYmluZGluZ3MgZGVmaW5lZCBpbiBpdHMgb3duIGNvbnRleHQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNjb3BlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCB0byBkZWZpbmUgc2NvcGVzLiBJZiBtb3JlIHRoYW4gb25lIG9mIHRoZXNlIGVsZW1lbnRzIGV4aXN0IHdpdGggdGhlIHNhbWUgJmx0O2NvZGUmZ3Q7aWQmbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSwgb25seSB0aGUgbGFzdCBkZWNsYXJlZCBlbGVtZW50IChpbiBvcmRlciBvZiByZWFkaW5nIHRoZSBwbHVnaW4gcmVnaXN0cnkpIGlzIGNvbnNpZGVyZWQgdmFsaWQuCi1AZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHRoZSAmcXVvdDtvcmcuZWNsaXBzZS51aS5jb250ZXh0cyZxdW90OyBleHRlbnNpb24gcG9pbnQgaW5zdGVhZC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB0cmFuc2xhdGFibGUgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhpcyBzY29wZSBmb3IgZGlzcGxheSBpbiB0aGUgVUkuCi0KLUBkZXByZWNhdGVkIFBsZWFzZSB1c2UgdGhlICZxdW90O29yZy5lY2xpcHNlLnVpLmNvbnRleHRzJnF1b3Q7IGV4dGVuc2lvbiBwb2ludCBpbnN0ZWFkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgc2NvcGUuCi0KLUBkZXByZWNhdGVkIFBsZWFzZSB1c2UgdGhlICZxdW90O29yZy5lY2xpcHNlLnVpLmNvbnRleHRzJnF1b3Q7IGV4dGVuc2lvbiBwb2ludCBpbnN0ZWFkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHRyYW5zbGF0YWJsZSBuYW1lIG9mIHRoaXMgc2NvcGUgZm9yIGRpc3BsYXkgaW4gdGhlIFVJLiBJZiB0aGlzIHNjb3BlIGhhcyBhIHBhcmVudCwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBhZGQgJnF1b3Q7KGV4dGVuZHMgcGFyZW50KSZxdW90OyB0byB0aGUgbmFtZS4gVGhpcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgYnkgdGhlIFVJIHdoZXJlIG5lY2Vzc2FyeS4KLQotQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUgJnF1b3Q7b3JnLmVjbGlwc2UudWkuY29udGV4dHMmcXVvdDsgZXh0ZW5zaW9uIHBvaW50IGluc3RlYWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcGFyZW50IHNjb3BlLiBJZiB0aGlzIHNjb3BlIGhhcyBhIHBhcmVudCwgaXQgd2lsbCBib3Jyb3cgYWxsIGtleSBiaW5kaW5ncyBmcm9tIGl0cyBwYXJlbnQsIGluIGFkZGl0aW9uIHRvIHRoZSBrZXkgYmluZGluZ3MgZGVmaW5lZCBpbiBpdHMgb3duIHNjb3BlLgotCi1AZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHRoZSAmcXVvdDtvcmcuZWNsaXBzZS51aS5jb250ZXh0cyZxdW90OyBleHRlbnNpb24gcG9pbnQgaW5zdGVhZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29tbWFuZFBhcmFtZXRlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lcyBhIHBhcmFtZXRlciB0aGF0IGEgY29tbWFuZCBzaG91bGQgdW5kZXJzdGFuZC4gIEEgcGFyYW1ldGVyIGlzIGEgd2F5IHRvIHByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbiB0byBhIGhhbmRsZXIgYXQgZXhlY3V0aW9uIHRpbWUuICBGb3IgZXhhbXBsZSwgYSAmcXVvdDtzaG93IHZpZXcmcXVvdDsgY29tbWFuZCBtaWdodCB0YWtlIGEgdmlldyBhcyBhIHBhcmFtZXRlci4gIEhhbmRsZXJzIHNob3VsZCBiZSBhYmxlIHRvIHVuZGVyc3RhbmQgdGhlc2UgcGFyYW1ldGVycywgc28gdGhleSBzaG91bGQgYmUgdHJlYXRlZCBsaWtlIEFQSS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmFsdWVzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBhcmFtZXRlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIGZvciB0aGUgcGFyYW1ldGVyLiAgVGhpcyBpcyB0aGUgbmFtZSBhcyBpdCB3aWxsIGJlIGRpc3BsYXllZCB0byBhbiBlbmQtdXNlci4gIEFzIHN1Y2gsIGl0IHNob3VsZCBiZSB0cmFuc2xhdGFibGUuICBUaGUgbmFtZSBzaG91bGQgYmUgc2hvcnQgLS0gcHJlZmVycmFibHkgb25lIHdvcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZXMiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHByb3ZpZGluZyBhIGxpc3Qgb2YgcGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHVzZXIgdG8gc2VsZWN0LiAgVGhpcyBjbGFzcyBzaG91bGQgaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSVBhcmFtZXRlclZhbHVlcyZsdDsvY29kZSZndDsuICBJZiB0aGlzIGNsYXNzIGlzIG5vdCBzcGVjaWZpZWQsIHlvdSBtdXN0IHNwZWNpZnkgdGhlIG1vcmUgdmVyYm9zZSAmbHQ7Y29kZSZndDt2YWx1ZXMmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQuICBQbGVhc2Ugc2VlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklQYXJhbWV0ZXJWYWx1ZXMiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGlkIG9mIGEgY29tbWFuZFBhcmFtZXRlclR5cGUgZm9yIHRoaXMgY29tbWFuZFBhcmFtZXRlci4gIFNwZWNpZnlpbmcgYSB0eXBlSWQgYWxsb3dzIGhhbmRsZXJzIG9mIGEgY29tbWFuZCB0byBjb252ZXJ0IHN0cmluZyBwYXJhbWV0ZXIgdmFsdWVzIHRvIG9iamVjdHMgaW4gYSBjb25zaXN0ZW50IHdheSBhbmQgaXQgYWxsb3dzIHBvdGVudGlhbCBjYWxsZXJzIG9mIGEgY29tbWFuZCB0byBsb29rIGZvciBjb21tYW5kcyB0aGF0IHRha2Ugb2JqZWN0cyBvZiB2YXJpb3VzIHR5cGVzIGZvciB0aGVpciBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBXaGV0aGVyIHRoaXMgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiAgSWYgYSBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwsIHRoZSBoYW5kbGVyIHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSB0aGUgYWJzZW5jZSBvZiB0aGUgcGFyYW1ldGVyLiAgQnkgZGVmYXVsdCwgYWxsIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb21tYW5kUGFyYW1ldGVyVHlwZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgb2JqZWN0IHR5cGUgb2YgYSBjb21tYW5kUGFyYW1ldGVyIGFuZCBtYXkgc3BlY2lmeSBhbiAmbHQ7Y29kZSZndDtBYnN0cmFjdFBhcmFtZXRlclZhbHVlQ29udmVydGVyJmx0Oy9jb2RlJmd0OyBzdWJjbGFzcyB0byBjb252ZXJ0IGJldHdlZW4gc3RyaW5nIHBhcmFtZXRlciB2YWx1ZXMgYW5kIG9iamVjdHMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjb21tYW5kUGFyYW1ldGVyVHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3Mgb3IgaW50ZXJmYWNlIHRvIHVzZSBhcyB0aGUgdHlwZSBvZiB0aGlzIGNvbW1hbmQgcGFyYW1ldGVyLiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwsIGhvd2V2ZXIgaWYgb21pdHRlZCwgJmx0O2NvZGUmZ3Q7amF2YS5sYW5nLk9iamVjdCZsdDsvY29kZSZndDsgd2lsbCBiZSB1c2VkIGFzIHRoZSBwYXJhbWV0ZXIgdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gb2JqZWN0cyBhbmQgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZiBvYmplY3RzIGZvciBjb21tYW5kIHBhcmFtZXRlciB2YWx1ZXMuICBUaGlzIGNsYXNzIHNob3VsZCBleHRlbmQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdFBhcmFtZXRlclZhbHVlQ29udmVydGVyJmx0Oy9jb2RlJmd0Oy4gVGhlIGNvbnZlcnRlciBzaG91bGQgcHJvZHVjZSBhbmQgY29uc3VtZSBvYmplY3RzIG9mIHRoZSB0eXBlIGluZGljYXRlZCBpbiB0aGUgJmx0O2NvZGUmZ3Q7dHlwZSZsdDsvY29kZSZndDsgYXR0cmlidXRlLiBJZiB0aGlzIGNsYXNzIGlzIG5vdCBzcGVjaWZpZWQsIHRoaXMgZmFjaWxpdHkgdG8gY29udmVydCBiZXR3ZWVuIHN0cmluZyBhbmQgb2JqZWN0IHZhbHVlcyBmb3IgdGhpcyBwYXJhbWV0ZXIgdHlwZSB3aWxsIG5vdCBiZSBhdmFpbGFibGUgKHRoZSAmbHQ7Y29kZSZndDtnZXRWYWx1ZUNvbnZlcnRlcigpJmx0Oy9jb2RlJmd0OyBvbiBjbGFzcyAmbHQ7Y29kZSZndDtQYXJhbWV0ZXJUeXBlJmx0Oy9jb2RlJmd0OyB3aWxsIHJldHVybiAmbHQ7Y29kZSZndDtudWxsJmx0Oy9jb2RlJmd0OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0UGFyYW1ldGVyVmFsdWVDb252ZXJ0ZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmFsdWVzIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjbGFzcyIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgbW9yZSB2ZXJib3NlIHZlcnNpb24gb2YgdGhlICZsdDtjb2RlJmd0O3ZhbHVlcyZsdDsvY29kZSZndDsgYXR0cmlidXRlIG9uIHRoZSAmbHQ7Y29kZSZndDtjb21tYW5kUGFyYW1ldGVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyBwcm92aWRpbmcgYSBsaXN0IG9mIHBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSB1c2VyIHRvIHNlbGVjdC4gIFRoaXMgY2xhc3Mgc2hvdWxkIGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklQYXJhbWV0ZXJWYWx1ZXMmbHQ7L2NvZGUmZ3Q7LiAgSWYgdGhpcyBjbGFzcyBpcyBub3Qgc3BlY2lmaWVkLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBtb3JlIHZlcmJvc2UgJmx0O2NvZGUmZ3Q7dmFsdWVzJmx0Oy9jb2RlJmd0OyBlbGVtZW50LiAgUGxlYXNlIHNlZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb24mbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JUGFyYW1ldGVyVmFsdWVzIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InBhcmFtZXRlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIHBvc3NpYmxlIHZhbHVlIGZvciBhIHBhcmFtZXRlci4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIHBhc3MgdG8gdGhlICZsdDtjb2RlJmd0O0lFeGVjdXRhYmxlRXh0ZW5zaW9uJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciB0byBwYXNzIHRvIHRoZSAmbHQ7Y29kZSZndDtJRXhlY3V0YWJsZUV4dGVuc2lvbiZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlZmF1bHRIYW5kbGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjbGFzcyIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciB0aGlzIGNvbW1hbmQuICBJZiBubyBvdGhlciBoYW5kbGVyIGlzIGFjdGl2ZSwgdGhpcyBoYW5kbGVyIHdpbGwgYmUgYWN0aXZlLiAgVGhpcyBoYW5kbGVyIHdpbGwgY29uZmxpY3Qgd2l0aCBvdGhlciBoYW5kbGVyIGRlZmluaXRpb25zIHRoYXQgc3BlY2lmeSBubyAmbHQ7Y29kZSZndDthY3RpdmVXaGVuJmx0Oy9jb2RlJmd0OyBjb25kaXRpb25zLiAgSWYgeW91IGFyZSBub3QgY3JlYXRpbmcgYW4gJmx0O2NvZGUmZ3Q7SUV4ZWN1dGFibGVFeHRlbnNpb24mbHQ7L2NvZGUmZ3Q7LCB5b3UgY2FuIHVzZSB0aGUgJmx0O2NvZGUmZ3Q7ZGVmYXVsdEhhbmRsZXImbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSBpbnN0ZWFkLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdGF0ZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iY2xhc3MiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgJmx0O3AmZ3Q7Ci1TdGF0ZSBpbmZvcm1hdGlvbiBzaGFyZWQgYmV0d2VlbiBhbGwgaGFuZGxlcnMsIGFuZCBwb3RlbnRpYWxseSBwZXJzaXN0ZWQgYmV0d2VlbiBzZXNzaW9ucy4gIFRoaXMgaXMgdHlwaWNhbGx5IHNvbWV0aGluZyBsaWtlIGEgY2hlY2sgYm94IHN0YXRlIG9yIHRoZSBsYWJlbCBvZiBhIGhhbmRsZXIuICBUaGUgc3RhdGUgaXMgc2ltcGx5IGEgY2xhc3MgdGhhdCBpcyBsb2FkZWQgdG8gbG9vayBhZnRlciB0aGUgc3RhdGUuICBTZWUgdGhlIEFQSSBJbmZvcm1hdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgotJmx0Oy9wJmd0OwotJmx0O2RsJmd0OwotICAgICZsdDtkdCZndDsmbHQ7YiZndDtTaW5jZTombHQ7L2ImZ3Q7Jmx0Oy9kdCZndDsKLSAgICAmbHQ7ZGQmZ3Q7My4yJmx0Oy9kZCZndDsKLSZsdDsvZGwmZ3Q7Ci0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgY2FuIGJlIGxvYWRlZCB0byBzdG9yZSB0aGUgc3RhdGUgb2YgdGhpcyBjb21tYW5kLiAgU3RhdGUgaXMgc2hhcmVkIGFtb25nc3QgaGFuZGxlcnMsIGFuZCBjYW4gYmUgcGVyc2lzdGVkIGJldHdlZW4gc2Vzc2lvbnMuICBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSVN0YXRlJmx0Oy9jb2RlJmd0Oy4gIFBsZWFzZSBzZWUgQVBJIEluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgc3RhdGUuICBUaGlzIGlzIHVzZWQgZm9yIHBlcnNpc3RpbmcgdGhlIHN0YXRlIGJldHdlZW4gc2Vzc2lvbnMgKGlmIHRoZSBzdGF0ZSBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O0lQZXJzaXN0YWJsZVN0YXRlJmx0Oy9jb2RlJmd0OykuICBDZXJ0YWluIGNvbW1vbiBpZGVudGlmaWVycyAoc2VlICZsdDtjb2RlJmd0O0lNZW51U3RhdGVJZHMmbHQ7L2NvZGUmZ3Q7KSBhcmUgdW5kZXJzdG9vZCB3aGVuIHRoZSBjb21tYW5kIGlzIGJlaW5nIHJlbmRlcmVyIGluIHRoZSBtZW51cyBvciB0b29sIGJhcnMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNsYXNzIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjbGFzcyIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBjYW4gYmUgbG9hZGVkIHRvIHN0b3JlIHRoZSBzdGF0ZSBvZiB0aGlzIGNvbW1hbmQuICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpZiB5b3Ugd2lzaCB0byBwYXNzIG11bHRpcGxlIHBhcmFtZXRlcnMgdG8gYW4gJmx0O2NvZGUmZ3Q7SUV4ZWN1dGFibGVFeHRlbnNpb24mbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IGNhbiBiZSBsb2FkZWQgdG8gc3RvcmUgdGhlIHN0YXRlIG9mIHRoaXMgY29tbWFuZC4gIFN0YXRlIGlzIHNoYXJlZCBhbW9uZ3N0IGhhbmRsZXJzLCBhbmQgY2FuIGJlIHBlcnNpc3RlZCBiZXR3ZWVuIHNlc3Npb25zLiAgVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklTdGF0ZSZsdDsvY29kZSZndDsuICBQbGVhc2Ugc2VlIEFQSSBJbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci0yLjEKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci1UaGUgJmx0O2NvZGUmZ3Q7cGx1Z2luLnhtbCZsdDsvY29kZSZndDsgZmlsZSBpbiB0aGUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkmbHQ7L2NvZGUmZ3Q7IHBsdWdpbiBtYWtlcyBleHRlbnNpdmUgdXNlIG9mIHRoZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS5jb21tYW5kcyZsdDsvY29kZSZndDsgZXh0ZW5zaW9uIHBvaW50LgotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0OwotVGhpcyBpcyBubyBwdWJsaWMgQVBJIGZvciBkZWNsYXJpbmcgY29tbWFuZHMsIGNhdGVnb3JpZXMsIGtleSBiaW5kaW5ncywga2V5IGNvbmZpZ3VyYXRpb25zLCBvciBjb250ZXh0cyBvdGhlciB0aGFuIHRoaXMgZXh0ZW5zaW9uIHBvaW50LiBQdWJsaWMgQVBJIGZvciBxdWVyeWluZyBhbmQgc2V0dGluZyBjb250ZXh0cywgYXMgd2VsbCBhcyByZWdpc3RlcmluZyBhY3Rpb25zIHRvIGhhbmRsZSBzcGVjaWZpYyBjb21tYW5kcyBjYW4gYmUgZm91bmQgaW4gJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkuSUtleUJpbmRpbmdTZXJ2aWNlJmx0Oy9jb2RlJmd0Oy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVGhlcmUgYXJlIGEgZmV3IGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIGhhbmRsZXIgc3RhdGVzIHRoYXQgbWF5IGJlIHVzZWZ1bCB0byB1c2VycyBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludDoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSZsdDtsaSZndDtvcmcuZWNsaXBzZS5qZmFjZS5jb21tYW5kcy5UZXh0U3RhdGUmbHQ7L2xpJmd0OwotJmx0O2xpJmd0O29yZy5lY2xpcHNlLmpmYWNlLmNvbW1hbmRzLlJhZGlvU3RhdGUmbHQ7L2xpJmd0OwotJmx0O2xpJmd0O29yZy5lY2xpcHNlLmpmYWNlLmNvbW1hbmRzLlRvZ2dsZVN0YXRlJmx0Oy9saSZndDsKLSZsdDtsaSZndDtvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5SZWdpc3RyeVJhZGlvU3RhdGUmbHQ7L2xpJmd0OwotJmx0O2xpJmd0O29yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLlJlZ2lzdHJ5VG9nZ2xlU3RhdGUmbHQ7L2xpJmd0OwotJmx0Oy91bCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvY29tbW9uQWN0aW9uLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9jb21tb25BY3Rpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlOWRhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9jb21tb25BY3Rpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJjb21tb25BY3Rpb24iIG5hbWU9IkNvbW1vbiBBY3Rpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1lbnUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImxhYmVsIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIGRlZmluZWQgYSBuZXcgbWVudS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VwYXJhdG9yIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imdyb3VwTWFya2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgbWVudS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgYnkgdGhlIFdvcmtiZW5jaCBmb3IgdGhpcyBuZXcgbWVudS4gVGhlIG5hbWUgc2hvdWxkIGluY2x1ZGUgbW5lbW9uaWMgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXRoIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmV3IG1lbnUgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCBvZiB0aGUgbWVudS4gRWFjaCB0b2tlbiBpbiB0aGUgcGF0aCBtdXN0IHJlZmVyIHRvIGFuIGV4aXN0aW5nIG1lbnUsIGV4Y2VwdCB0aGUgbGFzdCB0b2tlbiB3aGljaCBzaG91bGQgcmVwcmVzZW50IGEgbmFtZWQgZ3JvdXAgaW4gdGhlIGxhc3QgbWVudSBpbiB0aGUgcGF0aC4gSWYgb21pdHRlZCwgdGhlIG5ldyBtZW51IHdpbGwgYmUgYWRkZWQgdG8gdGhlICZsdDtzYW1wJmd0O2FkZGl0aW9ucyZsdDsvc2FtcCZndDsgbmFtZWQgZ3JvdXAgb2YgdGhlIG1lbnUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNlcGFyYXRvciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBtZW51IHNlcGFyYXRvciBpbiB0aGUgbmV3IG1lbnUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG1lbnUgc2VwYXJhdG9yLiBUaGlzIG5hbWUgY2FuIGxhdGVyIGJlIHJlZmVyZW5jZWQgYXMgdGhlIGxhc3QgdG9rZW4gaW4gYSBtZW51IHBhdGguIFRoZXJlZm9yZSwgYSBzZXBhcmF0b3IgYWxzbyBzZXJ2ZXMgYXMgbmFtZWQgZ3JvdXAgaW50byB3aGljaCBhY3Rpb25zIGFuZCBtZW51cyBjYW4gYmUgYWRkZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Imdyb3VwTWFya2VyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5hbWVkIGdyb3VwIGluIHRoZSBuZXcgbWVudS4gSXQgaGFzIG5vIHZpc3VhbCByZXByZXNlbnRhdGlvbiBpbiB0aGUgbmV3IG1lbnUsIHVubGlrZSB0aGUgJmx0O3NhbXAmZ3Q7c2VwYXJhdG9yJmx0Oy9zYW1wJmd0OyBlbGVtZW50LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBncm91cCBtYXJrZXIuIFRoaXMgbmFtZSBjYW4gbGF0ZXIgYmUgcmVmZXJlbmNlZCBhcyB0aGUgbGFzdCB0b2tlbiBpbiB0aGUgbWVudSBwYXRoLiBJdCBzZXJ2ZXMgYXMgbmFtZWQgZ3JvdXAgaW50byB3aGljaCBhY3Rpb25zIGFuZCBtZW51cyBjYW4gYmUgYWRkZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNlbGVjdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iY2xhc3MiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gaGVscCBkZXRlcm1pbmUgdGhlIGFjdGlvbiBlbmFibGVtZW50IGJhc2VkIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gSWdub3JlZCBpZiB0aGUgJmx0O3NhbXAmZ3Q7ZW5hYmxlbWVudCZsdDsvc2FtcCZndDsgZWxlbWVudCBpcyBzcGVjaWZpZWQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIG9yIGludGVyZmFjZSB0aGF0IGVhY2ggb2JqZWN0IGluIHRoZSBzZWxlY3Rpb24gbXVzdCBpbXBsZW1lbnQgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJqYXZhLmxhbmcuT2JqZWN0Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCB3aWxkIGNhcmQgZmlsdGVyIGZvciB0aGUgbmFtZSB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGFsbCBvYmplY3RzIGluIHRoZSBzZWxlY3Rpb24uIElmIHNwZWNpZmllZCBhbmQgdGhlIG1hdGNoIGZhaWxzLCB0aGUgYWN0aW9uIHdpbGwgYmUgZGlzYWJsZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvY29tbW9uRXhwcmVzc2lvbi5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvY29tbW9uRXhwcmVzc2lvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGMyMzRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2NvbW1vbkV4cHJlc3Npb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJjb21tb25FeHByZXNzaW9uIiBuYW1lPSJDb21tb24gRXhwcmVzc2lvbnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQW4gYWN0aW9uJmFwb3M7cyBlbmFibGVtZW50IGFuZC9vciB2aXNpYmlsaXR5IGNhbiBiZSBkZWZpbmVkIHVzaW5nIHRoZSBlbGVtZW50cyAmbHQ7c2FtcCZndDtlbmFibGVtZW50Jmx0Oy9zYW1wJmd0OyBhbmQgJmx0O3NhbXAmZ3Q7dmlzaWJpbGl0eSZsdDsvc2FtcCZndDsgcmVzcGVjdGl2ZWx5LiBUaGVzZSB0d28gZWxlbWVudHMgY29udGFpbiBhIGJvb2xlYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGV2YWx1YXRlZCB0byBkZXRlcm1pbmUgdGhlIGVuYWJsZW1lbnQgYW5kL29yIHZpc2liaWxpdHkuCi0mbHQ7cCZndDsKLVRoZSBzeW50YXggaXMgdGhlIHNhbWUgZm9yIHRoZSAmbHQ7c2FtcCZndDtlbmFibGVtZW50Jmx0Oy9zYW1wJmd0OyBhbmQgJmx0O3NhbXAmZ3Q7dmlzaWJpbGl0eSZsdDsvc2FtcCZndDsgZWxlbWVudHMuIEJvdGggY29udGFpbiBvbmx5IG9uZSBib29sZWFuIGV4cHJlc3Npb24gc3ViLWVsZW1lbnQuIEluIHRoZSBzaW1wbGVzdCBjYXNlLCB0aGlzIHdpbGwgYmUgYW4gJmx0O3NhbXAmZ3Q7b2JqZWN0Q2xhc3MmbHQ7L3NhbXAmZ3Q7LCAmbHQ7c2FtcCZndDtvYmplY3RTdGF0ZSZsdDsvc2FtcCZndDssICZsdDtzYW1wJmd0O3BsdWdpblN0YXRlJmx0Oy9zYW1wJmd0Oywgb3IgJmx0O3NhbXAmZ3Q7c3lzdGVtUHJvcGVydHkmbHQ7L3NhbXAmZ3Q7IGVsZW1lbnQuIEluIHRoZSBtb3JlIGNvbXBsZXggY2FzZSwgdGhlICZsdDtzYW1wJmd0O2FuZCZsdDsvc2FtcCZndDssICZsdDtzYW1wJmd0O29yJmx0Oy9zYW1wJmd0OywgYW5kICZsdDtzYW1wJmd0O25vdCZsdDsvc2FtcCZndDsgZWxlbWVudHMgY2FuIGJlIGNvbWJpbmVkIHRvIGZvcm0gYSBib29sZWFuIGV4cHJlc3Npb24uIEJvdGggdGhlICZsdDtzYW1wJmd0O2FuZCZsdDsvc2FtcCZndDssIGFuZCAmbHQ7c2FtcCZndDtvciZsdDsvc2FtcCZndDsgZWxlbWVudHMgbXVzdCBjb250YWluIDIgc3ViLWVsZW1lbnRzLiBUaGUgJmx0O3NhbXAmZ3Q7bm90Jmx0Oy9zYW1wJmd0OyBlbGVtZW50IG11c3QgY29udGFpbiBvbmx5IDEgc3ViLWVsZW1lbnQuCi0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVuYWJsZW1lbnQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIGRlZmluZSB0aGUgZW5hYmxlbWVudCBmb3IgdGhlIGV4dGVuc2lvbi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFuZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvciIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJub3QiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0Q2xhc3MiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0U3RhdGUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGx1Z2luU3RhdGUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3lzdGVtUHJvcGVydHkiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmlzaWJpbGl0eSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gZGVmaW5lIHRoZSB2aXNpYmlsaXR5IGZvciB0aGUgZXh0ZW5zaW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5kIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5vdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvYmplY3RDbGFzcyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvYmplY3RTdGF0ZSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwbHVnaW5TdGF0ZSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzeXN0ZW1Qcm9wZXJ0eSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhbmQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCByZXByZXNlbnQgYSBib29sZWFuIEFORCBvcGVyYXRpb24gb24gdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIGl0cyB0d28gc3ViLWVsZW1lbnQgZXhwcmVzc2lvbnMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMiIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5kIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5vdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvYmplY3RDbGFzcyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvYmplY3RTdGF0ZSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwbHVnaW5TdGF0ZSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzeXN0ZW1Qcm9wZXJ0eSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IHJlcHJlc2VudCBhIGJvb2xlYW4gT1Igb3BlcmF0aW9uIG9uIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyBpdHMgdHdvIHN1Yi1lbGVtZW50IGV4cHJlc3Npb25zLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjIiIG1heE9jY3Vycz0iMiI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFuZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvciIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJub3QiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0Q2xhc3MiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0U3RhdGUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGx1Z2luU3RhdGUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3lzdGVtUHJvcGVydHkiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibm90Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgcmVwcmVzZW50IGEgYm9vbGVhbiBOT1Qgb3BlcmF0aW9uIG9uIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyBpdHMgc3ViLWVsZW1lbnQgZXhwcmVzc2lvbnMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbmQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3IiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibm90Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9iamVjdENsYXNzIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9iamVjdFN0YXRlIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBsdWdpblN0YXRlIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN5c3RlbVByb3BlcnR5Ii8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im9iamVjdENsYXNzIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIGV2YWx1YXRlIHRoZSBjbGFzcyBvciBpbnRlcmZhY2Ugb2YgZWFjaCBvYmplY3QgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBJZiBlYWNoIG9iamVjdCBpbiB0aGUgc2VsZWN0aW9uIGltcGxlbWVudHMgdGhlIHNwZWNpZmllZCBjbGFzcyBvciBpbnRlcmZhY2UsIHRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhcyB0cnVlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyBvciBpbnRlcmZhY2UuICBUaGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXMgdHJ1ZSBvbmx5IGlmIGFsbCBvYmplY3RzIHdpdGhpbiB0aGUgc2VsZWN0aW9uIGltcGxlbWVudCB0aGlzIGNsYXNzIG9yIGludGVyZmFjZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249ImphdmEubGFuZy5PYmplY3QiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ib2JqZWN0U3RhdGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gZXZhbHVhdGUgdGhlIGF0dHJpYnV0ZSBzdGF0ZSBvZiBlYWNoIG9iamVjdCBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uIElmIGVhY2ggb2JqZWN0IGluIHRoZSBzZWxlY3Rpb24gaGFzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIHN0YXRlLCB0aGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXMgdHJ1ZS4gVG8gZXZhbHVhdGUgdGhpcyB0eXBlIG9mIGV4cHJlc3Npb24sIGVhY2ggb2JqZWN0IGluIHRoZSBzZWxlY3Rpb24gbXVzdCBpbXBsZW1lbnQsIG9yIGFkYXB0IHRvLCAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyJmx0Oy9zYW1wJmd0OyBpbnRlcmZhY2UuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgYW4gb2JqZWN0JmFwb3M7cyBhdHRyaWJ1dGUuIEFjY2VwdGFibGUgbmFtZXMgcmVmbGVjdCB0aGUgb2JqZWN0IHR5cGUsIGFuZCBzaG91bGQgYmUgcHVibGljbHkgZGVjbGFyZWQgYnkgdGhlIHBsdWctaW4gd2hlcmUgdGhlIG9iamVjdCB0eXBlIGlzIGRlY2xhcmVkLgotCi1Ac2VlIElSZXNvdXJjZUFjdGlvbkZpbHRlciBmb3IgYSBsaXN0IG9mIHRoZSBzdXBwb3J0ZWQgY29uc3RhbnRzCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHJlcXVpcmVkIHZhbHVlIG9mIHRoZSBvYmplY3QmYXBvcztzIGF0dHJpYnV0ZS4gVGhlIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGUgb2JqZWN0JmFwb3M7cyBhdHRyaWJ1dGUgc2hvdWxkIGJlIHB1YmxpY2x5IGRlY2xhcmVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwbHVnaW5TdGF0ZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gZXZhbHVhdGUgdGhlIHN0YXRlIG9mIGEgcGx1Zy1pbi4gVGhlIHN0YXRlIG9mIHRoZSBwbHVnLWluIG1heSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogJmx0O3NhbXAmZ3Q7aW5zdGFsbGVkJmx0Oy9zYW1wJmd0OyAoZXF1aXZhbGVudCB0byB0aGUgT1NHaSBjb25jZXB0IG9mICZxdW90O3Jlc29sdmVkJnF1b3Q7KSBvciAmbHQ7c2FtcCZndDthY3RpdmF0ZWQmbHQ7L3NhbXAmZ3Q7IChlcXVpdmFsZW50IHRvIHRoZSBPU0dpIGNvbmNlcHQgb2YgJnF1b3Q7YWN0aXZlJnF1b3Q7KS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgb2YgYSBwbHVnLWluIHdoaWNoIG1heSBvciBtYXkgbm90IGV4aXN0IGluIHRoZSBwbHVnLWluIHJlZ2lzdHJ5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJpbnN0YWxsZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSByZXF1aXJlZCBzdGF0ZSBvZiB0aGUgcGx1Zy1pbi4gVGhlIHN0YXRlIG9mIHRoZSBwbHVnLWluIG1heSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogJmx0O3NhbXAmZ3Q7aW5zdGFsbGVkJmx0Oy9zYW1wJmd0OyAoZXF1aXZhbGVudCB0byB0aGUgT1NHaSBjb25jZXB0IG9mICZxdW90O3Jlc29sdmVkJnF1b3Q7KSBvciAmbHQ7c2FtcCZndDthY3RpdmF0ZWQmbHQ7L3NhbXAmZ3Q7IChlcXVpdmFsZW50IHRvIHRoZSBPU0dpIGNvbmNlcHQgb2YgJnF1b3Q7YWN0aXZlJnF1b3Q7KS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imluc3RhbGxlZCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJhY3RpdmF0ZWQiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InN5c3RlbVByb3BlcnR5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIGV2YWx1YXRlIHRoZSBzdGF0ZSBvZiBzb21lIHN5c3RlbSBwcm9wZXJ0eS4gIFRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgJmx0O3NhbXAmZ3Q7amF2YS5sYW5nLlN5c3RlbSZsdDsvc2FtcCZndDsuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0eS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgcmVxdWlyZWQgdmFsdWUgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0eS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUmVsZWFzZSAyLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2NvbnRleHRzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9jb250ZXh0cy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDFhOWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2NvbnRleHRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0iY29udGV4dHMiIG5hbWU9IkNvbnRleHRzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0OwotVGhlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLmNvbnRleHRzJmx0Oy9jb2RlJmd0OyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBkZWNsYXJlIGNvbnRleHRzIGFuZCBhc3NvY2lhdGVkIGVsZW1lbnRzLgotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250ZXh0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZXh0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCB0byBkZWZpbmUgY29udGV4dHMuIElmIG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UgZWxlbWVudHMgZXhpc3Qgd2l0aCB0aGUgc2FtZSAmbHQ7Y29kZSZndDtpZCZsdDsvY29kZSZndDsgYXR0cmlidXRlLCBvbmx5IHRoZSBsYXN0IGRlY2xhcmVkIGVsZW1lbnQgKGluIG9yZGVyIG9mIHJlYWRpbmcgdGhlIHJlZ2lzdHJ5KSBpcyBjb25zaWRlcmVkIHZhbGlkLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHRyYW5zbGF0YWJsZSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGlzIGNvbnRleHQgZm9yIGRpc3BsYXkgaW4gdGhlIFVJLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgY29udGV4dC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0cmFuc2xhdGFibGUgbmFtZSBvZiB0aGlzIGNvbnRleHQgZm9yIGRpc3BsYXkgaW4gdGhlIFVJLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50SWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgb2YgdGhpcyBjb250ZXh0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLTMuMAotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLVRoZSAmbHQ7Y29kZSZndDtwbHVnaW4ueG1sJmx0Oy9jb2RlJmd0OyBmaWxlIGluIHRoZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aSZsdDsvY29kZSZndDsgcGx1Z2luIG1ha2VzIHVzZSBvZiB0aGUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkuY29udGV4dHMmbHQ7L2NvZGUmZ3Q7IGV4dGVuc2lvbiBwb2ludC4KLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLVRoZXJlIGlzIGN1cnJlbnRseSBubyBwdWJsaWMgQVBJIGZvciBkZWNsYXJpbmcgY29udGV4dHMgb3IgYXNzb2NpYXRlZCBlbGVtZW50cyBvdGhlciB0aGFuIHRoaXMgZXh0ZW5zaW9uIHBvaW50LgotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9kZWNvcmF0b3JzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9kZWNvcmF0b3JzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMjg5YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvZGVjb3JhdG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9ImRlY29yYXRvcnMiIG5hbWU9IkRlY29yYXRvcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhZGQgZGVjb3JhdG9ycyB0byB2aWV3cyB0aGF0IHN1YnNjcmliZSB0byBhIGRlY29yYXRvciBtYW5hZ2VyLiBBcyBvZiAyLjEgdGhlcmUgaXMgdGhlIGNvbmNlcHQgb2YgYSBsaWdodHdlaWdodCBkZWNvcmF0b3IgdGhhdCB3aWxsIGhhbmRsZSB0aGUgaW1hZ2UgbWFuYWdlbWVudCBmb3IgdGhlIGRlY29yYXRvci4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkZWNsYXJlIGEgbGlnaHR3ZWlnaHQgZGVjb3JhdG9yIHRoYXQgc2ltcGx5IG92ZXJsYXlzIGFuIGljb24gd2hlbiBlbmFibGVkIHRoYXQgcmVxdWlyZXMgbm8gaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgcGx1Zy1pbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImNvbW1vbkV4cHJlc3Npb24uZXhzZCIvPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZWNvcmF0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlY29yYXRvciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibGFiZWwiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgZGVjb3JhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHdvcmtiZW5jaCB3aW5kb3cgbWVudSB0byByZXByZXNlbnQgdGhpcyBkZWNvcmF0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvciZsdDsvc2FtcCZndDsKLWlmICZsdDtiJmd0OyZsdDtpJmd0OyBsaWdodHdlaWdodCZsdDsvaSZndDsmbHQ7L2ImZ3Q7IGlzIGZhbHNlIG9yICAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yJmx0Oy9zYW1wJmd0OyBpZiBsaWdodHdlaWdodCBpcyB0cnVlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4gSWYgdGhlcmUgaXMgbm8gJmx0O2ImZ3Q7Jmx0O2kmZ3Q7Y2xhc3MmbHQ7L2kmZ3Q7Jmx0Oy9iJmd0OyBlbGVtZW50IGl0IGlzIGFzc3VtZWQgdG8gYmUgbGlnaHR3ZWlnaHQuCi0KLUluIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vIGRlY29yYXRvciBjbGFzcyB0aGlzIGlzIHNhaWQgdG8gYmUgZGVjbGFyYXRpdmUuIERlY2xhcmF0aXZlIGRlY29yYXRvcnMgd2l0aCBhbiBlbmFibGVtZW50IGJhc2VkIG9uIHNlc3Npb24gcHJvcGVydGllcywgcGVyc2lzdGFudCBwcm9wZXJ0aWVzIG9yIHByb2plY3QgZGVzY3JpcHRpb24gdmFsdWVzIChzdWNoIGFzIG5hdHVyZXMpIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkIGV4cGxpY2l0bHkgd2hlbiB0aGVzZSB2YWx1ZXMgY2hhbmdlIHVzaW5nICZsdDtjb2RlJmd0O0lEZWNvcmF0b3JNYW5hZ2VyI3VwZGF0ZSgpJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib2JqZWN0Q2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHdoaWNoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgYXBwbGllZCB0by4gRGVwcmVjYXRlZCBpbiAyLjEuIE1ha2UgdGhpcyB2YWx1ZSBwYXJ0IG9mIHRoZSBlbmFibGVtZW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iamF2YS5sYW5nLk9iamVjdCIgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFkYXB0YWJsZSIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHR5cGVzIHRoYXQgY2FuIGFkYXB0IHRvIG9iamVjdHMgb3RoZXIgdGhhbiB0aGllciBvYmplY3RDbGFzcyBzaG91bGQgdXNlIHRoaXMgb2JqZWN0IGNvbnRyaWJ1dGlvbi4KLUZvciBub24tbGlnaHR3ZWlnaHQgZGVjb3JhdG9ycywgdGhpcyBmbGFnIG9ubHkgaGFzIGFuIGVmZmVjdCBpZiBvYmplY3RDbGFzcyBhZGFwdHMgdG8gSVJlc291cmNlLiAgRm9yIGxpZ2h0d2VpZ2h0IGRlY29yYXRvcnMsIGFkYXB0YWJpbGl0eSB0byBhbnkgb2JqZWN0Q2xhc3MgaXMgc3VwcG9ydGVkIGFzIGxvbmcgYXMgYWRhcHRhYmlsaXR5IGlzIGRlZmluZWQgdGhyb3VnaCB0aGUgYWRhcHRlciBtYW5hZ2VyIChzZWUgdGhlIGNsYXNzIG9yZy5lY2xpcHNlLnJ1bnRpbWUuSUFkYXB0ZXJNYW5hZ2VyKS4gRGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGF0ZSIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBkZWNvcmF0b3IgaXMgb24gYnkgZGVmYXVsdC4gIERlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGlnaHR3ZWlnaHQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBsaWdodHdlaWdodCBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBkZWNvcmF0b3IgaXMgZWl0aGVyCi1kZWNsYXJhdGl2ZSBvciBpbXBsZW1lbnRzIAotJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgaWYgdGhlIGRlY29yYXRvciBpcyAmbHQ7YiZndDsmbHQ7aSZndDtsaWdodHdlaWdodCZsdDsvaSZndDsmbHQ7L2ImZ3Q7IGFuZCB0aGUgJmx0O2ImZ3Q7Jmx0O2kmZ3Q7Y2xhc3MmbHQ7L2kmZ3Q7Jmx0Oy9iJmd0OyBpcyBub3Qgc3BlY2lmaWVkIHRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIG92ZXJsYXkgaW1hZ2UgdG8gYXBwbHkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGlmIHRoZSBkZWNvcmF0b3IgaXMgJmx0O2ImZ3Q7Jmx0O2kmZ3Q7bGlnaHR3ZWlnaHQmbHQ7L2kmZ3Q7Jmx0Oy9iJmd0OyB0aGlzIGlzIHRoZSBsb2NhdGlvbiB0byBhcHBseSB0aGUgZGVjb3JhdG9yIHRvLiBEZWZhdWx0cyB0byBCT1RUT01fUklHSFQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJUT1BfTEVGVCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJUT1BfUklHSFQiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQk9UVE9NX0xFRlQiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQk9UVE9NX1JJR0hUIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlVOREVSTEFZIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBhbiBvcHRpb25hbCBzdWJlbGVtZW50IHdob3NlIGJvZHkgc2hvdWxkIGNvbnRhaW4gdGV4dCBwcm92aWRpbmcgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgZGVjb3JhdG9yLiBUaGlzIHdpbGwgYmUgc2hvd24gaW4gdGhlIERlY29yYXRvcnMgcHJlZmVyZW5jZSBwYWdlIHNvIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBpcyBpbmNsdWRlZC4gRGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eSBTdHJpbmcuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFJlbGVhc2UgMi4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgYXJlIGV4YW1wbGUgb2YgZGVjb3JhdG9yczoKLSZsdDtwJmd0OwotQSBmdWxsIGRlY29yYXRvci4gVGhlIHBsdWctaW4gZGV2ZWxvcGVyIG11c3QgaGFuZGxlIHRoZWlyIG93biBpbWFnZSBzdXBwb3J0LgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyZxdW90OyZndDsgCi0gICAgICAgICZsdDtkZWNvcmF0b3IKLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS54eXouZGVjb3JhdG9yJnF1b3Q7IAotICAgICAgICAgICAgbGFiZWw9JnF1b3Q7WFlaIERlY29yYXRvciZxdW90OyAKLSAgICAgICAgICAgIHN0YXRlPSZxdW90O3RydWUmcXVvdDsgCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LkRlY29yYXRvckNvbnRyaWJ1dG9yJnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0O2VuYWJsZW1lbnQmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O29iamVjdENsYXNzIG5hbWU9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlJnF1b3Q7LyZndDsgCi0gICAgICAgICAgICAmbHQ7L2VuYWJsZW1lbnQmZ3Q7Ci0gICAgICAgICZsdDsvZGVjb3JhdG9yJmd0OwotICAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotCi0mbHQ7cCZndDsKLUEgbGlnaHR3ZWlnaHQgZGVjb3JhdG9yLiBUaGVyZSBpcyBhIGNvbmNyZXRlIGNsYXNzIGJ1dCBhcyBpdCBpcyBhbgotSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgaXQgb25seSBuZWVkcyB0byBzdXBwbHkgdGV4dCBhbmQgYW4gSW1hZ2VEZXNjcmlwdG9yIGFuZCB0aGVyZWZvcmUgbmVlZHMgbm8gcmVzb3VyY2UgaGFuZGxpbmcuCi0mbHQ7L3AmZ3Q7Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMmcXVvdDsmZ3Q7IAotICAgICAgICAmbHQ7ZGVjb3JhdG9yCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20ueHl6LmxpZ2h0d2VpZ2h0LmRlY29yYXRvciZxdW90OyAKLSAgICAgICAgICAgIGxhYmVsPSZxdW90O1hZWiBMaWdodHdlaWdodCBEZWNvcmF0b3ImcXVvdDsgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgc3RhdGU9JnF1b3Q7ZmFsc2UmcXVvdDsgCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LkxpZ2h0d2VpZ2h0RGVjb3JhdG9yQ29udHJpYnV0b3ImcXVvdDsgCi0gICAgICAgICAgICBsaWdodHdlaWdodD0mcXVvdDt0cnVlJnF1b3Q7ICZndDsKLSAgICAgICAgICAgICZsdDtlbmFibGVtZW50Jmd0OwotICAgICAgICAgICAgICAgICZsdDtvYmplY3RDbGFzcyBuYW1lPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSZxdW90Oy8mZ3Q7IAotICAgICAgICAgICAgJmx0Oy9lbmFibGVtZW50Jmd0OwotICAgICAgICAmbHQ7L2RlY29yYXRvciZndDsKLSAgICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0O0EgZGVjbGFyYXRpdmUgbGlnaHR3ZWlnaHQgZGVjb3JhdG9yLiBUaGVyZSBpcyBubyBjb25jcmV0ZSBjbGFzcyBzbyBpdAotc3VwcGxpZXMgYW4gaWNvbiBhbmQgYSBxdWFkcmFudCB0byBhcHBseSB0aGF0IGljb24uCi0mbHQ7L3AmZ3Q7Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMmcXVvdDsmZ3Q7IAotICAgICAgICAmbHQ7ZGVjb3JhdG9yCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20ueHl6LmxpZ2h0d2VpZ2h0LmRlY2xhcmF0aXZlLmRlY29yYXRvciZxdW90OyAKLSAgICAgICAgICAgIGxhYmVsPSZxdW90O1hZWiBMaWdodHdlaWdodCBEZWNsYXJhdGl2ZSBEZWNvcmF0b3ImcXVvdDsgCi0gICAgICAgICAgICBzdGF0ZT0mcXVvdDtmYWxzZSZxdW90OyAKLSAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSZxdW90O3RydWUmcXVvdDsgCi0gICAgICAgICAgICBpY29uPSZxdW90O2ljb25zL2Z1bGwvZGVjbGFyYXRpdmUuZ2lmJnF1b3Q7IAotICAgICAgICAgICAgbG9jYXRpb249JnF1b3Q7VE9QX0xFRlQmcXVvdDsmZ3Q7IAotICAgICAgICAgICAgJmx0O2VuYWJsZW1lbnQmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O29iamVjdENsYXNzIG5hbWU9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlJnF1b3Q7LyZndDsgCi0gICAgICAgICAgICAmbHQ7L2VuYWJsZW1lbnQmZ3Q7Ci0gICAgICAgICZsdDsvZGVjb3JhdG9yJmd0OwotICAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSAmbHQ7c2FtcCZndDtjbGFzcyZsdDsvc2FtcCZndDsgYXR0cmlidXRlIG11c3QgYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvciZsdDsvc2FtcCZndDsgKGlmIGxpZ2h0d2VpZ2h0IGlzIGZhbHNlKSBvciAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yJmx0Oy9zYW1wJmd0Oy4gIFRoaXMgY2xhc3MgaXMgbG9hZGVkIGFzIGxhdGUgYXMgcG9zc2libGUgdG8gYXZvaWQgbG9hZGluZyB0aGUgZW50aXJlIHBsdWctaW4gYmVmb3JlIGl0IGlzIHJlYWxseSBuZWVkZWQuIERlY2xhcmF0aXZlIGRlY29yYXRvcnMgZG8gbm90IGVudGFpbCBhbnkgcGx1Zy1pbiBhY3RpdmF0aW9uIGFuZCBzaG91bGQgYmUgdXNlZCB3aGVuZXZlciBwb3NzaWJsZS4gTm9uLWxpZ2h0d2VpZ2h0IGRlY29yYXRvcnMgd2lsbCBldmVudHVhbGx5IGJlIGRlcHJlY2F0ZWQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFBsdWctaW5zIG1heSB1c2UgdGhpcyBleHRlbnNpb24gcG9pbnQgdG8gYWRkIG5ldyBkZWNvcmF0b3JzIHRvIGJlIGFwcGxpZWQgdG8gdmlld3MgdGhhdCB1c2UgdGhlIGRlY29yYXRvciBtYW5hZ2VyIGFzIHRoZWlyIGxhYmVsIGRlY29yYXRvci4KLVRvIHVzZSB0aGUgZGVjb3JhdG9yIG1hbmFnZXIsIHVzZSB0aGUgcmVzdWx0IG9mIElWaWV3UGFydC5nZXREZWNvcmF0b3JNYW5hZ2VyKCkgYXMgdGhlIGRlY29yYXRvciBmb3IgYW4gaW5zdGFuY2Ugb2YgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIuCi1UaGlzIGlzIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhlIFJlc291cmNlIE5hdmlnYXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9kcm9wQWN0aW9ucy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvZHJvcEFjdGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZDYxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9kcm9wQWN0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9ImRyb3BBY3Rpb25zIiBuYW1lPSJEcm9wIEFjdGlvbnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhZGQgZHJvcCBiZWhhdmlvdXIgdG8gCi12aWV3cyBkZWZpbmVkIGJ5IG90aGVyIHBsdWdpbnMuIAotJmx0O3AmZ3Q7Ci1EdWUgdG8gdGhlIFVJIGxheWVyaW5nIGltcG9zZWQgYnkgdGhlIHBsdWdpbiAKLW1lY2hhbmlzbSwgdmlld3MgYXJlIG9mdGVuIG5vdCBhd2FyZSBvZiB0aGUgY29udGVudCAKLWFuZCBuYXR1cmUgb2Ygb3RoZXIgdmlld3MuIFRoaXMgY2FuIG1ha2UgZHJhZyBhbmQgCi1kcm9wIG9wZXJhdGlvbnMgYmV0d2VlbiBwbHVnaW5zIGRpZmZpY3VsdC4gCi1Gb3IgZXhhbXBsZSwgb25lIG1heSB3aXNoIHRvIHByb3ZpZGUgSmF2YSAKLXJlZmFjdG9yaW5nIHN1cHBvcnQgd2hlcmVieSB0aGUgdXNlciBkcmFncyBhIAotbWV0aG9kIGZyb20gdGhlIEphdmEgZWRpdG9yJmFwb3M7cyBjb250ZW50IG91dGxpbmVyIAotaW50byBhbm90aGVyIGphdmEgZmlsZSBpbiB0aGUgcmVzb3VyY2UgbmF2aWdhdG9yLiAKLVNpbmNlIHRoZSByZXNvdXJjZSBuYXZpZ2F0b3IgZG9lc24mYXBvczt0IGtub3cgYW55dGhpbmcgCi1hYm91dCBKYXZhIGNvbnRlbnQsIGl0IGRvZXNuJmFwb3M7dCBrbm93IGhvdyB0byBiZWhhdmUgCi13aGVuIGphdmEgbWV0aG9kcyBhcmUgZHJvcHBlZCBvbnRvIGl0LiAgCi1TaW1pbGFybHksIGFuIElTViBtYXkgd2FudCB0byBkcm9wIHNvbWUgb2YgCi10aGVpciBjb250ZW50IGludG8gb25lIG9mIHRoZSBKYXZhIHZpZXdlcnMuIAotJmx0O3AmZ3Q7Ci1UaGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuZHJvcEFjdGlvbnMmbHQ7L3NhbXAmZ3Q7IGV4dGVuc2lvbiBwb2ludCBpcyAKLXByb3ZpZGVkIGJ5IHRoZSBQbGF0Zm9ybSB0byBhZGRyZXNzIHRoZXNlIHNpdHVhdGlvbnMuIAotVGhpcyBtZWNoYW5pc20gZGVsZWdhdGVzIHRoZSBkcm9wIGJlaGF2aW91ciBiYWNrIHRvIAotdGhlIG9yaWdpbmF0b3Igb2YgdGhlIGRyYWcgb3BlcmF0aW9uLiAKLVRoaXMgYmVoYXZpb3VyIGlzIGNvbnRhaW5lZCBpbiBhbiBhY3Rpb24gdGhhdCAKLW11c3QgaW1wbGVtZW50IAotJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkucGFydC5JRHJvcEFjdGlvbkRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4gIAotVGhlIHZpZXdlciB0aGF0IGlzIHRoZSBzb3VyY2Ugb2YgdGhlIGRyYWcgCi1vcGVyYXRpb24gbXVzdCBzdXBwb3J0IAotJmx0O3NhbXAmZ3Q7dGhlIG9yZy5lY2xpcHNlLnVpLnBhcnQuUGx1Z2luVHJhbnNmZXImbHQ7L3NhbXAmZ3Q7Ci10cmFuc2ZlciB0eXBlLCBhbmQgcGxhY2UgYSAKLSZsdDtzYW1wJmd0O1BsdWdpblRyYW5zZmVyRGF0YSZsdDsvc2FtcCZndDsgb2JqZWN0IGluIHRoZSBkcmFnIGV2ZW50LgotU2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlciNhZGREcmFnU3VwcG9ydCAKLXRvIGxlYXJuIGhvdyB0byBhZGQgZHJhZyBzdXBwb3J0IHRvIGEgdmlld2VyLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFjdGlvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhY3Rpb24KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLnBhcnQuSURyb3BBY3Rpb25EZWxlZ2F0ZSZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS5wYXJ0LklEcm9wQWN0aW9uRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgZHJvcCBhY3Rpb24gZXh0ZW5zaW9uOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmRyb3BBY3Rpb25zJnF1b3Q7Jmd0OyAKLSAgICAgICAgJmx0O2FjdGlvbiAKLSAgICAgICAgICAgIGlkPSZxdW90O215X2Ryb3BfYWN0aW9uJnF1b3Q7IAotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei5lY2xpcHNlLlRlc3REcm9wQWN0aW9uJnF1b3Q7Jmd0OyAKLSAgICAgICAgJmx0Oy9hY3Rpb24mZ3Q7IAotICAgICZsdDsvZXh0ZW5zaW9uJmd0OyAgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIGRyYWcgbGlzdGVuZXIgdGhhdCBtYWtlcyB1c2Ugb2YgdGhlIGRyb3AKLWFjdGlvbiBkZWZpbmVkIGFib3ZlLgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OyAKLWNsYXNzIE15RHJhZ0xpc3RlbmVyIGV4dGVuZHMgRHJhZ1NvdXJjZUFkYXB0ZXIgeyAKLSAgICBwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsgCi0gICAgICAgIGlmIChQbHVnaW5UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsgCi0gICAgICAgICAgICBieXRlW10gZGF0YVRvU2VuZCA9IC4uLi8vZW50ZXIgdGhlIGRhdGEgdG8gYmUgc2VudC4gCi0gICAgICAgICAgICBldmVudC5kYXRhID0gbmV3IFBsdWdpblRyYW5zZmVyRGF0YSggCi0gICAgICAgICAgICAgICAgJnF1b3Q7bXlfZHJvcF9hY3Rpb24mcXVvdDssIGRhdGFUb1NlbmQpOyAKLSAgICAgICAgfSAKLSAgICB9IAotfSAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotRm9yIGEgbW9yZSBjb21wbGV0ZSBleGFtcGxlLCBzZWUgdGhlIFBsYXRmb3JtIAotcmVhZG1lIGV4YW1wbGUuICBJbiB0aGF0IGV4YW1wbGUsIGEgZHJvcCBhY3Rpb24gaXMgCi1kZWZpbmVkIGluIFJlYWRtZURyb3BBY3Rpb25EZWxlZ2F0ZSwgYW5kIGl0IGlzIHVzZWQgCi1ieSBSZWFkbWVDb250ZW50T3V0bGluZURyYWdMaXN0ZW5lci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIGNsYXNzIGF0dHJpYnV0ZSBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5wYXJ0LklEcm9wQWN0aW9uRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7LiBUaGlzIGNsYXNzIGlzIGxvYWRlZCBhcyBsYXRlIGFzIHBvc3NpYmxlIHRvIGF2b2lkIGxvYWRpbmcgdGhlIGVudGlyZSBwbHVnLWluIGJlZm9yZSBpdCBpcyByZWFsbHkgbmVlZGVkCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB3b3JrYmVuY2ggZG9lcyBub3QgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQuIFBsdWctaW5zIGNhbiBjb250cmlidXRlIHRvIHRoaXMgZXh0ZW5zaW9uIHBvaW50IHRvIGFkZCBkcm9wIGJlaGF2aW9yIHRvIHZpZXdzIGRlZmluZWQgYnkgb3RoZXIgcGx1Z2lucy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9lZGl0b3JBY3Rpb25zLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9lZGl0b3JBY3Rpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YmExYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvZWRpdG9yQWN0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9ImVkaXRvckFjdGlvbnMiIG5hbWU9IkVkaXRvciBNZW51cywgVG9vbGJhcnMgYW5kIEFjdGlvbnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhZGQgYWN0aW9ucyB0byB0aGUgbWVudSAKLWFuZCB0b29sYmFyIGZvciBlZGl0b3JzIHJlZ2lzdGVyZWQgYnkgb3RoZXIgcGx1Zy1pbnMuIAotJmx0O3AmZ3Q7Ci1UaGUgaW5pdGlhbCBjb250cmlidXRpb24gc2V0IGZvciBhbiBlZGl0b3IgaXMgZGVmaW5lZCAKLWJ5IGFub3RoZXIgZXh0ZW5zaW9uIHBvaW50IChvcmcuZWNsaXBzZS51aS5lZGl0b3JzKS4gCi1PbmUgc2V0IG9mIGFjdGlvbnMgaXMgY3JlYXRlZCBhbmQgc2hhcmVkIGJ5IGFsbCAKLWluc3RhbmNlcyBvZiB0aGUgc2FtZSBlZGl0b3IgdHlwZS4gIFdoZW4gaW52b2tlZCwgCi10aGVzZSBhY3Rpb24gYWN0IHVwb24gdGhlIGFjdGl2ZSBlZGl0b3IuICBUaGlzIAotZXh0ZW5zaW9uIHBvaW50IGZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybi4gIEVhY2ggCi1hY3Rpb24gZXh0ZW5zaW9uIGlzIGNyZWF0ZWQgYW5kIHNoYXJlZCBieSBhbGwgCi1pbnN0YW5jZXMgb2YgdGhlIHNhbWUgZWRpdG9yIHR5cGUuICBUaGUgYWN0aW9uIAotY2xhc3MgaXMgcmVxdWlyZWQgdG8gaW1wbGVtZW50IAotJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4gIAotVGhlIGFjdGl2ZSBlZGl0b3IgaXMgcGFzc2VkIHRvIHRoZSBkZWxlZ2F0ZSBieSBpbnZva2luZyAKLSZsdDtzYW1wJmd0O0lFZGl0b3JBY3Rpb25EZWxlZ2F0ZS5zZXRBY3RpdmVFZGl0b3ImbHQ7L3NhbXAmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iY29tbW9uQWN0aW9uLmV4c2QiLz4KLQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImNvbW1vbkV4cHJlc3Npb24uZXhzZCIvPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlZGl0b3JDb250cmlidXRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVkaXRvckNvbnRyaWJ1dGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gZGVmaW5lIGEgZ3JvdXAgb2YgZWRpdG9yIGFjdGlvbnMgYW5kL29yIG1lbnVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtZW51IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGNvbnRyaWJ1dGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXRJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGEgcmVnaXN0ZXJlZCBlZGl0b3IgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoaXMgY29udHJpYnV0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhY3Rpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImxhYmVsIiBpY29uPSJpY29uIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIGFuIGFjdGlvbiB0aGF0IHRoZSB1c2VyIGNhbiBpbnZva2UgaW4gdGhlIFVJLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VsZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciB0aGlzIGFjdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgZWl0aGVyIGFzIHRoZSBtZW51IGl0ZW0gdGV4dCBvciB0b29sYmFyIGJ1dHRvbiBsYWJlbC4gIFRoZSBuYW1lIGNhbiBpbmNsdWRlIG1uZW5vbWljIGluZm9ybWF0aW9uLiBUaGlzIGxhYmVsIHNob3VsZCBlaXRoZXIgYmUgbm9uLWVtcHR5IG9yIGEgZGVmaW5pdGlvbklkIHNob3VsZCBiZSBwcm92aWRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFjY2VsZXJhdG9yIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICZsdDtiJmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyNGRjAwMDAmcXVvdDsmZ3Q7RGVwcmVjYXRlZDombHQ7L2ZvbnQmZ3Q7Jmx0Oy9iJmd0OyBVc2UgdGhlICZsdDtzYW1wJmd0O2RlZmluaXRpb25JZCZsdDsvc2FtcCZndDsgYXR0cmlidXRlIGluc3RlYWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmaW5pdGlvbklkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgY29tbWFuZCB0aGF0IHRoaXMgYWN0aW9uIHdpbGwgaGFuZGxlLiBCeSBzcGVjaWZ5aW5nIGFuZCBhY3Rpb24sIHRoZSBrZXkgYmluZGluZyBzZXJ2aWNlIGNhbiBhc3NpZ24gYSBrZXkgc2VxdWVuY2UgdG8gdGhpcyBhY3Rpb24uIFNlZSB0aGUgZXh0ZW5zaW9uIHBvaW50ICZsdDthIGhyZWY9JnF1b3Q7b3JnX2VjbGlwc2VfdWlfY29tbWFuZHMuaHRtbCZxdW90OyZndDtvcmcuZWNsaXBzZS51aS5jb21tYW5kcyZsdDsvYSZndDsgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWVudWJhclBhdGgiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBzbGFzaC1kZWxpbWl0ZWQgcGF0aCAoJmFwb3M7LyZhcG9zOykgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGlzIGFjdGlvbiBpbiB0aGUgbWVudSBiYXIuCi1FYWNoIHRva2VuIGluIHRoZSBwYXRoLCBleGNlcHQgdGhlIGxhc3Qgb25lLCBtdXN0IHJlcHJlc2VudCBhIHZhbGlkIGlkZW50aWZpZXIgb2YgYW4gZXhpc3RpbmcgbWVudSBpbiB0aGUgaGllcmFyY2h5LiBUaGUgbGFzdCB0b2tlbiByZXByZXNlbnRzIHRoZSBuYW1lZCBncm91cCBpbnRvIHdoaWNoIHRoaXMgYWN0aW9uIHdpbGwgYmUgYWRkZWQuIElmIHRoZSBwYXRoIGlzIG9taXR0ZWQsIHRoaXMgYWN0aW9uIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgbWVudSBiYXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9vbGJhclBhdGgiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBzbGFzaC1kZWxpbWl0ZWQgcGF0aCAoJmFwb3M7LyZhcG9zOykgdGhhdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoaXMgYWN0aW9uIGluIHRoZSB0b29sYmFyLiBUaGUgZmlyc3QgdG9rZW4gcmVwcmVzZW50cyB0aGUgdG9vbGJhciBpZGVudGlmaWVyICh3aXRoICZxdW90O05vcm1hbCZxdW90OyBiZWluZyB0aGUgZGVmYXVsdCB0b29sYmFyKSwgd2hpbGUgdGhlIHNlY29uZCB0b2tlbiBpcyB0aGUgbmFtZWQgZ3JvdXAgd2l0aGluIHRoZSB0b29sYmFyIHRoYXQgdGhpcyBhY3Rpb24gd2lsbCBiZSBhZGRlZCB0by4gSWYgdGhlIGdyb3VwIGRvZXMgbm90IGV4aXN0IGluIHRoZSB0b29sYmFyLCBpdCB3aWxsIGJlIGNyZWF0ZWQuCi1JZiB0b29sYmFyUGF0aCBpcyBvbWl0dGVkLCB0aGUgYWN0aW9uIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgdG9vbGJhci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcmVsYXRpdmUgcGF0aCBvZiBhbiBpY29uIHVzZWQgdG8gdmlzdWFsbHkgcmVwcmVzZW50IHRoZSBhY3Rpb24gaW4gaXRzIGNvbnRleHQuCi1JZiBvbWl0dGVkIGFuZCB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIHRvb2xiYXIsIHRoZSBXb3JrYmVuY2ggd2lsbCB1c2UgYSBwbGFjZWhvbGRlciBpY29uLiBUaGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHBsdWdpbi54bWwgZmlsZSBvZiB0aGUgY29udHJpYnV0aW5nIHBsdWctaW4uIFRoZSBpY29uIHdpbGwgYXBwZWFyIGluIHRvb2xiYXJzIGJ1dCBub3QgaW4gbWVudXMuIEVuYWJsZWQgYWN0aW9ucyB3aWxsIGJlIHJlcHJlc2VudGVkIGluIG1lbnVzIGJ5IHRoZSBob3Zlckljb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpc2FibGVkSWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHJlbGF0aXZlIHBhdGggb2YgYW4gaWNvbiB1c2VkIHRvIHZpc3VhbGx5IHJlcHJlc2VudCB0aGUgYWN0aW9uIGluIGl0cyBjb250ZXh0IHdoZW4gdGhlIGFjdGlvbiBpcyBkaXNhYmxlZC4gSWYgb21pdHRlZCwgdGhlIG5vcm1hbCBpY29uIHdpbGwgc2ltcGx5IGFwcGVhciBncmV5ZWQgb3V0LiBUaGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHBsdWdpbi54bWwgZmlsZSBvZiB0aGUgY29udHJpYnV0aW5nIHBsdWctaW4uIFRoZSBkaXNhYmxlZCBpY29uIHdpbGwgYXBwZWFyIGluIHRvb2xiYXJzIGJ1dCBub3QgaW4gbWVudXMuIEljb25zIGZvciBkaXNhYmxlZCBhY3Rpb25zIGluIG1lbnVzIHdpbGwgYmUgc3VwcGxpZWQgYnkgdGhlIE9TLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJob3Zlckljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSByZWxhdGl2ZSBwYXRoIG9mIGFuIGljb24gdXNlZCB0byB2aXN1YWxseSByZXByZXNlbnQgdGhlIGFjdGlvbiBpbiBpdHMgY29udGV4dCB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIGlzIG92ZXIgdGhlIGFjdGlvbi4gSWYgb21pdHRlZCwgdGhlIG5vcm1hbCBpY29uIHdpbGwgYmUgdXNlZC4gVGhlIHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBwbHVnaW4ueG1sIGZpbGUgb2YgdGhlIGNvbnRyaWJ1dGluZyBwbHVnLWluLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b29sdGlwIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIHRleHQgcmVwcmVzZW50aW5nIHRoZSBhY3Rpb24mYXBvcztzIHRvb2wgdGlwLiBPbmx5IHVzZWQgaWYgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSB0b29sYmFyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGVscENvbnRleHRJZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIGluZGljYXRpbmcgdGhlIGhlbHAgY29udGV4dCBmb3IgdGhpcyBhY3Rpb24uIElmIHRoZSBhY3Rpb24gYXBwZWFycyBhcyBhIG1lbnUgaXRlbSwgdGhlbiBwcmVzc2luZyBGMSB3aGlsZSB0aGUgbWVudSBpdGVtIGlzIGhpZ2hsaWdodGVkIHdpbGwgZGlzcGxheSBoZWxwLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0eWxlIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJwdXNoIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgdG8gZGVmaW5lIHRoZSB1c2VyIGludGVyZmFjZSBzdHlsZSB0eXBlIGZvciB0aGUgYWN0aW9uLiBJZiBkZWZpbmVkLCB0aGUgYXR0cmlidXRlIHZhbHVlIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgJmx0O3RhYmxlIGJvcmRlcj0mcXVvdDswJnF1b3Q7IHdpZHRoPSZxdW90OzgwJSZxdW90OyZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7cHVzaCZsdDsvYiZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyZndDstIGFzIGEgcmVndWxhciBtZW51IGl0ZW0gb3IgdG9vbCBpdGVtLiZsdDsvdGQmZ3Q7Ci0gICAgICAmbHQ7L3RyJmd0OwotICAgICAgJmx0O3RyJmd0OwotICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzI1JnF1b3Q7Jmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IG5vd3JhcCZndDsmbHQ7YiZndDtyYWRpbyZsdDsvYiZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyZndDstIGFzIGEgcmFkaW8gc3R5bGUgbWVudSBpdGVtIG9yIHRvb2wgaXRlbS4gQWN0aW9ucyB3aXRoIHRoZSByYWRpbyBzdHlsZSB3aXRoaW4gdGhlIHNhbWUgbWVudSBvciB0b29sYmFyIGdyb3VwIGJlaGF2ZSBhcyBhIHJhZGlvIHNldC4gVGhlIGluaXRpYWwgdmFsdWUgaXMgc3BlY2lmaWVkIGJ5IHRoZSAmbHQ7c2FtcCZndDtzdGF0ZSZsdDsvc2FtcCZndDsgYXR0cmlidXRlLiZsdDsvdGQmZ3Q7Ci0gICAgICAmbHQ7L3RyJmd0OwotICAgICAgJmx0O3RyJmd0OwotICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzI1JnF1b3Q7Jmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IG5vd3JhcCZndDsmbHQ7YiZndDt0b2dnbGUmbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSBhcyBhIGNoZWNrZWQgc3R5bGUgbWVudSBpdGVtIG9yIGFzIGEgdG9nZ2xlIHRvb2wgaXRlbS4gVGhlIGluaXRpYWwgdmFsdWUgaXMgc3BlY2lmaWVkIGJ5IHRoZSAmbHQ7c2FtcCZndDtzdGF0ZSZsdDsvc2FtcCZndDsgYXR0cmlidXRlLiZsdDsvdGQmZ3Q7Ci0gICAgICAmbHQ7L3RyJmd0OwotICAgICZsdDsvdGFibGUmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJwdXNoIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InJhZGlvIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InRvZ2dsZSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGF0ZSIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIGluaXRpYWwgc3RhdGUgKGVpdGhlciAmbHQ7c2FtcCZndDt0cnVlJmx0Oy9zYW1wJmd0OyBvciAmbHQ7c2FtcCZndDtmYWxzZSZsdDsvc2FtcCZndDspLCB1c2VkIHdoZW4gdGhlICZsdDtzYW1wJmd0O3N0eWxlJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUgaGFzIHRoZSB2YWx1ZSAmbHQ7c2FtcCZndDtyYWRpbyZsdDsvc2FtcCZndDsgb3IgJmx0O3NhbXAmZ3Q7dG9nZ2xlJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmFibGVzRm9yIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdmFsdWUgaW5kaWNhdGluZyB0aGUgc2VsZWN0aW9uIGNvdW50IHdoaWNoIG11c3QgYmUgbWV0IHRvIGVuYWJsZSB0aGUgYWN0aW9uLgotSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgY29uZGl0aW9uIGlzIG1ldCwgdGhlIGFjdGlvbiBpcyBlbmFibGVkLgotSWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LCB0aGUgYWN0aW9uIGlzIGRpc2FibGVkLgotSWYgbm8gYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBpcyBlbmFibGVkIGZvciBhbnkgbnVtYmVyIG9mIGl0ZW1zIHNlbGVjdGVkLgotVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgZm9ybWF0cyBhcmUgc3VwcG9ydGVkOiAKLSAgICAmbHQ7dGFibGUgYm9yZGVyPSZxdW90OzAmcXVvdDsgd2lkdGg9JnF1b3Q7ODAlJnF1b3Q7Jmd0OwotICAgICAgJmx0O3RyJmd0OwotICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzI1JnF1b3Q7Jmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IG5vd3JhcCZndDsmbHQ7YiZndDshJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7Jmd0Oy0gMCBpdGVtcyBzZWxlY3RlZCZsdDsvdGQmZ3Q7Ci0gICAgICAmbHQ7L3RyJmd0OwotICAgICAgJmx0O3RyJmd0OwotICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzI1JnF1b3Q7Jmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IG5vd3JhcCZndDsmbHQ7YiZndDs/Jmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7Jmd0Oy0gMCBvciAxIGl0ZW1zIHNlbGVjdGVkJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0OysmbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSAxIG9yIG1vcmUgaXRlbXMgc2VsZWN0ZWQmbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7bXVsdGlwbGUsIDIrJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7Jmd0Oy0gMiBvciBtb3JlIGl0ZW1zIHNlbGVjdGVkJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0O24mbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSBhIHByZWNpc2UgbnVtYmVyIG9mIGl0ZW1zIHNlbGVjdGVkLmEgcHJlY2lzZSBudW1iZXIgb2YgaXRlbXMgc2VsZWN0ZWQuJmFtcDtuYnNwOwotICAgICAgICAgIEZvciBleGFtcGxlOiBlbmFibGVzRm9yPSZhbXA7cXVvdDsgNCZhbXA7cXVvdDsgZW5hYmxlcyB0aGUgYWN0aW9uIG9ubHkgd2hlbiA0Ci0gICAgICAgICAgaXRlbXMgYXJlIHNlbGVjdGVkJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0OyombHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSBhbnkgbnVtYmVyIG9mIGl0ZW1zIHNlbGVjdGVkJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgJmx0Oy90YWJsZSZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhY3Rpb25JRCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJbnRlcm5hbCB0YWcgZm9yIHVzZSBieSB0aGUgdGV4dCBlZGl0b3JzLiBTaG91bGQgbm90IGJlIHVzZWQgYnkgcGx1Zy1pbiBkZXZlbG9wZXJzLiAgVGhlIGZvbGxvd2luZyBJRHMgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgZm9yIHRoZSB0ZXh0IGVkaXRvciBmcmFtZXdvcms6Ci0mbHQ7dWwmZ3Q7Ci0mbHQ7bGkmZ3Q7JnF1b3Q7UnVsZXJDbGljayZxdW90OzogdGhlIGNvbnRyaWJ1dGVkIGFjdGlvbiB3aGljaCBpcyBpbnZva2VkIHVwb24gc2luZ2xlLWNsaWNrIGluIHRoZSAobGVmdCkgdmVydGljYWwgcnVsZXImbHQ7L2xpJmd0OwotJmx0O2xpJmd0OyZxdW90O1J1bGVyRG91YmxlQ2xpY2smcXVvdDs6IHRoZSBjb250cmlidXRlZCBhY3Rpb24gd2hpY2ggaXMgaW52b2tlZCB1cG9uIHNpbmdsZS1jbGljayBpbiB0aGUgKGxlZnQpIHZlcnRpY2FsIHJ1bGVyJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7Ci0mbHQ7cCZndDsKLUlmIG11bHRpcGxlIGV4dGVuc2lvbnMgY29udHJpYnV0ZSBydWxlciBhY3Rpb25zIHRvIHRoZSBzYW1lIHRleHQgZWRpdG9yLCB0aGUgZXh0ZW5zaW9uIHdob3NlIHBsdWctaW4gaXMgYXQgdGhlIHRvcCBvZiB0aGUgcHJlcmVxdWlzaXRlIHRyZWUgd2lucy4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHN1Y2ggcGx1Zy1pbnMsIHRoZSBmaXJzdCB3aW5zLgotJmx0Oy9wJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gZWRpdG9yIGFjdGlvbiBleHRlbnNpb246IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zJnF1b3Q7Jmd0OyAKLSAgICAgICZsdDtlZGl0b3JDb250cmlidXRpb24gCi0gICAgICAgICBpZD0mcXVvdDtjb20ueHl6Lnh5ekNvbnRyaWJ1dGlvbiZxdW90OyAKLSAgICAgICAgIHRhcmdldElEPSZxdW90O2NvbS5pYm0uWE1MRWRpdG9yJnF1b3Q7Jmd0OyAKLSAgICAgICAgICZsdDttZW51Ci0gICAgICAgICAgICBpZD0mcXVvdDtYWVomcXVvdDsKLSAgICAgICAgICAgIGxhYmVsPSZxdW90OyZhbXA7YW1wO1hZWiBNZW51JnF1b3Q7Jmd0OyAKLSAgICAgICAgICAgICZsdDtzZXBhcmF0b3IgbmFtZT0mcXVvdDtncm91cDEmcXVvdDsvJmd0OyAKLSAgICAgICAgICZsdDsvbWVudSZndDsgCi0gICAgICAgICAmbHQ7YWN0aW9uIAotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei5ydW5YWVomcXVvdDsgCi0gICAgICAgICAgICBsYWJlbD0mcXVvdDsmYW1wO2FtcDtSdW4gWFlaIFRvb2wmcXVvdDsgCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0mcXVvdDtYWVovZ3JvdXAxJnF1b3Q7IAotICAgICAgICAgICAgdG9vbGJhclBhdGg9JnF1b3Q7Tm9ybWFsL2FkZGl0aW9ucyZxdW90OwotICAgICAgICAgICAgc3R5bGU9JnF1b3Q7dG9nZ2xlJnF1b3Q7Ci0gICAgICAgICAgICBzdGF0ZT0mcXVvdDt0cnVlJnF1b3Q7IAotICAgICAgICAgICAgaWNvbj0mcXVvdDtpY29ucy9ydW5YWVouZ2lmJnF1b3Q7IAotICAgICAgICAgICAgdG9vbHRpcD0mcXVvdDtSdW4gWFlaIFRvb2wmcXVvdDsgCi0gICAgICAgICAgICBoZWxwQ29udGV4dElkPSZxdW90O2NvbS54eXoucnVuX2FjdGlvbl9jb250ZXh0JnF1b3Q7IAotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei5hY3Rpb25zLlJ1blhZWiZxdW90OyZndDsgCi0gICAgICAgICAgICAmbHQ7c2VsZWN0aW9uIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlJnF1b3Q7IG5hbWU9JnF1b3Q7Ki5qYXZhJnF1b3Q7LyZndDsgCi0gICAgICAgICAmbHQ7L2FjdGlvbiZndDsgCi0gICAgICAmbHQ7L2VkaXRvckNvbnRyaWJ1dGlvbiZndDsgCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBzcGVjaWZpZWQgYWN0aW9uIHdpbGwgYXBwZWFyIGFzIGEgY2hlY2sgYm94IGl0ZW0gaW4gdGhlIG5ldyB0b3AtbGV2ZWwgbWVudSBuYW1lZCAmcXVvdDtYWVogTWVudSZxdW90OywgYW5kIGFzIGEgdG9nZ2xlIGJ1dHRvbiBpbiB0aGUgdG9vbGJhci4gVGhlIGFjdGlvbiBpcyBlbmFibGVkIGlmIHRoZSBzZWxlY3Rpb24gY29udGFpbnMgb25seSBKYXZhIGZpbGUgcmVzb3VyY2VzLgotJmx0O3AmZ3Q7Ci1UaGUgZm9sbG93aW5nIGlzIGFuIG90aGVyIGV4YW1wbGUgb2YgYW4gZWRpdG9yIGFjdGlvbiBleHRlbnNpb246IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zJnF1b3Q7Jmd0OyAKLSAgICAgICZsdDtlZGl0b3JDb250cmlidXRpb24gCi0gICAgICAgICBpZD0mcXVvdDtjb20ueHl6Lnh5ejJDb250cmlidXRpb24mcXVvdDsgCi0gICAgICAgICB0YXJnZXRJRD0mcXVvdDtjb20uaWJtLlhNTEVkaXRvciZxdW90OyZndDsgCi0gICAgICAgICAmbHQ7bWVudSAKLSAgICAgICAgICAgIGlkPSZxdW90O1hZWjImcXVvdDsgCi0gICAgICAgICAgICBsYWJlbD0mcXVvdDsmYW1wO2FtcDtYWVoyIE1lbnUmcXVvdDsgCi0gICAgICAgICAgICBwYXRoPSZxdW90O2VkaXQvYWRkaXRpb25zJnF1b3Q7Jmd0OyAKLSAgICAgICAgICAgICZsdDtzZXBhcmF0b3IgbmFtZT0mcXVvdDtncm91cDEmcXVvdDsvJmd0OyAKLSAgICAgICAgICZsdDsvbWVudSZndDsgCi0gICAgICAgICAmbHQ7YWN0aW9uIAotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei5ydW5YWVoyJnF1b3Q7IAotICAgICAgICAgICAgbGFiZWw9JnF1b3Q7JmFtcDthbXA7UnVuIFhZWjIgVG9vbCZxdW90OyAKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSZxdW90O2VkaXQvWFlaMi9ncm91cDEmcXVvdDsKLSAgICAgICAgICAgIHN0eWxlPSZxdW90O3B1c2gmcXVvdDsKLSAgICAgICAgICAgIGljb249JnF1b3Q7aWNvbnMvcnVuWFlaMi5naWYmcXVvdDsgCi0gICAgICAgICAgICB0b29sdGlwPSZxdW90O1J1biBYWVoyIFRvb2wmcXVvdDsgCi0gICAgICAgICAgICBoZWxwQ29udGV4dElkPSZxdW90O2NvbS54eXoucnVuX2FjdGlvbl9jb250ZXh0MiZxdW90OyAKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS54eXouYWN0aW9ucy5SdW5YWVoyJnF1b3Q7Jmd0OyAKLSAgICAgICAgICAgICZsdDtlbmFibGVtZW50Jmd0OwotICAgICAgICAgICAgICAgJmx0O2FuZCZndDsKLSAgICAgICAgICAgICAgICAgICZsdDtvYmplY3RDbGFzcyBuYW1lPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICAgICAgICZsdDtub3QmZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAmbHQ7b2JqZWN0U3RhdGUgbmFtZT0mcXVvdDtleHRlbnNpb24mcXVvdDsgdmFsdWU9JnF1b3Q7amF2YSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAmbHQ7L25vdCZndDsKLSAgICAgICAgICAgICAgICZsdDsvYW5kJmd0OwotICAgICAgICAgICAgJmx0Oy9lbmFibGVtZW50Jmd0OwotICAgICAgICAgJmx0Oy9hY3Rpb24mZ3Q7IAotICAgICAgJmx0Oy9lZGl0b3JDb250cmlidXRpb24mZ3Q7IAotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgc3BlY2lmaWVkIGFjdGlvbiB3aWxsIGFwcGVhciBhcyBhIG1lbnUgaXRlbSBpbiB0aGUgc3ViLW1lbnUgbmFtZWQgJnF1b3Q7WFlaMiBNZW51JnF1b3Q7IGluIHRoZSB0b3AgbGV2ZWwgJnF1b3Q7RWRpdCZxdW90OyBtZW51LiBUaGUgYWN0aW9uIGlzIGVuYWJsZWQgaWYgdGhlIHNlbGVjdGlvbiBjb250YWlucyBubyBKYXZhIGZpbGUgcmVzb3VyY2VzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgY2xhc3MgYXR0cmlidXRlIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQKLW5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZSZsdDsvc2FtcCZndDsuIAotVGhpcyBjbGFzcyBpcyBsb2FkZWQgYXMgbGF0ZSBhcyBwb3NzaWJsZSB0byAKLWF2b2lkIGxvYWRpbmcgdGhlIGVudGlyZSBwbHVnLWluIGJlZm9yZSBpdCBpcyByZWFsbHkgCi1uZWVkZWQuIFRoZSBtZXRob2QgJmx0O3NhbXAmZ3Q7c2V0QWN0aXZlRWRpdG9yJmx0Oy9zYW1wJmd0OyB3aWxsIGJlIAotY2FsbGVkIGVhY2ggdGltZSBhbiBlZGl0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIGlzIAotYWN0aXZhdGVkLiBPbmx5IG9uZSBzZXQgb2YgYWN0aW9ucyBhbmQgbWVudXMgd2lsbCBiZSAKLWNyZWF0ZWQgZm9yIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpZmllZCBlZGl0b3IgCi10eXBlLCByZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgb2YgZWRpdG9yIGluc3RhbmNlcyAKLWN1cnJlbnRseSBvcGVuZWQgaW4gdGhlIFdvcmtiZW5jaC4gCi0mbHQ7cCZndDsKLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSB1c2VkIHRvIGNvbnRyaWJ1dGUgYWN0aW9ucyAKLWludG8gbWVudXMgcHJldmlvdXNseSBjcmVhdGVkIGJ5IHRoZSB0YXJnZXQgZWRpdG9yLiAKLUluIGFkZGl0aW9uLCBtZW51cyBhbmQgYWN0aW9ucyBjYW4gYmUgY29udHJpYnV0ZWQgdG8gCi10aGUgV29ya2JlbmNoIHdpbmRvdy4gIFRoZSBpZGVudGlmaWVycyBmb3IgYWN0aW9ucyBhbmQgCi1tYWpvciBncm91cHMgd2l0aGluIHRoZSBXb3JrYmVuY2ggd2luZG93IGFyZSBkZWZpbmVkIGluIAotJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cyZsdDsvc2FtcCZndDsuICAKLVRoZXNlIHNob3VsZCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIHBvaW50IGZvciAKLXRoZSBhZGRpdGlvbiBvZiBuZXcgYWN0aW9ucy4gIFRvcCBsZXZlbCBtZW51cyBhcmUgCi1jcmVhdGVkIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciB0aGUgCi1wYXRoIGF0dHJpYnV0ZTogCi0mbHQ7dWwmZ3Q7Ci0mbHQ7bGkmZ3Q7Ci1hZGRpdGlvbnMgLSByZXByZXNlbnRzIGEgbmFtZWQgZ3JvdXAgaW1tZWRpYXRlbHkgdG8gdGhlIGxlZnQgb2YgdGhlICZsdDtzYW1wJmd0O1dpbmRvdyZsdDsvc2FtcCZndDsgbWVudS4gCi0mbHQ7L2xpJmd0OwotJmx0Oy91bCZndDsKLU9taXR0aW5nIHRoZSBwYXRoIGF0dHJpYnV0ZSB3aWxsIHJlc3VsdCBpbiBhZGRpbmcgdGhlIG5ldyBtZW51IGludG8gdGhlIGFkZGl0aW9ucyBtZW51IGJhciBncm91cC4KLSZsdDtwJmd0OwotQWN0aW9ucyBhbmQgbWVudXMgYWRkZWQgaW50byB0aGVzZSBwYXRocyB3aWxsIG9ubHkgCi1iZSBzaG93biB3aGlsZSB0aGUgYXNzb2NpYXRlZCBlZGl0b3IgaXMgYWN0aXZlLiBXaGVuIAotdGhlIGVkaXRvciBpcyBjbG9zZWQsIG1lbnVzIGFuZCBhY3Rpb25zIHdpbGwgYmUgcmVtb3ZlZC4KLSZsdDtwJmd0OwotVGhlIGVuYWJsZW1lbnQgY3JpdGVyaWEgZm9yIGFuIGFjdGlvbiBleHRlbnNpb24gaXMgaW5pdGlhbGx5IGRlZmluZWQgYnkgJmx0O3NhbXAmZ3Q7ZW5hYmxlc0ZvciZsdDsvc2FtcCZndDssIGFuZCBhbHNvIGVpdGhlciAmbHQ7c2FtcCZndDtzZWxlY3Rpb24mbHQ7L3NhbXAmZ3Q7IG9yICZsdDtzYW1wJmd0O2VuYWJsZW1lbnQmbHQ7L3NhbXAmZ3Q7LiBIb3dldmVyLCBvbmNlIHRoZSBhY3Rpb24gZGVsZWdhdGUgaGFzIGJlZW4gaW5zdGFudGlhdGVkLCBpdCBtYXkgY29udHJvbCB0aGUgYWN0aW9uIGVuYWJsZSBzdGF0ZSBkaXJlY3RseSB3aXRoaW4gaXRzICZsdDtzYW1wJmd0O3NlbGVjdGlvbkNoYW5nZWQmbHQ7L3NhbXAmZ3Q7IG1ldGhvZC4KLSZsdDtwJmd0OwotQWN0aW9uIGFuZCBtZW51IGxhYmVscyBtYXkgY29udGFpbiBzcGVjaWFsIGNoYXJhY3RlcnMgdGhhdCBlbmNvZGUgbW5lbW9uaWNzIHVzaW5nIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0mbHQ7b2wmZ3Q7Ci0mbHQ7bGkmZ3Q7Ci1NbmVtb25pY3MgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUgYW1wZXJzYW5kICgmYXBvczsmYW1wO2FtcDsmYXBvczspIGNoYXJhY3RlciBpbiBmcm9udAotb2YgYSBzZWxlY3RlZCBjaGFyYWN0ZXIgaW4gdGhlIHRyYW5zbGF0ZWQgdGV4dC4gU2luY2UgYW1wZXJzYW5kIGlzIG5vdAotYWxsb3dlZCBpbiBYTUwgc3RyaW5ncywgdXNlICZsdDtzYW1wJmd0OyZhbXA7YW1wO2FtcDsmbHQ7L3NhbXAmZ3Q7IGNoYXJhY3RlciBlbnRpdHkuJmx0Oy9saSZndDsKLSZsdDsvb2wmZ3Q7Ci1JZiB0d28gb3IgbW9yZSBhY3Rpb25zIGFyZSBjb250cmlidXRlZCB0byBhIG1lbnUgb3IgdG9vbGJhciBieSBhIHNpbmdsZQotZXh0ZW5zaW9uIHRoZSBhY3Rpb25zIHdpbGwgYXBwZWFyIGluIHRoZSByZXZlcnNlIG9yZGVyIG9mIGhvdyB0aGV5IGFyZQotbGlzdGVkIGluIHRoZSBwbHVnaW4ueG1sIGZpbGUuIFRoaXMgYmVoYXZpb3IgaXMgYWRtaXR0ZWRseSB1bmludHVpdGl2ZS4gCi1Ib3dldmVyLCBpdCB3YXMgZGlzY292ZXJlZCBhZnRlciB0aGUgRWNsaXBzZSBQbGF0Zm9ybSBBUEkgd2FzIGZyb3plbi4gCi1DaGFuZ2luZyB0aGUgYmVoYXZpb3Igbm93IHdvdWxkIGJyZWFrIGV2ZXJ5IHBsdWctaW4gd2hpY2ggcmVsaWVzIHVwb24gdGhlCi1leGlzdGluZyBiZWhhdmlvci4KLSZsdDtwJmd0OwotVGhlICZsdDtzYW1wJmd0O3NlbGVjdGlvbiZsdDsvc2FtcCZndDsgYW5kICZsdDtzYW1wJmd0O2VuYWJsZW1lbnQmbHQ7L3NhbXAmZ3Q7IGVsZW1lbnRzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIFRoZSAmbHQ7c2FtcCZndDtlbmFibGVtZW50Jmx0Oy9zYW1wJmd0OyBlbGVtZW50IGNhbiByZXBsYWNlIHRoZSAmbHQ7c2FtcCZndDtzZWxlY3Rpb24mbHQ7L3NhbXAmZ3Q7IGVsZW1lbnQgdXNpbmcgdGhlIHN1Yi1lbGVtZW50cyAmbHQ7c2FtcCZndDtvYmplY3RDbGFzcyZsdDsvc2FtcCZndDsgYW5kICZsdDtzYW1wJmd0O29iamVjdFN0YXRlJmx0Oy9zYW1wJmd0Oy4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmc6Ci0mbHQ7cHJlJmd0OwotICZsdDtzZWxlY3Rpb24KLSAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUmcXVvdDsKLSAgbmFtZT0mcXVvdDsqLmphdmEmcXVvdDsmZ3Q7Ci0gJmx0Oy9zZWxlY3Rpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLWNhbiBiZSBleHByZXNzZWQgdXNpbmc6Ci0mbHQ7cHJlJmd0OwotICZsdDtlbmFibGVtZW50Jmd0OwotICAmbHQ7YW5kJmd0OwotICAgJmx0O29iamVjdENsYXNzIG5hbWU9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUmcXVvdDsvJmd0OwotICAgJmx0O29iamVjdFN0YXRlIG5hbWU9JnF1b3Q7ZXh0ZW5zaW9uJnF1b3Q7IHZhbHVlPSZxdW90O2phdmEmcXVvdDsvJmd0OwotICAmbHQ7L2FuZCZndDsKLSAmbHQ7L2VuYWJsZW1lbnQmZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIFdvcmtiZW5jaCBwcm92aWRlcyBhIGJ1aWx0LWluICZxdW90O0RlZmF1bHQgVGV4dCBFZGl0b3ImcXVvdDsuIFBsdWctaW5zIGNhbiBjb250cmlidXRlIGludG8gdGhpcyBkZWZhdWx0IGVkaXRvciBvciBlZGl0b3JzIHByb3ZpZGVkIGJ5IG90aGVyIHBsdWctaW5zLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2VkaXRvcnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2VkaXRvcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0MTNmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9lZGl0b3JzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0iZWRpdG9ycyIgbmFtZT0iSW50ZXJuYWwgYW5kIEV4dGVybmFsIEVkaXRvcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhZGQgbmV3IGVkaXRvcnMgdG8gdGhlIAotd29ya2JlbmNoLiAgQSBlZGl0b3IgaXMgYSB2aXN1YWwgY29tcG9uZW50IHdpdGhpbiBhIAotd29ya2JlbmNoIHBhZ2UuIEl0IGlzIHR5cGljYWxseSB1c2VkIHRvIGVkaXQgb3IgYnJvd3NlIAotYSBkb2N1bWVudCBvciBpbnB1dCBvYmplY3QuICBUbyBvcGVuIGFuIGVkaXRvciwgdGhlIHVzZXIgCi13aWxsIHR5cGljYWxseSBpbnZva2UgJnF1b3Q7T3BlbiZxdW90OyBvbiBhbiAmbHQ7c2FtcCZndDtJRmlsZSZsdDsvc2FtcCZndDsuICAKLVdoZW4gdGhpcyBhY3Rpb24gaXMgcGVyZm9ybWVkIHRoZSB3b3JrYmVuY2ggcmVnaXN0cnkgCi1pcyBjb25zdWx0ZWQgdG8gZGV0ZXJtaW5lIGFuIGFwcHJvcHJpYXRlIGVkaXRvciBmb3IgCi10aGUgZmlsZSB0eXBlIGFuZCB0aGVuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBlZGl0b3IgCi10eXBlIGlzIGNyZWF0ZWQuICBUaGUgYWN0dWFsIHJlc3VsdCBkZXBlbmRzIG9uIHRoZSAKLXR5cGUgb2YgdGhlIGVkaXRvci4gIFRoZSB3b3JrYmVuY2ggcHJvdmlkZXMgc3VwcG9ydCAKLWZvciB0aGUgY3JlYXRpb24gb2YgaW50ZXJuYWwgZWRpdG9ycywgd2hpY2ggYXJlIHRpZ2h0bHkgCi1pbnRlZ3JhdGVkIGludG8gdGhlIHdvcmtiZW5jaCwgYW5kIGV4dGVybmFsIGVkaXRvcnMsIAotd2hpY2ggYXJlIGxhdW5jaGVkIGluIGEgc2VwYXJhdGUgZnJhbWUgd2luZG93LiAgCi1UaGVyZSBhcmUgYWxzbyB2YXJpb3VzIGxldmVsIG9mIGludGVncmF0aW9uIGJldHdlZW4gCi10aGVzZSBleHRyZW1lcy4gCi0mbHQ7cCZndDsKLUluIHRoZSBjYXNlIG9mIGFuIGludGVybmFsIGVkaXRvciB0aWdodCBpbnRlZ3JhdGlvbiBjYW4gCi1iZSBhY2hpZXZlZCBiZXR3ZWVuIHRoZSB3b3JrYmVuY2ggd2luZG93IGFuZCB0aGUgZWRpdG9yIAotcGFydC4gIFRoZSB3b3JrYmVuY2ggbWVudSBhbmQgdG9vbGJhciBhcmUgcHJlLWxvYWRlZCAKLXdpdGggYSBudW1iZXIgb2YgY29tbW9uIGFjdGlvbnMsIHN1Y2ggYXMgY3V0LCBjb3B5LCBhbmQgCi1wYXN0ZS4gIFRoZSBhY3RpdmUgcGFydCwgdmlldyBvciBlZGl0b3IsIGlzIGV4cGVjdGVkIHRvIAotcHJvdmlkZSB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZXNlIGFjdGlvbnMuIEFuIGludGVybmFsIAotZWRpdG9yIG1heSBhbHNvIGRlZmluZSBuZXcgYWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gdGhlIAotd29ya2JlbmNoIHdpbmRvdy4gIFRoZXNlIGFjdGlvbnMgb25seSBhcHBlYXIgd2hlbiB0aGUgCi1lZGl0b3IgaXMgYWN0aXZlLiAKLSZsdDtwJmd0OwotVGhlIGludGVncmF0aW9uIGJldHdlZW4gdGhlIHdvcmtiZW5jaCBhbmQgZXh0ZXJuYWwKLWVkaXRvcnMgaXMgbW9yZSB0ZW51b3VzLiAgSW4gdGhpcyBjYXNlIHRoZSB3b3JrYmVuY2ggCi1tYXkgbGF1bmNoIGFuIGVkaXRvciBidXQgYWZ0ZXIgaGFzIG5vIHdheSBvZiBkZXRlcm1pbmluZwotdGhlIHN0YXRlIG9mIHRoZSBleHRlcm5hbCBlZGl0b3Igb3IgY29sbGFib3JhdGluZyAKLXdpdGggaXQgYnkgYW55IG1lYW5zIGV4Y2VwdCB0aHJvdWdoIHRoZSBmaWxlIHN5c3RlbS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWRpdG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlZGl0b3IiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiIGljb249Imljb24iLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudFR5cGVCaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgZWRpdG9yCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBVSSBmb3IgdGhpcyBlZGl0b3IKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSByZWxhdGl2ZSBuYW1lIG9mIHRoZSBpY29uIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBhbGwgcmVzb3VyY2VzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBleHRlbnNpb25zLiAKLUFuIGljb24gaXMgbm90IHJlcXVpcmVkIGlmIHlvdSBzcGVjaWZ5IGEgY29tbWFuZCByYXRoZXIgdGhhbiBhIGNsYXNzLiBJbiB0aGF0IGNhc2UsIHRoZSB3b3JrYmVuY2ggCi13aWxsIHVzZSB0aGUgaWNvbiBwcm92aWRlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9ucyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBmaWVsZCBjb250YWluaW5nIHRoZSBsaXN0IG9mIGZpbGUgdHlwZXMgdW5kZXJzdG9vZCBieSB0aGUgZWRpdG9yLiAgVGhpcyBpcyBhIHN0cmluZyBjb250YWluaW5nIGNvbW1hIHNlcGFyYXRlIGZpbGUgZXh0ZW5zaW9ucy4gIEZvciBpbnN0YW5jZSwgYW4gZWRpdG9yIHdoaWNoIHVuZGVyc3RhbmRzIGh5cGVydGV4dCBkb2N1bWVudHMgbWF5IHJlZ2lzdGVyIGZvciAmcXVvdDtodG0sIGh0bWwmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQmbHQ7L3NhbXAmZ3Q7LiBUaGUgYXR0cmlidXRlcyAmbHQ7c2FtcCZndDtjbGFzcyZsdDsvc2FtcCZndDssICZsdDtzYW1wJmd0O2NvbW1hbmQmbHQ7L3NhbXAmZ3Q7LCBhbmQgJmx0O3NhbXAmZ3Q7bGF1bmNoZXImbHQ7L3NhbXAmZ3Q7IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIElmIHRoaXMgYXR0cmlidXRlIGlzIGRlZmluZWQgdGhlbiAmbHQ7c2FtcCZndDtjb250cmlidXRvckNsYXNzJmx0Oy9zYW1wJmd0OyBzaG91bGQgYWxzbyBiZSBkZWZpbmVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWFuZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGNvbW1hbmQgdG8gcnVuIGluIG9yZGVyIHRvIGxhdW5jaCBhbiBleHRlcm5hbCBlZGl0b3IuIFRoZSBleGVjdXRhYmxlIGNvbW1hbmQgbXVzdCBiZSBsb2NhdGVkIG9uIHRoZSBzeXN0ZW0gcGF0aCBvciBpbiB0aGUgcGx1Zy1pbiZhcG9zO3MgZGlyZWN0b3J5LiBUaGUgYXR0cmlidXRlcyAmbHQ7c2FtcCZndDtjbGFzcyZsdDsvc2FtcCZndDssICZsdDtzYW1wJmd0O2NvbW1hbmQmbHQ7L3NhbXAmZ3Q7LCBhbmQgJmx0O3NhbXAmZ3Q7bGF1bmNoZXImbHQ7L3NhbXAmZ3Q7IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGF1bmNoZXIiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgYSBjbGFzcyB3aGljaCB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSUVkaXRvckxhdW5jaGVyJmx0Oy9zYW1wJmd0Oy4gCi1BIGxhdW5jaGVyIHdpbGwgb3BlbiBhbiBleHRlcm5hbCBlZGl0b3IuIFRoZSBhdHRyaWJ1dGVzICZsdDtzYW1wJmd0O2NsYXNzJmx0Oy9zYW1wJmd0OywgJmx0O3NhbXAmZ3Q7Y29tbWFuZCZsdDsvc2FtcCZndDssIGFuZCAmbHQ7c2FtcCZndDtsYXVuY2hlciZsdDsvc2FtcCZndDsgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLnVpLklFZGl0b3JMYXVuY2hlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRyaWJ1dG9yQ2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yJmx0Oy9zYW1wJmd0Oy4gVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCBpZiB0aGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBpcyBkZWZpbmVkLiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYWRkIG5ldyBhY3Rpb25zIHRvIHRoZSB3b3JrYmVuY2ggbWVudSBhbmQgdG9vbCBiYXIgd2hpY2ggcmVmbGVjdCB0aGUgZmVhdHVyZXMgb2YgdGhlIGVkaXRvciB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9ImJvb2xlYW4iIHVzZT0iZGVmYXVsdCIgdmFsdWU9ImZhbHNlIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBpZiB0cnVlLCB0aGlzIGVkaXRvciB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZWRpdG9yIGZvciB0aGUKLXR5cGUuIFRoaXMgaXMgb25seSByZWxldmFudCBpbiBhIGNhc2Ugd2hlcmUgbW9yZSB0aGFuIG9uZSBlZGl0b3IKLWlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBzYW1lIHR5cGUuIElmIGFuIGVkaXRvciBpcyBub3QgdGhlIGRlZmF1bHQKLWZvciB0aGUgdHlwZSwgaXQgY2FuIHN0aWxsIGJlIGxhdW5jaGVkIHVzaW5nICZxdW90O09wZW4gd2l0aC4uLiZxdW90Owotc3VibWVudSBmb3IgdGhlIHNlbGVjdGVkIHJlc291cmNlLgotJmx0O3AmZ3Q7Ci1QbGVhc2Ugbm90ZSB0aGF0IHRoaXMgYXR0cmlidXRlIGlzIG9ubHkgaG9ub3JlZCBmb3IgZmlsZW5hbWUgYW5kIGV4dGVuc2lvbiBhc3NvY2lhdGlvbnMgYXQgdGhpcyB0aW1lLiAgSXQgd2lsbCBub3QgYmUgaG9ub3JlZCBmb3IgY29udGVudCB0eXBlIGJpbmRpbmdzLiAgQ29udGVudCB0eXBlLWJhc2VkIHJlc29sdXRpb24gd2lsbCBvY2N1ciBvbiBhIGZpcnN0IGNvbWUsIGZpcnN0IHNlcnZlIGJhc2lzIGFuZCBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuJmx0Oy9wJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVuYW1lcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBmaWVsZCBjb250YWluaW5nIHRoZSBsaXN0IG9mIGZpbGUgbmFtZXMgCi11bmRlcnN0b29kIGJ5IHRoZSBlZGl0b3IuICBUaGlzIGlzIGEgc3RyaW5nIAotY29udGFpbmluZyBjb21tYSBzZXBhcmF0ZSBmaWxlIG5hbWVzLiAgRm9yIGluc3RhbmNlLCAKLWFuIGVkaXRvciB3aGljaCB1bmRlcnN0YW5kcyBzcGVjaWZpYyBoeXBlcnRleHQgCi1kb2N1bWVudHMgbWF5IHJlZ2lzdGVyIGZvciAmcXVvdDtlamIuaHRtLCBlamIuaHRtbCZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzeW1ib2xpY0ZvbnROYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBzeW1ib2xpYyBuYW1lIG9mIGEgZm9udC4gVGhlIHN5bWJvbGljIGZvbnQgbmFtZSBtdXN0IGJlIHRoZSBpZCBvZiBhIGRlZmluZWQgZm9udCAoc2VlIG9yZy5lY2xpcHNlLnVpLmZvbnREZWZpbml0aW9ucykuIElmIHRoaXMgYXR0cmlidXRlIGlzIG1pc3Npbmcgb3IgaW52YWxpZCB0aGVuIHRoZSBmb250IG5hbWUgaXMgdGhlIHZhbHVlIG9mICZxdW90O29yZy5lY2xpcHNlLmpmYWNlLnRleHRmb250JnF1b3Q7IGluIHRoZSBlZGl0b3ImYXBvcztzIHByZWZlcmVuY2VzIHN0b3JlLiBJZiB0aGVyZSBpcyBubyBwcmVmZXJlbmNlIHN0b3JlIG9yIHRoZSBrZXkgaXMgbm90IGRlZmluZWQgdGhlbiB0aGUgSkZhY2UgdGV4dCBmb250IHdpbGwgYmUgdXNlZC4gVGhlIGVkaXRvciBpbXBsZW1lbnRhdGlvbiBkZWNpZGVzIGlmIGl0IHVzZXMgdGhpcyBzeW1ib2xpYyBmb250IG5hbWUgdG8gc2V0IHRoZSBmb250LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im1hdGNoaW5nU3RyYXRlZ3kiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kmbHQ7L3NhbXAmZ3Q7LiBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgb25seSBiZSBkZWZpbmVkIGlmIHRoZSAmbHQ7c2FtcCZndDtjbGFzcyZsdDsvc2FtcCZndDsgYXR0cmlidXRlIGlzIGRlZmluZWQuIFRoaXMgYWxsb3dzIHRoZSBlZGl0b3IgZXh0ZW5zaW9uIHRvIHByb3ZpZGUgaXRzIG93biBhbGdvcml0aG0gZm9yIG1hdGNoaW5nIHRoZSBpbnB1dCBvZiBvbmUgb2YgaXRzIGVkaXRvcnMgdG8gYSBnaXZlbiBlZGl0b3IgaW5wdXQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZW50VHlwZUJpbmRpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImNvbnRlbnRUeXBlSWQiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQWR2ZXJ0aXNlcyB0aGF0IHRoZSBjb250YWluaW5nIGVkaXRvciB1bmRlcnN0YW5kcyB0aGUgZ2l2ZW4gY29udGVudCB0eXBlIGFuZCBpcyBzdWl0YWJsZSBmb3IgZWRpdGluZyBmaWxlcyBvZiB0aGF0IHR5cGUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGNvbnRlbnQgdHlwZSBpZGVudGlmaWVyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSAKLW9mIGFuIGludGVybmFsIGVkaXRvciBleHRlbnNpb24gZGVmaW5pdGlvbjogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmVkaXRvcnMmcXVvdDsmZ3Q7IAotICAgICAgJmx0O2VkaXRvciAKLSAgICAgICAgIGlkPSZxdW90O2NvbS54eXouWE1MRWRpdG9yJnF1b3Q7IAotICAgICAgICAgbmFtZT0mcXVvdDtGYW5jeSBYWVogWE1MIGVkaXRvciZxdW90OyAKLSAgICAgICAgIGljb249JnF1b3Q7Li9pY29ucy9YTUxFZGl0b3IuZ2lmJnF1b3Q7IAotICAgICAgICAgZXh0ZW5zaW9ucz0mcXVvdDt4bWwmcXVvdDsgCi0gICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LlhNTEVkaXRvciZxdW90OyAKLSAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9JnF1b3Q7Y29tLnh5ei5YTUxFZGl0b3JDb250cmlidXRvciZxdW90OyAKLSAgICAgICAgIHN5bWJvbGljRm9udE5hbWU9JnF1b3Q7b3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQmcXVvdDsKLSAgICAgICAgIGRlZmF1bHQ9JnF1b3Q7ZmFsc2UmcXVvdDsmZ3Q7IAotICAgICAgJmx0Oy9lZGl0b3ImZ3Q7IAotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgSWYgdGhlIGNvbW1hbmQgYXR0cmlidXRlIGlzIHVzZWQsIGl0IHdpbGwgYmUgdHJlYXRlZCAKLWFzIGFuIGV4dGVybmFsIHByb2dyYW0gY29tbWFuZCBsaW5lIHRoYXQgd2lsbCBiZSBleGVjdXRlZAotIGluIGEgcGxhdGZvcm0tZGVwZW5kZW50IG1hbm5lci4gCi0mbHQ7cCZndDsKLUlmIHRoZSBsYXVuY2hlciBhdHRyaWJ1dGUgaXMgdXNlZCB0aGUgZWRpdG9yIHdpbGwgYWxzbyAKLWJlIHRyZWF0ZWQgYXMgYW4gZXh0ZXJuYWwgcHJvZ3JhbS4gIEluIHRoaXMgY2FzZSB0aGUgCi1zcGVjaWZpZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgCi0mbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JRWRpdG9yTGF1bmNoZXImbHQ7L3NhbXAmZ3Q7LiAKLVRoZSBsYXVuY2hlciB3aWxsIGJlIGluc3RhbnRpYXRlZCBhbmQgdGhlbiAKLSZsdDtzYW1wJmd0O29wZW4oSUZpbGUgZmlsZSkmbHQ7L3NhbXAmZ3Q7IHdpbGwgYmUgaW52b2tlZCB0byAKLWxhdW5jaCB0aGUgZWRpdG9yLiAKLSZsdDtwJmd0OwotSWYgdGhlIGNsYXNzIGF0dHJpYnV0ZSBpcyB1c2VkLCB0aGUgd29ya2JlbmNoIHdpbGwgCi1hc3N1bWUgdGhhdCBpdCBpcyBhbiBpbnRlcm5hbCBlZGl0b3IgYW5kIHRoZSBzcGVjaWZpZWQgCi1jbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCZsdDsvc2FtcCZndDsuCi1JdCBpcyBjb21tb24gcHJhY3RpY2UgdG8gCi0mbHQ7c2FtcCZndDtzdWJjbGFzcyBvcmcuZWNsaXBzZS51aS5FZGl0b3JQYXJ0Jmx0Oy9zYW1wJmd0OyB3aGVuIAotZGVmaW5pbmcgYSBuZXcgZWRpdG9yIHR5cGUuICBJdCBpcyBhbHNvIG5lY2Vzc2FyeSB0byAKLWRlZmluZSBhICZsdDtzYW1wJmd0O2NvbnRyaWJ1dG9yQ2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZS4gIAotVGhlIHNwZWNpZmllZCBjbGFzcyBtdXN0IGltcGxlbWVudCAKLSZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciZsdDsvc2FtcCZndDssIAotYW5kIGlzIHVzZWQgdG8gYWRkIG5ldyBhY3Rpb25zIHRvIHRoZSB3b3JrYmVuY2ggCi1tZW51IGFuZCB0b29sIGJhciB3aGljaCByZWZsZWN0IHRoZSBmZWF0dXJlcyBvZiB0aGUgCi1lZGl0b3IgdHlwZS4gCi0mbHQ7cCZndDsKLVdpdGhpbiB0aGUgd29ya2JlbmNoIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIG9wZW4gCi1lZGl0b3Igb2YgYSBwYXJ0aWN1bGFyIHR5cGUuICBGb3IgaW5zdGFuY2UsIHRoZXJlIG1heSAKLWJlIG9uZSBvciBtb3JlIG9wZW4gSmF2YSBFZGl0b3JzLiAgVG8gYXZvaWQgdGhlIGNyZWF0aW9uCi1vZiBkdXBsaWNhdGUgYWN0aW9ucyBhbmQgYWN0aW9uIGltYWdlcyB0aGUgZWRpdG9yIAotY29uY2VwdCBoYXMgYmVlbiBzcGxpdCBpbnRvIHR3by4gIEFuIAotJmx0O3NhbXAmZ3Q7SUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yJmx0Oy9zYW1wJmd0OyBpcyByZXNwb25zaWJsZQotZm9yIHRoZSBjcmVhdGlvbiBvZiBhY3Rpb25zLiAgVGhlIGVkaXRvciBpcyByZXNwb25zaWJsZSAKLWZvciBhY3Rpb24gaW1wbGVtZW50YXRpb24uICBGdXJ0aGVybW9yZSwgdGhlIGNvbnRyaWJ1dG9yIAotaXMgc2hhcmVkIGJ5IGVhY2ggb3BlbiBlZGl0b3IuICBBcyBhIHJlc3VsdCBvZiB0aGlzIAotZGVzaWduIHRoZXJlIGlzIG9ubHkgb25lIHNldCBvZiBhY3Rpb25zIGZvciBvbmUgb3IgCi1tb3JlIG9wZW4gZWRpdG9ycy4gCi0mbHQ7cCZndDsKLVRoZSBjb250cmlidXRvciB3aWxsIGFkZCBuZXcgYWN0aW9ucyB0byB0aGUgd29ya2JlbmNoIAotbWVudSBhbmQgdG9vbGJhciB3aGljaCByZWZsZWN0IHRoZSBlZGl0b3IgdHlwZS4gIFRoZXNlIAotYWN0aW9ucyBhcmUgc2hhcmVkIGFuZCwgd2hlbiBpbnZva2VkLCBhY3QgdXBvbiB0aGUgCi1hY3RpdmUgZWRpdG9yLiAgVGhlIGFjdGl2ZSBlZGl0b3IgaXMgcGFzc2VkIHRvIHRoZSAKLWNvbnRyaWJ1dG9yIGJ5IGludm9raW5nIAotJmx0O3NhbXAmZ3Q7SUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvciZsdDsvc2FtcCZndDsuICAKLVRoZSBpZGVudGlmaWVycyBmb3IgYWN0aW9ucyBhbmQgbWFqb3IgZ3JvdXBzIHdpdGhpbiAKLXRoZSB3b3JrYmVuY2ggd2luZG93IGFyZSBkZWZpbmVkIGluIAotJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cyZsdDsvc2FtcCZndDsuICAKLVRoZXNlIHNob3VsZCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIHBvaW50IGZvciB0aGUgCi1hZGRpdGlvbiBvZiBuZXcgYWN0aW9ucy4gICBUb3AgbGV2ZWwgbWVudXMgYXJlIGNyZWF0ZWQgCi1ieSB1c2luZyB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgdGhlIHBhdGggYXR0cmlidXRlOiAKLSZsdDt1bCZndDsKLSZsdDtsaSZndDsKLWFkZGl0aW9ucyAtIHJlcHJlc2VudHMgYSBncm91cCB0byB0aGUgbGVmdCBvZiB0aGUgV2luZG93IG1lbnUuIAotJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7Ci1BY3Rpb25zIGFuZCBtZW51cyBhZGRlZCBpbnRvIHRoZXNlIHBhdGhzIHdpbGwgb25seSBiZSAKLXNob3duIHdoaWxlIHRoZSBhc3NvY2lhdGVkIGVkaXRvciBpcyBhY3RpdmUuIFdoZW4gdGhlIAotZWRpdG9yIGlzIGNsb3NlZCwgbWVudXMgYW5kIGFjdGlvbnMgd2lsbCBiZSByZW1vdmVkLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgd29ya2JlbmNoIHByb3ZpZGVzIGEgJnF1b3Q7RGVmYXVsdCBUZXh0IEVkaXRvciZxdW90Oy4gVGhlIGVuZCB1c2VyIHByb2R1Y3QgbWF5IGNvbnRhaW4gb3RoZXIgZWRpdG9ycyBhcyBwYXJ0IG9mIHRoZSBzaGlwcGluZyBidW5kbGUuIEluIHRoYXQgY2FzZSwgZWRpdG9ycyB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgZXh0ZW5zaW9ucyB1c2luZyB0aGUgc3ludGF4IGRlc2NyaWJlZCBhYm92ZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9lbGVtZW50RmFjdG9yaWVzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9lbGVtZW50RmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiY2EyYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvZWxlbWVudEZhY3Rvcmllcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9ImVsZW1lbnRGYWN0b3JpZXMiIG5hbWU9IkVsZW1lbnQgRmFjdG9yaWVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gYWRkIGVsZW1lbnQgZmFjdG9yaWVzIAotdG8gdGhlIHdvcmtiZW5jaC4gIEFuIGVsZW1lbnQgZmFjdG9yeSBpcyB1c2VkIHRvIAotcmVjcmVhdGUgJmx0O3NhbXAmZ3Q7SUFkYXB0YWJsZSZsdDsvc2FtcCZndDsgb2JqZWN0cyB3aGljaCBhcmUgCi1wZXJzaXN0ZWQgZHVyaW5nIHdvcmtiZW5jaCBzaHV0ZG93bi4gCi0mbHQ7cCZndDsKLUFzIGFuIGV4YW1wbGUsIHRoZSBlbGVtZW50IGZhY3RvcnkgaXMgdXNlZCB0byAKLXBlcnNpc3QgZWRpdG9yIGlucHV0LiAgVGhlIGlucHV0IGZvciBhbiAKLWVkaXRvciBtdXN0IGltcGxlbWVudCAKLSZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLkVkaXRvcklucHV0Jmx0Oy9zYW1wJmd0Oy4gIAotVGhlIGxpZmUgY3ljbGUgb2YgYW4gJmx0O3NhbXAmZ3Q7SUVkaXRvcklucHV0Jmx0Oy9zYW1wJmd0OyB3aXRoaW4gCi1hbiBlZGl0b3IgaGFzIGEgbnVtYmVyIG9mIHBoYXNlcy4gCi0mbHQ7b2wmZ3Q7Ci0mbHQ7bGkmZ3Q7Ci1UaGUgaW5pdGlhbCBpbnB1dCBmb3IgYW4gZWRpdG9yIGlzIHBhc3NlZCBpbiBkdXJpbmcgCi1lZGl0b3IgY3JlYXRpb24uIAotJmx0Oy9saSZndDsKLSZsdDtsaSZndDsKLU9uIHNodXRkb3duIHRoZSB3b3JrYmVuY2ggc3RhdGUgaXMgY2FwdHVyZWQuICAKLUluIHRoaXMgcHJvY2VzcyB0aGUgd29ya2JlbmNoIHdpbGwgY3JlYXRlIGEgbWVtZW50byAKLWZvciBlYWNoIG9wZW4gZWRpdG9yIGFuZCBpdHMgaW5wdXQuICBUaGUgaW5wdXQgaXMgCi1zYXZlZCBhcyBhIHR3byBwYXJ0IG1lbWVudG8gY29udGFpbmluZyBhIGZhY3RvcnkgSUQgCi1hbmQgYW55IHByaW1pdGl2ZSBkYXRhIHJlcXVpcmVkIHRvIHJlY3JlYXRlIHRoZSAKLWVsZW1lbnQgb24gc3RhcnR1cC4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSAKLXRoZSBkb2N1bWVudGF0aW9uIG9uIAotJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudCZsdDsvc2FtcCZndDsuIAotJmx0Oy9saSZndDsKLSZsdDtsaSZndDsKLU9uIHN0YXJ0dXAgdGhlIHdvcmtiZW5jaCBzdGF0ZSBpcyByZWFkIGFuZCB0aGUgCi1lZGl0b3JzIGZyb20gdGhlIHByZXZpb3VzIHNlc3Npb24gYXJlIHJlY3JlYXRlZC4gIAotSW4gdGhpcyBwcm9jZXNzIHRoZSB3b3JrYmVuY2ggd2lsbCByZWNyZWF0ZSB0aGUgaW5wdXQgCi1lbGVtZW50IGZvciBlYWNoIG9wZW4gZWRpdG9yLiAgVG8gZG8gdGhpcyBpdCB3aWxsIAotbWFwIHRoZSBvcmlnaW5hbCBmYWN0b3J5IElEIGZvciB0aGUgaW5wdXQgZWxlbWVudCAKLXRvIGEgY29uY3JldGUgZmFjdG9yeSBjbGFzcyBkZWZpbmVkIGluIHRoZSByZWdpc3RyeS4gIAotSWYgYSBtYXBwaW5nIGV4aXN0cywgYW5kIHRoZSBmYWN0b3J5IGNsYXNzIGlzIHZhbGlkLCAKLWFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5IGNsYXNzIGlzIGNyZWF0ZWQuICBUaGVuIAotdGhlIHdvcmtiZW5jaCBhc2tzIHRoZSBmYWN0b3J5IHRvIHJlY3JlYXRlIHRoZSBvcmlnaW5hbCAKLWVsZW1lbnQgZnJvbSB0aGUgcmVtYWluaW5nIHByaW1pdGl2ZSBkYXRhIHdpdGhpbiB0aGUgCi1tZW1lbnRvLiAgVGhlIHJlc3VsdGluZyAmbHQ7c2FtcCZndDtJQWRhcHRhYmxlJmx0Oy9zYW1wJmd0OyBpcyBjYXN0Ci10byBhbiAmbHQ7c2FtcCZndDtJRWRpdG9ySW5wdXQmbHQ7L3NhbXAmZ3Q7IGFuZCBwYXNzZWQgdG8gdGhlIAotbmV3IGVkaXRvci4gCi0mbHQ7L2xpJmd0OwotJmx0Oy9vbCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBmYWN0b3J5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0mbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3RvcnkmbHQ7L3NhbXAmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGVsZW1lbnQgZmFjdG9yeSBleHRlbnNpb246IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICAgcG9pbnQgPSAmcXVvdDtvcmcuZWNsaXBzZS51aS5lbGVtZW50RmFjdG9yaWVzJnF1b3Q7Jmd0OyAKLSAgICAgICAgJmx0O2ZhY3RvcnkgCi0gICAgICAgICAgIGlkID0mcXVvdDtjb20ueHl6LkVsZW1lbnRGYWN0b3J5JnF1b3Q7IAotICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LkVsZW1lbnRGYWN0b3J5JnF1b3Q7Jmd0OyAKLSAgICAgICAgJmx0Oy9mYWN0b3J5Jmd0OyAKLSAgICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgdmFsdWUgb2YgdGhlICZsdDtzYW1wJmd0O2NsYXNzJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUgbXVzdCAKLWJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0mbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3RvcnkmbHQ7L3NhbXAmZ3Q7LiBBbiBpbnN0YW5jZSAKLW9mIHRoaXMgY2xhc3MgbXVzdCBjcmVhdGUgYW4gJmx0O3NhbXAmZ3Q7SUFkYXB0YWJsZSZsdDsvc2FtcCZndDsgCi1vYmplY3QgZnJvbSBhIHdvcmtiZW5jaCBtZW1lbnRvLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgd29ya2JlbmNoIHByb3ZpZGVzIGFuICZsdDtzYW1wJmd0O0lSZXNvdXJjZSZsdDsvc2FtcCZndDsgZmFjdG9yeS4gIAotQWRkaXRpb25hbCBmYWN0b3JpZXMgc2hvdWxkIGJlIGFkZGVkIHRvIHJlY3JlYXRlIG90aGVyIAotJmx0O3NhbXAmZ3Q7SUFkYXB0YWJsZSZsdDsvc2FtcCZndDsgdHlwZXMgY29tbW9ubHkgZm91bmQgaW4gb3RoZXIgCi1vYmplY3QgbW9kZWxzLCBzdWNoIGFzIHRoZSBKYXZhIE1vZGVsLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2VuY29kaW5ncy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvZW5jb2RpbmdzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYzc0NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvZW5jb2RpbmdzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0iZW5jb2RpbmdzIiBuYW1lPSJFbmNvZGluZ3MiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQSBsaXN0IG9mIGVuY29kaW5ncyB0aGF0IHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIgZm9yIHNlbGVjdGlvbiBvZiBmaWxlIGVuY29kaW5ncy4gVGhpcyBsaXN0IGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZXMgb2YgQ2hhcnNldCNnZXROYW1lKCkgZm9yIGEgc2VyaWVzIG9mIENoYXJzZXRzLiBUaG9zZSB0aGF0IGFyZSBzcGVjaWZpZWQgYnV0IG5vdCBhdmFpYWJsZSB3aWxsIGJlIGluZGljYXRlZCBhcyBzdWNoIGluIHRoZSB3b3JrYmVuY2ggYW5kIHdpbGwgbm90IGJlIHNlbGVjdGFibGUgYnkgdGhlIHVzZXIuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuY29kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVuY29kaW5nIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY2hhcnNldC4gSWYgdGhpcyB2YWx1ZSBpcyBzZW50IHRvIENoYXJzZXQjZ2V0TmFtZShTdHJpbmcpIHRoZSBjb3JyZXNwb25kaW5nIENoYXJzZXQgd291bGQgYmUgcmV0dXJuZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9leHBvcnRXaXphcmRzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9leHBvcnRXaXphcmRzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOWViZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvZXhwb3J0V2l6YXJkcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9ImV4cG9ydFdpemFyZHMiIG5hbWU9IkV4cG9ydCBXaXphcmRzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcmVnaXN0ZXIgZXhwb3J0IHdpemFyZCBleHRlbnNpb25zLiBFeHBvcnQgd2l6YXJkcyBhcHBlYXIgYXMgY2hvaWNlcyB3aXRoaW4gdGhlICZxdW90O0V4cG9ydCBEaWFsb2cmcXVvdDssIGFuZCBhcmUgdXNlZCB0byBleHBvcnQgcmVzb3VyY2VzIGZyb20gdGhlIHdvcmtiZW5jaC4gCi0mbHQ7cCZndDsKLVdpemFyZHMgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBhIGRlc2NyaXB0aW9uIHN1YmVsZW1lbnQgd2hvc2UgYm9keSBzaG91bGQgY29udGFpbiBzaG9ydCB0ZXh0IGFib3V0IHRoZSB3aXphcmQuCi0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYXRlZ29yeSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmQiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRlZ29yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBjYXRlZ29yeQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSBvZiB0aGUgY2F0ZWdvcnkgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGRpYWxvZyBib3gKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhcmVudENhdGVnb3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcGF0aCB0byBhbm90aGVyIGNhdGVnb3J5IGlmIHRoaXMgY2F0ZWdvcnkgc2hvdWxkIGJlIGFkZGVkIGFzIGEgY2hpbGQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIiBpY29uPSJpY29uIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIGFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGV4cG9ydCB3aXphcmQKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlbGVjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHdpemFyZAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgZGlhbG9nIGJveCB0byByZXByZXNlbnQgdGhpcyB3aXphcmQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgc2xhc2gtZGVsaW1pdGVkIHBhdGggKCZhcG9zOy8mYXBvczspIG9mIGNhdGVnb3J5IElEcy4gRWFjaCB0b2tlbiBpbiB0aGUKLXBhdGggbXVzdCByZXByZXNlbnQgYSB2YWxpZCBjYXRlZ29yeSBJRCBwcmV2aW91c2x5IGRlZmluZWQKLWJ5IHRoaXMgb3Igc29tZSBvdGhlciBwbHVnLWluLiBJZiBvbWl0dGVkLCB0aGUgd2l6YXJkIHdpbGwgYmUKLWFkZGVkIHRvIHRoZSAmcXVvdDtPdGhlciZxdW90OyBjYXRlZ29yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPiAgICAgICAgIAotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3R0Jmd0O29yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQmbHQ7L3R0Jmd0OwotaW50ZXJmYWNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOm9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcmVsYXRpdmUgbmFtZSBvZiB0aGUgaWNvbiB0aGF0IHdpbGwgYmUgdXNlZCAKLWFsb25nc2lkZSB0aGUgd2l6YXJkIG5hbWUgaW4gdGhlIGV4cG9ydCBlbmdpbmUgbGlzdGluZy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgYW4gb3B0aW9uYWwgc3ViZWxlbWVudCB3aG9zZSBib2R5IHNob3VsZCByZXByZXNlbnQgYSBzaG9ydCBkZXNjcmlwdGlvbgotb2YgdGhlIGV4cG9ydCBlbmdpbmUgZnVuY3Rpb25hbGl0eS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic2VsZWN0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBhbiBvcHRpb25hbCBlbGVtZW50IHRoYXQgcmVzdHJpY3RzIHRoZSB0eXBlcyBhbmQgbmFtZXMgb2Ygb2JqZWN0cyB0aGF0IGNhbiBiZSBzZWxlY3RlZCAKLXdoZW4gdGhlIHdpemFyZCBpcyBpbnZva2VkLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgZmlsdGVyLiAgRWFjaCBvYmplY3QgaW4gdGhlIHdvcmtiZW5jaCBzZWxlY3Rpb24gbXVzdCBtYXRjaCB0aGUgbmFtZSBmaWx0ZXIgdG8gYmUgcGFzc2VkIHRvIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4gIElmIGVhY2ggb2JqZWN0IGluIHRoZSB3b3JrYmVuY2ggc2VsZWN0aW9uIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgdGhlIHNlbGVjdGlvbiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgd2l6YXJkLiAgT3RoZXJ3aXNlLCBhbiBlbXB0eSBzZWxlY3Rpb24gaXMgcGFzc2VkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gZXhwb3J0IGV4dGVuc2lvbiBkZWZpbml0aW9uOgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzJnF1b3Q7Jmd0OyAKLSAgICAgICZsdDt3aXphcmQgCi0gICAgICAgICBpZD0mcXVvdDtjb20ueHl6LkV4cG9ydFdpemFyZDEmcXVvdDsgCi0gICAgICAgICBuYW1lPSZxdW90O1hZWiBXZWIgRXhwb3J0ZXImcXVvdDsgCi0gICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LmV4cG9ydHMuRXhwb3J0V2l6YXJkMSZxdW90OyAKLSAgICAgICAgIGljb249JnF1b3Q7Li9pY29ucy9pbXBvcnQxLmdpZiZxdW90OyZndDsgCi0gICAgICAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7IAotICAgICAgICAgICAgQSBzaW1wbGUgZW5naW5lIHRoYXQgZXhwb3J0cyBXZWIgcHJvamVjdCAKLSAgICAgICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7IAotICAgICAgICAgJmx0O3NlbGVjdGlvbiBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCZxdW90Oy8mZ3Q7IAotICAgICAgJmx0Oy93aXphcmQmZ3Q7IAotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSAmbHQ7c2FtcCZndDtjbGFzcyZsdDsvc2FtcCZndDsgYXR0cmlidXRlIAotbXVzdCBiZSBhIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQmbHQ7L3NhbXAmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgd29ya2JlbmNoIGNvbWVzIHByZWxvYWRlZCB3aXRoIGJhc2ljIGV4cG9ydCBlbmdpbmVzIAotZm9yIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9mb250RGVmaW5pdGlvbnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2ZvbnREZWZpbml0aW9ucy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjJjOGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2ZvbnREZWZpbml0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9ImZvbnREZWZpbml0aW9ucyIgbmFtZT0iRm9udCBEZWZpbml0aW9ucyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHJlZ2lzdGVyIGZvbnRzIHdpdGggdGhlIEpGYWNlIEZvbnRSZWdpc3RyeSBhbmQgd2l0aCB0aGUgd29ya2JlbmNoIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHVzZSBieSB0aGUgRm9udHMgcHJlZmVyZW5jZSBwYWdlLgotCi1UaGlzIGV4dGVuc2lvbiBwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIDMuMC4gIFlvdSBzaG91bGQgbm93IGFkZCBmb250RGVmaW5pdGlvbiBlbGVtZW50cyB0byBvcmcuZWNsaXBzZS51aS50aGVtZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZvbnREZWZpbml0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmb250RGVmaW5pdGlvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgZm9udCBkZWZpbml0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgb2YgdGhlIGZvbnQgdG8gYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgJmx0O3AmZ3Q7dGhlIGZvbnQgdmFsdWUuICBUaGlzIGlzIGluIHRoZSBmb3JtOiAmbHQ7Y29kZSZndDtmb250bmFtZS1zdHlsZS1oZWlnaHQmbHQ7L2NvZGUmZ3Q7IHdoZXJlICZsdDtjb2RlJmd0O2ZvbnRuYW1lJmx0Oy9jb2RlJmd0OyBpcyB0aGUgbmFtZSBvZiBhIGZvbnQsICZsdDtjb2RlJmd0O3N0eWxlJmx0Oy9jb2RlJmd0OyBpcyBhIGZvbnQgc3R5bGUgKG9uZSBvZiAmbHQ7Y29kZSZndDsmcXVvdDtyZWd1bGFyJnF1b3Q7Jmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7JnF1b3Q7Ym9sZCZxdW90OyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0OyZxdW90O2l0YWxpYyZxdW90OyZsdDsvY29kZSZndDssIG9yICZsdDtjb2RlJmd0OyZxdW90O2JvbGQgaXRhbGljJnF1b3Q7Jmx0Oy9jb2RlJmd0OykgYW5kICZsdDtjb2RlJmd0O2hlaWdodCZsdDsvY29kZSZndDsgaXMgYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGZvbnQgaGVpZ2h0LiZsdDsvcCZndDsKLSZsdDtwJmd0O0V4YW1wbGU6ICZsdDtjb2RlJmd0O1RpbWVzIE5ldyBSb21hbi1ib2xkLTM2Jmx0Oy9jb2RlJmd0Oy4mbHQ7L3AmZ3Q7ICAKLSZsdDtwJmd0OwotT25seSBvbmUgKG9yIG5laXRoZXIpIG9mIHZhbHVlIG9yIGRlZmF1bHRzVG8gbWF5IGJlIHVzZWQuCi0mbHQ7L3AmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnlJZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgb3B0aW9uYWwgaWQgb2YgdGhlIHByZXNlbnRhdGlvbiBjYXRlZ29yeSB0aGlzIGZvbnQgYmVsb25ncyB0by4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0c1RvIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBpZCBvZiBhbm90aGVyIGZvbnQgZGVmaW5pdGlvbiB0aGF0IGlzIHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoZSByZWNlaXZlci4gV2hlbiB0aGVyZSBpcyBubyBwcmVmZXJlbmNlIGZvciB0aGlzIGZvbnQgdGhlIGZvbnQgcmVnaXN0cnkgd2lsbCBoYXZlIHRoZSB2YWx1ZSBvZiBkZWZhdWx0c1RvIHNldCBmb3IgaXQgaW4gdGhlIHJlZ2lzdHJ5LgotJmx0O3AmZ3Q7Ci1Pbmx5IG9uZSBvciBuZWl0aGVyIG9mIHZhbHVlIG9yIGRlZmF1bHRzVG8gbWF5IGJlIHVzZWQuCi0mbHQ7L3AmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBmb250cyB1c2FnZQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUmVsZWFzZSAyLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gYSBmb250IGRlZmluaXRpb24gZXh0ZW5zaW9uOgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5mb250RGVmaW5pdGlvbiZxdW90OyZndDsgCi0gICAgICAmbHQ7Zm9udERlZmluaXRpb24gCi0gICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5leGFtcGxlcy50ZXh0Rm9udCZxdW90OyAKLSAgICAgICAgIGxhYmVsPSZxdW90O1RleHQmcXVvdDsmZ3Q7IAotICAgICAgICAgJmx0O2Rlc2NyaXB0aW9uJmd0OwotICAgICAgICAgICAgVGhlIHRleHQgZm9udAotICAgICAgICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAgICZsdDsvZm9udERlZmluaXRpb24mZ3Q7IAotCi0gICAgICAmbHQ7Zm9udERlZmluaXRpb24gCi0gICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmV4YW1wbGVzLnVzZXJGb250JnF1b3Q7IAotICAgICAgICBsYWJlbD0mcXVvdDtVc2VyJnF1b3Q7Ci0gICAgICAgIGRlZmF1bHRzVG89JnF1b3Q7b3JnLmVjbGlwc2UuamZhY2UudGV4dEZvbnQmcXVvdDsmZ3Q7IAotICAgICAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICAgICAgIFRoZSB1c2VyIGZvbnQKLSAgICAgICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAgICZsdDsvZm9udERlZmluaXRpb24mZ3Q7IAotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGRlZmF1bHRzVG8gdGFnIGlzIHVzZWQgYXMgYSBkaXJlY3RpdmUgYnkKLXRoZSBXb3JrYmVuY2ggdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZm9udCBkZWZpbml0aW9uIHRvIHRoZSB2YWx1ZSBvZiBkZWZhdWx0c1RvCi13aGVuZXZlciB0aGUgZGVmYXVsdHNUbyBmb250RGVmaW5pdGlvbiBpcyB1cGRhdGVkLiBUaGlzIG9ubHkgb2NjdXJzIGlmIHRoZQotZm9udERlZmluaXRpb24gaXMgYXQgaXRzIGRlZmF1bHQgdmFsdWUgLSBvbmNlIGl0IGlzIHNldCBieSB0aGUgdXNlciB0aGlzIHVwZGF0ZXMKLXdpbGwgbm90IG9jY3VyLiBUaGUgd29ya2JlbmNoIHByb3ZpZGVzIDQgZm9udHM6IAotJmx0O1AmZ3Q7Jmx0O2ImZ3Q7b3JnLmVjbGlwc2UuamZhY2UuYmFubmVyZm9udCZsdDsvYiZndDsuIFRoZSBiYW5uZXIgZm9udCBpcyB1c2VkIGluIHdpemFyZCBiYW5uZXJzLiZsdDticiZndDsKLSZsdDtiJmd0O29yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ2ZvbnQmbHQ7L2ImZ3Q7LiBUaGUgZGlhbG9nIGZvbnQgaXMgdGhlIGZvbnQgZm9yIHdpZGdldHMgaW4gZGlhbG9ncy4mbHQ7YnImZ3Q7Ci0mbHQ7YiZndDtvcmcuZWNsaXBzZS5qZmFjZS5oZWFkZXJmb250Jmx0Oy9iJmd0Oy4gVGhlIGhlYWRlciBmb250IGlzIHVzZWQgZm9yIHNlY3Rpb24gaGVhZGVycyBpbiBjb21wb3NpdGUgdGV4dCBwYWdlcy4mbHQ7YnImZ3Q7Ci0mbHQ7YiZndDtvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udCZsdDsvYiZndDsuIFRoZSB0ZXh0IGZvbnQgaXMgdXNlZCBieSB0ZXh0IGVkaXRvcnMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB3b3JrYmVuY2ggcHJvdmlkZXMgdGhlIGZvbnQKLWRlZmluaXRpb25zIGZvciB0aGUgdGV4dCwgZGlhbG9nLCBiYW5uZXIgYW5kIGhlYWRlciBmb250cy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9oYW5kbGVycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvaGFuZGxlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4OWJjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9oYW5kbGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9ImhhbmRsZXJzIiBuYW1lPSJIYW5kbGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLVRoZSBoYW5kbGVycyBleHRlbnNpb24gcG9pbnQgaXMgYW4gZWxhYm9yYXRpb24gb2YgdGhlIGV4cGVyaW1lbnRhbCAmbHQ7Y29kZSZndDtoYW5kbGVyU3VibWlzc2lvbiZsdDsvY29kZSZndDsgZWxlbWVudCBkZWZpbmVkIGluIEVjbGlwc2UgMy4wLiAgQSBoYW5kbGVyIGlzIHRoZSBiZWhhdmlvdXIgb2YgYSBjb21tYW5kIGF0IGEgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiAgQSBjb21tYW5kIGNhbiBoYXZlIHplcm8gb3IgbW9yZSBoYW5kbGVycyBhc3NvY2lhdGVkIHdpdGggaXQuICBBdCBhbnkgb25lIHBvaW50IGluIHRpbWUsIGhvd2V2ZXIsIGEgY29tbWFuZCB3aWxsIGVpdGhlciBoYXZlIG5vIGFjdGl2ZSBoYW5kbGVyIG9yIG9uZSBhY3RpdmUgaGFuZGxlci4gIFRoZSBhY3RpdmUgaGFuZGxlciBpcyB0aGUgb25lIHdoaWNoIGlzIGN1cnJlbnRseSByZXNwb25zaWJsZSBmb3IgY2Fycnlpbmcgb3V0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGNvbW1hbmQuICBUaGlzIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgY29uY2VwdCBvZiBhbiBhY3Rpb24gaGFuZGxlciBhbmQgYSByZXRhcmdldHRhYmxlIGFjdGlvbi4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVGhlIGhhbmRsZXJzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBwbHVnLWluIGRldmVsb3BlciB0byBzcGVjaWZ5IGEgaGFuZGxlciB0aGF0IHNob3VsZCBiZWNvbWUgYWN0aXZlIGFuZC9vciBlbmFibGVkIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4gIElmIGEgaGFuZGxlciBpcyBpbmFjdGl2ZSwgdGhlbiBubyBjb21tYW5kIHdpbGwgZGVsZWdhdGUgaXRzIGJlaGF2aW91ciB0byB0aGUgaGFuZGxlci4gIElmIGEgaGFuZGxlciBpcyBkaXNhYmxlZCwgdGhlbiB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBhc2tlZCB0byBleGVjdXRlOyBleGVjdXRpb24gb2YgdGhlIGhhbmRsZXIgaXMgYmxvY2tlZC4gIFRoZSBjb25kaXRpb25zIGFyZSBkZWZpbmVkIHVzaW5nIHRoZSBleHByZXNzaW9uIGxhbmd1YWdlIGZhY2lsaXR5IGFkZGVkIGR1cmluZyAzLjAuICBUaGV5IGFyZSBleHByZXNzZWQgdXNpbmcgJmx0O2NvZGUmZ3Q7YWN0aXZlV2hlbiZsdDsvY29kZSZndDsgYW5kICZsdDtjb2RlJmd0O2VuYWJsZWRXaGVuJmx0Oy9jb2RlJmd0OyBjbGF1c2VzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgd29ya2JlbmNoIHByb3ZpZGVzIHNvbWUgdmFyaWFibGVzIHRoYXQgdGhlc2UgZXhwcmVzc2lvbnMgY2FuIHJlbHkgb24uICBUaGUgdmFyaWFibGVzIHN1cHBvcnRlZCBhcmU6IHRoZSBhY3RpdmUgY29udGV4dHMsIHRoZSBhY3RpdmUgZWRpdG9yLCB0aGUgYWN0aXZlIHBhcnQgYW5kIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gIFdoaWxlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBpbml0aWFsIGRlc2lnbiwgaXQgaXMgZWFzeSB0byBzZWUgaG93IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGFkZCBvdGhlciB2YXJpYWJsZXMgb3IgZXZlbiBhbGxvdyBwbHVnLWluIGRldmVsb3BlcnMgdG8gY29udHJpYnV0ZSBvdGhlciB2YXJpYWJsZXMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUEgaGFuZGxlciB0aGF0IHNwZWNpZmllcyBubyBjb25kaXRpb25zIGlzIGEgZGVmYXVsdCBoYW5kbGVyLiAgQSBkZWZhdWx0IGhhbmRsZXIgaXMgb25seSBhY3RpdmUgaWYgbm8gb3RoZXIgaGFuZGxlciBoYXMgYWxsIG9mIGl0cyBjb25kaXRpb25zIHNhdGlzZmllZC4gIElmIHR3byBoYW5kbGVycyBzdGlsbCBoYXZlIGNvbmRpdGlvbnMgdGhhdCBhcmUgc2F0aXNmaWVkLCB0aGVuIHRoZSBjb25kaXRpb25zIGFyZSBjb21wYXJlZC4gIFRoZSBpZGVhIGlzIHRvIHNlbGVjdCBhIGhhbmRsZXIgd2hvc2UgY29uZGl0aW9uIGlzIG1vcmUgc3BlY2lmaWMgb3IgbW9yZSBsb2NhbC4gIFRvIGRvIHRoaXMsIHRoZSB2YXJpYWJsZXMgcmVmZXJyZWQgdG8gYnkgdGhlIGNvbmRpdGlvbiBhcmUgbG9va2VkIGF0LiAgVGhlIGNvbmRpdGlvbiB0aGF0IHJlZmVycyB0byB0aGUgbW9zdCBzcGVjaWZpYyB2YXJpYWJsZSAmcXVvdDt3aW5zJnF1b3Q7LiAgVGhlIG9yZGVyIG9mIHNwZWNpZmljaXR5IChmcm9tIGxlYXN0IHNwZWNpZmljIHRvIG1vc3Qgc3BlY2lmaWMpIGlzIGRlZmluZWQgaW4gJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkuSVNvdXJjZXMmbHQ7L2NvZGUmZ3Q7LgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1JZiB0aGlzIHN0aWxsIGRvZXNuJmFwb3M7dCByZXNvbHZlIHRoZSBjb25mbGljdCwgdGhlbiBubyBoYW5kbGVyIGlzIGFjdGl2ZS4gIElmIGEgcGFydGljdWxhciB0cmFjaW5nIG9wdGlvbiBpcyB0dXJuZWQgb24sIHRoZW4gdGhpcyBsZWFkcyB0byBhIG1lc3NhZ2UgaW4gdGhlIGxvZy4gIEEgY29uZmxpY3QgY2FuIGFsc28gb2NjdXIgaWYgdGhlcmUgYXJlIHR3byBkZWZhdWx0IGhhbmRsZXJzLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBwbHVnLWluIGRldmVsb3BlcnMgYW5kIGludGVncmF0aW9uIHRlc3RlcnMgdG8gZW5zdXJlIHRoYXQgdGhpcyBkb2VzIG5vdCBoYXBwZW4uCi1UaGVzZSBjb25kaXRpb25zIGFyZSB1c2VkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHBsdWctaW4gbG9hZGluZy4gIFRoZXNlIGhhbmRsZXIgZGVmaW5pdGlvbnMgYXJlIHdyYXBwZWQgaW4gYSBwcm94eS4gIEZvciBhIHByb3h5IHRvIGxvYWQgaXRzIHVuZGVybHlpbmcgaGFuZGxlciwgdHdvIHRoaW5ncyBtdXN0IGhhcHBlbjogdGhlIGNvbmRpdGlvbnMgZm9yIHRoZSBwcm94eSBtdXN0IGJlIG1ldCBzbyB0aGF0IGl0IGJlY29tZXMgYWN0aXZlLCBhbmQgdGhlIGNvbW1hbmQgbXVzdCBiZSBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2hpY2ggaXQgbXVzdCBkZWxlZ2F0ZSAoZS5nLiwgZXhlY3V0ZSgpKS4KLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImhhbmRsZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImhhbmRsZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY3RpdmVXaGVuIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjbGFzcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW5hYmxlZFdoZW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tYW5kSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFjdGl2ZVdoZW4iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibm90Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFuZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvciIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbnN0YW5jZW9mIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRlc3QiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3lzdGVtVGVzdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlcXVhbHMiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY291bnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l0aCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXNvbHZlIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Iml0ZXJhdGUiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZW5hYmxlZFdoZW4iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibm90Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFuZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvciIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbnN0YW5jZW9mIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRlc3QiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3lzdGVtVGVzdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlcXVhbHMiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY291bnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l0aCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXNvbHZlIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Iml0ZXJhdGUiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2xhc3MiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24KLSBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5oYW5kbGVycyZxdW90OyZndDsKLSAmbHQ7aGFuZGxlcgotICBjb21tYW5kSWQ9JnF1b3Q7Y29tbWFuZElkJnF1b3Q7Ci0gIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmNvbXBhcmUuQ29tbWFuZCZxdW90OyZndDsKLSAgJmx0O2FjdGl2ZVdoZW4mZ3Q7Ci0gICAmbHQ7d2l0aCB2YXJpYWJsZT0mcXVvdDtzZWxlY3Rpb24mcXVvdDsmZ3Q7Ci0gICAgJmx0O2NvdW50IHZhbHVlPSZxdW90OzEmcXVvdDsgLyZndDsKLSAgICAmbHQ7aXRlcmF0ZSBvcGVyYXRvcj0mcXVvdDthbmQmcXVvdDsmZ3Q7Ci0gICAgICZsdDthZGFwdCB0eXBlPSZxdW90O0lSZXNvdXJjZSZxdW90OyAvJmd0OwotICAgICZsdDsvaXRlcmF0ZSZndDsKLSAgICZsdDsvd2l0aCZndDsKLSAgJmx0Oy9hY3RpdmVXaGVuJmd0OwotICZsdDsvaGFuZGxlciZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7cCZndDsKLVRvIGZ1cnRoZXIgYXZvaWQgcGx1Zy1pbiBsb2FkaW5nLCBpdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IHdoZW4gdGhlIGhhbmRsZXIgaXMgZW5hYmxlZC4gIElmIHRoZSBwcm94eSBoYXMgbm90IHlldCBsb2FkZWQgdGhlIGhhbmRsZXIsIHRoZW4gb25seSB0aGUgZXhwcmVzc2lvbnMgc3ludGF4IGlzIHVzZWQgdG8gZGVjaWRlIGlmIHRoZSBoYW5kbGVyIGlzIGVuYWJsZWQuICBJZiB0aGUgcHJveHkgaGFzIGxvYWRlZCB0aGUgaGFuZGxlciwgdGhlbiB0aGUgZXhwcmVzc2lvbnMgc3ludGF4IGlzIGNvbnN1bHRlZCBmaXJzdC4gIElmIHRoZSBleHByZXNzaW9ucyBzeW50YXggZXZhbHVhdGVzIHRvIHRydWUsIHRoZW4gdGhlIGhhbmRsZXIgaXMgYXNrZWQgaWYgaXQgaXMgZW5hYmxlZC4gIChUaGlzIGlzIGEgc2hvcnQtY2lyY3VpdCBCb29sZWFuICZxdW90O2FuZCZxdW90OyBvcGVyYXRpb24gYmV0d2VlbiB0aGUgZXhwcmVzc2lvbnMgc3ludGF4IGFuZCB0aGUgaGFuZGxlciZhcG9zO3MgZW5hYmxlZCBzdGF0ZS4pCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbgotIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmhhbmRsZXJzJnF1b3Q7Jmd0OwotICZsdDtoYW5kbGVyCi0gIGNvbW1hbmRJZD0mcXVvdDtjb21tYW5kSWQmcXVvdDsKLSAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuSGFuZGxlciZxdW90OyZndDsKLSAgJmx0O2VuYWJsZWRXaGVuJmd0OwotICAgJmx0O3dpdGggdmFyaWFibGU9JnF1b3Q7Y29udGV4dCZxdW90OyZndDsKLSAgICAmbHQ7cHJvcGVydHkKLSAgICAgaWQ9JnF1b3Q7aWQmcXVvdDsKLSAgICAgdmFsdWU9JnF1b3Q7ZGVidWdnaW5nJnF1b3Q7IC8mZ3Q7Ci0gICAmbHQ7L3dpdGgmZ3Q7Ci0gICZsdDsvZW5hYmxlZFdoZW4mZ3Q7Ci0gJmx0Oy9oYW5kbGVyJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLUFsbCBoYW5kbGVycyBpbXBsZW1lbnQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlciZsdDsvY29kZSZndDsuICBXaXRoaW4gdGhlIHdvcmtiZW5jaCwgaXQgaXMgcG9zc2libGUgdG8gYWN0aXZhdGUgYW5kIGRlYWN0aXZhdGUgaGFuZGxlcnMgdXNpbmcgdGhlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLklIYW5kbGVyU2VydmljZSZsdDsvY29kZSZndDsgaW50ZXJmYWNlLiAgVGhpcyBpbnRlcmZhY2UgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHN1cHBvcnRpbmcgd29ya2JlbmNoIG9iamVjdHMsIHN1Y2ggYXMgJmx0O2NvZGUmZ3Q7SVdvcmtiZW5jaCZsdDsvY29kZSZndDsgaXRzZWxmLiAgVG8gcmV0cmlldmUgdGhlIHNlcnZpY2UsIHlvdSB3b3VsZCBtYWtlIGEgY2FsbCBsaWtlICZsdDtjb2RlJmd0O0lXb3JrYmVuY2guZ2V0QWRhcHRlcihJSGFuZGxlclNlcnZpY2UuY2xhc3MpJmx0Oy9jb2RlJmd0Oy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhY3RpdmF0ZSBhbmQgZGVhY3RpdmUgaGFuZGxlcnMgdXNpbmcgbGVnYWN5IGNvZGUgaW4gdGhlIHdvcmtiZW5jaC4gIFRoaXMgY2FuIGJlIGRvbmUgdGhyb3VnaCB0aGUgbGVnYWN5IG1lY2hhbmlzbSBzaG93biBiZWxvdy4gIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWZ1bCB0byBjbGllbnRzIHdobyBhcmUgdXNpbmcgYWN0aW9ucyB0byBjb250cmlidXRlIHRvIG1lbnVzIG9yIHRvb2xiYXJzLgotJmx0Oy9wJmd0OwotJmx0O3ByZSZndDsKLSBJV29ya2JlbmNoUGFydFNpdGUgbXlTaXRlOwotIElBY3Rpb24gbXlBY3Rpb247Ci0gCi0gbXlBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKGNvbW1hbmRJZCk7Ci0gSUtleUJpbmRpbmdTZXJ2aWNlIHNlcnZpY2UgPSBteVNpdGUuZ2V0S2V5QmluZGluZ1NlcnZpY2UoKTsKLSBzZXJ2aWNlLnJlZ2lzdGVyQWN0aW9uKG15QWN0aW9uKTsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9oZWxwU3VwcG9ydC5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvaGVscFN1cHBvcnQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyMDMxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9oZWxwU3VwcG9ydC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9ImhlbHBTdXBwb3J0IiBuYW1lPSJIZWxwU3VwcG9ydCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBmb3IgY29udHJpYnV0aW5nIHRoZSBoZWxwIHN5c3RlbSBVSS4gVGhlIHBsYXRmb3JtIHNob3VsZCBiZSBjb25maWd1cmVkIHdpdGggbm8gbW9yZSB0aGFuIG9uZSBoZWxwIHN5c3RlbSBVSS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29uZmlnIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb25maWciPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGRpc3BsYXlpbmcgb25saW5lIGFuZCBjb250ZXh0LXNlbnNpdGl2ZQotaGVscC4gIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLmhlbHAuQWJzdHJhY3RIZWxwVUkmbHQ7L3NhbXAmZ3Q7Ci1pbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS5oZWxwLkFic3RyYWN0SGVscFVJIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMCAob3JpZ2luYWxseSBuYW1lZCBvcmcuZWNsaXBzZS5oZWxwLnN1cHBvcnQpCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYSBzYW1wbGUgdXNhZ2Ugb2YgdGhlIGhlbHAgc3VwcG9ydCBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLmhlbHBTdXBwb3J0JnF1b3Q7Jmd0OwotICAmbHQ7Y29uZmlnIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLlhZWkhlbHBVSSZxdW90Oy8mZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgc3VwcGxpZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgYSBzdWJjbGFzcyBvZiAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5oZWxwLkFic3RyYWN0SGVscFVJJmx0Oy9zYW1wJmd0Oy4gCi1JbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kcyBpbiB0aGF0IGNsYXNzCi1kZXRlcm1pbmUgd2hhdCBoYXBwZW5zIHdoZW4gYSB1c2VyIGFza3MgZm9yIG9ubGluZSBoZWxwIG9yIGNvbnRleHQtc2Vuc2l0aXZlIGhlbHAuIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWNjZXNzIGNvbnRyaWJ1dGVkIGhlbHAgaW5mb3JtYXRpb24gdXNpbmcgb3JnLmVjbGlwc2UuaGVscC5IZWxwU3lzdGVtLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuaGVscC51aSZsdDsvc2FtcCZndDsgcGx1Zy1pbiBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGVscCBzeXN0ZW0gVUkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvaW1wb3J0V2l6YXJkcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvaW1wb3J0V2l6YXJkcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDg0MzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2ltcG9ydFdpemFyZHMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJpbXBvcnRXaXphcmRzIiBuYW1lPSJJbXBvcnQgV2l6YXJkcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHJlZ2lzdGVyIGltcG9ydCB3aXphcmQgZXh0ZW5zaW9ucy4gSW1wb3J0IHdpemFyZHMgYXBwZWFyIGFzIGNob2ljZXMgd2l0aGluIHRoZSAmcXVvdDtJbXBvcnQgRGlhbG9nJnF1b3Q7IGFuZCBhcmUgdXNlZCB0byBpbXBvcnQgcmVzb3VyY2VzIGludG8gdGhlIHdvcmtiZW5jaC4gCi0mbHQ7cCZndDsKLVdpemFyZHMgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBhIGRlc2NyaXB0aW9uIHN1YmVsZW1lbnQgd2hvc2UgYm9keSBzaG91bGQgY29udGFpbiBzaG9ydCB0ZXh0IGFib3V0IHRoZSB3aXphcmQuCi0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYXRlZ29yeSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmQiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRlZ29yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBjYXRlZ29yeQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSBvZiB0aGUgY2F0ZWdvcnkgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGRpYWxvZyBib3gKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhcmVudENhdGVnb3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcGF0aCB0byBhbm90aGVyIGNhdGVnb3J5IGlmIHRoaXMgY2F0ZWdvcnkgc2hvdWxkIGJlIGFkZGVkIGFzIGEgY2hpbGQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIiBpY29uPSJpY29uIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIGFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGltcG9ydCB3aXphcmQKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlbGVjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHdpemFyZAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgZGlhbG9nIGJveCB0byByZXByZXNlbnQgdGhpcyB3aXphcmQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgc2xhc2gtZGVsaW1pdGVkIHBhdGggKCZhcG9zOy8mYXBvczspIG9mIGNhdGVnb3J5IElEcy4gRWFjaCB0b2tlbiBpbiB0aGUKLXBhdGggbXVzdCByZXByZXNlbnQgYSB2YWxpZCBjYXRlZ29yeSBJRCBwcmV2aW91c2x5IGRlZmluZWQKLWJ5IHRoaXMgb3Igc29tZSBvdGhlciBwbHVnLWluLiBJZiBvbWl0dGVkLCB0aGUgd2l6YXJkIHdpbGwgYmUKLWFkZGVkIHRvIHRoZSAmcXVvdDtPdGhlciZxdW90OyBjYXRlZ29yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPiAgICAgICAgIAotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZCZsdDsvc2FtcCZndDsgaW50ZXJmYWNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOm9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcmVsYXRpdmUgbmFtZSBvZiB0aGUgaWNvbiB0aGF0IHdpbGwgYmUgdXNlZCBhbG9uZ3NpZGUgdGhlIHdpemFyZCBuYW1lIGluIHRoZSBpbXBvcnQgZW5naW5lIGxpc3RpbmcuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBhbiBvcHRpb25hbCBzdWJlbGVtZW50IHdob3NlIGJvZHkgc2hvdWxkIHJlcHJlc2VudCBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBpbXBvcnQgZW5naW5lIGZ1bmN0aW9uYWxpdHkuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNlbGVjdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgYW4gb3B0aW9uYWwgZWxlbWVudCB0aGF0IHJlc3RyaWN0cyB0aGUgdHlwZXMgYW5kIG5hbWVzIG9mIG9iamVjdHMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgd2hlbiB0aGUgd2l6YXJkIGlzIGludm9rZWQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBmaWx0ZXIuICBFYWNoIG9iamVjdCBpbiB0aGUgd29ya2JlbmNoIHNlbGVjdGlvbiBtdXN0IG1hdGNoIHRoZSBuYW1lIGZpbHRlciB0byBiZSBwYXNzZWQgdG8gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4gIElmIGVhY2ggb2JqZWN0IGluIHRoZSB3b3JrYmVuY2ggc2VsZWN0aW9uIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgdGhlIHNlbGVjdGlvbiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgd2l6YXJkLiAgT3RoZXJ3aXNlLCBhbiBlbXB0eSBzZWxlY3Rpb24gaXMgcGFzc2VkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gaW1wb3J0IGV4dGVuc2lvbiBkZWZpbml0aW9uOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyZxdW90OyZndDsgCi0gICAgICAmbHQ7d2l6YXJkIAotICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei5JbXBvcnRXaXphcmQxJnF1b3Q7IAotICAgICAgICAgbmFtZT0mcXVvdDtYWVogV2ViIFNjcmFwZXImcXVvdDsgCi0gICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LmltcG9ydHMuSW1wb3J0V2l6YXJkMSZxdW90OyAKLSAgICAgICAgIGljb249JnF1b3Q7Li9pY29ucy9pbXBvcnQxLmdpZiZxdW90OyZndDsgCi0gICAgICAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7IAotICAgICAgICAgICAgQSBzaW1wbGUgZW5naW5lIHRoYXQgc2VhcmNoZXMgdGhlIFdlYiBhbmQgaW1wb3J0cyBmaWxlcyAKLSAgICAgICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7IAotICAgICAgICAgJmx0O3NlbGVjdGlvbiBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UmcXVvdDsvJmd0OyAKLSAgICAgICZsdDsvd2l6YXJkJmd0OyAKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBtdXN0IHJlcHJlc2VudCBhIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkJmx0Oy9zYW1wJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHdvcmtiZW5jaCBjb21lcyBwcmVsb2FkZWQgd2l0aCB0aGUgYmFzaWMgaW1wb3J0IGVuZ2luZXMgZm9yIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9pbnRyby5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvaW50cm8uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkNzdmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9pbnRyby5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9ImludHJvIiBuYW1lPSJJbnRybyBQYXJ0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcmVnaXN0ZXIgaW1wbGVtZW50YXRpb25zIG9mIHNwZWNpYWwgd29ya2JlbmNoIHBhcnRzLCBjYWxsZWQgaW50cm8gcGFydHMsIHRoYXQgYXJlIHJlc3BvbnNpYmxlIGZvciBpbnRyb2R1Y2luZyBhIHByb2R1Y3QgdG8gbmV3IHVzZXJzLiBBbiBpbnRybyBwYXJ0IGlzIHR5cGljYWxseSBzaG93biB0aGUgZmlyc3QgdGltZSBhIHByb2R1Y3QgaXMgc3RhcnRlZCB1cC4gUnVsZXMgZm9yIGFzc29jaWF0aW5nIGFuIGludHJvIHBhcnQgaW1wbGVtZW50YXRpb24gd2l0aCBwYXJ0aWN1bGFyIHByb2R1Y3RzIGFyZSBhbHNvIGNvbnRyaWJ1dGVkIHZpYSB0aGlzIGV4dGVuc2lvbiBwb2ludC4KLSZsdDsvcCZndDsKLVRoZSBsaWZlIGN5Y2xlIGlzIGFzIGZvbGxvd3M6Ci0mbHQ7dWwmZ3Q7Ci0mbHQ7bGkmZ3Q7VGhlIGludHJvIGFyZWEgaXMgY3JlYXRlZCBvbiB3b3JrYmVuY2ggc3RhcnQgdXAuIEFzIHdpdGggZWRpdG9yIGFuZCB2aWV3IGFyZWFzLCB0aGlzIGFyZWEgaXMgbWFuYWdlZCBieSBhbiBpbnRybyBzaXRlIChpbXBsZW1lbnRpbmcgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvU2l0ZSZsdDsvY29kZSZndDspLiZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7VGhlIGlkIG9mIHRoZSBjdXJyZW50IHByb2R1Y3QgKFBsYXRmb3JtLmdldFByb2R1Y3QoKSkgaXMgdXNlZCB0byBjaG9vc2UgdGhlIHJlbGV2YW50IGludHJvIHBhcnQgaW1wbGVtZW50YXRpb24uCi0mbHQ7L2xpJmd0OwotJmx0O2xpJmd0O1RoZSBpbnRybyBwYXJ0IGNsYXNzIChpbXBsZW1lbnRpbmcgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvUGFydCZsdDsvY29kZSZndDspIGlzIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkIHdpdGggdGhlIGludHJvIHNpdGUuCi0mbHQ7L2xpJmd0OwotJmx0O2xpJmd0O1doaWxlIHRoZSBpbnRybyBwYXJ0IGlzIHNob3dpbmcgdG8gdGhlIHVzZXIsIGl0IGNhbiB0cmFuc2l0aW9uIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gZnVsbCBhbmQgc3RhbmRieSBtb2RlIChlaXRoZXIgcHJvZ3JhbW1hdGljYWxseSBvciBleHBsaWNpdGx5IGJ5IHRoZSB1c2VyKS4KLSZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7RXZlbnR1YWxseSB0aGUgaW50cm8gcGFydCBpcyBjbG9zZWQgKGVpdGhlciBwcm9ncmFtbWF0aWNhbGx5IG9yIGV4cGxpY2l0bHkgYnkgdGhlIHVzZXIpLiBUaGUgY3VycmVudCBwZXJzcGVjdGl2ZSB0YWtlcyBvdmVyIHRoZSBlbnRpcmUgd29ya2JlbmNoIHdpbmRvdyBhcmVhLgotJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImludHJvIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImludHJvUHJvZHVjdEJpbmRpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImludHJvIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIgaWNvbj0iaWNvbiIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgYW4gaW50cm9kdWN0aW9uLiBBbiBpbnRyb2R1Y3Rpb24gaXMgYSBwcm9kdWN0LXNwZWNpZmljIHByZXNlbnRhdGlvbiBzaG93biB0byBmaXJzdC10aW1lIHVzZXJzIG9uIHByb2R1Y3Qgc3RhcnQgdXAuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgaW50cm9kdWN0aW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHBsdWctaW4tcmVsYXRpdmUgZmlsZSBuYW1lIG9mIHRoZSBpY29uIHRoYXQgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnRyb2R1Y3Rpb24KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS5pbnRyby5JSW50cm9QYXJ0Jmx0Oy9jb2RlJmd0OyBpbnRlcmZhY2UuICBBIGNvbW1vbiBwcmFjdGljZSAKLWlzIHRvIHN1YmNsYXNzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLnBhcnQuaW50cm8uSW50cm9QYXJ0Jmx0Oy9zYW1wJmd0OyAKLWluIG9yZGVyIHRvIGluaGVyaXQgdGhlIGRlZmF1bHQgZnVuY3Rpb25hbGl0eS4gIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgaW50cm9kdWN0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvUGFydCIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpbnRyb1Byb2R1Y3RCaW5kaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgYSBiaW5kaW5nIGJldHdlZW4gYSBwcm9kdWN0IGFuZCBhbiBpbnRyb2R1Y3Rpb24uIFRoZXNlIGJpbmRpbmdzIGRldGVybWluZSB3aGljaCBpbnRyb2R1Y3Rpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IHByb2R1Y3QgKGFzIGRlZmluZWQgYnkgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtLmdldFByb2R1Y3QoKSZsdDsvY29kZSZndDspLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9kdWN0SWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdW5pcXVlIGlkIG9mIGEgcHJvZHVjdAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImludHJvSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdW5pcXVlIGlkIG9mIGFuIGludHJvZHVjdGlvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGludHJvIHBhcnQgZXh0ZW5zaW9uIHRoYXQgY29udHJpYnV0ZXMgYW4gcGFydGljdWxhciBpbnRyb2R1Y3Rpb24gYW5kIGFzc29jaWF0ZXMgaXQgd2l0aCBhIHBhcnRpY3VsYXIgcHJvZHVjdDoKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRybyZxdW90OyZndDsKLSAgICAgJmx0O2ludHJvCi0gICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLnh5ei5pbnRyby5jdXN0b20mcXVvdDsKLSAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUueHl6LmludHJvLkludHJvUGFydCZxdW90Oy8mZ3Q7Ci0gICAgICZsdDtpbnRyb1Byb2R1Y3RCaW5kaW5nCi0gICAgICAgIHByb2R1Y3RJZD0mcXVvdDtjb20uZXhhbXBsZS54eXouUHJvZHVjdCZxdW90OwotICAgICAgICBpbnRyb0lkPSZxdW90O2NvbS5leGFtcGxlLnh5ei5pbnRyby5jdXN0b20mcXVvdDsvJmd0OwotICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgJmx0O2NvZGUmZ3Q7Y2xhc3MmbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSBtdXN0IGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS5pbnRyby5JSW50cm9QYXJ0Jmx0Oy9jb2RlJmd0OyBpbnRlcmZhY2UgYnkgc3ViY2xhc3NpbmcgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkucGFydC5pbnRyby5JbnRyb1BhcnQmbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGVyZSBhcmUgbm8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGluaXRpYWwgdXNlciBleHBlcmllbmNlLiBFYWNoIEVjbGlwc2UtYmFzZWQgcHJvZHVjdCBpcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIG9uZSB0aGF0IGlzIGNsb3NlbHkgbWF0Y2hlZCB0byBpdHMgYnJhbmRpbmcgYW5kIGZ1bmN0aW9uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2tleXdvcmRzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9rZXl3b3Jkcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzJiNDk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL2tleXdvcmRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0ia2V5d29yZHMiIG5hbWU9IktleXdvcmRzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBrZXl3b3JkcyBleHRlbnNpb24gcG9pbnQgZGVmaW5lcyBrZXl3b3JkcyBhbmQgYSB1bmlxdWUgaWQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBzY2hlbWFzLgotCi1TZWUgcHJvcGVydHlQYWdlcyBhbmQgcHJlZmVyZW5jZVBhZ2VzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ia2V5d29yZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImtleXdvcmQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgaXMgdGhlIHVuaXF1ZSBpZCB1c2VkIHRvIHJlZmVyZW5jZSB0aGUga2V5d29yZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaHVtYW4gcmVhZGFibGUgbGFiZWwgb2YgdGhlIGtleXdvcmQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4xCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9tZW51cy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvbWVudXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4MDI0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9tZW51cy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsODk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9Im1lbnVzIiBuYW1lPSJNZW51cyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyB0aGUgcGx1Zy1pbiBkZXZlbG9wZXIgdG8gZGVmaW5lIG1lbnVzLCBzZXBhcmF0b3JzLCBsb2dpY2FsIGdyb3VwcyBhbmQgbWVudSBpdGVtcyAtLSBhcHBlYXJpbmcgYW55d2hlcmUgd2l0aGluIHRoZSBhcHBsaWNhdGlvbiwgZnJvbSBzdGF0dXMgbGluZXMgdG8gY29udGV4dCBtZW51cy4gIEl0IGFsc28gYWxsb3dzIHNldHMgb2Ygc3VjaCBjb250cmlidXRpb25zIHRvIGJlIGRlZmluZWQgKGkuZS4sIGFjdGlvbiBzZXRzKTsgdGhlc2UgYWN0aW9uIHNldHMgY2FuIGJlIHR1cm5lZCBvbiBvciBvZmYgYnkgdGhlIGVuZCB1c2VyLiAgSW4gYnJpZWYsIHRoZSBtZW51cyBleHRlbnNpb24gcG9pbnQgY29udGFpbnMgYWxsIG9mIHRoZSBwcmVzZW50YXRpb24gZWxlbWVudHMgKGV4Y2VwdCB0aGUgaWNvbnMpIGZvciBjb250cmlidXRpbmcgdG8gYW55IG1lbnUsIHRvb2wgYmFyIG9yIHN0YXR1cyBsaW5lIGluIEVjbGlwc2UuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUV2ZXJ5IGVsZW1lbnQgd2l0aGluIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGdpdmVuIGEgdW5pcXVlIGlkZW50aWZpZXIuICBUaGlzIGlzIHNvIHRoYXQgdGhlc2UgZWxlbWVudHMgY2FuIGJlIHJlZmVycmVkIHRvIGVsc2V3aGVyZSB3aXRob3V0IGhhdmluZyB0byByZXN0YXRlIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIHRoZSBpZGVudGlmaWVyIG1pZ2h0IGJlIHJlcXVpcmVkIGZvciBvcmRlcmluZyBvciBmb3IgZGVmaW5pbmcgYW4gYWN0aW9uIHNldC4gIEFsc28sIHRoaXMgYWxsb3dzIHRoaXJkLXBhcnR5IHBsdWctaW4gZGV2ZWxvcGVycyB0byBwbGFjZSB0aGVzZSBlbGVtZW50cyBpbiBuZXcgbG9jYXRpb25zIHdpdGhpbiB0aGUgaW50ZXJmYWNlLCBhcyBhcHByb3ByaWF0ZS4KLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Iml0ZW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWVudSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aWRnZXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWN0aW9uU2V0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vZGlmaWNhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UudWkubWVudXMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iaXRlbSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgJmx0O3AmZ3Q7Ci1BbiBpdGVtIGNvdWxkIGJlIGEgbWVudSBpdGVtIG9yIGEgdG9vbCBpdGVtLCBkZXBlbmRpbmcgb24gd2hlcmUgaXQgaXMgcGxhY2VkLiAgSXQgY291bGQgYWxzbyBiZSBzb21ldGhpbmcgaW4gdGhlIHN0YXR1cyBsaW5lLiAgVGhlIHRleHQgYW5kIGltYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaXRlbSB3aWxsIGJlIGRyYXduIGZyb20gdGhlIGNvbW1hbmQuCi0mbHQ7L3AmZ3Q7Ci0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsb2NhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2aXNpYmxlV2hlbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgaXRlbS4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGlkZW50aWZpZXIgYmUgcHJlZml4ZWQgYnkgdGhlIHBsdWctaW4gbmFtZSwgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MuICBGb3IgZXhhbXBsZSwgYW4gaXRlbSBjb250cmlidXRlZCBieSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aSZsdDsvY29kZSZndDsgbWlnaHQgYmUgY2FsbGVkICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLml0ZW0xJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tYW5kSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbW1hbmQgdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGl0ZW0gaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyLiAgQ29tbWFuZHMgYXJlIGRlZmluZWQgaW4gdGhlICZsdDthIGhyZWY9JnF1b3Q7b3JnX2VjbGlwc2VfdWlfY29tbWFuZHMuaHRtbCZxdW90OyZndDtjb21tYW5kcyBleHRlbnNpb24gcG9pbnQmbHQ7L2EmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im1lbnVJZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBdHRhY2hlcyBhIGRyb3AtZG93biBtZW51IHRvIGEgdG9vbCBpdGVtLiAgSWYgdGhpcyBpdGVtIGFwcGVhcnMgc29tZXdoZXJlIG90aGVyIHRoYW4gYSB0b29sIGJhciwgdGhlbiBhIHdhcm5pbmcgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBsb2cgb24gc3RhcnQtdXAuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1lbnUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImxhYmVsIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICZsdDtwJmd0OwotQSBtZW51IGNhbiBhcHBlYXIgZWl0aGVyIGF0dGFjaGVkIHRvIGEgdG9vbCBpdGVtLCBvciBzb21ld2hlcmUgd2l0aGluIGEgdmlldyBtZW51LCBjb250ZXh0IG1lbnUgb3IgdGhlIHRvcC1sZXZlbCBtZW51IGJhci4gIEZvciBmcmVlLCB0aGUgcGx1Zy1pbiBkZXZlbG9wZXIgY2FuIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGEgbWVudSBhbmQgdG9vbCBiYXIgZm9yIGV2ZXJ5IHZpZXcsIGFuZCB0aGF0IHRoZSB0b3AtbGV2ZWwgbWVudSBiYXIgZXhpc3RzLiAgQ29udGV4dCBtZW51cyBtdXN0IGJlIHJlZ2lzdGVyZWQgcHJvZ3JhbW1hdGljYWxseSBiZWZvcmUgdGhleSBjYW4gYmUgdXNlZCAoc2VlIEFQSSBJbmZvcm1hdGlvbikuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUEgbWVudSBjYW4gb25seSBjb250YWluIGdyb3Vwcy4KLSZsdDsvcCZndDsKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibG9jYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZHluYW1pYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlzaWJsZVdoZW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIG1lbnUuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBpZGVudGlmaWVyIGJlIHByZWZpeGVkIGJ5IHRoZSBwbHVnLWluIG5hbWUsIHRvIGd1YXJhbnRlZSB1bmlxdWVuZXNzLiAgRm9yIGV4YW1wbGUsIGEgbWVudSBjb250cmlidXRlZCBieSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aSZsdDsvY29kZSZndDsgbWlnaHQgYmUgY2FsbGVkICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLm1lbnUxJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaHVtYW4tcmVhZGFibGUgdGV4dCB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIG1lbnUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Imdyb3VwIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAmbHQ7cCZndDsKLUEgbG9naWNhbCBncm91cC4gIEl0IGNhbiBlaXRoZXIgYmUgdmlzaWJsZSAoZS5nLiwgc2VwYXJhdG9ycyBhcmUgZHJhd24gYmVmb3JlIGFuZCBhZnRlciwgYXMgYXBwcm9wcmlhdGUpIG9yIGludmlzaWJsZS4gIEJ5IGRlZmF1bHQsIGxvZ2ljaWFsIGdyb3VwcyBhcmUgdmlzaWJsZS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotQSBncm91cCBjYW4gY29udGFpbiBtZW51cywgaXRlbXMgYW5kIG90aGVyIGdyb3Vwcy4KLSZsdDsvcCZndDsKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibG9jYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZHluYW1pYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZ3JvdXAuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBpZGVudGlmaWVyIGJlIHByZWZpeGVkIGJ5IHRoZSBwbHVnLWluIG5hbWUsIHRvIGd1YXJhbnRlZSB1bmlxdWVuZXNzLiAgRm9yIGV4YW1wbGUsIGEgZ3JvdXAgY29udHJpYnV0ZWQgYnkgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkmbHQ7L2NvZGUmZ3Q7IG1pZ2h0IGJlIGNhbGxlZCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS5ncm91cDEmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNlcGFyYXRvcnNWaXNpYmxlIiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBXaGV0aGVyIHNlcGFyYXRvcnMgc2hvdWxkIGJlIGRyYXduIGFyb3VuZCB0aGUgZ3JvdXAuICBUaGUgd29ya2JlbmNoIHdpbGwgdGFrZSBjYXJlIG9mIGRlY2lkaW5nIHdoZXRoZXIgYSBzZXBhcmF0b3IgbmVlZHMgdG8gYmUgZHJhd24gYXQgdGhlIHRvcCBvciBib3R0b20gLS0gYWNjb3VudGluZyBmb3IgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBtZW51IGFuZCBkdXBsaWNhdGUgc2VwYXJhdG9ycy4gIEJ5IGRlZmF1bHQsIHNlcGFyYXRvcnMgYXJlIHZpc2libGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpZGdldCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBtZW51IGVsZW1lbnRzIHRoYXQgaXMgZ2l2ZW4gZGlyZWN0IGFjY2VzcyB0byB0aGUgd2lkZ2V0cy4gIEZvciBleGFtcGxlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIHJlbmRlciBhIGNvbWJvIGJveC4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgdGhhdCBpZiBhIHdpZGdldCBlbGVtZW50IGJlY29tZXMgdmlzaWJsZSBpbiB0aGUgdXNlciBpbnRlcmZhY2UsIHRoaXMgd2lsbCBsZWFkIHRvIHBsdWctaW4gbG9hZGluZy4gICZsdDtzdHJvbmcmZ3Q7VXNlIHRoaXMgZWxlbWVudCB3aXRoIGNhdXRpb24sIGFzIGl0IGNhbiBjYXVzZSBwZXJmb3JtYW5jZSBwcm9ibGVtcy4mbHQ7L3N0cm9uZyZndDsgIFRoaXMgYWxzbyB3aWxsIGNhdXNlIHByb2JsZW1zIGZvciB0aGluZ3MgbGlrZSBtYWNybyBzdXBwb3J0LCBzY3JpcHRpbmcgYW5kIHByZXR0eSBtdWNoIGFueSBvdGhlciBjb21tYW5kLWJhc2VkIG1lY2hhbmlzbS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibG9jYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2xhc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZpc2libGVXaGVuIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyB3aWRnZXQuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBpZGVudGlmaWVyIGJlIHByZWZpeGVkIGJ5IHRoZSBwbHVnLWluIG5hbWUsIHRvIGd1YXJhbnRlZSB1bmlxdWVuZXNzLiAgRm9yIGV4YW1wbGUsIGEgd2lkZ2V0IGNvbnRyaWJ1dGVkIGJ5ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpJmx0Oy9jb2RlJmd0OyBtaWdodCBiZSBjYWxsZWQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkud2lkZ2V0MSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBjbGFzcyBpcyBsb2FkZWQgdG8gZmlsbCB0aGUgYXBwcm9wcmlhdGUgc3BvdCBpbiB0aGUgbWVudSwgdG9vbCBiYXIgb3Igc3RhdHVzIGxpbmUgd2hlbiBpdCBzaG93cy4gIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgJmx0O2NvZGUmZ3Q7SVdpZGdldCZsdDsvY29kZSZndDsuICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlICZsdDtjb2RlJmd0O2NsYXNzJmx0Oy9jb2RlJmd0OyBlbGVtZW50IGluc3RlYWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImxvY2F0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIGxvY2F0aW9uIGluIHdoaWNoIGEgJmx0O2NvZGUmZ3Q7bWVudSZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O2dyb3VwJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7aXRlbSZsdDsvY29kZSZndDsgb3IgJmx0O2NvZGUmZ3Q7d2lkZ2V0Jmx0Oy9jb2RlJmd0OyBjYW4gYXBwZWFyLiAgVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gY29udHJvbCBsb2NhdGlvbi1zcGVjaWZpYyBpbmZvcm1hdGlvbi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3JkZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImJhciIvPgotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwYXJ0Ii8+Ci0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9InBvcHVwIi8+Ci0gICAgICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im1uZW1vbmljIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBtbmVtb25pYyB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50IGluIHRoZSBnaXZlbiBsb2NhdGlvbi4gIEEgbW5lbW9uaWMgc2hvdWxkIGJlIGEgc2luZ2xlIGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImltYWdlU3R5bGUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGltYWdlIHN0eWxlIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgbG9jYXRpb24uICBJdCBpcyBwb3NzaWJsZSBmb3IgY29tbWFuZHMgdG8gaGF2ZSBkaWZmZXJlbnQgc3R5bGVzIG9mIGltYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlbS4gIEZvciBleGFtcGxlLCBhIGRpZmZlcmVudCBpY29uIGNvdWxkIGJlIHNlbGVjdGVkIGZvciB0aGUgdG9vbCBiYXIgYW5kIGZvciB0aGUgbWVudS4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIGRldmVsb3BlcnMgdXNpbmcgZHJvcC1kb3duIHRvb2wgaXRlbXMgaW4gdGhlIHRvb2wgYmFyLCBhcyB0aGV5IG1heSB3aXNoIHRvIGRpc3BsYXkgYW4gaWNvbiBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgZHJvcC1kb3duLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJiYXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgbGVhZiBlbGVtZW50IHdpdGhpbiBhIGxvY2F0aW9uLiAgVGhpcyBjYW4gYmUgdGhlIG1lbnUgYmFyLCB0aGUgdG9vbCBiYXIgb3IgdGhlIHN0YXR1cyBsaW5lLiAgSWYgdW5xdWFsaWZpZWQsIHRoaXMgaW5kaWNhdGVzIHRoZSB0b3AtbGV2ZWwgbWVudSBiYXIsIHRvb2wgYmFyIG9yIHN0YXR1cyBsaW5lLiAgSWYgdGhpcyBpcyBxdWFsaWZpZWQgd2l0aCBhICZsdDtjb2RlJmd0O3BhcnQmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQsIHRoZW4gdGhpcyBpbmRpY2F0ZXMgdGhhdCBwYXJ0JmFwb3M7cyBtZW51LCB0b29sIGJhciBvciBzdGF0dXMgbGluZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgV2hhdCB0eXBlIG9mIGJhciB0byBjb250cmlidXRlIHRvLiAgVGhpcyBjYW4gYmUgJmx0O2NvZGUmZ3Q7bWVudSZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O3Rvb2wmbHQ7L2NvZGUmZ3Q7IG9yICZsdDtjb2RlJmd0O3N0YXR1cyZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJtZW51Ij4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InRvb2wiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ic3RhdHVzIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdGgiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHBhdGggZnJvbSB0aGUgcm9vdCBvZiB0aGUgYmFyLCBpbmNsdWRpbmcgbWVudXMgYW5kIGdyb3Vwcy4gIFRoaXMgcGF0aCB1c2VzICZsdDtjb2RlJmd0OyZhcG9zOy8mYXBvczsmbHQ7L2NvZGUmZ3Q7IGFzIGEgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2xhc3MiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgY2xhc3MgZWxlbWVudCBzdXBwb3J0aW5nIHRoZSBleGVjdXRhYmxlIGV4dGVuc2lvbiBwYXJzaW5nIHN5bnRheCBmb3IgYm90aCAmbHQ7Y29kZSZndDt3aWRnZXQmbHQ7L2NvZGUmZ3Q7IGFuZCAmbHQ7Y29kZSZndDtkeW5hbWljJmx0Oy9jb2RlJmd0OyBlbGVtZW50cy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFyYW1ldGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgdG8gbG9hZCBhcyBhbiAmbHQ7Y29kZSZndDtJRXhlY3V0YWJsZUV4dGVuc2lvbiZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZGlmaWNhdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgJmx0O3AmZ3Q7Ci1BbGxvd3MgbW9kaWZpY2F0aW9ucyB0byBiZSBhcHBsaWVkIHRvIGV4aXN0aW5nIGVsZW1lbnRzLiAgVGhpcyBoYXMgdGhlIGNhcGFjaXR5IHRvIGNvcHkgYW4gZWxlbWVudCBpbnRvIGEgbmV3IGxvY2F0aW9uLCBvciB0byBtb3ZlIGFuIGVsZW1lbnQgaW50byBhIG5ldyBsb2NhdGlvbi4gIEluIGVpdGhlciBjYXNlLCBhbnl0aGluZyB0aGF0IHRyaWVzIHRvIHJlZmVyIHRvIHRoZSBlbGVtZW50IGluIHRoZSBvbGQgbG9jYXRpb24gd2lsbCBhbHNvIHJlZmVyIHRvIHRoZSBuZXcgbG9jYXRpb24uCi0mbHQ7L3AmZ3Q7Ci0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlZmVyZW5jZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVtb3ZlRXhpc3RpbmciIHR5cGU9ImJvb2xlYW4iIHVzZT0iZGVmYXVsdCIgdmFsdWU9ImZhbHNlIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBXaGV0aGVyIHRoZSBleGlzdGluZyBsb2NhdGlvbnMgZm9yIHRoZSBlbGVtZW50IHNob3VsZCBiZSByZW1vdmVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2aXNpYmxlV2hlbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJub3QiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3IiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5kIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imluc3RhbmNlb2YiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idGVzdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzeXN0ZW1UZXN0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVxdWFscyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb3VudCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXRoIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlc29sdmUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWRhcHQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaXRlcmF0ZSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNoZWNrRW5hYmxlZCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0iZmFsc2UiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmd0OywgdGhlbiB0aGVyZSBzaG91bGQgYmUgbm8gc3ViLWVsZW1lbnRzLiAgVGhpcyBqdXN0IGNoZWNrcyB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgY29tbWFuZCwgYW5kIG1ha2VzIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgdmlzaWJsZSBpZiB0aGUgY29tbWFuZCBpcyBlbmFibGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhY3Rpb25TZXQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICZsdDtwJmd0OwotQSBuYW1lZCBncm91cCBvZiBlbGVtZW50cy4gIFRoZSB3b3JrYmVuY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHZpZXcgYWN0aW9uIHNldHMsIGFuZCBkaXNhYmxlIG9yIGVuYWJsZSB0aGVtIGFzIGRlc2lyZWQuICBJdCBpcyBhbHNvIHBvc3NpYmxlIGZvciBjZXJ0YWluIGFjdGlvbiBzZXRzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBwYXJ0aWN1bGFyIHBhcnRzIG9yIHBlcnNwZWN0aXZlcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotQW4gYWN0aW9uIHNldCBoYXMgYSBuYW1lIGFuZCBhIHVuaXF1ZSBpZGVudGlmaWVyLiAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGFjdGlvbiBzZXQgc2hvdWxkIGJlIHZpc2libGUgYnkgZGVmYXVsdC4gIFdpdGhpbiB0aGUgYWN0aW9uIHNldCBpcyBzaW1wbHkgYSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gbWVudXMsIGdyb3VwcywgaXRlbXMgYW5kIHdpZGdldHMgdGhhdCBoYXZlIGJlZW4gZGVjbGFyZWQgZWxzZXdoZXJlLgotJmx0Oy9wJmd0OwotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZWZlcmVuY2UiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgYWN0aW9uIHNldC4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGlkZW50aWZpZXIgYmUgcHJlZml4ZWQgYnkgdGhlIHBsdWctaW4gbmFtZSwgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MuICBGb3IgZXhhbXBsZSwgYW4gYWN0aW9uIHNldCBjb250cmlidXRlZCBieSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aSZsdDsvY29kZSZndDsgbWlnaHQgYmUgY2FsbGVkICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLmFjdGlvblNldDEmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBodW1hbi1yZWFkYWJsZSB0ZXh0IHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYWN0aW9uIHNldC4gIFRoaXMgdGV4dCB3aWxsIGFwcGVhciBpbiB0aGUgJnF1b3Q7Q3VzdG9taXplIFBlcnNwZWN0aXZlJnF1b3Q7IGRpYWxvZy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgbG9uZ2VyIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24gc2V0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlzaWJsZSIgdHlwZT0ic3RyaW5nIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJmYWxzZSI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgYWN0aW9uIHNldCBzaG91bGQgYmUgdmlzaWJsZSBieSBkZWZhdWx0LiAgSWYgYW4gYWN0aW9uIHNldCBpcyBub3QgdmlzaWJsZSwgdGhlbiB0aGUgYXNzb2NpYXRlZCBlbGVtZW50cyB3aWxsIG5vdCBiZSB2aXNpYmxlLiAgSWYgYW4gYWN0aW9uIHNldCBpcyB2aXNpYmxlLCB0aGVuIHRoZSAmbHQ7Y29kZSZndDt2aXNpYmxlV2hlbiZsdDsvY29kZSZndDsgY3JpdGVyaWEgZm9yIHRoZSBhc3NvY2lhdGVkIGVsZW1lbnRzIHdpbGwgYmUgZXZhbHVhdGVkIGFzIG5vcm1hbC4gIEJ5IGRlZmF1bHQsIGFjdGlvbiBzZXRzIGFyZSBub3QgdmlzaWJsZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icGFydCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgJmx0O3AmZ3Q7Ci1BbiBlbGVtZW50IHdpdGhpbiBhIGxvY2F0aW9uLiAgVGhpcyBxdWFsaWZpZXMgdGhlIGxvY2F0aW9uIHRvIHJlZmVyIHRvIGEgcGFydGljdWxhciB3b3JrYmVuY2ggcGFydC4gIFRoaXMgY2FuIGJlIGVpdGhlciBhIHZpZXcgb3IgYW4gZWRpdG9yLiAgVGhlIHF1YWxpZmljYXRpb24gY2FuIHVzZSBlaXRoZXIgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHBhcnQgKGluY2x1ZGluZyBpbmhlcml0YW5jZSksIG9yIGl0IGNhbiByZWZlciB0byB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHZpZXcgb3IgZWRpdG9yLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1Pbmx5IG9uZSBvZiAmbHQ7Y29kZSZndDtpZCZsdDsvY29kZSZndDsgYW5kICZsdDtjb2RlJmd0O2NsYXNzJmx0Oy9jb2RlJmd0OyBjYW4gYmUgc3BlY2lmaWVkLgotJmx0Oy9wJmd0OwotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icG9wdXAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFydCIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSB2aWV3IG9yIGVkaXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3Mgb2YgdGhlIHBhcnQuICBUaGlzIGNhbiBiZSBhIHN1cGVyY2xhc3MsIGludGVyZmFjZSBvciBzdXBlcmludGVyZmFjZSBvZiB0aGUgcGFydCwgYW5kIGl0IHdpbGwgc3RpbGwgbWF0Y2guCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlZmVyZW5jZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSByZWZlcmVuY2UgdG8gYW4gYWxyZWFkeSBleGlzdGluZyBlbGVtZW50LiAgVGhpcyBpcyB1c2VkIGZvciBhY3Rpb24gc2V0cyBhbmQgbW9kaWZpY2F0aW9ucy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhpcyByZWZlcmVuY2UgcmVmZXJzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIGVsZW1lbnQgdG8gd2hpY2ggdGhpcyByZWZlcmVuY2UgcmVmZXJzLiAgVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGlmIHRoZXJlIGFyZSBlbGVtZW50cyBvZiBkaWZmZXJlbnQgdHlwZXMgd2l0aCB0aGUgc2FtZSBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Im1lbnUiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZ3JvdXAiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaXRlbSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ3aWRnZXQiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImR5bmFtaWMiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImNsYXNzIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEFsbG93cyBtb2RpZmljYXRpb24gb2YgYSBncm91cCBvciBtZW51IGFzIGl0cyBhYm91dCB0byBzaG93LiAgVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyB0aGF0IGlmIHRoZSBjb3JyZXNwb25kaW5nIGdyb3VwIG9yIG1lbnUgYmVjb21lcyB2aXNpYmxlIGluIHRoZSB1c2VyIGludGVyZmFjZSwgdGhpcyB3aWxsIGxlYWQgdG8gcGx1Zy1pbiBsb2FkaW5nLiAgJmx0O3N0cm9uZyZndDtVc2UgdGhpcyBlbGVtZW50IHdpdGggY2F1dGlvbiwgYXMgaXQgY2FuIGNhdXNlIHBlcmZvcm1hbmNlIHByb2JsZW1zLiZsdDsvc3Ryb25nJmd0OwotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjbGFzcyIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBjbGFzcyBpcyBsb2FkZWQgdG8gbW9kaWZ5IHRoZSBhcHByb3ByaWF0ZSBncm91cCBvciBtZW51IHdoZW4gaXQgc2hvd3MuICBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50ICZsdDtjb2RlJmd0O0lEeW5hbWljTWVudSZsdDsvY29kZSZndDsuICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlICZsdDtjb2RlJmd0O2NsYXNzJmx0Oy9jb2RlJmd0OyBlbGVtZW50IGluc3RlYWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InBhcmFtZXRlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBwYXJhbWV0ZXIgdG8gZWl0aGVyIGFuIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIG9yIGEgY29tbWFuZCAtLSBkZXBlbmRpbmcgb24gd2hlcmUgaXQgYXBwZWFycyBpbiB0aGUgZXh0ZW5zaW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIGlzIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIHBhc3MgdG8gdGhlIGV4ZWN1dGFibGUgZXh0ZW5zaW9uLCBvciB0aGUgaWRlbnRpZmllciBvZiB0aGUgcGFyYW1ldGVyIGZvciB0aGUgY29tbWFuZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgdG8gcGFzcyBmb3IgdGhpcyBwYXJhbWV0ZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im9yZGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBDb250cm9scyB0aGUgcG9zaXRpb24gb2YgYSBtZW51LCBncm91cCwgaXRlbSBvciB3aWRnZXQgd2l0aGluIGEgcGFydGljdWxhciBsb2NhdGlvbi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9zaXRpb24iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICZsdDtwJmd0OwotVGhpcyBhdHRyaWJ1dGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHZhbHVlczogJmx0O2NvZGUmZ3Q7c3RhcnQmbHQ7L2NvZGUmZ3Q7IChwdXQgdGhlIGVsZW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGFpbmVyKTsgJmx0O2NvZGUmZ3Q7ZW5kJmx0Oy9jb2RlJmd0OyAocHV0IHRoZSBlbGVtZW50IGF0IHRoZSBlbmQgb2YgaXRzIGNvbnRhaW5lcik7ICZsdDtjb2RlJmd0O2FmdGVyJmx0Oy9jb2RlJmd0OyAocHV0IHRoZSBlbGVtZW50IGFmdGVyIHRoZSBzaWJsaW5nIGVsZW1lbnQgd2hvc2UgaWQgbWF0Y2hlcyAmbHQ7Y29kZSZndDtyZWYmbHQ7L2NvZGUmZ3Q7KTsgYW5kLCAmbHQ7Y29kZSZndDtiZWZvcmUmbHQ7L2NvZGUmZ3Q7IChwdXQgdGhlIGVsZW1lbnQgYmVmb3JlIHRoZSBzaWJsaW5nIGVsZW1lbnQgd2hvc2UgaWQgbWF0Y2hlcyAmbHQ7Y29kZSZndDtyZWYmbHQ7L2NvZGUmZ3Q7KS4gIFJlbGF0aXZlIG9yZGVyaW5nIGNhbiBiZSBhcHBsaWVkIHRvIGFueSB0eXBlIG9mIG1lbnUgZWxlbWVudC4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotSW4gdGhlIGV2ZW50IG9mIGNvbmZsaWN0cywgRWNsaXBzZSB3aWxsIGNob3NlIGFuIGFyYml0cmFyeSBvcmRlci4gIFRoZSBvbmx5IGd1YXJhbnRlZSBpcyB0aGF0LCBpbiB0aGUgZXZlbnQgb2YgYSBjb25mbGljdCwgdGhlIG9yZGVyIHdpbGwgcmVtYWluIHRoZSBzYW1lIGFzIGxvbmcgYXMgdGhlIGZvbGxvd2luZyBob2xkczoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSZsdDtsaSZndDtUaGUgRWNsaXBzZSB2ZXJzaW9uIGlzIHRoZSBzYW1lLiZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7VGhlIGxpc3Qgb2YgZWxlbWVudHMgaXMgdGhlIHNhbWUgKGkuZS4sIG5vIGR5bmFtaWMgZWxlbWVudHMsIG5vIHBsdWctaW5zIGFkZGVkIG9yIHJlbW92ZWQpLiZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnQiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZW5kIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImJlZm9yZSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJhZnRlciI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWxhdGl2ZVRvIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgcG9zaXRpb24gaXMgcmVsYXRpdmUuICBUaGlzIHZhbHVlIGlzIHJlcXVpcmVkIGlmIHRoZSAmbHQ7Y29kZSZndDtwb3NpdGlvbiZsdDsvY29kZSZndDsgaXMgJmx0O2NvZGUmZ3Q7YmVmb3JlJmx0Oy9jb2RlJmd0OyBvciAmbHQ7Y29kZSZndDthZnRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InBvcHVwIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBQYXJ0IG9mIGEgbG9jYXRpb24uICBJdCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVudSwgZ3JvdXAsIGl0ZW0gb3Igd2lkZ2V0IHNob3VsZCBhcHBlYXIgaW4gdGhlIHBvcHVwIG1lbnUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwb3B1cCBtZW51LiAgSWYgbm9uZSBpcyBzcGVjaWZpZWQsIHRoZW4gaXQgd2lsbCBhcHBlYXIgaW4gYWxsIHBvcHVwIG1lbnVzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdGgiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHBhdGggd2l0aGluIHRoZSBwb3B1cCBtZW51IHRvIHBsYWNlIHRoZSBlbGVtZW50LiAgSWYgbm90IHNwZWNpZmllZCwgdGhlbiB0aGlzIGlzIGFkZGVkIHRvIHRoZSAmcXVvdDthZGRpdGlvbnMmcXVvdDsgZ3JvdXAuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLUEgYmFzaWMgbWVudSBkZWZpbml0aW9uIGxvb2tzIGxpa2UgdGhpcy4KLSZsdDsvcCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7bWVudQotIGlkPSZxdW90O2NvbS5teWNvbXBhbnkubXlwbHVnaW4ucHJvamVjdGlvbiZxdW90OwotIGxhYmVsPSZxdW90OyVGb2xkaW5nLmxhYmVsJnF1b3Q7Jmd0OwotICZsdDtsb2NhdGlvbiBtbmVtb25pYz0mcXVvdDslRm9sZGluZy5sYWJlbC5tbmVtb25pYyZxdW90OyZndDsKLSAgJmx0O3BhcnQgaWQ9JnF1b3Q7QW50RWRpdG9yJnF1b3Q7Jmd0OwotICAgJmx0O3BvcHVwIGlkPSZxdW90OyNSdWxlckNvbnRleHQmcXVvdDsgcGF0aD0mcXVvdDtyZXN0JnF1b3Q7IC8mZ3Q7Ci0gICZsdDsvcGFydCZndDsKLSAmbHQ7L2xvY2F0aW9uJmd0OwotJmx0Oy9tZW51Jmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7cCZndDsKLUluIHRoaXMgZXhhbXBsZSwgdGhlIHBsdWctaW4gZGV2ZWxvcGVyIGlzIGNvbnRyaWJ1dGluZyB0byBhbGwgcGFydHMgd2hvIHN1YmNsYXNzIG9yIGltcGxlbWVudCB0aGUgZ2l2ZW4gdHlwZS4gIFRoaXMgYWxsb3dzLCBmb3IgZXhhbXBsZSwgZm9yIHNvbWUgY29udHJpYnV0aW9ucyB0byBiZSBhZGRlZCB0byBhbGwgdGV4dCBlZGl0b3JzLgotJmx0Oy9wJmd0OwotJmx0O3ByZSZndDsKLSZsdDttZW51Ci0gaWQ9JnF1b3Q7Y29tLm15Y29tcGFueS5teXBsdWdpbi50ZXh0RWRpdG9yTWVudSZxdW90OwotIGxhYmVsPSZxdW90O1RleHQgQ29tbWFuZHMmcXVvdDsmZ3Q7Ci0gJmx0O2xvY2F0aW9uIG1uZW1vbmljPSZxdW90O1gmcXVvdDsmZ3Q7Ci0gICZsdDtwYXJ0IGNsYXNzPSZxdW90O0Fic3RyYWN0VGV4dEVkaXRvciZxdW90OyZndDsKLSAgICZsdDtwb3B1cCBpZD0mcXVvdDsjUnVsZXJDb250ZXh0JnF1b3Q7IHBhdGg9JnF1b3Q7cmVzdCZxdW90OyAvJmd0OwotICAmbHQ7L3BhcnQmZ3Q7Ci0gJmx0Oy9sb2NhdGlvbiZndDsKLSZsdDsvbWVudSZndDsKLSZsdDsvcHJlJmd0OwotJmx0O3AmZ3Q7Ci1UbyBkZWZpbmUgYSBkeW5hbWljIG1lbnUsIHRoZSAmbHQ7Y29kZSZndDtkeW5hbWljJmx0Oy9jb2RlJmd0OyBlbGVtZW50IGlzIHVzZWQuICBUaGUgb25seSByZWFsIGRpZmZlcmVuY2UgaGVyZSBpcyB0aGF0IHRoZSBtZW51IGRlZmluZXMgYSBjYWxsLWJhY2sgY2xhc3MuICBUaGlzIGNsYXNzIGlzIG5vdGlmaWVkIHdoZW4gdGhlIG1lbnUgaXMgYWJvdXQgdG8gY2hhbmdlIGZyb20gbm90IHNob3dpbmcgdG8gc2hvd2luZy4gIEF0IHRoaXMgcG9pbnQsIHRoZSBjbGFzcyBpcyBnaXZlbiBhIGNoYW5jZSB0byBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIGl0cyBncm91cC4KLSZsdDsvcCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7bWVudQotIGlkPSZxdW90O2NvbS5teWNvbXBhbnkubXlwbHVnaW4uRHluYW1pY01lbnUmcXVvdDsKLSBsYWJlbD0mcXVvdDslRHluYW1pY01lbnUubGFiZWwmcXVvdDsmZ3Q7Ci0gJmx0O2R5bmFtaWMgY2xhc3M9JnF1b3Q7RHluYW1pY01lbnUmcXVvdDsgLyZndDsKLSAmbHQ7bG9jYXRpb24gbW5lbW9uaWM9JnF1b3Q7JW1uZW1vbmljJnF1b3Q7Jmd0OwotICAmbHQ7bWVudWJhciBwYXRoPSZxdW90O29yZy5lY2xpcHNlLnVpLnJ1bi9ydW5Hcm91cCZxdW90OyAvJmd0OwotICZsdDsvbG9jYXRpb24mZ3Q7Ci0mbHQ7L21lbnUmZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDtwJmd0OwotSXQgaXMgcG9zc2libGUgdG8gYXNzb2NpYXRlIGhlbHAgd2l0aCBhIG1lbnUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotJmx0O21lbnUKLSBpZD0mcXVvdDtjb20ubXljb21wYW55Lm15cGx1Z2luLlJ1bldpdGhDb25maWd1cmF0aW9uQWN0aW9uJnF1b3Q7Ci0gbGFiZWw9JnF1b3Q7UnVuIFdpdGggQ29uZmlndXJhdGlvbiZxdW90OwotIGhlbHBDb250ZXh0SWQ9JnF1b3Q7cnVuX3dpdGhfY29uZmlndXJhdGlvbl9jb250ZXh0JnF1b3Q7Jmd0OwotICZsdDtsb2NhdGlvbiZndDsKLSAgJmx0O21lbnViYXIgLyZndDsKLSAmbHQ7L2xvY2F0aW9uJmd0OwotJmx0Oy9tZW51Jmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7cCZndDsKLVdpdGhpbiBhIG1lbnUsIGl0IGlzIHBvc3NpYmxlIHRvIGRlZmluZSBsb2dpY2FsIGdyb3Vwcy4gIFRoZXNlIGxvZ2ljYWwgZ3JvdXBzIGNhbiBlaXRoZXIgYmUgdmlzaWJsZSAoZS5nLiwgc2VwYXJhdG9ycyBhcmUgZHJhd24gYmVmb3JlIGFuZCBhZnRlciwgYXMgYXBwcm9wcmlhdGUpIG9yIGludmlzaWJsZS4gIEJ5IGRlZmF1bHQsIGxvZ2ljaWFsIGdyb3VwcyBhcmUgdmlzaWJsZS4KLSZsdDsvcCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7Z3JvdXAgaWQ9JnF1b3Q7Y29tLm15Y29tcGFueS5teXBsdWdpbi5zdGVwR3JvdXAmcXVvdDsmZ3Q7Ci0gJmx0O2xvY2F0aW9uJmd0OwotICAmbHQ7bWVudWJhciBwYXRoPSZxdW90O29yZy5lY2xpcHNlLnVpLnJ1biZxdW90OyAvJmd0OwotICZsdDsvbG9jYXRpb24mZ3Q7Ci0mbHQ7L2dyb3VwJmd0OwotJmx0O2dyb3VwCi0gaWQ9JnF1b3Q7Y29tLm15Y29tcGFueS5teXBsdWdpbi5zdGVwSW50b0dyb3VwJnF1b3Q7Ci0gc2VwYXJhdG9yc1Zpc2libGU9JnF1b3Q7ZmFsc2UmcXVvdDsgJmd0OwotICZsdDtsb2NhdGlvbiZndDsKLSAgJmx0O21lbnViYXIgcGF0aD0mcXVvdDtvcmcuZWNsaXBzZS51aS5ydW4mcXVvdDsgLyZndDsKLSAmbHQ7L2xvY2F0aW9uJmd0OwotJmx0Oy9ncm91cCZndDsKLSZsdDsvcHJlJmd0OwotJmx0O3AmZ3Q7Ci1Hcm91cHMgY2FuIGJlIGRlY2xhcmVkIHRvIGJlIGR5bmFtaWMsIGluIHRoZSBzYW1lIHdheSBhcyBtZW51cy4KLSZsdDsvcCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7Z3JvdXAKLSBpZD0mcXVvdDtjb20ubXljb21wYW55Lm15cGx1Z2luLnJ1bkhpc3RvcnkmcXVvdDsmZ3Q7Ci0gJmx0O2R5bmFtaWMgY2xhc3M9JnF1b3Q7RHluYW1pY1J1bkhpc3RvcnlHcm91cCZxdW90OyAvJmd0OwotICZsdDtsb2NhdGlvbiZndDsKLSAgJmx0O21lbnViYXIgcGF0aD0mcXVvdDtvcmcuZWNsaXBzZS51aS5ydW4vcnVuR3JvdXAmcXVvdDsgLyZndDsKLSAmbHQ7L2xvY2F0aW9uJmd0OwotJmx0Oy9ncm91cCZndDsKLSZsdDsvcHJlJmd0OwotJmx0O3AmZ3Q7Ci1JdCBpcyBwb3NzaWJsZSB0byBwbGFjZSBtZW51cywgZ3JvdXAsIGl0ZW1zIGFuZCB3aWRnZXRzIGluIG11bHRpcGxlIGxvY2F0aW9ucy4KLSZsdDsvcCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7aXRlbQotIGlkPSZxdW90O2NvbS5teWNvbXBhbnkubXlwbHVnaW4uVG9nZ2xlU3RlcEZpbHRlcnMmcXVvdDsKLSBjb21tYW5kSWQ9JnF1b3Q7Y29tLm15Y29tcGFueS5teXBsdWdpbi5Ub2dnbGVTdGVwRmlsdGVycyZxdW90OyZndDsKLSAmbHQ7bG9jYXRpb24gbW5lbW9uaWM9JnF1b3Q7JW1uZW1vbmljJnF1b3Q7Jmd0OwotICAmbHQ7bWVudWJhciBwYXRoPSZxdW90O29yZy5lY2xpcHNlLnVpLnJ1bi9lbXB0eVN0ZXBHcm91cCZxdW90OyAvJmd0OwotICZsdDsvbG9jYXRpb24mZ3Q7Ci0gJmx0O2xvY2F0aW9uJmd0OwotICAmbHQ7cGFydCBpZD0mcXVvdDtvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1ZpZXcmcXVvdDsmZ3Q7Ci0gICAmbHQ7dG9vbGJhciBwYXRoPSZxdW90O3JlbmRlckdyb3VwJnF1b3Q7IC8mZ3Q7Ci0gICZsdDsvcGFydCZndDsKLSAmbHQ7L2xvY2F0aW9uJmd0OwotICZsdDtsb2NhdGlvbiBtbmVtb25pYz0mcXVvdDslbW5lbW9uaWMmcXVvdDsmZ3Q7Ci0gICZsdDtwYXJ0IGlkPSZxdW90O29yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVmlldyZxdW90OyZndDsKLSAgICZsdDtwb3B1cCBwYXRoPSZxdW90O3JlbmRlckdyb3VwJnF1b3Q7IC8mZ3Q7Ci0gICZsdDsvcGFydCZndDsKLSAmbHQ7L2xvY2F0aW9uJmd0OwotJmx0Oy9pdGVtJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7cCZndDsKLUlmIHRoZSBwb3B1cCBlbGVtZW50IGlzIHNwZWNpZmllZCB3aXRoIG5vIGlkIGFuZCBubyBwYXJlbnQgcGFydCBlbGVtZW50LCB0aGVuIGl0IGFwcGxpZXMgdG8gYW55IGNvbnRleHQgbWVudSByZWdpc3RlcmVkIHdpdGggdGhlIHdvcmtiZW5jaC4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgYmVoYXZpb3VyIG9mIHRoZSBvbGQgb2JqZWN0IGNvbnRyaWJ1dGlvbnMuICBTaW1pbGFybHksIGEgdG9wLWxldmVsIHBvcHVwIGVsZW1lbnQgd2l0aCBhbiBpZCB3aWxsIGFmZmVjdCBhbnkgY29udGV4dCBtZW51IHJlZ2lzdGVyZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSZsdDsvcCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7aXRlbQotIGlkPSZxdW90O2NvbS5teWNvbXBhbnkubXlwbHVnaW4uT2JqZWN0Q29udHJpYnV0aW9uJnF1b3Q7Ci0gY29tbWFuZElkPSZxdW90O2NvbS5teWNvbXBhbnkubXlwbHVnaW4uT2JqZWN0Q29udHJpYnV0aW9uJnF1b3Q7Jmd0OwotICZsdDtsb2NhdGlvbiZndDsKLSAgJmx0O3BvcHVwIHBhdGg9JnF1b3Q7YWRkaXRpb25zJnF1b3Q7IC8mZ3Q7Ci0gJmx0Oy9sb2NhdGlvbiZndDsKLSZsdDsvaXRlbSZndDsKLSZsdDsvcHJlJmd0OwotJmx0O3AmZ3Q7Ci1Tb21ldGltZXMsIHlvdSBtaWdodCB3YW50IHRvIGNvbnRyb2wgdGhlIHZpc2liaWxpdHkgb2YgYW4gaXRlbS4gIFdoaWxlIG5vcm1hbGx5IGl0IGlzIHByZWZlcnJhYmxlIHRvIG1haW50YWluIHN0YWJpbGl0eSBpbiB0aGUgbGF5b3V0IG9mIG1lbnVzIGFuZCB0b29sIGJhcnMsIGl0IGlzIHNvbWV0aW1lcyBkZXNpcmFibGUgdG8gaGlkZSBpdGVtcyB0aGF0IGFyZW4mYXBvczt0IGltbWVkaWF0ZWx5IHJlbGV2ZW50LiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdHJ1ZSBvbiBjb250ZXh0IG1lbnVzLCB3aGVyZSBzcGFjZSBpcyBsaW1pdGVkLiAgSW4gdGhpcyBjYXNlLCB5b3Ugd291bGQgZGVmaW5lIGEgJmx0O2NvZGUmZ3Q7dmlzaWJsZVdoZW4mbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQuICBUaGlzIGVsZW1lbnQgaXMgYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgJmx0O2NvZGUmZ3Q7YWN0aXZlV2hlbiZsdDsvY29kZSZndDsgYW5kICZsdDtjb2RlJmd0O2VuYWJsZWRXaGVuJmx0Oy9jb2RlJmd0OyBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSAmbHQ7YSBocmVmPSZxdW90O29yZ19lY2xpcHNlX3VpX2hhbmRsZXJzLmh0bWwmcXVvdDsmZ3Q7aGFuZGxlcnMgZXh0ZW5zaW9uIHBvaW50Jmx0Oy9hJmd0Oy4KLSZsdDsvcCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7aXRlbQotIGlkPSZxdW90O2NvbS5teWNvbXBhbnkubXlwbHVnaW4uQ29udmVydFRvV2F0Y2hFeHByZXNzaW9uJnF1b3Q7Ci0gY29tbWFuZElkPSZxdW90O2NvbS5teWNvbXBhbnkubXlwbHVnaW4uQ29udmVydFRvV2F0Y2hFeHByZXNzaW9uJnF1b3Q7Jmd0OwotICZsdDtsb2NhdGlvbiBtbmVtb25pYz0mcXVvdDslbW5lbW9uaWMmcXVvdDsmZ3Q7Ci0gICZsdDtwYXJ0IGlkPSZxdW90O29yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVmlldyZxdW90OyZndDsKLSAgICZsdDtwb3B1cCBwYXRoPSZxdW90O2FkZGl0aW9ucyZxdW90OyAvJmd0OwotICAmbHQ7L3BhcnQmZ3Q7Ci0gJmx0Oy9sb2NhdGlvbiZndDsKLSAmbHQ7dmlzaWJsZVdoZW4mZ3Q7Ci0gICZsdDt3aXRoIHZhcmlhYmxlPSZxdW90O3NlbGVjdGlvbiZxdW90OyZndDsKLSAgICZsdDtpdGVyYXRlIG9wZXJhdG9yPSZxdW90O2FuZCZxdW90OyZndDsKLSAgICAmbHQ7bm90Jmd0OwotICAgICAmbHQ7aW5zdGFuY2VvZiB2YWx1ZT0mcXVvdDtJV2F0Y2hFeHByZXNzaW9uJnF1b3Q7LyZndDsKLSAgICAmbHQ7L25vdCZndDsKLSAgICAmbHQ7aW5zdGFuY2VvZiB2YWx1ZT0mcXVvdDtJRXhwcmVzc2lvbiZxdW90OyAvJmd0OwotICAgJmx0Oy9pdGVyYXRlJmd0OwotICAmbHQ7L3dpdGgmZ3Q7Ci0gJmx0Oy92aXNpYmxlV2hlbiZndDsKLSZsdDsvaXRlbSZndDsKLSZsdDsvcHJlJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgbW9zdCBjb21tb24gY2FzZSBpcyBzaW1wbHkgdG8gbWFrZSBzb21ldGhpbmcgdmlzaWJsZSB3aGVuIGl0cyBoYW5kbGVyIGlzIGVuYWJsZWQuICBUaGlzIGlzIGhhbmRsZWQgd2l0aCBzb21lIHN5bnRhY3RpYyBzdWdhci4gIFRoZXJlIGlzIGEgJmx0O2NvZGUmZ3Q7Y2hlY2tFbmFibGVkJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUgb24gdGhlICZsdDtjb2RlJmd0O3Zpc2libGVXaGVuJmx0Oy9jb2RlJmd0OyBlbGVtZW50LgotJmx0Oy9wJmd0OwotJmx0O3ByZSZndDsKLSZsdDtpdGVtCi0gaWQ9JnF1b3Q7Y29tLm15Y29tcGFueS5teXBsdWdpbi5jb21wYXJlV2l0aFBhdGNoJnF1b3Q7Ci0gY29tbWFuZElkPSZxdW90O2NvbS5teWNvbXBhbnkubXlwbHVnaW4uY29tcGFyZVdpdGhQYXRjaCZxdW90OyZndDsKLSAmbHQ7bG9jYXRpb24gbW5lbW9uaWM9JnF1b3Q7JW1uZW1vbmljJnF1b3Q7Jmd0OwotICAmbHQ7cGFydCBpZD0mcXVvdDtNeVBhcnQmcXVvdDsmZ3Q7Ci0gICAmbHQ7cG9wdXAgcGF0aD0mcXVvdDthZGRpdGlvbnMmcXVvdDsgLyZndDsKLSAgJmx0Oy9wYXJ0Jmd0OwotICZsdDsvbG9jYXRpb24mZ3Q7Ci0gJmx0O3Zpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0mcXVvdDt0cnVlJnF1b3Q7IC8mZ3Q7Ci0mbHQ7L2l0ZW0mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDtwJmd0OwotQW55IGl0ZW0gYXNzb2NpYXRlZCB3aXRoIGEgY29tbWFuZCBjYW4gaW5jbHVkZSBwYXJhbWV0ZXIgdmFsdWVzLiAgSWYgdGhlIHBhcmFtZXRlciBvZiB0aGUgZ2l2ZW4gaWRlbnRpZmllciBpcyBub3QgZGVmaW5lZCwgdGhpcyBpcyBhbiBlcnJvci4gIElmIHRoZSBpdGVtIGRvZXMgbm90IGhhdmUgYSBjb21tYW5kLCB0aGVuIHRoaXMgaXMgYWxzbyBhbiBlcnJvci4KLSZsdDsvcCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7aXRlbQotIGlkPSZxdW90O2NvbS5teWNvbXBhbnkubXlwbHVnaW4uUnVuSGlzdG9yeSZxdW90OwotIGNvbW1hbmRJZD0mcXVvdDtjb20ubXljb21wYW55Lm15cGx1Z2luLlJ1bkhpc3RvcnkmcXVvdDsmZ3Q7Ci0gJmx0O2xvY2F0aW9uJmd0OwotICAmbHQ7bWVudWJhciBwYXRoPSZxdW90O29yZy5lY2xpcHNlLnVpLnJ1biZxdW90OyAvJmd0OwotICZsdDsvbG9jYXRpb24mZ3Q7Ci0gJmx0O3BhcmFtZXRlciBuYW1lPSZxdW90O2luZGV4JnF1b3Q7IHZhbHVlPSZxdW90OzEmcXVvdDsgLyZndDsKLSZsdDsvaXRlbSZndDsKLSZsdDsvcHJlJmd0OwotJmx0O3AmZ3Q7Ci1JdCBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgcmVsYXRpdmUgb3JkZXJpbmcuICBUaGlzIGlzIGRvbmUgdXNpbmcgdGhlIG9yZGVyIGF0dHJpYnV0ZSBvbiB0aGUgbG9jYXRpb24gZWxlbWVudC4gIFRoZSBvcmRlciBhdHRyaWJ1dGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHZhbHVlczogJmx0O2NvZGUmZ3Q7c3RhcnQmbHQ7L2NvZGUmZ3Q7IChwdXQgdGhlIGVsZW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGFpbmVyKTsgZW5kIChwdXQgdGhlIGVsZW1lbnQgYXQgdGhlIGVuZCBvZiBpdHMgY29udGFpbmVyKTsgJmx0O2NvZGUmZ3Q7YWZ0ZXImbHQ7L2NvZGUmZ3Q7IChwdXQgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIHNpYmxpbmcgZWxlbWVudCB3aG9zZSBpZCBtYXRjaGVzICZsdDtjb2RlJmd0O3JlZiZsdDsvY29kZSZndDspOyBhbmQsICZsdDtjb2RlJmd0O2JlZm9yZSZsdDsvY29kZSZndDsgKHB1dCB0aGUgZWxlbWVudCBiZWZvcmUgdGhlIHNpYmxpbmcgZWxlbWVudCB3aG9zZSBpZCBtYXRjaGVzICZsdDtjb2RlJmd0O3JlZiZsdDsvY29kZSZndDspLiAgUmVsYXRpdmUgb3JkZXJpbmcgY2FuIGJlIGFwcGxpZWQgdG8gYW55IHR5cGUgb2YgbWVudSBlbGVtZW50LgotJmx0Oy9wJmd0OwotJmx0O3ByZSZndDsKLSZsdDtpdGVtCi0gaWQ9JnF1b3Q7Y29tLm15Y29tcGFueS5teXBsdWdpbi5NeUZpcnN0SXRlbSZxdW90OwotIGNvbW1hbmRJZD0mcXVvdDtjb20ubXljb21wYW55Lm15cGx1Z2luLk15Rmlyc3RDb21tYW5kJnF1b3Q7Jmd0OwotICZsdDtsb2NhdGlvbiZndDsKLSAgJmx0O29yZGVyIHBvc2l0aW9uPSZxdW90O3N0YXJ0JnF1b3Q7IC8mZ3Q7Ci0gICZsdDttZW51YmFyIHBhdGg9JnF1b3Q7b3JnLmVjbGlwc2UudWkucnVuJnF1b3Q7IC8mZ3Q7Ci0gJmx0Oy9sb2NhdGlvbiZndDsKLSZsdDsvaXRlbSZndDsKLSZsdDtpdGVtCi0gaWQ9JnF1b3Q7Y29tLm15Y29tcGFueS5teXBsdWdpbi5NeVNlY29uZEl0ZW0mcXVvdDsKLSBjb21tYW5kSWQ9JnF1b3Q7Y29tLm15Y29tcGFueS5teXBsdWdpbi5NeVNlY29uZENvbW1hbmQmcXVvdDsmZ3Q7Ci0gJmx0O2xvY2F0aW9uJmd0OwotICAmbHQ7b3JkZXIgcG9zaXRpb249JnF1b3Q7YWZ0ZXImcXVvdDsgcmVsYXRpdmVUbz0mcXVvdDtjb20ubXljb21wYW55Lm15cGx1Z2luLk15Rmlyc3RJdGVtJnF1b3Q7IC8mZ3Q7Ci0gICZsdDttZW51YmFyIHBhdGg9JnF1b3Q7b3JnLmVjbGlwc2UudWkucnVuJnF1b3Q7IC8mZ3Q7Ci0gJmx0Oy9sb2NhdGlvbiZndDsKLSZsdDsvaXRlbSZndDsKLSZsdDsvcHJlJmd0OwotJmx0O3AmZ3Q7Ci1JZiB5b3UgcmVxdWlyZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSB3aWRnZXRzIChlLmcuLCBmb3IgcmVuZGVyaW5nIGEgY29tYm8gYm94KSwgdGhlbiB5b3UgY2FuIHVzZSBhICZsdDtjb2RlJmd0O3dpZGdldCZsdDsvY29kZSZndDsgZWxlbWVudC4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgdGhhdCBpZiBhIHdpZGdldCBlbGVtZW50IGJlY29tZXMgdmlzaWJsZSBpbiB0aGUgdXNlciBpbnRlcmZhY2UsIHRoaXMgd2lsbCBsZWFkIHRvIHBsdWctaW4gbG9hZGluZy4KLSZsdDsvcCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7d2lkZ2V0Ci0gaWQ9JnF1b3Q7Y29tLm15Y29tcGFueS5teXBsdWdpbi5NeUNvbWJvQm94U2ltcGxlJnF1b3Q7Ci0gY2xhc3M9JnF1b3Q7Y29tLm15Y29tcGFueS5teXBsdWdpbi5NeUNvbWJvQm94JnF1b3Q7Jmd0OwotICZsdDtsb2NhdGlvbiZndDsKLSAgJmx0O3Rvb2xiYXIgcGF0aD0mcXVvdDtteUdyb3VwJnF1b3Q7Jmd0OwotICZsdDsvbG9jYXRpb24mZ3Q7Ci0mbHQ7L3dpZGdldCZndDsKLSZsdDt3aWRnZXQKLSBpZD0mcXVvdDtjb20ubXljb21wYW55Lm15cGx1Z2luLk15Q29tYm9Cb3hQYXJhbWV0ZXJpemVkMSZxdW90OwotIGNsYXNzPSZxdW90O2NvbS5teWNvbXBhbnkubXlwbHVnaW4uTXlDb21ib0JveDphLGIsYyZxdW90OyZndDsKLSAmbHQ7bG9jYXRpb24mZ3Q7Ci0gICZsdDt0b29sYmFyIHBhdGg9JnF1b3Q7bXlHcm91cCZxdW90OyAvJmd0OwotICZsdDsvbG9jYXRpb24mZ3Q7Ci0mbHQ7L3dpZGdldCZndDsKLSZsdDt3aWRnZXQKLSBpZD0mcXVvdDtjb20ubXljb21wYW55Lm15cGx1Z2luLk15Q29tYm9Cb3hQYXJhbWV0ZXJpemVkMiZxdW90OyZndDsKLSAmbHQ7Y2xhc3MgY2xhc3M9JnF1b3Q7Y29tLm15Y29tcGFueS5teXBsdWdpbi5NeUNvbWJvQm94JnF1b3Q7Jmd0OwotICAmbHQ7cGFyYW1ldGVyIG5hbWU9JnF1b3Q7bGlzdCZxdW90OyB2YWx1ZT0mcXVvdDthLGIsYyZxdW90OyAvJmd0OwotICAmbHQ7cGFyYW1ldGVyIG5hbWU9JnF1b3Q7c2VsZWN0ZWQmcXVvdDsgdmFsdWU9JnF1b3Q7YyZxdW90OyAvJmd0OwotICAmbHQ7cGFyYW1ldGVyIG5hbWU9JnF1b3Q7ZWRpdGFibGUmcXVvdDsgdmFsdWU9JnF1b3Q7ZmFsc2UmcXVvdDsgLyZndDsKLSAmbHQ7L2NsYXNzJmd0OwotICZsdDtsb2NhdGlvbiZndDsKLSAgJmx0O3Rvb2xiYXIgcGF0aGQ9JnF1b3Q7bXlHcm91cCZxdW90OyAvJmd0OwotICZsdDsvbG9jYXRpb24mZ3Q7Ci0mbHQ7L3dpZGdldCZndDsKLSZsdDsvcHJlJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgbW9zdCBjb21wbGV4IGNvbnRyaWJ1dGlvbiBpcyBwcm9iYWJseSB0aGUgdG9vbCBiYXIgaXRlbSB3aXRoIGEgZHJvcC1kb3duIG1lbnUsIHdoZXJlIHRoZSBpY29uIHNob3VsZCByZXByZXNlbnQgdGhlIGRyb3AtZG93biBtZW51IChhbmQgbm90IHRoZSB0b29sIGJhciBpdGVtJmFwb3M7cyBjb21tYW5kKS4gIEluIHRoaXMgZXhhbXBsZSwgdGhlIGl0ZW0gaGFzIGEgbWVudSBhc3NvY2lhdGVkIHdpdGggaXQuICBUaGlzIHNpbXBseSBtZWFucyB0aGF0IGlmIHRoZSBpdGVtIGlzIHNlbGVjdGVkIGluIGEgc3BlY2lhbCB3YXkgKGUuZy4sIGNsaWNraW5nIG9uIHRoZSByaWdodCBwYXJ0IG9mIGEgdG9vbCBpdGVtIGRyb3AtZG93biksIHRoYXQgdGhpcyBpcyB0aGUgY29tbWFuZCB0aGF0IHNob3VsZCBiZSBleGVjdXRlZC4gIEJ5IHNwZWNpZnlpbmcgYW4gaW1hZ2Ugc3R5bGUgYXR0cmlidXRlIG9uIHRoZSBsb2NhdGlvbiwgaXQgaXMgcG9zc2libGUgdG8gc2VsZWN0IGEgZGlmZmVyZW50IHNldCBvZiBpbWFnZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG1lbnUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotJmx0O2l0ZW0KLSBpZD0mcXVvdDtjb20ubXljb21wYW55Lm15cGx1Z2luLlRvb2xCYXJEcm9wRG93biZxdW90OwotIGNvbW1hbmRJZD0mcXVvdDtjb20ubXljb21wYW55Lm15cGx1Z2luLkNsaWNrQ29tbWFuZCZxdW90OyZndDsKLSAmbHQ7bG9jYXRpb24gaW1hZ2VTdHlsZT0mcXVvdDt0b29sYmFyJnF1b3Q7Jmd0OwotICAmbHQ7dG9vbGJhciBwYXRoPSZxdW90O2xhdW5jaEFjdGlvblNldC9kZWJ1ZyZxdW90OyAvJmd0OwotICZsdDsvbG9jYXRpb24mZ3Q7Ci0mbHQ7L2l0ZW0mZ3Q7Ci0mbHQ7bWVudQotIGlkPSZxdW90O2NvbS5teWNvbXBhbnkubXlwbHVnaW4uRHluYW1pY01lbnVXaXRoQ29tbWFuZCZxdW90OwotIGxhYmVsPSZxdW90OyVEeW5hbWljTWVudVdpdGhDb21tYW5kLmxhYmVsJnF1b3Q7Jmd0OwotICZsdDtkeW5hbWljIGNsYXNzPSZxdW90O2NvbS5teWNvbXBhbnkubXlwbHVnaW4uRHluYW1pY01lbnUmcXVvdDsgLyZndDsKLSZsdDsvbWVudSZndDsKLSZsdDsvcHJlJmd0OwotJmx0O3AmZ3Q7Ci1JdCBpcyBwb3NzaWJsZSB0byBkZWZpbmUgYWN0aW9uIHNldHMsIG9yIGdyb3VwcyBvZiBlbGVtZW50cyB3aXRoIGEgbmFtZS4gIFRoZSB3b3JrYmVuY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHZpZXcgYWN0b24gc2V0cywgYW5kIGRpc2FibGUgb3IgZW5hYmxlIHRoZW0gYXMgZGVzaXJlZC4gIEl0IGlzIGFsc28gcG9zc2libGUgZm9yIGNlcnRhaW4gYWN0aW9uIHNldHMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHBhcnRpY3VsYXIgcGFydHMgb3IgcGVyc3BlY3RpdmVzLgotJmx0Oy9wJmd0OwotJmx0O3ByZSZndDsKLSZsdDthY3Rpb25TZXQKLSBsYWJlbD0mcXVvdDslUHJvZmlsZUFjdGlvblNldC5sYWJlbCZxdW90OwotIHZpc2libGU9JnF1b3Q7ZmFsc2UmcXVvdDsKLSBpZD0mcXVvdDtvcmcuZWNsaXBzZS5kZWJ1Zy51aS5wcm9maWxlQWN0aW9uU2V0JnF1b3Q7Jmd0OwotICZsdDtyZWZlcmVuY2UgaWQ9JnF1b3Q7UHJvZmlsZURyb3BEb3duQWN0aW9uJnF1b3Q7IHR5cGU9JnF1b3Q7bWVudSZxdW90Oy8mZ3Q7Ci0gJmx0O3JlZmVyZW5jZSBpZD0mcXVvdDtQcm9maWxlV2l0aENvbmZpZ3VyYXRpb25BY3Rpb24mcXVvdDsgdHlwZT0mcXVvdDttZW51JnF1b3Q7LyZndDsKLSAmbHQ7cmVmZXJlbmNlIGlkPSZxdW90O1Byb2ZpbGVIaXN0b3J5TWVudUFjdGlvbiZxdW90OyB0eXBlPSZxdW90O21lbnUmcXVvdDsgLyZndDsKLSAmbHQ7cmVmZXJlbmNlIGlkPSZxdW90O09wZW5Qcm9maWxlQ29uZmlndXJhdGlvbnMmcXVvdDsgdHlwZT0mcXVvdDtpdGVtJnF1b3Q7LyZndDsKLSAgJmx0O3JlZmVyZW5jZSBpZD0mcXVvdDtQcm9maWxlTGFzdCZxdW90OyB0eXBlPSZxdW90O2l0ZW0mcXVvdDsvJmd0OwotJmx0Oy9hY3Rpb25TZXQmZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDtwJmd0OwotSXQgaXMgcG9zc2libGUgdG8gYWRkIGFuIGV4aXN0aW5nIG1lbnUgZWxlbWVudCBvZiBhbnkga2luZCAoaS5lLiwgbWVudSwgZ3JvdXAsIGl0ZW0pIHRvIGEgbmV3IGxvY2F0aW9uLiAgVGhpcyBhbGxvd3MgdGhpcmQtcGFydHkgcGx1Zy1pbiBkZXZlbG9wZXJzIHRvIGluY2x1ZGUgYW4gZXhpc3RpbmcgZGVmaW5pdGlvbiBpbiBzb21lIG5ldyBsb2NhdGlvbiAtLSBwZXJoYXBzIGluIGEgbmV3IHZpZXcgb3IgZWRpdG9yIC0tIHdpdGhvdXQgbmVlZGluZyB0byB3b3JyeSBhYm91dCB0aGluZ3MgbGlrZSBleHRlcm5hbGl6ZWQgc3RyaW5ncy4gIEEgcmVmZXJlbmNlIGluaGVyaXRzIGFsbCBvZiBpdHMgcHJvcGVydGllcyBmcm9tIHRoZSBlbGVtZW50IHRvIHdoaWNoIGl0IHJlZmVycy4KLSZsdDsvcCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7bW9kaWZpY2F0aW9uJmd0OwotICZsdDtyZWZlcmVuY2UgaWQ9JnF1b3Q7U29tZW9uZUVsc2VzTWVudSZxdW90OyB0eXBlPSZxdW90O21lbnUmcXVvdDsgLyZndDsKLSAmbHQ7bG9jYXRpb24mZ3Q7Ci0gICZsdDttZW51YmFyIHBhdGg9JnF1b3Q7b3JnLmVjbGlwc2UudWkucnVuJnF1b3Q7IC8mZ3Q7Ci0gJmx0Oy9sb2NhdGlvbiZndDsKLSZsdDsvbW9kaWZpY2F0aW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVG8gcmVnaXN0ZXIgYSBjb250ZXh0IG1lbnUsIHVzZSB0aGUgJmx0O2NvZGUmZ3Q7SVdvcmtiZW5jaFBhcnRTaXRlLnJlZ2lzdGVyQ29udGV4dE1lbnUmbHQ7L2NvZGUmZ3Q7IG1ldGhvZHMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL25ld1dpemFyZHMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL25ld1dpemFyZHMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVkNjUyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9uZXdXaXphcmRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0ibmV3V2l6YXJkcyIgbmFtZT0iQ3JlYXRpb24gV2l6YXJkcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHJlZ2lzdGVyIHJlc291cmNlIGNyZWF0aW9uIHdpemFyZCBleHRlbnNpb25zLiBDcmVhdGlvbiB3aXphcmRzIGFwcGVhciBhcyBjaG9pY2VzIHdpdGhpbiB0aGUgJnF1b3Q7TmV3IERpYWxvZyZxdW90OywgYW5kIGFyZSB0eXBpY2FsbHkgdXNlZCB0byBjcmVhdGUgZm9sZGVycyBhbmQgZmlsZXMuIAotJmx0O3AmZ3Q7Ci1JbiB0aGUgJnF1b3Q7TmV3IERpYWxvZyZxdW90Oywgd2l6YXJkcyBhcmUgb3JnYW5pemVkIGludG8gY2F0ZWdvcmllcyB3aGljaCB1c3VhbGx5IHJlZmxlY3QgYSBwYXJ0aWN1bGFyIHByb2JsZW0gZG9tYWluLiAgRm9yIGluc3RhbmNlLCBhIEphdmEgb3JpZW50ZWQgcGx1Z2luIG1heSBkZWZpbmUgYSBjYXRlZ29yeSBjYWxsZWQgJnF1b3Q7SmF2YSZxdW90OyB3aGljaCBpcyBhcHByb3ByaWF0ZSBmb3IgJnF1b3Q7Q2xhc3MmcXVvdDsgb3IgJnF1b3Q7UGFja2FnZSZxdW90OyBjcmVhdGlvbiB3aXphcmRzLiAgVGhlIGNhdGVnb3JpZXMgZGVmaW5lZCBieSBvbmUgcGx1Zy1pbiBjYW4gYmUgcmVmZXJlbmNlZCBieSBvdGhlciBwbHVnLWlucyB1c2luZyB0aGUgY2F0ZWdvcnkgYXR0cmlidXRlLiBVbmNhdGVnb3JpemVkIHdpemFyZHMsIGFzIHdlbGwgYXMgd2l6YXJkcyB3aXRoIGludmFsaWQgY2F0ZWdvcnkgcGF0aHMsIHdpbGwgZW5kIHVwIGluIGFuICZxdW90O090aGVyJnF1b3Q7IGNhdGVnb3J5LiAKLSZsdDsvcCZndDsKLQotJmx0O3AmZ3Q7Ci1XaXphcmRzIG1heSBvcHRpb25hbGx5IHNwZWNpZnkgYSBkZXNjcmlwdGlvbiBzdWJlbGVtZW50IHdob3NlIGJvZHkgc2hvdWxkIGNvbnRhaW4gc2hvcnQgdGV4dCBhYm91dCB0aGUgd2l6YXJkLgotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByaW1hcnlXaXphcmQiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRlZ29yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBjYXRlZ29yeQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSBvZiB0aGUgY2F0ZWdvcnkgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGRpYWxvZyBib3gKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhcmVudENhdGVnb3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcGF0aCB0byBhbm90aGVyIGNhdGVnb3J5IGlmIHRoaXMgY2F0ZWdvcnkgc2hvdWxkIGJlIGFkZGVkIGFzIGEgY2hpbGQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIiBpY29uPSJpY29uIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZWxlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHdpemFyZAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSBvZiB0aGUgd2l6YXJkIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBkaWFsb2cgYm94Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcmVsYXRpdmUgcGF0aCBvZiBhbiBpY29uIHRoYXQgd2lsbCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggdGhlIG5hbWUgdG8gcmVwcmVzZW50IHRoZSB3aXphcmQgCi1hcyBvbmUgb2YgdGhlIGNob2ljZXMgaW4gdGhlIGNyZWF0aW9uIGRpYWxvZyBib3guCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgc2xhc2gtZGVsaW1pdGVkIHBhdGggKCZhcG9zOy8mYXBvczspIG9mIGNhdGVnb3J5IElEcy4gRWFjaCB0b2tlbiBpbiB0aGUKLXBhdGggbXVzdCByZXByZXNlbnQgYSB2YWxpZCBjYXRlZ29yeSBJRCBwcmV2aW91c2x5IGRlZmluZWQKLWJ5IHRoaXMgb3Igc29tZSBvdGhlciBwbHVnLWluLiBJZiBvbWl0dGVkLCB0aGUgd2l6YXJkIHdpbGwgYmUKLWFkZGVkIHRvIHRoZSAmcXVvdDtPdGhlciZxdW90OyBjYXRlZ29yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIGltcGxlbWVudGluZyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ6b3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZCIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb2plY3QiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSB3aXphcmQgd2lsbCBjcmVhdGUgYW4gSVByb2plY3QgcmVzb3VyY2UuCi1BbHNvIGNhdXNlcyB0aGUgd2l6YXJkIHRvIGFwcGVhciBhcyBhIGNob2ljZSB3aXRoaW4gdGhlICZxdW90O05ldyBQcm9qZWN0IERpYWxvZyZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaW5hbFBlcnNwZWN0aXZlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSB3aGljaCBpZGVudGlmaWVzIGEgcGVyc3BlY3RpdmUgdG8gYWN0aXZhdGUgd2hlbiBJUHJvamVjdCByZXNvdXJjZSBjcmVhdGlvbiBpcyBmaW5pc2hlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmZXJyZWRQZXJzcGVjdGl2ZXMiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgYXR0cmlidXRlIHNwZWNpZnlpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwZXJzcGVjdGl2ZSBJRHMuICBJZiB0aGUgY3VycmVudCBwZXJzcGVjdGl2ZSBpcyBpbiB0aGlzIGxpc3QsIHRoZW4gbm8gcGVyc3BlY3RpdmUgYWN0aXZhdGlvbiBvY2N1cnMgd2hlbiBJUHJvamVjdCByZXNvdXJjZSBjcmVhdGlvbiBpcyBmaW5pc2hlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoZWxwSHJlZiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGhlbHAgdXJsIHRoYXQgY2FuIGRlc2NyaWJlIHRoaXMgd2l6YXJkIGluIGRldGFpbC4KLSZsdDtwJmd0OwotU2luY2UgMy4wCi0mbHQ7L3AmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb25JbWFnZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGxhcmdlciBpbWFnZSB0aGF0IGNhbiBoZWxwIGRlc2NyaWJlIHRoaXMgd2l6YXJkLgotJmx0O3AmZ3Q7Ci1TaW5jZSAzLjAKLSZsdDsvcCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2FuRmluaXNoRWFybHkiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIHdpemFyZCBpcyBjYXBhYmxlIG9mIGZpbmlzaGluZyB3aXRob3V0IGV2ZXIgc2hvd2luZyBwYWdlcyB0byB0aGUgdXNlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoYXNQYWdlcyIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgd2l6YXJkIHByb3ZpZGVzIGFueSBwYWdlcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgYW4gb3B0aW9uYWwgc3ViZWxlbWVudCB3aG9zZSBib2R5IGNvbnRhaW5zIGEgc2hvcnQgdGV4dCBkZXNjcmliaW5nIHdoYXQgdGhlIHdpemFyZCB3aWxsIGRvIHdoZW4gc3RhcnRlZAotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZWxlY3Rpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLiAgSWYgZWFjaCBvYmplY3QgaW4gdGhlIHdvcmtiZW5jaCBzZWxlY3Rpb24gaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSB0aGUgc2VsZWN0aW9uIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB3aXphcmQuICBPdGhlcndpc2UsIGFuIGVtcHR5IHNlbGVjdGlvbiBpcyBwYXNzZWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgZmlsdGVyLiAgRWFjaCBvYmplY3QgaW4gdGhlIHdvcmtiZW5jaCBzZWxlY3Rpb24gbXVzdCBtYXRjaCB0aGUgbmFtZSBmaWx0ZXIgdG8gYmUgcGFzc2VkIHRvIHRoZSB3aXphcmQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJpbWFyeVdpemFyZCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgYSBtZWFucyBvZiBkZWNsYXJpbmcgdGhhdCBhIHdpemFyZCBpcyAmcXVvdDtwcmltYXJ5JnF1b3Q7IGluIHRoZSBVSS4gIEEgcHJpbWFyeSB3aXphcmQgaXMgZW1waGFzaXplZCBpbiB0aGUgbmV3IHdpemFyZCBkaWFsb2cuICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZWxlbWVudCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBwbHVnIGluIGRldmVsb3BlcnMhICBUaGlzIGVsZW1lbnQgZXhpc3RzIHNvIHRoYXQgcHJvZHVjdCBtYW5hZ2VycyBtYXkgZW1waGFzaXplIGEgc2V0IG9mIHdpemFyZHMgZm9yIHRoZWlyIHByb2R1Y3RzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaWQgb2YgYSB3aXphcmQgdGhhdCBzaG91bGQgYmUgbWFkZSBwcmltYXJ5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBGb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBjcmVhdGlvbiB3aXphcmQgY29uZmlndXJhdGlvbjogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMmcXVvdDsmZ3Q7IAotICAgICAgJmx0O2NhdGVnb3J5IAotICAgICAgICBpZD0mcXVvdDtjb20ueHl6LlhZWiZxdW90OyAKLSAgICAgICAgbmFtZT0mcXVvdDtYWVogV2l6YXJkcyZxdW90OyZndDsgCi0gICAgICAmbHQ7L2NhdGVnb3J5Jmd0OyAKLSAgICAgICZsdDtjYXRlZ29yeSAKLSAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei5YWVouV2ViJnF1b3Q7IAotICAgICAgICBuYW1lPSZxdW90O1dlYiBXaXphcmRzJnF1b3Q7IAotICAgICAgICBwYXJlbnRDYXRlZ29yeT0mcXVvdDtjb20ueHl6LlhZWiZxdW90OyZndDsgCi0gICAgICAmbHQ7L2NhdGVnb3J5Jmd0OyAKLSAgICAgICZsdDt3aXphcmQgCi0gICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei53aXphcmQxJnF1b3Q7IAotICAgICAgICAgIG5hbWU9JnF1b3Q7WFlaIGFydGlmYWN0JnF1b3Q7IAotICAgICAgICAgIGNhdGVnb3J5PSZxdW90O2NvbS54eXouWFlaL2NvbS54eXouWFlaLldlYiZxdW90OyAKLSAgICAgICAgICBpY29uPSZxdW90Oy4vaWNvbnMvWFlad2l6YXJkMS5naWYmcXVvdDsgCi0gICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei5YWVpXaXphcmQxJnF1b3Q7Jmd0OyAKLSAgICAgICAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7IAotICAgICAgICAgICAgICBDcmVhdGUgYSBzaW1wbGUgWFlaIGFydGlmYWN0IGFuZCBzZXQgaW5pdGlhbCBjb250ZW50IAotICAgICAgICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7IAotICAgICAgICAgICAmbHQ7c2VsZWN0aW9uIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSZxdW90Oy8mZ3Q7ICAgICAgICAgIAotICAgICAgJmx0Oy93aXphcmQmZ3Q7IAotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBjbGFzcyBhdHRyaWJ1dGUgbXVzdCByZXByZXNlbnQgYSBjbGFzcyAKLXRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkJmx0Oy9zYW1wJmd0Oy4gCi1JZiB0aGUgd2l6YXJkIGlzIGNyZWF0ZWQgZnJvbSB3aXRoaW4gdGhlIAotTmV3IFdpemFyZCBpdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGV4aXN0aW5nIHdpemFyZC4gIAotSWYgdGhlIHdpemFyZCBpcyBsYXVuY2hlZCBhcyBhIHNob3J0Y3V0IAotKGZyb20gdGhlIEZpbGUgTmV3IG1lbnUgb3IgYSB0b29sYmFyIGJ1dHRvbikgaXQgd2lsbCAKLWFwcGVhciBzdGFuZGFsb25lIGFzIGEgc2VwYXJhdGUgZGlhbG9nIGJveC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHdvcmtiZW5jaCBjb21lcyB3aXRoIHdpemFyZHMgZm9yIGNyZWF0aW5nIGVtcHR5IAotcmVzb3VyY2VzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXM6IAotcHJvamVjdCwgZm9sZGVyIGFuZCBmaWxlLiBUaGVzZSB3aXphcmRzIGFyZSByZWdpc3RlcmVkIAotdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIGRlc2NyaWJlZCBhYm92ZS4gCi1BZGRpdGlvbmFsIHdpemFyZHMgbWF5IGFsc28gYXBwZWFyLCBzdWJqZWN0IHRvIAotcGFydGljdWxhciBwbGF0Zm9ybSBpbnN0YWxsYXRpb24uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvcGVyc3BlY3RpdmVFeHRlbnNpb25zLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9wZXJzcGVjdGl2ZUV4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEwMDc4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9wZXJzcGVjdGl2ZUV4dGVuc2lvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJwZXJzcGVjdGl2ZUV4dGVuc2lvbnMiIG5hbWU9IlBlcnNwZWN0aXZlIEV4dGVuc2lvbnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBleHRlbmQgcGVyc3BlY3RpdmVzIAotcmVnaXN0ZXJlZCBieSBvdGhlciBwbHVnLWlucy4gQSBwZXJzcGVjdGl2ZSBkZWZpbmVzIAotdGhlIGluaXRpYWwgY29udGVudHMgb2YgdGhlIHdpbmRvdyBhY3Rpb24gYmFycyAKLShtZW51IGFuZCB0b29sYmFyKSBhbmQgdGhlIGluaXRpYWwgc2V0IG9mIHZpZXdzIAotYW5kIHRoZWlyIGxheW91dCB3aXRoaW4gYSB3b3JrYmVuY2ggcGFnZS4gIAotT3RoZXIgcGx1Zy1pbnMgbWF5IGNvbnRyaWJ1dGUgYWN0aW9ucyBvciB2aWV3cyB0byAKLXRoZSBwZXJzcGVjdGl2ZSB3aGljaCBhcHBlYXIgd2hlbiB0aGUgcGVyc3BlY3RpdmUgCi1pcyBzZWxlY3RlZC4gIE9wdGlvbmFsIGFkZGl0aW9ucyBieSBvdGhlciBwbHVnLWlucyAKLWFyZSBhcHBlbmRlZCB0byB0aGUgaW5pdGlhbCBkZWZpbml0aW9uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwZXJzcGVjdGl2ZUV4dGVuc2lvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icGVyc3BlY3RpdmVFeHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9InRhcmdldElEIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY3Rpb25TZXQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlld1Nob3J0Y3V0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBlcnNwZWN0aXZlU2hvcnRjdXQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibmV3V2l6YXJkU2hvcnRjdXQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlldyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzaG93SW5QYXJ0Ii8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0SUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwZXJzcGVjdGl2ZSAoYXMgc3BlY2lmaWVkIGluIHRoZSByZWdpc3RyeSkgaW50byB3aGljaCB0aGUgY29udHJpYnV0aW9uIGlzIG1hZGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFjdGlvblNldCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYWN0aW9uIHNldCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwZXJzcGVjdGl2ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmlld1Nob3J0Y3V0Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB2aWV3IHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHBlcnNwZWN0aXZlJmFwb3M7cyAmcXVvdDtTaG93IFZpZXcmcXVvdDsgc3VibWVudSBvZiB0aGUgJnF1b3Q7V2luZG93JnF1b3Q7IG1lbnUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InBlcnNwZWN0aXZlU2hvcnRjdXQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHBlcnNwZWN0aXZlIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHBlcnNwZWN0aXZlJmFwb3M7cyAmcXVvdDtPcGVuIFBlcnNwZWN0aXZlJnF1b3Q7IHN1Ym1lbnUgb2YgdGhlICZxdW90O1dpbmRvdyZxdW90OyBtZW51LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJuZXdXaXphcmRTaG9ydGN1dCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgbmV3IHdpemFyZCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwZXJzcGVjdGl2ZSZhcG9zO3MgJnF1b3Q7TmV3JnF1b3Q7IHN1Ym1lbnUgb2YgdGhlICZxdW90O0ZpbGUmcXVvdDsgbWVudS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic2hvd0luUGFydCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdmlldyB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwZXJzcGVjdGl2ZSZhcG9zO3MgJnF1b3Q7U2hvdyBJbi4uLiZxdW90OyBwcm9tcHRlciBpbiB0aGUgTmF2aWdhdGUgbWVudS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmlldyI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdmlldyB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwZXJzcGVjdGl2ZSBsYXlvdXQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVsYXRpdmUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGEgdmlldyB3aGljaCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcGVyc3BlY3RpdmUuICBUaGlzIHdpbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBwb2ludCBmb3IgcGxhY2VtZW50IG9mIHRoZSB2aWV3LiAgVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZXNlIHR3byB2aWV3cyBpcyBkZWZpbmVkIGJ5ICZsdDtzYW1wJmd0O3JlbGF0aW9uc2hpcCZsdDsvc2FtcCZndDsuICBJZ25vcmVkIGlmIHJlbGF0aW9uc2hpcCBpcyAmcXVvdDtmYXN0JnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlbGF0aW9uc2hpcCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiAmbHQ7c2FtcCZndDtpZCZsdDsvc2FtcCZndDsgYW5kCi0mbHQ7c2FtcCZndDtyZWxhdGl2ZSZsdDsvc2FtcCZndDsuIAotVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHN1cHBvcnRlZDoKLSZsdDt1bCZndDsKLSZsdDtiJmd0O2Zhc3QmbHQ7L2ImZ3Q7IC0gdGhlIHZpZXcgZXh0ZW5zaW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBhIGZhc3Qgdmlldy4KLSZsdDticiZndDsmbHQ7YiZndDtzdGFjayZsdDsvYiZndDsgLSB0aGUgdmlldyBleHRlbnNpb24gd2lsbCBiZSBzdGFja2VkIHdpdGggdGhlIHJlbGF0aXZlCi12aWV3IGluIGEgZm9sZGVyLgotJmx0O2JyJmd0OyZsdDtiJmd0O2xlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSZsdDsvYiZndDsgLSB0aGUgdmlldyBleHRlbnNpb24gd2lsbCBiZSBwbGFjZWQKLWJlc2lkZSB0aGUgcmVsYXRpdmUgdmlldy4gSW4gdGhpcyBjYXNlIGEgJmx0O3NhbXAmZ3Q7cmF0aW8mbHQ7L3NhbXAmZ3Q7IG11c3QgYWxzbwotYmUgZGVmaW5lZC4mbHQ7L3VsJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ic3RhY2siPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJyaWdodCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ0b3AiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iYm90dG9tIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZhc3QiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmF0aW8iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHBlcmNlbnRhZ2Ugb2YgYXJlYSB3aXRoaW4gdGhlIHJlbGF0aXZlIHZpZXcgd2hpY2ggd2lsbCBiZSBkb25hdGVkIHRvIHRoZSB2aWV3IGV4dGVuc2lvbi4gSWYgdGhlIHZpZXcgZXh0ZW5zaW9uIGlzIGEgZmFzdCB2aWV3LCB0aGUgcmF0aW8gaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHdvcmtiZW5jaCB0aGUgZmFzdCB2aWV3IHdpbGwgY292ZXIgd2hlbiBhY3RpdmUuIFRoaXMgbXVzdCBiZSBkZWZpbmVkIGFzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgYW5kIGxpZSBiZXR3ZWVuIDAuMDUgYW5kIDAuOTUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlzaWJsZSIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgdmlldyBpcyBpbml0aWFsbHkgdmlzaWJsZSB3aGVuIHRoZSBwZXJzcGVjdGl2ZSBpcyBvcGVuZWQuICBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgaGF2ZSBhIHZhbHVlIG9mICZxdW90O3RydWUmcXVvdDsgb3IgJnF1b3Q7ZmFsc2UmcXVvdDsgaWYgdXNlZC4KLUlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCB1c2VkLCB0aGUgdmlldyB3aWxsIGJlIGluaXRpYWxseSB2aXNpYmxlIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xvc2VhYmxlIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSB2aWV3IGlzIGNsb3NlYWJsZSBpbiB0aGUgdGFyZ2V0IHBlcnNwZWN0aXZlLiBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgaGF2ZSBhIHZhbHVlIG9mICZxdW90O3RydWUmcXVvdDsgb3IgJnF1b3Q7ZmFsc2UmcXVvdDsgaWYgdXNlZC4gIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCB1c2VkLCB0aGUgdmlldyB3aWxsIGJlIGNsb3NlYWJsZSwgdW5sZXNzIHRoZSBwZXJzcGVjdGl2ZSBpdHNlbGYgaXMgbWFya2VkIGFzIGZpeGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im1vdmVhYmxlIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSB2aWV3IGlzIG1vdmVhYmxlLiAgQSBub24tbW92ZWFibGUgdmlldyBjYW5ub3QgYmUgbW92ZWQgZWl0aGVyIHdpdGhpbiB0aGUgc2FtZSBmb2xkZXIsIG9yIG1vdmVkIGJldHdlZW4gZm9sZGVycyBpbiB0aGUgcGVyc3BlY3RpdmUuICBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgaGF2ZSBhIHZhbHVlIG9mICZxdW90O3RydWUmcXVvdDsgb3IgJnF1b3Q7ZmFsc2UmcXVvdDsgaWYgdXNlZC4KLUlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCB1c2VkLCB0aGUgdmlldyB3aWxsIGJlIG1vdmVhYmxlLCB1bmxlc3MgdGhlIHBlcnNwZWN0aXZlIGl0c2VsZiBpcyBtYXJrZWQgYXMgZml4ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhbmRhbG9uZSIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgdmlldyBpcyBhIHN0YW5kYWxvbmUgdmlldy4gIEEgc3RhbmRhbG9uZSB2aWV3IGNhbm5vdCBiZSBkb2NrZWQgdG9nZXRoZXIgd2l0aCBvdGhlcnMgaW4gdGhlIHNhbWUgZm9sZGVyLiAgVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O2ZhbHNlJnF1b3Q7IGlmIHVzZWQuICBUaGlzIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGlmIHRoZSByZWxhdGlvbnNoaXAgYXR0cmlidXRlIGlzICZxdW90O2Zhc3QmcXVvdDsgb3IgJnF1b3Q7c3RhY2tlZCZxdW90Oy4gIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCB1c2VkLCB0aGUgdmlldyB3aWxsIGJlIGEgcmVndWxhciB2aWV3LCBub3QgYSBzdGFuZGFsb25lIHZpZXcgKGRlZmF1bHQgaXMgJnF1b3Q7ZmFsc2UmcXVvdDspLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNob3dUaXRsZSIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgdmlldyZhcG9zO3MgdGl0bGUgaXMgc2hvd24uICBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgaGF2ZSBhIHZhbHVlIG9mICZxdW90O3RydWUmcXVvdDsgb3IgJnF1b3Q7ZmFsc2UmcXVvdDsgaWYgdXNlZC4gIFRoaXMgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdGFuZGFsb25lIHZpZXdzLiAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHVzZWQsIHRoZSB2aWV3JmFwb3M7cyB0aXRsZSB3aWxsIGJlIHNob3duIChkZWZhdWx0IGlzICZxdW90O3RydWUmcXVvdDspLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBwZXJzcGVjdGl2ZSBleHRlbnNpb24gKG5vdGUgdGhlIHN1YmVsZW1lbnRzIGFuZCB0aGUgd2F5IGF0dHJpYnV0ZXMgYXJlIHVzZWQpOgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zJnF1b3Q7Jmd0OyAKLSAgICAgICAgJmx0O3BlcnNwZWN0aXZlRXh0ZW5zaW9uIAotICAgICAgICAgICAgdGFyZ2V0SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkucmVzb3VyY2VQZXJzcGVjdGl2ZSZxdW90OyZndDsgCi0gICAgICAgICAgICAmbHQ7YWN0aW9uU2V0IGlkPSZxdW90O29yZy5lY2xpcHNlLmpkdC51aS5KYXZhQWN0aW9uU2V0JnF1b3Q7LyZndDsgCi0gICAgICAgICAgICAmbHQ7dmlld1Nob3J0Y3V0IGlkPSZxdW90O29yZy5lY2xpcHNlLmpkdC51aS5QYWNrYWdlRXhwbG9yZXImcXVvdDsvJmd0OyAKLSAgICAgICAgICAgICZsdDtuZXdXaXphcmRTaG9ydGN1dCBpZD0mcXVvdDtvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdQcm9qZWN0Q3JlYXRpb25XaXphcmQmcXVvdDsvJmd0OyAKLSAgICAgICAgICAgICZsdDtwZXJzcGVjdGl2ZVNob3J0Y3V0IGlkPSZxdW90O29yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUmcXVvdDsvJmd0OyAKLSAgICAgICAgICAgICZsdDt2aWV3IGlkPSZxdW90O29yZy5lY2xpcHNlLmpkdC51aS5QYWNrYWdlRXhwbG9yZXImcXVvdDsgCi0gICAgICAgICAgICAgICAgcmVsYXRpdmU9JnF1b3Q7b3JnLmVjbGlwc2UudWkudmlld3MuUmVzb3VyY2VOYXZpZ2F0b3ImcXVvdDsgCi0gICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPSZxdW90O3N0YWNrJnF1b3Q7LyZndDsgCi0gICAgICAgICAgICAmbHQ7dmlldyBpZD0mcXVvdDtvcmcuZWNsaXBzZS5qZHQudWkuVHlwZUhpZXJhcmNoeSZxdW90OyAKLSAgICAgICAgICAgICAgICByZWxhdGl2ZT0mcXVvdDtvcmcuZWNsaXBzZS51aS52aWV3cy5SZXNvdXJjZU5hdmlnYXRvciZxdW90OyAKLSAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9JnF1b3Q7bGVmdCZxdW90OyAKLSAgICAgICAgICAgICAgICByYXRpbz0mcXVvdDswLjUwJnF1b3Q7LyZndDsgCi0gICAgICAgICZsdDsvcGVyc3BlY3RpdmVFeHRlbnNpb24mZ3Q7IAotICAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1JbiB0aGUgZXhhbXBsZSBhYm92ZSwgYW4gYWN0aW9uIHNldCwgdmlldyBzaG9ydGN1dCwgCi1uZXcgd2l6YXJkIHNob3J0Y3V0LCBhbmQgcGVyc3BlY3RpdmUgc2hvcnRjdXQgYXJlIAotY29udHJpYnV0ZWQgdG8gdGhlIGluaXRpYWwgY29udGVudHMgb2YgdGhlIAotUmVzb3VyY2UgUGVyc3BlY3RpdmUuICBJbiBhZGRpdGlvbiwgdGhlIAotUGFja2FnZSBFeHBsb3JlciB2aWV3IGlzIHN0YWNrZWQgb24gdGhlIAotUmVzb3VyY2UgTmF2aWdhdG9yIGFuZCB0aGUgVHlwZSBIaWVyYXJjaHkgVmlldyBpcyAKLWFkZGVkIGJlc2lkZSB0aGUgUmVzb3VyY2UgTmF2aWdhdG9yLiAKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgaXRlbXMgZGVmaW5lZCB3aXRoaW4gdGhlIHBlcnNwZWN0aXZlIGV4dGVuc2lvbiBhcmUgY29udHJpYnV0ZWQgdG8gdGhlIGluaXRpYWwgY29udGVudHMgb2YgdGhlIHRhcmdldCBwZXJzcGVjdGl2ZS4gIEZvbGxvd2luZyB0aGlzLCB0aGUgdXNlciBtYXkgcmVtb3ZlIGFueSBjb250cmlidXRpb24gb3IgYWRkIG90aGVycyB0byBhIHBlcnNwZWN0aXZlIGZyb20gd2l0aGluIHRoZSB3b3JrYmVuY2ggdXNlciBpbnRlcmZhY2UuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3BlcnNwZWN0aXZlcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvcGVyc3BlY3RpdmVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNDkzZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvcGVyc3BlY3RpdmVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0icGVyc3BlY3RpdmUiIG5hbWU9IlBlcnNwZWN0aXZlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCBwZXJzcGVjdGl2ZSBmYWN0b3JpZXMgdG8gdGhlIHdvcmtiZW5jaC4gIEEgcGVyc3BlY3RpdmUgZmFjdG9yeSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgaW5pdGlhbCBsYXlvdXQgYW5kIHZpc2libGUgYWN0aW9uIHNldHMgZm9yIGEgcGVyc3BlY3RpdmUuICBUaGUgdXNlciBjYW4gc2VsZWN0IGEgcGVyc3BlY3RpdmUgYnkgaW52b2tpbmcgdGhlICZxdW90O09wZW4gUGVyc3BlY3RpdmUmcXVvdDsgc3VibWVudSBvZiB0aGUgJnF1b3Q7V2luZG93JnF1b3Q7IG1lbnUuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBlcnNwZWN0aXZlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwZXJzcGVjdGl2ZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIgaWNvbj0iaWNvbiIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBwZXJzcGVjdGl2ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHdvcmtiZW5jaCB3aW5kb3cgbWVudSBiYXIgdG8gcmVwcmVzZW50IHRoaXMgcGVyc3BlY3RpdmUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0mbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5Jmx0Oy9zYW1wJmd0OyBpbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHJlbGF0aXZlIG5hbWUgb2YgdGhlIGljb24gdGhhdCB3aWxsIGJlIGFzc29jaWF0ZWQgCi13aXRoIHRoaXMgcGVyc3BlY3RpdmUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbGF5b3V0IG9mIHRoZSBwZXJzcGVjdGl2ZSBpcyBmaXhlZC4gIElmIHRydWUsIHRoZW4gdmlld3MgY3JlYXRlZCBieSB0aGUgcGVyc3BlY3RpdmUgZmFjdG9yeSBhcmUgbm90IGNsb3NlYWJsZSwgYW5kIGNhbm5vdCBiZSBtb3ZlZC4gIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBhbiBvcHRpb25hbCBzdWJlbGVtZW50IHdob3NlIGJvZHkgc2hvdWxkIGNvbnRhaW4gdGV4dCBwcm92aWRpbmcgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcGVyc3BlY3RpdmUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHBlcnNwZWN0aXZlIGV4dGVuc2lvbjogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIAotICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMmcXVvdDsmZ3Q7IAotICAgICAgICAmbHQ7cGVyc3BlY3RpdmUgCi0gICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlJnF1b3Q7IAotICAgICAgICAgICAgbmFtZT0mcXVvdDtSZXNvdXJjZSZxdW90OyAKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLlJlc291cmNlUGVyc3BlY3RpdmUmcXVvdDsgCi0gICAgICAgICAgICBpY29uPSZxdW90O2ljb25zL015SWNvbi5naWYmcXVvdDsmZ3Q7IAotICAgICAgICAmbHQ7L3BlcnNwZWN0aXZlJmd0OyAKLSAgICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgdmFsdWUgb2YgdGhlICZsdDtzYW1wJmd0O2NsYXNzJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUgbXVzdCBiZSB0aGUgCi1mdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3RvcnkmbHQ7L3NhbXAmZ3Q7LiAKLVRoZSBjbGFzcyBtdXN0IHN1cHBseSB0aGUgaW5pdGlhbCBsYXlvdXQgZm9yIGEgCi1wZXJzcGVjdGl2ZSB3aGVuIGFza2VkIGJ5IHRoZSB3b3JrYmVuY2guCi0mbHQ7cCZndDsKLVRoZSAmbHQ7c2FtcCZndDtwbHVnaW5fY3VzdG9taXphdGlvbi5pbmkmbHQ7L3NhbXAmZ3Q7IGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgcGVyc3BlY3RpdmUuICBUaGUgJmx0O2kmZ3Q7ZGVmYXVsdCBwZXJzcGVjdGl2ZSZsdDsvaSZndDsgaXMgdGhlIGZpcnN0IHBlcnNwZWN0aXZlIHdoaWNoIGFwcGVhcnMgd2hlbiB0aGUgcHJvZHVjdCBpcyBsYXVuY2hlZCBhZnRlciBpbnN0YWxsLiAgSXQgaXMgYWxzbyB1c2VkIHdoZW4gdGhlIHVzZXIgb3BlbnMgYSBwYWdlIG9yIHdpbmRvdyB3aXRoIG5vIHNwZWNpZmllZCBwZXJzcGVjdGl2ZS4gIFRoZSBkZWZhdWx0IHBlcnNwZWN0aXZlIGlzIGRlZmluZWQgYXMgYSBwcm9wZXJ0eSB3aXRoaW4gdGhlIHBsdWdpbl9jdXN0b21pemF0aW9uLmluaSwgYXMgc2hvd24gYmVsb3cuICBUaGUgdXNlciBtYXkgYWxzbyBvdmVycmlkZSB0aGlzIHBlcnNwZWN0aXZlIGZyb20gdGhlIHdvcmtiZW5jaCBwZXJzcGVjdGl2ZXMgcHJlZmVyZW5jZSBwYWdlLiAKLSZsdDtwcmUmZ3Q7Ci0gICAgZGVmYXVsdFBlcnNwZWN0aXZlSWQgPSBvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIAotJmx0Oy9wcmUmZ3Q7Ci1UaGUgcGVyc3BlY3RpdmVzIHdoaWNoIGFwcGVhciBpbiB0aGUgJnF1b3Q7T3BlbiBQZXJzcGVjdGl2ZSZxdW90OyBtZW51IGFyZSBzaG9ydGN1dHMgZm9yIHBlcnNwZWN0aXZlIHNlbGVjdGlvbi4gIFRoaXMgc2V0IGlzIGRlZmluZWQgYnkgdGhlIGFjdGl2ZSBwZXJzcGVjdGl2ZSBpdHNlbGYsIGFuZCBleHRlbnNpb25zIG1hZGUgdGhyb3VnaCB0aGUgcGVyc3BlY3RpdmVFeHRlbnNpb25zIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHdvcmtiZW5jaCBwcm92aWRlcyBhICZxdW90O1Jlc291cmNlIFBlcnNwZWN0aXZlJnF1b3Q7LiAgCi1BZGRpdGlvbmFsIHBlcnNwZWN0aXZlcyBtYXkgYmUgYWRkZWQgYnkgcGx1Zy1pbnMuIAotVGhleSBhcmUgc2VsZWN0ZWQgdXNpbmcgdGhlICZxdW90O09wZW4gUGVyc3BlY3RpdmUmcXVvdDsgc3VibWVudSBvZiB0aGUgJnF1b3Q7V2luZG93JnF1b3Q7IG1lbnUuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvcG9wdXBNZW51cy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvcG9wdXBNZW51cy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThlZmY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3BvcHVwTWVudXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJwb3B1cE1lbnVzIiBuYW1lPSJQb3AtdXAgTWVudXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhZGQgbmV3IGFjdGlvbnMgdG8gY29udGV4dCBtZW51cyBvd25lZCBieSBvdGhlciBwbHVnLWlucy4gIEFjdGlvbiBjb250cmlidXRpb25zIG1heSBiZSBtYWRlIGFnYWluc3QgYSBzcGVjaWZpYyBvYmplY3QgdHlwZSAoJmx0O3NhbXAmZ3Q7b2JqZWN0Q29udHJpYnV0aW9uJmx0Oy9zYW1wJmd0Oykgb3IgYWdhaW5zdCBhIHNwZWNpZmljIGNvbnRleHQgbWVudSBvZiBhIHZpZXcgb3IgZWRpdG9yIHBhcnQgKCZsdDtzYW1wJmd0O3ZpZXdlckNvbnRyaWJ1dGlvbiZsdDsvc2FtcCZndDspLiBXaGVuIHVzaW5nICZsdDtzYW1wJmd0O29iamVjdENvbnRyaWJ1dGlvbiZsdDsvc2FtcCZndDssIHRoZSBjb250cmlidXRpb24gd2lsbCBhcHBlYXIgaW4gYWxsIHZpZXcgb3IgZWRpdG9yIHBhcnQgY29udGV4dCBtZW51cyB3aGVyZSBvYmplY3RzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhcmUgc2VsZWN0ZWQuIEluIGNvbnRyYXN0LCB1c2luZyAmbHQ7c2FtcCZndDt2aWV3ZXJDb250cmlidXRpb24mbHQ7L3NhbXAmZ3Q7LCB0aGUgY29udHJpYnV0aW9uIHdpbGwgb25seSBhcHBlYXIgaW4gdGhlIHNwZWNpZmllZCB2aWV3IG9yIGVkaXRvciBwYXJ0IGNvbnRleHQgbWVudSwgcmVnYXJkbGVzcyBvZiB0aGUgc2VsZWN0aW9uLgotJmx0O3AmZ3Q7Ci1XaGVuIHRoZSBzZWxlY3Rpb24gaXMgaGV0ZXJvZ2VuZW91cywgdGhlIGNvbnRyaWJ1dGlvbiB3aWxsIGJlIGFwcGxpZWQgaWYgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgY29tbW9uIHR5cGUgb2YgdGhlIHNlbGVjdGlvbiwgaWYgcG9zc2libGUuIElmIGEgZGlyZWN0IG1hdGNoIGlzIG5vdCBwb3NzaWJsZSwgbWF0Y2hpbmcgYWdhaW5zdCBzdXBlcmNsYXNzZXMgYW5kIHN1cGVyaW50ZXJmYWNlcyB3aWxsIGJlIGF0dGVtcHRlZC4gCi0mbHQ7cCZndDsKLVNlbGVjdGlvbiBjYW4gYmUgZnVydGhlciBjb25zdHJhaW5lZCB0aHJvdWdoIHRoZSB1c2Ugb2YgYSBuYW1lIGZpbHRlci4gSWYgdXNlZCwgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBzZWxlY3Rpb24gbXVzdCBtYXRjaCB0aGUgZmlsdGVyIGluIG9yZGVyIHRvIGFwcGx5IHRoZSBjb250cmlidXRpb24uIAotJmx0O3AmZ3Q7Ci1JbmRpdmlkdWFsIGFjdGlvbnMgaW4gYW4gb2JqZWN0IGNvbnRyaWJ1dGlvbiBjYW4gdXNlIHRoZSBhdHRyaWJ1dGUgJmx0O2NvZGUmZ3Q7ZW5hYmxlc0ZvciZsdDsvY29kZSZndDsgdG8gc3BlY2lmeSBpZiBpdCBzaG91bGQgb25seSBhcHBseSBmb3IgYSBzaW5nbGUsIG11bHRpcGxlLCBvciBhbnkgb3RoZXIgc2VsZWN0aW9uIHR5cGUuIAotJmx0O3AmZ3Q7Ci1JZiB0aGVzZSBmaWx0ZXJpbmcgbWVjaGFuaXNtcyBhcmUgaW5hZGVxdWF0ZSBhbiBhY3Rpb24gY29udHJpYnV0aW9uIG1heSB1c2UgdGhlICZsdDtzYW1wJmd0O2ZpbHRlciZsdDsvc2FtcCZndDsgbWVjaGFuaXNtLiAgSW4gdGhpcyBjYXNlIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0YXJnZXQgb2JqZWN0IGFyZSBkZXNjcmliZWQgaW4gYSBzZXJpZXMgb2YgbmFtZS12YWx1ZSBwYWlycy4gIFRoZSBhdHRyaWJ1dGVzIHdoaWNoIGFwcGx5IHRvIHRoZSBzZWxlY3Rpb24gYXJlIHR5cGUtc3BlY2lmaWMgYW5kIGJleW9uZCB0aGUgZG9tYWluIG9mIHRoZSB3b3JrYmVuY2ggaXRzZWxmLCBzbyB0aGUgd29ya2JlbmNoIHdpbGwgZGVsZWdhdGUgZmlsdGVyaW5nIGF0IHRoaXMgbGV2ZWwgdG8gdGhlIGFjdHVhbCBzZWxlY3Rpb24uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJjb21tb25BY3Rpb24uZXhzZCIvPgotCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iY29tbW9uRXhwcmVzc2lvbi5leHNkIi8+Ci0KLSAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3NjaGVtYS9leHByZXNzaW9uTGFuZ3VhZ2UuZXhzZCIvPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvYmplY3RDb250cmlidXRpb24iLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlld2VyQ29udHJpYnV0aW9uIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvYmplY3RDb250cmlidXRpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIGRlZmluZSBhIGdyb3VwIG9mIGFjdGlvbnMgYW5kL29yIG1lbnVzIGZvciBhbnkgdmlld2VyIGNvbnRleHQgbWVudXMgZm9yIHdoaWNoIHRoZSBvYmplY3RzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhcmUgc2VsZWN0ZWQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZpbHRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2aXNpYmlsaXR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtZW51IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9iamVjdENsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIG9yIGludGVyZmFjZSB0aGF0IGFsbCBvYmplY3RzIGluIHRoZSAKLXNlbGVjdGlvbiBtdXN0IHN1YmNsYXNzIG9yIGltcGxlbWVudC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249ImphdmEubGFuZy5vYmplY3QiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lRmlsdGVyIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIHdpbGQgY2FyZCBmaWx0ZXIgZm9yIHRoZSBuYW1lIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYWxsIG9iamVjdHMgaW4gdGhlIHNlbGVjdGlvbi4gTm8gY29udHJpYnV0aW9uIHdpbGwgdGFrZSBwbGFjZSBpZiB0aGVyZSBpcyBubyBtYXRjaC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhZGFwdGFibGUiIHR5cGU9ImJvb2xlYW4iIHVzZT0iZGVmYXVsdCIgdmFsdWU9ImZhbHNlIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgdHlwZXMgdGhhdCBhZGFwdCB0byBJUmVzb3VyY2Ugc2hvdWxkIHVzZSB0aGlzIG9iamVjdCBjb250cmlidXRpb24uIFRoaXMgZmxhZyBpcyB1c2VkIG9ubHkgaWYgb2JqZWN0Q2xhc3MgYWRhcHRzIHRvIElSZXNvdXJjZS4gIERlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZpZXdlckNvbnRyaWJ1dGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gZGVmaW5lIGEgZ3JvdXAgb2YgYWN0aW9ucyBhbmQvb3IgbWVudXMgZm9yIGEgc3BlY2lmaWMgdmlldyBvciBlZGl0b3IgcGFydCBjb250ZXh0IG1lbnUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZpc2liaWxpdHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1lbnUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgY29udHJpYnV0aW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0SUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGEgY29udGV4dCBtZW51IGluc2lkZSBhIHZpZXcgb3IgZWRpdG9yIHBhcnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFjdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibGFiZWwiIGljb249Imljb24iLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgYW4gYWN0aW9uIHRoYXQgdGhlIHVzZXIgY2FuIGludm9rZSBpbiB0aGUgVUkuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlbGVjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciB0aGlzIGFjdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgYXMgdGhlIG1lbnUgaXRlbSB0ZXh0LiBUaGUgbmFtZSBjYW4gaW5jbHVkZSBtbmVub21pYyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmluaXRpb25JZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIHNwZWNpZmllcyB0aGUgY29tbWFuZCB0aGF0IHRoaXMgYWN0aW9uIGlzIGhhbmRsaW5nLiAgVGhpcyBpcyB1c2VkIHRvIGRlY2lkZSB3aGljaCBrZXkgYmluZGluZyB0byBkaXNwbGF5IGluIHRoZSBwb3AtdXAgbWVudS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtZW51YmFyUGF0aCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHNsYXNoLWRlbGltaXRlZCBwYXRoICgmYXBvczsvJmFwb3M7KSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoaXMgYWN0aW9uIGluIHRoZSBjb250ZXh0IG1lbnUuIEVhY2ggdG9rZW4gaW4gdGhlIHBhdGgsIGV4Y2VwdCB0aGUgbGFzdCBvbmUsIG11c3QgcmVwcmVzZW50IGEgdmFsaWQgaWRlbnRpZmllciBvZiBhbiBleGlzdGluZyBtZW51IGluIHRoZSBoaWVyYXJjaHkuIFRoZSBsYXN0IHRva2VuIHJlcHJlc2VudHMgdGhlIG5hbWVkIGdyb3VwIGludG8gd2hpY2ggdGhpcyBhY3Rpb24gd2lsbCBiZSBhZGRlZC4gSWYgdGhlIHBhdGggaXMgb21pdHRlZCwgdGhpcyBhY3Rpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgc3RhbmRhcmQgYWRkaXRpb25zIGdyb3VwIGRlZmluZWQgYnkgJmx0O3NhbXAmZ3Q7SVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMmbHQ7L3NhbXAmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSByZWxhdGl2ZSBwYXRoIG9mIGFuIGljb24gdXNlZCB0byB2aXN1YWxseSByZXByZXNlbnQgdGhlIGFjdGlvbiBpbiBpdHMgY29udGV4dC4KLVRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGx1Z2luLnhtbCBmaWxlIG9mIHRoZSBjb250cmlidXRpbmcgcGx1Zy1pbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGVscENvbnRleHRJZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIGluZGljYXRpbmcgdGhlIGhlbHAgY29udGV4dCBmb3IgdGhpcyBhY3Rpb24uIE9uIHNvbWUgcGxhdGZvcm1zLCBpZiB0aGUgYWN0aW9uIGFwcGVhcnMgYXMgYSBtZW51IGl0ZW0sIHRoZW4gcHJlc3NpbmcgdGhlIGFwcHJvcHJpYXRlIGhlbHAga2V5IHdoaWxlIHRoZSBtZW51IGl0ZW0gaXMgaGlnaGxpZ2h0ZWQgd2lsbCBkaXNwbGF5IGhlbHAuIE5vdCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgdGhpcyBiZWhhdmlvdXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGUiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSB0byBkZWZpbmUgdGhlIHVzZXIgaW50ZXJmYWNlIHN0eWxlIHR5cGUgZm9yIHRoZSBhY3Rpb24uIElmIGRlZmluZWQsIHRoZSBhdHRyaWJ1dGUgdmFsdWUgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAmbHQ7dGFibGUgYm9yZGVyPSZxdW90OzAmcXVvdDsgd2lkdGg9JnF1b3Q7ODAlJnF1b3Q7Jmd0OwotICAgICAgJmx0O3RyJmd0OwotICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzI1JnF1b3Q7Jmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IG5vd3JhcCZndDsmbHQ7YiZndDtwdXNoJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7Jmd0Oy0gYXMgYSByZWd1bGFyIG1lbnUgaXRlbSBvciB0b29sIGl0ZW0uJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0O3JhZGlvJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7Jmd0Oy0gYXMgYSByYWRpbyBzdHlsZSBtZW51IGl0ZW0gb3IgdG9vbCBpdGVtLiBBY3Rpb25zIHdpdGggdGhlIHJhZGlvIHN0eWxlIHdpdGhpbiB0aGUgc2FtZSBtZW51IG9yIHRvb2xiYXIgZ3JvdXAgYmVoYXZlIGFzIGEgcmFkaW8gc2V0LiBUaGUgaW5pdGlhbCB2YWx1ZSBpcyBzcGVjaWZpZWQgYnkgdGhlICZsdDtzYW1wJmd0O3N0YXRlJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUuJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0O3RvZ2dsZSZsdDsvYiZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyZndDstIGFzIGEgY2hlY2tlZCBzdHlsZSBtZW51IGl0ZW0gb3IgYXMgYSB0b2dnbGUgdG9vbCBpdGVtLiBUaGUgaW5pdGlhbCB2YWx1ZSBpcyBzcGVjaWZpZWQgYnkgdGhlICZsdDtzYW1wJmd0O3N0YXRlJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUuJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0O3B1bGxkb3duJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7Jmd0Oy0gYXMgYSBjYXNjYWRpbmcgc3R5bGUgbWVudSBpdGVtLiZsdDsvdGQmZ3Q7Ci0gICAgICAmbHQ7L3RyJmd0OwotICAgICZsdDsvdGFibGUmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJwdXNoIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InJhZGlvIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InRvZ2dsZSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJwdWxsZG93biI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGF0ZSIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIGluaXRpYWwgc3RhdGUgKGVpdGhlciAmbHQ7c2FtcCZndDt0cnVlJmx0Oy9zYW1wJmd0OyBvciAmbHQ7c2FtcCZndDtmYWxzZSZsdDsvc2FtcCZndDspLCB1c2VkIHdoZW4gdGhlICZsdDtzYW1wJmd0O3N0eWxlJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUgaGFzIHRoZSB2YWx1ZSAmbHQ7c2FtcCZndDtyYWRpbyZsdDsvc2FtcCZndDsgb3IgJmx0O3NhbXAmZ3Q7dG9nZ2xlJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIG5hbWUgb2YgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlJmx0Oy9zYW1wJmd0OyAoZm9yIG9iamVjdCBjb250cmlidXRpb25zKSwgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSZsdDsvc2FtcCZndDsgKGZvciB2aWV3ZXIgY29udHJpYnV0aW9ucyB0byBhIHZpZXcgcGFydCksIG9yICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZSZsdDsvc2FtcCZndDsgKGZvciB2aWV3ZXIgY29udHJpYnV0aW9ucyB0byBhbiBlZGl0b3IgcGFydCkuICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSZsdDsvc2FtcCZndDsgbWF5IGJlIGltcGxlbWVudGVkIGZvciBvYmplY3QgY29udHJpYnV0aW9ucy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmFibGVzRm9yIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdmFsdWUgaW5kaWNhdGluZyB0aGUgc2VsZWN0aW9uIGNvdW50IHdoaWNoIG11c3QgYmUgbWV0IHRvIGVuYWJsZSB0aGUgYWN0aW9uLgotSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgY29uZGl0aW9uIGlzIG1ldCwgdGhlIGFjdGlvbiBpcyBlbmFibGVkLgotSWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LCB0aGUgYWN0aW9uIGlzIGRpc2FibGVkLgotSWYgbm8gYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBpcyBlbmFibGVkIGZvciBhbnkgbnVtYmVyIG9mIGl0ZW1zIHNlbGVjdGVkLgotVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgZm9ybWF0cyBhcmUgc3VwcG9ydGVkOiAKLSAgICAmbHQ7dGFibGUgYm9yZGVyPSZxdW90OzAmcXVvdDsgd2lkdGg9JnF1b3Q7ODAlJnF1b3Q7Jmd0OwotICAgICAgJmx0O3RyJmd0OwotICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzI1JnF1b3Q7Jmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IG5vd3JhcCZndDsmbHQ7YiZndDshJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7Jmd0Oy0gMCBpdGVtcyBzZWxlY3RlZCZsdDsvdGQmZ3Q7Ci0gICAgICAmbHQ7L3RyJmd0OwotICAgICAgJmx0O3RyJmd0OwotICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzI1JnF1b3Q7Jmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IG5vd3JhcCZndDsmbHQ7YiZndDs/Jmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7Jmd0Oy0gMCBvciAxIGl0ZW1zIHNlbGVjdGVkJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0OysmbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSAxIG9yIG1vcmUgaXRlbXMgc2VsZWN0ZWQmbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7bXVsdGlwbGUsIDIrJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7Jmd0Oy0gMiBvciBtb3JlIGl0ZW1zIHNlbGVjdGVkJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0O24mbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSBhIHByZWNpc2UgbnVtYmVyIG9mIGl0ZW1zIHNlbGVjdGVkLmEgcHJlY2lzZSBudW1iZXIgb2YgaXRlbXMgc2VsZWN0ZWQuJmFtcDtuYnNwOwotICAgICAgICAgIEZvciBleGFtcGxlOiBlbmFibGVzRm9yPSZhbXA7cXVvdDsgNCZhbXA7cXVvdDsgZW5hYmxlcyB0aGUgYWN0aW9uIG9ubHkgd2hlbiA0Ci0gICAgICAgICAgaXRlbXMgYXJlIHNlbGVjdGVkJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0OyombHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSBhbnkgbnVtYmVyIG9mIGl0ZW1zIHNlbGVjdGVkJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgJmx0Oy90YWJsZSZndDsKLSZsdDtwJmd0OwotVGhlIGVuYWJsZW1lbnQgY3JpdGVyaWEgZm9yIGFuIGFjdGlvbiBleHRlbnNpb24gYXJlIGluaXRpYWxseSBkZWZpbmVkIAotYnkgJmx0O3NhbXAmZ3Q7ZW5hYmxlc0ZvciZsdDsvc2FtcCZndDssICZsdDtzYW1wJmd0O3NlbGVjdGlvbiZsdDsvc2FtcCZndDsgYW5kICZsdDtzYW1wJmd0O2VuYWJsZW1lbnQmbHQ7L3NhbXAmZ3Q7LiAgSG93ZXZlciwgb25jZSB0aGUgYWN0aW9uCi1kZWxlZ2F0ZSBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgaXQgbWF5IGNvbnRyb2wgdGhlIGFjdGlvbiBlbmFibGUgc3RhdGUgZGlyZWN0bHkgCi13aXRoaW4gaXRzICZsdDtzYW1wJmd0O3NlbGVjdGlvbkNoYW5nZWQmbHQ7L3NhbXAmZ3Q7IG1ldGhvZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdmVycmlkZUFjdGlvbklkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSB0aGF0IHNwZWNpZmllcyB0aGUgaWRlbnRpZmllciBvZiBhbiBhY3Rpb24gd2hpY2ggdGhpcyBhY3Rpb24gb3ZlcnJpZGVzLiBUaGUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgaWRlbnRpZmllciB3aWxsIG5vdCBiZSBjb250cmlidXRlZCB0byB0aGUgY29udGV4dCBtZW51LiBUaGUgYWN0aW9uIGlkZW50aWZpZXIgbXVzdCBiZSBmcm9tIGEgcHJlcmVxdWlzaXRlIHBsdWctaW4gb25seS4gVGhpcyBhdHRyaWJ1dGUgaXMgb25seSBhcHBsaWNhYmxlIHRvIGFjdGlvbiBlbGVtZW50cyBvZiBhbiBvYmplY3QgY29udHJpYnV0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRvb2x0aXAiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgdGV4dCByZXByZXNlbnRpbmcgdGhlIGFjdGlvbiZhcG9zO3MgdG9vbCB0aXAuIE9ubHkgdXNlZCBpZiB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIHRvb2xiYXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmlsdGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIGV2YWx1YXRlIHRoZSBhdHRyaWJ1dGUgc3RhdGUgb2YgZWFjaCBvYmplY3QgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBBIG1hdGNoIG9ubHkgaWYgZWFjaCBvYmplY3QgaW4gdGhlIHNlbGVjdGlvbiBoYXMgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgc3RhdGUuIEVhY2ggb2JqZWN0IGluIHRoZSBzZWxlY3Rpb24gbXVzdCBpbXBsZW1lbnQsIG9yIGFkYXB0IHRvLCAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgbmFtZSBvZiBhbiBvYmplY3QmYXBvcztzIGF0dHJpYnV0ZS4gQWNjZXB0YWJsZSBuYW1lcyByZWZsZWN0IHRoZSBvYmplY3QgdHlwZSwgYW5kIHNob3VsZCBiZSBwdWJsaWNseSBkZWNsYXJlZCBieSB0aGUgcGx1Zy1pbiB3aGVyZSB0aGUgb2JqZWN0IHR5cGUgaXMgZGVjbGFyZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHJlcXVpcmVkIHZhbHVlIG9mIHRoZSBvYmplY3QmYXBvcztzIGF0dHJpYnV0ZS4gVGhlIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGUgb2JqZWN0JmFwb3M7cyBhdHRyaWJ1dGUgc2hvdWxkIGJlIHB1YmxpY2x5IGRlY2xhcmVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBwb3AtdXAgbWVudSBleHRlbnNpb24gcG9pbnQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzJnF1b3Q7Jmd0OyAKLSAgICAgICZsdDtvYmplY3RDb250cmlidXRpb24gCi0gICAgICAgICBpZD0mcXVvdDtjb20ueHl6LkMxJnF1b3Q7IAotICAgICAgICAgb2JqZWN0Q2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUmcXVvdDsgCi0gICAgICAgICBuYW1lRmlsdGVyPSZxdW90OyouamF2YSZxdW90OyZndDsgCi0gICAgICAgICAmbHQ7bWVudQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei54eXpNZW51JnF1b3Q7IAotICAgICAgICAgICAgcGF0aD0mcXVvdDthZGRpdGlvbnMmcXVvdDsgCi0gICAgICAgICAgICBsYWJlbD0mcXVvdDsmYW1wO2FtcDtYWVogSmF2YSBUb29scyZxdW90OyZndDsgCi0gICAgICAgICAgICAmbHQ7c2VwYXJhdG9yIG5hbWU9JnF1b3Q7Z3JvdXAxJnF1b3Q7LyZndDsgCi0gICAgICAgICAmbHQ7L21lbnUmZ3Q7IAotICAgICAgICAgJmx0O2FjdGlvbgotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei5ydW5YWVomcXVvdDsgCi0gICAgICAgICAgICBsYWJlbD0mcXVvdDsmYW1wO2FtcDtSdW4gWFlaIFRvb2wmcXVvdDsKLSAgICAgICAgICAgIHN0eWxlPSZxdW90O3B1c2gmcXVvdDsKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSZxdW90O2NvbS54eXoueHl6TWVudS9ncm91cDEmcXVvdDsgCi0gICAgICAgICAgICBpY29uPSZxdW90O2ljb25zL3J1blhZWi5naWYmcXVvdDsgCi0gICAgICAgICAgICBoZWxwQ29udGV4dElkPSZxdW90O2NvbS54eXoucnVuX2FjdGlvbl9jb250ZXh0JnF1b3Q7IAotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei5hY3Rpb25zLlhZWlRvb2xBY3Rpb25EZWxlZ2F0ZSZxdW90OyAKLSAgICAgICAgICAgIGVuYWJsZXNGb3I9JnF1b3Q7MSZxdW90OyAvJmd0OyAKLSAgICAgICZsdDsvb2JqZWN0Q29udHJpYnV0aW9uJmd0OyAKLSAgICAgICZsdDt2aWV3ZXJDb250cmlidXRpb24gCi0gICAgICAgICBpZD0mcXVvdDtjb20ueHl6LkMyJnF1b3Q7IAotICAgICAgICAgdGFyZ2V0SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkudmlld3MuVGFza0xpc3QmcXVvdDsmZ3Q7IAotICAgICAgICAgJmx0O2FjdGlvbgotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei5zaG93WFlaJnF1b3Q7IAotICAgICAgICAgICAgbGFiZWw9JnF1b3Q7JmFtcDthbXA7U2hvdyBYWVomcXVvdDsKLSAgICAgICAgICAgIHN0eWxlPSZxdW90O3RvZ2dsZSZxdW90OwotICAgICAgICAgICAgc3RhdGU9JnF1b3Q7dHJ1ZSZxdW90OwotICAgICAgICAgICAgbWVudWJhclBhdGg9JnF1b3Q7YWRkaXRpb25zJnF1b3Q7IAotICAgICAgICAgICAgaWNvbj0mcXVvdDtpY29ucy9zaG93WFlaLmdpZiZxdW90OyAKLSAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9JnF1b3Q7Y29tLnh5ei5zaG93X2FjdGlvbl9jb250ZXh0JnF1b3Q7IAotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei5hY3Rpb25zLlhZWlNob3dBY3Rpb25EZWxlZ2F0ZSZxdW90OyAvJmd0OyAKLSAgICAgICZsdDsvdmlld2VyQ29udHJpYnV0aW9uJmd0OyAKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGNvbnRyaWJ1dGlvbiBhY3Rpb24gd2lsbCBvbmx5IGVuYWJsZSBmb3IgYSBzaW5nbGUgc2VsZWN0aW9uICgmbHQ7c2FtcCZndDtlbmFibGVzRm9yJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUpLiBJbiBhZGRpdGlvbiwgZWFjaCBvYmplY3QgaW4gdGhlIHNlbGVjdGlvbiBtdXN0IGltcGxlbWVudCB0aGUgc3BlY2lmaWVkIGludGVyZmFjZSAoJmx0O3NhbXAmZ3Q7SUZpbGUmbHQ7L3NhbXAmZ3Q7KSBhbmQgbXVzdCBiZSBhIEphdmEgZmlsZS4gVGhpcyBhY3Rpb24gd2lsbCBiZSBhZGRlZCBpbnRvIGEgc3VibWVudSBwcmV2aW91c2x5IGNyZWF0ZWQuIFRoaXMgY29udHJpYnV0aW9uIAotd2lsbCBiZSBlZmZlY3RpdmUgaW4gYW55IHZpZXcgdGhhdCBoYXMgdGhlIHJlcXVpcmVkIHNlbGVjdGlvbi4gCi0mbHQ7cCZndDsKLUluIGNvbnRyYXN0LCB0aGUgdmlld2VyIGNvbnRyaWJ1dGlvbiBhYm92ZSB3aWxsIG9ubHkgYXBwZWFyIGluIHRoZSBUYXNrcyB2aWV3IGNvbnRleHQgbWVudSwgYW5kIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHRoZSBzZWxlY3Rpb24gaW4gdGhlIHZpZXcuIAotJmx0O3AmZ3Q7Ci1UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgdGhlIGZpbHRlciBtZWNoYW5pc20uIEluIHRoaXMgY2FzZSB0aGUgYWN0aW9uIHdpbGwgb25seSBhcHBlYXIgZm9yIElNYXJrZXJzIHdoaWNoIGFyZSBjb21wbGV0ZWQgYW5kIGhhdmUgaGlnaCBwcmlvcml0eS4gCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMmcXVvdDsmZ3Q7IAotICAgICAgJmx0O29iamVjdENvbnRyaWJ1dGlvbiAKLSAgICAgICAgIGlkPSZxdW90O2NvbS54eXouQzMmcXVvdDsgCi0gICAgICAgICBvYmplY3RDbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyJnF1b3Q7Jmd0OyAKLSAgICAgICAgICZsdDtmaWx0ZXIgbmFtZT0mcXVvdDtkb25lJnF1b3Q7IHZhbHVlPSZxdW90O3RydWUmcXVvdDsvJmd0OyAKLSAgICAgICAgICZsdDtmaWx0ZXIgbmFtZT0mcXVvdDtwcmlvcml0eSZxdW90OyB2YWx1ZT0mcXVvdDsyJnF1b3Q7LyZndDsgCi0gICAgICAgICAmbHQ7YWN0aW9uCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20ueHl6LnJ1blhZWiZxdW90OyAKLSAgICAgICAgICAgIGxhYmVsPSZxdW90O0hpZ2ggUHJpb3JpdHkgQ29tcGxldGVkIEFjdGlvbiBUb29sJnF1b3Q7IAotICAgICAgICAgICAgaWNvbj0mcXVvdDtpY29ucy9ydW5YWVouZ2lmJnF1b3Q7IAotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei5hY3Rpb25zLk1hcmtlckFjdGlvbkRlbGVnYXRlJnF1b3Q7Jmd0OyAKLSAgICAgICAgICZsdDsvYWN0aW9uJmd0OyAKLSAgICAgICZsdDsvb2JqZWN0Q29udHJpYnV0aW9uJmd0OyAKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotVGhlIGZvbGxvd2luZyBpcyBhbiBvdGhlciBleGFtcGxlIG9mIHVzaW5nIHRoZSB2aXNpYmlsaXR5IGVsZW1lbnQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzJnF1b3Q7Jmd0OyAKLSAgICAgICZsdDt2aWV3ZXJDb250cmlidXRpb24gCi0gICAgICAgICBpZD0mcXVvdDtjb20ueHl6LkM0JnF1b3Q7IAotICAgICAgICAgdGFyZ2V0SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkudmlld3MuVGFza0xpc3QmcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7dmlzaWJpbGl0eSZndDsKLSAgICAgICAgICAgICZsdDthbmQmZ3Q7Ci0gICAgICAgICAgICAgICAmbHQ7cGx1Z2luU3RhdGUgaWQ9JnF1b3Q7Y29tLnh5eiZxdW90OyB2YWx1ZT0mcXVvdDthY3RpdmF0ZWQmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgJmx0O3N5c3RlbVByb3BlcnR5IG5hbWU9JnF1b3Q7QURWQU5DRURfTU9ERSZxdW90OyB2YWx1ZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICZsdDsvYW5kJmd0OwotICAgICAgICAgJmx0Oy92aXNpYmlsaXR5Jmd0OwotICAgICAgICAgJmx0O2FjdGlvbgotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei5zaG93WFlaJnF1b3Q7IAotICAgICAgICAgICAgbGFiZWw9JnF1b3Q7JmFtcDthbXA7U2hvdyBYWVomcXVvdDsKLSAgICAgICAgICAgIHN0eWxlPSZxdW90O3B1c2gmcXVvdDsKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSZxdW90O2FkZGl0aW9ucyZxdW90OyAKLSAgICAgICAgICAgIGljb249JnF1b3Q7aWNvbnMvc2hvd1hZWi5naWYmcXVvdDsgCi0gICAgICAgICAgICBoZWxwQ29udGV4dElkPSZxdW90O2NvbS54eXouc2hvd19hY3Rpb25fY29udGV4dCZxdW90OyAKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS54eXouYWN0aW9ucy5YWVpTaG93QWN0aW9uRGVsZWdhdGUmcXVvdDsmZ3Q7IAotICAgICAgICAgJmx0Oy9hY3Rpb24mZ3Q7IAotICAgICAgJmx0Oy92aWV3ZXJDb250cmlidXRpb24mZ3Q7IAotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgc3BlY2lmaWVkIGFjdGlvbiB3aWxsIGFwcGVhciBhcyBhIG1lbnUgaXRlbSBpbiB0aGUgVGFzayB2aWV3IGNvbnRleHQgbWVudSwgYnV0IG9ubHkgaWYgdGhlICZxdW90O2NvbS54eXomcXVvdDsgcGx1Zy1pbiBpcyBhY3RpdmUgYW5kIHRoZSBzcGVjaWZpZWQgc3lzdGVtIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgYWN0aW9uIGF0dHJpYnV0ZSAmbHQ7c2FtcCZndDtjbGFzcyZsdDsvc2FtcCZndDsKLW11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIEphdmEgY2xhc3MgCi10aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlJmx0Oy9zYW1wJmd0OwotaW4gdGhlIGNhc2Ugb2Ygb2JqZWN0IGNvbnRyaWJ1dGlvbnMsIAotJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSZsdDsvc2FtcCZndDsKLWZvciBjb250cmlidXRpb25zIHRvIGNvbnRleHQgbWVudXMgdGhhdCBiZWxvbmcgdG8gdmlld3MsIAotb3IgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlJmx0Oy9zYW1wJmd0OwotZm9yIGNvbnRyaWJ1dGlvbnMgdG8gY29udGV4dCBtZW51cyB0aGF0IGJlbG9uZyB0byBlZGl0b3JzLiAgCi1JbiBhbGwgY2FzZXMsIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MgaXMgbG9hZGVkIGFzIGxhdGUgCi1hcyBwb3NzaWJsZSB0byBhdm9pZCBsb2FkaW5nIHRoZSBlbnRpcmUgcGx1Zy1pbiBiZWZvcmUgCi1pdCBpcyByZWFsbHkgbmVlZGVkLiAKLSZsdDtwJmd0OwotTm90ZTogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCAKLSZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSZsdDsvc2FtcCZndDsgbWF5IGJlIAotaW1wbGVtZW50ZWQgZm9yIG9iamVjdCBjb250cmlidXRpb25zLiAKLSZsdDtwJmd0OwotQ29uZXh0IG1lbnUgZXh0ZW5zaW9uIHdpdGhpbiBhIHBhcnQgaXMgb25seSBwb3NzaWJsZSAKLXdoZW4gdGhlIHRhcmdldCBwYXJ0IHB1Ymxpc2hlcyBhIG1lbnUgZm9yIGV4dGVuc2lvbi4gIAotVGhpcyBpcyBzdHJvbmdseSBlbmNvdXJhZ2VkLCBhcyBpdCBpbXByb3ZlcyB0aGUgCi1leHRlbnNpYmlsaXR5IG9mIHRoZSBwcm9kdWN0LiBUbyBhY2NvbXBsaXNoIHRoaXMgCi1lYWNoIHBhcnQgc2hvdWxkIHB1Ymxpc2ggYW55IGNvbnRleHQgbWVudXMgd2hpY2ggYXJlIAotZGVmaW5lZCBieSBjYWxsaW5nIAotJmx0O3NhbXAmZ3Q7SVdvcmtiZW5jaFBhcnRTaXRlLnJlZ2lzdGVyQ29udGV4dE1lbnUmbHQ7L3NhbXAmZ3Q7LiAgCi1PbmNlIHRoaXMgaGFzIGJlZW4gZG9uZSB0aGUgd29ya2JlbmNoIHdpbGwgCi1hdXRvbWF0aWNhbGx5IGluc2VydCBhbnkgYWN0aW9uIGV4dGVuc2lvbnMgd2hpY2ggZXhpc3QuIAotJmx0O3AmZ3Q7Ci1BIG1lbnUgaWQgbXVzdCBiZSBwcm92aWRlZCBmb3IgZWFjaCByZWdpc3RlcmVkIG1lbnUuICAKLUZvciBjb25zaXN0ZW5jeSBhY3Jvc3MgcGFydHMgdGhlIGZvbGxvd2luZyBzdHJhdGVneSAKLXNob3VsZCBiZSBhZG9wdGVkIGJ5IGFsbCBwYXJ0IGltcGxlbWVudG9ycy4gCi0mbHQ7cCZndDsKLSZsdDt1bCZndDsKLSZsdDtsaSZndDsKLUlmIHRoZSB0YXJnZXQgcGFydCBoYXMgb25seSBvbmUgY29udGV4dCBtZW51IGl0IAotc2hvdWxkIGJlIHJlZ2lzdGVyZWQgd2l0aCBpZCA9PSBwYXJ0IGlkLiAgVGhpcyBjYW4gYmUgCi1kb25lIGVhc2lseSBieSBjYWxsaW5nIAotJmx0O3NhbXAmZ3Q7cmVnaXN0ZXJDb250ZXh0TWVudShNZW51TWFuYWdlciwgSVNlbGVjdGlvblByb3ZpZGVyKSZsdDsvc2FtcCZndDsuICAKLUV4dGVuZGVycyBtYXkgdXNlIHRoZSBwYXJ0IGlkIGl0c2VsZiBhcyB0aGUgdGFyZ2V0SUQgZm9yIAotdGhlIGFjdGlvbiBleHRlbnNpb24uICZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7Ci1JZiB0aGUgdGFyZ2V0IHBhcnQgaGFzIG1vcmUgdGhhbiBvbmUgY29udGV4dCBtZW51IGEgCi11bmlxdWUgaWQgc2hvdWxkIGJlIGRlZmluZWQgZm9yIGVhY2guICBQcmVmaXggZWFjaCBpZCAKLXdpdGggdGhlIHBhcnQgaWQgYW5kIHB1Ymxpc2ggdGhlc2UgaWQmYXBvcztzIHdpdGhpbiAKLXRoZSBqYXZhZG9jIGZvciB0aGUgdGFyZ2V0IHBhcnQuICBSZWdpc3RlciBlYWNoIAotbWVudSBhdCBydW50aW1lIGJ5IGNhbGxpbmcgCi0mbHQ7c2FtcCZndDtyZWdpc3RlckNvbnRleHRNZW51KFN0cmluZywgTWVudU1hbmFnZXIsIElTZWxlY3Rpb25Qcm92aWRlcikmbHQ7L3NhbXAmZ3Q7LiAKLUV4dGVuZGVycyB3aWxsIHVzZSB0aGUgdW5pcXVlIG1lbnUgaWQgYXMgdGhlIHRhcmdldElEIAotZm9yIHRoZSBhY3Rpb24gZXh0ZW5zaW9uLiAmbHQ7L2xpJmd0OyZsdDsvdWwmZ3Q7Ci0mbHQ7cCZndDsKLUFueSBjb250ZXh0IG1lbnUgd2hpY2ggaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSB3b3JrYmVuY2ggCi1hbHNvIHNob3VsZCBjb250YWluIGEgc3RhbmRhcmQgaW5zZXJ0aW9uIHBvaW50IHdpdGggaWQgCi0mbHQ7c2FtcCZndDtJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUyZsdDsvc2FtcCZndDsuICAKLU90aGVyIHBsdWctaW5zIHdpbGwgdXNlIHRoaXMgdmFsdWUgYXMgYSByZWZlcmVuY2UgCi1wb2ludCBmb3IgaW5zZXJ0aW9uLiAgVGhlIGluc2VydGlvbiBwb2ludCBtYXkgYmUgCi1kZWZpbmVkIGJ5IGFkZGluZyBhIEdyb3VwTWFya2VyIHRvIHRoZSBtZW51IGF0IGFuIAotYXBwcm9wcmlhdGUgbG9jYXRpb24gZm9yIGluc2VydGlvbi4gCi0mbHQ7cCZndDsKLUFuIG9iamVjdCBpbiB0aGUgd29ya2JlbmNoIHdoaWNoIGlzIHRoZSBzZWxlY3Rpb24gCi1pbiBhIGNvbnRleHQgbWVudSBtYXkgZGVmaW5lIGFuIAotJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlciZsdDsvc2FtcCZndDsuICBUaGlzIGlzIGEgCi1maWx0ZXJpbmcgc3RyYXRlZ3kgd2hpY2ggY2FuIHBlcmZvcm0gdHlwZSBzcGVjaWZpYyAKLWZpbHRlcmluZy4gIFRoZSB3b3JrYmVuY2ggd2lsbCByZXRyaWV2ZSB0aGUgZmlsdGVyIAotZm9yIHRoZSBzZWxlY3Rpb24gYnkgdGVzdGluZyB0byBzZWUgaWYgaXQgaW1wbGVtZW50cyAKLSZsdDtzYW1wJmd0O0lBY3Rpb25GaWx0ZXImbHQ7L3NhbXAmZ3Q7LiAgSWYgdGhhdCBmYWlscywgdGhlIAotd29ya2JlbmNoIHdpbGwgYXNrIGZvciBhIGZpbHRlciB0aHJvdWdoIHRoZSAKLSZsdDtzYW1wJmd0O0lBZGFwdGFibGUmbHQ7L3NhbXAmZ3Q7IG1lY2hhbmlzbS4KLSZsdDtwJmd0OwotQWN0aW9uIGFuZCBtZW51IGxhYmVscyBtYXkgY29udGFpbiBzcGVjaWFsIGNoYXJhY3RlcnMgdGhhdCBlbmNvZGUgbW5lbW9uaWNzIHdoaWNoIGFyZSBzcGVjaWZpZWQgdXNpbmcgdGhlIGFtcGVyc2FuZCAoJmFwb3M7JmFtcDthbXA7JmFwb3M7KSBjaGFyYWN0ZXIgaW4gZnJvbnQgb2YgYSBzZWxlY3RlZCBjaGFyYWN0ZXIgaW4gdGhlIHRyYW5zbGF0ZWQgdGV4dC4gU2luY2UgYW1wZXJzYW5kIGlzIG5vdCBhbGxvd2VkIGluIFhNTCBzdHJpbmdzLCB1c2UgJmx0O3NhbXAmZ3Q7JmFtcDthbXA7YW1wOyZsdDsvc2FtcCZndDsgY2hhcmFjdGVyIGVudGl0eS4gCi0mbHQ7cCZndDsKLUlmIHR3byBvciBtb3JlIGFjdGlvbnMgYXJlIGNvbnRyaWJ1dGVkIHRvIGEgbWVudSBieSBhIHNpbmdsZSBleHRlbnNpb24gdGhlIGFjdGlvbnMgd2lsbCBhcHBlYXIgaW4gdGhlIHJldmVyc2Ugb3JkZXIgb2YgaG93IHRoZXkgYXJlIGxpc3RlZCBpbiB0aGUgcGx1Z2luLnhtbCBmaWxlLiBUaGlzIGJlaGF2aW9yIGlzIGFkbWl0dGVkbHkgdW5pbnR1aXRpdmUuICBIb3dldmVyLCBpdCB3YXMgZGlzY292ZXJlZCBhZnRlciB0aGUgIEVjbGlwc2UgUGxhdGZvcm0gQVBJIHdhcyBmcm96ZW4uICBDaGFuZ2luZyB0aGUgYmVoYXZpb3Igbm93IHdvdWxkIGJyZWFrIGV2ZXJ5IHBsdWctaW4gd2hpY2ggcmVsaWVzIHVwb24gdGhlIGV4aXN0aW5nIGJlaGF2aW9yLgotJmx0O3AmZ3Q7Ci1UaGUgJmx0O3NhbXAmZ3Q7c2VsZWN0aW9uJmx0Oy9zYW1wJmd0OyBhbmQgJmx0O3NhbXAmZ3Q7ZW5hYmxlbWVudCZsdDsvc2FtcCZndDsgZWxlbWVudHMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gVGhlICZsdDtzYW1wJmd0O2VuYWJsZW1lbnQmbHQ7L3NhbXAmZ3Q7IGVsZW1lbnQgY2FuIHJlcGxhY2UgdGhlICZsdDtzYW1wJmd0O3NlbGVjdGlvbiZsdDsvc2FtcCZndDsgZWxlbWVudCB1c2luZyB0aGUgc3ViLWVsZW1lbnRzICZsdDtzYW1wJmd0O29iamVjdENsYXNzJmx0Oy9zYW1wJmd0OyBhbmQgJmx0O3NhbXAmZ3Q7b2JqZWN0U3RhdGUmbHQ7L3NhbXAmZ3Q7LiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZzoKLSZsdDtwcmUmZ3Q7Ci0gJmx0O3NlbGVjdGlvbgotICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSZxdW90OwotICBuYW1lPSZxdW90OyouamF2YSZxdW90OyZndDsKLSAmbHQ7L3NlbGVjdGlvbiZndDsKLSZsdDsvcHJlJmd0OwotY2FuIGJlIGV4cHJlc3NlZCB1c2luZzoKLSZsdDtwcmUmZ3Q7Ci0gJmx0O2VuYWJsZW1lbnQmZ3Q7Ci0gICZsdDthbmQmZ3Q7Ci0gICAmbHQ7b2JqZWN0Q2xhc3MgbmFtZT0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSZxdW90Oy8mZ3Q7Ci0gICAmbHQ7b2JqZWN0U3RhdGUgbmFtZT0mcXVvdDtleHRlbnNpb24mcXVvdDsgdmFsdWU9JnF1b3Q7amF2YSZxdW90Oy8mZ3Q7Ci0gICZsdDsvYW5kJmd0OwotICZsdDsvZW5hYmxlbWVudCZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgd29ya2JlbmNoIHZpZXdzIGhhdmUgYnVpbHQtaW4gY29udGV4dCBtZW51cyAKLXRoYXQgYWxyZWFkeSBjb21lIGxvYWRlZCB3aXRoIGEgbnVtYmVyIG9mIGFjdGlvbnMuIAotUGx1Zy1pbnMgY2FuIGNvbnRyaWJ1dGUgdG8gdGhlc2UgbWVudXMuIElmIGEgdmlld2VyIAotaGFzIHJlc2VydmVkIHNsb3RzIGZvciB0aGVzZSBjb250cmlidXRpb25zIGFuZCB0aGV5IAotYXJlIG1hZGUgcHVibGljLCBzbG90IG5hbWVzIGNhbiBiZSB1c2VkIGFzIHBhdGhzLiAKLU90aGVyd2lzZSwgYWN0aW9ucyBhbmQgc3VibWVudXMgd2lsbCBiZSBhZGRlZCBhdCAKLXRoZSBlbmQgb2YgdGhlIHBvcC11cCBtZW51LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3ByZWZlcmVuY2VQYWdlcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvcHJlZmVyZW5jZVBhZ2VzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MDQyMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvcHJlZmVyZW5jZVBhZ2VzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0icHJlZmVyZW5jZVBhZ2VzIiBuYW1lPSJQcmVmZXJlbmNlIFBhZ2VzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB3b3JrYmVuY2ggcHJvdmlkZXMgb25lIGNvbW1vbiBkaWFsb2cgYm94IGZvciBwcmVmZXJlbmNlcy4KLVRoZSBwdXJwb3NlIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHRvIGFsbG93IHBsdWctaW5zIHRvIGFkZAotcGFnZXMgdG8gdGhlIHByZWZlcmVuY2UgZGlhbG9nIGJveC4gV2hlbiBwcmVmZXJlbmNlIGRpYWxvZyBib3gKLWlzIG9wZW5lZCAoaW5pdGlhdGVkIGZyb20gdGhlIG1lbnUgYmFyKSwgcGFnZXMgY29udHJpYnV0ZWQgaW4KLXRoaXMgd2F5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGRpYWxvZyBib3guIAotCi0mbHQ7cCZndDsKLVRoZSBwcmVmZXJlbmNlIGRpYWxvZwotYm94IHByb3ZpZGVzIGZvciBoaWVyYXJjaGljYWwgZ3JvdXBpbmcgb2YgdGhlIHBhZ2VzLiBGb3IgdGhpcwotcmVhc29uLCBhIHBhZ2UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhICZsdDtzYW1wJmd0O2NhdGVnb3J5Jmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUuCi1UaGlzCi1hdHRyaWJ1dGUgcmVwcmVzZW50cyBhIHBhdGggY29tcG9zZWQgb2YgcGFyZW50IHBhZ2UgSURzIHNlcGFyYXRlZAotYnkgJmFwb3M7LyZhcG9zOy4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgb21pdHRlZCBvciBpZiBhbnkgb2YgdGhlIHBhcmVudAotbm9kZXMgaW4gdGhlIHBhdGggY2Fubm90IGJlIGZvdW5kLCB0aGUgcGFnZSB3aWxsIGJlIGFkZGVkIGF0Ci10aGUgcm9vdCBsZXZlbC4KLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icGFnZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJrZXl3b3JkUmVmZXJlbmNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIFVJIGZvciB0aGlzIHBhZ2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIG5hbWUgb2YgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0mbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UmbHQ7L3NhbXAmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTpvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXRlZ29yeSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHBhdGggaW5kaWNhdGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIHBhZ2UgaW4gdGhlIHByZWZlcmVuY2UgdHJlZS4gVGhlIHBhdGggbWF5IGVpdGhlciBiZSBhIHBhcmVudCBub2RlIElEIG9yIGEgc2VxdWVuY2UKLSAgICAgb2YgSURzIHNlcGFyYXRlZCBieSAmYXBvczsvJmFwb3M7LCByZXByZXNlbnRpbmcgdGhlIGZ1bGwgcGF0aCBmcm9tIHRoZSByb290IG5vZGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImtleXdvcmRSZWZlcmVuY2UiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgcmVmZXJlbmNlIGJ5IGEgcHJlZmVyZW5jZSBwYWdlIHRvIGEga2V5d29yZC4gU2VlIHRoZSBrZXl3b3JkcyBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUga2V5d29yZCBiZWluZyByZWZlcnJlZCB0by4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIGZvciB0aGUgcHJlZmVyZW5jZSBleHRlbnNpb24gcG9pbnQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMmcXVvdDsmZ3Q7IAotICAgICAgJmx0O3BhZ2UgCi0gICAgICAgICBpZD0mcXVvdDtjb20ueHl6LnByZWZwYWdlMSZxdW90OyAKLSAgICAgICAgIG5hbWU9JnF1b3Q7WFlaJnF1b3Q7IAotICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei5wcmVmcGFnZXMuUHJlZlBhZ2UxJnF1b3Q7Jmd0OyAKLSAgICAgICAgICZsdDtrZXl3b3JkUmVmZXJlbmNlIGlkPSZxdW90O3h5ei5LZXl3b3JkJnF1b3Q7LyZndDsKLSAgICAgICZsdDsvcGFnZSZndDsgCi0gICAgICAmbHQ7cGFnZSAKLSAgICAgICAgIGlkPSZxdW90O2NvbS54eXoucHJlZnBhZ2UyJnF1b3Q7IAotICAgICAgICAgbmFtZT0mcXVvdDtLZXlib2FyZCBTZXR0aW5ncyZxdW90OyAKLSAgICAgICAgIGNsYXNzPSZxdW90O2NvbS54eXoucHJlZnBhZ2VzLlByZWZQYWdlMiZxdW90OyAKLSAgICAgICAgIGNhdGVnb3J5PSZxdW90O2NvbS54eXoucHJlZnBhZ2UxJnF1b3Q7Jmd0OyAKLSAgICAgICZsdDsvcGFnZSZndDsgCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBjbGFzcyBtdXN0IHJlcHJlc2VudCBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMKLSZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSZsdDsvc2FtcCZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB3b3JrYmVuY2ggYWRkcyBzZXZlcmFsIHBhZ2VzIGZvciBzZXR0aW5nIHRoZSBwcmVmZXJlbmNlcyBvZiB0aGUgcGxhdGZvcm0uIFBhZ2VzIHJlZ2lzdGVyZWQKLXRocm91Z2ggdGhpcyBleHRlbnNpb24gd2lsbCBiZSBhZGRlZCBhZnRlciB0aGVtIGFjY29yZGluZyB0byB0aGVpciBjYXRlZ29yeSBpbmZvcm1hdGlvbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9wcmVmZXJlbmNlVHJhbnNmZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3ByZWZlcmVuY2VUcmFuc2Zlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDk5ODE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3ByZWZlcmVuY2VUcmFuc2Zlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgaWQ9InByZWZlcmVuY2VUcmFuc2ZlciIgbmFtZT0iUHJlZmVyZW5jZSBUcmFuc2ZlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgd29ya2JlbmNoIHByb3ZpZGVzIHN1cHBvcnQgZm9yIG1haW50YWluaW5nIHByZWZlcmVuY2VzLgotVGhlIHB1cnBvc2Ugb2YgdGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdG8gYWxsb3cgcGx1Zy1pbnMgdG8gYWRkCi1zcGVjaWZpYyBzdXBwb3J0IGZvciBzYXZpbmcgYW5kIGxvYWRpbmcgc3BlY2lmaWMgZ3JvdXBzIG9mIHByZWZlcmVuY2VzLgotVHlwaWNhbGx5IHRoaXMgaXMgdXNlZCBmb3Igb3BlcmF0aW9ucyBzdWNoIGFzIEltcG9ydCBhbmQgRXhwb3J0LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0cmFuc2ZlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idHJhbnNmZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtYXBwaW5nIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHRyYW5zZmVyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGluIFVJIHdoZW4gbGlzdGluZyB0aGlzIGl0ZW0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSByZWxhdGl2ZSBuYW1lIG9mIHRoZSBpY29uIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gZGlzcGxheWluZyB0aGUgdHJhbnNmZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgYW4gb3B0aW9uYWwgc3ViZWxlbWVudCB3aG9zZSBib2R5IHNob3VsZCByZXByZXNlbnQgYSBzaG9ydCBkZXNjcmlwdGlvbgotb2YgdGhlIHRyYW5zZmVyIGVuZ2luZSBmdW5jdGlvbmFsaXR5LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtYXBwaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBhIHN1YmVsZW1lbnQgd2hpY2ggcmVwcmVzZW50cyBhICZsdDt0dCZndDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VGaWx0ZXImbHQ7L3R0Jmd0Oy4gIEl0IHNwZWNpZmllcyAxIG9yIG1vcmUgbWFwcGluZ3MgZnJvbSBhIHNjb3BlICZsdDt0dCZndDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlJmx0Oy90dCZndDsgdG8gMCBvciBtb3JlIG5vZGVzIHdoZXJlIDAgb3IgbW9yZSBrZXlzIGFyZSBzcGVjaWZpZWQgcGVyIG5vZGUuICBUaGUgcnVsZXMgZm9yIGV4cG9ydCBhbmQgaW1wb3J0IGJlaGF2aW91ciBmb3IgYSBmaWx0ZXIgY2FuIGJlIGZvdW5kIGluIHRoZSBzcGVjaWZpY2F0aW9ucyBpbiAmbHQ7dHQmZ3Q7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlRmlsdGVyJmx0Oy90dCZndDsuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVudHJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzY29wZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBhdHRyaWJ1dGUgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgc2NvcGUgdG8gbWFwIHRoZSBwcm92aWRlZCBub2RlcyBhbmQga2V5cyB0byAoZm9yIGV4YW1wbGUgJnF1b3Q7aW5zdGFuY2UmcXVvdDspCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVudHJ5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBhIHN1YmVsZW1lbnQgc3BlY2lmaW5nIHRoZSBub2RlcyBhbmQga2V5cyB0aGF0IGFyZSB0byBiZSB0cmFuc2ZlcnJlZCBmb3IgYSBnaXZlbiBzY29wZQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJrZXkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5vZGUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gYXR0cmlidXRlIHNwZWNpZmluZyB0aGUgcHJlZmVyZW5jZSBub2RlIHdpdGhpbiB0aGUgZ2l2ZW4gc2NvcGUgdG8gYmUgdHJhbnNmZXJyZWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ia2V5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBhdHRyaWJ1dGUgc3BlY2lmaW5nIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZmVyZW5jZSBrZXlzIHdpdGhpbiB0aGUgZ2l2ZW4gbm9kZSB0byBiZSB0cmFuc2ZlcnJlZCwgc3BlY2lmeWluZyB0aGUga2V5IGF0dHJpYnV0ZSB3aXRob3V0IHNwZWNpZnlpbmcgYSBtYXRjaGluZyBub2RlIHdpbGwgcmVzdWx0IGluIGEgcnVudGltZSBlcnJvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4xCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0OwotIEV4YW1wbGUgdGhhdCBleHBvcnQgYWxsIHRyYW5mZXJzLCBleHBvcnRzIGFsbCBub2RlcyBmb3Igc3BlY2lmaWVkIHNjb3Blcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VUcmFuc2ZlciZxdW90OyZndDsKLSAgICAgICAmbHQ7dHJhbnNmZXIKLSAgICAgICAgICAgIGljb249JnF1b3Q7WFlaLmdpZiZxdW90OwotICAgICAgICAgICAgbmFtZT0mcXVvdDtFeHBvcnQgQWxsIFRyYW5zZmVyIFRlc3QmcXVvdDsKLSAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnRlc3RzLmFsbCZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDttYXBwaW5nIHNjb3BlPSZxdW90O2luc3RhbmNlJnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0Oy9tYXBwaW5nJmd0OwotICAgJmx0O21hcHBpbmcgc2NvcGU9JnF1b3Q7Y29uZmlndXJhdGlvbiZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDsvbWFwcGluZyZndDsKLSAgICAgICAgICAgICZsdDttYXBwaW5nIHNjb3BlPSZxdW90O3Byb2plY3QmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L21hcHBpbmcmZ3Q7Ci0gICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICAgICAgICAgRXhwb3J0IGFsbCB0cmFuZmVyLCBleHBvcnRzIGFsbCBub2RlcyBmb3Igc3BlY2lmaWVkIHNjb3BlcwotICAgICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAmbHQ7L3RyYW5zZmVyJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgVmVyeSBTaW1wbGUgVHJhbnNmZXIgb25seSBwcm92aWRlcyByZXF1aXJlZCBpbmZvIGFuZCBubyBtb3JlLiAgCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlVHJhbnNmZXImcXVvdDsmZ3Q7Ci0gICAgICAgJmx0O3RyYW5zZmVyCi0gICAgICAgICAgICBuYW1lPSZxdW90O0JhcmUgQm9uZXMgVHJhbnNmZXIgVGVzdCZxdW90OwotICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkudGVzdHMuYWxsJnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0O21hcHBpbmcgc2NvcGU9JnF1b3Q7aW5zdGFuY2UmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L21hcHBpbmcmZ3Q7Ci0gICAgJmx0Oy90cmFuc2ZlciZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgIEV4YW1wbGUgdGhhdCBleHBvcnRzIG1hbnkgY29tYmluYXRpb25zIG9mIGtleXMgYW5kIG5vZGVzIAotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVRyYW5zZmVyJnF1b3Q7Jmd0OwotICAgICAgICZsdDt0cmFuc2ZlcgotICAgICAgICAgICAgaWNvbj0mcXVvdDtYWVouZ2lmJnF1b3Q7Ci0gICAgICAgICAgICBuYW1lPSZxdW90O0V4cG9ydCBtYW55IHByZWZlcmVuY2VzJnF1b3Q7Ci0gICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS51aS50ZXN0cy5hbGwmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bWFwcGluZyBzY29wZT0mcXVvdDtpbnN0YW5jZSZxdW90OyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7ZW50cnkgbm9kZT0mcXVvdDtvcmcuZWNsaXBzZS51aSZxdW90OyZndDsKLSAgICAgICAgICAgICAgICAgICAmbHQ7a2V5IG5hbWU9JnF1b3Q7c2hvd0ludHJvLERPQ0tfUEVSU1BFQ1RJVkVfQkFSJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7L2VudHJ5Jmd0OwotICAgICAgICAgICAgICAgICZsdDtlbnRyeSBub2RlPSZxdW90O29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICAgICAmbHQ7a2V5IG5hbWU9JnF1b3Q7Ym9ndXMsUlVOX0lOX0JBQ0tHUk9VTkQmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgICZsdDsvZW50cnkmZ3Q7ICAgCi0gICAgICAgICAgICAgICAgJmx0O2VudHJ5IG5vZGU9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaWRlJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7ZW50cnkgbm9kZT0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L21hcHBpbmcmZ3Q7Ci0gICAmbHQ7bWFwcGluZyBzY29wZT0mcXVvdDtjb25maWd1cmF0aW9uJnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0Oy9tYXBwaW5nJmd0OwotICAgJmx0O2Rlc2NyaXB0aW9uJmd0OwotICAgICAgICAgICAgIEV4cG9ydCBtYW55IGNvbWJpbmF0aW9ucyBvZiBrZXlzIGFuZCBub2RlcwotICAgICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAmbHQ7L3RyYW5zZmVyJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvcHJlc2VudGF0aW9uRmFjdG9yaWVzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9wcmVzZW50YXRpb25GYWN0b3JpZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwNWE1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9wcmVzZW50YXRpb25GYWN0b3JpZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIgaWQ9InByZXNlbnRhdGlvbkZhY3RvcmllcyIgbmFtZT0iUHJlc2VudGF0aW9uIEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCBwcmVzZW50YXRpb24gZmFjdG9yaWVzIHRvIHRoZSB3b3JrYmVuY2guCi0gICAgICAgICBBIHByZXNlbnRhdGlvbiBmYWN0b3J5IGRlZmluZXMgdGhlIG92ZXJhbGwgbG9vayBhbmQgZmVlbCBvZiB0aGUgd29ya2JlbmNoLAotICAgICAgICAgaW5jbHVkaW5nIGhvdyB2aWV3cyBhbmQgZWRpdG9ycyBhcmUgcHJlc2VudGVkLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY3RvcnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZ5IHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgdG8gYmUgdXNlZCBmb3IgdGhlIHByZXNlbnRhdGlvbiBmYWN0b3J5LiAgVGhlIHNwZWNpZmllZCB2YWx1ZSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5BYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5BYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgcHJlc2VudGF0aW9uIGZhY3RvcnkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCB0byBzaG93IHRoaXMgcHJlc2VudGF0aW9uIGZhY3RvcnkgaW4gdGhlIFVJCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHByZXNlbnRhdGlvbkZhY3RvcnkgZXh0ZW5zaW9uOgotJmx0O3ByZSZndDsKLSAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25GYWN0b3JpZXMmcXVvdDsmZ3Q7Ci0gICAgICZsdDtmYWN0b3J5Ci0gICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5FeGFtcGxlV29ya2JlbmNoUHJlc2VudGF0aW9uRmFjdG9yeSZxdW90Oy8mZ3Q7Ci0gICZsdDsvZXh0ZW5zaW9uJmd0OwotICAmbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgY2xhc3Mgc3BlY2lmaWVkIGluIHRoZSBmYWN0b3J5IGVsZW1lbnQgbXVzdCBiZSBhIGNvbmNyZXRlIHN1YmNsYXNzIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5Jmx0Oy9jb2RlJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgSWYgYSBwcmVzZW50YXRpb24gZmFjdG9yeSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIG1pc3NpbmcgdGhlbiB0aGUgaW1wbGVtZW50YXRpb24gaW4gJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5Xb3JrYmVuY2hQcmVzZW50YXRpb25GYWN0b3J5Jmx0Oy9jb2RlJmd0OyB3aWxsIGJlIHVzZWQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvcHJvcGVydHlQYWdlcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvcHJvcGVydHlQYWdlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGE0NWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3Byb3BlcnR5UGFnZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJwcm9wZXJ0eVBhZ2VzIiBuYW1lPSJQcm9wZXJ0eSBQYWdlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIHByb3BlcnR5IHBhZ2UgZm9yIG9iamVjdHMgb2YgYSBnaXZlbiB0eXBlLiAgT25jZSBkZWZpbmVkLCB0aGVzZSBwcm9wZXJ0eSBwYWdlcyB3aWxsIGFwcGVhciBpbiB0aGUgUHJvcGVydGllcyBEaWFsb2cgZm9yIG9iamVjdHMgb2YgdGhhdCB0eXBlLiAKLSZsdDtwJmd0OwotQSBwcm9wZXJ0eSBwYWdlIGlzIGEgdXNlciBmcmllbmRseSB3YXkgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QuICBVbmxpa2UgdGhlIFByb3BlcnRpZXMgdmlldywgd2hpY2ggcmVzdHJpY3RzIHRoZSBzcGFjZSBhdmFpbGFibGUgZm9yIGVkaXRpbmcgYW4gb2JqZWN0IHByb3BlcnR5LCBhIHByb3BlcnR5IHBhZ2UgbWF5IGJlbmVmaXQgZnJvbSB0aGUgZnJlZWRvbSB0byBkZWZpbmUgbGFyZ2VyLCBtb3JlIGNvbXBsZXggY29udHJvbHMgd2l0aCBsYWJlbHMsIGljb25zLCBldGMuICBQcm9wZXJ0aWVzIHdoaWNoIGxvZ2ljYWxseSBnbyB0b2dldGhlciBtYXkgYWxzbyBiZSBjbHVzdGVyZWQgaW4gYSBwYWdlLCByYXRoZXIgdGhhbiBzY2F0dGVyZWQgaW4gdGhlIHByb3BlcnR5IHNoZWV0LiBIb3dldmVyLCBpbiBtb3N0IGFwcGxpY2F0aW9ucyBpdCB3aWxsIGJlIGFwcHJvcHJpYXRlIHRvIGV4cG9zZSBzb21lIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IHZpYSB0aGUgcHJvcGVydHkgc2hlZXQgYW5kIHNvbWUgdmlhIHRoZSBwcm9wZXJ0eSBwYWdlcy4gCi0mbHQ7L3AmZ3Q7Ci0KLSZsdDtwJmd0OwotUHJvcGVydHkgcGFnZXMgYXJlIHNob3duIGluIGEgZGlhbG9nIGJveCB0aGF0IGlzIG5vcm1hbGx5IHZpc2libGUgd2hlbiB0aGUgJnF1b3Q7UHJvcGVydGllcyZxdW90OyBtZW51IGl0ZW0gaXMgc2VsZWN0ZWQgb24gYSBwb3AtdXAgbWVudSBmb3IgYW4gb2JqZWN0LiBJbiBhZGRpdGlvbiB0byB0aGUgb2JqZWN0IGNsYXNzLCB0aGUgbmFtZSBmaWx0ZXIgY2FuIG9wdGlvbmFsbHkgYmUgc3VwcGxpZWQgdG8gcmVnaXN0ZXIgcHJvcGVydHkgcGFnZXMgb25seSBmb3Igc3BlY2lmaWMgb2JqZWN0IHR5cGVzLiAKLSZsdDsvcCZndDsKLQotJmx0O3AmZ3Q7Ci1JZiB0aGVzZSBmaWx0ZXJpbmcgbWVjaGFuaXNtcyBhcmUgaW5hZGVxdWF0ZSBhIHByb3BlcnR5IHBhZ2UgbWF5IHVzZSB0aGUgZmlsdGVyIG1lY2hhbmlzbS4gIEluIHRoaXMgY2FzZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgdGFyZ2V0IG9iamVjdCBhcmUgZGVzY3JpYmVkIGluIGEgc2VyaWVzIG9mIGtleSB2YWx1ZSBwYWlycy4gIFRoZSBhdHRyaWJ1dGVzIHdoaWNoIGFwcGx5IHRvIHRoZSBzZWxlY3Rpb24gYXJlIHR5cGUgc3BlY2lmaWMgYW5kIGJleW9uZCB0aGUgZG9tYWluIG9mIHRoZSB3b3JrYmVuY2ggaXRzZWxmLCBzbyB0aGUgd29ya2JlbmNoIHdpbGwgZGVsZWdhdGUgZmlsdGVyaW5nIGF0IHRoaXMgbGV2ZWwgdG8gdGhlIGFjdHVhbCBzZWxlY3Rpb24uCi0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBhZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InBhZ2UiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiIGljb249Imljb24iLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmlsdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImtleXdvcmRSZWZlcmVuY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBwYWdlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBVSSBmb3IgdGhpcyBwYWdlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcmVsYXRpdmUgcGF0aCB0byBhbiBpY29uIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBVSSBpbiBhZGRpdGlvbiB0byB0aGUgcGFnZSBuYW1lCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9iamVjdENsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIGZvciB3aGljaCB0aGUgcGFnZSBpcyByZWdpc3RlcmVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7dHQmZ3Q7b3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByb3BlcnR5UGFnZSZsdDsvdHQmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U6b3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByb3BlcnR5UGFnZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVGaWx0ZXIiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgYXR0cmlidXRlIHRoYXQgYWxsb3dzIHJlZ2lzdHJhdGlvbiBjb25kaXRpb25hbCBvbgotd2lsZCBjYXJkIG1hdGNoIGFwcGxpZWQgdG8gdGhlIHRhcmdldCBvYmplY3QgbmFtZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhZGFwdGFibGUiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZmxhZyB0aGF0IGluZGljYXRlcyBpZiB0eXBlcyB0aGF0IGFkYXB0IHRvIElSZXNvdXJjZSBzaG91bGQgdXNlIHRoaXMgcHJvcGVydHkgcGFnZS4KLVRoaXMgZmxhZyBpcyB1c2VkIGlmIG9iamVjdENsYXNzIGFkYXB0cyB0byBJUmVzb3VyY2UuICBEZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgcGF0aCBpbmRpY2F0aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGFnZSBpbiB0aGUgcHJvcGVydGllcyB0cmVlLiBUaGUgcGF0aCBtYXkgZWl0aGVyIGJlIGEgcGFyZW50IG5vZGUgSUQgb3IgYSBzZXF1ZW5jZSBvZiBJRHMgc2VwYXJhdGVkIGJ5ICZhcG9zOy8mYXBvczssIHJlcHJlc2VudGluZyB0aGUgZnVsbCBwYXRoIGZyb20gdGhlIHJvb3Qgbm9kZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmlsdGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCB0byBldmFsdWF0ZSB0aGUgYXR0cmlidXRlIHN0YXRlIG9mIGVhY2ggb2JqZWN0IGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gQSBtYXRjaCBvbmx5IGlmIGVhY2ggb2JqZWN0IGluIHRoZSBzZWxlY3Rpb24gaGFzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIHN0YXRlLiBFYWNoIG9iamVjdCBpbiB0aGUgc2VsZWN0aW9uIG11c3QgaW1wbGVtZW50LCBvciBhZGFwdCB0bywgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlciZsdDsvc2FtcCZndDsuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgYW4gb2JqZWN0IGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGF0dHJpYnV0ZS4gIEluIGNvbWJpbmF0aW9uIHdpdGgKLXRoZSBuYW1lIGF0dHJpYnV0ZSwgdGhlIG5hbWUgdmFsdWUgcGFpciBpcyB1c2VkIHRvIAotZGVmaW5lIHRoZSB0YXJnZXQgb2JqZWN0IGZvciBhIHByb3BlcnR5IHBhZ2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImtleXdvcmRSZWZlcmVuY2UiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgcmVmZXJlbmNlIGJ5IGEgcHJvcGVydHkgcGFnZSB0byBhIGtleXdvcmQuIFNlZSB0aGUga2V5d29yZHMgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGtleXdvcmQgYmVpbmcgcmVmZXJyZWQgdG8uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiB0aGUgcHJvcGVydHkgcGFnZSBkZWZpbml0aW9uOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyZxdW90OyZndDsgCi0gICAgICAgICZsdDtwYWdlIAotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei5wcm9qZWN0UGFnZSZxdW90OyAKLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7WFlaIEphdmEgUHJvcGVydGllcyZxdW90OyAKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlJnF1b3Q7IAotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei5wcGFnZXMuSmF2YVByb3BlcnR5UGFnZSZxdW90OyAKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9JnF1b3Q7Ki5qYXZhJnF1b3Q7Jmd0OyAKLSAgICAgICAgICAgICZsdDtmaWx0ZXIgbmFtZT0mcXVvdDtyZWFkT25seSZxdW90OyB2YWx1ZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsgCi0gICAgICAgICZsdDsvcGFnZSZndDsgCi0gICAgJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGF0dHJpYnV0ZSAmbHQ7c2FtcCZndDtjbGFzcyZsdDsvc2FtcCZndDsgbXVzdCBzcGVjaWZ5IGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgCi1vZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByb3BlcnR5UGFnZSZsdDsvc2FtcCZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFNvbWUgb2JqZWN0cyBwcm92aWRlZCBieSB0aGUgd29ya2JlbmNoIG1heSBoYXZlIAotcHJvcGVydHkgcGFnZXMgcmVnaXN0ZXJlZC4gUGx1Zy1pbnMgYXJlIGFsbG93ZWQgCi10byBhZGQgbW9yZSBwcm9wZXJ0eSBwYWdlcyBmb3IgdGhlc2Ugb2JqZWN0cy4gCi1Qcm9wZXJ0eSBwYWdlcyBhcmUgbm90IGxpbWl0ZWQgdG8gd29ya2JlbmNoIAotcmVzb3VyY2VzOiBhbGwgb2JqZWN0cyBzaG93aW5nIHVwIGluIHRoZSB3b3JrYmVuY2ggCi0oZXZlbiBkb21haW4gc3BlY2lmaWMgb2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSBwbHVnLWlucykgCi1tYXkgaGF2ZSBwcm9wZXJ0eSBwYWdlcyBhbmQgb3RoZXIgcGx1Zy1pbnMgYXJlIAotYWxsb3dlZCB0byByZWdpc3RlciBwcm9wZXJ0eSBwYWdlcyBmb3IgdGhlbS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9zZXJ2aWNlcy5teHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvc2VydmljZXMubXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjNWQzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9zZXJ2aWNlcy5teHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVpLmNvbXBvbmVudHMiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmNvbXBvbmVudHMiIGlkPSJzZXJ2aWNlcyIgbmFtZT0iQ29tcG9uZW50IHNlcnZpY2VzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVYUEVSSU1FTlRBTDogVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwuIERvbiZhcG9zO3QgdXNlIGl0LiBJdCB3aWxsIGJlIHJlbW92ZWQgc29vbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29tcG9uZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNjb3BlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImludGVyZmFjZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGNsYXNzIHRoYXQgc3ViY2xhc3NlcyBvcmcuZWNsaXBzZS5jb3JlLmNvbXBvbmVudHMuQ29tcG9uZW50RmFjdG9yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnRlcmZhY2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGludGVyZmFjZSBiZWluZyBpbXBsZW1lbnRlZCBieSB0aGlzIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzY29wZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic2NvcGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImV4dGVuZHNTY29wZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXF1aXJlc0ludGVyZmFjZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXF1aXJlc1Njb3BlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5kc1Njb3BlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJzY29wZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icmVxdWlyZXNJbnRlcmZhY2UiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImludGVyZmFjZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icmVxdWlyZXNTY29wZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3N0YXJ0dXAuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3N0YXJ0dXAuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmNjYyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9zdGFydHVwLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0ic3RhcnR1cCIgbmFtZT0iU3RhcnR1cCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHJlZ2lzdGVyIHBsdWdpbnMgdGhhdCB3YW50IHRvIGJlIGFjdGl2YXRlZCBvbiBzdGFydHVwLiBUaGUgcGx1Z2luIGNsYXNzIG9yIHRoZSBjbGFzcyBnaXZlbiBhcyB0aGUgYXR0cmlidXRlIG9uIHRoZSBzdGFydHVwIGVsZW1lbnQgbXVzdCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JU3RhcnR1cCZsdDsvc2FtcCZndDsuIE9uY2UgdGhlIHdvcmtiZW5jaCBpcyBzdGFydGVkLCB0aGUgbWV0aG9kIGVhcmx5U3RhcnR1cCgpIHdpbGwgYmUgY2FsbGVkIGZyb20gYSBzZXBhcmF0ZSB0aHJlYWQuIAotCi1JZiB0aGUgc3RhcnR1cCBlbGVtZW50IGhhcyBhIGNsYXNzIGF0dHJpYnV0ZSwgdGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGFuZCBlYXJseVN0YXJ0dXAoKSB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgcmVzdWx0LiAgT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgcGx1Zy1pbiBjbGFzcy4gIERvIG5vdCBzcGVjaWZ5IHRoZSBwbHVnLWluIGNsYXNzIGFzIHRoZSB2YWx1ZSBvZiB0aGUgY2xhc3MgYXR0cmlidXRlLCBvciBpdCB3aWxsIGJlIGluc3RhbnRpYXRlZCB0d2ljZSAob25jZSBieSByZWd1bGFyIHBsdWctaW4gYWN0aXZhdGlvbiwgYW5kIG9uY2UgYnkgdGhpcyBtZWNoYW5pc20pLgotCi1UaGVzZSBwbHVnaW5zIGFyZSBsaXN0ZWQgaW4gdGhlIHdvcmtiZW5jaCBwcmVmZXJlbmNlcyBhbmQgdGhlIHVzZXIgbWF5IGRpc2FibGUgYW55IHBsdWdpbiBmcm9tIGVhcmx5IHN0YXJ0dXAuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0YXJ0dXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InN0YXJ0dXAiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0mbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JU3RhcnR1cCZsdDsvc2FtcCZndDsuCi1JZiBub3Qgc3BlY2lmaWVkLCB0aGUgcGx1Zy1pbiBjbGFzcyBpcyB1c2VkLiAgIERvIG5vdCBzcGVjaWZ5IHRoZSBwbHVnLWluIGNsYXNzIGFzIGFuIGV4cGxpY2l0IHZhbHVlLCBvciBpdCB3aWxsIGJlIGluc3RhbnRpYXRlZCB0d2ljZSAob25jZSBieSByZWd1bGFyIHBsdWctaW4gYWN0aXZhdGlvbiwgYW5kIG9uY2UgYnkgdGhpcyBtZWNoYW5pc20pLgotU2luY2UgcmVsZWFzZSAzLjAuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS5JU3RhcnR1cCIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBSZWxlYXNlIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBGb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHN0YXJ0dXAgZXh0ZW5zaW9uOiAKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLnN0YXJ0dXAmcXVvdDsmZ3Q7Ci0gICAgICZsdDtzdGFydHVwIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmV4YW1wbGUuU3RhcnR1cENsYXNzJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBTZWUgaW50ZXJmYWNlICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklTdGFydHVwJmx0Oy9zYW1wJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvc3lzdGVtU3VtbWFyeVNlY3Rpb25zLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9zeXN0ZW1TdW1tYXJ5U2VjdGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmNjMwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS9zeXN0ZW1TdW1tYXJ5U2VjdGlvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJzeXN0ZW1TdW1tYXJ5U2VjdGlvbnMiIG5hbWU9IlN5c3RlbSBTdW1tYXJ5IFNlY3Rpb25zIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBFY2xpcHNlIFVJIHByb3ZpZGVzIGFuIEFib3V0RGlhbG9nIHRoYXQgY2FuIGJlIGJyYW5kZWQgYW5kIHJldXNlZCBieSBjbGllbnQgcHJvZHVjdCBwbHVnaW5zLiAgVGhpcyBkaWFsb2cgaW5jbHVkZXMgYSBTeXN0ZW1TdW1tYXJ5IGRpYWxvZyB0aGF0IGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gZGV0YWlscy4gIEJ5IGV4dGVuZGluZyB0aGUgb3JnLmVjbGlwc2UudWkuc3lzdGVtU3VtbWFyeVNlY3Rpb25zIGV4dGVuc2lvbiBwb2ludCBjbGllbnRzIGFyZSBhYmxlIHRvIHB1dCB0aGVpciBvd24gaW5mb3JtYXRpb24gaW50byB0aGUgbG9nLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZWN0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZWN0aW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwsIHVuaXF1ZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgc3lzdGVtIHN1bW1hcnkgc2VjdGlvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNlY3Rpb25UaXRsZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgdGhlIHRpdGxlIG9mIHRoaXMgc2VjdGlvbiBpbiB0aGUgc3lzdGVtIHN1bW1hcnkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoZSBpbXBsZW1lbnRzIAotJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkuYWJvdXQuSVN5c3RlbVN1bW1hcnlTZWN0aW9uJmx0Oy9jb2RlJmd0Oy4gIFRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzeXN0ZW1TdW1tYXJ5U2VjdGlvbnMgZXh0ZW5zaW9uOiAKLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uCi0gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuc3lzdGVtU3VtbWFyeVNlY3Rpb25zJnF1b3Q7Jmd0OwotICZsdDtzZWN0aW9uCi0gIGlkPSZxdW90O1JDUEJyb3dzZXIuQ29va2llRGV0YWlscyZxdW90OwotICBzZWN0aW9uVGl0bGU9JnF1b3Q7QnJvd3NlciBDb29raWVzJnF1b3Q7Ci0gIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLkNvb2tpZUNvbmZpZ0RldGFpbHMmcXVvdDsvJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgY2xhc3Mgc3BlY2lmaWVkIGluIHRoZSBzZWN0aW9uIGVsZW1lbnQgbXVzdCBiZSBhIGNvbmNyZXRlIHN1YmNsYXNzIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLmFib3V0LklTeXN0ZW1TdW1tYXJ5U2VjdGlvbiZsdDsvY29kZSZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBXb3JrYmVuY2ggdXNlcyB0aGlzIGV4dGVuc2lvbiBwb2ludCB0byBwcm92aWRlIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgaW4gdGhlIHN5c3RlbSBzdW1tYXJ5IGRpYWxvZzoKLSZsdDt1bCZndDsKLSZsdDtsaSZndDtTeXN0ZW0gcHJvcGVydGllczogVGhlIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgamF2YS5sYW5nLlN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuJmx0Oy9saSZndDsKLSZsdDtsaSZndDtGZWF0dXJlczogVGhlIGluc3RhbGxlZCBmZWF0dXJlcy4mbHQ7L2xpJmd0OwotJmx0O2xpJmd0O1BsdWctaW4gUmVnaXN0cnk6IFRoZSBpbnN0YWxsZWQgcGx1Zy1pbnMgYW5kIHRoZWlyIHN0YXR1cy4mbHQ7L2xpJmd0OwotJmx0O2xpJmd0O1VzZXIgUHJlZmVyZW5jZXM6IFRoZSBwcmVmZXJlbmNlcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCBmcm9tIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3RoZW1lcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvdGhlbWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMzcxY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvdGhlbWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2NjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0idGhlbWVzIiBuYW1lPSJUaGVtZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBjdXN0b21pemUgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIFVJLiAgSXQgYWxsb3dzIGRlZmluaXRpb24gb2YgY29sb3IgYW5kIGZvbnQgZW50aXRpZXMgYXMgd2VsbCBhcyB0aGVtZSBlbnRpdGllcy4gIFRoZW1lcyBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gc2VsZWN0aXZlbHkgb3ZlcnJpZGUgZGVmYXVsdCBjb2xvciBhbmQgZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgcGFydGljdWxhciB1c2VzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0aGVtZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb2xvckRlZmluaXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZm9udERlZmluaXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idGhlbWVFbGVtZW50Q2F0ZWdvcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGF0YSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYXRlZ29yeVByZXNlbnRhdGlvbkJpbmRpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InRoZW1lIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIiBpY29uPSJpY29uIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgY29sbGVjdGlvbiBvZiBmb250LCBjb2xvciBhbmQgZGF0YSBvdmVycmlkZXMuICBTdWNoIGEgY29sbGVjdGlvbiBtYXkgYmUgdXNlZCB0byBhbHRlciB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgd29ya2JlbmNoLiAgTWFueSB0aGVtZSBlbGVtZW50cyBtYXkgZXhpc3Qgd2l0aCB0aGUgc2FtZSBpZC4gIFRoaXMgYWxsb3dzIGNvbXBvbmVudCBhdXRob3JzIHRvIGNvbnRyaWJ1dGUgdG8gZXhpc3RpbmcgdGhlbWVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb2xvck92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZvbnRPdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGF0YSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHRoZW1lCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIG9mIHRoZSB0aGVtZSB0byBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuICBBdCBsZWFzdCBvbmUgdGhlbWUgZGVmaW5pdGlvbiB3aXRoIGFueSBnaXZlbiBpZCBzaG91bGQgY29udGFpbiB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ0aGVtZUVsZW1lbnRDYXRlZ29yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBsb2dpY2FsIGdyb3VwaW5nIG9mIHRoZW1lIGVsZW1lbnQgZGVmaW5pdGlvbnMuICBUaGlzIGNhdGVnb3J5IG1heSBpbmNsdWRlIGNvbG9ycyBhbmQgZm9udHMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaWQgZm9yIHRoaXMgY2F0ZWdvcnkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnRJZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaWQgb2YgdGhlIHBhcmVudCBjYXRlZ29yeSwgaWYgYW55LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLnRoZW1lcy5JVGhlbWVQcmV2aWV3Jmx0Oy9jb2RlJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UudWkuSVByZXNlbnRhdGlvblByZXZpZXciLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIG9mIHRoZSB0aGVtZSBlbGVtZW50IGNhdGVnb3J5IHRvIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbG9yRGVmaW5pdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBzeW1ib2xpYyBjb2xvciBkZWZpbml0aW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb2xvckZhY3RvcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbG9yVmFsdWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgY29sb3IgZGVmaW5pdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIG9mIHRoZSBjb2xvciB0byBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0c1RvIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBpZCBvZiBhbm90aGVyIGNvbG9yIGRlZmluaXRpb24gdGhhdCBpcyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgcmVjZWl2ZXIuIFdoZW4gdGhlcmUgaXMgbm8gcHJlZmVyZW5jZSBmb3IgdGhpcyBjb2xvciB0aGUgY29sb3IgcmVnaXN0cnkgd2lsbCBoYXZlIHRoZSB2YWx1ZSBvZiBkZWZhdWx0c1RvIHNldCBmb3IgaXQgaW4gdGhlIHJlZ2lzdHJ5LgotCi1Pbmx5IG9uZSBvZiAmbHQ7Y29kZSZndDtkZWZhdWx0c1RvJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7dmFsdWUmbHQ7L2NvZGUmZ3Q7IG9yICZsdDtjb2RlJmd0O2NvbG9yRmFjdG9yeSZsdDsvY29kZSZndDsgbWF5IGJlIGRlZmluZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBjb2xvci4gIFRoZSB2YWx1ZSBtYXkgYmUgc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKLSZsdDt1bCZndDsKLSZsdDtsaSZndDthIFN0cmluZyBjb250YWluaW5nIGNvbW1hIHNlcGFyYXRlZCBpbnRlZ2VycyBpbiB0aGUgZm9ybSByZWQsZ3JlZW4sYmx1ZSAKLSZsdDtsaSZndDthIFN0cmluZyB0aGF0IG1hcHMgdG8gYW4gU1dUIGNvbG9yIGNvbnN0YW50IChpZTogIENPTE9SX1JFRCkuCi0mbHQ7L3VsJmd0OwotT25seSBvbmUgb2YgJmx0O2NvZGUmZ3Q7ZGVmYXVsdHNUbyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O3ZhbHVlJmx0Oy9jb2RlJmd0OyBvciAmbHQ7Y29kZSZndDtjb2xvckZhY3RvcnkmbHQ7L2NvZGUmZ3Q7IG1heSBiZSBkZWZpbmVkLiAgSWYgJmx0O2NvZGUmZ3Q7dmFsdWUmbHQ7L2NvZGUmZ3Q7IGlzIHNwZWNpZmllZCwgYWRkaXRpb25hbCB2YWx1ZSBkZWZpbml0aW9ucyBtYXkgYmUgc3BlY2lmaWVkIG9uIGEgcGVyIHBsYXRmb3JtL3dpbmRvd2luZyBzeXN0ZW0gYmFzaXMgdmlhIHRoZSAmbHQ7Y29kZSZndDtjb2xvclZhbHVlJmx0Oy9jb2RlJmd0OyBlbGVtZW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5SWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG9wdGlvbmFsIGlkIG9mIHRoZSAmbHQ7Y29kZSZndDt0aGVtZUVsZW1lbnRDYXRlZ29yeSZsdDsvY29kZSZndDsgdGhpcyBjb2xvciBiZWxvbmdzIHRvLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbG9yRmFjdG9yeSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS50aGVtZXMuSUNvbG9yRmFjdG9yeSZsdDsvY29kZSZndDsuICBUaGlzIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgJmx0O2NvZGUmZ3Q7dmFsdWUmbHQ7L2NvZGUmZ3Q7IHRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvbG9yLiAgUGxlYXNlIGJlIGFkdmlzZWQgdGhhdCB0aGlzIHNob3VsZCBiZSB1c2VkIHdpdGggY2F1dGlvbiAtIHVzYWdlIG9mIHRoaXMgYXR0cmlidXRlIHdpbGwgY2F1c2UgcGx1Z2luIGFjdGl2YXRpb24gb24gd29ya2JlbmNoIHN0YXJ0dXAuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS50aGVtZXMuSUNvbG9yRmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzRWRpdGFibGUiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQgdG8gZWRpdCB0aGlzIGNvbG9yIGluIHRoZSBwcmVmZXJlbmNlIHBhZ2UuICBJZiB0aGlzIGlzICZsdDtjb2RlJmd0O2ZhbHNlJmx0Oy9jb2RlJmd0OyB0aGVuIHRoZSBjb250cmlidXRpb24gaXMgbm90IHNob3duIHRvIHRoZSB1c2VyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmb250RGVmaW5pdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBzeW1ib2xpYyBmb250IGRlZmluaXRpb24uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZvbnRWYWx1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGlzIGZvbnQgZGVmaW5pdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIG9mIHRoZSBmb250IHRvIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICZsdDtwJmd0O3RoZSBmb250IHZhbHVlLiAgVGhpcyBpcyBpbiB0aGUgZm9ybTogJmx0O2NvZGUmZ3Q7Zm9udG5hbWUtc3R5bGUtaGVpZ2h0Jmx0Oy9jb2RlJmd0OyB3aGVyZSAmbHQ7Y29kZSZndDtmb250bmFtZSZsdDsvY29kZSZndDsgaXMgdGhlIG5hbWUgb2YgYSBmb250LCAmbHQ7Y29kZSZndDtzdHlsZSZsdDsvY29kZSZndDsgaXMgYSBmb250IHN0eWxlIChvbmUgb2YgJmx0O2NvZGUmZ3Q7JnF1b3Q7cmVndWxhciZxdW90OyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0OyZxdW90O2JvbGQmcXVvdDsmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDsmcXVvdDtpdGFsaWMmcXVvdDsmbHQ7L2NvZGUmZ3Q7LCBvciAmbHQ7Y29kZSZndDsmcXVvdDtib2xkIGl0YWxpYyZxdW90OyZsdDsvY29kZSZndDspIGFuZCAmbHQ7Y29kZSZndDtoZWlnaHQmbHQ7L2NvZGUmZ3Q7IGlzIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBmb250IGhlaWdodC4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtFeGFtcGxlOiAmbHQ7Y29kZSZndDtUaW1lcyBOZXcgUm9tYW4tYm9sZC0zNiZsdDsvY29kZSZndDsuJmx0Oy9wJmd0OyAgCi0mbHQ7cCZndDtPbmx5IG9uZSAob3IgbmVpdGhlcikgb2YgJmx0O2NvZGUmZ3Q7dmFsdWUmbHQ7L2NvZGUmZ3Q7IG9yICZsdDtjb2RlJmd0O2RlZmF1bHRzVG8mbHQ7L2NvZGUmZ3Q7IG1heSBiZSB1c2VkLiZsdDsvcCZndDsgIElmICZsdDtjb2RlJmd0O3ZhbHVlJmx0Oy9jb2RlJmd0OyBpcyBzcGVjaWZpZWQsIGFkZGl0aW9uYWwgdmFsdWUgZGVmaW5pdGlvbnMgbWF5IGJlIHNwZWNpZmllZCBvbiBhIHBlciBwbGF0Zm9ybS93aW5kb3dpbmcgc3lzdGVtIGJhc2lzIHZpYSB0aGUgJmx0O2NvZGUmZ3Q7Zm9udFZhbHVlJmx0Oy9jb2RlJmd0OyBlbGVtZW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5SWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG9wdGlvbmFsIGlkIG9mIHRoZSAmbHQ7Y29kZSZndDt0aGVtZUVsZW1lbnRDYXRlZ29yeSZsdDsvY29kZSZndDsgdGhpcyBmb250IGJlbG9uZ3MgdG8uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdHNUbyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaWQgb2YgYW5vdGhlciBmb250IGRlZmluaXRpb24gdGhhdCBpcyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgcmVjZWl2ZXIuIFdoZW4gdGhlcmUgaXMgbm8gcHJlZmVyZW5jZSBmb3IgdGhpcyBmb250IHRoZSBmb250IHJlZ2lzdHJ5IHdpbGwgaGF2ZSB0aGUgdmFsdWUgb2YgZGVmYXVsdHNUbyBzZXQgZm9yIGl0IGluIHRoZSByZWdpc3RyeS4KLSZsdDtwJmd0OwotT25seSBvbmUgKG9yIG5laXRoZXIpIG9mICZsdDtjb2RlJmd0O3ZhbHVlJmx0Oy9jb2RlJmd0OyBvciAmbHQ7Y29kZSZndDtkZWZhdWx0c1RvJmx0Oy9jb2RlJmd0OyBtYXkgYmUgdXNlZC4KLSZsdDsvcCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpc0VkaXRhYmxlIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIGVkaXQgdGhpcyBjb2xvciBpbiB0aGUgcHJlZmVyZW5jZSBwYWdlLiAgSWYgdGhpcyBpcyAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZndDsgdGhlbiB0aGUgY29udHJpYnV0aW9uIGlzIG5vdCBzaG93biB0byB0aGUgdXNlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29sb3JPdmVycmlkZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQWxsb3dzIG92ZXJyaWRpbmcgb2YgY29sb3JzIGRlZmluZWQgaW4gJmx0O2NvZGUmZ3Q7Y29sb3JEZWZpbml0aW9uJmx0Oy9jb2RlJmd0OyBlbGVtZW50cy4gIFRoZXNlIGNvbG9ycyB3aWxsIGJlIGFwcGxpZWQgd2hlbiB0aGUgdGhlbWUgaXMgaW4gdXNlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb2xvckZhY3RvcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbG9yVmFsdWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBjb2xvciBkZWZpbml0aW9uIG92ZXJyaWRlLiAgVGhpcyBzaG91bGQgbWF0Y2ggYW4gZXhpc3RpbmcgZm9udCBpZGVudGlmaWVyLiAgU3RyaWN0bHkgc3BlYWtpbmcsIHlvdSBtYXkgb3ZlcnJpZGUgY29sb3JzIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBiYXNlIHRoZW1lIGFsdGhvdWdoIHRoaXMgcHJhY3RpY2UgaXMgbm90IHJlY29tbWVuZGVkLiAgSW4gZWZmZWN0LCBzdWNoIG92ZXJyaWRlcyB3aWxsIGhhdmUgYmVoYXZpb3Igc2ltaWxhciB0byAmbHQ7Y29kZSZndDtjb2xvckRlZmluaXRpb24mbHQ7L2NvZGUmZ3Q7cyB0aGF0IGhhdmUgJmx0O2NvZGUmZ3Q7aXNFZGl0YWJsZSZsdDsvY29kZSZndDsgc2V0IHRvICZsdDtjb2RlJmd0O2ZhbHNlJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgb3ZlcnJpZGluZyB2YWx1ZSBvZiB0aGlzIGNvbG9yLiAgVGhlIHZhbHVlIG1heSBiZSBzcGVjaWZpZWQgaW4gdGhlIGZvbGxvd2luZyB3YXlzOgotJmx0O3VsJmd0OwotJmx0O2xpJmd0O2EgU3RyaW5nIGNvbnRhaW5pbmcgY29tbWEgc2VwYXJhdGVkIGludGVnZXJzIGluIHRoZSBmb3JtIHJlZCxncmVlbixibHVlIAotJmx0O2xpJmd0O2EgU3RyaW5nIHRoYXQgbWFwcyB0byBhbiBTV1QgY29sb3IgY29uc3RhbnQgKGllOiAgQ09MT1JfUkVEKS4KLSZsdDsvdWwmZ3Q7Ci1Pbmx5IG9uZSBvZiAmbHQ7Y29kZSZndDt2YWx1ZSZsdDsvY29kZSZndDsgb3IgJmx0O2NvZGUmZ3Q7Y29sb3JGYWN0b3J5Jmx0Oy9jb2RlJmd0OyBtYXkgYmUgZGVmaW5lZC4KLVVubGlrZSBhICZsdDtjb2RlJmd0O2NvbG9yRGVmaW5pdGlvbiZsdDsvY29kZSZndDssIHlvdSBtYXkgbm90IHN1cHBseSBhICZsdDtjb2RlJmd0O2RlZmF1bHRzVG8mbHQ7L2NvZGUmZ3Q7IGZvciBhbiBvdmVycmlkZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2xvckZhY3RvcnkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkudGhlbWVzLklDb2xvckZhY3RvcnkmbHQ7L2NvZGUmZ3Q7LiAgVGhpcyBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mICZsdDtjb2RlJmd0O3ZhbHVlJmx0Oy9jb2RlJmd0OyB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb2xvci4gIFBsZWFzZSBiZSBhZHZpc2VkIHRoYXQgdGhpcyBzaG91bGQgYmUgdXNlZCB3aXRoIGNhdXRpb24gLSB1c2FnZSBvZiB0aGlzIGF0dHJpYnV0ZSB3aWxsIGNhdXNlIHBsdWdpbiBhY3RpdmF0aW9uIG9uIHdvcmtiZW5jaCBzdGFydHVwLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmb250T3ZlcnJpZGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEFsbG93cyBvdmVycmlkaW5nIG9mIGZvbnRzIGRlZmluZWQgaW4gJmx0O2NvZGUmZ3Q7Zm9udERlZmluaXRpb24mbHQ7L2NvZGUmZ3Q7IGVsZW1lbnRzLiAgVGhlc2UgZm9udHMgd2lsbCBiZSBhcHBsaWVkIHdoZW4gdGhlIHRoZW1lIGlzIGluIHVzZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZm9udFZhbHVlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgZm9udCBkZWZpbml0aW9uIG92ZXJyaWRlLiAgVGhpcyBzaG91bGQgbWF0Y2ggYW4gZXhpc3RpbmcgZm9udCBpZGVudGlmaWVyLiAgU3RyaWN0bHkgc3BlYWtpbmcsIHlvdSBtYXkgb3ZlcnJpZGUgZm9udHMgdGhhdCBkbyBub3QgZXhpc3QgaW4gdGhlIGJhc2UgdGhlbWUgYWx0aG91Z2ggdGhpcyBwcmFjdGljZSBpcyBub3QgcmVjb21tZW5kZWQuICBJbiBlZmZlY3QsIHN1Y2ggb3ZlcnJpZGVzIHdpbGwgaGF2ZSBiZWhhdmlvciBzaW1pbGFyIHRvICZsdDtjb2RlJmd0O2ZvbnREZWZpbml0aW9uJmx0Oy9jb2RlJmd0O3MgdGhhdCBoYXZlICZsdDtjb2RlJmd0O2lzRWRpdGFibGUmbHQ7L2NvZGUmZ3Q7IHNldCB0byAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgJmx0O3AmZ3Q7dGhlIG92ZXJyaWRpbmcgdmFsdWUgb2YgdGhpcyBmb250LiAgVGhpcyBpcyBpbiB0aGUgZm9ybTogJmx0O2NvZGUmZ3Q7Zm9udG5hbWUtc3R5bGUtaGVpZ2h0Jmx0Oy9jb2RlJmd0OyB3aGVyZSAmbHQ7Y29kZSZndDtmb250bmFtZSZsdDsvY29kZSZndDsgaXMgdGhlIG5hbWUgb2YgYSBmb250LCAmbHQ7Y29kZSZndDtzdHlsZSZsdDsvY29kZSZndDsgaXMgYSBmb250IHN0eWxlIChvbmUgb2YgJmx0O2NvZGUmZ3Q7JnF1b3Q7cmVndWxhciZxdW90OyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0OyZxdW90O2JvbGQmcXVvdDsmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDsmcXVvdDtpdGFsaWMmcXVvdDsmbHQ7L2NvZGUmZ3Q7LCBvciAmbHQ7Y29kZSZndDsmcXVvdDtib2xkIGl0YWxpYyZxdW90OyZsdDsvY29kZSZndDspIGFuZCAmbHQ7Y29kZSZndDtoZWlnaHQmbHQ7L2NvZGUmZ3Q7IGlzIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBmb250IGhlaWdodC4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtFeGFtcGxlOiAmbHQ7Y29kZSZndDtUaW1lcyBOZXcgUm9tYW4tYm9sZC0zNiZsdDsvY29kZSZndDsuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Jmx0O2NvZGUmZ3Q7dmFsdWUmbHQ7L2NvZGUmZ3Q7IG11c3QgYmUgZGVmaW5lZCBmb3IgYSBmb250IG92ZXJyaWRlLgotVW5saWtlIGEgJmx0O2NvZGUmZ3Q7Zm9udERlZmluaXRpb24mbHQ7L2NvZGUmZ3Q7LCB5b3UgbWF5IG5vdCBzdXBwbHkgYSAmbHQ7Y29kZSZndDtkZWZhdWx0c1RvJmx0Oy9jb2RlJmd0OyBmb3IgYSAmbHQ7Y29kZSZndDtmb250T3ZlcnJpZGUmbHQ7L2NvZGUmZ3Q7LiZsdDsvcCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudHMgdXNhZ2UuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbG9yRmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIGVsZW1lbnQgdmVyc2lvbiBvZiB0aGUgJmx0O2NvZGUmZ3Q7Y29sb3JGYWN0b3J5Jmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUuICBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgY29sb3JGYWN0b3J5IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uJmx0Oy9jb2RlJmd0OyBhbmQgdGhlcmUgaXMgcGFyYW1ldGVyaXplZCBkYXRhIHRoYXQgeW91IHdpc2ggdXNlZCBpbiBpdHMgaW5pdGlhbGl6YXRpb24uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudWkudGhlbWVzLklDb2xvckZhY3RvcnkmbHQ7L2NvZGUmZ3Q7LiAgSXQgbWF5IGFsc28gaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS50aGVtZXMuSUNvbG9yRmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBsdWdpbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InBhcmFtZXRlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBwYXJhbWV0ZXIgZWxlbWVudCB0byBiZSB1c2VkIHdpdGhpbiB0aGUgY29sb3JGYWN0b3J5IGVsZW1lbnQuICBUaGlzIHdpbGwgYmUgcGFzc2VkIGFzIGluaXRpYWxpemF0aW9uIGRhdGEgdG8gdGhlIGNvbG9yRmFjdG9yeSBjbGFzcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgcGFyYW1ldGVyIHZhbHVlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRhdGEiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICZsdDtwJmd0O0FuIGVsZW1lbnQgdGhhdCBhbGxvd3MgYXJiaXRyYXJ5IGRhdGEgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgdGhlbWUgb3IgdGhlIGRlZmF1bHQgdGhlbWUuICBUaGlzIGRhdGEgbWF5IGJlIGdyYWRpZW50IGRpcmVjdGlvbnMgb3IgcGVyY2VudGFnZXMsIGxhYmVscywgYXV0aG9yIGluZm9ybWF0aW9uLCBldGMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhpcyBlbGVtZW50IGhhcyBiZWhhdmlvciBzaW1pbGFyIHRvIGRlZmluaXRpb25zIGFuZCBvdmVycmlkZXMuICBJZiBhIGtleSBpcyBwcmVzZW50IGluIGJvdGggdGhlIGRlZmF1bHQgdGhlbWUgYW5kIGFuIGlkZW50aWZpZWQgdGhlbWUsIHRoZW4gdGhlIGlkZW50aWZpZWQgdGhlbWVzIHZhbHVlIHdpbGwgYmUgdXNlZCB3aGVuIHRoYXQgdGhlbWUgaXMgYWNjZXNzZWQuICBJZiB0aGUgaWRlbnRpZmllZCB0aGVtZSBkb2VzIG5vdCBzdXBwbHkgYSB2YWx1ZSB0aGVuIHRoZSBkZWZhdWx0IGlzIHVzZWQuJmx0Oy9wJmd0OwotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBkYXRhIG5hbWUsCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGRhdGEgdmFsdWUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29sb3JWYWx1ZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGFsbG93cyBzcGVjaWZpY2F0aW9uIG9mIGEgY29sb3IgdmFsdWUgb24gYSBwZXItcGxhdGZvcm0gYmFzaXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbG9yRmFjdG9yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9zIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG9zIHN0cmluZyB0byBlbmFibGUgY2hvb3Npbmcgb2YgY29sb3IgYmFzZWQgb24gY3VycmVudCBPUy4gZWc6IHdpbjMyLGxpbnV4Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgb3Mgc3RyaW5nIHRvIGVuYWJsZSBjaG9vc2luZyBvZiBjb2xvciBiYXNlZCBvbiBjdXJyZW50IFdTLiBlZzogd2luMzIsZ3RrCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBjb2xvci4gIFRoZSB2YWx1ZSBtYXkgYmUgc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKLSZsdDt1bCZndDsKLSZsdDtsaSZndDthIFN0cmluZyBjb250YWluaW5nIGNvbW1hIHNlcGFyYXRlZCBpbnRlZ2VycyBpbiB0aGUgZm9ybSByZWQsZ3JlZW4sYmx1ZSAKLSZsdDtsaSZndDthIFN0cmluZyB0aGF0IG1hcHMgdG8gYW4gU1dUIGNvbG9yIGNvbnN0YW50IChpZTogIENPTE9SX1JFRCkuCi0mbHQ7L3VsJmd0OwotT25seSBvbmUgb2YgJmx0O2NvZGUmZ3Q7dmFsdWUmbHQ7L2NvZGUmZ3Q7IG9yICZsdDtjb2RlJmd0O2NvbG9yRmFjdG9yeSZsdDsvY29kZSZndDsgbWF5IGJlIGRlZmluZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29sb3JGYWN0b3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLnRoZW1lcy5JQ29sb3JGYWN0b3J5Jmx0Oy9jb2RlJmd0Oy4gIFRoaXMgbWF5IGJlIHVzZWQgaW5zdGVhZCBvZiAmbHQ7Y29kZSZndDt2YWx1ZSZsdDsvY29kZSZndDsgdG8gc3BlY2lmeSB0aGUgdmFsdWUgb2YgdGhlIGNvbG9yLiAgUGxlYXNlIGJlIGFkdmlzZWQgdGhhdCB0aGlzIHNob3VsZCBiZSB1c2VkIHdpdGggY2F1dGlvbiAtIHVzYWdlIG9mIHRoaXMgYXR0cmlidXRlIHdpbGwgY2F1c2UgcGx1Z2luIGFjdGl2YXRpb24gb24gd29ya2JlbmNoIHN0YXJ0dXAuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS50aGVtZXMuSUNvbG9yRmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmb250VmFsdWUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBhbGxvd3Mgc3BlY2lmaWNhdGlvbiBvZiBhIGZvbnQgdmFsdWUgb24gYSBwZXItcGxhdGZvcm0gYmFzaXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9zIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG9zIHN0cmluZyB0byBlbmFibGUgY2hvb3Npbmcgb2YgZm9udCBiYXNlZCBvbiBjdXJyZW50IE9TLiBlZzogd2luMzIsbGludXgKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3cyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBvcyBzdHJpbmcgdG8gZW5hYmxlIGNob29zaW5nIG9mIGZvbnQgYmFzZWQgb24gY3VycmVudCBXUy4gZWc6IHdpbjMyLGd0awotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICZsdDtwJmd0O3RoZSBmb250IHZhbHVlLiAgVGhpcyBpcyBpbiB0aGUgZm9ybTogJmx0O2NvZGUmZ3Q7Zm9udG5hbWUtc3R5bGUtaGVpZ2h0Jmx0Oy9jb2RlJmd0OyB3aGVyZSAmbHQ7Y29kZSZndDtmb250bmFtZSZsdDsvY29kZSZndDsgaXMgdGhlIG5hbWUgb2YgYSBmb250LCAmbHQ7Y29kZSZndDtzdHlsZSZsdDsvY29kZSZndDsgaXMgYSBmb250IHN0eWxlIChvbmUgb2YgJmx0O2NvZGUmZ3Q7JnF1b3Q7cmVndWxhciZxdW90OyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0OyZxdW90O2JvbGQmcXVvdDsmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDsmcXVvdDtpdGFsaWMmcXVvdDsmbHQ7L2NvZGUmZ3Q7LCBvciAmbHQ7Y29kZSZndDsmcXVvdDtib2xkIGl0YWxpYyZxdW90OyZsdDsvY29kZSZndDspIGFuZCAmbHQ7Y29kZSZndDtoZWlnaHQmbHQ7L2NvZGUmZ3Q7IGlzIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBmb250IGhlaWdodC4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtFeGFtcGxlOiAmbHQ7Y29kZSZndDtUaW1lcyBOZXcgUm9tYW4tYm9sZC0zNiZsdDsvY29kZSZndDsuJmx0Oy9wJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRlZ29yeVByZXNlbnRhdGlvbkJpbmRpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBhbGxvd3MgYSBjYXRlZ29yeSB0byBiZSBib3VuZCB0byBhIHNwZWNpZmljIHByZXNlbnRhdGlvbiBhcyBkZXNjcmliZWQgYnkgdGhlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbkZhY3RvcnkmbHQ7L2NvZGUmZ3Q7IGV4dGVuc2lvbiBwb2ludC4gIElmIGEgY2F0ZWdvcnkgaGFzIGFueSBwcmVzZW50YXRpb24gYmluZGluZ3MgdGhlbiBpdCAoYW5kIGl0JmFwb3M7cyBjaGlsZHJlbikgaXMgb25seSBjb25maWd1cmFibGUgYnkgdGhlIHVzZXIgaWYgaXQgaXMgYm91bmQgdG8gdGhlIGFjdGl2ZSBwcmVzZW50YXRpb24uICBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVtb3ZpbmcgdW51c2VkIGl0ZW1zIGZyb20gdXNlciBjb25zaWRlcmF0aW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXRlZ29yeUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgY2F0ZWdvcnkgdG8gYmluZAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByZXNlbnRhdGlvbklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgcHJlc2VudGF0aW9uIHRvIGJpbmQgdG8KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHdvcmtiZW5jaCBwcm92aWRlcyB0aGUgZm9udCBkZWZpbml0aW9ucyBmb3IgdGhlIHRleHQsIGRpYWxvZywgYmFubmVyLCBoZWFkZXIgYW5kIHBhcnQgdGl0bGUgZm9udHMuICBpdCBhbHNvIHN1cHBsaWVzIGNvbG9yIGRlZmluaXRpb25zIGZvciB0aGUgaHlwZXJsaW5rLCBhY3RpdmUgaHlwZXJsaW5rLCBlcnJvciwgYWN0aXZlIHBhcnQgKGJhY2tncm91bmQgZ3JhZGllbnQgcGFydHMgYW5kIGZvcmVncm91bmQpIGFuZCB0aGUgaW5hY3RpdmUgcGFydCAoYmFja2dyb3VuZCBncmFkaWVudCBwYXJ0cyBhbmQgZm9yZWdyb3VuZCkuICBUaGUgd29ya2JlbmNoIGFsc28gcHJvdmlkZXMgZGF0YSBjb25zdGFudHMgZm9yIHRoZSB0aXRsZSBncmFkaWVudCBwZXJjZW50YWdlcyAoYWN0aXZlIGFuZCBpbmFjdGl2ZSkgYW5kIHRoZSBncmFkaWVudCBkaXJlY3Rpb25zIChhY3RpdmUgYW5kIGluYWN0aXZlKS4gIFRoZSB3b3JrYmVuY2ggZG9lcyBub3QgcHJvdmlkZSBhbnkgbmFtZWQgdGhlbWVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoLmdldFRoZW1lTWFuYWdlcigpJmx0Oy9jb2RlJmd0OyBwcm92aWRlcyBhbiBpbnN0YW5jZSBvZiAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS50aGVtZXMuSVRoZW1lTWFuYWdlciZsdDsvY29kZSZndDsgdGhhdCBtYXkgYmUgdXNlZCB0byBvYnRhaW4gYSBuYW1lZCB0aGVtZSAoYnkgaWQsIGluY2x1ZGluZyB0aGUgZGVmYXVsdCB0aGVtZSB3aGljaCBoYXMgYW4gaWQgb2YgJmx0O2NvZGUmZ3Q7SVRoZW1lTWFuYWdlci5ERUZBVUxUX1RIRU1FJmx0Oy9jb2RlJmd0Oykgb3IgdGhlIGN1cnJlbnQgdGhlbWUuICBGcm9tIGFuICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLnRoZW1lcy5JVGhlbWUmbHQ7L2NvZGUmZ3Q7IHlvdSBtYXkgb2J0YWluIGEgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2VzLkNvbG9yUmVnaXN0cnkmbHQ7L2NvZGUmZ3Q7LCBhbiAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZXMuRm9udFJlZ2lzdHJ5Jmx0Oy9jb2RlJmd0OyBhbmQgdGhlIGFyYml0cmFyeSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHRoZW1lLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLSAgIAotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIHNldmVyYWwgY29sb3IgYW5kIGZvbnQgZGVmaW5pdGlvbnMgYXMgd2VsbCBhcyBhIHRoZW1lIHRoYXQgb3ZlcnJpZGVzIHRoZW0uCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLnRoZW1lcyZxdW90OyZndDsKLSAgICAgICZsdDt0aGVtZUVsZW1lbnRDYXRlZ29yeQotICAgICAgIGlkPSZxdW90O2NvbS54eXouVGhlbWVDYXRlZ29yeSZxdW90OwotICAgICAgIGNsYXNzPSZxdW90O2NvbS54eXouWFlaUHJldmlldyZxdW90OwotICAgICAgIGxhYmVsPSZxdW90O1hZWiBFbGVtZW50cyZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7Y29sb3JEZWZpbml0aW9uIAotICAgICAgICBpZD0mcXVvdDtjb20ueHl6LkZvcmdyb3VuZCZxdW90OwotICAgICAgICBjYXRlZ29yeUlkPSZxdW90O2NvbS54eXouVGhlbWVDYXRlZ29yeSZxdW90OwotICAgICAgICBsYWJlbD0mcXVvdDtYWVogRm9yZWdyb3VuZCBDb2xvciZxdW90OwotICAgICAgICB2YWx1ZT0mcXVvdDtDT0xPUl9CTEFDSyZxdW90OyZndDsKLSAgICAgICAgICZsdDshLS0gd2hpdGUgc2hvdWxkIGJlIHVzZWQgb24gR1RLIC0tJmd0OwotICAgICAgICAgJmx0O2NvbG9yVmFsdWUKLSAgICAgICAgICB2YWx1ZT0mcXVvdDtDT0xPUl9XSElURSZxdW90OwotICAgICAgICAgIG9zPSZxdW90O2xpbnV4JnF1b3Q7Ci0gICAgICAgICAgd3M9JnF1b3Q7Z3RrJnF1b3Q7LyZndDsKLSAgICAgICAgJmx0O2Rlc2NyaXB0aW9uJmd0OwotICAgICAgICBUaGlzIGNvbG9yIGlzIHVzZWQgZm9yIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRoZSBYWVogcGx1Z2luIGVkaXRvci4KLSAgICAgICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAgICZsdDsvY29sb3JEZWZpbml0aW9uJmd0OwotICAgICAgJmx0O2NvbG9yRGVmaW5pdGlvbiAKLSAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei5CYWNrZ3JvdW5kJnF1b3Q7Ci0gICAgICAgIGNhdGVnb3J5SWQ9JnF1b3Q7Y29tLnh5ei5UaGVtZUNhdGVnb3J5JnF1b3Q7ICAgICAgICAKLSAgICAgICAgbGFiZWw9JnF1b3Q7WFlaIEJhY2tncm91bmQgQ29sb3ImcXVvdDsmZ3Q7Ci0gICAgICAgICZsdDtjb2xvckZhY3RvcnkKLSAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLnVpLnRoZW1lcy5SR0JCbGVuZENvbG9yRmFjdG9yeSZxdW90OwotICAgICAgICAgcGx1Z2luPSZxdW90O29yZy5lY2xpcHNlLnVpJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O3BhcmFtZXRlcgotICAgICAgICAgIG5hbWU9JnF1b3Q7Y29sb3IxJnF1b3Q7Ci0gICAgICAgICAgdmFsdWU9JnF1b3Q7Q09MT1JfV0hJVEUmcXVvdDsvJmd0OwotICAgICAgICAgJmx0O3BhcmFtZXRlcgotICAgICAgICAgIG5hbWU9JnF1b3Q7Y29sb3IyJnF1b3Q7Ci0gICAgICAgICAgdmFsdWU9JnF1b3Q7Q09MT1JfQkxVRSZxdW90Oy8mZ3Q7ICAgICAgICAgCi0gICAgICAgICZsdDsvY29sb3JGYWN0b3J5Jmd0OwotICAgICAgICAmbHQ7IS0tIGJsYWNrIHNob3VsZCBiZSB1c2VkIG9uIEdUSyAtLSZndDsKLSAgICAgICAgJmx0O2NvbG9yVmFsdWUKLSAgICAgICAgIHZhbHVlPSZxdW90O0NPTE9SX0JMQUNLJnF1b3Q7Ci0gICAgICAgICBvcz0mcXVvdDtsaW51eCZxdW90OwotICAgICAgICAgd3M9JnF1b3Q7Z3RrJnF1b3Q7LyZndDsKLSAgICAgICAgJmx0O2Rlc2NyaXB0aW9uJmd0OwotICAgICAgICBUaGlzIGNvbG9yIGlzIHVzZWQgZm9yIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBYWVogcGx1Z2luIGVkaXRvci4KLSAgICAgICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAgICZsdDsvY29sb3JEZWZpbml0aW9uJmd0OyAgICAgIAotICAgICAgJmx0O2ZvbnREZWZpbml0aW9uCi0gICAgICAgIGlkPSZxdW90O2NvbS54eXouVGV4dEZvbnQmcXVvdDsKLSAgICAgICAgY2F0ZWdvcnlJZD0mcXVvdDtjb20ueHl6LlRoZW1lQ2F0ZWdvcnkmcXVvdDsgICAgICAgIAotICAgICAgICBsYWJlbD0mcXVvdDtYWVogRWRpdG9yIEZvbnQmcXVvdDsKLSAgICAgICAgZGVmYXVsdHNUbz0mcXVvdDtvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udCZxdW90OyZndDsKLSAgICAgICAgJmx0O2Rlc2NyaXB0aW9uJmd0OwotICAgICAgICBUaGlzIGZvbnQgaXMgdXNlZCBieSB0aGUgWFlZIHBsdWdpbiBlZGl0b3IuCi0gICAgICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICAmbHQ7L2ZvbnREZWZpbml0aW9uJmd0OwotICAgICAgJmx0O2RhdGEKLSAgICAgICBuYW1lPSZxdW90O2NvbS54eXouRWRpdG9yTWFyZ2luV2lkdGgmcXVvdDsKLSAgICAgICB2YWx1ZT0mcXVvdDs1JnF1b3Q7LyZndDsgICAgICAKLSAgICAgICZsdDt0aGVtZQotICAgICAgICBpZD0mcXVvdDtjb20ueHl6LkhhcnNoVGhlbWUmcXVvdDsKLSAgICAgICAgbGFiZWw9JnF1b3Q7SGFyc2ggQ29sb3JzIGZvciBYWVomcXVvdDsmZ3Q7Ci0gICAgICAgICZsdDtjb2xvck92ZXJyaWRlCi0gICAgICAgICBpZD0mcXVvdDtjb20ueHl6LkZvcmdyb3VuZCZxdW90OwotICAgICAgICAgdmFsdWU9JnF1b3Q7Q09MT1JfQ1lBTiZxdW90Oy8mZ3Q7Ci0gICAgICAgICZsdDtjb2xvck92ZXJyaWRlCi0gICAgICAgICBpZD0mcXVvdDtjb20ueHl6LkJhY2tncm91bmQmcXVvdDsKLSAgICAgICAgIHZhbHVlPSZxdW90O0NPTE9SX01BR0VOVEEmcXVvdDsvJmd0OwotICAgICAgJmx0O2RhdGEKLSAgICAgICAgICAgbmFtZT0mcXVvdDtjb20ueHl6LkVkaXRvck1hcmdpbldpZHRoJnF1b3Q7Ci0gICAgICAgICAgIHZhbHVlPSZxdW90OzEmcXVvdDsvJmd0OyAgICAgIAotICAgICAgJmx0Oy90aGVtZSZndDsgICAgICAgIAotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvdmlld0FjdGlvbnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3ZpZXdBY3Rpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOTZmNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY2hlbWEvdmlld0FjdGlvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIGlkPSJ2aWV3QWN0aW9ucyIgbmFtZT0iVmlldyBNZW51cyxUb29sYmFycyBhbmQgQWN0aW9ucyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCBhY3Rpb25zIHRvIHRoZSBwdWxsZG93biBtZW51IGFuZCB0b29sYmFyIGZvciB2aWV3cyByZWdpc3RlcmVkIGJ5IG90aGVyIHBsdWctaW5zLiBFYWNoIHZpZXcgaGFzIGEgbG9jYWwgcHVsbGRvd24gbWVudSBub3JtYWxseSBhY3RpdmF0ZWQgCi1ieSBjbGlja2luZyBvbiB0aGUgdG9wIHJpZ2h0IHRyaWFuZ2xlIGJ1dHRvbi4gT3RoZXIgcGx1Zy1pbnMgY2FuIGNvbnRyaWJ1dGUgc3VibWVudXMgYW5kIGFjdGlvbnMgdG8gdGhpcyBtZW51LiBQbHVnLWlucyBtYXkgYWxzbyBjb250cmlidXRlIGFjdGlvbnMgdG8gYSB2aWV3IHRvb2xiYXIuIFZpZXcgb3duZXJzIGFyZSBmaXJzdCBnaXZlbiBhIGNoYW5jZSB0byBwb3B1bGF0ZSB0aGVzZSBhcmVhcy4gT3B0aW9uYWwgYWRkaXRpb25zIGJ5IG90aGVyIHBsdWctaW5zIGFyZSBhcHBlbmRlZC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImNvbW1vbkFjdGlvbi5leHNkIi8+Ci0KLSAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJjb21tb25FeHByZXNzaW9uLmV4c2QiLz4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlld0NvbnRyaWJ1dGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmlld0NvbnRyaWJ1dGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gZGVmaW5lIGEgZ3JvdXAgb2YgdmlldyBhY3Rpb25zIGFuZC9vciBtZW51cy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWVudSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBjb250cmlidXRpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0SUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciBvZiBhIHJlZ2lzdGVyZWQgdmlldyB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhpcyBjb250cmlidXRpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFjdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibGFiZWwiIGljb249Imljb24iLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgYW4gYWN0aW9uIHRoYXQgdGhlIHVzZXIgY2FuIGludm9rZSBpbiB0aGUgVUkuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZWxlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW5hYmxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHRoaXMgYWN0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCBlaXRoZXIgYXMgdGhlIG1lbnUgaXRlbSB0ZXh0IG9yIHRvb2xiYXIgYnV0dG9uIGxhYmVsLiBUaGUgbmFtZSBjYW4gaW5jbHVkZSBtbmVub21pYyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im1lbnViYXJQYXRoIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgc2xhc2gtZGVsaW1pdGVkIHBhdGggKCZhcG9zOy8mYXBvczspIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhpcyBhY3Rpb24gaW4gdGhlIHB1bGxkb3duIG1lbnUuIEVhY2ggdG9rZW4gaW4gdGhlIHBhdGgsIGV4Y2VwdCB0aGUgbGFzdCBvbmUsIG11c3QgcmVwcmVzZW50IGEgdmFsaWQgaWRlbnRpZmllciBvZiBhbiBleGlzdGluZyBtZW51IGluIHRoZSBoaWVyYXJjaHkuIFRoZSBsYXN0IHRva2VuIHJlcHJlc2VudHMgdGhlIG5hbWVkIGdyb3VwIGludG8gd2hpY2ggdGhpcyBhY3Rpb24gd2lsbCBiZSBhZGRlZC4gSWYgdGhlIHBhdGggaXMgb21pdHRlZCwgdGhpcyBhY3Rpb24gd2lsbCBub3QgYXBwZWFyIGluIHRoZSBwdWxsZG93biBtZW51LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRvb2xiYXJQYXRoIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgbmFtZWQgZ3JvdXAgd2l0aGluIHRoZSBsb2NhbCB0b29sYmFyIG9mIHRoZSB0YXJnZXQgdmlldy4gSWYgdGhlIGdyb3VwIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuIElmIG9taXR0ZWQsIHRoZSBhY3Rpb24gd2lsbCBub3QgYXBwZWFyIGluIHRoZSBsb2NhbCB0b29sYmFyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSByZWxhdGl2ZSBwYXRoIG9mIGFuIGljb24gdXNlZCB0byB2aXN1YWxseSByZXByZXNlbnQgdGhlIGFjdGlvbiBpbiBpdHMgY29udGV4dC4KLUlmIG9taXR0ZWQgYW5kIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgdG9vbGJhciwgdGhlIFdvcmtiZW5jaCB3aWxsIHVzZSBhIHBsYWNlaG9sZGVyIGljb24uIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGx1Z2luLnhtbCBmaWxlIG9mIHRoZSBjb250cmlidXRpbmcgcGx1Zy1pbi4gVGhlIGljb24gd2lsbCBhcHBlYXIgaW4gdGhlIHRvb2xiYXIgYnV0IG5vdCBpbiB0aGUgcHVsbGRvd24gbWVudS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZWRJY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcmVsYXRpdmUgcGF0aCBvZiBhbiBpY29uIHVzZWQgdG8gdmlzdWFsbHkgcmVwcmVzZW50IHRoZSBhY3Rpb24gaW4gaXRzIGNvbnRleHQgd2hlbiB0aGUgYWN0aW9uIGlzIGRpc2FibGVkLiBJZiBvbWl0dGVkLCB0aGUgbm9ybWFsIGljb24gd2lsbCBzaW1wbHkgYXBwZWFyIGdyZXllZCBvdXQuIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGx1Z2luLnhtbCBmaWxlIG9mIHRoZSBjb250cmlidXRpbmcgcGx1Zy1pbi4gVGhlIGRpc2FibGVkIGljb24gd2lsbCBhcHBlYXIgaW4gdGhlIHRvb2xiYXIgYnV0IG5vdCBpbiB0aGUgcHVsbGRvd24gbWVudS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaG92ZXJJY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcmVsYXRpdmUgcGF0aCBvZiBhbiBpY29uIHVzZWQgdG8gdmlzdWFsbHkgcmVwcmVzZW50IHRoZSBhY3Rpb24gaW4gaXRzIGNvbnRleHQgd2hlbiB0aGUgbW91c2UgcG9pbnRlciBpcyBvdmVyIHRoZSBhY3Rpb24uIElmIG9taXR0ZWQsIHRoZSBub3JtYWwgaWNvbiB3aWxsIGJlIHVzZWQuIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGx1Z2luLnhtbCBmaWxlIG9mIHRoZSBjb250cmlidXRpbmcgcGx1Zy1pbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9vbHRpcCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSB0ZXh0IHJlcHJlc2VudGluZyB0aGUgYWN0aW9uJmFwb3M7cyB0b29sIHRpcC4gT25seSB1c2VkIGlmIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgdG9vbGJhci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhlbHBDb250ZXh0SWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciBpbmRpY2F0aW5nIHRoZSBoZWxwIGNvbnRleHQgZm9yIHRoaXMgYWN0aW9uLiBPbiBzb21lIHBsYXRmb3JtcywgaWYgdGhlIGFjdGlvbiBhcHBlYXJzIGFzIGEgbWVudSBpdGVtLCB0aGVuIHByZXNzaW5nIHRoZSBhcHByb3ByaWF0ZSBoZWxwIGtleSB3aGlsZSB0aGUgbWVudSBpdGVtIGlzIGhpZ2hsaWdodGVkIHdpbGwgZGlzcGxheSBoZWxwLiBOb3QgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IHRoaXMgYmVoYXZpb3VyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0eWxlIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJwdXNoIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgdG8gZGVmaW5lIHRoZSB1c2VyIGludGVyZmFjZSBzdHlsZSB0eXBlIGZvciB0aGUgYWN0aW9uLiBJZiBkZWZpbmVkLCB0aGUgYXR0cmlidXRlIHZhbHVlIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgJmx0O3RhYmxlIGJvcmRlcj0mcXVvdDswJnF1b3Q7IHdpZHRoPSZxdW90OzgwJSZxdW90OyZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7cHVzaCZsdDsvYiZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyZndDstIGFzIGEgcmVndWxhciBtZW51IGl0ZW0gb3IgdG9vbCBpdGVtLiZsdDsvdGQmZ3Q7Ci0gICAgICAmbHQ7L3RyJmd0OwotICAgICAgJmx0O3RyJmd0OwotICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzI1JnF1b3Q7Jmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IG5vd3JhcCZndDsmbHQ7YiZndDtyYWRpbyZsdDsvYiZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyZndDstIGFzIGEgcmFkaW8gc3R5bGUgbWVudSBpdGVtIG9yIHRvb2wgaXRlbS4gQWN0aW9ucyB3aXRoIHRoZSByYWRpbyBzdHlsZSB3aXRoaW4gdGhlIHNhbWUgbWVudSBvciB0b29sYmFyIGdyb3VwIGJlaGF2ZSBhcyBhIHJhZGlvIHNldC4gVGhlIGluaXRpYWwgdmFsdWUgaXMgc3BlY2lmaWVkIGJ5IHRoZSAmbHQ7c2FtcCZndDtzdGF0ZSZsdDsvc2FtcCZndDsgYXR0cmlidXRlLiZsdDsvdGQmZ3Q7Ci0gICAgICAmbHQ7L3RyJmd0OwotICAgICAgJmx0O3RyJmd0OwotICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzI1JnF1b3Q7Jmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IG5vd3JhcCZndDsmbHQ7YiZndDt0b2dnbGUmbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSBhcyBhIGNoZWNrZWQgc3R5bGUgbWVudSBpdGVtIG9yIGFzIGEgdG9nZ2xlIHRvb2wgaXRlbS4gVGhlIGluaXRpYWwgdmFsdWUgaXMgc3BlY2lmaWVkIGJ5IHRoZSAmbHQ7c2FtcCZndDtzdGF0ZSZsdDsvc2FtcCZndDsgYXR0cmlidXRlLiZsdDsvdGQmZ3Q7Ci0gICAgICAmbHQ7L3RyJmd0OwotICAgICZsdDsvdGFibGUmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJwdXNoIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InJhZGlvIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InRvZ2dsZSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGF0ZSIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIGluaXRpYWwgc3RhdGUgKGVpdGhlciAmbHQ7c2FtcCZndDt0cnVlJmx0Oy9zYW1wJmd0OyBvciAmbHQ7c2FtcCZndDtmYWxzZSZsdDsvc2FtcCZndDspLCB1c2VkIHdoZW4gdGhlICZsdDtzYW1wJmd0O3N0eWxlJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUgaGFzIHRoZSB2YWx1ZSAmbHQ7c2FtcCZndDtyYWRpbyZsdDsvc2FtcCZndDsgb3IgJmx0O3NhbXAmZ3Q7dG9nZ2xlJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBuYW1lIG9mIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuYWJsZXNGb3IiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBzZWxlY3Rpb24gY291bnQgd2hpY2ggbXVzdCBiZSBtZXQgdG8gZW5hYmxlIHRoZSBhY3Rpb24uCi1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBjb25kaXRpb24gaXMgbWV0LCB0aGUgYWN0aW9uIGlzIGVuYWJsZWQuCi1JZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQsIHRoZSBhY3Rpb24gaXMgZGlzYWJsZWQuCi1JZiBubyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIGlzIGVuYWJsZWQgZm9yIGFueSBudW1iZXIgb2YgaXRlbXMgc2VsZWN0ZWQuCi1UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQ6IAotICAgICZsdDt0YWJsZSBib3JkZXI9JnF1b3Q7MCZxdW90OyB3aWR0aD0mcXVvdDs4MCUmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0OyEmbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSAwIGl0ZW1zIHNlbGVjdGVkJmx0Oy90ZCZndDsKLSAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAmbHQ7dHImZ3Q7Ci0gJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgd2lkdGg9JnF1b3Q7MjUmcXVvdDsmZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsgbm93cmFwJmd0OyZsdDtiJmd0Oz8mbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSAwIG9yIDEgaXRlbXMgc2VsZWN0ZWQmbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7KyZsdDsvYiZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyZndDstIDEgb3IgbW9yZSBpdGVtcyBzZWxlY3RlZCZsdDsvdGQmZ3Q7Ci0gICAgICAmbHQ7L3RyJmd0OwotICAgICAgJmx0O3RyJmd0OwotICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzI1JnF1b3Q7Jmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IG5vd3JhcCZndDsmbHQ7YiZndDttdWx0aXBsZSwgMismbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgJmx0O3RkIHZhbGlnbj0mcXVvdDt0b3AmcXVvdDsmZ3Q7LSAyIG9yIG1vcmUgaXRlbXMgc2VsZWN0ZWQmbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7biZsdDsvYiZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyZndDstIGEgcHJlY2lzZSBudW1iZXIgb2YgaXRlbXMgc2VsZWN0ZWQuYSBwcmVjaXNlIG51bWJlciBvZiBpdGVtcyBzZWxlY3RlZC4mYW1wO25ic3A7Ci0gICAgICAgICAgRm9yIGV4YW1wbGU6IGVuYWJsZXNGb3I9JmFtcDtxdW90OyA0JmFtcDtxdW90OyBlbmFibGVzIHRoZSBhY3Rpb24gb25seSB3aGVuIDQKLSAgICAgICAgICBpdGVtcyBhcmUgc2VsZWN0ZWQmbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAgICZsdDt0ciZndDsKLSAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyB3aWR0aD0mcXVvdDsyNSZxdW90OyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyBub3dyYXAmZ3Q7Jmx0O2ImZ3Q7KiZsdDsvYiZndDsmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7dGQgdmFsaWduPSZxdW90O3RvcCZxdW90OyZndDstIGFueSBudW1iZXIgb2YgaXRlbXMgc2VsZWN0ZWQmbHQ7L3RkJmd0OwotICAgICAgJmx0Oy90ciZndDsKLSAgICAmbHQ7L3RhYmxlJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSB2aWV3IGFjdGlvbiBleHRlbnNpb246Ci0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLnZpZXdBY3Rpb25zJnF1b3Q7Jmd0OyAKLSAgICAgICZsdDt2aWV3Q29udHJpYnV0aW9uIAotICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei54eXpWaWV3QzEmcXVvdDsgCi0gICAgICAgICB0YXJnZXRJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3ImcXVvdDsmZ3Q7IAotICAgICAgICAgJmx0O21lbnUKLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS54eXoueHl6TWVudSZxdW90OyAKLSAgICAgICAgICAgIGxhYmVsPSZxdW90O1hZWiBNZW51JnF1b3Q7IAotICAgICAgICAgICAgcGF0aD0mcXVvdDthZGRpdGlvbnMmcXVvdDsmZ3Q7IAotICAgICAgICAgICAgJmx0O3NlcGFyYXRvciBuYW1lPSZxdW90O2dyb3VwMSZxdW90Oy8mZ3Q7IAotICAgICAgICAgJmx0Oy9tZW51Jmd0OyAKLSAgICAgICAgICZsdDthY3Rpb24KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS54eXoucnVuWFlaJnF1b3Q7IAotICAgICAgICAgICAgbGFiZWw9JnF1b3Q7JmFtcDthbXA7UnVuIFhZWiBUb29sJnF1b3Q7IAotICAgICAgICAgICAgbWVudWJhclBhdGg9JnF1b3Q7Y29tLnh5ei54eXpNZW51L2dyb3VwMSZxdW90OyAKLSAgICAgICAgICAgIHRvb2xiYXJQYXRoPSZxdW90O05vcm1hbC9hZGRpdGlvbnMmcXVvdDsKLSAgICAgICAgICAgIHN0eWxlPSZxdW90O3RvZ2dsZSZxdW90OwotICAgICAgICAgICAgc3RhdGU9JnF1b3Q7dHJ1ZSZxdW90OyAKLSAgICAgICAgICAgIGljb249JnF1b3Q7aWNvbnMvcnVuWFlaLmdpZiZxdW90OyAKLSAgICAgICAgICAgIHRvb2x0aXA9JnF1b3Q7UnVuIFhZWiBUb29sJnF1b3Q7IAotICAgICAgICAgICAgaGVscENvbnRleHRJZD0mcXVvdDtjb20ueHl6LnJ1bl9hY3Rpb25fY29udGV4dCZxdW90OyAKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS54eXouYWN0aW9ucy5SdW5YWVomcXVvdDsmZ3Q7IAotICAgICAgICAgICAgJmx0O3NlbGVjdGlvbiBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSZxdW90OyBuYW1lPSZxdW90OyouamF2YSZxdW90Oy8mZ3Q7IAotICAgICAgICAgJmx0Oy9hY3Rpb24mZ3Q7IAotICAgICAmbHQ7L3ZpZXdDb250cmlidXRpb24mZ3Q7IAotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgc3BlY2lmaWVkIGFjdGlvbiB3aWxsIG9ubHkgZW5hYmxlIGZvciBhIHNpbmdsZSBzZWxlY3Rpb24gKCZsdDtzYW1wJmd0O2VuYWJsZXNGb3ImbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSkuIEluIGFkZGl0aW9uLCB0aGUgb2JqZWN0IGluIHRoZSBzZWxlY3Rpb24gbXVzdCBiZSBhIEphdmEgZmlsZSByZXNvdXJjZS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVGhlIGZvbGxvd2luZyBpcyBhbiBvdGhlciBleGFtcGxlIG9mIGEgdmlldyBhY3Rpb24gZXh0ZW5zaW9uOiAKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkudmlld0FjdGlvbnMmcXVvdDsmZ3Q7IAotICAgICAgJmx0O3ZpZXdDb250cmlidXRpb24gCi0gICAgICAgICBpZD0mcXVvdDtjb20ueHl6Lnh5elZpZXdDMSZxdW90OyAKLSAgICAgICAgIHRhcmdldElEPSZxdW90O29yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZU5hdmlnYXRvciZxdW90OyZndDsgCi0gICAgICAgICAmbHQ7bWVudQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei54eXpNZW51JnF1b3Q7IAotICAgICAgICAgICAgbGFiZWw9JnF1b3Q7WFlaIE1lbnUmcXVvdDsgCi0gICAgICAgICAgICBwYXRoPSZxdW90O2FkZGl0aW9ucyZxdW90OyZndDsgCi0gICAgICAgICAgICAmbHQ7c2VwYXJhdG9yIG5hbWU9JnF1b3Q7Z3JvdXAxJnF1b3Q7LyZndDsgCi0gICAgICAgICAmbHQ7L21lbnUmZ3Q7IAotICAgICAgICAgJmx0O2FjdGlvbiAKLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS54eXoucnVuWFlaMiZxdW90OyAKLSAgICAgICAgICAgIGxhYmVsPSZxdW90OyZhbXA7YW1wO1J1biBYWVoyIFRvb2wmcXVvdDsgCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0mcXVvdDtjb20ueHl6Lnh5ek1lbnUvZ3JvdXAxJnF1b3Q7Ci0gICAgICAgICAgICBzdHlsZT0mcXVvdDtwdXNoJnF1b3Q7Ci0gICAgICAgICAgICBpY29uPSZxdW90O2ljb25zL3J1blhZWjIuZ2lmJnF1b3Q7IAotICAgICAgICAgICAgdG9vbHRpcD0mcXVvdDtSdW4gWFlaMiBUb29sJnF1b3Q7IAotICAgICAgICAgICAgaGVscENvbnRleHRJZD0mcXVvdDtjb20ueHl6LnJ1bl9hY3Rpb25fY29udGV4dDImcXVvdDsgCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LmFjdGlvbnMuUnVuWFlaMiZxdW90OyZndDsgCi0gICAgICAgICAgICAmbHQ7ZW5hYmxlbWVudCZndDsKLSAgICAgICAgICAgICAgICZsdDthbmQmZ3Q7Ci0gICAgICAgICAgICAgICAgICAmbHQ7b2JqZWN0Q2xhc3MgbmFtZT0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAmbHQ7bm90Jmd0OwotICAgICAgICAgICAgICAgICAgICAgJmx0O29iamVjdFN0YXRlIG5hbWU9JnF1b3Q7ZXh0ZW5zaW9uJnF1b3Q7IHZhbHVlPSZxdW90O2phdmEmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgICAgJmx0Oy9ub3QmZ3Q7Ci0gICAgICAgICAgICAgICAmbHQ7L2FuZCZndDsKLSAgICAgICAgICAgICZsdDsvZW5hYmxlbWVudCZndDsKLSAgICAgICAgICZsdDsvYWN0aW9uJmd0OyAKLSAgICAgICZsdDsvdmlld0NvbnRyaWJ1dGlvbiZndDsgCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBzcGVjaWZpZWQgYWN0aW9uIHdpbGwgYXBwZWFyIGFzIGEgbWVudSBpdGVtLiBUaGUgYWN0aW9uIGlzIGVuYWJsZWQgaWYgdGhlIHNlbGVjdGlvbiBjb250YWlucyBubyBKYXZhIGZpbGUgcmVzb3VyY2VzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4gVGhpcyBjbGFzcyBpcyBsb2FkZWQgYXMgbGF0ZSBhcyBwb3NzaWJsZSB0byBhdm9pZCBsb2FkaW5nIHRoZSBlbnRpcmUgcGx1Zy1pbiBiZWZvcmUgaXQgaXMgcmVhbGx5IG5lZWRlZC4KLSZsdDtwJmd0OwotVGhlIGludGVyZmFjZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlJmx0Oy9zYW1wJmd0OyBleHRlbmRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSZsdDsvc2FtcCZndDsgYW5kIGFkZHMgYW4gYWRkaXRpb25hbCBtZXRob2QgdGhhdCBhbGxvd3MgdGhlIAotZGVsZWdhdGUgdG8gaW5pdGlhbGl6ZSB3aXRoIHRoZSB2aWV3IGluc3RhbmNlIGl0IGlzIGNvbnRyaWJ1dGluZyBpbnRvLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGlzIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgdXNlZCB0byBjb250cmlidXRlIGFjdGlvbnMgaW50byBtZW51cyBwcmV2aW91c2x5IGNyZWF0ZWQgYnkgdGhlIHRhcmdldCB2aWV3LiBPbWl0dGluZyB0aGUgbWVudSBwYXRoIGF0dHJpYnV0ZSB3aWxsIHJlc3VsdCBpbiBhZGRpbmcgdGhlIG5ldyBtZW51IG9yIGFjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBwdWxsZG93biBtZW51LgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgZW5hYmxlbWVudCBjcml0ZXJpYSBmb3IgYW4gYWN0aW9uIGV4dGVuc2lvbiBpcyBpbml0aWFsbHkgZGVmaW5lZCBieSAmbHQ7c2FtcCZndDtlbmFibGVzRm9yJmx0Oy9zYW1wJmd0OywgYW5kIGFsc28gZWl0aGVyICZsdDtzYW1wJmd0O3NlbGVjdGlvbiZsdDsvc2FtcCZndDsgb3IgJmx0O3NhbXAmZ3Q7ZW5hYmxlbWVudCZsdDsvc2FtcCZndDsuIEhvd2V2ZXIsIG9uY2UgdGhlIGFjdGlvbiBkZWxlZ2F0ZSBoYXMgYmVlbiBpbnN0YW50aWF0ZWQsIGl0IG1heSBjb250cm9sIHRoZSBhY3Rpb24gZW5hYmxlIHN0YXRlIGRpcmVjdGx5IHdpdGhpbiBpdHMgJmx0O3NhbXAmZ3Q7c2VsZWN0aW9uQ2hhbmdlZCZsdDsvc2FtcCZndDsgbWV0aG9kLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1BY3Rpb24gYW5kIG1lbnUgbGFiZWxzIG1heSBjb250YWluIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IGVuY29kZSBtbmVtb25pY3MgdXNpbmcgdGhlIGZvbGxvd2luZyBydWxlczoKLSZsdDtvbCZndDsKLSZsdDtsaSZndDsKLU1uZW1vbmljcyBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBhbXBlcnNhbmQgKCZhcG9zOyZhbXA7YW1wOyZhcG9zOykgY2hhcmFjdGVyIGluIGZyb250Ci1vZiBhIHNlbGVjdGVkIGNoYXJhY3RlciBpbiB0aGUgdHJhbnNsYXRlZCB0ZXh0LiBTaW5jZSBhbXBlcnNhbmQgaXMgbm90Ci1hbGxvd2VkIGluIFhNTCBzdHJpbmdzLCB1c2UgJmx0O3NhbXAmZ3Q7JmFtcDthbXA7YW1wOyZsdDsvc2FtcCZndDsgY2hhcmFjdGVyIGVudGl0eS4mbHQ7L2xpJmd0OwotJmx0Oy9vbCZndDsKLUlmIHR3byBvciBtb3JlIGFjdGlvbnMgYXJlIGNvbnRyaWJ1dGVkIHRvIGEgbWVudSBvciB0b29sYmFyIGJ5IGEgc2luZ2xlIGV4dGVuc2lvbiB0aGUgYWN0aW9ucyB3aWxsIGFwcGVhciBpbiB0aGUgcmV2ZXJzZSBvcmRlciBvZiBob3cgdGhleSBhcmUgbGlzdGVkIGluIHRoZSBwbHVnaW4ueG1sIGZpbGUuIFRoaXMgYmVoYXZpb3IgaXMgYWRtaXR0ZWRseSB1bmludHVpdGl2ZS4gIEhvd2V2ZXIsIGl0IHdhcyBkaXNjb3ZlcmVkIGFmdGVyIHRoZSAgRWNsaXBzZSBQbGF0Zm9ybSBBUEkgd2FzIGZyb3plbi4gIENoYW5naW5nIHRoZSBiZWhhdmlvciBub3cgd291bGQgYnJlYWsgZXZlcnkgcGx1Zy1pbiB3aGljaCByZWxpZXMgdXBvbiB0aGUgZXhpc3RpbmcgYmVoYXZpb3IuCi0mbHQ7cCZndDsKLVRoZSAmbHQ7c2FtcCZndDtzZWxlY3Rpb24mbHQ7L3NhbXAmZ3Q7IGFuZCAmbHQ7c2FtcCZndDtlbmFibGVtZW50Jmx0Oy9zYW1wJmd0OyBlbGVtZW50cyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBUaGUgJmx0O3NhbXAmZ3Q7ZW5hYmxlbWVudCZsdDsvc2FtcCZndDsgZWxlbWVudCBjYW4gcmVwbGFjZSB0aGUgJmx0O3NhbXAmZ3Q7c2VsZWN0aW9uJmx0Oy9zYW1wJmd0OyBlbGVtZW50IHVzaW5nIHRoZSBzdWItZWxlbWVudHMgJmx0O3NhbXAmZ3Q7b2JqZWN0Q2xhc3MmbHQ7L3NhbXAmZ3Q7IGFuZCAmbHQ7c2FtcCZndDtvYmplY3RTdGF0ZSZsdDsvc2FtcCZndDsuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nOgotJmx0O3ByZSZndDsKLSAmbHQ7c2VsZWN0aW9uCi0gIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlJnF1b3Q7Ci0gIG5hbWU9JnF1b3Q7Ki5qYXZhJnF1b3Q7Jmd0OwotICZsdDsvc2VsZWN0aW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci1jYW4gYmUgZXhwcmVzc2VkIHVzaW5nOgotJmx0O3ByZSZndDsKLSAmbHQ7ZW5hYmxlbWVudCZndDsKLSAgJmx0O2FuZCZndDsKLSAgICZsdDtvYmplY3RDbGFzcyBuYW1lPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlJnF1b3Q7LyZndDsKLSAgICZsdDtvYmplY3RTdGF0ZSBuYW1lPSZxdW90O2V4dGVuc2lvbiZxdW90OyB2YWx1ZT0mcXVvdDtqYXZhJnF1b3Q7LyZndDsKLSAgJmx0Oy9hbmQmZ3Q7Ci0gJmx0Oy9lbmFibGVtZW50Jmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVhY2ggdmlldyBub3JtYWxseSBjb21lcyB3aXRoIGEgbnVtYmVyIG9mIHN0YW5kYXJkIGl0ZW1zIG9uIHRoZSBwdWxsZG93biBtZW51IGFuZCBsb2NhbCB0b29sYmFyLiBBZGRpdGlvbnMgZnJvbSBvdGhlciBwbHVnLWlucyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBzdGFuZGFyZCBjb21wbGVtZW50LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3ZpZXdzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS92aWV3cy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTU4NTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3ZpZXdzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0idmlld3MiIG5hbWU9IlZpZXdzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgdmlld3MgCi1mb3IgdGhlIHdvcmtiZW5jaC4gIEEgdmlldyBpcyBhIHZpc3VhbCBjb21wb25lbnQgCi13aXRoaW4gYSB3b3JrYmVuY2ggcGFnZS4gIEl0IGlzIHR5cGljYWxseSB1c2VkIHRvIAotbmF2aWdhdGUgYSBoaWVyYXJjaHkgb2YgaW5mb3JtYXRpb24gKGxpa2UgdGhlIHdvcmtzcGFjZSksIAotb3BlbiBhbiBlZGl0b3IsICBvciBkaXNwbGF5IHByb3BlcnRpZXMgZm9yIAotdGhlIGFjdGl2ZSBlZGl0b3IuICBUaGUgdXNlciBjYW4gbWFrZSBhIHZpZXcgCi12aXNpYmxlIGZyb20gdGhlIFdpbmRvdyAmZ3Q7IFNob3cgVmlldyBtZW51IG9yIGNsb3NlIGl0IGZyb20gdGhlIAotdmlldyBsb2NhbCB0aXRsZSBiYXIuIAotJmx0O3AmZ3Q7Ci1JbiBvcmRlciB0byByZWR1Y2UgdGhlIHZpc3VhbCBjbHV0dGVyIGluIHRoZSBTaG93IFZpZXcgRGlhbG9nLCB2aWV3cyBzaG91bGQgYmUgZ3JvdXBlZCB1c2luZyBjYXRlZ29yaWVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlldyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzdGlja3lWaWV3Ii8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2F0ZWdvcnkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB0aGlzIGNhdGVnb3J5Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBVSSBmb3IgdGhpcyBjYXRlZ29yeQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50Q2F0ZWdvcnkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgcGF0aCBjb21wb3NlZCBvZiBjYXRlZ29yeSBJRHMgc2VwYXJhdGVkIGJ5ICZhcG9zOy8mYXBvczsuIFRoaXMKLWFsbG93cyB0aGUgY3JlYXRpb24gb2YgYSBoaWVyYXJjaHkgb2YgY2F0ZWdvcmllcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmlldyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIgaWNvbj0iaWNvbiIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyB2aWV3Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBVSSBmb3IgdGhpcyB2aWV3Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXRlZ29yeSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgdGhhdCBpcyBjb21wb3NlZCBvZiB0aGUgY2F0ZWdvcnkgSURzIHNlcGFyYXRlZAotYnkgJmFwb3M7LyZhcG9zOy4gRWFjaCByZWZlcmVuY2VkIGNhdGVnb3J5IG11c3QgYmUgZGVjbGFyZWQgaW4gYSBjb3JyZXNwb25kaW5nIGNhdGVnb3J5IGVsZW1lbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0Jmx0Oy9zYW1wJmd0Oy4gQSBjb21tb24gcHJhY3RpY2UgCi1pcyB0byBzdWJjbGFzcyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0Jmx0Oy9zYW1wJmd0OyAKLWluIG9yZGVyIHRvIGluaGVyaXQgdGhlIGRlZmF1bHQgZnVuY3Rpb25hbGl0eS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcmVsYXRpdmUgbmFtZSBvZiB0aGUgaWNvbiB0aGF0IHdpbGwgCi1iZSBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXcuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhc3RWaWV3V2lkdGhSYXRpbyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgcGVyY2VudGFnZSBvZiB0aGUgd2lkdGggb2YgdGhlIHdvcmtiZW5jaCB0aGF0IHRoZSB2aWV3IHdpbGwgdGFrZSB1cCBhcyBhbiBhY3RpdmUgZmFzdCB2aWV3LgotVGhpcyBtdXN0IGJlIGRlZmluZWQgYXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBhbmQgbGllIGJldHdlZW4gMC4wNSBhbmQgMC45NS4KLUlmIG5vIHZhbHVlIGlzIHN1cHBsaWVkLCBhIGRlZmF1bHQgcmF0aW8gd2lsbCBiZSB1c2VkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsbG93TXVsdGlwbGUiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgdmlldyBhbGxvd3MgbXVsdGlwbGUgaW5zdGFuY2VzIHRvIGJlIGNyZWF0ZWQgdXNpbmcgSVdvcmtiZW5jaFBhZ2Uuc2hvd1ZpZXcoU3RyaW5nIGlkLCBTdHJpbmcgc2Vjb25kYXJ5SWQpLiAgVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIGFuIG9wdGlvbmFsIHN1YmVsZW1lbnQgd2hvc2UgYm9keSBzaG91bGQgY29udGFpbiB0ZXh0IHByb3ZpZGluZyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSB2aWV3LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdGlja3lWaWV3Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIHN0aWNreSB2aWV3IGlzIGEgdmlldyB0aGF0IHdpbGwgYXBwZWFyIGJ5IGRlZmF1bHQgYWNyb3NzIGFsbCBwZXJzcGVjdGl2ZXMgaW4gYSB3aW5kb3cgb25jZSBpdCBpcyBvcGVuZWQuICBJdHMgaW5pdGlhbCBwbGFjZW1lbnQgaXMgZ292ZXJuZW1lZCBieSB0aGUgbG9jYXRpb24gYXR0cmlidXRlLCBidXQgbm90aGluZyBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIG1vdmVkIG9yIGNsb3NlZCBieSB0aGUgdXNlci4gIFVzZSBvZiB0aGlzIGVsZW1lbnQgd2lsbCBvbmx5IGNhdXNlIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSB2aWV3IHRvIGJlIGNyZWF0ZWQsIGl0IHdpbGwgbm90IHNob3cgdGhlIHZpZXcuICBQbGVhc2Ugbm90ZSB0aGF0IHVzYWdlIG9mIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgZG9uZSB3aXRoIGdyZWF0IGNhcmUgYW5kIHNob3VsZCBvbmx5IGJlIGFwcGxpZWQgdG8gdmlld3MgdGhhdCB0cnVlbHkgaGF2ZSBhIG5lZWQgdG8gbGl2ZSBhY3Jvc3MgcGVyc3BlY3RpdmVzLgotCi1TaW5jZSAzLjAKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSB2aWV3IHRvIGJlIG1hZGUgc3RpY2t5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBhdHRyaWJ1dGUgdGhhdCBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdGlja3kgdmlldyByZWxhdGl2ZSB0byB0aGUgZWRpdG9yIGFyZWEuICBJZiBhYnNlbnQsIHRoZSB2aWV3IHdpbGwgYmUgZG9ja2VkIHRvIHRoZSByaWdodCBvZiB0aGUgZWRpdG9yIGFyZWEuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJSSUdIVCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJMRUZUIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlRPUCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJCT1RUT00iPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xvc2VhYmxlIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBhdHRyaWJ1dGUgdGhhdCBzcGVjaWZpZXMgd2V0aGVyIHRoZSB2aWV3IHNob3VsZCBiZSBjbG9zZWFibGUuICBJZiBhYnNlbnQgaXQgd2lsbCBiZSBjbG9zZWFibGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibW92ZWFibGUiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGF0dHJpYnV0ZSB0aGF0IHNwZWNpZmllcyB3ZXRoZXIgdGhlIHZpZXcgc2hvdWxkIGJlIG1vdmVhYmxlLiAgSWYgYWJzZW50IGl0IHdpbGwgYmUgbW92ZWFibGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50OiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkudmlld3MmcXVvdDsmZ3Q7IAotICAgICAgJmx0O2NhdGVnb3J5IAotICAgICAgICAgaWQ9JnF1b3Q7Y29tLnh5ei52aWV3cy5YWVp2aWV3cyZxdW90OyAKLSAgICAgICAgIG5hbWU9JnF1b3Q7WFlaJnF1b3Q7LyZndDsgCi0gICAgICAmbHQ7dmlldyAKLSAgICAgICAgIGlkPSZxdW90O2NvbS54eXoudmlld3MuWFlaVmlldyZxdW90OyAKLSAgICAgICAgIG5hbWU9JnF1b3Q7WFlaIFZpZXcmcXVvdDsgCi0gICAgICAgICBjYXRlZ29yeT0mcXVvdDtjb20ueHl6LnZpZXdzLlhZWnZpZXdzJnF1b3Q7IAotICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei52aWV3cy5YWVpWaWV3JnF1b3Q7IAotICAgICAgICAgaWNvbj0mcXVvdDtpY29ucy9YWVouZ2lmJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgc3RpY2t5IHZpZXcgZGVjbGFyYXRpb246Ci0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVpLnZpZXdzJnF1b3Q7Jmd0OyAKLSAgICAgICZsdDtzdGlja3lWaWV3Ci0gICAgICAgICBpZD0mcXVvdDtjb20ueHl6LnZpZXdzLlhZWlZpZXcmcXVvdDsgLyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBtdXN0IGJlIGEgCi1mdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0Jmx0Oy9zYW1wJmd0Oy4gIEl0IGlzIGNvbW1vbiAKLXByYWN0aWNlIHRvIHN1YmNsYXNzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQmbHQ7L3NhbXAmZ3Q7Ci0gd2hlbiBkZXZlbG9waW5nIGEgbmV3IHZpZXcuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBFY2xpcHNlIFBsYXRmb3JtIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0YW5kYXJkIHZpZXdzIGluY2x1ZGluZyBOYXZpZ2F0b3IsIFByb3BlcnRpZXMsIE91dGxpbmUgYW5kIFRhc2tzLiBGcm9tIHRoZSB1c2VyIHBvaW50IG9mIHZpZXcsIHRoZXNlIHZpZXdzIGFyZSBubyBkaWZmZXJlbnQgZnJvbSBhbnkgb3RoZXIgdmlldyBwcm92aWRlZCBieSB0aGUgcGx1Zy1pbnMuIEFsbCB0aGUgdmlld3MgY2FuIGJlIHNob3duIGZyb20gdGhlICZxdW90O1Nob3cgVmlldyZxdW90OyBzdWJtZW51IG9mIHRoZSAmcXVvdDtXaW5kb3cmcXVvdDsgbWVudS4gVGhlIHBvc2l0aW9uIG9mIGEgdmlldyBpcyBwZXJzaXN0ZW50OiBpdCBpcyBzYXZlZCB3aGVuIHRoZSB2aWV3IGlzIGNsb3NlZCBhbmQgcmVzdG9yZWQgd2hlbiB0aGUgdmlldyBpcyByZW9wZW5lZCBpbiBhIHNpbmdsZSBzZXNzaW9uLiAgVGhlIHBvc2l0aW9uIGlzIGFsc28gcGVyc2lzdGVkIGJldHdlZW4gd29ya2JlbmNoIHNlc3Npb25zLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3dvcmtpbmdTZXRzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjaGVtYS93b3JraW5nU2V0cy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjIxNzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc2NoZW1hL3dvcmtpbmdTZXRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiBpZD0id29ya2luZ1NldHMiIG5hbWU9IldvcmtpbmcgU2V0cyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGRlZmluZSBhIHdvcmtpbmcgc2V0IHdpemFyZCBwYWdlLiBXb3JraW5nIHNldHMgY29udGFpbiBhIG51bWJlciBvZiBlbGVtZW50cyBvZiB0eXBlIElBZGFwdGFibGUgYW5kIGNhbiBiZSB1c2VkIHRvIGdyb3VwIGVsZW1lbnRzIGZvciBwcmVzZW50YXRpb24gdG8gdGhlIHVzZXIgb3IgZm9yIG9wZXJhdGlvbnMgb24gYSBzZXQgb2YgZWxlbWVudHMuIEEgd29ya2luZyBzZXQgd2l6YXJkIHBhZ2UgaXMgdXNlZCB0byBjcmVhdGUgYW5kIGVkaXQgd29ya2luZyBzZXRzIHRoYXQgY29udGFpbiBlbGVtZW50cyBvZiBhIHNwZWNpZmljIHR5cGUuCi0mbHQ7cCZndDsKLVRvIHNlbGVjdCBhIHdvcmtpbmcgc2V0IHRoZSB1c2VyIGlzIHByZXNlbnRlZCB3aXRoIGEgbGlzdCBvZiB3b3JraW5nIHNldHMgdGhhdCBleGlzdCBpbiB0aGUgd29ya2JlbmNoLiBGcm9tIHRoYXQgbGlzdCBhIHdvcmtpbmcgc2V0IGNhbiBiZSBzZWxlY3RlZCBhbmQgZWRpdGVkIHVzaW5nIG9uZSBvZiB0aGUgd2l6YXJkIHBhZ2VzIGRlZmluZWQgdXNpbmcgdGhpcyBleHRlbnNpb24gcG9pbnQuIEFuIGV4aXN0aW5nIHdvcmtpbmcgc2V0IGlzIGFsd2F5cyBlZGl0ZWQgd2l0aCB0aGUgd2l6YXJkIHBhZ2UgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgaXQgb3Igd2l0aCB0aGUgZGVmYXVsdCByZXNvdXJjZSBiYXNlZCB3b3JraW5nIHNldCBwYWdlIGlmIHRoZSBvcmlnaW5hbCBwYWdlIGlzIG5vdCBhdmFpbGFibGUuCi0mbHQ7cCZndDsKLUEgbmV3IHdvcmtpbmcgc2V0IGNhbiBiZSBkZWZpbmVkIGJ5IHRoZSB1c2VyIGZyb20gdGhlIHNhbWUgd29ya2luZyBzZXQgc2VsZWN0aW9uIGRpYWxvZy4gV2hlbiBhIG5ldyB3b3JraW5nIHNldCBpcyBkZWZpbmVkLCB0aGUgcGx1Z2luIHByb3ZpZGVkIHdpemFyZCBwYWdlIGlzIHByZWNlZGVkIGJ5IGEgcGFnZSBsaXN0aW5nIGFsbCBhdmFpbGFibGUgd29ya2luZyBzZXQgdHlwZXMuIFRoaXMgbGlzdCBpcyBtYWRlIHVwIG9mIHRoZSBuYW1lIGF0dHJpYnV0ZSB2YWx1ZXMgb2YgZWFjaCB3b3JraW5nIHNldCBleHRlbnNpb24uIAotJmx0O3AmZ3Q7Ci1WaWV3cyBwcm92aWRlIGEgdXNlciBpbnRlcmZhY2UgdG8gb3BlbiB0aGUgd29ya2luZyBzZXQgc2VsZWN0aW9uIGRpYWxvZyBhbmQgbXVzdCBzdG9yZSB0aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuCi0mbHQ7cCZndDsKLVRoZSByZXNvdXJjZSBuYXZpZ2F0b3IgdXNlcyBhIHdvcmtpbmcgc2V0IHRvIGZpbHRlciBlbGVtZW50cyBmcm9tIHRoZSBuYXZpZ2F0b3Igdmlldy4gT25seSBwYXJlbnRzIGFuZCBjaGlsZHJlbiBvZiB3b3JraW5nIHNldCBlbGVtZW50cyBhcmUgc2hvd24gaW4gdGhlIHZpZXcsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JraW5nIHNldCBlbGVtZW50cyB0aGVtc2VsdmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3b3JraW5nU2V0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3b3JraW5nU2V0Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgd29ya2luZyBzZXQgZGlhbG9nLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGFuZCBlZGl0ZWQgYnkgdGhlIHdvcmtpbmcgc2V0IHBhZ2UuIFRoaXMgc2hvdWxkIGJlIGEgZGVzY3JpcHRpdmUgbmFtZSBsaWtlICZxdW90O1Jlc291cmNlJnF1b3Q7IG9yICZxdW90O0phdmEgRWxlbWVudCZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHJlbGF0aXZlIHBhdGggb2YgYW4gaW1hZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgd29ya2luZyBzZXQgdHlwZSBsaXN0IG9uIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB3b3JraW5nIHNldCBjcmVhdGlvbiB3aXphcmQgYXMgd2VsbCBhcyBpbiB0aGUgd29ya2luZyBzZXQgc2VsZWN0aW9uIGRpYWxvZy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFnZUNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgaW1wbGVtZW50aW5nICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVdvcmtpbmdTZXRQYWdlJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOm9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVdvcmtpbmdTZXRQYWdlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXBkYXRlckNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgaW1wbGVtZW50aW5nICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0VXBkYXRlciZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldFVwZGF0ZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUmVsZWFzZSAyLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRoZSByZXNvdXJjZSB3b3JraW5nIHNldCBkaWFsb2cgZXh0ZW5zaW9uIGlzIGRlZmluZWQgdG8gZGlzcGxheSBhbmQgZWRpdCBnZW5lcmljIElSZXNvdXJjZSBlbGVtZW50czogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51aS53b3JraW5nU2V0cyZxdW90OyZndDsKLSAgICAgICAgJmx0O3dvcmtpbmdTZXQKLSAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsKLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7UmVzb3VyY2UmcXVvdDsKLSAgICAgICAgICAgIGljb249JnF1b3Q7aWNvbnMvcmVzd29ya3NldC5naWYmcXVvdDsKLSAgICAgICAgICAgIHBhZ2VDbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsgLyZndDsKLSAgICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgcGFnZUNsYXNzIGF0dHJpYnV0ZSBtdXN0IHJlcHJlc2VudCBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JV29ya2luZ1NldFBhZ2UmbHQ7L3NhbXAmZ3Q7IGludGVyZmFjZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHdvcmtiZW5jaCBwcm92aWRlcyBhIHdvcmtpbmcgc2V0IHdpemFyZCBwYWdlIGZvciBjcmVhdGluZyBhbmQgZWRpdGluZyByZXNvdXJjZSBiYXNlZCB3b3JraW5nIHNldHMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA5ZTU2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnVpL3NjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhLS0gYnVpbGQgc2NyaXB0IHRvIGNyZWF0ZSBhIHBsdWdpbiBmcm9tIG9yZy5lY2xpcHNlLnVpIC0tPgotPHByb2plY3QgbmFtZT0iRXhwb3J0IEVjbGlwc2UgVUkiIGRlZmF1bHQ9ImV4cG9ydEFsbCIgYmFzZWRpcj0iLi4iPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8cHJvcGVydHkgbmFtZT0iZGVzdGRpciIgdmFsdWU9Ii4uLy4uL3BsdWdpbi1leHBvcnQiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iICB2YWx1ZT0ib3JnLmVjbGlwc2UudWkiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiAgdmFsdWU9Il8zLjAuMCIgLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QiICB2YWx1ZT0iJHtkZXN0ZGlyfS8ke3BsdWdpbn0ke3ZlcnNpb259IiAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgCTxlY2xpcHNlLmluY3JlbWVudGFsQnVpbGQgcHJvamVjdD0iJHtwbHVnaW59IiBraW5kPSJpbmNyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImV4cG9ydCIgZGVwZW5kcz0iYnVpbGQiPgotCQk8bWtkaXIgZGlyPSIke2Rlc3RkaXJ9IiAvPgotCQk8ZGVsZXRlIGRpcj0iJHtkZXN0fSIgLz4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0fSIgLz4KLQkJPGphciAKLQkJCWphcmZpbGU9IiR7ZGVzdH0vdWkuamFyIgotCQkJYmFzZWRpcj0iYmluIgotCQkvPgotCQk8Y29weSBmaWxlPSJwbHVnaW4ueG1sIiB0b2Rpcj0iJHtkZXN0fSIvPgotCQk8Y29weSBmaWxlPSJwbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7ZGVzdH0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZGVzdH0vaWNvbnMiPgotCQkJPGZpbGVzZXQgZGlyPSJpY29ucyIgLz4KLQkJPC9jb3B5PgotCQk8emlwIHppcGZpbGU9IiR7ZGVzdH0vdWlzcmMuemlwIj4KLQkJICAgIDxmaWxlc2V0IGRpcj0ic3JjIiAvPgotICAJCTwvemlwPgkJCQkKLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZXhwb3J0QWxsIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJleHBvcnQiLz4KLQkJPGFudCBhbnRmaWxlPSJzY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwiIGRpcj0iLi4vb3JnLmVjbGlwc2UudGV4dCIgdGFyZ2V0PSJleHBvcnQiLz4KLQkJPGFudCBhbnRmaWxlPSJzY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwiIGRpcj0iLi4vb3JnLmVjbGlwc2UuamZhY2UiIHRhcmdldD0iZXhwb3J0Ii8+Ci0JCTxhbnQgYW50ZmlsZT0ic2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sIiBkaXI9Ii4uL29yZy5lY2xpcHNlLmpmYWNlLnRleHQiIHRhcmdldD0iZXhwb3J0Ii8+Ci0JCTxhbnQgYW50ZmlsZT0ic2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sIiBkaXI9Ii4uL29yZy5lY2xpcHNlLnVpLnZpZXdzIiB0YXJnZXQ9ImV4cG9ydCIvPgotCQk8YW50IGFudGZpbGU9InNjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbCIgZGlyPSIuLi9vcmcuZWNsaXBzZS51aS5lZGl0b3JzIiB0YXJnZXQ9ImV4cG9ydCIvPgotCQk8YW50IGFudGZpbGU9InNjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbCIgZGlyPSIuLi9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2giIHRhcmdldD0iZXhwb3J0Ii8+Ci0JCTxhbnQgYW50ZmlsZT0ic2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sIiBkaXI9Ii4uL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIiB0YXJnZXQ9ImV4cG9ydCIvPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NjgzMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC51dGlsLlByZWZVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBwbHVnLWluIGNsYXNzIGZvciB0aGUgb3JnLmVjbGlwc2UudWkgcGx1Zy1pbi4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZXJuYWwgdG8gdGhlIHdvcmtiZW5jaCBhbmQgc2hvdWxkIG5vdCBiZQotICogcmVmZXJlbmNlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotICAgIHByaXZhdGUgc3RhdGljIFVJUGx1Z2luIGluc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBVSVBsdWdpbi4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIFVJUGx1Z2luKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpbnN0ID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBXaGVyZSBhcmUgdGhlIGltYWdlcz8gIFRoZSBpbWFnZXMgKHR5cGljYWxseSBnaWZzKSBhcmUgZm91bmQgaW4gdGhlIAotICAgICAqIHNhbWUgcGx1Z2lucyBkaXJlY3RvcnkuCi0gICAgICoKLSAgICAgKiBAc2VlIEltYWdlUmVnaXN0cnkKLSAgICAgKgotICAgICAqIE5vdGU6IFRoZSB3b3JrYmVuY2ggdXNlcyB0aGUgc3RhbmRhcmQgSkZhY2UgSW1hZ2VSZWdpc3RyeSB0byB0cmFjayBpdHMgaW1hZ2VzLiBJbiBhZGRpdGlvbiAKLSAgICAgKiB0aGUgY2xhc3MgV29ya2JlbmNoR3JhcGhpY1Jlc291cmNlcyBwcm92aWRlcyBjb252ZW5pZW5jZSBhY2Nlc3MgdG8gdGhlIGdyYXBoaWNzIHJlc291cmNlcyAKLSAgICAgKiBhbmQgZmFzdCBmaWVsZCBhY2Nlc3MgZm9yIHNvbWUgb2YgdGhlIGNvbW1vbmx5IHVzZWQgZ3JhcGhpY2FsIGltYWdlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSW1hZ2VSZWdpc3RyeSBjcmVhdGVJbWFnZVJlZ2lzdHJ5KCkgewotICAgICAgICAvKiBKdXN0IHRvIGJlIHN1cmUgdGhhdCB3ZSBkb24ndCBhY2Nlc3MgdGhpcwotICAgICAgICAgKiBwbHVnLWlucyBpbWFnZSByZWdpc3RyeS4KLSAgICAgICAgICovCi0gICAgICAgIEFzc2VydC5pc0xlZ2FsKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLSAgICAgICAgLyogSnVzdCB0byBiZSBzdXJlIHRoYXQgd2UgZG9uJ3QgYWNjZXNzIHRoaXMKLSAgICAgICAgICogcGx1Zy1pbnMgaW1hZ2UgcmVnaXN0cnkuCi0gICAgICAgICAqLwotICAgICAgICBBc3NlcnQuaXNMZWdhbChmYWxzZSk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLiBUaGlzIHJlcHJlc2VudHMgdGhlIHJ1bnRpbWUgcGx1Z2luLgotICAgICAqCi0gICAgICogQHJldHVybiBVSVBsdWdpbiB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKiBAc2VlIEFic3RyYWN0VUlQbHVnaW4gZm9yIHRoZSB0eXBpY2FsIGltcGxlbWVudGF0aW9uIHBhdHRlcm4gZm9yIHBsdWdpbiBjbGFzc2VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIGluc3Q7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFNldCBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGlzIGluaXRpYWxseSBsb2FkZWQKLSAgICAgKiBiZWNhdXNlIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgbm90IHN0b3JlZCBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4gIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQuCi0gICAgICAgIC8vIFByZWZzIGFyZSBpbml0aWFsaXplZCBpbiBVSVByZWZlcmVuY2VJbml0aWFsaXplci4KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLQotICAgICAgICAvLyBzZXQgYSBjYWxsYmFjayBhbGxvd2luZyB0aGUgd29ya2JlbmNoIHBsdWdpbiB0byBvYnRhaW4KLSAgICAgICAgLy8gYW5kIHNhdmUgdGhlIFVJIHBsdWdpbidzIHByZWZlcmVuY2Ugc3RvcmUKLSAgICAgICAgUHJlZlV0aWwuc2V0VUlDYWxsYmFjayhuZXcgUHJlZlV0aWwuSUNhbGxiYWNrKCkgewotICAgICAgICAgICAgcHVibGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBVSVBsdWdpbi50aGlzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0gICAgICAgICAgICAgICAgVUlQbHVnaW4udGhpcy5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudWkvc3JjL29yZy9lY2xpcHNlL3VpL2ludGVybmFsL1VJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MWQ2MzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS51aS9zcmMvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlcy5Ob2RlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5JQmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGhlbWVzLklUaGVtZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFVJIHBsdWdpbidzIHByZWZlcmVuY2UgZXh0ZW5zaW9uJ3MgY3VzdG9taXphdGlvbgotICogZWxlbWVudC4gVGhpcyBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIFVJIHBsdWdpbidzIHByZWZlcmVuY2VzIHRvIGJlCi0gKiBpbml0aWFsaXplZCBwcm9wZXJseSB3aGVuIHJ1bm5pbmcgd2l0aG91dAotICogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBidWcgNTg5NzUgLSBOZXcKLSAqIHByZWZlcmVuY2UgbWVjaGFuaXNtIGRvZXMgbm90IHByb3Blcmx5IGluaXRpYWxpemUgZGVmYXVsdHMuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFVJUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0KLQkJSVNjb3BlQ29udGV4dCBjb250ZXh0ID0gbmV3IERlZmF1bHRTY29wZSgpOwotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBjb250ZXh0LmdldE5vZGUoVUlQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJbm9kZS5wdXQoSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuT1BFTl9ORVdfUEVSU1BFQ1RJVkUsCi0JCQkJSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuT1BFTl9QRVJTUEVDVElWRV9SRVBMQUNFKTsKLQotCQkvL0RlcHJlY2F0ZWQgYnV0IGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0JCW5vZGUucHV0KElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLlBST0pFQ1RfT1BFTl9ORVdfUEVSU1BFQ1RJVkUsCi0JCQkJSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuT1BFTl9QRVJTUEVDVElWRV9SRVBMQUNFKTsKLQkJbm9kZS5wdXQoSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuU0hJRlRfT1BFTl9ORVdfUEVSU1BFQ1RJVkUsCi0JCQkJSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuT1BFTl9QRVJTUEVDVElWRV9SRVBMQUNFKTsKLQkJbm9kZS5wdXQoSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuQUxURVJOQVRFX09QRU5fTkVXX1BFUlNQRUNUSVZFLAotCQkJCUlXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLk9QRU5fUEVSU1BFQ1RJVkVfUkVQTEFDRSk7Ci0KLQkJLy9BbHRob3VnaCB0aGVyZSBpcyBubyBsb25nZXIgYW55IGl0ZW0gb24gdGhlIHByZWZlcmVuY2UgcGFnZXMKLQkJLy9mb3Igc2V0dGluZyB0aGUgbGlua2luZyBwcmVmZXJlbmNlLCBzaW5jZSBpdCBpcyBub3cgYSBwZXItcGFydAotCQkvLyBzZXR0aW5nLCBpdCByZW1haW5zIGFzIGEgcHJlZmVyZW5jZSB0byBhbGxvdyBwcm9kdWN0IG92ZXJyaWRlcyBvZiB0aGUKLQkJLy9pbml0aWFsIHN0YXRlIG9mIGxpbmtpbmcgaW4gdGhlIE5hdmlnYXRvci4gQnkgZGVmYXVsdCwgbGlua2luZyBpcwotCQkvLyBvZmYuCi0JCW5vZGUucHV0Qm9vbGVhbihJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cy5MSU5LX05BVklHQVRPUl9UT19FRElUT1IsCi0JCQkJZmFsc2UpOwotCi0JCS8vQXBwZWFyYW5jZSAvIFByZXNlbnRhdGlvbiBwcmVmZXJlbmNlcwotCQlub2RlLnB1dChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVTRU5UQVRJT05fRkFDVE9SWV9JRCwKLQkJCQkib3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5kZWZhdWx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZQotCQkJCS5wdXRCb29sZWFuKAotCQkJCQkJSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuU0hPV19UUkFESVRJT05BTF9TVFlMRV9UQUJTLAotCQkJCQkJdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cy5FTkFCTEVfQU5JTUFUSU9OUywgdHJ1ZSk7Ci0JCW5vZGUucHV0KElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLkRPQ0tfUEVSU1BFQ1RJVkVfQkFSLAotCQkJCUlXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLlRPUF9MRUZUKTsKLQkJbm9kZS5wdXRCb29sZWFuKAotCQkJCUlXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLlNIT1dfVEVYVF9PTl9QRVJTUEVDVElWRV9CQVIsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy90aGUgZmFzdCB2aWV3IGJhciBzaG91bGQgYmUgb24gdGhlIGJvdHRvbSBvZiBhIGZyZXNoIHdvcmtzcGFjZQotCQlub2RlLnB1dChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cy5JTklUSUFMX0ZBU1RfVklFV19CQVJfTE9DQVRJT04sCi0JCQkJSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuQk9UVE9NKTsKLQotCQkvL2RlZmF1bHQgdG8gc2hvd2luZyBpbnRybyBvbiBzdGFydHVwCi0JCW5vZGUucHV0Qm9vbGVhbihJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cy5TSE9XX0lOVFJPLCB0cnVlKTsKLQotCQkvL0RlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGtleSBjb25maWd1cmF0aW9uLgotCQlub2RlLnB1dChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cy5LRVlfQ09ORklHVVJBVElPTl9JRCwKLQkJCQlJQmluZGluZ1NlcnZpY2UuREVGQVVMVF9ERUZBVUxUX0FDVElWRV9TQ0hFTUVfSUQpOwotCi0JCS8vUHJlZmVyZW5jZSBmb3Igc2hvd2luZyBzeXN0ZW0gam9icyBpbiB0aGUgam9icyB2aWV3Ci0JCW5vZGUucHV0Qm9vbGVhbihJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cy5TSE9XX1NZU1RFTV9KT0JTLGZhbHNlKTsKLQotCQkvL1NldCB0aGUgZGVmYXVsdCB0aGVtZS4KLQkJbm9kZS5wdXQoSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuQ1VSUkVOVF9USEVNRV9JRCwKLQkJCQlJVGhlbWVNYW5hZ2VyLkRFRkFVTFRfVEhFTUUpOwotCQkKLQkJLy9UaGUgZGVmYXVsdCBjaGFyYWN0ZXIgd2lkdGggaXMgdW5kZWZpbmVkIChpLmUuLCAtMSkKLQkJbm9kZQotCQkJCS5wdXRJbnQoCi0JCQkJCQlJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTUlOSU1VTV9DSEFSQUNURVJTLAotCQkJCQkJLTEpOwotCi0gICAgICAgIC8vIERlZmF1bHQgZm9yIGNsb3NpbmcgZWRpdG9ycyBvbiBleGl0LgotICAgICAgICBub2RlLnB1dEJvb2xlYW4oSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuQ0xPU0VfRURJVE9SU19PTl9FWElULCBmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBEZWZhdWx0IGZvciB1c2luZyB3aW5kb3cgd29ya2luZyBzZXRzIAotICAgICAgICBub2RlLnB1dEJvb2xlYW4oSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuVVNFX1dJTkRPV19XT1JLSU5HX1NFVF9CWV9ERUZBVUxULCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gRGVmYXVsdCBmb3Igc2hvd2luZyBmaWx0ZXIgdGV4dCB3aWRnZXQgdGhhdCBkZXRlcm1pbmVzIHdoYXQgaXMgc2hvd24gaW4gYSBGaWx0ZXJlZFRyZWUKLSAgICAgICAgbm9kZS5wdXRCb29sZWFuKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLlNIT1dfRklMVEVSRURfVEVYVFMsIHRydWUpOwotICAgICAgICAKLSAgICAgICAgLy8gRGVmYXVsdCBmb3IgZW5hYmxpbmcgZGV0YWNoZWQgdmlld3MKLSAgICAgICAgbm9kZS5wdXRCb29sZWFuKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLkVOQUJMRV9ERVRBQ0hFRF9WSUVXUywgdHJ1ZSk7Ci0gICAgICAgIAotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHJvb3ROb2RlID0gKElFY2xpcHNlUHJlZmVyZW5jZXMpIFBsYXRmb3JtCi0JCQkJLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFJvb3ROb2RlKCkKLQkJCQkubm9kZShJbnN0YW5jZVNjb3BlLlNDT1BFKTsKLQotCQlmaW5hbCBTdHJpbmcgdWlOYW1lID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpCi0JCQkJLmdldFN5bWJvbGljTmFtZSgpOwotCQl0cnkgewotCQkJaWYgKHJvb3ROb2RlLm5vZGVFeGlzdHModWlOYW1lKSkKLQkJCQkoKElFY2xpcHNlUHJlZmVyZW5jZXMpIHJvb3ROb2RlLm5vZGUodWlOYW1lKSkuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKFBsYXRmb3JtVUlQcmVmZXJlbmNlTGlzdGVuZXIuZ2V0U2luZ2xldG9uKCkpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSxJU3RhdHVzLkVSUk9SLGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLGUpOwotCQkJVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQl9Ci0KLQkJcm9vdE5vZGUKLQkJCQkuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5ldyBJRWNsaXBzZVByZWZlcmVuY2VzLklOb2RlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXMuSU5vZGVDaGFuZ2VMaXN0ZW5lciNhZGRlZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlcy5Ob2RlQ2hhbmdlRXZlbnQpCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgdm9pZCBhZGRlZChOb2RlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWlmICghZXZlbnQuZ2V0Q2hpbGQoKS5uYW1lKCkuZXF1YWxzKHVpTmFtZSkpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJKChJRWNsaXBzZVByZWZlcmVuY2VzKSBldmVudC5nZXRDaGlsZCgpKQotCQkJCQkJCQkuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKFBsYXRmb3JtVUlQcmVmZXJlbmNlTGlzdGVuZXIuZ2V0U2luZ2xldG9uKCkpOwotCi0JCQkJCX0KLQotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzLklOb2RlQ2hhbmdlTGlzdGVuZXIjcmVtb3ZlZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlcy5Ob2RlQ2hhbmdlRXZlbnQpCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgdm9pZCByZW1vdmVkKE5vZGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJLy8gTm90aGluZyB0byBkbyBoZXJlCi0KLQkJCQkJfQotCi0JCQkJfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlYTg0Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlZGVhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotI1RodSBPY3QgMjAgMTE6Mzk6MzggRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIudGFza0Nhc2VTZW5zaXRpdmU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIudGFza1ByaW9yaXRpZXM9Tk9STUFMLEhJR0gsTk9STUFMCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci50YXNrVGFncz1UT0RPLEZJWE1FLFhYWAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9jb21tZW50cz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYTY4YjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUaHUgT2N0IDIwIDExOjM5OjM4IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249OAotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPXVzZXIKLW9yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCi1vcmcuZWNsaXBzZS5qZHQudWkuZ2V0dGVyc2V0dGVyLnVzZS5pcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO2NvbTsKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD05OQotb3JnLmVjbGlwc2UuamR0LnVpLm92ZXJyaWRlYW5ub3RhdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyY29tbWVudCIgbmFtZVw9ImdldHRlcmNvbW1lbnQiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgY29udGV4dFw9ImdldHRlcmNvbW1lbnRfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPi8qKlxyXG4gKiBAcmV0dXJuIFJldHVybnMgdGhlICR7YmFyZV9maWVsZF9uYW1lfS5cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmNvbW1lbnQiIG5hbWVcPSJzZXR0ZXJjb21tZW50IiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGNvbnRleHRcPSJzZXR0ZXJjb21tZW50X2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4vKipcclxuICogQHBhcmFtICR7cGFyYW19IFRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0LlxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50IiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBjb250ZXh0XD0iY29uc3RydWN0b3Jjb21tZW50X2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4vKipcclxuICogJHt0YWdzfVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBlbmFibGVkXD0idHJ1ZSIgZGVsZXRlZFw9ImZhbHNlIiBhdXRvaW5zZXJ0XD0idHJ1ZSI+LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogQ29weXJpZ2h0IChjKSAke3llYXJ9IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXHJcbiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxyXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxyXG4gKiBodHRwXDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcclxuICpcclxuICogQ29udHJpYnV0b3JzXDpcclxuICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMudHlwZWNvbW1lbnQiIG5hbWVcPSJ0eXBlY29tbWVudCIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIHR5cGVzIiBjb250ZXh0XD0idHlwZWNvbW1lbnRfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9ImZhbHNlIj4vKipcclxuICogQHNpbmNlIDMuMlxyXG4gKlxyXG4gKiAke3RhZ3N9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWVsZGNvbW1lbnQiIG5hbWVcPSJmaWVsZGNvbW1lbnQiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4vKipcclxuICogXHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBub24tb3ZlcnJpZGluZyBtZXRob2RzIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBlbmFibGVkXD0idHJ1ZSIgZGVsZXRlZFw9ImZhbHNlIiBhdXRvaW5zZXJ0XD0idHJ1ZSI+LyoqXHJcbiAqICR7dGFnc31cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGNvbnRleHRcPSJvdmVycmlkZWNvbW1lbnRfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPi8qIChub24tSmF2YWRvYylcclxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm5ld3R5cGUiIG5hbWVcPSJuZXd0eXBlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGNvbnRleHRcPSJuZXd0eXBlX2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4ke2ZpbGVjb21tZW50fVxyXG4ke3BhY2thZ2VfZGVjbGFyYXRpb259XHJcblxyXG4ke3R5cGVjb21tZW50fVxyXG4ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNhdGNoYmxvY2siIG5hbWVcPSJjYXRjaGJsb2NrIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcclxuJHtleGNlcHRpb25fdmFyfS5wcmludFN0YWNrVHJhY2UoKTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIG1ldGhvZCBzdHVicyIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcclxuJHtib2R5X3N0YXRlbWVudH08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5IiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgY29udGV4dFw9ImNvbnN0cnVjdG9yYm9keV9jb250ZXh0IiBlbmFibGVkXD0idHJ1ZSIgZGVsZXRlZFw9ImZhbHNlIiBhdXRvaW5zZXJ0XD0idHJ1ZSI+JHtib2R5X3N0YXRlbWVudH1cclxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5IiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBjb250ZXh0XD0iZ2V0dGVyYm9keV9jb250ZXh0IiBlbmFibGVkXD0idHJ1ZSIgZGVsZXRlZFw9ImZhbHNlIiBhdXRvaW5zZXJ0XD0idHJ1ZSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgY29udGV4dFw9InNldHRlcmJvZHlfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkMTIzZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1R1ZSBPY3QgMTggMTM6NDY6MzMgRURUIDIwMDUKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MAotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTEKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNDA4MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZwotQnVuZGxlLVZlcnNpb246IDMuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLmNvbXBvc2l0ZXRhYmxlLAotIG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLmNvbXBvc2l0ZXRhYmxlLnJlZmxlY3QsCi0gb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDlmYzM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLW91dHB1dC5kYXRhYmluZGluZ2V4YW1wbGVzLmphciA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5ZTcxNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBKRmFjZSBEYXRhIEJpbmRpbmcgRXhhbXBsZXMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvRXhhbXBsZUJpbmRpbmcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9FeGFtcGxlQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNjODcwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9FeGFtcGxlQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkJlYW5VcGRhdGFibGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkRhdGFCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklEYXRhQmluZGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuc3d0LlNXVFVwZGF0YWJsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2Vycy5WaWV3ZXJzVXBkYXRhYmxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIEFuIGV4YW1wbGUgYXBwbGljYXRpb24tbGV2ZWwgZGF0YSBiaW5kaW5nIGZhY3RvcnkgaW1wbGVtZW50YXRpb24uIFRoaXMgc2hvdWxkCi0gKiBiZSBjb3BpZWQgaW50byB5b3VyIGFwcGxpY2F0aW9uIGFuZCBiZSBtb2RpZmllZCB0byBpbmNsdWRlIHRoZSBzcGVjaWZpYwotICogdXBkYXRhYmxlIGZhY3RvcmllcyB5b3VyIGFwcGxpY2F0aW9uIG5lZWRzIGluIHRoZSBvcmRlciBpdCBuZWVkcyB0aGVtLgotICogPHA+Ci0gKiBOb3RlIHRoYXQgdGhlIHNlYXJjaCBvcmRlciBmb3IgSVVwZGF0YWJsZUZhY3RvcnkgaW1wbGVtZW50YXRpb25zIGlzIGxhc3QgdG8KLSAqIGZpcnN0LgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGFtcGxlQmluZGluZyB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZGF0YSBiaW5kaW5nIGNvbnRleHQgd2hvc2UgbGlmZWN5Y2xlIGlzIGJvdW5kIHRvIGFuIFNXVAotCSAqIGNvbnRyb2wsIGFuZCB3aGljaCBzdXBwb3J0cyBiaW5kaW5nIHRvIFNXVCBjb250cm9scywgSkZhY2Ugdmlld2VycywgYW5kCi0JICogUE9KTyBtb2RlbCBvYmplY3RzIHdpdGggSmF2YUJlYW5zLXN0eWxlIG5vdGlmaWNhdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZDsgaXRzIGltcGxlbWVudGF0aW9uIGlzIGVxdWl2YWxlbnQgdG8KLQkgKiBjYWxsaW5nIHtAbGluayBEYXRhQmluZGluZyNjcmVhdGVDb250ZXh0KENvbnRyb2wsIElVcGRhdGFibGVGYWN0b3J5W10pIH0KLQkgKiB3aGVyZSB0aGUgYXJyYXkgb2YgZmFjdG9yaWVzIGNvbnNpc3RzIG9mIGEge0BsaW5rIEJlYW5VcGRhdGFibGVGYWN0b3J5fQotCSAqIGluc3RhbmNlLCBhIHtAbGluayBTV1RVcGRhdGFibGVGYWN0b3J5fSwgYW5kIGEKLQkgKiB7QGxpbmsgVmlld2Vyc1VwZGF0YWJsZUZhY3Rvcnl9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEByZXR1cm4gYSBkYXRhIGJpbmRpbmcgY29udGV4dAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURhdGFCaW5kaW5nQ29udGV4dCBjcmVhdGVDb250ZXh0KENvbnRyb2wgY29udHJvbCkgewotCQlyZXR1cm4gRGF0YUJpbmRpbmcuY3JlYXRlQ29udGV4dChjb250cm9sLCBuZXcgSVVwZGF0YWJsZUZhY3RvcnlbXSB7Ci0JCQkJbmV3IEJlYW5VcGRhdGFibGVGYWN0b3J5KCksIG5ldyBTV1RVcGRhdGFibGVGYWN0b3J5KCksCi0JCQkJbmV3IFZpZXdlcnNVcGRhdGFibGVGYWN0b3J5KCkgfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRhdGEgYmluZGluZyBjb250ZXh0IHdoaWNoIHN1cHBvcnRzIGJpbmRpbmcgdG8gU1dUIGNvbnRyb2xzLAotCSAqIEpGYWNlIHZpZXdlcnMsIGFuZCBQT0pPIG1vZGVsIG9iamVjdHMgd2l0aCBKYXZhQmVhbnMtc3R5bGUgbm90aWZpY2F0aW9uLgotCSAqIFRoaXMgZGF0YSBiaW5kaW5nIGNvbnRleHQncyBsaWZlIGN5Y2xlIGlzIG5vdCBib3VuZCB0byB0aGUgZGlzcG9zZSBldmVudAotCSAqIG9mIGFueSBTV1QgY29udHJvbC4gQ29uc2VxdWVudGx5LCB0aGUgcHJvZ3JhbW1lciBpcyByZXNwb25zaWJsZSB0bwotCSAqIG1hbnVhbGx5IGRpc3Bvc2UgYW55IElVcGRhdGFibGVzIGNyZWF0ZWQgdXNpbmcgdGhpcyBkYXRhIGJpbmRpbmcgY29udGV4dAotCSAqIGFzIG5lY2Vzc2FyeS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZDsgaXRzIGltcGxlbWVudGF0aW9uIGlzIGVxdWl2YWxlbnQgdG8KLQkgKiBjYWxsaW5nIHtAbGluayBEYXRhQmluZGluZyNjcmVhdGVDb250ZXh0KENvbnRyb2wsIElVcGRhdGFibGVGYWN0b3J5W10pIH0KLQkgKiB3aGVyZSB0aGUgYXJyYXkgb2YgZmFjdG9yaWVzIGNvbnNpc3RzIG9mIGEge0BsaW5rIEJlYW5VcGRhdGFibGVGYWN0b3J5fQotCSAqIGluc3RhbmNlLCBhIHtAbGluayBTV1RVcGRhdGFibGVGYWN0b3J5fSwgYW5kIGEKLQkgKiB7QGxpbmsgVmlld2Vyc1VwZGF0YWJsZUZhY3Rvcnl9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgZGF0YSBiaW5kaW5nIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElEYXRhQmluZGluZ0NvbnRleHQgY3JlYXRlQ29udGV4dCgpIHsKLQkJcmV0dXJuIERhdGFCaW5kaW5nLmNyZWF0ZUNvbnRleHQobmV3IElVcGRhdGFibGVGYWN0b3J5W10gewotCQkJCW5ldyBCZWFuVXBkYXRhYmxlRmFjdG9yeSgpLCBuZXcgU1dUVXBkYXRhYmxlRmFjdG9yeSgpLAotCQkJCW5ldyBWaWV3ZXJzVXBkYXRhYmxlRmFjdG9yeSgpIH0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS9Db21wb3NpdGVUYWJsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL0NvbXBvc2l0ZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOGQ4NTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL0NvbXBvc2l0ZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBEYXZpZCBPcm1lIDxkam9AY29jb251dC1wYWxtLXNvZnR3YXJlLmNvbT4KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgT3JtZSAgICAgICAgICAgICAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQ29jb251dCBQYWxtIFNvZnR3YXJlLCBJbmMuIC0gQVBJIGNsZWFudXAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5jb21wb3NpdGV0YWJsZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotCi0KLS8qKgotICogQ2xhc3MgQ29tcG9zaXRlVGFibGUuICBuLiAgKDEpIEFuIFNXVCB2aXJ0dWFsIHRhYmxlIGNvbnRyb2wgdGhhdCBleHRlbmRzIENvbXBvc2l0ZS4gIAotICogKDIpIEFuIFNXVCB2aXJ0dWFsIHRhYmxlIGNvbnRyb2wgdGhhdCBpcyBjb21wb3NlZCBvZiBtYW55IENvbXBvc2l0ZXMsIGVhY2ggcmVwcmVzZW50aW5nIAotICogYSBoZWFkZXIgb3IgYSByb3csIG9uZSBiZWxvdyB0aGUgb3RoZXIuPHA+Ci0gKiAKLSAqIENvbXBvc2l0ZVRhYmxlIGlzIGRlc2lnbmVkIHNwZWNpZmljYWxseSB0byB3b3JrIG5pY2VseSBpbiB0aGUgRWNsaXBzZSBWaXN1YWwgRWRpdG9yLAotICogYnV0IGl0IGlzIGVxdWFsbHkgZWFzeSB0byB1c2UgaW4gaGFuZC1jb2RlZCBsYXlvdXRzLjxwPgotICogCi0gKiA8Yj5TeW5vcHNpczo8L2I+PHA+Ci0gKiAKLSAqIEluIG9yZGVyIHRvIGVkaXQgYW55dGhpbmcsIG9uZSBtdXN0OjxwPgotICogCi0gKiA8dWw+Ci0gKiA8bGk+RXh0ZW5kIENvbXBvc2l0ZSBvciBDYW52YXMgYW5kIGNyZWF0ZSBhbiBvYmplY3QgdGhhdCBjYW4gYmUgZHVwbGljYXRlZCB0byAKLSAqIHJlcHJlc2VudCB0aGUgcm93cyBpbiB5b3VyIHRhYmxlLgotICogPGxpPk9wdGlvbmFsbHksIGV4dGVuZCBDb21wb3NpdGUgb3IgQ2FudmFzIGFuZCBjcmVhdGUgYSBoZWFkZXIgb2JqZWN0IGluIHRoZQotICogc2FtZSB3YXkuCi0gKiA8bGk+SWYgdGhlIGNhbnZhcyBhbmQgcm93IG9iamVjdHMgZG8gbm90IGhhdmUgYSBsYXlvdXQgbWFuYWdlciwgdGhlIENvbXBvc2l0ZVRhYmxlIAotICogd2lsbCBhdXRvbWF0aWNhbGx5IHN1cHBseSBvbmUgdGhhdCBsYXlzIG91dCBjaGlsZCBjb250cm9scyBpbiBhIHZpc3VhbCB0YWJsZS4gIElmCi0gKiB0aGV5IGhhdmUgYSBsYXlvdXQgbWFuYWdlciwgQ29tcG9zaXRlVGFibGUgd2lsbCBsZXQgdGhlbSB1c2UgdGhhdC4KLSAqIDxsaT5DcmVhdGUgYSBDb21wb3NpdGVUYWJsZSBvYmplY3QsIGVpdGhlciB1c2luZyBWRSBvciB1c2luZyBoYW5kLWNvZGVkIFNXVC4KLSAqIDxsaT5Ecm9wIHRoZSBoZWFkZXIgKGlmIGFwcGxpY2FibGUpLCB0aGVuIHRoZSByb3cgb2JqZWN0IG9uIHRoZSBDb21wb3NpdGVUYWJsZSBvcgotICogc2ltcGx5IHdyaXRlIGNvZGUgdGhhdCBjcmVhdGVzIGluc3RhbmNlcyBvZiB0aGVzZSBvYmplY3RzIGluIHRoYXQgb3JkZXIgYXMgY2hpbGQKLSAqIGNvbnRyb2xzIG9mIHlvdXIgQ29tcG9zaXRlVGFibGUuCi0gKiA8bGk+U2V0IHRoZSBSdW5UaW1lIHByb3BlcnR5IHRvICJ0cnVlIi4gIFlvdXIgY29udHJvbCBpcyBub3cgImxpdmUuIgotICogPGxpPkFkZCBhIFJvd0NvbnN0cnVjdGlvbkxpc3RlbmVyIGlmIHlvdSBuZWVkIHRvIGFkZCBldmVudCBoYW5kbGVycyB0byBpbmRpdmlkdWFsIHJvdyAKLSAqIGNvbnRyb2xzIHdoZW4gYSByb3cgaXMgY3JlYXRlZC4KLSAqIDxsaT5BZGQgYSBSb3dDb250ZW50UHJvdmlkZXIgdGhhdCBrbm93cyBob3cgdG8gcHV0IGRhdGEgaW50byB5b3VyIHJvdyBvYmplY3QncyAKLSAqIGNvbnRyb2xzIG9uIGRlbWFuZC4KLSAqIDxsaT5BZGQgYSBSb3dGb2N1c0xpc3RlbmVyIHRvIHZhbGlkYXRlIGFuZCBzYXZlIGNoYW5nZWQgZGF0YS4KLSAqIDxsaT5TZXQgdGhlIE51bVJvd3NJbkNvbGxlY3Rpb24gcHJvcGVydHkgdG8gdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB1bmRlcmx5aW5nIGRhdGEKLSAqIHN0cnVjdHVyZS4KLSAqIDwvdWw+Ci0gKgotICogRGV0YWlsZWQgZGVzY3JpcHRpb246PHA+Ci0gKiAKLSAqIFRoaXMgY29udHJvbCBpcyBkZXNpZ25lZCB0byB3b3JrIGluc2lkZSBvZiB0aGUgRWNsaXBzZSBWaXN1YWwgRWRpdG9yLiAgVG8gdXNlIGl0LAotICogZHJvcCBvbmUgb24gdGhlIGRlc2lnbiBzdXJmYWNlLiAgKEV2ZW4gdGhvdWdoIGl0IGV4dGVuZHMgQ2FudmFzLCBpdCBkb2VzIG5vdCBtYWtlCi0gKiBzZW5zZSB0byBwdXQgYSBsYXlvdXQgbWFuYWdlciBvbiBpdC4pPHA+Ci0gKiAKLSAqIE5leHQgY3JlYXRlIG9uZSBvciB0d28gbmV3IGN1c3RvbSBjb250cm9scyBieSB1c2luZyB0aGUgVmlzdWFsIEVkaXRvciB0byBleHRlbmQKLSAqIENvbXBvc2l0ZS4gIElmIHlvdSBjcmVhdGUgb25lIGN1c3RvbSBjb250cm9sLCBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIHByb3RvdHlwZQotICogZm9yIGFsbCByb3dzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLiAgSWYgeW91IGNyZWF0ZSB0d28sIHRoZSBmaXJzdAotICogb25lIHdpbGwgYmUgdXNlZCBhcyBhIHByb3RvdHlwZSBmb3IgdGhlIGhlYWRlciBhbmQgdGhlIHNlY29uZCBvbmUgd2lsbCBiZSB1c2VkIAotICogYXMgYSBwcm90b3R5cGUgZm9yIHRoZSByb3dzLjxwPgotICogCi0gKiBJZiB0aGVzZSBjdXN0b20gY29udHJvbHMgYXJlIG5vdCBnaXZlbiBsYXlvdXQgbWFuYWdlcnMgKG51bGwgbGF5b3V0KSwgdGhlbiAKLSAqIENvbXBvc2l0ZVRhYmxlIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhpcyBzaXR1YXRpb24gYW5kIHdpbGwgc3VwcGx5IGl0cyBvd24KLSAqIGxheW91dCBtYW5hZ2VyIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5IGxheSBvdXQgdGhlIGNoaWxkcmVuIG9mIHRoZXNlIGNvbnRyb2xzIGluIAotICogY29sdW1ucyB0byBmb3JtIGEgdGFibGUuICBIb3dldmVyLCBpZiB5b3Ugc3VwcGx5IGxheW91dCBtYW5hZ2VycyBmb3IgeW91ciBoZWFkZXIgCi0gKiBwcm90b3R5cGUgYW5kIHJvdyBwcm90b3R5cGUgb2JqZWN0cywgQ29tcG9zaXRlVGFibGUgd2lsbCByZXNwZWN0IHlvdXIgY2hvaWNlLgotICogSWYgeW91IHVzZSBDb21wb3NpdGVUYWJsZSdzIGJ1aWx0LWluIGxheW91dCBtYW5hZ2VyLCB0aGVuIHRoZSB3ZWlnaHRzIHByb3BlcnR5Ci0gKiB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgd2lkdGggd2lsbCBiZSBhbGxvY2F0ZWQKLSAqIHRvIGVhY2ggY29sdW1uLiAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9yIGlmIHRoZSBzdW0gb2YgdGhlaXIgZWxlbWVudHMKLSAqIGRvZXMgbm90IGVxdWFsIDEwMCwgdGhlIGNvbHVtbnMgYXJlIGNyZWF0ZWQgYXMgZXF1YWwgc2l6ZXMuPHA+Ci0gKiAKLSAqIE9uY2UgeW91IGhhdmUgY3JlYXRlZCB5b3VyIChvcHRpb25hbCkgSGVhZGVyIGFuZCBSb3cgY3VzdG9tIGNvbnRyb2xzLCBzaW1wbHkgZHJvcAotICogdGhlbSBvbnRvIHlvdXIgQ29tcG9zaXRlVGFibGUgY29udHJvbCBpbiBWRS4gIFRoZSBmaXJzdCBvZiB0aGVzZSB0d28gY3VzdG9tCi0gKiBjb250cm9scyB0byBiZSBpbnN0YW50aWF0ZWQgaW4geW91ciBjb2RlIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIENvbXBvc2l0ZVRhYmxlCi0gKiBhcyB0aGUgaGVhZGVyIGNvbnRyb2wgYW5kIHRoZSBzZWNvbmQgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyB0aGUgcm93IGNvbnRyb2wuPHA+Ci0gKiAKLSAqIE5vdyB0aGF0IHlvdSBoYXZlIGRlZmluZWQgdGhlIChvcHRpb25hbCkgaGVhZGVyIGFuZCByb3csIHlvdSBjYW4gc3dpdGNoIHlvdXIgCi0gKiBDb21wb3NpdGVUYWJsZSBpbnRvIHJ1biBtb2RlIGFuZCB1c2UgaXQuICBUaGlzIGlzIGRvbmUgYnkgc3dpdGNoaW5nIHRoZSBSdW5UaW1lIAotICogcHJvcGVydHkgdG8gdHJ1ZS48cD4KLSAqIAotICogT25jZSBpbiBydW4gbW9kZSwgYWxsIG9mIHRoZSBDb21wb3NpdGVUYWJsZSdzIHByb3BlcnRpZXMgd2lsbCBiZSBhY3RpdmUuICBJbiBvcmRlcgotICogdG8gdXNlIGl0LCBzZXQgdGhlIE51bVJvd3NJbkNvbGxlY3Rpb24gcHJvcGVydHkgdG8gdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSAKLSAqIGNvbGxlY3Rpb24geW91IHdhbnQgdG8gZGlzcGxheS4gIEFuZCBhZGQgYSBSZWZyZXNoQ29udGVudFByb3ZpZGVyLCB3aGljaCB3aWxsCi0gKiBiZSBjYWxsZWQgd2hlbmV2ZXIgQ29tcG9zaXRlVGFibGUgbmVlZHMgdG8gcmVmcmVzaCBhIHBhcnRpY3VsYXIgcm93LjxwPgotICogCi0gKiBQbGVhc2UgcmVmZXIgdG8gdGhlIHJlbWFpbmRlciBvZiB0aGUgSmF2YURvYyBmb3IgaW5mb3JtYXRpb24gb24gdGhlIHJlbWFpbmluZwotICogcHJvcGVydGllcyBhbmQgZXZlbnRzLjxwPgotICogCi0gKiBBbHRob3VnaCB0aGlzIGNvbnRyb2wgZXh0ZW5kcyBDb21wb3NpdGUsIGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkCi0gKiBleGNlcHQgd2l0aGluIGl0cyBvd24gaW1wbGVtZW50YXRpb24gYW5kIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHNldCBhIGxheW91dCAKLSAqIG1hbmFnZXIgb24gaXQgKGFsdGhvdWdoIGFzIGRpc2N1c3NlZCBhYm92ZSwgdGhlIGNoaWxkIGNvbnRyb2xzIG1heSBoYXZlIGxheW91dAotICogbWFuYWdlcnMpLgotICogCi0gKiBAYXV0aG9yIGRqbwotICogQHNpbmNlIDMuMgotICogVE9ETzogZWxpbWluYXRlIGZsaWNrZXIgd2hlbiBzY3JvbGxpbmcgYmFja3dhcmRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVUYWJsZSBleHRlbmRzIENhbnZhcyB7Ci0JCi0JLy8gUHJvcGVydHkgZmllbGRzIGhlcmUKLQlwcml2YXRlIGJvb2xlYW4gcnVuVGltZSA9IGZhbHNlOwotCQotCXByaXZhdGUgaW50W10gd2VpZ2h0cyA9IG5ldyBpbnRbMF07Ci0JCi0JcHJpdmF0ZSBpbnQgbnVtUm93c0luQ29sbGVjdGlvbiA9IDA7Ci0JcHJpdmF0ZSBpbnQgbWF4Um93c1Zpc2libGUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkKLQkvLyBQcml2YXRlIGZpZWxkcyBoZXJlCi0JcHJpdmF0ZSBDb25zdHJ1Y3RvciBoZWFkZXJDb25zdHJ1Y3RvciA9IG51bGw7Ci0JcHJpdmF0ZSBDb250cm9sIGhlYWRlckNvbnRyb2wgPSBudWxsOwotCXByaXZhdGUgQ29uc3RydWN0b3Igcm93Q29uc3RydWN0b3IgPSBudWxsOwotCXByaXZhdGUgQ29udHJvbCByb3dDb250cm9sID0gbnVsbDsKLQkKLQlwcml2YXRlIEludGVybmFsQ29tcG9zaXRlVGFibGUgY29udGVudFBhbmUgPSBudWxsOwotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIENvbXBvc2l0ZVRhYmxlLiAgQ29uc3RydWN0IGEgQ29tcG9zaXRlVGFibGUgY29udHJvbC4gIENvbXBvc2l0ZVRhYmxlCi0JICogYWNjZXB0cyB0aGUgc2FtZSBzdHlsZSBiaXRzIGFzIHRoZSBTV1QgQ2FudmFzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIFNXVCBwYXJlbnQgY29udHJvbC4KLQkgKiBAcGFyYW0gc3R5bGUgU3R5bGUgYml0cy4gIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyBDYW52YXMKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlzZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJc2V0TGF5b3V0KG5ldyBMYXlvdXQoKSB7Ci0JCQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkJCWlmIChoZWFkZXJDb250cm9sID09IG51bGwgJiYgcm93Q29udHJvbCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgUG9pbnQoMiwgMjApOwotCQkJCX0KLQkJCQlQb2ludCBoZWFkZXJTaXplID0gbmV3IFBvaW50KDAsIDApOwotCQkJCWlmIChoZWFkZXJDb250cm9sICE9IG51bGwpIHsKLQkJCQkJaGVhZGVyU2l6ZSA9IGhlYWRlckNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQl9Ci0JCQkJUG9pbnQgcm93U2l6ZSA9IG5ldyBQb2ludCgwLCAwKTsKLQkJCQlpZiAocm93Q29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCXJvd1NpemUgPSByb3dDb250cm9sLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJfQotCQkJCVBvaW50IHJlc3VsdCA9IG5ldyBQb2ludChNYXRoLm1heChoZWFkZXJTaXplLngsIHJvd1NpemUueCksIGhlYWRlclNpemUueSArIHJvd1NpemUueSk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJCQlyZXNpemUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wjc2V0QmFja2dyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBjb2xvcikgewotCQlzdXBlci5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQYW5lLnNldEJhY2tncm91bmQoY29sb3IpOwotCQl9Ci0JfQotCQkKLQlwcml2YXRlIGludCBudW1DaGlsZHJlbkxhc3RUaW1lID0gMDsKLQkKLQkvKiogKG5vbi1BUEkpCi0JICogTWV0aG9kIHJlc2l6ZS4gIFJlc2l6ZSB0aGlzIHRhYmxlJ3MgY29udGVudHMuICBDYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGN1c3RvbSAKLQkgKiBsYXlvdXQgbWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZXNpemUoKSB7Ci0JCWlmIChpc1J1blRpbWUoKSkgewotCQkJaW50IGNoaWxkcmVuTGVuZ3RoID0gZ2V0Q2hpbGRyZW4oKS5sZW5ndGg7Ci0JCQlpZiAobnVtQ2hpbGRyZW5MYXN0VGltZSAhPSBjaGlsZHJlbkxlbmd0aCkgewotCQkJCXJlc2l6ZUFuZFJlY29yZFByb3RvdHlwZVJvd3MoKTsKLQkJCQlzaG93UHJvdG90eXBlcyhmYWxzZSk7Ci0JCQkJY29udGVudFBhbmUuZGlzcG9zZSgpOwotCQkJCWNvbnRlbnRQYW5lID0gbmV3IEludGVybmFsQ29tcG9zaXRlVGFibGUodGhpcywgU1dULk5VTEwpOwotCQkJfQotCQkJdXBkYXRlVmlzaWJsZVJvd3MoKTsKLQkJfSBlbHNlIHsKLQkJCXJlc2l6ZUFuZFJlY29yZFByb3RvdHlwZVJvd3MoKTsKLQkJfQotCX0KLQotCS8qKiAobm9uLUFQSSkKLQkgKiBNZXRob2QgdXBkYXRlVmlzaWJsZVJvd3MuICBNYWtlcyBzdXJlIHRoYXQgdGhlIGNvbnRlbnQgcGFuZSBpcyBkaXNwbGF5aW5nIHRoZSBjb3JyZWN0Ci0JICogbnVtYmVyIG9mIHZpc2libGUgcm93cyBnaXZlbiB0aGUgY29udHJvbCdzIHNpemUuICBDYWxsZWQgZnJvbSB3aXRoaW4gI3Jlc2l6ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWaXNpYmxlUm93cygpIHsKLQkJaWYgKGNvbnRlbnRQYW5lID09IG51bGwpIHsKLQkJCXN3aXRjaFRvUnVuTW9kZSgpOwotCQl9Ci0JCVBvaW50IHNpemUgPSBnZXRTaXplKCk7Ci0JCWNvbnRlbnRQYW5lLnNldEJvdW5kcygwLCAwLCBzaXplLngsIHNpemUueSk7Ci0JfQotCi0JLyoqCi0JICogU3dpdGNoIGZyb20gZGVzaWduIG1vZGUgd2hlcmUgcHJvdG90eXBlIGhlYWRlci9yb3cgb2JqZWN0cyBjYW4gYmUgZHJvcHBlZCBvbiB0aGUgCi0JICogY29udHJvbCBpbnRvIHJ1biBtb2RlIHdoZXJlIGFsbCBvZiB0aGUgcHJvcGVydGllcyBkbyB3aGF0IHlvdSB3b3VsZCBleHBlY3QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN3aXRjaFRvUnVuTW9kZSgpIHsKLQkJc2hvd1Byb3RvdHlwZXMoZmFsc2UpOwotCQljb250ZW50UGFuZSA9IG5ldyBJbnRlcm5hbENvbXBvc2l0ZVRhYmxlKHRoaXMsIFNXVC5OVUxMKTsKLQl9Ci0JCi0JLyoqCi0JICogU3dpdGNoIGJhY2sgdG8gZGVzaWduIG1vZGUgc28gdGhhdCB0aGUgcHJvdG90eXBlIGhlYWRlci9yb3cgb2JqZWN0cyBtYXkgYmUgbWFuaXB1bGF0ZWQKLQkgKiBkaXJlY3RseSBpbiBhIEdVSSBkZXNpZ24gdG9vbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3dpdGNoVG9EZXNpZ25Nb2RlKCl7Ci0JCWNvbnRlbnRQYW5lLmRpc3Bvc2UoKTsKLQkJY29udGVudFBhbmUgPSBudWxsOwotCQlzaG93UHJvdG90eXBlcyh0cnVlKTsKLQkJcmVzaXplQW5kUmVjb3JkUHJvdG90eXBlUm93cygpOwotCX0KLQotCS8qKgotCSAqIFR1cm5zIGRpc3BsYXkgb2YgdGhlIHByb3RvdHlwZSBvYmplY3RzIG9uIG9yIG9mZi4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUgdHJ1ZSBvZiB0aGUgcHJvdG90eXBlIG9iamVjdHMgc2hvdWxkIGJlIGRpc3BsYXllZDsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgdm9pZCBzaG93UHJvdG90eXBlcyhib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWlmIChoZWFkZXJDb250cm9sICE9IG51bGwpIHsKLQkJCWhlYWRlckNvbnRyb2wuc2V0VmlzaWJsZShuZXdWYWx1ZSk7Ci0JCX0KLQkJaWYgKHJvd0NvbnRyb2wgIT0gbnVsbCkgewotCQkJcm93Q29udHJvbC5zZXRWaXNpYmxlKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIChub24tQVBJKSBNZXRob2QgcmVzaXplQW5kUmVjb3JkUHJvdG90eXBlUm93cy4gRmlndXJlIG91dCB3aGF0IGNoaWxkCi0JICogY29udHJvbHMgYXJlIHRoZSBoZWFkZXIgYW5kIHJvdyBwcm90b3R5cGUgcm93cyByZXNwZWN0aXZlbHkgYW5kIHJlc2l6ZQotCSAqIHRoZW0gc28gdGhleSBvY2N1cHkgdGhlIGVudGlyZSB3aWR0aCBhbmQgdGhlaXIgcHJlZmVycmVkIGhlaWdodC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNpemVBbmRSZWNvcmRQcm90b3R5cGVSb3dzKCkgewotCQlDb250cm9sW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlBcnJheUxpc3QgcmVhbENoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb250cm9sW10gZmluYWxDaGlsZHJlbiA9IGNoaWxkcmVuOwotCQkKLQkJLy8gRmluZCBmaXJzdCB0d28gcHJvdG90eXBlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBJbnRlcm5hbENvbXBvc2l0ZVRhYmxlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAocmVhbENoaWxkcmVuLnNpemUoKSA8IDIpIHsKLQkJCQlyZWFsQ2hpbGRyZW4uYWRkKGNoaWxkcmVuW2ldKTsKLQkJCX0KLQkJfQotCQlmaW5hbENoaWxkcmVuID0gKENvbnRyb2xbXSkgcmVhbENoaWxkcmVuLnRvQXJyYXkobmV3IENvbnRyb2xbcmVhbENoaWxkcmVuLnNpemUoKV0pOwotCQkKLQkJaWYgKGZpbmFsQ2hpbGRyZW4ubGVuZ3RoID09IDApIHsKLQkJCWhlYWRlckNvbnN0cnVjdG9yID0gbnVsbDsKLQkJCWhlYWRlckNvbnRyb2wgPSBudWxsOwotCQkJcm93Q29uc3RydWN0b3IgPSBudWxsOwotCQkJcm93Q29udHJvbCA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBHZXQgYSBjb25zdHJ1Y3RvciBmb3IgdGhlIGhlYWRlciBhbmQvb3IgdGhlIHJvdyBwcm90b3R5cGUKLQkJaGVhZGVyQ29uc3RydWN0b3IgPSBudWxsOwotCQloZWFkZXJDb250cm9sID0gbnVsbDsKLQkJcm93Q29uc3RydWN0b3IgPSBudWxsOwotCQlyb3dDb250cm9sID0gbnVsbDsKLQkJCi0JCWlmIChmaW5hbENoaWxkcmVuLmxlbmd0aCA9PSAxKSB7Ci0JCQl0cnkgewotCQkJCXJvd0NvbnRyb2wgPSAoQ29tcG9zaXRlKSBmaW5hbENoaWxkcmVuWzBdOwotCQkJCXJvd0NvbnN0cnVjdG9yID0gZmluYWxDaGlsZHJlblswXS5nZXRDbGFzcygpLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtDb21wb3NpdGUuY2xhc3MsIEludGVnZXIuVFlQRX0pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaGVhZGVyQ29uc3RydWN0b3IgPSBmaW5hbENoaWxkcmVuWzBdLmdldENsYXNzKCkuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge0NvbXBvc2l0ZS5jbGFzcywgSW50ZWdlci5UWVBFfSk7Ci0JCQkJaGVhZGVyQ29udHJvbCA9IGZpbmFsQ2hpbGRyZW5bMF07Ci0JCQkJcm93Q29uc3RydWN0b3IgPSBmaW5hbENoaWxkcmVuWzFdLmdldENsYXNzKCkuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge0NvbXBvc2l0ZS5jbGFzcywgSW50ZWdlci5UWVBFfSk7Ci0JCQkJcm93Q29udHJvbCA9IGZpbmFsQ2hpbGRyZW5bMV07Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCQotCQkvLyBOb3cgYWN0dWFsbHkgcmVzaXplIHRoZSBjaGlsZHJlbgotCQlpbnQgdG9wPTA7Ci0JCWludCB3aWR0aCA9IGdldFNpemUoKS54OwotCQlmb3IgKGludCBpPTA7IGkgPCBmaW5hbENoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0JCQlpbnQgaGVpZ2h0ID0gNTA7Ci0JCQlpZiAoZmluYWxDaGlsZHJlbltpXSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJCUNvbXBvc2l0ZSBjaGlsZCA9IChDb21wb3NpdGUpIGZpbmFsQ2hpbGRyZW5baV07Ci0JCQkJaWYgKGNoaWxkLmdldExheW91dCgpID09IG51bGwpIHsKLQkJCQkJaGVpZ2h0ID0gbGF5b3V0SGVhZGVyT3JSb3coY2hpbGQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWhlaWdodCA9IGZpbmFsQ2hpbGRyZW5baV0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaGVpZ2h0ID0gZmluYWxDaGlsZHJlbltpXS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnk7Ci0JCQl9Ci0JCQkKLQkJCWZpbmFsQ2hpbGRyZW5baV0uc2V0Qm91bmRzKDAsIHRvcCwgd2lkdGgsIGhlaWdodCk7Ci0JCQl0b3AgKz0gaGVpZ2h0OwotCQl9Ci0JCQotCQludW1DaGlsZHJlbkxhc3RUaW1lID0gY2hpbGRyZW4ubGVuZ3RoOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKihub24tQVBJKQotCSAqIE1ldGhvZCBsYXlvdXRIZWFkZXJPclJvdy4gIElmIGEgaGVhZGVyIG9yIHJvdyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIGxheW91dCBtYW5hZ2VyLCB0aGlzCi0JICogbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBiZSBjYWxsZWQgdG8gbGF5b3V0IHRoZSBjaGlsZCBjb250cm9scyBvZiB0aGF0IGhlYWRlciBvciByb3cKLQkgKiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGNoaWxkIFRoZSBjaGlsZCBvYmplY3QgdG8gbGF5b3V0LgotCSAqIEByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgaGVhZGVyIG9yIHJvdwotCSAqLwotCWludCBsYXlvdXRIZWFkZXJPclJvdyhDb21wb3NpdGUgY2hpbGQpIHsKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY2hpbGQuZ2V0Q2hpbGRyZW4oKTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gNTA7Ci0JCX0KLQkJaW50W10gd2VpZ2h0cyA9IHRoaXMud2VpZ2h0czsKLQkJd2VpZ2h0cyA9IGNoZWNrV2VpZ2h0cyh3ZWlnaHRzLCBjaGlsZHJlbi5sZW5ndGgpOwotCQkKLQkJaW50IG1heEhlaWdodCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWludCBoZWlnaHQgPSBjaGlsZHJlbltpXS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLnk7Ci0JCQlpZiAobWF4SGVpZ2h0IDwgaGVpZ2h0KSB7Ci0JCQkJbWF4SGVpZ2h0ID0gaGVpZ2h0OwotCQkJfQotCQl9Ci0JCSsrbWF4SGVpZ2h0OwotCQkKLQkJaW50IHdpZHRoUmVtYWluaW5nID0gY2hpbGQuZ2V0UGFyZW50KCkuZ2V0U2l6ZSgpLng7Ci0JCWludCB0b3RhbFNpemUgPSB3aWR0aFJlbWFpbmluZzsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGgtMTsgaSsrKSB7Ci0JCQlpbnQgbGVmdCA9IHRvdGFsU2l6ZSAtIHdpZHRoUmVtYWluaW5nOwotCQkJaW50IGRlc2lyZWRIZWlnaHQgPSBjaGlsZHJlbltpXS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKS55OwotCQkJaW50IHRvcCA9IG1heEhlaWdodCAtIGRlc2lyZWRIZWlnaHQtMTsKLQkJCWludCB3aWR0aCA9IChpbnQpKCgoZmxvYXQpd2VpZ2h0c1tpXSkvMTAwICogdG90YWxTaXplKTsKLQkJCWNoaWxkcmVuW2ldLnNldEJvdW5kcyhsZWZ0KzIsIHRvcCwgd2lkdGgtNCwgZGVzaXJlZEhlaWdodCk7Ci0JCQl3aWR0aFJlbWFpbmluZyAtPSB3aWR0aDsKLQkJfQotCQkKLQkJaW50IGxlZnQgPSB0b3RhbFNpemUgLSB3aWR0aFJlbWFpbmluZzsKLQkJaW50IGRlc2lyZWRIZWlnaHQgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGgtMV0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSkueTsKLQkJaW50IHRvcCA9IG1heEhlaWdodCAtIGRlc2lyZWRIZWlnaHQtMTsKLQkJY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoLTFdLnNldEJvdW5kcyhsZWZ0KzIsIHRvcCwgd2lkdGhSZW1haW5pbmctNCwgZGVzaXJlZEhlaWdodCk7Ci0JCQotCQlyZXR1cm4gbWF4SGVpZ2h0OwotCX0KLQotCS8qKgotCSAqIENvbXB1dGUgYW5kIHJldHVybiBhIHdlaWdodHMgYXJyYXkgd2hlcmUgZWFjaCB3ZWlnaHQgaXMgdGhlIHBlcmNlbnRhZ2UgdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBjb2x1bW4gc2hvdWxkIG9jY3VweSBvZiB0aGUgZW50aXJlIGNvbnRyb2wgd2lkdGguICBJZiB0aGUgZWxlbWVudHMgaW4gdGhlIHN1cHBsaWVkIHdlaWdodHMgCi0JICogYXJyYXkgYWRkIHVwIHRvIDEwMCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zLCB0aGUKLQkgKiBzdXBwbGllZCB3ZWlnaHRzIGFycmF5IGlzIHVzZWQuICBPdGhlcndpc2UsIHRoaXMgbWV0aG9kIGNvbXB1dGVzIGFuZCByZXR1cm5zIGEgd2VpZ2h0cyAKLQkgKiBhcnJheSB0aGF0IG1ha2VzIGVhY2ggY29sdW1uIGFuIGVxdWFsIHNpemUuIAotCSAqIAotCSAqIEBwYXJhbSB3ZWlnaHRzIFRoZSBkZWZhdWx0IG9yIHVzZXItc3VwcGxpZWQgd2VpZ2h0cyBhcnJheS4KLQkgKiBAcGFyYW0gbnVtQ2hpbGRyZW4gVGhlIG51bWJlciBvZiBjaGlsZCBjb250cm9scy4KLQkgKiBAcmV0dXJuIFRoZSB3ZWlnaHRzIGFycmF5IHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsYXlvdXQgbWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIGludFtdIGNoZWNrV2VpZ2h0cyhpbnRbXSB3ZWlnaHRzLCBpbnQgbnVtQ2hpbGRyZW4pIHsKLQkJaWYgKHdlaWdodHMubGVuZ3RoID09IG51bUNoaWxkcmVuKSB7Ci0JCQlpbnQgc3VtID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2VpZ2h0cy5sZW5ndGg7IGkrKykgewotCQkJCXN1bSArPSB3ZWlnaHRzW2ldOwotCQkJfQotCQkJaWYgKHN1bSA9PSAxMDApIHsKLQkJCQlyZXR1cm4gd2VpZ2h0czsKLQkJCX0KLQkJfQotCQkKLQkJLy8gRWl0aGVyIHRoZSBudW1iZXIgb2Ygd2VpZ2h0cyBkb2Vzbid0IG1hdGNoIG9yIHRoZXkgZG9uJ3QgYWRkIHVwLgotCQkvLyBDb21wdXRlIHNvbWV0aGluZyBzYW5lIGFuZCByZXR1cm4gdGhhdCBpbnN0ZWFkLgotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W251bUNoaWxkcmVuXTsKLQkJaW50IHdlaWdodCA9IDEwMCAvIG51bUNoaWxkcmVuOwotCQlpbnQgZXh0cmEgPSAxMDAgJSBudW1DaGlsZHJlbjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoLTE7IGkrKykgewotCQkJcmVzdWx0W2ldID0gd2VpZ2h0OwotCQl9Ci0JCXJlc3VsdFtudW1DaGlsZHJlbi0xXSA9IHdlaWdodCArIGV4dHJhOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBpc1J1blRpbWUuICBSZXR1cm5zIGlmIHRoZSBDb21wb3NpdGVUYWJsZSBpcyBpbiBydW4gdGltZSBtb2RlIGFzIG9wcG9zZWQKLQkgKiB0byBkZXNpZ24gdGltZSBtb2RlLiAgSW4gZGVzaWduIHRpbWUgbW9kZSwgdGhlIG9ubHkgcGVybWl0dGVkIG9wZXJhdGlvbnMgYXJlIHRvCi0JICogYWRkIG9yIHJlbW92ZSBjaGlsZCBDb21wb3NpdGVzIHRvIGJlIHVzZWQgYXMgdGhlIGhlYWRlciBhbmQvb3Igcm93IHByb3RvdHlwZSBvYmplY3RzLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIENvbXBvc2l0ZVRhYmxlIGlzIGluIHJ1biBtb2RlLiAgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUnVuVGltZSgpIHsKLQkJcmV0dXJuIHJ1blRpbWU7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHNldFJ1blRpbWUuICBUdXJucyBydW4tdGltZSBtb2RlIG9uIG9yIG9mZi4gIFdoZW4gcnVuLXRpbWUgbW9kZSBpcyBvZmYsIAotCSAqIENvbXBvc2l0ZVRhYmxlIGlnbm9yZXMgbW9zdCBwcm9wZXJ0eSBvcGVyYXRpb25zIGFuZCB3aWxsIGFjY2VwdCBwcm90b3R5cGUgY2hpbGQKLQkgKiBjb250cm9scyB0byBiZSBhZGRlZC4gIFdoZW4gcnVuLXRpbWUgbW9kZSBpcyBvbiwgdGhlIHByb3RvdHlwZSBjb250cm9scyBhcmUgCi0JICogaW50ZXJwcmV0ZWQgYW5kIGFsbCBwcm9wZXJ0aWVzIGJlY29tZSBhY3RpdmUuCi0JICogCi0JICogQHBhcmFtIHJ1blRpbWUgdHJ1ZSBpZiBydW4tdGltZSBtb2RlIHNob3VsZCBiZSBlbmFibGVkOyBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVuVGltZShib29sZWFuIHJ1blRpbWUpIHsKLQkJaWYgKHRoaXMucnVuVGltZSAhPSBydW5UaW1lKSB7Ci0JCQl0aGlzLnJ1blRpbWUgPSBydW5UaW1lOwotCQkJaWYgKHJ1blRpbWUpIHsKLQkJCQlpZiAocm93Q29udHJvbCA9PSBudWxsKSB7Ci0JCQkJCXJlc2l6ZUFuZFJlY29yZFByb3RvdHlwZVJvd3MoKTsKLQkJCQl9Ci0JCQkJc3dpdGNoVG9SdW5Nb2RlKCk7Ci0JCQl9IGVsc2UgewotCQkJCXN3aXRjaFRvRGVzaWduTW9kZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldFdlaWdodHMuICBSZXR1cm5zIGFuIGFycmF5IHJlcHJlc2VudGluZyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgd2lkdGgKLQkgKiBlYWNoIGNvbHVtbiBpcyBhbGxvY2F0ZWQgb3IgbnVsbCBpZiBubyB3ZWlnaHRzIGhhdmUgYmVlbiBzcGVjaWZpZWQuICBUaGlzIHByb3BlcnR5IGlzCi0JICogaWdub3JlZCBpZiB0aGUgcHJvZ3JhbW1lciBoYXMgc2V0IGEgbGF5b3V0IG1hbmFnZXIgb24gdGhlIGhlYWRlciBhbmQvb3IgdGhlIHJvdwotCSAqIHByb3RvdHlwZSBvYmplY3RzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgd2VpZ2h0cyBhcnJheSBvciBudWxsIGlmIG5vIHdlaWdodHMgaGF2ZSBiZWVuIHNwZWNpZmllZC4KLQkgKi8KLQlwdWJsaWMgaW50W10gZ2V0V2VpZ2h0cygpIHsKLQkJcmV0dXJuIHdlaWdodHM7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHNldFdlaWdodHMuICBTcGVjaWZpZXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHdpZHRoIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQKLQkgKiB0byBlYWNoIGNvbHVtbi4gIFRoaXMgcHJvcGVydHkgaXMgaWdub3JlZCBpZiB0aGUgcHJvZ3JhbW1lciBoYXMgc2V0IGEgbGF5b3V0IG1hbmFnZXIgCi0JICogb24gdGhlIGhlYWRlciBhbmQvb3IgdGhlIHJvdyBwcm90b3R5cGUgb2JqZWN0cy48cD4KLQkgKiAKLQkgKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSBtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgY29sdW1ucyBhbmQgdGhlIHN1bSBvZgotCSAqIGFsbCBlbGVtZW50cyBtdXN0IGVxdWFsIDEwMC4gIElmIGVpdGhlciBvZiB0aGVzZSBjb25zdHJhaW50cyBpcyBub3QgdHJ1ZSwgdGhpcyBwcm9wZXJ0eQotCSAqIHdpbGwgYmUgaWdub3JlZCBhbmQgYWxsIGNvbHVtbnMgd2lsbCBiZSBjcmVhdGVkIGVxdWFsIGluIHdpZHRoLgotCSAqIAotCSAqIEBwYXJhbSB3ZWlnaHRzIHRoZSB3ZWlnaHRzIHRvIHVzZSBpZiB0aGUgQ29tcG9zaXRlVGFibGUgaXMgYXV0b21hdGljYWxseSBsYXlpbmcgb3V0IGNvbnRyb2xzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlaWdodHMoaW50W10gd2VpZ2h0cykgewotCQl0aGlzLndlaWdodHMgPSB3ZWlnaHRzOwotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJY29udGVudFBhbmUuc2V0V2VpZ2h0cygpOwotCQl9Ci0JfQotCQotCWJvb2xlYW4gZ3JpZExpbmVzT24gPSB0cnVlOwotCQotCS8qKgotCSAqIE1ldGhvZCBpc0dyaWRMaW5lc09uLiAgUmV0dXJucyBpZiB0aGUgQ29tcG9zaXRlVGFibGUgd2lsbCBkcmF3IGdyaWQgbGluZXMgb24gdGhlIGhlYWRlcgotCSAqIGFuZCByb3cgQ29tcG9zaXRlIG9iamVjdHMuICBUaGlzIHByb3BlcnR5IGlzIGlnbm9yZWQgaWYgdGhlIHByb2dyYW1tZXIgaGFzIHNldCBhIGxheW91dAotCSAqIG1hbmFnZXIgb24gdGhlIGhlYWRlciBhbmQvb3IgdGhlIHJvdyBwcm90b3R5cGUgb2JqZWN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIENvbXBvc2l0ZVRhYmxlIHdpbGwgZHJhdyBncmlkIGxpbmVzOyBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHcmlkTGluZXNPbigpIHsKLQkJcmV0dXJuIGdyaWRMaW5lc09uOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzZXRHcmlkTGluZXNPbi4gIFNldHMgaWYgdGhlIENvbXBvc2l0ZVRhYmxlIHdpbGwgZHJhdyBncmlkIGxpbmVzIG9uIHRoZSBoZWFkZXIgYW5kCi0JICogcm93IENvbXBvc2l0ZSBvYmplY3RzLiAgVGhpcyBwcm9wZXJ0eSBpcyBpZ25vcmVkIGlmIHRoZSBwcm9ncmFtbWVyIGhhcyBzZXQgYSBsYXlvdXQgCi0JICogbWFuYWdlciBvbiB0aGUgaGVhZGVyIGFuZC9vciB0aGUgcm93IHByb3RvdHlwZSBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBncmlkTGluZXNPbiB0cnVlIGlmIHRoZSBDb21wb3NpdGVUYWJsZSB3aWxsIGRyYXcgZ3JpZCBsaW5lczsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyaWRMaW5lc09uKGJvb2xlYW4gZ3JpZExpbmVzT24pIHsKLQkJdGhpcy5ncmlkTGluZXNPbiA9IGdyaWRMaW5lc09uOwotCX0KLQkKLQlTdHJpbmcgaW5zZXJ0SGludCA9ICJQcmVzcyA8SU5TPiB0byBpbnNlcnQgbmV3IGRhdGEuIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhpbnQgc3RyaW5nIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiB0aGVyZSBhcmUgbm8gcm93cyBpbiB0aGUgdGFibGUuCi0JICogCi0JICogQHJldHVybiBUaGUgaGludCBzdHJpbmcgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyByb3dzIGluIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluc2VydEhpbnQoKSB7Ci0JCXJldHVybiBpbnNlcnRIaW50OwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBoaW50IHN0cmluZyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHdoZW4gdGhlcmUgYXJlIG5vIHJvd3MgaW4gdGhlIHRhYmxlLiAgVGhlCi0JICogZGVmYXVsdCB2YWx1ZSBpcyAiUHJlc3MgJmx0O0lOUz4gdG8gaW5zZXJ0IGEgbmV3IHJvdy4iCi0JICogCi0JICogQHBhcmFtIG5ld0hpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRIaW50KFN0cmluZyBuZXdIaW50KSB7Ci0JCXRoaXMuaW5zZXJ0SGludCA9IG5ld0hpbnQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldE1heFJvd3NWaXNpYmxlLiAgUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IHdpbGwgYmUgcGVybWl0dGVkIAotCSAqIGluIHRoZSB0YWJsZSBhdCBvbmNlLiAgRm9yIGV4YW1wbGUsIHNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byAxIHdpbGwgaGF2ZSB0aGUgZWZmZWN0IG9mIAotCSAqIGNyZWF0aW5nIGEgc2luZ2xlIGVkaXRpbmcgYXJlYSB3aXRoIGEgc2Nyb2xsIGJhciBvbiB0aGUgcmlnaHQgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc2Nyb2xsCi0JICogdGhyb3VnaCBhbGwgcm93cyB1c2luZyBlaXRoZXIgdGhlIG1vdXNlIG9yIHRoZSBQZ1VwL1BnRG4ga2V5cy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0JICogSW50ZWdlci5NQVhfVkFMVUUuCi0JICogCi0JICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IGFyZSBwZXJtaXR0ZWQgdG8gYmUgdmlzaWJsZSBhdCBvbmUgdGltZSwgcmVnYXJkbGVzcwotCSAqIG9mIHRoZSBjb250cm9sJ3Mgc2l6ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heFJvd3NWaXNpYmxlKCkgewotCQlyZXR1cm4gbWF4Um93c1Zpc2libGU7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHNldE1heFJvd3NWaXNpYmxlLiAgU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IHdpbGwgYmUgcGVybWl0dGVkIAotCSAqIGluIHRoZSB0YWJsZSBhdCBvbmNlLiAgRm9yIGV4YW1wbGUsIHNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byAxIHdpbGwgaGF2ZSB0aGUgZWZmZWN0IG9mIAotCSAqIGNyZWF0aW5nIGEgc2luZ2xlIGVkaXRpbmcgYXJlYSB3aXRoIGEgc2Nyb2xsIGJhciBvbiB0aGUgcmlnaHQgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc2Nyb2xsCi0JICogdGhyb3VnaCBhbGwgcm93cyB1c2luZyBlaXRoZXIgdGhlIG1vdXNlIG9yIHRoZSBQZ1VwL1BnRG4ga2V5cy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0JICogSW50ZWdlci5NQVhfVkFMVUUuCi0JICogCi0JICogQHBhcmFtIG1heFJvd3NWaXNpYmxlIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRoYXQgYXJlIHBlcm1pdHRlZCB0byBiZSB2aXNpYmxlIGF0IG9uZSB0aW1lLCByZWdhcmRsZXNzCi0JICogb2YgdGhlIGNvbnRyb2wncyBzaXplLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heFJvd3NWaXNpYmxlKGludCBtYXhSb3dzVmlzaWJsZSkgewotCQl0aGlzLm1heFJvd3NWaXNpYmxlID0gbWF4Um93c1Zpc2libGU7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQljb250ZW50UGFuZS5zZXRNYXhSb3dzVmlzaWJsZShtYXhSb3dzVmlzaWJsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIGdldE51bVJvd3NWaXNpYmxlLiAgUmV0dXJucyB0aGUgYWN0dWFsIG51bWJlciBvZiByb3dzIHRoYXQgYXJlIGN1cnJlbnRseSB2aXNpYmxlLgotCSAqIE5vcm1hbGx5IENvbXBvc2l0ZVRhYmxlIGRpc3BsYXlzIGFzIG1hbnkgcm93cyBhcyB3aWxsIGZpdCB2ZXJ0aWNhbGx5IGdpdmVuIHRoZSBjb250cm9sJ3MKLQkgKiBzaXplLiAgVGhpcyB2YWx1ZSBjYW4gYmUgY2xhbXBlZCB0byBhIG1heGltdW0gdXNpbmcgdGhlIE1heFJvd3NWaXNpYmxlIHByb3BlcnR5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFjdHVhbCBudW1iZXIgb2Ygcm93cyB0aGF0IGFyZSBjdXJyZW50bHkgdmlzaWJsZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bVJvd3NWaXNpYmxlKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkKLQkJCXJldHVybiBjb250ZW50UGFuZS5nZXROdW1Sb3dzVmlzaWJsZSgpOwotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0TnVtUm93c0luQ29sbGVjdGlvbi4gIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzCi0JICogYmVpbmcgZWRpdGVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtUm93c0luQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIG51bVJvd3NJbkNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHNldE51bVJvd3NJbkNvbGxlY3Rpb24uICBTZXRzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpcwotCSAqIGJlaW5nIGVkaXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbnVtUm93c0luQ29sbGVjdGlvbiB0aGUgbnVtYmVyIG9mIHJvd3MgcmVwcmVzZW50ZWQgYnkgdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TnVtUm93c0luQ29sbGVjdGlvbihpbnQgbnVtUm93c0luQ29sbGVjdGlvbikgewotCQl0aGlzLm51bVJvd3NJbkNvbGxlY3Rpb24gPSBudW1Sb3dzSW5Db2xsZWN0aW9uOwotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJY29udGVudFBhbmUuc2V0TnVtUm93c0luQ29sbGVjdGlvbihudW1Sb3dzSW5Db2xsZWN0aW9uKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGludCB0b3BSb3c9MDsKLQotCS8qKgotCSAqIE1ldGhvZCBnZXRUb3BSb3cuICBSZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgbGluZSB0aGF0IGlzIGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgdG9wIHJvdwotCSAqIG9mIHRoZSBDb21wb3NpdGVUYWJsZSBlZGl0b3IgKDAtYmFzZWQpLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgdG9wIGxpbmUuCi0JICovCi0JcHVibGljIGludCBnZXRUb3BSb3coKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmUuZ2V0VG9wUm93KCk7Ci0JCX0KLQkJcmV0dXJuIHRvcFJvdzsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2Qgc2V0VG9wUm93LiBTZXQgdGhlIG51bWJlciBvZiB0aGUgbGluZSB0aGF0IGlzIGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgdG9wIHJvdwotCSAqIG9mIHRoZSBDb21wb3NpdGVUYWJsZSBlZGl0b3IgKDAtYmFzZWQpLiAgSWYgdGhlIG5ldyB0b3Agcm93IGlzIG5vdCBlcXVhbCB0byB0aGUgY3VycmVudAotCSAqIHRvcCByb3csIHRoZSB0YWJsZSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgc2Nyb2xsZWQgdG8gdGhlIG5ldyBwb3NpdGlvbi4gIFRoaXMgbnVtYmVyIG11c3QKLQkgKiBiZSBncmVhdGVyIHRoYW4gMCBhbmQgbGVzcyB0aGFuIE51bVJvd3NJbkNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHRvcFJvdyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIG5ldyB0b3Agcm93LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvcFJvdyhpbnQgdG9wUm93KSB7Ci0JCXRoaXMudG9wUm93ID0gdG9wUm93OwotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJY29udGVudFBhbmUuc2V0VG9wUm93KHRvcFJvdyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgcmVmcmVzaEFsbFJvd3MuICBSZWZyZXNoIGFsbCB2aXNpYmxlIHJvd3MgaW4gdGhlIENvbXBvc2l0ZVRhYmxlIGZyb20gdGhlCi0JICogb3JpZ2luYWwgZGF0YS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQWxsUm93cygpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQYW5lLnVwZGF0ZVZpc2libGVSb3dzKCk7Ci0JCQljb250ZW50UGFuZS5yZWZyZXNoQWxsUm93cygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCBnZXRDdXJyZW50Q29sdW1uLiAgUmV0dXJucyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgY3VycmVudGx5LWZvY3VzZWQgY29sdW1uIAotCSAqICgwLWJhc2VkKS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBjdXJyZW50bHktZm9jdXNlZCBjb2x1bW4uCi0JICovCi0JcHVibGljIGludCBnZXRDdXJyZW50Q29sdW1uKCkgewotCQlpZiAoY29udGVudFBhbmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiBnZXRTZWxlY3Rpb24oKS54OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzZXRDdXJyZW50Q29sdW1uLiAgU2V0cyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgY3VycmVudGx5LWZvY3VzZWQgY29sdW1uIAotCSAqICgwLWJhc2VkKS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uIFRoZSBuZXcgY29sdW1uIHRvIGZvY3VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRDb2x1bW4oaW50IGNvbHVtbikgewotCQlzZXRTZWxlY3Rpb24oY29sdW1uLCBnZXRDdXJyZW50Um93KCkpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRDdXJyZW50Um93LiAgUmV0dXJucyB0aGUgY3VycmVudCByb3cgbnVtYmVyIGFzIGFuIG9mZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlCi0JICogdGFibGUgd2luZG93LiAgSW4gb3JkZXIgdG8gZ2V0IHRoZSBjdXJyZW50IHJvdyBpbiB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZSwgY29tcHV0ZQotCSAqIGdldFRvcFJvdygpICsgZ2V0Q3VycmVudFJvdygpLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcm93IG51bWJlciBhcyBhbiBvZmZzZXQgZnJvbSB0aGUgdG9wIG9mIHRoZSB0YWJsZSB3aW5kb3cuCi0JICovCi0JcHVibGljIGludCBnZXRDdXJyZW50Um93KCkgewotCQlpZiAoY29udGVudFBhbmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiBnZXRTZWxlY3Rpb24oKS55OwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2Qgc2V0Q3VycmVudFJvdy4gIFNldHMgdGhlIGN1cnJlbnQgcm93IG51bWJlciBhcyBhbiBvZmZzZXQgZnJvbSB0aGUgdG9wIG9mIHRoZQotCSAqIHRhYmxlIHdpbmRvdy4gIEluIG9yZGVyIHRvIGdldCB0aGUgY3VycmVudCByb3cgaW4gdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmUsIGNvbXB1dGUKLQkgKiBnZXRUb3BSb3coKSArIGdldEN1cnJlbnRSb3coKS4KLQkgKiAKLQkgKiBAcGFyYW0gcm93IHRoZSBjdXJyZW50IHJvdyBudW1iZXIgYXMgYW4gb2Zmc2V0IGZyb20gdGhlIHRvcCBvZiB0aGUgdGFibGUgd2luZG93LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRSb3coaW50IHJvdykgewotCQlzZXRTZWxlY3Rpb24oZ2V0Q3VycmVudENvbHVtbigpLCByb3cpOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgZ2V0Q3VycmVudFJvd0NvbnRyb2wuICBSZXR1cm5zIHRoZSBTV1QgY29udHJvbCB0aGF0IGRpc3BsYXlzIHRoZSBjdXJyZW50IHJvdy4KLQkgKiAKLQkgKiBAcmV0dXJuIENvbnRyb2wgdGhlIGN1cnJlbnQgcm93IGNvbnRyb2wuCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q3VycmVudFJvd0NvbnRyb2woKSB7Ci0JCXJldHVybiBjb250ZW50UGFuZS5nZXRDdXJyZW50Um93Q29udHJvbCgpOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgZ2V0U2VsZWN0aW9uLiAgUmV0dXJucyB0aGUgY3VycmVudGx5LXNlbGVjdGVkIChjb2x1bW4sIHJvdykgcGFpciB3aGVyZSB0aGUgcm93IAotCSAqIHNwZWNpZmllcyB0aGUgb2Zmc2V0IGZyb20gdGhlIHRvcCBvZiB0aGUgdGFibGUgd2luZG93LiAgSW4gb3JkZXIgdG8gZ2V0IHRoZSBjdXJyZW50IAotCSAqIHJvdyBpbiB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZSwgdXNlIGdldFNlbGVjdGlvbigpLnkgKyBnZXRDdXJyZW50Um93KCkuCi0JICogCi0JICogQHJldHVybiAgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCAoY29sdW1uLCByb3cpIHBhaXIgd2hlcmUgdGhlIHJvdyBzcGVjaWZpZXMgdGhlIG9mZnNldCAKLQkgKiBmcm9tIHRoZSB0b3Agb2YgdGhlIHRhYmxlIHdpbmRvdy4KLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKCkgewotCQlpZiAoY29udGVudFBhbmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRQYW5lLmdldFNlbGVjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2Qgc2V0U2VsZWN0aW9uLiAgU2V0cyB0aGUgY3VycmVudGx5LXNlbGVjdGVkIChjb2x1bW4sIHJvdykgcGFpciB3aGVyZSB0aGUgcm93IAotCSAqIHNwZWNpZmllcyB0aGUgb2Zmc2V0IGZyb20gdGhlIHRvcCBvZiB0aGUgdGFibGUgd2luZG93LiAgSW4gb3JkZXIgdG8gZ2V0IHRoZSBjdXJyZW50IAotCSAqIHJvdyBpbiB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZSwgdXNlIGdldFNlbGVjdGlvbigpLnkgKyBnZXRDdXJyZW50Um93KCkuCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgKGNvbHVtbiwgcm93KSB0byBzZWxlY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oUG9pbnQgc2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbihzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzZXRTZWxlY3Rpb24uICBTZXRzIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgKGNvbHVtbiwgcm93KSBwYWlyIHdoZXJlIHRoZSByb3cgCi0JICogc3BlY2lmaWVzIHRoZSBvZmZzZXQgZnJvbSB0aGUgdG9wIG9mIHRoZSB0YWJsZSB3aW5kb3cuICBJbiBvcmRlciB0byBnZXQgdGhlIGN1cnJlbnQgCi0JICogcm93IGluIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlLCB1c2UgZ2V0U2VsZWN0aW9uKCkueSArIGdldEN1cnJlbnRSb3coKS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uIHRoZSBjb2x1bW4gdG8gc2VsZWN0Ci0JICogQHBhcmFtIHJvdyB0aGUgcm93IHRvIHNlbGVjdCBhcyBhbiBvZmZzZXQgZnJvbSB0aGUgdG9wIG9mIHRoZSB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IGNvbHVtbiwgaW50IHJvdykgewotCQlpZiAoY29udGVudFBhbmUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWNvbnRlbnRQYW5lLnNldFNlbGVjdGlvbihjb2x1bW4sIHJvdyk7Ci0JfQotCQotCS8qKiAobm9uLUFQSSkKLQkgKiBNZXRob2QgZ2V0SGVhZGVyQ29uc3RydWN0b3IuICBSZXR1cm5zIHRoZSBDb25zdHJ1Y3RvciBvYmplY3QgdXNlZCBpbnRlcm5hbGx5IHRvCi0JICogY29uc3RydWN0IHRoZSB0YWJsZSdzIGhlYWRlciBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCi0JICogCi0JICogQHJldHVybiB0aGUgaGVhZGVyJ3MgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENvbnN0cnVjdG9yIGdldEhlYWRlckNvbnN0cnVjdG9yKCkgewotCQlyZXR1cm4gaGVhZGVyQ29uc3RydWN0b3I7Ci0JfQotCi0JLyoqIChub24tQVBJKQotCSAqIE1ldGhvZCBnZXRSb3dDb25zdHJ1Y3Rvci4gIFJldHVybnMgdGhlIENvbnN0cnVjdG9yIG9iamVjdCB1c2VkIGludGVybmFsbHkgdG8gCi0JICogY29uc3RydWN0IGVhY2ggcm93IG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByb3dzJyBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBDb25zdHJ1Y3RvciBnZXRSb3dDb25zdHJ1Y3RvcigpIHsKLQkJcmV0dXJuIHJvd0NvbnN0cnVjdG9yOwotCX0KLQotCS8qKiAobm9uLUFQSSkKLQkgKiBNZXRob2QgZ2V0SGVhZGVyQ29udHJvbC4gIFJldHVybnMgdGhlIHByb3RvdHlwZSBoZWFkZXIgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm90b3R5cGUgaGVhZGVyIGNvbnRyb2wuCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0SGVhZGVyQ29udHJvbCgpIHsKLQkJcmV0dXJuIGhlYWRlckNvbnRyb2w7Ci0JfQotCi0JLyoqIChub24tQVBJKQotCSAqIE1ldGhvZCBnZXRSb3dDb250cm9sLiAgUmV0dXJucyB0aGUgcHJvdG90eXBlIHJvdyBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3RvdHlwZSByb3cgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRSb3dDb250cm9sKCkgewotCQlyZXR1cm4gcm93Q29udHJvbDsKLQl9Ci0KLQlMaW5rZWRMaXN0IGNvbnRlbnRQcm92aWRlcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQotCS8qKgotCSAqIE1ldGhvZCBhZGRSb3dDb250ZW50UHJvdmlkZXIuICBBZGRzIHRoZSBzcGVjaWZpZWQgY29udGVudCBwcm92aWRlciB0byB0aGUgbGlzdCBvZgotCSAqIGNvbnRlbnQgcHJvdmlkZXJzIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJvdyBuZWVkcyB0byBiZSBmaWxsZWQgd2l0aCBkYXRhLgotCSAqIE1vc3Qgb2YgdGhlIHRpbWUgaXQgb25seSBtYWtlcyBzZW5zZSB0byBhZGQgYSBzaW5nbGUgb25lLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50UHJvdmlkZXIgVGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gYWRkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJvd0NvbnRlbnRQcm92aWRlcihJUm93Q29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQljb250ZW50UHJvdmlkZXJzLmFkZChjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCByZW1vdmVSb3dDb250ZW50UHJvdmlkZXIuICBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgY29udGVudCBwcm92aWRlciBmcm9tIHRoZSBsaXN0IG9mCi0JICogY29udGVudCBwcm92aWRlcnMgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgcm93IG5lZWRzIHRvIGJlIGZpbGxlZCB3aXRoIGRhdGEuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRQcm92aWRlciBUaGUgY29udGVudCBwcm92aWRlciB0byByZW1vdmUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUm93Q29udGVudFByb3ZpZGVyKElSb3dDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCWNvbnRlbnRQcm92aWRlcnMucmVtb3ZlKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCQotCUxpbmtlZExpc3Qgcm93Rm9jdXNMaXN0ZW5lcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQotCS8qKgotCSAqIE1ldGhvZCBhZGRSb3dMaXN0ZW5lci4gIEFkZHMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciB0byB0aGUgc2V0IG9mIGxpc3RlbmVycyB0aGF0IAotCSAqIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgdXNlciB3aXNoZXMgdG8gbGVhdmUgYSByb3cgYW5kIHdoZW4gdGhlIHVzZXIgaGFzIGFscmVhZHkKLQkgKiBsZWZ0IGEgcm93LiAgSWYgYW55IGxpc3RlbmVyIHZldG9zIGxlYXZpbmcgYSByb3csIHRoZSBmb2N1cyByZW1haW5zIGluIHRoZSByb3cuCi0JICogCi0JICogQHBhcmFtIHJvd0xpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUm93Rm9jdXNMaXN0ZW5lcihJUm93Rm9jdXNMaXN0ZW5lciByb3dMaXN0ZW5lcikgewotCQlyb3dGb2N1c0xpc3RlbmVycy5hZGQocm93TGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgcmVtb3ZlUm93TGlzdGVuZXIuICBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSB0aGUgc2V0IG9mIGxpc3RlbmVycyB0aGF0IAotCSAqIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgdXNlciB3aXNoZXMgdG8gbGVhdmUgYSByb3cgYW5kIHdoZW4gdGhlIHVzZXIgaGFzIGFscmVhZHkKLQkgKiBsZWZ0IGEgcm93LiAgSWYgYW55IGxpc3RlbmVyIHZldG9zIGxlYXZpbmcgYSByb3csIHRoZSBmb2N1cyByZW1haW5zIGluIHRoZSByb3cuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUm93Rm9jdXNMaXN0ZW5lcihJUm93Rm9jdXNMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyb3dGb2N1c0xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQlMaW5rZWRMaXN0IGluc2VydEhhbmRsZXJzID0gbmV3IExpbmtlZExpc3QoKTsKLQkKLQkvKioKLQkgKiBNZXRob2QgYWRkSW5zZXJ0SGFuZGxlci4gIEFkZHMgdGhlIHNwZWNpZmllZCBpbnNlcnRIYW5kbGVyIHRvIHRoZSBzZXQgb2Ygb2JqZWN0cyB0aGF0Ci0JICogd2lsbCBiZSB1c2VkIHRvIGhhbmRsZSBpbnNlcnQgcmVxdWVzdHMuCi0JICogCi0JICogQHBhcmFtIGluc2VydEhhbmRsZXIgdGhlIGluc2VydEhhbmRsZXIgdG8gYWRkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEluc2VydEhhbmRsZXIoSUluc2VydEhhbmRsZXIgaW5zZXJ0SGFuZGxlcikgewotCQlpbnNlcnRIYW5kbGVycy5hZGQoaW5zZXJ0SGFuZGxlcik7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCByZW1vdmVJbnNlcnRIYW5kbGVyLiAgUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGluc2VydEhhbmRsZXIgZnJvbSB0aGUgc2V0IG9mIG9iamVjdHMgdGhhdAotCSAqIHdpbGwgYmUgdXNlZCB0byBoYW5kbGUgaW5zZXJ0IHJlcXVlc3RzLgotCSAqIAotCSAqIEBwYXJhbSBpbnNlcnRIYW5kbGVyIHRoZSBpbnNlcnRIYW5kbGVyIHRvIHJlbW92ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVJbnNlcnRIYW5kbGVyKElJbnNlcnRIYW5kbGVyIGluc2VydEhhbmRsZXIpIHsKLQkJaW5zZXJ0SGFuZGxlcnMucmVtb3ZlKGluc2VydEhhbmRsZXIpOwotCX0KLQkKLQlMaW5rZWRMaXN0IGRlbGV0ZUhhbmRsZXJzID0gbmV3IExpbmtlZExpc3QoKTsKLQkKLQkvKioKLQkgKiBNZXRob2QgYWRkRGVsZXRlSGFuZGxlci4gIEFkZHMgdGhlIHNwZWNpZmllZCBkZWxldGVIYW5kbGVyIHRvIHRoZSBzZXQgb2Ygb2JqZWN0cyB0aGF0Ci0JICogd2lsbCBiZSB1c2VkIHRvIGhhbmRsZSBkZWxldGUgcmVxdWVzdHMuCi0JICogCi0JICogQHBhcmFtIGRlbGV0ZUhhbmRsZXIgdGhlIGRlbGV0ZUhhbmRsZXIgdG8gYWRkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERlbGV0ZUhhbmRsZXIoSURlbGV0ZUhhbmRsZXIgZGVsZXRlSGFuZGxlcikgewotCQlkZWxldGVIYW5kbGVycy5hZGQoZGVsZXRlSGFuZGxlcik7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCByZW1vdmVEZWxldGVIYW5kbGVyLiAgUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGRlbGV0ZUhhbmRsZXIgZnJvbSB0aGUgc2V0IG9mIG9iamVjdHMgdGhhdAotCSAqIHdpbGwgYmUgdXNlZCB0byBoYW5kbGUgZGVsZXRlIHJlcXVlc3RzLgotCSAqIAotCSAqIEBwYXJhbSBkZWxldGVIYW5kbGVyIHRoZSBkZWxldGVIYW5kbGVyIHRvIHJlbW92ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEZWxldGVIYW5kbGVyKElEZWxldGVIYW5kbGVyIGRlbGV0ZUhhbmRsZXIpIHsKLQkJZGVsZXRlSGFuZGxlcnMucmVtb3ZlKGRlbGV0ZUhhbmRsZXIpOwotCX0KLQkKLQlMaW5rZWRMaXN0IHJvd0NvbnN0cnVjdGlvbkxpc3RlbmVycyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCi0JLyoqCi0JICogTWV0aG9kIGFkZFJvd0NvbnN0cnVjdGlvbkxpc3RlbmVyLiAgQWRkcyB0aGUgc3BlY2lmaWVkIHJvd0NvbnN0cnVjdGlvbkxpc3RlbmVyIHRvIHRoZSBzZXQgb2Ygb2JqZWN0cyB0aGF0Ci0JICogd2lsbCBiZSB1c2VkIHRvIGxpc3RlbiB0byByb3cgY29uc3RydWN0aW9uIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gcm93Q29uc3RydWN0aW9uTGlzdGVuZXIgdGhlIHJvd0NvbnN0cnVjdGlvbkxpc3RlbmVyIHRvIGFkZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSb3dDb25zdHJ1Y3Rpb25MaXN0ZW5lcihJUm93Q29uc3RydWN0aW9uTGlzdGVuZXIgcm93Q29uc3RydWN0aW9uTGlzdGVuZXIpIHsKLQkJcm93Q29uc3RydWN0aW9uTGlzdGVuZXJzLmFkZChyb3dDb25zdHJ1Y3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCByZW1vdmVSb3dDb25zdHJ1Y3Rpb25MaXN0ZW5lci4gIFJlbW92ZXMgdGhlIHNwZWNpZmllZCByb3dDb25zdHJ1Y3Rpb25MaXN0ZW5lciBmcm9tIHRoZSBzZXQgb2Ygb2JqZWN0cyB0aGF0Ci0JICogd2lsbCBiZSB1c2VkIHRvIGxpc3RlbiB0byByb3cgY29uc3RydWN0aW9uIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gcm93Q29uc3RydWN0aW9uTGlzdGVuZXIgdGhlIHJvd0NvbnN0cnVjdGlvbkxpc3RlbmVyIHRvIHJlbW92ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSb3dDb25zdHJ1Y3Rpb25MaXN0ZW5lcihJUm93Q29uc3RydWN0aW9uTGlzdGVuZXIgcm93Q29uc3RydWN0aW9uTGlzdGVuZXIpIHsKLQkJcm93Q29uc3RydWN0aW9uTGlzdGVuZXJzLnJlbW92ZShyb3dDb25zdHJ1Y3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCWJvb2xlYW4gZGVsZXRlRW5hYmxlZCA9IHRydWU7Ci0KLQkvKioKLQkgKiBNZXRob2QgaXNEZWxldGVFbmFibGVkLiAgUmV0dXJucyBpZiBkZWxldGUgaXMgZW5hYmxlZC4gIERlbGV0aW9ucyBhcmUgb25seSBwcm9jZXNzZWQgaWYKLQkgKiB0aGUgRGVsZXRlRW5hYmxlZCBwcm9wZXJ0eSBpcyB0cnVlIGFuZCBhdCBsZWFzdCBvbmUgZGVsZXRlIGhhbmRsZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZC48cD4KLQkgKiAKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBkZWxldGUgaXMgZW5hYmxlZC4gIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZUVuYWJsZWQoKSB7Ci0JCXJldHVybiBkZWxldGVFbmFibGVkOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzZXREZWxldGVFbmFibGVkLiAgU2V0cyBpZiBkZWxldGUgaXMgZW5hYmxlZC4gIERlbGV0aW9ucyBhcmUgb25seSBwcm9jZXNzZWQgaWYKLQkgKiB0aGUgRGVsZXRlRW5hYmxlZCBwcm9wZXJ0eSBpcyB0cnVlIGFuZCBhdCBsZWFzdCBvbmUgZGVsZXRlIGhhbmRsZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZC48cD4KLQkgKiAKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgotCSAqIAotCSAqIEBwYXJhbSBkZWxldGVFbmFibGVkIHRydWUgaWYgZGVsZXRlIHNob3VsZCBiZSBlbmFibGVkLiAgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGV0ZUVuYWJsZWQoYm9vbGVhbiBkZWxldGVFbmFibGVkKSB7Ci0JCXRoaXMuZGVsZXRlRW5hYmxlZCA9IGRlbGV0ZUVuYWJsZWQ7Ci0JfQotCi0KLX0gIC8vICBAanZlOmRlY2wtaW5kZXg9MDp2aXN1YWwtY29uc3RyYWludD0iMTAsMTAiCi0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL0lEZWxldGVIYW5kbGVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvSURlbGV0ZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3MTg4MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvSURlbGV0ZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgT3JtZSA8ZGpvQGNvY29udXQtcGFsbS1zb2Z0d2FyZS5jb20+Ci0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIE9ybWUgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIElEZWxldGVIYW5kbGVyLiAgQW4gaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgY2FuIG1hbmFnZSBkZWxldGlvbnMgb24gYmVoYWxmIG9mCi0gKiBhIENvbXBvc2l0ZVRhYmxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEZWxldGVIYW5kbGVyIHsKLQkvKioKLQkgKiBNZXRob2QgY2FuRGVsZXRlLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGUgc3BlY2lmaWVkIHJvdyBjYW4KLQkgKiBiZSBzdWNjZXNzZnVsbHkgZGVsZXRlZC4gIFRoZSByZWNlaXZlciBtYXkgcGVyZm9ybSB3aGF0ZXZlciB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQKLQkgKiBJZiB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHRoZSByZWNlaXZlciBzaG91bGQgcmV0dXJuIHRydWUuICBJZiB0aGUgb2JqZWN0IGNhbm5vdCAKLQkgKiAob3IgbXVzdCBub3QpIGJlIGRlbGV0ZWQsIHRoZSByZWNlaXZlciBtdXN0IHJldHVybiBmYWxzZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm93SW5Db2xsZWN0aW9uIFRoZSByb3cgdW5kZXIgY29uc2lkZXJhdGlvbiBmb3IgZGVsZXRpb24uCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSByb3cgY2FuIGJlIGRlbGV0ZWQ7IGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5EZWxldGUoaW50IHJvd0luQ29sbGVjdGlvbik7Ci0JCi0JLyoqCi0JICogTWV0aG9kIGRlbGV0ZVJvdy4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgdG8gZGVsZXRlIHRoZSAKLQkgKiBzcGVjaWZpZWQgcm93LiAgCi0JICogCi0JICogQHBhcmFtIHJvd0luQ29sbGVjdGlvbiBUaGUgcm93IGluIHRoZSBjb2xsZWN0aW9uIHRvIGRlbGV0ZSAoMC1iYXNlZCkuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlUm93KGludCByb3dJbkNvbGxlY3Rpb24pOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL0lJbnNlcnRIYW5kbGVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvSUluc2VydEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzOWU0Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvSUluc2VydEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgT3JtZSA8ZGpvQGNvY29udXQtcGFsbS1zb2Z0d2FyZS5jb20+Ci0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIE9ybWUgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIElJbnNlcnRIYW5kbGVyLiAgQW4gaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgY2FuIGhhbmRsZSByZXF1ZXN0cyB0byBpbnNlcnQgYSBuZXcKLSAqIG9iamVjdCBpbnRvIGEgY29sbGVjdGlvbiBiZWluZyBlZGl0ZWQgYnkgYSBDb21wb3NpdGVUYWJsZS4KLSAqIAotICogQGF1dGhvciBkam8KLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5zZXJ0SGFuZGxlciB7Ci0JLyoqCi0JICogTWV0aG9kIGluc2VydC4gIFJlcXVlc3RzIHRoYXQgdGhlIHJlY2VpdmVyIGluc2VydCBvYmplY3QocykgbWFraW5nIHVwIGEgbmV3IHJvdyBhdCAKLQkgKiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiAgVGhlIHJlY2VpdmVyIHJldHVybnMgdGhlIGFjdHVhbCBwb3NpdGlvbiB3aGVyZSB0aGUgaW5zZXJ0Ci0JICogb2NjdXJlZCAodGhhdCBkb2Vzbid0IGhhdmUgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3RlZCBwb3NpdGlvbikuCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uSGludCBUaGUgdXNlcidzIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHVzZXIgaW50ZXJmYWNlIHJlbGF0aXZlIHRvIHRoZSAKLQkgKiBiZWdpbm5pbmcgb2YgdGhlIGNvbGxlY3Rpb24gKDAtYmFzZWQpLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFjdHVhbCBwb3NpdGlvbiBvZiB0aGUgbmV3IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGluc2VydChpbnQgcG9zaXRpb25IaW50KTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS9JUm93Q29uc3RydWN0aW9uTGlzdGVuZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS9JUm93Q29uc3RydWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkMmU3Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvSVJvd0NvbnN0cnVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIE9ybWUgPGRqb0Bjb2NvbnV0LXBhbG0tc29mdHdhcmUuY29tPgotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBPcm1lICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLmNvbXBvc2l0ZXRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgSVJvd0NvbnN0cnVjdGlvbkxpc3RlbmVyLiAgQW4gaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgbmVlZCB0byBsaXN0ZW4gdG8gcm93IG9iamVjdAotICogY29uc3RydWN0aW9uIGV2ZW50cy4KLSAqIAotICogQGF1dGhvciBkam8KLSAqLwotcHVibGljIGludGVyZmFjZSBJUm93Q29uc3RydWN0aW9uTGlzdGVuZXIgewotCS8qKgotCSAqIE1ldGhvZCByb3dDb25zdHJ1Y3RlZC4gIENhbGxlZCB3aGVuIHRoZSBDb21wb3NpdGVUYWJsZSBjcmVhdGVzIGEgbmV3IHJvdyBvYmplY3QuICAKLQkgKiBDb21wb3NpdGVUYWJsZSBvbmx5IGNyZWF0ZXMgYSBuZXcgcm93IG9iamVjdCB3aGVuIGl0IG5lZWRzIG9uIGluIG9yZGVyIHRvIGZpbGwgdmFjYW50Ci0JICogc3BhY2UuICBEdXJpbmcgaXRzIGxpZmUgY3ljbGUsIGl0IG5ldmVyIGRpc3Bvc2VzIGEgcm93IG9iamVjdCwgYnV0IHJhdGhlciBjYWNoZXMKLQkgKiB1bnVzZWQgcm93IG9iamVjdHMgZm9yIGxhdGVyIHJldXNlIGlmIG5lZWRlZC4gIEFsbCByb3cgb2JqZWN0cyBhcmUgZGlzcG9zZWQgd2hlbiB0aGUKLQkgKiBDb21wb3NpdGVUYWJsZSBpdHNlbGYgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIG5ld1JvdyBUaGUgbmV3IHJvdyBvYmplY3QgdGhhdCB3YXMganVzdCBjb25zdHJ1Y3RlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByb3dDb25zdHJ1Y3RlZChDb250cm9sIG5ld1Jvdyk7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvSVJvd0NvbnRlbnRQcm92aWRlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL0lSb3dDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyNTFkMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvSVJvd0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBEYXZpZCBPcm1lIDxkam9AY29jb251dC1wYWxtLXNvZnR3YXJlLmNvbT4KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgT3JtZSAgICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5jb21wb3NpdGV0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogSW50ZXJmYWNlIElSb3dDb250ZW50UHJvdmlkZXIuICBBbiBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBhcmUgYWJsZSB0byBpbml0aWFsaXplIGFuCi0gKiBhcmJpdHJhcnkgcm93IGNvbnRyb2wgd2l0aCB2YWx1ZXMgb24gZGVtYW5kLgotICogQGF1dGhvciBkam8KLSAqLwotcHVibGljIGludGVyZmFjZSBJUm93Q29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIE1ldGhvZCByZWZyZXNoLiAgUmVxdWVzdHMgcmVjZWl2ZXIgdG8gcmVmcmVzaCB0aGUgY3VycmVudFJvd0luVGFibGUgd2l0aCBkYXRhCi0JICogdG8gZWRpdC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VuZGVyIFRoZSBDb21wb3NpdGVUYWJsZSBzZW5kaW5nIHRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBjdXJyZW50T2JqZWN0T2Zmc2V0IFRoZSAwLWJhc2VkIHJvdyBudW1iZXIgdGhhdCBpcyBvZmZzZXQgaW4gdGhlIGRhdGEgc3RydWN0dXJlIG9mIAotCSAqIHRoZSB0YWJsZSdzIHRvcCByb3cuCi0JICogQHBhcmFtIHJvdyBUaGUgcm93IGNvbnRyb2wgdG8gZmlsbCB3aXRoIGRhdGEuICBUaGlzIHdpbGwgYmUgYSBjb3B5IG9mIHlvdXIgcHJvdG90eXBlIAotCSAqIHJvdyBvYmplY3QuCi0JICovCi0Jdm9pZCByZWZyZXNoKENvbXBvc2l0ZVRhYmxlIHNlbmRlciwgaW50IGN1cnJlbnRPYmplY3RPZmZzZXQsIENvbnRyb2wgcm93KTsKLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL0lSb3dGb2N1c0xpc3RlbmVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvSVJvd0ZvY3VzTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFhODczNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvSVJvd0ZvY3VzTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgT3JtZSA8ZGpvQGNvY29udXQtcGFsbS1zb2Z0d2FyZS5jb20+Ci0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIE9ybWUgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIEludGVyZmFjZSBJUm93Rm9jdXNMaXN0ZW5lci4gIEFuIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHdhbnQgdG8gbGlzdGVuIHRvIGFuZCBoYXZlIHRoZQotICogcG9zc2liaWxpdHkgb2YgdmV0b2luZyByb3cgY2hhbmdlIGV2ZW50cyBvbiBhIENvbXBvc2l0ZVRhYmxlLgotICogCi0gKiBAYXV0aG9yIGRqbwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSb3dGb2N1c0xpc3RlbmVyIHsKLQotCS8qKgotCSAqIE1ldGhvZCByZXF1ZXN0Um93Q2hhbmdlLiAgUmVxdWVzdHMgcGVybWlzc2lvbiB0byBjaGFuZ2Ugcm93cy4gIFRoaXMgbWV0aG9kIGlzCi0JICogY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBhIHJvdyBjaGFuZ2Ugb2NjdXJzLiAgTGlzdGVuZXJzIG11c3QgcmV0dXJuIHRydWUgdG8KLQkgKiBncmFudCBwZXJtaXNzaW9uIGZvciB0aGUgcm93IGNoYW5nZSB0byBvY2N1ciBvciByZXR1cm4gZmFsc2UgdG8gdmV0byBpdC4gIElmCi0JICogYW55IGxpc3RlbmVyIHJldHVybnMgZmFsc2UsIHRoZSBlbnRpcmUgcm93IGNoYW5nZSBvcGVyYXRpb24gaXMgYWJvcnRlZC48cD4KLQkgKiAgCi0JICogQHBhcmFtIHNlbmRlciBUaGUgQ29tcG9zaXRlVGFibGUgc2VuZGluZyB0aGUgZXZlbnQuCi0JICogQHBhcmFtIGN1cnJlbnRPYmplY3RPZmZzZXQgVGhlIG9mZnNldCBvZiB0aGUgY3VycmVudCBvYmplY3QgaW4gdGhlIGRhdGEgc3RydWN0dXJlLgotCSAqIEBwYXJhbSByb3cgVGhlIHJvdyBjb250cm9sIHRoYXQgaXMgbG9zaW5nIGZvY3VzLgotCSAqIEByZXR1cm4gdHJ1ZSB0byBwZXJtaXQgdGhlIHJvdyBjaGFuZ2UgdG8gb2NjdXI7IGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIHJlcXVlc3RSb3dDaGFuZ2UoQ29tcG9zaXRlVGFibGUgc2VuZGVyLCBpbnQgY3VycmVudE9iamVjdE9mZnNldCwgQ29udHJvbCByb3cpOwotCQotCS8qKgotCSAqIE1ldGhvZCBkZXBhcnQuICBDYWxsZWQgYWZ0ZXIgcmVxdXN0Um93Q2hhbmdlIGhhcyBiZWVuIGNhbGxlZCB0byBpbmRpY2F0ZSB0aGF0Ci0JICogdGhlIGZvY3VzIGlzIGRlcGFydGluZyB0aGUgc3BlY2lmaWVkIHJvdy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VuZGVyCi0JICogQHBhcmFtIGN1cnJlbnRPYmplY3RPZmZzZXQKLQkgKiBAcGFyYW0gcm93Ci0JICovCi0Jdm9pZCBkZXBhcnQoQ29tcG9zaXRlVGFibGUgc2VuZGVyLCBpbnQgY3VycmVudE9iamVjdE9mZnNldCwgQ29udHJvbCByb3cpOwotCi0JLyoqCi0JICogTWV0aG9kIGFycml2ZS4gIE5vdGlmaWVzIHJlY2VpdmVyIHRoYXQgdGhlIGN1cnJlbnQgcm93IGhhcyBqdXN0IGJlZW4gY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VuZGVyIFRoZSBDb21wb3NpdGVUYWJsZSBzZW5kaW5nIHRoZSBldmVudC4KLQkgKiBAcGFyYW0gY3VycmVudE9iamVjdE9mZnNldCBUaGUgMC1iYXNlZCBvZmZzZXQgdG8gdGhlIHJvdyB0aGF0IHNob3VsZCBiZSBwb3B1bGF0ZWQKLQkgKiBAcGFyYW0gbmV3Um93IFRoZSBhY3R1YWwgU1dUIHJvdyBvYmplY3QgdGhhdCBuZWVkcyB0byBiZSBwb3B1bGF0ZWQgd2l0aCBkYXRhCi0JICovCi0Jdm9pZCBhcnJpdmUoQ29tcG9zaXRlVGFibGUgc2VuZGVyLCBpbnQgY3VycmVudE9iamVjdE9mZnNldCwgQ29udHJvbCBuZXdSb3cpOwotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvSW50ZXJuYWxDb21wb3NpdGVUYWJsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL0ludGVybmFsQ29tcG9zaXRlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkODkwMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvSW50ZXJuYWxDb21wb3NpdGVUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIE9ybWUgPGRqb0Bjb2NvbnV0LXBhbG0tc29mdHdhcmUuY29tPgotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBPcm1lICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLmNvbXBvc2l0ZXRhYmxlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGUuaW50ZXJuYWwuRW1wdHlUYWJsZVBsYWNlaG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLmNvbXBvc2l0ZXRhYmxlLmludGVybmFsLklTZWxlY3RhYmxlUmVnaW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5jb21wb3NpdGV0YWJsZS5pbnRlcm5hbC5UYWJsZVJvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5jb21wb3NpdGV0YWJsZS5yZWZsZWN0LkR1Y2tUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2xpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotCi0vKiogKG5vbi1BUEkpCi0gKiBDbGFzcyBJbnRlcm5hbENvbXBvc2l0ZVRhYmxlLiAgVGhpcyBpcyB0aGUgcnVuLXRpbWUgQ29tcG9zaXRlVGFibGVDb250cm9sLiAgSXQgZ2V0cyBpdHMgcHJvdG90eXBlCi0gKiByb3cgYW5kIChvcHRpb25hbCkgaGVhZGVyIG9iamVjdHMgZnJvbSBpdHMgU1dUIHBhcmVudCwgdGhlbiB1c2VzIHRoZW0gdG8gaW1wbGVtZW50IGFuIFNXVCAKLSAqIHZpcnR1YWwgdGFibGUgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBkam8KLSAqLwotcHVibGljIGNsYXNzIEludGVybmFsQ29tcG9zaXRlVGFibGUgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JLy8gVGhlIGludGVybmFsIFVJIGNvbnRyb2xzIHRoYXQgbWFrZSB1cCB0aGlzIGNvbnRyb2wuCi0JcHJpdmF0ZSBDb21wb3NpdGUgc2xpZGVySG9sZGVyID0gbnVsbDsKLQlwcml2YXRlIENvbXBvc2l0ZSBjb250cm9sSG9sZGVyID0gbnVsbDsKLQlwcml2YXRlIFNsaWRlciBzbGlkZXIgPSBudWxsOwotCXByaXZhdGUgRW1wdHlUYWJsZVBsYWNlaG9sZGVyIGVtcHR5VGFibGVQbGFjZWhvbGRlciA9IG51bGw7Ci0KLQkvLyBNeSBwYXJlbnQgQ29tcG9zaXRlVGFibGUKLQlwcml2YXRlIENvbXBvc2l0ZVRhYmxlIHBhcmVudDsKLQkKLQkvLyBQcm9wZXJ0eSBmaWVsZHMKLQlwcml2YXRlIGludCBtYXhSb3dzVmlzaWJsZTsKLQlwcml2YXRlIGludCBudW1Sb3dzSW5EaXNwbGF5OwotCXByaXZhdGUgaW50IG51bVJvd3NJbkNvbGxlY3Rpb247Ci0KLQlwcml2YXRlIGludCB0b3BSb3c7Ci0JcHJpdmF0ZSBpbnQgY3VycmVudFJvdzsKLQlwcml2YXRlIGludCBjdXJyZW50Q29sdW1uOwotCi0JLy8gVGhlIHZpc2libGUvaW52aXNpYmxlIHJvdyBvYmplY3RzIGFuZCBib29rZWVwaW5nIGluZm8gYWJvdXQgdGhlbQotCXByaXZhdGUgaW50IGN1cnJlbnRWaXNpYmxlVG9wUm93ID0gMDsKLQlwcml2YXRlIGludCBudW1Sb3dzVmlzaWJsZSA9IDA7Ci0JcHJpdmF0ZSBMaW5rZWRMaXN0IHJvd3MgPSBuZXcgTGlua2VkTGlzdCgpOwotCXByaXZhdGUgTGlua2VkTGlzdCBzcGFyZVJvd3MgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JLy8gVGhlIHByb3RvdHlwZSBoZWFkZXIvcm93IG9iamVjdHMgYW5kIENvbnN0cnVjdG9ycyBzbyB3ZSBjYW4gZHVwbGljYXRlIHRoZW0KLQlwcml2YXRlIENvbnN0cnVjdG9yIGhlYWRlckNvbnN0cnVjdG9yOwotCXByaXZhdGUgQ29uc3RydWN0b3Igcm93Q29uc3RydWN0b3I7Ci0JcHJpdmF0ZSBDb250cm9sIGhlYWRlckNvbnRyb2w7Ci0JcHJpdmF0ZSBDb250cm9sIG15SGVhZGVyID0gbnVsbDsKLQlwcml2YXRlIENvbnRyb2wgcm93Q29udHJvbDsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBJbnRlcm5hbENvbXBvc2l0ZVRhYmxlLiAgVGhlIHVzdWFsIFNXVCBjb25zdHJ1Y3Rvci4gIFRoZSBzYW1lIHN0eWxlIGJpdHMgYXJlCi0JICogYWxsb3dlZCBoZXJlIGFzIGFyZSBhbGxvd2VkIG9uIENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbCBUaGUgU1dUIHBhcmVudC4KLQkgKiBAcGFyYW0gc3R5bGUgU3R5bGUgYml0cy4KLQkgKi8KLQlwdWJsaWMgSW50ZXJuYWxDb21wb3NpdGVUYWJsZShDb21wb3NpdGUgcGFyZW50Q29udHJvbCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudENvbnRyb2wsIHN0eWxlKTsKLQkJaW5pdGlhbGl6ZSgpOwotCQkKLQkJdGhpcy5wYXJlbnQgPSAoQ29tcG9zaXRlVGFibGUpIHBhcmVudENvbnRyb2w7Ci0JCQotCQlzZXRCYWNrZ3JvdW5kKHBhcmVudENvbnRyb2wuZ2V0QmFja2dyb3VuZCgpKTsKLQkJY29udHJvbEhvbGRlci5hZGRMaXN0ZW5lcihTV1QuTW91c2VXaGVlbCwgdGhpcyk7Ci0KLQkJbWF4Um93c1Zpc2libGUgPSBwYXJlbnQuZ2V0TWF4Um93c1Zpc2libGUoKTsKLQkJbnVtUm93c0luQ29sbGVjdGlvbiA9IHBhcmVudC5nZXROdW1Sb3dzSW5Db2xsZWN0aW9uKCk7Ci0JCXRvcFJvdyA9IHBhcmVudC5nZXRUb3BSb3coKTsKLQkJCi0JCWhlYWRlckNvbnN0cnVjdG9yID0gcGFyZW50LmdldEhlYWRlckNvbnN0cnVjdG9yKCk7Ci0JCXJvd0NvbnN0cnVjdG9yID0gcGFyZW50LmdldFJvd0NvbnN0cnVjdG9yKCk7Ci0JCWhlYWRlckNvbnRyb2wgPSBwYXJlbnQuZ2V0SGVhZGVyQ29udHJvbCgpOwotCQlyb3dDb250cm9sID0gcGFyZW50LmdldFJvd0NvbnRyb2woKTsKLQkJCi0JCWN1cnJlbnRWaXNpYmxlVG9wUm93ID0gdG9wUm93OwotCQlzaG93SGVhZGVyKCk7Ci0JCXVwZGF0ZVZpc2libGVSb3dzKCk7Ci0JCQotCQlpZiAobnVtUm93c1Zpc2libGUgPCAxKSB7Ci0JCQljcmVhdGVFbXB0eVRhYmxlUGxhY2Vob2xlcigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBjb2xvcikgewotCQlzdXBlci5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJY29udHJvbEhvbGRlci5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBvdmVyYWxsIHRhYmxlIFVJLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubnVtQ29sdW1ucyA9IDI7Ci0JCWdsLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWdsLm1hcmdpbldpZHRoID0gMDsKLQkJZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZ2wuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQl0aGlzLnNldExheW91dChnbCk7Ci0JCWNyZWF0ZUNvbnRyb2xIb2xkZXIoKTsKLQkJY3JlYXRlU2xpZGVySG9sZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgY29udHJvbEhvbGRlciwgd2hpY2ggaXMgdGhlIGhvbGRlciBDb21wb3NpdGUgZm9yIHRoZSBoZWFkZXIgb2JqZWN0IChpZgotCSAqIGFwcGxpY2FibGUpIGFuZCB0aGUgcm93IG9iamVjdHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRyb2xIb2xkZXIoKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhLkZJTEw7Ci0JCWNvbnRyb2xIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJY29udHJvbEhvbGRlci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY29udHJvbEhvbGRlci5zZXRMYXlvdXQobmV3IExheW91dCgpIHsKLQkJCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQkJaWYgKHJvd0NvbnRyb2wgIT0gbnVsbCkgewotCQkJCQlpbnQgaGVpZ2h0ID0gMDsKLQkJCQkJaW50IHdpZHRoID0gMDsKLQkJCQkJaWYgKGhlYWRlckNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQkJUG9pbnQgaGVhZGVyU2l6ZSA9IGhlYWRlckNvbnRyb2wuZ2V0U2l6ZSgpOwotCQkJCQkJd2lkdGggPSBoZWFkZXJTaXplLng7Ci0JCQkJCQloZWlnaHQgPSBoZWFkZXJTaXplLnk7Ci0JCQkJCX0KLQkJCQkJUG9pbnQgcm93U2l6ZSA9IHJvd0NvbnRyb2wuZ2V0U2l6ZSgpOwotCQkJCQloZWlnaHQgKz0gcm93U2l6ZS55ICogMjsKLQkJCQkJaWYgKHdpZHRoIDwgcm93U2l6ZS54KSB7Ci0JCQkJCQl3aWR0aCA9IHJvd1NpemUueDsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbmV3IFBvaW50KGhlaWdodCwgd2lkdGgpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IFBvaW50KDUwLCA1MCk7Ci0JCQl9Ci0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQkJbGF5b3V0Q29udHJvbEhvbGRlcigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBzbGlkZXJIb2xkZXIgYW5kIHNsaWRlci4gIFRoZSBTbGlkZXJIb2xkZXIgaXMgYSBDb21wb3NpdGUgdGhhdCBpcyAKLQkgKiByZXNwb25zaWJsZSBmb3Igc2hvd2luZyBhbmQgaGlkaW5nIHRoZSB2ZXJ0aWNhbCBzbGlkZXIgdXBvbiByZXF1ZXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTbGlkZXJIb2xkZXIoKSB7Ci0JCUdyaWREYXRhIGdkID0gZ2V0U2xpZGVyR3JpZERhdGEoKTsKLQkJc2xpZGVySG9sZGVyID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCXNsaWRlciA9IG5ldyBTbGlkZXIoc2xpZGVySG9sZGVyLCBTV1QuVkVSVElDQUwpOwotCQlzbGlkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2xpZGVyU2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzbGlkZXJIb2xkZXIuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlzbGlkZXJIb2xkZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNsaWRlckhvbGRlci5zZXRUYWJMaXN0KG5ldyBDb250cm9sW10ge30pOwotCX0KLQotCS8vIFNsaWRlciB1dGlsaXR5IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkvKioKLQkgKiBSZXR1cm5zIGEgR3JpZERhdGEgZm9yIHRoZSBTbGlkZXJIb2xkZXIgYXBwcm9wcmlhdGUgZm9yIGlmIHRoZSBzbGlkZXIgaXMgdmlzaWJsZSBvciBub3QuCi0JICogCi0JICogQHJldHVybiBBIEdyaWREYXRhIHdpdGggYSB3aWR0aEhpbnQgb2YgMCBpZiB0aGUgc2xpZGVyIGlzIG5vdCB2aXNpYmxlIG9yIHdpdGggYSB3aWR0aEhpbnQKLQkgKiBvZiBTV1QuREVGQVVMVCBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBHcmlkRGF0YSBnZXRTbGlkZXJHcmlkRGF0YSgpIHsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YSgpOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5GSUxMOwotCQlnZC52ZXJ0aWNhbFNwYW4gPSAxOwotCQlpZiAoIXNsaWRlclZpc2libGUpIHsKLQkJCWdkLndpZHRoSGludCA9IDA7Ci0JCX0KLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuQ0VOVEVSOwotCQlyZXR1cm4gZ2Q7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzbGlkZXJWaXNpYmxlID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogU2V0cyBpZiB0aGUgc2xpZGVyIGlzIHZpc2libGUgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSB2aXNpYmxlIHRydWUgaWYgdGhlIHNsaWRlciBzaG91bGQgYmUgdmlzaWJsZTsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNsaWRlclZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXRoaXMuc2xpZGVyVmlzaWJsZSA9IHZpc2libGU7Ci0JCXNsaWRlckhvbGRlci5zZXRMYXlvdXREYXRhKGdldFNsaWRlckdyaWREYXRhKCkpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNsaWRlckhvbGRlci5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCQkJc2xpZGVySG9sZGVyLmxheW91dCh0cnVlKTsKLQkJCQlQb2ludCBzbGlkZXJIb2xkZXJTaXplID0gc2xpZGVySG9sZGVyLmdldFNpemUoKTsKLQkJCQlzbGlkZXIuc2V0Qm91bmRzKDAsIDAsIHNsaWRlckhvbGRlclNpemUueCwgc2xpZGVySG9sZGVyU2l6ZS55KTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgaWYgdGhlIHNsaWRlciBpcyB2aXNpYmxlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2xpZGVyIGlzIHZpc2libGU7IGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NsaWRlclZpc2libGUoKSB7Ci0JCXJldHVybiBzbGlkZXJWaXNpYmxlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGlzcG9zZVJvd3Mocm93cyk7Ci0JCWRpc3Bvc2VSb3dzKHNwYXJlUm93cyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgdGhlIHJvdyBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgTGlua2VkTGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gcm93c0NvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gY29udGFpbmluZyBUYWJsZVJvdyBvYmplY3RzIHRvIGRpc3Bvc2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VSb3dzKExpbmtlZExpc3Qgcm93c0NvbGxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciByb3dzSXRlciA9IHJvd3NDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IHJvd3NJdGVyLmhhc05leHQoKTspIHsKLQkJCVRhYmxlUm93IHJvdyA9IChUYWJsZVJvdykgcm93c0l0ZXIubmV4dCgpOwotCQkJcm93LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8vIFJvdyBvYmplY3QgbGF5b3V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCi0JLyoqCi0JICogTGF5b3V0IHRoZSBjaGlsZCBjb250cm9scyB3aXRoaW4gdGhlIGNvbnRyb2xIb2xkZXIgQ29tcG9zaXRlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxheW91dENvbnRyb2xIb2xkZXIoKSB7Ci0JCWlmIChteUhlYWRlciAhPSBudWxsKQotCQkJbGF5b3V0Q2hpbGQobXlIZWFkZXIpOwotCQlmb3IgKEl0ZXJhdG9yIHJvd3NJdGVyID0gcm93cy5pdGVyYXRvcigpOyByb3dzSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYWJsZVJvdyByb3cgPSAoVGFibGVSb3cpIHJvd3NJdGVyLm5leHQoKTsKLQkJCWxheW91dENoaWxkKHJvdy5nZXRSb3dDb250cm9sKCkpOwotCQl9Ci0JCXVwZGF0ZVZpc2libGVSb3dzKCk7Ci0JfQotCi0JLyoqCi0JICogTGF5b3V0IGEgcGFydGljdWxhciByb3cgb3IgaGVhZGVyIGNvbnRyb2wgKGNoaWxkIGNvbnRyb2wgb2YgdGhlIGNvbnRyb2xIb2xkZXIpLgotCSAqIElmIHRoZSBjaGlsZCBjb250cm9sIGhhcyBhIGxheW91dCBtYW5hZ2VyLCB3ZSBkZWxlZ2F0ZSB0byB0aGF0IGxheW91dCBtYW5hZ2VyLgotCSAqIE90aGVyd2lzZSwgd2UgdXNlIHRoZSBidWlsdCBpbiB0YWJsZSBsYXlvdXQgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGQgVGhlIHJvdyBvciBoZWFkZXIgY29udHJvbCB0byBsYXlvdXQuCi0JICogQHJldHVybiBoZWlnaHQgb2YgY2hpbGQKLQkgKi8KLQlwcml2YXRlIGludCBsYXlvdXRDaGlsZChDb250cm9sIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIGNoaWxkOwotCQkJaWYgKGNvbXBvc2l0ZS5nZXRMYXlvdXQoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBhcmVudC5sYXlvdXRIZWFkZXJPclJvdyhjb21wb3NpdGUpOwotCQkJfQotCQkJY29tcG9zaXRlLmxheW91dCh0cnVlKTsKLQkJCXJldHVybiBjb21wb3NpdGUuZ2V0U2l6ZSgpLnk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSkueTsKLQl9Ci0KLQkvLyBUYWJsZSBjb250cm9sIGxheW91dCAtLSB1dGlsaXR5IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgaGVhZGVyIG9yIHJvdyBvYmplY3Qgb24gZGVtYW5kLiAgTG9ncyBhbiBlcnJvciBhbmQgcmV0dXJucyBudWxsIG9uIGZhaWx1cmUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBUaGUgU1dUIHBhcmVudC4KLQkgKiBAcGFyYW0gY29uc3RydWN0b3IgVGhlIGhlYWRlciBvciByb3cgb2JqZWN0J3MgY29uc3RydWN0b3IuCi0JICogQHJldHVybiBUaGUgY29uc3RydWN0ZWQgY29udHJvbCBvciBudWxsIGlmIG5vbmUgY291bGQgYmUgY29uc3RydWN0ZWQuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIGNyZWF0ZUludGVybmFsQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewotCQlDb250cm9sIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSAoQ29udHJvbCkgY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHtwYXJlbnQsIG5ldyBJbnRlZ2VyKFNXVC5OVUxMKX0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5hYmxlIHRvIGNvbnN0cnVjdCBjb250cm9sIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgaGVhZGVyIGNvbnRyb2wgaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQsIGNyZWF0ZSBhbmQgc2hvdyBpdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2hvd0hlYWRlcigpIHsKLQkJaWYgKG15SGVhZGVyID09IG51bGwgJiYgaGVhZGVyQ29uc3RydWN0b3IgIT0gbnVsbCkgewotCQkJbXlIZWFkZXIgPSBjcmVhdGVJbnRlcm5hbENvbnRyb2woY29udHJvbEhvbGRlciwgaGVhZGVyQ29uc3RydWN0b3IpOwotCQkJaWYgKG15SGVhZGVyIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0JCQkJQ29tcG9zaXRlIGhlYWRlckNvbXAgPSAoQ29tcG9zaXRlKSBteUhlYWRlcjsKLQkJCQlpZiAoaGVhZGVyQ29tcC5nZXRMYXlvdXQoKSA9PSBudWxsKSB7Ci0JCQkJCWhlYWRlckNvbXAuYWRkUGFpbnRMaXN0ZW5lcihoZWFkZXJQYWludExpc3RlbmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQlsYXlvdXRDaGlsZChteUhlYWRlcik7Ci0JCX0KLQl9Ci0JCi0JLy8gVGFibGUgY29udHJvbCBsYXlvdXQgLS0gbWFpbiByZWZyZXNoIGFsZ29yaXRobSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIE1haW4gcmVmcmVzaCBhbGdvcml0aG0gZW50cnkgcG9pbnQuICBUaGlzIG1ldGhvZCByZWZyZXNoZXMgZXZlcnl0aGluZyBpbiB0aGUgdGFibGU6Ci0JICogCi0JICogPHVsPgotCSAqIDxsaT5NYWtlcyBzdXJlIHRoZSBjb3JyZWN0IG51bWJlciBvZiByb3dzIGFyZSB2aXNpYmxlCi0JICogPGxpPk1ha2VzIHN1cmUgZWFjaCByb3cgaGFzIGJlZW4gcmVmcmVzaGVkIHdpdGggZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0JICogPC91bD4KLQkgKi8KLQl2b2lkIHVwZGF0ZVZpc2libGVSb3dzKCkgewotCQkvLyBJZiB3ZSBkb24ndCBoYXZlIG91ciBwcm90b3R5cGUgcm93IG9iamVjdCB5ZXQsIGJhaWwgb3V0Ci0JCWlmIChyb3dDb250cm9sID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gRmlndXJlIG91dCBob3cgbWFueSByb3dzIHdlIGNhbiBzdGFjayB2ZXJ0aWNhbGx5Ci0JCWludCBjbGllbnRBcmVhSGVpZ2h0ID0gY29udHJvbEhvbGRlci5nZXRTaXplKCkueTsKLQkJaWYgKGNsaWVudEFyZWFIZWlnaHQgPD0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpbnQgdG9wUG9zaXRpb24gPSAwOwotCQkKLQkJaW50IGhlYWRlckhlaWdodCA9IDA7Ci0JCWlmIChteUhlYWRlciAhPSBudWxsKSB7Ci0JCQloZWFkZXJIZWlnaHQgPSBoZWFkZXJDb250cm9sLmdldFNpemUoKS55ICsgMzsKLQkJCWNsaWVudEFyZWFIZWlnaHQgLT0gaGVhZGVySGVpZ2h0OwotCQkJdG9wUG9zaXRpb24gKz0gaGVhZGVySGVpZ2h0OwotCQl9Ci0JCW51bVJvd3NJbkRpc3BsYXkgPSBjbGllbnRBcmVhSGVpZ2h0IC8gcm93Q29udHJvbC5nZXRTaXplKCkueTsKLQkJCi0JCS8vIE1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyB0byBsYXkgb3V0IHRvIGJlZ2luIHdpdGgKLQkJaWYgKG51bVJvd3NJbkNvbGxlY3Rpb24gPiAwKSB7Ci0JCQludW1Sb3dzVmlzaWJsZSA9IG51bVJvd3NJbkRpc3BsYXk7Ci0JCQkKLQkJCWRpc3Bvc2VFbXB0eVRhYmxlUGxhY2Vob2xkZXIoKTsKLQkJCQotCQkJaW50IGRpc3BsYXlhYmxlUm93cyA9IG51bVJvd3NJbkNvbGxlY3Rpb24gLSB0b3BSb3c7Ci0JCQlpZiAobnVtUm93c1Zpc2libGUgPiBkaXNwbGF5YWJsZVJvd3MpIHsKLQkJCQludW1Sb3dzVmlzaWJsZSA9IGRpc3BsYXlhYmxlUm93czsKLQkJCX0KLQkJCWlmIChudW1Sb3dzVmlzaWJsZSA+IG1heFJvd3NWaXNpYmxlKSB7Ci0JCQkJbnVtUm93c1Zpc2libGUgPSBtYXhSb3dzVmlzaWJsZTsKLQkJCX0KLQkJCWlmIChudW1Sb3dzVmlzaWJsZSA8IDEpIHsKLQkJCQludW1Sb3dzVmlzaWJsZSA9IDE7Ci0JCQl9Ci0JCi0JCQkvLyBTY3JvbGwgdGhlIHZpZXcgc28gdGhhdCB0aGUgcmlnaHQgbnVtYmVyIG9mIHJvdwotCQkJLy8gb2JqZWN0cyBhcmUgc2hvd2luZyBhbmQgdGhleSBoYXZlIHRoZSByaWdodCBkYXRhCi0JCQlpZiAocm93cy5zaXplKCkgLSBNYXRoLmFicyhjdXJyZW50VmlzaWJsZVRvcFJvdyAtIHRvcFJvdykgPiAwKSB7Ci0JCQkJaWYgKGN1cnJlbnRSb3cgPj0gbnVtUm93c1Zpc2libGUpIHsKLQkJCQkJZGVsZXRlUm93QXQoMCk7Ci0JCQkJCSsrY3VycmVudFZpc2libGVUb3BSb3c7Ci0JCQkJCSsrdG9wUm93OwotCQkJCQktLWN1cnJlbnRSb3c7Ci0JCQkJfQotCQkJCXNjcm9sbFRvcCgpOwotCQkJCWZpeE51bWJlck9mUm93cygpOwotCQkJfSBlbHNlIHsKLQkJCQljdXJyZW50VmlzaWJsZVRvcFJvdyA9IHRvcFJvdzsKLQkJCQkKLQkJCQkvLyBUaGUgb3JkZXIgb2YgbnVtYmVyIGZpeGluZy9yZWZyZXNoIGlzIGltcG9ydGFudCBpbiBvcmRlciB0bwotCQkJCS8vIG1pbmltaXplIHRoZSBudW1iZXIgb2Ygc2NyZWVuIHJlZHJhdyBvcGVyYXRpb25zCi0JCQkJaWYgKHJvd3Muc2l6ZSgpID4gbnVtUm93c1Zpc2libGUpIHsKLQkJCQkJZml4TnVtYmVyT2ZSb3dzKCk7Ci0JCQkJCXJlZnJlc2hBbGxSb3dzKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmcmVzaEFsbFJvd3MoKTsKLQkJCQkJZml4TnVtYmVyT2ZSb3dzKCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJbnVtUm93c1Zpc2libGUgPSAwOwotCQkJdG9wUm93PTA7Ci0JCQljdXJyZW50Um93PTA7Ci0JCQljdXJyZW50Q29sdW1uPTA7Ci0JCQljdXJyZW50VmlzaWJsZVRvcFJvdyA9IDA7Ci0JCQludW1Sb3dzVmlzaWJsZSA9IDA7Ci0JCQkKLQkJCWlmIChlbXB0eVRhYmxlUGxhY2Vob2xkZXIgPT0gbnVsbCkgewotCQkJCWZpeE51bWJlck9mUm93cygpOwotCQkJCWNyZWF0ZUVtcHR5VGFibGVQbGFjZWhvbGVyKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIFNob3csIGhpZGUsIHJlc2V0IHRoZSBzY3JvbGwgYmFyCi0JCWlmIChudW1Sb3dzVmlzaWJsZSA8IG51bVJvd3NJbkNvbGxlY3Rpb24pIHsKLQkJCWludCBleHRyYSA9IG51bVJvd3NJbkNvbGxlY3Rpb24gLSBudW1Sb3dzVmlzaWJsZTsKLQkJCWludCBwYWdlSW5jcmVtZW50ID0gbnVtUm93c1Zpc2libGU7Ci0JCQlpZiAocGFnZUluY3JlbWVudCA+IGV4dHJhKQotCQkJCXBhZ2VJbmNyZW1lbnQgPSBleHRyYTsKLQkJCQotCQkJc2xpZGVyLnNldE1heGltdW0obnVtUm93c0luQ29sbGVjdGlvbik7Ci0JCQlzbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJCXNsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCQlzbGlkZXIuc2V0UGFnZUluY3JlbWVudChwYWdlSW5jcmVtZW50KTsKLQkJCXNsaWRlci5zZXRUaHVtYihudW1Sb3dzSW5Db2xsZWN0aW9uIC0gKG51bVJvd3NJbkNvbGxlY3Rpb24gLSBudW1Sb3dzVmlzaWJsZSkpOwotCQkJCi0JCQlzbGlkZXIuc2V0U2VsZWN0aW9uKHRvcFJvdyk7Ci0JCQkKLQkJCWlmICghaXNTbGlkZXJWaXNpYmxlKCkpIHsKLQkJCQlzZXRTbGlkZXJWaXNpYmxlKHRydWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc2V0U2xpZGVyVmlzaWJsZShmYWxzZSk7Ci0JCX0KLQotCQkvLyBMYXkgb3V0IHRoZSBoZWFkZXIgYW5kIHJvd3MgY29ycmVjdGx5IGluIHRoZSBkaXNwbGF5Ci0JCWludCB3aWR0aCA9IGNvbnRyb2xIb2xkZXIuZ2V0U2l6ZSgpLng7Ci0JCQotCQkvLyBGaXJzdCwgdGhlIGhlYWRlci4uLgotCQlpZiAobXlIZWFkZXIgIT0gbnVsbCkgewotCQkJbXlIZWFkZXIuc2V0Qm91bmRzKDAsIDAsIHdpZHRoLCBoZWFkZXJIZWlnaHQpOwotCQl9Ci0JCQotCQkvLyBNYWtlIHN1cmUgd2UgaGF2ZSByb3dzIHRvIGxheSBvdXQuLi4KLQkJaWYgKG51bVJvd3NJbkNvbGxlY3Rpb24gPCAxKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIE5vdyB0aGUgcm93cy4KLQkJaW50IHJvd0hlaWdodCA9IDUwOwotCQlyb3dIZWlnaHQgPSByb3dDb250cm9sLmdldFNpemUoKS55OwotCQkKLQkJZm9yIChJdGVyYXRvciByb3dzSXRlciA9IHJvd3MuaXRlcmF0b3IoKTsgcm93c0l0ZXIuaGFzTmV4dCgpOykgewotCQkJVGFibGVSb3cgcm93ID0gKFRhYmxlUm93KSByb3dzSXRlci5uZXh0KCk7Ci0JCQlDb250cm9sIHJvd0NvbnRyb2wgPSByb3cuZ2V0Um93Q29udHJvbCgpOwotCQkJcm93Q29udHJvbC5zZXRCb3VuZHMoMCwgdG9wUG9zaXRpb24sIHdpZHRoLCByb3dIZWlnaHQpOwotCQkJbGF5b3V0Q2hpbGQocm93Q29udHJvbCk7Ci0JCQl0b3BQb3NpdGlvbiArPSByb3dIZWlnaHQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZDogTWFrZXMgc3VyZSB0aGF0IHRoZSBjdXJyZW50bHkgdmlzaWJsZSB0b3Agcm93IGlzIHRoZSBzYW1lIGFzIHRoZSB0b3Agcm93Ci0JICogc3BlY2lmaWVkIGluIHRoZSBUb3BSb3cgcHJvcGVydHkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNjcm9sbFRvcCgpIHsKLQkJd2hpbGUgKGN1cnJlbnRWaXNpYmxlVG9wUm93IDwgdG9wUm93KSB7Ci0JCQlkZWxldGVSb3dBdCgwKTsKLQkJCSsrY3VycmVudFZpc2libGVUb3BSb3c7Ci0JCX0KLQkJd2hpbGUgKGN1cnJlbnRWaXNpYmxlVG9wUm93ID4gdG9wUm93KSB7Ci0JCQktLWN1cnJlbnRWaXNpYmxlVG9wUm93OwotCQkJaW5zZXJ0Um93QXQoMCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZDogTWFrZXMgc3VyZSB0aGF0IHRoZSBudW1iZXIgb2Ygcm93cyB0aGF0IGFyZSB2aXNpYmxlIGNvcnJlc3BvbmQgd2l0aAotCSAqIHdoYXQgc2hvdWxkIGJlIHZpc2libGUgZ2l2ZW4gdGhlIHRhYmxlIGNvbnRyb2wncyBzaXplLCB3aGVyZSBpdCBpcyBzY3JvbGxlZCwgYW5kCi0JICogdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeE51bWJlck9mUm93cygpIHsKLQkJaW50IG51bVJvd3MgPSByb3dzLnNpemUoKTsKLQkJd2hpbGUgKG51bVJvd3MgPiBudW1Sb3dzVmlzaWJsZSkgewotCQkJZGVsZXRlUm93QXQobnVtUm93cy0xKTsKLQkJCW51bVJvd3MgPSByb3dzLnNpemUoKTsKLQkJfQotCQl3aGlsZSAobnVtUm93cyA8IG51bVJvd3NWaXNpYmxlKSB7Ci0JCQlpbnNlcnRSb3dBdChudW1Sb3dzKTsKLQkJCW51bVJvd3MgPSByb3dzLnNpemUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpcmUgdGhlIHJlZnJlc2ggZXZlbnQgb24gYWxsIHZpc2libGUgcm93cy4KLQkgKi8KLQl2b2lkIHJlZnJlc2hBbGxSb3dzKCkgewotCQlpbnQgcm93PTA7Ci0JCWZvciAoSXRlcmF0b3Igcm93c0l0ZXIgPSByb3dzLml0ZXJhdG9yKCk7IHJvd3NJdGVyLmhhc05leHQoKTspIHsKLQkJCVRhYmxlUm93IHJvd0NvbnRyb2wgPSAoVGFibGVSb3cpIHJvd3NJdGVyLm5leHQoKTsKLQkJCWZpcmVSZWZyZXNoRXZlbnQodG9wUm93ICsgcm93LCByb3dDb250cm9sLmdldFJvd0NvbnRyb2woKSk7Ci0JCQkrK3JvdzsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCBhIG5ldyByb3cgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgMC1iYXNlZCBwb3NpdGlvbiByZWxhdHZlIHRvIHRoZSB0b3Btb3N0IHJvdy4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24gVGhlIDAtYmFzZWQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHRvcG1vc3Qgcm93LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRSb3dBdChpbnQgcG9zaXRpb24pIHsKLQkJVGFibGVSb3cgbmV3Um93ID0gZ2V0TmV3Um93KCk7Ci0JCWlmIChwb3NpdGlvbiA+IHJvd3Muc2l6ZSgpKSB7Ci0JCQlwb3NpdGlvbiA9IHJvd3Muc2l6ZSgpOwotCQl9Ci0JCXJvd3MuYWRkKHBvc2l0aW9uLCBuZXdSb3cpOwotCQlmaXJlUmVmcmVzaEV2ZW50KGN1cnJlbnRWaXNpYmxlVG9wUm93ICsgcG9zaXRpb24sIG5ld1Jvdy5nZXRSb3dDb250cm9sKCkpOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgdGhlIHJvdyBhdCB0aGUgc3BlY2lmaWVkIDAtYmFzZWQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHRvcG1vc3Qgcm93LgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgMC1iYXNlZCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgdG9wbW9zdCByb3cuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZVJvd0F0KGludCBwb3NpdGlvbikgewotCQlUYWJsZVJvdyByb3cgPSAoVGFibGVSb3cpIHJvd3MucmVtb3ZlKHBvc2l0aW9uKTsKLQkJcm93LnNldFZpc2libGUoZmFsc2UpOwotCQlzcGFyZVJvd3MuYWRkTGFzdChyb3cpOwotCX0KLQkKLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZDogQ3JlYXRlcyBhIG5ldyByb3cgb2JqZWN0IG9yIHJlY3ljbGVzIG9uZSB0aGF0IGhhZCBiZWVuIHByZXZpb3VzbHkgCi0JICogY3JlYXRlZCBidXQgd2FzIG5vIGxvbmdlciBuZWVkZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgbmV3IHJvdyBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBUYWJsZVJvdyBnZXROZXdSb3coKSB7Ci0JCWlmIChzcGFyZVJvd3Muc2l6ZSgpID4gMCkgewotCQkJVGFibGVSb3cgcmVjeWNsZWRSb3cgPSAoVGFibGVSb3cpIHNwYXJlUm93cy5yZW1vdmVGaXJzdCgpOwotCQkJcmVjeWNsZWRSb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXJldHVybiByZWN5Y2xlZFJvdzsKLQkJfQotCQlUYWJsZVJvdyBuZXdSb3cgPSBuZXcgVGFibGVSb3codGhpcywgY3JlYXRlSW50ZXJuYWxDb250cm9sKGNvbnRyb2xIb2xkZXIsIHJvd0NvbnN0cnVjdG9yKSk7Ci0JCWZpcmVSb3dDb25zdHJ1Y3Rpb25FdmVudChuZXdSb3cuZ2V0Um93Q29udHJvbCgpKTsKLQkJaWYgKG5ld1Jvdy5nZXRSb3dDb250cm9sKCkgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCUNvbXBvc2l0ZSByb3dDb21wID0gKENvbXBvc2l0ZSkgbmV3Um93LmdldFJvd0NvbnRyb2woKTsKLQkJCWlmIChyb3dDb21wLmdldExheW91dCgpID09IG51bGwpIHsKLQkJCQlyb3dDb21wLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQkJCQlyb3dDb21wLmFkZFBhaW50TGlzdGVuZXIocm93UGFpbnRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JvdzsKLQl9Ci0KLQkvLyBQcm9wZXJ0eSBnZXR0ZXJzL3NldHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0JLyoKLQkgKiBUaGVzZSBhcmUgaW50ZXJuYWwgQVBJLgotCSAqIDxwPgotCSAqIFBsZXNlIHJlZmVyIHRvIHRoZSBKYXZhRG9jIG9uIENvbXBvc2l0ZVRhYmxlIGZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGVzZSBwcm9wZXJ0eSBtZXRob2RzLgotCSAqLwotCQotCS8qKiAobm9uLUFQSSkKLQkgKiBNZXRob2QgZ2V0SGVhZGVyQ29udHJvbC4gIFJldHVybiB0aGUgcHJvdG90eXBlIGNvbnRyb2wgYmVpbmcgdXNlZCBhcyBhIGhlYWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBoZWFkZXIgY29udHJvbAotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldEhlYWRlckNvbnRyb2woKSB7Ci0JCXJldHVybiBoZWFkZXJDb250cm9sOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzZXRNYXhSb3dzVmlzaWJsZS4gIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdGhhdCB3aWxsIGJlIHBlcm1pdHRlZCAKLQkgKiBpbiB0aGUgdGFibGUgYXQgb25jZS4gIEZvciBleGFtcGxlLCBzZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gMSB3aWxsIGhhdmUgdGhlIGVmZmVjdCBvZiAKLQkgKiBjcmVhdGluZyBhIHNpbmdsZSBlZGl0aW5nIGFyZWEgd2l0aCBhIHNjcm9sbCBiYXIgb24gdGhlIHJpZ2h0IGFsbG93aW5nIHRoZSB1c2VyIHRvIHNjcm9sbAotCSAqIHRocm91Z2ggYWxsIHJvd3MgdXNpbmcgZWl0aGVyIHRoZSBtb3VzZSBvciB0aGUgUGdVcC9QZ0RuIGtleXMuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotCSAqIEludGVnZXIuTUFYX1ZBTFVFLgotCSAqIAotCSAqIEBwYXJhbSBtYXhSb3dzVmlzaWJsZSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IGFyZSBwZXJtaXR0ZWQgdG8gYmUgdmlzaWJsZSBhdCBvbmUgdGltZSwgcmVnYXJkbGVzcwotCSAqIG9mIHRoZSBjb250cm9sJ3Mgc2l6ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXhSb3dzVmlzaWJsZShpbnQgbWF4Um93c1Zpc2libGUpIHsKLQkJdGhpcy5tYXhSb3dzVmlzaWJsZSA9IG1heFJvd3NWaXNpYmxlOwotCQl1cGRhdGVWaXNpYmxlUm93cygpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXROdW1Sb3dzVmlzaWJsZS4gIFJldHVybnMgdGhlIGFjdHVhbCBudW1iZXIgb2Ygcm93cyB0aGF0IGFyZSBjdXJyZW50bHkgdmlzaWJsZS4KLQkgKiBOb3JtYWxseSBDb21wb3NpdGVUYWJsZSBkaXNwbGF5cyBhcyBtYW55IHJvd3MgYXMgd2lsbCBmaXQgdmVydGljYWxseSBnaXZlbiB0aGUgY29udHJvbCdzCi0JICogc2l6ZS4gIFRoaXMgdmFsdWUgY2FuIGJlIGNsYW1wZWQgdG8gYSBtYXhpbXVtIHVzaW5nIHRoZSBNYXhSb3dzVmlzaWJsZSBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHJvd3MgdGhhdCBhcmUgY3VycmVudGx5IHZpc2libGUuCi0JICovCi0JcHVibGljIGludCBnZXROdW1Sb3dzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIG51bVJvd3NWaXNpYmxlOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2Qgc2V0TnVtUm93c0luQ29sbGVjdGlvbi4gIFNldHMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzCi0JICogYmVpbmcgZWRpdGVkLgotCSAqIAotCSAqIEBwYXJhbSBudW1Sb3dzSW5Db2xsZWN0aW9uIHRoZSBudW1iZXIgb2Ygcm93cyByZXByZXNlbnRlZCBieSB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROdW1Sb3dzSW5Db2xsZWN0aW9uKGludCBudW1Sb3dzSW5Db2xsZWN0aW9uKSB7Ci0JCXRoaXMudG9wUm93ID0gMDsKLQkJaWYgKGN1cnJlbnRSb3cgPiAwKSB7Ci0JCQljdXJyZW50Um93ID0gMDsKLQkJfQotCQl0aGlzLm51bVJvd3NJbkNvbGxlY3Rpb24gPSBudW1Sb3dzSW5Db2xsZWN0aW9uOwotCQl1cGRhdGVWaXNpYmxlUm93cygpOwotCQlyZWZyZXNoQWxsUm93cygpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzZXRUb3BSb3cuIFNldCB0aGUgbnVtYmVyIG9mIHRoZSBsaW5lIHRoYXQgaXMgYmVpbmcgZGlzcGxheWVkIGluIHRoZSB0b3Agcm93Ci0JICogb2YgdGhlIENvbXBvc2l0ZVRhYmxlIGVkaXRvciAoMC1iYXNlZCkuICBJZiB0aGUgbmV3IHRvcCByb3cgaXMgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50Ci0JICogdG9wIHJvdywgdGhlIHRhYmxlIHdpbGwgYXV0b21hdGljYWxseSBiZSBzY3JvbGxlZCB0byB0aGUgbmV3IHBvc2l0aW9uLiAgVGhpcyBudW1iZXIgbXVzdAotCSAqIGJlIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzIHRoYW4gTnVtUm93c0luQ29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdG9wUm93IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgbmV3IHRvcCByb3cuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9wUm93KGludCB0b3BSb3cpIHsKLQkJZmlyZVJvd0RlcGFydEV2ZW50KCk7Ci0JCXRoaXMudG9wUm93ID0gdG9wUm93OwotCQl1cGRhdGVWaXNpYmxlUm93cygpOwotCQlmaXJlUm93QXJyaXZlRXZlbnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIGdldFRvcFJvdy4gIFJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBsaW5lIHRoYXQgaXMgYmVpbmcgZGlzcGxheWVkIGluIHRoZSB0b3Agcm93Ci0JICogb2YgdGhlIENvbXBvc2l0ZVRhYmxlIGVkaXRvciAoMC1iYXNlZCkuCi0JICogCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSB0b3AgbGluZS4KLQkgKi8JCi0JcHVibGljIGludCBnZXRUb3BSb3coKSB7Ci0JCXJldHVybiB0b3BSb3c7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldFNlbGVjdGlvbi4gIFJldHVybnMgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCAoY29sdW1uLCByb3cpIHBhaXIgd2hlcmUgdGhlIHJvdyAKLQkgKiBzcGVjaWZpZXMgdGhlIG9mZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlIHRhYmxlIHdpbmRvdy4gIEluIG9yZGVyIHRvIGdldCB0aGUgY3VycmVudCAKLQkgKiByb3cgaW4gdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmUsIHVzZSBnZXRTZWxlY3Rpb24oKS55ICsgZ2V0Q3VycmVudFJvdygpLgotCSAqIAotCSAqIEByZXR1cm4gIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgKGNvbHVtbiwgcm93KSBwYWlyIHdoZXJlIHRoZSByb3cgc3BlY2lmaWVzIHRoZSBvZmZzZXQgCi0JICogZnJvbSB0aGUgdG9wIG9mIHRoZSB0YWJsZSB3aW5kb3cuCi0JICovCi0JcHVibGljIFBvaW50IGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb2ludChjdXJyZW50Q29sdW1uLCBjdXJyZW50Um93KTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2Qgc2V0U2VsZWN0aW9uLiAgU2V0cyB0aGUgY3VycmVudGx5LXNlbGVjdGVkIChjb2x1bW4sIHJvdykgcGFpciB3aGVyZSB0aGUgcm93IAotCSAqIHNwZWNpZmllcyB0aGUgb2Zmc2V0IGZyb20gdGhlIHRvcCBvZiB0aGUgdGFibGUgd2luZG93LiAgSW4gb3JkZXIgdG8gZ2V0IHRoZSBjdXJyZW50IAotCSAqIHJvdyBpbiB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZSwgdXNlIGdldFNlbGVjdGlvbigpLnkgKyBnZXRDdXJyZW50Um93KCkuCi0JICogCi0JICogQHBhcmFtIGNvbHVtbiB0aGUgY29sdW1uIHRvIHNlbGVjdAotCSAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byBzZWxlY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IGNvbHVtbiwgaW50IHJvdykgewotCQlpZiAocm93ID09IGN1cnJlbnRSb3cpCi0JCQlpbnRlcm5hbFNldFNlbGVjdGlvbihjb2x1bW4sIHJvdywgZmFsc2UpOwotCQllbHNlIHsKLQkJCWlmIChmaXJlUmVxdWVzdFJvd0NoYW5nZUV2ZW50KCkpCi0JCQkJaW50ZXJuYWxTZXRTZWxlY3Rpb24oY29sdW1uLCByb3csIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHNldFdlaWdodHMuICBJbmRpY2F0ZXMgdGhhdCB0aGUgY29sdW1uIHdlaWdodHMgd2VyZSBqdXN0IHNldCBhbmQgd2Ugc2hvdWxkIHJlLWxheW91dAotCSAqIHRoZSBjb250cm9sIGhvbGRlciBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2VpZ2h0cygpIHsKLQkJbGF5b3V0Q29udHJvbEhvbGRlcigpOwotCX0KLQotCS8vIFJlZnJlc2ggRXZlbnQgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkvKioKLQkgKiBBZGRzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgdG8gdGhlIHNldCBvZiBsaXN0ZW5lcnMgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gYSByb3cKLQkgKiByZWZyZXNoIGV2ZW50IG9jY3Vycy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGFkZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWZyZXNoQ29udGVudFByb3ZpZGVyKElSb3dDb250ZW50UHJvdmlkZXIgbGlzdGVuZXIpIHsKLQkJcGFyZW50LmNvbnRlbnRQcm92aWRlcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBmcm9tIHRoZSBzZXQgb2YgbGlzdGVuZXJzIHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIGEKLQkgKiByb3cgcmVmcmVzaCBldmVudCBvY2N1cnMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byByZW1vdmUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVmcmVzaENvbnRlbnRQcm92aWRlcihJUm93Q29udGVudFByb3ZpZGVyIGxpc3RlbmVyKSB7Ci0JCXBhcmVudC5jb250ZW50UHJvdmlkZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVSZWZyZXNoRXZlbnQoaW50IHBvc2l0aW9uSW5Db2xsZWN0aW9uLCBDb250cm9sIHJvd0NvbnRyb2wpIHsKLQkJaWYgKG51bVJvd3NJbkNvbGxlY3Rpb24gPCAxKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvciByZWZyZXNoTGlzdGVuZXJzSXRlciA9IHBhcmVudC5jb250ZW50UHJvdmlkZXJzLml0ZXJhdG9yKCk7IHJlZnJlc2hMaXN0ZW5lcnNJdGVyLmhhc05leHQoKTspIHsKLQkJCUlSb3dDb250ZW50UHJvdmlkZXIgbGlzdGVuZXIgPSAoSVJvd0NvbnRlbnRQcm92aWRlcikgcmVmcmVzaExpc3RlbmVyc0l0ZXIubmV4dCgpOwotCQkJbGlzdGVuZXIucmVmcmVzaChwYXJlbnQsIHBvc2l0aW9uSW5Db2xsZWN0aW9uLCByb3dDb250cm9sKTsKLQkJfQotCX0KLQkKLQkKLQkvLyBFbXB0eSB0YWJsZSBwbGFjZWhvbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtcHR5VGFibGVQbGFjZWhvbGVyKCkgewotCQllbXB0eVRhYmxlUGxhY2Vob2xkZXIgPSBuZXcgRW1wdHlUYWJsZVBsYWNlaG9sZGVyKGNvbnRyb2xIb2xkZXIsIFNXVC5OVUxMKTsKLQkJaWYgKHJvd0NvbnRyb2wgIT0gbnVsbCkKLQkJCWVtcHR5VGFibGVQbGFjZWhvbGRlci5zZXRCYWNrZ3JvdW5kKHJvd0NvbnRyb2wuZ2V0QmFja2dyb3VuZCgpKTsKLQkJZW1wdHlUYWJsZVBsYWNlaG9sZGVyLnNldE1lc3NhZ2UocGFyZW50LmdldEluc2VydEhpbnQoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwb3NlRW1wdHlUYWJsZVBsYWNlaG9sZGVyKCkgewotCQlpZiAoZW1wdHlUYWJsZVBsYWNlaG9sZGVyICE9IG51bGwpIHsKLQkJCWVtcHR5VGFibGVQbGFjZWhvbGRlci5kaXNwb3NlKCk7Ci0JCQllbXB0eVRhYmxlUGxhY2Vob2xkZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JLy8gRXZlbnQgSGFuZGxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCXByaXZhdGUgYm9vbGVhbiBuZWVkVG9SZXF1ZXN0UkM9dHJ1ZTsKLQkKLQkvKioKLQkgKiBIYW5kbGUgYSBrZXlQcmVzc2VkIGV2ZW50IG9uIGFueSByb3cgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VuZGVyIFRoZSByb3cgdGhhdCBpcyBzZW5kaW5nIHRoZSBldmVudAotCSAqIEBwYXJhbSBlIHRoZSBhY3R1YWwgS2V5RXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKFRhYmxlUm93IHNlbmRlciwgS2V5RXZlbnQgZSkgewotCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDApIHsKLQkJCXN3aXRjaCAoZS5rZXlDb2RlKSB7Ci0JCQljYXNlIFNXVC5IT01FOgotCQkJCWlmICh0b3BSb3cgPD0gMCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCWlmICghZmlyZVJlcXVlc3RSb3dDaGFuZ2VFdmVudCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJbmVlZFRvUmVxdWVzdFJDID0gZmFsc2U7Ci0JCQkJCi0JCQkJZGVzZWxlY3QoZS53aWRnZXQpOwotCQkJCQotCQkJCS8vIElmIHRoZSBmb2N1cyBpcyBhbHJlYWR5IGluIHRoZSB0b3AgdmlzaWJsZSByb3csIHdlIHdpbGwgbmVlZCB0byBleHBsaWNpdGx5IAotCQkJCS8vIGZpcmUgYW4gYXJyaXZlIGV2ZW50LgotCQkJCWJvb2xlYW4gbmVlZFRvQXJyaXZlID0gdHJ1ZTsKLQkJCQlpZiAoY3VycmVudFJvdyA+IDApIHsKLQkJCQkJbmVlZFRvQXJyaXZlID0gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCXNldFRvcFJvdygwKTsKLQkJCQkKLQkJCQlpZiAobmVlZFRvQXJyaXZlKSB7Ci0JCQkJCWludGVybmFsU2V0U2VsZWN0aW9uKGN1cnJlbnRDb2x1bW4sIDAsIHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludGVybmFsU2V0U2VsZWN0aW9uKGN1cnJlbnRDb2x1bW4sIDAsIGZhbHNlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTV1QuRU5EOgotCQkJCWlmICh0b3BSb3cgKyBudW1Sb3dzVmlzaWJsZSA8IG51bVJvd3NJbkNvbGxlY3Rpb24pIHsKLQkJCQkJaWYgKCFmaXJlUmVxdWVzdFJvd0NoYW5nZUV2ZW50KCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQluZWVkVG9SZXF1ZXN0UkMgPSBmYWxzZTsKLQkJCQkJCi0JCQkJCWRlc2VsZWN0KGUud2lkZ2V0KTsKLQkJCQkJCi0JCQkJCS8vIElmIHRoZSBmb2N1cyBpcyBhbHJlYWR5IGluIHRoZSBsYXN0IHZpc2libGUgcm93LCB3ZSB3aWxsIG5lZWQgdG8gZXhwbGljaXRseSAKLQkJCQkJLy8gZmlyZSBhbiBhcnJpdmUgZXZlbnQuCi0JCQkJCW5lZWRUb0Fycml2ZSA9IHRydWU7Ci0JCQkJCWlmIChjdXJyZW50Um93IDwgbnVtUm93c1Zpc2libGUtMSkgewotCQkJCQkJbmVlZFRvQXJyaXZlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXNldFRvcFJvdyhudW1Sb3dzSW5Db2xsZWN0aW9uIC0gbnVtUm93c1Zpc2libGUpOwotCQkJCQkKLQkJCQkJaWYgKG5lZWRUb0Fycml2ZSkgewotCQkJCQkJaW50ZXJuYWxTZXRTZWxlY3Rpb24oY3VycmVudENvbHVtbiwgbnVtUm93c1Zpc2libGUtMSwgdHJ1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpbnRlcm5hbFNldFNlbGVjdGlvbihjdXJyZW50Q29sdW1uLCBudW1Sb3dzVmlzaWJsZS0xLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTV1QuREVMOgotCQkJCWlmIChmaXJlRGVsZXRlRXZlbnQoKSkgewotCQkJCQkvLyBXZSBrbm93IHRoZSBvYmplY3QgaXMgZ29uZSBpZiB3ZSBtYWRlIGl0IGhlcmUsIHNvIG5vdyByZWZyZXNoIHRoZSBkaXNwbGF5Li4uCi0JCQkJCS0tbnVtUm93c0luQ29sbGVjdGlvbjsKLQkJCQkJCi0JCQkJCS8vIElmIHdlIGRlbGV0ZWQgdGhlIGxhc3Qgcm93IGluIHRoZSBsaXN0Ci0JCQkJCWlmIChjdXJyZW50Um93ID49IG51bVJvd3NWaXNpYmxlLTEpIHsKLQkJCQkJCS8vIElmIHRoYXQgd2Fzbid0IHRoZSBsYXN0IHJvdyBpbiB0aGUgY29sbGVjdGlvbiwgbW92ZSB0aGUgZm9jdXMKLQkJCQkJCWlmIChudW1Sb3dzSW5Db2xsZWN0aW9uID4gMCkgewotCi0JCQkJCQkJLy8gSWYgd2UncmUgb25seSBkaXNwbGF5aW5nIG9uZSByb3csIHNjcm9sbCBmaXJzdAotCQkJCQkJCWlmIChjdXJyZW50Um93IDwgMSkgewotCQkJCQkJCQluZWVkVG9SZXF1ZXN0UkMgPSBmYWxzZTsKLQkJCQkJCQkJZGVsZXRlUm93QXQoY3VycmVudFJvdyk7Ci0JCQkJCQkJCXNldFRvcFJvdyh0b3BSb3ctMSk7Ci0JCQkJCQkJCWludGVybmFsU2V0U2VsZWN0aW9uKGN1cnJlbnRDb2x1bW4sIGN1cnJlbnRSb3csIHRydWUpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCW5lZWRUb1JlcXVlc3RSQyA9IGZhbHNlOwotCQkJCQkJCQlpbnRlcm5hbFNldFNlbGVjdGlvbihjdXJyZW50Q29sdW1uLCBjdXJyZW50Um93LTEsIGZhbHNlKTsKLQkJCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlkZWxldGVSb3dBdChjdXJyZW50Um93KzEpOwotCQkJCQkJCQkJCXVwZGF0ZVZpc2libGVSb3dzKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gT3RoZXJ3aXNlLCBzaG93IHRoZSBwbGFjZWhvbGRlciBvYmplY3QgYW5kIGdpdmUgaXQgZm9jdXMKLQkJCQkJCQlkZWxldGVSb3dBdChjdXJyZW50Um93KTsKLQkJCQkJCQktLW51bVJvd3NWaXNpYmxlOwotCQkJCQkJCWNyZWF0ZUVtcHR5VGFibGVQbGFjZWhvbGVyKCk7Ci0JCQkJCQkJZW1wdHlUYWJsZVBsYWNlaG9sZGVyLnNldEZvY3VzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBlbHNlLCBrZWVwIHRoZSBmb2N1cyB3aGVyZSBpdCB3YXMKLQkJCQkJCWRlbGV0ZVJvd0F0KGN1cnJlbnRSb3cpOwotCQkJCQkJdXBkYXRlVmlzaWJsZVJvd3MoKTsKLQkJCQkJCWludGVybmFsU2V0U2VsZWN0aW9uKGN1cnJlbnRDb2x1bW4sIGN1cnJlbnRSb3csIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN3aXRjaCAoZS5rZXlDb2RlKSB7Ci0JCWNhc2UgU1dULklOU0VSVDoKLQkJCS8vIElmIG5vIGluc2VydEhhbmRsZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCwgYmFpbCBvdXQgCi0JCSAJaWYgKHBhcmVudC5pbnNlcnRIYW5kbGVycy5zaXplKCkgPCAxKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBNYWtlIHN1cmUgd2UgY2FuIGxlYXZlIHRoZSBjdXJyZW50IHJvdwotCQkJaWYgKCFmaXJlUmVxdWVzdFJvd0NoYW5nZUV2ZW50KCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQluZWVkVG9SZXF1ZXN0UkMgPSBmYWxzZTsKLQkJCQotCQkJLy8gSW5zZXJ0IHRoZSBuZXcgb2JqZWN0Ci0JCQlpbnQgbmV3Um93UG9zaXRpb24gPSBmaXJlSW5zZXJ0RXZlbnQoKTsKLQkJCWlmIChuZXdSb3dQb3NpdGlvbiA8IDApIHsKLQkJCQkvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dC4uLgotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJZGlzcG9zZUVtcHR5VGFibGVQbGFjZWhvbGRlcigpOwotCQkJCi0JCQkvLyBJZiB0aGUgY3VycmVudCB3aWRnZXQgaGFzIGEgc2VsZWN0aW9uLCBkZXNlbGVjdCBpdAotCQkJZGVzZWxlY3QoZS53aWRnZXQpOwotCQkJCi0JCQkvLyBJZiB0aGUgbmV3IHJvdyBpcyBpbiB0aGUgdmlzaWJsZSBzcGFjZSwgcmVmcmVzaCBpdAotCQkJaWYgKHRvcFJvdyA8PSBuZXdSb3dQb3NpdGlvbiAmJiAKLQkJCQkJbnVtUm93c1Zpc2libGUgPiBuZXdSb3dQb3NpdGlvbiAtIHRvcFJvdykgewotCQkJCWluc2VydFJvd0F0KG5ld1Jvd1Bvc2l0aW9uIC0gdG9wUm93KTsKLQkJCQkrK251bVJvd3NJbkNvbGxlY3Rpb247Ci0JCQkJdXBkYXRlVmlzaWJsZVJvd3MoKTsKLQkJCQlpbnQgbmV3Um93TnVtYmVyID0gbmV3Um93UG9zaXRpb24gLSB0b3BSb3c7Ci0JCQkJaWYgKG5ld1Jvd051bWJlciAhPSBjdXJyZW50Um93KSB7Ci0JCQkJCWludGVybmFsU2V0U2VsZWN0aW9uKGN1cnJlbnRDb2x1bW4sIG5ld1Jvd051bWJlciwgZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludGVybmFsU2V0U2VsZWN0aW9uKGN1cnJlbnRDb2x1bW4sIG5ld1Jvd051bWJlciwgdHJ1ZSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLy8gZWxzZS4uLgotCQkJCi0JCQkrK251bVJvd3NJbkNvbGxlY3Rpb247Ci0KLQkJCS8vIElmIHRoZSBuZXcgcm93IGlzIGFib3ZlIHVzLCBzY3JvbGwgdXAgdG8gaXQKLQkJCWlmIChuZXdSb3dQb3NpdGlvbiA8IHRvcFJvdyArIGN1cnJlbnRSb3cpIHsKLQkJCQlzZXRUb3BSb3cobmV3Um93UG9zaXRpb24pOwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXVwZGF0ZVZpc2libGVSb3dzKCk7Ci0JCQkJCQlpZiAoY3VycmVudFJvdyAhPSAwKSB7Ci0JCQkJCQkJaW50ZXJuYWxTZXRTZWxlY3Rpb24oY3VycmVudENvbHVtbiwgMCwgZmFsc2UpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpbnRlcm5hbFNldFNlbGVjdGlvbihjdXJyZW50Q29sdW1uLCAwLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJZiB3ZSdyZSBhcHBlbmRpbmcKLQkJCQlpZiAobnVtUm93c0luRGlzcGxheSA+IG51bVJvd3NWaXNpYmxlKSB7Ci0JCQkJCXVwZGF0ZVZpc2libGVSb3dzKCk7Ci0JCQkJCWludCBuZXdSb3dOdW1iZXIgPSBuZXdSb3dQb3NpdGlvbiAtIHRvcFJvdzsKLQkJCQkJaWYgKG5ld1Jvd051bWJlciAhPSBjdXJyZW50Um93KSB7Ci0JCQkJCQlpbnRlcm5hbFNldFNlbGVjdGlvbihjdXJyZW50Q29sdW1uLCBuZXdSb3dOdW1iZXIsIGZhbHNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWludGVybmFsU2V0U2VsZWN0aW9uKGN1cnJlbnRDb2x1bW4sIG5ld1Jvd051bWJlciwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBJdCdzIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIGJlbG93IHVzOyBzY3JvbGwgZG93biB0byBpdAotCQkJCQlzZXRUb3BSb3cobmV3Um93UG9zaXRpb24tbnVtUm93c1Zpc2libGUrMSk7Ci0JCQkJCWludCBuZXdSb3dOdW1iZXIgPSBudW1Sb3dzVmlzaWJsZS0xOwotCQkJCQlpZiAobmV3Um93TnVtYmVyICE9IGN1cnJlbnRSb3cpIHsKLQkJCQkJCWludGVybmFsU2V0U2VsZWN0aW9uKGN1cnJlbnRDb2x1bW4sIG5ld1Jvd051bWJlciwgZmFsc2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaW50ZXJuYWxTZXRTZWxlY3Rpb24oY3VycmVudENvbHVtbiwgbmV3Um93TnVtYmVyLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJcmV0dXJuOwotCQljYXNlIFNXVC5BUlJPV19VUDoKLQkJCWlmIChtYXhSb3dzVmlzaWJsZSA8PSAxKQotCQkJCXJldHVybjsKLQkJCQotCQkJaWYgKGN1cnJlbnRSb3cgPiAwKSB7Ci0JCQkJaWYgKCFmaXJlUmVxdWVzdFJvd0NoYW5nZUV2ZW50KCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQluZWVkVG9SZXF1ZXN0UkMgPSBmYWxzZTsKLQkJCQkKLQkJCQlkZXNlbGVjdChlLndpZGdldCk7Ci0JCQkJCi0JCQkJaW50ZXJuYWxTZXRTZWxlY3Rpb24oY3VycmVudENvbHVtbiwgY3VycmVudFJvdy0xLCBmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKHRvcFJvdyA+IDApIHsKLQkJCQlpZiAoIWZpcmVSZXF1ZXN0Um93Q2hhbmdlRXZlbnQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCW5lZWRUb1JlcXVlc3RSQyA9IGZhbHNlOwotCQkJCQotCQkJCWRlc2VsZWN0KGUud2lkZ2V0KTsKLQkJCQkKLQkJCQlzZXRUb3BSb3codG9wUm93IC0gMSk7Ci0JCQkJaW50ZXJuYWxTZXRTZWxlY3Rpb24oY3VycmVudENvbHVtbiwgY3VycmVudFJvdywgdHJ1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcmV0dXJuOwotCQljYXNlIFNXVC5BUlJPV19ET1dOOgotCQkJaWYgKG1heFJvd3NWaXNpYmxlIDw9IDEpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlpZiAoY3VycmVudFJvdyA8IG51bVJvd3NWaXNpYmxlLTEpIHsKLQkJCQlpZiAoIWZpcmVSZXF1ZXN0Um93Q2hhbmdlRXZlbnQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCW5lZWRUb1JlcXVlc3RSQyA9IGZhbHNlOwotCQkJCQotCQkJCWRlc2VsZWN0KGUud2lkZ2V0KTsKLQkJCQkKLQkJCQlpbnRlcm5hbFNldFNlbGVjdGlvbihjdXJyZW50Q29sdW1uLCBjdXJyZW50Um93KzEsIGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAodG9wUm93ICsgbnVtUm93c1Zpc2libGUgPCBudW1Sb3dzSW5Db2xsZWN0aW9uKSB7Ci0JCQkJaWYgKCFmaXJlUmVxdWVzdFJvd0NoYW5nZUV2ZW50KCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQluZWVkVG9SZXF1ZXN0UkMgPSBmYWxzZTsKLQkJCQkKLQkJCQlkZXNlbGVjdChlLndpZGdldCk7Ci0JCQkJCi0JCQkJc2V0VG9wUm93KHRvcFJvdyArIDEpOwotCQkJCWludGVybmFsU2V0U2VsZWN0aW9uKGN1cnJlbnRDb2x1bW4sIGN1cnJlbnRSb3csIHRydWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBTV1QuUEFHRV9VUDoKLQkJCWlmICh0b3BSb3cgPiAwKSB7Ci0JCQkJaWYgKCFmaXJlUmVxdWVzdFJvd0NoYW5nZUV2ZW50KCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQluZWVkVG9SZXF1ZXN0UkMgPSBmYWxzZTsKLQkJCQkKLQkJCQlpbnQgbmV3VG9wUm93ID0gdG9wUm93IC0gbnVtUm93c0luRGlzcGxheTsKLQkJCQlpZiAobmV3VG9wUm93IDwgMCkgewotCQkJCQluZXdUb3BSb3cgPSAwOwotCQkJCX0KLQkJCQlzZXRUb3BSb3cobmV3VG9wUm93KTsKLQkJCQlpbnRlcm5hbFNldFNlbGVjdGlvbihjdXJyZW50Q29sdW1uLCBjdXJyZW50Um93LCB0cnVlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBTV1QuUEFHRV9ET1dOOgotCQkJaWYgKHRvcFJvdyArIG51bVJvd3NWaXNpYmxlIDwgbnVtUm93c0luQ29sbGVjdGlvbikgewotCQkJCWlmICghZmlyZVJlcXVlc3RSb3dDaGFuZ2VFdmVudCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJbmVlZFRvUmVxdWVzdFJDID0gZmFsc2U7Ci0JCQkJCi0JCQkJaW50IG5ld1RvcFJvdyA9IHRvcFJvdyArIG51bVJvd3NWaXNpYmxlOwotCQkJCWlmIChuZXdUb3BSb3cgPj0gbnVtUm93c0luQ29sbGVjdGlvbiAtIDEpIHsKLQkJCQkJbmV3VG9wUm93ID0gbnVtUm93c0luQ29sbGVjdGlvbiAtIDE7Ci0JCQkJfQotCQkJCXNldFRvcFJvdyhuZXdUb3BSb3cpOwotCQkJCWlmIChjdXJyZW50Um93IDwgbnVtUm93c1Zpc2libGUpIHsKLQkJCQkJaW50ZXJuYWxTZXRTZWxlY3Rpb24oY3VycmVudENvbHVtbiwgY3VycmVudFJvdywgdHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW50ZXJuYWxTZXRTZWxlY3Rpb24oY3VycmVudENvbHVtbiwgbnVtUm93c1Zpc2libGUtMSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBrZXlUcmF2ZXJzZWQgZXZlbnQgb24gYW55IGNoaWxkIGNvbnRyb2wgaW4gdGhlIHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBzZW5kZXIgVGhlIHJvdyBzZW5kaW5nIHRoZSBldmVudC4KLQkgKiBAcGFyYW0gZSBUaGUgU1dUIFRyYXZlcnNlRXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVGFibGVSb3cgc2VuZGVyLCBUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkgewotCQkJaWYgKGN1cnJlbnRDb2x1bW4gPj0gc2VuZGVyLmdldE51bUNvbHVtbnMoKSAtIDEpIHsKLQkJCQllLmRldGFpbCA9IFNXVC5UUkFWRVJTRV9OT05FOwotCQkJCWhhbmRsZU5leHRSb3dOYXZpZ2F0aW9uKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykgewotCQkJaWYgKGN1cnJlbnRDb2x1bW4gPT0gMCkgewotCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQkJaGFuZGxlUHJldmlvdXNSb3dOYXZpZ2F0aW9uKHNlbmRlcik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJZS5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLQkJCWlmIChjdXJyZW50Q29sdW1uID49IHNlbmRlci5nZXROdW1Db2x1bW5zKCkgLSAxKSB7Ci0JCQkJaGFuZGxlTmV4dFJvd05hdmlnYXRpb24oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmZXJyZWRTZXRGb2N1cyhnZXRDb250cm9sKGN1cnJlbnRDb2x1bW4rMSwgY3VycmVudFJvdyksIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBTZWxlY3Rpb25MaXN0ZW5lciBmb3IgdGhlIHRhYmxlJ3Mgc2xpZGVyIGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBzbGlkZXJTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKHNsaWRlci5nZXRTZWxlY3Rpb24oKSA9PSB0b3BSb3cpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWlmICghZmlyZVJlcXVlc3RSb3dDaGFuZ2VFdmVudCgpKSB7Ci0JCQkJc2xpZGVyLnNldFNlbGVjdGlvbih0b3BSb3cpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJZGVzZWxlY3QoZ2V0Q29udHJvbChjdXJyZW50Q29sdW1uLCBjdXJyZW50Um93KSk7Ci0JCQkKLQkJCXNldFRvcFJvdyhzbGlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJZGVmZXJyZWRTZXRGb2N1cyhnZXRDb250cm9sKGN1cnJlbnRDb2x1bW4sIGN1cnJlbnRSb3cpLCB0cnVlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogU2Nyb2xsIHdoZWVsIGV2ZW50IGhhbmRsaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQotCQlpZiAoZXZlbnQuY291bnQgPiAwKSB7Ci0JCQlpZiAodG9wUm93ID4gMCkgewotCQkJCWlmICghZmlyZVJlcXVlc3RSb3dDaGFuZ2VFdmVudCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZGVzZWxlY3QoZ2V0Q29udHJvbChjdXJyZW50Q29sdW1uLCBjdXJyZW50Um93KSk7Ci0JCQkJc2V0VG9wUm93KHRvcFJvdyAtIDEpOwotCQkJCWRlZmVycmVkU2V0Rm9jdXMoZ2V0Q29udHJvbChjdXJyZW50Q29sdW1uLCBjdXJyZW50Um93KSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodG9wUm93IDwgbnVtUm93c0luQ29sbGVjdGlvbiAtIG51bVJvd3NWaXNpYmxlKSB7Ci0JCQkJaWYgKCFmaXJlUmVxdWVzdFJvd0NoYW5nZUV2ZW50KCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlkZXNlbGVjdChnZXRDb250cm9sKGN1cnJlbnRDb2x1bW4sIGN1cnJlbnRSb3cpKTsKLQkJCQlzZXRUb3BSb3codG9wUm93ICsgMSk7Ci0JCQkJZGVmZXJyZWRTZXRGb2N1cyhnZXRDb250cm9sKGN1cnJlbnRDb2x1bW4sIGN1cnJlbnRSb3cpLCB0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgZm9jdXNMb3N0IGV2ZW50cyBvbiBhbnkgY2hpbGQgY29udHJvbC4gIFRoaXMgaXMgbm90IGN1cnJlbnRseSB1c2VkLgotCSAqIAotCSAqIEBwYXJhbSBzZW5kZXIgVGhlIHJvdyBjb250YWluaW5nIHRoZSBzZW5kaW5nIGNvbnRyb2wuCi0JICogQHBhcmFtIGUgVGhlIFNXVCBGb2N1c0V2ZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChUYWJsZVJvdyBzZW5kZXIsIEZvY3VzRXZlbnQgZSkgewotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgZm9jdXNHYWluZWQgZXZlbnRzIG9uIGFueSBjaGlsZCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBzZW5kZXIgVGhlIHJvdyBjb250YWluaW5nIHRoZSBzZW5kaW5nIGNvbnRyb2wuCi0JICogQHBhcmFtIGUgVGhlIFNXVCBGb2N1c0V2ZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKFRhYmxlUm93IHNlbmRlciwgRm9jdXNFdmVudCBlKSB7Ci0JCWJvb2xlYW4gcm93Q2hhbmdlZCA9IGZhbHNlOwotCQlpZiAoZ2V0Um93TnVtYmVyKHNlbmRlcikgIT0gY3VycmVudFJvdykgewotCQkJaWYgKG5lZWRUb1JlcXVlc3RSQykgewotCQkJCWlmICghZmlyZVJlcXVlc3RSb3dDaGFuZ2VFdmVudCgpKSB7Ci0JCQkJCS8vIEdvIGJhY2sgaWYgd2UncmUgbm90IGFsbG93ZWQgdG8gYmUgaGVyZQotCQkJCQlkZWZlcnJlZFNldEZvY3VzKGdldENvbnRyb2woY3VycmVudENvbHVtbiwgY3VycmVudFJvdyksIGZhbHNlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW5lZWRUb1JlcXVlc3RSQyA9IHRydWU7Ci0JCQl9Ci0JCQlyb3dDaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCi0JCWN1cnJlbnRSb3cgPSBnZXRSb3dOdW1iZXIoc2VuZGVyKTsKLQkJY3VycmVudENvbHVtbiA9IHNlbmRlci5nZXRDb2x1bW5OdW1iZXIoKENvbnRyb2wpZS53aWRnZXQpOwotCQkKLQkJaWYgKHJvd0NoYW5nZWQpCi0JCQlmaXJlUm93QXJyaXZlRXZlbnQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQYWludExpc3RlbmVyIGhlYWRlclBhaW50TGlzdGVuZXIgPSBuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJaWYgKHBhcmVudC5ncmlkTGluZXNPbikgewotCQkJCWRyYXdHcmlkTGluZXMoZSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXByaXZhdGUgUGFpbnRMaXN0ZW5lciByb3dQYWludExpc3RlbmVyID0gbmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCWlmIChwYXJlbnQuZ3JpZExpbmVzT24pIHsKLQkJCQlkcmF3R3JpZExpbmVzKGUsIGZhbHNlKTsKLQkJCX0KLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSB2b2lkIGRyYXdHcmlkTGluZXMoUGFpbnRFdmVudCBlLCBib29sZWFuIGlzSGVhZGVyKSB7Ci0JCUNvbG9yIG9sZENvbG9yID0gZS5nYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCXRyeSB7Ci0JCQkvLyBHZXQgdGhlIGNvbG9ycyB3ZSBuZWVkCi0JCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCUNvbG9yIGxpbmVDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9EQVJLX1NIQURPVyk7Ci0JCQlDb2xvciBzZWNvbmRhcnlDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XKTsKLQkJCUNvbG9yIGhpbGlnaHRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9ISUdITElHSFRfU0hBRE9XKTsKLQkJCWlmICghaXNIZWFkZXIpIHsKLQkJCQlsaW5lQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfTElHSFRfU0hBRE9XKTsKLQkJCX0KLQkJCQotCQkJLy8gR2V0IHRoZSBjb250cm9sCi0JCQlDb250cm9sIHRvUGFpbnQgPSAoQ29udHJvbCkgZS53aWRnZXQ7Ci0JCQlQb2ludCBjb250cm9sU2l6ZSA9IHRvUGFpbnQuZ2V0U2l6ZSgpOwotCQkJCi0JCQkvLyBEcmF3IHRoZSBib3R0b20gbGluZShzKQotCQkJZS5nYy5zZXRGb3JlZ3JvdW5kKGxpbmVDb2xvcik7Ci0JCQllLmdjLmRyYXdMaW5lKDAsIGNvbnRyb2xTaXplLnktMSwgY29udHJvbFNpemUueCwgY29udHJvbFNpemUueS0xKTsKLQkJCWlmIChpc0hlYWRlcikgewotCQkJCWUuZ2Muc2V0Rm9yZWdyb3VuZChzZWNvbmRhcnlDb2xvcik7Ci0JCQkJZS5nYy5kcmF3TGluZSgwLCBjb250cm9sU2l6ZS55LTIsIGNvbnRyb2xTaXplLngsIGNvbnRyb2xTaXplLnktMik7Ci0JCQkJZS5nYy5zZXRGb3JlZ3JvdW5kKGhpbGlnaHRDb2xvcik7Ci0JCQkJZS5nYy5kcmF3TGluZSgwLCAxLCBjb250cm9sU2l6ZS54LCAxKTsKLQkJCX0KLQkJCQotCQkJLy8gTm93IGRyYXcgbGluZXMgYXJvdW5kIHRoZSBjaGlsZCBjb250cm9scywgaWYgdGhlcmUgYXJlIGFueQotCQkJaWYgKHRvUGFpbnQgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCQlDb21wb3NpdGUgcm93ID0gKENvbXBvc2l0ZSkgdG9QYWludDsKLQkJCQlDb250cm9sW10gY2hpbGRyZW4gPSByb3cuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVJlY3RhbmdsZSBjaGlsZEJvdW5kcyA9IGNoaWxkcmVuW2ldLmdldEJvdW5kcygpOwotCQkJCQkKLQkJCQkJLy8gUGFpbnQgdGhlIGJlZ2lubmluZyBsaW5lcwotCQkJCQlpZiAoaXNIZWFkZXIpIHsKLQkJCQkJCWUuZ2Muc2V0Rm9yZWdyb3VuZChoaWxpZ2h0Q29sb3IpOwotCQkJCQkJZS5nYy5kcmF3TGluZShjaGlsZEJvdW5kcy54LTIsIDEsIGNoaWxkQm91bmRzLngtMiwgY29udHJvbFNpemUueS0yKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gUGFpbnQgdGhlIGVuZGluZyBsaW5lcwotCQkJCQllLmdjLnNldEZvcmVncm91bmQobGluZUNvbG9yKTsKLQkJCQkJaW50IGxpbmVMZWZ0ID0gY2hpbGRCb3VuZHMueCArIGNoaWxkQm91bmRzLndpZHRoKzE7Ci0JCQkJCWUuZ2MuZHJhd0xpbmUobGluZUxlZnQsIDAsIGxpbmVMZWZ0LCBjb250cm9sU2l6ZS55KTsKLQkJCQkJaWYgKGlzSGVhZGVyKSB7Ci0JCQkJCQllLmdjLnNldEZvcmVncm91bmQoc2Vjb25kYXJ5Q29sb3IpOwotCQkJCQkJZS5nYy5kcmF3TGluZShsaW5lTGVmdC0xLCAwLCBsaW5lTGVmdC0xLCBjb250cm9sU2l6ZS55LTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZS5nYy5zZXRGb3JlZ3JvdW5kKG9sZENvbG9yKTsKLQkJfQotCX0KLQkKLQkvLyBFdmVudCBGaXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JLyoqCi0JICogRmlyZSB0aGUgcm93IGNvbnN0cnVjdGlvbiBldmVudAotCSAqIAotCSAqIEBwYXJhbSBuZXdDb250cm9sIFRoZSBuZXcgcm93J3MgU1dUIGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZVJvd0NvbnN0cnVjdGlvbkV2ZW50KENvbnRyb2wgbmV3Q29udHJvbCkgewotCQlmb3IgKEl0ZXJhdG9yIHJvd0NvbnN0cnVjdGlvbkxpc3RlbmVyc0l0ZXIgPSBwYXJlbnQucm93Q29uc3RydWN0aW9uTGlzdGVuZXJzLml0ZXJhdG9yKCk7IHJvd0NvbnN0cnVjdGlvbkxpc3RlbmVyc0l0ZXIuaGFzTmV4dCgpOykgewotCQkJSVJvd0NvbnN0cnVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKElSb3dDb25zdHJ1Y3Rpb25MaXN0ZW5lcikgcm93Q29uc3RydWN0aW9uTGlzdGVuZXJzSXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5yb3dDb25zdHJ1Y3RlZChuZXdDb250cm9sKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluZGljYXRlIHRvIGxpc3RlbmVycyB0aGF0IHRoZSBmb2N1cyBpcyBhcnJpdmluZyBvbiB0aGUgc3BlY2lmaWVkIHJvdwotCSAqLwotCXByaXZhdGUgdm9pZCBmaXJlUm93QXJyaXZlRXZlbnQoKSB7Ci0JCWlmIChyb3dzLnNpemUoKSA8IDEpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIHJvd0NoYW5nZUxpc3RlbmVyc0l0ZXIgPSBwYXJlbnQucm93Rm9jdXNMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgcm93Q2hhbmdlTGlzdGVuZXJzSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUm93Rm9jdXNMaXN0ZW5lciBsaXN0ZW5lciA9IChJUm93Rm9jdXNMaXN0ZW5lcikgcm93Q2hhbmdlTGlzdGVuZXJzSXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5hcnJpdmUocGFyZW50LCB0b3BSb3crY3VycmVudFJvdywgY3VycmVudFJvdygpLmdldFJvd0NvbnRyb2woKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0IHBlcm1pc3Npb24gZnJvbSBhbGwgbGlzdGVuZXJzIHRvIGxlYXZlIHRoZSBjdXJyZW50IHJvdy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgYWxsIGxpc3RlbmVycyBwZXJtaXQgdGhlIHJvdyBjaGFuZ2U7IGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZmlyZVJlcXVlc3RSb3dDaGFuZ2VFdmVudCgpIHsKLQkJaWYgKHJvd3Muc2l6ZSgpIDwgMSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGN1cnJlbnRSb3cgPiByb3dzLnNpemUoKS0xKSB7Ci0JCQkvLyAoaWYgdGhlIG90aGVyIHJvdyBpcyBhbHJlYWR5IGdvbmUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIHJvd0NoYW5nZUxpc3RlbmVyc0l0ZXIgPSBwYXJlbnQucm93Rm9jdXNMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgcm93Q2hhbmdlTGlzdGVuZXJzSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUm93Rm9jdXNMaXN0ZW5lciBsaXN0ZW5lciA9IChJUm93Rm9jdXNMaXN0ZW5lcikgcm93Q2hhbmdlTGlzdGVuZXJzSXRlci5uZXh0KCk7Ci0JCQlpZiAoIWxpc3RlbmVyLnJlcXVlc3RSb3dDaGFuZ2UocGFyZW50LCB0b3BSb3crY3VycmVudFJvdywgY3VycmVudFJvdygpLmdldFJvd0NvbnRyb2woKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZmlyZVJvd0RlcGFydEV2ZW50KCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlIHRvIGxpc3RlbmVycyB0aGF0IHRoZSBmb2N1cyBpcyBhYm91dCB0byBsZWF2ZSB0aGUgY3VycmVudCByb3cuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVSb3dEZXBhcnRFdmVudCgpIHsKLQkJaWYgKHJvd3Muc2l6ZSgpIDwgMSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3Igcm93Q2hhbmdlTGlzdGVuZXJzSXRlciA9IHBhcmVudC5yb3dGb2N1c0xpc3RlbmVycy5pdGVyYXRvcigpOyByb3dDaGFuZ2VMaXN0ZW5lcnNJdGVyLmhhc05leHQoKTspIHsKLQkJCUlSb3dGb2N1c0xpc3RlbmVyIGxpc3RlbmVyID0gKElSb3dGb2N1c0xpc3RlbmVyKSByb3dDaGFuZ2VMaXN0ZW5lcnNJdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLmRlcGFydChwYXJlbnQsIHRvcFJvdytjdXJyZW50Um93LCBjdXJyZW50Um93KCkuZ2V0Um93Q29udHJvbCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcXVlc3QgZGVsZXRpb24gb2YgdGhlIGN1cnJlbnQgcm93IGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmUuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBkZWxldGlvbiB3YXMgc3VjY2Vzc2Z1bDsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmaXJlRGVsZXRlRXZlbnQoKSB7Ci0JCWlmIChwYXJlbnQuZGVsZXRlSGFuZGxlcnMuc2l6ZSgpIDwgMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpbnQgYWJzb2x1dGVSb3cgPSB0b3BSb3cgKyBjdXJyZW50Um93OwotCQlmb3IgKEl0ZXJhdG9yIGRlbGV0ZUhhbmRsZXJzSXRlciA9IHBhcmVudC5kZWxldGVIYW5kbGVycy5pdGVyYXRvcigpOyBkZWxldGVIYW5kbGVyc0l0ZXIuaGFzTmV4dCgpOykgewotCQkJSURlbGV0ZUhhbmRsZXIgaGFuZGxlciA9IChJRGVsZXRlSGFuZGxlcikgZGVsZXRlSGFuZGxlcnNJdGVyLm5leHQoKTsKLQkJCWlmICghaGFuZGxlci5jYW5EZWxldGUoYWJzb2x1dGVSb3cpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgZGVsZXRlSGFuZGxlcnNJdGVyID0gcGFyZW50LmRlbGV0ZUhhbmRsZXJzLml0ZXJhdG9yKCk7IGRlbGV0ZUhhbmRsZXJzSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJRGVsZXRlSGFuZGxlciBoYW5kbGVyID0gKElEZWxldGVIYW5kbGVyKSBkZWxldGVIYW5kbGVyc0l0ZXIubmV4dCgpOwotCQkJaGFuZGxlci5kZWxldGVSb3coYWJzb2x1dGVSb3cpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXF1ZXN0IHRoYXQgdGhlIG1vZGVsIGluc2VydCBhIG5ldyByb3cgaW50byBpdHNlbGYuCi0JICogCi0JICogQHJldHVybiBUaGUgMC1iYXNlZCBvZmZzZXQgb2YgdGhlIG5ldyByb3cgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGNvbGxlY3Rpb24gb3IgLTEgaWYgYSAKLQkgKiBuZXcgcm93IGNvdWxkIG5vdCBiZSBpbnNlcnRlZC4KLQkgKi8KLQlwcml2YXRlIGludCBmaXJlSW5zZXJ0RXZlbnQoKSB7Ci0JCWlmIChwYXJlbnQuaW5zZXJ0SGFuZGxlcnMuc2l6ZSgpIDwgMSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGluc2VydEhhbmRsZXJzSXRlciA9IHBhcmVudC5pbnNlcnRIYW5kbGVycy5pdGVyYXRvcigpOyBpbnNlcnRIYW5kbGVyc0l0ZXIuaGFzTmV4dCgpOykgewotCQkJSUluc2VydEhhbmRsZXIgaGFuZGxlciA9IChJSW5zZXJ0SGFuZGxlcikgaW5zZXJ0SGFuZGxlcnNJdGVyLm5leHQoKTsKLQkJCWludCByZXN1bHRSb3cgPSBoYW5kbGVyLmluc2VydCh0b3BSb3crY3VycmVudFJvdyk7Ci0JCQlpZiAocmVzdWx0Um93ID49IDApIHsKLQkJCQlyZXR1cm4gcmVzdWx0Um93OwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLy8gRXZlbnQgSGFuZGxpbmcsIHV0aWxpdHkgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHdpZGdldCdzIHNlbGVjdGlvbiB0byBhbiBlbXB0eSBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHdpZGdldCBUaGUgd2lkZ2V0IHRvIGRlc2VsZWN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGRlc2VsZWN0KFdpZGdldCB3aWRnZXQpIHsKLQkJaWYgKER1Y2tUeXBlLmluc3RhbmNlT2YoSVNlbGVjdGFibGVSZWdpb25Db250cm9sLmNsYXNzLCB3aWRnZXQpKSB7Ci0JCQlJU2VsZWN0YWJsZVJlZ2lvbkNvbnRyb2wgY29udHJvbCA9IChJU2VsZWN0YWJsZVJlZ2lvbkNvbnRyb2wpIER1Y2tUeXBlLmltcGxlbWVudChJU2VsZWN0YWJsZVJlZ2lvbkNvbnRyb2wuY2xhc3MsIHdpZGdldCk7Ci0JCQljb250cm9sLnNldFNlbGVjdGlvbigwLCAwKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUcnkgdG8gZ28gdG8gdGhlIG5leHQgcm93IGluIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVOZXh0Um93TmF2aWdhdGlvbigpIHsKLQkJaWYgKGN1cnJlbnRSb3cgPCBudW1Sb3dzVmlzaWJsZS0xKSB7Ci0JCQlpZiAoIWZpcmVSZXF1ZXN0Um93Q2hhbmdlRXZlbnQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCW5lZWRUb1JlcXVlc3RSQyA9IGZhbHNlOwotCQkJCi0JCQlkZXNlbGVjdChnZXRDb250cm9sKGN1cnJlbnRDb2x1bW4sIGN1cnJlbnRSb3cpKTsKLQkJCQotCQkJZGVmZXJyZWRTZXRGb2N1cyhnZXRDb250cm9sKDAsIGN1cnJlbnRSb3crMSksIGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICh0b3BSb3cgKyBudW1Sb3dzVmlzaWJsZSA+PSBudW1Sb3dzSW5Db2xsZWN0aW9uKSB7Ci0JCQkJLy8gV2UncmUgYXQgdGhlIGVuZDsgZG9uJ3QgZ28gYW55d2hlcmUKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBXZSBoYXZlIHRvIHNjcm9sbCBmb3J3YXJkcwotCQkJaWYgKCFmaXJlUmVxdWVzdFJvd0NoYW5nZUV2ZW50KCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQluZWVkVG9SZXF1ZXN0UkMgPSBmYWxzZTsKLQkJCQotCQkJZGVzZWxlY3QoZ2V0Q29udHJvbChjdXJyZW50Q29sdW1uLCBjdXJyZW50Um93KSk7Ci0JCQkKLQkJCXNldFRvcFJvdyh0b3BSb3crMSk7Ci0JCQlkZWZlcnJlZFNldEZvY3VzKGdldENvbnRyb2woMCwgY3VycmVudFJvdyksIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVHJ5IHRvIGdvIHRvIHRoZSBwcmV2aW91cyByb3cgaW4gdGhlIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJvdyBUaGUgY3VycmVudCB0YWJsZSByb3cuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVByZXZpb3VzUm93TmF2aWdhdGlvbihUYWJsZVJvdyByb3cpIHsKLQkJaWYgKGN1cnJlbnRSb3cgPT0gMCkgewotCQkJaWYgKHRvcFJvdyA9PSAwKSB7Ci0JCQkJLy8gV2UncmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFibGU7IGRvbid0IGdvIGFueXdoZXJlCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gV2UgaGF2ZSB0byBzY3JvbGwgYmFja3dhcmRzCi0JCQlpZiAoIWZpcmVSZXF1ZXN0Um93Q2hhbmdlRXZlbnQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCW5lZWRUb1JlcXVlc3RSQyA9IGZhbHNlOwotCQkJCi0JCQlkZXNlbGVjdChnZXRDb250cm9sKGN1cnJlbnRDb2x1bW4sIGN1cnJlbnRSb3cpKTsKLQkJCQotCQkJc2V0VG9wUm93KHRvcFJvdy0xKTsKLQkJCWRlZmVycmVkU2V0Rm9jdXMoZ2V0Q29udHJvbChyb3cuZ2V0TnVtQ29sdW1ucygpLTEsIDApLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghZmlyZVJlcXVlc3RSb3dDaGFuZ2VFdmVudCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbmVlZFRvUmVxdWVzdFJDID0gZmFsc2U7Ci0JCQkKLQkJCWRlc2VsZWN0KGdldENvbnRyb2woY3VycmVudENvbHVtbiwgY3VycmVudFJvdykpOwotCQkJCi0JCQlkZWZlcnJlZFNldEZvY3VzKGdldENvbnRyb2wocm93LmdldE51bUNvbHVtbnMoKS0xLCBjdXJyZW50Um93LTEpLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IFRhYmxlUm93LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgVGFibGVSb3cKLQkgKi8KLQlwcml2YXRlIFRhYmxlUm93IGN1cnJlbnRSb3coKSB7Ci0JCWlmIChjdXJyZW50Um93ID4gcm93cy5zaXplKCktMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChUYWJsZVJvdykgcm93cy5nZXQoY3VycmVudFJvdyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIFNXVCBjb250cm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgcm93LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcm93IGNvbnRyb2wuCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q3VycmVudFJvd0NvbnRyb2woKSB7Ci0JCVRhYmxlUm93IGN1cnJlbnRSb3cgPSBjdXJyZW50Um93KCk7Ci0JCWlmIChjdXJyZW50Um93ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBjdXJyZW50Um93KCkuZ2V0Um93Q29udHJvbCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFRhYmxlUm93IGJ5IHRoZSBzcGVjaWZpZWQgMC1iYXNlZCBvZmZzZXQgZnJvbSB0aGUgdG9wIHZpc2libGUgcm93LgotCSAqIAotCSAqIEBwYXJhbSByb3dOdW1iZXIgMC1iYXNlZCBvZmZzZXQgb2YgdGhlIHJlcXVlc3RlZCBmb3cgc3RhcnRpbmcgZnJvbSB0aGUgdG9wIHZpc2libGUgcm93LgotCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgVGFibGVSb3cgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgotCSAqLwotCXByaXZhdGUgVGFibGVSb3cgZ2V0Um93QnlOdW1iZXIoaW50IHJvd051bWJlcikgewotCQlpZiAocm93TnVtYmVyID4gcm93cy5zaXplKCktMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChUYWJsZVJvdykgcm93cy5nZXQocm93TnVtYmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBTV1QgY29udHJvbCBhdCAoY29sdW1uLCByb3cpLCB3aGVyZSByb3cgaXMgYSAwLWJhc2VkIG51bWJlciBzdGFydGluZwotCSAqIGZyb20gdGhlIHRvcCB2aXNpYmxlIHJvdy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uIHRoZSAwLWJhc2VkIGNvbHVtbi4KLQkgKiBAcGFyYW0gcm93IHRoZSAwLWJhc2VkIHJvdyBzdGFydGluZyBmcm9tIHRoZSB0b3AgdmlzaWJsZSByb3cuCi0JICogQHJldHVybiB0aGUgU1dUIGNvbnRyb2wgYXQgKGNvbHVtbiwgcm93KQotCSAqLwotCXByaXZhdGUgQ29udHJvbCBnZXRDb250cm9sKGludCBjb2x1bW4sIGludCByb3cpIHsKLQkJVGFibGVSb3cgcm93T2JqZWN0ID0gZ2V0Um93QnlOdW1iZXIocm93KTsKLQkJaWYgKHJvd09iamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiUmVxdWVzdCBmb3IgYSBub25leGlzdGVudCByb3ciKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUNvbnRyb2wgcmVzdWx0ID0gcm93T2JqZWN0LmdldENvbHVtbkNvbnRyb2woY29sdW1uKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIDAtYmFzZWQgcm93IG51bWJlciBjb3JyZXNwb25kaW5nIHRvIGEgcGFydGljdWxhciBUYWJsZVJvdyBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHJvdyBUaGUgVGFibGVSb3cgdG8gdHJhbnNsYXRlIHRvIHJvdyBjb29yZGluYXRlcy4KLQkgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIHJvdyBudW1iZXIgb3IgLTEgaWYgdGhlIHNwZWNpZmllZCBUYWJsZVJvdyBpcyBub3QgdmlzaWJsZS4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRSb3dOdW1iZXIoVGFibGVSb3cgcm93KSB7Ci0JCWludCByb3dOdW1iZXIgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIHJvd0l0ZXIgPSByb3dzLml0ZXJhdG9yKCk7IHJvd0l0ZXIuaGFzTmV4dCgpOykgewotCQkJVGFibGVSb3cgY2FuZGlkYXRlID0gKFRhYmxlUm93KSByb3dJdGVyLm5leHQoKTsKLQkJCWlmIChjYW5kaWRhdGUgPT0gcm93KSB7Ci0JCQkJcmV0dXJuIHJvd051bWJlcjsKLQkJCX0KLQkJCSsrcm93TnVtYmVyOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGZvY3VzIHRvIHRoZSBzcGVjaWZpZWQgKGNvbHVtbiwgcm93KS4gIElmIHJvd0NoYW5nZSBpcyB0cnVlLCBmaXJlIGEKLQkgKiByb3cgY2hhbmdlIGV2ZW50LCBvdGhlcndpc2UgYmUgc2lsZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb2x1bW4gVGhlIDAtYmFzZWQgY29sdW1uIHRvIGZvY3VzCi0JICogQHBhcmFtIHJvdyBUaGUgMC1iYXNlZCByb3cgdG8gZm9jdXMKLQkgKiBAcGFyYW0gcm93Q2hhbmdlIHRydWUgaWYgYSByb3cgY2hhbmdlIGV2ZW50IHNob3VsZCBiZSBmaXJlZDsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFNldFNlbGVjdGlvbihpbnQgY29sdW1uLCBpbnQgcm93LCBib29sZWFuIHJvd0NoYW5nZSkgewotCQlDb250cm9sIHRvRm9jdXMgPSBnZXRDb250cm9sKGNvbHVtbiwgcm93KTsKLQkJZGVmZXJyZWRTZXRGb2N1cyh0b0ZvY3VzLCByb3dDaGFuZ2UpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZm9jdXMgdG8gdGhlIHNwZWNpZmllZCBjb250cm9sIGFmdGVyIGFsbG93aW5nIGFsbCBwZW5kaW5nIGV2ZW50cyB0byBjb21wbGV0ZQotCSAqIGZpcnN0LiAgSWYgcm93Q2hhbmdlIGlzIHRydWUsIGZpcmUgYSByb3cgYXJyaXZlIGV2ZW50IGFmdGVyIHRoZSBmb2N1cyBoYXMgYmVlbiBzZXQuCi0JICogCi0JICogQHBhcmFtIHRvRm9jdXMgVGhlIFNXVCBDb250cm9sIHRvIGZvY3VzCi0JICogQHBhcmFtIHJvd0NoYW5nZSB0cnVlIGlmIHRoZSByb3dBcnJpdmUgZXZlbnQgc2hvdWxkIGJlIGZpcmVkOyBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlZmVycmVkU2V0Rm9jdXMoZmluYWwgQ29udHJvbCB0b0ZvY3VzLCBmaW5hbCBib29sZWFuIHJvd0NoYW5nZSkgewotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRvRm9jdXMuc2V0Rm9jdXMoKTsKLQkJCQlpZiAocm93Q2hhbmdlKSB7Ci0JCQkJCWZpcmVSb3dBcnJpdmVFdmVudCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvaW50ZXJuYWwvRW1wdHlUYWJsZVBsYWNlaG9sZGVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvaW50ZXJuYWwvRW1wdHlUYWJsZVBsYWNlaG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTg0NTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL2ludGVybmFsL0VtcHR5VGFibGVQbGFjZWhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgT3JtZSA8ZGpvQGNvY29udXQtcGFsbS1zb2Z0d2FyZS5jb20+Ci0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIE9ybWUgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5jb21wb3NpdGV0YWJsZS5JbnRlcm5hbENvbXBvc2l0ZVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBDbGFzcyBFbXB0eVRhYmxlUGxhY2Vob2xkZXIuICBBbiBTV1QgY29udHJvbCB0aGF0IGlzIGRpc3BsYXllZCBpbiB0aGUgdGFibGUgd2hlbgotICogdGhlcmUgYXJlIG5vIHJvd3MgdG8gZGlzcGxheS4gIEl0IGhhcyBmb3VyIHB1cnBvc2VzOgotICogCi0gKiA8dWw+Ci0gKiA8bGk+UHJvbXB0IHRoZSB1c2VyIHRvIGhpdCA8SU5TPiB0byBpbnNlcnQgYSBuZXcgKGZpcnN0KSByb3cuCi0gKiA8bGk+SW5kaWNhdGUgaWYgdGhlIHRhYmxlIGhhcyBmb2N1cyB1c2luZyBhIGRhc2hlZCBsaW5lIGFyb3VuZCB0aGUgb3V0c2lkZS4KLSAqIDxsaT5BY3R1YWxseSBhY2NlcHQgZm9jdXMgZm9yIHRoZSB0YWJsZSB3aGVuIHRoZXJlIGFyZSBubyBvdGhlciBjb250cm9scyB0byBkbyBzby4KLSAqIDxsaT5Gb3J3YXJkIHRoZSBpbnNlcnQga2V5IGV2ZW50IGJhY2sgdG8gdGhlIHRhYmxlIHdoZW4gdGhlIHVzZXIgbmVlZHMgdG8gaW5zZXJ0IGEgcm93LgotICogPC91bD4KLSAqIAotICogQGF1dGhvciBkam8KLSAqLwotcHVibGljIGNsYXNzIEVtcHR5VGFibGVQbGFjZWhvbGRlciBleHRlbmRzIENhbnZhcyB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZm9jdXNDb250cm9sID0gZmFsc2U7Ci0JcHJpdmF0ZSBJbnRlcm5hbENvbXBvc2l0ZVRhYmxlIHBhcmVudFRhYmxlID0gbnVsbDsKLQkKLQlwcml2YXRlIGZpbmFsIENvbG9yIFJFRDsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBFbXB0eVRhYmxlUGxhY2Vob2xkZXIuICBDb25zdHJ1Y3QgYW4gRW1wdHlUYWJsZVBsYWNlaG9sZGVyIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gc3R5bGUgU3R5bGUgYml0cy4gIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyB3aGF0IENhbnZhcyBhY2NlcHRzLgotCSAqLwotCXB1YmxpYyBFbXB0eVRhYmxlUGxhY2Vob2xkZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlwYXJlbnRUYWJsZSA9IChJbnRlcm5hbENvbXBvc2l0ZVRhYmxlKSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCQotCQlwYXJlbnQuYWRkQ29udHJvbExpc3RlbmVyKGNvbnRyb2xMaXN0ZW5lcik7Ci0JCQotCQlhZGRUcmF2ZXJzZUxpc3RlbmVyKHRyYXZlcnNlTGlzdGVuZXIpOwotCQlhZGRGb2N1c0xpc3RlbmVyKGZvY3VzTGlzdGVuZXIpOwotCQlhZGRLZXlMaXN0ZW5lcihrZXlMaXN0ZW5lcik7Ci0JCWFkZFBhaW50TGlzdGVuZXIocGFpbnRMaXN0ZW5lcik7Ci0JCWFkZERpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlTGlzdGVuZXIpOwotCQkKLQkJUkVEID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JCXNldEJhY2tncm91bmQoZ2V0UGFyZW50KCkuZ2V0QmFja2dyb3VuZCgpKTsKLQkJCi0JCXJlc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIE1ha2Ugc3VyZSB3ZSByZW1vdmUgb3VyIGxpc3RlbmVycy4uLgotCSAqLwotCXByaXZhdGUgRGlzcG9zZUxpc3RlbmVyIGRpc3Bvc2VMaXN0ZW5lciA9IG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQlyZW1vdmVUcmF2ZXJzZUxpc3RlbmVyKHRyYXZlcnNlTGlzdGVuZXIpOwotCQkJcmVtb3ZlRm9jdXNMaXN0ZW5lcihmb2N1c0xpc3RlbmVyKTsKLQkJCXJlbW92ZUtleUxpc3RlbmVyKGtleUxpc3RlbmVyKTsKLQkJCXJlbW92ZVBhaW50TGlzdGVuZXIocGFpbnRMaXN0ZW5lcik7Ci0JCQlyZW1vdmVEaXNwb3NlTGlzdGVuZXIoZGlzcG9zZUxpc3RlbmVyKTsKLQkJCQotCQkJZ2V0UGFyZW50KCkucmVtb3ZlQ29udHJvbExpc3RlbmVyKGNvbnRyb2xMaXN0ZW5lcik7Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIEhhbmRsZSByZXNpemUgZXZlbnRzIHNvIHdlIGNhbiByZWRyYXcgb3Vyc2VsdmVzIGNvcnJlY3RseS4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2xMaXN0ZW5lciBjb250cm9sTGlzdGVuZXIgPSBuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQlyZXNpemUoKTsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogQWN0dWFsbHkgcmVzaXplIG91cnNlbGYuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2l6ZSgpIHsKLQkJUG9pbnQgaGVhZGVyU2l6ZSA9IG5ldyBQb2ludCgwLCAwKTsKLQkJQ29udHJvbCBoZWFkZXIgPSBwYXJlbnRUYWJsZS5nZXRIZWFkZXJDb250cm9sKCk7Ci0JCWlmIChoZWFkZXIgIT0gbnVsbCkgewotCQkJaGVhZGVyU2l6ZSA9IGhlYWRlci5nZXRTaXplKCk7Ci0JCX0KLQkJUG9pbnQgcGFyZW50U2l6ZSA9IGdldFBhcmVudCgpLmdldFNpemUoKTsKLQkJCi0JCXNldEJvdW5kcygwLCBoZWFkZXJTaXplLnkrMiwgcGFyZW50U2l6ZS54LTQsIHBhcmVudFNpemUueSAtIGhlYWRlclNpemUueS02KTsKLQl9Ci0KLQkKLQkvLyBUaGUgbWVzc2FnZSBwcm9wZXJ0eQotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2UgPSAiUHJlc3MgW0lOU10gdG8gY3JlYXRlIGEgbmV3IHJvdy4iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9tcHQgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGluc2lkZSB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBwcm9tcHQgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGluc2lkZSB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCXJlZHJhdygpOwotCX0KLQotCS8qKgotCSAqIFBhaW50IHRoZSBjb250cm9sLgotCSAqLwotCXByaXZhdGUgUGFpbnRMaXN0ZW5lciBwYWludExpc3RlbmVyID0gbmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCUNvbG9yIG9sZENvbG9yID0gZS5nYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQlpbnQgb2xkTGluZVN0eWxlID0gZS5nYy5nZXRMaW5lU3R5bGUoKTsKLQkJCWludCBvbGRMaW5lV2lkdGggPSBlLmdjLmdldExpbmVXaWR0aCgpOwotCQkJdHJ5IHsKLQkJCQlpZiAoZm9jdXNDb250cm9sKSB7Ci0JCQkJCWUuZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RBU0gpOwotCQkJCQllLmdjLnNldExpbmVXaWR0aCgyKTsKLQkJCQkJUG9pbnQgcGFyZW50U2l6ZSA9IGdldFNpemUoKTsKLQkJCQkJZS5nYy5kcmF3UmVjdGFuZ2xlKDEsIDIsIHBhcmVudFNpemUueC0yLCBwYXJlbnRTaXplLnktMyk7Ci0JCQkJfQotCi0JCQkJZS5nYy5zZXRGb3JlZ3JvdW5kKFJFRCk7Ci0JCQkJZS5nYy5kcmF3VGV4dChnZXRNZXNzYWdlKCksIDMsIDMpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQllLmdjLnNldEZvcmVncm91bmQob2xkQ29sb3IpOwotCQkJCWUuZ2Muc2V0TGluZVN0eWxlKG9sZExpbmVTdHlsZSk7Ci0JCQkJZS5nYy5zZXRMaW5lV2lkdGgob2xkTGluZVdpZHRoKTsKLQkJCX0KLQkJfQotCX07Ci0JCi0JLyoqCi0JICogV2hlbiB3ZSBnYWluL2xvc2UgZm9jdXMsIHJlZHJhdyBvdXJzZWx2ZXMgYXBwcm9wcmlhdGVseQotCSAqLwotCXByaXZhdGUgRm9jdXNMaXN0ZW5lciBmb2N1c0xpc3RlbmVyID0gbmV3IEZvY3VzTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJZm9jdXNDb250cm9sID0gdHJ1ZTsKLQkJCXJlZHJhdygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCWZvY3VzQ29udHJvbCA9IGZhbHNlOwotCQkJcmVkcmF3KCk7Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIFBlcm1pdCBmb2N1cyBldmVudHMgdmlhIGtleWJvYXJkLgotCSAqLwotCXByaXZhdGUgVHJhdmVyc2VMaXN0ZW5lciB0cmF2ZXJzZUxpc3RlbmVyID0gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCSBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIEZvcndhcmQgdGhlIGluc2VydCBrZXkgYmFjayB0byBvdXIgcGFyZW50IGZvciBoYW5kbGluZy4KLQkgKi8KLQlwcml2YXRlIEtleUxpc3RlbmVyIGtleUxpc3RlbmVyID0gbmV3IEtleUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCWlmIChlLmtleUNvZGUgPT0gU1dULklOU0VSVCkKLQkJCQlwYXJlbnRUYWJsZS5rZXlQcmVzc2VkKG51bGwsIGUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJfQotCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS9pbnRlcm5hbC9JU2VsZWN0YWJsZVJlZ2lvbkNvbnRyb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS9pbnRlcm5hbC9JU2VsZWN0YWJsZVJlZ2lvbkNvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiNThlMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvaW50ZXJuYWwvSVNlbGVjdGFibGVSZWdpb25Db250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIE9ybWUgPGRqb0Bjb2NvbnV0LXBhbG0tc29mdHdhcmUuY29tPgotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBPcm1lICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLmNvbXBvc2l0ZXRhYmxlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGR1Y2sgaW50ZXJmYWNlIGZvciBjb250cm9scyB0aGF0IGNhbiBzZWxlY3QgYSBzcGVjaWZpYyByYW5nZSBhY2NvcmRpbmcgdG8gU1dUIAotICogcmFuZ2Ugc2VsZWN0aW9uIHNlbWFudGljcy4KLSAqIAotICogQGF1dGhvciBkam8KLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VsZWN0YWJsZVJlZ2lvbkNvbnRyb2wgewotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiB0byB0aGUgcmFuZ2Ugc3BlY2lmaWVkCi0JICogYnkgdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgaW5kaWNlcy4KLQkgKiA8cD4KLQkgKiBJbmRleGluZyBpcyB6ZXJvIGJhc2VkLiAgVGhlIHJhbmdlIG9mCi0JICogYSBzZWxlY3Rpb24gaXMgZnJvbSAwLi5OIHdoZXJlIE4gaXMKLQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHdpZGdldC4KLQkgKiA8L3A+PHA+Ci0JICogVGV4dCBzZWxlY3Rpb25zIGFyZSBzcGVjaWZpZWQgaW4gdGVybXMgb2YKLQkgKiBjYXJldCBwb3NpdGlvbnMuICBJbiBhIHRleHQgd2lkZ2V0IHRoYXQKLQkgKiBjb250YWlucyBOIGNoYXJhY3RlcnMsIHRoZXJlIGFyZSBOKzEgY2FyZXQKLQkgKiBwb3NpdGlvbnMsIHJhbmdpbmcgZnJvbSAwLi5OLiAgVGhpcyBkaWZmZXJzCi0JICogZnJvbSBvdGhlciBmdW5jdGlvbnMgdGhhdCBhZGRyZXNzIGNoYXJhY3RlcgotCSAqIHBvc2l0aW9uIHN1Y2ggYXMgZ2V0VGV4dCAoKSB0aGF0IHVzZSB0aGUKLQkgKiB1c3VhbCBhcnJheSBpbmRleGluZyBydWxlcy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZQotCSAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZiB0aGUgcmFuZ2UKLQkgKgotCSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLQkgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLQkgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24gKGludCBzdGFydCwgaW50IGVuZCk7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvaW50ZXJuYWwvVGFibGVSb3cuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS9pbnRlcm5hbC9UYWJsZVJvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjc3MzBmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS9pbnRlcm5hbC9UYWJsZVJvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgT3JtZSA8ZGpvQGNvY29udXQtcGFsbS1zb2Z0d2FyZS5jb20+Ci0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIE9ybWUgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5jb21wb3NpdGV0YWJsZS5JbnRlcm5hbENvbXBvc2l0ZVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIENsYXNzIFRhYmxlUm93LiAgRW5jYXBzdWxhdGVzIG9wZXJhdGlvbnMgb24gYSBTV1Qgcm93IGNvbnRyb2wuICBEaXNjb3ZlcnMgdGhlIAotICogU1dUIGNvbnRyb2xzIGluc2lkZSB0aGUgcm93IGNvbnRyb2wgcmVwcmVzZW50aW5nIGNvbHVtbnMgYW5kIGV4cG9zZXMgdGhvc2UgZm9yCi0gKiBvcGVyYXRpb25zIGJ5IHRoZSBDb21wb3NpdGVUYWJsZS4gIExpc3RlbnMgdG8gU1dUIGV2ZW50cyBvbiB0aGUgY29sdW1uIGNvbnRyb2xzCi0gKiBhbmQgZm9yd2FyZHMgdGhlbSBiYWNrIHRvIHRoZSB0YWJsZSBjb250cm9sIGZvciBwcm9jZXNzaW5nLgotICogCi0gKiBAYXV0aG9yIGRqbwotICovCi1wdWJsaWMgY2xhc3MgVGFibGVSb3cgewotCXByaXZhdGUgQ29udHJvbCByb3c7Ci0JcHJpdmF0ZSBDb250cm9sW10gY29sdW1uczsKLQlwcm90ZWN0ZWQgSW50ZXJuYWxDb21wb3NpdGVUYWJsZSBwYXJlbnQ7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgVGFibGVSb3cuICBDb25zdHJ1Y3QgYSBUYWJsZVJvdyBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBUaGUgdGFibGUgY29udGFpbmluZyB0aGlzIHJvdy4KLQkgKiBAcGFyYW0gcm93IFRoZSBTV1QgY29udHJvbCBpbXBsZW1lbnRpbmcgdGhpcyByb3cuCi0JICovCi0JcHVibGljIFRhYmxlUm93KEludGVybmFsQ29tcG9zaXRlVGFibGUgcGFyZW50LCBDb250cm9sIHJvdykgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5yb3cgPSByb3c7Ci0JCWlmIChyb3cgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCUNvbXBvc2l0ZSByb3dDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSByb3c7Ci0JCQljb2x1bW5zID0gcm93Q29tcG9zaXRlLmdldFRhYkxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCWNvbHVtbnMgPSBuZXcgQ29udHJvbFtdIHtyb3d9OwotCQl9Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCWFkZExpc3RlbmVycyhjb2x1bW5zW2ldKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgYWxsIGxpc3RlbmVycyBmcm9tIGVhY2ggY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCXJlbW92ZUxpc3RlbmVycyhjb2x1bW5zW2ldKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzIHRvIGVhY2ggY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB0byBsaXN0ZW4gdG8uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhDb250cm9sIGNvbnRyb2wpIHsKLQkJY29udHJvbC5hZGRLZXlMaXN0ZW5lcihrZXlMaXN0ZW5lcik7Ci0JCWNvbnRyb2wuYWRkRm9jdXNMaXN0ZW5lcihmb2N1c0xpc3RlbmVyKTsKLQkJY29udHJvbC5hZGRUcmF2ZXJzZUxpc3RlbmVyKHRyYXZlcnNlTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgbGlzdGVuZXJzIGZyb20gZWFjaCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIHRvIG5vIGxvbmdlciBsaXN0ZW4gdG8uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUxpc3RlbmVycyhDb250cm9sIGNvbnRyb2wpIHsKLQkJY29udHJvbC5yZW1vdmVLZXlMaXN0ZW5lcihrZXlMaXN0ZW5lcik7Ci0JCWNvbnRyb2wucmVtb3ZlRm9jdXNMaXN0ZW5lcihmb2N1c0xpc3RlbmVyKTsKLQkJY29udHJvbC5yZW1vdmVUcmF2ZXJzZUxpc3RlbmVyKHRyYXZlcnNlTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBGb3J3YXJkIGtleSBwcmVzc2VzIHRvIHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXByaXZhdGUgS2V5TGlzdGVuZXIga2V5TGlzdGVuZXIgPSBuZXcgS2V5QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQlwYXJlbnQua2V5UHJlc3NlZChUYWJsZVJvdy50aGlzLCBlKTsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogRm9yd2FyZCBmb2N1c2UgZXZlbnRzIHRvIHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXByaXZhdGUgRm9jdXNMaXN0ZW5lciBmb2N1c0xpc3RlbmVyID0gbmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJcGFyZW50LmZvY3VzTG9zdChUYWJsZVJvdy50aGlzLCBlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCXBhcmVudC5mb2N1c0dhaW5lZChUYWJsZVJvdy50aGlzLCBlKTsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogRm9yd2FyZCB0cmF2ZXJzZSBldmVudHMgdG8gdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHJpdmF0ZSBUcmF2ZXJzZUxpc3RlbmVyIHRyYXZlcnNlTGlzdGVuZXIgPSBuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJcGFyZW50LmtleVRyYXZlcnNlZChUYWJsZVJvdy50aGlzLCBlKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFNXVCBjb250cm9sIGltcGxlbWVudGluZyB0aGUgcm93J3MgR1VJLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHJvdydzIFNXVCBjb250cm9sCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Um93Q29udHJvbCgpIHsKLQkJcmV0dXJuIHJvdzsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBTV1QgY29udHJvbCBjb3JyZXNwb25kaW5nIHRvIGEgcGFydGljdWxhciBjb2x1bW4gd2l0aGluCi0JICogdGhpcyByb3cuCi0JICogCi0JICogQHBhcmFtIGkgdGhlIDAtYmFzZWQgb2Zmc2V0IG9mIHRoZSBjb2x1bW4gdG8gcmV0dXJuLgotCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgY29udHJvbAotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbHVtbkNvbnRyb2woaW50IGkpIHsKLQkJcmV0dXJuIGNvbHVtbnNbaV07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY29sdW1uIG51bWJlciBvZiBhIHNwZWNpZmllZCBTV1QgY29udHJvbCBvciAtMSBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZmluZC4KLQkgKiBAcmV0dXJuIGNvbnRyb2wncyBjb2x1bW4gbnVtYmVyIG9yIC0xIGlmIHRoYXQgY29sdW1uIGNvbnRyb2wgaXMgbm90IGluIHRoaXMgcm93LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKENvbnRyb2wgY29udHJvbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb2x1bW5zW2ldID09IGNvbnRyb2wpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhpcyByb3cuCi0JICogCi0JICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhpcyByb3cuCi0JICovCi0JcHVibGljIGludCBnZXROdW1Db2x1bW5zKCkgewotCQlyZXR1cm4gY29sdW1ucy5sZW5ndGg7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhpcyByb3cuCi0JICogCi0JICogQHBhcmFtIHZpc2libGUgdHJ1ZSBpZiB0aGUgcm93IHNob3VsZCBiZSB2aXNpYmxlOyBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJcm93LnNldFZpc2libGUodmlzaWJsZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgaWYgdGhpcyByb3cgaXMgdmlzaWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJvdyBpcyB2aXNpYmxlOyBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0VmlzaWJsZSgpIHsKLQkJcmV0dXJuIHJvdy5nZXRWaXNpYmxlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS9yZWZsZWN0L0R1Y2tUeXBlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvcmVmbGVjdC9EdWNrVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDMwMTQyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS9yZWZsZWN0L0R1Y2tUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGUucmVmbGVjdDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLQotLyoqCi0gKiBEdWNrVHlwZS4gSW1wbGVtZW50cyBEdWNrIFR5cGluZyBmb3IgSmF2YS4gICgiSWYgaXQgd2Fsa3MgbGlrZSBhIGR1Y2ssIAotICogcXVhY2tzIGxpa2UgYSBkdWNrLCBpdC4uLiIpLiAgRXNzZW50aWFsbHkgYWxsb3dzIHByb2dyYW1zIHRvIHRyZWF0Ci0gKiBvYmplY3RzIGZyb20gc2VwYXJhdGUgaGllcmFyY2hpZXMgYXMgaWYgdGhleSB3ZXJlIGRlc2lnbmVkIHdpdGggY29tbW9uCi0gKiBpbnRlcmZhY2VzIGFzIGxvbmcgYXMgdGhleSBhZGhlcmUgdG8gY29tbW9uIG5hbWluZyBjb252ZW50aW9ucy4KLSAqIDxwPgotICogVGhpcyB2ZXJzaW9uIGlzIHRoZSBzdHJpY3QgRHVja1R5cGUuICBBbGwgbWV0aG9kcyBwcmVzZW50IGluCi0gKiBpbnRlcmZhY2VUb0ltcGxlbWVudCBtdXN0IGJlIHByZXNlbnQgb24gdGhlIHRhcmdldCBvYmplY3QuCi0gKgotICogQGF1dGhvciBkam8KLSAqLwotcHVibGljIGNsYXNzIER1Y2tUeXBlIGltcGxlbWVudHMgSW52b2NhdGlvbkhhbmRsZXIgewotCS8qKgotICAgICAqIENhdXNlcyBvYmplY3QgdG8gaW1wbGVtZW50IHRoZSBpbnRlcmZhY2VUb0ltcGxlbWVudCBhbmQgcmV0dXJucwotICAgICAqIGFuIGluc3RhbmNlIG9mIHRoZSBvYmplY3QgaW1wbGVtZW50aW5nIGludGVyZmFjZVRvSW1wbGVtZW50IGV2ZW4KLSAgICAgKiBpZiBpbnRlcmZhY2VUb0ltcGxlbWVudCB3YXMgbm90IGRlY2xhcmVkIGluIG9iamVjdC5nZXRDbGFzcygpJ3MgCi0gICAgICogaW1wbGVtZW50cyBkZWNsYXJhdGlvbi48cD4KLSAgICAgKiAKLSAgICAgKiBUaGlzIHdvcmtzIGFzIGxvbmcgYXMgYWxsIG1ldGhvZHMgZGVjbGFyZWQgaW4gaW50ZXJmYWNlVG9JbXBsZW1lbnQKLSAgICAgKiBhcmUgcHJlc2VudCBvbiBvYmplY3QuCi0gICAgICogCi0JICogQHBhcmFtIGludGVyZmFjZVRvSW1wbGVtZW50IFRoZSBKYXZhIGNsYXNzIG9mIHRoZSBpbnRlcmZhY2UgdG8gaW1wbGVtZW50Ci0JICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZvcmNlIHRvIGltcGxlbWVudCBpbnRlcmZhY2VUb0ltcGxlbWVudAotCSAqIEByZXR1cm4gb2JqZWN0LCBidXQgbm93IGltcGxlbWVudGluZyBpbnRlcmZhY2VUb0ltcGxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGltcGxlbWVudChDbGFzcyBpbnRlcmZhY2VUb0ltcGxlbWVudCwgT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gUHJveHkubmV3UHJveHlJbnN0YW5jZShpbnRlcmZhY2VUb0ltcGxlbWVudC5nZXRDbGFzc0xvYWRlcigpLCAKLQkJCQluZXcgQ2xhc3NbXSB7aW50ZXJmYWNlVG9JbXBsZW1lbnR9LCBuZXcgRHVja1R5cGUob2JqZWN0KSk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiBvYmplY3QgaXMgYSAoRHVja1R5cGUpIGluc3RhY2Ugb2YgaW50cmZhY2UuICBUaGF0IGlzLAotICAgICAqIGlzIGV2ZXJ5IG1ldGhvZCBpbiBpbnRyZmFjZSBwcmVzZW50IG9uIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW50cmZhY2UgVGhlIGludGVyZmFjZSB0byBpbXBsZW1lbnQKLSAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gdGVzdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBldmVyeSBtZXRob2QgaW4gaW50cmZhY2UgaXMgcHJlc2VudCBvbiBvYmplY3QuICBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5zdGFuY2VPZihDbGFzcyBpbnRyZmFjZSwgT2JqZWN0IG9iamVjdCkgewotICAgICAgICBmaW5hbCBNZXRob2RbXSBtZXRob2RzID0gaW50cmZhY2UuZ2V0TWV0aG9kcygpOwotICAgICAgICBDbGFzcyBjYW5kY2xhc3M9b2JqZWN0LmdldENsYXNzKCk7Ci0gICAgICAgIGZvciAoaW50IG1ldGhvZGlkeCA9IDA7IG1ldGhvZGlkeCA8IG1ldGhvZHMubGVuZ3RoOyBtZXRob2RpZHgrKykgewotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZD1tZXRob2RzW21ldGhvZGlkeF07Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNhbmRjbGFzcy5nZXRNZXRob2QobWV0aG9kLmdldE5hbWUoKSwgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCQotCXByb3RlY3RlZCBEdWNrVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQl0aGlzLm9iamVjdENsYXNzID0gb2JqZWN0LmdldENsYXNzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBvYmplY3Q7Ci0JcHJvdGVjdGVkIENsYXNzIG9iamVjdENsYXNzOwotCQotCXB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0JCU1ldGhvZCByZWFsTWV0aG9kID0gb2JqZWN0Q2xhc3MuZ2V0TWV0aG9kKG1ldGhvZC5nZXROYW1lKCksIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKLQkJcmV0dXJuIHJlYWxNZXRob2QuaW52b2tlKG9iamVjdCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL3JlZmxlY3QvUmVmbGVjdGVkTWV0aG9kLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvcmVmbGVjdC9SZWZsZWN0ZWRNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkMzVmZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvcmVmbGVjdC9SZWZsZWN0ZWRNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgZGI0b2JqZWN0cyBJbmMuICBodHRwOi8vd3d3LmRiNG8uY29tCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIGRiNG9iamVjdHMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5jb21wb3NpdGV0YWJsZS5yZWZsZWN0OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vKioKLSAqIFJlZmxlY3RlZE1ldGhvZC4gIEVuY2Fwc3VsYXRlcyBhIG1ldGhvZCB0aGF0IG1heSBvciBtYXkgbm90IGV4aXN0IG9uIAotICogc29tZSByZWNlaXZlci4gIEludm9jYXRpb24gcG9saWN5IGlzIHRoYXQgaWYgdGhlIG1ldGhvZCBjYW4gYmUgaW52b2tlZCwKLSAqIGl0IGlzLiAgT24gZmFpbHVyZSwgcmV0dXJucyBudWxsLgotICoKLSAqIEBhdXRob3IgZGpvCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZsZWN0ZWRNZXRob2QgewotICAgIAotICAgIHByaXZhdGUgT2JqZWN0IHN1YmplY3Q7Ci0gICAgcHJpdmF0ZSBNZXRob2QgbWV0aG9kOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIFJlZmxlY3RlZE1ldGhvZC4gIENyZWF0ZSBhIFJlZmxlY3RlZE1ldGhvZCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN1YmplY3QgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgbWV0aG9kIGxpdmVzLgotICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuCi0gICAgICogQHBhcmFtIHBhcmFtVHlwZXMgVGhlIG1ldGhvZCdzIHBhcmFtZXRlciB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmbGVjdGVkTWV0aG9kKE9iamVjdCBzdWJqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBwYXJhbVR5cGVzKSB7Ci0gICAgICAgIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7Ci0gICAgICAgIG1ldGhvZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIAltZXRob2QgPSBzdWJqZWN0LmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1UeXBlcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNZXRob2QgZXhpc3RzLiAgUmV0dXJucyB0cnVlIGlmIHRoZSB1bmRlcmx5aW5nIG1ldGhvZCBleGlzdHMsIGZhbHNlCi0gICAgICogb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdW5kZXJseWluZyBtZXRob2QgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotICAgICAgICByZXR1cm4gbWV0aG9kICE9IG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE1ldGhvZCBpbnZva2UuICBJZiBwb3NzaWJsZSwgaW52b2tlIHRoZSBlbmNhcHN1bGF0ZWQgbWV0aG9kIHdpdGggdGhlCi0gICAgICogc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtcyBBbiBPYmplY3RbXSBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHRvIHBhc3MuCi0gICAgICogQHJldHVybiBhbnkgcmV0dXJuIHZhbHVlIG9yIG51bGwgaWYgdGhlcmUgd2FzIG5vIHJldHVybiB2YWx1ZSBvciBhbgotICAgICAqIGVycm9yIG9jY3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0W10gcGFyYW1zKSB7Ci0gICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAJcmV0dXJuIG1ldGhvZC5pbnZva2Uoc3ViamVjdCwgcGFyYW1zKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS9yZWZsZWN0L1JlbGF4ZWREdWNrVHlwZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL3JlZmxlY3QvUmVsYXhlZER1Y2tUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmM2UzODguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL3JlZmxlY3QvUmVsYXhlZER1Y2tUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IGRiNG9iamVjdHMgSW5jLiAgaHR0cDovL3d3dy5kYjRvLmNvbQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBkYjRvYmplY3RzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGUucmVmbGVjdDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBSZWxheGVkRHVja1R5cGUuIEltcGxlbWVudHMgRHVjayBUeXBpbmcgZm9yIEphdmEuICAoIklmIGl0IHdhbGtzIGxpa2UgYSBkdWNrLCAKLSAqIHF1YWNrcyBsaWtlIGEgZHVjaywgaXQuLi4iKS4gIEVzc2VudGlhbGx5IGFsbG93cyBwcm9ncmFtcyB0byB0cmVhdAotICogb2JqZWN0cyBmcm9tIHNlcGFyYXRlIGhpZXJhcmNoaWVzIGFzIGlmIHRoZXkgd2VyZSBkZXNpZ25lZCB3aXRoIGNvbW1vbgotICogaW50ZXJmYWNlcyBhcyBsb25nIGFzIHRoZXkgYWRoZXJlIHRvIGNvbW1vbiBuYW1pbmcgY29udmVudGlvbnMuCi0gKiA8cD4KLSAqIFRoaXMgdmVyc2lvbiBpcyB0aGUgcmVsYXhlZCBEdWNrVHlwZS4gIElmIGEgbWV0aG9kIGluIHRoZSBpbnRlcmZhY2UgaXMKLSAqIG5vdCBwcmVzZW50IG9uIHRoZSB1bmRlcmx5aW5nIG9iamVjdCwgdGhlIHByb3h5IHNpbXBseSByZXR1cm5zIG51bGwuCi0gKgotICogQGF1dGhvciBkam8KLSAqLwotcHVibGljIGNsYXNzIFJlbGF4ZWREdWNrVHlwZSBleHRlbmRzIER1Y2tUeXBlIGltcGxlbWVudHMgSW52b2NhdGlvbkhhbmRsZXIgewotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgaW1wbGVtZW50KENsYXNzIGludGVyZmFjZVRvSW1wbGVtZW50LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBQcm94eS5uZXdQcm94eUluc3RhbmNlKGludGVyZmFjZVRvSW1wbGVtZW50LmdldENsYXNzTG9hZGVyKCksIAotCQkJCW5ldyBDbGFzc1tdIHtpbnRlcmZhY2VUb0ltcGxlbWVudH0sIG5ldyBSZWxheGVkRHVja1R5cGUob2JqZWN0KSk7Ci0JfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbmNsdWRlcyhPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kLCBDbGFzc1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCByZWFsTWV0aG9kID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXAgTlVMTF9WQUxVRVMgPSBuZXcgSGFzaE1hcCgpOyB7Ci0gICAgICAgIE5VTExfVkFMVUVTLnB1dChCb29sZWFuLlRZUEUsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICBOVUxMX1ZBTFVFUy5wdXQoSW50ZWdlci5UWVBFLCBuZXcgSW50ZWdlcigwKSk7Ci0gICAgICAgIE5VTExfVkFMVUVTLnB1dChGbG9hdC5UWVBFLCBuZXcgRmxvYXQoMCkpOwotICAgICAgICBOVUxMX1ZBTFVFUy5wdXQoTG9uZy5UWVBFLCBuZXcgTG9uZygwKSk7Ci0gICAgICAgIE5VTExfVkFMVUVTLnB1dChEb3VibGUuVFlQRSwgbmV3IERvdWJsZSgwKSk7Ci0gICAgICAgIE5VTExfVkFMVUVTLnB1dChDaGFyYWN0ZXIuVFlQRSwgbmV3IENoYXJhY3RlcignICcpKTsKLSAgICB9Ci0JCi0JcHJvdGVjdGVkIFJlbGF4ZWREdWNrVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyKG9iamVjdCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgcmVhbE1ldGhvZCA9IG9iamVjdENsYXNzLmdldE1ldGhvZChtZXRob2QuZ2V0TmFtZSgpLCBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbE1ldGhvZC5pbnZva2Uob2JqZWN0LCBhcmdzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBOVUxMX1ZBTFVFUy5nZXQobWV0aG9kLmdldFJldHVyblR5cGUoKSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl0aHJvdyB0OwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvdGVzdC9Db21wb3NpdGVUYWJsZVRlc3QuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS90ZXN0L0NvbXBvc2l0ZVRhYmxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQwYmFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS90ZXN0L0NvbXBvc2l0ZVRhYmxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgT3JtZSA8ZGpvQGNvY29udXQtcGFsbS1zb2Z0d2FyZS5jb20+Ci0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIE9ybWUgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGUudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGUuQ29tcG9zaXRlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGUuSURlbGV0ZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGUuSUluc2VydEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGUuSVJvd0NvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5jb21wb3NpdGV0YWJsZS5JUm93Rm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVUYWJsZVRlc3QgewotCi0JcHJpdmF0ZSBTaGVsbCBzU2hlbGwgPSBudWxsOyAgLy8gIEBqdmU6ZGVjbC1pbmRleD0wOnZpc3VhbC1jb25zdHJhaW50PSIxMCwxMCIKLQlwcml2YXRlIENvbXBvc2l0ZVRhYmxlIHRhYmxlID0gbnVsbDsKLQlwcml2YXRlIEhlYWRlciBoZWFkZXIgPSBudWxsOwotCXByaXZhdGUgUm93IHJvdyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBMaW5rZWRMaXN0IHBlcnNvbkxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQotCXB1YmxpYyBDb21wb3NpdGVUYWJsZVRlc3QoKSB7Ci0JCXBlcnNvbkxpc3QuYWRkKG5ldyBQZXJzb24oIkpvaG4iLCAiMTIzNCIsICJXaGVhdG9uIiwgIklMIikpOwotCQlwZXJzb25MaXN0LmFkZChuZXcgUGVyc29uKCJKYW5lIiwgIjEyMzQiLCAiV2hlYXRvbiIsICJJTCIpKTsKLQkJcGVyc29uTGlzdC5hZGQobmV3IFBlcnNvbigiRnJhbmsiLCAiMTIzNCIsICJXaGVhdG9uIiwgIklMIikpOwotCQlwZXJzb25MaXN0LmFkZChuZXcgUGVyc29uKCJKb2UiLCAiMTIzNCIsICJXaGVhdG9uIiwgIklMIikpOwotCQlwZXJzb25MaXN0LmFkZChuZXcgUGVyc29uKCJDaGV0IiwgIjEyMzQiLCAiV2hlYXRvbiIsICJJTCIpKTsKLQkJcGVyc29uTGlzdC5hZGQobmV3IFBlcnNvbigiV2lsYnVyIiwgIjEyMzQiLCAiV2hlYXRvbiIsICJJTCIpKTsKLQkJcGVyc29uTGlzdC5hZGQobmV3IFBlcnNvbigiRWxtbyIsICIxMjM0IiwgIldoZWF0b24iLCAiSUwiKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgbXVsdGlSb3dWaWV3ZXIJCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlTXVsdGlSb3dWaWV3ZXIoKSB7Ci0JCXRhYmxlID0gbmV3IENvbXBvc2l0ZVRhYmxlKHNTaGVsbCwgU1dULk5PTkUpOwotCQl0YWJsZS5zZXRSdW5UaW1lKHRydWUpOwotCQl0YWJsZS5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7MzUsIDM1LCAyMCwgMTB9KTsKLQkJdGFibGUuYWRkUm93Q29udGVudFByb3ZpZGVyKHJvd0NvbnRlbnRQcm92aWRlcik7Ci0JCXRhYmxlLmFkZERlbGV0ZUhhbmRsZXIoZGVsZXRlSGFuZGxlcik7Ci0JCXRhYmxlLmFkZEluc2VydEhhbmRsZXIoaW5zZXJ0SGFuZGxlcik7Ci0JCXRhYmxlLmFkZFJvd0ZvY3VzTGlzdGVuZXIocm93TGlzdGVuZXIpOwotCQl0YWJsZS5zZXROdW1Sb3dzSW5Db2xsZWN0aW9uKHBlcnNvbkxpc3Quc2l6ZSgpKTsKLQkJY3JlYXRlSGVhZGVyKCk7Ci0JCWNyZWF0ZVJvdygpOwotCX0KLQkKLQlwcml2YXRlIElSb3dDb250ZW50UHJvdmlkZXIgcm93Q29udGVudFByb3ZpZGVyID0gbmV3IElSb3dDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHJlZnJlc2goQ29tcG9zaXRlVGFibGUgdGFibGUsIGludCBjdXJyZW50T2JqZWN0T2Zmc2V0LCBDb250cm9sIHJvdykgewotCQkJUm93IHJvd09iaiA9IChSb3cpIHJvdzsKLQkJCVBlcnNvbiBwZXJzb24gPSAoUGVyc29uKXBlcnNvbkxpc3QuZ2V0KGN1cnJlbnRPYmplY3RPZmZzZXQpOwotCQkJcm93T2JqLm5hbWUuc2V0VGV4dChwZXJzb24ubmFtZSk7Ci0JCQlyb3dPYmouYWRkcmVzcy5zZXRUZXh0KHBlcnNvbi5hZGRyZXNzKTsKLQkJCXJvd09iai5jaXR5LnNldFRleHQocGVyc29uLmNpdHkpOwotCQkJcm93T2JqLnN0YXRlLnNldFRleHQocGVyc29uLnN0YXRlKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElEZWxldGVIYW5kbGVyIGRlbGV0ZUhhbmRsZXIgPSBuZXcgSURlbGV0ZUhhbmRsZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbkRlbGV0ZShpbnQgcm93SW5Db2xsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkZWxldGVSb3coaW50IHJvd0luQ29sbGVjdGlvbikgewotCQkJcGVyc29uTGlzdC5yZW1vdmUocm93SW5Db2xsZWN0aW9uKTsKLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBJSW5zZXJ0SGFuZGxlciBpbnNlcnRIYW5kbGVyID0gbmV3IElJbnNlcnRIYW5kbGVyKCkgewotCQlwdWJsaWMgaW50IGluc2VydChpbnQgcG9zaXRpb25IaW50KSB7Ci0JCQlQZXJzb24gbmV3UGVyc29uID0gbmV3IFBlcnNvbigpOwotCQkJcGVyc29uTGlzdC5hZGQocG9zaXRpb25IaW50LCBuZXdQZXJzb24pOwotCQkJcmV0dXJuIHBvc2l0aW9uSGludDsKLS8vCQkJaW50IG5ld1Bvc2l0aW9uID0gKGludCkoTWF0aC5yYW5kb20oKSAqIChwZXJzb25MaXN0LnNpemUoKSsxKSk7Ci0vLwkJCXBlcnNvbkxpc3QuYWRkKG5ld1Bvc2l0aW9uLCBuZXdQZXJzb24pOwotLy8JCQlyZXR1cm4gbmV3UG9zaXRpb247Ci0JCX0KLQl9OwotCQotCXByaXZhdGUgSVJvd0ZvY3VzTGlzdGVuZXIgcm93TGlzdGVuZXIgPSBuZXcgSVJvd0ZvY3VzTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3dDaGFuZ2UoQ29tcG9zaXRlVGFibGUgc2VuZGVyLCBpbnQgY3VycmVudE9iamVjdE9mZnNldCwgQ29udHJvbCByb3cpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVxdWVzdFJDIik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkZXBhcnQoQ29tcG9zaXRlVGFibGUgc2VuZGVyLCBpbnQgY3VycmVudE9iamVjdE9mZnNldCwgQ29udHJvbCByb3cpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGVwYXJ0Iik7Ci0JCQlQZXJzb24gcGVyc29uID0gKFBlcnNvbilwZXJzb25MaXN0LmdldChjdXJyZW50T2JqZWN0T2Zmc2V0KTsKLQkJCVJvdyByb3dPYmogPSAoUm93KSByb3c7Ci0JCQlwZXJzb24ubmFtZSA9IHJvd09iai5uYW1lLmdldFRleHQoKTsKLQkJCXBlcnNvbi5hZGRyZXNzID0gcm93T2JqLmFkZHJlc3MuZ2V0VGV4dCgpOwotCQkJcGVyc29uLmNpdHkgPSByb3dPYmouY2l0eS5nZXRUZXh0KCk7Ci0JCQlwZXJzb24uc3RhdGUgPSByb3dPYmouc3RhdGUuZ2V0VGV4dCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFycml2ZShDb21wb3NpdGVUYWJsZSBzZW5kZXIsIGludCBjdXJyZW50T2JqZWN0T2Zmc2V0LCBDb250cm9sIHJvdykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJhcnJpdmUiKTsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgaGVhZGVyCQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUhlYWRlcigpIHsKLQkJaGVhZGVyID0gbmV3IEhlYWRlcih0YWJsZSwgU1dULk5PTkUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHJvdwkKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVSb3coKSB7Ci0JCXJvdyA9IG5ldyBSb3codGFibGUsIFNXVC5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXJncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCUNvbXBvc2l0ZVRhYmxlVGVzdCB0aGlzQ2xhc3MgPSBuZXcgQ29tcG9zaXRlVGFibGVUZXN0KCk7Ci0JCXRoaXNDbGFzcy5jcmVhdGVTU2hlbGwoKTsKLQkJdGhpc0NsYXNzLnNTaGVsbC5vcGVuKCk7Ci0KLQkJd2hpbGUgKCF0aGlzQ2xhc3Muc1NoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBzU2hlbGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU1NoZWxsKCkgewotCQlzU2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJc1NoZWxsLnNldFRleHQoIlNoZWxsIik7Ci0JCXNTaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWNyZWF0ZU11bHRpUm93Vmlld2VyKCk7Ci0JCXNTaGVsbC5zZXRTaXplKG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQoNDQ1LDI0MykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL3Rlc3QvSGVhZGVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvdGVzdC9IZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1ZDViZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvdGVzdC9IZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgT3JtZSA8ZGpvQGNvY29udXQtcGFsbS1zb2Z0d2FyZS5jb20+Ci0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIE9ybWUgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcuY29tcG9zaXRldGFibGUudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi1wdWJsaWMgY2xhc3MgSGVhZGVyIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXByaXZhdGUgTGFiZWwgbGFiZWwgPSBudWxsOwotCXByaXZhdGUgTGFiZWwgbGFiZWwxID0gbnVsbDsKLQlwcml2YXRlIExhYmVsIGxhYmVsMiA9IG51bGw7Ci0JcHJpdmF0ZSBMYWJlbCBsYWJlbDMgPSBudWxsOwotCi0JcHVibGljIEhlYWRlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGlzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICAgIHRoaXMuc2V0U2l6ZShuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50KDMxMyw1NCkpOwotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldEJvdW5kcyhuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSgyMywxOCw1MywxOCkpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJOYW1lIik7Ci0gICAgICAgIGxhYmVsMSA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsMS5zZXRCb3VuZHMobmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUoOTgsMTgsNzksMTcpKTsKLSAgICAgICAgbGFiZWwxLnNldFRleHQoIkFkZHJlc3MiKTsKLSAgICAgICAgbGFiZWwyID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwyLnNldEJvdW5kcyhuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSgxOTksMTgsMzUsMTcpKTsKLSAgICAgICAgbGFiZWwyLnNldFRleHQoIkNpdHkiKTsKLSAgICAgICAgbGFiZWwzID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwzLnNldEJvdW5kcyhuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSgyNTYsMTcsMzUsMTcpKTsKLSAgICAgICAgbGFiZWwzLnNldFRleHQoIlN0YXRlIik7Ci0JCQkKLQl9Ci0KLX0gIC8vICBAanZlOmRlY2wtaW5kZXg9MDp2aXN1YWwtY29uc3RyYWludD0iMTEsMTYiCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvdGVzdC9Nb2RlbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL3Rlc3QvTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5MjU5NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvdGVzdC9Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBEYXZpZCBPcm1lIDxkam9AY29jb251dC1wYWxtLXNvZnR3YXJlLmNvbT4KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgT3JtZSAgICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5jb21wb3NpdGV0YWJsZS50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5jb21wb3NpdGV0YWJsZS5JRGVsZXRlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5jb21wb3NpdGV0YWJsZS5JSW5zZXJ0SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIE1vZGVsIHsKLQlwdWJsaWMgTW9kZWwoKSB7Ci0JCS8vIEFkZCBzb21lIHNhbXBsZSBkYXRhIHRvIG91ciBwZXJzb25MaXN0Li4uCi0vLwkJcGVyc29uTGlzdC5hZGQobmV3IFBlcnNvbigiSm9obiIsICIxMjM0IiwgIldoZWF0b24iLCAiSUwiKSk7Ci0vLwkJcGVyc29uTGlzdC5hZGQobmV3IFBlcnNvbigiSmFuZSIsICIxMjM0IiwgIldoZWF0b24iLCAiSUwiKSk7Ci0vLwkJcGVyc29uTGlzdC5hZGQobmV3IFBlcnNvbigiRnJhbmsiLCAiMTIzNCIsICJXaGVhdG9uIiwgIklMIikpOwotLy8JCXBlcnNvbkxpc3QuYWRkKG5ldyBQZXJzb24oIkpvZSIsICIxMjM0IiwgIldoZWF0b24iLCAiSUwiKSk7Ci0vLwkJcGVyc29uTGlzdC5hZGQobmV3IFBlcnNvbigiQ2hldCIsICIxMjM0IiwgIldoZWF0b24iLCAiSUwiKSk7Ci0vLwkJcGVyc29uTGlzdC5hZGQobmV3IFBlcnNvbigiV2lsYnVyIiwgIjEyMzQiLCAiV2hlYXRvbiIsICJJTCIpKTsKLS8vCQlwZXJzb25MaXN0LmFkZChuZXcgUGVyc29uKCJFbG1vIiwgIjEyMzQiLCAiV2hlYXRvbiIsICJJTCIpKTsKLQl9Ci0KLQkvLyBOb3cgYSBQZXJzb25MaXN0IHByb3BlcnR5Li4uCi0JCi0JTGlua2VkTGlzdCBwZXJzb25MaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkKLQlwdWJsaWMgTGlua2VkTGlzdCBnZXRQZXJzb25MaXN0KCkgewotCQlyZXR1cm4gcGVyc29uTGlzdDsKLQl9Ci0KLQlwdWJsaWMgSURlbGV0ZUhhbmRsZXIgZ2V0UGVyc29uTGlzdERlbGV0ZUhhbmRsZXIoKSB7Ci0JCXJldHVybiBuZXcgSURlbGV0ZUhhbmRsZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBjYW5EZWxldGUoaW50IHJvd0luQ29sbGVjdGlvbikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkZWxldGVSb3coaW50IHJvd0luQ29sbGVjdGlvbikgewotCQkJCXBlcnNvbkxpc3QucmVtb3ZlKHJvd0luQ29sbGVjdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBJSW5zZXJ0SGFuZGxlciBnZXRQZXJzb25MaXN0SW5zZXJ0SGFuZGxlcigpIHsKLQkJcmV0dXJuIG5ldyBJSW5zZXJ0SGFuZGxlcigpIHsKLQkJCXB1YmxpYyBpbnQgaW5zZXJ0KGludCBwb3NpdGlvbkhpbnQpIHsKLQkJCQlQZXJzb24gbmV3UGVyc29uID0gbmV3IFBlcnNvbigpOwotCQkJCXBlcnNvbkxpc3QuYWRkKHBvc2l0aW9uSGludCwgbmV3UGVyc29uKTsKLQkJCQlyZXR1cm4gcG9zaXRpb25IaW50OwotCQkJCS8vIGludCBuZXdQb3NpdGlvbiA9IChpbnQpKE1hdGgucmFuZG9tKCkgKgotCQkJCS8vIChwZXJzb25MaXN0LnNpemUoKSsxKSk7Ci0JCQkJLy8gcGVyc29uTGlzdC5hZGQobmV3UG9zaXRpb24sIG5ld1BlcnNvbik7Ci0JCQkJLy8gcmV0dXJuIG5ld1Bvc2l0aW9uOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvY29tcG9zaXRldGFibGUvdGVzdC9QZXJzb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS90ZXN0L1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2M4NmJmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS90ZXN0L1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBEYXZpZCBPcm1lIDxkam9AY29jb251dC1wYWxtLXNvZnR3YXJlLmNvbT4KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgT3JtZSAgICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5jb21wb3NpdGV0YWJsZS50ZXN0OwotCi1wdWJsaWMgY2xhc3MgUGVyc29uIHsKLQkKLQlwdWJsaWMgU3RyaW5nIG5hbWUgPSAiIjsKLQlwdWJsaWMgU3RyaW5nIGFkZHJlc3MgPSAiIjsKLQlwdWJsaWMgU3RyaW5nIGNpdHkgPSAiV2hlYXRvbiI7Ci0JcHVibGljIFN0cmluZyBzdGF0ZSA9ICJJTCI7Ci0JCi0JcHVibGljIFBlcnNvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFkZHJlc3MsIFN0cmluZyBjaXR5LCBTdHJpbmcgc3RhdGUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKLQkJdGhpcy5jaXR5ID0gY2l0eTsKLQkJdGhpcy5zdGF0ZSA9IHN0YXRlOwotCX0KLQkKLQlwdWJsaWMgUGVyc29uKCkge30KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9jb21wb3NpdGV0YWJsZS90ZXN0L1Jvdy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL3Rlc3QvUm93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MTM5NjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL2NvbXBvc2l0ZXRhYmxlL3Rlc3QvUm93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIE9ybWUgPGRqb0Bjb2NvbnV0LXBhbG0tc29mdHdhcmUuY29tPgotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBPcm1lICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLmNvbXBvc2l0ZXRhYmxlLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgUm93IGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXB1YmxpYyBUZXh0IG5hbWUgPSBudWxsOwotCXB1YmxpYyBUZXh0IGFkZHJlc3MgPSBudWxsOwotCXB1YmxpYyBUZXh0IGNpdHkgPSBudWxsOwotCXB1YmxpYyBUZXh0IHN0YXRlID0gbnVsbDsKLQotCXB1YmxpYyBSb3coQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuc2V0U2l6ZShuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50KDEzMSw1MikpOwotCQluYW1lID0gbmV3IFRleHQodGhpcywgU1dULk5PTkUpOwotCQluYW1lLnNldEJvdW5kcyhuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSgxMiwxMiwxMCwyNSkpOwotCQlhZGRyZXNzID0gbmV3IFRleHQodGhpcywgU1dULk5PTkUpOwotCQlhZGRyZXNzLnNldEJvdW5kcyhuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSg0MywxMiwxMCwyNSkpOwotCQljaXR5ID0gbmV3IFRleHQodGhpcywgU1dULk5PTkUpOwotCQljaXR5LnNldEJvdW5kcyhuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSg3NSwxNCwxMCwyNSkpOwotCQlzdGF0ZSA9IG5ldyBUZXh0KHRoaXMsIFNXVC5OT05FKTsKLQkJc3RhdGUuc2V0Qm91bmRzKG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlKDEwOSwxNiwxMCwyNSkpOwotCX0KLQotfSAgLy8gIEBqdmU6ZGVjbC1pbmRleD0wOnZpc3VhbC1jb25zdHJhaW50PSIxMCwxMCIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9BY2NvdW50LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvbW9kZWwvQWNjb3VudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTNhYmZhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9BY2NvdW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQWNjb3VudCBleHRlbmRzIE1vZGVsT2JqZWN0IHsKLQotCXByaXZhdGUgU3RyaW5nIGNvdW50cnk7Ci0JcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOwotCXByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOwotCXByaXZhdGUgU3RyaW5nIHN0YXRlOwotCXByaXZhdGUgU3RyaW5nIHBob25lOwkKLQotCXB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IGZpcnN0TmFtZTsKLQkJZmlyc3ROYW1lID0gc3RyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoImZpcnN0TmFtZSIsIG9sZFZhbHVlLCBzdHJpbmcpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgb2xkVmFsdWUgPSBsYXN0TmFtZTsKLQkJbGFzdE5hbWUgPSBzdHJpbmc7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgibGFzdE5hbWUiLCBvbGRWYWx1ZSwgc3RyaW5nKTsJCQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhdGUoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgb2xkVmFsdWUgPSBzdGF0ZTsKLQkJc3RhdGUgPSBzdHJpbmc7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgic3RhdGUiLCBvbGRWYWx1ZSwgc3RyaW5nKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBob25lKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gcGhvbmU7Ci0JCXBob25lID0gc3RyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoInBob25lIiwgb2xkVmFsdWUsIHBob25lKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvdW50cnkoU3RyaW5nIHN0cmluZykgewotCQlPYmplY3Qgb2xkVmFsdWUgPSBjb3VudHJ5OwotCQljb3VudHJ5ID0gc3RyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoImNvdW50cnkiLCBvbGRWYWx1ZSwgc3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvdW50cnkoKSB7Ci0JCXJldHVybiBjb3VudHJ5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkgewotCQlyZXR1cm4gZmlyc3ROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKSB7Ci0JCXJldHVybiBsYXN0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXRlKCkgewotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQaG9uZSgpIHsKLQkJcmV0dXJuIHBob25lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0FkdmVudHVyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0FkdmVudHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2VmOWFmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9BZHZlbnR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9yLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmFsaWRhdG9ycy5TdHJpbmcySW50VmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgQWR2ZW50dXJlIGV4dGVuZHMgTW9kZWxPYmplY3QgewotCi0JcHJpdmF0ZSBib29sZWFuIHBldHNBbGxvd2VkOwotCi0JcHJpdmF0ZSBkb3VibGUgcHJpY2U7Ci0KLQlwcml2YXRlIExvZGdpbmcgZGVmYXVsdExvZGdpbmc7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQlwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLQkKLQlwcml2YXRlIGludCBtYXhOdW1iZXJPZlBlb3BsZTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgc3RyaW5nKSB7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IG5hbWU7Ci0JCW5hbWUgPSBzdHJpbmc7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgibmFtZSIsIG9sZFZhbHVlLCBuYW1lKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRNYXhOdW1iZXJPZlBlb3BsZSgpewotCQlyZXR1cm4gbWF4TnVtYmVyT2ZQZW9wbGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1heE51bWJlck9mUGVvcGxlKGludCBhbkludCkgewotCQlpbnQgb2xkVmFsdWUgPSBtYXhOdW1iZXJPZlBlb3BsZTsKLQkJbWF4TnVtYmVyT2ZQZW9wbGUgPSBhbkludDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKCJtYXhOdW1iZXJPZlBlb3BsZSIsIG9sZFZhbHVlLCBtYXhOdW1iZXJPZlBlb3BsZSk7Ci0JfQotCQotCXB1YmxpYyBJVmFsaWRhdG9yIGdldE1heE51bWJlck9mUGVvcGxlVmFsaWRhdG9yKENsYXNzIGZyb21UeXBlKSB7Ci0JCWlmIChmcm9tVHlwZS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkKLQkJCXJldHVybiBuZXcgSVZhbGlkYXRvcigpIHsKLQkJCQlJVmFsaWRhdG9yIGRlbGVnYXRlID0gbmV3IFN0cmluZzJJbnRWYWxpZGF0b3IoKTsKLQkJCQlwdWJsaWMgU3RyaW5nIGlzUGFydGlhbGx5VmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXJldHVybiBkZWxlZ2F0ZS5pc1BhcnRpYWxseVZhbGlkKHZhbHVlKTsKLQkJCQl9Ci0JCi0JCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotCQkJCQlTdHJpbmcgZXJyb3IgPSBkZWxlZ2F0ZS5pc1ZhbGlkKHZhbHVlKTsKLQkJCQkJaWYgKGVycm9yICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBlcnJvcjsKLQkJCQkJfQotCQkJCQlpbnQgaW50VmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YoKFN0cmluZyl2YWx1ZSkuaW50VmFsdWUoKTsKLQkJCQkJaWYgKGludFZhbHVlIDwgMSB8fCBpbnRWYWx1ZSA+IDIwKSB7Ci0JCQkJCQlyZXR1cm4gIk1heCBudW1iZXIgb2YgcGVvcGxlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyMCBpbmNsdXNpdmUiOwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkKLQkJCX07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMb2RnaW5nIGdldERlZmF1bHRMb2RnaW5nKCkgewotCQlyZXR1cm4gZGVmYXVsdExvZGdpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdExvZGdpbmcoTG9kZ2luZyBsb2RnaW5nKSB7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IGRlZmF1bHRMb2RnaW5nOwotCQlkZWZhdWx0TG9kZ2luZyA9IGxvZGdpbmc7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgiZGVmYXVsdExvZGdpbmciLCBvbGRWYWx1ZSwgZGVmYXVsdExvZGdpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByaWNlKGRvdWJsZSBkKSB7Ci0JCWRvdWJsZSBvbGRWYWx1ZSA9IHByaWNlOwotCQlwcmljZSA9IGQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgicHJpY2UiLCBuZXcgRG91YmxlKG9sZFZhbHVlKSwgbmV3IERvdWJsZShwcmljZSkpOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0UHJpY2UoKSB7Ci0JCXJldHVybiBwcmljZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQZXRzQWxsb3dlZChib29sZWFuIGIpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHBldHNBbGxvd2VkOwotCQlwZXRzQWxsb3dlZCA9IGI7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgicGV0c0FsbG93ZWQiLCBuZXcgQm9vbGVhbihvbGRWYWx1ZSksIG5ldyBCb29sZWFuKAotCQkJCXBldHNBbGxvd2VkKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQZXRzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHBldHNBbGxvd2VkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBzdHJpbmcpIHsKLQkJT2JqZWN0IG9sZFZhbHVlID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gc3RyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoImRlc2NyaXB0aW9uIiwgb2xkVmFsdWUsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgc3RyaW5nKSB7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IGxvY2F0aW9uOwotCQlsb2NhdGlvbiA9IHN0cmluZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKCJsb2NhdGlvbiIsIG9sZFZhbHVlLCBsb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0FkdmVudHVyZUZhY3RvcnkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9BZHZlbnR1cmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOTVlMTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0FkdmVudHVyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBZHZlbnR1cmVGYWN0b3J5IHsKLQotCXB1YmxpYyBDYXRhbG9nIGNyZWF0ZUNhdGFsb2coKSB7Ci0JCXJldHVybiBuZXcgQ2F0YWxvZygpOwotCX0KLQotCXB1YmxpYyBDYXRlZ29yeSBjcmVhdGVDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIG5ldyBDYXRlZ29yeSgpOwotCX0KLQotCXB1YmxpYyBBZHZlbnR1cmUgY3JlYXRlQWR2ZW50dXJlKCkgewotCQlyZXR1cm4gbmV3IEFkdmVudHVyZSgpOwotCX0KLQotCXB1YmxpYyBMb2RnaW5nIGNyZWF0ZUxvZGdpbmcoKSB7Ci0JCXJldHVybiBuZXcgTG9kZ2luZygpOwotCX0KLQotCXB1YmxpYyBUcmFuc3BvcnRhdGlvbiBjcmVhdGVUcmFuc3BvcnRhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc3BvcnRhdGlvbigpOwotCX0KLQotCXB1YmxpYyBBY2NvdW50IGNyZWF0ZUFjY291bnQoKSB7Ci0JCXJldHVybiBuZXcgQWNjb3VudCgpOwotCX0KLQotCXB1YmxpYyBDYXJ0IGNyZWF0ZUNhcnQoKSB7Ci0JCXJldHVybiBuZXcgQ2FydCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0FnZ3JlZ2F0ZVVwZGF0YWJsZVZhbHVlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvbW9kZWwvQWdncmVnYXRlVXBkYXRhYmxlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjZjAyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvbW9kZWwvQWdncmVnYXRlVXBkYXRhYmxlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5VcGRhdGFibGVWYWx1ZTsKLQotcHVibGljIGNsYXNzIEFnZ3JlZ2F0ZVVwZGF0YWJsZVZhbHVlIGV4dGVuZHMgVXBkYXRhYmxlVmFsdWUgewotCi0JcHJpdmF0ZSBJVXBkYXRhYmxlVmFsdWVbXSB1cGRhdGFibGVWYWx1ZXM7Ci0KLQlwcml2YXRlIFN0cmluZyBkZWxpbWl0ZXI7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0aW5nID0gZmFsc2U7Ci0KLQlwcml2YXRlIElDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUNoYW5nZShDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudCkgewotCQkJaWYgKCF1cGRhdGluZykgCi0JCQkgICBmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBudWxsLCBudWxsKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgQWdncmVnYXRlVXBkYXRhYmxlVmFsdWUoSVVwZGF0YWJsZVZhbHVlW10gdXBkYXRhYmxlVmFsdWVzLAotCQkJU3RyaW5nIGRlbGltaXRlcikgewotCQl0aGlzLnVwZGF0YWJsZVZhbHVlcyA9IHVwZGF0YWJsZVZhbHVlczsKLQkJdGhpcy5kZWxpbWl0ZXIgPSBkZWxpbWl0ZXI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRhYmxlVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl1cGRhdGFibGVWYWx1ZXNbaV0uYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IGdldFZhbHVlKCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKChTdHJpbmcpIHZhbHVlLAotCQkJCWRlbGltaXRlcik7Ci0JCXRyeSB7Ci0JCQl1cGRhdGluZz10cnVlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cGRhdGFibGVWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCXVwZGF0YWJsZVZhbHVlc1tpXS5zZXRWYWx1ZSh0b2tlbml6ZXIubmV4dEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl1cGRhdGFibGVWYWx1ZXNbaV0uc2V0VmFsdWUobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJfQotCQlmaXJlQ2hhbmdlRXZlbnQoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBvbGRWYWx1ZSwgZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cGRhdGFibGVWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpID4gMCAmIGkgPCB1cGRhdGFibGVWYWx1ZXMubGVuZ3RoKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChkZWxpbWl0ZXIpOwotCQkJfQotCQkJcmVzdWx0LmFwcGVuZCh1cGRhdGFibGVWYWx1ZXNbaV0uZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKSB7Ci0JCXJldHVybiBTdHJpbmcuY2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cGRhdGFibGVWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCXVwZGF0YWJsZVZhbHVlc1tpXS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0NhcnQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9DYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MmY0NWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0NhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDYXJ0IHsKLQotCXB1YmxpYyB2b2lkIHNldEFkdmVudHVyZURheXMoaW50IGkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExvZGdpbmdEYXlzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0NhdGFsb2cuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9DYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDdhZjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0NhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIENhdGFsb2cgZXh0ZW5kcyBNb2RlbE9iamVjdCB7Ci0KLQlwcml2YXRlIENhdGVnb3J5W10gY2F0ZWdvcmllcyA9IG5ldyBDYXRlZ29yeVswXTsKLQotCXByaXZhdGUgTG9kZ2luZ1tdIGxvZGdpbmdzID0gbmV3IExvZGdpbmdbMF07Ci0KLQlwcml2YXRlIFRyYW5zcG9ydGF0aW9uW10gdHJhbnNwb3J0YXRpb25zID0gbmV3IFRyYW5zcG9ydGF0aW9uWzBdOwotCi0JcHJpdmF0ZSBBY2NvdW50W10gYWNjb3VudHMgPSBuZXcgQWNjb3VudFswXTsKLQkKLQlwcml2YXRlIExpc3Qgc2lnbm9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwdWJsaWMgTGlzdCBnZXRTaWdub25zKCl7Ci0JCXJldHVybiBzaWdub25zOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRTaWdub24oU2lnbm9uIGFTaWdub24pewotCQlzaWdub25zLmFkZChhU2lnbm9uKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKCJzaWdub25zIixudWxsLG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTaWdub24oU2lnbm9uIGFTaWdub24pewotCQlzaWdub25zLnJlbW92ZShhU2lnbm9uKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKCJzaWdub25zIixudWxsLG51bGwpOwotCX0JCi0KLQlwdWJsaWMgQ2F0ZWdvcnlbXSBnZXRDYXRlZ29yaWVzKCkgewotCQlyZXR1cm4gY2F0ZWdvcmllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShDYXRlZ29yeSBjYXRlZ29yeSkgewotCQljYXRlZ29yaWVzID0gKENhdGVnb3J5W10pIGFwcGVuZChjYXRlZ29yaWVzLCBjYXRlZ29yeSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgiY2F0ZWdvcmllcyIsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExvZGdpbmcoTG9kZ2luZyBsb2RnaW5nKSB7Ci0JCWxvZGdpbmdzID0gKExvZGdpbmdbXSkgYXBwZW5kKGxvZGdpbmdzLCBsb2RnaW5nKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKCJsb2RnaW5ncyIsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFRyYW5zcG9ydGF0aW9uKFRyYW5zcG9ydGF0aW9uIHRyYW5zcG9ydGF0aW9uKSB7Ci0JCXRyYW5zcG9ydGF0aW9ucyA9IChUcmFuc3BvcnRhdGlvbltdKSBhcHBlbmQodHJhbnNwb3J0YXRpb25zLCB0cmFuc3BvcnRhdGlvbik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgidHJhbnNwb3J0YXRpb25zIiwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQWNjb3VudChBY2NvdW50IGFjY291bnQpIHsKLQkJYWNjb3VudHMgPSAoQWNjb3VudFtdKSBhcHBlbmQoYWNjb3VudHMsIGFjY291bnQpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoImFjY291bnRzIiwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIExvZGdpbmdbXSBnZXRMb2RnaW5ncygpIHsKLQkJcmV0dXJuIGxvZGdpbmdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxvZGdpbmcoTG9kZ2luZyBsb2RnaW5nKSB7Ci0JCWxvZGdpbmdzID0gKExvZGdpbmdbXSkgcmVtb3ZlKGxvZGdpbmdzLCBsb2RnaW5nKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKCJsb2RnaW5ncyIsIG51bGwsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBY2NvdW50KEFjY291bnQgYW5BY2NvdW50KSB7Ci0JCWFjY291bnRzID0gKEFjY291bnRbXSkgcmVtb3ZlKGFjY291bnRzLCBhbkFjY291bnQpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoImFjY291bnRzIiwgbnVsbCwgbnVsbCk7Ci0JfQkKLQotCXB1YmxpYyBBY2NvdW50W10gZ2V0QWNjb3VudHMoKSB7Ci0JCXJldHVybiBhY2NvdW50czsKLQl9Ci0JCi0JcHVibGljIFRyYW5zcG9ydGF0aW9uW10gZ2V0VHJhbnNwb3JhdGlvbnMoKXsKLQkJcmV0dXJuIHRyYW5zcG9ydGF0aW9uczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9DYXRlZ29yeS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0NhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NDYxZjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0NhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnkgZXh0ZW5kcyBNb2RlbE9iamVjdCB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBBZHZlbnR1cmVbXSBhZHZlbnR1cmVzID0gbmV3IEFkdmVudHVyZVswXTsKLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHN0cmluZykgewotCQlPYmplY3Qgb2xkVmFsdWUgPSBuYW1lOwotCQluYW1lID0gc3RyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoIm5hbWUiLCBvbGRWYWx1ZSwgbmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQWR2ZW50dXJlKEFkdmVudHVyZSBhZHZlbnR1cmUpIHsKLQkJYWR2ZW50dXJlcyA9IChBZHZlbnR1cmVbXSkgYXBwZW5kKGFkdmVudHVyZXMsIGFkdmVudHVyZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgiYWR2ZW50dXJlcyIsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBBZHZlbnR1cmVbXSBnZXRBZHZlbnR1cmVzKCkgewotCQlyZXR1cm4gYWR2ZW50dXJlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0xvZGdpbmcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9Mb2RnaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOTVjZDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL0xvZGdpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBMb2RnaW5nIGV4dGVuZHMgTW9kZWxPYmplY3QgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgc3RyaW5nKSB7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IHN0cmluZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKCJkZXNjcmlwdGlvbiIsb2xkVmFsdWUsZGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHN0cmluZykgewotCQlPYmplY3Qgb2xkVmFsdWUgPSBuYW1lOwotCQluYW1lID0gc3RyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoIm5hbWUiLG9sZFZhbHVlLG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL01vZGVsT2JqZWN0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvbW9kZWwvTW9kZWxPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThjODg1Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvbW9kZWwvTW9kZWxPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgTW9kZWxPYmplY3QgewotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHByb3BlcnR5Q2hhbmdlU3VwcG9ydCA9IG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoCi0JCQl0aGlzKTsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlwcm9wZXJ0eUNoYW5nZVN1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLAotCQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlwcm9wZXJ0eUNoYW5nZVN1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcHJvcGVydHlDaGFuZ2VTdXBwb3J0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcHJvcGVydHlDaGFuZ2VTdXBwb3J0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLAotCQkJCWxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLAotCQkJT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXByb3BlcnR5Q2hhbmdlU3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwKLQkJCQluZXdWYWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgb2xkVmFsdWUsCi0JCQlpbnQgbmV3VmFsdWUpIHsKLQkJcHJvcGVydHlDaGFuZ2VTdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLAotCQkJCW5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgc3RyaW5nKSB7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IGlkOwotCQlpZCA9IHN0cmluZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKCJpZCIsIG9sZFZhbHVlLCBpZCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGFwcGVuZChPYmplY3RbXSBhcnJheSwgT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLQkJbmV3TGlzdC5hZGQob2JqZWN0KTsKLQkJcmV0dXJuIG5ld0xpc3QudG9BcnJheSgoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFycmF5LmdldENsYXNzKCkKLQkJCQkuZ2V0Q29tcG9uZW50VHlwZSgpLCBuZXdMaXN0LnNpemUoKSkpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3RbXSByZW1vdmUoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0JCW5ld0xpc3QucmVtb3ZlKG9iamVjdCk7Ci0JCXJldHVybiBuZXdMaXN0LnRvQXJyYXkoKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhcnJheS5nZXRDbGFzcygpCi0JCQkJLmdldENvbXBvbmVudFR5cGUoKSwgbmV3TGlzdC5zaXplKCkpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvbW9kZWwvUGhvbmVDb252ZXJ0ZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9QaG9uZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjMzODQxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9QaG9uZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyOwotIAotcHVibGljIGNsYXNzIFBob25lQ29udmVydGVyIGltcGxlbWVudHMgSUNvbnZlcnRlciB7Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0TW9kZWxUeXBlKCkgewotCQlyZXR1cm4gU3RyaW5nLmNsYXNzOwotCX0KLQlwdWJsaWMgQ2xhc3MgZ2V0VGFyZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFN0cmluZy5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRUYXJnZXRUb01vZGVsKE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJLy8gVW5mb3JtYXQgdGhlIGZvcm1hdHRlZCBwaG9uZSB0byBhIHJhdyBTdHJpbmcKLQkJcmV0dXJuIHJlbW92ZUZvcm1hdHRpbmcoKFN0cmluZyl0YXJnZXRPYmplY3QpOwotCX0KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRNb2RlbFRvVGFyZ2V0KE9iamVjdCBtb2RlbE9iamVjdCkgewotCQlTdHJpbmcgdW5mb3JtYXR0ZWRQaG9uZSA9IChTdHJpbmcpbW9kZWxPYmplY3Q7Ci0JCWlmKHVuZm9ybWF0dGVkUGhvbmUgPT0gbnVsbCB8fCB1bmZvcm1hdHRlZFBob25lLmxlbmd0aCgpICE9IDEwKXsKLQkJCXJldHVybiB1bmZvcm1hdHRlZFBob25lOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigxMyk7Ci0JCQlzYi5hcHBlbmQodW5mb3JtYXR0ZWRQaG9uZS5zdWJzdHJpbmcoMCwzKSk7Ci0JCQlzYi5hcHBlbmQoJy0nKTsKLQkJCXNiLmFwcGVuZCh1bmZvcm1hdHRlZFBob25lLnN1YlNlcXVlbmNlKDMsNikpOwotCQkJc2IuYXBwZW5kKCctJyk7Ci0JCQlzYi5hcHBlbmQodW5mb3JtYXR0ZWRQaG9uZS5zdWJTZXF1ZW5jZSg2LDEwKSk7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQlzdGF0aWMgU3RyaW5nIHJlbW92ZUZvcm1hdHRpbmcoU3RyaW5nIGZvcm1hdHRlZFBob25lKXsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcig5KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYXR0ZWRQaG9uZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaGFyIGMgPSBmb3JtYXR0ZWRQaG9uZS5jaGFyQXQoaSk7Ci0JCQlpZignMCcgPD0gYyAmJiAnOScgPj0gYyl7Ci0JCQkJc2IuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL1Bob25lVmFsaWRhdG9yLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvbW9kZWwvUGhvbmVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwMWJmYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvbW9kZWwvUGhvbmVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIFBob25lVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGlzUGFydGlhbGx5VmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBpc1ZhbGlkKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCVN0cmluZyByYXdQaG9uZU51bWJlciA9IFBob25lQ29udmVydGVyLnJlbW92ZUZvcm1hdHRpbmcoKFN0cmluZyl2YWx1ZSk7Ci0JCWlmKHJhd1Bob25lTnVtYmVyLmxlbmd0aCgpICE9IDEwKXsKLQkJCXJldHVybiAiUGhvbmUgbnVtYmVyIG11c3QgYmUgMTAgY2hhcmFjdGVycyI7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL1ByaWNlTW9kZWxPYmplY3QuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9QcmljZU1vZGVsT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDVjZDQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL1ByaWNlTW9kZWxPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgUHJpY2VNb2RlbE9iamVjdCBleHRlbmRzIE1vZGVsT2JqZWN0IHsKLQkKLQlwcml2YXRlIGRvdWJsZSBwcmljZTsKLQkKLQlwdWJsaWMgZG91YmxlIGdldERvdWJsZSgpewotCQlyZXR1cm4gcHJpY2U7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFByaWNlKGRvdWJsZSBhUHJpY2UpewotCQlpbnQgb2xkRG9sbGFycyA9IGdldERvbGxhcnMoKTsKLQkJaW50IG9sZENlbnRzID0gZ2V0Q2VudHMoKTsKLQkJZG91YmxlIG9sZFZhbHVlID0gcHJpY2U7Ci0JCXByaWNlID0gYVByaWNlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoImRvbGxhcnMiLG9sZERvbGxhcnMsZ2V0RG9sbGFycygpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKCJjZW50cyIsb2xkQ2VudHMsZ2V0Q2VudHMoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgicHJpY2UiLG5ldyBEb3VibGUob2xkVmFsdWUpLCBuZXcgRG91YmxlKHByaWNlKSk7Ci0JfQotCQotCXB1YmxpYyBkb3VibGUgZ2V0UHJpY2UoKXsKLQkJcmV0dXJuIHByaWNlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2VudHMoKXsKLQkJcmV0dXJuIChpbnQpICgxMDAqcHJpY2UgLSAxMDAqTWF0aC5mbG9vcihwcmljZSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDZW50cyhpbnQgY2VudHMpewotCQlkb3VibGUgb2xkUHJpY2UgPSBnZXRQcmljZSgpOwotCQlpbnQgb2xkQ2VudHMgPSBnZXRDZW50cygpOwotCQlwcmljZSA9IGdldERvbGxhcnMoKSArIGNlbnRzICouMDE7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgiY2VudHMiLG9sZENlbnRzLGdldENlbnRzKCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoInByaWNlIiwgbmV3IERvdWJsZShvbGRQcmljZSksIG5ldyBEb3VibGUocHJpY2UpKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXREb2xsYXJzKCl7Ci0JCXJldHVybiBuZXcgRG91YmxlKHByaWNlKS5pbnRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREb2xsYXJzKGludCBkb2xsYXJzKXsKLQkJZG91YmxlIG9sZFByaWNlID0gZ2V0UHJpY2UoKTsKLQkJaW50IG9sZERvbGxhcnMgPSBnZXREb2xsYXJzKCk7Ci0JCXByaWNlID0gZG9sbGFycyArIGdldENlbnRzKCkgKi4wMTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKCJkb2xsYXJzIixvbGREb2xsYXJzLGdldERvbGxhcnMoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgicHJpY2UiLCBuZXcgRG91YmxlKG9sZFByaWNlKSwgbmV3IERvdWJsZShwcmljZSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL1NhbXBsZURhdGEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9TYW1wbGVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NGJlN2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL1NhbXBsZURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQmVhblVwZGF0YWJsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuRGF0YUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklEYXRhQmluZGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuc3d0LlNXVFVwZGF0YWJsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2Vycy5WaWV3ZXJzVXBkYXRhYmxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi1wdWJsaWMgY2xhc3MgU2FtcGxlRGF0YSB7Ci0KLQlwdWJsaWMgc3RhdGljIENhdGVnb3J5IFdJTlRFUl9DQVRFR09SWTsKLQotCXB1YmxpYyBzdGF0aWMgQ2F0ZWdvcnkgU1VNTUVSX0NBVEVHT1JZOwotCi0JcHVibGljIHN0YXRpYyBBZHZlbnR1cmUgQkVBQ0hfSE9MSURBWTsKLQotCXB1YmxpYyBzdGF0aWMgQWR2ZW50dXJlIFJBRlRJTkdfSE9MSURBWTsKLQotCXB1YmxpYyBzdGF0aWMgQWR2ZW50dXJlIFdJTlRFUl9IT0xJREFZOwotCi0JcHVibGljIHN0YXRpYyBBZHZlbnR1cmUgSUNFX0ZJU0hJTkc7Ci0KLQlwdWJsaWMgc3RhdGljIExvZGdpbmcgRklWRV9TVEFSX0hPVEVMOwotCi0JcHVibGljIHN0YXRpYyBMb2RnaW5nIFlPVVRIX0hPU1RFTDsKLQotCXB1YmxpYyBzdGF0aWMgTG9kZ2luZyBDQU1QX0dST1VORDsKLQotCXB1YmxpYyBzdGF0aWMgQ2F0YWxvZyBDQVRBTE9HXzIwMDU7Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydGF0aW9uIEdSRVlIT1VORF9CVVM7Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydGF0aW9uIEVYRUNVVElWRV9KRVQ7Ci0KLQlwdWJsaWMgc3RhdGljIEFjY291bnQgUFJFU0lERU5UOwotCi0JcHVibGljIHN0YXRpYyBBY2NvdW50IERFTlRJU1Q7Ci0KLQlwdWJsaWMgc3RhdGljIEFjY291bnQgU0FOVEFfQ0xBVVM7Ci0KLQlwdWJsaWMgc3RhdGljIENhcnQgQ0FSVDsKLQotCXB1YmxpYyBzdGF0aWMgQWR2ZW50dXJlRmFjdG9yeSBGQUNUT1JZOwotCQotCXB1YmxpYyBzdGF0aWMgSVRyZWUgQ0FUQUxPR19UUkVFOwotCQotCXB1YmxpYyBzdGF0aWMgSVRyZWUgQ0FURUdPUllfVFJFRTsKLQkKLQlwdWJsaWMgc3RhdGljIFNpZ25vbiBTSUdOT05fQURNSU5JU1RSQVRPUjsKLQkKLQlwdWJsaWMgc3RhdGljIFNpZ25vbiBTSUdOT05fSk9FQkxPR0dTOwkKLQotCXByaXZhdGUgc3RhdGljIFNXVFVwZGF0YWJsZUZhY3Rvcnkgc3d0VXBkYXRhYmxlRmFjdG9yeSA9IG5ldyBTV1RVcGRhdGFibGVGYWN0b3J5KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgVmlld2Vyc1VwZGF0YWJsZUZhY3Rvcnkgdmlld2Vyc1VwZGF0YWJsZUZhY3RvcnkgPSBuZXcgVmlld2Vyc1VwZGF0YWJsZUZhY3RvcnkoKTsKLQotCXN0YXRpYyB7Ci0JCWluaXRpYWxpemVEYXRhKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVEYXRhKCkgewotCi0JCUZBQ1RPUlkgPSBuZXcgQWR2ZW50dXJlRmFjdG9yeSgpOwotCi0JCUNBVEFMT0dfMjAwNSA9IEZBQ1RPUlkuY3JlYXRlQ2F0YWxvZygpOwotCi0JCS8vIENhdGVnb3JpZXMKLQkJV0lOVEVSX0NBVEVHT1JZID0gRkFDVE9SWS5jcmVhdGVDYXRlZ29yeSgpOwotCQlXSU5URVJfQ0FURUdPUlkuc2V0TmFtZSgiRnJlZXplIEFkdmVudHVyZXMiKTsKLQkJV0lOVEVSX0NBVEVHT1JZLnNldElkKCIxMDAiKTsKLQkJQ0FUQUxPR18yMDA1LmFkZENhdGVnb3J5KFdJTlRFUl9DQVRFR09SWSk7Ci0KLQkJU1VNTUVSX0NBVEVHT1JZID0gRkFDVE9SWS5jcmVhdGVDYXRlZ29yeSgpOwotCQlTVU1NRVJfQ0FURUdPUlkuc2V0TmFtZSgiSG90IEFkdmVudHVyZXMiKTsKLQkJU1VNTUVSX0NBVEVHT1JZLnNldElkKCIyMDAiKTsKLQkJQ0FUQUxPR18yMDA1LmFkZENhdGVnb3J5KFNVTU1FUl9DQVRFR09SWSk7Ci0KLQkJLy8gQWR2ZW50dXJlcwotCQlXSU5URVJfSE9MSURBWSA9IEZBQ1RPUlkuY3JlYXRlQWR2ZW50dXJlKCk7Ci0JCVdJTlRFUl9IT0xJREFZLnNldERlc2NyaXB0aW9uKCJXaW50ZXIgaG9saWRheSBpbiBGcmFuY2UiKTsKLQkJV0lOVEVSX0hPTElEQVkuc2V0TmFtZSgiU2tpIEFscHMiKTsKLQkJV0lOVEVSX0hPTElEQVkuc2V0TG9jYXRpb24oIkNoYW1vbml4Iik7Ci0JCVdJTlRFUl9IT0xJREFZLnNldFByaWNlKDQwMDAuNTJkKTsKLQkJV0lOVEVSX0hPTElEQVkuc2V0SWQoIjE1MCIpOwotCQlXSU5URVJfSE9MSURBWS5zZXRNYXhOdW1iZXJPZlBlb3BsZSgzKTsJCQotCQlXSU5URVJfQ0FURUdPUlkuYWRkQWR2ZW50dXJlKFdJTlRFUl9IT0xJREFZKTsKLQotCQlJQ0VfRklTSElORyA9IEZBQ1RPUlkuY3JlYXRlQWR2ZW50dXJlKCk7Ci0JCUlDRV9GSVNISU5HLnNldERlc2NyaXB0aW9uKCJJY2UgRmlzaGluZyBpbiBIZWxzaW5raSIpOwotCQlJQ0VfRklTSElORy5zZXROYW1lKCJJY2UgRmlzaGluZyIpOwotCQlJQ0VfRklTSElORy5zZXRMb2NhdGlvbigiRmlubGFuZCIpOwotCQlJQ0VfRklTSElORy5zZXRQcmljZSgzNzUuNTVkKTsKLQkJV0lOVEVSX0NBVEVHT1JZLmFkZEFkdmVudHVyZShJQ0VfRklTSElORyk7Ci0KLQkJQkVBQ0hfSE9MSURBWSA9IEZBQ1RPUlkuY3JlYXRlQWR2ZW50dXJlKCk7Ci0JCUJFQUNIX0hPTElEQVkuc2V0RGVzY3JpcHRpb24oIkJlYWNoIGhvbGlkYXkgaW4gU3BhaW4iKTsKLQkJQkVBQ0hfSE9MSURBWS5zZXROYW1lKCJQbGF5YSIpOwotCQlCRUFDSF9IT0xJREFZLnNldExvY2F0aW9uKCJMbG9yZXQgZGUgTWFyIik7Ci0JCUJFQUNIX0hPTElEQVkuc2V0UHJpY2UoMjAwMC41MmQpOwotCQlCRUFDSF9IT0xJREFZLnNldElkKCIyNTAiKTsKLQkJU1VNTUVSX0NBVEVHT1JZLmFkZEFkdmVudHVyZShCRUFDSF9IT0xJREFZKTsKLQotCQlSQUZUSU5HX0hPTElEQVkgPSBGQUNUT1JZLmNyZWF0ZUFkdmVudHVyZSgpOwotCQlSQUZUSU5HX0hPTElEQVkKLQkJCQkuc2V0RGVzY3JpcHRpb24oIldoaXRlIHdhdGVyIHJhZnRpbmcgb24gdGhlIE90dGF3YSByaXZlciIpOwotCQlSQUZUSU5HX0hPTElEQVkuc2V0TmFtZSgiV2hpdGV3YXRlciIpOwotCQlSQUZUSU5HX0hPTElEQVkuc2V0TG9jYXRpb24oIk90dGF3YSIpOwotCQlSQUZUSU5HX0hPTElEQVkuc2V0UHJpY2UoODAwMC41MmQpOwotCQlSQUZUSU5HX0hPTElEQVkuc2V0SWQoIjI3MCIpOwotCQlTVU1NRVJfQ0FURUdPUlkuYWRkQWR2ZW50dXJlKFJBRlRJTkdfSE9MSURBWSk7Ci0KLQkJLy8gTG9kZ2luZ3MKLQkJRklWRV9TVEFSX0hPVEVMID0gRkFDVE9SWS5jcmVhdGVMb2RnaW5nKCk7Ci0JCUZJVkVfU1RBUl9IT1RFTC5zZXREZXNjcmlwdGlvbigiRGVsdXhlIHBhbGFjZSIpOwotCQlGSVZFX1NUQVJfSE9URUwuc2V0TmFtZSgiRmxhc2h5Iik7Ci0JCVlPVVRIX0hPU1RFTCA9IEZBQ1RPUlkuY3JlYXRlTG9kZ2luZygpOwotCQlZT1VUSF9IT1NURUwuc2V0RGVzY3JpcHRpb24oIllvdXRoIEhvc3RlbCIpOwotCQlZT1VUSF9IT1NURUwuc2V0TmFtZSgiQmFzaWMiKTsKLQkJQ0FNUF9HUk9VTkQgPSBGQUNUT1JZLmNyZWF0ZUxvZGdpbmcoKTsKLQkJQ0FNUF9HUk9VTkQuc2V0RGVzY3JpcHRpb24oIkNhbXAgZ3JvdW5kIik7Ci0JCUNBTVBfR1JPVU5ELnNldE5hbWUoIldldEFuZENvbGQiKTsKLQkJQ0FUQUxPR18yMDA1LmFkZExvZGdpbmcoRklWRV9TVEFSX0hPVEVMKTsKLQkJQ0FUQUxPR18yMDA1LmFkZExvZGdpbmcoWU9VVEhfSE9TVEVMKTsKLQkJQ0FUQUxPR18yMDA1LmFkZExvZGdpbmcoQ0FNUF9HUk9VTkQpOwotCQlXSU5URVJfSE9MSURBWS5zZXREZWZhdWx0TG9kZ2luZyhZT1VUSF9IT1NURUwpOwotCi0JCS8vIFRyYW5zcG9yYXRpb24KLQkJR1JFWUhPVU5EX0JVUyA9IEZBQ1RPUlkuY3JlYXRlVHJhbnNwb3J0YXRpb24oKTsKLQkJR1JFWUhPVU5EX0JVUy5zZXRBcnJpdmFsVGltZSgiMTQ6MzAiKTsKLQkJR1JFWUhPVU5EX0JVUy5zZXRQcmljZSgyNS41MCk7CQkKLQkJQ0FUQUxPR18yMDA1LmFkZFRyYW5zcG9ydGF0aW9uKEdSRVlIT1VORF9CVVMpOwotCQlFWEVDVVRJVkVfSkVUID0gRkFDVE9SWS5jcmVhdGVUcmFuc3BvcnRhdGlvbigpOwotCQlFWEVDVVRJVkVfSkVULnNldEFycml2YWxUaW1lKCIxMToxMCIpOwotCQlFWEVDVVRJVkVfSkVULnNldFByaWNlKDE1MDAuOTkpOwotCQlDQVRBTE9HXzIwMDUuYWRkVHJhbnNwb3J0YXRpb24oRVhFQ1VUSVZFX0pFVCk7Ci0KLQkJLy8gQWNjb3VudHMKLQkJUFJFU0lERU5UID0gRkFDVE9SWS5jcmVhdGVBY2NvdW50KCk7Ci0JCVBSRVNJREVOVC5zZXRGaXJzdE5hbWUoIkdlb3JnZSIpOwotCQlQUkVTSURFTlQuc2V0TGFzdE5hbWUoIkJ1c2giKTsKLQkJUFJFU0lERU5ULnNldFN0YXRlKCJUWCIpOwotCQlQUkVTSURFTlQuc2V0UGhvbmUoIjExMTIyMjMzMzMiKTsKLQkJUFJFU0lERU5ULnNldENvdW50cnkoIlUuUy5BIik7Ci0JCURFTlRJU1QgPSBGQUNUT1JZLmNyZWF0ZUFjY291bnQoKTsKLQkJREVOVElTVC5zZXRGaXJzdE5hbWUoIlRvb3RoIik7Ci0JCURFTlRJU1Quc2V0TGFzdE5hbWUoIkZhaXJ5Iik7Ci0JCURFTlRJU1Quc2V0U3RhdGUoIkNBIik7Ci0JCURFTlRJU1Quc2V0UGhvbmUoIjQ1NDMyMTk4NzYiKTsKLQkJREVOVElTVC5zZXRDb3VudHJ5KCJQYWluTGFuZCIpOwotCQlTQU5UQV9DTEFVUyA9IEZBQ1RPUlkuY3JlYXRlQWNjb3VudCgpOwotCQlTQU5UQV9DTEFVUy5zZXRGaXJzdE5hbWUoIkNocmlzIik7Ci0JCVNBTlRBX0NMQVVTLnNldExhc3ROYW1lKCJDaHJpbmdsZSIpOwotCQlTQU5UQV9DTEFVUy5zZXRTdGF0ZSgiV0kiKTsKLQkJU0FOVEFfQ0xBVVMuc2V0UGhvbmUoIjg2MTc0Mjk4NTYiKTsKLQkJU0FOVEFfQ0xBVVMuc2V0Q291bnRyeSgiTm9ydGhQb2xlIik7Ci0JCUNBVEFMT0dfMjAwNS5hZGRBY2NvdW50KFBSRVNJREVOVCk7Ci0JCUNBVEFMT0dfMjAwNS5hZGRBY2NvdW50KERFTlRJU1QpOwotCQlDQVRBTE9HXzIwMDUuYWRkQWNjb3VudChTQU5UQV9DTEFVUyk7Ci0JCQotCQkvLyBTaWdub25zCi0JCVNJR05PTl9BRE1JTklTVFJBVE9SID0gbmV3IFNpZ25vbigiQWRtaW5pc3RyYXRvciIsIkZvbzEyM0JhciIpOwotCQlTSUdOT05fSk9FQkxPR0dTID0gbmV3IFNpZ25vbigiSm9lQmxvZ2dzIiwiSGFycnk1UG90dGVyIik7Ci0JCUNBVEFMT0dfMjAwNS5hZGRTaWdub24oU0lHTk9OX0FETUlOSVNUUkFUT1IpOwotCQlDQVRBTE9HXzIwMDUuYWRkU2lnbm9uKFNJR05PTl9KT0VCTE9HR1MpOwkJCQkKLQotCQlDQVJUID0gRkFDVE9SWS5jcmVhdGVDYXJ0KCk7Ci0JCQotCQlDQVRBTE9HX1RSRUUgPSBuZXcgSVRyZWUoKSB7Ci0JCQlDYXRhbG9nIGNhdGFsb2cgPSBDQVRBTE9HXzIwMDU7CQkJCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2F0YWxvZykgewkJCQkJCi0JCQkJCXJldHVybiB0cnVlOyAgCi0JCQkJfQotCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDYXRlZ29yeSkgewotCQkJCQlBZHZlbnR1cmVbXSBsaXN0ID0gKChDYXRlZ29yeSllbGVtZW50KS5nZXRBZHZlbnR1cmVzKCk7Ci0JCQkJCXJldHVybiBsaXN0PT1udWxsP3RydWU6bGlzdC5sZW5ndGg+MDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExvZGdpbmcpIHsKLQkJCQkJCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsJCQkJCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJCQkvLyBSZWFkT25seSBmb3IgQWRkaW5nIEVsZW1lbnRzCi0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQlpZiAocGFyZW50RWxlbWVudD09bnVsbCkKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGNhdGFsb2cgfTsKLQkJCQllbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2F0YWxvZykgewotCQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CQkJCQkKLQkJCQkJbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdCgoKENhdGFsb2cpcGFyZW50RWxlbWVudCkuZ2V0Q2F0ZWdvcmllcygpKSk7Ci0JCQkJCWxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoKChDYXRhbG9nKXBhcmVudEVsZW1lbnQpLmdldExvZGdpbmdzKCkpKTsKLQkJCQkJbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdCgoKENhdGFsb2cpcGFyZW50RWxlbWVudCkuZ2V0QWNjb3VudHMoKSkpOwotCQkJCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBDYXRlZ29yeSkKLQkJCQkgICByZXR1cm4gKChDYXRlZ29yeSlwYXJlbnRFbGVtZW50KS5nZXRBZHZlbnR1cmVzKCk7CQkJCQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcHVibGljIENsYXNzW10gZ2V0VHlwZXMoKSB7CQkJCQotCQkJCXJldHVybiBuZXcgQ2xhc3NbXSAgeyBDYXRhbG9nLmNsYXNzLCBDYXRlZ29yeS5jbGFzcywgTG9kZ2luZy5jbGFzcywgQWNjb3VudC5jbGFzcywgQWR2ZW50dXJlLmNsYXNzIH0gOwotCQkJfQotCQkJcHVibGljIHZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKElDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewkJCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoSUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewkJCQkKLQkJCX0KLQkJfTsKLQkJCi0JCUNBVEVHT1JZX1RSRUUgPSBuZXcgSVRyZWUoKSB7Ci0JCQlDYXRhbG9nIGNhdGFsb2cgPSBDQVRBTE9HXzIwMDU7CQkJCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2F0YWxvZykgewkJCQkJCi0JCQkJCXJldHVybiB0cnVlOyAgCi0JCQkJfQotCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDYXRlZ29yeSkgewotCQkJCQlBZHZlbnR1cmVbXSBsaXN0ID0gKChDYXRlZ29yeSllbGVtZW50KS5nZXRBZHZlbnR1cmVzKCk7Ci0JCQkJCXJldHVybiBsaXN0PT1udWxsP3RydWU6bGlzdC5sZW5ndGg+MDsKLQkJCQl9CQkJCi0JCQkJcmV0dXJuIGZhbHNlOwkJCQkKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkJCS8vIFJlYWRPbmx5IGZvciBBZGRpbmcgRWxlbWVudHMKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJCWlmIChwYXJlbnRFbGVtZW50PT1udWxsKQotCQkJCQlyZXR1cm4gY2F0YWxvZy5nZXRDYXRlZ29yaWVzKCk7Ci0JCQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIENhdGVnb3J5KQotCQkJCSAgIHJldHVybiAoKENhdGVnb3J5KXBhcmVudEVsZW1lbnQpLmdldEFkdmVudHVyZXMoKTsJCQkJCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlwdWJsaWMgQ2xhc3NbXSBnZXRUeXBlcygpIHsJCQkJCi0JCQkJcmV0dXJuIG5ldyBDbGFzc1tdICB7IENhdGVnb3J5LmNsYXNzLCBBY2NvdW50LmNsYXNzIH0gOwotCQkJfQotCQkJcHVibGljIHZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKElDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewkJCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoSUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElEYXRhQmluZGluZ0NvbnRleHQgZ2V0RGF0YWJpbmRpbmdDb250ZXh0KENvbnRyb2wgYUNvbnRyb2wpIHsKLQkJSURhdGFCaW5kaW5nQ29udGV4dCByZXN1bHQgPSBEYXRhQmluZGluZy5jcmVhdGVDb250ZXh0KGFDb250cm9sLAotCQkJCW5ldyBJVXBkYXRhYmxlRmFjdG9yeVtdIHsgbmV3IEJlYW5VcGRhdGFibGVGYWN0b3J5KCksCi0JCQkJCQlzd3RVcGRhdGFibGVGYWN0b3J5LCB2aWV3ZXJzVXBkYXRhYmxlRmFjdG9yeX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU1dUVXBkYXRhYmxlRmFjdG9yeSBnZXRTV1RVcGRhdGFibGVGYWN0b3J5KCkgewotCQlyZXR1cm4gc3d0VXBkYXRhYmxlRmFjdG9yeTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBWaWV3ZXJzVXBkYXRhYmxlRmFjdG9yeSBnZXRWaWV3ZXJzVXBkYXRhYmxlRmFjdG9yeSgpewotCQlyZXR1cm4gdmlld2Vyc1VwZGF0YWJsZUZhY3Rvcnk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvbW9kZWwvU2lnbm9uLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvZXhhbXBsZXMvZGF0YWJpbmRpbmcvbW9kZWwvU2lnbm9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTI4OWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL1NpZ25vbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbDsKLQotcHVibGljIGNsYXNzIFNpZ25vbiBleHRlbmRzIE1vZGVsT2JqZWN0IHsKLQkKLQlTdHJpbmcgdXNlcklkOwotCVN0cmluZyBwYXNzd29yZDsKLQkKLQlwdWJsaWMgU2lnbm9uKFN0cmluZyBhVXNlcklkLCBTdHJpbmcgYVBhc3N3b3JkKSB7Ci0JCXVzZXJJZCA9IGFVc2VySWQ7Ci0JCXBhc3N3b3JkID0gYVBhc3N3b3JkOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotCQlyZXR1cm4gcGFzc3dvcmQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBhUGFzc3dvcmQpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gcGFzc3dvcmQ7Ci0JCXBhc3N3b3JkID0gYVBhc3N3b3JkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoInBhc3N3b3JkIixvbGRWYWx1ZSxwYXNzd29yZCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcklkKCkgewotCQlyZXR1cm4gdXNlcklkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRVc2VySWQoU3RyaW5nIGFVc2VySWQpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdXNlcklkOwotCQl1c2VySWQgPSBhVXNlcklkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoInVzZXJJZCIsb2xkVmFsdWUsdXNlcklkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9TdGF0ZUNvbnZlcnRlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL1N0YXRlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNDEzZGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL1N0YXRlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlci5JQ29udmVydGVyOwotIAotcHVibGljIGNsYXNzIFN0YXRlQ29udmVydGVyIGltcGxlbWVudHMgSUNvbnZlcnRlciB7Ci0JCi0JLyoKLQkgKiBTdGF0ZSBBYmJyZXZpYXRpb25zCi0JICogIAotCSAqIEZyb206IGh0dHA6Ly93d3cudXNwcy5jb20vbmNzYy9sb29rdXBzL3VzcHNfYWJicmV2aWF0aW9ucy5odG1sCi0JICogCi0JICogQUxBQkFNQSAtPiBBTAotCSAqIEFMQVNLQSAtPiBBSwotCSAqIEFNRVJJQ0FOIFNBTU9BIC0+IEFTCi0JICogQVJJWk9OQSAtPiBBWgotCSAqIEFSS0FOU0FTIC0+IEFSCi0JICogQ0FMSUZPUk5JQSAtPiBDQQotCSAqIENPTE9SQURPIC0+IENPCi0JICogQ09OTkVDVElDVVQgLT4gQ1QKLQkgKiBERUxBV0FSRSAtPiBERQotCSAqIERJU1RSSUNUIE9GIENPTFVNQklBIC0+IERDCi0JICogRkVERVJBVEVEIFNUQVRFUyBPRiBNSUNST05FU0lBIC0+IEZNCi0JICogRkxPUklEQSAtPiBGTAotCSAqIEdFT1JHSUEgLT4gR0EKLQkgKiBHVUFNIC0+IEdVCi0JICogSEFXQUlJIC0+IEhJCi0JICogSURBSE8gLT4gSUQKLQkgKiBJTExJTk9JUyAtPiBJTAotCSAqIElORElBTkEgLT4gSU4KLQkgKiBJT1dBIC0+IElBCi0JICogS0FOU0FTIC0+IEtTCi0JICogS0VOVFVDS1kgLT4gS1kKLQkgKiBMT1VJU0lBTkEgLT4gTEEKLQkgKiBNQUlORSAtPiBNRQotCSAqIE1BUlNIQUxMIElTTEFORFMgLT4gTUgKLQkgKiBNQVJZTEFORCAtPiBNRAotCSAqIE1BU1NBQ0hVU0VUVFMgLT4gTUEKLQkgKiBNSUNISUdBTiAtPiBNSQotCSAqIE1JTk5FU09UQSAtPiBNTgotCSAqIE1JU1NJU1NJUFBJIC0+IE1TCi0JICogTUlTU09VUkkgLT4gTU8KLQkgKiBNT05UQU5BIC0+IE1UCi0JICogTkVCUkFTS0EgLT4gTkUKLQkgKiBORVZBREEgLT4gTlYKLQkgKiBORVcgSEFNUFNISVJFIC0+IE5ICi0JICogTkVXIEpFUlNFWSAtPiBOSgotCSAqIE5FVyBNRVhJQ08gLT4gTk0KLQkgKiBORVcgWU9SSyAtPiBOWQotCSAqIE5PUlRIIENBUk9MSU5BIC0+IE5DCi0JICogTk9SVEggREFLT1RBIC0+IE5ECi0JICogTk9SVEhFUk4gTUFSSUFOQSBJU0xBTkRTIC0+IE1QCi0JICogT0hJTyAtPiBPSAotCSAqIE9LTEFIT01BIC0+IE9LCi0JICogT1JFR09OIC0+IE9SCi0JICogUEFMQVUgLT4gUFcKLQkgKiBQRU5OU1lMVkFOSUEgLT4gUEEKLQkgKiBQVUVSVE8gUklDTyAtPiBQUgotCSAqIFJIT0RFIElTTEFORCAtPiBSSQotCSAqIFNPVVRIIENBUk9MSU5BIC0+IFNDCi0JICogU09VVEggREFLT1RBIC0+IFNECi0JICogVEVOTkVTU0VFIC0+IFROCi0JICogVEVYQVMgLT4gVFgKLQkgKiBVVEFIIC0+IFVUCi0JICogVkVSTU9OVCAtPiBWVAotCSAqIFZJUkdJTiBJU0xBTkRTIC0+IFZJCi0JICogVklSR0lOSUEgLT4gVkEKLQkgKiBXQVNISU5HVE9OIC0+IFdBCi0JICogV0VTVCBWSVJHSU5JQSAtPiBXVgotCSAqIFdJU0NPTlNJTiAtPiBXSQotCSAqIFdZT01JTkcgLT4gV1kKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIFNUQVRFX0xFVFRFUlMgPSBuZXcgU3RyaW5nW10gewotCQkJICAiQUwiLCJBSyIsIkFaIiwiQVIiLCJDQSIsIkNPIiwiQ1QiLCJERSIsIkRDIiwiRkwiLCJHQSIsIkdVIiwiSEkiLAotCQkJICAiSUQiLCJJTCIsIklOIiwiSUEiLCJLUyIsIktZIiwiTEEiLCJNRSIsIk1EIiwiTUEiLCJNSSIsIk1OIiwiTVMiLAotCQkJICAiTU8iLCJNVCIsIk5FIiwiTlYiLCJOSCIsIk5KIiwiTk0iLCJOWSIsIk5DIiwiTkQiLCJPSCIsIk9LIiwiT1IiLAotCQkJICAiUEEiLCJQUiIsIlJJIiwiU0MiLCJTRCIsIlROIiwiVFgiLCJVVCIsIlZBIiwiVkkiLCJXQSIsIldWIiwiV0kiLCAiV1kiIAotCX07Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBTVEFURV9OQU1FUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkiQWxhYmFtYSIsIkFsYXNrYSIsIkFyaXpvbmEiLCJBcmthbnNhcyIsIkNhbGlmb3JuaWEiLCJDb2xvcmFkbyIsIkNPTk5FQ1RJQ1VUIiwiRGVsYXdhcmUiLCJXYXNoaW5ndG9uIERDIiwiRmxvcmlkYSIsIkdlb3JnaWEiLCJHVUFNIiwiSGF3YWlpIiwKLQkJCSJJZGFobyIsIklsbGlub2lzIiwiSW5kaWFuYSIsIklvd2EiLCJLYW5zYXMiLCJLRU5UVUNLWSIsIkxPVUlTSUFOQSIsIk1BSU5FIiwiTUFSWUxBTkQiLCJNaWNoaWdhbiIsIk1BU1NBQ0hVU0VUVFMiLCJNaW5uZXNvdGEiLCJNaXNzaXNzaXBwaSIsCi0JCQkiTUlTU09VUkkiLCJNT05UQU5BIiwiTkVCUkFTS0EiLCJOZXZhZGEiLCJOZXcgSGFtcHNoaXJlIiwiTmV3IEplcnNleSIsIk5ldyBNZXhpY28iLCJOZXcgWW9yayIsIk5vcnRoIENhcm9saW5hIiwiTm9ydGggRGFrb3RhIiwiT2hpbyIsIk9rbGFobW9hIiwiT3JlZ29uIiwKLQkJCSJQZW5zeWx2YW5pYSIsIlBVRVJUTyBSSUNPIiwiUmhvZGUgSXNsYW5kIiwiU291dGggQ2Fyb2xpbmEiLCJTb3V0aCBEYWtvdGEiLCJURU5ORVNTRUUiLCJUZXhhcyIsIlV0YWgiLCJWRVJNT05UIiwgIlZJUkdJTiBJU0xBTkRTIiwiVmlyZ2luaWEiLCJXYXNoaW5ndG9uIiwiV2VzdCBWaXJnaW5pYSIsIldpc2NvbnNpbiIsICJXeW9taW5nIgotCX07Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0TW9kZWxUeXBlKCkgewotCQlyZXR1cm4gU3RyaW5nLmNsYXNzOwotCX0KLQlwdWJsaWMgQ2xhc3MgZ2V0VGFyZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFN0cmluZy5jbGFzczsKLQl9Ci0JcHVibGljIE9iamVjdCBjb252ZXJ0VGFyZ2V0VG9Nb2RlbChPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCVN0cmluZyBzdGF0ZU5hbWUgPSAoU3RyaW5nKXRhcmdldE9iamVjdDsKLQkJaWYoc3RhdGVOYW1lICE9IG51bGwpewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTVEFURV9OQU1FUy5sZW5ndGg7IGkrKykgewotCQkJCWlmKFNUQVRFX05BTUVTW2ldLmVxdWFsc0lnbm9yZUNhc2Uoc3RhdGVOYW1lKSl7Ci0JCQkJCXJldHVybiBTVEFURV9MRVRURVJTW2ldOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIE9iamVjdCBjb252ZXJ0TW9kZWxUb1RhcmdldChPYmplY3QgbW9kZWxPYmplY3QpIHsKLQkJLy8gUmV0dXJuIHRoZSBzdGF0ZSBuYW1lIGZvciB0aGUgbGV0dGVyCi0JCVN0cmluZyBzdGF0ZUxldHRlciA9IChTdHJpbmcpbW9kZWxPYmplY3Q7Ci0JCWlmKHN0YXRlTGV0dGVyICE9IG51bGwpewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTVEFURV9MRVRURVJTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYoU1RBVEVfTEVUVEVSU1tpXS5lcXVhbHMoc3RhdGVMZXR0ZXIpKXsKLQkJCQkJcmV0dXJuIFNUQVRFX05BTUVTW2ldOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gIj8/IiArIFNUQVRFX0xFVFRFUlMgKyAiPz8iOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS9leGFtcGxlcy9kYXRhYmluZGluZy9tb2RlbC9UcmFuc3BvcnRhdGlvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL1RyYW5zcG9ydGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYTUwNzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL2V4YW1wbGVzL2RhdGFiaW5kaW5nL21vZGVsL1RyYW5zcG9ydGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNwb3J0YXRpb24gZXh0ZW5kcyBNb2RlbE9iamVjdCB7Ci0KLQlwcml2YXRlIFN0cmluZyBhcnJpdmFsVGltZTsKLQlwcml2YXRlIGRvdWJsZSBwcmljZTsKLQotCXB1YmxpYyB2b2lkIHNldEFycml2YWxUaW1lKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gYXJyaXZhbFRpbWU7Ci0JCWFycml2YWxUaW1lID0gc3RyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoImFycml2YWx0aW1lIixvbGRWYWx1ZSxzdHJpbmcpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFycml2YWxUaW1lKCl7Ci0JCXJldHVybiBhcnJpdmFsVGltZTsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIGdldFByaWNlKCkgewotCQlyZXR1cm4gcHJpY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJpY2UoZG91YmxlIGFQcmljZSkgewotCQlkb3VibGUgb2xkUHJpY2UgPSBwcmljZTsKLQkJcHJpY2UgPSBhUHJpY2U7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZSgicHJpY2UiLG5ldyBEb3VibGUob2xkUHJpY2UpLG5ldyBEb3VibGUocHJpY2UpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmNvbnRyaWJ1dGlvbnMvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5jb250cmlidXRpb25zLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjMwNDgzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmNvbnRyaWJ1dGlvbnMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5jb250cmlidXRpb25zPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5MDkxZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2I8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL01FVEEtSU5GL01BTklGRVNULk1GIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDhmZjIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFByb2dyZXNzIEV4YW1wbGVzIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4wLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IFByb2dyZXNzRXhhbXBsZXMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLlByb2dyZXNzRXhhbXBsZXNQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLAotIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYnMuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLnZpZXdzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvUkVBRE1FLlRYVCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9SRUFETUUuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODM1MzY5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9SRUFETUUuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotVGhpcyBleGFtcGxlcyBwbHVnLWluIGRlbW9uc3RyYXRlcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOg0KLQ0KLTEuIGRlZmVycmVkIHRyZWUvdGFibGUgcG9wdWxhdGlvbg0KLSAgICAtIHNlcmlhbGl6ZWQgY2hpbGRyZW4gZmV0Y2ggam9icyBvciBjb25jdXJyZW50DQotICAgIC0gYmF0Y2hpbmcgdXBkYXRlcyB0byB0aGUgY29sbGVjdG9yDQotICAgIC0gKG9wdGlvbmFsKSBkaWZmZXJlbnQgd2F5cyBvZiBzaG93aW5nIHByb2dyZXNzIHJlcGxhY2luZyBjdXJyZW50IHBlbmRpbmcgbm9kZSAoZS5nLiBjaGFuZ2luZyBwYXJlbnQncyBsYWJlbCAvIGltYWdlKQ0KLSAgICANCi0yLiBwcm9ncmVzcyB2aWV3DQotICAgIC0gY2FuY2VsbGF0aW9uDQotICAgIC0gc2hvd2luZyBwcm9ncmVzcywgc3ViIHRhc2tzDQotICAgIC0gc2hvd2luZyBlcnJvcnMNCi0gICAgLSBwcm9ncmVzcyBncm91cHMNCi0gICAgLSBhcHBlYXJpbmcvZGlzYXBlYXJpbmcgYXMgZmxvYXRpbmcgd2luZG93DQotICAgIC0gc3lzdGVtIGpvYnMgYXJlbid0IHNob3duDQotICAgIA0KLTMuIHJlcXVlc3RJblVJDQotICAgIC0gcG9zdCBhIHJlcXVlc3QNCi0gICAgLSBwb3N0IGEgcmVxdWVzdCB0aGVuIGNhbmNlbCBiZWZvcmUgdXNlciBoYXMgbGF1bmNoZWQgaXQNCi0gICAgLSBwb3N0IGEgcmVxdWVzdCwgY2FuY2VsLCBhbmQgcmVwbGFjZSB3aXRoIGFub3RoZXINCi0gICAgLSBwb3N0IGEgcmVxdWVzdCBhbmQgYWxsb3cgdGhlIHVzZXIgdG8gY2FuY2VsIHdpdGhvdXQgcnVubmluZyB0aGUgcmVxdWVzdA0KLSAgICANCi00LiBibG9ja2VkIGZvcmVncm91bmQgb3BlcmF0aW9uDQotICAgIC0gcnVuIGEgYmFja2dyb3VuZCBqb2IgdGhhdCBsb2NrcyB0aGUgd29ya3NwYWNlDQotICAgIC0gcnVuIGEgZm9yZWdyb3VuZCBqb2IgdGhhdCByZXF1aXJlcyB3b3Jrc3BhY2UgKGV4cGVjdCBibG9ja2VkIGRpYWxvZyB3aXRoIHByb2dyZXNzIHZpZXcgZW1iZWRlZCkNCi0gICAgLSBvcGVuIGFuIGVkaXRvciBhbmQgdHlwZSB0aGVuIHNhdmUgKHByb2dyZXNzIGRpYWxvZyBzaG91bGQgc2hvdyBibG9ja2VkKQ0KLSAgICANCi01LiB3b3JrYmVuY2ggcGFydCBzdXBwb3J0IGZvciBwcm9ncmVzcw0KLSAgICAtIHJ1biBhIGpvYiBpbiB0aGUgY29udGV4dCBvZiBhIHZpZXcvZWRpdG9yDQotICAgIC0gZ2V0IGJ1c3kgY3Vyc29yIHBsdXMgYW5pbWF0aW5nIHNvbWV0aGluZw0KLSAgICAtIHZpZXcgb3IgZWRpdG9yIGFkZGluZyB0aGVpciBvd24gY3VzdG9tIGJlaGF2aW9yIHdoZW4gam9iIGlzIHJ1bg0KLSAgICANCi02LiBDcmVhdGluZyBwcm9ncmVzcyBncm91cHMNCi0gICAgLSB0aGF0IGFyZSBydW4gc2VyaWFsaXplZA0KLSAgICAtIHRoYXQgYXJlIHJ1biBjb25jdXJyZW50bHkNCi0gICAgLSBjYW5jZWwgb25lIHN1YiBqb2INCi0gICAgLSBwYXJlbnQgaXMgdXBkYXRlZCBjb3JyZWN0bHkNCi0gICAgDQotNy4gcnVubmluZyBhY3Rpb24gdmlhIGJ1c3lDdXJzb3JXaGlsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NGE4MjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS5Qcm9ncmVzc0V4YW1wbGVzLmphciA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIFByb2dyZXNzRXhhbXBsZXMuamFyLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL2RvYy9SZXNwb25zaXZlIFVJcy5wcHQgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvZG9jL1Jlc3BvbnNpdmUgVUlzLnBwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1MjUzOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvZG9jL1Jlc3BvbnNpdmUgVUlzLnBwdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9kb2MvZWNsaXBzZS1jb24tdGFsa18yLmRvYyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9kb2MvZWNsaXBzZS1jb24tdGFsa18yLmRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1ZjkyMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvZG9jL2VjbGlwc2UtY29uLXRhbGtfMi5kb2MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvZG9jL3Jlc3BvbnNpdmVfdWkuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9kb2MvcmVzcG9uc2l2ZV91aS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTA2MGY0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9kb2MvcmVzcG9uc2l2ZV91aS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLSAgPHRpdGxlPjwvdGl0bGU+Ci08L2hlYWQ+Ci0gPGJvZHk+Ci0gCi08aDE+VG93YXJkcyBhIG1vcmUgcmVzcG9uc2l2ZSBFY2xpcHNlIFVJPC9oMT4KLSAKLTxmb250IHNpemU9Ii0xIj5MYXN0IG1vZGlmaWVkOiBKdW5lIDIsIDIwMDM8L2ZvbnQ+IAotPHA+RWNsaXBzZSBpcyB3ZWxsIGtub3duIGFzIGEgcG93ZXJmdWwgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwKLWJ1dCBpdCBpcyBwZXJjZWl2ZWQgYnkgdXNlcnMgYXMgc29tZXRpbWVzIGJlaW5nIHVud2llbGR5IG9yIHVucmVzcG9uc2l2ZQotdG8gd29yayB3aXRoLiBUaGUgZ29hbCBvZiB0aGlzIHdvcmsgaXMgdG8gdW5jb3ZlciB0aGUgdW5kZXJseWluZyBjYXVzZXMgb2YKLXRoZSB1bnJlc3BvbnNpdmVuZXNzIGFuZCBwcm92aWRlIEVjbGlwc2UgZGV2ZWxvcGVycyB3aXRoIHRoZSB0b29scyB0aGV5IG5lZWQKLXRvIGZvY3VzIG9uIG1ha2luZyB0aGVpciBjb2RlIHJlc3BvbnNpdmUuICA8L3A+Ci0gCi08cD5UbyBiZWdpbiB3aXRoLCBpdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0LCByZXNwb25zaXZlbmVzcyBpcyBub3QgdGhlCi1zYW1lIGFzIHBlcmZvcm1hbmNlLCBhbmQgdG8gc29tZSBleHRlbnQgdGhleSBhcmUgY29udHJhZGljdG9yeTo8L3A+Ci0gCi08cD5UaGUgPGk+cGVyZm9ybWFuY2U8L2k+IG9mIGFuIGFwcGxpY2F0aW9uIGlzIGEgbWVhc3VyZSBvZiBob3cgbXVjaCB3b3JrCi1pdCBjYW4gZG8gaW4gYSBnaXZlbiBsZW5ndGggb2YgdGltZS4gRm9yIGV4YW1wbGUsIHRoZSBFY2xpcHNlIFBsYXRmb3JtIGNhbgotb3BlcmF0ZSBvbiB0aG91c2FuZHMgb2YgZmlsZXMgcGVyIG1pbnV0ZSBvbiBhIHR5cGljYWwgZGVza3RvcCBzeXN0ZW0uIE9uZQotd2F5IHRvIGFjaGlldmUgaGlnaCBwZXJmb3JtYW5jZSBpcyB0byBlbnN1cmUgdGhhdCBhbGwgYXZhaWxhYmxlIHJlc291cmNlcyAKLWFyZSBkZWRpY2F0ZWQgdG8gZWFjaCB0YXNrIHVudGlsIGl0IGlzIGNvbXBsZXRlLiBTaW5jZSBtb3N0IG1vZGVybiB3aW5kb3cKLXN5c3RlbXMgcmVxdWlyZSBhcHBsaWNhdGlvbnMgdG8gcmVndWxhcmx5IGNhbGwgc3lzdGVtIGNvZGUgdG8ga2VlcCB0aGVpcgotdXNlciBpbnRlcmZhY2VzIGFjdGl2ZSwgZGVkaWNhdGluZyBhbGwgcHJvY2Vzc2luZyByZXNvdXJjZXMgdG8gYSBub24tdXNlci1pbnRlcmZhY2UKLXRhc2sgd2lsbCBjYXVzZSB0aGUgdXNlciBpbnRlcmZhY2UgdG8gYmVjb21lIHVucmVzcG9uc2l2ZS48L3A+Ci0gCi08cD5UaGUgPGk+cmVzcG9uc2l2ZW5lc3M8L2k+IG9mIGFuIGFwcGxpY2F0aW9uIGlzIGEgbWVhc3VyZSBvZiBob3cgb2Z0ZW4KLWl0cyB1c2VyIGludGVyZmFjZSBpcyBpbiBhIHN0YXRlIHdoZXJlIHRoZSB1c2VyIGNhbiBpbnRlcmFjdCB3aXRoIGl0LCBob3cKLW9mdGVuIHRob3NlIGludGVyYWN0aW9ucyBjYW4gdHJpZ2dlciBuZXcgdGFza3MgYmVpbmcgaW5pdGlhdGVkLCBhbmQgaG93IG9mdGVuCi10aGUgaW5mb3JtYXRpb24gdGhlIHVzZXIgaW50ZXJmYWNlIGlzIGRpc3BsYXlpbmcgYWNjdXJhdGVseSByZWZsZWN0cyB0aGUgc3RhdGUKLW9mIHRoZSBzeXN0ZW0gaXQgaXMgbW9kZWxpbmcuIEltcGxlbWVudGluZyBhIHJlc3BvbnNpdmUgc3lzdGVtIHdpbGwgcmVxdWlyZQotdGhlIHN5c3RlbSByZXNvdXJjZXMgdG8gYmUgc3BsaXQgYWNyb3NzIG11bHRpcGxlIGNvbmN1cnJlbnQgdGFza3MsIHNvIGFsdGhvdWdoCi10aGUgdXNlciB3aWxsIHR5cGljYWxseSBiZSBtb3JlIHByb2R1Y3RpdmUsIHRoZSB0aW1lIGl0IHRha2VzIHRoZSBzeXN0ZW0KLXRvIGNvbXBsZXRlIGEgcGFydGljdWxhciB0YXNrIHdpbGwgYmUgbG9uZ2VyIChpLmUuIEl0cyBwZXJmb3JtYW5jZSBvbiA8dT50aGF0Ci10YXNrPC91PiB3aWxsIGJlIGxvd2VyKS48L3A+Ci0gCi08cD5JbiBvcmRlciB0byBpbmNyZWFzZSB0aGUgcmVzcG9uc2l2ZW5lc3Mgb2YgdGhlIEVjbGlwc2UgUGxhdGZvcm0gd2Ugd2lsbAotYmUgbG9va2luZyBhdCB0aGUgZm9sbG93aW5nIHR3byBhcmVhczo8L3A+Ci0gCi08b2w+Ci0gCTxsaT4KLSAgICA8cD5hbGwgb2YgdGhlIHVzZXIgaW50ZXJmYWNlICJmZWF0dXJlcyIgb2YgdGhlIAlFY2xpcHNlIFBsYXRmb3JtIHdpbGwKLWJlIGludmVzdGlnYXRlZCB0byByZW1vdmUgYW55IGluaGVyZW50IAlsaW1pdGF0aW9ucyB3aGljaCBwcmV2ZW50IHRoZW0gZnJvbQotYmVpbmcgdXNlZCBpbiBhIHJlc3BvbnNpdmUgCWZhc2hpb24uIFdlIGhhdmUgbm90IGJlZ3VuIHdvcmsgb24gdGhpcyBhc3BlY3QKLW9mIHRoZSBwcm9ibGVtLCBzbyBpdCAJaXMgZGlmZmljdWx0IHRvIHByb3ZpZGUgYW55IGRlZmluaXRpdmUgZXhhbXBsZXMuIEhvd2V2ZXIsCi1zb21lIAlsaWtlbHkgY2FuZGlkYXRlcyBmb3IgaW52ZXN0aWdhdGlvbiwgYXQgbGVhc3QsIHdvdWxkIGJlOjwvcD4KLSA8L2xpPgotPC9vbD4KLTx1bD4KLSAJPGxpPgotICAgIDxwPnRoZSBzdGFydHVwIHNlcXVlbmNlLCBzaW5jZSB0aGUgdGltZSBiZXR3ZWVuIHdoZW4gdGhlIHVzZXIgCXN0YXJ0cwotdGhlIGFwcGxpY2F0aW9uIGFuZCB3aGVuIHRoZXkgY2FuIHN0YXJ0IHdvcmtpbmcgaXMgdmVyeSAJaW1wb3J0YW50IHRvIHRoZWlyCi1wZXJjZXB0aW9uIG9mIGl0cyByZXNwb25zaXZlbmVzcy48L3A+Ci0gCTwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TV1Qgd2lkZ2V0cyBsaWtlIHRoZSBUYWJsZSwgVHJlZSwgYW5kIExpc3Qgd2hvc2UgQVBJIG1ha2UgaXQgCWRpZmZpY3VsdAotdG8gY29kZSBpbiBhbiAib24gZGVtYW5kIiBzdHlsZSB3aGVyZSB0aGUgCWNvbnRlbnRzIGFyZSByZXF1ZXN0ZWQgYnkgdGhlCi13aWRnZXQgd2hlbiB0aGV5IGFyZSByZXF1aXJlZCBmb3IgCWRpc3BsYXksIHJhdGhlciB0aGFuIHVwIGZyb250IGJ5IHRoZSBhcHBsaWNhdGlvbi48L3A+Ci0gCTwvbGk+Ci0gIDxsaT4KLSAgICA8cD50aGUgSmF2YSB0ZXh0IGVkaXRvciwgd2hpY2ggdGFrZXMgc2lnbmlmaWNhbnRseSBsb25nZXIgdG8gZ2V0IAl0bwotdGhlIHBvaW50IHdoZXJlIHRoZSBjb250ZW50cyBjYW4gYmUgZWRpdGVkIHRoYW4gdGhlIHNpbXBsZSB0ZXh0IAllZGl0b3IuPC9wPgotIDwvbGk+Ci08L3VsPgotIAotPG9sIHN0YXJ0PSIyIj4KLSAJPGxpPgotICAgIDxwPmNlcnRhaW4gb3BlcmF0aW9ucyBsaWtlIGJ1aWxkcyBhbmQgc2VhcmNoZXMgd2hpY2ggY3VycmVudGx5IAlydW4gc3luY2hyb25vdXNseQotYW5kIGJsb2NrIHRoZSB1c2VyIChhdCB0aGUgVUkpIGZyb20gZG9pbmcgb3RoZXIgCXdvcmsgdW50aWwgdGhleSBhcmUgY29tcGxldGVkCi13aWxsIGJlIG1vZGlmaWVkIHRvIHJ1biBhc3luY2hyb25vdXNseSAJaW4gdGhlIGJhY2tncm91bmQuIEltcGxlbWVudGluZyB0aGlzCi1yZXF1aXJlcyBhbiBpbXByb3ZlZCAJY29uY3VycmVuY3kgYXJjaGl0ZWN0dXJlLiBUaGUgcmVtYWluZGVyIG9mIHRoaXMgZG9jdW1lbnQKLWRlc2NyaWJlcyAJdGhlIHdvcmsgd2hpY2ggaGFzIGJlZW4gZG9uZSBzbyBmYXIgaW4gdGhhdCBhcmVhLjwvcD4KLSA8L2xpPgotPC9vbD4KLSAKLTxoMj5PdmVydmlldyBvZiBjdXJyZW50IHByb2JsZW1zPC9oMj4KLSAKLTx1bD4KLSA8bGk+IFVzZSBvZiBtb2RhbCBwcm9ncmVzcyBkaWFsb2dzIGlzIHBlcnZhc2l2ZSBpbiB0aGUgVUksIHByZXZlbnRpbmcgdGhlCi11c2VyIGZyb20gZG9pbmcgYW55IG90aGVyIHdvcmsgKG9yIGV2ZW4gYnJvd3NpbmcpIHdoaWxlIGxvbmcgcnVubmluZyB0YXNrcwotYXJlIHByb2Nlc3NpbmcuIDwvbGk+Ci0gPGxpPiBWZXJ5IGxvbmcgcnVubmluZyBvcGVyYXRpb25zIG9ubHkgdXBkYXRlIHRoZSBVSSBvbmNlIGF0IHRoZSB2ZXJ5IGVuZC4KLUZvciBleGFtcGxlLCB3aGVuIHNlYXJjaGluZywgbm8gc2VhcmNoIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSBmb3Igdmlld2luZwotdW50aWwgdGhlIGVudGlyZSBzZWFyY2ggaXMgY29tcGxldGUuICBXaGVuIGltcG9ydGluZyBvciBjaGVja2luZyBvdXQgbGFyZ2UKLXByb2plY3RzLCB0aGUgcHJvamVjdCBkb2Vzbid0IGFwcGVhciBpbiB0aGUgVUkgdW50aWwgZXZlcnkgZmlsZSBpbiB0aGUgcHJvamVjdAotaGFzIGJlZW4gY3JlYXRlZC4gPC9saT4KLSA8bGk+IE1hbnkgY29tcG9uZW50cyBoYXZlIHRoZWlyIG93biBtZWNoYW5pc20gZm9yIG1hbmFnaW5nIGJhY2tncm91bmQgYWN0aXZpdHkuCi0gRXhhbXBsZXMgaW5jbHVkZTogc2VhcmNoIGluZGV4aW5nLCBVSSBkZWNvcmF0aW9uLCBKYXZhIGVkaXRvciByZWNvbmNpbGluZywKLWFuZCB3b3Jrc3BhY2Ugc25hcHNob3QuIEVhY2ggY29tcG9uZW50IHNob3VsZCBub3QgaGF2ZSB0byByb2xsIHRoZWlyIG93bgotY29uY3VycmVuY3kgYXJjaGl0ZWN0dXJlIGZvciBvZmYtbG9hZGluZyB3b3JrIGludG8gYmFja2dyb3VuZCB0aHJlYWRzLiA8L2xpPgotIDxsaT5UaGUgY3VycmVudCB3b3Jrc3BhY2UgbG9jayBpcyBoZWF2eSBoYW5kZWQuICBUaGVyZSBpcyBhIHNpbmdsZSB3cml0ZQotbG9jayBmb3IgdGhlIGVudGlyZSAgd29ya3NwYWNlLCBhbmQgaXQgaXMgZ2VuZXJhbGx5IGFjcXVpcmVkIGZvciBzaWduaWZpY2FudAotcGVyaW9kcyBvZiB0aW1lLiAgVGhpcyBjYW4gYmxvY2sgb3RoZXIgcHJvY2Vzc2VzIGZvciBzZXZlcmFsIG1pbnV0ZXMuICBXaGVuCi10aGUgbG9jayBpcyBhY3F1aXJlZCwgbm8gb3RoZXIgdGhyZWFkcyBjYW4gbW9kaWZ5IHRoZSB3b3Jrc3BhY2UgaW4gYW55IHdheS4gCi0gIDwvbGk+Ci0gPGxpPiBUaGUgd29ya3NwYWNlIGxvY2tpbmcgbWVjaGFuaXNtIGlzIGN1cnJlbnRseSB0aWVkIHRvIHRoZSBtZWNoYW5pc20KLWZvciBiYXRjaGluZyB3b3Jrc3BhY2UgY2hhbmdlcy4gIFdlIHdpZGVseSBhZHZlcnRpc2UgdGhhdCBjb21wb3VuZCB3b3Jrc3BhY2UKLWNoYW5nZXMgc2hvdWxkIGJlIGRvbmUgd2l0aGluIGFuIElXb3Jrc3BhY2VSdW5uYWJsZS4gIFRoZSB3b3Jrc3BhY2UgaXMgYWx3YXlzCi1sb2NrZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgSVdvcmtzcGFjZVJ1bm5hYmxlIGV2ZW4gaWYgaXQgaXMgbm90IG1ha2luZwotY2hhbmdlcyB0byB0aGUgd29ya3NwYWNlLiA8L2xpPgotIDxsaT4gVmFyaW91cyBwbHVnaW5zIGhhdmUgdGhlaXIgb3duIGxvY2tpbmcgbWVjaGFuaXNtcy4gIFNpbmNlIHBsdWdpbnMgZG9uJ3QKLWFsd2F5cyBrbm93IGFib3V0IGVhY2ggb3RoZXIsIHRoZXNlIGxvY2tzIGNhbiBjb25mbGljdCBpbiB1bmZvcmVzZWVhYmxlIHdheXMsCi1tYWtpbmcgRWNsaXBzZSBwcm9uZSB0byBkZWFkbG9jay4gPC9saT4KLSAKLSAgPHA+IDwvcD4KLTwvdWw+Ci0gIAotPGgyPlByb3Bvc2VkIHNvbHV0aW9uczwvaDI+Ci0gCi08aDM+Sm9iIHNjaGVkdWxpbmcgbWVjaGFuaXNtPC9oMz4KLSAKLTxwPiBQbGF0Zm9ybSBjb3JlIChydW50aW1lIHBsdWdpbikgd2lsbCBpbnRyb2R1Y2UgYSBuZXcgam9iIG1hbmFnZXIgQVBJIGZvcgotYmFja2dyb3VuZCB3b3JrLiAgVGhpcyBBUEkgd2lsbCBhbGxvdyBjbGllbnRzIHRvOiA8L3A+Ci08dWw+Ci0gPGxpPiBTY2hlZHVsZSA8aT5Kb2I8L2k+IGluc3RhbmNlcywgdW5pdHMgb2YgcnVubmFibGUgYmFja2dyb3VuZCBhY3Rpdml0eS4KLUpvYnMgY2FuIGJlIHNjaGVkdWxlZCBlaXRoZXIgZm9yIGltbWVkaWF0ZSBleGVjdXRpb24sIG9yIGV4ZWN1dGlvbiBhZnRlcgotc29tZSBzcGVjaWZpZWQgZGVsYXkuICBUaGUgcGxhdGZvcm0gd2lsbCBtYWludGFpbiBhIHF1ZXVlIGZvciB3YWl0aW5nIGpvYnMsCi1hbmQgd2lsbCBtYW5hZ2UgYSBwb29sIG9mIHdvcmtlciB0aHJlYWRzIGZvciBydW5uaW5nIHRoZSBqb2JzLiA8L2xpPgotIDxsaT4gU3BlY2lmeSBqb2Igc2NoZWR1bGluZyBwcmlvcml0eSwgYXMgd2VsbCBhcyBleHBsaWNpdCBkZXBlbmRlbmNpZXMgYmV0d2Vlbgotam9icyAoSm9iIEEgbXVzdCBydW4gYWZ0ZXIgSm9iIEIgYnV0IGJlZm9yZSBKb2IgQywgZXRjKS4gPC9saT4KLSA8bGk+IFNwZWNpZnkgam9iIHNjaGVkdWxpbmcgcnVsZXMsIHdoaWNoIHdpbGwgYWxsb3cgaW1wbGljaXQgY29uc3RyYWludHMKLXRvIGJlIGNyZWF0ZWQgYmV0d2VlbiBqb2JzIHRoYXQgZG9uJ3Qga25vdyBhYm91dCBlYWNoIG90aGVyLiAgRm9yIGV4YW1wbGUsCi1hIEpvYiBjYW4gc2F5OiAiV2hpbGUgSSdtIHJ1bm5pbmcsIEkgcmVxdWlyZSBleGNsdXNpdmUgYWNjZXNzIHRvIHJlc291cmNlCi1YLiAgRG9uJ3QgcnVuIG1lIHVudGlsIGl0J3Mgc2FmZSB0byBkbyBzbywgYW5kIGRvbid0IHJ1biBhbnkgb3RoZXIgam9icyB0aGF0Ci1taWdodCBjb25mbGljdCB3aXRoIG1lIHVudGlsIEknbSBkb25lIi4gIFRoZSBjb25zdHJhaW50IHN5c3RlbSB3aWxsIGJlIGdlbmVyaWMKLWF0IHRoZSBsZXZlbCBvZiB0aGUgam9iIHNjaGVkdWxpbmcgQVBJLCBidXQgb3RoZXIgcGx1Z2lucyBjYW4gaW50cm9kdWNlIHN0YW5kYXJkCi1jb25zdHJhaW50cyB0aGF0IGFwcGx5IHRvIHRoZWlyIGNvbXBvbmVudHMuIDwvbGk+Ci0gPGxpPiBRdWVyeSwgY2FuY2VsIGFuZCBjaGFuZ2UgcHJpb3JpdHkgb2Ygam9icyB0aGF0IGFyZSB3YWl0aW5nIHRvIHJ1bi4gIFRoaXMKLWFsbG93cyBjbGllbnRzIHRvIGNhbmNlbCBqb2JzIHRoYXQgaGF2ZSBiZWNvbWUgaXJyZWxldmFudCBiZWZvcmUgdGhleSBoYWQKLWEgY2hhbmNlIHRvIHJ1bi4gKEV4YW1wbGU6IGNhbmNlbCBwZW5kaW5nIGluZGV4aW5nIG9yIGRlY29yYXRpb24gam9icyBvbgotYSBwcm9qZWN0IHdoZW4gdGhlIHByb2plY3QgaXMgZGVsZXRlZCkuIDwvbGk+Ci0gPGxpPiBHcm91cCBqb2JzIGludG8gZmFtaWxpZXMsIGFuZCBxdWVyeSwgY2FuY2VsLCBhbmQgbWFuYWdlIGVudGlyZSBqb2IKLWZhbWlsaWVzIGFzIGEgdW5pdC4gPC9saT4KLSA8bGk+IFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gd2hlbiBqb2JzIGFyZSBzY2hlZHVsZWQsIHN0YXJ0ZWQsIGZpbmlzaGVkLAotY2FuY2VsZWQsIGV0Yy4gIENsaWVudHMgY2FuIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gb24gYSBzaW5nbGUgam9iLCBvcgotb24gYWxsIGpvYnMuIDwvbGk+Ci0gPGxpPiBQcm92aWRlIGEgbWVjaGFuaXNtIHRvIGFsbG93IGpvYnMgdG8gY2FycnkgdGhlaXIgd29yayBvdmVyIHRvIGFub3RoZXIKLSB0aHJlYWQgYW5kIGZpbmlzaCBhc3luY2hyb25vdXNseS4gIFRoaXMgaXMgbmVlZGVkIHRvIGFsbG93IGpvYnMgdG8gYXN5bmNFeGVjCi0gaW50byB0aGUgVUksIGJ1dCBtYWludGFpbiBzY2hlZHVsaW5nIHJ1bGVzIGFuZCBhdm9pZCBub3RpZml5aW5nIGxpc3RlbmVycyB1bnRpbAotIHRoZSBhc3luYyBibG9jayBoYXMgcmV0dXJuZWQuCi0gPC9saT4KLSA8bGk+IEFkZCBsaXN0ZW5lcnMgdG8gYmUgaG9va2VkIHRvIHRoZSBwcm9ncmVzcyBtb25pdG9yIGNhbGxiYWNrcyBvZiB0aGUKLXJ1bm5pbmcgam9icy4gIFRoaXMgYWxsb3dzIHRoZSBVSSB0byByZXBvcnQgcHJvZ3Jlc3Mgb24gam9icyB0aGF0IHdvdWxkIG90aGVyd2lzZQotaGF2ZSBubyB3YXkgb2YgY29ubmVjdGluZyB3aXRoIHRoZSBVSSAoc3VjaCBhcyBpbmRleGluZyBvciBzbmFwc2hvdCBqb2JzKS4gCi0gIDwvbGk+Ci0gCi08L3VsPgotIAotPHA+IFRoaXMgc2NoZWR1bGluZyBtZWNoYW5pc20gd2lsbCByZXBsYWNlIG1vc3QgKGlmIG5vdCBhbGwpIGV4aXN0aW5nIGJhY2tncm91bmQKLXRocmVhZCBtZWNoYW5pc21zIGluIHRoZSBTREsuICBUaGlzIGluY2x1ZGVzOiBlZGl0b3IgcmVjb25jaWxlcnMsIFVJIGRlY29yYXRpb24sIAotc2VhcmNoIGFuZCBKYXZhIGluZGV4aW5nLCB3b3Jrc3BhY2Ugc25hcHNob3QsIGFuZCB2YXJpb3VzIHRocmVhZHMgdXNlZCBpbiB0aGUgbGF1bmNoL2RlYnVnCi1mcmFtZXdvcms6IEpESSB0aHJlYWQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVk0sIHRocmVhZHMgZm9yIG1vbml0b3JpbmcKLWlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcywgZGVidWcgdmlldyB1cGRhdGUgdGhyZWFkLCBhbmQgdGhlIHRocmVhZCB3YWl0aW5nCi0gZm9yIFZNIHRlcm1pbmF0aW9uLiA8L3A+Ci0gCi08cD4gQWxzbywgdGhlIHNjaGVkdWxpbmcgZmFjaWxpdHkgd2lsbCBtYWtlIGl0IGVhc2llciBmb3IgbW9yZSBjb21wb25lbnRzCi10byBvZmYtbG9hZCB3b3JrIGludG8gYmFja2dyb3VuZCB0aHJlYWRzLCBpbiBvcmRlciB0byBmcmVlIHVwIHRoZSBVSSB0aHJlYWQKLWZvciByZXNwb25kaW5nIHRvIHRoZSB1c2VyLiAgVGhpcyBpbmNsdWRlcyBhbGwgam9icyB0aGF0IGN1cnJlbnRseSBydW4gaW4KLXRoZSBjb250ZXh0IG9mIGEgbW9kYWwgcHJvZ3Jlc3MgaW5kaWNhdG9yLCBidXQgYWxzbyBvdGhlciBwcm9jZXNzaW5nIHdvcmsKLXRoYXQgY3VycmVudGx5IGV4ZWN1dGVzIGluIHRoZSBVSS4gIEV4YW1wbGVzIG9mIGFjdGl2aXR5IHRoYXQgY2FuIGJlIG9mZmxvYWRlZAotaW50byBqb2JzOiBkZWNvcmF0aW5nIGVkaXRvcnMgKG1hcmtlciBydWxlciwgb3ZlcnZpZXcgcnVsZXIpLCB0eXBlIGhpZXJhcmNoeQotY29tcHV0YXRpb24sIHN0cnVjdHVyZSBjb21wYXJlIGluIGNvbXBhcmUgZWRpdG9ycywgYXV0by1yZWZyZXNoIHdpdGggZmlsZQotc3lzdGVtLCBldGMuICA8L3A+Ci0gICAKLTxoMz5OZXcgVUkgbG9vayBhbmQgZmVlbCBmb3IgbG9uZyBydW5uaW5nIGFjdGl2aXR5PC9oMz4KLSAKLTxwPiBMb25nIHJ1bm5pbmcgb3BlcmF0aW9ucyB3aWxsIGdlbmVyYWxseSBiZSBydW4gd2l0aG91dCBhIG1vZGFsIHByb2dyZXNzIGluZGljYXRvciAKLSAgYnkgc2NoZWR1bGluZyB0aGVtIHdpdGggdGhlIGNvcmUgam9iIG1hbmFnZXIgQVBJLiAgIE1vc3Qgam9icyBjdXJyZW50bHkgdXNpbmcgYQotICBtb2RhbCBwcm9ncmVzcyBkaWFsb2cgd2lsbCBzd2l0Y2ggdG8gdGhpcyBuZXcgbm9uLW1vZGFsIHdheSBvZiBydW5uaW5nLgotICBUaGUgcGxhdGZvcm0gVUkgd2lsbCBwcm92aWRlIGEgdmlldyBmcm9tIHdoaWNoIHVzZXJzIGNhbiBzZWUgdGhlIGxpc3Qgb2Ygd2FpdGluZyBhbmQgCi0gIHJ1bm5pbmcgYmFja2dyb3VuZCBqb2JzLCBhbG9uZyB3aXRoIHRoZWlyIGN1cnJlbnQgcHJvZ3Jlc3MuIFRoaXMgaXMgYSB2aWV3IHJhdGhlciB0aGFuIAotICBhIGRpYWxvZyBzbyB0aGUgdXNlciBjYW4gY29udGludWUgdG8gbWFuaXB1bGF0ZSB0aGUgVUkgd2hpbGUgYmFja2dyb3VuZCBqb2JzIGFyZSAKLSAgcnVubmluZy4gVGhpcyB2aWV3IHdpbGwgbGlrZWx5IHRha2UgdGhlIGZvcm0gb2YgYSB0cmVlIHNvIHRoYXQgZXhwYW5kaW5nIGEgam9iIHdpbGwKLSAgZ2l2ZSBtb3JlIGRldGFpbGVkIHByb2dyZXNzIGluZm9ybWF0aW9uLiAgVGhlIFVJIHdpbGwgYWxzbyBwcm92aWRlIHNvbWUgdWJpcXVpdG91cyAKLSAgZmVlZGJhY2sgZGV2aWNlIChtdWNoIGxpa2UgdGhlIHBhZ2UgbG9hZGluZyBpbmRpY2F0b3IgaW4gcG9wdWxhciB3ZWIgYnJvd3NlcnMgb3IgdGhlIAotICBNYWNpbnRvc2ggdXNlciBpbnRlcmZhY2UpLCB0aGF0IHdpbGwgaW5kaWNhdGUgd2hlbiBiYWNrZ3JvdW5kIGFjdGl2aXR5IGlzIGhhcHBlbmluZy4gCi0gPC9wPgotPHA+VXNlcnMgd2lsbCBiZSBhYmxlIHRvIGNhbmNlbCBhbnkgYmFja2dyb3VuZCBhY3Rpdml0eSBmcm9tIHRoZSBwcm9ncmVzcyB2aWV3LiAKLSAgVXNlcnMgd2lsbCBhbHNvIGJlIGFibGUgdG8gcGF1c2UsIHJlc3VtZSwgb3IgZmFzdCBmb3J3YXJkIChpbmNyZWFzZSBwcmlvcml0eSAKLSAgb2YpIGFueSB3YWl0aW5nIGpvYi4gU2luY2Ugd2UgY2FuIG5ldmVyIGtub3cgd2hpY2ggb2Ygc2V2ZXJhbCBiYWNrZ3JvdW5kIGpvYnMgCi0gIHRoZSB1c2VyIGlzIG1vc3QgYW54aW91cyB0byBjb21wbGV0ZSwgdGhpcyBwdXRzIHNvbWUgcG93ZXIgaW4gdGhlIHVzZXIncyBoYW5kcyAKLSAgdG8gaW5mbHVlbmNlIHRoZSBvcmRlciBvZiBleGVjdXRpb24gb2Ygd2FpdGluZyBiYWNrZ3JvdW5kIGpvYnMuPC9wPgotCi08cD4KLSAgVGhlIHBsYXRmb3JtIFVJIHdpbGwgaW50cm9kdWNlIGEgc3BlY2lhbCBqb2IgY2FsbGVkIGEgVUkgam9iLCB3aGljaCBpcyBzaW1wbHkgYSBqb2IgdGhhdCAKLSAgbmVlZHMgdG8gYmUgcnVuIGluIHRoZSBVSSBUaHJlYWQuIFdlIGRlZmluZSB0aGlzIHR5cGUgb2Ygam9iIGFzIGEgY29udmVuaWVuY2UgZm9yIHRob3NlIAotICB3aG8gZG8gbm90IHdhbnQgdG8ga2VlcCBsb29raW5nIGZvciBhIERpc3BsYXkgdG8gYXN5bmNFeGVjIGluLiAgQ2FzdGluZyBVSSB3b3JrCi0gIGFzIGpvYnMgd2lsbCBhbGxvdyB0aGUgZnJhbWV3b3JrIHRvIGNvbnRyb2wgc2NoZWR1bGluZyBiYXNlZCBvbiBwcmlvcml0eSBhbmQgdXNlciAKLSAgZGVmaW5lZCBzY2hlZHVsaW5nIHJ1bGVzLiAgTm90ZSB0aGF0IGFsdGhvdWdoIFVJIGpvYnMgc2hvdWxkIGdlbmVyYWxseSBiZSBicmllZgotICBpbiBkdXJhdGlvbiwgdGhleSBtYXkgcmVxdWlyZSBsb2NrcyBhbmQgdGh1cyB0aGUgZnJhbWV3b3JrIG11c3QgaGF2ZSBhIHN0cmF0ZWd5Ci0gIGZvciBhdm9pZGluZyBkZWFkbG9jayB3aGVuIHRoZSBVSSB0aHJlYWQgaXMgd2FpdGluZyBmb3IgYSBsb2NrLgotIAotPGgzPk1pbmltaXplIHVzZSBvZiBsb25nIHRlcm0gd29ya3NwYWNlIGxvY2tzPC9oMz4KLSAKLTxwPiBXZSB3aWxsIGFjdGl2ZWx5IGRpc2NvdXJhZ2UgY2xpZW50cyBmcm9tIGFjcXVpcmluZyB0aGUgd29ya3NwYWNlIGxvY2sKLWZvciBpbmRlZmluaXRlIHBlcmlvZHMgb2YgdGltZS4gIDxjb2RlPklXb3Jrc3BhY2VSdW5uYWJsZTwvY29kZT4gaXMgdGhlIGN1cnJlbnQKLW1lY2hhbmlzbSB0aGF0IGFsbG93cyBjbGllbnRzIHRvIGxvY2sgdGhlIHdvcmtzcGFjZSBmb3IgdGhlIGR1cmF0aW9uIG9mIGEKLXJ1bm5hYmxlLiAgVGhpcyBBUEkgd2lsbCBiZSBkZXByZWNhdGVkLiAgIENsaWVudHMgdGhhdCByZXF1aXJlIGV4Y2x1c2l2ZQotYWNjZXNzIHRvIHBvcnRpb25zIG9mIHRoZSB3b3Jrc3BhY2Ugc2hvdWxkICBzY2hlZHVsZSBiYWNrZ3JvdW5kIGpvYnMgd2l0aAotYXBwcm9wcmlhdGUgc2NoZWR1bGluZyBydWxlcy4gIFNjaGVkdWxpbmcgcnVsZXMgY2FuICBzcGVjaWZ5IHNtYWxsZXIgcG9ydGlvbnMKLW9mIHRoZSB3b3Jrc3BhY2UsIGFsbG93aW5nIGNsaWVudHMgdG8gImxvY2siIG9ubHkgdGhlIHJlc291cmNlcyAgdGhleSBuZWVkLgotTG9uZ2VyIHJ1bm5pbmcgd29ya3NwYWNlIEFQSSBtZXRob2RzIHdpbGwgYmUgYnJva2VuIHVwIGFzIG11Y2ggYXMgIHBvc3NpYmxlCi10byBhdm9pZCBsb2NraW5nIHRoZSB3b3Jrc3BhY2UgZm9yIGV4dGVuZGVkIHBlcmlvZHMuICBDbGllbnRzIHRoYXQgZG8gbm90IAotcnVuIGFzIGpvYnMsIG9yIHRoYXQgcnVuIGFzIGpvYnMgd2l0aG91dCB0aGUgYXBwcm9wcmlhdGUgc2NoZWR1bGluZyBydWxlcywKLXdpbGwgaGF2ZSB0byBiZSB0b2xlcmFudCBvZiBjb25jdXJyZW50IG1vZGlmaWNhdGlvbnMgdG8gdGhlIHdvcmtzcGFjZS4gPC9wPgotICAKLTxoMz5OZXcgcmVzb3VyY2UgY2hhbmdlIG5vdGlmaWNhdGlvbiBhbmQgYXV0b2J1aWxkIHN0cmF0ZWd5PC9oMz4KLSAKLTxwPiBUaGUgY3VycmVudCBtZWNoYW5pc20gZm9yIGJhdGNoaW5nIHJlc291cmNlIGNoYW5nZXMgYW5kIGF1dG8tYnVpbGRpbmcKLWlzIGJhc2VkIG9uIHRoZSA8Y29kZT5JV29ya3NwYWNlUnVubmFibGU8L2NvZGU+IEFQSS4gIFRoaXMgYXBwcm9hY2ggaGFzIHR3bwotcHJvYmxlbXM6IDwvcD4KLTxvbD4KLSA8bGk+IENsaWVudHMgc29tZXRpbWVzIGZvcmdldCB0byB1c2UgaXQsIHdoaWNoIHJlc3VsdHMgaW4gc2V2ZXJlIHBlcmZvcm1hbmNlCi1wcm9ibGVtcyBiZWNhdXNlIG5vdGlmaWNhdGlvbnMgYW5kIGF1dG8tYnVpbGRzIGhhcHBlbiBtb3JlIG9mdGVuIHRoYW4gbmVjZXNzYXJ5LiAKLSAgPC9saT4KLSA8bGk+IFRoaXMgY2FuIGJlY29tZSB0b28gY29hcnNlLWdyYWluZWQgZm9yIGxvbmcgcnVubmluZyBvcGVyYXRpb25zLiAgSWYKLXRoZSB1c2VyIGJlZ2lucyBhbiBvcGVyYXRpb24gdGhhdCB3aWxsIHRha2Ugc2V2ZXJhbCBtaW51dGVzLCBpdCB3b3VsZCBiZQotbmljZSB0byBwZXJmb3JtIHNvbWUgaW5jcmVtZW50YWwgdXBkYXRlcyAobm90aWZpY2F0aW9ucykgd2hpbGUgdGhlIG9wZXJhdGlvbgotaXMgc3RpbGwgcnVubmluZy4gPC9saT4KLSAKLTwvb2w+Ci0gCi08cD48L3A+Ci0gCi08cD4gVGhlIHJlc291cmNlcyBwbHVnaW4gd2lsbCBhZG9wdCBuZXcgaGV1cmlzdGljcyBmb3Igd2hlbiBidWlsZHMgYW5kIG5vdGlmaWNhdGlvbnMgCi1zaG91bGQgaGFwcGVuLiAgVGhlc2UgaGV1cmlzdGljcyB3aWxsIGxpa2VseSByZXF1aXJlIHNvbWUgZmluZS10dW5pbmcgYW5kCi1tYXkgbmVlZCB0byBiZSBjdXN0b21pemFibGUsIGJ1dCBnZW5lcmFsbHk6IDwvcD4KLTx1bD4KLSA8bGk+UmVzb3VyY2UgY2hhbmdlIG5vdGlmaWNhdGlvbnMgd2lsbCBhbHdheXMgc3RhcnQgd2l0aGluIGEgYm91bmRlZCAgcGVyaW9kCi1hZnRlciB0aGUgd29ya3NwYWNlIGhhcyBjaGFuZ2VkIChzdWNoIGFzIGZpdmUgc2Vjb25kcykuIFRoaXMgd2lsbCBlbnN1cmUgbm90aWZpY2F0aW9ucwotb2NjdXIgcGVyaW9kaWNhbGx5IGR1cmluZyBsb25nIG9wZXJhdGlvbnMuIDwvbGk+Ci0gPGxpPiBOb3RpZmljYXRpb24gd2lsbCBiZWdpbiBpbW1lZGlhdGVseSBpZiB0aGVyZSBoYXZlIGJlZW4gbm8gd29ya3NwYWNlCi1jaGFuZ2luZyBqb2JzIGluIHRoZSBqb2IgcXVldWUgZm9yIGEgc2hvcnQgcGVyaW9kIChzdWNoIGFzIDUwMCBtaWxsaXNlY29uZHMpLgotIFRoaXMgZW5zdXJlcyB0aW1lbHkgIHVzZXIgZmVlZGJhY2sgd2hlbiBiYWNrZ3JvdW5kIGFjdGl2aXR5IGhhcyBzdG9wcGVkLgotIFRoZXJlIHdpbGwgYmUgYSBsb3dlciBib3VuZCBvbiB0aGUgZnJlcXVlbmN5IG9mIG5vdGlmaWNhdGlvbnMgdG8gcHJldmVudAotbGlzdGVuZXJzIGZyb20gaG9nZ2luZyB0aGUgQ1BVLiA8L2xpPgotIDxsaT5UaGVyZSB3aWxsIGJlIEFQSSBmb3IgZm9yY2luZyBhbiBpbW1lZGlhdGUgbm90aWZpY2F0aW9uIGlmIGNsaWVudHMga25vdwotaXQgaXMgZWl0aGVyIG5lY2Vzc2FyeSBvciBkZXNpcmFibGUgZm9yIGEgbm90aWZpY2F0aW9uIHRvIG9jY3VyLiAgKGFjdHVhbGx5LAotdGhpcyBtZWNoYW5pc20gIGhhcyBleGlzdGVkIHNpbmNlIEVjbGlwc2UgMS4wIGluIHRoZSBtZXRob2QgPGNvZGU+SVdvcmtzcGFjZS5jaGVja3BvaW50PC9jb2RlPikuIAotVUkgYWN0aW9ucyB3aWxsIHVzZSB0aGlzIGZvciBpbmRpY2F0aW5nIHdoZW4gYSB1c2VyIGFjdGlvbiBoYXMgY29tcGxldGVkLgotIE90aGVyIGNsaWVudHMgdGhhdCBhYnNvbHV0ZWx5IGRlcGVuZCBvbiB0aGUgcmVzdWx0cyBvZiBub3RpZmljYXRpb25zIGNhbgotYWxzbyB1c2UgdGhpcyBtZWNoYW5pc20gIChmb3IgZXhhbXBsZSBjbGllbnRzIHRoYXQgZGVwZW5kIG9uIHRoZSBqYXZhIG1vZGVsCi1iZWluZyB1cCB0byBkYXRlKS4gPC9saT4KLSA8bGk+IEF1dG9idWlsZHMgd2lsbCBiZWdpbiAoaWYgbmVlZGVkKSB3aGVuIHRoZSB3b3JrIHF1ZXVlIGhhcyBiZWVuIGlkbGUKLWZvciBhIHN1ZmZpY2llbnQgcGVyaW9kIG9mIHRpbWUgKHN1Y2ggYXMgMSBzZWNvbmQpLiAgSWYgYSBiYWNrZ3JvdW5kIGpvYgotdGhhdCByZXF1aXJlcyB3cml0ZSBhY2Nlc3MgdG8gdGhlIHdvcmtzcGFjZSBpcyBzY2hlZHVsZWQgYmVmb3JlIGF1dG9idWlsZAotY29tcGxldGVzLCB0aGVuIGF1dG8tYnVpbGQgd2lsbCBiZSBjYW5jZWxlZCBhdXRvbWF0aWNhbGx5LiAgRXhpc3RpbmcgYnVpbGRlcnMKLXdpbGwgbmVlZCB0byBpbXByb3ZlIHRoZWlyIGNhbmNlbGF0aW9uIGJlaGF2aW91ciBzbyB0aGF0IGEgbWluaW1hbCBhbW91bnQKLW9mIHdvcmsgaXMgbG9zdC4gPC9saT4KLSA8bGk+IFRoZXJlIHdpbGwgc3RpbGwgYmUgYSBtZWNoYW5pc20gdG8gYWxsb3cgdXNlcnMgb3IgQVBJIGNsaWVudHMgdG8gZm9yY2UKLWEgYnVpbGQgdG8gb2NjdXIsIGFuZCB0aGVzZSBleHBsaWNpdCBidWlsZHMgd2lsbCBub3QgYmUgY2FuY2VsZWQgYXV0b21hdGljYWxseQotYnkgY29uZmxpY3RpbmcgYmFja2dyb3VuZCBhY3Rpdml0eS4gPC9saT4KLSA8bGk+IEJvdGggYnVpbGRlcnMgYW5kIGxpc3RlbmVycyBjb3VsZCBhZGFwdCBhdXRvbWF0aWNhbGx5IGlmIHRoZXkgc3RhcnQKLWludGVyZmVyaW5nIHdpdGggb25nb2luZyB3b3JrIGJ5IGluY3JlYXNpbmcgdGhlaXIgd2FpdCBwZXJpb2QuIFRoaXMgd291bGQKLWFsbG93IGJ1aWxkZXJzIGFuZCBsaXN0ZW5lcnMgdG8gYWRhcHQgdG8gY2hhbmdlcyBpbiBhY3Rpdml0eSBsZXZlbHMuIDwvbGk+Ci0gCi08L3VsPgotIAotPHA+PC9wPgotIAotPHA+IFVubGVzcyBleHBsaWNpdGx5IHJlcXVlc3RlZCwgYnVpbGRzIGFuZCByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXJzIHdpbGwKLWFsd2F5cyBiZSBydW4gIGFzeW5jaHJvbm91c2x5IGluIGEgZGlmZmVyZW50IHRocmVhZCBmcm9tIHRoZSBvbmUgdGhhdCBpbml0aWF0ZWQKLXRoZSBjaGFuZ2UuICBUaGlzIHdpbGwgaW1wcm92ZSB0aGUgcmVzcG9uc2l2ZW5lc3Mgb2Ygd29ya3NwYWNlIGNoYW5naW5nIG9wZXJhdGlvbnMKLXRoYXQgYXJlIGluaXRpYXRlZCBmcm9tIHRoZSBVSSB0aHJlYWQuIDwvcD4KLSAKLTxoMz5DZW50cmFsaXplZCBsb2NraW5nIG1lY2hhbmlzbTwvaDM+Ci0gCi08cD4gUGxhdGZvcm0gY29yZSAocnVudGltZSBwbHVnaW4pIHdpbGwgaW50cm9kdWNlIGEgc21hcnQgbG9ja2luZyBmYWNpbGl0eS4KLSBDbGllbnRzIHRoYXQgIHJlcXVpcmUgZXhjbHVzaXZlIGFjY2VzcyB0byBhIGNvZGUgcmVnaW9uIHNob3VsZCB1c2UgdGhlc2UKLWxvY2tzIGFzIGEgcmVwbGFjZW1lbnQgZm9yICBKYXZhIG9iamVjdCBtb25pdG9ycyBpbiBjb2RlIHRoYXQgbWF5IGludGVyYWN0Ci13aXRoIG90aGVyIGxvY2tzLiAgVGhpcyB3aWxsIGFsbG93IHRoZSBwbGF0Zm9ybSB0byBkZXRlY3QgYW5kIGJyZWFrIHBvdGVudGlhbAotZGVhZGxvY2tzLiAgTm90ZSB0aGF0IHRoZXNlIGxvY2tzIGFyZSBvcnRob2dvbmFsIHRvIHRoZSBqb2Igc2NoZWR1bGluZyBydWxlcwotZGVzY3JpYmVkIGVhcmxpZXIuICBKb2Igc2NoZWR1bGluZyBydWxlcyB0eXBpY2FsbHkgZW5zdXJlIHRoYXQgb25seSBub24gY29uZmxpY3RpbmcKLWpvYnMgYXJlIHJ1bm5pbmcsIGJ1dCBjYW5ub3QgZ3VhcmFudGVlIHByb3RlY3Rpb24gZnJvbSBtYWxpY2lvdXMgb3IgaW5jb3JyZWN0Ci1jb2RlLiA8L3A+Ci0gIFRoZXNlIGxvY2tzIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiAKLTx1bD4KLSA8bGk+VGhleSB3aWxsIGJlIHJlZW50cmFudC4gIEEgc2luZ2xlIHRocmVhZCBjYW4gYWNxdWlyZSBhIGdpdmVuIGxvY2sgbW9yZQotdGhhbiBvbmNlLCBhbmQgaXQgd2lsbCBvbmx5IGJlIHJlbGVhc2VkIHdoZW4gdGhlIG51bWJlciBvZiBhY3F1aXJlcyBlcXVhbHMKLXRoZSBudW1iZXIgb2YgcmVsZWFzZXMuIDwvbGk+Ci0gPGxpPlRoZXkgd2lsbCBhdXRvbWF0aWNhbGx5IG1hbmFnZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBTV1Qgc3luY2hyb25pemVyCi10byBhdm9pZCAgZGVhZGxvY2tpbmcgaW4gdGhlIGZhY2Ugb2YgYSBzeW5jRXhlYy4gIEkuZS4sIGlmIHRoZSBVSSB0aHJlYWQKLXRyaWVzIHRvIGFjcXVpcmUgYSBsb2NrLCBhbmQgYW5vdGhlciB0aHJlYWQgaG9sZGluZyB0aGF0IGxvY2sgdHJpZXMgdG8gcGVyZm9ybQotYSBzeW5jRXhlYywgdGhlIFVJIHRocmVhZCB3aWxsIHNlcnZpY2UgdGhlIHN5bmNFeGVjIHdvcmsgYW5kIHRoZW4gY29udGludWUKLXRvIHdhaXQgZm9yIHRoZSBsb2NrLiA8L2xpPgotIDxsaT5UaGV5IHdpbGwgYXZvaWQgZGVhZGxvY2tpbmcgd2l0aCBlYWNoIG90aGVyLiAgSS5lLiwgaWYgdGhyZWFkIEEgYWNxdWlyZXMKLWxvY2sgMSwgdGhlbiB3YWl0cyBvbiBsb2NrIDIsIHdoaWxlIHRocmVhZCBCIGFjcXVpcmVzIGxvY2sgMiBhbmQgd2FpdHMgb24KLWxvY2sgMSwgZGVhZGxvY2sgd291bGQgbm9ybWFsbHkgZW5zdWUuICBUaGUgcGxhdGZvcm0gbG9ja2luZyBmYWNpbGl0eSB3aWxsCi1lbXBsb3kgYSByZWxlYXNlIGFuZCB3YWl0IHByb3RvY29sIHRvIGVuc3VyZSB0aGF0IHRocmVhZHMgd2FpdGluZyBmb3IgbG9ja3MKLWRvIG5vdCBibG9jayBvdGhlciB0aHJlYWRzLiA8L2xpPgotIAotPC91bD4KLSAgIAotPGgyPk1pbGVzdG9uZSB0YXJnZXRzPC9oMj4KLSAKLTx1bD4KLSA8bGk+IE0xOiBDb3JlIHJ1bnRpbWUgam9iIG1hbmFnZXIgQVBJIGRlZmluZWQgYW5kIGltcGxlbWVudGVkLiAgVUkgQVBJIGRlZmluZWQKLXdpdGggcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLiAgUHJvdG90eXBlIFVJIGltcGxlbWVudGF0aW9uIG9mIHByb2dyZXNzIHZpZXcKLWFuZCBwcm9ncmVzcyBhbmltYXRpb24uIEFsbCBjb21wb25lbnRzIHNob3VsZCBiZWdpbiBsb29raW5nIGludG8gdGhyZWFkIHNhZmV0eQotaXNzdWVzIHdpdGggdGhlaXIgQVBJLiA8L2xpPgotIDxsaT5NMjogSW4gYSBicmFuY2gsIGEgc2lnbmlmaWNhbnQgc3Vic2V0IG9mIHRoZSBFY2xpcHNlIHBsYXRmb3JtIGNvbnZlcnRlZAotdG8gdXNlIHRoZSBuZXcgbWVjaGFuaXNtcy4gT25nb2luZyB3b3JrIGluIGFsbCBjb21wb25lbnRzIHRvIGJlY29tZSB0aHJlYWQgCi1zYWZlIGFuZCB0byBwb3J0IGV4aXN0aW5nIGNvbXBvbmVudHMgdG8gam9iIG1hbmFnZXIgQVBJIChyZWNvbmNpbGVyLCBpbmRleGVyLAotZGVjb3JhdG9yLCBkZWJ1ZyBldmVudHMpLiA8L2xpPgotIDxsaT4gTTM6IGFsbCBwbGF0Zm9ybSB3b3JrIG1vdmVkIGZyb20gYnJhbmNoIHRvIEhFQUQgYXQgYmVnaW5uaW5nIG9mIE0zCi1jeWNsZS4gIEdvYWwgZm9yIGVuZCBvZiBNMyBpcyBzb21lIGxldmVsIG9mIHN0YWJpbGl0eSBhY3Jvc3MgZW50aXJlIFNESwotaW4gbmV3IGNvbmN1cnJlbnQgd29ybGQuICBBbGwgIGNvbXBvbmVudCBBUEkgbXVzdCBiZSB0aHJlYWQgc2FmZS4gPC9saT4KLSAKLTwvdWw+Ci08cD4KLSBUaGlzIHNjaGVkdWxlIGlzIGFnZ3Jlc3NpdmUgYnV0IHRoZSBpbnRlbnQgaXMgdG8gd3JhcCB1cCBwbGF0Zm9ybSB3b3JrIGJ5Ci1lbmQgb2YgTTMuICBUaGlzIGFsbG93cyBwbGVudHkgb2YgdGltZSB0byBzaGFrZSBvdXQgdGhyZWFkaW5nIGJ1Z3MgYW5kIGFsbG93Ci1vdGhlciBjb21wb25lbnRzIHRvIHN0YWJpbGl6ZSBieSBNNC4gCi08L3A+Ci0KLShQbGFuIGl0ZW0gYnVnIHJlZmVyZW5jZTogPGEKLSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzY5NTciPjM2OTU3PC9hPik8YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL2RvYy91c2VjYXNlcy50eHQgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvZG9jL3VzZWNhc2VzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkwYzNlZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvZG9jL3VzZWNhc2VzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLQotCi1CYXNpYyBjb25jdXJyZW5jeSB1c2UgY2FzZXMuICBTb21lIGFyZSBvdmVybGFwcGluZywgYnV0IGVhY2ggcmVxdWlyZXMKLWEgZGlmZmVyZW50IGxldmVsIG9mIGNvbmN1cnJlbmN5IHN1cHBvcnQuICBSb3VnaGx5IG9yZGVyZWQgYnkgcGVyY2VpdmVkCi1pbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHR5LiAgMS4gYW5kIDIuIGFyZSBjdXJyZW50bHkgc3VwcG9ydCBpbiBFY2xpcHNlIDIuMSwKLWJ1dCB3ZSBuZWVkIHRvIGtlZXAgdGhlbSBpbiBtaW5kIHdpdGggYW55IG5ldyBzdG9yeS4KLQotMS4gQWxsb3cgZGVjb3JhdGlvbiB0YXNrcyB0byBjb250aW51ZSBpbiBiYWNrZ3JvdW5kIHdpdGhvdXQgYWZmZWN0aW5nCi0gICBVSSByZXNwb25zaXZlbmVzcyBvciBhYmlsaXR5IHRvIG1vZGlmeSByZXNvdXJjZXMuCi0gICAKLSAgIEV4YW1wbGVzOgotICAgICBhKSBVc2VyIHBlcmZvcm1zIGEgQ1ZTIHVwZGF0ZS4gIFdoaWxlIENWUyBpcyBjb21wdXRpbmcgYW5kIHVwZGF0aW5nIAotICAgICAgICBuZXcgZGVjb3JhdGlvbnMgaW4gdmFyaW91cyB2aWV3cywgdGhlIHVzZXIgd2FudHMgdG8gY29udGludWUgdmlld2luZwotICAgICAgICBhbmQgbW9kaWZ5aW5nIHJlc291cmNlcy4gIER1cGxpY2F0ZSBkZWNvcmF0aW9uIHdvcmsgc2hvdWxkIGJlIGRldGVjdGVkCi0gICAgICAgIGFuZCBhdm9pZGVkIChkb24ndCBkZWNvcmF0ZSB0aGUgc2FtZSByZXNvdXJjZSB0d2ljZSBpZiBwb3NzaWJsZSkuCi0gICAgIGIpIFVzZXIgaXMgdHlwaW5nIGluIGFuIGVkaXRvci4gIENvbXB1dGF0aW9uIG9mIGVmZmVjdHMgc3VjaCBhcwotICAgICAgICAicmVkIHNlYSIsIGFuZCBicmFja2V0IG1hdGNoaW5nIHNob3VsZCBoYXBwZW4gaW4gdGhlIGJhY2tncm91bmQKLSAgICAgICAgd2l0aG91dCBhZmZlY3RpbmcgcmVzcG9uc2l2ZW5lc3MuCi0KLTIuIFZlcnkgbG9uZyBydW5uaW5nIG9wZXJhdGlvbnMgdGhhdCBkbyBub3QgbW9kaWZ5IHJlc291cmNlcywgYnV0IG11c3QKLSAgIGJlIHN0b3BwYWJsZSwgYW5kIGpvaW5hYmxlLgotICAgCi0gICBFeGFtcGxlczoKLSAgICAgYSkgVXNlciBpbXBvcnRzIGEgSkFSIGZpbGUuICBUaGlzIHRyaWdnZXJzIGFuIGluZGV4aW5nIGpvYiBpbiB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgVXNlciBjYW4gY29udGludWUgdG8gdmlldyBhbmQgbW9kaWZ5IHJlc291cmNlcyB3aGlsZSBpbmRleGluZyBoYXBwZW5zLgotICAgICAgICBJZiB0aGUgdXNlciBkZWxldGVzIHRoZSBKQVIsIG9yIG1vZGlmaWVzIGl0LCBkdXBsaWNhdGUgb3Igc3VwZXJmbHVvdXMKLSAgICAgICAgYmFja2dyb3VuZCBqb2JzIHNob3VsZCBiZSBjYW5jZWxlZCBhdXRvbWF0aWNhbGx5LgotICAgICBiKSBVc2VyIGltcG9ydHMgYSBKQVIgZmlsZS4gIFRoaXMgdHJpZ2dlcnMgYW4gaW5kZXhpbmcgam9iIGluIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICBVc2VyIHRoZW4gcmVxdWVzdHMgYSB0eXBlIGhpZXJhcmNoeS4gIFByaW9yaXR5IG9mIGFueSBpbmRleCBqb2JzCi0gICAgICAgIHJlcXVpcmVkIGJ5IHRoZSB0eXBlIGhpZXJhcmNoeSBzaG91bGQgYmUgYnVtcGVkIHVwIGFuZCBjb21wbGV0ZWQKLSAgICAgICAgaW1tZWRpYXRlbHkuCi0KLTMuIEFsbG93IGJyb3dzaW5nIGR1cmluZyBsb25nIG9wZXJhdGlvbgotCi0gIEV4YW1wbGU6Ci0gICAgVGhlIHVzZXIgaGFzIHN0YXJ0ZWQgc29tZSBsb25nIHJ1bm5pbmcgYmFja2dyb3VuZCB0YXNrIChjaGVja291dCwKLSAgICBpbXBvcnQsIGJ1aWxkLCBldGMpLiAgVGhleSB3YW50IGEgbGl2ZSBVSSBzbyB0aGV5IGNhbiBicm93c2UgcmVzb3VyY2VzCi0gICAgKGdldCBjaGlsZHJlbiwgZ2V0IGNvbnRlbnRzLCBkaXJ0eSBlZGl0b3JzKSB3aGlsZSB0aGV5IHdhaXQgZm9yIHRoZSBsb25nIAotICAgIG9wZXJhdGlvbiB0byBmaW5pc2guCi0gICAgCi0gIERlbHV4ZToKLSAgICBUaGUgYmFja2dyb3VuZCB0YXNrIGNhbiBjb21wbGV0ZSBpbiBjaHVua3MsIGFsbG93aW5nIHRoZSB1c2VyIHRvIGJyb3dzZQotICAgIGFuZCBtb2RpZnkgcmVzb3VyY2VzIHRoYXQgd2VyZSBpbnZvbHZlZCBpbiB0aGUgb3BlcmF0aW9uLiAgSS5lLiwgdGhleQotICAgIGNhbiBlZGl0IGltcG9ydGVkIHJlc291cmNlcyBiZWZvcmUgdGhlIGltcG9ydCBoYXMgY29tcGxldGVkLgotCi00LiBBbGxvdyBlZGl0IGR1cmluZyBsb25nIHJ1bm5pbmcgcmVhZC1vbmx5IG9wZXJhdGlvbnMKLSAgCi0gIEV4YW1wbGU6Ci0gICAgVGhlIHVzZXIgc3RhcnRzIGEgc2VhcmNoLiAgU2luY2Ugc2VhcmNoZXMgZG9uJ3QgbW9kaWZ5IHJlc291cmNlcywKLSAgICB0aGUgdXNlciBtYXkgd2FudCB0byBtb2RpZnkgKGFkZCwgZGVsZXRlLCBjaGFuZ2UpIHJlc291cmNlcyB3aGlsZQotICAgIHRoZSBzZWFyY2ggaXMgaGFwcGVuaW5nLiAgVGhpcyBtYXkgb3IgbWF5IG5vdCBhZmZlY3QgdGhlIHNlYXJjaAotICAgIHJlc3VsdHMuCi0KLTUuIENvbmN1cnJlbnQgZWRpdC4KLQotICBFeGFtcGxlczoKLSAgICBhKSBUaGUgdXNlciBkb2VzIGEgQ1ZTIHVwZGF0ZSBvbiBwcm9qZWN0IEEgd2hpbGUgcHJvamVjdCBCIGlzIGJlaW5nIGRlbGV0ZWQuCi0gICAgYikgVGhlIHVzZXIgZG9lcyBhIENWUyB1cGRhdGUgb24gcHJvamVjdCBBIHdoaWxlIHRoYXQgc2FtZSBwcm9qZWN0IGlzCi0gICAgYmVpbmcgY29tcGlsZWQsIGRlbGV0ZWQsIGV0Yy4gIFRoaXMgaXMgdGhlIGV4dHJlbWUgY29uY3VycmVuY3kgZXhhbXBsZS4gIAotCi0gICAgCi02LiBBbGxvdyBwcmVlbXB0aW9uIGFuZCByZXN0YXJ0IG9uIGxvbmctcnVubmluZyBvcGVyYXRpb24uCi0KLSAgRXhhbXBsZXM6Ci0gIAlhKSBUaGUgTWNxIGV4YW1wbGUuICBVc2VyIGhpdHMgc2F2ZSBvbiBhIGZpbGUsIGFuZCBidWlsZCBzdGFydHMuICBVc2VyCi0gIAkgICByZWFsaXplcyB0aGF0IHRoZXJlIGlzIGFuIGVycm9yLCBhbmQgdGhleSBtb2RpZnkgYW5kIHNhdmUgYWdhaW4uCi0gIAkgICBUaGV5IHdhbnQgdG8gY2FuY2VsIHRoZSBjdXJyZW50bHkgcnVubmluZyBidWlsZCBhbmQgc3RhcnQgYSBuZXcgb25lLgotICAJYikgVXNlciBzZWxlY3RzIGEgcmV2aXNpb24gaW4gdGhlIENWUyByZXBvc2l0b3JpZXMgdmlldywgYW5kIGhpdHMKLSAgCSAgIGNoZWNrb3V0LiAgV2hpbGUgY2hlY2tvdXQgaXMgcnVubmluZywgdXNlciByZWFsaXplcyB0aGV5IGNob3NlCi0gIAkgICB0aGUgd3JvbmcgdmVyc2lvbiwgYW5kIHRoZXkgd2FudCB0byBjaGVja291dCBhIGRpZmZlcmVudCBvbmUgaW5zdGVhZC4KLSAgCSAgIFRoZXkgd2FudCB0byBjYW5jZWwgdGhlIGN1cnJlbnQgY2hlY2tvdXQgYW5kIHByZS1lbXB0IHdpdGggYW5vdGhlci4KLSAgCSAgIApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL2RvYy93b3Jrc3BhY2UtbG9jay5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL2RvYy93b3Jrc3BhY2UtbG9jay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2YxOWYzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9kb2Mvd29ya3NwYWNlLWxvY2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+V29ya3NwYWNlIGxvY2sgZ3JhbnVsYXJpdHk8L2gxPgotPGgyPlRoZSBwcm9ibGVtPC9oMj4KLTx1bD4KLTxsaT5UaGUgY3VycmVudCB3b3Jrc3BhY2UgbG9jayBpcyBoZWF2eSBoYW5kZWQuICBUaGVyZSBpcyBhIHNpbmdsZSB3cml0ZSBsb2NrIGZvciB0aGUgZW50aXJlIAotd29ya3NwYWNlLCBhbmQgaXQgaXMgZ2VuZXJhbGx5IGFjcXVpcmVkIGZvciBzaWduaWZpY2FudCBwZXJpb2RzIG9mIHRpbWUuICBUaGlzIGNhbiBibG9jawotb3RoZXIgcHJvY2Vzc2VzIGZvciBzZXZlcmFsIG1pbnV0ZXMuICBXaGVuIHRoZSBsb2NrIGlzIGFjcXVpcmVkLCBubyBvdGhlciB0aHJlYWRzCi1jYW4gd3JpdGUgdG8gdGhlIHdvcmtzcGFjZSBpbiBhbnkgd2F5LiBUaGUgd3JpdGUgbG9jayBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCB3b3Jrc3BhY2UKLXJlYWRlcnMsIHdoaWNoIGFyZSBhbHdheXMgYWxsb3dlZCB0byBwcm9jZWVkLgotPC9saT4KLTxwPgotPGxpPgotUHJvY2Vzc2VzIG9mdGVuIGRvbid0IGtub3cgaW4gYWR2YW5jZSB3aGV0aGVyIHdyaXRlcyBhcmUgbmVjZXNzYXJ5LCBzbyBvZnRlbiB0aGUgCi1sb2NrIGlzIGFjcXVpcmVkIGZvciBsb25nIHBlcmlvZHMgZXZlbiB3aGVuIG5vIHdyaXRpbmcgb2NjdXJzIChmb3IgZXhhbXBsZSBvbiBzZWFyY2hlcykuCi08L2xpPgotPHA+Ci08bGk+Ci1UaGUgd29ya3NwYWNlIGxvY2tpbmcgbWVjaGFuaXNtIGlzIGN1cnJlbnRseSB0aWVkIHRvIHRoZSBtZWNoYW5pc20gZm9yIGJhdGNoaW5nCi13b3Jrc3BhY2UgY2hhbmdlcy4gIFdlIHdpZGVseSBhZHZlcnRpc2UgdGhhdCBjb21wb3VuZCB3b3Jrc3BhY2UgY2hhbmdlcyBzaG91bGQKLWJlIGRvbmUgd2l0aGluIGFuIElXb3Jrc3BhY2VSdW5uYWJsZS4gIFRoZSB3b3Jrc3BhY2UgaXMgYWx3YXlzIGxvY2tlZCBmb3IgdGhlCi1kdXJhdGlvbiBvZiB0aGUgSVdvcmtzcGFjZVJ1bm5hYmxlIGV2ZW4gaWYgaXQgaXMgbm90IG1ha2luZyBjaGFuZ2VzIHRvIHRoZSB3b3Jrc3BhY2UuCi08L2xpPgotPHA+Ci08bGk+Ci1JbiB0aGUgYWJzZW5jZSBvZiBvdGhlciBzeW5jIG1lY2hhbmlzbXMsIG90aGVyIGNsaWVudHMgdXNlIHRoZSB3b3Jrc3BhY2UgbG9jawotZm9yIHdvcmtpbmcgd2l0aCBvcGVyYXRpb25zIHRoYXQgZG9uJ3QgbmVjZXNzYXJpbHkgZXZlbiBvcGVyYXRlIG9uIHJlc291cmNlcy4KLTwvbGk+Ci08cD4KLTxsaT4KLVRvIGF2b2lkIGRlYWRsb2NrLCBtYW55IGNsaWVudHMgYWNxdWlyZSB0aGUgd29ya3NwYWNlIGxvY2sgImp1c3QgaW4gY2FzZSIsIGJlZm9yZQotYWNxdWlyaW5nIHRoZWlyIG93biBwcml2YXRlIGxvY2sgbWVjaGFuaXNtLgotPC9saT4KLTxwPgotPGxpPgotQWx0aG91Z2ggdGhpcyBwcm9ibGVtIGlzIG1vc3QgZXZpZGVudCB3aXRoIHRoZSB3b3Jrc3BhY2UgbG9jaywgdGhlcmUgYXJlIG90aGVyCi1oZWF2eS1oYW5kZWQgbG9ja3MgaW4gRWNsaXBzZSB3aXRoIHdoaWNoIHRoZSBzYW1lIGlzc3VlcyBhcHBlYXIgKHRoZSBDVlMgbG9jayBpcwotYW5vdGhlciBleGFtcGxlKS4KLTwvbGk+Ci08L3VsPgotCi08aDI+UHJvcG9zZWQgU29sdXRpb248L2gyPgotPHA+Ci1UaGUgY3VycmVudCB3b3Jrc3BhY2UgbG9jayBpcyB2ZXJ5IGNvYXJzZS1ncmFpbmVkIGJvdGggaW4gaG93IGxvbmcgdGhlIGxvY2sgaXMgaGVsZCwKLWFuZCB0aGUgc2NvcGUgb2YgdGhlIHJlc291cmNlcyB0aGF0IGFyZSBsb2NrZWQgYnkgaXQuICBUbyBhY2hpZXZlIGJldHRlciBjb25jdXJyZW5jeQotaW4gdGhlIHdvcmtzcGFjZSwgd2UgbmVlZCB0byBhdHRhY2sgdGhlIGxvY2sncyBwaHlzaWNhbCBncmFudWxhcml0eSwgaXRzIHRlbXBvcmFsCi1ncmFudWxhcml0eSwgb3Igc29tZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvLgotPC9wPgotPHA+Ci1XZSBjYW4gaW1wcm92ZSB0aGUgbG9jaydzIHRlbXBvcmFsIGdyYW51bGFyaXR5IGJ5IHJlbW92aW5nIGFueSBwdWJsaWMsIGdlbmVyYWwgd2F5IAotb2YgbG9ja2luZyBmb3IgYW4gYXJiaXRyYXJ5IHBlcmlvZCBvZiB0aW1lLiBJLmUuLCB3ZSBtYWtlIHRoZSBzaW1wbGUgY2hhbmdlIG9mIG5vdCAKLWFjcXVpcmluZyB0aGUgbG9jayBmb3IgSVdvcmtzcGFjZVJ1bm5hYmxlcy4gKG9yIGV2ZW4gYmV0dGVyLCBkZXByZWNhdGUgSVdvcmtzcGFjZVJ1bm5hYmxlIGVudGlyZWx5KS4KLTwvcD4KLTxwPgotSW50ZXJuYWxseSwgdGhlIHdvcmtzcGFjZSB3b3VsZCBjb250aW51ZSB0byB1c2UgYSBzaW5nbGUgbG9jayBpbiBjcml0aWNhbCByZWdpb25zIHRvIGVuc3VyZQotdGhlIGludGVncml0eSBvZiBpbmRpdmlkdWFsIEFQSSBjYWxscy4gIEhvd2V2ZXIsIGEgc3lzdGVtYXRpYyBlZmZvcnQgd291bGQgYmUgbWFkZSB0bwotYnJlYWsgZG93biB0aGUgZHVyYXRpb24gb2YgbG9ja2luZyB3aXRoaW4gdGhvc2UgY2FsbHMsIHdoZXJlIHBvc3NpYmxlLiAgRm9yIGV4YW1wbGUsCi1hIGJlc3QtZWZmb3J0IGNvcHkgbWV0aG9kIGRvZXMgbm90IG5lZWQgdG8gbG9jayB0aGUgd29ya3NwYWNlIGZvciBpdHMgZW50aXJlIGR1cmF0aW9uLAotYnV0IG9ubHkgZm9yIGVhY2ggdW5pdCBvZiB3b3JrIHdoZXJlIGEgbmV3IHJlc291cmNlIGlzIGNyZWF0ZWQgYXQgdGhlIGRlc3RpbmF0aW9uLgotPC9wPgotPHA+Ci1UaGUgdW5kZXJseWluZyBkZXNpZ24gcnVsZSBpcyB0byBwcmV2ZW50IGFuIGF0b21pYyBvcGVyYXRpb24gZnJvbSBsb2NraW5nCi10aGUgd29ya3NwYWNlIGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUuICBXaXRob3V0IHRoZSBwcmVzZW5jZSBvZiBsb25nIHRlcm0gbG9ja3MsIAotbG9uZyBydW5uaW5nIGNvbmN1cnJlbnQgb3BlcmF0aW9ucyB3aWxsIGludGVybGVhdmUgdGhlaXIgYWNjZXNzIHRvIHRoZSB3b3Jrc3BhY2UsIAotZW5hYmxpbmcgc2V2ZXJhbCB3b3Jrc3BhY2UtbW9kaWZ5aW5nIG9wZXJhdGlvbnMgdG8gcnVuIGF0IHRoZSBzYW1lIHRpbWUuCi08L3A+Ci08cD4KLVRoaXMgc29sdXRpb24gaXMgb3B0aW1pc3RpYy4gSXQgYXNzdW1lcyB0aGF0IGNvbmN1cnJlbnQgd3JpdGVzIHRvIHRoZSBzYW1lIHNldCAKLW9mIHJlc291cmNlcyBpbiBhIGNvbmZsaWN0aW5nIG1hbm5lciBhcmUgcmVsYXRpdmVseSByYXJlLiBPbmUgY291bGQgaW4gZmFjdCBnbyBmdXJ0aGVyLCBhbmQKLXNheSB0aGF0IGlmIGNvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgbW9kaWZ5aW5nIHRoZSBzYW1lIHJlc291cmNlcyBhdCB0aGUgc2FtZSB0aW1lLAotdGhlbiBpdCBpcyBlaXRoZXIgYSB1c2VyIG9yIHByb2dyYW1taW5nIGVycm9yLCBhbmQgdGhlIGNvbmN1cnJlbnQgdGFza3Mgc2hvdWxkIGp1c3QgZmFpbC4KLVNlcnZlcyB0aGVtIHJpZ2h0IGZvciB0cnlpbmcgdG8gZG8gY29udHJhZGljdG9yeSB0aGluZ3Mgb24gdGhlIHNhbWUgc2V0IG9mIHJlc291cmNlcy4KLTwvcD4KLTxwPgotSG93ZXZlciwgdGhpcyBwaGlsb3NvcGh5IGlzIG5vdCBhY2NlcHRhYmxlIHdpdGhvdXQgYSB2ZXJ5IHN0cm9uZyB2aXN1YWwgaW5kaWNhdGlvbgotdG8gdGhlIHVzZXIgb2Ygd2hhdCBpcyBoYXBwZW5pbmcgYW5kIHdoZW4gaXQgd2lsbCBiZSBmaW5pc2hlZC4gIEkuZS4sIGlmIHdlIGhhZCBhIHByb2dyZXNzCi1kaWFsb2cgc2F5aW5nLCAiUmVzb3VyY2UgWCBpcyBiZWluZyBtb2RpZmllZCwgYW5kIEkgd2lsbCBsZXQgeW91IGtub3cgd2hlbiBJJ20gZG9uZSIsCi10aGVuIGl0IG1pZ2h0IGJlIGFjY2VwdGFibGUgdG8gYmxhbWUgdGhlIHVzZXIgaWYgdGhleSBzdGFydCBhIGNvbmZsaWN0aW5nIHRhc2sgYmVmb3JlCi1pdCBmaW5pc2hlcy4gIFNvbWUgb2YgdGhlIGRyYXdiYWNrcyBvZiB0aGlzIGFwcHJvYWNoIGFyZToKLTxvbCBzdHlsZT0iYSI+Ci08bGk+VGhlIGRpYWxvZyBpcyBhIGRpc3RyYWN0aW9uIHRvIHRoZSB1c2VyIGluIHRoZSBjYXNlcyB3aGVyZSB0aGUgdXNlcgotZG9lc24ndCBjYXJlIHdoZW4gdGhlIHRhc2sgZW5kcyBhbmQgaXMgbm90IHdhaXRpbmcgZm9yIGl0cyByZXN1bHQ8L2xpPgotPGxpPlRoaXMgaW50ZXJhY3Rpb24gc3R5bGUgcHV0cyB0aGUgb251cyBvbiB0aGUgdXNlciB0byBhdm9pZCBtYWtpbmcgbWlzdGFrZXMuICA8L2xpPgotPGxpPkluIG1hbnkgY2FzZXMgdGhlIHVzZXIgZG9lc24ndCBrbm93IHdoYXQgcmVzb3VyY2VzIGFyZSBtb2RpZmllZCBieSBhIGdpdmVuIAotb3BlcmF0aW9uLiBJLmUuLCBpdCBpcyB1bnJlYWxpc3RpYyB0byBhc3N1bWUgdGhhdCB1c2VycyBjYW4gY29tcHV0ZSB0aGUgaW50ZXJzZWN0aW9uCi1iZXR3ZWVuIHRoZSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYWxsIGN1cnJlbnQgYmFja2dyb3VuZCB0aHJlYWRzIG1heSBtb2RpZnkKLWFuZCB0aGUgc2V0IG9mIHJlc291cmNlcyB0aGF0IG1pZ2h0IGJlIG1vZGlmaWVkIGJ5IGFub3RoZXIgdGFzayB0aGV5IGFyZSB0aGlua2luZwotb2Ygc3RhcnRpbmcuPC9saT4KLTxsaT5UaGUgcGVuYWx0eSB0byB0aGUgdXNlciBmb3IgbWFraW5nIGEgbWlzdGFrZSBjYW4gYmUgc2V2ZXJlLiAgRm9yIGV4YW1wbGUsCi1pZiB0aGUgdXNlciBzdGFydHMgYSBDVlMgY29tbWl0IG9wZXJhdGlvbiwgYW5kIHRoZW4sIHRoaW5raW5nIHRoZSBjb21taXQgaXMgYWJvdXQgZG9uZSwKLWRlY2lkZXMgdG8gZGVsZXRlIHRoZSBwcm9qZWN0LCB0aGV5IHdpbGwgYmUgdW5oYXBweSBpZiB0aGUgZGVsZXRpb24gc3RhcnRlZCBiZWZvcmUKLXRoZSBjb21taXQgZmluaXNoZWQuPC9saT4KLTwvb2w+Ci08cD4KLVNvLCBob3cgZG8gd2Ugc2NoZWR1bGUgY29uY3VycmVudCBqb2JzIGluIGEgd2F5IHRoYXQgcHJldmVudHMgY29uZmxpY3RzIHdpdGhvdXQKLWVtcGxveWluZyBhIHNpbmdsZSBsb25nIHRlcm0gbG9jaz8gV2UgY2FuIGludHJvZHVjZSBhIHNjaGVtZSB3aGVyZQotam9icyBjYW4gc3BlY2lmeSBpbiBhZHZhbmNlIHdoZXRoZXIgdGhleSBuZWVkIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gYSByZXNvdXJjZS4KLVRoYXQgaXMsIGVhY2ggam9iIGNhbiBvcHRpb25hbGx5IHN1cHBseSBhIDxpPnNjaGVkdWxpbmcgcnVsZTwvaT4gdGhhdCBpcyB1c2VkIGJ5Ci10aGUgam9iIHNjaGVkdWxlciB3aGVuIG1ha2luZyBkZWNpc2lvbnMgYWJvdXQgd2hpY2ggam9icyB0byBydW4uICBUaGUgQVBJIGZvciB0aGVzZSAKLXJ1bGVzIHdvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKLTxwcmU+Ci1wdWJsaWMgaW50ZXJmYWNlIElTY2hlZHVsaW5nUnVsZSB7Ci0JcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUpOwotfQotPC9wcmU+Ci08cD4KLVdoaWxlIHRoZXNlIHJ1bGVzIHdvdWxkIHJlbWFpbiBnZW5lcmljIGF0IHRoZSBqb2Igc2NoZWR1bGluZyBsZXZlbCwgdGhlIHdvcmtzcGFjZQotY2FuIGludHJvZHVjZSBzb21lIHN0YW5kYXJkIHJ1bGVzLiAgRm9yIGV4YW1wbGUsIGEgcnVsZSBjb3VsZCByZXF1ZXN0IGFuIGFycmF5Ci1vZiByZXNvdXJjZXMsIG9yIHRoZSBlbnRpcmUgd29ya3NwYWNlLiAgSW4gdGhpcyB3YXksIGZpbmVyLWdyYWluZWQgcG9ydGlvbnMgb2YgdGhlIHdvcmtzcGFjZQotY2FuIGJlIGVmZmVjdGl2ZWx5IGxvY2tlZCBieSBhIGpvYi4KLTwvcD4KLTxwPgotVGhlIGNvbnRyYWN0IG9uIHRoZXNlIHJ1bGVzIHdvdWxkIGJlIGFzIGZvbGxvd3M6IHRoZSBqb2Igc2NoZWR1bGluZyBtZWNoYW5pc20gCi1ndWFyYW50ZWVzIHRoYXQgYSBqb2Igd29uJ3QgYmUgc3RhcnRlZCBpZiB0aGVyZSBpcyBhIGpvYiBjdXJyZW50bHkgcnVubmluZyB0aGF0IGNvbmZsaWN0cwotd2l0aCBpdHMgc2NoZWR1bGluZyBydWxlLiAgVGhpcyBzY2hlZHVsaW5nIHJ1bGUgd291bGQgYmUgb3J0aG9nb25hbCB0byBhbnkgbG9ja2luZyAKLW1lY2hhbmlzbSwgdGh1cyBhdm9pZGluZyBzb21lIG9mIHRoZSBwcm9ibGVtcyBkaXNjdXNzZWQgZWFybGllciB3aXRoIHJlZ2FyZAotdG8gcHJlLXNwZWNpZmljYXRpb24gb2YgbG9ja3MuIFdlIHN0aWxsIG5lZWQgdG8gcmV2aXNpdCBvdXIgcHJldmlvdXMgb2JqZWN0aW9ucyB0bwotcHJlLXNwZWNpZmllZCBsb2NrcyB0byBzZWUgaG93IHRoZXkgYXBwbHkgdG8gc2NoZWR1bGluZyBydWxlczoKLTx1bD4KLTxsaT5TY2hlZHVsaW5nIHBlcmZvcm1hbmNlLiBUaGUgc2NoZWR1bGluZyBydWxlcyBuZWVkIHRvIGJlIHJlc29sdmVkIGV2ZXJ5IHRpbWUKLWEgam9iIGlzIHRvIGJlIHJ1bi4gIEl0IGlzIHRydWUgdGhhdCB0aGlzIHdpbGwgc3RpbGwgaW1wb3NlIGFuIG92ZXJoZWFkIG9uIHNjaGVkdWxpbmcuCi1Nb3N0IG9mIHRoZSB0aW1lLCBob3dldmVyLCB0aGVyZSB3aWxsIGJlIGZldyBvciBubyBqb2JzIHJ1bm5pbmcgc28gdmVyeSBsaXR0bGUgcnVsZQotYW5hbHlzaXMgaXMgbmVlZGVkLiAgQXMgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IG9wZXJhdGlvbnMgZ3Jvd3MsIHRoZSBjb3N0IHdpbGwKLWluY3JlYXNlLiAgSG93ZXZlciwgdGhpcyBoYXMgdGhlIG5pY2UgcHJvcGVydHkgdGhhdCBpdCBpcyBmYXN0IG1vc3Qgb2YgdGhlIHRpbWUsIGFuZCAKLW9ubHkgc3RhcnRzIHRvIHNsb3cgZG93biBpbiB0aGUgdW5jb21tb24gY2FzZSB3aGVyZSB0aGUgc3lzdGVtIGlzIGFscmVhZHkgdmVyeSBidXN5IGFueXdheS4KLTwvbGk+Ci08bGk+SG93IHRvIGtub3cgd2hhdCBydWxlcyB0byB1c2U/ICBJbiBzb21lIGNhc2VzIGl0IGlzIGhhcmQgdG8gcHJlZGljdCB3aGF0IHJlc291cmNlcwotd2lsbCBiZSBjaGFuZ2VkIGJ5IGEgZ2l2ZW4gdW5pdCBvZiB3b3JrLiAgV2hlbiB0aGlyZCBwYXJ0eSBBUEkgaXMgY2FsbGVkLCB0aGVyZSBpcyBvZnRlbgotbm8gY29udHJhY3Qgc2F5aW5nIHdoYXQgd2lsbCBiZSB0b3VjaGVkLiAgVGhpcyBpcyBzdGlsbCBhbiBpc3N1ZS4gIEluIHRoZSB3b3JzdCBjYXNlLAotY2xpZW50cyB3aWxsIGVyciBvbiB0aGUgc2lkZSBvZiBjYXV0aW9uIGFuZCBzcGVjaWZ5IHRoYXQgdGhlIGVudGlyZSB3b3Jrc3BhY2UgaXMgbmVlZGVkLgotV2Ugd2lsbCBuZWVkIHRvIGVkdWNhdGUgdXNlcnMgdG8gc3BlY2lmeSBydWxlcyBjYXJlZnVsbHksIGFuZCBpZiBuZWNlc3NhcnkgdG8gYnJlYWsKLWpvYnMgdXAgaW50byBzZXBhcmF0ZSB1bml0cyB3aXRoIGRpZmZlcmVudCBydWxlcy4gIFdlIHdpbGwgaW50cm9kdWNlIGEgd2F5IG9mIGNyZWF0aW5nCi1jb21wb3NpdGUgam9icyB0aGF0IHdpbGwgYmUgcnVuIGluIGEgc3BlY2lmaWMgb3JkZXIsIGJ1dCBlYWNoIGpvYiBjYW4gaGF2ZSBpdHMKLW93biBzY2hlZHVsaW5nIHJ1bGVzLgotPC9saT4KLTxsaT5Ib3cgdG8gZW5mb3JjZSB0aGF0IHJ1bGVzIGFyZSBmb2xsb3dlZD8gIFRoZSBwcm9wb3NhbCBpcyB0aGF0IHdlIGRvbid0IGVuZm9yY2UKLWFueXRoaW5nLiAgVGhhdCBpcywgYSBqb2IgY2FuIHJlcXVlc3QgYXJiaXRyYXJ5IGxvY2tzIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBydWxlcyB3ZXJlCi1zdGF0ZWQuICBUbyBhdm9pZCBkZWFkbG9jaywgbG9jayBvcmRlcmluZyB3aXRoIHJlbGVhc2UgYW5kIHdhaXQgKGRlc2NyaWJlZCBlYXJsaWVyKQotd2lsbCBiZSB1c2VkLiAgVGhlIHRoZW9yeSBpcyB0aGF0IGlmIGpvYnMgYXJlIHdlbGwgYmVoYXZlZCBhbmQgc3BlY2lmeSB0aGVpciBydWxlcwotY29ycmVjdGx5LCBkZWFkbG9jayB3aWxsIGJlIHJhcmUsIHNvIHJlbGVhc2UgYW5kIHdhaXQgd2lsbCByYXJlbHkgYmUgbmVjZXNzYXJ5LiAgVG8gcHV0Ci1pdCBhbm90aGVyIHdheSwgdGhlIHBlbmFsdHkgZm9yIG5vdCBzcGVjaWZ5aW5nIHlvdXIgcnVsZXMgY29ycmVjdGx5IGlzIHRoYXQgeW91IG1pZ2h0Ci1oYXZlIHNvbWUgbG9ja3MgdGFrZW4gYXdheSBmcm9tIHlvdSB3aGVuIHlvdSBkb24ndCBleHBlY3QgaXQuICBUaGlzIGlzIGEgbXVjaAotbW9yZSBwYWxhdGFibGUgZmFpbHVyZSBtb2RlIHRoYW4gdGhyb3dpbmcgYW4gZXhjZXB0aW9uLCBmb3IgZXhhbXBsZS4KLTwvbGk+Ci08bGk+UHJlLWFsbG9jYXRpb24gY2FuIGJlIHdhc3RlZnVsIGlmIHJlc291cmNlcyBhcmUgb25seSBhY3R1YWxseSBuZWVkZWQgZm9yIGEgc2hvcnQKLXBlcmlvZCBvZiB0aW1lLiAgVGhpcyBpcyBzdGlsbCBhIHBvdGVudGlhbCBwcm9ibGVtIHdpdGggc2NoZWR1bGluZyBydWxlcy4gIEpvYiB3cml0ZXJzCi13aWxsIGhhdmUgdG8gdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbiB3aGVuIGRlc2lnbmluZyBqb2JzIGFuZCB0aGVpciBydWxlcy4gIElmIGEgCi1qb2Igb25seSBuZWVkcyBhY2Nlc3MgdG8gYSByZXNvdXJjZSBicmllZmx5IGF0IHRoZSBlbmQgb2YgYSBsb25nIG9wZXJhdGlvbiwgaXQgY2FuCi1iZSBjb2RlZCBhcyB0d28gam9icyB3aXRoIGRpZmZlcmVudCBydWxlcy4gIFRoaXMgaXMgYW4gYXJlYSB3aGVyZSBzY2hlZHVsaW5nIHJ1bGVzCi1pbnRyb2R1Y2UgYSBuZXcgY29tcGxpY2F0aW9uIHRoYXQgY2xpZW50cyBuZWVkIHRvIGJlIGF3YXJlIG9mLgotPC9saT4KLTwvdWw+Ci08cD4KLVNjaGVkdWxpbmcgcnVsZXMgbWF5IG5vdCBiZSBuZWNlc3NhcnkgYXQgYWxsIGluIGNhc2VzIHdoZXJlIGNvbnRlbnRpb24gaXMgbm90IGxpa2VseSwKLW9yIHdoZXJlIHRoZSBqb2IgaXMgd3JpdHRlbiBpbiBzdWNoIGEgd2F5IHRoYXQgY29uY3VycmVudCBjaGFuZ2VzIGFyZSB0b2xlcmF0ZWQuCi1pZiBjbGllbnRzIGFyZSBjb25maWRlbnQgdGhhdCBubyBjb250ZW50aW9uIGlzIGxpa2VseSwgdGhleSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYW55Ci1ydWxlcy4gIEEgZ29vZCBleGFtcGxlIGZvciB0aGlzIGlzIHNlYXJjaC4gIFNlYXJjaCBtYXkgY3JlYXRlIHNlYXJjaCByZXN1bHQgbWFya2Vycwotb24gYXJiaXRyYXJ5IHJlc291cmNlcy4gIEhvd2V2ZXIsIHNlYXJjaCBjb3VsZCBiZSBpbXBsZW1lbnRlZCB0byBub3QgaGF2ZQotYW55IHNjaGVkdWxpbmcgcnVsZXMsIGFuZCBpdCBjb3VsZCBiZSB0b2xlcmFudCBvZiBjb25jdXJyZW50IGNoYW5nZXMgYW5kIGRlbGV0aW9uLgotU2luY2UgaXQgb25seSBjcmVhdGVzIHNlYXJjaCBtYXJrZXJzLCBpdCBkb2Vzbid0IGNhcmUgaWYgdGhvc2UgbWFya2VycyBhcmUgY2hhbmdlZAotb3IgZGVsZXRlZCBhZnRlciB0aGV5IGFyZSBjcmVhdGVkLiAgVGh1cyBpdCBpcyBwb3NzaWJsZSB0aGF0IHNlYXJjaCBjYW4gYmUgaW1wbGVtZW50ZWQgd2l0aG91dAotdXNpbmcgYW55IHNjaGVkdWxpbmcgcnVsZXMgYXQgYWxsLCBldmVuIHRob3VnaCBpdCBtYXkgcG90ZW50aWFsbHkgbWFrZSBtb2RpZmljYXRpb25zCi10byBhbiBhcmJpdHJhcnkgc2V0IG9mIHJlc291cmNlcy4gIEFub3RoZXIgZXhhbXBsZSBvZiB0aGlzIGlzIENWUyBtZXRhZGF0YSBmaWxlcy4gIFNpbmNlCi10aGUgQ1ZTIGNsaWVudCBpcyB0aGUgb25seSBvbmUgdGhhdCBldmVyIHZpZXdzIG9yIG1vZGlmaWVzIHRoZSBDVlMgbWV0YWRhdGEgZmlsZXMsCi1pdCBtYXkgbm90IG5lZWQgdG8gY3JlYXRlIGEgc2NoZWR1bGluZyBydWxlIGZvciB0aGVtLgotPC9wPgotPHA+Ci1GaW5hbGx5LCB3aGVuIHRoZXJlIGlzIGNvbnRlbnRpb24gYmV0d2VlbiBqb2JzLCB3ZSBuZWVkIGEKLW1lY2hhbmlzbSBmb3IgZ2l2aW5nIG1vcmUgdmFsdWUgdG8gam9icyBpbml0aWF0ZWQgYnkgdXNlcnMgdmVyc3VzIGJhY2tncm91bmQgam9icyAKLXRoYXQgdGhlIHVzZXIgaXMgbm90IHdhaXRpbmcgb24gcmVzdWx0cyBmb3IuICBFYWNoIGpvYiBiZWxvbmdzIHRvIGEgcHJpb3JpdHkgY2xhc3MgdGhhdAotY2FuIGJlIHVzZWQgdG8gbWFuYWdlIHRoaXMgaW50ZXJhY3Rpb24uICBVc2VyIGluaXRpYXRlZCBqb2JzIGJlbG9uZyB0byB0aGUgSU5URVJBQ1RJVkUKLXByaW9yaXR5IGNsYXNzLiBUbyBhdm9pZCBibG9ja2luZyBpbnRlcmFjdGl2ZSBqb2JzIGZvciB1bmFjY2VwdGFibGUgcGVyaW9kcyBvZiB0aW1lLCB3ZQotY2FuIGVtcGxveSB2YXJpb3VzIHBvbGljaWVzIHRvIGVuc3VyZSB0aGUgam9iIGdldHMgcnVuLCBzdWNoIGFzOgotPHVsPgotPGxpPk9ubHkgc3RhcnQgbm9uLWludGVyYWN0aXZlIGpvYnMgd2hlbiBOTyBpbnRlcmFjdGl2ZSBqb2JzIGFyZSBydW5uaW5nPC9saT4KLTxsaT5JZiBhbiBpbnRlcmFjdGl2ZSBqb2IgaXMgd2FpdGluZyB0byBiZSBydW4sIGFuZCBpdHMgcnVsZSBjb25mbGljdHMgd2l0aCBhIGN1cnJlbnRseQotcnVubmluZyBub24taW50ZXJhY3RpdmUgam9iLCB0aGUgbm9uLWludGVyYWN0aXZlIGpvYiBtYXkgYmUgY2FuY2VsZWQgdG8gbGV0IHRoZSBpbnRlcmFjdGl2ZQotam9iIHByb2NlZWQuPC9saT4KLTxsaT5JZiBhbiBpbnRlcmFjdGl2ZSBqb2IgaXMgd2FpdGluZyBvbiBhIGxvY2sgaGVsZCBieSBhIG5vbi1pbnRlcmFjdGl2ZSBqb2IsIAotdGhlIG5vbi1pbnRlcmFjdGl2ZSBqb2IgbWF5IGJlIGNhbmNlbGVkIHRvIGxldCB0aGUgaW50ZXJhY3RpdmUgam9iIHByb2NlZWQuPC9saT4KLTwvdWw+Ci0KLTxoMz5Mb2NraW5nIGlzc3VlczwvaDM+Ci08aDQ+SXMgdGhlIFVJIHRocmVhZCBhbGxvd2VkIHRvIGFjcXVpcmUgbG9ja3M/PC9oND4KLTxiPlJlYXNvbnMgZm9yICJObyI6PC9iPjxicj4KLTxwPgotQ2xlYXJseSB0aGVyZSBpcyBhIGRlYWRsb2NrIHJpc2sgZHVlIHRvIHRoZSBpbnRlcmFjdGlvbiB3aXRoIHN5bmNFeGVjLgotV2UgY2FuIGhhbmRsZSB0aGlzIHJpc2sgaW4gdGhlIHNhbWUgd2F5IHRoYXQgd2UgaGFuZGxlIGl0IGluIEVjbGlwc2UgMi4xLiAgQnkgZW5zdXJpbmcKLXRoZSBjb3JlIGxvY2tpbmcgbWVjaGFuaXNtIGFuZCB0aGUgU1dUIHN5bmNocm9uaXplciBhcmUgYXdhcmUgb2YgZWFjaCBvdGhlciwgd2UKLWNhbiBhdm9pZCBwb3RlbnRpYWwgZGVhZGxvY2tzIGJ5IHNlcnZpY2luZyBzeW5jRXhlY3MgaW4gdGhlIFVJIHRocmVhZCBpbiB0aGUgY2FzZQotd2hlcmUgdGhlIFVJIHRocmVhZCBpcyB3YWl0aW5nIG9uIGFuIGFjcXVpcmVkIGxvY2suICAKLTwvcD4KLTxwPgotTm90IGFsbG93aW5nIGxvY2tzIGluIHRoZSBVSSB0aHJlYWQgd291bGQgYWxzbyBoZWxwIGltcHJvdmUgVUkgcmVzcG9uc2l2ZW5lc3MuICAKLUlmIHRoZSBVSSB0aHJlYWQgaXMgd2FpdGluZyBvbiBhIGxvY2ssIGl0IGNhbm5vdCBiZSBwcm9jZXNzaW5nIHRoZSBldmVudCBxdWV1ZSwgYW5kIHRodXMKLXRoZSBVSSB3aWxsIGZhaWwgdG8gcGFpbnQuCi08L3A+Ci08cD4KLUlmIHdlIGRvbid0IGFsbG93IGxvY2tzIGluIHRoZSBVSSB0aHJlYWQsIHRoZW4gd2UgY2FuIGVhc2lseSBhZGQgdGhlIGV4dHJhIHJlc3RyaWN0aW9uCi10aGF0IGxvY2tzIG11c3QgYmUgYWNxdWlyZWQgZnJvbSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgY3VycmVudGx5IHJ1bm5pbmcgam9icy4gIFRoaXMKLXdvdWxkIGdpdmUgdXMgYSBzdG9yeSBmb3IgY2xlYW5pbmcgdXAgbWlzYmVoYXZpbmcgbG9ja3MuICBJLmUuLCBpZiBzb21lb25lIGFjcXVpcmVzCi1hIGxvY2sgYnV0IGZhaWxzIHRvIHJlbGVhc2UgaXQsIHdlIGNhbiByZWxlYXNlIGl0IGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgam9iIGNvbXBsZXRlcy4KLTwvcD4KLTxiPlJlYXNvbnMgZm9yICJZZXMiOjwvYj48YnI+Ci08cD4KLVRoZSBtYWluIGRyYXdiYWNrIGlzIHRoYXQgdGhpcyB3b3VsZCBiZSB1bndlaWxkeSB0byBwcm9ncmFtIHdpdGguICBTb21lIG9wZXJhdGlvbnMKLXRoYXQgYWNxdWlyZSBsb2NrcyBtYXkgYWN0dWFsbHkgYmUgdmVyeSBmYXN0LiAgRm9yY2luZyB0aGUgVUkgdG8gZm9yayBhIAotam9iIGV2ZXJ5IHRpbWUgYSBsb2NrIGlzIG5lZWRlZCBtYXkgYmUgb3ZlcmtpbGwgaW4gbWFueSBjYXNlcy4gIElmIHRoaXJkIHBhcnR5IGNvZGUgaXMgCi1jYWxsZWQgZnJvbSB0aGUgVUksIHRoZSBjYWxsZXIgbWF5IG5vdCBrbm93IGlmIGxvY2tzIHdpbGwgYmUgYWNxdWlyZWQgZGVlcCBkb3duIGluIHRoZSAKLWNhbGwgc3RhY2suICBUbyBiZSBkZWZlbnNpdmUsIHRoZSBVSSB3b3VsZCBoYXZlIHRvIGZvcmsgam9icyB3aGVuZXZlciB0aGlyZCBwYXJ0eQotY29kZSBpcyBjYWxsZWQuCi08L3A+Ci08cD4KLUFub3RoZXIgcHJvYmxlbSBpcyBob3cgdGhpcyBydWxlIHdvdWxkIGJlIGVuZm9yY2VkLiAgVGhyb3dpbmcgYW4gZXhjZXB0aW9uIHdoZW4KLXRoZSBVSSB0aHJlYWQgYXR0ZW1wdHMgdG8gYWNxdWlyZSBhIGxvY2sgd291bGQgcmVzdWx0IGluIHVuYWNjZXB0YWJsZSBydW50aW1lIGVycm9ycy4KLTwvcD4KLTxoND5EbyB3ZSBleHBvc2UgbG9ja3M/PC9oND4KLTxwPgotRG8gd2UgYWxsb3cgdGhpcmQgcGFydHkgY2xpZW50cyB0byBkaXJlY3RseSBhY3F1aXJlLCBmb3IgZXhhbXBsZSwgdGhlIHdvcmtzcGFjZSBsb2NrPwotVGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIG11c3QgYmUgIk5vIiwgaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgcmVzdHJpY3Rpb24gdGhhdCBqb2JzCi1iZSBhY3F1aXJlZCB3aXRoaW4gcnVubmluZyBqb2JzLiAgT3RoZXJ3aXNlLCB3ZSB3b3VsZCBoYXZlIG5vIHdheSBvZiBjbGVhbmluZyB1cAotbG9ja3MgdGhhdCBjbGllbnRzIGFjcXVpcmUgYnV0IGZhaWwgdG8gcmVsZWFzZS4gIElzIHRoaXMgYWNjZXB0YWJsZT8gIERvIHdlIGtub3cgb2YgCi1hbnkgY2FzZXMgd2hlcmUgY2xpZW50cyB3aWxsIG5lZWQgdG8gYWNxdWlyZSB0aGUgd29ya3NwYWNlIGxvY2ssIGdpdmVuIHRoYXQgd2UgaGF2ZQotYSBzeXN0ZW0gb2YgcnVsZXMgdG8gcHJldmVudCBjb25mbGljdGluZyBqb2JzIGZyb20gcnVubmluZyBjb25jdXJyZW50bHk/Ci08L3A+Ci0KLQotCi08L2JvZHk+CQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9pY29ucy9qb2Jfdmlldy5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvaWNvbnMvam9iX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWZiN2I0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9pY29ucy9qb2Jfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvaWNvbnMvc2FtcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9pY29ucy9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZiM2M5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9pY29ucy9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL2ljb25zL3N1c3BlbmQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL2ljb25zL3N1c3BlbmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDcxZTQyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9pY29ucy9zdXNwZW5kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9pY29ucy90cmVlX3ZpZXcuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL2ljb25zL3RyZWVfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOGJkYjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL2ljb25zL3RyZWVfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2IvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTMzOWQ0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iUHJvZ3Jlc3MgRXhhbXBsZXMiCi0gICAgICAgICAgICBpZD0iUHJvZ3Jlc3NFeGFtcGxlcyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IkxhenkgVHJlZXMiCi0gICAgICAgICAgICBpY29uPSJpY29ucy90cmVlX3ZpZXcuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9IlByb2dyZXNzRXhhbXBsZXMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9icy52aWV3cy5MYXp5VHJlZVZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9icy52aWV3cy5MYXp5VHJlZVZpZXciPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IkpvYiBGYWN0b3J5IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvam9iX3ZpZXcuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9IlByb2dyZXNzRXhhbXBsZXMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9icy52aWV3cy5Kb2JzVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLnZpZXdzLkpvYnNWaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICByYXRpbz0iMC41IgotICAgICAgICAgICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlRhc2tMaXN0IgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYnMudmlld3MuTGF6eVRyZWVWaWV3IgotICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPSJyaWdodCI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgcmF0aW89IjAuNSIKLSAgICAgICAgICAgICAgIHJlbGF0aXZlPSJvcmcuZWNsaXBzZS51aS52aWV3cy5UYXNrTGlzdCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLnZpZXdzLkpvYnNWaWV3IgotICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPSJyaWdodCI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBsYWJlbD0iSm9iIEV4YW1wbGUgQWN0aW9ucyIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiCi0gICAgICAgICAgICBpZD0iUHJvZ3Jlc3NFeGFtcGxlcy5hY3Rpb25TZXQiPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGxhYmVsPSImYW1wO0pvYiIKLSAgICAgICAgICAgICAgIGlkPSJzYW1wbGVNZW51Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgIG5hbWU9InNhbXBsZUdyb3VwIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiZhbXA7U3VzcGVuZCBKb2IgTWFuYWdlciIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL3N1c3BlbmQuZ2lmIgotICAgICAgICAgICAgICAgc3R5bGU9InRvZ2dsZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLmFjdGlvbnMuU3VzcGVuZEpvYk1hbmFnZXJBY3Rpb24iCi0gICAgICAgICAgICAgICB0b29sdGlwPSJTdXNwZW5kIHRoZSBqb2IgbWFuYWdlciIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJzYW1wbGVNZW51L3NhbXBsZUdyb3VwIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9InNhbXBsZUdyb3VwIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYnMuYWN0aW9ucy5TdXNwZW5kSm9iTWFuYWdlckFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSImYW1wO0R1bXAgSm9iIEluZm9ybWF0aW9uIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLmFjdGlvbnMuRGVidWdKb2JNYW5hZ2VyQWN0aW9uIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iRHVtcCBqb2IgaW5mb3JtYXRpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ic2FtcGxlTWVudS9zYW1wbGVHcm91cCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLmFjdGlvbnMuU3VzcGVuZEpvYk1hbmFnZXJBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy9CdXN5U2hvd1doaWxlRGlhbG9nLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvQnVzeVNob3dXaGlsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjc5NjMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy9CdXN5U2hvd1doaWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYnM7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkljb25BbmRNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvZ3Jlc3MuUHJvZ3Jlc3NNYW5hZ2VyOwotLyoqCi0gKkJ1c3lTaG93V2hpbGVEaWFsb2cgaXMgYSB0ZXN0IG9mIGJ1c3lTaG93V2hpbGUgaW4gYSBtb2RhbCBkaWFsb2cuCi0gKi8KLXB1YmxpYyBjbGFzcyBCdXN5U2hvd1doaWxlRGlhbG9nIGV4dGVuZHMgSWNvbkFuZE1lc3NhZ2VEaWFsb2cgewotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEB0b2RvIEdlbmVyYXRlZCBjb21tZW50Ci0JICovCi0JcHVibGljIEJ1c3lTaG93V2hpbGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQltZXNzYWdlID0gIkJ1c3kgV2hpbGUgVGVzdCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZyNnZXRJbWFnZSgpCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQkJQnV0dG9uIGRldGFpbHNCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCA0LCAiU3RhcnQgYnVzeSBzaG93IHdoaWxlIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCWRldGFpbHNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlQcm9ncmVzc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5idXN5Q3Vyc29yV2hpbGUobmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JCQkJCQkgKi8KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCQkJbG9uZyBkZWxheSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuZ2V0TG9uZ09wZXJhdGlvblRpbWUoKTsKLQkJCQkJCQlsb25nIGVuZCA9IHRpbWUgKyBkZWxheSArIGRlbGF5OwotCQkJCQkJCXdoaWxlIChlbmQgPiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgewotCQkJCQkJCQlmaW5hbCBTaGVsbCBteVNoZWxsID0gQnVzeVNob3dXaGlsZURpYWxvZy50aGlzLmdldFNoZWxsKCk7Ci0JCQkJCQkJCW15U2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJCQkJCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJCQkJCQkJICovCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJaWYobXlTaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJCQlteVNoZWxsLmdldERpc3BsYXkoKS5zbGVlcCgpOwotCQkJCQkJCQkJCW15U2hlbGwuc2V0VGV4dChTdHJpbmcudmFsdWVPZihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXJyb3IpIHsKLQkJCQkJZXJyb3IucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXJyb3IpIHsKLQkJCQkJZXJyb3IucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL1Byb2dyZXNzRXhhbXBsZXNQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy9Qcm9ncmVzc0V4YW1wbGVzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMDBkM2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL1Byb2dyZXNzRXhhbXBsZXNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYnMudmlld3MuUHJvZ3Jlc3NFeGFtcGxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9icy52aWV3cy5TbG93RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFByb2dyZXNzRXhhbXBsZXNQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUHJvZ3Jlc3NFeGFtcGxlc1BsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBQcm9ncmVzc0V4YW1wbGVzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2dyZXNzRXhhbXBsZXNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJSUFkYXB0ZXJNYW5hZ2VyIG0gPSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpOwotCQlJQWRhcHRlckZhY3RvcnkgZiA9IG5ldyBQcm9ncmVzc0V4YW1wbGVBZGFwdGVyRmFjdG9yeSgpOwotCQltLnJlZ2lzdGVyQWRhcHRlcnMoZiwgU2xvd0VsZW1lbnQuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvVGVzdEpvYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL1Rlc3RKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0OTg4Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvVGVzdEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYSBzaW1wbGUgdGVzdCBqb2Igd2l0aCBjb25maWd1cmFibGUgcGFyYW1ldGVycwotICovCi1wdWJsaWMgY2xhc3MgVGVzdEpvYiBleHRlbmRzIEpvYiB7Ci0JLyoqCi0JICogQSBmYW1pbHkgaWRlbnRpZmllciBmb3IgYWxsIHRlc3Qgam9icwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEZBTUlMWV9URVNUX0pPQiA9IG5ldyBPYmplY3QoKTsKLQkvKioKLQkgKiBUb3RhbCBkdXJhdGlvbiB0aGF0IHRoZSB0ZXN0IGpvYiBzaG91bGQgc2xlZXAsIGluIG1pbGxpc2Vjb25kcy4KLQkgKi8KLQlwcml2YXRlIGxvbmcgZHVyYXRpb247Ci0JLyoqCi0JICogV2hldGhlciB0aGUgdGVzdCBqb2Igc2hvdWxkIGZhaWwuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZhaWx1cmU7Ci0JLyoqCi0JICogV2hldGhlciB0aGUgam9iIHNob3VsZCByZXBvcnQgdW5rbm93biBwcm9ncmVzcy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdW5rbm93bjsKLQlwcml2YXRlIGJvb2xlYW4gcmVzY2hlZHVsZTsKLQlwcml2YXRlIGxvbmcgcmVzY2hlZHVsZVdhaXQ7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0ZXN0IGpvYgotCSAqIEBwYXJhbSBkdXJhdGlvbiBUb3RhbCB0aW1lIHRoYXQgdGhlIHRlc3Qgam9iIHNob3VsZCBzbGVlcCwgaW4gbWlsbGlzZWNvbmRzLgotCSAqIEBwYXJhbSBsb2NrIFdoZXRoZXIgdGhlIGpvYiBzaG91bGQgdXNlIGEgd29ya3NwYWNlIHNjaGVkdWxpbmcgcnVsZQotCSAqIEBwYXJhbSBmYWlsdXJlIFdoZXRoZXIgdGhlIGpvYiBzaG91bGQgZmFpbAotCSAqIEBwYXJhbSBpbmRldGVybWluYXRlIFdoZXRoZXIgdGhlIGpvYiBzaG91bGQgcmVwb3J0IGluZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MKLQkgKiBAcGFyYW0gcmVzY2hlZHVsZVdhaXQKLQkgKiBAcGFyYW0gcmVzY2hlZHVsZQotCSAqLwotCXB1YmxpYyBUZXN0Sm9iKGxvbmcgZHVyYXRpb24sIGJvb2xlYW4gbG9jaywgYm9vbGVhbiBmYWlsdXJlLCBib29sZWFuIGluZGV0ZXJtaW5hdGUsIGJvb2xlYW4gcmVzY2hlZHVsZSwgbG9uZyByZXNjaGVkdWxlV2FpdCkgewotCQlzdXBlcigiVGVzdCBqb2IiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247Ci0JCXRoaXMuZmFpbHVyZSA9IGZhaWx1cmU7Ci0JCXRoaXMudW5rbm93biA9IGluZGV0ZXJtaW5hdGU7Ci0JCXRoaXMucmVzY2hlZHVsZSA9IHJlc2NoZWR1bGU7Ci0JCXRoaXMucmVzY2hlZHVsZVdhaXQgPSByZXNjaGVkdWxlV2FpdDsKLQkJaWYgKGxvY2spCi0JCQlzZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmpvYnMuSW50ZXJuYWxKb2IjYmVsb25nc1RvKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJaWYoZmFtaWx5IGluc3RhbmNlb2YgVGVzdEpvYikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbWlseSA9PSBGQU1JTFlfVEVTVF9KT0I7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5JbnRlcm5hbEpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZmFpbHVyZSkgewotCQkJTXVsdGlTdGF0dXMgcmVzdWx0ID0gbmV3IE11bHRpU3RhdHVzKCJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzIiwgMSwgIlRoaXMgaXMgdGhlIE11bHRpU3RhdHVzIG1lc3NhZ2UiLCBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBpcyB0aGUgTXVsdGlTdGF0dXMgZXhjZXB0aW9uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzIiwgMSwgIlRoaXMgaXMgdGhlIGNoaWxkIHN0YXR1cyBtZXNzYWdlIiwgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgaXMgdGhlIGNoaWxkIGV4Y2VwdGlvbiIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWZpbmFsIGxvbmcgc2xlZXAgPSAxMDsKLQkJaW50IHRpY2tzID0gKGludCkgKGR1cmF0aW9uIC8gc2xlZXApOwotCQlpZih0aGlzLnVua25vd24pCi0JCQltb25pdG9yLmJlZ2luVGFzayh0b1N0cmluZygpLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCQllbHNlCi0JCQltb25pdG9yLmJlZ2luVGFzayh0b1N0cmluZygpLCB0aWNrcyk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRpY2tzOyBpKyspIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQltb25pdG9yLnN1YlRhc2soIlByb2Nlc3NpbmcgdGljayAjIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRocmVhZC5pbnRlcnJ1cHRlZCgpOwotCQkJCX0KLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmKHJlc2NoZWR1bGUpIAotCQkJCXNjaGVkdWxlKHJlc2NoZWR1bGVXYWl0KTsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvVUlUZXN0Sm9iLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvVUlUZXN0Sm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NjQwZWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL1VJVGVzdEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhIHNpbXBsZSB0ZXN0IFVJIGpvYiB3aXRoIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzCi0gKi8KLXB1YmxpYyBjbGFzcyBVSVRlc3RKb2IgZXh0ZW5kcyBVSUpvYiB7Ci0JcHJpdmF0ZSBsb25nIGR1cmF0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBmYWlsdXJlOwotCXByaXZhdGUgYm9vbGVhbiB1bmtub3duOwotCXB1YmxpYyBVSVRlc3RKb2IobG9uZyBkdXJhdGlvbiwgYm9vbGVhbiBsb2NrLCBib29sZWFuIGZhaWx1cmUsIGJvb2xlYW4gaW5kZXRlcm1pbmF0ZSkgewotCQlzdXBlcigiVGVzdCBqb2IiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247Ci0JCXRoaXMuZmFpbHVyZSA9IGZhaWx1cmU7Ci0JCXRoaXMudW5rbm93biA9IGluZGV0ZXJtaW5hdGU7Ci0JCQotCQlpZiAobG9jaykKLQkJCXNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JfQotCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChmYWlsdXJlKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJZmluYWwgbG9uZyBzbGVlcCA9IDEwOwotCQlpbnQgdGlja3MgPSAoaW50KSAoZHVyYXRpb24gLyBzbGVlcCk7Ci0JCWlmKHVua25vd24pCi0JCQltb25pdG9yLmJlZ2luVGFzayh0b1N0cmluZygpLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCQllbHNlCi0JCQltb25pdG9yLmJlZ2luVGFzayh0b1N0cmluZygpLCB0aWNrcyk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRpY2tzOyBpKyspIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQltb25pdG9yLnN1YlRhc2soIlByb2Nlc3NpbmcgdGljayAjIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRocmVhZC5pbnRlcnJ1cHRlZCgpOwotCQkJCX0KLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvYWN0aW9ucy9DcmVhdGVKb2JzQWN0aW9uLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvYWN0aW9ucy9DcmVhdGVKb2JzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OWVjMDIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL2FjdGlvbnMvQ3JlYXRlSm9ic0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSUlucHV0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSW5wdXREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYnMuVGVzdEpvYjsKLQotLyoqCi0gKiBUZXN0IGFjdGlvbiB0aGF0IGNyZWF0ZXMgYSBudW1iZXIgb2YgZmFrZSBqb2JzLCBhbmQgdGhlbiB3YWl0cyB1bnRpbCB0aGV5IGNvbXBsZXRlLgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlSm9ic0FjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0Jc3RhdGljIGZpbmFsIGxvbmcgREVMQVkgPSAxMDA7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JcHJpdmF0ZSBsb25nIGFza0ZvckR1cmF0aW9uKCkgewotCQlJbnB1dERpYWxvZyBkaWFsb2cgPSBuZXcgSW5wdXREaWFsb2cod2luZG93LmdldFNoZWxsKCksICJIb3cgbG9uZz8iLCAiRW50ZXIgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgcGVyIGpvYiIsICIxMDAwIiwgbmV3IElJbnB1dFZhbGlkYXRvcigpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCXRyeSB7Ci0JCQkJCUxvbmcucGFyc2VMb25nKG5ld1RleHQpOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiAiTm90IGEgbnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpCi0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIExvbmcucGFyc2VMb25nKGRpYWxvZy5nZXRWYWx1ZSgpKTsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGFza0ZvckV4Y2x1c2l2ZSgpIHsKLQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPQotCQkJbmV3IE1lc3NhZ2VEaWFsb2coCi0JCQkJd2luZG93LmdldFNoZWxsKCksCi0JCQkJIkxpa2VzIHRvIGJlIGxlZnQgYWxvbmU/IiwgLy8kTk9OLU5MUy0xJAotCQkJCW51bGwsCi0JCQkJIlByZXNzIHllcyBpZiB0aGUgam9icyBzaG91bGQgYmUgcnVuIG9uZSBhdCBhIHRpbWUsIGFuZCBubyBvdGhlcndpc2UiLCAvLyROT04tTkxTLTEkCi0JCQkJTWVzc2FnZURpYWxvZy5RVUVTVElPTiwKLQkJCQluZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCB9LAotCQkJCTEgLy8gbm8gaXMgdGhlIGRlZmF1bHQKLQkJKTsKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGFza0ZvckZhaWx1cmUoKSB7Ci0JCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBNZXNzYWdlRGlhbG9nKAotCQkJCXdpbmRvdy5nZXRTaGVsbCgpLAotCQkJCSJCb3JuIHRvIGZhaWw/IiwgLy8kTk9OLU5MUy0xJAotCQkJCW51bGwsCi0JCQkJIlNob3VsZCB0aGUgam9icyByZXR1cm4gYW4gZXJyb3Igc3RhdHVzPyIsIC8vJE5PTi1OTFMtMSQKLQkJCQlNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLAotCQkJCW5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMIH0sCi0JCQkJMSAvLyBubyBpcyB0aGUgZGVmYXVsdAotCQkpOwotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotCX0KLQlwcml2YXRlIGludCBhc2tGb3JKb2JDb3VudCgpIHsKLQkJSW5wdXREaWFsb2cgZGlhbG9nID0gbmV3IElucHV0RGlhbG9nKHdpbmRvdy5nZXRTaGVsbCgpLCAiSG93IG11Y2ggd29yaz8iLCAiRW50ZXIgdGhlIG51bWJlciBvZiBqb2JzIHRvIHJ1biIsICIxMDAiLCBuZXcgSUlucHV0VmFsaWRhdG9yKCkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSW50ZWdlci5wYXJzZUludChuZXdUZXh0KTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gIk5vdCBhIG51bWJlciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0pOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKQotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGRpYWxvZy5nZXRWYWx1ZSgpKTsKLQl9Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgam9iQ291bnQgPSBhc2tGb3JKb2JDb3VudCgpOwotCQkJbG9uZyBkdXJhdGlvbiA9IGFza0ZvckR1cmF0aW9uKCk7Ci0JCQlib29sZWFuIGV4Y2x1c2l2ZSA9IGFza0ZvckV4Y2x1c2l2ZSgpOwotCQkJYm9vbGVhbiBmYWlsdXJlID0gYXNrRm9yRmFpbHVyZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JDb3VudDsgaSArKykgewotCQkJCW5ldyBUZXN0Sm9iKGR1cmF0aW9uLCBleGNsdXNpdmUsIGZhaWx1cmUsZmFsc2UsIGZhbHNlLCAwKS5zY2hlZHVsZShERUxBWSk7Ci0JCQl9Ci0vLwkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHdpbmRvdy5nZXRTaGVsbCgpKTsKLS8vCQkJZGlhbG9nLnJ1bih0cnVlLCB0cnVlLCBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotLy8JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLS8vCQkJCQl0cnkgewotLy8JCQkJCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihDcmVhdGVKb2JzQWN0aW9uLnRoaXMsIG1vbml0b3IpOwotLy8JCQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0pOwotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0vLwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotLy8JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvYWN0aW9ucy9EZWJ1Z0pvYk1hbmFnZXJBY3Rpb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy9hY3Rpb25zL0RlYnVnSm9iTWFuYWdlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjcyMjQ4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy9hY3Rpb25zL0RlYnVnSm9iTWFuYWdlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYnMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5Kb2JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgbm90IHJlYWxseSBzYW1wbGUgY29kZS4gIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gZ2F0aGVyIGRlYnVnZ2luZwotICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBiYWNrZ3JvdW5kIGpvYiBzY2hlZHVsaW5nIAotICogbWVjaGFuaXNtLgotICovCi1wdWJsaWMgY2xhc3MgRGVidWdKb2JNYW5hZ2VyQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQlwdWJsaWMgRGVidWdKb2JNYW5hZ2VyQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJLy8KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqIEJFR0lOIERVTVAgSk9CIE1BTkFHRVIgSU5GT1JNQVRJT04gKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCUpvYltdIGpvYnMgPSBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuZmluZChudWxsKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyBqb2JzW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzdGF0ZTogIiArIEpvYk1hbmFnZXIucHJpbnRTdGF0ZShqb2JzW2ldLmdldFN0YXRlKCkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqIEVORCBEVU1QIEpPQiBNQU5BR0VSIElORk9STUFUSU9OICoqKioiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vCi0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL2FjdGlvbnMvRm9yZWdyb3VuZEFjdGlvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL2FjdGlvbnMvRm9yZWdyb3VuZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDM2YzI2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy9hY3Rpb25zL0ZvcmVncm91bmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9icy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBGb3JlZ3JvdW5kQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCS8vbm8tb3AKLQkJCQl9Ci0JCQl9LCBudWxsKTsKLQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL2FjdGlvbnMvSm9iQWN0aW9uLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvYWN0aW9ucy9Kb2JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5MWVkMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvYWN0aW9ucy9Kb2JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9icy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBPdXIgc2FtcGxlIGFjdGlvbiBpbXBsZW1lbnRzIHdvcmtiZW5jaCBhY3Rpb24gZGVsZWdhdGUuCi0gKiBUaGUgYWN0aW9uIHByb3h5IHdpbGwgYmUgY3JlYXRlZCBieSB0aGUgd29ya2JlbmNoIGFuZAotICogc2hvd24gaW4gdGhlIFVJLiBXaGVuIHRoZSB1c2VyIHRyaWVzIHRvIHVzZSB0aGUgYWN0aW9uLAotICogdGhpcyBkZWxlZ2F0ZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGV4ZWN1dGlvbiB3aWxsIGJlIAotICogZGVsZWdhdGVkIHRvIGl0LgotICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUKLSAqLwotcHVibGljIGNsYXNzIEpvYkFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlKb2Igam9iID0gbmV3IFdvcmtzcGFjZUpvYigiQmFja2dyb3VuZCBqb2IiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCJEb2luZyBzb21ldGhpbmcgaW4gYmFja2dyb3VuZCIsIDEwMCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJLy9pZ25vcmUKLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCWpvYi5zZXRSdWxlKHdvcmtzcGFjZS5nZXRSb290KCkpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvYWN0aW9ucy9TdXNwZW5kSm9iTWFuYWdlckFjdGlvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL2FjdGlvbnMvU3VzcGVuZEpvYk1hbmFnZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiMTY3NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvYWN0aW9ucy9TdXNwZW5kSm9iTWFuYWdlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSBzdXNwZW5kL3Jlc3VtZSBzdGF0ZSBvZiB0aGUgam9iIG1hbmFnZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXNwZW5kSm9iTWFuYWdlckFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJaWYgKGFjdGlvbi5pc0NoZWNrZWQoKSkKLQkJCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuc3VzcGVuZCgpOwotCQkJZWxzZQotCQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5yZXN1bWUoKTsKLQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJLy90aHJvd24gaWYgdGhlIHVzZXIgY2FuY2VscyB0aGUgYXR0ZW1wdCB0byBzdXNwZW5kCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvdmlld3MvRGVmZXJyZWRDb250ZW50UHJvdmlkZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy92aWV3cy9EZWZlcnJlZENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDQ1MjI3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy92aWV3cy9EZWZlcnJlZENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYnMudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5CYXNlV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLkRlZmVycmVkVHJlZUNvbnRlbnRNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRGVmZXJyZWRDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBCYXNlV29ya2JlbmNoQ29udGVudFByb3ZpZGVyIHsKLQotCXByaXZhdGUgRGVmZXJyZWRUcmVlQ29udGVudE1hbmFnZXIgbWFuYWdlcjsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlVmlld2VyKSB7Ci0JCQltYW5hZ2VyID0gbmV3IERlZmVycmVkVHJlZUNvbnRlbnRNYW5hZ2VyKHRoaXMsIChBYnN0cmFjdFRyZWVWaWV3ZXIpIHZpZXdlcik7Ci0JCX0KLQkJc3VwZXIuaW5wdXRDaGFuZ2VkKHZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJLy8gdGhlICsgYm94IHdpbGwgYWx3YXlzIGFwcGVhciwgYnV0IHRoZW4gZGlzYXBwZWFyCi0JCS8vIGlmIG5vdCBuZWVkZWQgYWZ0ZXIgeW91IGZpcnN0IGNsaWNrIG9uIGl0LgotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQlpZiAobWFuYWdlci5pc0RlZmVycmVkQWRhcHRlcihlbGVtZW50KSkKLQkJCQlyZXR1cm4gbWFuYWdlci5tYXlIYXZlQ2hpbGRyZW4oZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gbWFuYWdlci5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCWlmKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy92aWV3cy9Kb2JzVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL3ZpZXdzL0pvYnNWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NTczYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL3ZpZXdzL0pvYnNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLnZpZXdzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYnMuVGVzdEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLlVJVGVzdEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi0vKioKLSAqIEEgdmlldyB0aGF0IGFsbG93cyBhIHVzZXIgdG8gY3JlYXRlIGpvYnMgb2YgdmFyaW91cyB0eXBlcywgYW5kIGludGVyYWN0IHdpdGgKLSAqIGFuZCB0ZXN0IG90aGVyIGpvYi1yZWxhdGVkIEFQSXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2JzVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlwcml2YXRlIENvbWJvIGR1cmF0aW9uRmllbGQ7Ci0JcHJpdmF0ZSBCdXR0b24gbG9ja0ZpZWxkLCBmYWlsdXJlRmllbGQsIHRocmVhZEZpZWxkLCBzeXN0ZW1GaWVsZCwgdXNlckZpZWxkLCBncm91cEZpZWxkLCByZXNjaGVkdWxlRmllbGQsIGtlZXBGaWVsZCwga2VlcE9uZUZpZWxkLCB1bmtub3duRmllbGQsIGdvdG9BY3Rpb25GaWVsZDsKLQlwcml2YXRlIFRleHQgcXVhbnRpdHlGaWVsZCwgZGVsYXlGaWVsZCwgcmVzY2hlZHVsZURlbGF5OwotCi0JcHJvdGVjdGVkIHZvaWQgYnVzeUN1cnNvcldoaWxlKCkgewotCQl0cnkgewotCQkJZmluYWwgbG9uZyBkdXJhdGlvbiA9IGdldER1cmF0aW9uKCk7Ci0JCQlmaW5hbCBib29sZWFuIHNob3VsZExvY2sgPSBsb2NrRmllbGQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLmJ1c3lDdXJzb3JXaGlsZShuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCWlmIChzaG91bGRMb2NrKQotCQkJCQkJZG9SdW5JbldvcmtzcGFjZShkdXJhdGlvbiwgbW9uaXRvcik7Ci0JCQkJCWVsc2UKLQkJCQkJCWRvUnVuKGR1cmF0aW9uLCBtb25pdG9yKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVKb2JzKCkgewotCQlpbnQgam9iQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHF1YW50aXR5RmllbGQuZ2V0VGV4dCgpKTsKLQkJYm9vbGVhbiB1aSA9IHRocmVhZEZpZWxkLmdldFNlbGVjdGlvbigpOwotCQlsb25nIGR1cmF0aW9uID0gZ2V0RHVyYXRpb24oKTsKLQkJYm9vbGVhbiBsb2NrID0gbG9ja0ZpZWxkLmdldFNlbGVjdGlvbigpOwotCQlib29sZWFuIGZhaWx1cmUgPSBmYWlsdXJlRmllbGQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4gc3lzdGVtID0gc3lzdGVtRmllbGQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4gdXNlR3JvdXAgPSBncm91cEZpZWxkLmdldFNlbGVjdGlvbigpOwotCQlib29sZWFuIHVua25vd24gPSB1bmtub3duRmllbGQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4gdXNlciA9IHVzZXJGaWVsZC5nZXRTZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiByZXNjaGVkdWxlID0gcmVzY2hlZHVsZUZpZWxkLmdldFNlbGVjdGlvbigpOwotCQlmaW5hbCBsb25nIHJlc2NoZWR1bGVXYWl0ID0gIExvbmcucGFyc2VMb25nKHJlc2NoZWR1bGVEZWxheS5nZXRUZXh0KCkpOwotCQlib29sZWFuIGtlZXAgPSBrZWVwRmllbGQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4ga2VlcE9uZSA9IGtlZXBPbmVGaWVsZC5nZXRTZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiBnb3RvQWN0aW9uID0gZ290b0FjdGlvbkZpZWxkLmdldFNlbGVjdGlvbigpOwotCi0JCWludCBncm91cEluY3JlbWVudCA9IElQcm9ncmVzc01vbml0b3IuVU5LTk9XTjsKLQkJSVByb2dyZXNzTW9uaXRvciBncm91cCA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWludCB0b3RhbCA9IElQcm9ncmVzc01vbml0b3IuVU5LTk9XTjsKLQotCQlpZiAoam9iQ291bnQgPiAxKSB7Ci0JCQl0b3RhbCA9IDEwMDsKLQkJCWdyb3VwSW5jcmVtZW50ID0gMTAwIC8gam9iQ291bnQ7Ci0JCX0KLQotCQlpZiAodXNlR3JvdXApIHsKLQkJCWdyb3VwID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmNyZWF0ZVByb2dyZXNzR3JvdXAoKTsKLQkJCWdyb3VwLmJlZ2luVGFzaygiR3JvdXAiLCB0b3RhbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWxvbmcgZGVsYXkgPSBJbnRlZ2VyLnBhcnNlSW50KGRlbGF5RmllbGQuZ2V0VGV4dCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JDb3VudDsgaSsrKSB7Ci0JCQlKb2IgcmVzdWx0OwotCQkJaWYgKHVpKQotCQkJCXJlc3VsdCA9IG5ldyBVSVRlc3RKb2IoZHVyYXRpb24sIGxvY2ssIGZhaWx1cmUsIHVua25vd24pOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9IG5ldyBUZXN0Sm9iKGR1cmF0aW9uLCBsb2NrLCBmYWlsdXJlLCB1bmtub3duLCByZXNjaGVkdWxlLCByZXNjaGVkdWxlV2FpdCk7Ci0KLQkJCXJlc3VsdC5zZXRQcm9wZXJ0eShJUHJvZ3Jlc3NDb25zdGFudHMuS0VFUF9QUk9QRVJUWSwgQm9vbGVhbi52YWx1ZU9mKGtlZXApKTsKLQkJCXJlc3VsdC5zZXRQcm9wZXJ0eShJUHJvZ3Jlc3NDb25zdGFudHMuS0VFUE9ORV9QUk9QRVJUWSwgQm9vbGVhbi52YWx1ZU9mKGtlZXBPbmUpKTsKLQkJCQotCQkJaWYoZ290b0FjdGlvbikKLQkJCQlyZXN1bHQuc2V0UHJvcGVydHkoSVByb2dyZXNzQ29uc3RhbnRzLkFDVElPTl9QUk9QRVJUWSwgbmV3IEFjdGlvbigiUG9wIHVwIGEgZGlhbG9nIikgeyAvLyROT04tTkxTLTEkCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFNpdGUoKS5nZXRTaGVsbCgpLCAiR290byBBY3Rpb24iLCAiVGhlIGpvYiBjYW4gaGF2ZSBhbiBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGl0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkKLQkJCXJlc3VsdC5zZXRQcm9ncmVzc0dyb3VwKGdyb3VwLCBncm91cEluY3JlbWVudCk7Ci0JCQlyZXN1bHQuc2V0U3lzdGVtKHN5c3RlbSk7Ci0JCQlyZXN1bHQuc2V0VXNlcih1c2VyKTsKLQkJCXJlc3VsdC5zY2hlZHVsZShkZWxheSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBib2R5ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJYm9keS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQljcmVhdGVFbnRyeUZpZWxkR3JvdXAoYm9keSk7Ci0JCWNyZWF0ZVB1c2hCdXR0b25Hcm91cChib2R5KTsKLQkJY3JlYXRlQ2hlY2tib3hHcm91cChib2R5KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIHB1c2ggYnV0dG9uIHBhcnRzIGZvciB0aGUgam9icyB2aWV3LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlUHVzaEJ1dHRvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvL2NyZWF0ZSBqb2JzCi0JCUJ1dHRvbiBjcmVhdGUgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0JCWNyZWF0ZS5zZXRUZXh0KCJDcmVhdGUgam9icyIpOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZS5zZXRUb29sVGlwVGV4dCgiQ3JlYXRlcyBhbmQgc2NoZWR1bGVzIGpvYnMgYWNjb3JkaW5nIHRvIGFib3ZlIHBhcmFtZXRlcnMiKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNyZWF0ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljcmVhdGVKb2JzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vdG91Y2ggd29ya3NwYWNlCi0JCUJ1dHRvbiB0b3VjaCA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJdG91Y2guc2V0VGV4dCgiVG91Y2ggd29ya3NwYWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJdG91Y2guc2V0VG9vbFRpcFRleHQoIk1vZGlmaWVzIHRoZSB3b3Jrc3BhY2UgaW4gdGhlIFVJIHRocmVhZCIpOyAvLyROT04tTkxTLTEkCi0JCXRvdWNoLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0b3VjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0b3VjaFdvcmtzcGFjZSgpOwotCQkJfQotCQl9KTsKLQkJLy9idXN5IGN1cnNvciB3aGlsZQotCQlCdXR0b24gYnVzeVdoaWxlID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQlidXN5V2hpbGUuc2V0VGV4dCgiYnVzeUN1cnNvcldoaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVzeVdoaWxlLnNldFRvb2xUaXBUZXh0KCJVc2VzIElQcm9ncmVzc1NlcnZpY2UuYnVzeUN1cnNvcldoaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVzeVdoaWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlidXN5V2hpbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYnVzeUN1cnNvcldoaWxlKCk7Ci0JCQl9Ci0JCX0pOwotCQkvL3Byb2dyZXNzIG1vbml0b3IgZGlhbG9nIHdpdGggZm9yaz1mYWxzZQotCQlCdXR0b24gbm9Gb3JrID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQlub0Zvcmsuc2V0VGV4dCgicnVuSW5VSSIpOyAvLyROT04tTkxTLTEkCi0JCW5vRm9yay5zZXRUb29sVGlwVGV4dCgiVXNlcyBJUHJvZ3Jlc3NTZXJ2aWNlLnJ1bkluVUkiKTsgLy8kTk9OLU5MUy0xJAotCQlub0Zvcmsuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW5vRm9yay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwcm9ncmVzc05vRm9yaygpOwotCQkJfQotCQl9KTsKLQotCQkvL3Byb2dyZXNzIG1vbml0b3IgZGlhbG9nIHdpdGggZm9yaz1mYWxzZQotCQlCdXR0b24gZXhjZXB0aW9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQlleGNlcHRpb24uc2V0VGV4dCgiUnVudGltZSBFeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlleGNlcHRpb24uc2V0VG9vbFRpcFRleHQoIk51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gcnVubmluZyIpOyAvLyROT04tTkxTLTEkCi0JCWV4Y2VwdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZXhjZXB0aW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWpvYldpdGhSdW50aW1lRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vam9pbiB0aGUgcnVubmluZyB0ZXN0IGpvYnMKLQkJQnV0dG9uIGpvaW4gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0JCWpvaW4uc2V0VGV4dCgiSm9pbiBUZXN0IEpvYnMiKTsgLy8kTk9OLU5MUy0xJAotCQlqb2luLnNldFRvb2xUaXBUZXh0KCJJSm9iTWFuYWdlci5qb2luKCkgb24gdGVzdCBqb2JzIik7IC8vJE5PTi1OTFMtMSQKLQkJam9pbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJam9pbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlqb2luVGVzdEpvYnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy9qb2luIHRoZSBydW5uaW5nIHRlc3Qgam9icwotCQlCdXR0b24gd2luZG93ID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQl3aW5kb3cuc2V0VGV4dCgiUnVubmFibGUgaW4gV2luZG93Iik7IC8vJE5PTi1OTFMtMSQKLQkJd2luZG93LnNldFRvb2xUaXBUZXh0KCJVc2luZyBhIHJ1bm5hYmxlIGNvbnRleHQgaW4gdGhlIHdvcmtiZW5jaCB3aW5kb3ciKTsgLy8kTk9OLU5MUy0xJAotCQl3aW5kb3cuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXdpbmRvdy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlydW5uYWJsZUluV2luZG93KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vam9pbiB0aGUgcnVubmluZyB0ZXN0IGpvYnMKLQkJQnV0dG9uIHNsZWVwID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQlzbGVlcC5zZXRUZXh0KCJTbGVlcCIpOyAvLyROT04tTkxTLTEkCi0JCXNsZWVwLnNldFRvb2xUaXBUZXh0KCJDYWxscyBzbGVlcCgpIG9uIGFsbCBUZXN0Sm9icyIpOyAvLyROT04tTkxTLTEkCi0JCXNsZWVwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzbGVlcC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlkb1NsZWVwKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vam9pbiB0aGUgcnVubmluZyB0ZXN0IGpvYnMKLQkJQnV0dG9uIHdha2UgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0JCXdha2Uuc2V0VGV4dCgiV2FrZVVwIik7IC8vJE5PTi1OTFMtMSQKLQkJd2FrZS5zZXRUb29sVGlwVGV4dCgiQ2FsbHMgd2FrZVVwKCkgb24gYWxsIFRlc3RKb2JzIik7IC8vJE5PTi1OTFMtMSQKLQkJd2FrZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJd2FrZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWRvV2FrZVVwKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy9zaG93IGluIGRpYWxvZwotCQlCdXR0b24gc2hvd0luRGlhbG9nID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQlzaG93SW5EaWFsb2cuc2V0VGV4dCgic2hvd0luRGlhbG9nIik7IC8vJE5PTi1OTFMtMSQKLQkJc2hvd0luRGlhbG9nLnNldFRvb2xUaXBUZXh0KCJVc2VzIElQcm9ncmVzc1NlcnZpY2Uuc2hvd0luRGlhbG9nIik7IC8vJE5PTi1OTFMtMSQKLQkJc2hvd0luRGlhbG9nLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzaG93SW5EaWFsb2cuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hvd0luRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0aGUgc2hvd0luRGlhbG9nIEFQSQotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0luRGlhbG9nKCkgewotCQkKLQkJSm9iIHNob3dKb2IgPSAKLQkJCW5ldyBKb2IoIlNob3cgSW4gRGlhbG9nIil7Ly8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCJSdW4gaW4gZGlhbG9nIiwxMDApOy8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJdHJ5IHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkKLQkJfX07Ci0JCXNob3dKb2Iuc2NoZWR1bGUoKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS4KLQkJCXNob3dJbkRpYWxvZygKLQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCksc2hvd0pvYik7Ci0JCQotCX0KLQotCS8qKgotCSAqIFdha2VzIHVwIGFsbCBzbGVlcGluZyB0ZXN0IGpvYnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9XYWtlVXAoKSB7Ci0JCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS53YWtlVXAoVGVzdEpvYi5GQU1JTFlfVEVTVF9KT0IpOwotCX0KLQkvKioKLQkgKiBQdXRzIHRvIHNsZWVwIGFsbCB3YWl0aW5nIHRlc3Qgam9icy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NsZWVwKCkgewotCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuc2xlZXAoVGVzdEpvYi5GQU1JTFlfVEVTVF9KT0IpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBib2R5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudHJ5RmllbGRHcm91cChDb21wb3NpdGUgYm9keSkgewotCQkvL2R1cmF0aW9uCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGJvZHksIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiRHVyYXRpb246Iik7IC8vJE5PTi1OTFMtMSQKLQkJZHVyYXRpb25GaWVsZCA9IG5ldyBDb21ibyhib2R5LCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIOwotCQlkdXJhdGlvbkZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWR1cmF0aW9uRmllbGQuYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLQkJZHVyYXRpb25GaWVsZC5hZGQoIjEgbWlsbGlzZWNvbmQiKTsgLy8kTk9OLU5MUy0xJAotCQlkdXJhdGlvbkZpZWxkLmFkZCgiMSBzZWNvbmQiKTsgLy8kTk9OLU5MUy0xJAotCQlkdXJhdGlvbkZpZWxkLmFkZCgiMTAgc2Vjb25kcyIpOyAvLyROT04tTkxTLTEkCi0JCWR1cmF0aW9uRmllbGQuYWRkKCIxIG1pbnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JCWR1cmF0aW9uRmllbGQuYWRkKCIxMCBtaW51dGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJZHVyYXRpb25GaWVsZC5zZWxlY3QoNCk7Ci0KLQkJLy9kZWxheQotCQlsYWJlbCA9IG5ldyBMYWJlbChib2R5LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIlN0YXJ0IGRlbGF5IChtcyk6Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGVsYXlGaWVsZCA9IG5ldyBUZXh0KGJvZHksIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gSURpYWxvZ0NvbnN0YW50cy5FTlRSWV9GSUVMRF9XSURUSDsKLQkJZGVsYXlGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkZWxheUZpZWxkLnNldFRleHQoIjAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vcXVhbnRpdHkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoYm9keSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCJRdWFudGl0eToiKTsgLy8kTk9OLU5MUy0xJAotCQlxdWFudGl0eUZpZWxkID0gbmV3IFRleHQoYm9keSwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIOwotCQlxdWFudGl0eUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXF1YW50aXR5RmllbGQuc2V0VGV4dCgiMSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvL3Jlc2NoZWR1bGUgZGVsYXkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoYm9keSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCJSZXNjaGVkdWxlIERlbGF5IChtcyk6Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzY2hlZHVsZURlbGF5ID0gbmV3IFRleHQoYm9keSwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIOwotCQlyZXNjaGVkdWxlRGVsYXkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmVzY2hlZHVsZURlbGF5LnNldFRleHQoIjEwMDAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYWxsIG9mIHRoZSBjaGVja2JveCBidXR0b25zLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDaGVja2JveEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvL2xvY2sKLQkJbG9ja0ZpZWxkID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJbG9ja0ZpZWxkLnNldFRleHQoIkxvY2sgdGhlIHdvcmtzcGFjZSIpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbG9ja0ZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy9zeXN0ZW0KLQkJc3lzdGVtRmllbGQgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzeXN0ZW1GaWVsZC5zZXRUZXh0KCJTeXN0ZW0gam9iIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlzeXN0ZW1GaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vdGhyZWFkCi0JCXRocmVhZEZpZWxkID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJdGhyZWFkRmllbGQuc2V0VGV4dCgiUnVuIGluIFVJIHRocmVhZCIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJdGhyZWFkRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvL2ZhaWx1cmUKLQkJZmFpbHVyZUZpZWxkID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJZmFpbHVyZUZpZWxkLnNldFRleHQoIkZhaWwiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWZhaWx1cmVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vZ3JvdXBzCi0JCWdyb3VwRmllbGQgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQlncm91cEZpZWxkLnNldFRleHQoIlJ1biBpbiBHcm91cCIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JvdXBGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJLy8JcmVzY2hlZHVsZQotCQlyZXNjaGVkdWxlRmllbGQgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZXNjaGVkdWxlRmllbGQuc2V0VGV4dCgiUmVzY2hlZHVsZSIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJcmVzY2hlZHVsZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkvLwlrZWVwCi0JCWtlZXBGaWVsZCA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWtlZXBGaWVsZC5zZXRUZXh0KCJLZWVwIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlrZWVwRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCS8vCWtlZXAgb25lCi0JCWtlZXBPbmVGaWVsZCA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWtlZXBPbmVGaWVsZC5zZXRUZXh0KCJLZWVwT25lIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlrZWVwT25lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvL0lQcm9ncmVzc01vbml0b3IuVU5LTk9XTgotCQl1bmtub3duRmllbGQgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQl1bmtub3duRmllbGQuc2V0VGV4dCgiSW5kZXRlcm1pbmF0ZSBQcm9ncmVzcyIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJdW5rbm93bkZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy93aGV0aGVyIHRoZSBqb2IgaXMgYSB1c2VyIGpvYgotCQl1c2VyRmllbGQgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQl1c2VyRmllbGQuc2V0VGV4dCgiVXNlciBqb2IiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXVzZXJGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJLy8Jd2hldGhlciB0aGUgam9iIGhhcyBhIGdvdG8gYWN0aW9uCi0JCWdvdG9BY3Rpb25GaWVsZCA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWdvdG9BY3Rpb25GaWVsZC5zZXRUZXh0KCJHb3RvIGFjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ290b0FjdGlvbkZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9SdW4obG9uZyBkdXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIGxvbmcgc2xlZXAgPSAxMDsKLQkJaW50IHRpY2tzID0gKGludCkgKGR1cmF0aW9uIC8gc2xlZXApOwotCQltb25pdG9yLmJlZ2luVGFzaygiU3Bpbm5pbmcgaW5zaWRlIElQcm9ncmVzc1NlcnZpY2UuYnVzeUN1cnNvcldoaWxlIiwgdGlja3MpOyAvLyROT04tTkxTLTEkCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoIlNwaW5uaW5nIGluc2lkZSBJUHJvZ3Jlc3NTZXJ2aWNlLmJ1c3lDdXJzb3JXaGlsZSIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGlja3M7IGkrKykgewotCQkJbW9uaXRvci5zdWJUYXNrKCJQcm9jZXNzaW5nIHRpY2sgIyIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2lnbm9yZQotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1J1bkluV29ya3NwYWNlKGZpbmFsIGxvbmcgZHVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJZG9SdW4oZHVyYXRpb24sIG1vbml0b3IpOwotCQkJCX0KLQkJCX0sIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgbG9uZyBnZXREdXJhdGlvbigpIHsKLQkJc3dpdGNoIChkdXJhdGlvbkZpZWxkLmdldFNlbGVjdGlvbkluZGV4KCkpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIDA7Ci0JCQljYXNlIDEgOgotCQkJCXJldHVybiAxOwotCQkJY2FzZSAyIDoKLQkJCQlyZXR1cm4gMTAwMDsKLQkJCWNhc2UgMyA6Ci0JCQkJcmV0dXJuIDEwMDAwOwotCQkJY2FzZSA0IDoKLQkJCQlyZXR1cm4gNjAwMDA7Ci0JCQljYXNlIDUgOgotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIDYwMDAwMDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGpvYldpdGhSdW50aW1lRXhjZXB0aW9uKCkgewotCQlKb2IgcnVudGltZUV4Y2VwdGlvbkpvYiA9IG5ldyBKb2IoIkpvYiB3aXRoIFJ1bnRpbWUgZXhjZXB0aW9uIikgeyAvLyROT04tTkxTLTEkCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJfTsKLQkJcnVudGltZUV4Y2VwdGlvbkpvYi5zY2hlZHVsZSgpOwotCX0KLQotCS8qKgotCSAqIEV4YW1wbGUgdXNhZ2Ugb2YgdGhlIElKb2JNYW5hZ2VyLmpvaW4gbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGpvaW5UZXN0Sm9icygpIHsKLQkJdHJ5IHsKLQkJCS8vbm90ZSB0aGF0IHdoZW4gYSBudWxsIHByb2dyZXNzIG1vbml0b3IgaXMgdXNlZCB3aGVuIGluIHRoZSBVSQotCQkJLy90aHJlYWQsIHRoZSB3b3JrYmVuY2ggd2lsbCBjcmVhdGUgYSBkZWZhdWx0IHByb2dyZXNzIG1vbml0b3IKLQkJCS8vdGhhdCByZXBvcnRzIHByb2dyZXNzIGluIGEgbW9kYWwgZGlhbG9nIHdpdGggZGV0YWlscyBhcmVhCi0JCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihUZXN0Sm9iLkZBTUlMWV9URVNUX0pPQiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vdGhyb3duIGlmIHRoZSB1c2VyIGludGVycnVwdHMgdGhlIGpvaW4gYnkgY2FuY2VsaW5nIHRoZSBwcm9ncmVzcyBtb25pdG9yCi0JCQkvL0EgVUkgY29tcG9uZW50IHNob3VsZCBzd2FsbG93IHRoZSBleGNlcHRpb24gYW5kIGZpbmlzaCB0aGUgYWN0aW9uCi0JCQkvL29yIG9wZXJhdGlvbi4gQSBsb3dlciBsZXZlbCBjb21wb25lbnQgc2hvdWxkIGp1c3QgcHJvcGFnYXRlIHRoZQotCQkJLy9leGNlcHRpb24KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRocm93biBpZiBUaHJlYWQuaW50ZXJydXB0IGlzIGNhbGxlZCBvbiB0aGlzIHRocmVhZAotCQkJLy8gVGhpcyBjYW4gZWl0aGVyIGJlIGlnbm9yZWQgKHJlcGVhdCB0aGUgam9pbiBhdHRlbXB0IHVudGlsIHN1Y2Nlc3MpLCBvciBwcm9wYWdhdGVkCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvZ3Jlc3NOb0ZvcmsoKSB7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBsb25nIGR1cmF0aW9uID0gZ2V0RHVyYXRpb24oKTsKLQkJCWZpbmFsIGJvb2xlYW4gc2hvdWxkTG9jayA9IGxvY2tGaWVsZC5nZXRTZWxlY3Rpb24oKTsKLQkJCUlQcm9ncmVzc1NlcnZpY2UgcHJvZ3Jlc3NTZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJCXByb2dyZXNzU2VydmljZS5ydW5JblVJKHByb2dyZXNzU2VydmljZSwgbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQlpZiAoc2hvdWxkTG9jaykKLQkJCQkJCWRvUnVuSW5Xb3Jrc3BhY2UoZHVyYXRpb24sIG1vbml0b3IpOwotCQkJCQllbHNlCi0JCQkJCQlkb1J1bihkdXJhdGlvbiwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfSwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgVmlld1BhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAoZHVyYXRpb25GaWVsZCAhPSBudWxsICYmICFkdXJhdGlvbkZpZWxkLmlzRGlzcG9zZWQoKSkKLQkJCWR1cmF0aW9uRmllbGQuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0b3VjaFdvcmtzcGFjZSgpIHsKLQkJLy9jcmVhdGUgYW4gYXN5bmNFeGVjIHRvIHRvdWNoIHRoZSB3b3Jrc3BhY2UgdGhlIHNwZWNpZmljIG51bWJlciBvZiB0aW1lcwotCQlpbnQgam9iQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHF1YW50aXR5RmllbGQuZ2V0VGV4dCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JDb3VudDsgaSsrKSB7Ci0JCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJCQkvL25vLW9wCi0JCQkJCQkJfQotCQkJCQkJfSwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vaWdub3JlCi0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUnVuIGEgd29ya3NwYWNlIHJ1bm5hYmxlIGluIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3cuCi0JICoKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHJ1bm5hYmxlSW5XaW5kb3coKSB7Ci0KLQkJZmluYWwgbG9uZyB0aW1lID0gZ2V0RHVyYXRpb24oKTsKLQkJZmluYWwgbG9uZyBzbGVlcCA9IDEwOwotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGVUZXN0ID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCQkJICovCi0JCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlpbnQgdGlja3MgPSAoaW50KSAodGltZSAvIHNsZWVwKTsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiU3Bpbm5pbmcgaW5zaWRlIEFwcGxpY2F0aW9uV2luZG93LnJ1bigpIiwgdGlja3MpOyAvLyROT04tTkxTLTEkCi0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZSgiU3Bpbm5pbmcgaW5zaWRlIEFwcGxpY2F0aW9uV2luZG93LnJ1bigpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRpY2tzOyBpKyspIHsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKCJQcm9jZXNzaW5nIHRpY2sgIyIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoc2xlZXApOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvL2lnbm9yZQotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCQl0cnkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgcnVubmFibGVUZXN0KTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy92aWV3cy9MYXp5VHJlZVZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy92aWV3cy9MYXp5VHJlZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmNzRiOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvdmlld3MvTGF6eVRyZWVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYnMudmlld3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0vKioKLSAqIFRoaXMgc2FtcGxlIGNsYXNzIGRlbW9uc3RyYXRlcyBob3cgdG8gcGx1Zy1pbiBhIG5ldyB3b3JrYmVuY2ggdmlldy4gVGhlIHZpZXcKLSAqIHNob3dzIGRhdGEgb2J0YWluZWQgZnJvbSB0aGUgbW9kZWwuIFRoZSBzYW1wbGUgY3JlYXRlcyBhIGR1bW15IG1vZGVsIG9uIHRoZQotICogZmx5LCBidXQgYSByZWFsIGltcGxlbWVudGF0aW9uIHdvdWxkIGNvbm5lY3QgdG8gdGhlIG1vZGVsIGF2YWlsYWJsZSBlaXRoZXIKLSAqIGluIHRoaXMgb3IgYW5vdGhlciBwbHVnLWluIChlLmcuIHRoZSB3b3Jrc3BhY2UpLiBUaGUgdmlldyBpcyBjb25uZWN0ZWQgdG8KLSAqIHRoZSBtb2RlbCB1c2luZyBhIGNvbnRlbnQgcHJvdmlkZXIuCi0gKiA8cD4KLSAqIFRoZSB2aWV3IHVzZXMgYSBsYWJlbCBwcm92aWRlciB0byBkZWZpbmUgaG93IG1vZGVsIG9iamVjdHMgc2hvdWxkIGJlCi0gKiBwcmVzZW50ZWQgaW4gdGhlIHZpZXcuIEVhY2ggdmlldyBjYW4gcHJlc2VudCB0aGUgc2FtZSBtb2RlbCBvYmplY3RzIHVzaW5nCi0gKiBkaWZmZXJlbnQgbGFiZWxzIGFuZCBpY29ucywgaWYgbmVlZGVkLiBBbHRlcm5hdGl2ZWx5LCBhIHNpbmdsZSBsYWJlbAotICogcHJvdmlkZXIgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIHZpZXdzIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IG9iamVjdHMgb2YgdGhlCi0gKiBzYW1lIHR5cGUgYXJlIHByZXNlbnRlZCBpbiB0aGUgc2FtZSB3YXkgZXZlcnl3aGVyZS4KLSAqIDxwPgotICovCi1wdWJsaWMgY2xhc3MgTGF6eVRyZWVWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCXByb3RlY3RlZCBUcmVlVmlld2VyIHZpZXdlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHNlcmlhbGl6ZUJ1dHRvbiwgYmF0Y2hCdXR0b247Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHRvcCkgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLS8vCQlwYXJlbnQuc2V0QmFja2dyb3VuZChXb3JrYmVuY2hDb2xvcnMuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCXNlcmlhbGl6ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0sgfCBTV1QuRkxBVCk7Ci0JCXNlcmlhbGl6ZUJ1dHRvbi5zZXRUZXh0KCJTZXJpYWxpemUgZmV0Y2ggam9icyIpOyAvLyROT04tTkxTLTEkCi0vLwkJc2VyaWFsaXplQnV0dG9uLnNldEJhY2tncm91bmQoV29ya2JlbmNoQ29sb3JzLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQlzZXJpYWxpemVCdXR0b24uc2V0U2VsZWN0aW9uKFNsb3dFbGVtZW50QWRhcHRlci5pc1NlcmlhbGl6ZUZldGNoaW5nKCkpOwotCQlzZXJpYWxpemVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU2xvd0VsZW1lbnRBZGFwdGVyLnNldFNlcmlhbGl6ZUZldGNoaW5nKHNlcmlhbGl6ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQlzZXJpYWxpemVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWJhdGNoQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5GTEFUKTsKLQkJYmF0Y2hCdXR0b24uc2V0VGV4dCgiQmF0Y2ggcmV0dXJuZWQgY2hpbGRyZW4iKTsgLy8kTk9OLU5MUy0xJAotLy8JCWJhdGNoQnV0dG9uLnNldEJhY2tncm91bmQoV29ya2JlbmNoQ29sb3JzLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQlzZXJpYWxpemVCdXR0b24uc2V0U2VsZWN0aW9uKFNsb3dFbGVtZW50QWRhcHRlci5pc0JhdGNoRmV0Y2hlZENoaWxkcmVuKCkpOwotCQliYXRjaEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTbG93RWxlbWVudEFkYXB0ZXIuc2V0QmF0Y2hGZXRjaGVkQ2hpbGRyZW4oYmF0Y2hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJYmF0Y2hCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRGVmZXJyZWRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0SW5wdXQobmV3IFNsb3dFbGVtZW50KCJyb290IikpOyAvLyROT04tTkxTLTEkCi0JCXZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JfQotCS8qKgotCSAqIFBhc3NpbmcgdGhlIGZvY3VzIHJlcXVlc3QgdG8gdGhlIHZpZXdlcidzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL3ZpZXdzL1Byb2dyZXNzRXhhbXBsZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvdmlld3MvUHJvZ3Jlc3NFeGFtcGxlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlOGE1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2Ivc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL2pvYnMvdmlld3MvUHJvZ3Jlc3NFeGFtcGxlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qb2JzLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JRGVmZXJyZWRXb3JrYmVuY2hBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgUHJvZ3Jlc3NFeGFtcGxlQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCXByaXZhdGUgU2xvd0VsZW1lbnRBZGFwdGVyIHNsb3dFbGVtZW50QWRhcHRlciA9IG5ldyBTbG93RWxlbWVudEFkYXB0ZXIoKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBvYmplY3QsIENsYXNzIHR5cGUpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgU2xvd0VsZW1lbnQpIHsKLQkJCWlmKHR5cGUgPT0gU2xvd0VsZW1lbnQuY2xhc3MgfHwgdHlwZSA9PSBJRGVmZXJyZWRXb3JrYmVuY2hBZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpCi0JCQkJcmV0dXJuIHNsb3dFbGVtZW50QWRhcHRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsKLQkJCQlTbG93RWxlbWVudC5jbGFzcywgSURlZmVycmVkV29ya2JlbmNoQWRhcHRlci5jbGFzcywgSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MKLQkJCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy92aWV3cy9TbG93RWxlbWVudC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL3ZpZXdzL1Nsb3dFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZjJkM2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL3ZpZXdzL1Nsb3dFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9icy52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgU2xvd0VsZW1lbnQgZXh0ZW5kcyBQbGF0Zm9ybU9iamVjdCB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFNsb3dFbGVtZW50IHBhcmVudDsKLQotCVNsb3dFbGVtZW50KFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMobnVsbCwgbmFtZSwgbnVsbCk7CQotCX0KLQkKLQlTbG93RWxlbWVudChTdHJpbmcgbmFtZSwgU2xvd0VsZW1lbnRbXSBjaGlsZHJlbikgewotCQl0aGlzKG51bGwsIG5hbWUsIGNoaWxkcmVuKTsJCi0JfQotCQotCVNsb3dFbGVtZW50KFNsb3dFbGVtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUsIFNsb3dFbGVtZW50W10gY2hpbGRyZW4pIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCXB1YmxpYyBTbG93RWxlbWVudCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotCXB1YmxpYyBTbG93RWxlbWVudFtdIGdldENoaWxkcmVuKCkgewotCQlSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKLQkJaW50IHJhbmRvbSA9IHIubmV4dEludCgxNSk7Ci0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCByYW5kb207IGkrKykgewotCQkJY2hpbGRyZW4uYWRkKG5ldyBTbG93RWxlbWVudCgiY2hpbGQiICsgaSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIChTbG93RWxlbWVudFtdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBTbG93RWxlbWVudFtjaGlsZHJlbi5zaXplKCldKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL3ZpZXdzL1Nsb3dFbGVtZW50QWRhcHRlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9iL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9qb2JzL3ZpZXdzL1Nsb3dFbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjU4OWNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmpvYi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvam9icy92aWV3cy9TbG93RWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuam9icy52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSURlZmVycmVkV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JRWxlbWVudENvbGxlY3RvcjsKLQotcHVibGljIGNsYXNzIFNsb3dFbGVtZW50QWRhcHRlciBpbXBsZW1lbnRzIElEZWZlcnJlZFdvcmtiZW5jaEFkYXB0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZXJpYWxpemVGZXRjaGluZyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYmF0Y2hGZXRjaGVkQ2hpbGRyZW4gPSBmYWxzZTsKLQotCWZpbmFsIElTY2hlZHVsaW5nUnVsZSBtdXRleFJ1bGUgPSBuZXcgSVNjaGVkdWxpbmdSdWxlKCkgewotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCQlyZXR1cm4gcnVsZSA9PSBtdXRleFJ1bGU7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJCXJldHVybiBydWxlID09IG11dGV4UnVsZTsKLQkJfQotCX07Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklEZWZlcnJlZFdvcmtiZW5jaEFkYXB0ZXIjZmV0Y2hEZWZlcnJlZENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnByb2dyZXNzLklFbGVtZW50Q29sbGVjdG9yLAotCSAqICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBmZXRjaERlZmVycmVkQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCwgSUVsZW1lbnRDb2xsZWN0b3IgY29sbGVjdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNsb3dFbGVtZW50KSB7Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9ICgoU2xvd0VsZW1lbnQpIG9iamVjdCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChpc0JhdGNoRmV0Y2hlZENoaWxkcmVuKCkpIHsKLQkJCQlzbGVlcCg0MDAwKTsKLQkJCQljb2xsZWN0b3IuYWRkKGNoaWxkcmVuLCBtb25pdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQljb2xsZWN0b3IuYWRkKGNoaWxkcmVuW2ldLCBtb25pdG9yKTsKLQkJCQkJc2xlZXAoNDAwMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNsZWVwKGxvbmcgbWlsbHMpIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy9pZ25vcmUKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSURlZmVycmVkV29ya2JlbmNoQWRhcHRlciNpc0NvbnRhaW5lcigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSURlZmVycmVkV29ya2JlbmNoQWRhcHRlciNnZXRSdWxlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRSdWxlKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGlzU2VyaWFsaXplRmV0Y2hpbmcoKSkKLQkJCXJldHVybiBtdXRleFJ1bGU7Ci0JCS8vIEFsbG93IHNldmVyYWwgU2xvd0VsZW1lbnQgcGFyZW50cyB0byBmZXRjaCBjaGlsZHJlbiBjb25jdXJyZW50bHkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTbG93RWxlbWVudCkgewotCQkJcmV0dXJuICgoU2xvd0VsZW1lbnQpIG9iamVjdCkuZ2V0Q2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldEltYWdlRGVzY3JpcHRvcihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIFNsb3dFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChTbG93RWxlbWVudCkgbykuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiAidW5rbm93biI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgU2xvd0VsZW1lbnQpIHsKLQkJCXJldHVybiAoKFNsb3dFbGVtZW50KSBvKS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGJhdGNoRmV0Y2hlZENoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JhdGNoRmV0Y2hlZENoaWxkcmVuKCkgewotCQlyZXR1cm4gYmF0Y2hGZXRjaGVkQ2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhdGNoRmV0Y2hlZENoaWxkcmVuCi0JICogICAgICAgICAgICAgICAgICAgVGhlIGJhdGNoRmV0Y2hlZENoaWxkcmVuIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QmF0Y2hGZXRjaGVkQ2hpbGRyZW4oYm9vbGVhbiBiYXRjaEZldGNoZWRDaGlsZHJlbikgewotCQlTbG93RWxlbWVudEFkYXB0ZXIuYmF0Y2hGZXRjaGVkQ2hpbGRyZW4gPSBiYXRjaEZldGNoZWRDaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcmlhbGl6ZUZldGNoaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlcmlhbGl6ZUZldGNoaW5nKCkgewotCQlyZXR1cm4gc2VyaWFsaXplRmV0Y2hpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlcmlhbGl6ZUZldGNoaW5nCi0JICogICAgICAgICAgICAgICAgICAgVGhlIHNlcmlhbGl6ZUZldGNoaW5nIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VyaWFsaXplRmV0Y2hpbmcoYm9vbGVhbiBzZXJpYWxpemVGZXRjaGluZykgewotCQlTbG93RWxlbWVudEFkYXB0ZXIuc2VyaWFsaXplRmV0Y2hpbmcgPSBzZXJpYWxpemVGZXRjaGluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTU2ZWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkVjbGlwc2UgVUkgRXhhbXBsZXMgTXVsdGlQYWdlRWRpdG9yIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZWFlMjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamZhY2UudGV4dDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudGV4dDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLmVkaXRvcnM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLmlkZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2VkNjJhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jVGh1IE1heSAyNiAwMDozMDowMCBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGNkY2Y3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jVHVlIE9jdCAxOCAxNToxNTowNyBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCi1vcmcuZWNsaXBzZS5qZHQudWkuZ2V0dGVyc2V0dGVyLnVzZS5pcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuamF2YWRvYz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcmV0dXJuIFJldHVybnMgdGhlICR7YmFyZV9maWVsZF9uYW1lfS5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcGFyYW0gJHtwYXJhbX0gVGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXQuXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgSmF2YSBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWxlY29tbWVudCIgbmFtZVw9ImZpbGVjb21tZW50Ij4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogQ29weXJpZ2h0IChjKSAke3llYXJ9IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4gKlxuICogQ29udHJpYnV0b3JzXDpcbiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcbiAqIEBzaW5jZSAzLjJcbiAqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCI+LyoqXG4gKiBcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cblxuJHt0eXBlY29tbWVudH1cbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9ja1xuJHtleGNlcHRpb25fdmFyfS5wcmludFN0YWNrVHJhY2UoKTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmJvZHkiIG5hbWVcPSJjb25zdHJ1Y3RvcmJvZHkiPiR7Ym9keV9zdGF0ZW1lbnR9XG4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWI8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5Ij5yZXR1cm4gJHtmaWVsZH07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjbGFzc2JvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNsYXNzIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNsYXNzYm9keSIgbmFtZVw9ImNsYXNzYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImludGVyZmFjZWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGludGVyZmFjZSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5pbnRlcmZhY2Vib2R5IiBuYW1lXD0iaW50ZXJmYWNlYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImVudW1ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmVudW1ib2R5IiBuYW1lXD0iZW51bWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJhbm5vdGF0aW9uYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgYW5ub3RhdGlvbiB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5hbm5vdGF0aW9uYm9keSIgbmFtZVw9ImFubm90YXRpb25ib2R5Ij5cbjwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI2MzE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1R1ZSBKYW4gMTAgMTY6NTM6NTggRVNUIDIwMDYKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTEKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL0VjbGlwc2UgVUkgRXhhbXBsZXMgTXVsdGlQYWdlRWRpdG9yL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL211bHRpcGFnZWVkaXRvci9NZXNzYWdlVXRpbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL0VjbGlwc2UgVUkgRXhhbXBsZXMgTXVsdGlQYWdlRWRpdG9yL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL211bHRpcGFnZWVkaXRvci9NZXNzYWdlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjE4OWE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci9FY2xpcHNlIFVJIEV4YW1wbGVzIE11bHRpUGFnZUVkaXRvci9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9tdWx0aXBhZ2VlZGl0b3IvTWVzc2FnZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdoaWNoIGhlbHBzIHdpdGggbWFuYWdpbmcgbWVzc2FnZXMuCi0gKi8KLS8qIHBhY2thZ2UgKi9jbGFzcyBNZXNzYWdlVXRpbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQlVORExFID0gIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlCi0gICAgICAgICAgICAuZ2V0QnVuZGxlKFJFU09VUkNFX0JVTkRMRSk7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VVdGlsKCkgewotICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24gb2YgY2xhc3MKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIGtleSBpbgotICAgICAqIHRoZSByZXNvdXJjZSBidW5kbGUuIAotICAgICAqCi0gICAgICogQHBhcmFtIGtleSB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqIEBwYXJhbSBhcmdzIHRoZSBtZXNzYWdlIGFyZ3VtZW50cwotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugb2JqZWN0IHdpdGggdGhlIGdpdmVuIGtleSBpbgotICAgICAqIHRoZSByZXNvdXJjZSBidW5kbGUuIElmIHRoZXJlIGlzbid0IGFueSB2YWx1ZSB1bmRlcgotICAgICAqIHRoZSBnaXZlbiBrZXksIHRoZSBrZXkgaXMgcmV0dXJuZWQsIHN1cnJvdW5kZWQgYnkgJyEncy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgdGhlIHJlc291cmNlIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL0VjbGlwc2UgVUkgRXhhbXBsZXMgTXVsdGlQYWdlRWRpdG9yL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL211bHRpcGFnZWVkaXRvci9NdWx0aVBhZ2VDb250cmlidXRvci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL0VjbGlwc2UgVUkgRXhhbXBsZXMgTXVsdGlQYWdlRWRpdG9yL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL211bHRpcGFnZWVkaXRvci9NdWx0aVBhZ2VDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2I1YTBlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci9FY2xpcHNlIFVJIEV4YW1wbGVzIE11bHRpUGFnZUVkaXRvci9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9tdWx0aXBhZ2VlZGl0b3IvTXVsdGlQYWdlQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERUFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGluc3RhbGxhdGlvbi9kZWluc3RhbGxhdGlvbiBvZiBnbG9iYWwgYWN0aW9ucyBmb3IgbXVsdGktcGFnZSBlZGl0b3JzLgotICogUmVzcG9uc2libGUgZm9yIHRoZSByZWRpcmVjdGlvbiBvZiBnbG9iYWwgYWN0aW9ucyB0byB0aGUgYWN0aXZlIGVkaXRvci4KLSAqIE11bHRpLXBhZ2UgY29udHJpYnV0b3IgcmVwbGFjZXMgdGhlIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGluZGl2aWR1YWwgZWRpdG9ycyBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aVBhZ2VDb250cmlidXRvciBleHRlbmRzIE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLSAgICBwcml2YXRlIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvclBhcnQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbXVsdGktcGFnZSBjb250cmlidXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlQYWdlQ29udHJpYnV0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9uIHJlZ2lzdGVkIHdpdGggdGhlIGdpdmVuIHRleHQgZWRpdG9yLgotICAgICAqIEByZXR1cm4gSUFjdGlvbiBvciBudWxsIGlmIGVkaXRvciBpcyBudWxsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJQWN0aW9uIGdldEFjdGlvbihJVGV4dEVkaXRvciBlZGl0b3IsIFN0cmluZyBhY3Rpb25JRCkgewotICAgICAgICByZXR1cm4gKGVkaXRvciA9PSBudWxsID8gbnVsbCA6IGVkaXRvci5nZXRBY3Rpb24oYWN0aW9uSUQpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFEb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIGluIE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkgewotICAgICAgICBpZiAoYWN0aXZlRWRpdG9yUGFydCA9PSBwYXJ0KQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OwotCi0gICAgICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0gICAgICAgIGlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQotICAgICAgICAgICAgSVRleHRFZGl0b3IgZWRpdG9yID0gKHBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgPyAoSVRleHRFZGl0b3IpIHBhcnQKLSAgICAgICAgICAgICAgICAgICAgOiBudWxsOwotCi0gICAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aW9uKGVkaXRvciwgQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpOwotICAgICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpb24oZWRpdG9yLCBBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSkpOwotICAgICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpb24oZWRpdG9yLCBBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSkpOwotICAgICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgIGdldEFjdGlvbihlZGl0b3IsIEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCkpKTsKLSAgICAgICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aW9uKGVkaXRvciwgQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpKTsKLSAgICAgICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgIGdldEFjdGlvbihlZGl0b3IsIEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSkpOwotICAgICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpb24oZWRpdG9yLCBBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSkpOwotICAgICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuRklORC5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpb24oZWRpdG9yLCBBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSkpOwotICAgICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotICAgICAgICAgICAgICAgICAgICBJREVBY3Rpb25GYWN0b3J5LkJPT0tNQVJLLmdldElkKCksIGdldEFjdGlvbihlZGl0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFQWN0aW9uRmFjdG9yeS5CT09LTUFSSy5nZXRJZCgpKSk7Ci0gICAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0gICAgICAgICAgICAgICAgICAgIElERUFjdGlvbkZhY3RvcnkuQUREX1RBU0suZ2V0SWQoKSwgZ2V0QWN0aW9uKGVkaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVBY3Rpb25GYWN0b3J5LkFERF9UQVNLLmdldElkKCkpKTsKLSAgICAgICAgICAgIGFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL0VjbGlwc2UgVUkgRXhhbXBsZXMgTXVsdGlQYWdlRWRpdG9yL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL211bHRpcGFnZWVkaXRvci9NdWx0aVBhZ2VFZGl0b3JFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvRWNsaXBzZSBVSSBFeGFtcGxlcyBNdWx0aVBhZ2VFZGl0b3Ivb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvbXVsdGlwYWdlZWRpdG9yL011bHRpUGFnZUVkaXRvckV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4MDFkOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvRWNsaXBzZSBVSSBFeGFtcGxlcyBNdWx0aVBhZ2VFZGl0b3Ivb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvbXVsdGlwYWdlZWRpdG9yL011bHRpUGFnZUVkaXRvckV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZvbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEFuIGV4YW1wbGUgc2hvd2luZyBob3cgdG8gY3JlYXRlIGEgbXVsdGktcGFnZSBlZGl0b3IuCi0gKiBUaGlzIGV4YW1wbGUgaGFzIDMgcGFnZXM6Ci0gKiA8dWw+Ci0gKiA8bGk+cGFnZSAwIGNvbnRhaW5zIGEgbmVzdGVkIHRleHQgZWRpdG9yLgotICogPGxpPnBhZ2UgMSBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgZm9udCB1c2VkIGluIHBhZ2UgMgotICogPGxpPnBhZ2UgMiBzaG93cyB0aGUgd29yZHMgaW4gcGFnZSAwIGluIHNvcnRlZCBvcmRlcgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIE11bHRpUGFnZUVkaXRvckV4YW1wbGUgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0IGltcGxlbWVudHMKLSAgICAgICAgSUdvdG9NYXJrZXIgewotCi0gICAgLyoqIFRoZSB0ZXh0IGVkaXRvciB1c2VkIGluIHBhZ2UgMC4gKi8KLSAgICBwcml2YXRlIFRleHRFZGl0b3IgZWRpdG9yOwotCi0gICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgcGFnZSBjb250YWluaW5nIHRoZSB0ZXh0IGVkaXRvciAqLwotICAgIHByaXZhdGUgaW50IGVkaXRvckluZGV4ID0gMDsKLQotICAgIC8qKiBUaGUgZm9udCBjaG9zZW4gaW4gcGFnZSAxLiAqLwotICAgIHByaXZhdGUgRm9udCBmb250OwotCi0gICAgLyoqIFRoZSB0ZXh0IHdpZGdldCB1c2VkIGluIHBhZ2UgMi4gKi8KLSAgICBwcml2YXRlIFN0eWxlZFRleHQgdGV4dDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtdWx0aS1wYWdlIGVkaXRvciBleGFtcGxlLgotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aVBhZ2VFZGl0b3JFeGFtcGxlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgcGFnZSAwIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvciwKLSAgICAgKiB3aGljaCBjb250YWlucyBhIHRleHQgZWRpdG9yLgotICAgICAqLwotICAgIHZvaWQgY3JlYXRlUGFnZTAoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBlZGl0b3IgPSBuZXcgVGV4dEVkaXRvcigpOwotICAgICAgICAgICAgZWRpdG9ySW5kZXggPSBhZGRQYWdlKGVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBzZXRQYWdlVGV4dChlZGl0b3JJbmRleCwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJTb3VyY2UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgRXJyb3JEaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgLm9wZW5FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkVycm9yQ3JlYXRpbmdOZXN0ZWRFZGl0b3IiKSwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgcGFnZSAxIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvciwKLSAgICAgKiB3aGljaCBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgZm9udCB1c2VkIGluIHBhZ2UgMi4KLSAgICAgKi8KLSAgICB2b2lkIGNyZWF0ZVBhZ2UxKCkgewotCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGdldENvbnRhaW5lcigpLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0KLSAgICAgICAgQnV0dG9uIGZvbnRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGZvbnRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGZvbnRCdXR0b24uc2V0VGV4dChNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkNoYW5nZUZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBmb250QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzZXRGb250KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGludCBpbmRleCA9IGFkZFBhZ2UoY29tcG9zaXRlKTsKLSAgICAgICAgc2V0UGFnZVRleHQoaW5kZXgsIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiUHJvcGVydGllcyIpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgcGFnZSAyIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvciwKLSAgICAgKiB3aGljaCBzaG93cyB0aGUgc29ydGVkIHRleHQuCi0gICAgICovCi0gICAgdm9pZCBjcmVhdGVQYWdlMigpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZ2V0Q29udGFpbmVyKCksIFNXVC5OT05FKTsKLSAgICAgICAgRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHRleHQgPSBuZXcgU3R5bGVkVGV4dChjb21wb3NpdGUsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgICAgIHRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgICAgIGludCBpbmRleCA9IGFkZFBhZ2UoY29tcG9zaXRlKTsKLSAgICAgICAgc2V0UGFnZVRleHQoaW5kZXgsIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiUHJldmlldyIpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHBhZ2VzIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKLSAgICAgICAgY3JlYXRlUGFnZTAoKTsKLSAgICAgICAgY3JlYXRlUGFnZTEoKTsKLSAgICAgICAgY3JlYXRlUGFnZTIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgbXVsdGktcGFnZSBlZGl0b3IncyBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIGdldEVkaXRvcigwKS5kb1NhdmUobW9uaXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIG11bHRpLXBhZ2UgZWRpdG9yJ3MgZG9jdW1lbnQgYXMgYW5vdGhlciBmaWxlLgotICAgICAqIEFsc28gdXBkYXRlcyB0aGUgdGV4dCBmb3IgcGFnZSAwJ3MgdGFiLCBhbmQgdXBkYXRlcyB0aGlzIG11bHRpLXBhZ2UgZWRpdG9yJ3MgaW5wdXQKLSAgICAgKiB0byBjb3JyZXNwb25kIHRvIHRoZSBuZXN0ZWQgZWRpdG9yJ3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEVkaXRvcigwKTsKLSAgICAgICAgZWRpdG9yLmRvU2F2ZUFzKCk7Ci0gICAgICAgIHNldFBhZ2VUZXh0KDAsIGVkaXRvci5nZXRUaXRsZSgpKTsKLSAgICAgICAgc2V0SW5wdXQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5NdWx0aVBhZ2VFZGl0b3JFeGFtcGxlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZAotICAgICAqIGNoZWNrcyB0aGF0IHRoZSBpbnB1dCBpcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JRmlsZUVkaXRvcklucHV0PC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkKLSAgICAgICAgICAgIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJJbnZhbGlkSW5wdXQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc3VwZXIuaW5pdChzaXRlLCBlZGl0b3JJbnB1dCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9yUGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGN1bGF0ZXMgdGhlIGNvbnRlbnRzIG9mIHBhZ2UgMiB3aGVuIHRoZSBpdCBpcyBhY3RpdmF0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7Ci0gICAgICAgIHN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLSAgICAgICAgaWYgKG5ld1BhZ2VJbmRleCA9PSAyKSB7Ci0gICAgICAgICAgICBzb3J0V29yZHMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZvbnQgcmVsYXRlZCBkYXRhIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHRleHQgaW4gcGFnZSAyLgotICAgICAqLwotICAgIHZvaWQgc2V0Rm9udCgpIHsKLSAgICAgICAgRm9udERpYWxvZyBmb250RGlhbG9nID0gbmV3IEZvbnREaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotICAgICAgICBmb250RGlhbG9nLnNldEZvbnRMaXN0KHRleHQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCkpOwotICAgICAgICBGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbigpOwotICAgICAgICBpZiAoZm9udERhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGZvbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBmb250LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGZvbnQgPSBuZXcgRm9udCh0ZXh0LmdldERpc3BsYXkoKSwgZm9udERhdGEpOwotICAgICAgICAgICAgdGV4dC5zZXRGb250KGZvbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU29ydHMgdGhlIHdvcmRzIGluIHBhZ2UgMCwgYW5kIHNob3dzIHRoZW0gaW4gcGFnZSAyLgotICAgICAqLwotICAgIHZvaWQgc29ydFdvcmRzKCkgewotCi0gICAgICAgIFN0cmluZyBlZGl0b3JUZXh0ID0gZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCgKLSAgICAgICAgICAgICAgICBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0KCk7Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZWRpdG9yVGV4dCwKLSAgICAgICAgICAgICAgICAiIFx0XG5cclxmIUAjJCVeJiooKS1fPStgfltde307OidcIiwuPD4vP3xcXCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEFycmF5TGlzdCBlZGl0b3JXb3JkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIGVkaXRvcldvcmRzLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChlZGl0b3JXb3JkcywgQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBkaXNwbGF5VGV4dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JXb3Jkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZGlzcGxheVRleHQud3JpdGUoKChTdHJpbmcpIGVkaXRvcldvcmRzLmdldChpKSkpOwotICAgICAgICAgICAgZGlzcGxheVRleHQud3JpdGUoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICB0ZXh0LnNldFRleHQoZGlzcGxheVRleHQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotICAgICAgICBzZXRBY3RpdmVQYWdlKGVkaXRvckluZGV4KTsKLSAgICAgICAgSURFLmdvdG9NYXJrZXIoZWRpdG9yLCBtYXJrZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci9FY2xpcHNlIFVJIEV4YW1wbGVzIE11bHRpUGFnZUVkaXRvci9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9tdWx0aXBhZ2VlZGl0b3IvbWVzc2FnZXMucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci9FY2xpcHNlIFVJIEV4YW1wbGVzIE11bHRpUGFnZUVkaXRvci9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9tdWx0aXBhZ2VlZGl0b3IvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4YmJkMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvRWNsaXBzZSBVSSBFeGFtcGxlcyBNdWx0aVBhZ2VFZGl0b3Ivb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvbXVsdGlwYWdlZWRpdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FcnJvckNyZWF0aW5nTmVzdGVkRWRpdG9yPUVycm9yIGNyZWF0aW5nIG5lc3RlZCB0ZXh0IGVkaXRvcgotQ2hhbmdlRm9udD1DaGFuZ2UgRm9udC4uLgotSW52YWxpZElucHV0PUludmFsaWQgSW5wdXQ6IE11c3QgYmUgSUZpbGVFZGl0b3JJbnB1dAotUHJldmlldz1QcmV2aWV3Ci1Qcm9wZXJ0aWVzPVByb3BlcnRpZXMKLVNvdXJjZT1Tb3VyY2UKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmMGIxOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUGx1Z2luLm5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBtdWx0aXBhZ2VlZGl0b3IuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbXBhdGliaWxpdHkuUGx1Z2luQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiAlUGx1Z2luLnByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHksCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS50ZXh0Ci1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQotRWNsaXBzZS1BdXRvU3RhcnQtY29tbWVudDogVXNlIEVjbGlwc2UtQXV0b1N0YXJ0IGluc3RlYWQgb2YgRWNsaXBzZS1MYXp5U3RhcnQgYmVjYXVzZSB0aGUgbXVsdGkgcGFnZSBlZGl0b3IgZXhhbXBsZSBzaG91bGQgcnVuIGFnYWluc3QgMy4xIGFzIHdlbGwgYXMgMy4yLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzNjEzMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NTFmZWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UubXVsdGlwYWdlZWRpdG9yLmphciA9IEVjbGlwc2UgVUkgRXhhbXBsZXMgTXVsdGlQYWdlRWRpdG9yLwotCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL2RvYy1odG1sL2hnbGVnYWwuaHRtIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL2RvYy1odG1sL2hnbGVnYWwuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDEwODFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci9kb2MtaHRtbC9oZ2xlZ2FsLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzMgW2VuXSAoV2luOTg7IFUpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPkxlZ2FsIE5vdGljZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMz4KLTxhIE5BTUU9Ik5vdGljZXMiPjwvYT5Ob3RpY2VzPC9oMz4KLShjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvZG9jLWh0bWwvdWlfbXVsdGlwYWdlZWRpdG9yX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvZG9jLWh0bWwvdWlfbXVsdGlwYWdlZWRpdG9yX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYWQzOGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL2RvYy1odG1sL3VpX211bHRpcGFnZWVkaXRvcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+RGVza3RvcCAtIE11bHRpLXBhZ2UgRWRpdG9yIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj4KLTxiPkV4YW1wbGUgLSBNdWx0aS1wYWdlIEVkaXRvcjwvYj48L2gyPgotCi08aDM+Ci1JbnRyb2R1Y3Rpb248L2gzPgotVGhlJm5ic3A7IE11bHRpIFBhZ2UgRWRpdG9yIEV4YW1wbGUgYWRkcyBhbiBlZGl0b3IgZm9yIGZpbGVzIHdpdGggdGhlIC5tcGUKLWV4dGVuc2lvbi4gSXQgc2hvd3MgaG93IHRvIGNyZWF0ZSBhbiBlZGl0b3IgdGhhdCB1c2VzIG11bHRpcGxlIHBhZ2VzIGJ5Ci1kZWZpbmluZyBib3RoIGFuIGVkaXRvciBhbmQgYSBwYWdlIGNvbnRyaWJ1dG9yIHRoYXQgY2FuIGFkZCBlbnRyaWVzIHRvCi1hbiBhY3Rpb24gYmFyLgotPGgzPgotUnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci1UbyBzdGFydCB1c2luZyB0aGUgTXVsdGktcGFnZSBFZGl0b3IgRXhhbXBsZSwgY3JlYXRlIGEgbmV3IGZpbGUgd2l0aCAubXBlCi1leHRlbnNpb24uJm5ic3A7IFNlbGVjdCB0aGUgZmlsZSwgYnJpbmcgdXAgdGhlIHBvcHVwIG1lbnUsIHNlbGVjdCB0aGUgT3BlbgotV2l0aCBtZW51IGFuZCBmcm9tIHRoZSBzdWItbWVudSBzZWxlY3QgdGhlIE11bHRpIFBhZ2UgRWRpdG9yIEV4YW1wbGUgbWVudQotaXRlbS4gWW91IGNhbiB0aGVuIHNlbGVjdCB0aGUgZGlmZmVyZW50IGVkaXRvcnMgYnkgc2VsZWN0aW5nIHRoZSBkaWZmZXJlbnQKLXRhYnMuCi08aDQ+Ci08Yj5DcmVhdGluZyBhIG5ldyBtcGUgZmlsZTwvYj48L2g0PgotQ3JlYXRlIGEgbmV3IGZpbGUgd2l0aCBmaWxlIGV4dGVuc2lvbiAubXBlLiZuYnNwOyBGcm9tIHRoZSBGaWxlIG1lbnUsIHNlbGVjdAotTmV3IGFuZCB0aGVuIHNlbGVjdCBPdGhlci4uLiBmcm9tIHRoZSBzdWItbWVudS4mbmJzcDsgQ2xpY2sgb24gU2ltcGxlIGluCi10aGUgd2l6YXJkLCB0aGVuIHNlbGVjdAotPGJyPkZpbGUgaW4gdGhlIGxpc3Qgb24gdGhlIGxlZnQuJm5ic3A7IENsaWNrIG9uIE5leHQgdG8gc3VwcGx5IHRoZSBmaWxlCi1uYW1lIChtYWtlIHN1cmUgdGhlIGV4dGVuc2lvbiBpcyAubXBlKSBhbmQgdGhlIGZvbGRlciBpbiB3aGljaCB0aGUgZmlsZQotc2hvdWxkIGJlIGNvbnRhaW5lZC4KLTxicj4mbmJzcDsKLTxoMz4KLURldGFpbHM8L2gzPgotVGhlJm5ic3A7IE11bHRpIFBhZ2UgRWRpdG9yIEV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBjcmVhdGUgYW4gbXVsdGkKLXBhZ2UgZWRpdG9yIHdpdGggYSBjdXN0b20gcGFnZSBjb250cmlidXRvci4KLTxwPlRoZSBNdWx0aSBQYWdlIEVkaXRvciBFeGFtcGxlIGlzIGNvbnN0cnVjdGVkIHdpdGggdHdvIGV4dGVuc2lvbnMgLSBhCi1kb2N1bWVudCBjb250cmlidXRvciAoTXVsdGlQYWdlQ29udHJpYnV0b3IpIGFuZCBhbiBlZGl0b3IgKE11bHRpUGFnZUVkaXRvcikuCi1UaGUgZG9jdW1lbnQgY29udHJpYnV0b3IgaXMgYSBzdWJjbGFzcyBvZiA8dHQ+b3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjwvdHQ+Ci1hbmQgZGVmaW5lcyB0aGUgYWN0aW9ucyB0aGF0IGFyZSBhZGRlZCB0byBhbiBlZGl0b3Igd2hlbiB0aGUgPHR0PnNldEFjdGl2ZVBhZ2U8L3R0PgotbWV0aG9kIGlzIGNhbGxlZC4gVGhlIGVkaXRvciBpcyBhbiA8dHQ+b3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0PC90dD4KLXRoYXQgY3JlYXRlcyAzIHBhZ2VzIHdob3NlIGFjdGl2YXRpb24gaXMgaGFuZGxlZCBieSB0aGUgPHR0PnBhZ2VDaGFuZ2U8L3R0PgotbWV0aG9kIHRoYXQgaW4gdHVybiBzZW5kcyA8dHQ+c2V0QWN0aXZlUGFnZTwvdHQ+Ci10byB0aGUgY29udHJpYnV0b3IuIFRoZXNlIHR3byBjbGFzc2VzIGRvIG5vdCByZWZlciB0byBlYWNoIG90aGVyIGRpcmVjdGx5Ci0tIHRoZSBjb250cmlidXRvciBmb3IgdGhlIGVkaXRvciBpcyBzZXQgdXNpbmcgdGhlIGNvbnRyaWJ1dG9yQ2xhc3MgdGFnCi1pbiB0aGUgcGx1Z2luLnhtbAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvaWNvbnMvY29weS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvaWNvbnMvY29weS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NjIyNTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL2ljb25zL2NvcHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzU4NTY4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBsdWdpbi5uYW1lID0gTXVsdGktUGFnZSBFZGl0b3IgRXhhbXBsZQotUGx1Z2luLnByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1FZGl0b3JzLk11bHRpUGFnZUVkaXRvckV4YW1wbGUgPSBNdWx0aS1QYWdlIEVkaXRvciBFeGFtcGxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5tdWx0aXBhZ2VlZGl0b3IvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzdlMDk3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgbmFtZT0iJUVkaXRvcnMuTXVsdGlQYWdlRWRpdG9yRXhhbXBsZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2NvcHkuZ2lmIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0ibXBlIgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubXVsdGlwYWdlZWRpdG9yLk11bHRpUGFnZUNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci5NdWx0aVBhZ2VFZGl0b3JFeGFtcGxlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvci5NdWx0aVBhZ2VFZGl0b3JFeGFtcGxlIj4KLSAgICAgIDwvZWRpdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubmF2aWdhdG9yLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubmF2aWdhdG9yLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQ0MjY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5uYXZpZ2F0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQ4YTBkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0jVGh1IE9jdCAyMCAxNDozNzoxMCBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubmF2aWdhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjJkOGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubmF2aWdhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSNUaHUgT2N0IDIwIDE0OjM3OjEwIEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPXVzZXIKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcz48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBnZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50Ij4vKipcbiAqIEByZXR1cm4gUmV0dXJucyB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBzZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmNvbW1lbnQiIG5hbWVcPSJzZXR0ZXJjb21tZW50Ij4vKipcbiAqIEBwYXJhbSAke3BhcmFtfSBUaGUgJHtiYXJlX2ZpZWxkX25hbWV9IHRvIHNldC5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIGNvbnN0cnVjdG9ycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmNvbW1lbnQiIG5hbWVcPSJjb25zdHJ1Y3RvcmNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBKYXZhIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpbGVjb21tZW50IiBuYW1lXD0iZmlsZWNvbW1lbnQiPi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBDb3B5cmlnaHQgKGMpICR7eWVhcn0gSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG4gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcbiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwXDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbiAqXG4gKiBDb250cmlidXRvcnNcOlxuICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJmYWxzZSIgY29udGV4dFw9InR5cGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIHR5cGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnR5cGVjb21tZW50IiBuYW1lXD0idHlwZWNvbW1lbnQiPi8qKlxuICogQHNpbmNlIDMuMlxuICpcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBmaWVsZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50Ij4vKipcbiAqIFxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBub24tb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGNvbW1lbnQiIG5hbWVcPSJtZXRob2Rjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ib3ZlcnJpZGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMub3ZlcnJpZGVjb21tZW50IiBuYW1lXD0ib3ZlcnJpZGVjb21tZW50Ij4vKiAobm9uLUphdmFkb2MpXG4gKiAke3NlZV90b19vdmVycmlkZGVufVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJuZXd0eXBlX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJOZXdseSBjcmVhdGVkIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm5ld3R5cGUiIG5hbWVcPSJuZXd0eXBlIj4ke2ZpbGVjb21tZW50fVxuJHtwYWNrYWdlX2RlY2xhcmF0aW9ufVxuXG4ke3R5cGVjb21tZW50fVxuJHt0eXBlX2RlY2xhcmF0aW9ufTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2F0Y2hibG9ja19jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2F0Y2ggYmxvY2tzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNhdGNoYmxvY2siIG5hbWVcPSJjYXRjaGJsb2NrIj4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrXG4ke2V4Y2VwdGlvbl92YXJ9LnByaW50U3RhY2tUcmFjZSgpOzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIG1ldGhvZCBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rib2R5IiBuYW1lXD0ibWV0aG9kYm9keSI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YlxuJHtib2R5X3N0YXRlbWVudH08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGNvbnN0cnVjdG9yIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yYm9keSIgbmFtZVw9ImNvbnN0cnVjdG9yYm9keSI+JHtib2R5X3N0YXRlbWVudH1cbi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGdldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyYm9keSIgbmFtZVw9ImdldHRlcmJvZHkiPnJldHVybiAke2ZpZWxkfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBzZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmJvZHkiIG5hbWVcPSJzZXR0ZXJib2R5Ij4ke2ZpZWxkfSBcPSAke3BhcmFtfTs8L3RlbXBsYXRlPjwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubmF2aWdhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5uYXZpZ2F0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhNzY0ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5uYXZpZ2F0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNUaHUgT2N0IDIwIDE0OjM3OjI3IEVEVCAyMDA1Ci1jb21waWxlcnMucC5kZXByZWNhdGVkPTAKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0xCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1ZmRjNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5uYXZpZ2F0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlTmF2aWdhdG9yX0V4YW1wbGVzCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5uYXZpZ2F0b3I7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMi4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciwKLSBvcmcuZWNsaXBzZS51aS52aWV3cywKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5uYXZpZ2F0b3IvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5uYXZpZ2F0b3IvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmM0MjU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubmF2aWdhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubmF2aWdhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNkMTI3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1OYXZpZ2F0b3JfRXhhbXBsZXM9Q29tbW9uIE5hdmlnYXRvciBFeGFtcGxlcwotQ29tbW9uX05hdmlnYXRvcl9FeGFtcGxlPUNvbW1vbiBOYXZpZ2F0b3IgRXhhbXBsZSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5uYXZpZ2F0b3IvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQ0M2UwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm5hdmlnYXRvci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gCi0gPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5uYXZpZ2F0b3IucmVzb3VyY2VDb250ZW50IgotICAgICAgICAgICAgbmFtZT0iJUNvbW1vbl9OYXZpZ2F0b3JfRXhhbXBsZSIvPgotICAgPC9leHRlbnNpb24+Ci0gICAtLT4KLSAgIDwhLS0gVGhlIGV4YW1wbGUgdXNlcyB0aGUgYWxyZWFkeSBkZWZpbmVkIFJlc291cmNlIGV4dGVuc2lvbgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLSAgICAgIDxuYXZpZ2F0b3JDb250ZW50Ci0gICAgICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlciIKLSAgICAgICAgICAgIGVuYWJsZWRCeURlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMubmF2aWdhdG9yLmV4YW1wbGUxIgotICAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlciIKLSAgICAgICAgICAgIG5hbWU9IkV4YW1wbGUgQ29udGVudCBFeHRlbnNpb24iCi0gICAgICAgICAgICBwcmlvcml0eT0ibm9ybWFsIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbmF2aWdhdG9yQ29udGVudD4KLSAgIDwvZXh0ZW5zaW9uPiAKLSAgIC0tPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWY2NGU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vQmFyZUJvbmVzUHJlc2VudGF0aW9uLmluaSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9CYXJlQm9uZXNQcmVzZW50YXRpb24uaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2I4MDMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9CYXJlQm9uZXNQcmVzZW50YXRpb24uaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIHVzZSB0aGUgQmFyZS1ib25lcyBwcmVzZW50YXRpb24gc3R5bGUKLW9yZy5lY2xpcHNlLnVpL3ByZXNlbnRhdGlvbkZhY3RvcnlJZD1vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24uYmFyZWJvbmVzCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vV3JhcHBlZFRhYnNQcmVzZW50YXRpb24uaW5pIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL1dyYXBwZWRUYWJzUHJlc2VudGF0aW9uLmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlM2NiMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vV3JhcHBlZFRhYnNQcmVzZW50YXRpb24uaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIHVzZSB0aGUgV3JhcHBlZC1UYWJzIHByZXNlbnRhdGlvbiBzdHlsZQotb3JnLmVjbGlwc2UudWkvcHJlc2VudGF0aW9uRmFjdG9yeUlkPW9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi53cmFwcGVkdGFicwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFmM2UwOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLnByZXNlbnRhdGlvbi5qYXIgPSBzcmMvCi1vdXRwdXQucHJlc2VudGF0aW9uLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLmphcixcCi0gICAgICAgICAgICAgICBpY29ucy8KLXNyYy5pbmNsdWRlcyA9IGljb25zLyxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIGRvYy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL2VjbGlwc2Vjb24yMDA1LXByZXNlbnRhdGlvbnNBUEkucHB0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL2VjbGlwc2Vjb24yMDA1LXByZXNlbnRhdGlvbnNBUEkucHB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWRkNDc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9lY2xpcHNlY29uMjAwNS1wcmVzZW50YXRpb25zQVBJLnBwdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9pY29ucy9jbG9zZV92aWV3LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9pY29ucy9jbG9zZV92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiNjE1MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vaWNvbnMvY2xvc2Vfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vaWNvbnMvaGlkZV90b29sYmFyLkdJRiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9pY29ucy9oaWRlX3Rvb2xiYXIuR0lGCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODU4ZTRhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9pY29ucy9oaWRlX3Rvb2xiYXIuR0lGCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL2ljb25zL21heF92aWV3LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9pY29ucy9tYXhfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZWQ0NDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL2ljb25zL21heF92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9pY29ucy9taW5fdmlldy5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vaWNvbnMvbWluX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDJlZDJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9pY29ucy9taW5fdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vaWNvbnMvcmVzdG9yZV92aWV3LkdJRiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9pY29ucy9yZXN0b3JlX3ZpZXcuR0lGCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDJkNjBjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9pY29ucy9yZXN0b3JlX3ZpZXcuR0lGCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL2ljb25zL3Nob3dfdG9vbGJhci5HSUYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vaWNvbnMvc2hvd190b29sYmFyLkdJRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhMTBhYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vaWNvbnMvc2hvd190b29sYmFyLkdJRgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9pY29ucy92aWV3X21lbnUuR0lGIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL2ljb25zL3ZpZXdfbWVudS5HSUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZWM3ZjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL2ljb25zL3ZpZXdfbWVudS5HSUYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGRhMThjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBQcmVzZW50YXRpb24gRXhhbXBsZSBNYW5pZmVzdAkJCQkJCSAJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24iCi0gICBuYW1lPSJQcmVzZW50YXRpb24gRXhhbXBsZSIKLSAgIHZlcnNpb249IjEuMC43IgotICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLlByZXNlbnRhdGlvblBsdWdpbiI+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIExpYnJhcmllcwkJCQkJIAkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InByZXNlbnRhdGlvbi5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEltcG9ydHMJCQkJCQkgCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIAotPHJlcXVpcmVzPgotICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotPC9yZXF1aXJlcz4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gUHJlc2VudGF0aW9uIEV4dGVuc2lvbnMJCQkJCQkgCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25GYWN0b3JpZXMiPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24uYmFyZWJvbmVzLkJhcmVCb25lc1ByZXNlbnRhdGlvbkZhY3RvcnkiCi0gICAgICAgICAgICBuYW1lPSJCYXJlLWJvbmVzIHByZXNlbnRhdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24uYmFyZWJvbmVzIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25GYWN0b3JpZXMiPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24ud3JhcHBlZHRhYnMuV3JhcHBlZFRhYnNQcmVzZW50YXRpb25GYWN0b3J5IgotICAgICAgICAgICAgbmFtZT0iV3JhcHBlZCB0YWJzIHByZXNlbnRhdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24ud3JhcHBlZHRhYnMiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbkZhY3RvcmllcyI+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMuZGVmYXVsdHByZXNlbnRhdGlvbi5OYXRpdmVQcmVzZW50YXRpb25GYWN0b3J5IgotICAgICAgICAgICAgbmFtZT0iTmF0aXZlIFRhYnMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy5kZWZhdWx0cHJlc2VudGF0aW9uLk5hdGl2ZVByZXNlbnRhdGlvbkZhY3RvcnkiLz4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLmJhcmV0aXR0bGUuQmFyZVRpdGxlUHJlc2VudGF0aW9uRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24uZmFjdG9yeTEiCi0gICAgICAgICAgICBuYW1lPSJTaW1wbGUgVGl0bGUiLz4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLnNpZGV3aW5kZXIuU2lkZVdpbmRlclByZXNlbnRhdGlvbkZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLmZhY3RvcnkyIgotICAgICAgICAgICAgbmFtZT0iU2lkZSBXaW5kZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGVtZXMJCQkJCQkgCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnRoZW1lcyI+Ci0JPHRoZW1lRWxlbWVudENhdGVnb3J5Ci0gICAgCWlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24ud3JhcHBlZHRhYnN0aGVtZSIKLSAgICAgICAJbGFiZWw9IldyYXBwZWRUYWJzIFByZXNlbnRhdGlvbiIvPgotICAgIDxjYXRlZ29yeVByZXNlbnRhdGlvbkJpbmRpbmcKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi53cmFwcGVkdGFic3RoZW1lIgotICAgICAgICAgICAgcHJlc2VudGF0aW9uSWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi53cmFwcGVkdGFicyI+Ci0gICAgICA8L2NhdGVnb3J5UHJlc2VudGF0aW9uQmluZGluZz4KLQk8Y29sb3JEZWZpbml0aW9uIAotICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzdGhlbWUuZm9yZWdyb3VuZF9mb2N1cyIKLSAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzdGhlbWUiCi0gICAgICAgIGxhYmVsPSJCb3JkZXIgQ29sb3IgKEZvY3VzKSIKLSAgICAgICAgdmFsdWU9IkNPTE9SX1dJREdFVF9CT1JERVIiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgY29sb3IgaXMgdXNlZCBmb3IgdGhlIGZvcmdyb3VuZCBjb2xvciBvZiB0aGUgc3RhY2sgYm9yZGVyIHdoZW4gaXQgaGFzIGZvY3VzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9jb2xvckRlZmluaXRpb24+Ci0gICAgICA8Y29sb3JEZWZpbml0aW9uIAotICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzdGhlbWUuZm9yZWdyb3VuZF9ub2ZvY3VzIgotICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24ud3JhcHBlZHRhYnN0aGVtZSIKLSAgICAgICAgbGFiZWw9IkJvcmRlciBDb2xvciAoTm8tRm9jdXMpIgotICAgICAgICB2YWx1ZT0iQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1ciPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgY29sb3IgaXMgdXNlZCBmb3IgdGhlIGZvcmdyb3VuZCBjb2xvciBvZiB0aGUgc3RhY2sgYm9yZGVyIHdoZW4gaXQgZG9lc24ndCBoYXZlIGZvY3VzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9jb2xvckRlZmluaXRpb24+ICAKLSAgICAgIDxmb250RGVmaW5pdGlvbgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzdGhlbWUuZm9udCIKLSAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzdGhlbWUiICAgICAgICAKLSAgICAgICAgbGFiZWw9IlRhYiBGb250IgotICAgICAgICBkZWZhdWx0c1RvPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udCI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhpcyBmb250IGlzIHVzZWQgdG8gZGlzcGxheSB0aGUgcGFydCBzZWxlY3Rpb24gdGFicy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZm9udERlZmluaXRpb24+ICAKLSAgICAgIDxkYXRhCi0gICAgICAgbmFtZT0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzdGhlbWUuYm9yZGVyc2l6ZSIKLSAgICAgICB2YWx1ZT0iMSIvPgotICAgICAgIAotICAgICAgIDx0aGVtZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzdGhlbWUuaGFyc2giCi0gICAgICAgIG5hbWU9IkhhcnNoIFdyYXBwZWQgVGFicyBUaGVtZSI+Ci0gICAgICAgIDxjb2xvck92ZXJyaWRlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzdGhlbWUuZm9yZWdyb3VuZF9mb2N1cyIKLSAgICAgICAgIHZhbHVlPSJDT0xPUl9DWUFOIi8+Ci0gICAgICAgIDxjb2xvck92ZXJyaWRlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzdGhlbWUuZm9yZWdyb3VuZF9ub2ZvY3VzIgotICAgICAgICAgdmFsdWU9IkNPTE9SX01BR0VOVEEiLz4KLSAgICAgIDxkYXRhCi0gICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi53cmFwcGVkdGFic3RoZW1lLmJvcmRlcnNpemUiCi0gICAgICAgICAgIHZhbHVlPSI1Ii8+ICAgICAgCi0gICAgICA8L3RoZW1lPiAKLTwvZXh0ZW5zaW9uPiAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vUHJlc2VudGF0aW9uRXhhbXBsZXNQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL1ByZXNlbnRhdGlvbkV4YW1wbGVzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMjFjODcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vUHJlc2VudGF0aW9uRXhhbXBsZXNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVzZW50YXRpb25FeGFtcGxlc1BsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBQcmVzZW50YXRpb25FeGFtcGxlc1BsdWdpbiBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFByZXNlbnRhdGlvbkV4YW1wbGVzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi5QcmVzZW50YXRpb25FeGFtcGxlc1BsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcmVzZW50YXRpb25FeGFtcGxlc1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUHJlc2VudGF0aW9uRXhhbXBsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vUHJlc2VudGF0aW9uSW1hZ2VzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi9QcmVzZW50YXRpb25JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y5MjljOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi9QcmVzZW50YXRpb25JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFByZXNlbnRhdGlvbkltYWdlcyB7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NFX1ZJRVcgPSAiY2xvc2Vfdmlldy5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTl9WSUVXID0gIm1pbl92aWV3LmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1ZJRVcgPSAibWF4X3ZpZXcuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNUT1JFX1ZJRVcgPSAicmVzdG9yZV92aWV3LmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19NRU5VID0gInZpZXdfbWVudS5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfVE9PTEJBUiA9ICJzaG93X3Rvb2xiYXIuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISURFX1RPT0xCQVIgPSAiaGlkZV90b29sYmFyLmdpZiI7Ci0JCi0JcHJpdmF0ZSBQcmVzZW50YXRpb25JbWFnZXMoKSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGltYWdlTmFtZSkgewotCQlyZXR1cm4gUHJlc2VudGF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShpbWFnZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlTmFtZSkgewotCQlyZXR1cm4gUHJlc2VudGF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi9QcmVzZW50YXRpb25QbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL1ByZXNlbnRhdGlvblBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTFlNjM4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL1ByZXNlbnRhdGlvblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVzZW50YXRpb25QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUHJlc2VudGF0aW9uUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUHJlc2VudGF0aW9uUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi5QcmVzZW50YXRpb25QbHVnaW5SZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdpdmVuIGltYWdlLiBUaGUgaW1hZ2Ugd2lsbCBiZSBtYW5hZ2VkIGJ5IHRoZSBwbHVnaW4ncwotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZU5hbWUgYSBwYXRobmFtZSByZWxhdGl2ZSB0byB0aGUgaWNvbnMgZGlyZWN0b3J5IG9mCi0JICogdGhpcyBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaW1hZ2VOYW1lKSB7Ci0JCUltYWdlUmVnaXN0cnkgcmVnID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQkKLQkJSW1hZ2UgcmVzdWx0ID0gcmVnLmdldChpbWFnZU5hbWUpOwotCQkKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXN1bHQgPSBnZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VOYW1lKS5jcmVhdGVJbWFnZSgpOwotCQkKLQkJcmVnLnB1dChpbWFnZU5hbWUsIHJlc3VsdCk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdpdmVuIGltYWdlIGRlc2NyaXB0b3IuIFRoZSBjYWxsZXIgd2lsbCBiZSByZXNwb25zaWJsZQotCSAqIGZvciBkZWFsbG9jYXRpbmcgdGhlIGltYWdlIGlmIGl0IGNyZWF0ZXMgdGhlIGltYWdlIGZyb20gdGhlIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VOYW1lIGlzIGEgcGF0aG5hbWUgcmVsYXRpdmUgdG8gdGhlIGljb25zIGRpcmVjdG9yeSAKLQkgKiB3aXRoaW4gdGhpcyBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZU5hbWUpIHsJCQotCQlJbWFnZURlc2NyaXB0b3IgZGVzYzsKLQkJdHJ5IHsKLQkJCWRlc2MgPQotCQkJCUltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKAotCQkJCQluZXcgVVJMKAotCQkJCQkJCXBsdWdpbi5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJImljb25zLyIgKyBpbWFnZU5hbWUpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZGVzYyA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQkJCQkJCi0JCXJldHVybiBkZXNjOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZXNlbnRhdGlvblBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUHJlc2VudGF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL2JhcmVib25lcy9CYXJlQm9uZXNQYXJ0UHJlc2VudGF0aW9uLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi9iYXJlYm9uZXMvQmFyZUJvbmVzUGFydFByZXNlbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjcyMzM5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL2JhcmVib25lcy9CYXJlQm9uZXNQYXJ0UHJlc2VudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24uYmFyZWJvbmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklQcmVzZW50YWJsZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JU3RhY2tQcmVzZW50YXRpb25TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuU3RhY2tEcm9wUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuU3RhY2tQcmVzZW50YXRpb247Ci0KLS8qKgotICogQmFyZS1ib25lcyBzdGFjayBwcmVzZW50YXRpb24uIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCBmaWxscyB0aGUgZW50aXJlCi0gKiBwcmVzZW50YXRpb24gYXJlYSwgYW5kIGFsbCBvdGhlciBwYXJ0cyBhcmUgaW52aXNpYmxlLiBEb2VzIG5vdCBwcm92aWRlIGEgCi0gKiBzeXN0ZW0gbWVudSwgcGFuZSBtZW51LCB0cmltLCBkcmFnL2Ryb3AsIHRvb2xiYXJzLCBvciBhbnkgd2F5IHRvIHN3aXRjaCAKLSAqIHBhcnRzLgotICovCi1wdWJsaWMgY2xhc3MgQmFyZUJvbmVzUGFydFByZXNlbnRhdGlvbiBleHRlbmRzIFN0YWNrUHJlc2VudGF0aW9uIHsKLQotLyoqCi0gKiBNYWluIHdpZGdldCBmb3IgdGhlIHByZXNlbnRhdGlvbgotICovCi1wcml2YXRlIENvbXBvc2l0ZSBwcmVzZW50YXRpb25Db250cm9sOwotCi0vKioKLSAqIEN1cnJlbnRseSBzZWxlY3RlZCBwYXJ0Ci0gKi8KLXByaXZhdGUgSVByZXNlbnRhYmxlUGFydCBjdXJyZW50OwotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgYmFyZS1ib25lcyBwYXJ0IHByZXNlbnRhdGlvbiwgZ2l2ZW4gdGhlIHBhcmVudCBjb21wb3NpdGUgYW5kIAotICogYW4gSVN0YWNrUHJlc2VudGF0aW9uU2l0ZSBpbnRlcmZhY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCAKLSAqIHRoZSB3b3JrYmVuY2guCi0gKiAKLSAqIEBwYXJhbSBzdGFja1NpdGUgaW50ZXJmYWNlIHRvIHRoZSB3b3JrYmVuY2gKLSAqLwotcHVibGljIEJhcmVCb25lc1BhcnRQcmVzZW50YXRpb24oQ29tcG9zaXRlIHBhcmVudCwgCi0JCUlTdGFja1ByZXNlbnRhdGlvblNpdGUgc3RhY2tTaXRlKSB7Ci0Jc3VwZXIoc3RhY2tTaXRlKTsJCQotCQotCS8vIENyZWF0ZSBhIHRvcC1sZXZlbCBjb250cm9sIGZvciB0aGUgcHJlc2VudGF0aW9uLgotCXByZXNlbnRhdGlvbkNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQotCS8vIEFkZCBhIGRpc3Bvc2UgbGlzdGVuZXIuIFRoaXMgd2lsbCBjYWxsIHRoZSBwcmVzZW50YXRpb25EaXNwb3NlZCgpCi0JLy8gbWV0aG9kIHdoZW4gdGhlIHdpZGdldCBpcyBkZXN0cm95ZWQuCi0JcHJlc2VudGF0aW9uQ29udHJvbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCXByZXNlbnRhdGlvbkRpc3Bvc2VkKCk7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkvLyBEaXNwb3NlIHRoZSBtYWluIHByZXNlbnRhdGlvbiB3aWRnZXQuIFRoaXMgd2lsbCBjYXVzZSAKLQkvLyBwcmVzZW50YXRpb25EaXNwb3NlZCB0byBiZSBjYWxsZWQsIHdoaWNoIHdpbGwgZG8gdGhlIHJlYWwgY2xlYW51cC4KLQlwcmVzZW50YXRpb25Db250cm9sLmRpc3Bvc2UoKTsKLX0KLQotLyoqCi0gKiBQZXJmb3JtIGFueSBjbGVhbnVwLiBUaGlzIG1ldGhvZCBzaG91bGQgcmVtb3ZlIGFueSBsaXN0ZW5lcnMgdGhhdCB3ZXJlCi0gKiBhdHRhY2hlZCB0byBvdGhlciBvYmplY3RzLiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gdGhlIHByZXNlbnRhdGlvbgotICogd2lkZ2V0IGlzIGRpc3Bvc2VkLiBUaGlzIGlzIHNhZmVyIHRoYW4gY2xlYW5pbmcgdXAgaW4gdGhlIGRpc3Bvc2UoKSAKLSAqIG1ldGhvZCwgc2luY2UgdGhpcyBjb2RlIHdpbGwgcnVuIGV2ZW4gaWYgc29tZSB1bnVzdWFsIGNpcmN1bXN0YW5jZSAKLSAqIGRlc3Ryb3lzIHRoZSBTaGVsbCB3aXRob3V0IGZpcnN0IGNhbGxpbmcgZGlzcG9zZSgpLgotICovCi1wcm90ZWN0ZWQgdm9pZCBwcmVzZW50YXRpb25EaXNwb3NlZCgpIHsKLQkvLyBSZW1vdmUgYW55IGxpc3RlbmVycyB0aGF0IHdlcmUgYXR0YWNoZWQgdG8gYW55IElQcmVzZW50YWJsZVBhcnRzIG9yCi0JLy8gZ2xvYmFsIEVjbGlwc2UgcmVzb3VyY2VzLiBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBwcmV2ZW50Ci0JLy8gbWVtb3J5IGxlYWtzLiBDdXJyZW50bHksIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCi19Ci0KLXB1YmxpYyB2b2lkIHNldEJvdW5kcyhSZWN0YW5nbGUgYm91bmRzKSB7Ci0JLy8gU2V0IHRoZSBib3VuZHMgb2YgdGhlIHByZXNlbnRhdGlvbiB3aWRnZXQKLQlwcmVzZW50YXRpb25Db250cm9sLnNldEJvdW5kcyhib3VuZHMpOwotCQotCS8vIFVwZGF0ZSB0aGUgYm91bmRzIG9mIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBwYXJ0Ci0JdXBkYXRlUGFydEJvdW5kcygpOwotfQotCi1wcml2YXRlIHZvaWQgdXBkYXRlUGFydEJvdW5kcygpIHsKLQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCWN1cnJlbnQuc2V0Qm91bmRzKHByZXNlbnRhdGlvbkNvbnRyb2wuZ2V0Qm91bmRzKCkpOwotCX0KLX0KLQotcHVibGljIFBvaW50IGNvbXB1dGVNaW5pbXVtU2l6ZSgpIHsKLQlyZXR1cm4gbmV3IFBvaW50KDE2LDE2KTsKLX0KLQotcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIGlzVmlzaWJsZSkgewotCQotCS8vIE1ha2UgdGhlIHByZXNlbnRhdGlvbiB3aWRnZXQgdmlzaWJsZQotCXByZXNlbnRhdGlvbkNvbnRyb2wuc2V0VmlzaWJsZShpc1Zpc2libGUpOwotCQotCS8vIE1ha2UgdGhlIGN1cnJlbnRseSB2aXNpYmxlIHBhcnQgdmlzaWJsZQotCWlmIChjdXJyZW50ICE9IG51bGwpIHsKLQkJY3VycmVudC5zZXRWaXNpYmxlKGlzVmlzaWJsZSk7Ci0JfQotCi0JaWYgKGlzVmlzaWJsZSkgewotCQkvLyBSZXN0b3JlIHRoZSBib3VuZHMgb2YgdGhlIGN1cnJlbnRseSB2aXNpYmxlIHBhcnQuIAotCQkvLyBJUGFydFByZXNlbnRhdGlvbnMgY2FuIGJlIHVzZWQgYnkgbXVsdGlwbGUgU3RhY2tQcmVzZW50YXRpb25zLAotCQkvLyBhbHRob3VnaCBvbmx5IG9uZSBzdWNoIHByZXNlbnRhdGlvbiBpcyBldmVyIHZpc2libGUgYXQgYSB0aW1lLgotCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgb3RoZXIgcHJlc2VudGF0aW9uIGhhcyBjaGFuZ2VkIHRoZQotCQkvLyBib3VuZHMgb2YgdGhlIHBhcnQgc2luY2UgaXQgd2FzIGxhc3QgdmlzaWJsZSwgc28gd2UgbmVlZCB0bwotCQkvLyB1cGRhdGUgdGhlIHBhcnQncyBib3VuZHMgd2hlbiB0aGUgcHJlc2VudGF0aW9uIGJlY29tZXMgdmlzaWJsZS4KLQkJdXBkYXRlUGFydEJvdW5kcygpOwotCX0KLX0KLQotcHVibGljIHZvaWQgc2VsZWN0UGFydChJUHJlc2VudGFibGVQYXJ0IHRvU2VsZWN0KSB7Ci0JLy8gSWdub3JlIHJlZHVuZGFudCBzZWxlY3Rpb25zCi0JaWYgKHRvU2VsZWN0ID09IGN1cnJlbnQpIHsKLQkJcmV0dXJuOwotCX0KLQkKLQkvLyBJZiB0aGVyZSB3YXMgYW4gZXhpc3RpbmcgcGFydCBzZWxlY3RlZCwgbWFrZSBpdCBpbnZpc2libGUKLQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCWN1cnJlbnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCQotCS8vIFNlbGVjdCB0aGUgbmV3IHBhcnQKLQljdXJyZW50ID0gdG9TZWxlY3Q7Ci0JCi0JLy8gT3JkZXJpbmcgaXMgaW1wb3J0YW50IGhlcmUuIFdlIG5lZWQgdG8gbWFrZSB0aGUgcGFydAotCS8vIHZpc2libGUgYmVmb3JlIHVwZGF0aW5nIGl0cyBib3VuZHMsIG9yIHRoZSBjYWxsIHRvIHNldEJvdW5kcwotCS8vIG1heSBiZSBpZ25vcmVkLgotCQotCWlmIChjdXJyZW50ICE9IG51bGwpIHsKLQkJLy8gTWFrZSB0aGUgbmV3bHkgc2VsZWN0ZWQgcGFydCB2aXNpYmxlCi0JCWN1cnJlbnQuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0JCi0JLy8gVXBkYXRlIHRoZSBib3VuZHMgb2YgdGhlIG5ld2x5IHNlbGVjdGVkIHBhcnQKLQl1cGRhdGVQYXJ0Qm91bmRzKCk7Ci19Ci0KLXB1YmxpYyBDb250cm9sW10gZ2V0VGFiTGlzdChJUHJlc2VudGFibGVQYXJ0IHBhcnQpIHsKLQlyZXR1cm4gbmV3IENvbnRyb2xbXSB7cGFydC5nZXRDb250cm9sKCl9OwotfQotCi1wdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCXJldHVybiBwcmVzZW50YXRpb25Db250cm9sOwotfQotCi0vLyBNZXRob2RzIHRoYXQgZG9uJ3QgZG8gYW55dGhpbmcgeWV0Ci1wdWJsaWMgdm9pZCBzZXRBY3RpdmUoaW50IG5ld1N0YXRlKSB7fQotcHVibGljIHZvaWQgc2V0U3RhdGUoaW50IHN0YXRlKSB7fQotcHVibGljIHZvaWQgYWRkUGFydChJUHJlc2VudGFibGVQYXJ0IG5ld1BhcnQsIE9iamVjdCBjb29raWUpIHt9Ci1wdWJsaWMgdm9pZCByZW1vdmVQYXJ0KElQcmVzZW50YWJsZVBhcnQgb2xkUGFydCkge30KLXB1YmxpYyBTdGFja0Ryb3BSZXN1bHQgZHJhZ092ZXIoQ29udHJvbCBjdXJyZW50Q29udHJvbCwgUG9pbnQgbG9jYXRpb24pIHtyZXR1cm4gbnVsbDt9Ci1wdWJsaWMgdm9pZCBzaG93U3lzdGVtTWVudSgpIHt9Ci1wdWJsaWMgdm9pZCBzaG93UGFuZU1lbnUoKSB7fQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vYmFyZWJvbmVzL0JhcmVCb25lc1ByZXNlbnRhdGlvbkZhY3RvcnkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL2JhcmVib25lcy9CYXJlQm9uZXNQcmVzZW50YXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNDU1ZTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vYmFyZWJvbmVzL0JhcmVCb25lc1ByZXNlbnRhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLmJhcmVib25lczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLkFic3RyYWN0UHJlc2VudGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklTdGFja1ByZXNlbnRhdGlvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5TdGFja1ByZXNlbnRhdGlvbjsKLQotLyoqCi0gKiBQcmVzZW50YXRpb24gZmFjdG9yeSBmb3IgdGhlIGJhcmUtYm9uZXMgcHJlc2VudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXJlQm9uZXNQcmVzZW50YXRpb25GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBTdGFja1ByZXNlbnRhdGlvbiBjcmVhdGVFZGl0b3JQcmVzZW50YXRpb24oQ29tcG9zaXRlIHBhcmVudCwKLQkJCUlTdGFja1ByZXNlbnRhdGlvblNpdGUgc2l0ZSkgewotCQlyZXR1cm4gbmV3IEJhcmVCb25lc1BhcnRQcmVzZW50YXRpb24ocGFyZW50LCBzaXRlKTsKLQl9Ci0KLQlwdWJsaWMgU3RhY2tQcmVzZW50YXRpb24gY3JlYXRlVmlld1ByZXNlbnRhdGlvbihDb21wb3NpdGUgcGFyZW50LAotCQkJSVN0YWNrUHJlc2VudGF0aW9uU2l0ZSBzaXRlKSB7Ci0JCXJldHVybiBuZXcgQmFyZUJvbmVzUGFydFByZXNlbnRhdGlvbihwYXJlbnQsIHNpdGUpOwotCX0KLQkKLQlwdWJsaWMgU3RhY2tQcmVzZW50YXRpb24gY3JlYXRlU3RhbmRhbG9uZVZpZXdQcmVzZW50YXRpb24oQ29tcG9zaXRlIHBhcmVudCwKLQkJCUlTdGFja1ByZXNlbnRhdGlvblNpdGUgc2l0ZSwgYm9vbGVhbiBzaG93VGl0bGUpIHsKLQkJcmV0dXJuIG5ldyBCYXJlQm9uZXNQYXJ0UHJlc2VudGF0aW9uKHBhcmVudCwgc2l0ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vYmFyZXRpdHRsZS9CYXJlVGl0bGVQcmVzZW50YXRpb25GYWN0b3J5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi9iYXJldGl0dGxlL0JhcmVUaXRsZVByZXNlbnRhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyNmRmZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi9iYXJldGl0dGxlL0JhcmVUaXRsZVByZXNlbnRhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLmJhcmV0aXR0bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy4qOwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEJhcmVUaXRsZVByZXNlbnRhdGlvbkZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5BYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkjY3JlYXRlRWRpdG9yUHJlc2VudGF0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JU3RhY2tQcmVzZW50YXRpb25TaXRlKQotCSAqLwotCXB1YmxpYyBTdGFja1ByZXNlbnRhdGlvbiBjcmVhdGVFZGl0b3JQcmVzZW50YXRpb24oQ29tcG9zaXRlIHBhcmVudCwKLQkJCUlTdGFja1ByZXNlbnRhdGlvblNpdGUgc2l0ZSkgewotCQlyZXR1cm4gbmV3IFdvcmtiZW5jaFByZXNlbnRhdGlvbkZhY3RvcnkoKS5jcmVhdGVFZGl0b3JQcmVzZW50YXRpb24ocGFyZW50LCBzaXRlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLkFic3RyYWN0UHJlc2VudGF0aW9uRmFjdG9yeSNjcmVhdGVWaWV3UHJlc2VudGF0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JU3RhY2tQcmVzZW50YXRpb25TaXRlKQotCSAqLwotCXB1YmxpYyBTdGFja1ByZXNlbnRhdGlvbiBjcmVhdGVWaWV3UHJlc2VudGF0aW9uKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlJU3RhY2tQcmVzZW50YXRpb25TaXRlIHNpdGUpIHsKLQkJcmV0dXJuIG5ldyBCYXJlVGl0bGVTdGFja1ByZXNlbnRhdGlvbihwYXJlbnQsIHNpdGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5I2NyZWF0ZVN0YW5kYWxvbmVWaWV3UHJlc2VudGF0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JU3RhY2tQcmVzZW50YXRpb25TaXRlLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdGFja1ByZXNlbnRhdGlvbiBjcmVhdGVTdGFuZGFsb25lVmlld1ByZXNlbnRhdGlvbihDb21wb3NpdGUgcGFyZW50LAotCQkJSVN0YWNrUHJlc2VudGF0aW9uU2l0ZSBzaXRlLCBib29sZWFuIHNob3dUaXRsZSkgewotCQlyZXR1cm4gbmV3IEJhcmVUaXRsZVN0YWNrUHJlc2VudGF0aW9uKHBhcmVudCwgc2l0ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vYmFyZXRpdHRsZS9CYXJlVGl0bGVTdGFja1ByZXNlbnRhdGlvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vYmFyZXRpdHRsZS9CYXJlVGl0bGVTdGFja1ByZXNlbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMThhMGQ5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL2JhcmV0aXR0bGUvQmFyZVRpdGxlU3RhY2tQcmVzZW50YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi5iYXJldGl0dGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBCYXJlVGl0bGVTdGFja1ByZXNlbnRhdGlvbiBleHRlbmRzIFN0YWNrUHJlc2VudGF0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUX0RBVEEgPSAicGFydCI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJVExFX0hFSUdIVCA9IDIyOwotCQotCXByaXZhdGUgYm9vbGVhbiBhY3RpdmVGb2N1cyA9IGZhbHNlOwotCQotCS8qKgotCSAqIE1haW4gd2lkZ2V0IGZvciB0aGUgcHJlc2VudGF0aW9uCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgcHJlc2VudGF0aW9uQ29udHJvbDsKLQlwcml2YXRlIENvbXBvc2l0ZSB0aXRsZUFyZWE7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgY29udGVudEFyZWE7Ci0JCi0JLyoqCi0JICogQ3VycmVudGx5IHNlbGVjdGVkIHBhcnQKLQkgKi8KLQlwcml2YXRlIElQcmVzZW50YWJsZVBhcnQgY3VycmVudDsKLQkJCi0JLyoqCi0JICogY2xvc2UgYnV0dG9uCi0JICovCi0JcHJpdmF0ZSBUb29sSXRlbSBjbG9zZTsKLQkKLQkvKioKLQkgKiBWaWV3IG1lbnUgYnV0dG9uCi0JICovCi0JcHJpdmF0ZSBUb29sSXRlbSB2aWV3TWVudTsKLQkKLQkvKioKLQkgKiBNaW5pbWl6ZSBidXR0b24KLQkgKi8KLQlwcml2YXRlIFRvb2xJdGVtIG1pblZpZXc7Ci0JCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIG1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VBZGFwdGVyKCkgewkJCi0JCS8vIElmIHdlIHNpbmdsZS1jbGljayBvbiBhbiBlbXB0eSBzcGFjZSBvbiB0aGUgdG9vbGJhciwgbW92ZSBmb2N1cyB0byB0aGUKLQkJLy8gYWN0aXZlIGNvbnRyb2wKLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgewotCQkJCWN1cnJlbnQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJfQotCX07Ci0JCQotCS8qKiAKLQkgKiBEcmFnIGxpc3RlbmVyIGZvciByZWdpb25zIG91dHNpZGUgdGhlIHRvb2xiYXIKLQkgKi8KLQlMaXN0ZW5lciBkcmFnTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCBsb2MgPSBuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlDb250cm9sIGN0cmwgPSAoQ29udHJvbClldmVudC53aWRnZXQ7Ci0JCQkKLQkJCWdldFNpdGUoKS5kcmFnU3RhcnQoY3RybC50b0Rpc3BsYXkobG9jKSwgZmFsc2UpOwotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgQmFyZVRpdGxlU3RhY2tQcmVzZW50YXRpb24oQ29tcG9zaXRlIHBhcmVudCwgSVN0YWNrUHJlc2VudGF0aW9uU2l0ZSBzdGFja1NpdGUpIHsKLQkJc3VwZXIoc3RhY2tTaXRlKTsKLQkJCi0JCS8vIENyZWF0ZSBhIHRvcC1sZXZlbCBjb250cm9sIGZvciB0aGUgcHJlc2VudGF0aW9uLgotCQlwcmVzZW50YXRpb25Db250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGl0bGVBcmVhID0gbmV3IENvbXBvc2l0ZShwcmVzZW50YXRpb25Db250cm9sLCBTV1QuTk9ORSk7Ci0JCWNvbnRlbnRBcmVhID0gbmV3IENvbXBvc2l0ZShwcmVzZW50YXRpb25Db250cm9sLCBTV1QuTk9ORSk7Ci0JCXRpdGxlQXJlYS5hZGRNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotCQlQcmVzZW50YXRpb25VdGlsLmFkZERyYWdMaXN0ZW5lcih0aXRsZUFyZWEsIGRyYWdMaXN0ZW5lcik7Ci0JCQotCQkvLyBBZGQgYSBkaXNwb3NlIGxpc3RlbmVyLiBUaGlzIHdpbGwgY2FsbCB0aGUgcHJlc2VudGF0aW9uRGlzcG9zZWQoKQotCQkvLyBtZXRob2Qgd2hlbiB0aGUgd2lkZ2V0IGlzIGRlc3Ryb3llZC4KLQkJcHJlc2VudGF0aW9uQ29udHJvbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJcHJlc2VudGF0aW9uRGlzcG9zZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHJlc2VudGF0aW9uQ29udHJvbC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcHJlc2VudGF0aW9uQ29udHJvbC5nZXRDbGllbnRBcmVhKCk7CQkJCi0JCQkJZS5nYy5zZXRMaW5lV2lkdGgoMSk7CQkJCQotCQkJCWUuZ2Muc2V0Rm9yZWdyb3VuZChlLmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JBWSkpOwotCQkJCWUuZ2MuZHJhd1JlY3RhbmdsZShjbGllbnRBcmVhLngsIGNsaWVudEFyZWEueSwgY2xpZW50QXJlYS53aWR0aC0xLCBjbGllbnRBcmVhLmhlaWdodC0xKTsKLQkJCQlSZWN0YW5nbGUgY29udGVudEFyZWFCb3VuZHMgPSBjb250ZW50QXJlYS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgeXBvcyA9IGNvbnRlbnRBcmVhQm91bmRzLnkgLSAxOwkJCQkKLQkJCQllLmdjLmRyYXdMaW5lKGNsaWVudEFyZWEueCwgeXBvcywgY2xpZW50QXJlYS54ICsgY2xpZW50QXJlYS53aWR0aCAtIDEsIHlwb3MpOwotCQkJfQkJCQotCQl9KTsKLQkJCi0JCXRpdGxlQXJlYS5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSB0aXRsZVJlY3QgPSB0aXRsZUFyZWEuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCUdDIGdjID0gZS5nYzsKLQkJCQllLmdjLnNldEJhY2tncm91bmQoZS5kaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKSk7Ci0JCQkJaWYoYWN0aXZlRm9jdXMpCi0JCQkJCWUuZ2Muc2V0Rm9yZWdyb3VuZChlLmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQkJCQllbHNlIAotCQkJCQllLmdjLnNldEZvcmVncm91bmQoZS5kaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQkJCWUuZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKHRpdGxlUmVjdC54LCB0aXRsZVJlY3QueSwgdGl0bGVSZWN0LnggKyB0aXRsZVJlY3Qud2lkdGgsIHRpdGxlUmVjdC55ICsgdGl0bGVSZWN0LmhlaWdodCwgdHJ1ZSk7Ci0JCQkJCi0JCQkJaWYoY3VycmVudCAhPSBudWxsKSB7Ci0JCQkJaW50IHRleHRXaWR0aCA9IHRpdGxlUmVjdC53aWR0aCAtIDE7Ci0JCQkJaWYgKHRleHRXaWR0aCA+IDApIHsKLQkJCQkJRm9udCBnY0ZvbnQgPSBnYy5nZXRGb250KCk7Ci0JCQkJCWdjLnNldEZvbnQocHJlc2VudGF0aW9uQ29udHJvbC5nZXRGb250KCkpOwotCQkJCQlTdHJpbmcgdGV4dCA9IGN1cnJlbnQuZ2V0VGl0bGUoKTsKLQkJCQkJCi0JCQkJCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQodGV4dCwgU1dULkRSQVdfVFJBTlNQQVJFTlQgfCBTV1QuRFJBV19NTkVNT05JQyk7CQotCQkJCQlpbnQgdGV4dFkgPSB0aXRsZVJlY3QueSArICh0aXRsZVJlY3QuaGVpZ2h0IC0gZXh0ZW50LnkpIC8gMjsKLQkJCQkJCi0JCQkJCWlmKGFjdGl2ZUZvY3VzKQkJCQkJCi0JCQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGUuZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCQkJZWxzZSAKLQkJCQkJCWdjLnNldEZvcmVncm91bmQoZS5kaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQkJCQlnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEJhbm5lckZvbnQoKSk7Ci0JCQkJCWdjLmRyYXdUZXh0KHRleHQsIHRpdGxlUmVjdC54ICsgMywgdGV4dFksIFNXVC5EUkFXX1RSQU5TUEFSRU5UIHwgU1dULkRSQVdfTU5FTU9OSUMpOwkJCQkJCi0JCQkJfQkJCQkKLQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWxheW91dCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXNlbnRhdGlvbkRpc3Bvc2VkKCkgewotCSAgICAvLyBSZW1vdmUgYW55IGxpc3RlbmVycyB0aGF0IHdlcmUgYXR0YWNoZWQgdG8gYW55Ci0JCS8vIGdsb2JhbCBFY2xpcHNlIHJlc291cmNlcy4gVGhpcyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gcHJldmVudAotCQkvLyBtZW1vcnkgbGVha3MuCi0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0Qm9yZGVyV2lkdGgoKSB7Ci0JCXJldHVybiAxOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBsYXlvdXQoKSB7Ci0JCS8vIERldGVybWluZSB0aGUgaW5uZXIgYm91bmRzIG9mIHRoZSBwcmVzZW50YXRpb24KLQkJUmVjdGFuZ2xlIHByZXNlbnRhdGlvbkNsaWVudEFyZWEgPSBwcmVzZW50YXRpb25Db250cm9sLmdldENsaWVudEFyZWEoKTsKLQkJcHJlc2VudGF0aW9uQ2xpZW50QXJlYS54ICs9IGdldEJvcmRlcldpZHRoKCk7Ci0JCXByZXNlbnRhdGlvbkNsaWVudEFyZWEud2lkdGggLT0gZ2V0Qm9yZGVyV2lkdGgoKSAqIDI7Ci0JCXByZXNlbnRhdGlvbkNsaWVudEFyZWEueSArPSBnZXRCb3JkZXJXaWR0aCgpOwotCQlwcmVzZW50YXRpb25DbGllbnRBcmVhLmhlaWdodCAtPSBnZXRCb3JkZXJXaWR0aCgpICogMjsKLQkJdGl0bGVBcmVhLnNldEJvdW5kcyhwcmVzZW50YXRpb25DbGllbnRBcmVhLngsIHByZXNlbnRhdGlvbkNsaWVudEFyZWEueSwgcHJlc2VudGF0aW9uQ2xpZW50QXJlYS53aWR0aCwgcHJlc2VudGF0aW9uQ2xpZW50QXJlYS55ICsgVElUTEVfSEVJR0hUKTsKLQkJaW50IHl5ID0gVElUTEVfSEVJR0hUICArIDI7Ci0JCWNvbnRlbnRBcmVhLnNldEJvdW5kcyhwcmVzZW50YXRpb25DbGllbnRBcmVhLngsIHByZXNlbnRhdGlvbkNsaWVudEFyZWEueSArIHl5LCBwcmVzZW50YXRpb25DbGllbnRBcmVhLndpZHRoLCBwcmVzZW50YXRpb25DbGllbnRBcmVhLmhlaWdodCAtIHl5KTsKLQkJCi0JCXRpdGxlQXJlYS5zZXRCYWNrZ3JvdW5kKHRpdGxlQXJlYS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JFRU4pKTsKLQkJY29udGVudEFyZWEuc2V0QmFja2dyb3VuZCh0aXRsZUFyZWEuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX1JFRCkpOwotCQkKLQkJLy8gUG9zaXRpb24gdGhlIHZpZXcncyB3aWRnZXRzCi0JCWlmIChjdXJyZW50ICE9IG51bGwpIHsKLQkJCVJlY3RhbmdsZSBjbGllbnRSZWN0YW5nbGUgPSBjb250ZW50QXJlYS5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IGNsaWVudEFyZWFTdGFydCA9IHByZXNlbnRhdGlvbkNvbnRyb2wuZ2V0UGFyZW50KCkudG9Db250cm9sKAotCQkJCQlwcmVzZW50YXRpb25Db250cm9sLnRvRGlzcGxheShjbGllbnRSZWN0YW5nbGUueCwgY2xpZW50UmVjdGFuZ2xlLnkpKTsKLQkJCS8vIGN1cnJlbnQgaXNuJ3QgcGFyZW50ZWQgYnkgdGhpcyB3aWRnZXQgaGllcmFyY2h5LCB0aGUgY29vcmRpbmF0ZXMgbXVzdCBiZQotCQkJLy8gcmVsYXRpdmUgdG8gdGhlIHdvcmtiZW5jaCB3aW5kb3cuIFRoZSB3b3JrYmVuY2ggd2luZG93IHBhcmVudHMgZXZlcnkKLQkJCS8vIHBhcnQuCi0JCQljdXJyZW50LnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKGNsaWVudEFyZWFTdGFydC54LCAKLQkJCQkJY2xpZW50QXJlYVN0YXJ0LnksCi0JCQkJCWNsaWVudFJlY3RhbmdsZS53aWR0aCwgCi0JCQkJCWNsaWVudFJlY3RhbmdsZS5oZWlnaHQpKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Qm91bmRzKFJlY3RhbmdsZSBib3VuZHMpIHsKLQkJcHJlc2VudGF0aW9uQ29udHJvbC5zZXRCb3VuZHMoYm91bmRzKTsKLQkJbGF5b3V0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmUoaW50IG5ld1N0YXRlKSB7Ci0JCWFjdGl2ZUZvY3VzID0gKG5ld1N0YXRlID09IEFTX0FDVElWRV9GT0NVUyk7Ci0JCXRpdGxlQXJlYS5yZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhdGUoaW50IHN0YXRlKSB7Ci0JfQotCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHByZXNlbnRhdGlvbkNvbnRyb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFydChJUHJlc2VudGFibGVQYXJ0IG5ld1BhcnQsIE9iamVjdCBjb29raWUpIHsKLQkJbmV3UGFydC5zZXRCb3VuZHMoY29udGVudEFyZWEuZ2V0Qm91bmRzKCkpOwotCQl0aGlzLmN1cnJlbnQgPSBuZXdQYXJ0OwotCQlsYXlvdXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQYXJ0KElQcmVzZW50YWJsZVBhcnQgb2xkUGFydCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdFBhcnQoSVByZXNlbnRhYmxlUGFydCB0b1NlbGVjdCkgewotCX0KLQotCXB1YmxpYyBTdGFja0Ryb3BSZXN1bHQgZHJhZ092ZXIoQ29udHJvbCBjdXJyZW50Q29udHJvbCwgUG9pbnQgbG9jYXRpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2hvd1N5c3RlbU1lbnUoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2hvd1BhbmVNZW51KCkgewotCX0KLQotCXB1YmxpYyBDb250cm9sW10gZ2V0VGFiTGlzdChJUHJlc2VudGFibGVQYXJ0IHBhcnQpIHsKLQkJaWYoY3VycmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IENvbnRyb2xbXSB7Y3VycmVudC5nZXRDb250cm9sKCl9OwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBDb250cm9sWzBdOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vc2lkZXdpbmRlci9DbG9zZVBhcnRDb250cmlidXRpb25JdGVtLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi9zaWRld2luZGVyL0Nsb3NlUGFydENvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE5NmIzNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi9zaWRld2luZGVyL0Nsb3NlUGFydENvbnRyaWJ1dGlvbkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLnNpZGV3aW5kZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JUHJlc2VudGFibGVQYXJ0OwotCi1wdWJsaWMgY2xhc3MgQ2xvc2VQYXJ0Q29udHJpYnV0aW9uSXRlbSBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0gewotCXByaXZhdGUgU2lkZVdpbmRlckl0ZW1WaWV3UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbjsgCi0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25BZGFwdGVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXByZXNlbnRhdGlvbi5jbG9zZShuZXcgSVByZXNlbnRhYmxlUGFydFtdIHtwcmVzZW50YXRpb24uZ2V0Q3VycmVudCgpfSk7Ci0JCX0KLQl9OwotCQotCXB1YmxpYyBDbG9zZVBhcnRDb250cmlidXRpb25JdGVtKFNpZGVXaW5kZXJJdGVtVmlld1ByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQkJdGhpcy5wcmVzZW50YXRpb24gPSBwcmVzZW50YXRpb247Ci0JfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAJc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICBwcmVzZW50YXRpb24gPSBudWxsOwotICAgICAgICBzZWxlY3Rpb25MaXN0ZW5lciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGZpbGwoTWVudSBtZW51LCBpbnQgaW5kZXgpIHsKLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSwgaW5kZXgpOwotCQlpdGVtLnNldFRleHQoIkNsb3NlIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkKLQkJSVByZXNlbnRhYmxlUGFydCBjdXJyZW50ID0gcHJlc2VudGF0aW9uLmdldEN1cnJlbnQoKTsKLQkJaXRlbS5zZXRFbmFibGVkKGN1cnJlbnQgIT0gbnVsbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRHluYW1pYygpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vc2lkZXdpbmRlci9QYXJ0SXRlbS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vc2lkZXdpbmRlci9QYXJ0SXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNjZWQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3NpZGV3aW5kZXIvUGFydEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLnNpZGV3aW5kZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklQcmVzZW50YWJsZVBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBQYXJ0SXRlbSBleHRlbmRzIENhbnZhcyBpbXBsZW1lbnRzIFBhaW50TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQlwcml2YXRlIEltYWdlIGltYWdlOwotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RlZDsKLQlwcml2YXRlIGJvb2xlYW4gZm9jdXMgPSBmYWxzZTsKLQlwcml2YXRlIElQcmVzZW50YWJsZVBhcnQgcGFydDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkVSVF9TUEFDSU5HID0gNTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpfU1BBQ0lORyA9IDM7Ci0JCi0JaW50W10gU0lNUExFX1RPUF9MRUZUX0NPUk5FUiA9IG5ldyBpbnRbXSB7MCw0LCA0LDB9OwotCWludFtdIFNJTVBMRV9UT1BfUklHSFRfQ09STkVSID0gbmV3IGludFtdIHswLDAsIDAsMH07Ci0JCi0JLy9zdGF0aWMgZmluYWwgaW50W10gU0lNUExFX1RPUF9MRUZUX0NPUk5FUiA9IG5ldyBpbnRbXSB7MCwyLCAxLDEsIDIsMH07Ci0JLy9zdGF0aWMgZmluYWwgaW50W10gU0lNUExFX1RPUF9SSUdIVF9DT1JORVIgPSBuZXcgaW50W10gey0yLDAsIC0xLDEsIDAsMn07Ci0JCi0Jc3RhdGljIGZpbmFsIGludFtdIFNJTVBMRV9CT1RUT01fTEVGVF9DT1JORVIgPSBuZXcgaW50W10gezAsLTIsIDEsLTEsIDIsMH07Ci0Jc3RhdGljIGZpbmFsIGludFtdIFNJTVBMRV9CT1RUT01fUklHSFRfQ09STkVSID0gbmV3IGludFtdIHstMiwwLCAtMSwtMSwgMCwtMn07Ci0JcHJpdmF0ZSBib29sZWFuIHNob3dJbWFnZTsKLQlwcml2YXRlIGJvb2xlYW4gc2hvd1RleHQ7Ci0JCi0JcHVibGljIFBhcnRJdGVtKENvbXBvc2l0ZSBwYXJlbnQsIElQcmVzZW50YWJsZVBhcnQgcGFydCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy5wYXJ0ID0gcGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCVJlY3RhbmdsZSB0aXRsZVJlY3QgPSBnZXRDbGllbnRBcmVhKCk7Ci0JCWludCB4ID0gdGl0bGVSZWN0LnggKyBWRVJUX1NQQUNJTkc7Ci0JCWludCB5ID0gdGl0bGVSZWN0LnkgKyBIT1JJWl9TUEFDSU5HOwotCQlHQyBnYyA9IGUuZ2M7Ci0JCXNldEJhY2tncm91bmQoZ2V0UGFyZW50KCkuZ2V0QmFja2dyb3VuZCgpKTsKLQkJZmlsbChnYywgdGl0bGVSZWN0LngsIHRpdGxlUmVjdC55LCB0aXRsZVJlY3Qud2lkdGggLSAxLCB0aXRsZVJlY3QuaGVpZ2h0KTsKLQkJCi0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2UoKTsKLQkJaWYgKGltYWdlICE9IG51bGwgJiYgc2hvd0ltYWdlKSB7Ci0JCQlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgaW1hZ2VYID0geDsKLQkJCQlpbnQgaW1hZ2VIZWlnaHQgPSBpbWFnZUJvdW5kcy5oZWlnaHQ7Ci0JCQkJaW50IGltYWdlWSA9ICh0aXRsZVJlY3QuaGVpZ2h0IC0gaW1hZ2VIZWlnaHQpIC8gMjsKLQkJCQlpbnQgaW1hZ2VXaWR0aCA9IGltYWdlQm91bmRzLndpZHRoICogaW1hZ2VIZWlnaHQgLyBpbWFnZUJvdW5kcy5oZWlnaHQ7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAKLQkJCQkJICAgICAgICAgaW1hZ2VCb3VuZHMueCwgaW1hZ2VCb3VuZHMueSwgaW1hZ2VCb3VuZHMud2lkdGgsIGltYWdlQm91bmRzLmhlaWdodCwKLQkJCQkJICAgICAgICAgaW1hZ2VYLCBpbWFnZVksIGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0KTsKLQkJCQl4ICs9IGltYWdlV2lkdGggKyBWRVJUX1NQQUNJTkc7CQkKLQkJfQotCQkKLQkJaW50IHRleHRXaWR0aCA9IHRpdGxlUmVjdC53aWR0aCAtIDE7Ci0JCWlmICh0ZXh0V2lkdGggPiAwICYmIHRleHQgIT0gbnVsbCAmJiBzaG93VGV4dCkgewotCQkJRm9udCBnY0ZvbnQgPSBnYy5nZXRGb250KCk7Ci0JCQlnYy5zZXRGb250KGdldEZvbnQoKSk7Ci0JCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KHRleHQsIFNXVC5EUkFXX1RSQU5TUEFSRU5UIHwgU1dULkRSQVdfTU5FTU9OSUMpOwkKLQkJCWludCB0ZXh0WSA9IHRpdGxlUmVjdC55ICsgKHRpdGxlUmVjdC5oZWlnaHQgLSBleHRlbnQueSkgLyAyOwotCQkJCi0JCQlpZihzZWxlY3RlZCkJCQkJCQotCQkJCWdjLnNldEZvcmVncm91bmQoZS5kaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQkJZWxzZSAKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGUuZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQkJCWdjLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGVmYXVsdEZvbnQoKSk7Ci0JCQlnYy5kcmF3VGV4dCh0ZXh0LCB4LCB0ZXh0WSwgU1dULkRSQVdfVFJBTlNQQVJFTlQgfCBTV1QuRFJBV19NTkVNT05JQyk7CQotCQl9Ci0JCQotCX0JCi0JCi0JcHVibGljIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCWludCB3aWR0aCA9IFZFUlRfU1BBQ0lORzsgaW50IGhlaWdodCA9IEhPUklaX1NQQUNJTkc7Ci0JCUdDIGdjID0gbmV3IEdDKHRoaXMpOwotCQlpZihpbWFnZSAhPSBudWxsICYmIHNob3dJbWFnZSkgewotCQkJUmVjdGFuZ2xlIGltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7CQkJCi0JCQloZWlnaHQgPSBpbWFnZUJvdW5kcy5oZWlnaHQgKyBIT1JJWl9TUEFDSU5HOwotCQkJd2lkdGggKz0gaW1hZ2VCb3VuZHMud2lkdGggKyBWRVJUX1NQQUNJTkc7Ci0JCX0KLQkJCi0JCWlmKHRleHQgIT0gbnVsbCAmJiBzaG93VGV4dCkgewotCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCh0ZXh0LCBTV1QuRFJBV19UUkFOU1BBUkVOVCB8IFNXVC5EUkFXX01ORU1PTklDKTsKLQkJCXdpZHRoICs9IGV4dGVudC54ICsgVkVSVF9TUEFDSU5HOwotCQkJaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBleHRlbnQueSkgKyBIT1JJWl9TUEFDSU5HOwotCQl9Ci0JCQotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHdpZHRoID0gd0hpbnQ7Ci0JCWlmIChoSGludCAhPSBTV1QuREVGQVVMVCkgaGVpZ2h0ID0gaEhpbnQ7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGwoR0MgZ2MsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWludFtdIGxlZnQgPSBTSU1QTEVfVE9QX0xFRlRfQ09STkVSOwotCQlpbnRbXSByaWdodCA9IFNJTVBMRV9UT1BfUklHSFRfQ09STkVSOwotCQlpbnRbXSBzaGFwZSA9IG5ldyBpbnRbbGVmdC5sZW5ndGggKyByaWdodC5sZW5ndGggKyA0XTsKLQkJaW50IGluZGV4ID0gMDsKLQkJc2hhcGVbaW5kZXgrK10gPSB4OwotCQlzaGFwZVtpbmRleCsrXSA9IHkgKyBoZWlnaHQgKyAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlZnQubGVuZ3RoIC8gMjsgaSsrKSB7Ci0JCQlzaGFwZVtpbmRleCsrXSA9IHggKyBsZWZ0WzIgKiBpXTsKLQkJCXNoYXBlW2luZGV4KytdID0geSArIGxlZnRbMiAqIGkgKyAxXTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJpZ2h0Lmxlbmd0aCAvIDI7IGkrKykgewotCQkJc2hhcGVbaW5kZXgrK10gPSB4ICsgd2lkdGggKyByaWdodFsyICogaV07Ci0JCQlzaGFwZVtpbmRleCsrXSA9IHkgKyByaWdodFsyICogaSArIDFdOwotCQl9Ci0JCXNoYXBlW2luZGV4KytdID0geCArIHdpZHRoOwotCQlzaGFwZVtpbmRleCsrXSA9IHkgKyBoZWlnaHQgKyAxOwotCQkKLQkJLy8gRmlsbCBpbiBiYWNrZ3JvdW5kCi0JCVJlZ2lvbiBjbGlwcGluZyA9IG5ldyBSZWdpb24oKTsKLQkJZ2MuZ2V0Q2xpcHBpbmcoY2xpcHBpbmcpOwotCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQlyZWdpb24uYWRkKHNoYXBlKTsKLQkJcmVnaW9uLmludGVyc2VjdChjbGlwcGluZyk7Ci0JCWdjLnNldENsaXBwaW5nKHJlZ2lvbik7Ci0JCQotCQlnYy5zZXRCYWNrZ3JvdW5kKGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSkpOwotCQkKLQkJQ29sb3IgZmcgPSBudWxsOwotCQlpZihwYXJ0LmlzRGlydHkoKSkKLQkJCWZnID0gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0dSQVkpOwotCQllbHNlIGlmKCFzZWxlY3RlZCkKLQkJCWZnID0gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JCS8vZWxzZSBpZihmb2N1cykKLQkJCS8vZmcgPSBnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQllbHNlIAotCQkJZmcgPSBnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQkKLQkJZ2Muc2V0Rm9yZWdyb3VuZChmZyk7Ci0JCQotCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB0cnVlKTsKLQkJLy9nYy5maWxsUmVjdGFuZ2xlKHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCk7Ci0JCQotCQkKLQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJY2xpcHBpbmcuZGlzcG9zZSgpOwotCQkKLQkJZ2Muc2V0Q2xpcHBpbmcoKFJlY3RhbmdsZSludWxsKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JBWSkpOwotCQlnYy5kcmF3UG9seWxpbmUoc2hhcGUpOwotCQkKLQkJCi0JCS8vIEZpbGwgaW4gcGFyZW50IGJhY2tncm91bmQgZm9yIG5vbi1yZWN0YW5ndWxhciBzaGFwZQotCQlSZWdpb24gciA9IG5ldyBSZWdpb24oKTsKLQkJci5hZGQobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCArIDEsIGhlaWdodCArIDEpKTsKLQkJci5zdWJ0cmFjdChzaGFwZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZ2V0UGFyZW50KCkuZ2V0QmFja2dyb3VuZCgpKTsKLQkJLy9maWxsUmVnaW9uKGdjLCByKTsKLQkJci5kaXNwb3NlKCk7Ci0JfQotCQotCXN0YXRpYyB2b2lkIGZpbGxSZWdpb24oR0MgZ2MsIFJlZ2lvbiByZWdpb24pIHsKLQkJLy8gTk9URTogcmVnaW9uIHBhc3NlZCBpbiB0byB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgbW9kaWZpZWQKLQkJUmVnaW9uIGNsaXBwaW5nID0gbmV3IFJlZ2lvbigpOwotCQlnYy5nZXRDbGlwcGluZyhjbGlwcGluZyk7Ci0JCXJlZ2lvbi5pbnRlcnNlY3QoY2xpcHBpbmcpOwotCQlnYy5zZXRDbGlwcGluZyhyZWdpb24pOwotCQlnYy5maWxsUmVjdGFuZ2xlKHJlZ2lvbi5nZXRCb3VuZHMoKSk7Ci0JCWdjLnNldENsaXBwaW5nKGNsaXBwaW5nKTsKLQkJY2xpcHBpbmcuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQlyZXR1cm4gY29tcHV0ZVNpemUod0hpbnQsIGhIaW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLnRleHQgPSB0ZXh0OwotCQlyZWRyYXcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGhpcy50ZXh0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIHRoaXMuaW1hZ2U7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKSB7Ci0JCXRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDsKLQkJcmVkcmF3KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldFNlbGVjdGVkKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGb2N1cygpIHsKLQkJcmV0dXJuIGZvY3VzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGb2N1cyhib29sZWFuIGZvY3VzKSB7Ci0JCXRoaXMuZm9jdXMgPSBmb2N1czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaG93SW1hZ2UoYm9vbGVhbiBzaG93SW1hZ2UpIHsKLQkJdGhpcy5zaG93SW1hZ2UgPSBzaG93SW1hZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hvd1RleHQoYm9vbGVhbiBzaG93VGV4dCkgewotCQl0aGlzLnNob3dUZXh0ID0gc2hvd1RleHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vc2lkZXdpbmRlci9TaWRlV2luZGVySXRlbVZpZXdQcmVzZW50YXRpb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3NpZGV3aW5kZXIvU2lkZVdpbmRlckl0ZW1WaWV3UHJlc2VudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YTAyZDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vc2lkZXdpbmRlci9TaWRlV2luZGVySXRlbVZpZXdQcmVzZW50YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi5zaWRld2luZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi53cmFwcGVkdGFicy5Qcm94eUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JUGFydE1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JUHJlc2VudGFibGVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVN0YWNrUHJlc2VudGF0aW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLlByZXNlbnRhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5TdGFja0Ryb3BSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5TdGFja1ByZXNlbnRhdGlvbjsKLQotcHVibGljIGNsYXNzIFNpZGVXaW5kZXJJdGVtVmlld1ByZXNlbnRhdGlvbiBleHRlbmRzIFN0YWNrUHJlc2VudGF0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUX0RBVEEgPSAicGFydCI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJVExFX0hFSUdIVCA9IDIyOwotCQotCXByaXZhdGUgYm9vbGVhbiBhY3RpdmVGb2N1cyA9IGZhbHNlOwotCQotCS8qKgotCSAqIE1haW4gd2lkZ2V0IGZvciB0aGUgcHJlc2VudGF0aW9uCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgcHJlc2VudGF0aW9uQ29udHJvbDsKLQlwcml2YXRlIENvbXBvc2l0ZSB0aXRsZUFyZWE7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgY2xpZW50QXJlYTsKLQlwcml2YXRlIENvbXBvc2l0ZSBzdGF0dXNMaW5lQXJlYTsKLQlwcml2YXRlIFZpZXdGb3JtIGNvbnRlbnRBcmVhOwotCXByaXZhdGUgUHJveHlDb250cm9sIHRvb2xiYXJQcm94eTsKLQkKLQkvKioKLQkgKiBDdXJyZW50bHkgc2VsZWN0ZWQgcGFydAotCSAqLwotCXByaXZhdGUgSVByZXNlbnRhYmxlUGFydCBjdXJyZW50OwotCQkKLQkvKioKLQkgKiBjbG9zZSBidXR0b24KLQkgKi8KLQlwcml2YXRlIFRvb2xJdGVtIGNsb3NlOwotCQotCS8qKgotCSAqIFZpZXcgbWVudSBidXR0b24KLQkgKi8KLQlwcml2YXRlIFRvb2xJdGVtIHZpZXdNZW51OwotCQotCS8qKgotCSAqIE1pbmltaXplIGJ1dHRvbgotCSAqLwotCXByaXZhdGUgVG9vbEl0ZW0gbWluVmlldzsKLQkKLQkKLQlwcml2YXRlIGludCBzdHlsZSA9IFNXVC5WRVJUSUNBTCB8IFNXVC5MRUZUOwotCQotCXByaXZhdGUgYm9vbGVhbiB0aXRsZUFyZWFIaWRlbiA9IGZhbHNlOwotCQotCS8qKgotCSAqIFRoaXMgbGlzdGVuZXIgcmVzcG9uZHMgdG8gc2VsZWN0aW9uIGV2ZW50cyBpbiBhbGwgdG9vbCBpdGVtcy4KLQkgKi8KLQlwcml2YXRlIE1vdXNlTGlzdGVuZXIgbW91c2VMaXN0ZW5lciA9IG5ldyBNb3VzZUFkYXB0ZXIoKSB7CQkKLQkJLy8gSWYgd2Ugc2luZ2xlLWNsaWNrIG9uIGFuIGVtcHR5IHNwYWNlIG9uIHRoZSB0b29sYmFyLCBtb3ZlIGZvY3VzIHRvIHRoZQotCQkvLyBhY3RpdmUgY29udHJvbAotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlQYXJ0SXRlbSB0b29sSXRlbSA9IChQYXJ0SXRlbSkgZS53aWRnZXQ7Ci0JCQlJUHJlc2VudGFibGVQYXJ0IGl0ZW0gPSBnZXRQYXJ0Rm9yVGFiKHRvb2xJdGVtKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkvLyBDbGlja2luZyBvbiB0aGUgYWN0aXZlIHRhYiBzaG91bGQgZ2l2ZSBmb2N1cyB0byB0aGUgY3VycmVudAotCQkJCS8vIHBhcnQKLQkJCQlpZiAoaXRlbSA9PSBjdXJyZW50KSB7Ci0JCQkJCWl0ZW0uc2V0Rm9jdXMoKTsKLQkJCQl9Ci0JCQkJZ2V0U2l0ZSgpLnNlbGVjdFBhcnQoaXRlbSk7Ci0JCQkJc2VsZWN0UGFydChpdGVtKTsKLQkJCQlQb2ludCB0b0Rpc3BsYXkgPSB0b29sSXRlbS50b0Rpc3BsYXkobmV3IFBvaW50KGUueCwgZS55KSk7Ci0JCQkJaWYgKGUuYnV0dG9uID09IDMpIHsKLQkJCQkJc2hvd1N5c3RlbU1lbnUodG9EaXNwbGF5KTsKLQkJCQl9IGVsc2UgewotCQkJCQlJbWFnZSBpbWFnZSA9IHRvb2xJdGVtLmdldEltYWdlKCk7Ci0JCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoaW1hZ2UuZ2V0Qm91bmRzKCkuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJCQkJc2hvd1BhbmVNZW51KHRvRGlzcGxheSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIExpc3RlbmVyIGF0dGFjaGVkIHRvIGFsbCBjaGlsZCBwYXJ0cy4gSXQgcmVzcG9uZHMgdG8gY2hhbmdlcyBpbiBwYXJ0IHByb3BlcnRpZXMKLQkgKi8KLQlwcml2YXRlIElQcm9wZXJ0eUxpc3RlbmVyIGNoaWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wZXJ0eSkgewkJCQotCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIElQcmVzZW50YWJsZVBhcnQpIHsKLQkJCQlJUHJlc2VudGFibGVQYXJ0IHBhcnQgPSAoSVByZXNlbnRhYmxlUGFydCkgc291cmNlOwkJCQkKLQkJCQl1cGRhdGVQYXJ0SXRlbShnZXRQYXJ0SXRlbShwYXJ0KSwgcGFydCk7Ci0JCQl9Ci0JCX0JCi0JfTsKLQkKLQkvKioKLQkgKiBMaXN0ZW5lciBhdHRhY2hlZCB0byBhbGwgdG9vbCBpdGVtcy4gSXQgcmVtb3ZlcyBsaXN0ZW5lcnMgZnJvbSB0aGUgYXNzb2NpYXRlZAotCSAqIHBhcnQgd2hlbiB0aGUgdG9vbCBpdGVtIGlzIGRlc3Ryb3llZC4gVGhpcyBpcyByZXF1aXJlZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4KLQkgKi8KLQlwcml2YXRlIERpc3Bvc2VMaXN0ZW5lciB0YWJEaXNwb3NlTGlzdGVuZXIgPSBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgVG9vbEl0ZW0pIHsKLQkJCQlQYXJ0SXRlbSBpdGVtID0gKFBhcnRJdGVtKWUud2lkZ2V0OwotCQkJCQotCQkJCUlQcmVzZW50YWJsZVBhcnQgcGFydCA9IGdldFBhcnRGb3JUYWIoaXRlbSk7Ci0JCQkJCi0JCQkJcGFydC5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKGNoaWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9OwotCQkKLQkvKiogCi0JICogRHJhZyBsaXN0ZW5lciBmb3IgcmVnaW9ucyBvdXRzaWRlIHRoZSB0b29sYmFyCi0JICovCi0JTGlzdGVuZXIgZHJhZ0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgbG9jID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotCQkJQ29udHJvbCBjdHJsID0gKENvbnRyb2wpZXZlbnQud2lkZ2V0OwotCQkJCi0JCQlnZXRTaXRlKCkuZHJhZ1N0YXJ0KGN0cmwudG9EaXNwbGF5KGxvYyksIGZhbHNlKTsKLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBMaXN0ZW5lciBtZW51TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCBnbG9iYWxQb3MgPSBuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJCXNob3dTeXN0ZW1NZW51KGdsb2JhbFBvcyk7Ci0JCQkJCXJldHVybjsKLQkJfQotCX07Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1RleHQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd0ltYWdlOwotCQotCXByaXZhdGUgTWVudU1hbmFnZXIgc3lzdGVtTWVudU1hbmFnZXI9IG5ldyBNZW51TWFuYWdlcigpOwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBoaWRlVGl0bGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKCF0aXRsZUFyZWFIaWRlbikgewotCQkJCXRpdGxlQXJlYUhpZGVuID0gdHJ1ZTsKLQkJCQlsYXlvdXQoKTsKLQkJCX0KLQkJfQotCX07Ci0JcHJpdmF0ZSBMaXN0ZW5lciBzaG93VGl0bGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKHRpdGxlQXJlYUhpZGVuKSB7Ci0JCQkJdGl0bGVBcmVhSGlkZW4gPSBmYWxzZTsKLQkJCQlsYXlvdXQoKTsKLQkJCX0KLQkJfQotCX07Ci0JCi0JcHVibGljIFNpZGVXaW5kZXJJdGVtVmlld1ByZXNlbnRhdGlvbihDb21wb3NpdGUgcGFyZW50LCBJU3RhY2tQcmVzZW50YXRpb25TaXRlIHN0YWNrU2l0ZSwgYm9vbGVhbiBzaG93VGV4dCwgYm9vbGVhbiBzaG93SW1hZ2UsIGludCBzdHlsZSkgewotCQlzdXBlcihzdGFja1NpdGUpOwotCQl0aGlzLnNob3dUZXh0ID0gc2hvd1RleHQ7Ci0JCXRoaXMuc2hvd0ltYWdlID0gc2hvd0ltYWdlOwotCQl0aGlzLnN0eWxlID0gc3R5bGU7Ci0JCQotCQkvLyBDcmVhdGUgYSB0b3AtbGV2ZWwgY29udHJvbCBmb3IgdGhlIHByZXNlbnRhdGlvbi4KLQkJcHJlc2VudGF0aW9uQ29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRpdGxlQXJlYSA9IG5ldyBDb21wb3NpdGUocHJlc2VudGF0aW9uQ29udHJvbCwgU1dULk5PTkUpOwotCQkKLQkJLy9zdGF0dXNMaW5lQXJlYSA9IG5ldyBDb21wb3NpdGUodGl0bGVBcmVhLCBTV1QuTk9ORSk7Ci0JCS8vSGVhcFN0YXR1c0NvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IG5ldyBIZWFwU3RhdHVzQ29udHJpYnV0aW9uSXRlbShQbGF0Zm9ybVVJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJLy9pdGVtLmZpbGwoc3RhdHVzTGluZUFyZWEpOwotCQkKLQkJY29udGVudEFyZWEgPSBuZXcgVmlld0Zvcm0ocHJlc2VudGF0aW9uQ29udHJvbCwgU1dULk5PTkUpOwotCQljbGllbnRBcmVhID0gbmV3IENvbXBvc2l0ZShjb250ZW50QXJlYSwgU1dULk5PTkUpOwotCQljbGllbnRBcmVhLnNldFZpc2libGUoZmFsc2UpOwotCQkKLQkJY29udGVudEFyZWEuc2V0Q29udGVudChjbGllbnRBcmVhKTsKLQkJdG9vbGJhclByb3h5ID0gbmV3IFByb3h5Q29udHJvbChjb250ZW50QXJlYSk7Ci0KLQkJUHJlc2VudGF0aW9uVXRpbC5hZGREcmFnTGlzdGVuZXIodGl0bGVBcmVhLCBkcmFnTGlzdGVuZXIpOwotCQl0aXRsZUFyZWEuYWRkTGlzdGVuZXIoU1dULk1lbnVEZXRlY3QsIG1lbnVMaXN0ZW5lcik7Ci0JCS8vdGl0bGVBcmVhLmFkZExpc3RlbmVyKFNXVC5Nb3VzZUVudGVyLCBzaG93VGl0bGVMaXN0ZW5lcik7Ci0JCS8vdGl0bGVBcmVhLmFkZExpc3RlbmVyKFNXVC5Nb3VzZUV4aXQsIGhpZGVUaXRsZUxpc3RlbmVyKTsKLQkJCi0JCVJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0ICgpOwotCQlyb3dMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCXJvd0xheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCXJvd0xheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlyb3dMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJcm93TGF5b3V0LnR5cGUgPSBzdHlsZTsKLQkJLy9yb3dMYXlvdXQuanVzdGlmeSA9IHRydWU7Ci0JCWlmKChzdHlsZSAmIFNXVC5WRVJUSUNBTCkgIT0gMCkgewotCQkJcm93TGF5b3V0LmZpbGwgPSB0cnVlOwotCQl9Ci0JCXJvd0xheW91dC5zcGFjaW5nID0gMDsKLQkJdGl0bGVBcmVhLnNldExheW91dCAocm93TGF5b3V0KTsKLQkJCi0JCS8vIEFkZCBhIGRpc3Bvc2UgbGlzdGVuZXIuIFRoaXMgd2lsbCBjYWxsIHRoZSBwcmVzZW50YXRpb25EaXNwb3NlZCgpCi0JCS8vIG1ldGhvZCB3aGVuIHRoZSB3aWRnZXQgaXMgZGVzdHJveWVkLgotCQlwcmVzZW50YXRpb25Db250cm9sLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlwcmVzZW50YXRpb25EaXNwb3NlZCgpOwotCQkJfQotCQl9KTsKLQotCQlwcmVzZW50YXRpb25Db250cm9sLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJaW50IGJvcmRlcldpZHRoID0gZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHByZXNlbnRhdGlvbkNvbnRyb2wuZ2V0Q2xpZW50QXJlYSgpOwkJCQotCQkJCWUuZ2Muc2V0TGluZVdpZHRoKGJvcmRlcldpZHRoKTsJCQkKLQkJCQlpZihhY3RpdmVGb2N1cykKLQkJCQkJZS5nYy5zZXRGb3JlZ3JvdW5kKGUuZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCQkJCWVsc2UgCi0JCQkJCWUuZ2Muc2V0Rm9yZWdyb3VuZChlLmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JBWSkpOwotCQkJCWUuZ2MuZHJhd1JlY3RhbmdsZShjbGllbnRBcmVhLngsIGNsaWVudEFyZWEueSwgY2xpZW50QXJlYS53aWR0aCwgY2xpZW50QXJlYS5oZWlnaHQpOwotCQkJCVJlY3RhbmdsZSBjb250ZW50QXJlYUJvdW5kcyA9IGNvbnRlbnRBcmVhLmdldEJvdW5kcygpOwotCQkJCWludCB5cG9zID0gY29udGVudEFyZWFCb3VuZHMueSAtIDE7CQkJCQotCQkJCS8vZS5nYy5kcmF3TGluZShjbGllbnRBcmVhLngsIHlwb3MsIGNsaWVudEFyZWEueCArIGNsaWVudEFyZWEud2lkdGgsIHlwb3MpOwotCQkJfQkJCQotCQl9KTsJCQkKLQkJY3JlYXRlU3lzdGVtTWVudSgpOwotCQl1cGRhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgSVByZXNlbnRhYmxlUGFydCBnZXRDdXJyZW50KCkgewotCQlyZXR1cm4gY3VycmVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJlc2VudGF0aW9uRGlzcG9zZWQoKSB7Ci0JICAgIC8vIFJlbW92ZSBhbnkgbGlzdGVuZXJzIHRoYXQgd2VyZSBhdHRhY2hlZCB0byBhbnkKLQkJLy8gZ2xvYmFsIEVjbGlwc2UgcmVzb3VyY2VzLiBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBwcmV2ZW50Ci0JCS8vIG1lbW9yeSBsZWFrcy4KLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBnZXRCb3JkZXJXaWR0aCgpIHsKLQkJcmV0dXJuIDI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNob3dTeXN0ZW1NZW51KFBvaW50IGRpc3BsYXlQb3MpIHsKLQkJTWVudSBhTWVudSA9IHN5c3RlbU1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KHRpdGxlQXJlYSk7Ci0JCXN5c3RlbU1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLQkJYU1lbnUuc2V0TG9jYXRpb24oZGlzcGxheVBvcy54LCBkaXNwbGF5UG9zLnkpOwotCQlhTWVudS5zZXRWaXNpYmxlKHRydWUpOwkJCi0JfQotCQotCXByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVTeXN0ZW1NZW51KCkgewotCQlnZXRTaXRlKCkuYWRkU3lzdGVtQWN0aW9ucyhzeXN0ZW1NZW51TWFuYWdlcik7Ci0JCS8vIFRoaXMgZXhhbXBsZSBwcmVzZW50YXRpb24gaW5jbHVkZXMgdGhlIHBhcnQgbGlzdCBhdCB0aGUgZW5kIG9mIHRoZSBzeXN0ZW0gbWVudQotCQlzeXN0ZW1NZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJc3lzdGVtTWVudU1hbmFnZXIuYWRkKG5ldyBDbG9zZVBhcnRDb250cmlidXRpb25JdGVtKHRoaXMpKTsKLQkJc3lzdGVtTWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQotCQkKLQkJQWN0aW9uIHRvcEFjdGlvbiA9IG5ldyBBY3Rpb24oIlRvcCIsIElBY3Rpb24uQVNfUkFESU9fQlVUVE9OKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU2lkZVdpbmRlckl0ZW1WaWV3UHJlc2VudGF0aW9uLnRoaXMuc3R5bGUgPSBTV1QuVE9QOwotCQkJCXNldENoZWNrZWQoKFNpZGVXaW5kZXJJdGVtVmlld1ByZXNlbnRhdGlvbi50aGlzLnN0eWxlICYgU1dULlRPUCkgIT0gMCk7Ci0JCQkJdXBkYXRlKCk7Ci0JCQl9CQkJCi0JCX07Ci0JCXRvcEFjdGlvbi5zZXRDaGVja2VkKChzdHlsZSAmIFNXVC5UT1ApICE9IDApOwotCQlzeXN0ZW1NZW51TWFuYWdlci5hZGQodG9wQWN0aW9uKTsJCi0JCQotCQlBY3Rpb24gYm90dG9tQWN0aW9uID0gbmV3IEFjdGlvbigiQm90dG9tIiwgSUFjdGlvbi5BU19SQURJT19CVVRUT04pIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTaWRlV2luZGVySXRlbVZpZXdQcmVzZW50YXRpb24udGhpcy5zdHlsZSA9IFNXVC5CT1RUT007Ci0JCQkJc2V0Q2hlY2tlZCgoU2lkZVdpbmRlckl0ZW1WaWV3UHJlc2VudGF0aW9uLnRoaXMuc3R5bGUgJiBTV1QuQk9UVE9NKSAhPSAwKTsKLQkJCQl1cGRhdGUoKTsKLQkJCX0JCQkKLQkJfTsKLQkJYm90dG9tQWN0aW9uLnNldENoZWNrZWQoKHN0eWxlICYgU1dULkJPVFRPTSkgIT0gMCk7Ci0JCXN5c3RlbU1lbnVNYW5hZ2VyLmFkZChib3R0b21BY3Rpb24pOwkKLQkJCi0JCUFjdGlvbiByaWdodEFjdGlvbiA9IG5ldyBBY3Rpb24oIlJpZ2h0IiwgSUFjdGlvbi5BU19SQURJT19CVVRUT04pIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTaWRlV2luZGVySXRlbVZpZXdQcmVzZW50YXRpb24udGhpcy5zdHlsZSA9IFNXVC5SSUdIVDsKLQkJCQlzZXRDaGVja2VkKChTaWRlV2luZGVySXRlbVZpZXdQcmVzZW50YXRpb24udGhpcy5zdHlsZSAmIFNXVC5SSUdIVCkgIT0gMCk7Ci0JCQkJdXBkYXRlKCk7Ci0JCQl9CQkJCi0JCX07Ci0JCXJpZ2h0QWN0aW9uLnNldENoZWNrZWQoKHN0eWxlICYgU1dULlJJR0hUKSAhPSAwKTsKLQkJc3lzdGVtTWVudU1hbmFnZXIuYWRkKHJpZ2h0QWN0aW9uKTsJCi0JCQotCQlBY3Rpb24gbGVmdEFjdGlvbiA9IG5ldyBBY3Rpb24oIkxlZnQiLCBJQWN0aW9uLkFTX1JBRElPX0JVVFRPTikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNpZGVXaW5kZXJJdGVtVmlld1ByZXNlbnRhdGlvbi50aGlzLnN0eWxlID0gU1dULkxFRlQ7Ci0JCQkJc2V0Q2hlY2tlZCgoU2lkZVdpbmRlckl0ZW1WaWV3UHJlc2VudGF0aW9uLnRoaXMuc3R5bGUgJiBTV1QuTEVGVCkgIT0gMCk7Ci0JCQkJdXBkYXRlKCk7Ci0JCQl9CQkJCi0JCX07CQkKLQkJbGVmdEFjdGlvbi5zZXRDaGVja2VkKChzdHlsZSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7CQotCQlzeXN0ZW1NZW51TWFuYWdlci5hZGQobGVmdEFjdGlvbik7CQotCQkKLQkJc3lzdGVtTWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCUFjdGlvbiB0ZXh0QWN0aW9uID0gbmV3IEFjdGlvbigiVGV4dCIsIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU2lkZVdpbmRlckl0ZW1WaWV3UHJlc2VudGF0aW9uLnRoaXMuc2hvd1RleHQgPSBpc0NoZWNrZWQoKTsKLQkJCQlzZXRDaGVja2VkKFNpZGVXaW5kZXJJdGVtVmlld1ByZXNlbnRhdGlvbi50aGlzLnNob3dUZXh0KTsKLQkJCQl1cGRhdGUoKTsKLQkJCX0KLQkJfTsKLQkJdGV4dEFjdGlvbi5zZXRDaGVja2VkKHNob3dUZXh0KTsKLQkJc3lzdGVtTWVudU1hbmFnZXIuYWRkKHRleHRBY3Rpb24pOwkKLQkJQWN0aW9uIGltYWdlQWN0aW9uID0gbmV3IEFjdGlvbigiSW1hZ2UiLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNpZGVXaW5kZXJJdGVtVmlld1ByZXNlbnRhdGlvbi50aGlzLnNob3dJbWFnZSA9IGlzQ2hlY2tlZCgpOwotCQkJCXNldENoZWNrZWQoaXNDaGVja2VkKCkpOwotCQkJCXVwZGF0ZSgpOwotCQkJfQotCQl9OwotCQlpbWFnZUFjdGlvbi5zZXRDaGVja2VkKHNob3dJbWFnZSk7Ci0JCXN5c3RlbU1lbnVNYW5hZ2VyLmFkZChpbWFnZUFjdGlvbik7CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCUNvbnRyb2xbXSBpdGVtcyA9IHRpdGxlQXJlYS5nZXRDaGlsZHJlbigpOwkKLQkJZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgaXRlbXMubGVuZ3RoOyBpZHgrKykgewotCQkJaWYoaXRlbXNbaWR4XSBpbnN0YW5jZW9mIFBhcnRJdGVtKSB7Ci0JCQlQYXJ0SXRlbSBpdGVtID0gKFBhcnRJdGVtKWl0ZW1zW2lkeF07CQotCQkJaXRlbS5zZXRTaG93SW1hZ2Uoc2hvd0ltYWdlKTsKLQkJCWl0ZW0uc2V0U2hvd1RleHQoc2hvd1RleHQpOwotCQkJaXRlbS5zZXRGb2N1cyhhY3RpdmVGb2N1cyk7Ci0JCQl9Ci0JCX0KLQkJaW50IHR5cGUgPSBTV1QuVkVSVElDQUw7Ci0JCWlmICgoc3R5bGUgJiBTV1QuVE9QKSAhPSAwIHx8IChzdHlsZSAmIFNXVC5CT1RUT00pICE9IDApIHsKLQkJCXR5cGUgPSBTV1QuSE9SSVpPTlRBTDsKLQkJfQkJCi0JCVJvd0xheW91dCByb3dMYXlvdXQgPSAoKFJvd0xheW91dCl0aXRsZUFyZWEuZ2V0TGF5b3V0KCkpOwotCQlyb3dMYXlvdXQudHlwZSA9IHR5cGU7Ci0JCXJvd0xheW91dC5maWxsID0gdHlwZSA9PSBTV1QuVkVSVElDQUw7Ci0JCQotCQlsYXlvdXQoKTsKLQkJcHJlc2VudGF0aW9uQ29udHJvbC5yZWRyYXcoKTsKLQkJLy90aXRsZUFyZWEucmVkcmF3KCk7Ci0JCS8vdGl0bGVBcmVhLmxheW91dCgpOwotCQkvL2NvbnRlbnRBcmVhLmxheW91dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKElQcmVzZW50YWJsZVBhcnRbXSBwYXJ0cykgewotCQlnZXRTaXRlKCkuY2xvc2UocGFydHMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBsYXlvdXQoKSB7Ci0JCS8vIERldGVybWluZSB0aGUgaW5uZXIgYm91bmRzIG9mIHRoZSBwcmVzZW50YXRpb24KLQkJUmVjdGFuZ2xlIHByZXNlbnRhdGlvbkNsaWVudEFyZWEgPSBwcmVzZW50YXRpb25Db250cm9sLmdldENsaWVudEFyZWEoKTsKLQkJcHJlc2VudGF0aW9uQ2xpZW50QXJlYS54ICs9IGdldEJvcmRlcldpZHRoKCk7Ci0JCXByZXNlbnRhdGlvbkNsaWVudEFyZWEud2lkdGggLT0gZ2V0Qm9yZGVyV2lkdGgoKSAqIDI7Ci0JCXByZXNlbnRhdGlvbkNsaWVudEFyZWEueSArPSBnZXRCb3JkZXJXaWR0aCgpOwotCQlwcmVzZW50YXRpb25DbGllbnRBcmVhLmhlaWdodCAtPSBnZXRCb3JkZXJXaWR0aCgpICogMjsKLQkJCi0JCWlmICgoc3R5bGUgJiBTV1QuVE9QKSAhPSAwIHx8IChzdHlsZSAmIFNXVC5CT1RUT00pICE9IDApIHsKLQkJCVBvaW50IHAgPSB0aXRsZUFyZWEuY29tcHV0ZVNpemUocHJlc2VudGF0aW9uQ2xpZW50QXJlYS53aWR0aCwgU1dULkRFRkFVTFQpOwotCQkJaW50IHl5ID0gMDsKLQkJCWludCB4ID0gMDsKLQkJCWludCB5ID0gMDsKLQkJCWlmKChzdHlsZSAmIFNXVC5UT1ApICE9IDApIHsKLQkJCQl4ID0gcHJlc2VudGF0aW9uQ2xpZW50QXJlYS54OwotCQkJCXkgPSBwcmVzZW50YXRpb25DbGllbnRBcmVhLnk7Ci0JCQkJeXkgPSBwLnkgKyAxOwotCQkJfSBlbHNlIHsKLQkJCQl4ID0gcHJlc2VudGF0aW9uQ2xpZW50QXJlYS54OwotCQkJCXkgPSBwcmVzZW50YXRpb25DbGllbnRBcmVhLmhlaWdodCAtIHAueTsKLQkJCQl5eSA9IHByZXNlbnRhdGlvbkNsaWVudEFyZWEueTsKLQkJCX0KLQkJCWlmKHRpdGxlQXJlYUhpZGVuKQotCQkJCXAueSA9IDM7Ci0JCQl0aXRsZUFyZWEuc2V0Qm91bmRzKHgsIHksIHByZXNlbnRhdGlvbkNsaWVudEFyZWEud2lkdGgsIHAueSk7Ci0JCQljb250ZW50QXJlYS5zZXRCb3VuZHMocHJlc2VudGF0aW9uQ2xpZW50QXJlYS54LCB5eSwgcHJlc2VudGF0aW9uQ2xpZW50QXJlYS53aWR0aCwgcHJlc2VudGF0aW9uQ2xpZW50QXJlYS5oZWlnaHQgLSBwLnkpOwotCQl9IGVsc2UgewotCQkJUG9pbnQgcCA9IHRpdGxlQXJlYS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgcHJlc2VudGF0aW9uQ2xpZW50QXJlYS5oZWlnaHQpOwotCQkJaW50IHh4ID0gMDsKLQkJCWludCB4ID0gMDsKLQkJCWludCB5ID0gMDsKLQkJCWlmKChzdHlsZSAmIFNXVC5SSUdIVCkgIT0gMCkgewotCQkJCXggPSBwcmVzZW50YXRpb25DbGllbnRBcmVhLndpZHRoIC0gcC54OwotCQkJCXkgPSBwcmVzZW50YXRpb25DbGllbnRBcmVhLnk7Ci0JCQkJeHggPSBwcmVzZW50YXRpb25DbGllbnRBcmVhLng7Ci0JCQl9IGVsc2UgewotCQkJCXggPSBwcmVzZW50YXRpb25DbGllbnRBcmVhLng7Ci0JCQkJeSA9IHByZXNlbnRhdGlvbkNsaWVudEFyZWEueTsKLQkJCQl4eCA9IHAueCArMTsKLQkJCX0JCi0JCQlpZih0aXRsZUFyZWFIaWRlbikKLQkJCQlwLnggPSAzOwotCQkJdGl0bGVBcmVhLnNldEJvdW5kcyh4LCB5LCBwLngsIHByZXNlbnRhdGlvbkNsaWVudEFyZWEuaGVpZ2h0KTsKLQkJCWNvbnRlbnRBcmVhLnNldEJvdW5kcyh4eCwgcHJlc2VudGF0aW9uQ2xpZW50QXJlYS55LCBwcmVzZW50YXRpb25DbGllbnRBcmVhLndpZHRoIC0gcC54LCBwcmVzZW50YXRpb25DbGllbnRBcmVhLmhlaWdodCk7Ci0JCX0KLQkJCQkKLQkJLy9SZWN0YW5nbGUgciA9IHRpdGxlQXJlYS5nZXRCb3VuZHMoKTsKLQkJLy9Qb2ludCBwID0gdGl0bGVBcmVhLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCByLmhlaWdodCk7Ci0JCS8vc3RhdHVzTGluZUFyZWEuc2V0Qm91bmRzKHIpOwotCQkKLQkJdGl0bGVBcmVhLnNldEJhY2tncm91bmQodGl0bGVBcmVhLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSkpOwotCQkJCQotCQkvLyBQb3NpdGlvbiB0aGUgdmlldydzIHdpZGdldHMKLQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgewotCQkJQ29udHJvbCB0b29sYmFyID0gY3VycmVudC5nZXRUb29sQmFyKCk7Ci0JCQlpZih0b29sYmFyICE9IG51bGwpIHsKLQkJCQl0b29sYmFyUHJveHkuc2V0VGFyZ2V0Q29udHJvbChjdXJyZW50LmdldFRvb2xCYXIoKSk7Ci0JCQkJY29udGVudEFyZWEuc2V0VG9wQ2VudGVyKHRvb2xiYXJQcm94eS5nZXRDb250cm9sKCkpOwotCQkJfSBlbHNlIHsgCi0JCQkJY29udGVudEFyZWEuc2V0VG9wQ2VudGVyKG51bGwpOwotCQkJfQotCQkJY29udGVudEFyZWEubGF5b3V0KCk7Ci0JCQkKLQkJCVJlY3RhbmdsZSBjbGllbnRSZWN0YW5nbGUgPSBjbGllbnRBcmVhLmdldEJvdW5kcygpOwotCQkJUG9pbnQgY2xpZW50QXJlYVN0YXJ0ID0gcHJlc2VudGF0aW9uQ29udHJvbC5nZXRQYXJlbnQoKS50b0NvbnRyb2woCi0JCQkJCWNvbnRlbnRBcmVhLnRvRGlzcGxheShjbGllbnRSZWN0YW5nbGUueCwgY2xpZW50UmVjdGFuZ2xlLnkpKTsKLQkJCS8vIGN1cnJlbnQgaXNuJ3QgcGFyZW50ZWQgYnkgdGhpcyB3aWRnZXQgaGllcmFyY2h5LCB0aGUgY29vcmRpbmF0ZXMgbXVzdCBiZQotCQkJLy8gcmVsYXRpdmUgdG8gdGhlIHdvcmtiZW5jaCB3aW5kb3cuIFRoZSB3b3JrYmVuY2ggd2luZG93IHBhcmVudHMgZXZlcnkKLQkJCS8vIHBhcnQuCi0JCQljdXJyZW50LnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKGNsaWVudEFyZWFTdGFydC54LCAKLQkJCQkJY2xpZW50QXJlYVN0YXJ0LnksCi0JCQkJCWNsaWVudFJlY3RhbmdsZS53aWR0aCwgCi0JCQkJCWNsaWVudFJlY3RhbmdsZS5oZWlnaHQpKTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJvdW5kcyhSZWN0YW5nbGUgYm91bmRzKSB7Ci0JCXByZXNlbnRhdGlvbkNvbnRyb2wuc2V0Qm91bmRzKGJvdW5kcyk7Ci0JCWxheW91dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlKGludCBuZXdTdGF0ZSkgewotCQlhY3RpdmVGb2N1cyA9IChuZXdTdGF0ZSA9PSBBU19BQ1RJVkVfRk9DVVMpOwotCQlDb250cm9sW10gaXRlbXMgPSB0aXRsZUFyZWEuZ2V0Q2hpbGRyZW4oKTsJCi0JCWZvciAoaW50IGlkeCA9IDA7IGlkeCA8IGl0ZW1zLmxlbmd0aDsgaWR4KyspIHsKLQkJCWlmKGl0ZW1zW2lkeF0gaW5zdGFuY2VvZiBQYXJ0SXRlbSkgewotCQkJUGFydEl0ZW0gaXRlbSA9IChQYXJ0SXRlbSlpdGVtc1tpZHhdOwkKLQkJCWl0ZW0uc2V0Rm9jdXMoYWN0aXZlRm9jdXMpOwotCQkJfQotCQl9Ci0JCXByZXNlbnRhdGlvbkNvbnRyb2wucmVkcmF3KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIGlzVmlzaWJsZSkgewotCQlwcmVzZW50YXRpb25Db250cm9sLnNldFZpc2libGUoaXNWaXNpYmxlKTsKLQkJCi0JCS8vIE1ha2UgdGhlIGN1cnJlbnRseSB2aXNpYmxlIHBhcnQgdmlzaWJsZQotCQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQljdXJyZW50LnNldFZpc2libGUoaXNWaXNpYmxlKTsJCQkKLQkJfQotCi0JCWlmIChpc1Zpc2libGUpIHsKLQkJCS8vIFJlc3RvcmUgdGhlIGJvdW5kcyBvZiB0aGUgY3VycmVudGx5IHZpc2libGUgcGFydC4gCi0JCQkvLyBJUGFydFByZXNlbnRhdGlvbnMgY2FuIGJlIHVzZWQgYnkgbXVsdGlwbGUgU3RhY2tQcmVzZW50YXRpb25zLAotCQkJLy8gYWx0aG91Z2ggb25seSBvbmUgc3VjaCBwcmVzZW50YXRpb24gaXMgZXZlciB2aXNpYmxlIGF0IGEgdGltZS4KLQkJCS8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZSBvdGhlciBwcmVzZW50YXRpb24gaGFzIGNoYW5nZWQgdGhlCi0JCQkvLyBib3VuZHMgb2YgdGhlIHBhcnQgc2luY2UgaXQgd2FzIGxhc3QgdmlzaWJsZSwgc28gd2UgbmVlZCB0bwotCQkJLy8gdXBkYXRlIHRoZSBwYXJ0J3MgYm91bmRzIHdoZW4gdGhlIHByZXNlbnRhdGlvbiBiZWNvbWVzIHZpc2libGUuCi0JCQlsYXlvdXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXRlKGludCBzdGF0ZSkgewotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb25Db250cm9sOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhcnQoSVByZXNlbnRhYmxlUGFydCBuZXdQYXJ0LCBPYmplY3QgY29va2llKSB7Ci0JCS8vIElnbm9yZSB0aGUgY29va2llIGZvciBub3csIHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgZHJhZy1hbmQtZHJvcCB5ZXQuCi0JCVBhcnRJdGVtIGl0ZW0gPSBuZXcgUGFydEl0ZW0odGl0bGVBcmVhLCBuZXdQYXJ0KTsKLQkJCi0JCS8vIEF0dGFjaCB0aGUgbmV3UGFydCBwb2ludGVyIHRvIHRoZSBUb29sSXRlbS4gVGhpcyBpcyB1c2VkIGZvciBnZXRQYXJ0Rm9yVGFiCi0JCS8vIHRvIGRldGVybWluZSB3aGljaCBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbCBpdGVtCi0JCWl0ZW0uc2V0RGF0YShQQVJUX0RBVEEsIG5ld1BhcnQpOwotCQkKLQkJLy8gQXR0YWNoIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoZSBwYXJ0LiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBUb29sSXRlbQotCQkvLyB0byByZWZsZWN0IGNoYW5nZXMgaW4gdGhlIHBhcnQuCi0JCW5ld1BhcnQuYWRkUHJvcGVydHlMaXN0ZW5lcihjaGlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJLy8gQXR0YWNoIGEgZGlzcG9zZSBsaXN0ZW5lciB0byB0aGUgaXRlbS4gVGhpcyByZW1vdmVzIHRoZSBhYm92ZSBwcm9wZXJ0eQotCQkvLyBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGUgcGFydCB3aGVuIHRoZSBpdGVtIGlzIGRlc3Ryb3llZC4gVGhpcyBwcmV2ZW50cwotCQkvLyBtZW1vcnkgbGVha3MuCi0JCWl0ZW0uYWRkRGlzcG9zZUxpc3RlbmVyKHRhYkRpc3Bvc2VMaXN0ZW5lcik7Ci0JCQotCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIGV2ZW50cyBpbiB0aGUgbmV3IHRvb2wgaXRlbQotCQlpdGVtLmFkZE1vdXNlTGlzdGVuZXIobW91c2VMaXN0ZW5lcik7Ci0JCQotCQlQcmVzZW50YXRpb25VdGlsLmFkZERyYWdMaXN0ZW5lcihpdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVBvaW50IGxvYyA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLQkJCQlQYXJ0SXRlbSBpdGVtID0gKFBhcnRJdGVtKWV2ZW50LndpZGdldDsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJICAgLy8gTW92ZSB0aGUgY3VycmVudCBwYXJ0Ci0JCQkJICAgSVByZXNlbnRhYmxlUGFydCBkcmFnZ2VkSXRlbSA9IGdldFBhcnRGb3JUYWIoaXRlbSk7Ci0JCQkJICAgZHJhZ2dlZEl0ZW0uc2V0Rm9jdXMoKTsKLQkJCQlnZXRTaXRlKCkuZHJhZ1N0YXJ0KGRyYWdnZWRJdGVtLCBpdGVtLnRvRGlzcGxheShsb2MpLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBJbml0aWFsaXplIHRoZSB0YWIgZm9yIHRoaXMgcGFydAotCQl1cGRhdGVQYXJ0SXRlbShpdGVtLCBuZXdQYXJ0KTsKLQkJCQotCQluZXdQYXJ0LnNldEJvdW5kcyhjbGllbnRBcmVhLmdldEJvdW5kcygpKTsKLQkJdGl0bGVBcmVhLmxheW91dCgpOwotCQl0aXRsZUFyZWEucmVkcmF3KCk7Ci0JCXVwZGF0ZSgpOwkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBhcnRJdGVtKFBhcnRJdGVtIGl0ZW0sIElQcmVzZW50YWJsZVBhcnQgcGFydCkgewotCQlTdHJpbmcgdGFiTmFtZSA9IHBhcnQuZ2V0VGl0bGUoKTsKLQkJaWYoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCWlmICghdGFiTmFtZS5lcXVhbHMoaXRlbS5nZXRUZXh0KCkpKSB7Ci0JCQlpdGVtLnNldFRleHQodGFiTmFtZSk7Ci0JCX0KLQkJCi0JCWlmICghKHBhcnQuZ2V0VGl0bGVUb29sVGlwKCkuZXF1YWxzKGl0ZW0uZ2V0VG9vbFRpcFRleHQoKSkpKSB7Ci0JCQlpdGVtLnNldFRvb2xUaXBUZXh0KHBhcnQuZ2V0VGl0bGVUb29sVGlwKCkpOwotCQl9Ci0KLQkJaXRlbS5zZXRJbWFnZShwYXJ0LmdldFRpdGxlSW1hZ2UoKSk7Ci0JCWl0ZW0uc2V0U2hvd0ltYWdlKHNob3dJbWFnZSk7Ci0JCWl0ZW0uc2V0U2hvd1RleHQoc2hvd1RleHQpOwotCQl0aXRsZUFyZWEubGF5b3V0KHRydWUpOwotCQl0aXRsZUFyZWEucmVkcmF3KCk7Ci0JCWl0ZW0ucmVkcmF3KCk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBQYXJ0SXRlbSBnZXRQYXJ0SXRlbShJUHJlc2VudGFibGVQYXJ0IHBhcnQpIHsKLQkJaWYgKCF0aXRsZUFyZWEuaXNEaXNwb3NlZCgpKSB7Ci0JCQlDb250cm9sW10gaXRlbXMgPSB0aXRsZUFyZWEuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGlkeCA9IDA7IGlkeCA8IGl0ZW1zLmxlbmd0aDsgaWR4KyspIHsKLQkJCQlDb250cm9sIGl0ZW0gPSBpdGVtc1tpZHhdOwotCQkJCWlmICghaXRlbS5pc0Rpc3Bvc2VkKCkgJiYgZ2V0UGFydEZvclRhYihpdGVtKSA9PSBwYXJ0KSB7Ci0JCQkJCXJldHVybiAoUGFydEl0ZW0pIGl0ZW07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgSVByZXNlbnRhYmxlUGFydCBnZXRQYXJ0Rm9yVGFiKENvbnRyb2wgaXRlbSkgewotCQlyZXR1cm4gKElQcmVzZW50YWJsZVBhcnQpaXRlbS5nZXREYXRhKFBBUlRfREFUQSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUGFydChJUHJlc2VudGFibGVQYXJ0IG9sZFBhcnQpIHsKLQkJUGFydEl0ZW0gaXRlbSA9IGdldFBhcnRJdGVtKG9sZFBhcnQpOwotCQlpZihpdGVtICE9IG51bGwpIHsKLQkJCWl0ZW0uZGlzcG9zZSgpOwotCQkJdGl0bGVBcmVhLmxheW91dCgpOwotCQkJdGl0bGVBcmVhLnJlZHJhdygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0UGFydChJUHJlc2VudGFibGVQYXJ0IHRvU2VsZWN0KSB7Ci0JCWlmICh0b1NlbGVjdCA9PSBjdXJyZW50KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKGN1cnJlbnQgIT1udWxsKSB7Ci0JCQljdXJyZW50LnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JCQotCQkvLyBTZWxlY3QgdGhlIG5ldyBwYXJ0Ci0JCWN1cnJlbnQgPSB0b1NlbGVjdDsKLQkJCi0JCS8vIE9yZGVyaW5nIGlzIGltcG9ydGFudCBoZXJlLiBXZSBuZWVkIHRvIG1ha2UgdGhlIHBhcnQKLQkJLy8gdmlzaWJsZSBiZWZvcmUgdXBkYXRpbmcgaXRzIGJvdW5kcywgb3IgdGhlIGNhbGwgdG8gc2V0Qm91bmRzCi0JCS8vIG1heSBiZSBpZ25vcmVkLgotCQkKLQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgewotCQkJLy8gTWFrZSB0aGUgbmV3bHkgc2VsZWN0ZWQgcGFydCB2aXNpYmxlCi0JCQljdXJyZW50LnNldFZpc2libGUodHJ1ZSk7Ci0JCQlDb250cm9sW10gaXRlbXMgPSB0aXRsZUFyZWEuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGlkeCA9IDA7IGlkeCA8IGl0ZW1zLmxlbmd0aDsgaWR4KyspIHsKLQkJCQlpZihpdGVtc1tpZHhdIGluc3RhbmNlb2YgUGFydEl0ZW0pIHsKLQkJCQlQYXJ0SXRlbSBpdGVtID0gKFBhcnRJdGVtKWl0ZW1zW2lkeF07Ci0JCQkJaXRlbS5zZXRTZWxlY3RlZChnZXRQYXJ0Rm9yVGFiKGl0ZW0pID09IGN1cnJlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBVcGRhdGUgdGhlIGJvdW5kcyBvZiB0aGUgbmV3bHkgc2VsZWN0ZWQgcGFydAotCQlsYXlvdXQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RhY2tEcm9wUmVzdWx0IGRyYWdPdmVyKENvbnRyb2wgY3VycmVudENvbnRyb2wsIFBvaW50IGxvY2F0aW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNob3dTeXN0ZW1NZW51KCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNob3dQYW5lTWVudSgpIHsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNob3dQYW5lTWVudShQb2ludCBsb2NhdGlvbikgewotCQlpZiAoY3VycmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlQYXJ0TWVudSBtZW51ID0gY3VycmVudC5nZXRNZW51KCk7Ci0JCQotCQlpZiAobWVudSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltZW51LnNob3dNZW51KGxvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbFtdIGdldFRhYkxpc3QoSVByZXNlbnRhYmxlUGFydCBwYXJ0KSB7Ci0JCWlmKGN1cnJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBDb250cm9sW10ge2N1cnJlbnQuZ2V0Q29udHJvbCgpfTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgQ29udHJvbFswXTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3NpZGV3aW5kZXIvU2lkZVdpbmRlclByZXNlbnRhdGlvbkZhY3RvcnkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3NpZGV3aW5kZXIvU2lkZVdpbmRlclByZXNlbnRhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhZDZmZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi9zaWRld2luZGVyL1NpZGVXaW5kZXJQcmVzZW50YXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi5zaWRld2luZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy4qOwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFNpZGVXaW5kZXJQcmVzZW50YXRpb25GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5IHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5I2NyZWF0ZUVkaXRvclByZXNlbnRhdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVN0YWNrUHJlc2VudGF0aW9uU2l0ZSkKLQkgKi8KLQlwdWJsaWMgU3RhY2tQcmVzZW50YXRpb24gY3JlYXRlRWRpdG9yUHJlc2VudGF0aW9uKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlJU3RhY2tQcmVzZW50YXRpb25TaXRlIHNpdGUpIHsKLQkJcmV0dXJuIG5ldyBTaWRlV2luZGVySXRlbVZpZXdQcmVzZW50YXRpb24ocGFyZW50LCBzaXRlLCB0cnVlLCB0cnVlLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5UT1ApOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5I2NyZWF0ZVZpZXdQcmVzZW50YXRpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklTdGFja1ByZXNlbnRhdGlvblNpdGUpCi0JICovCi0JcHVibGljIFN0YWNrUHJlc2VudGF0aW9uIGNyZWF0ZVZpZXdQcmVzZW50YXRpb24oQ29tcG9zaXRlIHBhcmVudCwKLQkJCUlTdGFja1ByZXNlbnRhdGlvblNpdGUgc2l0ZSkgewotCQlyZXR1cm4gbmV3IFNpZGVXaW5kZXJJdGVtVmlld1ByZXNlbnRhdGlvbihwYXJlbnQsIHNpdGUsICBmYWxzZSwgdHJ1ZSwgU1dULkhPUklaT05UQUwgfCBTV1QuVE9QKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLkFic3RyYWN0UHJlc2VudGF0aW9uRmFjdG9yeSNjcmVhdGVTdGFuZGFsb25lVmlld1ByZXNlbnRhdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVN0YWNrUHJlc2VudGF0aW9uU2l0ZSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RhY2tQcmVzZW50YXRpb24gY3JlYXRlU3RhbmRhbG9uZVZpZXdQcmVzZW50YXRpb24oQ29tcG9zaXRlIHBhcmVudCwKLQkJCUlTdGFja1ByZXNlbnRhdGlvblNpdGUgc2l0ZSwgYm9vbGVhbiBzaG93VGl0bGUpIHsKLQkJcmV0dXJuIG5ldyBTaWRlV2luZGVySXRlbVZpZXdQcmVzZW50YXRpb24ocGFyZW50LCBzaXRlLCBmYWxzZSwgdHJ1ZSwgU1dULkhPUklaT05UQUwgfCBTV1QuVE9QKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi93cmFwcGVkdGFicy9DaGFuZ2VTdGFja1N0YXRlQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvQ2hhbmdlU3RhY2tTdGF0ZUNvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5MzEwYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi93cmFwcGVkdGFicy9DaGFuZ2VTdGFja1N0YXRlQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24ud3JhcHBlZHRhYnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JU3RhY2tQcmVzZW50YXRpb25TaXRlOwotCi0vKioKLSAqIENvbnRyaWJ1dGlvbnMgZm9yIHN1cHBvcnRpbmcgbWF4aW1pemluZywgbWluaW1pemluZywgYW5kIHJlc3RvcmluZyB0aGUgc3RhdGUgb2YKLSAqIGEgc3RhY2sgcHJlc2VudGF0aW9uLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VTdGFja1N0YXRlQ29udHJpYnV0aW9uSXRlbSBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0gewotCi0JcHJpdmF0ZSBJU3RhY2tQcmVzZW50YXRpb25TaXRlIHNpdGU7Ci0JCi0JcHVibGljIENoYW5nZVN0YWNrU3RhdGVDb250cmlidXRpb25JdGVtKElTdGFja1ByZXNlbnRhdGlvblNpdGUgc2l0ZSkgewotCQl0aGlzLnNpdGUgPSBzaXRlOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgCXN1cGVyLmRpc3Bvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZmlsbChNZW51IG1lbnUsIGludCBpbmRleCkgewotCQlpZihzaXRlLnN1cHBvcnRzU3RhdGUoSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9NQVhJTUlaRUQpICYmIHNpdGUuZ2V0U3RhdGUoKSAhPSBJU3RhY2tQcmVzZW50YXRpb25TaXRlLlNUQVRFX01BWElNSVpFRCkgewotCQkJTWVudUl0ZW0gaXRlbTEgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gsIGluZGV4KTsKLQkJCWl0ZW0xLnNldFRleHQoIiZNYXhpbWl6ZSIpOwotCQkJaXRlbTEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzaXRlLnNldFN0YXRlKElTdGFja1ByZXNlbnRhdGlvblNpdGUuU1RBVEVfTUFYSU1JWkVEKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZihzaXRlLmdldFN0YXRlKCkgIT0gSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9SRVNUT1JFRCkgIHsKLQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gsIGluZGV4KTsKLQkJCWl0ZW0uc2V0VGV4dCgiJlJlc3RvcmUiKTsKLQkJCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzaXRlLnNldFN0YXRlKElTdGFja1ByZXNlbnRhdGlvblNpdGUuU1RBVEVfUkVTVE9SRUQpOwotCQkJCX0KLQkJCX0pOwotCQl9CQkKLSAgICB9Ci0gICAgCi0JcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi93cmFwcGVkdGFicy9DbG9zZUFsbENvbnRyaWJ1dGlvbkl0ZW0uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3dyYXBwZWR0YWJzL0Nsb3NlQWxsQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGJmOTkzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3dyYXBwZWR0YWJzL0Nsb3NlQWxsQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24ud3JhcHBlZHRhYnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xvc2VBbGxDb250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0JcHJpdmF0ZSBXcmFwcGVkVGFic1BhcnRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uOyAKLQkKLQlwcml2YXRlIFNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJcHJlc2VudGF0aW9uLmNsb3NlKHByZXNlbnRhdGlvbi5nZXRQYXJ0cygpKTsKLQkJfQotCX07Ci0JCi0JcHVibGljIENsb3NlQWxsQ29udHJpYnV0aW9uSXRlbShXcmFwcGVkVGFic1BhcnRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKSB7Ci0JCXRoaXMucHJlc2VudGF0aW9uID0gcHJlc2VudGF0aW9uOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgCXN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgcHJlc2VudGF0aW9uID0gbnVsbDsKLSAgICAgICAgc2VsZWN0aW9uTGlzdGVuZXIgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmaWxsKE1lbnUgbWVudSwgaW50IGluZGV4KSB7Ci0gICAgCWlmIChwcmVzZW50YXRpb24uZ2V0UGFydHMoKS5sZW5ndGggPiAxKSB7Ci0JCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQlpdGVtLnNldFRleHQoIkNsb3NlIGFsbCIpOwotCQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgewotICAgIAkvLyBSZXR1cm5pbmcgdHJ1ZSBoZXJlIGVuc3VyZXMgdGhhdCB0aGUgZmlsbCguLi4pIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlcgotICAgIAkvLyB0aGUgY29udGV4dCBtZW51IG9wZW5zCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3dyYXBwZWR0YWJzL0Nsb3NlQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvQ2xvc2VDb250cmlidXRpb25JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZmExOWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvQ2xvc2VDb250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi53cmFwcGVkdGFiczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklQcmVzZW50YWJsZVBhcnQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xvc2VDb250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0JcHJpdmF0ZSBXcmFwcGVkVGFic1BhcnRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uOyAKLQkKLQlwcml2YXRlIFNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJcHJlc2VudGF0aW9uLmNsb3NlKG5ldyBJUHJlc2VudGFibGVQYXJ0W10ge3ByZXNlbnRhdGlvbi5nZXRDdXJyZW50KCl9KTsKLQkJfQotCX07Ci0JCi0JcHVibGljIENsb3NlQ29udHJpYnV0aW9uSXRlbShXcmFwcGVkVGFic1BhcnRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKSB7Ci0JCXRoaXMucHJlc2VudGF0aW9uID0gcHJlc2VudGF0aW9uOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgCXN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgcHJlc2VudGF0aW9uID0gbnVsbDsKLSAgICAgICAgc2VsZWN0aW9uTGlzdGVuZXIgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmaWxsKE1lbnUgbWVudSwgaW50IGluZGV4KSB7Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUsIGluZGV4KTsKLQkJaXRlbS5zZXRUZXh0KCJDbG9zZSIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCi0JCUlQcmVzZW50YWJsZVBhcnQgY3VycmVudCA9IHByZXNlbnRhdGlvbi5nZXRDdXJyZW50KCk7Ci0JCWl0ZW0uc2V0RW5hYmxlZChjdXJyZW50ICE9IG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3dyYXBwZWR0YWJzL0Nsb3NlT3RoZXJzQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvQ2xvc2VPdGhlcnNDb250cmlidXRpb25JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTM3ZWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvQ2xvc2VPdGhlcnNDb250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi53cmFwcGVkdGFiczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JUHJlc2VudGFibGVQYXJ0OwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIENsb3NlT3RoZXJzQ29udHJpYnV0aW9uSXRlbSBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0gewotCXByaXZhdGUgV3JhcHBlZFRhYnNQYXJ0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbjsgCi0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25BZGFwdGVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUlQcmVzZW50YWJsZVBhcnQgY3VycmVudCA9IHByZXNlbnRhdGlvbi5nZXRDdXJyZW50KCk7Ci0JCQlMaXN0IHBhcnRzID0gQXJyYXlzLmFzTGlzdChwcmVzZW50YXRpb24uZ2V0UGFydHMoKSk7Ci0JCQlMaXN0IG90aGVyUGFydHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQkJb3RoZXJQYXJ0cy5hZGRBbGwocGFydHMpOwotCQkJb3RoZXJQYXJ0cy5yZW1vdmUoY3VycmVudCk7Ci0JCQlwcmVzZW50YXRpb24uY2xvc2UoKElQcmVzZW50YWJsZVBhcnRbXSkgb3RoZXJQYXJ0cy50b0FycmF5KG5ldyBJUHJlc2VudGFibGVQYXJ0W290aGVyUGFydHMuc2l6ZSgpXSkpOwotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgQ2xvc2VPdGhlcnNDb250cmlidXRpb25JdGVtKFdyYXBwZWRUYWJzUGFydFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQkJdGhpcy5wcmVzZW50YXRpb24gPSBwcmVzZW50YXRpb247Ci0JfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAJc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICBwcmVzZW50YXRpb24gPSBudWxsOwotICAgICAgICBzZWxlY3Rpb25MaXN0ZW5lciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGZpbGwoTWVudSBtZW51LCBpbnQgaW5kZXgpIHsKLSAgICAJaWYgKHByZXNlbnRhdGlvbi5nZXRQYXJ0cygpLmxlbmd0aCA+IDEpIHsKLQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUsIGluZGV4KTsKLQkJCWl0ZW0uc2V0VGV4dCgiQ2xvc2Ugb3RoZXJzIik7Ci0JCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCQotCQkJSVByZXNlbnRhYmxlUGFydCBjdXJyZW50ID0gcHJlc2VudGF0aW9uLmdldEN1cnJlbnQoKTsKLQkJCWl0ZW0uc2V0RW5hYmxlZChjdXJyZW50ICE9IG51bGwpOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRHluYW1pYygpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvUGFydExpc3RDb250cmlidXRpb25JdGVtLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi93cmFwcGVkdGFicy9QYXJ0TGlzdENvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhZTVjNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi93cmFwcGVkdGFicy9QYXJ0TGlzdENvbnRyaWJ1dGlvbkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklQcmVzZW50YWJsZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JU3RhY2tQcmVzZW50YXRpb25TaXRlOwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFBhcnRMaXN0Q29udHJpYnV0aW9uSXRlbSBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0gewotCXByaXZhdGUgV3JhcHBlZFRhYnNQYXJ0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbjsKLQlwcml2YXRlIElTdGFja1ByZXNlbnRhdGlvblNpdGUgc2l0ZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9JVEVNID0gIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi53cmFwcGVkdGFicy5QYXJ0TGlzdENvbnRyaWJ1dGlvbkl0ZW0uREFUQV9JVEVNIjsgCi0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25BZGFwdGVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU1lbnVJdGVtIGl0ZW0gPSAoTWVudUl0ZW0pZS53aWRnZXQ7Ci0JCQkKLQkJCUlQcmVzZW50YWJsZVBhcnQgcGFydCA9IChJUHJlc2VudGFibGVQYXJ0KWl0ZW0uZ2V0RGF0YShEQVRBX0lURU0pOwotCQkJCi0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJc2l0ZS5zZWxlY3RQYXJ0KHBhcnQpOwotCQkJfQotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgUGFydExpc3RDb250cmlidXRpb25JdGVtKFdyYXBwZWRUYWJzUGFydFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24sIElTdGFja1ByZXNlbnRhdGlvblNpdGUgc2l0ZSkgewotCQl0aGlzLnByZXNlbnRhdGlvbiA9IHByZXNlbnRhdGlvbjsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIAlzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIHByZXNlbnRhdGlvbiA9IG51bGw7Ci0gICAgICAgIHNpdGUgPSBudWxsOwotICAgICAgICBzZWxlY3Rpb25MaXN0ZW5lciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGZpbGwoTWVudSBtZW51LCBpbnQgaW5kZXgpIHsKLSAgICAJSVByZXNlbnRhYmxlUGFydFtdIHBhcnRzID0gcHJlc2VudGF0aW9uLmdldFBhcnRzKCk7Ci0gICAgCQotICAgIAkvLyBEb24ndCBpbmNsdWRlIGEgcGFydCBsaXN0IGlmIHRoZXJlJ3Mgb25seSBvbmUgcGFydAotICAgIAlpZiAocGFydHMubGVuZ3RoIDw9IDEpIHsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAkKLSAgICAJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IsIGluZGV4KyspOwotICAgIAkKLSAgICAJQXJyYXlzLnNvcnQocGFydHMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotCQkJCUlQcmVzZW50YWJsZVBhcnQgcGFydDAgPSAoSVByZXNlbnRhYmxlUGFydClhcmcwOwotCQkJCUlQcmVzZW50YWJsZVBhcnQgcGFydDEgPSAoSVByZXNlbnRhYmxlUGFydClhcmcxOwotCQkJCQotCQkJCXJldHVybiBwYXJ0MC5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShwYXJ0MS5nZXROYW1lKCkpOwotCQkJfQotICAgIAl9KTsKLSAgICAJCi0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcmVzZW50YWJsZVBhcnQgcGFydCA9IHBhcnRzW2ldOwotCQkJCi0JCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FLCBpbmRleCsrKTsKLQkJCWl0ZW0uc2V0VGV4dChwYXJ0LmdldE5hbWUoKSk7Ci0JCQlpdGVtLnNldEltYWdlKHBhcnQuZ2V0VGl0bGVJbWFnZSgpKTsKLQkJCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkJaXRlbS5zZXREYXRhKERBVEFfSVRFTSwgcGFydCk7Ci0JCX0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi93cmFwcGVkdGFicy9Qcm94eUNvbnRyb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3dyYXBwZWR0YWJzL1Byb3h5Q29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWZiZjNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3dyYXBwZWR0YWJzL1Byb3h5Q29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5HZW9tZXRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kbmQuRHJhZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZG5kLlN3dFV0aWw7Ci0KLS8qKgotICogQSBQcm94eUNvbnRyb2wgaXMgYW4gaW52aXNpYmxlIGNvbnRyb2wgd2hvc2Ugc2l6ZSBhbmQgcG9zaXRpb24gYXJlIGxpbmtlZAotICogd2l0aCBzb21lIHRhcmdldCBjb250cm9sLiBUaGF0IGlzLCB3aGVuIHRoZSBkdW1teSBjb250cm9sIGlzIGFza2VkIGZvciBpdHMKLSAqIHByZWZlcnJlZCBzaXplIGl0IHJldHVybnMgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSB0YXJnZXQuIENoYW5naW5nIHRoZQotICogYm91bmRzIG9mIHRoZSBkdW1teSBjb250cm9sIGFsc28gY2hhbmdlcyB0aGUgYm91bmRzIG9mIHRoZSB0YXJnZXQuIFRoaXMgYWxsb3dzIAotICogYW55IENvbXBvc2l0ZSB0byBsYXkgb3V0IGEgY29udHJvbCB0aGF0IGlzbid0IG9uZSBvZiBpdHMgY2hpbGRyZW4uCi0gKiAKLSAqIDxwPgotICogRm9yIGV4YW1wbGUsIGltYWdpbmUgeW91IGhhdmUgYSBWaWV3Rm9ybSBhbmQgYSBUb29sQmFyIHRoYXQgc2hhcmUgdGhlIHNhbWUgcGFyZW50Ci0gKiBhbmQgeW91IHdhbnQgdGhlIFRvb2xCYXIgdG8gYmUgbG9jYXRlZCBpbiB0aGUgdXBwZXItcmlnaHQgY29ybmVyIG9mIHRoZSBWaWV3Rm9ybS4KLSAqIElmIHRoZSBUb29sQmFyIHdlcmUgYSBjaGlsZCBvZiB0aGUgVmlld0Zvcm0sIHRoaXMgY291bGQgYmUgZG9uZSBlYXNpbHkgYnkgY2FsbGluZwotICogdmlld0Zvcm0uc2V0VG9wUmlnaHQodG9vbEJhcikuIEhvd2V2ZXIsIHRoaXMgaXMgaW1wb3NzaWJsZSBzaW5jZSBWaWV3Rm9ybS5zZXRUb3BSaWdodAotICogd2lsbCBvbmx5IGFjY2VwdCBhIGNoaWxkIGNvbnRyb2wuIEluc3RlYWQsIHdlIGNyZWF0ZSBhIFByb3h5Q29udHJvbCBhcyBhIGNoaWxkCi0gKiBvZiB0aGUgdmlld0Zvcm0sIGFuZCBzZXQgdGhlIHRvb2xiYXIgYXMgaXRzIHRhcmdldC4gVGhlIFZpZXdGb3JtIHdpbGwgdHJlYXQKLSAqIHRoZSBQcm94eUNvbnRyb2wganVzdCBsaWtlIGFueSBvdGhlciBjaGlsZCwgYnV0IGl0IHdpbGwgYWN0dWFsbHkgYmUgYXJyYW5naW5nIHRoZQotICogVG9vbEJhci4gCi0gKiA8L3A+Ci0gKiA8cD5Gb3IgZXhhbXBsZToKLSAqIDwvcD4KLSAqIDxjb2RlPgotICogICAgICAvLyBDcmVhdGUgYSBWaWV3Rm9ybSBhbmQgYSBUb29sQmFyIHRoYXQgYXJlIHNpYmxpbmdzCi0gKiAJCVZpZXdGb3JtIHZpZXdGb3JtID0gbmV3IFZpZXdGb3JtKHBhcmVudCwgU1dULk5PTkUpOwotICogCQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhcihwYXJlbnQsIFNXVC5OT05FKTsKLSAqIAotICogICAgICAvLyBBbGxvdyB0aGUgVmlld0Zvcm0gdG8gY29udHJvbCB0aGUgcG9zaXRpb24gb2YgdGhlIFRvb2xCYXIgYnkgY3JlYXRpbmcKLSAqICAgICAgLy8gYSBQcm94eUNvbnRyb2wgaW4gdGhlIFZpZXdGb3JtIHRoYXQgdGFyZ2V0cyB0aGUgVG9vbEJhci4KLSAqIAkJUHJveHlDb250cm9sIHRvb2xCYXJQcm94eSA9IG5ldyBQcm94eUNvbnRyb2wodmlld0Zvcm0pOwotICogCQl0b29sQmFyUHJveHkuc2V0VGFyZ2V0KHRvb2xCYXIpOwotICogCQl2aWV3Rm9ybS5zZXRUb3BSaWdodCh0b29sQmFyUHJveHkuZ2V0Q29udHJvbCgpKTsKLSAqIDwvY29kZT4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGlzIGludGVuZGVkIHRvIHNpbXBsaWZ5IG1hbmFnZW1lbnQgb2YgdmlldyB0b29sYmFycyBpbiB0aGUgcHJlc2VudGF0aW9uIEFQSS4KLSAqIFByZXNlbnRhdGlvbiBvYmplY3RzIGhhdmUgbm8gY29udHJvbCBvdmVyIHdoZXJlIHRoZSB2aWV3IHRvb2xiYXJzIGFyZSBjcmVhdGVkIGluCi0gKiB0aGUgd2lkZ2V0IGhpZXJhcmNoeSwgYnV0IHRoZXkgbWF5IHdpc2ggdG8gY29udHJvbCB0aGUgcG9zaXRpb24gb2YgdGhlIHZpZXcgdG9vbGJhcnMKLSAqIHVzaW5nIHRyYWRpdGlvbmFsIFNXVCBsYXlvdXRzIGFuZCBjb21wb3NpdGVzLiAKLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFByb3h5Q29udHJvbCB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW52aXNpYmxlIGR1bW15IGNvbnRyb2wgCi0gICAgICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udHJvbDsKLQkKLQkvKioKLQkgKiBUYXJnZXQgY29udHJvbCAocG9zc2libHkgbnVsbCkKLQkgKi8KLQlwcml2YXRlIENvbnRyb2wgdGFyZ2V0OwotCQotCS8qKgotCSAqIE1vc3Qgc3BlY2lmaWMgY29tbW9uIGFuY2VzdG9yIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgdGhlIHByb3h5IGNvbnRyb2xzCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIGNvbW1vbkFuY2VzdG9yOwotCQotCS8qKgotCSAqIFZpc2liaWxpdHkgc3RhdGUgb2YgdGhlIHByb3h5IGNvbnRyb2wgdGhlIGxhc3QgdGltZSBpdCBoYWQgYSBub24tbnVsbCB0YXJnZXQuCi0JICogTm90ZTogd2hlbiB0aGUgdGFyZ2V0IGlzIHNldCB0byBudWxsLCB3ZSBmb3JjZSB0aGUgcHJveHkgdG8gYmVjb21lIGludmlzaWJsZQotCSAqIGFuZCB1c2UgdGhpcyB2YXJpYWJsZSB0byByZW1lbWJlciB0aGUgaW5pdGlhbCBzdGF0ZSB3aGVuIHdlIGdldCBhIG5ldyBub24tbnVsbAotCSAqIHRhcmdldC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdmlzaWJsZSA9IHRydWU7Ci0JCi0JLyoqCi0JICogRGlzcG9zZSBsaXN0ZW5lci4gQnJlYWtzIHRoZSBsaW5rIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgdGhlIHByb3h5IGlmIGVpdGhlcgotCSAqIGNvbnRyb2wgaXMgZGlzcG9zZWQuCi0JICovCi0JcHJpdmF0ZSBEaXNwb3NlTGlzdGVuZXIgZGlzcG9zZUxpc3RlbmVyID0gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCWlmIChlLndpZGdldCA9PSB0YXJnZXQgfHwgZS53aWRnZXQgPT0gY29udHJvbCkgewotCQkJCXNldFRhcmdldENvbnRyb2wobnVsbCk7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXByaXZhdGUgTGlzdGVuZXIgdmlzaWJpbGl0eUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aXNpYmxlID0gY29udHJvbC5nZXRWaXNpYmxlKCk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0LnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkgICAgCi0JfTsKLQkKLQkvKioKLQkgKiBNb3ZlbWVudCBsaXN0ZW5lci4gVXBkYXRlcyB0aGUgYm91bmRzIG9mIHRoZSB0YXJnZXQgdG8gbWF0Y2ggdGhlIAotCSAqIGJvdW5kcyBvZiB0aGUgZHVtbXkgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2xMaXN0ZW5lciBjb250cm9sTGlzdGVuZXIgPSBuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotCQkJUHJveHlDb250cm9sLnRoaXMubGF5b3V0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkgICAgLy9pZiAoZS53aWRnZXQgPT0gY29udHJvbCkgewotCQkgICAgIC8vICAgUHJveHlDb250cm9sLnRoaXMubGF5b3V0KCk7Ci0JCSAgICAvL30KLQkJfQotCQkKLQl9OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgUHJveHlDb250cm9sIGFzIGEgY2hpbGQgb2YgdGhlIGdpdmVuIHBhcmVudC4gVGhpcyBpcyBhbiBpbnZpc2libGUgZHVtbXkKLQkgKiBjb250cm9sLiBJZiBnaXZlbiBhIHRhcmdldCwgdGhlIFByb3h5Q29udHJvbCB3aWxsIHVwZGF0ZSB0aGUgYm91bmRzIG9mIHRoZSB0YXJnZXQgdG8KLQkgKiBtYXRjaCB0aGUgYm91bmRzIG9mIHRoZSBkdW1teSBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBQcm94eUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCSAgICAvLyBDcmVhdGUgdGhlIGludmlzaWJsZSBkdW1teSBjb21wb3NpdGUKLQkJY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9fQkFDS0dST1VORCk7Ci0JCWNvbnRyb2wuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQotCQkvLyBBdHRhY2ggYSBsYXlvdXQgdG8gdGhlIGR1bW15IGNvbXBvc2l0ZS4gVGhpcyBpcyB1c2VkIHRvIG1ha2UgdGhlIHByZWZlcnJlZAotCQkvLyBzaXplIG9mIHRoZSBkdW1teSBtYXRjaCB0aGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIHRhcmdldC4KLQkJY29udHJvbC5zZXRMYXlvdXQobmV3IExheW91dCgpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGxheW91dCAoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQkgICAgUHJveHlDb250cm9sLnRoaXMubGF5b3V0KCk7Ci0JCQkgICAgLy8gZG9lcyBub3RoaW5nLiBUaGUgYm91bmRzIG9mIHRoZSB0YXJnZXQgYXJlIHVwZGF0ZWQgYnkgdGhlIGNvbnRyb2xMaXN0ZW5lcgotCQkJfQotCQkJCi0JCQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUgKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKLQkJCQkgICAgLy8gTm90ZTogSWYgd2UgcmV0dXJuZWQgKDAsMCksIFNXVCB3b3VsZCBpZ25vcmUgdGhlIHJlc3VsdCBhbmQgdXNlIGEgZGVmYXVsdCB2YWx1ZS4KLQkJCQkJcmV0dXJuIG5ldyBQb2ludCgxLDEpOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdGFyZ2V0LmNvbXB1dGVTaXplKHdIaW50LCBoSGludCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gQXR0YWNoIGxpc3RlbmVycyB0byB0aGUgZHVtbXkKLQkJY29udHJvbC5hZGREaXNwb3NlTGlzdGVuZXIoZGlzcG9zZUxpc3RlbmVyKTsKLQkJY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuU2hvdywgdmlzaWJpbGl0eUxpc3RlbmVyKTsKLQkJY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuSGlkZSwgdmlzaWJpbGl0eUxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgY29udHJvbCB3aG9zZSBwb3NpdGlvbiB3aWxsIGJlIG1hbmFnZWQgYnkgdGhpcyBwcm94eQotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIGNvbnRyb2wsIG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldENvbnRyb2woQ29udHJvbCB0YXJnZXQpIHsKLQkJaWYgKHRoaXMudGFyZ2V0ICE9IHRhcmdldCkgewotCi0JCSAgICBpZiAodGhpcy50YXJnZXQgIT0gbnVsbCkgewotCQkgICAgICAgIGZvciAoQ29udHJvbCBuZXh0ID0gY29udHJvbDsgbmV4dCAhPSBjb21tb25BbmNlc3RvciAmJiBuZXh0ICE9IG51bGw7IG5leHQgPSBuZXh0LmdldFBhcmVudCgpKSB7Ci0JCSAgICAgICAgICAgIG5leHQucmVtb3ZlQ29udHJvbExpc3RlbmVyKGNvbnRyb2xMaXN0ZW5lcik7Ci0JCSAgICAgICAgfQotCQkgICAgICAgIGNvbW1vbkFuY2VzdG9yID0gbnVsbDsKLQkJICAgICAgICAKLQkJCSAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhZCBhIHRhcmdldCwgZGV0YWNoIHRoZSBkaXNwb3NlIGxpc3RlbmVyIAotCQkJICAgIC8vIChwcmV2ZW50cyBtZW1vcnkgbGVha3MgZHVlIHRvIGxpc3RlbmVycykKLQkJCQlpZiAoIXRoaXMudGFyZ2V0LmlzRGlzcG9zZWQoKSkgewotCQkJCQl0aGlzLnRhcmdldC5yZW1vdmVEaXNwb3NlTGlzdGVuZXIoZGlzcG9zZUxpc3RlbmVyKTsKLQkJCQl9CQkJCQotCQkgICAgfQotCQkJCi0JCQlpZiAodGhpcy50YXJnZXQgPT0gbnVsbCAmJiB0YXJnZXQgIT0gbnVsbCkgewotCQkJICAgIC8vIElmIHdlIGhhZCBwcmV2aW91c2x5IGZvcmNlZCB0aGUgZHVtbXkgY29udHJvbCBpbnZpc2libGUsIHJlc3RvcmUgaXRzIHZpc2liaWxpdHkKLQkJCSAgICBjb250cm9sLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQl9Ci0JCQkKLQkJCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCQkJCi0JCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCSAgICBjb21tb25BbmNlc3RvciA9IFN3dFV0aWwuZmluZENvbW1vbkFuY2VzdG9yKHRoaXMudGFyZ2V0LCBjb250cm9sKTsKLQkJICAgICAgICBmb3IgKENvbnRyb2wgbmV4dCA9IGNvbnRyb2w7IG5leHQgIT0gbnVsbCAmJiBuZXh0ICE9IGNvbW1vbkFuY2VzdG9yOyBuZXh0ID0gbmV4dC5nZXRQYXJlbnQoKSkgewotCQkgICAgICAgICAgICBuZXh0LmFkZENvbnRyb2xMaXN0ZW5lcihjb250cm9sTGlzdGVuZXIpOwotCQkgICAgICAgIH0KLQkJCSAgICAKLQkJCSAgICAvLyBNYWtlIHRoZSBuZXcgdGFyZ2V0J3MgdmlzaWJsaXR5IG1hdGNoIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBkdW1teSBjb250cm9sCi0JCQkgICAgdGFyZ2V0LnNldFZpc2libGUoY29udHJvbC5nZXRWaXNpYmxlKCkpOwotCQkJCS8vIEFkZCBhIGRpc3Bvc2UgbGlzdGVuZXIuIEVuc3VyZXMgdGhhdCB0aGUgdGFyZ2V0IGlzIGNsZWFyZWQKLQkJCQkvLyBpZiBpdCBpcyBldmVyIGRpc3Bvc2VkLgotCQkJCXRhcmdldC5hZGREaXNwb3NlTGlzdGVuZXIoZGlzcG9zZUxpc3RlbmVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkgICAgY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXQgY29udHJvbCAodGhlIGNvbnRyb2wgd2hvc2Ugc2l6ZSBpcyBiZWluZyBtYW5hZ2VkKQotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRhcmdldCBjb250cm9sIChvciBudWxsKQotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldFRhcmdldENvbnRyb2woKSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3h5IGNvbnRyb2wKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm94eSBjb250cm9sIChub3QgbnVsbCkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0JCi0JcHVibGljIENvbnRyb2wgZ2V0VGFyZ2V0KCkgewotCSAgICByZXR1cm4gdGFyZ2V0OwotCX0KLQkKLQkvKioKLQkgKiBNb3ZlcyB0aGUgdGFyZ2V0IGNvbnRyb2wgb24gdG9wIG9mIHRoZSBkdW1teSBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIGxheW91dCgpIHsKLQkJaWYgKGdldFRhcmdldENvbnRyb2woKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIENvbXB1dGUgdGhlIHVuY2xpcHBlZCBib3VuZHMgb2YgdGhlIHRhcmdldCBpbiBkaXNwbGF5IGNvb3JkaW5hdGVzCi0JCVJlY3RhbmdsZSBkaXNwbGF5Qm91bmRzID0gR2VvbWV0cnkudG9EaXNwbGF5KGNvbnRyb2wuZ2V0UGFyZW50KCksIGNvbnRyb2wuZ2V0Qm91bmRzKCkpOwotCQkKLQkJLy8gQ2xpcCB0aGUgYm91bmRzIG9mIHRoZSB0YXJnZXQgc28gdGhhdCBpdCBkb2Vzbid0IGdvIG91dHNpZGUgdGhlIGR1bW15IGNvbnRyb2wncyBwYXJlbnQKLQkJUmVjdGFuZ2xlIGNsaXBwaW5nUmVnaW9uID0gRHJhZ1V0aWwuZ2V0RGlzcGxheUJvdW5kcyhjb250cm9sLmdldFBhcmVudCgpKTsKLQkJZGlzcGxheUJvdW5kcyA9IGRpc3BsYXlCb3VuZHMuaW50ZXJzZWN0aW9uKGNsaXBwaW5nUmVnaW9uKTsKLQkJCi0JCS8vIENvbXB1dGUgdGhlIGJvdW5kcyBvZiB0aGUgdGFyZ2V0LCBpbiB0aGUgbG9jYWwgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgaXRzIHBhcmVudAotCQlSZWN0YW5nbGUgdGFyZ2V0Qm91bmRzID0gR2VvbWV0cnkudG9Db250cm9sKGdldFRhcmdldENvbnRyb2woKS5nZXRQYXJlbnQoKSwgZGlzcGxheUJvdW5kcyk7Ci0JCQotCQkvLyBNb3ZlIHRoZSB0YXJnZXQKLQkJZ2V0VGFyZ2V0Q29udHJvbCgpLnNldEJvdW5kcyh0YXJnZXRCb3VuZHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3dyYXBwZWR0YWJzL1Nob3dUb29sYmFyQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvU2hvd1Rvb2xiYXJDb250cmlidXRpb25JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OWRlMDQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvU2hvd1Rvb2xiYXJDb250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi53cmFwcGVkdGFiczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklQcmVzZW50YWJsZVBhcnQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgU2hvd1Rvb2xiYXJDb250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0JcHJpdmF0ZSBXcmFwcGVkVGFic1BhcnRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0lURU0gPSAib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzLlBhcnRMaXN0Q29udHJpYnV0aW9uSXRlbS5EQVRBX0lURU0iOyAKLQkKLQlwcml2YXRlIFNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJcHJlc2VudGF0aW9uLnNob3dUb29sYmFyKCgoTWVudUl0ZW0pZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX07Ci0JCi0JcHVibGljIFNob3dUb29sYmFyQ29udHJpYnV0aW9uSXRlbShXcmFwcGVkVGFic1BhcnRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKSB7Ci0JCXRoaXMucHJlc2VudGF0aW9uID0gcHJlc2VudGF0aW9uOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgCXN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgcHJlc2VudGF0aW9uID0gbnVsbDsKLSAgICAgICAgc2VsZWN0aW9uTGlzdGVuZXIgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmaWxsKE1lbnUgbWVudSwgaW50IGluZGV4KSB7Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLLCBpbmRleCk7Ci0JCWl0ZW0uc2V0VGV4dCgiUyZob3cgdG9vbGJhciIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJaXRlbS5zZXRTZWxlY3Rpb24ocHJlc2VudGF0aW9uLmlzU2hvd2luZ1Rvb2xiYXIoKSk7Ci0JCQotCQlJUHJlc2VudGFibGVQYXJ0IGN1cnJlbnQgPSBwcmVzZW50YXRpb24uZ2V0Q3VycmVudCgpOwotCQlpdGVtLnNldEVuYWJsZWQoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQuZ2V0VG9vbEJhcigpICE9IG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3dyYXBwZWR0YWJzL1dyYXBwZWRUYWJzUGFydFByZXNlbnRhdGlvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvV3JhcHBlZFRhYnNQYXJ0UHJlc2VudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTBmMjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvV3JhcHBlZFRhYnNQYXJ0UHJlc2VudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uLndyYXBwZWR0YWJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5HZW9tZXRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24uUHJlc2VudGF0aW9uSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVBhcnRNZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVByZXNlbnRhYmxlUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklQcmVzZW50YXRpb25TZXJpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVN0YWNrUHJlc2VudGF0aW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLlByZXNlbnRhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5TdGFja0Ryb3BSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5TdGFja1ByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50aGVtZXMuSVRoZW1lOwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFdyYXBwZWRUYWJzUGFydFByZXNlbnRhdGlvbiBleHRlbmRzIFN0YWNrUHJlc2VudGF0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIERyb3BMb2NhdGlvbiB7Ci0JCWludCBpbnNlcnRpb25Qb3NpdGlvbiA9IDA7Ci0JCUlQcmVzZW50YWJsZVBhcnQgcGFydDsKLQkJYm9vbGVhbiBiZWZvcmU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUX0RBVEEgPSAicGFydCI7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFjdGl2ZUZvY3VzID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogTWFpbiB3aWRnZXQgZm9yIHRoZSBwcmVzZW50YXRpb24KLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBwcmVzZW50YXRpb25Db250cm9sOwotCQotCS8qKgotCSAqIEN1cnJlbnRseSBzZWxlY3RlZCBwYXJ0Ci0JICovCi0JcHJpdmF0ZSBJUHJlc2VudGFibGVQYXJ0IGN1cnJlbnQ7Ci0JCi0JLyoqCi0JICogVG9vbEJhciB0aGF0IHdpbGwgYmUgdXNlZCB0byBzZWxlY3QgdGhlIGFjdGl2ZSBwcmVzZW50YWJsZSBwYXJ0IAotCSAqLwotCXByaXZhdGUgVG9vbEJhciB0b29sQmFyOwotCQotCS8qKgotCSAqIFRvb2xCYXIgdGhhdCB3aWxsIGNvbnRhaW4gY2xvc2UsIG1pbmltaXplLCBldGMuCi0JICovCi0JcHJpdmF0ZSBUb29sQmFyIHVwcGVyUmlnaHQ7Ci0JCi0JLyoqCi0JICogY2xvc2UgYnV0dG9uCi0JICovCi0JcHJpdmF0ZSBUb29sSXRlbSBjbG9zZTsKLQkKLQkvKioKLQkgKiBWaWV3IG1lbnUgYnV0dG9uCi0JICovCi0JcHJpdmF0ZSBUb29sSXRlbSB2aWV3TWVudTsKLQkKLQkvKioKLQkgKiBNaW5pbWl6ZSBidXR0b24KLQkgKi8KLQlwcml2YXRlIFRvb2xJdGVtIG1pblZpZXc7Ci0KLQkvKioKLQkgKiBTaG93L2hpZGUgdG9vbGJhciBidXR0b24KLQkgKi8KLQlwcml2YXRlIFRvb2xJdGVtIHNob3dUb29sYmFyOwotCQotCXByaXZhdGUgVG9vbEJhciB0aXRsZUljb25Ub29sYmFyOwotCQotCS8qKgotCSAqIFRpdGxlIGljb24KLQkgKi8KLQlwcml2YXRlIFRvb2xJdGVtIHRpdGxlSWNvbjsKLQkKLQlwcml2YXRlIE1lbnVNYW5hZ2VyIHN5c3RlbU1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0JcHJpdmF0ZSBWaWV3Rm9ybSBjb250ZW50QXJlYTsKLQkKLQlwcml2YXRlIExhYmVsIGNvbnRlbnREZXNjcmlwdGlvbjsKLQlwcml2YXRlIENvbXBvc2l0ZSBjb250ZW50RGVzY3JpcHRpb25XcmFwcGVyOwotCQotCXByaXZhdGUgQ29tcG9zaXRlIGNsaWVudEFyZWE7Ci0JCi0JcHJpdmF0ZSBQcm94eUNvbnRyb2wgdG9vbGJhclByb3h5OwotCQotCS8qKgotCSAqIExpc3RlbmVyIGF0dGFjaGVkIHRvIGFsbCBjaGlsZCBwYXJ0cy4gSXQgcmVzcG9uZHMgdG8gY2hhbmdlcyBpbiBwYXJ0IHByb3BlcnRpZXMKLQkgKi8KLQlwcml2YXRlIElQcm9wZXJ0eUxpc3RlbmVyIGNoaWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wZXJ0eSkgewotCQkJCi0JCQlpZiAoc291cmNlIGluc3RhbmNlb2YgSVByZXNlbnRhYmxlUGFydCkgewotCQkJCUlQcmVzZW50YWJsZVBhcnQgcGFydCA9IChJUHJlc2VudGFibGVQYXJ0KSBzb3VyY2U7Ci0JCQkJCi0JCQkJY2hpbGRQcm9wZXJ0eUNoYW5nZWQocGFydCwgcHJvcGVydHkpOwotCQkJfQotCQl9CQotCX07Ci0KLQkvKiogCi0JICogRHJhZyBsaXN0ZW5lciBmb3IgcmVnaW9ucyBvdXRzaWRlIHRoZSB0b29sYmFyCi0JICovCi0JTGlzdGVuZXIgZHJhZ0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgbG9jID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotCQkJQ29udHJvbCBjdHJsID0gKENvbnRyb2wpZXZlbnQud2lkZ2V0OwotCQkJCi0JCQlnZXRTaXRlKCkuZHJhZ1N0YXJ0KGN0cmwudG9EaXNwbGF5KGxvYyksIGZhbHNlKTsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogTGlzdGVuZXIgYXR0YWNoZWQgdG8gYWxsIHRvb2wgaXRlbXMuIEl0IHJlbW92ZXMgbGlzdGVuZXJzIGZyb20gdGhlIGFzc29jaWF0ZWQKLQkgKiBwYXJ0IHdoZW4gdGhlIHRvb2wgaXRlbSBpcyBkZXN0cm95ZWQuIFRoaXMgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuCi0JICovCi0JcHJpdmF0ZSBEaXNwb3NlTGlzdGVuZXIgdGFiRGlzcG9zZUxpc3RlbmVyID0gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7Ci0JCQkJVG9vbEl0ZW0gaXRlbSA9IChUb29sSXRlbSllLndpZGdldDsKLQkJCQkKLQkJCQlJUHJlc2VudGFibGVQYXJ0IHBhcnQgPSBnZXRQYXJ0Rm9yVGFiKGl0ZW0pOwotCQkJCQotCQkJCXBhcnQucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcihjaGlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfTsKLQkKLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIHJlc3BvbmRzIHRvIHNlbGVjdGlvbiBldmVudHMgaW4gYWxsIHRvb2wgaXRlbXMuCi0JICovCi0JU2VsZWN0aW9uQWRhcHRlciB0YWJJdGVtU2VsZWN0aW9uQWRhcHRlciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUb29sSXRlbSB0b29sSXRlbSA9IChUb29sSXRlbSkgZS53aWRnZXQ7Ci0JCQlJUHJlc2VudGFibGVQYXJ0IGl0ZW0gPSBnZXRQYXJ0Rm9yVGFiKHRvb2xJdGVtKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkvLyBDbGlja2luZyBvbiB0aGUgYWN0aXZlIHRhYiBzaG91bGQgZ2l2ZSBmb2N1cyB0byB0aGUgY3VycmVudCBwYXJ0Ci0JCQkJaWYgKGl0ZW0gPT0gY3VycmVudCkgewotCQkJCQlpdGVtLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJCWdldFNpdGUoKS5zZWxlY3RQYXJ0KGl0ZW0pOwotCQkJfQotCQkJdG9vbEl0ZW0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JfTsKLQkKLQkvKioKLQkgKiBMaXN0ZW5lciB0byBjaGFuZ2VzIG1hZGUgdG8gdGhlIGN1cnJlbnQgdGhlbWUuIFRoZSBwcmVzZW50YXRpb24gd2lsbAotCSAqIHJlZHJhdyB3aGVuIHRoZSB0aGVtZSBjaGFuZ2VzLgotCSAqLwotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGhlbWVDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsJCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmKCEgcHJlc2VudGF0aW9uQ29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQl0b29sQmFyLnNldEZvbnQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS5nZXRGb250UmVnaXN0cnkoKS5nZXQoV3JhcHBlZFRhYnNUaGVtZUNvbnN0YW50cy5UQUJfRk9OVCkpOwotCQkJCWxheW91dCgpOwotCQkJCXByZXNlbnRhdGlvbkNvbnRyb2wucmVkcmF3KCk7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXByaXZhdGUgTGlzdGVuZXIgbWVudUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgZ2xvYmFsUG9zID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCi0JCQlpZiAoZXZlbnQud2lkZ2V0ID09IHRvb2xCYXIpIHsKLQkJCQlQb2ludCBsb2NhbFBvcyA9IHRvb2xCYXIudG9Db250cm9sKGdsb2JhbFBvcyk7Ci0JCQkJVG9vbEl0ZW0gaXRlbSA9IHRvb2xCYXIuZ2V0SXRlbShsb2NhbFBvcyk7Ci0JCQkJCQotCQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkJSVByZXNlbnRhYmxlUGFydCBwYXJ0ID0gZ2V0UGFydEZvclRhYihpdGVtKTsKLQkJCQkJZ2V0U2l0ZSgpLnNlbGVjdFBhcnQocGFydCk7Ci0JCQkJCXNob3dTeXN0ZW1NZW51KGdsb2JhbFBvcyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIElQcmVzZW50YWJsZVBhcnQgcGFydCA9IGdldEN1cnJlbnQoKTsKLSAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzaG93U3lzdGVtTWVudShnbG9iYWxQb3MpOwotICAgICAgICAgICAgfQotCQl9Ci0JfTsKLQkKLQlwcml2YXRlIE1vdXNlTGlzdGVuZXIgbW91c2VMaXN0ZW5lciA9IG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQotCQkvLyBJZiB3ZSBzaW5nbGUtY2xpY2sgb24gYW4gZW1wdHkgc3BhY2Ugb24gdGhlIHRvb2xiYXIsIG1vdmUgZm9jdXMgdG8gdGhlCi0JCS8vIGFjdGl2ZSBjb250cm9sCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCVBvaW50IHAgPSBuZXcgUG9pbnQoZS54LCBlLnkpOwotCQkJCi0JCQkvLyBJZ25vcmUgZG91YmxlLWNsaWNrcyBpZiB3ZSdyZSBjdXJyZW50bHkgb3ZlciBhIHRvb2xiYXIgaXRlbQotCQkJaWYgKGlzT3ZlclRvb2xJdGVtKGUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQkJY3VycmVudC5zZXRGb2N1cygpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc092ZXJUb29sSXRlbShNb3VzZUV2ZW50IGUpIHsKLQkJCVBvaW50IHAgPSBuZXcgUG9pbnQoZS54LCBlLnkpOwotCQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpZS53aWRnZXQ7Ci0JCQkKLQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgVG9vbEJhcikgewotCQkJCVRvb2xJdGVtIGl0ZW0gPSAoKFRvb2xCYXIpY29udHJvbCkuZ2V0SXRlbShwKTsKLQkJCQkKLQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gCi0JCQkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQl9Ci0JCQotCQkvLyBJZiB3ZSBkb3VibGUtY2xpY2sgb24gdGhlIHRvb2xiYXIsIG1heGltaXplIHRoZSBwcmVzZW50YXRpb24KLQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCQotCQkJLy8gSWdub3JlIGRvdWJsZS1jbGlja3MgaWYgd2UncmUgY3VycmVudGx5IG92ZXIgYSB0b29sYmFyIGl0ZW0KLQkJCWlmIChpc092ZXJUb29sSXRlbShlKSAmJiBlLndpZGdldCA9PSB1cHBlclJpZ2h0KSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlpZiAoZ2V0U2l0ZSgpLmdldFN0YXRlKCkgPT0gSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9NQVhJTUlaRUQpIHsKLQkJCQlnZXRTaXRlKCkuc2V0U3RhdGUoSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9SRVNUT1JFRCk7Ci0JCQl9IGVsc2UgewotCQkJCWdldFNpdGUoKS5zZXRTdGF0ZShJU3RhY2tQcmVzZW50YXRpb25TaXRlLlNUQVRFX01BWElNSVpFRCk7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXByaXZhdGUgYm9vbGVhbiBzaG93SWNvbk9uVGFiczsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0lOR19XSURUSCA9IDI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV0lOR19UT09MQkFSID0gInNob3dpbmdfdG9vbGJhciI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BBUlQgPSAicGFydCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRCA9ICJpZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UT09MQkFSID0gInNob3dpbmdfdG9vbGJhciI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBiYXJlLWJvbmVzIHBhcnQgcHJlc2VudGF0aW9uLCBnaXZlbiB0aGUgcGFyZW50IGNvbXBvc2l0ZSBhbmQgCi0JICogYW4gSVN0YWNrUHJlc2VudGF0aW9uU2l0ZSBpbnRlcmZhY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCAKLQkgKiB0aGUgd29ya2JlbmNoLgotCSAqIAotCSAqIEBwYXJhbSBzdGFja1NpdGUgaW50ZXJmYWNlIHRvIHRoZSB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgV3JhcHBlZFRhYnNQYXJ0UHJlc2VudGF0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIAotCQkJSVN0YWNrUHJlc2VudGF0aW9uU2l0ZSBzdGFja1NpdGUsIGJvb2xlYW4gc2hvd0ljb25PblRhYnMpIHsKLQkJc3VwZXIoc3RhY2tTaXRlKTsJCQotCQkKLQkJdGhpcy5zaG93SWNvbk9uVGFicyA9IHNob3dJY29uT25UYWJzOwotCQkKLQkJLy8gQ3JlYXRlIGEgdG9wLWxldmVsIGNvbnRyb2wgZm9yIHRoZSBwcmVzZW50YXRpb24uCi0JCXByZXNlbnRhdGlvbkNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkKLQkJLy8gQWRkIGEgZGlzcG9zZSBsaXN0ZW5lci4gVGhpcyB3aWxsIGNhbGwgdGhlIHByZXNlbnRhdGlvbkRpc3Bvc2VkKCkKLQkJLy8gbWV0aG9kIHdoZW4gdGhlIHdpZGdldCBpcyBkZXN0cm95ZWQuCi0JCXByZXNlbnRhdGlvbkNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCXByZXNlbnRhdGlvbkRpc3Bvc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdXBwZXJSaWdodCA9IG5ldyBUb29sQmFyKHByZXNlbnRhdGlvbkNvbnRyb2wsIFNXVC5SSUdIVCB8IFNXVC5GTEFUKTsKLQkJLy9pbml0UHJlc2VudGF0aW9uV2lkZ2V0KHVwcGVyUmlnaHQpOwotCQkKLQkJdGl0bGVJY29uVG9vbGJhciA9IG5ldyBUb29sQmFyKHByZXNlbnRhdGlvbkNvbnRyb2wsIFNXVC5SSUdIVCB8IFNXVC5GTEFUKTsKLQkJdGl0bGVJY29uID0gbmV3IFRvb2xJdGVtKHRpdGxlSWNvblRvb2xiYXIsIFNXVC5QVVNIKTsKLSAgICAgICAgCi0gICAgICAgIHRpdGxlSWNvblRvb2xiYXIuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzaG93UGFuZU1lbnUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0JCXRpdGxlSWNvblRvb2xiYXIuYWRkTGlzdGVuZXIoU1dULk1lbnVEZXRlY3QsIG1lbnVMaXN0ZW5lcik7Ci0JCQotCQl0aXRsZUljb25Ub29sYmFyLnNldFZpc2libGUoIXNob3dJY29uT25UYWJzKTsKLQkJCi0JCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihwcmVzZW50YXRpb25Db250cm9sLCBTV1QuV1JBUCB8IFNXVC5SSUdIVCB8IFNXVC5GTEFUKTsKLQkJdG9vbEJhci5hZGRMaXN0ZW5lcihTV1QuTWVudURldGVjdCwgbWVudUxpc3RlbmVyKTsKLQkJdG9vbEJhci5hZGRNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotCQl0b29sQmFyLnNldEZvbnQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS5nZXRGb250UmVnaXN0cnkoKS5nZXQoV3JhcHBlZFRhYnNUaGVtZUNvbnN0YW50cy5UQUJfRk9OVCkpOwotCQkKLQkJLy8gQWRkIGRyYWcgbGlzdGVuZXIgdG8gdGhlIHRvb2xiYXIKLQkJUHJlc2VudGF0aW9uVXRpbC5hZGREcmFnTGlzdGVuZXIodG9vbEJhciwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlQb2ludCBsb2MgPSBuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJVG9vbEl0ZW0gaXRlbSA9IHRvb2xCYXIuZ2V0SXRlbShsb2MpOwotCQkJCQotCQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkJLy8gTW92ZSB0aGUgY3VycmVudCBwYXJ0Ci0JCQkJCUlQcmVzZW50YWJsZVBhcnQgZHJhZ2dlZEl0ZW0gPSBnZXRQYXJ0Rm9yVGFiKGl0ZW0pOwotCQkJCQlkcmFnZ2VkSXRlbS5zZXRGb2N1cygpOwotCQkJCQlnZXRTaXRlKCkuZHJhZ1N0YXJ0KGRyYWdnZWRJdGVtLCB0b29sQmFyLnRvRGlzcGxheShsb2MpLCBmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gTW92ZSB0aGUgc3RhY2sKLQkJCQkJZ2V0U2l0ZSgpLmRyYWdTdGFydCh0b29sQmFyLnRvRGlzcGxheShsb2MpLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0pOwotCQkKLQkJcHJlc2VudGF0aW9uQ29udHJvbC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcHJlc2VudGF0aW9uQ29udHJvbC5nZXRDbGllbnRBcmVhKCk7CQkJCi0JCQkJZS5nYy5zZXRMaW5lV2lkdGgoZ2V0Qm9yZGVyV2lkdGgoKSk7Ci0JCQkJCi0JCQkJZS5nYy5zZXRGb3JlZ3JvdW5kKGdldEJvcmRlckNvbG9yKCkpOwotCQkJCWUuZ2MuZHJhd1JlY3RhbmdsZShjbGllbnRBcmVhLngsIGNsaWVudEFyZWEueSwgY2xpZW50QXJlYS53aWR0aC0xLCBjbGllbnRBcmVhLmhlaWdodC0xKTsKLQkJCQlSZWN0YW5nbGUgY29udGVudEFyZWFCb3VuZHMgPSBjb250ZW50QXJlYS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgeXBvcyA9IGNvbnRlbnRBcmVhQm91bmRzLnkgLSAxOwotCQkJCWUuZ2MuZHJhd0xpbmUoY2xpZW50QXJlYS54LCB5cG9zLCBjbGllbnRBcmVhLnggKyBjbGllbnRBcmVhLndpZHRoIC0gMSwgeXBvcyk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCWluaXRQcmVzZW50YXRpb25XaWRnZXQocHJlc2VudGF0aW9uQ29udHJvbCk7Ci0JCQotCQljb250ZW50QXJlYSA9IG5ldyBWaWV3Rm9ybShwcmVzZW50YXRpb25Db250cm9sLCBTV1QuRkxBVCk7Ci0JCWluaXRQcmVzZW50YXRpb25XaWRnZXQoY29udGVudEFyZWEpOwotCQljb250ZW50RGVzY3JpcHRpb25XcmFwcGVyID0gbmV3IENvbXBvc2l0ZShjb250ZW50QXJlYSwgU1dULk5PTkUpOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSA0OwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMjsKLQkJY29udGVudERlc2NyaXB0aW9uV3JhcHBlci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUjsKLQkJCi0JCWNvbnRlbnREZXNjcmlwdGlvbiA9IG5ldyBMYWJlbChjb250ZW50RGVzY3JpcHRpb25XcmFwcGVyLCBTV1QuTk9ORSk7Ci0JCWluaXRQcmVzZW50YXRpb25XaWRnZXQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJY29udGVudERlc2NyaXB0aW9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY2xpZW50QXJlYSA9IG5ldyBDb21wb3NpdGUoY29udGVudEFyZWEsIFNXVC5OT05FKTsKLQkJY2xpZW50QXJlYS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCi0JCWNvbnRlbnRBcmVhLnNldENvbnRlbnQoY2xpZW50QXJlYSk7Ci0JCXRvb2xiYXJQcm94eSA9IG5ldyBQcm94eUNvbnRyb2woY29udGVudEFyZWEpOwotCQkKLQkJY3JlYXRlQnV0dG9uQmFyKCk7Ci0JCQotCQljcmVhdGVTeXN0ZW1NZW51KCk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFRoZW1lTWFuYWdlcigpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhlbWVDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0UHJlc2VudGF0aW9uV2lkZ2V0KENvbnRyb2wgdG9Jbml0aWFsaXplKSB7Ci0JCVByZXNlbnRhdGlvblV0aWwuYWRkRHJhZ0xpc3RlbmVyKHRvSW5pdGlhbGl6ZSwgZHJhZ0xpc3RlbmVyKTsKLQkJdG9Jbml0aWFsaXplLmFkZExpc3RlbmVyKFNXVC5NZW51RGV0ZWN0LCBtZW51TGlzdGVuZXIpOwotCQl0b0luaXRpYWxpemUuYWRkTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5TdGFja1ByZXNlbnRhdGlvbiNyZXN0b3JlU3RhdGUob3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JUHJlc2VudGF0aW9uU2VyaWFsaXplciwgb3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElQcmVzZW50YXRpb25TZXJpYWxpemVyIHNlcmlhbGl6ZXIsIElNZW1lbnRvIHNhdmVkU3RhdGUpIHsKLQkJSU1lbWVudG9bXSBwYXJ0cyA9IHNhdmVkU3RhdGUuZ2V0Q2hpbGRyZW4oVEFHX1BBUlQpOwotCQkKLQkJZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgcGFydHMubGVuZ3RoOyBpZHgrKykgewotCQkJU3RyaW5nIGlkID0gcGFydHNbaWR4XS5nZXRTdHJpbmcoVEFHX0lEKTsKLQkJCQotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlJUHJlc2VudGFibGVQYXJ0IHBhcnQgPSBzZXJpYWxpemVyLmdldFBhcnQoaWQpOwotCQkJCQotCQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQkJYWRkUGFydChwYXJ0LCBudWxsKTsKLQkJCQkJCi0JCQkJCUludGVnZXIgaGFzVG9vbGJhciA9IHBhcnRzW2lkeF0uZ2V0SW50ZWdlcihUQUdfVE9PTEJBUik7Ci0JCQkJCXNob3dUb29sYmFyKHBhcnQsIGhhc1Rvb2xiYXIgIT0gbnVsbCAmJiBoYXNUb29sYmFyLmludFZhbHVlKCkgIT0gMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuU3RhY2tQcmVzZW50YXRpb24jc2F2ZVN0YXRlKG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVByZXNlbnRhdGlvblNlcmlhbGl6ZXIsIG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJUHJlc2VudGF0aW9uU2VyaWFsaXplciBjb250ZXh0LCBJTWVtZW50byBtZW1lbnRvKSB7Ci0JCXN1cGVyLnNhdmVTdGF0ZShjb250ZXh0LCBtZW1lbnRvKTsKLQkJCi0JCUlQcmVzZW50YWJsZVBhcnRbXSBwYXJ0cyA9IGdldFBhcnRzKCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJlc2VudGFibGVQYXJ0IHBhcnQgPSBwYXJ0c1tpXTsKLQotCQkJSU1lbWVudG8gY2hpbGRNZW0gPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKFRBR19QQVJUKTsKLQkJCWNoaWxkTWVtLnB1dFN0cmluZyhUQUdfSUQsIGNvbnRleHQuZ2V0SWQocGFydCkpOwotCQkJY2hpbGRNZW0ucHV0SW50ZWdlcihUQUdfVE9PTEJBUiwgaXNTaG93aW5nVG9vbGJhcihwYXJ0KSA/IDEgOiAwKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSVByZXNlbnRhYmxlUGFydFtdIGdldFBhcnRzKCkgewotCQlUb29sSXRlbVtdIGl0ZW1zID0gdG9vbEJhci5nZXRJdGVtcygpOwotCQlJUHJlc2VudGFibGVQYXJ0W10gcmVzdWx0ID0gbmV3IElQcmVzZW50YWJsZVBhcnRbaXRlbXMubGVuZ3RoXTsKLQkJCi0JCWZvciAoaW50IGlkeCA9IDA7IGlkeCA8IGl0ZW1zLmxlbmd0aDsgaWR4KyspIHsKLQkJCVRvb2xJdGVtIGl0ZW0gPSBpdGVtc1tpZHhdOwotCQkJCi0JCQlJUHJlc2VudGFibGVQYXJ0IG5leHQgPSBnZXRQYXJ0Rm9yVGFiKGl0ZW0pOwotCQkJCi0JCQlyZXN1bHRbaWR4XSA9IG5leHQ7Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVTeXN0ZW1NZW51KCkgewotCQlnZXRTaXRlKCkuYWRkU3lzdGVtQWN0aW9ucyhzeXN0ZW1NZW51TWFuYWdlcik7Ci0JCXN5c3RlbU1lbnVNYW5hZ2VyLmFkZChuZXcgQ2hhbmdlU3RhY2tTdGF0ZUNvbnRyaWJ1dGlvbkl0ZW0oZ2V0U2l0ZSgpKSk7Ci0JCXN5c3RlbU1lbnVNYW5hZ2VyLmFkZChuZXcgU2hvd1Rvb2xiYXJDb250cmlidXRpb25JdGVtKHRoaXMpKTsKLQkJLy8gVGhpcyBleGFtcGxlIHByZXNlbnRhdGlvbiBpbmNsdWRlcyB0aGUgcGFydCBsaXN0IGF0IHRoZSBlbmQgb2YgdGhlIHN5c3RlbSBtZW51Ci0JCXN5c3RlbU1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlzeXN0ZW1NZW51TWFuYWdlci5hZGQobmV3IENsb3NlQ29udHJpYnV0aW9uSXRlbSh0aGlzKSk7Ci0JCXN5c3RlbU1lbnVNYW5hZ2VyLmFkZChuZXcgQ2xvc2VPdGhlcnNDb250cmlidXRpb25JdGVtKHRoaXMpKTsKLQkJc3lzdGVtTWVudU1hbmFnZXIuYWRkKG5ldyBDbG9zZUFsbENvbnRyaWJ1dGlvbkl0ZW0odGhpcykpOwotCQlzeXN0ZW1NZW51TWFuYWdlci5hZGQobmV3IFBhcnRMaXN0Q29udHJpYnV0aW9uSXRlbSh0aGlzLCBnZXRTaXRlKCkpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvbkJhcigpIHsKLQkJdmlld01lbnUgPSBuZXcgVG9vbEl0ZW0odXBwZXJSaWdodCwgU1dULlBVU0gpOwotICAgICAgICB1cHBlclJpZ2h0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgUG9pbnQgcCA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgciA9IHZpZXdNZW51LmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyLmNvbnRhaW5zKHApKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dTeXN0ZW1NZW51KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQkJdmlld01lbnUuc2V0SW1hZ2UoUHJlc2VudGF0aW9uSW1hZ2VzLmdldEltYWdlKFByZXNlbnRhdGlvbkltYWdlcy5WSUVXX01FTlUpKTsKLQkKLQkJc2hvd1Rvb2xiYXIgPSBuZXcgVG9vbEl0ZW0odXBwZXJSaWdodCwgU1dULlBVU0gpOyAgICAgICAgCi0gICAgICAgIHNob3dUb29sYmFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNob3dUb29sYmFyKCFpc1Nob3dpbmdUb29sYmFyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCQotCQlpZiAoZ2V0U2l0ZSgpLnN1cHBvcnRzU3RhdGUoSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9NSU5JTUlaRUQpKSB7Ci0JCQltaW5WaWV3ID0gbmV3IFRvb2xJdGVtKHVwcGVyUmlnaHQsIFNXVC5QVVNIKTsKLQkJCW1pblZpZXcuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoZ2V0U2l0ZSgpLmdldFN0YXRlKCkgPT0gSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9NSU5JTUlaRUQpIHsKLQkJCQkJCQlnZXRTaXRlKCkuc2V0U3RhdGUoSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9SRVNUT1JFRCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWdldFNpdGUoKS5zZXRTdGF0ZShJU3RhY2tQcmVzZW50YXRpb25TaXRlLlNUQVRFX01JTklNSVpFRCk7Ci0JCQkJCQl9CQotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCX0pOwotCQl9Ci0JCQotCQljbG9zZSA9IG5ldyBUb29sSXRlbSh1cHBlclJpZ2h0LCBTV1QuUFVTSCk7Ci0JCWNsb3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChjdXJyZW50ICE9IG51bGwpIHsKLQkJCQkJZ2V0U2l0ZSgpLmNsb3NlKG5ldyBJUHJlc2VudGFibGVQYXJ0W10ge2N1cnJlbnR9KTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCWNsb3NlLnNldEltYWdlKFByZXNlbnRhdGlvbkltYWdlcy5nZXRJbWFnZShQcmVzZW50YXRpb25JbWFnZXMuQ0xPU0VfVklFVykpOwotCQkKLQkJdXBkYXRlVG9vbGJhckltYWdlcygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlVG9vbGJhckltYWdlcygpIHsKLQkJaWYgKGlzU2hvd2luZ1Rvb2xiYXIoKSkgewotCQkJc2hvd1Rvb2xiYXIuc2V0SW1hZ2UoUHJlc2VudGF0aW9uSW1hZ2VzLmdldEltYWdlKFByZXNlbnRhdGlvbkltYWdlcy5ISURFX1RPT0xCQVIpKTsKLQkJfSBlbHNlIHsKLQkJCXNob3dUb29sYmFyLnNldEltYWdlKFByZXNlbnRhdGlvbkltYWdlcy5nZXRJbWFnZShQcmVzZW50YXRpb25JbWFnZXMuU0hPV19UT09MQkFSKSk7Ci0JCX0KLQotCQlpZiAobWluVmlldyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWluSW1hZ2UgPSAoZ2V0U2l0ZSgpLmdldFN0YXRlKCkgPT0gSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9NSU5JTUlaRUQpID8KLQkJCQkJUHJlc2VudGF0aW9uSW1hZ2VzLlJFU1RPUkVfVklFVyA6IFByZXNlbnRhdGlvbkltYWdlcy5NSU5fVklFVzsKLQkJCW1pblZpZXcuc2V0SW1hZ2UoUHJlc2VudGF0aW9uSW1hZ2VzLmdldEltYWdlKG1pbkltYWdlKSk7Ci0JCX0KLQkJCi0JCXVwcGVyUmlnaHQucGFjayh0cnVlKTsKLQkJdXBwZXJSaWdodC5yZWRyYXcoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaEJ1dHRvbkJhckVuYWJsZW1lbnQoKSB7Ci0JCWNsb3NlLnNldEVuYWJsZWQoY3VycmVudCAhPSBudWxsICYmIGdldFNpdGUoKS5pc0Nsb3NlYWJsZShjdXJyZW50KSk7Ci0JCXRpdGxlSWNvbi5zZXRFbmFibGVkKGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50LmdldE1lbnUoKSAhPSBudWxsKTsKLQkJc2hvd1Rvb2xiYXIuc2V0RW5hYmxlZChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudC5nZXRUb29sQmFyKCkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gRGlzcG9zZSB0aGUgbWFpbiBwcmVzZW50YXRpb24gd2lkZ2V0LiBUaGlzIHdpbGwgY2F1c2UgCi0JCS8vIHByZXNlbnRhdGlvbkRpc3Bvc2VkIHRvIGJlIGNhbGxlZCwgd2hpY2ggd2lsbCBkbyB0aGUgcmVhbCBjbGVhbnVwLgotCQlwcmVzZW50YXRpb25Db250cm9sLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybSBhbnkgY2xlYW51cC4gVGhpcyBtZXRob2Qgc2hvdWxkIHJlbW92ZSBhbnkgbGlzdGVuZXJzIHRoYXQgd2VyZQotCSAqIGF0dGFjaGVkIHRvIG90aGVyIG9iamVjdHMuIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgcHJlc2VudGF0aW9uCi0JICogd2lkZ2V0IGlzIGRpc3Bvc2VkLiBUaGlzIGlzIHNhZmVyIHRoYW4gY2xlYW5pbmcgdXAgaW4gdGhlIGRpc3Bvc2UoKSAKLQkgKiBtZXRob2QsIHNpbmNlIHRoaXMgY29kZSB3aWxsIHJ1biBldmVuIGlmIHNvbWUgdW51c3VhbCBjaXJjdW1zdGFuY2UgCi0JICogZGVzdHJveXMgdGhlIFNoZWxsIHdpdGhvdXQgZmlyc3QgY2FsbGluZyBkaXNwb3NlKCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlc2VudGF0aW9uRGlzcG9zZWQoKSB7Ci0JICAgIC8vIFJlbW92ZSBhbnkgbGlzdGVuZXJzIHRoYXQgd2VyZSBhdHRhY2hlZCB0byBhbnkKLQkJLy8gZ2xvYmFsIEVjbGlwc2UgcmVzb3VyY2VzLiBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBwcmV2ZW50Ci0JCS8vIG1lbW9yeSBsZWFrcy4KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoZW1lQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJvdW5kcyhSZWN0YW5nbGUgYm91bmRzKSB7Ci0JCVJlY3RhbmdsZSBuZXdCb3VuZHMgPSBHZW9tZXRyeS5jb3B5KGJvdW5kcyk7Ci0JCQotCQlpZiAobmV3Qm91bmRzLndpZHRoID09IDApIHsKLQkJCS8vIFdvcmthcm91bmQgYSBidWcgaW4gdGhlIEVjbGlwc2UgMy4wIHJlbGVhc2U6IG1pbmltaXplZCBwcmVzZW50YXRpb25zIHdpbGwgYmUKLQkJCS8vIGdpdmVuIGEgd2lkdGggb2YgMC4KLQkJCW5ld0JvdW5kcy53aWR0aCA9IHByZXNlbnRhdGlvbkNvbnRyb2wuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCX0KLQkJCi0JCWlmIChnZXRTaXRlKCkuZ2V0U3RhdGUoKSA9PSBJU3RhY2tQcmVzZW50YXRpb25TaXRlLlNUQVRFX01JTklNSVpFRCkgewotCQkJbmV3Qm91bmRzLmhlaWdodCA9IGNvbXB1dGVNaW5pbXVtU2l6ZSgpLnk7Ci0JCX0KLQkJCi0JCS8vIFNldCB0aGUgYm91bmRzIG9mIHRoZSBwcmVzZW50YXRpb24gd2lkZ2UKLQkJcHJlc2VudGF0aW9uQ29udHJvbC5zZXRCb3VuZHMobmV3Qm91bmRzKTsKLQkJCi0JCS8vIFVwZGF0ZSB0aGUgYm91bmRzIG9mIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBwYXJ0Ci0JCWxheW91dCgpOwotCX0KLQkKLQkvKioKLQkgKiBMYXkgb3V0IHRoZSBwcmVzZW50YXRpb24ncyB3aWRnZXRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxheW91dCgpIHsKLQkJCi0JCS8vIERldGVybWluZSB0aGUgaW5uZXIgYm91bmRzIG9mIHRoZSBwcmVzZW50YXRpb24KLQkJUmVjdGFuZ2xlIHByZXNlbnRhdGlvbkNsaWVudEFyZWEgPSBwcmVzZW50YXRpb25Db250cm9sLmdldENsaWVudEFyZWEoKTsKLQkJcHJlc2VudGF0aW9uQ2xpZW50QXJlYS54ICs9IGdldEJvcmRlcldpZHRoKCk7Ci0JCXByZXNlbnRhdGlvbkNsaWVudEFyZWEud2lkdGggLT0gZ2V0Qm9yZGVyV2lkdGgoKSAqIDI7Ci0JCXByZXNlbnRhdGlvbkNsaWVudEFyZWEueSArPSBnZXRCb3JkZXJXaWR0aCgpOwotCQlwcmVzZW50YXRpb25DbGllbnRBcmVhLmhlaWdodCAtPSBnZXRCb3JkZXJXaWR0aCgpICogMjsKLQkJCi0JCS8vIFBvc2l0aW9uIHRoZSB1cHBlci1yaWdodCB0b29sYmFyCi0JCVBvaW50IHVwcGVyUmlnaHRTaXplID0gdXBwZXJSaWdodC5nZXRTaXplKCk7Ci0JCWludCB1cHBlclJpZ2h0U3RhcnRYID0gcHJlc2VudGF0aW9uQ2xpZW50QXJlYS54ICsgcHJlc2VudGF0aW9uQ2xpZW50QXJlYS53aWR0aCAtIHVwcGVyUmlnaHRTaXplLnggLSBTUEFDSU5HX1dJRFRIOwotCi0JCVJlY3RhbmdsZSB1cHBlclJpZ2h0Qm91bmRzID0gbmV3IFJlY3RhbmdsZSh1cHBlclJpZ2h0U3RhcnRYLAotCQkJCXByZXNlbnRhdGlvbkNsaWVudEFyZWEueSArIFNQQUNJTkdfV0lEVEgsIHVwcGVyUmlnaHRTaXplLngsIHVwcGVyUmlnaHRTaXplLnkpOwotCQkKLQkJdXBwZXJSaWdodC5zZXRCb3VuZHModXBwZXJSaWdodEJvdW5kcyk7Ci0JCQotCQlpbnQgdGFiU3RhcnQgPSBwcmVzZW50YXRpb25DbGllbnRBcmVhLnggKyBTUEFDSU5HX1dJRFRIICsgMTsKLQkJaW50IHZlcnRpY2FsU3BhY2VSZXF1aXJlZCA9IDA7Ci0JCWlmICghc2hvd0ljb25PblRhYnMpIHsKLQkJCVBvaW50IHVwcGVyTGVmdFNpemU7Ci0KLQkJCXVwcGVyTGVmdFNpemUgPSB0aXRsZUljb25Ub29sYmFyLmdldFNpemUoKTsKLQkJCVJlY3RhbmdsZSB1cHBlckxlZnRCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHByZXNlbnRhdGlvbkNsaWVudEFyZWEueCArIFNQQUNJTkdfV0lEVEgsIAotCQkJCQlwcmVzZW50YXRpb25DbGllbnRBcmVhLnkgKyBTUEFDSU5HX1dJRFRILAotCQkJCQl1cHBlckxlZnRTaXplLngsIHVwcGVyTGVmdFNpemUueSk7Ci0JCQkKLQkJCXRpdGxlSWNvblRvb2xiYXIuc2V0Qm91bmRzKHVwcGVyTGVmdEJvdW5kcyk7Ci0KLQkJCXRhYlN0YXJ0ID0gdXBwZXJMZWZ0Qm91bmRzLnggKyB1cHBlckxlZnRCb3VuZHMud2lkdGggKyBTUEFDSU5HX1dJRFRIOwotCQkJdmVydGljYWxTcGFjZVJlcXVpcmVkID0gdXBwZXJMZWZ0U2l6ZS55OwotCQl9IAotCQkKLQkJaW50IGF2YWlsYWJsZVRhYldpZHRoID0gdXBwZXJSaWdodFN0YXJ0WCAtIHRhYlN0YXJ0IC0gU1BBQ0lOR19XSURUSDsKLQkJCi0JCVBvaW50IHRvb2xiYXJTaXplID0gdG9vbEJhci5jb21wdXRlU2l6ZShhdmFpbGFibGVUYWJXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlpbnQgbWluVG9vbGJhcldpZHRoID0gV3JhcHBlZFRhYnNVdGlsLmdldE1heGltdW1JdGVtV2lkdGgodG9vbEJhcik7Ci0JCQkJCi0JCXRvb2xCYXIuc2V0Qm91bmRzKHRhYlN0YXJ0LAotCQkJCXByZXNlbnRhdGlvbkNsaWVudEFyZWEueSArIFNQQUNJTkdfV0lEVEgsIAotCQkJCWF2YWlsYWJsZVRhYldpZHRoLCB0b29sYmFyU2l6ZS55KTsKLQkJCi0JCXZlcnRpY2FsU3BhY2VSZXF1aXJlZCA9IE1hdGgubWF4KHZlcnRpY2FsU3BhY2VSZXF1aXJlZCwgdXBwZXJSaWdodFNpemUueSk7Ci0JCXZlcnRpY2FsU3BhY2VSZXF1aXJlZCA9IE1hdGgubWF4KHZlcnRpY2FsU3BhY2VSZXF1aXJlZCwgdG9vbGJhclNpemUueSk7Ci0JCQotCQlpbnQgdmVydGljYWxPZmZzZXQgPSBwcmVzZW50YXRpb25DbGllbnRBcmVhLnkgKyB2ZXJ0aWNhbFNwYWNlUmVxdWlyZWQgKyBnZXRCb3JkZXJXaWR0aCgpICsgMiAqIFNQQUNJTkdfV0lEVEg7Ci0JCQotCQljb250ZW50QXJlYS5zZXRCb3VuZHMocHJlc2VudGF0aW9uQ2xpZW50QXJlYS54LCB2ZXJ0aWNhbE9mZnNldCwgCi0JCQkJcHJlc2VudGF0aW9uQ2xpZW50QXJlYS53aWR0aCwgcHJlc2VudGF0aW9uQ2xpZW50QXJlYS5oZWlnaHQgLSB2ZXJ0aWNhbE9mZnNldCk7Ci0JCQotCQlpZiAoaXNTaG93aW5nVG9vbGJhcigpKSB7Ci0JCQljb250ZW50QXJlYS5zZXRUb3BMZWZ0KGNvbnRlbnREZXNjcmlwdGlvbldyYXBwZXIpOwotCQkJY29udGVudEFyZWEuc2V0VG9wQ2VudGVyKHRvb2xiYXJQcm94eS5nZXRDb250cm9sKCkpOwotCQl9IGVsc2UgewotCQkJY29udGVudEFyZWEuc2V0VG9wTGVmdChudWxsKTsKLQkJCWNvbnRlbnRBcmVhLnNldFRvcENlbnRlcihudWxsKTsKLQkJfQotCQkKLQkJY29udGVudEFyZWEubGF5b3V0KCk7Ci0JCQotCQkvLyBQb3NpdGlvbiB0aGUgdmlldydzIHdpZGdldHMKLQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIGNsaWVudFJlY3RhbmdsZSA9IGNsaWVudEFyZWEuZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBjbGllbnRBcmVhU3RhcnQgPSBwcmVzZW50YXRpb25Db250cm9sLmdldFBhcmVudCgpLnRvQ29udHJvbCgKLQkJCQkJY29udGVudEFyZWEudG9EaXNwbGF5KGNsaWVudFJlY3RhbmdsZS54LCBjbGllbnRSZWN0YW5nbGUueSkpOwotCQkJCi0JCQljdXJyZW50LnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKGNsaWVudEFyZWFTdGFydC54LCAKLQkJCQkJY2xpZW50QXJlYVN0YXJ0LnksCi0JCQkJCWNsaWVudFJlY3RhbmdsZS53aWR0aCwgCi0JCQkJCWNsaWVudFJlY3RhbmdsZS5oZWlnaHQpKTsKLQkJfQotCQkKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRCb3JkZXJXaWR0aCgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0VGhlbWVNYW5hZ2VyKCkuZ2V0Q3VycmVudFRoZW1lKCkuZ2V0SW50KFdyYXBwZWRUYWJzVGhlbWVDb25zdGFudHMuQk9SREVSX1NJWkUpOwotCX0KLQotCXB1YmxpYyBQb2ludCBjb21wdXRlTWluaW11bVNpemUoKSB7Ci0JCVBvaW50IG1pblNpemUgPSBuZXcgUG9pbnQoMTAwLCAxNik7Ci0JCVBvaW50IHVwcGVyTGVmdFNpemUgPSB0aXRsZUljb25Ub29sYmFyLmdldFNpemUoKTsKLQkJUG9pbnQgdG9vbEJhclNpemUgPSB0b29sQmFyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQkKLQkJaW50IEJPUkRFUl9XSURUSCA9IGdldEJvcmRlcldpZHRoKCk7Ci0JCVBvaW50IHJlc3VsdCA9IG5ldyBQb2ludChtaW5TaXplLnggKyB1cHBlckxlZnRTaXplLnggKyAzICogU1BBQ0lOR19XSURUSCArIDIgKiBCT1JERVJfV0lEVEgsIAotCQkJCU1hdGgubWF4KE1hdGgubWF4KHVwcGVyTGVmdFNpemUueSwgbWluU2l6ZS55KSwgdG9vbEJhclNpemUueSkgCi0JCQkJKyAyICogU1BBQ0lOR19XSURUSCArIDIgKiBCT1JERVJfV0lEVEgpOwotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0JCQotCQkvLyBNYWtlIHRoZSBwcmVzZW50YXRpb24gd2lkZ2V0IHZpc2libGUKLQkJcHJlc2VudGF0aW9uQ29udHJvbC5zZXRWaXNpYmxlKGlzVmlzaWJsZSk7Ci0JCQotCQkvLyBNYWtlIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBwYXJ0IHZpc2libGUKLQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgewotCQkJY3VycmVudC5zZXRWaXNpYmxlKGlzVmlzaWJsZSk7Ci0JCQlpZiAoY3VycmVudC5nZXRUb29sQmFyKCkgIT0gbnVsbCkgewotCQkJCWN1cnJlbnQuZ2V0VG9vbEJhcigpLnNldFZpc2libGUoaXNWaXNpYmxlICYmIGlzU2hvd2luZ1Rvb2xiYXIoKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaXNWaXNpYmxlKSB7Ci0JCQkvLyBSZXN0b3JlIHRoZSBib3VuZHMgb2YgdGhlIGN1cnJlbnRseSB2aXNpYmxlIHBhcnQuIAotCQkJLy8gSVBhcnRQcmVzZW50YXRpb25zIGNhbiBiZSB1c2VkIGJ5IG11bHRpcGxlIFN0YWNrUHJlc2VudGF0aW9ucywKLQkJCS8vIGFsdGhvdWdoIG9ubHkgb25lIHN1Y2ggcHJlc2VudGF0aW9uIGlzIGV2ZXIgdmlzaWJsZSBhdCBhIHRpbWUuCi0JCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgb3RoZXIgcHJlc2VudGF0aW9uIGhhcyBjaGFuZ2VkIHRoZQotCQkJLy8gYm91bmRzIG9mIHRoZSBwYXJ0IHNpbmNlIGl0IHdhcyBsYXN0IHZpc2libGUsIHNvIHdlIG5lZWQgdG8KLQkJCS8vIHVwZGF0ZSB0aGUgcGFydCdzIGJvdW5kcyB3aGVuIHRoZSBwcmVzZW50YXRpb24gYmVjb21lcyB2aXNpYmxlLgotCQkJbGF5b3V0KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJTZWxlY3Rpb24oKSB7Ci0JCS8vIElmIHRoZXJlIHdhcyBhbiBleGlzdGluZyBwYXJ0IHNlbGVjdGVkLCBtYWtlIGl0IGludmlzaWJsZQotCQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQljdXJyZW50LnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0KLQkJY3VycmVudCA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGN1cnJlbnRQYXJ0Q2hhbmdlZCgpIHsKLQkJYm9vbGVhbiBsYXlvdXROZWVkZWQgPSBmYWxzZTsKLQkJCi0JCWlmICh0aXRsZUljb24uZ2V0SW1hZ2UoKSAhPSBjdXJyZW50LmdldFRpdGxlSW1hZ2UoKSkgewotCQkJdGl0bGVJY29uLnNldEltYWdlKGN1cnJlbnQuZ2V0VGl0bGVJbWFnZSgpKTsKLQkJCXRpdGxlSWNvbi5zZXREaXNhYmxlZEltYWdlKGN1cnJlbnQuZ2V0VGl0bGVJbWFnZSgpKTsKLQkJCXRpdGxlSWNvblRvb2xiYXIucGFjayh0cnVlKTsKLQkJCXRpdGxlSWNvblRvb2xiYXIucmVkcmF3KCk7Ci0JCQkKLQkJCWxheW91dE5lZWRlZCA9IHRydWU7Ci0JCX0KLQkJCi0JCWlmICghY29udGVudERlc2NyaXB0aW9uLmdldFRleHQoKS5lcXVhbHMoY3VycmVudC5nZXRUaXRsZVN0YXR1cygpKSkgewotCQkJY29udGVudERlc2NyaXB0aW9uLnNldFRleHQoY3VycmVudC5nZXRUaXRsZVN0YXR1cygpKTsKLQkJCQotCQkJbGF5b3V0TmVlZGVkID0gdHJ1ZTsKLQkJfQotCQkJCi0JCWlmIChjdXJyZW50LmdldFRvb2xCYXIoKSAhPSBudWxsKSB7Ci0JCQlpZiAoaXNTaG93aW5nVG9vbGJhcigpKSB7Ci0JCQkJY3VycmVudC5nZXRUb29sQmFyKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQlsYXlvdXROZWVkZWQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljdXJyZW50LmdldFRvb2xCYXIoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJCQotCQkJdG9vbGJhclByb3h5LnNldFRhcmdldENvbnRyb2woY3VycmVudC5nZXRUb29sQmFyKCkpOwotCQl9Ci0JCQotCQlpZiAobGF5b3V0TmVlZGVkKSB7Ci0JCQlsYXlvdXQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3RQYXJ0KElQcmVzZW50YWJsZVBhcnQgdG9TZWxlY3QpIHsKLQkJLy8gSWdub3JlIHJlZHVuZGFudCBzZWxlY3Rpb25zCi0JCWlmICh0b1NlbGVjdCA9PSBjdXJyZW50KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWNsZWFyU2VsZWN0aW9uKCk7Ci0JCQotCQkvLyBTZWxlY3QgdGhlIG5ldyBwYXJ0Ci0JCWN1cnJlbnQgPSB0b1NlbGVjdDsKLQkJCi0JCS8vIE9yZGVyaW5nIGlzIGltcG9ydGFudCBoZXJlLiBXZSBuZWVkIHRvIG1ha2UgdGhlIHBhcnQKLQkJLy8gdmlzaWJsZSBiZWZvcmUgdXBkYXRpbmcgaXRzIGJvdW5kcywgb3IgdGhlIGNhbGwgdG8gc2V0Qm91bmRzCi0JCS8vIG1heSBiZSBpZ25vcmVkLgotCQkKLQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgewotCQkJLy8gTWFrZSB0aGUgbmV3bHkgc2VsZWN0ZWQgcGFydCB2aXNpYmxlCi0JCQljdXJyZW50LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkKLQkJCVRvb2xJdGVtW10gaXRlbXMgPSB0b29sQmFyLmdldEl0ZW1zKCk7Ci0JCQkKLQkJCWZvciAoaW50IGlkeCA9IDA7IGlkeCA8IGl0ZW1zLmxlbmd0aDsgaWR4KyspIHsKLQkJCQlUb29sSXRlbSBpdGVtID0gaXRlbXNbaWR4XTsKLQkJCQkKLQkJCQlpdGVtLnNldFNlbGVjdGlvbihnZXRQYXJ0Rm9yVGFiKGl0ZW0pID09IGN1cnJlbnQpOwotCQkJfQotCQkJCi0JCQljdXJyZW50UGFydENoYW5nZWQoKTsKLQkJfQotCQkKLQkJcmVmcmVzaEJ1dHRvbkJhckVuYWJsZW1lbnQoKTsKLQkJdXBkYXRlVG9vbGJhckltYWdlcygpOwotCQkKLQkJLy8gVXBkYXRlIHRoZSBib3VuZHMgb2YgdGhlIG5ld2x5IHNlbGVjdGVkIHBhcnQKLQkJbGF5b3V0KCk7Ci0JfQotCi0JcHVibGljIENvbnRyb2xbXSBnZXRUYWJMaXN0KElQcmVzZW50YWJsZVBhcnQgcGFydCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2xbXSB7cGFydC5nZXRDb250cm9sKCl9OwotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb25Db250cm9sOwotCX0KLQotCXByaXZhdGUgaW50IGluZGV4T2YoSVByZXNlbnRhYmxlUGFydCBwYXJ0KSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBnZXRUYWIocGFydCk7Ci0JCQotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJCi0JCXJldHVybiB0b29sQmFyLmluZGV4T2YoaXRlbSk7IAotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQYXJ0KElQcmVzZW50YWJsZVBhcnQgbmV3UGFydCwgT2JqZWN0IGNvb2tpZSkgewotCQlpZiAoZ2V0VGFiKG5ld1BhcnQpICE9IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaW50IHBvc2l0aW9uID0gdG9vbEJhci5nZXRJdGVtQ291bnQoKTsKLQkJCi0JCS8vIElmIHRoaXMgcGFydCBpcyBiZWluZyBhZGRlZCBkdWUgdG8gYSBkcmFnL2Ryb3Agb3BlcmF0aW9uLAotCQkvLyBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgaW5zZXJ0aW9uIHBvc2l0aW9uCi0JCWlmIChjb29raWUgaW5zdGFuY2VvZiBEcm9wTG9jYXRpb24pIHsKLQkJCURyb3BMb2NhdGlvbiBsb2NhdGlvbiA9IChEcm9wTG9jYXRpb24pY29va2llOwotCQkJCi0JCQlwb3NpdGlvbiA9IGluZGV4T2YobG9jYXRpb24ucGFydCk7Ci0JCQkKLQkJCS8vIElmIHdlIGNhbid0IGZpbmQgdGhlIHRhYiwgdGhlbiBmYWxsIGJhY2sgdG8gdGhlCi0JCQkvLyBpbnNlcnRpb25Qb3NpdGlvbiBmaWVsZAotCQkJaWYgKHBvc2l0aW9uID09IC0xKSB7Ci0JCQkJcG9zaXRpb24gPSBsb2NhdGlvbi5pbnNlcnRpb25Qb3NpdGlvbjsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFsb2NhdGlvbi5iZWZvcmUpIHsKLQkJCQkJcG9zaXRpb24rKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIElnbm9yZSB0aGUgY29va2llIGZvciBub3csIHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgZHJhZy1hbmQtZHJvcCB5ZXQuCi0JCVRvb2xJdGVtIHRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5SQURJTywgcG9zaXRpb24pOwotCQkKLQkJLy8gQXR0YWNoIHRoZSBuZXdQYXJ0IHBvaW50ZXIgdG8gdGhlIFRvb2xJdGVtLiBUaGlzIGlzIHVzZWQgZm9yIGdldFBhcnRGb3JUYWIKLQkJLy8gdG8gZGV0ZXJtaW5lIHdoaWNoIHBhcnQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sIGl0ZW0KLQkJdG9vbEl0ZW0uc2V0RGF0YShQQVJUX0RBVEEsIG5ld1BhcnQpOwotCQkKLQkJLy8gQXR0YWNoIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoZSBwYXJ0LiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBUb29sSXRlbQotCQkvLyB0byByZWZsZWN0IGNoYW5nZXMgaW4gdGhlIHBhcnQuCi0JCW5ld1BhcnQuYWRkUHJvcGVydHlMaXN0ZW5lcihjaGlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJLy8gQXR0YWNoIGEgZGlzcG9zZSBsaXN0ZW5lciB0byB0aGUgaXRlbS4gVGhpcyByZW1vdmVzIHRoZSBhYm92ZSBwcm9wZXJ0eQotCQkvLyBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGUgcGFydCB3aGVuIHRoZSBpdGVtIGlzIGRlc3Ryb3llZC4gVGhpcyBwcmV2ZW50cwotCQkvLyBtZW1vcnkgbGVha3MuCi0JCXRvb2xJdGVtLmFkZERpc3Bvc2VMaXN0ZW5lcih0YWJEaXNwb3NlTGlzdGVuZXIpOwotCQkKLQkJLy8gTGlzdGVuIHRvIHNlbGVjdGlvbiBldmVudHMgaW4gdGhlIG5ldyB0b29sIGl0ZW0KLQkJdG9vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGFiSXRlbVNlbGVjdGlvbkFkYXB0ZXIpOwotCQkKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgdGFiIGZvciB0aGlzIHBhcnQKLQkJaW5pdFRhYih0b29sSXRlbSwgbmV3UGFydCk7Ci0JCQotCQlsYXlvdXQoKTsKLQkJCi0JCXRvb2xCYXIubGF5b3V0KHRydWUpOwotCQlwcmVzZW50YXRpb25Db250cm9sLnJlZHJhdygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRUYWIoVG9vbEl0ZW0gaXRlbSwgSVByZXNlbnRhYmxlUGFydCBwYXJ0KSB7Ci0JCVN0cmluZyB0YWJOYW1lID0gZ2V0VGFiVGV4dChwYXJ0KTsKLQkJCi0JCWlmICghdGFiTmFtZS5lcXVhbHMoaXRlbS5nZXRUZXh0KCkpKSB7Ci0JCQlpdGVtLnNldFRleHQodGFiTmFtZSk7Ci0JCX0KLQkJCi0JCWlmICghKHBhcnQuZ2V0VGl0bGVUb29sVGlwKCkuZXF1YWxzKGl0ZW0uZ2V0VG9vbFRpcFRleHQoKSkpKSB7Ci0JCQlpdGVtLnNldFRvb2xUaXBUZXh0KHBhcnQuZ2V0VGl0bGVUb29sVGlwKCkpOwotCQl9Ci0KLQkJaWYgKHNob3dJY29uT25UYWJzICYmIHBhcnQuZ2V0VGl0bGVJbWFnZSgpICE9IGl0ZW0uZ2V0SW1hZ2UoKSkgewotCQkJaXRlbS5zZXRJbWFnZShwYXJ0LmdldFRpdGxlSW1hZ2UoKSk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlY29yYXRlZCB0YWIgdGV4dCBmb3IgdGhlIGdpdmVuIHBhcnQuIEJ5IGRlZmF1bHQsIHdlIGF0dGFjaCAKLQkgKiBhIHN0YXIgdG8gaW5kaWNhdGUgZGlydHkgdGFicy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydCBwYXJ0IHdob3NlIHRleHQgaXMgYmVpbmcgY29tcHV0ZWQKLQkgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgdGFiIHRleHQgZm9yIHRoZSBnaXZlbiBwYXJ0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJUZXh0KElQcmVzZW50YWJsZVBhcnQgcGFydCkgewotCQlTdHJpbmcgcmVzdWx0ID0gcGFydC5nZXROYW1lKCk7Ci0JCQotCQlpZiAocGFydC5pc0RpcnR5KCkpIHsKLQkJCXJlc3VsdCA9ICIqIiArIHJlc3VsdDsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcGFydCBmcm9tIHRoZSBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkUGFydCB0aGUgcGFydCB0byByZW1vdmUgKG5vdCBudWxsKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBhcnQoSVByZXNlbnRhYmxlUGFydCBvbGRQYXJ0KSB7Ci0JCS8vIElmIHdlJ3JlIHJlbW92aW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCwgY2xlYXIgdGhlIHNlbGVjdGlvbgotCQlpZiAob2xkUGFydCA9PSBjdXJyZW50KSB7Ci0JCQljbGVhclNlbGVjdGlvbigpOwotCQkJcmVmcmVzaEJ1dHRvbkJhckVuYWJsZW1lbnQoKTsKLQkJfQotCQkKLQkJVG9vbEl0ZW0gaXRlbSA9IGdldFRhYihvbGRQYXJ0KTsKLQkJCi0JCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaWYgdGhlIHBhcnQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkCi0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gRGlzcG9zZSB0aGUgdGFiLiBUaGUgZGlzcG9zZSBsaXN0ZW5lciBvbiB0aGUgaXRlbQotCQkvLyB3aWxsIGhhbmRsZSBhbGwgdGhlIGNsZWFudXAuCi0JCWl0ZW0uZGlzcG9zZSgpOwotCQkKLQkJbGF5b3V0KCk7Ci0JCQotCQlwcmVzZW50YXRpb25Db250cm9sLnJlZHJhdygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuZXZlciBhIHByb3BlcnR5IGNoYW5nZXMgZm9yIG9uZSBvZiB0aGUgcGFydHMgaW4gdGhpcwotCSAqIHByZXNlbnRhdGlvbi4gCi0JICogCi0JICogQHBhcmFtIHBhcnQKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGlsZFByb3BlcnR5Q2hhbmdlZChJUHJlc2VudGFibGVQYXJ0IHBhcnQsIGludCBwcm9wZXJ0eSkgewotCQlUb29sSXRlbSB0b29sSXRlbSA9IGdldFRhYihwYXJ0KTsKLQkJCi0JCS8vIElmIHRoZXJlIGlzIG5vIHRhYiBmb3IgdGhpcyBwYXJ0LCBqdXN0IGlnbm9yZSB0aGUgcHJvcGVydHkgY2hhbmdlCi0JCWlmICh0b29sSXRlbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWluaXRUYWIodG9vbEl0ZW0sIHBhcnQpOwotCQkKLQkJaWYgKHBhcnQgPT0gY3VycmVudCkgewotCQkJY3VycmVudFBhcnRDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YWIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwYXJ0IG9yIG51bGwgaWYgbm9uZSAKLQkgKiAKLQkgKiBAcGFyYW0gcGFydCB0aGUgcGFydCB0byBjaGVjayBmb3IKLQkgKiBAcmV0dXJuIHRoZSB0YWIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwYXJ0IG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUb29sSXRlbSBnZXRUYWIoSVByZXNlbnRhYmxlUGFydCBwYXJ0KSB7Ci0JCVRvb2xJdGVtW10gaXRlbXMgPSB0b29sQmFyLmdldEl0ZW1zKCk7Ci0JCQotCQlmb3IgKGludCBpZHggPSAwOyBpZHggPCBpdGVtcy5sZW5ndGg7IGlkeCsrKSB7Ci0JCQlUb29sSXRlbSBpdGVtID0gaXRlbXNbaWR4XTsKLQkJCQotCQkJaWYgKGdldFBhcnRGb3JUYWIoaXRlbSkgPT0gcGFydCkgewotCQkJCXJldHVybiBpdGVtOwotCQkJfQotCQl9Ci0JCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0YWIsIG9yIG51bGwgaWYgbm9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbSB0aGUgdGFiIHRvIHF1ZXJ5Ci0JICogQHJldHVybiB0aGUgcGFydCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRhYiBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVByZXNlbnRhYmxlUGFydCBnZXRQYXJ0Rm9yVGFiKFRvb2xJdGVtIGl0ZW0pIHsKLQkJcmV0dXJuIChJUHJlc2VudGFibGVQYXJ0KWl0ZW0uZ2V0RGF0YShQQVJUX0RBVEEpOwotCX0KLQkKLQlwdWJsaWMgU3RhY2tEcm9wUmVzdWx0IGRyYWdPdmVyKENvbnRyb2wgY3VycmVudENvbnRyb2wsIFBvaW50IGxvY2F0aW9uKSB7CQkKLQkJUG9pbnQgbG9jYWxDb29yZGluYXRlcyA9IHRvb2xCYXIudG9Db250cm9sKGxvY2F0aW9uKTsKLQkJCi0JCS8vIElnbm9yZSBkcmFnIG9wZXJhdGlvbnMgdGhhdCBhcmVuJ3Qgb24gdG9wIG9mIHRoZSB0b29sYmFyIHdlJ3JlIHVzaW5nCi0JCS8vIGZvciB0YWJzLgotCQlpZiAodG9vbEJhci5nZXRDbGllbnRBcmVhKCkuY29udGFpbnMobG9jYWxDb29yZGluYXRlcykpIHsKLQkJCURyb3BMb2NhdGlvbiBkcm9wTG9jYXRpb24gPSBuZXcgRHJvcExvY2F0aW9uKCk7Ci0JCQkKLQkJCVRvb2xJdGVtIGl0ZW0gPSB0b29sQmFyLmdldEl0ZW0obG9jYWxDb29yZGluYXRlcyk7Ci0JCQkKLQkJCWlmIChpdGVtID09IG51bGwpIHsKLQkJCQlpdGVtID0gdG9vbEJhci5nZXRJdGVtKHRvb2xCYXIuZ2V0SXRlbUNvdW50KCkgLSAxKTsKLQkJCX0KLQkJCQotCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSBpdGVtLmdldEJvdW5kcygpOwotCQkJZHJvcExvY2F0aW9uLmJlZm9yZSA9IChsb2NhbENvb3JkaW5hdGVzLnggLSBpdGVtQm91bmRzLnggPCBpdGVtQm91bmRzLndpZHRoIC8gMik7Ci0JCQlkcm9wTG9jYXRpb24ucGFydCA9IGdldFBhcnRGb3JUYWIoaXRlbSk7Ci0JCQkvLyBBbHNvIHN0b3JlIHRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBwYXJ0IHdlJ3JlIGRyYWdnaW5nIG92ZXIuIFdlIHdpbGwgdXNlCi0JCQkvLyB0aGUgaW5kZXggaWYgdGhlIHBhcnQgbm8gbG9uZ2VyIGV4aXN0cyBhdCB0aGUgdGltZSB0aGUgZHJvcCBvY2N1cnMgKGllOgotCQkJLy8gaWYgd2UncmUgZHJhZ2dpbmcgYW4gaXRlbSBvdmVyIGl0c2VsZikKLQkJCWRyb3BMb2NhdGlvbi5pbnNlcnRpb25Qb3NpdGlvbiA9IHRvb2xCYXIuaW5kZXhPZihpdGVtKTsKLQkJCQotCQkJUG9pbnQgZGlzcGxheUNvb3JkaW5hdGVzID0gdG9vbEJhci50b0Rpc3BsYXkoaXRlbUJvdW5kcy54LCBpdGVtQm91bmRzLnkpOwotCQkJCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gbmV3IFJlY3RhbmdsZShkaXNwbGF5Q29vcmRpbmF0ZXMueCwgZGlzcGxheUNvb3JkaW5hdGVzLnksIAotCQkJCQk0LCBpdGVtQm91bmRzLmhlaWdodCk7Ci0JCQlpZiAoIWRyb3BMb2NhdGlvbi5iZWZvcmUpIHsKLQkJCQlib3VuZHMueCArPSBpdGVtQm91bmRzLndpZHRoOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gbmV3IFN0YWNrRHJvcFJlc3VsdChib3VuZHMsIGRyb3BMb2NhdGlvbik7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmUoaW50IG5ld1N0YXRlKSB7Ci0JCWFjdGl2ZUZvY3VzID0gKG5ld1N0YXRlID09IEFTX0FDVElWRV9GT0NVUyk7Ci0JCXByZXNlbnRhdGlvbkNvbnRyb2wucmVkcmF3KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFN0YXRlKGludCBzdGF0ZSkgewotCQl1cGRhdGVUb29sYmFySW1hZ2VzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNob3dQYW5lTWVudShQb2ludCBsb2NhdGlvbikgewotCQlpZiAoY3VycmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlQYXJ0TWVudSBtZW51ID0gY3VycmVudC5nZXRNZW51KCk7Ci0JCQotCQlpZiAobWVudSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltZW51LnNob3dNZW51KGxvY2F0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2hvd1BhbmVNZW51KCkgewkKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHRpdGxlSWNvblRvb2xiYXIuZ2V0Qm91bmRzKCk7Ci0JCVBvaW50IGxvY2F0aW9uID0gdGl0bGVJY29uVG9vbGJhci5nZXRQYXJlbnQoKS50b0Rpc3BsYXkoYm91bmRzLngsIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQotCQlzaG93UGFuZU1lbnUobG9jYXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzaG93U3lzdGVtTWVudSgpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHZpZXdNZW51LmdldEJvdW5kcygpOwotCQlQb2ludCBkaXNwbGF5UG9zID0gdmlld01lbnUuZ2V0UGFyZW50KCkudG9EaXNwbGF5KGJvdW5kcy54LCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpOwotICAgIAkKLQkJc2hvd1N5c3RlbU1lbnUoZGlzcGxheVBvcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNob3dTeXN0ZW1NZW51KFBvaW50IGRpc3BsYXlQb3MpIHsKLQkJTWVudSBhTWVudSA9IHN5c3RlbU1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KHByZXNlbnRhdGlvbkNvbnRyb2wpOwotCQlzeXN0ZW1NZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JCWFNZW51LnNldExvY2F0aW9uKGRpc3BsYXlQb3MueCwgZGlzcGxheVBvcy55KTsKLQkJYU1lbnUuc2V0VmlzaWJsZSh0cnVlKTsJCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLlN0YWNrUHJlc2VudGF0aW9uI3Nob3dQYXJ0TGlzdCgpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1BhcnRMaXN0KCkgewotCQkKLQkJLy8gVGhlIHBhcnQgbGlzdCBvcGVucyB3aGVuIHRoZSB1c2VyIHByZXNzZXMgY3RybC1lIHRvIG9wZW4gdGhlIGxpc3QKLQkJLy8gb2YgZWRpdG9ycy4gSW4gdGhpcyBwcmVzZW50YXRpb24sIHRoZSBwYXJ0IGxpc3QgaXMgcGFydCBvZiB0aGUgc3lzdGVtIG1lbnUsCi0JCS8vIHNvIG9wZW5pbmcgdGhlIHBhcnQgbGlzdCBpcyBlcXVpdmFsZW50IHRvIG9wZW5pbmcgdGhlIHN5c3RlbSBtZW51LgotCQlzaG93U3lzdGVtTWVudSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNob3dUb29sYmFyKElQcmVzZW50YWJsZVBhcnQgcGFydCwgYm9vbGVhbiBzaG91bGRTaG93KSB7Ci0JCQotCQlpZiAoc2hvdWxkU2hvdyAhPSBpc1Nob3dpbmdUb29sYmFyKHBhcnQpKSB7Ci0JCQlUb29sSXRlbSB0YWIgPSBnZXRUYWIocGFydCk7Ci0JCQl0YWIuc2V0RGF0YShTSE9XSU5HX1RPT0xCQVIsIHNob3VsZFNob3cgPyBTSE9XSU5HX1RPT0xCQVIgOiBudWxsKTsKLQkJCQotCQkJaWYgKHBhcnQgPT0gY3VycmVudCkgewotCQkJCUNvbnRyb2wgdG9vbGJhciA9IHBhcnQuZ2V0VG9vbEJhcigpOwotCQkJCWlmICh0b29sYmFyICE9IG51bGwpIHsKLQkJCQkJdG9vbGJhci5zZXRWaXNpYmxlKHNob3VsZFNob3cpOwotCQkJCX0KLQkJCQkKLQkJCQlsYXlvdXQoKTsKLQkJCi0JCQkJdXBkYXRlVG9vbGJhckltYWdlcygpOwotCQkJCQotCQkJCWlmIChnZXRTaXRlKCkuZ2V0U3RhdGUoKSA9PSBJU3RhY2tQcmVzZW50YXRpb25TaXRlLlNUQVRFX01JTklNSVpFRCkgewotCQkJCQlnZXRTaXRlKCkuc2V0U3RhdGUoSVN0YWNrUHJlc2VudGF0aW9uU2l0ZS5TVEFURV9SRVNUT1JFRCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93VG9vbGJhcihib29sZWFuIHNlbGVjdGlvbikgewotCQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQlzaG93VG9vbGJhcihjdXJyZW50LCBzZWxlY3Rpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJUHJlc2VudGFibGVQYXJ0IGdldEN1cnJlbnQoKSB7Ci0JCXJldHVybiBjdXJyZW50OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTaG93aW5nVG9vbGJhcihJUHJlc2VudGFibGVQYXJ0IHBhcnQpIHsKLQkJVG9vbEl0ZW0gdGFiID0gZ2V0VGFiKHBhcnQpOwotCQlyZXR1cm4gdGFiLmdldERhdGEoU0hPV0lOR19UT09MQkFSKSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmdUb29sYmFyKCkgewotCQlpZiAoY3VycmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBpc1Nob3dpbmdUb29sYmFyKGN1cnJlbnQpOwkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcnRzCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoSVByZXNlbnRhYmxlUGFydFtdIHBhcnRzKSB7Ci0JCWdldFNpdGUoKS5jbG9zZShwYXJ0cyk7Ci0JfQotCQotCXByaXZhdGUgQ29sb3IgZ2V0Qm9yZGVyQ29sb3IoKSB7Ci0JCUlUaGVtZSBjdXJyZW50ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKTsKLQkJaWYoYWN0aXZlRm9jdXMpIHsKLQkJCXJldHVybiBjdXJyZW50LmdldENvbG9yUmVnaXN0cnkoKS5nZXQoV3JhcHBlZFRhYnNUaGVtZUNvbnN0YW50cy5CT1JERVJfQ09MT1JfRk9DVVMpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGN1cnJlbnQuZ2V0Q29sb3JSZWdpc3RyeSgpLmdldChXcmFwcGVkVGFic1RoZW1lQ29uc3RhbnRzLkJPUkRFUl9DT0xPUl9OT0ZPQ1VTKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3dyYXBwZWR0YWJzL1dyYXBwZWRUYWJzUHJlc2VudGF0aW9uRmFjdG9yeS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvV3JhcHBlZFRhYnNQcmVzZW50YXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMjBlZGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvV3JhcHBlZFRhYnNQcmVzZW50YXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi53cmFwcGVkdGFiczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLkFic3RyYWN0UHJlc2VudGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklTdGFja1ByZXNlbnRhdGlvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5TdGFja1ByZXNlbnRhdGlvbjsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXcmFwcGVkVGFic1ByZXNlbnRhdGlvbkZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5BYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkjY3JlYXRlRWRpdG9yUHJlc2VudGF0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JU3RhY2tQcmVzZW50YXRpb25TaXRlKQotCSAqLwotCXB1YmxpYyBTdGFja1ByZXNlbnRhdGlvbiBjcmVhdGVFZGl0b3JQcmVzZW50YXRpb24oQ29tcG9zaXRlIHBhcmVudCwKLQkJCUlTdGFja1ByZXNlbnRhdGlvblNpdGUgc2l0ZSkgewotCQlyZXR1cm4gbmV3IFdyYXBwZWRUYWJzUGFydFByZXNlbnRhdGlvbihwYXJlbnQsIHNpdGUsIHRydWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5I2NyZWF0ZVZpZXdQcmVzZW50YXRpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklTdGFja1ByZXNlbnRhdGlvblNpdGUpCi0JICovCi0JcHVibGljIFN0YWNrUHJlc2VudGF0aW9uIGNyZWF0ZVZpZXdQcmVzZW50YXRpb24oQ29tcG9zaXRlIHBhcmVudCwKLQkJCUlTdGFja1ByZXNlbnRhdGlvblNpdGUgc2l0ZSkgewotCQlyZXR1cm4gbmV3IFdyYXBwZWRUYWJzUGFydFByZXNlbnRhdGlvbihwYXJlbnQsIHNpdGUsIGZhbHNlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLkFic3RyYWN0UHJlc2VudGF0aW9uRmFjdG9yeSNjcmVhdGVTdGFuZGFsb25lVmlld1ByZXNlbnRhdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVN0YWNrUHJlc2VudGF0aW9uU2l0ZSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RhY2tQcmVzZW50YXRpb24gY3JlYXRlU3RhbmRhbG9uZVZpZXdQcmVzZW50YXRpb24oQ29tcG9zaXRlIHBhcmVudCwKLQkJCUlTdGFja1ByZXNlbnRhdGlvblNpdGUgc2l0ZSwgYm9vbGVhbiBzaG93VGl0bGUpIHsKLQkJcmV0dXJuIG5ldyBXcmFwcGVkVGFic1BhcnRQcmVzZW50YXRpb24ocGFyZW50LCBzaXRlLCBmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi93cmFwcGVkdGFicy9XcmFwcGVkVGFic1RoZW1lQ29uc3RhbnRzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3ByZXNlbnRhdGlvbi93cmFwcGVkdGFicy9XcmFwcGVkVGFic1RoZW1lQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYWQ4YTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvV3JhcHBlZFRhYnNUaGVtZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24ud3JhcHBlZHRhYnM7Ci0KLS8qKgotICogVGhlbWUgcHJlc2VudGF0aW9uIGNvbnN0YW50cwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXcmFwcGVkVGFic1RoZW1lQ29uc3RhbnRzIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24ud3JhcHBlZHRhYnN0aGVtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQUJfRk9OVCA9ICJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24ud3JhcHBlZHRhYnN0aGVtZS5mb250IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJPUkRFUl9DT0xPUl9GT0NVUyA9ICJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24ud3JhcHBlZHRhYnN0aGVtZS5mb3JlZ3JvdW5kX2ZvY3VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJPUkRFUl9DT0xPUl9OT0ZPQ1VTID0gIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi53cmFwcGVkdGFic3RoZW1lLmZvcmVncm91bmRfbm9mb2N1cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBCT1JERVJfU0laRSA9ICJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcmVzZW50YXRpb24ud3JhcHBlZHRhYnN0aGVtZS5ib3JkZXJzaXplIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJlc2VudGF0aW9uL3dyYXBwZWR0YWJzL1dyYXBwZWRUYWJzVXRpbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvV3JhcHBlZFRhYnNVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOGRiMzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJlc2VudGF0aW9uL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcmVzZW50YXRpb24vd3JhcHBlZHRhYnMvV3JhcHBlZFRhYnNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByZXNlbnRhdGlvbi53cmFwcGVkdGFiczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgV3JhcHBlZFRhYnNVdGlsIHsKLQlwcml2YXRlIFdyYXBwZWRUYWJzVXRpbCgpIHsKLQkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3QgVG9vbEl0ZW0gaW4gdGhlIGdpdmVuIHRvb2xiYXIKLQkgKiAKLQkgKiBAcGFyYW0gdG9NZWFzdXJlIHRvb2xiYXIgdG8gbWVhc3VyZQotCSAqIEByZXR1cm4gdGhlIHdpZHRoIChwaXhlbHMpIG9mIHRoZSB3aWRlc3QgVG9vbEl0ZW0gaW4gdGhlIGdpdmVuIHRvb2xiYXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRNYXhpbXVtSXRlbVdpZHRoKFRvb2xCYXIgdG9NZWFzdXJlKSB7Ci0JCWludCBtYXhXaWR0aCA9IDA7Ci0JCVRvb2xJdGVtIGl0ZW1zW10gPSB0b01lYXN1cmUuZ2V0SXRlbXMoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRvb2xJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCQotCQkJbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgaXRlbS5nZXRCb3VuZHMoKS53aWR0aCk7Ci0JCX0KLQkJCi0JCXJldHVybiBtYXhXaWR0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0Ly5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMTRmYjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJFY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzZkNmQ2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamZhY2UudGV4dDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudGV4dDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLmVkaXRvcnM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLmlkZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkudmlld3M8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzlkZTA0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotI1dlZCBNYXkgMjUgMjE6MTE6MTQgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MzEyMGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVHVlIE9jdCAxOCAxNToxNToxNyBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcz48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBnZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50Ij4vKipcbiAqIEByZXR1cm4gUmV0dXJucyB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBzZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmNvbW1lbnQiIG5hbWVcPSJzZXR0ZXJjb21tZW50Ij4vKipcbiAqIEBwYXJhbSAke3BhcmFtfSBUaGUgJHtiYXJlX2ZpZWxkX25hbWV9IHRvIHNldC5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIGNvbnN0cnVjdG9ycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmNvbW1lbnQiIG5hbWVcPSJjb25zdHJ1Y3RvcmNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBKYXZhIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpbGVjb21tZW50IiBuYW1lXD0iZmlsZWNvbW1lbnQiPi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBDb3B5cmlnaHQgKGMpICR7eWVhcn0gSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG4gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcbiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwXDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbiAqXG4gKiBDb250cmlidXRvcnNcOlxuICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJmYWxzZSIgY29udGV4dFw9InR5cGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIHR5cGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnR5cGVjb21tZW50IiBuYW1lXD0idHlwZWNvbW1lbnQiPi8qKlxuICogQHNpbmNlIDMuMlxuICpcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBmaWVsZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50Ij4vKipcbiAqIFxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBub24tb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGNvbW1lbnQiIG5hbWVcPSJtZXRob2Rjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ib3ZlcnJpZGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMub3ZlcnJpZGVjb21tZW50IiBuYW1lXD0ib3ZlcnJpZGVjb21tZW50Ij4vKiAobm9uLUphdmFkb2MpXG4gKiAke3NlZV90b19vdmVycmlkZGVufVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJuZXd0eXBlX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJOZXdseSBjcmVhdGVkIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm5ld3R5cGUiIG5hbWVcPSJuZXd0eXBlIj4ke2ZpbGVjb21tZW50fVxuJHtwYWNrYWdlX2RlY2xhcmF0aW9ufVxuXG4ke3R5cGVjb21tZW50fVxuJHt0eXBlX2RlY2xhcmF0aW9ufTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2F0Y2hibG9ja19jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2F0Y2ggYmxvY2tzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNhdGNoYmxvY2siIG5hbWVcPSJjYXRjaGJsb2NrIj4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrXG4ke2V4Y2VwdGlvbl92YXJ9LnByaW50U3RhY2tUcmFjZSgpOzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIG1ldGhvZCBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rib2R5IiBuYW1lXD0ibWV0aG9kYm9keSI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YlxuJHtib2R5X3N0YXRlbWVudH08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGNvbnN0cnVjdG9yIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yYm9keSIgbmFtZVw9ImNvbnN0cnVjdG9yYm9keSI+JHtib2R5X3N0YXRlbWVudH1cbi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGdldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyYm9keSIgbmFtZVw9ImdldHRlcmJvZHkiPnJldHVybiAke2ZpZWxkfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBzZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmJvZHkiIG5hbWVcPSJzZXR0ZXJib2R5Ij4ke2ZpZWxkfSBcPSAke3BhcmFtfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNsYXNzYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2xhc3MgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2xhc3Nib2R5IiBuYW1lXD0iY2xhc3Nib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iaW50ZXJmYWNlYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgaW50ZXJmYWNlIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmludGVyZmFjZWJvZHkiIG5hbWVcPSJpbnRlcmZhY2Vib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZW51bWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGVudW0gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZW51bWJvZHkiIG5hbWVcPSJlbnVtYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImFubm90YXRpb25ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBhbm5vdGF0aW9uIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmFubm90YXRpb25ib2R5IiBuYW1lXD0iYW5ub3RhdGlvbmJvZHkiPlxuPC90ZW1wbGF0ZT48L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyY2I1NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jVHVlIEphbiAxMCAxNjo1NDoxNSBFU1QgMjAwNgotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MQotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L0FkZHJlc3MuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvQWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjkyMDNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBFeGFtcGxlIElQcm9wZXJ0eVNvdXJjZSB3aG8gaXRzZWxmIGlzIE5PVCBlZGl0YWJsZSwgYnV0IHdob3NlIGNoaWxkcmVuIGFyZS4KLSAqIFRoZSB2YWx1ZXMgb2YgdGhlIGNoaWxkcmVuIGRldGVybWluZSB0aGUgdmFsdWUgb2YgdGhlIGFkZHJlc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRyZXNzIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlIHsKLQotICAgIC8vcHJvcGVydGllcwotICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7Ci0KLSAgICBwcml2YXRlIEludGVnZXIgcHJvdmluY2U7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwb3N0YWxDb2RlOwotCi0gICAgcHJpdmF0ZSBTdHJlZXRBZGRyZXNzIHN0cmVldDsKLQotICAgIC8vUHJvcGVydHkgdW5pcXVlIGtleXMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0lEX1NUUkVFVCA9ICJBZGRyZXNzLlN0cmVldCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSURfQ0lUWSA9ICJBZGRyZXNzLkNpdHkiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0lEX1BST1ZJTkNFID0gIkFkZHJlc3MuUHJvdmluY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0lEX1BPU1RBTENPREUgPSAiQWRkcmVzcy5Qb3N0YWxDb2RlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy9Qcm9wZXJ0eSBkaXNwbGF5IGtleXMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1NUUkVFVCA9IE1lc3NhZ2VVdGlsLmdldFN0cmluZygiU3RyZWV0Iik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQ0lUWSA9IE1lc3NhZ2VVdGlsLmdldFN0cmluZygiQ2l0eSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1BST1ZJTkNFID0gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJQcm92aW5jZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1BPU1RBTENPREUgPSBNZXNzYWdlVXRpbAotICAgICAgICAgICAgLmdldFN0cmluZygiUG9zdGFsQ29kZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0RFU0NSSVBUT1JTID0gInByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvL2RlZmF1bHQgdmFsdWVzCQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmVldEFkZHJlc3MgU1RSRUVUX0RFRkFVTFQgPSBuZXcgU3RyZWV0QWRkcmVzcygpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENJVFlfREVGQVVMVCA9IE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAuZ2V0U3RyaW5nKCJ1bnNwZWNpZmllZF9jaXR5Iik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgUFJPVklOQ0VfREVGQVVMVCA9IG5ldyBJbnRlZ2VyKDApOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RBTENPREVfREVGQVVMVCA9ICJBMUIyQzMiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLwotICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIFByb3ZpbmNlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHByb3ZpbmNlVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJCcml0aXNoX0NvbHVtYmlhIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiQWxiZXJ0YSIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlNhc2thdGNoZXdhbiIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIk1hbml0b2JhIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiT250YXJpbyIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlF1ZWJlYyIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIk5ld2ZvdW5kbGFuZCIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlByaW5jZV9FZHdhcmRfSXNsYW5kIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiTm92YV9TY290aWEiKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJOZXdfQnJ1bnN3aWNrIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiWXVrb24iKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJOb3J0aF9XZXN0X1RlcnJpdG9yaWVzIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiTnVuYXZ1dCIpIH07IC8vJE5PTi1OTFMtMTMkIC8vJE5PTi1OTFMtMTIkIC8vJE5PTi1OTFMtMTEkIC8vJE5PTi1OTFMtMTAkIC8vJE5PTi1OTFMtOSQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gcHJvdmluY2VWYWx1ZXNbKChJbnRlZ2VyKSBlbGVtZW50KS5pbnRWYWx1ZSgpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIGRlc2NyaXB0b3JzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gcHJvdmluY2VWYWx1ZXM7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgZGVzY3JpcHRvcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIHByb3ZpbmNlVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkJyaXRpc2hfQ29sdW1iaWEiKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJBbGJlcnRhIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiU2Fza2F0Y2hld2FuIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiTWFuaXRvYmEiKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJPbnRhcmlvIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiUXVlYmVjIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiTmV3Zm91bmRsYW5kIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiUHJpbmNlX0Vkd2FyZF9Jc2xhbmQiKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJOb3ZhX1Njb3RpYSIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIk5ld19CcnVuc3dpY2siKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJZdWtvbiIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIk5vcnRoX1dlc3RfVGVycml0b3JpZXMiKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJOdW5hdnV0IikgfTsgLy8kTk9OLU5MUy0xMyQgLy8kTk9OLU5MUy0xMiQgLy8kTk9OLU5MUy0xMSQgLy8kTk9OLU5MUy0xMCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGVzY3JpcHRvcnMuYWRkRWxlbWVudChuZXcgUHJvcGVydHlEZXNjcmlwdG9yKFBfSURfU1RSRUVULCBQX1NUUkVFVCkpOwotICAgICAgICBkZXNjcmlwdG9ycy5hZGRFbGVtZW50KG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFBfSURfQ0lUWSwgUF9DSVRZKSk7Ci0KLSAgICAgICAgLy9Qb3N0YWxDb2RlCi0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICBQX0lEX1BPU1RBTENPREUsIFBfUE9TVEFMQ09ERSk7Ci0gICAgICAgIC8vYWRkIGN1c3RvbSB2YWxpZGF0b3IgdG8gcHJvcGVydHlEZXNjcmlwdG9yIGxpbWl0aW5nIHBvc3RhbGNvZGUKLSAgICAgICAgLy92YWx1ZXMgdG8gWFlYWVhZLCB3aGVyZSBYIGlzIGEgbGV0dGVyIGFuZCBZIGlzIGEgZGlnaXQKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yLnNldFZhbGlkYXRvcihuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoInBvc3RhbF9jb2RlX2lzX2luY29tcGxldGUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGVzdFBvc3RhbENvZGUgPSAoKFN0cmluZykgdmFsdWUpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRlc3RQb3N0YWxDb2RlLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGNoYXIgc3BhY2UgPSAnICc7Ci0KLSAgICAgICAgICAgICAgICAvL3JlbW92ZXMgd2hpdGUgc3BhY2UKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcG9zdGFsQ29kZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoNik7Ci0gICAgICAgICAgICAgICAgY2hhciBjdXJyZW50OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRlc3RQb3N0YWxDb2RlLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT0gc3BhY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3N0YWxDb2RlQnVmZmVyLmFwcGVuZChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGVzdFBvc3RhbENvZGUgPSBwb3N0YWxDb2RlQnVmZmVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAvL2NoZWNrIGZvciBwcm9wZXIgbGVuZ3RoCi0gICAgICAgICAgICAgICAgaWYgKHRlc3RQb3N0YWxDb2RlLmxlbmd0aCgpICE9IDYpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VVdGlsLmdldFN0cmluZygicG9zdGFsX2NvZGVfaXNfaW5jb21wbGV0ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9jaGVjayBmb3IgcHJvcGVyIGZvcm1hdAotICAgICAgICAgICAgICAgIGlmICh0ZXN0UG9zdGFsQ29kZS5jaGFyQXQoMSkgPCAnMCcKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRlc3RQb3N0YWxDb2RlLmNoYXJBdCgxKSA+ICc5JwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgdGVzdFBvc3RhbENvZGUuY2hhckF0KDMpIDwgJzAnCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCB0ZXN0UG9zdGFsQ29kZS5jaGFyQXQoMykgPiAnOScKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRlc3RQb3N0YWxDb2RlLmNoYXJBdCg1KSA8ICcwJwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgdGVzdFBvc3RhbENvZGUuY2hhckF0KDUpID4gJzknCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCB0ZXN0UG9zdGFsQ29kZS5jaGFyQXQoMCkgPCAnQScKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRlc3RQb3N0YWxDb2RlLmNoYXJBdCgwKSA+ICdaJwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgdGVzdFBvc3RhbENvZGUuY2hhckF0KDIpIDwgJ0EnCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCB0ZXN0UG9zdGFsQ29kZS5jaGFyQXQoMikgPiAnWicKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRlc3RQb3N0YWxDb2RlLmNoYXJBdCg0KSA8ICdBJwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgdGVzdFBvc3RhbENvZGUuY2hhckF0KDQpID4gJ1onKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vZmFpbAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9pc19hbl9pbnZhbGlkX2Zvcm1hdF9mb3JfYV9wb3N0YWxfY29kZSIsIG5ldyBPYmplY3RbXSB7IHRlc3RQb3N0YWxDb2RlIH0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9hbGwgcGFzcwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZGVzY3JpcHRvcnMuYWRkRWxlbWVudChwcm9wZXJ0eURlc2NyaXB0b3IpOwotCi0gICAgICAgIC8vCi0gICAgICAgIENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIGRlc2MgPSBuZXcgQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgUF9JRF9QUk9WSU5DRSwgUF9QUk9WSU5DRSwgcHJvdmluY2VWYWx1ZXMpOwotICAgICAgICBkZXNjLnNldExhYmVsUHJvdmlkZXIobmV3IFByb3ZpbmNlTGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgZGVzY3JpcHRvcnMuYWRkRWxlbWVudChkZXNjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRyZXNzIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBBZGRyZXNzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRkcmVzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJlZXQgdGhlIHN0cmVldCAKLSAgICAgKiBAcGFyYW0gY2l0eSB0aGUgY2l0eQotICAgICAqIEBwYXJhbSBwcm92aW5jZSB0aGUgcHJvdmluY2UKLSAgICAgKiBAcGFyYW0gcG9zdGFsQ29kZSBoYXMgdGhlIGZvcm0gWFlYWVhZOiB3aGVyZSBYIGlzIGEgbGV0dGVyIGFuZCBZIGlzIGEgZGlnaXQKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgaWYgcG9zdGFsY29kZSBub3QgaW4gYWJvdmUgZm9ybQotICAgICAqLwotICAgIHB1YmxpYyBBZGRyZXNzKFN0cmVldEFkZHJlc3Mgc3RyZWV0LCBTdHJpbmcgY2l0eSwgSW50ZWdlciBwcm92aW5jZSwKLSAgICAgICAgICAgIFN0cmluZyBwb3N0YWxDb2RlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHNldFN0cmVldChzdHJlZXQpOwotICAgICAgICBzZXRDaXR5KGNpdHkpOwotICAgICAgICBzZXRQb3N0YWxDb2RlKHBvc3RhbENvZGUpOwotICAgICAgICBzZXRQcm92aW5jZShwcm92aW5jZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2l0eQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldENpdHkoKSB7Ci0gICAgICAgIGlmIChjaXR5ID09IG51bGwpCi0gICAgICAgICAgICBjaXR5ID0gQ0lUWV9ERUZBVUxUOwotICAgICAgICByZXR1cm4gY2l0eTsKLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBTdGFuZGFyZCBBY2Nlc3NvcgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFZlY3RvciBnZXREZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkgewotICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBvc3RhbCBjb2RlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UG9zdGFsQ29kZSgpIHsKLSAgICAgICAgaWYgKHBvc3RhbENvZGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHBvc3RhbENvZGUgPSBQT1NUQUxDT0RFX0RFRkFVTFQ7Ci0gICAgICAgIHJldHVybiBwb3N0YWxDb2RlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gKElQcm9wZXJ0eURlc2NyaXB0b3JbXSkgZ2V0RGVzY3JpcHRvcnMoKS50b0FycmF5KAotICAgICAgICAgICAgICAgIG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2dldERlc2NyaXB0b3JzKCkuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRoZSA8Y29kZT5BZGRyZXNzPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMKLSAgICAgKgotICAgICAqIAkxKSBQX0NJVFkgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICogCTIpIFBfUE9TVEFMQ09ERSByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKiAgMykgUF9QUk9WSU5DRSByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKgk0KSBQX1NUUkVFVCByZXR1cm5zIFN0cmVldEFkZHJlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IHByb3BLZXkpIHsKLSAgICAgICAgaWYgKHByb3BLZXkuZXF1YWxzKFBfSURfUFJPVklOQ0UpKQotICAgICAgICAgICAgcmV0dXJuIGdldFByb3ZpbmNlKCk7Ci0gICAgICAgIGlmIChwcm9wS2V5LmVxdWFscyhQX0lEX1NUUkVFVCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0U3RyZWV0KCk7Ci0gICAgICAgIGlmIChwcm9wS2V5LmVxdWFscyhQX0lEX0NJVFkpKQotICAgICAgICAgICAgcmV0dXJuIGdldENpdHkoKTsKLSAgICAgICAgaWYgKHByb3BLZXkuZXF1YWxzKFBfSURfUE9TVEFMQ09ERSkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0UG9zdGFsQ29kZSgpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm92aW5jZQotICAgICAqLwotICAgIHByaXZhdGUgSW50ZWdlciBnZXRQcm92aW5jZSgpIHsKLSAgICAgICAgaWYgKHByb3ZpbmNlID09IG51bGwpCi0gICAgICAgICAgICBwcm92aW5jZSA9IFBST1ZJTkNFX0RFRkFVTFQ7Ci0gICAgICAgIHJldHVybiBwcm92aW5jZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJlZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyZWV0QWRkcmVzcyBnZXRTdHJlZXQoKSB7Ci0gICAgICAgIGlmIChzdHJlZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHN0cmVldCA9IG5ldyBTdHJlZXRBZGRyZXNzKCk7Ci0gICAgICAgIHJldHVybiBzdHJlZXQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBwcm9wZXJ0eSkgewotICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKFBfSURfUFJPVklOQ0UpKQotICAgICAgICAgICAgcmV0dXJuIGdldFByb3ZpbmNlKCkgIT0gUFJPVklOQ0VfREVGQVVMVDsKLSAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhQX0lEX1NUUkVFVCkpCi0gICAgICAgICAgICByZXR1cm4gIVNUUkVFVF9ERUZBVUxULmVxdWFscyhnZXRTdHJlZXQoKSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoUF9JRF9DSVRZKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRDaXR5KCkgIT0gQ0lUWV9ERUZBVUxUOwotICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKFBfSURfUE9TVEFMQ09ERSkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0UG9zdGFsQ29kZSgpICE9IFBPU1RBTENPREVfREVGQVVMVDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wZXJ0eSkgewotICAgICAgICBpZiAoUF9JRF9QT1NUQUxDT0RFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgIHNldFBvc3RhbENvZGUoUE9TVEFMQ09ERV9ERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoUF9JRF9DSVRZLmVxdWFscyhwcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgIHNldENpdHkoQ0lUWV9ERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoUF9JRF9QUk9WSU5DRS5lcXVhbHMocHJvcGVydHkpKSB7Ci0gICAgICAgICAgICBzZXRQcm92aW5jZShQUk9WSU5DRV9ERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoUF9JRF9TVFJFRVQuZXF1YWxzKHByb3BlcnR5KSkgewotICAgICAgICAgICAgc2V0U3RyZWV0KG5ldyBTdHJlZXRBZGRyZXNzKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2l0eQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRDaXR5KFN0cmluZyBuZXdDaXR5KSB7Ci0gICAgICAgIGNpdHkgPSBuZXdDaXR5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHBvc3RhbCBjb2RlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFBvc3RhbENvZGUoU3RyaW5nIG5ld1Bvc3RhbENvZGUpIHsKLSAgICAgICAgLy92YWxpZGF0aW9uIGluIElDZWxsRWRpdG9yVmFsaWRhdG9yIHJlZ2lzdGVyZWQgaW4gUHJvcGVydHlEZXNjcmlwdG9yCi0gICAgICAgIHRoaXMucG9zdGFsQ29kZSA9IG5ld1Bvc3RhbENvZGUudG9VcHBlckNhc2UoKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5JUHJvcGVydHlTb3VyY2U8L2NvZGU+IG1ldGhvZCAKLSAgICAgKiBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgU2V0YWJsZSBwcm9wZXJ0aWVzCi0gICAgICoKLSAgICAgKiAJMSkgUF9DSVRZIGV4cGVjdHMgamF2YS5sYW5nLlN0cmluZwotICAgICAqIAkyKSBQX1BPU1RBTENPREUgZXhwZWN0cyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICogIDMpIFBfUFJPVklOQ0UgZXhwZWN0cyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICogCi0gICAgICogPHA+UF9JRF9TVFJFRVQgaXMgbm90IHNldCBoZXJlIHNpbmNlIGl0IGlzIHJlZmVyZW5jZWQgCi0gICAgICogYW5kIHNldCBkaXJlY3RseSBpbiBTdHJlZXRBZGRyZXNzLgotICAgICAqIEFjY29yZGluZyB0byBJUHJvcGVydHlTb3VyY2UsIFN0cmVldEFkZHJlc3MuZ2V0RWRpdGFibGVWYWx1ZQotICAgICAqIHNob3VsZCByZXR1cm4gYSBTdHJpbmcgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhpcyBtZXRob2QgIAotICAgICAqIGFzIHRoZSB2YWx1ZS4gQSBuZXcgU3RyZWV0QWRkcmVzcyBvYmplY3Qgc2hvdWxkIHRoZW4gYmUgCi0gICAgICogY3JlYXRlZCBmcm9tIHRoZSBzdHJpbmcuIAotICAgICAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHJldHVybiB0aGUgU3RyZWV0QWRkcmVzcyAKLSAgICAgKiBkaXJlY3RseSBpbiBTdHJlZXRBZGRyZXNzLmdldEVkaXRhYmxlVmFsdWUgYW5kIGRlZmluZSBhIAotICAgICAqIGNlbGwgZWRpdG9yIGZvciB0aGUgU3RyZWV0QWRkcmVzcyBwcm9wZXJ0eS4KLSAgICAgKiBUaGlzIHdhcyBvbW1pdHRlZCBmb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eS4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChQX0lEX1BPU1RBTENPREUuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICBzZXRQb3N0YWxDb2RlKChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoUF9JRF9DSVRZLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgc2V0Q2l0eSgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFBfSURfUFJPVklOQ0UuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICBzZXRQcm92aW5jZSgoSW50ZWdlcikgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvdmluY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0UHJvdmluY2UoSW50ZWdlciBuZXdQcm92aW5jZSkgewotICAgICAgICBwcm92aW5jZSA9IG5ld1Byb3ZpbmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN0cmVldAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTdHJlZXQoU3RyZWV0QWRkcmVzcyBuZXdTdHJlZXQpIHsKLSAgICAgICAgc3RyZWV0ID0gbmV3U3RyZWV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBhcyBkaXNwbGF5ZWQgaW4gdGhlIFByb3BlcnR5IFNoZWV0LgotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBvdXRTdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjb21tYV9zcGFjZSA9ICIsICI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmluYWwgU3RyaW5nIHNwYWNlID0gIiAiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICghZ2V0U3RyZWV0KCkuZXF1YWxzKFNUUkVFVF9ERUZBVUxUKSkgewotICAgICAgICAgICAgb3V0U3RyaW5nQnVmZmVyLmFwcGVuZChnZXRTdHJlZXQoKSk7Ci0gICAgICAgICAgICBvdXRTdHJpbmdCdWZmZXIuYXBwZW5kKGNvbW1hX3NwYWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dFN0cmluZ0J1ZmZlci5hcHBlbmQoZ2V0Q2l0eSgpKTsKLSAgICAgICAgb3V0U3RyaW5nQnVmZmVyLmFwcGVuZChzcGFjZSk7Ci0gICAgICAgIG91dFN0cmluZ0J1ZmZlci5hcHBlbmQocHJvdmluY2VWYWx1ZXNbZ2V0UHJvdmluY2UoKS5pbnRWYWx1ZSgpXSk7Ci0gICAgICAgIG91dFN0cmluZ0J1ZmZlci5hcHBlbmQoY29tbWFfc3BhY2UpOwotICAgICAgICBvdXRTdHJpbmdCdWZmZXIuYXBwZW5kKGdldFBvc3RhbENvZGUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIG91dFN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvQmlydGhkYXkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvQmlydGhkYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUwZWM2ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L0JpcnRoZGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQ7Ci0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLkNvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlRleHRQcm9wZXJ0eURlc2NyaXB0b3I7Ci0KLS8qKgotICogRXhhbXBsZSBJUHJvcGVydHlTb3VyY2Ugd2hvIGl0c2VsZiBpcyBOT1QgZWRpdGFibGUsIGJ1dCB3aG9zZSBjaGlsZHJlbiBhcmUuCi0gKiBUaGUgdmFsdWVzIG9mIHRoZSBjaGlsZHJlbiBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mIHRoZSBiaXJ0aGRheS4KLSAqLwotcHVibGljIGNsYXNzIEJpcnRoZGF5IGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlIHsKLQotICAgIC8vUHJvcGVydGllcwotICAgIHByaXZhdGUgSW50ZWdlciBkYXksIG1vbnRoLCB5ZWFyOwotCi0gICAgLy9Qcm9wZXJ0eSB1bmlxdWUga2V5cwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSURfREFZID0gIkJpcnRoZGF5LmRheSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSURfTU9OVEggPSAiQmlydGhkYXkubW9udGgiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0lEX1lFQVIgPSAiQmlydGhkYXkueWVhciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vUHJvcGVydHkgZGlzcGxheSBrZXlzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9EQVkgPSBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoImRheSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX01PTlRIID0gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJtb250aCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1lFQVIgPSBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoInllYXIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy9kZWZhdWx0IHZhbHVlcwkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIERBWV9ERUZBVUxUID0gbmV3IEludGVnZXIoMSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIE1PTlRIX0RFRkFVTFQgPSBuZXcgSW50ZWdlcigxKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgWUVBUl9ERUZBVUxUID0gbmV3IEludGVnZXIoMjAwMCk7Ci0KLSAgICAvL3N0YXRpYyBkYXRlIGZvcm1hdGVyCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZUZvcm1hdCBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKLSAgICAgICAgICAgICJFRUVFLCBNTU1NIGQsIHl5eXkiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgc3RhdGljIHByaXZhdGUgY2xhc3MgRGF5TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGRheVZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIxMCIsICIxMSIsICIxMiIsICIxMyIsICIxNCIsICIxNSIsICIxNiIsICIxNyIsICIxOCIsICIxOSIsICIyMCIsICIyMSIsICIyMiIsICIyMyIsICIyNCIsICIyNSIsICIyNiIsICIyNyIsICIyOCIsICIyOSIsICIzMCIsICIzMSIgfTsgLy8kTk9OLU5MUy0zMSQgLy8kTk9OLU5MUy0zMCQgLy8kTk9OLU5MUy0yOSQgLy8kTk9OLU5MUy0yOCQgLy8kTk9OLU5MUy0yNyQgLy8kTk9OLU5MUy0yNiQgLy8kTk9OLU5MUy0yNSQgLy8kTk9OLU5MUy0yNCQgLy8kTk9OLU5MUy0yMyQgLy8kTk9OLU5MUy0yMiQgLy8kTk9OLU5MUy0yMSQgLy8kTk9OLU5MUy0yMCQgLy8kTk9OLU5MUy0xOSQgLy8kTk9OLU5MUy0xOCQgLy8kTk9OLU5MUy0xNyQgLy8kTk9OLU5MUy0xNiQgLy8kTk9OLU5MUy0xNSQgLy8kTk9OLU5MUy0xNCQgLy8kTk9OLU5MUy0xMyQgLy8kTk9OLU5MUy0xMiQgLy8kTk9OLU5MUy0xMSQgLy8kTk9OLU5MUy0xMCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBkYXlWYWx1ZXNbKChJbnRlZ2VyKSBlbGVtZW50KS5pbnRWYWx1ZSgpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIE1vbnRoTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIG1vbnRoVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJKYW51YXJ5IiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiRmVicnVhcnkiKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJNYXJjaCIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkFwcmlsIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiTWF5IiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiSnVuZSIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkp1bHkiKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJBdWd1c3QiKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJTZXB0ZW1iZXIiKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJPY3RvYmVyIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiTm92ZW1iZXIiKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJEZWNlbWJlciIpIH07IC8vJE5PTi1OTFMtMTIkIC8vJE5PTi1OTFMtMTEkIC8vJE5PTi1OTFMtMTAkIC8vJE5PTi1OTFMtOSQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gbW9udGhWYWx1ZXNbKChJbnRlZ2VyKSBlbGVtZW50KS5pbnRWYWx1ZSgpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIGRlc2NyaXB0b3JzOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIGRlc2NyaXB0b3JzID0gbmV3IFZlY3RvcigpOwotCi0gICAgICAgIC8vLwotICAgICAgICBTdHJpbmdbXSBkYXlWYWx1ZXMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIxMCIsICIxMSIsICIxMiIsICIxMyIsICIxNCIsICIxNSIsICIxNiIsICIxNyIsICIxOCIsICIxOSIsICIyMCIsICIyMSIsICIyMiIsICIyMyIsICIyNCIsICIyNSIsICIyNiIsICIyNyIsICIyOCIsICIyOSIsICIzMCIsICIzMSIgfTsgLy8kTk9OLU5MUy0zMSQgLy8kTk9OLU5MUy0zMCQgLy8kTk9OLU5MUy0yOSQgLy8kTk9OLU5MUy0yOCQgLy8kTk9OLU5MUy0yNyQgLy8kTk9OLU5MUy0yNiQgLy8kTk9OLU5MUy0yNSQgLy8kTk9OLU5MUy0yNCQgLy8kTk9OLU5MUy0yMyQgLy8kTk9OLU5MUy0yMiQgLy8kTk9OLU5MUy0yMSQgLy8kTk9OLU5MUy0yMCQgLy8kTk9OLU5MUy0xOSQgLy8kTk9OLU5MUy0xOCQgLy8kTk9OLU5MUy0xNyQgLy8kTk9OLU5MUy0xNiQgLy8kTk9OLU5MUy0xNSQgLy8kTk9OLU5MUy0xNCQgLy8kTk9OLU5MUy0xMyQgLy8kTk9OLU5MUy0xMiQgLy8kTk9OLU5MUy0xMSQgLy8kTk9OLU5MUy0xMCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgZGF5cyA9IG5ldyBDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICBQX0lEX0RBWSwgUF9EQVksIGRheVZhbHVlcyk7Ci0gICAgICAgIGRheXMuc2V0TGFiZWxQcm92aWRlcihuZXcgRGF5TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgZGVzY3JpcHRvcnMuYWRkRWxlbWVudChkYXlzKTsKLQotICAgICAgICAvLy8KLSAgICAgICAgU3RyaW5nW10gbW9udGhWYWx1ZXMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiSmFudWFyeSIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkZlYnJ1YXJ5IiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiTWFyY2giKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJBcHJpbCIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIk1heSIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkp1bmUiKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJKdWx5IiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiQXVndXN0IiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiU2VwdGVtYmVyIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiT2N0b2JlciIpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIk5vdmVtYmVyIiksIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiRGVjZW1iZXIiKSB9OyAvLyROT04tTkxTLTEyJCAvLyROT04tTkxTLTExJCAvLyROT04tTkxTLTEwJCAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotICAgICAgICBDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvciBtb250aHMgPSBuZXcgQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgUF9JRF9NT05USCwgUF9NT05USCwgbW9udGhWYWx1ZXMpOwotICAgICAgICBtb250aHMuc2V0TGFiZWxQcm92aWRlcihuZXcgTW9udGhMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICBkZXNjcmlwdG9ycy5hZGRFbGVtZW50KG1vbnRocyk7Ci0KLSAgICAgICAgLy8vCi0gICAgICAgIGRlc2NyaXB0b3JzLmFkZEVsZW1lbnQobmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoUF9JRF9ZRUFSLCBQX1lFQVIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRyZXNzIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBCaXJ0aGRheSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBBZGRyZXNzIENvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEJpcnRoZGF5KGludCBkYXksIGludCBtb250aCwgaW50IHllYXIpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0RGF5KG5ldyBJbnRlZ2VyKGRheSkpOwotICAgICAgICBzZXRNb250aChuZXcgSW50ZWdlcihtb250aCkpOwotICAgICAgICBzZXRZZWFyKG5ldyBJbnRlZ2VyKHllYXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkYXkKLSAgICAgKi8KLSAgICBwcml2YXRlIEludGVnZXIgZ2V0RGF5KCkgewotICAgICAgICBpZiAoZGF5ID09IG51bGwpCi0gICAgICAgICAgICBkYXkgPSBEQVlfREVGQVVMVDsKLSAgICAgICAgcmV0dXJuIGRheTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFuZGFyZCBBY2Nlc3NvcgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFZlY3RvciBnZXREZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkgewotICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vbnRoCi0gICAgICovCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIGdldE1vbnRoKCkgewotICAgICAgICBpZiAobW9udGggPT0gbnVsbCkKLSAgICAgICAgICAgIG1vbnRoID0gTU9OVEhfREVGQVVMVDsKLSAgICAgICAgcmV0dXJuIG1vbnRoOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gKElQcm9wZXJ0eURlc2NyaXB0b3JbXSkgZ2V0RGVzY3JpcHRvcnMoKS50b0FycmF5KAotICAgICAgICAgICAgICAgIG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2dldERlc2NyaXB0b3JzKCkuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRoZSA8Y29kZT5CaXJ0aGRheTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPklQcm9wZXJ0eVNvdXJjZTwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzCi0gICAgICoKLSAgICAgKiAJMSkgUF9EQVkgcmV0dXJucyBqYXZhLmxhbmcuSW50ZWdlcgotICAgICAqIAkyKSBQX01PTlRIIHJldHVybnMgamF2YS5sYW5nLkludGVnZXIKLSAgICAgKiAgMykgUF9ZRUFSIHJldHVybnMgamF2YS5sYW5nLkludGVnZXIKLSAgICAgKgk0KSBQX1NUUkVFVCByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IHByb3BLZXkpIHsKLSAgICAgICAgaWYgKHByb3BLZXkuZXF1YWxzKFBfSURfREFZKSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihnZXREYXkoKS5pbnRWYWx1ZSgpIC0gMSk7Ci0gICAgICAgIGlmIChwcm9wS2V5LmVxdWFscyhQX0lEX01PTlRIKSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihnZXRNb250aCgpLmludFZhbHVlKCkgLSAxKTsKLSAgICAgICAgaWYgKHByb3BLZXkuZXF1YWxzKFBfSURfWUVBUikpCi0gICAgICAgICAgICByZXR1cm4gZ2V0WWVhcigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHllYXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEludGVnZXIgZ2V0WWVhcigpIHsKLSAgICAgICAgaWYgKHllYXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHllYXIgPSBZRUFSX0RFRkFVTFQ7Ci0gICAgICAgIHJldHVybiB5ZWFyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgcHJvcGVydHkpIHsKLSAgICAgICAgaWYgKFBfSURfREFZLmVxdWFscyhwcm9wZXJ0eSkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0RGF5KCkgIT0gREFZX0RFRkFVTFQ7Ci0gICAgICAgIGlmIChQX0lEX01PTlRILmVxdWFscyhwcm9wZXJ0eSkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0TW9udGgoKSAhPSBNT05USF9ERUZBVUxUOwotICAgICAgICBpZiAoUF9JRF9ZRUFSLmVxdWFscyhwcm9wZXJ0eSkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0WWVhcigpICE9IFlFQVJfREVGQVVMVDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wZXJ0eSkgewotICAgICAgICBpZiAoUF9JRF9EQVkuZXF1YWxzKHByb3BlcnR5KSkgewotICAgICAgICAgICAgc2V0RGF5KERBWV9ERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoUF9JRF9NT05USC5lcXVhbHMocHJvcGVydHkpKSB7Ci0gICAgICAgICAgICBzZXRNb250aChNT05USF9ERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoUF9JRF9ZRUFSLmVxdWFscyhwcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgIHNldFllYXIoWUVBUl9ERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRheQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXREYXkoSW50ZWdlciBuZXdEYXkpIHsKLSAgICAgICAgZGF5ID0gbmV3RGF5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1vbnRoCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldE1vbnRoKEludGVnZXIgbmV3TW9udGgpIHsKLSAgICAgICAgbW9udGggPSBuZXdNb250aDsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPkJpcnRoZGF5PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPiBtZXRob2QgCi0gICAgICogZGVmaW5lcyB0aGUgZm9sbG93aW5nIFNldGFibGUgcHJvcGVydGllcwotICAgICAqCi0gICAgICogCTEpIFBfREFZIGV4cGVjdHMgamF2YS5sYW5nLkludGVnZXIKLSAgICAgKiAJMikgUF9NT05USCBleHBlY3RzIGphdmEubGFuZy5JbnRlZ2VyCi0gICAgICogIDMpIFBfWUVBUiBleHBlY3RzIGphdmEubGFuZy5JbnRlZ2VyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChQX0lEX0RBWS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgIHNldERheShuZXcgSW50ZWdlcigoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpICsgMSkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChQX0lEX01PTlRILmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgc2V0TW9udGgobmV3IEludGVnZXIoKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKSArIDEpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoUF9JRF9ZRUFSLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZXRZZWFyKG5ldyBJbnRlZ2VyKChTdHJpbmcpIHZhbHVlKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHNldFllYXIoWUVBUl9ERUZBVUxUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHllYXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0WWVhcihJbnRlZ2VyIG5ld1llYXIpIHsKLSAgICAgICAgeWVhciA9IG5ld1llYXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHZhbHVlIGFzIGRpc3BsYXllZCBpbiB0aGUgUHJvcGVydHkgU2hlZXQuCi0gICAgICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgRGF0ZSBiZGF5ID0gKG5ldyBHcmVnb3JpYW5DYWxlbmRhcihnZXRZZWFyKCkuaW50VmFsdWUoKSwgZ2V0TW9udGgoKQotICAgICAgICAgICAgICAgIC5pbnRWYWx1ZSgpIC0gMSwgZ2V0RGF5KCkuaW50VmFsdWUoKSkpLmdldFRpbWUoKTsKLSAgICAgICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQoYmRheSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9FbWFpbEFkZHJlc3MuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvRW1haWxBZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZGJkMjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9FbWFpbEFkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci0KLS8qKgotICogRXhhbXBsZSBJUHJvcGVydHlTb3VyY2UgaXMgZWRpdGFibGUgYW5kIHdob3NlIGNoaWxkZXJuIHByb3BlcnRpZXMgYXJlIGl0c2VsZiBub3QgZWRpdGFibGUuCi0gKiBUaGUgdmFsdWVzIG9mICJ1c2VyaWQiIGFuZCAibWFpbHNlcnZlciIgYXJlIHBhcnNlZCBmcm9tIHNldHRpbmcgImVtYWlsIgotICovCi1wdWJsaWMgY2xhc3MgRW1haWxBZGRyZXNzIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlIHsKLQotICAgIC8vUHJvcGVydHktVmFsdWUKLSAgICBwcml2YXRlIFN0cmluZyB1c2VyaWQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkb21haW47Ci0KLSAgICAvL0RlZmF1bHQgUHJvcGVydHktVmFsdWUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUklEX0RFRkFVTFQgPSBNZXNzYWdlVXRpbAotICAgICAgICAgICAgLmdldFN0cmluZygidW5rbm93blVzZXIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPTUFJTl9ERUZBVUxUID0gTWVzc2FnZVV0aWwKLSAgICAgICAgICAgIC5nZXRTdHJpbmcoInVua25vd25Eb21haW4iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy9Qcm9wZXJ0eSB1bmlxdWUga2V5cwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSURfVVNFUklEID0gIkVtYWlsQWRkcmVzcy51c2VyaWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0lEX0RPTUFJTiA9ICJFbWFpbEFkZHJlc3MuZG9tYWluIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy9Qcm9wZXJ0eSBkaXNwbGF5IGtleXMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1VTRVJJRCA9IE1lc3NhZ2VVdGlsLmdldFN0cmluZygidXNlcmlkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRE9NQUlOID0gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJkb21haW4iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy9Qcm9wZXJ0eS1EZXNjcmlwdG9ycwotICAgIHByaXZhdGUgc3RhdGljIFZlY3RvciBkZXNjcmlwdG9yczsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGRlc2NyaXB0b3JzID0gbmV3IFZlY3RvcigyLCAyKTsKLSAgICAgICAgLy9ub24tZWRpdGFibGUgY2hpbGQgcHJvcGVydGllcyAtLT4gcHJvdmlkZSBubyBlZGl0b3JzCi0gICAgICAgIGRlc2NyaXB0b3JzLmFkZEVsZW1lbnQobmV3IFByb3BlcnR5RGVzY3JpcHRvcihQX0lEX1VTRVJJRCwgUF9VU0VSSUQpKTsKLSAgICAgICAgZGVzY3JpcHRvcnMuYWRkRWxlbWVudChuZXcgUHJvcGVydHlEZXNjcmlwdG9yKFBfSURfRE9NQUlOLCBQX0RPTUFJTikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVtYWlsQWRkcmVzcyBEZWZhdWx0IENvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEVtYWlsQWRkcmVzcygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252aWVuY2UgRW1haWxBZGRyZXNzIGNvbnN0cnVjdG9yLgotICAgICAqIENhbGxzIHNldEVtYWlsQWRkcmVzcygpIHRvIHBhcnNlIGVtYWlsQWRkcmVzcwotICAgICAqIEBwYXJhbSBlbWFpbEFkZHJlc3MgamF2YS5sYW5nLlN0cmluZywgaW4gdGhlIGZvcm0gdXNlcmlkQGRvbWFpbgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgaWYgZG9lcyBub3Qgc3Vic2NyaWJlIHRvIGZvcm0KLSAgICAgKi8KLSAgICBwdWJsaWMgRW1haWxBZGRyZXNzKFN0cmluZyBlbWFpbEFkZHJlc3MpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzZXRFbWFpbEFkZHJlc3MoZW1haWxBZGRyZXNzKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3JzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIGdldERlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9tYWluCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RG9tYWluKCkgewotICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCi0gICAgICAgICAgICBkb21haW4gPSBET01BSU5fREVGQVVMVDsKLSAgICAgICAgcmV0dXJuIGRvbWFpbjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIChJUHJvcGVydHlEZXNjcmlwdG9yW10pIGdldERlc2NyaXB0b3JzKCkudG9BcnJheSgKLSAgICAgICAgICAgICAgICBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltnZXREZXNjcmlwdG9ycygpLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+RW1haWxBZGRyZXNzPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMKLSAgICAgKgotICAgICAqIAkxKSBQX1VTRVJJRCByZXR1cm5zIFN0cmluZywgdmFsdWVzIGJlZm9yZSAiQCIKLSAgICAgKgkyKSBQX0RPTUFJTiByZXR1cm5zIFN0cmluZywgdmFsdWVzIGFmdGVyICJAIgotICAgICAqCi0gICAgICogT2JzZXJ2ZSB0aGUgYXZhaWxhYmxlIHByb3BlcnRpZXMgbXVzdCBhbHdheXMgZXF1YWwgdGhvc2UgbGlzdGVkCi0gICAgICogaW4gdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wS2V5KSB7Ci0gICAgICAgIGlmIChwcm9wS2V5LmVxdWFscyhQX0lEX1VTRVJJRCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0VXNlcmlkKCk7Ci0gICAgICAgIGlmIChwcm9wS2V5LmVxdWFscyhQX0lEX0RPTUFJTikpCi0gICAgICAgICAgICByZXR1cm4gZ2V0RG9tYWluKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzZXJpZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFVzZXJpZCgpIHsKLSAgICAgICAgaWYgKHVzZXJpZCA9PSBudWxsKQotICAgICAgICAgICAgdXNlcmlkID0gVVNFUklEX0RFRkFVTFQ7Ci0gICAgICAgIHJldHVybiB1c2VyaWQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBwcm9wZXJ0eSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IHByb3BlcnR5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkb21haW4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0RG9tYWluKGphdmEubGFuZy5TdHJpbmcgbmV3RG9tYWluKSB7Ci0gICAgICAgIGRvbWFpbiA9IG5ld0RvbWFpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgZW1haWxBZGRyZXNzIGludG8gZG9tYWluIGFuZCB1c2VyaWQuIFRocm93cyBTZXRQcm9wZXJ0eVZldG9FeGNlcHRpb24KLSAgICAgKiBpZiBlbWFpbEFkZHJlc3MgZG9lcyBub3QgY29udGFpbiBhbiB1c2VyaWQgYW5kIGRvbWFpbiBzZXBlcmF0ZWQgYnkgJ0AnLgotICAgICAqCi0gICAgICogQHBhcmFtIGVtYWlsQWRkcmVzcyB0aGUgZW1haWwgYWRkcmVzcwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEVtYWlsQWRkcmVzcyhTdHJpbmcgZW1haWxBZGRyZXNzKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChlbWFpbEFkZHJlc3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiZW1haWxhZGRyZXNzX2Nhbm5vdF9iZV9zZXRfdG9fbnVsbCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbnQgaW5kZXggPSBlbWFpbEFkZHJlc3MuaW5kZXhPZignQCcpOwotICAgICAgICBpbnQgbGVuZ3RoID0gZW1haWxBZGRyZXNzLmxlbmd0aCgpOwotICAgICAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4IDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICBzZXRVc2VyaWQoZW1haWxBZGRyZXNzLnN1YnN0cmluZygwLCBpbmRleCkpOwotICAgICAgICAgICAgc2V0RG9tYWluKGVtYWlsQWRkcmVzcy5zdWJzdHJpbmcoaW5kZXggKyAxKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiaW52YWxpZF9lbWFpbF9hZGRyZXNzX2Zvcm1hdF9zaG91bGRfaGF2ZV9iZWVuX3ZhbGlkYXRlZCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+QWRkcmVzczwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPklQcm9wZXJ0eVNvdXJjZTwvY29kZT4gbWV0aG9kIAotICAgICAqIGRlZmluZXMgdGhlIGZvbGxvd2luZyBTZXRhYmxlIHByb3BlcnRpZXMKLSAgICAgKgotICAgICAqCTEpIFBfVVNFUklELCBleHBlY3RzIFN0cmluZwotICAgICAqCTIpIFBfRE9NQUlOLCBleHBlY3RzIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAobmFtZS5lcXVhbHMoUF9JRF9VU0VSSUQpKSB7Ci0gICAgICAgICAgICBzZXRVc2VyaWQoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhQX0lEX0RPTUFJTikpIHsKLSAgICAgICAgICAgIHNldERvbWFpbigoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB1c2VyaWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0VXNlcmlkKFN0cmluZyBuZXdVc2VyaWQpIHsKLSAgICAgICAgdXNlcmlkID0gbmV3VXNlcmlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBhcyBkaXNwbGF5ZWQgaW4gdGhlIFByb3BlcnR5IFNoZWV0LgotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGdldFVzZXJpZCgpKTsKLSAgICAgICAgc3RyYnVmZmVyLmFwcGVuZCgnQCcpOwotICAgICAgICBzdHJidWZmZXIuYXBwZW5kKGdldERvbWFpbigpKTsKLSAgICAgICAgcmV0dXJuIHN0cmJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvRW1haWxBZGRyZXNzVmFsaWRhdG9yLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L0VtYWlsQWRkcmVzc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzRmODJiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvRW1haWxBZGRyZXNzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci0KLS8qKgotICogVmFsaWRhdG9yIGZvciBlbWFpbCBhZGRyZXNzZXMKLSAqLwotcHVibGljIGNsYXNzIEVtYWlsQWRkcmVzc1ZhbGlkYXRvciBpbXBsZW1lbnRzIElDZWxsRWRpdG9yVmFsaWRhdG9yIHsKLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPkVtYWlsQWRkcmVzc1ZhbGlkYXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPklDZWxsRWRpdG9yVmFsaWRhdG9yPC9jb2RlPiBtZXRob2QgCi0gICAgICogZGV0ZXJtaW5lcyBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLgotICAgICAqIChjaGVjayB0byBzZWUgaWYgaXQgaXMgbm9uLW51bGwgYW5kIGNvbnRhaW5zIGFuIEApCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiZW1haWxfYWRkcmVzc19pc19pbmNvbXBsZXRlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgZW1haWxBZGRyZXNzID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICAgIGludCBpbmRleCA9IGVtYWlsQWRkcmVzcy5pbmRleE9mKCdAJyk7Ci0gICAgICAgIGludCBsZW5ndGggPSBlbWFpbEFkZHJlc3MubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChpbmRleCA+IDAgJiYgaW5kZXggPCBsZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoImVtYWlsX2FkZHJlc3NfZG9lc19ub3RfaGF2ZV9hX3ZhbGlkX2Zvcm1hdCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9Hcm91cEVsZW1lbnQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvR3JvdXBFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MjcwNTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9Hcm91cEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIEEgR3JvdXAgRWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBFbGVtZW50IGV4dGVuZHMgT3JnYW5pemF0aW9uRWxlbWVudCB7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUF9VU0VSUyA9ICJ1c2VycyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBfU1VCR1JPVVBTID0gInN1Ymdyb3VwcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBfQ09OVEVOVFMgPSAiY29udGVudHMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFZlY3RvciBzdWJHcm91cHM7Ci0KLSAgICBwcml2YXRlIFZlY3RvciB1c2VyczsKLQotICAgIC8vIG11c3QgYmUgc3luY2hyb25pemVkIHRvIGNvbnRhaW4gYm90aCB0aGUgcmVmZXJlbmNlcyBvZiBzdWJHcm91cHMgYW5kIHVzZXJzCi0gICAgcHJpdmF0ZSBWZWN0b3IgY29udGVudHM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiBDcmVhdGVzIGEgbmV3IEdyb3VwRWxlbWVudCB3aXRoaW4gdGhlIHBhc3NlZCBwYXJlbnQgR3JvdXBFbGVtZW50LAotICAgICAqIGdpdmVzIGl0IHRoZSBwYXNzZWQgbmFtZSBwcm9wZXJ0eSwgc2V0cyBJY29uLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50Ci0gICAgICovCi0gICAgcHVibGljIEdyb3VwRWxlbWVudChTdHJpbmcgbmFtZSwgR3JvdXBFbGVtZW50IHBhcmVudCkgewotICAgICAgICBzdXBlcihuYW1lLCBwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gT3JnYW5pemF0aW9uRWxlbWVudCB0byB0aGlzIEdyb3VwRWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1c2VyR3JvdXAgVGhlIE9yZ2FuaXphdGlvbiBFbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKE9yZ2FuaXphdGlvbkVsZW1lbnQgdXNlckdyb3VwKSB7Ci0gICAgICAgIGlmICh1c2VyR3JvdXAuaXNVc2VyKCkgfHwgdXNlckdyb3VwLmlzR3JvdXAoKSkgewotICAgICAgICAgICAgZ2V0Q29udGVudHMoKS5hZGQodXNlckdyb3VwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXNlckdyb3VwLmlzR3JvdXAoKSkgewotICAgICAgICAgICAgZ2V0U3ViR3JvdXBzKCkuYWRkKHVzZXJHcm91cCk7Ci0gICAgICAgICAgICAvLyBzeW5jaHJvbml6ZXMgYmFja3BvaW50ZXIgb2YgdXNlckdyb3VwOiBkZWZlbnNpdmUKLSAgICAgICAgICAgIHVzZXJHcm91cC5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVzZXJHcm91cC5pc1VzZXIoKSkgewotICAgICAgICAgICAgZ2V0VXNlcnMoKS5hZGQodXNlckdyb3VwKTsKLSAgICAgICAgICAgIC8vIHN5bmNocm9uaXplcyBiYWNrcG9pbnRlciBvZiB1c2VyR3JvdXA6IGRlZmVuc2l2ZQotICAgICAgICAgICAgdXNlckdyb3VwLnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Hcm91cEVsZW1lbnQ8L2NvZGU+Ci0gICAgICogbmVzdGVkIGluIHRoaXMgPGNvZGU+R3JvdXBFbGVtZW50PGNvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3ViIGdyb3VwCi0gICAgICovCi0gICAgcHVibGljIEdyb3VwRWxlbWVudCBjcmVhdGVTdWJHcm91cChTdHJpbmcgbmFtZSkgewotICAgICAgICBHcm91cEVsZW1lbnQgbmV3R3JvdXAgPSBuZXcgR3JvdXBFbGVtZW50KG5hbWUsIHRoaXMpOwotICAgICAgICBhZGQobmV3R3JvdXApOwotICAgICAgICByZXR1cm4gbmV3R3JvdXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Vc2VyRWxlbWVudDwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGUgbmFtZSBvZiB0aGUgdXNlciBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIFVzZXJFbGVtZW50IGNyZWF0ZVVzZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgVXNlckVsZW1lbnQgbmV3VXNlciA9IG5ldyBVc2VyRWxlbWVudChuYW1lLCB0aGlzKTsKLSAgICAgICAgYWRkKG5ld1VzZXIpOwotICAgICAgICByZXR1cm4gbmV3VXNlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGFuIE9yZ2FuaXphdGlvbkVsZW1lbnQgZnJvbSB0aGlzIEdyb3VwRWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1c2VyR3JvdXAgdGhlIE9yZ2FuaXphdGlvbiBFbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKE9yZ2FuaXphdGlvbkVsZW1lbnQgdXNlckdyb3VwKSB7Ci0gICAgICAgIGlmICh1c2VyR3JvdXAuaXNVc2VyKCkgfHwgdXNlckdyb3VwLmlzR3JvdXAoKSkgewotICAgICAgICAgICAgZ2V0Q29udGVudHMoKS5yZW1vdmUodXNlckdyb3VwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXNlckdyb3VwLmlzR3JvdXAoKSkgewotICAgICAgICAgICAgZ2V0U3ViR3JvdXBzKCkucmVtb3ZlKHVzZXJHcm91cCk7Ci0gICAgICAgICAgICAvLyBzeW5jaHJvbml6ZXMgYmFja3BvaW50ZXIgb2YgdXNlckdyb3VwOiBkZWZlbnNpdmUKLSAgICAgICAgfQotICAgICAgICBpZiAodXNlckdyb3VwLmlzVXNlcigpKSB7Ci0gICAgICAgICAgICBnZXRVc2VycygpLnJlbW92ZSh1c2VyR3JvdXApOwotICAgICAgICAgICAgLy8gc3luY2hyb25pemVzIGJhY2twb2ludGVyIG9mIHVzZXJHcm91cDogZGVmZW5zaXZlCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hBZGFwdGVyCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBnZXRDb250ZW50cygpLnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgZ2V0Q29udGVudHMoKSB7Ci0gICAgICAgIGlmIChjb250ZW50cyA9PSBudWxsKQotICAgICAgICAgICAgY29udGVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBjb250ZW50czsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1Ymdyb3VwcwotICAgICAqLwotICAgIHByaXZhdGUgVmVjdG9yIGdldFN1Ykdyb3VwcygpIHsKLSAgICAgICAgaWYgKHN1Ykdyb3VwcyA9PSBudWxsKQotICAgICAgICAgICAgc3ViR3JvdXBzID0gbmV3IFZlY3RvcigpOwotICAgICAgICByZXR1cm4gc3ViR3JvdXBzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgZ2V0VXNlcnMoKSB7Ci0gICAgICAgIGlmICh1c2VycyA9PSBudWxsKQotICAgICAgICAgICAgdXNlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIHJldHVybiB1c2VyczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE9yZ2FuaXphdGlvbkVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dyb3VwKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRGb3JlZ3JvdW5kKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFJHQiBnZXRGb3JlZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldEJhY2tncm91bmQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgUkdCIGdldEJhY2tncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9JVXNlckNvbnN0YW50cy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9JVXNlckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmQ2NmJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvSVVzZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBmb3IgdXNlIG9ubHkgd2l0aGluIHRoZQotICogcHJvcGVydHkgc2hlZXQgZXhhbXBsZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVXNlckNvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBQTFVHSU5fSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQ09OVEVOVF9PVVRMSU5FID0gUFJFRklYICsgImNvbnRlbnRfb3V0bGluZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTiA9ICJ1c3IiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L01lc3NhZ2VVdGlsLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L01lc3NhZ2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDg5MjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9NZXNzYWdlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQ7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdoaWNoIGhlbHBzIHdpdGggbWFuYWdpbmcgbWVzc2FnZXMuCi0gKi8KLS8qIHBhY2thZ2UgKi9jbGFzcyBNZXNzYWdlVXRpbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQlVORExFID0gIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZQotICAgICAgICAgICAgLmdldEJ1bmRsZShSRVNPVVJDRV9CVU5ETEUpOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlVXRpbCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIGtleSBpbgotICAgICAqIHRoZSByZXNvdXJjZSBidW5kbGUuIAotICAgICAqCi0gICAgICogQHBhcmFtIGtleSB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqIEBwYXJhbSBhcmdzIHRoZSBtZXNzYWdlIGFyZ3VtZW50cwotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugb2JqZWN0IHdpdGggdGhlIGdpdmVuIGtleSBpbgotICAgICAqIHRoZSByZXNvdXJjZSBidW5kbGUuIElmIHRoZXJlIGlzbid0IGFueSB2YWx1ZSB1bmRlcgotICAgICAqIHRoZSBnaXZlbiBrZXksIHRoZSBrZXkgaXMgcmV0dXJuZWQsIHN1cnJvdW5kZWQgYnkgJyEncy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgdGhlIHJlc291cmNlIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9OYW1lLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1OWY5Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L05hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlRleHRQcm9wZXJ0eURlc2NyaXB0b3I7Ci0KLS8qKgotICogRXhhbXBsZSBJUHJvcGVydHlTb3VyY2Ugd2hvc2UgdmFsdWUgYXMgd2VsbCBhcyBpdHMgY2hpbGRyZW4gYXJlIGVkaXRhYmxlLgotICovCi1wdWJsaWMgY2xhc3MgTmFtZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgU3RyaW5nIGluaXRpYWwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gcHJvcGVydHkgdW5pcXVlIGtleXMKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQX0lEX0ZJUlNUTkFNRSA9ICJOYW1lLkZpcnN0TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBfSURfTEFTVE5BTUUgPSAiTmFtZS5MYXN0TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBfSURfTUlERExFTkFNRSA9ICJOYW1lLk1pZGRsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIHByb3BlcnR5IGRpc3BsYXkga2V5cwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBfRklSU1ROQU1FID0gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJGaXJzdE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUF9MQVNUTkFNRSA9IE1lc3NhZ2VVdGlsLmdldFN0cmluZygiTGFzdE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUF9NSURETEVOQU1FID0gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJNaWRkbGUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gZGVmYXVsdCB2YWx1ZXMKLSAgICAvLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSVJTVE5BTUVfREVGQVVMVCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVE5BTUVfREVGQVVMVCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlERExFTkFNRV9ERUZBVUxUID0gbnVsbDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfREVTQ1JJUFRPUlMgPSAicHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBwcml2YXRlIFZlY3RvciBkZXNjcmlwdG9yczsKLSAgICBzdGF0aWMgewotICAgICAgICBkZXNjcmlwdG9ycyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZGVzY3JpcHRvcnMuYWRkRWxlbWVudChuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihQX0lEX0ZJUlNUTkFNRSwKLSAgICAgICAgICAgICAgICBQX0ZJUlNUTkFNRSkpOwotICAgICAgICBkZXNjcmlwdG9ycy5hZGRFbGVtZW50KG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFBfSURfTEFTVE5BTUUsCi0gICAgICAgICAgICAgICAgUF9MQVNUTkFNRSkpOwotICAgICAgICBkZXNjcmlwdG9ycy5hZGRFbGVtZW50KG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFBfSURfTUlERExFTkFNRSwKLSAgICAgICAgICAgICAgICBQX01JRERMRU5BTUUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IE5hbWUuCi0gICAgICogQHBhcmFtIG5hbWUgU3RyaW5nIGluIHRoZSBmb3JtICJmaXJzdG5hbWUgaW5pdGlhbCBsYXN0bmFtZSIKLSAgICAgKi8KLSAgICBwdWJsaWMgTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpbnQgaW5kZXgxLCBpbmRleDI7Ci0gICAgICAgIGluZGV4MSA9IG5hbWUuaW5kZXhPZignICcpOwotICAgICAgICBpZiAoaW5kZXgxIDwgMCkKLSAgICAgICAgICAgIGluZGV4MSA9IG5hbWUubGVuZ3RoKCk7Ci0gICAgICAgIGluZGV4MiA9IG5hbWUubGFzdEluZGV4T2YoJyAnKTsKLSAgICAgICAgaWYgKGluZGV4MiA+IDApCi0gICAgICAgICAgICBsYXN0TmFtZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4MiArIDEpOwotICAgICAgICBmaXJzdE5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleDEpOwotICAgICAgICBpZiAoaW5kZXgxIDwgaW5kZXgyKQotICAgICAgICAgICAgaW5pdGlhbCA9IG5hbWUuc3Vic3RyaW5nKGluZGV4MSArIDEsIGluZGV4Mik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRvcnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBWZWN0b3IgZ2V0RGVzY3JpcHRvcnMoKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdG9yczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBuYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluaXRpYWwKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbml0aWFsKCkgewotICAgICAgICByZXR1cm4gaW5pdGlhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXN0IG5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYXN0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gKElQcm9wZXJ0eURlc2NyaXB0b3JbXSkgZ2V0RGVzY3JpcHRvcnMoKS50b0FycmF5KAotICAgICAgICAgICAgICAgIG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2dldERlc2NyaXB0b3JzKCkuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRoZSA8Y29kZT5OYW1lPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMKLSAgICAgKgotICAgICAqIAkxKSBQX0ZJUlNUTkFNRSByZXR1cm5zIFN0cmluZywgZmlyc3RuYW1lCi0gICAgICogCTIpIFBfTEFTVE5BTUUgcmV0dXJucyBTdHJpbmcsIGxhc3RuYW1lCi0gICAgICogIDMpIFBfTUlERExFTkFNRSByZXR1cm5zIFN0cmluZywgbWlkZGxlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wS2V5KSB7Ci0gICAgICAgIGlmIChQX0lEX0ZJUlNUTkFNRS5lcXVhbHMocHJvcEtleSkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0Rmlyc3ROYW1lKCk7Ci0gICAgICAgIGlmIChQX0lEX0xBU1ROQU1FLmVxdWFscyhwcm9wS2V5KSkKLSAgICAgICAgICAgIHJldHVybiBnZXRMYXN0TmFtZSgpOwotICAgICAgICBpZiAoUF9JRF9NSURETEVOQU1FLmVxdWFscyhwcm9wS2V5KSkKLSAgICAgICAgICAgIHJldHVybiBnZXRJbml0aWFsKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChrZXkuZXF1YWxzKFBfSURfRklSU1ROQU1FKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRGaXJzdE5hbWUoKSAhPSBGSVJTVE5BTUVfREVGQVVMVDsKLSAgICAgICAgaWYgKGtleS5lcXVhbHMoUF9JRF9MQVNUTkFNRSkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0TGFzdE5hbWUoKSAhPSBMQVNUTkFNRV9ERUZBVUxUOwotICAgICAgICBpZiAoa2V5LmVxdWFscyhQX0lEX01JRERMRU5BTUUpKQotICAgICAgICAgICAgcmV0dXJuIGdldEluaXRpYWwoKSAhPSBNSURETEVOQU1FX0RFRkFVTFQ7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIElQcm9wZXJ0eVNvdXJjZSBmcmFtZXdvcmsuIFNldHMgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSAKLSAgICAgKiB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIAlJUHJvcGVydHlTb3VyY2UjcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCkKLSAgICAgKiBAcGFyYW0gCXByb3BlcnR5IAlUaGUgcHJvcGVydHkgdG8gcmVzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wZXJ0eSkgewotICAgICAgICBpZiAoUF9JRF9GSVJTVE5BTUUuZXF1YWxzKHByb3BlcnR5KSkgewotICAgICAgICAgICAgc2V0Rmlyc3ROYW1lKEZJUlNUTkFNRV9ERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoUF9JRF9MQVNUTkFNRS5lcXVhbHMocHJvcGVydHkpKSB7Ci0gICAgICAgICAgICBzZXRMYXN0TmFtZShMQVNUTkFNRV9ERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoUF9JRF9NSURETEVOQU1FLmVxdWFscyhwcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgIHNldEluaXRpYWwoTUlERExFTkFNRV9ERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpcnN0IG5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBuZXdGaXJzdE5hbWUpIHsKLSAgICAgICAgZmlyc3ROYW1lID0gbmV3Rmlyc3ROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGluaXRpYWwKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5pdGlhbChTdHJpbmcgbmV3SW5pdGlhbCkgewotICAgICAgICBpbml0aWFsID0gbmV3SW5pdGlhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsYXN0IG5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIG5ld0xhc3ROYW1lKSB7Ci0gICAgICAgIGxhc3ROYW1lID0gbmV3TGFzdE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRoZSA8Y29kZT5OYW1lPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPiBtZXRob2QgCi0gICAgICogZGVmaW5lcyB0aGUgZm9sbG93aW5nIFNldGFibGUgcHJvcGVydGllcwotICAgICAqCi0gICAgICoJMSkgUF9GSVJTVCwgZXhwZWN0cyBTdHJpbmcsIHNldHMgdGhlIGZpcnN0bmFtZSBvZiB0aGlzIE9yZ2FuaXphdGlvbkVsZW1lbnQKLSAgICAgKiAgMikgUF9NSURETEVOQU1FLCBleHBlY3RzIFN0cmluZywgc2V0cyBtaWRkbGVuYW1lIG9mIHRoaXMgT3JnYW5pemF0aW9uRWxlbWVudAotICAgICAqICAzKSBQX0xBU1ROQU1FLCBleHBlY3RzIFN0cmluZywgc2V0cyBsYXN0bmFtZSBvZiB0aGlzIE9yZ2FuaXphdGlvbkVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wTmFtZSwgT2JqZWN0IHZhbCkgewotICAgICAgICBpZiAoUF9JRF9GSVJTVE5BTUUuZXF1YWxzKHByb3BOYW1lKSkgewotICAgICAgICAgICAgc2V0Rmlyc3ROYW1lKChTdHJpbmcpIHZhbCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFBfSURfTEFTVE5BTUUuZXF1YWxzKHByb3BOYW1lKSkgewotICAgICAgICAgICAgc2V0TGFzdE5hbWUoKFN0cmluZykgdmFsKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoUF9JRF9NSURETEVOQU1FLmVxdWFscyhwcm9wTmFtZSkpIHsKLSAgICAgICAgICAgIHNldEluaXRpYWwoKFN0cmluZykgdmFsKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBhcyBkaXNwbGF5ZWQgaW4gdGhlIFByb3BlcnR5IFNoZWV0LiBXaWxsIG5vdCBwcmludCBkZWZhdWx0IHZhbHVlcwotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBvdXRTdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmIChnZXRGaXJzdE5hbWUoKSAhPSBGSVJTVE5BTUVfREVGQVVMVCkgewotICAgICAgICAgICAgb3V0U3RyaW5nQnVmZmVyLmFwcGVuZChnZXRGaXJzdE5hbWUoKSk7Ci0gICAgICAgICAgICBvdXRTdHJpbmdCdWZmZXIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0SW5pdGlhbCgpICE9IE1JRERMRU5BTUVfREVGQVVMVCkgewotICAgICAgICAgICAgb3V0U3RyaW5nQnVmZmVyLmFwcGVuZChnZXRJbml0aWFsKCkpOwotICAgICAgICAgICAgb3V0U3RyaW5nQnVmZmVyLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldExhc3ROYW1lKCkgIT0gTEFTVE5BTUVfREVGQVVMVCkgewotICAgICAgICAgICAgb3V0U3RyaW5nQnVmZmVyLmFwcGVuZChnZXRMYXN0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvdXRTdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L09yZ2FuaXphdGlvbkVsZW1lbnQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvT3JnYW5pemF0aW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTUwMDM3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvT3JnYW5pemF0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNpY1Byb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlRleHRQcm9wZXJ0eURlc2NyaXB0b3I7Ci0KLS8qKgotICogQW4gT3JnYW5pemF0aW9uIEVsZW1lbnQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE9yZ2FuaXphdGlvbkVsZW1lbnQgaW1wbGVtZW50cyBJQWRhcHRhYmxlLAotICAgICAgICBJUHJvcGVydHlTb3VyY2UsIElXb3JrYmVuY2hBZGFwdGVyIHsKLSAgICAvLwotICAgIHByaXZhdGUgR3JvdXBFbGVtZW50IHBhcmVudDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3I7Ci0KLSAgICAvLwotICAgIHByaXZhdGUgc3RhdGljIFZlY3RvciBkZXNjcmlwdG9yczsKLSAgICBzdGF0aWMgewotICAgICAgICBkZXNjcmlwdG9ycyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIG5hbWUgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICBJQmFzaWNQcm9wZXJ0eUNvbnN0YW50cy5QX1RFWFQsIE1lc3NhZ2VVdGlsLmdldFN0cmluZygibmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZXNjcmlwdG9ycy5hZGRFbGVtZW50KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIENyZWF0ZXMgYSBuZXcgT3JnYW5pemF0aW9uRWxlbWVudCB3aXRoaW4gdGhlIHBhc3NlZCBwYXJlbnQgR3JvdXBFbGVtZW50LAotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50Ci0gICAgICovCi0gICAgT3JnYW5pemF0aW9uRWxlbWVudChTdHJpbmcgbmFtZSwgR3JvdXBFbGVtZW50IHBhcmVudCkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIHRoaXMgT3JnYW5pemF0aW9uRWxlbWVudCBmcm9tIGl0cyBwYXJlbnRHcm91cAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKLSAgICAgICAgcGFyZW50LmRlbGV0ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElBZGFwdGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotICAgICAgICBpZiAoYWRhcHRlciA9PSBJUHJvcGVydHlTb3VyY2UuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZGFwdGVyID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9ycwotICAgICAqLwotICAgIHN0YXRpYyBWZWN0b3IgZ2V0RGVzY3JpcHRvcnMoKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdG9yczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoQWRhcHRlcgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hBZGFwdGVyCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIChJUHJvcGVydHlEZXNjcmlwdG9yW10pIGdldERlc2NyaXB0b3JzKCkudG9BcnJheSgKLSAgICAgICAgICAgICAgICBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltnZXREZXNjcmlwdG9ycygpLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+T3JnYW5pemF0aW9uRWxlbWVudDwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPklQcm9wZXJ0eVNvdXJjZTwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzCi0gICAgICoKLSAgICAgKiAJMSkgUF9OQU1FIHJldHVybnMgU3RyaW5nLCBuYW1lIG9mIHRoaXMgZWxlbWVudAotICAgICAqICB0aGlzIHByb3BlcnR5IGtleSBpcyBkZWZpbmVkIGluIDxjb2RlPklCYXNpY1Byb3BlcnR5Q29uc3RhbnRzPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgcHJvcEtleSkgewotICAgICAgICBpZiAocHJvcEtleS5lcXVhbHMoSUJhc2ljUHJvcGVydHlDb25zdGFudHMuUF9URVhUKSkKLSAgICAgICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhvb2suIEltcGxlbWVudGVkIGJ5IDxjb2RlPkdyb3VwRWxlbWVudDwvY29kZT4gZm9yIHVzZSBpbnN0ZWFkIG9mIGluc3RhbmNlb2YKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dyb3VwKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBwcm9wZXJ0eSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSG9vay4gSW1wbGVtZW50ZWQgYnkgPGNvZGU+VXNlckVsZW1lbnQ8L2NvZGU+IGZvciB1c2UgaW5zdGVhZCBvZiBpbnN0YW5jZW9mCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VyKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IHByb3BlcnR5KSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotICAgICAqLwotICAgIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBkZXNjKSB7Ci0gICAgICAgIGltYWdlRGVzY3JpcHRvciA9IGRlc2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZQotICAgICAqLwotICAgIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotICAgICAgICBuYW1lID0gbmV3TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgaW5zdGFuY2UncyBwYXJlbnQgYmFjayBwb2ludGVyLgotICAgICAqLwotICAgIHZvaWQgc2V0UGFyZW50KEdyb3VwRWxlbWVudCBuZXdQYXJlbnQpIHsKLSAgICAgICAgcGFyZW50ID0gbmV3UGFyZW50OwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+T3JnYW5pemF0aW9uRWxlbWVudDwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPklQcm9wZXJ0eVNvdXJjZTwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzCi0gICAgICogZGVmaW5lcyB0aGUgZm9sbG93aW5nIFNldGFibGUgcHJvcGVydGllcwotICAgICAqCi0gICAgICoJMSkgUF9OQU1FLCBleHBlY3RzIFN0cmluZywgc2V0cyB0aGUgbmFtZSBvZiB0aGlzIE9yZ2FuaXphdGlvbkVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKElCYXNpY1Byb3BlcnR5Q29uc3RhbnRzLlBfVEVYVCkpIHsKLSAgICAgICAgICAgIHNldE5hbWUoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9Qb3B1cE1lbnVBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9Qb3B1cE1lbnVBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTkxNzUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvUG9wdXBNZW51QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQWN0aW9uIGRlbGVnYXRlIGZvciBoYW5kbGluZyBwb3B1cCBtZW51IGFjdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3B1cE1lbnVBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRHJvcEFjdGlvbkRlbGVnYXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHRoaXMucGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlByb3BlcnR5X1NoZWV0X0V4YW1wbGUiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiUG9wdXBfTWVudV9BY3Rpb25fZXhlY3V0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uRGVsZWdhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICAvL0lnbm9yZWQgZm9yIHRoaXMgZXhhbXBsZQotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElPYmplY3RBY3Rpb25EZWxlZ2F0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLSAgICAgICAgdGhpcy5wYXJ0ID0gdGFyZ2V0UGFydDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L1Byb3BlcnR5U2hlZXRDb250ZW50T3V0bGluZVBhZ2UuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvUHJvcGVydHlTaGVldENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODAwMjE1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvUHJvcGVydHlTaGVldENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7Ci0KLS8qKgotICogUGFnZSBmb3IgdGhlIGNvbnRlbnQgb3V0bGluZXIKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5U2hlZXRDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgewotCi0gICAgcHJpdmF0ZSBJQWRhcHRhYmxlIG1vZGVsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNpdmVyIHVzaW5nIGFkYXBhdGFibGUKLSAgICAgKiBhcyB0aGUgbW9kZWwuCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnR5U2hlZXRDb250ZW50T3V0bGluZVBhZ2UoSUFkYXB0YWJsZSBhZGFwdGFibGUpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IGFkYXB0YWJsZTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQ3JlYXRlcyB0aGUgY29udHJvbCBhbmQgcmVnaXN0ZXJzIHRoZSBwb3B1cCBtZW51IGZvciB0aGlzIHBhZ2UKLSAgICAgKiBNZW51IGlkICJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0Lm91dGxpbmUiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICAgICAgVHJlZVZpZXdlciB2aWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7Ci0gICAgICAgIHZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIHZpZXdlci5zZXRJbnB1dCh0aGlzLm1vZGVsKTsKLSAgICAgICAgdmlld2VyLmV4cGFuZEFsbCgpOwotCi0gICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgY29udGV4dCBtZW51LgotICAgICAgICBNZW51TWFuYWdlciBtZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wdXBNZW51Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbWVudU1nci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotICAgICAgICBtZW51TWdyLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TCi0gICAgICAgICAgICAgICAgKyAiLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIE1lbnUgbWVudSA9IG1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldFRyZWUoKSk7Ci0gICAgICAgIHZpZXdlci5nZXRUcmVlKCkuc2V0TWVudShtZW51KTsKLSAgICAgICAgLy8gQmUgc3VyZSB0byByZWdpc3RlciBpdCBzbyB0aGF0IG90aGVyIHBsdWctaW5zIGNhbiBhZGQgYWN0aW9ucy4KLSAgICAgICAgZ2V0U2l0ZSgpCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyQ29udGV4dE1lbnUoCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC5vdXRsaW5lIiwgbWVudU1nciwgdmlld2VyKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvUHJvcGVydHlTaGVldFBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9Qcm9wZXJ0eVNoZWV0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Y2IxZTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9Qcm9wZXJ0eVNoZWV0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSm9lIEJvd2JlZXIgKGpvemFydEBibGFyZy5uZXQpIC0gcmVtb3ZlZCBkZXBlbmRlbmN5IG9uIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBsYXllciAoYnVnIDc0NTI2KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgY2xhc3Mgb2YgdGhlIHByb3BlcnR5IHNoZWV0IGV4YW1wbGUuCi0gKgotICogQHNlZSBBYnN0cmFjdFVJUGx1Z2luIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIFVJIHBsdWdpbnMKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5U2hlZXRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLSAgICAvLyBEZWZhdWx0IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlcgotICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnR5U2hlZXRQbHVnaW4gaW5zdDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgUHJvcGVydHlTaGVldCBwbHVnaW4gYW5kIGNhY2hlIGl0cyBkZWZhdWx0IGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnR5U2hlZXRQbHVnaW4oKSB7Ci0gICAgICAgIGlmIChpbnN0ID09IG51bGwpCi0gICAgICAgICAgICBpbnN0ID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwbHVnaW4gc2luZ2xldG9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBQcm9wZXJ0eVNoZWV0UGx1Z2luIGluc3RhbmNlCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBQcm9wZXJ0eVNoZWV0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBpbnN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvU3RyZWV0QWRkcmVzcy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9TdHJlZXRBZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMDE5NzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9TdHJlZXRBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBQcm9wZXJ0eVNvdXJjZSBjb250YWluaW5nIHN0cmVldCBpbmZvcm1hdGlvbiBwZXJ0ZW5hbnQgdG8gQWRkcmVzcwotICovCi1wdWJsaWMgY2xhc3MgU3RyZWV0QWRkcmVzcyBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZSB7Ci0KLSAgICAvL3Byb3BlcnRpZXMKLSAgICBwcml2YXRlIEludGVnZXIgYnVpbGRObzsKLQotICAgIHByaXZhdGUgU3RyaW5nIGFwdEJveDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldE5hbWU7Ci0KLSAgICAvL2RlZmF1bHQgcHJvcGVydHkgdmFsdWVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBCVUlMRF9OT19ERUZBVUxUID0gbmV3IEludGVnZXIoMCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBUQk9YX0RFRkFVTFQgPSBNZXNzYWdlVXRpbAotICAgICAgICAgICAgLmdldFN0cmluZygidW5zcGVjaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUkVFVE5BTUVfREVGQVVMVCA9IE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAuZ2V0U3RyaW5nKCJ1bnNwZWNpZmllZCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvL3Byb3BlcnR5IHVuaXF1ZSBrZXlzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9JRF9CVUlMRF9OTyA9ICJTdHJlZXQuYnVpbGRpbmdObyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSURfQVBUQk9YID0gIlN0cmVldC5hcHRObyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSURfU1RSRUVUID0gIlN0cmVldC5zdHJlZXQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvL3Byb3BlcnR5IGRpc3BsYXkga2V5cwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQlVJTERfTk8gPSBNZXNzYWdlVXRpbAotICAgICAgICAgICAgLmdldFN0cmluZygiYnVpbGRpbmdfbnVtYmVyIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQVBUQk9YID0gTWVzc2FnZVV0aWwKLSAgICAgICAgICAgIC5nZXRTdHJpbmcoImFwdC5ub19vcl9ib3gubm8iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9TVFJFRVQgPSBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoInN0cmVldCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLwotICAgIHByaXZhdGUgc3RhdGljIFZlY3RvciBkZXNjcmlwdG9yczsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGRlc2NyaXB0b3JzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBkZXNjcmlwdG9ycy5hZGRFbGVtZW50KG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFBfSURfQlVJTERfTk8sCi0gICAgICAgICAgICAgICAgUF9CVUlMRF9OTykpOwotICAgICAgICBkZXNjcmlwdG9ycwotICAgICAgICAgICAgICAgIC5hZGRFbGVtZW50KG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFBfSURfQVBUQk9YLCBQX0FQVEJPWCkpOwotICAgICAgICBkZXNjcmlwdG9ycwotICAgICAgICAgICAgICAgIC5hZGRFbGVtZW50KG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFBfSURfU1RSRUVULCBQX1NUUkVFVCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmVldCBEZWZhdWx0IENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJlZXRBZGRyZXNzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIFN0cmVldCBjb25zdHJ1Y3Rvci4gQXB0Qm94IHNldCB0byBkZWZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmVldEFkZHJlc3MoaW50IGJ1aWxkTm8sIFN0cmluZyBzdHJlZXROYW1lKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHNldEJ1aWxkTm8obmV3IEludGVnZXIoYnVpbGRObykpOwotICAgICAgICBzZXRTdHJlZXROYW1lKHN0cmVldE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIFN0cmVldCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyZWV0QWRkcmVzcyhpbnQgYnVpbGRObywgU3RyaW5nIGFwdEJveCwgU3RyaW5nIHN0cmVldE5hbWUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0QnVpbGRObyhuZXcgSW50ZWdlcihidWlsZE5vKSk7Ci0gICAgICAgIHNldEFwdEJveChhcHRCb3gpOwotICAgICAgICBzZXRTdHJlZXROYW1lKHN0cmVldE5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYikgewotICAgICAgICByZXR1cm4gdG9TdHJpbmcoKS5lcXVhbHMob2IudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhlIGFwcGFydG1lbnQgbnVtYmVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXB0Qm94KCkgewotICAgICAgICBpZiAoYXB0Qm94ID09IG51bGwpCi0gICAgICAgICAgICBhcHRCb3ggPSBBUFRCT1hfREVGQVVMVDsKLSAgICAgICAgcmV0dXJuIGFwdEJveDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBidWlsZGluZyBudW1iZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEludGVnZXIgZ2V0QnVpbGRObygpIHsKLSAgICAgICAgaWYgKGJ1aWxkTm8gPT0gbnVsbCkKLSAgICAgICAgICAgIGJ1aWxkTm8gPSBCVUlMRF9OT19ERUZBVUxUOwotICAgICAgICByZXR1cm4gYnVpbGRObzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9ycwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFZlY3RvciBnZXREZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkgewotICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gKElQcm9wZXJ0eURlc2NyaXB0b3JbXSkgZ2V0RGVzY3JpcHRvcnMoKS50b0FycmF5KAotICAgICAgICAgICAgICAgIG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2dldERlc2NyaXB0b3JzKCkuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRoZSA8Y29kZT5OYW1lPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMKLSAgICAgKgotICAgICAqIAkxKSBQX0JVSUxEX05PIHJldHVybnMgamF2YS5sYW5nLkludGVnZXIKLSAgICAgKiAJMikgUF9BUFRCT1ggcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICoJMykgUF9TVFJFRVQgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wS2V5KSB7Ci0gICAgICAgIGlmIChwcm9wS2V5LmVxdWFscyhQX0lEX0JVSUxEX05PKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRCdWlsZE5vKCkudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKHByb3BLZXkuZXF1YWxzKFBfSURfQVBUQk9YKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRBcHRCb3goKTsKLSAgICAgICAgaWYgKHByb3BLZXkuZXF1YWxzKFBfSURfU1RSRUVUKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRTdHJlZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmVldCBuYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyZWV0TmFtZSgpIHsKLSAgICAgICAgaWYgKHN0cmVldE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHN0cmVldE5hbWUgPSBTVFJFRVROQU1FX0RFRkFVTFQ7Ci0gICAgICAgIHJldHVybiBzdHJlZXROYW1lOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCkuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IHByb3BlcnR5KSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoUF9JRF9CVUlMRF9OTykpCi0gICAgICAgICAgICByZXR1cm4gZ2V0QnVpbGRObygpICE9IEJVSUxEX05PX0RFRkFVTFQ7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoUF9JRF9BUFRCT1gpKQotICAgICAgICAgICAgcmV0dXJuIGdldEFwdEJveCgpICE9IEFQVEJPWF9ERUZBVUxUOwotICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKFBfSURfU1RSRUVUKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRTdHJlZXROYW1lKCkgIT0gU1RSRUVUTkFNRV9ERUZBVUxUOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IHByb3BlcnR5KSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoUF9JRF9CVUlMRF9OTykpIHsKLSAgICAgICAgICAgIHNldEJ1aWxkTm8oQlVJTERfTk9fREVGQVVMVCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhQX0lEX0FQVEJPWCkpIHsKLSAgICAgICAgICAgIHNldEFwdEJveChBUFRCT1hfREVGQVVMVCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhQX0lEX1NUUkVFVCkpIHsKLSAgICAgICAgICAgIHNldFN0cmVldE5hbWUoU1RSRUVUTkFNRV9ERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFwcGFydG1lbnQgbnVtYmVyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEFwdEJveChTdHJpbmcgbmV3QXB0Qm94KSB7Ci0gICAgICAgIGFwdEJveCA9IG5ld0FwdEJveDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBidWlsZGluZyBudW1iZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0QnVpbGRObyhJbnRlZ2VyIG5ld0J1aWxkTm8pIHsKLSAgICAgICAgYnVpbGRObyA9IG5ld0J1aWxkTm87Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRoZSA8Y29kZT5OYW1lPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+SVByb3BlcnR5U291cmNlPC9jb2RlPiBtZXRob2QgCi0gICAgICogZGVmaW5lcyB0aGUgZm9sbG93aW5nIFNldGFibGUgcHJvcGVydGllcwotICAgICAqCi0gICAgICogCTEpIFBfQlVJTERfTk8gZXhwZWN0cyBqYXZhLmxhbmcuSW50ZWdlcgotICAgICAqIAkyKSBQX0FQVEJPWCBleHBlY3RzIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKgkzKSBQX1NUUkVFVCBleHBlY3RzIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKFBfSURfQlVJTERfTk8pKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNldEJ1aWxkTm8obmV3IEludGVnZXIoSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSB2YWx1ZSkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0QnVpbGRObyhCVUlMRF9OT19ERUZBVUxUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZS5lcXVhbHMoUF9JRF9BUFRCT1gpKSB7Ci0gICAgICAgICAgICBzZXRBcHRCb3goKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhQX0lEX1NUUkVFVCkpIHsKLSAgICAgICAgICAgIHNldFN0cmVldE5hbWUoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3RyZWV0IG5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0U3RyZWV0TmFtZShTdHJpbmcgbmV3U3RyZWV0TmFtZSkgewotICAgICAgICBzdHJlZXROYW1lID0gbmV3U3RyZWV0TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmFsdWUgYXMgZGlzcGxheWVkIGluIHRoZSBQcm9wZXJ0eSBTaGVldC4gV2lsbCBub3QgcHJpbnQgZGVmYXVsdCB2YWx1ZXMKLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgb3V0U3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpZiAoIWdldEFwdEJveCgpLmVxdWFscyhBUFRCT1hfREVGQVVMVCkpIHsKLSAgICAgICAgICAgIG91dFN0cmluZ0J1ZmZlci5hcHBlbmQoZ2V0QXB0Qm94KCkpOwotICAgICAgICAgICAgb3V0U3RyaW5nQnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGlmICghZ2V0QnVpbGRObygpLmVxdWFscyhCVUlMRF9OT19ERUZBVUxUKSkgewotICAgICAgICAgICAgb3V0U3RyaW5nQnVmZmVyLmFwcGVuZChnZXRCdWlsZE5vKCkpOwotICAgICAgICAgICAgb3V0U3RyaW5nQnVmZmVyLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgaWYgKCFnZXRTdHJlZXROYW1lKCkuZXF1YWxzKFNUUkVFVE5BTUVfREVGQVVMVCkpIHsKLSAgICAgICAgICAgIG91dFN0cmluZ0J1ZmZlci5hcHBlbmQoZ2V0U3RyZWV0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0U3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9Vc2VyRWRpdG9yLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L1VzZXJFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1ODA0Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L1VzZXJFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFVzZXIgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgVXNlckVkaXRvciBleHRlbmRzIFRleHRFZGl0b3IgewotICAgIHByaXZhdGUgQ29udGVudE91dGxpbmVQYWdlIHVzZXJDb250ZW50T3V0bGluZTsKLQotICAgIC8qKgotICAgICAqIFVzZXJFZGl0b3IgZGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBVc2VyRWRpdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV29ya2JlbmNoUGFydAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLSAgICAgICAgZ2V0U291cmNlVmlld2VyKCkuc2V0RG9jdW1lbnQoCi0gICAgICAgICAgICAgICAgbmV3IERvY3VtZW50KE1lc3NhZ2VVdGlsLmdldFN0cmluZygiRWRpdG9yX2luc3RydWN0aW9ucyIpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElBZGFwdGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotICAgICAgICBpZiAoYWRhcHRlci5lcXVhbHMoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb250ZW50T3V0bGluZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZGFwdGVyLmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlTaGVldCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgb3V0bGluZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lKCkgewotICAgICAgICBpZiAodXNlckNvbnRlbnRPdXRsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vQ3JlYXRlIGEgcHJvcGVydHkgb3V0bGluZSBwYWdlIHVzaW5nIHRoZSBwYXJzZWQgcmVzdWx0IG9mIHBhc3NpbmcgaW4gdGhlIGRvY3VtZW50IHByb3ZpZGVyLgotICAgICAgICAgICAgdXNlckNvbnRlbnRPdXRsaW5lID0gbmV3IFByb3BlcnR5U2hlZXRDb250ZW50T3V0bGluZVBhZ2UoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBVc2VyRmlsZVBhcnNlcigpLnBhcnNlKGdldERvY3VtZW50UHJvdmlkZXIoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1c2VyQ29udGVudE91dGxpbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgc2hlZXQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0KCkgewotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5U2hlZXRQYWdlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9Vc2VyRWxlbWVudC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9Vc2VyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzAwZTkyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvVXNlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuQ29sb3JQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Db21ib0JveFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBBIFVzZXIgRWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgVXNlckVsZW1lbnQgZXh0ZW5kcyBPcmdhbml6YXRpb25FbGVtZW50IHsKLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICBwcml2YXRlIE5hbWUgZnVsbE5hbWU7Ci0KLSAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsKLQotICAgIHByaXZhdGUgU3RyaW5nIHBob25lTnVtYmVyOwotCi0gICAgcHJpdmF0ZSBFbWFpbEFkZHJlc3MgZW1haWxBZGRyZXNzOwotCi0gICAgcHJpdmF0ZSBCb29sZWFuIGNvb3A7Ci0KLSAgICBwcml2YXRlIEJpcnRoZGF5IGJpcnRoZGF5OwotCi0gICAgcHJpdmF0ZSBGbG9hdCBzYWxhcnk7Ci0KLSAgICBwcml2YXRlIFJHQiBoYWlyQ29sb3I7Ci0KLSAgICBwcml2YXRlIFJHQiBleWVDb2xvcjsKLQotICAgIC8vIFByb3BlcnR5IGRlZmF1bHQgdmFsdWVzCi0gICAgcHJpdmF0ZSBOYW1lIGZ1bGxOYW1lX0RlZmF1bHQ7Ci0KLSAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzc19EZWZhdWx0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGhvbmVOdW1iZXJfRGVmYXVsdCA9ICI1NTUtMTExMSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgRW1haWxBZGRyZXNzIGVtYWlsQWRkcmVzc19EZWZhdWx0OwotCi0gICAgcHJpdmF0ZSBCb29sZWFuIGNvb3BfRGVmYXVsdDsKLQotICAgIHByaXZhdGUgQmlydGhkYXkgYmlydGhkYXlfRGVmYXVsdDsKLQotICAgIHByaXZhdGUgRmxvYXQgc2FsYXJ5X0RlZmF1bHQ7Ci0KLSAgICBwcml2YXRlIFJHQiBoYWlyQ29sb3JfRGVmYXVsdDsKLQotICAgIHByaXZhdGUgUkdCIGV5ZUNvbG9yX0RlZmF1bHQ7Ci0KLSAgICAvLyBQcm9wZXJ0eSB1bmlxdWUga2V5cwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSURfUEhPTkVOVU1CRVIgPSAiVXNlci5waG9uZW51bWJlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSURfQUREUkVTUyA9ICJVc2VyLmFkZHJlc3MiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0lEX0ZVTExOQU1FID0gIlVzZXIuZnVsbG5hbWUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0lEX0VNQUlMID0gIlVzZXIuZW1haWwiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0lEX0NPT1AgPSAiVXNlci5jb29wIHN0dWRlbnQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0lEX0JEQVkgPSAiVXNlci5iaXJ0aGRheSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSURfU0FMQVJZID0gIlVzZXIuc2FsYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9JRF9IQUlSQ09MT1IgPSAiVXNlci5oYWlyY29sb3IiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0lEX0VZRUNPTE9SID0gIlVzZXIuZXllY29sb3IiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBQcm9wZXJ0eSBkaXNwbGF5IGtleXMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1BIT05FTlVNQkVSID0gTWVzc2FnZVV0aWwKLSAgICAgICAgICAgIC5nZXRTdHJpbmcoInBob25lbnVtYmVyIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQUREUkVTUyA9IE1lc3NhZ2VVdGlsLmdldFN0cmluZygiYWRkcmVzcyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0ZVTExOQU1FID0gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJmdWxsbmFtZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0VNQUlMID0gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJlbWFpbCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0NPT1AgPSBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoImNvb3Bfc3R1ZGVudCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0JEQVkgPSBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoImJpcnRoZGF5Iik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfU0FMQVJZID0gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJzYWxhcnkiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9IQUlSQ09MT1IgPSBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoImhhaXJjb2xvciIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0VZRUNPTE9SID0gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJleWVjb2xvciIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBIZWxwIGNvbnRleHQgaWRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FX05VTUJFUl9DT05URVhUID0gIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQucGhvbmVfbnVtYmVyX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREUkVTU19DT05URVhUID0gIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQuYWRkcmVzc19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExfTkFNRV9DT05URVhUID0gIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQuZnVsbF9uYW1lX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUxfQ09OVEVYVCA9ICJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0LmVtYWlsX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09PUF9DT05URVhUID0gIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQuY29vcF9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJJUlRIREFZX0NPTlRFWFQgPSAib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC5iaXJ0aGRheV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBTEFSWV9DT05URVhUID0gIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQuc2FsYXJ5X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFJUl9DT0xPUl9fQ09OVEVYVCA9ICJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0LmhhaXJfY29sb3JfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfQ09OVEVYVCA9ICJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0LmV5ZV9jb2xvcl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gUHJvcGVydHkgQ2F0ZWdvcnkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0NPTlRBQ1RJTkZPID0gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJjb250YWN0Iik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfUEVSU09ORUxJTkZPID0gTWVzc2FnZVV0aWwKLSAgICAgICAgICAgIC5nZXRTdHJpbmcoInBlcnNvbmVsIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfUEVSU09OQUxJTkZPID0gTWVzc2FnZVV0aWwKLSAgICAgICAgICAgIC5nZXRTdHJpbmcoInBlcnNvbmFsIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFByb3BlcnR5IFZhbHVlcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBQX1ZBTFVFX1RSVUUgPSBuZXcgSW50ZWdlcigwKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBQX1ZBTFVFX0ZBTFNFID0gbmV3IEludGVnZXIoMSk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1ZBTFVFX1RSVUVfTEFCRUwgPSBNZXNzYWdlVXRpbAotICAgICAgICAgICAgLmdldFN0cmluZygidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1ZBTFVFX0ZBTFNFX0xBQkVMID0gTWVzc2FnZVV0aWwKLSAgICAgICAgICAgIC5nZXRTdHJpbmcoImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIEJvb2xlYW5MYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgUF9WQUxVRV9UUlVFX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICBQX1ZBTFVFX0ZBTFNFX0xBQkVMIH07Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWVzWygoSW50ZWdlcikgZWxlbWVudCkuaW50VmFsdWUoKV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLwotICAgIHN0YXRpYyBwcml2YXRlIFZlY3RvciBkZXNjcmlwdG9yczsKLSAgICBzdGF0aWMgewotICAgICAgICBkZXNjcmlwdG9ycyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvcjsKLQotICAgICAgICAvLy8KLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoUF9JRF9QSE9ORU5VTUJFUiwKLSAgICAgICAgICAgICAgICBQX1BIT05FTlVNQkVSKTsKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yLnNldENhdGVnb3J5KFBfQ09OVEFDVElORk8pOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3Iuc2V0SGVscENvbnRleHRJZHMoUEhPTkVfTlVNQkVSX0NPTlRFWFQpOwotICAgICAgICBkZXNjcmlwdG9ycy5hZGRFbGVtZW50KHByb3BlcnR5RGVzY3JpcHRvcik7Ci0KLSAgICAgICAgLy8vCi0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvciA9IG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IoUF9JRF9BRERSRVNTLCBQX0FERFJFU1MpOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3Iuc2V0Q2F0ZWdvcnkoUF9DT05UQUNUSU5GTyk7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvci5zZXRIZWxwQ29udGV4dElkcyhBRERSRVNTX0NPTlRFWFQpOwotICAgICAgICBkZXNjcmlwdG9ycy5hZGRFbGVtZW50KHByb3BlcnR5RGVzY3JpcHRvcik7Ci0KLSAgICAgICAgLy8vCi0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvciA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFBfSURfRU1BSUwsIFBfRU1BSUwpOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3Iuc2V0Q2F0ZWdvcnkoUF9DT05UQUNUSU5GTyk7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvci5zZXRIZWxwQ29udGV4dElkcyhFTUFJTF9DT05URVhUKTsKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yLnNldFZhbGlkYXRvcihuZXcgRW1haWxBZGRyZXNzVmFsaWRhdG9yKCkpOwotICAgICAgICBkZXNjcmlwdG9ycy5hZGRFbGVtZW50KHByb3BlcnR5RGVzY3JpcHRvcik7Ci0KLSAgICAgICAgLy8vCi0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvciA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFBfSURfRlVMTE5BTUUsCi0gICAgICAgICAgICAgICAgUF9GVUxMTkFNRSk7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvci5zZXRDYXRlZ29yeShQX1BFUlNPTkVMSU5GTyk7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvci5zZXRIZWxwQ29udGV4dElkcyhGVUxMX05BTUVfQ09OVEVYVCk7Ci0gICAgICAgIGRlc2NyaXB0b3JzLmFkZEVsZW1lbnQocHJvcGVydHlEZXNjcmlwdG9yKTsKLQotICAgICAgICAvLy8KLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvcihQX0lEX0JEQVksIFBfQkRBWSk7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvci5zZXRDYXRlZ29yeShQX1BFUlNPTkVMSU5GTyk7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvci5zZXRIZWxwQ29udGV4dElkcyhCSVJUSERBWV9DT05URVhUKTsKLSAgICAgICAgZGVzY3JpcHRvcnMuYWRkRWxlbWVudChwcm9wZXJ0eURlc2NyaXB0b3IpOwotCi0gICAgICAgIC8vLwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3IgPSBuZXcgQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoUF9JRF9DT09QLCBQX0NPT1AsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgUF9WQUxVRV9UUlVFX0xBQkVMLCBQX1ZBTFVFX0ZBTFNFX0xBQkVMIH0pOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3Iuc2V0Q2F0ZWdvcnkoUF9QRVJTT05FTElORk8pOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3Iuc2V0SGVscENvbnRleHRJZHMoQ09PUF9DT05URVhUKTsKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yLnNldExhYmVsUHJvdmlkZXIobmV3IEJvb2xlYW5MYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICBkZXNjcmlwdG9ycy5hZGRFbGVtZW50KHByb3BlcnR5RGVzY3JpcHRvcik7Ci0KLSAgICAgICAgLy8vCi0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvciA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFBfSURfU0FMQVJZLCBQX1NBTEFSWSk7Ci0gICAgICAgIC8vYWRkIGN1c3RvbSB2YWxpZGF0b3IgdG8gcHJvcGVydHlEZXNjcmlwdG9yIGxpbWl0aW5nIHNhbGFyeSB2YWx1ZXMgdG8gYmUKLSAgICAgICAgLy9ncmVhdG9yIHRoYW4gemVybwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3Iuc2V0SGVscENvbnRleHRJZHMobmV3IE9iamVjdFtdIHsgU0FMQVJZX0NPTlRFWFQgfSk7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvcgotICAgICAgICAgICAgICAgIC5zZXRGaWx0ZXJGbGFncyhuZXcgU3RyaW5nW10geyBJUHJvcGVydHlTaGVldEVudHJ5LkZJTFRFUl9JRF9FWFBFUlQgfSk7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvci5zZXRWYWxpZGF0b3IobmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotICAgICAgICAgICAgcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJzYWxhcnlfaXNfaW52YWxpZCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICBGbG9hdCB0cnlTYWxhcnk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5U2FsYXJ5ID0gbmV3IEZsb2F0KEZsb2F0LnBhcnNlRmxvYXQoKFN0cmluZykgdmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJzYWxhcnlfaXNfaW52YWxpZCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0cnlTYWxhcnkuZmxvYXRWYWx1ZSgpIDwgMC4wKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJzYWxhcnlfbXVzdF9iZV9ncmVhdG9yX3RoYW5femVybyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3Iuc2V0Q2F0ZWdvcnkoUF9QRVJTT05FTElORk8pOwotICAgICAgICBkZXNjcmlwdG9ycy5hZGRFbGVtZW50KHByb3BlcnR5RGVzY3JpcHRvcik7Ci0KLSAgICAgICAgLy8vIEhhaXJDb2xvcgotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3IgPSBuZXcgQ29sb3JQcm9wZXJ0eURlc2NyaXB0b3IoUF9JRF9IQUlSQ09MT1IsCi0gICAgICAgICAgICAgICAgUF9IQUlSQ09MT1IpOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3Iuc2V0Q2F0ZWdvcnkoUF9QRVJTT05BTElORk8pOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3Iuc2V0SGVscENvbnRleHRJZHMoSEFJUl9DT0xPUl9fQ09OVEVYVCk7Ci0gICAgICAgIGRlc2NyaXB0b3JzLmFkZEVsZW1lbnQocHJvcGVydHlEZXNjcmlwdG9yKTsKLQotICAgICAgICAvLy8gRXllQ29sb3IKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yID0gbmV3IENvbG9yUHJvcGVydHlEZXNjcmlwdG9yKFBfSURfRVlFQ09MT1IsCi0gICAgICAgICAgICAgICAgUF9FWUVDT0xPUik7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvci5zZXRDYXRlZ29yeShQX1BFUlNPTkFMSU5GTyk7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvci5zZXRIZWxwQ29udGV4dElkcyhFWUVfQ09MT1JfQ09OVEVYVCk7Ci0gICAgICAgIGRlc2NyaXB0b3JzLmFkZEVsZW1lbnQocHJvcGVydHlEZXNjcmlwdG9yKTsKLQotICAgICAgICAvL2dldHMgZGVzY3JpcHRvcnMgZnJvbSBwYXJlbnQsIHdhcm5pbmcgbmFtZS1zcGFjZSBjb2xsaXNpb24gbWF5IG9jY3VyCi0gICAgICAgIFZlY3RvciBwYXJlbnREZXNjcmlwdG9ycyA9IE9yZ2FuaXphdGlvbkVsZW1lbnQuZ2V0RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnREZXNjcmlwdG9ycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZGVzY3JpcHRvcnMuYWRkRWxlbWVudChwYXJlbnREZXNjcmlwdG9ycy5lbGVtZW50QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuIERlZmF1bHQgdmlzaWJpbGl0eSBvbmx5IGNhbGxlZCBmcm9tIEdyb3VwRWxlbWVudC5jcmVhdGVTdWJHcm91cCgpCi0gICAgICogQ3JlYXRlcyBhIG5ldyBVc2VyRWxlbWVudCB3aXRoaW4gdGhlIHBhc3NlZCBwYXJlbnQgR3JvdXBFbGVtZW50LAotICAgICAqICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQKLSAgICAgKi8KLSAgICBVc2VyRWxlbWVudChTdHJpbmcgbmFtZSwgR3JvdXBFbGVtZW50IHBhcmVudCkgewotICAgICAgICBzdXBlcihuYW1lLCBwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFkZHJlc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKLSAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkKLSAgICAgICAgICAgIGFkZHJlc3MgPSBuZXcgQWRkcmVzcygpOwotICAgICAgICByZXR1cm4gYWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiaXJ0aGRheQotICAgICAqLwotICAgIHByaXZhdGUgQmlydGhkYXkgZ2V0QmlydGhkYXkoKSB7Ci0gICAgICAgIGlmIChiaXJ0aGRheSA9PSBudWxsKQotICAgICAgICAgICAgYmlydGhkYXkgPSBuZXcgQmlydGhkYXkoKTsKLSAgICAgICAgcmV0dXJuIGJpcnRoZGF5OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdvcmtiZW5jaEFkYXB0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29vcAotICAgICAqLwotICAgIHByaXZhdGUgQm9vbGVhbiBnZXRDb29wKCkgewotICAgICAgICBpZiAoY29vcCA9PSBudWxsKQotICAgICAgICAgICAgY29vcCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIGNvb3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRvcnMKLSAgICAgKi8KLSAgICBzdGF0aWMgVmVjdG9yIGdldERlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvcnM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZW1haWwgYWRkcmVzcwotICAgICAqLwotICAgIEVtYWlsQWRkcmVzcyBnZXRFbWFpbEFkZHJlc3MoKSB7Ci0gICAgICAgIGlmIChlbWFpbEFkZHJlc3MgPT0gbnVsbCkKLSAgICAgICAgICAgIGVtYWlsQWRkcmVzcyA9IG5ldyBFbWFpbEFkZHJlc3MoKTsKLSAgICAgICAgcmV0dXJuIGVtYWlsQWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBleWUgY29sb3IKLSAgICAgKi8KLSAgICBwcml2YXRlIFJHQiBnZXRFeWVDb2xvcigpIHsKLSAgICAgICAgaWYgKGV5ZUNvbG9yID09IG51bGwpCi0gICAgICAgICAgICBleWVDb2xvciA9IG5ldyBSR0IoNjAsIDYwLCA2MCk7Ci0gICAgICAgIHJldHVybiBleWVDb2xvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIG5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIE5hbWUgZ2V0RnVsbE5hbWUoKSB7Ci0gICAgICAgIGlmIChmdWxsTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgZnVsbE5hbWUgPSBuZXcgTmFtZShnZXROYW1lKCkpOwotICAgICAgICByZXR1cm4gZnVsbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGFpciBjb2xvcgotICAgICAqLwotICAgIHByaXZhdGUgUkdCIGdldEhhaXJDb2xvcigpIHsKLSAgICAgICAgaWYgKGhhaXJDb2xvciA9PSBudWxsKQotICAgICAgICAgICAgaGFpckNvbG9yID0gbmV3IFJHQigyNTUsIDI1NSwgMjU1KTsKLSAgICAgICAgcmV0dXJuIGhhaXJDb2xvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwaG9uZSBudW1iZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQaG9uZU51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIHBob25lTnVtYmVyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gKElQcm9wZXJ0eURlc2NyaXB0b3JbXSkgZ2V0RGVzY3JpcHRvcnMoKS50b0FycmF5KAotICAgICAgICAgICAgICAgIG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2dldERlc2NyaXB0b3JzKCkuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRoZSA8Y29kZT5Vc2VybWVudDwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPklQcm9wZXJ0eVNvdXJjZTwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzCi0gICAgICoKLSAgICAgKgkxKSBQX0FERFJFU1MgcmV0dXJucyBBZGRyZXNzIChJUHJvcGVydHlTb3VyY2UpLCB0aGUgYWRkcmVzcyBvZiB0aGlzIHVzZXIKLSAgICAgKiAJMikgUF9GVUxMTkFNRSByZXR1cm5zIE5hbWUgKElQcm9wZXJ0eVNvdXJjZSksIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyB1c2VyCi0gICAgICogIDMpIFBfUEhPTkVOVU1CRVIgcmV0dXJucyBTdHJpbmcsIHRoZSBwaG9uZSBudW1iZXIgb2YgdGhpcyB1c2VyCi0gICAgICogIDQpIFBfRU1BSUwgcmV0dXJucyBFbWFpbEFkZHJlc3MgKElQcm9wZXJ0eVNvdXJjZSksIHRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoaXMgdXNlcgotICAgICAqICA1KSBQX0NPT1AgcmV0dXJucyBCb29sZWFuLCB3aGV0aGVyIHRoZSBpbmRpdmlkdWFsIGlzIGEgY29vcCBzdHVkZW50IG9yIG5vdAotICAgICAqICA2KSBQX0JEQVkgcmV0dXJucyBCaXJ0aGRheQotICAgICAqICA3KSBQX1NBTEFSWSByZXR1cm4gamF2YS5sYW5nLkZsb2F0Ci0gICAgICogIDgpIFBfSEFJUkNPTE9SLCBleHBlY3RzIFJHQgotICAgICAqICA5KSBQX0VZRUNPTE9SLCBleHBlY3RzIFJHQgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgcHJvcEtleSkgewotICAgICAgICBpZiAocHJvcEtleS5lcXVhbHMoUF9JRF9BRERSRVNTKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRBZGRyZXNzKCk7Ci0gICAgICAgIGlmIChwcm9wS2V5LmVxdWFscyhQX0lEX0ZVTExOQU1FKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRGdWxsTmFtZSgpOwotICAgICAgICBpZiAocHJvcEtleS5lcXVhbHMoUF9JRF9QSE9ORU5VTUJFUikpCi0gICAgICAgICAgICByZXR1cm4gZ2V0UGhvbmVOdW1iZXIoKTsKLSAgICAgICAgaWYgKHByb3BLZXkuZXF1YWxzKFBfSURfRU1BSUwpKQotICAgICAgICAgICAgcmV0dXJuIGdldEVtYWlsQWRkcmVzcygpOwotICAgICAgICBpZiAocHJvcEtleS5lcXVhbHMoUF9JRF9DT09QKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRDb29wKCkuZXF1YWxzKEJvb2xlYW4uVFJVRSkgPyBQX1ZBTFVFX1RSVUUKLSAgICAgICAgICAgICAgICAgICAgOiBQX1ZBTFVFX0ZBTFNFOwotICAgICAgICBpZiAocHJvcEtleS5lcXVhbHMoUF9JRF9CREFZKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRCaXJ0aGRheSgpOwotICAgICAgICBpZiAocHJvcEtleS5lcXVhbHMoUF9JRF9TQUxBUlkpKQotICAgICAgICAgICAgcmV0dXJuIGdldFNhbGFyeSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChwcm9wS2V5LmVxdWFscyhQX0lEX0hBSVJDT0xPUikpCi0gICAgICAgICAgICByZXR1cm4gZ2V0SGFpckNvbG9yKCk7Ci0gICAgICAgIGlmIChwcm9wS2V5LmVxdWFscyhQX0lEX0VZRUNPTE9SKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRFeWVDb2xvcigpOwotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlWYWx1ZShwcm9wS2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzYWxhcnkKLSAgICAgKi8KLSAgICBwcml2YXRlIEZsb2F0IGdldFNhbGFyeSgpIHsKLSAgICAgICAgaWYgKHNhbGFyeSA9PSBudWxsKQotICAgICAgICAgICAgc2FsYXJ5ID0gbmV3IEZsb2F0KDApOwotICAgICAgICByZXR1cm4gc2FsYXJ5OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgcHJvcGVydHkpIHsKLSAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhQX0lEX0FERFJFU1MpKQotICAgICAgICAgICAgcmV0dXJuIGdldEFkZHJlc3MoKSAhPSBhZGRyZXNzX0RlZmF1bHQ7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoUF9JRF9GVUxMTkFNRSkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0RnVsbE5hbWUoKSAhPSBmdWxsTmFtZV9EZWZhdWx0OwotICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKFBfSURfUEhPTkVOVU1CRVIpKQotICAgICAgICAgICAgcmV0dXJuIGdldFBob25lTnVtYmVyKCkgIT0gcGhvbmVOdW1iZXJfRGVmYXVsdDsKLSAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhQX0lEX0VNQUlMKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRFbWFpbEFkZHJlc3MoKSAhPSBlbWFpbEFkZHJlc3NfRGVmYXVsdDsKLSAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhQX0lEX0NPT1ApKQotICAgICAgICAgICAgcmV0dXJuIGdldENvb3AoKSAhPSBjb29wX0RlZmF1bHQ7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoUF9JRF9CREFZKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRCaXJ0aGRheSgpICE9IGJpcnRoZGF5X0RlZmF1bHQ7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoUF9JRF9TQUxBUlkpKQotICAgICAgICAgICAgcmV0dXJuIGdldFNhbGFyeSgpICE9IHNhbGFyeV9EZWZhdWx0OwotICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKFBfSURfSEFJUkNPTE9SKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRIYWlyQ29sb3IoKSAhPSBoYWlyQ29sb3JfRGVmYXVsdDsKLSAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhQX0lEX0VZRUNPTE9SKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRFeWVDb2xvcigpICE9IGV5ZUNvbG9yX0RlZmF1bHQ7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE9yZ2FuaXphdGlvbkVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXIoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wZXJ0eSkgewotICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKFBfSURfQUREUkVTUykpIHsKLSAgICAgICAgICAgIHNldEFkZHJlc3MoYWRkcmVzc19EZWZhdWx0KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKFBfSURfRlVMTE5BTUUpKSB7Ci0gICAgICAgICAgICBzZXRGdWxsTmFtZShmdWxsTmFtZV9EZWZhdWx0KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKFBfSURfUEhPTkVOVU1CRVIpKSB7Ci0gICAgICAgICAgICBzZXRQaG9uZU51bWJlcihwaG9uZU51bWJlcl9EZWZhdWx0KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKFBfSURfRU1BSUwpKSB7Ci0gICAgICAgICAgICBzZXRFbWFpbEFkZHJlc3MoZW1haWxBZGRyZXNzX0RlZmF1bHQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoUF9JRF9DT09QKSkgewotICAgICAgICAgICAgc2V0Q29vcChjb29wX0RlZmF1bHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoUF9JRF9CREFZKSkgewotICAgICAgICAgICAgc2V0QmlydGhkYXkoYmlydGhkYXlfRGVmYXVsdCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhQX0lEX1NBTEFSWSkpIHsKLSAgICAgICAgICAgIHNldFNhbGFyeShzYWxhcnlfRGVmYXVsdCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhQX0lEX0hBSVJDT0xPUikpIHsKLSAgICAgICAgICAgIHNldEhhaXJDb2xvcihoYWlyQ29sb3JfRGVmYXVsdCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhQX0lEX0VZRUNPTE9SKSkgewotICAgICAgICAgICAgc2V0RXllQ29sb3IoZXllQ29sb3JfRGVmYXVsdCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIucmVzZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhZGRyZXNzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWRkcmVzcyhBZGRyZXNzIG5ld0FkZHJlc3MpIHsKLSAgICAgICAgYWRkcmVzcyA9IG5ld0FkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYmlydGhkYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCaXJ0aGRheShCaXJ0aGRheSBuZXdCaXJ0aGRheSkgewotICAgICAgICBiaXJ0aGRheSA9IG5ldyBCaXJ0aGRheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvb3AKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb29wKEJvb2xlYW4gbmV3Q29vcCkgewotICAgICAgICBjb29wID0gbmV3Q29vcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKlNldHMgdGhlIGVtYWlsIGFkZHJlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbEFkZHJlc3MoRW1haWxBZGRyZXNzIG5ld0VtYWlsQWRkcmVzcykgewotICAgICAgICBlbWFpbEFkZHJlc3MgPSBuZXdFbWFpbEFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBleWUgY29sb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeWVDb2xvcihSR0IgbmV3RXllQ29sb3IpIHsKLSAgICAgICAgZXllQ29sb3IgPSBuZXdFeWVDb2xvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGZ1bGwgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZ1bGxOYW1lKE5hbWUgbmV3RnVsbE5hbWUpIHsKLSAgICAgICAgZnVsbE5hbWUgPSBuZXdGdWxsTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGhhaXIgY29sb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIYWlyQ29sb3IoUkdCIG5ld0hhaXJDb2xvcikgewotICAgICAgICBoYWlyQ29sb3IgPSBuZXdIYWlyQ29sb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBwaG9uZSBudW1iZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaG9uZU51bWJlcihTdHJpbmcgbmV3UGhvbmVOdW1iZXIpIHsKLSAgICAgICAgcGhvbmVOdW1iZXIgPSBuZXdQaG9uZU51bWJlcjsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPk9yZ2FuaXphdGlvbkVsZW1lbnQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5JUHJvcGVydHlTb3VyY2U8L2NvZGU+IG1ldGhvZCAKLSAgICAgKiBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgU2V0YWJsZSBwcm9wZXJ0aWVzCi0gICAgICoKLSAgICAgKgkxKSBQX0FERFJFU1MsIGV4cGVjdHMgQWRkcmVzcwotICAgICAqCTIpIFBfRlVMTE5BTUUsIGV4cGVjdHMgTmFtZQotICAgICAqCTMpIFBfUEhPTkVOVU1CRVIsIGV4cGVjdHMgU3RyaW5nCi0gICAgICogIDQpIFBfRU1BSUwsIGV4cGVjdHMgRW1haWxBZGRyZXNzLgotICAgICAqICA1KSBQX0JPT0xFQU4sIGV4cGVjdHMgQm9vbGVhbiwgd2hldGhlciB0aGUgaW5kaXZpZHVhbCBpcyBhIGNvb3Agc3R1ZGVudCBvciBub3QKLSAgICAgKiAgNikgUF9CREFZLCBleHBlY3RzIEJpcnRoZGF5Ci0gICAgICogIDcpIFBfU0FMQVJZLCBleHBlY3RzIGphdmEubGFuZy5GbG9hdAotICAgICAqICA4KSBQX0hBSVJDT0xPUiwgZXhwZWN0cyBSR0IKLSAgICAgKiAgOSkgUF9FWUVDT0xPUiwgZXhwZWN0cyBSR0IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wS2V5LCBPYmplY3QgdmFsKSB7Ci0gICAgICAgIC8vIG5lZWQgdG8gY29udmVydCBmcm9tIFN0cmluZyB0byBkb21haW4gb2JqZWN0cwotICAgICAgICBpZiAocHJvcEtleS5lcXVhbHMoUF9JRF9BRERSRVNTKSkgewotICAgICAgICAgICAgLy9zZXRBZGRyZXNzKChBZGRyZXNzKXZhbCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BLZXkuZXF1YWxzKFBfSURfRlVMTE5BTUUpKSB7Ci0gICAgICAgICAgICBzZXRGdWxsTmFtZShuZXcgTmFtZSgoU3RyaW5nKSB2YWwpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcEtleS5lcXVhbHMoUF9JRF9QSE9ORU5VTUJFUikpIHsKLSAgICAgICAgICAgIHNldFBob25lTnVtYmVyKChTdHJpbmcpIHZhbCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BLZXkuZXF1YWxzKFBfSURfRU1BSUwpKSB7Ci0gICAgICAgICAgICBzZXRFbWFpbEFkZHJlc3MobmV3IEVtYWlsQWRkcmVzcygoU3RyaW5nKSB2YWwpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcEtleS5lcXVhbHMoUF9JRF9DT09QKSkgewotICAgICAgICAgICAgc2V0Q29vcCgoKEludGVnZXIpIHZhbCkuZXF1YWxzKFBfVkFMVUVfVFJVRSkgPyBCb29sZWFuLlRSVUUKLSAgICAgICAgICAgICAgICAgICAgOiBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcEtleS5lcXVhbHMoUF9JRF9CREFZKSkgewotICAgICAgICAgICAgLy9zZXRCaXJ0aGRheSgoQmlydGhkYXkpdmFsKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcEtleS5lcXVhbHMoUF9JRF9TQUxBUlkpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNldFNhbGFyeShuZXcgRmxvYXQoRmxvYXQucGFyc2VGbG9hdCgoU3RyaW5nKSB2YWwpKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHNldFNhbGFyeShzYWxhcnlfRGVmYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BLZXkuZXF1YWxzKFBfSURfSEFJUkNPTE9SKSkgewotICAgICAgICAgICAgc2V0SGFpckNvbG9yKChSR0IpIHZhbCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BLZXkuZXF1YWxzKFBfSURfRVlFQ09MT1IpKSB7Ci0gICAgICAgICAgICBzZXRFeWVDb2xvcigoUkdCKSB2YWwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNldFByb3BlcnR5VmFsdWUocHJvcEtleSwgdmFsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzYWxhcnkKLSAgICAgKi8KLSAgICB2b2lkIHNldFNhbGFyeShGbG9hdCBuZXdTYWxhcnkpIHsKLSAgICAgICAgc2FsYXJ5ID0gbmV3U2FsYXJ5OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldEZvcmVncm91bmQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgUkdCIGdldEZvcmVncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0QmFja2dyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBSR0IgZ2V0QmFja2dyb3VuZChPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L1VzZXJGaWxlUGFyc2VyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L1VzZXJGaWxlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZjIxNjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9FY2xpcHNlIFVJIEV4YW1wbGVzIFByb3BlcnR5U2hlZXQvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcHJvcGVydHlzaGVldC9Vc2VyRmlsZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYW4gZXhhbXBsZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBzaW1wbGUgcGFyc2VyLgotICovCi1wdWJsaWMgY2xhc3MgVXNlckZpbGVQYXJzZXIgewotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZmFicmljYXRlZCByZXN1bHQgZm9yIHRoaXMgZXhhbXBsZS4KLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIElBZGFwdGFibGUgZ2V0RmFicmljYXRlZFJlc3VsdCgpIHsKLSAgICAgICAgLy8gcmV0dXJucyBmYWJyaWNhdGVkIGlucHV0LiAKLSAgICAgICAgR3JvdXBFbGVtZW50IHJvb3QgPSBuZXcgR3JvdXBFbGVtZW50KAotICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiRXZlcnlib2R5IiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEdyb3VwRWxlbWVudCB1c2VyR3JvdXAgPSByb290LmNyZWF0ZVN1Ykdyb3VwKE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiQ29tcGFueV9JbmMiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgR3JvdXBFbGVtZW50IG90dEdyb3VwID0gdXNlckdyb3VwLmNyZWF0ZVN1Ykdyb3VwKE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiV2F0ZXJsb29fTGFiIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHVzZXJHcm91cC5jcmVhdGVTdWJHcm91cChNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlRvcm9udG9fTGFiIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHVzZXJHcm91cC5jcmVhdGVTdWJHcm91cChNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkhhbWlsdG9uX0xhYiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB1c2VyR3JvdXAuY3JlYXRlU3ViR3JvdXAoTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJMb25kb25fTGFiIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHVzZXJHcm91cC5jcmVhdGVTdWJHcm91cChNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkdyaW1zYnlfTGFiIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEdyb3VwRWxlbWVudCB1aVRlYW0gPSBvdHRHcm91cC5jcmVhdGVTdWJHcm91cChNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIlRlYW0xIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8vCi0gICAgICAgIFVzZXJFbGVtZW50IHVzZXIxID0gdWlUZWFtLmNyZWF0ZVVzZXIoInJpY2hhcmQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB1c2VyMS5zZXRGdWxsTmFtZShuZXcgTmFtZShNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlJpY2hhcmRfWm9rb2wiKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHVzZXIxLnNldEVtYWlsQWRkcmVzcyhuZXcgRW1haWxBZGRyZXNzKE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygicnpva29sQGNvbXBhbnkuY29tIikpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB1c2VyMS5zZXRQaG9uZU51bWJlcigieDc4OSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHVzZXIxCi0gICAgICAgICAgICAgICAgLnNldEFkZHJlc3MobmV3IEFkZHJlc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWV0QWRkcmVzcygyMzIsIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkNoYW1wbGFpbiIpKSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJIdWxsIiksIG5ldyBJbnRlZ2VyKDUpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkExQjJDMyIpKSk7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0gICAgICAgIHVzZXIxLnNldEJpcnRoZGF5KG5ldyBCaXJ0aGRheSgxOCwgMSwgMTk4MSkpOwotICAgICAgICB1c2VyMS5zZXRDb29wKG5ldyBCb29sZWFuKHRydWUpKTsKLSAgICAgICAgdXNlcjEuc2V0SGFpckNvbG9yKG5ldyBSR0IoMCwgMCwgMCkpOwotICAgICAgICB1c2VyMS5zZXRFeWVDb2xvcihuZXcgUkdCKDAsIDAsIDApKTsKLSAgICAgICAgLy8KLSAgICAgICAgVXNlckVsZW1lbnQgdXNlcjIgPSB1aVRlYW0uY3JlYXRlVXNlcigiZ2VvcmdlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXNlcjIuc2V0RnVsbE5hbWUobmV3IE5hbWUoTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJHZW9yZ2VfS251ZHNvbiIpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXNlcjIuc2V0RW1haWxBZGRyZXNzKG5ldyBFbWFpbEFkZHJlc3MoTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJna251ZHNvbkBjb21wYW55LmNvbSIpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXNlcjIuc2V0UGhvbmVOdW1iZXIoIng2NzgiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB1c2VyMgotICAgICAgICAgICAgICAgIC5zZXRBZGRyZXNzKG5ldyBBZGRyZXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVldEFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiVG9yb250byIpLCBuZXcgSW50ZWdlcig0KSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJBMUIyQzMiKSkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXNlcjIuc2V0QmlydGhkYXkobmV3IEJpcnRoZGF5KDcsIDUsIDE5NzgpKTsKLSAgICAgICAgdXNlcjIuc2V0Q29vcChuZXcgQm9vbGVhbih0cnVlKSk7Ci0gICAgICAgIHVzZXIyLnNldEhhaXJDb2xvcihuZXcgUkdCKDAsIDAsIDApKTsKLSAgICAgICAgdXNlcjIuc2V0RXllQ29sb3IobmV3IFJHQigwLCAwLCAwKSk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgVXNlckVsZW1lbnQgdXNlcjMgPSB1aVRlYW0uY3JlYXRlVXNlcigiYXJub2xkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXNlcjMuc2V0RnVsbE5hbWUobmV3IE5hbWUoTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJBcm5vbGRfUGFsbWVyIikpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB1c2VyMy5zZXRFbWFpbEFkZHJlc3MobmV3IEVtYWlsQWRkcmVzcyhNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoImFwYWxtZXJAY29tcGFueS5jb20iKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHVzZXIzLnNldFBob25lTnVtYmVyKCJ4NTY3Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXNlcjMKLSAgICAgICAgICAgICAgICAuc2V0QWRkcmVzcyhuZXcgQWRkcmVzcygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlZXRBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIk90dGF3YSIpLCBuZXcgSW50ZWdlcig0KSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJBMUIyQzMiKSkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXNlcjMuc2V0QmlydGhkYXkobmV3IEJpcnRoZGF5KDExLCAyMywgMTk2MikpOwotICAgICAgICB1c2VyMy5zZXRIYWlyQ29sb3IobmV3IFJHQigwLCAwLCAwKSk7Ci0gICAgICAgIHVzZXIzLnNldEV5ZUNvbG9yKG5ldyBSR0IoMCwgMCwgMCkpOwotCi0gICAgICAgIC8vCi0gICAgICAgIFVzZXJFbGVtZW50IHVzZXI0ID0gdWlUZWFtLmNyZWF0ZVVzZXIoImxlZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHVzZXI0LnNldEZ1bGxOYW1lKG5ldyBOYW1lKE1lc3NhZ2VVdGlsLmdldFN0cmluZygiTGVlX1RyZXZpbm8iKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHVzZXI0LnNldEVtYWlsQWRkcmVzcyhuZXcgRW1haWxBZGRyZXNzKE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygibHRyZXZpbm9AY29tcGFueS5jb20iKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHVzZXI0LnNldFBob25lTnVtYmVyKCJ4NDU2Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXNlcjQKLSAgICAgICAgICAgICAgICAuc2V0QWRkcmVzcyhuZXcgQWRkcmVzcygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlZXRBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIk90dGF3YSIpLCBuZXcgSW50ZWdlcig0KSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJBMUIyQzMiKSkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLy8KLSAgICAgICAgVXNlckVsZW1lbnQgdXNlcjUgPSB1aVRlYW0uY3JlYXRlVXNlcigidGlnZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB1c2VyNS5zZXRGdWxsTmFtZShuZXcgTmFtZShNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlRpZ2VyX1dvb2RzIikpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB1c2VyNS5zZXRFbWFpbEFkZHJlc3MobmV3IEVtYWlsQWRkcmVzcyhNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoInR3b29kc0Bjb21wYW55LmNvbSIpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXNlcjUuc2V0UGhvbmVOdW1iZXIoIngzNDUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB1c2VyNQotICAgICAgICAgICAgICAgIC5zZXRBZGRyZXNzKG5ldyBBZGRyZXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVldEFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiT3R0YXdhIiksIG5ldyBJbnRlZ2VyKDQpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkExQjJDMyIpKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotICAgICAgICAvLwotICAgICAgICBVc2VyRWxlbWVudCB1c2VyNiA9IHVpVGVhbS5jcmVhdGVVc2VyKCJqYWNrIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXNlcjYuc2V0RnVsbE5hbWUobmV3IE5hbWUoTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJKYWNrX05pY2tsYXVzIikpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB1c2VyNi5zZXRFbWFpbEFkZHJlc3MobmV3IEVtYWlsQWRkcmVzcyhNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoImpuaWNrbGF1c0Bjb21wYW55LmNvbSIpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXNlcjYuc2V0UGhvbmVOdW1iZXIoIngyMzQgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdXNlcjYKLSAgICAgICAgICAgICAgICAuc2V0QWRkcmVzcyhuZXcgQWRkcmVzcygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlZXRBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIk90dGF3YSIpLCBuZXcgSW50ZWdlcig0KSwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJBMUIyQzMiKSkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLy8KLSAgICAgICAgVXNlckVsZW1lbnQgZ3JlZyA9IHVpVGVhbS5jcmVhdGVVc2VyKCJ3ZXNsb2NrIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZ3JlZy5zZXRGdWxsTmFtZShuZXcgTmFtZShNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIldlc2xvY2siKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGdyZWcuc2V0RW1haWxBZGRyZXNzKG5ldyBFbWFpbEFkZHJlc3MoTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJ3ZXNsb2NrQGNvbXBhbnkuY29tIikpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBncmVnLnNldFBob25lTnVtYmVyKCJ4MTIzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZ3JlZwotICAgICAgICAgICAgICAgIC5zZXRBZGRyZXNzKG5ldyBBZGRyZXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVldEFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiT3R0YXdhIiksIG5ldyBJbnRlZ2VyKDQpLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkExQjJDMyIpKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHJldHVybiByb290OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBpbnB1dCBnaXZlbiBieSB0aGUgYXJndW1lbnQuIEZvciB0aGlzIGV4YW1wbGUgd2UgZG8gbm8gcGFyc2luZyBhbmQgcmV0dXJuCi0gICAgICogYSBmYWJyaWNhdGVkIHJlc3VsdC4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBJQWRhcHRhYmxlIHBhcnNlKElEb2N1bWVudFByb3ZpZGVyIGRvY3VtZW50UHJvdmlkZXIpIHsKLQotICAgICAgICByZXR1cm4gZ2V0RmFicmljYXRlZFJlc3VsdCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvbWVzc2FnZXMucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvRWNsaXBzZSBVSSBFeGFtcGxlcyBQcm9wZXJ0eVNoZWV0L29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3Byb3BlcnR5c2hlZXQvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhZDU4NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L0VjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9wcm9wZXJ0eXNoZWV0L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQWxiZXJ0YT1BbGJlcnRhCi1Ccml0aXNoX0NvbHVtYmlhPUJyaXRpc2ggQ29sdW1iaWEKLUNpdHk9Q2l0eQotTWFuaXRvYmE9TWFuaXRvYmEKLU5ld19CcnVuc3dpY2s9TmV3IEJydW5zd2ljawotTmV3Zm91bmRsYW5kPU5ld2ZvdW5kbGFuZAotTm9ydGhfV2VzdF9UZXJyaXRvcmllcz1Ob3J0aCBXZXN0IFRlcnJpdG9yaWVzCi1Ob3ZhX1Njb3RpYT1Ob3ZhIFNjb3RpYQotTnVuYXZ1dD1OdW5hdnV0Ci1PbnRhcmlvPU9udGFyaW8KLVBvc3RhbENvZGU9UG9zdGFsQ29kZQotUHJpbmNlX0Vkd2FyZF9Jc2xhbmQ9UHJpbmNlIEVkd2FyZCBJc2xhbmQKLVByb3ZpbmNlPVByb3ZpbmNlCi1RdWViZWM9UXVlYmVjCi1TYXNrYXRjaGV3YW49U2Fza2F0Y2hld2FuCi1TdHJlZXQ9U3RyZWV0Ci1ZdWtvbj1ZdWtvbgotX2lzX2FuX2ludmFsaWRfZm9ybWF0X2Zvcl9hX3Bvc3RhbF9jb2RlPXswfSBpcyBhbiBpbnZhbGlkIGZvcm1hdCBmb3IgYSBwb3N0YWwgY29kZQotcG9zdGFsX2NvZGVfaXNfaW5jb21wbGV0ZT1wb3N0YWwgY29kZSBpcyBpbmNvbXBsZXRlCi11bnNwZWNpZmllZF9jaXR5PXVuc3BlY2lmaWVkIGNpdHkKLUFwcmlsPUFwcmlsCi1BdWd1c3Q9QXVndXN0Ci1EZWNlbWJlcj1EZWNlbWJlcgotRmVicnVhcnk9RmVicnVhcnkKLUphbnVhcnk9SmFudWFyeQotSnVseT1KdWx5Ci1KdW5lPUp1bmUKLU1hcmNoPU1hcmNoCi1NYXk9TWF5Ci1Ob3ZlbWJlcj1Ob3ZlbWJlcgotT2N0b2Jlcj1PY3RvYmVyCi1TZXB0ZW1iZXI9U2VwdGVtYmVyCi1kYXk9ZGF5Ci1tb250aD1tb250aAoteWVhcj15ZWFyCi1kb21haW49ZG9tYWluCi1lbWFpbGFkZHJlc3NfY2Fubm90X2JlX3NldF90b19udWxsPWVtYWlsYWRkcmVzcyBjYW5ub3QgYmUgc2V0IHRvIG51bGwKLWludmFsaWRfZW1haWxfYWRkcmVzc19mb3JtYXRfc2hvdWxkX2hhdmVfYmVlbl92YWxpZGF0ZWQ9aW52YWxpZCBlbWFpbCBhZGRyZXNzIGZvcm1hdCwgc2hvdWxkIGhhdmUgYmVlbiB2YWxpZGF0ZWQKLXVua25vd25Eb21haW49dW5rbm93bkRvbWFpbgotdW5rbm93blVzZXI9dW5rbm93blVzZXIKLXVzZXJpZD11c2VyaWQKLWVtYWlsX2FkZHJlc3NfZG9lc19ub3RfaGF2ZV9hX3ZhbGlkX2Zvcm1hdD1lbWFpbCBhZGRyZXNzIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBmb3JtYXQKLWVtYWlsX2FkZHJlc3NfaXNfaW5jb21wbGV0ZT1lbWFpbCBhZGRyZXNzIGlzIGluY29tcGxldGUKLUZpcnN0TmFtZT1GaXJzdE5hbWUKLUxhc3ROYW1lPUxhc3ROYW1lCi1NaWRkbGU9TWlkZGxlCi1uYW1lPW5hbWUKLWFwdC5ub19vcl9ib3gubm89YXB0Lm5vIG9yIGJveC5ubwotYnVpbGRpbmdfbnVtYmVyPWJ1aWxkaW5nIG51bWJlcgotc3RyZWV0PXN0cmVldAotdW5zcGVjaWZpZWQ9dW5zcGVjaWZpZWQKLUVkaXRvcl9pbnN0cnVjdGlvbnM9Q2xpY2sgb24gdGhlIGl0ZW1zIGluIHRoZSBjb250ZW50IG91dGxpbmVcbnRvIHNlZSB0aGVpciBwcm9wZXJ0aWVzCi1hZGRyZXNzPWFkZHJlc3MKLWJpcnRoZGF5PWJpcnRoZGF5Ci1jb250YWN0PWNvbnRhY3QKLWNvb3Bfc3R1ZGVudD1jb29wIHN0dWRlbnQKLWVtYWlsPWVtYWlsCi1leWVjb2xvcj1leWVjb2xvcgotZmFsc2U9ZmFsc2UKLWZ1bGxuYW1lPWZ1bGxuYW1lCi1oYWlyY29sb3I9aGFpcmNvbG9yCi1wZXJzb25hbD1wZXJzb25hbAotcGVyc29uZWw9cGVyc29uZWwKLXBob25lbnVtYmVyPXBob25lbnVtYmVyCi1zYWxhcnk9c2FsYXJ5Ci1zYWxhcnlfaXNfaW52YWxpZD1zYWxhcnkgaXMgaW52YWxpZAotc2FsYXJ5X211c3RfYmVfZ3JlYXRvcl90aGFuX3plcm89c2FsYXJ5IG11c3QgYmUgZ3JlYXRvciB0aGFuIHplcm8KLXRydWU9dHJ1ZQotQTFCMkMzPUExQjJDMwotQXJub2xkX1BhbG1lcj1Bcm5vbGQgUGFsbWVyCi1DaGFtcGxhaW49Q2hhbXBsYWluCi1Db21wYW55X0luYz1Db21wYW55IEluYy4KLUV2ZXJ5Ym9keT1FdmVyeWJvZHkKLUdlb3JnZV9LbnVkc29uPUdlb3JnZSBLbnVkc29uCi1Hcmltc2J5X0xhYj1Hcmltc2J5IExhYgotSGFtaWx0b25fTGFiPUhhbWlsdG9uIExhYgotSHVsbD1IdWxsCi1KYWNrX05pY2tsYXVzPUphY2sgTmlja2xhdXMKLUxlZV9UcmV2aW5vPUxlZSBUcmV2aW5vCi1Mb25kb25fTGFiPUxvbmRvbiBMYWIKLU90dGF3YT1PdHRhd2EKLVJpY2hhcmRfWm9rb2w9UmljaGFyZCBab2tvbAotVGVhbTE9VGVhbTEKLVRpZ2VyX1dvb2RzPVRpZ2VyIFdvb2RzCi1Ub3JvbnRvPVRvcm9udG8KLVRvcm9udG9fTGFiPVRvcm9udG8gTGFiCi1XYXRlcmxvb19MYWI9V2F0ZXJsb28gTGFiCi1XZXNsb2NrPVdlc2xvY2sKLWFwYWxtZXJAY29tcGFueS5jb209YXBhbG1lckBjb21wYW55LmNvbQotZ2tudWRzb25AY29tcGFueS5jb209Z2tudWRzb25AY29tcGFueS5jb20KLWpuaWNrbGF1c0Bjb21wYW55LmNvbT1qbmlja2xhdXNAY29tcGFueS5jb20KLWx0cmV2aW5vQGNvbXBhbnkuY29tPWx0cmV2aW5vQGNvbXBhbnkuY29tCi1yem9rb2xAY29tcGFueS5jb209cnpva29sQGNvbXBhbnkuY29tCi10d29vZHNAY29tcGFueS5jb209dHdvb2RzQGNvbXBhbnkuY29tCi13ZXNsb2NrQGNvbXBhbnkuY29tPXdlc2xvY2tAY29tcGFueS5jb20KLVBvcHVwX01lbnVfQWN0aW9uX2V4ZWN1dGVkPVBvcHVwIE1lbnUgQWN0aW9uIGV4ZWN1dGVkCi1Qcm9wZXJ0eV9TaGVldF9FeGFtcGxlPVByb3BlcnR5IFNoZWV0IEV4YW1wbGUKLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9IZWxwQ29udGV4dHMueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTFlZDBhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxjb250ZXh0cz4KLQotICAgPGNvbnRleHQgIGlkPSJwaG9uZV9udW1iZXJfY29udGV4dCIgPgotICAgICAgPGRlc2NyaXB0aW9uPkhlbHAgZm9yIHBob25lIG51bWJlcjwvZGVzY3JpcHRpb24+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQzLmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDEiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDQuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgMiIvPgotICAgPC9jb250ZXh0PgotICAgPGNvbnRleHQgIGlkPSJhZGRyZXNzX2NvbnRleHQiID4KLSAgICAgIDxkZXNjcmlwdGlvbj5IZWxwIGZvciBhZGRyZXNzIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQzLmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDEiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDQuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgMiIvPgotICAgPC9jb250ZXh0PgotICAgPGNvbnRleHQgIGlkPSJmdWxsX25hbWVfY29udGV4dCIgPgotICAgICAgPGRlc2NyaXB0aW9uPkhlbHAgZm9yIGZ1bGwgbmFtZSA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHRvcGljIGhyZWY9ImNvbnRleHRzL1JlbGF0ZWRDb250ZXh0My5odG1sIiAgbGFiZWw9IkhlbHAgUmVsYXRlZCBUb3BpYyAxIi8+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQ0Lmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDIiLz4KLSAgIDwvY29udGV4dD4KLSAgIDxjb250ZXh0ICBpZD0iZW1haWxfY29udGV4dCIgPgotICAgICAgPGRlc2NyaXB0aW9uPkhlbHAgZm9yIGVtYWlsIGFkZHJlc3MgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDMuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgMSIvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbnRleHRzL1JlbGF0ZWRDb250ZXh0NC5odG1sIiAgbGFiZWw9IkhlbHAgUmVsYXRlZCBUb3BpYyAyIi8+Ci0gICA8L2NvbnRleHQ+Ci0gICA8Y29udGV4dCAgaWQ9ImNvb3BfY29udGV4dCIgPgotICAgICAgPGRlc2NyaXB0aW9uPkhlbHAgZm9yIGNvb3AgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDMuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgMSIvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbnRleHRzL1JlbGF0ZWRDb250ZXh0NC5odG1sIiAgbGFiZWw9IkhlbHAgUmVsYXRlZCBUb3BpYyAyIi8+Ci0gICA8L2NvbnRleHQ+Ci0gICA8Y29udGV4dCAgaWQ9ImJpcnRoZGF5X2NvbnRleHQiID4KLSAgICAgIDxkZXNjcmlwdGlvbj5IZWxwIGZvciBiaXJ0aGRheSA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHRvcGljIGhyZWY9ImNvbnRleHRzL1JlbGF0ZWRDb250ZXh0My5odG1sIiAgbGFiZWw9IkhlbHAgUmVsYXRlZCBUb3BpYyAxIi8+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQ0Lmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDIiLz4KLSAgIDwvY29udGV4dD4KLSAgIDxjb250ZXh0ICBpZD0ic2FsYXJ5X2NvbnRleHQiID4KLSAgICAgIDxkZXNjcmlwdGlvbj5IZWxwIGZvciBzYWxhcnkgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDMuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgMSIvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbnRleHRzL1JlbGF0ZWRDb250ZXh0NC5odG1sIiAgbGFiZWw9IkhlbHAgUmVsYXRlZCBUb3BpYyAyIi8+Ci0gICA8L2NvbnRleHQ+Ci0gICA8Y29udGV4dCAgaWQ9ImhhaXJfY29sb3JfY29udGV4dCIgPgotICAgICAgPGRlc2NyaXB0aW9uPkhlbHAgZm9yIGhhaXIgY29sb3IgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDMuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgMSIvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbnRleHRzL1JlbGF0ZWRDb250ZXh0NC5odG1sIiAgbGFiZWw9IkhlbHAgUmVsYXRlZCBUb3BpYyAyIi8+Ci0gICA8L2NvbnRleHQ+Ci0gICA8Y29udGV4dCAgaWQ9ImV5ZV9jb2xvcl9jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+SGVscCBmb3IgZXllIGNvbG9yIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQzLmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDEiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDQuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgMiIvPgotICAgPC9jb250ZXh0PgotCi08L2NvbnRleHRzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTc0ZmYzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUGx1Z2luLm5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogcHJvcGVydHlzaGVldC5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQuUHJvcGVydHlTaGVldFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBsdWdpbi5wcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aS52aWV3cywKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS50ZXh0LAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCi1FY2xpcHNlLUF1dG9TdGFydC1jb21tZW50OiBVc2UgRWNsaXBzZS1BdXRvU3RhcnQgaW5zdGVhZCBvZiBFY2xpcHNlLUxhenlTdGFydCBiZWNhdXNlIHRoZSBwcm9wZXJ0eSBzaGVldCBleGFtcGxlIHNob3VsZCBydW4gYWdhaW5zdCAzLjEgYXMgd2VsbCBhcyAzLjIuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzYxMzEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRlYWZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS5wcm9wZXJ0eXNoZWV0LmphciA9IEVjbGlwc2UgVUkgRXhhbXBsZXMgUHJvcGVydHlTaGVldC8KLQotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGRvYy56aXAsXAotICAgICAgICAgICAgICAgSGVscENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L2RvYy1odG1sL2hnbGVnYWwuaHRtIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9kb2MtaHRtbC9oZ2xlZ2FsLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxMDgxZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L2RvYy1odG1sL2hnbGVnYWwuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43MyBbZW5dIChXaW45ODsgVSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+TGVnYWwgTm90aWNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgzPgotPGEgTkFNRT0iTm90aWNlcyI+PC9hPk5vdGljZXM8L2gzPgotKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvZG9jLWh0bWwvdWlfcHJvcGVydHlzaGVldF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9kb2MtaHRtbC91aV9wcm9wZXJ0eXNoZWV0X2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MjA1YjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9kb2MtaHRtbC91aV9wcm9wZXJ0eXNoZWV0X2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5EZXNrdG9wIC0gUHJvcGVydHkgU2hlZXQgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPgotPGI+RXhhbXBsZSAtIFByb3BlcnR5IFNoZWV0PC9iPjwvaDI+Ci0KLTxoMz4KLUludHJvZHVjdGlvbjwvaDM+Ci1UaGUgUHJvcGVydHkgU2hlZXQgRXhhbXBsZSBhZGRzIGFuIGVkaXRvciBmb3IgZmlsZXMgd2l0aCB0aGUgLnVzciBleHRlbnNpb24KLWFuZCBhbHNvIGRlbW9uc3RyYXRlcyBob3cgdG8gYWRkIHByb3BlcnRpZXMgYW5kIG91dGxpbmUgdmlld3Mgb24gYSBmaWxlLgotPGJyPiZuYnNwOwotPGgzPgotUnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci1UbyBzdGFydCB1c2luZyB0aGUgUHJvcGVydHkgU2hlZXQgRXhhbXBsZSwgY3JlYXRlIGEgZmlsZSB3aXRoIGV4dGVuc2lvbgotLnVzci4mbmJzcDsmbmJzcDsgT3BlbiB0aGUgZmlsZSBhbmQgdGhlIE91dGxpbmUgYW5kIFByb3BlcnRpZXMgdmlld3MgdG8KLXNlZSB0aGUgZXhhbXBsZSBpbiBhY3Rpb24uJm5ic3A7IENsaWNrIG9uIGl0ZW1zIGluIHRoZSBPdXRsaW5lIHZpZXcgYW5kCi1sb29rIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIGRldGFpbHMgb2YgdGhlIHNlbGVjdGVkIGl0ZW0gaW4gdGhlIE91dGxpbmUKLXZpZXcuJm5ic3A7IFRoZSBwZW9wbGUgaXRlbXMgaW4gdGhlIGxpc3Qgc2hvdyB0aGUgbW9zdCBkZXRhaWwgaW4gdGhlIFByb3BlcnRpZXMKLXZpZXcuCi08aDQ+Ci08Yj5DcmVhdGluZyBhIG5ldyB1c3IgZmlsZTwvYj48L2g0PgotQ3JlYXRlIGEgbmV3IGZpbGUgd2l0aCBmaWxlIGV4dGVuc2lvbiAudXNyLiZuYnNwOyBGcm9tIHRoZSBGaWxlIG1lbnUsIHNlbGVjdAotTmV3IGFuZCB0aGVuIHNlbGVjdCBPdGhlci4uLiBmcm9tIHRoZSBzdWItbWVudS4mbmJzcDsgQ2xpY2sgb24gU2ltcGxlIGluCi10aGUgd2l6YXJkLCB0aGVuIHNlbGVjdAotPGJyPkZpbGUgaW4gdGhlIGxpc3Qgb24gdGhlIGxlZnQuJm5ic3A7IENsaWNrIG9uIE5leHQgdG8gc3VwcGx5IHRoZSBmaWxlCi1uYW1lIChtYWtlIHN1cmUgdGhlIGV4dGVuc2lvbiBpcyAudXNyKSBhbmQgdGhlIGZvbGRlciBpbiB3aGljaCB0aGUgZmlsZQotc2hvdWxkIGJlIGNvbnRhaW5lZC4KLTxicj4mbmJzcDsKLTxoMz4KLURldGFpbHM8L2gzPgotVGhlIFByb3BlcnR5IFNoZWV0IEV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBwcm92aWRlIHByb3BlcnRpZXMgdG8gdGhlCi1Qcm9wZXJ0eSBTaGVldCBWaWV3LgotPHA+VGhlIHRyZWUgdmlld2VyIG9mIHRoZSBDb250ZW50IE91dGxpbmUgVmlldyBjb250YWlucyBhbmQgcHJlc2VudHMgT3JnYW5pemF0aW9uRWxlbWVudHMuCi1XaGVuIGFuIGVsZW1lbnQgaXMgc2VsZWN0ZWQgaW4gdGhlIENvbnRlbnQgT3V0bGluZSBWaWV3IHRoZSBXb3Jrc3BhY2Ugd2lsbAotaW52b2tlIDx0dD5nZXRBZGFwdGVyPC90dD4KLW9uIHRoZSBzZWxlY3RlZCBPcmdhbml6YXRpb25FbGVtZW50LiBJZiBhbiBhZGFwdGVyIGlzIHJlcXVlc3RlZCBmb3IgSVByb3BlcnR5U291cmNlLAotdGhlIE9yZ2FuaXphdGlvbkVsZW1lbnQgcmV0dXJucyBpdHNlbGYgYXMgaXQgaW1wZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotVGhlIFByb3BlcnR5IFNoZWV0IFZpZXcgdGhlbiB1c2UgdGhlIE9yZ2FuaXphdGlvbiBFbGVtZW50IGFzIGl0IHNvdXJjZS4KLTxicj4mbmJzcDsKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9kb2MuemlwIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9kb2MuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWU4YWE5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvZG9jLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvaWNvbnMvb2JqMTYvdXNlcmVkaXRvci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L2ljb25zL29iajE2L3VzZXJlZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGQ3OTA3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvaWNvbnMvb2JqMTYvdXNlcmVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU1MzBlMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUGx1Z2luLm5hbWUgPSBVc2VyIEZpbGUgRWRpdG9yCi1QbHVnaW4ucHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLUVkaXRvcnMuVXNlckVkaXRvciA9IFVzZXIgRmlsZSBFZGl0b3IKLVBvcHVwTWVudXMuYWN0aW9uID0gU2hvdyBBY3Rpb24KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzNGE5ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBuYW1lPSIlRWRpdG9ycy5Vc2VyRWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdXNlcmVkaXRvci5naWYiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJ1c3IiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldC5Vc2VyRWRpdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQuVXNlckVkaXRvciI+Ci0gICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQuVXNlckVsZW1lbnQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucHJvcGVydHlzaGVldCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBvcHVwTWVudXMuYWN0aW9uIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQuUG9wdXBNZW51QWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5wcm9wZXJ0eXNoZWV0LmFjdGlvbjEiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotICAgICAgPGNvbnRleHRzCi0gICAgICAgICAgICBmaWxlPSJIZWxwQ29udGV4dHMueG1sIj4KLSAgICAgIDwvY29udGV4dHM+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5NDM3Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWJkMzRhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNXZWQgTWF5IDI1IDEwOjM5OjIyIEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTI1OGEyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUdWUgT2N0IDE4IDE1OjE1OjI3IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmphdmFkb2M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGdldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyY29tbWVudCIgbmFtZVw9ImdldHRlcmNvbW1lbnQiPi8qKlxuICogQHJldHVybiBSZXR1cm5zIHRoZSAke2JhcmVfZmllbGRfbmFtZX0uXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyY29tbWVudCIgbmFtZVw9InNldHRlcmNvbW1lbnQiPi8qKlxuICogQHBhcmFtICR7cGFyYW19IFRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yY29tbWVudCIgbmFtZVw9ImNvbnN0cnVjdG9yY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpbGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCI+LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIENvcHlyaWdodCAoYykgJHt5ZWFyfSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcbiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHBcOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuICpcbiAqIENvbnRyaWJ1dG9yc1w6XG4gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9ImZhbHNlIiBjb250ZXh0XD0idHlwZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgdHlwZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMudHlwZWNvbW1lbnQiIG5hbWVcPSJ0eXBlY29tbWVudCI+LyoqXG4gKiBAc2luY2UgMy4yXG4gKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWVsZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGZpZWxkcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWVsZGNvbW1lbnQiIG5hbWVcPSJmaWVsZGNvbW1lbnQiPi8qKlxuICogXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG5vbi1vdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJvdmVycmlkZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5vdmVycmlkZWNvbW1lbnQiIG5hbWVcPSJvdmVycmlkZWNvbW1lbnQiPi8qIChub24tSmF2YWRvYylcbiAqICR7c2VlX3RvX292ZXJyaWRkZW59XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im5ld3R5cGVfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubmV3dHlwZSIgbmFtZVw9Im5ld3R5cGUiPiR7ZmlsZWNvbW1lbnR9XG4ke3BhY2thZ2VfZGVjbGFyYXRpb259XG5cbiR7dHlwZWNvbW1lbnR9XG4ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgbWV0aG9kIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5Ij4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2xhc3Nib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjbGFzcyB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jbGFzc2JvZHkiIG5hbWVcPSJjbGFzc2JvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJpbnRlcmZhY2Vib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBpbnRlcmZhY2UgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuaW50ZXJmYWNlYm9keSIgbmFtZVw9ImludGVyZmFjZWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJlbnVtYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgZW51bSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5lbnVtYm9keSIgbmFtZVw9ImVudW1ib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iYW5ub3RhdGlvbmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGFubm90YXRpb24gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuYW5ub3RhdGlvbmJvZHkiIG5hbWVcPSJhbm5vdGF0aW9uYm9keSI+XG48L3RlbXBsYXRlPjwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvQnJvd3Nlci5wcm9kdWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvQnJvd3Nlci5wcm9kdWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFkZWU3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL0Jyb3dzZXIucHJvZHVjdAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P3BkZSB2ZXJzaW9uPSIzLjEiPz4KLQotPHByb2R1Y3QgbmFtZT0iJXByb2R1Y3ROYW1lIiBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIucHJvZHVjdCIgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmFwcCIgdXNlRmVhdHVyZXM9ImZhbHNlIj4KLQotICAgPGFib3V0SW5mbz4KLSAgICAgIDxpbWFnZSBwYXRoPSJpY29ucy9lY2xpcHNlX2xnLmdpZiIvPgotICAgICAgPHRleHQ+Ci0gICAgICAgICAlYWJvdXRUZXh0Ci0gICAgICA8L3RleHQ+Ci0gICA8L2Fib3V0SW5mbz4KLQotICAgPGNvbmZpZ0luaSB1c2U9ImRlZmF1bHQiLz4KLQotICAgPGxhdW5jaGVyQXJncz4KLSAgIDwvbGF1bmNoZXJBcmdzPgotCi0gICA8d2luZG93SW1hZ2VzIHNtYWxsPSJpY29ucy9lY2xpcHNlLmdpZiIgbGFyZ2U9Imljb25zL2VjbGlwc2UzMi5naWYiLz4KLQotCi0gICA8bGF1bmNoZXIgbmFtZT0iYnJvd3NlciI+Ci0gICAgICA8c29sYXJpcy8+Ci0gICAgICA8d2luIHVzZUljbz0iZmFsc2UiPgotICAgICAgICAgPGJtcC8+Ci0gICAgICA8L3dpbj4KLSAgIDwvbGF1bmNoZXI+Ci0KLSAgIDxwbHVnaW5zIGluY2x1ZGVGcmFnbWVudHM9ImZhbHNlIj4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuaGVscCIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamZhY2UiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0LmNhcmJvbi5tYWNvc3gucHBjIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4LmlhNjQiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsubGludXgucHBjIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4Lng4NiIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC54ODZfNjQiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsuc29sYXJpcy5zcGFyYyIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm1vdGlmLmFpeC5wcGMiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZi5ocHV4LmlhNjRfMzIiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZi5ocHV4LlBBX1JJU0MiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZi5saW51eC54ODYiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZi5zb2xhcmlzLnNwYXJjIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QucGhvdG9uLnFueC54ODYiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC53aW4zMi53Y2VfcHBjLmFybSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NiIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giLz4KLSAgIDwvcGx1Z2lucz4KLQotPC9wcm9kdWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRkM2VhZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBicm93c2VyLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIuQnJvd3NlclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQotRWNsaXBzZS1BdXRvU3RhcnQtY29tbWVudDogVXNlIEVjbGlwc2UtQXV0b1N0YXJ0IGluc3RlYWQgb2YgRWNsaXBzZS1MYXp5U3RhcnQgYmVjYXVzZSB0aGUgYnJvd3NlciBleGFtcGxlIHNob3VsZCBydW4gYWdhaW5zdCAzLjEgYXMgd2VsbCBhcyAzLjIuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzNjEzMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZGI1OWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgY29uZmlnX3dpbjMyLmluaSxcCi0gICAgICAgICAgICAgICBjb25maWdfbW90aWYuaW5pLFwKLSAgICAgICAgICAgICAgIGNvbmZpZ19tYWNvc3gtY2FyYm9uLmluaSxcCi0gICAgICAgICAgICAgICBjb25maWdfZ3RrLmluaSxcCi0gICAgICAgICAgICAgICBjb25maWdfZ3RrLWFtZDY0LmluaSxcCi0gICAgICAgICAgICAgICByZWFkbWUuaHRtbCxcCi0gICAgICAgICAgICAgICBzcGxhc2guYm1wLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlLmJyb3dzZXIuamFyID0gc3JjLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBjb25maWdfZ3RrLWFtZDY0LmluaSxcCi0gICAgICAgICAgICAgICBjb25maWdfZ3RrLmluaSxcCi0gICAgICAgICAgICAgICBjb25maWdfbW90aWYuaW5pLFwKLSAgICAgICAgICAgICAgIGNvbmZpZ19tYWNvc3gtY2FyYm9uLmluaSxcCi0gICAgICAgICAgICAgICBjb25maWdfd2luMzIuaW5pLFwKLSAgICAgICAgICAgICAgIHJlYWRtZS5odG1sCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9pY29ucy9hbHQxNi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9pY29ucy9hbHQxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NjI2YjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvaWNvbnMvYWx0MTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvaWNvbnMvYWx0MzIuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvaWNvbnMvYWx0MzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDMyZjg4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL2ljb25zL2FsdDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL2ljb25zL2FsdF9hYm91dC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9pY29ucy9hbHRfYWJvdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGQ5YWQyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL2ljb25zL2FsdF9hYm91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9pY29ucy9lY2xpcHNlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL2ljb25zL2VjbGlwc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2EzN2UwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL2ljb25zL2VjbGlwc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvaWNvbnMvZWNsaXBzZTMyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL2ljb25zL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MWE4ZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvaWNvbnMvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL2ljb25zL2VjbGlwc2VfbGcuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvaWNvbnMvZWNsaXBzZV9sZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzA4MzguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvaWNvbnMvZWNsaXBzZV9sZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE4OTMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT0gQnJvd3NlciBFeGFtcGxlCi1wcm92aWRlck5hbWU9IEVjbGlwc2Uub3JnCi0KLXByb2R1Y3ROYW1lPSBCcm93c2VyIEV4YW1wbGUKLWFwcE5hbWU9IEJyb3dzZXIgRXhhbXBsZSBBcHAKLXBlcnNwZWN0aXZlcy5icm93c2VyLm5hbWU9IEJyb3dzZXIgRXhhbXBsZQotdmlld3MuY2F0ZWdvcnkubmFtZT0gQnJvd3NlciBFeGFtcGxlCi12aWV3cy5icm93c2VyLm5hbWU9IEJyb3dzZXIKLXZpZXdzLmhpc3RvcnkubmFtZT0gSGlzdG9yeQotCi1zd3RBcHBOYW1lPSBCcm93c2VyRXhhbXBsZQotYWJvdXRUZXh0PSBCcm93c2VyIEV4YW1wbGUgXG5cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAzLCAyMDA0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZThkMTIzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiCi0gICAgICAgICBpZD0iYXBwIgotICAgICAgICAgbmFtZT0iJWFwcE5hbWUiPgotICAgICAgPGFwcGxpY2F0aW9uPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLkJyb3dzZXJBcHAiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzIj4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmJyb3dzZXJQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIG5hbWU9IiVwZXJzcGVjdGl2ZXMuYnJvd3Nlci5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLkJyb3dzZXJQZXJzcGVjdGl2ZUZhY3RvcnkiCi0JCQlmaXhlZD0iZmFsc2UiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyIgotICAgICAgICAgICAgbmFtZT0iJXZpZXdzLmNhdGVnb3J5Lm5hbWUiLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIuYnJvd3NlclZpZXciCi0gICAgICAgICAgICBuYW1lPSIldmlld3MuYnJvd3Nlci5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZWNsaXBzZS5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIuQnJvd3NlclZpZXciCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIiCi0gICAgICAgICAgICBhbGxvd011bHRpcGxlPSJ0cnVlIi8+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmhpc3RvcnlWaWV3IgotICAgICAgICAgICAgbmFtZT0iJXZpZXdzLmhpc3RvcnkubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2VjbGlwc2UuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLkhpc3RvcnlWaWV3IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJvZHVjdHMiCi0gICAgICAgICBpZD0icHJvZHVjdCI+Ci0gICAgICA8cHJvZHVjdAotICAgICAgICAgICAgbmFtZT0iJXByb2R1Y3ROYW1lIgotICAgICAgICAgICAgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmFwcCI+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9ImFwcE5hbWUiCi0gICAgICAgICAgICAgICB2YWx1ZT0iJXN3dEFwcE5hbWUiLz4KLSAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgbmFtZT0id2luZG93SW1hZ2VzIgotICAgICAgICAgICAgICAgdmFsdWU9Imljb25zL2VjbGlwc2UuZ2lmLGljb25zL2VjbGlwc2UzMi5naWYiLz4KLSAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgbmFtZT0iYWJvdXRUZXh0IgotICAgICAgICAgICAgICAgdmFsdWU9IiVhYm91dFRleHQiLz4KLSAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgbmFtZT0iYWJvdXRJbWFnZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJpY29ucy9lY2xpcHNlX2xnLmdpZiIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJwcmVmZXJlbmNlQ3VzdG9taXphdGlvbiIKLSAgICAgICAgICAgICAgIHZhbHVlPSJwbHVnaW5fY3VzdG9taXphdGlvbi5pbmkiLz4KLSAgICAgIDwvcHJvZHVjdD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iQnJvd3NlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5jb21tYW5kcy5icm93c2VyQ2F0ZWdvcnkiLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5jb21tYW5kcy5icm93c2VyQ2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJCYWNrIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmNvbW1hbmRzLmJhY2siLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5jb21tYW5kcy5icm93c2VyQ2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJGb3J3YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmNvbW1hbmRzLmZvcndhcmQiLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5jb21tYW5kcy5icm93c2VyQ2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJTdG9wIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmNvbW1hbmRzLnN0b3AiLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5jb21tYW5kcy5icm93c2VyQ2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJSZWZyZXNoIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmNvbW1hbmRzLnJlZnJlc2giLz4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5jb21tYW5kcy5icm93c2VyQ2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJOZXcgVGFiIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmNvbW1hbmRzLm5ld1RhYiIvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmNvbW1hbmRzLmJyb3dzZXJDYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9Ikhpc3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIuY29tbWFuZHMuaGlzdG9yeSIvPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmNvbW1hbmRzLmJyb3dzZXJDYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IkVhc3RlciBFZ2ciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIuY29tbWFuZHMuZWFzdGVyRWdnIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyI+Ci0gICAgICA8c2NoZW1lCi0gICAgICAgICAgICBuYW1lPSJCcm93c2VyIEtleXMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIua2V5Q29uZmlndXJhdGlvbiIvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5jb21tYW5kcy5iYWNrIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0zK0FSUk9XX0xFRlQiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIua2V5Q29uZmlndXJhdGlvbiIvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5jb21tYW5kcy5mb3J3YXJkIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0zK0FSUk9XX1JJR0hUIgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmtleUNvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIuY29tbWFuZHMuc3RvcCIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJFU0MiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIua2V5Q29uZmlndXJhdGlvbiIvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5jb21tYW5kcy5yZWZyZXNoIgotICAgICAgICAgICAgc2VxdWVuY2U9IkY1IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyLmtleUNvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIuY29tbWFuZHMubmV3VGFiIgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK1QiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIua2V5Q29uZmlndXJhdGlvbiIvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5jb21tYW5kcy5oaXN0b3J5IgotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK0giCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIua2V5Q29uZmlndXJhdGlvbiIvPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5jb21tYW5kcy5lYXN0ZXJFZ2ciCi0gICAgICAgICAgICBzZXF1ZW5jZT0iTTErTTIrRSIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5rZXlDb25maWd1cmF0aW9uIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5Ccm93c2VyUHJlZmVyZW5jZUluaXRpYWxpemVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9wbHVnaW5fY3VzdG9taXphdGlvbi5pbmkgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9wbHVnaW5fY3VzdG9taXphdGlvbi5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YmU2OWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vcmcuZWNsaXBzZS51aS9ET0NLX1BFUlNQRUNUSVZFX0JBUj10b3BSaWdodAotb3JnLmVjbGlwc2UudWkvS0VZX0NPTkZJR1VSQVRJT05fSUQ9b3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIua2V5Q29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvcmVhZG1lLmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9yZWFkbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyMWFkNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9yZWFkbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotPHRpdGxlPkVjbGlwc2UgUkNQIEJyb3dzZXIgRXhhbXBsZTwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBSQ1AgQnJvd3NlciBFeGFtcGxlPC9oMj4KLSAKLTxwPkxhc3QgdXBkYXRlZCBNYXkgMjEsIDIwMDQ8L3A+CQotCi08aDM+RGVzY3JpcHRpb248L2gzPgotPHA+VGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgc2ltcGxlIEVjbGlwc2UgUmljaCBDbGllbnQgUGxhdGZvcm0gKFJDUCkgYXBwbGljYXRpb24uCi1JdCBpcyBhIGJhcmUgYm9uZXMgd2ViIGJyb3dzZXIsIHVzaW5nIHRoZSBTV1QgQnJvd3NlciBjb250cm9sLgotPC9wPgotPHA+Ci1UaGUgY29kZSBpcyBpbiBwYWNrYWdlIDxjb2RlPm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmJyb3dzZXI8L2NvZGU+LCBhbmQgY29uc2lzdHMKLW9mIGFuIGFwcGxpY2F0aW9uIGNsYXNzICg8Y29kZT5Ccm93c2VyQXBwPC9jb2RlPiksIGEgd29ya2JlbmNoIGFkdmlzb3IgZm9yIAotY29uZmlndXJpbmcgdGhlIHdvcmtiZW5jaCAoPGNvZGU+QnJvd3NlckFkdmlzb3I8L2NvZGU+KSwgYW5kIGEgc2luZ2xlIHBlcnNwZWN0aXZlIAotKDxjb2RlPkJyb3dzZXJQZXJzcGVjdGl2ZUZhY3Rvcnk8L2NvZGU+KSBjb250YWluaW5nIGEgc2luZ2xlIHZpZXcgKDxjb2RlPkJyb3dzZXJWaWV3PC9jb2RlPikuCi08L3A+Ci08cD4KLVRoZSBhcHBsaWNhdGlvbiBkZWZpbmVzIHNldmVyYWwgYnVpbHQtaW4gYWN0aW9ucyBpbiB0aGUgbWVudSBhbmQgdG9vbGJhciB0aGF0IGFyZQotdHlwaWNhbCBmb3Igd2ViIGJyb3dzZXJzIChCYWNrLCBGb3J3YXJkLCBTdG9wLCBSZWZyZXNoKS4gIFRoZXNlIGFyZSBhZGRlZCBpbiAKLTxjb2RlPkJyb3dzZXJBY3Rpb25CdWlsZGVyPC9jb2RlPiB3aGVuIGEgbmV3IHdpbmRvdyBpcyBvcGVuZWQgKHNlZSAKLTxjb2RlPkJyb3dzZXJBZHZpc29yLmZpbGxBY3Rpb25CYXJzKC4uLik8L2NvZGU+KS4gIFRoZXNlIGFjdGlvbnMgYXJlIGRlZmluZWQgYXMgCi1yZXRhcmdldGFibGUgYWN0aW9ucywgZm9yIHdoaWNoIHRoZSB2aWV3IHJlZ2lzdGVycyBoYW5kbGluZyBhY3Rpb25zLgotPC9wPgotPHA+Ci1UaGUgdmlldyBjb25zaXN0cyBvZiBhbiBhZGRyZXNzIGJhciAoYSA8Y29kZT5MYWJlbDwvY29kZT4gYW5kIGEgPGNvZGU+VGV4dDwvY29kZT4KLWNvbnRyb2wpIGFuZCB0aGUgPGNvZGU+QnJvd3NlcjwvY29kZT4gY29udHJvbC4gIFRvIGhhbmRsZSBzdGF0dXMgYW5kIHByb2dyZXNzCi1ldmVudHMsIGl0IHNpbXBseSBwYXNzZXMgb24gdGhlIHJlbGV2YW50IGV2ZW50cyBmcm9tIHRoZSA8Y29kZT5Ccm93c2VyPC9jb2RlPiAKLWNvbnRyb2wgdG8gdGhlIFdvcmtiZW5jaCBzdGF0dXMgbGluZS4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotVG8gcnVuIHRoZSBSQ1AgQnJvd3NlciBleGFtcGxlIGZyb20gd2l0aGluIHRoZSBFY2xpcHNlIFNESzoKLTxvbD4KLTxsaT5Mb2FkIHByb2plY3Qgb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIKLWZyb20gdGhlIEVjbGlwc2UgcmVwb3NpdG9yeSBpbnRvIGEgc2VsZi1ob3N0aW5nIHdvcmtzcGFjZS48L2xpPgotPGxpPkNyZWF0ZSBhIG5ldyAiUnVuLXRpbWUgd29ya2JlbmNoIiBsYXVuY2ggY29uZmlndXJhdGlvbiBjYWxsZWQgIkJyb3dzZXIgRXhhbXBsZSIuPC9saT4KLTxsaT5PbiB0aGUgIkFyZ3VtZW50cyIgdGFiLCBzZWxlY3QgIlJ1biBhIHByb2R1Y3QiIGFuZCBjaG9vc2Ugc2VsZWN0ICJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci5wcm9kdWN0IiBmcm9tIHRoZSBkcm9wLWRvd24uPC9saT4KLTxsaT5PbiB0aGUgIlBsdWctaW5zIiB0YWIsIGNvbmZpZ3VyZSBpdCB0byBpbmNsdWRlIG9ubHkgdGhlIAotICByZXF1aXJlZCBwbHVnLWluczoKLSAgPHVsPgotICA8bGk+UHJlc3MgIkRlc2VsZWN0IEFsbCI8L2xpPgotICA8bGk+Q2hlY2sgIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyIjwvbGk+Ci0gIDxsaT5QcmVzcyAiQWRkIFJlcXVpcmVkIFBsdWctaW5zIjwvbGk+Ci0gIDxsaT5DaGVjayAib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvciI8L2xpPgotICA8L3VsPgotPC9saT4KLTxsaT5SdW4gb3IgZGVidWcgdGhlIGxhdW5jaCBjb25maWcuPC9saT4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9zcGxhc2guYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvc3BsYXNoLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNzc3MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9zcGxhc2guYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JjcC9icm93c2VyL0Jyb3dzZXJBY3Rpb25CYXJBZHZpc29yLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmNwL2Jyb3dzZXIvQnJvd3NlckFjdGlvbkJhckFkdmlzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4MTE1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmNwL2Jyb3dzZXIvQnJvd3NlckFjdGlvbkJhckFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlJldGFyZ2V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLkFjdGlvbkJhckFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSUFjdGlvbkJhckNvbmZpZ3VyZXI7Ci0KLS8qKgotICogQnVpbGRzIHRoZSBhY3Rpb25zIGFuZCBwb3B1bGF0ZXMgdGhlIG1lbnViYXIgYW5kIHRvb2xiYXIgd2hlbiBhIG5ldyB3aW5kb3cKLSAqIGlzIG9wZW5lZC4KLSAqIFRoaXMgd29yayBpcyBmYWN0b3JlZCBpbnRvIGEgc2VwYXJhdGUgY2xhc3MgdG8gYXZvaWQgY2x1dHRlcmluZyAKLSAqIDxjb2RlPkJyb3dzZXJBZHZpc29yPC9jb2RlPgotICogPHA+Ci0gKiBUaGlzIGFkZHMgc2V2ZXJhbCBhY3Rpb25zIHRvIHRoZSBtZW51cyBhbmQgdG9vbGJhciB0aGF0IGFyZSB0eXBpY2FsIGZvciAKLSAqIHdlYiBicm93c2VycyAoZS5nLiBCYWNrLCBGb3J3YXJkLCBTdG9wLCBSZWZyZXNoKS4gIFRoZXNlIGFyZSBkZWZpbmVkIGFzIAotICogcmV0YXJnZXRhYmxlIGFjdGlvbnMsIGZvciB3aGljaCB0aGUgPGNvZGU+QnJvd3NlclZpZXc8L2NvZGU+IHJlZ2lzdGVycyAKLSAqIGhhbmRsaW5nIGFjdGlvbnMuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIEJyb3dzZXJBY3Rpb25CYXJBZHZpc29yIGV4dGVuZHMgQWN0aW9uQmFyQWR2aXNvciB7Ci0KLQlwcml2YXRlIElBY3Rpb24gbmV3V2luZG93QWN0aW9uLCBuZXdUYWJBY3Rpb24sIHF1aXRBY3Rpb24sIGhpc3RvcnlBY3Rpb24sIGFib3V0QWN0aW9uOwotICAgIHByaXZhdGUgUmV0YXJnZXRBY3Rpb24gYmFja0FjdGlvbiwgZm9yd2FyZEFjdGlvbiwgc3RvcEFjdGlvbiwgcmVmcmVzaEFjdGlvbjsgCi0KLSAgICBwdWJsaWMgQnJvd3NlckFjdGlvbkJhckFkdmlzb3IoSUFjdGlvbkJhckNvbmZpZ3VyZXIgY29uZmlndXJlcikgewotICAgICAgICBzdXBlcihjb25maWd1cmVyKTsKLQl9Ci0gICAgCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUFjdGlvbnMoZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgSVNoYXJlZEltYWdlcyBpbWFnZXMgPSB3aW5kb3cuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCQotCQluZXdXaW5kb3dBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk9QRU5fTkVXX1dJTkRPVy5jcmVhdGUod2luZG93KTsKLSAgICAgICAgbmV3V2luZG93QWN0aW9uLnNldFRleHQoIiZOZXcgV2luZG93Iik7Ci0gICAgICAgIHJlZ2lzdGVyKG5ld1dpbmRvd0FjdGlvbik7Ci0JCQotCQluZXdUYWJBY3Rpb24gPSBuZXcgQWN0aW9uKCJOZXcgJlRhYiIpIHsgLy8kTk9OLU5MUy0xJAotCQkgICAgaW50IGNvdW50ZXIgPSAwOwotCQkgICAgeyBzZXRJZCgibmV3VGFiIik7Ci0gICAgICAgICAgICAgIHNldEFjdGlvbkRlZmluaXRpb25JZChJQnJvd3NlckNvbnN0YW50cy5DT01NQU5EX1BSRUZJWCArICJuZXdUYWIiKTsgfSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY29uZGFyeUlkID0gSW50ZWdlci50b1N0cmluZygrK2NvdW50ZXIpOwotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5zaG93VmlldyhJQnJvd3NlckNvbnN0YW50cy5CUk9XU0VSX1ZJRVdfSUQsIHNlY29uZGFyeUlkLCBJV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JCX07Ci0gICAgICAgIHJlZ2lzdGVyKG5ld1RhYkFjdGlvbik7Ci0JCQotCQlxdWl0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5RVUlULmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihxdWl0QWN0aW9uKTsKLQkJCi0gICAgICAgIGJhY2tBY3Rpb24gPSBuZXcgUmV0YXJnZXRBY3Rpb24oImJhY2siLCAiJkJhY2siKTsKLSAgICAgICAgYmFja0FjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUJyb3dzZXJDb25zdGFudHMuQ09NTUFORF9QUkVGSVggKyAiYmFjayIpOyAvLyROT04tTkxTLTEkCi0JCWJhY2tBY3Rpb24uc2V0VG9vbFRpcFRleHQoIkJhY2siKTsKLQkJYmFja0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0JBQ0spKTsKLQkJd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKGJhY2tBY3Rpb24pOwotICAgICAgICByZWdpc3RlcihiYWNrQWN0aW9uKTsKLQkJCi0gICAgICAgIGZvcndhcmRBY3Rpb24gPSBuZXcgUmV0YXJnZXRBY3Rpb24oImZvcndhcmQiLCAiJkZvcndhcmQiKTsKLSAgICAgICAgZm9yd2FyZEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUJyb3dzZXJDb25zdGFudHMuQ09NTUFORF9QUkVGSVggKyAiZm9yd2FyZCIpOyAvLyROT04tTkxTLTEkCi0JCWZvcndhcmRBY3Rpb24uc2V0VG9vbFRpcFRleHQoIkZvcndhcmQiKTsKLQkJZm9yd2FyZEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0ZPUldBUkQpKTsKLQkJd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKGZvcndhcmRBY3Rpb24pOwotCQlyZWdpc3Rlcihmb3J3YXJkQWN0aW9uKTsKLQkJCi0JCXN0b3BBY3Rpb24gPSBuZXcgUmV0YXJnZXRBY3Rpb24oInN0b3AiLCAiU3RvJnAiKTsKLSAgICAgICAgc3RvcEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUJyb3dzZXJDb25zdGFudHMuQ09NTUFORF9QUkVGSVggKyAic3RvcCIpOyAvLyROT04tTkxTLTEkCi0JCXN0b3BBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlN0b3AiKTsKLQkJd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKHN0b3BBY3Rpb24pOwotCQlyZWdpc3RlcihzdG9wQWN0aW9uKTsKLQkJCi0JCXJlZnJlc2hBY3Rpb24gPSBuZXcgUmV0YXJnZXRBY3Rpb24oInJlZnJlc2giLCAiJlJlZnJlc2giKTsKLSAgICAgICAgcmVmcmVzaEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUJyb3dzZXJDb25zdGFudHMuQ09NTUFORF9QUkVGSVggKyAicmVmcmVzaCIpOyAvLyROT04tTkxTLTEkCi0JCXJlZnJlc2hBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlJlZnJlc2giKTsKLQkJd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKHJlZnJlc2hBY3Rpb24pOwotCQlyZWdpc3RlcihyZWZyZXNoQWN0aW9uKTsKLQkJCi0JCWhpc3RvcnlBY3Rpb24gPSBuZXcgQWN0aW9uKCJIaXN0b3J5IiwgSUFjdGlvbi5BU19DSEVDS19CT1gpIHsgLy8kTk9OLU5MUy0xJAotCQkgICAgeyBzZXRJZCgiaGlzdG9yeSIpOwotICAgICAgICAgICAgICBzZXRBY3Rpb25EZWZpbml0aW9uSWQoSUJyb3dzZXJDb25zdGFudHMuQ09NTUFORF9QUkVGSVggKyAiaGlzdG9yeSIpOyB9IC8vJE5PTi1OTFMtMSQKLQkJICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJICAgICAgICB0cnkgewotCQkgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJICAgICAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkgICAgICAgICAgICAgICAgSVZpZXdQYXJ0IGhpc3RvcnlWaWV3ID0gcGFnZS5maW5kVmlldyhJQnJvd3NlckNvbnN0YW50cy5ISVNUT1JZX1ZJRVdfSUQpOwotCQkgICAgICAgICAgICAgICAgaWYgKGhpc3RvcnlWaWV3ID09IG51bGwpIHsKLQkJICAgICAgICAgICAgICAgICAgICBwYWdlLnNob3dWaWV3KElCcm93c2VyQ29uc3RhbnRzLkhJU1RPUllfVklFV19JRCk7Ci0JCSAgICAgICAgICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKLQkJICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgIGVsc2UgewotCQkgICAgICAgICAgICAgICAgICAgIHBhZ2UuaGlkZVZpZXcoaGlzdG9yeVZpZXcpOwotCQkgICAgICAgICAgICAgICAgICAgIHNldENoZWNrZWQoZmFsc2UpOwotCQkgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLQkJICAgIH0KLQkJfTsKLSAgICAgICAgcmVnaXN0ZXIoaGlzdG9yeUFjdGlvbik7Ci0KLQkJYWJvdXRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkFCT1VULmNyZWF0ZSh3aW5kb3cpOwotICAgICAgICByZWdpc3RlcihhYm91dEFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnVCYXIoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKLQkJSU1lbnVNYW5hZ2VyIGZpbGVNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCImRmlsZSIsICJmaWxlIik7ICAvLyROT04tTkxTLTIkCi0JCW1lbnVCYXIuYWRkKGZpbGVNZW51KTsKLSAgICAgICAgZmlsZU1lbnUuYWRkKG5ld1dpbmRvd0FjdGlvbik7Ci0gICAgICAgIGZpbGVNZW51LmFkZChuZXdUYWJBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgZmlsZU1lbnUuYWRkKHF1aXRBY3Rpb24pOwotCQkKLQkJSU1lbnVNYW5hZ2VyIHZpZXdNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCImVmlldyIsICJ2aWV3Iik7ICAvLyROT04tTkxTLTIkCi0JCW1lbnVCYXIuYWRkKHZpZXdNZW51KTsKLSAgICAgICAgdmlld01lbnUuYWRkKGJhY2tBY3Rpb24pOwotICAgICAgICB2aWV3TWVudS5hZGQoZm9yd2FyZEFjdGlvbik7Ci0gICAgICAgIHZpZXdNZW51LmFkZChzdG9wQWN0aW9uKTsKLSAgICAgICAgdmlld01lbnUuYWRkKHJlZnJlc2hBY3Rpb24pOwotCQl2aWV3TWVudS5hZGQobmV3IFNlcGFyYXRvcigidmlld3MiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdmlld01lbnUuYWRkKGhpc3RvcnlBY3Rpb24pOwotCi0JCUlNZW51TWFuYWdlciBoZWxwTWVudSA9IG5ldyBNZW51TWFuYWdlcigiJkhlbHAiLCAiaGVscCIpOyAgLy8kTk9OLU5MUy0yJAotCQltZW51QmFyLmFkZChoZWxwTWVudSk7Ci0gICAgICAgIGhlbHBNZW51LmFkZChhYm91dEFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvb2xCYXIoSUNvb2xCYXJNYW5hZ2VyIGNvb2xCYXIpIHsKLQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXIgPSBuZXcgVG9vbEJhck1hbmFnZXIoU1dULkZMQVQgfCBTV1QuUklHSFQpOwotCQljb29sQmFyLmFkZChuZXcgVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0odG9vbEJhciwgInN0YW5kYXJkIikpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBGb3IgdGhlIEJhY2sgYW5kIEZvcndhcmQgYWN0aW9ucywgZm9yY2UgdGhlaXIgdGV4dCB0byBiZSBzaG93biBvbiB0aGUgdG9vbGJhciwKLQkJLy8gbm90IGp1c3QgdGhlaXIgaW1hZ2UuICBGb3IgdGhlIHJlbWFpbmluZyBhY3Rpb25zLCB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbQotCQkvLyBpcyBjcmVhdGVkIGltcGxpY2l0bHkgd2l0aCB0aGUgZGVmYXVsdCBwcmVzZW50YXRpb24gbW9kZS4KLQkJQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBiYWNrQ0kgPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShiYWNrQWN0aW9uKTsKLQkJYmFja0NJLnNldE1vZGUoQWN0aW9uQ29udHJpYnV0aW9uSXRlbS5NT0RFX0ZPUkNFX1RFWFQpOwotCQl0b29sQmFyLmFkZChiYWNrQ0kpOwotCQkKLQkJQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBmb3J3YXJkQ0kgPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShmb3J3YXJkQWN0aW9uKTsKLQkJZm9yd2FyZENJLnNldE1vZGUoQWN0aW9uQ29udHJpYnV0aW9uSXRlbS5NT0RFX0ZPUkNFX1RFWFQpOwotCQl0b29sQmFyLmFkZChmb3J3YXJkQ0kpOwotCi0gICAgICAgIHRvb2xCYXIuYWRkKHN0b3BBY3Rpb24pOwotICAgICAgICB0b29sQmFyLmFkZChyZWZyZXNoQWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmNwL2Jyb3dzZXIvQnJvd3NlckFkdmlzb3IuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yY3AvYnJvd3Nlci9Ccm93c2VyQWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjE0YmE1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yY3AvYnJvd3Nlci9Ccm93c2VyQWR2aXNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaENvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yOwotCi0vKioKLSAqIFRoZSB3b3JrYmVuY2ggYWR2aXNvciBmb3IgdGhlIGJyb3dzZXIgZXhhbXBsZS4KLSAqIENvbmZpZ3VyZXMgdGhlIHdvcmtiZW5jaCBhcyBuZWVkZWQgZm9yIHRoZSBicm93c2VyIGV4YW1wbGUsIGluY2x1ZGluZwotICogc3BlY2lmeWluZyB0aGUgZGVmYXVsdCBwZXJzcGVjdGl2ZSBpZC4KLSAqIENyZWF0ZXMgdGhlIHdvcmtiZW5jaCB3aW5kb3cgYWR2aXNvciBmb3IgY29uZmlndXJpbmcgZWFjaCBuZXcgd2luZG93IAotICogYXMgaXQgaXMgYmVpbmcgb3BlbmVkLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2VyQWR2aXNvciBleHRlbmRzIFdvcmtiZW5jaEFkdmlzb3IgewotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5Ccm93c2VyQWR2aXNvcjwvY29kZT4uCi0JICovCi0JcHVibGljIEJyb3dzZXJBZHZpc29yKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKElXb3JrYmVuY2hDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLSAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZShjb25maWd1cmVyKTsKLS8vICAgICAgICBjb25maWd1cmVyLnNldFNhdmVBbmRSZXN0b3JlKHRydWUpOwotICAgIH0KLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZCgpIHsKLQkJcmV0dXJuIElCcm93c2VyQ29uc3RhbnRzLkJST1dTRVJfUEVSU1BFQ1RJVkVfSUQ7Ci0JfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgV29ya2JlbmNoV2luZG93QWR2aXNvciBjcmVhdGVXb3JrYmVuY2hXaW5kb3dBZHZpc29yKAotICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgewotICAgICAgICByZXR1cm4gbmV3IEJyb3dzZXJXaW5kb3dBZHZpc29yKGNvbmZpZ3VyZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yY3AvYnJvd3Nlci9Ccm93c2VyQXBwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmNwL2Jyb3dzZXIvQnJvd3NlckFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjJhNzM2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yY3AvYnJvd3Nlci9Ccm93c2VyQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsYXRmb3JtUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBhcHBsaWNhdGlvbiBjbGFzcyBmb3IgdGhlIFJDUCBCcm93c2VyIEV4YW1wbGUuCi0gKiBDcmVhdGVzIGFuZCBydW5zIHRoZSBXb3JrYmVuY2gsIHBhc3NpbmcgYSA8Y29kZT5Ccm93c2VyQWR2aXNvcjwvY29kZT4KLSAqIGFzIHRoZSB3b3JrYmVuY2ggYWR2aXNvci4KLSAqIAotICogQGlzc3VlIENvdWxkbid0IHJ1biB3aXRob3V0IGluaXRpYWwgcGVyc3BlY3RpdmUgLS0gaXQgZmFpbGVkIHdpdGggTlBFIAotICogICBvbiBXb3JrYmVuY2hXaW5kb3cub3BlblBhZ2UgKGNhbGxlZCBmcm9tIFdvcmtiZW5jaC5vcGVuRmlyc3RUaW1lV2luZG93KS4gIEFkdmlzb3IgaXMgY3VycmVudGx5IHJlcXVpcmVkIHRvIG92ZXJyaWRlIAotICogICBnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZC4KLSAqIAotICogQGlzc3VlIElmIHNob3J0Y3V0IGJhciBpcyBoaWRkZW4sIGFuZCBsYXN0IHZpZXcgaW4gcGVyc3BlY3RpdmUgaXMgY2xvc2VkLCB0aGVyZSdzIG5vIHdheSB0byBnZXQgaXQgb3BlbiBhZ2Fpbi4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlckFwcCBpbXBsZW1lbnRzIElQbGF0Zm9ybVJ1bm5hYmxlIHsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkJyb3dzZXJBcHA8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBCcm93c2VyQXBwKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmJvb3QuSVBsYXRmb3JtUnVubmFibGUjcnVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBydW4oT2JqZWN0IGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlEaXNwbGF5IGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsKLQkJdHJ5IHsKLQkJCWludCBjb2RlID0gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwKLQkJCQkJbmV3IEJyb3dzZXJBZHZpc29yKCkpOwotCQkJLy8gZXhpdCB0aGUgYXBwbGljYXRpb24gd2l0aCBhbiBhcHByb3ByaWF0ZSByZXR1cm4gY29kZQotCQkJcmV0dXJuIGNvZGUgPT0gUGxhdGZvcm1VSS5SRVRVUk5fUkVTVEFSVAotCQkJCQk/IEVYSVRfUkVTVEFSVAotCQkJCQk6IEVYSVRfT0s7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZGlzcGxheSAhPSBudWxsKQotCQkJCWRpc3BsYXkuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JjcC9icm93c2VyL0Jyb3dzZXJQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yY3AvYnJvd3Nlci9Ccm93c2VyUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzZjNWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JjcC9icm93c2VyL0Jyb3dzZXJQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdMYXlvdXQ7Ci0KLS8qKgotICogVGhlIHBlcnNwZWN0aXZlIGZhY3RvcnkgZm9yIHRoZSBSQ1AgQnJvd3NlciBFeGFtcGxlJ3MgcGVyc3BlY3RpdmUuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEJyb3dzZXJQZXJzcGVjdGl2ZUZhY3RvcnkgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+QnJvd3NlclBlcnNwZWN0aXZlRmFjdG9yeTwvY29kZT4uCi0JICovCi0JcHVibGljIEJyb3dzZXJQZXJzcGVjdGl2ZUZhY3RvcnkoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBpbml0aWFsIGxheW91dCBvZiB0aGUgQnJvd3NlciBwZXJzcGVjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotCQlsYXlvdXQuYWRkVmlldyhJQnJvd3NlckNvbnN0YW50cy5CUk9XU0VSX1ZJRVdfSUQsIElQYWdlTGF5b3V0LlJJR0hULCAuMjVmLCBJUGFnZUxheW91dC5JRF9FRElUT1JfQVJFQSk7Ci0JCWxheW91dC5hZGRQbGFjZWhvbGRlcihJQnJvd3NlckNvbnN0YW50cy5ISVNUT1JZX1ZJRVdfSUQsIElQYWdlTGF5b3V0LkxFRlQsIC4zZiwgSVBhZ2VMYXlvdXQuSURfRURJVE9SX0FSRUEpOyAvLyROT04tTkxTLTEkCi0JCUlWaWV3TGF5b3V0IGhpc3RvcnlMYXlvdXQgPSBsYXlvdXQuZ2V0Vmlld0xheW91dChJQnJvd3NlckNvbnN0YW50cy5ISVNUT1JZX1ZJRVdfSUQpOwotCQloaXN0b3J5TGF5b3V0LnNldENsb3NlYWJsZSh0cnVlKTsKLQkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKGZhbHNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmNwL2Jyb3dzZXIvQnJvd3NlclBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JjcC9icm93c2VyL0Jyb3dzZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhMjlhOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmNwL2Jyb3dzZXIvQnJvd3NlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBQbHVnLWluIGNsYXNzIGZvciB0aGUgYnJvd3NlciBleGFtcGxlLgotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotICAgIHByaXZhdGUgc3RhdGljIEJyb3dzZXJQbHVnaW4gREVGQVVMVDsKLSAgICAKLSAgICBwdWJsaWMgQnJvd3NlclBsdWdpbigpIHsKLSAgICAgICAgREVGQVVMVCA9IHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCcm93c2VyUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBERUZBVUxUOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvZ3MgdGhlIGdpdmVuIHRocm93YWJsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgdGhyb3dhYmxlIHRvIGxvZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxvZyhUaHJvd2FibGUgdCkgewotICAgICAgICBTdHJpbmcgbXNnID0gdC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChtc2cgPT0gbnVsbCkKLSAgICAgICAgICAgIG1zZyA9IHQudG9TdHJpbmcoKTsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtc2csIHQpOwotICAgICAgICBnZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHZpZXdzIGFuZCBlZGl0b3JzIGluIHRoZSBnaXZlbiBwYWdlLAotICAgICAqIGV4Y2x1ZGluZyBhbnkgc2Vjb25kYXJ5IHZpZXdzIGxpa2UgdGhlIEhpc3Rvcnkgdmlldy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFnZSB0aGUgd29ya2JlbmNoIHBhZ2UKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbGwgbm9uLXNlY29uZGFyeSBwYXJ0cyBpbiB0aGUgcGFnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXROb25TZWNvbmRhcnlQYXJ0cyhJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHBhZ2UuZ2V0Vmlld1JlZmVyZW5jZXMoKSkpOwotICAgICAgICBsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpKSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJV29ya2JlbmNoUGFydFJlZmVyZW5jZSByZWYgPSAoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UpIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIElTZWNvbmRhcnlQYXJ0KSB7Ci0gICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmNwL2Jyb3dzZXIvQnJvd3NlclByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JjcC9icm93c2VyL0Jyb3dzZXJQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkMzUxYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmNwL2Jyb3dzZXIvQnJvd3NlclByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIGluaXRpYWxpemVyIGZvciB0aGUgYnJvd3NlciBwcmVmZXJlbmNlcy4KLSAqLwotcHVibGljIGNsYXNzIEJyb3dzZXJQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLSAgICBwdWJsaWMgQnJvd3NlclByZWZlcmVuY2VJbml0aWFsaXplcigpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotICAgICAgICBQcmVmZXJlbmNlcyBwcmVmcyA9IEJyb3dzZXJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0gICAgICAgIHByZWZzLnNldERlZmF1bHQoSUJyb3dzZXJDb25zdGFudHMuUFJFRl9IT01FX1BBR0UsICJodHRwOi8vZWNsaXBzZS5vcmciKTsgIC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yY3AvYnJvd3Nlci9Ccm93c2VyVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JjcC9icm93c2VyL0Jyb3dzZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjFmMmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JjcC9icm93c2VyL0Jyb3dzZXJWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkNsb3NlV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuT3BlbldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuVGl0bGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5UaXRsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLldpbmRvd0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi0KLS8qKgotICogVGhlIEJyb3dzZXIgdmlldy4gIFRoaXMgY29uc2lzdHMgb2YgYSA8Y29kZT5Ccm93c2VyPC9jb2RlPiBjb250cm9sLCBhbmQgYW4KLSAqIGFkZHJlc3MgYmFyIGNvbnNpc3Rpbmcgb2YgYSA8Y29kZT5MYWJlbDwvY29kZT4gYW5kIGEgPGNvZGU+VGV4dDwvY29kZT4gCi0gKiBjb250cm9sLiAgVGhpcyByZWdpc3RlcnMgaGFuZGxpbmcgYWN0aW9ucyBmb3IgdGhlIHJldGFyZ2V0YWJsZSBhY3Rpb25zIGFkZGVkIAotICogYnkgPGNvZGU+QnJvd3NlckFjdGlvbkJ1aWxkZXI8L2NvZGU+IChCYWNrLCBGb3J3YXJkLCBTdG9wLCBSZWZyZXNoKS4gIAotICogVGhpcyBhbHNvIGhvb2tzIGxpc3RlbmVycyBvbiB0aGUgQnJvd3NlciBjb250cm9sIGZvciBzdGF0dXMgYW5kIHByb2dyZXNzCi0gKiBtZXNzYWdlcywgYW5kIHJlZGlyZWN0cyB0aGVzZSB0byB0aGUgc3RhdHVzIGxpbmUuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEJyb3dzZXJWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCQotICAgIC8qKgotCSAqIERlYnVnIGZsYWcuICBXaGVuIHRydWUsIHN0YXR1cyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlCi0JICogY29uc29sZSBpbiBhZGRpdGlvbiB0byB0aGUgc3RhdHVzIGxpbmUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCQotCXByaXZhdGUgQnJvd3NlciBicm93c2VyOwotCXByaXZhdGUgVGV4dCBsb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBpbml0aWFsVXJsOwotCQotCXByaXZhdGUgQWN0aW9uIGJhY2tBY3Rpb24gPSBuZXcgQWN0aW9uKCJCYWNrIikgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlicm93c2VyLmJhY2soKTsKLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBBY3Rpb24gZm9yd2FyZEFjdGlvbiA9IG5ldyBBY3Rpb24oIkZvcndhcmQiKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWJyb3dzZXIuZm9yd2FyZCgpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgQWN0aW9uIHN0b3BBY3Rpb24gPSBuZXcgQWN0aW9uKCJTdG9wIikgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlicm93c2VyLnN0b3AoKTsKLQkJCS8vIGNhbmNlbCBhbnkgcGFydGlhbCBwcm9ncmVzcy4KLQkJCWdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuZG9uZSgpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgQWN0aW9uIHJlZnJlc2hBY3Rpb24gPSBuZXcgQWN0aW9uKCJSZWZyZXNoIikgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlicm93c2VyLnJlZnJlc2goKTsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogVGhlIGVhc3RlciBlZ2cgYWN0aW9uLiAgCi0JICogU2VlIHRoZSBjb3JyZXNwb25kaW5nIGNvbW1hbmQgYW5kIGtleSBiaW5kaW5nIGluIHRoZSBwbHVnaW4ueG1sLAotCSAqIGFuZCBob3cgaXQncyByZWdpc3RlcmVkIGluIGNyZWF0ZUJyb3dzZXIuCi0JICovCi0JcHJpdmF0ZSBBY3Rpb24gZWFzdGVyRWdnQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkgICAgeyBzZXRBY3Rpb25EZWZpbml0aW9uSWQoSUJyb3dzZXJDb25zdGFudHMuQ09NTUFORF9QUkVGSVggKyAiZWFzdGVyRWdnIik7IH0gLy8kTk9OLU5MUy0xJAotCSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JICAgICAgICBicm93c2VyLmV4ZWN1dGUoIndpbmRvdy5jb25maXJtKCdZb3UgZm91bmQgdGhlIGVhc3RlciBlZ2chJykiKTsKLQkgICAgfQotCX07Ci0JCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIGZpcnN0IGJyb3dzZXIgdmlldyBpbiB0aGUgZ2l2ZW4gd2luZG93LgotICAgICAqIAotICAgICAqIEBwYXJhbSB3aW5kb3cgdGhlIHdpbmRvdwotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IGZvdW5kIGJyb3dzZXIgdmlldywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEJyb3dzZXJWaWV3IGZpbmRCcm93c2VyKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBJVmlld1BhcnQgdmlldyA9IHBhZ2UuZmluZFZpZXcoSUJyb3dzZXJDb25zdGFudHMuQlJPV1NFUl9WSUVXX0lEKTsKLSAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChCcm93c2VyVmlldykgdmlldzsKLSAgICAgICAgfQotICAgICAgICBJVmlld1JlZmVyZW5jZVtdIHJlZnMgPSBwYWdlLmdldFZpZXdSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKElCcm93c2VyQ29uc3RhbnRzLkJST1dTRVJfVklFV19JRC5lcXVhbHMocmVmc1tpXS5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoQnJvd3NlclZpZXcpIHJlZnNbaV0uZ2V0UGFydCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5Ccm93c2VyVmlldzwvY29kZT4uCi0JICovCi0JcHVibGljIEJyb3dzZXJWaWV3KCkgewotCSAgICBpbml0aWFsVXJsID0gQnJvd3NlclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSUJyb3dzZXJDb25zdGFudHMuUFJFRl9IT01FX1BBR0UpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlLCBJTWVtZW50byBtZW1lbnRvKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBzdXBlci5pbml0KHNpdGUpOwotICAgICAgICBpZiAobWVtZW50byAhPSBudWxsKSB7Ci0JICAgICAgICBTdHJpbmcgdSA9IG1lbWVudG8uZ2V0U3RyaW5nKElCcm93c2VyQ29uc3RhbnRzLk1FTUVOVE9fVVJMKTsKLQkgICAgICAgIGlmICh1ICE9IG51bGwpIHsKLQkgICAgICAgICAgICBpbml0aWFsVXJsID0gdTsKLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotICAgICAgICBtZW1lbnRvLnB1dFN0cmluZyhJQnJvd3NlckNvbnN0YW50cy5NRU1FTlRPX1VSTCwgYnJvd3Nlci5nZXRVcmwoKSk7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYnJvd3NlciA9IGNyZWF0ZUJyb3dzZXIocGFyZW50LCBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKSk7Ci0JCWJyb3dzZXIuc2V0VXJsKGluaXRpYWxVcmwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAoYnJvd3NlciAhPSBudWxsICYmICFicm93c2VyLmlzRGlzcG9zZWQoKSkgewotCQkJYnJvd3Nlci5zZXRGb2N1cygpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgQnJvd3NlciBjcmVhdGVCcm93c2VyKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJCi0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXBhcmVudC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCQotCQlMYWJlbCBsYWJlbEFkZHJlc3MgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsQWRkcmVzcy5zZXRUZXh0KCJBJmRkcmVzcyIpOwotCQkKLQkJbG9jYXRpb24gPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbG9jYXRpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlicm93c2VyID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJYnJvd3Nlci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NBZGFwdGVyKCkgewotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gYWN0aW9uQmFycy5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpOwotCQkJYm9vbGVhbiB3b3JraW5nID0gZmFsc2U7Ci0JCQlpbnQgd29ya2VkU29GYXI7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkOiAiICsgZXZlbnQuY3VycmVudCArICIvIiArIGV2ZW50LnRvdGFsKTsKLQkJCQl9Ci0JCQkJaWYgKGV2ZW50LnRvdGFsID09IDApIHJldHVybjsKLQkJCQlpZiAoIXdvcmtpbmcpIHsKLQkJCQkJaWYgKGV2ZW50LmN1cnJlbnQgPT0gZXZlbnQudG90YWwpIHJldHVybjsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIGV2ZW50LnRvdGFsKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl3b3JrZWRTb0ZhciA9IDA7Ci0JCQkJCXdvcmtpbmcgPSB0cnVlOwotCQkJCX0KLQkJCQltb25pdG9yLndvcmtlZChldmVudC5jdXJyZW50IC0gd29ya2VkU29GYXIpOwotCQkJCXdvcmtlZFNvRmFyID0gZXZlbnQuY3VycmVudDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY29tcGxldGVkOiAiICsgZXZlbnQuY3VycmVudCArICIvIiArIGV2ZW50LnRvdGFsKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJd29ya2luZyA9IGZhbHNlOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXMgPSBhY3Rpb25CYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7IAotCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdGF0dXM6ICIgKyBldmVudC50ZXh0KTsKLQkJCQl9Ci0JCQkJc3RhdHVzLnNldE1lc3NhZ2UoZXZlbnQudGV4dCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJICAgIGlmIChldmVudC50b3ApCi0JCQkgICAgICAgIGxvY2F0aW9uLnNldFRleHQoZXZlbnQubG9jYXRpb24pOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG5ldyBUaXRsZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY2hhbmdlZChUaXRsZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgc2V0UGFydE5hbWUoZXZlbnQudGl0bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBCcm93c2VyVmlldy50aGlzLm9wZW5XaW5kb3coZXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgLy8gVE9ETzogc2hvdWxkIGhhbmRsZSBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIuc2hvdyBhbmQgLmhpZGUgZXZlbnRzCi0gICAgICAgIGJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgQnJvd3NlclZpZXcudGhpcy5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQkJbG9jYXRpb24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJyb3dzZXIuc2V0VXJsKGxvY2F0aW9uLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gSG9vayB0aGUgbmF2aWdhdGlvbiBhY3RvbnMgYXMgaGFuZGxlcnMgZm9yIHRoZSByZXRhcmdldGFibGUgYWN0aW9ucwotCQkvLyBkZWZpbmVkIGluIEJyb3dzZXJBY3Rpb25CdWlsZGVyLgotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoImJhY2siLCBiYWNrQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoImZvcndhcmQiLCBmb3J3YXJkQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoInN0b3AiLCBzdG9wQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoInJlZnJlc2giLCByZWZyZXNoQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gUmVnaXN0ZXIgdGhlIGVhc3RlciBlZ2cgYWN0aW9uIHdpdGggdGhlIGtleSBiaW5kaW5nIHNlcnZpY2UsCi0JCS8vIGFsbG93aW5nIGl0IHRvIGJlIGludm9rZWQgZGlyZWN0bHkgdmlhIGtleXByZXNzLCAKLQkJLy8gd2l0aG91dCByZXF1aXJpbmcgdGhlIGFjdGlvbiB0byBiZSB2aXNpYmxlIGluIHRoZSBVSS4KLQkJLy8gTm90ZSB0aGF0IHRoZSBhZGRyZXNzIGZpZWxkIG5lZWRzIHRvIGhhdmUgZm9jdXMgZm9yIHRoaXMgdG8gd29yaywgCi0JCS8vIG9yIGFueSBjb250cm9sIG90aGVyIHRoYW4gdGhlIGJyb3dzZXIgd2lkZ2V0LCBkdWUgdG8gCi0JCS8vIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTkxOSI+YnVnIDY5OTE5PC9hPi4KLQkJZ2V0Vmlld1NpdGUoKS5nZXRLZXlCaW5kaW5nU2VydmljZSgpLnJlZ2lzdGVyQWN0aW9uKGVhc3RlckVnZ0FjdGlvbik7Ci0JCXJldHVybiBicm93c2VyOwotCX0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIGEgbmV3IGJyb3dzZXIgd2luZG93LgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgb3BlbiB3aW5kb3cgZXZlbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb3BlbldpbmRvdyhXaW5kb3dFdmVudCBldmVudCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IHdvcmtiZW5jaC5vcGVuV29ya2JlbmNoV2luZG93KElCcm93c2VyQ29uc3RhbnRzLkJST1dTRVJfUEVSU1BFQ1RJVkVfSUQsIG51bGwpOwotICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgIGlmIChldmVudC5sb2NhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNoZWxsLnNldExvY2F0aW9uKGV2ZW50LmxvY2F0aW9uKTsKLSAgICAgICAgICAgIGlmIChldmVudC5zaXplICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2hlbGwuc2V0TG9jYXRpb24oZXZlbnQuc2l6ZSk7Ci0gICAgICAgICAgICBCcm93c2VyVmlldyB2aWV3ID0gZmluZEJyb3dzZXIod2luZG93KTsKLSAgICAgICAgICAgIEFzc2VydC5pc05vdE51bGwodmlldyk7Ci0gICAgICAgICAgICBldmVudC5icm93c2VyID0gdmlldy5icm93c2VyOwotICAgICAgICB9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQnJvd3NlclBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGlzIGJyb3dzZXIgdmlldy4gIENsb3NlcyB0aGUgd2luZG93IHRvbyBpZiB0aGVyZQotICAgICAqIGFyZSBubyBub24tc2Vjb25kYXJ5IHBhcnRzIG9wZW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlKCkgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICBwYWdlLmhpZGVWaWV3KHRoaXMpOwotICAgICAgICBpZiAoQnJvd3NlclBsdWdpbi5nZXROb25TZWNvbmRhcnlQYXJ0cyhwYWdlKS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcGFnZS5jbG9zZVBlcnNwZWN0aXZlKHBhZ2UuZ2V0UGVyc3BlY3RpdmUoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdpbmRvdy5nZXRBY3RpdmVQYWdlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgd2luZG93LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yY3AvYnJvd3Nlci9Ccm93c2VyV2luZG93QWR2aXNvci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JjcC9icm93c2VyL0Jyb3dzZXJXaW5kb3dBZHZpc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZTQwZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JjcC9icm93c2VyL0Jyb3dzZXJXaW5kb3dBZHZpc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uQWN0aW9uQmFyQWR2aXNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yOwotCi0vKioKLSAqIENvbmZpZ3VyZXMgdGhlIGJyb3dzZXIgd2luZG93IHVzaW5nIHRoZSBnaXZlbiB3aW5kb3cgY29uZmlndXJlci4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlcldpbmRvd0Fkdmlzb3IgZXh0ZW5kcyBXb3JrYmVuY2hXaW5kb3dBZHZpc29yIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYnJvd3NlciB3aW5kb3cgYWR2aXNvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uZmlndXJlciB0aGUgd2luZG93IGNvbmZpZ3VyZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQnJvd3NlcldpbmRvd0Fkdmlzb3IoSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgewotICAgICAgICBzdXBlcihjb25maWd1cmVyKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJlV2luZG93T3BlbigpIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlciA9IGdldFdpbmRvd0NvbmZpZ3VyZXIoKTsKLSAgICAgICAgY29uZmlndXJlci5zZXRJbml0aWFsU2l6ZShuZXcgUG9pbnQoODAwLCA2MDApKTsKLSAgICAgICAgCi0gICAgICAgIC8vIERlZmF1bHQgd2luZG93IHRpdGxlIGlzIHRoZSBwcm9kdWN0IG5hbWUsIHNvIGRvbid0IG5lZWQgdG8gc2V0IGl0Ci0gICAgICAgIC8vIGV4cGxpY2l0bHkgYW55bW9yZS4KLS8vICAgICAgY29uZmlndXJlci5zZXRUaXRsZSgiQnJvd3NlciBFeGFtcGxlIik7Ci0gICAgICAgIAotLy8gICAgICBjb25maWd1cmVyLnNldFNob3dGYXN0Vmlld0JhcnModHJ1ZSk7Ci0gICAgfQotCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvciNjcmVhdGVBY3Rpb25CYXJBZHZpc29yKG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyKQotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpb25CYXJBZHZpc29yIGNyZWF0ZUFjdGlvbkJhckFkdmlzb3IoCi0gICAgICAgICAgICBJQWN0aW9uQmFyQ29uZmlndXJlciBhY3Rpb25CYXJDb25maWd1cmVyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQnJvd3NlckFjdGlvbkJhckFkdmlzb3IoYWN0aW9uQmFyQ29uZmlndXJlcik7Ci0gICAgfQotICAgIAotLy8gIFVuY29tbWVudCB0aGUgY29kZSBiZWxvdyBmb3IgYSBjdXN0b20gd2luZG93IGxheW91dCAoYWRkIGJhY2sgdGhlIG1pc3NpbmcgaW1wb3J0cyB1c2luZyBDdHJsK1NoaWZ0K08pIAotLyogICAgCi0gICAgICBwdWJsaWMgdm9pZCBjcmVhdGVXaW5kb3dDb250ZW50cyhTaGVsbCBzaGVsbCkgewotICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIgPSBnZXRXaW5kb3dDb25maWd1cmVyKCk7Ci0gICAgICAgICAgTWVudSBtZW51QmFyID0gY29uZmlndXJlci5jcmVhdGVNZW51QmFyKCk7Ci0gICAgICAgICAgc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLSAgICAgICAgICAKLSAgICAgICAgICBHcmlkTGF5b3V0IHNoZWxsTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgICBzaGVsbExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgICAgc2hlbGxMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgICBzaGVsbExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgICAgICAgIHNoZWxsLnNldExheW91dChzaGVsbExheW91dCk7Ci0gICAgCi0gICAgICAgICAgaWYgKCEiY2FyYm9uIi5lcXVhbHMoU1dULmdldFBsYXRmb3JtKCkpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgTGFiZWwgc2VwMSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgICAgICAgc2VwMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIENvbnRyb2wgY29vbEJhciA9IGNvbmZpZ3VyZXIuY3JlYXRlQ29vbEJhckNvbnRyb2woc2hlbGwpOwotICAgICAgICAgIGNvb2xCYXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotICAgIAotICAgICAgICAgIExhYmVsIHNlcDIgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICAgICAgc2VwMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgQ29udHJvbCBwYWdlQ29tcG9zaXRlID0gY29uZmlndXJlci5jcmVhdGVQYWdlQ29tcG9zaXRlKHNoZWxsKTsKLSAgICAgICAgICBwYWdlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpKTsKLSAgICAKLSAgICAgICAgICBMYWJlbCBzZXAzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgICAgICAgIHNlcDMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotICAgICAgICAgIENvbnRyb2wgc3RhdHVzTGluZSA9IGNvbmZpZ3VyZXIuY3JlYXRlU3RhdHVzTGluZUNvbnRyb2woc2hlbGwpOwotICAgICAgICAgIHN0YXR1c0xpbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotICAgICAgICAgIHNoZWxsLmxheW91dCh0cnVlKTsKLSAgICAgIH0KLSovCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmNwL2Jyb3dzZXIvSGlzdG9yeVZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yY3AvYnJvd3Nlci9IaXN0b3J5Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWMwZDRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yY3AvYnJvd3Nlci9IaXN0b3J5Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLS8qKgotICogTW9ja3VwIG9mIGEgYnJvd3NlciBoaXN0b3J5IHZpZXcuCi0gKiBGb3Igbm93LCBpdCdzIGp1c3QgdGhlIHNhbXBsZSB2aWV3IGdlbmVyYXRlZCBieSBQREUuCi0gKi8KLXB1YmxpYyBjbGFzcyBIaXN0b3J5VmlldyBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMgSVNlY29uZGFyeVBhcnQgewotCXByaXZhdGUgVHJlZVZpZXdlciB2aWV3ZXI7Ci0JcHJpdmF0ZSBEcmlsbERvd25BZGFwdGVyIGRyaWxsRG93bkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBY3Rpb24gYWN0aW9uMTsKLQlwcml2YXRlIEFjdGlvbiBhY3Rpb24yOwotCXByaXZhdGUgQWN0aW9uIGRvdWJsZUNsaWNrQWN0aW9uOwotCi0JLyoKLQkgKiBUaGUgY29udGVudCBwcm92aWRlciBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IKLQkgKiBwcm92aWRpbmcgb2JqZWN0cyB0byB0aGUgdmlldy4gSXQgY2FuIHdyYXAKLQkgKiBleGlzdGluZyBvYmplY3RzIGluIGFkYXB0ZXJzIG9yIHNpbXBseSByZXR1cm4KLQkgKiBvYmplY3RzIGFzLWlzLiBUaGVzZSBvYmplY3RzIG1heSBiZSBzZW5zaXRpdmUKLQkgKiB0byB0aGUgY3VycmVudCBpbnB1dCBvZiB0aGUgdmlldywgb3IgaWdub3JlCi0JICogaXQgYW5kIGFsd2F5cyBzaG93IHRoZSBzYW1lIGNvbnRlbnQgCi0JICogKGxpa2UgVGFzayBMaXN0LCBmb3IgZXhhbXBsZSkuCi0JICovCi0JIAotCWNsYXNzIFRyZWVPYmplY3QgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBUcmVlUGFyZW50IHBhcmVudDsKLQkJCi0JCXB1YmxpYyBUcmVlT2JqZWN0KFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFBhcmVudChUcmVlUGFyZW50IHBhcmVudCkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCX0KLQkJcHVibGljIFRyZWVQYXJlbnQgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQljbGFzcyBUcmVlUGFyZW50IGV4dGVuZHMgVHJlZU9iamVjdCB7Ci0JCXByaXZhdGUgQXJyYXlMaXN0IGNoaWxkcmVuOwotCQlwdWJsaWMgVHJlZVBhcmVudChTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobmFtZSk7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRDaGlsZChUcmVlT2JqZWN0IGNoaWxkKSB7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKFRyZWVPYmplY3QgY2hpbGQpIHsKLQkJCWNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQobnVsbCk7Ci0JCX0KLQkJcHVibGljIFRyZWVPYmplY3QgW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gKFRyZWVPYmplY3QgW10pY2hpbGRyZW4udG9BcnJheShuZXcgVHJlZU9iamVjdFtjaGlsZHJlbi5zaXplKCldKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJCXJldHVybiBjaGlsZHJlbi5zaXplKCk+MDsKLQkJfQotCX0KLQotCWNsYXNzIFZpZXdDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgCi0JCQkJCQkJCQkJICAgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwcml2YXRlIFRyZWVQYXJlbnQgaW52aXNpYmxlUm9vdDsKLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHYsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudC5lcXVhbHMoZ2V0Vmlld1NpdGUoKSkpIHsKLQkJCQlpZiAoaW52aXNpYmxlUm9vdD09bnVsbCkgaW5pdGlhbGl6ZSgpOwotCQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnZpc2libGVSb290KTsKLQkJCX0KLQkJCXJldHVybiBnZXRDaGlsZHJlbihwYXJlbnQpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBjaGlsZCkgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgVHJlZU9iamVjdCkgewotCQkJCXJldHVybiAoKFRyZWVPYmplY3QpY2hpbGQpLmdldFBhcmVudCgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVHJlZVBhcmVudCkgewotCQkJCXJldHVybiAoKFRyZWVQYXJlbnQpcGFyZW50KS5nZXRDaGlsZHJlbigpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRyZWVQYXJlbnQpCi0JCQkJcmV0dXJuICgoVHJlZVBhcmVudClwYXJlbnQpLmhhc0NoaWxkcmVuKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLS8qCi0gKiBXZSB3aWxsIHNldCB1cCBhIGR1bW15IG1vZGVsIHRvIGluaXRpYWxpemUgdHJlZSBoZWFyYXJjaHkuCi0gKiBJbiBhIHJlYWwgY29kZSwgeW91IHdpbGwgY29ubmVjdCB0byBhIHJlYWwgbW9kZWwgYW5kCi0gKiBleHBvc2UgaXRzIGhpZXJhcmNoeS4KLSAqLwotCQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCVRyZWVPYmplY3QgdG8xID0gbmV3IFRyZWVPYmplY3QoIkxlYWYgMSIpOwotCQkJVHJlZU9iamVjdCB0bzIgPSBuZXcgVHJlZU9iamVjdCgiTGVhZiAyIik7Ci0JCQlUcmVlT2JqZWN0IHRvMyA9IG5ldyBUcmVlT2JqZWN0KCJMZWFmIDMiKTsKLQkJCVRyZWVQYXJlbnQgcDEgPSBuZXcgVHJlZVBhcmVudCgiUGFyZW50IDEiKTsKLQkJCXAxLmFkZENoaWxkKHRvMSk7Ci0JCQlwMS5hZGRDaGlsZCh0bzIpOwotCQkJcDEuYWRkQ2hpbGQodG8zKTsKLQkJCQotCQkJVHJlZU9iamVjdCB0bzQgPSBuZXcgVHJlZU9iamVjdCgiTGVhZiA0Iik7Ci0JCQlUcmVlUGFyZW50IHAyID0gbmV3IFRyZWVQYXJlbnQoIlBhcmVudCAyIik7Ci0JCQlwMi5hZGRDaGlsZCh0bzQpOwotCQkJCi0JCQlUcmVlUGFyZW50IHJvb3QgPSBuZXcgVHJlZVBhcmVudCgiUm9vdCIpOwotCQkJcm9vdC5hZGRDaGlsZChwMSk7Ci0JCQlyb290LmFkZENoaWxkKHAyKTsKLQkJCQotCQkJaW52aXNpYmxlUm9vdCA9IG5ldyBUcmVlUGFyZW50KCIiKTsKLQkJCWludmlzaWJsZVJvb3QuYWRkQ2hpbGQocm9vdCk7Ci0JCX0KLQl9Ci0JY2xhc3MgVmlld0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iai50b1N0cmluZygpOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlTdHJpbmcgaW1hZ2VLZXkgPSBJU2hhcmVkSW1hZ2VzLklNR19PQkpfRUxFTUVOVDsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUcmVlUGFyZW50KQotCQkJICAgaW1hZ2VLZXkgPSBJU2hhcmVkSW1hZ2VzLklNR19PQkpfRk9MREVSOwotCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoaW1hZ2VLZXkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBIaXN0b3J5VmlldygpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGFsbG93IHVzCi0JICogdG8gY3JlYXRlIHRoZSB2aWV3ZXIgYW5kIGluaXRpYWxpemUgaXQuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWRyaWxsRG93bkFkYXB0ZXIgPSBuZXcgRHJpbGxEb3duQWRhcHRlcih2aWV3ZXIpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWaWV3Q29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVmlld0xhYmVsUHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRJbnB1dChnZXRWaWV3U2l0ZSgpKTsKLQkJbWFrZUFjdGlvbnMoKTsKLQkJaG9va0NvbnRleHRNZW51KCk7Ci0JCWhvb2tEb3VibGVDbGlja0FjdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBob29rQ29udGV4dE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsKLQkJbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJSGlzdG9yeVZpZXcudGhpcy5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0JCQl9Ci0JCX0pOwotCQlNZW51IG1lbnUgPSBtZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1lbnVNZ3IsIHZpZXdlcik7Ci0JfQotCi0KLQotCXByaXZhdGUgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoYWN0aW9uMSk7Ci0JCW1hbmFnZXIuYWRkKGFjdGlvbjIpOwotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlkcmlsbERvd25BZGFwdGVyLmFkZE5hdmlnYXRpb25BY3Rpb25zKG1hbmFnZXIpOwotCQkvLyBPdGhlciBwbHVnLWlucyBjYW4gY29udHJpYnV0ZSB0aGVyZSBhY3Rpb25zIGhlcmUKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCX0KLQkKLQotCXByaXZhdGUgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQkJYWN0aW9uMSA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2hvd01lc3NhZ2UoIkFjdGlvbiAxIGV4ZWN1dGVkIik7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbjEuc2V0VGV4dCgiQWN0aW9uIDEiKTsKLQkJYWN0aW9uMS5zZXRUb29sVGlwVGV4dCgiQWN0aW9uIDEgdG9vbHRpcCIpOwotCQlhY3Rpb24xLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLgotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfSU5GT19UU0spKTsKLQkJCi0JCWFjdGlvbjIgPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNob3dNZXNzYWdlKCJBY3Rpb24gMiBleGVjdXRlZCIpOwotCQkJfQotCQl9OwotCQlhY3Rpb24yLnNldFRleHQoIkFjdGlvbiAyIik7Ci0JCWFjdGlvbjIuc2V0VG9vbFRpcFRleHQoIkFjdGlvbiAyIHRvb2x0aXAiKTsKLQkJYWN0aW9uMi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS4KLQkJCQlnZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSykpOwotCQlkb3VibGVDbGlja0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlzaG93TWVzc2FnZSgiRG91YmxlLWNsaWNrIGRldGVjdGVkIG9uICIrb2JqLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBob29rRG91YmxlQ2xpY2tBY3Rpb24oKSB7Ci0JCXZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlkb3VibGVDbGlja0FjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgdm9pZCBzaG93TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbigKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwKLQkJCSJIaXN0b3J5IiwKLQkJCW1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIFBhc3NpbmcgdGhlIGZvY3VzIHJlcXVlc3QgdG8gdGhlIHZpZXdlcidzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yY3AuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmNwL2Jyb3dzZXIvSUJyb3dzZXJDb25zdGFudHMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yY3AvYnJvd3Nlci9JQnJvd3NlckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWU0YmYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yY3AvYnJvd3Nlci9JQnJvd3NlckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGRlZmluaW5nIGNvbnN0YW50cyBmb3IgdXNlIGluIHRoZSBicm93c2VyIGV4YW1wbGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJyb3dzZXJDb25zdGFudHMgewotCi0gICAgLyoqCi0gICAgICogSUQgb2YgdGhlIFJDUCBCcm93c2VyIEV4YW1wbGUgcGx1Zy1pbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogSUQgb2YgdGhlIEJyb3dzZXIgcGVyc3BlY3RpdmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJPV1NFUl9QRVJTUEVDVElWRV9JRCA9IFBMVUdJTl9JRCArICIuYnJvd3NlclBlcnNwZWN0aXZlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIElEIG9mIHRoZSBCcm93c2VyIHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJPV1NFUl9WSUVXX0lEID0gUExVR0lOX0lEICsgIi5icm93c2VyVmlldyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIElEIG9mIHRoZSBIaXN0b3J5IHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElTVE9SWV9WSUVXX0lEID0gUExVR0lOX0lEICsgIi5oaXN0b3J5VmlldyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIENvbW1vbiBwcmVmaXggZm9yIGNvbW1hbmQgaWRzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfUFJFRklYID0gUExVR0lOX0lEICsgIi5jb21tYW5kcy4iOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogUHJlZmVyZW5jZSBrZXkgZm9yIHRoZSBob21lIHBhZ2UgVVJMIChwcm9wZXJ0eSBpcyBTdHJpbmctdmFsdWVkKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0hPTUVfUEFHRSA9ICJob21lUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIE1lbWVudG8gYXR0cmlidXRlIG5hbWUgZm9yIHRoZSBicm93c2VyIFVSTCAoYXR0cmlidXRlIGlzIFN0cmluZy12YWx1ZWQpLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fVVJMID0gInVybCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJjcC5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yY3AvYnJvd3Nlci9JU2Vjb25kYXJ5UGFydC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JjcC9icm93c2VyL0lTZWNvbmRhcnlQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMmMxYmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JjcC9icm93c2VyL0lTZWNvbmRhcnlQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmNwLmJyb3dzZXI7Ci0KLS8qKgotICogTWFya3MgYSB3b3JrYmVuY2ggcGFydCBpbXBsZW1lbnRhdGlvbiBhcyBiZWluZyBhIHNlY29uZGFyeSBwYXJ0LgotICogQSBzZWNvbmRhcnkgcGFydCBpcyBvbmUgdGhhdCBleGlzdHMgb25seSB0byBzdXBwb3J0IHRoZSBicm93c2VyLAotICogYW5kIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCB3aGVuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gY2xvc2UKLSAqIGEgd2luZG93IHdob3NlIGxhc3QgYnJvd3NlciBoYXMgYmVlbiBjbG9zZWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlY29uZGFyeVBhcnQgewotICAgIC8vIG1hcmtlciBpbnRlcmZhY2Ugb25seTsgbm8gYmVoYXZpb3VyCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZmY3MDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJFY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4YjMyOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpmYWNlLnRleHQ8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnRleHQ8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS5lZGl0b3JzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS5pZGU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLnZpZXdzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4MWRiYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNXZWQgTWF5IDI1IDEwOjE2OjE2IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2I3ZDc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1R1ZSBPY3QgMTggMTU6MTU6MzggRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkuamF2YWRvYz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcmV0dXJuIFJldHVybnMgdGhlICR7YmFyZV9maWVsZF9uYW1lfS5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcGFyYW0gJHtwYXJhbX0gVGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXQuXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgSmF2YSBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWxlY29tbWVudCIgbmFtZVw9ImZpbGVjb21tZW50Ij4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogQ29weXJpZ2h0IChjKSAke3llYXJ9IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4gKlxuICogQ29udHJpYnV0b3JzXDpcbiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcbiAqIEBzaW5jZSAzLjJcbiAqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCI+LyoqXG4gKiBcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cblxuJHt0eXBlY29tbWVudH1cbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9ja1xuJHtleGNlcHRpb25fdmFyfS5wcmludFN0YWNrVHJhY2UoKTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmJvZHkiIG5hbWVcPSJjb25zdHJ1Y3RvcmJvZHkiPiR7Ym9keV9zdGF0ZW1lbnR9XG4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWI8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5Ij5yZXR1cm4gJHtmaWVsZH07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjbGFzc2JvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNsYXNzIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNsYXNzYm9keSIgbmFtZVw9ImNsYXNzYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImludGVyZmFjZWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGludGVyZmFjZSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5pbnRlcmZhY2Vib2R5IiBuYW1lXD0iaW50ZXJmYWNlYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImVudW1ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmVudW1ib2R5IiBuYW1lXD0iZW51bWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJhbm5vdGF0aW9uYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgYW5ub3RhdGlvbiB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5hbm5vdGF0aW9uYm9keSIgbmFtZVw9ImFubm90YXRpb25ib2R5Ij5cbjwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MGZlY2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1R1ZSBKYW4gMTAgMTY6NTQ6MjQgRVNUIDIwMDYNCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTENCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wDQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTANCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQ0KLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xDQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTANCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MQ0KLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9BZGFwdGFibGVMaXN0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9BZGFwdGFibGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZGY2ZjMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvQWRhcHRhYmxlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogQSBsaXN0IG9mIGFkYXB0YWJsZSBvYmplY3RzLiAgVGhpcyBpcyBhIGdlbmVyaWMgbGlzdCB0aGF0IGNhbgotICogYmUgdXNlZCB0byBkaXNwbGF5IGFuIGFyYml0cmFyeSBzZXQgb2YgYWRhcHRhYmxlIG9iamVjdHMgaW4gdGhlIHdvcmtiZW5jaC4KLSAqIEFsc28gaW1wbGVtZW50cyB0aGUgSVdvcmtiZW5jaEFkYXB0ZXIgaW50ZXJmYWNlIGZvciBzaW1wbGUgZGlzcGxheQotICogYW5kIG5hdmlnYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGFibGVMaXN0IGltcGxlbWVudHMgSVdvcmtiZW5jaEFkYXB0ZXIsIElBZGFwdGFibGUgewotICAgIHByb3RlY3RlZCBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGFibGUgbGlzdCB3aXRoIHRoZSBnaXZlbiBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRhYmxlTGlzdCgpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRhYmxlIGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gY2hpbGRyZW4uCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0YWJsZUxpc3QoSUFkYXB0YWJsZVtdIG5ld0NoaWxkcmVuKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoaWxkcmVuLmFkZChuZXdDaGlsZHJlbltpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFsbCB0aGUgYWRhcHRhYmxlIG9iamVjdHMgaW4gdGhlIGdpdmVuIGVudW1lcmF0aW9uIHRvIHRoaXMgbGlzdC4KLSAgICAgKiBSZXR1cm5zIHRoaXMgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRhYmxlTGlzdCBhZGQoSXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgYWRkKChJQWRhcHRhYmxlKSBpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGFkYXB0YWJsZSBvYmplY3QgdG8gdGhpcyBsaXN0LgotICAgICAqIFJldHVybnMgdGhpcyBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGFibGVMaXN0IGFkZChJQWRhcHRhYmxlIGFkYXB0YWJsZSkgewotICAgICAgICBjaGlsZHJlbi5hZGQoYWRhcHRhYmxlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWRhcHRhYmxlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKGFkYXB0ZXIgPT0gSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudHMgaW4gdGhpcyBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hBZGFwdGVyCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoQWRhcHRlcgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoQWRhcHRlcgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyAiIiA6IG9iamVjdC50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoQWRhcHRlcgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gYWRhcHRhYmxlIG9iamVjdCBmcm9tIHRoaXMgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoSUFkYXB0YWJsZSBhZGFwdGFibGUpIHsKLSAgICAgICAgY2hpbGRyZW4ucmVtb3ZlKGFkYXB0YWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gY2hpbGRyZW4uc2l6ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL0FkZFJlYWRtZU1hcmtlckFjdGlvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvQWRkUmVhZG1lTWFya2VyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMDVlMmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvQWRkUmVhZG1lTWFya2VyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEpvZSBCb3diZWVyIChqb3phcnRAYmxhcmcubmV0KSAtIHJlbW92ZWQgZGVwZW5kZW5jeSBvbiBydW50aW1lIGNvbXBhdGliaWxpdHkgbGF5ZXIgKGJ1ZyA3NDUyOCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBBY3Rpb24gZm9yIGNyZWF0aW5nIGEgcmVhZG1lIG1hcmtlciB3aXRoIGEgc3BlY2ZpYyBpZCAKLSAqIGF0dHJpYnV0ZSB2YWx1ZS4KLSAqLwotcHVibGljIGNsYXNzIEFkZFJlYWRtZU1hcmtlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0gICAgcHJpdmF0ZSBJVGV4dEVkaXRvciB0ZXh0RWRpdG9yOwotCi0gICAgcHJpdmF0ZSBPYmplY3RbXVtdIGN1c3RvbUF0dHJpYnV0ZXM7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BUktFUl9UWVBFID0gIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wucmVhZG1lbWFya2VyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhY3Rpb24gZm9yIHRoZSBnaXZlbiB0ZXh0IGVkaXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlZGl0b3IgdGhlIHRleHQgZWRpdG9yCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCBmb3IgdGhlIGFjdGlvbgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBjdXN0b20gYXR0cmlidXRlcyBmb3IgdGhpcyBtYXJrZXIKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBmb3IgdGhlIG1hcmtlcgotICAgICAqLwotICAgIHB1YmxpYyBBZGRSZWFkbWVNYXJrZXJBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICBPYmplY3RbXVtdIGF0dHJpYnV0ZXMsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHRleHRFZGl0b3IgPSBlZGl0b3I7Ci0gICAgICAgIHNldFRleHQobGFiZWwpOwotICAgICAgICB0aGlzLmN1c3RvbUF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJQWN0aW9uI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKDExKTsKLQotICAgICAgICBJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHRleHRFZGl0b3IKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0KLSAgICAgICAgICAgIGludCBzdGFydCA9IHNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIGlmIChsZW5ndGggPCAwKSB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gLWxlbmd0aDsKLSAgICAgICAgICAgICAgICBzdGFydCAtPSBsZW5ndGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1hcmtlclV0aWxpdGllcy5zZXRDaGFyU3RhcnQoYXR0cmlidXRlcywgc3RhcnQpOwotICAgICAgICAgICAgTWFya2VyVXRpbGl0aWVzLnNldENoYXJFbmQoYXR0cmlidXRlcywgc3RhcnQgKyBsZW5ndGgpOwotCi0gICAgICAgICAgICAvLyBtYXJrZXIgbGluZSBudW1iZXJzIGFyZSAxLWJhc2VkCi0gICAgICAgICAgICBpbnQgbGluZSA9IHNlbGVjdGlvbi5nZXRTdGFydExpbmUoKTsKLSAgICAgICAgICAgIE1hcmtlclV0aWxpdGllcy5zZXRMaW5lTnVtYmVyKGF0dHJpYnV0ZXMsIGxpbmUgPT0gLTEgPyAtMQotICAgICAgICAgICAgICAgICAgICA6IGxpbmUgKyAxKTsKLQotICAgICAgICAgICAgLy8gc2V0IGN1c3RvbSBhdHRyaWJ1dGUgdmFsdWVzCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChjdXN0b21BdHRyaWJ1dGVzW2ldWzBdLCBjdXN0b21BdHRyaWJ1dGVzW2ldWzFdKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWFya2VyVXRpbGl0aWVzLnNldE1lc3NhZ2UoYXR0cmlidXRlcywgbWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFya2VyVXRpbGl0aWVzCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVNYXJrZXIoZ2V0UmVzb3VyY2UoKSwgYXR0cmlidXRlcywgTUFSS0VSX1RZUEUpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBSZWFkbWVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpOwotICAgICAgICAgICAgUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHguZ2V0U3RhdHVzKCkpOwotCi0gICAgICAgICAgICBTaGVsbCBzaGVsbCA9IHRleHRFZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJBZGRfcmVhZG1lX21hcmtlcl9lcnJvcl90aXRsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiQWRkX3JlYWRtZV9tYXJrZXJfZXJyb3JfbWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1zZywgeC5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugb24gd2hpY2ggdG8gY3JlYXRlIHRoZSBtYXJrZXIsIAotICAgICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGFwcGxpY2FibGUgcmVzb3VyY2UuIFRoaXMKLSAgICAgKiBxdWVyaWVzIHRoZSBlZGl0b3IncyBpbnB1dCB1c2luZyA8Y29kZT5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVzb3VyY2UgdG8gd2hpY2ggdG8gYXR0YWNoIHRoZSBuZXdseSBjcmVhdGVkIG1hcmtlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0gICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgcmV0dXJuIChJUmVzb3VyY2UpICgoSUFkYXB0YWJsZSkgaW5wdXQpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9BZGRTZW50ZW5jZVJlc29sdXRpb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL0FkZFNlbnRlbmNlUmVzb2x1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODRhMDJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL0FkZFNlbnRlbmNlUmVzb2x1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQSByZXNvbHV0aW9uIHdoaWNoIGluc2VydHMgYSBzZW50ZW5jZSBpbnRvIHRoZSByZWFkbWUgZmlsZSAKLSAqLwotcHVibGljIGNsYXNzIEFkZFNlbnRlbmNlUmVzb2x1dGlvbiBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uIHsKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElNYXJrZXJSZXNvbHV0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkFkZF9TZW50ZW5jZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJTWFya2VyUmVzb2x1dGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgLy8gU2UgaWYgdGhlcmUgaXMgYW4gb3BlbiBlZGl0b3Igb24gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgbWFya2VyCi0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgIGlmICh3ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKSBtYXJrZXIKLSAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBwYWdlLmZpbmRFZGl0b3IoaW5wdXQpOwotCi0gICAgICAgIGlmIChlZGl0b3JQYXJ0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG9wZW4gYW4gZWRpdG9yCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVkaXRvclBhcnQgPSBJREUub3BlbkVkaXRvcihwYWdlLCAoSUZpbGUpIG1hcmtlci5nZXRSZXNvdXJjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Iody5nZXRTaGVsbCgpLCBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiUmVzb2x1dGlvbl9FcnJvciIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlVuYWJsZV90b19vcGVuX2ZpbGVfZWRpdG9yIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVkaXRvclBhcnQgPT0gbnVsbCB8fCAhKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBSZWFkbWVFZGl0b3IpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvLyBpbnNlcnQgdGhlIHNlbnRlbmNlCi0gICAgICAgIFJlYWRtZUVkaXRvciBlZGl0b3IgPSAoUmVhZG1lRWRpdG9yKSBlZGl0b3JQYXJ0OwotICAgICAgICBJRG9jdW1lbnQgZG9jID0gZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCgKLSAgICAgICAgICAgICAgICBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgIFN0cmluZyBzID0gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJTaW1wbGVfc2VudGVuY2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0cnkgewotICAgICAgICAgICAgZG9jLnJlcGxhY2UobWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIC0xKSwgMCwgcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vIGRlbGV0ZSB0aGUgbWFya2VyCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXJrZXIuZGVsZXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL0RlZmF1bHRTZWN0aW9uc1BhcnNlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvRGVmYXVsdFNlY3Rpb25zUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGIxMmUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvRGVmYXVsdFNlY3Rpb25zUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2w7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNpbXBsZSBwYXJzZXIgaW1wbGVtZW50aW5nIHRoZSBJUmVhZG1lRmlsZVBhcnNlcgotICogaW50ZXJmYWNlLiBJdCBwYXJzZXMgYSBSZWFkbWUgZmlsZSBpbnRvIHNlY3Rpb25zIGJhc2VkIG9uIHRoZQotICogZXhpc3RlbmNlIG9mIG51bWJlcmVkIHNlY3Rpb24gdGFncyBpbiB0aGUgaW5wdXQuIEEgbGluZSBiZWdpbm5pbmcKLSAqIHdpdGggYSBudW1iZXIgZm9sbG93ZWQgYnkgYSBkb3Qgd2lsbCBiZSB0YWtlbiBhcyBhIHNlY3Rpb24gaW5kaWNhdG9yCi0gKiAoZm9yIGV4YW1wbGUsIDEuLCAyLiwgb3IgMTIuKS4gCi0gKiBBcyB3ZWxsLCBhIGxpbmUgYmVnaW5uaW5nIHdpdGggYSBzdWJzZWN0aW9uLXN0eWxlIHNlcmllcyBvZiBudW1iZXJzCi0gKiB3aWxsIGFsc28gYmUgdGFrZW4gYXMgYSBzZWN0aW9uIGluZGljYXRvciwgYW5kIGNhbiBiZSB1c2VkIHRvIAotICogaW5kaWNhdGUgc3Vic2VjdGlvbnMgKGZvciBleGFtcGxlLCAxLjEsIG9yIDEuMS4xMikuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U2VjdGlvbnNQYXJzZXIgaW1wbGVtZW50cyBJUmVhZG1lRmlsZVBhcnNlciB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFyayBlbGVtZW50IHRoYXQgaXMgdGhlIGxvZ2ljYWwgcGFyZW50Ci0gICAgICogb2YgdGhlIGdpdmVuIG1hcmsgbnVtYmVyLiAgRWFjaCBkb3QgaW4gYSBtYXJrIG51bWJlcgotICAgICAqIHJlcHJlc2VudHMgYSBwYXJlbnQtY2hpbGQgc2VwYXJhdGlvbi4gIEZvciBleGFtcGxlLAotICAgICAqIHRoZSBwYXJlbnQgb2YgMS4yIGlzIDEsIHRoZSBwYXJlbnQgb2YgMS40LjEgaXMgMS40LgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBhcHByb3ByaWF0ZSBwYXJlbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElBZGFwdGFibGUgZ2V0UGFyZW50KEhhc2h0YWJsZSB0b2MsIFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgaW50IGxhc3REb3QgPSBudW1iZXIubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgaWYgKGxhc3REb3QgPCAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFN0cmluZyBwYXJlbnROdW1iZXIgPSBudW1iZXIuc3Vic3RyaW5nKDAsIGxhc3REb3QpOwotICAgICAgICByZXR1cm4gKElBZGFwdGFibGUpIHRvYy5nZXQocGFyZW50TnVtYmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbgotICAgICAqIGZpbGUuICBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSB3ZXJlIGFueSBlcnJvcnMKLSAgICAgKiByZWFkaW5nIHRoZSBmaWxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGV4dChJRmlsZSBmaWxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgICBpbnQgcmVhZCA9IGluLnJlYWQoYnVmKTsKLSAgICAgICAgICAgIHdoaWxlIChyZWFkID4gMCkgewotICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIHJlYWQpOwotICAgICAgICAgICAgICAgIHJlYWQgPSBpbi5yZWFkKGJ1Zik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBpbnB1dCBnaXZlbiBieSB0aGUgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSAgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgaW5wdXQgdGV4dAotICAgICAqIEByZXR1cm4gYW4gZWxlbWVudCBjb2xsZWN0aW9uIHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIGlucHV0Ci0gICAgICovCi0gICAgcHVibGljIE1hcmtFbGVtZW50W10gcGFyc2UoSUZpbGUgZmlsZSkgewotICAgICAgICBIYXNodGFibGUgbWFya1RhYmxlID0gbmV3IEhhc2h0YWJsZSg0MCk7Ci0gICAgICAgIFZlY3RvciB0b3BMZXZlbCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgU3RyaW5nIHMgPSBnZXRUZXh0KGZpbGUpOwotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBpbnQgZW5kID0gLTE7Ci0gICAgICAgIGludCBsaW5lbm8gPSAwOwotICAgICAgICBpbnQgbGFzdGxpbmVubyA9IDA7Ci0gICAgICAgIE1hcmtFbGVtZW50IGxhc3RtZSA9IG51bGw7Ci0gICAgICAgIGludCBpeDsKLQotICAgICAgICAvLyBwYXJzZSBjb250ZW50IGZvciBoZWFkaW5ncwotICAgICAgICBpeCA9IHMuaW5kZXhPZignXG4nLCBzdGFydCk7Ci0gICAgICAgIHdoaWxlIChpeCAhPSAtMSkgewotICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwotICAgICAgICAgICAgZW5kID0gaXggPSBzLmluZGV4T2YoJ1xuJywgc3RhcnQpOwotICAgICAgICAgICAgbGluZW5vKys7Ci0gICAgICAgICAgICBpZiAoaXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAvLyBza2lwIGJsYW5rcwotICAgICAgICAgICAgICAgIHdoaWxlIChzLmNoYXJBdChzdGFydCkgPT0gJyAnIHx8IHMuY2hhckF0KHN0YXJ0KSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChzLmNoYXJBdChzdGFydCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0bWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdG1lLnNldE51bWJlck9mTGluZXMobGluZW5vIC0gbGFzdGxpbmVubyAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RsaW5lbm8gPSBsaW5lbm87Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtYXJrTmFtZSA9IHBhcnNlSGVhZGluZyhzLCBzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgICAgICAgICAvL2dldCB0aGUgcGFyZW50IG1hcmssIGlmIGFueS4KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1hcmtOdW1iZXIgPSBwYXJzZU51bWJlcihtYXJrTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIElBZGFwdGFibGUgcGFyZW50ID0gZ2V0UGFyZW50KG1hcmtUYWJsZSwgbWFya051bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IGZpbGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgTWFya0VsZW1lbnQgbWUgPSBuZXcgTWFya0VsZW1lbnQocGFyZW50LCBtYXJrTmFtZSwgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICBsYXN0bWUgPSBtZTsKLQotICAgICAgICAgICAgICAgICAgICBtYXJrVGFibGUucHV0KG1hcmtOdW1iZXIsIG1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBmaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3BMZXZlbC5hZGQobWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXN0bWUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gc2V0IHRoZSBudW1iZXIgb2YgbGluZXMgZm9yIHRoZSBsYXN0IHNlY3Rpb24KLSAgICAgICAgICAgIGxhc3RtZS5zZXROdW1iZXJPZkxpbmVzKGxpbmVubyAtIGxhc3RsaW5lbm8gLSAxKTsKLSAgICAgICAgfQotICAgICAgICBNYXJrRWxlbWVudFtdIHJlc3VsdHMgPSBuZXcgTWFya0VsZW1lbnRbdG9wTGV2ZWwuc2l6ZSgpXTsKLSAgICAgICAgdG9wTGV2ZWwuY29weUludG8ocmVzdWx0cyk7Ci0gICAgICAgIHJldHVybiByZXN1bHRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzZWN0aW9uIG5hbWUgZnJvbSB0aGUgYnVmZmVyIGFuZCB0cmltcyB0cmFpbGluZwotICAgICAqIHNwYWNlIGNoYXJhY3RlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVmZmVyICB0aGUgc3RyaW5nIGZyb20gd2hpY2ggdG8gY3JlYXRlIHRoZSBzZWN0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gc3RhcnQgIHRoZSBzdGFydCBpbmRleAotICAgICAqIEBwYXJhbSBlbmQgIHRoZSBlbmQgaW5kZXgKLSAgICAgKiBAcmV0dXJuIGEgc2VjdGlvbiBuYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyc2VIZWFkaW5nKFN0cmluZyBidWZmZXIsIGludCBzdGFydCwgaW50IGVuZCkgewotICAgICAgICB3aGlsZSAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShidWZmZXIuY2hhckF0KGVuZCAtIDEpKSAmJiBlbmQgPiBzdGFydCkgewotICAgICAgICAgICAgZW5kLS07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIGZvciB0aGlzIGhlYWRpbmcuICBBIGhlYWRpbmcgY29uc2lzdHMKLSAgICAgKiBvZiBhIG51bWJlciAoYW4gYXJiaXRyYXJ5IHN0cmluZyBvZiBudW1iZXJzIGFuZCBkb3RzKSwgZm9sbG93ZWQgYnkKLSAgICAgKiBhcmJpdHJhcnkgdGV4dC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhcnNlTnVtYmVyKFN0cmluZyBoZWFkaW5nKSB7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIGludCBlbmQgPSBoZWFkaW5nLmxlbmd0aCgpOwotICAgICAgICBjaGFyIGM7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGMgPSBoZWFkaW5nLmNoYXJBdChzdGFydCsrKTsKLSAgICAgICAgfSB3aGlsZSAoKGMgPT0gJy4nIHx8IENoYXJhY3Rlci5pc0RpZ2l0KGMpKSAmJiBzdGFydCA8IGVuZCk7Ci0KLSAgICAgICAgLy9kaXNyZWdhcmQgdHJhaWxpbmcgZG90cwotICAgICAgICB3aGlsZSAoaGVhZGluZy5jaGFyQXQoc3RhcnQgLSAxKSA9PSAnLicgJiYgc3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICBzdGFydC0tOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkaW5nLnN1YnN0cmluZygwLCBzdGFydCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvRGlydHlTdGF0ZUNvbnRyaWJ1dGlvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvRGlydHlTdGF0ZUNvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmJkYjlmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL0RpcnR5U3RhdGVDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cm9sQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZW1vbnN0cmF0ZXMgdGhlIGNvbnRyaWJ1dGlvbiBvZiBhIGN1c3RvbSBjb250cm9sIHRvIHRoZSAKLSAqIHN0YXR1cyBsaW5lIGZvciB0aGUgcmVhZG1lIGVkaXRvci4gIFRoZSBjb250cm9sIHNob3dzIHRoZQotICogZGlydHkgc3RhdHVzIG9mIHRoZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXJ0eVN0YXRlQ29udHJpYnV0aW9uIGV4dGVuZHMgQ29udHJvbENvbnRyaWJ1dGlvbiBpbXBsZW1lbnRzCi0gICAgICAgIElQcm9wZXJ0eUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIExhYmVsIGxhYmVsOwotCi0gICAgcHJpdmF0ZSBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IERpcnR5U3RhdGVDb250cmlidXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERpcnR5U3RhdGVDb250cmlidXRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCJEaXJ0eVN0YXRlIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIENvbnRyb2xDb250cmlidXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gSWYgdGhlIGNvbXBvc2l0ZSBpcyBnb29kIGp1c3QgcmV0dXJuIGl0LgotICAgICAgICBpZiAoY29tcG9zaXRlICE9IG51bGwgJiYgIWNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotCi0gICAgICAgIC8vIENyZWF0ZSBjb21wb3NpdGUgZm9yIGJvcmRlci4KLSAgICAgICAgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICBjb21wb3NpdGUuc2V0RGF0YSh0aGlzKTsKLQotICAgICAgICAvLyBDcmVhdGUgbGFiZWwgaW5zaWRlIGNvbXBvc2l0ZS4JCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRTaXplKDgwLCAxNSk7Ci0KLSAgICAgICAgdXBkYXRlU3RhdGUoKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBhbiBlZGl0b3IgaXMgYWN0aXZhdGVkLgotICAgICAqCi0gICAgICogQHNlZSBSZWFkbWVFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZWRpdG9yQ2hhbmdlZChJRWRpdG9yUGFydCBwYXJ0KSB7Ci0gICAgICAgIGlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgYWN0aXZlRWRpdG9yLnJlbW92ZVByb3BlcnR5TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgYWN0aXZlRWRpdG9yID0gcGFydDsKLSAgICAgICAgaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhY3RpdmVFZGl0b3IuYWRkUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5TGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJRCkgewotICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgSUVkaXRvclBhcnQpCi0gICAgICAgICAgICB1cGRhdGVTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBsYWJlbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdGUoKSB7Ci0gICAgICAgIGlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBib29sZWFuIHNhdmVOZWVkZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKQotICAgICAgICAgICAgc2F2ZU5lZWRlZCA9IGFjdGl2ZUVkaXRvci5pc0RpcnR5KCk7Ci0gICAgICAgIGlmIChzYXZlTmVlZGVkKQotICAgICAgICAgICAgbGFiZWwuc2V0VGV4dChNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlNhdmVfTmVlZGVkIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxhYmVsLnNldFRleHQoTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJDbGVhbiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL0VkaXRvckFjdGlvbkRlbGVnYXRlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9FZGl0b3JBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFhZjk4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL0VkaXRvckFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBkZW1vbnN0cmF0ZSBlZGl0b3IgYWN0aW9uIGV4dGVuc2lvbnMuCi0gKiBBbiBleHRlbnNpb24gc2hvdWxkIGJlIGRlZmluZWQgaW4gdGhlIHJlYWRtZSBwbHVnaW4ueG1sLgotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUgewotICAgIHByaXZhdGUgSUVkaXRvclBhcnQgZWRpdG9yOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBFZGl0b3JBY3Rpb25EZWxlZ2F0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWRpdG9yQWN0aW9uRGVsZWdhdGUoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb25EZWxlZ2F0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihlZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCksIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiUmVhZG1lX0VkaXRvciIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJFZGl0b3JfQWN0aW9uX2V4ZWN1dGVkIikpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRoZSA8Y29kZT5FZGl0b3JBY3Rpb25EZWxlZ2F0ZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPklBY3Rpb25EZWxlZ2F0ZTwvY29kZT4gbWV0aG9kIGRvZXMgbm90aGluZy4KLSAgICAgKgotICAgICAqIFNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIGhhcyBjaGFuZ2VkLiBQbHVnaW4gcHJvdmlkZXIKLSAgICAgKiBjYW4gdXNlIGl0IHRvIGNoYW5nZSB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBhY3Rpb24KLSAgICAgKiBvciB0byBtb2RpZnkgb3RoZXIgcHJlc2VudGF0aW9uIHByb3BlcnRpZXMuCi0gICAgICoKLSAgICAgKiA8cD5BY3Rpb24gZGVsZWdhdGUgY2Fubm90IGJlIG5vdGlmaWVkIGFib3V0Ci0gICAgICogc2VsZWN0aW9uIGNoYW5nZXMgYmVmb3JlIGl0IGlzIGxvYWRlZC4gRm9yIHRoYXQgcmVhc29uLAotICAgICAqIGNvbnRyb2wgb2YgYWN0aW9uJ3MgZW5hYmxlIHN0YXRlIHNob3VsZCBhbHNvIGJlIHBlcmZvcm1lZAotICAgICAqIHRocm91Z2ggc2ltcGxlIFhNTCBydWxlcyBkZWZpbmVkIGZvciB0aGUgZXh0ZW5zaW9uCi0gICAgICogcG9pbnQuIFRoZXNlIHJ1bGVzIGFsbG93IGVuYWJsZSBzdGF0ZSBjb250cm9sIGJlZm9yZQotICAgICAqIHRoZSBkZWxlZ2F0ZSBoYXMgYmVlbiBsb2FkZWQuPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPkVkaXRvckFjdGlvbkRlbGVnYXRlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+SUVkaXRvckFjdGlvbkRlbGVnYXRlPC9jb2RlPiBtZXRob2QgcmVtZW1iZXJzIHRoZSBhY3RpdmUgZWRpdG9yLgotICAgICAqCi0gICAgICogVGhlIG1hdGNoaW5nIGVkaXRvciBoYXMgYmVlbiBhY3RpdmF0ZWQuIE5vdGlmaWNhdGlvbgotICAgICAqIGd1YXJhbnRlZXMgdGhhdCBvbmx5IGVkaXRvcnMgdGhhdCBtYXRjaCB0aGUgdHlwZSBmb3Igd2hpY2ggCi0gICAgICogdGhpcyBhY3Rpb24gaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aWxsIGJlIHRyYWNrZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0aW9uIGFjdGlvbiBwcm94eSB0aGF0IHJlcHJlc2VudHMgdGhpcyBkZWxlZ2F0ZSBpbiB0aGUgd29ya2JlbmNoCi0gICAgICogQHBhcmFtIGVkaXRvciB0aGUgbWF0Y2hpbmcgZWRpdG9yIHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCBlZGl0b3IpIHsKLSAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvSVJlYWRtZUNvbnN0YW50cy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvSVJlYWRtZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTZmMzY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL0lSZWFkbWVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBmb3IgdXNlIG9ubHkgd2l0aGluIHRoZQotICogUmVhZG1lIGV4YW1wbGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlYWRtZUNvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBQTFVHSU5fSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQ09OVEVOVF9PVVRMSU5FID0gUFJFRklYICsgImNvbnRlbnRfb3V0bGluZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfU0VDVElPTlMgPSBQUkVGSVggKyAic2VjdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT04gPSAicmVhZG1lIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BBUlNFUiA9ICJwYXJzZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUF9TRUNUSU9OX1BBUlNFUiA9ICJzZWN0aW9uUGFyc2VyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gR2xvYmFsIGFjdGlvbnMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRBUkdFVDIgPSBQUkVGSVggKyAicmV0YXJnZXQyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxSRVRBUkdFVDMgPSBQUkVGSVggKyAibGFiZWxyZXRhcmdldDMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VUX1JFVEFSR0VUNCA9ICJvcmdfZWNsaXBzZV91aV9leGFtcGxlc19yZWFkbWV0b29sX3JlYWRtZVJldGFyZ2V0QWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFVF9MQUJFTFJFVEFSR0VUNSA9ICJvcmdfZWNsaXBzZV91aV9leGFtcGxlc19yZWFkbWV0b29sX3JlYWRtZVJlbGFiZWxSZXRhcmdldEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFByZWZlcmVuY2UgY29uc3RhbnRzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFX0NIRUNLMSA9IFBSRUZJWCArICJjaGVjazEiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVfQ0hFQ0syID0gUFJFRklYICsgImNoZWNrMiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRV9DSEVDSzMgPSBQUkVGSVggKyAiY2hlY2szIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFX1JBRElPX0NIT0lDRSA9IFBSRUZJWCArICJyYWRpb19jaG9pY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVfVEVYVCA9IFBSRUZJWCArICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gSGVscCBjb250ZXh0IGlkcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9BQ1RJT04xX0NPTlRFWFQgPSBQUkVGSVgKLSAgICAgICAgICAgICsgImVkaXRvcl9hY3Rpb24xX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfQUNUSU9OMl9DT05URVhUID0gUFJFRklYCi0gICAgICAgICAgICArICJlZGl0b3JfYWN0aW9uMl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0FDVElPTjNfQ09OVEVYVCA9IFBSRUZJWAotICAgICAgICAgICAgKyAiZWRpdG9yX2FjdGlvbjNfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05TX1ZJRVdfQ09OVEVYVCA9IFBSRUZJWAotICAgICAgICAgICAgKyAic2VjdGlvbnNfdmlld19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9QQUdFX0NPTlRFWFQgPSBQUkVGSVgKLSAgICAgICAgICAgICsgInByZWZlcmVuY2VfcGFnZV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUEFHRV9DT05URVhUID0gUFJFRklYCi0gICAgICAgICAgICArICJwcm9wZXJ0eV9wYWdlX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9QQUdFMl9DT05URVhUID0gUFJFRklYCi0gICAgICAgICAgICArICJwcm9wZXJ0eV9wYWdlMl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0NPTlRFWFQgPSBQUkVGSVggKyAiZWRpdG9yX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNUSU9OU19ESUFMT0dfQ09OVEVYVCA9IFBSRUZJWAotICAgICAgICAgICAgKyAic2VjdGlvbnNfZGlhbG9nX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX09VVExJTkVfUEFHRV9DT05URVhUID0gUFJFRklYCi0gICAgICAgICAgICArICJjb250ZW50X291dGxpbmVfcGFnZV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRJT05fV0laQVJEX1BBR0VfQ09OVEVYVCA9IFBSRUZJWAotICAgICAgICAgICAgKyAiY3JlYXRpb25fd2l6YXJkX3BhZ2VfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIE1hcmtlciBhdHRyaWJ1dGVzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0FUVF9JRCA9IFBSRUZJWCArICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9BVFRfTEVWRUwgPSBQUkVGSVggKyAibGV2ZWwiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfQVRUX0RFUFQgPSBQUkVGSVggKyAiZGVwYXJ0bWVudCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9BVFRfQ09ERSA9IFBSRUZJWCArICJjb2RlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0FUVF9MQU5HID0gUFJFRklYICsgImxhbmd1YWdlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvSVJlYWRtZUZpbGVQYXJzZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL0lSZWFkbWVGaWxlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZTJkYmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvSVJlYWRtZUZpbGVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBhcyBBUEkgZm9yIHRoZSBSZWFkbWUgcGFyc2VyIGV4dGVuc2lvbiAKLSAqIHBvaW50LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgbG9va3MgZm9yIGxpbmVzCi0gKiBpbiB0aGUgZmlsZSB0aGF0IHN0YXJ0IHdpdGggYSBudW1iZXIgYW5kIGFzc3VtZXMgdGhhdCB0aGV5Ci0gKiByZXByZXNlbnQgc2VjdGlvbnMuIFRvb2xzIGFyZSBhbGxvd2VkIHRvIHJlcGxhY2UgdGhpcyAKLSAqIGFsZ29yaXRobSBieSBkZWZpbmluZyBhbiBleHRlbnNpb24gYW5kIHN1cHBseWluZyBhbiAKLSAqIGFsdGVybmF0aXZlIHRoYXQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVhZG1lRmlsZVBhcnNlciB7Ci0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvdmlkZWQgZmlsZQotICAgICAqIGFuZCBnZW5lcmF0ZXMgYSBjb2xsZWN0aW9uIG9mIHNlY3Rpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBNYXJrRWxlbWVudFtdIHBhcnNlKElGaWxlIHJlYWRtZUZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvTWFya0VsZW1lbnQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL01hcmtFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDhkMGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvTWFya0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbWFya2VkIGxvY2F0aW9uIGluIHRoZSBSZWFkbWUKLSAqIGZpbGUgdGV4dC4gIAotICoKLSAqIFRJUDogQnkgaW1wbGVtZW50aW5nIHRoZSA8Y29kZT5JV29ya2JlbmNoQWRhcHRlcjwvY29kZT4gaW50ZXJmYWNlLAotICogd2UgY2FuIGVhc2lseSBhZGQgb2JqZWN0cyBvZiB0aGlzIHR5cGUgdG8gdmlld2VycyBhbmQgcGFydHMgaW4KLSAqIHRoZSB3b3JrYmVuY2guICBXaGVuIGEgdmlld2VyIGNvbnRhaW5zIDxjb2RlPklXb3JrYmVuY2hBZGFwdGVyPC9jb2RlPiwKLSAqIHRoZSBnZW5lcmljIDxjb2RlPldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjwvY29kZT4gYW5kCi0gKiA8Y29kZT5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyPC9jb2RlPiBjYW4gYmUgdXNlZCB0byBwcm92aWRlCi0gKiBuYXZpZ2F0aW9uIGFuZCBkaXNwbGF5IGZvciB0aGF0IHZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIE1hcmtFbGVtZW50IGltcGxlbWVudHMgSVdvcmtiZW5jaEFkYXB0ZXIsIElBZGFwdGFibGUgewotICAgIHByaXZhdGUgU3RyaW5nIGhlYWRpbmdOYW1lOwotCi0gICAgcHJpdmF0ZSBJQWRhcHRhYmxlIHBhcmVudDsKLQotICAgIHByaXZhdGUgaW50IG9mZnNldDsKLQotICAgIHByaXZhdGUgaW50IG51bWJlck9mTGluZXM7Ci0KLSAgICBwcml2YXRlIGludCBsZW5ndGg7Ci0KLSAgICBwcml2YXRlIFZlY3RvciBjaGlsZHJlbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgTWFya0VsZW1lbnQgYW5kIHN0b3JlcyBwYXJlbnQgZWxlbWVudCBhbmQKLSAgICAgKiBsb2NhdGlvbiBpbiB0aGUgdGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgb2YgdGhpcyBlbGVtZW50Ci0gICAgICogQHBhcmFtIGhlYWRpbmcgdGV4dCBjb3JyZXNwb25kaW5nIHRvIHRoZSBoZWFkaW5nCi0gICAgICogQHBhcmFtIG9mZnNldCAgdGhlIG9mZnNldCBpbnRvIHRoZSBSZWFkbWUgdGV4dAotICAgICAqIEBwYXJhbSBsZW5ndGggIHRoZSBsZW5ndGggb2YgdGhlIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFya0VsZW1lbnQoSUFkYXB0YWJsZSBwYXJlbnQsIFN0cmluZyBoZWFkaW5nLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgTWFya0VsZW1lbnQpIHsKLSAgICAgICAgICAgICgoTWFya0VsZW1lbnQpIHBhcmVudCkuYWRkQ2hpbGQodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5oZWFkaW5nTmFtZSA9IGhlYWRpbmc7Ci0gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY2hpbGQgdG8gdGhpcyBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENoaWxkKE1hcmtFbGVtZW50IGNoaWxkKSB7Ci0gICAgICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgfQotICAgICAgICBjaGlsZHJlbi5hZGQoY2hpbGQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUFkYXB0YWJsZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChhZGFwdGVyID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIGlmIChhZGFwdGVyID09IElQcm9wZXJ0eVNvdXJjZS5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWFya0VsZW1lbnRQcm9wZXJ0aWVzKHRoaXMpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hBZGFwdGVyCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoQWRhcHRlcgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgSVdvcmtiZW5jaEFkYXB0ZXIgcGFyZW50RWxlbWVudCA9IChJV29ya2JlbmNoQWRhcHRlcikgcGFyZW50Ci0gICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpOwotICAgICAgICBpZiAocGFyZW50RWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50RWxlbWVudC5nZXRJbWFnZURlc2NyaXB0b3Iob2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hBZGFwdGVyCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotICAgICAgICByZXR1cm4gaGVhZGluZ05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBzZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gbGVuZ3RoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZMaW5lcygpIHsKLSAgICAgICAgcmV0dXJuIG51bWJlck9mTGluZXM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoQWRhcHRlcgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGlzIHNlY3Rpb24gaW4gdGhlIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIG9mZnNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdOdW1iZXJPZkxpbmVzICB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZMaW5lcyhpbnQgbmV3TnVtYmVyT2ZMaW5lcykgewotICAgICAgICBudW1iZXJPZkxpbmVzID0gbmV3TnVtYmVyT2ZMaW5lczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9NYXJrRWxlbWVudFByb3BlcnRpZXMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL01hcmtFbGVtZW50UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzAwNTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL01hcmtFbGVtZW50UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHByb3BlcnR5IHNoZWV0IHByb3BlcnRpZXMKLSAqIGZvciBNYXJrRWxlbWVudC4gIFRoaXMgd2lsbCBkaXNwbGF5IHByb3BlcnRpZXMgZm9yCi0gKiB0aGUgTWFya0VsZW1lbnQgd2hlbiBzZWxlY3RlZCBpbiB0aGUgcmVhZG1lIGVkaXRvcidzCi0gKiBjb250ZW50IG91dGxpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrRWxlbWVudFByb3BlcnRpZXMgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UgewotICAgIHByb3RlY3RlZCBNYXJrRWxlbWVudCBlbGVtZW50OwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTElORUNPVU5UID0gImxpbmVubyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NUQVJUID0gInN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTEVOR1RIID0gImxlbmd0aCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgTWFya0VsZW1lbnRQcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgIHRoZSBlbGVtZW50IHdob3NlIHByb3BlcnRpZXMgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzCi0gICAgICovCi0gICAgcHVibGljIE1hcmtFbGVtZW50UHJvcGVydGllcyhNYXJrRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotICAgICAgICAvLyBDcmVhdGUgdGhlIHByb3BlcnR5IHZlY3Rvci4KLSAgICAgICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnR5RGVzY3JpcHRvcnMgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvclszXTsKLQotICAgICAgICAvLyBBZGQgZWFjaCBwcm9wZXJ0eSBzdXBwb3J0ZWQuCi0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0gICAgICAgIGRlc2NyaXB0b3IgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yKFBST1BFUlRZX0xJTkVDT1VOVCwgTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJMaW5lX2NvdW50IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvcnNbMF0gPSBkZXNjcmlwdG9yOwotICAgICAgICBkZXNjcmlwdG9yID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvcihQUk9QRVJUWV9TVEFSVCwgTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJUaXRsZV9zdGFydCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3JzWzFdID0gZGVzY3JpcHRvcjsKLSAgICAgICAgZGVzY3JpcHRvciA9IG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IoUFJPUEVSVFlfTEVOR1RILCBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIlRpdGxlX2xlbmd0aCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3JzWzJdID0gZGVzY3JpcHRvcjsKLQotICAgICAgICAvLyBSZXR1cm4gaXQuCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByb3BlcnR5U291cmNlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhQUk9QRVJUWV9MSU5FQ09VTlQpKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKGVsZW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpKTsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKFBST1BFUlRZX1NUQVJUKSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihlbGVtZW50LmdldFN0YXJ0KCkpOwotICAgICAgICBpZiAobmFtZS5lcXVhbHMoUFJPUEVSVFlfTEVOR1RIKSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihlbGVtZW50LmdldExlbmd0aCgpKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBwcm9wZXJ0eSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJvcGVydHlTb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IHByb3BlcnR5KSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcm9wZXJ0eVNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvTWVzc2FnZVV0aWwuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL01lc3NhZ2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OGZiY2MuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvTWVzc2FnZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aGljaCBoZWxwcyB3aXRoIG1hbmFnaW5nIG1lc3NhZ2VzLgotICovCi0vKiBwYWNrYWdlICovY2xhc3MgTWVzc2FnZVV0aWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUKLSAgICAgICAgICAgIC5nZXRCdW5kbGUoUkVTT1VSQ0VfQlVORExFKTsKLQotICAgIHByaXZhdGUgTWVzc2FnZVV0aWwoKSB7Ci0gICAgICAgIC8vIHByZXZlbnQgaW5zdGFudGlhdGlvbiBvZiBjbGFzcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4ga2V5IGluCi0gICAgICogdGhlIHJlc291cmNlIGJ1bmRsZS4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHBhcmFtIGFyZ3MgdGhlIG1lc3NhZ2UgYXJndW1lbnRzCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4ga2V5IGluCi0gICAgICogdGhlIHJlc291cmNlIGJ1bmRsZS4gSWYgdGhlcmUgaXNuJ3QgYW55IHZhbHVlIHVuZGVyCi0gICAgICogdGhlIGdpdmVuIGtleSwgdGhlIGtleSBpcyByZXR1cm5lZCwgc3Vycm91bmRlZCBieSAnISdzLgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9Qb3B1cE1lbnVBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUG9wdXBNZW51QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlYzBiYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9Qb3B1cE1lbnVBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBBY3Rpb24gZGVsZWdhdGUgZm9yIGhhbmRsaW5nIHBvcHVwIG1lbnUgYWN0aW9ucyBvbiBhIHJlYWRtZSBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgUG9wdXBNZW51QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBwYXJ0OwotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURyb3BBY3Rpb25EZWxlZ2F0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbih0aGlzLnBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJSZWFkbWVfRXhhbXBsZSIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJQb3B1cF9NZW51X0FjdGlvbl9leGVjdXRlZCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb25EZWxlZ2F0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIC8vSWdub3JlZCBmb3IgdGhpcyBleGFtcGxlCi0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSU9iamVjdEFjdGlvbkRlbGVnYXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotICAgICAgICB0aGlzLnBhcnQgPSB0YXJnZXRQYXJ0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZUNvbnRlbnRPdXRsaW5lRHJhZ0xpc3RlbmVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVDb250ZW50T3V0bGluZURyYWdMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTdhNWE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZUNvbnRlbnRPdXRsaW5lRHJhZ0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QbHVnaW5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBsdWdpblRyYW5zZmVyRGF0YTsKLQotLyoqCi0gKiBBIGRyYWcgbGlzdGVuZXIgZm9yIHRoZSByZWFkbWUgZWRpdG9yJ3MgY29udGVudCBvdXRsaW5lIHBhZ2UuCi0gKiBBbGxvd3MgZHJhZ2dpbmcgb2YgY29udGVudCBzZWdtZW50cyBpbnRvIHZpZXdzIHRoYXQgc3VwcG9ydAotICogdGhlIDxjb2RlPlRleHRUcmFuc2ZlcjwvY29kZT4gb3IgPGNvZGU+UGx1Z2luVHJhbnNmZXI8L2NvZGU+IHRyYW5zZmVyIHR5cGVzLgotICovCi1wdWJsaWMgY2xhc3MgUmVhZG1lQ29udGVudE91dGxpbmVEcmFnTGlzdGVuZXIgZXh0ZW5kcyBEcmFnU291cmNlQWRhcHRlciB7Ci0gICAgcHJpdmF0ZSBSZWFkbWVDb250ZW50T3V0bGluZVBhZ2UgcGFnZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZHJhZyBsaXN0ZW5lciBmb3IgdGhlIGdpdmVuIHBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFJlYWRtZUNvbnRlbnRPdXRsaW5lRHJhZ0xpc3RlbmVyKFJlYWRtZUNvbnRlbnRPdXRsaW5lUGFnZSBwYWdlKSB7Ci0gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEcmFnU291cmNlTGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKFBsdWdpblRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotICAgICAgICAgICAgYnl0ZVtdIHNlZ21lbnREYXRhID0gZ2V0U2VnbWVudFRleHQoKS5nZXRCeXRlcygpOwotICAgICAgICAgICAgZXZlbnQuZGF0YSA9IG5ldyBQbHVnaW5UcmFuc2ZlckRhdGEoUmVhZG1lRHJvcEFjdGlvbkRlbGVnYXRlLklELAotICAgICAgICAgICAgICAgICAgICBzZWdtZW50RGF0YSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLSAgICAgICAgICAgIGV2ZW50LmRhdGEgPSBnZXRTZWdtZW50VGV4dCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlYWRtZSBzZWdtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlZ21lbnRUZXh0KCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHBhZ2UuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBPYmplY3RbXSBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9BcnJheSgpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFtpXSBpbnN0YW5jZW9mIE1hcmtFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKChNYXJrRWxlbWVudCkgc2VsZWN0ZWRbaV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldExhYmVsKHNlbGVjdGVkW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lQ29udGVudE91dGxpbmVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNWVlODAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lQ29udGVudE91dGxpbmVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGx1Z2luVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOwotCi0vKioKLSAqIENvbnRlbnQgb3V0bGluZSBwYWdlIGZvciB0aGUgcmVhZG1lIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRtZUNvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIENvbnRlbnRPdXRsaW5lUGFnZSB7Ci0gICAgcHJvdGVjdGVkIElGaWxlIGlucHV0OwotCi0gICAgY2xhc3MgT3V0bGluZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0gICAgICAgIHByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLSAgICAgICAgcHVibGljIE91dGxpbmVBY3Rpb24oU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgICAgICBzdXBlcihsYWJlbCk7Ci0gICAgICAgICAgICBnZXRUcmVlVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RW5hYmxlZCghZXZlbnQuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaGVsbChTaGVsbCBzaGVsbCkgewotICAgICAgICAgICAgdGhpcy5zaGVsbCA9IHNoZWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIlJlYWRtZV9PdXRsaW5lIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJSZWFkbWVPdXRsaW5lQWN0aW9uRXhlY3V0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgUmVhZG1lQ29udGVudE91dGxpbmVQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBSZWFkbWVDb250ZW50T3V0bGluZVBhZ2UoSUZpbGUgaW5wdXQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIH0KLQotICAgIC8qKiAgCi0gICAgICogQ3JlYXRlcyB0aGUgY29udHJvbCBhbmQgcmVnaXN0ZXJzIHRoZSBwb3B1cCBtZW51IGZvciB0aGlzIHBhZ2UKLSAgICAgKiBNZW51IGlkICJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLm91dGxpbmUiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdldENvbnRyb2woKSwKLSAgICAgICAgICAgICAgICBJUmVhZG1lQ29uc3RhbnRzLkNPTlRFTlRfT1VUTElORV9QQUdFX0NPTlRFWFQpOwotCi0gICAgICAgIFRyZWVWaWV3ZXIgdmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOwotICAgICAgICB2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICB2aWV3ZXIuc2V0SW5wdXQoZ2V0Q29udGVudE91dGxpbmUoaW5wdXQpKTsKLSAgICAgICAgaW5pdERyYWdBbmREcm9wKCk7Ci0KLSAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBjb250ZXh0IG1lbnUuCi0gICAgICAgIE1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZW51TWdyLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0gICAgICAgIG1lbnVNZ3IuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMKLSAgICAgICAgICAgICAgICArICItZW5kIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgTWVudSBtZW51ID0gbWVudU1nci5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0VHJlZSgpKTsKLSAgICAgICAgdmlld2VyLmdldFRyZWUoKS5zZXRNZW51KG1lbnUpOwotICAgICAgICAvLyBCZSBzdXJlIHRvIHJlZ2lzdGVyIGl0IHNvIHRoYXQgb3RoZXIgcGx1Zy1pbnMgY2FuIGFkZCBhY3Rpb25zLgotICAgICAgICBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgKLSAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5vdXRsaW5lIiwgbWVudU1nciwgdmlld2VyKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLSAgICAgICAgICAgICAgICBJUmVhZG1lQ29uc3RhbnRzLlJFVEFSR0VUMiwKLSAgICAgICAgICAgICAgICBuZXcgT3V0bGluZUFjdGlvbihNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIk91dGxpbmVfQWN0aW9uMiIpKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBPdXRsaW5lQWN0aW9uIGFjdGlvbiA9IG5ldyBPdXRsaW5lQWN0aW9uKE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiT3V0bGluZV9BY3Rpb24zIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlJlYWRtZV9PdXRsaW5lX0FjdGlvbjMiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZ2V0U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotICAgICAgICAgICAgICAgIElSZWFkbWVDb25zdGFudHMuTEFCRUxSRVRBUkdFVDMsIGFjdGlvbik7Ci0gICAgICAgIGFjdGlvbiA9IG5ldyBPdXRsaW5lQWN0aW9uKE1lc3NhZ2VVdGlsLmdldFN0cmluZygiT3V0bGluZV9BY3Rpb240IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLSAgICAgICAgICAgICAgICBJUmVhZG1lQ29uc3RhbnRzLkFDVElPTl9TRVRfUkVUQVJHRVQ0LCBhY3Rpb24pOwotICAgICAgICBhY3Rpb24gPSBuZXcgT3V0bGluZUFjdGlvbihNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIk91dGxpbmVfQWN0aW9uNSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJSZWFkbWVfT3V0bGluZV9BY3Rpb241IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLSAgICAgICAgICAgICAgICBJUmVhZG1lQ29uc3RhbnRzLkFDVElPTl9TRVRfTEFCRUxSRVRBUkdFVDUsIGFjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29udGVudCBvdXRsaW5lIGZvciBhIGdpdmVuIGlucHV0IGVsZW1lbnQuCi0gICAgICogUmV0dXJucyB0aGUgb3V0bGluZSAoYSBsaXN0IG9mIE1hcmtFbGVtZW50cyksIG9yIG51bGwKLSAgICAgKiBpZiB0aGUgb3V0bGluZSBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgSUFkYXB0YWJsZSBnZXRDb250ZW50T3V0bGluZShJQWRhcHRhYmxlIGlucHV0KSB7Ci0gICAgICAgIHJldHVybiBSZWFkbWVNb2RlbEZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRDb250ZW50T3V0bGluZShpbnB1dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgZHJhZyBhbmQgZHJvcCBmb3IgdGhpcyBjb250ZW50IG91dGxpbmUgcGFnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdERyYWdBbmREcm9wKCkgewotICAgICAgICBpbnQgb3BzID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkU7Ci0gICAgICAgIFRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICBQbHVnaW5UcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0gICAgICAgIGdldFRyZWVWaWV3ZXIoKS5hZGREcmFnU3VwcG9ydChvcHMsIHRyYW5zZmVycywKLSAgICAgICAgICAgICAgICBuZXcgUmVhZG1lQ29udGVudE91dGxpbmVEcmFnTGlzdGVuZXIodGhpcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcmNlcyB0aGUgcGFnZSB0byB1cGRhdGUgaXRzIGNvbnRlbnRzLgotICAgICAqCi0gICAgICogQHNlZSBSZWFkbWVFZGl0b3IjZG9TYXZlKElQcm9ncmVzc01vbml0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBnZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgZ2V0VHJlZVZpZXdlcigpLnNldElucHV0KGdldENvbnRlbnRPdXRsaW5lKGlucHV0KSk7Ci0gICAgICAgIGdldFRyZWVWaWV3ZXIoKS5leHBhbmRBbGwoKTsKLSAgICAgICAgZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVDcmVhdGlvblBhZ2UuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZUNyZWF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWY3NDYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZUNyZWF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2w7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgb25seSBwYWdlIG9mIHRoZSBSZWFkbWUgZmlsZSByZXNvdXJjZSBjcmVhdGlvbiB3aXphcmQuICAKLSAqIEl0IHN1YmNsYXNzZXMgdGhlIHN0YW5kYXJkIGZpbGUgcmVzb3VyY2UgY3JlYXRpb24gcGFnZSBjbGFzcywgCi0gKiBhbmQgY29uc2VxdWVudGx5IGluaGVyaXRzIHRoZSBmaWxlIHJlc291cmNlIGNyZWF0aW9uIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhpcyBwYWdlIHByb3ZpZGVzIHVzZXJzIHdpdGggdGhlIGNob2ljZSBvZiBjcmVhdGluZyBzYW1wbGUgaGVhZGluZ3MgZm9yCi0gKiBzZWN0aW9ucyBhbmQgc3Vic2VjdGlvbnMuICBBZGRpdGlvbmFsbHksIHRoZSBvcHRpb24gaXMgcHJlc2VudGVkIHRvIG9wZW4KLSAqIHRoZSBmaWxlIGltbWVkaWF0ZWx5IGZvciBlZGl0aW5nIGFmdGVyIGNyZWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUmVhZG1lQ3JlYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotICAgIC8vIHdpZGdldHMKLSAgICBwcml2YXRlIEJ1dHRvbiBzZWN0aW9uQ2hlY2tib3g7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBzdWJzZWN0aW9uQ2hlY2tib3g7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBvcGVuRmlsZUNoZWNrYm94OwotCi0gICAgLy8gY29uc3RhbnRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5hbWVDb3VudGVyID0gMTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHBhZ2UgZm9yIHRoZSByZWFkbWUgY3JlYXRpb24gd2l6YXJkLgotICAgICAqCi0gICAgICogQHBhcmFtIHdvcmtiZW5jaCAgdGhlIHdvcmtiZW5jaCBvbiB3aGljaCB0aGUgcGFnZSBzaG91bGQgYmUgY3JlYXRlZAotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBSZWFkbWVDcmVhdGlvblBhZ2UoSVdvcmtiZW5jaCB3b3JrYmVuY2gsCi0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIoInNhbXBsZUNyZWF0ZVJlYWRtZVBhZ2UxIiwgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0aGlzLnNldFRpdGxlKE1lc3NhZ2VVdGlsLmdldFN0cmluZygiQ3JlYXRlX1JlYWRtZV9GaWxlIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRoaXMuc2V0RGVzY3JpcHRpb24oTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJDcmVhdGVfYV9uZXdfUmVhZG1lX2ZpbGVfcmVzb3VyY2UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIGluaGVyaXQgZGVmYXVsdCBjb250YWluZXIgYW5kIG5hbWUgc3BlY2lmaWNhdGlvbiB3aWRnZXRzCi0gICAgICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIGdldENvbnRyb2woKTsKLQotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwKLQkJCQlJUmVhZG1lQ29uc3RhbnRzLkNSRUFUSU9OX1dJWkFSRF9QQUdFX0NPTlRFWFQpOwotCi0gICAgICAgIHRoaXMuc2V0RmlsZU5hbWUoInNhbXBsZSIgKyBuYW1lQ291bnRlciArICIucmVhZG1lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIC8vIHNhbXBsZSBzZWN0aW9uIGdlbmVyYXRpb24gZ3JvdXAKLSAgICAgICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgZ3JvdXAuc2V0VGV4dChNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkF1dG9tYXRpY19zYW1wbGVfc2VjdGlvbl9nZW5lcmF0aW9uIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLSAgICAgICAgLy8gc2FtcGxlIHNlY3Rpb24gZ2VuZXJhdGlvbiBjaGVja2JveGVzCi0gICAgICAgIHNlY3Rpb25DaGVja2JveCA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHNlY3Rpb25DaGVja2JveC5zZXRUZXh0KE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiR2VuZXJhdGVfc2FtcGxlX3NlY3Rpb25fdGl0bGVzIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNlY3Rpb25DaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIHNlY3Rpb25DaGVja2JveC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQotICAgICAgICBzdWJzZWN0aW9uQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBzdWJzZWN0aW9uQ2hlY2tib3guc2V0VGV4dChNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkdlbmVyYXRlX3NhbXBsZV9zdWJzZWN0aW9uX3RpdGxlcyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzdWJzZWN0aW9uQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICBzdWJzZWN0aW9uQ2hlY2tib3guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0KLSAgICAgICAgLy8gb3BlbiBmaWxlIGZvciBlZGl0aW5nIGNoZWNrYm94Ci0gICAgICAgIG9wZW5GaWxlQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLSAgICAgICAgb3BlbkZpbGVDaGVja2JveC5zZXRUZXh0KE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiT3Blbl9maWxlX2Zvcl9lZGl0aW5nX3doZW5fZG9uZSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBvcGVuRmlsZUNoZWNrYm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQotICAgICAgICBzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmaWxlIHJlc291cmNlIGFzIHJlcXVlc3RlZCBieSB0aGUgdXNlci4gSWYgZXZlcnl0aGluZwotICAgICAqIGlzIE9LIHRoZW4gYW5zd2VyIHRydWUuIElmIG5vdCwgZmFsc2Ugd2lsbCBjYXVzZSB0aGUgZGlhbG9nCi0gICAgICogdG8gc3RheSBvcGVuLgotICAgICAqCi0gICAgICogQHJldHVybiB3aGV0aGVyIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsCi0gICAgICogQHNlZSBSZWFkbWVDcmVhdGlvbldpemFyZCNwZXJmb3JtRmluaXNoKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5pc2goKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSB0aGUgbmV3IGZpbGUgcmVzb3VyY2UKLSAgICAgICAgSUZpbGUgbmV3RmlsZSA9IGNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgICAgaWYgKG5ld0ZpbGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gaWUuLSBjcmVhdGlvbiB3YXMgdW5zdWNjZXNzZnVsCi0KLSAgICAgICAgLy8gU2luY2UgdGhlIGZpbGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgZmluZSwgb3BlbiBpdCBmb3IgZWRpdGluZwotICAgICAgICAvLyBpZiByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChvcGVuRmlsZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyBkd2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBkd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIElERS5vcGVuRWRpdG9yKHBhZ2UsIG5ld0ZpbGUsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBuYW1lQ291bnRlcisrOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogVGhlIDxjb2RlPlJlYWRtZUNyZWF0aW9uUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U8L2NvZGU+IG1ldGhvZCAKLSAgICAgKiBnZW5lcmF0ZXMgc2FtcGxlIGhlYWRpbmdzIGZvciBzZWN0aW9ucyBhbmQgc3Vic2VjdGlvbnMgaW4gdGhlCi0gICAgICogbmV3bHktY3JlYXRlZCBSZWFkbWUgZmlsZSBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGlvbnMgb2Ygc2VsZidzCi0gICAgICogY2hlY2tib3ggd2lkZ2V0cwotICAgICAqLwotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRJbml0aWFsQ29udGVudHMoKSB7Ci0gICAgICAgIGlmICghc2VjdGlvbkNoZWNrYm94LmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJTQU1QTEVfUkVBRE1FX0ZJTEUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2IuYXBwZW5kKE1lc3NhZ2VVdGlsLmdldFN0cmluZygiU0VDVElPTl8xIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNiLmFwcGVuZChNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlNFQ1RJT05fMV9CT0RZXzEiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpZiAoc3Vic2VjdGlvbkNoZWNrYm94LmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJTdWJzZWN0aW9uXzFfMSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc2IuYXBwZW5kKE1lc3NhZ2VVdGlsLmdldFN0cmluZygiU3Vic2VjdGlvbl8xXzFfQm9keV8xIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQoTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJTRUNUSU9OXzIiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2IuYXBwZW5kKE1lc3NhZ2VVdGlsLmdldFN0cmluZygiU0VDVElPTl8yX0JPRFlfMSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzYi5hcHBlbmQoTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJTRUNUSU9OXzJfQk9EWV8yIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgaWYgKHN1YnNlY3Rpb25DaGVja2JveC5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgc2IuYXBwZW5kKE1lc3NhZ2VVdGlsLmdldFN0cmluZygiU3Vic2VjdGlvbl8yXzEiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNiLmFwcGVuZChNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlN1YnNlY3Rpb25fMl8xX0JPRFlfMSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc2IuYXBwZW5kKE1lc3NhZ2VVdGlsLmdldFN0cmluZygiU3Vic2VjdGlvbl8yXzIiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNiLmFwcGVuZChNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlN1YnNlY3Rpb25fMl8yX0JPRFlfMSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzYi50b1N0cmluZygpLmdldEJ5dGVzKCkpOwotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdGaWxlTGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlJlYWRtZV9maWxlX25hbWUiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICBXaWRnZXQgc291cmNlID0gZS53aWRnZXQ7Ci0KLSAgICAgICAgaWYgKHNvdXJjZSA9PSBzZWN0aW9uQ2hlY2tib3gpIHsKLSAgICAgICAgICAgIGlmICghc2VjdGlvbkNoZWNrYm94LmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgICAgIHN1YnNlY3Rpb25DaGVja2JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgc3Vic2VjdGlvbkNoZWNrYm94LnNldEVuYWJsZWQoc2VjdGlvbkNoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLmhhbmRsZUV2ZW50KGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZUNyZWF0aW9uV2l6YXJkLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTM4YTM1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZUNyZWF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgcmVxdWlyZWQgYnkgdGhlIHdvcmtiZW5jaAotICogZm9yIGFsbCAnTmV3JyB3aXphcmRzLiAgVGhpcyB3aXphcmQgY3JlYXRlcyByZWFkbWUgZmlsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkbWVDcmVhdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotICAgIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotICAgIHByaXZhdGUgUmVhZG1lQ3JlYXRpb25QYWdlIG1haW5QYWdlOwotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV2l6YXJkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotICAgICAgICBtYWluUGFnZSA9IG5ldyBSZWFkbWVDcmVhdGlvblBhZ2Uod29ya2JlbmNoLCBzZWxlY3Rpb24pOwotICAgICAgICBhZGRQYWdlKG1haW5QYWdlKTsKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoV2l6YXJkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICAgICAgc2V0V2luZG93VGl0bGUoTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJOZXdfUmVhZG1lX0ZpbGUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoUmVhZG1lSW1hZ2VzLlJFQURNRV9XSVpBUkRfQkFOTkVSKTsKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIG1haW5QYWdlLmZpbmlzaCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZURyb3BBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lRHJvcEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzY1MzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lRHJvcEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklEcm9wQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogQWRhcHRlciBmb3IgaGFuZGxpbmcgdGhlIGRyb3BwaW5nIG9mIHJlYWRtZSBzZWdtZW50cyBpbnRvCi0gKiBhbm90aGVyIHBsdWdpbi4gIEluIHRoaXMgY2FzZSwgd2UgZXhwZWN0IHRoZSBzZWdtZW50cwotICogdG8gYmUgZHJvcHBlZCBvbnRvIDxjb2RlPklGaWxlPC9jb2RlPiBvYmplY3QsIG9yIGFuIGFkYXB0ZXIgCi0gKiB0aGF0IHN1cHBvcnRzIDxjb2RlPklGaWxlPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRtZURyb3BBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElEcm9wQWN0aW9uRGVsZWdhdGUgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZ19lY2xpcHNlX3VpX2V4YW1wbGVzX3JlYWRtZXRvb2xfZHJvcF9hY3Rpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURyb3BBY3Rpb25EZWxlZ2F0ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJ1bihPYmplY3Qgc291cmNlLCBPYmplY3QgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBieXRlW10gJiYgdGFyZ2V0IGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIHRhcmdldDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmlsZS5hcHBlbmRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oKGJ5dGVbXSkgc291cmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkV4Y2VwdGlvbl9pbl9yZWFkbWVfZHJvcF9hZGFwdGVyIikgKyBlLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lRWRpdG9yLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2NWJlZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgUmVhZG1lIGVkaXRvci4gIFNpbmNlIHRoZSByZWFkbWUKLSAqIGVkaXRvciBpcyBtb3N0bHkganVzdCBhIHRleHQgZWRpdG9yLCB0aGVyZSBpcyB2ZXJ5IGxpdHRsZQotICogaW1wbGVtZW50ZWQgaW4gdGhpcyBhY3R1YWwgY2xhc3MuICBJdCBjYW4gYmUgcmVnYXJkZWQgYXMKLSAqIHNpbXBseSBkZWNvcmF0aW5nIHRoZSB0ZXh0IGVkaXRvciB3aXRoIGEgY29udGVudCBvdXRsaW5lLgotICovCi1wdWJsaWMgY2xhc3MgUmVhZG1lRWRpdG9yIGV4dGVuZHMgVGV4dEVkaXRvciB7Ci0gICAgcHJvdGVjdGVkIFJlYWRtZUNvbnRlbnRPdXRsaW5lUGFnZSBwYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBSZWFkbWVFZGl0b3IuCi0gICAgICovCi0gICAgcHVibGljIFJlYWRtZUVkaXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9yUGFydAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgc3VwZXIuZG9TYXZlKG1vbml0b3IpOwotICAgICAgICBpZiAocGFnZSAhPSBudWxsKQotICAgICAgICAgICAgcGFnZS51cGRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWRhcHRhYmxlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgewotICAgICAgICBpZiAoa2V5LmVxdWFscyhJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzKSkgewotICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgICAgICBwYWdlID0gbmV3IFJlYWRtZUNvbnRlbnRPdXRsaW5lUGFnZSgoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBYnN0cmFjdFRleHRFZGl0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBlZGl0b3JDb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBwYXJlbnRNZW51KSB7Ci0gICAgICAgIHN1cGVyLmVkaXRvckNvbnRleHRNZW51QWJvdXRUb1Nob3cocGFyZW50TWVudSk7Ci0gICAgICAgIHBhcmVudE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIElNZW51TWFuYWdlciBzdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VVdGlsLmdldFN0cmluZygiQWRkIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHBhcmVudE1lbnUuYWRkKHN1Yk1lbnUpOwotICAgICAgICBpZiAoc3ViTWVudSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBBZGQgcmVhZG1lIGFjdGlvbnMgd2l0aCB2YXJpb3VzIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIE9iamVjdFtdW10gYXR0ID0gbmV3IE9iamVjdFtdW10geyB7IElSZWFkbWVDb25zdGFudHMuTUFSS0VSX0FUVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoMTIzNCkgfSB9OwotICAgICAgICAgICAgc3ViTWVudQotICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBBZGRSZWFkbWVNYXJrZXJBY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiQWRkX3JlYWRtZV9tYXJrZXJfYWN0aW9uX2xhYmVsIikgKyAiMSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiUmVhZG1lX21hcmtlcl9tZXNzYWdlX2V4YW1wbGUiKSArICIgaWQ9MTIzNCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgICAgIGF0dCA9IG5ldyBPYmplY3RbXVtdIHsgeyBJUmVhZG1lQ29uc3RhbnRzLk1BUktFUl9BVFRfTEVWRUwsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKDcpIH0gfTsKLSAgICAgICAgICAgIHN1Yk1lbnUKLSAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgQWRkUmVhZG1lTWFya2VyQWN0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkFkZF9yZWFkbWVfbWFya2VyX2FjdGlvbl9sYWJlbCIpICsgIjIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIlJlYWRtZV9tYXJrZXJfbWVzc2FnZV9leGFtcGxlIikgKyAiIGxldmVsPTciKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgICAgICBhdHQgPSBuZXcgT2JqZWN0W11bXSB7Ci0gICAgICAgICAgICAgICAgICAgIHsgSVJlYWRtZUNvbnN0YW50cy5NQVJLRVJfQVRUX0xFVkVMLCBuZXcgSW50ZWdlcig3KSB9LAotICAgICAgICAgICAgICAgICAgICB7IElSZWFkbWVDb25zdGFudHMuTUFSS0VSX0FUVF9ERVBULCAiaW5mcmEiIH0gfTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc3ViTWVudQotICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBBZGRSZWFkbWVNYXJrZXJBY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiQWRkX3JlYWRtZV9tYXJrZXJfYWN0aW9uX2xhYmVsIikgKyAiMyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiUmVhZG1lX21hcmtlcl9tZXNzYWdlX2V4YW1wbGUiKSArICIgbGV2ZWw9NywgZGVwYXJ0bWVudD1pbmZyYSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgICAgIGF0dCA9IG5ldyBPYmplY3RbXVtdIHsgeyBJUmVhZG1lQ29uc3RhbnRzLk1BUktFUl9BVFRfQ09ERSwgInJlZCIgfSB9OyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzdWJNZW51Ci0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IEFkZFJlYWRtZU1hcmtlckFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJBZGRfcmVhZG1lX21hcmtlcl9hY3Rpb25fbGFiZWwiKSArICI0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJSZWFkbWVfbWFya2VyX21lc3NhZ2VfZXhhbXBsZSIpICsgIiBjb2RlPXJlZCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgICAgIGF0dCA9IG5ldyBPYmplY3RbXVtdIHsgeyBJUmVhZG1lQ29uc3RhbnRzLk1BUktFUl9BVFRfTEFORywKLSAgICAgICAgICAgICAgICAgICAgImVuZ2xpc2giIH0gfTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc3ViTWVudQotICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBBZGRSZWFkbWVNYXJrZXJBY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiQWRkX3JlYWRtZV9tYXJrZXJfYWN0aW9uX2xhYmVsIikgKyAiNSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiUmVhZG1lX21hcmtlcl9tZXNzYWdlX2V4YW1wbGUiKSArICIgbGFuZ3VhZ2U9ZW5nbGlzaCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgICAgIGF0dCA9IG5ldyBPYmplY3RbXVtdIHsKLSAgICAgICAgICAgICAgICAgICAgeyBJUmVhZG1lQ29uc3RhbnRzLk1BUktFUl9BVFRfSUQsIG5ldyBJbnRlZ2VyKDEyMzQpIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgSVJlYWRtZUNvbnN0YW50cy5NQVJLRVJfQVRUX0xFVkVMLCBuZXcgSW50ZWdlcig3KSB9LAotICAgICAgICAgICAgICAgICAgICB7IElSZWFkbWVDb25zdGFudHMuTUFSS0VSX0FUVF9ERVBULCAiaW5mcmEiIH0sIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgeyBJUmVhZG1lQ29uc3RhbnRzLk1BUktFUl9BVFRfQ09ERSwgInJlZCIgfSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB7IElSZWFkbWVDb25zdGFudHMuTUFSS0VSX0FUVF9MQU5HLCAiZW5nbGlzaCIgfSB9OyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzdWJNZW51Ci0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IEFkZFJlYWRtZU1hcmtlckFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJBZGRfcmVhZG1lX21hcmtlcl9hY3Rpb25fbGFiZWwiKSArICI2IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJSZWFkbWVfbWFya2VyX21lc3NhZ2VfZXhhbXBsZSIpICsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpZD0xMjM0LCBsZXZlbD03LCBkZXBhcnRtZW50PWluZnJhLCBjb2RlPXJlZCwgbGFuZ3VhZ2U9ZW5nbGlzaCIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBhdHQgPSBuZXcgT2JqZWN0WzBdWzBdOwotICAgICAgICAgICAgc3ViTWVudQotICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBBZGRSZWFkbWVNYXJrZXJBY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiQWRkX3JlYWRtZV9tYXJrZXJfYWN0aW9uX2xhYmVsIikgKyAiNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiUmVhZG1lX21hcmtlcl9tZXNzYWdlX2V4YW1wbGUiKSArICIgTm8gYXR0cmlidXRlcyBzcGVjaWZpZWQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjNDY2YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuTGFiZWxSZXRhcmdldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlJldGFyZ2V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQmFzaWNUZXh0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZW1vbnN0cmF0ZXMgYWN0aW9uIGNvbnRyaWJ1dGlvbiBmb3IgdGhlIHJlYWRtZSBlZGl0b3IuCi0gKiBBIG51bWJlciBvZiBtZW51LCB0b29sYmFyLCBhbmQgc3RhdHVzIGxpbmUgY29udHJpYnV0aW9ucyBhcmUgZGVmaW5lZAotICogaW4gdGhlIHdvcmtiZW5jaCB3aW5kb3cuICBUaGVzZSBhY3Rpb25zIGFyZSBzaGFyZWQgYW1vbmcgYWxsIAotICogcmVhZG1lIGVkaXRvcnMsIGFuZCBhcmUgb25seSB2aXNpYmxlIHdoZW4gYSByZWFkbWUgZWRpdG9yIGlzIAotICogYWN0aXZlLiAgT3RoZXJ3aXNlLCB0aGV5IGFyZSBpbnZpc2libGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkbWVFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzCi0gICAgICAgIEJhc2ljVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIHsKLSAgICBwcml2YXRlIEVkaXRvckFjdGlvbiBhY3Rpb24xOwotCi0gICAgcHJpdmF0ZSBSZXRhcmdldEFjdGlvbiBhY3Rpb24yOwotCi0gICAgcHJpdmF0ZSBMYWJlbFJldGFyZ2V0QWN0aW9uIGFjdGlvbjM7Ci0KLSAgICBwcml2YXRlIEVkaXRvckFjdGlvbiBoYW5kbGVyMjsKLQotICAgIHByaXZhdGUgRWRpdG9yQWN0aW9uIGhhbmRsZXIzOwotCi0gICAgcHJpdmF0ZSBFZGl0b3JBY3Rpb24gaGFuZGxlcjQ7Ci0KLSAgICBwcml2YXRlIEVkaXRvckFjdGlvbiBoYW5kbGVyNTsKLQotICAgIHByaXZhdGUgRGlydHlTdGF0ZUNvbnRyaWJ1dGlvbiBkaXJ0eVN0YXRlQ29udHJpYnV0aW9uOwotCi0gICAgY2xhc3MgRWRpdG9yQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotICAgICAgICBwcml2YXRlIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcjsKLQotICAgICAgICBwdWJsaWMgRWRpdG9yQWN0aW9uKFN0cmluZyBsYWJlbCkgewotICAgICAgICAgICAgc3VwZXIobGFiZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2hlbGwoU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgICAgIHRoaXMuc2hlbGwgPSBzaGVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIFN0cmluZyBlZGl0b3JOYW1lID0gTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJFbXB0eV9FZGl0b3JfTmFtZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZWRpdG9yTmFtZSA9IGFjdGl2ZUVkaXRvci5nZXRUaXRsZSgpOwotICAgICAgICAgICAgTWVzc2FnZURpYWxvZwotICAgICAgICAgICAgICAgICAgICAub3BlbkluZm9ybWF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiUmVhZG1lX0VkaXRvciIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWFkbWVFZGl0b3JBY3Rpb25FeGVjdXRlZCIsIG5ldyBPYmplY3RbXSB7IGdldFRleHQoKSwgZWRpdG9yTmFtZSB9KSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KSB7Ci0gICAgICAgICAgICBhY3RpdmVFZGl0b3IgPSBwYXJ0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBSZWFkbWVFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVhZG1lRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0gICAgICAgIGFjdGlvbjEgPSBuZXcgRWRpdG9yQWN0aW9uKE1lc3NhZ2VVdGlsLmdldFN0cmluZygiRWRpdG9yX0FjdGlvbjEiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWN0aW9uMS5zZXRUb29sVGlwVGV4dChNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlJlYWRtZV9FZGl0b3JfQWN0aW9uMSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhY3Rpb24xCi0gICAgICAgICAgICAgICAgLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJlYWRtZUltYWdlcy5FRElUT1JfQUNUSU9OMV9JTUFHRV9ESVNBQkxFKTsKLSAgICAgICAgYWN0aW9uMS5zZXRJbWFnZURlc2NyaXB0b3IoUmVhZG1lSW1hZ2VzLkVESVRPUl9BQ1RJT04xX0lNQUdFX0VOQUJMRSk7Ci0gICAgICAgIGFjdGlvbjEuc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoUmVhZG1lSW1hZ2VzLkVESVRPUl9BQ1RJT04xX0lNQUdFKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhY3Rpb24xLCBJUmVhZG1lQ29uc3RhbnRzLkVESVRPUl9BQ1RJT04xX0NPTlRFWFQpOwotCi0gICAgICAgIGFjdGlvbjIgPSBuZXcgUmV0YXJnZXRBY3Rpb24oSVJlYWRtZUNvbnN0YW50cy5SRVRBUkdFVDIsIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiRWRpdG9yX0FjdGlvbjIiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWN0aW9uMi5zZXRUb29sVGlwVGV4dChNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlJlYWRtZV9FZGl0b3JfQWN0aW9uMiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhY3Rpb24yCi0gICAgICAgICAgICAgICAgLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJlYWRtZUltYWdlcy5FRElUT1JfQUNUSU9OMl9JTUFHRV9ESVNBQkxFKTsKLSAgICAgICAgYWN0aW9uMi5zZXRJbWFnZURlc2NyaXB0b3IoUmVhZG1lSW1hZ2VzLkVESVRPUl9BQ1RJT04yX0lNQUdFX0VOQUJMRSk7Ci0gICAgICAgIGFjdGlvbjIuc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoUmVhZG1lSW1hZ2VzLkVESVRPUl9BQ1RJT04yX0lNQUdFKTsKLQotICAgICAgICBhY3Rpb24zID0gbmV3IExhYmVsUmV0YXJnZXRBY3Rpb24oSVJlYWRtZUNvbnN0YW50cy5MQUJFTFJFVEFSR0VUMywKLSAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkVkaXRvcl9BY3Rpb24zIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFjdGlvbjMKLSAgICAgICAgICAgICAgICAuc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmVhZG1lSW1hZ2VzLkVESVRPUl9BQ1RJT04zX0lNQUdFX0RJU0FCTEUpOwotICAgICAgICBhY3Rpb24zLnNldEltYWdlRGVzY3JpcHRvcihSZWFkbWVJbWFnZXMuRURJVE9SX0FDVElPTjNfSU1BR0VfRU5BQkxFKTsKLSAgICAgICAgYWN0aW9uMy5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihSZWFkbWVJbWFnZXMuRURJVE9SX0FDVElPTjNfSU1BR0UpOwotCi0gICAgICAgIGhhbmRsZXIyID0gbmV3IEVkaXRvckFjdGlvbihNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkVkaXRvcl9BY3Rpb24yIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYWN0aW9uMiwgSVJlYWRtZUNvbnN0YW50cy5FRElUT1JfQUNUSU9OMl9DT05URVhUKTsKLQotICAgICAgICBoYW5kbGVyMyA9IG5ldyBFZGl0b3JBY3Rpb24oTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJFZGl0b3JfQWN0aW9uMyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBoYW5kbGVyMy5zZXRUb29sVGlwVGV4dChNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlJlYWRtZV9FZGl0b3JfQWN0aW9uMyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGFjdGlvbjMsIElSZWFkbWVDb25zdGFudHMuRURJVE9SX0FDVElPTjNfQ09OVEVYVCk7Ci0KLSAgICAgICAgaGFuZGxlcjQgPSBuZXcgRWRpdG9yQWN0aW9uKE1lc3NhZ2VVdGlsLmdldFN0cmluZygiRWRpdG9yX0FjdGlvbjQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaGFuZGxlcjUgPSBuZXcgRWRpdG9yQWN0aW9uKE1lc3NhZ2VVdGlsLmdldFN0cmluZygiRWRpdG9yX0FjdGlvbjUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaGFuZGxlcjUuc2V0VG9vbFRpcFRleHQoTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJSZWFkbWVfRWRpdG9yX0FjdGlvbjUiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBkaXJ0eVN0YXRlQ29udHJpYnV0aW9uID0gbmV3IERpcnR5U3RhdGVDb250cmlidXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0gICAgICAgIC8vIFJ1biBzdXBlci4KLSAgICAgICAgc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7Ci0KLSAgICAgICAgLy8gRWRpdG9yLXNwZWNpdGljIG1lbnUKLSAgICAgICAgTWVudU1hbmFnZXIgcmVhZG1lTWVudSA9IG5ldyBNZW51TWFuYWdlcihNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIlJlYWRtZV9NZW51IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8vIEl0IGlzIGltcG9ydGFudCB0byBhcHBlbmQgdGhlIG1lbnUgdG8gdGhlCi0gICAgICAgIC8vIGdyb3VwICJhZGRpdGlvbnMiLiBUaGlzIGdyb3VwIGlzIGNyZWF0ZWQKLSAgICAgICAgLy8gYmV0d2VlbiAiUHJvamVjdCIgYW5kICJUb29scyIgbWVudXMKLSAgICAgICAgLy8gZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgICAgbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHJlYWRtZU1lbnUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJlYWRtZU1lbnUuYWRkKGFjdGlvbjEpOwotICAgICAgICByZWFkbWVNZW51LmFkZChhY3Rpb24yKTsKLSAgICAgICAgcmVhZG1lTWVudS5hZGQoYWN0aW9uMyk7Ci0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgewotICAgICAgICAvLyBSdW4gc3VwZXIuCi0gICAgICAgIHN1cGVyLmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoc3RhdHVzTGluZU1hbmFnZXIpOwotICAgICAgICAvLyBUZXN0IHN0YXR1cyBsaW5lLgkKLSAgICAgICAgc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkVkaXRvcl9pc19hY3RpdmUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc3RhdHVzTGluZU1hbmFnZXIuYWRkKGRpcnR5U3RhdGVDb250cmlidXRpb24pOwotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLSAgICAgICAgLy8gUnVuIHN1cGVyLgotICAgICAgICBzdXBlci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotICAgICAgICAvLyBBZGQgdG9vbGJhciBzdHVmZi4KLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoIlJlYWRtZUVkaXRvciIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQoYWN0aW9uMSk7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChhY3Rpb24yKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKGFjdGlvbjMpOwotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIFJlbW92ZSByZXRhcmdldCBhY3Rpb25zIGFzIHBhZ2UgbGlzdGVuZXJzCi0gICAgICAgIGdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIoYWN0aW9uMik7Ci0gICAgICAgIGdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIoYWN0aW9uMyk7Ci0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzLCBJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0gICAgICAgIHN1cGVyLmluaXQoYmFycywgcGFnZSk7Ci0gICAgICAgIGJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJUmVhZG1lQ29uc3RhbnRzLlJFVEFSR0VUMiwgaGFuZGxlcjIpOwotICAgICAgICBiYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVJlYWRtZUNvbnN0YW50cy5MQUJFTFJFVEFSR0VUMywgaGFuZGxlcjMpOwotICAgICAgICBiYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVJlYWRtZUNvbnN0YW50cy5BQ1RJT05fU0VUX1JFVEFSR0VUNCwKLSAgICAgICAgICAgICAgICBoYW5kbGVyNCk7Ci0gICAgICAgIGJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJUmVhZG1lQ29uc3RhbnRzLkFDVElPTl9TRVRfTEFCRUxSRVRBUkdFVDUsCi0gICAgICAgICAgICAgICAgaGFuZGxlcjUpOwotCi0gICAgICAgIC8vIEhvb2sgcmV0YXJnZXQgYWN0aW9ucyBhcyBwYWdlIGxpc3RlbmVycwotICAgICAgICBwYWdlLmFkZFBhcnRMaXN0ZW5lcihhY3Rpb24yKTsKLSAgICAgICAgcGFnZS5hZGRQYXJ0TGlzdGVuZXIoYWN0aW9uMyk7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKLSAgICAgICAgaWYgKGFjdGl2ZVBhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWN0aW9uMi5wYXJ0QWN0aXZhdGVkKGFjdGl2ZVBhcnQpOwotICAgICAgICAgICAgYWN0aW9uMy5wYXJ0QWN0aXZhdGVkKGFjdGl2ZVBhcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGVkaXRvcikgewotICAgICAgICAvLyBSdW4gc3VwZXIuCi0gICAgICAgIHN1cGVyLnNldEFjdGl2ZUVkaXRvcihlZGl0b3IpOwotCi0gICAgICAgIC8vIFRhcmdldCBzaGFyZWQgYWN0aW9ucyB0byBuZXcgZWRpdG9yCi0gICAgICAgIGFjdGlvbjEuc2V0QWN0aXZlRWRpdG9yKGVkaXRvcik7Ci0gICAgICAgIGhhbmRsZXIyLnNldEFjdGl2ZUVkaXRvcihlZGl0b3IpOwotICAgICAgICBoYW5kbGVyMy5zZXRBY3RpdmVFZGl0b3IoZWRpdG9yKTsKLSAgICAgICAgaGFuZGxlcjQuc2V0QWN0aXZlRWRpdG9yKGVkaXRvcik7Ci0gICAgICAgIGhhbmRsZXI1LnNldEFjdGl2ZUVkaXRvcihlZGl0b3IpOwotICAgICAgICBkaXJ0eVN0YXRlQ29udHJpYnV0aW9uLmVkaXRvckNoYW5nZWQoZWRpdG9yKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVGaWxlUHJvcGVydHlQYWdlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVGaWxlUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkY2UxMGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lRmlsZVByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBUaGlzIHBhZ2Ugd2lsbCBiZSBhZGRlZCB0byB0aGUgcHJvcGVydHkgcGFnZSBkaWFsb2cKLSAqIHdoZW4gdGhlICJQcm9wZXJ0aWVzLi4uIiBwb3B1cCBtZW51IGl0ZW0gaXMgc2VsZWN0ZWQKLSAqIGZvciBSZWFkbWUgZmlsZXMuIAotICovCi1wdWJsaWMgY2xhc3MgUmVhZG1lRmlsZVByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgY29tcG9zaXRlIGFuZAotICAgICAqIHNldHMgdXAgaXRzIGxheW91dCBkYXRhLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBvZiB0aGUgY29tcG9zaXRlCi0gICAgICogQHBhcmFtIG51bUNvbHVtbnMgIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbmV3IGNvbXBvc2l0ZQotICAgICAqIEByZXR1cm4gdGhlIG5ld2x5LWNyZWF0ZWQgY29tcG9zaXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIC8vIGVuc3VyZSB0aGUgcGFnZSBoYXMgbm8gc3BlY2lhbCBidXR0b25zCi0gICAgICAgIG5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0gICAgICAgIENvbXBvc2l0ZSBwYW5lbCA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIpOwotCi0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLAotCQkJCUlSZWFkbWVDb25zdGFudHMuUFJPUEVSVFlfUEFHRV9DT05URVhUKTsKLQotICAgICAgICAvLyBsYXlvdXQgdGhlIHBhZ2UKLQotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBnZXRFbGVtZW50KCk7Ci0gICAgICAgIElTdGF0dXMgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotICAgICAgICAgICAgTGFiZWwgbCA9IGNyZWF0ZUxhYmVsKHBhbmVsLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkZpbGVfbmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbCA9IGNyZWF0ZUxhYmVsKHBhbmVsLCByZXNvdXJjZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgZ3JhYkV4Y2Vzc1NwYWNlKGwpOwotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgY3JlYXRlTGFiZWwocGFuZWwsIE1lc3NhZ2VVdGlsLmdldFN0cmluZygiUGF0aCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbCA9IGNyZWF0ZUxhYmVsKHBhbmVsLCByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnNldERldmljZShudWxsKQotICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBncmFiRXhjZXNzU3BhY2UobCk7Ci0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBjcmVhdGVMYWJlbChwYW5lbCwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJTaXplIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBjb250ZW50U3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaWxlLmlzTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8pKQotICAgICAgICAgICAgICAgICAgICBsID0gY3JlYXRlTGFiZWwocGFuZWwsIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiPGZpbGVfY29udGVudHNfbm90X2xvY2FsPiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtID0gZmlsZS5nZXRDb250ZW50cygpOwotICAgICAgICAgICAgICAgICAgICBSZWFkZXIgaW4gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29udGVudFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaHVua1NpemUgPSBjb250ZW50U3RyZWFtLmF2YWlsYWJsZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihjaHVua1NpemUpOwotICAgICAgICAgICAgICAgICAgICBjaGFyW10gcmVhZEJ1ZmZlciA9IG5ldyBjaGFyW2NodW5rU2l6ZV07Ci0gICAgICAgICAgICAgICAgICAgIGludCBuID0gaW4ucmVhZChyZWFkQnVmZmVyKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAobiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocmVhZEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuID0gaW4ucmVhZChyZWFkQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbCA9IGNyZWF0ZUxhYmVsKHBhbmVsLCBJbnRlZ2VyLnRvU3RyaW5nKGJ1ZmZlci5sZW5ndGgoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGUuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSByZXN1bHQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGwgPSBjcmVhdGVMYWJlbChwYW5lbCwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCI8VW5rbm93bj4iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGwgPSBjcmVhdGVMYWJlbChwYW5lbCwgbWVzc2FnZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbCA9IGNyZWF0ZUxhYmVsKHBhbmVsLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIjxVbmtub3duPiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdyYWJFeGNlc3NTcGFjZShsKTsKLSAgICAgICAgICAgIGNyZWF0ZUxhYmVsKHBhbmVsLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIk51bWJlcl9vZl9zZWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgLy8gV2Ugd2lsbCBnZXQgdGhlIHNlY3Rpb25zIHByb3BlcnR5IGFuZCBzaW1wbHkKLSAgICAgICAgICAgIC8vIHJlcG9ydCBudW1iZXIgb2YgZWxlbWVudHMgZm91bmQuCi0gICAgICAgICAgICBJQWRhcHRhYmxlIHNlY3Rpb25zID0gZ2V0U2VjdGlvbnMocmVzb3VyY2UpOwotICAgICAgICAgICAgaWYgKHNlY3Rpb25zIGluc3RhbmNlb2YgQWRhcHRhYmxlTGlzdCkgewotICAgICAgICAgICAgICAgIEFkYXB0YWJsZUxpc3QgbGlzdCA9IChBZGFwdGFibGVMaXN0KSBzZWN0aW9uczsKLSAgICAgICAgICAgICAgICBsID0gY3JlYXRlTGFiZWwocGFuZWwsIFN0cmluZy52YWx1ZU9mKGxpc3Quc2l6ZSgpKSk7Ci0gICAgICAgICAgICAgICAgZ3JhYkV4Y2Vzc1NwYWNlKGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgTGFiZWwgbCA9IGNyZWF0ZUxhYmVsKHBhbmVsLCBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkFkZGl0aW9uYWxfaW5mb3JtYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZ3JhYkV4Y2Vzc1NwYWNlKGwpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgbC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgcmV0dXJuIG5ldyBDYW52YXMocGFuZWwsIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBsYWJlbCBhbmQgc2V0cyB1cCBpdHMgbGF5b3V0IGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IG9mIHRoZSBsYWJlbAotICAgICAqIEBwYXJhbSB0ZXh0ICB0aGUgdGV4dCBvZiB0aGUgbGFiZWwKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIGxhYmVsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KHRleHQpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHJldHVybiBsYWJlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWFkbWUgc2VjdGlvbnMgZm9yIHRoaXMgcmVzb3VyY2UsIG9yIG51bGwKLSAgICAgKiBpZiBub3QgYXBwbGljYWJsZSAocmVzb3VyY2UgaXMgbm90IGEgcmVhZG1lIGZpbGUpLgotICAgICAqLwotICAgIHByaXZhdGUgQWRhcHRhYmxlTGlzdCBnZXRTZWN0aW9ucyhJQWRhcHRhYmxlIGFkYXB0YWJsZSkgewotICAgICAgICBpZiAoYWRhcHRhYmxlIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICAgICAgICByZXR1cm4gUmVhZG1lTW9kZWxGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U2VjdGlvbnMoCi0gICAgICAgICAgICAgICAgICAgIChJRmlsZSkgYWRhcHRhYmxlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIGNvbnRyb2wgdG8gZ3JhYiBhbnkgZXhjZXNzIGhvcml6b250YWwgc3BhY2UKLSAgICAgKiBsZWZ0IGluIHRoZSB3aW5kb3cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udHJvbCAgdGhlIGNvbnRyb2wgZm9yIHdoaWNoIHRvIGdyYWIgZXhjZXNzIHNwYWNlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdyYWJFeGNlc3NTcGFjZShDb250cm9sIGNvbnRyb2wpIHsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSAoR3JpZERhdGEpIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICBpZiAoZ2QgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbyAtIHJlYWQtb25seSBwYWdlCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZUZpbGVQcm9wZXJ0eVBhZ2UyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVGaWxlUHJvcGVydHlQYWdlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTEwMWNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZUZpbGVQcm9wZXJ0eVBhZ2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2w7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotCi0vKioKLSAqIFRoaXMgcGFnZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwcm9wZXJ0eSBwYWdlIGRpYWxvZwotICogd2hlbiAiUHJvcGVydGllcy4uLiIgcG9wdXAgbWVudSBpdGVtIGlzIHNlbGVjdGVkCi0gKiBmb3IgUmVhZG1lIGZpbGVzLiAKLSAqCi0gKiBUaGlzIHBhZ2UgZGVtb25zdHJhdGVzIGNvbmRpdGlvbmFsIHByb3BlcnR5IHBhZ2VzIHdoaWNoIGxvb2sKLSAqIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBlbGVtZW50LiBJbiB0aGlzIGV4YW1wbGUsCi0gKiB0aGUgYXJiaXRyYXJ5IGNvbmRpdGlvbiBjaG9zZW4gaXMgd2hldGhlciB0aGUgUmVhZG1lIGZpbGUgaXMKLSAqIGdyZWF0ZXIgdGhhbiAyNTYgYnl0ZXMgaW4gbGVuZ3RoLiBJZiBpdCBpcyBzbWFsbGVyIHRoYW4gMjU2IGJ5dGVzCi0gKiBpbiBsZW5ndGgsIHRoaXMgd2lsbCBiZSBhIHBsYWNlaG9sZGVyIHBhZ2UgY29udGFpbmluZyAKLSAqIGEgc2ltcGxlIG1lc3NhZ2UuIElmIGl0IGlzIDI1NiBieXRlcyBvciBsYXJnZXIsIGFkZGl0aW9uYWwgCi0gKiBpbmZvcm1hdGlvbiB3aWxsIGJlIHByb3ZpZGVkLiBUaGlzIGluZm9ybWF0aW9uIGlzIGRldGVybWluZWQgYXQKLSAqIHJ1bnRpbWUuCi0gKgotICogVGhpcyBjbGFzcyBtYXkgYmUgcmV1c2VkIHRvIGltcGxlbWVudCBhIGNvbmRpdGlvbmFsIHByb3BlcnR5IHBhZ2UuCi0gKiBUaGUgZ2V0UGFnZUluZGV4KCkgbWV0aG9kIHRlc3RzIHRoZSBjb25kaXRpb24gYW5kIHJldHVybnMgdGhlCi0gKiBpbmRleCBvZiB0aGUgcGFnZSB0byBjcmVhdGUuIFRoZSBjcmVhdGVQYWdlKigpIG1ldGhvZHMgYXJlIGNhbGxlZAotICogdXBvbiB0byBjcmVhdGUgdGhlIGFjdHVhbCBwYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRtZUZpbGVQcm9wZXJ0eVBhZ2UyIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBjb21wb3NpdGUgYW5kCi0gICAgICogc2V0cyB1cCBpdHMgbGF5b3V0IGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IG9mIHRoZSBjb21wb3NpdGUKLSAgICAgKiBAcGFyYW0gbnVtQ29sdW1ucyAgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBuZXcgY29tcG9zaXRlCi0gICAgICogQHJldHVybiB0aGUgbmV3bHktY3JlYXRlZCBjb21wb3NpdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIGVuc3VyZSB0aGUgcGFnZSBoYXMgbm8gc3BlY2lhbCBidXR0b25zCi0gICAgICAgIG5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0gICAgICAgIENvbXBvc2l0ZSBwYW5lbCA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIpOwotCi0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLAotCQkJCUlSZWFkbWVDb25zdGFudHMuUFJPUEVSVFlfUEFHRTJfQ09OVEVYVCk7Ci0KLSAgICAgICAgLy8gbGF5b3V0IHRoZSBwYWdlCi0gICAgICAgIGludCBwYWdlID0gZ2V0UGFnZUluZGV4KCk7Ci0gICAgICAgIHN3aXRjaCAocGFnZSkgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBjcmVhdGVQYWdlT25lKHBhbmVsKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBjcmVhdGVQYWdlVHdvKHBhbmVsKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQ2FudmFzKHBhbmVsLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgbGFiZWwgYW5kIHNldHMgdXAKLSAgICAgKiBpdHMgbGF5b3V0IGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IG9mIHRoZSBsYWJlbAotICAgICAqIEBwYXJhbSB0ZXh0ICB0aGUgdGV4dCBvZiB0aGUgbGFiZWwKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIGxhYmVsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KHRleHQpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHJldHVybiBsYWJlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBwYWdlLiBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgcGFnZSB3aGljaAotICAgICAqIG5vdGlmaWVkIHRoZSB1c2VyIHRoYXQgdGhlIHBhZ2UgaXMgbm90IGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYW5lbCAgdGhlIHBhbmVsIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgcGFnZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhZ2VPbmUoQ29tcG9zaXRlIHBhbmVsKSB7Ci0gICAgICAgIExhYmVsIGwgPSBjcmVhdGVMYWJlbChwYW5lbCwgTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJBZGRpdGlvbmFsX1JlYWRtZV9wcm9wZXJ0aWVzX25vdF9hdmFpbGFibGUuIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEdyaWREYXRhIGdkID0gKEdyaWREYXRhKSBsLmdldExheW91dERhdGEoKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgbCA9IGNyZWF0ZUxhYmVsKAotICAgICAgICAgICAgICAgIHBhbmVsLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJUaGlzX2lsbHVzdHJhdGVzX2FfcHJvcGVydHlfcGFnZV90aGF0X2lzX2R5bmFtaWNhbGx5X2RldGVybWluZWQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZ2QgPSAoR3JpZERhdGEpIGwuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBsID0gY3JlYXRlTGFiZWwoCi0gICAgICAgICAgICAgICAgcGFuZWwsCi0gICAgICAgICAgICAgICAgTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIm5vdF90b19iZV9hdmFpbGFibGVfYmFzZWRfb25fdGhlX3N0YXRlX29mX3RoZV9vYmplY3QuIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGdkID0gKEdyaWREYXRhKSBsLmdldExheW91dERhdGEoKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBzZWNvbmQgdmVyc2lvbiBvZiB0aGUgcGFnZS4gVGhpcyBwYWdlIG1pZ2h0IGNvbnRhaW4gbW9yZSBpbmZvcm1hdGlvbgotICAgICAqIGFib3V0IHRoZSBmaWxlIG9yIG90aGVyIGluZm9ybWF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhbmVsICB0aGUgcGFuZWwgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBwYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFnZVR3byhDb21wb3NpdGUgcGFuZWwpIHsKLSAgICAgICAgTGFiZWwgbCA9IGNyZWF0ZUxhYmVsKAotICAgICAgICAgICAgICAgIHBhbmVsLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJUaGVfc2l6ZV9vZl90aGVfUmVhZG1lX2ZpbGVfaXNfYXRfbGVhc3RfMjU2X2J5dGVzLiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgbC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIGwgPSBjcmVhdGVMYWJlbCgKLSAgICAgICAgICAgICAgICBwYW5lbCwKLSAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiSGFkX2l0X2JlZW5fbGVzc190aGFuXzI1Nl9ieXRlc190aGlzX3BhZ2Vfd291bGRfYmVfYV9wbGFjZWhvbGRlcl9wYWdlLiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBnZCA9IChHcmlkRGF0YSkgbC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIGwgPSBjcmVhdGVMYWJlbChwYW5lbCwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJBZGRpdGlvbmFsX2luZm9ybWF0aW9uIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGdkID0gKEdyaWREYXRhKSBsLmdldExheW91dERhdGEoKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgbCA9IGNyZWF0ZUxhYmVsKAotICAgICAgICAgICAgICAgIHBhbmVsLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJUaGlzX2lsbHVzdHJhdGVzX2FfcHJvcGVydHlfcGFnZV90aGF0X2lzX2R5bmFtaWNhbGx5X2RldGVybWluZWQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZ2QgPSAoR3JpZERhdGEpIGwuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBsID0gY3JlYXRlTGFiZWwocGFuZWwsIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygidG9fYmVfYXZhaWxhYmxlX2Jhc2VkX29uX3RoZV9zdGF0ZV9vZl90aGVfb2JqZWN0LiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBnZCA9IChHcmlkRGF0YSkgbC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGljaCBwYWdlIHRvIGRpc3BsYXkuIFRoaXMgaW1wbGVtZW50YXRpb24KLSAgICAgKiBhbnN3ZXJzIDEgaWYgdGhlIHNpemUgb2YgdGhlIFJlYWRtZSBmaWxlIGlzIGxlc3MgdGhhbiAyNTYgYnl0ZXMKLSAgICAgKiBhbmQgMiBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgcGFnZSB0byBkaXNwbGF5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRQYWdlSW5kZXgoKSB7Ci0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBjb250ZW50U3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSAwOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQotICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIFJlYWRlciBpbiA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjb250ZW50U3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNodW5rU2l6ZSA9IGNvbnRlbnRTdHJlYW0uYXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGNodW5rU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbY2h1bmtTaXplXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChuID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBidWZmZXIubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gMDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGVuZ3RoIDwgMjU2KQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gLSByZWFkLW9ubHkgcGFnZQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVJbWFnZXMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZUltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2MzNTI0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZUltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEpvZSBCb3diZWVyIChqb3phcnRAYmxhcmcubmV0KSAtIHJlbW92ZWQgZGVwZW5kZW5jeSBvbiBydW50aW1lIGNvbXBhdGliaWxpdHkgbGF5ZXIgKGJ1ZyA3NDUyNikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBjbGFzcyBmb3Igc3RvcmluZyByZWZlcmVuY2VzIHRvIGltYWdlIGRlc2NyaXB0b3JzCi0gKiB1c2VkIGJ5IHRoZSByZWFkbWUgdG9vbC4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRtZUltYWdlcyB7Ci0gICAgc3RhdGljIGZpbmFsIFVSTCBCQVNFX1VSTCA9IFJlYWRtZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBFRElUT1JfQUNUSU9OMV9JTUFHRTsKLQotICAgIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRURJVE9SX0FDVElPTjJfSU1BR0U7Ci0KLSAgICBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIEVESVRPUl9BQ1RJT04zX0lNQUdFOwotCi0gICAgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBFRElUT1JfQUNUSU9OMV9JTUFHRV9ESVNBQkxFOwotCi0gICAgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBFRElUT1JfQUNUSU9OMl9JTUFHRV9ESVNBQkxFOwotCi0gICAgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBFRElUT1JfQUNUSU9OM19JTUFHRV9ESVNBQkxFOwotCi0gICAgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBFRElUT1JfQUNUSU9OMV9JTUFHRV9FTkFCTEU7Ci0KLSAgICBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIEVESVRPUl9BQ1RJT04yX0lNQUdFX0VOQUJMRTsKLQotICAgIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRURJVE9SX0FDVElPTjNfSU1BR0VfRU5BQkxFOwotCi0gICAgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBSRUFETUVfV0laQVJEX0JBTk5FUjsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFN0cmluZyBpY29uUGF0aCA9ICJpY29ucy8iOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IGljb25QYXRoICsgImN0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBFRElUT1JfQUNUSU9OMV9JTUFHRSA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihwcmVmaXggKyAiYWN0aW9uMS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBFRElUT1JfQUNUSU9OMl9JTUFHRSA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihwcmVmaXggKyAiYWN0aW9uMi5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBFRElUT1JfQUNUSU9OM19JTUFHRSA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihwcmVmaXggKyAiYWN0aW9uMy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHByZWZpeCA9IGljb25QYXRoICsgImR0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBFRElUT1JfQUNUSU9OMV9JTUFHRV9ESVNBQkxFID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHByZWZpeAotICAgICAgICAgICAgICAgICsgImFjdGlvbjEuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgRURJVE9SX0FDVElPTjJfSU1BR0VfRElTQUJMRSA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihwcmVmaXgKLSAgICAgICAgICAgICAgICArICJhY3Rpb24yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEVESVRPUl9BQ1RJT04zX0lNQUdFX0RJU0FCTEUgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocHJlZml4Ci0gICAgICAgICAgICAgICAgKyAiYWN0aW9uMy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHByZWZpeCA9IGljb25QYXRoICsgImV0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBFRElUT1JfQUNUSU9OMV9JTUFHRV9FTkFCTEUgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocHJlZml4Ci0gICAgICAgICAgICAgICAgKyAiYWN0aW9uMS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBFRElUT1JfQUNUSU9OMl9JTUFHRV9FTkFCTEUgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocHJlZml4Ci0gICAgICAgICAgICAgICAgKyAiYWN0aW9uMi5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBFRElUT1JfQUNUSU9OM19JTUFHRV9FTkFCTEUgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocHJlZml4Ci0gICAgICAgICAgICAgICAgKyAiYWN0aW9uMy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHByZWZpeCA9IGljb25QYXRoICsgIndpemJhbi8iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFJFQURNRV9XSVpBUkRfQkFOTkVSID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHByZWZpeAotICAgICAgICAgICAgICAgICsgIm5ld3JlYWRtZV93aXouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBjcmVhdGUgYW4gPGNvZGU+SW1hZ2VEZXNjcmlwdG9yPC9jb2RlPgotICAgICAqIGZyb20gYSBwYXRoIHRvIGEgZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChCQVNFX1VSTCwgcGF0aCk7Ci0gICAgICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZWIwNDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IyOwotCi0vKioKLSAqIENyZWF0ZXMgcmVzb2x1dGlvbnMgZm9yIHJlYWRtZSBtYXJrZXJzLgotICovCi1wdWJsaWMgY2xhc3MgUmVhZG1lTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciBpbXBsZW1lbnRzCi0gICAgICAgIElNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yMiB7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBJTWFya2VyUmVzb2x1dGlvbltdIGdldFJlc29sdXRpb25zKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7IG5ldyBBZGRTZW50ZW5jZVJlc29sdXRpb24oKSB9OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1Jlc29sdXRpb25zKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lTW9kZWxGYWN0b3J5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVNb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjN2ExZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSm9lIEJvd2JlZXIgKGpvemFydEBibGFyZy5uZXQpIC0gcmVtb3ZlZCBkZXBlbmRlbmN5IG9uIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBsYXllciAoYnVnIDc0NTI2KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0vKioKLSAqIENyZWF0ZXMgdGhlIHNlY3Rpb25zIHVzZWQgaW4gdGhlIDxjb2RlPkNvbnRlbnRPdXRsaW5lPC9jb2RlPgotICoKLSAqIEBzZWUgUmVhZG1lQ29udGVudE91dGxpbmVQYWdlI2dldENvbnRlbnRPdXRsaW5lKElBZGFwdGFibGUpCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkbWVNb2RlbEZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIFJlYWRtZU1vZGVsRmFjdG9yeSBpbnN0YW5jZSA9IG5ldyBSZWFkbWVNb2RlbEZhY3RvcnkoKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiByZWdpc3RyeUxvYWRlZCA9IGZhbHNlOwotCi0gICAgSVJlYWRtZUZpbGVQYXJzZXIgcGFyc2VyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgUmVhZG1lTW9kZWxGYWN0b3J5LgotICAgICAqLwotICAgIHByaXZhdGUgUmVhZG1lTW9kZWxGYWN0b3J5KCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbGwgbWFyayBlbGVtZW50cyB0byB0aGUgbGlzdCBmb3IgdGhlIHN1YnRyZWUgcm9vdGVkCi0gICAgICogYXQgdGhlIGdpdmVuIG1hcmsgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTZWN0aW9ucyhBZGFwdGFibGVMaXN0IGxpc3QsIE1hcmtFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgbGlzdC5hZGQoZWxlbWVudCk7Ci0gICAgICAgIE9iamVjdFtdIGNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZHJlbihlbGVtZW50KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgYWRkU2VjdGlvbnMobGlzdCwgKE1hcmtFbGVtZW50KSBjaGlsZHJlbltpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IG91dGxpbmUgZm9yIHRoZSBnaXZlbiBSZWFkbWUgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGFibGUgIHRoZSBlbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gdGhlIGNvbnRlbnQgb3V0bGluZQotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb3V0bGluZSBmb3IgdGhlIGFyZ3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIEFkYXB0YWJsZUxpc3QgZ2V0Q29udGVudE91dGxpbmUoSUFkYXB0YWJsZSBhZGFwdGFibGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBZGFwdGFibGVMaXN0KGdldFRvYygoSUZpbGUpIGFkYXB0YWJsZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiByZWFkbWUgYWRhcHRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlYWRtZU1vZGVsRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBzZWN0aW9ucyBpbiB0aGlzIHJlYWRtZSBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgIHRoZSBmaWxlIGZvciB3aGljaCB0byByZXR1cm4gc2VjdGlvbiBoZWFkaW5nIGFuZCBzdWJoZWFkaW5ncwotICAgICAqIEByZXR1cm4gQSBsaXN0IGNvbnRhaW5pbmcgaGVhZGluZ3MgYW5kIHN1YmhlYWRpbmdzCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0YWJsZUxpc3QgZ2V0U2VjdGlvbnMoSUZpbGUgZmlsZSkgewotICAgICAgICBNYXJrRWxlbWVudFtdIHRvcExldmVsID0gZ2V0VG9jKGZpbGUpOwotICAgICAgICBBZGFwdGFibGVMaXN0IGxpc3QgPSBuZXcgQWRhcHRhYmxlTGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvcExldmVsLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRTZWN0aW9ucyhsaXN0LCB0b3BMZXZlbFtpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kLiAgTG9va3MgZm9yIGEgcmVhZG1lIGZpbGUgaW4gdGhlIHNlbGVjdGlvbiwKLSAgICAgKiBhbmQgaWYgb25lIGlzIGZvdW5kLCByZXR1cm5zIHRoZSBzZWN0aW9ucyBmb3IgaXQuICBSZXR1cm5zIG51bGwKLSAgICAgKiBpZiB0aGVyZSBpcyBubyByZWFkbWUgZmlsZSBpbiB0aGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGFibGVMaXN0IGdldFNlY3Rpb25zKElTZWxlY3Rpb24gc2VsKSB7Ci0gICAgICAgIC8vIElmIHNlbCBpcyBub3QgYSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBqdXN0IHJldHVybi4KLSAgICAgICAgaWYgKCEoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKLQotICAgICAgICAvL2lmIHRoZSBzZWxlY3Rpb24gaXMgYSByZWFkbWUgZmlsZSwgZ2V0IGl0cyBzZWN0aW9ucy4KLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IHN0cnVjdHVyZWQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgb2JqZWN0OwotICAgICAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGV4dGVuc2lvbi5lcXVhbHMoSVJlYWRtZUNvbnN0YW50cy5FWFRFTlNJT04pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNlY3Rpb25zKGZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy90aGUgc2VsZWN0ZWQgb2JqZWN0IGlzIG5vdCBhIHJlYWRtZSBmaWxlCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgY29udGVudHMgb2YgdGhlIFJlYWRtZSBmaWxlIGJ5IGxvb2tpbmcgZm9yIGxpbmVzIAotICAgICAqIHRoYXQgc3RhcnQgd2l0aCBhIG51bWJlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlICB0aGUgZmlsZSByZXByZXNlbnRpbmcgdGhlIFJlYWRtZSBmaWxlCi0gICAgICogQHJldHVybiBhbiBlbGVtZW50IGNvbGxlY3Rpb24gcmVwcmVzZW50aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cwotICAgICAqLwotICAgIHByaXZhdGUgTWFya0VsZW1lbnRbXSBnZXRUb2MoSUZpbGUgZmlsZSkgewotICAgICAgICBpZiAocmVnaXN0cnlMb2FkZWQgPT0gZmFsc2UpCi0gICAgICAgICAgICBsb2FkUGFyc2VyKCk7Ci0gICAgICAgIHJldHVybiBwYXJzZXIucGFyc2UoZmlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIHBhcnNlciBmcm9tIHRoZSByZWdpc3RyeSBieSBzZWFyY2hpbmcgZm9yCi0gICAgICogZXh0ZW5zaW9ucyB0aGF0IHNhdGlzZnkgb3VyIHB1Ymxpc2hlZCBleHRlbnNpb24gcG9pbnQuCi0gICAgICogRm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHksIHdlIHdpbGwgcGljayB0aGUgbGFzdCBleHRlbnNpb24sCi0gICAgICogYWxsb3dpbmcgdG9vbHMgdG8gb3ZlcnJpZGUgd2hhdCBpcyB1c2VkLiBJbiBhIG1vcmUKLSAgICAgKiBlbGFib3JhdGUgdG9vbCwgYWxsIHRoZSBleHRlbnNpb25zIHdvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZFBhcnNlcigpIHsKLSAgICAgICAgSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgKLSAgICAgICAgICAgICAgICBJUmVhZG1lQ29uc3RhbnRzLlBMVUdJTl9JRCwgSVJlYWRtZUNvbnN0YW50cy5QUF9TRUNUSU9OX1BBUlNFUik7Ci0gICAgICAgIGlmIChwb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElFeHRlbnNpb24gY3VycmVudEV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0gICAgICAgICAgICAgICAgLy8gaW4gYSByZWFsIGFwcGxpY2F0aW9uLCB3ZSB3b3VsZCBjb2xsZWN0aW9uCi0gICAgICAgICAgICAgICAgLy8gdGhlIGVudGlyZSBsaXN0IGFuZCBwcm9iYWJseSBleHBvc2UgaXQKLSAgICAgICAgICAgICAgICAvLyBhcyBhIGRyb3AtZG93biBsaXN0LiBGb3IgdGhlIHNha2UKLSAgICAgICAgICAgICAgICAvLyBvZiBzaW1wbGljaXR5LCB3ZSB3aWxsIHBpY2sgdGhlIGxhc3QgZXh0ZW5zaW9uIG9ubHkuCi0gICAgICAgICAgICAgICAgaWYgKGkgPT0gZXh0ZW5zaW9ucy5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gY3VycmVudEV4dGVuc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA9IGNvbmZpZ0VsZW1lbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhJUmVhZG1lQ29uc3RhbnRzLlRBR19QQVJTRVIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgZmlyc3QgJ3BhcnNlcicgZWxlbWVudCBhbmQgc3RvcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJzZXJFbGVtZW50KGNvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcnNlciA9PSBudWxsKQotICAgICAgICAgICAgcGFyc2VyID0gbmV3IERlZmF1bHRTZWN0aW9uc1BhcnNlcigpOwotICAgICAgICByZWdpc3RyeUxvYWRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gY3JlYXRlIHRoZSBSZWFkbWUgZmlsZSBwYXJzZXIuIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcKLSAgICAgKiB0aGUgY3JlYXRpb24gb2YgdGhlIHBhcnNlciwgcHJpbnQgYW4gZXJyb3IgYW5kIHNldCB0aGUgcGFyc2VyCi0gICAgICogdG8gbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50ICB0aGUgZWxlbWVudCB0byBwcm9jZXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYXJzZXJFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJzZXIgPSAoSVJlYWRtZUZpbGVQYXJzZXIpIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oSVJlYWRtZUNvbnN0YW50cy5BVFRfQ0xBU1MpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gZXhhbXBsZSBqdXN0IHdyaXRlIHRvIHRoZSBjb25zb2xlCi0gICAgICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgICAgIC5wcmludGxuKE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiVW5hYmxlX3RvX2NyZWF0ZV9maWxlX3BhcnNlciIpICsgZS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBwYXJzZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lUGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3ZmVmZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKb2UgQm93YmVlciAoam96YXJ0QGJsYXJnLm5ldCkgLSByZW1vdmVkIGRlcGVuZGVuY3kgb24gcnVudGltZSBjb21wYXRpYmlsaXR5IGxheWVyIChidWcgNzQ1MjgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHRvcC1sZXZlbCBjbGFzcyBvZiB0aGUgUmVhZG1lIHBsdWdpbiB0b29sLgotICoKLSAqIEBzZWUgQWJzdHJhY3RVSVBsdWdpbiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBVSSBwbHVnaW5zCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkbWVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlcgotICAgICAqLyAKLSAgICBwcml2YXRlIHN0YXRpYyBSZWFkbWVQbHVnaW4gaW5zdDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFJlYWRtZSBwbHVnaW4gYW5kIGNhY2hlcyBpdHMgZGVmYXVsdCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBSZWFkbWVQbHVnaW4oKSB7Ci0gICAgICAgIGlmIChpbnN0ID09IG51bGwpCi0gICAgICAgICAgICBpbnN0ID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwbHVnaW4gc2luZ2xldG9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBSZWFkbWVQbHVnaW4gaW5zdGFuY2UKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIFJlYWRtZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gaW5zdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTE3NjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogSW5pdGlhbGl6ZXMgdGhlIHByZWZlcmVuY2VzIGZvciB0aGUgcmVhZG1lIHBsdWctaW4uCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFJlYWRtZVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0gICAgICAgIC8vIFRoZXNlIHNldHRpbmdzIHdpbGwgc2hvdyB1cCB3aGVuIHRoZSBSZWFkbWUgcHJlZmVyZW5jZSBwYWdlCi0gICAgICAgIC8vIGlzIHNob3duIGZvciB0aGUgZmlyc3QgdGltZS4KLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFJlYWRtZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoSVJlYWRtZUNvbnN0YW50cy5QUkVfQ0hFQ0sxLCB0cnVlKTsKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChJUmVhZG1lQ29uc3RhbnRzLlBSRV9DSEVDSzIsIHRydWUpOwotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KElSZWFkbWVDb25zdGFudHMuUFJFX0NIRUNLMywgZmFsc2UpOwotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KElSZWFkbWVDb25zdGFudHMuUFJFX1JBRElPX0NIT0lDRSwgMik7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoSVJlYWRtZUNvbnN0YW50cy5QUkVfVEVYVCwgTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJEZWZhdWx0X3RleHQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZVByZWZlcmVuY2VQYWdlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9SZWFkbWVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjkwZjZiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNhbXBsZSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBpcyAKLSAqIGFkZGVkIHRvIHRoZSBwcmVmZXJlbmNlIGRpYWxvZyBiYXNlZCBvbiB0aGUgcmVnaXN0cmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUmVhZG1lUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0gICAgICAgIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIsIE1vZGlmeUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIEJ1dHRvbiByYWRpb0J1dHRvbjE7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiByYWRpb0J1dHRvbjI7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiByYWRpb0J1dHRvbjM7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBjaGVja0JveDE7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBjaGVja0JveDI7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBjaGVja0JveDM7Ci0KLSAgICBwcml2YXRlIFRleHQgdGV4dEZpZWxkOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBuZXcgY2hlY2tib3ggaW5zdGFuY2UgYW5kIHNldHMgdGhlIGRlZmF1bHQKLSAgICAgKiBsYXlvdXQgZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBncm91cCAgdGhlIGNvbXBvc2l0ZSBpbiB3aGljaCB0byBjcmVhdGUgdGhlIGNoZWNrYm94Ci0gICAgICogQHBhcmFtIGxhYmVsICB0aGUgc3RyaW5nIHRvIHNldCBpbnRvIHRoZSBjaGVja2JveAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBjaGVja2JveAotICAgICAqLwotICAgIHByaXZhdGUgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KENvbXBvc2l0ZSBncm91cCwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLSAgICAgICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICByZXR1cm4gYnV0dG9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IG9mIHRoZSBuZXcgY29tcG9zaXRlCi0gICAgICogQHBhcmFtIG51bUNvbHVtbnMgIHRoZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgdGhlIG5ldyBjb21wb3NpdGUKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIGNvcG9zaXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0gICAgICAgIC8vR3JpZExheW91dAotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgIC8vR3JpZERhdGEKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LAotCQkJCUlSZWFkbWVDb25zdGFudHMuUFJFRkVSRU5DRV9QQUdFX0NPTlRFWFQpOwotCi0gICAgICAgIC8vY29tcG9zaXRlX3RleHRGaWVsZCA8PCBwYXJlbnQKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZV90ZXh0RmllbGQgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAyKTsKLSAgICAgICAgY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RleHRGaWVsZCwgTWVzc2FnZVV0aWwuZ2V0U3RyaW5nKCJUZXh0X0ZpZWxkIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRleHRGaWVsZCA9IGNyZWF0ZVRleHRGaWVsZChjb21wb3NpdGVfdGV4dEZpZWxkKTsKLSAgICAgICAgY3JlYXRlUHVzaEJ1dHRvbihjb21wb3NpdGVfdGV4dEZpZWxkLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkNoYW5nZSIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vY29tcG9zaXRlX3RhYiA8PCBwYXJlbnQKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZV90YWIgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAyKTsKLSAgICAgICAgY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJSYWRpb19CdXR0b25fT3B0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vCi0gICAgICAgIHRhYkZvcndhcmQoY29tcG9zaXRlX3RhYik7Ci0gICAgICAgIC8vcmFkaW8gYnV0dG9uIGNvbXBvc2l0ZSA8PCB0YWIgY29tcG9zaXRlCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGVfcmFkaW9CdXR0b24gPSBjcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlX3RhYiwgMSk7Ci0gICAgICAgIHJhZGlvQnV0dG9uMSA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbXBvc2l0ZV9yYWRpb0J1dHRvbiwgTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJSYWRpb19idXR0b25fMSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByYWRpb0J1dHRvbjIgPSBjcmVhdGVSYWRpb0J1dHRvbihjb21wb3NpdGVfcmFkaW9CdXR0b24sIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiUmFkaW9fYnV0dG9uXzIiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmFkaW9CdXR0b24zID0gY3JlYXRlUmFkaW9CdXR0b24oY29tcG9zaXRlX3JhZGlvQnV0dG9uLCBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIlJhZGlvX2J1dHRvbl8zIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy9jb21wb3NpdGVfdGFiMiA8PCBwYXJlbnQKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZV90YWIyID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0gICAgICAgIGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIyLCBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIkNoZWNrX0JveF9PcHRpb25zIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy8KLSAgICAgICAgdGFiRm9yd2FyZChjb21wb3NpdGVfdGFiMik7Ci0gICAgICAgIC8vY29tcG9zaXRlX2NoZWNrQm94IDw8IGNvbXBvc2l0ZV90YWIyCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGVfY2hlY2tCb3ggPSBjcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlX3RhYjIsIDEpOwotICAgICAgICBjaGVja0JveDEgPSBjcmVhdGVDaGVja0JveChjb21wb3NpdGVfY2hlY2tCb3gsIE1lc3NhZ2VVdGlsCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiQ2hlY2tfYm94XzEiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY2hlY2tCb3gyID0gY3JlYXRlQ2hlY2tCb3goY29tcG9zaXRlX2NoZWNrQm94LCBNZXNzYWdlVXRpbAotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkNoZWNrX2JveF8yIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNoZWNrQm94MyA9IGNyZWF0ZUNoZWNrQm94KGNvbXBvc2l0ZV9jaGVja0JveCwgTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJDaGVja19ib3hfMyIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGluaXRpYWxpemVWYWx1ZXMoKTsKLQotICAgICAgICAvL2ZvbnQgPSBudWxsOwotICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBsYWJlbCBpbnN0YW5jZQotICAgICAqIGFuZCBzZXRzIHRoZSBkZWZhdWx0IGxheW91dCBkYXRhLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBmb3IgdGhlIG5ldyBsYWJlbAotICAgICAqIEBwYXJhbSB0ZXh0ICB0aGUgdGV4dCBmb3IgdGhlIG5ldyBsYWJlbAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBsYWJlbAotICAgICAqLwotICAgIHByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHJldHVybiBsYWJlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBwdXNoIGJ1dHRvbiBpbnN0YW5jZQotICAgICAqIGFuZCBzZXRzIHRoZSBkZWZhdWx0IGxheW91dCBkYXRhLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBmb3IgdGhlIG5ldyBidXR0b24KLSAgICAgKiBAcGFyYW0gbGFiZWwgIHRoZSBsYWJlbCBmb3IgdGhlIG5ldyBidXR0b24KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIGJ1dHRvbgotICAgICAqLwotICAgIHByaXZhdGUgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0gICAgICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgcmV0dXJuIGJ1dHRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSByYWRpbyBidXR0b24gaW5zdGFuY2UKLSAgICAgKiBhbmQgc2V0cyB0aGUgZGVmYXVsdCBsYXlvdXQgZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBuZXcgYnV0dG9uCi0gICAgICogQHBhcmFtIGxhYmVsICB0aGUgbGFiZWwgZm9yIHRoZSBuZXcgYnV0dG9uCi0gICAgICogQHJldHVybiB0aGUgbmV3bHktY3JlYXRlZCBidXR0b24KLSAgICAgKi8KLSAgICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8gfCBTV1QuTEVGVCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLSAgICAgICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICByZXR1cm4gYnV0dG9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHRleHQgZmllbGQgc3BlY2lmaWMgZm9yIHRoaXMgYXBwbGljYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyB0ZXh0IGZpZWxkCi0gICAgICogQHJldHVybiB0aGUgbmV3IHRleHQgZmllbGQKLSAgICAgKi8KLSAgICBwcml2YXRlIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIHRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICAgICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotICAgICAgICB0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+UmVhZG1lUHJlZmVyZW5jZVBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5QcmVmZXJlbmNlUGFnZTwvY29kZT4gbWV0aG9kIAotICAgICAqIHJldHVybnMgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGJlbG9uZ3MgdG8gdGhlIG91ciBwbHVnaW4uCi0gICAgICogVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB3ZSB3YW50IHRvIHN0b3JlCi0gICAgICogb3VyIHByZWZlcmVuY2VzIHNlcGFyYXRlbHkgZnJvbSB0aGUgd29ya2JlbmNoLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotICAgICAgICByZXR1cm4gUmVhZG1lUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMKLSAgICAgKiBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIGNoZWNrQm94MS5zZXRTZWxlY3Rpb24oc3RvcmUKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEJvb2xlYW4oSVJlYWRtZUNvbnN0YW50cy5QUkVfQ0hFQ0sxKSk7Ci0gICAgICAgIGNoZWNrQm94Mi5zZXRTZWxlY3Rpb24oc3RvcmUKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEJvb2xlYW4oSVJlYWRtZUNvbnN0YW50cy5QUkVfQ0hFQ0syKSk7Ci0gICAgICAgIGNoZWNrQm94My5zZXRTZWxlY3Rpb24oc3RvcmUKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEJvb2xlYW4oSVJlYWRtZUNvbnN0YW50cy5QUkVfQ0hFQ0szKSk7Ci0KLSAgICAgICAgcmFkaW9CdXR0b24xLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIHJhZGlvQnV0dG9uMi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICByYWRpb0J1dHRvbjMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgaW50IGNob2ljZSA9IHN0b3JlLmdldERlZmF1bHRJbnQoSVJlYWRtZUNvbnN0YW50cy5QUkVfUkFESU9fQ0hPSUNFKTsKLSAgICAgICAgc3dpdGNoIChjaG9pY2UpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcmFkaW9CdXR0b24xLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByYWRpb0J1dHRvbjIuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHJhZGlvQnV0dG9uMy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB0ZXh0RmllbGQuc2V0VGV4dChzdG9yZS5nZXREZWZhdWx0U3RyaW5nKElSZWFkbWVDb25zdGFudHMuUFJFX1RFWFQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgY2hlY2tCb3gxLnNldFNlbGVjdGlvbihzdG9yZS5nZXRCb29sZWFuKElSZWFkbWVDb25zdGFudHMuUFJFX0NIRUNLMSkpOwotICAgICAgICBjaGVja0JveDIuc2V0U2VsZWN0aW9uKHN0b3JlLmdldEJvb2xlYW4oSVJlYWRtZUNvbnN0YW50cy5QUkVfQ0hFQ0syKSk7Ci0gICAgICAgIGNoZWNrQm94My5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0Qm9vbGVhbihJUmVhZG1lQ29uc3RhbnRzLlBSRV9DSEVDSzMpKTsKLQotICAgICAgICBpbnQgY2hvaWNlID0gc3RvcmUuZ2V0SW50KElSZWFkbWVDb25zdGFudHMuUFJFX1JBRElPX0NIT0lDRSk7Ci0gICAgICAgIHN3aXRjaCAoY2hvaWNlKSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJhZGlvQnV0dG9uMS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgcmFkaW9CdXR0b24yLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICByYWRpb0J1dHRvbjMuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdGV4dEZpZWxkLnNldFRleHQoc3RvcmUuZ2V0U3RyaW5nKElSZWFkbWVDb25zdGFudHMuUFJFX1RFWFQpKTsKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBNb2RpZnlMaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgLy9EbyBub3RoaW5nIG9uIGEgbW9kaWZpY2F0aW9uIGluIHRoaXMgZXhhbXBsZQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0gICAgICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgICAgICBpbml0aWFsaXplRGVmYXVsdHMoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAgICAgICBzdG9yZVZhbHVlcygpOwotICAgICAgICBSZWFkbWVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgc3RvcmUuc2V0VmFsdWUoSVJlYWRtZUNvbnN0YW50cy5QUkVfQ0hFQ0sxLCBjaGVja0JveDEuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBzdG9yZS5zZXRWYWx1ZShJUmVhZG1lQ29uc3RhbnRzLlBSRV9DSEVDSzIsIGNoZWNrQm94Mi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIHN0b3JlLnNldFZhbHVlKElSZWFkbWVDb25zdGFudHMuUFJFX0NIRUNLMywgY2hlY2tCb3gzLmdldFNlbGVjdGlvbigpKTsKLQotICAgICAgICBpbnQgY2hvaWNlID0gMTsKLQotICAgICAgICBpZiAocmFkaW9CdXR0b24yLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgY2hvaWNlID0gMjsKLSAgICAgICAgZWxzZSBpZiAocmFkaW9CdXR0b24zLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgY2hvaWNlID0gMzsKLQotICAgICAgICBzdG9yZS5zZXRWYWx1ZShJUmVhZG1lQ29uc3RhbnRzLlBSRV9SQURJT19DSE9JQ0UsIGNob2ljZSk7Ci0gICAgICAgIHN0b3JlLnNldFZhbHVlKElSZWFkbWVDb25zdGFudHMuUFJFX1RFWFQsIHRleHRGaWVsZC5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0YWIgb2Ygb25lIGhvcml6b250YWwgc3BhbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IGluIHdoaWNoIHRoZSB0YWIgc2hvdWxkIGJlIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGFiRm9yd2FyZChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHZmaWxsZXIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0gICAgICAgIHZmaWxsZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgfQotCi0gICAgLyoqIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gU2VsZWN0aW9uTGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgLy9IYW5kbGUgYSBkZWZhdWx0IHNlbGVjdGlvbi4gRG8gbm90aGluZyBpbiB0aGlzIGV4YW1wbGUKLSAgICB9Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBTZWxlY3Rpb25MaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vRG8gbm90aGluZyBvbiBzZWxlY3Rpb24gaW4gdGhpcyBleGFtcGxlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1JlYWRtZVNlY3Rpb25zVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lU2VjdGlvbnNWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjE2OTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvUmVhZG1lU2VjdGlvbnNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZW1vbnN0cmF0ZXMgYSBzaW1wbGUgdmlldyBjb250YWluaW5nIGEgc2luZ2xlIHZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRtZVNlY3Rpb25zVmlldyBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMgSVNlbGVjdGlvbkxpc3RlbmVyIHsKLSAgICBMaXN0Vmlld2VyIHZpZXdlcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgUmVhZG1lU2VjdGlvbnNWaWV3IC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVhZG1lU2VjdGlvbnNWaWV3KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFBhcnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCk7Ci0KLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh2aWV3ZXIuZ2V0Q29udHJvbCgpLAotCQkJCUlSZWFkbWVDb25zdGFudHMuU0VDVElPTlNfVklFV19DT05URVhUKTsKLQotICAgICAgICAvLyBpZiB0aGUgb2JqZWN0cyBpbiB0aGUgdmlld2VyIGltcGxlbWVudCBJV29ya2JlbmNoQWRhcHRlciwKLSAgICAgICAgLy8gdGhlc2UgZ2VuZXJpYyBjb250ZW50IGFuZCBsYWJlbCBwcm92aWRlcnMgY2FuIGJlIHVzZWQuCi0gICAgICAgIHZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0KLSAgICAgICAgLy8gYWRkIG15c2VsZiBhcyBhIGdsb2JhbCBzZWxlY3Rpb24gbGlzdGVuZXIKLSAgICAgICAgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICAvLyBwcmltZSB0aGUgc2VsZWN0aW9uCi0gICAgICAgIHNlbGVjdGlvbkNoYW5nZWQobnVsbCwgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlJlYWRtZVNlY3Rpb25WaWV3PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPklXb3JrYmVuY2hQYXJ0PC9jb2RlPiBtZXRob2QgcnVucyBzdXBlcgotICAgICAqIGFuZCByZW1vdmVzIGl0c2VsZiBmcm9tIHRoZSBnbG9iYWwgc2VsZWN0aW9uIGxpc3RlbmVyLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIGdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU2VsZWN0aW9uTGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsKSB7Ci0gICAgICAgIC8vaWYgdGhlIHNlbGVjdGlvbiBpcyBhIHJlYWRtZSBmaWxlLCBnZXQgaXRzIHNlY3Rpb25zLgotICAgICAgICBBZGFwdGFibGVMaXN0IGlucHV0ID0gUmVhZG1lTW9kZWxGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U2VjdGlvbnMoc2VsKTsKLSAgICAgICAgdmlld2VyLnNldElucHV0KGlucHV0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hQYXJ0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9TZWN0aW9uc0RpYWxvZy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvU2VjdGlvbnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxMWNhNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9TZWN0aW9uc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyBhbiBleGFtcGxlIG9mIGEgZGV0YWNoZWQgd2luZG93IGxhdW5jaGVkCi0gKiBmcm9tIGFuIGFjdGlvbiBpbiB0aGUgd29ya2JlbmNoLgotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbnNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotICAgIHByb3RlY3RlZCBJQWRhcHRhYmxlIGlucHV0OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBTZWN0aW9uc0RpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2VjdGlvbnNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElBZGFwdGFibGUgaW5wdXQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXaW5kb3cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotICAgICAgICBuZXdTaGVsbC5zZXRUZXh0KE1lc3NhZ2VVdGlsLmdldFN0cmluZygiUmVhZG1lX1NlY3Rpb25zIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmV3U2hlbGwsCi0JCQkJSVJlYWRtZUNvbnN0YW50cy5TRUNUSU9OU19ESUFMT0dfQ09OVEVYVCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgTGlzdChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgTGlzdFZpZXdlciB2aWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihsaXN0KTsKLSAgICAgICAgdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICB2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgdmlld2VyLnNldElucHV0KGlucHV0KTsKLQotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1ZpZXdBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvVmlld0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZWI4ZWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvVmlld0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGVtb25zdHJhdGUgdmlldyBhY3Rpb24gZXh0ZW5zaW9ucy4KLSAqIEFuIGV4dGVuc2lvbiBzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGUgcmVhZG1lIHBsdWdpbi54bWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLSAgICBwdWJsaWMgSVZpZXdQYXJ0IHZpZXc7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFZpZXdBY3Rpb25EZWxlZ2F0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmlld0FjdGlvbkRlbGVnYXRlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVZpZXdBY3Rpb25EZWxlZ2F0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLSAgICAgICAgdGhpcy52aWV3ID0gdmlldzsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb25EZWxlZ2F0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24odmlldy5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgTWVzc2FnZVV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJSZWFkbWVfRWRpdG9yIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbC5nZXRTdHJpbmcoIlZpZXdfQWN0aW9uX2V4ZWN1dGVkIikpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uRGVsZWdhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uIGFjdGlvbiwKLSAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1dpbmRvd0FjdGlvbkRlbGVnYXRlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL0VjbGlwc2UgVUkgRXhhbXBsZXMgUmVhZG1lIFRvb2wvb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvcmVhZG1ldG9vbC9XaW5kb3dBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTFiZmQzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL1dpbmRvd0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNob3dzIGhvdyA8Y29kZT5JQWN0aW9uRGVsZWdhdGU8L2NvZGU+IGltcGxlbWVudGF0aW9ucwotICogc2hvdWxkIGJlIHVzZWQgZm9yIGdsb2JhbCBhY3Rpb24gcmVnaXN0cmF0aW9uIGZvciBtZW51IAotICogYW5kIHRvb2wgYmFycy4gQWN0aW9uIHByb3h5IG9iamVjdCBpcyBjcmVhdGVkIGluIHRoZSAKLSAqIHdvcmtiZW5jaCBiYXNlZCBvbiBwcmVzZW50YXRpb24gaW5mb3JtYXRpb24gaW4gdGhlIHBsdWdpbi54bWwKLSAqIGZpbGUuIERlbGVnYXRlIGlzIG5vdCBsb2FkZWQgdW50aWwgdGhlIGZpcnN0IHRpbWUgdGhlIHVzZXIKLSAqIHByZXNzZXMgdGhlIGJ1dHRvbiBvciBzZWxlY3RzIHRoZSBtZW51LiBCYXNlZCBvbiB0aGUgYWN0aW9uCi0gKiBhdmFpbGFiaWxpdHksIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGJ1dHRvbiB3aWxsIGRpc2FibGUKLSAqIGluc3RlYWQgb2YgZXhlY3V0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgV2luZG93QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLSAgICBwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoQWN0aW9uRGVsZWdhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoQWN0aW9uRGVsZWdhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgIHRoaXMud2luZG93ID0gd2luZG93OwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+V2luZG93QWN0aW9uRGVsZWdhdGU8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5JQWN0aW9uRGVsZWdhdGU8L2NvZGU+IG1ldGhvZCAKLSAgICAgKiBsYXVuY2hlcyBhIHN0YW5kLWFsb25lIGRpYWxvZyB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBzZWN0aW9ucyBmb3IKLSAgICAgKiB0aGUgc2VsZWN0ZWQgcmVhZG1lIGZpbGUgaW4gdGhlIG5hdmlnYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgU2VjdGlvbnNEaWFsb2cgZGlhbG9nID0gbmV3IFNlY3Rpb25zRGlhbG9nKHdpbmRvdy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIFJlYWRtZU1vZGVsRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNlY3Rpb25zKHNlbGVjdGlvbikpOwotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUaGUgPGNvZGU+V2luZG93QWN0aW9uRGVsZWdhdGU8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5JQWN0aW9uRGVsZWdhdGU8L2NvZGU+IG1ldGhvZCAKLSAgICAgKiBkb2VzIG5vdGhpbmcgLSB3ZSB3aWxsIGxldCBzaW1wbGUgcnVsZXMgaW4gdGhlIFhNTAotICAgICAqIGNvbmZpZyBmaWxlIHJlYWN0IHRvIHNlbGVjdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvbWVzc2FnZXMucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy9yZWFkbWV0b29sL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNGE5NjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9FY2xpcHNlIFVJIEV4YW1wbGVzIFJlYWRtZSBUb29sL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3JlYWRtZXRvb2wvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFkZD0mQWRkCi1DbGVhbj1DbGVhbgotU2F2ZV9OZWVkZWQ9U2F2ZSBOZWVkZWQKLUVkaXRvcl9BY3Rpb25fZXhlY3V0ZWQ9RWRpdG9yIEFjdGlvbiBleGVjdXRlZAotUmVhZG1lX0VkaXRvcj1SZWFkbWUgRWRpdG9yCi1SZWFkbWVfT3V0bGluZT1SZWFkbWUgT3V0bGluZQotTGluZV9jb3VudD1MaW5lIGNvdW50Ci1UaXRsZV9sZW5ndGg9VGl0bGUgbGVuZ3RoCi1UaXRsZV9zdGFydD1UaXRsZSBzdGFydAotUG9wdXBfTWVudV9BY3Rpb25fZXhlY3V0ZWQ9UG9wdXAgTWVudSBBY3Rpb24gZXhlY3V0ZWQKLVJlYWRtZV9FeGFtcGxlPVJlYWRtZSBFeGFtcGxlCi1BdXRvbWF0aWNfc2FtcGxlX3NlY3Rpb25fZ2VuZXJhdGlvbj1BdXRvbWF0aWMgc2FtcGxlIHNlY3Rpb24gZ2VuZXJhdGlvbgotQ3JlYXRlX1JlYWRtZV9GaWxlPUNyZWF0ZSBSZWFkbWUgRmlsZQotQ3JlYXRlX2FfbmV3X1JlYWRtZV9maWxlX3Jlc291cmNlPUNyZWF0ZSBhIG5ldyBSZWFkbWUgZmlsZSByZXNvdXJjZS4KLUdlbmVyYXRlX3NhbXBsZV9zZWN0aW9uX3RpdGxlcz0mR2VuZXJhdGUgc2FtcGxlIHNlY3Rpb24gdGl0bGVzCi1HZW5lcmF0ZV9zYW1wbGVfc3Vic2VjdGlvbl90aXRsZXM9R2VuZXJhdGUgc2FtcGxlIHN1YnNlY3Rpb24gJnRpdGxlcwotT3Blbl9maWxlX2Zvcl9lZGl0aW5nX3doZW5fZG9uZT0mT3BlbiBmaWxlIGZvciBlZGl0aW5nIHdoZW4gZG9uZQotUmVhZG1lX2ZpbGVfbmFtZT0mUmVhZG1lIGZpbGUgbmFtZToKLVNBTVBMRV9SRUFETUVfRklMRT1cblxuICAgICBTQU1QTEUgUkVBRE1FIEZJTEVcblxuCi1TRUNUSU9OXzE9MS4gU0VDVElPTiAxXG4KLVNFQ1RJT05fMV9CT0RZXzE9VGhpcyB0ZXh0IGlzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBzZWN0aW9uIGJvZHkuXG4KLVNFQ1RJT05fMj0yLiBTRUNUSU9OIDJcbgotU0VDVElPTl8yX0JPRFlfMT1UaGlzIHRleHQgaXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIHNlY3Rpb24gYm9keS4gSXQgaXNcbgotU0VDVElPTl8yX0JPRFlfMj1hIGJpdCBsb25nZXIgaW4gb3JkZXIgdG8gc3BhbiB0d28gbGluZXMuXG4KLVN1YnNlY3Rpb25fMV8xPVwgXCBcIDEuMSBTdWJzZWN0aW9uXG4KLVN1YnNlY3Rpb25fMV8xX0JvZHlfMT1cIFwgXCBUaGlzIHRleHQgaXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIHN1YnNlY3Rpb24gYm9keVxuCi1TdWJzZWN0aW9uXzJfMT1cIFwgXCAyLjEgU3Vic2VjdGlvblxuCi1TdWJzZWN0aW9uXzJfMV9CT0RZXzE9XCBcIFwgVGhpcyB0ZXh0IGlzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBzdWJzZWN0aW9uIGJvZHlcbgotU3Vic2VjdGlvbl8yXzI9XCBcIFwgMi4yIFN1YnNlY3Rpb25cbgotU3Vic2VjdGlvbl8yXzJfQk9EWV8xPVwgXCBcIFRoaXMgdGV4dCBpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgc3Vic2VjdGlvbiBib2R5XG4KLU5ld19SZWFkbWVfRmlsZT1OZXcgUmVhZG1lIEZpbGUKLUV4Y2VwdGlvbl9pbl9yZWFkbWVfZHJvcF9hZGFwdGVyPUV4Y2VwdGlvbiBpbiByZWFkbWUgZHJvcCBhZGFwdGVyOiAKLUVkaXRvcl9BY3Rpb24xPUVkaXRvciBBY3Rpb24gJjEKLUVkaXRvcl9BY3Rpb24yPUVkaXRvciBBY3Rpb24gJjIKLUVkaXRvcl9BY3Rpb24zPUVkaXRvciBBY3Rpb24gJjMKLUVkaXRvcl9BY3Rpb240PUVkaXRvciBBY3Rpb24gJjQKLUVkaXRvcl9BY3Rpb241PUVkaXRvciBBY3Rpb24gJjUKLU91dGxpbmVfQWN0aW9uMj1PdXRsaW5lIEFjdGlvbiAmMgotT3V0bGluZV9BY3Rpb24zPU91dGxpbmUgQWN0aW9uICYzCi1PdXRsaW5lX0FjdGlvbjQ9T3V0bGluZSBBY3Rpb24gJjQKLU91dGxpbmVfQWN0aW9uNT1PdXRsaW5lIEFjdGlvbiAmNQotRWRpdG9yX2lzX2FjdGl2ZT1FZGl0b3IgaXMgYWN0aXZlCi1FbXB0eV9FZGl0b3JfTmFtZT1FbXB0eQotUmVhZG1lX0VkaXRvcl9BY3Rpb24xPVJlYWRtZSBFZGl0b3IgQWN0aW9uIDEKLVJlYWRtZV9FZGl0b3JfQWN0aW9uMj1SZWFkbWUgUmV0YXJnZXQgRWRpdG9yIEFjdGlvbiAyCi1SZWFkbWVfRWRpdG9yX0FjdGlvbjM9UmVhZG1lIExhYmVsIFJldGFyZ2V0IEVkaXRvciBBY3Rpb24gMwotUmVhZG1lX0VkaXRvcl9BY3Rpb241PVJlYWRtZSBMYWJlbCBSZXRhcmdldCBFZGl0b3IgQWN0aW9uIDUKLVJlYWRtZV9PdXRsaW5lX0FjdGlvbjM9UmVhZG1lIExhYmVsIFJldGFyZ2V0IE91dGxpbmUgQWN0aW9uIDMKLVJlYWRtZV9PdXRsaW5lX0FjdGlvbjU9UmVhZG1lIExhYmVsIFJldGFyZ2V0IE91dGxpbmUgQWN0aW9uIDUKLVJlYWRtZV9NZW51PSZSZWFkbWUKLVJlYWRtZUVkaXRvckFjdGlvbkV4ZWN1dGVkPVJlYWRtZSBFZGl0b3IgQWN0aW9uIGV4ZWN1dGVkOiB7MH0gZm9yOiB7MX0KLVJlYWRtZU91dGxpbmVBY3Rpb25FeGVjdXRlZD1SZWFkbWUgT3V0bGluZSBBY3Rpb24gZXhlY3V0ZWQKLTxVbmtub3duPj08VW5rbm93bj4KLTxmaWxlX2NvbnRlbnRzX25vdF9sb2NhbD49PGZpbGUgY29udGVudHMgbm90IGxvY2FsPgotQWRkaXRpb25hbF9pbmZvcm1hdGlvbj1BZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBSZWFkbWUgZmlsZSBjYW4gZ28gaGVyZS4KLUZpbGVfbmFtZT1GaWxlIG5hbWU6Ci1OdW1iZXJfb2Zfc2VjdGlvbnM9TnVtYmVyIG9mIHNlY3Rpb25zOgotUGF0aD1QYXRoOiAKLVNpemU9U2l6ZTogCi1BZGRpdGlvbmFsX1JlYWRtZV9wcm9wZXJ0aWVzX25vdF9hdmFpbGFibGUuPUFkZGl0aW9uYWwgUmVhZG1lIHByb3BlcnRpZXMgbm90IGF2YWlsYWJsZS4KLUhhZF9pdF9iZWVuX2xlc3NfdGhhbl8yNTZfYnl0ZXNfdGhpc19wYWdlX3dvdWxkX2JlX2FfcGxhY2Vob2xkZXJfcGFnZS49SGFkIGl0IGJlZW4gbGVzcyB0aGFuIDI1NiBieXRlcywgdGhpcyBwYWdlIHdvdWxkIGJlIGEgcGxhY2Vob2xkZXIgcGFnZS4KLVRoZV9zaXplX29mX3RoZV9SZWFkbWVfZmlsZV9pc19hdF9sZWFzdF8yNTZfYnl0ZXMuPVRoZSBzaXplIG9mIHRoZSBSZWFkbWUgZmlsZSBpcyBhdCBsZWFzdCAyNTYgYnl0ZXMuCi1UaGlzX2lsbHVzdHJhdGVzX2FfcHJvcGVydHlfcGFnZV90aGF0X2lzX2R5bmFtaWNhbGx5X2RldGVybWluZWQ9VGhpcyBpbGx1c3RyYXRlcyBhIHByb3BlcnR5IHBhZ2UgdGhhdCBpcyBkeW5hbWljYWxseSBkZXRlcm1pbmVkCi1ub3RfdG9fYmVfYXZhaWxhYmxlX2Jhc2VkX29uX3RoZV9zdGF0ZV9vZl90aGVfb2JqZWN0Lj1ub3QgdG8gYmUgYXZhaWxhYmxlIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB0aGUgb2JqZWN0LgotdG9fYmVfYXZhaWxhYmxlX2Jhc2VkX29uX3RoZV9zdGF0ZV9vZl90aGVfb2JqZWN0Lj10byBiZSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIHN0YXRlIG9mIHRoZSBvYmplY3QuCi1VbmFibGVfdG9fY3JlYXRlX2ZpbGVfcGFyc2VyPVVuYWJsZSB0byBjcmVhdGUgZmlsZSBwYXJzZXIuCi1EZWZhdWx0X3RleHQ9RGVmYXVsdCB0ZXh0Ci1DaGFuZ2U9Q2hhbiZnZQotQ2hlY2tfQm94X09wdGlvbnM9Q2hlY2sgQm94IE9wdGlvbnMKLUNoZWNrX2JveF8xPSZDaGVjayBib3ggMQotQ2hlY2tfYm94XzI9QyZoZWNrIGJveCAyCi1DaGVja19ib3hfMz1DaGVjayBibyZ4IDMKLVJhZGlvX0J1dHRvbl9PcHRpb25zPVJhZGlvIEJ1dHRvbiBPcHRpb25zCi1SYWRpb19idXR0b25fMT0mUmFkaW8gYnV0dG9uIDEKLVJhZGlvX2J1dHRvbl8yPVJhZCZpbyBidXR0b24gMgotUmFkaW9fYnV0dG9uXzM9UmFkaW8gYiZ1dHRvbiAzCi1UZXh0X0ZpZWxkPSZUZXh0IEZpZWxkCi1SZWFkbWVfU2VjdGlvbnM9UmVhZG1lIFNlY3Rpb25zCi1WaWV3X0FjdGlvbl9leGVjdXRlZD1WaWV3IEFjdGlvbiBleGVjdXRlZAotQWRkX1NlbnRlbmNlPUFkZCBTZW50ZW5jZQotUmVzb2x1dGlvbl9FcnJvcj1SZXNvbHV0aW9uIEVycm9yCi1VbmFibGVfdG9fb3Blbl9maWxlX2VkaXRvcj1VbmFibGUgdG8gb3BlbiBmaWxlIGVkaXRvcgotU2ltcGxlX3NlbnRlbmNlPVRoaXMgaXMgYSBzaW1wbGUgc2VudGVuY2UuXG4KLVJlYWRtZV9tYXJrZXJfbWVzc2FnZV9leGFtcGxlPVJlYWRtZSBtYXJrZXIgZXhhbXBsZSAKLUFkZF9yZWFkbWVfbWFya2VyX2FjdGlvbl9sYWJlbD1SZWFkbWUgTWFya2VyIEV4YW1wbGUgJgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9IZWxwQ29udGV4dHMueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjJiNTgwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08Y29udGV4dHM+Ci0KLSAgIDxjb250ZXh0ICBpZD0ib3Blbl9icm93c2VyX2FjdGlvbl9jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+T3BlbnMgdGhlIHJlYWRtZSBicm93c2VyIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQzLmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDMgLSBUZW1wb3JhcnkiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDQuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgNCAtIFRlbXBvcmFyeSIvPgotICAgPC9jb250ZXh0PgotICAgPGNvbnRleHQgIGlkPSJ2aWV3X2FjdGlvbl9jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UnVucyBhIHJlYWRtZSB2aWV3IGFjdGlvbiA8Yj5IZWxwPC9iPiA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHRvcGljIGhyZWY9ImNvbnRleHRzL1JlbGF0ZWRDb250ZXh0My5odG1sIiAgbGFiZWw9IkhlbHAgUmVsYXRlZCBUb3BpYyAzIC0gVGVtcG9yYXJ5Ii8+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQ0Lmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDQgLSBUZW1wb3JhcnkiLz4KLSAgIDwvY29udGV4dD4KLSAgIDxjb250ZXh0ICBpZD0iZWRpdG9yX2FjdGlvbl9jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UnVucyBhIHJlYWRtZSBlZGl0b3IgYWN0aW9uIDxiPkhlbHA8L2I+IDwvZGVzY3JpcHRpb24+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQzLmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDMgLSBUZW1wb3JhcnkiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDQuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgNCAtIFRlbXBvcmFyeSIvPgotICAgPC9jb250ZXh0PgotICAgPGNvbnRleHQgIGlkPSJlZGl0b3JfYWN0aW9uMV9jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UnVucyByZWFkbWUgZWRpdG9yIGFjdGlvbiAxIDxiPkhlbHA8L2I+IDwvZGVzY3JpcHRpb24+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQzLmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDMgLSBUZW1wb3JhcnkiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDQuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgNCAtIFRlbXBvcmFyeSIvPgotICAgPC9jb250ZXh0PgotICAgPGNvbnRleHQgIGlkPSJlZGl0b3JfYWN0aW9uMl9jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UnVucyByZWFkbWUgZWRpdG9yIGFjdGlvbiAyIDxiPkhlbHA8L2I+IDwvZGVzY3JpcHRpb24+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQzLmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDMgLSBUZW1wb3JhcnkiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDQuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgNCAtIFRlbXBvcmFyeSIvPgotICAgPC9jb250ZXh0PgotICAgPGNvbnRleHQgIGlkPSJlZGl0b3JfYWN0aW9uM19jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UnVucyByZWFkbWUgZWRpdG9yIGFjdGlvbiAzIDxiPkhlbHA8L2I+IDwvZGVzY3JpcHRpb24+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQzLmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDMgLSBUZW1wb3JhcnkiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDQuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgNCAtIFRlbXBvcmFyeSIvPgotICAgPC9jb250ZXh0PgotCi0gICA8Y29udGV4dCAgaWQ9InNlY3Rpb25zX3ZpZXdfY29udGV4dCIgPgotICAgICAgPGRlc2NyaXB0aW9uPlJlYWRtZSBzZWN0aW9ucyB2aWV3IDxiPkhlbHA8L2I+IDwvZGVzY3JpcHRpb24+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQzLmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDMgLSBUZW1wb3JhcnkiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDQuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgNCAtIFRlbXBvcmFyeSIvPgotICAgPC9jb250ZXh0PgotCi0gICA8Y29udGV4dCAgaWQ9InNlY3Rpb25zX2RpYWxvZ19jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UmVhZG1lIHNlY3Rpb25zIGRpYWxvZyA8Yj5IZWxwPC9iPiA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHRvcGljIGhyZWY9ImNvbnRleHRzL1JlbGF0ZWRDb250ZXh0My5odG1sIiAgbGFiZWw9IkhlbHAgUmVsYXRlZCBUb3BpYyAzIC0gVGVtcG9yYXJ5Ii8+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQ0Lmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDQgLSBUZW1wb3JhcnkiLz4KLSAgIDwvY29udGV4dD4KLQotICAgPGNvbnRleHQgIGlkPSJwcmVmZXJlbmNlX3BhZ2VfY29udGV4dCIgPgotICAgICAgPGRlc2NyaXB0aW9uPlJlYWRtZSBwcmVmZXJlbmNlIHBhZ2UgPGI+SGVscDwvYj4gPC9kZXNjcmlwdGlvbj4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDMuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgMyAtIFRlbXBvcmFyeSIvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbnRleHRzL1JlbGF0ZWRDb250ZXh0NC5odG1sIiAgbGFiZWw9IkhlbHAgUmVsYXRlZCBUb3BpYyA0IC0gVGVtcG9yYXJ5Ii8+Ci0gICA8L2NvbnRleHQ+Ci0KLSAgIDxjb250ZXh0ICBpZD0icHJvcGVydHlfcGFnZV9jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UmVhZG1lIHByb3BlcnR5IHBhZ2UgPGI+SGVscDwvYj4gPC9kZXNjcmlwdGlvbj4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDMuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgMyAtIFRlbXBvcmFyeSIvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbnRleHRzL1JlbGF0ZWRDb250ZXh0NC5odG1sIiAgbGFiZWw9IkhlbHAgUmVsYXRlZCBUb3BpYyA0IC0gVGVtcG9yYXJ5Ii8+Ci0gICA8L2NvbnRleHQ+Ci0gICA8Y29udGV4dCAgaWQ9InByb3BlcnR5X3BhZ2UyX2NvbnRleHQiID4KLSAgICAgIDxkZXNjcmlwdGlvbj5SZWFkbWUgcHJvcGVydHkgcGFnZTIgPGI+SGVscDwvYj4gPC9kZXNjcmlwdGlvbj4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDMuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgMyAtIFRlbXBvcmFyeSIvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbnRleHRzL1JlbGF0ZWRDb250ZXh0NC5odG1sIiAgbGFiZWw9IkhlbHAgUmVsYXRlZCBUb3BpYyA0IC0gVGVtcG9yYXJ5Ii8+Ci0gICA8L2NvbnRleHQ+Ci0KLSAgIDxjb250ZXh0ICBpZD0iZWRpdG9yX2NvbnRleHQiID4KLSAgICAgIDxkZXNjcmlwdGlvbj5SZWFkbWUgZWRpdG9yIDxiPkhlbHA8L2I+IDwvZGVzY3JpcHRpb24+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQzLmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDMgLSBUZW1wb3JhcnkiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDQuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgNCAtIFRlbXBvcmFyeSIvPgotICAgPC9jb250ZXh0PgotCi0gICA8Y29udGV4dCAgaWQ9ImNvbnRlbnRfb3V0bGluZV9wYWdlX2NvbnRleHQiID4KLSAgICAgIDxkZXNjcmlwdGlvbj5SZWFkbWUgZWRpdG9yIGNvbnRlbnQgb3V0bGluZSA8Yj5IZWxwPC9iPiA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHRvcGljIGhyZWY9ImNvbnRleHRzL1JlbGF0ZWRDb250ZXh0My5odG1sIiAgbGFiZWw9IkhlbHAgUmVsYXRlZCBUb3BpYyAzIC0gVGVtcG9yYXJ5Ii8+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQ0Lmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDQgLSBUZW1wb3JhcnkiLz4KLSAgIDwvY29udGV4dD4KLQotICAgPGNvbnRleHQgIGlkPSJjcmVhdGlvbl93aXphcmRfcGFnZV9jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UmVhZG1lIGZpbGUgY3JlYXRpb24gd2l6YXJkIDxiPkhlbHA8L2I+IDwvZGVzY3JpcHRpb24+Ci0gICAgICA8dG9waWMgaHJlZj0iY29udGV4dHMvUmVsYXRlZENvbnRleHQzLmh0bWwiICBsYWJlbD0iSGVscCBSZWxhdGVkIFRvcGljIDMgLSBUZW1wb3JhcnkiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb250ZXh0cy9SZWxhdGVkQ29udGV4dDQuaHRtbCIgIGxhYmVsPSJIZWxwIFJlbGF0ZWQgVG9waWMgNCAtIFRlbXBvcmFyeSIvPgotICAgPC9jb250ZXh0PgotCi0gICA8Y29udGV4dCAgaWQ9Im1hcmtlcl9leGFtcGxlMV9jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UmVhZG1lIG1hcmtlciBleGFtcGxlIDEgPGI+SGVscDwvYj4gaWQgPSAxMjM0IDwvZGVzY3JpcHRpb24+Ci0gICA8L2NvbnRleHQ+Ci0gICA8Y29udGV4dCAgaWQ9Im1hcmtlcl9leGFtcGxlMl9jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UmVhZG1lIG1hcmtlciBleGFtcGxlIDIgPGI+SGVscDwvYj4gbGV2ZWwgPSA3IDwvZGVzY3JpcHRpb24+Ci0gICA8L2NvbnRleHQ+Ci0gICA8Y29udGV4dCAgaWQ9Im1hcmtlcl9leGFtcGxlM19jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UmVhZG1lIG1hcmtlciBleGFtcGxlIDMgPGI+SGVscDwvYj4gbGV2ZWwgPSA3LCBkZXBhcnRtZW50ID0gaW5mcmEgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY29udGV4dD4KLSAgIDxjb250ZXh0ICBpZD0ibWFya2VyX2V4YW1wbGU0X2NvbnRleHQiID4KLSAgICAgIDxkZXNjcmlwdGlvbj5SZWFkbWUgbWFya2VyIGV4YW1wbGUgNCA8Yj5IZWxwPC9iPiBjb2RlID0gcmVkIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NvbnRleHQ+Ci0gICA8Y29udGV4dCAgaWQ9Im1hcmtlcl9leGFtcGxlNV9jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UmVhZG1lIG1hcmtlciBleGFtcGxlIDUgPGI+SGVscDwvYj4gbGFuZ3VhZ2UgPSBlbmdsaXNoIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NvbnRleHQ+Ci0gICA8Y29udGV4dCAgaWQ9Im1hcmtlcl9leGFtcGxlNl9jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UmVhZG1lIG1hcmtlciBleGFtcGxlIDYgPGI+SGVscDwvYj4gaWQgPSAxMjM0LCBsZXZlbCA9IDcsIGRlcGFydG1lbnQgPSBpbmZyYSwgY29kZSA9IHJlZCwgbGFuZ3VhZ2UgPSBlbmdsaXNoIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NvbnRleHQ+Ci0gICA8Y29udGV4dCAgaWQ9Im1hcmtlcl9leGFtcGxlN19jb250ZXh0IiA+Ci0gICAgICA8ZGVzY3JpcHRpb24+UmVhZG1lIG1hcmtlciBleGFtcGxlIDcgPGI+SGVscDwvYj4gTm8gYXR0cmlidXRlcyBzcGVjaWZpZWQgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY29udGV4dD4KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZmIyZGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQbHVnaW4ubmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiByZWFkbWV0b29sLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5SZWFkbWVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQbHVnaW4ucHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UudWkudmlld3MsCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UudGV4dCwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQotRWNsaXBzZS1BdXRvU3RhcnQtY29tbWVudDogVXNlIEVjbGlwc2UtQXV0b1N0YXJ0IGluc3RlYWQgb2YgRWNsaXBzZS1MYXp5U3RhcnQgYmVjYXVzZSB0aGUgcmVhZG1lIGV4YW1wbGUgc2hvdWxkIHJ1biBhZ2FpbnN0IDMuMSBhcyB3ZWxsIGFzIDMuMi4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzNjEzMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YTYxN2MuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLnJlYWRtZXRvb2wuamFyID0gRWNsaXBzZSBVSSBFeGFtcGxlcyBSZWFkbWUgVG9vbC8KLQotYmluLmluY2x1ZGVzID0gZG9jLyxcCi0gICAgICAgICAgICAgICBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgZG9jLnppcCxcCi0gICAgICAgICAgICAgICBIZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvZG9jLWh0bWwvaGdsZWdhbC5odG0gYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2RvYy1odG1sL2hnbGVnYWwuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDEwODFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvZG9jLWh0bWwvaGdsZWdhbC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjczIFtlbl0gKFdpbjk4OyBVKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5MZWdhbCBOb3RpY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDM+Ci08YSBOQU1FPSJOb3RpY2VzIj48L2E+Tm90aWNlczwvaDM+Ci0oYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9kb2MtaHRtbC91aV9yZWFkbWV0b29sX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2RvYy1odG1sL3VpX3JlYWRtZXRvb2xfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYyNGY4Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2RvYy1odG1sL3VpX3JlYWRtZXRvb2xfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPldvcmtiZW5jaCAtIFJlYWRtZSBUb29sIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj4KLTxiPkV4YW1wbGUgLSBSZWFkbWUgVG9vbDwvYj48L2gyPgotCi08aDM+Ci1JbnRyb2R1Y3Rpb248L2gzPgotVGhlIFJlYWRtZSBlZGl0b3Igc2hvd3MgaG93IHRvIGRlZmluZSB5b3VyIG93biBleHRlbnNpb24gcG9pbnRzIGZvciB1c2UKLWJ5IG90aGVyIHBsdWdpbnMuIEl0IGFsc28gc2hvd3MgaG93IHRvIGNyZWF0ZSBleHRlbnNpb25zIGZvciByZXNvdXJjZSBwb3B1cAotbWVudSBlbnRyaWVzLCBuZXcgcmVzb3VyY2Ugd2l6YXJkcywgZmlsZSBlZGl0b3JzIG9uIGFuIGV4dGVuc2lvbiAoLnJlYWRtZSksCi1hIGN1c3RvbSB2aWV3IGFuZCBwcm9wZXJ0eSBwYWdlcy4KLTxoMz4KLVJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotVG8gc3RhcnQgdXNpbmcgdGhpcyBleGFtcGxlIGNyZWF0ZSBhIGZpbGUgd2l0aCB0aGUgLnJlYWRtZSBleHRlbnNpb24gdXNpbmcKLXRoZSBmaWxlIGNyZWF0aW9uIHdpemFyZCBvciBjcmVhdGUgb25lIHVzaW5nIHRoZSBleGFtcGxlIGNyZWF0aW9uIHdpemFyZC4KLVRoZSBhZGRpdGlvbmFsJm5ic3A7IHZpZXcgcHJvdmlkZWQgYnkgdGhpcyBleGFtcGxlIGNhbiBiZSBzZWVuIGJ5IHNlbGVjdGluZwotV2luZG93ID4gU2hvdyBWaWV3ID4gT3RoZXIgYW5kIGV4cGFuZGluZyB0aGUgUmVhZG1lIHNlY3Rpb24uIFRoZQotdmlldyBhY3Rpb24gY2FuIGJlIHNlZW4gYnkgY2xpY2tpbmcgb24gdGhlIHJlYWRtZSBpY29uIG9uIHRoZSBOYXZpZ2F0b3IKLVZpZXcuCi08aDQ+Ci1DcmVhdGluZyBhIG5ldyByZWFkbWUgZmlsZTwvaDQ+Ci1DcmVhdGUgYSBuZXcgZmlsZSB3aXRoIGZpbGUgZXh0ZW5zaW9uIC5yZWFkbWUuJm5ic3A7IEZyb20gdGhlIEZpbGUgbWVudSwKLXNlbGVjdCBOZXcgYW5kIHRoZW4gc2VsZWN0IE90aGVyLi4uIGZyb20gdGhlIHN1YiBtZW51LiZuYnNwOyBDbGljayBvbiBTaW1wbGUKLWluIHRoZSB3aXphcmQsIHRoZW4gc2VsZWN0IEZpbGUgaW4gdGhlIGxpc3Qgb24gdGhlIGxlZnQuJm5ic3A7IENsaWNrIG9uCi1OZXh0IHRvIHN1cHBseSB0aGUgZmlsZSBuYW1lIChtYWtlIHN1cmUgdGhlIGV4dGVuc2lvbiBpcyAucmVhZG1lKSBhbmQgdGhlCi1mb2xkZXIgaW4gd2hpY2ggdGhlIGZpbGUgc2hvdWxkIGJlIGNvbnRhaW5lZC4KLTxoND4KLUV4YW1wbGUgY3JlYXRpb24gd2l6YXJkczwvaDQ+Ci1Gcm9tIHRoZSBGaWxlIG1lbnUsIHNlbGVjdCBOZXcgYW5kIGZyb20gdGhlIHN1YiBtZW51IHNlbGVjdCBFeGFtcGxlLi4uJm5ic3A7Ci1Ob3cgc2VsZWN0IEV4YW1wbGUgQ3JlYXRpb24gV2l6YXJkcy4gU2VsZWN0IFJlYWRtZSBGaWxlLiBDbGljayBOZXh0LiBTZWxlY3QKLXRoZSBmb2xkZXIgaW4gd2hpY2ggeW91IHdhbnQgdGhlIGZpbGUgdG8gYmUgY3JlYXRlZC4gVHlwZSB0aGUgbmFtZSBvZiB0aGUKLWZpbGUgd2l0aCBhIC5yZWFkbWUgZXh0ZW5zaW9uLiBDbGljayBGaW5pc2guCi08aDQ+Ci1SZWFkbWUgdmlldyBleHRlbnNpb24gYWN0aW9uPC9oND4KLUluIHRoZSBOYXZpZ2F0b3IgVmlldywgc2VsZWN0IGEgZmlsZSB3aXRoIGV4dGVuc2lvbiAucmVhZG1lLiBJZiB0aGVyZSBpc24ndAotb25lIGNyZWF0ZSBhIGZpbGUgd2l0aCB0aGF0IGV4dGVuc2lvbi4gT24gdGhlIGxvY2FsIHRvb2xiYXIgb2YgdGhlIE5hdmlnYXRvcgotVmlldywgeW91IHdpbGwgc2VlIGEgYnV0dG9uIHdob3NlIGhvdmVyIGhlbHAgc2F5cyBSdW4gUmVhZG1lIFZpZXcgRXh0ZW5zaW9uLiZuYnNwOwotQ2xpY2sgb24gdGhpcyBidXR0b24uJm5ic3A7IEEgZGlhbG9nIHdpbGwgcG9wdXAgc2F5aW5nIFZpZXcgQWN0aW9uIGV4ZWN1dGVkLgotPGg0PgotUG9wdXAgbWVudXM8L2g0PgotSW4gdGhlIE5hdmlnYXRvciBWaWV3LCBzZWxlY3QgYSBmaWxlIHdpdGggZXh0ZW5zaW9uIC5yZWFkbWUuJm5ic3A7IElmIHRoZXJlCi1pc24ndCBvbmUgY3JlYXRlIGEgZmlsZSB3aXRoIHRoYXQgZXh0ZW5zaW9uLiZuYnNwOyBTZWxlY3QgdGhlIGZpbGUgdG8gYnJpbmcKLXVwIHRoZSBwb3B1cCBtZW51LiZuYnNwOyBOb3RpY2UgdGhlcmUgaXMgYSBtZW51IGl0ZW0gdGhhdCBzYXlzIFNob3cgUmVhZG1lCi1BY3Rpb24gaW4gdGhlIHBvcHVwIG1lbnUuJm5ic3A7IENob29zZSB0aGlzIG1lbnUgaXRlbSB0byBvcGVuIGEgZGlhbG9nCi10aGF0IHNheXMgUG9wdXAgTWVudSBBY3Rpb24gRXhlY3V0ZWQuCi08aDQ+Ci1QcmVmZXJlbmNlIHBhZ2U8L2g0PgotRnJvbSB0aGUgV2luZG93IG1lbnUsIHNlbGVjdCBQcmVmZXJlbmNlcy4mbmJzcDsgQ2xpY2sgb24gdGhlIHBhZ2UgY2FsbGVkCi1SZWFkbWUgRXhhbXBsZS4mbmJzcDsgVGhpcyBzaG93cyBhbiBleGFtcGxlIG9mIGEgcHJlZmVyZW5jZSBwYWdlLgotPGg0PgotUHJvcGVydHkgcGFnZTwvaDQ+Ci1JbiB0aGUgTmF2aWdhdG9yIFZpZXcsIHNlbGVjdCBhIGZpbGUgd2l0aCBleHRlbnNpb24gLnJlYWRtZS4mbmJzcDsgSWYgdGhlcmUKLWlzbid0IG9uZSBjcmVhdGUgYSBmaWxlIHdpdGggdGhhdCBleHRlbnNpb24uJm5ic3A7IFNlbGVjdCB0aGUgZmlsZSB0byBicmluZwotdXAgdGhlIHBvcHVwIG1lbnUsIHRoZW4gc2VsZWN0IHRoZSBQcm9wZXJ0aWVzIG1lbnUgaXRlbS4mbmJzcDsgQ2xpY2sgb24KLXRoZSBwYWdlIGNhbGxlZCBSZWFkbWUgVG9vbCB0byBzZWUgYW4gZXhhbXBsZSBvZiBhIHByb3BlcnR5IHBhZ2UuCi08aDQ+Ci1SZWFkbWUgZmlsZSBlZGl0b3I8L2g0PgotVGhlIFJlYWRtZSBGaWxlIEVkaXRvciBpcyB0aGUgZGVmYXVsdCBlZGl0b3IgZm9yIGZpbGVzIG9mIHR5cGUgKi5yZWFkbWUuJm5ic3A7Ci1DcmVhdGUgYSBmaWxlIHdpdGggZXh0ZW5zaW9uIC5yZWFkbWUgYW5kIG9wZW4gdGhlIGZpbGUgYnkgZG91YmxlIGNsaWNraW5nCi1vbiBpdCwgb3IgYnkgYnJpbmdpbmcgdXAgdGhlIHBvcHVwIG1lbnUsJm5ic3A7IHNlbGVjdGluZyBPcGVuIFdpdGgsIHRoZW4KLXNlbGVjdGluZyBSZWFkbWUgRmlsZSBFZGl0b3IgZnJvbSB0aGUgc3ViIG1lbnUuJm5ic3A7IE5vdGljZSB0aGUgZWRpdG9yCi1oYXMgYW4gaWNvbiB3aXRoIGEgcGVuY2lsLiZuYnNwOyBUaGlzIGlzIHRoZSBlZGl0b3IgdGhhdCB0aGUgcmVhZG1lIHRvb2wKLXVzZXMgYnkgZGVmYXVsdCBmb3IgZmlsZXMgb2YgdHlwZSAqLnJlYWRtZS4KLTxoND4KLVJlYWRtZSBFZGl0b3IgQWN0aW9uczwvaDQ+Ci1UaGlzIGRlbW9uc3RyYXRlcyBhbiBleGFtcGxlIG9mIGFjdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSBvbmx5IHRvIGEgcGFydGljdWxhcgotZWRpdG9yLiZuYnNwOyBXaGVuIGEgcmVhZG1lIGZpbGUgZWRpdG9yIGhhcyBmb2N1cywgbm90aWNlIDQgYWRkaXRpb25hbAotdG9vbCBiYXIgYnV0dG9ucyAtIFJ1biBSZWFkbWUgRWRpdG9yIEV4dGVuc2lvbiwgUmVhZG1lIEVkaXRvciBBY3Rpb24gMSwKLVJlYWRtZSBFZGl0b3IgQWN0aW9uIDIsIFJlYWRtZSBFZGl0b3IgQWN0aW9uIDMuCi08cD5BIHB1bGwgZG93biBtZW51IG5hbWVkIFJlYWRtZSBhcHBlYXJzIHdoZW4gYSByZWFkbWUgZmlsZSBlZGl0b3IgaGFzCi1mb2N1cy4mbmJzcDsgSXQgY29udGFpbnMgdGhlIGFjdGlvbnMgcHJldmlvdXNseSBkZXNjcmliZWQ6IFJlYWRtZSBFZGl0b3IKLUFjdGlvbiAxLCBSZWFkbWUgRWRpdG9yIEFjdGlvbiAyLCBSZWFkbWUgRWRpdG9yIEFjdGlvbiAzLgotPGg0PgotUmVhZG1lIHNlY3Rpb25zIHZpZXc8L2g0PgotVG8gc2VlIHRoaXMgUmVhZG1lIFNlY3Rpb25zIHZpZXcsIGZyb20gdGhlIFdpbmRvdyBtZW51IHNlbGVjdCBTaG93Ci1WaWV3LCB0aGVuIHNlbGVjdCBPdGhlci4uLiBmcm9tIHRoZSBzdWIgbWVudS4mbmJzcDsgRXhwYW5kIHRoZSBSZWFkbWUgaXRlbQotYW5kIHRoZW4gc2VsZWN0IFJlYWRtZSBTZWN0aW9ucy4mbmJzcDsgVGhpcyB3aWxsIHNob3cgYSBsaXN0IG9mIHRoZSBzZWN0aW9ucwotaW4gdGhlIGN1cnJlbnQgKi5yZWFkbWUgZmlsZSB3aGVuIGEgLnJlYWRtZSBmaWxlIGlzIHNlbGVjdGVkIGluIHRoZSBOYXZpZ2F0b3IKLVZpZXcuJm5ic3A7IFlvdSBjYW4gYWxzbyBzZWUgdGhlIHN0cnVjdHVyZSBvZiBhICoucmVhZG1lIGZpbGUgaW4gdGhlIE91dGxpbmUKLXZpZXcuCi08cD5BIGZpbGUgd2l0aCBleHRlbnNpb24gLnJlYWRtZSBjYW4gYmUgYnJva2VuIGRvd24gaW50byBzZWN0aW9ucyB3aGVuCi1lYWNoIHNlY3Rpb24gYmVnaW5zIHdpdGggYSBudW1iZXIuJm5ic3A7IEZvciBleGFtcGxlLCBpZiB0aGUgZm9sbG93aW5nCi10ZXh0IHdlcmUgZW50ZXJlZCBpbnRvIHRoZSByZWFkbWUgZmlsZSBlZGl0b3IsIHRoZSByZWFkbWUgdG9vbCB3b3VsZCBkZXRlY3QKLTIgc2VjdGlvbnMuJm5ic3A7IFRvIHNlZSBob3cgc2VjdGlvbnMgYXJlIGRldGVjdGVkIGluIHRoZSByZWFkbWUgdG9vbCwKLXR5cGUgc29tZSB0ZXh0IGluIHRoZSByZWFkbWUgZmlsZSBlZGl0b3IsIHNhdmUgdGhlIGZpbGUgYnkgZWl0aGVyIHR5cGluZwotQ1RSTC1TIG9yIHNlbGVjdGluZyZuYnNwOyBGaWxlLT5TYXZlLiBPcGVuIHRoZSBSZWFkbWUgU2VjdGlvbnMgdmlldyBhbmQKLXNlbGVjdCB0aGUgLnJlYWRtZSBmaWxlIGluIHRoZSBOYXZpZ2F0b3IgVmlldy4KLTxwPkV4YW1wbGUgdGV4dDoKLTxwPjk5LjEgVGhpcyBpcyBteSBmaXJzdCBzZWN0aW9uCi08YnI+VGhpcyBpcyBzb21lIHRleHQgaW4gbXkgZmlyc3Qgc2VjdGlvbi4KLTxwPjk5LjEuMSBUaGlzIGlzIGEgc3ViIHNlY3Rpb24KLTxicj5UaGlzIGlzIHNvbWUgdGV4dCBpbiBteSBzdWItc2VjdGlvbi4KLTxoND5EcmFnIGFuZCBEcm9wPC9oND4KLTxwPlRoZSBEcmFnIGFuZCBEcm9wIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHNlZW4gYnkgc2VsZWN0aW5nIGEgc2VjdGlvbiBpbiB0aGUKLU91dGxpbmUgVmlldyBhbmQgZHJhZ2dpbmcgdGhlIHNlbGVjdGlvbiBvdmVyIHRvcCBvZiBhIHRleHQgZmlsZS4gVGhlIGNvbnRlbnRzIG9mCi10aGUgc2VsZWN0aW9uIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGZpbGUuCi08aDQ+Ci1IZWxwIGNvbnRyaWJ1dGlvbjwvaDQ+Ci1UaGUgcmVhZG1lIHRvb2wgZXhhbXBsZSBhbHNvIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIGFuZCBpbXBsZW1lbnQgY29udGV4dAotaGVscCBvbiBhbGwgb2YgdGhlIGV4dGVuc2lvbnMgaXQgc3VwcGxpZXMgLSBhIHZpZXcsIHZhcmlvdXMgYWN0aW9ucyBhbmQKLWEgd2l6YXJkIHBhZ2UuJm5ic3A7IFRvIGdldCBjb250ZXh0IGhlbHAgb24gYW4gYWN0aW9uLCBob3ZlciBvdmVyIHRoZSBtZW51Ci1pdGVtLCBidXQgZG8gbm8gc2VsZWN0IGl0LCB0aGVuIGhpdCB0aGUgRjEga2V5LiZuYnNwOyBZb3UgY2FuIGFsc28gZ2V0Ci1jb250ZXh0IHNlbnNpdGl2ZSAoRjEpIGhlbHAgb24gdGhlIFJlYWRtZSBTZWN0aW9ucyB2aWV3IGFuZCB0aGUgRXhhbXBsZQotQ3JlYXRpb24gV2l6YXJkcyBwYWdlIChpbiB0aGUgTmV3IHdpemFyZCkuCi08YnI+Jm5ic3A7Ci08aDM+Ci1EZXRhaWxzPC9oMz4KLVRoZSBSZWFkbWUgVG9vbCBleGFtcGxlIGRlY2xhcmVzIG9uZSBleHRlbnNpb24gcG9pbnQgYW5kIHN1cHBsaWVzIGEgbnVtYmVyCi1vZiBleHRlbnNpb25zLiZuYnNwOyBUaGUgZXh0ZW5zaW9ucyBzdXBwbGllZCBhcmUgcXVpdGUgY29tcHJlaGVuc2l2ZSBpbgotdW5kZXJzdGFuZGluZyBob3cgdGhlIFdvcmtiZW5jaCBmdW5jdGlvbnMsIGFzIGl0IHV0aWxpemVzIGEgbnVtYmVyIG9mIHRoZQotbW9yZSBpbnRlcmVzdGluZyBleHRlbnNpb24gcG9pbnRzIGRlY2xhcmVkIGJ5IHRoZSB3b3JrYmVuY2guJm5ic3A7IFN1cHBsaWVkCi1leHRlbnNpb25zIGluY2x1ZGVkIGluIHRoaXMgZXhhbXBsZSBhcmUgdmlld3MgYW5kIHZpZXcgYWN0aW9ucywgcHJlZmVyZW5jZQotcGFnZXMsIHByb3BlcnR5IHBhZ2VzLCB3aXphcmRzLCBlZGl0b3JzIGFuZCBlZGl0b3IgYWN0aW9ucywgcG9wdXAgbWVudXMsCi1hY3Rpb24gc2V0cywgaGVscCBjb250cmlidXRpb25zLCBoZWxwIGNvbnRleHRzLCBhbmQgZHJvcCBhY3Rpb25zLgotPHA+VGhpcyBleGFtcGxlIGFsc28gc3VwcGxpZXMgYW4gZXh0ZW5zaW9uIHBvaW50IGRlY2xhcmVkIGluIHRoZSBwbHVnLWluLi4KLVRoZSBjbGFzcyBJUmVhZG1lRmlsZVBhcnNlciBpcyByZXF1aXJlZCBmb3IgYW55IHBsdWctaW4gdGhhdCB1c2VzIHRoZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLnNlY3Rpb25QYXJzZXIKLWV4dGVuc2lvbiB0aGF0IHRoaXMgZXhhbXBsZSBkZWZpbmVzLiBUaGUgY2xhc3MgRGVmYXVsdFNlY3Rpb25QYXJzZXIgaXMKLWFuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSVJlYWRtZUZpbGVQYXJzZXIuCi08cD5UaGUgY2xhc3MgUmVhZG1lRWRpdG9yIGltcGxlbWVudHMgSUVkaXRvclBhcnQgYW5kIGlzIGRlZmluZWQgYXMgYW4gZWRpdG9yCi1vbiBmaWxlcyB3aXRoIHRoZSBleHRlbnNpb24gLnJlYWRtZSBpbiB0aGUgcGx1Z2luLnhtbCB1c2luZyB0aGUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycwotZXh0ZW5zaW9uIHBvaW50LiBUaGUgY2xhc3MgUmVhZG1lU2VjdGlvbnNWaWV3IGltcGxlbWVudHMgSVZpZXdQYXJ0IGFuZAotaXMgZGVmaW5lZCBhcyBhIHZpZXcgdXNpbmcgdGhlIG9yZy5lY2xpcHNlLnVpLnZpZXdzIGV4dGVuc2lvbiBwb2ludC4gVGhpcwotZXh0ZW5zaW9uIHBvaW50IGFsc28gZGVmaW5lcyBhIGNhdGVnb3J5IGZvciB0aGUgdmlldyBmb3IgdXNlIGluIHZpZXcgc2VsZWN0aW9uLgotPHA+VHdvIHR5cGVzIG9mIHByZWZlcmVuY2Ugc2V0dGluZ3MgYXJlIGRlZmluZWQgaW4gdGhpcyBleGFtcGxlLCB3b3JrYmVuY2gKLXByZWZlcmVuY2VzIGFuZCByZXNvdXJjZSBwcm9wZXJ0aWVzLiBUaGUgd29ya2JlbmNoIHByZWZlcmVuY2UgaXMgZGVmaW5lZAotaW4gY2xhc3MgUmVhZG1lUHJlZmVyZW5jZVBhZ2Ugd2hpY2ggaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXNvIHRoYXQgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgV2luZG93LSZndDtQcmVmZXJlbmNlcyBkaWFsb2cuIFRoZSBjbGFzcwotaXMgZGVmaW5lZCBpbiB0aGUgZXh0ZW5zaW9uIHBvaW50IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyBpbiB0aGUKLXBsdWdpbi54bWwuIFRoZSB0d28gcmVzb3VyY2UgcHJvcGVydGllcyBwYWdlcyBhcmUgUmVhZG1lRmlsZVByb3BlcnR5UGFnZQotYW5kIFJlYWRtZUZpbGVQcm9wZXJ0eVBhZ2UyIGJvdGggb2Ygd2hpY2ggaW1wbGVtZW50IElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UuCi1UaGV5IGFyZSBib3RoIGRlZmluZWQgdG8gYmUgaW52b2tlZCBvbiB0aGUgSUZpbGUgdHlwZSBieSB0aGUgb2JqZWN0Q2xhc3MKLXRhZyBpbiB0aGUgcGx1Z2luLnhtbCBpbiB0aGUgb3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyBleHRlbnNpb24gcG9pbnQuCi08cD5UaGUgY2xhc3MgUmVhZG1lQ3JlYXRpb25XaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIGFuZCBpcyBkZWZpbmVkCi1pbiB0aGUgb3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyBleHRlbnNpb24gcG9pbnQgaW4gdGhlIHBsdWdpbi54bWwuIFRoaXMKLWV4dGVuc2lvbiBwb2ludCBhbHNvIGRlZmluZXMgdGhlIGNhdGVnb3J5IHRoYXQgdGhlIHdpemFyZCB0aGF0IGlzIHNob3duCi13aGVuIHRoZSB1c2VyIHNlbGVjdHMgRmlsZS0mZ3Q7TmV3LSZndDtFeGFtcGxlLi4uLgotPHA+U2V2ZXJhbCBhY3Rpb24gc3R1YnMgYXJlIGFkZGVkIHRvIHRoaXMgZXhhbXBsZS4gVGhlIGFjdGlvbiBzZXQgZGVjbGFyZXMKLWEgbWVudSBsYWJlbGVkIFJlYWRtZSBGaWxlIEVkaXRvcjxiPiA8L2I+dG8gYmUgaW5jbHVkZWQgaW4gdGhlIHdvcmtiZW5jaAotd2luZG93IG1lbnUgYmFyIHVzaW5nIHRoZSBleHRlbnNpb24gcG9pbnQgb3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cy4gSXQKLWFsc28gZGVmaW5lcyBhbiBhY3Rpb24gZm9yIHRoZSB3b3JrYmVuY2ggdG9vbGJhciBhbmQgbWVudSBiYXIgdXNpbmcgdGhlCi10YWdzIHRvb2xiYXJQYXRoIGFuZCBtZW51YmFyUGF0aC4gSXQgdXNlcyB0aGUgY2xhc3MgV2luZG93QWN0aW9uRGVsZWdhdGUKLXdoaWNoIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHRvIGltcGxlbWVudCB0aGUgYWN0aW9uLgotVGhlIGFjdGlvbiBmb3IgdGhlIHBvcHVwIG1lbnUgaXMgZGVmaW5lZCBhcyBhbiBvYmplY3RDb250cmlidXRpb24gYnkgdGhlCi1jbGFzcyBQb3B1cE1lbnVBY3Rpb25EZWxlZ2F0ZSBpbiZuYnNwOyB0aGUgZXh0ZW5zaW9uIHBvaW50IG9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMuCi1Qb3B1cE1lbnVBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSBhbmQgdXNlcyB0aGUgSVdvcmtiZW5jaFBhcnQKLXByb3ZpZGVkIHRvIG9wZW4gYSBtZXNzYWdlIGRpYWxvZy4gVGhlIHZpZXcgYWN0aW9uIFZpZXdBY3Rpb25EZWxlZ2F0ZSBpcwotZGVmaW5lZCBpbiB0aGUgZXh0ZW5zaW9uIHBvaW50IG9yZy5lY2xpcHNlLnVpLnZpZXdBY3Rpb25zIGFuZCBpbXBsZW1lbnRzCi1JVmlld0FjdGlvbkRlbGVnYXRlLiBUaGUgVmlldyBpdCBhcHBlYXJzIGluIGlzIGRlZmluZWQgYnkgdGhlIHRhZyB0YXJnZXRJRAotd2hpY2ggaW4gdGhpcyBleGFtcGxlIGlzIG9yZy5lY2xpcHNlLnVpLnZpZXdzLlJlc291cmNlTmF2aWdhdG9yLiBUaGUgZWRpdG9yCi1hY3Rpb24gaXMgZGVmaW5lZCBieSB0aGUgY2xhc3MgRWRpdG9yQWN0aW9uRGVsZWdhdGUgd2hpY2ggaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUKLWFuZCBpcyBhZGRlZCB1c2luZyB0aGUgb3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyBleHRlbnNpb24gcG9pbnQuIFRoZQotZWRpdG9yIHRoYXQgaXQgaXMgYXBwbGllZCB0byBpcyBkZWZpbmVkIGJ5IHRoZSB0YWcgdGFyZ2V0SUQgd2hpY2ggaW4gdGhpcwotZXhhbXBsZSBpcyBkZWZpbmVkIG9uIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wuUmVhZG1lRWRpdG9yLjxwPlRoZQotY2xhc3MgUmVhZG1lRHJvcEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSURyb3BEZWxlZ2F0ZS4gSURyb3BEZWxlZ2F0ZXMgYXJlCi1pbmZvcm1lZCBldmVyeSB0aW1lIHRoZXJlIGlzIGEgZHJvcCBhY3Rpb24gcGVyZm9ybWVkIGluIHRoZSB3b3JrYmVuY2ggLiBUaGUKLWV4dGVuc2lvbiBwb2ludCBmb3IgdGhpcyBhY3Rpb24gaXMgb3JnLmVjbGlwc2UudWkuZHJvcEFjdGlvbnMuCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvZG9jLnppcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvZG9jLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFlOGFhOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2RvYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2RvYy9oZ2xlZ2FsLmh0bSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvZG9jL2hnbGVnYWwuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDEwODFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvZG9jL2hnbGVnYWwuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43MyBbZW5dIChXaW45ODsgVSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+TGVnYWwgTm90aWNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgzPgotPGEgTkFNRT0iTm90aWNlcyI+PC9hPk5vdGljZXM8L2gzPgotKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvZG9jL29yZ19lY2xpcHNlX3VpX2V4YW1wbGVzX3JlYWRtZXRvb2wuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvZG9jL29yZ19lY2xpcHNlX3VpX2V4YW1wbGVzX3JlYWRtZXRvb2wuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2NDYyYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2RvYy9vcmdfZWNsaXBzZV91aV9leGFtcGxlc19yZWFkbWV0b29sLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlJlYWRtZSBUb29sIEV4dGVuc2lvbiBQb2ludHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4MDAwODAiPgotCi08Y2VudGVyPgotPGgxPgotUmVhZG1lIFRvb2w8L2gxPjwvY2VudGVyPgotVGhlIFJlYWRtZSBUb29sIGlzIHByb3ZpZGVkIGFzIGFuIGV4YW1wbGUgZm9yIHRvb2wgZGV2ZWxvcGVycy4gSXQgZGVtb25zdHJhdGVzCi10aGUgZXh0ZW5zaW9uIG9mIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgd29ya2JlbmNoLCBib3RoIHZpc3VhbGx5IGFuZCBmdW5jdGlvbmFsbHkuCi1BcyB3ZWxsLCB0aGUgUmVhZG1lIFRvb2wgcHJvdmlkZXMgZXh0ZW5zaW9uIHBvaW50cyBvZiBpdHMgb3duLgotPHA+Ci08aHIgV0lEVEg9IjEwMCUiPgotPGgxPgotRXh0ZW5zaW9uIFBvaW50czwvaDE+Ci1UaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBwb2ludHMgY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIHRoZSBSZWFkbWUgVG9vbDoKLTx1bD4KLTxsaT4KLTxhIGhyZWY9Im9yZ19lY2xpcHNlX3VpX2V4YW1wbGVzX3JlYWRtZXRvb2xfc2VjdGlvblBhcnNlci5odG1sIj5vcmcuZWNsaXBzZS51aS5yZWFkbWV0b29sLnNlY3Rpb25QYXJzZXI8L2E+PC9saT4KLTwvdWw+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvZG9jL29yZ19lY2xpcHNlX3VpX2V4YW1wbGVzX3JlYWRtZXRvb2xfc2VjdGlvblBhcnNlci5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9kb2Mvb3JnX2VjbGlwc2VfdWlfZXhhbXBsZXNfcmVhZG1ldG9vbF9zZWN0aW9uUGFyc2VyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTdlODAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9kb2Mvb3JnX2VjbGlwc2VfdWlfZXhhbXBsZXNfcmVhZG1ldG9vbF9zZWN0aW9uUGFyc2VyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlJFQURNRSBUb29sIEV4dGVuc2lvbiBQb2ludHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4MDAwODAiPgotCi08Y2VudGVyPgotPGgxPgotU2VjdGlvbiBQYXJzZXI8L2gxPjwvY2VudGVyPgotPGI+PGk+SWRlbnRpZmllcjogPC9pPjwvYj5vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLnNlY3Rpb25QYXJzZXIKLTxwPjxiPjxpPkRlc2NyaXB0aW9uOiA8L2k+PC9iPlRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyB0b29scyB0byBwcm92aWRlCi1hIHBhcnNlciBmb3IgUmVhZG1lIGZpbGVzIHdoaWNoIGlkZW50aWZpZXMgdGhlIHNlY3Rpb25zIG9mIHRoZSBmaWxlLgotVGhlIHNlY3Rpb25zIGRldGVybWluZWQgYnkgdGhpcyBwYXJzZXIgd2lsbCBzaG93IHVwIGluIHRoZSBvdXRsaW5lciB3aGVuIGEKLVJlYWRtZSBmaWxlIGlzIG9wZW4gaW4gdGhlIGVkaXRvci4gVGhlIHNlY3Rpb25zIHdpbGwgYWxzbyBhcHBlYXIgaW4gdGhlIAotIlJlYWRtZSBzZWN0aW9ucyIgdmlldy4KLTxwPlRoZSBkZWZhdWx0IHNlY3Rpb24gcGFyc2VyIHByb3ZpZGVkIHdpdGggdGhlIFJlYWRtZSBUb29sIGlzIGEgc2ltcGxlIHBhcnNlcgotd2hpY2ggY29uc2lkZXJzIHNlY3Rpb25zIHRvIGJlIG51bWJlcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiBUb3AtbGV2ZWwKLXNlY3Rpb25zIGFyZSBzaWduaWZpZWQgYnkgYSBudW1iZXIgZm9sbG93ZWQgYnkgYSBwZXJpb2QsIHN1Y2ggYXMgaW4gdGhlIGZvbGxvd2luZwotcmVndWxhciBleHByZXNzaW9uOiAiWzAtOV0rXC4iLiBFeGFtcGxlcyBhcmUgIjEuIiwgIjAuIiwgYW5kICIxMjM0NS4iLgotU3Vic2VjdGlvbnMgYXJlIHNpZ25pZmllZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uOiAiKFswLTldK1wuKStbMC05XSsiLiBFeGFtcGxlcwotb2Ygc3Vic2VjdGlvbnMgYXJlICIxLjEiLCAiMS4xLjEuMSIsIGFuZCAiMTIzLjQ1Ni43ODkwIi4gQW55IGxldmVsIG9mIHN1YnNlY3Rpb24KLW5lc3RpbmcgbWF5IG9jY3VyLiBTZWN0aW9uIGFuZCBzdWJzZWN0aW9uIG1hcmtlcnMgbXVzdCBvY2N1ciBiZWZvcmUgYW55IG90aGVyCi1ub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIG9uIGEgbGluZS4KLTxwPjxiPjxpPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaT48L2I+Ci08cD48dHQ+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBzZWN0aW9uUGFyc2VyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IG5hbWUgJm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlkICZuYnNwOyZuYnNwOyBDREFUQSAjUkVRVUlSRUQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2xhc3MgQ0RBVEEgI1JFUVVJUkVEPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7ID48L3R0PgotPHVsPgotPGxpPgotPGI+bmFtZTwvYj4gLSBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgY29udHJpYnV0aW9uLjwvbGk+Ci0KLTxsaT4KLTxiPmlkPC9iPiAtIGEgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBleHRlbnNpb24uPC9saT4KLQotPGxpPgotPGI+Y2xhc3M8L2I+IC0gYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgdGhpcyBleHRlbnNpb24uPC9saT4KLTwvdWw+Ci0KLTxiPjxpPkV4YW1wbGVzOjwvaT48L2I+Ci08cD5UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzZWN0aW9uUGFyc2VyIGV4dGVuc2lvbiBwb2ludDoKLTxwPjx0dD4mbmJzcDsmbmJzcDsmbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLnNlY3Rpb25QYXJzZXIiPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtwYXJzZXI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgbmFtZT0iQ3VzdG9tIFJFQURNRSBTZWN0aW9uIFBhcnNlciI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWQ9ImNvbS54eXouQ3VzdG9tU2VjdGlvblBhcnNlciI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2xhc3M9ImNvbS54eXouQ3VzdG9tU2VjdGlvblBhcnNlciI+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0Oy9wYXJzZXI+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jmx0Oy9leHRlbnNpb24+PC90dD4KLTxwPkluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgY2xhc3MgY29tLnh5ei5DdXN0b21TZWN0aW9uUGFyc2VyIHdpbGwgYmUgdXNlZCBhcwotdGhlIHNlY3Rpb24gcGFyc2VyIGZvciBSZWFkbWUgZmlsZXMuCi08cD48Yj48aT5BUEkgSW5mb3JtYXRpb246IDwvaT48L2I+VmFsdWUgb2YgdGhlIGFjdGlvbiBhdHRyaWJ1dGUgPGI+Y2xhc3M8L2I+Ci1tdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlCi1vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLklSZWFkbWVGaWxlUGFyc2VyLiBUaGlzIGludGVyZmFjZSBpcyBsb2FkZWQgYXMgCi1sYXRlIGFzIHBvc3NpYmxlIHRvIGF2b2lkIGxvYWRpbmcgdGhlIGVudGlyZSB0b29sIGJlZm9yZSBpdCBpcyByZWFsbHkgbmVlZGVkLgotPHA+PGI+PGk+U3VwcGxpZWQgSW1wbGVtZW50YXRpb246IDwvaT48L2I+QXMgZGVzY3JpYmVkIGFib3ZlLCB0aGUgZGVmYXVsdCBzZWN0aW9uCi1wYXJzZXIgdXNlcyBhIHNpbXBsZSBncmFtbWFyIG9mIHNlY3Rpb25zIGlkZW50aWZpZWQgYnkgbnVtYmVycyBmb2xsb3dlZCBieSBwZXJpb2RzLAotYW5kIHN1YnNlY3Rpb25zIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm4gb2YgYSBudW1iZXIgZm9sbG93ZWQgYnkgYSBwZXJpb2QsIHJlcGVhdGVkCi1hbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHRpbWVzLCBhbmQgZW5kaW5nIHdpdGggYSBudW1iZXIuCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvY3Rvb2wxNi9hY3Rpb24xLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvY3Rvb2wxNi9hY3Rpb24xLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwNzdlZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL2N0b29sMTYvYWN0aW9uMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL2N0b29sMTYvYWN0aW9uMi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL2N0b29sMTYvYWN0aW9uMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTNlMTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9jdG9vbDE2L2FjdGlvbjIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9jdG9vbDE2L2FjdGlvbjMuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9jdG9vbDE2L2FjdGlvbjMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzE0Zjc0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvY3Rvb2wxNi9hY3Rpb24zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvY3Rvb2wxNi9vcGVuYnJ3c3IuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9jdG9vbDE2L29wZW5icndzci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNDA0MzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9jdG9vbDE2L29wZW5icndzci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL2R0b29sMTYvYWN0aW9uMS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL2R0b29sMTYvYWN0aW9uMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNTA4MzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9kdG9vbDE2L2FjdGlvbjEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9kdG9vbDE2L2FjdGlvbjIuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9kdG9vbDE2L2FjdGlvbjIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjk3OGRmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvZHRvb2wxNi9hY3Rpb24yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvZHRvb2wxNi9hY3Rpb24zLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvZHRvb2wxNi9hY3Rpb24zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlmMWU5NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL2R0b29sMTYvYWN0aW9uMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL2R0b29sMTYvb3BlbmJyd3NyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvZHRvb2wxNi9vcGVuYnJ3c3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmEyZGY4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvZHRvb2wxNi9vcGVuYnJ3c3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9ldG9vbDE2L2FjdGlvbjEuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9ldG9vbDE2L2FjdGlvbjEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWZiMWE2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvZXRvb2wxNi9hY3Rpb24xLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvZXRvb2wxNi9hY3Rpb24yLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvZXRvb2wxNi9hY3Rpb24yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwMWQyZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL2V0b29sMTYvYWN0aW9uMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL2V0b29sMTYvYWN0aW9uMy5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL2V0b29sMTYvYWN0aW9uMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMTk5YjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9ldG9vbDE2L2FjdGlvbjMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9ldG9vbDE2L29wZW5icndzci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL2V0b29sMTYvb3BlbmJyd3NyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiZThjYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL2V0b29sMTYvb3BlbmJyd3NyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvb2JqMTYvZWRpdG9yLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvb2JqMTYvZWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ4ZDlhOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL29iajE2L2VkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL29iajE2L25ld3JlYWRtZV93aXouZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9vYmoxNi9uZXdyZWFkbWVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzODI2ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL29iajE2L25ld3JlYWRtZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9vYmoxNi91c2VyZWRpdG9yLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvb2JqMTYvdXNlcmVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDc5MDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9pY29ucy9vYmoxNi91c2VyZWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvdmlldzE2L3NlY3Rpb25zLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvdmlldzE2L3NlY3Rpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA4ZmQ3YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL3ZpZXcxNi9zZWN0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sL2ljb25zL3dpemJhbi9uZXdyZWFkbWVfd2l6LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvd2l6YmFuL25ld3JlYWRtZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjY1YWFmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvaWNvbnMvd2l6YmFuL25ld3JlYWRtZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MWJhZDIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBsdWdpbi5uYW1lID0gUmVhZG1lIEZpbGUgRWRpdGluZyBUb29sCi1QbHVnaW4ucHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLUV4dFBvaW50LnNlY3Rpb25QYXJzZXIgPSBTZWN0aW9uIHBhcnNlciBmb3IgUmVhZG1lIGZpbGUgZWRpdG9yCi1TZWN0aW9uUGFyc2VyLm5hbWUgPSBEZWZhdWx0IHNlY3Rpb24gcGFyc2VyIGZvciBSZWFkbWUgdG9vbAotQWN0aW9uU2V0Lm5hbWUgPSBSZWFkTWUgQWN0aW9ucwotQWN0aW9uU2V0Lm1lbnUgPSBSZWFkbWUgJkZpbGUgRWRpdG9yCi1SZWFkbWVBY3Rpb24ubGFiZWwgPSAmT3BlbiBSZWFkbWUgQnJvd3NlcgotUmVhZG1lQWN0aW9uLnRvb2x0aXAgPSBPcGVuIFJlYWRtZSBCcm93c2VyCi1SZWFkbWVSZXRhcmdldEFjdGlvbi5sYWJlbCA9ICZPcGVuIFJlYWRtZSBCcm93c2VyIChSZXRhcmdldCkKLVJlYWRtZVJldGFyZ2V0QWN0aW9uLnRvb2x0aXAgPSBPcGVuIFJlYWRtZSBCcm93c2VyIChSZXRhcmdldCkKLVJlYWRtZVJlbGFiZWxSZXRhcmdldEFjdGlvbi5sYWJlbCA9ICZPcGVuIFJlYWRtZSBCcm93c2VyIChSZXRhcmdldCAtIExhYmVsIFVwZGF0ZSkKLVJlYWRtZVJlbGFiZWxSZXRhcmdldEFjdGlvbi50b29sdGlwID0gT3BlbiBSZWFkbWUgQnJvd3NlciAoUmV0YXJnZXQgLSBMYWJlbCBVcGRhdGUpCi1OZXdXaXphcmQuY2F0ZWdvcnkgPSBFeGFtcGxlIENyZWF0aW9uIFdpemFyZHMKLU5ld1dpemFyZC5uYW1lID0gUmVhZG1lIEZpbGUKLU5ld1dpemFyZC5kZXNjID0gQW4gZXhhbXBsZSBvZiBhIHdpemFyZCB0aGF0IGNyZWF0ZXMgc2FtcGxlIFJlYWRtZSBmaWxlCi1FZGl0b3JzLlJlYWRtZUVkaXRvciA9IFJlYWRtZSBGaWxlIEVkaXRvcgotVmlld3MuY2F0ZWdvcnkgPSAmUmVhZG1lCi1WaWV3cy5SZWFkbWVTZWN0aW9ucyA9IFJlYWRtZSBTZWN0aW9ucwotUHJlZmVyZW5jZVBhZ2UubmFtZSA9IFJlYWRtZSBFeGFtcGxlCi1Qcm9wZXJ0aWVzUGFnZS5maWxlUGFnZSA9IFJlYWRtZSBUb29sCi1Qcm9wZXJ0aWVzUGFnZS5maWxlUGFnZTIgPSBNb3JlIFJlYWRtZSBJbmZvCi1Qb3B1cE1lbnVzLmFjdGlvbiA9ICZTaG93IFJlYWRtZSBBY3Rpb24KLVBvcHVwTWVudS5SZXNvdXJjZU5hdi5sYWJlbCA9ICZSZWFkbWUgVmlldyBFeHRlbnNpb24KLVBvcHVwTWVudS5SZXNvdXJjZU5hdi50b29sdGlwID0gUnVuIFJlYWRtZSBWaWV3IEV4dGVuc2lvbgotRWRpdG9ycy5BY3Rpb24ubGFiZWwgPSAmUmVhZG1lIEVkaXRvciBFeHRlbnNpb24KLUVkaXRvcnMuQWN0aW9uLnRvb2x0aXAgPSBSdW4gUmVhZG1lIEVkaXRvciBFeHRlbnNpb24KLVJlYWRtZU1hcmtlci5uYW1lID0gUmVhZG1lIE1hcmtlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTQ2OTY0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5JUmVhZG1lRmlsZVBhcnNlciAgICAgICAtLT4KLTwhLS0gRXh0ZW5zaW9uIEltcGxlbWVudGF0aW9uOiBtdXN0IGltcGxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICB0aGUgZmlsZSdzIHNlY3Rpb24gYW5kIHN1YnNlY3Rpb24gc3RydWN0dXJlICAgICAgICAgICAgICAgLS0+Ci08IS0tIFB1cnBvc2U6IFByb3ZpZGUgYSBjdXN0b20gcGFyc2VyIGZvciBSZWFkbWUgZmlsZXMgd2hpY2ggZGV0ZXJtaW5lcyAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLnNlY3Rpb25QYXJzZXIgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZWN0aW9uUGFyc2VyIiBuYW1lPSIlRXh0UG9pbnQuc2VjdGlvblBhcnNlciIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5zZWN0aW9uUGFyc2VyIj4KLSAgICAgIDxwYXJzZXIKLSAgICAgICAgICAgIG5hbWU9IiVTZWN0aW9uUGFyc2VyLm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5EZWZhdWx0U2VjdGlvbnNQYXJzZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5EZWZhdWx0U2VjdGlvbnNQYXJzZXIiPgotICAgICAgPC9wYXJzZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlQWN0aW9uU2V0Lm5hbWUiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZ19lY2xpcHNlX3VpX2V4YW1wbGVzX3JlYWRtZXRvb2xfYWN0aW9uU2V0Ij4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBsYWJlbD0iJUFjdGlvblNldC5tZW51IgotICAgICAgICAgICAgICAgcGF0aD0id2luZG93L2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmdfZWNsaXBzZV91aV9leGFtcGxlc19yZWFkbWV0b29sIj4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgIG5hbWU9InNsb3QxIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgbmFtZT0ic2xvdDIiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICBuYW1lPSJzbG90MyI+Ci0gICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGlkPSJvcmdfZWNsaXBzZV91aV9leGFtcGxlc19yZWFkbWV0b29sX3JlYWRtZUFjdGlvbiIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJyZWFkbWUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5XaW5kb3dBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9jdG9vbDE2L29wZW5icndzci5naWYiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLm9wZW5fYnJvd3Nlcl9hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlUmVhZG1lQWN0aW9uLmxhYmVsIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9IndpbmRvdy9vcmdfZWNsaXBzZV91aV9leGFtcGxlc19yZWFkbWV0b29sL3Nsb3QxIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJVJlYWRtZUFjdGlvbi50b29sdGlwIj4KLSAgICAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICAgIG5hbWU9IioucmVhZG1lIgotICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVJlYWRtZVJldGFyZ2V0QWN0aW9uLmxhYmVsIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvY3Rvb2wxNi9vcGVuYnJ3c3IuZ2lmIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5vcGVuX2Jyb3dzZXJfYWN0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlUmVhZG1lUmV0YXJnZXRBY3Rpb24udG9vbHRpcCIKLSAgICAgICAgICAgICAgIHJldGFyZ2V0PSJ0cnVlIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9IndpbmRvdy9vcmdfZWNsaXBzZV91aV9leGFtcGxlc19yZWFkbWV0b29sL3Nsb3QxIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9InJlYWRtZSIKLSAgICAgICAgICAgICAgIGlkPSJvcmdfZWNsaXBzZV91aV9leGFtcGxlc19yZWFkbWV0b29sX3JlYWRtZVJldGFyZ2V0QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgYWxsb3dMYWJlbFVwZGF0ZT0idHJ1ZSIKLSAgICAgICAgICAgICAgIGlkPSJvcmdfZWNsaXBzZV91aV9leGFtcGxlc19yZWFkbWV0b29sX3JlYWRtZVJlbGFiZWxSZXRhcmdldEFjdGlvbiIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJyZWFkbWUiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9jdG9vbDE2L29wZW5icndzci5naWYiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLm9wZW5fYnJvd3Nlcl9hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlUmVhZG1lUmVsYWJlbFJldGFyZ2V0QWN0aW9uLmxhYmVsIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9IndpbmRvdy9vcmdfZWNsaXBzZV91aV9leGFtcGxlc19yZWFkbWV0b29sL3Nsb3QxIgotICAgICAgICAgICAgICAgcmV0YXJnZXQ9InRydWUiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlUmVhZG1lUmVsYWJlbFJldGFyZ2V0QWN0aW9uLnRvb2x0aXAiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlTmV3V2l6YXJkLmNhdGVnb3J5IgotICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkV4YW1wbGVzIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wubmV3Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlTmV3V2l6YXJkLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9uZXdyZWFkbWVfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5FeGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLm5ldyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLlJlYWRtZUNyZWF0aW9uV2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wud2l6YXJkcy5uZXcuZmlsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlTmV3V2l6YXJkLmRlc2MKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIG5hbWU9IiVFZGl0b3JzLlJlYWRtZUVkaXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL29iajE2L2VkaXRvci5naWYiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJyZWFkbWUiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLlJlYWRtZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wuUmVhZG1lRWRpdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wuUmVhZG1lRWRpdG9yIj4KLSAgICAgIDwvZWRpdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlVmlld3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbCI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiVWaWV3cy5SZWFkbWVTZWN0aW9ucyIKLSAgICAgICAgICAgIGljb249Imljb25zL3ZpZXcxNi9zZWN0aW9ucy5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLlJlYWRtZVNlY3Rpb25zVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLnZpZXdzLlNlY3Rpb25zVmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQcmVmZXJlbmNlUGFnZS5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wuUmVhZG1lUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5QYWdlMSI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lPSIlUHJvcGVydGllc1BhZ2UuZmlsZVBhZ2UiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLnJlYWRtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLlJlYWRtZUZpbGVQcm9wZXJ0eVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5GaWxlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZT0iJVByb3BlcnRpZXNQYWdlLmZpbGVQYWdlMiIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioucmVhZG1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wuUmVhZG1lRmlsZVByb3BlcnR5UGFnZTIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5GaWxlUGFnZTIiPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLnJlYWRtZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUG9wdXBNZW51cy5hY3Rpb24iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9jdG9vbDE2L29wZW5icndzci5naWYiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLm9wZW5fYnJvd3Nlcl9hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLlBvcHVwTWVudUFjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5hY3Rpb24xIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8dmlld2VyQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5vdXRsaW5lIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wyIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUG9wdXBNZW51cy5hY3Rpb24iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9jdG9vbDE2L29wZW5icndzci5naWYiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLm9wZW5fYnJvd3Nlcl9hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLlZpZXdBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5hY3Rpb24xIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC92aWV3ZXJDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3QWN0aW9ucyI+Ci0gICAgICA8dmlld0NvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlJlc291cmNlTmF2aWdhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wudmMxIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLnZhMSIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5WaWV3QWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvZWRpdG9yLmdpZiIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wudmlld19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlUG9wdXBNZW51LlJlc291cmNlTmF2LmxhYmVsIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVQb3B1cE1lbnUuUmVzb3VyY2VOYXYudG9vbHRpcCI+Ci0gICAgICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgICBuYW1lPSIqLnJlYWRtZSIKLSAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC92aWV3Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+Ci0gICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5SZWFkbWVFZGl0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5lYzEiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVFZGl0b3JzLkFjdGlvbi5sYWJlbCIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL29iajE2L2VkaXRvci5naWYiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlRWRpdG9ycy5BY3Rpb24udG9vbHRpcCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLkVkaXRvckFjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9IlJlYWRtZUVkaXRvciIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLmVhMSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+Ci0gICAgICA8Y29udGV4dHMKLSAgICAgICAgICAgIGZpbGU9IkhlbHBDb250ZXh0cy54bWwiPgotICAgICAgPC9jb250ZXh0cz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRyb3BBY3Rpb25zIj4KLSAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLlJlYWRtZURyb3BBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgIGlkPSJvcmdfZWNsaXBzZV91aV9leGFtcGxlc19yZWFkbWV0b29sX2Ryb3BfYWN0aW9ucyI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InJlYWRtZW1hcmtlciIKLSAgICAgICAgIG5hbWU9IiVSZWFkbWVNYXJrZXIubmFtZSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlcgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGFza21hcmtlciI+Ci0gICAgICA8L3N1cGVyPgotICAgICAgPHN1cGVyCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50ZXh0bWFya2VyIj4KLSAgICAgIDwvc3VwZXI+Ci0gICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgPC9wZXJzaXN0ZW50PgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5pZCI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wubGV2ZWwiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLmRlcGFydG1lbnQiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLmNvZGUiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLmxhbmd1YWdlIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLm1hcmtlckhlbHAiPgotICAgICAgPG1hcmtlckhlbHAKLSAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wucmVhZG1lbWFya2VyIgotICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5tYXJrZXJfZXhhbXBsZTFfY29udGV4dCI+Ci0gICAgICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLmlkIgotICAgICAgICAgICAgICAgdmFsdWU9IjEyMzQiPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L21hcmtlckhlbHA+Ci0gICAgICA8bWFya2VySGVscAotICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5yZWFkbWVtYXJrZXIiCi0gICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLm1hcmtlcl9leGFtcGxlMl9jb250ZXh0Ij4KLSAgICAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wubGV2ZWwiCi0gICAgICAgICAgICAgICB2YWx1ZT0iNyI+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvbWFya2VySGVscD4KLSAgICAgIDxtYXJrZXJIZWxwCi0gICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLnJlYWRtZW1hcmtlciIKLSAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wubWFya2VyX2V4YW1wbGUzX2NvbnRleHQiPgotICAgICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5sZXZlbCIKLSAgICAgICAgICAgICAgIHZhbHVlPSI3Ij4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5kZXBhcnRtZW50IgotICAgICAgICAgICAgICAgdmFsdWU9ImluZnJhIj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9tYXJrZXJIZWxwPgotICAgICAgPG1hcmtlckhlbHAKLSAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wucmVhZG1lbWFya2VyIgotICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5tYXJrZXJfZXhhbXBsZTRfY29udGV4dCI+Ci0gICAgICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLmNvZGUiCi0gICAgICAgICAgICAgICB2YWx1ZT0icmVkIj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9tYXJrZXJIZWxwPgotICAgICAgPG1hcmtlckhlbHAKLSAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wucmVhZG1lbWFya2VyIgotICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5tYXJrZXJfZXhhbXBsZTVfY29udGV4dCI+Ci0gICAgICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLmxhbmd1YWdlIgotICAgICAgICAgICAgICAgdmFsdWU9ImVuZ2xpc2giPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L21hcmtlckhlbHA+Ci0gICAgICA8bWFya2VySGVscAotICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5yZWFkbWVtYXJrZXIiCi0gICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLm1hcmtlcl9leGFtcGxlNl9jb250ZXh0Ij4KLSAgICAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wuaWQiCi0gICAgICAgICAgICAgICB2YWx1ZT0iMTIzNCI+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wubGV2ZWwiCi0gICAgICAgICAgICAgICB2YWx1ZT0iNyI+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wuZGVwYXJ0bWVudCIKLSAgICAgICAgICAgICAgIHZhbHVlPSJpbmZyYSI+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wuY29kZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJyZWQiPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLmxhbmd1YWdlIgotICAgICAgICAgICAgICAgdmFsdWU9ImVuZ2xpc2giPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L21hcmtlckhlbHA+Ci0gICAgICA8bWFya2VySGVscAotICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5yZWFkbWVtYXJrZXIiCi0gICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLm1hcmtlcl9leGFtcGxlN19jb250ZXh0Ij4KLSAgICAgIDwvbWFya2VySGVscD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uIj4KLSAgICAgIDxtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yCi0gICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLnJlYWRtZW1hcmtlciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLlJlYWRtZU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiPgotICAgICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5pZCIKLSAgICAgICAgICAgICAgIHZhbHVlPSIxMjM0Ij4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPgotICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKLSAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wucmVhZG1lbWFya2VyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wuUmVhZG1lTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciI+Ci0gICAgICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLmxldmVsIgotICAgICAgICAgICAgICAgdmFsdWU9IjciPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+Ci0gICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgotICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5yZWFkbWVtYXJrZXIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMucmVhZG1ldG9vbC5SZWFkbWVNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIj4KLSAgICAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnJlYWRtZXRvb2wuY29kZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJyZWQiPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLmxhbmd1YWdlIgotICAgICAgICAgICAgICAgdmFsdWU9ImVuZ2xpc2giPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sLlJlYWRtZVByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzczNGY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmQzZDg4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNzYwNDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0jVHVlIE9jdCAxOCAxNjo1MDo0NiBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2I3ZDc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1R1ZSBPY3QgMTggMTU6MTU6MzggRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkuamF2YWRvYz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcmV0dXJuIFJldHVybnMgdGhlICR7YmFyZV9maWVsZF9uYW1lfS5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcGFyYW0gJHtwYXJhbX0gVGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXQuXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgSmF2YSBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWxlY29tbWVudCIgbmFtZVw9ImZpbGVjb21tZW50Ij4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogQ29weXJpZ2h0IChjKSAke3llYXJ9IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4gKlxuICogQ29udHJpYnV0b3JzXDpcbiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcbiAqIEBzaW5jZSAzLjJcbiAqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCI+LyoqXG4gKiBcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cblxuJHt0eXBlY29tbWVudH1cbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9ja1xuJHtleGNlcHRpb25fdmFyfS5wcmludFN0YWNrVHJhY2UoKTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmJvZHkiIG5hbWVcPSJjb25zdHJ1Y3RvcmJvZHkiPiR7Ym9keV9zdGF0ZW1lbnR9XG4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWI8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5Ij5yZXR1cm4gJHtmaWVsZH07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjbGFzc2JvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNsYXNzIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNsYXNzYm9keSIgbmFtZVw9ImNsYXNzYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImludGVyZmFjZWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGludGVyZmFjZSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5pbnRlcmZhY2Vib2R5IiBuYW1lXD0iaW50ZXJmYWNlYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImVudW1ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmVudW1ib2R5IiBuYW1lXD0iZW51bWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJhbm5vdGF0aW9uYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgYW5ub3RhdGlvbiB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5hbm5vdGF0aW9uYm9keSIgbmFtZVw9ImFubm90YXRpb25ib2R5Ij5cbjwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNmEyMzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1R1ZSBPY3QgMTggMTY6NDU6MTkgRURUIDIwMDUKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MAotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTEKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9BZGRCb3hPcGVyYXRpb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vQWRkQm94T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0N2RhMTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9BZGRCb3hPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLQotLyoqCi0gKiBBbiBvcGVyYXRpb24gdGhhdCBhZGRzIGEgYm94LgotICovCi1wdWJsaWMgY2xhc3MgQWRkQm94T3BlcmF0aW9uIGV4dGVuZHMgQm94T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBBZGRCb3hPcGVyYXRpb24oU3RyaW5nIGxhYmVsLCBJVW5kb0NvbnRleHQgY29udGV4dCwgQm94ZXMgYm94ZXMsIEJveCBib3gsIENhbnZhcyBjYW52YXMpIHsKLQkJc3VwZXIobGFiZWwsIGNvbnRleHQsIGJveGVzLCBib3gsIGNhbnZhcyk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWJveGVzLmFkZChib3gpOwotCQljYW52YXMucmVkcmF3KGJveC54MSwgYm94LnkxLCBib3gueDIsIGJveC55MiwgZmFsc2UpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNjYW5VbmRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gYm94ZXMuY29udGFpbnMoYm94KTsKLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNjYW5SZWRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZWRvKCkgewotCQlyZXR1cm4gIWJveGVzLmNvbnRhaW5zKGJveCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNyZWRvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlKG1vbml0b3IsIGluZm8pOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jdW5kbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlib3hlcy5yZW1vdmUoYm94KTsKLQkJY2FudmFzLnJlZHJhdyhib3gueDEsIGJveC55MSwgYm94LngyLCBib3gueTIsIGZhbHNlKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL0VjbGlwc2UgVUkgRXhhbXBsZXMgVW5kby9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy91bmRvL0JveC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9Cb3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmMWE0ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL0VjbGlwc2UgVUkgRXhhbXBsZXMgVW5kby9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy91bmRvL0JveC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG87Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLS8qKgotICogMkQgQm94IHRoYXQgY2FuIG1vdmUgaXRzZWxmLCBoaXQtdGVzdCwgYW5kIGRyYXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3ggIHsKLQkKLQkvKgotCSAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgYm94LgotCSAqLwotCXB1YmxpYyBpbnQgeDEsIHkxLCB4MiwgeTI7Ci0JCi0JLyoKLQkgKiBDb25zdHJ1Y3RzIGEgYm94LCBkZWZpbmVkIGJ5IGFueSB0d28gZGlhbWV0cmljYWxseSAKLQkgKiBvcHBvc2luZyBjb3JuZXJzLgotCSAqLwotCXB1YmxpYyBCb3goaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldCh4MSwgeTEsIHgyLCB5Mik7Ci0JfQotCQotCS8qCi0JICogTW92ZSB0aGUgYm94IHRvIGEgbmV3IG9yaWdpbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlKFBvaW50IG9yaWdpbikgewotCQlzZXQob3JpZ2luLngsIG9yaWdpbi55LCBvcmlnaW4ueCArIGdldFdpZHRoKCksIG9yaWdpbi55ICsgZ2V0SGVpZ2h0KCkpOwotCX0KLQkKLQkvKgotCSAqIERyYXcgdGhlIGJveCB3aXRoIHRoZSBzcGVjaWZpZWQgZ2MuCi0JICovCi0JcHVibGljIHZvaWQgZHJhdyhHQyBnYykgewotCQlnYy5kcmF3UmVjdGFuZ2xlKHgxLCB5MSwgeDIteDEsIHkyLXkxKTsKLQl9Ci0JCi0JLyoKLQkgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBib3gKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0KGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikgewotCQl0aGlzLngxID0gTWF0aC5taW4oeDEsIHgyKTsKLQkJdGhpcy55MSA9IE1hdGgubWluKHkxLCB5Mik7Ci0JCXRoaXMueDIgPSBNYXRoLm1heCh4MSwgeDIpOwotCQl0aGlzLnkyID0gTWF0aC5tYXgoeTEsIHkyKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGJveCBjb250YWlucyB0aGUgcG9pbnQgc3BlY2lmaWVkIGJ5Ci0JICogdGhlIHggYW5kIHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KSB7Ci0JCXJldHVybiB4ID49IHgxICYmIAotCQkJeCA8PSB4MiAmJiAKLQkJCXkgPj0geTEgJiYgCi0JCQl5IDw9IHkyOwotCX0KLQkKLQkvKgotCSAqIEFuc3dlciB0aGUgd2lkdGggb2YgdGhlIGJveAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiB4MiAtIHgxOwotCX0KLQkKLQkvKgotCSAqIEFuc3dlciB0aGUgaGVpZ2h0IG9mIHRoZSBib3gKLQkgKi8KLQlwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIHkyIC0geTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9Cb3hPcGVyYXRpb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vQm94T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNTI0ZWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9Cb3hPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLQotLyoqCi0gKiBBbiB1bmRvYWJsZSBvcGVyYXRpb24gdGhhdCByZXByZXNlbnRzIGEgY2hhbmdlIHRvIGEgYm94LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQm94T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gewotCQotCS8qCi0JICogVGhlIGJveCBpbnZvbHZlZCBpbiB0aGUgb3BlcmF0aW9uCi0JICovCi0JQm94IGJveDsKLQkKLQkvKgotCSAqIFRoZSBncm91cCBvZiBib3hlcyBpbnZvbHZlZCBpbiB0aGUgb3BlcmF0aW9uCi0JICovCi0JQm94ZXMgYm94ZXM7Ci0JCi0JLyoKLQkgKiBUaGUgY2FudmFzIHRvIHVwZGF0ZSBvciBkcmF3IG9uIGR1cmluZyBhbiBvcGVyYXRpb24KLQkgKi8KLQlDYW52YXMgY2FudmFzOwotCi0JcHVibGljIEJveE9wZXJhdGlvbihTdHJpbmcgbGFiZWwsIElVbmRvQ29udGV4dCB1bmRvQ29udGV4dCwgQm94ZXMgYm94ZXMsIEJveCBib3gsIENhbnZhcyBjYW52YXMpIHsKLQkJc3VwZXIgKGxhYmVsKTsKLQkJYWRkQ29udGV4dCh1bmRvQ29udGV4dCk7Ci0JCXRoaXMuYm94ZXMgPSBib3hlczsKLQkJdGhpcy5ib3ggPSBib3g7Ci0JCXRoaXMuY2FudmFzID0gY2FudmFzOwotCX0KLQkKLQkvKgotCSAqIFNob3cgdGhlIHNwZWNpZmllZCBwcm9tcHQgaW4gYW4gaW5mbyBkaWFsb2cuCi0JICovCi0Jdm9pZCBzaG93TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihjYW52YXMuZ2V0U2hlbGwoKSwKLQkJCQlVbmRvRXhhbXBsZU1lc3NhZ2VzLkJveFZpZXdfVGl0bGUsIG1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vQm94ZXMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vQm94ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5OTIzNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL0VjbGlwc2UgVUkgRXhhbXBsZXMgVW5kby9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy91bmRvL0JveGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG87Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci0KLS8qKgotICogQSBjb2xsZWN0aW9uIG9mIGJveGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3hlcyAgewotCQotCS8qCi0JICogVGhlICJtb2RlbCwiIGEgbGlzdCBvZiBib3hlcwotCSAqLwotCXByaXZhdGUgTGlzdCBib3hlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKgotCSAqIENvbnN0cnVjdHMgYSBib3ggY29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBCb3hlcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBib3ggdG8gdGhlIGdyb3VwIG9mIGJveGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChCb3ggYm94KSB7Ci0JCWJveGVzLmFkZChib3gpOwotCX0KLQkKLQkvKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGJveCBmcm9tIHRoZSBncm91cCBvZiBib3hlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoQm94IGJveCkgewotCQlib3hlcy5yZW1vdmUoYm94KTsKLQl9Ci0JCi0JLyoKLQkgKiBDbGVhciBhbGwgdGhlIGJveGVzIGZyb20gdGhlIGxpc3Qgb2YgYm94ZXMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWJveGVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBncm91cCBvZiBib3hlcyBjb250YWlucyB0aGUgc3BlY2lmaWVkIGJveC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhCb3ggYm94KSB7Ci0JCXJldHVybiBib3hlcy5jb250YWlucyhib3gpOwotCX0KLQkKLQkvKgotCSAqIERyYXcgdGhlIGJveGVzIHdpdGggdGhlIHNwZWNpZmllZCBnYy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkcmF3KEdDIGdjKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYm94ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCSgoQm94KSBib3hlcy5nZXQoaSkpLmRyYXcoZ2MpOwotCQl9Ci0JfQotCQkKLQkvKgotCSAqIFJldHVybiB0aGUgYm94IGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCB4IGFuZCB5LCBvciBudWxsCi0JICogaWYgbm8gYm94IGNvbnRhaW5zIHRoZSBwb2ludC4KLQkgKi8KLQlwdWJsaWMgQm94IGdldEJveChpbnQgeCwgaW50IHkpIHsKLQkJZm9yIChpbnQgaT0wOyBpPCBib3hlcy5zaXplKCk7IGkrKykgewotCQkJQm94IGJveCA9IChCb3gpYm94ZXMuZ2V0KGkpOwotCQkJaWYgKGJveC5jb250YWlucyh4LCB5KSkgewotCQkJCXJldHVybiBib3g7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIGJveGVzIGtub3duIGJ5IHRoaXMgZ3JvdXAgb2YgYm94ZXMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0Qm94ZXMoKSB7Ci0JCXJldHVybiBib3hlczsKLQl9Ci0JCi0JLyoKLQkgKiBTZXQgdGhlIGxpc3Qgb2YgYm94ZXMga25vd24gYnkgdGhpcyBncm91cCBvZiBib3hlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3hlcyhMaXN0IGJveGVzKSB7Ci0JCXRoaXMuYm94ZXMgPSBib3hlczsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL0VjbGlwc2UgVUkgRXhhbXBsZXMgVW5kby9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy91bmRvL0NsZWFyQm94ZXNPcGVyYXRpb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vQ2xlYXJCb3hlc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDg2OWI2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vQ2xlYXJCb3hlc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLQotLyoqCi0gKiBBbiBvcGVyYXRpb24gdGhhdCBhZGRzIGEgYm94LgotICovCi1wdWJsaWMgY2xhc3MgQ2xlYXJCb3hlc09wZXJhdGlvbiBleHRlbmRzIEJveE9wZXJhdGlvbiB7Ci0KLQkvKgotCSAqIFRoZSBib3hlcyB0aGF0IGFyZSBzYXZlZCBhZnRlciBjbGVhcmluZwotCSAqLwotCXByaXZhdGUgTGlzdCBzYXZlZEJveGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXB1YmxpYyBDbGVhckJveGVzT3BlcmF0aW9uKFN0cmluZyBsYWJlbCwgSVVuZG9Db250ZXh0IGNvbnRleHQsIEJveGVzIGJveGVzLCBDYW52YXMgY2FudmFzKSB7Ci0JCXN1cGVyKGxhYmVsLCBjb250ZXh0LCBib3hlcywgbnVsbCwgY2FudmFzKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJc2F2ZWRCb3hlcyA9IGJveGVzLmdldEJveGVzKCk7Ci0JCWJveGVzLmNsZWFyKCk7Ci0JCWNhbnZhcy5yZWRyYXcoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNyZWRvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlKG1vbml0b3IsIGluZm8pOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jdW5kbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlib3hlcy5zZXRCb3hlcyhzYXZlZEJveGVzKTsKLQkJY2FudmFzLnJlZHJhdygpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vTW92ZUJveE9wZXJhdGlvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9Nb3ZlQm94T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YjBkNmUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9Nb3ZlQm94T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotCi0vKioKLSAqIEFuIG9wZXJhdGlvbiB0aGF0IGFkZHMgYSBib3guCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlQm94T3BlcmF0aW9uIGV4dGVuZHMgQm94T3BlcmF0aW9uIHsKLQotCS8qCi0JICogVGhlIHBvaW50IHRoZSBib3ggc2hvdWxkIG1vdmUgdG8vZnJvbS4KLQkgKi8KLQlwcml2YXRlIFBvaW50IG9yaWdpbjsKLQlwcml2YXRlIFBvaW50IHRhcmdldDsKLQkKLQlwdWJsaWMgTW92ZUJveE9wZXJhdGlvbihTdHJpbmcgbGFiZWwsIElVbmRvQ29udGV4dCBjb250ZXh0LCBCb3ggYm94LCBDYW52YXMgY2FudmFzLCBQb2ludCBuZXdPcmlnaW4pIHsKLQkJc3VwZXIobGFiZWwsIGNvbnRleHQsIG51bGwsIGJveCwgY2FudmFzKTsKLQkJb3JpZ2luID0gbmV3IFBvaW50KGJveC54MSwgYm94LnkxKTsKLQkJdGFyZ2V0ID0gbmV3IFBvaW50KG5ld09yaWdpbi54LCBuZXdPcmlnaW4ueSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWJveC5tb3ZlKHRhcmdldCk7Ci0JCWNhbnZhcy5yZWRyYXcoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNyZWRvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlKG1vbml0b3IsIGluZm8pOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jdW5kbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlib3gubW92ZShvcmlnaW4pOwotCQljYW52YXMucmVkcmF3KCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHN1cGVyLmdldExhYmVsKCkpOwotCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCJbIik7IC8vJE5PTi1OTFMtMSQKLQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0JCXN0cmluZ0J1ZmZlci5hcHBlbmQobmV3IEludGVnZXIob3JpZ2luLngpLnRvU3RyaW5nKCkpOwotCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCXN0cmluZ0J1ZmZlci5hcHBlbmQobmV3IEludGVnZXIob3JpZ2luLnkpLnRvU3RyaW5nKCkpOwotCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXN0cmluZ0J1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0JCXN0cmluZ0J1ZmZlci5hcHBlbmQobmV3IEludGVnZXIodGFyZ2V0LngpLnRvU3RyaW5nKCkpOwotCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCXN0cmluZ0J1ZmZlci5hcHBlbmQobmV3IEludGVnZXIodGFyZ2V0LnkpLnRvU3RyaW5nKCkpOwotCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXN0cmluZ0J1ZmZlci5hcHBlbmQoJ10nKTsKLQkJcmV0dXJuIHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9Qcm9tcHRpbmdVc2VyQXBwcm92ZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vUHJvbXB0aW5nVXNlckFwcHJvdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMDhiNTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9Qcm9tcHRpbmdVc2VyQXBwcm92ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkFwcHJvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOwotCi0vKioKLSAqIEFuIG9wZXJhdGlvbiBhcHByb3ZlciB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VlIHdoZXRoZXIgYW4gdW5kbyBvciByZWRvCi0gKiBzaG91bGQgY29udGludWUuIEFuIGV4YW1wbGUgcHJlZmVyZW5jZSBpcyBjaGVja2VkIHRvIGRldGVybWluZSBpZiBwcm9tcHRpbmcKLSAqIHNob3VsZCBvY2N1ci4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb21wdGluZ1VzZXJBcHByb3ZlciBpbXBsZW1lbnRzIElPcGVyYXRpb25BcHByb3ZlciB7Ci0KLQlwcml2YXRlIElVbmRvQ29udGV4dCBjb250ZXh0OwotCi0JLyoKLQkgKiBDcmVhdGUgdGhlIG9wZXJhdGlvbiBhcHByb3Zlci4KLQkgKi8KLQlwdWJsaWMgUHJvbXB0aW5nVXNlckFwcHJvdmVyKElVbmRvQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkFwcHJvdmVyI3Byb2NlZWRSZWRvaW5nKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3RvcnksCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcm9jZWVkUmVkb2luZyhJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uLAotCQkJSU9wZXJhdGlvbkhpc3RvcnkgaGlzdG9yeSwgSUFkYXB0YWJsZSB1aUluZm8pIHsKLQotCQkvLyByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIG9wZXJhdGlvbiBpcyBub3QgcmVsZXZhbnQKLQkJaWYgKCFvcGVyYXRpb24uaGFzQ29udGV4dChjb250ZXh0KSkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCS8vIGFsbG93IHRoZSBvcGVyYXRpb24gaWYgd2UgYXJlIG5vdCBwcm9tcHRpbmcKLQkJYm9vbGVhbiBwcm9tcHQgPSBVbmRvUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9DT05GSVJNVU5ETyk7Ci0JCWlmICghcHJvbXB0KQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCXJldHVybiBwcm9tcHQoZmFsc2UsIG9wZXJhdGlvbiwgdWlJbmZvKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uQXBwcm92ZXIjcHJvY2VlZFVuZG9pbmcob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGlzdG9yeSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByb2NlZWRVbmRvaW5nKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24sCi0JCQlJT3BlcmF0aW9uSGlzdG9yeSBoaXN0b3J5LCBJQWRhcHRhYmxlIHVpSW5mbykgewotCi0JCS8vIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCByZWxldmFudAotCQlpZiAoIW9wZXJhdGlvbi5oYXNDb250ZXh0KGNvbnRleHQpKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkJLy8gYWxsb3cgdGhlIG9wZXJhdGlvbiBpZiB3ZSBhcmUgbm90IHByb21wdGluZwotCQlib29sZWFuIHByb21wdCA9IFVuZG9QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0NPTkZJUk1VTkRPKTsKLQkJaWYgKCFwcm9tcHQpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJcmV0dXJuIHByb21wdCh0cnVlLCBvcGVyYXRpb24sIHVpSW5mbyk7Ci0JfQotCi0JLyoKLQkgKiBQcm9tcHQgdGhlIHVzZXIgYXMgdG8gd2hldGhlciB0byBjb250aW51ZSB0aGUgdW5kbyBvciByZWRvLCBhbmQgcmV0dXJuIGFuCi0JICogT0tfU1RBVFVTIGlmIHdlIHNob3VsZCBjb250aW51ZSwgb3IgYSBDQU5DRUxfU1RBVFVTIGlmIHdlIHNob3VsZCBub3QuCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHByb21wdChib29sZWFuIHVuZG9pbmcsIElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24sCi0JCQlJQWRhcHRhYmxlIHVpSW5mbykgewotCQlib29sZWFuIGNyZWF0ZWRTaGVsbCA9IGZhbHNlOwotCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsKHVpSW5mbyk7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJCWNyZWF0ZWRTaGVsbCA9IHRydWU7Ci0JCQkJc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgY29tbWFuZCA9IHVuZG9pbmcgPyBVbmRvRXhhbXBsZU1lc3NhZ2VzLkJveFZpZXdfVW5kbwotCQkJCTogVW5kb0V4YW1wbGVNZXNzYWdlcy5Cb3hWaWV3X1JlZG87Ci0JCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoVW5kb0V4YW1wbGVNZXNzYWdlcy5Cb3hWaWV3X0NvbmZpcm1VbmRvLCBjb21tYW5kLAotCQkJCW9wZXJhdGlvbi5nZXRMYWJlbCgpKTsKLQkJTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUKLQkJCQkub3Blbk9rQ2FuY2VsQ29uZmlybShzaGVsbCwgVW5kb0V4YW1wbGVNZXNzYWdlcy5Cb3hWaWV3X1RpdGxlLAotCQkJCQkJbWVzc2FnZSwgVW5kb0V4YW1wbGVNZXNzYWdlcy5VbmRvUHJlZmVyZW5jZXNfRG9Ob3RDb25maXJtLCBmYWxzZSwgbnVsbCwgbnVsbCk7Ci0JCVVuZG9QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9DT05GSVJNVU5ETywgIWRpYWxvZy5nZXRUb2dnbGVTdGF0ZSgpKTsKLQotCQlpZiAoY3JlYXRlZFNoZWxsKQotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5PSykKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHNoZWxsIGRlc2NyaWJlZCBieSB0aGUgc3VwcGxpZWQgdWlJbmZvLCBvciBudWxsIGlmIG5vIHNoZWxsIGlzCi0JICogZGVzY3JpYmVkLgotCSAqLwotCVNoZWxsIGdldFNoZWxsKElBZGFwdGFibGUgdWlJbmZvKSB7Ci0JCWlmICh1aUluZm8gIT0gbnVsbCkgewotCQkJU2hlbGwgc2hlbGwgPSAoU2hlbGwpIHVpSW5mby5nZXRBZGFwdGVyKFNoZWxsLmNsYXNzKTsKLQkJCWlmIChzaGVsbCAhPSBudWxsKQotCQkJCXJldHVybiBzaGVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL0VjbGlwc2UgVUkgRXhhbXBsZXMgVW5kby9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy91bmRvL1VuZG9FeGFtcGxlTWVzc2FnZXMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vVW5kb0V4YW1wbGVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzg1MjRhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vVW5kb0V4YW1wbGVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTWVzc2FnZSBjbGFzcyBmb3IgdGhlIHVuZG8gZXhhbXBsZS4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmRvRXhhbXBsZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kb1ByZWZlcmVuY2VzX0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuZG9QcmVmZXJlbmNlc19IaXN0b3J5TGltaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kb1ByZWZlcmVuY2VzX0NvbmZpcm1VbmRvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuZG9QcmVmZXJlbmNlc19TaG93RGVidWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kb1ByZWZlcmVuY2VzX0RvTm90Q29uZmlybTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmRvSGlzdG9yeVZpZXdfQ29udGV4dEZpbHRlckRpYWxvZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmRvSGlzdG9yeVZpZXdfQ2hvb3NlQ29udGV4dE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kb0hpc3RvcnlWaWV3X0ZpbHRlclRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kb0hpc3RvcnlWaWV3X0ZpbHRlclRvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuZG9IaXN0b3J5Vmlld19PcGVyYXRpb25JbnZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuZG9IaXN0b3J5Vmlld19PcGVyYXRpb25FeGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kb0hpc3RvcnlWaWV3X1VuZG9TZWxlY3RlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmRvSGlzdG9yeVZpZXdfVW5kb1NlbGVjdGVkVG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kb0hpc3RvcnlWaWV3X1JlZnJlc2hMaXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuZG9IaXN0b3J5Vmlld19SZWZyZXNoTGlzdFRvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuZG9IaXN0b3J5Vmlld19JbmZvRGlhbG9nVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb3hWaWV3X1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJveFZpZXdfQ2xlYXJCb3hlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb3hWaWV3X0NsZWFyQm94ZXNUb29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb3hWaWV3X01vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm94Vmlld19BZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm94Vmlld19Db25maXJtVW5kbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb3hWaWV3X1VuZG87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm94Vmlld19SZWRvOwotCQotICAgIHN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBVbmRvRXhhbXBsZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL0VjbGlwc2UgVUkgRXhhbXBsZXMgVW5kby9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy91bmRvL1VuZG9QbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vVW5kb1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTgwOTgwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vVW5kb1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmRvUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVW5kb1BsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVbmRvUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVW5kb1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oIm9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8yIiwgcGF0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzJkYWQxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMjIyMjIyMjIyMgVW5kbyBQcmVmZXJlbmNlcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVVuZG9QcmVmZXJlbmNlc19EZXNjcmlwdGlvbiA9IFVuZG8gRXhhbXBsZSBQcmVmZXJlbmNlcwotVW5kb1ByZWZlcmVuY2VzX0hpc3RvcnlMaW1pdCA9IFVuZG8gaGlzdG9yeSBsaW1pdAotVW5kb1ByZWZlcmVuY2VzX0NvbmZpcm1VbmRvID0gQ29uZmlybSBhbGwgdW5kbyBvcGVyYXRpb25zCi1VbmRvUHJlZmVyZW5jZXNfU2hvd0RlYnVnID0gU2hvdyBkZWJ1ZyBsYWJlbHMgaW4gdW5kbyBoaXN0b3J5IHZpZXcKLVVuZG9QcmVmZXJlbmNlc19Eb05vdENvbmZpcm0gPSBEbyBub3QgcHJvbXB0IGZvciB1bmRvIG9yIHJlZG8gYWdhaW4KLQotIyMjIyMjIyMjIyMgVW5kbyBIaXN0b3J5IFZpZXcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVVuZG9IaXN0b3J5Vmlld19Db250ZXh0RmlsdGVyRGlhbG9nID0gQ29udGV4dCBGaWx0ZXIgRGlhbG9nCi1VbmRvSGlzdG9yeVZpZXdfQ2hvb3NlQ29udGV4dE1lc3NhZ2UgPSBDaG9vc2UgdGhlIENvbnRleHQgZm9yIHRoZSB2aWV3Ci1VbmRvSGlzdG9yeVZpZXdfRmlsdGVyVGV4dCA9IEZpbHRlciBvbi4uLgotVW5kb0hpc3RvcnlWaWV3X0ZpbHRlclRvb2xUaXBUZXh0ID0gU2V0IHRoZSB1bmRvIGNvbnRleHQgdXNlZCB0byBmaWx0ZXIgdGhlIG9wZXJhdGlvbiBoaXN0b3J5Ci1VbmRvSGlzdG9yeVZpZXdfVW5kb1NlbGVjdGVkID0gVW5kbyBzZWxlY3RlZAotVW5kb0hpc3RvcnlWaWV3X1VuZG9TZWxlY3RlZFRvb2xUaXBUZXh0ID0gVW5kbyB0aGUgc2VsZWN0ZWQgb3BlcmF0aW9uCi1VbmRvSGlzdG9yeVZpZXdfUmVmcmVzaExpc3QgPSBSZWZyZXNoIGxpc3QKLVVuZG9IaXN0b3J5Vmlld19SZWZyZXNoTGlzdFRvb2xUaXBUZXh0ID0gUmVmcmVzaCBhbmQgcmVkcmF3IHRoZSBsaXN0Ci1VbmRvSGlzdG9yeVZpZXdfT3BlcmF0aW9uSW52YWxpZCA9IFRoZSBzZWxlY3RlZCBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZSBpbiBpdHMgY3VycmVudCBzdGF0ZQotVW5kb0hpc3RvcnlWaWV3X09wZXJhdGlvbkV4Y2VwdGlvbiA9IEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byB1bmRvIHRoaXMgb3BlcmF0aW9uCi1VbmRvSGlzdG9yeVZpZXdfSW5mb0RpYWxvZ1RpdGxlID0gVW5kbyBIaXN0b3J5IEV4YW1wbGUgSW5mb3JtYXRpb24KLQotIyMjIyMjIyMjIyMgQm94IFZpZXcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUJveFZpZXdfVGl0bGUgPSBCb3ggVmlldwotQm94Vmlld19DbGVhckJveGVzID0gRGVsZXRlIGFsbCBib3hlcwotQm94Vmlld19DbGVhckJveGVzVG9vbFRpcFRleHQgPSBEZWxldGUgYWxsIG9mIHRoZSBib3hlcyBmcm9tIHRoZSB2aWV3Ci1Cb3hWaWV3X01vdmUgPSBNb3ZlIEJveAotQm94Vmlld19BZGQgPSBBZGQgQm94Ci1Cb3hWaWV3X0NvbmZpcm1VbmRvID0gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHswfSAiezF9Ij8KLUJveFZpZXdfVW5kbyA9IFVuZG8KLUJveFZpZXdfUmVkbyA9IFJlZG8KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL0VjbGlwc2UgVUkgRXhhbXBsZXMgVW5kby9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy91bmRvL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA5ZjY4MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL0VjbGlwc2UgVUkgRXhhbXBsZXMgVW5kby9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy91bmRvL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENvbnN0YW50IGRlZmluaXRpb25zIGZvciBwbHVnLWluIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVU5ET0xJTUlUID0gInByZWZVbmRvTGltaXQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0hPV0RFQlVHID0gInByZWZTaG93RGVidWciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQ09ORklSTVVORE8gPSAicHJlZkNvbmZpcm1VbmRvIjsKLQkKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL0VjbGlwc2UgVUkgRXhhbXBsZXMgVW5kby9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy91bmRvL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzA2ZGFmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLlVuZG9QbHVnaW47Ci0KLS8qKgotICogQ2xhc3MgdXNlZCB0byBpbml0aWFsaXplIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gVW5kb1BsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0NPTkZJUk1VTkRPLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVU5ET0xJTUlULAotCQkJCTI1KTsKLQkJc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0hPV0RFQlVHLCBmYWxzZSk7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9wcmVmZXJlbmNlcy9VbmRvUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vcHJlZmVyZW5jZXMvVW5kb1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzVmMzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby9wcmVmZXJlbmNlcy9VbmRvUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8uVW5kb0V4YW1wbGVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLlVuZG9QbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGRlZmluZSBwcmVmZXJlbmNlcyB0aGF0IGNvbnRyb2wgaG93Ci0gKiB1bmRvIG9jY3Vycy4gIEl0IGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHByZWZlcmVuY2VzIHRvIGNvbmZpZ3VyZQotICogdGhlIG9wZXJhdGlvbiBoaXN0b3J5IGluIGRpZmZlcmVudCB3YXlzLgotICovCi0KLXB1YmxpYyBjbGFzcyBVbmRvUHJlZmVyZW5jZVBhZ2UKLQlleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwdWJsaWMgVW5kb1ByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcihHUklEKTsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKFVuZG9QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0RGVzY3JpcHRpb24oVW5kb0V4YW1wbGVNZXNzYWdlcy5VbmRvUHJlZmVyZW5jZXNfRGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmaWVsZCBlZGl0b3JzLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0JCQotCQlhZGRGaWVsZCgKLQkJCQluZXcgSW50ZWdlckZpZWxkRWRpdG9yKAotCQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVU5ET0xJTUlULAotCQkJCQlVbmRvRXhhbXBsZU1lc3NhZ2VzLlVuZG9QcmVmZXJlbmNlc19IaXN0b3J5TGltaXQsCi0JCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLQotCQlhZGRGaWVsZCgKLQkJCQluZXcgQm9vbGVhbkZpZWxkRWRpdG9yKAotCQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0hPV0RFQlVHLAotCQkJCQlVbmRvRXhhbXBsZU1lc3NhZ2VzLlVuZG9QcmVmZXJlbmNlc19TaG93RGVidWcsCi0JCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLQotCQlhZGRGaWVsZCgKLQkJCW5ldyBCb29sZWFuRmllbGRFZGl0b3IoCi0JCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0NPTkZJUk1VTkRPLAotCQkJCVVuZG9FeGFtcGxlTWVzc2FnZXMuVW5kb1ByZWZlcmVuY2VzX0NvbmZpcm1VbmRvLAotCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby92aWV3cy9Cb3hWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL0VjbGlwc2UgVUkgRXhhbXBsZXMgVW5kby9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy91bmRvL3ZpZXdzL0JveFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzYjYzZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL0VjbGlwc2UgVUkgRXhhbXBsZXMgVW5kby9vcmcvZWNsaXBzZS91aS9leGFtcGxlcy91bmRvL3ZpZXdzL0JveFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8uQWRkQm94T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8uQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8uQm94ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby5DbGVhckJveGVzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8uTW92ZUJveE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLlByb21wdGluZ1VzZXJBcHByb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLlVuZG9FeGFtcGxlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby5VbmRvUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8ucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5vcGVyYXRpb25zLlJlZG9BY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm9wZXJhdGlvbnMuVW5kb0FjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uQXBwcm92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25IaXN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9iamVjdFVuZG9Db250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLXB1YmxpYyBjbGFzcyBCb3hWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCS8qCi0JICogVGhlIGNhbnZhcyB0byBwYWludCB0aGUgYm94ZXMgb24uCi0JICovCi0JcHJpdmF0ZSBDYW52YXMgcGFpbnRDYW52YXM7Ci0KLQkvKgotCSAqIFRoZSBnYyB1c2VkIGZvciBkcmF3aW5nIHRoZSBydWJiZXIgYmFuZC4KLQkgKi8KLQlwcml2YXRlIEdDIGdjOwotCi0JLyoKLQkgKiBUaGUgbW9kZWwsIGEgZ3JvdXAgb2YgYm94ZXMKLQkgKi8KLQlwcml2YXRlIEJveGVzIGJveGVzID0gbmV3IEJveGVzKCk7Ci0KLQkvKgotCSAqIFVuZG8gYW5kIHJlZG8gYWN0aW9ucwotCSAqLwotCXByaXZhdGUgVW5kb0FjdGlvbkhhbmRsZXIgdW5kb0FjdGlvbjsKLQotCXByaXZhdGUgUmVkb0FjdGlvbkhhbmRsZXIgcmVkb0FjdGlvbjsKLQotCXByaXZhdGUgSUFjdGlvbiBjbGVhckJveGVzQWN0aW9uOwotCi0JLyoKLQkgKiBQcml2YXRlIHVuZG8gY29udGV4dCBmb3IgYm94IG9wZXJhdGlvbnMKLQkgKi8KLQlwcml2YXRlIElVbmRvQ29udGV4dCB1bmRvQ29udGV4dDsKLQotCS8qCi0JICogT3BlcmF0aW9uIGFwcHJvdmVyIGZvciBhcHByb3ZpbmcgdW5kbyBhbmQgcmVkbwotCSAqLwotCXByaXZhdGUgSU9wZXJhdGlvbkFwcHJvdmVyIG9wZXJhdGlvbkFwcHJvdmVyOwotCi0JLyoKLQkgKiBQcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSB1bmRvIGxpbWl0IHByZWZlcmVuY2UuCi0JICovCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0JLyoKLQkgKiBUcnVlIGlmIGEgY2xpY2stZHJhZyBpcyBpbiBwcm9ncmVzcwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0JLyoKLQkgKiBUcnVlIGlmIGEgY2xpY2stbW92ZSBpcyBpbiBwcm9ncmVzcwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBtb3ZlSW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0JLyoKLQkgKiBUaGUgYm94IHRoYXQgaXMgYmVpbmcgbW92ZWQuCi0JICovCi0JcHJpdmF0ZSBCb3ggbW92aW5nQm94OwotCi0JLyoKLQkgKiBUaGUgZGlmZiBiZXR3ZWVuIGEgbW92aW5nIGJveCBhbmQgdGhlIHRyYWNrIHBvc2l0aW9uLgotCSAqLwotCWludCBkaWZmWCwgZGlmZlk7Ci0KLQkvKgotCSAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2xpY2sgaW4gYSBjbGljay1kcmFnCi0JICovCi0JcHJpdmF0ZSBQb2ludCBhbmNob3JQb3NpdGlvbiA9IG5ldyBQb2ludCgtMSwgLTEpOwotCi0JLyoKLQkgKiBBIHRlbXBvcmFyeSBwb2ludCBpbiBhIGRyYWcgb3IgbW92ZSBvcGVyYXRpb24KLQkgKi8KLQlwcml2YXRlIFBvaW50IHRlbXBQb3NpdGlvbiA9IG5ldyBQb2ludCgtMSwgLTEpOwotCi0JLyoKLQkgKiBUaGUgcnViYmVyIGJhbmQgcG9zaXRpb24gKHRoZSBsYXN0IHJlY29yZGVkIHRlbXAgcG9zaXRpb24pCi0JICovCi0JcHJpdmF0ZSBQb2ludCBydWJiZXJiYW5kUG9zaXRpb24gPSBuZXcgUG9pbnQoLTEsIC0xKTsKLQotCS8qCi0JICogQ29uc3RydWN0IGEgQm94Vmlldy4KLQkgKi8KLQlwdWJsaWMgQm94VmlldygpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZU9wZXJhdGlvbkhpc3RvcnkoKTsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSB0aGUgY2FudmFzIG9uIHdoaWNoIGJveGVzIGFyZSBkcmF3biBhbmQgaG9vayB1cCBhbGwgYWN0aW9ucyBhbmQKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlwYWludENhbnZhcyA9IG5ldyBDYW52YXMocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMCi0JCQkJfCBTV1QuSF9TQ1JPTEwgfCBTV1QuTk9fUkVEUkFXX1JFU0laRSk7Ci0KLQkJLy8gc2V0IHVwIGEgR0MgZm9yIGRyYXdpbmcgdGhlIHRyYWNraW5nIHJlY3RhbmdsZQotCQlnYyA9IG5ldyBHQyhwYWludENhbnZhcyk7Ci0JCWdjLnNldEZvcmVncm91bmQocGFpbnRDYW52YXMuZ2V0Rm9yZWdyb3VuZCgpKTsKLQkJZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQotCQkvLyBhZGQgbGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIGNyZWF0ZSBhY3Rpb25zIGFuZCBob29rIHRoZW0gdXAgdG8gdGhlIG1lbnVzIGFuZCB0b29sYmFyCi0JCW1ha2VBY3Rpb25zKCk7Ci0JCWhvb2tDb250ZXh0TWVudSgpOwotCQljcmVhdGVHbG9iYWxBY3Rpb25IYW5kbGVycygpOwotCQljb250cmlidXRlVG9BY3Rpb25CYXJzKCk7Ci0JfQotCi0JLyoKLQkgKiBBZGQgbGlzdGVuZXJzIHRvIHRoZSBjYW52YXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJcGFpbnRDYW52YXMuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoZHJhZ0luUHJvZ3Jlc3MgfHwgbW92ZUluUHJvZ3Jlc3MpCi0JCQkJCXJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQotCQkJCXRlbXBQb3NpdGlvbi54ID0gZXZlbnQueDsKLQkJCQl0ZW1wUG9zaXRpb24ueSA9IGV2ZW50Lnk7Ci0JCQkJQm94IGJveCA9IGJveGVzLmdldEJveChldmVudC54LCBldmVudC55KTsKLQkJCQlpZiAoYm94ICE9IG51bGwpIHsKLQkJCQkJbW92ZUluUHJvZ3Jlc3MgPSB0cnVlOwotCQkJCQltb3ZpbmdCb3ggPSBib3g7Ci0JCQkJCWFuY2hvclBvc2l0aW9uLnggPSBib3gueDE7Ci0JCQkJCWFuY2hvclBvc2l0aW9uLnkgPSBib3gueTE7Ci0JCQkJCWRpZmZYID0gZXZlbnQueCAtIGJveC54MTsKLQkJCQkJZGlmZlkgPSBldmVudC55IC0gYm94LnkxOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRyYWdJblByb2dyZXNzID0gdHJ1ZTsKLQkJCQkJYW5jaG9yUG9zaXRpb24ueCA9IGV2ZW50Lng7Ci0JCQkJCWFuY2hvclBvc2l0aW9uLnkgPSBldmVudC55OwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSB7Ci0JCQkJCXJlc2V0RHJhZyh0cnVlKTsgLy8gYWJvcnQgaWYgcmlnaHQgb3IgbWlkZGxlIG1vdXNlIGJ1dHRvbgotCQkJCQkvLyBwcmVzc2VkCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGFuY2hvclBvc2l0aW9uLnggPT0gLTEpCi0JCQkJCXJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQotCQkJCWlmIChkcmFnSW5Qcm9ncmVzcykgewotCQkJCQlCb3ggYm94ID0gbmV3IEJveChhbmNob3JQb3NpdGlvbi54LCBhbmNob3JQb3NpdGlvbi55LAotCQkJCQkJCXRlbXBQb3NpdGlvbi54LCB0ZW1wUG9zaXRpb24ueSk7Ci0JCQkJCWlmIChib3guZ2V0V2lkdGgoKSA+IDAgJiYgYm94LmdldEhlaWdodCgpID4gMCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlnZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZSgKLQkJCQkJCQkJCW5ldyBBZGRCb3hPcGVyYXRpb24oCi0JCQkJCQkJCQkJCVVuZG9FeGFtcGxlTWVzc2FnZXMuQm94Vmlld19BZGQsCi0JCQkJCQkJCQkJCXVuZG9Db250ZXh0LCBib3hlcywgYm94LCBwYWludENhbnZhcyksCi0JCQkJCQkJCQludWxsLCBudWxsKTsKLQkJCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCQlkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChtb3ZlSW5Qcm9ncmVzcykgewotCQkJCQl0cnkgewotCQkJCQkJZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoCi0JCQkJCQkJCW5ldyBNb3ZlQm94T3BlcmF0aW9uKAotCQkJCQkJCQkJCVVuZG9FeGFtcGxlTWVzc2FnZXMuQm94Vmlld19Nb3ZlLAotCQkJCQkJCQkJCXVuZG9Db250ZXh0LCBtb3ZpbmdCb3gsIHBhaW50Q2FudmFzLAotCQkJCQkJCQkJCWFuY2hvclBvc2l0aW9uKSwgbnVsbCwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQkJbW92ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJCQkJbW92aW5nQm94ID0gbnVsbDsKLQkJCQl9Ci0JCQkJcmVzZXREcmFnKGZhbHNlKTsKLQotCQkJCS8vIHJlZHJhdyBldmVyeXRoaW5nIHRvIGNsZWFuIHVwIHRoZSB0cmFja2luZyByZWN0YW5nbGUKLQkJCQlwYWludENhbnZhcy5yZWRyYXcoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCQlwYWludENhbnZhcy5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCQkJCWlmIChkcmFnSW5Qcm9ncmVzcykgewotCQkJCQljbGVhclJ1YmJlckJhbmRTZWxlY3Rpb24oKTsKLQkJCQkJdGVtcFBvc2l0aW9uLnggPSBldmVudC54OwotCQkJCQl0ZW1wUG9zaXRpb24ueSA9IGV2ZW50Lnk7Ci0JCQkJCWFkZFJ1YmJlckJhbmRTZWxlY3Rpb24oKTsKLQkJCQl9IGVsc2UgaWYgKG1vdmVJblByb2dyZXNzKSB7Ci0JCQkJCWNsZWFyUnViYmVyQmFuZFNlbGVjdGlvbigpOwotCQkJCQlhbmNob3JQb3NpdGlvbi54ID0gZXZlbnQueCAtIGRpZmZYOwotCQkJCQlhbmNob3JQb3NpdGlvbi55ID0gZXZlbnQueSAtIGRpZmZZOwotCQkJCQl0ZW1wUG9zaXRpb24ueCA9IGFuY2hvclBvc2l0aW9uLnggKyBtb3ZpbmdCb3guZ2V0V2lkdGgoKTsKLQkJCQkJdGVtcFBvc2l0aW9uLnkgPSBhbmNob3JQb3NpdGlvbi55ICsgbW92aW5nQm94LmdldEhlaWdodCgpOwotCQkJCQlhZGRSdWJiZXJCYW5kU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcGFpbnRDYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnQuZ2Muc2V0Rm9yZWdyb3VuZChwYWludENhbnZhcy5nZXRGb3JlZ3JvdW5kKCkpOwotCQkJCWJveGVzLmRyYXcoZXZlbnQuZ2MpOwotCQkJfQotCQl9KTsKLQotCQlwYWludENhbnZhcy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCS8vIGRpc3Bvc2UgdGhlIGdjCi0JCQkJZ2MuZGlzcG9zZSgpOwotCQkJCS8vIGRpc3Bvc2UgbGlzdGVuZXJzCi0JCQkJcmVtb3ZlTGlzdGVuZXJzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGxpc3RlbiBmb3IgYSBjaGFuZ2UgaW4gdGhlIHVuZG8gbGltaXQKLQkJcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKSA9PSBQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVU5ET0xJTUlUKSB7Ci0JCQkJCWludCBsaW1pdCA9IFVuZG9QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkJLmdldEludChQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVU5ET0xJTUlUKTsKLQkJCQkJZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLnNldExpbWl0KHVuZG9Db250ZXh0LCBsaW1pdCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlVbmRvUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJCXByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JfQotCi0JLyoKLQkgKiBSZW1vdmUgbGlzdGVuZXJzIHRoYXQgd2VyZSByZWdpc3RlcmVkLiBTaW5jZSB0aGUgY29udHJvbCBpcyBiZWluZwotCSAqIGRpc3Bvc2VkLCB3ZSBhcmUgb25seSByZW1vdmluZyBub24tY29udHJvbCBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUxpc3RlbmVycygpIHsKLQkJVW5kb1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLnJlbW92ZU9wZXJhdGlvbkFwcHJvdmVyKG9wZXJhdGlvbkFwcHJvdmVyKTsKLQl9Ci0KLQkvKgotCSAqIEhvb2sgYSBsaXN0ZW5lciBvbiB0aGUgbWVudSBzaG93aW5nIHNvIHdlIGNhbiBmaWxsIHRoZSBjb250ZXh0IG1lbnUgd2l0aAotCSAqIG91ciBhY3Rpb25zLgotCSAqLwotCXByaXZhdGUgdm9pZCBob29rQ29udGV4dE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsKLQkJbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJQm94Vmlldy50aGlzLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnUgbWVudSA9IG1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUocGFpbnRDYW52YXMpOwotCQlwYWludENhbnZhcy5zZXRNZW51KG1lbnUpOwotCX0KLQotCS8qCi0JICogQWRkIG91ciBhY3Rpb25zIHRvIHRoZSBhY3Rpb24gYmFycy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29udHJpYnV0ZVRvQWN0aW9uQmFycygpIHsKLQkJSUFjdGlvbkJhcnMgYmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlmaWxsTG9jYWxQdWxsRG93bihiYXJzLmdldE1lbnVNYW5hZ2VyKCkpOwotCQlmaWxsTG9jYWxUb29sQmFyKGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiBBZGQgb3VyIHVuZG8gYW5kIHJlZG8gYWN0aW9ucyB0byB0aGUgbG9jYWwgcHVsbGRvd24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbGxMb2NhbFB1bGxEb3duKElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKHVuZG9BY3Rpb24pOwotCQltYW5hZ2VyLmFkZChyZWRvQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWFuYWdlci5hZGQoY2xlYXJCb3hlc0FjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgb3VyIHVuZG8gYW5kIHJlZG8gYWN0aW9ucyB0byB0aGUgY29udGV4dCBtZW51LgotCSAqLwotCXByaXZhdGUgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQodW5kb0FjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHJlZG9BY3Rpb24pOwotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQltYW5hZ2VyLmFkZChjbGVhckJveGVzQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCX0KLQotCS8qCi0JICogQWRkIGFjdGlvbnMgdG8gdGhlIGxvY2FsIHRvb2xiYXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbGxMb2NhbFRvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoY2xlYXJCb3hlc0FjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiBNYWtlIGFueSBsb2NhbCBhY3Rpb25zIHVzZWQgaW4gdGhlIHZpZXcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQljbGVhckJveGVzQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlnZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZSgKLQkJCQkJCQluZXcgQ2xlYXJCb3hlc09wZXJhdGlvbigKLQkJCQkJCQkJCVVuZG9FeGFtcGxlTWVzc2FnZXMuQm94Vmlld19DbGVhckJveGVzLAotCQkJCQkJCQkJdW5kb0NvbnRleHQsIGJveGVzLCBwYWludENhbnZhcyksIG51bGwsCi0JCQkJCQkJbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWNsZWFyQm94ZXNBY3Rpb24uc2V0VGV4dChVbmRvRXhhbXBsZU1lc3NhZ2VzLkJveFZpZXdfQ2xlYXJCb3hlcyk7Ci0JCWNsZWFyQm94ZXNBY3Rpb24KLQkJCQkuc2V0VG9vbFRpcFRleHQoVW5kb0V4YW1wbGVNZXNzYWdlcy5Cb3hWaWV3X0NsZWFyQm94ZXNUb29sVGlwVGV4dCk7Ci0JCWNsZWFyQm94ZXNBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEUpKTsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSB0aGUgZ2xvYmFsIHVuZG8gYW5kIHJlZG8gYWN0aW9uIGhhbmRsZXJzLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVHbG9iYWxBY3Rpb25IYW5kbGVycygpIHsKLQkJLy8gc2V0IHVwIGFjdGlvbiBoYW5kbGVycyB0aGF0IG9wZXJhdGUgb24gdGhlIGN1cnJlbnQgY29udGV4dAotCQl1bmRvQWN0aW9uID0gbmV3IFVuZG9BY3Rpb25IYW5kbGVyKHRoaXMuZ2V0U2l0ZSgpLCB1bmRvQ29udGV4dCk7Ci0JCXJlZG9BY3Rpb24gPSBuZXcgUmVkb0FjdGlvbkhhbmRsZXIodGhpcy5nZXRTaXRlKCksIHVuZG9Db250ZXh0KTsKLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCksCi0JCQkJdW5kb0FjdGlvbik7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwKLQkJCQlyZWRvQWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIFNldCBmb2N1cyB0byB0aGUgY2FudmFzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlwYWludENhbnZhcy5zZXRGb2N1cygpOwotCX0KLQotCS8qCi0JICogUmVzZXQgdGhlIGRyYWcgb3BlcmF0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldERyYWcoYm9vbGVhbiBjbGVhclJ1YmJlcmJhbmQpIHsKLQkJaWYgKGNsZWFyUnViYmVyYmFuZCkgewotCQkJY2xlYXJSdWJiZXJCYW5kU2VsZWN0aW9uKCk7Ci0JCX0KLQkJZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJbW92ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJbW92aW5nQm94ID0gbnVsbDsKLQkJYW5jaG9yUG9zaXRpb24ueCA9IGFuY2hvclBvc2l0aW9uLnkgPSB0ZW1wUG9zaXRpb24ueCA9IHRlbXBQb3NpdGlvbi55ID0gcnViYmVyYmFuZFBvc2l0aW9uLnggPSBydWJiZXJiYW5kUG9zaXRpb24ueSA9IC0xOwotCX0KLQotCS8qCi0JICogQ2xlYXIgdGhlIGV4aXN0aW5nIHJ1YmJlciBiYW5kIHNlbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJSdWJiZXJCYW5kU2VsZWN0aW9uKCkgewotCQlnYy5zZXRGb3JlZ3JvdW5kKHBhaW50Q2FudmFzLmdldEJhY2tncm91bmQoKSk7Ci0JCWdjLmRyYXdSZWN0YW5nbGUoYW5jaG9yUG9zaXRpb24ueCwgYW5jaG9yUG9zaXRpb24ueSwKLQkJCQlydWJiZXJiYW5kUG9zaXRpb24ueCAtIGFuY2hvclBvc2l0aW9uLngsIHJ1YmJlcmJhbmRQb3NpdGlvbi55Ci0JCQkJCQktIGFuY2hvclBvc2l0aW9uLnkpOwotCQlwYWludENhbnZhcy5yZWRyYXcoYW5jaG9yUG9zaXRpb24ueCwgYW5jaG9yUG9zaXRpb24ueSwKLQkJCQlydWJiZXJiYW5kUG9zaXRpb24ueCAtIGFuY2hvclBvc2l0aW9uLngsIHJ1YmJlcmJhbmRQb3NpdGlvbi55Ci0JCQkJCQktIGFuY2hvclBvc2l0aW9uLnksIGZhbHNlKTsKLQkJcGFpbnRDYW52YXMudXBkYXRlKCk7Ci0JCXJ1YmJlcmJhbmRQb3NpdGlvbiA9IG5ldyBQb2ludCgtMSwgLTEpOwotCQlnYy5zZXRGb3JlZ3JvdW5kKHBhaW50Q2FudmFzLmdldEZvcmVncm91bmQoKSk7Ci0JfQotCi0JLyoKLQkgKiBTaG93IGEgcnViYmVyIGJhbmQgc2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRSdWJiZXJCYW5kU2VsZWN0aW9uKCkgewotCQlydWJiZXJiYW5kUG9zaXRpb24gPSB0ZW1wUG9zaXRpb247Ci0JCWdjLmRyYXdSZWN0YW5nbGUoYW5jaG9yUG9zaXRpb24ueCwgYW5jaG9yUG9zaXRpb24ueSwKLQkJCQlydWJiZXJiYW5kUG9zaXRpb24ueCAtIGFuY2hvclBvc2l0aW9uLngsIHJ1YmJlcmJhbmRQb3NpdGlvbi55Ci0JCQkJCQktIGFuY2hvclBvc2l0aW9uLnkpOwotCX0KLQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgd29ya2JlbmNoIG9wZXJhdGlvbiBoaXN0b3J5IGZvciBvdXIgdW5kbyBjb250ZXh0LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplT3BlcmF0aW9uSGlzdG9yeSgpIHsKLQkJLy8gY3JlYXRlIGEgdW5pcXVlIHVuZG8gY29udGV4dCB0byByZXByZXNlbnQgdGhpcyB2aWV3J3MgdW5kbyBoaXN0b3J5Ci0JCXVuZG9Db250ZXh0ID0gbmV3IE9iamVjdFVuZG9Db250ZXh0KHRoaXMpOwotCi0JCS8vIHNldCB0aGUgdW5kbyBsaW1pdCBmb3IgdGhpcyBjb250ZXh0IGJhc2VkIG9uIHRoZSBwcmVmZXJlbmNlCi0JCWludCBsaW1pdCA9IFVuZG9QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludCgKLQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVU5ET0xJTUlUKTsKLQkJZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLnNldExpbWl0KHVuZG9Db250ZXh0LCBsaW1pdCk7Ci0KLQkJLy8gSW5zdGFsbCBhbiBvcGVyYXRpb24gYXBwcm92ZXIgZm9yIHRoaXMgdW5kbyBjb250ZXh0IHRoYXQgcHJvbXB0cwotCQkvLyBhY2NvcmRpbmcgdG8gYSB1c2VyIHByZWZlcmVuY2UuCi0JCW9wZXJhdGlvbkFwcHJvdmVyID0gbmV3IFByb21wdGluZ1VzZXJBcHByb3Zlcih1bmRvQ29udGV4dCk7Ci0JCWdldE9wZXJhdGlvbkhpc3RvcnkoKS5hZGRPcGVyYXRpb25BcHByb3ZlcihvcGVyYXRpb25BcHByb3Zlcik7Ci0JfQotCi0JLyoKLQkgKiBHZXQgdGhlIG9wZXJhdGlvbiBoaXN0b3J5IGZyb20gdGhlIHdvcmtiZW5jaC4KLQkgKi8KLQlwcml2YXRlIElPcGVyYXRpb25IaXN0b3J5IGdldE9wZXJhdGlvbkhpc3RvcnkoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldE9wZXJhdGlvblN1cHBvcnQoKQotCQkJCS5nZXRPcGVyYXRpb25IaXN0b3J5KCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby92aWV3cy9VbmRvSGlzdG9yeVZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvL29yZy9lY2xpcHNlL3VpL2V4YW1wbGVzL3VuZG8vdmlld3MvVW5kb0hpc3RvcnlWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MWYyNmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9FY2xpcHNlIFVJIEV4YW1wbGVzIFVuZG8vb3JnL2VjbGlwc2UvdWkvZXhhbXBsZXMvdW5kby92aWV3cy9VbmRvSGlzdG9yeVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8udmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8uVW5kb0V4YW1wbGVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLlVuZG9QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm9wZXJhdGlvbnMuUmVkb0FjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkub3BlcmF0aW9ucy5VbmRvQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25IaXN0b3J5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi0vKioKLSAqIFRoaXMgdmlldyBzaG93cyB3aGF0IG9wZXJhdGlvbnMgYXJlIGJlaW5nIGFkZGVkIHRvIHRoZSBvcGVyYXRpb25zIGhpc3RvcnkgZm9yCi0gKiB1bmRvLiBUaGUgdmlldyBjYW4gYmUgZmlsdGVyZWQgYnkgYW55IG9wZXJhdGlvbiBjb250ZXh0LiBBIG51bGwgb3BlcmF0aW9uCi0gKiBjb250ZXh0IGluZGljYXRlcyB0aGF0IHRoZSB2aWV3IHNob3VsZCBub3QgYmUgZmlsdGVyZWQuCi0gKiAKLSAqIDxwPgotICogU2VsZWN0aW5nIHVuZG8gb3IgcmVkbyBmcm9tIHRoZSBjb250ZXh0IG1lbnUgb3IgdGhlIGVkaXQgbWVudSB3aWxsIHBlcmZvcm0gYQotICogbGluZWFyIHVuZG8gaW4gdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgdmlldy4gU2VsZWN0aW5nICJVbmRvIHNlbGVjdGVkIgotICogYWxsb3dzIGV4cGVyaW1lbnRhdGlvbiB3aXRoIGRpcmVjdCB1bmRvLiBPcGVyYXRpb25zIHRoYXQgYXJlIHVuZG9hYmxlIG1heSBiZQotICogdW5kb25lIGluZGVwZW5kZW50bHkgb2YgdGhlaXIgb3JkZXIgaW4gdGhlIGhpc3RvcnkuCi0gKi8KLQotcHVibGljIGNsYXNzIFVuZG9IaXN0b3J5VmlldyBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0KLQlwcml2YXRlIEFjdGlvbiBmaWx0ZXJBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBkb3VibGVDbGlja0FjdGlvbjsKLQotCXByaXZhdGUgQWN0aW9uIHNlbGVjdGl2ZVVuZG9BY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiByZWZyZXNoTGlzdEFjdGlvbjsKLQotCXByaXZhdGUgSU9wZXJhdGlvbkhpc3RvcnkgaGlzdG9yeSA9IE9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5Ci0JCQkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpOwotCi0JcHJpdmF0ZSBJVW5kb0NvbnRleHQgZkNvbnRleHQgPSBJT3BlcmF0aW9uSGlzdG9yeS5HTE9CQUxfVU5ET19DT05URVhUOwotCi0JcHJpdmF0ZSBVbmRvQWN0aW9uSGFuZGxlciB1bmRvQWN0aW9uOwotCi0JcHJpdmF0ZSBSZWRvQWN0aW9uSGFuZGxlciByZWRvQWN0aW9uOwotCQotCXByaXZhdGUgYm9vbGVhbiBzaG93RGVidWcgPSBVbmRvUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9TSE9XREVCVUcpOwotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qCi0JICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgc2hvd3MgdGhlIG9wZXJhdGlvbnMgaW4gdGhlIHVuZG8gcG9ydGlvbiBvZiB0aGUKLQkgKiBvcGVyYXRpb24gaGlzdG9yeS4gIFRoZSBoaXN0b3IgaXMgZmlsdGVyZWQgYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotCSAqIHVuZG8gY29udGV4dC4KLQkgKi8KLQotCWNsYXNzIFZpZXdDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwKLQkJCUlPcGVyYXRpb25IaXN0b3J5TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdiwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCS8vIHdlIG5ldmVyIGNoYW5nZSBpbnB1dHMsIHNvIHdlIGp1c3QgdXNlIHRoaXMgYXMgYSBwbGFjZSB0byBhZGQgb3VyCi0JCQkvLyBsaXN0ZW5lci4KLQkJCWhpc3RvcnkuYWRkT3BlcmF0aW9uSGlzdG9yeUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWhpc3RvcnkucmVtb3ZlT3BlcmF0aW9uSGlzdG9yeUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJLy8gc2hvdyB0aGUgaXRlbXMgaW4gdGhlIG9wZXJhdGlvbnMgaGlzdG9yeS4KLQkJCXJldHVybiBoaXN0b3J5LmdldFVuZG9IaXN0b3J5KGZDb250ZXh0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhpc3RvcnlOb3RpZmljYXRpb24oT3BlcmF0aW9uSGlzdG9yeUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAodmlld2VyLmdldFRhYmxlKCkuaXNEaXNwb3NlZCgpKQotCQkJCXJldHVybjsKLQkJCURpc3BsYXkgZGlzcGxheSA9IHZpZXdlci5nZXRUYWJsZSgpLmdldERpc3BsYXkoKTsKLQkJCXN3aXRjaCAoZXZlbnQuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgT3BlcmF0aW9uSGlzdG9yeUV2ZW50Lk9QRVJBVElPTl9BRERFRDoKLQkJCWNhc2UgT3BlcmF0aW9uSGlzdG9yeUV2ZW50Lk9QRVJBVElPTl9SRU1PVkVEOgotCQkJY2FzZSBPcGVyYXRpb25IaXN0b3J5RXZlbnQuVU5ET05FOgotCQkJY2FzZSBPcGVyYXRpb25IaXN0b3J5RXZlbnQuUkVET05FOgotCQkJCWlmIChldmVudC5nZXRPcGVyYXRpb24oKS5oYXNDb250ZXh0KGZDb250ZXh0KQotCQkJCQkJJiYgZGlzcGxheSAhPSBudWxsKSB7Ci0JCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCS8vIHJlZnJlc2ggYWxsIGxhYmVscyBpbiBjYXNlIGFueSBvcGVyYXRpb24gaGFzCi0JCQkJCQkJLy8gY2hhbmdlZCBkeW5hbWljYWxseQotCQkJCQkJCS8vIHdpdGhvdXQgbm90aWZ5aW5nIHRoZSBvcGVyYXRpb24gaGlzdG9yeS4KLQkJCQkJCQlpZiAoIXZpZXdlci5nZXRUYWJsZSgpLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJdmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQSBzaW1wbGUgbGFiZWwgcHJvdmlkZXIgdGhhdCB1c2VzIGEgcHJlZmVyZW5jZSB0byBkZXRlcm1pbmUKLQkgKiB3aGV0aGVyIHRoZSBzaW1wbGUgbGFiZWwgb3IgdGhlIGRlYnVnZ2luZyBsYWJlbCAodG9TdHJpbmcoKSkgCi0JICogZm9yIGFuIG9wZXJhdGlvbiBpcyBzaG93bi4KLQkgKi8KLQljbGFzcyBWaWV3TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cwotCQkJSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBnZXRUZXh0KG9iaik7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gZ2V0SW1hZ2Uob2JqKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoIXNob3dEZWJ1ZyAmJiBvYmogaW5zdGFuY2VvZiBJVW5kb2FibGVPcGVyYXRpb24pCi0JCQkJcmV0dXJuICgoSVVuZG9hYmxlT3BlcmF0aW9uKW9iaikuZ2V0TGFiZWwoKTsKLQkJCXJldHVybiBvYmoudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qCi0JICogQ3JlYXRlIGEgdGFibGUgdmlld2VyIHRvIHNob3cgdGhlIGxpc3Qgb2Ygb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFZpZXdDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWaWV3TGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldElucHV0KGdldFZpZXdTaXRlKCkpOwotCQltYWtlQWN0aW9ucygpOwotCQlob29rQ29udGV4dE1lbnUoKTsKLQkJaG9va0RvdWJsZUNsaWNrQWN0aW9uKCk7Ci0JCWFkZExpc3RlbmVycygpOwotCQljcmVhdGVHbG9iYWxBY3Rpb25IYW5kbGVycygpOwotCX0KLQkKLQkvKgotCSAqIEFkZCBhbnkgbGlzdGVuZXJzIG5lZWRlZCBieSB0aGlzIHZpZXcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpID09IFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9TSE9XREVCVUcpIHsKLQkJCQkJc2hvd0RlYnVnID0gVW5kb1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0hPV0RFQlVHKTsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCVVuZG9QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlyZW1vdmVMaXN0ZW5lcnMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qCi0JICogUmVtb3ZlIGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhpcyB2aWV3LgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcnMoKSB7Ci0JCVVuZG9QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CQotCX0KLQotCi0JLyoKLQkgKiBDcmVhdGUgZ2xvYmFsIGFjdGlvbiBoYW5kbGVycyB0byBjb250cm9sIHVuZG8gYW5kIHJlZG8uIFdlIHVzZSB0aGUgYWN0aW9uCi0JICogaGFuZGxlcnMgcmF0aGVyIHRoYW4gdGhlIFVuZG9SZWRvQWN0aW9uR3JvdXAgYmVjYXVzZSB0aGlzIHZpZXcKLQkgKiBkeW5hbWljYWxseSBzZXRzIHRoZSB1bmRvIGNvbnRleHQgb2YgdGhlIGhhbmRsZXJzLiBNb3N0IHZpZXdzIHRoYXQgc2ltcGx5Ci0JICogZGVzaXJlIGFuIHVuZG8gYW5kIHJlZG8gbWVudSBhY3Rpb24gZm9yIHRoZWlyIHVuZG8gY29udGV4dCBjYW4gdXNlCi0JICogVW5kb1JlZG9BY3Rpb25Hcm91cC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlR2xvYmFsQWN0aW9uSGFuZGxlcnMoKSB7Ci0JCS8vIHNldCB1cCBhY3Rpb24gaGFuZGxlcnMgdGhhdCBvcGVyYXRlIG9uIHRoZSBjdXJyZW50IGNvbnRleHQKLQkJdW5kb0FjdGlvbiA9IG5ldyBVbmRvQWN0aW9uSGFuZGxlcih0aGlzLmdldFNpdGUoKSwgZkNvbnRleHQpOwotCQlyZWRvQWN0aW9uID0gbmV3IFJlZG9BY3Rpb25IYW5kbGVyKHRoaXMuZ2V0U2l0ZSgpLCBmQ29udGV4dCk7Ci0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCXVuZG9BY3Rpb24pOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0JCQkJcmVkb0FjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiBQdXQgdXAgYSBkaWFsb2cgdGhhdCBzaG93cyBhbGwgb2YgdGhlIGF2YWlsYWJsZSB1bmRvIGNvbnRleHRzIGFuZCBhbGxvdwotCSAqIHRoZSB1c2VyIHRvIHNlbGVjdCBvbmUuCi0JICovCi0JcHJpdmF0ZSBJVW5kb0NvbnRleHQgc2VsZWN0Q29udGV4dCgpIHsKLQkJLy8gVGhpcyB3b3VsZCBiZSBiZXR0ZXIgaW1wbGVtZW50ZWQgYXMgYSB2aWV3IGZpbHRlciwgYnV0IGZvciBub3csIHdlIAotCQkvLyB3aWxsIHVzZSBhIGRpYWxvZyB0aGF0IGNvbGxlY3RzIHRoZSBhdmFpbGFibGUgdW5kbyBjb250ZXh0cy4KLQkJTGlzdCBpbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVVuZG9hYmxlT3BlcmF0aW9uW10gb3BlcmF0aW9ucyA9IGhpc3RvcnkKLQkJCQkuZ2V0VW5kb0hpc3RvcnkoSU9wZXJhdGlvbkhpc3RvcnkuR0xPQkFMX1VORE9fQ09OVEVYVCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3BlcmF0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJSVVuZG9Db250ZXh0W10gY29udGV4dHMgPSBvcGVyYXRpb25zW2ldLmdldENvbnRleHRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbnRleHRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKCFpbnB1dC5jb250YWlucyhjb250ZXh0c1tqXSkpIHsKLQkJCQkJaW5wdXQuYWRkKGNvbnRleHRzW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW5wdXQuYWRkKElPcGVyYXRpb25IaXN0b3J5LkdMT0JBTF9VTkRPX0NPTlRFWFQpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKElVbmRvQ29udGV4dCkgZWxlbWVudCkuZ2V0TGFiZWwoKTsKLQkJCX0KLQkJfTsKLQotCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCksIGxhYmVsUHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0TXVsdGlwbGVTZWxlY3Rpb24oZmFsc2UpOwotCQlkaWFsb2cuc2V0VGl0bGUoVW5kb0V4YW1wbGVNZXNzYWdlcy5VbmRvSGlzdG9yeVZpZXdfQ29udGV4dEZpbHRlckRpYWxvZyk7IAotCQlkaWFsb2cuc2V0TWVzc2FnZShVbmRvRXhhbXBsZU1lc3NhZ2VzLlVuZG9IaXN0b3J5Vmlld19DaG9vc2VDb250ZXh0TWVzc2FnZSk7IAotCQlkaWFsb2cuc2V0RWxlbWVudHMoaW5wdXQudG9BcnJheSgpKTsKLQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb25zKG5ldyBPYmplY3RbXSB7IGZDb250ZXh0IH0pOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCU9iamVjdFtdIGNvbnRleHRzID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQkJaWYgKGNvbnRleHRzWzBdIGluc3RhbmNlb2YgSVVuZG9Db250ZXh0KQotCQkJCXJldHVybiAoSVVuZG9Db250ZXh0KSBjb250ZXh0c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIFJlc2V0IHRoZSB1bmRvIGNvbnRleHQgb24gd2hpY2ggdGhlIGhpc3RvcnkgaXMgZmlsdGVyZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dChJVW5kb0NvbnRleHQgY29udGV4dCkgewotCQlmQ29udGV4dCA9IGNvbnRleHQ7Ci0JCS8vIHNldHRpbmcgdGhlIGNvbnRleHQgaW50byB0aGUgYWN0aW9ucyB1cGRhdGVzIHRoZSBtZW51IGxhYmVscywgZXRjLgotCQlyZWRvQWN0aW9uLnNldENvbnRleHQoY29udGV4dCk7Ci0JCXVuZG9BY3Rpb24uc2V0Q29udGV4dChjb250ZXh0KTsKLQkJLy8gbmVlZCB0byByZWZyZXNoIHRoZSB2aWV3ZXIKLQkJdmlld2VyLnJlZnJlc2goZmFsc2UpOwotCX0KLQotCS8qCi0JICogSG9vayB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgdmlldwotCSAqLwotCXByaXZhdGUgdm9pZCBob29rQ29udGV4dE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsKLQkJbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJVW5kb0hpc3RvcnlWaWV3LnRoaXMuZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotCQkJfQotCQl9KTsKLQkJTWVudSBtZW51ID0gbWVudU1nci5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZW51TWdyLCB2aWV3ZXIpOwotCX0KLQotCS8qCi0JICogRmlsbCB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgdmlldy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCS8vIEZpcnN0IGFkZCB0aGUgZ2xvYmFsIHVuZG8vcmVkbyBhY3Rpb25zCi0JCXVuZG9BY3Rpb24udXBkYXRlKCk7Ci0JCXJlZG9BY3Rpb24udXBkYXRlKCk7Ci0JCW1hbmFnZXIuYWRkKHVuZG9BY3Rpb24pOwotCQltYW5hZ2VyLmFkZChyZWRvQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCi0JCS8vIE5vdyBhZGQgb3VyIHNwZWNpYWxpemVkIGFjdGlvbnMKLQkJbWFuYWdlci5hZGQoc2VsZWN0aXZlVW5kb0FjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKGZpbHRlckFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHJlZnJlc2hMaXN0QWN0aW9uKTsKLQotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uID0gKElVbmRvYWJsZU9wZXJhdGlvbikgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlzZWxlY3RpdmVVbmRvQWN0aW9uLnNldEVuYWJsZWQob3BlcmF0aW9uLmNhblVuZG8oKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3RpdmVVbmRvQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJLy8gT3RoZXIgcGx1Zy1pbnMgY2FuIGNvbnRyaWJ1dGUgYWN0aW9ucyBoZXJlCi0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSB0aGUgYWN0aW9ucyBmb3IgdGhlIHZpZXcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlmaWx0ZXJBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlVbmRvQ29udGV4dCBjb250ZXh0ID0gc2VsZWN0Q29udGV4dCgpOwotCQkJCWlmIChmQ29udGV4dCAhPSBjb250ZXh0ICYmIGNvbnRleHQgIT0gbnVsbCkgewotCQkJCQlzZXRDb250ZXh0KGNvbnRleHQpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZmlsdGVyQWN0aW9uLnNldFRleHQoVW5kb0V4YW1wbGVNZXNzYWdlcy5VbmRvSGlzdG9yeVZpZXdfRmlsdGVyVGV4dCk7Ci0JCWZpbHRlckFjdGlvbi5zZXRUb29sVGlwVGV4dChVbmRvRXhhbXBsZU1lc3NhZ2VzLlVuZG9IaXN0b3J5Vmlld19GaWx0ZXJUb29sVGlwVGV4dCk7Ci0JCWZpbHRlckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQlJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKSk7Ci0KLQkJc2VsZWN0aXZlVW5kb0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChJVW5kb2FibGVPcGVyYXRpb24pICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAob3BlcmF0aW9uLmNhblVuZG8oKSkgewotCQkJCQl0cnkgewotCQkJCQkJaGlzdG9yeS51bmRvT3BlcmF0aW9uKG9wZXJhdGlvbiwgbnVsbCwgdW5kb0FjdGlvbik7Ci0JCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlzaG93TWVzc2FnZShVbmRvRXhhbXBsZU1lc3NhZ2VzLlVuZG9IaXN0b3J5Vmlld19PcGVyYXRpb25FeGNlcHRpb24pOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2hvd01lc3NhZ2UoVW5kb0V4YW1wbGVNZXNzYWdlcy5VbmRvSGlzdG9yeVZpZXdfT3BlcmF0aW9uSW52YWxpZCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlzZWxlY3RpdmVVbmRvQWN0aW9uLnNldFRleHQoVW5kb0V4YW1wbGVNZXNzYWdlcy5VbmRvSGlzdG9yeVZpZXdfVW5kb1NlbGVjdGVkKTsKLQkJc2VsZWN0aXZlVW5kb0FjdGlvbi5zZXRUb29sVGlwVGV4dChVbmRvRXhhbXBsZU1lc3NhZ2VzLlVuZG9IaXN0b3J5Vmlld19VbmRvU2VsZWN0ZWRUb29sVGlwVGV4dCk7Ci0JCXNlbGVjdGl2ZVVuZG9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VTkRPKSk7Ci0KLQkJcmVmcmVzaExpc3RBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghdmlld2VyLmdldFRhYmxlKCkuaXNEaXNwb3NlZCgpKQotCQkJCQl2aWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJCX0KLQkJfTsKLQkJcmVmcmVzaExpc3RBY3Rpb24uc2V0VGV4dChVbmRvRXhhbXBsZU1lc3NhZ2VzLlVuZG9IaXN0b3J5Vmlld19SZWZyZXNoTGlzdCk7Ci0JCXJlZnJlc2hMaXN0QWN0aW9uLnNldFRvb2xUaXBUZXh0KFVuZG9FeGFtcGxlTWVzc2FnZXMuVW5kb0hpc3RvcnlWaWV3X1JlZnJlc2hMaXN0VG9vbFRpcFRleHQpOwotCi0JCWRvdWJsZUNsaWNrQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uID0gKElVbmRvYWJsZU9wZXJhdGlvbikgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKG9wZXJhdGlvbi5nZXRMYWJlbCgpKTsKLQkJCQlidWYuYXBwZW5kKCJcbiIpOwotCQkJCWJ1Zi5hcHBlbmQoIkVuYWJsZWQ9Iik7CS8vJE5PTi1OTFMtMSQKLQkJCQlidWYuYXBwZW5kKG5ldyBCb29sZWFuKG9wZXJhdGlvbi5jYW5VbmRvKCkpLnRvU3RyaW5nKCkpOwotCQkJCWJ1Zi5hcHBlbmQoIlxuIik7Ci0JCQkJYnVmLmFwcGVuZChvcGVyYXRpb24uZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsKLQkJCQlzaG93TWVzc2FnZShidWYudG9TdHJpbmcoKSk7Ci0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIFJlZ2lzdGVyIGEgZG91YmxlIGNsaWNrIGFjdGlvbiB3aXRoIHRoZSBkb3VibGUgY2xpY2sgZXZlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhvb2tEb3VibGVDbGlja0FjdGlvbigpIHsKLQkJdmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCWRvdWJsZUNsaWNrQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIFNob3cgYW4gaW5mbyBtZXNzYWdlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNob3dNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwKLQkJCQlVbmRvRXhhbXBsZU1lc3NhZ2VzLlVuZG9IaXN0b3J5Vmlld19JbmZvRGlhbG9nVGl0bGUsIG1lc3NhZ2UpOwotCX0KLQotCS8qCi0JICogVGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiBlbmFibGVkID0gIXNlbGVjdGlvbi5pc0VtcHR5KCk7Ci0JCXNlbGVjdGl2ZVVuZG9BY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKgotCSAqIFBhc3MgdGhlIGZvY3VzIHJlcXVlc3QgdG8gdGhlIHZpZXdlcidzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL01FVEEtSU5GL01BTklGRVNULk1GIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg1NGY5Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8uVW5kb1BsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlUGx1Z2luLnByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGI5ZDM4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gRWNsaXBzZSBVSSBFeGFtcGxlcyBVbmRvLwotCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9kb2MtaHRtbC91aV91bmRvX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL2RvYy1odG1sL3VpX3VuZG9fZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0ZjAyOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL2RvYy1odG1sL3VpX3VuZG9fZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlVuZG8gRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPgotPGI+RXhhbXBsZSAtIFVuZG88L2I+PC9oMj4KLQotPGgzPkludHJvZHVjdGlvbjwvaDM+Ci08cD4KLVRoZSBVbmRvIEV4YW1wbGUgYWRkcyB0d28gdmlld3MgdG8gdGhlIHdvcmtiZW5jaC4gIFRoZSA8Yj5Cb3ggVmlldzwvYj4gaXMgYSBydWRpbWVudGFyeQotdmlldyB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBjcmVhdGUgYm94ZXMgYnkgY2xpY2tpbmcgaW50byBlbXB0eSBzcGFjZSBhbmQgZHJhZ2dpbmcgdGhlIG1vdXNlCi10byBmb3JtIGEgYm94LiAgQm94ZXMgY2FuIGJlIG1vdmVkIGJ5IHNlbGVjdGluZyBhIGJveCBhbmQgZHJhZ2dpbmcgaXQgYXJvdW5kLiAgVGhlIHVzZXIKLW1heSB1bmRvIGFuZCByZWRvIGFueSBvcGVyYXRpb25zIHBlcmZvcm1lZCBpbiB0aGUgYm94IHZpZXcuICBUaGUgPGI+VW5kbyBIaXN0b3J5Ci1WaWV3PC9iPiBzaG93cyB0aGUgdW5kbyBoaXN0b3J5IG1haW50YWluZWQgYnkgdGhlIHdvcmtiZW5jaCBvcGVyYXRpb25zIGhpc3RvcnkuCi08L3A+Ci08aDM+RmVhdHVyZXMgZGVtb25zdHJhdGVkIGluIHRoZSBleGFtcGxlPC9oMz4KLTx1bD4KLTxsaT5DcmVhdGluZyBhbiA8dHQ+SVVuZG9hYmxlT3BlcmF0aW9uPC90dD4gaW5zaWRlIGFuIGFjdGlvbiAoRGVsZXRlIGFsbCBib3hlcykgdG8gcGVyZm9ybSB0aGUgYWN0aW9uJ3MKLXdvcmsgLjwvbGk+Ci08bGk+Q3JlYXRpbmcgYW4gPHR0PklVbmRvYWJsZU9wZXJhdGlvbjwvdHQ+IGJhc2VkIG9uIGFuIG9wZXJhdGlvbiBpbXBsaWVkIGJ5IGEgZ2VzdHVyZSAoQWRkaW5nCi1hbmQgbW92aW5nIGJveGVzKS48L2xpPgotPGxpPlVzaW5nIGEgbG9jYWwgPHR0PklVbmRvQ29udGV4dDwvdHQ+IHRvIGtlZXAgdW5kbyBvcGVyYXRpb25zIGxvY2FsIHRvIGEgcGFydGljdWxhciB2aWV3LjwvbGk+Ci08bGk+VXNpbmcgdGhlIHBsYXRmb3JtIHVuZG8gYW5kIHJlZG8gYWN0aW9uIGhhbmRsZXJzIHRvIHByb3ZpZGUgdW5kbyBhbmQgcmVkbyBpbiBhIHZpZXcuPC9saT4KLTxsaT5Qcm92aWRpbmcgYSB1c2VyIHByZWZlcmVuY2UgZm9yIHNldHRpbmcgdGhlIHVuZG8gbGltaXQgZm9yIGEgcGFydGljdWxhciB1bmRvIGNvbnRleHQuPC9saT4KLTxsaT5Vc2luZyBhbiA8dHQ+SU9wZXJhdGlvbkFwcHJvdmVyPC90dD4gdG8gaW5zdGFsbCBhZGRpdGlvbmFsIHBvbGljeSAoUHJvbXB0IGJlZm9yZSB1bmRvKSBpbgotdGhlIG9wZXJhdGlvbiBoaXN0b3J5LjwvbGk+Ci08bGk+VXNpbmcgPHR0PklPcGVyYXRpb25IaXN0b3J5PC90dD4gcHJvdG9jb2wgdG8gc2hvdyB1bmRvIGhpc3RvcnkgZm9yIGRpZmZlcmVudAotdW5kbyBjb250ZXh0cyAoVW5kbyBIaXN0b3J5IFZpZXcpLjwvbGk+Ci08L3VsPgotPGgzPkZlYXR1cmVzIG5vdCBkZW1vbnN0cmF0ZWQ8L2gzPgotPHVsPgotPGxpPlNpbmNlIHRoZSBleGFtcGxlIGlzIGZvY3VzZWQgb24gc2ltcGxlIHVuZG8sIHRoZSBCb3hWaWV3IGNvZGUgaXMga2VwdAotdG8gYSBtaW5pbXVtLiAgVGhlcmVmb3JlLCBpdCBkb2VzIG5vdCBwcm92aWRlIHRoZSBleHBlY3RlZCBncmFwaGljYWwgZWRpdG9yIGZlYXR1cmVzIHN1Y2ggYXMKLXNlbGVjdGlvbiwgcmVzaXplIGFuZCBzZWxlY3Rpb24gaGFuZGxlcywgY29sb3IgYW5kIGxpbmUgc3R5bGUgYXR0cmlidXRlcywgZXRjLiAgRm9yIHRoZSBzYW1lCi1yZWFzb24sIGFkdmFuY2VkIGZlYXR1cmVzIGluIHRoZSB1bmRvIGZyYW1ld29yayBhcmUgbm90IHNob3duLjwvbGk+Ci08bGk+VGhlcmUgaXMgbm8gZXhhbXBsZSBvZiBhc3NpZ25pbmcgbXVsdGlwbGUgdW5kbyBjb250ZXh0cyBpbiBvcmRlciB0byBzaGFyZSBvcGVyYXRpb25zIGJldHdlZW4KLXZpZXdzIG9yIGVkaXRvcnMuPC9saT4KLTxsaT5UaGVyZSBpcyBubyBleGFtcGxlIG9mIHVzaW5nIGNvbXBvc2l0ZSB1bmRvIG9wZXJhdGlvbnMuPC9saT4KLTwvdWw+Ci08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZyb20gRWNsaXBzZSdzIDxzdHJvbmc+V2luZG93PC9zdHJvbmc+IG1lbnUgc2VsZWN0IDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+ICZndDsgPHN0cm9uZz5PdGhlci4uLjwvc3Ryb25nPi4gIAotSW4gdGhlIDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+IGRpYWxvZywgZXhwYW5kIDxzdHJvbmc+VW5kbyBFeGFtcGxlczwvc3Ryb25nPiBhbmQgc2VsZWN0Ci10aGUgdmlldyBuYW1lZCA8c3Ryb25nPkJveCBWaWV3PC9zdHJvbmc+LiBUaGUgYm94IHZpZXcgd2lsbCBhcHBlYXIuCi08L3A+Ci08cD4KLUxpa2V3aXNlLCBmcm9tIHRoZSA8c3Ryb25nPldpbmRvdzwvc3Ryb25nPiBtZW51IHNlbGVjdCA8c3Ryb25nPlNob3cgVmlldzwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+T3RoZXIuLi48L3N0cm9uZz4uICAKLUluIHRoZSA8c3Ryb25nPlNob3cgVmlldzwvc3Ryb25nPiBkaWFsb2csIGV4cGFuZCA8c3Ryb25nPlVuZG8gRXhhbXBsZXM8L3N0cm9uZz4gYW5kIHNlbGVjdAotdGhlIHZpZXcgbmFtZWQgPHN0cm9uZz5VbmRvIEhpc3RvcnkgVmlldzwvc3Ryb25nPi4gQSB2aWV3IGNvbnRhaW5pbmcgdGhlIHVuZG8gaGlzdG9yeSB3aWxsIGFwcGVhci4KLVRoaXMgdmlldyBjYW4gYmUgdXNlZCBhbG9uZ3NpZGUgdGhlIEJveCBWaWV3IHRvIHdhdGNoIHRoZSB1bmRvIGhpc3RvcnkgYXMgYm94ZXMgYXJlIGFkZGVkIG9yIG1vdmVkLiAgSXQKLWNhbiBhbHNvIGJlIHVzZWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgQm94IFZpZXcgdG8gZm9sbG93IHRoZSB1bmRvIGhpc3RvcnkgZm9yIGFueSB2aWV3IG9yIGVkaXRvciB0aGF0Ci11c2VzIHRoZSB3b3JrYmVuY2ggb3BlcmF0aW9ucyBoaXN0b3J5IHRvIHRyYWNrIHVuZG9hYmxlIG9wZXJhdGlvbnMuCi08L3A+Ci08aDM+RGV0YWlsczwvaDM+Ci08aDQ+Qm94IFZpZXc8L2g0PgotPHA+Q2xpY2sgaW4gdGhlIGJveCB2aWV3IGFuZCBkcmFnIHRoZSBtb3VzZSB0byBjcmVhdGUgYSBib3ggdGhhdCBmb2xsb3dzIHRoZSBtb3VzZS4gIENsaWNraW5nIGluc2lkZSBhbgotZXhpc3RpbmcgYm94IGFuZCBkcmFnZ2luZyB0aGUgbW91c2Ugd2lsbCBtb3ZlIHRoZSBib3ggdG8gYSBuZXcgbG9jYXRpb24uICBOb3RlIHRoZSBvcGVyYXRpb25zIHRoYXQgYXBwZWFyCi1pbiB0aGUgPHN0cm9uZz5VbmRvPC9zdHJvbmc+IGFuZCA8c3Ryb25nPlJlZG88L3N0cm9uZz4gbWVudXMgYXMgYm94ZXMgYXJlIGFkZGVkIGFuZCBtb3ZlZC4gIFRoZSBib3ggdmlldwotY2FuIGJlIGNsZWFyZWQgYnkgc2VsZWN0aW5nIDxzdHJvbmc+RGVsZXRlIGFsbCBib3hlczwvc3Ryb25nPiBmcm9tIHRoZSBjb250ZXh0IG1lbnUgb3IgdGhlIHZpZXcncyBsb2NhbAotbWVudSBhbmQgdG9vbGJhci4gIFRoaXMgb3BlcmF0aW9uIGNhbiBhbHNvIGJlIHVuZG9uZS4KLTwvcD4KLTxoND5VbmRvIEhpc3RvcnkgVmlldzwvaDQ+Ci08cD5UaGUgVW5kbyBIaXN0b3J5IFZpZXcgc2hvd3MgdGhlIG9wZXJhdGlvbnMgYXZhaWxhYmxlIGZvciB1bmRvIGluIGFsbCB1bmRvIGNvbnRleHRzLiAgVG8gdmlldyB0aGUgaGlzdG9yeQotaW4gYSBwYXJ0aWN1bGFyIHVuZG8gY29udGV4dCwgc2VsZWN0IDxzdHJvbmc+RmlsdGVyIG9uLi4uPC9zdHJvbmc+IGZyb20gdGhlIHZpZXcncyBjb250ZXh0IG1lbnUuCi1UaGlzIHdpbGwgZmlsdGVyIHRoZSB1bmRvIGhpc3Rvcnkgb24gYSBwYXJ0aWN1bGFyIHVuZG8gY29udGV4dC4gIFRoZSB2aWV3IGNhbiBiZSB1c2VkIHRvIHZpZXcgdGhlIHVuZG8gaGlzdG9yeQotZm9yIHRoZSBCb3ggVmlldywgZm9yIFNESyB0ZXh0IGVkaXRvcnMsIGFuZCBmb3IgdW5kb2FibGUgb3BlcmF0aW9ucyB0aGF0IGFmZmVjdCB0aGUgd29ya3NwYWNlLCBzdWNoIGFzCi1yZWZhY3RvcmluZyBvcGVyYXRpb25zLiAgVW5kbyBhbmQgcmVkbyBjYW4gYmUgcGVyZm9ybWVkIGZyb20gdGhlIFVuZG8gSGlzdG9yeSBWaWV3J3MgbWVudXMuICA8Yj5VbmRvIHNlbGVjdGVkPC9iPgotd2lsbCBhdHRlbXB0IHRvIHVuZG8gdGhlIHNlbGVjdGVkIG9wZXJhdGlvbiBpbiB0aGUgdW5kbyBoaXN0b3J5LCByZWdhcmRsZXNzIG9mIGl0cyBwb3NpdGlvbiBpbiB0aGUgb3BlcmF0aW9uIGhpc3RvcnkuCi1EZXBlbmRpbmcgb24gdGhlIG9wZXJhdGlvbiBpbiBxdWVzdGlvbiwgdGhpcyBtYXkgb3IgbWF5IG5vdCBiZSBhbGxvd2VkLiAgRm9yIGV4YW1wbGUsIHRoZSBCb3ggVmlldyBhbGxvd3MgYWxsIGFkZCBhbmQKLW1vdmUgb3BlcmF0aW9ucyB0byBiZSB1bmRvbmUgb3IgcmVkb25lIGV2ZW4gaWYgdGhleSBhcmVuJ3QgdGhlIG1vc3QgcmVjZW50bHkgcGVyZm9ybWVkIG9wZXJhdGlvbi4gIFRleHQgZWRpdG9ycwotd2lsbCBwcm9tcHQgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHVuZG8gYSB0eXBpbmcgb3BlcmF0aW9uIHRoYXQgaXMgbm90IHRoZSBtb3N0IHJlY2VudC4KLTwvcD4KLTxoND5FeGFtcGxlIFByZWZlcmVuY2VzPC9oND4KLTxwPlByZWZlcmVuY2VzIGFyZSBwcm92aWRlZCB0aGF0IGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIGJvdGggdmlld3MuICAKLUZyb20gRWNsaXBzZSdzIDxzdHJvbmc+V2luZG93PC9zdHJvbmc+IG1lbnUgc2VsZWN0IDxzdHJvbmc+UHJlZmVyZW5jZXM8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPlVuZG8gUHJlZmVyZW5jZXM8L3N0cm9uZz4uICAKLTx1bD4KLTxsaT48c3Ryb25nPlVuZG8gaGlzdG9yeSBsaW1pdDwvc3Ryb25nPiBjb250cm9scyBob3cgbWFueSB1bmRvYWJsZSBvcGVyYXRpb25zIGFyZSBrZXB0IGluIHRoZSBoaXN0b3J5IGZvciB0aGUgQm94IFZpZXcuPC9saT4KLTxsaT48c3Ryb25nPlNob3cgZGVidWcgbGFiZWxzIGluIHVuZG8gaGlzdG9yeSB2aWV3PC9zdHJvbmc+IGNvbnRyb2xzIHdoZXRoZXIgdGhlIHNpbXBsZSBsYWJlbCBzaG93biBpbiB0aGUgdW5kbyBtZW51IGlzCi11c2VkIGZvciBkaXNwbGF5aW5nIG9wZXJhdGlvbnMsIG9yIGEgZGVidWcgbGFiZWwgdGhhdCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBhc3NpZ25lZCB1bmRvIGNvbnRleHQocykuPC9saT4KLTxsaT48c3Ryb25nPkNvbmZpcm0gYWxsIHVuZG8gb3BlcmF0aW9uczwvc3Ryb25nPiBjb250cm9scyB3aGV0aGVyIHByb21wdGluZyBvY2N1cnMgYmVmb3JlIHVuZG9pbmcgb3IgcmVkb2luZyBhbiBvcGVyYXRpb24uCi1UaGlzIHByZWZlcmVuY2UgaXMgdXNlZCBieSB0aGUgb3BlcmF0aW9uIGFwcHJvdmVyIGluc3RhbGxlZCBieSB0aGUgZXhhbXBsZS48L2xpPgotPC91bD4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vaWNvbnMvc2FtcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vaWNvbnMvc2FtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmYjNjOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL2ljb25zL3NhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmYzY2ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUGx1Z2luLm5hbWUgPSBVbmRvIEV4YW1wbGUKLVBsdWdpbi5wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotVmlld3MuaGlzdG9yeVZpZXcgPSBVbmRvIEhpc3RvcnkgVmlldwotVmlld3MuYm94VmlldyA9IEJveCBWaWV3Ci1WaWV3cy5DYXRlZ29yeSA9IFVuZG8gRXhhbXBsZXMKLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kby9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmIzNTM4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSJVbmRvIFByZWZlcmVuY2VzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8ucHJlZmVyZW5jZXMuVW5kb1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8ucHJlZmVyZW5jZXMuVW5kb1ByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgICA8aW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLnByZWZlcmVuY2VzLlByZWZlcmVuY2VJbml0aWFsaXplciI+Ci0gICAgICA8L2luaXRpYWxpemVyPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlVmlld3MuQ2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kbyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiVWaWV3cy5ib3hWaWV3IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnVuZG8udmlld3MuQm94VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLnZpZXdzLkJveFZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IlVuZG8gRXhhbXBsZXMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kbyIvPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLnZpZXdzLlVuZG9IaXN0b3J5VmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMudW5kbyIKLSAgICAgICAgICAgIG5hbWU9IiVWaWV3cy5oaXN0b3J5VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy51bmRvLnZpZXdzLlVuZG9IaXN0b3J5VmlldyIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzOTA5MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwOTkxNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jTW9uIE1heSAxNiAxNjozOTo0OSBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3ZDUwOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIE1heSAxNiAxNjozOTo0OSBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0MzhkYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBNYXkgMTYgMTY6Mzk6NDkgRURUIDIwMDUKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1M2E1Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLmV4YW1wbGVzLmphciA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgZXhhbXBsZXMuamFyLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1vdXRwdXQuZXhhbXBsZXMuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvY2xlYXIuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvY2xlYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmMxMGY5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL2NsZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL2Nsb3NlX3ZpZXcuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvY2xvc2Vfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhY2EyNTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvY2xvc2Vfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9jb250YWluZXJfb2JqLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL2NvbnRhaW5lcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzJjMjhkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL2NvbnRhaW5lcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvZV9zZWFyY2hfbWVudS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9lX3NlYXJjaF9tZW51LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmNWQ4My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9lX3NlYXJjaF9tZW51LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL2ZpbGVfb2JqLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL2ZpbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4NmQwNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9maWxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9mb3JtX2Jhbm5lci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9mb3JtX2Jhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYmMwYjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvZm9ybV9iYW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvaGVscC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9oZWxwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MDMwMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9oZWxwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL2hlbHBfdG9waWMuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvaGVscF90b3BpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZGQ1MTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvaGVscF90b3BpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9sYXJnZV9pbWFnZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9sYXJnZV9pbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Yzk0ZWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvbGFyZ2VfaW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvbGlua3RvX2hlbHAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvbGlua3RvX2hlbHAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjU1MGZlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL2xpbmt0b19oZWxwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL25ld3Byal93aXouZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvbmV3cHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjN2QzYTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvbmV3cHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9udy5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9udy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOTUyYTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvbncuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvcHJvZ3Jlc3MuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvcHJvZ3Jlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmEyMDBmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL3Byb2dyZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL3NhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZiM2M5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL3NhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy90aF9ob3Jpem9udGFsLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL3RoX2hvcml6b250YWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGMxNGE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL3RoX2hvcml6b250YWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvdGhfdmVydGljYWwuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvdGhfdmVydGljYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjg1ODM5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL3RoX3ZlcnRpY2FsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL3RvY19jbG9zZWQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvdG9jX2Nsb3NlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNGFjYjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvdG9jX2Nsb3NlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy90b2Nfb3Blbi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9pY29ucy90b2Nfb3Blbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNjY1ZDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvdG9jX29wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvdG9waWNfc21hbGwuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvaWNvbnMvdG9waWNfc21hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Q4YjJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL2ljb25zL3RvcGljX3NtYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NDRhMmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXhhbXBsZXMgb2YgRWNsaXBzZSBGb3JtcwotYmFzZUVkaXRvciA9IFNpbXBsZSBGb3JtIChSQ1ApIEVkaXRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjdiNjE1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLmludGVybmFsLkV4YW1wbGVzUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJleGFtcGxlcy5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmZvcm1zIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIG5hbWU9IiViYXNlRWRpdG9yIgotICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2ZpbGVfb2JqLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3AuU2ltcGxlRm9ybUVkaXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5iYXNlLWVkaXRvciI+Ci0gICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IkVjbGlwc2UgRm9ybXMgRXhhbXBsZXMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMuYWN0aW9uU2V0Ij4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBsYWJlbD0iRm9ybSBFZGl0b3JzIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLm1lbnUiPgotICAgICAgICAgICAgPGdyb3VwTWFya2VyCi0gICAgICAgICAgICAgICAgICBuYW1lPSJncm91cCI+Ci0gICAgICAgICAgICA8L2dyb3VwTWFya2VyPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IlNpbXBsZSBGb3JtIEVkaXRvciIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3AuT3BlblNpbXBsZUZvcm1FZGl0b3JBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMubWVudS9ncm91cCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5zaW1wbGUiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iRWNsaXBzZSBGb3JtcyBFeGFtcGxlcyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IkVjbGlwc2UgRm9ybSIKLSAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMudmlld3MuRm9ybVZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMudmlld3MuRm9ybVZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLnJlc291cmNlUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHJhdGlvPSIwLjUiCi0gICAgICAgICAgICAgICByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkudmlld3MuVGFza0xpc3QiCi0gICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9InJpZ2h0IgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLnZpZXdzLkZvcm1WaWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL0V4YW1wbGVzUGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvRXhhbXBsZXNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5OGIyNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvRXhhbXBsZXNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLmludGVybmFsOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5Gb3JtQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEV4YW1wbGVzUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEV4YW1wbGVzUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCXByaXZhdGUgRm9ybUNvbG9ycyBmb3JtQ29sb3JzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19GT1JNX0JHID0gImZvcm1CZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0xBUkdFID0gImxhcmdlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfSE9SSVpPTlRBTCA9ICJob3Jpem9udGFsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfVkVSVElDQUwgPSAidmVydGljYWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TQU1QTEUgPSAic2FtcGxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOID0gIndpemJhbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0xJTktUT19IRUxQID0gImxpbmt0b19oZWxwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfSEVMUF9UT1BJQyA9ICJoZWxwX3RvcGljIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xPU0UgPSAiY2xvc2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19IRUxQX0NPTlRBSU5FUiA9ICJjb250YWluZXJfb2JqIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfSEVMUF9UT0NfT1BFTiA9ICJ0b2Nfb3BlbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0hFTFBfVE9DX0NMT1NFRCA9ICJ0b2NfY2xvc2VkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfSEVMUF9TRUFSQ0ggPSAiZV9zZWFyY2hfbWVudSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMRUFSID0gImNsZWFyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTlcgPSAibnciOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBFeGFtcGxlc1BsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUKLQkJCQkJLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMuaW50ZXJuYWwuRXhhbXBsZXNQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KEltYWdlUmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0ZPUk1fQkcsICJmb3JtX2Jhbm5lci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0xBUkdFLCAibGFyZ2VfaW1hZ2UuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19IT1JJWk9OVEFMLCAidGhfaG9yaXpvbnRhbC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX1ZFUlRJQ0FMLCAidGhfdmVydGljYWwuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19TQU1QTEUsICJzYW1wbGUuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19XSVpCQU4sICJuZXdwcmpfd2l6LmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfTElOS1RPX0hFTFAsICJsaW5rdG9faGVscC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0hFTFBfVE9QSUMsICJ0b3BpYy5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0hFTFBfQ09OVEFJTkVSLCAiY29udGFpbmVyX29iai5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0hFTFBfVE9DX0NMT1NFRCwgInRvY19jbG9zZWQuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19IRUxQX1RPQ19PUEVOLCAidG9jX29wZW4uZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19DTE9TRSwgImNsb3NlX3ZpZXcuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19IRUxQX1NFQVJDSCwgImVfc2VhcmNoX21lbnUuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19DTEVBUiwgImNsZWFyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfTlcsICJudy5naWYiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJJbWFnZShJbWFnZVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcga2V5LAotCQkJU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoImljb25zLyIgKyBmaWxlTmFtZSk7Ci0JCQlVUkwgdXJsID0gZmluZChwYXRoKTsKLQkJCWlmICh1cmwhPW51bGwpIHsKLQkJCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCQkJcmVnaXN0cnkucHV0KGtleSwgZGVzYyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRm9ybUNvbG9ycyBnZXRGb3JtQ29sb3JzKERpc3BsYXkgZGlzcGxheSkgewotCQlpZiAoZm9ybUNvbG9ycyA9PSBudWxsKSB7Ci0JCQlmb3JtQ29sb3JzID0gbmV3IEZvcm1Db2xvcnMoZGlzcGxheSk7Ci0JCQlmb3JtQ29sb3JzLm1hcmtTaGFyZWQoKTsKLQkJfQotCQlyZXR1cm4gZm9ybUNvbG9yczsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhhbXBsZXNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdAotCSAqIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gRXhhbXBsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAoZm9ybUNvbG9ycyAhPSBudWxsKSB7Ci0JCQkJZm9ybUNvbG9ycy5kaXNwb3NlKCk7Ci0JCQkJZm9ybUNvbG9ycyA9IG51bGw7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQl9Ci0JfQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JfQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGtleSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9FeGFtcGxlc1BsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL0V4YW1wbGVzUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDZjZjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL0V4YW1wbGVzUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvRm9ybUVkaXRvcklucHV0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvRm9ybUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NGRiM2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL0Zvcm1FZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLQotcHVibGljIGNsYXNzIEZvcm1FZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwdWJsaWMgRm9ybUVkaXRvcklucHV0KFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCUlTaGFyZWRJbWFnZXMuSU1HX09CSl9FTEVNRU5UKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCSAqLwotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9PcGVuRm9ybUVkaXRvckFjdGlvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL09wZW5Gb3JtRWRpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNGMxYzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL09wZW5Gb3JtRWRpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLmludGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotLyoqCi0gKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3BlbkZvcm1FZGl0b3JBY3Rpb24KLQkJaW1wbGVtZW50cwotCQkJSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotLyoKLSAqIAotICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkVkaXRvcihTdHJpbmcgaW5wdXROYW1lLCBTdHJpbmcgZWRpdG9ySWQpIHsKLQkJb3BlbkVkaXRvcihuZXcgRm9ybUVkaXRvcklucHV0KGlucHV0TmFtZSksIGVkaXRvcklkKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgb3BlbkVkaXRvcihJRWRpdG9ySW5wdXQgaW5wdXQsIFN0cmluZyBlZGl0b3JJZCkgewotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJdHJ5IHsKLQkJCXBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgZWRpdG9ySWQpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgZ2V0V2luZG93KCkgewotCQlyZXR1cm4gd2luZG93OwotCX0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMud2luZG93ID0gd2luZG93OwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvRnJlZUZvcm1QYWdlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL0ZyZWVGb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTI2ZDc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvRnJlZUZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3A7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMuaW50ZXJuYWwuRXhhbXBsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy4qOwotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLQotICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEZyZWVGb3JtUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKi8KLQlwdWJsaWMgRnJlZUZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgImZpcnN0IiwgIkZpcnN0IFBhZ2UiKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCVNjcm9sbGVkRm9ybSBmb3JtID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotCQl0b29sa2l0LmdldEh5cGVybGlua0dyb3VwKCkuc2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZShIeXBlcmxpbmtTZXR0aW5ncy5VTkRFUkxJTkVfSE9WRVIpOwotCQlmb3JtLnNldFRleHQoIkZyZWUtZm9ybSB0ZXh0IHdpdGggbGlua3MiKTsKLQkJZm9ybS5zZXRCYWNrZ3JvdW5kSW1hZ2UoRXhhbXBsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKEV4YW1wbGVzUGx1Z2luLklNR19GT1JNX0JHKSk7Ci0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWxheW91dC5sZWZ0TWFyZ2luID0gMTA7Ci0JCWxheW91dC5yaWdodE1hcmdpbiA9IDEwOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJVGFibGVXcmFwRGF0YSB0ZDsKLQkJSHlwZXJsaW5rIGxpbmsgPSB0b29sa2l0LmNyZWF0ZUh5cGVybGluayhmb3JtLmdldEJvZHkoKSwKLQkJCQkiU2FtcGxlIGh5cGVybGluayB3aXRoIGxvbmdlciB0ZXh0LiIsIFNXVC5XUkFQKTsKLQkJbGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXRkID0gbmV3IFRhYmxlV3JhcERhdGEoKTsKLQkJdGQuYWxpZ24gPSBUYWJsZVdyYXBEYXRhLkxFRlQ7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCWNyZWF0ZUV4cGFuZGFibGUoZm9ybSwgdG9vbGtpdCk7Ci0JCWNyZWF0ZUZvcm1UZXh0U2VjdGlvbihmb3JtLCB0b29sa2l0KTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUV4cGFuZGFibGUoZmluYWwgU2Nyb2xsZWRGb3JtIGZvcm0sIGZpbmFsIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJZmluYWwgRXhwYW5kYWJsZUNvbXBvc2l0ZSBleHAgPSB0b29sa2l0LmNyZWF0ZUV4cGFuZGFibGVDb21wb3NpdGUoZm9ybQotCQkJCS5nZXRCb2R5KCksIEV4cGFuZGFibGVDb21wb3NpdGUuVFJFRV9OT0RFCi0JCS8vCUV4cGFuZGFibGVDb21wb3NpdGUuTk9ORQotCQkJCSk7Ci0JCWV4cC5zZXRBY3RpdmVUb2dnbGVDb2xvcih0b29sa2l0LmdldEh5cGVybGlua0dyb3VwKCkKLQkJCQkuZ2V0QWN0aXZlRm9yZWdyb3VuZCgpKTsKLQkJZXhwLnNldFRvZ2dsZUNvbG9yKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoRm9ybUNvbG9ycy5TRVBBUkFUT1IpKTsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGV4cCk7Ci0JCWV4cC5zZXRDbGllbnQoY2xpZW50KTsKLQkJVGFibGVXcmFwTGF5b3V0IGVsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWNsaWVudC5zZXRMYXlvdXQoZWxheW91dCk7Ci0JCWVsYXlvdXQubGVmdE1hcmdpbiA9IGVsYXlvdXQucmlnaHRNYXJnaW4gPSAwOwotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY2xpZW50LCAiQnV0dG9uIiwgU1dULlBVU0gpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy9vcGVuRm9ybVdpemFyZChidXR0b24uZ2V0U2hlbGwoKSwgdG9vbGtpdC5nZXRDb2xvcnMoKSk7Ci0JCQl9Ci0JCX0pOwotCQlleHAuYWRkRXhwYW5zaW9uTGlzdGVuZXIobmV3IEV4cGFuc2lvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5nZWQoRXhwYW5zaW9uRXZlbnQgZSkgewotCQkJCWZvcm0ucmVmbG93KHRydWUpOwotCQkJfQotCQl9KTsKLQkJZXhwLnNldFRleHQoIkV4cGFuZGFibGUgU2VjdGlvbiB3aXRoIGEgbG9uZ2VyIHRpdGxlIik7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YSgpOwotCQkvL3RkLmNvbHNwYW4gPSAyOwotCQl0ZC5hbGlnbiA9IFRhYmxlV3JhcERhdGEuTEVGVDsKLQkJLy90ZC5hbGlnbiA9IFRhYmxlV3JhcERhdGEuRklMTDsKLQkJZXhwLnNldExheW91dERhdGEodGQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRm9ybVRleHRTZWN0aW9uKGZpbmFsIFNjcm9sbGVkRm9ybSBmb3JtLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9Ci0JCQl0b29sa2l0LmNyZWF0ZVNlY3Rpb24oCi0JCQkJZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5ERVNDUklQVElPTik7Ci0JCXNlY3Rpb24uc2V0QWN0aXZlVG9nZ2xlQ29sb3IoCi0JCQl0b29sa2l0LmdldEh5cGVybGlua0dyb3VwKCkuZ2V0QWN0aXZlRm9yZWdyb3VuZCgpKTsKLQkJc2VjdGlvbi5zZXRUb2dnbGVDb2xvcigKLQkJCXRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoRm9ybUNvbG9ycy5TRVBBUkFUT1IpKTsKLQkJdG9vbGtpdC5jcmVhdGVDb21wb3NpdGVTZXBhcmF0b3Ioc2VjdGlvbik7Ci0JCUZvcm1UZXh0IHJ0ZXh0ID0gdG9vbGtpdC5jcmVhdGVGb3JtVGV4dChzZWN0aW9uLCBmYWxzZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KHJ0ZXh0KTsKLQkJbG9hZEZvcm1UZXh0KHJ0ZXh0LCB0b29sa2l0KTsKLQotCQlzZWN0aW9uLmFkZEV4cGFuc2lvbkxpc3RlbmVyKG5ldyBFeHBhbnNpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZXhwYW5zaW9uU3RhdGVDaGFuZ2VkKEV4cGFuc2lvbkV2ZW50IGUpIHsKLQkJCQlmb3JtLnJlZmxvdyhmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNlY3Rpb24uc2V0VGV4dCgiU2VjdGlvbiB0aXRsZSIpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKAotCQkiVGhpcyBpcyBhIHNlY3Rpb24gZGVzY3JpcHRpb24gdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgYmVsb3cgdGhlIHNlcGFyYXRvci4iKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKCk7Ci0JCXRkLmFsaWduID0gVGFibGVXcmFwRGF0YS5GSUxMOwotCQl0ZC5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRGb3JtVGV4dChmaW5hbCBGb3JtVGV4dCBydGV4dCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlydGV4dC5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHJ0ZXh0LmdldFNoZWxsKCksICJFY2xpcHNlIEZvcm1zIiwgCi0JCQkJIkxpbmsgYWN0aXZhdGVkOiBocmVmPSIgKyBlLmdldEhyZWYoKSk7Ci0JCQl9Ci0JCX0pOwotCQlydGV4dC5zZXRIeXBlcmxpbmtTZXR0aW5ncyh0b29sa2l0LmdldEh5cGVybGlua0dyb3VwKCkpOwotCQlydGV4dC5zZXRJbWFnZSgiaW1hZ2UxIiwgRXhhbXBsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKEV4YW1wbGVzUGx1Z2luLklNR19MQVJHRSkpOwotCQljcmVhdGVDb21wb3NpdGVDb250cm9sKHJ0ZXh0LCB0b29sa2l0KTsKLQkJY3JlYXRlQ29udHJvbChydGV4dCwgdG9vbGtpdCk7Ci0JCU1lbnUgbWVudSA9IG5ldyBNZW51KHJ0ZXh0KTsKLQkJZmluYWwgTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiJkNvcHkiKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlydGV4dC5jb3B5KCk7Ci0JCQl9Ci0JCX0pOwotCQkvL3J0ZXh0LnNldE1lbnUobWVudSk7Ci0JCWl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJ0ZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWl0ZW0uc2V0RW5hYmxlZChydGV4dC5jYW5Db3B5KCkpOwotCQkJfQotCQl9KTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBGcmVlRm9ybVBhZ2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiaW5kZXgueG1sIik7Ci0JCWlmIChpcyE9bnVsbCkgewotCQkJcnRleHQuc2V0Q29udGVudHMoaXMsIHRydWUpOwotCQkJdHJ5IHsKLQkJCQlpcy5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udHJvbChGb3JtVGV4dCBmdGV4dCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlUcmVlTm9kZSBub2RlID0gbmV3IFRyZWVOb2RlKGZ0ZXh0LCBTV1QuTlVMTCk7Ci0JCXRvb2xraXQuYWRhcHQobm9kZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZ0ZXh0LnNldENvbnRyb2woIm5vZGUiLCBub2RlKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBvc2l0ZUNvbnRyb2woRm9ybVRleHQgZnRleHQsIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJQ29tcG9zaXRlIGNvbXAgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmdGV4dCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQl0b29sa2l0LmNyZWF0ZUxhYmVsKGNvbXAsICJTYW1wbGUgdGV4dDoiKTsKLQkJVGV4dCB0ZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNvbXAsICIiKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcCwgIkJyb3dzZS4uLiIsIFNXVC5QVVNIKTsKLQkJZnRleHQuc2V0Q29udHJvbCgiY29udHJvbDEiLCBjb21wKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL3JjcC9JTW9kZWxMaXN0ZW5lci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL3JjcC9JTW9kZWxMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjBlM2UyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvSU1vZGVsTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMuaW50ZXJuYWwucmNwOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsTGlzdGVuZXIgewotCVN0cmluZyBBRERFRD0iX19hZGRlZCI7Ci0JU3RyaW5nIFJFTU9WRUQ9Il9fcmVtb3ZlZCI7Ci0JU3RyaW5nIENIQU5HRUQgPSAiX19jaGFuZ2VkIjsKLQl2b2lkIG1vZGVsQ2hhbmdlZChPYmplY3RbXSBvYmplY3RzLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHByb3BlcnR5KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL05hbWVkT2JqZWN0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL05hbWVkT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTJkMGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL3JjcC9OYW1lZE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3A7Ci0KLS8qKgotICoKLSAqLwotcHVibGljCWNsYXNzIE5hbWVkT2JqZWN0IHsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBTaW1wbGVNb2RlbCBtb2RlbDsKLQkKLQlwdWJsaWMgTmFtZWRPYmplY3QoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0TW9kZWwoU2ltcGxlTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCW1vZGVsLmZpcmVNb2RlbENoYW5nZWQobmV3IE9iamVjdCBbXSB7dGhpc30sIElNb2RlbExpc3RlbmVyLkNIQU5HRUQsICIiKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL3JjcC9OZXdTdHlsZVBhZ2UuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvTmV3U3R5bGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMTcxODYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL3JjcC9OZXdTdHlsZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLmludGVybmFsLnJjcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5Gb3JtQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkh5cGVybGlua1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMuaW50ZXJuYWwuRXhhbXBsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLQotICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE5ld1N0eWxlUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKi8KLQlwdWJsaWMgTmV3U3R5bGVQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgIm5ld1N0eWxlIiwgIk5ldyBTdHlsZSIpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJZmluYWwgU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0JCXRvb2xraXQuZ2V0SHlwZXJsaW5rR3JvdXAoKS5zZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKEh5cGVybGlua1NldHRpbmdzLlVOREVSTElORV9IT1ZFUik7Ci0JCWZvcm0uc2V0VGV4dCgiTmV3IFN0eWxlIEZvcm0iKTsKLQkJRm9ybUNvbG9ycyBjb2xvcnMgPSB0b29sa2l0LmdldENvbG9ycygpOwotCQljb2xvcnMuaW5pdGlhbGl6ZVNlY3Rpb25Ub29sQmFyQ29sb3JzKCk7Ci0JCUNvbG9yIGdiZyA9IGNvbG9ycy5nZXRDb2xvcihGb3JtQ29sb3JzLlRCX0dCRyk7Ci0JCUNvbG9yIGJnID0gY29sb3JzLmdldEJhY2tncm91bmQoKTsKLQkJZm9ybS5nZXRGb3JtKCkuc2V0VGV4dEJhY2tncm91bmQobmV3IENvbG9yW117YmcsIGdiZ30sIG5ldyBpbnQgW10gezEwMH0sIHRydWUpOwotCQlmb3JtLmdldEZvcm0oKS5zZXRTZXBhcmF0b3JDb2xvcihjb2xvcnMuZ2V0Q29sb3IoRm9ybUNvbG9ycy5UQl9CT1JERVIpKTsKLQkJZm9ybS5nZXRGb3JtKCkuc2V0U2VwYXJhdG9yVmlzaWJsZSh0cnVlKTsKLQkJVG9vbEJhck1hbmFnZXIgdGJtID0gKFRvb2xCYXJNYW5hZ2VyKWZvcm0uZ2V0Rm9ybSgpLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCXRibS5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZChjb2xvcnMuZ2V0Q29sb3IoRm9ybUNvbG9ycy5UQl9HQkcpKTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFfEV4cGFuZGFibGVDb21wb3NpdGUuRVhQQU5ERUQpOwotCQlDb21wb3NpdGUgY2xpZW50ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNsaWVudCk7Ci0JCXNlY3Rpb24uc2V0VGV4dCgiRGV0YWlscyIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJQnV0dG9uIGVycm9yID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY2xpZW50LCAiRXJyb3IiLCBTV1QuUFVTSCk7Ci0JCWVycm9yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZvcm0uZ2V0Rm9ybSgpLnNldE1lc3NhZ2UoIlRlc3QgZm9yIGFuIGVycm9yIG1lc3NhZ2UiLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsJCQkJCi0JCQkJCi0JCQl9Ci0JCX0pOwotCQlCdXR0b24gd2FybmluZyA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNsaWVudCwgIldhcm5pbmciLCBTV1QuUFVTSCk7Ci0JCXdhcm5pbmcuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZm9ybS5nZXRGb3JtKCkuc2V0TWVzc2FnZSgiVGVzdCBmb3IgYSB3YXJuaW5nIG1lc3NhZ2UiLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQkJfQotCQl9KTsJCQotCQlCdXR0b24gaW5mbyA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNsaWVudCwgIkluZm8iLCBTV1QuUFVTSCk7Ci0JCWluZm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZm9ybS5nZXRGb3JtKCkuc2V0TWVzc2FnZSgiVGVzdCBmb3IgYW4gaW5mbyBtZXNzYWdlIiwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQl9Ci0JCX0pOwkJCi0JCUJ1dHRvbiBjYW5jZWwgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjbGllbnQsICJDYW5jZWwiLCBTV1QuUFVTSCk7Ci0JCWNhbmNlbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmb3JtLmdldEZvcm0oKS5zZXRNZXNzYWdlKG51bGwpOwotCQkJfQotCQl9KTsJCQotCQkKLQkJZmluYWwgQnV0dG9uIGJ1c3kgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjbGllbnQsICJTdGFydCBQcm9ncmVzcyIsIFNXVC5QVVNIKTsKLQkJYnVzeS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZm9ybS5nZXRGb3JtKCkuaXNCdXN5KCkpIHsKLQkJCQkJZm9ybS5nZXRGb3JtKCkuc2V0QnVzeShmYWxzZSk7Ci0JCQkJCWJ1c3kuc2V0VGV4dCgiU3RhcnQgUHJvZ3Jlc3MiKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvcm0uZ2V0Rm9ybSgpLnNldEJ1c3kodHJ1ZSk7Ci0JCQkJCWJ1c3kuc2V0VGV4dCgiU3RvcCBQcm9ncmVzcyIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJYnVzeS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCUNvbXBvc2l0ZSByaWdodCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm0uZ2V0Qm9keSgpKTsKLQkJcmlnaHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXJpZ2h0LnNldExheW91dChsYXlvdXQpOwotCi0JCXNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocmlnaHQsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRXxFeHBhbmRhYmxlQ29tcG9zaXRlLkVYUEFOREVEKTsKLQkJVGV4dCBkZXNjID0gdG9vbGtpdC5jcmVhdGVUZXh0KHNlY3Rpb24sICJTYW1wbGUgZGVzY3JpcHRpb24iLCBTV1QuTVVMVEkpOwotCQlzZWN0aW9uLnNldENsaWVudChkZXNjKTsKLQkJc2VjdGlvbi5zZXRUZXh0KCJEZXNjcmlwdGlvbiIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihyaWdodCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFfEV4cGFuZGFibGVDb21wb3NpdGUuU0hPUlRfVElUTEVfQkFSfEV4cGFuZGFibGVDb21wb3NpdGUuRVhQQU5ERUQpOwotCQlkZXNjID0gdG9vbGtpdC5jcmVhdGVUZXh0KHNlY3Rpb24sICJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4iLCBTV1QuTVVMVEkpOwotCQlzZWN0aW9uLnNldENsaWVudChkZXNjKTsKLQkJc2VjdGlvbi5zZXRUZXh0KCJEaXNjdXNzaW9uIik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlBY3Rpb24gaGFjdGlvbiA9IG5ldyBBY3Rpb24oImhvciIsIEFjdGlvbi5BU19SQURJT19CVVRUT04pIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCX0KLQkJfTsKLQkJaGFjdGlvbi5zZXRDaGVja2VkKHRydWUpOwotCQloYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJIb3Jpem9udGFsIG9yaWVudGF0aW9uIik7Ci0JCWhhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEV4YW1wbGVzUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRJbWFnZVJlZ2lzdHJ5KCkKLQkJCQkuZ2V0RGVzY3JpcHRvcihFeGFtcGxlc1BsdWdpbi5JTUdfSE9SSVpPTlRBTCkpOwotCQlBY3Rpb24gdmFjdGlvbiA9IG5ldyBBY3Rpb24oInZlciIsIEFjdGlvbi5BU19SQURJT19CVVRUT04pIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCX0KLQkJfTsKLQkJdmFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKLQkJdmFjdGlvbi5zZXRUb29sVGlwVGV4dCgiVmVydGljYWwgb3JpZW50YXRpb24iKTsKLQkJdmFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRXhhbXBsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKEV4YW1wbGVzUGx1Z2luLklNR19WRVJUSUNBTCkpOwotCQlmb3JtLmdldFRvb2xCYXJNYW5hZ2VyKCkuYWRkKGhhY3Rpb24pOwotCQlmb3JtLmdldFRvb2xCYXJNYW5hZ2VyKCkuYWRkKHZhY3Rpb24pOwotCQlmb3JtLmdldFRvb2xCYXJNYW5hZ2VyKCkudXBkYXRlKHRydWUpOwotCQlmb3JtLnNldEltYWdlKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfREVGX1ZJRVcpKTsKLQkJQ29tcG9zaXRlIGhlYWRDbGllbnQgPSBuZXcgQ29tcG9zaXRlKGZvcm0uZ2V0Rm9ybSgpLmdldEhlYWQoKSwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGdsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlnbGF5b3V0Lm1hcmdpbldpZHRoID0gZ2xheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlnbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQloZWFkQ2xpZW50LnNldExheW91dChnbGF5b3V0KTsKLQkJVGV4dCB0ID0gbmV3IFRleHQoaGVhZENsaWVudCwgU1dULkJPUkRFUik7Ci0JCXQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW5ldyBDb21ibyhoZWFkQ2xpZW50LCBTV1QuTlVMTCk7Ci0JCW5ldyBDb21ibyhoZWFkQ2xpZW50LCBTV1QuTlVMTCk7Ci0JCWZvcm0uZ2V0Rm9ybSgpLnNldEhlYWRDbGllbnQoaGVhZENsaWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvT3BlblNpbXBsZUZvcm1FZGl0b3JBY3Rpb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvT3BlblNpbXBsZUZvcm1FZGl0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhOTA2ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL09wZW5TaW1wbGVGb3JtRWRpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLmludGVybmFsLnJjcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5PcGVuRm9ybUVkaXRvckFjdGlvbjsKLS8qKgotICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUKLSAqLwotcHVibGljIGNsYXNzIE9wZW5TaW1wbGVGb3JtRWRpdG9yQWN0aW9uIGV4dGVuZHMgT3BlbkZvcm1FZGl0b3JBY3Rpb24gewotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlvcGVuRWRpdG9yKG5ldyBTaW1wbGVGb3JtRWRpdG9ySW5wdXQoIlNpbXBsZSBFZGl0b3IiKSwgIm9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLmJhc2UtZWRpdG9yIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL3JjcC9QYWdlV2l0aFN1YlBhZ2VzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1BhZ2VXaXRoU3ViUGFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwZTU4Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1BhZ2VXaXRoU3ViUGFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLmludGVybmFsLnJjcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMuaW50ZXJuYWwuRXhhbXBsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy4qOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUGFnZVdpdGhTdWJQYWdlcyBleHRlbmRzIEZvcm1QYWdlIHsKLQlwcml2YXRlIENUYWJGb2xkZXIgdGFiRm9sZGVyOwotCXByaXZhdGUgVGV4dCB0ZXh0OwotCQotCWNsYXNzIFRleHRTZWN0aW9uIHsKLQkJU3RyaW5nIHRleHQ7Ci0JCXB1YmxpYyBUZXh0U2VjdGlvbihTdHJpbmcgdGV4dCkge3RoaXMudGV4dCA9IHRleHQ7fQotCX0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKi8KLQlwdWJsaWMgUGFnZVdpdGhTdWJQYWdlcyhGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsICJjb21wb3NpdGUiLCAiQ29tcG9zaXRlIFBhZ2UiKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCVNjcm9sbGVkRm9ybSBmb3JtID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotCQlmb3JtLnNldFRleHQoIkZvcm0gd2l0aCBzdWJwYWdlcyIpOwotCQlmb3JtLnNldEJhY2tncm91bmRJbWFnZShFeGFtcGxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoCi0JCQkJRXhhbXBsZXNQbHVnaW4uSU1HX0ZPUk1fQkcpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRhYkZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKGZvcm0uZ2V0Qm9keSgpLCBTV1QuRkxBVHxTV1QuVE9QKTsKLQkJdG9vbGtpdC5hZGFwdCh0YWJGb2xkZXIsIHRydWUsIHRydWUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5oZWlnaHRIaW50ID0gMDsKLQkJdGFiRm9sZGVyLnNldExheW91dERhdGEoZ2QpOwotCQlDb2xvciBzZWxlY3RlZENvbG9yID0gdG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRDb2xvcihGb3JtQ29sb3JzLlNFUEFSQVRPUik7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKG5ldyBDb2xvcltdIHtzZWxlY3RlZENvbG9yLCB0b29sa2l0LmdldENvbG9ycygpLmdldEJhY2tncm91bmQoKX0sIG5ldyBpbnRbXSB7NTB9KTsKLQkJLy90YWJGb2xkZXIuc2V0Q3Vyc29yKEZvcm1zUmVzb3VyY2VzLmdldEhhbmRDdXJzb3IoKSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodGFiRm9sZGVyKTsKLQkJY3JlYXRlVGFicyh0b29sa2l0KTsKLQkJY3JlYXRlVGV4dCh0b29sa2l0LCBmb3JtLmdldEJvZHkoKSk7Ci0JCXRhYkZvbGRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JCXVwZGF0ZVNlbGVjdGlvbigpOwkJCi0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJzKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJY3JlYXRlVGFiKHRvb2xraXQsICJDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IDIwMDQgSUJNIGFuZCBvdGhlcnMuIik7Ci0JCWNyZWF0ZVRhYih0b29sa2l0LCAiTGljZW5zZSBBZ3JlZW1lbnQiLCAiTElDRU5TRSBBR1JFRU1FTlRcblxuVXNlIHRoaXMgZmVhdHVyZSBhbnkgd2F5IHlvdSB3YW50LiIpOwotCQljcmVhdGVUYWIodG9vbGtpdCwgIkRlc2NyaXB0aW9uIiwgIkEgc2ltcGxlIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlIik7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHRhYkNvbnRlbnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCQl0YWJDb250ZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXRhYkNvbnRlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJR3JpZERhdGEgZ2Q7Ci0JCXRleHQgPSB0b29sa2l0LmNyZWF0ZVRleHQodGFiQ29udGVudCwgIiIsIFNXVC5NVUxUSXxTV1QuV1JBUCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUJ1dHRvbiBhcHBseSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHRhYkNvbnRlbnQsICJBcHBseSIsIFNXVC5QVVNIKTsKLQkJYXBwbHkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMfEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQlCdXR0b24gcmVzZXQgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbih0YWJDb250ZW50LCAiUmVzZXQiLCBTV1QuUFVTSCk7Ci0JCXJlc2V0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTHxHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlbGVjdGlvbigpIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKTsKLQkJVGV4dFNlY3Rpb24gc2VjdGlvbiA9IChUZXh0U2VjdGlvbilpdGVtLmdldERhdGEoKTsKLQkJdGV4dC5zZXRUZXh0KHNlY3Rpb24udGV4dCk7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWIoRm9ybVRvb2xraXQgdG9vbGtpdCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgY29udGVudCkgewotCQlDVGFiSXRlbSBpdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwpOwotCQlUZXh0U2VjdGlvbiBzZWN0aW9uID0gbmV3IFRleHRTZWN0aW9uKGNvbnRlbnQpOwotCQlpdGVtLnNldFRleHQodGl0bGUpOwotCQlpdGVtLnNldERhdGEoc2VjdGlvbik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvU2Nyb2xsZWRQcm9wZXJ0aWVzQmxvY2suamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvU2Nyb2xsZWRQcm9wZXJ0aWVzQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzMTY1Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1Njcm9sbGVkUHJvcGVydGllc0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5FeGFtcGxlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLio7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTY3JvbGxlZFByb3BlcnRpZXNCbG9jayBleHRlbmRzIE1hc3RlckRldGFpbHNCbG9jayB7Ci0JcHJpdmF0ZSBGb3JtUGFnZSBwYWdlOwotCXB1YmxpYyBTY3JvbGxlZFByb3BlcnRpZXNCbG9jayhGb3JtUGFnZSBwYWdlKSB7Ci0JCXRoaXMucGFnZSA9IHBhZ2U7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSB0aXRsZQotCSAqLwotCWNsYXNzIE1hc3RlckNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBTaW1wbGVGb3JtRWRpdG9ySW5wdXQpIHsKLQkJCQlTaW1wbGVGb3JtRWRpdG9ySW5wdXQgaW5wdXQgPSAoU2ltcGxlRm9ybUVkaXRvcklucHV0KSBwYWdlCi0JCQkJCQkuZ2V0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlyZXR1cm4gaW5wdXQuZ2V0TW9kZWwoKS5nZXRDb250ZW50cygpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJfQotCX0KLQljbGFzcyBNYXN0ZXJMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotCQkJaW1wbGVtZW50cwotCQkJCUlUYWJsZUxhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gb2JqLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBpbmRleCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFR5cGVPbmUpIHsKLQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZSgKLQkJCQkJCUlTaGFyZWRJbWFnZXMuSU1HX09CSl9FTEVNRU5UKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUeXBlVHdvKSB7Ci0JCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoCi0JCQkJCQlJU2hhcmVkSW1hZ2VzLklNR19PQkpfRklMRSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNYXN0ZXJQYXJ0KGZpbmFsIElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy9maW5hbCBTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTik7Ci0JCXNlY3Rpb24uc2V0VGV4dCgiTW9kZWwgT2JqZWN0cyIpOwotCQlzZWN0aW9uCi0JCQkJLnNldERlc2NyaXB0aW9uKCJUaGUgbGlzdCBjb250YWlucyBvYmplY3RzIGZyb20gdGhlIG1vZGVsIHdob3NlIGRldGFpbHMgYXJlIGVkaXRhYmxlIG9uIHRoZSByaWdodCIpOwotCQlzZWN0aW9uLm1hcmdpbldpZHRoID0gMTA7Ci0JCXNlY3Rpb24ubWFyZ2luSGVpZ2h0ID0gNTsKLQkJdG9vbGtpdC5jcmVhdGVDb21wb3NpdGVTZXBhcmF0b3Ioc2VjdGlvbik7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uLCBTV1QuV1JBUCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMjsKLQkJY2xpZW50LnNldExheW91dChsYXlvdXQpOwotCQlUYWJsZSB0ID0gdG9vbGtpdC5jcmVhdGVUYWJsZShjbGllbnQsIFNXVC5OVUxMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwOwotCQlnZC53aWR0aEhpbnQgPSAxMDA7Ci0JCXQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNsaWVudCk7Ci0JCUJ1dHRvbiBiID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY2xpZW50LCAiQWRkLi4uIiwgU1dULlBVU0gpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQliLnNldExheW91dERhdGEoZ2QpOwotCQlzZWN0aW9uLnNldENsaWVudChjbGllbnQpOwotCQlmaW5hbCBTZWN0aW9uUGFydCBzcGFydCA9IG5ldyBTZWN0aW9uUGFydChzZWN0aW9uKTsKLQkJbWFuYWdlZEZvcm0uYWRkUGFydChzcGFydCk7Ci0JCVRhYmxlVmlld2VyIHZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0KTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJbWFuYWdlZEZvcm0uZmlyZVNlbGVjdGlvbkNoYW5nZWQoc3BhcnQsIGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IE1hc3RlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IE1hc3RlckxhYmVsUHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRJbnB1dChwYWdlLmdldEVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUb29sQmFyQWN0aW9ucyhJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJZmluYWwgU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCUFjdGlvbiBoYWN0aW9uID0gbmV3IEFjdGlvbigiaG9yIiwgQWN0aW9uLkFTX1JBRElPX0JVVFRPTikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNhc2hGb3JtLnNldE9yaWVudGF0aW9uKFNXVC5IT1JJWk9OVEFMKTsKLQkJCQlmb3JtLnJlZmxvdyh0cnVlKTsKLQkJCX0KLQkJfTsKLQkJaGFjdGlvbi5zZXRDaGVja2VkKHRydWUpOwotCQloYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJIb3Jpem9udGFsIG9yaWVudGF0aW9uIik7Ci0JCWhhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEV4YW1wbGVzUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRJbWFnZVJlZ2lzdHJ5KCkKLQkJCQkuZ2V0RGVzY3JpcHRvcihFeGFtcGxlc1BsdWdpbi5JTUdfSE9SSVpPTlRBTCkpOwotCQlBY3Rpb24gdmFjdGlvbiA9IG5ldyBBY3Rpb24oInZlciIsIEFjdGlvbi5BU19SQURJT19CVVRUT04pIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzYXNoRm9ybS5zZXRPcmllbnRhdGlvbihTV1QuVkVSVElDQUwpOwotCQkJCWZvcm0ucmVmbG93KHRydWUpOwotCQkJfQotCQl9OwotCQl2YWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCQl2YWN0aW9uLnNldFRvb2xUaXBUZXh0KCJWZXJ0aWNhbCBvcmllbnRhdGlvbiIpOwotCQl2YWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihFeGFtcGxlc1BsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3IoRXhhbXBsZXNQbHVnaW4uSU1HX1ZFUlRJQ0FMKSk7Ci0JCWZvcm0uZ2V0VG9vbEJhck1hbmFnZXIoKS5hZGQoaGFjdGlvbik7Ci0JCWZvcm0uZ2V0VG9vbEJhck1hbmFnZXIoKS5hZGQodmFjdGlvbik7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyUGFnZXMoRGV0YWlsc1BhcnQgZGV0YWlsc1BhcnQpIHsKLQkJZGV0YWlsc1BhcnQucmVnaXN0ZXJQYWdlKFR5cGVPbmUuY2xhc3MsIG5ldyBUeXBlT25lRGV0YWlsc1BhZ2UoKSk7Ci0JCWRldGFpbHNQYXJ0LnJlZ2lzdGVyUGFnZShUeXBlVHdvLmNsYXNzLCBuZXcgVHlwZVR3b0RldGFpbHNQYWdlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1Njcm9sbGVkUHJvcGVydGllc1BhZ2UuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvU2Nyb2xsZWRQcm9wZXJ0aWVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGU5YTNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvU2Nyb2xsZWRQcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLmludGVybmFsLkV4YW1wbGVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuKjsKLS8qKgotICogQGF1dGhvciBkZWphbgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTY3JvbGxlZFByb3BlcnRpZXNQYWdlIGV4dGVuZHMgRm9ybVBhZ2UgewotCXByaXZhdGUgU2Nyb2xsZWRQcm9wZXJ0aWVzQmxvY2sgYmxvY2s7Ci0JcHVibGljIFNjcm9sbGVkUHJvcGVydGllc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCAiZm91cnRoIiwgIk1hc3RlciBEZXRhaWxzIik7Ci0JCWJsb2NrID0gbmV3IFNjcm9sbGVkUHJvcGVydGllc0Jsb2NrKHRoaXMpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChmaW5hbCBJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJZmluYWwgU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCS8vRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRUZXh0KCJGb3JtIHdpdGggc2Nyb2xsZWQgc2VjdGlvbnMiKTsKLQkJZm9ybS5zZXRCYWNrZ3JvdW5kSW1hZ2UoRXhhbXBsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKAotCQkJCUV4YW1wbGVzUGx1Z2luLklNR19GT1JNX0JHKSk7Ci0JCWJsb2NrLmNyZWF0ZUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1NlY29uZFBhZ2UuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvU2Vjb25kUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWQzOWIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvU2Vjb25kUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLmludGVybmFsLkV4YW1wbGVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuKjsKLS8qKgotICogQGF1dGhvciBkZWphbgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWNvbmRQYWdlIGV4dGVuZHMgRm9ybVBhZ2UgewotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSB0aXRsZQotCSAqLwotCXB1YmxpYyBTZWNvbmRQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgInNlY29uZCIsICJTZWN0aW9uIFBhZ2UiKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCVNjcm9sbGVkRm9ybSBmb3JtID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotCQlmb3JtLnNldFRleHQoIlRpdGxlIGZvciB0aGUgc2Vjb25kIHBhZ2UiKTsKLQkJZm9ybS5zZXRCYWNrZ3JvdW5kSW1hZ2UoRXhhbXBsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKEV4YW1wbGVzUGx1Z2luLklNR19GT1JNX0JHKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY3JlYXRlVGFibGVTZWN0aW9uKGZvcm0sIHRvb2xraXQsICJGaXJzdCBUYWJsZSBTZWN0aW9uIik7Ci0JCWNyZWF0ZVRhYmxlU2VjdGlvbihmb3JtLCB0b29sa2l0LCAiU2Vjb25kIFRhYmxlIFNlY3Rpb24iKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVTZWN0aW9uKGZpbmFsIFNjcm9sbGVkRm9ybSBmb3JtLCBGb3JtVG9vbGtpdCB0b29sa2l0LCBTdHJpbmcgdGl0bGUpIHsKLQkJU2VjdGlvbiBzZWN0aW9uID0KLQkJCXRvb2xraXQuY3JlYXRlU2VjdGlvbigKLQkJCQlmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLlRXSVNUSUV8U2VjdGlvbi5USVRMRV9CQVIpOwotCQlzZWN0aW9uLnNldEFjdGl2ZVRvZ2dsZUNvbG9yKAotCQkJdG9vbGtpdC5nZXRIeXBlcmxpbmtHcm91cCgpLmdldEFjdGl2ZUZvcmVncm91bmQoKSk7Ci0JCXNlY3Rpb24uc2V0VG9nZ2xlQ29sb3IoCi0JCQl0b29sa2l0LmdldENvbG9ycygpLmdldENvbG9yKEZvcm1Db2xvcnMuU0VQQVJBVE9SKSk7Ci0JCUZvcm1UZXh0IGRlc2NyaXB0aW9uID0gdG9vbGtpdC5jcmVhdGVGb3JtVGV4dChzZWN0aW9uLCBmYWxzZSk7Ci0JCWRlc2NyaXB0aW9uLnNldFRleHQoIjxmb3JtPjxwPlRoaXMgZGVzY3JpcHRpb24gaGFzIDxiPmJvbGQ8L2I+IHRleHQuPC9wPjwvZm9ybT4iLCB0cnVlLCBmYWxzZSk7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb25Db250cm9sKGRlc2NyaXB0aW9uKTsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24sIFNXVC5XUkFQKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0KLQkJY2xpZW50LnNldExheW91dChsYXlvdXQpOwotCQlUYWJsZSB0ID0gdG9vbGtpdC5jcmVhdGVUYWJsZShjbGllbnQsIFNXVC5OVUxMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJZ2Qud2lkdGhIaW50ID0gMTAwOwotCQl0LnNldExheW91dERhdGEoZ2QpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihjbGllbnQpOwotCQlCdXR0b24gYiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNsaWVudCwgIkFkZC4uLiIsIFNXVC5QVVNIKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJYi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VjdGlvbi5zZXRUZXh0KHRpdGxlKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbigiPGZvcm0+PHA+VGhpcyBzZWN0aW9uIGhhcyBhIDxiPnRyZWU8L2I+IGFuZCBhIGJ1dHRvbi4gSXQgYWxzbyBoYXMgPGE+YSBsaW5rPC9hPiBpbiB0aGUgZGVzY3JpcHRpb24uPC9wPjwvZm9ybT4iKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY2xpZW50KTsKLQkJc2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJc2VjdGlvbi5hZGRFeHBhbnNpb25MaXN0ZW5lcihuZXcgRXhwYW5zaW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdlZChFeHBhbnNpb25FdmVudCBlKSB7Ci0JCQkJZm9ybS5yZWZsb3coZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1NpbXBsZUZvcm1FZGl0b3IuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvU2ltcGxlRm9ybUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FiZjI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvU2ltcGxlRm9ybUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5FeGFtcGxlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotLyoqCi0gKiBBIHNpbXBsZSBtdWx0aS1wYWdlIGZvcm0gZWRpdG9yIHRoYXQgdXNlcyBFY2xpcHNlIEZvcm1zIHN1cHBvcnQuCi0gKiBFeGFtcGxlIHBsdWctaW4gaXMgY29uZmlndXJlZCB0byBjcmVhdGUgb25lIGluc3RhbmNlIG9mCi0gKiBmb3JtIGNvbG9ycyB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIGVkaXRvciBpbnN0YW5jZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVGb3JtRWRpdG9yIGV4dGVuZHMgRm9ybUVkaXRvciB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBTaW1wbGVGb3JtRWRpdG9yKCkgewotCX0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNjcmVhdGVUb29sa2l0KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkpCi0JICovCi0JcHJvdGVjdGVkIEZvcm1Ub29sa2l0IGNyZWF0ZVRvb2xraXQoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCS8vIENyZWF0ZSBhIHRvb2xraXQgdGhhdCBzaGFyZXMgY29sb3JzIGJldHdlZW4gZWRpdG9ycy4KLQkJcmV0dXJuIG5ldyBGb3JtVG9vbGtpdChFeGFtcGxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Rm9ybUNvbG9ycygKLQkJCQlkaXNwbGF5KSk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjYWRkUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhZ2VzKCkgewotCQl0cnkgewotCQlhZGRQYWdlKG5ldyBOZXdTdHlsZVBhZ2UodGhpcykpOwotCQlhZGRQYWdlKG5ldyBGcmVlRm9ybVBhZ2UodGhpcykpOwotCQlhZGRQYWdlKG5ldyBTZWNvbmRQYWdlKHRoaXMpKTsKLQkJaW50IGluZGV4ID0gYWRkUGFnZShuZXcgQ29tcG9zaXRlKGdldENvbnRhaW5lcigpLCBTV1QuTlVMTCkpOwotCQlzZXRQYWdlVGV4dChpbmRleCwgIkNvbXBvc2l0ZSIpOwotCQlhZGRQYWdlKG5ldyBUaGlyZFBhZ2UodGhpcykpOwotCQlhZGRQYWdlKG5ldyBTY3JvbGxlZFByb3BlcnRpZXNQYWdlKHRoaXMpKTsKLQkJYWRkUGFnZShuZXcgUGFnZVdpdGhTdWJQYWdlcyh0aGlzKSk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCS8vCi0JCX0KLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1NpbXBsZUZvcm1FZGl0b3JJbnB1dC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL3JjcC9TaW1wbGVGb3JtRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYwYzkzNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1NpbXBsZUZvcm1FZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMuaW50ZXJuYWwuRm9ybUVkaXRvcklucHV0OwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlRm9ybUVkaXRvcklucHV0IGV4dGVuZHMgRm9ybUVkaXRvcklucHV0IHsKLQlwcml2YXRlIFNpbXBsZU1vZGVsIG1vZGVsOwotCQotCXB1YmxpYyBTaW1wbGVGb3JtRWRpdG9ySW5wdXQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCW1vZGVsID0gbmV3IFNpbXBsZU1vZGVsKCk7Ci0JfQotCQotCXB1YmxpYyBTaW1wbGVNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1NpbXBsZU1vZGVsLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1NpbXBsZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDY0MWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL3JjcC9TaW1wbGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3A7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLS8qKgotICogQGF1dGhvciBkZWphbgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVNb2RlbCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgbW9kZWxMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBBcnJheUxpc3Qgb2JqZWN0czsKLQlwdWJsaWMgU2ltcGxlTW9kZWwoKSB7Ci0JCW1vZGVsTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZE1vZGVsTGlzdGVuZXIoSU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCFtb2RlbExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQltb2RlbExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVNb2RlbExpc3RlbmVyKElNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCW1vZGVsTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCXB1YmxpYyB2b2lkIGZpcmVNb2RlbENoYW5nZWQoT2JqZWN0W10gb2JqZWN0cywgU3RyaW5nIHR5cGUsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGVsTGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkoKElNb2RlbExpc3RlbmVyKSBtb2RlbExpc3RlbmVycy5nZXQoaSkpLm1vZGVsQ2hhbmdlZChvYmplY3RzLAotCQkJCQl0eXBlLCBwcm9wZXJ0eSk7Ci0JCX0KLQl9Ci0JcHVibGljIE9iamVjdFtdIGdldENvbnRlbnRzKCkgewotCQlyZXR1cm4gb2JqZWN0cy50b0FycmF5KCk7Ci0JfQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlvYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlOYW1lZE9iamVjdFtdIG9iamVjdHMgPSB7Ci0JCQkJbmV3IFR5cGVPbmUoIlR5cGVPbmUgaW5zdGFuY2UgMSIsIDIsIHRydWUsICJTb21lIHRleHQiKSwKLQkJCQluZXcgVHlwZU9uZSgiVHlwZU9uZSBpbnN0YW5jZSAyIiwgMSwgZmFsc2UsICJEaWZmZXJlbnQgdGV4dCIpLAotCQkJCW5ldyBUeXBlT25lKCJUeXBlT25lIGluc3RhbmNlIDMiLCAzLCB0cnVlLCAiVGV4dCIpLAotCQkJCW5ldyBUeXBlT25lKCJUeXBlT25lIGluc3RhbmNlIDQiLCAwLCBmYWxzZSwgIkxvbmdlciB0ZXh0IiksCi0JCQkJbmV3IFR5cGVPbmUoIlR5cGVPbmUgaW5zdGFuY2UgNSIsIDEsIHRydWUsICJTYW1wbGUiKSwKLQkJCQluZXcgVHlwZVR3bygiVHlwZVR3byBpbnN0YW5jZSAxIiwgZmFsc2UsIHRydWUpLAotCQkJCW5ldyBUeXBlVHdvKCJUeXBlVHdvIGluc3RhbmNlIDIiLCB0cnVlLCBmYWxzZSl9OwotCQlhZGQob2JqZWN0cywgZmFsc2UpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGQoTmFtZWRPYmplY3RbXSBvYmpzLCBib29sZWFuIG5vdGlmeSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKLQkJCW9iamVjdHMuYWRkKG9ianNbaV0pOwotCQkJb2Jqc1tpXS5zZXRNb2RlbCh0aGlzKTsKLQkJfQotCQlpZiAobm90aWZ5KQotCQkJZmlyZU1vZGVsQ2hhbmdlZChvYmpzLCBJTW9kZWxMaXN0ZW5lci5BRERFRCwgIiIpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmUoTmFtZWRPYmplY3RbXSBvYmpzLCBib29sZWFuIG5vdGlmeSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKLQkJCW9iamVjdHMucmVtb3ZlKG9ianNbaV0pOwotCQkJb2Jqc1tpXS5zZXRNb2RlbChudWxsKTsKLQkJfQotCQlpZiAobm90aWZ5KQotCQkJZmlyZU1vZGVsQ2hhbmdlZChvYmpzLCBJTW9kZWxMaXN0ZW5lci5SRU1PVkVELCAiIik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvVGhpcmRQYWdlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1RoaXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWNiYjdlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvVGhpcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy4qOwotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLQotICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFRoaXJkUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKi8KLQlwdWJsaWMgVGhpcmRQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgInRoaXJkIiwgIkZsb3cgUGFnZSIpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCS8vRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRUZXh0KCJGb3JtIHdpdGggd3JhcHBlZCBjb250cm9scyIpOwotCQlDb2x1bW5MYXlvdXQgbGF5b3V0ID0gbmV3IENvbHVtbkxheW91dCgpOwotCQlsYXlvdXQudG9wTWFyZ2luID0gMDsKLQkJbGF5b3V0LmJvdHRvbU1hcmdpbiA9IDU7Ci0JCWxheW91dC5sZWZ0TWFyZ2luID0gMTA7Ci0JCWxheW91dC5yaWdodE1hcmdpbiA9IDEwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOwotCQlsYXlvdXQubWF4TnVtQ29sdW1ucyA9IDQ7Ci0JCWxheW91dC5taW5OdW1Db2x1bW5zID0gMTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0JCS8vZm9ybS5nZXRCb2R5KCkuc2V0QmFja2dyb3VuZCgKLQkJLy8JCWZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQkJY3JlYXRlU2VjdGlvbldpdGhMaW5rcyhtYW5hZ2VkRm9ybSwgIkxpbmsgU2VjdGlvbiIsCi0JCQkJIkFuIGV4YW1wbGUgb2YgYSBzZWN0aW9uIHdpdGggbGlua3MiLCAyKTsKLQkJY3JlYXRlU2VjdGlvbldpdGhMaW5rcyhtYW5hZ2VkRm9ybSwgIkxpbmsgU2VjdGlvbiIsCi0JCQkJIkFuIGV4YW1wbGUgb2YgYSBzZWN0aW9uIHdpdGggbGlua3MiLCAyKTsKLQkJY3JlYXRlTWl4ZWRTZWN0aW9uKG1hbmFnZWRGb3JtLCAiTWl4ZWQgU2VjdGlvbiIsCi0JCQkJIkFuIGV4YW1wbGUgb2YgYSBzZWN0aW9uIHdpdGggYm90aCBsaW5rcyBhbmQgZm9ybSBjb250cm9scyIpOwotCQljcmVhdGVTZWN0aW9uV2l0aExpbmtzKG1hbmFnZWRGb3JtLCAiTGluayBTZWN0aW9uIiwKLQkJCQkiQW4gZXhhbXBsZSBvZiBhIHNlY3Rpb24gd2l0aCBsaW5rcyIsIDQpOwotCQljcmVhdGVTZWN0aW9uV2l0aENvbnRyb2xzKG1hbmFnZWRGb3JtLCAiQ29udHJvbCBTZWN0aW9uIiwKLQkJCQkiQW4gZXhhbXBsZSBvZiBhIHNlY3Rpb24gd2l0aCBmb3JtIGNvbnRyb2xzIik7Ci0JCWNyZWF0ZVNlY3Rpb25XaXRoTGlua3MobWFuYWdlZEZvcm0sICJTYW1wbGUgU2VjdGlvbiIsCi0JCQkJIkFuIGV4YW1wbGUgb2YgYSBzZWN0aW9uIHdpdGggbGlua3MiLCAzKTsKLQkJY3JlYXRlU2VjdGlvbldpdGhMaW5rcyhtYW5hZ2VkRm9ybSwgIlNhbXBsZSBTZWN0aW9uIiwKLQkJCQkiQW4gZXhhbXBsZSBvZiBhIHNlY3Rpb24gd2l0aCBsaW5rcyIsIDUpOwotCQljcmVhdGVNaXhlZFNlY3Rpb24obWFuYWdlZEZvcm0sICJNaXhlZCBTZWN0aW9uIiwKLQkJCQkiQW4gZXhhbXBsZSBvZiBhIHNlY3Rpb24gd2l0aCBib3RoIGxpbmtzIGFuZCBmb3JtIGNvbnRyb2xzIik7Ci0JCWNyZWF0ZVNlY3Rpb25XaXRoTGlua3MobWFuYWdlZEZvcm0sICJTYW1wbGUgU2VjdGlvbiIsCi0JCQkJIkFuIGV4YW1wbGUgb2YgYSBzZWN0aW9uIHdpdGggbGlua3MiLCAyKTsKLQkJY3JlYXRlU2VjdGlvbldpdGhDb250cm9scyhtYW5hZ2VkRm9ybSwgIkNvbnRyb2wgU2VjdGlvbiIsCi0JCQkJIkFuIGV4YW1wbGUgb2YgYSBzZWN0aW9uIHdpdGggbGlua3MiKTsKLQkJY3JlYXRlU2VjdGlvbldpdGhMaW5rcyhtYW5hZ2VkRm9ybSwgIlNhbXBsZSBTZWN0aW9uIiwKLQkJCQkiQW4gZXhhbXBsZSBvZiBhIHNlY3Rpb24gd2l0aCBsaW5rcyIsIDQpOwotCQljcmVhdGVTZWN0aW9uV2l0aExpbmtzKG1hbmFnZWRGb3JtLCAiU2FtcGxlIFNlY3Rpb24iLAotCQkJCSJBbiBleGFtcGxlIG9mIGEgc2VjdGlvbiB3aXRoIGxpbmtzIiwgMik7Ci0JCWNyZWF0ZU1peGVkU2VjdGlvbihtYW5hZ2VkRm9ybSwgIk1peGVkIFNlY3Rpb24iLAotCQkJCSJBbiBleGFtcGxlIG9mIGEgc2VjdGlvbiB3aXRoIGJvdGggbGlua3MgYW5kIGZvcm0gY29udHJvbHMiKTsKLQkJY3JlYXRlU2VjdGlvbldpdGhMaW5rcyhtYW5hZ2VkRm9ybSwgIlNhbXBsZSBTZWN0aW9uIiwKLQkJCQkiQW4gZXhhbXBsZSBvZiBhIHNlY3Rpb24gd2l0aCBsaW5rcyIsIDIpOwotCQljcmVhdGVTZWN0aW9uV2l0aENvbnRyb2xzKG1hbmFnZWRGb3JtLCAiQ29udHJvbCBTZWN0aW9uIiwKLQkJCQkiQW4gZXhhbXBsZSBvZiBhIHNlY3Rpb24gd2l0aCBmb3JtIGNvbnRyb2xzIik7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWN0aW9uV2l0aExpbmtzKElNYW5hZ2VkRm9ybSBtZm9ybSwgU3RyaW5nIHRpdGxlLAotCQkJU3RyaW5nIGRlc2MsIGludCBubGlua3MpIHsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IGNyZWF0ZVNlY3Rpb24obWZvcm0sIHRpdGxlLCBkZXNjLCAxKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1mb3JtLmdldFRvb2xraXQoKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbmxpbmtzOyBpKyspCi0JCQl0b29sa2l0LmNyZWF0ZUh5cGVybGluayhjbGllbnQsICJIeXBlcmxpbmsgdGV4dCAiICsgaSwgU1dULldSQVApOwotCX0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VjdGlvbldpdGhDb250cm9scyhJTWFuYWdlZEZvcm0gbWZvcm0sIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBkZXNjKSB7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSBjcmVhdGVTZWN0aW9uKG1mb3JtLCB0aXRsZSwgZGVzYywgMSk7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtZm9ybS5nZXRUb29sa2l0KCk7Ci0JCXRvb2xraXQuY3JlYXRlQnV0dG9uKGNsaWVudCwgIkEgcmFkaW8gYnV0dG9uIDEiLCBTV1QuUkFESU8pOwotCQl0b29sa2l0LmNyZWF0ZUJ1dHRvbihjbGllbnQsICJBIHJhZGlvIGJ1dHRvbiAyIiwgU1dULlJBRElPKTsKLQkJdG9vbGtpdC5jcmVhdGVCdXR0b24oY2xpZW50LCAiQSByYWRpbyBidXR0b24gd2l0aCBhIGxvbmdlciB0ZXh0IiwKLQkJCQlTV1QuUkFESU8pOwotCQl0b29sa2l0LmNyZWF0ZUJ1dHRvbihjbGllbnQsICJBIGNoZWNrYm94IGJ1dHRvbiIsIFNXVC5DSEVDSyk7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVNaXhlZFNlY3Rpb24oSU1hbmFnZWRGb3JtIG1mb3JtLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjKSB7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSBjcmVhdGVTZWN0aW9uKG1mb3JtLCB0aXRsZSwgZGVzYywgMik7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtZm9ybS5nZXRUb29sa2l0KCk7Ci0JCUh5cGVybGluayBsaW5rID0gdG9vbGtpdC5jcmVhdGVIeXBlcmxpbmsoY2xpZW50LAotCQkJCSJBIGxvbmdlciBoeXBlcmxpbmsgdGV4dCBleGFtcGxlIiwgU1dULldSQVApOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxpbmsgPSB0b29sa2l0LmNyZWF0ZUh5cGVybGluayhjbGllbnQsICJBbm90aGVyIGh5cGVybGluayB0ZXh0IiwKLQkJCQlTV1QuV1JBUCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGluay5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdG9vbGtpdC5jcmVhdGVMYWJlbChjbGllbnQsICJBIHRleHQgbGFiZWw6Iik7Ci0JCVRleHQgdGV4dCA9IHRvb2xraXQuY3JlYXRlVGV4dChjbGllbnQsICIiLCBTV1QuU0lOR0xFKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2Qud2lkdGhIaW50ID0gMTUwOwotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotCQkvL3Rvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNsaWVudCk7Ci0JfQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVNlY3Rpb24oSU1hbmFnZWRGb3JtIG1mb3JtLCBTdHJpbmcgdGl0bGUsCi0JCQlTdHJpbmcgZGVzYywgaW50IG51bUNvbHVtbnMpIHsKLQkJZmluYWwgU2Nyb2xsZWRGb3JtIGZvcm0gPSBtZm9ybS5nZXRGb3JtKCk7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtZm9ybS5nZXRUb29sa2l0KCk7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgU2VjdGlvbi5UV0lTVElFCi0JCQkJfCBTZWN0aW9uLlNIT1JUX1RJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLkVYUEFOREVEKTsKLQkJc2VjdGlvbi5zZXRUZXh0KHRpdGxlKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQkJLy90b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihzZWN0aW9uKTsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY2xpZW50KTsKLQkJc2VjdGlvbi5hZGRFeHBhbnNpb25MaXN0ZW5lcihuZXcgRXhwYW5zaW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdlZChFeHBhbnNpb25FdmVudCBlKSB7Ci0JCQkJZm9ybS5yZWZsb3coZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGNsaWVudDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL3JjcC9UeXBlT25lLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1R5cGVPbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlY2RmNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1R5cGVPbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMuaW50ZXJuYWwucmNwOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlT25lIGV4dGVuZHMgTmFtZWRPYmplY3QgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQ0hPSUNFPSJjaG9pY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRkxBRz0iZmxhZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9URVhUPSJ0ZXh0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBbXSBDSE9JQ0VTID0gewotCQkJIkNob2ljZSAxIiwgIkNob2ljZSAyIiwgIkNob2ljZSAzIiwgIkNob2ljZSA0IiB9OwotCXByaXZhdGUgaW50IGNob2ljZT0wOwotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0JcHJpdmF0ZSBib29sZWFuIGZsYWc7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBUeXBlT25lKFN0cmluZyBuYW1lLCBpbnQgY2hvaWNlLCBib29sZWFuIGZsYWcsIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKG5hbWUpOwotCQl0aGlzLmZsYWcgPSBmbGFnOwotCQl0aGlzLnRleHQgPSB0ZXh0OwotCQl0aGlzLmNob2ljZSA9IGNob2ljZTsKLQl9Ci0JcHVibGljIGludCBnZXRDaG9pY2UoKSB7Ci0JCXJldHVybiBjaG9pY2U7Ci0JfQotCXB1YmxpYyB2b2lkIHNldENob2ljZShpbnQgY2hvaWNlKSB7Ci0JCXRoaXMuY2hvaWNlID0gY2hvaWNlOwotCQltb2RlbC5maXJlTW9kZWxDaGFuZ2VkKG5ldyBPYmplY3RbXSB7dGhpc30sIElNb2RlbExpc3RlbmVyLkNIQU5HRUQsIFBfQ0hPSUNFKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0RmxhZygpIHsKLQkJcmV0dXJuIGZsYWc7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEZsYWcoYm9vbGVhbiBmbGFnKSB7Ci0JCXRoaXMuZmxhZyA9IGZsYWc7Ci0JCW1vZGVsLmZpcmVNb2RlbENoYW5nZWQobmV3IE9iamVjdFtdIHt0aGlzfSwgSU1vZGVsTGlzdGVuZXIuQ0hBTkdFRCwgUF9GTEFHKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLnRleHQgPSB0ZXh0OwotCQltb2RlbC5maXJlTW9kZWxDaGFuZ2VkKG5ldyBPYmplY3RbXSB7dGhpc30sIElNb2RlbExpc3RlbmVyLkNIQU5HRUQsIFBfVEVYVCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvVHlwZU9uZURldGFpbHNQYWdlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1R5cGVPbmVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzViYTc3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvVHlwZU9uZURldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLio7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFR5cGVPbmVEZXRhaWxzUGFnZSBpbXBsZW1lbnRzIElEZXRhaWxzUGFnZSB7Ci0JcHJpdmF0ZSBJTWFuYWdlZEZvcm0gbWZvcm07Ci0JcHJpdmF0ZSBUeXBlT25lIGlucHV0OwotCXByaXZhdGUgQnV0dG9uIFtdIGNob2ljZXM7Ci0JcHJpdmF0ZSBCdXR0b24gZmxhZzsKLQlwcml2YXRlIFRleHQgdGV4dDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlRFWFRfREFUQSA9Ci0JCQkiPGZvcm0+PHA+QW4gZXhhbXBsZSBvZiBhIGZyZWUtZm9ybSB0ZXh0IHRoYXQgc2hvdWxkIGJlICIrCi0JCQkid3JhcHBlZCBiZWxvdyB0aGUgc2VjdGlvbiB3aXRoIHdpZGdldHMuPC9wPiIrCi0JCQkiPHA+SXQgY2FuIGNvbnRhaW4gc2ltcGxlIHRhZ3MgbGlrZSA8YT5saW5rczwvYT4gYW5kIDxiPmJvbGQgdGV4dDwvYj4uPC9wPjwvZm9ybT4iOwotCQotCXB1YmxpYyBUeXBlT25lRGV0YWlsc1BhZ2UoKSB7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklEZXRhaWxzUGFnZSNpbml0aWFsaXplKG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElNYW5hZ2VkRm9ybSBtZm9ybSkgewotCQl0aGlzLm1mb3JtID0gbWZvcm07Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklEZXRhaWxzUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUYWJsZVdyYXBMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlV3JhcExheW91dCgpOwotCQlsYXlvdXQudG9wTWFyZ2luID0gNTsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gPSA1OwotCQlsYXlvdXQucmlnaHRNYXJnaW4gPSAyOwotCQlsYXlvdXQuYm90dG9tTWFyZ2luID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtZm9ybS5nZXRUb29sa2l0KCk7Ci0JCVNlY3Rpb24gczEgPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTZWN0aW9uLkRFU0NSSVBUSU9OKTsKLQkJczEubWFyZ2luV2lkdGggPSAxMDsKLQkJczEuc2V0VGV4dCgiVHlwZSBPbmUgRGV0YWlscyIpOwotCQlzMS5zZXREZXNjcmlwdGlvbigiU2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzZWxlY3RlZCBUeXBlT25lIG9iamVjdC4iKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTCwgVGFibGVXcmFwRGF0YS5UT1ApOwotCQl0ZC5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCXMxLnNldExheW91dERhdGEodGQpOwotCQl0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihzMSk7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzMSk7Ci0JCUdyaWRMYXlvdXQgZ2xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdsYXlvdXQubWFyZ2luV2lkdGggPSBnbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWdsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNsaWVudC5zZXRMYXlvdXQoZ2xheW91dCk7Ci0JCWNsaWVudC5zZXRCYWNrZ3JvdW5kKGNsaWVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0NZQU4pKTsKLQkJCi0JCVNlbGVjdGlvbkxpc3RlbmVyIGNob2ljZUxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSW50ZWdlciB2YWx1ZSA9IChJbnRlZ2VyKWUud2lkZ2V0LmdldERhdGEoKTsKLQkJCQlpZiAoaW5wdXQhPW51bGwpIHsKLQkJCQkJaW5wdXQuc2V0Q2hvaWNlKHZhbHVlLmludFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJR3JpZERhdGEgZ2Q7Ci0JCWNob2ljZXMgPSBuZXcgQnV0dG9uW1R5cGVPbmUuQ0hPSUNFUy5sZW5ndGhdOwotCQlmb3IgKGludCBpPTA7IGk8VHlwZU9uZS5DSE9JQ0VTLmxlbmd0aDsgaSsrKSB7Ci0JCQljaG9pY2VzW2ldID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY2xpZW50LCBUeXBlT25lLkNIT0lDRVNbaV0sIFNXVC5SQURJTyk7Ci0JCQljaG9pY2VzW2ldLnNldERhdGEobmV3IEludGVnZXIoaSkpOwotCQkJY2hvaWNlc1tpXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjaG9pY2VMaXN0ZW5lcik7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJY2hvaWNlc1tpXS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQljcmVhdGVTcGFjZXIodG9vbGtpdCwgY2xpZW50LCAyKTsKLQkJZmxhZyA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNsaWVudCwgIlZhbHVlIG9mIHRoZSBmbGFnIHByb3BlcnR5IiwgU1dULkNIRUNLKTsKLQkJZmxhZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoaW5wdXQhPW51bGwpCi0JCQkJCWlucHV0LnNldEZsYWcoZmxhZy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZsYWcuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNyZWF0ZVNwYWNlcih0b29sa2l0LCBjbGllbnQsIDIpOwotCQkKLQkJdG9vbGtpdC5jcmVhdGVMYWJlbChjbGllbnQsICJUZXh0IHByb3BlcnR5OiIpOwotCQl0ZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNsaWVudCwgIiIsIFNXVC5TSU5HTEUpOwotCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpbnB1dCE9bnVsbCkKLQkJCQkJaW5wdXQuc2V0VGV4dCh0ZXh0LmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUx8R3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZ2Qud2lkdGhIaW50ID0gMTA7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQljcmVhdGVTcGFjZXIodG9vbGtpdCwgY2xpZW50LCAyKTsKLQkJCi0JCUZvcm1UZXh0IHJ0ZXh0ID0gdG9vbGtpdC5jcmVhdGVGb3JtVGV4dChwYXJlbnQsIGZhbHNlKTsKLQkJcnRleHQuc2V0VGV4dChSVEVYVF9EQVRBLCB0cnVlLCBmYWxzZSk7Ci0JCXRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMLCBUYWJsZVdyYXBEYXRhLlRPUCk7Ci0JCXRkLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJcnRleHQuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihzMSk7Ci0JCXMxLnNldENsaWVudChjbGllbnQpOwotCX0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU3BhY2VyKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIGludCBzcGFuKSB7Ci0JCUxhYmVsIHNwYWNlciA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCAiIik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJc3BhY2VyLnNldExheW91dERhdGEoZ2QpOwotCX0KLQlwcml2YXRlIHZvaWQgdXBkYXRlKCkgewotCQlmb3IgKGludCBpPTA7IGk8VHlwZU9uZS5DSE9JQ0VTLmxlbmd0aDsgaSsrKSB7Ci0JCQljaG9pY2VzW2ldLnNldFNlbGVjdGlvbihpbnB1dCE9bnVsbCAmJiBpbnB1dC5nZXRDaG9pY2UoKT09aSk7Ci0JCX0KLQkJZmxhZy5zZXRTZWxlY3Rpb24oaW5wdXQhPW51bGwgJiYgaW5wdXQuZ2V0RmxhZygpKTsKLQkJdGV4dC5zZXRUZXh0KGlucHV0IT1udWxsICYmIGlucHV0LmdldFRleHQoKSE9bnVsbD9pbnB1dC5nZXRUZXh0KCk6IiIpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRGV0YWlsc1BhZ2UjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJRm9ybVBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCWlmIChzc2VsLnNpemUoKT09MSkgewotCQkJaW5wdXQgPSAoVHlwZU9uZSlzc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCWVsc2UKLQkJCWlucHV0ID0gbnVsbDsKLQkJdXBkYXRlKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklEZXRhaWxzUGFnZSNjb21taXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbW1pdChib29sZWFuIG9uU2F2ZSkgewotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRGV0YWlsc1BhZ2Ujc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQljaG9pY2VzWzBdLnNldEZvY3VzKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklEZXRhaWxzUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRGV0YWlsc1BhZ2UjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1N0YWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklEZXRhaWxzUGFnZSNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl1cGRhdGUoKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gc2V0Rm9ybUlucHV0KE9iamVjdCBpbnB1dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL3JjcC9UeXBlVHdvLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1R5cGVUd28uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3ZThhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1R5cGVUd28uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMuaW50ZXJuYWwucmNwOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlVHdvIGV4dGVuZHMgTmFtZWRPYmplY3QgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRkxBRzE9ImZsYWcxIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0ZMQUcyPSJmbGFnMiI7Ci0JcHJpdmF0ZSBib29sZWFuIGZsYWcxOwotCXByaXZhdGUgYm9vbGVhbiBmbGFnMjsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFR5cGVUd28oU3RyaW5nIG5hbWUsIGJvb2xlYW4gZmxhZzEsIGJvb2xlYW4gZmxhZzIpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRGbGFnMSgpIHsKLQkJcmV0dXJuIGZsYWcxOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRGbGFnMigpIHsKLQkJcmV0dXJuIGZsYWcyOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRGbGFnMShib29sZWFuIGZsYWcxKSB7Ci0JCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJbW9kZWwuZmlyZU1vZGVsQ2hhbmdlZChuZXcgT2JqZWN0W10ge3RoaXN9LCBJTW9kZWxMaXN0ZW5lci5DSEFOR0VELCBQX0ZMQUcxKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RmxhZzIoYm9vbGVhbiBmbGFnMikgewotCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCW1vZGVsLmZpcmVNb2RlbENoYW5nZWQobmV3IE9iamVjdFtdIHt0aGlzfSwgSU1vZGVsTGlzdGVuZXIuQ0hBTkdFRCwgUF9GTEFHMik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvVHlwZVR3b0RldGFpbHNQYWdlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvaW50ZXJuYWwvcmNwL1R5cGVUd29EZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzY1MTQ2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvVHlwZVR3b0RldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5yY3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLio7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFR5cGVUd29EZXRhaWxzUGFnZSBpbXBsZW1lbnRzIElEZXRhaWxzUGFnZSB7Ci0JcHJpdmF0ZSBJTWFuYWdlZEZvcm0gbWZvcm07Ci0JcHJpdmF0ZSBUeXBlVHdvIGlucHV0OwotCXByaXZhdGUgQnV0dG9uIGZsYWcxOwotCXByaXZhdGUgQnV0dG9uIGZsYWcyOwotCQotCXB1YmxpYyBUeXBlVHdvRGV0YWlsc1BhZ2UoKSB7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklEZXRhaWxzUGFnZSNpbml0aWFsaXplKG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElNYW5hZ2VkRm9ybSBtZm9ybSkgewotCQl0aGlzLm1mb3JtID0gbWZvcm07Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklEZXRhaWxzUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUYWJsZVdyYXBMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlV3JhcExheW91dCgpOwotCQlsYXlvdXQudG9wTWFyZ2luID0gNTsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gPSA1OwotCQlsYXlvdXQucmlnaHRNYXJnaW4gPSAyOwotCQkvL2xheW91dC5ib3R0b21NYXJnaW4gPSAyOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1mb3JtLmdldFRvb2xraXQoKTsKLQkJU2VjdGlvbiBzMSA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNlY3Rpb24uREVTQ1JJUFRJT04pOwotCQlzMS5tYXJnaW5XaWR0aCA9IDEwOwotCQlzMS5zZXRUZXh0KCJUeXBlIFR3byBEZXRhaWxzIik7Ci0JCXMxLnNldERlc2NyaXB0aW9uKCJTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNlbGVjdGVkIFR5cGVUd28gb2JqZWN0LiIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMLCBUYWJsZVdyYXBEYXRhLlRPUCk7Ci0JCXRkLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJczEuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXRvb2xraXQuY3JlYXRlQ29tcG9zaXRlU2VwYXJhdG9yKHMxKTsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHMxKTsKLQkJY2xpZW50LnNldEJhY2tncm91bmQoY2xpZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTUFHRU5UQSkpOwotCQlHcmlkTGF5b3V0IGdsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlnbGF5b3V0Lm1hcmdpbldpZHRoID0gZ2xheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljbGllbnQuc2V0TGF5b3V0KGdsYXlvdXQpOwotCQkKLQkJZmxhZzEgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjbGllbnQsICJWYWx1ZSBvZiB0aGUgZmxhZzEgcHJvcGVydHkiLCBTV1QuQ0hFQ0spOwotCQlmbGFnMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoaW5wdXQhPW51bGwpCi0JCQkJCWlucHV0LnNldEZsYWcxKGZsYWcxLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlmbGFnMiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNsaWVudCwgIlZhbHVlIG9mIHRoZSBmbGFnMiBwcm9wZXJ0eSIsIFNXVC5DSEVDSyk7Ci0JCWZsYWcyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChpbnB1dCE9bnVsbCkKLQkJCQkJaW5wdXQuc2V0RmxhZzIoZmxhZzIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJczEuc2V0Q2xpZW50KGNsaWVudCk7Ci0JfQotCXByaXZhdGUgdm9pZCB1cGRhdGUoKSB7Ci0JCWZsYWcxLnNldFNlbGVjdGlvbihpbnB1dCE9bnVsbCAmJiBpbnB1dC5nZXRGbGFnMSgpKTsKLQkJZmxhZzIuc2V0U2VsZWN0aW9uKGlucHV0IT1udWxsICYmIGlucHV0LmdldEZsYWcyKCkpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRGV0YWlsc1BhZ2UjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJRm9ybVBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCWlmIChzc2VsLnNpemUoKT09MSkgewotCQkJaW5wdXQgPSAoVHlwZVR3bylzc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCWVsc2UKLQkJCWlucHV0ID0gbnVsbDsKLQkJdXBkYXRlKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklEZXRhaWxzUGFnZSNjb21taXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbW1pdChib29sZWFuIG9uU2F2ZSkgewotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRGV0YWlsc1BhZ2Ujc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlmbGFnMS5zZXRGb2N1cygpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRGV0YWlsc1BhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuSURldGFpbHNQYWdlI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTdGFsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRGV0YWlsc1BhZ2UjcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdXBkYXRlKCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIHNldEZvcm1JbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy9pbnRlcm5hbC9yY3AvaW5kZXgueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL3JjcC9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMTBlMjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL2ludGVybmFsL3JjcC9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmb3JtPgotPHA+PGNvbnRyb2wgaHJlZj0ibm9kZSIvPjwvcD4KLTxwPgotVG8gY2hlY2sgZm9yIHVwZGF0ZXMgZm9yIGZlYXR1cmVzIHlvdSBoYXZlIGluc3RhbGxlZCwgCi1nbyB0byB0aGUgPGEgaHJlZj0iYWN0aW9uMSI+TXkgRWNsaXBzZSAxPC9hPiBhbmQgc2VsZWN0IAotPGI+QXZhaWxhYmxlIFVwZGF0ZXM8L2I+IGZvbGRlci4gPGI+U2VhcmNoIHBhZ2U8L2I+IHdpbGwgCi1iZSBzaG93biBhbGxvd2luZyB5b3UgdG8gaW5pdGlhdGUgYW5kIGN1c3RvbWl6ZSB0aGUgc2VhcmNoLiAKLU5vdyB3ZSA8Yj53aWxsPC9iPiBhZGQgYW4gCi08aW1nIGhyZWY9ImltYWdlMSIvPiAKLWltYWdlIGhlcmUuIEp1c3QKLSB0byBzaG93IGhvdyB3cmFwcGluZyBzaG91bGQgYXBwbHkgdG8gaW1hZ2VzIHdoZW4gdGhleSBhcmUgCi0gbGFyZ2VyIHRoYW4gdGhlIHJlZ3VsYXIgdGV4dC4KLTwvcD4KLTxwPk5ldyBhZGRpdGlvbjogY29udHJvbHMgaW4gdGhlIHRleHQ8L3A+Ci08cD48Y29udHJvbCBmaWxsPSJ0cnVlIiBocmVmPSJjb250cm9sMSIvPjwvcD4KLTxwPk5vdyB3ZSB3aWxsIHNob3cgYW4gaW1hZ2UgbGluazogPGEgaHJlZj0iYWN0aW9uMSI+PGltZyBocmVmPSJpbWFnZTEiLz48L2E+PC9wPgotPHA+QW5kIHRoaXMgaXMgaW1hZ2UgYW5kIHRleHQgYXMgYSBsaW5rOiA8YSBocmVmPSJhY3Rpb24xIj48aW1nIGhyZWY9ImltYWdlMSIvPlNvbWUgbGluayB0ZXh0PC9hPjwvcD4KLTxsaSBzdHlsZT0idGV4dCIgdmFsdWU9IjEuIj5UbyBjaGVjayBmb3IgdXBkYXRlcyBmb3IgZmVhdHVyZXMgeW91IGhhdmUgaW5zdGFsbGVkLCAKLWdvIHRvIHRoZSA8YSBocmVmPSJhY3Rpb24yIj5NeSBFY2xpcHNlIDI8L2E+IGFuZCBzZWxlY3QgCi08Yj5BdmFpbGFibGUgVXBkYXRlczwvYj4gZm9sZGVyLiA8Yj5TZWFyY2ggcGFnZTwvYj4gd2lsbCAKLWJlIHNob3duIGFsbG93aW5nIHlvdSB0byBpbml0aWF0ZSBhbmQgY3VzdG9taXplIHRoZSBzZWFyY2guPC9saT4KLTxsaSBzdHlsZT0idGV4dCIgdmFsdWU9IjIuIj5UaGlzIGlzIHRoZSBpdGVtIG51bWJlciAyLjwvbGk+Ci08bGkgc3R5bGU9InRleHQiIHZhbHVlPSIzLiI+VGhpcyBpcyB0aGUgaXRlbSBudW1iZXIgMy48L2xpPgotPGxpPlRoaXMgaXMgdGhlIGJ1bGxldCBpdGVtLjwvbGk+Ci08bGk+VGhpcyBpcyBhbm90aGVyIGJ1bGxldCBpdGVtLjwvbGk+Ci08cD4KLVRvIGNoZWNrIGZvciB1cGRhdGVzIGZvciBmZWF0dXJlcyB5b3UgaGF2ZSBpbnN0YWxsZWQsIAotZ28gdG8gdGhlIDxhIGhyZWY9ImFjdGlvbjEiPk15IEVjbGlwc2UgMTwvYT4gYW5kIHNlbGVjdCAKLTxiPkF2YWlsYWJsZSBVcGRhdGVzPC9iPiBmb2xkZXIuIDxiPlNlYXJjaCBwYWdlPC9iPiB3aWxsIAotYmUgc2hvd24gYWxsb3dpbmcgeW91IHRvIGluaXRpYXRlIGFuZCBjdXN0b21pemUgdGhlIHNlYXJjaC4gCi1Ob3cgd2UgPGI+d2lsbDwvYj4gYWRkIGFuIAotPGltZyBocmVmPSJpbWFnZTEiLz4gCi1pbWFnZSBoZXJlLiBKdXN0Ci0gdG8gc2hvdyBob3cgd3JhcHBpbmcgc2hvdWxkIGFwcGx5IHRvIGltYWdlcyB3aGVuIHRoZXkgYXJlIAotIGxhcmdlciB0aGFuIHRoZSByZWd1bGFyIHRleHQuCi08L3A+Ci08cD5Ob3cgd2Ugd2lsbCBzaG93IGFuIGltYWdlIGxpbms6IDxhIGhyZWY9ImFjdGlvbjEiPjxpbWcgaHJlZj0iaW1hZ2UxIi8+PC9hPjwvcD4KLTxwPkFuZCB0aGlzIGlzIGltYWdlIGFuZCB0ZXh0IGFzIGEgbGluazogPGEgaHJlZj0iYWN0aW9uMSI+PGltZyBocmVmPSJpbWFnZTEiLz5Tb21lIGxpbmsgdGV4dDwvYT48L3A+Ci08bGkgc3R5bGU9InRleHQiIHZhbHVlPSIxLiI+VG8gY2hlY2sgZm9yIHVwZGF0ZXMgZm9yIGZlYXR1cmVzIHlvdSBoYXZlIGluc3RhbGxlZCwgCi1nbyB0byB0aGUgPGEgaHJlZj0iYWN0aW9uMiI+TXkgRWNsaXBzZSAyPC9hPiBhbmQgc2VsZWN0IAotPGI+QXZhaWxhYmxlIFVwZGF0ZXM8L2I+IGZvbGRlci4gPGI+U2VhcmNoIHBhZ2U8L2I+IHdpbGwgCi1iZSBzaG93biBhbGxvd2luZyB5b3UgdG8gaW5pdGlhdGUgYW5kIGN1c3RvbWl6ZSB0aGUgc2VhcmNoLjwvbGk+Ci08bGkgc3R5bGU9InRleHQiIHZhbHVlPSIyLiI+VGhpcyBpcyB0aGUgaXRlbSBudW1iZXIgMi48L2xpPgotPGxpIHN0eWxlPSJ0ZXh0IiB2YWx1ZT0iMy4iPlRoaXMgaXMgdGhlIGl0ZW0gbnVtYmVyIDMuPC9saT4KLTxsaT5UaGlzIGlzIHRoZSBidWxsZXQgaXRlbS48L2xpPgotPGxpPlRoaXMgaXMgYW5vdGhlciBidWxsZXQgaXRlbS48L2xpPgotPHA+Ci1UbyBjaGVjayBmb3IgdXBkYXRlcyBmb3IgZmVhdHVyZXMgeW91IGhhdmUgaW5zdGFsbGVkLCAKLWdvIHRvIHRoZSA8YSBocmVmPSJhY3Rpb24xIj5NeSBFY2xpcHNlIDE8L2E+IGFuZCBzZWxlY3QgCi08Yj5BdmFpbGFibGUgVXBkYXRlczwvYj4gZm9sZGVyLiA8Yj5TZWFyY2ggcGFnZTwvYj4gd2lsbCAKLWJlIHNob3duIGFsbG93aW5nIHlvdSB0byBpbml0aWF0ZSBhbmQgY3VzdG9taXplIHRoZSBzZWFyY2guIAotTm93IHdlIDxiPndpbGw8L2I+IGFkZCBhbiAKLTxpbWcgaHJlZj0iaW1hZ2UxIi8+IAotaW1hZ2UgaGVyZS4gSnVzdAotIHRvIHNob3cgaG93IHdyYXBwaW5nIHNob3VsZCBhcHBseSB0byBpbWFnZXMgd2hlbiB0aGV5IGFyZSAKLSBsYXJnZXIgdGhhbiB0aGUgcmVndWxhciB0ZXh0LgotPC9wPgotPHA+Tm93IHdlIHdpbGwgc2hvdyBhbiBpbWFnZSBsaW5rOiA8YSBocmVmPSJhY3Rpb24xIj48aW1nIGhyZWY9ImltYWdlMSIvPjwvYT48L3A+Ci08cD5BbmQgdGhpcyBpcyBpbWFnZSBhbmQgdGV4dCBhcyBhIGxpbms6IDxhIGhyZWY9ImFjdGlvbjEiPjxpbWcgaHJlZj0iaW1hZ2UxIi8+U29tZSBsaW5rIHRleHQ8L2E+PC9wPgotPGxpIHN0eWxlPSJ0ZXh0IiB2YWx1ZT0iMS4iPlRvIGNoZWNrIGZvciB1cGRhdGVzIGZvciBmZWF0dXJlcyB5b3UgaGF2ZSBpbnN0YWxsZWQsIAotZ28gdG8gdGhlIDxhIGhyZWY9ImFjdGlvbjIiPk15IEVjbGlwc2UgMjwvYT4gYW5kIHNlbGVjdCAKLTxiPkF2YWlsYWJsZSBVcGRhdGVzPC9iPiBmb2xkZXIuIDxiPlNlYXJjaCBwYWdlPC9iPiB3aWxsIAotYmUgc2hvd24gYWxsb3dpbmcgeW91IHRvIGluaXRpYXRlIGFuZCBjdXN0b21pemUgdGhlIHNlYXJjaC48L2xpPgotPGxpIHN0eWxlPSJ0ZXh0IiB2YWx1ZT0iMi4iPlRoaXMgaXMgdGhlIGl0ZW0gbnVtYmVyIDIuPC9saT4KLTxsaSBzdHlsZT0idGV4dCIgdmFsdWU9IjMuIj5UaGlzIGlzIHRoZSBpdGVtIG51bWJlciAzLjwvbGk+Ci08bGk+VGhpcyBpcyB0aGUgYnVsbGV0IGl0ZW0uPC9saT4KLTxsaT5UaGlzIGlzIGFub3RoZXIgYnVsbGV0IGl0ZW0uPC9saT4KLTxwPgotVG8gY2hlY2sgZm9yIHVwZGF0ZXMgZm9yIGZlYXR1cmVzIHlvdSBoYXZlIGluc3RhbGxlZCwgCi1nbyB0byB0aGUgPGEgaHJlZj0iYWN0aW9uMSI+TXkgRWNsaXBzZSAxPC9hPiBhbmQgc2VsZWN0IAotPGI+QXZhaWxhYmxlIFVwZGF0ZXM8L2I+IGZvbGRlci4gPGI+U2VhcmNoIHBhZ2U8L2I+IHdpbGwgCi1iZSBzaG93biBhbGxvd2luZyB5b3UgdG8gaW5pdGlhdGUgYW5kIGN1c3RvbWl6ZSB0aGUgc2VhcmNoLiAKLU5vdyB3ZSA8Yj53aWxsPC9iPiBhZGQgYW4gCi08aW1nIGhyZWY9ImltYWdlMSIvPiAKLWltYWdlIGhlcmUuIEp1c3QKLSB0byBzaG93IGhvdyB3cmFwcGluZyBzaG91bGQgYXBwbHkgdG8gaW1hZ2VzIHdoZW4gdGhleSBhcmUgCi0gbGFyZ2VyIHRoYW4gdGhlIHJlZ3VsYXIgdGV4dC4KLTwvcD4KLTxwPk5vdyB3ZSB3aWxsIHNob3cgYW4gaW1hZ2UgbGluazogPGEgaHJlZj0iYWN0aW9uMSI+PGltZyBocmVmPSJpbWFnZTEiLz48L2E+PC9wPgotPHA+QW5kIHRoaXMgaXMgaW1hZ2UgYW5kIHRleHQgYXMgYSBsaW5rOiA8YSBocmVmPSJhY3Rpb24xIj48aW1nIGhyZWY9ImltYWdlMSIvPlNvbWUgbGluayB0ZXh0PC9hPjwvcD4KLTxsaSBzdHlsZT0idGV4dCIgdmFsdWU9IjEuIj5UbyBjaGVjayBmb3IgdXBkYXRlcyBmb3IgZmVhdHVyZXMgeW91IGhhdmUgaW5zdGFsbGVkLCAKLWdvIHRvIHRoZSA8YSBocmVmPSJhY3Rpb24yIj5NeSBFY2xpcHNlIDI8L2E+IGFuZCBzZWxlY3QgCi08Yj5BdmFpbGFibGUgVXBkYXRlczwvYj4gZm9sZGVyLiA8Yj5TZWFyY2ggcGFnZTwvYj4gd2lsbCAKLWJlIHNob3duIGFsbG93aW5nIHlvdSB0byBpbml0aWF0ZSBhbmQgY3VzdG9taXplIHRoZSBzZWFyY2guPC9saT4KLTxsaSBzdHlsZT0idGV4dCIgdmFsdWU9IjIuIj5UaGlzIGlzIHRoZSBpdGVtIG51bWJlciAyLjwvbGk+Ci08bGkgc3R5bGU9InRleHQiIHZhbHVlPSIzLiI+VGhpcyBpcyB0aGUgaXRlbSBudW1iZXIgMy48L2xpPgotPGxpPlRoaXMgaXMgdGhlIGJ1bGxldCBpdGVtLjwvbGk+Ci08bGk+VGhpcyBpcyBhbm90aGVyIGJ1bGxldCBpdGVtLjwvbGk+Ci08cD4KLVRvIGNoZWNrIGZvciB1cGRhdGVzIGZvciBmZWF0dXJlcyB5b3UgaGF2ZSBpbnN0YWxsZWQsIAotZ28gdG8gdGhlIDxhIGhyZWY9ImFjdGlvbjEiPk15IEVjbGlwc2UgMTwvYT4gYW5kIHNlbGVjdCAKLTxiPkF2YWlsYWJsZSBVcGRhdGVzPC9iPiBmb2xkZXIuIDxiPlNlYXJjaCBwYWdlPC9iPiB3aWxsIAotYmUgc2hvd24gYWxsb3dpbmcgeW91IHRvIGluaXRpYXRlIGFuZCBjdXN0b21pemUgdGhlIHNlYXJjaC4gCi1Ob3cgd2UgPGI+d2lsbDwvYj4gYWRkIGFuIAotPGltZyBocmVmPSJpbWFnZTEiLz4gCi1pbWFnZSBoZXJlLiBKdXN0Ci0gdG8gc2hvdyBob3cgd3JhcHBpbmcgc2hvdWxkIGFwcGx5IHRvIGltYWdlcyB3aGVuIHRoZXkgYXJlIAotIGxhcmdlciB0aGFuIHRoZSByZWd1bGFyIHRleHQuCi08L3A+Ci08cD5Ob3cgd2Ugd2lsbCBzaG93IGFuIGltYWdlIGxpbms6IDxhIGhyZWY9ImFjdGlvbjEiPjxpbWcgaHJlZj0iaW1hZ2UxIi8+PC9hPjwvcD4KLTxwPkFuZCB0aGlzIGlzIGltYWdlIGFuZCB0ZXh0IGFzIGEgbGluazogPGEgaHJlZj0iYWN0aW9uMSI+PGltZyBocmVmPSJpbWFnZTEiLz5Tb21lIGxpbmsgdGV4dDwvYT48L3A+Ci08bGkgc3R5bGU9InRleHQiIHZhbHVlPSIxLiI+VG8gY2hlY2sgZm9yIHVwZGF0ZXMgZm9yIGZlYXR1cmVzIHlvdSBoYXZlIGluc3RhbGxlZCwgCi1nbyB0byB0aGUgPGEgaHJlZj0iYWN0aW9uMiI+TXkgRWNsaXBzZSAyPC9hPiBhbmQgc2VsZWN0IAotPGI+QXZhaWxhYmxlIFVwZGF0ZXM8L2I+IGZvbGRlci4gPGI+U2VhcmNoIHBhZ2U8L2I+IHdpbGwgCi1iZSBzaG93biBhbGxvd2luZyB5b3UgdG8gaW5pdGlhdGUgYW5kIGN1c3RvbWl6ZSB0aGUgc2VhcmNoLjwvbGk+Ci08bGkgc3R5bGU9InRleHQiIHZhbHVlPSIyLiI+VGhpcyBpcyB0aGUgaXRlbSBudW1iZXIgMi48L2xpPgotPGxpIHN0eWxlPSJ0ZXh0IiB2YWx1ZT0iMy4iPlRoaXMgaXMgdGhlIGl0ZW0gbnVtYmVyIDMuPC9saT4KLTxsaT5UaGlzIGlzIHRoZSBidWxsZXQgaXRlbS48L2xpPgotPGxpPlRoaXMgaXMgYW5vdGhlciBidWxsZXQgaXRlbS48L2xpPgotPHA+Ci1UbyBjaGVjayBmb3IgdXBkYXRlcyBmb3IgZmVhdHVyZXMgeW91IGhhdmUgaW5zdGFsbGVkLCAKLWdvIHRvIHRoZSA8YSBocmVmPSJhY3Rpb24xIj5NeSBFY2xpcHNlIDE8L2E+IGFuZCBzZWxlY3QgCi08Yj5BdmFpbGFibGUgVXBkYXRlczwvYj4gZm9sZGVyLiA8Yj5TZWFyY2ggcGFnZTwvYj4gd2lsbCAKLWJlIHNob3duIGFsbG93aW5nIHlvdSB0byBpbml0aWF0ZSBhbmQgY3VzdG9taXplIHRoZSBzZWFyY2guIAotTm93IHdlIDxiPndpbGw8L2I+IGFkZCBhbiAKLTxpbWcgaHJlZj0iaW1hZ2UxIi8+IAotaW1hZ2UgaGVyZS4gSnVzdAotIHRvIHNob3cgaG93IHdyYXBwaW5nIHNob3VsZCBhcHBseSB0byBpbWFnZXMgd2hlbiB0aGV5IGFyZSAKLSBsYXJnZXIgdGhhbiB0aGUgcmVndWxhciB0ZXh0LgotPC9wPgotPHA+Tm93IHdlIHdpbGwgc2hvdyBhbiBpbWFnZSBsaW5rOiA8YSBocmVmPSJhY3Rpb24xIj48aW1nIGhyZWY9ImltYWdlMSIvPjwvYT48L3A+Ci08cD5BbmQgdGhpcyBpcyBpbWFnZSBhbmQgdGV4dCBhcyBhIGxpbms6IDxhIGhyZWY9ImFjdGlvbjEiPjxpbWcgaHJlZj0iaW1hZ2UxIi8+U29tZSBsaW5rIHRleHQ8L2E+PC9wPgotPGxpIHN0eWxlPSJ0ZXh0IiB2YWx1ZT0iMS4iPlRvIGNoZWNrIGZvciB1cGRhdGVzIGZvciBmZWF0dXJlcyB5b3UgaGF2ZSBpbnN0YWxsZWQsIAotZ28gdG8gdGhlIDxhIGhyZWY9ImFjdGlvbjIiPk15IEVjbGlwc2UgMjwvYT4gYW5kIHNlbGVjdCAKLTxiPkF2YWlsYWJsZSBVcGRhdGVzPC9iPiBmb2xkZXIuIDxiPlNlYXJjaCBwYWdlPC9iPiB3aWxsIAotYmUgc2hvd24gYWxsb3dpbmcgeW91IHRvIGluaXRpYXRlIGFuZCBjdXN0b21pemUgdGhlIHNlYXJjaC48L2xpPgotPGxpIHN0eWxlPSJ0ZXh0IiB2YWx1ZT0iMi4iPlRoaXMgaXMgdGhlIGl0ZW0gbnVtYmVyIDIuPC9saT4KLTxsaSBzdHlsZT0idGV4dCIgdmFsdWU9IjMuIj5UaGlzIGlzIHRoZSBpdGVtIG51bWJlciAzLjwvbGk+Ci08bGk+VGhpcyBpcyB0aGUgYnVsbGV0IGl0ZW0uPC9saT4KLTxsaT5UaGlzIGlzIGFub3RoZXIgYnVsbGV0IGl0ZW0uPC9saT4KLTxwPgotVG8gY2hlY2sgZm9yIHVwZGF0ZXMgZm9yIGZlYXR1cmVzIHlvdSBoYXZlIGluc3RhbGxlZCwgCi1nbyB0byB0aGUgPGEgaHJlZj0iYWN0aW9uMSI+TXkgRWNsaXBzZSAxPC9hPiBhbmQgc2VsZWN0IAotPGI+QXZhaWxhYmxlIFVwZGF0ZXM8L2I+IGZvbGRlci4gPGI+U2VhcmNoIHBhZ2U8L2I+IHdpbGwgCi1iZSBzaG93biBhbGxvd2luZyB5b3UgdG8gaW5pdGlhdGUgYW5kIGN1c3RvbWl6ZSB0aGUgc2VhcmNoLiAKLU5vdyB3ZSA8Yj53aWxsPC9iPiBhZGQgYW4gCi08aW1nIGhyZWY9ImltYWdlMSIvPiAKLWltYWdlIGhlcmUuIEp1c3QKLSB0byBzaG93IGhvdyB3cmFwcGluZyBzaG91bGQgYXBwbHkgdG8gaW1hZ2VzIHdoZW4gdGhleSBhcmUgCi0gbGFyZ2VyIHRoYW4gdGhlIHJlZ3VsYXIgdGV4dC4KLTwvcD4KLTxwPk5vdyB3ZSB3aWxsIHNob3cgYW4gaW1hZ2UgbGluazogPGEgaHJlZj0iYWN0aW9uMSI+PGltZyBocmVmPSJpbWFnZTEiLz48L2E+PC9wPgotPHA+QW5kIHRoaXMgaXMgaW1hZ2UgYW5kIHRleHQgYXMgYSBsaW5rOiA8YSBocmVmPSJhY3Rpb24xIj48aW1nIGhyZWY9ImltYWdlMSIvPlNvbWUgbGluayB0ZXh0PC9hPjwvcD4KLTxsaSBzdHlsZT0idGV4dCIgdmFsdWU9IjEuIj5UbyBjaGVjayBmb3IgdXBkYXRlcyBmb3IgZmVhdHVyZXMgeW91IGhhdmUgaW5zdGFsbGVkLCAKLWdvIHRvIHRoZSA8YSBocmVmPSJhY3Rpb24yIj5NeSBFY2xpcHNlIDI8L2E+IGFuZCBzZWxlY3QgCi08Yj5BdmFpbGFibGUgVXBkYXRlczwvYj4gZm9sZGVyLiA8Yj5TZWFyY2ggcGFnZTwvYj4gd2lsbCAKLWJlIHNob3duIGFsbG93aW5nIHlvdSB0byBpbml0aWF0ZSBhbmQgY3VzdG9taXplIHRoZSBzZWFyY2guPC9saT4KLTxsaSBzdHlsZT0idGV4dCIgdmFsdWU9IjIuIj5UaGlzIGlzIHRoZSBpdGVtIG51bWJlciAyLjwvbGk+Ci08bGkgc3R5bGU9InRleHQiIHZhbHVlPSIzLiI+VGhpcyBpcyB0aGUgaXRlbSBudW1iZXIgMy48L2xpPgotPGxpPlRoaXMgaXMgdGhlIGJ1bGxldCBpdGVtLjwvbGk+Ci08bGk+VGhpcyBpcyBhbm90aGVyIGJ1bGxldCBpdGVtLjwvbGk+Ci08L2Zvcm0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VpL2Zvcm1zL2V4YW1wbGVzL3ZpZXdzL0Zvcm1WaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvdmlld3MvRm9ybVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4NDNmMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvdmlld3MvRm9ybVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLnZpZXdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuRm9ybUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy5pbnRlcm5hbC5FeGFtcGxlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotcHVibGljIGNsYXNzIEZvcm1WaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQlwcml2YXRlIFNjcm9sbGVkRm9ybSBmb3JtOwotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRm9ybVZpZXcoKSB7Ci0JfQotCS8qKgotCSAqIFRoaXMgaXMgYSBjYWxsYmFjayB0aGF0IHdpbGwgYWxsb3cgdXMgdG8gY3JlYXRlIHRoZSB2aWV3ZXIgYW5kCi0JICogaW5pdGlhbGl6ZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRvb2xraXQgPSBuZXcgRm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCWZvcm0gPSB0b29sa2l0LmNyZWF0ZVNjcm9sbGVkRm9ybShwYXJlbnQpOwotCQlmb3JtLnNldFRleHQoIkhlbGxvLCBFY2xpcHNlIEZvcm1zIik7Ci0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJSHlwZXJsaW5rIGxpbmsgPSB0b29sa2l0LmNyZWF0ZUh5cGVybGluayhmb3JtLmdldEJvZHkoKSwgIkNsaWNrIGhlcmUuIiwKLQkJCQlTV1QuV1JBUCk7Ci0JCWxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmsgYWN0aXZhdGVkISIpOwotCQkJfQotCQl9KTsKLQkJbGluay5zZXRUZXh0KCJUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBmb3JtIHRoYXQgaXMgbXVjaCBsb25nZXIgYW5kIHdpbGwgbmVlZCB0byB3cmFwLiIpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YSgpOwotCQl0ZC5jb2xzcGFuID0gMjsKLQkJbGluay5zZXRMYXlvdXREYXRhKHRkKTsKLQkJdG9vbGtpdC5jcmVhdGVMYWJlbChmb3JtLmdldEJvZHkoKSwgIlRleHQgZmllbGQgbGFiZWw6Iik7Ci0JCVRleHQgdGV4dCA9IHRvb2xraXQuY3JlYXRlVGV4dChmb3JtLmdldEJvZHkoKSwgIiIpOwotCQl0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKHRkKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGZvcm0uZ2V0Qm9keSgpLAotCQkJCSJBbiBleGFtcGxlIG9mIGEgY2hlY2tib3ggaW4gYSBmb3JtIiwgU1dULkNIRUNLKTsKLQkJdGQgPSBuZXcgVGFibGVXcmFwRGF0YSgpOwotCQl0ZC5jb2xzcGFuID0gMjsKLQkJYnV0dG9uLnNldExheW91dERhdGEodGQpOwotCQkKLQkJSW1hZ2VIeXBlcmxpbmsgaWggPSB0b29sa2l0LmNyZWF0ZUltYWdlSHlwZXJsaW5rKGZvcm0uZ2V0Qm9keSgpLCBTV1QuTlVMTCk7Ci0JCWloLnNldFRleHQoIkltYWdlIGxpbmsgd2l0aCBubyBpbWFnZSIpOwotCQlpaCA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoZm9ybS5nZXRCb2R5KCksIFNXVC5OVUxMKTsKLQkJaWguc2V0SW1hZ2UoRXhhbXBsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoRXhhbXBsZXNQbHVnaW4uSU1HX1NBTVBMRSkpOwotCQlpaC5zZXRUZXh0KCJMaW5rIHdpdGggaW1hZ2UgYW5kIHRleHQiKTsKLQkJCi0JCUV4cGFuZGFibGVDb21wb3NpdGUgZWMgPSB0b29sa2l0LmNyZWF0ZUV4cGFuZGFibGVDb21wb3NpdGUoZm9ybS5nZXRCb2R5KCksIEV4cGFuZGFibGVDb21wb3NpdGUuVFJFRV9OT0RFfEV4cGFuZGFibGVDb21wb3NpdGUuQ0xJRU5UX0lOREVOVCk7Ci0JCUltYWdlSHlwZXJsaW5rIGVjaSA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoZWMsIFNXVC5OVUxMKTsKLQkJZWNpLnNldEltYWdlKEV4YW1wbGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KEV4YW1wbGVzUGx1Z2luLklNR19TQU1QTEUpKTsKLQkJZWMuc2V0VGV4dENsaWVudChlY2kpOwotCQllYy5zZXRUZXh0KCJFeHBhbmRhYmxlIENvbXBvc2l0ZSB0aXRsZSIpOwotCQlTdHJpbmcgY3RleHQgPSAiV2Ugd2lsbCBub3cgY3JlYXRlIGEgc29tZXdoYXQgbG9uZyB0ZXh0IHNvIHRoYXQgIisKLQkJIndlIGNhbiB1c2UgaXQgYXMgY29udGVudCBmb3IgdGhlIGV4cGFuZGFibGUgY29tcG9zaXRlLiAiKwotCQkiRXhwYW5kYWJsZSBjb21wb3NpdGUgaXMgdXNlZCB0byBoaWRlIG9yIHNob3cgdGhlIHRleHQgdXNpbmcgdGhlICIrCi0JCSJ0b2dnbGUgY29udHJvbCI7Ci0JCUxhYmVsIGNsaWVudCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZWMsIGN0ZXh0LCBTV1QuV1JBUCk7Ci0JCWVjLnNldENsaWVudChjbGllbnQpOwotCQl0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKCk7Ci0JCXRkLmNvbHNwYW4gPSAyOwotCQllYy5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZWMuYWRkRXhwYW5zaW9uTGlzdGVuZXIobmV3IEV4cGFuc2lvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5nZWQoRXhwYW5zaW9uRXZlbnQgZSkgewotCQkJCWZvcm0ucmVmbG93KHRydWUpOwotCQkJfQotCQl9KTsKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLCBTZWN0aW9uLkRFU0NSSVBUSU9OfFNlY3Rpb24uVFdJU1RJRXxTZWN0aW9uLkVYUEFOREVEKTsKLQkJdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTEwpOwotCQl0ZC5jb2xzcGFuID0gMjsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJc2VjdGlvbi5hZGRFeHBhbnNpb25MaXN0ZW5lcihuZXcgRXhwYW5zaW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdlZChFeHBhbnNpb25FdmVudCBlKSB7Ci0JCQkJZm9ybS5yZWZsb3codHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQlzZWN0aW9uLnNldFRleHQoIlNlY3Rpb24gdGl0bGUiKTsKLQkJdG9vbGtpdC5jcmVhdGVDb21wb3NpdGVTZXBhcmF0b3Ioc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIHRoYXQgZ29lcyBiZWxvdyB0aGUgdGl0bGUiKTsKLQkJQ29tcG9zaXRlIHNlY3Rpb25DbGllbnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJc2VjdGlvbkNsaWVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHNlY3Rpb25DbGllbnQsICJSYWRpbyAxIiwgU1dULlJBRElPKTsKLQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oc2VjdGlvbkNsaWVudCwgIlJhZGlvIDIiLCBTV1QuUkFESU8pOwotCQlzZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ2xpZW50KTsKLQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCI8Zm9ybT4iKTsKLQkJYnVmLmFwcGVuZCgiPHA+Iik7Ci0JCWJ1Zi5hcHBlbmQoIkhlcmUgaXMgc29tZSBwbGFpbiB0ZXh0IGZvciB0aGUgdGV4dCB0byByZW5kZXI7ICIpOwotCQlidWYuYXBwZW5kKCJ0aGlzIHRleHQgaXMgYXQgPGEgaHJlZj1cImh0dHA6Ly93d3cuZWNsaXBzZS5vcmdcIiBub3dyYXA9XCJ0cnVlXCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4gd2ViIHNpdGUuIik7Ci0JCWJ1Zi5hcHBlbmQoIjwvcD4iKTsKLQkJYnVmLmFwcGVuZCgiPHA+Iik7Ci0JCWJ1Zi5hcHBlbmQoIjxzcGFuIGNvbG9yPVwiaGVhZGVyXCIgZm9udD1cImhlYWRlclwiPlRoaXMgdGV4dCBpcyBpbiBoZWFkZXIgZm9udCBhbmQgY29sb3IuPC9zcGFuPiIpOwotCQlidWYuYXBwZW5kKCI8L3A+Iik7Ci0JCWJ1Zi5hcHBlbmQoIjxwPlRoaXMgbGluZSB3aWxsIGNvbnRhaW4gc29tZSA8Yj5ib2xkPC9iPiBhbmQgc29tZSA8c3BhbiBmb250PVwiY29kZVwiPnNvdXJjZTwvc3Bhbj4gdGV4dC4gIik7Ci0JCWJ1Zi5hcHBlbmQoIldlIGNhbiBhbHNvIGFkZCA8aW1nIGhyZWY9XCJpbWFnZVwiLz4gYW4gaW1hZ2UuICIpOwotCQlidWYuYXBwZW5kKCI8L3A+Iik7Ci0JCWJ1Zi5hcHBlbmQoIjxsaT5BIGRlZmF1bHQgKGJ1bGxldGVkKSBsaXN0IGl0ZW0uPC9saT4iKTsKLQkJYnVmLmFwcGVuZCgiPGxpPkFub3RoZXIgYnVsbGV0IGxpc3QgaXRlbS48L2xpPiIpOwotCQlidWYuYXBwZW5kKCI8bGkgc3R5bGU9XCJ0ZXh0XCIgdmFsdWU9XCIxLlwiPkEgbGlzdCBpdGVtIHdpdGggdGV4dC48L2xpPiIpOwotCQlidWYuYXBwZW5kKCI8bGkgc3R5bGU9XCJ0ZXh0XCIgdmFsdWU9XCIyLlwiPkFub3RoZXIgbGlzdCBpdGVtIHdpdGggdGV4dDwvbGk+Iik7Ci0JCWJ1Zi5hcHBlbmQoIjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCJpbWFnZVwiPkxpc3QgaXRlbSB3aXRoIGFuIGltYWdlIGJ1bGxldDwvbGk+Iik7Ci0JCWJ1Zi5hcHBlbmQoIjxsaSBzdHlsZT1cInRleHRcIiBiaW5kZW50PVwiMjBcIiBpbmRlbnQ9XCI0MFwiIHZhbHVlPVwiMy5cIj5BIGxpc3QgaXRlbSB3aXRoIHRleHQuPC9saT4iKTsKLQkJYnVmLmFwcGVuZCgiPGxpIHN0eWxlPVwidGV4dFwiIGJpbmRlbnQ9XCIyMFwiIGluZGVudD1cIjQwXCIgdmFsdWU9XCI0LlwiPkEgbGlzdCBpdGVtIHdpdGggdGV4dC48L2xpPiIpOwotCQlidWYuYXBwZW5kKCI8cD4gICAgIGxlYWRpbmcgYmxhbmtzOyAgICAgIG1vcmUgd2hpdGUgXG5cbiBuZXcgbGluZXMgICA8YnIvPjxici8+PGJyLz4gXG4gbW9yZSA8Yj4gICBiYiAgIDwvYj4gIHdoaXRlICAuIDwvcD4iKTsKLQkJYnVmLmFwcGVuZCgiPC9mb3JtPiIpOwotCQlGb3JtVGV4dCBydGV4dCA9IHRvb2xraXQuY3JlYXRlRm9ybVRleHQoZm9ybS5nZXRCb2R5KCksIGZhbHNlKTsKLQkJLy9ydGV4dC5zZXRXaGl0ZXNwYWNlTm9ybWFsaXplZChmYWxzZSk7Ci0JCXRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMKTsKLQkJdGQuY29sc3BhbiA9IDI7Ci0JCXJ0ZXh0LnNldExheW91dERhdGEodGQpOwotCQlydGV4dC5zZXRJbWFnZSgiaW1hZ2UiLCBFeGFtcGxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChFeGFtcGxlc1BsdWdpbi5JTUdfU0FNUExFKSk7Ci0JCXJ0ZXh0LnNldENvbG9yKCJoZWFkZXIiLCB0b29sa2l0LmdldENvbG9ycygpLmdldENvbG9yKEZvcm1Db2xvcnMuVElUTEUpKTsKLQkJcnRleHQuc2V0Rm9udCgiaGVhZGVyIiwgSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpKTsKLQkJcnRleHQuc2V0Rm9udCgiY29kZSIsIEpGYWNlUmVzb3VyY2VzLmdldFRleHRGb250KCkpOwotCQlydGV4dC5zZXRUZXh0KGJ1Zi50b1N0cmluZygpLCB0cnVlLCBmYWxzZSk7Ci0JCXJ0ZXh0LmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMaW5rIGFjdGl2ZTogIitlLmdldEhyZWYoKSk7Ci0JCQl9Ci0JCX0pOwotLyoJCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJTGFiZWwgbGFiZWw7Ci0JCVRhYmxlV3JhcERhdGEgdGQ7Ci0JCQotCQlsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZm9ybS5nZXRCb2R5KCksICJTb21lIHRleHQgdG8gcHV0IGluIHRoZSBmaXJzdCBjb2x1bW4iLCBTV1QuV1JBUCk7Ci0JCWxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChmb3JtLmdldEJvZHkoKSAsIlNvbWUgdGV4dCB0byBwdXQgaW4gdGhlIHNlY29uZCBjb2x1bW4gYW5kIG1ha2UgaXQgYSBiaXQgbG9uZ2VyIHNvIHRoYXQgd2UgY2FuIHNlZSB3aGF0IGhhcHBlbnMgd2l0aCBjb2x1bW4gZGlzdHJpYnV0aW9uLiBUaGlzIHRleHQgbXVzdCBiZSB0aGUgbG9uZ2VzdCBzbyB0aGF0IGl0IGNhbiBnZXQgbW9yZSBzcGFjZSBhbGxvY2F0ZWQgdG8gdGhlIGNvbHVtbnMgaXQgYmVsb25ncyB0by4iLCBTV1QuV1JBUCk7Ci0JCXRkID0gbmV3IFRhYmxlV3JhcERhdGEoKTsKLQkJdGQuY29sc3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEodGQpOwotCQlsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZm9ybS5nZXRCb2R5KCksICJUaGlzIHRleHQgd2lsbCBzcGFuIHR3byByb3dzIGFuZCBzaG91bGQgbm90IGdyb3cgdGhlIGNvbHVtbi4iLCBTV1QuV1JBUCk7Ci0JCXRkID0gbmV3IFRhYmxlV3JhcERhdGEoKTsKLQkJdGQucm93c3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEodGQpOwotCQlsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZm9ybS5nZXRCb2R5KCksICJUaGlzIHRleHQgZ29lcyBpbnRvIGNvbHVtbiAyIGFuZCBjb25zdW1lcyBvbmx5IG9uZSBjZWxsIiwgU1dULldSQVApOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCWxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChmb3JtLmdldEJvZHkoKSwgIlRoaXMgdGV4dCBnb2VzIGludG8gY29sdW1uIDMgYW5kIGNvbnN1bWVzIG9ubHkgb25lIGNlbGwgdG9vIiwgU1dULldSQVApOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTCkpOwotCQlsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZm9ybS5nZXRCb2R5KCksICJUaGlzIHRleHQgZ29lcyBpbnRvIGNvbHVtbiAyIGFuZCBjb25zdW1lcyBvbmx5IG9uZSBjZWxsIiwgU1dULldSQVApOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCWxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChmb3JtLmdldEJvZHkoKSwgIlRoaXMgdGV4dCBnb2VzIGludG8gY29sdW1uIDMgYW5kIGNvbnN1bWVzIG9ubHkgb25lIGNlbGwgdG9vIiwgU1dULldSQVApOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTCkpOwotCQlmb3JtLmdldEJvZHkoKS5zZXRCYWNrZ3JvdW5kKGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsqLwotCQkKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZm9ybS5nZXRCb2R5KCkpOwotCX0KLQkvKioKLQkgKiBQYXNzaW5nIHRoZSBmb2N1cyByZXF1ZXN0IHRvIHRoZSBmb3JtLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlDb250cm9sIGZvY3VzQ29udHJvbCA9IGZvcm0uZ2V0RGlzcGxheSgpLmdldEZvY3VzQ29udHJvbCgpOwotCQlpZiAoZm9jdXNDb250cm9sIT1udWxsKSB7Ci0JCQlDb21wb3NpdGUgcGFyZW50ID0gZm9jdXNDb250cm9sLmdldFBhcmVudCgpOwotCQkJd2hpbGUgKHBhcmVudCE9bnVsbCkgewotCQkJCWlmIChwYXJlbnQ9PWZvcm0pIHsKLQkJCQkJLy8gYWxyZWFkeSBoYXZlIGZvY3VzCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotCQkJfQotCQl9Ci0JCWZvcm0uc2V0Rm9jdXMoKTsKLQl9Ci0JLyoqCi0JICogRGlzcG9zZXMgdGhlIHRvb2xraXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0b29sa2l0LmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS51aS5mb3Jtcy5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdWkvZm9ybXMvZXhhbXBsZXMvdmlld3MvU2hvd0hlbHBBY3Rpb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy92aWV3cy9TaG93SGVscEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGE5YjEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91aS9mb3Jtcy9leGFtcGxlcy92aWV3cy9TaG93SGVscEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDQsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV4YW1wbGVzLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFNob3dIZWxwQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkuZm9ybXMuZXhhbXBsZXMuaGVscFZpZXciKTsKLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTVkZTQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDgxNjY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0jVGh1IE9jdCAyNyAxMTo0OToxNiBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnRhc2tDYXNlU2Vuc2l0aXZlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnRhc2tQcmlvcml0aWVzPU5PUk1BTCxISUdILE5PUk1BTAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIudGFza1RhZ3M9VE9ETyxGSVhNRSxYWFgKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9jb21tZW50cz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZWJmYmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUaHUgT2N0IDI3IDExOjQ5OjE3IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249OAotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPXVzZXIKLW9yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCi1vcmcuZWNsaXBzZS5qZHQudWkuZ2V0dGVyc2V0dGVyLnVzZS5pcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO2NvbTsKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD05OQotb3JnLmVjbGlwc2UuamR0LnVpLm92ZXJyaWRlYW5ub3RhdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyY29tbWVudCIgbmFtZVw9ImdldHRlcmNvbW1lbnQiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgY29udGV4dFw9ImdldHRlcmNvbW1lbnRfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPi8qKlxyXG4gKiBAcmV0dXJuIFJldHVybnMgdGhlICR7YmFyZV9maWVsZF9uYW1lfS5cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmNvbW1lbnQiIG5hbWVcPSJzZXR0ZXJjb21tZW50IiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGNvbnRleHRcPSJzZXR0ZXJjb21tZW50X2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4vKipcclxuICogQHBhcmFtICR7cGFyYW19IFRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0LlxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50IiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBjb250ZXh0XD0iY29uc3RydWN0b3Jjb21tZW50X2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4vKipcclxuICogJHt0YWdzfVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBlbmFibGVkXD0idHJ1ZSIgZGVsZXRlZFw9ImZhbHNlIiBhdXRvaW5zZXJ0XD0idHJ1ZSI+LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogQ29weXJpZ2h0IChjKSAke3llYXJ9IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXHJcbiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxyXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxyXG4gKiBodHRwXDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcclxuICpcclxuICogQ29udHJpYnV0b3JzXDpcclxuICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMudHlwZWNvbW1lbnQiIG5hbWVcPSJ0eXBlY29tbWVudCIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIHR5cGVzIiBjb250ZXh0XD0idHlwZWNvbW1lbnRfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9ImZhbHNlIj4vKipcclxuICogQHNpbmNlIDMuMlxyXG4gKlxyXG4gKiAke3RhZ3N9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWVsZGNvbW1lbnQiIG5hbWVcPSJmaWVsZGNvbW1lbnQiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4vKipcclxuICogXHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBub24tb3ZlcnJpZGluZyBtZXRob2RzIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBlbmFibGVkXD0idHJ1ZSIgZGVsZXRlZFw9ImZhbHNlIiBhdXRvaW5zZXJ0XD0idHJ1ZSI+LyoqXHJcbiAqICR7dGFnc31cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGNvbnRleHRcPSJvdmVycmlkZWNvbW1lbnRfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPi8qIChub24tSmF2YWRvYylcclxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm5ld3R5cGUiIG5hbWVcPSJuZXd0eXBlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGNvbnRleHRcPSJuZXd0eXBlX2NvbnRleHQiIGVuYWJsZWRcPSJ0cnVlIiBkZWxldGVkXD0iZmFsc2UiIGF1dG9pbnNlcnRcPSJ0cnVlIj4ke2ZpbGVjb21tZW50fVxyXG4ke3BhY2thZ2VfZGVjbGFyYXRpb259XHJcblxyXG4ke3R5cGVjb21tZW50fVxyXG4ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNhdGNoYmxvY2siIG5hbWVcPSJjYXRjaGJsb2NrIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcclxuJHtleGNlcHRpb25fdmFyfS5wcmludFN0YWNrVHJhY2UoKTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIG1ldGhvZCBzdHVicyIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcclxuJHtib2R5X3N0YXRlbWVudH08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5IiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgY29udGV4dFw9ImNvbnN0cnVjdG9yYm9keV9jb250ZXh0IiBlbmFibGVkXD0idHJ1ZSIgZGVsZXRlZFw9ImZhbHNlIiBhdXRvaW5zZXJ0XD0idHJ1ZSI+JHtib2R5X3N0YXRlbWVudH1cclxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5IiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBjb250ZXh0XD0iZ2V0dGVyYm9keV9jb250ZXh0IiBlbmFibGVkXD0idHJ1ZSIgZGVsZXRlZFw9ImZhbHNlIiBhdXRvaW5zZXJ0XD0idHJ1ZSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgY29udGV4dFw9InNldHRlcmJvZHlfY29udGV4dCIgZW5hYmxlZFw9InRydWUiIGRlbGV0ZWRcPSJmYWxzZSIgYXV0b2luc2VydFw9InRydWUiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwOTI3Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1R1ZSBPY3QgMTggMTE6MzU6MDIgRURUIDIwMDUKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MAotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTEKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkZGMxMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZwotQnVuZGxlLVZlcnNpb246IDMuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogamZhY2ViaW5kaW5ndGVzdHMuamFyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZywKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2Uuc3d0LAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZwotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLnV0aWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjcxZjVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuamZhY2ViaW5kaW5ndGVzdHMuamFyID0gc3JjLwotICAgICAgICAgICAgICAgCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1vdXRwdXQuamZhY2ViaW5kaW5ndGVzdHMuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgKi5odG1sLFwKLSAgICAgICAgICAgICAgIGpmYWNlYmluZGluZ3Rlc3RzLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4YWNmYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBKRmFjZSBEYXRhIEJpbmRpbmcgVGVzdHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvQmluZGluZ1Rlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL0JpbmRpbmdUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY1NzE0Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvQmluZGluZ1Rlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcuc2NlbmFyaW9zLkJpbmRpbmdTY2VuYXJpb3NUZXN0U3VpdGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1Rlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgQmluZGluZ1Rlc3RTdWl0ZSgpOwotCX0KLQotCXB1YmxpYyBCaW5kaW5nVGVzdFN1aXRlKCkgewotCQlhZGRUZXN0U3VpdGUoVXBkYXRhYmxlVGVzdC5jbGFzcyk7Ci0JCWFkZFRlc3RTdWl0ZShKYXZhQmVhbnNTY2FsYXJVcGRhdGFibGVWYWx1ZUZhY3RvcnlUZXN0LmNsYXNzKTsKLQkJYWRkVGVzdFN1aXRlKERhdGFiaW5kaW5nQ29udGV4dFRlc3QuY2xhc3MpOwotCQlhZGRUZXN0KEJpbmRpbmdTY2VuYXJpb3NUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL0RhdGFiaW5kaW5nQ29udGV4dFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9EYXRhYmluZGluZ0NvbnRleHRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNGZkNjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL0RhdGFiaW5kaW5nQ29udGV4dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkJpbmRTcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkJpbmRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuRGF0YUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSURhdGFCaW5kaW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5OZXN0ZWRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5VcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXIuSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXJzLklkZW50aXR5Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnVwZGF0YWJsZXMuU2V0dGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy51dGlsLk1vY2tzOwotCi1wdWJsaWMgY2xhc3MgRGF0YWJpbmRpbmdDb250ZXh0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCWJvb2xlYW4gZmFpbGVkID0gZmFsc2U7Ci0KLQlJRGF0YUJpbmRpbmdDb250ZXh0IGRiYzsKLQotCUlVcGRhdGFibGVWYWx1ZSB1cGRhdGFibGVWYWx1ZVJNb2NrOwotCi0JSVZhbGlkYXRvciB2YWxpZGF0b3JNb2NrOwotCi0JU2V0dGFibGVWYWx1ZSBzZXR0YWJsZVZhbHVlMTsKLQotCVNldHRhYmxlVmFsdWUgc2V0dGFibGVWYWx1ZTI7Ci0KLQlPYmplY3QgbzEgPSBuZXcgT2JqZWN0KCk7Ci0KLQlPYmplY3QgbzIgPSBuZXcgT2JqZWN0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBJQ29udmVydGVyIGlkZW50aXR5Q29udmVydGVyID0gbmV3IElkZW50aXR5Q29udmVydGVyKE9iamVjdC5jbGFzcyk7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJZGJjID0gRGF0YUJpbmRpbmcuY3JlYXRlQ29udGV4dChuZXcgSVVwZGF0YWJsZUZhY3RvcnlbMF0pOwotCQl1cGRhdGFibGVWYWx1ZVJNb2NrID0gKElVcGRhdGFibGVWYWx1ZSkgTW9ja3MKLQkJCQkuY3JlYXRlUmVsYXhlZE1vY2soSVVwZGF0YWJsZVZhbHVlLmNsYXNzKTsKLQkJdmFsaWRhdG9yTW9jayA9IChJVmFsaWRhdG9yKSBNb2Nrcy5jcmVhdGVNb2NrKElWYWxpZGF0b3IuY2xhc3MpOwotCQlzZXR0YWJsZVZhbHVlMSA9IG5ldyBTZXR0YWJsZVZhbHVlKE9iamVjdC5jbGFzcyk7Ci0JCXNldHRhYmxlVmFsdWUyID0gbmV3IFNldHRhYmxlVmFsdWUoT2JqZWN0LmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoIWZhaWxlZCkgewotCQkJTW9ja3MudmVyaWZ5KHVwZGF0YWJsZVZhbHVlUk1vY2spOwotCQkJTW9ja3MudmVyaWZ5KHZhbGlkYXRvck1vY2spOwotCQl9Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0cnkgewotCQkJc3VwZXIucnVuVGVzdCgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdGgpIHsKLQkJCWZhaWxlZCA9IHRydWU7Ci0JCQl0aHJvdyB0aDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCaW5kVmFsdWVNb2RlbCgpIHsKLQkJTW9ja3MucmVzZXQodXBkYXRhYmxlVmFsdWVSTW9jayk7Ci0JCXVwZGF0YWJsZVZhbHVlUk1vY2suYWRkQ2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCXVwZGF0YWJsZVZhbHVlUk1vY2suZ2V0VmFsdWUoKTsKLQkJdXBkYXRhYmxlVmFsdWVSTW9jay5nZXRWYWx1ZVR5cGUoKTsKLQkJTW9ja3Muc2V0TGFzdFJldHVyblZhbHVlKHVwZGF0YWJsZVZhbHVlUk1vY2ssIE9iamVjdC5jbGFzcyk7Ci0JCXZhbGlkYXRvck1vY2suaXNWYWxpZChudWxsKTsKLQkJTW9ja3Muc3RhcnRDaGVja2luZyh1cGRhdGFibGVWYWx1ZVJNb2NrKTsKLQkJTW9ja3Muc3RhcnRDaGVja2luZyh2YWxpZGF0b3JNb2NrKTsKLQkJZGJjLmJpbmQoc2V0dGFibGVWYWx1ZTEsIHVwZGF0YWJsZVZhbHVlUk1vY2ssIG5ldyBCaW5kU3BlYygKLQkJCQlpZGVudGl0eUNvbnZlcnRlciwgdmFsaWRhdG9yTW9jaykpOwotCQlNb2Nrcy52ZXJpZnkodXBkYXRhYmxlVmFsdWVSTW9jayk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJpbmRWYWx1ZVRhcmdldCgpIHsKLQkJdXBkYXRhYmxlVmFsdWVSTW9jay5hZGRDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJdXBkYXRhYmxlVmFsdWVSTW9jay5zZXRWYWx1ZShudWxsKTsKLQkJdXBkYXRhYmxlVmFsdWVSTW9jay5nZXRWYWx1ZSgpOwotCQl1cGRhdGFibGVWYWx1ZVJNb2NrLmdldFZhbHVlVHlwZSgpOwotCQlNb2Nrcy5zZXRMYXN0UmV0dXJuVmFsdWUodXBkYXRhYmxlVmFsdWVSTW9jaywgT2JqZWN0LmNsYXNzKTsKLQkJdmFsaWRhdG9yTW9jay5pc1ZhbGlkKG51bGwpOwotCQlNb2Nrcy5zdGFydENoZWNraW5nKHVwZGF0YWJsZVZhbHVlUk1vY2spOwotCQlNb2Nrcy5zdGFydENoZWNraW5nKHZhbGlkYXRvck1vY2spOwotCQlkYmMuYmluZCh1cGRhdGFibGVWYWx1ZVJNb2NrLCBzZXR0YWJsZVZhbHVlMiwgbmV3IEJpbmRTcGVjKAotCQkJCWlkZW50aXR5Q29udmVydGVyLCB2YWxpZGF0b3JNb2NrKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJpbmRWYWx1ZVByb3BhZ2F0aW9uKCkgewotCQlzZXR0YWJsZVZhbHVlMS5zZXRWYWx1ZShvMSk7Ci0JCXNldHRhYmxlVmFsdWUyLnNldFZhbHVlKG8yKTsKLQkJZGJjLmJpbmQoc2V0dGFibGVWYWx1ZTEsIHNldHRhYmxlVmFsdWUyLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG8yLCBzZXR0YWJsZVZhbHVlMS5nZXRWYWx1ZSgpKTsKLQkJc2V0dGFibGVWYWx1ZTEuc2V0VmFsdWUobzEpOwotCQlhc3NlcnRFcXVhbHMobzEsIHNldHRhYmxlVmFsdWUyLmdldFZhbHVlKCkpOwotCQlzZXR0YWJsZVZhbHVlMi5zZXRWYWx1ZShvMik7Ci0JCWFzc2VydEVxdWFscyhvMiwgc2V0dGFibGVWYWx1ZTEuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVOZXN0ZWRVcGRhdGFibGVXaXRoQXJyYXlzKCkgewotCQlTdHJpbmcgcGFyZW50T2JqZWN0ID0gIiI7Ci0JCU5lc3RlZFByb3BlcnR5IG5lc3RlZFByb3BlcnR5ID0gbmV3IE5lc3RlZFByb3BlcnR5KHBhcmVudE9iamVjdCwgbmV3IFN0cmluZ1tdIHsibmVzdGVkQ2hpbGQxIiwgIm5lc3RlZENoaWxkMiIsICJmb28ifSwgbmV3IENsYXNzW10ge0ludGVnZXIuY2xhc3MsIFN0cmluZy5jbGFzcywgRmxvYXQuY2xhc3N9KTsKLQkJSURhdGFCaW5kaW5nQ29udGV4dCBjdHggPSBEYXRhQmluZGluZy5jcmVhdGVDb250ZXh0KG5ldyBJVXBkYXRhYmxlRmFjdG9yeVtdIHtuZXcgTW9ja1VwZGF0YWJsZUZhY3RvcnkoKX0pOwotCQlNb2NrVXBkYXRhYmxlVmFsdWUgdXBkYXRhYmxlVmFsdWUgPSAoTW9ja1VwZGF0YWJsZVZhbHVlKSBjdHguY3JlYXRlTmVzdGVkVXBkYXRhYmxlKG5lc3RlZFByb3BlcnR5KTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgY2hpbGQgSVVwZGF0YWJsZSBkb2VzIG5vdCBoYXZlIHRoZSByaWdodCBnZXR0ZXIuIiwgImZvbyIsIHVwZGF0YWJsZVZhbHVlLmdldERlc2NyaXB0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBjaGlsZCBJVXBkYXRhYmxlIGRvZXMgbm90IGhhdmUgdGhlIHJpZ2h0IHR5cGUuIiwgRmxvYXQuY2xhc3MsIHVwZGF0YWJsZVZhbHVlLmdldFR5cGUoKSk7Ci0KLQkJdXBkYXRhYmxlVmFsdWUgPSAoKE1vY2tVcGRhdGFibGVWYWx1ZSkgdXBkYXRhYmxlVmFsdWUuZ2V0VGFyZ2V0T2JqZWN0KCkpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBjaGlsZCBJVXBkYXRhYmxlIGRvZXMgbm90IGhhdmUgdGhlIHJpZ2h0IGdldHRlci4iLCAibmVzdGVkQ2hpbGQyIiwgdXBkYXRhYmxlVmFsdWUuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIGNoaWxkIElVcGRhdGFibGUgZG9lcyBub3QgaGF2ZSB0aGUgcmlnaHQgdHlwZS4iLCBTdHJpbmcuY2xhc3MsIHVwZGF0YWJsZVZhbHVlLmdldFR5cGUoKSk7Ci0JCi0JCXVwZGF0YWJsZVZhbHVlID0gKChNb2NrVXBkYXRhYmxlVmFsdWUpIHVwZGF0YWJsZVZhbHVlLmdldFRhcmdldE9iamVjdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgY2hpbGQgSVVwZGF0YWJsZSBkb2VzIG5vdCBoYXZlIHRoZSByaWdodCBnZXR0ZXIuIiwgIm5lc3RlZENoaWxkMSIsIHVwZGF0YWJsZVZhbHVlLmdldERlc2NyaXB0aW9uKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgY2hpbGQgSVVwZGF0YWJsZSBkb2VzIG5vdCBoYXZlIGEgY29ycmVjdCBwYXJlbnQgdGFyZ2V0IG9iamVjdC4iLCBwYXJlbnRPYmplY3QsIHVwZGF0YWJsZVZhbHVlLmdldFRhcmdldE9iamVjdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgY2hpbGQgSVVwZGF0YWJsZSBkb2VzIG5vdCBoYXZlIHRoZSByaWdodCB0eXBlLiIsIEludGVnZXIuY2xhc3MsIHVwZGF0YWJsZVZhbHVlLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVOZXN0ZWRVcGRhdGFibGVXaXRoUHJvdG90eXBlQ2xhc3MoKSB7Ci0JCVN0cmluZyBwYXJlbnRPYmplY3QgPSAiIjsKLQkJTmVzdGVkUHJvcGVydHkgbmVzdGVkUHJvcGVydHkgPSBuZXcgTmVzdGVkUHJvcGVydHkocGFyZW50T2JqZWN0LCAibmVzdGVkQ2hpbGQxLm5lc3RlZENoaWxkMi5mb28iLCBOZXN0ZWRQYXJlbnQuY2xhc3MpOwotCQlJRGF0YUJpbmRpbmdDb250ZXh0IGN0eCA9IERhdGFCaW5kaW5nLmNyZWF0ZUNvbnRleHQobmV3IElVcGRhdGFibGVGYWN0b3J5W10ge25ldyBNb2NrVXBkYXRhYmxlRmFjdG9yeSgpfSk7Ci0JCU1vY2tVcGRhdGFibGVWYWx1ZSB1cGRhdGFibGVWYWx1ZSA9IChNb2NrVXBkYXRhYmxlVmFsdWUpIGN0eC5jcmVhdGVOZXN0ZWRVcGRhdGFibGUobmVzdGVkUHJvcGVydHkpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBjaGlsZCBJVXBkYXRhYmxlIGRvZXMgbm90IGhhdmUgdGhlIHJpZ2h0IGdldHRlci4iLCAiZm9vIiwgdXBkYXRhYmxlVmFsdWUuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIGNoaWxkIElVcGRhdGFibGUgZG9lcyBub3QgaGF2ZSB0aGUgcmlnaHQgdHlwZS4iLCBTdHJpbmcuY2xhc3MsIHVwZGF0YWJsZVZhbHVlLmdldFR5cGUoKSk7Ci0KLQkJdXBkYXRhYmxlVmFsdWUgPSAoKE1vY2tVcGRhdGFibGVWYWx1ZSkgdXBkYXRhYmxlVmFsdWUuZ2V0VGFyZ2V0T2JqZWN0KCkpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBjaGlsZCBJVXBkYXRhYmxlIGRvZXMgbm90IGhhdmUgdGhlIHJpZ2h0IGdldHRlci4iLCAibmVzdGVkQ2hpbGQyIiwgdXBkYXRhYmxlVmFsdWUuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIGNoaWxkIElVcGRhdGFibGUgZG9lcyBub3QgaGF2ZSB0aGUgcmlnaHQgdHlwZS4iLCBOZXN0ZWRDaGlsZDIuY2xhc3MsIHVwZGF0YWJsZVZhbHVlLmdldFR5cGUoKSk7Ci0JCi0JCXVwZGF0YWJsZVZhbHVlID0gKChNb2NrVXBkYXRhYmxlVmFsdWUpIHVwZGF0YWJsZVZhbHVlLmdldFRhcmdldE9iamVjdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgY2hpbGQgSVVwZGF0YWJsZSBkb2VzIG5vdCBoYXZlIHRoZSByaWdodCBnZXR0ZXIuIiwgIm5lc3RlZENoaWxkMSIsIHVwZGF0YWJsZVZhbHVlLmdldERlc2NyaXB0aW9uKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgY2hpbGQgSVVwZGF0YWJsZSBkb2VzIG5vdCBoYXZlIGEgY29ycmVjdCBwYXJlbnQgdGFyZ2V0IG9iamVjdC4iLCBwYXJlbnRPYmplY3QsIHVwZGF0YWJsZVZhbHVlLmdldFRhcmdldE9iamVjdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgY2hpbGQgSVVwZGF0YWJsZSBkb2VzIG5vdCBoYXZlIHRoZSByaWdodCB0eXBlLiIsIE5lc3RlZENoaWxkMS5jbGFzcywgdXBkYXRhYmxlVmFsdWUuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU5lc3RlZFVwZGF0YWJsZVdpdGhQcm90b3R5cGVDbGFzc0FuZEludmFsaWRQYXRoKCkgewotCQlTdHJpbmcgcGFyZW50T2JqZWN0ID0gIiI7Ci0JCU5lc3RlZFByb3BlcnR5IG5lc3RlZFByb3BlcnR5ID0gbmV3IE5lc3RlZFByb3BlcnR5KHBhcmVudE9iamVjdCwgIm5lc3RlZENoaWxkMS5uZXN0ZWRDaGlsZDMuZm9vIiwgTmVzdGVkUGFyZW50LmNsYXNzKTsKLQkJdHJ5IHsKLQkJCUlEYXRhQmluZGluZ0NvbnRleHQgY3R4ID0gRGF0YUJpbmRpbmcuY3JlYXRlQ29udGV4dChuZXcgSVVwZGF0YWJsZUZhY3RvcnlbXSB7bmV3IE1vY2tVcGRhdGFibGVGYWN0b3J5KCl9KTsKLQkJCU1vY2tVcGRhdGFibGVWYWx1ZSB1cGRhdGFibGVWYWx1ZSA9IChNb2NrVXBkYXRhYmxlVmFsdWUpIGN0eC5jcmVhdGVOZXN0ZWRVcGRhdGFibGUobmVzdGVkUHJvcGVydHkpOwotCQkJZmFpbCgiRXhwZWN0ZWQgYmluZGluZyBleGNlcHRpb24uIik7Ci0JCX0gY2F0Y2ggKEJpbmRpbmdFeGNlcHRpb24gYmUpIHsJCQkKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBNb2NrVXBkYXRhYmxlRmFjdG9yeSBpbXBsZW1lbnRzIElVcGRhdGFibGVGYWN0b3J5IHsKLQotCQlwdWJsaWMgSVVwZGF0YWJsZSBjcmVhdGVVcGRhdGFibGUoTWFwIHByb3BlcnRpZXMsIE9iamVjdCBkZXNjcmlwdGlvbiwgSURhdGFCaW5kaW5nQ29udGV4dCBiaW5kaW5nQ29udGV4dCkgewotCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpIGRlc2NyaXB0aW9uOwotCQkJcmV0dXJuIG5ldyBNb2NrVXBkYXRhYmxlVmFsdWUocHJvcGVydHkuZ2V0T2JqZWN0KCksIHByb3BlcnR5LmdldFByb3BlcnR5SUQoKSwgcHJvcGVydHkuZ2V0UHJvcGVydHlUeXBlKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBNb2NrVXBkYXRhYmxlVmFsdWUgZXh0ZW5kcyBVcGRhdGFibGVWYWx1ZSB7Ci0JCXB1YmxpYyBPYmplY3QgdGFyZ2V0T2JqZWN0OwotCQlwdWJsaWMgT2JqZWN0IGRlc2NyaXB0aW9uOwotCQlwcml2YXRlIENsYXNzIHR5cGU7Ci0JCQotCQlwdWJsaWMgTW9ja1VwZGF0YWJsZVZhbHVlKE9iamVjdCB0YXJnZXRPYmplY3QsIE9iamVjdCBkZXNjcmlwdGlvbiwgQ2xhc3MgdHlwZSkgewotCQkJc3VwZXIoKTsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCQkJdGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0KLQkJcHVibGljIENsYXNzIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0T2JqZWN0KCkgewotCQkJcmV0dXJuIHRhcmdldE9iamVjdDsKLQkJfQotCi0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBOZXN0ZWRQYXJlbnQgewotCQlwdWJsaWMgTmVzdGVkQ2hpbGQxIGdldE5lc3RlZENoaWxkMSgpIHsKLQkJCXJldHVybiBuZXcgTmVzdGVkQ2hpbGQxKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE5lc3RlZENoaWxkMSB7Ci0JCXB1YmxpYyBOZXN0ZWRDaGlsZDIgZ2V0TmVzdGVkQ2hpbGQyKCkgewotCQkJcmV0dXJuIG5ldyBOZXN0ZWRDaGlsZDIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgTmVzdGVkQ2hpbGQyIHsKLQkJcHVibGljIFN0cmluZyBnZXRGb28oKSB7Ci0JCQlyZXR1cm4gImZvbyI7Ci0JCX0KLQl9CQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL0phdmFCZWFuc1NjYWxhclVwZGF0YWJsZVZhbHVlRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9KYXZhQmVhbnNTY2FsYXJVcGRhdGFibGVWYWx1ZUZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NmExZmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL0phdmFCZWFuc1NjYWxhclVwZGF0YWJsZVZhbHVlRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5EYXRhQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JRGF0YUJpbmRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5KYXZhQmVhbnNTY2FsYXJVcGRhdGFibGVWYWx1ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuUHJvcGVydHk7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQmVhbnNTY2FsYXJVcGRhdGFibGVWYWx1ZUZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgCi0gICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RCZWFuIHsKLSAgICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkID0gIkhlbGxvLCB3b3JsZCI7Ci0KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGQoKSB7Ci0gICAgICAgICByZXR1cm4gZmllbGQ7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkKFN0cmluZyBmaWVsZCkgewotICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwotICAgICAgfQotICAgfQotICAgCi0gICBwdWJsaWMgdm9pZCB0ZXN0X2dldFVwZGF0YWJsZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICBUZXN0QmVhbiB0ZXN0ID0gbmV3IFRlc3RCZWFuKCk7Ci0gICAgICAKLSAgICAgIElEYXRhQmluZGluZ0NvbnRleHQgZGJjID0gRGF0YUJpbmRpbmcuY3JlYXRlQ29udGV4dChuZXcgSVVwZGF0YWJsZUZhY3RvcnlbXSB7Ci0gICAgICAgICAgICAgIG5ldyBKYXZhQmVhbnNTY2FsYXJVcGRhdGFibGVWYWx1ZUZhY3RvcnkoKQotICAgICAgICB9KTsKLSAgICAgIElVcGRhdGFibGVWYWx1ZSB1cGRhdGFibGUgPSAoSVVwZGF0YWJsZVZhbHVlKSBkYmMuY3JlYXRlVXBkYXRhYmxlKG5ldyBQcm9wZXJ0eSh0ZXN0LCAiZmllbGQiKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvLCB3b3JsZCIsIHVwZGF0YWJsZS5nZXRWYWx1ZSgpKTsKLSAgIH0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL1VwZGF0YWJsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9VcGRhdGFibGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMzhkMTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL1VwZGF0YWJsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy51dGlsLk1vY2tzOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRhYmxlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE15VXBkYXRhYmxlIGV4dGVuZHMgVXBkYXRhYmxlIHsKLQkJcHVibGljIHZvaWQgZmlyZUNoYW5nZShpbnQgY2hhbmdlVHlwZSwgT2JqZWN0IG9sZFZhbHVlLAotCQkJCU9iamVjdCBuZXdWYWx1ZSwgaW50IHBvc2l0aW9uKSB7Ci0JCQlmaXJlQ2hhbmdlRXZlbnQoY2hhbmdlVHlwZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3NpdGlvbik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmaXJlQ2hhbmdlKGludCBjaGFuZ2VUeXBlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJZmlyZUNoYW5nZUV2ZW50KGNoYW5nZVR5cGUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE15VXBkYXRhYmxlIHVwZGF0YWJsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXVwZGF0YWJsZSA9IG5ldyBNeVVwZGF0YWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh1cGRhdGFibGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl1cGRhdGFibGUuZGlzcG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJdXBkYXRhYmxlID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQkvKgotCSAqIFRlc3QgbWV0aG9kIGZvcgotCSAqICdvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5VcGRhdGFibGUuYWRkQ2hhbmdlTGlzdGVuZXIoSUNoYW5nZUxpc3RlbmVyKScKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCUlDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lck1vY2sgPSAoSUNoYW5nZUxpc3RlbmVyKSBNb2NrcwotCQkJCS5jcmVhdGVPcmRlcmVkTW9jayhJQ2hhbmdlTGlzdGVuZXIuY2xhc3MpOwotCi0JCS8vIHRlc3RpbmcgdGhhdCBubyBtZXRob2RzIG9uIHRoZSB1cGRhdGFibGUgYXJlIGNhbGxlZCB3aGVuIGFkZGluZyB0aGUKLQkJLy8gY2hhbmdlIGxpc3RlbmVyCi0JCU1vY2tzLnN0YXJ0Q2hlY2tpbmcoY2hhbmdlTGlzdGVuZXJNb2NrKTsKLQkJdXBkYXRhYmxlLmFkZENoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyTW9jayk7Ci0KLQkJLy8gdGVzdGluZyB0aGF0IGhhbmRsZUNoYW5nZSBpcyBhY3R1YWxseSBjYWxsZWQKLQkJTW9ja3MucmVzZXQoY2hhbmdlTGlzdGVuZXJNb2NrKTsKLQkJY2hhbmdlTGlzdGVuZXJNb2NrLmhhbmRsZUNoYW5nZShudWxsKTsKLQkJY2hhbmdlTGlzdGVuZXJNb2NrLmhhbmRsZUNoYW5nZShudWxsKTsKLQkJTW9ja3Muc3RhcnRDaGVja2luZyhjaGFuZ2VMaXN0ZW5lck1vY2spOwotCQl1cGRhdGFibGUuZmlyZUNoYW5nZSgwLCBudWxsLCBudWxsLCAwKTsKLQkJdXBkYXRhYmxlLmZpcmVDaGFuZ2UoMCwgbnVsbCwgbnVsbCwgMCk7Ci0JCU1vY2tzLnZlcmlmeShjaGFuZ2VMaXN0ZW5lck1vY2spOwotCi0JCS8vIHRlc3RpbmcgdGhhdCBoYW5kbGVDaGFuZ2UgaXMgY2FsbGVkIGp1c3Qgb25jZQotCQlNb2Nrcy5yZXNldChjaGFuZ2VMaXN0ZW5lck1vY2spOwotCQljaGFuZ2VMaXN0ZW5lck1vY2suaGFuZGxlQ2hhbmdlKG51bGwpOwotCQlNb2Nrcy5zdGFydENoZWNraW5nKGNoYW5nZUxpc3RlbmVyTW9jayk7Ci0JCXVwZGF0YWJsZS5hZGRDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lck1vY2spOwotCQl1cGRhdGFibGUuZmlyZUNoYW5nZSgwLCBudWxsLCBudWxsLCAwKTsKLQkJTW9ja3MudmVyaWZ5KGNoYW5nZUxpc3RlbmVyTW9jayk7Ci0JfQotCi0JLyoKLQkgKiBUZXN0IG1ldGhvZCBmb3IKLQkgKiAnb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuVXBkYXRhYmxlLnJlbW92ZUNoYW5nZUxpc3RlbmVyKElDaGFuZ2VMaXN0ZW5lciknCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlJQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXJNb2NrID0gKElDaGFuZ2VMaXN0ZW5lcikgTW9ja3MKLQkJCQkuY3JlYXRlT3JkZXJlZE1vY2soSUNoYW5nZUxpc3RlbmVyLmNsYXNzKTsKLQotCQkvLyB0ZXN0aW5nIHRoYXQgbm8gbWV0aG9kcyBvbiB0aGUgdXBkYXRhYmxlIGFyZSBjYWxsZWQgd2hlbiByZW1vdmluZyB0aGUKLQkJLy8gY2hhbmdlIGxpc3RlbmVyCi0JCU1vY2tzLnN0YXJ0Q2hlY2tpbmcoY2hhbmdlTGlzdGVuZXJNb2NrKTsKLQkJdXBkYXRhYmxlLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyTW9jayk7Ci0KLQkJLy8gdGVzdGluZyB0aGF0IG5vIG1ldGhvZHMgb24gdGhlIHVwZGF0YWJsZSBhcmUgY2FsbGVkIGFmdGVyIGFkZGluZyBhbmQKLQkJLy8gcmVtb3ZpbmcgdGhlIGNoYW5nZSBsaXN0ZW5lcgotCQl1cGRhdGFibGUuYWRkQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXJNb2NrKTsKLQkJdXBkYXRhYmxlLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyTW9jayk7Ci0KLQkJdXBkYXRhYmxlLmZpcmVDaGFuZ2UoMCwgbnVsbCwgbnVsbCwgMCk7Ci0JfQotCi0JLyoKLQkgKiBUZXN0IG1ldGhvZCBmb3IgJ29yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlVwZGF0YWJsZS5maXJlQ2hhbmdlRXZlbnQoaW50LAotCSAqIE9iamVjdCwgT2JqZWN0KScKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNoYW5nZUV2ZW50KCkgewotCQlJQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXJNb2NrID0gKElDaGFuZ2VMaXN0ZW5lcikgTW9ja3MKLQkJCQkuY3JlYXRlTW9jayhJQ2hhbmdlTGlzdGVuZXIuY2xhc3MsCi0JCQkJCQluZXcgTW9ja3MuRXF1YWxpdHlDb21wYXJhdG9yKCkgewotCQkJCQkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQkJCQlDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudDEgPSAoQ2hhbmdlRXZlbnQpIG8xOwotCQkJCQkJCQlDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudDIgPSAoQ2hhbmdlRXZlbnQpIG8yOwotCQkJCQkJCQlyZXR1cm4gY2hhbmdlRXZlbnQxLmdldENoYW5nZVR5cGUoKSA9PSBjaGFuZ2VFdmVudDIKLQkJCQkJCQkJCQkuZ2V0Q2hhbmdlVHlwZSgpCi0JCQkJCQkJCQkJJiYgY2hhbmdlRXZlbnQxLmdldFBvc2l0aW9uKCkgPT0gY2hhbmdlRXZlbnQyCi0JCQkJCQkJCQkJCQkuZ2V0UG9zaXRpb24oKQotCQkJCQkJCQkJCSYmIGNoYW5nZUV2ZW50MS5nZXRPbGRWYWx1ZSgpID09IGNoYW5nZUV2ZW50MgotCQkJCQkJCQkJCQkJLmdldE9sZFZhbHVlKCkKLQkJCQkJCQkJCQkmJiBjaGFuZ2VFdmVudDEuZ2V0TmV3VmFsdWUoKSA9PSBjaGFuZ2VFdmVudDIKLQkJCQkJCQkJCQkJCS5nZXROZXdWYWx1ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQl1cGRhdGFibGUuYWRkQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXJNb2NrKTsKLQotCQlPYmplY3QgbzEgPSBuZXcgT2JqZWN0KCk7Ci0JCU9iamVjdCBvMiA9IG5ldyBPYmplY3QoKTsKLQotCQljaGFuZ2VMaXN0ZW5lck1vY2suaGFuZGxlQ2hhbmdlKG5ldyBDaGFuZ2VFdmVudCh1cGRhdGFibGUsIDAsIG51bGwsCi0JCQkJbnVsbCwgQ2hhbmdlRXZlbnQuUE9TSVRJT05fVU5LTk9XTikpOwotCQljaGFuZ2VMaXN0ZW5lck1vY2suaGFuZGxlQ2hhbmdlKG5ldyBDaGFuZ2VFdmVudCh1cGRhdGFibGUsIDAsIG51bGwsCi0JCQkJbnVsbCwgMSkpOwotCQljaGFuZ2VMaXN0ZW5lck1vY2suaGFuZGxlQ2hhbmdlKG5ldyBDaGFuZ2VFdmVudCh1cGRhdGFibGUsCi0JCQkJQ2hhbmdlRXZlbnQuQ0hBTkdFLCBvMSwgbzIsIENoYW5nZUV2ZW50LlBPU0lUSU9OX1VOS05PV04pKTsKLQkJY2hhbmdlTGlzdGVuZXJNb2NrLmhhbmRsZUNoYW5nZShuZXcgQ2hhbmdlRXZlbnQodXBkYXRhYmxlLAotCQkJCUNoYW5nZUV2ZW50LkNIQU5HRSwgbzEsIG8yLCA0MikpOwotCQlNb2Nrcy5zdGFydENoZWNraW5nKGNoYW5nZUxpc3RlbmVyTW9jayk7Ci0JCXVwZGF0YWJsZS5maXJlQ2hhbmdlKDAsIG51bGwsIG51bGwpOwotCQl1cGRhdGFibGUuZmlyZUNoYW5nZSgwLCBudWxsLCBudWxsLCAxKTsKLQkJdXBkYXRhYmxlLmZpcmVDaGFuZ2UoQ2hhbmdlRXZlbnQuQ0hBTkdFLCBvMSwgbzIpOwotCQl1cGRhdGFibGUuZmlyZUNoYW5nZShDaGFuZ2VFdmVudC5DSEFOR0UsIG8xLCBvMiwgNDIpOwotCQlNb2Nrcy52ZXJpZnkoY2hhbmdlTGlzdGVuZXJNb2NrKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvQXV0b21hdGlvblV0aWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvQXV0b21hdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1ODc5MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvc2NlbmFyaW9zL0F1dG9tYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcuc2NlbmFyaW9zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLQotLyoqCi0gKiBDT1BJRUQgRlJPTSBvcmcuZWNsaXBzZS51aS50ZXN0cwotICogPGNvZGU+QXV0b21hdGlvblV0aWw8L2NvZGU+IGNvbnRhaW5zIHV0aWxpdHkgbWV0aG9kcyB0byBtaW1pYyBrZXkgZXZlbnRzLgotICogTW91c2UgZXZlbnQgbWV0aG9kcyBjYW4gYmUgYWRkZWQgaWYgbmVlZGVkIHRvIGNvbXBsZXRlIHRoaXMgY2xhc3MuCi0gKi8KLQotcHVibGljIGNsYXNzIEF1dG9tYXRpb25VdGlsIHsKLQotCS8qKgotCSAqIE1ldGhvZCB0byBtaW1pYyBhIGtleSBjb2RlIGV2ZW50IG9uIGEgZGlzcGxheS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheQotCSAqICAgICAgICAgICAgVGhlIGRpc3BsYXkuCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgVGhlIGV2ZW50IHR5cGUuCi0JICogQHBhcmFtIGtleUNvZGUKLQkgKiAgICAgICAgICAgIFRoZSBrZXkgY29kZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGVyZm9ybUtleUNvZGVFdmVudChEaXNwbGF5IGRpc3BsYXksIGludCBldmVudFR5cGUsCi0JCQlpbnQga2V5Q29kZSkgewotCQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCQlldmVudC50eXBlID0gZXZlbnRUeXBlOwotCQlldmVudC5rZXlDb2RlID0ga2V5Q29kZTsKLQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gbWltaWMgYSBjaGFyYWN0ZXIgZXZlbnQgb24gYSBkaXNwbGF5LgotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5Ci0JICogICAgICAgICAgICBUaGUgZGlzcGxheS4KLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICBUaGUgZXZlbnQgdHlwZS4KLQkgKiBAcGFyYW0gY2hhcmFjdGVyCi0JICogICAgICAgICAgICBUaGUgY2hhcmFjdGVyIHRvIG1pbWljLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwZXJmb3JtQ2hhcmFjdGVyRXZlbnQoRGlzcGxheSBkaXNwbGF5LCBpbnQgZXZlbnRUeXBlLAotCQkJY2hhciBjaGFyYWN0ZXIpIHsKLQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IGV2ZW50VHlwZTsKLQkJZXZlbnQuY2hhcmFjdGVyID0gY2hhcmFjdGVyOwotCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvQmluZGluZ1NjZW5hcmlvc1Rlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9CaW5kaW5nU2NlbmFyaW9zVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MWRmNGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9CaW5kaW5nU2NlbmFyaW9zVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcuc2NlbmFyaW9zOwotCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVG8gcnVuIHRoaXMgdGVzdCBzdWl0ZSwgcmlnaHQtY2xpY2sgYW5kIHNlbGVjdCAiUnVuIEFzIEpVbml0IFBsdWctaW4gVGVzdCIuCi0gKiBUaGlzIHdpbGwgYWxzbyBzdGFydCBhbiBFY2xpcHNlIGluc3RhbmNlLiBUbyBjbGVhbiB1cCB0aGUgbGF1bmNoCi0gKiBjb25maWd1cmF0aW9uLCBvcGVuIHVwIGl0cyAiTWFpbiIgdGFiIGFuZCBzZWxlY3QgIltObyBBcHBsaWNhdGlvbl0gLSBIZWFkbGVzcwotICogTW9kZSIgYXMgdGhlIGFwcGxpY2F0aW9uIHRvIHJ1bi4gWW91IGNhbiBhbHNvIHJ1biB0aGlzIGNsYXNzIGFzIGFuIFNXVAotICogYXBwbGljYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nU2NlbmFyaW9zVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJanVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERpc3BsYXkgZGlzcGxheTsKLQotCXByaXZhdGUgc3RhdGljIFNoZWxsIHNoZWxsOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTZXR1cChuZXcgQmluZGluZ1NjZW5hcmlvc1Rlc3RTdWl0ZSgpKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQkJCURpc3BsYXkgZCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJCWlmIChkID09IG51bGwpIHsKLQkJCQkJZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCQkJCWQgPSBkaXNwbGF5OwotCQkJCX0KLQkJCQlzaGVsbCA9IG5ldyBTaGVsbChkLCBTV1QuU0hFTExfVFJJTSk7Ci0JCQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJCWlmIChkaXNwbGF5ICE9IG51bGwpIHsKLQkJCQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBCaW5kaW5nU2NlbmFyaW9zVGVzdFN1aXRlKCkgewotCQlhZGRUZXN0U3VpdGUoVXBkYXRhYmxlRmFjdG9yaWVzVGVzdC5jbGFzcyk7Ci0JCWFkZFRlc3RTdWl0ZShQcm9wZXJ0eVNjZW5hcmlvcy5jbGFzcyk7Ci0JCWFkZFRlc3RTdWl0ZShDdXN0b21TY2VuYXJpb3MuY2xhc3MpOwotCQlhZGRUZXN0U3VpdGUoQ3VzdG9tQ29udmVydGVyU2NlbmFyaW9zLmNsYXNzKTsKLQkJYWRkVGVzdFN1aXRlKE1hc3RlckRldGFpbFNjZW5hcmlvcy5jbGFzcyk7Ci0JCWFkZFRlc3RTdWl0ZShSZWFkT25seUNvbWJvU2NlbmFyaW9zLmNsYXNzKTsKLQkJYWRkVGVzdFN1aXRlKFRhYmxlU2NlbmFyaW9zLmNsYXNzKTsKLQkJYWRkVGVzdFN1aXRlKFRyZWVTY2VuYXJpb3MuY2xhc3MpOwotCQkvLyBUZXN0IGVhY2ggb2YgdGhlIGJhc2ljIFNXVCBjb250cm9scwotCQlhZGRUZXN0U3VpdGUoVGV4dENvbnRyb2xTY2VuYXJpby5jbGFzcyk7Ci0JCWFkZFRlc3RTdWl0ZShTcGlubmVyQ29udHJvbFNjZW5hcmlvLmNsYXNzKTsJCi0JCWFkZFRlc3RTdWl0ZShCdXR0b25Db250cm9sU2NlbmFyaW8uY2xhc3MpOwkJCi0JCS8vIFRlc3QgZWFjaCBvZiB0aGUgYmFzaWMgSkZhY2UgY29udHJvbHMKLQkJYWRkVGVzdFN1aXRlKENvbWJvVmlld2VyU2NlbmFyaW8uY2xhc3MpOwkJCi0JCWFkZFRlc3RTdWl0ZShMaXN0Vmlld2VyU2NlbmFyaW8uY2xhc3MpOwkJCi0JfQotCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9CdXR0b25Db250cm9sU2NlbmFyaW8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvQnV0dG9uQ29udHJvbFNjZW5hcmlvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZTNiNzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9CdXR0b25Db250cm9sU2NlbmFyaW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcuc2NlbmFyaW9zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQWR2ZW50dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsLlNhbXBsZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci0KLS8qKgotICogVG8gcnVuIHRoZSB0ZXN0cyBpbiB0aGlzIGNsYXNzLCByaWdodC1jbGljayBhbmQgc2VsZWN0ICJSdW4gQXMgSlVuaXQgUGx1Zy1pbgotICogVGVzdCIuIFRoaXMgd2lsbCBhbHNvIHN0YXJ0IGFuIEVjbGlwc2UgaW5zdGFuY2UuIFRvIGNsZWFuIHVwIHRoZSBsYXVuY2gKLSAqIGNvbmZpZ3VyYXRpb24sIG9wZW4gdXAgaXRzICJNYWluIiB0YWIgYW5kIHNlbGVjdCAiW05vIEFwcGxpY2F0aW9uXSAtIEhlYWRsZXNzCi0gKiBNb2RlIiBhcyB0aGUgYXBwbGljYXRpb24gdG8gcnVuLgotICovCi0KLXB1YmxpYyBjbGFzcyBCdXR0b25Db250cm9sU2NlbmFyaW8gZXh0ZW5kcyBTY2VuYXJpb3NUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEFkdmVudHVyZSBhZHZlbnR1cmU7Ci0JcHJpdmF0ZSBCdXR0b24gYnV0dG9uOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy8gZG8gYW55IHNldHVwIHdvcmsgaGVyZQotCQlidXR0b24gPSBuZXcgQnV0dG9uKGdldENvbXBvc2l0ZSgpLCBTV1QuQ0hFQ0spOwkJCi0JCWFkdmVudHVyZSA9IFNhbXBsZURhdGEuV0lOVEVSX0hPTElEQVk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnV0dG9uLmRpc3Bvc2UoKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8wMSgpIHsKLQkJLy8gQmluZCB0aGUgYnV0dG9uJ3Mgc2VsZWN0aW9uIHRvIHRoZSBhZHZlbnR1cmUgImlzUGV0c0FsbG93ZWQiCi0JCWdldERiYygpLmJpbmQoYnV0dG9uLCBuZXcgUHJvcGVydHkoYWR2ZW50dXJlLCAicGV0c0FsbG93ZWQiKSxudWxsKTsKLQkJLy8gQ2hlY2sgdGhlIG1vZGVsIGFuZCBHVUkgYXJlIGluIHRoZSBzYW1lIHN0YXRlCi0JCWFzc2VydEVxdWFscyhidXR0b24uZ2V0U2VsZWN0aW9uKCksYWR2ZW50dXJlLmlzUGV0c0FsbG93ZWQoKSk7Ci0JCS8vIENoYW5nZSB0aGUgbW9kZWwgYW5kIGNoZWNrIHRoZSBHVUkgaXMgdXBkYXRlZAotCQlib29sZWFuIG5ld0Jvb2xlYW4gPSAhYWR2ZW50dXJlLmlzUGV0c0FsbG93ZWQoKTsKLQkJYWR2ZW50dXJlLnNldFBldHNBbGxvd2VkKG5ld0Jvb2xlYW4pOwotCQlhc3NlcnRFcXVhbHMobmV3Qm9vbGVhbixhZHZlbnR1cmUuaXNQZXRzQWxsb3dlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSxuZXdCb29sZWFuKTsKLQkJLy8gQ2hhbmdlIHRoZSBHVUkgYW5kIGNoZWNrIHRoZSBtb2RlbAotCQluZXdCb29sZWFuID0gIW5ld0Jvb2xlYW47Ci0JCWJ1dHRvbi5zZXRTZWxlY3Rpb24obmV3Qm9vbGVhbik7Ci0JCWJ1dHRvbi5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbixudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0Jvb2xlYW4sYWR2ZW50dXJlLmlzUGV0c0FsbG93ZWQoKSk7Ci0JCS8vIFZlcmlmeSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1vZGVsIGNhbiBvY2N1ciBpbiBhIG5vbiBVSSB0aHJlYWQKLQkJbmV3Qm9vbGVhbiA9ICFuZXdCb29sZWFuOwotCQlmaW5hbCBib29sZWFuIGZpbmFsTmV3Qm9vbGVhbiA9IG5ld0Jvb2xlYW47Ci0JCWludm9rZU5vblVJKG5ldyBSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQkJYWR2ZW50dXJlLnNldFBldHNBbGxvd2VkKGZpbmFsTmV3Qm9vbGVhbik7Ci0JCQl9Ci0JCX0pOwotCQlzcGluRXZlbnRMb29wKDApOwotCQlhc3NlcnRFcXVhbHMobmV3Qm9vbGVhbixidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMDIoKSB7Ci0JCS8vIFRlc3Qgd2l0aCBhbiBTV1QuVG9nZ2xlIGJ1dHRvbgotCQlidXR0b24uZGlzcG9zZSgpOwotCQlidXR0b24gPSBuZXcgQnV0dG9uKGdldENvbXBvc2l0ZSgpLCBTV1QuVE9HR0xFKTsJCQkKLQkJLy8gQmluZCB0aGUgYnV0dG9uJ3Mgc2VsZWN0aW9uIHRvIHRoZSBhZHZlbnR1cmUgImlzUGV0c0FsbG93ZWQiCi0JCWdldERiYygpLmJpbmQoYnV0dG9uLCBuZXcgUHJvcGVydHkoYWR2ZW50dXJlLCAicGV0c0FsbG93ZWQiKSxudWxsKTsKLQkJLy8gQ2hlY2sgdGhlIG1vZGVsIGFuZCBHVUkgYXJlIGluIHRoZSBzYW1lIHN0YXRlCi0JCWFzc2VydEVxdWFscyhidXR0b24uZ2V0U2VsZWN0aW9uKCksYWR2ZW50dXJlLmlzUGV0c0FsbG93ZWQoKSk7Ci0JCS8vIENoYW5nZSB0aGUgbW9kZWwgYW5kIGNoZWNrIHRoZSBHVUkgaXMgdXBkYXRlZAotCQlib29sZWFuIG5ld0Jvb2xlYW4gPSAhYWR2ZW50dXJlLmlzUGV0c0FsbG93ZWQoKTsKLQkJYWR2ZW50dXJlLnNldFBldHNBbGxvd2VkKG5ld0Jvb2xlYW4pOwotCQlhc3NlcnRFcXVhbHMobmV3Qm9vbGVhbixhZHZlbnR1cmUuaXNQZXRzQWxsb3dlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSxuZXdCb29sZWFuKTsKLQkJLy8gQ2hhbmdlIHRoZSBHVUkgYW5kIGNoZWNrIHRoZSBtb2RlbAotCQluZXdCb29sZWFuID0gIW5ld0Jvb2xlYW47Ci0JCWJ1dHRvbi5zZXRTZWxlY3Rpb24obmV3Qm9vbGVhbik7Ci0JCWJ1dHRvbi5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbixudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0Jvb2xlYW4sYWR2ZW50dXJlLmlzUGV0c0FsbG93ZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzAzKCkgewotCQkvLyBUZXN0IHdpdGggYW4gU1dULlJhZGlvIGJ1dHRvbgotCQlidXR0b24uZGlzcG9zZSgpOwotCQlidXR0b24gPSBuZXcgQnV0dG9uKGdldENvbXBvc2l0ZSgpLCBTV1QuUkFESU8pOwotCQkvLyBCaW5kIHRoZSBidXR0b24ncyBzZWxlY3Rpb24gdG8gdGhlIGFkdmVudHVyZSAiaXNQZXRzQWxsb3dlZCIKLQkJZ2V0RGJjKCkuYmluZChidXR0b24sIG5ldyBQcm9wZXJ0eShhZHZlbnR1cmUsICJwZXRzQWxsb3dlZCIpLG51bGwpOwotCQkvLyBDaGVjayB0aGUgbW9kZWwgYW5kIEdVSSBhcmUgaW4gdGhlIHNhbWUgc3RhdGUKLQkJYXNzZXJ0RXF1YWxzKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSxhZHZlbnR1cmUuaXNQZXRzQWxsb3dlZCgpKTsKLQkJLy8gQ2hhbmdlIHRoZSBtb2RlbCBhbmQgY2hlY2sgdGhlIEdVSSBpcyB1cGRhdGVkCi0JCWJvb2xlYW4gbmV3Qm9vbGVhbiA9ICFhZHZlbnR1cmUuaXNQZXRzQWxsb3dlZCgpOwotCQlhZHZlbnR1cmUuc2V0UGV0c0FsbG93ZWQobmV3Qm9vbGVhbik7Ci0JCWFzc2VydEVxdWFscyhuZXdCb29sZWFuLGFkdmVudHVyZS5pc1BldHNBbGxvd2VkKCkpOwotCQlhc3NlcnRFcXVhbHMoYnV0dG9uLmdldFNlbGVjdGlvbigpLG5ld0Jvb2xlYW4pOwotCQkvLyBDaGFuZ2UgdGhlIEdVSSBhbmQgY2hlY2sgdGhlIG1vZGVsCi0JCW5ld0Jvb2xlYW4gPSAhbmV3Qm9vbGVhbjsKLQkJYnV0dG9uLnNldFNlbGVjdGlvbihuZXdCb29sZWFuKTsKLQkJYnV0dG9uLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLG51bGwpOwotCQlhc3NlcnRFcXVhbHMobmV3Qm9vbGVhbixhZHZlbnR1cmUuaXNQZXRzQWxsb3dlZCgpKTsKLQl9CQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvQ29tYm9WaWV3ZXJTY2VuYXJpby5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9Db21ib1ZpZXdlclNjZW5hcmlvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MTIxM2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9Db21ib1ZpZXdlclNjZW5hcmlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcuc2NlbmFyaW9zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2Vycy5WaWV3ZXJzUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5BZHZlbnR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5TYW1wbGVEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotCi0vKioKLSAqIFRvIHJ1biB0aGUgdGVzdHMgaW4gdGhpcyBjbGFzcywgcmlnaHQtY2xpY2sgYW5kIHNlbGVjdCAiUnVuIEFzIEpVbml0IFBsdWctaW4KLSAqIFRlc3QiLiBUaGlzIHdpbGwgYWxzbyBzdGFydCBhbiBFY2xpcHNlIGluc3RhbmNlLiBUbyBjbGVhbiB1cCB0aGUgbGF1bmNoCi0gKiBjb25maWd1cmF0aW9uLCBvcGVuIHVwIGl0cyAiTWFpbiIgdGFiIGFuZCBzZWxlY3QgIltObyBBcHBsaWNhdGlvbl0gLSBIZWFkbGVzcwotICogTW9kZSIgYXMgdGhlIGFwcGxpY2F0aW9uIHRvIHJ1bi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29tYm9WaWV3ZXJTY2VuYXJpbyBleHRlbmRzIFNjZW5hcmlvc1Rlc3RDYXNlIHsKLQotCXByaXZhdGUgQ2F0YWxvZyBjYXRhbG9nOwotCXByaXZhdGUgQ29tYm8gY29tYm87Ci0JcHJpdmF0ZSBDb21ib1ZpZXdlciBjb21ib1ZpZXdlcjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCS8vIGRvIGFueSBzZXR1cCB3b3JrIGhlcmUKLQkJY29tYm8gPSBuZXcgQ29tYm8oZ2V0Q29tcG9zaXRlKCksIFNXVC5SRUFEX09OTFkgfCBTV1QuRFJPUF9ET1dOKTsKLQkJY29tYm9WaWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tYm8pOwkJCi0JCWNhdGFsb2cgPSBTYW1wbGVEYXRhLkNBVEFMT0dfMjAwNTsgLy8gTG9kZ2luZyBzb3VyY2UJCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbWJvLmRpc3Bvc2UoKTsKLQkJY29tYm8gPSBudWxsOwotCQljb21ib1ZpZXdlciA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMDEoKSB7Ci0JCS8vIEJpbmQgdGhlIGNhdGFsb2cncyBsb2RnaW5ncyB0byB0aGUgY29tYm8KLQkJZ2V0RGJjKCkuYmluZCgKLQkJCQljb21ib1ZpZXdlciwgCi0JCQkJbmV3IFByb3BlcnR5KGNhdGFsb2csICJsb2RnaW5ncyIpLG51bGwpOwotCQkvLyBWZXJpZnkgdGhhdCB0aGUgY29tYm8ncyBpdGVtcyBhcmUgdGhlIGxvZGdpbmdzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0YWxvZy5nZXRMb2RnaW5ncygpLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoY2F0YWxvZy5nZXRMb2RnaW5ncygpW2ldLGNvbWJvVmlld2VyLmdldEVsZW1lbnRBdChpKSk7Ci0JCX0KLQkJLy8gVmVyaWZ5IHRoYXQgdGhlIFN0cmluZyBiZWluZyBzaG93biBpbiB0aGUgY29tYm8gdmlld2VyIGlzIHRoZSAidG9TdHJpbmciIG9mIHRoZSBjb21ibyB2aWV3ZXIKLQkJU3RyaW5nW10gbG9kZ2luZ1N0cmluZ3MgPSBuZXcgU3RyaW5nW2NhdGFsb2cuZ2V0TG9kZ2luZ3MoKS5sZW5ndGhdOwkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0YWxvZy5nZXRMb2RnaW5ncygpLmxlbmd0aDsgaSsrKSB7Ci0JCQlsb2RnaW5nU3RyaW5nc1tpXSA9IGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKVtpXS50b1N0cmluZygpOwotCQl9Ci0JCWFzc2VydEFycmF5RXF1YWxzKGxvZGdpbmdTdHJpbmdzLGNvbWJvLmdldEl0ZW1zKCkpOwotCQkKLQkJLy8gVmVyaWZ5IHRoYXQgdGhlIGNvbWJvIGhhcyBubyBzZWxlY3RlZCBpdGVtCi0JCWFzc2VydEVxdWFscyhudWxsLCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pY29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCi0JCS8vIE5vdyBiaW5kIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGNvbWJvIHRvIHRoZSAiZGVmYXVsdExvZGdpbmciIHByb3BlcnR5IG9mIGFuIGFkdmVudHVyZQotCQlmaW5hbCBBZHZlbnR1cmUgYWR2ZW50dXJlID0gU2FtcGxlRGF0YS5XSU5URVJfSE9MSURBWTsKLQkJZ2V0RGJjKCkuYmluZCgKLQkJCQluZXcgUHJvcGVydHkoY29tYm9WaWV3ZXIsVmlld2Vyc1Byb3BlcnRpZXMuU0lOR0xFX1NFTEVDVElPTiksCi0JCQkJbmV3IFByb3BlcnR5KGFkdmVudHVyZSwgImRlZmF1bHRMb2RnaW5nIiksCi0JCQkJbnVsbCk7Ci0JCQotCQkvLyBWZXJpZnkgdGhhdCB0aGUgY29tYm8gc2VsZWN0aW9uIGlzIHRoZSBkZWZhdWx0IGxvZGdpbmcKLQkJYXNzZXJ0RXF1YWxzKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pY29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpLGFkdmVudHVyZS5nZXREZWZhdWx0TG9kZ2luZygpKTsKLQkJCi0JCS8vIENoYW5nZSB0aGUgbW9kZWwgYW5kIHZlcmlmeSB0aGF0IHRoZSBjb21ibyBzZWxlY3Rpb24gY2hhbmdlcyAKLQkJYWR2ZW50dXJlLnNldERlZmF1bHRMb2RnaW5nKFNhbXBsZURhdGEuQ0FNUF9HUk9VTkQpOwotCQlhc3NlcnRFcXVhbHMoYWR2ZW50dXJlLmdldERlZmF1bHRMb2RnaW5nKCksU2FtcGxlRGF0YS5DQU1QX0dST1VORCk7Ci0JCWFzc2VydEVxdWFscygoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSxhZHZlbnR1cmUuZ2V0RGVmYXVsdExvZGdpbmcoKSk7CQkKLQkJCi0JCS8vIENoYW5nZSB0aGUgY29tYm8gc2VsZWN0aW9uIGFuZCB2ZXJpZnkgdGhhdCB0aGUgbW9kZWwgY2hhbmdlcwotCQljb21ib1ZpZXdlci5nZXRDb21ibygpLnNlbGVjdCgzKTsKLQkJYXNzZXJ0RXF1YWxzKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pY29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpLGFkdmVudHVyZS5nZXREZWZhdWx0TG9kZ2luZygpKTsKLQkJCi0JCS8vIENoYW5nZSB0aGUgbW9kZWwgb24gYSBub24tVUkgdGhyZWFkIGFuZCB2ZXJpZnkgdGhhdCB0aGUgY29tYm8gc2VsZWN0aW9uIGNoYW5nZXMKLQkJaW52b2tlTm9uVUkobmV3IFJ1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCQlhZHZlbnR1cmUuc2V0RGVmYXVsdExvZGdpbmcoU2FtcGxlRGF0YS5ZT1VUSF9IT1NURUwpOwotCQkJfQotCQl9KTsKLQkJc3BpbkV2ZW50TG9vcCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pY29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpLGFkdmVudHVyZS5nZXREZWZhdWx0TG9kZ2luZygpKTsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvQ3VzdG9tQ29udmVydGVyU2NlbmFyaW9zLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvc2NlbmFyaW9zL0N1c3RvbUNvbnZlcnRlclNjZW5hcmlvcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjYwZGQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvQ3VzdG9tQ29udmVydGVyU2NlbmFyaW9zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcuc2NlbmFyaW9zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuc3d0LlNXVFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQWR2ZW50dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsLlByaWNlTW9kZWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuU2FtcGxlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci0KLS8qKgotICogVG8gcnVuIHRoZSB0ZXN0cyBpbiB0aGlzIGNsYXNzLCByaWdodC1jbGljayBhbmQgc2VsZWN0ICJSdW4gQXMgSlVuaXQgUGx1Zy1pbgotICogVGVzdCIuIFRoaXMgd2lsbCBhbHNvIHN0YXJ0IGFuIEVjbGlwc2UgaW5zdGFuY2UuIFRvIGNsZWFuIHVwIHRoZSBsYXVuY2gKLSAqIGNvbmZpZ3VyYXRpb24sIG9wZW4gdXAgaXRzICJNYWluIiB0YWIgYW5kIHNlbGVjdCAiW05vIEFwcGxpY2F0aW9uXSAtIEhlYWRsZXNzCi0gKiBNb2RlIiBhcyB0aGUgYXBwbGljYXRpb24gdG8gcnVuLgotICovCi0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZXJ0ZXJTY2VuYXJpb3MgZXh0ZW5kcyBTY2VuYXJpb3NUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEFkdmVudHVyZSBza2lUcmlwOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJc2tpVHJpcCA9IFNhbXBsZURhdGEuV0lOVEVSX0hPTElEQVk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZG8gYW55IHRlYXJkb3duIHdvcmsgaGVyZQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzAxKCkgewotCi0JCVNwaW5uZXIgc3Bpbm5lcl9kb2xsYXJzID0gbmV3IFNwaW5uZXIoZ2V0Q29tcG9zaXRlKCksIFNXVC5OT05FKTsKLQkJc3Bpbm5lcl9kb2xsYXJzLnNldE1heGltdW0oMTAwMDApOwotCQlTcGlubmVyIHNwaW5uZXJfY2VudHMgPSBuZXcgU3Bpbm5lcihnZXRDb21wb3NpdGUoKSwgU1dULk5PTkUpOwotCQkKLQkJLy8gVGhlIHByaWNlIG9iamVjdCBpcyBhIGRvdWJsZSB3aGljaCBjb250YWlucyBib3RoIHRoZSBkb2xsYXJzIGFuZCBjZW50cwotCQkvLyBUbyBhbGxvdyB0aGlzIHRvIGJlIHdvcmtlZCBvbiB3aXRoIHR3byBzZXBhcmF0ZSBzcGlubmVyIGNvbnRyb2xzICh3aGljaCBnZXQgYW5kIHNldCBpbnQgdmFsdWVzKQotCQkvLyBhbiBpbnRlcm1lZGlhdGUgb2JqZWN0IGlzIHVzZWQKLQkJUHJpY2VNb2RlbE9iamVjdCBwcmljZU1vZGVsID0gbmV3IFByaWNlTW9kZWxPYmplY3QoKTsKLQkJZ2V0RGJjKCkuYmluZCgKLQkJCQluZXcgUHJvcGVydHkocHJpY2VNb2RlbCwicHJpY2UiKSwKLQkJCQluZXcgUHJvcGVydHkoc2tpVHJpcCwicHJpY2UiKSxudWxsKTsKLQotCQlnZXREYmMoKS5iaW5kKAotCQkJCW5ldyBQcm9wZXJ0eShzcGlubmVyX2RvbGxhcnMsCi0JCQkJCQlTV1RQcm9wZXJ0aWVzLlNFTEVDVElPTiksCi0JCQkJbmV3IFByb3BlcnR5KHByaWNlTW9kZWwsICJkb2xsYXJzIiksbnVsbCk7Ci0KLQkJZ2V0RGJjKCkuYmluZCgKLQkJCQluZXcgUHJvcGVydHkoc3Bpbm5lcl9jZW50cywKLQkJCQkJCVNXVFByb3BlcnRpZXMuU0VMRUNUSU9OKSwKLQkJCQluZXcgUHJvcGVydHkocHJpY2VNb2RlbCwgImNlbnRzIiksbnVsbCk7Ci0JCS8vIHNwaW5FdmVudExvb3AoMSk7Ci0JCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBzZWxlY3Rpb24gb24gdGhlIHNwaW5uZXJfZG9sbGFycyBtYXRjaGVzIHRoZQotCQkvLyBkb2xsYXJzIG9mIHRoZSBwcmljZQotCQlhc3NlcnRFcXVhbHMoc3Bpbm5lcl9kb2xsYXJzLmdldFNlbGVjdGlvbigpLCBuZXcgRG91YmxlKHNraVRyaXAKLQkJCQkuZ2V0UHJpY2UoKSkuaW50VmFsdWUoKSk7Ci0JCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBzZWxlY3Rpb24gb24gdGhlIHNwaW5uZXJfY2VudHMgbWF0Y2hlcyB0aGUgZG9sbGFycwotCQkvLyBvZiB0aGUgcHJpY2UKLQkJRG91YmxlIGRvdWJsZVByaWNlID0gbmV3IERvdWJsZShza2lUcmlwLmdldFByaWNlKCkpOwotCQlkb3VibGUgY2VudHMgPSAxMDAqZG91YmxlUHJpY2UuZG91YmxlVmFsdWUoKSAtIDEwMCpkb3VibGVQcmljZQotCQkJCS5pbnRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoc3Bpbm5lcl9jZW50cy5nZXRTZWxlY3Rpb24oKSwgKGludCkgY2VudHMpOwotCi0JCS8vIENoYW5nZSB0aGUgc2VsZWN0aW9uIG9uIHRoZSBzcGlubmVyX2RvbGxhcnMgdG8gYmUgJDUwIGFuZCBtYWtlIHN1cmUKLQkJLy8gdGhlIG1vZGVsIGlzIHVwZGF0ZWQgd2l0aCB0aGUgY2VudHMgaW5jbHVkZWQKLQkJc3Bpbm5lcl9kb2xsYXJzLnNldFNlbGVjdGlvbig1MCk7Ci0JCWRvdWJsZSBleHBlY3RlZFByaWNlID0gNTAgKyBjZW50cyAvIDEwMDsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJpY2UsIHNraVRyaXAuZ2V0UHJpY2UoKSwwLjAxKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHNlbGVjdGlvbiBvbiB0aGUgc3Bpbm5lcl9jZW50cyB0byBiZSAyNyBhbmQgbWFrZSBzdXJlIHRoZQotCQkvLyBtb2RlbCBpcyB1cGRhdGVkIHdpdGggdGhlIGRvbGxhcnMgaW5jbHVkZWQKLQkJc3Bpbm5lcl9jZW50cy5zZXRTZWxlY3Rpb24oMjcpOwotCQlhc3NlcnRFcXVhbHMoNTAuMjcsIHNraVRyaXAuZ2V0UHJpY2UoKSwwLjAxKTsKLQotCQkvLyBDaGFuZ2UgdGhlIG1vZGVsIHRvIGJlICQ2MC45OSBkb2xsYXJzIGFuZCBtYWtlIHN1cmUgdGhlCi0JCS8vIHNwaW5uZXJfZG9sbGFycyBpcyA2MCBhbmQgc3Bpbm5lcl9jZW50cyBpcyA5OQotCQlza2lUcmlwLnNldFByaWNlKDYwLjk5KTsKLQkJYXNzZXJ0RXF1YWxzKDYwLCBzcGlubmVyX2RvbGxhcnMuZ2V0U2VsZWN0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoOTksIHNwaW5uZXJfY2VudHMuZ2V0U2VsZWN0aW9uKCkpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvc2NlbmFyaW9zL0N1c3RvbVNjZW5hcmlvcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9DdXN0b21TY2VuYXJpb3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiZWM4My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvc2NlbmFyaW9zL0N1c3RvbVNjZW5hcmlvcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLnNjZW5hcmlvczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5BZHZlbnR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQWdncmVnYXRlVXBkYXRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuU2FtcGxlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVG8gcnVuIHRoZSB0ZXN0cyBpbiB0aGlzIGNsYXNzLCByaWdodC1jbGljayBhbmQgc2VsZWN0ICJSdW4gQXMgSlVuaXQgUGx1Zy1pbgotICogVGVzdCIuIFRoaXMgd2lsbCBhbHNvIHN0YXJ0IGFuIEVjbGlwc2UgaW5zdGFuY2UuIFRvIGNsZWFuIHVwIHRoZSBsYXVuY2gKLSAqIGNvbmZpZ3VyYXRpb24sIG9wZW4gdXAgaXRzICJNYWluIiB0YWIgYW5kIHNlbGVjdCAiW05vIEFwcGxpY2F0aW9uXSAtIEhlYWRsZXNzCi0gKiBNb2RlIiBhcyB0aGUgYXBwbGljYXRpb24gdG8gcnVuLgotICovCi0KLXB1YmxpYyBjbGFzcyBDdXN0b21TY2VuYXJpb3MgZXh0ZW5kcyBTY2VuYXJpb3NUZXN0Q2FzZSB7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkvLyBkbyBhbnkgc2V0dXAgd29yayBoZXJlCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZG8gYW55IHRlYXJkb3duIHdvcmsgaGVyZQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzAxKCkgewotCQkvLyBCaW5kaW5nIHRoZSBuYW1lIHByb3BlcnR5IG9mIGFuIEFkdmVudHVyZSBvYmplY3QgdG8gdGhlIGNvbnRlbnRzIG9mCi0JCS8vIFRleHQgY29udHJvbHMsIG5vIGNvbnZlcnNpb24sIG5vIHZhbGlkYXRpb24uCi0KLQkJQWR2ZW50dXJlIGFkdmVudHVyZSA9IFNhbXBsZURhdGEuV0lOVEVSX0hPTElEQVk7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGdldENvbXBvc2l0ZSgpLCBTV1QuQk9SREVSKTsKLQotCQlJVXBkYXRhYmxlVmFsdWUgZGVzY3JpcHRpb25VcGRhdGFibGUgPSAoSVVwZGF0YWJsZVZhbHVlKSBnZXREYmMoKQotCQkJCS5jcmVhdGVVcGRhdGFibGUobmV3IFByb3BlcnR5KGFkdmVudHVyZSwgImRlc2NyaXB0aW9uIikpOwotCQlJVXBkYXRhYmxlVmFsdWUgbmFtZVVwZGF0YWJsZSA9IChJVXBkYXRhYmxlVmFsdWUpIGdldERiYygpCi0JCQkJLmNyZWF0ZVVwZGF0YWJsZShuZXcgUHJvcGVydHkoYWR2ZW50dXJlLCAibmFtZSIpKTsKLQotCQlBZ2dyZWdhdGVVcGRhdGFibGVWYWx1ZSBjdXN0b21VcGRhdGFibGVfY29tbWEgPSBuZXcgQWdncmVnYXRlVXBkYXRhYmxlVmFsdWUoCi0JCQkJbmV3IElVcGRhdGFibGVWYWx1ZVtdIHsgZGVzY3JpcHRpb25VcGRhdGFibGUsIG5hbWVVcGRhdGFibGUgfSwKLQkJCQkiLCIpOwotCi0JCWdldERiYygpLmJpbmQoZ2V0RGJjKCkuY3JlYXRlVXBkYXRhYmxlKG5ldyBQcm9wZXJ0eSh0ZXh0LCAidGV4dCIpKSwKLQkJCQkJCQkJY3VzdG9tVXBkYXRhYmxlX2NvbW1hLCBudWxsKTsKLQkJLy8gc3BpbkV2ZW50TG9vcCgxKTsKLQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGRlc2NyaXB0aW9uIG9uIHRoZSBtb2RlbCBtYXRjaCB0aGUgd2lkZ2V0Ci0JCWFzc2VydEVxdWFscyhhZHZlbnR1cmUuZ2V0RGVzY3JpcHRpb24oKSArICIsIiArIGFkdmVudHVyZS5nZXROYW1lKCksCi0JCQkJdGV4dC5nZXRUZXh0KCkpOwotCi0JCS8vIENoYW5nZSB0aGUgd2lkZ2V0IHRvIG5ld0Rlc2NyaXB0aW9uLG5ld05hbWUgYW5kIGVuc3VyZSB0aGUgbW9kZWwgaXMKLQkJLy8gdXBkYXRlZAotCQl0ZXh0LnNldFRleHQoIm5ld0Rlc2NyaXB0aW9uLG5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdEZXNjcmlwdGlvbiIsIGFkdmVudHVyZS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgYWR2ZW50dXJlLmdldE5hbWUoKSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSBtb2RlbCB0byBuZXdEZXNjcmlwdGlvbl8wIGFuZCBuZXdOYW1lXzAgYW5kIGVuc3VyZSB0aGUgR1VJCi0JCS8vIGlzIHVwZGF0ZWQKLQkJYWR2ZW50dXJlLnNldERlc2NyaXB0aW9uKCJuZXdEZXNjcmlwdGlvbl8wIik7Ci0JCWFkdmVudHVyZS5zZXROYW1lKCJuZXdOYW1lXzAiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdEZXNjcmlwdGlvbl8wLG5ld05hbWVfMCIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCQkvLyBDaGFuZ2UgdGV4dCB0byBuZXdEZXNjcmlwdGlvbl8xIHdpdGggbm8gY29tbWEgYW5kIGVuc3VyZSB0aGUgbW9kZWwgaXMKLQkJLy8gdXBkYXRlZCBjb3JyZWN0bHkgd2l0aCBubyBuYW1lCi0JCXRleHQuc2V0VGV4dCgibmV3RGVzY3JpcHRpb25fMSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld0Rlc2NyaXB0aW9uXzEiLCBhZHZlbnR1cmUuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhZHZlbnR1cmUuZ2V0TmFtZSgpKTsKLQotCQkvLyBDaGFuZ2UgdGV4dCB0byBuZXdOYW1lIHdpdGggYSBwcmVjZWVkaW5nIGNvbW1hIGFuZCBlbnN1cmUgdGhlIG1vZGVsCi0JCS8vIGlzIHVwZGF0ZWQgY29ycmVjdGx5IHdpdGggbm8gZGVzY3JpcHRpb24KLQkJLy8gVE9ETyAtIEdldCB0aGlzIHRlc3Qgd29ya2luZyArIEFkZCB0aGUgb25lIHdoZXJlIHdlIGhhdmUgdHdvIGFnZ3JlZ2F0ZXMgYW5kIHVwZGF0ZSBvbmUgYW5kIAotCQkvLyBjaGVjayB0aGF0IHRoZSBvdGhlciBpcyB1cGRhdGVkIC0gY3VycmVudGx5IHRoaXMgZmFpbHMgb24gdGhlIEdVSSAtIEpSVwotLy8JCXRleHQuc2V0VGV4dCgiLG5ld05hbWVfMSIpOwotLy8JCWFzc2VydEVxdWFscyhudWxsLCBhZHZlbnR1cmUuZ2V0RGVzY3JpcHRpb24oKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lXzEiLCBhZHZlbnR1cmUuZ2V0TmFtZSgpKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9MYWJlbENvbnRyb2xTY2VuYXJpby5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9MYWJlbENvbnRyb2xTY2VuYXJpby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjY1ZDFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvTGFiZWxDb250cm9sU2NlbmFyaW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy5zY2VuYXJpb3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5BZHZlbnR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuU2FtcGxlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0vKioKLSAqIFRvIHJ1biB0aGUgdGVzdHMgaW4gdGhpcyBjbGFzcywgcmlnaHQtY2xpY2sgYW5kIHNlbGVjdCAiUnVuIEFzIEpVbml0IFBsdWctaW4KLSAqIFRlc3QiLiBUaGlzIHdpbGwgYWxzbyBzdGFydCBhbiBFY2xpcHNlIGluc3RhbmNlLiBUbyBjbGVhbiB1cCB0aGUgbGF1bmNoCi0gKiBjb25maWd1cmF0aW9uLCBvcGVuIHVwIGl0cyAiTWFpbiIgdGFiIGFuZCBzZWxlY3QgIltObyBBcHBsaWNhdGlvbl0gLSBIZWFkbGVzcwotICogTW9kZSIgYXMgdGhlIGFwcGxpY2F0aW9uIHRvIHJ1bi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTGFiZWxDb250cm9sU2NlbmFyaW8gZXh0ZW5kcyBTY2VuYXJpb3NUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEFkdmVudHVyZSBhZHZlbnR1cmU7CQotCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkvLyBkbyBhbnkgc2V0dXAgd29yayBoZXJlCi0JCWxhYmVsID0gbmV3IExhYmVsKGdldENvbXBvc2l0ZSgpLCBTV1QuTk9ORSk7CQkKLQkJYWR2ZW50dXJlID0gU2FtcGxlRGF0YS5XSU5URVJfSE9MSURBWTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBkbyBhbnkgdGVhcmRvd24gd29yayBoZXJlCi0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWxhYmVsLmRpc3Bvc2UoKTsKLQkJbGFiZWwgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzAxKCkgewotCQkvLyBCaW5kIHRoZSBhZHZlbnR1cmUgIm5hbWUiIHByb3BlcnR5IHRvIGEgbGFiZWwgY29udHJvbAotCQkvLyBDaGFuZ2UgdGhlIFVJIGFuZCB2ZXJpZnkgdGhlIG1vZGVsIGFuZCBVSSBhcmUgdGhlIHNhbWUgdmFsdWUKLQkJLy8gQ2hhbmdlIHRoZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBVSSBjaGFuZ2VzCi0JCWdldERiYygpLmJpbmQobGFiZWwsIG5ldyBQcm9wZXJ0eShhZHZlbnR1cmUsICJuYW1lIiksIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYWR2ZW50dXJlLmdldE5hbWUoKSwgbGFiZWwuZ2V0VGV4dCgpKTsKLQkJYWR2ZW50dXJlLnNldE5hbWUoIkZyYW5jZSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyYW5jZSIsIGxhYmVsLmdldFRleHQoKSk7Ci0JCS8vIFZlcmlmeSB0aGF0IHRoZSBtb2RlbCBjYW4gYmUgY2hhbmdlZCBpbiBhIG5vbi1VSSB0aHJlYWQgYW5kIHRoZSBTV1QgTGFiZWwgc3RpbGwgZ2V0cyB1cGRhdGVkIE9LCi0JCWludm9rZU5vblVJKG5ldyBSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQkJYWR2ZW50dXJlLnNldE5hbWUoIkNsaW1iIEV2ZXJlc3QiKTsKLQkJCX0KLQkJfSk7CQkKLQkJc3BpbkV2ZW50TG9vcCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJDbGltYiBFdmVyZXN0IixsYWJlbC5nZXRUZXh0KCkpOwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9MaXN0Vmlld2VyU2NlbmFyaW8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvTGlzdFZpZXdlclNjZW5hcmlvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGIzYjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9MaXN0Vmlld2VyU2NlbmFyaW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcuc2NlbmFyaW9zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2Vycy5WaWV3ZXJzUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5BZHZlbnR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5TYW1wbGVEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLQotLyoqCi0gKiBUbyBydW4gdGhlIHRlc3RzIGluIHRoaXMgY2xhc3MsIHJpZ2h0LWNsaWNrIGFuZCBzZWxlY3QgIlJ1biBBcyBKVW5pdCBQbHVnLWluCi0gKiBUZXN0Ii4gVGhpcyB3aWxsIGFsc28gc3RhcnQgYW4gRWNsaXBzZSBpbnN0YW5jZS4gVG8gY2xlYW4gdXAgdGhlIGxhdW5jaAotICogY29uZmlndXJhdGlvbiwgb3BlbiB1cCBpdHMgIk1haW4iIHRhYiBhbmQgc2VsZWN0ICJbTm8gQXBwbGljYXRpb25dIC0gSGVhZGxlc3MKLSAqIE1vZGUiIGFzIHRoZSBhcHBsaWNhdGlvbiB0byBydW4uCi0gKi8KLQotcHVibGljIGNsYXNzIExpc3RWaWV3ZXJTY2VuYXJpbyBleHRlbmRzIFNjZW5hcmlvc1Rlc3RDYXNlIHsKLQotCXByaXZhdGUgQ2F0YWxvZyBjYXRhbG9nOwotCXByaXZhdGUgTGlzdCBsaXN0OwotCXByaXZhdGUgTGlzdFZpZXdlciBsaXN0Vmlld2VyOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy8gZG8gYW55IHNldHVwIHdvcmsgaGVyZQotCQlsaXN0ID0gbmV3IExpc3QoZ2V0Q29tcG9zaXRlKCksIFNXVC5SRUFEX09OTFkgfCBTV1QuU0lOR0xFKTsKLQkJbGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKGxpc3QpOwkJCi0JCWNhdGFsb2cgPSBTYW1wbGVEYXRhLkNBVEFMT0dfMjAwNTsgLy8gTG9kZ2luZyBzb3VyY2UJCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxpc3QuZGlzcG9zZSgpOwotCQlsaXN0ID0gbnVsbDsKLQkJbGlzdFZpZXdlciA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMDEoKSB7Ci0JCS8vIEJpbmQgdGhlIGNhdGFsb2cncyBsb2RnaW5ncyB0byB0aGUgY29tYm8KLQkJZ2V0RGJjKCkuYmluZCgKLQkJCQlsaXN0Vmlld2VyLCAKLQkJCQluZXcgUHJvcGVydHkoY2F0YWxvZywgImxvZGdpbmdzIiksbnVsbCk7Ci0JCS8vIFZlcmlmeSB0aGF0IHRoZSBjb21ibydzIGl0ZW1zIGFyZSB0aGUgbG9kZ2luZ3MKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRhbG9nLmdldExvZGdpbmdzKCkubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhjYXRhbG9nLmdldExvZGdpbmdzKClbaV0sbGlzdFZpZXdlci5nZXRFbGVtZW50QXQoaSkpOwotCQl9Ci0JCS8vIFZlcmlmeSB0aGF0IHRoZSBTdHJpbmcgYmVpbmcgc2hvd24gaW4gdGhlIGxpc3Qgdmlld2VyIGlzIHRoZSAidG9TdHJpbmciIG9mIHRoZSBjb21ibyB2aWV3ZXIKLQkJU3RyaW5nW10gbG9kZ2luZ1N0cmluZ3MgPSBuZXcgU3RyaW5nW2NhdGFsb2cuZ2V0TG9kZ2luZ3MoKS5sZW5ndGhdOwkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0YWxvZy5nZXRMb2RnaW5ncygpLmxlbmd0aDsgaSsrKSB7Ci0JCQlsb2RnaW5nU3RyaW5nc1tpXSA9IGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKVtpXS50b1N0cmluZygpOwotCQl9Ci0JCWFzc2VydEFycmF5RXF1YWxzKGxvZGdpbmdTdHJpbmdzLGxpc3QuZ2V0SXRlbXMoKSk7Ci0JCQotCQkvLyBWZXJpZnkgdGhhdCB0aGUgbGlzdCBoYXMgbm8gc2VsZWN0ZWQgaXRlbQotCQlhc3NlcnRFcXVhbHMobnVsbCwoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWxpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCi0JCS8vIE5vdyBiaW5kIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGNvbWJvIHRvIHRoZSAiZGVmYXVsdExvZGdpbmciIHByb3BlcnR5IG9mIGFuIGFkdmVudHVyZQotCQlmaW5hbCBBZHZlbnR1cmUgYWR2ZW50dXJlID0gU2FtcGxlRGF0YS5XSU5URVJfSE9MSURBWTsKLQkJZ2V0RGJjKCkuYmluZCgKLQkJCQluZXcgUHJvcGVydHkobGlzdFZpZXdlcixWaWV3ZXJzUHJvcGVydGllcy5TSU5HTEVfU0VMRUNUSU9OKSwKLQkJCQluZXcgUHJvcGVydHkoYWR2ZW50dXJlLCAiZGVmYXVsdExvZGdpbmciKSwKLQkJCQludWxsKTsKLQkJCi0JCS8vIFZlcmlmeSB0aGF0IHRoZSBsaXN0IHNlbGVjdGlvbiBpcyB0aGUgZGVmYXVsdCBsb2RnaW5nCi0JCWFzc2VydEVxdWFscygoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWxpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpLGFkdmVudHVyZS5nZXREZWZhdWx0TG9kZ2luZygpKTsKLQkJCi0JCS8vIENoYW5nZSB0aGUgbW9kZWwgYW5kIHZlcmlmeSB0aGF0IHRoZSBsaXN0IHNlbGVjdGlvbiBjaGFuZ2VzIAotCQlhZHZlbnR1cmUuc2V0RGVmYXVsdExvZGdpbmcoU2FtcGxlRGF0YS5DQU1QX0dST1VORCk7Ci0JCWFzc2VydEVxdWFscyhhZHZlbnR1cmUuZ2V0RGVmYXVsdExvZGdpbmcoKSxTYW1wbGVEYXRhLkNBTVBfR1JPVU5EKTsKLQkJYXNzZXJ0RXF1YWxzKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pbGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCksYWR2ZW50dXJlLmdldERlZmF1bHRMb2RnaW5nKCkpOwkJCi0JCQotCQkvLyBDaGFuZ2UgdGhlIGxpc3Qgc2VsZWN0aW9uIGFuZCB2ZXJpZnkgdGhhdCB0aGUgbW9kZWwgY2hhbmdlcwotCQlsaXN0Vmlld2VyLmdldExpc3QoKS5zZWxlY3QoMyk7Ci0JCWFzc2VydEVxdWFscygoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWxpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpLGFkdmVudHVyZS5nZXREZWZhdWx0TG9kZ2luZygpKTsKLQkJCi0JCS8vIENoYW5nZSB0aGUgbW9kZWwgb24gYSBub24tVUkgdGhyZWFkIGFuZCB2ZXJpZnkgdGhhdCB0aGUgY29tYm8gc2VsZWN0aW9uIGNoYW5nZXMKLQkJaW52b2tlTm9uVUkobmV3IFJ1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCQlhZHZlbnR1cmUuc2V0RGVmYXVsdExvZGdpbmcoU2FtcGxlRGF0YS5ZT1VUSF9IT1NURUwpOwotCQkJfQotCQl9KTsKLQkJc3BpbkV2ZW50TG9vcCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pbGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCksYWR2ZW50dXJlLmdldERlZmF1bHRMb2RnaW5nKCkpOyAKLQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9NYXN0ZXJEZXRhaWxTY2VuYXJpb3MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvTWFzdGVyRGV0YWlsU2NlbmFyaW9zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxN2NjNGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9NYXN0ZXJEZXRhaWxTY2VuYXJpb3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcuc2NlbmFyaW9zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklVcGRhdGFibGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5zd3QuU1dUUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy51cGRhdGFibGVzLkNvbmRpdGlvbmFsVXBkYXRhYmxlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2Vycy5WaWV3ZXJzUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5BZHZlbnR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5Mb2RnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsLlNhbXBsZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db250ZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRvIHJ1biB0aGUgdGVzdHMgaW4gdGhpcyBjbGFzcywgcmlnaHQtY2xpY2sgYW5kIHNlbGVjdCAiUnVuIEFzIEpVbml0IFBsdWctaW4KLSAqIFRlc3QiLiBUaGlzIHdpbGwgYWxzbyBzdGFydCBhbiBFY2xpcHNlIGluc3RhbmNlLiBUbyBjbGVhbiB1cCB0aGUgbGF1bmNoCi0gKiBjb25maWd1cmF0aW9uLCBvcGVuIHVwIGl0cyAiTWFpbiIgdGFiIGFuZCBzZWxlY3QgIltObyBBcHBsaWNhdGlvbl0gLSBIZWFkbGVzcwotICogTW9kZSIgYXMgdGhlIGFwcGxpY2F0aW9uIHRvIHJ1bi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTWFzdGVyRGV0YWlsU2NlbmFyaW9zIGV4dGVuZHMgU2NlbmFyaW9zVGVzdENhc2UgewotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy8gZG8gYW55IHNldHVwIHdvcmsgaGVyZQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGRvIGFueSB0ZWFyZG93biB3b3JrIGhlcmUKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZpZXdlclNlbGVjdGlvbihDb250ZW50Vmlld2VyIGNvbnRlbnRWaWV3ZXIpIHsKLQkJcmV0dXJuICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbnRlbnRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIENvbWJvVmlld2VyJ3MgZG9tYWluIG9iamVjdCBsaXN0Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0Vmlld2VyQ29udGVudChDb250ZW50Vmlld2VyIGNvbnRlbnRWaWV3ZXIpIHsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKSBjb250ZW50Vmlld2VyCi0JCQkJLmdldENvbnRlbnRQcm92aWRlcigpKS5nZXRFbGVtZW50cyhudWxsKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpCi0JCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChlbGVtZW50cyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzAxKCkgewotCQkvLyBEaXNwbGF5aW5nIHRoZSBjYXRhbG9nJ3MgbGlzdCBvZiBMb2RnaW5nIG9iamVjdHMgaW4gYSBsaXN0IHZpZXdlciwKLQkJLy8gdXNpbmcgdGhlaXIgbmFtZXMuIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgTG9kZ2luZyBjYW4KLQkJLy8gYmUgZWRpdGVkIGluIGEgdGV4dCB3aWRnZXQuIFRoZXJlIGlzIGFsd2F5cyBhIHNlbGVjdGVkIExvZGdpbmcKLQkJLy8gb2JqZWN0LgotCQlMaXN0Vmlld2VyIGxpc3RWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihnZXRDb21wb3NpdGUoKSwgU1dULkJPUkRFUik7Ci0JCWxpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCUNhdGFsb2cgY2F0YWxvZyA9IFNhbXBsZURhdGEuQ0FUQUxPR18yMDA1OwotCi0JCWxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKExvZGdpbmcpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCX0KLQkJfSk7Ci0JCWdldERiYygpLmJpbmQobGlzdFZpZXdlciwKLQkJCQluZXcgUHJvcGVydHkoY2F0YWxvZywgImxvZGdpbmdzIiksIG51bGwpOwotCi0JCWFzc2VydEFycmF5RXF1YWxzKGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKSwgZ2V0Vmlld2VyQ29udGVudChsaXN0Vmlld2VyKS50b0FycmF5KCkpOwotCi0JCUlVcGRhdGFibGVWYWx1ZSBzZWxlY3RlZExvZGdpbmcgPSAoSVVwZGF0YWJsZVZhbHVlKSBnZXREYmMoKQotCQkJCS5jcmVhdGVVcGRhdGFibGUoCi0JCQkJCQluZXcgUHJvcGVydHkobGlzdFZpZXdlciwKLQkJCQkJCQkJVmlld2Vyc1Byb3BlcnRpZXMuU0lOR0xFX1NFTEVDVElPTikpOwotCi0JCXNlbGVjdGVkTG9kZ2luZy5zZXRWYWx1ZShTYW1wbGVEYXRhLkNBTVBfR1JPVU5EKTsKLQotCQlhc3NlcnRFcXVhbHMoU2FtcGxlRGF0YS5DQU1QX0dST1VORCwgZ2V0Vmlld2VyU2VsZWN0aW9uKGxpc3RWaWV3ZXIpKTsKLQkJVGV4dCB0eHROYW1lID0gbmV3IFRleHQoZ2V0Q29tcG9zaXRlKCksIFNXVC5CT1JERVIpOwotCi0JCWdldERiYygpLmJpbmQoCi0JCQkJdHh0TmFtZSwKLQkJCQluZXcgUHJvcGVydHkoc2VsZWN0ZWRMb2RnaW5nLCAibmFtZSIsIFN0cmluZy5jbGFzcywKLQkJCQkJCUJvb2xlYW4uRkFMU0UpLCBudWxsKTsKLQotCQlhc3NlcnRFcXVhbHModHh0TmFtZS5nZXRUZXh0KCksIFNhbXBsZURhdGEuQ0FNUF9HUk9VTkQuZ2V0TmFtZSgpKTsKLQkJZW50ZXJUZXh0KHR4dE5hbWUsICJmb29iYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29iYXIiLCBTYW1wbGVEYXRhLkNBTVBfR1JPVU5ELmdldE5hbWUoKSk7Ci0JCWxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCVNhbXBsZURhdGEuRklWRV9TVEFSX0hPVEVMKSk7Ci0JCWFzc2VydEVxdWFscyhTYW1wbGVEYXRhLkZJVkVfU1RBUl9IT1RFTCwgc2VsZWN0ZWRMb2RnaW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoU2FtcGxlRGF0YS5GSVZFX1NUQVJfSE9URUwuZ2V0TmFtZSgpLCB0eHROYW1lLmdldFRleHQoKSk7Ci0JCVNhbXBsZURhdGEuRklWRV9TVEFSX0hPVEVMLnNldE5hbWUoImJhcmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImJhcmZvbyIsIHR4dE5hbWUuZ2V0VGV4dCgpKTsKLQkJCi0JCS8vIE5vdyBtYWtlIHN1cmUgdGhhdCB0aGUgZXZlbnQgbGlzdGVuZXJzIGdldCByZW1vdmVkIG9uIGRpc3Bvc2UoKQotCQkvLyBWYWx1ZXMgc2hvdWxkIG5vIGxvbmdlciBiZSB1cGRhdGVkCi0vLwkJc2VsZWN0ZWRMb2RnaW5nLmRpc3Bvc2UoKTsKLS8vCQkKLS8vCQlzZWxlY3RlZExvZGdpbmcuc2V0VmFsdWUoU2FtcGxlRGF0YS5DQU1QX0dST1VORCk7Ci0vLwkJYXNzZXJ0Tm90U2FtZShTYW1wbGVEYXRhLkNBTVBfR1JPVU5ELCBnZXRWaWV3ZXJTZWxlY3Rpb24obGlzdFZpZXdlcikpOwotLy8JCWFzc2VydE5vdFNhbWUodHh0TmFtZS5nZXRUZXh0KCksIFNhbXBsZURhdGEuQ0FNUF9HUk9VTkQuZ2V0TmFtZSgpKTsKLS8vCQllbnRlclRleHQodHh0TmFtZSwgImZvb2JhciIpOwotLy8JCWFzc2VydE5vdFNhbWUoImZvb2JhciIsIFNhbXBsZURhdGEuQ0FNUF9HUk9VTkQuZ2V0TmFtZSgpKTsKLS8vCQlsaXN0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLS8vCQkJCVNhbXBsZURhdGEuRklWRV9TVEFSX0hPVEVMKSk7Ci0vLwkJYXNzZXJ0Tm90U2FtZShTYW1wbGVEYXRhLkZJVkVfU1RBUl9IT1RFTCwgc2VsZWN0ZWRMb2RnaW5nLmdldFZhbHVlKCkpOwotLy8JCWFzc2VydE5vdFNhbWUoU2FtcGxlRGF0YS5GSVZFX1NUQVJfSE9URUwuZ2V0TmFtZSgpLCB0eHROYW1lLmdldFRleHQoKSk7Ci0vLwkJU2FtcGxlRGF0YS5GSVZFX1NUQVJfSE9URUwuc2V0TmFtZSgiYmFyZm9vIik7Ci0vLwkJYXNzZXJ0Tm90U2FtZSgiYmFyZm9vIiwgdHh0TmFtZS5nZXRUZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzAyKCkgewotCQkvLyBTZWxlY3RpbmcgZnJvbSB0aGUgbGlzdCBvZiBsb2RnaW5ncyBmb3IgYW4gYWR2ZW50dXJlIGFuZCBlZGl0aW5nIHRoZQotCQkvLyBwcm9wZXJ0aWVzIG9mIHRoZSBzZWxlY3RlZCBsb2RnaW5nIGluIHRleHQgd2lkZ2V0cy4gSWYgbm8gbG9kZ2luZyBpcwotCQkvLyBzZWxlY3RlZCB0aGUgaW5wdXQgY29udHJvbHMgZm9yIG5hbWUgYW5kIGFkdmVudHVyZSBhcmUgZGlzYWJsZWQuCi0JCS8vIFRoZXJlIGFyZSB0d28gYnV0dG9ucyAiQWRkIiBhbmQgIlJlbW92ZSI7IGNsaWNraW5nIG9uICJBZGQiIGNyZWF0ZXMgYQotCQkvLyBuZXcgbG9kZ2luZyBhbmQgc2VsZWN0cyBpdCBzbyBpdCBjYW4gYmUgZWRpdGVkLCBjbGlja2luZyBvbiAiUmVtb3ZlIgotCQkvLyByZW1vdmVzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbG9kZ2luZyBmcm9tIHRoZSBsaXN0LgotCQlmaW5hbCBMaXN0Vmlld2VyIGxpc3RWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihnZXRDb21wb3NpdGUoKSwgU1dULkJPUkRFUik7Ci0JCWxpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWZpbmFsIENhdGFsb2cgY2F0YWxvZyA9IFNhbXBsZURhdGEuQ0FUQUxPR18yMDA1OwotCi0JCWxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKExvZGdpbmcpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCX0KLQkJfSk7Ci0JCWdldERiYygpLmJpbmQobGlzdFZpZXdlciwKLQkJCQluZXcgUHJvcGVydHkoY2F0YWxvZywgImxvZGdpbmdzIiksIG51bGwpOwotCi0JCWFzc2VydEFycmF5RXF1YWxzKGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKSwgZ2V0Vmlld2VyQ29udGVudChsaXN0Vmlld2VyKS50b0FycmF5KCkpOwotCi0JCWZpbmFsIElVcGRhdGFibGVWYWx1ZSBzZWxlY3RlZExvZGdpbmdVcGRhdGFibGUgPSAoSVVwZGF0YWJsZVZhbHVlKSBnZXREYmMoKQotCQkJCS5jcmVhdGVVcGRhdGFibGUoCi0JCQkJCQluZXcgUHJvcGVydHkobGlzdFZpZXdlciwKLQkJCQkJCQkJVmlld2Vyc1Byb3BlcnRpZXMuU0lOR0xFX1NFTEVDVElPTikpOwotCi0JCXNlbGVjdGVkTG9kZ2luZ1VwZGF0YWJsZS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0KLQkJQ29uZGl0aW9uYWxVcGRhdGFibGVWYWx1ZSBzZWxlY3Rpb25FeGlzdHNVcGRhdGFibGUgPSBuZXcgQ29uZGl0aW9uYWxVcGRhdGFibGVWYWx1ZSgKLQkJCQlzZWxlY3RlZExvZGdpbmdVcGRhdGFibGUpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNvbXB1dGUoT2JqZWN0IGN1cnJlbnRWYWx1ZSkgewotCQkJCXJldHVybiBjdXJyZW50VmFsdWUgIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQotCQlhc3NlcnRGYWxzZSgoKEJvb2xlYW4pIHNlbGVjdGlvbkV4aXN0c1VwZGF0YWJsZS5nZXRWYWx1ZSgpKQotCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJZmluYWwgVGV4dCB0eHROYW1lID0gbmV3IFRleHQoZ2V0Q29tcG9zaXRlKCksIFNXVC5CT1JERVIpOwotCi0JCWdldERiYygpLmJpbmQoCi0JCQkJbmV3IFByb3BlcnR5KHR4dE5hbWUsIFNXVFByb3BlcnRpZXMuRU5BQkxFRCksCi0JCQkJc2VsZWN0aW9uRXhpc3RzVXBkYXRhYmxlLCBudWxsKTsKLQkJZ2V0RGJjKCkuYmluZCgKLQkJCQluZXcgUHJvcGVydHkodHh0TmFtZSwgU1dUUHJvcGVydGllcy5URVhUKSwKLQkJCQluZXcgUHJvcGVydHkoc2VsZWN0ZWRMb2RnaW5nVXBkYXRhYmxlLCAibmFtZSIsCi0JCQkJCQlTdHJpbmcuY2xhc3MsIEJvb2xlYW4uRkFMU0UpLCBudWxsKTsKLQotCQlhc3NlcnRFcXVhbHModHh0TmFtZS5nZXRUZXh0KCksICIiKTsKLQkJYXNzZXJ0RmFsc2UodHh0TmFtZS5nZXRFbmFibGVkKCkpOwotCi0JCWZpbmFsIFRleHQgdHh0RGVzY3JpcHRpb24gPSBuZXcgVGV4dChnZXRDb21wb3NpdGUoKSwgU1dULkJPUkRFUik7Ci0KLQkJZ2V0RGJjKCkuYmluZCgKLQkJCQluZXcgUHJvcGVydHkodHh0RGVzY3JpcHRpb24sCi0JCQkJCQlTV1RQcm9wZXJ0aWVzLkVOQUJMRUQpLCBzZWxlY3Rpb25FeGlzdHNVcGRhdGFibGUsCi0JCQkJbnVsbCk7Ci0JCWdldERiYygpLmJpbmQoCi0JCQkJbmV3IFByb3BlcnR5KHR4dERlc2NyaXB0aW9uLAotCQkJCQkJU1dUUHJvcGVydGllcy5URVhUKSwKLQkJCQluZXcgUHJvcGVydHkoc2VsZWN0ZWRMb2RnaW5nVXBkYXRhYmxlLAotCQkJCQkJImRlc2NyaXB0aW9uIiwgU3RyaW5nLmNsYXNzLCBCb29sZWFuLkZBTFNFKSwgbnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHR4dERlc2NyaXB0aW9uLmdldFRleHQoKSwgIiIpOwotCQlhc3NlcnRGYWxzZSh0eHREZXNjcmlwdGlvbi5nZXRFbmFibGVkKCkpOwotCi0JCUJ1dHRvbiBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGdldENvbXBvc2l0ZSgpLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTG9kZ2luZyBzZWxlY3RlZExvZGdpbmcgPSAoTG9kZ2luZykgc2VsZWN0ZWRMb2RnaW5nVXBkYXRhYmxlCi0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQlpbnQgaW5zZXJ0aW9uSW5kZXggPSAwOwotCQkJCWlmIChzZWxlY3RlZExvZGdpbmcgIT0gbnVsbCkgewotCQkJCQlpbnNlcnRpb25JbmRleCA9IEFycmF5cy5hc0xpc3QoY2F0YWxvZy5nZXRMb2RnaW5ncygpKQotCQkJCQkJCS5pbmRleE9mKHNlbGVjdGVkTG9kZ2luZyk7Ci0JCQkJCWFzc2VydFRydWUoaW5zZXJ0aW9uSW5kZXggPj0gMCk7Ci0JCQkJfQotCQkJCUxvZGdpbmcgbmV3TG9kZ2luZyA9IFNhbXBsZURhdGEuRkFDVE9SWS5jcmVhdGVMb2RnaW5nKCk7Ci0JCQkJaW50IGl0ZW1Db3VudCA9IGxpc3RWaWV3ZXIuZ2V0TGlzdCgpLmdldEl0ZW1Db3VudCgpOwotCQkJCW5ld0xvZGdpbmcuc2V0TmFtZSgibmV3IGxvZGdpbmcgbmFtZSAiICsgaXRlbUNvdW50KTsKLQkJCQluZXdMb2RnaW5nLnNldERlc2NyaXB0aW9uKCJuZXcgbG9kZ2luZyBkZXNjcmlwdGlvbiAiCi0JCQkJCQkrIGl0ZW1Db3VudCk7Ci0JCQkJY2F0YWxvZy5hZGRMb2RnaW5nKG5ld0xvZGdpbmcpOwotCQkJCWFzc2VydEVxdWFscyhpdGVtQ291bnQgKyAxLCBsaXN0Vmlld2VyLmdldExpc3QoKS5nZXRJdGVtQ291bnQoKSk7Ci0JCQkJbGlzdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3TG9kZ2luZykpOwotCQkJCWFzc2VydFNhbWUobmV3TG9kZ2luZywgc2VsZWN0ZWRMb2RnaW5nVXBkYXRhYmxlLmdldFZhbHVlKCkpOwotCQkJCWFzc2VydFRydWUodHh0TmFtZS5nZXRFbmFibGVkKCkpOwotCQkJCWFzc2VydFRydWUodHh0RGVzY3JpcHRpb24uZ2V0RW5hYmxlZCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMobmV3TG9kZ2luZy5nZXROYW1lKCksIHR4dE5hbWUuZ2V0VGV4dCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMobmV3TG9kZ2luZy5nZXREZXNjcmlwdGlvbigpLCB0eHREZXNjcmlwdGlvbgotCQkJCQkJLmdldFRleHQoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUJ1dHRvbiByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGdldENvbXBvc2l0ZSgpLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTG9kZ2luZyBzZWxlY3RlZExvZGdpbmcgPSAoTG9kZ2luZykgc2VsZWN0ZWRMb2RnaW5nVXBkYXRhYmxlCi0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQlhc3NlcnROb3ROdWxsKHNlbGVjdGVkTG9kZ2luZyk7Ci0JCQkJaW50IGRlbGV0aW9uSW5kZXggPSBBcnJheXMuYXNMaXN0KGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKSkKLQkJCQkJCS5pbmRleE9mKHNlbGVjdGVkTG9kZ2luZyk7Ci0JCQkJYXNzZXJ0VHJ1ZShkZWxldGlvbkluZGV4ID49IDApOwotCQkJCWludCBpdGVtQ291bnQgPSBsaXN0Vmlld2VyLmdldExpc3QoKS5nZXRJdGVtQ291bnQoKTsKLQkJCQljYXRhbG9nLnJlbW92ZUxvZGdpbmcoc2VsZWN0ZWRMb2RnaW5nKTsKLQkJCQlhc3NlcnRFcXVhbHMoaXRlbUNvdW50IC0gMSwgbGlzdFZpZXdlci5nZXRMaXN0KCkuZ2V0SXRlbUNvdW50KCkpOwotCQkJCWFzc2VydE51bGwoc2VsZWN0ZWRMb2RnaW5nVXBkYXRhYmxlLmdldFZhbHVlKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQotCQlwdXNoQnV0dG9uV2l0aEV2ZW50cyhhZGRCdXR0b24pOwotCQlwdXNoQnV0dG9uV2l0aEV2ZW50cyhyZW1vdmVCdXR0b24pOwotCQlwdXNoQnV0dG9uV2l0aEV2ZW50cyhhZGRCdXR0b24pOwotCQlwdXNoQnV0dG9uV2l0aEV2ZW50cyhhZGRCdXR0b24pOwotCQlwdXNoQnV0dG9uV2l0aEV2ZW50cyhyZW1vdmVCdXR0b24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzAzKCkgewotCQkvLyBMaXN0IGFkdmVudHVyZXMgYW5kIGZvciB0aGUgc2VsZWN0ZWQgYWR2ZW50dXJlIGFsbG93IGl0cyBkZWZhdWx0Ci0JCS8vIGxvZGdpbmfvv71zIG5hbWUgYW5kIGRlc2NyaXB0aW9uIHRvIGJlIGNoYW5nZWQgaW4gdGV4dCBjb250cm9scy4gSWYKLQkJLy8gdGhlcmUgaXMgbm8gc2VsZWN0ZWQgYWR2ZW50dXJlIG9yIHRoZSBkZWZhdWx0IGxvZGdpbmcgaXMgbnVsbCB0aGUKLQkJLy8gdGV4dCBjb250cm9scyBhcmUgZGlzYWJsZWQuIFRoaXMgaXMgYSBuZXN0ZWQgcHJvcGVydHkuIFRoZSBkZWZhdWx0Ci0JCS8vIGxvZGdpbmcgY2FuIGJlIGNoYW5nZWQgZWxzZXdoZXJlLCBhbmQgdGhlIGxpc3QKLQkJZmluYWwgQ2F0YWxvZyBjYXRhbG9nID0gU2FtcGxlRGF0YS5DQVRBTE9HXzIwMDU7Ci0KLQkJZmluYWwgTGlzdFZpZXdlciBjYXRlZ29yeUxpc3RWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihnZXRDb21wb3NpdGUoKSwKLQkJCQlTV1QuQk9SREVSKTsKLQkJY2F0ZWdvcnlMaXN0Vmlld2VyLmdldExpc3QoKS5zZXRMYXlvdXREYXRhKAotCQkJCW5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQljYXRlZ29yeUxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKENhdGVnb3J5KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0pOwotCQlnZXREYmMoKS5iaW5kKGNhdGVnb3J5TGlzdFZpZXdlciwKLQkJCQluZXcgUHJvcGVydHkoY2F0YWxvZywgImNhdGVnb3JpZXMiKSwgbnVsbCk7Ci0KLQkJYXNzZXJ0QXJyYXlFcXVhbHMoY2F0YWxvZy5nZXRDYXRlZ29yaWVzKCksCi0JCQkJZ2V0Vmlld2VyQ29udGVudChjYXRlZ29yeUxpc3RWaWV3ZXIpLnRvQXJyYXkoKSk7Ci0KLQkJZmluYWwgSVVwZGF0YWJsZVZhbHVlIHNlbGVjdGVkQ2F0ZWdvcnlVcGRhdGFibGUgPSAoSVVwZGF0YWJsZVZhbHVlKSBnZXREYmMoKQotCQkJCS5jcmVhdGVVcGRhdGFibGUoCi0JCQkJCQluZXcgUHJvcGVydHkoY2F0ZWdvcnlMaXN0Vmlld2VyLAotCQkJCQkJCQlWaWV3ZXJzUHJvcGVydGllcy5TSU5HTEVfU0VMRUNUSU9OKSk7Ci0KLQkJZmluYWwgTGlzdFZpZXdlciBhZHZlbnR1cmVMaXN0Vmlld2VyID0gbmV3IExpc3RWaWV3ZXIoZ2V0Q29tcG9zaXRlKCksCi0JCQkJU1dULkJPUkRFUik7Ci0JCWFkdmVudHVyZUxpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWFkdmVudHVyZUxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKEFkdmVudHVyZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJfQotCQl9KTsKLQotCQlnZXREYmMoKS5iaW5kKAotCQkJCWFkdmVudHVyZUxpc3RWaWV3ZXIsCi0JCQkJbmV3IFByb3BlcnR5KHNlbGVjdGVkQ2F0ZWdvcnlVcGRhdGFibGUsCi0JCQkJCQkiYWR2ZW50dXJlcyIsIEFkdmVudHVyZS5jbGFzcywgQm9vbGVhbi5UUlVFKSwgbnVsbCk7Ci0KLQkJQ29uZGl0aW9uYWxVcGRhdGFibGVWYWx1ZSBjYXRlZ29yeVNlbGVjdGlvbkV4aXN0c1VwZGF0YWJsZSA9IG5ldyBDb25kaXRpb25hbFVwZGF0YWJsZVZhbHVlKAotCQkJCXNlbGVjdGVkQ2F0ZWdvcnlVcGRhdGFibGUpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNvbXB1dGUoT2JqZWN0IGN1cnJlbnRWYWx1ZSkgewotCQkJCXJldHVybiBjdXJyZW50VmFsdWUgIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQotCQlnZXREYmMoKS5iaW5kKAotCQkJCW5ldyBQcm9wZXJ0eShhZHZlbnR1cmVMaXN0Vmlld2VyLmdldExpc3QoKSwKLQkJCQkJCVNXVFByb3BlcnRpZXMuRU5BQkxFRCksCi0JCQkJY2F0ZWdvcnlTZWxlY3Rpb25FeGlzdHNVcGRhdGFibGUsIG51bGwpOwotCi0JCWZpbmFsIElVcGRhdGFibGVWYWx1ZSBzZWxlY3RlZEFkdmVudHVyZVVwZGF0YWJsZSA9IChJVXBkYXRhYmxlVmFsdWUpIGdldERiYygpCi0JCQkJLmNyZWF0ZVVwZGF0YWJsZSgKLQkJCQkJCW5ldyBQcm9wZXJ0eShhZHZlbnR1cmVMaXN0Vmlld2VyLAotCQkJCQkJCQlWaWV3ZXJzUHJvcGVydGllcy5TSU5HTEVfU0VMRUNUSU9OKSk7Ci0KLQkJQ29uZGl0aW9uYWxVcGRhdGFibGVWYWx1ZSBhZHZlbnR1cmVTZWxlY3Rpb25FeGlzdHNVcGRhdGFibGUgPSBuZXcgQ29uZGl0aW9uYWxVcGRhdGFibGVWYWx1ZSgKLQkJCQlzZWxlY3RlZEFkdmVudHVyZVVwZGF0YWJsZSkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY29tcHV0ZShPYmplY3QgY3VycmVudFZhbHVlKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRWYWx1ZSAhPSBudWxsOwotCQkJfQotCQl9OwotCi0JCWZpbmFsIFRleHQgdHh0TmFtZSA9IG5ldyBUZXh0KGdldENvbXBvc2l0ZSgpLCBTV1QuQk9SREVSKTsKLQotCQlnZXREYmMoKS5iaW5kKAotCQkJCW5ldyBQcm9wZXJ0eSh0eHROYW1lLCBTV1RQcm9wZXJ0aWVzLkVOQUJMRUQpLAotCQkJCWFkdmVudHVyZVNlbGVjdGlvbkV4aXN0c1VwZGF0YWJsZSwgbnVsbCk7Ci0JCWdldERiYygpLmJpbmQoCi0JCQkJbmV3IFByb3BlcnR5KHR4dE5hbWUsIFNXVFByb3BlcnRpZXMuVEVYVCksCi0JCQkJbmV3IFByb3BlcnR5KHNlbGVjdGVkQWR2ZW50dXJlVXBkYXRhYmxlLCAibmFtZSIsCi0JCQkJCQlTdHJpbmcuY2xhc3MsIEJvb2xlYW4uRkFMU0UpLCBudWxsKTsKLQotCQlhc3NlcnRFcXVhbHModHh0TmFtZS5nZXRUZXh0KCksICIiKTsKLQkJYXNzZXJ0RmFsc2UodHh0TmFtZS5nZXRFbmFibGVkKCkpOwotCi0JCWZpbmFsIFRleHQgdHh0RGVzY3JpcHRpb24gPSBuZXcgVGV4dChnZXRDb21wb3NpdGUoKSwgU1dULkJPUkRFUik7Ci0KLQkJZ2V0RGJjKCkuYmluZCgKLQkJCQluZXcgUHJvcGVydHkodHh0RGVzY3JpcHRpb24sCi0JCQkJCQlTV1RQcm9wZXJ0aWVzLkVOQUJMRUQpLAotCQkJCWFkdmVudHVyZVNlbGVjdGlvbkV4aXN0c1VwZGF0YWJsZSwgbnVsbCk7Ci0JCWdldERiYygpLmJpbmQoCi0JCQkJbmV3IFByb3BlcnR5KHR4dERlc2NyaXB0aW9uLAotCQkJCQkJU1dUUHJvcGVydGllcy5URVhUKSwKLQkJCQluZXcgUHJvcGVydHkoc2VsZWN0ZWRBZHZlbnR1cmVVcGRhdGFibGUsCi0JCQkJCQkiZGVzY3JpcHRpb24iLCBTdHJpbmcuY2xhc3MsIEJvb2xlYW4uRkFMU0UpLCBudWxsKTsKLQotCQlhc3NlcnRGYWxzZShhZHZlbnR1cmVMaXN0Vmlld2VyLmdldExpc3QoKS5pc0VuYWJsZWQoKSk7Ci0JCWNhdGVnb3J5TGlzdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJU2FtcGxlRGF0YS5TVU1NRVJfQ0FURUdPUlkpKTsKLQkJYXNzZXJ0VHJ1ZShhZHZlbnR1cmVMaXN0Vmlld2VyLmdldExpc3QoKS5pc0VuYWJsZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHR4dE5hbWUuZ2V0RW5hYmxlZCgpKTsKLQkJYWR2ZW50dXJlTGlzdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJU2FtcGxlRGF0YS5SQUZUSU5HX0hPTElEQVkpKTsKLQkJYXNzZXJ0VHJ1ZSh0eHROYW1lLmdldEVuYWJsZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhTYW1wbGVEYXRhLlJBRlRJTkdfSE9MSURBWS5nZXROYW1lKCksIHR4dE5hbWUuZ2V0VGV4dCgpKTsKLQkJY2F0ZWdvcnlMaXN0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQlTYW1wbGVEYXRhLldJTlRFUl9DQVRFR09SWSkpOwotCQlhc3NlcnRUcnVlKGFkdmVudHVyZUxpc3RWaWV3ZXIuZ2V0TGlzdCgpLmlzRW5hYmxlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodHh0TmFtZS5nZXRFbmFibGVkKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvc2NlbmFyaW9zL1Byb3BlcnR5U2NlbmFyaW9zLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvc2NlbmFyaW9zL1Byb3BlcnR5U2NlbmFyaW9zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NjZhNTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9Qcm9wZXJ0eVNjZW5hcmlvcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy5zY2VuYXJpb3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQmluZFNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklEYXRhQmluZGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLmNvbnZlcnRlci5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVyLklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuY29udmVydGVycy5JZGVudGl0eUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5zd3QuU1dUUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52YWxpZGF0b3IuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5BZHZlbnR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQ2FydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5TYW1wbGVEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRvIHJ1biB0aGUgdGVzdHMgaW4gdGhpcyBjbGFzcywgcmlnaHQtY2xpY2sgYW5kIHNlbGVjdCAiUnVuIEFzIEpVbml0IFBsdWctaW4KLSAqIFRlc3QiLiBUaGlzIHdpbGwgYWxzbyBzdGFydCBhbiBFY2xpcHNlIGluc3RhbmNlLiBUbyBjbGVhbiB1cCB0aGUgbGF1bmNoCi0gKiBjb25maWd1cmF0aW9uLCBvcGVuIHVwIGl0cyAiTWFpbiIgdGFiIGFuZCBzZWxlY3QgIltObyBBcHBsaWNhdGlvbl0gLSBIZWFkbGVzcwotICogTW9kZSIgYXMgdGhlIGFwcGxpY2F0aW9uIHRvIHJ1bi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlTY2VuYXJpb3MgZXh0ZW5kcyBTY2VuYXJpb3NUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEFkdmVudHVyZSBhZHZlbnR1cmU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkvLyBkbyBhbnkgc2V0dXAgd29yayBoZXJlCi0JCWFkdmVudHVyZSA9IFNhbXBsZURhdGEuV0lOVEVSX0hPTElEQVk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZG8gYW55IHRlYXJkb3duIHdvcmsgaGVyZQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRlclRleHQoKSB7Ci0JCS8vIGp1c3QgdG8gbWFrZSBzdXJlIGVudGVyVGV4dCgpIGdlbmVyYXRlcyBhIEZvY3VzT3V0IGV2ZW50LgotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChnZXRDb21wb3NpdGUoKSwgU1dULkJPUkRFUik7Ci0JCWZpbmFsIGJvb2xlYW5bXSBmb2N1c0xvc3RIb2xkZXIgPSB7IGZhbHNlIH07Ci0JCXRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJLy8gb25seSBpbnRlcmVzdGVkIGluIGZvY3VzIGxvc3QgZXZlbnRzCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlmb2N1c0xvc3RIb2xkZXJbMF0gPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJZW50ZXJUZXh0KHRleHQsICJoYWxsbyIpOwotCQlhc3NlcnRUcnVlKGZvY3VzTG9zdEhvbGRlclswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMDEoKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGdldENvbXBvc2l0ZSgpLCBTV1QuQk9SREVSKTsKLQkJZ2V0RGJjKCkuYmluZCh0ZXh0LCBuZXcgUHJvcGVydHkoYWR2ZW50dXJlLCAibmFtZSIpLCBudWxsKTsKLQkJLy8gdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBzZWUgd2hhdCdzIGhhcHBlbmluZwotCQkvLyBoYXBwZW5pbmcKLQkJLy8gc3BpbkV2ZW50TG9vcCgxKTsKLQkJYXNzZXJ0RXF1YWxzKGFkdmVudHVyZS5nZXROYW1lKCksIHRleHQuZ2V0VGV4dCgpKTsKLQkJZW50ZXJUZXh0KHRleHQsICJmb29iYXIiKTsKLQkJLy8gdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBzZWUgd2hhdCdzIGhhcHBlbmluZwotCQkvLyBzcGluRXZlbnRMb29wKDEpOwotCQlhc3NlcnRFcXVhbHMoImZvb2JhciIsIGFkdmVudHVyZS5nZXROYW1lKCkpOwotCQlhZHZlbnR1cmUuc2V0TmFtZSgiYmFyZm9vIik7Ci0JCS8vIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gc2VlIHdoYXQncyBoYXBwZW5pbmcKLQkJLy8gc3BpbkV2ZW50TG9vcCgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJmb28iLCB0ZXh0LmdldFRleHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMDIoKSB7Ci0JCS8vIEJpbmRpbmcgdGhlIG5hbWUgcHJvcGVydHkgb2YgYW4gQWR2ZW50dXJlIG9iamVjdCB0byB0aGUgY29udGVudHMgb2YKLQkJLy8gVGV4dCBjb250cm9scywgbm8gY29udmVyc2lvbiwgbm8gdmFsaWRhdGlvbi4gVGhlIFRleHQgd2lkZ2V0IGVkaXRhYmxlCi0JCS8vIGlzIHNldCB0byBmYWxzZS5ieSB0aGUgZGV2ZWxvcGVyIChjYW4gbm90IGNoYW5nZSB0aGUgbmFtZSkKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoZ2V0Q29tcG9zaXRlKCksIFNXVC5SRUFEX09OTFkpOwotCQlnZXREYmMoKS5iaW5kKHRleHQsIG5ldyBQcm9wZXJ0eShhZHZlbnR1cmUsICJuYW1lIiksIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYWR2ZW50dXJlLmdldE5hbWUoKSwgdGV4dC5nZXRUZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzAzKCkgewotCQkvLyBCaW5kaW5nIG9mIGEgcmVhZC1vbmx5IHByb3BlcnR5IG9mIGFuIEFkdmVudHVyZSBvYmplY3QgdG8gdGhlCi0JCS8vIGNvbnRlbnRzIG9mIFRleHQgY29udHJvbHMsIG5vIGNvbnZlcnNpb24sIG5vIHZhbGlkYXRpb24uIFRleHQgY29udHJvbAotCQkvLyBpcyBub3QgZWRpdGFibGUgYXMgYSBzaWRlIGVmZmVjdCBvZiBiaW5kaW5nIHRvIGEgcmVhZC1vbmx5IHByb3BlcnR5Li4KLQkJQ2FydCBjYXJ0ID0gU2FtcGxlRGF0YS5DQVJUOwotCQljYXJ0LnNldEFkdmVudHVyZURheXMoNDIpOwotCQkvLyBiaW5kIHRvIHRoZSBsb2RnaW5nRGF5cyBmZWF0dXJlLCB3aGljaCBpcyByZWFkLW9ubHkgYW5kIGFsd2F5cyBvbmUKLQkJLy8gbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgYWR2ZW50dXJlIGRheXMuCi0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGdldENvbXBvc2l0ZSgpLCBTV1QuQk9SREVSKTsKLQkJZ2V0RGJjKCkuYmluZCh0ZXh0LCBuZXcgUHJvcGVydHkoY2FydCwgImxvZGdpbmdEYXlzIiksCi0JCQkJbmV3IEJpbmRTcGVjKG5ldyBJQ29udmVydGVyKCkgewotCQkJCQlwdWJsaWMgQ2xhc3MgZ2V0TW9kZWxUeXBlKCkgewotCQkJCQkJcmV0dXJuIGludC5jbGFzczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDbGFzcyBnZXRUYXJnZXRUeXBlKCkgewotCQkJCQkJcmV0dXJuIFN0cmluZy5jbGFzczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBPYmplY3QgY29udmVydFRhcmdldFRvTW9kZWwoT2JqZWN0IG9iamVjdCkgewotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKChTdHJpbmcpIG9iamVjdCk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRNb2RlbFRvVGFyZ2V0KE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCX0sIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGNhcnQuZ2V0TG9kZ2luZ0RheXMoKSkudG9TdHJpbmcoKSwgdGV4dAotCQkJCS5nZXRUZXh0KCkpOwotCQkvLyBUT0RPIEFQSSBleHRlbnNpb24gbmVlZGVkOiBnZXRDaGFuZ2VhYmxlKCkgYW5kIHNldENoYW5nZWFibGUoKSBvbgotCQkvLyBJVXBkYXRhYmxlVmFsdWUgb3IgSVVwZGF0YWJsZQotCQkvLyBhc3NlcnRFcXVhbHMoCi0JCS8vICJOZWVkcyBBUEkgZXh0ZW5zaW9uOiBnZXRDaGFuZ2VhYmxlKCkgYW5kIHNldENoYW5nZWFibGUoKSBvbgotCQkvLyBJVXBkYXRhYmxlVmFsdWUgb3IgSVVwZGF0YWJsZS4iLAotCQkvLyBmYWxzZSwgdGV4dC5nZXRFZGl0YWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8wNCgpIHsKLQkJLy8gQmluZGluZyBhIG5lc3RlZCBwcm9wZXJ0eSBvZiBhbiBBZHZlbnR1cmUgb2JqZWN0IHRvIHRoZSBjb250ZW50IG9mIGEKLQkJLy8gVGV4dCBjb250cm9sLCBubyBjb252ZXJzaW9uLCBubyB2YWxpZGF0aW9uLgotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChnZXRDb21wb3NpdGUoKSwgU1dULkJPUkRFUik7Ci0JCS8vIFRPRE8gU2NlbmFyaW8gbmVlZHMgdG8gYmUgbW9yZSBzcGVjaWZpYyAtIEknbSBiaW5kaW5nIHRvIHRoZSBkZWZhdWx0Ci0JCS8vIGxvZGdpbmcncyBkZXNjcmlwdGlvbiBvZiBhbiBhZHZlbnR1cmUuIFdoYXQgZG8gd2UgZXhwZWN0IHRvIGhhcHBlbgotCQkvLyB3aGVuIHRoZSBkZWZhdWx0IGxvZGdpbmcgY2hhbmdlcz8gSWYgd2UgZXhwZWN0IG5vIGNoYW5nZSwgdGhlbiB0aGlzCi0JCS8vIHNjZW5hcmlvIGRvZXMgbm90IGludHJvZHVjZSBhbnl0aGluZyBuZXcuIElmIHdlIGV4cGVjdCB0aGUgYmluZGluZyB0bwotCQkvLyBiZSB0byB0aGUgbmV3IGRlZmF1bHQgbG9kZ2luZydzIGRlc2NyaXB0aW9uLCBzaG91bGRuJ3Qgd2UgbW92ZSB0aGlzCi0JCS8vIHNjZW5hcmlvIHRvIHRoZSBtYXN0ZXIvZGV0YWlsIHNlY3Rpb24/IEknbSBhc3N1bWluZyB0aGUgbGF0dGVyIGZvcgotCQkvLyBub3cuCi0JCUlVcGRhdGFibGVWYWx1ZSBkZWZhdWx0TG9kZ2luZyA9IChJVXBkYXRhYmxlVmFsdWUpIGdldERiYygpCi0JCQkJLmNyZWF0ZVVwZGF0YWJsZSgKLQkJCQkJCW5ldyBQcm9wZXJ0eShhZHZlbnR1cmUsICJkZWZhdWx0TG9kZ2luZyIpKTsKLQkJZ2V0RGJjKCkuYmluZCgKLQkJCQl0ZXh0LAotCQkJCW5ldyBQcm9wZXJ0eShkZWZhdWx0TG9kZ2luZywgImRlc2NyaXB0aW9uIiwKLQkJCQkJCVN0cmluZy5jbGFzcywgQm9vbGVhbi5GQUxTRSksIG51bGwpOwotCi0JCS8vIHRlc3QgY2hhbmdpbmcgdGhlIGRlc2NyaXB0aW9uCi0JCWFzc2VydEVxdWFscyhhZHZlbnR1cmUuZ2V0RGVmYXVsdExvZGdpbmcoKS5nZXREZXNjcmlwdGlvbigpLCB0ZXh0Ci0JCQkJLmdldFRleHQoKSk7Ci0JCWVudGVyVGV4dCh0ZXh0LCAiZm9vYmFyIik7Ci0JCWFzc2VydEVxdWFscygiZm9vYmFyIiwgYWR2ZW50dXJlLmdldERlZmF1bHRMb2RnaW5nKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWFkdmVudHVyZS5nZXREZWZhdWx0TG9kZ2luZygpLnNldERlc2NyaXB0aW9uKCJiYXJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKGFkdmVudHVyZS5nZXREZWZhdWx0TG9kZ2luZygpLmdldERlc2NyaXB0aW9uKCksIHRleHQKLQkJCQkuZ2V0VGV4dCgpKTsKLQotCQkvLyB0ZXN0IGNoYW5naW5nIHRoZSBkZWZhdWx0IGxvZGdpbmcKLQkJYWR2ZW50dXJlLnNldERlZmF1bHRMb2RnaW5nKFNhbXBsZURhdGEuQ0FNUF9HUk9VTkQpOwotCQlhc3NlcnRFcXVhbHMoYWR2ZW50dXJlLmdldERlZmF1bHRMb2RnaW5nKCkuZ2V0RGVzY3JpcHRpb24oKSwgdGV4dAotCQkJCS5nZXRUZXh0KCkpOwotCQlhZHZlbnR1cmUuZ2V0RGVmYXVsdExvZGdpbmcoKS5zZXREZXNjcmlwdGlvbigiYmFyZm8iKTsKLQkJYXNzZXJ0RXF1YWxzKGFkdmVudHVyZS5nZXREZWZhdWx0TG9kZ2luZygpLmdldERlc2NyaXB0aW9uKCksIHRleHQKLQkJCQkuZ2V0VGV4dCgpKTsKLQotCQlhZHZlbnR1cmUuc2V0RGVmYXVsdExvZGdpbmcobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JCWFkdmVudHVyZS5zZXREZWZhdWx0TG9kZ2luZyhTYW1wbGVEYXRhLkZJVkVfU1RBUl9IT1RFTCk7Ci0JCWFzc2VydEVxdWFscyhhZHZlbnR1cmUuZ2V0RGVmYXVsdExvZGdpbmcoKS5nZXREZXNjcmlwdGlvbigpLCB0ZXh0Ci0JCQkJLmdldFRleHQoKSk7Ci0JCWFkdmVudHVyZS5nZXREZWZhdWx0TG9kZ2luZygpLnNldERlc2NyaXB0aW9uKCJiYXJmIik7Ci0JCWFzc2VydEVxdWFscyhhZHZlbnR1cmUuZ2V0RGVmYXVsdExvZGdpbmcoKS5nZXREZXNjcmlwdGlvbigpLCB0ZXh0Ci0JCQkJLmdldFRleHQoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8wNSgpIHsKLQkJLy8gQmluZGluZyB0aGUgbmFtZSBwcm9wZXJ0eSBvZiBhbiBBZHZlbnR1cmUgb2JqZWN0IHRvIHRoZSBjb250ZW50cyBvZgotCQkvLyBUZXh0IGNvbnRyb2xzIHdoZXJlIGNvbnZlcnNpb24gb2NjdXJzIO+/vSB0aGUgbW9kZWwgZGF0YSBpcyBoZWxkIGFsbAotCQkvLyBpbgotCQkvLyB1cHBlcmNhc2UgYW5kIGRpc3BsYXllZCBpbiBsb3dlcmNhc2Ugd2l0aCB0aGUgZmlyc3QgbGV0dGVyCi0JCS8vIGNhcGl0YWxpemVkLgotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChnZXRDb21wb3NpdGUoKSwgU1dULkJPUkRFUik7Ci0JCWFkdmVudHVyZS5zZXROYW1lKCJVUFBFUkNBU0UiKTsKLQkJZ2V0RGJjKCkuYmluZCh0ZXh0LCBuZXcgUHJvcGVydHkoYWR2ZW50dXJlLCAibmFtZSIpLAotCQkJCW5ldyBCaW5kU3BlYyhuZXcgSUNvbnZlcnRlcigpIHsKLQkJCQkJcHVibGljIENsYXNzIGdldE1vZGVsVHlwZSgpIHsKLQkJCQkJCXJldHVybiBTdHJpbmcuY2xhc3M7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ2xhc3MgZ2V0VGFyZ2V0VHlwZSgpIHsKLQkJCQkJCXJldHVybiBTdHJpbmcuY2xhc3M7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRUYXJnZXRUb01vZGVsKE9iamVjdCBmcm9tT2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gKChTdHJpbmcpIGZyb21PYmplY3QpLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRNb2RlbFRvVGFyZ2V0KE9iamVjdCB0b09iamVjdCkgewotCQkJCQkJU3RyaW5nIG1vZGVsVmFsdWUgPSAoU3RyaW5nKSB0b09iamVjdDsKLQkJCQkJCWlmIChtb2RlbFZhbHVlID09IG51bGwgfHwgbW9kZWxWYWx1ZS5lcXVhbHMoIiIpKSB7Ci0JCQkJCQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgZmlyc3RDaGFyID0gbW9kZWxWYWx1ZS5zdWJzdHJpbmcoMCwgMSk7Ci0JCQkJCQlTdHJpbmcgcmVtYWluaW5nQ2hhcnMgPSBtb2RlbFZhbHVlLnN1YnN0cmluZygxKTsKLQkJCQkJCXJldHVybiBmaXJzdENoYXIudG9VcHBlckNhc2UoKQotCQkJCQkJCQkrIHJlbWFpbmluZ0NoYXJzLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCX0KLQkJCQl9LCBudWxsKSk7Ci0JCS8vIHNwaW5FdmVudExvb3AoMSk7Ci0JCWFzc2VydEVxdWFscygiVXBwZXJjYXNlIiwgdGV4dC5nZXRUZXh0KCkpOwotCQllbnRlclRleHQodGV4dCwgImxvd2VyY2FzZSIpOwotCQkvLyBzcGluRXZlbnRMb29wKDEpOwotCQkvLyBUT0RPIElmIHdlIHdhbnRlZCB0byAiY2Fub25pY2FsaXplIiB0aGUgdmFsdWUgaW4gdGhlIHRleHQgZmllbGQsIGhvdwotCQkvLyBjb3VsZCB3ZSBkbyB0aGF0PwotCQlhc3NlcnRFcXVhbHMoIkxPV0VSQ0FTRSIsIGFkdmVudHVyZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzA2KCkgewotCQkvLyBCaW5kaW5nIHRoZSBuYW1lIHByb3BlcnR5IG9mIGFuIEFkdmVudHVyZSBvYmplY3QgdG8gdGhlIGNvbnRlbnRzIG9mCi0JCS8vIFRleHQgY29udHJvbHMgd2hlcmUgdmFsaWRhdGlvbiBvY2N1cnMgYW5kIHRoZSBuYW1lIGNhbm5vdCBiZSBsb25nZXIKLQkJLy8gdGhhbiAxNSBjaGFyYWN0ZXJzIGFuZCBjYW5ub3QgY29udGFpbiBzcGFjZXMKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoZ2V0Q29tcG9zaXRlKCksIFNXVC5CT1JERVIpOwotCQlmaW5hbCBTdHJpbmcgbm9TcGFjZXNNZXNzYWdlID0gIk5hbWUgbXVzdCBub3QgY29udGFpbiBzcGFjZXMuIjsKLQkJZmluYWwgU3RyaW5nIG1heDE1Q2hhcmFjdGVyc01lc3NhZ2UgPSAiTWF4aW11bSBsZW5ndGggZm9yIG5hbWUgaXMgMTUgY2hhcmFjdGVycy4iOwotCQlhZHZlbnR1cmUuc2V0TmFtZSgiVmFsaWRWYWx1ZSIpOwotCQlnZXREYmMoKS5iaW5kKAotCQkJCXRleHQsCi0JCQkJbmV3IFByb3BlcnR5KGFkdmVudHVyZSwgIm5hbWUiKSwKLQkJCQluZXcgQmluZFNwZWMobmV3IElkZW50aXR5Q29udmVydGVyKFN0cmluZy5jbGFzcyksCi0JCQkJCQluZXcgSVZhbGlkYXRvcigpIHsKLQkJCQkJCQlwdWJsaWMgU3RyaW5nIGlzUGFydGlhbGx5VmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCQkJCXJldHVybiBpc1ZhbGlkKHZhbHVlKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQkJCQlpZiAoc3RyaW5nVmFsdWUubGVuZ3RoKCkgPiAxNSkgewotCQkJCQkJCQkJcmV0dXJuIG1heDE1Q2hhcmFjdGVyc01lc3NhZ2U7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoc3RyaW5nVmFsdWUuaW5kZXhPZignICcpICE9IC0xKSB7Ci0JCQkJCQkJCQlyZXR1cm4gbm9TcGFjZXNNZXNzYWdlOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KSk7Ci0JCS8vIG5vIHZhbGlkYXRpb24gbWVzc2FnZQotCQlhc3NlcnRFcXVhbHMoIiIsIGdldERiYygpLmdldENvbWJpbmVkVmFsaWRhdGlvbk1lc3NhZ2UoKS5nZXRWYWx1ZSgpKTsKLQkJdGV4dC5zZXRUZXh0KCJJbnZhbGlkIFZhbHVlIik7Ci0JCWFzc2VydEVxdWFscyhub1NwYWNlc01lc3NhZ2UsIGdldERiYygpLmdldENvbWJpbmVkVmFsaWRhdGlvbk1lc3NhZ2UoKQotCQkJCS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWxpZFZhbHVlIiwgdGV4dC5nZXRUZXh0KCkpOwotCQl0ZXh0LnNldFRleHQoIkludmFsaWRWYWx1ZUJlY2F1c2VUb29Mb25nIik7Ci0JCWFzc2VydEVxdWFscyhtYXgxNUNoYXJhY3RlcnNNZXNzYWdlLCBnZXREYmMoKQotCQkJCS5nZXRDb21iaW5lZFZhbGlkYXRpb25NZXNzYWdlKCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsaWRWYWx1ZSIsIHRleHQuZ2V0VGV4dCgpKTsKLQkJZW50ZXJUZXh0KHRleHQsICJhbm90aGVydmFsaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBnZXREYmMoKS5nZXRDb21iaW5lZFZhbGlkYXRpb25NZXNzYWdlKCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYW5vdGhlcnZhbGlkIiwgdGV4dC5nZXRUZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFub3RoZXJ2YWxpZCIsIGFkdmVudHVyZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzA3KCkgewotCQkvLyBCaW5kaW5nIHRoZSBwcmljZSBwcm9wZXJ0eSBvZiBhbiBBZHZlbnR1cmUgdG8gYSBUZXh0IGNvbnRyb2wuIFByaWNlCi0JCS8vIGlzIGEgZG91YmxlIGFuZCBUZXh0IGFjY2VwdHMgU3RyaW5nIHNvIGNvbnZlcnNpb24gd2lsbCBoYXZlIHRvIG9jY3VyLgotCQkvLyBWYWxpZGF0aW9uIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZSBpcyBwb3NpdGl2ZQotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChnZXRDb21wb3NpdGUoKSwgU1dULkJPUkRFUik7Ci0JCWFkdmVudHVyZS5zZXRQcmljZSg1LjApOwotCQlmaW5hbCBTdHJpbmcgY2Fubm90QmVOZWdhdGl2ZU1lc3NhZ2UgPSAiUHJpY2UgY2Fubm90IGJlIG5lZ2F0aXZlLiI7Ci0JCWZpbmFsIFN0cmluZyBtdXN0QmVDdXJyZW5jeU1lc3NhZ2UgPSAiUHJpY2UgbXVzdCBiZSBhIGN1cnJlbmN5LiI7Ci0JCWdldERiYygpLmJpbmQodGV4dCwgbmV3IFByb3BlcnR5KGFkdmVudHVyZSwgInByaWNlIiksCi0JCQkJbmV3IEJpbmRTcGVjKG5ldyBDb252ZXJ0ZXIoU3RyaW5nLmNsYXNzLCBkb3VibGUuY2xhc3MpIHsKLQotCQkJCQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRUYXJnZXRUb01vZGVsKE9iamVjdCBmcm9tT2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gbmV3IERvdWJsZSgoU3RyaW5nKSBmcm9tT2JqZWN0KTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBPYmplY3QgY29udmVydE1vZGVsVG9UYXJnZXQoT2JqZWN0IHRvT2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gKChEb3VibGUpIHRvT2JqZWN0KS50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJfSwgbmV3IElWYWxpZGF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBTdHJpbmcgaXNQYXJ0aWFsbHlWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotCQkJCQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWRvdWJsZSBkb3VibGVWYWx1ZSA9IG5ldyBEb3VibGUoc3RyaW5nVmFsdWUpCi0JCQkJCQkJCQkuZG91YmxlVmFsdWUoKTsKLQkJCQkJCQlpZiAoZG91YmxlVmFsdWUgPCAwLjApIHsKLQkJCQkJCQkJcmV0dXJuIGNhbm5vdEJlTmVnYXRpdmVNZXNzYWdlOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCXJldHVybiBtdXN0QmVDdXJyZW5jeU1lc3NhZ2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KSk7Ci0JCWFzc2VydEVxdWFscygiNS4wIiwgdGV4dC5nZXRUZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGdldERiYygpLmdldENvbWJpbmVkVmFsaWRhdGlvbk1lc3NhZ2UoKS5nZXRWYWx1ZSgpKTsKLQkJZW50ZXJUZXh0KHRleHQsICIwLjY1Iik7Ci0JCWFzc2VydEVxdWFscygiIiwgZ2V0RGJjKCkuZ2V0Q29tYmluZWRWYWxpZGF0aW9uTWVzc2FnZSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMC42NSwgYWR2ZW50dXJlLmdldFByaWNlKCksIDAuMDAwMSk7Ci0JCWFkdmVudHVyZS5zZXRQcmljZSg0Mi4yNCk7Ci0JCWFzc2VydEVxdWFscygiNDIuMjQiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgZ2V0RGJjKCkuZ2V0Q29tYmluZWRWYWxpZGF0aW9uTWVzc2FnZSgpLmdldFZhbHVlKCkpOwotCQllbnRlclRleHQodGV4dCwgImp5Z3QiKTsKLQkJYXNzZXJ0RXF1YWxzKG11c3RCZUN1cnJlbmN5TWVzc2FnZSwgZ2V0RGJjKCkKLQkJCQkuZ2V0Q29tYmluZWRWYWxpZGF0aW9uTWVzc2FnZSgpLmdldFZhbHVlKCkpOwotCQllbnRlclRleHQodGV4dCwgIi0yMy45Iik7Ci0JCWFzc2VydEVxdWFscyhjYW5ub3RCZU5lZ2F0aXZlTWVzc2FnZSwgZ2V0RGJjKCkKLQkJCQkuZ2V0Q29tYmluZWRWYWxpZGF0aW9uTWVzc2FnZSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoNDIuMjQsIGFkdmVudHVyZS5nZXRQcmljZSgpLCAwLjAwMDEpOwotCQlhZHZlbnR1cmUuc2V0UHJpY2UoMC4wKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBnZXREYmMoKS5nZXRDb21iaW5lZFZhbGlkYXRpb25NZXNzYWdlKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMDgoKSB7Ci0JCS8vIEJpbmRpbmcgdGhlIHByaWNlIHByb3BlcnR5IG9mIGFuIEFkdmVudHVyZSB0byBhIFRleHQgY29udHJvbCBidXQgd2l0aAotCQkvLyBjdXN0b20gY29udmVyc2lvbiDvv70gdGhlIGRvdWJsZSB3aWxsIGJlIHZhbGlkYXRlZCB0byBvbmx5IGhhdmUgdHdvCi0JCS8vIGRlY2ltYWwgcGxhY2VzIGFuZCBkaXNwbGF5ZWQgd2l0aCBhIGxlYWRpbmcgY3VycmVuY3kgc3ltYm9sLCBhbmQgY2FuCi0JCS8vIGJlIGVudGVyZWQgd2l0aCBvciB3aXRob3V0IHRoZSBjdXJyZW5jeSBzeW1ib2wuCi0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGdldENvbXBvc2l0ZSgpLCBTV1QuQk9SREVSKTsKLQkJYWR2ZW50dXJlLnNldFByaWNlKDUuMCk7Ci0JCWZpbmFsIFN0cmluZyBjYW5ub3RCZU5lZ2F0aXZlTWVzc2FnZSA9ICJQcmljZSBjYW5ub3QgYmUgbmVnYXRpdmUuIjsKLQkJZmluYWwgU3RyaW5nIG11c3RCZUN1cnJlbmN5TWVzc2FnZSA9ICJQcmljZSBtdXN0IGJlIGEgY3VycmVuY3kuIjsKLQkJZmluYWwgTnVtYmVyRm9ybWF0IGN1cnJlbmN5Rm9ybWF0ID0gTnVtYmVyRm9ybWF0Ci0JCQkJLmdldEN1cnJlbmN5SW5zdGFuY2UoTG9jYWxlLkNBTkFEQSk7Ci0JCWdldERiYygpLmJpbmQodGV4dCwgbmV3IFByb3BlcnR5KGFkdmVudHVyZSwgInByaWNlIiksCi0JCQkJbmV3IEJpbmRTcGVjKG5ldyBDb252ZXJ0ZXIoU3RyaW5nLmNsYXNzLCBkb3VibGUuY2xhc3MpIHsKLQotCQkJCQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRUYXJnZXRUb01vZGVsKE9iamVjdCBmcm9tT2JqZWN0KSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXJldHVybiBjdXJyZW5jeUZvcm1hdC5wYXJzZSgoU3RyaW5nKSBmcm9tT2JqZWN0KTsKLQkJCQkJCX0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBUT0RPIHRocm93IHNvbWV0aGluZyBsaWtlCi0JCQkJCQkJLy8gSWxsZWdhbENvbnZlcnNpb25FeGNlcHRpb24/Ci0JCQkJCQkJcmV0dXJuIG5ldyBEb3VibGUoMCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRNb2RlbFRvVGFyZ2V0KE9iamVjdCB0b09iamVjdCkgewotCQkJCQkJcmV0dXJuIGN1cnJlbmN5Rm9ybWF0LmZvcm1hdCgoKERvdWJsZSkgdG9PYmplY3QpCi0JCQkJCQkJCS5kb3VibGVWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0sIG5ldyBJVmFsaWRhdG9yKCkgewotCQkJCQlwdWJsaWMgU3RyaW5nIGlzUGFydGlhbGx5VmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJCQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlkb3VibGUgZG91YmxlVmFsdWUgPSBjdXJyZW5jeUZvcm1hdC5wYXJzZSgKLQkJCQkJCQkJCXN0cmluZ1ZhbHVlKS5kb3VibGVWYWx1ZSgpOwotCQkJCQkJCWlmIChkb3VibGVWYWx1ZSA8IDAuMCkgewotCQkJCQkJCQlyZXR1cm4gY2Fubm90QmVOZWdhdGl2ZU1lc3NhZ2U7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotCQkJCQkJCXJldHVybiBtdXN0QmVDdXJyZW5jeU1lc3NhZ2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KSk7Ci0JCWFzc2VydEVxdWFscygiJDUuMDAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgZ2V0RGJjKCkuZ2V0Q29tYmluZWRWYWxpZGF0aW9uTWVzc2FnZSgpLmdldFZhbHVlKCkpOwotCQllbnRlclRleHQodGV4dCwgIiQwLjY1Iik7Ci0JCWFzc2VydEVxdWFscygiIiwgZ2V0RGJjKCkuZ2V0Q29tYmluZWRWYWxpZGF0aW9uTWVzc2FnZSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMC42NSwgYWR2ZW50dXJlLmdldFByaWNlKCksIDAuMDAwMSk7Ci0JCWFkdmVudHVyZS5zZXRQcmljZSg0Mi4yNCk7Ci0JCWFzc2VydEVxdWFscygiJDQyLjI0IiwgdGV4dC5nZXRUZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGdldERiYygpLmdldENvbWJpbmVkVmFsaWRhdGlvbk1lc3NhZ2UoKS5nZXRWYWx1ZSgpKTsKLQkJZW50ZXJUZXh0KHRleHQsICJqeWd0Iik7Ci0JCWFzc2VydEVxdWFscyhtdXN0QmVDdXJyZW5jeU1lc3NhZ2UsIGdldERiYygpCi0JCQkJLmdldENvbWJpbmVkVmFsaWRhdGlvbk1lc3NhZ2UoKS5nZXRWYWx1ZSgpKTsKLQkJZW50ZXJUZXh0KHRleHQsICItJDIzLjkiKTsKLQkJYXNzZXJ0RXF1YWxzKGNhbm5vdEJlTmVnYXRpdmVNZXNzYWdlLCBnZXREYmMoKQotCQkJCS5nZXRDb21iaW5lZFZhbGlkYXRpb25NZXNzYWdlKCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0Mi4yNCwgYWR2ZW50dXJlLmdldFByaWNlKCksIDAuMDAwMSk7Ci0JCWFkdmVudHVyZS5zZXRQcmljZSgwLjApOwotCQlhc3NlcnRFcXVhbHMoIiIsIGdldERiYygpLmdldENvbWJpbmVkVmFsaWRhdGlvbk1lc3NhZ2UoKS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8wOSgpIHsKLQkJLy8gQmluZGluZyBhIGJvb2xlYW4gcHJvcGVydHkgdG8gYSBDaGVja0JveC4gQWR2ZW50dXJlIHdpbGwgaGF2ZSBhCi0JCS8vIEJvb2xlYW4gcHJvcGVydHkg77+9cGV0c0FsbG93ZWTvv70KLQkJQnV0dG9uIGNoZWNrYm94ID0gbmV3IEJ1dHRvbihnZXRDb21wb3NpdGUoKSwgU1dULkNIRUNLKTsKLQkJLy8gY2hlY2tib3guc2V0VGV4dCgiUGV0cyBhbGxvd2VkIik7Ci0JCS8vIGNoZWNrYm94LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULFNXVC5UT1AsIGZhbHNlLGZhbHNlKSk7Ci0JCWFkdmVudHVyZS5zZXRQZXRzQWxsb3dlZCh0cnVlKTsKLQkJZ2V0RGJjKCkuYmluZChjaGVja2JveCwKLQkJCQluZXcgUHJvcGVydHkoYWR2ZW50dXJlLCAicGV0c0FsbG93ZWQiKSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCXNldEJ1dHRvblNlbGVjdGlvbldpdGhFdmVudHMoY2hlY2tib3gsIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhZHZlbnR1cmUuaXNQZXRzQWxsb3dlZCgpKTsKLQkJYWR2ZW50dXJlLnNldFBldHNBbGxvd2VkKHRydWUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzEwKCkgewotCQkvLyBCaW5kaW5nIGEgVHJhbnNwb3J0YXRpb24gZGVwYXJ0dXJlIHRpbWUgdG8gYSBUZXh0IGNvbnRyb2wgdGhhdAotCQkvLyBmb3JtYXRzIGFuZCB2YWxpZGF0ZXMgdGhlIHRpbWUgdG8gYW5kIGZyb20gYSBTdHJpbmcuIFRoZXJlIGFyZQotCQkvLyBwcm9wZXJ0eSBiaW5kaW5ncyB0aGF0IGJpbmQgZWxlbWVudHMgb2YgdGhlIEdVSSB0byBlbGVtZW50cyB0byBHVUkKLQkJLy8gYW5kIGFsc28gZWxlbWVudHMgb2YgdGhlIGRvbWFpbiB0byBlbGVtZW50cyBvZiB0aGUgZG9tYWluCi0JCS8vIFRPRE8gZmFpbCgibm90IGltcGxlbWVudGVkIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMTEoKSB7Ci0JCS8vIEJpbmRpbmcgdGhlIG1heCB2YWx1ZSBvZiBhIHNwaW5uZXIgdG8gYW5vdGhlciBzcGlubmVyLgotCQlTcGlubmVyIHNwaW5uZXIxID0gbmV3IFNwaW5uZXIoZ2V0Q29tcG9zaXRlKCksIFNXVC5OT05FKTsKLQkJc3Bpbm5lcjEuc2V0U2VsZWN0aW9uKDEwKTsKLQkJc3Bpbm5lcjEuc2V0TWluaW11bSgxKTsKLQkJc3Bpbm5lcjEuc2V0TWF4aW11bSgxMDApOwotCQlTcGlubmVyIHNwaW5uZXIyID0gbmV3IFNwaW5uZXIoZ2V0Q29tcG9zaXRlKCksIFNXVC5OT05FKTsKLQkJc3Bpbm5lcjIuc2V0TWF4aW11bSgxKTsKLQkJZ2V0RGJjKCkuYmluZChzcGlubmVyMSwKLQkJCQluZXcgUHJvcGVydHkoc3Bpbm5lcjIsIFNXVFByb3BlcnRpZXMuTUFYKSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygxLCBzcGlubmVyMS5nZXRTZWxlY3Rpb24oKSk7Ci0JCXNwaW5uZXIxLnNldFNlbGVjdGlvbigxMCk7Ci0JCXNwaW5uZXIxLm5vdGlmeUxpc3RlbmVycyhTV1QuTW9kaWZ5LCBuZXcgRXZlbnQoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgc3Bpbm5lcjIuZ2V0TWF4aW11bSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8xMigpIHsKLQkJLy8gQmluZGluZyB0aGUgZW5hYmxlZCBzdGF0ZSBvZiBzZXZlcmFsIFRleHQgY29udHJvbHMgdG8gYSBjaGVjayBib3guCi0JCS8vIFRoZXJlIHdpbGwgYmUgdHdvIGNoZWNrIGJveGVzLCBzbyBhcyBlYWNoIGlzIGVuYWJsZWQvZGlzYWJsZWQgdGhlCi0JCS8vIG90aGVyIG9uZSBmb2xsb3dzIGFzIGRvIHRoZSBzdGF0ZXMgb2YgdGhlIFRleHQgY29udHJvbHMuCi0JCUJ1dHRvbiBjaGVja2JveDEgPSBuZXcgQnV0dG9uKGdldENvbXBvc2l0ZSgpLCBTV1QuQ0hFQ0spOwotCQljaGVja2JveDEuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJQnV0dG9uIGNoZWNrYm94MiA9IG5ldyBCdXR0b24oZ2V0Q29tcG9zaXRlKCksIFNXVC5DSEVDSyk7Ci0JCWNoZWNrYm94Mi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlUZXh0IHRleHQxID0gbmV3IFRleHQoZ2V0Q29tcG9zaXRlKCksIFNXVC5OT05FKTsKLQkJVGV4dCB0ZXh0MiA9IG5ldyBUZXh0KGdldENvbXBvc2l0ZSgpLCBTV1QuTk9ORSk7Ci0JCUlVcGRhdGFibGVWYWx1ZSBjaGVja2JveDFTZWxlY3RlZCA9IChJVXBkYXRhYmxlVmFsdWUpIGdldERiYygpCi0JCQkJLmNyZWF0ZVVwZGF0YWJsZShjaGVja2JveDEpOwotCQlJVXBkYXRhYmxlVmFsdWUgY2hlY2tib3gyU2VsZWN0ZWQgPSAoSVVwZGF0YWJsZVZhbHVlKSBnZXREYmMoKQotCQkJCS5jcmVhdGVVcGRhdGFibGUoY2hlY2tib3gyKTsKLQkJLy8gYmluZCB0aGUgdHdvIGNoZWNrYm94ZXMgc28gdGhhdCBpZiBvbmUgaXMgY2hlY2tlZCwgdGhlIG90aGVyIGlzIG5vdAotCQkvLyBhbmQgdmljZSB2ZXJzYS4KLQkJZ2V0RGJjKCkuYmluZChjaGVja2JveDFTZWxlY3RlZCwgY2hlY2tib3gyU2VsZWN0ZWQsCi0JCQkJbmV3IEJpbmRTcGVjKG5ldyBJQ29udmVydGVyKCkgewotCQkJCQlwdWJsaWMgQ2xhc3MgZ2V0TW9kZWxUeXBlKCkgewotCQkJCQkJcmV0dXJuIGJvb2xlYW4uY2xhc3M7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ2xhc3MgZ2V0VGFyZ2V0VHlwZSgpIHsKLQkJCQkJCXJldHVybiBib29sZWFuLmNsYXNzOwotCQkJCQl9Ci0KLQkJCQkJcHJpdmF0ZSBCb29sZWFuIG5lZ2F0ZWQoQm9vbGVhbiBib29sZWFuT2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEJvb2xlYW4oIWJvb2xlYW5PYmplY3QuYm9vbGVhblZhbHVlKCkpOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIE9iamVjdCBjb252ZXJ0VGFyZ2V0VG9Nb2RlbChPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gbmVnYXRlZCgoQm9vbGVhbikgdGFyZ2V0T2JqZWN0KTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBPYmplY3QgY29udmVydE1vZGVsVG9UYXJnZXQoT2JqZWN0IG1vZGVsT2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gbmVnYXRlZCgoQm9vbGVhbikgbW9kZWxPYmplY3QpOwotCQkJCQl9Ci0JCQkJfSwgbnVsbCkpOwotCQkvLyBiaW5kIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSB0d28gdGV4dCB3aWRnZXRzIHRvIG9uZSBvZiB0aGUKLQkJLy8gY2hlY2tib3hlcyBlYWNoLgotCQlnZXREYmMoKS5iaW5kKG5ldyBQcm9wZXJ0eSh0ZXh0MSwgU1dUUHJvcGVydGllcy5FTkFCTEVEKSwKLQkJCQljaGVja2JveDFTZWxlY3RlZCwgbnVsbCk7Ci0JCWdldERiYygpLmJpbmQobmV3IFByb3BlcnR5KHRleHQyLCBTV1RQcm9wZXJ0aWVzLkVOQUJMRUQpLAotCQkJCWNoZWNrYm94MlNlbGVjdGVkLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHRleHQxLmdldEVuYWJsZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdGV4dDIuZ2V0RW5hYmxlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNoZWNrYm94MS5nZXRTZWxlY3Rpb24oKSk7Ci0JCXNldEJ1dHRvblNlbGVjdGlvbldpdGhFdmVudHMoY2hlY2tib3gxLCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdGV4dDEuZ2V0RW5hYmxlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHRleHQyLmdldEVuYWJsZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjaGVja2JveDIuZ2V0U2VsZWN0aW9uKCkpOwotCQlzZXRCdXR0b25TZWxlY3Rpb25XaXRoRXZlbnRzKGNoZWNrYm94MiwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdGV4dDEuZ2V0RW5hYmxlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0ZXh0Mi5nZXRFbmFibGVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2hlY2tib3gxLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8xMygpIHsKLQkJLy8gQ2hhbmdpbmcgdGhlIHVwZGF0ZSBwb2xpY3kgdG8gYmUgbm90IGF1dG9tYXRpYywgYnV0IG9uIGV4cGxpY2l0Ci0JCS8vIG1ldGhvZCBjYWxsIChlLmcuIHRyaWdnZXJlZCBieSBhIGJ1dHRvbiBjbGljaykuCi0JCWdldFNXVFVwZGF0YWJsZUZhY3RvcnkoKS5zZXRVcGRhdGVUaW1lKElEYXRhQmluZGluZ0NvbnRleHQuVElNRV9MQVRFKTsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoZ2V0Q29tcG9zaXRlKCksIFNXVC5CT1JERVIpOwotCQlnZXREYmMoKS5iaW5kKHRleHQsIG5ldyBQcm9wZXJ0eShhZHZlbnR1cmUsICJuYW1lIiksIG51bGwpOwotCQkvLyB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHNlZSB3aGF0J3MgaGFwcGVuaW5nCi0JCS8vIGhhcHBlbmluZwotCQkvLyBzcGluRXZlbnRMb29wKDEpOwotCQlTdHJpbmcgYWR2ZW50dXJlTmFtZSA9IGFkdmVudHVyZS5nZXROYW1lKCk7Ci0JCWFzc2VydEVxdWFscyhhZHZlbnR1cmVOYW1lLCB0ZXh0LmdldFRleHQoKSk7Ci0JCWVudGVyVGV4dCh0ZXh0LCAiZm9vYmFyIik7Ci0JCS8vIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gc2VlIHdoYXQncyBoYXBwZW5pbmcKLQkJLy8gc3BpbkV2ZW50TG9vcCgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29iYXIiLCBhZHZlbnR1cmUuZ2V0TmFtZSgpKTsKLQkJYWR2ZW50dXJlLnNldE5hbWUoImJhcmZvbyIpOwotCQkvLyB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHNlZSB3aGF0J3MgaGFwcGVuaW5nCi0JCS8vIHNwaW5FdmVudExvb3AoMSk7Ci0JCWFzc2VydEVxdWFscygiYmFyZm9vIiwgdGV4dC5nZXRUZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzE0KCkgewotCQlUZXh0IHQxID0gbmV3IFRleHQoZ2V0Q29tcG9zaXRlKCksIFNXVC5CT1JERVIpOwotCQlUZXh0IHQyID0gbmV3IFRleHQoZ2V0Q29tcG9zaXRlKCksIFNXVC5CT1JERVIpOwotCi0JCWdldFNXVFVwZGF0YWJsZUZhY3RvcnkoKS5zZXRVcGRhdGVUaW1lKElEYXRhQmluZGluZ0NvbnRleHQuVElNRV9FQVJMWSk7Ci0JCWdldERiYygpLmJpbmQodDEsIG5ldyBQcm9wZXJ0eShhZHZlbnR1cmUsICJuYW1lIiksIG51bGwpOwotCQlnZXREYmMoKS5iaW5kKHQyLCBuZXcgUHJvcGVydHkoYWR2ZW50dXJlLCAibmFtZSIpLCBudWxsKTsKLQotCQlmaW5hbCBpbnRbXSBjb3VudGVyID0geyAwIH07Ci0JCUlVcGRhdGFibGVWYWx1ZSB1diA9IChJVXBkYXRhYmxlVmFsdWUpIGdldERiYygpLmNyZWF0ZVVwZGF0YWJsZSgKLQkJCQluZXcgUHJvcGVydHkoYWR2ZW50dXJlLCAibmFtZSIpKTsKLQkJdXYuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IElDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNoYW5nZShDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudCkgewotCQkJCS8vIENvdW50IGhvdyBtYW55IHRpbWVzIGFkdmVudHVyZSBoYXMgY2hhbmdlZAotCQkJCWNvdW50ZXJbMF0rKzsKLQkJCX0KLQkJfSk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBhZHZlbnR1cmUuZ2V0TmFtZSgpICsgIkZvbyI7Ci0JCWVudGVyVGV4dCh0MSwgbmFtZSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lLCBhZHZlbnR1cmUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWUsIHQyLmdldFRleHQoKSk7Ci0JCWFzc2VydFRydWUoY291bnRlclswXSA9PSAxKTsKLQotCQluYW1lID0gbmFtZSArICJCYXIiOwotCQl1di5zZXRWYWx1ZShuYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKHQxLmdldFRleHQoKSwgYWR2ZW50dXJlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjb3VudGVyWzBdKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvUmVhZE9ubHlDb21ib1NjZW5hcmlvcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9SZWFkT25seUNvbWJvU2NlbmFyaW9zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Mzg3NDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9SZWFkT25seUNvbWJvU2NlbmFyaW9zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy5zY2VuYXJpb3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnN3dC5TV1RQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZpZXdlcnMuVmlld2Vyc1Byb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQWNjb3VudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5BZHZlbnR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5Mb2RnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsLlNhbXBsZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlDb21ib1NjZW5hcmlvcyBleHRlbmRzIFNjZW5hcmlvc1Rlc3RDYXNlIHsKLQotCXByb3RlY3RlZCBDb21ib1ZpZXdlciBjdmlld2VyID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb21ibyBjb21ibyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZyBjYXRhbG9nID0gbnVsbDsKLQotCUlMYWJlbFByb3ZpZGVyIGxvZGdpbmdMYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoTG9kZ2luZykgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQl9Ci0JfTsKLQotCUlMYWJlbFByb3ZpZGVyIGFjY291bnRMYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoQWNjb3VudCkgZWxlbWVudCkuZ2V0Q291bnRyeSgpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWdldENvbXBvc2l0ZSgpLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotCQljb21ibyA9IG5ldyBDb21ibyhnZXRDb21wb3NpdGUoKSwgU1dULlJFQURfT05MWSB8IFNXVC5EUk9QX0RPV04pOwotCQljdmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKLQotCQljYXRhbG9nID0gU2FtcGxlRGF0YS5DQVRBTE9HXzIwMDU7IC8vIExvZGdpbmcgc291cmNlCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQljb21iby5kaXNwb3NlKCk7Ci0JCWNvbWJvID0gbnVsbDsKLQkJY3ZpZXdlciA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWaWV3ZXJTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjdmlld2VyLmdldFNlbGVjdGlvbigpKQotCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBDb21ib1ZpZXdlcidzIGRvbWFpbiBvYmplY3QgbGlzdAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFZpZXdlckNvbnRlbnQoQ29tYm9WaWV3ZXIgY3ZpZXdlcikgewotCQlPYmplY3RbXSBlbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIpIGN2aWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldEVsZW1lbnRzKG51bGwpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkKLQkJCXJldHVybiBBcnJheXMuYXNMaXN0KGVsZW1lbnRzKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgY29tYm8ncyBpdGVtcyAoU3RyaW5nW10pLCB3aGljaCBpcyB0aGUgc2FtZSB0aGluZyBhcyB0aGUKLQkgKiAgICAgICAgIFZpZXdlcidzIGxhYmVscwotCSAqIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldENvbWJvQ29udGVudCgpIHsKLQkJU3RyaW5nW10gZWxlbWVudHMgPSBjb21iby5nZXRJdGVtcygpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkKLQkJCXJldHVybiBBcnJheXMuYXNMaXN0KGVsZW1lbnRzKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q29sdW1uKE9iamVjdFtdIGxpc3QsIFN0cmluZyBmZWF0dXJlKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlTdHJpbmcgZ2V0dGVyTmFtZSA9ICJnZXQiCi0JCQkJKyBmZWF0dXJlLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkKLQkJCQkrIGZlYXR1cmUuc3Vic3RyaW5nKDEpOwotCQl0cnkgewotCQkJTWV0aG9kIGdldHRlciA9IGxpc3RbMF0uZ2V0Q2xhc3MoKS5nZXRNZXRob2QoZ2V0dGVyTmFtZSwKLQkJCQkJbmV3IENsYXNzWzBdKTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXJlc3VsdC5hZGQoZ2V0dGVyLmludm9rZShsaXN0W2ldLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgdGVzdCBjYXNlIGRlYWwgd2l0aCB0aGUgM3JkIHNjZW5hcmlvLCB1c2luZyB2YW5pbGxhIGJpbmRpbmdzOiBFbnN1cmUKLQkgKiBhIHZhbGlkIGNvbnRlbnQgYW5kIHNlbGVjdGlvbiBhcmUgYm91bmRlZCBjb3JyZWN0bHkgQmluZCBhIGNvbGxlY3Rpb24gb2YKLQkgKiBMb2RnaW5ncyB0byBhIENvbWJvVmlld2VyIEJpbmQgdGhlIENvbWJvVmlld2VyJ3Mgc2VsZWN0aW9uIHRvIHRoZQotCSAqIGRlZmF1bHRMb2RnaW5nIG9mIGFuIEFkdmVudHVyZQotCSAqIAotCSAqIFRoaXMgdGVzdCBkb2VzIG5vdCBkZWFsIHdpdGggbnVsbCB2YWx1ZXMsIGVtcHR5IGNvbnRlbnQsIGNoYW5nZWQgY29udGVudCwKLQkgKiBwcm9wZXJ0eSBjaGFuZ2Ugb2YgY29udGVudCBlbGVtZW50cywgZXRjLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfUk9Db21ib19TY2VuYXJpbzAzX3ZhbmlsbGEoKSB7Ci0KLQkJQWR2ZW50dXJlIHNraUFkdmVudHVyZSA9IFNhbXBsZURhdGEuV0lOVEVSX0hPTElEQVk7IC8vIHNlbGVjdGlvbiB3aWxsCi0JCS8vIGNoYW5nZSBpdHMgZGVmYXVsdExvZGdpbmcKLQotCQljdmlld2VyLnNldExhYmVsUHJvdmlkZXIobG9kZ2luZ0xhYmVsUHJvdmlkZXIpOwotCQkvLyBCaW5kIHRoZSBDb21ib1ZpZXdlcidzIGNvbnRlbnQgdG8gdGhlIGF2YWlsYWJsZSBsb2RnaW5nCi0JCWdldERiYygpLmJpbmQoY3ZpZXdlciwgbmV3IFByb3BlcnR5KGNhdGFsb2csICJsb2RnaW5ncyIpLAotCQkJCW51bGwpOwotCi0JCS8vIEVuc3VyZSB0aGF0IGN2J3MgY29udGVudCBub3cgaGFzIHRoZSBjYXRhbG9nJ3MgbG9kZ2luZ3MKLQkJYXNzZXJ0QXJyYXlFcXVhbHMoY2F0YWxvZy5nZXRMb2RnaW5ncygpLCBnZXRWaWV3ZXJDb250ZW50KGN2aWV3ZXIpCi0JCQkJLnRvQXJyYXkoKSk7Ci0KLQkJLy8gRW5zdXJlIHRoYXQgdGhlIGN2J3MgbGFiZWxzIGFyZSB0aGUgc2FtZSBhcyB0aGUgbG9kZ2luZyBkZXNjcmlwdGlvbnMKLQkJYXNzZXJ0RXF1YWxzKGdldENvbHVtbihjYXRhbG9nLmdldExvZGdpbmdzKCksICJuYW1lIiksCi0JCQkJZ2V0Q29tYm9Db250ZW50KCkpOwotCi0JCS8vIEJpbmQgdGhlIENvbWJvVmlld2VyJ3Mgc2VsZWN0aW9uIHRvIHRoZSBBZHZlbnR1cmUncyBkZWZhdWx0IGxvZGdpbmcuCi0JCWdldERiYygpCi0JCQkJLmJpbmQoCi0JCQkJCQluZXcgUHJvcGVydHkoY3ZpZXdlciwKLQkJCQkJCQkJVmlld2Vyc1Byb3BlcnRpZXMuU0lOR0xFX1NFTEVDVElPTiksCi0JCQkJCQluZXcgUHJvcGVydHkoc2tpQWR2ZW50dXJlLCAiZGVmYXVsdExvZGdpbmciKSwKLQkJCQkJCW51bGwpOwotCi0JCS8vIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBpbml0aWFsIHNlbGVjdGlvbiBpcyB0aGUgY3VycmVudERlZmF1bHQgTG9kZ2luZwotCQlhc3NlcnRFcXVhbHMoZ2V0Vmlld2VyU2VsZWN0aW9uKCksIHNraUFkdmVudHVyZS5nZXREZWZhdWx0TG9kZ2luZygpKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHNlbGVjdGlvbiBvZiB0aGUgQ29tYm9WaWV3ZXIgdG8gYWxsIHBvc3NpYmxlIGxvZGdpbmdzLCBhbmQKLQkJLy8gdmVyaWZ5IHRoYXQgc2tpQWR2ZW50dXJlJ3MgZGVmYXVsdCBsb2RnaW5nIHdhcyBjaGFuZ2VkIGFjY29yZGluZ2x5Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0YWxvZy5nZXRMb2RnaW5ncygpLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3Qgc2VsZWN0aW9uID0gY2F0YWxvZy5nZXRMb2RnaW5ncygpW2ldOwotCQkJY3ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQlhc3NlcnRFcXVhbHMoc2VsZWN0aW9uLCBza2lBZHZlbnR1cmUuZ2V0RGVmYXVsdExvZGdpbmcoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoZ2V0Vmlld2VyU2VsZWN0aW9uKCksIHNraUFkdmVudHVyZS5nZXREZWZhdWx0TG9kZ2luZygpKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyB0ZXN0IGNhc2UgZGVhbCB3aXRoIHRoZSAzcmQgc2NlbmFyaW8sIGFuZCBmb2N1c2VzIG9uIHRoZSBjb2xsZWN0aW9uCi0JICogYmluZGluZyB0byB0aGUgY29tYm8uIEl0IHdpbGwgYmluZCBhIGNvbGxlY3Rpb24sIGFkZC9yZW1vdmUvY2hhbmdlCi0JICogZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24sIGFuZCBjaGFuZ2UgZWxlbWVudCdzIHByb3BlcnRpZXMgdG8gZW5zdXJlCi0JICogdGhhdCB0aGUgY29tYm8ncyBsYWJlbHMgd2VyZSB1cGRhdGVkIGFwcHJvcHJpYXRseS4KLQkgKiAKLQkgKiBpdCBhbHNvIGluZHVjZSBudWxsIHZhbHVlcyBpbiBwcm9wZXJ0aWVzLCBhbmQgZWxtZW50cy4KLQkgKiAKLQkgKiBUaGlzIHRlc3QgZG9lcyBub3QgZGVhbCB3aXRoIHRoZSBjb21ibydzIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X1JPQ29tYm9fU2NlbmFyaW8wM19jb2xsZWN0aW9uQmluZGluZ3MoKSB7Ci0KLQkJY3ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxvZGdpbmdMYWJlbFByb3ZpZGVyKTsgLy8gVE9ETzogbmVlZCB0byByZXNvbHZlCi0JCS8vIGNvbHVtbiBiaW5kaW5nCi0JCS8vIEJpbmQgdGhlIENvbWJvVmlld2VyJ3MgY29udGVudCB0byB0aGUgYXZhaWxhYmxlIGxvZGdpbmcKLQkJZ2V0RGJjKCkuYmluZChjdmlld2VyLCBuZXcgUHJvcGVydHkoY2F0YWxvZywgImxvZGdpbmdzIiksCi0JCQkJbnVsbCk7Ci0KLQkJLy8gRW5zdXJlIHRoYXQgY3YncyBjb250ZW50IG5vdyBoYXMgdGhlIGNhdGFsb2cncyBsb2RnaW5ncwotCQlhc3NlcnRBcnJheUVxdWFscyhjYXRhbG9nLmdldExvZGdpbmdzKCksIGdldFZpZXdlckNvbnRlbnQoY3ZpZXdlcikKLQkJCQkudG9BcnJheSgpKTsKLQotCQkvLyBFbnN1cmUgdGhhdCB0aGUgY3YncyBsYWJlbHMgYXJlIHRoZSBzYW1lIGFzIHRoZSBsb2RnaW5nIGRlc2NyaXB0aW9ucwotCQlhc3NlcnRFcXVhbHMoZ2V0Q29sdW1uKGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKSwgIm5hbWUiKSwKLQkJCQlnZXRDb21ib0NvbnRlbnQoKSk7Ci0KLQkJLy8gQWRkIGEgbG9kZ2luZyBpbiB0aGUgbWlkZGxlIChub3Qgc3VwcG9ydGVkIGJ5IHRoZSBtb2RlbCByaWdodCBub3cpCi0JCS8vIExvZGdpbmcgbG9kZ2luZyA9IFNhbXBsZURhdGEuRkFDVE9SWS5jcmVhdGVMb2RnaW5nKCk7Ci0JCS8vIGxvZGdpbmcuc2V0TmFtZSgiTWlkZGxlIExvZGdpbmciKTsKLQkJLy8gY2F0YWxvZy5hZGRMb2RnaW5nKGxvZGdpbmcpOwotCQkvLyBhc3NlcnRFcXVhbHMoZ2V0Vmlld2VyQ29udGVudChjdmlld2VyKS5nZXQoMiksIGxvZGdpbmcpOwotCi0JCS8vIEFkZCBhIGxvZGdpbmcgYXQgdGhlIGVuZAotCQlMb2RnaW5nIGxvZGdpbmcgPSBTYW1wbGVEYXRhLkZBQ1RPUlkuY3JlYXRlTG9kZ2luZygpOwotCQlsb2RnaW5nLnNldE5hbWUoIkVuZCBMb2RnaW5nIik7Ci0JCWNhdGFsb2cuYWRkTG9kZ2luZyhsb2RnaW5nKTsKLQkJaW50IGluZGV4ID0gZ2V0Q29tYm9Db250ZW50KCkuc2l6ZSgpIC0gMTsKLQkJYXNzZXJ0RXF1YWxzKGdldFZpZXdlckNvbnRlbnQoY3ZpZXdlcikuZ2V0KGluZGV4KSwgbG9kZ2luZyk7Ci0KLQkJLy8gRGVsZXRlIHRoZSBmaXJzdCBMb2RnaW5nCi0JCWNhdGFsb2cucmVtb3ZlTG9kZ2luZyhjYXRhbG9nLmdldExvZGdpbmdzKClbMF0pOwotCQkvLyBFbnN1cmUgdGhhdCB0aGUgY3YncyBsYWJlbHMgYXJlIHRoZSBzYW1lIGFzIHRoZSBsb2RnaW5nIGRlc2NyaXB0aW9ucwotCQlhc3NlcnRFcXVhbHMoZ2V0Q29sdW1uKGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKSwgIm5hbWUiKSwKLQkJCQlnZXRDb21ib0NvbnRlbnQoKSk7Ci0KLQkJLy8gRGVsZXRlIG1pZGRsZSBMb2RnaW5nCi0JCWNhdGFsb2cucmVtb3ZlTG9kZ2luZyhjYXRhbG9nLmdldExvZGdpbmdzKClbMl0pOwotCQkvLyBFbnN1cmUgdGhhdCB0aGUgY3YncyBsYWJlbHMgYXJlIHRoZSBzYW1lIGFzIHRoZSBsb2RnaW5nIGRlc2NyaXB0aW9ucwotCQlhc3NlcnRFcXVhbHMoZ2V0Q29sdW1uKGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKSwgIm5hbWUiKSwKLQkJCQlnZXRDb21ib0NvbnRlbnQoKSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSBuYW1lcyBvZiBhbGwgTG9kZ2luZwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKS5sZW5ndGg7IGkrKykgewotCQkJTG9kZ2luZyBsID0gY2F0YWxvZy5nZXRMb2RnaW5ncygpW2ldOwotCQkJbC5zZXROYW1lKCJDaGFuZ2VkOiAiICsgbC5nZXROYW1lKCkpOwotCQl9Ci0JCXNwaW5FdmVudExvb3AoMCk7IC8vIGZvcmNlIEFzeW5jLiBlZmZvcnRzCi0JCWFzc2VydEVxdWFscyhnZXRDb2x1bW4oY2F0YWxvZy5nZXRMb2RnaW5ncygpLCAibmFtZSIpLAotCQkJCWdldENvbWJvQ29udGVudCgpKTsKLQotCQkvLyBTZXQgdG8gbnVsbCB2YWx1ZQotCQlMb2RnaW5nIGwgPSBjYXRhbG9nLmdldExvZGdpbmdzKClbMF07Ci0JCWwuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbWJvLmdldEl0ZW0oMCksICIiKTsKLQotCQkvLyBzZXQgdG8gZW1wdHkgbGlzdAotCQl3aGlsZSAoY2F0YWxvZy5nZXRMb2RnaW5ncygpLmxlbmd0aCA+IDApCi0JCQljYXRhbG9nLnJlbW92ZUxvZGdpbmcoY2F0YWxvZy5nZXRMb2RnaW5ncygpWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKGdldENvbHVtbihjYXRhbG9nLmdldExvZGdpbmdzKCksICJuYW1lIiksCi0JCQkJZ2V0Q29tYm9Db250ZW50KCkpOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBzY2VuYXJpbyB0ZXN0cyBhIHNpbXBsZSBTV1QgY29tYm8gd2l0aCBhIHNldCBpdGVtIGxpc3Qgd2hlcmUgdGhlCi0JICogc2VsZWN0aW9uIGlzIGJvdWRlZCB0byBhIFN0cmluZyBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfUk9Db21ib19TY2VuYXJpbzAxKCkgewotCi0JCS8vIFJlYWQtT25seSBDb21ibyB3aWxsIG5vdCBjaGFuZ2UgaXRzIHRleHQgcHJvcGVydHkgb24gYSBjYWxsIHRvCi0JCS8vIHNldFRleHQoKQotCi0JCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tdIHsgIkZhaXJ5TGFuZCIsICJUdW5lTGFuZCIsICJOb1dlcmVMYW5kIiwKLQkJCQkiVGlua2VyTGFuZCIsICJEcmVhbUxhbmQiIH07Ci0JCWNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQkJQWNjb3VudCBhY2NvdW50ID0gKEFjY291bnQpIGNhdGFsb2cuZ2V0QWNjb3VudHMoKVswXTsKLQotCQkvLyBzaW1wbGUgQ29tYm8ncyBzZWxlY3Rpb24gYm91bmQgdG8gdGhlIEFjY291bnQncyBjb3VudHJ5IHByb3BlcnR5Ci0JCWdldERiYygpLmJpbmQoCi0JCQkJbmV3IFByb3BlcnR5KGNvbWJvLCBTV1RQcm9wZXJ0aWVzLlNFTEVDVElPTiksCi0JCQkJbmV3IFByb3BlcnR5KGFjY291bnQsICJjb3VudHJ5IiksIG51bGwpOwotCi0JCS8vIERyaXZlIHRoZSBjb21ibyBzZWxlY3Rpb24KLQkJaW50IGluZGV4ID0gMzsKLQkJY29tYm8uc2V0VGV4dChpdGVtc1tpbmRleF0pOyAvLyB0aGlzIHNob3VsZCBkcml2ZSB0aGUgc2VsZWN0aW9uCi0JCWFzc2VydEVxdWFscyhhY2NvdW50LmdldENvdW50cnkoKSwgaXRlbXNbaW5kZXhdKTsKLQotCQkvLyBTZXQgdGhlIGNvdW50cnksIGFuZCBlbnN1cmUgc2VsZWN0aW9uIGlzIHNldCBwcm9wZXJ0eQotCQlpbmRleCA9IDE7Ci0JCWFjY291bnQuc2V0Q291bnRyeShpdGVtc1tpbmRleF0pOwotCQlhc3NlcnRFcXVhbHMoaW5kZXgsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoY29tYm8uZ2V0VGV4dCgpLCBpdGVtc1tpbmRleF0pOwotCi0JCWluZGV4ID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJU3RyaW5nIHR4dCA9IGNvbWJvLmdldFRleHQoKTsKLQkJLy8gU2V0IHRoZSBjb3VudHJ5IHRvIHNvbWV0aGluZyB0aGF0IGlzIG5vdCBpbiB0aGUgQ29tYm8ncyBsaXN0Ci0JCWFjY291bnQuc2V0Q291bnRyeSgiRm9vQmFyIik7Ci0JCS8vIENvbWJvJ3Mgc2VsZWN0aW9uIHdpbGwgbm90IENoYW5nZQotCQlhc3NlcnRFcXVhbHMoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSwgaW5kZXgpOwotCQlhc3NlcnRFcXVhbHMoY29tYm8uZ2V0VGV4dCgpLCB0eHQpOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBzY2VuYXJpbyB0ZXN0cyBhIHNpbXBsZSBTV1QgY29tYm8gdGhhdCBpcyBib3VuZCB0byBhIGxpc3Qgb2YgQ291bnRyeQotCSAqIG9iamVjdHMuIFRoZSBDb3VudHJ5IG9iamVjdCdzIG5hbWUgcHJvcGVydHkgaXMgbGlzdGVkIGluIHRoZSBDb21iby4KLQkgKiAKLQkgKiBUaGUgQ29tYm8ncyBzZWxlY3Rpb24gaXMgYm91bmRlZCB0byB0aGUgQ291bnRyeSBwcm9wZXJ0eSBvZiBhbiBBY2NvdW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfUk9Db21ib19TY2VuYXJpbzAyX1NXVENvbWJvKCkgewotCi0JCS8vIENyZWF0ZSBhIGxpc3Qgb2YgU3RyaW5ncyBmb3IgdGhlIGNvdW50cmllcwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0YWxvZy5nZXRBY2NvdW50cygpLmxlbmd0aDsgaSsrKQotCQkJbGlzdC5hZGQoY2F0YWxvZy5nZXRBY2NvdW50cygpW2ldLmdldENvdW50cnkoKSk7Ci0KLQkJLy8gQmluZCB0aGUgY29tYm8ncyBjb250ZW50IHRvIHRoYXQgb2YgdGhlIFN0cmluZyBiYXNlZCBsaXN0Ci0JCWdldERiYygpLmJpbmQoY29tYm8sIG5ldyBQcm9wZXJ0eShsaXN0LCBudWxsKSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KGNvbWJvLmdldEl0ZW1zKCkpLCBsaXN0KTsKLQotCQlBY2NvdW50IGFjY291bnQgPSBjYXRhbG9nLmdldEFjY291bnRzKClbMF07Ci0KLQkJLy8gc2ltcGxlIENvbWJvJ3Mgc2VsZWN0aW9uIGJvdW5kIHRvIHRoZSBBY2NvdW50J3MgY291bnRyeSBwcm9wZXJ0eQotCQlnZXREYmMoKS5iaW5kKAotCQkJCW5ldyBQcm9wZXJ0eShjb21ibywgU1dUUHJvcGVydGllcy5TRUxFQ1RJT04pLAotCQkJCW5ldyBQcm9wZXJ0eShhY2NvdW50LCAiY291bnRyeSIpLCBudWxsKTsKLQotCQkvLyBEcml2ZSB0aGUgY29tYm8gc2VsZWN0aW9uCi0JCVN0cmluZyBzZWxlY3Rpb24gPSAoU3RyaW5nKSBsaXN0LmdldCgyKTsKLQkJY29tYm8uc2V0VGV4dChzZWxlY3Rpb24pOyAvLyB0aGlzIHNob3VsZCBkcml2ZSB0aGUgc2VsZWN0aW9uCi0JCWFzc2VydEVxdWFscyhhY2NvdW50LmdldENvdW50cnkoKSwgc2VsZWN0aW9uKTsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgc2NlbmFyaW8gdGVzdHMgYSBzaW1wbGUgU1dUIGNvbWJvIHRoYXQgaXMgYm91bmQgdG8gYSBsaXN0IG9mIENvdW50cnkKLQkgKiBvYmplY3RzLiBUaGUgQ291bnRyeSBvYmplY3QncyBuYW1lIHByb3BlcnR5IGlzIGxpc3RlZCBpbiB0aGUgQ29tYm8uCi0JICogCi0JICogVGhlIENvbWJvJ3Mgc2VsZWN0aW9uIGlzIGJvdW5kZWQgdG8gdGhlIENvdW50cnkgcHJvcGVydHkgb2YgYW4gQWNjb3VudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X1JPQ29tYm9fU2NlbmFyaW8wMl9Db21ib1ZpZXdlcigpIHsKLQotCQkvLyBBY2NvdW50IGxhYmVsIHByb3ZpZGVyIHdpbGwgZmlsbCB0aGUgY29tYm8gd2l0aCB0aGUgY291bnRyeQotCQljdmlld2VyLnNldExhYmVsUHJvdmlkZXIoYWNjb3VudExhYmVsUHJvdmlkZXIpOwotCQkvLyBCaW5kIHRoZSBDb21ib1ZpZXdlcidzIGNvbnRlbnQgdG8gdGhlIGF2YWlsYWJsZSBhY2NvdW50cwotCQlnZXREYmMoKS5iaW5kKGN2aWV3ZXIsIG5ldyBQcm9wZXJ0eShjYXRhbG9nLCAiYWNjb3VudHMiKSwKLQkJCQludWxsKTsKLQotCQkvLyBFbnN1cmUgdGhhdCBjdidzIGNvbnRlbnQgbm93IGhhcyB0aGUgY2F0YWxvZydzIGFjY291bnRzCi0JCWFzc2VydEFycmF5RXF1YWxzKGNhdGFsb2cuZ2V0QWNjb3VudHMoKSwgZ2V0Vmlld2VyQ29udGVudChjdmlld2VyKS50b0FycmF5KCkpOwotCQkvLyBFbnN1cmUgdGhhdCB0aGUgY3YncyBsYWJlbHMgYXJlIHRoZSBzYW1lIGFzIHRoZSBhY2NvdW50IGNvdW50cmllcwotCQlhc3NlcnRFcXVhbHMoZ2V0Q29sdW1uKGNhdGFsb2cuZ2V0QWNjb3VudHMoKSwgImNvdW50cnkiKSwKLQkJCQlnZXRDb21ib0NvbnRlbnQoKSk7Ci0KLQkJQWNjb3VudCBhY2NvdW50ID0gU2FtcGxlRGF0YS5GQUNUT1JZLmNyZWF0ZUFjY291bnQoKTsKLQotCQkvLyBVc2UgdGhlIFZpZXdlcnMgdmlzdWFsIENvbWJvIChTdHJpbmdzKSB0byBzZXQgdGhlIGFjY291bnQncyBjb3VudHJ5Ci0JCWdldERiYygpLmJpbmQoCi0JCQkJbmV3IFByb3BlcnR5KGNvbWJvLCBTV1RQcm9wZXJ0aWVzLlNFTEVDVElPTiksCi0JCQkJbmV3IFByb3BlcnR5KGFjY291bnQsICJjb3VudHJ5IiksIG51bGwpOwotCi0JCS8vIENoYW5nZSB0aGUgc2VsZWN0aW9uIG9mIHRoZSBDb21ib1ZpZXdlciB0byBhbGwgcG9zc2libGUgYWNjb3VudHMsIGFuZAotCQkvLyB2ZXJpZnkgdGhhdCB0aGUgYWNjb3VudCdzIENvdW50cnkgaXMgYmVpbmcgY2hhbmdlZCBjb3JyZWN0bHkuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0YWxvZy5nZXRBY2NvdW50cygpLmxlbmd0aDsgaSsrKSB7Ci0JCQlBY2NvdW50IHNlbGVjdGlvbiA9IGNhdGFsb2cuZ2V0QWNjb3VudHMoKVtpXTsKLQkJCWN2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJYXNzZXJ0RXF1YWxzKHNlbGVjdGlvbi5nZXRDb3VudHJ5KCksIGFjY291bnQuZ2V0Q291bnRyeSgpKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyB0ZXN0IGVuc3VyZSB0aGF0IG11bHRpcGxlIGNvbWJvcyBjYW4gYmUgYm91bmQgdG8gdGhlIHNhbWUgZGVvbWFpbgotCSAqIG1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9ST0NvbWJvX211bHRpcGxlQmluZGluZ3MoKSB7Ci0KLQkJQWR2ZW50dXJlIHNraUFkdmVudHVyZSA9IFNhbXBsZURhdGEuV0lOVEVSX0hPTElEQVk7IC8vIGZvciBzZWxlY3Rpb24KLQotCQljdmlld2VyLnNldExhYmVsUHJvdmlkZXIobG9kZ2luZ0xhYmVsUHJvdmlkZXIpOyAvLyBUT0RPOiBuZWVkIHRvIHJlc29sdmUKLQkJLy8gY29sdW1uIGJpbmRpbmcKLQkJLy8gQmluZCB0aGUgQ29tYm9WaWV3ZXIncyBjb250ZW50IHRvIHRoZSBhdmFpbGFibGUgbG9kZ2luZwotCQlnZXREYmMoKS5iaW5kKGN2aWV3ZXIsIG5ldyBQcm9wZXJ0eShjYXRhbG9nLCAibG9kZ2luZ3MiKSwKLQkJCQludWxsKTsKLQotCQkvLyBFbnN1cmUgdGhhdCBjdidzIGNvbnRlbnQgbm93IGhhcyB0aGUgY2F0YWxvZydzIGxvZGdpbmdzCi0JCWFzc2VydEFycmF5RXF1YWxzKGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKSwgZ2V0Vmlld2VyQ29udGVudChjdmlld2VyKS50b0FycmF5KCkpOwotCi0JCS8vIEVuc3VyZSB0aGF0IHRoZSBjdidzIGxhYmVscyBhcmUgdGhlIHNhbWUgYXMgdGhlIGxvZGdpbmcgZGVzY3JpcHRpb25zCi0JCWFzc2VydEVxdWFscyhnZXRDb2x1bW4oY2F0YWxvZy5nZXRMb2RnaW5ncygpLCAibmFtZSIpLAotCQkJCWdldENvbWJvQ29udGVudCgpKTsKLQotCQlDb21ib1ZpZXdlciBvdGhlclZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihnZXRDb21wb3NpdGUoKSwgU1dULk5PTkUpOwotCQlvdGhlclZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxvZGdpbmdMYWJlbFByb3ZpZGVyKTsKLQkJZ2V0RGJjKCkuYmluZChvdGhlclZpZXdlciwKLQkJCQluZXcgUHJvcGVydHkoY2F0YWxvZywgImxvZGdpbmdzIiksIG51bGwpOwotCQkvLyBFbnN1cmUgdGhhdCBjdidzIGNvbnRlbnQgbm93IGhhcyB0aGUgY2F0YWxvZydzIGxvZGdpbmdzCi0JCWFzc2VydEFycmF5RXF1YWxzKGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKSwgZ2V0Vmlld2VyQ29udGVudChvdGhlclZpZXdlcikudG9BcnJheSgpKTsKLQotCQkvLyBCaW5kIGJvdGggc2VsZWN0aW9ucyB0byB0aGUgc2FtZSB0aGluZwotCQlnZXREYmMoKQotCQkJCS5iaW5kKAotCQkJCQkJbmV3IFByb3BlcnR5KGN2aWV3ZXIsCi0JCQkJCQkJCVZpZXdlcnNQcm9wZXJ0aWVzLlNJTkdMRV9TRUxFQ1RJT04pLAotCQkJCQkJbmV3IFByb3BlcnR5KHNraUFkdmVudHVyZSwgImRlZmF1bHRMb2RnaW5nIiksCi0JCQkJCQludWxsKTsKLQkJZ2V0RGJjKCkuYmluZCgKLQkJCQluZXcgUHJvcGVydHkob3RoZXJWaWV3ZXIsCi0JCQkJCQlWaWV3ZXJzUHJvcGVydGllcy5TSU5HTEVfU0VMRUNUSU9OKSwKLQkJCQluZXcgUHJvcGVydHkoc2tpQWR2ZW50dXJlLCAiZGVmYXVsdExvZGdpbmciKSwgbnVsbCk7Ci0KLQkJTG9kZ2luZyBsb2RnaW5nID0gKExvZGdpbmcpIGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKVswXTsKLQotCQkvLyBFbnN1cmUgdGhhdCBzZXR0aW5nIHRoZSBzZWxlY3Rpb24gaXMgZHJpdmVuIGZvcndhcmQgdG8gdGhlIG90aGVyCi0JCS8vIGNvbWJvCi0JCWN2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxvZGdpbmcpKTsKLQkJYXNzZXJ0RXF1YWxzKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN2aWV3ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJLmdldEZpcnN0RWxlbWVudCgpLCAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvdGhlclZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCi0JCS8vIENoYW5nZSB0aGUgbGlzdCBvZiBvbmUgY29tYm8sIGFuZCBlbnN1cmUgaXQgdXBkYXRlcyB0aGUgb3RoZXIgY29tYm8KLQkJY2F0YWxvZy5yZW1vdmVMb2RnaW5nKGxvZGdpbmcpOwotCQlhc3NlcnRFcXVhbHMoZ2V0Vmlld2VyQ29udGVudChjdmlld2VyKSwgZ2V0Vmlld2VyQ29udGVudChvdGhlclZpZXdlcikpOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBzY2VuYXJpbyB0ZXN0cyBhIHNpbXBsZSBTV1QgQ0NvbWJvIHRoYXQgaXMgYm91bmQgdG8gYSBsaXN0IG9mCi0JICogQ291bnRyeSBvYmplY3RzLiBUaGUgQ291bnRyeSBvYmplY3QncyBuYW1lIHByb3BlcnR5IGlzIGxpc3RlZCBpbiB0aGUKLQkgKiBDb21iby4KLQkgKiAKLQkgKiBUaGUgQ29tYm8ncyBzZWxlY3Rpb24gaXMgYm91bmRlZCB0byB0aGUgQ291bnRyeSBwcm9wZXJ0eSBvZiBhbiBBY2NvdW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfUk9Db21ib19TV1RDQ29tYm8oKSB7Ci0KLQkJLy8gQ3JlYXRlIGEgbGlzdCBvZiBTdHJpbmdzIGZvciB0aGUgY291bnRyaWVzCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRhbG9nLmdldEFjY291bnRzKCkubGVuZ3RoOyBpKyspCi0JCQlsaXN0LmFkZChjYXRhbG9nLmdldEFjY291bnRzKClbaV0uZ2V0Q291bnRyeSgpKTsKLQotCQlDQ29tYm8gY2NvbWJvID0gbmV3IENDb21ibyhnZXRDb21wb3NpdGUoKSwgU1dULlJFQURfT05MWQotCQkJCXwgU1dULkRST1BfRE9XTik7Ci0KLQkJLy8gQmluZCB0aGUgY29tYm8ncyBjb250ZW50IHRvIHRoYXQgb2YgdGhlIFN0cmluZyBiYXNlZCBsaXN0Ci0JCWdldERiYygpLmJpbmQoY2NvbWJvLCBuZXcgUHJvcGVydHkobGlzdCwgbnVsbCksIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdChjY29tYm8uZ2V0SXRlbXMoKSksIGxpc3QpOwotCi0JCUFjY291bnQgYWNjb3VudCA9IChBY2NvdW50KSBjYXRhbG9nLmdldEFjY291bnRzKClbMF07Ci0KLQkJLy8gc2ltcGxlIENvbWJvJ3Mgc2VsZWN0aW9uIGJvdW5kIHRvIHRoZSBBY2NvdW50J3MgY291bnRyeSBwcm9wZXJ0eQotCQlnZXREYmMoKS5iaW5kKAotCQkJCW5ldyBQcm9wZXJ0eShjY29tYm8sIFNXVFByb3BlcnRpZXMuU0VMRUNUSU9OKSwKLQkJCQluZXcgUHJvcGVydHkoYWNjb3VudCwgImNvdW50cnkiKSwgbnVsbCk7Ci0KLQkJLy8gRHJpdmUgdGhlIGNvbWJvIHNlbGVjdGlvbgotCQlTdHJpbmcgc2VsZWN0aW9uID0gKFN0cmluZykgbGlzdC5nZXQoMik7Ci0JCWNjb21iby5zZXRUZXh0KHNlbGVjdGlvbik7IC8vIHRoaXMgc2hvdWxkIGRyaXZlIHRoZSBzZWxlY3Rpb24KLQkJYXNzZXJ0RXF1YWxzKGFjY291bnQuZ2V0Q291bnRyeSgpLCBzZWxlY3Rpb24pOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBzY2VuYXJpbyB0ZXN0cyBhIHNpbXBsZSBTV1QgQ0NvbWJvIHRoYXQgaXMgYm91bmQgdG8gYSBsaXN0IG9mCi0JICogQ291bnRyeSBvYmplY3RzLiBUaGUgQ291bnRyeSBvYmplY3QncyBuYW1lIHByb3BlcnR5IGlzIGxpc3RlZCBpbiB0aGUKLQkgKiBDb21iby4KLQkgKiAKLQkgKiBUaGUgQ29tYm8ncyBzZWxlY3Rpb24gaXMgYm91bmRlZCB0byB0aGUgQ291bnRyeSBwcm9wZXJ0eSBvZiBhbiBBY2NvdW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfUk9Db21ib19TV1RMaXN0KCkgewotCi0JCS8vIENyZWF0ZSBhIGxpc3Qgb2YgU3RyaW5ncyBmb3IgdGhlIGNvdW50cmllcwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0YWxvZy5nZXRBY2NvdW50cygpLmxlbmd0aDsgaSsrKQotCQkJbGlzdC5hZGQoY2F0YWxvZy5nZXRBY2NvdW50cygpW2ldLmdldENvdW50cnkoKSk7Ci0KLQkJb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBzd3RsaXN0ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QoCi0JCQkJZ2V0Q29tcG9zaXRlKCksIFNXVC5SRUFEX09OTFkgfCBTV1QuU0lOR0xFKTsKLQotCQkvLyBCaW5kIHRoZSBjb21ibydzIGNvbnRlbnQgdG8gdGhhdCBvZiB0aGUgU3RyaW5nIGJhc2VkIGxpc3QKLQkJZ2V0RGJjKCkuYmluZChzd3RsaXN0LCBuZXcgUHJvcGVydHkobGlzdCwgbnVsbCksIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdChzd3RsaXN0LmdldEl0ZW1zKCkpLCBsaXN0KTsKLQotCQlBY2NvdW50IGFjY291bnQgPSAoQWNjb3VudCkgY2F0YWxvZy5nZXRBY2NvdW50cygpWzBdOwotCi0JCS8vIHNpbXBsZSBDb21ibydzIHNlbGVjdGlvbiBib3VuZCB0byB0aGUgQWNjb3VudCdzIGNvdW50cnkgcHJvcGVydHkKLQkJZ2V0RGJjKCkKLQkJCQkuYmluZCgKLQkJCQkJCW5ldyBQcm9wZXJ0eShzd3RsaXN0LAotCQkJCQkJCQlTV1RQcm9wZXJ0aWVzLlNFTEVDVElPTiksCi0JCQkJCQluZXcgUHJvcGVydHkoYWNjb3VudCwgImNvdW50cnkiKSwgbnVsbCk7Ci0KLQkJU3RyaW5nIHNlbGVjdGlvbiA9IChTdHJpbmcpIGxpc3QuZ2V0KDIpOwotCQlzd3RsaXN0LnNlbGVjdCgyKTsgLy8gdGhpcyBzaG91bGQgZHJpdmUgdGhlIHNlbGVjdGlvbgotCQlzd3RsaXN0Lm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBudWxsKTsgLy8gRm9yY2Ugbm90aWZpY2F0aW9uCi0JCWFzc2VydEVxdWFscyhhY2NvdW50LmdldENvdW50cnkoKSwgc2VsZWN0aW9uKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9TY2VuYXJpb3NUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9TY2VuYXJpb3NUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTBjYTAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvU2NlbmFyaW9zVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLnNjZW5hcmlvczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JRGF0YUJpbmRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnN3dC5TV1RVcGRhdGFibGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsLlNhbXBsZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiB0aGUgSkZhY2UgYmluZGluZyBzY2VuYXJpbyB0ZXN0IGNsYXNzZXMuCi0gKi8KLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIFNjZW5hcmlvc1Rlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJpdmF0ZSBJRGF0YUJpbmRpbmdDb250ZXh0IGRiYzsKLQotCXByaXZhdGUgRGlzcGxheSBkaXNwbGF5OwotCi0JcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VEaXNwbGF5ID0gZmFsc2U7Ci0KLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JcHJvdGVjdGVkIFRleHQgZHVtbXlUZXh0OwotCi0JcHJpdmF0ZSBTV1RVcGRhdGFibGVGYWN0b3J5IHN3dFVwZGF0YWJsZUZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGdldENvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFCaW5kaW5nQ29udGV4dCBnZXREYmMoKSB7Ci0JCXJldHVybiBkYmM7Ci0JfQotCQotCXByb3RlY3RlZCBTV1RVcGRhdGFibGVGYWN0b3J5IGdldFNXVFVwZGF0YWJsZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBzd3RVcGRhdGFibGVGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCXJldHVybiBzaGVsbDsKLQkJfQotCQlTaGVsbCByZXN1bHQgPSBCaW5kaW5nU2NlbmFyaW9zVGVzdFN1aXRlLmdldFNoZWxsKCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJaWYgKERpc3BsYXkuZ2V0RGVmYXVsdCgpID09IG51bGwpIHsKLQkJCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJCQlkaXNwb3NlRGlzcGxheSA9IHRydWU7Ci0JCQl9Ci0JCQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSk7Ci0JCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQlyZXN1bHQgPSBzaGVsbDsKLQkJfQotCQlyZXN1bHQuc2V0VGV4dChnZXROYW1lKCkpOyAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBzaGVsbCgpIGJlY29tZXMKLQkJLy8gdmlzaWJsZS4KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzcGluRXZlbnRMb29wKGludCBzZWNvbmRzVG9XYWl0V2l0aE5vRXZlbnRzKSB7Ci0JCWlmICghY29tcG9zaXRlLmlzVmlzaWJsZSgpICYmIHNlY29uZHNUb1dhaXRXaXRoTm9FdmVudHMgPiAwKSB7Ci0JCQljb21wb3NpdGUuZ2V0U2hlbGwoKS5vcGVuKCk7Ci0JCX0KLQkJd2hpbGUgKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkucmVhZEFuZERpc3BhdGNoKCkpIHsKLQkJCS8vIGRvIG5vdGhpbmcsIGp1c3QgcHJvY2VzcyBldmVudHMKLQkJfQotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKHNlY29uZHNUb1dhaXRXaXRoTm9FdmVudHMgKiAxMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcmFjdCgpIHsKLQkJaWYgKCFnZXRTaGVsbCgpLmlzVmlzaWJsZSgpKSB7Ci0JCQlnZXRTaGVsbCgpLm9wZW4oKTsKLQkJfQotCQl3aGlsZSAoIWdldFNoZWxsKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuc2xlZXAoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEJ1dHRvblNlbGVjdGlvbldpdGhFdmVudHMoQnV0dG9uIGJ1dHRvbiwgYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAoYnV0dG9uLmdldFNlbGVjdGlvbigpID09IHZhbHVlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnV0dG9uLnNldFNlbGVjdGlvbih2YWx1ZSk7Ci0JCXB1c2hCdXR0b25XaXRoRXZlbnRzKGJ1dHRvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJ1dHRvbldpdGhFdmVudHMoQnV0dG9uIGJ1dHRvbikgewotCQlidXR0b24ubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlTYW1wbGVEYXRhLmluaXRpYWxpemVEYXRhKCk7IC8vIHRlc3QgbWF5IG1hbmlwdWxhdGUgdGhlIGRhdGEuLi4gbGV0Ci0JCS8vIGFsbCBzdGFydCBmcm9tIGZyZXNoCi0JCWRiYyA9IFNhbXBsZURhdGEuZ2V0RGF0YWJpbmRpbmdDb250ZXh0KGNvbXBvc2l0ZSk7Ci0JCXN3dFVwZGF0YWJsZUZhY3RvcnkgPSBTYW1wbGVEYXRhLmdldFNXVFVwZGF0YWJsZUZhY3RvcnkoKTsKLQkJZHVtbXlUZXh0ID0gbmV3IFRleHQoZ2V0Q29tcG9zaXRlKCksIFNXVC5OT05FKTsKLQkJZHVtbXlUZXh0LnNldFRleHQoImR1bW15Iik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2V0U2hlbGwoKS5zZXRWaXNpYmxlKGZhbHNlKTsgLy8gc2FtZSBTaGVsbCBtYXkgYmUgcmVVc2VkIGFjcm9zcyB0ZXN0cwotCQljb21wb3NpdGUuZGlzcG9zZSgpOwotCQljb21wb3NpdGUgPSBudWxsOwotCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJc2hlbGwuY2xvc2UoKTsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJfSBlbHNlCi0JCQlkYmMuZGlzcG9zZSgpOwotCQlpZiAoZGlzcGxheSAhPSBudWxsICYmIGRpc3Bvc2VEaXNwbGF5KSB7Ci0JCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVudGVyVGV4dChUZXh0IHRleHQsIFN0cmluZyBzdHJpbmcpIHsKLQkJdGV4dC5ub3RpZnlMaXN0ZW5lcnMoU1dULkZvY3VzSW4sIG51bGwpOwotCQl0ZXh0LnNldFRleHQoc3RyaW5nKTsKLQkJdGV4dC5ub3RpZnlMaXN0ZW5lcnMoU1dULkZvY3VzT3V0LCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhPYmplY3RbXSBleHBlY3RlZCwgT2JqZWN0W10gYWN0dWFsKSB7Ci0JCWFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KGV4cGVjdGVkKSwgQXJyYXlzLmFzTGlzdChhY3R1YWwpKTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnZva2VOb25VSShmaW5hbCBSdW5uYWJsZSBhUnVubmFibGUpewotCQkKLQkJZmluYWwgUnVudGltZUV4Y2VwdGlvbltdIG5vblVJRXhjZXB0aW9uID0gbmV3IFJ1bnRpbWVFeGNlcHRpb25bMV07Ci0JCVRocmVhZCB0ID0gbmV3IFRocmVhZChhUnVubmFibGUpewotCQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQkJdHJ5ewotCQkJCQlzdXBlci5ydW4oKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKXsKLQkJCQkJUnVudGltZUV4Y2VwdGlvbiBydW50aW1lRXhjZXB0aW9uID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXhjKTsKLQkJCQkJcnVudGltZUV4Y2VwdGlvbi5maWxsSW5TdGFja1RyYWNlKCk7Ci0JCQkJCW5vblVJRXhjZXB0aW9uWzBdID0gcnVudGltZUV4Y2VwdGlvbjsgCi0JCQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXQuc3RhcnQoKTsKLQkJd2hpbGUodC5pc0FsaXZlKCkpIHsKLQkJCXdoaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLnJlYWRBbmREaXNwYXRjaCgpKTsKLQkJCXRyeSB7Ci0JCQkJdC5qb2luKDEwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlpZihub25VSUV4Y2VwdGlvblswXSAhPSBudWxsKXsKLQkJCXRocm93IG5vblVJRXhjZXB0aW9uWzBdOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9TcGlubmVyQ29udHJvbFNjZW5hcmlvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvc2NlbmFyaW9zL1NwaW5uZXJDb250cm9sU2NlbmFyaW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzMmY1Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvc2NlbmFyaW9zL1NwaW5uZXJDb250cm9sU2NlbmFyaW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy5zY2VuYXJpb3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5BZHZlbnR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuU2FtcGxlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci0KLS8qKgotICogVG8gcnVuIHRoZSB0ZXN0cyBpbiB0aGlzIGNsYXNzLCByaWdodC1jbGljayBhbmQgc2VsZWN0ICJSdW4gQXMgSlVuaXQgUGx1Zy1pbgotICogVGVzdCIuIFRoaXMgd2lsbCBhbHNvIHN0YXJ0IGFuIEVjbGlwc2UgaW5zdGFuY2UuIFRvIGNsZWFuIHVwIHRoZSBsYXVuY2gKLSAqIGNvbmZpZ3VyYXRpb24sIG9wZW4gdXAgaXRzICJNYWluIiB0YWIgYW5kIHNlbGVjdCAiW05vIEFwcGxpY2F0aW9uXSAtIEhlYWRsZXNzCi0gKiBNb2RlIiBhcyB0aGUgYXBwbGljYXRpb24gdG8gcnVuLgotICovCi0KLXB1YmxpYyBjbGFzcyBTcGlubmVyQ29udHJvbFNjZW5hcmlvIGV4dGVuZHMgU2NlbmFyaW9zVGVzdENhc2UgewotCi0JcHJpdmF0ZSBBZHZlbnR1cmUgYWR2ZW50dXJlOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy8gZG8gYW55IHNldHVwIHdvcmsgaGVyZQotCQlhZHZlbnR1cmUgPSBTYW1wbGVEYXRhLldJTlRFUl9IT0xJREFZOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGRvIGFueSB0ZWFyZG93biB3b3JrIGhlcmUKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8wMSgpIHsKLQkJLy8gQmluZCB0aGUgYWR2ZW50dXJlICJtYXhOdW1iZXJPZlBlb3BsZSIgcHJvcGVydHkgdG8gYSBzcGlubmVyCi0JCS8vIENoYW5nZSB0aGUgVUkgYW5kIHZlcmlmeSB0aGUgbW9kZWwgY2hhbmdlcwotCQkvLyBDaGFuZ2UgdGhlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIFVJIGNoYW5nZXMKLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoZ2V0Q29tcG9zaXRlKCksIFNXVC5CT1JERVIpOwotCQlnZXREYmMoKS5iaW5kKHNwaW5uZXIsIG5ldyBQcm9wZXJ0eShhZHZlbnR1cmUsICJtYXhOdW1iZXJPZlBlb3BsZSIpLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFkdmVudHVyZS5nZXRNYXhOdW1iZXJPZlBlb3BsZSgpLCBzcGlubmVyLmdldFNlbGVjdGlvbigpKTsKLQkJLy8gVmVyaWZ5IHRoZSBtb2RlbCBpcyB1cGRhdGVkIHdoZW4gdGhlIEdVSSBpcyBjaGFuZ2VkCQkKLQkJc3Bpbm5lci5zZXRTZWxlY3Rpb24oNSk7CQotCQlhc3NlcnRFcXVhbHMoNSxhZHZlbnR1cmUuZ2V0TWF4TnVtYmVyT2ZQZW9wbGUoKSk7Ci0JCS8vIFZlcmlmeSB0aGUgR1VJIGlzIHVwZGF0ZWQgd2hlbiB0aGUgbW9kZWwgY2hhbmdlcwotCQlhZHZlbnR1cmUuc2V0TWF4TnVtYmVyT2ZQZW9wbGUoNyk7Ci0JCWFzc2VydEVxdWFscyg3LHNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkvLyBWZXJpZnkgdGhhdCB1cGRhdGVzIGNhbiBvY2N1cmVkIHRvIHRoZSBtb2RlbCBvbiBhIG5vbiBVSSB0aHJlYWQKLQkJaW52b2tlTm9uVUkobmV3IFJ1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCQlhZHZlbnR1cmUuc2V0TWF4TnVtYmVyT2ZQZW9wbGUoMTEpOwotCQkJfQotCQl9KTsKLQkJc3BpbkV2ZW50TG9vcCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDExLHNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvVGFibGVTY2VuYXJpb3MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvVGFibGVTY2VuYXJpb3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiYWNiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvc2NlbmFyaW9zL1RhYmxlU2NlbmFyaW9zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLnNjZW5hcmlvczsKLQotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5jb252ZXJ0ZXIuSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy52aWV3ZXJzLlRhYmxlVmlld2VyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQWNjb3VudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsLkNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsLlBob25lQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsLlNhbXBsZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuU2lnbm9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsLlN0YXRlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsLlRyYW5zcG9ydGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRvIHJ1biB0aGUgdGVzdHMgaW4gdGhpcyBjbGFzcywgcmlnaHQtY2xpY2sgYW5kIHNlbGVjdCAiUnVuIEFzIEpVbml0IFBsdWctaW4KLSAqIFRlc3QiLiBUaGlzIHdpbGwgYWxzbyBzdGFydCBhbiBFY2xpcHNlIGluc3RhbmNlLiBUbyBjbGVhbiB1cCB0aGUgbGF1bmNoCi0gKiBjb25maWd1cmF0aW9uLCBvcGVuIHVwIGl0cyAiTWFpbiIgdGFiIGFuZCBzZWxlY3QgIltObyBBcHBsaWNhdGlvbl0gLSBIZWFkbGVzcwotICogTW9kZSIgYXMgdGhlIGFwcGxpY2F0aW9uIHRvIHJ1bi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVGFibGVTY2VuYXJpb3MgZXh0ZW5kcyBTY2VuYXJpb3NUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBDYXRhbG9nIGNhdGFsb2c7Ci0JCi0JcHJpdmF0ZSBDYXRlZ29yeSBjYXRlZ29yeTsKLQotCXByaXZhdGUgVGFibGVDb2x1bW4gZmlyc3ROYW1lQ29sdW1uOwotCi0JcHJpdmF0ZSBUYWJsZUNvbHVtbiBsYXN0TmFtZUNvbHVtbjsKLQotCXByaXZhdGUgVGFibGVDb2x1bW4gc3RhdGVDb2x1bW47Ci0KLQlwcml2YXRlIEltYWdlW10gaW1hZ2VzOwotCi0JcHJpdmF0ZSBUYWJsZUNvbHVtbiBmYW5jeUNvbHVtbjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWdldENvbXBvc2l0ZSgpLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoZ2V0Q29tcG9zaXRlKCkpOwotCQl0YWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlmaXJzdE5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGVWaWV3ZXIuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQlmaXJzdE5hbWVDb2x1bW4uc2V0V2lkdGgoNTApOwotCQlsYXN0TmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZVZpZXdlci5nZXRUYWJsZSgpLCBTV1QuTk9ORSk7Ci0JCWxhc3ROYW1lQ29sdW1uLnNldFdpZHRoKDUwKTsJCQotCQlzdGF0ZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZVZpZXdlci5nZXRUYWJsZSgpLCBTV1QuTk9ORSk7Ci0JCXN0YXRlQ29sdW1uLnNldFdpZHRoKDUwKTsJCQotCQlmYW5jeUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZVZpZXdlci5nZXRUYWJsZSgpLCBTV1QuTk9ORSk7Ci0JCWZhbmN5Q29sdW1uLnNldFdpZHRoKDI1MCk7CQkKLQotCQljYXRhbG9nID0gU2FtcGxlRGF0YS5DQVRBTE9HXzIwMDU7IC8vIExvZGdpbmcgc291cmNlCi0JCWNhdGVnb3J5ID0gU2FtcGxlRGF0YS5XSU5URVJfQ0FURUdPUlk7IAotCi0JCWltYWdlcyA9IG5ldyBJbWFnZVtdIHsKLQkJCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUiksCi0JCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyksCi0JCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pLCB9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGRvIGFueSB0ZWFyZG93biB3b3JrIGhlcmUKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5kaXNwb3NlKCk7Ci0JCXRhYmxlVmlld2VyID0gbnVsbDsKLQkJZmlyc3ROYW1lQ29sdW1uID0gbnVsbDsKLQkJbGFzdE5hbWVDb2x1bW4gPSBudWxsOwotCQlzdGF0ZUNvbHVtbiA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQ9PW51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8wMSgpIHsKLQkJLy8gU2hvdyB0aGF0IGEgVGFibGVWaWV3ZXIgd2l0aCB0aHJlZSBjb2x1bW5zIHJlbmRlcnMgdGhlIGFjY291bnRzCi0JCUFjY291bnRbXSBhY2NvdW50cyA9IGNhdGFsb2cuZ2V0QWNjb3VudHMoKTsKLQotCQlUYWJsZVZpZXdlckRlc2NyaXB0aW9uIHRhYmxlVmlld2VyRGVzY3JpcHRpb24gPSBuZXcgVGFibGVWaWV3ZXJEZXNjcmlwdGlvbigKLQkJCQl0YWJsZVZpZXdlcik7Ci0JCXRhYmxlVmlld2VyRGVzY3JpcHRpb24uYWRkQ29sdW1uKDAsICJmaXJzdE5hbWUiKTsKLQkJdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5hZGRDb2x1bW4oMSwgImxhc3ROYW1lIik7Ci0JCXRhYmxlVmlld2VyRGVzY3JpcHRpb24uYWRkQ29sdW1uKDIsICJzdGF0ZSIpOwotCQlnZXREYmMoKS5iaW5kKHRhYmxlVmlld2VyRGVzY3JpcHRpb24sCi0JCQkJbmV3IFByb3BlcnR5KGNhdGFsb2csICJhY2NvdW50cyIpLCBudWxsKTsKLQotCQkvLyBWZXJpZnkgdGhlIGRhdGEgaW4gdGhlIHRhYmxlIGNvbHVtbnMgbWF0Y2hlcyB0aGUgYWNjb3VudHMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NvdW50cy5sZW5ndGg7IGkrKykgewotCQkJQWNjb3VudCBhY2NvdW50ID0gY2F0YWxvZy5nZXRBY2NvdW50cygpW2ldOwotCQkJU3RyaW5nIGNvbF8wID0gKChJVGFibGVMYWJlbFByb3ZpZGVyKSB0YWJsZVZpZXdlcgotCQkJCQkuZ2V0TGFiZWxQcm92aWRlcigpKS5nZXRDb2x1bW5UZXh0KGFjY291bnQsIDApOyAKLQkJCWFzc2VydEVxdWFscyhnZXRWYWx1ZShhY2NvdW50LmdldEZpcnN0TmFtZSgpKSwgY29sXzApOwotCQkJU3RyaW5nIGNvbF8xID0gKChJVGFibGVMYWJlbFByb3ZpZGVyKSB0YWJsZVZpZXdlcgotCQkJCQkuZ2V0TGFiZWxQcm92aWRlcigpKS5nZXRDb2x1bW5UZXh0KGFjY291bnQsIDEpOwotCQkJYXNzZXJ0RXF1YWxzKGdldFZhbHVlKGFjY291bnQuZ2V0TGFzdE5hbWUoKSksIGNvbF8xKTsKLQkJCVN0cmluZyBjb2xfMiA9ICgoSVRhYmxlTGFiZWxQcm92aWRlcikgdGFibGVWaWV3ZXIKLQkJCQkJLmdldExhYmVsUHJvdmlkZXIoKSkuZ2V0Q29sdW1uVGV4dChhY2NvdW50LCAyKTsKLQkJCWFzc2VydEVxdWFscyhnZXRWYWx1ZShhY2NvdW50LmdldFN0YXRlKCkpLCBjb2xfMik7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzAyKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQkvLyBTaG93IHRoYXQgYSBUYWJsZVZpZXdlciB3aXRoIHRocmVlIGNvbHVtbnMgY2FuIGJlIHVzZWQgdG8gdXBkYXRlCi0JCS8vIGNvbHVtbnMKLQkJQWNjb3VudFtdIGFjY291bnRzID0gY2F0YWxvZy5nZXRBY2NvdW50cygpOwotCi0JCVRhYmxlVmlld2VyRGVzY3JpcHRpb24gdGFibGVWaWV3ZXJEZXNjcmlwdGlvbiA9IG5ldyBUYWJsZVZpZXdlckRlc2NyaXB0aW9uKAotCQkJCXRhYmxlVmlld2VyKTsKLQkJdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5hZGRFZGl0YWJsZUNvbHVtbigiZmlyc3ROYW1lIik7Ci0JCXRhYmxlVmlld2VyRGVzY3JpcHRpb24uYWRkRWRpdGFibGVDb2x1bW4oImxhc3ROYW1lIiwgbnVsbCwgbnVsbCwgbmV3IFBob25lQ29udmVydGVyKCkpOwotCQl0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmFkZEVkaXRhYmxlQ29sdW1uKCJzdGF0ZSIsIG51bGwsIG51bGwsIG5ldyBTdGF0ZUNvbnZlcnRlcigpKTsKLQkJZ2V0RGJjKCkuYmluZCh0YWJsZVZpZXdlckRlc2NyaXB0aW9uLAotCQkJCW5ldyBQcm9wZXJ0eShjYXRhbG9nLCAiYWNjb3VudHMiKSwgbnVsbCk7Ci0KLQkJQWNjb3VudCBhY2NvdW50ID0gYWNjb3VudHNbMF07Ci0JCS8vIFNlbGVjdCB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgdGFibGUKLQkJdGFibGVWaWV3ZXIuZWRpdEVsZW1lbnQoYWNjb3VudCwgMCk7Ci0JCS8vIFNldCB0aGUgdGV4dCBwcm9wZXJ0eSBvZiB0aGUgY2VsbCBlZGl0b3Igd2hpY2ggaXMgbm93IGFjdGl2ZSBvdmVyIHRoZSAiZmlyc3ROYW1lIiBjb2x1bW4KLQkJQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gdGFibGVWaWV3ZXIuZ2V0Q2VsbEVkaXRvcnMoKTsKLQkJVGV4dENlbGxFZGl0b3IgZmlyc3ROYW1lRWRpdG9yID0gKFRleHRDZWxsRWRpdG9yKSBjZWxsRWRpdG9yc1swXTsKLQkJLy8gQ2hhbmdlIHRoZSBmaXJzdE5hbWUgYW5kIHRlc3QgaXQgZ29lcyB0byB0aGUgbW9kZWwKLQkJZW50ZXJUZXh0KChUZXh0KSBmaXJzdE5hbWVFZGl0b3IuZ2V0Q29udHJvbCgpLCAiQmlsbCIpOwotCQkvLyBDaGVjayB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgY2hhbmdlZAotCQlhc3NlcnRFcXVhbHMoIkJpbGwiLGFjY291bnQuZ2V0Rmlyc3ROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8wNCgpIHsKLQkJLy8gU2hvdyB0aGF0IHdoZW4gYW4gaXRlbSBpcyBhZGRlZCB0byBhIGNvbGxlY3Rpb24gdGhlIHRhYmxlIGdldHMgYW4gZXh0cmEgaXRlbQotCQlBY2NvdW50W10gYWNjb3VudHMgPSBjYXRhbG9nLmdldEFjY291bnRzKCk7CQotCQkKLQkJVGFibGVWaWV3ZXJEZXNjcmlwdGlvbiB0YWJsZVZpZXdlckRlc2NyaXB0aW9uID0gbmV3IFRhYmxlVmlld2VyRGVzY3JpcHRpb24oCi0JCQkJdGFibGVWaWV3ZXIpOwotCQl0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmFkZENvbHVtbigiZmlyc3ROYW1lIik7Ci0JCXRhYmxlVmlld2VyRGVzY3JpcHRpb24uYWRkQ29sdW1uKCJsYXN0TmFtZSIpOwotCQl0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmFkZENvbHVtbigic3RhdGUiKTsKLQkJdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5hZGRDb2x1bW4obnVsbCxuZXcgSUNvbnZlcnRlcigpewotCQkJCi0JCQlwdWJsaWMgQ2xhc3MgZ2V0TW9kZWxUeXBlKCkgewotCQkJCXJldHVybiBBY2NvdW50LmNsYXNzOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgQ2xhc3MgZ2V0VGFyZ2V0VHlwZSgpIHsKLQkJCQlyZXR1cm4gVmlld2VyTGFiZWwuY2xhc3M7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBPYmplY3QgY29udmVydFRhcmdldFRvTW9kZWwoT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRNb2RlbFRvVGFyZ2V0KE9iamVjdCBtb2RlbE9iamVjdCkgewotCQkJCUFjY291bnQgYWNjb3VudCA9IChBY2NvdW50KSBtb2RlbE9iamVjdDsKLQkJCQlyZXR1cm4gbmV3IFZpZXdlckxhYmVsKGFjY291bnQudG9TdHJpbmcoKSwgaW1hZ2VzW25ldyBSYW5kb20oKS5uZXh0SW50KGltYWdlcy5sZW5ndGgpXSk7Ci0JCQl9fSk7Ci0JCWdldERiYygpLmJpbmQodGFibGVWaWV3ZXJEZXNjcmlwdGlvbiwKLQkJCQluZXcgUHJvcGVydHkoY2F0YWxvZywgImFjY291bnRzIiksIG51bGwpOwotCi0JCS8vaW50ZXJhY3QoKTsKLQkJCi0JCS8vIFZlcmlmeSB0aGUgbnVtYmVyIG9mIGFjY291bnRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdGFibGUKLQkJYXNzZXJ0RXF1YWxzKHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCksYWNjb3VudHMubGVuZ3RoKTsKLQkJLy8gQWRkIGEgbmV3IGFjY291bnQgYW5kIHZlcmlmeSB0aGF0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRhYmxlIGluY3JlYXNlcwotCQlBY2NvdW50IG5ld0FjY291bnQgPSBuZXcgQWNjb3VudCgpOwotCQluZXdBY2NvdW50LnNldEZpcnN0TmFtZSgiRmluYmFyIik7Ci0JCW5ld0FjY291bnQuc2V0TGFzdE5hbWUoIk1jR29vIik7Ci0JCW5ld0FjY291bnQuc2V0TGFzdE5hbWUoIk5DIik7Ci0JCWNhdGFsb2cuYWRkQWNjb3VudChuZXdBY2NvdW50KTsKLQkJLy8gVGhlIG51bWJlciBvZiBpdGVtcyBzaG91bGQgaGF2ZSBnb25lIHVwIGJ5IG9uZQotCQlhc3NlcnRFcXVhbHModGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSxhY2NvdW50cy5sZW5ndGggKyAxKTsKLQkJLy8gVGhlIG51bWJlciBvZiBpdGVtcyBzaG91bGQgc3RpbGwgbWF0Y2ggdGhlIG51bWJlciBvZiBhY2NvdW50cyAoaS5lLiB0ZXN0IHRoZSBtb2RlbCkKLQkJYXNzZXJ0RXF1YWxzKHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCksY2F0YWxvZy5nZXRBY2NvdW50cygpLmxlbmd0aCk7Ci0JCS8vIFJlbW92ZSB0aGUgYWNjb3VudCB0aGF0IHdhcyBqdXN0IGFkZGVkCi0JCWNhdGFsb2cucmVtb3ZlQWNjb3VudChuZXdBY2NvdW50KTsKLQkJLy8gVGhlIG51bWJlciBvZiBpdGVtcyBzaG91bGQgbWF0Y2ggdGhlIG9yaWdpbmFsCi0JCWFzc2VydEVxdWFscyh0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpLGFjY291bnRzLmxlbmd0aCk7Ci0JCS8vIFRoZSBudW1iZXIgb2YgaXRlbXMgc2hvdWxkIHN0aWxsIG1hdGNoIHRoZSBudW1iZXIgb2YgYWNjb3VudHMgKGkuZS4gdGVzdCB0aGUgbW9kZWwgaXMgcmVzZXQpCi0JCWFzc2VydEVxdWFscyh0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpLGNhdGFsb2cuZ2V0QWNjb3VudHMoKS5sZW5ndGgpOwkJCi0JCQotCQkvLyBUZXN0IGFkZGluZyBhbmQgcmVtb3ZpbmcgdG8gdGhlIG1vZGVsIG9uIGEgbm9uIFVJIHRocmVhZAotCQlpbnQgbnVtYmVyT2ZBY2NvdW50cyA9IGNhdGFsb2cuZ2V0QWNjb3VudHMoKS5sZW5ndGg7Ci0JCWZpbmFsIEFjY291bnQgYmFybmV5ID0gbmV3IEFjY291bnQoKTsKLQkJYmFybmV5LnNldEZpcnN0TmFtZSgiQmFybmV5Iik7Ci0JCWJhcm5leS5zZXRMYXN0TmFtZSgiU21pdGgiKTsKLQkJYmFybmV5LnNldExhc3ROYW1lKCJDQSIpOwotCQlpbnZva2VOb25VSShuZXcgUnVubmFibGUoKXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJCWNhdGFsb2cuYWRkQWNjb3VudChiYXJuZXkpOwotCQkJfQotCQl9KTsKLQkJc3BpbkV2ZW50TG9vcCgwKTsKLQkJLy8gVGhlIG51bWJlciBvZiBpdGVtcyBzaG91bGQgaGF2ZSBnb25lIHVwIGJ5IG9uZQkJCi0JCWFzc2VydEVxdWFscyh0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpLG51bWJlck9mQWNjb3VudHMgKyAxKTsKLQkJCi0JCWludm9rZU5vblVJKG5ldyBSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQkJY2F0YWxvZy5yZW1vdmVBY2NvdW50KGJhcm5leSk7Ci0JCQl9Ci0JCX0pOwotCQlzcGluRXZlbnRMb29wKDApOwotCQkvLyBUaGUgbnVtYmVyIG9mIGl0ZW1zIHNob3VsZCBoYXZlIHJldmVydGVkIHRvIHRoZSBvcmlnaW5hbCBudW1iZXIgYmVmb3JlIGJhcm5leSB3YXMgYWRkZWQgYW5kIHJlbW92ZWQJCQotCQlhc3NlcnRFcXVhbHModGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSxudW1iZXJPZkFjY291bnRzKTsKLQkJCi0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8wMygpIHsKLQkJLy8gU2hvdyB0aGF0IGNvbnZlcnRlcnMgd29yayBmb3IgdGFibGUgY29sdW1ucwotCQlBY2NvdW50W10gYWNjb3VudHMgPSBjYXRhbG9nLmdldEFjY291bnRzKCk7Ci0KLQkJVGFibGVWaWV3ZXJEZXNjcmlwdGlvbiB0YWJsZVZpZXdlckRlc2NyaXB0aW9uID0gbmV3IFRhYmxlVmlld2VyRGVzY3JpcHRpb24oCi0JCQkJdGFibGVWaWV3ZXIpOwotCQl0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmFkZEVkaXRhYmxlQ29sdW1uKCJsYXN0TmFtZSIpOwotCQl0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmFkZEVkaXRhYmxlQ29sdW1uKCJwaG9uZSIsIG51bGwsIG51bGwgLAotCQkJCW5ldyBQaG9uZUNvbnZlcnRlcigpKTsKLQkJdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5hZGRFZGl0YWJsZUNvbHVtbigic3RhdGUiLCBudWxsLCBudWxsICwKLQkJCQluZXcgU3RhdGVDb252ZXJ0ZXIoKSk7Ci0JCWdldERiYygpLmJpbmQodGFibGVWaWV3ZXJEZXNjcmlwdGlvbiwKLQkJCQluZXcgUHJvcGVydHkoY2F0YWxvZywgImFjY291bnRzIiksIG51bGwpOwotCi0JCS8vIFZlcmlmeSB0aGF0IHRoZSBkYXRhIGluIHRoZSB0aGUgdGFibGUgY29sdW1ucyBtYXRjaGVzIHRoZSBleHBlY3RlZAotCQkvLyBXaGF0IHdlIGFyZSBsb29raW5nIGZvciBpcyB0aGF0IHRoZSBwaG9uZSBudW1iZXJzIGFyZSBjb252ZXJ0ZXJ0ZWQgdG8KLQkJLy8gbm5uLW5ubi1ubm5uIGFuZCB0aGF0Ci0JCS8vIHRoZSBzdGF0ZSBsZXR0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gc3RhdGUgbmFtZXMKLQkJLy8gVmVyaWZ5IHRoZSBkYXRhIGluIHRoZSB0YWJsZSBjb2x1bW5zIG1hdGNoZXMgdGhlIGFjY291bnRzCi0JCVBob25lQ29udmVydGVyIHBob25lQ29udmVydGVyID0gbmV3IFBob25lQ29udmVydGVyKCk7Ci0JCVN0YXRlQ29udmVydGVyIHN0YXRlQ29udmVydGVyID0gbmV3IFN0YXRlQ29udmVydGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWNjb3VudHMubGVuZ3RoOyBpKyspIHsKLQkJCUFjY291bnQgYWNjb3VudCA9IGNhdGFsb2cuZ2V0QWNjb3VudHMoKVtpXTsKLQkJCS8vIENoZWNrIHRoZSBwaG9uZSBudW1iZXIKLQkJCVN0cmluZyBjb2xfcGhvbmUgPSAoKElUYWJsZUxhYmVsUHJvdmlkZXIpIHRhYmxlVmlld2VyCi0JCQkJCS5nZXRMYWJlbFByb3ZpZGVyKCkpLmdldENvbHVtblRleHQoYWNjb3VudCwgMSk7Ci0JCQlhc3NlcnRFcXVhbHMoZ2V0VmFsdWUoKFN0cmluZylwaG9uZUNvbnZlcnRlcgotCQkJCQkuY29udmVydE1vZGVsVG9UYXJnZXQoYWNjb3VudC5nZXRQaG9uZSgpKSksIGNvbF9waG9uZSk7Ci0JCQlTdHJpbmcgY29sX3N0YXRlID0gKChJVGFibGVMYWJlbFByb3ZpZGVyKSB0YWJsZVZpZXdlcgotCQkJCQkuZ2V0TGFiZWxQcm92aWRlcigpKS5nZXRDb2x1bW5UZXh0KGFjY291bnQsIDIpOwotCQkJYXNzZXJ0RXF1YWxzKGdldFZhbHVlKChTdHJpbmcpc3RhdGVDb252ZXJ0ZXIKLQkJCQkJLmNvbnZlcnRNb2RlbFRvVGFyZ2V0KGFjY291bnQuZ2V0U3RhdGUoKSkpLCBjb2xfc3RhdGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzA1KCkgewotCQkvLyBTaG93IHRoYXQgd2hlbiB0aGUgbW9kZWwgY2hhbmdlcyB0aGVuIHRoZSBVSSByZWZyZXNoZXMgdG8gcmVmbGVjdCB0aGlzCi0KLQkJVGFibGVWaWV3ZXJEZXNjcmlwdGlvbiB0YWJsZVZpZXdlckRlc2NyaXB0aW9uID0gbmV3IFRhYmxlVmlld2VyRGVzY3JpcHRpb24oCi0JCQkJdGFibGVWaWV3ZXIpOwotCQl0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmFkZENvbHVtbigibGFzdE5hbWUiKTsKLQkJdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5hZGRDb2x1bW4oInBob25lIiwKLQkJCQluZXcgUGhvbmVDb252ZXJ0ZXIoKSk7Ci0JCXRhYmxlVmlld2VyRGVzY3JpcHRpb24uYWRkQ29sdW1uKCJzdGF0ZSIsCi0JCQkJbmV3IFN0YXRlQ29udmVydGVyKCkpOwotCQlnZXREYmMoKS5iaW5kKHRhYmxlVmlld2VyRGVzY3JpcHRpb24sCi0JCQkJbmV3IFByb3BlcnR5KGNhdGFsb2csICJhY2NvdW50cyIpLCBudWxsKTsKLQkJCi0JCWZpbmFsIEFjY291bnQgYWNjb3VudCA9IGNhdGFsb2cuZ2V0QWNjb3VudHMoKVswXTsKLQkJU3RyaW5nIGxhc3ROYW1lID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtKDApLmdldFRleHQoMCk7Ci0JCS8vIENoZWNrIHRoZSBmaXJzdE5hbWUgaW4gdGhlIFRhYmxlSXRlbSBpcyB0aGUgc2FtZSBhcyB0aGUgbW9kZWwKLQkJYXNzZXJ0RXF1YWxzKGxhc3ROYW1lLGFjY291bnQuZ2V0TGFzdE5hbWUoKSk7Ci0JCS8vIE5vdyBjaGFuZ2UgdGhlIG1vZGVsIGFuZCBjaGVjayBhZ2FpbgotCQlhY2NvdW50LnNldExhc3ROYW1lKCJHZXJzaHdpbiIpOwotCQlsYXN0TmFtZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbSgwKS5nZXRUZXh0KDApOwkKLQkJYXNzZXJ0RXF1YWxzKGxhc3ROYW1lLGFjY291bnQuZ2V0TGFzdE5hbWUoKSk7CQotCQkKLQkJLy8gVGVzdCB0aGUgbW9kZWwgdXBkYXRlIG9uIGEgbm9uIFVJIHRocmVhZAotCQlpbnZva2VOb25VSShuZXcgUnVubmFibGUoKXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJCWFjY291bnQuc2V0TGFzdE5hbWUoIk1vemFydCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCXNwaW5FdmVudExvb3AoMCk7Ci0JCWxhc3ROYW1lID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtKDApLmdldFRleHQoMCk7CQkKLQkJYXNzZXJ0RXF1YWxzKGxhc3ROYW1lLGFjY291bnQuZ2V0TGFzdE5hbWUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8wNigpewotCQkvLyBDaGVjayB0aGF0IGV4cGxpY2l0IHR5cGUgbWVhbnMgdGhhdCBkZWZhdWx0aW5nIG9mIGNvbnZlcnRlcnMgd29ya3MKLQkJVGFibGVWaWV3ZXJEZXNjcmlwdGlvbiB0YWJsZVZpZXdlckRlc2NyaXB0aW9uID0gbmV3IFRhYmxlVmlld2VyRGVzY3JpcHRpb24oCi0JCQkJdGFibGVWaWV3ZXIpOwotCQl0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmFkZEVkaXRhYmxlQ29sdW1uKCJwcmljZSIpOwotCQl0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmdldENvbHVtbigwKS5zZXRQcm9wZXJ0eVR5cGUoRG91YmxlLlRZUEUpOwotCQlnZXREYmMoKS5iaW5kKHRhYmxlVmlld2VyRGVzY3JpcHRpb24sCi0JCQkJbmV3IFByb3BlcnR5KGNhdGFsb2csICJ0cmFuc3BvcmF0aW9ucyIpLCBudWxsKTsKLQkJVHJhbnNwb3J0YXRpb24gdHJhbnNwb3JhdGlvbiA9IGNhdGFsb2cuZ2V0VHJhbnNwb3JhdGlvbnMoKVswXTsKLQkJdGFibGVWaWV3ZXIuZWRpdEVsZW1lbnQodHJhbnNwb3JhdGlvbiwgMCk7Ci0JCS8vIFNldCB0aGUgdGV4dCBwcm9wZXJ0eSBvZiB0aGUgY2VsbCBlZGl0b3Igd2hpY2ggaXMgbm93IGFjdGl2ZSBvdmVyIHRoZSAiZmlyc3ROYW1lIiBjb2x1bW4KLQkJQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gdGFibGVWaWV3ZXIuZ2V0Q2VsbEVkaXRvcnMoKTsKLQkJVGV4dENlbGxFZGl0b3IgcHJpY2VFZGl0b3IgPSAoVGV4dENlbGxFZGl0b3IpIGNlbGxFZGl0b3JzWzBdOwotCQkvLyBDaGFuZ2UgdGhlIGZpcnN0TmFtZSBhbmQgdGVzdCBpdCBnb2VzIHRvIHRoZSBtb2RlbAotCQllbnRlclRleHQoKFRleHQpIHByaWNlRWRpdG9yLmdldENvbnRyb2woKSwgIjEyMy40NSIpOwotCQkvLyBWZXJpZnkgdGhlIG1vZGVsIGlzIHVwZGF0ZWQKLQkJYXNzZXJ0RXF1YWxzKHRyYW5zcG9yYXRpb24uZ2V0UHJpY2UoKSwxMjMuNDUsMCk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8wNygpewotCQkvLyBWZXJpZnkgdGhhdCBldmVuIHdoZW4gYSBjb2x1bW4ncyBwcm9wZXJ0eSB0eXBlIGlzIG5vdCBzZXQsIHRoYXQgaXQgaXMgd29ya2VkIG91dCBsYXppbHkgZnJvbSB0aGUgdGFyZ2V0IHR5cGUgCi0JCVRhYmxlVmlld2VyRGVzY3JpcHRpb24gdGFibGVWaWV3ZXJEZXNjcmlwdGlvbiA9IG5ldyBUYWJsZVZpZXdlckRlc2NyaXB0aW9uKAotCQkJCXRhYmxlVmlld2VyKTsKLQkJdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5hZGRFZGl0YWJsZUNvbHVtbigicHJpY2UiKTsKLQkJLy8gVGhlIGNvbHVtbidzIHR5cGUgaXMgbm90IHNldCB0byBiZSBEb3VibGUuVFlQRS4gIFRoaXMgd2lsbCBiZSBpbmZlcnJlZCBvbmNlIHRoZSBmaXJzdCBUcmFuc3BvcnRhdGlvbiBvYmplY3QgaXMgc2V0Ci0JCS8vIGludG8gdGhlIFVwZGF0YWJsZUNvbGxlY3Rpb24KLQkJZ2V0RGJjKCkuYmluZCh0YWJsZVZpZXdlckRlc2NyaXB0aW9uLAotCQkJCW5ldyBQcm9wZXJ0eShjYXRhbG9nLCAidHJhbnNwb3JhdGlvbnMiKSwgbnVsbCk7Ci0JCVRyYW5zcG9ydGF0aW9uIHRyYW5zcG9yYXRpb24gPSBjYXRhbG9nLmdldFRyYW5zcG9yYXRpb25zKClbMF07Ci0JCXRhYmxlVmlld2VyLmVkaXRFbGVtZW50KHRyYW5zcG9yYXRpb24sIDApOwotCQkvLyBTZXQgdGhlIHRleHQgcHJvcGVydHkgb2YgdGhlIGNlbGwgZWRpdG9yIHdoaWNoIGlzIG5vdyBhY3RpdmUgb3ZlciB0aGUgImZpcnN0TmFtZSIgY29sdW1uCi0JCUNlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IHRhYmxlVmlld2VyLmdldENlbGxFZGl0b3JzKCk7Ci0JCVRleHRDZWxsRWRpdG9yIHByaWNlRWRpdG9yID0gKFRleHRDZWxsRWRpdG9yKSBjZWxsRWRpdG9yc1swXTsKLQkJLy8gQ2hhbmdlIHRoZSBmaXJzdE5hbWUgYW5kIHRlc3QgaXQgZ29lcyB0byB0aGUgbW9kZWwKLQkJZW50ZXJUZXh0KChUZXh0KSBwcmljZUVkaXRvci5nZXRDb250cm9sKCksICIxMjMuNDUiKTsKLQkJLy8gVmVyaWZ5IHRoZSBtb2RlbCBpcyB1cGRhdGVkCi0JCWFzc2VydEVxdWFscyh0cmFuc3BvcmF0aW9uLmdldFByaWNlKCksMTIzLjQ1LDApOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMDhfMDAoKXsKLQkJLy8gVmVyaWZ5IHRoYXQgYmluZGluZyB0byBhIENvbGxlY3Rpb24gcHJvcGVydHkgKHJhdGhlciB0aGFuIGFuIGFycmF5KSB3b3JrcyB3aGVuIHNwZWNpZnlpbmcgZGF0YSB0eXBlCi0JCVRhYmxlVmlld2VyRGVzY3JpcHRpb24gdGFibGVWaWV3ZXJEZXNjcmlwdGlvbiA9IG5ldyBUYWJsZVZpZXdlckRlc2NyaXB0aW9uKAotCQkJCXRhYmxlVmlld2VyKTsKLQkJdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5hZGRFZGl0YWJsZUNvbHVtbigidXNlcklkIik7Ci0JCXRhYmxlVmlld2VyRGVzY3JpcHRpb24uYWRkRWRpdGFibGVDb2x1bW4oInBhc3N3b3JkIik7CQotCQlnZXREYmMoKS5iaW5kKHRhYmxlVmlld2VyRGVzY3JpcHRpb24sCi0JCQkJbmV3IFByb3BlcnR5KGNhdGFsb2csICJzaWdub25zIiwgU2lnbm9uLmNsYXNzLCBudWxsKSwgbnVsbCk7CQotCQlTaWdub24gZmlyc3RTaWdub24gPSAoU2lnbm9uKSBjYXRhbG9nLmdldFNpZ25vbnMoKS5nZXQoMCk7CQotCQkvLyBWZXJpZnkgdGhlIFVJIG1hdGNoZXMgdGhlIG1vZGVsCi0JCVRhYmxlSXRlbSBmaXJzdFRhYmxlSXRlbSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbSgwKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0VGFibGVJdGVtLmdldFRleHQoMSksZmlyc3RTaWdub24uZ2V0UGFzc3dvcmQoKSk7Ci0JCS8vIENoYW5nZSB0aGUgbW9kZWwgYW5kIGVuc3VyZSB0aGUgVUkgcmVmcmVzaGVzCi0JCWZpcnN0U2lnbm9uLnNldFBhc3N3b3JkKCJFY2xpcHNlMTIzUm9ja3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJFY2xpcHNlMTIzUm9ja3MiLGZpcnN0U2lnbm9uLmdldFBhc3N3b3JkKCkpOwkJCi0JCWFzc2VydEVxdWFscyhmaXJzdFRhYmxlSXRlbS5nZXRUZXh0KDEpLGZpcnN0U2lnbm9uLmdldFBhc3N3b3JkKCkpOwotCQkvLyBDaGFuZ2UgdGhlIEdVSSBhbmQgZW5zdXJlIHRoZSBtb2RlbCByZWZyZXNoZXMKLQkJdGFibGVWaWV3ZXIuZWRpdEVsZW1lbnQoZmlyc3RTaWdub24sIDEpOwotCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSB0YWJsZVZpZXdlci5nZXRDZWxsRWRpdG9ycygpOwotCQlUZXh0Q2VsbEVkaXRvciBwYXNzd29yZEVkaXRvciA9IChUZXh0Q2VsbEVkaXRvcikgY2VsbEVkaXRvcnNbMV07Ci0JCWVudGVyVGV4dCgoVGV4dCkgcGFzc3dvcmRFZGl0b3IuZ2V0Q29udHJvbCgpLCAiQ3JpY2tldDExUGxheWVycyIpOwotCQlhc3NlcnRFcXVhbHMoIkNyaWNrZXQxMVBsYXllcnMiLGZpcnN0U2lnbm9uLmdldFBhc3N3b3JkKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMDhfMDEoKXsKLQkJLy8gVmVyaWZ5IHRoYXQgYmluZGluZyB0byBhIENvbGxlY3Rpb24gcHJvcGVydHkgKHJhdGhlciB0aGFuIGFuIGFycmF5KSB3b3JrcyB3aXRob3V0IHNwZWNpZnlpbmcgZGF0YSB0eXBlCi0JCVRhYmxlVmlld2VyRGVzY3JpcHRpb24gdGFibGVWaWV3ZXJEZXNjcmlwdGlvbiA9IG5ldyBUYWJsZVZpZXdlckRlc2NyaXB0aW9uKAotCQkJCXRhYmxlVmlld2VyKTsKLQkJdGFibGVWaWV3ZXJEZXNjcmlwdGlvbi5hZGRFZGl0YWJsZUNvbHVtbigidXNlcklkIik7Ci0JCXRhYmxlVmlld2VyRGVzY3JpcHRpb24uYWRkRWRpdGFibGVDb2x1bW4oInBhc3N3b3JkIik7CQotCQlnZXREYmMoKS5iaW5kKHRhYmxlVmlld2VyRGVzY3JpcHRpb24sCi0JCQkJbmV3IFByb3BlcnR5KGNhdGFsb2csICJzaWdub25zIiksIG51bGwpOwkKLQkJU2lnbm9uIGZpcnN0U2lnbm9uID0gKFNpZ25vbikgY2F0YWxvZy5nZXRTaWdub25zKCkuZ2V0KDApOwkKLQkJLy8gVmVyaWZ5IHRoZSBVSSBtYXRjaGVzIHRoZSBtb2RlbAotCQlUYWJsZUl0ZW0gZmlyc3RUYWJsZUl0ZW0gPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0oMCk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdFRhYmxlSXRlbS5nZXRUZXh0KDEpLGZpcnN0U2lnbm9uLmdldFBhc3N3b3JkKCkpOwotCQkvLyBDaGFuZ2UgdGhlIG1vZGVsIGFuZCBlbnN1cmUgdGhlIFVJIHJlZnJlc2hlcwotCQlmaXJzdFNpZ25vbi5zZXRQYXNzd29yZCgiRWNsaXBzZTEyM1JvY2tzIik7Ci0JCWFzc2VydEVxdWFscygiRWNsaXBzZTEyM1JvY2tzIixmaXJzdFNpZ25vbi5nZXRQYXNzd29yZCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoZmlyc3RUYWJsZUl0ZW0uZ2V0VGV4dCgxKSxmaXJzdFNpZ25vbi5nZXRQYXNzd29yZCgpKTsKLQkJLy8gQ2hhbmdlIHRoZSBHVUkgYW5kIGVuc3VyZSB0aGUgbW9kZWwgcmVmcmVzaGVzCi0JCXRhYmxlVmlld2VyLmVkaXRFbGVtZW50KGZpcnN0U2lnbm9uLCAxKTsKLQkJQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gdGFibGVWaWV3ZXIuZ2V0Q2VsbEVkaXRvcnMoKTsKLQkJVGV4dENlbGxFZGl0b3IgcGFzc3dvcmRFZGl0b3IgPSAoVGV4dENlbGxFZGl0b3IpIGNlbGxFZGl0b3JzWzFdOwotCQllbnRlclRleHQoKFRleHQpIHBhc3N3b3JkRWRpdG9yLmdldENvbnRyb2woKSwgIkNyaWNrZXQxMVBsYXllcnMiKTsKLQkJYXNzZXJ0RXF1YWxzKCJDcmlja2V0MTFQbGF5ZXJzIixmaXJzdFNpZ25vbi5nZXRQYXNzd29yZCgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzA5KCl7Ci0JCS8vIFZlcmlmeSB0aGF0IG5lc3RlZCBwcm9wZXJ0aWVzIHdvcmsuICBDYXRhbG9nIGhhcyBhZHZlbnR1cmVzLiAgQWR2ZW50dXJlIGhhcyBkZWZhdWx0TG9kZ2luZy4gIExvZGluZyBoYXMgbmFtZS4KLQkJVGFibGVWaWV3ZXJEZXNjcmlwdGlvbiB0YWJsZVZpZXdlckRlc2NyaXB0aW9uID0gbmV3IFRhYmxlVmlld2VyRGVzY3JpcHRpb24odGFibGVWaWV3ZXIpOwotCQl0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmFkZENvbHVtbigibmFtZSIpOwotCQl0YWJsZVZpZXdlckRlc2NyaXB0aW9uLmFkZENvbHVtbigiZGVmYXVsdExvZGdpbmcubmFtZSIpOwotCQlnZXREYmMoKS5iaW5kKHRhYmxlVmlld2VyRGVzY3JpcHRpb24sbmV3IFByb3BlcnR5KGNhdGVnb3J5LCAiYWR2ZW50dXJlcyIpLG51bGwpOwotCQkKLQl9Ci0vKioJCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMTAoKXsKLQkJLy8gVmVyaWZ5IHRoYXQgZm9yIFRJTUVfRUFSTFkgdXBkYXRpbmcgb2NjdXJzIG9uIGEgcGVyIGtleSBiYXNpYyBmb3IgYSBUZXh0Q2VsbEVkaXRvcgotCQkvLyBTaG93IHRoYXQgY29udmVydGVycyB3b3JrIGZvciB0YWJsZSBjb2x1bW5zCi0JCUFjY291bnRbXSBhY2NvdW50cyA9IGNhdGFsb2cuZ2V0QWNjb3VudHMoKTsKLQkJQWNjb3VudCBmaXJzdEFjY291bnQgPSBhY2NvdW50c1swXTsKLQkJU2FtcGxlRGF0YS5nZXRTV1RVcGRhdGFibGVGYWN0b3J5KCkuc2V0VXBkYXRlVGltZShJRGF0YUJpbmRpbmdDb250ZXh0LlRJTUVfRUFSTFkpOwotCQlUYWJsZVZpZXdlckRlc2NyaXB0aW9uIHRhYmxlVmlld2VyRGVzY3JpcHRpb24gPSBuZXcgVGFibGVWaWV3ZXJEZXNjcmlwdGlvbih0YWJsZVZpZXdlcik7Ci0JCXRhYmxlVmlld2VyRGVzY3JpcHRpb24uYWRkRWRpdGFibGVDb2x1bW4oImxhc3ROYW1lIik7Ci0JCXRhYmxlVmlld2VyRGVzY3JpcHRpb24uYWRkQ29sdW1uKCJsYXN0TmFtZSIpOwotCQlnZXREYmMoKS5iaW5kKHRhYmxlVmlld2VyRGVzY3JpcHRpb24sbmV3IFByb3BlcnR5KGNhdGFsb2csICJhY2NvdW50cyIpLCBudWxsKTsKLQkJCi0JCS8vIFZlcmlmeSB0aGF0IHRoZSBmaXJzdCBhY2NvdW50IGlzIHNob3duIGluIHRoZSBmaXJzdCByb3cgd2l0aCB0aGUgbGFzdCBuYW1lIGNvcnJlY3RseQotCQlhc3NlcnRFcXVhbHModGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtKDApLmdldERhdGEoKSxmaXJzdEFjY291bnQpOwotCQlhc3NlcnRFcXVhbHModGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtKDApLmdldFRleHQoMCksZmlyc3RBY2NvdW50LmdldExhc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtKDApLmdldFRleHQoMSksZmlyc3RBY2NvdW50LmdldExhc3ROYW1lKCkpOwotCQkvLyBDcmVhdGUgYSBjZWxsIGVkaXRvciBvdmVyIHRoZSBmaXJzdCBjb2x1bW4KLQkJdGFibGVWaWV3ZXIuZWRpdEVsZW1lbnQoZmlyc3RBY2NvdW50LCAwKTsKLQkJLy8gU2V0IHRoZSB0ZXh0IHByb3BlcnR5IG9mIHRoZSBjZWxsIGVkaXRvciB3aGljaCBpcyBub3cgYWN0aXZlIG92ZXIgdGhlICJmaXJzdE5hbWUiIGNvbHVtbgotCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSB0YWJsZVZpZXdlci5nZXRDZWxsRWRpdG9ycygpOwotCQlUZXh0Q2VsbEVkaXRvciBsYXN0TmFtZUNlbGxFZGl0b3IgPSAoVGV4dENlbGxFZGl0b3IpIGNlbGxFZGl0b3JzWzBdOwotCQkoKFRleHQpbGFzdE5hbWVDZWxsRWRpdG9yLmdldENvbnRyb2woKSkuc2V0VGV4dCgiRSIpOwotCQkvLyBWZXJpZnkgdGhhdCB0aGUga2V5IHByZXNzIGdvZXMgdG8gdGhlIG1vZGVsCi0JCWFzc2VydEVxdWFscyhmaXJzdEFjY291bnQuZ2V0TGFzdE5hbWUoKSwiRSIpOwotCQkKLQl9Ci0gKiovCQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvc2NlbmFyaW9zL1RleHRDb250cm9sU2NlbmFyaW8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvVGV4dENvbnRyb2xTY2VuYXJpby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDczYmQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvVGV4dENvbnRyb2xTY2VuYXJpby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy5zY2VuYXJpb3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5CZWFuQmluZFN1cHBvcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLkJpbmRTcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklEYXRhQmluZGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQWNjb3VudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5BZHZlbnR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuUGhvbmVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuUGhvbmVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuU2FtcGxlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5UcmFuc3BvcnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVG8gcnVuIHRoZSB0ZXN0cyBpbiB0aGlzIGNsYXNzLCByaWdodC1jbGljayBhbmQgc2VsZWN0ICJSdW4gQXMgSlVuaXQgUGx1Zy1pbgotICogVGVzdCIuIFRoaXMgd2lsbCBhbHNvIHN0YXJ0IGFuIEVjbGlwc2UgaW5zdGFuY2UuIFRvIGNsZWFuIHVwIHRoZSBsYXVuY2gKLSAqIGNvbmZpZ3VyYXRpb24sIG9wZW4gdXAgaXRzICJNYWluIiB0YWIgYW5kIHNlbGVjdCAiW05vIEFwcGxpY2F0aW9uXSAtIEhlYWRsZXNzCi0gKiBNb2RlIiBhcyB0aGUgYXBwbGljYXRpb24gdG8gcnVuLgotICovCi0KLXB1YmxpYyBjbGFzcyBUZXh0Q29udHJvbFNjZW5hcmlvIGV4dGVuZHMgU2NlbmFyaW9zVGVzdENhc2UgewotCi0JcHJpdmF0ZSBUZXh0IHRleHQ7Ci0JcHJpdmF0ZSBBZHZlbnR1cmUgYWR2ZW50dXJlOwotCXByaXZhdGUgVHJhbnNwb3J0YXRpb24gdHJhbnNwb3J0YXRpb247Ci0JcHJpdmF0ZSBBY2NvdW50IGFjY291bnQ7CQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy8gZG8gYW55IHNldHVwIHdvcmsgaGVyZQotCQlhZHZlbnR1cmUgPSBTYW1wbGVEYXRhLldJTlRFUl9IT0xJREFZOwotCQl0cmFuc3BvcnRhdGlvbiA9IFNhbXBsZURhdGEuRVhFQ1VUSVZFX0pFVDsKLQkJYWNjb3VudCA9IFNhbXBsZURhdGEuUFJFU0lERU5UOwkJCi0JCXRleHQgPSBuZXcgVGV4dChnZXRDb21wb3NpdGUoKSwgU1dULkJPUkRFUik7CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJdGV4dCA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMDEoKSB7Ci0JCS8vIEJpbmQgdGhlIGFkdmVudHVyZSAibmFtZSIgcHJvcGVydHkgdG8gYSB0ZXh0IGZpZWxkCi0JCS8vIENoYW5nZSB0aGUgVUkgYW5kIHZlcmlmeSB0aGUgbW9kZWwgY2hhbmdlcwotCQkvLyBDaGFuZ2UgdGhlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIFVJIGNoYW5nZXMKLQkJZ2V0RGJjKCkuYmluZCh0ZXh0LCBuZXcgUHJvcGVydHkoYWR2ZW50dXJlLCAibmFtZSIpLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFkdmVudHVyZS5nZXROYW1lKCksIHRleHQuZ2V0VGV4dCgpKTsKLQkJdGV4dC5zZXRUZXh0KCJFbmdsYW5kIik7Ci0JCXRleHQubm90aWZ5TGlzdGVuZXJzKFNXVC5Gb2N1c091dCwgbnVsbCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJFbmdsYW5kIiwgYWR2ZW50dXJlLmdldE5hbWUoKSk7Ci0JCWFkdmVudHVyZS5zZXROYW1lKCJGcmFuY2UiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmFuY2UiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCWludm9rZU5vblVJKG5ldyBSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQkJYWR2ZW50dXJlLnNldE5hbWUoIkdlcm1hbnkiKTsJCQkKLQkJCX0KLQkJfSk7Ci0JCXNwaW5FdmVudExvb3AoMCk7Ci0JCWFzc2VydEVxdWFscygiR2VybWFueSIsdGV4dC5nZXRUZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW8wMigpIHsKLQkJLy8gQmluZCB0aGUgdHJhbnNwb3J0YXRpb24gInByaWNlIiBwcm9wZXJ0eSB0byBhIHRleHQgZmllbGQKLQkJLy8gVGhpcyBpcyBhIERvdWJsZS5UWVBFIHNvIHdlIGNoZWNrIHRoYXQgY29udmVyc2lvbiBhbmQgdmFsaWRhdGlvbiBvY2N1cnMKLQkJLy8gQ2hhbmdlIHRoZSBVSSBhbmQgdmVyaWZ5IHRoZSBtb2RlbCBjaGFuZ2VzCi0JCS8vIENoYW5nZSB0aGUgbW9kZWwgYW5kIHZlcmlmeSB0aGUgVUkgY2hhbmdlcwotCQlnZXREYmMoKS5iaW5kKHRleHQsIG5ldyBQcm9wZXJ0eSh0cmFuc3BvcnRhdGlvbiwgInByaWNlIiksIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoRG91YmxlLnRvU3RyaW5nKHRyYW5zcG9ydGF0aW9uLmdldFByaWNlKCkpLCB0ZXh0LmdldFRleHQoKSk7Ci0JCXRleHQuc2V0VGV4dCgiOTg3Ni41NCIpOwotCQl0ZXh0Lm5vdGlmeUxpc3RlbmVycyhTV1QuRm9jdXNPdXQsIG51bGwpOwkJCi0JCWFzc2VydEVxdWFscyg5ODc2LjU0LCB0cmFuc3BvcnRhdGlvbi5nZXRQcmljZSgpLDApOwotCQl0cmFuc3BvcnRhdGlvbi5zZXRQcmljZSgxMjM0LjU2KTsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0LjU2IiwgdGV4dC5nZXRUZXh0KCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMDMoKXsKLQkJLy8gU2hvdyB0aGF0IHRoZSBFc2NhcGUga2V5IGNhbiBiZSBwcmVzc2VkIGluIHRoZSBtaWRkbGUgb2YgZWRpdGluZyBhbmQgdGhlIHZhbHVlIHdpbGwgcmV2ZXJ0Ci0JCS8vIHRoZSB1cGRhdGVQb2xpY3kgZm9yIHRoaXMgdGVzdCBpcyBUSU1FX0xBVEUgc28gaXQgb2NjdXJzIHdoZW4gZm9jdXMgaXMgbG9zdCBmcm9tIHRoZSBUZXh0IGNvbnRyb2wgCi0JCWdldFNXVFVwZGF0YWJsZUZhY3RvcnkoKS5zZXRVcGRhdGVUaW1lKElEYXRhQmluZGluZ0NvbnRleHQuVElNRV9MQVRFKTsJCQotCQlnZXREYmMoKS5iaW5kKHRleHQsIG5ldyBQcm9wZXJ0eShhZHZlbnR1cmUsICJuYW1lIiksIG51bGwpOwotCQlTdHJpbmcgY3VycmVudFRleHQgPSB0ZXh0LmdldFRleHQoKTsKLQkJdGV4dC5zZXRUZXh0KCJTd2l0emVybGFuZCIpOwotCQkvLyBXZSBkbyBub3Qgbm90aWZ5IEZvY3VzT3V0Ci0JCS8vIFZlcmlmeSB0aGF0IHRoZSBtb2RlbCBoYXNuJ3QgY2hhbmdlZAotCQlhc3NlcnRFcXVhbHMoY3VycmVudFRleHQsYWR2ZW50dXJlLmdldE5hbWUoKSk7Ci0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LmNoYXJhY3RlciA9IFNXVC5FU0M7Ci0JCWV2ZW50LmtleUNvZGUgPSAyNzsKLQkJdGV4dC5ub3RpZnlMaXN0ZW5lcnMoU1dULktleURvd24sZXZlbnQpOwotCQkvLyBWZXJpZnkgdGhhdCB0aGUgdGV4dCBoYXMgcmV2ZXJ0ZWQKLQkJYXNzZXJ0RXF1YWxzKGN1cnJlbnRUZXh0LHRleHQuZ2V0VGV4dCgpKTsKLQkJLy8gQW5kIHRoYXQgdGhlIG1vZGVsIGRpZG4ndCBjaGFuZ2UKLQkJYXNzZXJ0RXF1YWxzKGFkdmVudHVyZS5nZXROYW1lKCksY3VycmVudFRleHQpOwotCQkvLyBOb3cgY2hhbmdlIHRoZSBHVUkgYW5kIGNvbW1pdCB0aGlzIGNoYW5nZQotCQljdXJyZW50VGV4dCA9ICJBdXN0cmlhIjsKLQkJdGV4dC5zZXRUZXh0KGN1cnJlbnRUZXh0KTsKLQkJdGV4dC5ub3RpZnlMaXN0ZW5lcnMoU1dULkZvY3VzT3V0LG51bGwpOwotCQlhc3NlcnRFcXVhbHModGV4dC5nZXRUZXh0KCksYWR2ZW50dXJlLmdldE5hbWUoKSk7Ci0JCS8vIE5vdyBjaGFuZ2UgdGhlIHRleHQgYWdhaW4gYW5kIHByZXNzIGVzY2FwZSBhIHNlY29uZCB0aW1lCi0JCXRleHQuc2V0VGV4dCgiVHVya2V5Iik7Ci0JCS8vIFNlbmQgZXNjYXBlCi0JCXRleHQubm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlEb3duLGV2ZW50KTsKLQkJLy8gVmVyaWZ5IGl0IGhhcyByZXZlcnRlZCB0byAiQXVzdHJpYSIgYW5kIG5vdCBhbnkgb3RoZXIgdmFsdWUsIGkuZS4gdGhlIGxhc3QgdmFsdWUgaXQgZGlzcGxheWVkCi0JCWFzc2VydEVxdWFscyhjdXJyZW50VGV4dCx0ZXh0LmdldFRleHQoKSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzA0KCl7Ci0JCS8vIFNob3cgdGhhdCB0aGUgRXNjYXBlIGtleSBjYW4gYmUgcHJlc3NlZCBpbiB0aGUgbWlkZGxlIG9mIGVkaXRpbmcgYW5kIHRoZSB2YWx1ZSB3aWxsIHJldmVydAotCQkvLyB0aGUgdXBkYXRlUG9saWN5IGZvciB0aGlzIHRlc3QgaXMgVElNRV9FQVJMWSBzbyBpdCBvY2N1cnMgd2hlbiBlYWNoIGtleXN0cm9rZSBvY2N1cnMgCi0JCWdldFNXVFVwZGF0YWJsZUZhY3RvcnkoKS5zZXRVcGRhdGVUaW1lKElEYXRhQmluZGluZ0NvbnRleHQuVElNRV9FQVJMWSk7CQotCQlnZXREYmMoKS5iaW5kKHRleHQsIG5ldyBQcm9wZXJ0eShhZHZlbnR1cmUsICJuYW1lIiksIG51bGwpOwotCQlTdHJpbmcgb3JpZ2luYWxOYW1lID0gYWR2ZW50dXJlLmdldE5hbWUoKTsKLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IGZpZWxkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIgYW5kIGVuc3VyZSB0aGF0IHRoZSBtb2RlbCBjaGFuZ2VzCi0JCVN0cmluZyBuZXdOYW1lID0gIlN3aXR6ZXJsYW5kIjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdOYW1lLmxlbmd0aCgpOyBpKyspIHsKLQkJCXRleHQuc2V0VGV4dChuZXdOYW1lLnN1YnN0cmluZygwLGkrMSkpOwotCQkJLy8gVmVyaWZ5IHRoZSBtb2RlbCBoYXMgY2hhbmdlZAkJCQotCQkJYXNzZXJ0RXF1YWxzKG5ld05hbWUuc3Vic3RyaW5nKDAsaSsxKSxhZHZlbnR1cmUuZ2V0TmFtZSgpKTsKLQkJfQotCQkvLyBOb3cgc2VuZCBhbiBlc2NhcGUga2V5IGFuZCB2ZXJpZnkgdGhhdCB0aGUgbW9kZWwgcmV2ZXJ0cwotCQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCQlldmVudC5jaGFyYWN0ZXIgPSBTV1QuRVNDOwotCQlldmVudC5rZXlDb2RlID0gMjc7Ci0JCXRleHQubm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlEb3duLGV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKGFkdmVudHVyZS5nZXROYW1lKCksb3JpZ2luYWxOYW1lKTsKLQkJLy8gTm93IHNlbmQgIkF1c3RyaWEiIGtleSBieSBrZXkKLQkJbmV3TmFtZSA9ICJBdXN0cmlhIjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdOYW1lLmxlbmd0aCgpOyBpKyspIHsKLQkJCXRleHQuc2V0VGV4dChuZXdOYW1lLnN1YnN0cmluZygwLGkrMSkpOwotCQkJLy8gVmVyaWZ5IHRoZSBtb2RlbCBoYXMgY2hhbmdlZAkJCQotCQkJYXNzZXJ0RXF1YWxzKG5ld05hbWUuc3Vic3RyaW5nKDAsaSsxKSxhZHZlbnR1cmUuZ2V0TmFtZSgpKTsKLQkJfQotCQkvLyBTZW5kIGEgZm9jdXMgbG9zdCBldmVudCB0byBjb21taXQgdGhlIGNoYW5nZQotCQl0ZXh0Lm5vdGlmeUxpc3RlbmVycyhTV1QuRm9jdXNPdXQsbnVsbCk7Ci0JCS8vIFNlbmQgYW4gZXNjYXBlIGtleQkKLQkJdGV4dC5ub3RpZnlMaXN0ZW5lcnMoU1dULktleURvd24sZXZlbnQpOwkJCi0JCS8vIFZlcmlmeSB0aGF0IHRoZSBtb2RlbCBoYXMgY2hhbmdlZCBhbmQgaGFzIG5vdCByZXZlcnRlZAotCQlhc3NlcnRFcXVhbHMobmV3TmFtZSxhZHZlbnR1cmUuZ2V0TmFtZSgpKTsJCQotCX0KLS8qKgkJCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMDUoKXsKLQkJLy8gU2hvdyB0aGF0IG5lc3Rpbmcgb2YgcHJvcGVydGllcyB3b3Jrcy4gIEFkdmVudHVyZSBoYXMgZGVmYXVsdExvZGdpbmcgYW5kIExvZGdpbmcgaGFzIG5hbWUKLQkJZ2V0RGJjKCkuYmluZCh0ZXh0LG5ldyBQcm9wZXJ0eShhZHZlbnR1cmUsImRlZmF1bHRMb2RnaW5nLm5hbWUiKSxudWxsKTsKLQkJLy8gVmVyaWZ5IHRoZSBHVUkgaXMgc2hvd2luZyB0aGUgbW9kZWwgdmFsdWUKLQkJYXNzZXJ0RXF1YWxzKHRleHQuZ2V0VGV4dCgpLGFkdmVudHVyZS5nZXREZWZhdWx0TG9kZ2luZygpLmdldE5hbWUoKSk7Ci0JCQotCX0KLSoqLwotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzA2KCl7Ci0JCS8vIFNob3cgdGhhdCBwYXJ0aWFsIHZhbGlkYXRpb24gd29ya3MgZm9yIFRJTUVfRUFSTFkKLQkJLy8gV2UgYXJlIHVzaW5nIFRJTUVfRUFSTFkgdG8gdmVyaWZ5IHRoYXQgaW52YWxpZCBzdGF0ZXMgYXJlIG5vdCBzZW50IHRvIHRoZSBtb2RlbAkJCi0JCWdldFNXVFVwZGF0YWJsZUZhY3RvcnkoKS5zZXRVcGRhdGVUaW1lKElEYXRhQmluZGluZ0NvbnRleHQuVElNRV9FQVJMWSk7CQkKLQkJZ2V0RGJjKCkuYmluZCh0ZXh0LCBuZXcgUHJvcGVydHkoYWNjb3VudCwgInBob25lIiksIG5ldyBCaW5kU3BlYyhuZXcgUGhvbmVDb252ZXJ0ZXIoKSxuZXcgUGhvbmVWYWxpZGF0b3IoKSkpOwotCQkvLyBWZXJpZnkgd2UgaGF2ZSBubyBlcnJvciBtZXNzYWdlIGZvciBwYXJ0aWFsIHZhbGlkYXRpb24gb3IgZnVsbCB2YWxpZGF0aW9uIHlldAotCQlhc3NlcnRUcnVlKCgoU3RyaW5nKWdldERiYygpLmdldFBhcnRpYWxWYWxpZGF0aW9uTWVzc2FnZSgpLmdldFZhbHVlKCkpLmxlbmd0aCgpID09IDApOwotCQlhc3NlcnRUcnVlKCgoU3RyaW5nKWdldERiYygpLmdldFZhbGlkYXRpb25NZXNzYWdlKCkuZ2V0VmFsdWUoKSkubGVuZ3RoKCkgPT0gMCk7Ci0JCS8vIFVwZGF0ZSBzb21lIG9mIHRoZSBwaG9uZSBudW1iZXIJCQotCQlTdHJpbmcgb3JpZ2luYWxQaG9uZU51bWJlciA9IGFjY291bnQuZ2V0UGhvbmUoKTsKLQkJdGV4dC5zZXRUZXh0KCI5OTkiKTsKLQkJLy8gVmVyaWZ5IHRoYXQgdGhlIHBob25lIG51bWJlciBpcyBwYXJ0aWFsbHkgaW52YWxpZCBhbmQgdGhlcmUgaXMgbm8gdmFsaWRhdGlvbiBtZXNzYWdlCi0JCWFzc2VydFRydWUoKChTdHJpbmcpZ2V0RGJjKCkuZ2V0UGFydGlhbFZhbGlkYXRpb25NZXNzYWdlKCkuZ2V0VmFsdWUoKSkubGVuZ3RoKCkgPiAwKTsKLQkJYXNzZXJ0VHJ1ZSgoKFN0cmluZylnZXREYmMoKS5nZXRWYWxpZGF0aW9uTWVzc2FnZSgpLmdldFZhbHVlKCkpLmxlbmd0aCgpID09IDApOwotCQkvLyBBbmQgdGhhdCB0aGUgbW9kZWwgaGFzIG5vdCBjaGFuZ2VkCi0JCWFzc2VydEVxdWFscyhhY2NvdW50LmdldFBob25lKCksb3JpZ2luYWxQaG9uZU51bWJlcik7Ci0JCS8vIFZlcmlmeSB0aGF0IGZpeGluZyB0aGUgcGhvbmUgcmVtb3ZlcyB0aGUgZXJyb3IgYW5kIHRoZSBtb2RlbCBpcyB1cGRhdGVkIHRvbwotCQl0ZXh0LnNldFRleHQoIjk5OS04ODgtNzc3NyIpOwkJCi0JCWFzc2VydFRydWUoKChTdHJpbmcpZ2V0RGJjKCkuZ2V0UGFydGlhbFZhbGlkYXRpb25NZXNzYWdlKCkuZ2V0VmFsdWUoKSkubGVuZ3RoKCkgPT0gMCk7Ci0JCWFzc2VydEVxdWFscyhhY2NvdW50LmdldFBob25lKCksIjk5OTg4ODc3NzciKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzA3KCl7Ci0JCS8vIFNob3cgdGhhdCBwYXJ0aWFsIHZhbGlkYXRpb24gd29ya3MgZm9yIFRJTUVfTEFURQotCQlnZXRTV1RVcGRhdGFibGVGYWN0b3J5KCkuc2V0VXBkYXRlVGltZShJRGF0YUJpbmRpbmdDb250ZXh0LlRJTUVfTEFURSk7Ci0JCWdldERiYygpLmJpbmQodGV4dCwgbmV3IFByb3BlcnR5KGFjY291bnQsICJwaG9uZSIpLCBuZXcgQmluZFNwZWMobmV3IFBob25lQ29udmVydGVyKCksbmV3IFBob25lVmFsaWRhdG9yKCkpKTsJCQotCQkvLyBVcGRhdGUgc29tZSBvZiB0aGUgcGhvbmUgbnVtYmVyCQkKLQkJU3RyaW5nIG9yaWdpbmFsUGhvbmVOdW1iZXIgPSBhY2NvdW50LmdldFBob25lKCk7Ci0JCXRleHQuc2V0VGV4dCgiMjIyIik7Ci0JCS8vIFZlcmlmeSB0aGF0IHdlIGhhdmUgbm8gY29tcGxldGlvbiB2YWxpZGF0aW9uIG1lc3NhZ2UgYW5kIGEgcGFydGlhbCBvbmUKLQkJYXNzZXJ0VHJ1ZSgoKFN0cmluZylnZXREYmMoKS5nZXRQYXJ0aWFsVmFsaWRhdGlvbk1lc3NhZ2UoKS5nZXRWYWx1ZSgpKS5sZW5ndGgoKSA+IDApOwotCQlhc3NlcnRUcnVlKCgoU3RyaW5nKWdldERiYygpLmdldFZhbGlkYXRpb25NZXNzYWdlKCkuZ2V0VmFsdWUoKSkubGVuZ3RoKCkgPT0gMCk7Ci0JCS8vIEZpeCB0aGUgZXJyb3IKLQkJdGV4dC5zZXRUZXh0KCIyMjItMzMzLTQ0NDQiKTsKLQkJLy8gVmVyaWZ5IHRoYXQgdGhlIGVycm9ycyBhcmUgYm90aCBmaXhlZAotCQlhc3NlcnRUcnVlKCgoU3RyaW5nKWdldERiYygpLmdldFBhcnRpYWxWYWxpZGF0aW9uTWVzc2FnZSgpLmdldFZhbHVlKCkpLmxlbmd0aCgpID09IDApOwotCQlhc3NlcnRUcnVlKCgoU3RyaW5nKWdldERiYygpLmdldFZhbGlkYXRpb25NZXNzYWdlKCkuZ2V0VmFsdWUoKSkubGVuZ3RoKCkgPT0gMCk7Ci0JCS8vIFRoZSBtb2RlbCBzaG91bGQgbm90IGJlIGNoYW5nZWQKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsUGhvbmVOdW1iZXIsYWNjb3VudC5nZXRQaG9uZSgpKTsKLQkJLy8gTG9zZSBmb2N1cyBhbmQgdmVyaWZ5IHRoYXQgdGhlIGNvbXBsZXRlIHZhbGlkYXRpb24gbWVzc2FnZSBpcyBmaXhlZAotCQl0ZXh0Lm5vdGlmeUxpc3RlbmVycyhTV1QuRm9jdXNPdXQsbnVsbCk7Ci0JCWFzc2VydFRydWUoKChTdHJpbmcpZ2V0RGJjKCkuZ2V0VmFsaWRhdGlvbk1lc3NhZ2UoKS5nZXRWYWx1ZSgpKS5sZW5ndGgoKSA9PSAwKTsKLQkJLy8gVGhlIG1vZGVsIHNob3VsZCBiZSBjaGFuZ2VkCi0JCWFzc2VydEVxdWFscygiMjIyMzMzNDQ0NCIsYWNjb3VudC5nZXRQaG9uZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMDgoKSB7Ci0JCS8vIFNob3cgdGhhdCB0aGUgQmVhbkJpbmRTdXBwb3J0RmFjdG9yeSB3aWxsIGF1dG9tYXRpY2FsbHkgcGljayB1cCB0aGUKLQkJLy8gdmFsaWRhdG9yIG9uIHRoZSBNYXhOdW1iZXJPZlBlb3BsZSBwcm9wZXJ0eQotCQlnZXRTV1RVcGRhdGFibGVGYWN0b3J5KCkuc2V0VXBkYXRlVGltZShJRGF0YUJpbmRpbmdDb250ZXh0LlRJTUVfRUFSTFkpOwkKLQkJZ2V0RGJjKCkuYWRkQmluZFN1cHBvcnRGYWN0b3J5KG5ldyBCZWFuQmluZFN1cHBvcnRGYWN0b3J5KCkpOwotCQlnZXREYmMoKS5iaW5kKHRleHQsIG5ldyBQcm9wZXJ0eShhZHZlbnR1cmUsICJtYXhOdW1iZXJPZlBlb3BsZSIpLCBudWxsKTsKLQkJLy8gbWFrZSBzdXJlIHdlIGNhbiBzZXQgYSB2YWx1ZSBpbnNpZGUgdGhlIHZhbGlkYXRvcidzIHJhbmdlCi0JCXRleHQuc2V0VGV4dCgiNCIpOwotCQlhc3NlcnRFcXVhbHMoNCwgYWR2ZW50dXJlLmdldE1heE51bWJlck9mUGVvcGxlKCkpOwotCQkvLyBOb3cgdHJ5IHRvIHNldCBhIHZhbHVlIG91dHNpZGUgdGhlIHZhbGlkYXRvcidzIHJhbmdlCi0JCXRleHQuc2V0VGV4dCgiOTk5Iik7Ci0JCWFzc2VydEVxdWFscyg0LCBhZHZlbnR1cmUuZ2V0TWF4TnVtYmVyT2ZQZW9wbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzA5KCl7Ci0JCQotCQkvLyBWZXJpZnkgZGlyZWN0IGJpbmRpbmcgYmV0d2VlbiBhIFRleHQgYW5kIExhYmVsIGZvbGxvd2luZyBidWd6aWxsYSAxMTg2OTYKLQkJZ2V0U1dUVXBkYXRhYmxlRmFjdG9yeSgpLnNldFVwZGF0ZVRpbWUoSURhdGFCaW5kaW5nQ29udGV4dC5USU1FX0xBVEUpOwotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChnZXRDb21wb3NpdGUoKSxTV1QuTk9ORSk7Ci0JCWdldERiYygpLmJpbmQodGV4dCxsYWJlbCxudWxsKTsKLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0Ci0JCXRleHQuc2V0VGV4dCgiRnJvZyIpOwotCQkvLyBWZXJpZnkgdGhlIGxhYmVsIGRvZXMgbm90IGNoYW5nZQotCQlhc3NlcnRUcnVlKGxhYmVsLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKTsKLQkJLy8gTG9zZSBmb2N1cyBmcm9tIHRoZSB0ZXh0IGZpZWxkCi0JCXRleHQubm90aWZ5TGlzdGVuZXJzKFNXVC5Gb2N1c091dCxudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxhYmVsLmdldFRleHQoKSwiRnJvZyIpOwotIAkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvMTAoKXsKLQkJCi0JCS8vIFZlcmlmeSBkaXJlY3QgYmluZGluZyBiZXR3ZWVuIGEgVGV4dCBhbmQgTGFiZWwgZm9sbG93aW5nIGJ1Z3ppbGxhIDExODY5NiB3aXRoIFRJTUVfRUFSTFkKLQkJZ2V0U1dUVXBkYXRhYmxlRmFjdG9yeSgpLnNldFVwZGF0ZVRpbWUoSURhdGFCaW5kaW5nQ29udGV4dC5USU1FX0VBUkxZKTsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZ2V0Q29tcG9zaXRlKCksU1dULk5PTkUpOwotCQlnZXREYmMoKS5iaW5kKHRleHQsbGFiZWwsbnVsbCk7Ci0JCS8vIENoYW5nZSB0aGUgdGV4dAotCQlTdHJpbmcgbmV3VGV4dFZhbHVlID0gIkZyb2ciOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1RleHRWYWx1ZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQl0ZXh0LnNldFRleHQobmV3VGV4dFZhbHVlLnN1YnN0cmluZygwLGkrMSkpOwotCQkJLy8gVmVyaWZ5IHRoZSBsYWJlbCBoYXMgY2hhbmdlZCBrZXkgYnkga2V5CQkJCi0JCQlhc3NlcnRFcXVhbHModGV4dC5nZXRUZXh0KCksbGFiZWwuZ2V0VGV4dCgpKTsKLQkJfQotCQkvLyBMb3NlIGZvY3VzCi0JCXRleHQubm90aWZ5TGlzdGVuZXJzKFNXVC5Gb2N1c091dCxudWxsKTsKLQkJLy8gVmVyaWZ5IHRoZSB0ZXh0IGFuZCBsYWJlbCBhcmUgdGhlIHNhbWUgZm9sbG93aW5nIGEgbG9zZSBmb2N1cwotCQlhc3NlcnRFcXVhbHModGV4dC5nZXRUZXh0KCksbGFiZWwuZ2V0VGV4dCgpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvZGF0YWJpbmRpbmcvc2NlbmFyaW9zL1RyZWVTY2VuYXJpb3MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvVHJlZVNjZW5hcmlvcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDI4MmFjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvVHJlZVNjZW5hcmlvcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcuc2NlbmFyaW9zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLlRyZWVNb2RlbERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZpZXdlcnMuVHJlZVZpZXdlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnZpZXdlcnMuVmlld2Vyc1Byb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQWNjb3VudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5BZHZlbnR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZXhhbXBsZXMuZGF0YWJpbmRpbmcubW9kZWwuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmluZGluZy5tb2RlbC5Mb2RnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmV4YW1wbGVzLmRhdGFiaW5kaW5nLm1vZGVsLlNhbXBsZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotIAotCi1wdWJsaWMgY2xhc3MgVHJlZVNjZW5hcmlvcyBleHRlbmRzIFNjZW5hcmlvc1Rlc3RDYXNlIHsKLQkKLQlUcmVlIHRyZWU9bnVsbDsKLQlUcmVlVmlld2VyIHR2aWV3ZXIgPSBudWxsOwotCVRyZWVDb2x1bW4gZmlyc3RDb2wgPSBudWxsOwotCVRyZWVDb2x1bW4gc2Vjb25kQ29sID0gbnVsbDsKLQkKLQkvLyBtb2RlbAotCUNhdGFsb2cgY2F0YWxvZyA9IG51bGw7CQotCUlUcmVlICAgY2F0YWxvZ01vZGVsVHJlZSA9IG51bGw7Ci0JSVRyZWUgICBkaXJlY3RvcnlNb2RlbFRyZWUgPSBudWxsOwkKLQkKLQkKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWdldENvbXBvc2l0ZSgpLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotCQl0cmVlID0gbmV3IFRyZWUoZ2V0Q29tcG9zaXRlKCksIFNXVC5OT05FKTsKLQkJZmlyc3RDb2wgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCWZpcnN0Q29sLnNldFdpZHRoKDEwMCk7Ci0JCXNlY29uZENvbCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJc2Vjb25kQ29sLnNldFdpZHRoKDEwMCk7Ci0JCXR2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKLQkJCi0JCWNhdGFsb2cgPSBTYW1wbGVEYXRhLkNBVEFMT0dfMjAwNTsgLy8gTG9kZ2luZyBzb3VyY2UKLQkJCQotCQljYXRhbG9nTW9kZWxUcmVlID0gU2FtcGxlRGF0YS5DQVRBTE9HX1RSRUU7Ci0JCQotCQkvLyBDcmVhdGUgYSByZWFkIG9ubHkgSVRyZWUgd3JhcHBlciBmb3IgZGlzawotCQkvLyBGaWxlIHN5c3RlbS4gIEEgY2FsbCB0byBzZXRDaGlsZHJlbiB3aWxsIGp1c3QgZmlyZQotCQkvLyBhIGNoYW5nZSBldmVudC4KLQkJZGlyZWN0b3J5TW9kZWxUcmVlID0gbmV3IElUcmVlKCkgewkJCQkJCi0JCQlwcml2YXRlIElUcmVlLkNoYW5nZVN1cHBvcnQgY2hhbmdlU3VwcG9ydCA9IG51bGw7CQkJCi0JCQlwcml2YXRlIE9iamVjdFtdIHJvb3RPYmplY3RzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0KLQkJCXB1YmxpYyBDbGFzc1tdIGdldFR5cGVzKCkgewotCQkJCXJldHVybiBuZXcgQ2xhc3NbXSB7IEZpbGUuY2xhc3MgfSA7Ci0JCQl9Ci0JCQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChGaWxlKWVsZW1lbnQpLmlzRGlyZWN0b3J5KCk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCQkJLy8gT25seSBhbGxvdyB0byBjaGFuZ2UgY2hhbmdlIHRoZSByb290IGRpcmVjdG9yeS9pZXMKLQkJCQlPYmplY3Qgb2xkOwotCQkJCWlmIChwYXJlbnRFbGVtZW50PT1udWxsKSB7Ci0JCQkJCW9sZCA9IHJvb3RPYmplY3RzOwotCQkJCQlyb290T2JqZWN0cyA9IGNoaWxkcmVuPT1udWxsP0NvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOmNoaWxkcmVuOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJb2xkID0gZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0JCQkJCS8vIHRoaXMgdHJlZSBkb2VzIG5vdCByZWFsbHkgY3JlYXRlIGZpbGVzCi0JCQkJCS8vIFRoaXMgInNldCIgaXMganVzdCB0byByaW5nIHRoZSBkb29yIGJlbGwKLQkJCQkJLy8gZm9yIHRoZSB0ZXN0Ci0JCQkJfQotCQkJCWlmIChjaGFuZ2VTdXBwb3J0IT1udWxsKSB7Ci0JCQkJCUNoYW5nZUV2ZW50IGV2ZW50ID0gbmV3IENoYW5nZUV2ZW50KHRoaXMsIENoYW5nZUV2ZW50LlJFUExBQ0UsIG9sZCwgY2hpbGRyZW4sIHBhcmVudEVsZW1lbnQsIC0xKTsJCQkJCQkJCQotCQkJCQljaGFuZ2VTdXBwb3J0LmZpcmVUcmVlQ2hhbmdlKGV2ZW50KTsKLQkJCQl9CQkJCQotCQkJfQotCQkJCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJCWlmIChwYXJlbnRFbGVtZW50PT1udWxsKQotCQkJCQlyZXR1cm4gcm9vdE9iamVjdHM7Ci0JCQkJCi0JCQkJRmlsZVtdIGNoaWxkcmVuID0gKChGaWxlKXBhcmVudEVsZW1lbnQpLmxpc3RGaWxlcygpOwotCQkJCWlmIChjaGlsZHJlbj09bnVsbCkgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOwotCQkJCQotCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKElDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCWlmIChjaGFuZ2VTdXBwb3J0PT1udWxsKQotCQkJCQljaGFuZ2VTdXBwb3J0ID0gbmV3IElUcmVlLkNoYW5nZVN1cHBvcnQodGhpcyk7Ci0JCQkJY2hhbmdlU3VwcG9ydC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoSUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJaWYgKGNoYW5nZVN1cHBvcnQhPW51bGwpCi0JCQkJCWNoYW5nZVN1cHBvcnQucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQljaGFuZ2VTdXBwb3J0PW51bGw7Ci0JCQl9CQkKLQkJfTsKLQkJCQkKLQkJLy8gRmluZCBhIHRlbXAgZGlyZWN0b3J5Ci0JCUZpbGUgdGVtcCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIlRyZWVTY2VuYXJpbyIsImpVbml0Iik7Ci0JCUZpbGUgcm9vdCA9IG5ldyBGaWxlICh0ZW1wLmdldFBhcmVudCgpLCJUcmVlU2NlbmFyaW9EaXIiKTsKLQkJdGVtcC5kZWxldGUoKTsKLQkJCi0JCWlmIChyb290LmV4aXN0cygpKSAKLQkJCWRlbGV0ZUZpbGUocm9vdCk7Ci0JCS8vIENyZWF0ZSBhIHRlbXBvcGFyeSBkaXJlY3RvcnkKLQkJcm9vdC5ta2RpcnMoKTsKLQkJCi0JCS8vIHByaW1lIHRoZSBJVHJlZSAKLQkJZGlyZWN0b3J5TW9kZWxUcmVlLnNldENoaWxkcmVuKG51bGwsIG5ldyBPYmplY3RbXSB7cm9vdH0pOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZUZpbGUgKEZpbGUgZikgewotCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlW10gbGlzdCA9IGYubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIAotCQkJCWRlbGV0ZUZpbGUobGlzdFtpXSk7CQkJCQkJCQotCQl9Ci0JCWYuZGVsZXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyZWUuZGlzcG9zZSgpOwotCQl0cmVlID0gbnVsbDsKLQkJdHZpZXdlciA9IG51bGw7Ci0JCUZpbGUgcm9vdCA9IChGaWxlKSBkaXJlY3RvcnlNb2RlbFRyZWUuZ2V0Q2hpbGRyZW4obnVsbClbMF07Ci0JCWRlbGV0ZUZpbGUocm9vdCk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCi0JLyoKLQkgKiBSZWN1cnNpdmVseSB0cmF2ZXJlIHRyZWUgbGV2ZWxzLCBhbmQgYXNzZXJ0cyB0aGF0IGVsZW1lbnRzIChvYmplY3RzLCBub3QgY29sLikgCi0JICogaW4gYSBnaXZlbiBsZXZlbCBhcmUgdGhlIGVxdWFsLgotCSAqIAotCSAqIHZpZXdlci9tb2RlbCBOb2RlcyBhcmUgdGhlIGN1cnJlbnQgdHJhdmVyc2UgbGV2ZWwuCi0JICogbW9kZWwsIGlzIHRoZSBtb2RlbCB0cmVlLiAgVGhlIHZpZXdlciBpcyBhbHdheXMgYXNzdW1lZCBmb3IgdGhlIHRhcmdldC4KLQkgKiAKLQkgKiBOb3RlOiBhIGNhbGwgdG8gdGhpcyBhc3NlcnRpb24gd2lsbCBwdWxsIHRoZSBjb21wbGV0ZSB0cmVlIHRvIHRoZSB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFsc1RyZWVOb2RlIChPYmplY3Qgdmlld2VyTm9kZSwgT2JqZWN0IG1vZGVsTm9kZSwgSVRyZWUgbW9kZWwpIHsKLQkJCi0JCWFzc2VydEVxdWFscyh2aWV3ZXJOb2RlLCBtb2RlbE5vZGUpOwotCQlPYmplY3RbXSB2aWV3ZXJDaGlsZHJlbiA9ICgoSVRyZWVDb250ZW50UHJvdmlkZXIpdHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKSkuZ2V0Q2hpbGRyZW4odmlld2VyTm9kZSk7Ci0JCWlmICh2aWV3ZXJDaGlsZHJlbi5sZW5ndGg9PTApCi0JCQl2aWV3ZXJDaGlsZHJlbj1udWxsOwotCQlPYmplY3RbXSBtb2RlbENoaWxkcmVuID0gbW9kZWwuZ2V0Q2hpbGRyZW4obW9kZWxOb2RlKTsKLQkJaWYgKG1vZGVsQ2hpbGRyZW4hPW51bGwgJiYgbW9kZWxDaGlsZHJlbi5sZW5ndGg9PTApCi0JCQltb2RlbENoaWxkcmVuPW51bGw7Ci0JCQotCQlpZiAodmlld2VyQ2hpbGRyZW49PW51bGwgfHwgbW9kZWxDaGlsZHJlbj09bnVsbCkgewotCQkJYXNzZXJ0RXF1YWxzKHZpZXdlckNoaWxkcmVuLCBtb2RlbENoaWxkcmVuKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRFcXVhbHModmlld2VyQ2hpbGRyZW4ubGVuZ3RoLCBtb2RlbENoaWxkcmVuLmxlbmd0aCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGVsQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIAotCQkJYXNzZXJ0RXF1YWxzVHJlZU5vZGUodmlld2VyQ2hpbGRyZW5baV0sIG1vZGVsQ2hpbGRyZW5baV0sIG1vZGVsKTsJCQotCX0KLQkKLQkvKioKLQkgKiBSYXcgVHJlZVZpZXdlciBiaW5kaW5nLiAgTm8gVHJlZVZpZXdlckRlc2NyaXB0aW9uLiAgSSBpbiB0aGlzIGNhc2UKLQkgKiBpdCBpcyBhc3N1bWVkIHRoYXQgYSB1c2VyIHdpbGwgcHJvdmlkZSBsYWJlbCBwcm92aWRlciBhbmQgY2VsbCBlZGl0b3JzL21vZGlmaWVyLgotCSAqIAotCSAqIEVuc3VyZSB0aGF0IHRyZWUgbW9kZWwgaXMgcHJvcGFnYXRlZCB2aXJ0dWFseS4gCi0JICogdG8gdGhlIHRhcmdldCwgYW5kIHRoYXQgY2hhbmdlcyBpbiBvbmUsIHVwZGF0ZSB0aGUgb3RoZXIgCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9UcmVlc19TY2VuYXJpbzAxKCkgewotCQkKLQkJZ2V0RGJjKCkuYmluZChuZXcgUHJvcGVydHkodHZpZXdlciwgVmlld2Vyc1Byb3BlcnRpZXMuQ09OVEVOVCksIGNhdGFsb2dNb2RlbFRyZWUsIG51bGwpOwotCQkJCQkJCi0JCS8vIEVuc3VyZSB0aGF0IHRoZSBjYXRhbG9nIHRyZWUgaXMgZnVsbHkgcHJvcGFnYXRlZCB0byB0aGUgdmlld2VyCi0JCWFzc2VydEVxdWFsc1RyZWVOb2RlKG51bGwsIG51bGwsIGNhdGFsb2dNb2RlbFRyZWUpOwotCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXNzZXJ0TGFiZWxQcm92aWRlcihUcmVlSXRlbSBpdGVtKSB7Ci0JCQotLy8JCVRoaXMgaXMgdGhlIHdheSB0aGUgU0FNUExFIHRyZWUgaXMgYWRkaW5nIGNoaWxkcmVuIHRvIHRoZSBjYXRhbG9nIChmaXJzdCBsZXZlbCkKLS8vCQlGb2xsb3cgdGhpcyBvcmRlcgotLy8JCQotLy8JCWxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoKChDYXRhbG9nKXBhcmVudEVsZW1lbnQpLmdldENhdGVnb3JpZXMoKSkpOwotLy8JCWxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoKChDYXRhbG9nKXBhcmVudEVsZW1lbnQpLmdldExvZGdpbmdzKCkpKTsKLS8vCQlsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KCgoQ2F0YWxvZylwYXJlbnRFbGVtZW50KS5nZXRBY2NvdW50cygpKSk7Ci0vLwotLy8gICAgICBBbHNvLCBtYWtlIHN1cmUgdG8gbWFpdGFpbmVkIHRoaXMgb3JkZXIgd2hlbiB1c2luZyBhICBUcmVlTW9kZWxEZXNjcmlwdGlvbi4KLS8vCQkKLS8vCQltb2RlbERlc2NyaXB0aW9uLmFkZENoaWxkcmVuUHJvcGVydHkoQ2F0YWxvZy5jbGFzcywgImNhdGVnb3JpZXMiKTsKLS8vCQltb2RlbERlc2NyaXB0aW9uLmFkZENoaWxkcmVuUHJvcGVydHkoQ2F0YWxvZy5jbGFzcywgImxvZGdpbmdzIik7Ci0vLwkJbW9kZWxEZXNjcmlwdGlvbi5hZGRDaGlsZHJlblByb3BlcnR5KENhdGFsb2cuY2xhc3MsICJhY2NvdW50cyIpOwotLy8JCQkJCi0vLwkJbW9kZWxEZXNjcmlwdGlvbi5hZGRDaGlsZHJlblByb3BlcnR5KENhdGVnb3J5LmNsYXNzLCAiYWR2ZW50dXJlcyIpOwkJCi0JCQotCi0JCUFjY291bnRbXSBhY2NvdW50cyA9IGNhdGFsb2cuZ2V0QWNjb3VudHMoKTsKLQkJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gY2F0YWxvZy5nZXRDYXRlZ29yaWVzKCk7Ci0JCUxvZGdpbmdbXSBsb2RnaW5ncyA9IGNhdGFsb2cuZ2V0TG9kZ2luZ3MoKTsKLQkJCi0JCXR2aWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCXNwaW5FdmVudExvb3AoMCk7Ci0JCS8vIEVuc3VyZSB0aGF0IHRoZSBsYWJlbCBwcm92aWRlciBmb2xsb3dzIHRoZSBUYWJsZVZpZXdlckRlc2NyaXB0aW9uIG1hcAotCQlUcmVlSXRlbVtdIGZpcnN0TGV2ZWwgPSBpdGVtLmdldEl0ZW1zKCk7CQkKLQkJaW50IGluZGV4ID0gMDsJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpKyssIGluZGV4KyspIHsgCi0JCQkvLyBDYXRlZ29yaWVzCi0JCQlhc3NlcnRFcXVhbHMoY2F0ZWdvcmllc1tpXS5nZXROYW1lKCksIGZpcnN0TGV2ZWxbaW5kZXhdLmdldFRleHQoKSk7Ci0JCQkKLQkJCS8vIEFkdmVudHVyZXMKLQkJCVRyZWVJdGVtW10gc2Vjb25kTGV2ZWwgPSBmaXJzdExldmVsW2luZGV4XS5nZXRJdGVtcygpOwotCQkJQWR2ZW50dXJlW10gYWR2ZW50dXJlcyA9IGNhdGVnb3JpZXNbaV0uZ2V0QWR2ZW50dXJlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWNvbmRMZXZlbC5sZW5ndGg7IGorKykgewotCQkJCWFzc2VydEVxdWFscyhhZHZlbnR1cmVzW2pdLmdldE5hbWUoKSwgc2Vjb25kTGV2ZWxbal0uZ2V0VGV4dCgwKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvdWJsZS50b1N0cmluZyhhZHZlbnR1cmVzW2pdLmdldFByaWNlKCkpLCBzZWNvbmRMZXZlbFtqXS5nZXRUZXh0KDEpKTsJCQkJCi0JCQl9Ci0JCX0KLQkJLy8gTG9kZ2luZwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvZGdpbmdzLmxlbmd0aDsgaSsrLCBpbmRleCsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMobG9kZ2luZ3NbaV0uZ2V0TmFtZSgpLCBmaXJzdExldmVsW2luZGV4XS5nZXRUZXh0KDApKTsKLQkJCWFzc2VydEVxdWFscyhsb2RnaW5nc1tpXS5nZXREZXNjcmlwdGlvbigpLCBmaXJzdExldmVsW2luZGV4XS5nZXRUZXh0KDEpKTsKLQkJfQotCQkvLyBBY2NvdW50Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWNjb3VudHMubGVuZ3RoOyBpKyssIGluZGV4KyspIHsKLQkJCWFzc2VydEVxdWFscyhhY2NvdW50c1tpXS5nZXRGaXJzdE5hbWUoKSwgZmlyc3RMZXZlbFtpbmRleF0uZ2V0VGV4dCgwKSk7Ci0JCQlhc3NlcnRFcXVhbHMoYWNjb3VudHNbaV0uZ2V0TGFzdE5hbWUoKSwgZmlyc3RMZXZlbFtpbmRleF0uZ2V0VGV4dCgxKSk7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBVc2UgYSBUcmVlVmlld2VyRGVzY3JpcHRpb24gdG8gYmluZCBhIFRyZWVWaWV3ZXIgdG8gYSBJVHJlZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X1RyZWVzX1NjZW5hcmlvMDIoKSB7Ci0JCQotCQkvLwlEZXNjcmliZSB0aGUgVmlld2VyCi0JCVRyZWVWaWV3ZXJEZXNjcmlwdGlvbiB0cmVlRGVzY3JpcHRpb24gPSBuZXcgVHJlZVZpZXdlckRlc2NyaXB0aW9uKHR2aWV3ZXIpOwotCQkvLyBjYXRhbG9nIGhhcyBubyAibmFtZSIgcHJvcGVydHkuLi4gc28gdXNlIGdldENsYXNzLmdldE5hbWUoKQotCQl0cmVlRGVzY3JpcHRpb24uYWRkQ29sdW1uKENhdGFsb2cuY2xhc3MsICJjbGFzcy5uYW1lIik7Ci0JCS8vIExvZGdpbmcgd2lsbCBoYXZlIHR3byBjb2x1bXMKLQkJdHJlZURlc2NyaXB0aW9uLmFkZENvbHVtbihMb2RnaW5nLmNsYXNzLCAibmFtZSIpOwotCQl0cmVlRGVzY3JpcHRpb24uYWRkQ29sdW1uKExvZGdpbmcuY2xhc3MsICJkZXNjcmlwdGlvbiIpOwkJCi0JCS8vIEFkdmVudHVyZXMgd2lsbCBoYXZlIHR3byBjb2x1bW5zCi0JCXRyZWVEZXNjcmlwdGlvbi5hZGRDb2x1bW4oQWR2ZW50dXJlLmNsYXNzLCAibmFtZSIpOwotCQl0cmVlRGVzY3JpcHRpb24uYWRkQ29sdW1uKEFkdmVudHVyZS5jbGFzcywgInByaWNlIik7Ci0vLwkJdHJlZURlc2NyaXB0aW9uLmdldENvbHVtbihBZHZlbnR1cmUuY2xhc3MsIDEpLnNldFByb3BlcnR5VHlwZShEb3VibGUuVFlQRSk7CQkJCQkKLQkJLy8gQ2F0ZWdvcnkgd2lsbCBoYXZlIG9uZSBjb2x1bW4KLQkJdHJlZURlc2NyaXB0aW9uLmFkZENvbHVtbihDYXRlZ29yeS5jbGFzcywgIm5hbWUiKTsKLQkJLy8gQWNjb3VudCB3aWxsIGhhdmUgdHdvIGNvbHVtbnMKLQkJdHJlZURlc2NyaXB0aW9uLmFkZENvbHVtbihBY2NvdW50LmNsYXNzLCAiZmlyc3ROYW1lIik7Ci0JCXRyZWVEZXNjcmlwdGlvbi5hZGRDb2x1bW4oQWNjb3VudC5jbGFzcywgImxhc3ROYW1lIik7Ci0JCQotCQlnZXREYmMoKS5iaW5kKHRyZWVEZXNjcmlwdGlvbiwgY2F0YWxvZ01vZGVsVHJlZSwgbnVsbCk7Ci0JCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBjYXRhbG9nIG1vZGVsIGhhcyBiZWVuIHByb3BhZ2F0ZWQgdG8gdGhlIHZpZXdlcgotCQlhc3NlcnRFcXVhbHNUcmVlTm9kZShudWxsLCBudWxsLCBjYXRhbG9nTW9kZWxUcmVlKTsJCQkJCi0JCQotCQlUcmVlSXRlbSBpdGVtID0gdHZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbSgwKTsJCQotCQlhc3NlcnRFcXVhbHMoaXRlbS5nZXRUZXh0KCksIGNhdGFsb2cuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0TGFiZWxQcm92aWRlcihpdGVtKTsKLQotCX0KLQkKLQkvKioKLQkgKiBTaW1wbGUgYmluZGluZyBvZiBhIFRyZWVWaWV3ZXIgdG8gYSBUcmVlIE1vZGVsIERlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9UcmVlc19TY2VuYXJpbzAzKCkgewotCQkKLQkJLy8gRGVzY3JpYmUgdGhlIFZpZXdlcgotCQlUcmVlVmlld2VyRGVzY3JpcHRpb24gdHJlZURlc2NyaXB0aW9uID0gbmV3IFRyZWVWaWV3ZXJEZXNjcmlwdGlvbih0dmlld2VyKTsKLQkJdHJlZURlc2NyaXB0aW9uLmFkZENvbHVtbihDYXRhbG9nLmNsYXNzLCAiY2xhc3MubmFtZSIpOwotCQkKLQkJdHJlZURlc2NyaXB0aW9uLmFkZENvbHVtbihMb2RnaW5nLmNsYXNzLCAibmFtZSIpOwotCQl0cmVlRGVzY3JpcHRpb24uYWRkQ29sdW1uKExvZGdpbmcuY2xhc3MsICJkZXNjcmlwdGlvbiIpOwotCQkKLQkJdHJlZURlc2NyaXB0aW9uLmFkZENvbHVtbihBZHZlbnR1cmUuY2xhc3MsICJuYW1lIik7Ci0JCXRyZWVEZXNjcmlwdGlvbi5hZGRDb2x1bW4oQWR2ZW50dXJlLmNsYXNzLCAicHJpY2UiKTsKLQkJCQkJCi0JCXRyZWVEZXNjcmlwdGlvbi5hZGRDb2x1bW4oQ2F0ZWdvcnkuY2xhc3MsICJuYW1lIik7Ci0JCQotCQl0cmVlRGVzY3JpcHRpb24uYWRkQ29sdW1uKEFjY291bnQuY2xhc3MsICJmaXJzdE5hbWUiKTsKLQkJdHJlZURlc2NyaXB0aW9uLmFkZENvbHVtbihBY2NvdW50LmNsYXNzLCAibGFzdE5hbWUiKTsKLQkJCi0JCS8vIERlc2NyaWJlIHRoZSBtb2RlbAotCQlUcmVlTW9kZWxEZXNjcmlwdGlvbiBtb2RlbERlc2NyaXB0aW9uID0gbmV3IFRyZWVNb2RlbERlc2NyaXB0aW9uKG5ldyBPYmplY3RbXSB7Y2F0YWxvZ30pOwotCQkvLyBUaGUgb3JkZXIgcHJvcGVydGllcyBhcmUgYWRkZWQsIGRldGVybWluZSB0aGUgb3JkZXIgdGhhdCB0aGUgdHJlZSB3aWxsIGxpc3QKLQkJLy8gY2hpbGRyZW4gdGhhdCBjb21lIGZyb20gZGlmZmVyZW50IHByb3BlcnRpZXMKLQkJbW9kZWxEZXNjcmlwdGlvbi5hZGRDaGlsZHJlblByb3BlcnR5KENhdGFsb2cuY2xhc3MsICJjYXRlZ29yaWVzIik7Ci0JCW1vZGVsRGVzY3JpcHRpb24uYWRkQ2hpbGRyZW5Qcm9wZXJ0eShDYXRhbG9nLmNsYXNzLCAibG9kZ2luZ3MiKTsKLQkJbW9kZWxEZXNjcmlwdGlvbi5hZGRDaGlsZHJlblByb3BlcnR5KENhdGFsb2cuY2xhc3MsICJhY2NvdW50cyIpOwotCQkJCQotCQltb2RlbERlc2NyaXB0aW9uLmFkZENoaWxkcmVuUHJvcGVydHkoQ2F0ZWdvcnkuY2xhc3MsICJhZHZlbnR1cmVzIik7Ci0JCQkJCi0JCQotCQlnZXREYmMoKS5iaW5kKHRyZWVEZXNjcmlwdGlvbiwgbW9kZWxEZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCS8vCU1ha2Ugc3VyZSB0aGF0IHRoZSBjYXRhbG9nIG1vZGVsIGhhcyBiZWVuIHByb3BhZ2F0ZWQgdG8gdGhlIHZpZXdlcgotCQlhc3NlcnRFcXVhbHNUcmVlTm9kZShudWxsLCBudWxsLCBjYXRhbG9nTW9kZWxUcmVlKTsKLQkJCi0JCQkJCi0JCVRyZWVJdGVtIGl0ZW0gPSB0dmlld2VyLmdldFRyZWUoKS5nZXRJdGVtKDApOwkJCi0JCWFzc2VydEVxdWFscyhpdGVtLmdldFRleHQoKSwgY2F0YWxvZy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRMYWJlbFByb3ZpZGVyKGl0ZW0pOwotCi0JCS8vIFRlc3QgdGhlIEphdmFCZWFuIGV2ZW50IG1vZGVsIG9mIGEgVHJlZU1vZGVsRGVzY3JpcHRpb24gYmFzZWQgdHJlZS4KLQkJLy8KLQkJLy8gU2ltcGxlIHByb3BlcnR5IGNoYW5nZXMgLi4uICB0ZXN0IHRoYXQgdmlld2VyIGdvdCBhbGwgb2YgdGhlbSwKLQkJQWNjb3VudFtdIGFjY291bnRzID0gY2F0YWxvZy5nZXRBY2NvdW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjY291bnRzLmxlbmd0aDsgaSsrKSAKLQkJCWFjY291bnRzW2ldLnNldEZpcnN0TmFtZSgiQ2hhbmdlZDogIithY2NvdW50c1tpXS5nZXRGaXJzdE5hbWUoKSk7Ci0JCUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9IGNhdGFsb2cuZ2V0Q2F0ZWdvcmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpKyspIHsgCi0JCQljYXRlZ29yaWVzW2ldLnNldE5hbWUoIkNoYW5nZWQ6ICIrY2F0ZWdvcmllc1tpXS5nZXROYW1lKCkpOwotCQkJQWR2ZW50dXJlW10gYWR2ZW50dXJlcyA9IGNhdGVnb3JpZXNbaV0uZ2V0QWR2ZW50dXJlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhZHZlbnR1cmVzLmxlbmd0aDsgaisrKSAKLQkJCQlhZHZlbnR1cmVzW2pdLnNldE5hbWUoIkNoYW5nZWQ6ICIrYWR2ZW50dXJlc1tpXS5nZXROYW1lKCkpOwotCQl9Ci0JCS8vIGNvbXBhcmUgVHJlZUl0ZW1zLCBhbmQgTW9kZWwKLQkJYXNzZXJ0TGFiZWxQcm92aWRlcihpdGVtKTsKLQkJCi0JCS8vCi0JCS8vIFRlc3QgZm9yIGFkZGluZyBhbmQgcmVtb3ZpbmcgZWxlbWVudHMgZnJvbSB0aGUgVHJlZSBNb2RlbAotCQlBY2NvdW50IG5ld0FjY291bnQgPSBuZXcgQWNjb3VudCgpOwotCQluZXdBY2NvdW50LnNldEZpcnN0TmFtZSgiTmV3QmVlIik7Ci0JCW5ld0FjY291bnQuc2V0TGFzdE5hbWUoIkFwcGVuZGVkIik7Ci0JCQotCQkvL2FkZCB0byB0aGUgZW5kCi0JCWNhdGFsb2cuYWRkQWNjb3VudChuZXdBY2NvdW50KTsKLQkJYXNzZXJ0TGFiZWxQcm92aWRlcihpdGVtKTsKLQkJCi0JCS8vIHJlbW92ZSB0aGUgZmlyc3Qgb25lCi0JCWNhdGFsb2cucmVtb3ZlQWNjb3VudChjYXRhbG9nLmdldEFjY291bnRzKClbMF0pOwotCQlhc3NlcnRMYWJlbFByb3ZpZGVyKGl0ZW0pOwotCQkKLQkJLy8JYWRkIHRvIHRoZSBlbmQKLQkJQWR2ZW50dXJlIG5ld0FkdmVudHVyZSA9IG5ldyBBZHZlbnR1cmUoKTsKLQkJbmV3QWR2ZW50dXJlLnNldE5hbWUoIk1hcnJpYWdlIik7Ci0JCW5ld0FkdmVudHVyZS5zZXRQcmljZSg5OTk5OTk5OTk5OTk5TCk7Ci0JCWNhdGFsb2cuZ2V0Q2F0ZWdvcmllcygpWzBdLmFkZEFkdmVudHVyZShuZXdBZHZlbnR1cmUpOwkJCQotCQlhc3NlcnRMYWJlbFByb3ZpZGVyKGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIFNpbXBsZSBiaW5kaW5nIG9mIGEgVHJlZVZpZXdlciB0byBhIFRyZWUgTW9kZWwgRGVzY3JpcHRpb24sIHVzaW5nIGEgbmVzdGVkIFRyZWVVcGRhdGFibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X1RyZWVzX1NjZW5hcmlvMDQoKSB7Ci0JCQotCQkvLyBEZXNjcmliZSB0aGUgVmlld2VyCi0JCVRyZWVWaWV3ZXJEZXNjcmlwdGlvbiB0cmVlRGVzY3JpcHRpb24gPSBuZXcgVHJlZVZpZXdlckRlc2NyaXB0aW9uKHR2aWV3ZXIpOwkKLQkJCi0JCXRyZWVEZXNjcmlwdGlvbi5hZGRDb2x1bW4oQWR2ZW50dXJlLmNsYXNzLCAibmFtZSIpOwotCQl0cmVlRGVzY3JpcHRpb24uYWRkQ29sdW1uKEFkdmVudHVyZS5jbGFzcywgInByaWNlIik7Ci0JCQkJCQotCQl0cmVlRGVzY3JpcHRpb24uYWRkQ29sdW1uKENhdGVnb3J5LmNsYXNzLCAibmFtZSIpOwotCQkKLQkJLy8gRGVzY3JpYmUgdGhlIG1vZGVsIHdpdGggYSBQcm9wZXJ0eSBSb290IG9iamVjdC4gIFRoaXMgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIGEgTmVzdGVkIFVwZGF0YWJsZSBUcmVlCi0JCVRyZWVNb2RlbERlc2NyaXB0aW9uIG1vZGVsRGVzY3JpcHRpb24gPSBuZXcgVHJlZU1vZGVsRGVzY3JpcHRpb24obmV3IFByb3BlcnR5KGNhdGFsb2csICJjYXRlZ29yaWVzIikpOwotCQltb2RlbERlc2NyaXB0aW9uLmFkZENoaWxkcmVuUHJvcGVydHkoQ2F0ZWdvcnkuY2xhc3MsICJhZHZlbnR1cmVzIik7Ci0JCQkJCi0JCQotCQlnZXREYmMoKS5iaW5kKHRyZWVEZXNjcmlwdGlvbiwgbW9kZWxEZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCS8vCU1ha2Ugc3VyZSB0aGF0IHRoZSBjYXRhbG9nJ3MgY2F0ZWdvcmllcyBoYXZlIGJlZW4gcHJvcGFnYXRlZCB0byB0aGUgdmlld2VyCi0JCWFzc2VydEVxdWFsc1RyZWVOb2RlKG51bGwsIG51bGwsIFNhbXBsZURhdGEuQ0FURUdPUllfVFJFRSk7Ci0JCQotCQkKLQkJLy8gTWFrZSBhIGNoYW5nZSwgbWFrZSBzdXJlIHRoYXQgaXQgaXMgcHJvcGFnYXRlZAotCQlBZHZlbnR1cmUgbmV3QWR2ZW50dXJlID0gbmV3IEFkdmVudHVyZSgpOwotCQluZXdBZHZlbnR1cmUuc2V0TmFtZSgibmV3IEFkdmVudHVyZSIpOwotCQljYXRhbG9nLmdldENhdGVnb3JpZXMoKVswXS5hZGRBZHZlbnR1cmUobmV3QWR2ZW50dXJlKTsKLQkJCi0JCWFzc2VydEVxdWFsc1RyZWVOb2RlKG51bGwsIG51bGwsIFNhbXBsZURhdGEuQ0FURUdPUllfVFJFRSk7Ci0JCQotCQkvLyBBZGRpbmcgYSBuZXcgY2F0ZWdvcnksIHdpbGwgY2hhbmdlIHRoZSByb290IG9mIHRoZSB0cmVlCi0JCS8vIEVuc3VyZSB0aGF0IHRoZSBuZXN0ZWQgVHJlZSBkcml2ZXMgdGhpcwotCQlDYXRlZ29yeSBuZXdDYXRlZ29yeSA9IG5ldyBDYXRlZ29yeSgpOwkJCQkKLQkJbmV3Q2F0ZWdvcnkuc2V0TmFtZSgibmV3IEVtcHR5IENhdGVnb3J5Iik7Ci0JCWNhdGFsb2cuYWRkQ2F0ZWdvcnkobmV3Q2F0ZWdvcnkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzVHJlZU5vZGUobnVsbCwgbnVsbCwgU2FtcGxlRGF0YS5DQVRFR09SWV9UUkVFKTsJCQotCX0JCi0JCi0JcHJpdmF0ZSBGaWxlIGNyZWF0ZUZpbGUoRmlsZSBkaXJlY3RvcnksIFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgbmFtZSk7Ci0JCXRyeSB7Ci0JCQlmLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGY7Ci0JfQotCQotCXByaXZhdGUgRmlsZSBjcmVhdGVEaXIoRmlsZSBkaXJlY3RvcnksIFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgbmFtZSk7Ci0JCWYubWtkaXIoKTsKLQkJcmV0dXJuIGY7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgYSBzaW1wbGUgZmlsZSBzeXN0ZW0sIHVzaW5nIGFuIGV4cGxpY2l0IElUcmVlIGZhY2FkZSBmb3IgdGhlIEZTLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfVHJlZXNfU2NlbmFyaW8wNSgpIHsKLQkJCi0JCS8vIERlc2NyaWJlIHRoZSBWaWV3ZXIKLQkJVHJlZVZpZXdlckRlc2NyaXB0aW9uIHRyZWVEZXNjcmlwdGlvbiA9IG5ldyBUcmVlVmlld2VyRGVzY3JpcHRpb24odHZpZXdlcik7Ci0JCXRyZWVEZXNjcmlwdGlvbi5hZGRDb2x1bW4oRmlsZS5jbGFzcywgIm5hbWUiKTsKLQkJCi0JCS8vIEJ1aWxkICBhIGZpbGUgc3lzdGVtLgotCQlGaWxlIHJvb3QgPSAoRmlsZSkgZGlyZWN0b3J5TW9kZWxUcmVlLmdldENoaWxkcmVuKG51bGwpWzBdOwotCQkKLQkJY3JlYXRlRmlsZShyb290LCAicm9vdGZpbGUxIik7Ci0JCWNyZWF0ZUZpbGUocm9vdCwgInJvb3RmaWxlMiIpOwotCQljcmVhdGVGaWxlKHJvb3QsICJyb290ZmlsZTMiKTsKLQkJCi0JCXJvb3QgPSBjcmVhdGVEaXIocm9vdCwgInNlY29uZExldmVsIik7Ci0JCWNyZWF0ZUZpbGUocm9vdCwgInNlY29uZGZpbGUxIik7Ci0JCUZpbGUgZmlsZTIgPSBjcmVhdGVGaWxlKHJvb3QsICJzZWNvbmRmaWxlMiIpOwotCQljcmVhdGVGaWxlKHJvb3QsICJzZWNvbmRmaWxlMyIpOwotCQkKLQkJCi0JCQotCQlnZXREYmMoKS5iaW5kKHRyZWVEZXNjcmlwdGlvbiwgZGlyZWN0b3J5TW9kZWxUcmVlLCBudWxsKTsKLQkJCQkJCQotCQkvLyBUZXN0IHRoYXQgYWxsIGlzIHRoZXJlIAotCQlhc3NlcnRFcXVhbHNUcmVlTm9kZShudWxsLCBudWxsLCBkaXJlY3RvcnlNb2RlbFRyZWUpOwotCQkKLQkJRmlsZSBmaWxlNCA9IGNyZWF0ZUZpbGUocm9vdCwgInNlY29uZExldmVsNCIpOwotCQlkaXJlY3RvcnlNb2RlbFRyZWUuc2V0Q2hpbGRyZW4ocm9vdCwgcm9vdC5saXN0RmlsZXMoKSk7IC8vIFRoaXMgbW9kZWwgZG9lcyBub3QgbGlzdGVuIHRvIHRoZSBmaWxlIHN5c3RlbS4KLQkJCQkJCQkJCQkJCQkJCQkvLyB0aGlzIGNhbGwgd2lsbCBpbmR1Y2UgaXQgdG8gZmlyZXMgdGhlIGNoYW5nZSBldmVudC4KLQkJYXNzZXJ0RXF1YWxzVHJlZU5vZGUobnVsbCwgbnVsbCwgZGlyZWN0b3J5TW9kZWxUcmVlKTsKLQkJCi0JCWZpbGUyLmRlbGV0ZSgpOwotCQlkaXJlY3RvcnlNb2RlbFRyZWUuc2V0Q2hpbGRyZW4ocm9vdCwgcm9vdC5saXN0RmlsZXMoKSk7Ci0JCWFzc2VydEVxdWFsc1RyZWVOb2RlKG51bGwsIG51bGwsIGRpcmVjdG9yeU1vZGVsVHJlZSk7Ci0JCQotCQlmaWxlNC5kZWxldGUoKTsKLQkJZGlyZWN0b3J5TW9kZWxUcmVlLnNldENoaWxkcmVuKHJvb3QsIHJvb3QubGlzdEZpbGVzKCkpOwotCQlhc3NlcnRFcXVhbHNUcmVlTm9kZShudWxsLCBudWxsLCBkaXJlY3RvcnlNb2RlbFRyZWUpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IGEgc2ltcGxlIGZpbGUgc3lzdGVtLCB1c2luZyBhIFRyZWVNb2RlbERlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfVHJlZXNfU2NlbmFyaW8wNigpIHsKLQotCQkKLQkJLy8gQnVpbGQgIGEgZmlsZSBzeXN0ZW0uCi0JCUZpbGUgcm9vdCA9IChGaWxlKSBkaXJlY3RvcnlNb2RlbFRyZWUuZ2V0Q2hpbGRyZW4obnVsbClbMF07Ci0JCQotCQljcmVhdGVGaWxlKHJvb3QsICJyb290ZmlsZTEiKTsKLQkJY3JlYXRlRmlsZShyb290LCAicm9vdGZpbGUyIik7Ci0JCWNyZWF0ZUZpbGUocm9vdCwgInJvb3RmaWxlMyIpOwotCQkKLQkJRmlsZSBzZWNvbmRMZXZlbCA9IGNyZWF0ZURpcihyb290LCAic2Vjb25kTGV2ZWwiKTsKLQkJY3JlYXRlRmlsZShzZWNvbmRMZXZlbCwgInNlY29uZGZpbGUxIik7Ci0JCWNyZWF0ZUZpbGUoc2Vjb25kTGV2ZWwsICJzZWNvbmRmaWxlMiIpOwotCQljcmVhdGVGaWxlKHNlY29uZExldmVsLCAic2Vjb25kZmlsZTMiKTsKLQkJCi0JCQotCQkvLyBEZXNjcmliZSB0aGUgVmlld2VyCi0JCVRyZWVWaWV3ZXJEZXNjcmlwdGlvbiB0cmVlRGVzY3JpcHRpb24gPSBuZXcgVHJlZVZpZXdlckRlc2NyaXB0aW9uKHR2aWV3ZXIpOwotCQl0cmVlRGVzY3JpcHRpb24uYWRkQ29sdW1uKEZpbGUuY2xhc3MsICJuYW1lIik7Ci0JCQotCQkvLyBEZXNjcmliZSB0aGUgTW9kZWwKLQkJVHJlZU1vZGVsRGVzY3JpcHRpb24gbW9kZWxEZXNjcmlwdGlvbiA9IG5ldyBUcmVlTW9kZWxEZXNjcmlwdGlvbihuZXcgT2JqZWN0W10ge3Jvb3R9ICk7Ci0JCW1vZGVsRGVzY3JpcHRpb24uYWRkQ2hpbGRyZW5Qcm9wZXJ0eShGaWxlLmNsYXNzLCAibGlzdEZpbGVzIik7Ci0JCQkJCi0JCWdldERiYygpLmJpbmQodHJlZURlc2NyaXB0aW9uLCBtb2RlbERlc2NyaXB0aW9uLCBudWxsKTsKLQkJCQkJCQotCQkvLyBUZXN0IHRoYXQgYWxsIGlzIHRoZXJlIAotCQlhc3NlcnRFcXVhbHNUcmVlTm9kZShudWxsLCBudWxsLCBkaXJlY3RvcnlNb2RlbFRyZWUpOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zY2VuYXJpb3MvVXBkYXRhYmxlRmFjdG9yaWVzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9VcGRhdGFibGVGYWN0b3JpZXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzhjOGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3NjZW5hcmlvcy9VcGRhdGFibGVGYWN0b3JpZXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICBDcmVhdGVkIE9jdCAyMSwgMjAwNSBieSBHaWxpIE1lbmRlbAotICogCi0gKiAgJFJDU2ZpbGU6IFVwZGF0YWJsZUZhY3Rvcmllc1Rlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8xMS8xNSAxOToxMTo0MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLnNjZW5hcmlvczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLklEYXRhQmluZGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuSVVwZGF0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFVwZGF0YWJsZUZhY3Rvcmllc1Rlc3QgZXh0ZW5kcyBTY2VuYXJpb3NUZXN0Q2FzZSB7Ci0KLQlpbnRlcmZhY2UgUm9vdCB7Ci0JfTsKLQotCWludGVyZmFjZSBOb25lIGV4dGVuZHMgUm9vdCB7Ci0JfTsKLQotCWludGVyZmFjZSBNaWRkbGUgZXh0ZW5kcyBOb25lIHsKLQl9OwotCi0JaW50ZXJmYWNlIFN0YW5kQWxvbmUgewotCX07Ci0KLQljbGFzcyBSb290Q2xhc3MgaW1wbGVtZW50cyBSb290IHsKLQl9OwotCi0JY2xhc3MgTm9uZUNsYXNzIGltcGxlbWVudHMgTm9uZSB7Ci0JfTsKLQotCWNsYXNzIE1pZGRsZUNsYXNzIGltcGxlbWVudHMgTWlkZGxlIHsKLQl9OwotCi0JY2xhc3MgQWxsQ2xhc3MgaW1wbGVtZW50cyBTdGFuZEFsb25lLCBNaWRkbGUsIFJvb3QgewotCX07Ci0KLQljbGFzcyBNaWRkbGVDaGlsZCBleHRlbmRzIE1pZGRsZUNsYXNzIHsKLQl9OwotCi0JaW50ZXJmYWNlIFRlc3RJVXBkYXRhYmxlIGV4dGVuZHMgSVVwZGF0YWJsZSB7Ci0JCXB1YmxpYyBDbGFzcyBnZXRUeXBlKCk7Ci0JfQotCi0JY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIElVcGRhdGFibGVGYWN0b3J5IHsKLQkJQ2xhc3MgYzsKLQotCQlwdWJsaWMgRmFjdG9yeShDbGFzcyBjKSB7Ci0JCQl0aGlzLmMgPSBjOwotCQl9Ci0KLQkJcHVibGljIElVcGRhdGFibGUgY3JlYXRlVXBkYXRhYmxlKE1hcCBwcm9wZXJ0aWVzLCBPYmplY3QgZGVzY3JpcHRpb24sCi0JCQkJSURhdGFCaW5kaW5nQ29udGV4dCBiaW5kaW5nQ29udGV4dCkgewotCQkJaWYgKGMuaXNJbnN0YW5jZShkZXNjcmlwdGlvbikpIHsKLQkJCQlyZXR1cm4gbmV3IFRlc3RJVXBkYXRhYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoCi0JCQkJCQkJSUNoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyKSB7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihJQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIpIHsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgewotCQkJCQkJcmV0dXJuIGM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlJVXBkYXRhYmxlRmFjdG9yeSByb290ID0gbmV3IEZhY3RvcnkoUm9vdC5jbGFzcyk7Ci0KLQlJVXBkYXRhYmxlRmFjdG9yeSBtaWRkbGUgPSBuZXcgRmFjdG9yeShNaWRkbGUuY2xhc3MpOwotCi0JSVVwZGF0YWJsZUZhY3Rvcnkgc2EgPSBuZXcgRmFjdG9yeShTdGFuZEFsb25lLmNsYXNzKTsKLQotCUlVcGRhdGFibGVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmFjdG9yeShPYmplY3QuY2xhc3MpOwotCi0JcHJvdGVjdGVkIENsYXNzIGdldEZhY3RvcnlUeXBlKE9iamVjdCBzcmMpIHsKLQkJVGVzdElVcGRhdGFibGUgdSA9IChUZXN0SVVwZGF0YWJsZSkgZ2V0RGJjKCkuY3JlYXRlVXBkYXRhYmxlKHNyYyk7Ci0JCXJldHVybiB1LmdldFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X2ZhY3RvcnlSZWdpc3RyYXRpb24oKSB7Ci0KLQkJZ2V0RGJjKCkuYWRkVXBkYXRhYmxlRmFjdG9yeShyb290KTsKLQkJZ2V0RGJjKCkuYWRkVXBkYXRhYmxlRmFjdG9yeShtaWRkbGUpOwotCi0JCS8vIERpcmVjdCBtYXBwaW5nCi0JCWFzc2VydEVxdWFscyhSb290LmNsYXNzLCBnZXRGYWN0b3J5VHlwZShuZXcgUm9vdENsYXNzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKE1pZGRsZS5jbGFzcywgZ2V0RmFjdG9yeVR5cGUobmV3IE1pZGRsZUNsYXNzKCkpKTsKLQotCQkvLyBJbmhlcmVudCBpbnRlcmZhY2UKLQkJYXNzZXJ0RXF1YWxzKFJvb3QuY2xhc3MsIGdldEZhY3RvcnlUeXBlKG5ldyBOb25lQ2xhc3MoKSkpOwotCi0JCS8vIEFsbENsYXNzIGluaGVyZW50IGludGVyZmFjZQotCQlhc3NlcnRFcXVhbHMoTWlkZGxlLmNsYXNzLCBnZXRGYWN0b3J5VHlwZShuZXcgQWxsQ2xhc3MoKSkpOwotCi0JCS8vIGNsYXNzIGluaGVyZXRlbmNlCi0JCWFzc2VydEVxdWFscyhNaWRkbGUuY2xhc3MsIGdldEZhY3RvcnlUeXBlKG5ldyBNaWRkbGVDaGlsZCgpKSk7Ci0KLQkJLy8gRGlyZWN0LCBmaXJzdCBpbnRlcmZhY2UKLQkJZ2V0RGJjKCkuYWRkVXBkYXRhYmxlRmFjdG9yeShzYSk7Ci0JCWFzc2VydEVxdWFscyhTdGFuZEFsb25lLmNsYXNzLCBnZXRGYWN0b3J5VHlwZShuZXcgQWxsQ2xhc3MoKSkpOwotCi0JCS8vIENsYXNzIGJhc2VkIGNvbnRyaWJ1dGlvbi4KLQkJZ2V0RGJjKCkuYWRkVXBkYXRhYmxlRmFjdG9yeShmYWN0b3J5KTsKLQkJYXNzZXJ0RXF1YWxzKE9iamVjdC5jbGFzcywgZ2V0RmFjdG9yeVR5cGUobmV3IEFsbENsYXNzKCkpKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3Ntb2tldGVzdC9zd3QueHN3dCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy9zbW9rZXRlc3Qvc3d0Lnhzd3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOTdkNjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3Ntb2tldGVzdC9zd3QueHN3dAorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTx4c3d0IHhtbG5zOng9Imh0dHA6Ly9zd2VldF9zd3Quc2YubmV0L3hzd3QiPg0KLQk8aW1wb3J0IHhtbG5zPSJodHRwOi8vc3dlZXRfc3d0LnNmLm5ldC94c3d0Ij4NCi0JCTxwYWNrYWdlIG5hbWU9ImphdmEubGFuZyIvPg0KLQkJPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uuc3d0LndpZGdldHMiLz4NCi0JCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnN3dC5jdXN0b20iLz4NCi0JCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLnN3dC5sYXlvdXQiLz4NCi0JPC9pbXBvcnQ+DQotDQotCTwhLS0gQW4gWFNXVCBleGFtcGxlIHRoYXQgdXNlcyBuZWFybHkgZXZlcnkgU1dUIGNvbnRyb2wgYW5kIHVzZXMgdGhlIG5ldw0KLQkgICAgIHN5bnRheCB3aGVyZXZlciBwb3NzaWJsZS4gDQotCSAgICAgDQotCSAgICAgR2V0IFhTV1QgYXQ6DQotCSAgICAgDQotCSAgICAgaHR0cDovL3hzd3Quc291cmNlZm9yZ2UubmV0L3VwZGF0ZXMgDQotCSAgICAgDQotCSAgICAgdGhlbiBjaG9vc2UgV2luZG93IHwgU2hvdyBWaWV3IHwgT3RoZXIuLi4gfCBYU1dUIFZpZXdzIHwgWFNXVCBQcmV2aWV3IC0tPg0KLQ0KLQk8bGF5b3V0IHg6Y2xhc3M9ImdyaWRMYXlvdXQiLz4NCi0JDQotCTxsYWJlbCB0ZXh0PSJTV1QgQ29udHJvbHM6Ii8+DQotCTx0YWJGb2xkZXI+DQotCQk8bGF5b3V0RGF0YSB4OmNsYXNzPSJncmlkRGF0YSIgZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0idHJ1ZSIgZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9InRydWUiIGhvcml6b250YWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiIHZlcnRpY2FsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+DQotDQotCQk8Y29tcG9zaXRlIHg6aWQ9IlRleHQiPg0KLQkJCTxsYXlvdXREYXRhIHg6Y2xhc3M9ImdyaWREYXRhIiBncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSJ0cnVlIiBob3Jpem9udGFsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+DQotCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIyIi8+DQotDQotCQkJPGNvbXBvc2l0ZSB4OnN0eWxlPSJCT1JERVIiPg0KLQkJCQk8bGF5b3V0RGF0YSB4OmNsYXNzPSJncmlkRGF0YSIgZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0idHJ1ZSIgdmVydGljYWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiIGhvcml6b250YWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiLz4NCi0JCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIyIi8+DQotDQotCQkJCTxsYWJlbCB0ZXh0PSJJbnRlZ2VyOiIvPjx0ZXh0IHg6c3R5bGU9IkJPUkRFUiIgeDppZD0iaW50VGV4dCIgdGV4dD0iMSIvPg0KLQkJCQk8bGFiZWwgdGV4dD0iRmxvYXQ6Ii8+PHRleHQgeDpzdHlsZT0iQk9SREVSIiB4OmlkPSJmbG9hdFRleHQiIHRleHQ9IjEuMCIvPg0KLQkJCQk8bGFiZWwgdGV4dD0iU3RyaW5nOiIvPjx0ZXh0IHg6c3R5bGU9IkJPUkRFUiIgeDppZD0ic3RyaW5nVGV4dCIgdGV4dD0iVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cuIi8+DQotCQkJCTxsYWJlbCB0ZXh0PSJSZWdleFZhbGlkYXRlZCBTdHJpbmc6Ii8+PHRleHQgeDpzdHlsZT0iQk9SREVSIiB4OmlkPSJyZWdleFN0cmluZ1RleHQiIHRleHQ9IlRoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgZG9nLiIvPg0KLQkJCQk8bGFiZWwgdGV4dD0iTWFza2VkIFN0cmluZzoiLz48dGV4dCB4OnN0eWxlPSJCT1JERVIiIHg6aWQ9Im1hc2tlZFN0cmluZ1RleHQiIGJhY2tncm91bmQ9IjIwOCAxMjggMTI4Ii8+DQotCQkJPC9jb21wb3NpdGU+DQotCQkJPHNsaWRlciB4OnN0eWxlPSJWRVJUSUNBTCIgeDppZD0iYnV0dG9uU2Nyb2xsZXIiPg0KLQkJCQk8bGF5b3V0RGF0YSB4OmNsYXNzPSJncmlkRGF0YSIgdmVydGljYWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiLz4NCi0JCQk8L3NsaWRlcj4NCi0JCTwvY29tcG9zaXRlPg0KLQkJPHRhYkl0ZW0gdGV4dD0iVGV4dCIgY29udHJvbD0iVGV4dCIvPg0KLQ0KLQkJPGNvbXBvc2l0ZSB4OmlkPSJMYWJlbHMiPg0KLQkJCTxsYXlvdXREYXRhIHg6Y2xhc3M9ImdyaWREYXRhIiBncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSJ0cnVlIiBob3Jpem9udGFsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+DQotCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIyIi8+DQotDQotCQkJPGNvbXBvc2l0ZSB4OnN0eWxlPSJCT1JERVIiPg0KLQkJCQk8bGF5b3V0RGF0YSB4OmNsYXNzPSJncmlkRGF0YSIgZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0idHJ1ZSIgdmVydGljYWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiIGhvcml6b250YWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiLz4NCi0JCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIxIi8+DQotDQotCQkJCTxsYWJlbCB0ZXh0PSJMYWJlbCB3aXRoIHRleHQiLz4NCi0JCQkJPGxhYmVsIHRleHQ9IkxhYmVsIHdpdGggaW1hZ2UiLz4NCi0JCQkJPGxhYmVsIHRleHQ9IkxhYmVsIHdpdGggdGV4dCBhbmQgaW1hZ2UiLz4NCi0JCQkJPGxhYmVsIHg6c3R5bGU9IlNFUEFSQVRPUiB8IEhPUklaT05UQUwiPjxsYXlvdXREYXRhIHg6Y2xhc3M9ImdyaWREYXRhIiBncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSJ0cnVlIiBob3Jpem9udGFsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+PC9sYWJlbD4NCi0JCQkJPGNMYWJlbCB0ZXh0PSJDTGFiZWwgd2l0aCB0ZXh0Ii8+DQotCQkJCTxjTGFiZWwgdGV4dD0iQ0xhYmVsIHdpdGggaW1hZ2UiLz4NCi0JCQkJPGNMYWJlbCB0ZXh0PSJDTGFiZWwgd2l0aCB0ZXh0IGFuZCBpbWFnZSIvPg0KLQkJCTwvY29tcG9zaXRlPg0KLQkJCTxzbGlkZXIgeDpzdHlsZT0iVkVSVElDQUwiIHg6aWQ9InRleHRTY3JvbGxlciIvPg0KLQkJPC9jb21wb3NpdGU+DQotCQk8dGFiSXRlbSB0ZXh0PSJMYWJlbCAvIENMYWJlbCIgY29udHJvbD0iTGFiZWxzIi8+DQotCQ0KLQkJPGNvbXBvc2l0ZSB4OmlkPSJCdXR0b24iPg0KLQkJCTxsYXlvdXREYXRhIHg6Y2xhc3M9ImdyaWREYXRhIiBncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSJ0cnVlIiBob3Jpem9udGFsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+DQotCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIyIi8+DQotDQotCQkJPGNvbXBvc2l0ZSB4OnN0eWxlPSJCT1JERVIiPg0KLQkJCQk8bGF5b3V0RGF0YSB4OmNsYXNzPSJncmlkRGF0YSIgZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0idHJ1ZSIgdmVydGljYWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiIGhvcml6b250YWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiLz4NCi0JCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIyIi8+DQotDQotCQkJCTxsYWJlbCB0ZXh0PSJQdXNoOiIvPjxidXR0b24geDppZD0icHVzaEJ1dHRvbiIgdGV4dD0iUHVzaEJ1dHRvbiIvPg0KLQkJCQk8bGFiZWwgdGV4dD0iQXJyb3c6Ii8+PGJ1dHRvbiB4OmlkPSJhcnJvd0J1dHRvbiIgeDpzdHlsZT0iQVJST1ciIHRleHQ9IkFycm93QnV0dG9uIi8+DQotCQkJCTxsYWJlbCB0ZXh0PSJUb2dnbGU6Ii8+PGJ1dHRvbiB4OmlkPSJ0b2dnbGVCdXR0b24iIHg6c3R5bGU9IlRPR0dMRSIgdGV4dD0iVG9nZ2xlQnV0dG9uIi8+DQotCQkJCTxsYWJlbCB0ZXh0PSJDaGVjazoiLz48YnV0dG9uIHg6c3R5bGU9IkNIRUNLIiB4OmlkPSJjaGVja0J1dHRvbiIgdGV4dD0iQ2hlY2tCb3giLz4NCi0JCQkJPGxhYmVsIHRleHQ9IlJhZGlvIEdyb3VwIDE6Ii8+DQotCQkJCTxjb21wb3NpdGUgeDpzdHlsZT0iQk9SREVSIiB4OmlkPSJyYWRpb0dyb3VwMSI+DQotCQkJCQk8bGF5b3V0RGF0YSB4OmNsYXNzPSJncmlkRGF0YSIgaG9yaXpvbnRhbEFsaWdubWVudD0iR3JpZERhdGEuRklMTCIvPg0KLQkJCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIxIi8+DQotDQotCQkJCQk8YnV0dG9uIHg6c3R5bGU9IlJBRElPIiB4OmlkPSJyYWRpb0J1dHRvbjAuMSIgdGV4dD0iUmFkaW8iLz4NCi0JCQkJCTxidXR0b24geDpzdHlsZT0iUkFESU8iIHg6aWQ9InJhZGlvQnV0dG9uMC4yIiB0ZXh0PSJSYWRpbzIiIHNlbGVjdGlvbj0idHJ1ZSIvPg0KLQkJCQkJPGJ1dHRvbiB4OnN0eWxlPSJSQURJTyIgeDppZD0icmFkaW9CdXR0b24wLjMiIHRleHQ9IlJhZGlvMyIvPg0KLQkJCQk8L2NvbXBvc2l0ZT4NCi0JCQkJPGxhYmVsIHRleHQ9IlJhZGlvIEdyb3VwIDI6Ii8+DQotCQkJCTxjb21wb3NpdGUgeDpzdHlsZT0iQk9SREVSIiB4OmlkPSJyYWRpb0dyb3VwMiI+DQotCQkJCQk8bGF5b3V0RGF0YSB4OmNsYXNzPSJncmlkRGF0YSIgaG9yaXpvbnRhbEFsaWdubWVudD0iR3JpZERhdGEuRklMTCIvPg0KLQkJCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIxIi8+DQotDQotCQkJCQk8YnV0dG9uIHg6c3R5bGU9IlJBRElPIiB4OmlkPSJyYWRpb0J1dHRvbjEuMSIgdGV4dD0iUmFkaW8iLz4NCi0JCQkJCTxidXR0b24geDpzdHlsZT0iUkFESU8iIHg6aWQ9InJhZGlvQnV0dG9uMS4yIiB0ZXh0PSJSYWRpbzIiLz4NCi0JCQkJCTxidXR0b24geDpzdHlsZT0iUkFESU8iIHg6aWQ9InJhZGlvQnV0dG9uMS4zIiB0ZXh0PSJSYWRpbzMiLz4NCi0JCQkJPC9jb21wb3NpdGU+DQotCQkJPC9jb21wb3NpdGU+DQotCQkJPHNsaWRlciB4OnN0eWxlPSJWRVJUSUNBTCIgeDppZD0iMWJ1dHRvblNjcm9sbGVyIj4NCi0JCQkJPGxheW91dERhdGEgeDpjbGFzcz0iZ3JpZERhdGEiIHZlcnRpY2FsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+DQotCQkJPC9zbGlkZXI+DQotCQk8L2NvbXBvc2l0ZT4NCi0JCTx0YWJJdGVtIHRleHQ9IkJ1dHRvbiIgY29udHJvbD0iQnV0dG9uIi8+DQotDQotCQk8Y29tcG9zaXRlIHg6aWQ9Ikxpc3QiPg0KLQkJCTxsYXlvdXREYXRhIHg6Y2xhc3M9ImdyaWREYXRhIiBncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSJ0cnVlIiBob3Jpem9udGFsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+DQotCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIxIi8+DQotDQotCQkJPGNvbXBvc2l0ZT4NCi0JCQkJPGxheW91dERhdGEgeDpjbGFzcz0iZ3JpZERhdGEiIGdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9InRydWUiIGhvcml6b250YWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiIGdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSJ0cnVlIiB2ZXJ0aWNhbEFsaWdubWVudD0iR3JpZERhdGEuRklMTCIvPg0KLQkgICAgICAgICAgICA8bGF5b3V0IHg6Y2xhc3M9ImZpbGxMYXlvdXQiIHR5cGU9IlZFUlRJQ0FMIi8+DQotDQotCQkJCTxsaXN0IHg6c3R5bGU9IkJPUkRFUiB8IFZfU0NST0xMIHwgTVVMVEkiLz4NCi0JCQkJPGxpc3QgeDpzdHlsZT0iQk9SREVSIHwgVl9TQ1JPTEwiLz4NCi0JCQk8L2NvbXBvc2l0ZT4NCi0JCTwvY29tcG9zaXRlPg0KLQkJPHRhYkl0ZW0gdGV4dD0iTGlzdCIgY29udHJvbD0iTGlzdCIvPg0KLQ0KLQkJPGNvbXBvc2l0ZSB4OmlkPSJDb21ib3MiPg0KLQkJCTxsYXlvdXREYXRhIHg6Y2xhc3M9ImdyaWREYXRhIiBncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSJ0cnVlIiBob3Jpem9udGFsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+DQotCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIyIi8+DQotDQotCQkJPGNvbXBvc2l0ZSB4OnN0eWxlPSJCT1JERVIiPg0KLQkJCQk8bGF5b3V0RGF0YSB4OmNsYXNzPSJncmlkRGF0YSIgZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0idHJ1ZSIgdmVydGljYWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiIGhvcml6b250YWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiLz4NCi0JCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIxIi8+DQotDQotCQkJCTxjb21ibz4NCi0JCQkJCTxhZGQgeDpwMD0iaXRlbTEiLz4NCi0JCQkJCTxhZGQgeDpwMD0iaXRlbTIiLz4NCi0JCQkJCTxhZGQgeDpwMD0iaXRlbTMiLz4NCi0JCQkJPC9jb21ibz4NCi0JCQkJPGNvbWJvIHg6c3R5bGU9IlNJTVBMRSI+DQotCQkJCQk8YWRkIHg6cDA9Iml0ZW0xIi8+DQotCQkJCQk8YWRkIHg6cDA9Iml0ZW0yIi8+DQotCQkJCQk8YWRkIHg6cDA9Iml0ZW0zIi8+DQotCQkJCTwvY29tYm8+DQotCQkJCTxjb21ibyB4OnN0eWxlPSJSRUFEX09OTFkiPg0KLQkJCQkJPGFkZCB4OnAwPSJpdGVtMSIvPg0KLQkJCQkJPGFkZCB4OnAwPSJpdGVtMiIvPg0KLQkJCQkJPGFkZCB4OnAwPSJpdGVtMyIvPg0KLQkJCQk8L2NvbWJvPg0KLQkJCQk8bGFiZWwgeDpzdHlsZT0iU0VQQVJBVE9SIHwgSE9SSVpPTlRBTCI+PGxheW91dERhdGEgeDpjbGFzcz0iZ3JpZERhdGEiIGdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9InRydWUiIGhvcml6b250YWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiLz48L2xhYmVsPg0KLQkJCQk8Y0NvbWJvPg0KLQkJCQkJPGFkZCB4OnAwPSJpdGVtMSIvPg0KLQkJCQkJPGFkZCB4OnAwPSJpdGVtMiIvPg0KLQkJCQkJPGFkZCB4OnAwPSJpdGVtMyIvPg0KLQkJCQk8L2NDb21ibz4NCi0JCQkJPGNDb21ibyB4OnN0eWxlPSJSRUFEX09OTFkiIGJhY2tncm91bmQ9IjI1NSAyNTUgMjU1Ij4NCi0JCQkJCTxhZGQgeDpwMD0iaXRlbTEiLz4NCi0JCQkJCTxhZGQgeDpwMD0iaXRlbTIiLz4NCi0JCQkJCTxhZGQgeDpwMD0iaXRlbTMiLz4NCi0JCQkJPC9jQ29tYm8+DQotCQkJPC9jb21wb3NpdGU+DQotCQkJPHNsaWRlciB4OnN0eWxlPSJWRVJUSUNBTCIgeDppZD0iMmJ1dHRvblNjcm9sbGVyIj4NCi0JCQkJPGxheW91dERhdGEgeDpjbGFzcz0iZ3JpZERhdGEiIHZlcnRpY2FsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+DQotCQkJPC9zbGlkZXI+DQotCQk8L2NvbXBvc2l0ZT4NCi0JCTx0YWJJdGVtIHRleHQ9IkNvbWJvIC8gQ0NvbWJvIiBjb250cm9sPSJDb21ib3MiLz4NCi0NCi0JCTxjb21wb3NpdGUgeDppZD0iVGFibGUiPg0KLQkJCTxsYXlvdXREYXRhIHg6Y2xhc3M9ImdyaWREYXRhIiBncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSJ0cnVlIiBob3Jpem9udGFsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+DQotCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIxIi8+DQotDQotCQkJPGNvbXBvc2l0ZSB4OnN0eWxlPSJCT1JERVIiPg0KLQkJCQk8bGF5b3V0RGF0YSB4OmNsYXNzPSJncmlkRGF0YSIgZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0idHJ1ZSIgZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9InRydWUiIGhvcml6b250YWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiIHZlcnRpY2FsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+DQotCQkJCTxsYXlvdXQgeDpjbGFzcz0iZ3JpZExheW91dCIgbnVtQ29sdW1ucz0iMiIvPg0KLQ0KLQkJCQk8dGFibGUgeDpzdHlsZT0iQk9SREVSIiBsaW5lc1Zpc2libGU9InRydWUiIGhlYWRlclZpc2libGU9InRydWUiPg0KLQkJCQkJPGxheW91dERhdGEgeDpjbGFzcz0iZ3JpZERhdGEiIGdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9InRydWUiIGdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSJ0cnVlIiBob3Jpem9udGFsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIiB2ZXJ0aWNhbEFsaWdubWVudD0iR3JpZERhdGEuRklMTCIvPg0KLQ0KLQkJCQkJPHRhYmxlQ29sdW1uIHdpZHRoPSI1MCIgdGV4dD0iRG9uZSIvPg0KLQkJCQkJPHRhYmxlQ29sdW1uIHdpZHRoPSIyMDAiIHRleHQ9IkRlc2NyaXB0aW9uIi8+DQotCQkJCQk8dGFibGVDb2x1bW4gd2lkdGg9IjYwIiB0ZXh0PSJQbGFubmVkIi8+DQotCQkJCQk8dGFibGVDb2x1bW4gd2lkdGg9IjYwIiB0ZXh0PSJSZXZpc2VkIi8+DQotCQkJCQk8dGFibGVDb2x1bW4gd2lkdGg9IjYwIiB0ZXh0PSJBY3R1YWwiLz4NCi0JCQkJCTwhLS08dGFibGVJdGVtLz4tLT4NCi0JCQkJPC90YWJsZT4NCi0JCQk8L2NvbXBvc2l0ZT4NCi0JCTwvY29tcG9zaXRlPg0KLQkJPHRhYkl0ZW0gdGV4dD0iVGFibGUiIGNvbnRyb2w9IlRhYmxlIi8+DQotDQotCQk8Y29tcG9zaXRlIHg6aWQ9IlRyZWUiPg0KLQkJCTxsYXlvdXREYXRhIHg6Y2xhc3M9ImdyaWREYXRhIiBncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSJ0cnVlIiBob3Jpem9udGFsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+DQotCQkJPGxheW91dCB4OmNsYXNzPSJncmlkTGF5b3V0IiBudW1Db2x1bW5zPSIxIi8+DQotDQotCQkJPGNvbXBvc2l0ZSB4OnN0eWxlPSJCT1JERVIiPg0KLQkJCQk8bGF5b3V0RGF0YSB4OmNsYXNzPSJncmlkRGF0YSIgZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0idHJ1ZSIgZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9InRydWUiIGhvcml6b250YWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiIHZlcnRpY2FsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIi8+DQotCQkJCTxsYXlvdXQgeDpjbGFzcz0iZ3JpZExheW91dCIgbnVtQ29sdW1ucz0iMiIvPg0KLQ0KLQkJCQk8dHJlZSB4OnN0eWxlPSJCT1JERVIiPg0KLQkJCQkJPGxheW91dERhdGEgeDpjbGFzcz0iZ3JpZERhdGEiIGdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9InRydWUiIGdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSJ0cnVlIiBob3Jpem9udGFsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIiB2ZXJ0aWNhbEFsaWdubWVudD0iR3JpZERhdGEuRklMTCIvPg0KLQ0KLQkJCQkJPHRyZWVJdGVtIHRleHQ9Iml0ZW0iPg0KLQkJCQkJCTx4OmNoaWxkcmVuPg0KLQkJCQkJCQk8dHJlZUl0ZW0gdGV4dD0iaXRlbSIvPg0KLQkJCQkJCQk8dHJlZUl0ZW0gdGV4dD0iaXRlbSIvPg0KLQkJCQkJCQk8dHJlZUl0ZW0gdGV4dD0iaXRlbSI+DQotCQkJCQkJCQk8eDpjaGlsZHJlbj4NCi0JCQkJCQkJCQk8dHJlZUl0ZW0gdGV4dD0iaXRlbSIvPg0KLQkJCQkJCQkJCTx0cmVlSXRlbSB0ZXh0PSJpdGVtIi8+DQotCQkJCQkJCQkJPHRyZWVJdGVtIHRleHQ9Iml0ZW0iLz4NCi0JCQkJCQkJCQk8dHJlZUl0ZW0gdGV4dD0iaXRlbSIvPg0KLQkJCQkJCQkJCTx0cmVlSXRlbSB0ZXh0PSJpdGVtIi8+DQotCQkJCQkJCQk8L3g6Y2hpbGRyZW4+DQotCQkJCQkJCTwvdHJlZUl0ZW0+DQotCQkJCQkJCTx0cmVlSXRlbSB0ZXh0PSJpdGVtIi8+DQotCQkJCQkJPC94OmNoaWxkcmVuPg0KLQkJCQkJPC90cmVlSXRlbT4NCi0JCQkJCTx0cmVlSXRlbSB0ZXh0PSJpdGVtIHdpdGggSW1hZ2UgKG9yIGF0IGxlYXN0IG5lZWRzIG9uZSkiPg0KLQkJCQkJCTx4OmNoaWxkcmVuPg0KLQkJCQkJCQk8dHJlZUl0ZW0gdGV4dD0iaXRlbSIvPg0KLQkJCQkJCQk8dHJlZUl0ZW0gdGV4dD0iaXRlbSIvPg0KLQkJCQkJCTwveDpjaGlsZHJlbj4NCi0JCQkJCTwvdHJlZUl0ZW0+DQotCQkJCQk8dHJlZUl0ZW0gdGV4dD0iQW5vdGhlciBpdGVtIj4NCi0JCQkJCQk8eDpjaGlsZHJlbj4NCi0JCQkJCQkJPHRyZWVJdGVtIHRleHQ9Iml0ZW0iLz4NCi0JCQkJCQkJPHRyZWVJdGVtIHRleHQ9Iml0ZW0iLz4NCi0JCQkJCQkJPHRyZWVJdGVtIHRleHQ9Iml0ZW0iLz4NCi0JCQkJCQkJPHRyZWVJdGVtIHRleHQ9Iml0ZW0iLz4NCi0JCQkJCQkJPHRyZWVJdGVtIHRleHQ9Iml0ZW0iLz4NCi0JCQkJCQk8L3g6Y2hpbGRyZW4+DQotCQkJCQk8L3RyZWVJdGVtPg0KLQkJCQk8L3RyZWU+DQotCQkJPC9jb21wb3NpdGU+DQotCQk8L2NvbXBvc2l0ZT4NCi0JCTx0YWJJdGVtIHRleHQ9IlRyZWUiIGNvbnRyb2w9IlRyZWUiLz4NCi0NCi0JCTxjb21wb3NpdGUgeDppZD0iVGFibGVUcmVlIj4NCi0JCQk8bGF5b3V0RGF0YSB4OmNsYXNzPSJncmlkRGF0YSIgZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0idHJ1ZSIgaG9yaXpvbnRhbEFsaWdubWVudD0iR3JpZERhdGEuRklMTCIvPg0KLQkJCTxsYXlvdXQgeDpjbGFzcz0iZ3JpZExheW91dCIgbnVtQ29sdW1ucz0iMSIvPg0KLQ0KLQkJCTxjb21wb3NpdGUgeDpzdHlsZT0iQk9SREVSIj4NCi0JCQkJPGxheW91dERhdGEgeDpjbGFzcz0iZ3JpZERhdGEiIGdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9InRydWUiIGdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSJ0cnVlIiBob3Jpem9udGFsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIiB2ZXJ0aWNhbEFsaWdubWVudD0iR3JpZERhdGEuRklMTCIvPg0KLQkJCQk8bGF5b3V0IHg6Y2xhc3M9ImdyaWRMYXlvdXQiIG51bUNvbHVtbnM9IjIiLz4NCi0NCi0JCQkJPHRhYmxlVHJlZSB4OnN0eWxlPSJCT1JERVIiPg0KLQkJCQkJPGxheW91dERhdGEgeDpjbGFzcz0iZ3JpZERhdGEiIGdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9InRydWUiIGdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSJ0cnVlIiBob3Jpem9udGFsQWxpZ25tZW50PSJHcmlkRGF0YS5GSUxMIiB2ZXJ0aWNhbEFsaWdubWVudD0iR3JpZERhdGEuRklMTCIvPg0KLQ0KLQkJCQkJPHRhYmxlVHJlZUl0ZW0gdGV4dD0iaXRlbSI+DQotCQkJCQkJPHg6Y2hpbGRyZW4+DQotCQkJCQkJCTx0YWJsZVRyZWVJdGVtIHRleHQ9InN1Yml0ZW0iLz4NCi0JCQkJCQkJPHRhYmxlVHJlZUl0ZW0gdGV4dD0ic3ViaXRlbSIvPg0KLQkJCQkJCTwveDpjaGlsZHJlbj4NCi0JCQkJCTwvdGFibGVUcmVlSXRlbT4NCi0JCQkJCTx0YWJsZVRyZWVJdGVtIHRleHQ9Iml0ZW0iPg0KLQkJCQkJCTx4OmNoaWxkcmVuPg0KLQkJCQkJCQk8dGFibGVUcmVlSXRlbSB0ZXh0PSJzdWJpdGVtIi8+DQotCQkJCQkJCTx0YWJsZVRyZWVJdGVtIHRleHQ9InN1Yml0ZW0iLz4NCi0JCQkJCQkJPHRhYmxlVHJlZUl0ZW0gdGV4dD0ic3ViaXRlbSIvPg0KLQkJCQkJCQk8dGFibGVUcmVlSXRlbSB0ZXh0PSJzdWJpdGVtIi8+DQotCQkJCQkJCTx0YWJsZVRyZWVJdGVtIHRleHQ9InN1Yml0ZW0iLz4NCi0JCQkJCQk8L3g6Y2hpbGRyZW4+DQotCQkJCQk8L3RhYmxlVHJlZUl0ZW0+DQotCQkJCQk8dGFibGVUcmVlSXRlbSB0ZXh0PSJpdGVtIj4NCi0JCQkJCQk8eDpjaGlsZHJlbj4NCi0JCQkJCQkJPHRhYmxlVHJlZUl0ZW0gdGV4dD0iaXRlbSI+DQotCQkJCQkJCQk8eDpjaGlsZHJlbj4NCi0JCQkJCQkJCQk8dGFibGVUcmVlSXRlbSB0ZXh0PSJzdWJpdGVtIi8+DQotCQkJCQkJCQk8L3g6Y2hpbGRyZW4+DQotCQkJCQkJCTwvdGFibGVUcmVlSXRlbT4NCi0JCQkJCQkJPHRhYmxlVHJlZUl0ZW0gdGV4dD0iaXRlbSI+DQotCQkJCQkJCQk8eDpjaGlsZHJlbj4NCi0JCQkJCQkJCQk8dGFibGVUcmVlSXRlbSB0ZXh0PSJzdWJpdGVtIi8+DQotCQkJCQkJCQkJPHRhYmxlVHJlZUl0ZW0gdGV4dD0ic3ViaXRlbSIvPg0KLQkJCQkJCQkJCTx0YWJsZVRyZWVJdGVtIHRleHQ9InN1Yml0ZW0iLz4NCi0JCQkJCQkJCQk8dGFibGVUcmVlSXRlbSB0ZXh0PSJzdWJpdGVtIi8+DQotCQkJCQkJCQkJPHRhYmxlVHJlZUl0ZW0gdGV4dD0ic3ViaXRlbSIvPg0KLQkJCQkJCQkJPC94OmNoaWxkcmVuPg0KLQkJCQkJCQk8L3RhYmxlVHJlZUl0ZW0+DQotCQkJCQkJCTx0YWJsZVRyZWVJdGVtIHRleHQ9Iml0ZW0iPg0KLQkJCQkJCQkJPHg6Y2hpbGRyZW4+DQotCQkJCQkJCQkJPHRhYmxlVHJlZUl0ZW0gdGV4dD0ic3ViaXRlbSIvPg0KLQkJCQkJCQkJCTx0YWJsZVRyZWVJdGVtIHRleHQ9InN1Yml0ZW0iLz4NCi0JCQkJCQkJCQk8dGFibGVUcmVlSXRlbSB0ZXh0PSJzdWJpdGVtIi8+DQotCQkJCQkJCQk8L3g6Y2hpbGRyZW4+DQotCQkJCQkJCTwvdGFibGVUcmVlSXRlbT4NCi0JCQkJCQk8L3g6Y2hpbGRyZW4+DQotCQkJCQk8L3RhYmxlVHJlZUl0ZW0+DQotCQkJCTwvdGFibGVUcmVlPg0KLQkJCTwvY29tcG9zaXRlPg0KLQkJPC9jb21wb3NpdGU+DQotCQk8dGFiSXRlbSB0ZXh0PSJUYWJsZVRyZWUiIGNvbnRyb2w9IlRhYmxlVHJlZSIvPg0KLQ0KLQkJPGNvbXBvc2l0ZSB4OmlkPSJQcm9ncmVzcyI+DQotCQkJPGxheW91dERhdGEgeDpjbGFzcz0iZ3JpZERhdGEiIGdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9InRydWUiIGhvcml6b250YWxBbGlnbm1lbnQ9IkdyaWREYXRhLkZJTEwiLz4NCi0JCQk8bGF5b3V0IHg6Y2xhc3M9ImdyaWRMYXlvdXQiIG51bUNvbHVtbnM9IjIiLz4NCi0NCi0JCQk8Y29tcG9zaXRlIHg6c3R5bGU9IkJPUkRFUiI+DQotCQkJCTxsYXlvdXREYXRhIHg6Y2xhc3M9ImdyaWREYXRhIiBncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSJ0cnVlIiB2ZXJ0aWNhbEFsaWdubWVudD0iR3JpZERhdGEuRklMTCIgaG9yaXpvbnRhbEFsaWdubWVudD0iR3JpZERhdGEuRklMTCIvPg0KLQkJCQk8bGF5b3V0IHg6Y2xhc3M9ImdyaWRMYXlvdXQiIG51bUNvbHVtbnM9IjEiLz4NCi0NCi0JCQkJPHByb2dyZXNzQmFyIHg6c3R5bGU9IklOREVURVJNSU5BVEUiLz4NCi0JCQkJPHByb2dyZXNzQmFyIHg6c3R5bGU9IklOREVURVJNSU5BVEUgfCBTTU9PVEgiLz4NCi0JCQkJPHByb2dyZXNzQmFyIHg6c3R5bGU9IlNNT09USCIgbWluaW11bT0iMCIgbWF4aW11bT0iMTAwIiBzZWxlY3Rpb249IjQwIi8+DQotCQkJCTxwcm9ncmVzc0JhciBtaW5pbXVtPSIwIiBtYXhpbXVtPSIxMDAiIHNlbGVjdGlvbj0iNjAiLz4NCi0JCQk8L2NvbXBvc2l0ZT4NCi0JCQk8c2xpZGVyIHg6c3R5bGU9IlZFUlRJQ0FMIiB4OmlkPSIzdGV4dFNjcm9sbGVyIi8+DQotCQk8L2NvbXBvc2l0ZT4NCi0JCTx0YWJJdGVtIHRleHQ9IlByb2dyZXNzQmFyIiBjb250cm9sPSJQcm9ncmVzcyIvPg0KLQ0KLQk8L3RhYkZvbGRlcj4NCi08L3hzd3Q+DQotDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3V0aWwvTW9ja3MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kYXRhYmluZGluZy91dGlsL01vY2tzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTZjNWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGF0YWJpbmRpbmcvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RhdGFiaW5kaW5nL3V0aWwvTW9ja3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5JVXBkYXRhYmxlVmFsdWU7Ci0KLXB1YmxpYyBjbGFzcyBNb2NrcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFcXVhbGl0eUNvbXBhcmF0b3IgewotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8xLCBPYmplY3QgbzIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEVxdWFsaXR5Q29tcGFyYXRvciBkZWZhdWx0RXF1YWxpdHlDb21wYXJhdG9yID0gbmV3IEVxdWFsaXR5Q29tcGFyYXRvcigpIHsKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlyZXR1cm4gbzEgPT0gbnVsbCA/IG8yID09IG51bGwgOiBvMS5lcXVhbHMobzIpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIEVxdWFsaXR5Q29tcGFyYXRvciBpbmRpZmZlcmVudEVxdWFsaXR5Q29tcGFyYXRvciA9IG5ldyBFcXVhbGl0eUNvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIE1vY2sgewotCQlwdWJsaWMgTW9ja0ludm9jYXRpb25IYW5kbGVyIGdldE1vY2tJbnZvY2F0aW9uSGFuZGxlcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1ldGhvZCBnZXRNb2NrSW52b2NhdGlvbkhhbmRsZXJNZXRob2Q7Ci0KLQlwcml2YXRlIHN0YXRpYyBNZXRob2QgZXF1YWxzTWV0aG9kOwotCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCWdldE1vY2tJbnZvY2F0aW9uSGFuZGxlck1ldGhvZCA9IE1vY2suY2xhc3MuZ2V0TWV0aG9kKAotCQkJCQkiZ2V0TW9ja0ludm9jYXRpb25IYW5kbGVyIiwgbmV3IENsYXNzWzBdKTsKLQkJCWVxdWFsc01ldGhvZCA9IE9iamVjdC5jbGFzcy5nZXRNZXRob2QoImVxdWFscyIsCi0JCQkJCW5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzIH0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCB3aWxsIGxlYWQgdG8gTnVsbFBvaW50ZXJFeGNlcHRpb25zIGxhdGVyIG9uCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNb2NrSW52b2NhdGlvbkhhbmRsZXIgaW1wbGVtZW50cwotCQkJSW52b2NhdGlvbkhhbmRsZXIgewotCi0JCXByaXZhdGUgY2xhc3MgTWV0aG9kQ2FsbCB7Ci0JCQlwcml2YXRlIGZpbmFsIE1ldGhvZCBtZXRob2Q7Ci0KLQkJCXByaXZhdGUgZmluYWwgT2JqZWN0W10gYXJnczsKLQotCQkJcHJpdmF0ZSBPYmplY3QgcmV0dXJuVmFsdWUgPSBudWxsOwotCi0JCQlwdWJsaWMgTWV0aG9kQ2FsbChNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKSB7Ci0JCQkJdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0JCQkJdGhpcy5hcmdzID0gYXJnczsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBNZXRob2RDYWxsKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCU1ldGhvZENhbGwgb3RoZXIgPSAoTWV0aG9kQ2FsbCkgb2JqOwotCQkJCWlmIChvdGhlci5tZXRob2QgIT0gbWV0aG9kCi0JCQkJCQl8fCAob3RoZXIuYXJncyA9PSBudWxsICYmIGFyZ3MgIT0gbnVsbCkKLQkJCQkJCXx8IChvdGhlci5hcmdzICE9IG51bGwgJiYgYXJncyA9PSBudWxsKQotCQkJCQkJfHwgKGFyZ3MgIT0gbnVsbCAmJiBvdGhlci5hcmdzLmxlbmd0aCAhPSBhcmdzLmxlbmd0aCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoYXJncyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKCFlcXVhbGl0eUNvbXBhcmF0b3IuZXF1YWxzKGFyZ3NbaV0sIG90aGVyLmFyZ3NbaV0pKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRSZXR1cm5WYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuVmFsdWUgPSBvYmplY3Q7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UmV0dXJuVmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHJldHVyblZhbHVlOwotCQkJfQotCQl9Ci0KLQkJTGlzdCBwcmV2aW91c0NhbGxIaXN0b3J5ID0gbnVsbDsKLQotCQlMaXN0IGN1cnJlbnRDYWxsSGlzdG9yeSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gb3JkZXJlZDsKLQotCQlwcml2YXRlIGZpbmFsIEVxdWFsaXR5Q29tcGFyYXRvciBlcXVhbGl0eUNvbXBhcmF0b3I7Ci0KLQkJcHVibGljIE1vY2tJbnZvY2F0aW9uSGFuZGxlcihib29sZWFuIG9yZGVyZWQsCi0JCQkJRXF1YWxpdHlDb21wYXJhdG9yIGVxdWFsaXR5Q29tcGFyYXRvcikgewotCQkJdGhpcy5vcmRlcmVkID0gb3JkZXJlZDsKLQkJCXRoaXMuZXF1YWxpdHlDb21wYXJhdG9yID0gZXF1YWxpdHlDb21wYXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHByb3h5LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKQotCQkJCXRocm93cyBUaHJvd2FibGUgewotCQkJaWYgKGdldE1vY2tJbnZvY2F0aW9uSGFuZGxlck1ldGhvZC5lcXVhbHMobWV0aG9kKSkgewotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCQkJaWYgKGVxdWFsc01ldGhvZC5lcXVhbHMobWV0aG9kKSkgewotCQkJCXJldHVybiBuZXcgQm9vbGVhbihwcm94eSA9PSBhcmdzWzBdKTsKLQkJCX0KLQkJCU1ldGhvZENhbGwgbWV0aG9kQ2FsbCA9IG5ldyBNZXRob2RDYWxsKG1ldGhvZCwgYXJncyk7Ci0JCQlpZiAocHJldmlvdXNDYWxsSGlzdG9yeSAhPSBudWxsKSB7Ci0JCQkJLy8gd2UgYXJlIGluIHJlcGxheSBtb2RlCi0JCQkJaW50IGluZGV4T2ZNZXRob2RDYWxsID0gcHJldmlvdXNDYWxsSGlzdG9yeS5pbmRleE9mKG1ldGhvZENhbGwpOwotCQkJCWlmIChpbmRleE9mTWV0aG9kQ2FsbCAhPSAtMSkgewotCQkJCQkvLyBjb3B5IHJldHVybiB2YWx1ZSBvdmVyIHRvIHRoaXMgbWV0aG9kIGNhbGwKLQkJCQkJbWV0aG9kQ2FsbC5zZXRSZXR1cm5WYWx1ZSgoKE1ldGhvZENhbGwpIHByZXZpb3VzQ2FsbEhpc3RvcnkKLQkJCQkJCQkuZ2V0KGluZGV4T2ZNZXRob2RDYWxsKSkuZ2V0UmV0dXJuVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJ1bmV4cGVjdGVkIG1ldGhvZCBjYWxsOiAiCi0JCQkJCQkJKyBtZXRob2QuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJaWYgKG9yZGVyZWQpIHsKLQkJCQkJaWYgKHByZXZpb3VzQ2FsbEhpc3Rvcnkuc2l6ZSgpIDw9IGN1cnJlbnRDYWxsSGlzdG9yeS5zaXplKCkpIHsKLQkJCQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcigiZXh0cmEgbWV0aG9kIGNhbGw6ICIKLQkJCQkJCQkJKyBtZXRob2QuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCQlNZXRob2RDYWxsIHByZXZpb3VzQ2FsbCA9IChNZXRob2RDYWxsKSBwcmV2aW91c0NhbGxIaXN0b3J5Ci0JCQkJCQkJLmdldChjdXJyZW50Q2FsbEhpc3Rvcnkuc2l6ZSgpKTsKLQkJCQkJaWYgKCFtZXRob2RDYWxsLmVxdWFscyhwcmV2aW91c0NhbGwpKSB7Ci0JCQkJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoCi0JCQkJCQkJCSJkaWZmZXJlbnQgbWV0aG9kIGNhbGwgKGV4cGVjdGVkOiIKLQkJCQkJCQkJCQkrIHByZXZpb3VzQ2FsbC5tZXRob2QuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJKyAiLCBhY3R1YWw6IiArIG1ldGhvZC5nZXROYW1lKCkgKyAiKSIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY3VycmVudENhbGxIaXN0b3J5LmFkZChtZXRob2RDYWxsKTsKLQkJCUNsYXNzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKSAmJiB2b2lkLmNsYXNzICE9IHJldHVyblR5cGUpIHsKLQkJCQlyZXR1cm4gcmV0dXJuVHlwZS5uZXdJbnN0YW5jZSgpOwotCQkJfQotCQkJcmV0dXJuIG1ldGhvZENhbGwuZ2V0UmV0dXJuVmFsdWUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlcGxheSgpIHsKLQkJCXByZXZpb3VzQ2FsbEhpc3RvcnkgPSBjdXJyZW50Q2FsbEhpc3Rvcnk7Ci0JCQljdXJyZW50Q2FsbEhpc3RvcnkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7Ci0JCQlpZiAocHJldmlvdXNDYWxsSGlzdG9yeSA9PSBudWxsKSB7Ci0JCQkJaWYgKGN1cnJlbnRDYWxsSGlzdG9yeS5zaXplKCkgPT0gMCkgewotCQkJCQkvLyBtb2NrIG9iamVjdCB3YXMgbm90IHVzZWQgYXQgYWxsCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJ1bmV4cGVjdGVkIik7Ci0JCQl9Ci0JCQlpZiAob3JkZXJlZCkgewotCQkJCWludCBudW1NaXNzaW5nQ2FsbHMgPSBwcmV2aW91c0NhbGxIaXN0b3J5LnNpemUoKQotCQkJCQkJLSBjdXJyZW50Q2FsbEhpc3Rvcnkuc2l6ZSgpOwotCQkJCWlmIChudW1NaXNzaW5nQ2FsbHMgPiAwKSB7Ci0JCQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcigibWlzc2luZyBtZXRob2QgY2FsbHMgKCIKLQkJCQkJCQkrIG51bU1pc3NpbmdDYWxscyArICIpIik7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJldmlvdXNDYWxsSGlzdG9yeS5zaXplKCk7IGkrKykgewotCQkJCQlpZiAoIXByZXZpb3VzQ2FsbEhpc3RvcnkuZ2V0KGkpLmVxdWFscygKLQkJCQkJCQljdXJyZW50Q2FsbEhpc3RvcnkuZ2V0KGkpKSkgewotCQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKAotCQkJCQkJCQkibWV0aG9kIGNhbGwgZGlkIG5vdCBtYXRjaCAoIiArIGkgKyAiIG9mICIKLQkJCQkJCQkJCQkrIGN1cnJlbnRDYWxsSGlzdG9yeS5zaXplKCkgKyAiKSIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJldmlvdXNDYWxsSGlzdG9yeS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZENhbGwgbWV0aG9kQ2FsbCA9IChNZXRob2RDYWxsKSBpdC5uZXh0KCk7Ci0JCQkJCWlmICghY3VycmVudENhbGxIaXN0b3J5LmNvbnRhaW5zKG1ldGhvZENhbGwpKSB7Ci0JCQkJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIm1pc3NpbmcgbWV0aG9kIGNhbGw6IgotCQkJCQkJCQkrIG1ldGhvZENhbGwubWV0aG9kLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJCXByZXZpb3VzQ2FsbEhpc3RvcnkgPSBudWxsOwotCQkJY3VycmVudENhbGxIaXN0b3J5ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TGFzdFJldHVyblZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJCU1ldGhvZENhbGwgbWV0aG9kQ2FsbCA9IChNZXRob2RDYWxsKSBjdXJyZW50Q2FsbEhpc3RvcnkKLQkJCQkJLmdldChjdXJyZW50Q2FsbEhpc3Rvcnkuc2l6ZSgpIC0gMSk7Ci0JCQltZXRob2RDYWxsLnNldFJldHVyblZhbHVlKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbW9jayBvYmplY3QgdGhhdCBuZWl0aGVyIGxvb2tzIGF0IHRoZSBvcmRlciBvZiBtZXRob2QgY2FsbHMgbm9yCi0JICogYXQgdGhlIGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gaW50ZXJmYWNlVHlwZQotCSAqIEByZXR1cm4gYSBtb2NrIG9iamVjdCB0aGF0IGNoZWNrcyBmb3IgdGhlIG9yZGVyIG9mIG1ldGhvZCBpbnZvY2F0aW9ucyBidXQKLQkgKiAgICAgICAgIG5vdCBmb3IgZXF1YWxpdHkgb2YgbWV0aG9kIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVJlbGF4ZWRNb2NrKENsYXNzIGludGVyZmFjZVR5cGUpIHsKLQkJcmV0dXJuIGNyZWF0ZU1vY2soaW50ZXJmYWNlVHlwZSwgZmFsc2UsIGluZGlmZmVyZW50RXF1YWxpdHlDb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbW9jayBvYmplY3QgdGhhdCBkb2VzIG5vdCBsb29rIGF0IHRoZSBhcmd1bWVudHMsIGJ1dCBjaGVja3MKLQkgKiB0aGF0IHRoZSBvcmRlciBvZiBjYWxscyBpcyBhcyBleHBlY3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaW50ZXJmYWNlVHlwZQotCSAqIEByZXR1cm4gYSBtb2NrIG9iamVjdCB0aGF0IGNoZWNrcyBmb3IgdGhlIG9yZGVyIG9mIG1ldGhvZCBpbnZvY2F0aW9ucyBidXQKLQkgKiAgICAgICAgIG5vdCBmb3IgZXF1YWxpdHkgb2YgbWV0aG9kIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZU9yZGVyZWRNb2NrKENsYXNzIGludGVyZmFjZVR5cGUpIHsKLQkJcmV0dXJuIGNyZWF0ZU1vY2soaW50ZXJmYWNlVHlwZSwgdHJ1ZSwgaW5kaWZmZXJlbnRFcXVhbGl0eUNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZXMgYSBmdXNzeSBtb2NrIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBpbnRlcmZhY2VUeXBlCi0JICogQHJldHVybiBhIG1vY2sgb2JqZWN0IHRoYXQgY2hlY2tzIGZvciB0aGUgb3JkZXIgb2YgbWV0aG9kIGludm9jYXRpb25zIGFuZAotCSAqICAgICAgICAgZm9yIGVxdWFsaXR5IG9mIG1ldGhvZCBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVNb2NrKENsYXNzIGludGVyZmFjZVR5cGUpIHsKLQkJcmV0dXJuIGNyZWF0ZU1vY2soaW50ZXJmYWNlVHlwZSwgdHJ1ZSwgZGVmYXVsdEVxdWFsaXR5Q29tcGFyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlcyBhIGZ1c3N5IG1vY2sgb2JqZWN0IHdpdGggYSBjb21wYXJhdG9yCi0JICogCi0JICogQHBhcmFtIGludGVyZmFjZVR5cGUKLQkgKiBAcmV0dXJuIGEgbW9jayBvYmplY3QgdGhhdCBjaGVja3MgZm9yIHRoZSBvcmRlciBvZiBtZXRob2QgaW52b2NhdGlvbnMgYW5kCi0JICogICAgICAgICB1c2VzIHRoZSBnaXZlbiBjb21wYXJhdG9yIHRvIGNvbXBhcmUgbWV0aG9kIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZU1vY2soQ2xhc3MgaW50ZXJmYWNlVHlwZSwKLQkJCUVxdWFsaXR5Q29tcGFyYXRvciBlcXVhbGl0eUNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIGNyZWF0ZU1vY2soaW50ZXJmYWNlVHlwZSwgdHJ1ZSwgZXF1YWxpdHlDb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgY3JlYXRlTW9jayhDbGFzcyBpbnRlcmZhY2VUeXBlLCBib29sZWFuIG9yZGVyZWQsCi0JCQlFcXVhbGl0eUNvbXBhcmF0b3IgZXF1YWxpdHlDb21wYXJhdG9yKSB7Ci0JCWlmICghaW50ZXJmYWNlVHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJTW9ja0ludm9jYXRpb25IYW5kbGVyIG1vY2tJbnZvY2F0aW9uSGFuZGxlciA9IG5ldyBNb2NrSW52b2NhdGlvbkhhbmRsZXIoCi0JCQkJb3JkZXJlZCwgZXF1YWxpdHlDb21wYXJhdG9yKTsKLQkJT2JqZWN0IG5ld1Byb3h5SW5zdGFuY2UgPSBQcm94eS5uZXdQcm94eUluc3RhbmNlKE1vY2tzLmNsYXNzCi0JCQkJLmdldENsYXNzTG9hZGVyKCksIG5ldyBDbGFzc1tdIHsgaW50ZXJmYWNlVHlwZSwgTW9jay5jbGFzcyB9LAotCQkJCW1vY2tJbnZvY2F0aW9uSGFuZGxlcik7Ci0JCXJldHVybiBuZXdQcm94eUluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydENoZWNraW5nKE9iamVjdCBtb2NrKSB7Ci0JCWdldE1vY2tJbnZvY2F0aW9uSGFuZGxlcihtb2NrKS5yZXBsYXkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5KE9iamVjdCBtb2NrKSB7Ci0JCWdldE1vY2tJbnZvY2F0aW9uSGFuZGxlcihtb2NrKS52ZXJpZnkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoT2JqZWN0IG1vY2spIHsKLQkJZ2V0TW9ja0ludm9jYXRpb25IYW5kbGVyKG1vY2spLnJlc2V0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTW9ja0ludm9jYXRpb25IYW5kbGVyIGdldE1vY2tJbnZvY2F0aW9uSGFuZGxlcihPYmplY3QgbW9jaykgewotCQlyZXR1cm4gKChNb2NrKSBtb2NrKS5nZXRNb2NrSW52b2NhdGlvbkhhbmRsZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TGFzdFJldHVyblZhbHVlKElVcGRhdGFibGVWYWx1ZSBtb2NrLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWdldE1vY2tJbnZvY2F0aW9uSGFuZGxlcihtb2NrKS5zZXRMYXN0UmV0dXJuVmFsdWUob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzI4NGQ1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KLQotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5kYXRhYmluZGluZyIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzbmlmZi1mb2xkZXIiCi0gICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vZGF0YWJpbmRpbmdfc25pZmZfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7c25pZmYtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7c25pZmYtZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiCi0gICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmRhdGFiaW5kaW5nLkJpbmRpbmdUZXN0U3VpdGUiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1YjM0Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvLm9wdGlvbnMgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDgxMTc4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS51aS5icm93c2VyIHBsdWdpbi4KLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgdGhlIG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIgcGx1Z2luLgotb3JnLmVjbGlwc2UudWkuYnJvd3Nlci9kZWJ1Zz1mYWxzZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjViN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDIwOTBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBicm93c2VyLmphcixcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbAotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotamFycy5jb21waWxlLm9yZGVyID0gYnJvd3Nlci5qYXIKLXNvdXJjZS5icm93c2VyLmphciA9IHNyYy8KLW91dHB1dC5icm93c2VyLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5YjdhZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIiCi0gICBuYW1lPSIlUGx1Z2luLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVQbHVnaW4ucHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIuaW50ZXJuYWwuV2ViQnJvd3NlclRlc3RzUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJicm93c2VyLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuYnJvd3NlciIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYnJvd3Nlci9pbnRlcm5hbC9BbGxUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYnJvd3Nlci9pbnRlcm5hbC9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2FiYWY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0cyBmb3Igb3JnLmVjbGlwc2UudWkuYnJvd3Nlci50ZXN0cyIpOwotCQkvLyRKVW5pdC1CRUdJTiQKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEV4aXN0ZW5jZVRlc3RDYXNlLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEludGVybmFsQnJvd3NlclZpZXdUZXN0Q2FzZS5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJbnRlcm5hbEJyb3dzZXJFZGl0b3JUZXN0Q2FzZS5jbGFzcyk7Ci0JCS8vc3VpdGUuYWRkVGVzdFN1aXRlKEV4dGVybmFsQnJvd3NlclRlc3RDYXNlLmNsYXNzKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEaWFsb2dzVGVzdENhc2UuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJlZmVyZW5jZXNUZXN0Q2FzZS5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUb29sYmFyQnJvd3NlclRlc3RDYXNlLmNsYXNzKTsKLQkJLy8kSlVuaXQtRU5EJAotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvRGlhbG9nc1Rlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9icm93c2VyL2ludGVybmFsL0RpYWxvZ3NUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2JmMzI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvRGlhbG9nc1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuQnJvd3NlckRlc2NyaXB0b3JEaWFsb2c7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBEaWFsb2dzVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxCcm93c2VyRGlhbG9nKCkgewotCQlCcm93c2VyRGVzY3JpcHRvckRpYWxvZyBiZGQgPSBuZXcgQnJvd3NlckRlc2NyaXB0b3JEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCVVJVGVzdEhlbHBlci5hc3NlcnREaWFsb2coYmRkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYnJvd3Nlci9pbnRlcm5hbC9FeGlzdGVuY2VUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYnJvd3Nlci9pbnRlcm5hbC9FeGlzdGVuY2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzg1YWQ1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvRXhpc3RlbmNlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuV2ViQnJvd3NlclVJUGx1Z2luOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgRXhpc3RlbmNlVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHZvaWQgdGVzdFBsdWdpbkV4aXN0cygpIHsKLQkJYXNzZXJ0Tm90TnVsbChXZWJCcm93c2VyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvRXh0ZXJuYWxCcm93c2VyVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvRXh0ZXJuYWxCcm93c2VyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRkZjc1Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9icm93c2VyL2ludGVybmFsL0V4dGVybmFsQnJvd3NlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXZWJCcm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuV2ViQnJvd3NlclByZWZlcmVuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbEJyb3dzZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgdm9pZCB0ZXN0QnJvd3NlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlXZWJCcm93c2VyUHJlZmVyZW5jZS5zZXRCcm93c2VyQ2hvaWNlKFdlYkJyb3dzZXJQcmVmZXJlbmNlLkVYVEVSTkFMKTsKLQkJSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IHdicyA9IFdlYkJyb3dzZXJUZXN0c1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCk7Ci0JCUlXZWJCcm93c2VyIHdiID0gd2JzLmNyZWF0ZUJyb3dzZXIoInRlc3QyIik7Ci0JCQotCQl3Yi5vcGVuVVJMKG5ldyBVUkwoImh0dHA6Ly93d3cuaWJtLmNvbSIpKTsKLQkJCi0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJd2Iub3BlblVSTChuZXcgVVJMKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIikpOwotCQkKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotCQl3Yi5jbG9zZSgpOwotCQkKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvSW50ZXJuYWxCcm93c2VyRWRpdG9yVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvSW50ZXJuYWxCcm93c2VyRWRpdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhN2RiMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9icm93c2VyL2ludGVybmFsL0ludGVybmFsQnJvd3NlckVkaXRvclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5XZWJCcm93c2VyUHJlZmVyZW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEludGVybmFsQnJvd3NlckVkaXRvclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQotCXB1YmxpYyB2b2lkIHRlc3RCcm93c2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNoZWxsID0gV2ViQnJvd3NlclRlc3RzUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJV2ViQnJvd3NlclByZWZlcmVuY2Uuc2V0QnJvd3NlckNob2ljZShXZWJCcm93c2VyUHJlZmVyZW5jZS5JTlRFUk5BTCk7Ci0JCUlXb3JrYmVuY2hCcm93c2VyU3VwcG9ydCB3YnMgPSBXZWJCcm93c2VyVGVzdHNQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRCcm93c2VyU3VwcG9ydCgpOwotCQlJV2ViQnJvd3NlciB3YiA9IHdicy5jcmVhdGVCcm93c2VyKElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5BU19FRElUT1IsICJ0ZXN0IiwgIk15QnJvd3NlciIsICJBIHRvb2x0aXAiKTsKLQkJCi0JCXdiLm9wZW5VUkwobmV3IFVSTCgiaHR0cDovL3d3dy5pYm0uY29tIikpOwotCQlydW5Mb29wVGltZXIoMik7Ci0JCQotCQl3Yi5vcGVuVVJMKG5ldyBVUkwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKSk7Ci0JCXJ1bkxvb3BUaW1lcigyKTsKLQkJCi0JCXdiLmNsb3NlKCk7Ci0JCXJ1bkxvb3BUaW1lcigyKTsKLQl9Ci0JCi0Jdm9pZCBydW5Mb29wVGltZXIoZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIGV4aXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcChzZWNvbmRzICogMTAwMCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJCWV4aXRbMF0gPSB0cnVlOwotCQkJCS8vIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AKLQkJCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQl3aGlsZSAoIWV4aXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvSW50ZXJuYWxCcm93c2VyVmlld1Rlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9icm93c2VyL2ludGVybmFsL0ludGVybmFsQnJvd3NlclZpZXdUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTkwYzU2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvSW50ZXJuYWxCcm93c2VyVmlld1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5XZWJCcm93c2VyUHJlZmVyZW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEludGVybmFsQnJvd3NlclZpZXdUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnJvd3NlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlzaGVsbCA9IFdlYkJyb3dzZXJUZXN0c1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCVdlYkJyb3dzZXJQcmVmZXJlbmNlLnNldEJyb3dzZXJDaG9pY2UoV2ViQnJvd3NlclByZWZlcmVuY2UuSU5URVJOQUwpOwotCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgd2JzID0gV2ViQnJvd3NlclRlc3RzUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKTsKLQkJSVdlYkJyb3dzZXIgd2IgPSB3YnMuY3JlYXRlQnJvd3NlcihJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuQVNfVklFVywgInRlc3QzIiwgIk15QnJvd3NlciIsICJBIHRvb2x0aXAiKTsKLQkJCi0JCXdiLm9wZW5VUkwobmV3IFVSTCgiaHR0cDovL3d3dy5pYm0uY29tIikpOwotCQlydW5Mb29wVGltZXIoMik7Ci0JCQotCQl3Yi5vcGVuVVJMKG5ldyBVUkwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKSk7Ci0JCXJ1bkxvb3BUaW1lcigyKTsKLQkJCi0JCXdiLmNsb3NlKCk7Ci0JCXJ1bkxvb3BUaW1lcigyKTsKLQl9Ci0JCi0Jdm9pZCBydW5Mb29wVGltZXIoZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIGV4aXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcChzZWNvbmRzICogMTAwMCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJCWV4aXRbMF0gPSB0cnVlOwotCQkJCS8vIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AKLQkJCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQl3aGlsZSAoIWV4aXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvT3JkZXJlZFRlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYnJvd3Nlci9pbnRlcm5hbC9PcmRlcmVkVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MWQ4ZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYnJvd3Nlci9pbnRlcm5hbC9PcmRlcmVkVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotY2xhc3MgT3JkZXJlZFRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZXsKLQlwdWJsaWMgT3JkZXJlZFRlc3RTdWl0ZShDbGFzcyB0aGVDbGFzcywgU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyh0aGVDbGFzcyk7Ci0JCXNldE5hbWUobmFtZSk7Ci0JfQotCi0JcHVibGljIE9yZGVyZWRUZXN0U3VpdGUoZmluYWwgQ2xhc3MgdGhlQ2xhc3MpIHsKLQkJc3VwZXIoKTsKLQkJc2V0TmFtZSh0aGVDbGFzcy5nZXROYW1lKCkpOwotCQl0cnkgewotCQkJZ2V0VGVzdENvbnN0cnVjdG9yKHRoZUNsYXNzKTsgLy8gQXZvaWQgZ2VuZXJhdGluZyBtdWx0aXBsZSBlcnJvciBtZXNzYWdlcwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJYWRkVGVzdCh3YXJuaW5nKCJDbGFzcyAiICsgdGhlQ2xhc3MuZ2V0TmFtZSgpCi0JCQkJCSsgIiBoYXMgbm8gcHVibGljIGNvbnN0cnVjdG9yIFRlc3RDYXNlKFN0cmluZyBuYW1lKSBvciBUZXN0Q2FzZSgpIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghTW9kaWZpZXIuaXNQdWJsaWModGhlQ2xhc3MuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0JCQlhZGRUZXN0KHdhcm5pbmcoIkNsYXNzICIgKyB0aGVDbGFzcy5nZXROYW1lKCkgKyAiIGlzIG5vdCBwdWJsaWMiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ2xhc3Mgc3VwZXJDbGFzcyA9IHRoZUNsYXNzOwotCQlWZWN0b3IgbmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCXdoaWxlIChUZXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc3VwZXJDbGFzcykpIHsKLQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBzdXBlckNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQkJaW50IHNpemUgPSBtZXRob2RzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgewotCQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IHNpemU7IGorKykgewotCQkJCQlpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuY29tcGFyZVRvKG1ldGhvZHNbal0uZ2V0TmFtZSgpKSA+IDApIHsKLQkJCQkJCU1ldGhvZCBtID0gbWV0aG9kc1tpXTsKLQkJCQkJCW1ldGhvZHNbaV0gPSBtZXRob2RzW2pdOwotCQkJCQkJbWV0aG9kc1tqXSA9IG07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWFkZFRlc3RNZXRob2QobWV0aG9kc1tpXSwgbmFtZXMsIHRoZUNsYXNzKTsKLQkJCX0KLQkJCXN1cGVyQ2xhc3MgPSBzdXBlckNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJfQotCQlpZiAoIXRlc3RzKCkuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQlhZGRUZXN0KHdhcm5pbmcoIk5vIHRlc3RzIGZvdW5kIGluICIgKyB0aGVDbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVGVzdE1ldGhvZChNZXRob2QgbSwgVmVjdG9yIG5hbWVzLCBDbGFzcyB0aGVDbGFzcykgewotCQlTdHJpbmcgbmFtZSA9IG0uZ2V0TmFtZSgpOwotCQlpZiAobmFtZXMuY29udGFpbnMobmFtZSkpCi0JCQlyZXR1cm47Ci0JCWlmICghaXNQdWJsaWNUZXN0TWV0aG9kKG0pKSB7Ci0JCQlpZiAoaXNUZXN0TWV0aG9kKG0pKQotCQkJCWFkZFRlc3Qod2FybmluZygiVGVzdCBtZXRob2QgaXNuJ3QgcHVibGljOiAiICsgbS5nZXROYW1lKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCQluYW1lcy5hZGRFbGVtZW50KG5hbWUpOwotCQlhZGRUZXN0KGNyZWF0ZVRlc3QodGhlQ2xhc3MsIG5hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQdWJsaWNUZXN0TWV0aG9kKE1ldGhvZCBtKSB7Ci0JCXJldHVybiBpc1Rlc3RNZXRob2QobSkgJiYgTW9kaWZpZXIuaXNQdWJsaWMobS5nZXRNb2RpZmllcnMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVGVzdE1ldGhvZChNZXRob2QgbSkgewotCQlTdHJpbmcgbmFtZSA9IG0uZ2V0TmFtZSgpOwotCQlDbGFzc1tdIHBhcmFtZXRlcnMgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCUNsYXNzIHJldHVyblR5cGUgPSBtLmdldFJldHVyblR5cGUoKTsKLQkJcmV0dXJuIHBhcmFtZXRlcnMubGVuZ3RoID09IDAgJiYgbmFtZS5zdGFydHNXaXRoKCJ0ZXN0IikgJiYgcmV0dXJuVHlwZS5lcXVhbHMoVm9pZC5UWVBFKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3Qgd2FybmluZyhmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gbmV3IFRlc3RDYXNlKCJ3YXJuaW5nIikgewotCQkJcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHsKLQkJCQlmYWlsKG1lc3NhZ2UpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9icm93c2VyL2ludGVybmFsL1ByZWZlcmVuY2VzVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvUHJlZmVyZW5jZXNUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjJkMjczLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvUHJlZmVyZW5jZXNUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLQotcHVibGljIGNsYXNzIFByZWZlcmVuY2VzVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShQcmVmZXJlbmNlc1Rlc3RDYXNlLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXNUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZXJuZXRQcmVmZXJlbmNlUGFnZSgpIHsKLQkJRGlhbG9nIGRpYWxvZyA9IFVJVGVzdEhlbHBlci5nZXRQcmVmZXJlbmNlRGlhbG9nKCJvcmcuZWNsaXBzZS5pbnRlcm5ldCIpOwotCQlVSVRlc3RIZWxwZXIuYXNzZXJ0RGlhbG9nKGRpYWxvZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdlYkJyb3dzZXJQcmVmZXJlbmNlUGFnZSgpIHsKLQkJRGlhbG9nIGRpYWxvZyA9IFVJVGVzdEhlbHBlci5nZXRQcmVmZXJlbmNlRGlhbG9nKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQud2ViYnJvd3Nlci5wcmVmZXJlbmNlUGFnZSIpOwotCQlVSVRlc3RIZWxwZXIuYXNzZXJ0RGlhbG9nKGRpYWxvZyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvVG9vbGJhckJyb3dzZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYnJvd3Nlci9pbnRlcm5hbC9Ub29sYmFyQnJvd3NlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjlmMWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYnJvd3Nlci9pbnRlcm5hbC9Ub29sYmFyQnJvd3NlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuQnJvd3NlclZpZXdlcjsKLQotcHVibGljIGNsYXNzIFRvb2xiYXJCcm93c2VyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBEaWFsb2cgZGlhbG9nOwotCXByb3RlY3RlZCBzdGF0aWMgU2hlbGwgc2hlbGw7Ci0JcHJvdGVjdGVkIHN0YXRpYyBCcm93c2VyVmlld2VyIGJyb3dzZXI7Ci0JCi0JY2xhc3MgVGVzdFRvb2xiYXJCcm93c2VyIGV4dGVuZHMgQnJvd3NlclZpZXdlciB7Ci0KLQkJcHVibGljIFRlc3RUb29sYmFyQnJvd3NlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCB0ZXN0UHJvdGVjdGVkTWV0aG9kcygpIHsKLQkJCXN1cGVyLmFkZFRvSGlzdG9yeSgid3d3LmVjbGlzcGUub3JnIik7Ci0JCQlzdXBlci51cGRhdGVCYWNrTmV4dEJ1c3koKTsKLQkJCXN1cGVyLnVwZGF0ZUhpc3RvcnkoKTsKLQkJCXN1cGVyLnVwZGF0ZUxvY2F0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IE9yZGVyZWRUZXN0U3VpdGUoVG9vbGJhckJyb3dzZXJUZXN0Q2FzZS5jbGFzcywgIlRvb2xiYXJCcm93c2VyVGVzdENhc2UiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0MDBPcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlkaWFsb2cgPSBuZXcgRGlhbG9nKHNoZWxsKSB7Ci0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJCQotCQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlclZpZXdlcihjb21wb3NpdGUsIEJyb3dzZXJWaWV3ZXIuTE9DQVRJT05fQkFSIHwgQnJvd3NlclZpZXdlci5CVVRUT05fQkFSKTsKLQkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQkJZGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCQkJZGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQkJCWJyb3dzZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkKLQkJCQlyZXR1cm4gY29tcG9zaXRlOwotCQkJfQotCQl9OwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotCQlkaWFsb2cub3BlbigpOwotCQkKLQkJYm9vbGVhbiBiID0gRGlzcGxheS5nZXRDdXJyZW50KCkucmVhZEFuZERpc3BhdGNoKCk7Ci0JCXdoaWxlIChiKQotCQkJYiA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLnJlYWRBbmREaXNwYXRjaCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDFTZXRVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcnVuTG9vcFRpbWVyKDUpOwotCQlicm93c2VyLnNldFVSTCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCQlydW5Mb29wVGltZXIoMTApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QwMkhvbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnJvd3Nlci5ob21lKCk7Ci0JCXJ1bkxvb3BUaW1lcigyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0MDNTZXRVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnJvd3Nlci5zZXRVUkwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvaW5kZXguaHRtbCIpOwotCQlydW5Mb29wVGltZXIoMTApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QwNElzQmFja0VuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZShicm93c2VyLmlzQmFja0VuYWJsZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDA1QmFjaygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKGJyb3dzZXIuYmFjaygpKTsKLQkJcnVuTG9vcFRpbWVyKDUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDZJc0ZvcndhcmRFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QwN0ZvcndhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZShicm93c2VyLmZvcndhcmQoKSk7Ci0JCXJ1bkxvb3BUaW1lcig1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDA4UmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlicm93c2VyLnJlZnJlc2goKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDA5R2V0QnJvd3NlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKGJyb3dzZXIuZ2V0QnJvd3NlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDEwU3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlicm93c2VyLnN0b3AoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0MTFHZXRVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChicm93c2VyLmdldFVSTCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0MTJTZXRGb2N1cygpIHRocm93cyBFeGNlcHRpb24gewotCQlicm93c2VyLnNldEZvY3VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDEzQ2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZGlhbG9nLmNsb3NlKCk7Ci0JfQotCQotCVRlc3RUb29sYmFyQnJvd3NlciB0dGIgPSBudWxsOwotCQotCXB1YmxpYyB2b2lkIHRlc3QxNFByb3RlY3RlZE1ldGhvZHMoKSB7Ci0JCXNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlkaWFsb2cgPSBuZXcgRGlhbG9nKHNoZWxsKSB7Ci0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJCQotCQkJCXR0YiA9IG5ldyBUZXN0VG9vbGJhckJyb3dzZXIoY29tcG9zaXRlLCBCcm93c2VyVmlld2VyLkxPQ0FUSU9OX0JBUiB8IEJyb3dzZXJWaWV3ZXIuQlVUVE9OX0JBUik7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJCWRhdGEud2lkdGhIaW50ID0gNDAwOwotCQkJCWRhdGEuaGVpZ2h0SGludCA9IDQwMDsKLQkJCQl0dGIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkKLQkJCQlyZXR1cm4gY29tcG9zaXRlOwotCQkJfQotCQl9OwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotCQlkaWFsb2cub3BlbigpOwotCQkKLQkJdHRiLnRlc3RQcm90ZWN0ZWRNZXRob2RzKCk7Ci0JCWRpYWxvZy5jbG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MTVMaXN0ZW5lcnMoKSB7Ci0JCUJyb3dzZXJWaWV3ZXIuSUJhY2tOZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQnJvd3NlclZpZXdlci5JQmFja05leHRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHVwZGF0ZUJhY2tOZXh0QnVzeSgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfTsKLQkJCi0JCWxpc3RlbmVyLnVwZGF0ZUJhY2tOZXh0QnVzeSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MTZMaXN0ZW5lcnMoKSB7Ci0JCUJyb3dzZXJWaWV3ZXIuSUxvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQnJvd3NlclZpZXdlci5JTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxvY2F0aW9uQ2hhbmdlZChTdHJpbmcgdXJsKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGhpc3RvcnlDaGFuZ2VkKFN0cmluZ1tdIGhpc3RvcnkyKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX07Ci0JCQotCQlsaXN0ZW5lci5sb2NhdGlvbkNoYW5nZWQobnVsbCk7Ci0JCWxpc3RlbmVyLmhpc3RvcnlDaGFuZ2VkKG51bGwpOwotCX0KLQotCXZvaWQgcnVuTG9vcFRpbWVyKGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSBleGl0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoc2Vjb25kcyAqIDEwMDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQlleGl0WzBdID0gdHJ1ZTsKLQkJCQkvLyB3YWtlIHVwIHRoZSBldmVudCBsb29wCi0JCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJc2hlbGwub3BlbigpOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJd2hpbGUgKCFleGl0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9icm93c2VyL2ludGVybmFsL1VJVGVzdEhlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYnJvd3Nlci9pbnRlcm5hbC9VSVRlc3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2NmIxZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9icm93c2VyL2ludGVybmFsL1VJVGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5Qcm9wZXJ0eURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlByb3BlcnR5UGFnZUNvbnRyaWJ1dG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlByb3BlcnR5UGFnZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBVSVRlc3RIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIGNsYXNzIFByZWZlcmVuY2VEaWFsb2dXcmFwcGVyIGV4dGVuZHMgUHJlZmVyZW5jZURpYWxvZyB7Ci0JCXB1YmxpYyBQcmVmZXJlbmNlRGlhbG9nV3JhcHBlcihTaGVsbCBwYXJlbnRTaGVsbCwgUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlcikgewotCQkJc3VwZXIocGFyZW50U2hlbGwsIG1hbmFnZXIpOwotCQl9Ci0JCXByb3RlY3RlZCBib29sZWFuIHNob3dQYWdlKElQcmVmZXJlbmNlTm9kZSBub2RlKSB7Ci0JCQlyZXR1cm4gc3VwZXIuc2hvd1BhZ2Uobm9kZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvcGVydHlEaWFsb2dXcmFwcGVyIGV4dGVuZHMgUHJvcGVydHlEaWFsb2cgewotCQlwdWJsaWMgUHJvcGVydHlEaWFsb2dXcmFwcGVyKFNoZWxsIHBhcmVudFNoZWxsLCBQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJc3VwZXIocGFyZW50U2hlbGwsIG1hbmFnZXIsIHNlbGVjdGlvbik7Ci0JCX0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1BhZ2UoSVByZWZlcmVuY2VOb2RlIG5vZGUpIHsKLQkJCXJldHVybiBzdXBlci5zaG93UGFnZShub2RlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlRGlhbG9nIGdldFByZWZlcmVuY2VEaWFsb2coU3RyaW5nIGlkKSB7Ci0JCVByZWZlcmVuY2VEaWFsb2dXcmFwcGVyIGRpYWxvZyA9IG51bGw7Ci0JCVByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRpYWxvZyA9IG5ldyBQcmVmZXJlbmNlRGlhbG9nV3JhcHBlcihnZXRTaGVsbCgpLCBtYW5hZ2VyKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsJCi0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYW5hZ2VyLmdldEVsZW1lbnRzKFByZWZlcmVuY2VNYW5hZ2VyLlBSRV9PUkRFUikuaXRlcmF0b3IoKTsKLQkJCSAgICAgaXRlcmF0b3IuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IChJUHJlZmVyZW5jZU5vZGUpaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICggbm9kZS5nZXRJZCgpLmVxdWFscyhpZCkgKSB7Ci0JCQkJCWRpYWxvZy5zaG93UGFnZShub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkaWFsb2c7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlEaWFsb2cgZ2V0UHJvcGVydHlEaWFsb2coU3RyaW5nIGlkLCBJQWRhcHRhYmxlIGVsZW1lbnQpIHsKLQkJUHJvcGVydHlEaWFsb2dXcmFwcGVyIGRpYWxvZyA9IG51bGw7Ci0KLQkJUHJvcGVydHlQYWdlTWFuYWdlciBtYW5hZ2VyID0gbmV3IFByb3BlcnR5UGFnZU1hbmFnZXIoKTsKLQkJU3RyaW5nIHRpdGxlID0gIiI7Ci0JCVN0cmluZyBuYW1lICA9ICIiOwotCi0JCS8vIGxvYWQgcGFnZXMgZm9yIHRoZSBzZWxlY3Rpb24KLQkJLy8gZmlsbCB0aGUgbWFuYWdlciB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgbWF0Y2hpbmcgY29udHJpYnV0b3JzCi0JCVByb3BlcnR5UGFnZUNvbnRyaWJ1dG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuY29udHJpYnV0ZShtYW5hZ2VyLCBlbGVtZW50KTsKLQkJCi0JCUlXb3JrYmVuY2hBZGFwdGVyIGFkYXB0ZXIgPSAoSVdvcmtiZW5jaEFkYXB0ZXIpZWxlbWVudC5nZXRBZGFwdGVyKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJbmFtZSA9IGFkYXB0ZXIuZ2V0TGFiZWwoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCS8vIHRlc3RpbmcgaWYgdGhlcmUgYXJlIHBhZ2VzIGluIHRoZSBtYW5hZ2VyCi0JCUl0ZXJhdG9yIHBhZ2VzID0gbWFuYWdlci5nZXRFbGVtZW50cyhQcmVmZXJlbmNlTWFuYWdlci5QUkVfT1JERVIpLml0ZXJhdG9yKCk7CQkKLQkJaWYgKCFwYWdlcy5oYXNOZXh0KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXRpdGxlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoIlByb3BlcnR5RGlhbG9nLnByb3BlcnR5TWVzc2FnZSIsIG5ldyBPYmplY3RbXSB7bmFtZX0pOwotCQlkaWFsb2cgPSBuZXcgUHJvcGVydHlEaWFsb2dXcmFwcGVyKGdldFNoZWxsKCksIG1hbmFnZXIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVsZW1lbnQpKTsgCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYW5hZ2VyLmdldEVsZW1lbnRzKFByZWZlcmVuY2VNYW5hZ2VyLlBSRV9PUkRFUikuaXRlcmF0b3IoKTsKLQkJICAgICBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IChJUHJlZmVyZW5jZU5vZGUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCBub2RlLmdldElkKCkuZXF1YWxzKGlkKSApIHsKLQkJCQlkaWFsb2cuc2hvd1BhZ2Uobm9kZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpYWxvZzsKLQl9Ci0JCi0JLyoqCi0JICogQXV0b21hdGVkIHRlc3QgdGhhdCBjaGVja3MgYWxsIHRoZSBsYWJlbHMgYW5kIGJ1dHRvbnMgb2YgYSBkaWFsb2cKLQkgKiB0byBtYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gdG8gZGlzcGxheSBhbGwgdGhlIHRleHQuICBBbnkKLQkgKiB0ZXh0IHRoYXQgd3JhcHMgaXMgb25seSBhcHByb3hpbWF0ZWQgYW5kIGlzIGN1cnJlbnRseSBub3QgYWNjdXJhdGUuCi0JICogCi0JICogQHBhcmFtIGRpYWxvZyB0aGUgdGVzdCBkaWFsb2cgdG8gYmUgdmVyaWZpZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydERpYWxvZyhEaWFsb2cgZGlhbG9nKSB7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKGRpYWxvZyk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3BlbihmYWxzZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCVNoZWxsIHNoZWxsID0gZGlhbG9nLmdldFNoZWxsKCk7Ci0JCXZlcmlmeUNvbXBvc2l0ZVRleHQoc2hlbGwpOwotCQlkaWFsb2cuY2xvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIExvb2tzIGF0IGFsbCB0aGUgY2hpbGQgd2lkZ2V0cyBvZiBhIGdpdmVuIGNvbXBvc2l0ZSBhbmQKLQkgKiB2ZXJpZmllcyB0aGUgdGV4dCBvbiBhbGwgbGFiZWxzIGFuZCB3aWRnZXRzLgotCSAqIEBwYXJhbSBjb21wb3NpdGUgVGhlIGNvbXBvc2l0ZSB0byBsb29rIHRocm91Z2gKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUNvbXBvc2l0ZVRleHQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlDb250cm9sIGNoaWxkcmVuW10gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQkvL3ZlcmlmeSB0aGUgdGV4dCBpZiB0aGUgY2hpbGQgaXMgYSBidXR0b24KLQkJCQl2ZXJpZnlCdXR0b25UZXh0KChCdXR0b24pIGNoaWxkcmVuW2ldKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleE5vdEJ1dHRvbikgewotCQkJCXRyeSB7Ci0JCQkJCS8vY2hpbGQgaXMgbm90IGEgYnV0dG9uLCBtYXliZSBhIGxhYmVsCi0JCQkJCXZlcmlmeUxhYmVsVGV4dCgoTGFiZWwpIGNoaWxkcmVuW2ldKTsKLQkJCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXhOb3RMYWJlbCkgewotCQkJCQl0cnkgewotCQkJCQkJLy9jaGlsZCBpcyBub3QgYSBsYWJlbCwgbWFrZSBhIHJlY3Vyc2l2ZSBjYWxsIGlmIGl0IGlzIGEgY29tcG9zaXRlCi0JCQkJCQl2ZXJpZnlDb21wb3NpdGVUZXh0KChDb21wb3NpdGUpIGNoaWxkcmVuW2ldKTsKLQkJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4Tm90Q29tcG9zaXRlKSB7Ci0JCQkJCQkvL3RoZSBjaGlsZCBpcyBub3QgYSBidXR0b24sIGxhYmVsLCBvciBjb21wb3NpdGUgLSBpZ25vcmUgaXQuCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBWZXJpZmllcyB0aGF0IGEgZ2l2ZW4gYnV0dG9uIGlzIGxhcmdlIGVub3VnaCB0byBkaXNwbGF5IGl0cyB0ZXh0LgotCSAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiB0byB2ZXJpZnksCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlCdXR0b25UZXh0KEJ1dHRvbiBidXR0b24pIHsKLQkJU3RyaW5nIHdpZGdldCA9IGJ1dHRvbi50b1N0cmluZygpOwotCQlQb2ludCBzaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQotCQkvLyBjb21wdXRlIHRoZSBzaXplIHdpdGggbm8gbGluZSB3cmFwcGluZwotCQlQb2ludCBwcmVmZXJyZWQgPSBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJLy9pZiAoc2l6ZS55L3ByZWZlcnJlZC55KSA9PSBYLCB0aGVuIGxhYmVsIHNwYW5zIFggbGluZXMsIHNvIGRpdmlkZQotCQkvL3RoZSBjYWxjdWxhdGVkIHZhbHVlIG9mIHByZWZlcnJlZC54IGJ5IFgKLQkJaWYgKHByZWZlcnJlZC55ICogc2l6ZS55ID4gMCkgewotCQkJcHJlZmVycmVkLnkgLz0gY291bnRMaW5lcyhidXR0b24uZ2V0VGV4dCgpKTsgLy9jaGVjayBmb3IgJ1xuXCcKLQkJCWlmIChzaXplLnkgLyBwcmVmZXJyZWQueSA+IDEpIHsKLQkJCQlwcmVmZXJyZWQueCAvPSAoc2l6ZS55IC8gcHJlZmVycmVkLnkpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIG1lc3NhZ2UgPQotCQkJbmV3IFN0cmluZ0J1ZmZlcigiV2FybmluZzogIikKLQkJCQkuYXBwZW5kKHdpZGdldCkKLQkJCQkuYXBwZW5kKCJcblx0QWN0dWFsIFdpZHRoIC0+ICIpCi0JCQkJLmFwcGVuZChzaXplLngpCi0JCQkJLmFwcGVuZCgiXG5cdFJlY29tbWVuZGVkIFdpZHRoIC0+ICIpCi0JCQkJLmFwcGVuZChwcmVmZXJyZWQueCkKLQkJCQkudG9TdHJpbmcoKTsKLQkJaWYgKHByZWZlcnJlZC54ID4gc2l6ZS54KSB7Ci0JCQkvL2Nsb3NlIHRoZSBkaWFsb2cKLQkJCWJ1dHRvbi5nZXRTaGVsbCgpLmRpc3Bvc2UoKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UudG9TdHJpbmcoKSwgZmFsc2UpOwotCQl9Ci0JfQotCQotCS8qCi0JICogVmVyaWZpZXMgdGhhdCBhIGdpdmVuIGxhYmVsIGlzIGxhcmdlIGVub3VnaCB0byBkaXNwbGF5IGl0cyB0ZXh0LgotCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdG8gdmVyaWZ5LAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5TGFiZWxUZXh0KExhYmVsIGxhYmVsKSB7Ci0JCVN0cmluZyB3aWRnZXQgPSBsYWJlbC50b1N0cmluZygpOwotCQlQb2ludCBzaXplID0gbGFiZWwuZ2V0U2l6ZSgpOwotCi0JCS8vIGNvbXB1dGUgdGhlIHNpemUgd2l0aCBubyBsaW5lIHdyYXBwaW5nCi0JCVBvaW50IHByZWZlcnJlZCA9IGxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCS8vaWYgKHNpemUueS9wcmVmZXJyZWQueSkgPT0gWCwgdGhlbiBsYWJlbCBzcGFucyBYIGxpbmVzLCBzbyBkaXZpZGUKLQkJLy90aGUgY2FsY3VsYXRlZCB2YWx1ZSBvZiBwcmVmZXJyZWQueCBieSBYCi0JCWlmIChwcmVmZXJyZWQueSAqIHNpemUueSA+IDApIHsKLQkJCXByZWZlcnJlZC55IC89IGNvdW50TGluZXMobGFiZWwuZ2V0VGV4dCgpKTsKLQkJCWlmIChzaXplLnkgLyBwcmVmZXJyZWQueSA+IDEpIHsKLQkJCQlwcmVmZXJyZWQueCAvPSAoc2l6ZS55IC8gcHJlZmVycmVkLnkpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigiV2FybmluZzogIikuYXBwZW5kKHdpZGdldCkKLQkJCS5hcHBlbmQoIlxuXHRBY3R1YWwgV2lkdGggLT4gIikuYXBwZW5kKHNpemUueCkKLQkJCS5hcHBlbmQoIlxuXHRSZWNvbW1lbmRlZCBXaWR0aCAtPiAiKS5hcHBlbmQocHJlZmVycmVkLngpLnRvU3RyaW5nKCk7Ci0JCWlmIChwcmVmZXJyZWQueCA+IHNpemUueCkgewotCQkJLy9jbG9zZSB0aGUgZGlhbG9nCi0JCQlsYWJlbC5nZXRTaGVsbCgpLmRpc3Bvc2UoKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UudG9TdHJpbmcoKSwgZmFsc2UpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ291bnRzIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gYSBnaXZlbiBTdHJpbmcuCi0JICogRm9yIGV4YW1wbGUsIGlmIGEgc3RyaW5nIGNvbnRhaW5zIG9uZSAoMSkgbmV3bGluZSBjaGFyYWN0ZXIsCi0JICogYSB2YWx1ZSBvZiB0d28gKDIpIHdvdWxkIGJlIHJldHVybmVkLgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBzdHJpbmcgdG8gbG9vayB0aHJvdWdoLgotCSAqIEByZXR1cm4gaW50IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGV4dC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgY291bnRMaW5lcyhTdHJpbmcgdGV4dCkgewotCQlpbnQgbmV3TGluZXMgPSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKHRleHQuY2hhckF0KGkpID09ICdcbicpIHsKLQkJCQluZXdMaW5lcysrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdMaW5lczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYnJvd3Nlci9pbnRlcm5hbC9XZWJCcm93c2VyVGVzdHNQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2Jyb3dzZXIvaW50ZXJuYWwvV2ViQnJvd3NlclRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NjZiN2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYnJvd3Nlci9pbnRlcm5hbC9XZWJCcm93c2VyVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYnJvd3Nlci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotLyoqCi0gKiBUaGUgd2ViIGJyb3dzZXIgdGVzdHMgcGx1Z2luIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlclRlc3RzUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy8gV2ViIGJyb3dzZXIgcGx1Z2luIGlkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnVpLmJyb3dzZXIudGVzdHMiOwotCi0JLy8gc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLQlwcml2YXRlIHN0YXRpYyBXZWJCcm93c2VyVGVzdHNQbHVnaW4gc2luZ2xldG9uOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBXZWJCcm93c2VyVGVzdHNQbHVnaW4KLQkgKi8KLQlwdWJsaWMgV2ViQnJvd3NlclRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlzaW5nbGV0b24gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5XZWJCcm93c2VyUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJCcm93c2VyVGVzdHNQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5icm93c2VyL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDgyNTFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmJyb3dzZXIvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotIDwhLS0gPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4gLS0+Ci0JPGVjaG8gbWVzc2FnZT0iYmFzZWRpciAke2Jhc2VkaXJ9IiAvPgotCTxlY2hvIG1lc3NhZ2U9ImVjbGlwc2UgcGxhY2UgJHtlY2xpcHNlLWhvbWV9IiAvPgotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC53ZWJicm93c2VyLnRlc3RzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIi8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0id3N0LWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS93c3RfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7d3N0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3c3QtZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQud2ViYnJvd3Nlci50ZXN0cy5BbGxUZXN0cyIgLz4KLSAgIAk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0NDFmOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYWNmYjE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotI0ZyaSBNYXkgMDYgMTI6MDU6MDggRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiZTExMzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVHVlIE9jdCAxOCAxNToxNjoxNyBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcz48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBnZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50Ij4vKipcbiAqIEByZXR1cm4gUmV0dXJucyB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBzZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmNvbW1lbnQiIG5hbWVcPSJzZXR0ZXJjb21tZW50Ij4vKipcbiAqIEBwYXJhbSAke3BhcmFtfSBUaGUgJHtiYXJlX2ZpZWxkX25hbWV9IHRvIHNldC5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIGNvbnN0cnVjdG9ycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmNvbW1lbnQiIG5hbWVcPSJjb25zdHJ1Y3RvcmNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBKYXZhIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpbGVjb21tZW50IiBuYW1lXD0iZmlsZWNvbW1lbnQiPi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBDb3B5cmlnaHQgKGMpICR7eWVhcn0gSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG4gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcbiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwXDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbiAqXG4gKiBDb250cmlidXRvcnNcOlxuICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJmYWxzZSIgY29udGV4dFw9InR5cGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIHR5cGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnR5cGVjb21tZW50IiBuYW1lXD0idHlwZWNvbW1lbnQiPi8qKlxuICogQHNpbmNlIDMuMlxuICpcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBmaWVsZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50Ij4vKipcbiAqIFxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBub24tb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGNvbW1lbnQiIG5hbWVcPSJtZXRob2Rjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ib3ZlcnJpZGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMub3ZlcnJpZGVjb21tZW50IiBuYW1lXD0ib3ZlcnJpZGVjb21tZW50Ij4vKiAobm9uLUphdmFkb2MpXG4gKiAke3NlZV90b19vdmVycmlkZGVufVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJuZXd0eXBlX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJOZXdseSBjcmVhdGVkIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm5ld3R5cGUiIG5hbWVcPSJuZXd0eXBlIj4ke2ZpbGVjb21tZW50fVxuJHtwYWNrYWdlX2RlY2xhcmF0aW9ufVxuXG4ke3R5cGVjb21tZW50fVxuJHt0eXBlX2RlY2xhcmF0aW9ufTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2F0Y2hibG9ja19jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2F0Y2ggYmxvY2tzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNhdGNoYmxvY2siIG5hbWVcPSJjYXRjaGJsb2NrIj4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrXG4ke2V4Y2VwdGlvbl92YXJ9LnByaW50U3RhY2tUcmFjZSgpOzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIG1ldGhvZCBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rib2R5IiBuYW1lXD0ibWV0aG9kYm9keSI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YlxuJHtib2R5X3N0YXRlbWVudH08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGNvbnN0cnVjdG9yIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yYm9keSIgbmFtZVw9ImNvbnN0cnVjdG9yYm9keSI+JHtib2R5X3N0YXRlbWVudH1cbi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGdldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyYm9keSIgbmFtZVw9ImdldHRlcmJvZHkiPnJldHVybiAke2ZpZWxkfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBzZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmJvZHkiIG5hbWVcPSJzZXR0ZXJib2R5Ij4ke2ZpZWxkfSBcPSAke3BhcmFtfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNsYXNzYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2xhc3MgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2xhc3Nib2R5IiBuYW1lXD0iY2xhc3Nib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iaW50ZXJmYWNlYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgaW50ZXJmYWNlIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmludGVyZmFjZWJvZHkiIG5hbWVcPSJpbnRlcmZhY2Vib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZW51bWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGVudW0gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZW51bWJvZHkiIG5hbWVcPSJlbnVtYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImFubm90YXRpb25ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBhbm5vdGF0aW9uIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmFubm90YXRpb25ib2R5IiBuYW1lXD0iYW5ub3RhdGlvbmJvZHkiPlxuPC90ZW1wbGF0ZT48L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODgzNjY2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jTW9uIEZlYiAyMSAxNDoxNzozNiBFU1QgMjAwNQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0yCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MQotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MQotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkMmFiNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogSGFybmVzcyBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLlVJVGVzdEhhcm5lc3NQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MsCi0gb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnVpLmlkZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4NjNlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL2ljb25zL2FueXRoaW5nLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MvaWNvbnMvYW55dGhpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM3N2E3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MvaWNvbnMvYW55dGhpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODJhODM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPgotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBuYW1lPSJQZXJmb3JtYW5jZSBFbXB0eSBQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRW1wdHlQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRW1wdHlQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L3BlcnNwZWN0aXZlPgotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBuYW1lPSJQZXJmb3JtYW5jZSBFbXB0eSBQZXJzcGVjdGl2ZSAyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5FbXB0eVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5FbXB0eVBlcnNwZWN0aXZlMiI+Ci0gICAgICA8L3BlcnNwZWN0aXZlPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9oYXJuZXNzL1VJVGVzdEhhcm5lc3NQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2hhcm5lc3MvVUlUZXN0SGFybmVzc1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGE4N2RlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2hhcm5lc3MvVUlUZXN0SGFybmVzc1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgVUlUZXN0SGFybmVzc1BsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFVJVGVzdEhhcm5lc3NQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVUlUZXN0SGFybmVzc1BsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVJVGVzdEhhcm5lc3NQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzIiwgcGF0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL0FjdGlvblV0aWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2hhcm5lc3MvdXRpbC9BY3Rpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmOGU3ZmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL0FjdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoV2luZG93OwotCi0vKioKLSAqIDxjb2RlPkFjdGlvblV0aWw8L2NvZGU+IGNvbnRhaW5zIG1ldGhvZHMgdG8gcnVuIGFjdGlvbnMKLSAqIGluIHRoZSB3b3JrYmVuY2guCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25VdGlsIHsKLQotICAgIC8qKgotICAgICAqIFJ1bnMgYW4gYWN0aW9uIGNvbnRyaWJ1dGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdCB0aGUgY3VycmVudCB0ZXN0IGNhc2UKLSAgICAgKiBAcGFyYW0gaXRlbSBhbiBhY3Rpb24gY29udHJpYnV0aW9uIGl0ZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuQWN0aW9uKFRlc3RDYXNlIHRlc3QsIElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShpdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSk7Ci0gICAgICAgICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0QWN0aW9uKCkucnVuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVucyB0aGUgZmlyc3QgYWN0aW9uIGZvdW5kIGluIGEgbWVudSBtYW5hZ2VyIHdpdGggYQotICAgICAqIHBhcnRpY3VsYXIgbGFiZWwuIAotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3QgdGhlIGN1cnJlbnQgdGVzdCBjYXNlCi0gICAgICogQHBhcmFtIG1nciB0aGUgY29udGFpbmluZyBtZW51IG1hbmFnZXIKLSAgICAgKiBAcGFyYW0gbGFiZWwgdGhlIGFjdGlvbiBsYWJlbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5BY3Rpb25XaXRoTGFiZWwoVGVzdENhc2UgdGVzdCwgSU1lbnVNYW5hZ2VyIG1nciwKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCkgewotICAgICAgICBJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWdyLmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IG5YID0gMDsgblggPCBpdGVtcy5sZW5ndGg7IG5YKyspIHsKLSAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBpdGVtc1tuWF07Ci0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pCi0gICAgICAgICAgICAgICAgaXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0SW5uZXJJdGVtKCk7Ci0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLSAgICAgICAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxhYmVsLmVxdWFscyhhY3Rpb24uZ2V0VGV4dCgpKSkgewotICAgICAgICAgICAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5hYmxlIHRvIGZpbmQgYWN0aW9uOiAiICsgbGFiZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIGZpcnN0IGFjdGlvbiBmb3VuZCBpbiBhIHdpbmRvdyB3aXRoIGEKLSAgICAgKiBwYXJ0aWN1bGFyIGxhYmVsLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdCB0aGUgY3VycmVudCB0ZXN0IGNhc2UKLSAgICAgKiBAcGFyYW0gd2luIHRoZSBjb250YWluaW5nIHdpbmRvdwotICAgICAqIEBwYXJhbSBsYWJlbCB0aGUgYWN0aW9uIGxhYmVsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bkFjdGlvbldpdGhMYWJlbChUZXN0Q2FzZSB0ZXN0LCBJV29ya2JlbmNoV2luZG93IHdpbiwKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCkgewotICAgICAgICBXb3JrYmVuY2hXaW5kb3cgcmVhbFdpbiA9IChXb3JrYmVuY2hXaW5kb3cpIHdpbjsKLSAgICAgICAgSU1lbnVNYW5hZ2VyIG1nciA9IHJlYWxXaW4uZ2V0TWVudU1hbmFnZXIoKTsKLSAgICAgICAgcnVuQWN0aW9uV2l0aExhYmVsKHRlc3QsIG1nciwgbGFiZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgYW4gYWN0aW9uIGlkZW50aWZpZWQgYnkgYW4gaWQgcGF0aCBpbiBhIAotICAgICAqIG1lbnUgbWFuYWdlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdCB0aGUgY3VycmVudCB0ZXN0IGNhc2UKLSAgICAgKiBAcGFyYW0gbWdyIHRoZSBjb250YWluaW5nIG1lbnUgbWFuYWdlcgotICAgICAqIEBwYXJhbSBsYWJlbCB0aGUgYWN0aW9uIGxhYmVsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bkFjdGlvblVzaW5nUGF0aChUZXN0Q2FzZSB0ZXN0LCBJTWVudU1hbmFnZXIgbWdyLAotICAgICAgICAgICAgU3RyaW5nIGlkUGF0aCkgewotICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gbWdyLmZpbmRVc2luZ1BhdGgoaWRQYXRoKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChpdGVtKTsKLSAgICAgICAgcnVuQWN0aW9uKHRlc3QsIGl0ZW0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgYW4gYWN0aW9uIGlkZW50aWZpZWQgYnkgYW4gaWQgcGF0aCBpbiBhIAotICAgICAqIHdpbmRvdy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdCB0aGUgY3VycmVudCB0ZXN0IGNhc2UKLSAgICAgKiBAcGFyYW0gd2luIHRoZSBjb250YWluaW5nIHdpbmRvdwotICAgICAqIEBwYXJhbSBsYWJlbCB0aGUgYWN0aW9uIGxhYmVsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bkFjdGlvblVzaW5nUGF0aChUZXN0Q2FzZSB0ZXN0LCBJV29ya2JlbmNoV2luZG93IHdpbiwKLSAgICAgICAgICAgIFN0cmluZyBpZFBhdGgpIHsKLSAgICAgICAgV29ya2JlbmNoV2luZG93IHJlYWxXaW4gPSAoV29ya2JlbmNoV2luZG93KSB3aW47Ci0gICAgICAgIElNZW51TWFuYWdlciBtZ3IgPSByZWFsV2luLmdldE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIHJ1bkFjdGlvblVzaW5nUGF0aCh0ZXN0LCBtZ3IsIGlkUGF0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3QgYWN0aW9uIGZvdW5kIGluIGEgbWVudSBtYW5hZ2VyIHdpdGggYQotICAgICAqIHBhcnRpY3VsYXIgbGFiZWwuIAotICAgICAqCi0gICAgICogQHBhcmFtIG1nciB0aGUgY29udGFpbmluZyBtZW51IG1hbmFnZXIKLSAgICAgKiBAcGFyYW0gbGFiZWwgdGhlIGFjdGlvbiBsYWJlbAotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IGFjdGlvbiB3aXRoIHRoZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAJCWlmIGl0IGlzIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElBY3Rpb24gZ2V0QWN0aW9uV2l0aExhYmVsKElNZW51TWFuYWdlciBtZ3IsIFN0cmluZyBsYWJlbCkgewotICAgICAgICBJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWdyLmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IG5YID0gMDsgblggPCBpdGVtcy5sZW5ndGg7IG5YKyspIHsKLSAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBpdGVtc1tuWF07Ci0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pCi0gICAgICAgICAgICAgICAgaXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0SW5uZXJJdGVtKCk7Ci0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLSAgICAgICAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxhYmVsLmVxdWFscyhhY3Rpb24uZ2V0VGV4dCgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaXJlIHRoZSAiaGFuZGxlQWJvdXRUb1Nob3ciIG1ldGhvZCBpbiBhIG1lbnUgbWFuYWdlci4KLSAgICAgKiBUaGlzIHRyaWdnZXJzIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHdoZW4gYSB1c2VyIG9wZW5zIGEgbWVudS4KLSAgICAgKiBUaGUgbWVudSB0byBiZSBwb3B1bGF0ZWQgd2l0aCBhY3Rpb25zIGFuZCB0aG9zZSAKLSAgICAgKiBhY3Rpb25zIHRvIGJlIGVuYWN0ZWQgaW4gU1dUIHdpZGdldHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1nciB0aGUgbWVudSBtYW5hZ2VyIHRvIG9wZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlyZUFib3V0VG9TaG93KE1lbnVNYW5hZ2VyIG1ncikgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gbWdyLmdldENsYXNzKCk7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZCgiaGFuZGxlQWJvdXRUb1Nob3ciLAotICAgICAgICAgICAgICAgIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICBtZXRob2QuaW52b2tlKG1nciwgbmV3IE9iamVjdFswXSk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9oYXJuZXNzL3V0aWwvQXJyYXlVdGlsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9oYXJuZXNzL3V0aWwvQXJyYXlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkY2I4MmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL0FycmF5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLS8qKgotICogPGNvZGU+QXJyYXlVdGlsPC9jb2RlPiBjb250YWlucyBtZXRob2RzIGZvciBhcnJheSAKLSAqIGV4YW1pbmF0aW9uLiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheVV0aWwgewotICAgIHByaXZhdGUgc3RhdGljIFJhbmRvbSByYW5kb21Cb3ggPSBuZXcgUmFuZG9tKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIG9iamVjdCBjaG9zZW4gZnJvbSBhbiBhcnJheS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXJyYXkgdGhlIGlucHV0IGFycmF5Ci0gICAgICogQHJldHVybiBhIHJhbmRvbSBvYmplY3QgaW4gdGhlIGFycmF5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgcGlja1JhbmRvbShPYmplY3RbXSBhcnJheSkgewotICAgICAgICBpbnQgbnVtID0gcmFuZG9tQm94Lm5leHRJbnQoYXJyYXkubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIGFycmF5W251bV07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIGFuIGFycmF5IGlzIG5vdCBudWxsIGFuZAotICAgICAqIGVhY2ggb2JqZWN0IGluIHRoZSBhcnJheSBpcyBub3QgbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSB0aGUgaW5wdXQgYXJyYXkKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWUgb3IgZmFsc2U8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrTm90TnVsbChPYmplY3RbXSBhcnJheSkgewotICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBhbiBhcnJheSBjb250YWlucyBhIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSB0aGUgaW5wdXQgYXJyYXkKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgdGVzdCBvYmplY3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcnJheSBjb250YWlucyB0aGUgb2JqZWN0LAotICAgICAqIAkJPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0W10gYXJyYXksIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChhcnJheSA9PSBudWxsIHx8IGVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PSBlbGVtZW50KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0d28gYXJyYXlzIGFyZSBlcXVhbC4gIFRoZXkgbXVzdAotICAgICAqIGhhdmUgdGhlIHNhbWUgc2l6ZSBhbmQgdGhlIHNhbWUgY29udGVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb25lIHRoZSBmaXJzdCBhcnJheQotICAgICAqIEBwYXJhbSB0d28gdGhlIHNlY29uZCBhcnJheQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFycmF5IGFyZSBlcXVhbCwKLSAgICAgKiAJCTxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhPYmplY3RbXSBvbmUsIE9iamVjdFtdIHR3bykgewotICAgICAgICBpZiAob25lLmxlbmd0aCAhPSB0d28ubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb25lLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChvbmVbaV0gIT0gdHdvW2ldKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2hhcm5lc3MvdXRpbC9BdXRvbWF0aW9uVXRpbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL0F1dG9tYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMzRiM2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL0F1dG9tYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLQotLyoqCi0gKiA8Y29kZT5BdXRvbWF0aW9uVXRpbDwvY29kZT4gY29udGFpbnMgdXRpbGl0eSBtZXRob2RzIHRvIG1pbWljIGtleSBldmVudHMuCi0gKiBNb3VzZSBldmVudCBtZXRob2RzIGNhbiBiZSBhZGRlZCBpZiBuZWVkZWQgdG8gY29tcGxldGUgdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRpb25VdGlsIHsKLQotCS8qKgotCSAqIE1ldGhvZCB0byBtaW1pYyBhIGtleSBjb2RlIGV2ZW50IG9uIGEgZGlzcGxheS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheQotCSAqICAgICAgICAgICAgVGhlIGRpc3BsYXkuCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgVGhlIGV2ZW50IHR5cGUuCi0JICogQHBhcmFtIGtleUNvZGUKLQkgKiAgICAgICAgICAgIFRoZSBrZXkgY29kZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGVyZm9ybUtleUNvZGVFdmVudChEaXNwbGF5IGRpc3BsYXksIGludCBldmVudFR5cGUsCi0JCQlpbnQga2V5Q29kZSkgewotCQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCQlldmVudC50eXBlID0gZXZlbnRUeXBlOwotCQlldmVudC5rZXlDb2RlID0ga2V5Q29kZTsKLQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gbWltaWMgYSBjaGFyYWN0ZXIgZXZlbnQgb24gYSBkaXNwbGF5LgotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5Ci0JICogICAgICAgICAgICBUaGUgZGlzcGxheS4KLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICBUaGUgZXZlbnQgdHlwZS4KLQkgKiBAcGFyYW0gY2hhcmFjdGVyCi0JICogICAgICAgICAgICBUaGUgY2hhcmFjdGVyIHRvIG1pbWljLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwZXJmb3JtQ2hhcmFjdGVyRXZlbnQoRGlzcGxheSBkaXNwbGF5LCBpbnQgZXZlbnRUeXBlLAotCQkJY2hhciBjaGFyYWN0ZXIpIHsKLQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IGV2ZW50VHlwZTsKLQkJZXZlbnQuY2hhcmFjdGVyID0gY2hhcmFjdGVyOwotCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2hhcm5lc3MvdXRpbC9DYWxsSGlzdG9yeS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL0NhbGxIaXN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MzVhNTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL0NhbGxIaXN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIDxjb2RlPkNhbGxIaXN0b3J5PC9jb2RlPiBpcyB1c2VkIHRvIHJlY29yZCB0aGUgaW52b2NhdGlvbgotICogb2YgbWV0aG9kcyB3aXRoaW4gYSB0YXJnZXQgb2JqZWN0LiAgVGhpcyBpcyB1c2VmdWwgZHVyaW5nCi0gKiBsaWZlY3ljbGUgdGVzdGluZyBmb3IgYW4gb2JqZWN0LgotICogPHA+Ci0gKiBUbyB1c2UgPGNvZGU+Q2FsbEhpc3Rvcnk8L2NvZGU+IC4uCi0gKiA8b2w+Ci0gKiA8bGk+Q3JlYXRlIGEgQ2FsbEhpc3RvcnkgaW4gdGhlIHRhcmdldCBvciBwYXNzIG9uZSBpbi48L2xpPgotICogPGxpPkludm9rZSBzb21lIHRlc3Qgc2NlbmFyaW8uICA8L2xpPgotICogPGxpPklmIGEgbWV0aG9kIGlzIGNhbGxlZCBvbiB0aGUgdGFyZ2V0IHJlY29yZCB0aGUgaW52b2NhdGlvbgotICogCWluIHRoZSBjYWxsIGhpc3Rvcnk8L2xpPgotICogPGxpPlZlcmlmeSB0aGUgY2FsbCBoaXN0b3J5IGFmdGVyIHRoZSB0ZXN0IHNjZW5hcmlvIGlzCi0gKiAJY29tcGxldGUuPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+PHA+Ci0gKiBFYWNoIDxjb2RlPkNhbGxIaXN0b3J5PC9jb2RlPiBoYXMgYSB0YXJnZXQgd2hpY2ggaXMgdXNlZCB0byAKLSAqIHZlcmlmeSB0aGUgbWV0aG9kIG5hbWVzIHBhc3NlZCB0byB0aGUgaGlzdG9yeS4gIElmIGFuIGludmFsaWQgCi0gKiBuYW1lIGlzIHBhc3NlZCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IHdpbGwgCi0gKiBiZSB0aHJvd24uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDYWxsSGlzdG9yeSB7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgbWV0aG9kTGlzdDsKLQotICAgIHByaXZhdGUgQ2xhc3MgY2xhc3NUeXBlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBjYWxsIGhpc3RvcnkgZm9yIGFuIG9iamVjdC4gIAotICAgICAqIAotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIGNhbGwgaGlzdG9yeSB0YXJnZXQuIAotICAgICAqLwotICAgIHB1YmxpYyBDYWxsSGlzdG9yeShPYmplY3QgdGFyZ2V0KSB7Ci0gICAgICAgIG1ldGhvZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGNsYXNzVHlwZSA9IHRhcmdldC5nZXRDbGFzcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBuYW1lIGlzIGludmFsaWQKLSAgICAgKiBmb3IgdGhlIGdpdmVuIHRhcmdldCBjbGFzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdE1ldGhvZE5hbWUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLSAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IGNsYXNzVHlwZS5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUYXJnZXQgY2xhc3MgKCIKLSAgICAgICAgICAgICAgICArIGNsYXNzVHlwZS5nZXROYW1lKCkgKyAiKSBkb2VzIG5vdCBjb250YWluIG1ldGhvZDogIgotICAgICAgICAgICAgICAgICsgbWV0aG9kTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG1ldGhvZCBuYW1lIHRvIHRoZSBjYWxsIGhpc3RvcnkuICAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiBhIG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgbWV0aG9kTmFtZSkgewotICAgICAgICB0ZXN0TWV0aG9kTmFtZShtZXRob2ROYW1lKTsKLSAgICAgICAgbWV0aG9kTGlzdC5hZGQobWV0aG9kTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBjYWxsIGhpc3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIG1ldGhvZExpc3QuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBsaXN0IG9mIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZCBpbgotICAgICAqIG9yZGVyLiAgCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlc3ROYW1lcyBhbiBhcnJheSBvZiB0aGUgbWV0aG9kIG5hbWVzIGluIHRoZSBvcmRlciB0aGV5IGFyZSBleHBlY3RlZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZHMgd2VyZSBjYWxsZWQgaW4gb3JkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB2ZXJpZnlPcmRlcihTdHJpbmdbXSB0ZXN0TmFtZXMpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHRlc3RJbmRleCA9IDA7Ci0gICAgICAgIGludCB0ZXN0TGVuZ3RoID0gdGVzdE5hbWVzLmxlbmd0aDsKLSAgICAgICAgaWYgKHRlc3RMZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBmb3IgKGludCBuWCA9IDA7IG5YIDwgbWV0aG9kTGlzdC5zaXplKCk7IG5YKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gKFN0cmluZykgbWV0aG9kTGlzdC5nZXQoblgpOwotICAgICAgICAgICAgU3RyaW5nIHRlc3ROYW1lID0gdGVzdE5hbWVzW3Rlc3RJbmRleF07Ci0gICAgICAgICAgICB0ZXN0TWV0aG9kTmFtZSh0ZXN0TmFtZSk7Ci0gICAgICAgICAgICBpZiAodGVzdE5hbWUuZXF1YWxzKG1ldGhvZE5hbWUpKQotICAgICAgICAgICAgICAgICsrdGVzdEluZGV4OwotICAgICAgICAgICAgaWYgKHRlc3RJbmRleCA+PSB0ZXN0TGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIGEgbWV0aG9kIG5hbWUKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2Qgd2FzIGNhbGxlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIHRlc3RNZXRob2ROYW1lKG1ldGhvZE5hbWUpOwotICAgICAgICByZXR1cm4gbWV0aG9kTGlzdC5jb250YWlucyhtZXRob2ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBsaXN0IG9mIG1ldGhvZHMgd2VyZSBjYWxsZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1ldGhvZE5hbWVzIGEgbGlzdCBvZiBtZXRob2RzCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kcyB3ZXJlIGNhbGxlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZ1tdIG1ldGhvZE5hbWVzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRlc3RNZXRob2ROYW1lKG1ldGhvZE5hbWVzW2ldKTsKLSAgICAgICAgICAgIGlmICghbWV0aG9kTGlzdC5jb250YWlucyhtZXRob2ROYW1lc1tpXSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbGlzdCBvZiBtZXRob2RzIGNhbGxlZCBpcyBlbXB0eS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgbGlzdCBvZiBtZXRob2RzIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZExpc3QuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgY2FsbCBoaXN0b3J5IHRvIHRoZSBjb25zb2xlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50VG9Db25zb2xlKCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZExpc3Quc2l6ZSgpOyBpKyspCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWV0aG9kTGlzdC5nZXQoaSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2hhcm5lc3MvdXRpbC9EaWFsb2dDaGVjay5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL0RpYWxvZ0NoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYjllYjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL0RpYWxvZ0NoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwudXRpbC5WZXJpZnlEaWFsb2c7Ci0KLS8qKgotICogQSA8Y29kZT5EaWFsb2dDaGVjazwvY29kZT4gaXMgdXNlZCB0ZXN0IGEgZGlhbG9nIGluCi0gKiB2YXJpb3VzIHdheXMuIAotICogPHA+Ci0gKiBGb3IgaW50ZXJhY3RpdmUgdGVzdHMgdXNlIDxjb2RlPmFzc2VydERpYWxvZzwvY29kZT4uCi0gKiBGb3IgYXV0b21hdGVkIHRlc3RzIHVzZSA8Y29kZT5hc3NlcnQgRGlhbG9nVGV4dHM8L2NvZGU+LgotICogPC9wPiAKLSAqLwotcHVibGljIGNsYXNzIERpYWxvZ0NoZWNrIHsKLSAgICBwcml2YXRlIERpYWxvZ0NoZWNrKCkgewotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFZlcmlmeURpYWxvZyBfdmVyaWZ5RGlhbG9nOwotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0cyB0aGF0IGEgZ2l2ZW4gZGlhbG9nIGlzIG5vdCBudWxsIGFuZCB0aGF0IGl0IHBhc3NlcwotICAgICAqIGNlcnRhaW4gdmlzdWFsIHRlc3RzLiAgVGhlc2UgdGVzdHMgd2lsbCBiZSB2ZXJpZmllZCBtYW51YWxseQotICAgICAqIGJ5IHRoZSB0ZXN0ZXIgdXNpbmcgYW4gaW5wdXQgZGlhbG9nLiAgVXNlIHRoaXMgYXNzZXJ0IG1ldGhvZAotICAgICAqIHRvIHZlcmlmeSBhIGRpYWxvZydzIHNpemluZywgaW5pdGlhbCBmb2N1cywgb3IgYWNjZXNzaWJsaXR5LgotICAgICAqIFRvIGVuc3VyZSB0aGF0IGJvdGggdGhlIGlucHV0IGRpYWxvZyBhbmQgdGhlIHRlc3QgZGlhbG9nIGFyZQotICAgICAqIGFjY2Vzc2libGUgYnkgdGhlIHRlc3RlciwgdGhlIGdldFNoZWxsKCkgbWV0aG9kIHNob3VsZCBiZSB1c2VkCi0gICAgICogd2hlbiBjcmVhdGluZyB0aGUgdGVzdCBkaWFsb2cuCi0gICAgICogCi0gICAgICogRXhhbXBsZSB1c2FnZToKLSAgICAgKiA8Y29kZT5EaWFsb2cgZGlhbG9nID0gbmV3IEFib3V0RGlhbG9nKCBEaWFsb2dDaGVjay5nZXRTaGVsbCgpICk7Ci0gICAgICogRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7PC9jb2RlPgotICAgICAqIAotICAgICAqIEBwYXJhbSBkaWFsb2cgdGhlIHRlc3QgZGlhbG9nIHRvIGJlIHZlcmlmaWVkLgotICAgICAqIEBwYXJhbSBhc3NlcnQgdGhpcyBpcyB0aGUgdGVzdCBjYXNlIG9iamVjdCwgYXNzZXJ0aW9ucyB3aWxsIGJlCi0gICAgICogZXhlY3V0ZWQgb24gdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydERpYWxvZyhEaWFsb2cgZGlhbG9nLCBBc3NlcnQgYXNzZXJ0aW9uKSB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGRpYWxvZyk7Ci0gICAgICAgIGlmIChfdmVyaWZ5RGlhbG9nLmdldFNoZWxsKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy9mb3JjZSB0aGUgY3JlYXRpb24gb2YgdGhlIHZlcmlmeSBkaWFsb2cKLSAgICAgICAgICAgIGdldFNoZWxsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKF92ZXJpZnlEaWFsb2cub3BlbihkaWFsb2cpID09IElEaWFsb2dDb25zdGFudHMuTk9fSUQpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKF92ZXJpZnlEaWFsb2cuZ2V0RmFpbHVyZVRleHQoKSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0b21hdGVkIHRlc3QgdGhhdCBjaGVja3MgYWxsIHRoZSBsYWJlbHMgYW5kIGJ1dHRvbnMgb2YgYSBkaWFsb2cKLSAgICAgKiB0byBtYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gdG8gZGlzcGxheSBhbGwgdGhlIHRleHQuICBBbnkKLSAgICAgKiB0ZXh0IHRoYXQgd3JhcHMgaXMgb25seSBhcHByb3hpbWF0ZWQgYW5kIGlzIGN1cnJlbnRseSBub3QgYWNjdXJhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRpYWxvZyB0aGUgdGVzdCBkaWFsb2cgdG8gYmUgdmVyaWZpZWQuCi0gICAgICogQHBhcmFtIGFzc2VydCB0aGlzIGlzIHRoZSB0ZXN0IGNhc2Ugb2JqZWN0LCBhc3NlcnRpb25zIHdpbGwgYmUKLSAgICAgKiBleGVjdXRlZCBvbiB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RGlhbG9nVGV4dHMoRGlhbG9nIGRpYWxvZywgQXNzZXJ0IGFzc2VydGlvbikgewotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChkaWFsb2cpOwotICAgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICBTaGVsbCBzaGVsbCA9IGRpYWxvZy5nZXRTaGVsbCgpOwotICAgICAgICB2ZXJpZnlDb21wb3NpdGVUZXh0KHNoZWxsLCBhc3NlcnRpb24pOwotICAgICAgICBkaWFsb2cuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gY3JlYXRpbmcgZGlhbG9ncyB0byB0ZXN0LiAgVGhpcwotICAgICAqIGVuc3VyZXMgdGhhdCB0aGUgZGlhbG9nJ3MgcGFyZW50IHNoZWxsIHdpbGwgYmUgdGhhdCBvZiB0aGUKLSAgICAgKiB2ZXJpZmljYXRpb24gZGlhbG9nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gU2hlbGwgVGhlIHNoZWxsIG9mIHRoZSB2ZXJpZmljYXRpb24gZGlhbG9nIHRvIGJlIHVzZWQgYXMKLSAgICAgKiB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSB0ZXN0IGRpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICBTaGVsbCBzaGVsbCA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLSAgICAgICAgX3ZlcmlmeURpYWxvZyA9IG5ldyBWZXJpZnlEaWFsb2coc2hlbGwpOwotICAgICAgICBfdmVyaWZ5RGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICByZXR1cm4gX3ZlcmlmeURpYWxvZy5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogTG9va3MgYXQgYWxsIHRoZSBjaGlsZCB3aWRnZXRzIG9mIGEgZ2l2ZW4gY29tcG9zaXRlIGFuZAotICAgICAqIHZlcmlmaWVzIHRoZSB0ZXh0IG9uIGFsbCBsYWJlbHMgYW5kIHdpZGdldHMuCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSBUaGUgY29tcG9zaXRlIHRvIGxvb2sgdGhyb3VnaAotICAgICAqIEBwYXJhbSBhc3NlcnQgVGhlIG9iamVjdCB0byBpbnZva2UgYXNzZXJ0aW9ucyBvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUNvbXBvc2l0ZVRleHQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwKLSAgICAgICAgICAgIEFzc2VydCBhc3NlcnRpb24pIHsKLSAgICAgICAgQ29udHJvbCBjaGlsZHJlbltdID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRhYkZvbGRlcikgewotICAgICAgICAgICAgICAgIFRhYkZvbGRlciBmb2xkZXIgPSAoVGFiRm9sZGVyKSBjaGlsZDsKLSAgICAgICAgICAgICAgICBpbnQgbnVtUGFnZXMgPSBmb2xkZXIuZ2V0SXRlbUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1QYWdlczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvbGRlci5zZXRTZWxlY3Rpb24oaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24pIHsKLSAgICAgICAgICAgICAgICAvL3ZlcmlmeSB0aGUgdGV4dCBpZiB0aGUgY2hpbGQgaXMgYSBidXR0b24KLSAgICAgICAgICAgICAgICB2ZXJpZnlCdXR0b25UZXh0KChCdXR0b24pIGNoaWxkLCBhc3NlcnRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBMYWJlbCkgewotICAgICAgICAgICAgICAgIC8vY2hpbGQgaXMgbm90IGEgYnV0dG9uLCBtYXliZSBhIGxhYmVsCi0gICAgICAgICAgICAgICAgdmVyaWZ5TGFiZWxUZXh0KChMYWJlbCkgY2hpbGQsIGFzc2VydGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotICAgICAgICAgICAgICAgIC8vY2hpbGQgaXMgbm90IGEgbGFiZWwsIG1ha2UgYSByZWN1cnNpdmUgY2FsbCBpZiBpdCBpcyBhIGNvbXBvc2l0ZQotICAgICAgICAgICAgICAgIHZlcmlmeUNvbXBvc2l0ZVRleHQoKENvbXBvc2l0ZSkgY2hpbGQsIGFzc2VydGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBidXR0b24gaXMgbGFyZ2UgZW5vdWdoIHRvIGRpc3BsYXkgaXRzIHRleHQuCi0gICAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIHRvIHZlcmlmeSwKLSAgICAgKiBAcGFyYW0gYXNzZXJ0IFRoZSBvYmplY3QgdG8gaW52b2tlIGFzc2VydGlvbnMgb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlCdXR0b25UZXh0KEJ1dHRvbiBidXR0b24sIEFzc2VydCBhc3NlcnRpb24pIHsKLSAgICAgICAgU3RyaW5nIHdpZGdldCA9IGJ1dHRvbi50b1N0cmluZygpOwotICAgICAgICBQb2ludCBzaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQotICAgICAgICAvL2NvbXB1dGUgdGhlIHNpemUgd2l0aCBubyBsaW5lIHdyYXBwaW5nCi0gICAgICAgIFBvaW50IHByZWZlcnJlZCA9IGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICAvL2lmIChzaXplLnkvcHJlZmVycmVkLnkpID09IFgsIHRoZW4gbGFiZWwgc3BhbnMgWCBsaW5lcywgc28gZGl2aWRlCi0gICAgICAgIC8vdGhlIGNhbGN1bGF0ZWQgdmFsdWUgb2YgcHJlZmVycmVkLnggYnkgWAotICAgICAgICBpZiAocHJlZmVycmVkLnkgKiBzaXplLnkgPiAwKSB7Ci0gICAgICAgICAgICBwcmVmZXJyZWQueSAvPSBjb3VudExpbmVzKGJ1dHRvbi5nZXRUZXh0KCkpOyAvL2NoZWNrIGZvciAnXG5cJwotICAgICAgICAgICAgaWYgKHNpemUueSAvIHByZWZlcnJlZC55ID4gMSkgewotICAgICAgICAgICAgICAgIHByZWZlcnJlZC54IC89IChzaXplLnkgLyBwcmVmZXJyZWQueSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoIldhcm5pbmc6ICIpLmFwcGVuZCh3aWRnZXQpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAiXG5cdEFjdHVhbCBXaWR0aCAtPiAiKS5hcHBlbmQoc2l6ZS54KS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgIlxuXHRSZWNvbW1lbmRlZCBXaWR0aCAtPiAiKS5hcHBlbmQocHJlZmVycmVkLngpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChwcmVmZXJyZWQueCA+IHNpemUueCkgewotICAgICAgICAgICAgLy9jbG9zZSB0aGUgZGlhbG9nCi0gICAgICAgICAgICBidXR0b24uZ2V0U2hlbGwoKS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLnRvU3RyaW5nKCksIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogVmVyaWZpZXMgdGhhdCBhIGdpdmVuIGxhYmVsIGlzIGxhcmdlIGVub3VnaCB0byBkaXNwbGF5IGl0cyB0ZXh0LgotICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdG8gdmVyaWZ5LAotICAgICAqIEBwYXJhbSBhc3NlcnQgVGhlIG9iamVjdCB0byBpbnZva2UgYXNzZXJ0aW9ucyBvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUxhYmVsVGV4dChMYWJlbCBsYWJlbCwgQXNzZXJ0IGFzc2VydGlvbikgewotICAgICAgICBTdHJpbmcgd2lkZ2V0ID0gbGFiZWwudG9TdHJpbmcoKTsKLSAgICAgICAgUG9pbnQgc2l6ZSA9IGxhYmVsLmdldFNpemUoKTsKLQotICAgICAgICAvL2NvbXB1dGUgdGhlIHNpemUgd2l0aCBubyBsaW5lIHdyYXBwaW5nCi0gICAgICAgIFBvaW50IHByZWZlcnJlZCA9IGxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgICAgIC8vaWYgKHNpemUueS9wcmVmZXJyZWQueSkgPT0gWCwgdGhlbiBsYWJlbCBzcGFucyBYIGxpbmVzLCBzbyBkaXZpZGUKLSAgICAgICAgLy90aGUgY2FsY3VsYXRlZCB2YWx1ZSBvZiBwcmVmZXJyZWQueCBieSBYCi0gICAgICAgIGlmIChwcmVmZXJyZWQueSAqIHNpemUueSA+IDApIHsKLSAgICAgICAgICAgIHByZWZlcnJlZC55IC89IGNvdW50TGluZXMobGFiZWwuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIGlmIChzaXplLnkgLyBwcmVmZXJyZWQueSA+IDEpIHsKLSAgICAgICAgICAgICAgICBwcmVmZXJyZWQueCAvPSAoc2l6ZS55IC8gcHJlZmVycmVkLnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigiV2FybmluZzogIikuYXBwZW5kKHdpZGdldCkuYXBwZW5kKAotICAgICAgICAgICAgICAgICJcblx0QWN0dWFsIFdpZHRoIC0+ICIpLmFwcGVuZChzaXplLngpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAiXG5cdFJlY29tbWVuZGVkIFdpZHRoIC0+ICIpLmFwcGVuZChwcmVmZXJyZWQueCkudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKHByZWZlcnJlZC54ID4gc2l6ZS54KSB7Ci0gICAgICAgICAgICAvL2Nsb3NlIHRoZSBkaWFsb2cKLSAgICAgICAgICAgIGxhYmVsLmdldFNoZWxsKCkuZGlzcG9zZSgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS50b1N0cmluZygpLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvdW50cyB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIGEgZ2l2ZW4gU3RyaW5nLgotICAgICAqIEZvciBleGFtcGxlLCBpZiBhIHN0cmluZyBjb250YWlucyBvbmUgKDEpIG5ld2xpbmUgY2hhcmFjdGVyLAotICAgICAqIGEgdmFsdWUgb2YgdHdvICgyKSB3b3VsZCBiZSByZXR1cm5lZC4KLSAgICAgKiBAcGFyYW0gdGV4dCBUaGUgc3RyaW5nIHRvIGxvb2sgdGhyb3VnaC4KLSAgICAgKiBAcmV0dXJuIGludCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50TGluZXMoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgaW50IG5ld0xpbmVzID0gMTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgbmV3TGluZXMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3TGluZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL0VtcHR5UGVyc3BlY3RpdmUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2hhcm5lc3MvdXRpbC9FbXB0eVBlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyN2I0OTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL0VtcHR5UGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgcGVyc3BlY3RpdmUgaXMgdXNlZCBmb3IgdGVzdGluZyBhcGkuICBJdCBkZWZpbmVzIGFuIGluaXRpYWwKLSAqIGxheW91dCB3aXRoIG5vIHBhcnRzLCBqdXN0IGFuIGVkaXRvciBhcmVhLgotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICogVGhlIHBlcnNwZWN0aXZlIGlkIGZvciB0aGUgZW1wdHkgcGVyc3BlY3RpdmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU1BfSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkVtcHR5UGVyc3BlY3RpdmUiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBlcnNwZWN0aXZlIGlkIGZvciB0aGUgc2Vjb25kIGVtcHR5IHBlcnNwZWN0aXZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNQX0lEMiA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRW1wdHlQZXJzcGVjdGl2ZTIiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExhc3RQZXJzcGVjdGl2ZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgcGVyc3BlY3RpdmUgbGFzdCBvcGVuZWQgdXNpbmcgdGhpcyBmYWN0b3J5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBwZXJzcGVjdGl2ZSBsYXN0IG9wZW5lZCB1c2luZyB0aGlzIGZhY3RvcnksIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFzdFBlcnNwZWN0aXZlKCkgewotCQlyZXR1cm4gTGFzdFBlcnNwZWN0aXZlOwotCX0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBwZXJzcGVjdGl2ZSBsYXN0IG9wZW5lZCB1c2luZyB0aGlzIGZhY3RvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBlcnNwIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgcGVyc3BlY3RpdmUgbGFzdCBvcGVuZWQgdXNpbmcgdGhpcyBmYWN0b3J5LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMYXN0UGVyc3BlY3RpdmUoU3RyaW5nIHBlcnNwSWQpIHsKLQkJTGFzdFBlcnNwZWN0aXZlID0gcGVyc3BJZDsKLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBEZWZhdWx0IGxheW91dCBlbmdpbmUuCi0gICAgICovCi0gICAgcHVibGljIEVtcHR5UGVyc3BlY3RpdmUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmaW5lcyB0aGUgaW5pdGlhbCBsYXlvdXQgZm9yIGEgcGVyc3BlY3RpdmUuICAKLSAgICAgKgotICAgICAqIEltcGxlbWVudG9ycyBvZiB0aGlzIG1ldGhvZCBtYXkgYWRkIGFkZGl0aW9uYWwgdmlld3MgdG8gYQotICAgICAqIHBlcnNwZWN0aXZlLiAgVGhlIHBlcnNwZWN0aXZlIGFscmVhZHkgY29udGFpbnMgYW4gZWRpdG9yIGZvbGRlcgotICAgICAqIHdpdGggPGNvZGU+SUQgPSBJTGF5b3V0RmFjdG9yeS5JRF9FRElUT1JTPC9jb2RlPi4gIEFkZCBhZGRpdGlvbmFsIHZpZXdzCi0gICAgICogdG8gdGhlIHBlcnNwZWN0aXZlIGluIHJlZmVyZW5jZSB0byB0aGUgZWRpdG9yIGZvbGRlci4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZW4gYSBuZXcgcGVyc3BlY3RpdmUgaXMgY3JlYXRlZC4gIElmCi0gICAgICogYW4gb2xkIHBlcnNwZWN0aXZlIGlzIHJlc3RvcmVkIGZyb20gYSBwZXJzaXN0ZW5jZSBmaWxlIHRoZW4KLSAgICAgKiB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgdGhlIGZhY3RvcnkgdXNlZCB0byBhZGQgdmlld3MgdG8gdGhlIHBlcnNwZWN0aXZlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLSAgICAJc2V0TGFzdFBlcnNwZWN0aXZlKGxheW91dC5nZXREZXNjcmlwdG9yKCkuZ2V0SWQoKSk7Ci0gICAgICAgIC8vIGRvIG5vIGxheW91dCwgdGhpcyBpcyB0aGUgZW1wdHkgcGVyc3BlY3RpdmUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9oYXJuZXNzL3V0aWwvRmlsZVRvb2wuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2hhcm5lc3MvdXRpbC9GaWxlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmZjNDFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2hhcm5lc3MvdXRpbC9GaWxlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZVRvb2wgewotCQotCS8qKgotCSAqIEEgYnVmZmVyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsKLQkvKioKLQkgKiBVbnppcHMgdGhlIGdpdmVuIHppcCBmaWxlIHRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKLQkgKiBleHRyYWN0aW5nIG9ubHkgdGhvc2UgZW50cmllcyB0aGUgcGFzcyB0aHJvdWdoIHRoZSBnaXZlbgotCSAqIGZpbHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsdGVyIGZpbHRlcnMgb3V0IHVud2FudGVkIHppcCBlbnRyaWVzCi0JICogQHBhcmFtIHppcEZpbGUgdGhlIHppcCBmaWxlIHRvIHVuemlwCi0JICogQHBhcmFtIGRzdERpciB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuemlwKFppcEZpbGUgemlwRmlsZSwgRmlsZSBkc3REaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXVuemlwKHppcEZpbGUsIGRzdERpciwgZHN0RGlyLCAwKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bnppcChaaXBGaWxlIHppcEZpbGUsIEZpbGUgcm9vdERzdERpciwgRmlsZSBkc3REaXIsIGludCBkZXB0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkKLQkJRW51bWVyYXRpb24gZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOwotCQotCQl0cnkgewotCQkJd2hpbGUoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSl7Ci0JCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCWlmKGVudHJ5LmlzRGlyZWN0b3J5KCkpewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGVudHJ5TmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkc3REaXIsIGNoYW5nZVNlcGFyYXRvcihlbnRyeU5hbWUsICcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCQkJZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJSW5wdXRTdHJlYW0gc3JjID0gbnVsbDsKLQkJCQlPdXRwdXRTdHJlYW0gZHN0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlzcmMgPSB6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQkJCQkJZHN0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCQkJCXRyYW5zZmVyRGF0YShzcmMsIGRzdCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYoZHN0ICE9IG51bGwpewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlkc3QuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYoc3JjICE9IG51bGwpewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzcmMuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXppcEZpbGUuY2xvc2UoKTsKLQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2l2ZW4gZmlsZSBwYXRoIHdpdGggaXRzIHNlcGFyYXRvcgotCSAqIGNoYXJhY3RlciBjaGFuZ2VkIGZyb20gdGhlIGdpdmVuIG9sZCBzZXBhcmF0b3IgdG8gdGhlCi0JICogZ2l2ZW4gbmV3IHNlcGFyYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIGZpbGUgcGF0aAotCSAqIEBwYXJhbSBvbGRTZXBhcmF0b3IgYSBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIKLQkgKiBAcGFyYW0gbmV3U2VwYXJhdG9yIGEgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVyCi0JICogQHJldHVybiB0aGUgZmlsZSBwYXRoIHdpdGggaXRzIHNlcGFyYXRvciBjaGFyYWN0ZXIKLQkgKiBjaGFuZ2VkIGZyb20gdGhlIGdpdmVuIG9sZCBzZXBhcmF0b3IgdG8gdGhlIGdpdmVuIG5ldwotCSAqIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZVNlcGFyYXRvcihTdHJpbmcgcGF0aCwgY2hhciBvbGRTZXBhcmF0b3IsIGNoYXIgbmV3U2VwYXJhdG9yKXsKLQkJcmV0dXJuIHBhdGgucmVwbGFjZShvbGRTZXBhcmF0b3IsIG5ld1NlcGFyYXRvcik7Ci0JfQotCS8qKgotCSAqIENvcGllcyBhbGwgYnl0ZXMgaW4gdGhlIGdpdmVuIHNvdXJjZSBmaWxlIHRvCi0JICogdGhlIGdpdmVuIGRlc3RpbmF0aW9uIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZSB0aGUgZ2l2ZW4gc291cmNlIGZpbGUKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGdpdmVuIGRlc3RpbmF0aW9uIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmZXJEYXRhKEZpbGUgc291cmNlLCBGaWxlIGRlc3RpbmF0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlkZXN0aW5hdGlvbi5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpOwotCQkJb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0aW5hdGlvbik7Ci0JCQl0cmFuc2ZlckRhdGEoaXMsIG9zKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKG9zICE9IG51bGwpewotCQkJCXRyeSB7Ci0JCQkJCW9zLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihpcyAhPSBudWxsKXsKLQkJCQl0cnkgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIENvcGllcyBhbGwgYnl0ZXMgaW4gdGhlIGdpdmVuIHNvdXJjZSBzdHJlYW0gdG8KLQkgKiB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gc3RyZWFtLiBOZWl0aGVyIHN0cmVhbXMKLQkgKiBhcmUgY2xvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UgdGhlIGdpdmVuIHNvdXJjZSBzdHJlYW0KLQkgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGdpdmVuIGRlc3RpbmF0aW9uIHN0cmVhbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2ZlckRhdGEoSW5wdXRTdHJlYW0gc291cmNlLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBieXRlc1JlYWQgPSAwOwotCQl3aGlsZShieXRlc1JlYWQgIT0gLTEpewotCQkJYnl0ZXNSZWFkID0gc291cmNlLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKLQkJCWlmKGJ5dGVzUmVhZCAhPSAtMSl7Ci0JCQkJZGVzdGluYXRpb24ud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSB0byB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3JjIHRoZSBnaXZlbiBzb3VyY2UgZmlsZQotCSAqIEBwYXJhbSBkc3QgdGhlIGdpdmVuIGRlc3RpbmF0aW9uIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShGaWxlIHNyYywgRmlsZSBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKHNyYy5pc0RpcmVjdG9yeSgpKXsKLQkJCVN0cmluZ1tdIHNyY0NoaWxkcmVuID0gc3JjLmxpc3QoKTsKLQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzcmNDaGlsZHJlbi5sZW5ndGg7ICsraSl7Ci0JCQkJRmlsZSBzcmNDaGlsZD0gbmV3IEZpbGUoc3JjLCBzcmNDaGlsZHJlbltpXSk7Ci0JCQkJRmlsZSBkc3RDaGlsZD0gbmV3IEZpbGUoZHN0LCBzcmNDaGlsZHJlbltpXSk7Ci0JCQkJY29weShzcmNDaGlsZCwgZHN0Q2hpbGQpOwotCQkJfQotCQl9IGVsc2UKLQkJCXRyYW5zZmVyRGF0YShzcmMsIGRzdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldEZpbGVJblBsdWdpbihQbHVnaW4gcGx1Z2luLCBJUGF0aCBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTD0gcGx1Z2luLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBhdGgudG9TdHJpbmcoKSk7Ci0JCQlVUkwgbG9jYWxVUkw9IFBsYXRmb3JtLmFzTG9jYWxVUkwoaW5zdGFsbFVSTCk7Ci0JCQlyZXR1cm4gbmV3IEZpbGUobG9jYWxVUkwuZ2V0RmlsZSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciByZWFkKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJlYWQobmV3IEZpbGVSZWFkZXIoZmlsZU5hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciByZWFkKFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBzPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRyeSB7Ci0JCQljaGFyW10gYnVmZmVyPSBuZXcgY2hhcls4MTk2XTsKLQkJCWludCBjaGFycz0gcmVhZGVyLnJlYWQoYnVmZmVyKTsKLQkJCXdoaWxlIChjaGFycyAhPSAtMSkgewotCQkJCXMuYXBwZW5kKGJ1ZmZlciwgMCwgY2hhcnMpOwotCQkJCWNoYXJzPSByZWFkZXIucmVhZChidWZmZXIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmdCdWZmZXIgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJV3JpdGVyIHdyaXRlcj0gbmV3IEZpbGVXcml0ZXIoZmlsZU5hbWUpOwotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKGNvbnRlbnQudG9TdHJpbmcoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL0ZpbGVVdGlsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9oYXJuZXNzL3V0aWwvRmlsZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5ZDEwZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9oYXJuZXNzL3V0aWwvRmlsZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5GaWxlVXRpbDwvY29kZT4gY29udGFpbnMgbWV0aG9kcyB0byBjcmVhdGUgYW5kCi0gKiBkZWxldGUgZmlsZXMgYW5kIHByb2plY3RzLgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWwgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9qZWN0IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IHdzLmdldFJvb3QoKTsKLSAgICAgICAgSVByb2plY3QgcHJvaiA9IHJvb3QuZ2V0UHJvamVjdChuYW1lKTsKLSAgICAgICAgaWYgKCFwcm9qLmV4aXN0cygpKQotICAgICAgICAgICAgcHJvai5jcmVhdGUobnVsbCk7Ci0gICAgICAgIGlmICghcHJvai5pc09wZW4oKSkKLSAgICAgICAgICAgIHByb2oub3BlbihudWxsKTsKLSAgICAgICAgcmV0dXJuIHByb2o7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyBhIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2ogdGhlIHByb2plY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlUHJvamVjdChJUHJvamVjdCBwcm9qKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHByb2ouZGVsZXRlKHRydWUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZmlsZSBpbiBhIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5ldyBmaWxlIG5hbWUKLSAgICAgKiBAcGFyYW0gcHJvaiB0aGUgZXhpc3RpbmcgcHJvamVjdAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBjcmVhdGVGaWxlKFN0cmluZyBuYW1lLCBJUHJvamVjdCBwcm9qKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJRmlsZSBmaWxlID0gcHJvai5nZXRGaWxlKG5hbWUpOwotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSAiICI7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHIuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2hhcm5lc3MvdXRpbC9JbWFnZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9oYXJuZXNzL3V0aWwvSW1hZ2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJkNTk1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2hhcm5lc3MvdXRpbC9JbWFnZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbWFnZVRlc3RzIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgSW1hZ2VUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKEltYWdlIGkxLCBJbWFnZSBpMikgewotICAgICAgICBJbWFnZURhdGEgZGF0YTEgPSBpMS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgSW1hZ2VEYXRhIGRhdGEyID0gaTIuZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZGF0YTEuZGF0YSwgZGF0YTIuZGF0YSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKEltYWdlIGkxLCBJbWFnZSBpMikgewotICAgICAgICBJbWFnZURhdGEgZGF0YTEgPSBpMS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgSW1hZ2VEYXRhIGRhdGEyID0gaTIuZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheXMuZXF1YWxzKGRhdGExLmRhdGEsIGRhdGEyLmRhdGEpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9oYXJuZXNzL3V0aWwvUGxhdGZvcm1VdGlsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9oYXJuZXNzL3V0aWwvUGxhdGZvcm1VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ODZmNTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL1BsYXRmb3JtVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogVGhlIFBsYXRmb3JtIFV0aWwgY2xhc3MgaXMgdXNlZCB0byB0ZXN0IGZvciB3aGljaCBwbGF0Zm9ybSB3ZSBhcmUgaW4KLSAqLwotcHVibGljIGNsYXNzIFBsYXRmb3JtVXRpbCB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHdlIGFyZSBydW5uaW5nIG9uIHRoZSBNYWMgcGxhdGZvcm0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHdlIGFyZSBydW5uaWcgb24gdGhlIE1hYyBwbGF0Zm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25NYWMoKSB7Ci0gICAgICAgIFN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotICAgICAgICByZXR1cm4gcGxhdGZvcm0uZXF1YWxzKCJjYXJib24iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9oYXJuZXNzL3V0aWwvVUlUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaGFybmVzcy91dGlsL1VJVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyZjNmOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9oYXJuZXNzL3V0aWwvVUlUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotCi0vKioKLSAqIDxjb2RlPlVJVGVzdENhc2U8L2NvZGU+IGlzIGEgdXNlZnVsIHN1cGVyIGNsYXNzIGZvciBtb3N0Ci0gKiBVSSB0ZXN0cyBjYXNlcy4gIEl0IGNvbnRhaW5zIG1ldGhvZHMgdG8gY3JlYXRlIG5ldyB3aW5kb3dzIAotICogYW5kIHBhZ2VzLiAgSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIHRlc3QgCi0gKiB3aW5kb3dzIHdoZW4gdGhlIHRlYXJEb3duIG1ldGhvZCBpcyBjYWxsZWQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVSVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2JlbmNoIHBhZ2UgaW5wdXQgdG8gdXNlIGZvciBuZXdseSBjcmVhdGVkIHdpbmRvd3MuCi0JICogIAotCSAqIEByZXR1cm4gdGhlIHBhZ2UgaW5wdXQgdG8gdXNlIGZvciBuZXdseSBjcmVhdGVkIHdpbmRvd3MKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHN0YXRpYyBJQWRhcHRhYmxlIGdldFBhZ2VJbnB1dCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JfQotCQotCWNsYXNzIFRlc3RXaW5kb3dMaXN0ZW5lciBpbXBsZW1lbnRzIElXaW5kb3dMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2luZG93RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICAgICAgaWYgKGVuYWJsZWQpCi0gICAgICAgICAgICAgICAgdGVzdFdpbmRvd3MucmVtb3ZlKHdpbmRvdyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dPcGVuZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgIGlmIChlbmFibGVkKQotICAgICAgICAgICAgICAgIHRlc3RXaW5kb3dzLmFkZCh3aW5kb3cpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2ggZldvcmtiZW5jaDsKLQotICAgIHByaXZhdGUgTGlzdCB0ZXN0V2luZG93czsKLQotICAgIHByaXZhdGUgVGVzdFdpbmRvd0xpc3RlbmVyIHdpbmRvd0xpc3RlbmVyOwotCi0gICAgcHVibGljIFVJVGVzdENhc2UoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICAgICAgLy8JCUVycm9yRGlhbG9nLk5PX1VJID0gdHJ1ZTsKLSAgICAgICAgZldvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIHRlc3RXaW5kb3dzID0gbmV3IEFycmF5TGlzdCgzKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBGYWlscyB0aGUgdGVzdCBkdWUgdG8gdGhlIGdpdmVuIHRocm93YWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmFpbChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUpIHsKLQkJLy8gSWYgdGhlIGV4Y2VwdGlvbiBpcyBhIENvcmVFeGNlcHRpb24gd2l0aCBhIG11bHRpc3RhdHVzCi0JCS8vIHRoZW4gcHJpbnQgb3V0IHRoZSBtdWx0aXN0YXR1cyBzbyB3ZSBjYW4gc2VlIGFsbCB0aGUgaW5mby4KLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgZSkuZ2V0U3RhdHVzKCk7Ci0JCQl3cml0ZShzdGF0dXMsIDApOwotCQl9IGVsc2UKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCWZhaWwobWVzc2FnZSArICI6ICIgKyBlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluZGVudChPdXRwdXRTdHJlYW0gb3V0cHV0LCBpbnQgaW5kZW50KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0JCQl0cnkgewotCQkJCW91dHB1dC53cml0ZSgiXHQiLmdldEJ5dGVzKCkpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGUoSVN0YXR1cyBzdGF0dXMsIGludCBpbmRlbnQpIHsKLQkJUHJpbnRTdHJlYW0gb3V0cHV0ID0gU3lzdGVtLm91dDsKLQkJaW5kZW50KG91dHB1dCwgaW5kZW50KTsKLQkJb3V0cHV0LnByaW50bG4oIlNldmVyaXR5OiAiICsgc3RhdHVzLmdldFNldmVyaXR5KCkpOwotCi0JCWluZGVudChvdXRwdXQsIGluZGVudCk7Ci0JCW91dHB1dC5wcmludGxuKCJQbHVnaW4gSUQ6ICIgKyBzdGF0dXMuZ2V0UGx1Z2luKCkpOwotCi0JCWluZGVudChvdXRwdXQsIGluZGVudCk7Ci0JCW91dHB1dC5wcmludGxuKCJDb2RlOiAiICsgc3RhdHVzLmdldENvZGUoKSk7Ci0KLQkJaW5kZW50KG91dHB1dCwgaW5kZW50KTsKLQkJb3V0cHV0LnByaW50bG4oIk1lc3NhZ2U6ICIgKyBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQotCQlpZiAoc3RhdHVzLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCWluZGVudChvdXRwdXQsIGluZGVudCk7Ci0JCQlvdXRwdXQucHJpbnQoIkV4Y2VwdGlvbjogIik7Ci0JCQlzdGF0dXMuZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKG91dHB1dCk7Ci0JCX0KLQotCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJCXdyaXRlKGNoaWxkcmVuW2ldLCBpbmRlbnQgKyAxKTsKLQkJfQotCX0KLQotCS8qKgotICAgICAqIEFkZHMgYSB3aW5kb3cgbGlzdGVuZXIgdG8gdGhlIHdvcmtiZW5jaCB0byBrZWVwIHRyYWNrIG9mCi0gICAgICogb3BlbmVkIHRlc3Qgd2luZG93cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkV2luZG93TGlzdGVuZXIoKSB7Ci0gICAgICAgIHdpbmRvd0xpc3RlbmVyID0gbmV3IFRlc3RXaW5kb3dMaXN0ZW5lcigpOwotICAgICAgICBmV29ya2JlbmNoLmFkZFdpbmRvd0xpc3RlbmVyKHdpbmRvd0xpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBhZGRlZCBieSA8Y29kZT5hZGRXaW5kb3dMaXN0ZW5lcjwvY29kZT4uIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZW1vdmVXaW5kb3dMaXN0ZW5lcigpIHsKLSAgICAgICAgaWYgKHdpbmRvd0xpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZXb3JrYmVuY2gucmVtb3ZlV2luZG93TGlzdGVuZXIod2luZG93TGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3V0cHV0cyBhIHRyYWNlIG1lc3NhZ2UgdG8gdGhlIHRyYWNlIG91dHB1dCBkZXZpY2UsIGlmIGVuYWJsZWQuCi0gICAgICogQnkgZGVmYXVsdCwgdHJhY2UgbWVzc2FnZXMgYXJlIHNlbnQgdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1zZyB0aGUgdHJhY2UgbWVzc2FnZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRyYWNlKFN0cmluZyBtc2cpIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHNldFVwLiBTdWJjbGFzc2VzIGFyZSBwcmV2ZW50ZWQgCi0gICAgICogZnJvbSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHRvIG1haW50YWluIGxvZ2dpbmcgY29uc2lzdGVuY3kuCi0gICAgICogZG9TZXRVcCgpIHNob3VsZCBiZSBvdmVycmlkZW4gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlzdXBlci5zZXRVcCgpOwotICAgIAl0cmFjZSgiLS0tLS0gIiArIHRoaXMuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0cmFjZSh0aGlzLmdldE5hbWUoKSArICI6IHNldFVwLi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkV2luZG93TGlzdGVuZXIoKTsKLSAgICAgICAgZG9TZXRVcCgpOwotICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBkbyBub3RoaW5nLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0ZWFyRG93bi4gIFN1YmNsYXNzZXMgYXJlIHByZXZlbnRlZCAKLSAgICAgKiBmcm9tIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgdG8gbWFpbnRhaW4gbG9nZ2luZyBjb25zaXN0ZW5jeS4KLSAgICAgKiBkb1RlYXJEb3duKCkgc2hvdWxkIGJlIG92ZXJyaWRlbiBpbnN0ZWFkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIHRyYWNlKHRoaXMuZ2V0TmFtZSgpICsgIjogdGVhckRvd24uLi5cbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJlbW92ZVdpbmRvd0xpc3RlbmVyKCk7Ci0gICAgICAgIGRvVGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjbG9zZXMgYWxsIHRlc3Qgd2luZG93cywgcHJvY2Vzc2luZyBldmVudHMgYm90aCBiZWZvcmUKLSAgICAgKiBhbmQgYWZ0ZXIgZG9pbmcgc28uCi0gICAgICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICBjbG9zZUFsbFRlc3RXaW5kb3dzKCk7Ci0gICAgICAgIHByb2Nlc3NFdmVudHMoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcHJvY2Vzc0V2ZW50cygpIHsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0gICAgICAgIGlmIChkaXNwbGF5ICE9IG51bGwpCi0gICAgICAgICAgICB3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLSAgICAgICAgICAgICAgICA7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIE9wZW4gYSB0ZXN0IHdpbmRvdyB3aXRoIHRoZSBlbXB0eSBwZXJzcGVjdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtiZW5jaFdpbmRvdyBvcGVuVGVzdFdpbmRvdygpIHsKLSAgICAgICAgcmV0dXJuIG9wZW5UZXN0V2luZG93KEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW4gYSB0ZXN0IHdpbmRvdyB3aXRoIHRoZSBwcm92aWRlZCBwZXJzcGVjdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtiZW5jaFdpbmRvdyBvcGVuVGVzdFdpbmRvdyhTdHJpbmcgcGVyc3BlY3RpdmVJZCkgewotCQl0cnkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBmV29ya2JlbmNoLm9wZW5Xb3JrYmVuY2hXaW5kb3coCi0JCQkJCXBlcnNwZWN0aXZlSWQsIGdldFBhZ2VJbnB1dCgpKTsKLQkJCXdhaXRPblNoZWxsKHdpbmRvdy5nZXRTaGVsbCgpKTsKLQkJCXJldHVybiB3aW5kb3c7Ci0JCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotICAgIC8qKgotCSAqIFRyeSBhbmQgcHJvY2VzcyBldmVudHMgdW50aWwgdGhlIG5ldyBzaGVsbCBpcyB0aGUgYWN0aXZlIHNoZWxsLiBUaGlzIG1heQotCSAqIG5ldmVyIGhhcHBlbiwgc28gdGltZSBvdXQgYWZ0ZXIgYSBzdWl0YWJsZSBwZXJpb2QuCi0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogICAgICAgICAgICB0aGUgc2hlbGwgdG8gd2FpdCBvbgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdE9uU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQotCQlwcm9jZXNzRXZlbnRzKCk7Ci0vLwkJbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyA1MDAwOwotLy8KLS8vCQl3aGlsZSAoc2hlbGwuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkgIT0gc2hlbGwKLS8vCQkJCSYmIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgZW5kVGltZSkgewotLy8JCQlwcm9jZXNzRXZlbnRzKCk7Ci0vLwkJfQotCX0KLQotCS8qKgotCSAqIENsb3NlIGFsbCB0ZXN0IHdpbmRvd3MuCi0JICovCi0gICAgcHVibGljIHZvaWQgY2xvc2VBbGxUZXN0V2luZG93cygpIHsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QodGVzdFdpbmRvd3MpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW4gPSAoSVdvcmtiZW5jaFdpbmRvdykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB3aW4uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICB0ZXN0V2luZG93cy5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW4gYSB0ZXN0IHBhZ2Ugd2l0aCB0aGUgZW1wdHkgcGVyc3BlY3RpdmUgaW4gYSB3aW5kb3cuCi0gICAgICovCi0gICAgcHVibGljIElXb3JrYmVuY2hQYWdlIG9wZW5UZXN0UGFnZShJV29ya2JlbmNoV2luZG93IHdpbikgewotICAgICAgICBJV29ya2JlbmNoUGFnZVtdIHBhZ2VzID0gb3BlblRlc3RQYWdlKHdpbiwgMSk7Ci0gICAgICAgIGlmIChwYWdlcyAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhZ2VzWzBdOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVuICJuIiB0ZXN0IHBhZ2VzIHdpdGggdGhlIGVtcHR5IHBlcnNwZWN0aXZlIGluIGEgd2luZG93LgotICAgICAqLwotICAgIHB1YmxpYyBJV29ya2JlbmNoUGFnZVtdIG9wZW5UZXN0UGFnZShJV29ya2JlbmNoV2luZG93IHdpbiwgaW50IHBhZ2VUb3RhbCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IG5ldyBJV29ya2JlbmNoUGFnZVtwYWdlVG90YWxdOwotICAgICAgICAgICAgSUFkYXB0YWJsZSBpbnB1dCA9IGdldFBhZ2VJbnB1dCgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VUb3RhbDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcGFnZXNbaV0gPSB3aW4ub3BlblBhZ2UoRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCwgaW5wdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHBhZ2VzOwotICAgICAgICB9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSBhbGwgcGFnZXMgd2l0aGluIGEgd2luZG93LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlQWxsUGFnZXMoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IHdpbmRvdy5nZXRQYWdlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcGFnZXNbaV0uY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciB0aGUgd2luZG93IGxpc3RlbmVyIHdpbGwgbWFuYWdlIG9wZW5pbmcgYW5kIGNsb3Npbmcgb2YgY3JlYXRlZCB3aW5kb3dzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG1hbmFnZVdpbmRvd3MoYm9vbGVhbiBtYW5hZ2UpIHsKLSAgICAgICAgd2luZG93TGlzdGVuZXIuc2V0RW5hYmxlZChtYW5hZ2UpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3b3JrYmVuY2guCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgd29ya2JlbmNoCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLSAgICAgICAgcmV0dXJuIGZXb3JrYmVuY2g7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9BY2Nlc3NpYmlsaXR5VGVzdFBhc3MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQWNjZXNzaWJpbGl0eVRlc3RQYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjgzNzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9BY2Nlc3NpYmlsaXR5VGVzdFBhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlUZXN0UGFzcyBpbXBsZW1lbnRzIElEaWFsb2dUZXN0UGFzcyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIRUNLTElTVF9TSVpFID0gNTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgSURpYWxvZ1Rlc3RQYXNzI3RpdGxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRpdGxlKCkgewotICAgICAgICByZXR1cm4gIlRlc3QgUGFzczogQWNjZXNzaWJpbGl0eSI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJRGlhbG9nVGVzdFBhc3MjZGVzY3JpcHRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiVmVyaWZ5IHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSBkaWFsb2dzLiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJRGlhbG9nVGVzdFBhc3MjbGFiZWwoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiAiJkFjY2Vzc2liaWxpdHkiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSURpYWxvZ1Rlc3RQYXNzI2NoZWNrTGlzdFRleHRzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGNoZWNrTGlzdFRleHRzKCkgewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoQ0hFQ0tMSVNUX1NJWkUpOwotICAgICAgICBsaXN0LmFkZCgiJjEpIGFsbCB3aWRnZXRzIGFyZSBhY2Nlc3NpYmxlIGJ5IHRhYmJpbmcuIik7Ci0gICAgICAgIGxpc3QuYWRkKCImMikgZm9yd2FyZHMgYW5kIGJhY2t3YXJkcyB0YWJiaW5nIGlzIGluIGEgbG9naWNhbCBvcmRlciIpOwotICAgICAgICBsaXN0Ci0gICAgICAgICAgICAgICAgLmFkZCgiJjMpIGFsbCB0aGUgd2lkZ2V0cyB3aXRoIGxhYmVscyBoYXZlIGFuIGFwcHJvcHJpYXRlIG1uZW1vbmljLiIpOwotICAgICAgICBsaXN0LmFkZCgiJjQpIHRoZXJlIGFyZSBubyBkdXBsaWNhdGUgbW5lbW9uaWNzLiIpOwotICAgICAgICBsaXN0LmFkZCgiJjUpIHNlbGVjdGFibGUgd2lkZ2V0cyBjYW4gYmUgc2VsZWN0ZWQgdXNpbmcgdGhlIHNwYWNlYmFyLiIpOwotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElEaWFsb2dUZXN0UGFzcyNmYWlsdXJlVGV4dHMoKQotICAgICAqIFNpemUgb2YgdGhlIHJldHVybiBhcnJheSBtdXN0IGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIGNoZWNrTGlzdFRleHRzJwotICAgICAqIEFycmF5TGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZmFpbHVyZVRleHRzKCkgewotICAgICAgICBTdHJpbmdbXSBmYWlsdXJlVGV4dCA9IG5ldyBTdHJpbmdbQ0hFQ0tMSVNUX1NJWkVdOwotICAgICAgICBmYWlsdXJlVGV4dFswXSA9ICJTb21lIHdpZGdldHMgYXJlbid0IGFjY2Vzc2libGUgYnkgdGFiYmluZy4iOwotICAgICAgICBmYWlsdXJlVGV4dFsxXSA9ICJUYWJiaW5nIG9yZGVyIGlzIGlsbG9naWNhbC4iOwotICAgICAgICBmYWlsdXJlVGV4dFsyXSA9ICJNaXNzaW5nIG9yIGluYXBwcm9wcmlhdGUgbW5lbW9uaWNzLiI7Ci0gICAgICAgIGZhaWx1cmVUZXh0WzNdID0gIkR1cGxpY2F0ZSBtbmVtb25pY3MuIjsKLSAgICAgICAgZmFpbHVyZVRleHRbNF0gPSAiU29tZSB3aWRnZXRzIGNhbm5vdCBiZSBzZWxlY3RlZCB1c2luZyB0aGUgc3BhY2ViYXIuIjsKLSAgICAgICAgcmV0dXJuIGZhaWx1cmVUZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSURpYWxvZ1Rlc3RQYXNzI3F1ZXJ5VGV4dCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBxdWVyeVRleHQoKSB7Ci0gICAgICAgIHJldHVybiAiSXMgdGhlIGFjY2Vzc2liaWxpdHkgb2YgdGhlIGRpYWxvZyBhY2NlcHRhYmxlPyI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJRGlhbG9nVGVzdFBhc3MjZ2V0SUQoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SUQoKSB7Ci0gICAgICAgIHJldHVybiBWZXJpZnlEaWFsb2cuVEVTVF9BQ0NFU1M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9GYWlsdXJlRGlhbG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0ZhaWx1cmVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwYmNiZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0ZhaWx1cmVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoKLSAqIEEgZGlhbG9nIGZvciBjb2xsZWN0aW5nIG5vdGVzIGZyb20gdGhlIHRlc3RlciByZWdhcmRpbmcKLSAqIHRoZSBmYWlsdXJlIG9mIGEgdGVzdC4KLSAqLwotcHVibGljIGNsYXNzIEZhaWx1cmVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotICAgIHByaXZhdGUgVGV4dCBfdGV4dDsKLQotICAgIHByaXZhdGUgU3RyaW5nIF9sb2c7Ci0KLSAgICBwcml2YXRlIGludCBTSVpJTkdfVEVYVF9XSURUSCA9IDQwMDsKLQotICAgIHByaXZhdGUgaW50IFNJWklOR19URVhUX0hFSUdIVCA9IDIwMDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBGYWlsdXJlRGlhbG9nCi0gICAgICovCi0gICAgcHVibGljIEZhaWx1cmVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLSAgICAgICAgbmV3U2hlbGwuc2V0VGV4dCgiRGlhbG9nIFRlc3QgRmFpbGVkIik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsICImT0siLCB0cnVlKTsKLSAgICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0gICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gcGFnZSBncm91cAotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgICAgICBjb21wb3NpdGUuc2V0U2l6ZShjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIiZFbnRlciBhIG5vdGUgcmVnYXJkaW5nIHRoZSBmYWlsdXJlOiIpOwotCi0gICAgICAgIF90ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMCi0gICAgICAgICAgICAgICAgfCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICBfdGV4dC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldCgKLSAgICAgICAgICAgICAgICBKRmFjZVJlc291cmNlcy5URVhUX0ZPTlQpKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX1dJRFRIOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSBTSVpJTkdfVEVYVF9IRUlHSFQ7Ci0gICAgICAgIF90ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0gICAgICAgIF9sb2cgPSBfdGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIHRleHQgY29udGFpbmVkIGluIHRoZSBpbnB1dCBhcmVhIG9mCi0gICAgICogdGhlIGRpYWxvZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgaWYgKF9sb2cgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICJFbXB0eSBlbnRyeS4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIF9sb2c7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNldHMgdGhlIHRleHQgb2YgdGhlIGlucHV0IGFyZWEuICBUaGlzIHNob3VsZCBvbmx5IGJlCi0gICAgICogY2FsbGVkIHRvIHNldCB0aGUgaW5pdGlhbCB0ZXh0IHNvIG9ubHkgY2FsbCBiZWZvcmUgaW52b2tpbmcKLSAgICAgKiBvcGVuKCkuCi0gICAgICovCi0gICAgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIF90ZXh0LnNldFRleHQodGV4dCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY2xhc3Mgd2hpY2gKLSAgICAgKiB0aGUgdGV4dCBjb250YWluZWQgaW4gdGhlIGlucHV0IGFyZWEgb2YgdGhlIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0VGV4dCgpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Gb2N1c1Rlc3RQYXNzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0ZvY3VzVGVzdFBhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzNGI5NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0ZvY3VzVGVzdFBhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoKLSAqIFRoaXMgdGVzdCBwYXNzIHZlcmlmaWVzIHRoZSBpbml0aWFsIGZvY3VzIG9mIGEgZGlhbG9nCi0gKiB3aGVuIGl0IGlzIGdpdmVuIGZvY3VzLgotICovCi1wdWJsaWMgY2xhc3MgRm9jdXNUZXN0UGFzcyBpbXBsZW1lbnRzIElEaWFsb2dUZXN0UGFzcyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIRUNLTElTVF9TSVpFID0gMTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgSURpYWxvZ1Rlc3RQYXNzI3RpdGxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRpdGxlKCkgewotICAgICAgICByZXR1cm4gIlRlc3QgUGFzczogSW5pdGlhbCBGb2N1cyI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJRGlhbG9nVGVzdFBhc3MjZGVzY3JpcHRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiVmVyaWZ5IHRoZSBpbml0aWFsIGZvY3VzIG9mIHRoZSBkaWFsb2dzLiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJRGlhbG9nVGVzdFBhc3MjbGFiZWwoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiAiJkluaXRpYWwgRm9jdXMiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSURpYWxvZ1Rlc3RQYXNzI2NoZWNrTGlzdFRleHRzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGNoZWNrTGlzdFRleHRzKCkgewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoQ0hFQ0tMSVNUX1NJWkUpOwotICAgICAgICBsaXN0LmFkZCgiJjEpIHRoZSBpbml0aWFsIGZvY3VzIGlzIGFwcHJvcHJpYXRlLiIpOwotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElEaWFsb2dUZXN0UGFzcyNmYWlsdXJlVGV4dHMoKQotICAgICAqIFNpemUgb2YgdGhlIHJldHVybiBhcnJheSBtdXN0IGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIGNoZWNrTGlzdFRleHRzJwotICAgICAqIEFycmF5TGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZmFpbHVyZVRleHRzKCkgewotICAgICAgICBTdHJpbmdbXSBmYWlsdXJlVGV4dCA9IG5ldyBTdHJpbmdbQ0hFQ0tMSVNUX1NJWkVdOwotICAgICAgICBmYWlsdXJlVGV4dFswXSA9ICJUaGUgaW5pdGlhbCBmb2N1cyBpcyBpbmFwcHJvcHJpYXRlLiI7Ci0gICAgICAgIHJldHVybiBmYWlsdXJlVGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElEaWFsb2dUZXN0UGFzcyNxdWVyeVRleHQoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgcXVlcnlUZXh0KCkgewotICAgICAgICByZXR1cm4gIklzIHRoZSBpbml0aWFsIGZvY3VzIG9mIHRoZSBkaWFsb2cgY29ycmVjdD8iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSURpYWxvZ1Rlc3RQYXNzI2dldElEKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldElEKCkgewotICAgICAgICByZXR1cm4gVmVyaWZ5RGlhbG9nLlRFU1RfRk9DVVM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9JRGlhbG9nVGVzdFBhc3MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSURpYWxvZ1Rlc3RQYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NzIwYjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9JRGlhbG9nVGVzdFBhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoKLSAqIEludGVyZmFjZSB0byBkZXNjcmliZSBhIHZpc3VhbCB0ZXN0IHBhc3MgZm9yIGEgZGlhbG9nIHRlc3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWxvZ1Rlc3RQYXNzIHsKLSAgICAvKgotICAgICAqIEByZXR1cm4gU3RyaW5nIFRoZSB0aXRsZSBvZiB0aGUgdGVzdCBwYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdGl0bGUoKTsKLQotICAgIC8qCi0gICAgICogQHJldHVybiBTdHJpbmcgVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0IHBhc3MuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpOwotCi0gICAgLyoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBUaGUgbGFiZWwgb2YgdGhlIHRlc3QgcGFzcyB0byBiZSB1c2VkCi0gICAgICogaW4gYSBzZWxlY3Rpb24gbGlzdC4gIFRoZSByZXR1cm4gaW5jbHVkZXMgYW4gJyYnCi0gICAgICogaWYgYSBtbmVtb25pYyBpcyBkZXNpcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgbGFiZWwoKTsKLQotICAgIC8qCi0gICAgICogQHJldHVybiBBcnJheUxpc3QgQSBsaXN0IG9mIGl0ZW1zIHRvIGFwcGVhciBpbiBhIGNoZWNrbGlzdC4KLSAgICAgKiBUaGUgaXRlbXMgaW4gdGhlIGxpc3QgbXVzdCBiZSBTdHJpbmdzIGFuZCBzaG91bGQgaW5jbHVkZSBhbgotICAgICAqICcmJyBpZiBhIG1uZW1vbmljIGlzIGRlc2lyZWQuCi0gICAgICovCi0gICAgcHVibGljIEFycmF5TGlzdCBjaGVja0xpc3RUZXh0cygpOwotCi0gICAgLyoKLSAgICAgKiBAcmV0dXJuIFN0cmluZ1tdIEFzc29jaWF0ZWQgZmFpbHVyZSBtZXNzYWdlcyB0aGF0IGNvcnJlc3BvbmQKLSAgICAgKiB0byB0aGUgY2hlY2tsaXN0IGl0ZW1zLiAgVGhlIHNpemUgb2YgdGhpcyBhcnJheSBzaG91bGQgYmUgdGhlCi0gICAgICogc2FtZSBzaXplIGFzIHRoZSBjaGVja2xpc3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGZhaWx1cmVUZXh0cygpOwotCi0gICAgLyoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBUaGUgdGVzdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0ZXN0IHBhc3MgdG8KLSAgICAgKiB3aGljaCB0aGUgdGVzdGVyIHdpbGwgcmVzcG9uZCB3aXRoIGEgJ3llcycgb3IgJ25vJy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHF1ZXJ5VGV4dCgpOwotCi0gICAgLyoKLSAgICAgKiBAcmV0dXJuIGludCBBIHVuaXF1ZSBudW1iZXIgdGhhdCBpZGVudGlmaWVzIHRoZSB0ZXN0IHBhc3MuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJRCgpOwotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1NpemluZ1Rlc3RQYXNzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1NpemluZ1Rlc3RQYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMjM1ZWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9TaXppbmdUZXN0UGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKgotICogVGhpcyB0ZXN0IHBhc3MgdmVyaWZpZXMgdmlzdWFsbHkgdGhlIHNpemluZyBvZiB0aGUgZGlhbG9nIGFuZCBpdHMKLSAqIHdpZGdldHMuCi0gKi8KLWNsYXNzIFNpemluZ1Rlc3RQYXNzIGltcGxlbWVudHMgSURpYWxvZ1Rlc3RQYXNzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tMSVNUX1NJWkUgPSA1OwotCi0gICAgLyoqCi0gICAgICogQHNlZSBJRGlhbG9nVGVzdFBhc3MjdGl0bGUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiAiVGVzdCBQYXNzOiBTaXppbmcgYW5kIERpc3BsYXkiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSURpYWxvZ1Rlc3RQYXNzI2Rlc2NyaXB0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gIlZlcmlmeSB0aGUgc2l6aW5nIGFuZCBkaXNwbGF5IG9mIHRoZSBkaWFsb2dzIGFuZCB3aWRnZXRzLiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJRGlhbG9nVGVzdFBhc3MjbGFiZWwoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiAiJlNpemluZyBhbmQgRGlzcGxheSI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJRGlhbG9nVGVzdFBhc3MjY2hlY2tMaXN0VGV4dHMoKQotICAgICAqLwotICAgIHB1YmxpYyBBcnJheUxpc3QgY2hlY2tMaXN0VGV4dHMoKSB7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChDSEVDS0xJU1RfU0laRSk7Ci0gICAgICAgIGxpc3QuYWRkKCImMSkgdGhlIGNvcnJlY3QgZGlhbG9nIGRpc3BsYXlzLiIpOwotICAgICAgICBsaXN0Ci0gICAgICAgICAgICAgICAgLmFkZCgiJjIpIHRoZSBkaWFsb2cgaXMgYW4gYXBwcm9wcmlhdGUgc2l6ZSBmb3IgdGhlIHJlcXVpcmVkIHJlc29sdXRpb24gKDEwMjR4NzY4KS4iKTsKLSAgICAgICAgbGlzdC5hZGQoIiYzKSB0aGUgdGV4dHMgYXJlIGNvcnJlY3QgYW5kIG5vdCBjdXQgb2ZmLiIpOwotICAgICAgICBsaXN0LmFkZCgiJjQpIGFsbCBzdHJpbmdzIGhhdmUgYmVlbiBleHRlcm5hbGl6ZWQgcHJvcGVybHkuIik7Ci0gICAgICAgIGxpc3QuYWRkKCImNSkgYWxsIHRoZSB3aWRnZXRzIGFyZSB2aWV3YWJsZSBhbmQgbm90IGN1dCBvZmYuIik7Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSURpYWxvZ1Rlc3RQYXNzI2ZhaWx1cmVUZXh0cygpCi0gICAgICogU2l6ZSBvZiB0aGUgcmV0dXJuIGFycmF5IG11c3QgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgY2hlY2tMaXN0VGV4dHMnCi0gICAgICogQXJyYXlMaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBmYWlsdXJlVGV4dHMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGZhaWx1cmVUZXh0ID0gbmV3IFN0cmluZ1tDSEVDS0xJU1RfU0laRV07Ci0gICAgICAgIGZhaWx1cmVUZXh0WzBdID0gIlRoZSB3cm9uZyBkaWFsb2cgZGlzcGxheWVkLiI7Ci0gICAgICAgIGZhaWx1cmVUZXh0WzFdID0gIlRoZSBkaWFsb2cgaXMgdG9vIGxhcmdlIGZvciB0aGUgcmVxdWlyZWQgcmVzb2x1dGlvbi4iOwotICAgICAgICBmYWlsdXJlVGV4dFsyXSA9ICJUZXh0IGxhYmVscyBhcmUgd3Jvbmcgb3IgY3V0IG9mZi4iOwotICAgICAgICBmYWlsdXJlVGV4dFszXSA9ICJTb21lIHN0cmluZ3MgaGF2ZSBub3QgYmVlbiBleHRlcm5hbGl6ZWQgcHJvcGVybHkuIjsKLSAgICAgICAgZmFpbHVyZVRleHRbNF0gPSAiU29tZSB3aWRnZXRzIGFyZSBjdXQgb2ZmLiI7Ci0gICAgICAgIHJldHVybiBmYWlsdXJlVGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElEaWFsb2dUZXN0UGFzcyNxdWVyeVRleHQoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgcXVlcnlUZXh0KCkgewotICAgICAgICByZXR1cm4gIklzIHRoZSBzaXppbmcgYW5kIGRpc3BsYXkgb2YgdGhlIGRpYWxvZyBjb3JyZWN0PyI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJRGlhbG9nVGVzdFBhc3MjZ2V0SUQoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SUQoKSB7Ci0gICAgICAgIHJldHVybiBWZXJpZnlEaWFsb2cuVEVTVF9TSVpJTkc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9WZXJpZnlEaWFsb2cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3Mvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvVmVyaWZ5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjFjZDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9WZXJpZnlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKgotICogVGhpcyBkaWFsb2cgaXMgaW50ZW5kZWQgdG8gdmVyaWZ5IGEgZGlhbG9ncyBpbiBhIHRlc3RpbmcKLSAqIGVudmlyb25tZW50LiAgVGhlIHRlc3RlciBjYW4gdGVzdCBmb3Igc2l6aW5nLCBpbml0aWFsIGZvY3VzLAotICogb3IgYWNjZXNzaWJpbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFZlcmlmeURpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZyB7Ci0gICAgcHJpdmF0ZSBpbnQgU0laSU5HX1dJRFRIID0gNDAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IFRFU1RfVFlQRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFU1RfU0laSU5HID0gMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFU1RfRk9DVVMgPSAxOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9BQ0NFU1MgPSAyOwotCi0gICAgcHJpdmF0ZSBJRGlhbG9nVGVzdFBhc3MgX2RpYWxvZ1Rlc3RzW10gPSBuZXcgSURpYWxvZ1Rlc3RQYXNzWzNdOwotCi0gICAgcHJpdmF0ZSBEaWFsb2cgX3Rlc3REaWFsb2c7IC8vdGhlIGRpYWxvZyB0byB0ZXN0Ci0KLSAgICBwcml2YXRlIFBvaW50IF90ZXN0RGlhbG9nU2l6ZTsKLQotICAgIHByaXZhdGUgTGFiZWwgX3F1ZXJ5TGFiZWw7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBfeWVzQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gX25vQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gX2NoZWNrTGlzdFtdOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2ZhaWx1cmVUZXh0OwotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHZlcmlmaWNhdGlvbiBkaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIFZlcmlmeURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgaWYgKCEoVEVTVF9UWVBFIDw9IDIpICYmICEoVEVTVF9UWVBFID49IDApKSB7Ci0gICAgICAgICAgICBURVNUX1RZUEUgPSBURVNUX1NJWklORzsKLSAgICAgICAgfQotICAgICAgICBfZmFpbHVyZVRleHQgPSAiIjsKLSAgICAgICAgX2RpYWxvZ1Rlc3RzWzBdID0gbmV3IFNpemluZ1Rlc3RQYXNzKCk7Ci0gICAgICAgIF9kaWFsb2dUZXN0c1sxXSA9IG5ldyBGb2N1c1Rlc3RQYXNzKCk7Ci0gICAgICAgIF9kaWFsb2dUZXN0c1syXSA9IG5ldyBBY2Nlc3NpYmlsaXR5VGVzdFBhc3MoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpbmRvdy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0gICAgICAgIG5ld1NoZWxsLnNldFRleHQoIkRpYWxvZyBWZXJpZmljYXRpb24iKTsKLSAgICAgICAgc2V0U2hlbGxTdHlsZShTV1QuTk9ORSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIF95ZXNCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCwKLSAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgdHJ1ZSk7Ci0gICAgICAgIF9ub0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuTk9fSUQsCi0gICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0gICAgICAgIGlmIChJRGlhbG9nQ29uc3RhbnRzLllFU19JRCA9PSBidXR0b25JZCkgewotICAgICAgICAgICAgc2V0UmV0dXJuQ29kZShJRGlhbG9nQ29uc3RhbnRzLllFU19JRCk7Ci0gICAgICAgICAgICBpZiAoX3Rlc3REaWFsb2cuZ2V0U2hlbGwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgX3Rlc3REaWFsb2cuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoSURpYWxvZ0NvbnN0YW50cy5OT19JRCA9PSBidXR0b25JZCkgewotICAgICAgICAgICAgaGFuZGxlRmFpbHVyZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIHRvcCBsZXZlbCBjb21wb3NpdGUKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotICAgICAgICAvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudENvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBjb21wb3NpdGUuc2V0U2l6ZShTSVpJTkdfV0lEVEgsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLSAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICBjcmVhdGVUZXN0U2VsZWN0aW9uR3JvdXAoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlQ2hlY2tMaXN0R3JvdXAoY29tcG9zaXRlKTsKLQotICAgICAgICBfcXVlcnlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgX3F1ZXJ5TGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgaW5pdGlhbGl6ZVRlc3QoKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEdyb3VwIGZvciBzZWxlY3RpbmcgdHlwZSBvZiB0ZXN0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U2VsZWN0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5TSEFET1dfTk9ORSk7Ci0gICAgICAgIGdyb3VwLnNldFRleHQoIlRlc3Rpbmc6Iik7Ci0gICAgICAgIGdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2RpYWxvZ1Rlc3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBCdXR0b24gcmFkaW8gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICAgICAgcmFkaW8uc2V0VGV4dChfZGlhbG9nVGVzdHNbaV0ubGFiZWwoKSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdGVzdElEID0gX2RpYWxvZ1Rlc3RzW2ldLmdldElEKCk7Ci0gICAgICAgICAgICByYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRFU1RfVFlQRSA9IHRlc3RJRDsKLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZVRlc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgX3llc0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaWYgKFRFU1RfVFlQRSA9PSBfZGlhbG9nVGVzdHNbaV0uZ2V0SUQoKSkgewotICAgICAgICAgICAgICAgIHJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIGNoZWNrbGlzdCB3aXRoIGVtcHR5IGNoZWNrcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ2hlY2tMaXN0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5TSEFET1dfTk9ORSk7Ci0gICAgICAgIGdyb3VwLnNldFRleHQoIlZlcmlmeSB0aGF0OiIpOwotICAgICAgICBncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgICBpbnQgY2hlY2tMaXN0U2l6ZSA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2RpYWxvZ1Rlc3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IF9kaWFsb2dUZXN0c1tpXS5jaGVja0xpc3RUZXh0cygpLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChzaXplID4gY2hlY2tMaXN0U2l6ZSkgewotICAgICAgICAgICAgICAgIGNoZWNrTGlzdFNpemUgPSBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIF9jaGVja0xpc3QgPSBuZXcgQnV0dG9uW2NoZWNrTGlzdFNpemVdOwotICAgICAgICBTZWxlY3Rpb25BZGFwdGVyIHNlbGVjdGlvbkFkYXB0ZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjaGVja1llc0VuYWJsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrTGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgX2NoZWNrTGlzdFtpXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgICAgICBfY2hlY2tMaXN0W2ldLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkFkYXB0ZXIpOwotICAgICAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgICAgICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgICAgIF9jaGVja0xpc3RbaV0uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogRGlzYWJsZXMgdGhlIHllcyBidXR0b24gaWYgYW55IG9mIHRoZSBpdGVtcyBpbiB0aGUgY2hlY2tsaXN0Ci0gICAgICogYXJlIHVuY2hlY2tlZC4gIEVuYWJsZXMgdGhlIHllcyBidXR0b24gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja1llc0VuYWJsZSgpIHsKLSAgICAgICAgYm9vbGVhbiBlbmFibGUgPSB0cnVlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9jaGVja0xpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghX2NoZWNrTGlzdFtpXS5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgIGVuYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIF95ZXNCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIGNoZWNrbGlzdCwgYmFubmVyIHRleHRzLCBhbmQgcXVlcnkgbGFiZWwKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRlc3QoKSB7Ci0gICAgICAgIElEaWFsb2dUZXN0UGFzcyB0ZXN0ID0gX2RpYWxvZ1Rlc3RzW1RFU1RfVFlQRV07Ci0gICAgICAgIHNldFRpdGxlKHRlc3QudGl0bGUoKSk7Ci0gICAgICAgIHNldE1lc3NhZ2UodGVzdC5kZXNjcmlwdGlvbigpKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0ZXN0LmNoZWNrTGlzdFRleHRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfY2hlY2tMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgX2NoZWNrTGlzdFtpXS5zZXRUZXh0KGl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBfY2hlY2tMaXN0W2ldLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgX2NoZWNrTGlzdFtpXS51cGRhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgX2NoZWNrTGlzdFtpXS5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBfY2hlY2tMaXN0W2ldLnVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2NoZWNrTGlzdFtpXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgX3F1ZXJ5TGFiZWwuc2V0VGV4dCh0ZXN0LnF1ZXJ5VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhaWx1cmVUZXh0KCkgewotICAgICAgICByZXR1cm4gX2ZhaWx1cmVUZXh0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2FuJ3Qgb3BlbiB0aGUgdmVyaWZpY2F0aW9uIGRpYWxvZyB3aXRob3V0IGEgc3BlY2lmaWVkCi0gICAgICogdGVzdCBkaWFsb2csIHRoaXMgc2ltcGx5IHJldHVybnMgYSBmYWlsdXJlIGFuZCBwcmV2ZW50cwotICAgICAqIG9wZW5pbmcuICBTaG91bGQgdXNlIG9wZW4oRGlhbG9nKSBpbnN0ZWFkLgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgb3BlbigpIHsKLSAgICAgICAgX2ZhaWx1cmVUZXh0ID0gIlRlc3RpbmcgZGlhbG9nIGlzIHJlcXVpcmVkLCB1c2UgVmVyaWZ5RGlhbG9nOjpvcGVuKERpYWxvZykiOwotICAgICAgICByZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5OT19JRDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE9wZW5zIHRoZSB2ZXJpZmljYXRpb24gZGlhbG9nIHRvIHRlc3QgdGhlIHNwZWNpZmllZCBkaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIGludCBvcGVuKERpYWxvZyB0ZXN0RGlhbG9nKSB7Ci0gICAgICAgIGlmIChnZXRTaGVsbCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGNyZWF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGdldFNoZWxsKCkuc2V0TG9jYXRpb24oMCwgMCk7Ci0gICAgICAgIGdldFNoZWxsKCkuc2V0U2l6ZShNYXRoLm1heChTSVpJTkdfV0lEVEgsIGdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIGdldFNoZWxsKCkuZ2V0U2l6ZSgpLnkpOwotICAgICAgICBfdGVzdERpYWxvZyA9IHRlc3REaWFsb2c7Ci0gICAgICAgIGlmIChfdGVzdERpYWxvZy5nZXRTaGVsbCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIF90ZXN0RGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIF90ZXN0RGlhbG9nU2l6ZSA9IF90ZXN0RGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotICAgICAgICBvcGVuTmV3VGVzdERpYWxvZygpOwotCi0gICAgICAgIHJldHVybiBzdXBlci5vcGVuKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBPcGVucyB0aGUgZGlhbG9nIHRvIGJlIHZlcmlmaWVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvcGVuTmV3VGVzdERpYWxvZygpIHsKLSAgICAgICAgaWYgKF90ZXN0RGlhbG9nLmdldFNoZWxsKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgX3Rlc3REaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgX3Rlc3REaWFsb2cuc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotICAgICAgICBfdGVzdERpYWxvZy5nZXRTaGVsbCgpLnNldExvY2F0aW9uKGdldFNoZWxsKCkuZ2V0U2l6ZSgpLnggKyAxLCAwKTsKLSAgICAgICAgX3Rlc3REaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKF90ZXN0RGlhbG9nU2l6ZSk7Ci0gICAgICAgIF90ZXN0RGlhbG9nLmdldFNoZWxsKCkuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2hlbGxDbG9zZWQoU2hlbGxFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZS5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0gICAgICAgIF90ZXN0RGlhbG9nLm9wZW4oKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoZSB0ZXN0IGRpYWxvZyBmYWlsZWQsIG9wZW4gdGhlIGZhaWx1cmUgZGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVGYWlsdXJlKCkgewotICAgICAgICBJRGlhbG9nVGVzdFBhc3MgdGVzdCA9IF9kaWFsb2dUZXN0c1tURVNUX1RZUEVdOwotICAgICAgICBTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIGxhYmVsID0gdGVzdC5sYWJlbCgpOwotICAgICAgICBsYWJlbCA9IGxhYmVsLnN1YnN0cmluZygwLCBsYWJlbC5pbmRleE9mKCImIikpCi0gICAgICAgICAgICAgICAgKyBsYWJlbC5zdWJzdHJpbmcobGFiZWwuaW5kZXhPZigiJiIpICsgMSk7Ci0gICAgICAgIHRleHQuYXBwZW5kKGxhYmVsKS5hcHBlbmQoIiBmYWlsZWQgb24gdGhlICIpLmFwcGVuZChTV1QuZ2V0UGxhdGZvcm0oKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCIgcGxhdGZvcm06XG4iKTsKLQotICAgICAgICBTdHJpbmcgZmFpbHVyZU1lc3NhZ2VzW10gPSB0ZXN0LmZhaWx1cmVUZXh0cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3QuY2hlY2tMaXN0VGV4dHMoKS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKCFfY2hlY2tMaXN0W2ldLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoIi0gIikuYXBwZW5kKGZhaWx1cmVNZXNzYWdlc1tpXSkuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZhaWx1cmVEaWFsb2cgZGlhbG9nID0gbmV3IEZhaWx1cmVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgZGlhbG9nLnNldFRleHQodGV4dC50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotICAgICAgICAgICAgX2ZhaWx1cmVUZXh0ID0gZGlhbG9nLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBzZXRSZXR1cm5Db2RlKElEaWFsb2dDb25zdGFudHMuTk9fSUQpOwotICAgICAgICAgICAgaWYgKF90ZXN0RGlhbG9nLmdldFNoZWxsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIF90ZXN0RGlhbG9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbiBjYXNlIHRoZSBzaGVsbCB3YXMgY2xvc2VkIGJ5IGEgbWVhbnMgb3RoZXIgdGhhbgotICAgICAqIHRoZSBOTyBidXR0b24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2hlbGxDbG9zZUV2ZW50KCkgewotICAgICAgICBoYW5kbGVGYWlsdXJlKCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTdiZDM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxNTI5YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbiAKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3NzBlZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3I8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlMTEzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1R1ZSBPY3QgMTggMTU6MTY6MTcgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkuamF2YWRvYz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcmV0dXJuIFJldHVybnMgdGhlICR7YmFyZV9maWVsZF9uYW1lfS5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcGFyYW0gJHtwYXJhbX0gVGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXQuXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgSmF2YSBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWxlY29tbWVudCIgbmFtZVw9ImZpbGVjb21tZW50Ij4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogQ29weXJpZ2h0IChjKSAke3llYXJ9IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4gKlxuICogQ29udHJpYnV0b3JzXDpcbiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcbiAqIEBzaW5jZSAzLjJcbiAqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCI+LyoqXG4gKiBcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cblxuJHt0eXBlY29tbWVudH1cbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9ja1xuJHtleGNlcHRpb25fdmFyfS5wcmludFN0YWNrVHJhY2UoKTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmJvZHkiIG5hbWVcPSJjb25zdHJ1Y3RvcmJvZHkiPiR7Ym9keV9zdGF0ZW1lbnR9XG4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWI8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5Ij5yZXR1cm4gJHtmaWVsZH07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjbGFzc2JvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNsYXNzIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNsYXNzYm9keSIgbmFtZVw9ImNsYXNzYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImludGVyZmFjZWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGludGVyZmFjZSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5pbnRlcmZhY2Vib2R5IiBuYW1lXD0iaW50ZXJmYWNlYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImVudW1ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmVudW1ib2R5IiBuYW1lXD0iZW51bWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJhbm5vdGF0aW9uYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgYW5ub3RhdGlvbiB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5hbm5vdGF0aW9uYm9keSIgbmFtZVw9ImFubm90YXRpb25ib2R5Ij5cbjwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NWIyZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWJ1bmRsZW5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5OYXZpZ2F0b3JUZXN0c1BsdWdpbgotQnVuZGxlLVZlcnNpb246IDMuMi4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLAotIG9yZy5qdW5pdAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtQ2xhc3NQYXRoOiB1aW5hdnRlc3RzLmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczMjVlOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS51aW5hdnRlc3RzLmphciA9IHNyYy8KLSAgICAgICAgICAgICAgIAotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotb3V0cHV0LnVpbmF2dGVzdHMuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gdGVzdGRhdGEvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5odG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgICoueG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOWMzNGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJ1bmRsZW5hbWU9Q29tbW9uIE5hdmlnYXRvciBUZXN0cwotCi10ZXN0Lm5hdmlnYXRvci52aWV3TmFtZT1UZXN0IE5hdmlnYXRvciBWaWV3ZXIKLXRlc3QubmF2aWdhdG9yLmV4dGVuc2lvbj1UZXN0IE5hdmlnYXRvciBFeHRlbnNpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDFhMmQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGFsbG93TXVsdGlwbGU9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLlRlc3RWaWV3IgotICAgICAgICAgICAgbmFtZT0iJXRlc3QubmF2aWdhdG9yLnZpZXdOYW1lIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0gICAgICA8bmF2aWdhdG9yQ29udGVudCAKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IudGVzdENvbnRlbnQiIAotICAgICAgICAgICAgbmFtZT0iJXRlc3QubmF2aWdhdG9yLmV4dGVuc2lvbiIKLSAgICAgICAgICAgIGNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLmV4dGVuc2lvbi5UZXN0Q29udGVudFByb3ZpZGVyIgotICAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLmV4dGVuc2lvbi5UZXN0TGFiZWxQcm92aWRlciIKLSAgICAgICAgICAgIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIHByaW9yaXR5PSJub3JtYWwiPgotICAgICAgICAgPHRyaWdnZXJQb2ludHM+Ci0gICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLSAgICAgICAgIDwvdHJpZ2dlclBvaW50cz4KLSAgICAgIDwvbmF2aWdhdG9yQ29udGVudD4KLSAgICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5leHRlbnNpb24uVGVzdEFjdGlvblByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5leHRlbnNpb24uVGVzdEFjdGlvblByb3ZpZGVyIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9hY3Rpb25Qcm92aWRlcj4KLSAgICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5leHRlbnNpb24uRGVwZW5kZW50QWN0aW9uUHJvdmlkZXIiCi0gICAgICAgICAgICBkZXBlbmRzT249Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5leHRlbnNpb24uVGVzdEFjdGlvblByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5leHRlbnNpb24uRGVwZW5kZW50QWN0aW9uUHJvdmlkZXIiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2FjdGlvblByb3ZpZGVyPgotICAgICAgPGFjdGlvblByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLmV4dGVuc2lvbi5EZXBlbmRlbnRBY3Rpb25Qcm92aWRlciIKLSAgICAgICAgICAgIGRlcGVuZHNPbj0iSW52YWxpZCBJZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IuZXh0ZW5zaW9uLltJZiB0aGlzIG1lbnUgb3B0aW9uIHNob3dzLCBpdCBpcyBhbiBFUlJPUiBmcm9tIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvciFdIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9hY3Rpb25Qcm92aWRlcj4KLSAgICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5leHRlbnNpb24uRGVwZW5kZW50QWN0aW9uUHJvdmlkZXIiCi0gICAgICAgICAgICBkZXBlbmRzT249Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5leHRlbnNpb24uRGVwZW5kZW50QWN0aW9uUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLmV4dGVuc2lvbi5bU2Vjb25kIERlcGVuZGVudCBBY3Rpb25dIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9hY3Rpb25Qcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgotICAgICAgPHZpZXdlcgotICAgICAgICAgICAgdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5UZXN0VmlldyIKLSAgICAgICAgICAgIHBvcHVwTWVudUlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IuVGVzdFZpZXcjUG9wdXBNZW51Ii8+Ci0gICAgICA8dmlld2VyQ29udGVudEJpbmRpbmcgdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5UZXN0VmlldyI+Ci0gICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICA8Y29udGVudEV4dGVuc2lvbiBwYXR0ZXJuPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IudGVzdENvbnRlbnQiLz4KLSAgICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZUNvbnRlbnQiLz4KLSAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3ZpZXdlckNvbnRlbnRCaW5kaW5nPgotICAgICAgPHZpZXdlckFjdGlvbkJpbmRpbmcgdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5UZXN0VmlldyI+Ci0gICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICA8YWN0aW9uRXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5leHRlbnNpb24uKiIvPgotICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDwvdmlld2VyQWN0aW9uQmluZGluZz4KLSAgIDwvZXh0ZW5zaW9uPgotIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9EaXNwbGF5SGVscGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9EaXNwbGF5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTk1OWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvRGlzcGxheUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFJ1bnMgdGhlIGV2ZW50IGxvb3Agb2YgdGhlIGdpdmVuIGRpc3BsYXkgdW50aWwge0BsaW5rICNjb25kaXRpb24oKX0gYmVjb21lcwotICogPGNvZGU+dHJ1ZTwvY29kZT4gb3Igbm8gZXZlbnRzIGhhdmUgb2NjdXJyZWQgZm9yIHRoZSBzdXBwbGllZCB0aW1lb3V0LgotICogQmV0d2VlbiBydW5uaW5nIHRoZSBldmVudCBsb29wLCB7QGxpbmsgRGlzcGxheSNzbGVlcCgpfSBpcyBjYWxsZWQuCi0gKiA8cD4KLSAqIFRoZXJlIGlzIGEgY2F2ZWF0OiB0aGUgZ2l2ZW4gdGltZW91dHMgbXVzdCBiZSBsb25nIGVub3VnaCB0aGF0IHRoZSBjYWxsaW5nCi0gKiB0aHJlYWQgY2FuIGVudGVyIDxjb2RlPkRpc3BsYXkuc2xlZXAoKTwvY29kZT4gYmVmb3JlIHRoZSB0aW1lb3V0IGVsYXBzZXMsCi0gKiBvdGhlcndpc2UsIHRoZSB3YWl0ZXIgbWF5IHRpbWUgb3V0IGJlZm9yZSA8Y29kZT5zbGVlcDwvY29kZT4gaXMgY2FsbGVkIGFuZAotICogdGhlIHNsZWVwaW5nIHRocmVhZCBtYXkgbmV2ZXIgYmUgd2FrZW4gdXAuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpc3BsYXlIZWxwZXIgewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJvdGVjdGVkIERpc3BsYXlIZWxwZXIoKSB7Ci0JfQotCQotCS8qKgotCSAqIFVudGlsIHtAbGluayAjY29uZGl0aW9uKCl9IGJlY29tZXMgPGNvZGU+dHJ1ZTwvY29kZT4gb3IgdGhlIHRpbWVvdXQKLQkgKiBlbGFwc2VzLCBjYWxsIHtAbGluayBEaXNwbGF5I3NsZWVwKCl9IGFuZCBydW4gdGhlIGV2ZW50IGxvb3AuCi0JICogPHA+Ci0JICogSWYgPGNvZGU+dGltZW91dCAmbHQ7IDA8L2NvZGU+LCB0aGUgZXZlbnQgbG9vcCBpcyBuZXZlciBkcml2ZW4gYW5kCi0JICogb25seSB0aGUgY29uZGl0aW9uIGlzIGNoZWNrZWQuIElmIDxjb2RlPnRpbWVvdXQgPT0gMDwvY29kZT4sIHRoZSBldmVudAotCSAqIGxvb3AgaXMgZHJpdmVuIGF0IG1vc3Qgb25jZSwgYnV0IDxjb2RlPkRpc3BsYXkuc2xlZXAoKTwvY29kZT4gaXMgbmV2ZXIKLQkgKiBpbnZva2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheSB0aGUgZGlzcGxheSB0byBydW4gdGhlIGV2ZW50IGxvb3Agb2YKLQkgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb25kaXRpb24gYmVjYW1lIDxjb2RlPnRydWU8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB0aW1lb3V0IGVsYXBzZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiB3YWl0Rm9yQ29uZGl0aW9uKERpc3BsYXkgZGlzcGxheSwgbG9uZyB0aW1lb3V0KSB7Ci0JCS8vIGlmIHRoZSBjb25kaXRpb24gYWxyZWFkeSBob2xkcywgc3VjY2VlZAotCQlpZiAoY29uZGl0aW9uKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmICh0aW1lb3V0IDwgMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCS8vIGlmIGRyaXZpbmcgdGhlIGV2ZW50IGxvb3Agb25jZSBtYWtlcyB0aGUgY29uZGl0aW9uIGhvbGQsIHN1Y2NlZWQKLQkJLy8gd2l0aG91dCBzcGF3bmluZyBhIHRocmVhZC4KLQkJZHJpdmVFdmVudFF1ZXVlKGRpc3BsYXkpOwotCQlpZiAoY29uZGl0aW9uKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCS8vIGlmIHRoZSB0aW1lb3V0IGlzIG5lZ2F0aXZlIG9yIHplcm8sIGZhaWwKLQkJaWYgKHRpbWVvdXQgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyByZXBlYXRlZGx5IHNsZWVwIHVudGlsIGNvbmRpdGlvbiBiZWNvbWVzIHRydWUgb3IgdGltZW91dCBlbGFwc2VzCi0JCURpc3BsYXlXYWl0ZXIgd2FpdGVyPSBuZXcgRGlzcGxheVdhaXRlcihkaXNwbGF5KTsKLQkJRGlzcGxheVdhaXRlci5UaW1lb3V0IHRpbWVvdXRTdGF0ZT0gd2FpdGVyLnN0YXJ0KHRpbWVvdXQpOwotCQlib29sZWFuIGNvbmRpdGlvbjsKLQkJdHJ5IHsKLQkJCWRvIHsKLQkJCQlpZiAoZGlzcGxheS5zbGVlcCgpKQotCQkJCQlkcml2ZUV2ZW50UXVldWUoZGlzcGxheSk7Ci0JCQkJY29uZGl0aW9uPSBjb25kaXRpb24oKTsKLQkJCX0gd2hpbGUgKCFjb25kaXRpb24gJiYgIXRpbWVvdXRTdGF0ZS5oYXNUaW1lZE91dCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXdhaXRlci5zdG9wKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbmRpdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbCB7QGxpbmsgRGlzcGxheSNzbGVlcCgpfSBhbmQgcnVuIHRoZSBldmVudCBsb29wIHVudGlsIHRoZSBnaXZlbgotCSAqIHRpbWVvdXQgaGFzIGVsYXBzZWQuCi0JICogPHA+Ci0JICogSWYgPGNvZGU+dGltZW91dCAmbHQ7IDA8L2NvZGU+LCBub3RoaW5nIGhhcHBlbnMuIElmCi0JICogPGNvZGU+dGltZW91dCA9PSAwPC9jb2RlPiwgdGhlIGV2ZW50IGxvb3AgaXMgZHJpdmVuIGV4YWN0bHkgb25jZSwgYnV0Ci0JICogPGNvZGU+RGlzcGxheS5zbGVlcCgpPC9jb2RlPiBpcyBuZXZlciBpbnZva2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheSB0aGUgZGlzcGxheSB0byBydW4gdGhlIGV2ZW50IGxvb3Agb2YKLQkgKiBAcGFyYW0gbWlsbGlzIHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzbGVlcChEaXNwbGF5IGRpc3BsYXksIGxvbmcgbWlsbGlzKSB7Ci0JCW5ldyBEaXNwbGF5SGVscGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gY29uZGl0aW9uKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfS53YWl0Rm9yQ29uZGl0aW9uKGRpc3BsYXksIG1pbGxpcyk7Ci0JfQotCQotCS8qKgotCSAqIENhbGwge0BsaW5rIERpc3BsYXkjc2xlZXAoKX0gYW5kIHJ1biB0aGUgZXZlbnQgbG9vcCBvbmNlIGlmCi0JICogPGNvZGU+c2xlZXA8L2NvZGU+IHJldHVybnMgYmVmb3JlIHRoZSB0aW1lb3V0IGVsYXBzZXMuIFJldHVybnMKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgZXZlbnRzIHdlcmUgcHJvY2Vzc2VkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYKLQkgKiBub3QuCi0JICogPHA+Ci0JICogSWYgPGNvZGU+dGltZW91dCAmbHQ7IDA8L2NvZGU+LCBub3RoaW5nIGhhcHBlbnMgYW5kIGZhbHNlIGlzIHJldHVybmVkLgotCSAqIElmIDxjb2RlPnRpbWVvdXQgPT0gMDwvY29kZT4sIHRoZSBldmVudCBsb29wIGlzIGRyaXZlbiBleGFjdGx5IG9uY2UsCi0JICogYnV0IDxjb2RlPkRpc3BsYXkuc2xlZXAoKTwvY29kZT4gaXMgbmV2ZXIgaW52b2tlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkgdG8gcnVuIHRoZSBldmVudCBsb29wIG9mCi0JICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgZXZlbnQgd2FzIHRha2VuIG9mZiB0aGUgZXZlbnQgcXVldWUsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJ1bkV2ZW50TG9vcChEaXNwbGF5IGRpc3BsYXksIGxvbmcgdGltZW91dCkgewotCQlpZiAodGltZW91dCA8IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAodGltZW91dCA9PSAwKQotCQkJcmV0dXJuIGRyaXZlRXZlbnRRdWV1ZShkaXNwbGF5KTsKLQkJCi0JCS8vIHJlcGVhdGVkbHkgc2xlZXAgdW50aWwgY29uZGl0aW9uIGJlY29tZXMgdHJ1ZSBvciB0aW1lb3V0IGVsYXBzZXMKLQkJRGlzcGxheVdhaXRlciB3YWl0ZXI9IG5ldyBEaXNwbGF5V2FpdGVyKGRpc3BsYXkpOwotCQlEaXNwbGF5V2FpdGVyLlRpbWVvdXQgdGltZW91dFN0YXRlPSB3YWl0ZXIuc3RhcnQodGltZW91dCk7Ci0JCWJvb2xlYW4gZXZlbnRzPSBmYWxzZTsKLQkJaWYgKGRpc3BsYXkuc2xlZXAoKSAmJiAhdGltZW91dFN0YXRlLmhhc1RpbWVkT3V0KCkpIHsKLQkJCWRyaXZlRXZlbnRRdWV1ZShkaXNwbGF5KTsKLQkJCWV2ZW50cz0gdHJ1ZTsKLQkJfQotCQl3YWl0ZXIuc3RvcCgpOwotCQlyZXR1cm4gZXZlbnRzOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgY29uZGl0aW9uIHdoaWNoIGhhcyB0byBiZSBtZXQgaW4gb3JkZXIgZm9yCi0JICoge0BsaW5rICN3YWl0Rm9yQ29uZGl0aW9uKERpc3BsYXksIGludCl9IHRvIHJldHVybiBiZWZvcmUgdGhlIHRpbWVvdXQKLQkgKiBlbGFwc2VzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbmRpdGlvbiBpcyBtZXQsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgaWYgdGhlIGV2ZW50IGxvb3Agc2hvdWxkIGJlIGRyaXZlbiBzb21lIG1vcmUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJ1bnMgdGhlIGV2ZW50IGxvb3Agb24gdGhlIGdpdmVuIGRpc3BsYXkuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkKLQkgKiBAcmV0dXJuIGlmIDxjb2RlPmRpc3BsYXkucmVhZEFuZERpc3BhdGNoPC9jb2RlPiByZXR1cm5lZAotCSAqICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gYXQgbGVhc3Qgb25jZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZHJpdmVFdmVudFF1ZXVlKERpc3BsYXkgZGlzcGxheSkgewotCQlib29sZWFuIGV2ZW50cz0gZmFsc2U7Ci0JCXdoaWxlIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQlldmVudHM9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGV2ZW50czsKLQl9Ci0KLQkvKioKLQkgKiBVbnRpbCB7QGxpbmsgI2NvbmRpdGlvbigpfSBiZWNvbWVzIDxjb2RlPnRydWU8L2NvZGU+IG9yIHRoZSB0aW1lb3V0Ci0JICogZWxhcHNlcywgY2FsbCB7QGxpbmsgRGlzcGxheSNzbGVlcCgpfSBhbmQgcnVuIHRoZSBldmVudCBsb29wLgotCSAqIDxwPgotCSAqIElmIDxjb2RlPnRpbWVvdXQgJmx0OyAwPC9jb2RlPiwgdGhlIGV2ZW50IGxvb3AgaXMgbmV2ZXIgZHJpdmVuIGFuZAotCSAqIG9ubHkgdGhlIGNvbmRpdGlvbiBpcyBjaGVja2VkLiBJZiA8Y29kZT50aW1lb3V0ID09IDA8L2NvZGU+LCB0aGUgZXZlbnQKLQkgKiBsb29wIGlzIGRyaXZlbiBhdCBtb3N0IG9uY2UsIGJ1dCA8Y29kZT5EaXNwbGF5LnNsZWVwKCk8L2NvZGU+IGlzIG5ldmVyCi0JICogaW52b2tlZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGNvbmRpdGlvbiBnZXRzIHJlY2hlY2tlZCBldmVyeSA8Y29kZT5pbnRlcnZhbDwvY29kZT4gbWlsbGlzZWNvbmRzLCBldmVuCi0JICogaWYgbm8gZXZlbnRzIHdlcmUgcmVhZCBmcm9tIHRoZSBxdWV1ZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkgdG8gcnVuIHRoZSBldmVudCBsb29wIG9mCi0JICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzCi0JICogQHBhcmFtIGludGVydmFsIHRoZSBpbnRlcnZhbCB0byByZS1jaGVjayB0aGUgY29uZGl0aW9uIGluIG1pbGxpc2Vjb25kcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbmRpdGlvbiBiZWNhbWUgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHRpbWVvdXQgZWxhcHNlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIHdhaXRGb3JDb25kaXRpb24oRGlzcGxheSBkaXNwbGF5LCBsb25nIHRpbWVvdXQsIGxvbmcgaW50ZXJ2YWwpIHsKLQkJLy8gaWYgdGhlIGNvbmRpdGlvbiBhbHJlYWR5IGhvbGRzLCBzdWNjZWVkCi0JCWlmIChjb25kaXRpb24oKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYgKHRpbWVvdXQgPCAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJLy8gaWYgZHJpdmluZyB0aGUgZXZlbnQgbG9vcCBvbmNlIG1ha2VzIHRoZSBjb25kaXRpb24gaG9sZCwgc3VjY2VlZAotCQkvLyB3aXRob3V0IHNwYXduaW5nIGEgdGhyZWFkLgotCQlkcml2ZUV2ZW50UXVldWUoZGlzcGxheSk7Ci0JCWlmIChjb25kaXRpb24oKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJLy8gaWYgdGhlIHRpbWVvdXQgaXMgbmVnYXRpdmUgb3IgemVybywgZmFpbAotCQlpZiAodGltZW91dCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQotCQkvLyByZXBlYXRlZGx5IHNsZWVwIHVudGlsIGNvbmRpdGlvbiBiZWNvbWVzIHRydWUgb3IgdGltZW91dCBlbGFwc2VzCi0JCURpc3BsYXlXYWl0ZXIgd2FpdGVyPSBuZXcgRGlzcGxheVdhaXRlcihkaXNwbGF5LCB0cnVlKTsKLQkJbG9uZyBjdXJyZW50VGltZU1pbGxpcz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWxvbmcgZmluYWxUaW1lb3V0PSB0aW1lb3V0ICsgY3VycmVudFRpbWVNaWxsaXM7Ci0JCWlmIChmaW5hbFRpbWVvdXQgPCBjdXJyZW50VGltZU1pbGxpcykKLQkJCWZpbmFsVGltZW91dD0gTG9uZy5NQVhfVkFMVUU7Ci0JCWJvb2xlYW4gY29uZGl0aW9uOwotCQl0cnkgewotCQkJZG8gewotCQkJCXdhaXRlci5yZXN0YXJ0KGludGVydmFsKTsKLQkJCQlpZiAoZGlzcGxheS5zbGVlcCgpKQotCQkJCQlkcml2ZUV2ZW50UXVldWUoZGlzcGxheSk7Ci0JCQkJY29uZGl0aW9uPSBjb25kaXRpb24oKTsKLQkJCX0gd2hpbGUgKCFjb25kaXRpb24gJiYgZmluYWxUaW1lb3V0ID4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQl9IGZpbmFsbHkgewotCQkJd2FpdGVyLnN0b3AoKTsKLQkJfQotCQlyZXR1cm4gY29uZGl0aW9uOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL0Rpc3BsYXlXYWl0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL0Rpc3BsYXlXYWl0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxN2FkNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9EaXNwbGF5V2FpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEltcGxlbWVudHMgdGhlIHRocmVhZCB0aGF0IHdpbGwgd2FpdCBmb3IgdGhlIHRpbWVvdXQgYW5kIHdha2UgdXAgdGhlIGRpc3BsYXkKLSAqIHNvIGl0IGRvZXMgbm90IHdhaXQgZm9yZXZlci4gVGhlIHRocmVhZCBtYXkgYmUgcmVzdGFydGVkIGFmdGVyIGl0IHdhcyBzdG9wcGVkCi0gKiBvciB0aW1lZCBvdXQuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotZmluYWwgY2xhc3MgRGlzcGxheVdhaXRlciB7Ci0JLyoqCi0JICogVGltZW91dCBzdGF0ZSBvZiBhIGRpc3BsYXkgd2FpdGVyIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgY2xhc3MgVGltZW91dCB7Ci0JCWJvb2xlYW4gZlRpbWVvdXRTdGF0ZT0gZmFsc2U7Ci0JCS8qKgotCQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0aW1lb3V0IGhhcyBiZWVuIHJlYWNoZWQsCi0JCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QuCi0JCSAqIAotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0aW1lb3V0IGhhcyBiZWVuIHJlYWNoZWQsCi0JCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaGFzVGltZWRPdXQoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGZNdXRleCkgewotCQkJCXJldHVybiBmVGltZW91dFN0YXRlOwotCQkJfQotCQl9Ci0JCXZvaWQgc2V0VGltZWRPdXQoYm9vbGVhbiB0aW1lZE91dCkgewotCQkJZlRpbWVvdXRTdGF0ZT0gdGltZWRPdXQ7Ci0JCX0KLQkJVGltZW91dChib29sZWFuIGluaXRpYWxTdGF0ZSkgewotCQkJZlRpbWVvdXRTdGF0ZT0gaW5pdGlhbFN0YXRlOwotCQl9Ci0JfQotCQotCS8vIGNvbmZpZ3VyYXRpb24KLQlwcml2YXRlIGZpbmFsIERpc3BsYXkgZkRpc3BsYXk7Ci0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgZk11dGV4PSBuZXcgT2JqZWN0KCk7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZLZWVwUnVubmluZ09uVGltZW91dDsKLQkKLQkvKiBTdGF0ZSAtLSBwb3NzaWJsZSB0cmFuc2l0aW9uczoKLQkgKiAKLQkgKiBTVE9QUEVEICAgLT4gUlVOTklORwotCSAqIFJVTk5JTkcgICAtPiBTVE9QUEVECi0JICogUlVOTklORyAgIC0+IElETEUKLQkgKiBJRExFICAgICAgLT4gUlVOTklORwotCSAqIElETEUgICAgICAtPiBTVE9QUEVECi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTk5JTkc9IDEgPDwgMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RPUFBFRD0gMSA8PCAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRExFPSAxIDw8IDM7Ci0JCi0JLyoqIFRoZSBjdXJyZW50IHN0YXRlLiAqLwotCXByaXZhdGUgaW50IGZTdGF0ZTsKLQkvKiogVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIChzZWUgRGF0ZSkgdGhhdCB0aGUgdGltZW91dCB3aWxsIG9jY3VyLiAqLwotCXByaXZhdGUgbG9uZyBmTmV4dFRpbWVvdXQ7Ci0JLyoqIFRoZSB0aHJlYWQuICovCi0JcHJpdmF0ZSBUaHJlYWQgZkN1cnJlbnRUaHJlYWQ7Ci0JLyoqIFRoZSB0aW1lb3V0IHN0YXRlIG9mIHRoZSBjdXJyZW50IHRocmVhZC4gKi8KLQlwcml2YXRlIFRpbWVvdXQgZkN1cnJlbnRUaW1lb3V0U3RhdGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9uIHRoZSBnaXZlbiBkaXNwbGF5IGFuZCB0aW1lb3V0LgotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5IHRvIHJ1biB0aGUgZXZlbnQgbG9vcCBvZgotCSAqLwotCXB1YmxpYyBEaXNwbGF5V2FpdGVyKERpc3BsYXkgZGlzcGxheSkgewotCQl0aGlzKGRpc3BsYXksIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvbiB0aGUgZ2l2ZW4gZGlzcGxheSBhbmQgdGltZW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheSB0aGUgZGlzcGxheSB0byBydW4gdGhlIGV2ZW50IGxvb3Agb2YKLQkgKiBAcGFyYW0ga2VlcFJ1bm5pbmcgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRocmVhZCBzaG91bGQgYmUga2VwdAotCSAqICAgICAgICBydW5uaW5nIGFmdGVyIHRpbWluZyBvdXQKLQkgKi8KLQlwdWJsaWMgRGlzcGxheVdhaXRlcihEaXNwbGF5IGRpc3BsYXksIGJvb2xlYW4ga2VlcFJ1bm5pbmcpIHsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZGlzcGxheSk7Ci0JCWZEaXNwbGF5PSBkaXNwbGF5OwotCQlmU3RhdGU9IFNUT1BQRUQ7Ci0JCWZLZWVwUnVubmluZ09uVGltZW91dD0ga2VlcFJ1bm5pbmc7Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgdGltZW91dCB0aHJlYWQgaWYgaXQgaXMgbm90IGN1cnJlbnRseSBydW5uaW5nLiBOb3RoaW5nIGhhcHBlbnMKLQkgKiBpZiBhIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcuCi0JICogCi0JICogQHBhcmFtIGRlbGF5IHRoZSBkZWxheSBmcm9tIG5vdyBpbiBtaWxsaXNlY29uZHMKLQkgKiBAcmV0dXJuIHRoZSB0aW1lb3V0IHN0YXRlIHdoaWNoIGNhbiBiZSBxdWVyaWVkIGZvciBpdHMgdGltZWQgb3V0IHN0YXR1cwotCSAqLwotCXB1YmxpYyBUaW1lb3V0IHN0YXJ0KGxvbmcgZGVsYXkpIHsKLQkJQXNzZXJ0LmFzc2VydFRydWUoZGVsYXkgPiAwKTsKLQkJc3luY2hyb25pemVkIChmTXV0ZXgpIHsKLQkJCXN3aXRjaCAoZlN0YXRlKSB7Ci0JCQkJY2FzZSBTVE9QUEVEOgotCQkJCQlzdGFydFRocmVhZCgpOwotCQkJCQlzZXROZXh0VGltZW91dChkZWxheSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSURMRToKLQkJCQkJdW5ob2xkKCk7Ci0JCQkJCXNldE5leHRUaW1lb3V0KGRlbGF5KTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBmQ3VycmVudFRpbWVvdXRTdGF0ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5leHQgdGltZW91dCB0byA8ZW0+Y3VycmVudCB0aW1lPC9lbT4gcGx1cyA8Y29kZT5kZWxheTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGRlbGF5IHRoZSBkZWxheSB1bnRpbCB0aGUgbmV4dCB0aW1lb3V0IG9jY3VycyBpbiBtaWxsaXNlY29uZHMgZnJvbQotCSAqICAgICAgICBub3cKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TmV4dFRpbWVvdXQobG9uZyBkZWxheSkgewotCQlsb25nIGN1cnJlbnRUaW1lTWlsbGlzPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJbG9uZyBuZXh0PSBjdXJyZW50VGltZU1pbGxpcyArIGRlbGF5OwotCQlpZiAobmV4dCA+IGN1cnJlbnRUaW1lTWlsbGlzKQotCQkJZk5leHRUaW1lb3V0PSBuZXh0OwotCQllbHNlCi0JCQlmTmV4dFRpbWVvdXQ9IExvbmcuTUFYX1ZBTFVFOwotCX0KLQkKLQkvKioKLQkgKiBTdGFydHMgdGhlIHRocmVhZCBpZiBpdCBpcyBub3QgY3VycmVudGx5IHJ1bm5pbmc7IHJlc2V0cyB0aGUgdGltZW91dCBpZgotCSAqIGl0IGlzLgotCSAqIAotCSAqIEBwYXJhbSBkZWxheSB0aGUgZGVsYXkgZnJvbSBub3cgaW4gbWlsbGlzZWNvbmRzCi0JICogQHJldHVybiB0aGUgdGltZW91dCBzdGF0ZSB3aGljaCBjYW4gYmUgcXVlcmllZCBmb3IgaXRzIHRpbWVkIG91dCBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgVGltZW91dCByZXN0YXJ0KGxvbmcgZGVsYXkpIHsKLQkJQXNzZXJ0LmFzc2VydFRydWUoZGVsYXkgPiAwKTsKLQkJc3luY2hyb25pemVkIChmTXV0ZXgpIHsKLQkJCXN3aXRjaCAoZlN0YXRlKSB7Ci0JCQkJY2FzZSBTVE9QUEVEOgotCQkJCQlzdGFydFRocmVhZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElETEU6Ci0JCQkJCXVuaG9sZCgpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCXNldE5leHRUaW1lb3V0KGRlbGF5KTsKLQotCQkJcmV0dXJuIGZDdXJyZW50VGltZW91dFN0YXRlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgdGhlIHRocmVhZCBpZiBpdCBpcyBydW5uaW5nLiBJZiBub3QsIG5vdGhpbmcgaGFwcGVucy4gQW5vdGhlcgotCSAqIHRocmVhZCBtYXkgYmUgc3RhcnRlZCBieSBjYWxsaW5nIHtAbGluayAjc3RhcnQobG9uZyl9IG9yCi0JICoge0BsaW5rICNyZXN0YXJ0KGxvbmcpfS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlzeW5jaHJvbml6ZWQgKGZNdXRleCkgewotCQkJaWYgKHRyeVRyYW5zaXRpb24oUlVOTklORyB8IElETEUsIFNUT1BQRUQpKQotCQkJCWZNdXRleC5ub3RpZnlBbGwoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQdXRzIHRoZSByZWFwZXIgdGhyZWFkIG9uIGhvbGQgYnV0IGRvZXMgbm90IHN0b3AgaXQuIEl0IG1heSBiZSByZXN0YXJ0ZWQKLQkgKiBieSBjYWxsaW5nIHtAbGluayAjc3RhcnQobG9uZyl9IG9yIHtAbGluayAjcmVzdGFydChsb25nKX0uCi0JICovCi0JcHVibGljIHZvaWQgaG9sZCgpIHsKLQkJc3luY2hyb25pemVkIChmTXV0ZXgpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZG8gaWYgdGhlcmUgaXMgbm8gdGhyZWFkCi0JCQlpZiAodHJ5VHJhbnNpdGlvbihSVU5OSU5HLCBJRExFKSkKLQkJCQlmTXV0ZXgubm90aWZ5QWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2l0aW9uIHRvIDxjb2RlPlJVTk5JTkc8L2NvZGU+IGFuZCBjbGVhciB0aGUgdGltZWQgb3V0IGZsYWcuIEFzc3VtZQotCSAqIGN1cnJlbnQgc3RhdGUgaXMgPGNvZGU+SURMRTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVuaG9sZCgpIHsKLQkJY2hlY2tlZFRyYW5zaXRpb24oSURMRSwgUlVOTklORyk7Ci0JCWZDdXJyZW50VGltZW91dFN0YXRlPSBuZXcgVGltZW91dChmYWxzZSk7Ci0JCWZNdXRleC5ub3RpZnlBbGwoKTsKLQl9Ci0JCQotCS8qKgotCSAqIFN0YXJ0IHRoZSB0aHJlYWQuIEFzc3VtZSB0aGUgY3VycmVudCBzdGF0ZSBpcyA8Y29kZT5TVE9QUEVEPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RhcnRUaHJlYWQoKSB7Ci0JCWNoZWNrZWRUcmFuc2l0aW9uKFNUT1BQRUQsIFJVTk5JTkcpOwotCQlmQ3VycmVudFRpbWVvdXRTdGF0ZT0gbmV3IFRpbWVvdXQoZmFsc2UpOwotCQlmQ3VycmVudFRocmVhZD0gbmV3IFRocmVhZCgpIHsKLQkJCS8qKgotCQkJICogRXhjZXB0aW9uIHRocm93biB3aGVuIGEgdGhyZWFkIG5vdGljZXMgdGhhdCBpdCBoYXMgYmVlbiBzdG9wcGVkCi0JCQkgKiBhbmQgYSBuZXcgdGhyZWFkIGhhcyBiZWVuIHN0YXJ0ZWQuCi0JCQkgKi8KLQkJCWZpbmFsIGNsYXNzIFRocmVhZENoYW5nZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRD0gMUw7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcnVuMigpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlIGFuZCBlbmQgdGhlIHRocmVhZCAtIHdlIG5ldmVyIGludGVycnVwdCBvdXJzZWx2ZXMsCi0JCQkJCS8vIHNvIGl0IG11c3QgYmUgYW4gZXh0ZXJuYWwgZW50aXR5IHRoYXQgaW50ZXJydXB0ZWQgdXMKLQkJCQkJTG9nZ2VyLmdsb2JhbC5sb2coTGV2ZWwuRklORSwgIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoVGhyZWFkQ2hhbmdlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHRoZSB0aHJlYWQgd2FzIHN0b3BwZWQgYW5kIHJlc3RhcnRlZCBiZWZvcmUgd2UgZ290IG91dAotCQkJCQkvLyBvZiBhIHdhaXQgLSB3ZSdyZSBubyBsb25nZXIgdXNlZAotCQkJCQkvLyB3ZSBtaWdodCBoYXZlIGJlZW4gbm90aWZpZWQgaW5zdGVhZCBvZiB0aGUgY3VycmVudCB0aHJlYWQsCi0JCQkJCS8vIHNvIHdha2UgaXQgdXAKLQkJCQkJTG9nZ2VyLmdsb2JhbC5sb2coTGV2ZWwuRklORSwgIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN5bmNocm9uaXplZCAoZk11dGV4KSB7Ci0JCQkJCQlmTXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qKgotCQkJICogUnVucyB0aGUgdGhyZWFkLgotCQkJICogCi0JCQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCi0JCQkgKiBAdGhyb3dzIFRocmVhZENoYW5nZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCBjaGFuZ2VkCi0JCQkgKi8KLQkJCXByaXZhdGUgdm9pZCBydW4yKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaHJlYWRDaGFuZ2VkRXhjZXB0aW9uIHsKLQkJCQlzeW5jaHJvbml6ZWQgKGZNdXRleCkgewotCQkJCQljaGVja1RocmVhZCgpOwotCQkJCQl0cnlIb2xkKCk7IC8vIHdhaXQgLyBwb3RlbnRpYWwgc3RhdGUgY2hhbmdlCi0JCQkJCWFzc2VydFN0YXRlcyhTVE9QUEVEIHwgUlVOTklORyk7Ci0JCQkJCQotCQkJCQl3aGlsZSAoaXNTdGF0ZShSVU5OSU5HKSkgewotCQkJCQkJd2FpdEZvclRpbWVvdXQoKTsgLy8gd2FpdCAvIHBvdGVudGlhbCBzdGF0ZSBjaGFuZ2UKLQkJCQkJCQotCQkJCQkJaWYgKGlzU3RhdGUoUlVOTklORykpCi0JCQkJCQkJdGltZWRPdXQoKTsgLy8gc3RhdGUgY2hhbmdlCi0JCQkJCQlhc3NlcnRTdGF0ZXMoU1RPUFBFRCB8IElETEUpOwotCQkJCQkJCi0JCQkJCQl0cnlIb2xkKCk7IC8vIHdhaXQgLyBwb3RlbnRpYWwgc3RhdGUgY2hhbmdlCi0JCQkJCQlhc3NlcnRTdGF0ZXMoU1RPUFBFRCB8IFJVTk5JTkcpOwotCQkJCQl9Ci0JCQkJCWFzc2VydFN0YXRlcyhTVE9QUEVEKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQ2hlY2sgd2hldGhlciB0aGUgY3VycmVudCB0aHJlYWQgaXMgdGhpcyB0aHJlYWQsIHRocm93IGFuCi0JCQkgKiBleGNlcHRpb24gb3RoZXJ3aXNlLgotCQkJICogCi0JCQkgKiBAdGhyb3dzIFRocmVhZENoYW5nZWRFeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGNoYW5nZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSB2b2lkIGNoZWNrVGhyZWFkKCkgdGhyb3dzIFRocmVhZENoYW5nZWRFeGNlcHRpb24gewotCQkJCWlmIChmQ3VycmVudFRocmVhZCAhPSB0aGlzKQotCQkJCQl0aHJvdyBuZXcgVGhyZWFkQ2hhbmdlZEV4Y2VwdGlvbigpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIFdhaXRzIHVudGlsIHRoZSBuZXh0IHRpbWVvdXQgb2NjdXJzLgotCQkJICogCi0JCQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCi0JCQkgKiBAdGhyb3dzIFRocmVhZENoYW5nZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCBjaGFuZ2VkCi0JCQkgKi8KLQkJCXByaXZhdGUgdm9pZCB3YWl0Rm9yVGltZW91dCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGhyZWFkQ2hhbmdlZEV4Y2VwdGlvbiB7Ci0JCQkJbG9uZyBkZWx0YTsKLQkJCQl3aGlsZSAoaXNTdGF0ZShSVU5OSU5HKSAmJiAoZGVsdGEgPSBmTmV4dFRpbWVvdXQgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgPiAwKSB7Ci0JCQkJCWRlbHRhPSBNYXRoLm1heChkZWx0YSwgNTApOyAvLyB3YWl0IGF0IGxlYXN0IDUwbXMgaW4gb3JkZXIgdG8gYXZvaWQgdGltaW5nIG91dCBiZWZvcmUgdGhlIGRpc3BsYXkgaXMgZ29pbmcgdG8gc2xlZXAKLQkJCQkJTG9nZ2VyLmdsb2JhbC5maW5lc3QoInNsZWVwaW5nIGZvciAiICsgZGVsdGEgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWZNdXRleC53YWl0KGRlbHRhKTsKLQkJCQkJY2hlY2tUaHJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogU2V0cyB0aGUgdGltZWQgb3V0IGZsYWcgYW5kIHdha2VzIHVwIHRoZSBkaXNwbGF5LiBUcmFuc2l0aW9ucyB0bwotCQkJICogPGNvZGU+SURMRTwvY29kZT4gKGlmIGluIGtlZXAtcnVubmluZyBtb2RlKSBvcgotCQkJICogPGNvZGU+U1RPUFBFRDwvY29kZT4uCi0JCQkgKi8KLQkJCXByaXZhdGUgdm9pZCB0aW1lZE91dCgpIHsKLQkJCQlMb2dnZXIuZ2xvYmFsLmZpbmVyKCJ0aW1lZCBvdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZDdXJyZW50VGltZW91dFN0YXRlLnNldFRpbWVkT3V0KHRydWUpOwotCQkJCWZEaXNwbGF5Lndha2UoKTsgLy8gd2FrZSB1cCBjYWxsIQotCQkJCWlmIChmS2VlcFJ1bm5pbmdPblRpbWVvdXQpCi0JCQkJCWNoZWNrZWRUcmFuc2l0aW9uKFJVTk5JTkcsIElETEUpOwotCQkJCWVsc2UKLQkJCQkJY2hlY2tlZFRyYW5zaXRpb24oUlVOTklORywgU1RPUFBFRCk7Ci0JCQl9Ci0JCQkKLQkJCS8qKgotCQkJICogV2FpdHMgd2hpbGUgdGhlIHN0YXRlIGlzIDxjb2RlPklETEU8L2NvZGU+LCB0aGVuIHJldHVybnMuIFRoZQotCQkJICogc3RhdGUgbXVzdCBub3QgYmUgPGNvZGU+UlVOTklORzwvY29kZT4gd2hlbiBjYWxsaW5nIHRoaXMKLQkJCSAqIG1ldGhvZC4gVGhlIHN0YXRlIGlzIGVpdGhlciA8Y29kZT5TVE9QUEVEPC9jb2RlPiBvcgotCQkJICogPGNvZGU+UlVOTklORzwvY29kZT4gd2hlbiB0aGUgbWV0aG9kIHJldHVybnMuCi0JCQkgKiAKLQkJCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKLQkJCSAqIEB0aHJvd3MgVGhyZWFkQ2hhbmdlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIGhhcyBjaGFuZ2VkIHdoaWxlIG9uCi0JCQkgKiAgICAgICAgIGhvbGQKLQkJCSAqLwotCQkJcHJpdmF0ZSB2b2lkIHRyeUhvbGQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRocmVhZENoYW5nZWRFeGNlcHRpb24gewotCQkJCXdoaWxlIChpc1N0YXRlKElETEUpKSB7Ci0JCQkJCWZNdXRleC53YWl0KDApOwotCQkJCQljaGVja1RocmVhZCgpOwotCQkJCX0KLQkJCQlhc3NlcnRTdGF0ZXMoU1RPUFBFRCB8IFJVTk5JTkcpOwotCQkJfQotCQl9OwotCQkKLQkJZkN1cnJlbnRUaHJlYWQuc3RhcnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhbnNpdGlvbnMgdG8gPGNvZGU+bmV4dFN0YXRlPC9jb2RlPiBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBvbmUgb2YKLQkgKiA8Y29kZT5wb3NzaWJsZVN0YXRlczwvY29kZT4uIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlCi0JICogdHJhbnNpdGlvbiBoYXBwZW5lZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zc2libGVTdGF0ZXMgdGhlIHN0YXRlcyB3aGljaCB0cmlnZ2VyIGEgdHJhbnNpdGlvbgotCSAqIEBwYXJhbSBuZXh0U3RhdGUgdGhlIHN0YXRlIHRvIHRyYW5zaXRpb24gdG8KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0cmFuc2l0aW9uIGhhcHBlbmVkLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB0cnlUcmFuc2l0aW9uKGludCBwb3NzaWJsZVN0YXRlcywgaW50IG5leHRTdGF0ZSkgewotCQlpZiAoaXNTdGF0ZShwb3NzaWJsZVN0YXRlcykpIHsKLQkJCUxvZ2dlci5nbG9iYWwuZmluZXIobmFtZShmU3RhdGUpICsgIiA+ICIgKyBuYW1lKG5leHRTdGF0ZSkgKyAiICgiICsgbmFtZShwb3NzaWJsZVN0YXRlcykgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJZlN0YXRlPSBuZXh0U3RhdGU7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlMb2dnZXIuZ2xvYmFsLmZpbmVzdCgibm9UcmFuc2l0aW9uIiArIG5hbWUoZlN0YXRlKSArICIgIT4gIiArIG5hbWUobmV4dFN0YXRlKSArICIgKCIgKyBuYW1lKHBvc3NpYmxlU3RhdGVzKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhlIDxjb2RlPnBvc3NpYmxlU3RhdGVzPC9jb2RlPiBhbmQgdGhyb3dzIGFuIGFzc2VydGlvbiBpZiBpdCBpcwotCSAqIG5vdCBtZXQsIHRoZW4gdHJhbnNpdGlvbnMgdG8gPGNvZGU+bmV4dFN0YXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zc2libGVTdGF0ZXMgdGhlIGFsbG93ZWQgc3RhdGVzCi0JICogQHBhcmFtIG5leHRTdGF0ZSB0aGUgc3RhdGUgdG8gdHJhbnNpdGlvbiB0bwotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja2VkVHJhbnNpdGlvbihpbnQgcG9zc2libGVTdGF0ZXMsIGludCBuZXh0U3RhdGUpIHsKLQkJYXNzZXJ0U3RhdGVzKHBvc3NpYmxlU3RhdGVzKTsKLQkJTG9nZ2VyLmdsb2JhbC5maW5lcihuYW1lKGZTdGF0ZSkgKyAiID4gIiArIG5hbWUobmV4dFN0YXRlKSk7IC8vJE5PTi1OTFMtMSQKLQkJZlN0YXRlPSBuZXh0U3RhdGU7Ci0JfQotCQotCS8qKgotCSAqIEltcGxlbWVudHMgc3RhdGUgY29uc2lzdGVuY3kgY2hlY2tpbmcuCi0JICogCi0JICogQHBhcmFtIHN0YXRlcyB0aGUgYWxsb3dlZCBzdGF0ZXMKLQkgKiBAdGhyb3dzIGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvciBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBub3QKLQkgKiAgICAgICAgIGluIDxjb2RlPnN0YXRlczwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXNzZXJ0U3RhdGVzKGludCBzdGF0ZXMpIHsKLQkJQXNzZXJ0LmFzc2VydFRydWUoImlsbGVnYWwgc3RhdGUiLCBpc1N0YXRlKHN0YXRlcykpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQW5zd2VycyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBpbiB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5zdGF0ZXM8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZXMgdGhlIHBvc3NpYmxlIHN0YXRlcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgaW4gdGhlIGdpdmVuIHN0YXRlcywKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTdGF0ZShpbnQgc3RhdGVzKSB7Ci0JCXJldHVybiAoc3RhdGVzICYgZlN0YXRlKSA9PSBmU3RhdGU7Ci0JfQotCQotCS8qKgotCSAqIFByZXR0eSBwcmludCB0aGUgZ2l2ZW4gc3RhdGVzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZXMgdGhlIHN0YXRlcwotCSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YXRlcwotCSAqLwotCXByaXZhdGUgU3RyaW5nIG5hbWUoaW50IHN0YXRlcykgewotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gY29tbWE9IGZhbHNlOwotCQlpZiAoKHN0YXRlcyAmIFJVTk5JTkcpID09IFJVTk5JTkcpIHsKLQkJCWJ1Zi5hcHBlbmQoIlJVTk5JTkciKTsgLy8kTk9OLU5MUy0xJAotCQkJY29tbWE9IHRydWU7Ci0JCX0KLQkJaWYgKChzdGF0ZXMgJiBTVE9QUEVEKSA9PSBTVE9QUEVEKSB7Ci0JCQlpZiAoY29tbWEpCi0JCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlidWYuYXBwZW5kKCJTVE9QUEVEIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNvbW1hPSB0cnVlOwotCQl9Ci0JCWlmICgoc3RhdGVzICYgSURMRSkgPT0gSURMRSkgewotCQkJaWYgKGNvbW1hKQotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmLmFwcGVuZCgiSURMRSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL0VkaXRvclRlc3RIZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL0VkaXRvclRlc3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmYWZmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9FZGl0b3JUZXN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvcjsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JT3ZlcndyaXRlUXVlcnk7Ci0KLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JUZXN0SGVscGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbXBvcnRPdmVyd3JpdGVRdWVyeSBpbXBsZW1lbnRzIElPdmVyd3JpdGVRdWVyeSB7Ci0JCXB1YmxpYyBTdHJpbmcgcXVlcnlPdmVyd3JpdGUoU3RyaW5nIGZpbGUpIHsKLQkJCXJldHVybiBBTEw7Ci0JCX0JCi0JfQkgCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FRElUT1JfSUQ9ICJvcmcuZWNsaXBzZS51aS5EZWZhdWx0VGV4dEVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxBVElPTl9VTklUX0VESVRPUl9JRD0gIm9yZy5lY2xpcHNlLmpkdC51aS5Db21waWxhdGlvblVuaXRFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfUEVSU1BFQ1RJVkVfSUQ9ICJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfUEVSU1BFQ1RJVkVfSUQ9ICJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVBlcnNwZWN0aXZlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVExJTkVfVklFV19JRD0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLkNvbnRlbnRPdXRsaW5lIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfRVhQTE9SRVJfVklFV19JRD0gIm9yZy5lY2xpcHNlLmpkdC51aS5QYWNrYWdlRXhwbG9yZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFWSUdBVE9SX1ZJRVdfSUQ9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5SZXNvdXJjZU5hdmlnYXRvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRST19WSUVXX0lEPSAib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaW50cm92aWV3IjsgLy8kTk9OLU5MUy0xJAotICAKLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlOwotCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgKHNpdGU9IGVkaXRvci5nZXRTaXRlKCkpICE9IG51bGwgJiYgKHBhZ2U9IHNpdGUuZ2V0UGFnZSgpKSAhPSBudWxsKQotCQkJcGFnZS5jbG9zZUVkaXRvcihlZGl0b3IsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlQWxsRWRpdG9ycygpIHsKLQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3M9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgd2luZG93cy5sZW5ndGg7IGkrKykgewotCQkJSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcz0gd2luZG93c1tpXS5nZXRQYWdlcygpOwotCQkJZm9yIChpbnQgaj0gMDsgaiA8IHBhZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXM9IHBhZ2VzW2pdLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBrPSAwOyBrIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGsrKykKLQkJCQkJY2xvc2VFZGl0b3IoZWRpdG9yUmVmZXJlbmNlc1trXS5nZXRFZGl0b3IoZmFsc2UpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSdW5zIHRoZSBldmVudCBxdWV1ZSBvbiB0aGUgY3VycmVudCBkaXNwbGF5IHVudGlsIGl0IGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5FdmVudFF1ZXVlKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdz0gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkKLQkJCXJ1bkV2ZW50UXVldWUod2luZG93LmdldFNoZWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRXZlbnRRdWV1ZShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXJ1bkV2ZW50UXVldWUocGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5FdmVudFF1ZXVlKFNoZWxsIHNoZWxsKSB7Ci0JCXJ1bkV2ZW50UXVldWUoc2hlbGwuZ2V0RGlzcGxheSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkV2ZW50UXVldWUoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCXdoaWxlIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUnVucyB0aGUgZXZlbnQgcXVldWUgb24gdGhlIGN1cnJlbnQgZGlzcGxheSBhbmQgbGV0cyBpdCBzbGVlcCB1bnRpbCB0aGUKLQkgKiB0aW1lb3V0IGVsYXBzZXMuCi0JICogCi0JICogQHBhcmFtIG1pbGxpcyB0aGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRXZlbnRRdWV1ZShsb25nIG1pbGxpcykgewotCQlydW5FdmVudFF1ZXVlKGdldEFjdGl2ZURpc3BsYXkoKSwgbWlsbGlzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkV2ZW50UXVldWUoSVdvcmtiZW5jaFBhcnQgcGFydCwgbG9uZyBtaWxsaXMpIHsKLQkJcnVuRXZlbnRRdWV1ZShwYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpLCBtaWxsaXMpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRXZlbnRRdWV1ZShTaGVsbCBzaGVsbCwgbG9uZyBtaWxsaXMpIHsKLQkJcnVuRXZlbnRRdWV1ZShzaGVsbC5nZXREaXNwbGF5KCksIG1pbGxpcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5FdmVudFF1ZXVlKERpc3BsYXkgZGlzcGxheSwgbG9uZyBtaW5UaW1lKSB7Ci0JCWlmIChkaXNwbGF5ICE9IG51bGwpIHsKLQkJCURpc3BsYXlIZWxwZXIuc2xlZXAoZGlzcGxheSwgbWluVGltZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzbGVlcCgoaW50KSBtaW5UaW1lKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hXaW5kb3cgZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGZvcmNlRm9jdXMoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93W10gd2JXaW5kb3dzPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJCWlmICh3YldpbmRvd3MubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuOwotCQkJd2luZG93PSB3YldpbmRvd3NbMF07Ci0JCX0KLQkJU2hlbGwgc2hlbGw9IHdpbmRvdy5nZXRTaGVsbCgpOwotCQlpZiAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzaGVsbC5mb3JjZUFjdGl2ZSgpOwotCQkJc2hlbGwuZm9yY2VGb2N1cygpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c9IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlyZXR1cm4gd2luZG93ICE9IG51bGwgPyB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldEFjdGl2ZURpc3BsYXkoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpIDogbnVsbDsKLQl9IAotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBqb2luQmFja2dyb3VuZEFjdGl2aXRpZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEpvaW4gQnVpbGRpbmcKLQkJTG9nZ2VyLmdsb2JhbC5lbnRlcmluZygiRWRpdG9yVGVzdEhlbHBlciIsICJqb2luQmFja2dyb3VuZEFjdGl2aXRpZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUxvZ2dlci5nbG9iYWwuZmluZXIoImpvaW4gYnVpbGRlciIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gaW50ZXJydXB0ZWQ9IHRydWU7Ci0JCXdoaWxlIChpbnRlcnJ1cHRlZCkgewotCQkJdHJ5IHsKLQkJCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCQkJCWludGVycnVwdGVkPSBmYWxzZTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlpbnRlcnJ1cHRlZD0gdHJ1ZTsKLQkJCX0KLQkJfSAKLQkJLy8gSm9pbiBqb2JzCi0JCWpvaW5Kb2JzKDAsIDAsIDUwMCk7Ci0JCUxvZ2dlci5nbG9iYWwuZXhpdGluZygiRWRpdG9yVGVzdEhlbHBlciIsICJqb2luQmFja2dyb3VuZEFjdGl2aXRpZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqb2luSm9icyhsb25nIG1pblRpbWUsIGxvbmcgbWF4VGltZSwgbG9uZyBpbnRlcnZhbFRpbWUpIHsKLQkJTG9nZ2VyLmdsb2JhbC5lbnRlcmluZygiRWRpdG9yVGVzdEhlbHBlciIsICJqb2luSm9icyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcnVuRXZlbnRRdWV1ZShtaW5UaW1lKTsKLQkJCi0JCURpc3BsYXlIZWxwZXIgaGVscGVyPSBuZXcgRGlzcGxheUhlbHBlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNvbmRpdGlvbigpIHsKLQkJCQlyZXR1cm4gYWxsSm9ic1F1aWV0KCk7Ci0JCQl9Ci0JCX07Ci0JCWJvb2xlYW4gcXVpZXQ9IGhlbHBlci53YWl0Rm9yQ29uZGl0aW9uKGdldEFjdGl2ZURpc3BsYXkoKSwgbWF4VGltZSA+IDAgPyBtYXhUaW1lIDogTG9uZy5NQVhfVkFMVUUsIGludGVydmFsVGltZSk7Ci0JCUxvZ2dlci5nbG9iYWwuZXhpdGluZygiRWRpdG9yVGVzdEhlbHBlciIsICJqb2luSm9icyIsIG5ldyBCb29sZWFuKHF1aWV0KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gcXVpZXQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzbGVlcChpbnQgaW50ZXJ2YWxUaW1lKSB7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoaW50ZXJ2YWxUaW1lKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsSm9ic1F1aWV0KCkgewotCQlJSm9iTWFuYWdlciBqb2JNYW5hZ2VyPSBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCk7Ci0JCUpvYltdIGpvYnM9IGpvYk1hbmFnZXIuZmluZChudWxsKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCUpvYiBqb2I9IGpvYnNbaV07Ci0JCQlpbnQgc3RhdGU9IGpvYi5nZXRTdGF0ZSgpOwotCQkJaWYgKHN0YXRlID09IEpvYi5SVU5OSU5HIHx8IHN0YXRlID09IEpvYi5XQUlUSU5HKSB7Ci0JCQkJTG9nZ2VyLmdsb2JhbC5maW5lc3Qoam9iLnRvU3RyaW5nKCkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmlld1Nob3duKFN0cmluZyB2aWV3SWQpIHsKLQkJcmV0dXJuIGdldEFjdGl2ZVBhZ2UoKS5maW5kVmlld1JlZmVyZW5jZSh2aWV3SWQpICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93VmlldyhTdHJpbmcgdmlld0lkLCBib29sZWFuIHNob3cpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2U9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJSVZpZXdSZWZlcmVuY2Ugdmlldz0gYWN0aXZlUGFnZS5maW5kVmlld1JlZmVyZW5jZSh2aWV3SWQpOwotCQlib29sZWFuIHNob3duPSB2aWV3ICE9IG51bGw7Ci0JCWlmIChzaG93biAhPSBzaG93KQotCQkJaWYgKHNob3cpCi0JCQkJYWN0aXZlUGFnZS5zaG93Vmlldyh2aWV3SWQpOwotCQkJZWxzZQotCQkJCWFjdGl2ZVBhZ2UuaGlkZVZpZXcodmlldyk7Ci0JCXJldHVybiBzaG93bjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGJyaW5nVG9Ub3AoKSB7Ci0JCWdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkuZm9yY2VBY3RpdmUoKTsKLQl9IAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3dQZXJzcGVjdGl2ZShTdHJpbmcgcGVyc3BlY3RpdmUpIHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24gewotCQlTdHJpbmcgc2hvd25QZXJzcGVjdGl2ZT0gZ2V0QWN0aXZlUGFnZSgpLmdldFBlcnNwZWN0aXZlKCkuZ2V0SWQoKTsKLQkJaWYgKCFwZXJzcGVjdGl2ZS5lcXVhbHMoc2hvd25QZXJzcGVjdGl2ZSkpIHsKLQkJCUlXb3JrYmVuY2ggd29ya2JlbmNoPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3c9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCXdvcmtiZW5jaC5zaG93UGVyc3BlY3RpdmUocGVyc3BlY3RpdmUsIGFjdGl2ZVdpbmRvdyk7Ci0JCX0KLQkJcmV0dXJuIHNob3duUGVyc3BlY3RpdmU7Ci0JfQotCQotIAotCQotCXB1YmxpYyBzdGF0aWMgSUZpbGVbXSBmaW5kRmlsZXMoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3QgZmlsZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmluZEZpbGVzKHJlc291cmNlLCBmaWxlcyk7Ci0JCXJldHVybiAoSUZpbGVbXSkgZmlsZXMudG9BcnJheShuZXcgSUZpbGVbZmlsZXMuc2l6ZSgpXSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZmluZEZpbGVzKElSZXNvdXJjZSByZXNvdXJjZSwgTGlzdCBmaWxlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJZmlsZXMuYWRkKHJlc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQlJUmVzb3VyY2VbXSByZXNvdXJjZXM9ICgoSUNvbnRhaW5lcikgcmVzb3VyY2UpLm1lbWJlcnMoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspCi0JCQkJZmluZEZpbGVzKHJlc291cmNlc1tpXSwgZmlsZXMpOwotCQl9Ci0JfQotCSAKLSAgCi0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXZhRmlsZXMoRmlsZSBkaXIsIExpc3QgY29sbGVjdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVtdIGZpbGVzPSBkaXIubGlzdEZpbGVzKCk7Ci0JCUxpc3Qgc3ViRGlycz0gbmV3IEFycmF5TGlzdCgyKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChmaWxlc1tpXSk7Ci0JCQl9IGVsc2UgaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlzdWJEaXJzLmFkZChmaWxlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJSXRlcmF0b3IgaXRlcj0gc3ViRGlycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUZpbGUgc3ViRGlyPSAoRmlsZSlpdGVyLm5leHQoKTsKLQkJCWFkZEphdmFGaWxlcyhzdWJEaXIsIGNvbGxlY3Rpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL0lOYXZpZ2F0b3JDb250ZW50U2VydmljZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjliMWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuaW50ZXJuYWwuZXh0ZW5zaW9ucy5OYXZpZ2F0b3JDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLmV4dGVuc2lvbi5UZXN0Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci51dGlsLlRlc3RXb3Jrc3BhY2U7Ci0KLXB1YmxpYyBjbGFzcyBJTmF2aWdhdG9yQ29udGVudFNlcnZpY2VUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1PTl9OQVZJR0FUT1JfSU5TVEFOQ0VfSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLlRlc3RWaWV3IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRVhURU5TSU9OX0lEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci50ZXN0Q29udGVudCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9FWFRFTlNJT05fSUQgPSAib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlQ29udGVudCI7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcCBleHBlY3RlZENoaWxkcmVuID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCXByaXZhdGUgSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGNvbnRlbnRTZXJ2aWNlOwotCi0JcHJpdmF0ZSBDb21tb25WaWV3ZXIgdmlld2VyOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlUZXN0V29ya3NwYWNlLmluaXQoKTsKLQotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdCgiVGVzdCIpOwotCQlNYXAgcHJvamVjdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJZXhwZWN0ZWRDaGlsZHJlbi5wdXQocHJvamVjdCwgKHByb2plY3RNYXAgPSBuZXcgSGFzaE1hcCgpKSk7Ci0KLQkJcHJvamVjdE1hcC5wdXQocHJvamVjdC5nZXRGb2xkZXIoInNyYyIpLCBuZXcgSGFzaE1hcCgpKTsKLQkJcHJvamVjdE1hcC5wdXQocHJvamVjdC5nZXRGb2xkZXIoImJpbiIpLCBuZXcgSGFzaE1hcCgpKTsKLQkJcHJvamVjdE1hcC5wdXQocHJvamVjdC5nZXRGaWxlKCIucHJvamVjdCIpLCBudWxsKTsKLQkJcHJvamVjdE1hcC5wdXQocHJvamVjdC5nZXRGaWxlKCIuY2xhc3NwYXRoIiksIG51bGwpOwotCQlwcm9qZWN0TWFwLnB1dChwcm9qZWN0LmdldEZpbGUoIm1vZGVsLnByb3BlcnRpZXMiKSwgbnVsbCk7Ci0KLQkJRWRpdG9yVGVzdEhlbHBlci5zaG93VmlldyhDT01NT05fTkFWSUdBVE9SX0lOU1RBTkNFX0lELCB0cnVlKTsKLQotCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCi0JCUlWaWV3UGFydCBjb21tb25OYXZpZ2F0b3IgPSBhY3RpdmVQYWdlCi0JCQkJLmZpbmRWaWV3KENPTU1PTl9OQVZJR0FUT1JfSU5TVEFOQ0VfSUQpOwotCi0JCXZpZXdlciA9IChDb21tb25WaWV3ZXIpIGNvbW1vbk5hdmlnYXRvci5nZXRBZGFwdGVyKENvbW1vblZpZXdlci5jbGFzcyk7Ci0JCXZpZXdlci5leHBhbmRBbGwoKTsKLQotCQljb250ZW50U2VydmljZSA9IHZpZXdlci5nZXROYXZpZ2F0b3JDb250ZW50U2VydmljZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZFZhbGlkRXh0ZW5zaW9ucygpIHsKLQotCQljb250ZW50U2VydmljZS5hY3RpdmF0ZUV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgVEVTVF9FWFRFTlNJT05fSUQsCi0JCQkJUkVTT1VSQ0VfRVhURU5TSU9OX0lEIH0sIHRydWUpOwotCi0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRTZXJ2aWNlQ29udGVudFByb3ZpZGVyID0gY29udGVudFNlcnZpY2UKLQkJCQkuY3JlYXRlQ29tbW9uQ29udGVudFByb3ZpZGVyKCk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgY29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyID0gY29udGVudFNlcnZpY2UKLQkJCQkuY3JlYXRlQ29tbW9uTGFiZWxQcm92aWRlcigpOwotCi0JCUlUcmVlQ29udGVudFByb3ZpZGVyW10gcm9vdENvbnRlbnRQcm92aWRlcnMgPSBjb250ZW50U2VydmljZQotCQkJCS5maW5kUm9vdENvbnRlbnRQcm92aWRlcnMoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpCi0JCQkJCQkuZ2V0Um9vdCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkVuc3VyZSB0aGVyZSBpcyBvbmx5IG9uZSByb290IGNvbnRlbnQgcHJvdmlkZXIuIiwgMSwKLQkJCQlyb290Q29udGVudFByb3ZpZGVycy5sZW5ndGgpOwotCi0JCUlUcmVlQ29udGVudFByb3ZpZGVyW10gcHJvamVjdENvbnRlbnRQcm92aWRlcnMgPSBjb250ZW50U2VydmljZQotCQkJCS5maW5kUmVsZXZhbnRDb250ZW50UHJvdmlkZXJzKHByb2plY3QpOwotCi0JCWFzc2VydEVxdWFscygiRW5zdXJlIHRoZXJlIGFyZSB0d28gY29udGVudCBwcm92aWRlcnMgZm9yIGFuIElQcm9qZWN0LiIsCi0JCQkJMiwgcHJvamVjdENvbnRlbnRQcm92aWRlcnMubGVuZ3RoKTsKLQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdENvbnRlbnRQcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgoKE5hdmlnYXRvckNvbnRlbnRQcm92aWRlcikgcHJvamVjdENvbnRlbnRQcm92aWRlcnNbaV0pCi0JCQkJCS5nZXREZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgVGVzdENvbnRlbnRQcm92aWRlcikgewotCi0JCQkJVGVzdENvbnRlbnRQcm92aWRlciB0ZXN0Q29udGVudFByb3ZpZGVyID0gKFRlc3RDb250ZW50UHJvdmlkZXIpICgoTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyKSBwcm9qZWN0Q29udGVudFByb3ZpZGVyc1tpXSkKLQkJCQkJCS5nZXREZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcigpOwotCQkJCU9iamVjdFtdIHByb2plY3RDaGlsZHJlbiA9IHRlc3RDb250ZW50UHJvdmlkZXIKLQkJCQkJCS5nZXRDaGlsZHJlbihwcm9qZWN0KTsKLQkJCQlhc3NlcnRFcXVhbHMoCi0JCQkJCQkiVGhlcmUgc2hvdWxkIGJlIG9uZSB0ZXN0LXR5cGUgY2hpbGQgb2YgdGhlIHByb2plY3QuIiwKLQkJCQkJCTEsIHByb2plY3RDaGlsZHJlbi5sZW5ndGgpOwotCQkJCWFzc2VydEVxdWFscygiUGFyZW50IiwgY29udGVudFNlcnZpY2VMYWJlbFByb3ZpZGVyCi0JCQkJCQkuZ2V0VGV4dChwcm9qZWN0Q2hpbGRyZW5bMF0pKTsKLQkJCQlPYmplY3RbXSB0ZXN0Um9vdENoaWxkcmVuID0gY29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXIKLQkJCQkJCS5nZXRDaGlsZHJlbihwcm9qZWN0Q2hpbGRyZW5bMF0pOwotCQkJCWFzc2VydEVxdWFscygKLQkJCQkJCSJUaGVyZSBzaG91bGQgYmUgb25lIHRlc3QtdHlwZSBjaGlsZCBvZiB0aGUgcm9vdCB0ZXN0LXR5cGUgaXRlbS4iLAotCQkJCQkJMywgdGVzdFJvb3RDaGlsZHJlbi5sZW5ndGgpOwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWFzc2VydFRydWUoIlRoZSB0ZXN0IGNvbnRlbnQgcHJvdmlkZXIgd2FzIG5vdCBmb3VuZC4iLCBmb3VuZCk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlYWN0aXZhdGVUZXN0RXh0ZW5zaW9uKCkgewotCi0JCWNvbnRlbnRTZXJ2aWNlLmFjdGl2YXRlRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyBSRVNPVVJDRV9FWFRFTlNJT05fSUQgfSwgdHJ1ZSk7Ci0KLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFNlcnZpY2VDb250ZW50UHJvdmlkZXIgPSBjb250ZW50U2VydmljZQotCQkJCS5jcmVhdGVDb21tb25Db250ZW50UHJvdmlkZXIoKTsKLQotCQlJTGFiZWxQcm92aWRlciBjb250ZW50U2VydmljZUxhYmVsUHJvdmlkZXIgPSBjb250ZW50U2VydmljZQotCQkJCS5jcmVhdGVDb21tb25MYWJlbFByb3ZpZGVyKCk7Ci0KLQkJSVRyZWVDb250ZW50UHJvdmlkZXJbXSByb290Q29udGVudFByb3ZpZGVycyA9IGNvbnRlbnRTZXJ2aWNlCi0JCQkJLmZpbmRSb290Q29udGVudFByb3ZpZGVycyhSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkJCS5nZXRSb290KCkpOwotCi0JCWFzc2VydEVxdWFscygiRW5zdXJlIHRoZXJlIGlzIG9ubHkgb25lIHJvb3QgY29udGVudCBwcm92aWRlci4iLCAxLAotCQkJCXJvb3RDb250ZW50UHJvdmlkZXJzLmxlbmd0aCk7Ci0KLQkJSVRyZWVDb250ZW50UHJvdmlkZXJbXSBwcm9qZWN0Q29udGVudFByb3ZpZGVycyA9IGNvbnRlbnRTZXJ2aWNlCi0JCQkJLmZpbmRSZWxldmFudENvbnRlbnRQcm92aWRlcnMocHJvamVjdCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJFbnN1cmUgdGhlcmUgaXMgb25lIGNvbnRlbnQgcHJvdmlkZXIgZm9yIGFuIElQcm9qZWN0LiIsCi0JCQkJMSwgcHJvamVjdENvbnRlbnRQcm92aWRlcnMubGVuZ3RoKTsKLSAKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RFeHRlbnNpb25WaXNpYmlsaXR5KCkgewotCQlhc3NlcnRUcnVlKCJUaGUgdGVzdCBleHRlbnNpb24gc2hvdWxkIGJlIHZpc2libGUuIiwgY29udGVudFNlcnZpY2UuZ2V0Vmlld2VyRGVzY3JpcHRvcigpLmlzVmlzaWJsZUNvbnRlbnRFeHRlbnNpb24oVEVTVF9FWFRFTlNJT05fSUQpKTsKLQl9IAotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUV4dGVuc2lvblZpc2liaWxpdHkoKSB7Ci0JCWFzc2VydFRydWUoIlRoZSB0ZXN0IGV4dGVuc2lvbiBzaG91bGQgYmUgdmlzaWJsZS4iLCBjb250ZW50U2VydmljZS5nZXRWaWV3ZXJEZXNjcmlwdG9yKCkuaXNWaXNpYmxlQ29udGVudEV4dGVuc2lvbihSRVNPVVJDRV9FWFRFTlNJT05fSUQpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpc2libGVFeHRlbnNpb25JZHMoKSB7IAotCQlTdHJpbmdbXSB2aXNpYmxlSWRzID0gY29udGVudFNlcnZpY2UuZ2V0VmlzaWJsZUV4dGVuc2lvbklkcygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgYmUgdHdvIHZpc2libGUgZXh0ZW5zaW9ucy4iLCAyLCB2aXNpYmxlSWRzLmxlbmd0aCk7Ci0JCQotCQlmb3IoaW50IGk9MDsgaTx2aXNpYmxlSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZighVEVTVF9FWFRFTlNJT05fSUQuZXF1YWxzKHZpc2libGVJZHNbaV0pICYmICFSRVNPVVJDRV9FWFRFTlNJT05fSUQuZXF1YWxzKHZpc2libGVJZHNbaV0pKSB7Ci0JCQkJYXNzZXJ0VHJ1ZSgiVGhlIGV4dGVuc2lvbiBpZCBpcyBpbnZhbGlkOiIgKyB2aXNpYmxlSWRzW2ldLCBmYWxzZSk7Ci0JCQl9ICAKLQkJfQotCQkKLQkJSU5hdmlnYXRvckNvbnRlbnREZXNjcmlwdG9yW10gdmlzaWJsZURlc2NyaXB0b3JzID0gIGNvbnRlbnRTZXJ2aWNlLmdldFZpc2libGVFeHRlbnNpb25zKCk7Ci0JCQotCQlmb3IoaW50IGk9MDsgaTx2aXNpYmxlSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZighVEVTVF9FWFRFTlNJT05fSUQuZXF1YWxzKHZpc2libGVEZXNjcmlwdG9yc1tpXS5nZXRJZCgpKSAmJiAhUkVTT1VSQ0VfRVhURU5TSU9OX0lELmVxdWFscyh2aXNpYmxlRGVzY3JpcHRvcnNbaV0uZ2V0SWQoKSkpIHsKLQkJCQlhc3NlcnRUcnVlKCJUaGUgZXh0ZW5zaW9uIGlkIGlzIGludmFsaWQ6IiArIHZpc2libGVEZXNjcmlwdG9yc1tpXS5nZXRJZCgpLCBmYWxzZSk7Ci0JCQl9ICAKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvS2V5Ym9hcmRQcm9iZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvS2V5Ym9hcmRQcm9iZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWE2ZWNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL0tleWJvYXJkUHJvYmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBLZXlib2FyZFByb2JlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQUNFPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZBS0VfQ0hBUj0gJyQnOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJbmV3IEtleWJvYXJkUHJvYmUoKS5nZXRLZXljb2RlcygpOwotCX0KLQkKLQlwcml2YXRlIERpc3BsYXkgZkRpc3BsYXk7Ci0JcHJpdmF0ZSBjaGFyW11bXSBmQ29kZXM9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZktleUNvZGU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PTkU9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNISUZUPSAxOwotCXByaXZhdGUgYm9vbGVhbiBmS2V5Q29udGludWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZUZXh0Q29udGludWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZEaXNwb3NlRGlzcGxheT0gZmFsc2U7Ci0JcHJpdmF0ZSBTaGVsbCBmU2hlbGw7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyBiZWluZyBpbnB1dCBpbnRvIGEgdGV4dCBjb21wb25lbnQgYnkgaW5qZWN0aW5nIGtleQotCSAqIGV2ZW50cyBpbnRvIHRoZSBzeXN0ZW0gZXZlbnQgcXVldWUuIEZvciBlYWNoIGNoYXJhY3RlciwgdGhlIGFycmF5IGhvbGRzCi0JICogdGhlIHJlc3VsdGluZyBjaGFyYWN0ZXIgd2hlbiBwcmVzc2VkIGFsb25lIGFuZCB3aGVuIHByZXNzZWQgdG9nZXRoZXIgd2l0aAotCSAqIHNoaWZ0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNoYXJhY3RlcnMgaW5wdXQgYnkgcHJlc3NpbmcgdGhlIGtleXMuIFRoZSBrZXkgY29kZSBpcyB0aGUKLQkgKiAgICAgICAgIGluZGV4IGludG8gdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgY2hhcltdW10gZ2V0S2V5Y29kZXMoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGZDb2RlczsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBrZXlib2FyZCBwcm9iZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoZkNvZGVzID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcHJvYmUoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGZEaXNwb3NlRGlzcGxheSAmJiBmRGlzcGxheSAhPSBudWxsKSB7Ci0JCQkJCWZEaXNwbGF5LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJZkRpc3BsYXk9IG51bGw7Ci0JCQkJCi0JCQkJaWYgKGZTaGVsbCAhPSBudWxsICYmICFmU2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWZTaGVsbC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWZTaGVsbD0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciByZXN1bHRpbmcgZnJvbSBwcmVzc2luZyB0aGUgY2hhcmFjdGVyICdrZXknIHdpdGgKLQkgKiBvciB3aXRob3V0IHNoaWZ0IGJlaW5nIHByZXNzZWQuCi0JICogCi0JICogQHBhcmFtIGtleSB0aGUga2V5IHRvIHByZXNzCi0JICogQHBhcmFtIHByZXNzU2hpZnQgd2hldGhlciBwcmVzc2VkIHRvZ2V0aGVyIHdpdGggc2hpZnQKLQkgKiBAcmV0dXJuIHRoZSBjaGFyIHJlc3VsdGluZyBmcm9tIHRoZSBnaXZlbiBrZXkgY29tYm8sIG9yIDAgaWYgdGhlcmUgaXMgbm8gZXF1aXZhbGVudAotCSAqLwotCXB1YmxpYyBjaGFyIGdldENoYXJGb3JLZXliaW5kaW5nKGNoYXIga2V5LCBib29sZWFuIHByZXNzU2hpZnQpIHsKLQkJY2hhcltdW10ga2V5Y29kZXM9IGdldEtleWNvZGVzKCk7Ci0JCWlmIChrZXkgPCBrZXljb2Rlcy5sZW5ndGgpCi0JCQlyZXR1cm4ga2V5Y29kZXNba2V5XVtwcmVzc1NoaWZ0ID8gU0hJRlQgOiBOT05FXTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGtleWJpbmRpbmcgY29tYm8gdGhhdCB3aWxsIHByb2R1Y2UgdGhlIHdhbnRlZCBjaGFyYWN0ZXIuIE5vdGUKLQkgKiB0aGF0IHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIGNvbWJvIHRoYXQgY2FuIHByb2R1Y2UgdGhlIHdhbnRlZAotCSAqIGJpbmRpbmcsIGFueSBvbmUgaXMgcmV0dXJuZWQuIFRoZSBsYXN0IGludGVnZXIgaW4gdGhlIHJldHVybmVkIGFycmF5IGlzCi0JICogYSBjaGFyYWN0ZXIgdGhhdCBtdXN0IGJlIHNldCB0byB0aGUgRXZlbnQuY2hhcmFjdGVyIGZpZWxkLCBhbnkgaW50ZWdlcnMgCi0JICogYmVmb3JlIGFyZSBTV1QgY29uc3RhbnRzIGRlc2NyaWJpbmcgbW9kaWZpZXIga2V5cyB0aGF0IG11c3QgYmUgcHJlc3NlZAotCSAqIHRvIGdldCB0aGUgZGVzaXJlZCByZXN1bHQuCi0JICogCi0JICogQHBhcmFtIGV4cGVjdGVkIHRoZSBjaGFyIHRvIGJlIGlucHV0Ci0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBrZXkgY29tYm8sIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGlzIG5vIGNvbWJvCi0JICovCi0JcHVibGljIGludFtdIGdldEtleWJpbmRpbmdGb3JDaGFyKGNoYXIgZXhwZWN0ZWQpIHsKLQkJY2hhcltdW10ga2V5Y29kZXM9IGdldEtleWNvZGVzKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBrZXljb2Rlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGtleWNvZGVzW2ldW05PTkVdID09IGV4cGVjdGVkKQotCQkJCXJldHVybiBuZXcgaW50W10ge2l9OwotCQkJZWxzZSBpZiAoa2V5Y29kZXNbaV1bU0hJRlRdID09IGV4cGVjdGVkKQotCQkJCXJldHVybiBuZXcgaW50W10geyBTV1QuU0hJRlQsIGkgfTsKLQkJfQotCQlyZXR1cm4gbmV3IGludFswXTsKLQl9Ci0JCi0JLyoqCi0JICogUHJlc3NlcyBhIGtleSBjb21iaW5hdGlvbiBzdWNoIHRoYXQgdGhlIGV4cGVjdGVkIGNoYXJhY3RlciBpcyBpbnB1dCBieQotCSAqIHNpbXVsYXRpbmcga2V5IGV2ZW50cyBvbiB0aGUgZ2l2ZW4gZGlzcGxheS4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIGEga2V5IGNvbWJvIGNvdWxkIGJlIGZvdW5kLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90LgotCSAqIAotCSAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgY2hhcmFjdGVyCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkgdG8gc2ltdWxhdGUgdGhlIGV2ZW50cyBvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgd2FzIGEga2V5IGNvbWJvIHRvIHByZXNzLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIDxjb2RlPmV4cGVjdGVkPC9jb2RlPiBoYXMgbm8gY29tYm8gb24KLQkgKiAgICAgICAgIHRoZSBjdXJyZW50IGtleWJvYXJkIGxheW91dC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcmVzc0NoYXIoY2hhciBleHBlY3RlZCwgRGlzcGxheSBkaXNwbGF5KSB7Ci0JCXJldHVybiBwcmVzc0NoYXIoZXhwZWN0ZWQsIG5ldyBpbnRbMF0sIGRpc3BsYXkpOwotCX0KLQkKLQkvKioKLQkgKiBQcmVzc2VzIGEga2V5IGNvbWJpbmF0aW9uIHN1Y2ggdGhhdCB0aGUgZXhwZWN0ZWQgY2hhcmFjdGVyIGlzIGlucHV0IGJ5Ci0JICogc2ltdWxhdGluZyBrZXkgZXZlbnRzIG9uIHRoZSBnaXZlbiBkaXNwbGF5LiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgYSBrZXkgY29tYm8gY291bGQgYmUgZm91bmQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QuCi0JICogCi0JICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCBjaGFyYWN0ZXIKLQkgKiBAcGFyYW0gbW9kaWZpZXJzIGFkZGl0aW9uYWwgbW9kaWZpZXJzIHRvIHByZXNzCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkgdG8gc2ltdWxhdGUgdGhlIGV2ZW50cyBvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgd2FzIGEga2V5IGNvbWJvIHRvIHByZXNzLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIDxjb2RlPmV4cGVjdGVkPC9jb2RlPiBoYXMgbm8gY29tYm8gb24KLQkgKiAgICAgICAgIHRoZSBjdXJyZW50IGtleWJvYXJkIGxheW91dC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcmVzc0NoYXIoY2hhciBleHBlY3RlZCwgaW50W10gbW9kaWZpZXJzLCBEaXNwbGF5IGRpc3BsYXkpIHsKLQkJaW50W10gY2hhcmtleXM9IGdldEtleWJpbmRpbmdGb3JDaGFyKGV4cGVjdGVkKTsKLQkJaW50W10gY29tYm89IG5ldyBpbnRbY2hhcmtleXMubGVuZ3RoICsgbW9kaWZpZXJzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkobW9kaWZpZXJzLCAwLCBjb21ibywgMCwgbW9kaWZpZXJzLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoY2hhcmtleXMsIDAsIGNvbWJvLCBtb2RpZmllcnMubGVuZ3RoLCBjaGFya2V5cy5sZW5ndGgpOwotCQkKLQkJZm9yIChpbnQgaT0gMDsgaSA8PSBjb21iby5sZW5ndGggLSAyOyBpKyspIHsKLQkJCUV2ZW50IGV2ZW50PSBuZXcgRXZlbnQoKTsKLQkJCWV2ZW50LnR5cGU9IFNXVC5LZXlEb3duOwotCQkJZXZlbnQua2V5Q29kZT0gY29tYm9baV07Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQl9Ci0JCQotCQlpZiAoY29tYm8ubGVuZ3RoID4gMCkgewotCQkJRXZlbnQgZXZlbnQ9IG5ldyBFdmVudCgpOwotCQkJZXZlbnQudHlwZT0gU1dULktleURvd247Ci0JCQlldmVudC5jaGFyYWN0ZXI9IChjaGFyKSBjb21ib1tjb21iby5sZW5ndGggLSAxXTsKLQkJCWRpc3BsYXkucG9zdChldmVudCk7Ci0JCQkKLQkJCWV2ZW50LnR5cGU9IFNXVC5LZXlVcDsKLQkJCWRpc3BsYXkucG9zdChldmVudCk7Ci0JCX0KLQkJCi0JCWZvciAoaW50IGk9IGNvbWJvLmxlbmd0aCAtIDI7IGkgPj0gMDsgaS0tKSB7Ci0JCQlFdmVudCBldmVudD0gbmV3IEV2ZW50KCk7Ci0JCQlldmVudC50eXBlPSBTV1QuS2V5VXA7Ci0JCQlldmVudC5rZXlDb2RlPSBjb21ib1tpXTsKLQkJCWRpc3BsYXkucG9zdChldmVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBjb21iby5sZW5ndGggPiAwOwotCX0KLQkKLQl2b2lkIHByb2JlKCkgewotCQlmQ29kZXM9IG5ldyBjaGFyWzEyOF1bXTsKLQkJCi0JCWZEaXNwbGF5PSBjcmVhdGVEaXNwbGF5KCk7Ci0JCVRleHQgdGV4dD0gY3JlYXRlQ29udHJvbChmRGlzcGxheSk7Ci0JCQotCQlmb3IgKGZLZXlDb2RlPSAwOyBmS2V5Q29kZSA8IDEyODsgZktleUNvZGUrKykgewotCQkJZkNvZGVzW2ZLZXlDb2RlXT0gbmV3IGNoYXJbMl07Ci0JCQkKLQkJCXBvc3ROYXR1cmFsS2V5UHJlc3MoZktleUNvZGUpOwotCQkJY2hhciBjPSBnZXRDb250ZW50KHRleHQpOwotCQkJaWYgKFRSQUNFKSBTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyBmS2V5Q29kZSArICJjb250ZW50W05PTkVdOiAiICsgYyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkNvZGVzW2ZLZXlDb2RlXVtOT05FXT0gYzsKLQkJCWNsZWFyVGV4dCh0ZXh0KTsKLQkJCQotCQkJcG9zdFNoaWZ0S2V5UHJlc3MoZktleUNvZGUpOwotCQkJYz0gZ2V0Q29udGVudCh0ZXh0KTsKLQkJCWlmIChUUkFDRSkgU3lzdGVtLm91dC5wcmludGxuKCIiICsgZktleUNvZGUgKyAiY29udGVudFtTSElGVF06ICIgKyBjKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlmQ29kZXNbZktleUNvZGVdW1NISUZUXT0gYzsKLQkJCWNsZWFyVGV4dCh0ZXh0KTsKLQotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIGNoYXIgZ2V0Q29udGVudChUZXh0IHRleHQpIHsKLQkJU3RyaW5nIGNvbnRlbnQ9IHRleHQuZ2V0VGV4dCgpOwotCQljaGFyIGM7Ci0JCWlmIChjb250ZW50Lmxlbmd0aCgpID09IDIpIHsKLQkJCWM9IGNvbnRlbnQuY2hhckF0KDApOwotCQkJaWYgKFRSQUNFICYmIGNvbnRlbnQuY2hhckF0KDEpICE9IEZBS0VfQ0hBUikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNlY29uZCBjaGFyIHdhcyAnIiArIGNvbnRlbnQuY2hhckF0KDEpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gZWxzZSBpZiAoY29udGVudC5sZW5ndGgoKSA+IDIpIHsKLQkJCWM9IGNvbnRlbnQuY2hhckF0KDApOwotCQkJaWYgKFRSQUNFKSBTeXN0ZW0ub3V0LnByaW50bG4oInJlc3QgY29udGVudCB3YXMgJyIgKyBjb250ZW50LnN1YnN0cmluZygxKSArICInIik7CQkJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgaWYgKGNvbnRlbnQubGVuZ3RoKCkgPT0gMSkgewotCQkJYz0gJ1wwJzsKLQkJCWlmIChUUkFDRSAmJiBjb250ZW50LmNoYXJBdCgwKSAhPSBGQUtFX0NIQVIpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWNvbmQgY2hhciB3YXMgJyIgKyBjb250ZW50LmNoYXJBdCgwKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJYz0gJ1wwJzsKLQkJCWlmIChUUkFDRSkgU3lzdGVtLm91dC5wcmludGxuKCJubyBjb250ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJUZXh0KFRleHQgdGV4dCkgewotCQlmVGV4dENvbnRpbnVlPSBmYWxzZTsKLQkJdGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlkbwotCQkJZHJpdmVFdmVudFF1ZXVlKCk7Ci0JCXdoaWxlICghZlRleHRDb250aW51ZSAmJiBmRGlzcGxheS5zbGVlcCgpKTsKLQl9Ci0KLQlwcml2YXRlIERpc3BsYXkgY3JlYXRlRGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5PSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJZGlzcGxheT0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlmRGlzcG9zZURpc3BsYXk9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoVGV4dCBjb250cm9sKSB7Ci0JCWNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULktleURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJb25LZXlEb3duKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULktleVVwLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCW9uS2V5VXAoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJb25Nb2RpZnkoZXZlbnQpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBUZXh0IGNyZWF0ZUNvbnRyb2woRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWZTaGVsbD0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlmU2hlbGwuc2V0U2l6ZSgzMDAsIDIwMCk7Ci0JCWZTaGVsbC5zZXRUZXh0KCJLZXlib2FyZCBQcm9iZSIpOyAvLyROT04tTkxTLTEkCi0JCWZTaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCVRleHQgdGV4dD0gbmV3IFRleHQoZlNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuTEVGVCB8IFNXVC5XUkFQKTsKLQkJdGV4dC5zZXRTaXplKDMwMCwgMjAwKTsKLQkJZlNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JCWZTaGVsbC5mb3JjZUFjdGl2ZSgpOwotCQlmU2hlbGwuZm9yY2VGb2N1cygpOwotCQlhZGRMaXN0ZW5lcnModGV4dCk7Ci0JCQotCQl0ZXh0LnNldEZvY3VzKCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9zdE5hdHVyYWxLZXlQcmVzcyhpbnQgaSkgewotCQkKLQkJZktleUNvbnRpbnVlPSBmYWxzZTsKLQkJCi0JCUV2ZW50IGV2ZW50PSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZT0gU1dULktleURvd247Ci0JCWV2ZW50LmtleUNvZGU9IGk7Ci0JCWV2ZW50LmNoYXJhY3Rlcj0gKGNoYXIpIGk7Ci0JCWZEaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkKLQkJZXZlbnQudHlwZT0gU1dULktleVVwOwotCQlmRGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCi0JCUV2ZW50IGV2ZW50Mj0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50Mi50eXBlPSBTV1QuS2V5RG93bjsKLS8vCQlldmVudDIua2V5Q29kZT0gaTsKLQkJZXZlbnQyLmNoYXJhY3Rlcj0gRkFLRV9DSEFSOwotCQlmRGlzcGxheS5wb3N0KGV2ZW50Mik7Ci0JCQotCQlldmVudDIudHlwZT0gU1dULktleVVwOwotCQlmRGlzcGxheS5wb3N0KGV2ZW50Mik7Ci0JCQotCQlkbwotCQkJZHJpdmVFdmVudFF1ZXVlKCk7Ci0JCXdoaWxlICghZktleUNvbnRpbnVlICYmIGZEaXNwbGF5LnNsZWVwKCkpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBwb3N0U2hpZnRLZXlQcmVzcyhpbnQgaSkgewotCQlmS2V5Q29udGludWU9IGZhbHNlOwotCQkKLQkJRXZlbnQgc2hpZnQ9IG5ldyBFdmVudCgpOwotCQlzaGlmdC50eXBlPSBTV1QuS2V5RG93bjsKLQkJc2hpZnQua2V5Q29kZT0gU1dULlNISUZUOwotCQlmRGlzcGxheS5wb3N0KHNoaWZ0KTsKLQkJCi0JCUV2ZW50IGV2ZW50PSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZT0gU1dULktleURvd247Ci0JCWV2ZW50LmNoYXJhY3Rlcj0gKGNoYXIpIGk7Ci0JCWZEaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkKLQkJZXZlbnQudHlwZT0gU1dULktleVVwOwotCQlmRGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCi0JCXNoaWZ0LnR5cGU9IFNXVC5LZXlVcDsKLQkJZkRpc3BsYXkucG9zdChzaGlmdCk7Ci0JCQotCQlFdmVudCBldmVudDI9IG5ldyBFdmVudCgpOwotCQlldmVudDIudHlwZT0gU1dULktleURvd247Ci0JCWV2ZW50Mi5jaGFyYWN0ZXI9IEZBS0VfQ0hBUjsKLQkJZkRpc3BsYXkucG9zdChldmVudDIpOwotCQkKLQkJZXZlbnQyLnR5cGU9IFNXVC5LZXlVcDsKLQkJZkRpc3BsYXkucG9zdChldmVudDIpOwotCQkKLQkJZG8KLQkJCWRyaXZlRXZlbnRRdWV1ZSgpOwotCQl3aGlsZSAoIWZLZXlDb250aW51ZSAmJiBmRGlzcGxheS5zbGVlcCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZTaGlmdFByZXNzZWQ9IGZhbHNlOwotCQotCXByaXZhdGUgdm9pZCBvbktleURvd24oRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULlNISUZUKQotCQkJZlNoaWZ0UHJlc3NlZD0gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG9uS2V5VXAoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCFmU2hpZnRQcmVzc2VkIHx8IGV2ZW50LmtleUNvZGUgPT0gU1dULlNISUZUKQotCQkJZktleUNvbnRpbnVlPSB0cnVlOwotCQlmU2hpZnRQcmVzc2VkPSBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG9uTW9kaWZ5KEV2ZW50IGV2ZW50KSB7Ci0JCWZUZXh0Q29udGludWU9IHRydWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkcml2ZUV2ZW50UXVldWUoKSB7Ci0JCXdoaWxlIChmRGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkge30KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9OYXZpZ2F0b3JUZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL05hdmlnYXRvclRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQzNGQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL05hdmlnYXRvclRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBOYXZpZ2F0b3JUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3VpdGUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgTmF2aWdhdG9yVGVzdFN1aXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHRoZSB0ZXN0IHN1aXRlLgotCSAqLwotCXB1YmxpYyBOYXZpZ2F0b3JUZXN0U3VpdGUoKSB7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShPcGVuVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlVGVzdHMuY2xhc3MpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL05hdmlnYXRvclRlc3RzUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9OYXZpZ2F0b3JUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JhYmRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL05hdmlnYXRvclRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogCi0gKiBOb3QgZXhwb3NlZCBhcyBBUEkuCi0gKiBAc2luY2UgMy4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTmF2aWdhdG9yVGVzdHNQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBOYXZpZ2F0b3JUZXN0c1BsdWdpbiBwbHVnaW47IAotCS8qKgotCSAqIFRoZSBwbHVnaW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIKLQkgKi8KLQlwdWJsaWMgTmF2aWdhdG9yVGVzdHNQbHVnaW4oKSB7Ci0gCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5hdmlnYXRvclRlc3RzUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotIAotCi0JLyoqCi0JICogTG9nIHRoZSBnaXZlbiBzdGF0dXMgdG8gdGhlIElTViBsb2cuCi0JICogCi0JICogV2hlbiB0byB1c2UgdGhpczoKLQkgKiAKLQkgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gYSBQbHVnaW5FeGNlcHRpb24gb3IgYSBFeHRlbnNpb25FeGNlcHRpb24gb2NjdXIgYnV0IGZvciB3aGljaCBhbgotCSAqIGVycm9yIGRpYWxvZyBjYW5ub3QgYmUgc2FmZWx5IHNob3duLgotCSAqIAotCSAqIElmIHlvdSBjYW4gc2hvdyBhbiBFcnJvckRpYWxvZyB0aGVuIGRvIHNvLCBhbmQgZG8gbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogCi0JICogSWYgeW91IGhhdmUgYSBwbHVnaW4gZXhjZXB0aW9uIG9yIGNvcmUgZXhjZXB0aW9uIGluIGhhbmQgY2FsbCBsb2coU3RyaW5nLCBJU3RhdHVzKQotCSAqIAotCSAqIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIFdvcmtiZW5jaCBvbmx5IGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQKLQkgKiBvdXRzaWRlIHRoZSB3b3JrYmVuY2guCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgc3VwcG9ydGVkIGluIHRoZSBldmVudCB0aGUgbG9nIGFsbG93cyBwbHVnaW4gcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBiZSBsb2dnZWQKLQkgKiAoMUZUVEpLVikuIFRoaXMgd291bGQgYmUgZG9uZSBieSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlcm5hbCB0byB0aGUgd29ya2JlbmNoIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQgYnkgYW55IHBsdWdpbnMsIG9yIGV4YW1wbGVzLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBBIGhpZ2ggbGV2ZWwgVUkgbWVzc2FnZSBkZXNjcmliaW5nIHdoZW4gdGhlIHByb2JsZW0gaGFwcGVuZWQuCi0JICogIAotCSAqLwotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCBtZXNzYWdlLCBudWxsKSk7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLQkJLy8xRlRUSktWOiBJVFBDT1JFOkFMTCAtIGxvZyhzdGF0dXMpIGRvZXMgbm90IGFsbG93IHBsdWdpbiBpbmZvcm1hdGlvbiB0byBiZSByZWNvcmRlZAotCX0KLQotCS8qKgotCSAqIExvZ3MgZXJyb3JzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIDAsIG1lc3NhZ2UsIG51bGwpKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlICsgIlxuUmVhc29uOiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQlTeXN0ZW0uZXJyLnByaW50bG4oc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSAKLQkKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGFuRXhjZXB0aW9uKSB7IAotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGNyZWF0ZUVycm9yU3RhdHVzKGFDb2RlLCBhTWVzc2FnZSwgYW5FeGNlcHRpb24pKTsgCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWxvZyhjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIGFTdGF0dXMpIHsgCi0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coYVN0YXR1cyk7IAotCX0gCi0JIAotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotIAotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9IAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvT3BlblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL09wZW5UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOWEwOGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvT3BlblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLnV0aWwuVGVzdFdvcmtzcGFjZTsKLQotcHVibGljIGNsYXNzIE9wZW5UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTU9OX05BVklHQVRPUl9JTlNUQU5DRV9JRCA9ICJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTZXQgZXhwZWN0ZWRDaGlsZHJlbiA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVRlc3RXb3Jrc3BhY2UuaW5pdCgpOwotCi0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KCJUZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlleHBlY3RlZENoaWxkcmVuLmFkZChwcm9qZWN0LmdldEZvbGRlcigic3JjIikpOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkQ2hpbGRyZW4uYWRkKHByb2plY3QuZ2V0Rm9sZGVyKCJiaW4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwZWN0ZWRDaGlsZHJlbi5hZGQocHJvamVjdC5nZXRGaWxlKCIucHJvamVjdCIpKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZENoaWxkcmVuLmFkZChwcm9qZWN0LmdldEZpbGUoIi5jbGFzc3BhdGgiKSk7IC8vJE5PTi1OTFMtMSQgCi0JCWV4cGVjdGVkQ2hpbGRyZW4uYWRkKHByb2plY3QuZ2V0RmlsZSgibW9kZWwucHJvcGVydGllcyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0b3JSb290Q29udGVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWRpdG9yVGVzdEhlbHBlci5zaG93VmlldyhDT01NT05fTkFWSUdBVE9SX0lOU1RBTkNFX0lELCB0cnVlKTsKLQotCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCi0JCUlWaWV3UGFydCBjb21tb25OYXZpZ2F0b3IgPSBhY3RpdmVQYWdlCi0JCQkJLmZpbmRWaWV3KENPTU1PTl9OQVZJR0FUT1JfSU5TVEFOQ0VfSUQpOwotCQljb21tb25OYXZpZ2F0b3Iuc2V0Rm9jdXMoKTsKLQkJQ29tbW9uVmlld2VyIHZpZXdlciA9IChDb21tb25WaWV3ZXIpIGNvbW1vbk5hdmlnYXRvcgotCQkJCS5nZXRBZGFwdGVyKENvbW1vblZpZXdlci5jbGFzcyk7Ci0JCXZpZXdlci5leHBhbmRBbGwoKTsKLQotCQlJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgY29udGVudFNlcnZpY2UgPSB2aWV3ZXIKLQkJCQkuZ2V0TmF2aWdhdG9yQ29udGVudFNlcnZpY2UoKTsKLQkJY29udGVudFNlcnZpY2UuYWN0aXZhdGVFeHRlbnNpb25zKAotCQkJCW5ldyBTdHJpbmdbXSB7IENPTU1PTl9OQVZJR0FUT1JfSU5TVEFOQ0VfSUQgfSwgdHJ1ZSk7Ci0KLQkJdmlld2VyLmV4cGFuZEFsbCgpOwotCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCVRyZWVJdGVtW10gaXRlbXMgPSB2aWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1zKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIHNvbWUgaXRlbXMuIiwgaXRlbXMubGVuZ3RoID4gMCk7IC8vJE5PTi1OTFMtMSQJCQotCi0JCWFzc2VydEVxdWFscyhwcm9qZWN0LCBpdGVtc1swXS5nZXREYXRhKCkpOwotCi0JCS8vIHdlIGRvIHRoaXMgdG8gZm9yY2UgdGhlIHJlbmRlcmluZyBvZiB0aGUgY2hpbGRyZW4gb2YgaXRlbXNbMF0KLQkJdmlld2VyCi0JCQkJLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwcm9qZWN0Ci0JCQkJCQkuZ2V0RmlsZSgiLnByb2plY3QiKSkpOyAvLyROT04tTkxTLTEkCi0KLQkJVHJlZUl0ZW1bXSBjaGlsZHJlbiA9IGl0ZW1zWzBdLmdldEl0ZW1zKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQ2hpbGRyZW4uc2l6ZSgpLCBjaGlsZHJlbi5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRUcnVlKGV4cGVjdGVkQ2hpbGRyZW4uY29udGFpbnMoY2hpbGRyZW5baV0uZ2V0RGF0YSgpKSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0b3JFeHRlbnNpb25FbmFibGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVkaXRvclRlc3RIZWxwZXIuc2hvd1ZpZXcoQ09NTU9OX05BVklHQVRPUl9JTlNUQU5DRV9JRCwgdHJ1ZSk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gYWN0aXZlV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQotCQlJVmlld1BhcnQgY29tbW9uTmF2aWdhdG9yID0gYWN0aXZlUGFnZQotCQkJCS5maW5kVmlldyhDT01NT05fTkFWSUdBVE9SX0lOU1RBTkNFX0lEKTsKLQotCQlDb21tb25WaWV3ZXIgdmlld2VyID0gKENvbW1vblZpZXdlcikgY29tbW9uTmF2aWdhdG9yCi0JCQkJLmdldEFkYXB0ZXIoQ29tbW9uVmlld2VyLmNsYXNzKTsKLQotCQlJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgY29udGVudFNlcnZpY2UgPSB2aWV3ZXIKLQkJCQkuZ2V0TmF2aWdhdG9yQ29udGVudFNlcnZpY2UoKTsKLQotCQljb250ZW50U2VydmljZS5hY3RpdmF0ZUV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHt9LCB0cnVlKTsKLQotCQl2aWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbXMoKTsKLQotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgTk8gaXRlbXMuIiwgaXRlbXMubGVuZ3RoID09IDApOyAvLyROT04tTkxTLTEkCi0KLQkJY29udGVudFNlcnZpY2UuZGVhY3RpdmF0ZUV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHt9LCB0cnVlKTsKLQotCQl2aWV3ZXIuZXhwYW5kVG9MZXZlbCgyKTsKLQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQlpdGVtcyA9IHZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbXMoKTsKLQotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgc29tZSBpdGVtcy4iLCBpdGVtcy5sZW5ndGggPiAwKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9TV1RFdmVudEhlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvU1dURXZlbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlZjZiMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9TV1RFdmVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci0KLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RFdmVudEhlbHBlciB7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHByZXNzS2V5Q29kZShEaXNwbGF5IGRpc3BsYXksIGludCBrZXlDb2RlKSB7Ci0JCXByZXNzS2V5Q29kZShkaXNwbGF5LCBrZXlDb2RlLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHByZXNzS2V5Q29kZShEaXNwbGF5IGRpc3BsYXksIGludCBrZXlDb2RlLCBib29sZWFuIHJ1bkV2ZW50UXVldWUpIHsKLQkJa2V5Q29kZURvd24oZGlzcGxheSwga2V5Q29kZSwgcnVuRXZlbnRRdWV1ZSk7Ci0JCWtleUNvZGVVcChkaXNwbGF5LCBrZXlDb2RlLCBydW5FdmVudFF1ZXVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJlc3NLZXlDb2RlQ29tYmluYXRpb24oRGlzcGxheSBkaXNwbGF5LCBpbnRbXSBrZXlDb2RlcykgewotCQlwcmVzc0tleUNvZGVDb21iaW5hdGlvbihkaXNwbGF5LCBrZXlDb2RlcywgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmVzc0tleUNvZGVDb21iaW5hdGlvbihEaXNwbGF5IGRpc3BsYXksIGludFtdIGtleUNvZGVzLCBib29sZWFuIHJ1bkV2ZW50UXVldWUpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGtleUNvZGVzLmxlbmd0aDsgaSsrKQotCQkJa2V5Q29kZURvd24oZGlzcGxheSwga2V5Q29kZXNbaV0sIHJ1bkV2ZW50UXVldWUpOwotCQlmb3IgKGludCBpPSBrZXlDb2Rlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKLQkJCWtleUNvZGVVcChkaXNwbGF5LCBrZXlDb2Rlc1tpXSwgcnVuRXZlbnRRdWV1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGtleUNvZGVEb3duKERpc3BsYXkgZGlzcGxheSwgaW50IGtleUNvZGUpIHsKLQkJa2V5Q29kZUV2ZW50KGRpc3BsYXksIFNXVC5LZXlEb3duLCBrZXlDb2RlLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGtleUNvZGVEb3duKERpc3BsYXkgZGlzcGxheSwgaW50IGtleUNvZGUsIGJvb2xlYW4gcnVuRXZlbnRRdWV1ZSkgewotCQlrZXlDb2RlRXZlbnQoZGlzcGxheSwgU1dULktleURvd24sIGtleUNvZGUsIHJ1bkV2ZW50UXVldWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBrZXlDb2RlVXAoRGlzcGxheSBkaXNwbGF5LCBpbnQga2V5Q29kZSkgewotCQlrZXlDb2RlRXZlbnQoZGlzcGxheSwgU1dULktleVVwLCBrZXlDb2RlLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGtleUNvZGVVcChEaXNwbGF5IGRpc3BsYXksIGludCBrZXlDb2RlLCBib29sZWFuIHJ1bkV2ZW50UXVldWUpIHsKLQkJa2V5Q29kZUV2ZW50KGRpc3BsYXksIFNXVC5LZXlVcCwga2V5Q29kZSwgcnVuRXZlbnRRdWV1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXZlbnQgZmdLZXlDb2RlRXZlbnQ9IG5ldyBFdmVudCgpOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBrZXlDb2RlRXZlbnQoRGlzcGxheSBkaXNwbGF5LCBpbnQgdHlwZSwgaW50IGtleUNvZGUsIGJvb2xlYW4gcnVuRXZlbnRRdWV1ZSkgewotCQlmZ0tleUNvZGVFdmVudC50eXBlPSB0eXBlOwotCQlmZ0tleUNvZGVFdmVudC5rZXlDb2RlPSBrZXlDb2RlOwotCQlwb3N0RXZlbnQoZGlzcGxheSwgZmdLZXlDb2RlRXZlbnQsIHJ1bkV2ZW50UXVldWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJlc3NLZXlDaGFyKERpc3BsYXkgZGlzcGxheSwgY2hhciBrZXlDaGFyKSB7Ci0JCXByZXNzS2V5Q2hhcihkaXNwbGF5LCBrZXlDaGFyLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHByZXNzS2V5Q2hhcihEaXNwbGF5IGRpc3BsYXksIGNoYXIga2V5Q2hhciwgYm9vbGVhbiBydW5FdmVudFF1ZXVlKSB7Ci0JCWtleUNoYXJEb3duKGRpc3BsYXksIGtleUNoYXIsIHJ1bkV2ZW50UXVldWUpOwotCQlrZXlDaGFyVXAoZGlzcGxheSwga2V5Q2hhciwgcnVuRXZlbnRRdWV1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByZXNzS2V5Q2hhckNvbWJpbmF0aW9uKERpc3BsYXkgZGlzcGxheSwgY2hhcltdIGtleUNoYXJzKSB7Ci0JCXByZXNzS2V5Q2hhckNvbWJpbmF0aW9uKGRpc3BsYXksIGtleUNoYXJzLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHByZXNzS2V5Q2hhckNvbWJpbmF0aW9uKERpc3BsYXkgZGlzcGxheSwgY2hhcltdIGtleUNoYXJzLCBib29sZWFuIHJ1bkV2ZW50UXVldWUpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGtleUNoYXJzLmxlbmd0aDsgaSsrKQotCQkJa2V5Q2hhckRvd24oZGlzcGxheSwga2V5Q2hhcnNbaV0sIHJ1bkV2ZW50UXVldWUpOwotCQlmb3IgKGludCBpPSBrZXlDaGFycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKLQkJCWtleUNoYXJVcChkaXNwbGF5LCBrZXlDaGFyc1tpXSwgcnVuRXZlbnRRdWV1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGtleUNoYXJEb3duKERpc3BsYXkgZGlzcGxheSwgY2hhciBrZXlDaGFyLCBib29sZWFuIHJ1bkV2ZW50UXVldWUpIHsKLQkJa2V5Q2hhckV2ZW50KGRpc3BsYXksIFNXVC5LZXlEb3duLCBrZXlDaGFyLCBydW5FdmVudFF1ZXVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQga2V5Q2hhclVwKERpc3BsYXkgZGlzcGxheSwgY2hhciBrZXlDaGFyLCBib29sZWFuIHJ1bkV2ZW50UXVldWUpIHsKLQkJa2V5Q2hhckV2ZW50KGRpc3BsYXksIFNXVC5LZXlVcCwga2V5Q2hhciwgcnVuRXZlbnRRdWV1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXZlbnQgZmdLZXlDaGFyRXZlbnQ9IG5ldyBFdmVudCgpOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBrZXlDaGFyRXZlbnQoRGlzcGxheSBkaXNwbGF5LCBpbnQgdHlwZSwgY2hhciBrZXlDaGFyLCBib29sZWFuIHJ1bkV2ZW50UXVldWUpIHsKLQkJZmdLZXlDaGFyRXZlbnQudHlwZT0gdHlwZTsKLQkJZmdLZXlDaGFyRXZlbnQuY2hhcmFjdGVyPSBrZXlDaGFyOwotCQlwb3N0RXZlbnQoZGlzcGxheSwgZmdLZXlDaGFyRXZlbnQsIHJ1bkV2ZW50UXVldWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9zdEV2ZW50KGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgRXZlbnQgZXZlbnQsIGJvb2xlYW4gcnVuRXZlbnRRdWV1ZSkgewotCQlEaXNwbGF5SGVscGVyIGhlbHBlcj0gbmV3IERpc3BsYXlIZWxwZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBjb25kaXRpb24oKSB7Ci0JCQkJcmV0dXJuIGRpc3BsYXkucG9zdChldmVudCk7Ci0JCQl9Ci0JCX07Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGhlbHBlci53YWl0Rm9yQ29uZGl0aW9uKGRpc3BsYXksIDEwMDApKTsKLQotCQlpZiAocnVuRXZlbnRRdWV1ZSkKLQkJCUVkaXRvclRlc3RIZWxwZXIucnVuRXZlbnRRdWV1ZSgpOwotCQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIEV2ZW50IGZnTW91c2VNb3ZlRXZlbnQ9IG5ldyBFdmVudCgpOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtb3VzZU1vdmVFdmVudChEaXNwbGF5IGRpc3BsYXksIGludCB4LCBpbnQgeSwgYm9vbGVhbiBydW5FdmVudFF1ZXVlKSB7Ci0JCWZnTW91c2VNb3ZlRXZlbnQudHlwZT0gU1dULk1vdXNlTW92ZTsKLQkJZmdNb3VzZU1vdmVFdmVudC54PSB4OwotCQlmZ01vdXNlTW92ZUV2ZW50Lnk9IHk7Ci0JCXBvc3RFdmVudChkaXNwbGF5LCBmZ01vdXNlTW92ZUV2ZW50LCBydW5FdmVudFF1ZXVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1vdXNlRG93bkV2ZW50KERpc3BsYXkgZGlzcGxheSwgaW50IGJ1dHRvbiwgYm9vbGVhbiBydW5FdmVudFF1ZXVlKSB7Ci0JCW1vdXNlQnV0dG9uRXZlbnQoZGlzcGxheSwgU1dULk1vdXNlRG93biwgYnV0dG9uLCBydW5FdmVudFF1ZXVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbW91c2VVcEV2ZW50KERpc3BsYXkgZGlzcGxheSwgaW50IGJ1dHRvbiwgYm9vbGVhbiBydW5FdmVudFF1ZXVlKSB7Ci0JCW1vdXNlQnV0dG9uRXZlbnQoZGlzcGxheSwgU1dULk1vdXNlVXAsIGJ1dHRvbiwgcnVuRXZlbnRRdWV1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXZlbnQgZmdNb3VzZUJ1dHRvbkV2ZW50PSBuZXcgRXZlbnQoKTsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbW91c2VCdXR0b25FdmVudChEaXNwbGF5IGRpc3BsYXksIGludCB0eXBlLCBpbnQgYnV0dG9uLCBib29sZWFuIHJ1bkV2ZW50UXVldWUpIHsKLQkJZmdNb3VzZUJ1dHRvbkV2ZW50LnR5cGU9IHR5cGU7Ci0JCWZnTW91c2VCdXR0b25FdmVudC5idXR0b249IGJ1dHRvbjsKLQkJcG9zdEV2ZW50KGRpc3BsYXksIGZnTW91c2VCdXR0b25FdmVudCwgcnVuRXZlbnRRdWV1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvZXh0ZW5zaW9uL0RlcGVuZGVudEFjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvZXh0ZW5zaW9uL0RlcGVuZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTY3NzA0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL2V4dGVuc2lvbi9EZXBlbmRlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW50QWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7Ci0gCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXB1YmxpYyBEZXBlbmRlbnRBY3Rpb24oU2hlbGwgYVNoZWxsLCBTdHJpbmcgaXNWYWxpZCkgewotCQlzdXBlcigiRGVwZW5kZW50IEFjdGlvbjogIiArIGlzVmFsaWQpOwotCQlzaGVsbCA9IGFTaGVsbDsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsICJEZXBlbmRlbnRBY3Rpb24iLCAiVGhlIGRlcGVuZGVudCBhY3Rpb24gcmFuISIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL2V4dGVuc2lvbi9EZXBlbmRlbnRBY3Rpb25Qcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvZXh0ZW5zaW9uL0RlcGVuZGVudEFjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MWIwZjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvZXh0ZW5zaW9uL0RlcGVuZGVudEFjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5leHRlbnNpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyQ29uZmlnOwotCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW50QWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25BY3Rpb25Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElBY3Rpb24gYWN0aW9uID0gbnVsbDsKLQkKLQlwdWJsaWMgdm9pZCBpbml0KENvbW1vbkFjdGlvblByb3ZpZGVyQ29uZmlnIGFDb25maWcpIHsKLQkJIGFjdGlvbiA9IG5ldyBEZXBlbmRlbnRBY3Rpb24oYUNvbmZpZy5nZXRWaWV3U2l0ZSgpLmdldFNoZWxsKCksIGFDb25maWcuZ2V0RXh0ZW5zaW9uSWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgeyAKLQkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKFRlc3RBY3Rpb25Qcm92aWRlci5HUk9VUF9URVNUX01FTlUpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIHN1Ym1lbnUgc2hvdWxkIGhhdmUgYmVlbiBhZGRlZCBieSBUZXN0QWN0aW9uUHJvdmlkZXIhIiwgc3VibWVudSk7Ci0JCXN1Ym1lbnUuaW5zZXJ0QWZ0ZXIoVGVzdEFjdGlvblByb3ZpZGVyLkdST1VQX1RFU1RfREVQRU5ERU5DWSwgYWN0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL2V4dGVuc2lvbi9UZXN0QWN0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9leHRlbnNpb24vVGVzdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTgyZmRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL2V4dGVuc2lvbi9UZXN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIFRlc3RBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHsKLQotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLQlwdWJsaWMgVGVzdEFjdGlvbihTaGVsbCBhU2hlbGwpIHsKLQkJc3VwZXIoIlRlc3QgQWN0aW9uIik7Ci0JCXNoZWxsID0gYVNoZWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCAiU2hlbGwiLCAiVGhlIHRlc3QgYWN0aW9uIHJhbiEiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9leHRlbnNpb24vVGVzdEFjdGlvblByb3ZpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9leHRlbnNpb24vVGVzdEFjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NWQyYzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvZXh0ZW5zaW9uL1Rlc3RBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25BY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXJDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25NZW51Q29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgVGVzdEFjdGlvblByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uQWN0aW9uUHJvdmlkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfVEVTVF9NRU5VID0gImdyb3VwLnRlc3RNZW51IjsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9URVNUX0RFUEVOREVOQ1kgPSAiZ3JvdXAudGVzdERlcGVuZGVuY3kiOyAKLQkKLQlwcml2YXRlIElBY3Rpb24gYWN0aW9uID0gbnVsbDsKLQkKLQlwdWJsaWMgdm9pZCBpbml0KENvbW1vbkFjdGlvblByb3ZpZGVyQ29uZmlnIGFDb25maWcpIHsKLQkJIGFjdGlvbiA9IG5ldyBUZXN0QWN0aW9uKGFDb25maWcuZ2V0Vmlld1NpdGUoKS5nZXRTaGVsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCUlNZW51TWFuYWdlciBzdWJtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCJDTiBUZXN0IE1lbnUiLCBHUk9VUF9URVNUX01FTlUpOwotCQlzdWJtZW51LmFkZChhY3Rpb24pOwotCQlzdWJtZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoR1JPVVBfVEVTVF9ERVBFTkRFTkNZKSk7Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfQURESVRJT05TLCBzdWJtZW51KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL2V4dGVuc2lvbi9UZXN0Q29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9leHRlbnNpb24vVGVzdENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjg0YmVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL2V4dGVuc2lvbi9UZXN0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotcHVibGljIGNsYXNzIFRlc3RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfUk9PVCA9ICJyb290IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIE5PX0NISUxEUkVOID0gbmV3IE9iamVjdFswXTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIE1PREVMX0ZJTEVfUEFUSCA9IG5ldyBQYXRoKCJtb2RlbC5wcm9wZXJ0aWVzIik7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcCByb290RWxlbWVudHMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0KLQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcGFyZW50RWxlbWVudDsKLQkJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJSUZpbGUgbW9kZWxGaWxlID0gcHJvamVjdC5nZXRGaWxlKE1PREVMX0ZJTEVfUEFUSCk7Ci0JCQkJaWYgKHJvb3RFbGVtZW50cy5jb250YWluc0tleShtb2RlbEZpbGUpKSB7Ci0JCQkJCVRlc3RFeHRlbnNpb25UcmVlRGF0YSByb290ID0gKFRlc3RFeHRlbnNpb25UcmVlRGF0YSkKLQkJCQkJICAgcm9vdEVsZW1lbnRzLmdldChtb2RlbEZpbGUpOwotCQkJCQlyZXR1cm4gcm9vdC5nZXRDaGlsZHJlbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVByb3BlcnRpZXMgbW9kZWwgPSBuZXcgUHJvcGVydGllcygpOwotCQkJCQlpZiAobW9kZWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW1vZGVsLmxvYWQobW9kZWxGaWxlLmdldENvbnRlbnRzKCkpOwotCQkJCQkJCVRlc3RFeHRlbnNpb25UcmVlRGF0YSByb290ID0gbmV3IFRlc3RFeHRlbnNpb25UcmVlRGF0YSgKLQkJCQkJCQkJCW51bGwsIE1PREVMX1JPT1QsIG1vZGVsKTsKLQkJCQkJCQlyb290RWxlbWVudHMucHV0KG1vZGVsRmlsZSwgcm9vdCk7Ci0JCQkJCQkJcmV0dXJuIHJvb3QuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IAotCQllbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgVGVzdEV4dGVuc2lvblRyZWVEYXRhKSB7Ci0JCQlUZXN0RXh0ZW5zaW9uVHJlZURhdGEgZGF0YSA9IChUZXN0RXh0ZW5zaW9uVHJlZURhdGEpIHBhcmVudEVsZW1lbnQ7Ci0JCQlyZXR1cm4gZGF0YS5nZXRDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiBOT19DSElMRFJFTjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRlc3RFeHRlbnNpb25UcmVlRGF0YSkgewotCQkJVGVzdEV4dGVuc2lvblRyZWVEYXRhIGRhdGEgPSAoVGVzdEV4dGVuc2lvblRyZWVEYXRhKSBlbGVtZW50OwotCQkJcmV0dXJuIGRhdGEuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUZXN0RXh0ZW5zaW9uVHJlZURhdGEpIHsKLQkJCVRlc3RFeHRlbnNpb25UcmVlRGF0YSBkYXRhID0gKFRlc3RFeHRlbnNpb25UcmVlRGF0YSkgZWxlbWVudDsKLQkJCXJldHVybiBkYXRhLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJcm9vdEVsZW1lbnRzLmNsZWFyKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsgCi0JCWlmKG9sZElucHV0ICE9IG51bGwgJiYgIW9sZElucHV0LmVxdWFscyhuZXdJbnB1dCkpCi0JCQlyb290RWxlbWVudHMuY2xlYXIoKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvZXh0ZW5zaW9uL1Rlc3RFeHRlbnNpb25UcmVlRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvZXh0ZW5zaW9uL1Rlc3RFeHRlbnNpb25UcmVlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGYyMDY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL2V4dGVuc2lvbi9UZXN0RXh0ZW5zaW9uVHJlZURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIFRlc3RFeHRlbnNpb25UcmVlRGF0YSB7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcCBjaGlsZHJlbiA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIFRlc3RFeHRlbnNpb25UcmVlRGF0YSBwYXJlbnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIG1vZGVsOwotCi0JcHVibGljIFRlc3RFeHRlbnNpb25UcmVlRGF0YShUZXN0RXh0ZW5zaW9uVHJlZURhdGEgYVBhcmVudCwgU3RyaW5nIGFOYW1lLAotCQkJUHJvcGVydGllcyB0aGVNb2RlbCkgewotCQlwYXJlbnQgPSBhUGFyZW50OwotCQluYW1lID0gYU5hbWU7Ci0JCW1vZGVsID0gdGhlTW9kZWw7Ci0JfQotCi0JcHVibGljIFRlc3RFeHRlbnNpb25UcmVlRGF0YSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIFRlc3RFeHRlbnNpb25UcmVlRGF0YVtdIGdldENoaWxkcmVuKCkgewotCQlTZXQgdXBkYXRlZENoaWxkcmVuID0gbmV3IEhhc2hTZXQoKTsKLQkJU3RyaW5nIGNoaWxkcmVuU3RyaW5nID0gbW9kZWwuZ2V0UHJvcGVydHkoZ2V0TmFtZSgpKTsKLQkJaWYgKGNoaWxkcmVuU3RyaW5nICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIGNoaWxkcmVuRWxlbWVudHMgPSBjaGlsZHJlblN0cmluZy5zcGxpdCgiLCIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGNoaWxkcmVuLmNvbnRhaW5zS2V5KGNoaWxkcmVuRWxlbWVudHNbaV0pKSB7Ci0JCQkJCXVwZGF0ZWRDaGlsZHJlbi5hZGQoY2hpbGRyZW4uZ2V0KGNoaWxkcmVuRWxlbWVudHNbaV0pKTsKLQkJCQl9IGVsc2UgewotCQkJCQlUZXN0RXh0ZW5zaW9uVHJlZURhdGEgbmV3Q2hpbGQgPSBuZXcgVGVzdEV4dGVuc2lvblRyZWVEYXRhKAotCQkJCQkJCXRoaXMsIGNoaWxkcmVuRWxlbWVudHNbaV0sIG1vZGVsKTsKLQkJCQkJY2hpbGRyZW4ucHV0KG5ld0NoaWxkLmdldE5hbWUoKSwgbmV3Q2hpbGQpOwotCQkJCQl1cGRhdGVkQ2hpbGRyZW4uYWRkKG5ld0NoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChUZXN0RXh0ZW5zaW9uVHJlZURhdGFbXSkgdXBkYXRlZENoaWxkcmVuCi0JCQkJLnRvQXJyYXkobmV3IFRlc3RFeHRlbnNpb25UcmVlRGF0YVt1cGRhdGVkQ2hpbGRyZW4uc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gbmFtZS5oYXNoQ29kZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBUZXN0RXh0ZW5zaW9uVHJlZURhdGEKLQkJCQkmJiAoKFRlc3RFeHRlbnNpb25UcmVlRGF0YSkgb2JqKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciB0b1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0TmFtZSgpKS5hcHBlbmQoIjoiKTsKLQotCQl0b1N0cmluZy5hcHBlbmQoIlsiKTsKLQkJLy8gdXBkYXRlIGxvY2FsIGNoaWxkcmVuIHRvIHJlbW92ZSBhbnkgc3RhbGUga2lkcwotCQlmb3IgKEl0ZXJhdG9yIGNoaWxkSXRlcmF0b3IgPSBjaGlsZHJlbi5rZXlTZXQoKS5pdGVyYXRvcigpOyBjaGlsZEl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBjaGlsZE5hbWUgPSAoU3RyaW5nKSBjaGlsZEl0ZXJhdG9yLm5leHQoKTsKLQkJCVRlc3RFeHRlbnNpb25UcmVlRGF0YSBjaGlsZCA9IChUZXN0RXh0ZW5zaW9uVHJlZURhdGEpIGNoaWxkcmVuCi0JCQkJCS5nZXQoY2hpbGROYW1lKTsKLQkJCXRvU3RyaW5nLmFwcGVuZChjaGlsZC50b1N0cmluZygpKTsKLQkJfQotCQl0b1N0cmluZy5hcHBlbmQoIl0iKTsKLQkJcmV0dXJuIHRvU3RyaW5nLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9leHRlbnNpb24vVGVzdExhYmVsUHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL2V4dGVuc2lvbi9UZXN0TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGU1MTI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL2V4dGVuc2lvbi9UZXN0TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklFeHRlbnNpb25TdGF0ZU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgVGVzdExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbW1vbkxhYmVsUHJvdmlkZXIsIElEZXNjcmlwdGlvblByb3ZpZGVyIHsKLQotCXB1YmxpYyB2b2lkIGluaXQoSUV4dGVuc2lvblN0YXRlTW9kZWwgYVN0YXRlTW9kZWwsCi0JCQlJVHJlZUNvbnRlbnRQcm92aWRlciBhQ29udGVudFByb3ZpZGVyKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUZXN0RXh0ZW5zaW9uVHJlZURhdGEpCi0JCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZSgKLQkJCQkJSVNoYXJlZEltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUZXN0RXh0ZW5zaW9uVHJlZURhdGEpIHsKLQkJCVRlc3RFeHRlbnNpb25UcmVlRGF0YSBkYXRhID0gKFRlc3RFeHRlbnNpb25UcmVlRGF0YSkgZWxlbWVudDsKLQkJCXJldHVybiBkYXRhLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKE9iamVjdCBhbkVsZW1lbnQpIHsKLQkJaWYgKGFuRWxlbWVudCBpbnN0YW5jZW9mIFRlc3RFeHRlbnNpb25UcmVlRGF0YSkgewotCQkJVGVzdEV4dGVuc2lvblRyZWVEYXRhIGRhdGEgPSAoVGVzdEV4dGVuc2lvblRyZWVEYXRhKSBhbkVsZW1lbnQ7Ci0JCQlyZXR1cm4gIlRlc3RJdGVtOiAiICsgZGF0YS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvdXRpbC9Qcm9qZWN0VW56aXBVdGlsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci91dGlsL1Byb2plY3RVbnppcFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1OTFjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci91dGlsL1Byb2plY3RVbnppcFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5OYXZpZ2F0b3JUZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFByb2plY3RVbnppcFV0aWwgewotCi0JcHJpdmF0ZSBJUGF0aCB6aXBMb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZ1tdIHByb2plY3ROYW1lczsKLQlwcml2YXRlIElQYXRoIHJvb3RMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9QUk9KRUNUX05BTUUgPSAiLnByb2plY3QiOyAgIC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBQcm9qZWN0VW56aXBVdGlsKElQYXRoIGFMb2NhbFppcEZpbGVQYXRoLCBTdHJpbmdbXSBhUHJvamVjdE5hbWVzKSB7Ci0JCXppcExvY2F0aW9uID0gZ2V0TG9jYWxQYXRoKGFMb2NhbFppcEZpbGVQYXRoKTsKLQkJcHJvamVjdE5hbWVzID0gYVByb2plY3ROYW1lczsKLQotCX0gCi0KLQlwdWJsaWMgSVBhdGggZ2V0TG9jYWxQYXRoKElQYXRoIHppcEZpbGVQYXRoKSB7Ci0JCVVSTCB1cmwgPSBOYXZpZ2F0b3JUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZmluZCh6aXBGaWxlUGF0aCk7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKHVybC5nZXRQYXRoKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZVByb2plY3RzKCkgewotCQl0cnkgewotCQkJZXhwYW5kWmlwKCk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotCQkJYnVpbGRQcm9qZWN0cygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsgCi0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlc2V0KCkgewotCQl0cnkgewotCQkJZXhwYW5kWmlwKCk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOyAKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7IAotCX0KLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9nZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFppcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGdldFByb2dlc3NNb25pdG9yKCk7Ci0JCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl6aXBGaWxlID0gbmV3IFppcEZpbGUoemlwTG9jYXRpb24udG9GaWxlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJdGhyb3cgZTE7Ci0JCX0KLQkJRW51bWVyYXRpb24gZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOwotCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCW1vbml0b3Iuc3ViVGFzayhlbnRyeS5nZXROYW1lKCkpOwotCQkJRmlsZSBhRmlsZSA9IGNvbXB1dGVMb2NhdGlvbihlbnRyeS5nZXROYW1lKCkpLnRvRmlsZSgpOwotCQkJRmlsZSBwYXJlbnRGaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJYUZpbGUubWtkaXJzKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGFyZW50RmlsZSA9IGFGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJaWYgKCFwYXJlbnRGaWxlLmV4aXN0cygpKQotCQkJCQkJcGFyZW50RmlsZS5ta2RpcnMoKTsKLQkJCQkJaWYgKCFhRmlsZS5leGlzdHMoKSkKLQkJCQkJCWFGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQkJY29weSh6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KSwgbmV3IEZpbGVPdXRwdXRTdHJlYW0oYUZpbGUpKTsKLQkJCQkJaWYgKGVudHJ5LmdldFRpbWUoKSA+IDApCi0JCQkJCQlhRmlsZS5zZXRMYXN0TW9kaWZpZWQoZW50cnkuZ2V0VGltZSgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBjb21wdXRlTG9jYXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHJvb3RMb2NhdGlvbi5hcHBlbmQobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCQl0cnkgewotCQkJaW50IG4gPSBpbi5yZWFkKGJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlvdXQud3JpdGUoYnVmZmVyLCAwLCBuKTsKLQkJCQluID0gaW4ucmVhZChidWZmZXIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKLQkJCW91dC5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdExvY2F0aW9uKElQYXRoIHJvb3RMb2NhdGlvbikgewotCQl0aGlzLnJvb3RMb2NhdGlvbiA9IHJvb3RMb2NhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcm9qZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0KLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCi0JCQlJUGF0aCBwcm9qZWN0UGF0aCA9IG5ldyBQYXRoKCIvIiArIHByb2plY3ROYW1lc1tpXSArICIvIiArIE1FVEFfUFJPSkVDVF9OQU1FKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCUlQYXRoIHBhdGggPSByb290TG9jYXRpb24uYXBwZW5kKHByb2plY3RQYXRoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWVzW2ldKTsKLQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB3b3Jrc3BhY2UubG9hZFByb2plY3REZXNjcmlwdGlvbihwYXRoKTsKLQkJCXByb2plY3QuY3JlYXRlKGRlc2NyaXB0aW9uLCAoZ2V0UHJvZ2Vzc01vbml0b3IoKSkpOwotCQkJcHJvamVjdC5vcGVuKGdldFByb2dlc3NNb25pdG9yKCkpOwotCi0JCX0KLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3Ivc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci91dGlsL1Rlc3RXb3Jrc3BhY2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL3V0aWwvVGVzdFdvcmtzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjZiZGZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL3V0aWwvVGVzdFdvcmtzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotcHVibGljIGNsYXNzIFRlc3RXb3Jrc3BhY2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVF9OQU1FPSAiVGVzdCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RFU1REQVRBPSAiL3Rlc3RkYXRhL1Rlc3QuemlwIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKLQotCQkvLyBzZXR1cCB0ZXN0IHJlc291cmNlIHByb2plY3QKLQkJUHJvamVjdFVuemlwVXRpbCB1dGlsPSBuZXcgUHJvamVjdFVuemlwVXRpbChuZXcgUGF0aChURVNUX1RFU1REQVRBKSwgbmV3IFN0cmluZ1tde1RFU1RfUFJPSkVDVF9OQU1FfSk7Ci0KLQkJaWYgKCFnZXRUZXN0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQl1dGlsLmNyZWF0ZVByb2plY3RzKCk7Ci0JCX0gZWxzZSB7Ci0JCQl1dGlsLnJlc2V0KCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0VGVzdFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoVEVTVF9QUk9KRUNUX05BTUUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiMmE3YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvciIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzbmlmZi1mb2xkZXIiCi0gICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vbmF2aWdhdG9yX3NuaWZmX2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke3NuaWZmLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtzbmlmZi1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLk5hdmlnYXRvclRlc3RTdWl0ZSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3Rlc3RkYXRhL1Rlc3QuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yL3Rlc3RkYXRhL1Rlc3QuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM2ZTZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci90ZXN0ZGF0YS9UZXN0LnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTRlYWMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYWNmYjE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNGcmkgTWF5IDA2IDEyOjA1OjA4IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiZTExMzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1R1ZSBPY3QgMTggMTU6MTY6MTcgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkuamF2YWRvYz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcmV0dXJuIFJldHVybnMgdGhlICR7YmFyZV9maWVsZF9uYW1lfS5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcGFyYW0gJHtwYXJhbX0gVGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXQuXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgSmF2YSBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWxlY29tbWVudCIgbmFtZVw9ImZpbGVjb21tZW50Ij4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogQ29weXJpZ2h0IChjKSAke3llYXJ9IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4gKlxuICogQ29udHJpYnV0b3JzXDpcbiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcbiAqIEBzaW5jZSAzLjJcbiAqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCI+LyoqXG4gKiBcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cblxuJHt0eXBlY29tbWVudH1cbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9ja1xuJHtleGNlcHRpb25fdmFyfS5wcmludFN0YWNrVHJhY2UoKTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmJvZHkiIG5hbWVcPSJjb25zdHJ1Y3RvcmJvZHkiPiR7Ym9keV9zdGF0ZW1lbnR9XG4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWI8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5Ij5yZXR1cm4gJHtmaWVsZH07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjbGFzc2JvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNsYXNzIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNsYXNzYm9keSIgbmFtZVw9ImNsYXNzYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImludGVyZmFjZWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGludGVyZmFjZSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5pbnRlcmZhY2Vib2R5IiBuYW1lXD0iaW50ZXJmYWNlYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImVudW1ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmVudW1ib2R5IiBuYW1lXD0iZW51bWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJhbm5vdGF0aW9uYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgYW5ub3RhdGlvbiB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5hbm5vdGF0aW9uYm9keSIgbmFtZVw9ImFubm90YXRpb25ib2R5Ij5cbjwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODgzNjY2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI01vbiBGZWIgMjEgMTQ6MTc6MzYgRVNUIDIwMDUKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MgotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTEKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTEKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyYjMwMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFBlcmZvcm1hbmNlIFBsdWctaW4KLUJ1bmRsZS1DbGFzc1BhdGg6IHVpcGVyZm9ybWFuY2UuamFyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuVUlQZXJmb3JtYW5jZVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuaGFybmVzcywKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UudWkudmlld3MKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhMzI3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UudWlwZXJmb3JtYW5jZS5qYXIgPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgKi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHVpcGVyZm9ybWFuY2UuamFyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9pY29ucy9hbnl0aGluZy5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9pY29ucy9hbnl0aGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzc3YTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvaWNvbnMvYW55dGhpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvaWNvbnMvYmluYXJ5X2NvLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL2ljb25zL2JpbmFyeV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYTUwOGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvaWNvbnMvYmluYXJ5X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL2ljb25zL2R5bmFtaWMuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvaWNvbnMvZHluYW1pYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzc3YTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvaWNvbnMvZHluYW1pYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9pY29ucy9lZGl0b3IuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvaWNvbnMvZWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkOTJiZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9pY29ucy9lZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotR0lGODlhEA0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL2ljb25zL21vY2tlZGl0b3JwYXJ0MS5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9pY29ucy9tb2NrZWRpdG9ycGFydDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM3N2E3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL2ljb25zL21vY2tlZGl0b3JwYXJ0MS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9pY29ucy9tb2NrZWRpdG9ycGFydDIuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvaWNvbnMvbW9ja2VkaXRvcnBhcnQyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNzdhNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9pY29ucy9tb2NrZWRpdG9ycGFydDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvaWNvbnMvdmlldy5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9pY29ucy92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNzdhNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9pY29ucy92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmU4NzM1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbnl0aGluZy5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UucGFydHMuUGVyZm9ybWFuY2VFZGl0b3JQYXJ0IgotICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IkJhc2ljIFBlcmZvcm1hbmNlIEVkaXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmX2Jhc2ljIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0icGVyZl9iYXNpYyIvPgotICAgICAgICAgICAgCi0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbnl0aGluZy5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UucGFydHMuUGVyZm9ybWFuY2VFZGl0b3JQYXJ0Om91dGxpbmUiCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iRWRpdG9yIHcvT3V0bGluZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmX291dGxpbmUiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJwZXJmX291dGxpbmUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+Ci0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVBlcnNwZWN0aXZlMSIKLSAgICAgICAgICAgIG5hbWU9IlBlcmZvcm1hbmNlIFRlc3QgUGVyc3BlY3RpdmUxIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlUGVyc3BlY3RpdmUxIi8+Ci0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVBlcnNwZWN0aXZlMiIKLSAgICAgICAgICAgIG5hbWU9IlBlcmZvcm1hbmNlIFRlc3QgUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2VQZXJzcGVjdGl2ZTIiLz4gICAgCi0gICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBuYW1lPSJVSSBUZXN0IFN0YW5kYWxvbmUgVmlldyBQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5wcmVzZW50YXRpb25zLlN0YW5kYWxvbmVWaWV3UGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMucHJlc2VudGF0aW9ucy5TdGFuZGFsb25lVmlld1BlcnNwZWN0aXZlIj4KLSAgICAgIDwvcGVyc3BlY3RpdmU+Ci0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIG5hbWU9IlVJIFRlc3QgU3RhbmRhbG9uZSBWaWV3IFBlcnNwZWN0aXZlICAyICIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5wcmVzZW50YXRpb25zLlN0YW5kYWxvbmVWaWV3UGVyc3BlY3RpdmUyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnByZXNlbnRhdGlvbnMuU3RhbmRhbG9uZVZpZXdQZXJzcGVjdGl2ZTIiPgotICAgICAgPC9wZXJzcGVjdGl2ZT4gICAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3BlcmZvcm1hbmNlL0NvbWJvVmlld2VyUmVmcmVzaFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9Db21ib1ZpZXdlclJlZnJlc2hUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmM2E3NTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3BlcmZvcm1hbmNlL0NvbWJvVmlld2VyUmVmcmVzaFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlRlc3RSdW5uYWJsZTsKLQotLyoqCi0gKiBDb21ib1ZpZXdlclJlZnJlc2hUZXN0IGlzIGEgdGVzdCBvZiByZWZyZXNoZXMgb2YgZGlmZmVyZW5jZSBzaXplIGluIHRoZSBjb21ibwotICogdmlld2VyLgotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9WaWV3ZXJSZWZyZXNoVGVzdCBleHRlbmRzIFZpZXdlclRlc3QgewotCi0JQ29tYm9WaWV3ZXIgdmlld2VyOwotCi0JcHJpdmF0ZSBSZWZyZXNoVGVzdENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgRUxFTUVOVF9DT1VOVDsKLQotCXB1YmxpYyBDb21ib1ZpZXdlclJlZnJlc2hUZXN0KFN0cmluZyB0ZXN0TmFtZSwgaW50IHRhZ2dpbmcpIHsKLQkJc3VwZXIodGVzdE5hbWUsIHRhZ2dpbmcpOwotCi0JfQotCi0JcHVibGljIENvbWJvVmlld2VyUmVmcmVzaFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVZpZXdlcihTaGVsbCBzaGVsbCkgewotCQl2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoc2hlbGwpOwotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgUmVmcmVzaFRlc3RDb250ZW50UHJvdmlkZXIoRUxFTUVOVF9DT1VOVCk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIoZ2V0TGFiZWxQcm92aWRlcigpKTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSB0aW1lIGZvciBkb2luZyBhIHJlZnJlc2guCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVmcmVzaCgpIHRocm93cyBUaHJvd2FibGUgewotCi0JCUVMRU1FTlRfQ09VTlQgPSAxMDAwOwotCQlvcGVuQnJvd3NlcigpOwotCi0JCWV4ZXJjaXNlKG5ldyBUZXN0UnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc3RhcnRNZWFzdXJpbmcoKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCXByb2Nlc3NFdmVudHMoKTsKLQkJCQlzdG9wTWVhc3VyaW5nKCk7Ci0JCQl9Ci0JCX0sIE1JTl9JVEVSQVRJT05TLCBJVEVSQVRJT05TLAotCQkJCUpGYWNlUGVyZm9ybWFuY2VTdWl0ZS5NQVhfVElNRSk7Ci0KLQkJY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0JCWFzc2VydFBlcmZvcm1hbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB0aGUgdGltZSBmb3IgZG9pbmcgYSByZWZyZXNoLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlZnJlc2hTbWFsbCgpIHRocm93cyBUaHJvd2FibGUgewotCi0JCXRhZ0lmTmVjZXNzYXJ5KCJKRmFjZSAtIFJlZnJlc2ggNW8gaXRlbSBjb21ibyAxMDAwIHRpbWVzIiwKLQkJCQlEaW1lbnNpb24uRUxBUFNFRF9QUk9DRVNTKTsKLQotCQlFTEVNRU5UX0NPVU5UID0gNTA7Ci0JCW9wZW5Ccm93c2VyKCk7Ci0KLQkJZXhlcmNpc2UobmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzdGFydE1lYXN1cmluZygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCXByb2Nlc3NFdmVudHMoKTsKLQkJCQlzdG9wTWVhc3VyaW5nKCk7Ci0JCQl9Ci0JCX0sIE1JTl9JVEVSQVRJT05TLCBzbG93R1RLSXRlcmF0aW9ucygpLAotCQkJCUpGYWNlUGVyZm9ybWFuY2VTdWl0ZS5NQVhfVElNRSk7Ci0KLQkJY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0JCWFzc2VydFBlcmZvcm1hbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvRmFzdFRhYmxlVmlld2VyUmVmcmVzaFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9GYXN0VGFibGVWaWV3ZXJSZWZyZXNoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTNlNjVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9GYXN0VGFibGVWaWV3ZXJSZWZyZXNoVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5UZXN0UnVubmFibGU7Ci0KLXB1YmxpYyBjbGFzcyBGYXN0VGFibGVWaWV3ZXJSZWZyZXNoVGVzdCBleHRlbmRzIFRhYmxlVmlld2VyUmVmcmVzaFRlc3QgewotCi0JcHVibGljIEZhc3RUYWJsZVZpZXdlclJlZnJlc2hUZXN0KFN0cmluZyB0ZXN0TmFtZSwgaW50IHRhZ2dpbmcpIHsKLQkJc3VwZXIodGVzdE5hbWUsIHRhZ2dpbmcpOwotCX0KLQotCXB1YmxpYyBGYXN0VGFibGVWaWV3ZXJSZWZyZXNoVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIHRpbWUgZm9yIGRvaW5nIGEgcmVmcmVzaC4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZWZyZXNoTXVsdGlwbGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJb3BlbkJyb3dzZXIoKTsKLQotCQlleGVyY2lzZShuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN0YXJ0TWVhc3VyaW5nKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCXByb2Nlc3NFdmVudHMoKTsKLQotCQkJCX0KLQkJCQlzdG9wTWVhc3VyaW5nKCk7Ci0JCQl9Ci0JCX0sIE1JTl9JVEVSQVRJT05TLCBzbG93R1RLSXRlcmF0aW9ucygpLAotCQkJCUpGYWNlUGVyZm9ybWFuY2VTdWl0ZS5NQVhfVElNRSk7Ci0KLQkJY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0JCWFzc2VydFBlcmZvcm1hbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB0aGUgdGltZSBmb3IgZG9pbmcgYSByZWZyZXNoLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU11bHRpcGxlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCW9wZW5Ccm93c2VyKCk7Ci0KLQkJZXhlcmNpc2UoCi0JCQkJbmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3RhcnRNZWFzdXJpbmcoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGl0ZW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbal07Ci0JCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gUmVmcmVzaFRlc3RDb250ZW50UHJvdmlkZXIuYWxsRWxlbWVudHNbal07Ci0JCQkJCQkJCXZpZXdlci50ZXN0VXBkYXRlSXRlbShpdGVtLCBlbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQkJcHJvY2Vzc0V2ZW50cygpOwotCQkJCQkJfQotCi0JCQkJCQlzdG9wTWVhc3VyaW5nKCk7Ci0KLQkJCQkJfQotCQkJCX0sIE1JTl9JVEVSQVRJT05TLCBzbG93R1RLSXRlcmF0aW9ucygpLAotCQkJCUpGYWNlUGVyZm9ybWFuY2VTdWl0ZS5NQVhfVElNRSk7Ci0KLQkJY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0JCWFzc2VydFBlcmZvcm1hbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvRmFzdFRyZWVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvRmFzdFRyZWVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MDcwMTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3BlcmZvcm1hbmNlL0Zhc3RUcmVlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuVGVzdFJ1bm5hYmxlOwotCi1wdWJsaWMgY2xhc3MgRmFzdFRyZWVUZXN0IGV4dGVuZHMgVHJlZVRlc3QgewotCi0KLQlwdWJsaWMgRmFzdFRyZWVUZXN0KFN0cmluZyB0ZXN0TmFtZSwgaW50IHRhZ2dpbmcpIHsKLQkJc3VwZXIodGVzdE5hbWUsIHRhZ2dpbmcpOwotCX0KLQotCXB1YmxpYyBGYXN0VHJlZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGVzdCBhZGRpdGlvbiB0byB0aGUgdHJlZSBvbmUgZWxlbWVudCBhdCBhIHRpbWUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEFkZFRlblRlblRpbWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWRvVGVzdEFkZCgxMCwgVEVTVF9DT1VOVCwgZmFsc2UpOwotCX0KLQotCQotCS8qKgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRlc3QgYWRkaXRpb24gdG8gdGhlIHRyZWUgb25lIGVsZW1lbnQgYXQgYSB0aW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRGaWZ0eVRlblRpbWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWRvVGVzdEFkZCg1MCwgVEVTVF9DT1VOVCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRlc3QgYWRkaXRpb24gdG8gdGhlIHRyZWUgb25lIGVsZW1lbnQgYXQgYSB0aW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRIdW5kcmVkVGVuVGltZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJdGFnSWZOZWNlc3NhcnkoIkpGYWNlIC0gQWRkIDEwMDAwIGl0ZW1zIDEwMCBhdCBhIHRpbWUgVHJlZVZpZXdlciAxMCB0aW1lcyIsCi0JCQkJRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0JCXNldERlZ3JhZGF0aW9uQ29tbWVudCgiPGEgaHJlZj1odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAxODUzPlNlZSBCdWcgMTAxODUzPC9hPiAiKTsKLQotCQlkb1Rlc3RBZGQoMTAwLCBURVNUX0NPVU5ULCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUnVuIHRoZSB0ZXN0IGZvciBvbmUgb2YgdGhlIGZhc3QgaW5zZXJ0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gY291bnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1Rlc3RBZGQoZmluYWwgaW50IGluY3JlbWVudCwgZmluYWwgaW50IHRvdGFsLGZpbmFsIGJvb2xlYW4gcHJlU29ydCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlvcGVuQnJvd3NlcigpOwotCi0JCWV4ZXJjaXNlKG5ldyBUZXN0UnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLQkJCQlUZXN0VHJlZUVsZW1lbnQgaW5wdXQgPSBuZXcgVGVzdFRyZWVFbGVtZW50KDAsIG51bGwpOwotCQkJCXZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCQkJaW5wdXQuY3JlYXRlQ2hpbGRyZW4odG90YWwpOwotCQkJCWlmIChwcmVTb3J0KQotCQkJCQl2aWV3ZXIuZ2V0U29ydGVyKCkuc29ydCh2aWV3ZXIsIGlucHV0LmNoaWxkcmVuKTsKLQkJCQlDb2xsZWN0aW9uIGJhdGNoZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaW50IGJsb2NrcyA9IGlucHV0LmNoaWxkcmVuLmxlbmd0aCAvIGluY3JlbWVudDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGJsb2NrczsgaiA9IGogKyBpbmNyZW1lbnQpIHsKLQkJCQkJT2JqZWN0W10gYmF0Y2ggPSBuZXcgT2JqZWN0W2luY3JlbWVudF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoaW5wdXQuY2hpbGRyZW4sIGogKiBpbmNyZW1lbnQsIGJhdGNoLCAwLAotCQkJCQkJCWluY3JlbWVudCk7Ci0JCQkJCWJhdGNoZXMuYWRkKGJhdGNoKTsKLQkJCQl9Ci0JCQkJcHJvY2Vzc0V2ZW50cygpOwotCQkJCU9iamVjdFtdIGJhdGNoQXJyYXkgPSBiYXRjaGVzLnRvQXJyYXkoKTsKLQkJCQlzdGFydE1lYXN1cmluZygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJCQl2aWV3ZXIucmVtb3ZlKGlucHV0LmNoaWxkcmVuKTsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBiYXRjaEFycmF5Lmxlbmd0aDsgaysrKSB7Ci0JCQkJCQl2aWV3ZXIuYWRkKGlucHV0LCAoT2JqZWN0W10pIGJhdGNoQXJyYXlba10pOwotCQkJCQkJcHJvY2Vzc0V2ZW50cygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCi0JCQkJc3RvcE1lYXN1cmluZygpOwotCi0JCQl9Ci0JCX0sIE1JTl9JVEVSQVRJT05TLCBJVEVSQVRJT05TLCBKRmFjZVBlcmZvcm1hbmNlU3VpdGUuTUFYX1RJTUUpOwotCi0JCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3BlcmZvcm1hbmNlL0pGYWNlUGVyZm9ybWFuY2VTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3BlcmZvcm1hbmNlL0pGYWNlUGVyZm9ybWFuY2VTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODRkYWIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9KRmFjZVBlcmZvcm1hbmNlU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5CYXNpY1BlcmZvcm1hbmNlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5VSVBlcmZvcm1hbmNlVGVzdFNldHVwOwotCi0vKioKLSAqIFRoZSBKRmFjZVBlcmZvcm1hbmNlU3VpdGUgYXJlIHRoZSBwZXJmb3JtYW5jZSB0ZXN0cyBmb3IgSkZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRmFjZVBlcmZvcm1hbmNlU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCQotCS8vU29tZSBvZiB0aGVzZSB0ZXN0cyBhcmUgdmVyeSBzbG93IG9uIDMuMAotCS8vU3BlY2lmeSB0aGUgbWluaW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucwotCS8vYW5kIHRoZSB0aW1lIHRvIGRyb3AgZG93biB0byBhIGxvd2VyIG51bWJlcgotCQotCXB1YmxpYyBzdGF0aWMgaW50IE1BWF9USU1FID0gMTAwMDA7Ci0JCi0JLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VpdGUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgCXJldHVybiBuZXcgVUlQZXJmb3JtYW5jZVRlc3RTZXR1cChuZXcgSkZhY2VQZXJmb3JtYW5jZVN1aXRlKCkpOwotICAgIH0KLQotCXB1YmxpYyBKRmFjZVBlcmZvcm1hbmNlU3VpdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZFRlc3QobmV3IExpc3RWaWV3ZXJSZWZyZXNoVGVzdCgidGVzdFJlZnJlc2giKSk7Ci0JCWFkZFRlc3QobmV3IENvbWJvVmlld2VyUmVmcmVzaFRlc3QoInRlc3RSZWZyZXNoU21hbGwiLEJhc2ljUGVyZm9ybWFuY2VUZXN0LkxPQ0FMKSk7Ci0JCWFkZFRlc3QobmV3IEZhc3RUYWJsZVZpZXdlclJlZnJlc2hUZXN0KCJ0ZXN0UmVmcmVzaE11bHRpcGxlIikpOwotCQlhZGRUZXN0KG5ldyBGYXN0VGFibGVWaWV3ZXJSZWZyZXNoVGVzdCgidGVzdFVwZGF0ZU11bHRpcGxlIikpOwotCQlhZGRUZXN0KG5ldyBGYXN0VHJlZVRlc3QoInRlc3RBZGRUZW5UZW5UaW1lcyIpKTsKLQkJYWRkVGVzdChuZXcgRmFzdFRyZWVUZXN0KCJ0ZXN0QWRkRmlmdHlUZW5UaW1lcyIpKTsKLQkJYWRkVGVzdChuZXcgVHJlZVRlc3QoInRlc3RBZGRUaG91c2FuZCIpKTsKLQkJYWRkVGVzdChuZXcgRmFzdFRyZWVUZXN0KCJ0ZXN0QWRkSHVuZHJlZFRlblRpbWVzIiwgQmFzaWNQZXJmb3JtYW5jZVRlc3QuTE9DQUwpKTsKLQkJYWRkVGVzdChuZXcgVHJlZVRlc3QoInRlc3RBZGRUaG91c2FuZFByZVNvcnQiLCBCYXNpY1BlcmZvcm1hbmNlVGVzdC5HTE9CQUwpKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9MaXN0UG9wdWxhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9MaXN0UG9wdWxhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyOGIxYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvTGlzdFBvcHVsYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuQmFzaWNQZXJmb3JtYW5jZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuVGVzdFJ1bm5hYmxlOwotCi0vKioKLSAqIFRoZSBMaXN0UG9wdWxhdGlvblRlc3QgaXMgdGhlIHRlc3QgZm9yIHNpbXBsZQotICogU1dUIGxpc3RzLgotICoKLSAqLwotcHVibGljIGNsYXNzIExpc3RQb3B1bGF0aW9uVGVzdCBleHRlbmRzIEJhc2ljUGVyZm9ybWFuY2VUZXN0IHsKLQotCUxpc3QgbGlzdDsKLQotCXB1YmxpYyBMaXN0UG9wdWxhdGlvblRlc3QoU3RyaW5nIHRlc3ROYW1lLCBpbnQgdGFnZ2luZykgewotCQlzdXBlcih0ZXN0TmFtZSwgdGFnZ2luZyk7CQkKLQl9Ci0KLQlwdWJsaWMgTGlzdFBvcHVsYXRpb25UZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkJyb3dzZXIoKSB7Ci0JCURpc3BsYXkgZkRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGZEaXNwbGF5ID09IG51bGwpIHsKLQkJCWZEaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJfQotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChmRGlzcGxheSk7Ci0JCXNoZWxsLnNldFNpemUoNTAwLCA1MDApOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWxpc3QgPSBuZXcgTGlzdChzaGVsbCxTV1QuTk9ORSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJLy8gcHJvY2Vzc0V2ZW50cygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U21hbGxBZGQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJYWRkQmVuY2goMTAwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNtYWxsU2V0SXRlbXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJc2V0SXRlbXNCZW5jaCgxMDApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWVkaXVtQWRkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWFkZEJlbmNoKDUwMDApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWVkaXVtU2V0SXRlbXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJc2V0SXRlbXNCZW5jaCg1MDAwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExhcmdlQWRkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWFkZEJlbmNoKDUwMDAwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExhcmdlU2V0SXRlbXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJc2V0SXRlbXNCZW5jaCg1MDAwMCk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdGhlIHRpbWUgZm9yIGFkZGluZyBlbGVtZW50cyB1c2luZyBhZGQuCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCZW5jaChpbnQgY291bnQpIHRocm93cyBUaHJvd2FibGUgewotCQlvcGVuQnJvd3NlcigpOwkJCi0JCWZpbmFsIFN0cmluZyBbXSBpdGVtcyA9IGdldEl0ZW1zKGNvdW50KTsKLSAgICAgICAgCi0gICAgICAgIGV4ZXJjaXNlKG5ldyBUZXN0UnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgCQkJbGlzdC5yZW1vdmVBbGwoKTsKLSAgICAJCQlzdGFydE1lYXN1cmluZygpOwotICAgIAkJCWZvciAoaW50IGogPSAwOyBqIDwgaXRlbXMubGVuZ3RoOyBqKyspIHsKLSAgICAJCQkJbGlzdC5hZGQoaXRlbXNbal0pOwotICAgIAkJCX0KLSAgICAJCQlwcm9jZXNzRXZlbnRzKCk7Ci0gICAgCQkJc3RvcE1lYXN1cmluZygpOwotICAgIAkJfQotICAgICAgICB9KTsKLQkJCi0JCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRoZSB0aW1lIGZvciBhZGRpbmcgZWxlbWVudHMgdXNpbmcgc2V0SXRlbS4KLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEl0ZW1zQmVuY2goaW50IGNvdW50KSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJb3BlbkJyb3dzZXIoKTsJCQotCQlmaW5hbCBTdHJpbmcgW10gaXRlbXMgPSBnZXRJdGVtcyhjb3VudCk7Ci0gICAgICAgIGV4ZXJjaXNlKG5ldyBUZXN0UnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgCQkJbGlzdC5yZW1vdmVBbGwoKTsKLSAgICAJCQlzdGFydE1lYXN1cmluZygpOwotICAgIAkJCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotICAgIAkJCXByb2Nlc3NFdmVudHMoKTsKLSAgICAJCQlzdG9wTWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCQkKLQkJY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0JCWFzc2VydFBlcmZvcm1hbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvdW50IG51bWJlciBvZiBpdGVtcy4KLQkgKiBAcGFyYW0gY291bnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRJdGVtcyhpbnQgY291bnQpIHsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW2NvdW50XTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBpdGVtcy5sZW5ndGg7IGorKykgewotCQkJaXRlbXNbal0gPSAiRWxlbWVudCAiICsgU3RyaW5nLnZhbHVlT2Yoaik7Ci0JCQkKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvTGlzdFZpZXdlclJlZnJlc2hUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvTGlzdFZpZXdlclJlZnJlc2hUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzEwYjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3BlcmZvcm1hbmNlL0xpc3RWaWV3ZXJSZWZyZXNoVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlRlc3RSdW5uYWJsZTsKLQotLyoqCi0gKiBUaGUgTGlzdFZpZXdlclJlZnJlc2hUZXN0IGlzIGEgdGVzdCBvZiByZWZyZXNoaW5nIHRoZSBsaXN0IHZpZXdlci4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGlzdFZpZXdlclJlZnJlc2hUZXN0IGV4dGVuZHMgVmlld2VyVGVzdCB7Ci0KLQlMaXN0Vmlld2VyIHZpZXdlcjsKLQotCXByaXZhdGUgUmVmcmVzaFRlc3RDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JcHVibGljIExpc3RWaWV3ZXJSZWZyZXNoVGVzdChTdHJpbmcgdGVzdE5hbWUsIGludCB0YWdnaW5nKSB7Ci0JCXN1cGVyKHRlc3ROYW1lLCB0YWdnaW5nKTsKLQotCX0KLQotCXB1YmxpYyBMaXN0Vmlld2VyUmVmcmVzaFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMucGVyZm9ybWFuY2UuVmlld2VyVGVzdCNjcmVhdGVWaWV3ZXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlVmlld2VyKFNoZWxsIHNoZWxsKSB7Ci0JCXZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHNoZWxsKTsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IFJlZnJlc2hUZXN0Q29udGVudFByb3ZpZGVyKAotCQkJCVJlZnJlc2hUZXN0Q29udGVudFByb3ZpZGVyLkVMRU1FTlRfQ09VTlQpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGdldExhYmVsUHJvdmlkZXIoKSk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB0aGUgdGltZSBmb3IgZG9pbmcgYSByZWZyZXNoLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlZnJlc2goKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQotCQl0YWdJZk5lY2Vzc2FyeSgiSkZhY2UgLSBSZWZyZXNoIDEwMCBpdGVtIExpc3RWaWV3ZXIgMTAgdGltZXMiLAotCQkJCURpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOwotCQlzZXREZWdyYWRhdGlvbkNvbW1lbnQoIjxhIGhyZWY9aHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk5MDIyPlNlZSBCdWcgOTkwMjI8L2E+ICIpOwotCi0JCW9wZW5Ccm93c2VyKCk7Ci0KLQkJZXhlcmNpc2UobmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzdGFydE1lYXN1cmluZygpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJcHJvY2Vzc0V2ZW50cygpOwotCQkJCXN0b3BNZWFzdXJpbmcoKTsKLQkJCX0KLQkJfSwgTUlOX0lURVJBVElPTlMsIElURVJBVElPTlMsCi0JCQkJSkZhY2VQZXJmb3JtYW5jZVN1aXRlLk1BWF9USU1FKTsKLQotCQljb21taXRNZWFzdXJlbWVudHMoKTsKLQkJYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9SZWZyZXNoVGVzdENvbnRlbnRQcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3BlcmZvcm1hbmNlL1JlZnJlc2hUZXN0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NjIzYzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3BlcmZvcm1hbmNlL1JlZnJlc2hUZXN0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi0vKioKLSAqIFRoZSBSZWZyZXNoVGVzdENvbnRlbnRQcm92aWRlciBpcyB0aGUgY29udGVudAotICogcHJvdmlkZXIgZm9yIHJlZnJlc2ggdGVzdHMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaFRlc3RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQlzdGF0aWMgaW50IHNlZWQgPSAxOwotCXN0YXRpYyBUZXN0RWxlbWVudFtdIGFsbEVsZW1lbnRzOwotCXB1YmxpYyBzdGF0aWMgaW50IEVMRU1FTlRfQ09VTlQgPSAxMDAwMDsKLQlUZXN0RWxlbWVudFtdIGN1cnJlbnRFbGVtZW50czsKLQkKLQlzdGF0aWN7Ci0JCWFsbEVsZW1lbnRzID0gbmV3IFRlc3RFbGVtZW50W0VMRU1FTlRfQ09VTlRdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IEVMRU1FTlRfQ09VTlQ7IGkrKykgewotCQkJYWxsRWxlbWVudHNbaV0gPSBuZXcgVGVzdEVsZW1lbnQoaSk7CQkJCi0JCX0KLQl9Ci0JCi0Jdm9pZCBwcmVTb3J0RWxlbWVudHMoVmlld2VyIHZpZXdlciwgVmlld2VyU29ydGVyIHNvcnRlcil7Ci0JCXNvcnRlci5zb3J0KHZpZXdlcixjdXJyZW50RWxlbWVudHMpOwotCQkKLQl9Ci0JCi0JcHVibGljIFJlZnJlc2hUZXN0Q29udGVudFByb3ZpZGVyKGludCBzaXplKXsKLQkJQXNzZXJ0LmlzVHJ1ZShzaXplIDw9IEVMRU1FTlRfQ09VTlQpOwotCQlzZXRTaXplKHNpemUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHNpemUgb2YgdGhlIGFtb3VudCB3ZSBhcmUgY3VycmVudGx5IGRpc3BsYXlpbmcgCi0JICogdG8gc2l6ZS4KLQkgKiBAcGFyYW0gc2l6ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemUoaW50IHNpemUpIHsKLQkJCi0JCWN1cnJlbnRFbGVtZW50cyA9IG5ldyBUZXN0RWxlbWVudFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWN1cnJlbnRFbGVtZW50c1tpXSA9IGFsbEVsZW1lbnRzW2ldOwotCQl9Ci0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gY3VycmVudEVsZW1lbnRzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljdXJyZW50RWxlbWVudHMgPSBudWxsOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy9EbyBub3RoaW5nIGhlcmUKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHRoZSBlbGVtZW50cyB0byB0aGllciBvbGQgcG9vcmx5IHNvcnRlZAotCSAqIHN0YXRlLgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEVsZW1lbnRzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IEVMRU1FTlRfQ09VTlQ7IGkrKykgewotCQkJY3VycmVudEVsZW1lbnRzW2ldID0gbmV3IFRlc3RFbGVtZW50KGkgKyBzZWVkKTsJCQkKLQkJfQotCQlzZWVkICs9IDI1NzsKLQkJCi0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9uZUVsZW1lbnRzKCl7Ci0JCWN1cnJlbnRFbGVtZW50cyA9IChUZXN0RWxlbWVudCBbXSApY3VycmVudEVsZW1lbnRzLmNsb25lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvUmVmcmVzaFRlc3RUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvUmVmcmVzaFRlc3RUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMmYwZWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3BlcmZvcm1hbmNlL1JlZnJlc2hUZXN0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBSZWZyZXNoVGVzdFRyZWVDb250ZW50UHJvdmlkZXIgaXMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRlc3QgdHJlZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoVGVzdFRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLSAgICBzdGF0aWMgVGVzdFRyZWVFbGVtZW50W10gZWxlbWVudHM7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgZWxlbWVudHMgPSBuZXcgVGVzdFRyZWVFbGVtZW50W1JlZnJlc2hUZXN0Q29udGVudFByb3ZpZGVyLkVMRU1FTlRfQ09VTlRdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJlZnJlc2hUZXN0Q29udGVudFByb3ZpZGVyLkVMRU1FTlRfQ09VTlQ7IGkrKykgewotICAgICAgICAgICBlbGVtZW50c1tpXSA9IChuZXcgVGVzdFRyZWVFbGVtZW50KGksbnVsbCkpOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgCi0gICAgfQotCi0gICAgcHVibGljIFJlZnJlc2hUZXN0VHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLSAgICAgICByZXR1cm4gKChUZXN0VHJlZUVsZW1lbnQpcGFyZW50RWxlbWVudCkuY2hpbGRyZW47Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuICgoVGVzdFRyZWVFbGVtZW50KWVsZW1lbnQpLnBhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gKChUZXN0VHJlZUVsZW1lbnQpZWxlbWVudCkuY2hpbGRyZW4ubGVuZ3RoID4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgIHJldHVybiBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvU1dUVHJlZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9TV1RUcmVlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmRmMTFjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9TV1RUcmVlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5CYXNpY1BlcmZvcm1hbmNlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5UZXN0UnVubmFibGU7Ci0KLXB1YmxpYyBjbGFzcyBTV1RUcmVlVGVzdCBleHRlbmRzIEJhc2ljUGVyZm9ybWFuY2VUZXN0IHsKLQotCVNoZWxsIGJyb3dzZXJTaGVsbDsKLQotCVRyZWUgdHJlZTsKLQotCXB1YmxpYyBTV1RUcmVlVGVzdChTdHJpbmcgdGVzdE5hbWUsIGludCB0YWdnaW5nKSB7Ci0JCXN1cGVyKHRlc3ROYW1lLCB0YWdnaW5nKTsKLQl9Ci0KLQlwdWJsaWMgU1dUVHJlZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQnJvd3NlcigpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpIHsKLQkJCWRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQl9Ci0JCWJyb3dzZXJTaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJYnJvd3NlclNoZWxsLnNldFNpemUoNTAwLCA1MDApOwotCQlicm93c2VyU2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0cmVlID0gbmV3IFRyZWUoYnJvd3NlclNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNyZWF0ZUNoaWxkcmVuKCk7Ci0JCWJyb3dzZXJTaGVsbC5vcGVuKCk7Ci0JCS8vIHByb2Nlc3NFdmVudHMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVHJlZVRlc3QuVEVTVF9DT1VOVDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgiRWxlbWVudCAiICsgU3RyaW5nLnZhbHVlT2YoaSkpOwotCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIGdldEl0ZW1zIEFQSS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SXRlbXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW9wZW5Ccm93c2VyKCk7Ci0KLSAgICAgICAgZXhlcmNpc2UobmV3IFRlc3RSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHByb2Nlc3NFdmVudHMoKTsKLSAgICAgICAgICAgICAgICBzdGFydE1lYXN1cmluZygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgVHJlZVRlc3QuVEVTVF9DT1VOVDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyZWUuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdG9wTWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9KTsKLSAgICAgICAgCi0JCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotCQlicm93c2VyU2hlbGwuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICogVGVzdCB0aGUgZ2V0SXRlbSBBUEkuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldEl0ZW1BdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJb3BlbkJyb3dzZXIoKTsKLQotICAgICAgICBleGVyY2lzZShuZXcgVGVzdFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICAgICAgICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBUcmVlVGVzdC5URVNUX0NPVU5UOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdHJlZS5nZXRJdGVtKGopOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXZlbnRzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0b3BNZWFzdXJpbmcoKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0pOwotCi0JCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotCQlicm93c2VyU2hlbGwuY2xvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9UYWJsZVZpZXdlclJlZnJlc2hUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvVGFibGVWaWV3ZXJSZWZyZXNoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTE5NWY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9UYWJsZVZpZXdlclJlZnJlc2hUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5UZXN0UnVubmFibGU7Ci0KLS8qKgotICogVGhlIFRhYmxlVmlld2VyUmVmcmVzaFRlc3QgaXMgYSB0ZXN0IGZvciByZWZyZXNoaW5nIHRoZSBUYWJsZVZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIFRhYmxlVmlld2VyUmVmcmVzaFRlc3QgZXh0ZW5kcyBWaWV3ZXJUZXN0IHsKLQotCWNsYXNzIFRlc3RUYWJsZVZpZXdlciBleHRlbmRzIFRhYmxlVmlld2VyIHsKLQotCQlwdWJsaWMgVGVzdFRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCX0KLQotCQlwdWJsaWMgVGVzdFRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgVGVzdFRhYmxlVmlld2VyKFRhYmxlIHRhYmxlKSB7Ci0JCQlzdXBlcih0YWJsZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSXRlbShXaWRnZXQgd2lkZ2V0LCBPYmplY3QgZWxlbWVudCkgewotCQkJdXBkYXRlSXRlbSh3aWRnZXQsIGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JVGVzdFRhYmxlVmlld2VyIHZpZXdlcjsKLQotCXByaXZhdGUgUmVmcmVzaFRlc3RDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JcHVibGljIFRhYmxlVmlld2VyUmVmcmVzaFRlc3QoU3RyaW5nIHRlc3ROYW1lLCBpbnQgdGFnZ2luZykgewotCQlzdXBlcih0ZXN0TmFtZSwgdGFnZ2luZyk7Ci0JfQotCi0JcHVibGljIFRhYmxlVmlld2VyUmVmcmVzaFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnBlcmZvcm1hbmNlLlZpZXdlclRlc3QjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVZpZXdlcihTaGVsbCBzaGVsbCkgewotCQl2aWV3ZXIgPSBuZXcgVGVzdFRhYmxlVmlld2VyKHNoZWxsKTsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IFJlZnJlc2hUZXN0Q29udGVudFByb3ZpZGVyKAotCQkJCVJlZnJlc2hUZXN0Q29udGVudFByb3ZpZGVyLkVMRU1FTlRfQ09VTlQpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGdldExhYmVsUHJvdmlkZXIoKSk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB0aGUgdGltZSBmb3IgZG9pbmcgYSByZWZyZXNoLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlZnJlc2goKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJb3BlbkJyb3dzZXIoKTsKLQotCQlleGVyY2lzZShuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN0YXJ0TWVhc3VyaW5nKCk7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQlwcm9jZXNzRXZlbnRzKCk7Ci0JCQkJc3RvcE1lYXN1cmluZygpOwotCQkJfQotCQl9LCBNSU5fSVRFUkFUSU9OUywgc2xvd0dUS0l0ZXJhdGlvbnMoKSwKLQkJCQlKRmFjZVBlcmZvcm1hbmNlU3VpdGUuTUFYX1RJTUUpOwotCi0JCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIHRpbWUgZm9yIGRvaW5nIGEgcmVmcmVzaC4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZWZyZXNoU29ydGVkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCW9wZW5Ccm93c2VyKCk7Ci0JCXZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQotCQlleGVyY2lzZShuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN0YXJ0TWVhc3VyaW5nKCk7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQlwcm9jZXNzRXZlbnRzKCk7Ci0JCQkJc3RvcE1lYXN1cmluZygpOwotCQkJfQotCQl9LCBNSU5fSVRFUkFUSU9OUywgc2xvd0dUS0l0ZXJhdGlvbnMoKSwKLQkJCQlKRmFjZVBlcmZvcm1hbmNlU3VpdGUuTUFYX1RJTUUpOwotCi0JCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIHRpbWUgZm9yIGRvaW5nIGEgcmVmcmVzaC4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZWZyZXNoUHJlU29ydGVkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCW9wZW5Ccm93c2VyKCk7Ci0JCWZpbmFsIFZpZXdlclNvcnRlciBzb3J0ZXIgPSBuZXcgVmlld2VyU29ydGVyKCk7Ci0JCXZpZXdlci5zZXRTb3J0ZXIoc29ydGVyKTsKLQotCQlleGVyY2lzZShuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWNvbnRlbnRQcm92aWRlci5yZWZyZXNoRWxlbWVudHMoKTsKLQkJCQlzdGFydE1lYXN1cmluZygpOwotCQkJCWNvbnRlbnRQcm92aWRlci5jbG9uZUVsZW1lbnRzKCk7Ci0JCQkJY29udGVudFByb3ZpZGVyLnByZVNvcnRFbGVtZW50cyh2aWV3ZXIsIHNvcnRlcik7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQlwcm9jZXNzRXZlbnRzKCk7Ci0JCQkJc3RvcE1lYXN1cmluZygpOwotCQkJfQotCQl9LCBNSU5fSVRFUkFUSU9OUywgSVRFUkFUSU9OUywKLQkJCQlKRmFjZVBlcmZvcm1hbmNlU3VpdGUuTUFYX1RJTUUpOwotCi0JCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIHRpbWUgZm9yIGRvaW5nIGEgcmVmcmVzaC4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJb3BlbkJyb3dzZXIoKTsKLQotCQlleGVyY2lzZShuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCi0JCQkJVGFibGVJdGVtW10gaXRlbXMgPSB2aWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotCQkJCXN0YXJ0TWVhc3VyaW5nKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpdGVtcy5sZW5ndGg7IGorKykgewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zW2pdOwotCQkJCQlPYmplY3QgZWxlbWVudCA9IFJlZnJlc2hUZXN0Q29udGVudFByb3ZpZGVyLmFsbEVsZW1lbnRzW2pdOwotCi0JCQkJCXZpZXdlci50ZXN0VXBkYXRlSXRlbShpdGVtLCBlbGVtZW50KTsKLQotCQkJCX0KLQkJCQlwcm9jZXNzRXZlbnRzKCk7Ci0JCQkJc3RvcE1lYXN1cmluZygpOwotCi0JCQl9Ci0JCX0sIE1JTl9JVEVSQVRJT05TLCBzbG93R1RLSXRlcmF0aW9ucygpLAotCQkJCUpGYWNlUGVyZm9ybWFuY2VTdWl0ZS5NQVhfVElNRSk7Ci0KLQkJY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0JCWFzc2VydFBlcmZvcm1hbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvVGVzdEVsZW1lbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9UZXN0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTAxOTAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9UZXN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMucGVyZm9ybWFuY2U7Ci0KLS8qKgotICogVGhlIFRlc3RFbGVtZW50IGlzIHRoZSBlbGVtZW50IHVzZWQgZm9yIHRlc3RpbmcKLSAqIHZpZXdlcnMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEVsZW1lbnQgewotCQotCVN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgVGVzdEVsZW1lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICovCi0JcHVibGljIFRlc3RFbGVtZW50KGludCBpbmRleCkgewotCQluYW1lID0gVGVzdFRyZWVFbGVtZW50LmdlbmVyYXRlRmlyc3RFbnRyeSgpICsgU3RyaW5nLnZhbHVlT2YoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3BlcmZvcm1hbmNlL1Rlc3RUcmVlRWxlbWVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3BlcmZvcm1hbmNlL1Rlc3RUcmVlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWQzZTM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9UZXN0VHJlZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMucGVyZm9ybWFuY2U7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RUcmVlRWxlbWVudCBleHRlbmRzIFRlc3RFbGVtZW50IHsKLQotCVRlc3RUcmVlRWxlbWVudCBwYXJlbnQ7Ci0KLQlUZXN0VHJlZUVsZW1lbnRbXSBjaGlsZHJlbiA9IG5ldyBUZXN0VHJlZUVsZW1lbnRbMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXggPSAwOwotCi0Jc3RhdGljIFN0cmluZyBjaGFyYWN0ZXJzID0gIk0xTnFCd1YyQ2VYclozTHRLeUo0SHVHaUY1RG9TcEE2UGFPc0k3VWRZZlQ4UmdFaFc5UWprMERsV3pNeFVjc3ZmYndubSI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyIC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gdHJlZVBhcmVudAotCSAqLwotCXB1YmxpYyBUZXN0VHJlZUVsZW1lbnQoaW50IGluZGV4LCBUZXN0VHJlZUVsZW1lbnQgdHJlZVBhcmVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhcmVudCA9IHRyZWVQYXJlbnQ7Ci0JCW5hbWUgPSBnZW5lcmF0ZUZpcnN0RW50cnkoKSArIFN0cmluZy52YWx1ZU9mKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhIHJhbmRvbSBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdlbmVyYXRlRmlyc3RFbnRyeSgpIHsKLQotCQlTdHJpbmcgbmV4dCA9IGNoYXJhY3RlcnMuc3Vic3RyaW5nKGluZGV4KTsKLQkJaW5kZXgrKzsKLQkJaWYgKGluZGV4ID4gY2hhcmFjdGVycy5sZW5ndGgoKSAtIDIpCi0JCQlpbmRleCA9IDA7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBjb3VudCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSBjb3VudAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNoaWxkcmVuKGludCBjb3VudCkgewotCQljaGlsZHJlbiA9IG5ldyBUZXN0VHJlZUVsZW1lbnRbY291bnRdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWNoaWxkcmVuW2ldID0gbmV3IFRlc3RUcmVlRWxlbWVudChpLCB0aGlzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3BlcmZvcm1hbmNlL1RyZWVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvVHJlZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzZTQ2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvVHJlZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuVGVzdFJ1bm5hYmxlOwotCi1wdWJsaWMgY2xhc3MgVHJlZVRlc3QgZXh0ZW5kcyBWaWV3ZXJUZXN0IHsKLQotCVRyZWVWaWV3ZXIgdmlld2VyOwotCi0Jc3RhdGljIGludCBURVNUX0NPVU5UID0gMTAwMDsKLQotCXB1YmxpYyBUcmVlVGVzdChTdHJpbmcgdGVzdE5hbWUsIGludCB0YWdnaW5nKSB7Ci0JCXN1cGVyKHRlc3ROYW1lLCB0YWdnaW5nKTsKLQl9Ci0KLQlwdWJsaWMgVHJlZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnBlcmZvcm1hbmNlLlZpZXdlclRlc3QjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVZpZXdlcihTaGVsbCBzaGVsbCkgewotCQl2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihicm93c2VyU2hlbGwpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIoZ2V0TGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQl2aWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnBlcmZvcm1hbmNlLlZpZXdlclRlc3QjZ2V0SW5pdGlhbElucHV0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldEluaXRpYWxJbnB1dCgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0VHJlZUVsZW1lbnQoMCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgY29udGVudCBwcm92aWRlciBmb3IgdGhlIHRyZWUgdmlld2VyLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJVGVzdFRyZWVFbGVtZW50IGVsZW1lbnQgPSAoVGVzdFRyZWVFbGVtZW50KSBwYXJlbnRFbGVtZW50OwotCQkJCXJldHVybiBlbGVtZW50LmNoaWxkcmVuOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoVGVzdFRyZWVFbGVtZW50KSBlbGVtZW50KS5wYXJlbnQ7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKFRlc3RUcmVlRWxlbWVudCkgZWxlbWVudCkuY2hpbGRyZW4ubGVuZ3RoID4gMDsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGlucHV0RWxlbWVudCB9OwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvLyBEbyBub3RoaW5nIGhlcmUKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQkvLyBEbyBub3RoaW5nIGhlcmUKLQkJCX0KLQotCQl9OwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRlc3QgYWRkaXRpb24gdG8gdGhlIHRyZWUgb25lIGVsZW1lbnQgYXQgYSB0aW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRPbmVBdEFUaW1lKCkgewotCQlvcGVuQnJvd3NlcigpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgSVRFUkFUSU9OUyAvIDEwOyBpKyspIHsKLQkJCVRlc3RUcmVlRWxlbWVudCBpbnB1dCA9IG5ldyBUZXN0VHJlZUVsZW1lbnQoMCwgbnVsbCk7Ci0JCQl2aWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQkJaW5wdXQuY3JlYXRlQ2hpbGRyZW4oVEVTVF9DT1VOVCk7Ci0JCQlwcm9jZXNzRXZlbnRzKCk7Ci0JCQlzdGFydE1lYXN1cmluZygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbnB1dC5jaGlsZHJlbi5sZW5ndGg7IGorKykgewotCi0JCQkJdmlld2VyLmFkZChpbnB1dCwgaW5wdXQuY2hpbGRyZW5bal0pOwotCQkJCXByb2Nlc3NFdmVudHMoKTsKLQotCQkJfQotCQkJc3RvcE1lYXN1cmluZygpOwotCQl9Ci0KLQkJY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0JCWFzc2VydFBlcmZvcm1hbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGVzdCBhZGRpdGlvbiB0byB0aGUgdHJlZSBvbmUgZWxlbWVudCBhdCBhIHRpbWUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEFkZFRlbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlkb1Rlc3RBZGQoMTAsIFRFU1RfQ09VTlQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUZXN0IGFkZGl0aW9uIHRvIHRoZSB0cmVlIG9uZSBlbGVtZW50IGF0IGEgdGltZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkRmlmdHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJZG9UZXN0QWRkKDUwLCBURVNUX0NPVU5ULCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGVzdCBhZGRpdGlvbiB0byB0aGUgdHJlZSBvbmUgZWxlbWVudCBhdCBhIHRpbWUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEFkZEh1bmRyZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJdGFnSWZOZWNlc3NhcnkoIkpGYWNlIC0gQWRkIDEwMDAgaXRlbXMgaW4gMTAgYmxvY2tzIHRvIFRyZWVWaWV3ZXIiLAotCQkJCURpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOwotCQlzZXREZWdyYWRhdGlvbkNvbW1lbnQoIjxhIGhyZWY9aHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTg1Mz5TZWUgQnVnIDEwMTg1MzwvYT4gIik7Ci0KLQkJZG9UZXN0QWRkKDEwMCwgVEVTVF9DT1VOVCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJ1biB0aGUgdGVzdCBmb3Igb25lIG9mIHRoZSBmYXN0IGluc2VydGlvbnMuCi0JICogCi0JICogQHBhcmFtIGNvdW50Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9UZXN0QWRkKGZpbmFsIGludCBpbmNyZW1lbnQsIGZpbmFsIGludCB0b3RhbCxmaW5hbCBib29sZWFuIHByZVNvcnQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJb3BlbkJyb3dzZXIoKTsKLQotCQlleGVyY2lzZShuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCi0JCQkJVGVzdFRyZWVFbGVtZW50IGlucHV0ID0gbmV3IFRlc3RUcmVlRWxlbWVudCgwLCBudWxsKTsKLQkJCQl2aWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQkJCWlucHV0LmNyZWF0ZUNoaWxkcmVuKHRvdGFsKTsKLQkJCQlpZiAocHJlU29ydCkKLQkJCQkJdmlld2VyLmdldFNvcnRlcigpLnNvcnQodmlld2VyLCBpbnB1dC5jaGlsZHJlbik7Ci0JCQkJQ29sbGVjdGlvbiBiYXRjaGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWludCBibG9ja3MgPSBpbnB1dC5jaGlsZHJlbi5sZW5ndGggLyBpbmNyZW1lbnQ7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBibG9ja3M7IGogPSBqICsgaW5jcmVtZW50KSB7Ci0JCQkJCU9iamVjdFtdIGJhdGNoID0gbmV3IE9iamVjdFtpbmNyZW1lbnRdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGlucHV0LmNoaWxkcmVuLCBqICogaW5jcmVtZW50LCBiYXRjaCwgMCwKLQkJCQkJCQlpbmNyZW1lbnQpOwotCQkJCQliYXRjaGVzLmFkZChiYXRjaCk7Ci0JCQkJfQotCQkJCXByb2Nlc3NFdmVudHMoKTsKLQkJCQlPYmplY3RbXSBiYXRjaEFycmF5ID0gYmF0Y2hlcy50b0FycmF5KCk7Ci0JCQkJc3RhcnRNZWFzdXJpbmcoKTsKLQotCQkJCS8vIE1lYXN1cmUgbW9yZSB0aGFuIG9uZSBmb3IgdGhlIGZhc3QgY2FzZXMKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGJhdGNoQXJyYXkubGVuZ3RoOyBrKyspIHsKLQkJCQkJdmlld2VyLmFkZChpbnB1dCwgKE9iamVjdFtdKSBiYXRjaEFycmF5W2tdKTsKLQkJCQkJcHJvY2Vzc0V2ZW50cygpOwotCQkJCX0KLQotCQkJCXN0b3BNZWFzdXJpbmcoKTsKLQotCQkJfQotCQl9LCBNSU5fSVRFUkFUSU9OUywgSVRFUkFUSU9OUywgSkZhY2VQZXJmb3JtYW5jZVN1aXRlLk1BWF9USU1FKTsKLQotCQljb21taXRNZWFzdXJlbWVudHMoKTsKLQkJYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLQotCX0KLQotCS8qKgotCSAqIFRlc3QgYWRkaXRpb24gdG8gdGhlIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEFkZFRob3VzYW5kKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlkb1Rlc3RBZGQoMTAwMCwgMjAwMCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRlc3QgYWRkaXRpb24gdG8gdGhlIHRyZWUgb25lIGVsZW1lbnQgYXQgYSB0aW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRUd29UaG91c2FuZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlkb1Rlc3RBZGQoMjAwMCwgNDAwMCwgZmFsc2UpOwotCi0JfQotCi0JLyoqCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGVzdCBhZGRpdGlvbiB0byB0aGUgdHJlZSB3aXRoIHRoZSBpdGVtcyBwcmVzb3J0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEFkZEh1bmRyZWRQcmVTb3J0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWRvVGVzdEFkZCgxMDAsIDEwMDAsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRlc3QgYWRkaXRpb24gdG8gdGhlIHRyZWUgd2l0aCB0aGUgaXRlbXMgcHJlc29ydGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRUaG91c2FuZFByZVNvcnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRhZ0lmTmVjZXNzYXJ5KCJKRmFjZSAtIEFkZCAyMDAwIGl0ZW1zIGluIDIgYmxvY2tzIHRvIFRyZWVWaWV3ZXIiLAotCQkJCURpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOwotCi0JCWRvVGVzdEFkZCgxMDAwLCAyMDAwLCB0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9UcmVlVmlld2VyUmVmcmVzaFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9UcmVlVmlld2VyUmVmcmVzaFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0NmY2OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvVHJlZVZpZXdlclJlZnJlc2hUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBUaGUgVHJlZVZpZXdlclJlZnJlc2hUZXN0IGlzIHRoZSByZWZyZXNoIHRlc3QgZm9yIAotICogdHJlZSB2aWV3ZXJzLgotICoKLSAqLwotcHVibGljIGNsYXNzIFRyZWVWaWV3ZXJSZWZyZXNoVGVzdCBleHRlbmRzIFZpZXdlclRlc3QgewotICAgIAotICAgIFRyZWVWaWV3ZXIgdmlld2VyOwotICAgIHByaXZhdGUgUmVmcmVzaFRlc3RUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotICAgIHB1YmxpYyBUcmVlVmlld2VyUmVmcmVzaFRlc3QoU3RyaW5nIHRlc3ROYW1lLCBpbnQgdGFnZ2luZykgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSwgdGFnZ2luZyk7Ci0gICAgfQotCi0gICAgcHVibGljIFRyZWVWaWV3ZXJSZWZyZXNoVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnBlcmZvcm1hbmNlLlZpZXdlclRlc3QjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVZpZXdlcihTaGVsbCBzaGVsbCkgewotICAgICAgICB2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihzaGVsbCk7Ci0gICAgICAgIGNvbnRlbnRQcm92aWRlciA9IG5ldyBSZWZyZXNoVGVzdFRyZWVDb250ZW50UHJvdmlkZXIoKTsKLSAgICAgICAgdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotICAgICAgICB2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihnZXRMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICByZXR1cm4gdmlld2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIHRpbWUgZm9yIGRvaW5nIGEgcmVmcmVzaC4KLSAgICAgKiBAdGhyb3dzIFRocm93YWJsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZyZXNoKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIG9wZW5Ccm93c2VyKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspIHsKLSAgICAgICAgICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICAgICAgc3RvcE1lYXN1cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjb21taXRNZWFzdXJlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICB9Ci0gICAgCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9WaWV3ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvcGVyZm9ybWFuY2UvVmlld2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTU3OTZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9wZXJmb3JtYW5jZS9WaWV3ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5CYXNpY1BlcmZvcm1hbmNlVGVzdDsKLQotLyoqCi0gKiBUaGUgTGluZWFyVmlld2VyVGVzdCBpcyBhIHRlc3QgdGhhdCB0ZXN0cyB2aWV3ZXJzLgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaWV3ZXJUZXN0IGV4dGVuZHMgQmFzaWNQZXJmb3JtYW5jZVRlc3QgewotCi0JU2hlbGwgYnJvd3NlclNoZWxsOwotCQotCXB1YmxpYyBzdGF0aWMgaW50IElURVJBVElPTlMgPSAxMDA7Ci0JcHVibGljIHN0YXRpYyBpbnQgTUlOX0lURVJBVElPTlMgPSAyMDsKLQotCXB1YmxpYyBWaWV3ZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSwgaW50IHRhZ2dpbmcpIHsKLQkJc3VwZXIodGVzdE5hbWUsIHRhZ2dpbmcpOwotCX0KLQotCXB1YmxpYyBWaWV3ZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkJyb3dzZXIoKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJfQotCQlicm93c2VyU2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCWJyb3dzZXJTaGVsbC5zZXRTaXplKDUwMCwgNTAwKTsKLQkJYnJvd3NlclNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIoYnJvd3NlclNoZWxsKTsKLQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCXZpZXdlci5zZXRJbnB1dChnZXRJbml0aWFsSW5wdXQoKSk7Ci0JCWJyb3dzZXJTaGVsbC5vcGVuKCk7Ci0JCS8vIHByb2Nlc3NFdmVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGluaXRpYWwgaW5wdXQgZm9yIHRoZSByZWNlaXZlci4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRJbml0aWFsSW5wdXQoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgdmlld2VyIHdlIGFyZSB0ZXN0aW5nLgotCSAqIEBwYXJhbSBhU2hlbGwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlVmlld2VyKFNoZWxsIHNoZWxsKTsKLQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChUZXN0RWxlbWVudCkgZWxlbWVudCkuZ2V0VGV4dCgpOwotCQkJfQotCi0JCX07Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuVUlUZXN0Q2FzZSNkb1RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRvVGVhckRvd24oKTsKLQkJaWYoYnJvd3NlclNoZWxsIT0gbnVsbCl7Ci0JCQlicm93c2VyU2hlbGwuY2xvc2UoKTsKLQkJCWJyb3dzZXJTaGVsbCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgdGVzdHMgdGhhdCBhcmUgc2xvdyBvbiBMaW51eAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBzbG93R1RLSXRlcmF0aW9ucygpewotCQlpZihTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoImd0ayIpKQotCQkJcmV0dXJuIElURVJBVElPTlMgLyA1OwotCQlyZXR1cm4gSVRFUkFUSU9OUzsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgdGVzdHMgdGhhdCBhcmUgc2xvdyBvbiBMaW51eAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBzbG93V2luZG93c0l0ZXJhdGlvbnMoKXsKLQkJaWYoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKQotCQkJcmV0dXJuIElURVJBVElPTlMgLyA1OwotCQlyZXR1cm4gSVRFUkFUSU9OUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9BY3Rpdml0aWVzUGVyZm9ybWFuY2VTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL0FjdGl2aXRpZXNQZXJmb3JtYW5jZVN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYWZlMjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL0FjdGl2aXRpZXNQZXJmb3JtYW5jZVN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdGllc1BlcmZvcm1hbmNlU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gVGhpcyBpcyByZXF1aXJlZCB0byB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBY3Rpdml0aWVzUGVyZm9ybWFuY2VTdWl0ZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgQWN0aXZpdGllc1BlcmZvcm1hbmNlU3VpdGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGFkZFRlc3QobmV3IEdlbmVyYXRlSWRlbnRpZmllcnNUZXN0KDEwMDAwKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvQmFzaWNQZXJmb3JtYW5jZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9CYXNpY1BlcmZvcm1hbmNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDMwYmNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9CYXNpY1BlcmZvcm1hbmNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIEJhc2VjbGFzcyBmb3Igc2ltcGxlIHBlcmZvcm1hbmNlIHRlc3RzLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNpY1BlcmZvcm1hbmNlVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUwgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMT0JBTCA9IDI7CQotCQotCXByaXZhdGUgUGVyZm9ybWFuY2VUZXN0ZXIgdGVzdGVyOwotICAgIHByaXZhdGUgSVByb2plY3QgdGVzdFByb2plY3Q7Ci0gICAgZmluYWwgcHJpdmF0ZSBib29sZWFuIHRhZ0FzR2xvYmFsU3VtbWFyeTsKLSAgICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gdGFnQXNTdW1tYXJ5OwotCi0gICAgcHVibGljIEJhc2ljUGVyZm9ybWFuY2VUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgIAl0aGlzKHRlc3ROYW1lLCBOT05FKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lCi0gICAgICovCi0gICAgcHVibGljIEJhc2ljUGVyZm9ybWFuY2VUZXN0KFN0cmluZyB0ZXN0TmFtZSwgaW50IHRhZ2dpbmcpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgICAgICB0YWdBc0dsb2JhbFN1bW1hcnkgPSAoKHRhZ2dpbmcgJiBHTE9CQUwpICE9IDApOwotICAgICAgICB0YWdBc1N1bW1hcnkgPSAoKHRhZ2dpbmcgJiBMT0NBTCkgIT0gMCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFuc3dlcnMgd2hldGhlciB0aGlzIHRlc3Qgc2hvdWxkIGJlIHRhZ2dlZCBnbG9iYWxseS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB0ZXN0IHNob3VsZCBiZSB0YWdnZWQgZ2xvYmFsbHkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkR2xvYmFsbHlUYWcoKSB7Ci0gICAgCXJldHVybiB0YWdBc0dsb2JhbFN1bW1hcnk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFuc3dlcnMgd2hldGhlciB0aGlzIHRlc3Qgc2hvdWxkIGJlIHRhZ2dlZCBsb2NhbGx5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIHRlc3Qgc2hvdWxkIGJlIHRhZ2dlZCBsb2NhbGx5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZExvY2FsbHlUYWcoKSB7Ci0gICAgCXJldHVybiB0YWdBc1N1bW1hcnk7Ci0gICAgfQotICAgIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuVUlUZXN0Q2FzZSNkb1NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICAgIHN1cGVyLmRvU2V0VXAoKTsKLQkgICAgdGVzdGVyID0gbmV3IFBlcmZvcm1hbmNlVGVzdGVyKHRoaXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLlVJVGVzdENhc2UjZG9UZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCSAgICBzdXBlci5kb1RlYXJEb3duKCk7Ci0JICAgIHRlc3Rlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCSAgICBpZiAodGVzdFByb2plY3QgPT0gbnVsbCkgewotCSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JICAgICAgICB0ZXN0UHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChVSVBlcmZvcm1hbmNlVGVzdFNldHVwLlBST0pFQ1RfTkFNRSk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIHRlc3RQcm9qZWN0OwotCX0JCi0KLQkvKioKLQkgKiBBc3NlcnRzIGRlZmF1bHQgcHJvcGVydGllcyBvZiB0aGUgbWVhc3VyZW1lbnRzIGNhcHR1cmVkIGZvciB0aGlzIHRlc3QKLQkgKiBjYXNlLgotCSAqIAotCSAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBwcm9wZXJ0aWVzIGRvIG5vdCBob2xkCi0JICovCi0JcHVibGljIHZvaWQgYXNzZXJ0UGVyZm9ybWFuY2UoKSB7Ci0JCXRlc3Rlci5hc3NlcnRQZXJmb3JtYW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgbWVhc3VyZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBkaW1lbnNpb24gaXMgd2l0aGluIGEKLQkgKiBjZXJ0YWluIHJhbmdlIHdpdGggcmVzcGVjdCB0byBzb21lIHJlZmVyZW5jZSB2YWx1ZS4gSWYgdGhlIHNwZWNpZmllZAotCSAqIGRpbWVuc2lvbiBpc24ndCBhdmFpbGFibGUsIHRoZSBjYWxsIGhhcyBubyBlZmZlY3QuCi0JICogCi0JICogQHBhcmFtIGRpbQotCSAqICAgICAgICAgICAgdGhlIERpbWVuc2lvbiB0byBjaGVjawotCSAqIEBwYXJhbSBsb3dlclBlcmNlbnRhZ2UKLQkgKiAgICAgICAgICAgIGEgbmVnYXRpdmUgbnVtYmVyIGluZGljYXRpbmcgdGhlIHBlcmNlbnRhZ2UgdGhlIG1lYXN1cmVkIHZhbHVlCi0JICogICAgICAgICAgICBpcyBhbGxvd2VkIHRvIGJlIHNtYWxsZXIgdGhhbiBzb21lIHJlZmVyZW5jZSB2YWx1ZQotCSAqIEBwYXJhbSB1cHBlclBlcmNlbnRhZ2UKLQkgKiAgICAgICAgICAgIGEgcG9zaXRpdmUgbnVtYmVyIGluZGljYXRpbmcgdGhlIHBlcmNlbnRhZ2UgdGhlIG1lYXN1cmVkIHZhbHVlCi0JICogICAgICAgICAgICBpcyBhbGxvd2VkIHRvIGJlIGdyZWF0ZXIgdGhhbiBzb21lIHJlZmVyZW5jZSB2YWx1ZQotCSAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBwcm9wZXJ0aWVzIGRvIG5vdCBob2xkCi0JICovCi0JcHVibGljIHZvaWQgYXNzZXJ0UGVyZm9ybWFuY2VJblJlbGF0aXZlQmFuZChEaW1lbnNpb24gZGltLAotCQkJaW50IGxvd2VyUGVyY2VudGFnZSwgaW50IHVwcGVyUGVyY2VudGFnZSkgewotCQl0ZXN0ZXIuYXNzZXJ0UGVyZm9ybWFuY2VJblJlbGF0aXZlQmFuZChkaW0sIGxvd2VyUGVyY2VudGFnZSwgdXBwZXJQZXJjZW50YWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21taXRNZWFzdXJlbWVudHMoKSB7Ci0JCXRlc3Rlci5jb21taXRNZWFzdXJlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgZnJvbSB3aXRoaW4gYSB0ZXN0IGNhc2UgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjb2RlIHRvIG1lYXN1cmUgaXMKLQkgKiBydW4uIEl0IHN0YXJ0cyBjYXB0dXJpbmcgb2YgcGVyZm9ybWFuY2UgZGF0YS4gTXVzdCBiZSBmb2xsb3dlZCBieSBhIGNhbGwKLQkgKiB0byB7QGxpbmsgUGVyZm9ybWFuY2VUZXN0Q2FzZSNzdG9wTWVhc3VyaW5nKCl9YmVmb3JlIHN1YnNlcXVlbnQgY2FsbHMgdG8KLQkgKiB0aGlzIG1ldGhvZCBvciB7QGxpbmsgUGVyZm9ybWFuY2VUZXN0Q2FzZSNjb21taXRNZWFzdXJlbWVudHMoKX0uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRNZWFzdXJpbmcoKSB7Ci0JCXRlc3Rlci5zdGFydE1lYXN1cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BNZWFzdXJpbmcoKSB7Ci0JCXRlc3Rlci5zdG9wTWVhc3VyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogTWFyayB0aGUgc2NlbmFyaW8gb2YgdGhpcyB0ZXN0IGNhc2UgdG8gYmUgaW5jbHVkZWQgaW50byB0aGUgZ2xvYmFsCi0JICogcGVyZm9ybWFuY2Ugc3VtbWFyeS4gVGhlIHN1bW1hcnkgc2hvd3MgdGhlIGdpdmVuIGRpbWVuc2lvbiBvZiB0aGUKLQkgKiBzY2VuYXJpbyBhbmQgbGFiZWxzIHRoZSBzY2VuYXJpbyB3aXRoIHRoZSBzaG9ydCBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBzaG9ydE5hbWUKLQkgKiAgICAgICAgICAgIGEgc2hvcnQgKHNob3J0ZXIgdGhhbiA0MCBjaGFyYWN0ZXJzKSBkZXNjcml0aXZlIG5hbWUgb2YgdGhlCi0JICogICAgICAgICAgICBzY2VuYXJpbwotCSAqIEBwYXJhbSBkaW1lbnNpb24KLQkgKiAgICAgICAgICAgIHRoZSBkaW1lbnNpb24gdG8gc2hvdyBpbiB0aGUgc3VtbWFyeQotCSAqLwotCXByaXZhdGUgdm9pZCB0YWdBc0dsb2JhbFN1bW1hcnkoU3RyaW5nIHNob3J0TmFtZSwgRGltZW5zaW9uIGRpbWVuc2lvbikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkdMT0JBTCAiICsgc2hvcnROYW1lKTsKLQkJdGVzdGVyLnRhZ0FzR2xvYmFsU3VtbWFyeShzaG9ydE5hbWUsIGRpbWVuc2lvbik7Ci0JfQotCi0JLyoqCi0JICogTWFyayB0aGUgc2NlbmFyaW8gcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIFBlcmZvcm1hbmNlTWV0ZXIgdG8gYmUKLQkgKiBpbmNsdWRlZCBpbnRvIHRoZSBnbG9iYWwgcGVyZm9ybWFuY2Ugc3VtbWFyeS4gVGhlIHN1bW1hcnkgc2hvd3MgdGhlIGdpdmVuCi0JICogZGltZW5zaW9ucyBvZiB0aGUgc2NlbmFyaW8gYW5kIGxhYmVscyB0aGUgc2NlbmFyaW8gd2l0aCB0aGUgc2hvcnQgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hvcnROYW1lCi0JICogICAgICAgICAgICBhIHNob3J0IChzaG9ydGVyIHRoYW4gNDAgY2hhcmFjdGVycykgZGVzY3JpdGl2ZSBuYW1lIG9mIHRoZQotCSAqICAgICAgICAgICAgc2NlbmFyaW8KLQkgKiBAcGFyYW0gZGltZW5zaW9ucwotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgZGltZW5zaW9ucyB0byBzaG93IGluIHRoZSBzdW1tYXJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHRhZ0FzR2xvYmFsU3VtbWFyeShTdHJpbmcgc2hvcnROYW1lLCBEaW1lbnNpb25bXSBkaW1lbnNpb25zKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiR0xPQkFMICIgKyBzaG9ydE5hbWUpOwotCQl0ZXN0ZXIudGFnQXNHbG9iYWxTdW1tYXJ5KHNob3J0TmFtZSwgZGltZW5zaW9ucyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0YWdBc1N1bW1hcnkoU3RyaW5nIHNob3J0TmFtZSwgRGltZW5zaW9uW10gZGltZW5zaW9ucykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxPQ0FMICIgKyBzaG9ydE5hbWUpOwotCQl0ZXN0ZXIudGFnQXNTdW1tYXJ5KHNob3J0TmFtZSwgZGltZW5zaW9ucyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0YWdBc1N1bW1hcnkoU3RyaW5nIHNob3J0TmFtZSwgRGltZW5zaW9uIGRpbWVuc2lvbikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxPQ0FMICIgKyBzaG9ydE5hbWUpOwotCQl0ZXN0ZXIudGFnQXNTdW1tYXJ5KHNob3J0TmFtZSwgZGltZW5zaW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGFnSWZOZWNlc3NhcnkoU3RyaW5nIHNob3J0TmFtZSwgRGltZW5zaW9uIGRpbWVuc2lvbikgewotCQlpZiAoc2hvdWxkR2xvYmFsbHlUYWcoKSkgewotCQkJdGFnQXNHbG9iYWxTdW1tYXJ5KHNob3J0TmFtZSwgZGltZW5zaW9uKTsKLQkJfQotCQlpZiAoc2hvdWxkTG9jYWxseVRhZygpKSB7Ci0JCQl0YWdBc1N1bW1hcnkoc2hvcnROYW1lLCBkaW1lbnNpb24pOwotCQl9Ci0JfQotCQotCQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yQmFja2dyb3VuZEpvYnMoKSB7Ci0KLSAgICAgICAgSm9iIGJhY2tncm91bmRKb2IgPSBuZXcgSm9iKCJUaGlzIGlzIGEgdGVzdCBqb2Igd2hpY2ggc2l0cyBhcm91bmQgYmVpbmcgbG93IHByaW9yaXR5IHVudGlsIGV2ZXJ5dGhpbmcgZWxzZSBmaW5pc2hlcyIpIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBiYWNrZ3JvdW5kSm9iLnNldFByaW9yaXR5KEpvYi5ERUNPUkFURSk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGhhZEV2ZW50cyA9IHRydWU7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotICAgICAgICBpZiAoZGlzcGxheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaGFkRXZlbnRzKSB7Ci0gICAgICAgICAgICAgICAgaGFkRXZlbnRzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgLy8gSm9pbiBhIGxvdyBwcmlvcml0eSBqb2IgdGhlbiBzcGluIHRoZSBldmVudCBsb29wCi0gICAgICAgICAgICAgICAgYmFja2dyb3VuZEpvYi5zY2hlZHVsZSgwKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSm9iLmpvaW4oKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhZEV2ZW50cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUnVucyB0aGUgZ2l2ZW4gcnVubmFibGUgdW50aWwgZWl0aGVyIDEwMCBpdGVyYXRpb25zIG9yIDRzIGhhcyBlbGFwc2VkLgotICAgICAqIFJ1bnMgYSBtaW5pbXVtIG9mIDMgdGltZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJ1bm5hYmxlCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleGVyY2lzZShUZXN0UnVubmFibGUgcnVubmFibGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgZXhlcmNpc2UocnVubmFibGUsIDMsIDEwMCwgNDAwMCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEV4ZXJjaXNlcyB0aGUgZ2l2ZW4gcnVubmFibGUgdW50aWwgZWl0aGVyIHRoZSBnaXZlbiBudW1iZXIgb2YgaXRlcmF0aW9ucyBvciB0aGUgZ2l2ZW4KLSAgICAgKiBhbW91bnQgb2YgdGltZSBoYXMgZWxhcHNlZCwgd2hhdGV2ZXIgb2NjdXJzIGZpcnN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBydW5uYWJsZQotICAgICAqIEBwYXJhbSBtYXhJdGVyYXRpb25zCi0gICAgICogQHBhcmFtIG1heFRpbWUKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGV4ZXJjaXNlKFRlc3RSdW5uYWJsZSBydW5uYWJsZSwgaW50IG1pbkl0ZXJhdGlvbnMsIGludCBtYXhJdGVyYXRpb25zLCBpbnQgbWF4VGltZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAKLSAgICAgICAgZm9yKGludCBjb3VudGVyID0gMDsgY291bnRlciA8IG1heEl0ZXJhdGlvbnM7IGNvdW50ZXIrKykgewotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bigpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICBjYXVzZSA9ICgoQ29yZUV4Y2VwdGlvbillKS5nZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRDYXVzZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlID0gZS5nZXRDYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBVSVBlcmZvcm1hbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXMuT0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhjZXB0aW9uIG9jY3VycmVkIiwgZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBsb25nIGN1clRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGlmIChjdXJUaW1lIC0gc3RhcnRUaW1lID4gbWF4VGltZSAmJiBjb3VudGVyID49IG1pbkl0ZXJhdGlvbnMgLSAxKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgY29tbWVudCBmb3IgdGhlIHJlY2VpdmVyIHRvIHN0cmluZy4gTm90ZQotICAgICAqIHRoaXMgaXMgYWRkZWQgdG8gdGhlIG91dHB1dCBhcyBpcyBzbyB5b3Ugd2lsbAotICAgICAqIG5lZWQgdG8gYWRkIG1hcmt1cCBpZiB5b3UgbmVlZCBhIGxpbmsuCi0gICAgICogQHBhcmFtIHN0cmluZyBUaGUgY29tbWVudCB0byB3cml0ZSBvdXQgZm9yIHRoZSB0ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZ3JhZGF0aW9uQ29tbWVudChTdHJpbmcgc3RyaW5nKSB7Ci0JCXRlc3Rlci5zZXREZWdyYWRhdGlvbkNvbW1lbnQoc3RyaW5nKTsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvQ29tbWFuZHNQZXJmb3JtYW5jZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9Db21tYW5kc1BlcmZvcm1hbmNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGQyNjY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9Db21tYW5kc1BlcmZvcm1hbmNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQ29tbWFuZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Ob3REZWZpbmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHMuQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbnRleHRzLkNvbnRleHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuSUtleUxvb2t1cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlMb29rdXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTdHJva2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi0vKioKLSAqIDxwPgotICogUmVzcG9uc2libGUgZm9yIHRlc3RpbmcgdGhlIGNvbW1hbmRzLCBjb250ZXh0cyBhbmQgYmluZGluZ3MgYXJjaGl0ZWN0dXJlLgotICogVGhpcyB0ZXN0IGRvZXMgbm90IHJlbHkgb24gdGhlIGV4aXN0ZW5jZSBvZiB0aGUgd29ya2JlbmNoOyBpdCBvcGVyYXRlcyBwdXJlbHkKLSAqIG9uIEpGYWNlIGNvZGUgYW5kIGxvd2VyLiBTZWUgdGhlIG1ldGhvZCBjb21tZW50cyBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZQotICogY3VycmVudGx5IHN1cHBvcnRlZCBwZXJmb3JtYW5jZSB0ZXN0cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tbWFuZHNQZXJmb3JtYW5jZVRlc3QgZXh0ZW5kcyBCYXNpY1BlcmZvcm1hbmNlVGVzdCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb25zdHJ1Y3RzIGEgYnJhbmNoIG9mIGEgY29udGV4dCB0cmVlLiBUaGlzIGNyZWF0ZXMgYSBicmFuY2ggb2YgdGhlIGdpdmVuCi0JICogZGVwdGggLS0gcmVtZW1iZXJpbmcgdGhlIGlkZW50aWZpZXJzIGFsb25nIHRoZSB3YXkuIFRoaXMgbWV0aG9kIG9wZXJhdGVzCi0JICogcmVjdXJzaXZlbHkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRPRE8gVGhpcyBzaG91bGQgYWRkIGEgYml0IG9mIGJyZWFkdGggdG8gdGhlIHRyZWUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0TWFuYWdlcgotCSAqICAgICAgICAgICAgVGhlIGNvbnRleHQgbWFuYWdlciBpbiB3aGljaCB0aGUgY29udGV4dHMgc2hvdWxkIGJlIGRlZmluZWQ7Ci0JICogICAgICAgICAgICBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRleHQgaWRlbnRpZmllciBmb3IgdGhlIGNvbnRleHQgdG8gYmUgY3JlYXRlZDsKLQkgKiAgICAgICAgICAgIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gc3VjY2Vzc29ycwotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBzdWNjZXNzb3JzIHRvIGNyZWF0ZS4gVGhlIGRlcHRoIG9mIHRoZSBicmFuY2ggdG8KLQkgKiAgICAgICAgICAgIGJlIGNyZWF0ZWQuIElmIHRoaXMgbnVtYmVyIGlzIHplcm8sIHRoZW4gYSBjb250ZXh0IGlzIGNyZWF0ZWQsCi0JICogICAgICAgICAgICBidXQgbm8gcmVjdXJzaXZlIGNhbGwgaXMgbWFkZS4KLQkgKiBAcGFyYW0gYWN0aXZlQ29udGV4dElkcwotCSAqICAgICAgICAgICAgVGhlIGxpc3Qgb2YgYWN0aXZlIGNvbnRleHQgaWRlbnRpZmllcnM7IG11c3Qgbm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGNyZWF0ZUNvbnRleHQoCi0JCQlmaW5hbCBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciwgZmluYWwgU3RyaW5nIHBhcmVudCwKLQkJCWZpbmFsIGludCBzdWNjZXNzb3JzLCBmaW5hbCBMaXN0IGFjdGl2ZUNvbnRleHRJZHMpIHsKLQkJZmluYWwgaW50IGNvdW50ID0gYWN0aXZlQ29udGV4dElkcy5zaXplKCk7Ci0JCWZpbmFsIFN0cmluZyBjb250ZXh0U3RyaW5nID0gImNvbnRleHQiICsgY291bnQ7Ci0JCWZpbmFsIENvbnRleHQgY29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoY29udGV4dFN0cmluZyk7Ci0JCWNvbnRleHQuZGVmaW5lKGNvbnRleHRTdHJpbmcsIGNvbnRleHRTdHJpbmcsIHBhcmVudCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKGNvbnRleHRTdHJpbmcpOwotCi0JCWlmIChzdWNjZXNzb3JzID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNyZWF0ZUNvbnRleHQoY29udGV4dE1hbmFnZXIsIGNvbnRleHRTdHJpbmcsIHN1Y2Nlc3NvcnMgLSAxLAotCQkJCWFjdGl2ZUNvbnRleHRJZHMpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnN0cnVjdHMgYSBicmFuY2ggb2YgYSBzY2hlbWUgdHJlZS4gVGhpcyBjcmVhdGVzIGEgYnJhbmNoIG9mIHRoZSBnaXZlbgotCSAqIGRlcHRoIC0tIHJlbWVtYmVyaW5nIHRoZSBzY2hlbWVzIGFsb25nIHRoZSB3YXkuIFRoaXMgbWV0aG9kIG9wZXJhdGVzCi0JICogcmVjdXJzaXZlbHkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRPRE8gVGhpcyBzaG91bGQgYWRkIGEgYml0IG9mIGJyZWFkdGggdG8gdGhlIHRyZWUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBiaW5kaW5nTWFuYWdlcgotCSAqICAgICAgICAgICAgVGhlIGJpbmRpbmcgbWFuYWdlciBpbiB3aGljaCB0aGUgc2NoZW1lcyBzaG91bGQgYmUgZGVmaW5lZDsKLQkgKiAgICAgICAgICAgIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2NoZW1lIGlkZW50aWZpZXIgZm9yIHRoZSBzY2hlbWUgdG8gYmUgY3JlYXRlZDsgbWF5Ci0JICogICAgICAgICAgICBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gc3VjY2Vzc29ycwotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBzdWNjZXNzb3JzIHRvIGNyZWF0ZS4gVGhlIGRlcHRoIG9mIHRoZSBicmFuY2ggdG8KLQkgKiAgICAgICAgICAgIGJlIGNyZWF0ZWQuIElmIHRoaXMgbnVtYmVyIGlzIHplcm8sIHRoZW4gYSBzY2hlbWUgaXMgY3JlYXRlZCwKLQkgKiAgICAgICAgICAgIGJ1dCBubyByZWN1cnNpdmUgY2FsbCBpcyBtYWRlLgotCSAqIEBwYXJhbSBzY2hlbWVzCi0JICogICAgICAgICAgICBUaGUgbGlzdCBvZiBjcmVhdGVkIHNjaGVtZXM7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgY3JlYXRlU2NoZW1lKGZpbmFsIEJpbmRpbmdNYW5hZ2VyIGJpbmRpbmdNYW5hZ2VyLAotCQkJZmluYWwgU3RyaW5nIHBhcmVudCwgZmluYWwgaW50IHN1Y2Nlc3NvcnMsIGZpbmFsIExpc3Qgc2NoZW1lcykgewotCQlmaW5hbCBpbnQgY291bnQgPSBzY2hlbWVzLnNpemUoKTsKLQkJZmluYWwgU3RyaW5nIHNjaGVtZVN0cmluZyA9ICJzY2hlbWUiICsgY291bnQ7Ci0JCWZpbmFsIFNjaGVtZSBzY2hlbWUgPSBiaW5kaW5nTWFuYWdlci5nZXRTY2hlbWUoc2NoZW1lU3RyaW5nKTsKLQkJc2NoZW1lLmRlZmluZShzY2hlbWVTdHJpbmcsIHNjaGVtZVN0cmluZywgcGFyZW50KTsKLQkJc2NoZW1lcy5hZGQoc2NoZW1lKTsKLQotCQlpZiAoc3VjY2Vzc29ycyA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQljcmVhdGVTY2hlbWUoYmluZGluZ01hbmFnZXIsIHNjaGVtZVN0cmluZywgc3VjY2Vzc29ycyAtIDEsIHNjaGVtZXMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBiaW5kaW5nIG1hbmFnZXIgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KLQkgKi8KLQlwcml2YXRlIEJpbmRpbmdNYW5hZ2VyIGJpbmRpbmdNYW5hZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjb21tYW5kIG1hbmFnZXIgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KLQkgKi8KLQlwcml2YXRlIENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjb250ZXh0IG1hbmFnZXIgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KLQkgKi8KLQlwcml2YXRlIENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+Q29tbWFuZHNQZXJmb3JtYW5jZVRlc3Q8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB0ZXN0TmFtZQotCSAqICAgICAgICAgICAgVGVzdCdzIG5hbWUuCi0JICovCi0JcHVibGljIENvbW1hbmRzUGVyZm9ybWFuY2VUZXN0KGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFNldHMgdXAgYSBzdWZmaWNpZW50bHkgY29tcGxleCBzZXQgb2YgYmluZGluZ3MuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEF0IHRoZSB0aW1lIG9mIHdyaXRpbmcsIEVjbGlwc2UncyBrZXkgYmluZGluZyBzZXQgY29udGFpbnMgYWJvdXQgZml2ZQotCSAqIGh1bmRyZWQgYmluZGluZ3MuIE9mIHRoZXNlLCAxNDAgc3BlY2lmeSBwbGF0Zm9ybSBpbmZvcm1hdGlvbiwgd2hpbGUgb25seQotCSAqIDUgc3BlY2lmeSBsb2NhbGUgaW5mb3JtYXRpb24uIEFib3V0IDQwIGFyZSBkZWxldGlvbiBtYXJrZXJzLiBUaGUgZGVlcGVzdAotCSAqIHBvaW50IGluIHRoZSBjb250ZXh0IHRyZWUgaXMgZm91ciBsZXZlbHMuIFRoZXJlIGFyZSB0d28gc2NoZW1lcy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIHRlc3QgYmluZGluZyBzZXQgY29udGFpbnMgZml2ZSB0aG91c2FuZCBiaW5kaW5ncy4gQWJvdXQgMTQwMCBzcGVjaWZ5Ci0JICogZWl0aGVyIGxvY2FsZSBvciBwbGF0Zm9ybSBpbmZvcm1hdGlvbi4gRml2ZSBodW5kcmVkIGFyZSBkZWxldGlvbiBtYXJrZXJzLgotCSAqIFRoZSBkZWVwZXN0IHBvaW50IGluIHRoZSBjb250ZXh0IHRyZWUgaXMgNDAgbGV2ZWxzLiBUaGVyZSBhcmUgdHdlbnR5Ci0JICogc2NoZW1lcy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGRlcHRoIG9mIHRoZSBsb2NhbGUgYW5kIHBsYXRmb3JtIHRyZWUgaXMgdGhlIHNhbWUgaW4gYm90aCByZWFsIGxpZmUKLQkgKiBhbmQgdGhlIHRlc3QgY2FzZS4gSXQgaXMgZGlmZmljdWx0IHRvIGltYWdpbmUgd2h5IHRoZSBsb2NhbGUgbGlzdCB3b3VsZAotCSAqIGV2ZXIgYmUgYW55dGhpbmcgYnV0IGZvdXIgZWxlbWVudHMsIG9yIHdoeSB0aGUgcGxhdGZvcm0gbGlzdCB3b3VsZCBldmVyCi0JICogYmUgYW55dGhpbmcgYnV0IHRocmVlIGVsZW1lbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiBzb21ldGhpbmcgd2VudCB3cm9uZyBpbml0aWFsaXppbmcgdGhlIGFjdGl2ZSBzY2hlbWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9TZXRVcCgpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uLCBFeGNlcHRpb24gewotCQlzdXBlci5kb1NldFVwKCk7Ci0KLQkJLyoKLQkJICogVGhlIGNvbnN0YW50cyB0byB1c2UgaW4gY3JlYXRpbmcgdGhlIHZhcmlvdXMgb2JqZWN0cy4gVGhlIHBsYXRmb3JtCi0JCSAqIGxvY2FsZSBjb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGRlbGV0aW9uCi0JCSAqIG1hcmtlcnMuIERlbGV0aW9uIG1hcmtlcnMgYXJlIHR5cGljYWxseSBjcmVhdGVkIGJhc2VkIG9uIHRoZSBwbGF0Zm9ybQotCQkgKiBvciBsb2NhbGUuCi0JCSAqLwotCQlmaW5hbCBpbnQgY29udGV4dFRyZWVEZXB0aCA9IDQwOwotCQlmaW5hbCBpbnQgc2NoZW1lRGVwdGggPSAyMDsKLQkJZmluYWwgaW50IGJpbmRpbmdDb3VudCA9IDUwMDA7Ci0JCWZpbmFsIGludCBwbGF0Zm9ybUxvY2FsZUNvdW50ID0gMTQwMDsKLQkJZmluYWwgaW50IGRlbGV0aW9uTWFya2VycyA9IDUwMDsKLQkJZmluYWwgU3RyaW5nIGN1cnJlbnRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCk7Ci0JCWZpbmFsIFN0cmluZyBjdXJyZW50UGxhdGZvcm0gPSBTV1QuZ2V0UGxhdGZvcm0oKTsKLQotCQkvLyBTZXQtdXAgYSB0YWJsZSBvZiBtb2RpZmllciBrZXlzLgotCQlmaW5hbCBJS2V5TG9va3VwIGxvb2t1cCA9IEtleUxvb2t1cEZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotCQlmaW5hbCBpbnQgbW9kaWZpZXJLZXlzMCA9IDA7Ci0JCWZpbmFsIGludCBtb2RpZmllcktleXMxID0gbG9va3VwLmdldEFsdCgpOwotCQlmaW5hbCBpbnQgbW9kaWZpZXJLZXlzMiA9IGxvb2t1cC5nZXRDb21tYW5kKCk7Ci0JCWZpbmFsIGludCBtb2RpZmllcktleXMzID0gbG9va3VwLmdldEN0cmwoKTsKLQkJZmluYWwgaW50IG1vZGlmaWVyS2V5czQgPSBsb29rdXAuZ2V0U2hpZnQoKTsKLQkJZmluYWwgaW50IG1vZGlmaWVyS2V5czUgPSBsb29rdXAuZ2V0QWx0KCkgfCBsb29rdXAuZ2V0Q29tbWFuZCgpOwotCQlmaW5hbCBpbnQgbW9kaWZpZXJLZXlzNiA9IGxvb2t1cC5nZXRBbHQoKSB8IGxvb2t1cC5nZXRDdHJsKCk7Ci0JCWZpbmFsIGludCBtb2RpZmllcktleXM3ID0gbG9va3VwLmdldEFsdCgpIHwgbG9va3VwLmdldFNoaWZ0KCk7Ci0JCWZpbmFsIGludCBtb2RpZmllcktleXM4ID0gbG9va3VwLmdldENvbW1hbmQoKSB8IGxvb2t1cC5nZXRDdHJsKCk7Ci0JCWZpbmFsIGludCBtb2RpZmllcktleXM5ID0gbG9va3VwLmdldENvbW1hbmQoKSB8IGxvb2t1cC5nZXRTaGlmdCgpOwotCQlmaW5hbCBpbnQgbW9kaWZpZXJLZXlzMTAgPSBsb29rdXAuZ2V0Q3RybCgpIHwgbG9va3VwLmdldFNoaWZ0KCk7Ci0JCWZpbmFsIGludCBtb2RpZmllcktleXMxMSA9IGxvb2t1cC5nZXRBbHQoKSB8IGxvb2t1cC5nZXRDb21tYW5kKCkKLQkJCQl8IGxvb2t1cC5nZXRDdHJsKCk7Ci0JCWZpbmFsIGludCBtb2RpZmllcktleXMxMiA9IGxvb2t1cC5nZXRBbHQoKSB8IGxvb2t1cC5nZXRDb21tYW5kKCkKLQkJCQl8IGxvb2t1cC5nZXRTaGlmdCgpOwotCQlmaW5hbCBpbnQgbW9kaWZpZXJLZXlzMTMgPSBsb29rdXAuZ2V0QWx0KCkgfCBsb29rdXAuZ2V0Q3RybCgpCi0JCQkJfCBsb29rdXAuZ2V0U2hpZnQoKTsKLQkJZmluYWwgaW50IG1vZGlmaWVyS2V5czE0ID0gbG9va3VwLmdldENvbW1hbmQoKSB8IGxvb2t1cC5nZXRDdHJsKCkKLQkJCQl8IGxvb2t1cC5nZXRTaGlmdCgpOwotCQlmaW5hbCBpbnQgbW9kaWZpZXJLZXlzMTUgPSBsb29rdXAuZ2V0QWx0KCkgfCBsb29rdXAuZ2V0Q29tbWFuZCgpCi0JCQkJfCBsb29rdXAuZ2V0Q3RybCgpIHwgbG9va3VwLmdldFNoaWZ0KCk7Ci0JCWZpbmFsIGludFtdIG1vZGlmaWVyS2V5VGFibGUgPSB7IG1vZGlmaWVyS2V5czAsIG1vZGlmaWVyS2V5czEsCi0JCQkJbW9kaWZpZXJLZXlzMiwgbW9kaWZpZXJLZXlzMywgbW9kaWZpZXJLZXlzNCwgbW9kaWZpZXJLZXlzNSwKLQkJCQltb2RpZmllcktleXM2LCBtb2RpZmllcktleXM3LCBtb2RpZmllcktleXM4LCBtb2RpZmllcktleXM5LAotCQkJCW1vZGlmaWVyS2V5czEwLCBtb2RpZmllcktleXMxMSwgbW9kaWZpZXJLZXlzMTIsIG1vZGlmaWVyS2V5czEzLAotCQkJCW1vZGlmaWVyS2V5czE0LCBtb2RpZmllcktleXMxNSB9OwotCi0JCS8vIEluaXRpYWxpemUgdGhlIGNvbW1hbmQgbWFuYWdlci4KLQkJY29tbWFuZE1hbmFnZXIgPSBuZXcgQ29tbWFuZE1hbmFnZXIoKTsKLQotCQkvLyBJbml0aWFsaXplIHRoZSBjb250ZXh0cy4KLQkJY29udGV4dE1hbmFnZXIgPSBuZXcgQ29udGV4dE1hbmFnZXIoKTsKLQkJZmluYWwgTGlzdCBhY3RpdmVDb250ZXh0SWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQljcmVhdGVDb250ZXh0KGNvbnRleHRNYW5hZ2VyLCBudWxsLCBjb250ZXh0VHJlZURlcHRoLCBhY3RpdmVDb250ZXh0SWRzKTsKLQkJY29udGV4dE1hbmFnZXIuc2V0QWN0aXZlQ29udGV4dElkcyhuZXcgSGFzaFNldChhY3RpdmVDb250ZXh0SWRzKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSB0aGUgc2NoZW1lcy4KLQkJYmluZGluZ01hbmFnZXIgPSBuZXcgQmluZGluZ01hbmFnZXIoY29udGV4dE1hbmFnZXIsIGNvbW1hbmRNYW5hZ2VyKTsKLQkJZmluYWwgTGlzdCBzY2hlbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQljcmVhdGVTY2hlbWUoYmluZGluZ01hbmFnZXIsIG51bGwsIHNjaGVtZURlcHRoLCBzY2hlbWVzKTsKLQkJYmluZGluZ01hbmFnZXIKLQkJCQkuc2V0QWN0aXZlU2NoZW1lKChTY2hlbWUpIHNjaGVtZXMuZ2V0KHNjaGVtZXMuc2l6ZSgpIC0gMSkpOwotCi0JCS8vIENyZWF0ZSB0aGUgZGVsZXRpb24gbWFya2Vycy4KLQkJZmluYWwgQmluZGluZ1tdIGJpbmRpbmdzID0gbmV3IEJpbmRpbmdbYmluZGluZ0NvdW50XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxldGlvbk1hcmtlcnM7IGkrKykgewotCQkJLyoKLQkJCSAqIFNldC11cCB0aGUgbG9jYWxlIGFuZCBwbGF0Zm9ybS4gVGhlc2UgYXJlIGJhc2VkIG9uIHRoZSBudW1iZXJzCi0JCQkgKiBnaXZlbiBhYm92ZS4KLQkJCSAqLwotCQkJU3RyaW5nIGxvY2FsZSA9IG51bGw7Ci0JCQlTdHJpbmcgcGxhdGZvcm0gPSBudWxsOwotCi0JCQlpZiAoaSA8IHBsYXRmb3JtTG9jYWxlQ291bnQpIHsKLQkJCQlzd2l0Y2ggKGkgJSA0KSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlsb2NhbGUgPSBjdXJyZW50TG9jYWxlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCXBsYXRmb3JtID0gY3VycmVudFBsYXRmb3JtOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCWxvY2FsZSA9ICJnaWJiZXJpc2giOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDM6Ci0JCQkJCXBsYXRmb3JtID0gImdpYmJlcmlzaCI7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQnVpbGQgYSBrZXkgc2VxdWVuY2UuCi0JCQlmaW5hbCBjaGFyIGNoYXJhY3RlciA9IChjaGFyKSAoJ0EnICsgKGkgJSAyNikpOwotCQkJZmluYWwgaW50IG1vZGlmaWVyS2V5cyA9IG1vZGlmaWVyS2V5VGFibGVbKGkgLyAyNikKLQkJCQkJJSBtb2RpZmllcktleVRhYmxlLmxlbmd0aF07Ci0JCQlmaW5hbCBLZXlTdHJva2Uga2V5U3Ryb2tlID0gS2V5U3Ryb2tlLmdldEluc3RhbmNlKG1vZGlmaWVyS2V5cywKLQkJCQkJY2hhcmFjdGVyKTsKLQkJCWZpbmFsIEtleVNlcXVlbmNlIGtleVNlcXVlbmNlID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2Uoa2V5U3Ryb2tlKTsKLQotCQkJLy8gQnVpbGQgdGhlIG90aGVyIHBhcmFtZXRlcnMuCi0JCQlmaW5hbCBTdHJpbmcgc2NoZW1lSWQgPSAoKFNjaGVtZSkgc2NoZW1lcy5nZXQoaSAlIHNjaGVtZXMuc2l6ZSgpKSkKLQkJCQkJLmdldElkKCk7Ci0JCQlmaW5hbCBTdHJpbmcgY29udGV4dElkID0gKFN0cmluZykgYWN0aXZlQ29udGV4dElkcy5nZXQoaQotCQkJCQklIGFjdGl2ZUNvbnRleHRJZHMuc2l6ZSgpKTsKLQkJCWZpbmFsIGludCB0eXBlID0gKGkgJSAyKTsKLQotCQkJLy8gQ29uc3RydWN0IHRoZSBiaW5kaW5nLgotCQkJZmluYWwgQmluZGluZyBiaW5kaW5nID0gbmV3IEtleUJpbmRpbmcoa2V5U2VxdWVuY2UsIG51bGwsIHNjaGVtZUlkLAotCQkJCQljb250ZXh0SWQsIGxvY2FsZSwgcGxhdGZvcm0sIG51bGwsIHR5cGUpOwotCQkJYmluZGluZ3NbaV0gPSBiaW5kaW5nOwotCQl9Ci0KLQkJLyoKLQkJICogTm93IGNyZWF0ZSB0aGUgcmVndWxhciBiaW5kaW5ncy4gQnkgdXNpbmcgdGhlIHNhbWUgbG9vcCBzdHJ1Y3R1cmUgYW5kCi0JCSAqIHJlc2V0dGluZyB0aGUgaW5kZXggdG8gemVybywgd2UgZW5zdXJlIHRoYXQgdGhlIGRlbGV0aW9uIG1hcmtlcnMgd2lsbAotCQkgKiBhY3R1YWxseSBkZWxldGUgc29tZXRoaW5nLgotCQkgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5nQ291bnQgLSBkZWxldGlvbk1hcmtlcnM7IGkrKykgewotCQkJLyoKLQkJCSAqIFNldC11cCB0aGUgbG9jYWxlIGFuZCBwbGF0Zm9ybSBmb3IgdGhvc2UgYmluZGluZ3MgdGhhdCB3aWxsIG5vdAotCQkJICogYmUgdXNlZCB0byBtYXRjaCB0aGUgYWJvdmUgZGVsZXRpb24gbWFya2Vycy4gVGhlc2UgYXJlIGJhc2VkIG9uCi0JCQkgKiB0aGUgbnVtYmVycyBnaXZlbiBhYm92ZS4KLQkJCSAqLwotCQkJU3RyaW5nIGxvY2FsZSA9IG51bGw7Ci0JCQlTdHJpbmcgcGxhdGZvcm0gPSBudWxsOwotCi0JCQlpZiAoKGkgPiBkZWxldGlvbk1hcmtlcnMpICYmIChpIDwgcGxhdGZvcm1Mb2NhbGVDb3VudCkpIHsKLQkJCQlzd2l0Y2ggKGkgJSA0KSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlsb2NhbGUgPSBjdXJyZW50TG9jYWxlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCXBsYXRmb3JtID0gY3VycmVudFBsYXRmb3JtOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCWxvY2FsZSA9ICJnaWJiZXJpc2giOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDM6Ci0JCQkJCXBsYXRmb3JtID0gImdpYmJlcmlzaCI7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQnVpbGQgYSBrZXkgc2VxdWVuY2UuCi0JCQlmaW5hbCBjaGFyIGNoYXJhY3RlciA9IChjaGFyKSAoJ0EnICsgKGkgJSAyNikpOwotCQkJZmluYWwgaW50IG1vZGlmaWVyS2V5cyA9IG1vZGlmaWVyS2V5VGFibGVbKGkgLyAyNikKLQkJCQkJJSBtb2RpZmllcktleVRhYmxlLmxlbmd0aF07Ci0JCQlmaW5hbCBLZXlTdHJva2Uga2V5U3Ryb2tlID0gS2V5U3Ryb2tlLmdldEluc3RhbmNlKG1vZGlmaWVyS2V5cywKLQkJCQkJY2hhcmFjdGVyKTsKLQkJCWZpbmFsIEtleVNlcXVlbmNlIGtleVNlcXVlbmNlID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2Uoa2V5U3Ryb2tlKTsKLQotCQkJLy8gQnVpbGQgdGhlIG90aGVyIHBhcmFtZXRlcnMuCi0JCQlmaW5hbCBTdHJpbmcgY29tbWFuZElkID0gImNvbW1hbmQiICsgaTsKLQkJCWZpbmFsIFN0cmluZyBzY2hlbWVJZCA9ICgoU2NoZW1lKSBzY2hlbWVzLmdldChpICUgc2NoZW1lcy5zaXplKCkpKQotCQkJCQkuZ2V0SWQoKTsKLQkJCWZpbmFsIFN0cmluZyBjb250ZXh0SWQgPSAoU3RyaW5nKSBhY3RpdmVDb250ZXh0SWRzLmdldChpCi0JCQkJCSUgYWN0aXZlQ29udGV4dElkcy5zaXplKCkpOwotCQkJZmluYWwgaW50IHR5cGUgPSAoaSAlIDIpOwotCi0JCQkvLyBDb25zdHJ1Y3QgdGhlIGJpbmRpbmcuCi0JCQlmaW5hbCBDb21tYW5kIGNvbW1hbmQgPSBjb21tYW5kTWFuYWdlci5nZXRDb21tYW5kKGNvbW1hbmRJZCk7Ci0JCQlmaW5hbCBQYXJhbWV0ZXJpemVkQ29tbWFuZCBwYXJhbWV0ZXJpemVkQ29tbWFuZCA9IG5ldyBQYXJhbWV0ZXJpemVkQ29tbWFuZCgKLQkJCQkJY29tbWFuZCwgbnVsbCk7Ci0JCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcgPSBuZXcgS2V5QmluZGluZyhrZXlTZXF1ZW5jZSwKLQkJCQkJcGFyYW1ldGVyaXplZENvbW1hbmQsIHNjaGVtZUlkLCBjb250ZXh0SWQsIGxvY2FsZSwKLQkJCQkJcGxhdGZvcm0sIG51bGwsIHR5cGUpOwotCQkJYmluZGluZ3NbaSArIGRlbGV0aW9uTWFya2Vyc10gPSBiaW5kaW5nOwotCQl9Ci0JCWJpbmRpbmdNYW5hZ2VyLnNldEJpbmRpbmdzKGJpbmRpbmdzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBkb1RlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJpbmRpbmdNYW5hZ2VyID0gbnVsbDsKLQkJY29tbWFuZE1hbmFnZXIgPSBudWxsOwotCQljb250ZXh0TWFuYWdlciA9IG51bGw7Ci0JCXN1cGVyLmRvVGVhckRvd24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUZXN0cyBob3cgbG9uZyBpdCB0YWtlcyB0byBhY2Nlc3MgdGhlIGNhY2hlIGlmIG5vIGNvbmRpdGlvbnMgaGF2ZQotCSAqIGNoYW5nZWQuIEl0IG1lYXN1cmVzIGhvdyBsb25nIGl0IHRha2VzIHRvIGxvb2sgdXAgdGhlIGNvbXB1dGF0aW9uIGZyb20KLQkgKiB0aGUgY2FjaGUgb25lIG1pbGxpb24gdGltZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiAiQ1RSTCtGIiBjYW4ndCBiZSBwYXJzZWQgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdEJpbmRpbmdDYWNoZUhpdEhhcmQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotCQkvLyBDb25zdGFudHMKLQkJZmluYWwgaW50IGNhY2hlSGl0cyA9IDEwMDAwMDA7Ci0JCWZpbmFsIEtleVNlcXVlbmNlIGtleVNlcXVlbmNlID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2UoIkNUUkwrRiIpOwotCi0JCS8vIENvbXB1dGUgb25jZS4KLQkJYmluZGluZ01hbmFnZXIuZ2V0UGFydGlhbE1hdGNoZXMoa2V5U2VxdWVuY2UpOwotCi0JCS8vIFRpbWUgaG93IGxvbmcgaXQgdGFrZXMgdG8gYWNjZXNzIHRoZSBjYWNoZTsKLQkJc3RhcnRNZWFzdXJpbmcoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZUhpdHM7IGkrKykgewotCQkJYmluZGluZ01hbmFnZXIuZ2V0UGFydGlhbE1hdGNoZXMoa2V5U2VxdWVuY2UpOwotCQl9Ci0JCXN0b3BNZWFzdXJpbmcoKTsKLQkJY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0JCWFzc2VydFBlcmZvcm1hbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGVzdHMgaG93IGxvbmcgaXQgdGFrZXMgdG8gYWNjZXNzIHRoZSBjYWNoZSBpZiBubyBjb25kaXRpb25zIGhhdmUKLQkgKiBjaGFuZ2VkLiBJdCBtZWFzdXJlcyBob3cgbG9uZyBpdCB0YWtlcyB0byBsb29rIHVwIHRoZSBjb21wdXRhdGlvbiBmcm9tCi0JICogdGhlIGNhY2hlIG9uZSBtaWxsaW9uIHRpbWVzLiBJbiB0aGlzIHRlc3QsIHRoZSBsb29rLXVwIGlzIGRvbmUgaW4gcmV2ZXJzZSAtLQotCSAqIGZyb20gY29tbWFuZCBpZGVudGlmaWVyIHRvIHRyaWdnZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiAiQ1RSTCtGIiBjYW4ndCBiZSBwYXJzZWQgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdEJpbmRpbmdDYWNoZUhpdEhhcmRSZXZlcnNlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLQkJLy8gQ29uc3RhbnRzCi0JCWZpbmFsIGludCBjYWNoZUhpdHMgPSAxMDAwMDAwOwotCQlmaW5hbCBLZXlTZXF1ZW5jZSBrZXlTZXF1ZW5jZSA9IEtleVNlcXVlbmNlLmdldEluc3RhbmNlKCJDVFJMK0YiKTsKLQotCQkvLyBDb21wdXRlIG9uY2UuCi0JCWJpbmRpbmdNYW5hZ2VyLmdldFBhcnRpYWxNYXRjaGVzKGtleVNlcXVlbmNlKTsKLQotCQkvLyBUaW1lIGhvdyBsb25nIGl0IHRha2VzIHRvIGFjY2VzcyB0aGUgY2FjaGU7Ci0JCXN0YXJ0TWVhc3VyaW5nKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVIaXRzOyBpKyspIHsKLQkJCWJpbmRpbmdNYW5hZ2VyLmdldEFjdGl2ZUJpbmRpbmdzRm9yKChQYXJhbWV0ZXJpemVkQ29tbWFuZCkgbnVsbCk7Ci0JCX0KLQkJc3RvcE1lYXN1cmluZygpOwotCQljb21taXRNZWFzdXJlbWVudHMoKTsKLQkJYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUZXN0cyBob3cgbG9uZyBpdCB0YWtlcyB0byBhY2Nlc3MgdGhlIGNhY2hlIGlmIHRoZSBjb25kaXRpb25zIGhhdmUKLQkgKiBjaGFuZ2VkLCBidXQgdGhlIGNhY2hlIGNvbnRhaW5zIGEgbWF0Y2hpbmcgZW50cnkuIEl0IG1lYXN1cmVzIGhvdyBsb25nIGl0Ci0JICogdGFrZXMgdG8gbG9vayB1cCB0aGUgY29tcHV0YXRpb24gZnJvbSB0aGUgY2FjaGUgZm9ydHkgdGhvdXNhbmQgdGltZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiAiQ1RSTCtGIiBjYW4ndCBiZSBwYXJzZWQgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdEJpbmRpbmdDYWNoZUhpdFNvZnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotCQkvLyBDb25zdGFudHMKLQkJZmluYWwgaW50IGNhY2hlSGl0cyA9IDEwMDAwOwotCQlmaW5hbCBLZXlTZXF1ZW5jZSBrZXlTZXF1ZW5jZSA9IEtleVNlcXVlbmNlLmdldEluc3RhbmNlKCJDVFJMK0YiKTsKLQotCQkvLyBDb21wdXRlIG9uY2UgZm9yIGVhY2ggY29udGV4dCBzZXQuCi0JCWZpbmFsIFNldCBjb250ZXh0U2V0MSA9IGNvbnRleHRNYW5hZ2VyLmdldEFjdGl2ZUNvbnRleHRJZHMoKTsKLQkJYmluZGluZ01hbmFnZXIuZ2V0UGFydGlhbE1hdGNoZXMoa2V5U2VxdWVuY2UpOwotCQlmaW5hbCBMaXN0IGNvbnRleHRMaXN0ID0gbmV3IEFycmF5TGlzdChjb250ZXh0U2V0MSk7Ci0JCWNvbnRleHRMaXN0LnJlbW92ZShjb250ZXh0TGlzdC5zaXplKCkgLSAxKTsKLQkJZmluYWwgU2V0IGNvbnRleHRTZXQyID0gbmV3IEhhc2hTZXQoY29udGV4dExpc3QpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGNvbnRleHRTZXQyKTsKLQkJYmluZGluZ01hbmFnZXIuZ2V0UGFydGlhbE1hdGNoZXMoa2V5U2VxdWVuY2UpOwotCi0JCS8vIFRpbWUgaG93IGxvbmcgaXQgdGFrZXMgdG8gYWNjZXNzIHRoZSBjYWNoZTsKLQkJc3RhcnRNZWFzdXJpbmcoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZUhpdHM7IGkrKykgewotCQkJaWYgKChpICUgMikgPT0gMCkgewotCQkJCWNvbnRleHRNYW5hZ2VyLnNldEFjdGl2ZUNvbnRleHRJZHMoY29udGV4dFNldDEpOwotCQkJfSBlbHNlIHsKLQkJCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGNvbnRleHRTZXQyKTsKLQkJCX0KLQkJCWJpbmRpbmdNYW5hZ2VyLmdldFBhcnRpYWxNYXRjaGVzKGtleVNlcXVlbmNlKTsKLQkJfQotCQlzdG9wTWVhc3VyaW5nKCk7Ci0JCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRlc3RzIGhvdyBsb25nIGl0IHRha2VzIHRvIGRvIGEgZnVsbCBjb21wdXRhdGlvbiAoaS5lLiwgYSBjYWNoZSBtaXNzKSBvbgotCSAqIGFuIGV4Y2VwdGlvbmFsbHkgbGFyZ2Ugc2V0IG9mIGJpbmRpbmdzLiBUaGUgYmluZGluZyBzZXQgdHJpZXMgdG8gbWltaWNrCi0JICogc29tZSBvZiB0aGUgc2FtZSBwcm9wZXJ0aWVzIG9mIGEgInJlYWwiIGJpbmRpbmcgc2V0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgIkNUUkwrRiIgY2FuJ3QgYmUgcGFyc2VkIGZvciBzb21lIHN0cmFuZ2UgcmVhc29uLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RCaW5kaW5nQ2FjaGVNaXNzTGFyZ2UoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotCQkvLyBDb25zdGFudHMKLQkJZmluYWwgS2V5U2VxdWVuY2Uga2V5U2VxdWVuY2UgPSBLZXlTZXF1ZW5jZS5nZXRJbnN0YW5jZSgiQ1RSTCtGIik7Ci0KLQkJLy8gVGltZSBob3cgbG9uZyBpdCB0YWtlcyB0byBzb2x2ZSB0aGUgYmluZGluZyBzZXQuCi0JCXN0YXJ0TWVhc3VyaW5nKCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmdldFBhcnRpYWxNYXRjaGVzKGtleVNlcXVlbmNlKTsKLQkJc3RvcE1lYXN1cmluZygpOwotCQljb21taXRNZWFzdXJlbWVudHMoKTsKLQkJYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvQ29udGVudERlc2NyaWJlckZvclRlc3RzT25seS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL0NvbnRlbnREZXNjcmliZXJGb3JUZXN0c09ubHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2OGU3My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvQ29udGVudERlc2NyaWJlckZvclRlc3RzT25seS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlcjsKLQotLyoqCi0gKiBUaGlzIHRlc3QgQ29udGVudERlc2NyaWJlciBhZGRlZCBzcGVjaWZpY2FsbHkgZm9yIE9wZW5OYXZpZ2F0b3JGb2xkZXJUZXN0LgotICogCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnREZXNjcmliZXJGb3JUZXN0c09ubHkgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCi0JLyoKLQkgKiB0aGlzICJzaW11bGF0ZWQgdGltZSIgcmVwcmVzZW50cyBob3cgbG9uZyBhIGNvbnRlbnQgZGVzY3JpYmVyIG1pZ2h0Ci0JICogdGFrZSBwYXJzaW5nIGEgZmlsZS4gT2ZmaGFuZCAoaS5lLiBqdXN0IGd1ZXNzaW5nKSAyMDAwIG1zZWNzIHdvdWxkIGJlICJiYWQgY2FzZSIgZXhhbXBsZXMuIAotCSAqIDIwIG1zZWNzIHdvdWxkIGJlIG5lYXIgYSBnb29kLCBvcHRpbWlzdGljIGNhc2UuCi0JICogSSd2ZSBwaWNrZWQgNzUgbXNlY3MgZm9yIHRoaXMgdGVzdCwgdG8gcmVwcmVzZW50ICJub3JtYWwiIGNhc2UgCi0JICogKHN1Y2ggYXMgdGhlIEhUTUwgcGFyc2VyIHRoYXQgZ2F2ZSByaXNlIHRvIHRoZSBvcmlnaW5hbCBidWcgOikgIAotCSAqIAotCSAqIE5vdGU6IHVubGlrZSBhICJyZWFsIiBDb250ZW50RGVzY3JpYmVyLCB0aGlzIG9uZSBvbmx5IGVmZmVjdHMgImVsYXBzZWQKLQkgKiB0aW1lIiwgbm90ICJDUFUgVGltZSIsIHNpbmNlIGFsbCBpdCBpcyBkb2luZyBpcyBzbGVlcGluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0lNVUxBVEVEX0NBTENVTEFUSU9OX1RJTUUgPSA3NTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSS307Ci0KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQllbHNlIHsKLQkJCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJCS8vIGFzc3VtbW1pbmcgd2Ugc2hvdWxkIHJldHVybiBzYW1lICd2YWxpZGl0eScgdmFsdWUgd2UgZGlkCi0JCQkvLyB3aGVuIGNhbGxlZCBiZWZvcmUuICh0ZWNobmljYWxseSwgY291bGQgYmUgYSBwZXJmb3JtYW5jZSBpc3N1ZQotCQkJLy8gaW4gZnV0dXJlLCBzbyBtaWdodCB3YW50IHRvIGNoZWNrIGlmIGFueSAnb2wgdmFsdWUgd291bGQKLQkJCS8vIGJlIG9rIGhlcmUuCi0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQkvLyBhc3N1bW1taW5nIHdlIHNob3VsZCByZXR1cm4gc2FtZSAndmFsaWRpdHknIHZhbHVlIHdlIGRpZAotCQkJLy8gd2hlbiBjYWxsZWQgYmVmb3JlLiAodGVjaG5pY2FsbHksIGNvdWxkIGJlIGEgcGVyZm9ybWFuY2UgaXNzdWUKLQkJCS8vIGluIGZ1dHVyZSwgc28gbWlnaHQgd2FudCB0byBjaGVjayBpZiBoYXJkIGNvZGVkICd2YWxpZCcgd291bGQKLQkJCS8vIGJlIG9rIGhlcmUuCi0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZVtdIGdldFN1cHBvcnRlZE9wdGlvbnMoKSB7Ci0KLQkJcmV0dXJuIFNVUFBPUlRFRF9PUFRJT05TOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCW1ha2VCdXN5KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZUJ1c3koKSB7Ci0JCS8vIGZvciB0aGlzIHRlc3QgImNvbnRlbnQgdHlwZSIsIHdlIGRvbid0Ci0JCS8vIHJlYWxseSBjYWxjdWxhdGUgYW55dGhpbmcuIFdlIGp1c3QKLQkJLy8ganVzdCB0YWtlIGEgbG9uZyB0aW1lIGRvaW5nIG5vdGhpbmcuCi0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoU0lNVUxBVEVEX0NBTENVTEFUSU9OX1RJTUUpOwotCQl9Ci0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBuZXZlciBleHBlY3RlZAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJbWFrZUJ1c3koKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkvLyBjdXJyZW50bHkgbm8gY29udGVudHMgc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkIEhUTUwgY29udGVudHMKLQkJLy8gKHRoaXMgbWF5IGNoYW5nZSBvbmNlIHdlIGFkZCBYSFRNTCBjb250ZW50IHR5cGUpCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShSZWFkZXIgcmVhZGVyKSB7Ci0JCS8vIG5vIGNvbnRlbnRzIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZCBIVE1MIGNvbnRlbnRzCi0JCS8vICh0aGlzIG1heSBjaGFuZ2Ugb25jZSB3ZSBhZGQgWEhUTUwgY29udGVudCB0eXBlKQotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9FZGl0b3JQZXJmb3JtYW5jZVN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvRWRpdG9yUGVyZm9ybWFuY2VTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjlhOGVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9FZGl0b3JQZXJmb3JtYW5jZVN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yUGVyZm9ybWFuY2VTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgW10gRURJVE9SX0ZJTEVfRVhURU5TSU9OUyA9IHsicGVyZl9iYXNpYyIsICJwZXJmX291dGxpbmUiLCAiamF2YSJ9OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFtdW10gRURJVE9SX1NXSVRDSF9QQUlSUyA9IHsKLSAgICAgICAgeyJwZXJmX291dGxpbmUiLCAiamF2YSJ9LAotICAgICAgICB7InBlcmZfYmFzaWMiLCAicGVyZl9vdXRsaW5lIn19OwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1aXRlLiBUaGlzIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IEVkaXRvclBlcmZvcm1hbmNlU3VpdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWRpdG9yUGVyZm9ybWFuY2VTdWl0ZSgpIHsKLSAgICAgICAgYWRkT3BlbkNsb3NlU2NlbmFyaW9zKCk7Ci0gICAgICAgIGFkZFN3aXRjaFNjZW5hcmlvcygpOwotICAgICAgICBhZGRPcGVuTXVsdGlwbGVTY2VuYXJpb3ModHJ1ZSk7Ci0gICAgICAgIGFkZE9wZW5NdWx0aXBsZVNjZW5hcmlvcyhmYWxzZSk7Ci0gICAgfQotCi0gICAgLy8gQ29tbWVudGVkIG91dDogdGhlc2UgdGVzdHMgZG9uJ3Qgc2VlbSB0byBiZSB3b3JraW5nIAotLy8gICAgLyoqCi0vLyAgICAgKiAKLS8vICAgICAqIEBzaW5jZSAzLjEKLS8vICAgICAqLwotLy8gICAgcHJpdmF0ZSB2b2lkIGFkZFJlc2l6ZVNjZW5hcmlvcygpIHsKLS8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVESVRPUl9GSUxFX0VYVEVOU0lPTlMubGVuZ3RoOyBpKyspIHsKLS8vICAgICAgICAgICAgYWRkVGVzdChuZXcgUmVzaXplVGVzdChuZXcgRWRpdG9yV2lkZ2V0RmFjdG9yeSgiMS4iICsgRURJVE9SX0ZJTEVfRVhURU5TSU9OU1tpXSkpKTsgICAgICAgICAgICAKLS8vICAgICAgICB9ICAgICAgICAgICAgICAgCi0vLyAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkU3dpdGNoU2NlbmFyaW9zKCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVESVRPUl9TV0lUQ0hfUEFJUlMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFkZFRlc3QobmV3IEVkaXRvclN3aXRjaFRlc3QoRURJVE9SX1NXSVRDSF9QQUlSU1tpXSkpOyAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRPcGVuTXVsdGlwbGVTY2VuYXJpb3MoYm9vbGVhbiBjbG9zZUFsbCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVESVRPUl9GSUxFX0VYVEVOU0lPTlMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFkZFRlc3QobmV3IE9wZW5NdWx0aXBsZUVkaXRvclRlc3QoRURJVE9SX0ZJTEVfRVhURU5TSU9OU1tpXSwgY2xvc2VBbGwsIChjbG9zZUFsbCAmJiBpID09IDApID8gQmFzaWNQZXJmb3JtYW5jZVRlc3QuTE9DQUwgOiBCYXNpY1BlcmZvcm1hbmNlVGVzdC5OT05FKSk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkT3BlbkNsb3NlU2NlbmFyaW9zKCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVESVRPUl9GSUxFX0VYVEVOU0lPTlMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFkZFRlc3QobmV3IE9wZW5DbG9zZUVkaXRvclRlc3QoRURJVE9SX0ZJTEVfRVhURU5TSU9OU1tpXSwgaSA9PSAzID8gQmFzaWNQZXJmb3JtYW5jZVRlc3QuTE9DQUwgOiBCYXNpY1BlcmZvcm1hbmNlVGVzdC5OT05FKSk7ICAgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9FZGl0b3JTd2l0Y2hUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvRWRpdG9yU3dpdGNoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDdmNTlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9FZGl0b3JTd2l0Y2hUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogVGVzdCBlZGl0b3Igc3dpdGNoaW5nLgotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yU3dpdGNoVGVzdCBleHRlbmRzIEJhc2ljUGVyZm9ybWFuY2VUZXN0IHsKLQotCXByaXZhdGUgU3RyaW5nIGV4dGVuc2lvbjE7Ci0KLQlwcml2YXRlIFN0cmluZyBleHRlbnNpb24yOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHRlc3ROYW1lCi0JICogICAgICAgICAgICBUZXN0J3MgbmFtZS4KLQkgKi8KLQlwdWJsaWMgRWRpdG9yU3dpdGNoVGVzdChTdHJpbmdbXSBwYWlyKSB7Ci0JCXN1cGVyKCJ0ZXN0RWRpdG9yU3dpdGNoOiIgKyBwYWlyWzBdICsgIiwiICsgcGFpclsxXSk7Ci0JCWV4dGVuc2lvbjEgPSBwYWlyWzBdOwotCQlleHRlbnNpb24yID0gcGFpclsxXTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGVkaXRvciBvcGVuaW5nIHBlcmZvcm1hbmNlLiBUaGlzIHRlc3QgYWx3YXlzIGZhaWxzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gT3BlbiBib3RoIGZpbGVzIG91dHNpZGUgdGhlIGxvb3Agc28gYXMgbm90IHRvIGluY2x1ZGUKLQkJLy8gdGhlIGluaXRpYWwgdGltZSB0byBvcGVuLCBqdXN0IHN3aXRjaGluZy4KLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBvcGVuVGVzdFdpbmRvdyhVSVBlcmZvcm1hbmNlVGVzdFNldHVwLlBFUlNQRUNUSVZFMSk7Ci0JCWZpbmFsIElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlmaW5hbCBJRmlsZSBmaWxlMSA9IGdldFByb2plY3QoKS5nZXRGaWxlKCIxLiIgKyBleHRlbnNpb24xKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlMS5leGlzdHMoKSk7Ci0JCWZpbmFsIElGaWxlIGZpbGUyID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoIjEuIiArIGV4dGVuc2lvbjIpOwotCQlhc3NlcnRUcnVlKGZpbGUyLmV4aXN0cygpKTsKLQkJSURFLm9wZW5FZGl0b3IoYWN0aXZlUGFnZSwgZmlsZTEsIHRydWUpOwotCQlJREUub3BlbkVkaXRvcihhY3RpdmVQYWdlLCBmaWxlMiwgdHJ1ZSk7Ci0JCXByb2Nlc3NFdmVudHMoKTsKLSAgICAgICAgRWRpdG9yVGVzdEhlbHBlci5jYWxtRG93big1MDAsIDMwMDAwLCA1MDApOwotICAgICAgICB3YWl0Rm9yQmFja2dyb3VuZEpvYnMoKTsKLSAgICAgICAgCi0gICAgICAgIGV4ZXJjaXNlKG5ldyBUZXN0UnVubmFibGUoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geyAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICAgICAgSURFLm9wZW5FZGl0b3IoYWN0aXZlUGFnZSwgZmlsZTEsIHRydWUpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NFdmVudHMoKTsKLSAgICAgICAgICAgICAgICBJREUub3BlbkVkaXRvcihhY3RpdmVQYWdlLCBmaWxlMiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICAgICAgICAgIHN0b3BNZWFzdXJpbmcoKTsKLSAgICAgICAgICAgICAgICBFZGl0b3JUZXN0SGVscGVyLmNhbG1Eb3duKDUwMCwgMzAwMDAsIDEwMCk7Ci0gICAgICAgICAgICAgfSAKLSAgICAgICAgfSk7Ci0gICAgICAgIAotCQljb21taXRNZWFzdXJlbWVudHMoKTsKLQkJYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvRWRpdG9yVGVzdEhlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL0VkaXRvclRlc3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjMTcxYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvRWRpdG9yVGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JUZXN0SGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkluRWRpdG9yKElGaWxlIGZpbGUsIGJvb2xlYW4gcnVuRXZlbnRMb29wKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBwYXJ0PSBJREUub3BlbkVkaXRvcihnZXRBY3RpdmVQYWdlKCksIGZpbGUpOwotCQlpZiAocnVuRXZlbnRMb29wKQotCQkJcnVuRXZlbnRRdWV1ZShwYXJ0KTsKLQkJcmV0dXJuIHBhcnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuSW5FZGl0b3IoSUZpbGUgZmlsZSwgU3RyaW5nIGVkaXRvcklkLCBib29sZWFuIHJ1bkV2ZW50TG9vcCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJSUVkaXRvclBhcnQgcGFydD0gSURFLm9wZW5FZGl0b3IoZ2V0QWN0aXZlUGFnZSgpLCBmaWxlLCBlZGl0b3JJZCk7Ci0JCWlmIChydW5FdmVudExvb3ApCi0JCQlydW5FdmVudFF1ZXVlKHBhcnQpOwotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElEb2N1bWVudCBnZXREb2N1bWVudChJVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXI9IGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dD0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCXJldHVybiBwcm92aWRlci5nZXREb2N1bWVudChpbnB1dCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJldmVydEVkaXRvcihJVGV4dEVkaXRvciBlZGl0b3IsIGJvb2xlYW4gcnVuRXZlbnRRdWV1ZSkgewotCQllZGl0b3IuZG9SZXZlcnRUb1NhdmVkKCk7Ci0JCWlmIChydW5FdmVudFF1ZXVlKQotCQkJcnVuRXZlbnRRdWV1ZShlZGl0b3IpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VBbGxFZGl0b3JzKCkgewotCQlJV29ya2JlbmNoUGFnZSBwYWdlPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChwYWdlICE9IG51bGwpCi0JCQlwYWdlLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5FdmVudFF1ZXVlKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdz0gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkKLQkJCXJ1bkV2ZW50UXVldWUod2luZG93LmdldFNoZWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRXZlbnRRdWV1ZShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXJ1bkV2ZW50UXVldWUocGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5FdmVudFF1ZXVlKFNoZWxsIHNoZWxsKSB7Ci0JCXdoaWxlIChzaGVsbC5nZXREaXNwbGF5KCkucmVhZEFuZERpc3BhdGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRXZlbnRRdWV1ZShsb25nIG1pblRpbWUpIHsKLQkJbG9uZyBuZXh0Q2hlY2s9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgbWluVGltZTsKLQkJd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgbmV4dENoZWNrKSB7Ci0JCQlydW5FdmVudFF1ZXVlKCk7Ci0JCQlzbGVlcCgxKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hXaW5kb3cgZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldEFjdGl2ZVBhZ2UoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldEFjdGl2ZURpc3BsYXkoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FsbURvd24obG9uZyBtaW5UaW1lLCBsb25nIG1heFRpbWUsIGxvbmcgaW50ZXJ2YWxUaW1lKSB7Ci0JCWxvbmcgc3RhcnRUaW1lPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIG1pblRpbWU7Ci0JCXJ1bkV2ZW50UXVldWUoKTsKLQkJd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgc3RhcnRUaW1lKQotCQkJcnVuRXZlbnRRdWV1ZShpbnRlcnZhbFRpbWUpOwotCQkKLQkJbG9uZyBlbmRUaW1lPSBtYXhUaW1lID4gMCA/IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgbWF4VGltZSA6IExvbmcuTUFYX1ZBTFVFOwotCQlib29sZWFuIGNhbG09IGlzQ2FsbSgpOwotCQl3aGlsZSAoIWNhbG0gJiYgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBlbmRUaW1lKSB7Ci0JCQlydW5FdmVudFF1ZXVlKGludGVydmFsVGltZSk7Ci0JCQljYWxtPSBpc0NhbG0oKTsKLQkJfQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLQkJcmV0dXJuIGNhbG07Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNsZWVwKGludCBpbnRlcnZhbFRpbWUpIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChpbnRlcnZhbFRpbWUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2FsbSgpIHsKLQkJSUpvYk1hbmFnZXIgam9iTWFuYWdlcj0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpOwotCQlKb2JbXSBqb2JzPSBqb2JNYW5hZ2VyLmZpbmQobnVsbCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlKb2Igam9iPSBqb2JzW2ldOwotCQkJaW50IHN0YXRlPSBqb2IuZ2V0U3RhdGUoKTsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKGpvYi5nZXROYW1lKCkgKyAiOiAiICsgZ2V0U3RhdGVOYW1lKHN0YXRlKSk7Ci0JCQlpZiAoc3RhdGUgPT0gSm9iLlJVTk5JTkcgfHwgc3RhdGUgPT0gSm9iLldBSVRJTkcpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdGF0ZU5hbWUoaW50IHN0YXRlKSB7Ci0vLwkJc3dpdGNoIChzdGF0ZSkgewotLy8JCQljYXNlIEpvYi5SVU5OSU5HOiByZXR1cm4gIlJVTk5JTkciOwotLy8JCQljYXNlIEpvYi5XQUlUSU5HOiByZXR1cm4gIldBSVRJTkciOwotLy8JCQljYXNlIEpvYi5TTEVFUElORzogcmV0dXJuICJTTEVFUElORyI7Ci0vLwkJCWNhc2UgSm9iLk5PTkU6IHJldHVybiAiTk9ORSI7Ci0vLwkJCWRlZmF1bHQ6IHJldHVybiAidW5rbm93biAiICsgc3RhdGU7Ci0vLwkJfQotLy8JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dWaWV3KFN0cmluZyB2aWV3SWQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2U9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJSVZpZXdSZWZlcmVuY2Ugdmlldz0gYWN0aXZlUGFnZS5maW5kVmlld1JlZmVyZW5jZSh2aWV3SWQpOwotCQlib29sZWFuIG5vdFNob3duPSB2aWV3ID09IG51bGw7Ci0JCWlmIChub3RTaG93bikKLQkJCWFjdGl2ZVBhZ2Uuc2hvd1ZpZXcodmlld0lkKTsKLQkJcmV0dXJuIG5vdFNob3duOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoaWRlVmlldyhTdHJpbmcgdmlld0lkKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2U9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJSVZpZXdSZWZlcmVuY2Ugdmlldz0gYWN0aXZlUGFnZS5maW5kVmlld1JlZmVyZW5jZSh2aWV3SWQpOwotCQlib29sZWFuIHNob3duPSB2aWV3ICE9IG51bGw7Ci0JCWlmIChzaG93bikKLQkJCWFjdGl2ZVBhZ2UuaGlkZVZpZXcodmlldyk7Ci0JCXJldHVybiBzaG93bjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYnJpbmdUb1RvcCgpIHsKLQkJZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKS5mb3JjZUFjdGl2ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9HZW5lcmF0ZUlkZW50aWZpZXJzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL0dlbmVyYXRlSWRlbnRpZmllcnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTg0MDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL0dlbmVyYXRlSWRlbnRpZmllcnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQWN0aXZpdHlNYW5hZ2VyOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUlkZW50aWZpZXJzVGVzdCBleHRlbmRzIEJhc2ljUGVyZm9ybWFuY2VUZXN0IHsKLQotICAgIHByaXZhdGUgaW50IGNvdW50OwotCi0gICAgcHVibGljIEdlbmVyYXRlSWRlbnRpZmllcnNUZXN0KGludCBudW1iZXJPZklkZW50aWZpZXJzKSB7Ci0gICAgICAgIHN1cGVyKCJHZW5lcmF0ZSAiICsgbnVtYmVyT2ZJZGVudGlmaWVycyArICIgaWRlbnRpZmllcnMiLCBCYXNpY1BlcmZvcm1hbmNlVGVzdC5MT0NBTCk7Ci0gICAgICAgIHRoaXMuY291bnQgPSBudW1iZXJPZklkZW50aWZpZXJzOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7ICAgICAgIAotICAgICAgICBmaW5hbCBJQWN0aXZpdHlNYW5hZ2VyIGFjdGl2aXR5TWFuYWdlciA9IGZXb3JrYmVuY2guZ2V0QWN0aXZpdHlTdXBwb3J0KCkuZ2V0QWN0aXZpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIAotICAgICAgICB0YWdJZk5lY2Vzc2FyeSgiVUkgLSBHZW5lcmF0ZSBJZGVudGlmaWVycyIsIERpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOwotICAgICAgICBleGVyY2lzZShuZXcgVGVzdFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgLy8gY29uc3RydWN0IHRoZSBJZGVudGlmaWVycyB0byB0ZXN0Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIFtdIGlkcyA9IG5ldyBTdHJpbmdbY291bnRdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlkc1tpXSA9ICJvcmcuZWNsaXBzZS5qZHQudWkvIiArIGkgKyB0aW1lc3RhbXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eU1hbmFnZXIuZ2V0SWRlbnRpZmllcihpZHNbaV0pOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3RvcE1lYXN1cmluZygpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSk7Ci0gICAgICAgIGNvbW1pdE1lYXN1cmVtZW50cygpOwotICAgICAgICBhc3NlcnRQZXJmb3JtYW5jZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9PYmplY3RDb250cmlidXRpb25DbGFzc2VzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTFjOGI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9PYmplY3RDb250cmlidXRpb25DbGFzc2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm1PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIyOwotCi1wdWJsaWMgY2xhc3MgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3NlcyBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gInRlc3RDb250cmlidXRvclJlc291cmNlQWRhcHRlciI7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUNvbW1vbiB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tbW9uIGltcGxlbWVudHMgSUNvbW1vbiB7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUEgewotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEEgaW1wbGVtZW50cyBJQSB7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEExIGV4dGVuZHMgQSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQTExIGV4dGVuZHMgQTEgewotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJQiB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQiBpbXBsZW1lbnRzIElCIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBCMiBpbXBsZW1lbnRzIElCIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEIGV4dGVuZHMgQ29tbW9uIGltcGxlbWVudHMgSUEgewotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEMgaW1wbGVtZW50cyBJQ29tbW9uIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDUmVzb3VyY2UgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCWlmKGFkYXB0ZXIgPT0gSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyLmNsYXNzKSB7Ci0JCQkJcmV0dXJuIG5ldyBSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJCX0JCQkKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDRmlsZSBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJaWYoYWRhcHRlciA9PSBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIuY2xhc3MpIHsKLQkJCQlyZXR1cm4gbmV3IFJlc291cmNlQWRhcHRlcigpOwotCQkJfQkJCQotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCX0KLQkKLQkvLyBSZXR1cm5zIGEgY29udHJpYnV0aW9uIGFkYXB0ZXIgdGhhdCBkb2Vzbid0IGhhbmRsZSBSZXNvdXJjZU1hcHBpbmdzCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDUmVzb3VyY2VPbmx5IGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQlpZihhZGFwdGVyID09IElDb250cmlidXRvclJlc291cmNlQWRhcHRlci5jbGFzcykgewotCQkJCXJldHVybiBuZXcgUmVzb3VyY2VPbmx5QWRhcHRlcigpOwotCQkJfQkJCQotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCX0KLSAgICAKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElNb2RlbEVsZW1lbnQgewotICAgIH0KLQkKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZGVsRWxlbWVudCBleHRlbmRzIFBsYXRmb3JtT2JqZWN0IGltcGxlbWVudHMgSU1vZGVsRWxlbWVudCB7Ci0gICAgfQotICAgIAotCS8vIERlZmF1bHQgY29udHJpYnV0b3IgYWRhcHRlcgotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VBZGFwdGVyIGltcGxlbWVudHMgSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyMiB7Ci0JCXB1YmxpYyBJUmVzb3VyY2UgZ2V0QWRhcHRlZFJlc291cmNlKElBZGFwdGFibGUgYWRhcHRhYmxlKSB7Ci0JCQlpZihhZGFwdGFibGUgaW5zdGFuY2VvZiBDUmVzb3VyY2UpIHsKLQkJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCX0KLQkJCWlmKGFkYXB0YWJsZSBpbnN0YW5jZW9mIENGaWxlKSB7Ci0JCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpLmdldEZpbGUoImR1bW15Iik7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotICAgICAgICBwdWJsaWMgUmVzb3VyY2VNYXBwaW5nIGdldEFkYXB0ZWRSZXNvdXJjZU1hcHBpbmcoSUFkYXB0YWJsZSBhZGFwdGFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiAoUmVzb3VyY2VNYXBwaW5nKWdldEFkYXB0ZWRSZXNvdXJjZShhZGFwdGFibGUpLmdldEFkYXB0ZXIoUmVzb3VyY2VNYXBwaW5nLmNsYXNzKTsKLSAgICAgICAgfQkKLQl9Ci0JCi0JLy8gQ29udHJpYnV0b3IgYWRhcHRlciB0aGF0IGRvZXNuJ3QgaGFuZGxlIHJlc291cmNlIG1hcHBpbmdzCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZU9ubHlBZGFwdGVyIGltcGxlbWVudHMgSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyIHsKLQkJcHVibGljIElSZXNvdXJjZSBnZXRBZGFwdGVkUmVzb3VyY2UoSUFkYXB0YWJsZSBhZGFwdGFibGUpIHsKLQkJCWlmKGFkYXB0YWJsZSBpbnN0YW5jZW9mIENSZXNvdXJjZU9ubHkpIHsKLQkJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8vIEFkYXB0ZXIgbWV0aG9kcwotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZihhZGFwdGVyVHlwZSA9PSBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIuY2xhc3MpIHsKLQkJCXJldHVybiBuZXcgUmVzb3VyY2VBZGFwdGVyKCk7Ci0JCX0KLQkJaWYoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSUEgJiYgYWRhcHRlclR5cGUgPT0gSUEuY2xhc3MpIHsKLQkJCXJldHVybiBuZXcgQSgpOwotCQl9Ci0JCWlmKGFkYXB0ZXJUeXBlID09IElSZXNvdXJjZS5jbGFzcykgewotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCX0KLQkJaWYoYWRhcHRlclR5cGUgPT0gSUNvbW1vbi5jbGFzcykgewotCQkJcmV0dXJuIG5ldyBDb21tb24oKTsKLQkJfQotICAgICAgICBpZihhZGFwdGVyVHlwZSA9PSBSZXNvdXJjZU1hcHBpbmcuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VNYXBwaW5nKCkgeyAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgUmVzb3VyY2VUcmF2ZXJzYWxbXSBnZXRUcmF2ZXJzYWxzKFJlc291cmNlTWFwcGluZ0NvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VUcmF2ZXJzYWxbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlVHJhdmVyc2FsKG5ldyBJUmVzb3VyY2VbXSB7UmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKX0sIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgSVJlc291cmNlLk5PTkUpCi0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyBJUHJvamVjdFtdIGdldFByb2plY3RzKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRhcHRhYmxlT2JqZWN0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyBJQ29tbW9uLmNsYXNzLCBJUmVzb3VyY2UuY2xhc3MsIElGaWxlLmNsYXNzLCBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsIFJlc291cmNlTWFwcGluZy5jbGFzc307Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL09iamVjdENvbnRyaWJ1dGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9PYmplY3RDb250cmlidXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZTM2ZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL09iamVjdENvbnRyaWJ1dGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuUGx1Z2luQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Qb3B1cE1lbnVFeHRlbmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5JQ29tbW9uOwotLyoqCi0gKiBUZXN0cyB0aGF0IG9iamVjdCBjb250cmlidXRpb25zIGFyZSBlbmFibGVkIGFuZCBzaG93biBjb3JyZWN0bHkgaW4gcG9wLXVwCi0gKiBtZW51cyBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSB3b3JrYmVuY2guIFRoaXMgdGVzdCByZWxpZXMgb24gdGhlCi0gKiA8Y29kZT5wbHVnaW4ueG1sPC9jb2RlPiBmaWxlIGNvbnRhaW5pbmcgY2VydGFpbiB2YWx1ZXMuIFBsZWFzZSBzZWUgdGhlCi0gKiBhcHByb3ByaWF0ZSBzZWN0aW9uIGluIHRoYXQgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5pdGlhbAotICogc2V0LXVwLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBPYmplY3RDb250cmlidXRpb25UZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPk9iamVjdENvbnRyaWJ1dGlvblRlc3Q8L2NvZGU+IHdpdGgKLSAgICAgKiB0aGUgbmFtZSBvZiB0aGUgdGVzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHRlc3Q7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0Q29udHJpYnV0aW9uVGVzdChmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBjb250ZW50LXR5cGUgb2JqZWN0IGNvbnRyaWJ1dGlvbiB3b3Jrcy4gVGhpcyBpcyB0ZXN0aW5nCi0gICAgICogYSB1c2UgY2FyZSBmYW1pbGlhciB0byBBbnQgVUkuIFRoZSBjb250ZW50LXR5cGUgc2NhbnMgYW4gWE1MIGZpbGUgdG8gc2VlCi0gICAgICogaWYgaXRzIHJvb3QgZWxlbWVudCBpcyA8Y29kZT4mbHQ7cHJvamVjdCZndDs8L2NvZGU+LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgd2hlbiBjcmVhdGluZyB0aGUgcHJvamVjdCBvciBmaWxlLCBvciBpZgotICAgICAqICAgICAgICAgICAgIHRoZSBwcm9qZWN0IGNhbid0IGJlIG9wZW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0T2JqZWN0U3RhdGVDb250ZW50VHlwZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ3JlYXRlIGFuIFhNTCBmaWxlIHdpdGggPHByb2plY3Q+IGFzIGl0cyByb290IGVsZW1lbnQuCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBmaW5hbCBJUHJvamVjdCB0ZXN0UHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLSAgICAgICAgICAgICAgICAiT2JqZWN0Q29udHJpYnV0aW9uVGVzdFByb2plY3QiKTsKLSAgICAgICAgdGVzdFByb2plY3QuY3JlYXRlKG51bGwpOwotICAgICAgICB0ZXN0UHJvamVjdC5vcGVuKG51bGwpOwotICAgICAgICBmaW5hbCBJRmlsZSB4bWxGaWxlID0gdGVzdFByb2plY3QuZ2V0RmlsZSgiT2JqZWN0Q29udHJpYnV0aW9uVGVzdC54bWwiKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRlbnRzID0gIjx0ZXN0T2JqZWN0U3RhdGVDb250ZW50VHlwZUVsZW1lbnQ+PC90ZXN0T2JqZWN0U3RhdGVDb250ZW50VHlwZUVsZW1lbnQ+IjsKLSAgICAgICAgZmluYWwgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgY29udGVudHMuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIHhtbEZpbGUuY3JlYXRlKGlucHV0U3RyZWFtLCB0cnVlLCBudWxsKTsKLSAgICAgICAgZmluYWwgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih4bWxGaWxlKTsKLSAgICAgICAgYXNzZXJ0UG9wdXBNZW51cygiMSIsIG5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnRlc3RPYmplY3RTdGF0ZUNvbnRlbnRUeXBlIn0sIHNlbGVjdGlvbiwgbnVsbCwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgdGVzdHMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBmb3IgYWRhcHRhYmxlIElSZXNvdXJjZSBvYmplY3RDb250cmlidXRpb25zLiBUaGlzCi0gICAgICogYWxsb3dzIElSZXNvdXJjZSBhZGFwdGFibGUgY29udHJpYnV0aW9ucyB3aXRob3V0IGFuIGFkYXB0ZXIgZmFjdG9yeSBhbmQgdXNpbmcKLSAgICAgKiB0aGUgSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyIGZhY3RvcnkuIEluIGFkZGl0aW9uLCB0ZXN0IHRoZSBSZXNvdXJjZU1hcHBpbmcgYWRhcHRhdGlvbnMuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDb250cmlidXRvclJlc291cmNlQWRhcHRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJCi0gICAgCWZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBmaW5hbCBJUHJvamVjdCB0ZXN0UHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChPYmplY3RDb250cmlidXRpb25DbGFzc2VzLlBST0pFQ1RfTkFNRSk7Ci0gICAgICAgIGlmKCEgdGVzdFByb2plY3QuZXhpc3RzKCkpIHsKLSAgICAgICAgCXRlc3RQcm9qZWN0LmNyZWF0ZShudWxsKTsKLSAgICAgICAgfQotICAgICAgICBpZighIHRlc3RQcm9qZWN0LmlzT3BlbigpKSB7Ci0gICAgICAgIAl0ZXN0UHJvamVjdC5vcGVuKG51bGwpOwotICAgICAgICB9Ci0gICAgCQotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCIxIiwKLSAgICAJCQluZXcgU3RyaW5nW10geyJJUmVzb3VyY2UuMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10ge25ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNSZXNvdXJjZSgpfSksCi0JCQkJSVJlc291cmNlLmNsYXNzLAotCQkJCXRydWUKLQkJCSk7Ci0gICAgCWFzc2VydFBvcHVwTWVudXMoIjIiLAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklQcm9qZWN0LjEifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DRmlsZSgpfSksCi0JCQkJbnVsbCwKLQkJCQlmYWxzZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiMyIsIAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklGaWxlLjEifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DRmlsZSgpfSksCi0JCQkJSUZpbGUuY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiNCIsIAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklSZXNvdXJjZS4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ0ZpbGUoKSwgbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ1Jlc291cmNlKCl9KSwKLQkJCQlJUmVzb3VyY2UuY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiNSIsIAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklGaWxlLjEiLCAiSVByb2plY3QuMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10ge25ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNGaWxlKCksIG5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNSZXNvdXJjZSgpfSksCi0JCQkJSVJlc291cmNlLmNsYXNzLAotCQkJCWZhbHNlCi0JCQkpOwotICAgICAgICBhc3NlcnRQb3B1cE1lbnVzKCI2IiwgCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiUmVzb3VyY2VNYXBwaW5nLjEifSwgCi0gICAgICAgICAgICAgICAgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DRmlsZSgpLCBuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DUmVzb3VyY2UoKX0pLAotICAgICAgICAgICAgICAgIFJlc291cmNlTWFwcGluZy5jbGFzcywKLSAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgICAgICApOwotICAgICAgICBhc3NlcnRQb3B1cE1lbnVzKCI3IiwgCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiUmVzb3VyY2VNYXBwaW5nLjEiLCAiSVJlc291cmNlLjEifSwgCi0gICAgICAgICAgICAgICAgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5Nb2RlbEVsZW1lbnQoKX0pLAotICAgICAgICAgICAgICAgIFJlc291cmNlTWFwcGluZy5jbGFzcywKLSAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgICAgICApOwotICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgY2FzZSB3aGVyZSBhbiBvYmplY3QgdXNlcyBhIGNvbnRyaWJ1dGlvbiBhZGFwdGVyIHRoYXQgZG9lc24ndCBoYW5kbGUgbWFwcGluZ3MKLSAgICAgICAgLy8gd2lsbCBzdGlsbCBzaG93IHRoZSBtZW51cyBmb3IgcmVzb3VyY2UgbWFwcGluZ3MKLSAgICAgICAgYXNzZXJ0UG9wdXBNZW51cygiOCIsIAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IlJlc291cmNlTWFwcGluZy4xIiwgIklSZXNvdXJjZS4xIn0sIAotICAgICAgICAgICAgICAgIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ1Jlc291cmNlT25seSgpfSksCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VNYXBwaW5nLmNsYXNzLAotICAgICAgICAgICAgICAgIHRydWUKLSAgICAgICAgICAgICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgdGVzdHMgYWRhcHRhYmxlIGNvbnRyaWJ1dGlvbnMgdGhhdCBhcmUgbm90IElSZXNvdXJjZS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEFkYXB0YWJsZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgCWFzc2VydFBvcHVwTWVudXMoIjEiLCAKLSAgICAJCQluZXcgU3RyaW5nW10geyJJQ29tbW9uLjEifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsKLSAgICAJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkEoKX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsgIAotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCIyIiwgCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7Ci0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5BKCksIAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQigpfSksCi0JCQkJSUNvbW1vbi5jbGFzcywKLQkJCQl0cnVlCi0JCQkpOyAgICAgIAkKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiMyIsIAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklDb21tb24uMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10gewotICAgIAkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQSgpLCAKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkIoKSwgCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DKCksCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5Db21tb24oKQotCQkJCX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiNCIsIAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklDb21tb24uMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10gewotICAgIAkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ29tbW9uKCksIAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQygpLCAKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkIoKSwKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkEoKQotCQkJCX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiNSIsIAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklDb21tb24uMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10gewotICAgIAkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ29tbW9uKCksIAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQygpLCAKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkIoKSwKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkMoKSwgCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5BKCksCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5Db21tb24oKSAKLQkJCQl9KSwKLQkJCQlJQ29tbW9uLmNsYXNzLAotCQkJCXRydWUKLQkJCSk7Ci0gICAgCWFzc2VydFBvcHVwTWVudXMoIjYiLCAKLSAgICAJCQluZXcgU3RyaW5nW10geyJJQ29tbW9uLjEifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DKCksCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5Db21tb24oKQotCQkJCX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiNyIsIAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklDb21tb24uMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10geyAKLQkJCQkJCW5ldyBPYmplY3QoKQkJCQkKLQkJCQl9KSwKLQkJCQlJQ29tbW9uLmNsYXNzLAotCQkJCWZhbHNlCi0JCQkpOwotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCI4IiwgCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IAotICAgIAkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQygpLAotCQkJCQkJbmV3IE9iamVjdCgpCQkJCQotCQkJCX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJZmFsc2UKLQkJCSk7Ci0gICAgCWFzc2VydFBvcHVwTWVudXMoIjkiLCAKLSAgICAJCQluZXcgU3RyaW5nW10geyJJQ29tbW9uLjEifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgCi0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DKCksCi0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5BKCksCi0JCQkJCQluZXcgT2JqZWN0KCkJCQkJCi0JCQkJfSksCi0JCQkJSUNvbW1vbi5jbGFzcywKLQkJCQlmYWxzZQotCQkJKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSBjb250cmlidXRpb25zLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RHVwbGljYXRlQWRhcHRhYmxlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiMSIsCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7Ci0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5EKCl9KSwKLQkJCQlJQ29tbW9uLmNsYXNzLAotCQkJCXRydWUKLQkJCSk7Ci0gICAgCS8vIHJlcGVhdCB0ZXN0IG9uIHB1cnBvc2UgdG8gZW5zdXJlIG5vIGRvdWJsZSBjYWxsIGR1cGxpY2F0ZXMuICAgIAkKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiMSIsCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7Ci0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5EKCl9KSwKLQkJCQlJQ29tbW9uLmNsYXNzLAotCQkJCXRydWUKLQkJCSk7Ci0gICAgCWFzc2VydFBvcHVwTWVudXMoIjIiLAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklDb21tb24uMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10gewotICAgIAkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuRCgpLAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQSgpCi0JCQkJCQl9KSwKLQkJCQlJQ29tbW9uLmNsYXNzLAotCQkJCXRydWUKLQkJCSk7Ci0gICAgCWFzc2VydFBvcHVwTWVudXMoIjMiLAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklDb21tb24uMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10gewotICAgIAkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQSgpLAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuRCgpCi0JCQkJCQl9KSwKLQkJCQlJQ29tbW9uLmNsYXNzLAotCQkJCXRydWUKLQkJCSk7Ci0gICAgCWFzc2VydFBvcHVwTWVudXMoIjQiLAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklDb21tb24uMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10gewotICAgIAkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ29tbW9uKCksCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5EKCkKLQkJCQkJCX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiNSIsCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7ICAgIAkJCQkJCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5EKCksCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5Db21tb24oKQotCQkJCQkJfSksCi0JCQkJSUNvbW1vbi5jbGFzcywKLQkJCQl0cnVlCi0JCQkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IG5vbi1hZGFwdGFibGUgY29udHJpYnV0aW9ucwotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Tm9uQWRhcHRhYmxlQ29udHJpYnV0aW9ucygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiMSIsCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4yIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7Ci0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5BKCksCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5CKCl9KSwKLQkJCQlJQ29tbW9uLmNsYXNzLAotCQkJCWZhbHNlCi0JCQkpOwotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCIyIiwKLSAgICAJCQluZXcgU3RyaW5nW10geyJJQ29tbW9uLjIifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsKLSAgICAJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkQoKSwKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkMoKSwKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNvbW1vbigpfSksCi0JCQkJSUNvbW1vbi5jbGFzcywKLQkJCQl0cnVlCi0JCQkpOyAKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiMyIsCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiQ29tbW9uLjIifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsKLSAgICAJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkQoKSwKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkMoKSwKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkEoKX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJZmFsc2UKLQkJCSk7IAotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCI0IiwKLSAgICAJCQluZXcgU3RyaW5nW10geyJDb21tb24uMiJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10gewotICAgIAkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQigpLAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQygpLAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQSgpfSksCi0JCQkJSUNvbW1vbi5jbGFzcywKLQkJCQlmYWxzZQotCQkJKTsgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEhlbHBlciBjbGFzcyB0aGF0IHdpbGwgY3JlYXRlIGEgcG9wdXAgbWVudSBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGFuZAotICAgICAqIHRoZW4gZW5zdXJlIHRoYXQgdGhlIHByb3ZpZGVkIGNvbW1hbmRJZHMgYXJlIGFkZGVkIHRvIHRoZSBtZW51LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21tYW5kSWRzIHRoZSBjb21tYW5kIGlkcyB0aGF0IHNob3VsZCBhcHBlYXIgaW4gdGhlIG1lbnUKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBzZWxlY3Rpb24gb24gd2hpY2ggdG8gY29udHJpYnV0ZSBvYmplY3QgY29udHJpYnV0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFzc2VydFBvcHVwTWVudXMoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGNvbW1hbmRJZHMsIGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCBDbGFzcyBzZWxlY3Rpb25UeXBlLCBib29sZWFuIGV4aXN0YW5jZSkgewotICAgIAlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBuZXcgSVNlbGVjdGlvblByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCX0KLQkJCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJCQlyZXR1cm4gc2VsZWN0aW9uOwotCQkJfQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJfQotCQl9OwotCQkKLQkJLy8gVGhlIHBvcHVwIGV4dGVuZGVyIG5lZWRzIGEgcGFydCB0byBub3RpZnkgYWN0aW9ucyBvZiB0aGUgYWN0aXZlIHBhcnQKLSAgICAgICAgZmluYWwgV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IChXb3JrYmVuY2hXaW5kb3cpIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgIGZpbmFsIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFnZS5nZXRBY3RpdmVQYXJ0UmVmZXJlbmNlKCkuZ2V0UGFydCh0cnVlKTsKLSAgICAJCi0gICAgCSAvLyBDcmVhdGUgYSBmYWtlIFBvcHVwTWVudUV4dGVuZGVyIHNvIHdlIGNhbiBnZXQgc29tZSBkYXRhIGJhY2suCi0gICAgICAgIGZpbmFsIE1lbnVNYW5hZ2VyIGZha2VNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOwotICAgICAgICBmYWtlTWVudU1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcigKLSAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotICAgICAgICBmaW5hbCBQb3B1cE1lbnVFeHRlbmRlciBleHRlbmRlciA9IG5ldyBQb3B1cE1lbnVFeHRlbmRlcihudWxsLAotICAgICAgICAgICAgICAgIGZha2VNZW51TWFuYWdlciwgc2VsZWN0aW9uUHJvdmlkZXIsIHBhcnQpOwotICAgICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogUHJldGVuZCB0byBzaG93IHRoZSBwb3AtdXAgbWVudSAtLSBsb29raW5nIHRvIG1vdGl2YXRlIHRoZSBleHRlbmRlcgotICAgICAgICAgKiB0byBmaWxsIHRoZSBtZW51IGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24gcHJvdmlkZXIuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUT0RPIFRoaXMgY2F1c2VzIGEgYmlnIGRlbGF5IChpbiB0aGUgb3JkZXIgb2YgYSBtaW51dGUgb3IgbW9yZSkgd2hpbGUKLSAgICAgICAgICogdHJ5aW5nIHRvIGZpbGwgdGhpcyBtZW51LiBJdCBzZWVtcyB0byBiZSBsb2FkaW5nIGEgYnVuY2ggb2YgcGx1Zy1pbnMsCi0gICAgICAgICAqIGFuZCBkb2luZyBjbGFzcyBsb2FkaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgZXh0ZW5kZXIubWVudUFib3V0VG9TaG93KGZha2VNZW51TWFuYWdlcik7Ci0KLSAgICAgICAgZXh0ZW5kZXIuZGlzcG9zZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcHByb3ByaWF0ZSBvYmplY3QgY29udHJpYnV0aW9ucyBhcmUgcHJlc2VudC4KLSAgICAgICAgZmluYWwgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IGZha2VNZW51TWFuYWdlci5nZXRJdGVtcygpOwotICAgICAgICBTZXQgc2VlbkNvbW1hbmRzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChjb21tYW5kSWRzKSk7Ci0gICAgICAgIExpc3QgY29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoY29tbWFuZElkcykpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgLy8gU3RlcCAxOiB0ZXN0IHRoZSBzZWxlY3Rpb24KLSAgICAgICAgICAgaWYgKHNlbGVjdGlvblR5cGUgIT0gbnVsbCkgewotCQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBjb250cmlidXRpb25JdGVtOwotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCQlpdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKSBjb250cmlidXRpb25JdGVtKS5nZXRJbm5lckl0ZW0oKTsKLQkJCQl9Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBQbHVnaW5BY3Rpb25Db250cmlidXRpb25JdGVtKSB7Ci0JCQkJCS8vIFZlcmlmeSB0aGF0IHRoZSBzZWxlY3Rpb24gcGFzc2VkIHRvIHRoZSBhY3Rpb24gaGFzIGJlZW4KLQkJCQkJLy8gY29udmVydGVkCi0JCQkJCVBsdWdpbkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gcGEgPSAoUGx1Z2luQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaXRlbTsKLQkJCQkJSVNlbGVjdGlvbiBzID0gbnVsbDsKLQkJCQkJaWYgKHMgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHMpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQkJCQlhc3NlcnRUcnVlKG5hbWUgKyAiIHNlbGVjdGlvbiBub3QgY29udmVydGVkIiwgc2VsZWN0aW9uVHlwZS5pc0luc3RhbmNlKGVsZW1lbnQpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLSAgICAgICAgICAgLy8gU3RlcCAyOiByZW1lbWJlciB0aGF0IHdlIHNhdyB0aGlzIGVsZW1lbnQKLSAgICAgICAgICAgU3RyaW5nIGlkID0gY29udHJpYnV0aW9uSXRlbS5nZXRJZCgpOwotICAgICAgICAgICBpZihleGlzdGFuY2UpIHsgICAgCQkKLSAgICAgICAgICAgCQlib29sZWFuIHJlbW92ZWQgPSBjb21tYW5kcy5yZW1vdmUoaWQpOwkKLSAgICAgICAgICAgCQlpZihzZWVuQ29tbWFuZHMuY29udGFpbnMoaWQpICYmICEgcmVtb3ZlZCkgewotICAgICAgICAgICAJCQlmYWlsKG5hbWUgKyAiIGl0ZW0gZHVwbGljYXRlZCBpbiB0aGUgY29udGV4dCBtZW51OiAiICsgaWQpOwotICAgICAgICAgICAJCX0gICAgICAgICAgIAkJCi0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIAkJYXNzZXJ0VHJ1ZShuYW1lICsgIiBpdGVtIHNob3VsZCBub3QgYmUgaW4gdGhlIGNvbnRleHQgbWVudSIsICEgY29tbWFuZHMuY29udGFpbnMoaWQpKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZihleGlzdGFuY2UgJiYgISBjb21tYW5kcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgCWZhaWwobmFtZSArICIgTWlzc2luZyAiICsgY29tbWFuZHMudG9TdHJpbmcoKSArICIgZnJvbSBjb250ZXh0IG1lbnUuIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvT2JqZWN0Q29udHJpYnV0aW9uc1BlcmZvcm1hbmNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvT2JqZWN0Q29udHJpYnV0aW9uc1BlcmZvcm1hbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZDZiYTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL09iamVjdENvbnRyaWJ1dGlvbnNQZXJmb3JtYW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotCi1wdWJsaWMgY2xhc3MgT2JqZWN0Q29udHJpYnV0aW9uc1BlcmZvcm1hbmNlIGV4dGVuZHMgQmFzaWNQZXJmb3JtYW5jZVRlc3QgewotCi0JcHVibGljICBzdGF0aWMgZmluYWwgaW50IFNFRUQgPSAxMDAxMDAxOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiT2JqZWN0IGNvbnRyaWJ1dGlvbiBwZXJmb3JtYW5jZSIpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBPYmplY3RDb250cmlidXRpb25zUGVyZm9ybWFuY2UoCi0gICAgICAgICAgICAgICAgImxhcmdlIHNlbGVjdGlvbiwgbGltaXRlZCBjb250cmlidXRvcnMiLAotICAgICAgICAgICAgICAgIGdlbmVyYXRlQWRhcHRhYmxlU2VsZWN0aW9uKFNFRUQsIDUwMDApLAotICAgICAgICAgICAgICAgIEJhc2ljUGVyZm9ybWFuY2VUZXN0Lk5PTkUpKTsKLSAgICAgICAgc3VpdGUKLSAgICAgICAgICAgICAgICAuYWRkVGVzdChuZXcgT2JqZWN0Q29udHJpYnV0aW9uc1BlcmZvcm1hbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgImxpbWl0ZWQgc2VsZWN0aW9uLCBsaW1pdGVkIGNvbnRyaWJ1dG9ycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUFkYXB0YWJsZVNlbGVjdGlvbihTRUVELCA1MCksCi0gICAgICAgICAgICAgICAgICAgICAgICBCYXNpY1BlcmZvcm1hbmNlVGVzdC5OT05FKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdENvbnRyaWJ1dGlvbnNQZXJmb3JtYW5jZShTdHJpbmcgbGFiZWwsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgaW50IHRhZ2dpbmcpIHsKLQkJc3VwZXIoInRlc3RPYmplY3RDb250cmlidXRpb25zOiIgKyBsYWJlbCwgdGFnZ2luZyk7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7Ci0JCU9iamVjdENvbnRyaWJ1dGlvblRlc3QgdGVzdHMgPSBuZXcgT2JqZWN0Q29udHJpYnV0aW9uVGVzdCgKLSAgICAgICAgICAgICAgICAidGVzdE9iamVjdENvbnRyaWJ1dGlvbnMiKTsKLSAgICAgICAgdGFnSWZOZWNlc3NhcnkoIlVJIC0gIiArIHNlbGVjdGlvbi5zaXplKCkgKyAiIGNvbnRyaWJ1dGlvbihzKSIsCi0gICAgICAgICAgICAgICAgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0gICAgICAgIHNldERlZ3JhZGF0aW9uQ29tbWVudCgiPGEgaHJlZj1odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODgyNzQ+U2VlIEJ1ZyA4ODI3NDwvYT4gIik7Ci0gICAgICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwMDsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0cy5hc3NlcnRQb3B1cE1lbnVzKCIxIiwgbmV3IFN0cmluZ1tdIHsgImJvZ3VzIiB9LCBzZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBzdG9wTWVhc3VyaW5nKCk7Ci0gICAgICAgIGNvbW1pdE1lYXN1cmVtZW50cygpOwotICAgICAgICBhc3NlcnRQZXJmb3JtYW5jZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdlbmVyYXRlQWRhcHRhYmxlU2VsZWN0aW9uKGludCBzZWVkLCBpbnQgc2l6ZSkgewotCQlSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oc2VlZCk7Ci0JCUxpc3Qgc2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJc3dpdGNoICgoaW50KSBNYXRoLnJvdW5kKHJhbmQubmV4dERvdWJsZSgpICogNSkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlzZWxlY3Rpb24uYWRkKG5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkEoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXNlbGVjdGlvbi5hZGQobmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyIDoKLQkJCQkJc2VsZWN0aW9uLmFkZChuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDMgOgotCQkJCQlzZWxlY3Rpb24uYWRkKG5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNvbW1vbigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0IDoKLQkJCQkJc2VsZWN0aW9uLmFkZChuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5EKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDUgOgotCQkJCQlzZWxlY3Rpb24uYWRkKG5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkExKCkpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJc2VsZWN0aW9uLmFkZChuZXcgT2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuQ2xvc2VFZGl0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvT3BlbkNsb3NlRWRpdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODZiNDA1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuQ2xvc2VFZGl0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQ2xvc2VFZGl0b3JUZXN0IGV4dGVuZHMgQmFzaWNQZXJmb3JtYW5jZVRlc3QgewotCi0JcHJpdmF0ZSBTdHJpbmcgZXh0ZW5zaW9uOwotCi0JcHVibGljIE9wZW5DbG9zZUVkaXRvclRlc3QoU3RyaW5nIGV4dGVuc2lvbiwgaW50IHRhZ2dpbmcpIHsKLQkJc3VwZXIoInRlc3RPcGVuQW5kQ2xvc2VFZGl0b3JzOiIgKyBleHRlbnNpb24sIHRhZ2dpbmcpOwotCQl0aGlzLmV4dGVuc2lvbiA9IGV4dGVuc2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWZpbmFsIElGaWxlIGZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0RmlsZSgiMS4iICsgZXh0ZW5zaW9uKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKLQkJCi0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coVUlQZXJmb3JtYW5jZVRlc3RTZXR1cC5QRVJTUEVDVElWRTEpOwotCQlmaW5hbCBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQotICAgICAgICBleGVyY2lzZShuZXcgVGVzdFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgc3RhcnRNZWFzdXJpbmcoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgSUVkaXRvclBhcnQgcGFydCA9IElERS5vcGVuRWRpdG9yKGFjdGl2ZVBhZ2UsIGZpbGUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXZlbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBhZ2UuY2xvc2VFZGl0b3IocGFydCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXZlbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdG9wTWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9KTsKLSAgICAgICAgCi0JCXRhZ0lmTmVjZXNzYXJ5KCJVSSAtIE9wZW4vQ2xvc2UgRWRpdG9yIiwgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0JCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuQ2xvc2VQZXJzcGVjdGl2ZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuQ2xvc2VQZXJzcGVjdGl2ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3NTc5Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvT3BlbkNsb3NlUGVyc3BlY3RpdmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuQ2xvc2VQZXJzcGVjdGl2ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNsb3NlUGVyc3BlY3RpdmVUZXN0IGV4dGVuZHMgQmFzaWNQZXJmb3JtYW5jZVRlc3QgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGFnZ2luZwotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBPcGVuQ2xvc2VQZXJzcGVjdGl2ZVRlc3QoU3RyaW5nIGlkLCBpbnQgdGFnZ2luZykgewotICAgICAgICBzdXBlcigidGVzdE9wZW5DbG9zZVBlcnNwZWN0aXZlczoiICsgaWQsIHRhZ2dpbmcpOwotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gR2V0IHRoZSB0d28gcGVyc3BlY3RpdmVzIHRvIHN3aXRjaCBiZXR3ZWVuLgotICAgICAgICBmaW5hbCBJUGVyc3BlY3RpdmVSZWdpc3RyeSByZWdpc3RyeSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpOwotICAgICAgICBmaW5hbCBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnNwZWN0aXZlMSA9IHJlZ2lzdHJ5Ci0gICAgICAgICAgICAgICAgLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChpZCk7Ci0KLSAgICAgICAgLy8gRG9uJ3QgZmFpbCBpZiB3ZSByZWZlcmVuY2UgYW4gdW5rbm93biBwZXJzcGVjdGl2ZSBJRC4gVGhpcyBjYW4gYmUKLSAgICAgICAgLy8gYSBub3JtYWwgb2NjdXJyYW5jZSBzaW5jZSB0aGUgdGVzdCBzdWl0ZXMgcmVmZXJlbmNlIEpEVCBwZXJzcGVjdGl2ZXMsIHdoaWNoCi0gICAgICAgIC8vIG1pZ2h0IG5vdCBleGlzdC4KLSAgICAgICAgaWYgKHBlcnNwZWN0aXZlMSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVua25vd24gcGVyc3BlY3RpdmUgaWQ6ICIgKyBpZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGNyZWF0ZSBhIG5pY2UgY2xlYW4gd2luZG93LgotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7ICAgICAgICAgIAotICAgICAgICBmaW5hbCBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgCi0gICAgICAgIC8vY2F1c2VzIGNyZWF0aW9uIG9mIGFsbCB2aWV3cyAKLSAgICAgICAgYWN0aXZlUGFnZS5zZXRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZTEpOwotICAgICAgICBJVmlld1JlZmVyZW5jZSBbXSByZWZzID0gYWN0aXZlUGFnZS5nZXRWaWV3UmVmZXJlbmNlcygpOwotICAgICAgICAvL2dldCB0aGUgSURzIG5vdyAtIGFmdGVyIHdlIGNsb3NlIGh0ZSBwZXJzcGVjdGl2ZSB0aGUgdmlldyByZWZzIHdpbGwgYmUgcGFydGlhbGwgZGlzcG9zZWQgYW5kIHRoZWlyIElEcyB3aWxsIGJlIG51bGwKLSAgICAgICAgU3RyaW5nIFtdIGlkcyA9IG5ldyBTdHJpbmdbcmVmcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlkc1tpXSA9IHJlZnNbaV0uZ2V0SWQoKTsKLSAgICAgICAgfQotICAgICAgICBjbG9zZVBlcnNwZWN0aXZlKGFjdGl2ZVBhZ2UpOwotICAgICAgICAvL3BvcHVsYXRlIHRoZSBlbXB0eSBwZXJzcGVjdGl2ZSB3aXRoIGFsbCB2aWV3IHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgdGVzdCB2aWV3Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhY3RpdmVQYWdlLnNob3dWaWV3KGlkc1tpXSk7Ci0gICAgICAgIH0gICAgICAKLQotICAgICAgICB0YWdJZk5lY2Vzc2FyeSgiVUkgLSBPcGVuL0Nsb3NlICIgKyBwZXJzcGVjdGl2ZTEuZ2V0TGFiZWwoKSArICIgUGVyc3BlY3RpdmUiLCBEaW1lbnNpb24uRUxBUFNFRF9QUk9DRVNTKTsKLSAgICAgICAgCi0gICAgICAgIGV4ZXJjaXNlKG5ldyBUZXN0UnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRXZlbnRzKCk7Ci0gICAgICAgICAgICAgICAgRWRpdG9yVGVzdEhlbHBlci5jYWxtRG93big1MDAsIDMwMDAwLCA1MDApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICAgICAgYWN0aXZlUGFnZS5zZXRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZTEpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NFdmVudHMoKTsgICAgICAKLSAgICAgICAgICAgICAgICBjbG9zZVBlcnNwZWN0aXZlKGFjdGl2ZVBhZ2UpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NFdmVudHMoKTsgCi0gICAgICAgICAgICAgICAgc3RvcE1lYXN1cmluZygpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBjb21taXRNZWFzdXJlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYWN0aXZlUGFnZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjbG9zZVBlcnNwZWN0aXZlKElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UpIHsKLSAgICAgICAgLy8gd2UgZG9udCBoYXZlIEFQSSB0byBjbG9zZSBhIHBlcnNwZWN0aXZlIHNvIHVzZSB0aGUgY2xvc2UgcGVyc3BlY3RpdmUgYWN0aW9uIGluc3RlYWQuCi0gICAgICAgIENsb3NlUGVyc3BlY3RpdmVBY3Rpb24gYWN0aW9uID0gbmV3IENsb3NlUGVyc3BlY3RpdmVBY3Rpb24oYWN0aXZlUGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7ICAgICAgICAgICAgCi0gICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgYWN0aW9uLmRpc3Bvc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvT3BlbkNsb3NlVmlld1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuQ2xvc2VWaWV3VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjUwYTc0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuQ2xvc2VWaWV3VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLS8qKgotICogUGVyZm9ybWFuY2UgdGVzdHMgZm9yIHNob3dpbmcgdmlld3MuCi0gKiBUaGVyZSBhcmUgc2VwYXJhdGUgdGVzdHMgZm9yIHNob3dpbmcgYSBzaW1wbGUgdmlldyAoTW9ja1ZpZXdQYXJ0KQotICogYW5kIGEgbW9yZSBjb21wbGV4IHZpZXcgKFJlc291cmNlIE5hdmlnYXRvcikuCi0gKiBUaGUgdmlld3MgYXJlIHNob3duIGluIGFuIGVtcHR5IHBlcnNwZWN0aXZlLgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNsb3NlVmlld1Rlc3QgZXh0ZW5kcyBCYXNpY1BlcmZvcm1hbmNlVGVzdCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2aWV3SWQ7Ci0KLSAgICBwdWJsaWMgT3BlbkNsb3NlVmlld1Rlc3QoU3RyaW5nIHZpZXdJZCwgaW50IHRhZ2dpbmcpIHsKLSAgICAgICAgc3VwZXIoInNob3dWaWV3OiIgKyB2aWV3SWQsIHRhZ2dpbmcpOwotICAgICAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICAgICAgZmluYWwgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBwcmltZSBpdAotICAgICAgICBJVmlld1BhcnQgdmlldzEgPSBwYWdlLnNob3dWaWV3KHZpZXdJZCk7Ci0gICAgICAgIHBhZ2UuaGlkZVZpZXcodmlldzEpOwotICAgICAgICB3YWl0Rm9yQmFja2dyb3VuZEpvYnMoKTsKLSAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICAKLSAgICAgICAJdGFnSWZOZWNlc3NhcnkoIlVJIC0gT3Blbi9DbG9zZSAiICsgdmlldzEuZ2V0VGl0bGUoKSwgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0gICAgICAgCXNldERlZ3JhZGF0aW9uQ29tbWVudCgiPGEgaHJlZj1odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTgxNDQ+U2VlIEJ1ZyA5ODE0NDwvYT4gIik7Ci0gICAgICAgCQotICAgICAgICBleGVyY2lzZShuZXcgVGVzdFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgc3RhcnRNZWFzdXJpbmcoKTsKLQotICAgICAgICAgICAgICAgIElWaWV3UGFydCB2aWV3ID0gcGFnZS5zaG93Vmlldyh2aWV3SWQpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NFdmVudHMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWdlLmhpZGVWaWV3KHZpZXcpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NFdmVudHMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzdG9wTWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGNvbW1pdE1lYXN1cmVtZW50cygpOwotICAgICAgICBhc3NlcnRQZXJmb3JtYW5jZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuQ2xvc2VXaW5kb3dUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvT3BlbkNsb3NlV2luZG93VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjA0MzMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuQ2xvc2VXaW5kb3dUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNsb3NlV2luZG93VGVzdCBleHRlbmRzIEJhc2ljUGVyZm9ybWFuY2VUZXN0IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRhZ2dpbmcKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlbkNsb3NlV2luZG93VGVzdChTdHJpbmcgaWQsIGludCB0YWdnaW5nKSB7Ci0gICAgICAgIHN1cGVyKCJ0ZXN0T3BlbkNsb3NlV2luZG93czoiICsgaWQsIHRhZ2dpbmcpOwotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAJCi0gICAgCXRhZ0lmTmVjZXNzYXJ5KCJVSSAtIE9wZW4vQ2xvc2UgV2luZG93IiwgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0gICAgICAgIAotICAgICAgICBleGVyY2lzZShuZXcgVGVzdFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICAgICAgICAgIEVkaXRvclRlc3RIZWxwZXIuY2FsbURvd24oNTAwLCAzMDAwMCwgNTAwKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzdGFydE1lYXN1cmluZygpOwotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coaWQpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NFdmVudHMoKTsgICAKLSAgICAgICAgICAgICAgICB3aW5kb3cuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRXZlbnRzKCk7IAotICAgICAgICAgICAgICAgIHN0b3BNZWFzdXJpbmcoKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0pOwotICAgICAgICAgICAgICAgIAotICAgICAgICBjb21taXRNZWFzdXJlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvT3Blbk11bHRpcGxlRWRpdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL09wZW5NdWx0aXBsZUVkaXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3YjE1OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvT3Blbk11bHRpcGxlRWRpdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgT3Blbk11bHRpcGxlRWRpdG9yVGVzdCBleHRlbmRzIEJhc2ljUGVyZm9ybWFuY2VUZXN0IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGV4dGVuc2lvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gY2xvc2VBbGw7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT3Blbk11bHRpcGxlRWRpdG9yVGVzdChTdHJpbmcgZXh0ZW5zaW9uLCBib29sZWFuIGNsb3NlQWxsLCBpbnQgdGFnZ2luZykgewotICAgICAgICBzdXBlciAoInRlc3RPcGVuTXVsdGlwbGVFZGl0b3JzOiIgKyBleHRlbnNpb24gKyAoY2xvc2VBbGwgPyAiW2Nsb3NlQWxsXSIgOiAiW2Nsb3NlRWFjaF0iKSwgdGFnZ2luZyk7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uOyAgICAgICAgCi0gICAgICAgIHRoaXMuY2xvc2VBbGwgPSBjbG9zZUFsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG9wZW5UZXN0V2luZG93KFVJUGVyZm9ybWFuY2VUZXN0U2V0dXAuUEVSU1BFQ1RJVkUxKTsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIAotICAgICAgICB0YWdJZk5lY2Vzc2FyeSgiVUkgLSBPcGVuIE11bHRpcGxlIEVkaXRvcnMiLERpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOwotICAgICAgICAKLSAgICAgICAgc3RhcnRNZWFzdXJpbmcoKTsgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotICAgICAgICAgICAgSUZpbGUgZmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKGkgKyAiLiIgKyBleHRlbnNpb24pOwotICAgICAgICAgICAgSUVkaXRvclBhcnQgcGFydCA9IElERS5vcGVuRWRpdG9yKGFjdGl2ZVBhZ2UsIGZpbGUsIHRydWUpOwotICAgICAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbG9zZUFsbCkgewotICAgICAgICAgICAgYWN0aXZlUGFnZS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgSUVkaXRvclBhcnQgW10gcGFydHMgPSBhY3RpdmVQYWdlLmdldEVkaXRvcnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVQYWdlLmNsb3NlRWRpdG9yKHBhcnRzW2ldLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RvcE1lYXN1cmluZygpOwotICAgICAgICBjb21taXRNZWFzdXJlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsgICAgICAgIAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL09wZW5OYXZpZ2F0b3JGb2xkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvT3Blbk5hdmlnYXRvckZvbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1MDcwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvT3Blbk5hdmlnYXRvckZvbGRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzL3Rlc3Qgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgV1RQIGJ1ZyAxMDYxNTgsIGFuZCBhZGFwdGVkIHRvIGEKLSAqIGdlbmVyaWMgInBsYXRmb3JtIiB0ZXN0IGNhc2UsIHNpbmNlIHNvbWUgb2YgdGhlIHByb2JsZW0gd2FzIGR1ZSB0byBidWcKLSAqIDEwNzEyMQotICogCi0gKiBUaGFua3MgZm9yIEplZmZyZXkgTGl1IChqZWZmbGl1QGNhLmlibS5jb20pIHdobyB3cm90ZSB0aGUgdGVzdCBmb3IgV1RQLgotICogCi0gKiBBbmQsIHRoYW5rcyB0byBFcmljIEdsYXNzIDxlcmljZ2xhc3NAbWF4aW11cy5jb20+IGZvciBvcGVuaW5nIGJ1ZyAxMDYxNTgKLSAqICgxMDAlIENQVSBmb3Igb3ZlciAzIG1pbnV0ZXMgb3BlbmluZyBhIGRpcmVjdG9yeSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgd2l0aAotICogb3ZlciAyMDAwIEhUTUwgZmlsZXMpIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDYxNTgKLSAqIGFuZCBmb3IgcHJvdmlkaW5nIDI1MDAgImdlbmVyaWMiIEhUTUwgZmlsZXMgZm9yIHRoZSBvcmlnaW5hbCB0ZXN0IGNhc2UgaW4KLSAqIFdUUC4KLSAqIAotICogbW9kaWZpZWQgYnkgRGF2aWQgV2lsbGlhbXMgZm9yIHBsYXRmb3JtIGxldmVsIHRlc3QgdGhhdCBkb2VzIG5vdCBkZXBlbmQgb24KLSAqIFdUUCBvciwgZm9yIHRoYXQgbWF0dGVyLCBhbnkgbWVhbmluZ2Z1bCBjb250ZW50IHR5cGUuIFRoZSBjb250ZW50IHR5cGUKLSAqIGFzc3VtZWQgdGhlcmUgaXMgZGVzaWduZWQgc2ltcGx5IHRvICJ0YWtlIGEgd2hpbGUiIHRvIGNvbXBsZXRlLCBpZiBhc2tlZAotICogZm9yIGl0cyBwcm9wZXJ0aWVzLgotICogCi0gKiBOb3RlLCBzaW5jZSB0aGlzIHRlc3QgY29tcGFuaW9uICJDb250ZW50RGVzY3JpYmVyRm9yVGVzdHNPbmx5Iiwgc2ltcGx5IHVzZXMKLSAqICJzbGVlcCIgdG8gc2ltdWxhdGUgY29tcHV0YXRpb25zLCBpdCBvbmx5IGVmZmVjdHMgRWxhcHNlZCBUaW1lIChub3QgQ1BVCi0gKiBUaW1lKS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT3Blbk5hdmlnYXRvckZvbGRlclRlc3QgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RDYXNlIHsKLQkvKgotCSAqIHBlcmZvcm1hbmNlIHRlc3RjYXNlIGZvciBidWcgMTA2MTU4Ci0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjE1OAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RPcGVuTmF2aWdhdG9yRm9sZGVyKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlUHJvamVjdCgidGVzdFZpZXdBbmRDb250ZW50VHlwZVByb2plY3QiKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudWkudGVzdHMiKTsKLQkJVVJMIHVybCA9IGJ1bmRsZS5nZXRFbnRyeSgiZGF0YS90ZXN0Q29udGVudFR5cGUuemlwIik7Ci0JCVppcElucHV0U3RyZWFtIHppcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl6aXMgPSBuZXcgWmlwSW5wdXRTdHJlYW0odXJsLm9wZW5TdHJlYW0oKSk7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IHppcy5nZXROZXh0RW50cnkoKTsKLQkJCXdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCQkJaW50IHJlYWQgPSB6aXMucmVhZChiKTsKLQkJCQkJd2hpbGUgKHJlYWQgIT0gLTEpIHsKLQkJCQkJCWJhb3Mud3JpdGUoYiwgMCwgcmVhZCk7Ci0JCQkJCQlyZWFkID0gemlzLnJlYWQoYik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWJhb3MuY2xvc2UoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCUlGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoZW50cnkuZ2V0TmFtZSgpKTsKLQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCQkJZmlsZS5jcmVhdGUoYmFpcywgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWZpbGUuc2V0Q29udGVudHMoYmFpcywgdHJ1ZSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUFzc2VydC5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQliYWlzLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUFzc2VydC5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbnRyeSA9IHppcy5nZXROZXh0RW50cnkoKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoemlzICE9IG51bGwpIHsKLQkJCQkJemlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlBc3NlcnQuZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJc3RhcnRNZWFzdXJpbmcoKTsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJVmlld1BhcnQgdmlldyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2aWV3ID0gYWN0aXZlUGFnZS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUmVzb3VyY2VOYXZpZ2F0b3IiKTsKLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCVJlc291cmNlTmF2aWdhdG9yIG5hdmlnYXRvclZpZXcgPSBudWxsOwotCQl0cnkgewotCQkJbmF2aWdhdG9yVmlldyA9IChSZXNvdXJjZU5hdmlnYXRvcikgdmlldzsKLQkJfQotCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCUFzc2VydC5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQluYXZpZ2F0b3JWaWV3LmdldFRyZWVWaWV3ZXIoKS5leHBhbmRBbGwoKTsKLQkJc3RvcE1lYXN1cmluZygpOwotCQljb21taXRNZWFzdXJlbWVudHMoKTsKLQkJYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIG5hbWUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChuYW1lKTsKLQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCXByb2plY3QuY3JlYXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCXByb2plY3Qub3BlbihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlBc3NlcnQuZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlUGVyc3BlY3RpdmUxLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VQZXJzcGVjdGl2ZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxODc3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VQZXJzcGVjdGl2ZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJmb3JtYW5jZVBlcnNwZWN0aXZlMSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSNjcmVhdGVJbml0aWFsTGF5b3V0KG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0gICAgICAgIGxheW91dC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX09VVExJTkUsIElQYWdlTGF5b3V0LlJJR0hULCAuNzVmLCBJUGFnZUxheW91dC5JRF9FRElUT1JfQVJFQSk7Ci0gICAgICAgIGxheW91dC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQsIElQYWdlTGF5b3V0LkJPVFRPTSwgLjc1ZiwgSVBhZ2VMYXlvdXQuSURfRURJVE9SX0FSRUEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVBlcnNwZWN0aXZlMi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlUGVyc3BlY3RpdmUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NWQwODguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlUGVyc3BlY3RpdmUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUGVyZm9ybWFuY2VQZXJzcGVjdGl2ZTIgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3RvcnkjY3JlYXRlSW5pdGlhbExheW91dChvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotICAgIAlsYXlvdXQuc2V0RWRpdG9yQXJlYVZpc2libGUoZmFsc2UpOwotICAgICAgICBsYXlvdXQuYWRkVmlldyhJUGFnZUxheW91dC5JRF9UQVNLX0xJU1QsIElQYWdlTGF5b3V0LlJJR0hULCAuNzVmLCBJUGFnZUxheW91dC5JRF9FRElUT1JfQVJFQSk7Ci0gICAgICAgIGxheW91dC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX09VVExJTkUsIElQYWdlTGF5b3V0LkJPVFRPTSwgLjc1ZiwgSVBhZ2VMYXlvdXQuSURfRURJVE9SX0FSRUEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RSdW5uZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNWQyMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0UnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogUnVucyBhIHRlc3Qgc3BlY2lmaWVkIGJ5IHRoZSBvcmcuZWNsaXBzZS51aS5wZXJmb3JtYW5jZS50ZXN0IHByb3BlcnR5LiAgCi0gKiBUaGlzIHRlc3QgaXMgcHJlcHBlZCB2aWEgdGhlIFVJUGVyZm9ybWFuY2VUZXN0U2V0dXAgdGVzdCBzZXR1cC4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUGVyZm9ybWFuY2VUZXN0UnVubmVyIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1aXRlLiBUaGlzIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFVJUGVyZm9ybWFuY2VUZXN0U2V0dXAobmV3IFBlcmZvcm1hbmNlVGVzdFJ1bm5lcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyZm9ybWFuY2VUZXN0UnVubmVyKCkgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS51aS5wZXJmb3JtYW5jZS50ZXN0Iik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGlmIChUZXN0U3VpdGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpCi0gICAgICAgICAgICAgICAgYWRkVGVzdCgoVGVzdCkgY2xhenoubmV3SW5zdGFuY2UoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWRkVGVzdFN1aXRlKGNsYXp6KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkYWNjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VNZXRlcjsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLWZpbmFsIGNsYXNzIFBlcmZvcm1hbmNlVGVzdGVyIHsKLQotCXByb3RlY3RlZCBQZXJmb3JtYW5jZU1ldGVyIGZQZXJmb3JtYW5jZU1ldGVyOwotCi0JLyoqCi0JICogQHBhcmFtIHRlc3RDYXNlCi0JICovCi0JcHVibGljIFBlcmZvcm1hbmNlVGVzdGVyKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0JCVBlcmZvcm1hbmNlIHBlcmZvcm1hbmNlPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JCWZQZXJmb3JtYW5jZU1ldGVyPSBwZXJmb3JtYW5jZS5jcmVhdGVQZXJmb3JtYW5jZU1ldGVyKHBlcmZvcm1hbmNlLmdldERlZmF1bHRTY2VuYXJpb0lkKHRlc3RDYXNlKSk7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyBkZWZhdWx0IHByb3BlcnRpZXMgb2YgdGhlIG1lYXN1cmVtZW50cyBjYXB0dXJlZCBmb3IgdGhpcyB0ZXN0Ci0JICogY2FzZS4KLQkgKiAKLQkgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlIHByb3BlcnRpZXMgZG8gbm90IGhvbGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhc3NlcnRQZXJmb3JtYW5jZSgpIHsKLQkJUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpLmFzc2VydFBlcmZvcm1hbmNlKGZQZXJmb3JtYW5jZU1ldGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIG1lYXN1cmVtZW50IHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gZGltZW5zaW9uIGlzIHdpdGhpbiBhCi0JICogY2VydGFpbiByYW5nZSB3aXRoIHJlc3BlY3QgdG8gc29tZSByZWZlcmVuY2UgdmFsdWUuIElmIHRoZSBzcGVjaWZpZWQKLQkgKiBkaW1lbnNpb24gaXNuJ3QgYXZhaWxhYmxlLCB0aGUgY2FsbCBoYXMgbm8gZWZmZWN0LgotCSAqIAotCSAqIEBwYXJhbSBkaW0KLQkgKiAgICAgICAgICAgIHRoZSBEaW1lbnNpb24gdG8gY2hlY2sKLQkgKiBAcGFyYW0gbG93ZXJQZXJjZW50YWdlCi0JICogICAgICAgICAgICBhIG5lZ2F0aXZlIG51bWJlciBpbmRpY2F0aW5nIHRoZSBwZXJjZW50YWdlIHRoZSBtZWFzdXJlZCB2YWx1ZQotCSAqICAgICAgICAgICAgaXMgYWxsb3dlZCB0byBiZSBzbWFsbGVyIHRoYW4gc29tZSByZWZlcmVuY2UgdmFsdWUKLQkgKiBAcGFyYW0gdXBwZXJQZXJjZW50YWdlCi0JICogICAgICAgICAgICBhIHBvc2l0aXZlIG51bWJlciBpbmRpY2F0aW5nIHRoZSBwZXJjZW50YWdlIHRoZSBtZWFzdXJlZCB2YWx1ZQotCSAqICAgICAgICAgICAgaXMgYWxsb3dlZCB0byBiZSBncmVhdGVyIHRoYW4gc29tZSByZWZlcmVuY2UgdmFsdWUKLQkgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgIGlmIHRoZSBwcm9wZXJ0aWVzIGRvIG5vdCBob2xkCi0JICovCi0JcHVibGljIHZvaWQgYXNzZXJ0UGVyZm9ybWFuY2VJblJlbGF0aXZlQmFuZChEaW1lbnNpb24gZGltLCBpbnQgbG93ZXJQZXJjZW50YWdlLCBpbnQgdXBwZXJQZXJjZW50YWdlKSB7Ci0JCVBlcmZvcm1hbmNlLmdldERlZmF1bHQoKS5hc3NlcnRQZXJmb3JtYW5jZUluUmVsYXRpdmVCYW5kKGZQZXJmb3JtYW5jZU1ldGVyLCBkaW0sIGxvd2VyUGVyY2VudGFnZSwgdXBwZXJQZXJjZW50YWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21taXRNZWFzdXJlbWVudHMoKSB7Ci0JCWZQZXJmb3JtYW5jZU1ldGVyLmNvbW1pdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZQZXJmb3JtYW5jZU1ldGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgZnJvbSB3aXRoaW4gYSB0ZXN0IGNhc2UgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjb2RlIHRvIG1lYXN1cmUgaXMKLQkgKiBydW4uIEl0IHN0YXJ0cyBjYXB0dXJpbmcgb2YgcGVyZm9ybWFuY2UgZGF0YS4gTXVzdCBiZSBmb2xsb3dlZCBieSBhIGNhbGwKLQkgKiB0byB7QGxpbmsgUGVyZm9ybWFuY2VUZXN0Q2FzZSNzdG9wTWVhc3VyaW5nKCl9YmVmb3JlIHN1YnNlcXVlbnQgY2FsbHMgdG8KLQkgKiB0aGlzIG1ldGhvZCBvciB7QGxpbmsgUGVyZm9ybWFuY2VUZXN0Q2FzZSNjb21taXRNZWFzdXJlbWVudHMoKX0uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRNZWFzdXJpbmcoKSB7Ci0JCWZQZXJmb3JtYW5jZU1ldGVyLnN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcE1lYXN1cmluZygpIHsKLQkJZlBlcmZvcm1hbmNlTWV0ZXIuc3RvcCgpOwotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIHNjZW5hcmlvIG9mIHRoaXMgdGVzdCBjYXNlIHRvIGJlIGluY2x1ZGVkIGJvdGggaW50byB0aGUgZ2xvYmFsCi0JICogYW5kIHRoZSBsb2NhbCAoY29tcG9uZW50KSBwZXJmb3JtYW5jZSBzdW1tYXJ5LiBUaGUgc3VtbWFyeSBzaG93cyB0aGUgZ2l2ZW4gZGltZW5zaW9uIG9mIHRoZQotCSAqIHNjZW5hcmlvIGFuZCBsYWJlbHMgdGhlIHNjZW5hcmlvIHdpdGggdGhlIHNob3J0IG5hbWUuCi0JICogCi0JICogQHBhcmFtIHNob3J0TmFtZQotCSAqICAgICAgICAgICAgYSBzaG9ydCAoc2hvcnRlciB0aGFuIDQwIGNoYXJhY3RlcnMpIGRlc2NyaXRpdmUgbmFtZSBvZiB0aGUgc2NlbmFyaW8KLQkgKiBAcGFyYW0gZGltZW5zaW9uCi0JICogICAgICAgICAgICB0aGUgZGltZW5zaW9uIHRvIHNob3cgaW4gdGhlIHN1bW1hcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YWdBc0dsb2JhbFN1bW1hcnkoU3RyaW5nIHNob3J0TmFtZSwgRGltZW5zaW9uIGRpbWVuc2lvbikgewotCQlQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCkudGFnQXNHbG9iYWxTdW1tYXJ5KGZQZXJmb3JtYW5jZU1ldGVyLCBzaG9ydE5hbWUsIG5ldyBEaW1lbnNpb25bXSB7IGRpbWVuc2lvbiB9KTsKLQl9Ci0KLQkvKioKLQkgKiBNYXJrIHRoZSBzY2VuYXJpbyByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gUGVyZm9ybWFuY2VNZXRlciB0byBiZQotCSAqIGluY2x1ZGVkIGludG8gdGhlIGdsb2JhbCBhbmQgdGhlIGxvY2FsIChjb21wb25lbnQpIHBlcmZvcm1hbmNlIHN1bW1hcnkuIFRoZSBzdW1tYXJ5IHNob3dzIHRoZSBnaXZlbgotCSAqIGRpbWVuc2lvbnMgb2YgdGhlIHNjZW5hcmlvIGFuZCBsYWJlbHMgdGhlIHNjZW5hcmlvIHdpdGggdGhlIHNob3J0IG5hbWUuCi0JICogCi0JICogQHBhcmFtIHNob3J0TmFtZQotCSAqICAgICAgICAgICAgYSBzaG9ydCAoc2hvcnRlciB0aGFuIDQwIGNoYXJhY3RlcnMpIGRlc2NyaXRpdmUgbmFtZSBvZiB0aGUgc2NlbmFyaW8KLQkgKiBAcGFyYW0gZGltZW5zaW9ucwotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgZGltZW5zaW9ucyB0byBzaG93IGluIHRoZSBzdW1tYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgdGFnQXNHbG9iYWxTdW1tYXJ5KFN0cmluZyBzaG9ydE5hbWUsIERpbWVuc2lvbltdIGRpbWVuc2lvbnMpIHsKLQkJUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpLnRhZ0FzR2xvYmFsU3VtbWFyeShmUGVyZm9ybWFuY2VNZXRlciwgc2hvcnROYW1lLCBkaW1lbnNpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBNYXJrIHRoZSBzY2VuYXJpbyBvZiB0aGlzIHRlc3QgY2FzZSB0byBiZSBpbmNsdWRlZCBpbnRvIHRoZSBsb2NhbCAoY29tcG9uZW50KQotCSAqIHBlcmZvcm1hbmNlIHN1bW1hcnkuIFRoZSBzdW1tYXJ5IHNob3dzIHRoZSBnaXZlbiBkaW1lbnNpb24gb2YgdGhlCi0JICogc2NlbmFyaW8gYW5kIGxhYmVscyB0aGUgc2NlbmFyaW8gd2l0aCB0aGUgc2hvcnQgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hvcnROYW1lCi0JICogICAgICAgICAgICBhIHNob3J0IChzaG9ydGVyIHRoYW4gNDAgY2hhcmFjdGVycykgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGUgc2NlbmFyaW8KLQkgKiBAcGFyYW0gZGltZW5zaW9uCi0JICogICAgICAgICAgICB0aGUgZGltZW5zaW9uIHRvIHNob3cgaW4gdGhlIHN1bW1hcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YWdBc1N1bW1hcnkoU3RyaW5nIHNob3J0TmFtZSwgRGltZW5zaW9uIGRpbWVuc2lvbikgewotCQlQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCkudGFnQXNTdW1tYXJ5KGZQZXJmb3JtYW5jZU1ldGVyLCBzaG9ydE5hbWUsIG5ldyBEaW1lbnNpb25bXSB7IGRpbWVuc2lvbiB9KTsKLQl9Ci0KLQkvKioKLQkgKiBNYXJrIHRoZSBzY2VuYXJpbyByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gUGVyZm9ybWFuY2VNZXRlciB0byBiZQotCSAqIGluY2x1ZGVkIGludG8gdGhlIGxvY2FsIChjb21wb25lbnQpIHBlcmZvcm1hbmNlIHN1bW1hcnkuIFRoZSBzdW1tYXJ5IHNob3dzIHRoZSBnaXZlbgotCSAqIGRpbWVuc2lvbnMgb2YgdGhlIHNjZW5hcmlvIGFuZCBsYWJlbHMgdGhlIHNjZW5hcmlvIHdpdGggdGhlIHNob3J0IG5hbWUuCi0JICogCi0JICogQHBhcmFtIHNob3J0TmFtZQotCSAqICAgICAgICAgICAgYSBzaG9ydCAoc2hvcnRlciB0aGFuIDQwIGNoYXJhY3RlcnMpIGRlc2NyaXB0aXZlIG5hbWUgb2YgdGhlIHNjZW5hcmlvCi0JICogQHBhcmFtIGRpbWVuc2lvbnMKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIGRpbWVuc2lvbnMgdG8gc2hvdyBpbiB0aGUgc3VtbWFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHRhZ0FzU3VtbWFyeShTdHJpbmcgc2hvcnROYW1lLCBEaW1lbnNpb25bXSBkaW1lbnNpb25zKSB7Ci0JCVBlcmZvcm1hbmNlLmdldERlZmF1bHQoKS50YWdBc1N1bW1hcnkoZlBlcmZvcm1hbmNlTWV0ZXIsIHNob3J0TmFtZSwgZGltZW5zaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgZGVncmFkYXRpb24gY29tbWVudCBmb3IgdGhlIGN1cnJlbnQgbWV0ZXIuCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZ3JhZGF0aW9uQ29tbWVudChTdHJpbmcgc3RyaW5nKSB7Ci0JCVBlcmZvcm1hbmNlLmdldERlZmF1bHQoKS5zZXRDb21tZW50KAotCQkJCWZQZXJmb3JtYW5jZU1ldGVyLCAKLQkJCQlQZXJmb3JtYW5jZS5FWFBMQUlOU19ERUdSQURBVElPTl9DT01NRU5ULCAKLQkJCQlzdHJpbmcpOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvUGVyc3BlY3RpdmVTd2l0Y2hUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvUGVyc3BlY3RpdmVTd2l0Y2hUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZTRjOTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcnNwZWN0aXZlU3dpdGNoVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogVGVzdCBwZXJzcGVjdGl2ZSBzd2l0Y2hpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVN3aXRjaFRlc3QgZXh0ZW5kcyBCYXNpY1BlcmZvcm1hbmNlVGVzdCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBpZDE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaWQyOwotICAgIHByaXZhdGUgU3RyaW5nIGFjdGl2ZUVkaXRvcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZAotICAgICAqLwotICAgIHB1YmxpYyBQZXJzcGVjdGl2ZVN3aXRjaFRlc3QoU3RyaW5nIFtdIGlkcywgaW50IHRhZ2dpbmcpIHsKLSAgICAgICAgc3VwZXIoInRlc3RQZXJzcGVjdGl2ZVN3aXRjaDoiICsgaWRzWzBdICsgIiwiICsgaWRzWzFdICsgIixlZGl0b3IgIiArIGlkc1syXSwgdGFnZ2luZyk7Ci0gICAgICAgIHRoaXMuaWQxID0gaWRzWzBdOwotICAgICAgICB0aGlzLmlkMiA9IGlkc1sxXTsKLSAgICAgICAgdGhpcy5hY3RpdmVFZGl0b3IgPSBpZHNbMl07Ci0gICAgfQotCQotICAgIC8qKgotICAgICAqIFRlc3QgcGVyc3BlY3RpdmUgc3dpdGNoaW5nIHBlcmZvcm1hbmNlLiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgdHdvIHBlcnNwZWN0aXZlcyB0byBzd2l0Y2ggYmV0d2Vlbi4KLSAgICAgICAgZmluYWwgSVBlcnNwZWN0aXZlUmVnaXN0cnkgcmVnaXN0cnkgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLSAgICAgICAgZmluYWwgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBwZXJzcGVjdGl2ZTEgPSByZWdpc3RyeQotICAgICAgICAgICAgICAgIC5maW5kUGVyc3BlY3RpdmVXaXRoSWQoaWQxKTsKLSAgICAgICAgZmluYWwgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBwZXJzcGVjdGl2ZTIgPSByZWdpc3RyeQotICAgICAgICAgICAgICAgIC5maW5kUGVyc3BlY3RpdmVXaXRoSWQoaWQyKTsKLQotICAgICAgICAvLyBEb24ndCBmYWlsIGlmIHdlIHJlZmVyZW5jZSBhbiB1bmtub3duIHBlcnNwZWN0aXZlIElELiBUaGlzIGNhbiBiZQotICAgICAgICAvLyBhIG5vcm1hbCBvY2N1cnJhbmNlIHNpbmNlIHRoZSB0ZXN0IHN1aXRlcyByZWZlcmVuY2UgSkRUIHBlcnNwZWN0aXZlcywgd2hpY2gKLSAgICAgICAgLy8gbWlnaHQgbm90IGV4aXN0LiBKdXN0IHNraXAgdGhlIHRlc3QuCi0gICAgICAgIGlmIChwZXJzcGVjdGl2ZTEgPT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmtub3duIHBlcnNwZWN0aXZlIElEOiAiICsgaWQxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwZXJzcGVjdGl2ZTIgPT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmtub3duIHBlcnNwZWN0aXZlIElEOiAiICsgaWQyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gT3BlbiB0aGUgdHdvIHBlcnNwZWN0aXZlcyBhbmQgdGhlIGZpbGUsIGluIGEgbmV3IHdpbmRvdy4KLSAgICAgICAgLy8gRG8gdGhpcyBvdXRzaWRlIHRoZSBsb29wIHNvIGFzIG5vdCB0byBpbmNsdWRlCi0gICAgICAgIC8vIHRoZSBpbml0aWFsIHRpbWUgdG8gb3BlbiwganVzdCBzd2l0Y2hpbmcuICAgICAgICAKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBvcGVuVGVzdFdpbmRvdyhpZDEpOwotICAgICAgICBmaW5hbCBJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwYWdlKTsKLSAgICAgICAgcGFnZS5zZXRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZTIpOwotICAgICAgICAKLSAgICAgICAgLy9JRmlsZSBhRmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKCIxLiIgKyBFZGl0b3JQZXJmb3JtYW5jZVN1aXRlLkVESVRPUl9GSUxFX0VYVEVOU0lPTlNbMF0pOwotICAgICAgICBJRmlsZSBhRmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKGFjdGl2ZUVkaXRvcik7Ci0gICAgICAgIGFzc2VydFRydWUoYUZpbGUuZXhpc3RzKCkpOwotCi0gICAgICAgIElERS5vcGVuRWRpdG9yKHBhZ2UsIGFGaWxlLCB0cnVlKTsKLQotICAgICAgIAl0YWdJZk5lY2Vzc2FyeSgiVUkgLSBQZXJzcGVjdGl2ZSBTd2l0Y2giLCBEaW1lbnNpb24uRUxBUFNFRF9QUk9DRVNTKTsKLSAgICAgICAgCi0gICAgICAgIGV4ZXJjaXNlKG5ldyBUZXN0UnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRXZlbnRzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3RhcnRNZWFzdXJpbmcoKTsKLSAgICAgICAgICAgICAgICBwYWdlLnNldFBlcnNwZWN0aXZlKHBlcnNwZWN0aXZlMSk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICAgICAgICAgIHBhZ2Uuc2V0UGVyc3BlY3RpdmUocGVyc3BlY3RpdmUyKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRXZlbnRzKCk7Ci0gICAgICAgICAgICAgICAgc3RvcE1lYXN1cmluZygpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBjb21taXRNZWFzdXJlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvUmVzb3VyY2VUZXN0SGVscGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvUmVzb3VyY2VUZXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMTU1ZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1Jlc291cmNlVGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkZpbGVUb29sOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VUZXN0SGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXBsaWNhdGUoU3RyaW5nIHNyYywgU3RyaW5nIGRlc3RQcmVmaXgsIFN0cmluZyBkZXN0U3VmZml4LCBpbnQgbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmb3IgKGludCBpPSAwOyBpIDwgbjsgaSsrKQotCQkJY29weShzcmMsIGRlc3RQcmVmaXggKyBpICsgZGVzdFN1ZmZpeCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHkoU3RyaW5nIHNyYywgU3RyaW5nIGRlc3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZT0gZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoc3JjKSk7Ci0JCWZpbGUuY29weShuZXcgUGF0aChkZXN0KSwgdHJ1ZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShTdHJpbmcgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlnZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlKSkuZGVsZXRlKHRydWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZmluZEZpbGUoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKHBhdGgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElGaWxlW10gZmluZEZpbGVzKFN0cmluZyBwcmVmaXgsIFN0cmluZyBzdWZmaXgsIGludCBpLCBpbnQgbikgewotCQlJV29ya3NwYWNlUm9vdCByb290PSBnZXRSb290KCk7Ci0JCUxpc3QgZmlsZXM9IG5ldyBBcnJheUxpc3QobiAtIGkpOwotCQlmb3IgKGludCBqPSBpOyBqIDwgaSArIG47IGorKykgewotCQkJU3RyaW5nIHBhdGg9IHJvb3QuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpICsgIi8iICsgcHJlZml4ICsgaiArIHN1ZmZpeDsKLQkJCWZpbGVzLmFkZChmaW5kRmlsZShwYXRoKSk7Ci0JCX0KLQkJcmV0dXJuIChJRmlsZVtdKSBmaWxlcy50b0FycmF5KG5ldyBJRmlsZVtmaWxlcy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciByZWFkKFN0cmluZyBzcmMpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBGaWxlVG9vbC5yZWFkKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChzcmMpKS5nZXRDb250ZW50cygpKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKFN0cmluZyBkZXN0LCBmaW5hbCBTdHJpbmcgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gc3RyZWFtPSBuZXcgSW5wdXRTdHJlYW0oKSB7Ci0JCQlwcml2YXRlIFJlYWRlciBmUmVhZGVyPSBuZXcgU3RyaW5nUmVhZGVyKGNvbnRlbnQpOwotCQkJcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQlyZXR1cm4gZlJlYWRlci5yZWFkKCk7Ci0JCQl9Ci0JCX07Ci0JCWdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGRlc3QpKS5jcmVhdGUoc3RyZWFtLCB0cnVlLCBudWxsKTsKLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGljYXRlKFN0cmluZyBzcmMsIFN0cmluZyBkZXN0UHJlZml4LCBTdHJpbmcgZGVzdFN1ZmZpeCwgaW50IG4sIFN0cmluZyBzcmNOYW1lLCBTdHJpbmcgZGVzdE5hbWVQcmVmaXgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlTdHJpbmdCdWZmZXIgcz0gcmVhZChzcmMpOwotCQkKLQkJTGlzdCBwb3NpdGlvbnM9IGlkZW50aWZpZXJQb3NpdGlvbnMocywgc3JjTmFtZSk7Ci0JCQotCQlmb3IgKGludCBqPSAwOyBqIDwgbjsgaisrKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYz0gbmV3IFN0cmluZ0J1ZmZlcihzLnRvU3RyaW5nKCkpOwotCQkJcmVwbGFjZVBvc2l0aW9ucyhjLCBzcmNOYW1lLmxlbmd0aCgpLCBkZXN0TmFtZVByZWZpeCArIGosIHBvc2l0aW9ucyk7Ci0JCQl3cml0ZShkZXN0UHJlZml4ICsgaiArIGRlc3RTdWZmaXgsIGMudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShTdHJpbmcgc3JjLCBTdHJpbmcgZGVzdCwgU3RyaW5nIHNyY05hbWUsIFN0cmluZyBkZXN0TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gcmVhZChzcmMpOwotCQlMaXN0IHBvc2l0aW9ucz0gaWRlbnRpZmllclBvc2l0aW9ucyhidWYsIHNyY05hbWUpOwotCQlyZXBsYWNlUG9zaXRpb25zKGJ1Ziwgc3JjTmFtZS5sZW5ndGgoKSwgZGVzdE5hbWUsIHBvc2l0aW9ucyk7Ci0JCXdyaXRlKGRlc3QsIGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlcGxhY2VQb3NpdGlvbnMoU3RyaW5nQnVmZmVyIGMsIGludCBvcmlnTGVuZ3RoLCBTdHJpbmcgc3RyaW5nLCBMaXN0IHBvc2l0aW9ucykgewotCQlpbnQgb2Zmc2V0PSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IHBvc2l0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWludCBwb3NpdGlvbj0gKChJbnRlZ2VyKSBpdGVyLm5leHQoKSkuaW50VmFsdWUoKTsKLQkJCWMucmVwbGFjZShvZmZzZXQgKyBwb3NpdGlvbiwgb2Zmc2V0ICsgcG9zaXRpb24gKyBvcmlnTGVuZ3RoLCBzdHJpbmcpOwotCQkJb2Zmc2V0ICs9IHN0cmluZy5sZW5ndGgoKSAtIG9yaWdMZW5ndGg7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGlkZW50aWZpZXJQb3NpdGlvbnMoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJTGlzdCBwb3NpdGlvbnM9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IGk9IC0xOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaT0gYnVmZmVyLmluZGV4T2YoaWRlbnRpZmllciwgaSArIDEpOwotCQkJaWYgKGkgPT0gLTEpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoaSA+IDAgJiYgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGJ1ZmZlci5jaGFyQXQoaSAtIDEpKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChpIDwgYnVmZmVyLmxlbmd0aCgpIC0gMSAmJiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYnVmZmVyLmNoYXJBdChpICsgaWRlbnRpZmllci5sZW5ndGgoKSkpKQotCQkJCWNvbnRpbnVlOwotCQkJcG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcihpKSk7Ci0JCX0KLQkJcmV0dXJuIHBvc2l0aW9uczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRSb290KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlQXV0b0J1aWxkaW5nKCkgewotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb249IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpOwotCQlib29sZWFuIHdhc09mZj0gIWRlc2NyaXB0aW9uLmlzQXV0b0J1aWxkaW5nKCk7Ci0JCWlmICh3YXNPZmYpCi0JCQlkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcodHJ1ZSk7Ci0JCXJldHVybiB3YXNPZmY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluY3JlbWVudGFsQnVpbGQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnVsbEJ1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzYWJsZUF1dG9CdWlsZGluZygpIHsKLQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJYm9vbGVhbiB3YXNPbj0gZGVzY3JpcHRpb24uaXNBdXRvQnVpbGRpbmcoKTsKLQkJaWYgKHdhc09uKQotCQkJZGVzY3JpcHRpb24uc2V0QXV0b0J1aWxkaW5nKGZhbHNlKTsKLQkJcmV0dXJuIHdhc09uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9UZXN0UnVubmFibGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9UZXN0UnVubmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1ZTg3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvVGVzdFJ1bm5hYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0UnVubmFibGUgewotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvVUlQZXJmb3JtYW5jZVBsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1VJUGVyZm9ybWFuY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlOWVmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvVUlQZXJmb3JtYW5jZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFVJUGVyZm9ybWFuY2VQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBVSVBlcmZvcm1hbmNlUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFVJUGVyZm9ybWFuY2VQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBVSVBlcmZvcm1hbmNlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UiLCBwYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvVUlQZXJmb3JtYW5jZVRlc3RTZXR1cC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1VJUGVyZm9ybWFuY2VUZXN0U2V0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3MjE0NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvVUlQZXJmb3JtYW5jZVRlc3RTZXR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBVSVBlcmZvcm1hbmNlVGVzdFNldHVwIGV4dGVuZHMgVGVzdFNldHVwIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNQRUNUSVZFMT0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlUGVyc3BlY3RpdmUxIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTUEVDVElWRTI9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZVBlcnNwZWN0aXZlMiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiUGVyZm9ybWFuY2UgUHJvamVjdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UUk9fVklFVz0gIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLmludHJvdmlldyI7Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IHRlc3RQcm9qZWN0OwotCQotCXB1YmxpYyBVSVBlcmZvcm1hbmNlVGVzdFNldHVwKFRlc3QgdGVzdCkgewotCQlzdXBlcih0ZXN0KTsJCQotCX0KLQotCS8qCi0JICogQHNlZSBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cCNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2g9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93PSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2U9IGFjdGl2ZVdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQotCQlhY3RpdmVQYWdlLmhpZGVWaWV3KGFjdGl2ZVBhZ2UuZmluZFZpZXdSZWZlcmVuY2UoSU5UUk9fVklFVykpOwotCQkKLQkJd29ya2JlbmNoLnNob3dQZXJzcGVjdGl2ZShQRVJTUEVDVElWRTEsIGFjdGl2ZVdpbmRvdyk7Ci0JCQotCQlib29sZWFuIHdhc0F1dG9idWlsZGluZz0gUmVzb3VyY2VUZXN0SGVscGVyLmRpc2FibGVBdXRvQnVpbGRpbmcoKTsKLQkJc2V0VXBQcm9qZWN0KCk7Ci0JCVJlc291cmNlVGVzdEhlbHBlci5mdWxsQnVpbGQoKTsKLQkJaWYgKHdhc0F1dG9idWlsZGluZykgewotCQkJUmVzb3VyY2VUZXN0SGVscGVyLmVuYWJsZUF1dG9CdWlsZGluZygpOwotCQkJRWRpdG9yVGVzdEhlbHBlci5jYWxtRG93bigyMDAwLCAzMDAwMCwgMTAwMCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nLCB0aGUgc2V0IHVwIHdvcmtzcGFjZSB3aWxsIGJlIHVzZWQgYnkgdGhlIG9wZW4gZWRpdG9yIHRlc3RzCi0JCQotCQkvKiAKLQkJICogZW5zdXJlIHRoZSB3b3JrYmVuY2ggc3RhdGUgZ2V0cyBzYXZlZCB3aGVuIHJ1bm5pbmcgd2l0aCB0aGUgQXV0b21hdGVkIFRlc3RpbmcgRnJhbWV3b3JrCi0gICAgICAgICAgICAgICAgICogVE9ETzogcmVtb3ZlIHdoZW4gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcxMzYyIGlzIGZpeGVkCi0gICAgICAgICAgICAgICAgICovCi0JCVN0YWNrVHJhY2VFbGVtZW50W10gZWxlbWVudHM9ICBuZXcgVGhyb3dhYmxlKCkuZ2V0U3RhY2tUcmFjZSgpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0YWNrVHJhY2VFbGVtZW50IGVsZW1lbnQ9IGVsZW1lbnRzW2ldOwotCQkJaWYgKGVsZW1lbnQuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0LkVjbGlwc2VUZXN0UnVubmVyIikpIHsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmNsb3NlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFVwUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgIAotICAgICAgICAvLyBDcmVhdGUgYSBqYXZhIHByb2plY3QuCi0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICB0ZXN0UHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotICAgICAgICB0ZXN0UHJvamVjdC5jcmVhdGUobnVsbCk7Ci0gICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obnVsbCk7ICAgICAgICAKLSAgICAgICAgLypJUHJvamVjdERlc2NyaXB0aW9uIHByb2plY3REZXNjcmlwdGlvbiA9IHRlc3RQcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIFN0cmluZ1tdIG5hdHVyZUlkcyA9IHsgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIH07Ci0gICAgICAgIHByb2plY3REZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmF0dXJlSWRzKTsqLwotICAgICAgIC8qSUNvbW1hbmQgYnVpbGRDb21tYW5kID0gbmV3IEJ1aWxkQ29tbWFuZCgpOwotICAgICAgICBidWlsZENvbW1hbmQuc2V0QnVpbGRlck5hbWUoIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyIik7Ci0gICAgICAgIHByb2plY3REZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3IElDb21tYW5kW10geyBidWlsZENvbW1hbmQgfSk7Ci0gICAgICAgIHRlc3RQcm9qZWN0LnNldERlc2NyaXB0aW9uKHByb2plY3REZXNjcmlwdGlvbiwgbnVsbCk7Ki8KLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRWRpdG9yUGVyZm9ybWFuY2VTdWl0ZS5FRElUT1JfRklMRV9FWFRFTlNJT05TLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjcmVhdGVGaWxlcyhFZGl0b3JQZXJmb3JtYW5jZVN1aXRlLkVESVRPUl9GSUxFX0VYVEVOU0lPTlNbaV0pOwotICAgICAgICB9Ci0JfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGV4dAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVGaWxlcyhTdHJpbmcgZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGkgKyAiLiIgKyBleHQ7Ci0JICAgICAgICBJRmlsZSBpRmlsZSA9IHRlc3RQcm9qZWN0LmdldEZpbGUoZmlsZU5hbWUpOwotCSAgICAgICAgaUZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgJ1xuJyB9KSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1VJUGVyZm9ybWFuY2VUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1NTlhMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLnByZXNlbnRhdGlvbnMuUHJlc2VudGF0aW9uUGVyZm9ybWFuY2VUZXN0U3VpdGU7Ci0KLS8qKgotICogVGVzdCBhbGwgYXJlYXMgb2YgdGhlIFVJIEFQSS4KLSAqLwotcHVibGljIGNsYXNzIFVJUGVyZm9ybWFuY2VUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VpdGUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgCXJldHVybiBuZXcgVUlQZXJmb3JtYW5jZVRlc3RTZXR1cChuZXcgVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIHRlc3Qgc3VpdGUuCi0gICAgICovCi0gICAgcHVibGljIFVJUGVyZm9ybWFuY2VUZXN0U3VpdGUoKSB7Ci0gICAgICAgIGFkZFRlc3QobmV3IEFjdGl2aXRpZXNQZXJmb3JtYW5jZVN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBQcmVzZW50YXRpb25QZXJmb3JtYW5jZVRlc3RTdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgV29ya2JlbmNoUGVyZm9ybWFuY2VTdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVmlld1BlcmZvcm1hbmNlU3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IEVkaXRvclBlcmZvcm1hbmNlU3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShDb21tYW5kc1BlcmZvcm1hbmNlVGVzdC5jbGFzcykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9WaWV3UGVyZm9ybWFuY2VTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1ZpZXdQZXJmb3JtYW5jZVN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMTYxN2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1ZpZXdQZXJmb3JtYW5jZVN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UubGF5b3V0LlJlc2l6ZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UubGF5b3V0LlZpZXdXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLklWaWV3RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3UGVyZm9ybWFuY2VTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9OQVZJR0FUT1IgPSAib3JnLmVjbGlwc2UudWkudmlld3MuUmVzb3VyY2VOYXZpZ2F0b3IiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUNfUEFUSCA9ICJvcmcuZWNsaXBzZS51aSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV1NfUEFUVEVSTiA9ICJvcmcuZWNsaXBzZS51aS52aWV3cyI7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBbXSBWSUVXX0lEUyA9IHtCQVNJQ19WSUVXLAotCS8vIElQYWdlTGF5b3V0LklEX1JFU19OQVYsIE1vY2tWaWV3UGFydC5JRH07Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gVGhpcyBpcyByZXF1aXJlZCB0byB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBWaWV3UGVyZm9ybWFuY2VTdWl0ZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBWaWV3UGVyZm9ybWFuY2VTdWl0ZSgpIHsKLQkJYWRkT3BlbkNsb3NlVGVzdHMoKTsKLQkJYWRkUmVzaXplVGVzdHMoKTsKLQkJYWRkVGVzdFN1aXRlKE9wZW5OYXZpZ2F0b3JGb2xkZXJUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkT3BlbkNsb3NlVGVzdHMoKSB7Ci0JCVN0cmluZ1tdIGlkcyA9IGdldEFsbFRlc3RhYmxlVmlld0lkcygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgaWQgPSBpZHNbaV07Ci0KLQkJCS8vIFVzZSB0aGUgQkFTSUNfVklFVyBhcyB0aGUgZmluZ2VycHJpbnQgdGVzdC4KLQkJCS8vIERvIG5vdCBjaGFuZ2UgdGhpcyBhcyB0aGlzIGlzIGFuIGVtcHR5IHZpZXcKLQkJCS8vIGFuZCBub3QgZGVwZW5kYW50IG9uIG90aGVyIGNvbXBvbmVudHMKLQkJCWFkZFRlc3QobmV3IE9wZW5DbG9zZVZpZXdUZXN0KGlkLAotCQkJCQlpZC5lcXVhbHMoUkVTT1VSQ0VfTkFWSUdBVE9SKSA/IEJhc2ljUGVyZm9ybWFuY2VUZXN0LkdMT0JBTAotCQkJCQkJCTogQmFzaWNQZXJmb3JtYW5jZVRlc3QuTk9ORSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJlc2l6ZVRlc3RzKCkgewotCQlTdHJpbmdbXSBpZHMgPSBnZXRBbGxUZXN0YWJsZVZpZXdJZHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGlkID0gaWRzW2ldOwotCi0JCQlhZGRUZXN0KG5ldyBSZXNpemVUZXN0KG5ldyBWaWV3V2lkZ2V0RmFjdG9yeShpZCkpKTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBbGxUZXN0YWJsZVZpZXdJZHMoKSB7Ci0JCUhhc2hTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsKLQotCQlJVmlld0Rlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IFdvcmtiZW5jaC5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFZpZXdSZWdpc3RyeSgpLmdldFZpZXdzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlWaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNbaV07Ci0JCQlTdHJpbmdbXSBjYXRlZ29yeVBhdGggPSBkZXNjcmlwdG9yLmdldENhdGVnb3J5UGF0aCgpOwotCi0JCQlpZiAoY2F0ZWdvcnlQYXRoID09IG51bGwpCi0JCQkJY29udGludWU7Ci0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2F0ZWdvcnlQYXRoLmxlbmd0aDsgaisrKSB7Ci0JCQkJLy8gT25seSB0ZXN0IGJhc2ljIHZpZXdzCi0JCQkJaWYgKGNhdGVnb3J5UGF0aFtqXS5lcXVhbHMoQkFTSUNfUEFUSCkpewotCQkJCQlpZihkZXNjcmlwdG9yLmdldElkKCkuaW5kZXhPZihWSUVXU19QQVRURVJOKSA+PSAwKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKGRlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0JCQkJfX0KLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1dvcmtiZW5jaFBlcmZvcm1hbmNlU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9Xb3JrYmVuY2hQZXJmb3JtYW5jZVN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNWRiYjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL1dvcmtiZW5jaFBlcmZvcm1hbmNlU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkVtcHR5UGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UubGF5b3V0LkNvbXB1dGVTaXplVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQuTGF5b3V0VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQuUGVyc3BlY3RpdmVXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLmxheW91dC5SZWN1cnNpdmVUcmltTGF5b3V0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQuUmVzaXplVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQuVGVzdFdpZGdldEZhY3Rvcnk7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1jbGFzcyBXb3JrYmVuY2hQZXJmb3JtYW5jZVN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9QRVJTUElEID0gIm9yZy5lY2xpcHNlLnVpLnJlc291cmNlUGVyc3BlY3RpdmUiOwotICAgIC8vIE5vdGU6IHRvIHRlc3QgcGVyc3BlY3RpdmUgc3dpdGNoaW5nIHByb3Blcmx5LCB3ZSBuZWVkIHBlcnNwZWN0aXZlcyB3aXRoIGxvdHMgb2YKLSAgICAvLyBhc3NvY2lhdGVkIGFjdGlvbnMuIAotCS8vIE5PVEUgLSBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgSURzIGJlbG93LiAgdGhlIFBlcnNwZWN0aXZlU3dpdGNoVGVzdCBoYXMgYSAKLQkvLyBmaW5nZXJwcmludCB0ZXN0IGZvciBwZXJmb3JtYW5jZSB0aGF0IHJlbGV5cyBvbiB0aGlzIG5vdCBjaGFuZ2luZy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBbXSBQRVJTUEVDVElWRV9JRFMgPSB7Ci0gICAgICAgIEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQyLAotICAgICAgICBVSVBlcmZvcm1hbmNlVGVzdFNldHVwLlBFUlNQRUNUSVZFMSwgCi0gICAgICAgIFJFU09VUkNFX1BFUlNQSUQsCi0gICAgICAgICJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVBlcnNwZWN0aXZlIiwgCi0gICAgICAgICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1BlcnNwZWN0aXZlIn07Ci0gICAgCi0gICAgLy8gUGVyc3BlY3RpdmUgSUQgdG8gdXNlIGZvciB0aGUgcmVzaXplIHdpbmRvdyBmaW5nZXJwcmludCB0ZXN0Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzaXplRmluZ2VycHJpbnRUZXN0ID0gUkVTT1VSQ0VfUEVSU1BJRDsgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgW11bXSBQRVJTUEVDVElWRV9TV0lUQ0hfUEFJUlMgPSB7Ci0gICAgICAgIC8vIFRlc3Qgc3dpdGNoaW5nIGJldHdlZW4gdGhlIHR3byBtb3N0IGNvbW1vbmx5IHVzZWQgcGVyc3BlY3RpdmVzIGluIHRoZSBTREsgKHRoaXMgaXMgdGhlIG1vc3QgaW1wb3J0YW50Ci0gICAgICAgIC8vIHBlcnNwZWN0aXZlIHN3aXRjaCB0ZXN0LCBidXQgaXQgaXMgZWFzaWx5IGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gSkRULCBldGMuKQotICAgICAgICB7Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiLCAib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQZXJzcGVjdGl2ZSIsICIxLmphdmEifSwKLSAgICAgICAgCi0gICAgICAgIHtVSVBlcmZvcm1hbmNlVGVzdFNldHVwLlBFUlNQRUNUSVZFMSwgVUlQZXJmb3JtYW5jZVRlc3RTZXR1cC5QRVJTUEVDVElWRTIsICIxLnBlcmZfYmFzaWMifSwKLQkJCi0gICAgICAgIHsib3JnLmVjbGlwc2UudWkudGVzdHMuZG5kLmRyYWdkcm9wIiwgIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmZhc3R2aWV3X3BlcnNwZWN0aXZlIiwgIjEucGVyZl9iYXNpYyJ9LAotICAgICAgICAKLSAgICAgICAgLy8gVGVzdCBzd2l0Y2hpbmcgYmV0d2VlbiBhIHBlcnNwZWN0aXZlIHdpdGggbG90cyBvZiBhY3Rpb25zIGFuZCBhIHBlcnNwZWN0aXZlIHdpdGggbm9uZQotICAgICAgICB7Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiLCAib3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC5FbXB0eVBlcnNwZWN0aXZlIiwgIjEucGVyZl9iYXNpYyJ9LAotICAgICAgICAKLSAgICAgICAge1JFU09VUkNFX1BFUlNQSUQsICJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVBlcnNwZWN0aXZlIiwgIjEuamF2YSJ9IAotICAgIH07Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWSUVXX0lEUyA9IHsKLSAgICAgICAgIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3IiwKLSAgICAgICAgIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlJlc291cmNlTmF2aWdhdG9yIgotICAgIH07Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRFUkFUSU9OUyA9IDI1OwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1aXRlLiBUaGlzIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFdvcmtiZW5jaFBlcmZvcm1hbmNlU3VpdGUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFdvcmtiZW5jaFBlcmZvcm1hbmNlU3VpdGUoKSB7Ci0gICAgICAgIGFkZExheW91dFNjZW5hcmlvcygpOwotICAgICAgICBhZGRSZXNpemVTY2VuYXJpb3MoKTsKLSAgICAgICAgYWRkUGVyc3BlY3RpdmVTd2l0Y2hTY2VuYXJpb3MoKTsKLSAgICAgICAgYWRkUGVyc3BlY3RpdmVPcGVuQ2xvc2VTY2VuYXJpb3MoKTsKLSAgICAgICAgYWRkV2luZG93T3BlbkNsb3NlU2NlbmFyaW9zKCk7Ci0gICAgICAgIGFkZENvbnRyaWJ1dGlvblNjZW5hcmlvcygpOwotICAgIH0KLQotICAgIC8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRDb250cmlidXRpb25TY2VuYXJpb3MoKSB7Ci0gICAgICAgIGFkZFRlc3QobmV3IE9iamVjdENvbnRyaWJ1dGlvbnNQZXJmb3JtYW5jZSgKLSAgICAgICAgICAgICAgICAibGFyZ2Ugc2VsZWN0aW9uLCBsaW1pdGVkIGNvbnRyaWJ1dG9ycyIsCi0gICAgICAgICAgICAgICAgT2JqZWN0Q29udHJpYnV0aW9uc1BlcmZvcm1hbmNlLmdlbmVyYXRlQWRhcHRhYmxlU2VsZWN0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0Q29udHJpYnV0aW9uc1BlcmZvcm1hbmNlLlNFRUQsIDUwMDApLAotICAgICAgICAgICAgICAgIEJhc2ljUGVyZm9ybWFuY2VUZXN0Lk5PTkUpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgT2JqZWN0Q29udHJpYnV0aW9uc1BlcmZvcm1hbmNlKAotICAgICAgICAgICAgICAgICJsaW1pdGVkIHNlbGVjdGlvbiwgbGltaXRlZCBjb250cmlidXRvcnMiLAotICAgICAgICAgICAgICAgIE9iamVjdENvbnRyaWJ1dGlvbnNQZXJmb3JtYW5jZS5nZW5lcmF0ZUFkYXB0YWJsZVNlbGVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdENvbnRyaWJ1dGlvbnNQZXJmb3JtYW5jZS5TRUVELCA1MCksCi0gICAgICAgICAgICAgICAgQmFzaWNQZXJmb3JtYW5jZVRlc3QuTk9ORSkpOwotCX0KLQotCS8qKgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRXaW5kb3dPcGVuQ2xvc2VTY2VuYXJpb3MoKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUEVSU1BFQ1RJVkVfSURTLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRUZXN0KG5ldyBPcGVuQ2xvc2VXaW5kb3dUZXN0KFBFUlNQRUNUSVZFX0lEU1tpXSwgaSA9PSAwID8gQmFzaWNQZXJmb3JtYW5jZVRlc3QuTE9DQUwgOiBCYXNpY1BlcmZvcm1hbmNlVGVzdC5OT05FKSk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBlcnNwZWN0aXZlT3BlbkNsb3NlU2NlbmFyaW9zKCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBFUlNQRUNUSVZFX0lEUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYWRkVGVzdChuZXcgT3BlbkNsb3NlUGVyc3BlY3RpdmVUZXN0KFBFUlNQRUNUSVZFX0lEU1tpXSwgaSA9PSAxID8gQmFzaWNQZXJmb3JtYW5jZVRlc3QuTE9DQUwgOiBCYXNpY1BlcmZvcm1hbmNlVGVzdC5OT05FKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBlcnNwZWN0aXZlU3dpdGNoU2NlbmFyaW9zKCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBFUlNQRUNUSVZFX1NXSVRDSF9QQUlSUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYWRkVGVzdChuZXcgUGVyc3BlY3RpdmVTd2l0Y2hUZXN0KFBFUlNQRUNUSVZFX1NXSVRDSF9QQUlSU1tpXSwgaSA9PSAwID8gQmFzaWNQZXJmb3JtYW5jZVRlc3QuR0xPQkFMIDogQmFzaWNQZXJmb3JtYW5jZVRlc3QuTk9ORSkpOyAgICAgICAgICAgIAotICAgICAgICB9ICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBwZXJmb3JtYW5jZSB0ZXN0cyBmb3IgdGhlIGxheW91dCBvZiB0aGUgZ2l2ZW4gd2lkZ2V0IAotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRMYXlvdXRTY2VuYXJpb3MoVGVzdFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICAKLSAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBlZmZlY3Qgb2YgZmx1c2hpbmcgdGhlIGNhY2hlCi0gICAgICAgIGFkZFRlc3QobmV3IENvbXB1dGVTaXplVGVzdChmYWN0b3J5KSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUZXN0IGxheW91dChmYWxzZSkKLSAgICAgICAgYWRkVGVzdChuZXcgTGF5b3V0VGVzdChmYWN0b3J5LCBmYWxzZSkpOwotICAgICAgICAKLSAgICAgICAgLy8gVGVzdCBsYXlvdXQodHJ1ZSkKLSAgICAgICAgYWRkVGVzdChuZXcgTGF5b3V0VGVzdChmYWN0b3J5LCB0cnVlKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUZXN0IHJlc2l6aW5nCi0gICAgICAgIGFkZFRlc3QobmV3IFJlc2l6ZVRlc3QoZmFjdG9yeSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRMYXlvdXRTY2VuYXJpb3MoKSB7Ci0gICAgICAgIGFkZExheW91dFNjZW5hcmlvcyhuZXcgUmVjdXJzaXZlVHJpbUxheW91dFdpZGdldEZhY3RvcnkoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWxsUGVyc3BlY3RpdmVJZHMoKSB7Ci0gICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3JbXSBwZXJzcGVjdGl2ZXMgPSBXb3JrYmVuY2guZ2V0SW5zdGFuY2UoKS5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCkuZ2V0UGVyc3BlY3RpdmVzKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlcnNwZWN0aXZlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gcGVyc3BlY3RpdmVzW2ldOwotICAgICAgICAgICAgU3RyaW5nIGlkID0gZGVzY3JpcHRvci5nZXRJZCgpOwotICAgICAgICAgICAgcmVzdWx0LmFkZChpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFJlc2l6ZVNjZW5hcmlvcygpIHsKLSAgICAgICAgU3RyaW5nW10gcGVyc3BlY3RpdmVJZHMgPSBnZXRBbGxQZXJzcGVjdGl2ZUlkcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlcnNwZWN0aXZlSWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBwZXJzcGVjdGl2ZUlkc1tpXTsKLSAgICAgICAgICAgIGFkZFRlc3QobmV3IFJlc2l6ZVRlc3QobmV3IFBlcnNwZWN0aXZlV2lkZ2V0RmFjdG9yeShpZCksIAotICAgICAgICAgICAgICAgICAgICBpZC5lcXVhbHMocmVzaXplRmluZ2VycHJpbnRUZXN0KSA/IEJhc2ljUGVyZm9ybWFuY2VUZXN0LkxPQ0FMIDogQmFzaWNQZXJmb3JtYW5jZVRlc3QuTk9ORSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVJIC0gV29ya2JlbmNoIFdpbmRvdyBSZXNpemUiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L0NvbXB1dGVTaXplVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL2xheW91dC9Db21wdXRlU2l6ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJjMDdmNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L0NvbXB1dGVTaXplVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLkJhc2ljUGVyZm9ybWFuY2VUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlRlc3RSdW5uYWJsZTsKLQotLyoqCi0gKiBNZWFzdXJlcyB0aGUgcGVyZm9ybWFuY2Ugb2YgYSB3aWRnZXQncyBjb21wdXRlU2l6ZSBtZXRob2QKLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgQ29tcHV0ZVNpemVUZXN0IGV4dGVuZHMgQmFzaWNQZXJmb3JtYW5jZVRlc3QgewotCi0gICAgcHJpdmF0ZSBUZXN0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5OwotICAgIHByaXZhdGUgaW50IHhJdGVyYXRpb25zID0gMTA7Ci0gICAgcHJpdmF0ZSBpbnQgeUl0ZXJhdGlvbnMgPSAxMDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcHV0ZVNpemVUZXN0KFRlc3RXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIod2lkZ2V0RmFjdG9yeS5nZXROYW1lKCkgKyAiIGNvbXB1dGVTaXplIik7Ci0gICAgICAgIAotICAgICAgICB0aGlzLndpZGdldEZhY3RvcnkgPSB3aWRnZXRGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1biB0aGUgdGVzdAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQotICAgICAgICB3aWRnZXRGYWN0b3J5LmluaXQoKTsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIHdpZGdldCA9IHdpZGdldEZhY3RvcnkuZ2V0Q29udHJvbCgpOwotICAgICAgICAvL1JlY3RhbmdsZSBpbml0aWFsQm91bmRzID0gd2lkZ2V0LmdldEJvdW5kcygpOwotICAgICAgICBmaW5hbCBQb2ludCBtYXhTaXplID0gd2lkZ2V0RmFjdG9yeS5nZXRNYXhTaXplKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBJdGVyYXRpb24gY291bnRlci4gV2UgaW5jcmVtZW50IHRoaXMgZWFjaCBwYXNzIHRocm91Z2ggdGhlIGxvb3AgaW4gb3JkZXIgdG8gCi0gICAgICAgIC8vIGdlbmVyYXRlIHNsaWdodGx5IGRpZmZlcmVudCB0ZXN0IGRhdGEgZWFjaCB0aW1lCi0gICAgICAgIGZpbmFsIGludFtdIGNvdW50ZXIgPSBuZXcgaW50W10gezB9OwotICAgICAgICAKLSAgICAgICAgZXhlcmNpc2UobmV3IFRlc3RSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAKLSAgICAgICAgICAgICAgIC8vIFRoaXMgY291bnRlciBkZXRlcm1pbmVzIHdoZXRoZXIgd2UncmUgY29tcHV0aW5nIGEgd2lkdGgsIGhlaWdodCwgb3IgZml4ZWQKLSAgICAgICAgICAgICAgIC8vIHNpemUgYW5kIHdoZXRoZXIgb3Igbm90IHdlIGZsdXNoIHRoZSBjYWNoZS4gCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIC8vIFdlIGRvIHRoaW5ncyB0aGlzIHdheSB0byBhdm9pZCBjYWxsaW5nIGNvbXB1dGVTaXplIHdpdGggdGhlIHNhbWUgKG9yIHNpbWlsYXIpIHZhbHVlcwotICAgICAgICAgICAgICAgLy8gdHdpY2UgaW4gYSByb3csIHdoaWNoIHdvdWxkIGJlIHRvbyBlYXN5IHRvIGNhY2hlLgotICAgICAgICAgICAgICAgaW50IGNvdW50ID0gY291bnRlclswXTsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgc3RhcnRNZWFzdXJpbmcoKTsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgZm9yIChpbnQgeEl0ZXJhdGlvbiA9IDA7IHhJdGVyYXRpb24gPCB4SXRlcmF0aW9uczsgeEl0ZXJhdGlvbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeUl0ZXJhdGlvbiA9IDA7IHlJdGVyYXRpb24gPCB5SXRlcmF0aW9uczsgeUl0ZXJhdGlvbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8vIEF2b2lkIGdpdmluZyB0aGUgc2FtZSB4IHZhbHVlIHR3aWNlIGluIGEgcm93IGluIG9yZGVyIHRvIG1ha2UgaXQgaGFyZCB0byBjYWNoZQotICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFNpemUgPSBtYXhTaXplLnggKiAoKHhJdGVyYXRpb24gKyB5SXRlcmF0aW9uKSAlIHhJdGVyYXRpb25zKSAvIHhJdGVyYXRpb25zOwotICAgICAgICAgICAgICAgICAgICAgICBpbnQgeVNpemUgPSBtYXhTaXplLnkgKiB5SXRlcmF0aW9uIC8geUl0ZXJhdGlvbnM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgLy8gQWx0ZXJuYXRlIGJldHdlZW4gZmx1c2hpbmcgYW5kIG5vdCBmbHVzaGluZyB0aGUgY2FjaGUKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmbHVzaFN0YXRlID0gKGNvdW50ICUgMikgIT0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIEFsdGVybmF0ZSBiZXR3ZWVuIHdpZHRoLCBoZWlnaHQsIGFuZCBmaXhlZCwgYW5kIGRlZmF1bHQgc2l6ZSBxdWVyaWVzIAotICAgICAgICAgICAgICAgICAgICAgICAvLyAobm90ZTogd2UgbmVlZCB0byBhbHRlcm5hdGUgaW4gb3JkZXIgdG8gbWFrZSB0aGUgcmVzdWx0IGhhcmQgdG8gY2FjaGUpCi0gICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChjb3VudCAlIDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogd2lkZ2V0LmNvbXB1dGVTaXplKHhTaXplLCBTV1QuREVGQVVMVCwgZmx1c2hTdGF0ZSk7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiB3aWRnZXQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIHlTaXplLCBmbHVzaFN0YXRlKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHdpZGdldC5jb21wdXRlU2l6ZSh4U2l6ZSwgeVNpemUsIGZsdXNoU3RhdGUpOyBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogd2lkZ2V0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2hTdGF0ZSk7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIHN0b3BNZWFzdXJpbmcoKTsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICBjb3VudGVyWzBdKys7ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IAotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGNvbW1pdE1lYXN1cmVtZW50cygpOwotICAgICAgICBhc3NlcnRQZXJmb3JtYW5jZSgpOwotICAgICAgICB3aWRnZXRGYWN0b3J5LmRvbmUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L0NvbnN0YW50QXJlYUxheW91dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL2xheW91dC9Db25zdGFudEFyZWFMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMWQ2Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L0NvbnN0YW50QXJlYUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLmxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci0KLS8qKgotICogQSB2ZXJ5IGVmZmljaWVudCAoYnV0IHVzZWxlc3MpIGxheW91dCB3aXRoIGNvbXBsaWNhdGVkIHByZWZlcnJlZCBzaXplIGJlaGF2aW9yLgotICogSXRzIHByZWZlcnJlZCBzaXplIGF0dGVtcHRzIHRvIG1haW50YWluIGEgY29uc3RhbnQgYXJlYS4gVGhpcyBjYW4gYmUgdXNlZCBmb3IgCi0gKiBwZXJmb3JtYW5jZSB0ZXN0aW5nIG90aGVyIGxheW91dHMgKGJ5IGF0dGFjaGluZyB0aGlzIHRvIGNoaWxkIENvbXBvc2l0ZXMgaW4gdGhlIAotICogbGF5b3V0IGJlaW5nIHRlc3RlZCkuIEl0IHdpbGwgZ2l2ZSBhIGdvb2QgZXN0aW1hdGUgYXMgdG8gaG93IHRoZSBsYXlvdXQgd2lsbAotICogaGFuZGxlIHdyYXBwaW5nIHdpZGdldHMuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIENvbnN0YW50QXJlYUxheW91dCBleHRlbmRzIExheW91dCB7Ci0KLSAgICBwcml2YXRlIGludCBhcmVhOwotICAgIHByaXZhdGUgaW50IHByZWZlcnJlZFdpZHRoOwotICAgIAotICAgIHB1YmxpYyBDb25zdGFudEFyZWFMYXlvdXQoaW50IGFyZWEsIGludCBwcmVmZXJyZWRXaWR0aCkgewotICAgICAgICB0aGlzLmFyZWEgPSBhcmVhOwotICAgICAgICB0aGlzLnByZWZlcnJlZFdpZHRoID0gcHJlZmVycmVkV2lkdGg7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dCNjb21wdXRlU2l6ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIGludCwgaW50LCBib29sZWFuKQotICAgICAqLwotICAgIHByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwKLSAgICAgICAgICAgIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotICAgICAgICAKLSAgICAgICAgaWYgKHdIaW50ID09IDAgfHwgaEhpbnQgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCgxLDEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAod0hpbnQgPT0gU1dULkRFRkFVTFQpIHsKLSAgICAgICAgICAgIGlmIChoSGludCA9PSBTV1QuREVGQVVMVCkgewotICAgICAgICAgICAgICAgIHdIaW50ID0gcHJlZmVycmVkV2lkdGg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdIaW50ID0gYXJlYSAvIGhIaW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoaEhpbnQgPT0gU1dULkRFRkFVTFQpIHsKLSAgICAgICAgICAgIGhIaW50ID0gYXJlYSAvIHdIaW50OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IFBvaW50KHdIaW50LCBoSGludCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0I2xheW91dChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L0VkaXRvcldpZGdldEZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9sYXlvdXQvRWRpdG9yV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDM2NzY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9sYXlvdXQvRWRpdG9yV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5FZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlBhcnRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5FbXB0eVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlVJUGVyZm9ybWFuY2VUZXN0U2V0dXA7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yV2lkZ2V0RmFjdG9yeSBleHRlbmRzIFRlc3RXaWRnZXRGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGVkaXRvcklkOwotICAgIHByaXZhdGUgU3RyaW5nIGZpbGVuYW1lOwotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgY3RybDsKLSAgICAKLSAgICBwdWJsaWMgRWRpdG9yV2lkZ2V0RmFjdG9yeShTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgICAgICB0aGlzLmVkaXRvcklkID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEVkaXRvcldpZGdldEZhY3RvcnkoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgZWRpdG9ySWQpIHsKLSAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgICAgICB0aGlzLmVkaXRvcklkID0gZWRpdG9ySWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGdldENvbnRyb2woSUVkaXRvclBhcnQgcGFydCkgewotCQlFZGl0b3JTaXRlIHNpdGUgPSAoRWRpdG9yU2l0ZSlwYXJ0LmdldFNpdGUoKTsKLQkJCi0JCVBhcnRQYW5lIHBhbmUgPSBzaXRlLmdldFBhbmUoKTsKLSAgICAgICAgCi0JCXJldHVybiAoQ29tcG9zaXRlKXBhbmUuZ2V0Q29udHJvbCgpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQuVGVzdFdpZGdldEZhY3RvcnkjZ2V0TmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gImVkaXRvciAiICsgZmlsZW5hbWUgKyAoZWRpdG9ySWQgIT0gbnVsbCA/IGVkaXRvcklkIDogIiIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLmxheW91dC5UZXN0V2lkZ2V0RmFjdG9yeSNpbml0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0KLQkJLy8gT3BlbiBhbiBlZGl0b3IgaW4gYSBuZXcgd2luZG93LgotICAgICAgICB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLm9wZW5Xb3JrYmVuY2hXaW5kb3coRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCwgVUlUZXN0Q2FzZS5nZXRQYWdlSW5wdXQoKSk7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChhY3RpdmVQYWdlKTsKLQkJCi0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBJUHJvamVjdCB0ZXN0UHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChVSVBlcmZvcm1hbmNlVGVzdFNldHVwLlBST0pFQ1RfTkFNRSk7Ci0gICAgICAgIElGaWxlIGZpbGUgPSB0ZXN0UHJvamVjdC5nZXRGaWxlKGZpbGVuYW1lKTsKLQkJCi0gICAgICAgIGlmIChlZGl0b3JJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlZGl0b3JJZCA9IElERS5nZXRFZGl0b3JEZXNjcmlwdG9yKGZpbGUpLmdldElkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElFZGl0b3JQYXJ0IHBhcnQgPSBJREUub3BlbkVkaXRvcihhY3RpdmVQYWdlLCBmaWxlLCBlZGl0b3JJZCwgdHJ1ZSk7Ci0gICAgICAgIGN0cmwgPSBnZXRDb250cm9sKHBhcnQpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQuVGVzdFdpZGdldEZhY3RvcnkjZ2V0Q29udHJvbCgpCi0gICAgICovCi0gICAgcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjdHJsOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQuVGVzdFdpZGdldEZhY3RvcnkjZG9uZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9uZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXb3JrYmVuY2hFeGNlcHRpb24gewotICAgIAl3aW5kb3cuY2xvc2UoKTsKLSAgICAJc3VwZXIuZG9uZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL2xheW91dC9MYXlvdXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L0xheW91dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyZWUxZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L0xheW91dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkdlb21ldHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuQmFzaWNQZXJmb3JtYW5jZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuVGVzdFJ1bm5hYmxlOwotCi0vKioKLSAqIE1lYXN1cmVzIHRoZSB0aW1lIHJlcXVpcmVkIHRvIGxheW91dCB0aGUgd2lkZ2V0IDEwIHRpbWVzLiBEb2VzIG5vdCBpbmNsdWRlIHRoZSB0aW1lCi0gKiByZXF1aXJlZCBmb3IgYW55IGRlZmVycmVkIHJlcGFpbnRzLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRUZXN0IGV4dGVuZHMgQmFzaWNQZXJmb3JtYW5jZVRlc3QgewotCi0gICAgcHJpdmF0ZSBUZXN0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5OwotICAgIHByaXZhdGUgaW50IHhJdGVyYXRpb25zID0gMTA7Ci0gICAgcHJpdmF0ZSBpbnQgeUl0ZXJhdGlvbnMgPSAxMDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmx1c2hTdGF0ZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgTGF5b3V0VGVzdChUZXN0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5LCBib29sZWFuIGZsdXNoU3RhdGUpIHsKLSAgICAgICAgc3VwZXIod2lkZ2V0RmFjdG9yeS5nZXROYW1lKCkgKyAiIGxheW91dCgiICsgKGZsdXNoU3RhdGUgPyAidHJ1ZSIgOiAiZmFsc2UiKSArICIpIik7Ci0gICAgICAgIAotICAgICAgICB0aGlzLndpZGdldEZhY3RvcnkgPSB3aWRnZXRGYWN0b3J5OwotICAgICAgICB0aGlzLmZsdXNoU3RhdGUgPSBmbHVzaFN0YXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1biB0aGUgdGVzdAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQotICAgICAgICB3aWRnZXRGYWN0b3J5LmluaXQoKTsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIHdpZGdldCA9IHdpZGdldEZhY3RvcnkuZ2V0Q29udHJvbCgpOwotICAgICAgICBmaW5hbCBQb2ludCBtYXhTaXplID0gd2lkZ2V0RmFjdG9yeS5nZXRNYXhTaXplKCk7Ci0gICAgICAgIFJlY3RhbmdsZSBpbml0aWFsQm91bmRzID0gd2lkZ2V0LmdldEJvdW5kcygpOwotICAgICAgICBmaW5hbCBSZWN0YW5nbGUgbmV3Qm91bmRzID0gR2VvbWV0cnkuY29weShpbml0aWFsQm91bmRzKTsKLSAgICAgICAgCi0gICAgICAgIGV4ZXJjaXNlKG5ldyBUZXN0UnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgeEl0ZXJhdGlvbiA9IDA7IHhJdGVyYXRpb24gPCB4SXRlcmF0aW9uczsgeEl0ZXJhdGlvbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXZlbnRzKCk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzdGFydE1lYXN1cmluZygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeUl0ZXJhdGlvbiA9IDA7IHlJdGVyYXRpb24gPCB5SXRlcmF0aW9uczsgeUl0ZXJhdGlvbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBdm9pZCBnaXZpbmcgdGhlIHNhbWUgeCB2YWx1ZSB0d2ljZSBpbiBhIHJvdyBpbiBvcmRlciB0byBtYWtlIGl0IGhhcmQgdG8gY2FjaGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB4U2l6ZSA9IG1heFNpemUueCAqICgoeEl0ZXJhdGlvbiArIHlJdGVyYXRpb24pICUgeEl0ZXJhdGlvbnMpIC8geEl0ZXJhdGlvbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeVNpemUgPSBtYXhTaXplLnkgKiB5SXRlcmF0aW9uIC8geUl0ZXJhdGlvbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvdW5kcy53aWR0aCA9IHhTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm91bmRzLmhlaWdodCA9IHlTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQuc2V0Qm91bmRzKG5ld0JvdW5kcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQubGF5b3V0KGZsdXNoU3RhdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzdG9wTWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGNvbW1pdE1lYXN1cmVtZW50cygpOwotICAgICAgICBhc3NlcnRQZXJmb3JtYW5jZSgpOwotICAgICAgICAKLSAgICAgICAgd2lkZ2V0LnNldEJvdW5kcyhpbml0aWFsQm91bmRzKTsKLSAgICAgICAgd2lkZ2V0RmFjdG9yeS5kb25lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL2xheW91dC9QZXJzcGVjdGl2ZVdpZGdldEZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9sYXlvdXQvUGVyc3BlY3RpdmVXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YWIxZGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL2xheW91dC9QZXJzcGVjdGl2ZVdpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlV2lkZ2V0RmFjdG9yeSBleHRlbmRzIFRlc3RXaWRnZXRGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHBlcnNwZWN0aXZlSWQ7Ci0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLSAgICAKLSAgICBwdWJsaWMgUGVyc3BlY3RpdmVXaWRnZXRGYWN0b3J5KFN0cmluZyBpbml0aWFsUGVyc3BlY3RpdmUpIHsKLSAgICAgICAgcGVyc3BlY3RpdmVJZCA9IGluaXRpYWxQZXJzcGVjdGl2ZTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuVGVzdFdpZGdldEZhY3RvcnkjZ2V0TWF4U2l6ZSgpCi0gICAgICovCi0gICAgcHVibGljIFBvaW50IGdldE1heFNpemUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUG9pbnQoMTAyNCwgNzY4KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5UZXN0V2lkZ2V0RmFjdG9yeSNpbml0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0gICAgCS8vIG9wZW4gdGhlIHBlcnNwZWN0aXZlIGluIGEgbmV3IHdpbmRvdwotICAgICAgICB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLm9wZW5Xb3JrYmVuY2hXaW5kb3cocGVyc3BlY3RpdmVJZCwgVUlUZXN0Q2FzZS5nZXRQYWdlSW5wdXQoKSk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChwYWdlKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuVGVzdFdpZGdldEZhY3RvcnkjZ2V0TmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gIlBlcnNwZWN0aXZlICIgKyBwZXJzcGVjdGl2ZUlkOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlRlc3RXaWRnZXRGYWN0b3J5I2dldENvbnRyb2woKQotICAgICAqLwotICAgIHB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbCgpIHsKLSAgICAgICAgcmV0dXJuIHdpbmRvdy5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLmxheW91dC5UZXN0V2lkZ2V0RmFjdG9yeSNkb25lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb25lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0gICAgCXdpbmRvdy5jbG9zZSgpOwotICAgIAlzdXBlci5kb25lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL2xheW91dC9QcmVzZW50YXRpb25XaWRnZXRGYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L1ByZXNlbnRhdGlvbldpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiNGYwZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L1ByZXNlbnRhdGlvbldpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UubGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy5QcmVzZW50YXRpb25GYWN0b3J5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLkFic3RyYWN0UHJlc2VudGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5VSVBlcmZvcm1hbmNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLnByZXNlbnRhdGlvbnMuUHJlc2VudGF0aW9uVGVzdGJlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5wcmVzZW50YXRpb25zLlRlc3RQcmVzZW50YWJsZVBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcmVzZW50YXRpb25XaWRnZXRGYWN0b3J5IGV4dGVuZHMgVGVzdFdpZGdldEZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBBYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkgZmFjdG9yeTsKLSAgICBwcml2YXRlIGludCB0eXBlOwotICAgIHByaXZhdGUgU2hlbGwgc2hlbGw7Ci0gICAgcHJpdmF0ZSBJbWFnZSBpbWc7Ci0gICAgcHJpdmF0ZSBDb250cm9sIGN0cmw7Ci0gICAgcHJpdmF0ZSBpbnQgbnVtUGFydHM7Ci0gICAgCi0gICAgcHVibGljIFByZXNlbnRhdGlvbldpZGdldEZhY3RvcnkoQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5IGZhY3RvcnksIGludCB0eXBlLCBpbnQgbnVtUGFydHMpIHsKLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgdGhpcy5udW1QYXJ0cyA9IG51bVBhcnRzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIGltZyA9IFVJUGVyZm9ybWFuY2VQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9hbnl0aGluZy5naWYiKS5jcmVhdGVJbWFnZSgpOwotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotICAgICAgICAKLSAgICAgICAgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgCi0gICAgICAgIFRlc3RQcmVzZW50YWJsZVBhcnQgc2VsZWN0aW9uID0gbnVsbDsKLSAgICAgICAgUHJlc2VudGF0aW9uVGVzdGJlZCB0ZXN0QmVkID0gbmV3IFByZXNlbnRhdGlvblRlc3RiZWQoc2hlbGwsIGZhY3RvcnksIHR5cGUpOwotICAgICAgICBmb3IoaW50IHBhcnRDb3VudCA9IDA7IHBhcnRDb3VudCA8IG51bVBhcnRzOyBwYXJ0Q291bnQrKykgewotICAgICAgICAgICAgVGVzdFByZXNlbnRhYmxlUGFydCBwYXJ0ID0gbmV3IFRlc3RQcmVzZW50YWJsZVBhcnQoc2hlbGwsIGltZyk7Ci0gICAgICAgICAgICBwYXJ0LnNldE5hbWUoIlNvbWUgcGFydCIpOwotICAgICAgICAgICAgcGFydC5zZXRDb250ZW50RGVzY3JpcHRpb24oIkRlc2NyaXB0aW9uIik7Ci0gICAgICAgICAgICBwYXJ0LnNldFRpdGxlKCJTb21lIHRpdGxlIik7Ci0gICAgICAgICAgICBwYXJ0LnNldERpcnR5KHBhcnRDb3VudCAlIDIgPT0gMCk7Ci0gICAgICAgICAgICBwYXJ0LnNldFRvb2x0aXAoIlRoaXMgaXMgYSB0b29sdGlwIik7Ci0gICAgICAgICAgICB0ZXN0QmVkLmFkZChwYXJ0KTsKLSAgICAgICAgICAgIHNlbGVjdGlvbiA9IHBhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRlc3RCZWQuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgICAgIAotICAgICAgICBjdHJsID0gdGVzdEJlZC5nZXRDb250cm9sKCk7Ci0gICAgICAgIHNoZWxsLnNldEJvdW5kcygwLDAsMTAyNCw3NjgpOwotICAgICAgICBjdHJsLnNldEJvdW5kcyhzaGVsbC5nZXRDbGllbnRBcmVhKCkpOwotICAgICAgICBzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkb25lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNoZWxsLmRpc3Bvc2UoKTsKLSAgICAgICAgaW1nLmRpc3Bvc2UoKTsKLQotICAgICAgICBzdXBlci5kb25lKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaWJlUHJlc2VudGF0aW9uKEFic3RyYWN0UHJlc2VudGF0aW9uRmFjdG9yeSBmYWN0b3J5LCBpbnQgdHlwZSkgewotICAgICAgICBTdHJpbmcgdHlwZURlc2MgPSAidW5rbm93biI7Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIFByZXNlbnRhdGlvbkZhY3RvcnlVdGlsLlJPTEVfRURJVE9SOiB0eXBlRGVzYyA9ICJlZGl0b3IiOyBicmVhazsKLSAgICAgICAgY2FzZSBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX1NUQU5EQUxPTkU6IHR5cGVEZXNjID0gInN0YW5kYWxvbmUgd2l0aCB0aXRsZSI7IGJyZWFrOwotICAgICAgICBjYXNlIFByZXNlbnRhdGlvbkZhY3RvcnlVdGlsLlJPTEVfU1RBTkRBTE9ORV9OT1RJVExFOiB0eXBlRGVzYyA9ICJzdGFuZGFsb25lIHdpdGhvdXQgdGl0bGUiOyBicmVhazsKLSAgICAgICAgY2FzZSBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX1ZJRVc6IHR5cGVEZXNjID0gInZpZXciOyBicmVhazsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuICJQcmVzZW50YXRpb24gIiArIGZhY3RvcnkuZ2V0SWQoKSArICIgIiArIHR5cGVEZXNjOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpYmVQcmVzZW50YXRpb24oZmFjdG9yeSwgdHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoQ29tcG9zaXRlKWN0cmw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L1JlY3Vyc2l2ZVRyaW1MYXlvdXRXaWRnZXRGYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L1JlY3Vyc2l2ZVRyaW1MYXlvdXRXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWUzNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL2xheW91dC9SZWN1cnNpdmVUcmltTGF5b3V0V2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldpbmRvd1RyaW1Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5sYXlvdXQuVHJpbUxheW91dDsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWN1cnNpdmVUcmltTGF5b3V0V2lkZ2V0RmFjdG9yeSBleHRlbmRzIFRlc3RXaWRnZXRGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgU2hlbGwgc2hlbGw7Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UubGF5b3V0LlRlc3RXaWRnZXRGYWN0b3J5I2dldE5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNYXNzaXZlbHkgUmVjdXJzaXZlIFRyaW1MYXlvdXQiOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQuVGVzdFdpZGdldEZhY3RvcnkjZG9uZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9uZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXb3JrYmVuY2hFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb25lKCk7Ci0gICAgICAgIAotICAgICAgICBzaGVsbC5kaXNwb3NlKCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLmxheW91dC5UZXN0V2lkZ2V0RmFjdG9yeSNpbml0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQoKTsKLSAgICAgICAgCi0JCURpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0JCQotCQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkKLQkJY3JlYXRlVHJpbUxheW91dChzaGVsbCwgMTAsIFNXVC5UT1ApOwotCQkKLQkJc2hlbGwuc2V0Qm91bmRzKDAsMCwxMDI0LDc2OCk7Ci0JCXNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHNldCBvZiByZWN1cnNpdmUgdHJpbSBsYXlvdXRzIHdpdGggdGhlIGdpdmVuIGRlcHRoLiBUaGF0IGlzLCB0aGUKLSAgICAgKiB0cmltIGNvbnRyb2xzIHRoZW1zZWx2ZXMgYXJlIGFsc28gdHJpbSBsYXlvdXRzLiBUaGlzIGVuc3VyZXMgdGhhdCBUcmltTGF5b3V0IAotICAgICAqIGNhbiBoYW5kbGUgCi0gICAgICogTm90ZSB0aGF0IHRoaXMKLSAgICAgKiB3aWxsIGNyZWF0ZSBPKDJeZGVwdGgpIGNoaWxkcmVuLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb3NpdGUKLSAgICAgKiBAcGFyYW0gZGVwdGgKLSAgICAgKiBAcGFyYW0gc2lkZQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVUcmltTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBkZXB0aCwgaW50IHNpZGUpIHsKLSAgICAgICAgaWYgKGRlcHRoID09IDApIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IENvbnN0YW50QXJlYUxheW91dCg1MDAwLCAzMDApKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFRyaW1MYXlvdXQgbGF5b3V0ID0gbmV3IFRyaW1MYXlvdXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgbmV4dFNpZGUgPSBTV1QuVE9QOyAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3dpdGNoIChzaWRlKSB7Ci0gICAgICAgICAgICAJY2FzZSBTV1QuVE9QIDogbmV4dFNpZGUgPSBTV1QuUklHSFQ7IGJyZWFrOwotICAgICAgICAgICAgCWNhc2UgU1dULlJJR0hUIDogbmV4dFNpZGUgPSBTV1QuQk9UVE9NOyBicmVhazsKLSAgICAgICAgICAgIAljYXNlIFNXVC5CT1RUT00gOiBuZXh0U2lkZSA9IFNXVC5MRUZUOyBicmVhazsKLSAgICAgICAgICAgIAljYXNlIFNXVC5MRUZUIDogbmV4dFNpZGUgPSBTV1QuVE9QOyBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQWRkIGEgcmVzaXphYmxlIGNoaWxkCi0gICAgICAgICAgICBDb21wb3NpdGUgY2hpbGQgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgV2luZG93VHJpbVByb3h5IHByb3h5ID0gbmV3IFdpbmRvd1RyaW1Qcm94eShjaGlsZCwgCi0gICAgICAgICAgICAJCSJjaGlsZDEuIiArIHNpZGUgKyAiLiIgKyBkZXB0aCwgIlJlc2l6YWJsZSBDaGlsZCIsIHNpZGUsIHRydWUpOwotICAgICAgICAgICAgbGF5b3V0LmFkZFRyaW0oc2lkZSwgcHJveHkpOwotICAgICAgICAgICAgY3JlYXRlVHJpbUxheW91dChjaGlsZCwgZGVwdGggLSAxLCBuZXh0U2lkZSk7IAotCi0gICAgICAgICAgICAvLyBBZGQgYSBub24tcmVzaXphYmxlIGNoaWxkCi0gICAgICAgICAgICBjaGlsZCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBwcm94eSA9IG5ldyBXaW5kb3dUcmltUHJveHkoY2hpbGQsIAotICAgICAgICAgICAgCQkiY2hpbGQyLiIgKyBzaWRlICsgIi4iICsgZGVwdGgsICJOb24tUmVzaXphYmxlIENoaWxkIiwgc2lkZSwgZmFsc2UpOwotICAgICAgICAgICAgbGF5b3V0LmFkZFRyaW0oc2lkZSwgcHJveHkpOwotICAgICAgICAgICAgY3JlYXRlVHJpbUxheW91dChjaGlsZCwgZGVwdGggLSAxLCBuZXh0U2lkZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEZpbGwgdGhlIGNsaWVudCBhcmVhCi0gICAgICAgICAgICBjaGlsZCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBsYXlvdXQuc2V0Q2VudGVyQ29udHJvbChjaGlsZCk7Ci0gICAgICAgICAgICBjaGlsZC5zZXRMYXlvdXQobmV3IENvbnN0YW50QXJlYUxheW91dCgzMDAwLCAxNTApKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQuVGVzdFdpZGdldEZhY3RvcnkjZ2V0Q29udHJvbCgpCi0gICAgICovCi0gICAgcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzaGVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9sYXlvdXQvUmVzaXplVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL2xheW91dC9SZXNpemVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODZhNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL2xheW91dC9SZXNpemVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UubGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5CYXNpY1BlcmZvcm1hbmNlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5UZXN0UnVubmFibGU7Ci0KLS8qKgotICogTWVhc3VyZXMgdGhlIHRpbWUgdG8gcmVzaXplIHRoZSB3aWRnZXQgMTAgdGltZXMsIGluY2x1ZGluZyB0aGUgdGltZSByZXF1aXJlZCB0byByZWRyYXcuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFJlc2l6ZVRlc3QgZXh0ZW5kcyBCYXNpY1BlcmZvcm1hbmNlVGVzdCB7Ci0KLSAgICBwcml2YXRlIFRlc3RXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBpbnQgeEl0ZXJhdGlvbnMgPSAxMDsKLSAgICBwcml2YXRlIGludCB5SXRlcmF0aW9ucyA9IDEwOwotICAgIHByaXZhdGUgU3RyaW5nIHRhZ1N0cmluZzsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBSZXNpemVUZXN0KFRlc3RXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLSAgICAgICAgdGhpcyh3aWRnZXRGYWN0b3J5LCBOT05FLCB3aWRnZXRGYWN0b3J5LmdldE5hbWUoKSArICIgc2V0U2l6ZSIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzaXplVGVzdChUZXN0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5LCBpbnQgdGFnZ2luZywgU3RyaW5nIHRhZ1N0cmluZykgewotICAgICAgICBzdXBlcih3aWRnZXRGYWN0b3J5LmdldE5hbWUoKSArICIgc2V0U2l6ZSIsdGFnZ2luZyk7Ci0gICAgICAgIHRoaXMudGFnU3RyaW5nID0gdGFnU3RyaW5nOwotICAgICAgICB0aGlzLndpZGdldEZhY3RvcnkgPSB3aWRnZXRGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1biB0aGUgdGVzdAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQotICAgICAgICB0YWdJZk5lY2Vzc2FyeSh0YWdTdHJpbmcsRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0gICAgICAgIAotICAgICAgICB3aWRnZXRGYWN0b3J5LmluaXQoKTsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIHdpZGdldCA9IHdpZGdldEZhY3RvcnkuZ2V0Q29udHJvbCgpOwotICAgICAgICBSZWN0YW5nbGUgaW5pdGlhbEJvdW5kcyA9IHdpZGdldC5nZXRCb3VuZHMoKTsKLSAgICAgICAgZmluYWwgUG9pbnQgbWF4U2l6ZSA9IHdpZGdldEZhY3RvcnkuZ2V0TWF4U2l6ZSgpOwotICAgIAotICAgICAgICB3YWl0Rm9yQmFja2dyb3VuZEpvYnMoKTsKLSAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICAKLSAgICAgICAgZXhlcmNpc2UobmV3IFRlc3RSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4SXRlcmF0aW9uID0gMDsgeEl0ZXJhdGlvbiA8IHhJdGVyYXRpb25zOyB4SXRlcmF0aW9uKyspIHsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB5SXRlcmF0aW9uID0gMDsgeUl0ZXJhdGlvbiA8IHlJdGVyYXRpb25zOyB5SXRlcmF0aW9uKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF2b2lkIGdpdmluZyB0aGUgc2FtZSB4IHZhbHVlIHR3aWNlIGluIGEgcm93IGluIG9yZGVyIHRvIG1ha2UgaXQgaGFyZCB0byBjYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhTaXplID0gbWF4U2l6ZS54ICogKCh4SXRlcmF0aW9uICsgeUl0ZXJhdGlvbikgJSB4SXRlcmF0aW9ucykgLyB4SXRlcmF0aW9uczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB5U2l6ZSA9IG1heFNpemUueSAqIHlJdGVyYXRpb24gLyB5SXRlcmF0aW9uczsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LnNldFNpemUoeFNpemUsIHlTaXplKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXZlbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN0b3BNZWFzdXJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFBlcmZvcm1hbmNlKCk7Ci0gICAgICAgIAotICAgICAgICB3aWRnZXQuc2V0Qm91bmRzKGluaXRpYWxCb3VuZHMpOwotICAgICAgICB3aWRnZXRGYWN0b3J5LmRvbmUoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L1Rlc3RXaWRnZXRGYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvbGF5b3V0L1Rlc3RXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZTdjM2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL2xheW91dC9UZXN0V2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLmxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuR2VvbWV0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdFdpZGdldEZhY3RvcnkgewotCXB1YmxpYyBQb2ludCBnZXRNYXhTaXplKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0JICAgIENvbXBvc2l0ZSBjb250cm9sID0gZ2V0Q29udHJvbCgpOwotCSAgICBDb21wb3NpdGUgcGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTsKLQkgICAgCi0JICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotCSAgICAgICAgcmV0dXJuIG5ldyBQb2ludCg4MDAsIDYwMCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIEdlb21ldHJ5LmdldFNpemUocGFyZW50LmdldENsaWVudEFyZWEoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV29ya2JlbmNoRXhjZXB0aW9uIHt9Ci0JcHVibGljIHZvaWQgZG9uZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXb3JrYmVuY2hFeGNlcHRpb24ge30KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsKLQlwdWJsaWMgYWJzdHJhY3QgQ29tcG9zaXRlIGdldENvbnRyb2woKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV29ya2JlbmNoRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL2xheW91dC9WaWV3V2lkZ2V0RmFjdG9yeS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL2xheW91dC9WaWV3V2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmFmYTM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9sYXlvdXQvVmlld1dpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UubGF5b3V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5QYXJ0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5WaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5FbXB0eVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLkJhc2ljUGVyZm9ybWFuY2VUZXN0OwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFZpZXdXaWRnZXRGYWN0b3J5IGV4dGVuZHMgVGVzdFdpZGdldEZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlld0lkOwotICAgIHByaXZhdGUgQ29udHJvbCBjdHJsOwotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0gICAgCi0gICAgcHVibGljIFZpZXdXaWRnZXRGYWN0b3J5KFN0cmluZyB2aWV3SWQpIHsKLSAgICAgICAgdGhpcy52aWV3SWQgPSB2aWV3SWQ7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHZpZXdJZCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlRlc3RXaWRnZXRGYWN0b3J5I2dldE1heFNpemUoKQotICAgICAqLwotICAgIHB1YmxpYyBQb2ludCBnZXRNYXhTaXplKCkgewotICAgICAgICByZXR1cm4gbmV3IFBvaW50KDEwMjQsIDc2OCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21wb3NpdGUgZ2V0Q29udHJvbChJVmlld1BhcnQgcGFydCkgewotCQlWaWV3U2l0ZSBzaXRlID0gKFZpZXdTaXRlKXBhcnQuZ2V0U2l0ZSgpOwotCQkKLQkJUGFydFBhbmUgcGFuZSA9IHNpdGUuZ2V0UGFuZSgpOwotICAgICAgICAKLQkJcmV0dXJuIChDb21wb3NpdGUpcGFuZS5nZXRDb250cm9sKCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlRlc3RXaWRnZXRGYWN0b3J5I2luaXQoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV29ya2JlbmNoRXhjZXB0aW9uIHsKLSAgICAJLy8gb3BlbiB0aGUgdmlldyBpbiBhIG5ldyB3aW5kb3cKLSAgICAgICAgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5vcGVuV29ya2JlbmNoV2luZG93KEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQsIFVJVGVzdENhc2UuZ2V0UGFnZUlucHV0KCkpOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwocGFnZSk7Ci0KLQkJSVZpZXdQYXJ0IHBhcnQgPSBwYWdlLnNob3dWaWV3KHZpZXdJZCwgbnVsbCwgV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFKTsKLSAgICAgICAgCi0gICAgICAgIEJhc2ljUGVyZm9ybWFuY2VUZXN0LndhaXRGb3JCYWNrZ3JvdW5kSm9icygpOwotICAgICAgICAKLQkJY3RybCA9IGdldENvbnRyb2wocGFydCk7Ci0gICAgICAgIAotICAgICAgICBQb2ludCBzaXplID0gZ2V0TWF4U2l6ZSgpOwotICAgICAgICBjdHJsLnNldEJvdW5kcygwLDAsc2l6ZS54LCBzaXplLnkpOwotICAgICAgICB3aW5kb3cuZ2V0U2hlbGwoKS5zZXRTaXplKHNpemUpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5UZXN0V2lkZ2V0RmFjdG9yeSNnZXROYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiVmlldyAiICsgdmlld0lkOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlRlc3RXaWRnZXRGYWN0b3J5I2dldENvbnRyb2woKQotICAgICAqLwotICAgIHB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXb3JrYmVuY2hFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKENvbXBvc2l0ZSljdHJsOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQuVGVzdFdpZGdldEZhY3RvcnkjZG9uZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9uZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXb3JrYmVuY2hFeGNlcHRpb24gewotICAgIAl3aW5kb3cuY2xvc2UoKTsKLSAgICAJc3VwZXIuZG9uZSgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9tYXJrZWQudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL21hcmtlZC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNjNmMGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL21hcmtlZC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi13aW5kb3cgcmVzaXppbmcKLXBlcmYxL3BlcmYyIHBlcnNwZWN0aXZlIHN3aXRjaGluZwotCi0gViBiYXNpYyB2aWV3IG9wZW4vY2xvc2UKLSBWIGVtcHR5IHBlcnNwZWN0aXZlIG9wZW4vY2xvc2UKLSBWIHBlcmZfYmFzaWMgZWRpdG9yIG9wZW4vY2xvc2UKLSBWIHBlcmZfYmFzaWMgY2xvc2VBbGwKLSBWIHBlcmYxIG9wZW4vY2xvc2Ugd2luZG93Ci0KLSogYXNrIFN0ZWZhbiBmb3Igb25lIGludGVyZXN0aW5nIHRlc3QKLQotdmlldyB0byBlZGl0b3Igc3dpdGNoaW5nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3BhcnRzL1BlcmZvcm1hbmNlRWRpdG9yUGFydC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3BhcnRzL1BlcmZvcm1hbmNlRWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZThiZmE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9wYXJ0cy9QZXJmb3JtYW5jZUVkaXRvclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUGVyZm9ybWFuY2VFZGl0b3JQYXJ0IGV4dGVuZHMgRWRpdG9yUGFydCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fT1VUTElORSA9ICJvdXRsaW5lIjsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gZGlydHk7Ci0gICAgcHJpdmF0ZSBMYWJlbCBjb250cm9sOwotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VPdXRsaW5lID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgUGVyZm9ybWFuY2VFZGl0b3JQYXJ0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0gICAgICAgICAgICB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRTaXRlKHNpdGUpOwotICAgICAgICBzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc0RpcnR5KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotICAgICAgICByZXR1cm4gZGlydHk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERpcnR5KGJvb2xlYW4gZGlydHkpIHsKLSAgICAgICAgdGhpcy5kaXJ0eSA9IGRpcnR5OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7ICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGNvbnRyb2wgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIGNvbnRyb2wuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb24jc2V0SW5pdGlhbGl6YXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjZmlnLAotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHsKLSAgICAgICAgc3VwZXIuc2V0SW5pdGlhbGl6YXRpb25EYXRhKGNmaWcsIHByb3BlcnR5TmFtZSwgZGF0YSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICBmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoKFN0cmluZykgZGF0YSwgIiwiKTsgdG9rZXIuaGFzTW9yZVRva2VucygpOyApIHsKLSAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHRva2VyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgaWYgKHRva2VuLmVxdWFscyhQQVJBTV9PVVRMSU5FKSkKLSAgICAgICAgICAgICAgICAgICB1c2VPdXRsaW5lID0gdHJ1ZTsKLSAgICAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgICAgICBpZiAodXNlT3V0bGluZSAmJiBhZGFwdGVyLmVxdWFscyhJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzKSkgewotICAgICAgICAgICAgb2JqZWN0ID0gbmV3IENvbnRlbnRPdXRsaW5lUGFnZSgpIHsKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3BhcnRzL1BlcmZvcm1hbmNlVmlld1BhcnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9wYXJ0cy9QZXJmb3JtYW5jZVZpZXdQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NDJjNzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3BhcnRzL1BlcmZvcm1hbmNlVmlld1BhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUGVyZm9ybWFuY2VWaWV3UGFydCBleHRlbmRzIFZpZXdQYXJ0IHsKLQotCXByaXZhdGUgTGFiZWwgY29udHJvbDsKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUGVyZm9ybWFuY2VWaWV3UGFydCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250cm9sID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJY29udHJvbC5zZXRGb2N1cygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvUHJlc2VudGF0aW9uQWN0aXZhdGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvcHJlc2VudGF0aW9ucy9QcmVzZW50YXRpb25BY3RpdmF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU0NDVhNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvcHJlc2VudGF0aW9ucy9QcmVzZW50YXRpb25BY3RpdmF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5wcmVzZW50YXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5BYnN0cmFjdFByZXNlbnRhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5TdGFja1ByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5UZXN0UnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UubGF5b3V0LlByZXNlbnRhdGlvbldpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBQcmVzZW50YXRpb25BY3RpdmF0ZVRlc3QgZXh0ZW5kcyBQcmVzZW50YXRpb25QZXJmb3JtYW5jZVRlc3QgewotICAgIAotICAgIHByaXZhdGUgaW50IHR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyOwotICAgIHByaXZhdGUgQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5IGZhY3Rvcnk7Ci0gICAgCi0gICAgcHVibGljIFByZXNlbnRhdGlvbkFjdGl2YXRlVGVzdChBYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkgZmFjdG9yeSwgaW50IHR5cGUsIGludCBudW1iZXIpIHsKLSAgICAgICAgc3VwZXIoUHJlc2VudGF0aW9uV2lkZ2V0RmFjdG9yeS5kZXNjcmliZVByZXNlbnRhdGlvbihmYWN0b3J5LCB0eXBlKSArICIgYWN0aXZhdGlvbiIpOwotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmaW5hbCBQcmVzZW50YXRpb25UZXN0YmVkIHRlc3RiZWQgPSBjcmVhdGVQcmVzZW50YXRpb24oZmFjdG9yeSwgdHlwZSwgbnVtYmVyKTsKLSAgICAgICAgCi0gICAgICAgIGV4ZXJjaXNlKG5ldyBUZXN0UnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzdGFydE1lYXN1cmluZygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdGJlZC5zZXRBY3RpdmUoU3RhY2tQcmVzZW50YXRpb24uQVNfQUNUSVZFX0ZPQ1VTKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0V2ZW50cygpOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRlc3RiZWQuc2V0QWN0aXZlKFN0YWNrUHJlc2VudGF0aW9uLkFTX0FDVElWRV9OT0ZPQ1VTKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICAgICAgICAgICAgICB0ZXN0YmVkLnNldEFjdGl2ZShTdGFja1ByZXNlbnRhdGlvbi5BU19JTkFDVElWRSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFdmVudHMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3RvcE1lYXN1cmluZygpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBjb21taXRNZWFzdXJlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvcHJlc2VudGF0aW9ucy9QcmVzZW50YXRpb25BY3RpdmVQYXJ0UHJvcGVydHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvcHJlc2VudGF0aW9ucy9QcmVzZW50YXRpb25BY3RpdmVQYXJ0UHJvcGVydHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjg3OWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvUHJlc2VudGF0aW9uQWN0aXZlUGFydFByb3BlcnR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLnByZXNlbnRhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLkFic3RyYWN0UHJlc2VudGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5UZXN0UnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UubGF5b3V0LlByZXNlbnRhdGlvbldpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBQcmVzZW50YXRpb25BY3RpdmVQYXJ0UHJvcGVydHlUZXN0IGV4dGVuZHMgUHJlc2VudGF0aW9uUGVyZm9ybWFuY2VUZXN0IHsKLSAgICAKLSAgICBwcml2YXRlIGludCB0eXBlOwotICAgIHByaXZhdGUgaW50IG51bWJlcjsKLSAgICBwcml2YXRlIEFic3RyYWN0UHJlc2VudGF0aW9uRmFjdG9yeSBmYWN0b3J5OwotICAgIAotICAgIHB1YmxpYyBQcmVzZW50YXRpb25BY3RpdmVQYXJ0UHJvcGVydHlUZXN0KEFic3RyYWN0UHJlc2VudGF0aW9uRmFjdG9yeSBmYWN0b3J5LCBpbnQgdHlwZSwgaW50IG51bWJlcikgewotICAgICAgICBzdXBlcihQcmVzZW50YXRpb25XaWRnZXRGYWN0b3J5LmRlc2NyaWJlUHJlc2VudGF0aW9uKGZhY3RvcnksIHR5cGUpICsgIiBhY3RpdmUgcGFydCBwcm9wZXJ0aWVzIik7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOwotICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIAotICAgIAlzZXREZWdyYWRhdGlvbkNvbW1lbnQoIjxhIGhyZWY9aHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTA3Mj5TZWUgQnVnIDEwMTA3MjwvYT4gIik7Ci0gICAgCSAKLSAgICAgICAgZmluYWwgUHJlc2VudGF0aW9uVGVzdGJlZCB0ZXN0YmVkID0gY3JlYXRlUHJlc2VudGF0aW9uKGZhY3RvcnksIHR5cGUsIG51bWJlcik7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBUZXN0UHJlc2VudGFibGVQYXJ0IHBhcnQgPSAoVGVzdFByZXNlbnRhYmxlUGFydCl0ZXN0YmVkLmdldFNlbGVjdGlvbigpOwotICAgICAgICAKLSAgICAgICAgZXhlcmNpc2UobmV3IFRlc3RSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0d2lkZGxlUHJvcGVydHkoREVTQ1JJUFRJT04sIHBhcnQpOwotICAgICAgICAgICAgICAgIHR3aWRkbGVQcm9wZXJ0eShESVJUWSwgcGFydCk7Ci0gICAgICAgICAgICAgICAgdHdpZGRsZVByb3BlcnR5KElNQUdFLCBwYXJ0KTsKLSAgICAgICAgICAgICAgICB0d2lkZGxlUHJvcGVydHkoTkFNRSwgcGFydCk7Ci0gICAgICAgICAgICAgICAgdHdpZGRsZVByb3BlcnR5KFRJVExFLCBwYXJ0KTsKLSAgICAgICAgICAgICAgICB0d2lkZGxlUHJvcGVydHkoVE9PTEJBUiwgcGFydCk7Ci0gICAgICAgICAgICAgICAgdHdpZGRsZVByb3BlcnR5KFRPT0xUSVAsIHBhcnQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN0b3BNZWFzdXJpbmcoKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFBlcmZvcm1hbmNlKCk7ICAgICAgICAgICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9wcmVzZW50YXRpb25zL1ByZXNlbnRhdGlvbkNyZWF0ZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9wcmVzZW50YXRpb25zL1ByZXNlbnRhdGlvbkNyZWF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5ODg1YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvcHJlc2VudGF0aW9ucy9QcmVzZW50YXRpb25DcmVhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UucHJlc2VudGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlRlc3RSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQuUHJlc2VudGF0aW9uV2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFByZXNlbnRhdGlvbkNyZWF0ZVRlc3QgZXh0ZW5kcyBQcmVzZW50YXRpb25QZXJmb3JtYW5jZVRlc3QgewotICAgIAotICAgIHByaXZhdGUgaW50IHR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyOwotICAgIHByaXZhdGUgQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICBwdWJsaWMgUHJlc2VudGF0aW9uQ3JlYXRlVGVzdChBYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkgZmFjdG9yeSwgaW50IHR5cGUsIGludCBudW1iZXIpIHsKLSAgICAgICAgdGhpcyhmYWN0b3J5LCB0eXBlLCBudW1iZXIsICJjcmVhdGlvbiIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUHJlc2VudGF0aW9uQ3JlYXRlVGVzdChBYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkgZmFjdG9yeSwgaW50IHR5cGUsIGludCBudW1iZXIsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKFByZXNlbnRhdGlvbldpZGdldEZhY3RvcnkuZGVzY3JpYmVQcmVzZW50YXRpb24oZmFjdG9yeSwgdHlwZSkgKyAiICIgKyBtZXNzYWdlKTsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZXhlcmNpc2UobmV3IFRlc3RSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgUHJlc2VudGF0aW9uVGVzdGJlZCB0ZXN0YmVkID0gY3JlYXRlUHJlc2VudGF0aW9uKGZhY3RvcnksIHR5cGUsIG51bWJlcik7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0V2ZW50cygpOwotICAgICAgICAgICAgICAgIHRlc3RiZWQuZ2V0Q29udHJvbCgpLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRXZlbnRzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3RvcE1lYXN1cmluZygpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBjb21taXRNZWFzdXJlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvUHJlc2VudGF0aW9uSW5hY3RpdmVQYXJ0UHJvcGVydHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvcHJlc2VudGF0aW9ucy9QcmVzZW50YXRpb25JbmFjdGl2ZVBhcnRQcm9wZXJ0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1OWJiYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvcHJlc2VudGF0aW9ucy9QcmVzZW50YXRpb25JbmFjdGl2ZVBhcnRQcm9wZXJ0eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5wcmVzZW50YXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5BYnN0cmFjdFByZXNlbnRhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuVGVzdFJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLmxheW91dC5QcmVzZW50YXRpb25XaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUHJlc2VudGF0aW9uSW5hY3RpdmVQYXJ0UHJvcGVydHlUZXN0IGV4dGVuZHMgUHJlc2VudGF0aW9uUGVyZm9ybWFuY2VUZXN0IHsKLSAgICAKLSAgICBwcml2YXRlIGludCB0eXBlOwotICAgIHByaXZhdGUgaW50IG51bWJlcjsKLSAgICBwcml2YXRlIEFic3RyYWN0UHJlc2VudGF0aW9uRmFjdG9yeSBmYWN0b3J5OwotICAgIAotICAgIHB1YmxpYyBQcmVzZW50YXRpb25JbmFjdGl2ZVBhcnRQcm9wZXJ0eVRlc3QoQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5IGZhY3RvcnksIGludCB0eXBlLCBpbnQgbnVtYmVyKSB7Ci0gICAgICAgIHN1cGVyKFByZXNlbnRhdGlvbldpZGdldEZhY3RvcnkuZGVzY3JpYmVQcmVzZW50YXRpb24oZmFjdG9yeSwgdHlwZSkgKyAiIGluYWN0aXZlIHBhcnQgcHJvcGVydGllcyIpOwotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmaW5hbCBQcmVzZW50YXRpb25UZXN0YmVkIHRlc3RiZWQgPSBjcmVhdGVQcmVzZW50YXRpb24oZmFjdG9yeSwgdHlwZSwgbnVtYmVyKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFRlc3RQcmVzZW50YWJsZVBhcnQgcGFydCA9IG5ldyBUZXN0UHJlc2VudGFibGVQYXJ0KHRoZVNoZWxsLCBpbWcpOwotICAgICAgICB0ZXN0YmVkLmFkZChwYXJ0KTsKLSAgICAgICAgCi0gICAgICAgIGV4ZXJjaXNlKG5ldyBUZXN0UnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzdGFydE1lYXN1cmluZygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgNTsgY291bnRlcisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR3aWRkbGVQcm9wZXJ0eShERVNDUklQVElPTiwgcGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIHR3aWRkbGVQcm9wZXJ0eShESVJUWSwgcGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIHR3aWRkbGVQcm9wZXJ0eShJTUFHRSwgcGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIHR3aWRkbGVQcm9wZXJ0eShOQU1FLCBwYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgdHdpZGRsZVByb3BlcnR5KFRJVExFLCBwYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgdHdpZGRsZVByb3BlcnR5KFRPT0xCQVIsIHBhcnQpOwotICAgICAgICAgICAgICAgICAgICB0d2lkZGxlUHJvcGVydHkoVE9PTFRJUCwgcGFydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN0b3BNZWFzdXJpbmcoKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFBlcmZvcm1hbmNlKCk7ICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9wcmVzZW50YXRpb25zL1ByZXNlbnRhdGlvblBlcmZvcm1hbmNlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvUHJlc2VudGF0aW9uUGVyZm9ybWFuY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMTJjYmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvUHJlc2VudGF0aW9uUGVyZm9ybWFuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLnByZXNlbnRhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5BYnN0cmFjdFByZXNlbnRhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuQmFzaWNQZXJmb3JtYW5jZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuVUlQZXJmb3JtYW5jZVBsdWdpbjsKLQotcHVibGljIGNsYXNzIFByZXNlbnRhdGlvblBlcmZvcm1hbmNlVGVzdCBleHRlbmRzIEJhc2ljUGVyZm9ybWFuY2VUZXN0IHsKLQotCXByb3RlY3RlZCBTaGVsbCB0aGVTaGVsbDsKLQotCXByb3RlY3RlZCBJbWFnZSBpbWc7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgaW1nMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5BTUUgPSAwOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVElUTEUgPSAxOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRElSVFkgPSAyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVTQ1JJUFRJT04gPSAzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVE9PTFRJUCA9IDQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTUFHRSA9IDU7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUT09MQkFSID0gNjsKLQotCXB1YmxpYyBQcmVzZW50YXRpb25QZXJmb3JtYW5jZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRvU2V0VXAoKTsKLQkJdGhlU2hlbGwgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCksIFNXVC5OT05FKTsKLQkJdGhlU2hlbGwuc2V0Qm91bmRzKDAsIDAsIDEwMjQsIDc2OCk7Ci0JCXRoZVNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JCWltZyA9IFVJUGVyZm9ybWFuY2VQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJpY29ucy9hbnl0aGluZy5naWYiKS5jcmVhdGVJbWFnZSgpOwotCQlpbWcyID0gVUlQZXJmb3JtYW5jZVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3ZpZXcuZ2lmIikKLQkJCQkuY3JlYXRlSW1hZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoZVNoZWxsLmRpc3Bvc2UoKTsKLQkJdGhlU2hlbGwgPSBudWxsOwotCQlpbWcuZGlzcG9zZSgpOwotCQlpbWcyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZG9UZWFyRG93bigpOwotCX0KLQotCXByb3RlY3RlZCBQcmVzZW50YXRpb25UZXN0YmVkIGNyZWF0ZVByZXNlbnRhdGlvbigKLQkJCUFic3RyYWN0UHJlc2VudGF0aW9uRmFjdG9yeSBmYWN0b3J5LCBpbnQgdHlwZSwgaW50IG51bVBhcnRzKSB7Ci0JCVRlc3RQcmVzZW50YWJsZVBhcnQgc2VsZWN0aW9uID0gbnVsbDsKLQkJUHJlc2VudGF0aW9uVGVzdGJlZCB0ZXN0QmVkID0gbmV3IFByZXNlbnRhdGlvblRlc3RiZWQodGhlU2hlbGwsCi0JCQkJZmFjdG9yeSwgdHlwZSk7Ci0JCWZvciAoaW50IHBhcnRDb3VudCA9IDA7IHBhcnRDb3VudCA8IG51bVBhcnRzOyBwYXJ0Q291bnQrKykgewotCQkJVGVzdFByZXNlbnRhYmxlUGFydCBwYXJ0ID0gbmV3IFRlc3RQcmVzZW50YWJsZVBhcnQodGhlU2hlbGwsIGltZyk7Ci0JCQlwYXJ0LnNldE5hbWUoIlNvbWUgcGFydCIpOwotCQkJcGFydC5zZXRDb250ZW50RGVzY3JpcHRpb24oIkRlc2NyaXB0aW9uIik7Ci0JCQlwYXJ0LnNldFRpdGxlKCJTb21lIHRpdGxlIik7Ci0JCQlwYXJ0LnNldERpcnR5KHBhcnRDb3VudCAlIDIgPT0gMCk7Ci0JCQlwYXJ0LnNldFRvb2x0aXAoIlRoaXMgaXMgYSB0b29sdGlwIik7Ci0JCQl0ZXN0QmVkLmFkZChwYXJ0KTsKLQkJCXNlbGVjdGlvbiA9IHBhcnQ7Ci0JCX0KLQotCQl0ZXN0QmVkLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCi0JCUNvbnRyb2wgY3RybCA9IHRlc3RCZWQuZ2V0Q29udHJvbCgpOwotCQljdHJsLnNldEJvdW5kcyh0aGVTaGVsbC5nZXRDbGllbnRBcmVhKCkpOwotCQlyZXR1cm4gdGVzdEJlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0d2lkZGxlUHJvcGVydHkoaW50IHByb3BlcnR5LCBUZXN0UHJlc2VudGFibGVQYXJ0IHBhcnQpIHsKLQkJc3dpdGNoIChwcm9wZXJ0eSkgewotCQljYXNlIE5BTUU6IHsKLQkJCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBwYXJ0LmdldE5hbWUoKTsKLQkJCXBhcnQuc2V0TmFtZSgiU29tZSBuZXcgbmFtZSIpOwotCQkJcHJvY2Vzc0V2ZW50cygpOwotCQkJcGFydC5zZXROYW1lKG9yaWdpbmFsTmFtZSk7Ci0JCQlwcm9jZXNzRXZlbnRzKCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFRJVExFOiB7Ci0JCQlTdHJpbmcgb3JpZ2luYWxUaXRsZSA9IHBhcnQuZ2V0VGl0bGUoKTsKLQkJCXBhcnQuc2V0VGl0bGUoIlNvbWUgbmV3IHRpdGxlIik7Ci0JCQlwcm9jZXNzRXZlbnRzKCk7Ci0JCQlwYXJ0LnNldFRpdGxlKG9yaWdpbmFsVGl0bGUpOwotCQkJcHJvY2Vzc0V2ZW50cygpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBESVJUWTogewotCQkJYm9vbGVhbiBvcmlnaW5hbERpcnR5ID0gcGFydC5pc0RpcnR5KCk7Ci0JCQlwYXJ0LnNldERpcnR5KCFvcmlnaW5hbERpcnR5KTsKLQkJCXByb2Nlc3NFdmVudHMoKTsKLQkJCXBhcnQuc2V0RGlydHkob3JpZ2luYWxEaXJ0eSk7Ci0JCQlwcm9jZXNzRXZlbnRzKCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIERFU0NSSVBUSU9OOiB7Ci0JCQlTdHJpbmcgb3JpZ2luYWxEZXNjcmlwdGlvbiA9IHBhcnQuZ2V0VGl0bGVTdGF0dXMoKTsKLQkJCXBhcnQuc2V0Q29udGVudERlc2NyaXB0aW9uKCJTb21lIG5ldyBkZXNjcmlwdGlvbiIpOwotCQkJcHJvY2Vzc0V2ZW50cygpOwotCQkJcGFydC5zZXRDb250ZW50RGVzY3JpcHRpb24ob3JpZ2luYWxEZXNjcmlwdGlvbik7Ci0JCQlwcm9jZXNzRXZlbnRzKCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFRPT0xUSVA6IHsKLQkJCVN0cmluZyBvcmlnaW5hbFRvb2x0aXAgPSBwYXJ0LmdldFRpdGxlVG9vbFRpcCgpOwotCQkJcGFydC5zZXRUb29sdGlwKCJTb21lIG5ldyB0b29sdGlwIik7Ci0JCQlwcm9jZXNzRXZlbnRzKCk7Ci0JCQlwYXJ0LnNldFRvb2x0aXAob3JpZ2luYWxUb29sdGlwKTsKLQkJCXByb2Nlc3NFdmVudHMoKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgSU1BR0U6IHsKLQkJCUltYWdlIG9yaWdpbmFsSW1hZ2UgPSBwYXJ0LmdldFRpdGxlSW1hZ2UoKTsKLQotCQkJcGFydC5zZXRJbWFnZShpbWcyKTsKLQkJCXByb2Nlc3NFdmVudHMoKTsKLQkJCXBhcnQuc2V0SW1hZ2Uob3JpZ2luYWxJbWFnZSk7Ci0JCQlwcm9jZXNzRXZlbnRzKCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFRPT0xCQVI6IHsKLQkJCVRvb2xJdGVtIG5ld0l0ZW0gPSBwYXJ0LmFkZFRvVG9vbGJhcihpbWcyKTsKLQotCQkJcHJvY2Vzc0V2ZW50cygpOwotCQkJcGFydC5yZW1vdmVGcm9tVG9vbGJhcihuZXdJdGVtKTsKLQkJCXByb2Nlc3NFdmVudHMoKTsKLQkJCWJyZWFrOwotCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9wcmVzZW50YXRpb25zL1ByZXNlbnRhdGlvblBlcmZvcm1hbmNlVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvcHJlc2VudGF0aW9ucy9QcmVzZW50YXRpb25QZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDdlNTA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9wcmVzZW50YXRpb25zL1ByZXNlbnRhdGlvblBlcmZvcm1hbmNlVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UucHJlc2VudGF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLlByZXNlbnRhdGlvbkZhY3RvcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLmxheW91dC5QcmVzZW50YXRpb25XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLmxheW91dC5SZXNpemVUZXN0OwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFByZXNlbnRhdGlvblBlcmZvcm1hbmNlVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1aXRlLiBUaGlzIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFByZXNlbnRhdGlvblBlcmZvcm1hbmNlVGVzdFN1aXRlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBQcmVzZW50YXRpb25QZXJmb3JtYW5jZVRlc3RTdWl0ZSgpIHsgICAgICAgIAotICAgICAgICBTdHJpbmdbXSBpZHMgPSBnZXRQcmVzZW50YXRpb25JZHMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyaW5nID0gaWRzW2ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGRUZXN0cyhzdHJpbmcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRlc3RzKFN0cmluZyBwcmVzZW50YXRpb25JZCkgewotICAgICAgICBBYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlc2VudGF0aW9uRmFjdG9yeShwcmVzZW50YXRpb25JZCk7Ci0KLSAgICAgICAgYWRkVGVzdChuZXcgUHJlc2VudGF0aW9uSW5hY3RpdmVQYXJ0UHJvcGVydHlUZXN0KGZhY3RvcnksIFByZXNlbnRhdGlvbkZhY3RvcnlVdGlsLlJPTEVfRURJVE9SLCA1KSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFByZXNlbnRhdGlvbkluYWN0aXZlUGFydFByb3BlcnR5VGVzdChmYWN0b3J5LCBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX1ZJRVcsIDUpKTsKLSAgICAgICAgCi0gICAgICAgIGFkZFRlc3QobmV3IFByZXNlbnRhdGlvbkFjdGl2ZVBhcnRQcm9wZXJ0eVRlc3QoZmFjdG9yeSwgUHJlc2VudGF0aW9uRmFjdG9yeVV0aWwuUk9MRV9FRElUT1IsIDUpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgUHJlc2VudGF0aW9uQWN0aXZlUGFydFByb3BlcnR5VGVzdChmYWN0b3J5LCBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX1ZJRVcsIDUpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgUHJlc2VudGF0aW9uQWN0aXZlUGFydFByb3BlcnR5VGVzdChmYWN0b3J5LCBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX1NUQU5EQUxPTkUsIDEpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgUHJlc2VudGF0aW9uQWN0aXZlUGFydFByb3BlcnR5VGVzdChmYWN0b3J5LCBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX1NUQU5EQUxPTkVfTk9USVRMRSwgMSkpOwotCi0gICAgICAgIGFkZFRlc3QobmV3IFByZXNlbnRhdGlvbkNyZWF0ZVRlc3QoZmFjdG9yeSwgUHJlc2VudGF0aW9uRmFjdG9yeVV0aWwuUk9MRV9FRElUT1IsIDEwMCwgImxhcmdlIGZvbGRlciBjcmVhdGlvbiIpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgUHJlc2VudGF0aW9uQ3JlYXRlVGVzdChmYWN0b3J5LCBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX1ZJRVcsIDEwMCwgImxhcmdlIGZvbGRlciBjcmVhdGlvbiIpKTsKLSAgICAgICAgCi0gICAgICAgIGFkZFRlc3QobmV3IFByZXNlbnRhdGlvbkNyZWF0ZVRlc3QoZmFjdG9yeSwgUHJlc2VudGF0aW9uRmFjdG9yeVV0aWwuUk9MRV9FRElUT1IsIDUpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgUHJlc2VudGF0aW9uQ3JlYXRlVGVzdChmYWN0b3J5LCBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX1ZJRVcsIDUpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgUHJlc2VudGF0aW9uQ3JlYXRlVGVzdChmYWN0b3J5LCBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX1NUQU5EQUxPTkUsIDEpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgUHJlc2VudGF0aW9uQ3JlYXRlVGVzdChmYWN0b3J5LCBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX1NUQU5EQUxPTkVfTk9USVRMRSwgMSkpOwotICAgICAgICAKLSAgICAgICAgYWRkVGVzdChuZXcgUHJlc2VudGF0aW9uU2VsZWN0VGVzdChmYWN0b3J5LCBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX0VESVRPUiwgMTAwKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFByZXNlbnRhdGlvblNlbGVjdFRlc3QoZmFjdG9yeSwgUHJlc2VudGF0aW9uRmFjdG9yeVV0aWwuUk9MRV9WSUVXLCAxMDApKTsKLSAgICAgICAgCi0gICAgICAgIGFkZFRlc3QobmV3IFByZXNlbnRhdGlvbkFjdGl2YXRlVGVzdChmYWN0b3J5LCBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX0VESVRPUiwgNSkpOwotICAgICAgICBhZGRUZXN0KG5ldyBQcmVzZW50YXRpb25BY3RpdmF0ZVRlc3QoZmFjdG9yeSwgUHJlc2VudGF0aW9uRmFjdG9yeVV0aWwuUk9MRV9WSUVXLCA1KSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFByZXNlbnRhdGlvbkFjdGl2YXRlVGVzdChmYWN0b3J5LCBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX1NUQU5EQUxPTkUsIDEpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgUHJlc2VudGF0aW9uQWN0aXZhdGVUZXN0KGZhY3RvcnksIFByZXNlbnRhdGlvbkZhY3RvcnlVdGlsLlJPTEVfU1RBTkRBTE9ORV9OT1RJVExFLCAxKSk7Ci0gICAgICAgIAotICAgICAgICBhZGRUZXN0KG5ldyBSZXNpemVUZXN0KG5ldyBQcmVzZW50YXRpb25XaWRnZXRGYWN0b3J5KGZhY3RvcnksIFByZXNlbnRhdGlvbkZhY3RvcnlVdGlsLlJPTEVfRURJVE9SLCA1KSkpOwotICAgICAgICBhZGRUZXN0KG5ldyBSZXNpemVUZXN0KG5ldyBQcmVzZW50YXRpb25XaWRnZXRGYWN0b3J5KGZhY3RvcnksIFByZXNlbnRhdGlvbkZhY3RvcnlVdGlsLlJPTEVfVklFVywgNSkpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgUmVzaXplVGVzdChuZXcgUHJlc2VudGF0aW9uV2lkZ2V0RmFjdG9yeShmYWN0b3J5LCBQcmVzZW50YXRpb25GYWN0b3J5VXRpbC5ST0xFX1NUQU5EQUxPTkUsIDEpKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFJlc2l6ZVRlc3QobmV3IFByZXNlbnRhdGlvbldpZGdldEZhY3RvcnkoZmFjdG9yeSwgUHJlc2VudGF0aW9uRmFjdG9yeVV0aWwuUk9MRV9TVEFOREFMT05FX05PVElUTEUsIDEpKSk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRQcmVzZW50YXRpb25JZHMoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0SWRzKElXb3JrYmVuY2hDb25zdGFudHMuUExfUFJFU0VOVEFUSU9OX0ZBQ1RPUklFUywKLSAgICAgICAgICAgICAgICAiZmFjdG9yeSIpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBsaXN0SWRzKFN0cmluZyBleHRlbnNpb25Qb2ludElkLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLSAgICAgICAgCi0gICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKQotICAgICAgICAgICAgICAgIC5nZXRFeHRlbnNpb25Qb2ludChXb3JrYmVuY2hQbHVnaW4uUElfV09SS0JFTkNILCBleHRlbnNpb25Qb2ludElkKTsKLSAgICAgICAgaWYgKGV4dGVuc2lvblBvaW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIFdvcmtiZW5jaFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAubG9nKCJVbmFibGUgdG8gZmluZCBleHRlbnNpb24uIEV4dGVuc2lvbiBwb2ludDogIiArIGV4dGVuc2lvblBvaW50SWQgKyAiIG5vdCBmb3VuZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIGNvbmZpZyBlbGVtZW50cy4KLSAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHRhcmdldEVsZW1lbnQgPSBudWxsOwotICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvblBvaW50Ci0gICAgICAgICAgICAgICAgLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2pdOwotICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lID09IG51bGwgfHwgZWxlbWVudE5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdHJJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaWYgKHN0cklEICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChzdHJJRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKLSAgICB9ICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvUHJlc2VudGF0aW9uU2VsZWN0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvUHJlc2VudGF0aW9uU2VsZWN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDU3ZDgzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9wcmVzZW50YXRpb25zL1ByZXNlbnRhdGlvblNlbGVjdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5wcmVzZW50YXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5BYnN0cmFjdFByZXNlbnRhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5JUHJlc2VudGFibGVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlRlc3RSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5sYXlvdXQuUHJlc2VudGF0aW9uV2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFByZXNlbnRhdGlvblNlbGVjdFRlc3QgZXh0ZW5kcyBQcmVzZW50YXRpb25QZXJmb3JtYW5jZVRlc3QgewotICAgIAotICAgIHByaXZhdGUgaW50IHR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyOwotICAgIHByaXZhdGUgQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5IGZhY3Rvcnk7Ci0gICAgCi0gICAgcHVibGljIFByZXNlbnRhdGlvblNlbGVjdFRlc3QoQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5IGZhY3RvcnksIGludCB0eXBlLCBpbnQgbnVtYmVyKSB7Ci0gICAgICAgIHN1cGVyKFByZXNlbnRhdGlvbldpZGdldEZhY3RvcnkuZGVzY3JpYmVQcmVzZW50YXRpb24oZmFjdG9yeSwgdHlwZSkgKyAiIHNlbGVjdGlvbiBjaGFuZ2UiKTsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWwgUHJlc2VudGF0aW9uVGVzdGJlZCB0ZXN0YmVkID0gY3JlYXRlUHJlc2VudGF0aW9uKGZhY3RvcnksIHR5cGUsIG51bWJlcik7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUHJlc2VudGFibGVQYXJ0W10gcGFydHMgPSB0ZXN0YmVkLmdldFBhcnRMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBleGVyY2lzZShuZXcgVGVzdFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3RhcnRNZWFzdXJpbmcoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIElQcmVzZW50YWJsZVBhcnQgcGFydCA9IHBhcnRzW2ldOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdGVzdGJlZC5zZXRTZWxlY3Rpb24ocGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFdmVudHMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3RvcE1lYXN1cmluZygpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBjb21taXRNZWFzdXJlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvUHJlc2VudGF0aW9uVGVzdGJlZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvUHJlc2VudGF0aW9uVGVzdGJlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmNmMDY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9wcmVzZW50YXRpb25zL1ByZXNlbnRhdGlvblRlc3RiZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UucHJlc2VudGF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaXplUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuRGVmYXVsdFN0YWNrUHJlc2VudGF0aW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcmVzZW50YXRpb25zLlByZXNlbnRhdGlvbkZhY3RvcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuQWJzdHJhY3RQcmVzZW50YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVByZXNlbnRhYmxlUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklTdGFja1ByZXNlbnRhdGlvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5TdGFja1ByZXNlbnRhdGlvbjsKLQotcHVibGljIGNsYXNzIFByZXNlbnRhdGlvblRlc3RiZWQgewotICAgIAotICAgIHByaXZhdGUgU3RhY2tQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uOwotICAgIHByaXZhdGUgTGlzdCBwYXJ0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIElQcmVzZW50YWJsZVBhcnQgc2VsZWN0ZWRQYXJ0OwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gICAgCi0gICAgcHJpdmF0ZSBEZWZhdWx0U3RhY2tQcmVzZW50YXRpb25TaXRlIHNpdGUgPSBuZXcgRGVmYXVsdFN0YWNrUHJlc2VudGF0aW9uU2l0ZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoSVByZXNlbnRhYmxlUGFydFtdIHRvQ2xvc2UpIHt9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoTGF5b3V0KCkge30KLSAgICAgICAgcHVibGljIElQcmVzZW50YWJsZVBhcnRbXSBnZXRQYXJ0TGlzdCgpIHsKLSAgICAgICAgICAgIHJldHVybiAoSVByZXNlbnRhYmxlUGFydFtdKSBwYXJ0TGlzdC50b0FycmF5KG5ldyBJUHJlc2VudGFibGVQYXJ0W3BhcnRMaXN0LnNpemUoKV0pOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBJUHJlc2VudGFibGVQYXJ0IGdldFNlbGVjdGVkUGFydCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFBhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQYXJ0TW92ZWFibGUoSVByZXNlbnRhYmxlUGFydCB0b01vdmUpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3RhY2tNb3ZlYWJsZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfTsKLSAgICAKLSAgICBwdWJsaWMgUHJlc2VudGF0aW9uVGVzdGJlZChDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlLCBBYnN0cmFjdFByZXNlbnRhdGlvbkZhY3RvcnkgZmFjdG9yeSwgaW50IHR5cGUpIHsKLSAgICAgICAgcHJlc2VudGF0aW9uID0gUHJlc2VudGF0aW9uRmFjdG9yeVV0aWwuY3JlYXRlUHJlc2VudGF0aW9uKGZhY3RvcnksIHR5cGUsIHBhcmVudENvbXBvc2l0ZSwgc2l0ZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHNpdGUuc2V0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbik7Ci0gICAgICAgIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudENvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBjb250cm9sLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUHJlc2VudGF0aW9uQm91bmRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVByZXNlbnRhdGlvbkJvdW5kcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNpdGUuZGlzcG9zZSgpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBjb250cm9sLnNldExheW91dChuZXcgTGF5b3V0KCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGhIaW50ID0gd0hpbnQgPT0gU1dULkRFRkFVTFQgPyBJU2l6ZVByb3ZpZGVyLklORklOSVRFIDogd0hpbnQ7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodEhpbnQgPSBoSGludCA9PSBTV1QuREVGQVVMVCA/IElTaXplUHJvdmlkZXIuSU5GSU5JVEUgOiBoSGludDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSAyMDA7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IDIwMDsKLSAgICAgICAgICAgICAgICBTdGFja1ByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24gPSBzaXRlLmdldFByZXNlbnRhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHByZXNlbnRhdGlvbi5jb21wdXRlUHJlZmVycmVkU2l6ZSh0cnVlLCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsIHdpZHRoSGludCk7Ci0gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IHByZXNlbnRhdGlvbi5jb21wdXRlUHJlZmVycmVkU2l6ZShmYWxzZSwgaGVpZ2h0SGludCwgd2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHdpZHRoID09IElTaXplUHJvdmlkZXIuSU5GSU5JVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAyMDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGhlaWdodCA9PSBJU2l6ZVByb3ZpZGVyLklORklOSVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDIwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgc2l0ZS5zZXRBY3RpdmUoU3RhY2tQcmVzZW50YXRpb24uQVNfQUNUSVZFX0ZPQ1VTKTsKLSAgICAgICAgc2l0ZS5zZXRTdGF0ZShJU3RhY2tQcmVzZW50YXRpb25TaXRlLlNUQVRFX1JFU1RPUkVEKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2w7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZChJUHJlc2VudGFibGVQYXJ0IHBhcnQpIHsKLSAgICAgICAgcGFydExpc3QuYWRkKHBhcnQpOwotICAgICAgICBzaXRlLmdldFByZXNlbnRhdGlvbigpLmFkZFBhcnQocGFydCwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShJUHJlc2VudGFibGVQYXJ0IHBhcnQpIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocGFydCAhPSBzZWxlY3RlZFBhcnQpOwotICAgICAgICBwYXJ0TGlzdC5yZW1vdmUocGFydCk7Ci0gICAgICAgIHNpdGUuZ2V0UHJlc2VudGF0aW9uKCkucmVtb3ZlUGFydChwYXJ0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElQcmVzZW50YWJsZVBhcnQgbmV3U2VsZWN0aW9uKSB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHBhcnRMaXN0LmNvbnRhaW5zKG5ld1NlbGVjdGlvbikpOwotICAgICAgICAKLSAgICAgICAgc2VsZWN0ZWRQYXJ0ID0gbmV3U2VsZWN0aW9uOwotICAgICAgICBpZiAoc2VsZWN0ZWRQYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNpdGUuc2VsZWN0UGFydChuZXdTZWxlY3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlKGludCBuZXdTdGF0ZSkgewotICAgICAgICBzaXRlLnNldFByZXNlbnRhdGlvblN0YXRlKG5ld1N0YXRlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlKGludCBhY3RpdmVTdGF0ZSkgewotICAgICAgICBzaXRlLnNldEFjdGl2ZShhY3RpdmVTdGF0ZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQ29udHJvbCBnZXRQcmVzZW50YXRpb25Db250cm9sKCkgewotICAgICAgICBTdGFja1ByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24gPSBzaXRlLmdldFByZXNlbnRhdGlvbigpOwotICAgICAgICBpZiAocHJlc2VudGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDb250cm9sIGN0cmwgPSBwcmVzZW50YXRpb24uZ2V0Q29udHJvbCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjdHJsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByZXNlbnRhYmxlUGFydFtdIGdldFBhcnRMaXN0KCkgewotICAgICAgICByZXR1cm4gKElQcmVzZW50YWJsZVBhcnRbXSkgcGFydExpc3QudG9BcnJheShuZXcgSVByZXNlbnRhYmxlUGFydFtwYXJ0TGlzdC5zaXplKCldKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByZXNlbnRhdGlvbkJvdW5kcygpIHsKLSAgICAgICAgU3RhY2tQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uID0gc2l0ZS5nZXRQcmVzZW50YXRpb24oKTsKLSAgICAgICAgaWYgKHByZXNlbnRhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcmVzZW50YXRpb24uc2V0Qm91bmRzKGNvbnRyb2wuZ2V0Qm91bmRzKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJlc2VudGFibGVQYXJ0IGdldFNlbGVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkUGFydDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvcHJlc2VudGF0aW9ucy9TdGFuZGFsb25lVmlld1BlcnNwZWN0aXZlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvcHJlc2VudGF0aW9ucy9TdGFuZGFsb25lVmlld1BlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYmRlNzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvU3RhbmRhbG9uZVZpZXdQZXJzcGVjdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLnByZXNlbnRhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFN0YW5kYWxvbmVWaWV3UGVyc3BlY3RpdmUgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3RvcnkjY3JlYXRlSW5pdGlhbExheW91dChvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotICAgICAgICAvLyBPbmUgc3RhbmRhbG9uZSB2aWV3IChib29rbWFya3MpIHdpdGggdHJpbQotICAgICAgICBsYXlvdXQuYWRkU3RhbmRhbG9uZVZpZXcoSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTLCB0cnVlLCAKLSAgICAgICAgICAgICAgICBJUGFnZUxheW91dC5MRUZULCAwLjVmLCBJUGFnZUxheW91dC5JRF9FRElUT1JfQVJFQSk7Ci0gICAgICAgIAotICAgICAgICAvLyBPbmUgc3RhbmRhbG9uZSB2aWV3IChwcm9ibGVtcykgd2l0aG91dCB0cmltCi0gICAgICAgIGxheW91dC5hZGRTdGFuZGFsb25lVmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcsIGZhbHNlLCAKLSAgICAgICAgICAgICAgICBJUGFnZUxheW91dC5SSUdIVCwgMC41ZiwgSVBhZ2VMYXlvdXQuSURfRURJVE9SX0FSRUEpOwotICAgICAgICAKLSAgICAgICAgLy8gT25lIHJlZ3VsYXIgdmlldyAob3V0bGluZSkKLSAgICAgICAgbGF5b3V0LmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfT1VUTElORSwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAwLjVmLCBJUGFnZUxheW91dC5JRF9FRElUT1JfQVJFQSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvU3RhbmRhbG9uZVZpZXdQZXJzcGVjdGl2ZTIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS9wcmVzZW50YXRpb25zL1N0YW5kYWxvbmVWaWV3UGVyc3BlY3RpdmUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2Y5ZTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvU3RhbmRhbG9uZVZpZXdQZXJzcGVjdGl2ZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5wcmVzZW50YXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFuZGFsb25lVmlld1BlcnNwZWN0aXZlMiBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSNjcmVhdGVJbml0aWFsTGF5b3V0KG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0gICAgICAgIC8vIE9uZSBzdGFuZGFsb25lIHZpZXcgKGJvb2ttYXJrcykgd2l0aG91dCB0cmltCi0gICAgICAgIGxheW91dC5hZGRTdGFuZGFsb25lVmlldyhJUGFnZUxheW91dC5JRF9CT09LTUFSS1MsIGZhbHNlLCAKLSAgICAgICAgICAgICAgICBJUGFnZUxheW91dC5MRUZULCAwLjVmLCBJUGFnZUxheW91dC5JRF9FRElUT1JfQVJFQSk7Ci0gICAgICAgIAotICAgICAgICAvLyBPbmUgc3RhbmRhbG9uZSB2aWV3IChwcm9ibGVtcykgd2l0aG91dCB0cmltCi0gICAgICAgIGxheW91dC5hZGRTdGFuZGFsb25lVmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcsIGZhbHNlLCAKLSAgICAgICAgICAgICAgICBJUGFnZUxheW91dC5SSUdIVCwgMC41ZiwgSVBhZ2VMYXlvdXQuSURfRURJVE9SX0FSRUEpOwotICAgICAgICAKLSAgICAgICAgLy8gT25lIHJlZ3VsYXIgdmlldyAob3V0bGluZSkKLSAgICAgICAgbGF5b3V0LmFkZFN0YW5kYWxvbmVWaWV3KElQYWdlTGF5b3V0LklEX09VVExJTkUsIGZhbHNlLCBJUGFnZUxheW91dC5CT1RUT00sIDAuNWYsIElQYWdlTGF5b3V0LklEX0VESVRPUl9BUkVBKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvcHJlc2VudGF0aW9ucy9UZXN0UHJlc2VudGFibGVQYXJ0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcGVyZm9ybWFuY2UvcHJlc2VudGF0aW9ucy9UZXN0UHJlc2VudGFibGVQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjI1NjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3ByZXNlbnRhdGlvbnMvVGVzdFByZXNlbnRhYmxlUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5wcmVzZW50YXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklQYXJ0TWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLklQcmVzZW50YWJsZVBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UHJlc2VudGFibGVQYXJ0IGltcGxlbWVudHMgSVByZXNlbnRhYmxlUGFydCB7Ci0KLSAgICBwcml2YXRlIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIHByaXZhdGUgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3RhdHVzID0gIiI7Ci0gICAgcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLSAgICBwcml2YXRlIFN0cmluZyB0b29sdGlwID0gIiI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRpcnR5OwotICAgIHByaXZhdGUgVG9vbEJhciB0b29sYmFyOwotICAgIAotICAgIHB1YmxpYyBUZXN0UHJlc2VudGFibGVQYXJ0KENvbXBvc2l0ZSBwYXJlbnQsIEltYWdlIGltYWdlKSB7Ci0gICAgICAgIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBjb250cm9sLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBkaXNwb3NlZCgpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgc29tZSBpdGVtcyB0byB0aGUgdG9vbGJhcgotICAgICAgICB0b29sYmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuV1JBUCk7Ci0gICAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IDY7IGlkeCsrKSB7Ci0gICAgICAgICAgICBUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTsKLSAgICB9Ci0gICAgCi0gICAgLy8gU2V0IG1ldGhvZHMgY2FsbGVkIGZyb20gcHJlc2VudGF0aW9uIChhbGwgaWdub3JlZCkKLSAgICBwdWJsaWMgdm9pZCBzZXRCb3VuZHMoUmVjdGFuZ2xlIGJvdW5kcykgewotICAgICAgICBjb250cm9sLnNldEJvdW5kcyhib3VuZHMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0gICAgICAgIGNvbnRyb2wuc2V0VmlzaWJsZShpc1Zpc2libGUpOwotICAgICAgICB0b29sYmFyLnNldFZpc2libGUoaXNWaXNpYmxlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIGNvbnRyb2wuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUxpc3RlbmVyKElQcm9wZXJ0eUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgcHJvcGVydHlJZCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgKChJUHJvcGVydHlMaXN0ZW5lcikgbGlzdGVuZXJzLmdldChpKSkucHJvcGVydHlDaGFuZ2VkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SWQpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRpdGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGVTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldFRpdGxlSW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBpbWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlVG9vbFRpcCgpIHsKLSAgICAgICAgcmV0dXJuIHRvb2x0aXA7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIGRpcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQnVzeSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VhYmxlKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udHJvbCBnZXRUb29sQmFyKCkgewotICAgICAgICByZXR1cm4gdG9vbGJhcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhcnRNZW51IGdldE1lbnUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0gICAgICAgIHJldHVybiBjb250cm9sOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2VkKCkgewotICAgICAgICB0b29sYmFyLmRpc3Bvc2UoKTsKLSAgICAgICAgdG9vbGJhciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShJUHJlc2VudGFibGVQYXJ0LlBST1BfVElUTEUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShJUHJlc2VudGFibGVQYXJ0LlBST1BfUEFSVF9OQU1FKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgbmV3SW1hZ2UpIHsKLSAgICAgICAgdGhpcy5pbWFnZSA9IG5ld0ltYWdlOwotICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoSVByZXNlbnRhYmxlUGFydC5QUk9QX1RJVExFKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcikgewotICAgICAgICB0aGlzLnN0YXR1cyA9IGRlc2NyOwotICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoSVByZXNlbnRhYmxlUGFydC5QUk9QX0NPTlRFTlRfREVTQ1JJUFRJT04pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUb29sdGlwKFN0cmluZyB0b29sdGlwKSB7Ci0gICAgICAgIHRoaXMudG9vbHRpcCA9IHRvb2x0aXA7Ci0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShJUHJlc2VudGFibGVQYXJ0LlBST1BfVElUTEUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXREaXJ0eShib29sZWFuIGRpcnR5KSB7Ci0gICAgICAgIHRoaXMuZGlydHkgPSBkaXJ0eTsKLSAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKElQcmVzZW50YWJsZVBhcnQuUFJPUF9ESVJUWSk7Ci0gICAgfQotCi0gICAgcHVibGljIFRvb2xJdGVtIGFkZFRvVG9vbGJhcihJbWFnZSB0b0FkZCkgewotICAgICAgICBUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLSAgICAgICAgaXRlbS5zZXRJbWFnZSh0b0FkZCk7Ci0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShJUHJlc2VudGFibGVQYXJ0LlBST1BfVE9PTEJBUik7Ci0gICAgICAgIHJldHVybiBpdGVtOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVGcm9tVG9vbGJhcihUb29sSXRlbSB0b1JlbW92ZSkgewotICAgICAgICB0b1JlbW92ZS5kaXNwb3NlKCk7Ci0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShJUHJlc2VudGFibGVQYXJ0LlBST1BfVE9PTEJBUik7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3RfaWRlYXMudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3RfaWRlYXMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmY4ZmU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0X2lkZWFzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS0gU3RhcnR1cCB0aW1lL21lbW9yeSB1c2UKLS0gQWJvdXQKLSAgICAtIG9wZW4gYWJvdXQgdGhlbiBvcGVuIGNvbmZpZ3VyYXRpb24gZGV0YWlscyB0aGVuIGNsb3NlCi0tIFdvcmtiZW5jaCBbcmVzaXplIFdvcmtiZW5jaCBTaGVsbF0gW3N3aXRjaCBhY3RpdmUgcGFydCBsZWFrIGNoZWNrXSBbc3RyZXNzIHRlc3Qgc3dpdGNoIGFjdGl2ZSBwYXJ0IHBlcmYuXVtwb3B1cCBtZW51IG9wZW5dCi0gICAgLSB3aXRoIGEgc2V0IG9mIGVtcHR5IHZpZXdzIGFuZCBlZGl0b3JzIGluIHN0YW5kYXJkIGxheW91dAotICAgIC0gd2l0aCBhbiBlZGl0b3Igd2l0aCBhIG1lbnUgZW50cnkvYSB0b29sYmFyIGVudHJ5IGFuZCBhIHZpZXcgd2l0aCBhIHNpbXBsZSBtZW51IGFuZCB0b29sYmFyCi0tIEVkaXRvciBbb3Blbi9jbG9zZV0gW3pvb20vdW56b29tXSBbc3BsaXQvdW5zcGxpdF0gW3N0cmVzcyB0ZXN0IG9wZW4gMTAwIHcvbyBjbG9zZV0gW2Nsb3NlIDEwMCBlZGl0b3JzXSBbbWluaW1pemUvbWF6aW1pemVdCi0JLSBlbXB0eQotCS0gZWRpdG9yIHdpdGgga2V5L2NvbnRleHQgc3VwcG9ydAotCS0gbXVsdGktcGFnZSBlZGl0b3IKLQktIGVkaXRvciB0aGF0IHByb3ZpZGVzIGEgY29udGVudCBvdXRsaW5lCi0JLSBlZGl0b3IgdGhhdCBwcm92aWRlcyBhIHByb3BlcnR5IHNoZWV0Ci0JLSBlZGl0b3IgdGhhdCBjb250cmlidXRlcyBoZWF2aWx5IHRvIG1lbnVzCi0JLSBlZGl0b3IgdGhhdCBjb250cmlidXRlcyBoZWF2aWx5IHRvIHRvb2xiYXJzCi0JLSBjaGFuZ2UgaWNvbi90aXRsZSBmcmVxdWVudGx5Ci0JLSB3aXRoIGxvdHMgb2YgcG9wdXAgbWVudSBjb250cmlidXRpb25zCi0tIFZpZXcgW29wZW4vY2xvc2VdIFt6b29tL3Vuem9vbV0gW2RldGFjaGVkL3JlLWF0dGFjaF0gW21ha2UgZmFzdHZpZXcvcmVzdG9yZV0gW21pbmltaXplL21hemltaXplXSBbcG9wdXAgbWVudSBvcGVuXQotCS0gZW1wdHkKLQktIHZpZXcgd2l0aCBsb2NhbCB0b29sYmFyCi0JLSB3aXRoIHdpdGggdmlldyBtZW51Ci0JLSB0YWJsZSB2aWV3ZXIgKFRhYmxlVmlldykKLQktIHZpZXcgdGhhdCBpbmRpY2F0ZXMgcHJvZ3Jlc3Mgd2hlbiBpbiBmb3Jncm91bmQgYW5kIGJhY2tncm91bmQKLQktIHZpZXcgd2l0aCBjb250ZW50IG1lc3NhZ2UgKHNlZSBQcm9ibGVtcyB2aWV3KQotCS0gY2hhbmdlIGljb24vdGl0bGUgZnJlcXVlbnRseQotICAgIC0gd2l0aCBsb3RzIG9mIHBvcHVwIG1lbnUgY29udHJpYnV0aW9ucwotLSBJbnRybyBbY2xvc2Uvb3Blbl0gW3N0YW5kYnkvbm9uLXN0YW5kYnldCi0gICAgLSBiYXNpYyBpbnRybwkJCi0tIFBlcnNwZWN0aXZlIFtvcGVuL2Nsb3NlXSBbc3RyZXNzIHRlc3Qgb3BlbiAxMCB3L28gY2xvc2VdIFtvcGVuIGluIG5ldyB3aW5kb3ddIFtzd2l0Y2ggcGVzcGVjdGl2ZV0KLQktIGVtcHR5Ci0JLSBjb21wbGV4IGxheW91dAotLSBUaGVtZXMgW3N3aXRjaGluZyB0aGVtZV0KLQktIHR3byB0aGVtZXMgdGhhdCBzdXBwb3J0IHRoZSBkZWZhdWx0IHdvcmtiZW5jaCBwcmVzZW50YXRpb24gaXRlbXMKLQotLQlTaHV0ZG93bgotLQlBY3Rpb24gRmFjdG9yeSAoYnJpbmdzIGluIGFsbCBjbGFzc2VzKQotLQlMZWFrIHRlc3RzCi0tCVNlbGVjdGlvbiBsaXN0ZW5lcnMKLS0JRGVjb3JhdG9ycwotLQlHREkgcmVzb3VyY2VzCi0tCVRocmVhZCBjb3VudAotLQlPdmVyaGVhZCBvZiBwcm9ncmVzcyBzdXBwb3J0L3Byb2dyZXNzIG1vbml0b3IvdmlldwotLQlMYXlvdXQKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNzg2MDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW50ZXN0cyIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIi8+Ci0KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIKLSAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0L2xpYnJhcnkueG1sIi8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotCTwhLS1kZWZhdWx0IHRhcmdldCB0aGF0IGRvZXMgbm90aGluZy4gIFRoZSBwZXJmb3JtYW5jZSB0YXJnZXQgaXMgY2FsbGVkIGV4cGxpY2l0bHkKLQlieSBidWlsZCB0ZWFtLi0tPgotICA8dGFyZ2V0IG5hbWU9InJ1bnRlc3RzIi8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHBlcmZvcm1hbmNlIHRlc3Qgc3VpdGVzLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZSIgZGVwZW5kcz0iaW5pdCxwZXJmb3JtYW5jZS1zdWl0ZSxqZmFjZS1wZXJmb3JtYW5jZS1zdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZS1zdWl0ZSI+Ci0gIAk8cHJvcGVydHkgbmFtZT0icGVyZm9ybWFuY2Utd29ya3NwYWNlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BlcmZvcm1hbmNlLXdvcmtzcGFjZS1wbGF0Zm9ybS11aSIvPgotICAgIDxkZWxldGUgZGlyPSIke3BlcmZvcm1hbmNlLXdvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0gIAk8YW50IHRhcmdldD0idWktdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3BlcmZvcm1hbmNlLXdvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UudWkudGVzdHMucGVyZm9ybWFuY2UuVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iamZhY2UtcGVyZm9ybWFuY2Utc3VpdGUiPgotCSAgCTxwcm9wZXJ0eSBuYW1lPSJwZXJmb3JtYW5jZS13b3Jrc3BhY2UtamZhY2UiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGVyZm9ybWFuY2Utd29ya3NwYWNlLXBsYXRmb3JtLWpmYWNlIi8+Ci0JICAgIDxkZWxldGUgZGlyPSIke3BlcmZvcm1hbmNlLXdvcmtzcGFjZS1qZmFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0JICAJPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7cGVyZm9ybWFuY2Utd29ya3NwYWNlLWpmYWNlfSIvPgotCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0JICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnBlcmZvcm1hbmNlLkpGYWNlUGVyZm9ybWFuY2VTdWl0ZSIvPgotCSAgICA8L2FudD4KLQkgIDwvdGFyZ2V0PgotCQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4NDQ3NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iRWNsaXBzZSBSQ1AgVGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjhmZjAyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5qdW5pdDwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZWM3MmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNGcmkgTWF5IDA2IDEyOjA3OjExIEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYzM4OGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUdWUgT2N0IDE4IDE1OjE2OjI2IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmphdmFkb2M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGdldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyY29tbWVudCIgbmFtZVw9ImdldHRlcmNvbW1lbnQiPi8qKlxuICogQHJldHVybiBSZXR1cm5zIHRoZSAke2JhcmVfZmllbGRfbmFtZX0uXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyY29tbWVudCIgbmFtZVw9InNldHRlcmNvbW1lbnQiPi8qKlxuICogQHBhcmFtICR7cGFyYW19IFRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0LlxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yY29tbWVudCIgbmFtZVw9ImNvbnN0cnVjdG9yY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpbGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCI+LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIENvcHlyaWdodCAoYykgJHt5ZWFyfSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcbiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHBcOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuICpcbiAqIENvbnRyaWJ1dG9yc1w6XG4gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9ImZhbHNlIiBjb250ZXh0XD0idHlwZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgdHlwZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMudHlwZWNvbW1lbnQiIG5hbWVcPSJ0eXBlY29tbWVudCI+LyoqXG4gKiBAc2luY2UgMy4yXG4gKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWVsZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGZpZWxkcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWVsZGNvbW1lbnQiIG5hbWVcPSJmaWVsZGNvbW1lbnQiPi8qKlxuICogXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG5vbi1vdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJvdmVycmlkZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5vdmVycmlkZWNvbW1lbnQiIG5hbWVcPSJvdmVycmlkZWNvbW1lbnQiPi8qIChub24tSmF2YWRvYylcbiAqICR7c2VlX3RvX292ZXJyaWRkZW59XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im5ld3R5cGVfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubmV3dHlwZSIgbmFtZVw9Im5ld3R5cGUiPiR7ZmlsZWNvbW1lbnR9XG4ke3BhY2thZ2VfZGVjbGFyYXRpb259XG5cbiR7dHlwZWNvbW1lbnR9XG4ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgbWV0aG9kIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5Ij4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2xhc3Nib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjbGFzcyB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jbGFzc2JvZHkiIG5hbWVcPSJjbGFzc2JvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJpbnRlcmZhY2Vib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBpbnRlcmZhY2UgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuaW50ZXJmYWNlYm9keSIgbmFtZVw9ImludGVyZmFjZWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJlbnVtYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgZW51bSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5lbnVtYm9keSIgbmFtZVw9ImVudW1ib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iYW5ub3RhdGlvbmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGFubm90YXRpb24gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuYW5ub3RhdGlvbmJvZHkiIG5hbWVcPSJhbm5vdGF0aW9uYm9keSI+XG48L3RlbXBsYXRlPjwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9BY3Rpb25CYXJDb25maWd1cmVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9BY3Rpb25CYXJDb25maWd1cmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzA2ZWIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvQWN0aW9uQmFyQ29uZmlndXJlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3A7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC51dGlsLldvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcjsKLQotcHVibGljIGNsYXNzIEFjdGlvbkJhckNvbmZpZ3VyZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIEFjdGlvbkJhckNvbmZpZ3VyZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgRGlzcGxheSBkaXNwbGF5ID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChkaXNwbGF5KTsKLSAgICAgICAgZGlzcGxheSA9IFBsYXRmb3JtVUkuY3JlYXRlRGlzcGxheSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BsYXkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGlzcGxheSk7Ci0gICAgICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotICAgICAgICBhc3NlcnRUcnVlKGRpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB7Ci0gICAgICAgIFdvcmtiZW5jaEFkdmlzb3Igd2EgPSBuZXcgV29ya2JlbmNoQWR2aXNvck9ic2VydmVyKDEpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgIElBY3Rpb25CYXJDb25maWd1cmVyIGFjdGlvbkJhckNvbmZpZywgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuZmlsbEFjdGlvbkJhcnMod2luZG93LCBhY3Rpb25CYXJDb25maWcsIGZsYWdzKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYWN0aW9uQmFyQ29uZmlnLmdldE1lbnVNYW5hZ2VyKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYWN0aW9uQmFyQ29uZmlnLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYWN0aW9uQmFyQ29uZmlnLmdldENvb2xCYXJNYW5hZ2VyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGludCBjb2RlID0gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwgd2EpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGxhdGZvcm1VSS5SRVRVUk5fT0ssIGNvZGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvSVdvcmtiZW5jaFBhZ2VUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL0lXb3JrYmVuY2hQYWdlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGNlNzViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvSVdvcmtiZW5jaFBhZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucmNwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AudXRpbC5FbXB0eVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLnV0aWwuV29ya2JlbmNoQWR2aXNvck9ic2VydmVyOwotCi0vKioKLSAqIFRlc3RzIHRoZSBiZWhhdmlvdXIgb2YgdmFyaW91cyBJV29ya2JlbmNoUGFnZSBtZXRob2RzIHVuZGVyIGRpZmZlcmVudAotICogd29ya2JlbmNoIGNvbmZpZ3VyYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgSVdvcmtiZW5jaFBhZ2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIElXb3JrYmVuY2hQYWdlVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheSA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIGFzc2VydE51bGwoZGlzcGxheSk7Ci0gICAgICAgIGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwbGF5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BsYXkpOwotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdyZXNzaW9uIHRlc3QgZm9yIEJ1ZyA3MDA4MCBbUkNQXSBSZXNldCBQZXJzcGVjdGl2ZSBkb2VzIG5vdCB3b3JrIGlmIG5vCi0gICAgICogcGVyc3BlY3RpdmUgdG9vbGJhciBzaG93biAoUkNQKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NzAwODAoKSB7Ci0gICAgICAgIFdvcmtiZW5jaEFkdmlzb3Igd2EgPSBuZXcgV29ya2JlbmNoQWR2aXNvck9ic2VydmVyKDEpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJlV2luZG93T3BlbihJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucHJlV2luZG93T3Blbihjb25maWd1cmVyKTsKLSAgICAgICAgICAgICAgICBjb25maWd1cmVyLnNldFNob3dQZXJzcGVjdGl2ZUJhcihmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RTdGFydHVwKCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0V29ya2JlbmNoQ29uZmlndXJlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcGFnZS5zaG93VmlldyhFbXB0eVZpZXcuSUQpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhZ2UuZmluZFZpZXcoRW1wdHlWaWV3LklEKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhZ2UucmVzZXRQZXJzcGVjdGl2ZSgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKHBhZ2UuZmluZFZpZXcoRW1wdHlWaWV3LklEKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBpbnQgY29kZSA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksIHdhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBsYXRmb3JtVUkuUkVUVVJOX09LLCBjb2RlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvUGxhdGZvcm1VSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvUGxhdGZvcm1VSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2NDI4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL1BsYXRmb3JtVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucmNwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLnV0aWwuV29ya2JlbmNoQWR2aXNvck9ic2VydmVyOwotCi1wdWJsaWMgY2xhc3MgUGxhdGZvcm1VSVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgUGxhdGZvcm1VSVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKiogTWFrZSBzdXJlIHdvcmtiZW5jaCBpcyBub3QgcmV0dXJuZWQgYmVmb3JlIGl0IGlzIHJ1bm5pbmcuICovCi0gICAgcHVibGljIHZvaWQgdGVzdEVhcmx5R2V0V29ya2JlbmNoKCkgewotICAgICAgICBhc3NlcnRGYWxzZShQbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEaXNwbGF5KCkgewotICAgICAgICBEaXNwbGF5IGRpc3AgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZGlzcC5pc0Rpc3Bvc2VkKCkpOwotICAgICAgICBkaXNwLmRpc3Bvc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwLmlzRGlzcG9zZWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZFJ1bldvcmtiZW5jaCgpIHsKLSAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5jcmVhdGVEaXNwbGF5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGlzcGxheSk7Ci0KLSAgICAgICAgQ2hlY2tGb3JXb3JrYmVuY2ggd2EgPSBuZXcgQ2hlY2tGb3JXb3JrYmVuY2goMik7Ci0KLSAgICAgICAgaW50IGNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQbGF0Zm9ybVVJLlJFVFVSTl9PSywgY29kZSk7Ci0gICAgICAgIGFzc2VydFRydWUod2EuY2hlY2tDb21wbGV0ZSk7Ci0gICAgICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotICAgICAgICBhc3NlcnRUcnVlKGRpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCwgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyBvbiBzdGFydHVwLCB0aGUgd29ya2JlbmNoIHJldHVybnMgUkVUVVJOX1VOU1RBUlRBQkxFIAotICAgICAqIGFuZCBQbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpIHJldHVybnMgZmFsc2UuIAotICAgICAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDgyMjg2LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRSdW5Xb3JrYmVuY2hXaXRoRXhjZXB0aW9uT25TdGFydHVwKCkgewotICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwbGF5KTsKLQotICAgICAgICBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIgd2EgPSBuZXcgV29ya2JlbmNoQWR2aXNvck9ic2VydmVyKDEpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZVN0YXJ0dXAoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhyb3duIGRlbGliZXJhdGVseSBieSBQbGF0Zm9ybVVJVGVzdCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGludCBjb2RlID0gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwgd2EpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGxhdGZvcm1VSS5SRVRVUk5fVU5TVEFSVEFCTEUsIGNvZGUpOwotICAgICAgICBhc3NlcnRGYWxzZShQbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpKTsKLSAgICAgICAgZGlzcGxheS5kaXNwb3NlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotICAgIH0KLX0KLQotY2xhc3MgQ2hlY2tGb3JXb3JrYmVuY2ggZXh0ZW5kcyBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIgewotCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tDb21wbGV0ZSA9IGZhbHNlOwotCi0gICAgcHVibGljIENoZWNrRm9yV29ya2JlbmNoKGludCBpZGxlQmVmb3JlRXhpdCkgewotICAgICAgICBzdXBlcihpZGxlQmVmb3JlRXhpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXZlbnRMb29wSWRsZShEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAgICAgc3VwZXIuZXZlbnRMb29wSWRsZShkaXNwbGF5KTsKLQotICAgICAgICBpZiAoY2hlY2tDb21wbGV0ZSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpKTsKLSAgICAgICAgY2hlY2tDb21wbGV0ZSA9IHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9SY3BUZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvUmNwVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjNkZjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9SY3BUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3A7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRoZSB0ZXN0IHN1aXRlIGZvciB0aGUgUkNQIEFQSXMgaW4gdGhlIGdlbmVyaWMgd29ya2JlbmNoLgotICogVG8gcnVuLCB1c2UgYSBoZWFkbGVzcyBKVW5pdCBQbHVnLWluIFRlc3QgbGF1bmNoZXIsIGNvbmZpZ3VyZWQKLSAqIHRvIGhhdmUgW05vIEFwcGxpY2F0aW9uXSBhcyBpdHMgYXBwbGljYXRpb24uIAotICovCi1wdWJsaWMgY2xhc3MgUmNwVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIC8qKiBSZXR1cm5zIHRoZSBzdWl0ZS4gVGhpcyBpcyByZXF1aXJlZCB0byB1c2UgdGhlIEpVbml0IExhdW5jaGVyLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSY3BUZXN0U3VpdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmNwVGVzdFN1aXRlKCkgewotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoUGxhdGZvcm1VSVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFdvcmtiZW5jaEFkdmlzb3JUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShXb3JrYmVuY2hDb25maWd1cmVyVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoV29ya2JlbmNoV2luZG93Q29uZmlndXJlclRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKEFjdGlvbkJhckNvbmZpZ3VyZXJUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJV29ya2JlbmNoUGFnZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFdvcmtiZW5jaFNhdmVSZXN0b3JlU3RhdGVUZXN0LmNsYXNzKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9Xb3JrYmVuY2hBZHZpc29yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9Xb3JrYmVuY2hBZHZpc29yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2I3NGFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvV29ya2JlbmNoQWR2aXNvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucmNwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb2dyZXNzLlByb2dyZXNzTWFuYWdlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLnV0aWwuV29ya2JlbmNoQWR2aXNvck9ic2VydmVyOwotCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoQWR2aXNvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAgIHB1YmxpYyBXb3JrYmVuY2hBZHZpc29yVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheSA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIGFzc2VydE51bGwoZGlzcGxheSk7Ci0gICAgICAgIGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwbGF5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BsYXkpOwotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd29ya2JlbmNoIHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSBhbnkgb2YgdGhlIGFkdmlzb3IncyBsaWZlIGN5Y2xlCi0gICAgICogbWV0aG9kcyBhcmUgY2FsbGVkLiAjaW5pdGlhbGl6ZSBpcyB0aGUgZmlyc3Qgb25lIGNhbGxlZCwgc28gY2hlY2sgdGhhdAotICAgICAqIHRoZSB3b3JrYmVuY2ggaGFzIGJlZW4gYmVlbiBjcmVhdGVkIGJ5IHRoZW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEVhcmx5R2V0V29ya2JlbmNoKCkgewotICAgICAgICBXb3JrYmVuY2hBZHZpc29yIHdhID0gbmV3IFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcigxKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVdvcmtiZW5jaENvbmZpZ3VyZXIgY29uZmlndXJlcikgewotICAgICAgICAgICAgICAgIHN1cGVyLmluaXRpYWxpemUoY29uZmlndXJlcik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgY29kZSA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksIHdhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBsYXRmb3JtVUkuUkVUVVJOX09LLCBjb2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvRGlzcGxheXMoKSB7Ci0gICAgICAgIFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlciB3YSA9IG5ldyBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIoMSk7Ci0KLSAgICAgICAgaW50IGNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQbGF0Zm9ybVVJLlJFVFVSTl9PSywgY29kZSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGRpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLSAgICAgICAgZGlzcGxheS5kaXNwb3NlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotCi0gICAgICAgIGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwbGF5KTsKLQotICAgICAgICBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIgd2EyID0gbmV3IFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcigxKTsKLQotICAgICAgICBpbnQgY29kZTIgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YTIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGxhdGZvcm1VSS5SRVRVUk5fT0ssIGNvZGUyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpdmlhbE9wZW5DbG9zZSgpIHsKLSAgICAgICAgV29ya2JlbmNoQWR2aXNvck9ic2VydmVyIHdhID0gbmV3IFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcigxKSB7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiB3aW5kb3dPcGVuQ2FsbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiB3aW5kb3dDbG9zZUNhbGxlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKElXb3JrYmVuY2hDb25maWd1cmVyIGMpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5pbml0aWFsaXplKGMpOwotICAgICAgICAgICAgICAgIGMuZ2V0V29ya2JlbmNoKCkuYWRkV2luZG93TGlzdGVuZXIobmV3IElXaW5kb3dMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dBY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd0Nsb3NlQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93T3BlbkNhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJlV2luZG93T3BlbihJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2Uod2luZG93T3BlbkNhbGxlZCk7Ci0gICAgICAgICAgICAgICAgc3VwZXIucHJlV2luZG93T3BlbihjKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdFdpbmRvd09wZW4oSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgYykgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUod2luZG93T3BlbkNhbGxlZCk7Ci0gICAgICAgICAgICAgICAgc3VwZXIucG9zdFdpbmRvd09wZW4oYyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByZVdpbmRvd1NoZWxsQ2xvc2UoSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgYykgewotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKHdpbmRvd0Nsb3NlQ2FsbGVkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucHJlV2luZG93U2hlbGxDbG9zZShjKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdFdpbmRvd0Nsb3NlKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGMpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmFsc2UpIC8vIHdoaWNoIHNob3VsZCBiZSBjYWxsZWQgZmlyc3Q/Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUod2luZG93Q2xvc2VDYWxsZWQpOwotICAgICAgICAgICAgICAgIHN1cGVyLnBvc3RXaW5kb3dDbG9zZShjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgY29kZSA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksIHdhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBsYXRmb3JtVUkuUkVUVVJOX09LLCBjb2RlKTsKLQotICAgICAgICB3YS5yZXNldE9wZXJhdGlvbkl0ZXJhdG9yKCk7Ci0gICAgICAgIHdhLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLklOSVRJQUxJWkUpOwotICAgICAgICB3YS5hc3NlcnROZXh0T3BlcmF0aW9uKFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlci5QUkVfU1RBUlRVUCk7Ci0gICAgICAgIHdhLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLlBSRV9XSU5ET1dfT1BFTik7Ci0gICAgICAgIHdhLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLkZJTExfQUNUSU9OX0JBUlMpOwotICAgICAgICB3YS5hc3NlcnROZXh0T3BlcmF0aW9uKFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlci5QT1NUX1dJTkRPV19PUEVOKTsKLSAgICAgICAgd2EuYXNzZXJ0TmV4dE9wZXJhdGlvbihXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIuUE9TVF9TVEFSVFVQKTsKLSAgICAgICAgd2EuYXNzZXJ0TmV4dE9wZXJhdGlvbihXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIuUFJFX1NIVVRET1dOKTsKLSAgICAgICAgd2EuYXNzZXJ0TmV4dE9wZXJhdGlvbihXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIuUE9TVF9TSFVURE9XTik7Ci0gICAgICAgIHdhLmFzc2VydEFsbE9wZXJhdGlvbnNFeGFtaW5lZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUcml2aWFsUmVzdG9yZUNsb3NlKCkgewotICAgICAgICBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIgd2EgPSBuZXcgV29ya2JlbmNoQWR2aXNvck9ic2VydmVyKDEpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJV29ya2JlbmNoQ29uZmlndXJlciBjKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZShjKTsKLSAgICAgICAgICAgICAgICBjLnNldFNhdmVBbmRSZXN0b3JlKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBldmVudExvb3BJZGxlKERpc3BsYXkgZCkgewotICAgICAgICAgICAgICAgIHdvcmtiZW5jaENvbmZpZy5nZXRXb3JrYmVuY2goKS5yZXN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQbGF0Zm9ybVVJLlJFVFVSTl9SRVNUQVJULCBjb2RlKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0KLSAgICAgICAgZGlzcGxheSA9IFBsYXRmb3JtVUkuY3JlYXRlRGlzcGxheSgpOwotICAgICAgICBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIgd2EyID0gbmV3IFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcigxKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVdvcmtiZW5jaENvbmZpZ3VyZXIgYykgewotICAgICAgICAgICAgICAgIHN1cGVyLmluaXRpYWxpemUoYyk7Ci0gICAgICAgICAgICAgICAgYy5zZXRTYXZlQW5kUmVzdG9yZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgY29kZTIgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YTIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGxhdGZvcm1VSS5SRVRVUk5fT0ssIGNvZGUyKTsKLQotICAgICAgICB3YTIucmVzZXRPcGVyYXRpb25JdGVyYXRvcigpOwotICAgICAgICB3YTIuYXNzZXJ0TmV4dE9wZXJhdGlvbihXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIuSU5JVElBTElaRSk7Ci0gICAgICAgIHdhMi5hc3NlcnROZXh0T3BlcmF0aW9uKFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlci5QUkVfU1RBUlRVUCk7Ci0gICAgICAgIHdhMi5hc3NlcnROZXh0T3BlcmF0aW9uKFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlci5QUkVfV0lORE9XX09QRU4pOwotICAgICAgICB3YTIuYXNzZXJ0TmV4dE9wZXJhdGlvbihXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIuRklMTF9BQ1RJT05fQkFSUyk7Ci0gICAgICAgIHdhMi5hc3NlcnROZXh0T3BlcmF0aW9uKFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlci5QT1NUX1dJTkRPV19SRVNUT1JFKTsKLSAgICAgICAgd2EyLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLlBPU1RfV0lORE9XX09QRU4pOwotICAgICAgICB3YTIuYXNzZXJ0TmV4dE9wZXJhdGlvbihXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIuUE9TVF9TVEFSVFVQKTsKLSAgICAgICAgd2EyLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLlBSRV9TSFVURE9XTik7Ci0gICAgICAgIHdhMi5hc3NlcnROZXh0T3BlcmF0aW9uKFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlci5QT1NUX1NIVVRET1dOKTsKLSAgICAgICAgd2EyLmFzc2VydEFsbE9wZXJhdGlvbnNFeGFtaW5lZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBXb3JrYmVuY2hBZHZpc29yIGNvbW1lbnQgZm9yICNwb3N0U3RhcnR1cCBzYXlzIGl0IGlzIG9rIHRvIGNsb3NlCi0gICAgICogdGhpbmdzIGZyb20gaW4gdGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlRnJvbVBvc3RTdGFydHVwKCkgewotCi0gICAgICAgIFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlciB3YSA9IG5ldyBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIoMSkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdFN0YXJ0dXAoKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucG9zdFN0YXJ0dXAoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuY2xvc2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQbGF0Zm9ybVVJLlJFVFVSTl9PSywgY29kZSk7Ci0KLSAgICAgICAgd2EucmVzZXRPcGVyYXRpb25JdGVyYXRvcigpOwotICAgICAgICB3YS5hc3NlcnROZXh0T3BlcmF0aW9uKFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlci5JTklUSUFMSVpFKTsKLSAgICAgICAgd2EuYXNzZXJ0TmV4dE9wZXJhdGlvbihXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIuUFJFX1NUQVJUVVApOwotICAgICAgICB3YS5hc3NlcnROZXh0T3BlcmF0aW9uKFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlci5QUkVfV0lORE9XX09QRU4pOwotICAgICAgICB3YS5hc3NlcnROZXh0T3BlcmF0aW9uKFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlci5GSUxMX0FDVElPTl9CQVJTKTsKLSAgICAgICAgd2EuYXNzZXJ0TmV4dE9wZXJhdGlvbihXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIuUE9TVF9XSU5ET1dfT1BFTik7Ci0gICAgICAgIHdhLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLlBPU1RfU1RBUlRVUCk7Ci0gICAgICAgIHdhLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLlBSRV9TSFVURE9XTik7Ci0gICAgICAgIHdhLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLlBPU1RfU0hVVERPV04pOwotICAgICAgICB3YS5hc3NlcnRBbGxPcGVyYXRpb25zRXhhbWluZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRMb29wQ3Jhc2goKSB7Ci0gICAgICAgIFdvcmtiZW5jaEFkdmlzb3JFeGNlcHRpb25PYnNlcnZlciB3YSA9IG5ldyBXb3JrYmVuY2hBZHZpc29yRXhjZXB0aW9uT2JzZXJ2ZXIoKTsKLQotICAgICAgICBpbnQgY29kZSA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksIHdhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBsYXRmb3JtVUkuUkVUVVJOX09LLCBjb2RlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh3YS5leGNlcHRpb25DYXVnaHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxsQWxsQWN0aW9uQmFyKCkgewotICAgICAgICBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIgd2EgPSBuZXcgV29ya2JlbmNoQWR2aXNvck9ic2VydmVyKDEpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgIElBY3Rpb25CYXJDb25maWd1cmVyIGNvbmZpZ3VyZXIsIGludCBmbGFncykgewotICAgICAgICAgICAgICAgIHN1cGVyLmZpbGxBY3Rpb25CYXJzKHdpbmRvdywgY29uZmlndXJlciwgZmxhZ3MpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZJTExfQ09PTF9CQVIsIGZsYWdzICYgRklMTF9DT09MX0JBUik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZJTExfTUVOVV9CQVIsIGZsYWdzICYgRklMTF9NRU5VX0JBUik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZJTExfU1RBVFVTX0xJTkUsIGZsYWdzICYgRklMTF9TVEFUVVNfTElORSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGZsYWdzICYgRklMTF9QUk9YWSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQbGF0Zm9ybVVJLlJFVFVSTl9PSywgY29kZSk7Ci0gICAgfQotCQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVByb2dyZXNzUmVnaW9uKCkgewotICAgICAgICBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIgd2EgPSBuZXcgV29ya2JlbmNoQWR2aXNvck9ic2VydmVyKDEpIHsKLQkJCXB1YmxpYyB2b2lkIHByZVdpbmRvd09wZW4oSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCQkJCXN1cGVyLnByZVdpbmRvd09wZW4oY29uZmlndXJlcik7Ci0JCQkJY29uZmlndXJlci5zZXRTaG93UHJvZ3Jlc3NJbmRpY2F0b3IoZmFsc2UpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwb3N0V2luZG93T3BlbihJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJUHJvZ3Jlc3NNYW5hZ2VyVXRpbC5hbmltYXRlVXAobmV3IFJlY3RhbmdsZSgwLCAwLCAxMDAsIDUwKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHdlIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCQlhc3NlcnRUcnVlKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJCi0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQbGF0Zm9ybVVJLlJFVFVSTl9PSywgY29kZSk7Ci0gICAgfQotCi0vLyAgdGVzdFNoZWxsQ2xvc2UoKSBpcyBjb21tZW50ZWQgb3V0IGJlY2F1c2UgaXQgd2FzIGZhaWxpbmcgd2l0aCB0aGUgc2hlbGxzIGhhdmluZyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQuCi0vLyAgICAgIEl0J3MgdW5jbGVhciB3aGF0IHRoaXMgd2FzIHJlYWxseSB0cnlpbmcgdG8gdGVzdCBhbnl3YXkuCi0vLyAgICAKLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RTaGVsbENsb3NlKCkgewotLy8gICAgICAgIFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlciB3YSA9IG5ldyBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIoKSB7Ci0vLwotLy8gICAgICAgICAgICBwdWJsaWMgdm9pZCBldmVudExvb3BJZGxlKERpc3BsYXkgZGlzcCkgewotLy8gICAgICAgICAgICAgICAgc3VwZXIuZXZlbnRMb29wSWRsZShkaXNwKTsKLS8vCi0vLyAgICAgICAgICAgICAgICBTaGVsbFtdIHNoZWxscyA9IGRpc3AuZ2V0U2hlbGxzKCk7Ci0vLyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNoZWxscy5sZW5ndGg7ICsraSkKLS8vICAgICAgICAgICAgICAgICAgICBpZiAoc2hlbGxzW2ldICE9IG51bGwpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsc1tpXS5jbG9zZSgpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfTsKLS8vCi0vLyAgICAgICAgaW50IGNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKFBsYXRmb3JtVUkuUkVUVVJOX09LLCBjb2RlKTsKLS8vCi0vLyAgICAgICAgd2EucmVzZXRPcGVyYXRpb25JdGVyYXRvcigpOwotLy8gICAgICAgIHdhLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLklOSVRJQUxJWkUpOwotLy8gICAgICAgIHdhLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLlBSRV9TVEFSVFVQKTsKLS8vICAgICAgICB3YS5hc3NlcnROZXh0T3BlcmF0aW9uKFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlci5QUkVfV0lORE9XX09QRU4pOwotLy8gICAgICAgIHdhLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLkZJTExfQUNUSU9OX0JBUlMpOwotLy8gICAgICAgIHdhLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLlBPU1RfV0lORE9XX09QRU4pOwotLy8gICAgICAgIHdhLmFzc2VydE5leHRPcGVyYXRpb24oV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLlBPU1RfU1RBUlRVUCk7Ci0vLyAgICAgICAgd2EuYXNzZXJ0TmV4dE9wZXJhdGlvbihXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIuUFJFX1dJTkRPV19TSEVMTF9DTE9TRSk7Ci0vLyAgICAgICAgd2EuYXNzZXJ0TmV4dE9wZXJhdGlvbihXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIuUFJFX1NIVVRET1dOKTsKLS8vICAgICAgICB3YS5hc3NlcnROZXh0T3BlcmF0aW9uKFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlci5QT1NUX1NIVVRET1dOKTsKLS8vICAgICAgICB3YS5hc3NlcnRBbGxPcGVyYXRpb25zRXhhbWluZWQoKTsKLS8vICAgIH0KLX0KLQotY2xhc3MgV29ya2JlbmNoQWR2aXNvckV4Y2VwdGlvbk9ic2VydmVyIGV4dGVuZHMgV29ya2JlbmNoQWR2aXNvck9ic2VydmVyIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGV4Y2VwdGlvbkNhdWdodCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBSdW50aW1lRXhjZXB0aW9uIHJ1bnRpbWVFeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgV29ya2JlbmNoQWR2aXNvckV4Y2VwdGlvbk9ic2VydmVyKCkgewotICAgICAgICBzdXBlcigyKTsKLSAgICB9Ci0KLSAgICAvLyB0aGlzIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hlbiB0aGUgZXZlbnQgbG9vcCBoYXMgc3RhcnRlZAotICAgIHB1YmxpYyB2b2lkIGV2ZW50TG9vcElkbGUoRGlzcGxheSBkaXNwKSB7Ci0gICAgICAgIHN1cGVyLmV2ZW50TG9vcElkbGUoZGlzcCk7Ci0KLSAgICAgICAgLy8gb25seSBjcmFzaCB0aGUgbG9vcCBvbmUgdGltZQotICAgICAgICBpZiAocnVudGltZUV4Y2VwdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHJ1bnRpbWVFeGNlcHRpb24gPSBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotICAgICAgICB0aHJvdyBydW50aW1lRXhjZXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV2ZW50TG9vcEV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vICoqKiBEb24ndCBsZXQgdGhlIHBhcmVudCBsb2cgdGhlIGV4Y2VwdGlvbiBzaW5jZSBpdCBtYWtlcyBmb3IKLSAgICAgICAgLy8gY29uZnVzaW5nCi0gICAgICAgIC8vICAgICB0ZXN0IHJlc3VsdHMuCi0KLSAgICAgICAgZXhjZXB0aW9uQ2F1Z2h0ID0gdHJ1ZTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhydW50aW1lRXhjZXB0aW9uLCBleGNlcHRpb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvV29ya2JlbmNoQ29uZmlndXJlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvV29ya2JlbmNoQ29uZmlndXJlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlODVmYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL1dvcmtiZW5jaENvbmZpZ3VyZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AudXRpbC5Xb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hDb25maWd1cmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBXb3JrYmVuY2hDb25maWd1cmVyVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheSA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIGFzc2VydE51bGwoZGlzcGxheSk7Ci0gICAgICAgIGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwbGF5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BsYXkpOwotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB7Ci0gICAgICAgIFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlciB3YSA9IG5ldyBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIoMSkgewotCi0gICAgICAgICAgICBwcml2YXRlIElXb3JrYmVuY2hDb25maWd1cmVyIGNvbmZpZ3VyZXI7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVdvcmtiZW5jaENvbmZpZ3VyZXIgYykgewotICAgICAgICAgICAgICAgIHN1cGVyLmluaXRpYWxpemUoYyk7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJlciA9IGM7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGMuZ2V0V29ya2JlbmNoKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGMuZ2V0U2F2ZUFuZFJlc3RvcmUoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjLmdldFdvcmtiZW5jaFdpbmRvd01hbmFnZXIoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RTaHV0ZG93bigpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5wb3N0U2h1dGRvd24oKTsKLQotICAgICAgICAgICAgICAgIC8vICoqKiBUaGlzIHNob3VsZCBiZSBjaGVja2VkIG9uIGFsbCBvZiB0aGUgYWR2aXNvciBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAvLyAgICAgYnV0IGFzc3VtZSB0aGF0IGlmIGl0cyBzdGlsbCBzZXQgaW4gdGhlIGxhc3Qgb25lLCB0aGVuIGl0Ci0gICAgICAgICAgICAgICAgLy8gICAgIG11c3QgaGF2ZSBiZWVuIHNldCBmb3IgYWxsIG9mIHRoZW0uCi0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlndXJlci5lbWVyZ2VuY3lDbG9zaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGludCBjb2RlID0gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwgd2EpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGxhdGZvcm1VSS5SRVRVUk5fT0ssIGNvZGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWVyZ2VuY3lDbG9zZSgpIHsKLSAgICAgICAgV29ya2JlbmNoQWR2aXNvck9ic2VydmVyIHdhID0gbmV3IFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcigyKSB7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgSVdvcmtiZW5jaENvbmZpZ3VyZXIgY29uZmlndXJlcjsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJV29ya2JlbmNoQ29uZmlndXJlciBjKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZShjKTsKLSAgICAgICAgICAgICAgICBjb25maWd1cmVyID0gYzsKLQotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYy5nZXRXb3JrYmVuY2goKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYy5nZXRTYXZlQW5kUmVzdG9yZSgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGMuZ2V0V29ya2JlbmNoV2luZG93TWFuYWdlcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZW1lcmdlbmN5Q2xvc2UgYXMgc29vbiBhcyBwb3NzaWJsZQotICAgICAgICAgICAgcHVibGljIHZvaWQgZXZlbnRMb29wSWRsZShEaXNwbGF5IGRpc3ApIHsKLSAgICAgICAgICAgICAgICBzdXBlci5ldmVudExvb3BJZGxlKGRpc3ApOwotICAgICAgICAgICAgICAgIGNvbmZpZ3VyZXIuZW1lcmdlbmN5Q2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdFNodXRkb3duKCkgewotICAgICAgICAgICAgICAgIHN1cGVyLnBvc3RTaHV0ZG93bigpOwotCi0gICAgICAgICAgICAgICAgLy8gKioqIFRoaXMgc2hvdWxkIGJlIGNoZWNrZWQgb24gYWxsIG9mIHRoZSBhZHZpc29yIGNhbGxiYWNrcwotICAgICAgICAgICAgICAgIC8vICAgICBidXQgYXNzdW1lIHRoYXQgaWYgaXRzIHN0aWxsIHNldCBpbiB0aGUgbGFzdCBvbmUsIHRoZW4gaXQKLSAgICAgICAgICAgICAgICAvLyAgICAgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciBhbGwgb2YgdGhlbS4KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZ3VyZXIuZW1lcmdlbmN5Q2xvc2luZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgY29kZSA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksIHdhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBsYXRmb3JtVUkuUkVUVVJOX0VNRVJHRU5DWV9DTE9TRSwgY29kZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9Xb3JrYmVuY2hTYXZlUmVzdG9yZVN0YXRlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9Xb3JrYmVuY2hTYXZlUmVzdG9yZVN0YXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTI0ZTI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvV29ya2JlbmNoU2F2ZVJlc3RvcmVTdGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucmNwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5YTUxNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLkFjdGlvbkJhckFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSUFjdGlvbkJhckNvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaENvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AudXRpbC5Xb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hTYXZlUmVzdG9yZVN0YXRlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURWSVNPUl9TVEFURV9LRVkgPSAiYWR2aXNvclN0YXRlS2V5IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XX0FEVklTT1JfU1RBVEVfS0VZID0gIndpbmRvd0Fkdmlzb3JTdGF0ZUtleSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTkJBUl9BRFZJU09SX1NUQVRFX0tFWSA9ICJhY3Rpb25CYXJBZHZpc29yU3RhdGVLZXkiOwotCQotICAgIHB1YmxpYyBXb3JrYmVuY2hTYXZlUmVzdG9yZVN0YXRlVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheSA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIGFzc2VydE51bGwoZGlzcGxheSk7Ci0JCWRpc3BsYXkgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwbGF5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BsYXkpOwotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBUZXN0IHNhdmUvcmVzdG9yZSBzdGF0ZSBsaWZlY3ljbGUgQVBJIGZvciBXb3JrYmVuY2hBZHZpc29yCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNhdmVSZXN0b3JlQWR2aXNvclN0YXRlKCkgewkJCi0JCWZpbmFsIFN0cmluZyBhZHZpc29yU3RhdGVEYXRhID0gTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQotCQkvLyBsYXVuY2ggd29ya2JlbmNoIGFuZCBzYXZlIHNvbWUgc3RhdGUgZGF0YQotICAgICAgICBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIgd2EgPSBuZXcgV29ya2JlbmNoQWR2aXNvck9ic2VydmVyKDEpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gbnVsbDsKLQotCQkJcHVibGljIElTdGF0dXMgc2F2ZVN0YXRlIChJTWVtZW50byBtZW1lbnRvKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbChtZW1lbnRvKTsKLQkJCQltZW1lbnRvLnB1dFN0cmluZyhBRFZJU09SX1NUQVRFX0tFWSwgYWR2aXNvclN0YXRlRGF0YSk7Ci0JCQkJcmV0dXJuIHN1cGVyLnNhdmVTdGF0ZShtZW1lbnRvKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJV29ya2JlbmNoQ29uZmlndXJlciBjKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZShjKTsKLSAgICAgICAgICAgICAgICBjLnNldFNhdmVBbmRSZXN0b3JlKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBldmVudExvb3BJZGxlKERpc3BsYXkgZCkgewotICAgICAgICAgICAgICAgIHdvcmtiZW5jaENvbmZpZy5nZXRXb3JrYmVuY2goKS5yZXN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQbGF0Zm9ybVVJLlJFVFVSTl9SRVNUQVJULCBjb2RlKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0KLQkJLy8gcmVzdG9yZSB0aGUgd29ya2JlbmNoIGFuZCBjaGVjayBmb3Igc3RhdGUgZGF0YQotICAgICAgICBkaXNwbGF5ID0gUGxhdGZvcm1VSS5jcmVhdGVEaXNwbGF5KCk7CQkKLQkJV29ya2JlbmNoQWR2aXNvck9ic2VydmVyIHdhMiA9IG5ldyBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIoMSkgewotCi0JCQlwdWJsaWMgSVN0YXR1cyByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkJCWFzc2VydE5vdE51bGwobWVtZW50byk7Ci0JCQkJU3RyaW5nIHN0YXRlRGF0YSA9IG1lbWVudG8uZ2V0U3RyaW5nKEFEVklTT1JfU1RBVEVfS0VZKTsKLQkJCQlhc3NlcnROb3ROdWxsKHN0YXRlRGF0YSk7Ci0JCQkJYXNzZXJ0VHJ1ZShhZHZpc29yU3RhdGVEYXRhLmVxdWFscyhzdGF0ZURhdGEpKTsKLQkJCQlyZXR1cm4gc3VwZXIucmVzdG9yZVN0YXRlKG1lbWVudG8pOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElXb3JrYmVuY2hDb25maWd1cmVyIGMpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5pbml0aWFsaXplKGMpOwotICAgICAgICAgICAgICAgIGMuc2V0U2F2ZUFuZFJlc3RvcmUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGNvZGUyID0gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwgd2EyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBsYXRmb3JtVUkuUkVUVVJOX09LLCBjb2RlMik7Ci0JfQotCQotCS8qKgotCSAqIFRlc3Qgc2F2ZS9yZXN0b3JlIHN0YXRlIGxpZmVjeWNsZSBBUEkgZm9yIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZVJlc3RvcmVXaW5kb3dTdGF0ZSgpIHsKLQkJZmluYWwgU3RyaW5nIGFkdmlzb3JTdGF0ZURhdGEgPSBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCi0JCS8vIGxhdW5jaCB3b3JrYmVuY2ggYW5kIHNhdmUgc29tZSBzdGF0ZSBkYXRhCi0gICAgICAgIFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlciB3YSA9IG5ldyBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIoMSkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBudWxsOwotCQkJCi0JCQlwdWJsaWMgV29ya2JlbmNoV2luZG93QWR2aXNvciBjcmVhdGVXb3JrYmVuY2hXaW5kb3dBZHZpc29yKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQkJCQlyZXR1cm4gbmV3IFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoY29uZmlndXJlcikgewotCQkJCQlwdWJsaWMgSVN0YXR1cyBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkJCQkJYXNzZXJ0Tm90TnVsbChtZW1lbnRvKTsKLQkJCQkJCW1lbWVudG8ucHV0U3RyaW5nKFdJTkRPV19BRFZJU09SX1NUQVRFX0tFWSwgYWR2aXNvclN0YXRlRGF0YSk7Ci0JCQkJCQlyZXR1cm4gc3VwZXIuc2F2ZVN0YXRlKG1lbWVudG8pOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJV29ya2JlbmNoQ29uZmlndXJlciBjKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZShjKTsKLSAgICAgICAgICAgICAgICBjLnNldFNhdmVBbmRSZXN0b3JlKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBldmVudExvb3BJZGxlKERpc3BsYXkgZCkgewotICAgICAgICAgICAgICAgIHdvcmtiZW5jaENvbmZpZy5nZXRXb3JrYmVuY2goKS5yZXN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQbGF0Zm9ybVVJLlJFVFVSTl9SRVNUQVJULCBjb2RlKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0KLQkJLy8gcmVzdG9yZSB0aGUgd29ya2JlbmNoIGFuZCBjaGVjayBmb3Igc3RhdGUgZGF0YQotICAgICAgICBkaXNwbGF5ID0gUGxhdGZvcm1VSS5jcmVhdGVEaXNwbGF5KCk7CQkKLQkJV29ya2JlbmNoQWR2aXNvck9ic2VydmVyIHdhMiA9IG5ldyBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIoMSkgewotCi0JCQlwdWJsaWMgV29ya2JlbmNoV2luZG93QWR2aXNvciBjcmVhdGVXb3JrYmVuY2hXaW5kb3dBZHZpc29yKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQkJCQlyZXR1cm4gbmV3IFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoY29uZmlndXJlcikgewotCQkJCQlwdWJsaWMgSVN0YXR1cyByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkJCQkJYXNzZXJ0Tm90TnVsbChtZW1lbnRvKTsKLQkJCQkJCVN0cmluZyBzdGF0ZURhdGEgPSBtZW1lbnRvLmdldFN0cmluZyhXSU5ET1dfQURWSVNPUl9TVEFURV9LRVkpOwotCQkJCQkJYXNzZXJ0Tm90TnVsbChzdGF0ZURhdGEpOwotCQkJCQkJYXNzZXJ0VHJ1ZShhZHZpc29yU3RhdGVEYXRhLmVxdWFscyhzdGF0ZURhdGEpKTsKLQkJCQkJCXJldHVybiBzdXBlci5yZXN0b3JlU3RhdGUobWVtZW50byk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElXb3JrYmVuY2hDb25maWd1cmVyIGMpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5pbml0aWFsaXplKGMpOwotICAgICAgICAgICAgICAgIGMuc2V0U2F2ZUFuZFJlc3RvcmUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGNvZGUyID0gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwgd2EyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBsYXRmb3JtVUkuUkVUVVJOX09LLCBjb2RlMik7Ci0JfQotCQotCS8qKgotCSAqIFRlc3Qgc2F2ZS9yZXN0b3JlIHN0YXRlIGxpZmVjeWNsZSBBUEkgZm9yIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZVJlc3RvcmVBY3Rpb25CYXJTdGF0ZSgpIHsKLQkJZmluYWwgU3RyaW5nIGFkdmlzb3JTdGF0ZURhdGEgPSBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCi0JCS8vIGxhdW5jaCB3b3JrYmVuY2ggYW5kIHNhdmUgc29tZSBzdGF0ZSBkYXRhCi0gICAgICAgIFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlciB3YSA9IG5ldyBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIoMSkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBudWxsOwotCQkJCi0JCQlwdWJsaWMgV29ya2JlbmNoV2luZG93QWR2aXNvciBjcmVhdGVXb3JrYmVuY2hXaW5kb3dBZHZpc29yKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQkJCQlyZXR1cm4gbmV3IFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoY29uZmlndXJlcikgewotCQkJCQlwdWJsaWMgQWN0aW9uQmFyQWR2aXNvciBjcmVhdGVBY3Rpb25CYXJBZHZpc29yKElBY3Rpb25CYXJDb25maWd1cmVyIGNvbmZpZ3VyZXIxKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEFjdGlvbkJhckFkdmlzb3IoY29uZmlndXJlcjEpIHsKLQkJCQkJCQlwdWJsaWMgSVN0YXR1cyBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkJCQkJCQlhc3NlcnROb3ROdWxsKG1lbWVudG8pOwotCQkJCQkJCQltZW1lbnRvLnB1dFN0cmluZyhBQ1RJT05CQVJfQURWSVNPUl9TVEFURV9LRVksIGFkdmlzb3JTdGF0ZURhdGEpOwotCQkJCQkJCQlyZXR1cm4gc3VwZXIuc2F2ZVN0YXRlKG1lbWVudG8pOwotCQkJCQkJCX0KLQkJCQkJCX07Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElXb3JrYmVuY2hDb25maWd1cmVyIGMpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5pbml0aWFsaXplKGMpOwotICAgICAgICAgICAgICAgIGMuc2V0U2F2ZUFuZFJlc3RvcmUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV2ZW50TG9vcElkbGUoRGlzcGxheSBkKSB7Ci0gICAgICAgICAgICAgICAgd29ya2JlbmNoQ29uZmlnLmdldFdvcmtiZW5jaCgpLnJlc3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgY29kZSA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksIHdhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBsYXRmb3JtVUkuUkVUVVJOX1JFU1RBUlQsIGNvZGUpOwotICAgICAgICBhc3NlcnRGYWxzZShkaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0gICAgICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotICAgICAgICBhc3NlcnRUcnVlKGRpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLQotCQkvLyByZXN0b3JlIHRoZSB3b3JrYmVuY2ggYW5kIGNoZWNrIGZvciBzdGF0ZSBkYXRhCi0gICAgICAgIGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsJCQotCQlXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIgd2EyID0gbmV3IFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcigxKSB7Ci0KLQkJCXB1YmxpYyBXb3JrYmVuY2hXaW5kb3dBZHZpc29yIGNyZWF0ZVdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCQkJCXJldHVybiBuZXcgV29ya2JlbmNoV2luZG93QWR2aXNvcihjb25maWd1cmVyKSB7Ci0JCQkJCXB1YmxpYyBBY3Rpb25CYXJBZHZpc29yIGNyZWF0ZUFjdGlvbkJhckFkdmlzb3IoSUFjdGlvbkJhckNvbmZpZ3VyZXIgY29uZmlndXJlcjEpIHsKLQkJCQkJCXJldHVybiBuZXcgQWN0aW9uQmFyQWR2aXNvcihjb25maWd1cmVyMSkgewotCQkJCQkJCXB1YmxpYyBJU3RhdHVzIHJlc3RvcmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCQkJCQkJCWFzc2VydE5vdE51bGwobWVtZW50byk7Ci0JCQkJCQkJCVN0cmluZyBzdGF0ZURhdGEgPSBtZW1lbnRvLmdldFN0cmluZyhBQ1RJT05CQVJfQURWSVNPUl9TVEFURV9LRVkpOwotCQkJCQkJCQlhc3NlcnROb3ROdWxsKHN0YXRlRGF0YSk7Ci0JCQkJCQkJCWFzc2VydFRydWUoYWR2aXNvclN0YXRlRGF0YS5lcXVhbHMoc3RhdGVEYXRhKSk7Ci0JCQkJCQkJCXJldHVybiBzdXBlci5yZXN0b3JlU3RhdGUobWVtZW50byk7Ci0JCQkJCQkJfQotCQkJCQkJfTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVdvcmtiZW5jaENvbmZpZ3VyZXIgYykgewotICAgICAgICAgICAgICAgIHN1cGVyLmluaXRpYWxpemUoYyk7Ci0gICAgICAgICAgICAgICAgYy5zZXRTYXZlQW5kUmVzdG9yZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgY29kZTIgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YTIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGxhdGZvcm1VSS5SRVRVUk5fT0ssIGNvZGUyKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBvbi1kZW1hbmQgc2F2ZS9yZXN0b3JlIHN0YXRlIEFQSSAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0T25EZW1hbmRTYXZlUmVzdG9yZVN0YXRlKCkgewotCQkKLQkJLy8gc2F2ZSBzb21lIHdpbmRvdyBzdGF0ZSBvbiBkZW1hbmQKLSAgICAgICAgV29ya2JlbmNoQWR2aXNvck9ic2VydmVyIHdhID0gbmV3IFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcigxKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG51bGw7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVdvcmtiZW5jaENvbmZpZ3VyZXIgYykgewotICAgICAgICAgICAgICAgIHN1cGVyLmluaXRpYWxpemUoYyk7Ci0gICAgICAgICAgICAgICAgYy5zZXRTYXZlQW5kUmVzdG9yZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZXZlbnRMb29wSWRsZShEaXNwbGF5IGQpIHsKLSAgICAgICAgICAgICAgICB3b3JrYmVuY2hDb25maWcuZ2V0V29ya2JlbmNoKCkucmVzdGFydCgpOwotICAgICAgICAgICAgfQotCQkJCi0JCQlwdWJsaWMgV29ya2JlbmNoV2luZG93QWR2aXNvciBjcmVhdGVXb3JrYmVuY2hXaW5kb3dBZHZpc29yKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQkJCQlyZXR1cm4gbmV3IFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoY29uZmlndXJlcikgewotCQkJCQlwdWJsaWMgdm9pZCBwb3N0V2luZG93T3BlbigpIHsKLQkJCQkJCUZpbGUgc3RhdGVMb2NhdGlvbiA9IGdldFN0YXRlRmlsZUxvY2F0aW9uKCk7Ci0JCQkJCQllbnN1cmVEaXJlY3RvcnlFeGlzdHMoc3RhdGVMb2NhdGlvbik7Ci0JCQkJCQlTdHJpbmcgc3RhdGVGaWxlTmFtZSA9IHN0YXRlTG9jYXRpb24uZ2V0UGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyAidGVzdE9uRGVtYW5kU2F2ZVJlc3RvcmVTdGF0ZS54bWwiOwotCQkJCQkJCQotCQkJCQkgICAgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JCQkJICAgICAgICB0cnkgewotCQkJCSAgICAgICAgICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oc3RhdGVGaWxlTmFtZSksIlVURi04Iik7Ci0JCQkJICAgICAgICAgICAgCi0JCQkJICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUxKSB7Ci0JCQkJICAgICAgICAgICAgLy8gbm90IHBvc3NpYmxlLCBVVEYtOCBpcyByZXF1aXJlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBhbGwgSlZNcwotCQkJCSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUxKSB7Ci0JCQkJICAgICAgICAgICAgLy8gY3JlYXRpbmcgYSBuZXcgZmlsZSwgd29uJ3QgaGFwcGVuICB1bmxlc3MgdGhlIHBhdGggZWNsaXBzZSAKLQkJCQkJCQkvLyBzcGVjaWZpZXMgaXMgdG90YWxseSB3cm9uZywgb3IgaXRzIHJlYWQtb25seQotCQkJCSAgICAgICAgfQotCQkJCQkJCQotCQkJCSAgICAgICAgWE1MTWVtZW50byB4bWxtID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoIlRlc3RTdGF0ZSIpOwotCQkJCQkJc2F2ZVN0YXRlKHhtbG0pOwotCQkJCSAgICAgICAgCi0JCQkJICAgICAgICB0cnkgewotCQkJCSAgICAgICAgICAgIHhtbG0uc2F2ZSh3cml0ZXIpOwotCQkJCSAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotCQkJCSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJICAgICAgICB9Ci0JCQkJCX0JCQkJCQotCQkJCX07Ci0JCQl9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQbGF0Zm9ybVVJLlJFVFVSTl9SRVNUQVJULCBjb2RlKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0KLQkJLy8gcmVzdG9yZSB0aGUgd29ya2JlbmNoIGFuZCByZXN0b3JlIGEgd2luZG93IAotCQkvLyB3aXRoIHN0YXRlIGRhdGEgb24gZGVtYW5kCi0gICAgICAgIGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsJCQotCQlXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIgd2EyID0gbmV3IFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcigxKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVdvcmtiZW5jaENvbmZpZ3VyZXIgYykgewotICAgICAgICAgICAgICAgIHN1cGVyLmluaXRpYWxpemUoYyk7Ci0gICAgICAgICAgICAgICAgYy5zZXRTYXZlQW5kUmVzdG9yZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gb3BlbldpbmRvd3MoKSB7Ci0JCQkJRmlsZSBzdGF0ZUxvY2F0aW9uID0gZ2V0U3RhdGVGaWxlTG9jYXRpb24oKTsKLQkJICAgICAgICBTdHJpbmcgc3RhdGVGaWxlTmFtZSA9ICJ0ZXN0T25EZW1hbmRTYXZlUmVzdG9yZVN0YXRlLnhtbCI7Ci0JCSAgICAgICAgRmlsZSBzdGF0ZUZpbGUgPSBuZXcgRmlsZShzdGF0ZUxvY2F0aW9uLmdldFBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgc3RhdGVGaWxlTmFtZSk7Ci0JCSAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZUZpbGUuZXhpc3RzKCkpOwotCSAgICAgICAgICAgIAotCQkJCUlNZW1lbnRvIG1lbWVudG8gPSBudWxsOwotCQkgICAgICAgIHRyeSB7Ci0JCQkJCW1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVJlYWRSb290KCBuZXcgSW5wdXRTdHJlYW1SZWFkZXIgKAotCQkJCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oc3RhdGVGaWxlKSwiVVRGLTgiKSk7Ci0JCSAgICAgICAgfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKLQkJICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkgICAgICAgICAgICAvLyB3b24ndCBoYXBwZW4gYmVjYXVzZSB3ZSBhbHJlYWR5IGNoZWNrZWQgaXQgZXhpc3RzCi0JCSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCSAgICAgICAgICAgLy8gbm90IHBvc3NpYmxlIC0gVVRGOCBpcyByZXF1aXJlZAotCQkgICAgICAgIH0KLQkJCQkKLQkJCQlhc3NlcnROb3ROdWxsKG1lbWVudG8pOwotCQkJCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIHdpbmRvdyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJd2luZG93ID0gZ2V0V29ya2JlbmNoQ29uZmlndXJlcigpLnJlc3RvcmVXb3JrYmVuY2hXaW5kb3cobWVtZW50byk7CQotCQkJCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCWFzc2VydE5vdE51bGwod2luZG93KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcG9zdFdpbmRvd1Jlc3RvcmUoSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCXN1cGVyLnBvc3RXaW5kb3dSZXN0b3JlKGNvbmZpZ3VyZXIpOwotCQkJfQotICAgICAgICB9OwotCi0gICAgICAgIGludCBjb2RlMiA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksIHdhMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQbGF0Zm9ybVVJLlJFVFVSTl9PSywgY29kZTIpOwotCX0KLQkJCQotCXByaXZhdGUgRmlsZSBnZXRTdGF0ZUZpbGVMb2NhdGlvbigpIHsKLQkgICAgSVBhdGggcGF0aCA9IFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JICAgIFN0cmluZ0J1ZmZlciBmaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkgICAgZmlsZU5hbWUuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKLQkgICAgZmlsZU5hbWUuYXBwZW5kKCJUZXN0V29ya2JlbmNoU3RhdGUiKTsKLQkgICAgZmlsZU5hbWUuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKLQkJCi0JICAgIEZpbGUgc3RhdGVMb2NhdGlvbiA9IHBhdGguYXBwZW5kKGZpbGVOYW1lLnRvU3RyaW5nKCkpLnRvRmlsZSgpOwkJCi0JICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0cyhzdGF0ZUxvY2F0aW9uKTsKLQkJCi0JCXJldHVybiBzdGF0ZUxvY2F0aW9uOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW5zdXJlRGlyZWN0b3J5RXhpc3RzKEZpbGUgZGlyZWN0b3J5KSB7Ci0JICAgIGRpcmVjdG9yeS5ta2RpcnMoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL1dvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL1dvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYjgwZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9Xb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3A7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaFdpbmRvd0Fkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC51dGlsLldvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcjsKLQotcHVibGljIGNsYXNzIFdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIFdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgRGlzcGxheSBkaXNwbGF5ID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChkaXNwbGF5KTsKLSAgICAgICAgZGlzcGxheSA9IFBsYXRmb3JtVUkuY3JlYXRlRGlzcGxheSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BsYXkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGlzcGxheSk7Ci0gICAgICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotICAgICAgICBhc3NlcnRUcnVlKGRpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLQotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0cygpIHsKLSAgICAgICAgV29ya2JlbmNoQWR2aXNvciB3YSA9IG5ldyBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIoMSkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJV29ya2JlbmNoV2luZG93IHdpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgSUFjdGlvbkJhckNvbmZpZ3VyZXIgYWN0aW9uQmFyQ29uZmlnLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5maWxsQWN0aW9uQmFycyh3aW5kb3csIGFjdGlvbkJhckNvbmZpZywgZmxhZ3MpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRlbXBUaXRsZSA9ICJ0aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIHdpbmRvd0NvbmZpZyA9IHdvcmtiZW5jaENvbmZpZwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFdpbmRvd0NvbmZpZ3VyZXIod2luZG93KTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdpbmRvd0NvbmZpZyk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMod2luZG93LCB3aW5kb3dDb25maWcuZ2V0V2luZG93KCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh3b3JrYmVuY2hDb25maWcsIHdpbmRvd0NvbmZpZwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtiZW5jaENvbmZpZ3VyZXIoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFjdGlvbkJhckNvbmZpZywgd2luZG93Q29uZmlnCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWN0aW9uQmFyQ29uZmlndXJlcigpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdpbmRvd0NvbmZpZy5nZXRUaXRsZSgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHdpbmRvd0NvbmZpZy5nZXRTaG93Q29vbEJhcigpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHdpbmRvd0NvbmZpZy5nZXRTaG93TWVudUJhcigpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSh3aW5kb3dDb25maWcuZ2V0U2hvd1BlcnNwZWN0aXZlQmFyKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUod2luZG93Q29uZmlnLmdldFNob3dTdGF0dXNMaW5lKCkpOwotCi0gICAgICAgICAgICAgICAgd2luZG93Q29uZmlnLnNldFRpdGxlKHRlbXBUaXRsZSk7Ci0gICAgICAgICAgICAgICAgd2luZG93Q29uZmlnLnNldFNob3dDb29sQmFyKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB3aW5kb3dDb25maWcuc2V0U2hvd01lbnVCYXIoZmFsc2UpOwotICAgICAgICAgICAgICAgIHdpbmRvd0NvbmZpZy5zZXRTaG93UGVyc3BlY3RpdmVCYXIodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgd2luZG93Q29uZmlnLnNldFNob3dTdGF0dXNMaW5lKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVtcFRpdGxlLCB3aW5kb3dDb25maWcuZ2V0VGl0bGUoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2Uod2luZG93Q29uZmlnLmdldFNob3dDb29sQmFyKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKHdpbmRvd0NvbmZpZy5nZXRTaG93TWVudUJhcigpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHdpbmRvd0NvbmZpZy5nZXRTaG93UGVyc3BlY3RpdmVCYXIoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2Uod2luZG93Q29uZmlnLmdldFNob3dTdGF0dXNMaW5lKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gKioqIHRpdGxlIGlzIG9yZ2luYWxseSBudWxsLCBidXQgY2Fubm90IHNldCBpdCBiYWNrIHRvIG51bGwsCi0gICAgICAgICAgICAgICAgLy8gc2hvdWxkIHRoYXQKLSAgICAgICAgICAgICAgICAvLyAgICAgY2hlY2sgYmUgYWxsb3dlZD8KLSAgICAgICAgICAgICAgICB3aW5kb3dDb25maWcuc2V0VGl0bGUoIiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB3aW5kb3dDb25maWcuc2V0U2hvd0Nvb2xCYXIodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgd2luZG93Q29uZmlnLnNldFNob3dNZW51QmFyKHRydWUpOwotICAgICAgICAgICAgICAgIHdpbmRvd0NvbmZpZy5zZXRTaG93UGVyc3BlY3RpdmVCYXIoZmFsc2UpOwotICAgICAgICAgICAgICAgIHdpbmRvd0NvbmZpZy5zZXRTaG93U3RhdHVzTGluZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgY29kZSA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksIHdhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBsYXRmb3JtVUkuUkVUVVJOX09LLCBjb2RlKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0MTA0NTU4KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWRvVGVzdDEwNDU1OCh0cnVlLCB0cnVlKTsKLQkJZG9UZXN0MTA0NTU4KGZhbHNlLCB0cnVlKTsKLQkJZG9UZXN0MTA0NTU4KHRydWUsIGZhbHNlKTsKLQkJZG9UZXN0MTA0NTU4KGZhbHNlLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvVGVzdDEwNDU1OChmaW5hbCBib29sZWFuIHNob3dQZXJzcGVjdGl2ZUJhciwgZmluYWwgYm9vbGVhbiBzaG93Q29vbEJhcikgewotCQlXb3JrYmVuY2hBZHZpc29yIHdhID0gbmV3IFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcigxKSB7Ci0JCQlwdWJsaWMgV29ya2JlbmNoV2luZG93QWR2aXNvciBjcmVhdGVXb3JrYmVuY2hXaW5kb3dBZHZpc29yKAotCQkJCQlJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciB3b3JrYmVuY2hXaW5kb3dDb25maWd1cmVyKSB7Ci0JCQkJcmV0dXJuIG5ldyBXb3JrYmVuY2hXaW5kb3dBZHZpc29yKHdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIpIHsKLQkJCQkJcHVibGljIHZvaWQgcHJlV2luZG93T3BlbigpIHsKLQkJCQkJCXN1cGVyLnByZVdpbmRvd09wZW4oKTsKLQkJCQkJCWdldFdpbmRvd0NvbmZpZ3VyZXIoKS5zZXRTaG93Q29vbEJhcihzaG93Q29vbEJhcik7Ci0JCQkJCQlnZXRXaW5kb3dDb25maWd1cmVyKCkuc2V0U2hvd1BlcnNwZWN0aXZlQmFyKHNob3dQZXJzcGVjdGl2ZUJhcik7Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgY3JlYXRlV2luZG93Q29udGVudHMoU2hlbGwgc2hlbGwpIHsKLQkJCQkJCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIgPSBnZXRXaW5kb3dDb25maWd1cmVyKCk7Ci0JCQkJCQljb25maWd1cmVyLmNyZWF0ZVBhZ2VDb21wb3NpdGUoc2hlbGwpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgZXZlbnRMb29wSWRsZShEaXNwbGF5IGRpc3ApIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyA9IGdldFdvcmtiZW5jaENvbmZpZ3VyZXIoKQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWFzc2VydEVxdWFscygidGVzdGluZyBzaG93Q29vbEJhcj0iICsgc2hvd0Nvb2xCYXIsIHNob3dDb29sQmFyLCAoKFdvcmtiZW5jaFdpbmRvdylhY3RpdmVXb3JrYmVuY2hXaW5kb3cpLmdldENvb2xCYXJWaXNpYmxlKCkpOwotCQkJCWFzc2VydEVxdWFscygidGVzdGluZyBzaG93UGVyc3BlY3RpdmVCYXI9IiArIHNob3dQZXJzcGVjdGl2ZUJhciwgc2hvd1BlcnNwZWN0aXZlQmFyLCAoKFdvcmtiZW5jaFdpbmRvdylhY3RpdmVXb3JrYmVuY2hXaW5kb3cpLmdldFBlcnNwZWN0aXZlQmFyVmlzaWJsZSgpKTsKLQkJCQlzdXBlci5ldmVudExvb3BJZGxlKGRpc3ApOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBldmVudExvb3BFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX07Ci0JCi0JCWludCBjb2RlID0gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwgd2EpOwotCQlhc3NlcnRFcXVhbHMoUGxhdGZvcm1VSS5SRVRVUk5fT0ssIGNvZGUpOwotCX0KLSAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvcGVyZm9ybWFuY2UvRW1wdHlXb3JrYmVuY2hQZXJmVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9wZXJmb3JtYW5jZS9FbXB0eVdvcmtiZW5jaFBlcmZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MWVjNWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9wZXJmb3JtYW5jZS9FbXB0eVdvcmtiZW5jaFBlcmZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLnV0aWwuSVBlcmZvcm1hbmNlTWV0ZXJBcnJheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AudXRpbC5JbnRlcnZhbE1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AudXRpbC5SZXN0b3JlV29ya2JlbmNoSW50ZXJ2YWxNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC51dGlsLk9wZW5Xb3JrYmVuY2hJbnRlcnZhbE1vbml0b3I7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlXb3JrYmVuY2hQZXJmVGVzdCBleHRlbmRzIFBlcmZvcm1hbmNlVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFUEVBVF9DT1VOVCA9IDEwOwotCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW4oKSB7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuY3JlYXRlRGlzcGxheSgpOwotCi0gICAgICAgIFBlcmZvcm1hbmNlIHBlcmYgPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0KLSAgICAgICAgU3RyaW5nIGJhc2VTY2VuYXJpb0lkID0gcGVyZi5nZXREZWZhdWx0U2NlbmFyaW9JZCh0aGlzKTsKLSAgICAgICAgSVBlcmZvcm1hbmNlTWV0ZXJBcnJheSBtZXRlcnMgPSBuZXcgSW50ZXJ2YWxNZXRlcnMocGVyZiwgYmFzZVNjZW5hcmlvSWQsIE9wZW5Xb3JrYmVuY2hJbnRlcnZhbE1vbml0b3IuaW50ZXJ2YWxOYW1lcyk7Ci0gICAgICAgIHRhZ0FzU3VtbWFyeSgiT3BlbiBSQ1AgQXBwIiwgRGltZW5zaW9uLkNQVV9USU1FKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSRVBFQVRfQ09VTlQ7ICsraSApIHsKLSAgICAgICAgICAgIG1ldGVycy5zdGFydChPcGVuV29ya2JlbmNoSW50ZXJ2YWxNb25pdG9yLmZpcnN0SW50ZXJ2YWwpOwotICAgICAgICAgICAgaW50IGNvZGUgPSBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICBuZXcgT3BlbldvcmtiZW5jaEludGVydmFsTW9uaXRvcihtZXRlcnMpKTsKLSAgICAgICAgICAgIG1ldGVycy5zdG9wKE9wZW5Xb3JrYmVuY2hJbnRlcnZhbE1vbml0b3IuZmluYWxJbnRlcnZhbCk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhQbGF0Zm9ybVVJLlJFVFVSTl9PSywgY29kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0KLSAgICAgICAgbWV0ZXJzLmNvbW1pdCgpOwotICAgICAgICBtZXRlcnMuYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICAgICAgbWV0ZXJzLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdG9yZSgpIHsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5jcmVhdGVEaXNwbGF5KCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGFuIGFkdmlzb3IgdGhhdCB3aWxsIGp1c3Qgc3RhcnQgdGhlIHdvcmtiZW5jaCBsb25nIGVub3VnaCB0byBjcmVhdGUKLSAgICAgICAgLy8gc29tZXRoaW5nIHRvIGJlIHJlc3RvcmVkIGxhdGVyCi0gICAgICAgIFdvcmtiZW5jaEFkdmlzb3Igd2EgPSBuZXcgUmVzdG9yZVdvcmtiZW5jaEludGVydmFsTW9uaXRvcigpOwotCi0gICAgICAgIGludCBjb2RlID0gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwgd2EpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGxhdGZvcm1VSS5SRVRVUk5fUkVTVEFSVCwgY29kZSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGRpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLQotICAgICAgICAvLyB0aGUgcmVzdCBpcyBhIGJ1bmNoIG9mIGNvZGUgdG8gcmVzdG9yZSB0aGUgd29ya2JlbmNoIGFuZCBtb25pdG9yIHBlcmZvcm1hbmNlCi0gICAgICAgIC8vIHdoaWxlIGRvaW5nIHNvCi0KLSAgICAgICAgUGVyZm9ybWFuY2UgcGVyZiA9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLQotICAgICAgICBTdHJpbmcgYmFzZVNjZW5hcmlvSWQgPSBwZXJmLmdldERlZmF1bHRTY2VuYXJpb0lkKHRoaXMpOwotICAgICAgICBJUGVyZm9ybWFuY2VNZXRlckFycmF5IG1ldGVycyA9IG5ldyBJbnRlcnZhbE1ldGVycyhwZXJmLCBiYXNlU2NlbmFyaW9JZCwgUmVzdG9yZVdvcmtiZW5jaEludGVydmFsTW9uaXRvci5pbnRlcnZhbE5hbWVzKTsKLQotICAgICAgICB0YWdBc1N1bW1hcnkoIlJlc3RvcmUgUkNQIEFwcCIsIERpbWVuc2lvbi5DUFVfVElNRSk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJFUEVBVF9DT1VOVDsgKytpICkgewotICAgICAgICAgICAgbWV0ZXJzLnN0YXJ0KFJlc3RvcmVXb3JrYmVuY2hJbnRlcnZhbE1vbml0b3IuZmlyc3RJbnRlcnZhbCk7Ci0gICAgICAgICAgICBjb2RlID0gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFJlc3RvcmVXb3JrYmVuY2hJbnRlcnZhbE1vbml0b3IobWV0ZXJzKSk7Ci0gICAgICAgICAgICBtZXRlcnMuc3RvcChSZXN0b3JlV29ya2JlbmNoSW50ZXJ2YWxNb25pdG9yLmZpbmFsSW50ZXJ2YWwpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoUGxhdGZvcm1VSS5SRVRVUk5fT0ssIGNvZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWV0ZXJzLmNvbW1pdCgpOwotICAgICAgICBtZXRlcnMuYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICAgICAgbWV0ZXJzLmRpc3Bvc2UoKTsKLQotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9wZXJmb3JtYW5jZS9QbGF0Zm9ybVVJUGVyZlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvcGVyZm9ybWFuY2UvUGxhdGZvcm1VSVBlcmZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzhjZDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9wZXJmb3JtYW5jZS9QbGF0Zm9ybVVJUGVyZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC51dGlsLldvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcjsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybVVJUGVyZlRlc3QgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmREaXNwb3NlRGlzcGxheVgxMDAoKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSApIHsKLSAgICAgICAgICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwMDsgKytqKSB7Ci0gICAgICAgICAgICAJRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5jcmVhdGVEaXNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgZGlzcGxheS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdG9wTWVhc3VyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21taXRNZWFzdXJlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuQW5kU2h1dGRvd25Xb3JrYmVuY2goKSB7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuY3JlYXRlRGlzcGxheSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSApIHsKLSAgICAgICAgICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgICAgICAgICBpbnQgY29kZSA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksIG5ldyBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIoMikpOwotICAgICAgICAgICAgc3RvcE1lYXN1cmluZygpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoUGxhdGZvcm1VSS5SRVRVUk5fT0ssIGNvZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGlzcGxheS5kaXNwb3NlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotCi0gICAgICAgIGNvbW1pdE1lYXN1cmVtZW50cygpOwotICAgICAgICBhc3NlcnRQZXJmb3JtYW5jZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvcGVyZm9ybWFuY2UvUkNQUGVyZm9ybWFuY2VUZXN0U2V0dXAuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvcGVyZm9ybWFuY2UvUkNQUGVyZm9ybWFuY2VUZXN0U2V0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjMDNkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3BlcmZvcm1hbmNlL1JDUFBlcmZvcm1hbmNlVGVzdFNldHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUkNQUGVyZm9ybWFuY2VUZXN0U2V0dXAgZXh0ZW5kcyBUZXN0U2V0dXAgewotCi0JcHVibGljIFJDUFBlcmZvcm1hbmNlVGVzdFNldHVwKFRlc3QgdGVzdCkgewotCQlzdXBlcih0ZXN0KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3BlcmZvcm1hbmNlL1JDUFBlcmZvcm1hbmNlVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3BlcmZvcm1hbmNlL1JDUFBlcmZvcm1hbmNlVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjhmNDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC9wZXJmb3JtYW5jZS9SQ1BQZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUkNQUGVyZm9ybWFuY2VUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VpdGUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgCXJldHVybiBuZXcgUkNQUGVyZm9ybWFuY2VUZXN0U2V0dXAobmV3IFJDUFBlcmZvcm1hbmNlVGVzdFN1aXRlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCB0aGUgdGVzdCBzdWl0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUkNQUGVyZm9ybWFuY2VUZXN0U3VpdGUoKSB7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShQbGF0Zm9ybVVJUGVyZlRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoRW1wdHlXb3JrYmVuY2hQZXJmVGVzdC5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC91dGlsL0VtcHR5UGVyc3BlY3RpdmUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvdXRpbC9FbXB0eVBlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYzdiOTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC91dGlsL0VtcHR5UGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBwZXJzcGVjdGl2ZSBpcyB1c2VkIGZvciB0ZXN0aW5nIGFwaS4gIEl0IGRlZmluZXMgYW4gaW5pdGlhbAotICogbGF5b3V0IHdpdGggbm8gcGFydHMsIGp1c3QgYW4gZWRpdG9yIGFyZWEuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbXB0eVBlcnNwZWN0aXZlIGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGVyc3BlY3RpdmUgaWQgZm9yIHRoZSBlbXB0eSBwZXJzcGVjdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTUF9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AudXRpbC5FbXB0eVBlcnNwZWN0aXZlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBEZWZhdWx0IGxheW91dCBlbmdpbmUuCi0gICAgICovCi0gICAgcHVibGljIEVtcHR5UGVyc3BlY3RpdmUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmaW5lcyB0aGUgaW5pdGlhbCBsYXlvdXQgZm9yIGEgcGVyc3BlY3RpdmUuICAKLSAgICAgKgotICAgICAqIEltcGxlbWVudG9ycyBvZiB0aGlzIG1ldGhvZCBtYXkgYWRkIGFkZGl0aW9uYWwgdmlld3MgdG8gYQotICAgICAqIHBlcnNwZWN0aXZlLiAgVGhlIHBlcnNwZWN0aXZlIGFscmVhZHkgY29udGFpbnMgYW4gZWRpdG9yIGZvbGRlcgotICAgICAqIHdpdGggPGNvZGU+SUQgPSBJTGF5b3V0RmFjdG9yeS5JRF9FRElUT1JTPC9jb2RlPi4gIEFkZCBhZGRpdGlvbmFsIHZpZXdzCi0gICAgICogdG8gdGhlIHBlcnNwZWN0aXZlIGluIHJlZmVyZW5jZSB0byB0aGUgZWRpdG9yIGZvbGRlci4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZW4gYSBuZXcgcGVyc3BlY3RpdmUgaXMgY3JlYXRlZC4gIElmCi0gICAgICogYW4gb2xkIHBlcnNwZWN0aXZlIGlzIHJlc3RvcmVkIGZyb20gYSBwZXJzaXN0ZW5jZSBmaWxlIHRoZW4KLSAgICAgKiB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgdGhlIGZhY3RvcnkgdXNlZCB0byBhZGQgdmlld3MgdG8gdGhlIHBlcnNwZWN0aXZlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZW1wdHkgcGVyc3BlY3RpdmUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3V0aWwvRW1wdHlWaWV3LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3V0aWwvRW1wdHlWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNzU1OTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC91dGlsL0VtcHR5Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotLyoqCi0gKiBNaW5pbWFsIHZpZXcsIGZvciB0aGUgUkNQIHRlc3RzLiAKLSAqLwotcHVibGljIGNsYXNzIEVtcHR5VmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC51dGlsLkVtcHR5VmlldyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIExhYmVsIGxhYmVsOwotICAgIAotCXB1YmxpYyBFbXB0eVZpZXcoKSB7Ci0JICAgIC8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JICAgIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCSAgICBsYWJlbC5zZXRUZXh0KCJFbXB0eSB2aWV3Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWxhYmVsLnNldEZvY3VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC91dGlsL0lQZXJmb3JtYW5jZU1ldGVyQXJyYXkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvdXRpbC9JUGVyZm9ybWFuY2VNZXRlckFycmF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzBiMTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC91dGlsL0lQZXJmb3JtYW5jZU1ldGVyQXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AudXRpbDsKLQotLyoqCi0gKiBBbiBhcnJheSBvZiBwZXJmb3JtYW5jZSBtZXRlcnMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGhpbmdzIGxpa2UgaW50ZXJ2YWwgdGltaW5nLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBlcmZvcm1hbmNlTWV0ZXJBcnJheSB7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCB0aGUgbWV0ZXIgYXQgdGhlIGFyZ3VtZW50IGluZGV4LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGludCBtZXRlckluZGV4KTsKLQotICAgIC8qKgotICAgICAqIFN0b3AgdGhlIG1ldGVyIGF0IHRoZSBhcmd1bWVudCBpbmRleC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKGludCBtZXRlckluZGV4KTsKLQotICAgIC8qKgotICAgICAqIENvbW1pdCBhbGwgbWV0ZXJzIGluIHRoaXMgYXJyYXkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29tbWl0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBBc3NlcnQgdGhlIHBlcmZvcm1hbmNlIG9mIGFsbCBtZXRlcnMgaW4gdGhpcyBhcnJheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhc3NlcnRQZXJmb3JtYW5jZSgpOwotCi0gICAgLyoqCi0gICAgICogRGlzcG9zZSBhbGwgbWV0ZXJzIGluIHRoaXMgYXJyYXkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC91dGlsL0ludGVydmFsTWV0ZXJzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3V0aWwvSW50ZXJ2YWxNZXRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmYjM0NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3V0aWwvSW50ZXJ2YWxNZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZU1ldGVyOwotCi0vKioKLSAqIEEgc2V0IG9mIG1ldGVycyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGNoZWNrIHBlcmZvcm1hbmNlIG9mIGludGVydmFscy4gIEZvciBleGFtcGxlLCB0aGlzCi0gKiBjb2xsZWN0aW9uIGlzIHVzZWQgdG8gY2hlY2sgcGVyZm9ybWFuY2UgYmV0d2VlbiBhbGwgc3RhZ2VzIG9mIHRoZSB3b3JrYmVuY2ggbGlmZS1jeWNsZQotICogKHRoZSBzaWduaWZpY2FudCBldmVudHMgYXJlIG1hcmtlZCBpbiB0aGUgV29ya2JlbmNoQWR2aXNvciBjYWxsYmFja3MpLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlcnZhbE1ldGVycyBpbXBsZW1lbnRzIElQZXJmb3JtYW5jZU1ldGVyQXJyYXkgewotCi0gICAgcHJpdmF0ZSBQZXJmb3JtYW5jZSBwZXJmOwotICAgIHByaXZhdGUgU3RyaW5nIGJhc2VTY2VuYXJpb0lkOwotCi0gICAgLyoqCi0gICAgICogQ2xpZW50cyBpbnN0YW50aWF0ZSB0aGUgaW50ZXJ2YWwgbWV0ZXIgc2V0IGFzIGEgc3BlY2lmaWMgc2l6ZSBhbmQgYXJlIHRoZW4gcmVzcG9uc2libGUKLSAgICAgKiBmb3IgY29udHJvbGxpbmcgYnkgaW5kZXguCi0gICAgICovCi0gICAgcHJpdmF0ZSBQZXJmb3JtYW5jZU1ldGVyW10gbWV0ZXJzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIHNldCBvZiBwZXJmb3JtYW5jZSBtZXRlcnMgdXNpbmcgdGhlIGFyZ3VtZW50IGFycmF5IG9mIHN0cmluZ3MgaW4gdGhlIG5hbWUKLSAgICAgKiBmb3IgZWFjaCBvbmUKLSAgICAgKiBAcGFyYW0gaW50ZXJ2YWxzCi0gICAgICovCi0gICAgcHVibGljIEludGVydmFsTWV0ZXJzKFBlcmZvcm1hbmNlIHBlcmYsIFN0cmluZyBiYXNlU2NlbmFyaW9JZCwgU3RyaW5nW10gaW50ZXJ2YWxzKSB7Ci0gICAgICAgIHRoaXMucGVyZiA9IHBlcmY7Ci0gICAgICAgIHRoaXMuYmFzZVNjZW5hcmlvSWQgPSBiYXNlU2NlbmFyaW9JZDsKLQotICAgICAgICBtZXRlcnMgPSBuZXcgUGVyZm9ybWFuY2VNZXRlcltpbnRlcnZhbHMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcnZhbHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIG1ldGVyc1tpXSA9IHBlcmYuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcihnZXRTY2VuYXJpb0lkKGludGVydmFsc1tpXSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2NlbmFyaW9JZChTdHJpbmcgaW50ZXJ2YWxOYW1lKSB7Ci0gICAgICAgIHJldHVybiBiYXNlU2NlbmFyaW9JZCArICIgWyIgKyBpbnRlcnZhbE5hbWUgKyAnXSc7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydChpbnQgbWV0ZXJJbmRleCkgewotICAgICAgICBtZXRlcnNbbWV0ZXJJbmRleF0uc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKGludCBtZXRlckluZGV4KSB7Ci0gICAgICAgIG1ldGVyc1ttZXRlckluZGV4XS5zdG9wKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGludGVydmFsIGF0IHRoZSBhcmd1bWVudCBoYXMgY29tcGxldGVkLiAgU3RvcCB0aGF0IG1ldGVyIGFuZCBzdGFydCB0aGUgbmV4dC4KLSAgICAgKiBAcGFyYW0gY29tcGxldGVkSW50ZXJ2YWxJbmRleAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludGVydmFsQm91bmRhcnkoaW50IGNvbXBsZXRlZEludGVydmFsSW5kZXgpIHsKLSAgICAgICAgbWV0ZXJzW2NvbXBsZXRlZEludGVydmFsSW5kZXhdLnN0b3AoKTsKLSAgICAgICAgbWV0ZXJzW2NvbXBsZXRlZEludGVydmFsSW5kZXggKyAxXS5zdGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRlcnMubGVuZ3RoOyArK2kpCi0gICAgICAgICAgICBtZXRlcnNbaV0uY29tbWl0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXNzZXJ0UGVyZm9ybWFuY2UoKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0ZXJzLmxlbmd0aDsgKytpKQotICAgICAgICAgICAgcGVyZi5hc3NlcnRQZXJmb3JtYW5jZShtZXRlcnNbaV0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0ZXJzLmxlbmd0aDsgKytpKQotICAgICAgICAgICAgbWV0ZXJzW2ldLmRpc3Bvc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3V0aWwvTnVsbE1ldGVycy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC91dGlsL051bGxNZXRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkNjhhYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3V0aWwvTnVsbE1ldGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC51dGlsOwotCi0vKioKLSAqIEFuIGVtcHR5IGFycmF5IG9mIG1ldGVycywgYWxsIGNhbGxzIGFyZSBpZ25vcmVkLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsTWV0ZXJzIGltcGxlbWVudHMgSVBlcmZvcm1hbmNlTWV0ZXJBcnJheSB7Ci0KLSAgICBwdWJsaWMgTnVsbE1ldGVycygpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGludCBtZXRlckluZGV4KSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKGludCBtZXRlckluZGV4KSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnRlcnZhbEJvdW5kYXJ5KGludCBjb21wbGV0ZWRJbnRlcnZhbEluZGV4KSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhc3NlcnRQZXJmb3JtYW5jZSgpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3V0aWwvT3BlbldvcmtiZW5jaEludGVydmFsTW9uaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC91dGlsL09wZW5Xb3JrYmVuY2hJbnRlcnZhbE1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwOTdkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3V0aWwvT3BlbldvcmtiZW5jaEludGVydmFsTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSUFjdGlvbkJhckNvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaENvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSB3b3JrYmVuY2ggYWR2aXNvciB0cmFja3MgcGVyZm9ybWFuY2UgZm9yIHRoZSBpbnRlcnZhbHMgYmV0d2VlbgotICogbGlmZWN5Y2xlIGV2ZW50cy4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgT3BlbldvcmtiZW5jaEludGVydmFsTW9uaXRvciBleHRlbmRzIFJDUFRlc3RXb3JrYmVuY2hBZHZpc29yIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gaW50ZXJ2YWxOYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICJvcGVuIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAiY2xvc2UiIC8vJE5PTi1OTFMtMSQKLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG9wZW5JbnRlcnZhbCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2xvc2VJbnRlcnZhbCA9IDE7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmlyc3RJbnRlcnZhbCA9IG9wZW5JbnRlcnZhbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaW5hbEludGVydmFsID0gY2xvc2VJbnRlcnZhbDsKLQotLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbnRlcnZhbE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKLS8vICAgICAgICAgICAgInRvIGluaXRpYWxpemUiLCAvLyROT04tTkxTLTEkCi0vLyAgICAgICAgICAgICJpbml0aWFsaXplIHRvIHByZVN0YXJ0dXAiLCAvLyROT04tTkxTLTEkCi0vLyAgICAgICAgICAgICJwcmVTdGFydHVwIHRvIHByZVdpbmRvd09wZW4iLCAvLyROT04tTkxTLTEkCi0vLyAgICAgICAgICAgICJwcmVXaW5kb3dPcGVuIHRvIGZpbGxBY3Rpb25CYXJzIiwgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgICAgICAiZmlsbEFjdGlvbkJhcnMgdG8gcG9zdFdpbmRvd09wZW4iLCAvLyROT04tTkxTLTEkCi0vLyAgICAgICAgICAgICJwb3N0V2luZG93T3BlbiB0byBwb3N0U3RhcnR1cCIsIC8vJE5PTi1OTFMtMSQKLS8vICAgICAgICAgICAgInByZVNodXRkb3duIHRvIHBvc3RTaHV0ZG93biIsIC8vJE5PTi1OTFMtMSQKLS8vICAgICAgICAgICAgInBvc3RTaHV0ZG93biB0byBjb21wbGV0ZSIgLy8kTk9OLU5MUy0xJAotLy8gICAgfTsKLS8vCi0vLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbml0aWFsaXplSW50ZXJ2YWwgPSAwOwotLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlU3RhcnR1cEludGVydmFsID0gMTsKLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZVdpbmRvd09wZW5JbnRlcnZhbCA9IDI7Ci0vLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaWxsQWN0aW9uQmFyc0ludGVydmFsID0gMzsKLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBvc3RXaW5kb3dPcGVuSW50ZXJ2YWwgPSA0OwotLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcG9zdFN0YXJ0dXBJbnRlcnZhbCA9IDU7Ci0vLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaHV0ZG93bkludGVydmFsID0gNjsKLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdvcmtiZW5jaERlc3Ryb3llZEludGVydmFsID0gNzsKLS8vCi0vLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaXJzdEludGVydmFsID0gaW5pdGlhbGl6ZUludGVydmFsOwotLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmluYWxJbnRlcnZhbCA9IHdvcmtiZW5jaERlc3Ryb3llZEludGVydmFsOwotCi0gICAgcHJpdmF0ZSBJUGVyZm9ybWFuY2VNZXRlckFycmF5IG1ldGVyczsKLQotICAgIHB1YmxpYyBPcGVuV29ya2JlbmNoSW50ZXJ2YWxNb25pdG9yKElQZXJmb3JtYW5jZU1ldGVyQXJyYXkgbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyKDIpOwotICAgICAgICB0aGlzLm1ldGVycyA9IG1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKElXb3JrYmVuY2hDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLS8vICAgICAgICBtZXRlcnMuc3RvcChpbml0aWFsaXplSW50ZXJ2YWwpOwotLy8gICAgICAgIG1ldGVycy5zdGFydChwcmVTdGFydHVwSW50ZXJ2YWwpOwotICAgICAgICBzdXBlci5pbml0aWFsaXplKGNvbmZpZ3VyZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZVN0YXJ0dXAoKSB7Ci0vLyAgICAgICAgbWV0ZXJzLnN0b3AocHJlU3RhcnR1cEludGVydmFsKTsKLS8vICAgICAgICBtZXRlcnMuc3RhcnQocHJlV2luZG93T3BlbkludGVydmFsKTsKLSAgICAgICAgc3VwZXIucHJlU3RhcnR1cCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZVdpbmRvd09wZW4oSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgewotLy8gICAgICAgIG1ldGVycy5zdG9wKHByZVdpbmRvd09wZW5JbnRlcnZhbCk7Ci0vLyAgICAgICAgbWV0ZXJzLnN0YXJ0KGZpbGxBY3Rpb25CYXJzSW50ZXJ2YWwpOwotICAgICAgICBzdXBlci5wcmVXaW5kb3dPcGVuKGNvbmZpZ3VyZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElXb3JrYmVuY2hXaW5kb3cgd2luZG93LCBJQWN0aW9uQmFyQ29uZmlndXJlciBjb25maWd1cmVyLCBpbnQgZmxhZ3MpIHsKLS8vICAgICAgICBtZXRlcnMuc3RvcChmaWxsQWN0aW9uQmFyc0ludGVydmFsKTsKLS8vICAgICAgICBtZXRlcnMuc3RhcnQocG9zdFdpbmRvd09wZW5JbnRlcnZhbCk7Ci0gICAgICAgIHN1cGVyLmZpbGxBY3Rpb25CYXJzKHdpbmRvdywgY29uZmlndXJlciwgZmxhZ3MpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9zdFdpbmRvd09wZW4oSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgewotLy8gICAgICAgIG1ldGVycy5zdG9wKHBvc3RXaW5kb3dPcGVuSW50ZXJ2YWwpOwotLy8gICAgICAgIG1ldGVycy5zdGFydChwb3N0U3RhcnR1cEludGVydmFsKTsKLSAgICAgICAgc3VwZXIucG9zdFdpbmRvd09wZW4oY29uZmlndXJlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9zdFN0YXJ0dXAoKSB7Ci0vLyAgICAgICAgbWV0ZXJzLnN0b3AocG9zdFN0YXJ0dXBJbnRlcnZhbCk7Ci0gICAgCW1ldGVycy5zdG9wKG9wZW5JbnRlcnZhbCk7Ci0gICAgCQotICAgICAgICAvLyBubyByZWFzb24gdG8gdHJhY2sgcGVyZm9ybWFjZSBiZXR3ZWVuIHdoZW4gc3RhcnR1cCBjb21wbGV0ZXMgYW5kIHNodXRkb3duIHN0YXJ0cwotICAgICAgICAvLyBzaW5jZSB0aGF0IGlzIGp1c3QgdGVzdGluZyBvdmVyaGVhZAotCi0gICAgICAgIHN1cGVyLnBvc3RTdGFydHVwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcHJlU2h1dGRvd24oKSB7Ci0vLyAgICAgICAgbWV0ZXJzLnN0YXJ0KHNodXRkb3duSW50ZXJ2YWwpOwotICAgIAltZXRlcnMuc3RhcnQoY2xvc2VJbnRlcnZhbCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5wcmVTaHV0ZG93bigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvc3RTaHV0ZG93bigpIHsKLS8vICAgICAgICBtZXRlcnMuc3RvcChzaHV0ZG93bkludGVydmFsKTsKLS8vICAgICAgICBtZXRlcnMuc3RhcnQod29ya2JlbmNoRGVzdHJveWVkSW50ZXJ2YWwpOwotICAgICAgICBzdXBlci5wb3N0U2h1dGRvd24oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3V0aWwvUkNQVGVzdFdvcmtiZW5jaEFkdmlzb3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvdXRpbC9SQ1BUZXN0V29ya2JlbmNoQWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjk4ZTgzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvdXRpbC9SQ1BUZXN0V29ya2JlbmNoQWR2aXNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yOwotCi0KLS8qKgotICogVGhpcyBhZHZpc29yIGFkZHMgdGhlIGFiaWxpdHkgdG8gZXhpdCB0aGUgd29ya2JlbmNoIGFmdGVyIGl0IGhhcyBzdGFydGVkIHVwLiAgVGhpcyBpcyBkb25lCi0gKiB3aXRoIGEgY2FsbCB0byBjbG9zZSBmcm9tIHdpdGhpbiB0aGUgYWR2aXNvcidzIGV2ZW50IGlkbGUgbG9vcC4gIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlCi0gKiBpZGxlIGlzIGNhbGxlZCBiZWZvcmUgZXhpdGluZyBjYW4gYmUgY29uZmlndXJlZC4gIFRlc3QgY2FzZXMgc2hvdWxkIHN1YmNsYXNzIHRoaXMgYWR2aXNvcgotICogYW5kIGFkZCB0aGVpciBvd24gY2FsbGJhY2sgbWV0aG9kcyBpZiBuZWVkZWQuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFJDUFRlc3RXb3JrYmVuY2hBZHZpc29yIGV4dGVuZHMgV29ya2JlbmNoQWR2aXNvciB7Ci0KLSAgICAvKiogRGVmYXVsdCB2YWx1ZSBvZiAtMSBjYXVzZXMgdGhlIG9wdGlvbiB0byBiZSBpZ25vcmVkLiAqLwotICAgIHByaXZhdGUgaW50IGlkbGVCZWZvcmVFeGl0ID0gLTE7Ci0KLSAgICBwdWJsaWMgUkNQVGVzdFdvcmtiZW5jaEFkdmlzb3IoKSB7Ci0gICAgICAgIC8vIGRlZmF1bHQgdmFsdWUgbWVhbnMgdGhlIGFkdmlzb3Igd2lsbCBub3QgdHJpZ2dlciB0aGUgd29ya2JlbmNoIHRvIGNsb3NlCi0gICAgICAgIHRoaXMuaWRsZUJlZm9yZUV4aXQgPSAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUkNQVGVzdFdvcmtiZW5jaEFkdmlzb3IoaW50IGlkbGVCZWZvcmVFeGl0KSB7Ci0gICAgICAgIHRoaXMuaWRsZUJlZm9yZUV4aXQgPSBpZGxlQmVmb3JlRXhpdDsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNpbml0aWFsaXplKG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklXb3JrYmVuY2hDb25maWd1cmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVdvcmtiZW5jaENvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCQlzdXBlci5pbml0aWFsaXplKGNvbmZpZ3VyZXIpOwotCi0JCS8vIFRoZSBSQ1AgdGVzdHMgYXJlIGN1cnJlbnRseSBydW4gaW4gdGhlIGNvbnRleHQgb2YgdGhlIFBsYXRmb3JtIHByb2R1Y3QsIHdoaWNoIHNwZWNpZmllcwotCQkvLyB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUgYXMgdGhlIGRlZmF1bHQsIGFuZCBhbHNvIHJlcG9ydHMgcHJvZ3Jlc3Mgb24gc3RhcnR1cC4gIAotCQkvLyBXZSBkb24ndCB3YW50IGVpdGhlciBpbiBlZmZlY3Qgd2hlbiBydW5uaW5nIHRoZSBSQ1AgdGVzdHMuCi0JCS8vIEFsc28gZGlzYWJsZSBpbnRyby4KLQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmcyA9IFBsYXRmb3JtVUkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXByZWZzLnNldFZhbHVlKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLkRFRkFVTFRfUEVSU1BFQ1RJVkVfSUQsICIiKTsKLQkJcHJlZnMuc2V0VmFsdWUoSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuU0hPV19QUk9HUkVTU19PTl9TVEFSVFVQLCBmYWxzZSk7Ci0JCXByZWZzLnNldFZhbHVlKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLlNIT1dfSU5UUk8sIGZhbHNlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI2dldEluaXRpYWxXaW5kb3dQZXJzcGVjdGl2ZUlkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxXaW5kb3dQZXJzcGVjdGl2ZUlkKCkgewotICAgICAgICByZXR1cm4gRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBldmVudExvb3BJZGxlKGZpbmFsIERpc3BsYXkgZGlzcGxheSkgewotICAgIAkvLyBCdWcgMTA3MzY5OiBSQ1AgdGVzdCBzdWl0ZSBoYW5ncyBvbiBHVEsKLSAgICAgICAgaWYgKGlkbGVCZWZvcmVFeGl0IT0tMSAmJiAtLWlkbGVCZWZvcmVFeGl0IDw9IDApCi0gICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmNsb3NlKCk7Ci0KLSAgICAgICAgLy8gYnVnIDczMTg0OiBPbiB0aGUgbWFjIHRoZSBwYXJlbnQgZXZlbnRMb29wSWRsZSB3aWxsIHB1dCB0aGUgZGlzcGxheSB0byBzbGVlcAotICAgICAgICAvLyAgICAgICAgICAgIHVudGlsIHRoZXJlIGFyZSBldmVudHMgKGUuZy4sIG1vdXNlIGppZ2dsZWQpLgotLy8gICAgICAgIGlmICghImNhcmJvbiIuZXF1YWxzKFNXVC5nZXRQbGF0Zm9ybSgpKSkKLS8vICAgICAgICAgICAgc3VwZXIuZXZlbnRMb29wSWRsZShkaXNwbGF5KTsKLQotICAgICAgICBpZiAoaWRsZUJlZm9yZUV4aXQgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC91dGlsL1Jlc3RvcmVXb3JrYmVuY2hJbnRlcnZhbE1vbml0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9FY2xpcHNlIFJDUCBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9yY3AvdXRpbC9SZXN0b3JlV29ya2JlbmNoSW50ZXJ2YWxNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTRlOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC91dGlsL1Jlc3RvcmVXb3JrYmVuY2hJbnRlcnZhbE1vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucmNwLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklXb3JrYmVuY2hDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyOwotCi0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgd29ya2JlbmNoIGFkdmlzb3IgdHJhY2tzIHBlcmZvcm1hbmNlIGZvciB0aGUgaW50ZXJ2YWxzIGJldHdlZW4KLSAqIGxpZmVjeWNsZSBldmVudHMuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFJlc3RvcmVXb3JrYmVuY2hJbnRlcnZhbE1vbml0b3IgZXh0ZW5kcyBSQ1BUZXN0V29ya2JlbmNoQWR2aXNvciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGludGVydmFsTmFtZXMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAib3BlbiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgImNsb3NlIiAvLyROT04tTkxTLTEkCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBvcGVuSW50ZXJ2YWwgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNsb3NlSW50ZXJ2YWwgPSAxOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZpcnN0SW50ZXJ2YWwgPSBvcGVuSW50ZXJ2YWw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmluYWxJbnRlcnZhbCA9IGNsb3NlSW50ZXJ2YWw7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNyZWF0ZVJlc3RvcmFibGVXb3JrYmVuY2ggPSBmYWxzZTsKLQlwcml2YXRlIElQZXJmb3JtYW5jZU1ldGVyQXJyYXkgbWV0ZXJzID0gbmV3IE51bGxNZXRlcnMoKTsKLQkKLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gaW50ZXJ2YWxOYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ci0vLyAgICAgICAgICAgICJ0byBpbml0aWFsaXplIiwgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgICAgICAiaW5pdGlhbGl6ZSB0byBwcmVTdGFydHVwIiwgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgICAgICAicHJlU3RhcnR1cCB0byBwcmVXaW5kb3dPcGVuIiwgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgICAgICAicHJlV2luZG93T3BlbiB0byBmaWxsQWN0aW9uQmFycyIsIC8vJE5PTi1OTFMtMSQKLS8vICAgICAgICAgICAgImZpbGxBY3Rpb25CYXJzIHRvIHBvc3RXaW5kb3dSZXN0b3JlIiwgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgICAgICAicG9zdFdpbmRvd1Jlc3RvcmUgdG8gcG9zdFdpbmRvd09wZW4iLCAvLyROT04tTkxTLTEkCi0vLyAgICAgICAgICAgICJwb3N0V2luZG93T3BlbiB0byBwb3N0U3RhcnR1cCIsIC8vJE5PTi1OTFMtMSQKLS8vICAgICAgICAgICAgInByZVNodXRkb3duIHRvIHBvc3RTaHV0ZG93biIsIC8vJE5PTi1OTFMtMSQKLS8vICAgICAgICAgICAgInBvc3RTaHV0ZG93biB0byBjb21wbGV0ZSIgLy8kTk9OLU5MUy0xJAotLy8gICAgfTsKLS8vCi0vLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbml0aWFsaXplSW50ZXJ2YWwgPSAwOwotLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlU3RhcnR1cEludGVydmFsID0gMTsKLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZVdpbmRvd09wZW5JbnRlcnZhbCA9IDI7Ci0vLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaWxsQWN0aW9uQmFyc0ludGVydmFsID0gMzsKLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBvc3RXaW5kb3dSZXN0b3JlSW50ZXJ2YWwgPSA0OwotLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcG9zdFdpbmRvd09wZW5JbnRlcnZhbCA9IDU7Ci0vLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3N0U3RhcnR1cEludGVydmFsID0gNjsKLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNodXRkb3duSW50ZXJ2YWwgPSA3OwotLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd29ya2JlbmNoRGVzdHJveWVkSW50ZXJ2YWwgPSA4OwotLy8KLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZpcnN0SW50ZXJ2YWwgPSBpbml0aWFsaXplSW50ZXJ2YWw7Ci0vLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaW5hbEludGVydmFsID0gd29ya2JlbmNoRGVzdHJveWVkSW50ZXJ2YWw7Ci0vLwotLy8gICAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZVJlc3RvcmFibGVXb3JrYmVuY2ggPSBmYWxzZTsKLS8vICAgIHByaXZhdGUgSVBlcmZvcm1hbmNlTWV0ZXJBcnJheSBtZXRlcnMgPSBuZXcgTnVsbE1ldGVycygpOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoQ29uZmlndXJlciB3b3JrYmVuY2hDb25maWd1cmVyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGNyZWF0ZSBhIHdvcmtiZW5jaCB0aGF0IGNhbiBiZSByZXN0b3JlZCBsYXRlci4gIFRoaXMKLSAgICAgKiBjb25zdHJ1Y3RvciBzdGFydHMgdGhhdCBiZWhhdmlvdXIgYnkgc2V0dGluZyBhIGZsYWcgdGhhdCB3aWxsIGJlIGNoZWNrZWQgaW4gdGhlCi0gICAgICogYXBwcm9wcmlhdGUgbWV0aG9kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzdG9yZVdvcmtiZW5jaEludGVydmFsTW9uaXRvcigpIHsKLSAgICAgICAgc3VwZXIoMik7Ci0gICAgICAgIGNyZWF0ZVJlc3RvcmFibGVXb3JrYmVuY2ggPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXN0b3JlV29ya2JlbmNoSW50ZXJ2YWxNb25pdG9yKElQZXJmb3JtYW5jZU1ldGVyQXJyYXkgbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyKDIpOwotICAgICAgICB0aGlzLm1ldGVycyA9IG1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKElXb3JrYmVuY2hDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLS8vICAgICAgICBtZXRlcnMuc3RvcChpbml0aWFsaXplSW50ZXJ2YWwpOwotCi0gICAgICAgIHN1cGVyLmluaXRpYWxpemUoY29uZmlndXJlcik7Ci0gICAgICAgIHdvcmtiZW5jaENvbmZpZ3VyZXIgPSBjb25maWd1cmVyOwotICAgICAgICB3b3JrYmVuY2hDb25maWd1cmVyLnNldFNhdmVBbmRSZXN0b3JlKHRydWUpOwotCi0vLyAgICAgICAgbWV0ZXJzLnN0YXJ0KHByZVN0YXJ0dXBJbnRlcnZhbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJlU3RhcnR1cCgpIHsKLS8vICAgICAgICBtZXRlcnMuc3RvcChwcmVTdGFydHVwSW50ZXJ2YWwpOwotICAgICAgICBzdXBlci5wcmVTdGFydHVwKCk7Ci0vLyAgICAgICAgbWV0ZXJzLnN0YXJ0KHByZVdpbmRvd09wZW5JbnRlcnZhbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJlV2luZG93T3BlbihJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0vLyAgICAgICAgbWV0ZXJzLnN0b3AocHJlV2luZG93T3BlbkludGVydmFsKTsKLSAgICAgICAgc3VwZXIucHJlV2luZG93T3Blbihjb25maWd1cmVyKTsKLS8vICAgICAgICBtZXRlcnMuc3RhcnQoZmlsbEFjdGlvbkJhcnNJbnRlcnZhbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3csIElBY3Rpb25CYXJDb25maWd1cmVyIGNvbmZpZ3VyZXIsIGludCBmbGFncykgewotLy8gICAgICAgIG1ldGVycy5zdG9wKGZpbGxBY3Rpb25CYXJzSW50ZXJ2YWwpOwotICAgICAgICBzdXBlci5maWxsQWN0aW9uQmFycyh3aW5kb3csIGNvbmZpZ3VyZXIsIGZsYWdzKTsKLS8vICAgICAgICBtZXRlcnMuc3RhcnQocG9zdFdpbmRvd1Jlc3RvcmVJbnRlcnZhbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9zdFdpbmRvd1Jlc3RvcmUoSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgbWV0ZXJzLnN0b3AocG9zdFdpbmRvd1Jlc3RvcmVJbnRlcnZhbCk7Ci0gICAgICAgIHN1cGVyLnBvc3RXaW5kb3dSZXN0b3JlKGNvbmZpZ3VyZXIpOwotLy8gICAgICAgIG1ldGVycy5zdGFydChwb3N0V2luZG93T3BlbkludGVydmFsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3N0V2luZG93T3BlbihJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0vLyAgICAgICAgbWV0ZXJzLnN0b3AocG9zdFdpbmRvd09wZW5JbnRlcnZhbCk7Ci0gICAgICAgIHN1cGVyLnBvc3RXaW5kb3dPcGVuKGNvbmZpZ3VyZXIpOwotLy8gICAgICAgIG1ldGVycy5zdGFydChwb3N0U3RhcnR1cEludGVydmFsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3N0U3RhcnR1cCgpIHsKLS8vICAgICAgICBtZXRlcnMuc3RvcChwb3N0U3RhcnR1cEludGVydmFsKTsKLSAgICAgICAgbWV0ZXJzLnN0b3Aob3BlbkludGVydmFsKTsKLQotICAgICAgICAvLyBubyByZWFzb24gdG8gdHJhY2sgcGVyZm9ybWFjZSBiZXR3ZWVuIHdoZW4gc3RhcnR1cCBjb21wbGV0ZXMgYW5kIHNodXRkb3duIHN0YXJ0cwotICAgICAgICAvLyBzaW5jZSB0aGF0IGlzIGp1c3QgdGVzdGluZyBvdmVyaGVhZAotCi0gICAgICAgIHN1cGVyLnBvc3RTdGFydHVwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcHJlU2h1dGRvd24oKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gc3VwZXIucHJlU2h1dGRvd24oKTsKLS8vICAgICAgICBtZXRlcnMuc3RhcnQoc2h1dGRvd25JbnRlcnZhbCk7Ci0gICAgICAgIG1ldGVycy5zdGFydChjbG9zZUludGVydmFsKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3N0U2h1dGRvd24oKSB7Ci0vLyAgICAgICAgbWV0ZXJzLnN0b3Aoc2h1dGRvd25JbnRlcnZhbCk7Ci0gICAgICAgIHN1cGVyLnBvc3RTaHV0ZG93bigpOwotLy8gICAgICAgIG1ldGVycy5zdGFydCh3b3JrYmVuY2hEZXN0cm95ZWRJbnRlcnZhbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXZlbnRMb29wSWRsZShEaXNwbGF5IGQpIHsKLSAgICAgICAgaWYgKGNyZWF0ZVJlc3RvcmFibGVXb3JrYmVuY2gpCi0gICAgICAgICAgICB3b3JrYmVuY2hDb25maWd1cmVyLmdldFdvcmtiZW5jaCgpLnJlc3RhcnQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VwZXIuZXZlbnRMb29wSWRsZShkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3V0aWwvV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvRWNsaXBzZSBSQ1AgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcmNwL3V0aWwvV29ya2JlbmNoQWR2aXNvck9ic2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NDU3YjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL0VjbGlwc2UgUkNQIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3JjcC91dGlsL1dvcmtiZW5jaEFkdmlzb3JPYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcjsKLQotLyoqCi0gKiBUaGlzIHV0aWxpdHkgY2xhc3MgaXMgdXNlZCB0byByZWNvcmQgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBob29rcyBhcmUgY2FsbGVkLgotICogSXQgc2hvdWxkIGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSB0aGUgYmVoYXZpb3VyIG5lZWRlZCBmb3IgYSBwYXJ0aWN1bGFyIHRlc3QKLSAqIGNhc2UuIEFmdGVyIHRoZSBjYXNlIGhhcyBydW4sIGl0cyBsaXN0IGNhbiBiZSBleGFtaW5lZCB0byBjaGVjayBmb3IgdGhlCi0gKiBleHBlY3RlZCBvcmRlci4KLSAqIDxwPgotICogTk9URTogVGhpcyBkaWZmZXJzIGZyb20gPGNvZGU+b3JnLmVjbGlwc2UudWkudGVzdHMuQ2FsbEhpc3Rvcnk8L2NvZGU+IHNpbmNlCi0gKiB0aGlzIGNsYXNzIGFsbG93cyBhc3NlcnRpb25zIG9uIGluZGl2aWR1YWwgbWV0aG9kIG5hbWVzLiBXaGljaCBtZWFucyB0aGF0IHRoZQotICoganVuaXQgZXJyb3Igd2lsbCBpZGVudGlmeSB0aGUgZXhhY3QgZXJyb3IsIG5vdCBqdXN0IHRoZSBleGlzdGVuY2Ugb2YgYW4KLSAqIGVycm9yLgotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoQWR2aXNvck9ic2VydmVyIGV4dGVuZHMgUkNQVGVzdFdvcmtiZW5jaEFkdmlzb3IgewotCi0gICAgcHJpdmF0ZSBMaXN0IG9wZXJhdGlvbnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0gICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvcjsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOSVRJQUxJWkUgPSAiaW5pdGlhbGl6ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRV9TVEFSVFVQID0gInByZVN0YXJ0dXAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQT1NUX1NUQVJUVVAgPSAicG9zdFN0YXJ0dXAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUkVfV0lORE9XX09QRU4gPSAicHJlV2luZG93T3BlbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTExfQUNUSU9OX0JBUlMgPSAiZmlsbEFjdGlvbkJhcnMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQT1NUX1dJTkRPV19SRVNUT1JFID0gInBvc3RXaW5kb3dSZXN0b3JlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUE9TVF9XSU5ET1dfT1BFTiA9ICJwb3N0V2luZG93T3BlbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRV9XSU5ET1dfU0hFTExfQ0xPU0UgPSAicHJlV2luZG93U2hlbGxDbG9zZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVWRU5UX0xPT1BfRVhDRVBUSU9OID0gImV2ZW50TG9vcEV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRV9TSFVURE9XTiA9ICJwcmVTaHV0ZG93biI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBPU1RfU0hVVERPV04gPSAicG9zdFNodXRkb3duIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIElXb3JrYmVuY2hDb25maWd1cmVyIHdvcmtiZW5jaENvbmZpZzsKLQotICAgIHB1YmxpYyBXb3JrYmVuY2hBZHZpc29yT2JzZXJ2ZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdvcmtiZW5jaEFkdmlzb3JPYnNlcnZlcihpbnQgaWRsZUJlZm9yZUV4aXQpIHsKLSAgICAgICAgc3VwZXIoaWRsZUJlZm9yZUV4aXQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0T3BlcmF0aW9uSXRlcmF0b3IoKSB7Ci0gICAgICAgIGl0ZXJhdG9yID0gb3BlcmF0aW9ucy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFzc2VydE5leHRPcGVyYXRpb24oU3RyaW5nIGV4cGVjdGVkKSB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXNzZXJ0QWxsT3BlcmF0aW9uc0V4YW1pbmVkKCkgewotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChpdGVyYXRvcik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRPcGVyYXRpb24oU3RyaW5nIG9wZXJhdGlvbikgewotICAgICAgICBvcGVyYXRpb25zLmFkZChvcGVyYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVdvcmtiZW5jaENvbmZpZ3VyZXIgY29uZmlndXJlcikgewotICAgICAgICBzdXBlci5pbml0aWFsaXplKGNvbmZpZ3VyZXIpOwotICAgICAgICB3b3JrYmVuY2hDb25maWcgPSBjb25maWd1cmVyOwotICAgICAgICBhZGRPcGVyYXRpb24oSU5JVElBTElaRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJlU3RhcnR1cCgpIHsKLSAgICAgICAgc3VwZXIucHJlU3RhcnR1cCgpOwotICAgICAgICBhZGRPcGVyYXRpb24oUFJFX1NUQVJUVVApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZVdpbmRvd09wZW4oSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgewotICAgICAgICBzdXBlci5wcmVXaW5kb3dPcGVuKGNvbmZpZ3VyZXIpOwotICAgICAgICBhZGRPcGVyYXRpb24oUFJFX1dJTkRPV19PUEVOKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJV29ya2JlbmNoV2luZG93IHdpbmRvdywKLSAgICAgICAgICAgIElBY3Rpb25CYXJDb25maWd1cmVyIGNvbmZpZ3VyZXIsIGludCBmbGFncykgewotICAgICAgICBzdXBlci5maWxsQWN0aW9uQmFycyh3aW5kb3csIGNvbmZpZ3VyZXIsIGZsYWdzKTsKLSAgICAgICAgYWRkT3BlcmF0aW9uKEZJTExfQUNUSU9OX0JBUlMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvc3RXaW5kb3dSZXN0b3JlKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpCi0gICAgICAgICAgICB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIucG9zdFdpbmRvd1Jlc3RvcmUoY29uZmlndXJlcik7Ci0gICAgICAgIGFkZE9wZXJhdGlvbihQT1NUX1dJTkRPV19SRVNUT1JFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3N0V2luZG93T3BlbihJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0gICAgICAgIHN1cGVyLnBvc3RXaW5kb3dPcGVuKGNvbmZpZ3VyZXIpOwotICAgICAgICBhZGRPcGVyYXRpb24oUE9TVF9XSU5ET1dfT1BFTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9zdFN0YXJ0dXAoKSB7Ci0gICAgICAgIHN1cGVyLnBvc3RTdGFydHVwKCk7Ci0gICAgICAgIGFkZE9wZXJhdGlvbihQT1NUX1NUQVJUVVApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHByZVdpbmRvd1NoZWxsQ2xvc2UoSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgewotICAgICAgICBpZiAoIXN1cGVyLnByZVdpbmRvd1NoZWxsQ2xvc2UoY29uZmlndXJlcikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGFkZE9wZXJhdGlvbihQUkVfV0lORE9XX1NIRUxMX0NMT1NFKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcHJlU2h1dGRvd24oKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucHJlU2h1dGRvd24oKTsKLSAgICAgICAgYWRkT3BlcmF0aW9uKFBSRV9TSFVURE9XTik7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9zdFNodXRkb3duKCkgewotICAgICAgICBzdXBlci5wb3N0U2h1dGRvd24oKTsKLSAgICAgICAgYWRkT3BlcmF0aW9uKFBPU1RfU0hVVERPV04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV2ZW50TG9vcEV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIHN1cGVyLmV2ZW50TG9vcEV4Y2VwdGlvbihleGNlcHRpb24pOwotICAgICAgICBhZGRPcGVyYXRpb24oRVZFTlRfTE9PUF9FWENFUFRJT04pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3YTk2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFY2xpcHNlIFJDUCBUZXN0cwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UudWkudGVzdHMucmNwOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IHJjcHRlc3RzLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5jb21wYXRpYmlsaXR5LlBsdWdpbkFjdGl2YXRvcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxZWIyZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5odG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgICoueG1sLFwKLSAgICAgICAgICAgICAgIHJjcHRlc3RzLmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLWphcnMuY29tcGlsZS5vcmRlciA9IHJjcHRlc3RzLmphcgotc291cmNlLnJjcHRlc3RzLmphciA9IEVjbGlwc2UgUkNQIFRlc3RzLwotb3V0cHV0LnJjcHRlc3RzLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9pY29ucy9zYW1wbGUuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL2ljb25zL3NhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZmIzYzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL2ljb25zL3NhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQ1OGYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+Ci0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIG5hbWU9IkVtcHR5IFBlcnNwZWN0aXZlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnJjcC51dGlsLkVtcHR5UGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMucmNwLnV0aWwuRW1wdHlQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L3BlcnNwZWN0aXZlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSJSQ1AgVGVzdCBWaWV3cyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AiLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMucmNwLnV0aWwuRW1wdHlWaWV3IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AiCi0gICAgICAgICAgICBuYW1lPSJFbXB0eVZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMucmNwLnV0aWwuRW1wdHlWaWV3Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOWFlMzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMucmNwL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5yY3AiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIKLSAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0L2xpYnJhcnkueG1sIi8+Ci0gCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJjcC1mb2xkZXIiIAotICAgICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3VpX3JjcF9mb2xkZXIiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtyY3AtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7cmNwLWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiAKLSAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UudWkudGVzdHMucmNwLlJjcFRlc3RTdWl0ZSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgcGVyZm9ybWFuY2UgdGVzdCBzdWl0ZXMuIC0tPgotICA8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlIiBkZXBlbmRzPSJpbml0LHBlcmZvcm1hbmNlLXN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZS1zdWl0ZSI+Ci0gIAk8cHJvcGVydHkgbmFtZT0icGVyZm9ybWFuY2Utd29ya3NwYWNlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BlcmZvcm1hbmNlLXdvcmtzcGFjZS1wbGF0Zm9ybS1yY3AiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtwZXJmb3JtYW5jZS13b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICAJPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3BlcmZvcm1hbmNlLXdvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UudWkudGVzdHMucmNwLnBlcmZvcm1hbmNlLlJDUFBlcmZvcm1hbmNlVGVzdFN1aXRlIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1MWE2YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iRWNsaXBzZSBKRmFjZSBUZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkVjbGlwc2UgVUkgVGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJFY2xpcHNlIFBhcnQgUmVmZXJlbmNlcyBUZXN0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iQmVuY2htYXJrIFRlc3RzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzI1YzQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UudWkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZmFjZS50ZXh0PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS50ZXh0PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkuZWRpdG9yczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkuaWRlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS52aWV3czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5qdW5pdDwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWNmYjE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNGcmkgTWF5IDA2IDEyOjA1OjA4IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZTExMzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1R1ZSBPY3QgMTggMTU6MTY6MTcgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkuamF2YWRvYz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcmV0dXJuIFJldHVybnMgdGhlICR7YmFyZV9maWVsZF9uYW1lfS5cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcGFyYW0gJHtwYXJhbX0gVGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXQuXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgSmF2YSBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWxlY29tbWVudCIgbmFtZVw9ImZpbGVjb21tZW50Ij4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogQ29weXJpZ2h0IChjKSAke3llYXJ9IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4gKlxuICogQ29udHJpYnV0b3JzXDpcbiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcbiAqIEBzaW5jZSAzLjJcbiAqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCI+LyoqXG4gKiBcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cblxuJHt0eXBlY29tbWVudH1cbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9ja1xuJHtleGNlcHRpb25fdmFyfS5wcmludFN0YWNrVHJhY2UoKTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmJvZHkiIG5hbWVcPSJjb25zdHJ1Y3RvcmJvZHkiPiR7Ym9keV9zdGF0ZW1lbnR9XG4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWI8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5Ij5yZXR1cm4gJHtmaWVsZH07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjbGFzc2JvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNsYXNzIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNsYXNzYm9keSIgbmFtZVw9ImNsYXNzYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImludGVyZmFjZWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGludGVyZmFjZSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5pbnRlcmZhY2Vib2R5IiBuYW1lXD0iaW50ZXJmYWNlYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImVudW1ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmVudW1ib2R5IiBuYW1lXD0iZW51bWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJhbm5vdGF0aW9uYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgYW5ub3RhdGlvbiB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5hbm5vdGF0aW9uYm9keSIgbmFtZVw9ImFubm90YXRpb25ib2R5Ij5cbjwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzNjY2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI01vbiBGZWIgMjEgMTQ6MTc6MzYgRVNUIDIwMDUKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MgotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTEKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTEKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvQmVuY2htYXJrIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2JlbmNobWFya3MvT3BlbkNsb3NlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvQmVuY2htYXJrIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2JlbmNobWFya3MvT3BlbkNsb3NlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzJlMTk1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0JlbmNobWFyayBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9iZW5jaG1hcmtzL09wZW5DbG9zZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5iZW5jaG1hcmtzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNsb3NlVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIE9wZW5DbG9zZVRlc3QuCi0gICAgICogQHBhcmFtIHRlc3ROYW1lCi0gICAgICovCi0gICAgcHVibGljIE9wZW5DbG9zZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSBOYXZpZ2F0b3IgaXMgaW5pdGlhbGx5IHBvcHVsYXRlZCB3aXRoCi0gICAgICogdGhlIGNvcnJlY3QgZWxlbWVudHMgZnJvbSB0aGUgd29ya3NwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQ2xvc2UoKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL0FsbFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYzUyODMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQWxsVGVzdHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsVGVzdHMoKSB7Ci0gICAgICAgIGFkZFRlc3QobmV3IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmFjdGlvbi5BbGxUZXN0cygpKTsKLSAgICAgICBhZGRUZXN0KG5ldyBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5pbWFnZXMuQWxsVGVzdHMoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuQWxsVGVzdHMoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9hY3Rpb24vQWxsVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvYWN0aW9uL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NjNmNzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9hY3Rpb24vQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5hY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IEFsbFRlc3RzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBBbGxUZXN0cygpIHsKLSAgICAgICAgYWRkVGVzdFN1aXRlKENvbnRyaWJ1dGlvbkl0ZW1UZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKE1lbnVNYW5hZ2VyVGVzdC5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9hY3Rpb24vQ29udHJpYnV0aW9uSXRlbVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvYWN0aW9uL0NvbnRyaWJ1dGlvbkl0ZW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjJiMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9hY3Rpb24vQ29udHJpYnV0aW9uSXRlbVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7Ci0KLS8qKgotICogVGVzdHMgZm9yIHRoZSBbSV1Db250cmlidXRpb25JdGVtIEFQSS4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgQ29udHJpYnV0aW9uSXRlbVRlc3QgZXh0ZW5kcyBKRmFjZUFjdGlvblRlc3QgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB0ZXN0IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIENvbnRyaWJ1dGlvbkl0ZW1UZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgYSBjb250cmlidXRpb24gaXRlbSdzIHBhcmVudCBsaW5rIGlzIHNldCB3aGVuIGFkZGVkIHRvIGEKLSAgICAgKiBjb250cmlidXRpb24gbWFuYWdlciwgYW5kIGNsZWFyZWQgd2hlbiB0aGUgaXRlbSBpcyByZW1vdmVkLgotICAgICAqIFRoaXMgaXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yOgotICAgICAqIEJ1ZyA4MDU2OSBbQ29udHJpYnV0aW9uc10gUGFyZW50IG9mIGNvbnRyaWJ1dGlvbiBpdGVtIG5vdCBjbGVhcmVkIHdoZW4gaXRlbSByZW1vdmVkIGZyb20gbWFuYWdlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJlbnRMaW5rKCkgewotICAgICAgICBJQ29udHJpYnV0aW9uTWFuYWdlciBtZ3IgPSBuZXcgRHVtbXlDb250cmlidXRpb25NYW5hZ2VyKCk7Ci0gICAgICAgIENvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKG5ldyBEdW1teUFjdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChpdGVtLmdldFBhcmVudCgpKTsKLSAgICAgICAgbWdyLmFkZChpdGVtKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1nciwgaXRlbS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIG1nci5yZW1vdmUoaXRlbSk7Ci0gICAgICAgIGFzc2VydE51bGwoaXRlbS5nZXRQYXJlbnQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9hY3Rpb24vRHVtbXlBY3Rpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvYWN0aW9uL0R1bW15QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMmNjZDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9hY3Rpb24vRHVtbXlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotCi0KLS8qKgotICogQSBkdW1teSBhY3Rpb24sIHVzZWQganVzdCBmb3IgdGVzdGluZy4KLSAqLwotY2xhc3MgRHVtbXlBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotICAgIAotICAgIHN0YXRpYyBpbnQgQ291bnQgPSAwOwotICAgIAotICAgIHB1YmxpYyBEdW1teUFjdGlvbigpIHsKLSAgICAgICAgc3VwZXIoIkR1bW15QWN0aW9uICIgKyArK0NvdW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2FjdGlvbi9EdW1teUNvbnRyaWJ1dGlvbk1hbmFnZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvYWN0aW9uL0R1bW15Q29udHJpYnV0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWFkYmFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvYWN0aW9uL0R1bW15Q29udHJpYnV0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25NYW5hZ2VyOwotCi0KLS8qKgotICogQSBkdW1teSBjb250cmlidXRpb24gbWFuYWdlciwgdXNlZCBqdXN0IGZvciB0ZXN0aW5nLgotICogRG9lcyBub3QgcG9wdWxhdGUgYW55IHdpZGdldHMuCi0gKi8KLWNsYXNzIER1bW15Q29udHJpYnV0aW9uTWFuYWdlciBleHRlbmRzIENvbnRyaWJ1dGlvbk1hbmFnZXIgewotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIC8vIGlnbm9yZQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvYWN0aW9uL0pGYWNlQWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9hY3Rpb24vSkZhY2VBY3Rpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZWYzNDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9hY3Rpb24vSkZhY2VBY3Rpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuYWN0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBhbGwgSkZhY2UgYWN0aW9uIHRlc3RzLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKRmFjZUFjdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheTsKLSAgICBwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB0ZXN0IHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdGVzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBKRmFjZUFjdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCSAgICBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JICAgIGlmIChkaXNwbGF5ID09IG51bGwpIHsKLQkgICAgICAgIGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCSAgICB9Ci0JICAgIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCSAgICBzaGVsbC5zZXRTaXplKDUwMCwgNTAwKTsKLQkgICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICBzaGVsbC5kaXNwb3NlKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0gICAgICAgIHJldHVybiBkaXNwbGF5OwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0gICAgICAgIHJldHVybiBzaGVsbDsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2FjdGlvbi9NZW51TWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvYWN0aW9uL01lbnVNYW5hZ2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDc1NzJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvYWN0aW9uL01lbnVNYW5hZ2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRlc3RzIGZvciB0aGUgTWVudU1hbmFnZXIgQVBJLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNZW51TWFuYWdlclRlc3QgZXh0ZW5kcyBKRmFjZUFjdGlvblRlc3QgewotCi0gICAgcHJpdmF0ZSBpbnQgZ3JvdXBNYXJrZXJDb3VudCA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgc2VwYXJhdG9yQ291bnQgPSAwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB0ZXN0IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIE1lbnVNYW5hZ2VyVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGEgbWVudSB3aXRoIG5vIGNvbmNyZXRlIHZpc2libGUgaXRlbXMgKHRoYXQgaXMsIGlnbm9yaW5nCi0gICAgICogc2VwYXJhdG9ycyBhbmQgZ3JvdXAgbWFya2VycykgaXMgaGlkZGVuLgotICAgICAqIAotICAgICAqIEBzZWUgTWVudU1hbmFnZXIjaXNWaXNpYmxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVudVdpdGhOb0NvbmNyZXRlVmlzaWJsZUl0ZW1zSXNIaWRkZW4oKSB7Ci0gICAgICAgIE1lbnVNYW5hZ2VyIG1lbnVCYXJNZ3IgPSBjcmVhdGVNZW51QmFyTWFuYWdlcigpOwotCi0gICAgICAgIE1lbnVNYW5hZ2VyIGZpbGVNZW51ID0gY3JlYXRlTWVudU1hbmFnZXIoIkZpbGUiLCAiZ3NnbiIpOwotICAgICAgICBtZW51QmFyTWdyLmFkZChmaWxlTWVudSk7Ci0gICAgICAgIG1lbnVCYXJNZ3IudXBkYXRlQWxsKGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGdldFNoZWxsKCkuZ2V0TWVudUJhcigpLmdldEl0ZW1zKCkubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGFkZGluZyBhIGNvbmNyZXRlIHZpc2libGUgaXRlbSB0byBhIG1lbnUgd2l0aCBubyBjb25jcmV0ZQotICAgICAqIHZpc2libGUgaXRlbXMgbWFrZXMgdGhlIG1lbnUgdmlzaWJsZS4gUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNTQ3NzkgW1JDUF0KLSAgICAgKiBQcm9ibGVtIHVwZGF0aW5nIG1lbnVzLCBtZW51IG5vdCBhcHBlYXJpbmcKLSAgICAgKiAKLSAgICAgKiBAc2VlIE1lbnVNYW5hZ2VyI2lzVmlzaWJsZSgpCi0gICAgICogQHNlZSBNZW51TWFuYWdlciNtYXJrRGlydHkoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRpbmdDb25jcmV0ZUl0ZW1Ub01lbnVXaXRoTm9Db25jcmV0ZVZpc2libGVJdGVtcygpIHsKLSAgICAgICAgTWVudU1hbmFnZXIgbWVudUJhck1nciA9IGNyZWF0ZU1lbnVCYXJNYW5hZ2VyKCk7Ci0KLSAgICAgICAgTWVudU1hbmFnZXIgZmlsZU1lbnVNZ3IgPSBjcmVhdGVNZW51TWFuYWdlcigiRmlsZSIsICJnc2duIik7Ci0gICAgICAgIG1lbnVCYXJNZ3IuYWRkKGZpbGVNZW51TWdyKTsKLSAgICAgICAgbWVudUJhck1nci51cGRhdGVBbGwoZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgTWVudSBtZW51QmFyID0gZ2V0U2hlbGwoKS5nZXRNZW51QmFyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtZW51QmFyLmdldEl0ZW1zKCkubGVuZ3RoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbGVNZW51TWdyLmFkZChjcmVhdGVJdGVtKCdhJykpOwotICAgICAgICBtZW51QmFyTWdyLnVwZGF0ZUFsbChmYWxzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtZW51QmFyLmdldEl0ZW1zKCkubGVuZ3RoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygiRmlsZSIsIG1lbnVCYXIuZ2V0SXRlbXMoKVswXS5nZXRUZXh0KCkpOwotICAgICAgICAKLSAgICAgICAgTWVudSBmaWxlTWVudSA9IG1lbnVCYXIuZ2V0SXRlbXMoKVswXS5nZXRNZW51KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBmaWxlTWVudS5nZXRJdGVtcygpLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1lbnUgbWFuYWdlciB3aXRoIHRoZSBnaXZlbiBuYW1lLCBhZGRpbmcgaXRlbXMgYmFzZWQgb24gdGhlIGdpdmVuIHRlbXBsYXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0gICAgICogQHBhcmFtIHRlbXBsYXRlIHRoZSB0ZW1wbGF0ZQotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBtZW51IHdpdGggbm8gY29uY3JldGUgdmlzaWJsZSBpdGVtcwotICAgICAqLwotICAgIHByaXZhdGUgTWVudU1hbmFnZXIgY3JlYXRlTWVudU1hbmFnZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB0ZW1wbGF0ZSkgewotICAgICAgICBNZW51TWFuYWdlciBtZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKG5hbWUpOwotICAgICAgICBhZGRJdGVtcyhtZW51TWdyLCB0ZW1wbGF0ZSk7Ci0gICAgICAgIHJldHVybiBtZW51TWdyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRJdGVtcyhJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgdGVtcGxhdGUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wbGF0ZS5sZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgICAgICBtYW5hZ2VyLmFkZChjcmVhdGVJdGVtKHRlbXBsYXRlLmNoYXJBdChpKSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSUNvbnRyaWJ1dGlvbkl0ZW0gY3JlYXRlSXRlbShjaGFyIHRlbXBsYXRlKSB7Ci0gICAgICAgIHN3aXRjaCAodGVtcGxhdGUpIHsKLSAgICAgICAgCWNhc2UgJ2cnOgotICAgICAgICAJICAgIHJldHVybiBuZXcgR3JvdXBNYXJrZXIoInRlc3RHcm91cCIgKyBncm91cE1hcmtlckNvdW50KyspOwotICAgICAgICAJY2FzZSAncyc6Ci0gICAgICAgIAkgICAgcmV0dXJuIG5ldyBTZXBhcmF0b3IoInRlc3RTZXBhcmF0b3IiICsgc2VwYXJhdG9yQ291bnQrKyk7Ci0gICAgICAgIAljYXNlICdhJzogewotICAgICAgICAJICAgIElBY3Rpb24gYWN0aW9uID0gbmV3IER1bW15QWN0aW9uKCk7Ci0gICAgICAgIAkgICAgcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0gICAgICAgIAl9Ci0gICAgICAgIAljYXNlICduJzogewotICAgICAgICAJICAgIElBY3Rpb24gYWN0aW9uID0gbmV3IER1bW15QWN0aW9uKCk7Ci0gICAgICAgIAkgICAgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLSAgICAgICAgCSAgICBpdGVtLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAJICAgIHJldHVybiBpdGVtOwotICAgICAgICAJfQotICAgICAgICAJZGVmYXVsdDoKLSAgICAgICAgCSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHRlbXBsYXRlIGNoYXI6ICIgKyB0ZW1wbGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlTWVudUJhck1hbmFnZXIoKSB7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLSAgICAgICAgTWVudU1hbmFnZXIgbWVudU1nciA9IG5ldyBNZW51TWFuYWdlcigpOwotICAgICAgICBNZW51IG1lbnVCYXIgPSBtZW51TWdyLmNyZWF0ZU1lbnVCYXIoc2hlbGwpOwotICAgICAgICBzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotICAgICAgICByZXR1cm4gbWVudU1ncjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RpYWxvZ3MvRGlhbG9nU2V0dGluZ3NUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2RpYWxvZ3MvRGlhbG9nU2V0dGluZ3NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDExMjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9kaWFsb2dzL0RpYWxvZ1NldHRpbmdzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotCi1wdWJsaWMgY2xhc3MgRGlhbG9nU2V0dGluZ3NUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVMVEEgPSAwLjAwMDAwMDFmOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEVTVF9TVFJJTkdTID0geyAidmFsdWUiLAotCQkJIiB2YWx1ZSB3aXRoIHNwYWNlcyAiLCAidmFsdWUud2l0aC5tYW55LmRvdHMiLAotCQkJInZhbHVlX3dpdGhfdW5kZXJzY29yZXMiLCAidmFsdWU8d2l0aDxsZXNzdGhhbiIsCi0JCQkidmFsdWU+d2l0aD5ncmVhdGVydGhhbiIsICJ2YWx1ZSZ3aXRoJmFtcGVyc2FuZCIsCi0JCQkidmFsdWVcIndpdGhcInF1b3RlIiwgInZhbHVlI3dpdGgjaGFzaCIsICIiLAotCQkJIlxudmFsdWVcbndpdGhcbm5ld2xpbmVzXG4iLCAiXHR2YWx1ZVx0d2l0aFx0dGFiXHQiLAotCQkJIlxydmFsdWVccndpdGhccnJldHVyblxyIiwgfTsKLQotCXB1YmxpYyB2b2lkIHRlc3REaWFsb2dTZXR0aW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9TVFJJTkdTLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBTdHJpbmcgbmFtZSA9IFRFU1RfU1RSSU5HU1tpXTsKLQkJCXRlc3RQdXRBbmRHZXRXaXRoVGl0bGUobmV3IERpYWxvZ1NldHRpbmdzQ2hlY2tlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcmVwYXJlQW5kQ2hlY2tCZWZvcmVTZXJpYWxpemF0aW9uKAotCQkJCQkJSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUpIHsKLQkJCQkJLy8gbm90aGluZwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGNoZWNrQWZ0ZXJEZXNlcmlhbGl6YXRpb24oCi0JCQkJCQlJRGlhbG9nU2V0dGluZ3MgZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MpIHsKLQkJCQkJYXNzZXJ0RXF1YWxzKG5hbWUsIGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfSwgbmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmV3U2VjdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9TVFJJTkdTLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBTdHJpbmcgbmFtZSA9IFRFU1RfU1RSSU5HU1tpXTsKLQkJCXRlc3RQdXRBbmRHZXQobmV3IERpYWxvZ1NldHRpbmdzQ2hlY2tlcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHByZXBhcmVBbmRDaGVja0JlZm9yZVNlcmlhbGl6YXRpb24oCi0JCQkJCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3NUb1NlcmlhbGl6ZSkgewotCQkJCQlhc3NlcnRFcXVhbHMoMCwKLQkJCQkJCQlkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplLmdldFNlY3Rpb25zKCkubGVuZ3RoKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUKLQkJCQkJCQkuZ2V0U2VjdGlvbihuYW1lKSk7Ci0JCQkJCWRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUuYWRkTmV3U2VjdGlvbihuYW1lKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKDEsCi0JCQkJCQkJZGlhbG9nU2V0dGluZ3NUb1NlcmlhbGl6ZS5nZXRTZWN0aW9ucygpLmxlbmd0aCk7Ci0JCQkJCWFzc2VydE5vdE51bGwoZGlhbG9nU2V0dGluZ3NUb1NlcmlhbGl6ZS5nZXRTZWN0aW9uKG5hbWUpKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKG5hbWUsIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUuZ2V0U2VjdGlvbigKLQkJCQkJCQluYW1lKS5nZXROYW1lKCkpOwotCQkJCQlhc3NlcnRFcXVhbHMobmFtZSwKLQkJCQkJCQlkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplLmdldFNlY3Rpb25zKClbMF0KLQkJCQkJCQkJCS5nZXROYW1lKCkpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGNoZWNrQWZ0ZXJEZXNlcmlhbGl6YXRpb24oCi0JCQkJCQlJRGlhbG9nU2V0dGluZ3MgZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MpIHsKLQkJCQkJYXNzZXJ0RXF1YWxzKDEsCi0JCQkJCQkJZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MuZ2V0U2VjdGlvbnMoKS5sZW5ndGgpOwotCQkJCQlhc3NlcnROb3ROdWxsKGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzLmdldFNlY3Rpb24obmFtZSkpOwotCQkJCQlhc3NlcnRFcXVhbHMobmFtZSwgZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MuZ2V0U2VjdGlvbigKLQkJCQkJCQluYW1lKS5nZXROYW1lKCkpOwotCQkJCQlhc3NlcnRFcXVhbHMobmFtZSwKLQkJCQkJCQlkZXNlcmlhbGl6ZWREaWFsb2dTZXR0aW5ncy5nZXRTZWN0aW9ucygpWzBdCi0JCQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gZmlsbCBhIERpYWxvZ1NldHRpbmdzIG9iamVjdCB0byBiZSBjaGVja2VkIGxhdGVyIGJ5Ci0JICogY2hlY2suCi0JICogCi0JICogQHBhcmFtIG1lbWVudG8KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlsbChJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MpIHsKLQkJZGlhbG9nU2V0dGluZ3MucHV0KCJib29sZWFuS2V5IiwgdHJ1ZSk7Ci0JCWRpYWxvZ1NldHRpbmdzLnB1dCgiZmxvYXRLZXkiLCAwLjRmKTsKLQkJZGlhbG9nU2V0dGluZ3MucHV0KCJkb3VibGVLZXkiLCAwLjUpOwotCQlkaWFsb2dTZXR0aW5ncy5wdXQoImludGVnZXJLZXkiLCAzMjQ3NjUpOwotCQlkaWFsb2dTZXR0aW5ncy5wdXQoImxvbmdLZXkiLCAxMzI0NzY1TCk7Ci0JCWRpYWxvZ1NldHRpbmdzLnB1dCgic3RyaW5nS2V5IiwgImEgc3RyaW5nIik7Ci0JCWRpYWxvZ1NldHRpbmdzLnB1dCgic3RyaW5nQXJyYXlLZXkiLCBuZXcgU3RyaW5nW10geyAic29tZSB0ZXh0IGRhdGExIiwKLQkJCQkic29tZSB0ZXh0IGRhdGEyIiB9KTsKLQkJZmluYWwgSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBkaWFsb2dTZXR0aW5ncy5hZGROZXdTZWN0aW9uKCJjaGlsZDEiKTsKLQkJc2VjdGlvbi5hZGROZXdTZWN0aW9uKCJjaGlsZDIiKTsKLQkJc2VjdGlvbi5hZGROZXdTZWN0aW9uKCJjaGlsZDMiKTsKLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSB2YWx1ZXMgc2V0IGJ5IGZpbGwgYXJlIHN0aWxsIHRoZXJlLgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrKElEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncykgewotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGlhbG9nU2V0dGluZ3MuZ2V0Qm9vbGVhbigiYm9vbGVhbktleSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAuNGYsIGRpYWxvZ1NldHRpbmdzLmdldEZsb2F0KCJmbG9hdEtleSIpLCAwLjRmKTsKLQkJYXNzZXJ0RXF1YWxzKDAuNGYsIGRpYWxvZ1NldHRpbmdzLmdldERvdWJsZSgiZG91YmxlS2V5IiksIDAuNSk7Ci0JCWFzc2VydEVxdWFscygzMjQ3NjUsIGRpYWxvZ1NldHRpbmdzLmdldEludCgiaW50ZWdlcktleSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEzMjQ3NjVMLCBkaWFsb2dTZXR0aW5ncy5nZXRMb25nKCJsb25nS2V5IikpOwotCQlhc3NlcnRFcXVhbHMoImEgc3RyaW5nIiwgZGlhbG9nU2V0dGluZ3MuZ2V0KCJzdHJpbmdLZXkiKSk7Ci0JCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gZGlhbG9nU2V0dGluZ3MuZ2V0QXJyYXkoInN0cmluZ0FycmF5S2V5Iik7Ci0JCWFzc2VydEVxdWFscygyLCBzdHJpbmdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoInNvbWUgdGV4dCBkYXRhMSIsIHN0cmluZ0FycmF5WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJzb21lIHRleHQgZGF0YTIiLCBzdHJpbmdBcnJheVsxXSk7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gZGlhbG9nU2V0dGluZ3MuZ2V0U2VjdGlvbigiY2hpbGQxIik7Ci0JCWFzc2VydE5vdE51bGwoc2VjdGlvbik7Ci0JCWFzc2VydE5vdE51bGwoc2VjdGlvbi5nZXRTZWN0aW9uKCJjaGlsZDIiKSk7Ci0JCWFzc2VydE5vdE51bGwoc2VjdGlvbi5nZXRTZWN0aW9uKCJjaGlsZDMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNlY3Rpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0ZXN0UHV0QW5kR2V0KG5ldyBEaWFsb2dTZXR0aW5nc0NoZWNrZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHByZXBhcmVBbmRDaGVja0JlZm9yZVNlcmlhbGl6YXRpb24oCi0JCQkJCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplKSB7Ci0JCQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBuZXcgRGlhbG9nU2V0dGluZ3MoInNvbWUgc2VjdGlvbiIpOwotCQkJCWZpbGwoc2VjdGlvbik7Ci0JCQkJY2hlY2soc2VjdGlvbik7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJzb21lIHNlY3Rpb24iLCBzZWN0aW9uLmdldE5hbWUoKSk7Ci0JCQkJZGlhbG9nU2V0dGluZ3NUb1NlcmlhbGl6ZS5hZGRTZWN0aW9uKHNlY3Rpb24pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjaGVja0FmdGVyRGVzZXJpYWxpemF0aW9uKAotCQkJCQlJRGlhbG9nU2V0dGluZ3MgZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MpIHsKLQkJCQlmaW5hbCBJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzCi0JCQkJCQkuZ2V0U2VjdGlvbigic29tZSBzZWN0aW9uIik7Ci0JCQkJYXNzZXJ0Tm90TnVsbChzZWN0aW9uKTsKLQkJCQlhc3NlcnRFcXVhbHMoInNvbWUgc2VjdGlvbiIsIHNlY3Rpb24uZ2V0TmFtZSgpKTsKLQkJCQljaGVjayhzZWN0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEtleXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfU1RSSU5HUy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgU3RyaW5nIGtleSA9IFRFU1RfU1RSSU5HU1tpXTsKLQkJCXRlc3RQdXRBbmRHZXQobmV3IERpYWxvZ1NldHRpbmdzQ2hlY2tlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcmVwYXJlQW5kQ2hlY2tCZWZvcmVTZXJpYWxpemF0aW9uKAotCQkJCQkJSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUpIHsKLQkJCQkJYXNzZXJ0TnVsbChkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplLmdldChrZXkpKTsKLQkJCQkJZGlhbG9nU2V0dGluZ3NUb1NlcmlhbGl6ZS5wdXQoa2V5LCAic29tZSBzdHJpbmciKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKCJzb21lIHN0cmluZyIsIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUKLQkJCQkJCQkuZ2V0KGtleSkpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGNoZWNrQWZ0ZXJEZXNlcmlhbGl6YXRpb24oCi0JCQkJCQlJRGlhbG9nU2V0dGluZ3MgZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MpIHsKLQkJCQkJYXNzZXJ0RXF1YWxzKCJzb21lIHN0cmluZyIsIGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzCi0JCQkJCQkJLmdldChrZXkpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfU1RSSU5HUy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgU3RyaW5nIHZhbHVlID0gVEVTVF9TVFJJTkdTW2ldOwotCQkJdGVzdFB1dEFuZEdldChuZXcgRGlhbG9nU2V0dGluZ3NDaGVja2VyKCkgewotCi0JCQkJcHVibGljIHZvaWQgcHJlcGFyZUFuZENoZWNrQmVmb3JlU2VyaWFsaXphdGlvbigKLQkJCQkJCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplKSB7Ci0JCQkJCWRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUucHV0KCJzb21lS2V5IiwgdmFsdWUpOwotCQkJCQlhc3NlcnRFcXVhbHModmFsdWUsIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUKLQkJCQkJCQkuZ2V0KCJzb21lS2V5IikpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGNoZWNrQWZ0ZXJEZXNlcmlhbGl6YXRpb24oCi0JCQkJCQlJRGlhbG9nU2V0dGluZ3MgZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MpIHsKLQkJCQkJYXNzZXJ0RXF1YWxzKHZhbHVlLCBkZXNlcmlhbGl6ZWREaWFsb2dTZXR0aW5ncwotCQkJCQkJCS5nZXQoInNvbWVLZXkiKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfU1RSSU5HUy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgU3RyaW5nIHZhbHVlMSA9IFRFU1RfU1RSSU5HU1tpXTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgVEVTVF9TVFJJTkdTLmxlbmd0aDsgaisrKSB7Ci0JCQkJZmluYWwgU3RyaW5nIHZhbHVlMiA9IFRFU1RfU1RSSU5HU1tqXTsKLQkJCQlmaW5hbCBTdHJpbmdbXSB2YWx1ZSA9IG5ldyBTdHJpbmdbXSB7IHZhbHVlMSwgdmFsdWUyIH07Ci0JCQkJdGVzdFB1dEFuZEdldChuZXcgRGlhbG9nU2V0dGluZ3NDaGVja2VyKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHByZXBhcmVBbmRDaGVja0JlZm9yZVNlcmlhbGl6YXRpb24oCi0JCQkJCQkJSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUpIHsKLQkJCQkJCWRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUucHV0KCJzb21lS2V5IiwgdmFsdWUpOwotCQkJCQkJYXNzZXJ0RXF1YWxzKDIsIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUKLQkJCQkJCQkJLmdldEFycmF5KCJzb21lS2V5IikubGVuZ3RoKTsKLQkJCQkJCWFzc2VydEVxdWFscyh2YWx1ZTEsIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUKLQkJCQkJCQkJLmdldEFycmF5KCJzb21lS2V5IilbMF0pOwotCQkJCQkJYXNzZXJ0RXF1YWxzKHZhbHVlMiwgZGlhbG9nU2V0dGluZ3NUb1NlcmlhbGl6ZQotCQkJCQkJCQkuZ2V0QXJyYXkoInNvbWVLZXkiKVsxXSk7Ci0JCQkJCQlkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplLnB1dCgiYW5vdGhlcktleTEiLAotCQkJCQkJCQluZXcgU3RyaW5nW10ge30pOwotCQkJCQkJLy8gVE9ETyBzZWUgYnVnIDk4MzMyLCB3ZSBzaG91bGQgaGFuZGxlIG51bGwgY2FzZXMgdG9vCi0JCQkJCQkvLyBkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplLnB1dCgiYW5vdGhlcktleTIiLAotCQkJCQkJLy8gbmV3IFN0cmluZ1tdIHsgbnVsbCB9KTsKLQkJCQkJCS8vIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUucHV0KCJhbm90aGVyS2V5MyIsCi0JCQkJCQkvLyBuZXcgU3RyaW5nW10geyAic3RyaW5nIiwgbnVsbCB9KTsKLQkJCQkJCS8vIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUucHV0KCJhbm90aGVyS2V5NCIsCi0JCQkJCQkvLyBuZXcgU3RyaW5nW10geyBudWxsLCAic3RyaW5nIiwgbnVsbCB9KTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIGNoZWNrQWZ0ZXJEZXNlcmlhbGl6YXRpb24oCi0JCQkJCQkJSURpYWxvZ1NldHRpbmdzIGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzKSB7Ci0JCQkJCQlhc3NlcnRFcXVhbHMoMiwgZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MKLQkJCQkJCQkJLmdldEFycmF5KCJzb21lS2V5IikubGVuZ3RoKTsKLQkJCQkJCWFzc2VydEVxdWFscyh2YWx1ZTEsIGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzCi0JCQkJCQkJCS5nZXRBcnJheSgic29tZUtleSIpWzBdKTsKLQkJCQkJCWFzc2VydEVxdWFscyh2YWx1ZTIsIGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzCi0JCQkJCQkJCS5nZXRBcnJheSgic29tZUtleSIpWzFdKTsKLQkJCQkJCWFzc2VydEVxdWFscygwLCBkZXNlcmlhbGl6ZWREaWFsb2dTZXR0aW5ncwotCQkJCQkJCQkuZ2V0QXJyYXkoImFub3RoZXJLZXkxIikubGVuZ3RoKTsKLQkJCQkJCS8vIFRPRE8gc2VlIGJ1ZyA5ODMzMiwgd2Ugc2hvdWxkIGhhbmRsZSBudWxsIGNhc2VzIHRvbwotCQkJCQkJLy8gYXNzZXJ0RXF1YWxzKDEsIGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzCi0JCQkJCQkvLyAuZ2V0QXJyYXkoImFub3RoZXJLZXkyIikubGVuZ3RoKTsKLQkJCQkJCS8vIGFzc2VydEVxdWFscyhudWxsLCBkZXNlcmlhbGl6ZWREaWFsb2dTZXR0aW5ncwotCQkJCQkJLy8gLmdldEFycmF5KCJhbm90aGVyS2V5MiIpWzBdKTsKLQkJCQkJCS8vIGFzc2VydEVxdWFscygyLCBkZXNlcmlhbGl6ZWREaWFsb2dTZXR0aW5ncwotCQkJCQkJLy8gLmdldEFycmF5KCJhbm90aGVyS2V5MyIpLmxlbmd0aCk7Ci0JCQkJCQkvLyBhc3NlcnRFcXVhbHMoInN0cmluZyIsIGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzCi0JCQkJCQkvLyAuZ2V0QXJyYXkoImFub3RoZXJLZXkzIilbMF0pOwotCQkJCQkJLy8gYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzCi0JCQkJCQkvLyAuZ2V0QXJyYXkoImFub3RoZXJLZXkzIilbMV0pOwotCQkJCQkJLy8gYXNzZXJ0RXF1YWxzKDMsIGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzCi0JCQkJCQkvLyAuZ2V0QXJyYXkoImFub3RoZXJLZXk0IikubGVuZ3RoKTsKLQkJCQkJCS8vIGFzc2VydEVxdWFscyhudWxsLCBkZXNlcmlhbGl6ZWREaWFsb2dTZXR0aW5ncwotCQkJCQkJLy8gLmdldEFycmF5KCJhbm90aGVyS2V5NCIpWzBdKTsKLQkJCQkJCS8vIGFzc2VydEVxdWFscygic3RyaW5nIiwgZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MKLQkJCQkJCS8vIC5nZXRBcnJheSgiYW5vdGhlcktleTQiKVsxXSk7Ci0JCQkJCQkvLyBhc3NlcnRFcXVhbHMobnVsbCwgZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MKLQkJCQkJCS8vIC5nZXRBcnJheSgiYW5vdGhlcktleTQiKVsyXSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGVzdFB1dEFuZEdldChuZXcgRGlhbG9nU2V0dGluZ3NDaGVja2VyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBwcmVwYXJlQW5kQ2hlY2tCZWZvcmVTZXJpYWxpemF0aW9uKAotCQkJCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3NUb1NlcmlhbGl6ZSkgewotCQkJCWRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUucHV0KCJ0cnVlIiwgdHJ1ZSk7Ci0JCQkJZGlhbG9nU2V0dGluZ3NUb1NlcmlhbGl6ZS5wdXQoImZhbHNlIiwgZmFsc2UpOwotCQkJCWFzc2VydEVxdWFscyh0cnVlLCBkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplLmdldEJvb2xlYW4oInRydWUiKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplCi0JCQkJCQkuZ2V0Qm9vbGVhbigiZmFsc2UiKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNoZWNrQWZ0ZXJEZXNlcmlhbGl6YXRpb24oCi0JCQkJCUlEaWFsb2dTZXR0aW5ncyBkZXNlcmlhbGl6ZWREaWFsb2dTZXR0aW5ncykgewotCQkJCWFzc2VydEVxdWFscyh0cnVlLCBkZXNlcmlhbGl6ZWREaWFsb2dTZXR0aW5ncwotCQkJCQkJLmdldEJvb2xlYW4oInRydWUiKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZXNlcmlhbGl6ZWREaWFsb2dTZXR0aW5ncwotCQkJCQkJLmdldEJvb2xlYW4oImZhbHNlIikpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgZG91YmxlW10gdmFsdWVzID0gbmV3IGRvdWJsZVtdIHsgLTMuMTQxNSwgMSwgMCwgNDU1NC40NTIzNSwKLQkJCQlEb3VibGUuTUFYX1ZBTFVFLCBEb3VibGUuTUlOX1ZBTFVFLCBEb3VibGUuTmFOLAotCQkJCURvdWJsZS5QT1NJVElWRV9JTkZJTklUWSwgRG91YmxlLk5FR0FUSVZFX0lORklOSVRZIH07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIGRvdWJsZSB2YWx1ZSA9IHZhbHVlc1tpXTsKLQkJCXRlc3RQdXRBbmRHZXQobmV3IERpYWxvZ1NldHRpbmdzQ2hlY2tlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcmVwYXJlQW5kQ2hlY2tCZWZvcmVTZXJpYWxpemF0aW9uKAotCQkJCQkJSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUpIHsKLQkJCQkJZGlhbG9nU2V0dGluZ3NUb1NlcmlhbGl6ZS5wdXQoInNvbWVLZXkiLCB2YWx1ZSk7Ci0JCQkJCWZpbmFsIGRvdWJsZSBkID0gZGlhbG9nU2V0dGluZ3NUb1NlcmlhbGl6ZQotCQkJCQkJCS5nZXREb3VibGUoInNvbWVLZXkiKTsKLQkJCQkJaWYgKERvdWJsZS5pc05hTih2YWx1ZSkpIHsKLQkJCQkJCWFzc2VydFRydWUoRG91YmxlLmlzTmFOKGQpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFzc2VydEVxdWFscyh2YWx1ZSwgZCwgREVMVEEpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgY2hlY2tBZnRlckRlc2VyaWFsaXphdGlvbigKLQkJCQkJCUlEaWFsb2dTZXR0aW5ncyBkZXNlcmlhbGl6ZWREaWFsb2dTZXR0aW5ncykgewotCQkJCQlmaW5hbCBkb3VibGUgZCA9IGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzCi0JCQkJCQkJLmdldERvdWJsZSgic29tZUtleSIpOwotCQkJCQlpZiAoRG91YmxlLmlzTmFOKHZhbHVlKSkgewotCQkJCQkJYXNzZXJ0VHJ1ZShEb3VibGUuaXNOYU4oZCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYXNzZXJ0RXF1YWxzKHZhbHVlLCBkLCBERUxUQSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGbG9hdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIGZsb2F0W10gdmFsdWVzID0gbmV3IGZsb2F0W10geyAtMy4xNDE1ZiwgMSwgMCwgNDU1NC40NTIzNWYsCi0JCQkJRmxvYXQuTUFYX1ZBTFVFLCBGbG9hdC5NSU5fVkFMVUUsIEZsb2F0Lk5hTiwKLQkJCQlGbG9hdC5QT1NJVElWRV9JTkZJTklUWSwgRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkgfTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgZmxvYXQgdmFsdWUgPSB2YWx1ZXNbaV07Ci0JCQl0ZXN0UHV0QW5kR2V0KG5ldyBEaWFsb2dTZXR0aW5nc0NoZWNrZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJlcGFyZUFuZENoZWNrQmVmb3JlU2VyaWFsaXphdGlvbigKLQkJCQkJCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplKSB7Ci0JCQkJCWRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUucHV0KCJzb21lS2V5IiwgdmFsdWUpOwotCQkJCQlmaW5hbCBmbG9hdCBmID0gZGlhbG9nU2V0dGluZ3NUb1NlcmlhbGl6ZQotCQkJCQkJCS5nZXRGbG9hdCgic29tZUtleSIpOwotCQkJCQlpZiAoRmxvYXQuaXNOYU4odmFsdWUpKSB7Ci0JCQkJCQlhc3NlcnRUcnVlKEZsb2F0LmlzTmFOKGYpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFzc2VydEVxdWFscyh2YWx1ZSwgZiwgREVMVEEpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgY2hlY2tBZnRlckRlc2VyaWFsaXphdGlvbigKLQkJCQkJCUlEaWFsb2dTZXR0aW5ncyBkZXNlcmlhbGl6ZWREaWFsb2dTZXR0aW5ncykgewotCQkJCQlmaW5hbCBmbG9hdCBmID0gZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MKLQkJCQkJCQkuZ2V0RmxvYXQoInNvbWVLZXkiKTsKLQkJCQkJaWYgKEZsb2F0LmlzTmFOKHZhbHVlKSkgewotCQkJCQkJYXNzZXJ0VHJ1ZShGbG9hdC5pc05hTihmKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhc3NlcnRFcXVhbHModmFsdWUsIGYsIERFTFRBKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludFtdIHZhbHVlcyA9IG5ldyBpbnRbXSB7IDM2MjU0LCAwLCAxLCAtMzYyNTQsIEludGVnZXIuTUFYX1ZBTFVFLAotCQkJCUludGVnZXIuTUlOX1ZBTFVFIH07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIGludCB2YWx1ZSA9IHZhbHVlc1tpXTsKLQkJCXRlc3RQdXRBbmRHZXQobmV3IERpYWxvZ1NldHRpbmdzQ2hlY2tlcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHByZXBhcmVBbmRDaGVja0JlZm9yZVNlcmlhbGl6YXRpb24oCi0JCQkJCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3NUb1NlcmlhbGl6ZSkgewotCQkJCQlkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplLnB1dCgic29tZUtleSIsIHZhbHVlKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKHZhbHVlLCBkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplCi0JCQkJCQkJLmdldEludCgic29tZUtleSIpKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBjaGVja0FmdGVyRGVzZXJpYWxpemF0aW9uKAotCQkJCQkJSURpYWxvZ1NldHRpbmdzIGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzKSB7Ci0JCQkJCWFzc2VydEVxdWFscyh2YWx1ZSwgZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MKLQkJCQkJCQkuZ2V0SW50KCJzb21lS2V5IikpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldExvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlsb25nW10gdmFsdWVzID0gbmV3IGxvbmdbXSB7IDM2MjU0TCwgMEwsIDFMLCAtMzYyNTRMLCBMb25nLk1BWF9WQUxVRSwKLQkJCQlMb25nLk1JTl9WQUxVRSB9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBsb25nIHZhbHVlID0gdmFsdWVzW2ldOwotCQkJdGVzdFB1dEFuZEdldChuZXcgRGlhbG9nU2V0dGluZ3NDaGVja2VyKCkgewotCi0JCQkJcHVibGljIHZvaWQgcHJlcGFyZUFuZENoZWNrQmVmb3JlU2VyaWFsaXphdGlvbigKLQkJCQkJCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5nc1RvU2VyaWFsaXplKSB7Ci0JCQkJCWRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUucHV0KCJzb21lS2V5IiwgdmFsdWUpOwotCQkJCQlhc3NlcnRFcXVhbHModmFsdWUsIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUKLQkJCQkJCQkuZ2V0TG9uZygic29tZUtleSIpKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBjaGVja0FmdGVyRGVzZXJpYWxpemF0aW9uKAotCQkJCQkJSURpYWxvZ1NldHRpbmdzIGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzKSB7Ci0JCQkJCWFzc2VydEVxdWFscyh2YWx1ZSwgZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MKLQkJCQkJCQkuZ2V0TG9uZygic29tZUtleSIpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNlY3Rpb24oKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNlY3Rpb25zKCkgewotCX0KLQotCXByaXZhdGUgc3RhdGljIGludGVyZmFjZSBEaWFsb2dTZXR0aW5nc0NoZWNrZXIgewotCQl2b2lkIHByZXBhcmVBbmRDaGVja0JlZm9yZVNlcmlhbGl6YXRpb24oCi0JCQkJSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUpOwotCi0JCXZvaWQgY2hlY2tBZnRlckRlc2VyaWFsaXphdGlvbigKLQkJCQlJRGlhbG9nU2V0dGluZ3MgZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0UHV0QW5kR2V0KERpYWxvZ1NldHRpbmdzQ2hlY2tlciBkaWFsb2dTZXR0aW5nc0NoZWNrZXIpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0ZXN0UHV0QW5kR2V0V2l0aFRpdGxlKGRpYWxvZ1NldHRpbmdzQ2hlY2tlciwgIkRpYWxvZ1NldHRpbmdzVGVzdCIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0UHV0QW5kR2V0V2l0aFRpdGxlKAotCQkJRGlhbG9nU2V0dGluZ3NDaGVja2VyIGRpYWxvZ1NldHRpbmdzQ2hlY2tlciwgU3RyaW5nIHNlY3Rpb25OYW1lKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUgPSBuZXcgRGlhbG9nU2V0dGluZ3MoCi0JCQkJc2VjdGlvbk5hbWUpOwotCi0JCWRpYWxvZ1NldHRpbmdzQ2hlY2tlcgotCQkJCS5wcmVwYXJlQW5kQ2hlY2tCZWZvcmVTZXJpYWxpemF0aW9uKGRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUpOwotCi0JCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWRpYWxvZ1NldHRpbmdzVG9TZXJpYWxpemUuc2F2ZSh3cml0ZXIpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQotCQlTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih3cml0ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7Ci0JCURpYWxvZ1NldHRpbmdzIGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzID0gbmV3IERpYWxvZ1NldHRpbmdzKCIiKTsKLQkJZGVzZXJpYWxpemVkRGlhbG9nU2V0dGluZ3MubG9hZChyZWFkZXIpOwotCi0JCWRpYWxvZ1NldHRpbmdzQ2hlY2tlcgotCQkJCS5jaGVja0FmdGVyRGVzZXJpYWxpemF0aW9uKGRlc2VyaWFsaXplZERpYWxvZ1NldHRpbmdzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvaW1hZ2VzL0FsbFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2ltYWdlcy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODgwYjVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvaW1hZ2VzL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuaW1hZ2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBbGxUZXN0cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxUZXN0cygpIHsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEltYWdlUmVnaXN0cnlUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFJlc291cmNlTWFuYWdlclRlc3QuY2xhc3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvaW1hZ2VzL0ltYWdlUmVnaXN0cnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL2ltYWdlcy9JbWFnZVJlZ2lzdHJ5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGYyYjZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvaW1hZ2VzL0ltYWdlUmVnaXN0cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuaW1hZ2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZVJlZ2lzdHJ5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgSW1hZ2VSZWdpc3RyeVRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oSW1hZ2VSZWdpc3RyeVRlc3QuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgewotICAgICAgICBJbWFnZVJlZ2lzdHJ5IHJlZyA9IEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQotICAgICAgICBJbWFnZSByZXN1bHQgPSByZWcuZ2V0KChTdHJpbmcpIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZWdpc3RyeSBzaG91bGQgaGFuZGxlIG51bGwiLCByZXN1bHQgPT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFN0cmluZygpIHsKLQotICAgICAgICAvLyBub3RlLCB3ZSBtdXN0IHRvdWNoIHRoZSBjbGFzcyB0byBlbnN1cmUgdGhlIHN0YXRpYyBpbml0aWFsZXIgcnVucwotICAgICAgICAvLyBzbyB0aGUgaW1hZ2UgcmVnaXN0cnkgaXMgdXAgdG8gZGF0ZQotICAgICAgICBDbGFzcyBjbGF6eiA9IERpYWxvZy5jbGFzczsKLQotICAgICAgICBTdHJpbmdbXSBpbWFnZU5hbWVzID0gbmV3IFN0cmluZ1tdIHsgRGlhbG9nLkRMR19JTUdfRVJST1IsCi0gICAgICAgICAgICAgICAgRGlhbG9nLkRMR19JTUdfSU5GTywgRGlhbG9nLkRMR19JTUdfUVVFU1RJT04sCi0gICAgICAgICAgICAgICAgRGlhbG9nLkRMR19JTUdfV0FSTklORywgRGlhbG9nLkRMR19JTUdfTUVTU0FHRV9FUlJPUiwKLSAgICAgICAgICAgICAgICBEaWFsb2cuRExHX0lNR19NRVNTQUdFX0lORk8sIERpYWxvZy5ETEdfSU1HX01FU1NBR0VfV0FSTklORyB9OwotCi0gICAgICAgIEltYWdlUmVnaXN0cnkgcmVnID0gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGltYWdlTmFtZSA9IGltYWdlTmFtZXNbaV07Ci0gICAgICAgICAgICBJbWFnZSBpbWFnZTEgPSByZWcuZ2V0KGltYWdlTmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBudWxsIGltYWdlIiwgaW1hZ2UxICE9IG51bGwpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjaGVjayB0aGF0IHdlIGdldCBub24tbnVsbCB2ZXJzaW9ucyBvZiB0aGUgPGNvZGU+SWNvbkFuZE1lc3NhZ2VEaWFsb2c8L2NvZGU+IGltYWdlcwotICAgICAqIHNvIHdlIGtub3cgdGhhdCB0aGUgY29kZSB1c2luZyB0aGVtIGNhbiByZWx5IG9uIHRoZW0uCi0gICAgICogCi0gICAgICogTm90ZSB0aGF0IHRoZXkgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGZyb20gU1dULgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEljb25NZXNzYWdlRGlhbG9nSW1hZ2VzKCkgewotCi0gICAgICAgIEljb25BbmRNZXNzYWdlRGlhbG9nIGljb25EaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhudWxsLAotICAgICAgICAgICAgICAgICJ0ZXN0R2V0RGlhbG9nSWNvbnMiLCBudWxsLCAiTWVzc2FnZSIsIFdpbmRvdy5DQU5DRUwsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgImNhbmNlbCIgfSwgMCk7Ci0KLSAgICAgICAgSW1hZ2VbXSBpbWFnZXMgPSBuZXcgSW1hZ2VbXSB7IGljb25EaWFsb2cuZ2V0RXJyb3JJbWFnZSgpLAotICAgICAgICAgICAgICAgIGljb25EaWFsb2cuZ2V0SW5mb0ltYWdlKCksIGljb25EaWFsb2cuZ2V0UXVlc3Rpb25JbWFnZSgpLAotICAgICAgICAgICAgICAgIGljb25EaWFsb2cuZ2V0V2FybmluZ0ltYWdlKCkgfTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgbnVsbCBpbWFnZSIsIGltYWdlc1tpXSAhPSBudWxsKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9pbWFnZXMvUmVzb3VyY2VNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy9pbWFnZXMvUmVzb3VyY2VNYW5hZ2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODFhNGMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvaW1hZ2VzL1Jlc291cmNlTWFuYWdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMuaW1hZ2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuRGV2aWNlUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkRldmljZVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkRldmljZVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuTG9jYWxSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwcml2YXRlIERldmljZVJlc291cmNlRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzOwotICAgIHByaXZhdGUgSW1hZ2UgdGVzdEltYWdlOwotICAgIHByaXZhdGUgSW1hZ2UgdGVzdEltYWdlMjsKLSAgICBwcml2YXRlIENvbG9yIHRlc3RDb2xvcjsKLSAgICBwcml2YXRlIENvbG9yIHRlc3RDb2xvcjI7Ci0gICAgcHJpdmF0ZSBpbnQgbnVtRHVwZXM7Ci0gICAgCi0gICAgcHJpdmF0ZSBEZXZpY2VSZXNvdXJjZU1hbmFnZXIgZ2xvYmFsUmVzb3VyY2VNYW5hZ2VyOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZShTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS51aS50ZXN0cyIsIHBhdGgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXN0RGVzY3JpcHRvciBleHRlbmRzIERldmljZVJlc291cmNlRGVzY3JpcHRvciB7Ci0gICAgICAgIERldmljZVJlc291cmNlRGVzY3JpcHRvciB0b1dyYXA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IHJlZkNvdW50ID0gMDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBUZXN0RGVzY3JpcHRvcihEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IgdG9XcmFwKSB7Ci0gICAgICAgICAgICB0aGlzLnRvV3JhcCA9IHRvV3JhcDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkRldmljZVJlc291cmNlRGVzY3JpcHRvciNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVSZXNvdXJjZShEZXZpY2UgZGV2aWNlKSB0aHJvd3MgRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHRvV3JhcC5jcmVhdGVSZXNvdXJjZShkZXZpY2UpOwotICAgICAgICAgICAgcmVmQ291bnQrKzsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkRldmljZVJlc291cmNlRGVzY3JpcHRvciNkZXN0cm95UmVzb3VyY2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lSZXNvdXJjZShPYmplY3QgcHJldmlvdXNseUNyZWF0ZWRPYmplY3QpIHsKLSAgICAgICAgICAgIHJlZkNvdW50LS07Ci0gICAgICAgICAgICB0b1dyYXAuZGVzdHJveVJlc291cmNlKHByZXZpb3VzbHlDcmVhdGVkT2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFyZzApIHsKLSAgICAgICAgICAgIGlmIChhcmcwIGluc3RhbmNlb2YgVGVzdERlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICBUZXN0RGVzY3JpcHRvciB0ZCA9IChUZXN0RGVzY3JpcHRvcilhcmcwOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiB0ZC50b1dyYXAuZXF1YWxzKHRvV3JhcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0b1dyYXAuaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIFRlc3REZXNjcmlwdG9yLnJlZkNvdW50ID0gMDsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAgIGdsb2JhbFJlc291cmNlTWFuYWdlciA9IG5ldyBEZXZpY2VSZXNvdXJjZU1hbmFnZXIoZGlzcGxheSk7Ci0gICAgICAgIHRlc3RJbWFnZSA9IGdldEltYWdlKCJpY29ucy9hbnl0aGluZy5naWYiKS5jcmVhdGVJbWFnZShkaXNwbGF5KTsKLSAgICAgICAgdGVzdEltYWdlMiA9IGdldEltYWdlKCJpY29ucy9iaW5hcnlfY28uZ2lmIikuY3JlYXRlSW1hZ2UoZGlzcGxheSk7Ci0gICAgICAgIHRlc3RDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDEwLCA0MCwgMjApKTsKLSAgICAgICAgdGVzdENvbG9yMiA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDIzMCwgMTAwLCAyNikpOwotICAgICAgICAKLSAgICAgICAgLy8gQXJyYXkgb2YgcmVzb3VyY2UgZGVzY3JpcHRvcnMgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgZHVwbGljYXRlIG9mIGVhY2ggdHlwZS4KLSAgICAgICAgLy8gSWYgeW91IG1vZGlmeSB0aGlzIGFycmF5LCBiZSBzdXJlIHRvIGFkanVzdCBudW1EdXBlcyBhcyB3ZWxsLiBOb3RlIHRoYXQgc29tZQotICAgICAgICAvLyB0ZXN0cyBpbmRleCB0aGUgYXJyYXkgZGlyZWN0bHksIHNvIGl0IGlzIGEgZ29vZCBpZGVhIHRvIGFsd2F5cyBhZGQgdG8gdGhpcwotICAgICAgICAvLyBhcnJheSByYXRoZXIgdGhhbiByZW1vdmUgZnJvbSBpdC4KLSAgICAgICAgZGVzY3JpcHRvcnMgPSBuZXcgRGV2aWNlUmVzb3VyY2VEZXNjcmlwdG9yW10gewotICAgICAgICAgICAgICAgIG5ldyBUZXN0RGVzY3JpcHRvcihnZXRJbWFnZSgiaWNvbnMvYW55dGhpbmcuZ2lmIikpLAotICAgICAgICAgICAgICAgIG5ldyBUZXN0RGVzY3JpcHRvcihnZXRJbWFnZSgiaWNvbnMvYW55dGhpbmcuZ2lmIikpLAotICAgICAgICAgICAgICAgIG5ldyBUZXN0RGVzY3JpcHRvcihnZXRJbWFnZSgiaWNvbnMvYmluYXJ5X2NvLmdpZiIpKSwKLSAgICAgICAgICAgICAgICBuZXcgVGVzdERlc2NyaXB0b3IoZ2V0SW1hZ2UoImljb25zL2JpbmFyeV9jby5naWYiKSksCi0gICAgICAgICAgICAgICAgbmV3IFRlc3REZXNjcmlwdG9yKGdldEltYWdlKCJpY29ucy9tb2NrZWRpdG9ycGFydDEuZ2lmIikpLAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG5ldyBUZXN0RGVzY3JpcHRvcihnZXRJbWFnZSgiaWNvbnMvdmlldy5naWYiKSksIC8vIDUKLSAgICAgICAgICAgICAgICBuZXcgVGVzdERlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21JbWFnZSh0ZXN0SW1hZ2UyKSksCi0gICAgICAgICAgICAgICAgbmV3IFRlc3REZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tSW1hZ2UodGVzdEltYWdlKSksCi0gICAgICAgICAgICAgICAgbmV3IFRlc3REZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tSW1hZ2UodGVzdEltYWdlKSksCi0gICAgICAgICAgICAgICAgbmV3IFRlc3REZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tSW1hZ2UodGVzdEltYWdlLCBkaXNwbGF5KSksCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbmV3IFRlc3REZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tSW1hZ2UodGVzdEltYWdlLCBkaXNwbGF5KSksICAvLyAxMAotICAgICAgICAgICAgICAgIG5ldyBUZXN0RGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUltYWdlKHRlc3RJbWFnZTIsIGRpc3BsYXkpKSwKLSAgICAgICAgICAgICAgICBuZXcgVGVzdERlc2NyaXB0b3IoQ29sb3JEZXNjcmlwdG9yLmNyZWF0ZUZyb20obmV3IFJHQigxMCwgMjAwLCA1NCkpKSwKLSAgICAgICAgICAgICAgICBuZXcgVGVzdERlc2NyaXB0b3IoQ29sb3JEZXNjcmlwdG9yLmNyZWF0ZUZyb20obmV3IFJHQigxMCwgMjAwLCA1NCkpKSwKLSAgICAgICAgICAgICAgICBuZXcgVGVzdERlc2NyaXB0b3IoQ29sb3JEZXNjcmlwdG9yLmNyZWF0ZUZyb20obmV3IFJHQigyMDAsIDIyMCwgNTQpKSksCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbmV3IFRlc3REZXNjcmlwdG9yKENvbG9yRGVzY3JpcHRvci5jcmVhdGVGcm9tKHRlc3RDb2xvcikpLCAvLyAxNQotICAgICAgICAgICAgICAgIG5ldyBUZXN0RGVzY3JpcHRvcihDb2xvckRlc2NyaXB0b3IuY3JlYXRlRnJvbSh0ZXN0Q29sb3IpKSwKLSAgICAgICAgICAgICAgICBuZXcgVGVzdERlc2NyaXB0b3IoQ29sb3JEZXNjcmlwdG9yLmNyZWF0ZUZyb20odGVzdENvbG9yMikpLAotICAgICAgICAgICAgICAgIG5ldyBUZXN0RGVzY3JpcHRvcihDb2xvckRlc2NyaXB0b3IuY3JlYXRlRnJvbSh0ZXN0Q29sb3IsIGRpc3BsYXkpKSwKLSAgICAgICAgICAgICAgICBuZXcgVGVzdERlc2NyaXB0b3IoQ29sb3JEZXNjcmlwdG9yLmNyZWF0ZUZyb20odGVzdENvbG9yLCBkaXNwbGF5KSksCi0gICAgICAgICAgICAgICAgbmV3IFRlc3REZXNjcmlwdG9yKENvbG9yRGVzY3JpcHRvci5jcmVhdGVGcm9tKHRlc3RDb2xvcjIsIGRpc3BsYXkpKQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICAvLyBMZXQgdGhlIHRlc3RzIGtub3cgaG93IG1hbnkgZHVwbGljYXRlcyBhcmUgaW4gdGhlIGFycmF5Ci0gICAgICAgIG51bUR1cGVzID0gNzsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBnbG9iYWxSZXNvdXJjZU1hbmFnZXIuZGlzcG9zZSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJEZXRlY3RlZCBsZWFrcyIsIDAsIFRlc3REZXNjcmlwdG9yLnJlZkNvdW50KTsKLSAgICAgICAgdGVzdEltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgdGVzdEltYWdlMi5kaXNwb3NlKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVzb3VyY2UoT2JqZWN0IHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkFsbG9jYXRlZCByZXNvdXJjZSB3YXMgbnVsbCIsIHJlc291cmNlKTsKLSAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSW1hZ2UpIHsKLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gKEltYWdlKSByZXNvdXJjZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkltYWdlIGlzIGRpc3Bvc2VkIiwgIWltYWdlLmlzRGlzcG9zZWQoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgZGVzY3JpcHRvcnMgdGhlbXNlbHZlcyB3Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdG9yQWxsb2NhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBbGxvY2F0ZSByZXNvdXJjZXMgZGlyZWN0bHkgdXNpbmcgdGhlIGRlc2NyaXB0b3JzLgotICAgICAgICBPYmplY3RbXSByZXNvdXJjZXMgPSBuZXcgT2JqZWN0W2Rlc2NyaXB0b3JzLmxlbmd0aF07Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBPYmplY3QgcmVzb3VyY2UgPSBuZXh0LmNyZWF0ZVJlc291cmNlKGRpc3BsYXkpOwotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhpcyByZXNvdXJjZSB3YXMgYWxsb2NhdGVkIGNvcnJlY3RseQotICAgICAgICAgICAgdmFsaWRhdGVSZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICByZXNvdXJjZXNbaV0gPSByZXNvdXJjZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQWxsb2NhdGluZyByZXNvdXJjZXMgd2l0aG91dCB0aGUgbWFuYWdlciB3aWxsIG5vdCByZXVzZSBkdXBsaWNhdGVzLCBzbyB3ZQotICAgICAgICAvLyBzaG91bGQgZ2V0IGV4YWN0bHkgb25lIHJlc291cmNlIHBlciBkZXNjcmlwdG9yLgotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRXhwZWN0aW5nIG9uZSByZXNvdXJjZSB0byBiZSBhbGxvY2F0ZWQgcGVyIGRlc2NyaXB0b3IiLCAKLSAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycy5sZW5ndGgsIFRlc3REZXNjcmlwdG9yLnJlZkNvdW50KTsKLSAgICAgICAgCi0gICAgICAgIC8vIERlYWxsb2NhdGUgcmVzb3VyY2VzIGRpcmVjdGx5IHVzaW5nIHRoZSBkZXNjcmlwdG9ycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBuZXh0LmRlc3Ryb3lSZXNvdXJjZShyZXNvdXJjZXNbaV0pOwotICAgICAgICB9ICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3REZXZpY2VNYW5hZ2VyQWxsb2NhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBbGxvY2F0ZSByZXNvdXJjZXMgZGlyZWN0bHkgdXNpbmcgdGhlIGRlc2NyaXB0b3JzLgotICAgICAgICBPYmplY3RbXSByZXNvdXJjZXMgPSBuZXcgT2JqZWN0W2Rlc2NyaXB0b3JzLmxlbmd0aF07Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBEZXZpY2VSZXNvdXJjZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBPYmplY3QgcmVzb3VyY2UgPSBnbG9iYWxSZXNvdXJjZU1hbmFnZXIuY3JlYXRlKG5leHQpOwotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhpcyByZXNvdXJjZSB3YXMgYWxsb2NhdGVkIGNvcnJlY3RseQotICAgICAgICAgICAgdmFsaWRhdGVSZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICByZXNvdXJjZXNbaV0gPSByZXNvdXJjZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRGVzY3JpcHRvcnMgY3JlYXRlZCBmcm9tIEltYWdlcyBzaG91bGQgbm90IHJlYWxsb2NhdGUgSW1hZ2VzIHdoZW4gdGhlIG9yaWdpbmFsIGNhbiBiZSByZXVzZWQiLAotICAgICAgICAgICAgICAgIHRlc3RJbWFnZSwgcmVzb3VyY2VzWzldKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFsbG9jYXRpbmcgcmVzb3VyY2VzIHdpdGhvdXQgdGhlIG1hbmFnZXIgd2lsbCByZXVzZSBkdXBsaWNhdGVzLCBzbyB0aGUgbnVtYmVyCi0gICAgICAgIC8vIG9mIHJlc291cmNlcyBzaG91bGQgZXF1YWwgdGhlIG51bWJlciBvZiB1bmlxdWUgZGVzY3JpcHRvcnMuCi0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJEdXBsaWNhdGUgZGVzY3JpcHRvcnMgc2hvdWxkIGJlIHJldXNlZCIsIAotICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzLmxlbmd0aCAtIG51bUR1cGVzLCAKLSAgICAgICAgICAgICAgICBUZXN0RGVzY3JpcHRvci5yZWZDb3VudCk7Ci0gICAgICAgIAotICAgICAgICAvLyBEZWFsbG9jYXRlIHJlc291cmNlcyBkaXJlY3RseSB1c2luZyB0aGUgZGVzY3JpcHRvcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRGV2aWNlUmVzb3VyY2VEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ2xvYmFsUmVzb3VyY2VNYW5hZ2VyLmRlc3Ryb3kobmV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFsbG9jYXRlUmVzb3VyY2VzKFJlc291cmNlTWFuYWdlciBtZ3IsIGludFtdIHRvQWxsb2NhdGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvQWxsb2NhdGUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCBqID0gdG9BbGxvY2F0ZVtpXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFsaWRhdGVSZXNvdXJjZShtZ3IuY3JlYXRlKGRlc2NyaXB0b3JzW2pdKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWxsb2NhdGVSZXNvdXJjZXMoUmVzb3VyY2VNYW5hZ2VyIG1nciwgaW50W10gdG9EZWFsbG9jYXRlKSB0aHJvd3MgRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvRGVhbGxvY2F0ZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IGogPSB0b0RlYWxsb2NhdGVbaV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1nci5kZXN0cm95KGRlc2NyaXB0b3JzW2pdKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxNYW5hZ2VyQWxsb2NhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGhlc2UgYXJyYXlzIGFyZSBpbmRpY2VzIGludG8gdGhlIGRlc2NyaXB0b3JzIGFycmF5LiBGb3IgZXhhbXBsZSwgezAsMSw3fQotICAgICAgICAvLyBpcyBhIHF1aWNrIHNob3J0aGFuZCB0byBpbmRpY2F0ZSB3ZSBzaG91bGQgYWxsb2NhdGUgcmVzb3VyY2VzIDAsIDEsIGFuZCA3LgotICAgICAgICBpbnRbXSBnUmVzb3VyY2VzID0gezAsIDEsIDUsIDMsIDcsIDEyLCAxMywgMTR9OwotICAgICAgICBpbnRbXSBsbTFSZXNvdXJjZXMgPSB7MCwgMiwgMywgNCwgMTEsIDEyLCAxMywgMTV9OwotICAgICAgICBpbnRbXSBsbTJSZXNvdXJjZXMgPSB7MCwgMSwgNiwgNywgOCwgMTIsIDE0LCAxNn07Ci0gICAgICAgIAotICAgICAgICBMb2NhbFJlc291cmNlTWFuYWdlciBsbTEgPSBuZXcgTG9jYWxSZXNvdXJjZU1hbmFnZXIoZ2xvYmFsUmVzb3VyY2VNYW5hZ2VyKTsKLSAgICAgICAgTG9jYWxSZXNvdXJjZU1hbmFnZXIgbG0yID0gbmV3IExvY2FsUmVzb3VyY2VNYW5hZ2VyKGdsb2JhbFJlc291cmNlTWFuYWdlcik7Ci0gICAgICAgIAotICAgICAgICAvLyBBbGxvY2F0ZSBhIGJ1bmNoIG9mIGdsb2JhbCByZXNvdXJjZXMKLSAgICAgICAgYWxsb2NhdGVSZXNvdXJjZXMoZ2xvYmFsUmVzb3VyY2VNYW5hZ2VyLCBnUmVzb3VyY2VzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFJlbWVtYmVyIGhvdyBtYW55IGdsb2JhbCByZXNvdXJjZXMgd2VyZSBhbGxvY2F0ZWQKLSAgICAgICAgaW50IGluaXRpYWxDb3VudCA9IFRlc3REZXNjcmlwdG9yLnJlZkNvdW50OwotICAgICAgICAKLSAgICAgICAgLy8gQWxsb2NhdGUgYSBidW5jaCBvZiByZXNvdXJjZXMgaW4gbG0xCi0gICAgICAgIGFsbG9jYXRlUmVzb3VyY2VzKGxtMSwgbG0xUmVzb3VyY2VzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFJlbWVtYmVyIGhvdyBtYW55IGdsb2JhbCArIGxtMSByZXNvdXJjZXMgdGhlcmUgYXJlCi0gICAgICAgIGludCBsbTFDb3VudCA9IFRlc3REZXNjcmlwdG9yLnJlZkNvdW50OwotICAgICAgICAKLSAgICAgICAgLy8gQWxsb2NhdGUgYW5kIGRlYWxsb2NhdGUgYSBidW5jaCBvZiByZXNvdXJjZXMgaW4gbG0yCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IGFsbCB0aGUgbG0yIHJlc291cmNlcyB3ZXJlIGRlYWxsb2NhdGVkICh3ZSBzaG91bGQgYmUKLSAgICAgICAgLy8gYmFjayBkb3duIHRvIHRoZSBjb3VudCB3ZSBoYWQgYWZ0ZXIgd2UgYWxsb2NhdGVkIGxtMSByZXNvdXJjZXMpCi0gICAgICAgIGFsbG9jYXRlUmVzb3VyY2VzKGxtMiwgbG0yUmVzb3VyY2VzKTsKLSAgICAgICAgZGVhbGxvY2F0ZVJlc291cmNlcyhsbTIsIGxtMlJlc291cmNlcyk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobG0xQ291bnQsIFRlc3REZXNjcmlwdG9yLnJlZkNvdW50KTsKLQotICAgICAgICAvLyBEaXNwb3NlIGxtMiAoc2hvdWxkbid0IGRvIGFueXRoaW5nIHNpbmNlIHdlIGFscmVhZHkgZGVhbGxvY2F0ZWQgYWxsIG9mIGl0cyByZXNvdXJjZXMpCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoaXMgZG9lc24ndCBjaGFuZ2UgYW55IHJlZmNvdW50cwotICAgICAgICBsbTIuZGlzcG9zZSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGxtMUNvdW50LCBUZXN0RGVzY3JpcHRvci5yZWZDb3VudCk7Ci0gICAgICAgIAotICAgICAgICAvLyBEaXNwb3NlIGxtMSB3aXRob3V0IGZpcnN0IGRlYWxsb2NhdGluZyBpdHMgcmVzb3VyY2VzLiBUaGlzIHNob3VsZCBjb3JyZWN0bHkgZGV0ZWN0Ci0gICAgICAgIC8vIHdoYXQgbmVlZHMgdG8gYmUgZGVhbGxvY2F0ZWQgZnJvbSBsbTEgd2l0aG91dCBhZmZlY3RpbmcgYW55IGdsb2JhbCByZXNvdXJjZXMuCi0gICAgICAgIC8vIElmIGV2ZXJ5dGhpbmcgd29ya3MsIHdlIHNob3VsZCBiZSBiYWNrIHRvIHRoZSByZXNvdXJjZSBjb3VudCB3ZSBoYWQgYWZ0ZXIgYWxsb2NhdGluZwotICAgICAgICAvLyB0aGUgZ2xvYmFsIHJlc291cmNlcy4KLSAgICAgICAgbG0xLmRpc3Bvc2UoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbml0aWFsQ291bnQsIFRlc3REZXNjcmlwdG9yLnJlZkNvdW50KTsKLSAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0Fic3RyYWN0VHJlZVZpZXdlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9BYnN0cmFjdFRyZWVWaWV3ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYWY2ZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0Fic3RyYWN0VHJlZVZpZXdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZVZpZXdlclRlc3QgZXh0ZW5kcyBTdHJ1Y3R1cmVkSXRlbVZpZXdlclRlc3QgewotCi0gICAgQWJzdHJhY3RUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCi0gICAgcHVibGljIEFic3RyYWN0VHJlZVZpZXdlclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RXF1YWxzQXJyYXkoU3RyaW5nIHMsIE9iamVjdFtdIGExLCBPYmplY3RbXSBhMikgewotICAgICAgICBpbnQgczEgPSBhMS5sZW5ndGg7Ci0gICAgICAgIGludCBzMiA9IGEyLmxlbmd0aDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIHMxLCBzMik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgczE7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIGExW2ldLCBhMltpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTZWxlY3Rpb25FcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIFRlc3RFbGVtZW50IGV4cGVjdGVkKSB7Ci0JICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZlZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkgICAgYXNzZXJ0VHJ1ZShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JICAgIExpc3QgZXhwZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICBleHBlY3RlZExpc3QuYWRkKGV4cGVjdGVkKTsKLQkgICAgYXNzZXJ0RXF1YWxzKCJzZWxlY3Rpb25FcXVhbHMgLSAiICsgbWVzc2FnZSwgKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvTGlzdCgpLCBleHBlY3RlZExpc3QpOwotCX0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0SXRlbUNvdW50KFRlc3RFbGVtZW50IGVsZW1lbnQpOyAvL3dhcyBJRWxlbWVudAotCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1bGtFeHBhbmQoKSB7Ci0gICAgICAgIC8vIG5hdmlnYXRlCi0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QyID0gZmlyc3QuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBUZXN0RWxlbWVudCBsYXN0ID0gZlJvb3RFbGVtZW50LmdldExhc3RDaGlsZCgpOwotCi0gICAgICAgIC8vIGV4cGFuZCBhIGZldyBub2RlcwotICAgICAgICBmVHJlZVZpZXdlci5leHBhbmRUb0xldmVsKGZpcnN0LCAyKTsKLSAgICAgICAgZlRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbChmaXJzdDIsIDIpOwotICAgICAgICBmVHJlZVZpZXdlci5leHBhbmRUb0xldmVsKGxhc3QsIDIpOwotICAgICAgICAvLyBnZXQgZXhwYW5kIHN0YXRlCi0gICAgICAgIE9iamVjdFtdIGxpc3QxID0gZlRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotICAgICAgICAvLyBmbHVzaCB2aWV3ZXIKLSAgICAgICAgc2V0SW5wdXQoKTsKLQotICAgICAgICAvLyByZXN0b3JlIG9sZCBleHBhbmQgc3RhdGUKLSAgICAgICAgZlRyZWVWaWV3ZXIuY29sbGFwc2VBbGwoKTsKLSAgICAgICAgZlRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbChmaXJzdCwgMik7Ci0gICAgICAgIGZUcmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZmlyc3QyLCAyKTsKLSAgICAgICAgZlRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbChsYXN0LCAyKTsKLQotICAgICAgICBPYmplY3RbXSBsaXN0MiA9IGZUcmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHNBcnJheSgib2xkIGFuZCBuZXcgZXhwYW5kIHN0YXRlIGFyZSB0aGUgc2FtZSIsIGxpc3QxLCBsaXN0Mik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZUNoaWxkRXhwYW5kZWQoKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QyID0gZmlyc3QuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBmVHJlZVZpZXdlci5leHBhbmRUb0xldmVsKGZpcnN0MiwgMCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZmlyc3QgY2hpbGQgaXMgdmlzaWJsZSIsIGZWaWV3ZXIudGVzdEZpbmRJdGVtKGZpcnN0MikpOwotICAgICAgICBmaXJzdC5kZWxldGVDaGlsZChmaXJzdDIpOwotICAgICAgICBhc3NlcnROdWxsKCJmaXJzdCBjaGlsZCBpcyBub3QgdmlzaWJsZSIsIGZWaWV3ZXIudGVzdEZpbmRJdGVtKGZpcnN0MikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVDaGlsZHJlbigpIHsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBmaXJzdC5kZWxldGVDaGlsZHJlbigpOwotICAgICAgICBhc3NlcnRUcnVlKCJubyBjaGlsZHJlbiIsIGdldEl0ZW1Db3VudChmaXJzdCkgPT0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZUNoaWxkcmVuRXhwYW5kZWQoKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QyID0gZmlyc3QuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBmVHJlZVZpZXdlci5leHBhbmRUb0xldmVsKGZpcnN0MiwgMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoImZpcnN0IGNoaWxkIGlzIHZpc2libGUiLCBmVmlld2VyLnRlc3RGaW5kSXRlbShmaXJzdDIpKTsKLQotICAgICAgICBmaXJzdC5kZWxldGVDaGlsZHJlbigpOwotICAgICAgICBhc3NlcnRUcnVlKCJubyBjaGlsZHJlbiIsIGdldEl0ZW1Db3VudChmaXJzdCkgPT0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZCgpIHsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdDIgPSBmaXJzdC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGFzc2VydE51bGwoImZpcnN0IGNoaWxkIGlzIG5vdCB2aXNpYmxlIiwgZlZpZXdlci50ZXN0RmluZEl0ZW0oZmlyc3QyKSk7Ci0gICAgICAgIGZUcmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZmlyc3QyLCAwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZmlyc3QgY2hpbGQgaXMgdmlzaWJsZSIsIGZWaWV3ZXIudGVzdEZpbmRJdGVtKGZpcnN0MikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRFbGVtZW50KCkgewotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0MiA9IGZpcnN0LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QzID0gZmlyc3QyLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgZlRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbChmaXJzdDMsIDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJmaXJzdDMgaXMgdmlzaWJsZSIsIGZWaWV3ZXIudGVzdEZpbmRJdGVtKGZpcnN0MykpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJmaXJzdDIgaXMgdmlzaWJsZSIsIGZWaWV3ZXIudGVzdEZpbmRJdGVtKGZpcnN0MikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRUb0xldmVsKCkgewotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0MiA9IGZpcnN0LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QzID0gZmlyc3QyLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgZlRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZmlyc3QyIGlzIHZpc2libGUiLCBmVmlld2VyLnRlc3RGaW5kSXRlbShmaXJzdDIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZmlyc3QzIGlzIHZpc2libGUiLCBmVmlld2VyLnRlc3RGaW5kSXRlbShmaXJzdDMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyRXhwYW5kZWQoKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QyID0gZmlyc3QuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBmVHJlZVZpZXdlci5leHBhbmRUb0xldmVsKGZpcnN0MiwgMCk7Ci0KLSAgICAgICAgZlRyZWVWaWV3ZXIuYWRkRmlsdGVyKG5ldyBUZXN0TGFiZWxGaWx0ZXIoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoImZpbHRlcmVkIGNvdW50IiwgZ2V0SXRlbUNvdW50KCkgPT0gNSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluc2VydENoaWxkUmV2ZWFsKCkgewotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFRlc3RFbGVtZW50IG5ld0VsZW1lbnQgPSBmaXJzdC5hZGRDaGlsZChUZXN0TW9kZWxDaGFuZ2UuSU5TRVJUCi0gICAgICAgICAgICAgICAgfCBUZXN0TW9kZWxDaGFuZ2UuUkVWRUFMKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgibmV3IHNpYmxpbmcgaXMgdmlzaWJsZSIsIGZWaWV3ZXIKLSAgICAgICAgICAgICAgICAudGVzdEZpbmRJdGVtKG5ld0VsZW1lbnQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0Q2hpbGRSZXZlYWxTZWxlY3QoKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IGxhc3QgPSBmUm9vdEVsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0gICAgICAgIFRlc3RFbGVtZW50IG5ld0VsZW1lbnQgPSBsYXN0LmFkZENoaWxkKFRlc3RNb2RlbENoYW5nZS5JTlNFUlQKLSAgICAgICAgICAgICAgICB8IFRlc3RNb2RlbENoYW5nZS5SRVZFQUwgfCBUZXN0TW9kZWxDaGFuZ2UuU0VMRUNUKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgibmV3IHNpYmxpbmcgaXMgdmlzaWJsZSIsIGZWaWV3ZXIKLSAgICAgICAgICAgICAgICAudGVzdEZpbmRJdGVtKG5ld0VsZW1lbnQpKTsKLSAgICAgICAgYXNzZXJ0U2VsZWN0aW9uRXF1YWxzKCJuZXcgZWxlbWVudCBpcyBzZWxlY3RlZCIsIG5ld0VsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRDaGlsZFJldmVhbFNlbGVjdEV4cGFuZGVkKCkgewotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFRlc3RFbGVtZW50IG5ld0VsZW1lbnQgPSBmaXJzdC5hZGRDaGlsZChUZXN0TW9kZWxDaGFuZ2UuSU5TRVJUCi0gICAgICAgICAgICAgICAgfCBUZXN0TW9kZWxDaGFuZ2UuUkVWRUFMIHwgVGVzdE1vZGVsQ2hhbmdlLlNFTEVDVCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIm5ldyBzaWJsaW5nIGlzIHZpc2libGUiLCBmVmlld2VyCi0gICAgICAgICAgICAgICAgLnRlc3RGaW5kSXRlbShuZXdFbGVtZW50KSk7Ci0gICAgICAgIGFzc2VydFNlbGVjdGlvbkVxdWFscygibmV3IGVsZW1lbnQgaXMgc2VsZWN0ZWQiLCBuZXdFbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdyZXNzaW9uIHRlc3QgZm9yIDFHRE4wUFg6IElUUFVJOldJTjIwMDAgLSBTRVZFUkUgIC0gQXNzZXJ0aW9uRmFpbHVyZSB3aGVuIGV4cGFuZGluZyBOYXZpZ2F0b3IKLSAgICAgKiBQcm9ibGVtIHdhczoKLSAgICAgKiAgIC0gYmVmb3JlIGFkZGl0aW9uLCBwYXJlbnQgaXRlbSBoYWQgbm8gY2hpbGRyZW4sIGFuZCB3YXMgZXhwYW5kZWQKLSAgICAgKiAgIC0gYWZ0ZXIgYWRkaXRpb24sIGR1cmluZyByZWZyZXNoKCksIHVwZGF0ZVBsdXMoKSBhZGRlZCBkdW1teSBub2RlIGV2ZW4gdGhvdWdoIHBhcmVudCBpdGVtIHdhcyBleHBhbmRlZAotICAgICAqICAgLSBpbiB1cGRhdGVDaGlsZHJlbiwgaXQgd2Fzbid0IGhhbmRsaW5nIGEgZHVtbXkgbm9kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZyZXNoV2l0aEFkZGVkQ2hpbGRyZW4oKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IHBhcmVudCA9IGZSb290RWxlbWVudC5hZGRDaGlsZChUZXN0TW9kZWxDaGFuZ2UuSU5TRVJUKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgY2hpbGQgPSBwYXJlbnQuYWRkQ2hpbGQoVGVzdE1vZGVsQ2hhbmdlLklOU0VSVCk7Ci0gICAgICAgICgoQWJzdHJhY3RUcmVlVmlld2VyKSBmVmlld2VyKS5zZXRFeHBhbmRlZFN0YXRlKHBhcmVudCwgdHJ1ZSk7Ci0gICAgICAgIHBhcmVudC5kZWxldGVDaGlsZChjaGlsZCk7Ci0gICAgICAgIGNoaWxkID0gcGFyZW50LmFkZENoaWxkKFRlc3RNb2RlbENoYW5nZS5TVFJVQ1RVUkVfQ0hBTkdFKTsKLSAgICAgICAgLy8gT24gc29tZSBwbGF0Zm9ybXMgKG5hbWVseSBHVEspLCByZW1vdmluZyBhbGwgY2hpbGRyZW4gY2F1c2VzIHRoZQotICAgICAgICAvLyBwYXJlbnQgdG8gY29sbGFwc2UgKGFjdHVhbGx5IGl0J3Mgd29yc2UgdGhhbiB0aGF0OiBHVEsgZG9lc24ndAotICAgICAgICAvLyBhbGxvdyB0aGVyZSB0byBiZSBhbiBlbXB0eSBleHBhbmRlZCB0cmVlIGl0ZW0sIGV2ZW4gaWYgeW91IGRvIGEKLSAgICAgICAgLy8gc2V0RXhwYW5kZWQodHJ1ZSkpLiAgCi0gICAgICAgIC8vIFRoaXMgYmVoYXZpb3VyIG1ha2VzIGl0IGltcG9zc2libGUgdG8gZG8gdGhpcyByZWdyZXNzaW9uIHRlc3QuCi0gICAgICAgIC8vIFNlZSBidWcgNDA3OTcgZm9yIG1vcmUgZGV0YWlscy4KLSAgICAgICAgaWYgKCgoQWJzdHJhY3RUcmVlVmlld2VyKSBmVmlld2VyKS5nZXRFeHBhbmRlZFN0YXRlKHBhcmVudCkpIHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIm5ldyBjaGlsZCBpcyB2aXNpYmxlIiwgZlZpZXdlci50ZXN0RmluZEl0ZW0oY2hpbGQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgMUdCREI1QTogSVRQVUk6V0lOTlQgLSBFeGNlcHRpb24gaW4gQWJzdHJhY3RUcmVlVmlld2VyIHVwZGF0ZS4KLSAgICAgKiBQcm9ibGVtIHdhczoKLSAgICAgKiAgIG5vZGUgaGFzIGNoaWxkIEEKLSAgICAgKiAgIG5vZGUgZ2V0cyBkdXBsaWNhdGUgY2hpbGQgQQotICAgICAqICAgdmlld2VyIGlzIHJlZnJlc2hlZCByYXRoZXIgdGhhbiB1c2luZyBhZGQgZm9yIG5ldyBBCi0gICAgICogICBBYnN0cmFjdFRyZWVWaWV3ZXIudXBkYXRlQ2hpbGRyZW4oLi4uKSB3YXMgbm90IHByb3Blcmx5IGhhbmRsaW5nIGl0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlZnJlc2hXaXRoRHVwbGljYXRlQ2hpbGQoKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgbmV3RWxlbWVudCA9IChUZXN0RWxlbWVudCkgZmlyc3QuY2xvbmUoKTsKLSAgICAgICAgZlJvb3RFbGVtZW50LmFkZENoaWxkKG5ld0VsZW1lbnQsIG5ldyBUZXN0TW9kZWxDaGFuZ2UoCi0gICAgICAgICAgICAgICAgVGVzdE1vZGVsQ2hhbmdlLlNUUlVDVFVSRV9DSEFOR0UsIGZSb290RWxlbWVudCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJuZXcgc2libGluZyBpcyB2aXNpYmxlIiwgZlZpZXdlcgotICAgICAgICAgICAgICAgIC50ZXN0RmluZEl0ZW0obmV3RWxlbWVudCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgQnVnIDM4NDAgW1ZpZXdlcnNdIGZyZWUgZXhwYW5zaW9uIG9mIGphciBoYXBwZW5pbmcgd2hlbiBkZWxldGluZyBwcm9qZWN0cyAoMUdFVjJGTCkKLSAgICAgKiBQcm9ibGVtIHdhczoKLSAgICAgKiAgIC0gbm9kZSBoYXMgY2hpbGRyZW4gQSBhbmQgQiAKLSAgICAgKiAgIC0gQSBpcyBleHBhbmRlZCwgQiBpcyBub3QKLSAgICAgKiAgIC0gQSBnZXRzIGRlbGV0ZWQKLSAgICAgKiAgIC0gQiBnZXRzIGV4cGFuZGVkIGJlY2F1c2UgaXQgcmV1c2VkIEEncyBpdGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlZnJlc2hXaXRoUmV1c2VkSXRlbXMoKSB7Ci0gICAgICAgIC8vICAgICAgICBUZXN0RWxlbWVudCBhPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAvLyAgICAgICAgVGVzdEVsZW1lbnQgYWE9IGEuZ2V0Q2hpbGRBdCgwKTsKLSAgICAgICAgLy8gICAgICAgIFRlc3RFbGVtZW50IGFiPSBhLmdldENoaWxkQXQoMSk7Ci0gICAgICAgIC8vICAgICAgICBmVHJlZVZpZXdlci5leHBhbmRUb0xldmVsKGFhLCAxKTsKLSAgICAgICAgLy8JCUxpc3QgZXhwYW5kZWRCZWZvcmUgPSBBcnJheXMuYXNMaXN0KGZUcmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKSk7Ci0gICAgICAgIC8vCQlhc3NlcnRUcnVlKGV4cGFuZGVkQmVmb3JlLmNvbnRhaW5zKGEpKTsKLSAgICAgICAgLy8JCWFzc2VydFRydWUoZXhwYW5kZWRCZWZvcmUuY29udGFpbnMoYWEpKTsKLSAgICAgICAgLy8JCWFzc2VydEZhbHNlKGV4cGFuZGVkQmVmb3JlLmNvbnRhaW5zKGFiKSk7Ci0gICAgICAgIC8vICAgICAgICBhLmRlbGV0ZUNoaWxkKGFhLCBuZXcgVGVzdE1vZGVsQ2hhbmdlKFRlc3RNb2RlbENoYW5nZS5TVFJVQ1RVUkVfQ0hBTkdFLCBhKSk7Ci0gICAgICAgIC8vICAgICAgICBMaXN0IGV4cGFuZGVkQWZ0ZXIgPSBBcnJheXMuYXNMaXN0KGZUcmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKSk7Ci0gICAgICAgIC8vICAgICAgICBhc3NlcnRGYWxzZShleHBhbmRlZEFmdGVyLmNvbnRhaW5zKGFiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbmFtZUNoaWxkRWxlbWVudCgpIHsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdDIgPSBmaXJzdC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGZUcmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZmlyc3QyLCAwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZmlyc3QgY2hpbGQgaXMgdmlzaWJsZSIsIGZWaWV3ZXIudGVzdEZpbmRJdGVtKGZpcnN0MikpOwotCi0gICAgICAgIFN0cmluZyBuZXdMYWJlbCA9IGZpcnN0Mi5nZXRMYWJlbCgpICsgIiBjaGFuZ2VkIjsKLSAgICAgICAgZmlyc3QyLnNldExhYmVsKG5ld0xhYmVsKTsKLSAgICAgICAgV2lkZ2V0IHdpZGdldCA9IGZWaWV3ZXIudGVzdEZpbmRJdGVtKGZpcnN0Mik7Ci0gICAgICAgIGFzc2VydFRydWUod2lkZ2V0IGluc3RhbmNlb2YgSXRlbSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2hhbmdlZCBsYWJlbCIsIGZpcnN0Mi5nZXRJRCgpICsgIiAiICsgbmV3TGFiZWwsCi0gICAgICAgICAgICAgICAgKChJdGVtKSB3aWRnZXQpLmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVncmVzc2lvbiB0ZXN0IGZvciBCdWcgMjY2OTggW1ZpZXdlcnNdIHN0YWNrIG92ZXJmbG93IGR1cmluZyBkZWJ1ZyBzZXNzaW9uLCBjYXVzaW5nIElERSB0byBjcmFzaAotICAgICAqIFByb2JsZW0gd2FzOgotICAgICAqICAgLSBub2RlIEEgaGFzIGNoaWxkIEEKLSAgICAgKiAgIC0gc2V0RXhwYW5kZWQgd2l0aCBBIGluIHRoZSBsaXN0IGNhdXNlZCBhbiBpbmZpbml0ZSByZWN1cnNpb24gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEV4cGFuZGVkV2l0aEN5Y2xlKCkgewotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGZpcnN0LmFkZENoaWxkKGZpcnN0LCBuZXcgVGVzdE1vZGVsQ2hhbmdlKFRlc3RNb2RlbENoYW5nZS5JTlNFUlQsCi0gICAgICAgICAgICAgICAgZmlyc3QsIGZpcnN0KSk7Ci0gICAgICAgIGZUcmVlVmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMobmV3IE9iamVjdFtdIHsgZmlyc3QgfSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBCdWcgNDE3MTAgLSBhc3NlcnRpb24gdGhhdCBhbiBvYmplY3QgbWF5IG5vdCBiZSBhZGRlZCB0byBhIGdpdmVuCi0gICAgICogVHJlZUl0ZW0gbW9yZSB0aGFuIG9uY2UuICAgICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RHVwbGljYXRlQ2hpbGQoKSB7Ci0gICAgICAgIC8vV2lkZ2V0IHJvb3QgPSBmVmlld2VyLnRlc3RGaW5kSXRlbShmUm9vdEVsZW1lbnQpOwotICAgICAgICAvL2Fzc2VydE5vdE51bGwocm9vdCk7Ci0gICAgICAgIFRlc3RFbGVtZW50IHBhcmVudCA9IGZSb290RWxlbWVudC5hZGRDaGlsZChUZXN0TW9kZWxDaGFuZ2UuSU5TRVJUKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgY2hpbGQgPSBwYXJlbnQuYWRkQ2hpbGQoVGVzdE1vZGVsQ2hhbmdlLklOU0VSVCk7Ci0gICAgICAgIGludCBpbml0aWFsQ291bnQgPSBnZXRJdGVtQ291bnQocGFyZW50KTsKLSAgICAgICAgZlJvb3RFbGVtZW50LmFkZENoaWxkKGNoaWxkLCBuZXcgVGVzdE1vZGVsQ2hhbmdlKAotICAgICAgICAgICAgICAgIFRlc3RNb2RlbENoYW5nZS5JTlNFUlQsIGZSb290RWxlbWVudCwgY2hpbGQpKTsKLSAgICAgICAgaW50IHBvc3RDb3VudCA9IGdldEl0ZW1Db3VudChwYXJlbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNhbWUgZWxlbWVudCBhZGRlZCB0byBhIHBhcmVudCB0d2ljZS4iLCBpbml0aWFsQ291bnQsCi0gICAgICAgICAgICAgICAgcG9zdENvdW50KTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5WaWV3ZXJUZXN0Q2FzZSN0ZWFyRG93bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgCXN1cGVyLnRlYXJEb3duKCk7Ci0gICAgCWZUcmVlVmlld2VyID0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvQWxsVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODc0MjQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IEFsbFRlc3RzKCk7Ci0JfQotCi0JcHVibGljIEFsbFRlc3RzKCkgewotCQlhZGRUZXN0U3VpdGUoTXVsdGlwbGVFcXVhbEVsZW1lbnRzVHJlZVZpZXdlclRlc3QuY2xhc3MpOwotCQlhZGRUZXN0U3VpdGUoTGF6eVNvcnRlZENvbGxlY3Rpb25UZXN0LmNsYXNzKTsKLQkJYWRkVGVzdFN1aXRlKFRyZWVWaWV3ZXJUZXN0LmNsYXNzKTsKLQkJYWRkVGVzdFN1aXRlKFZpcnR1YWxUcmVlVmlld2VyVGVzdC5jbGFzcyk7Ci0JCWFkZFRlc3RTdWl0ZShTaW1wbGVWaXJ0dWFsTGF6eVRyZWVWaWV3ZXJUZXN0LmNsYXNzKTsKLQkJYWRkVGVzdFN1aXRlKFZpcnR1YWxMYXp5VHJlZVZpZXdlclRlc3QuY2xhc3MpOwotCQlhZGRUZXN0U3VpdGUoVGFibGVWaWV3ZXJUZXN0LmNsYXNzKTsKLQkJYWRkVGVzdFN1aXRlKFRyZWVWaWV3ZXJDb2x1bW5UZXN0LmNsYXNzKTsKLQkJYWRkVGVzdFN1aXRlKFZpcnR1YWxUYWJsZVZpZXdlclRlc3QuY2xhc3MpOwotCQlhZGRUZXN0U3VpdGUoVmlydHVhbExhenlUYWJsZVZpZXdlclRlc3QuY2xhc3MpOwotCQlhZGRUZXN0U3VpdGUoVGFibGVUcmVlVmlld2VyVGVzdC5jbGFzcyk7Ci0JCWFkZFRlc3RTdWl0ZShUYWJsZUNvbG9yUHJvdmlkZXJUZXN0LmNsYXNzKTsKLQkJYWRkVGVzdFN1aXRlKFRhYmxlRm9udFByb3ZpZGVyVGVzdC5jbGFzcyk7Ci0JCWFkZFRlc3RTdWl0ZShMaXN0Vmlld2VyVGVzdC5jbGFzcyk7Ci0JCWFkZFRlc3RTdWl0ZShDaGVja2JveFRhYmxlVmlld2VyVGVzdC5jbGFzcyk7Ci0JCWFkZFRlc3RTdWl0ZShDaGVja2JveFRyZWVWaWV3ZXJUZXN0LmNsYXNzKTsKLQkJYWRkVGVzdFN1aXRlKENvbWJvVmlld2VyVGVzdC5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0NoZWNrYm94VGFibGVWaWV3ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvQ2hlY2tib3hUYWJsZVZpZXdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhOThkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvQ2hlY2tib3hUYWJsZVZpZXdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxheW91dERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLQotcHVibGljIGNsYXNzIENoZWNrYm94VGFibGVWaWV3ZXJUZXN0IGV4dGVuZHMgVGFibGVWaWV3ZXJUZXN0IHsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENoZWNrYm94VGFibGVUZXN0TGFiZWxQcm92aWRlciBleHRlbmRzCi0gICAgICAgICAgICBUZXN0TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGZFeHRlbmRlZCA9IGZhbHNlOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGZFeHRlbmRlZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZWRTdHJpbmcoKFN0cmluZykgZWxlbWVudCk7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChmRXh0ZW5kZWQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVkU3RyaW5nKChUZXN0RWxlbWVudCkgZWxlbWVudCk7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENoZWNrYm94VGFibGVWaWV3ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkNIRUNLIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIHRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgICAgIHRhYmxlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFN0cmluZyBoZWFkZXJzW10gPSB7ICJjb2x1bW4gMSBoZWFkZXIiLCAiY29sdW1uIDIgaGVhZGVyIiB9OwotCi0gICAgICAgIENvbHVtbkxheW91dERhdGEgbGF5b3V0c1tdID0geyBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDApLAotICAgICAgICAgICAgICAgIG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCkgfTsKLQotICAgICAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW5zW10gPSBuZXcgVGFibGVDb2x1bW5baGVhZGVycy5sZW5ndGhdOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbGF5b3V0LmFkZENvbHVtbkRhdGEobGF5b3V0c1tpXSk7Ci0gICAgICAgICAgICBUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIGkpOwotICAgICAgICAgICAgdGMuc2V0UmVzaXphYmxlKGxheW91dHNbaV0ucmVzaXphYmxlKTsKLSAgICAgICAgICAgIHRjLnNldFRleHQoaGVhZGVyc1tpXSk7Ci0gICAgICAgICAgICBjb2x1bW5zW2ldID0gdGM7Ci0gICAgICAgIH0KLQotICAgICAgICBUYWJsZVZpZXdlciB2aWV3ZXIgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgICAgIHZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlc3RNb2RlbENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRhYmxlVGVzdExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIHJldHVybiB2aWV3ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oQ2hlY2tib3hUYWJsZVZpZXdlclRlc3QuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FsbEVsZW1lbnRzKCkgewotICAgICAgICBDaGVja2JveFRhYmxlVmlld2VyIGN0diA9IChDaGVja2JveFRhYmxlVmlld2VyKSBmVmlld2VyOwotICAgICAgICBjdHYuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjdHYuZ2V0Q2hlY2tlZChmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY3R2LmdldENoZWNrZWQoZlJvb3RFbGVtZW50LmdldExhc3RDaGlsZCgpKSk7Ci0gICAgICAgIGN0di5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghY3R2LmdldENoZWNrZWQoZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKCFjdHYuZ2V0Q2hlY2tlZChmUm9vdEVsZW1lbnQuZ2V0TGFzdENoaWxkKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JheUFsbEVsZW1lbnRzKCkgewotICAgICAgICBDaGVja2JveFRhYmxlVmlld2VyIGN0diA9IChDaGVja2JveFRhYmxlVmlld2VyKSBmVmlld2VyOwotICAgICAgICBjdHYuc2V0QWxsR3JheWVkKHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKGN0di5nZXRHcmF5ZWQoZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKGN0di5nZXRHcmF5ZWQoZlJvb3RFbGVtZW50LmdldExhc3RDaGlsZCgpKSk7Ci0gICAgICAgIGN0di5zZXRBbGxHcmF5ZWQoZmFsc2UpOwotICAgICAgICBhc3NlcnRUcnVlKCFjdHYuZ2V0R3JheWVkKGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghY3R2LmdldEdyYXllZChmUm9vdEVsZW1lbnQuZ2V0TGFzdENoaWxkKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JheWVkKCkgewotICAgICAgICBDaGVja2JveFRhYmxlVmlld2VyIGN0diA9IChDaGVja2JveFRhYmxlVmlld2VyKSBmVmlld2VyOwotICAgICAgICBUZXN0RWxlbWVudCBlbGVtZW50ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGN0di5nZXRHcmF5ZWRFbGVtZW50cygpLmxlbmd0aCA9PSAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghY3R2LmdldEdyYXllZChlbGVtZW50KSk7Ci0KLSAgICAgICAgY3R2LnNldEdyYXllZChlbGVtZW50LCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjdHYuZ2V0R3JheWVkRWxlbWVudHMoKS5sZW5ndGggPT0gMSk7Ci0gICAgICAgIGFzc2VydFRydWUoY3R2LmdldEdyYXllZChlbGVtZW50KSk7Ci0KLSAgICAgICAgY3R2LnNldEdyYXllZChlbGVtZW50LCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydFRydWUoY3R2LmdldEdyYXllZEVsZW1lbnRzKCkubGVuZ3RoID09IDApOwotICAgICAgICBhc3NlcnRUcnVlKCFjdHYuZ2V0R3JheWVkKGVsZW1lbnQpKTsKLQotICAgICAgICBjdHYuc2V0QWxsR3JheWVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JheWVkRWxlbWVudHMoKSB7Ci0gICAgICAgIENoZWNrYm94VGFibGVWaWV3ZXIgY3R2ID0gKENoZWNrYm94VGFibGVWaWV3ZXIpIGZWaWV3ZXI7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgbGFzdCA9IGZSb290RWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGN0di5nZXRHcmF5ZWRFbGVtZW50cygpLmxlbmd0aCA9PSAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghY3R2LmdldEdyYXllZChmaXJzdCkpOwotICAgICAgICBhc3NlcnRUcnVlKCFjdHYuZ2V0R3JheWVkKGxhc3QpKTsKLQotICAgICAgICBjdHYuc2V0R3JheWVkKGZpcnN0LCB0cnVlKTsKLSAgICAgICAgY3R2LnNldEdyYXllZChsYXN0LCB0cnVlKTsKLSAgICAgICAgT2JqZWN0W10gZWxlbWVudHMgPSBjdHYuZ2V0R3JheWVkRWxlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbGVtZW50cy5sZW5ndGggPT0gMik7Ci0gICAgICAgIGFzc2VydFRydWUoZWxlbWVudHNbMF0gPT0gZmlyc3QpOwotICAgICAgICBhc3NlcnRUcnVlKGVsZW1lbnRzWzFdID09IGxhc3QpOwotCi0gICAgICAgIGN0di5zZXRHcmF5ZWQoZmlyc3QsIGZhbHNlKTsKLSAgICAgICAgY3R2LnNldEdyYXllZChsYXN0LCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydFRydWUoY3R2LmdldEdyYXllZEVsZW1lbnRzKCkubGVuZ3RoID09IDApOwotCi0gICAgICAgIGN0di5zZXRBbGxHcmF5ZWQoZmFsc2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9DaGVja2JveFRyZWVWaWV3ZXJNaXNzaW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0NoZWNrYm94VHJlZVZpZXdlck1pc3NpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNDI5OTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0NoZWNrYm94VHJlZVZpZXdlck1pc3NpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotLyoqCi0gKiBUZXN0IHdpdGggbWlzc2luZyBpbWFnZXMuCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIENoZWNrYm94VHJlZVZpZXdlck1pc3NpbmdUZXN0IGV4dGVuZHMgQ2hlY2tib3hUcmVlVmlld2VyVGVzdCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgdGVzdEltYWdlOwotCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRNaXNzaW5nSW1hZ2UoKSB7Ci0gICAgICAgIGlmICh0ZXN0SW1hZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHRlc3RJbWFnZSA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShUZXN0TGFiZWxQcm92aWRlci5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgImltYWdlcy9taXNzaW5nLmdpZiIpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIHJldHVybiB0ZXN0SW1hZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGVja2JveE1pc3NpbmdUYWJsZVRlc3RMYWJlbFByb3ZpZGVyIGV4dGVuZHMKLSAgICAgICAgICAgIENoZWNrYm94VHJlZVZpZXdlclRlc3QuQ2hlY2tib3hUYWJsZVRlc3RMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMKLSAgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgewotICAgICAgICAvKgotICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlclRlc3QuVGVzdExhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIGdldE1pc3NpbmdJbWFnZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2hlY2tib3hUcmVlVmlld2VyTWlzc2luZ1Rlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyVGVzdCNnZXRUZXN0TGFiZWxQcm92aWRlcigpCi0gICAgICovCi0gICAgcHVibGljIElCYXNlTGFiZWxQcm92aWRlciBnZXRUZXN0TGFiZWxQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGVja2JveE1pc3NpbmdUYWJsZVRlc3RMYWJlbFByb3ZpZGVyKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXJUZXN0I3RlYXJEb3duKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgaWYgKHRlc3RJbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXN0SW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICAgICAgdGVzdEltYWdlID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlclRlc3QjdGVzdExhYmVsUHJvdmlkZXIoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RMYWJlbFByb3ZpZGVyKCkgewotICAgICAgICBzdXBlci50ZXN0TGFiZWxQcm92aWRlcigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0NoZWNrYm94VHJlZVZpZXdlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9DaGVja2JveFRyZWVWaWV3ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjlmYzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0NoZWNrYm94VHJlZVZpZXdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIENoZWNrYm94VHJlZVZpZXdlclRlc3QgZXh0ZW5kcyBUcmVlVmlld2VyVGVzdCB7Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGVja2JveFRhYmxlVGVzdExhYmVsUHJvdmlkZXIgZXh0ZW5kcwotICAgICAgICAgICAgVGVzdExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBmRXh0ZW5kZWQgPSBmYWxzZTsKLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChmRXh0ZW5kZWQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVkU3RyaW5nKChTdHJpbmcpIGVsZW1lbnQpOwotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBpZiAoZkV4dGVuZGVkKQotICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlZFN0cmluZygoVGVzdEVsZW1lbnQpIGVsZW1lbnQpOwotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDaGVja2JveFRyZWVWaWV3ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZUcmVlVmlld2VyID0gbmV3IENoZWNrYm94VHJlZVZpZXdlcihwYXJlbnQpOwotICAgICAgICBmVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlc3RNb2RlbENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgcmV0dXJuIGZUcmVlVmlld2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLSAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKENoZWNrYm94VHJlZVZpZXdlclRlc3QuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja1N1YnRyZWUoKSB7Ci0gICAgICAgIENoZWNrYm94VHJlZVZpZXdlciBjdHYgPSAoQ2hlY2tib3hUcmVlVmlld2VyKSBmVmlld2VyOwotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0Zmlyc3QgPSBmaXJzdC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0Zmlyc3RmaXJzdCA9IGZpcnN0Zmlyc3QuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBmVHJlZVZpZXdlci5leHBhbmRUb0xldmVsKGZpcnN0Zmlyc3QsIDApOwotCi0gICAgICAgIGN0di5zZXRTdWJ0cmVlQ2hlY2tlZChmaXJzdCwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoY3R2LmdldENoZWNrZWQoZmlyc3RmaXJzdCkpOwotICAgICAgICBjdHYuc2V0U3VidHJlZUNoZWNrZWQoZmlyc3QsIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghY3R2LmdldENoZWNrZWQoZmlyc3RmaXJzdCkpOwotCi0gICAgICAgIC8vIHVuY2hlY2sgaW52aXNpYmxlIHN1YnRyZWUKLSAgICAgICAgYXNzZXJ0VHJ1ZShjdHYuc2V0U3VidHJlZUNoZWNrZWQoZmlyc3RmaXJzdGZpcnN0LCBmYWxzZSkpOwotICAgICAgICBhc3NlcnRUcnVlKCFjdHYuZ2V0Q2hlY2tlZChmaXJzdGZpcnN0Zmlyc3QpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JheWVkKCkgewotICAgICAgICBDaGVja2JveFRyZWVWaWV3ZXIgY3R2ID0gKENoZWNrYm94VHJlZVZpZXdlcikgZlZpZXdlcjsKLSAgICAgICAgVGVzdEVsZW1lbnQgZWxlbWVudCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjdHYuZ2V0R3JheWVkRWxlbWVudHMoKS5sZW5ndGggPT0gMCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWN0di5nZXRHcmF5ZWQoZWxlbWVudCkpOwotCi0gICAgICAgIGN0di5zZXRHcmF5ZWQoZWxlbWVudCwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoY3R2LmdldEdyYXllZEVsZW1lbnRzKCkubGVuZ3RoID09IDEpOwotICAgICAgICBhc3NlcnRUcnVlKGN0di5nZXRHcmF5ZWQoZWxlbWVudCkpOwotCi0gICAgICAgIGN0di5zZXRHcmF5ZWQoZWxlbWVudCwgZmFsc2UpOwotICAgICAgICBhc3NlcnRUcnVlKGN0di5nZXRHcmF5ZWRFbGVtZW50cygpLmxlbmd0aCA9PSAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghY3R2LmdldEdyYXllZChlbGVtZW50KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmVudEdyYXllZCgpIHsKLSAgICAgICAgQ2hlY2tib3hUcmVlVmlld2VyIGN0diA9IChDaGVja2JveFRyZWVWaWV3ZXIpIGZWaWV3ZXI7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3RmaXJzdCA9IGZpcnN0LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3RmaXJzdGZpcnN0ID0gZmlyc3RmaXJzdC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGN0di5leHBhbmRUb0xldmVsKGZpcnN0Zmlyc3RmaXJzdCwgMCk7Ci0KLSAgICAgICAgY3R2LnNldFBhcmVudHNHcmF5ZWQoZmlyc3RmaXJzdGZpcnN0LCB0cnVlKTsKLSAgICAgICAgT2JqZWN0W10gZWxlbWVudHMgPSBjdHYuZ2V0R3JheWVkRWxlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbGVtZW50cy5sZW5ndGggPT0gMyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY3R2LmdldEdyYXllZChlbGVtZW50c1tpXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShlbGVtZW50c1swXSA9PSBmaXJzdCk7Ci0gICAgICAgIGFzc2VydFRydWUoZWxlbWVudHNbMV0gPT0gZmlyc3RmaXJzdCk7Ci0gICAgICAgIGFzc2VydFRydWUoZWxlbWVudHNbMl0gPT0gZmlyc3RmaXJzdGZpcnN0KTsKLSAgICAgICAgY3R2LnNldFBhcmVudHNHcmF5ZWQoZmlyc3RmaXJzdGZpcnN0LCBmYWxzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0NvbWJvVmlld2VyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0NvbWJvVmlld2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk2ZjIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9Db21ib1ZpZXdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIENvbWJvVmlld2VyVGVzdCBleHRlbmRzIFN0cnVjdHVyZWRWaWV3ZXJUZXN0IHsKLSAgICBwdWJsaWMgQ29tYm9WaWV3ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbWJvVmlld2VyIHZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihwYXJlbnQpOwotICAgICAgICB2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZXN0TW9kZWxDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHJldHVybiB2aWV3ZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRJdGVtQ291bnQoKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgQ29tYm8gbGlzdCA9IChDb21ibykgZlZpZXdlci50ZXN0RmluZEl0ZW0oZmlyc3QpOwotICAgICAgICByZXR1cm4gbGlzdC5nZXRJdGVtQ291bnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEl0ZW1UZXh0KGludCBhdCkgewotICAgICAgICBDb21ibyBsaXN0ID0gKENvbWJvKSBmVmlld2VyLmdldENvbnRyb2woKTsKLSAgICAgICAgcmV0dXJuIGxpc3QuZ2V0SXRlbShhdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oTGlzdFZpZXdlclRlc3QuY2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRPRE86IERldGVybWluZSBpZiB0aGlzIHRlc3QgaXMgYXBwbGljYWJsZSB0byBDb21ib1ZpZXdlciAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0Q2hpbGQoKSB7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvSVRlc3RNb2RlbExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvSVRlc3RNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMWU2YjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0lUZXN0TW9kZWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVRlc3RNb2RlbExpc3RlbmVyIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxDaGFuZ2VkKFRlc3RNb2RlbENoYW5nZSBjaGFuZ2UpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0xhenlTb3J0ZWRDb2xsZWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0xhenlTb3J0ZWRDb2xsZWN0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTZkZDE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9MYXp5U29ydGVkQ29sbGVjdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQuTGF6eVNvcnRlZENvbGxlY3Rpb247Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgTGF6eVNvcnRlZENvbGxlY3Rpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKExhenlTb3J0ZWRDb2xsZWN0aW9uVGVzdC5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTGF6eVNvcnRlZENvbGxlY3Rpb25UZXN0LmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBUZXN0Q29tcGFyYXRvciBjb21wYXJhdG9yOwotICAgIHByaXZhdGUgVGVzdENvbXBhcmF0b3IgY29tcGFyaXNvbkNvbXBhcmF0b3I7Ci0gICAgCi0gICAgLy8gQWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBkb25lIG9uIGJvdGggY29sbGVjdGlvbnMgLS0gYWZ0ZXIgZWFjaCBvcGVyYXRpb24sIHRoZSByZXN1bHQKLSAgICAvLyB3aWxsIGJlIGNvbXBhcmVkCi0gICAgcHJpdmF0ZSBMYXp5U29ydGVkQ29sbGVjdGlvbiBjb2xsZWN0aW9uOwotICAgIHByaXZhdGUgVHJlZVNldCBjb21wYXJpc29uQ29sbGVjdGlvbjsKLQotICAgIC8qKgotICAgICAqIFBsZWFzZSBkb24ndCBhZGQgb3IgcmVtb3ZlIGZyb20gdGhpcyBzZXQgLS0gd2UgcmVseSBvbiB0aGUgZXhhY3QgaW5zZXJ0aW9uIG9yZGVyCi0gICAgICogdG8gZ2V0IGZ1bGwgY292ZXJhZ2UgZnJvbSB0aGUgcmVtb3ZhbCB0ZXN0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIHNlID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICJ2MDAgYWFhYWFhIiwKLSAgICAgICAgICAgICJ2MDEgYXBwbGUiLAotICAgICAgICAgICAgInYwMiBib29nZXIiLAotICAgICAgICAgICAgInYwMyBjYXIiLAotICAgICAgICAgICAgInYwNCBkb2ciLAotICAgICAgICAgICAgInYwNSBlbGVwaGFudCIsCi0gICAgICAgICAgICAidjA2IGZveCIsCi0gICAgICAgICAgICAidjA3IGdvb3NlIiwKLSAgICAgICAgICAgICJ2MDggaGlwcGllIiwKLSAgICAgICAgICAgICJ2MDkgaWd1YW5hIiwKLSAgICAgICAgICAgICJ2MTAganVuayIsCi0gICAgICAgICAgICAidjExIGthcm1hIiwKLSAgICAgICAgICAgICJ2MTIgbGVtb24iLAotICAgICAgICAgICAgInYxMyBtb25nb29zZSIsCi0gICAgICAgICAgICAidjE0IG5vb2RsZSIsCi0gICAgICAgICAgICAidjE1IG9wYWwiLAotICAgICAgICAgICAgInYxNiBwdW1wa2luIiwKLSAgICAgICAgICAgICJ2MTcgcXVpcmtzIiwKLSAgICAgICAgICAgICJ2MTggcmVzdGVyYXVudCIsCi0gICAgICAgICAgICAidjE5IHNvYXAiLAotICAgICAgICAgICAgInYyMCB0aW1teSIsCi0gICAgICAgICAgICAidjIxIHVnbHkiLAotICAgICAgICAgICAgInYyMiB2aXJ1cyIsCi0gICAgICAgICAgICAidjIzIHdpZ3dhbSIsCi0gICAgICAgICAgICAidjI0IHhlcnhlcyIsCi0gICAgICAgICAgICAidjI1IHllbGxvdyIsCi0gICAgICAgICAgICAidjI2IHplcm8iCi0gICAgfTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBQbGVhc2UgZG9uJ3QgbWVzcyB3aXRoIHRoZSBpbnNlcnRpb24gb3JkZXIgaGVyZSBvciBhZGQgb3IgcmVtb3ZlIGZyb20gdGhpcyBzZXQgLS0gCi0gICAgICogd2UgcmVseSBvbiB0aGUgZXhhY3Qgb3JkZXIgaW4gb3JkZXIgdG8gZ2V0IGZ1bGwgY292ZXJhZ2UgZm9yIHRoZSByZW1vdmFsIHRlc3RzLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZWxlbWVudHMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgc2VbMTldLAotICAgICAgICAgICAgc2VbN10sCi0gICAgICAgICAgICBzZVs2XSwKLSAgICAgICAgICAgIHNlWzFdLAotICAgICAgICAgICAgc2VbMjBdLAotICAgICAgICAgICAgc2VbOF0sCi0gICAgICAgICAgICBzZVswXSwKLSAgICAgICAgICAgIHNlWzIzXSwKLSAgICAgICAgICAgIHNlWzE3XSwKLSAgICAgICAgICAgIHNlWzE4XSwKLSAgICAgICAgICAgIHNlWzI0XSwKLSAgICAgICAgICAgIHNlWzI1XSwKLSAgICAgICAgICAgIHNlWzEwXSwKLSAgICAgICAgICAgIHNlWzVdLAotICAgICAgICAgICAgc2VbMTVdLAotICAgICAgICAgICAgc2VbMTZdLAotICAgICAgICAgICAgc2VbMjFdLAotICAgICAgICAgICAgc2VbMjZdLAotICAgICAgICAgICAgc2VbMjJdLAotICAgICAgICAgICAgc2VbM10sCi0gICAgICAgICAgICBzZVs5XSwKLSAgICAgICAgICAgIHNlWzRdLAotICAgICAgICAgICAgc2VbMTFdLAotICAgICAgICAgICAgc2VbMTJdLAotICAgICAgICAgICAgc2VbMTNdLAotICAgICAgICAgICAgc2VbMTRdLAotICAgICAgICAgICAgc2VbMl0gIAotICAgICAgICB9OwotCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50QXJyYXkoT2JqZWN0W10gYXJyYXkpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGFycmF5W2ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlsiICsgaSArICJdID0gIiArIGFycmF5W2ldKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tICIgKyBnZXROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgY29tcGFyYXRvciA9IG5ldyBUZXN0Q29tcGFyYXRvcigpOwotICAgICAgICBjb2xsZWN0aW9uID0gbmV3IExhenlTb3J0ZWRDb2xsZWN0aW9uKGNvbXBhcmF0b3IpOwotICAgICAgICAvLyBFbnN1cmUgYSBwcmVkaWN0YWJsZSB0cmVlIHN0cnVjdHVyZQotICAgICAgICBjb2xsZWN0aW9uLmVuYWJsZURlYnVnID0gdHJ1ZTsKLSAgICAgCi0gICAgICAgIGNvbXBhcmlzb25Db21wYXJhdG9yID0gbmV3IFRlc3RDb21wYXJhdG9yKCk7Ci0gICAgICAgIGNvbXBhcmlzb25Db2xsZWN0aW9uID0gbmV3IFRyZWVTZXQoY29tcGFyaXNvbkNvbXBhcmF0b3IpOwotICAgICAgICAKLSAgICAgICAgYWRkQWxsKGVsZW1lbnRzKTsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb21wYXJpc29ucyByZXF1aXJlZCBieSBsYXp5IGNvbGxlY3Rpb246ICIgKyBjb21wYXJhdG9yLmNvbXBhcmlzb25zKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb21wYXJpc29ucyByZXF1aXJlZCBieSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb246ICIgKyBjb21wYXJpc29uQ29tcGFyYXRvci5jb21wYXJpc29ucyk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0gICAgICAgIAotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wdXRlcyB0aGUgZW50cmllcyB0aGF0IGFyZSBleHBlY3RlZCB0byBsaWUgaW4gdGhlIGdpdmVuIHJhbmdlLiBUaGUgcmVzdWx0Ci0gICAgICogaXMgc29ydGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0W10gY29tcHV0ZUV4cGVjdGVkRWxlbWVudHNJblJhbmdlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotICAgICAgICBpbnQgY291bnRlciA9IDA7Ci0gICAgICAgIAotICAgICAgICBJdGVyYXRvciBpdGVyID0gY29tcGFyaXNvbkNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUoaXRlci5oYXNOZXh0KCkgJiYgY291bnRlciA8IHN0YXJ0KSB7Ci0gICAgICAgICAgICBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGNvdW50ZXIrKzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtsZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0W2ldID0gaXRlci5uZXh0KCk7IAotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEFsbChPYmplY3RbXSBlbGVtZW50cykgewotICAgICAgICBjb2xsZWN0aW9uLmFkZEFsbChlbGVtZW50cyk7Ci0gICAgICAgIGNvbXBhcmlzb25Db2xsZWN0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGVsZW1lbnRzKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGQoT2JqZWN0IHRvQWRkKSB7Ci0gICAgICAgIGNvbGxlY3Rpb24uYWRkKHRvQWRkKTsKLSAgICAgICAgY29tcGFyaXNvbkNvbGxlY3Rpb24uYWRkKHRvQWRkKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZShPYmplY3QgdG9SZW1vdmUpIHsKLSAgICAgICAgY29sbGVjdGlvbi5yZW1vdmUodG9SZW1vdmUpOwotICAgICAgICBjb21wYXJpc29uQ29sbGVjdGlvbi5yZW1vdmUodG9SZW1vdmUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIGNvbGxlY3Rpb24ucmVtb3ZlUmFuZ2Uoc3RhcnQsIGxlbmd0aCk7Ci0gICAgICAgIAotICAgICAgICBPYmplY3RbXSBleHBlY3RlZCA9IGNvbXB1dGVFeHBlY3RlZEVsZW1lbnRzSW5SYW5nZShzdGFydCwgbGVuZ3RoKTsKLQotICAgICAgICAvLyBBbHRlcm5hdGl2ZSByZW1vdmUgaW1wbGVtZW50YXRpb24gdGhhdCByZW1vdmVzIG9uZS1hdC1hLXRpbWUKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGV4cGVjdGVkW2ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb21wYXJpc29uQ29sbGVjdGlvbi5yZW1vdmUoZXhwZWN0ZWRbaV0pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgY29sbGVjdGlvbi5jbGVhcigpOwotICAgICAgICBjb21wYXJpc29uQ29sbGVjdGlvbi5jbGVhcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGb3JjZSB0aGUgY29sbGVjdGlvbiB0byBzb3J0IGFsbCBlbGVtZW50cyBpbW1lZGlhdGVseS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZvcmNlRnVsbFNvcnQoKSB7Ci0gICAgICAgIHF1ZXJ5UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCB0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydENvbnRlbnRzVmFsaWQoKSB7Ci0gICAgICAgIHF1ZXJ5UmFuZ2UoMCwgY29tcGFyaXNvbkNvbGxlY3Rpb24uc2l6ZSgpLCBmYWxzZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY29tcGFyaXNvbkNvbGxlY3Rpb24uc2l6ZSgpLCBjb2xsZWN0aW9uLnNpemUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY29tcGFyaXNvbkNvbGxlY3Rpb24uaXNFbXB0eSgpLCBjb2xsZWN0aW9uLmlzRW1wdHkoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRJc1Blcm11dGF0aW9uKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0gICAgICAgIE9iamVjdFtdIHNvcnRlZDEgPSBuZXcgT2JqZWN0W2FycmF5MS5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgc29ydGVkMSwgMCwgYXJyYXkxLmxlbmd0aCk7Ci0gICAgICAgIEFycmF5cy5zb3J0KHNvcnRlZDEsIG5ldyBUZXN0Q29tcGFyYXRvcigpKTsKLSAgICAgICAgCi0gICAgICAgIE9iamVjdFtdIHNvcnRlZDIgPSBuZXcgT2JqZWN0W2FycmF5Mi5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgc29ydGVkMiwgMCwgYXJyYXkyLmxlbmd0aCk7Ci0gICAgICAgIEFycmF5cy5zb3J0KHNvcnRlZDIsIG5ldyBUZXN0Q29tcGFyYXRvcigpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHNvcnRlZDEsIHNvcnRlZDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFF1ZXJpZXMgdGhlIGNvbGxlY3Rpb24gZm9yIHRoZSBnaXZlbiByYW5nZSwgYW5kIHRocm93cyBhbiBhc3NlcnRhdGlvbiBmYWlsdXJlIGlmIHRoZSAKLSAgICAgKiByZXN1bHQgd2FzIHVuZXhwZWN0ZWQuIEFzc3VtZXMgdGhhdCB0aGUgImVsZW1lbnRzIiBhcnJheSB3YXMgaW5pdGlhbGx5IGFkZGVkIGFuZCB0aGF0IG5vdGhpbmcKLSAgICAgKiBoYXMgYmVlbiBhZGRlZCBvciByZW1vdmVkIHNpbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiBAcGFyYW0gc29ydGVkCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0W10gcXVlcnlSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgsIGJvb2xlYW4gc29ydGVkKSB7Ci0gICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbbGVuZ3RoXTsKLSAgICAgICAgCi0gICAgICAgIGludCByZXR1cm5WYWx1ZSA9IGNvbGxlY3Rpb24uZ2V0UmFuZ2UocmVzdWx0LCBzdGFydCwgc29ydGVkKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmV0dXJuVmFsdWUsIGxlbmd0aCk7Ci0gICAgICAgIAotICAgICAgICBPYmplY3RbXSBleHBlY3RlZFJlc3VsdCA9IGNvbXB1dGVFeHBlY3RlZEVsZW1lbnRzSW5SYW5nZShzdGFydCwgbGVuZ3RoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChzb3J0ZWQpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgc3VwcG9zZWQgdG8gYmUgc29ydGVkLCBpdCB3aWxsIG1hdGNoIHRoZSBleHBlY3RlZAotICAgICAgICAgICAgLy8gcmVzdWx0IGV4YWN0bHkKLSAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IG1lcmVseSBuZWVkcyB0byBiZSBhIHBlcm11dGF0aW9uIG9mIHRoZQotICAgICAgICAgICAgLy8gZXhwZWN0ZWQgcmVzdWx0LgotICAgICAgICAgICAgYXNzZXJ0SXNQZXJtdXRhdGlvbihyZXN1bHQsIGV4cGVjdGVkUmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29sbGVjdGlvbi50ZXN0SW52YXJpYW50cygpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEFycmF5RXF1YWxzKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkxLmxlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXJyYXkxW2ldLCBhcnJheTJbaV0pOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmlzb25Db3VudCgpIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImFkZGl0aW9ucyBzaG91bGQgbm90IHJlcXVpcmUgYW55IGNvbXBhcmlzb25zIiwgY29tcGFyYXRvci5jb21wYXJpc29ucyA9PSAwKTsKLSAgICAgICAgCi0gICAgICAgIHF1ZXJ5UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCBmYWxzZSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoInJlcXVlc3RpbmcgdGhlIGNvbXBsZXRlIHNldCBvZiB1bnNvcnRlZCBlbGVtZW50cyBzaG91bGQgbm90IHJlcXVpcmUgYW55IGNvbXBhcmlzb25zIiwgY29tcGFyYXRvci5jb21wYXJpc29ucyA9PSAwKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgbm8gY29tcGFyaXNvbnMgYXJlIHJlcXVpcmVkIGZvciByYW5nZSBxdWVyaWVzIG9uY2UgdGhlIGNvbGxlY3Rpb24gaXMgZnVsbHkgc29ydGVkCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTb3J0QWxsKCkgewotICAgICAgICAvLyBUZXN0IHRoYXQgc29ydGluZyB0aGUgZW50aXJlIGFycmF5IHdvcmtzCi0gICAgICAgIHF1ZXJ5UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIGludCBjb21wYXJpc29ucyA9IGNvbXBhcmF0b3IuY29tcGFyaXNvbnM7Ci0gICAgICAgIAotICAgICAgICAvLyBFbnN1cmUgdGhhdCBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgcmVxdWlyZSBubyBjb21wYXJpc29ucwotICAgICAgICBxdWVyeVJhbmdlKGVsZW1lbnRzLmxlbmd0aCAtIDEwLCAxMCwgdHJ1ZSk7Ci0gICAgICAgIHF1ZXJ5UmFuZ2UoMCwgMTAsIGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk9uY2UgdGhlIGxhenkgY29sbGVjdGlvbiBpcyBmdWxseSBzb3J0ZWQsIGl0IHNob3VsZCBub3QgcmVxdWlyZSBmdXJ0aGVyIGNvbXBhcmlzb25zIiwgCi0gICAgICAgICAgICAgICAgY29tcGFyaXNvbnMsIGNvbXBhcmF0b3IuY29tcGFyaXNvbnMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyBMYXp5U29ydGVkQ29sbGVjdGlvbi5yZW1vdmVOb2RlKGludCkgd2hlbiByZW1vdmluZyBhIGxlYWYgbm9kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMZWFmTm9kZSgpIHsKLSAgICAgICAgZm9yY2VGdWxsU29ydCgpOwotICAgICAgICByZW1vdmUoc2VbOV0pOwotICAgICAgICBhc3NlcnRDb250ZW50c1ZhbGlkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgTGF6eVNvcnRlZENvbGxlY3Rpb24ucmVtb3ZlTm9kZShpbnQpIHdoZW4gcmVtb3ZpbmcgYSBub2RlIHdpdGggbm8gbGVmdCBjaGlsZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb2RlV2l0aE5vTGVmdENoaWxkKCkgewotICAgICAgICBmb3JjZUZ1bGxTb3J0KCk7Ci0gICAgICAgIHJlbW92ZShzZVsyM10pOwotICAgICAgICBhc3NlcnRDb250ZW50c1ZhbGlkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgTGF6eVNvcnRlZENvbGxlY3Rpb24ucmVtb3ZlTm9kZShpbnQpIHdoZW4gcmVtb3ZpbmcgYSBub2RlIHdpdGggbm8gcmlnaHQgY2hpbGQKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vZGVXaXRoTm9SaWdodENoaWxkKCkgewotICAgICAgICBmb3JjZUZ1bGxTb3J0KCk7Ci0gICAgICAgIHJlbW92ZShzZVsxM10pOwotICAgICAgICBhc3NlcnRDb250ZW50c1ZhbGlkKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIExhenlTb3J0ZWRDb2xsZWN0aW9uLnJlbW92ZSB3aGVuIHJlbW92aW5nIHRoZSByb290IG5vZGUKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVJvb3ROb2RlKCkgewotICAgICAgICBmb3JjZUZ1bGxTb3J0KCk7Ci0gICAgICAgIHJlbW92ZShzZVsxOV0pOwotICAgICAgICBhc3NlcnRDb250ZW50c1ZhbGlkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgTGF6eVNvcnRlZENvbGxlY3Rpb24ucmVtb3ZlIHdoZW4gdGhlIHJlbW92YWwKLSAgICAgKiB3aWxsIHJlcXVpcmUgc3dhcHBpbmcgd2l0aCBhIG5vbi1sZWFmIG5vZGUuIChUaGUgZGVzY2VuZGVudCB3aXRoIHRoZSBjbG9zZXN0IHZhbHVlCi0gICAgICogaW4gdGhlIGxhcmdlc3Qgc3VidHJlZSBoYXMgYXQgbGVhc3QgMSBjaGlsZCkuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVXaGVyZVN3YXBwZWROb2RlSXNudExlYWYoKSB7Ci0gICAgICAgIGZvcmNlRnVsbFNvcnQoKTsKLSAgICAgICAgcmVtb3ZlKHNlWzE0XSk7Ci0gICAgICAgIGFzc2VydENvbnRlbnRzVmFsaWQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgTGF6eVNvcnRlZENvbGxlY3Rpb24ucmVtb3ZlIHdoZW4gdGhlIHJlbW92YWwKLSAgICAgKiB3aWxsIHJlcXVpcmUgc3dhcHBpbmcgd2l0aCBhIG5vbi1sZWFmIG5vZGUsIGFuZCBib3RoIHRoZSByZW1vdmVkIG5vZGUgYW5kIHRoZSBzd2FwcGVkCi0gICAgICogbm9kZSBjb250YWluIHVuc29ydGVkIGNoaWxkcmVuLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlV2l0aFVuc29ydGVkU3dhcCgpIHsKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UndmUgc29ydGVkIG5vZGVzIDEzIGFuZCAxNCAKLSAgICAgICAgcXVlcnlSYW5nZSgxNCwgMSwgdHJ1ZSk7Ci0gICAgICAgIHF1ZXJ5UmFuZ2UoMTMsIDEsIHRydWUpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIHNvbWUgdW5zb3J0ZWQgbm9kZXMgdGhhdCB3aWxsIGJlY29tZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSB3aXRoIHZhbHVlICJ2MTMgbW9uZ29vc2UiCi0gICAgICAgIGFkZEFsbChuZXcgU3RyaW5nW10geyJ2MTMgbiIsICJ2MTMgbCJ9KTsKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIG5ldyBub2RlcyBhcmUgcHVzaGVkIGRvd24gdG8gbm9kZSAxNCBieSBxdWVyeWluZyBpdHMgcGFyZW50IChjdXJyZW50bHkgYXQgcG9zaXRpb24gOCkKLSAgICAgICAgcXVlcnlSYW5nZSg4LCAxLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCBzb21lIHVuc29ydGVkIG5vZGVzIHRoYXQgd2lsbCBiZWNvbWUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgd2l0aCB2YWx1ZSAidjE0IG5vb2RsZSIgCi0gICAgICAgIGFkZEFsbChuZXcgU3RyaW5nW10geyJ2MTQgbSIsICJ2MTQgbyJ9KTsKLSAgICAgICAgLy8gUHVzaCBkb3duIHRoZSB1bnNvcnRlZCBub2RlcyBieSBxdWVyeWluZyBmb3IgdGhlIHBhcmVudCBvZiAidjE0IG5vb2RsZSIgCi0gICAgICAgIC8vICh0aGUgcGFyZW50IGlzIGN1cnJlbnRseSBhdCBwb3NpdGlvbiA3KSAKLSAgICAgICAgcXVlcnlSYW5nZSg3LCAxLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdyByZW1vdmUgbm9kZSB3aXRoIHZhbHVlICJ2MTQgbm9vZGxlIiAtLSB0aGlzIHNob3VsZCBzd2FwIGl0IHdpdGggdGhlIG5vZGUgInYxMyBtb25nb29zZSIsIHJlcXVpcmluZwotICAgICAgICAvLyBib3RoIHNldHMgb2YgdW5zb3J0ZWQgY2hpbGRyZW4gdG8gYmUgZGVhbHQgd2l0aAotICAgICAgICAKLSAgICAgICAgcmVtb3ZlKHNlWzE0XSk7Ci0gICAgICAgIGFzc2VydENvbnRlbnRzVmFsaWQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhbiBpbml0aWFsbHkgdW5zb3J0ZWQgY29sbGVjdGlvbgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRnJvbVVuc29ydGVkKCkgewotICAgICAgICByZW1vdmUoc2VbMTBdKTsKLSAgICAgICAgYXNzZXJ0Q29udGVudHNWYWxpZCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIHJvb3QgZnJvbSBhbiBpbml0aWFsbHktdW5zb3J0ZWQgY29sbGVjdGlvbgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUm9vdEZyb21VbnNvcnRlZCgpIHsKLSAgICAgICAgcmVtb3ZlKHNlWzE5XSk7Ci0gICAgICAgIGFzc2VydENvbnRlbnRzVmFsaWQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgcmVtb3ZpbmcgYW4gZWxlbWVudCB0aGF0IGlzbid0IGluIHRoZSBjb2xsZWN0aW9uIGlzIGEgbm8tb3AKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVVua25vd24oKSB7Ci0gICAgICAgIHJlbW92ZSgic29tZSB1bmtub3duIGVsZW1lbnQiKTsKLSAgICAgICAgYXNzZXJ0Q29udGVudHNWYWxpZCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSBzd2FwcyBkdXJpbmcgcmVtb3ZhbCBkb24ndCBtZXNzIHVwIHRoZSBpbnRlcm5hbCBoYXNobWFwLgotICAgICAqIFBlcmZvcm0gYSByZW1vdmFsIHRoYXQgd2lsbCByZXF1aXJlIGEgc3dhcCwgYWRkIGEgbmV3IGl0ZW0sIHRoZW4KLSAgICAgKiByZW1vdmUgdGhlIGl0ZW0gdGhhdCB3YXMgcHJldmlvdXNseSBzd2FwcGVkLiBJZiB0aGUgaGFzaG1hcCB3YXMgbm90IHVwZGF0ZWQsCi0gICAgICogdGhlbiB0aGUgcmVtb3ZlZCBpdGVtIG1heSBzdGlsbCBiZSBwb2ludGluZyB0byBpdHMgb2xkIGluZGV4IGFuZCB0aGUgCi0gICAgICogbmV3IGl0ZW0gd2lsbCBiZSByZW1vdmVkIGluc3RlYWQuIAotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJldmlvdXNseVN3YXBwZWROb2RlKCkgewotICAgICAgICBxdWVyeVJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgdHJ1ZSk7Ci0gICAgICAgIHJlbW92ZShzZVsxNF0pOwotICAgICAgICAvLyBBZGQgYSBuZXcgaXRlbSAtLSBzaG91bGQgcmV1c2UgdGhlIHNhbWUgaW5kZXggdXNlZCBieSB0aGUgcHJldmlvdXMgaXRlbQotICAgICAgICBhZGQoInNvbWV0aGluZyBuZXciKTsKLSAgICAgICAgYXNzZXJ0Q29udGVudHNWYWxpZCgpOwotICAgICAgICByZW1vdmUoc2VbMTNdKTsKLSAgICAgICAgYXNzZXJ0Q29udGVudHNWYWxpZCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYWxsIG5vZGVzIHVzaW5nIHJlbW92ZVJhbmdlCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGdWxsUmFuZ2UoKSB7Ci0gICAgICAgIHJlbW92ZVJhbmdlKDAsIHNlLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydENvbnRlbnRzVmFsaWQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGEgcmFuZ2UgdGhhdCBpbmNsdWRlcyB0aGUgc3RhcnQKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUZyb21TdGFydCgpIHsKLSAgICAgICAgcmVtb3ZlUmFuZ2UoMCwgc2UubGVuZ3RoIC8gMik7Ci0gICAgICAgIGFzc2VydENvbnRlbnRzVmFsaWQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGEgcmFuZ2UgdGhhdCBpbmNsdWRlcyB0aGUgbGFzdCBub2RlCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGcm9tRW5kKCkgewotICAgICAgICBpbnQgc3RhcnQgPSBzZS5sZW5ndGggLyAyOwotICAgICAgICByZW1vdmVSYW5nZShzdGFydCwgc2UubGVuZ3RoIC0gc3RhcnQpOwotICAgICAgICBhc3NlcnRDb250ZW50c1ZhbGlkKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIHJhbmdlIHRoYXQgaW5jbHVkZXMgdGhlIHJvb3QsIGJ1dCBsZWF2ZXMgbm9kZXMgaW4gYm90aCBzdWJ0cmVlcyBpbnRhY3QuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJbmNsdWRpbmdSb290KCkgewotICAgICAgICByZW1vdmVSYW5nZSgxNCwgNik7Ci0gICAgICAgIGFzc2VydENvbnRlbnRzVmFsaWQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCBib3VuZGFyeSBjb25kaXRpb25zOiAKLSAgICAgKiAKLSAgICAgKiBUZXN0cyBtb3ZpbmcgYW4gZW50aXJlIHJpZ2h0IHN1YnRyZWUsIGFuZCBhIGxlZnQgc3VidHJlZSBpbmNsdWRpbmcgdGhlIHRyZWUgaXRzZWxmCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVJpZ2h0U3VidHJlZSgpIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gMjA7Ci0gICAgICAgIHJlbW92ZVJhbmdlKDksIDUpOwotICAgICAgICBhc3NlcnRDb250ZW50c1ZhbGlkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBib3VuZGFyeSBjb25kaXRpb25zOiBUZXN0cyBtb3ZpbmcgYW4gZW50aXJlIGxlZnQgc3VidHJlZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMZWZ0U3VidHJlZSgpIHsKLSAgICAgICAgcmVtb3ZlUmFuZ2UoMywgNCk7Ci0gICAgICAgIGFzc2VydENvbnRlbnRzVmFsaWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGJvdW5kYXJ5IGNvbmRpdGlvbnM6IFRlc3RzIG1vdmluZyBhbiBlbnRpcmUgbGVmdCBzdWJ0cmVlIGluY2x1ZGluZyB0aGUgdHJlZSBpdHNlbGYKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUmlnaHRJbmNsdWRpbmdSb290KCkgewotICAgICAgICByZW1vdmVSYW5nZSgzLCA1KTsKLSAgICAgICAgYXNzZXJ0Q29udGVudHNWYWxpZCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0gICAgICAgIGNsZWFyKCk7Ci0gICAgICAgIGFzc2VydENvbnRlbnRzVmFsaWQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENsZWFyU29ydGVkKCkgewotICAgICAgICBmb3JjZUZ1bGxTb3J0KCk7Ci0gICAgICAgIGNsZWFyKCk7Ci0gICAgICAgIGFzc2VydENvbnRlbnRzVmFsaWQoKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gICAgCi0vLyAgICAKLS8vICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0QWRkaXRpb25zKCkgewotLy8gICAgICAgIFRlc3RDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgVGVzdENvbXBhcmF0b3IoKTsKLS8vICAgICAgICBMYXp5U29ydGVkQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbmV3IExhenlTb3J0ZWRDb2xsZWN0aW9uKGNvbXBhcmF0b3IpOwotLy8KLS8vICAgICAgICBhZGRTb21lRWxlbWVudHMoY29sbGVjdGlvbik7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjb21wYXJpc29ucyBhZnRlciBhZGQgPSAiICsgY29tcGFyYXRvci5jb21wYXJpc29ucyk7Ci0vLyAgICAgICAgY29tcGFyYXRvci5jb21wYXJpc29ucyA9IDA7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgLy8gR2V0Zmlyc3QxMEVsZW1lbnRzCi0vLyAgICAgICAgT2JqZWN0W10gZmlyc3QxMEVsZW1lbnRzID0gbmV3IE9iamVjdFsxMF07Ci0vLyAgICAgICAgY29sbGVjdGlvbi5nZXRGaXJzdChmaXJzdDEwRWxlbWVudHMsIGZhbHNlKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpcnN0IDEwIGVsZW1lbnRzOiIpOwotLy8gICAgICAgIHByaW50QXJyYXkoZmlyc3QxMEVsZW1lbnRzKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBhcmlzb25zIGFmdGVyIGdldEZpcnN0ID0gIiArIGNvbXBhcmF0b3IuY29tcGFyaXNvbnMpOwotLy8gICAgICAgIGNvbXBhcmF0b3IuY29tcGFyaXNvbnMgPSAwOwotLy8gICAgICAgIAotLy8gICAgICAgIGNvbGxlY3Rpb24ucHJpbnQoKTsKLS8vICAgICAgICAKLS8vICAgICAgICAvLyByZW1vdmUgdGhlIDEwdGggZWxlbWVudAotLy8gICAgICAgIGNvbGxlY3Rpb24ucmVtb3ZlKGZpcnN0MTBFbGVtZW50c1s5XSk7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgY29sbGVjdGlvbi5wcmludCgpOwotLy8KLS8vLy8gICAgICAgIAotLy8vLyAgICAgICAgY29sbGVjdGlvbi5nZXRGaXJzdChmaXJzdDEwRWxlbWVudHMsIHRydWUpOwotLy8vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaXJzdCAxMCBlbGVtZW50cyAoc29ydGVkKToiKTsKLS8vLy8gICAgICAgIHByaW50QXJyYXkoZmlyc3QxMEVsZW1lbnRzKTsKLS8vLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcGFyaXNvbnMgYWZ0ZXIgZ2V0Rmlyc3QgPSAiICsgY29tcGFyYXRvci5jb21wYXJpc29ucyk7Ci0vLy8vICAgICAgICBjb21wYXJhdG9yLmNvbXBhcmlzb25zID0gMDsKLS8vLy8gICAgICAgIAotLy8vLyAgICAgICAgCi0vLy8vICAgICAgICAKLS8vLy8gICAgICAgIC8vIGdldCBlbGVtZW50cyA4LTEzCi0vLy8vICAgICAgICBPYmplY3RbXSBlaWdodFRocm91Z2gxNCA9IG5ldyBPYmplY3RbN107Ci0vLy8vICAgICAgICBjb2xsZWN0aW9uLmdldFJhbmdlKGVpZ2h0VGhyb3VnaDE0LCA4LCBmYWxzZSk7Ci0vLy8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVsZW1lbnRzIDgtMTQ6Iik7Ci0vLy8vICAgICAgICBwcmludEFycmF5KGVpZ2h0VGhyb3VnaDE0KTsKLS8vLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcGFyaXNvbnMgYWZ0ZXIgOC0xNCBxdWVyeSA9ICIgKyBjb21wYXJhdG9yLmNvbXBhcmlzb25zKTsKLS8vLy8gICAgICAgIGNvbXBhcmF0b3IuY29tcGFyaXNvbnMgPSAwOwotLy8gICAgICAgIAotLy8gICAgICAgIGNvbGxlY3Rpb24ucHJpbnQoKTsKLS8vICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9MaXN0Vmlld2VyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0xpc3RWaWV3ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZWY1MzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL0xpc3RWaWV3ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0Vmlld2VyVGVzdCBleHRlbmRzIFN0cnVjdHVyZWRWaWV3ZXJUZXN0IHsKLQotICAgIHB1YmxpYyBMaXN0Vmlld2VyVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RydWN0dXJlZFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMaXN0Vmlld2VyIHZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCk7Ci0gICAgICAgIHZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlc3RNb2RlbENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgcmV0dXJuIHZpZXdlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldEl0ZW1Db3VudCgpIHsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgZlZpZXdlci50ZXN0RmluZEl0ZW0oZmlyc3QpOwotICAgICAgICByZXR1cm4gbGlzdC5nZXRJdGVtQ291bnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEl0ZW1UZXh0KGludCBhdCkgewotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgZlZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgICAgIHJldHVybiBsaXN0LmdldEl0ZW0oYXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLSAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKExpc3RWaWV3ZXJUZXN0LmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFJldmVhbEJ1ZzY5MDc2KCkgewotICAgIAkvLyBUT0RPIHJlbW92ZSB0aGUgTWFjIE9TIGNoZWNrIHdoZW4gU1dUIGhhcyBmaXhlZCB0aGUgYnVnIGluIExpc3QuamF2YQotICAgIAkvLyBzZWUgYnVnIDExNjEwNQotICAgIAlpZiAoImNhcmJvbiIuZXF1YWxzKFNXVC5nZXRQbGF0Zm9ybSgpKSkgewotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0JCWZWaWV3ZXIgPSBudWxsOwotCQlpZiAoZlNoZWxsICE9IG51bGwpIHsKLQkJCWZTaGVsbC5kaXNwb3NlKCk7Ci0JCQlmU2hlbGwgPSBudWxsOwotCQl9Ci0JCW9wZW5Ccm93c2VyKCk7Ci0JCWZvciAoaW50IGkgPSA0MDsgaSA8IDQ1OyBpKyspIHsKLQkJCWZSb290RWxlbWVudCA9IFRlc3RFbGVtZW50LmNyZWF0ZU1vZGVsKDEsIGkpOwotCQkJZk1vZGVsID0gZlJvb3RFbGVtZW50LmdldE1vZGVsKCk7Ci0JCQlmVmlld2VyLnNldElucHV0KGZSb290RWxlbWVudCk7Ci0JCQlmb3IgKGludCBqID0gMzA7IGogPCBmUm9vdEVsZW1lbnQuZ2V0Q2hpbGRDb3VudCgpOyBqKyspIHsKLQkJCQlmVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmUm9vdEVsZW1lbnQKLQkJCQkJCS5nZXRGaXJzdENoaWxkKCkpLCB0cnVlKTsKLQkJCQlUZXN0RWxlbWVudCBjaGlsZCA9IGZSb290RWxlbWVudC5nZXRDaGlsZEF0KGopOwotCQkJCWZWaWV3ZXIucmV2ZWFsKGNoaWxkKTsKLQkJCQlMaXN0IGxpc3QgPSAoKExpc3RWaWV3ZXIpIGZWaWV3ZXIpLmdldExpc3QoKTsKLQkJCQlpbnQgdG9wSW5kZXggPSBsaXN0LmdldFRvcEluZGV4KCk7Ci0JCQkJLy8gZXZlbiB0aG91Z2ggd2UgcGFzcyBpbiByZXZlYWw9ZmFsc2UsIFNXVCBzdGlsbCBzY3JvbGxzIHRvIHNob3cgdGhlIHNlbGVjdGlvbiAoc2luY2UgMjAwMjA4MTUpCi0JCQkJZlZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY2hpbGQpLCBmYWxzZSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ0b3BJbmRleCBzaG91bGQgbm90IGNoYW5nZSBvbiBzZXRTZWxlY3Rpb24iLCB0b3BJbmRleCwgbGlzdAotCQkJCQkJLmdldFRvcEluZGV4KCkpOwotCQkJCWxpc3Quc2hvd1NlbGVjdGlvbigpOwotCQkJCWFzc2VydEVxdWFscygidG9wSW5kZXggc2hvdWxkIG5vdCBjaGFuZ2Ugb24gc2hvd1NlbGVjdGlvbiIsIHRvcEluZGV4LCBsaXN0Ci0JCQkJCQkuZ2V0VG9wSW5kZXgoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvTXVsdGlwbGVFcXVhbEVsZW1lbnRzVHJlZVZpZXdlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9NdWx0aXBsZUVxdWFsRWxlbWVudHNUcmVlVmlld2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWZmYzBkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9NdWx0aXBsZUVxdWFsRWxlbWVudHNUcmVlVmlld2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIFRlc3RzIFRyZWVWaWV3ZXIncyBzdXBwb3J0IGZvciBtdWx0aXBsZSBlcXVhbCBlbGVtZW50cyAoKS4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlwbGVFcXVhbEVsZW1lbnRzVHJlZVZpZXdlclRlc3QgZXh0ZW5kcyBUcmVlVmlld2VyVGVzdCB7Ci0KLQlwcml2YXRlIFRlc3RFbGVtZW50IGVsZW1lbnRfMjsKLQotCXByaXZhdGUgVGVzdEVsZW1lbnQgZWxlbWVudF8yXzE7Ci0KLQlwcml2YXRlIFRlc3RFbGVtZW50IGVsZW1lbnRfMl8xXzI7Ci0KLQlwcml2YXRlIFRlc3RFbGVtZW50IGVsZW1lbnRfMTsKLQotCXByaXZhdGUgVGVzdEVsZW1lbnQgZWxlbWVudF8xXzM7Ci0KLQlwcml2YXRlIFRyZWVQYXRoIHRyZWVQYXRoXzFfMl8yMV8yMTI7Ci0KLQlwcml2YXRlIFRyZWVQYXRoIHRyZWVQYXRoXzFfMjFfMjEyOwotCi0JcHJpdmF0ZSBUcmVlUGF0aCB0cmVlUGF0aF8xXzIxMjsKLQotCXByaXZhdGUgVHJlZVBhdGggdHJlZVBhdGhfMl8yMV8yMTI7Ci0KLQlwcml2YXRlIFRyZWVQYXRoIHRyZWVQYXRoXzE7Ci0KLQlwcml2YXRlIFRyZWVQYXRoIHRyZWVQYXRoXzFfMjE7Ci0KLQlwcml2YXRlIFRyZWVQYXRoIHRyZWVQYXRoXzJfMjE7Ci0KLQlwcml2YXRlIFRyZWVQYXRoIHRyZWVQYXRoXzFfMl8yMTsKLQotCXByaXZhdGUgVHJlZVBhdGggdHJlZVBhdGhfMV8yOwotCi0JcHJpdmF0ZSBUcmVlUGF0aCB0cmVlUGF0aF8yOwotCi0JcHVibGljIE11bHRpcGxlRXF1YWxFbGVtZW50c1RyZWVWaWV3ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKSB7Ci0JCXJldHVybiAoVHJlZVZpZXdlcikgZlZpZXdlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcE1vZGVsKCkgewotCQlmUm9vdEVsZW1lbnQgPSBUZXN0RWxlbWVudC5jcmVhdGVNb2RlbCgzLCAxMCk7Ci0JCWVsZW1lbnRfMiA9IGZSb290RWxlbWVudC5nZXRDaGlsZEF0KDIpOwotCQllbGVtZW50XzJfMSA9IGVsZW1lbnRfMi5nZXRDaGlsZEF0KDEpOwotCQllbGVtZW50XzJfMV8yID0gZWxlbWVudF8yXzEuZ2V0Q2hpbGRBdCgyKTsKLQkJZWxlbWVudF8xID0gZlJvb3RFbGVtZW50LmdldENoaWxkQXQoMSk7Ci0JCWVsZW1lbnRfMV8zID0gZWxlbWVudF8xLmdldENoaWxkQXQoMSk7Ci0JCWVsZW1lbnRfMS5hZGRDaGlsZChlbGVtZW50XzIsIG51bGwpOwotCQllbGVtZW50XzEuYWRkQ2hpbGQoZWxlbWVudF8yXzEsIG51bGwpOwotCQllbGVtZW50XzEuYWRkQ2hpbGQoZWxlbWVudF8yXzFfMiwgbnVsbCk7Ci0JCXRyZWVQYXRoXzFfMl8yMV8yMTIgPSBuZXcgVHJlZVBhdGgobmV3IE9iamVjdFtdIHsgZWxlbWVudF8xLCBlbGVtZW50XzIsCi0JCQkJZWxlbWVudF8yXzEsIGVsZW1lbnRfMl8xXzIgfSk7Ci0JCXRyZWVQYXRoXzFfMl8yMSA9IG5ldyBUcmVlUGF0aChuZXcgT2JqZWN0W10geyBlbGVtZW50XzEsIGVsZW1lbnRfMiwKLQkJCQllbGVtZW50XzJfMSB9KTsKLQkJdHJlZVBhdGhfMSA9IG5ldyBUcmVlUGF0aChuZXcgT2JqZWN0W10geyBlbGVtZW50XzEgfSk7Ci0JCXRyZWVQYXRoXzIgPSBuZXcgVHJlZVBhdGgobmV3IE9iamVjdFtdIHsgZWxlbWVudF8yIH0pOwotCQl0cmVlUGF0aF8xXzIgPSBuZXcgVHJlZVBhdGgobmV3IE9iamVjdFtdIHsgZWxlbWVudF8xLCBlbGVtZW50XzIgfSk7Ci0JCXRyZWVQYXRoXzFfMjEgPSBuZXcgVHJlZVBhdGgobmV3IE9iamVjdFtdIHsgZWxlbWVudF8xLCBlbGVtZW50XzJfMSB9KTsKLQkJdHJlZVBhdGhfMV8yMV8yMTIgPSBuZXcgVHJlZVBhdGgobmV3IE9iamVjdFtdIHsgZWxlbWVudF8xLCBlbGVtZW50XzJfMSwKLQkJCQllbGVtZW50XzJfMV8yIH0pOwotCQl0cmVlUGF0aF8xXzIxMiA9IG5ldyBUcmVlUGF0aChuZXcgT2JqZWN0W10geyBlbGVtZW50XzEsIGVsZW1lbnRfMl8xXzIgfSk7Ci0JCXRyZWVQYXRoXzJfMjFfMjEyID0gbmV3IFRyZWVQYXRoKG5ldyBPYmplY3RbXSB7IGVsZW1lbnRfMiwgZWxlbWVudF8yXzEsCi0JCQkJZWxlbWVudF8yXzFfMiB9KTsKLQkJdHJlZVBhdGhfMl8yMSA9IG5ldyBUcmVlUGF0aChuZXcgT2JqZWN0W10geyBlbGVtZW50XzIsIGVsZW1lbnRfMl8xIH0pOwotCQlmTW9kZWwgPSBmUm9vdEVsZW1lbnQuZ2V0TW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudE1hcCgpIHsKLQkJZ2V0VHJlZVZpZXdlcigpLmV4cGFuZFRvTGV2ZWwoZWxlbWVudF8xLCBBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0JCWdldFRyZWVWaWV3ZXIoKS5leHBhbmRUb0xldmVsKGVsZW1lbnRfMiwgQWJzdHJhY3RUcmVlVmlld2VyLkFMTF9MRVZFTFMpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0VHJlZVZpZXdlcigpLnRlc3RGaW5kSXRlbXMoZWxlbWVudF8xKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0VHJlZVZpZXdlcigpLnRlc3RGaW5kSXRlbXMoZWxlbWVudF8yKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0VHJlZVZpZXdlcigpLnRlc3RGaW5kSXRlbXMoZWxlbWVudF8yXzEpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscyg0LCBnZXRUcmVlVmlld2VyKCkudGVzdEZpbmRJdGVtcyhlbGVtZW50XzJfMV8yKS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb24oKSB7Ci0JCWdldFRyZWVWaWV3ZXIoKS5leHBhbmRUb0xldmVsKGVsZW1lbnRfMSwgQWJzdHJhY3RUcmVlVmlld2VyLkFMTF9MRVZFTFMpOwotCQlnZXRUcmVlVmlld2VyKCkuZXhwYW5kVG9MZXZlbChlbGVtZW50XzIsIEFic3RyYWN0VHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLQkJZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50XzFfMykpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJYXNzZXJ0VHJ1ZShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbik7Ci0JCUlUcmVlU2VsZWN0aW9uIHRyZWVTZWxlY3Rpb24gPSAoSVRyZWVTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBUcmVlU2VsZWN0aW9uKG5ldyBUcmVlUGF0aChuZXcgT2JqZWN0W10geyBlbGVtZW50XzEsCi0JCQkJZWxlbWVudF8xXzMgfSkpLCB0cmVlU2VsZWN0aW9uKTsKLQkJV2lkZ2V0W10gaXRlbXMgPSBnZXRUcmVlVmlld2VyKCkudGVzdEZpbmRJdGVtcyhlbGVtZW50XzJfMV8yKTsKLQkJVHJlZUl0ZW1bXSB0cmVlSXRlbXMgPSBuZXcgVHJlZUl0ZW1baXRlbXMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShpdGVtcywgMCwgdHJlZUl0ZW1zLCAwLCBpdGVtcy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoNCwgdHJlZUl0ZW1zLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJlZUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnROb3ROdWxsKHRyZWVJdGVtc1tpXSk7Ci0JCX0KLQkJZ2V0VHJlZVZpZXdlcigpLmdldFRyZWUoKS5zZXRTZWxlY3Rpb24odHJlZUl0ZW1zKTsKLQkJdHJlZVNlbGVjdGlvbiA9IChJVHJlZVNlbGVjdGlvbikgZ2V0VHJlZVZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQlMaXN0IHBhdGhzID0gQXJyYXlzLmFzTGlzdCh0cmVlU2VsZWN0aW9uLmdldFBhdGhzKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgcGF0aHMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXRocy5jb250YWlucyh0cmVlUGF0aF8xXzJfMjFfMjEyKSk7Ci0JCWFzc2VydFRydWUocGF0aHMuY29udGFpbnModHJlZVBhdGhfMV8yMV8yMTIpKTsKLQkJYXNzZXJ0VHJ1ZShwYXRocy5jb250YWlucyh0cmVlUGF0aF8xXzIxMikpOwotCQlhc3NlcnRUcnVlKHBhdGhzLmNvbnRhaW5zKHRyZWVQYXRoXzJfMjFfMjEyKSk7Ci0JCWdldFRyZWVWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oCi0JCQkJbmV3IFRyZWVTZWxlY3Rpb24obmV3IFRyZWVQYXRoW10geyB0cmVlUGF0aF8yXzIxXzIxMiB9KSk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRUcmVlVmlld2VyKCkuZ2V0VHJlZSgpLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQlhc3NlcnRNYXRjaGluZ1BhdGgodHJlZVBhdGhfMl8yMV8yMTIsIGdldFRyZWVWaWV3ZXIoKS5nZXRUcmVlKCkKLQkJCQkuZ2V0U2VsZWN0aW9uKClbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHBhbnNpb24oKSB7Ci0JCWdldFRyZWVWaWV3ZXIoKS5leHBhbmRUb0xldmVsKHRyZWVQYXRoXzFfMjFfMjEyLCAxKTsKLQkJYXNzZXJ0RXF1YWxzQXJyYXkoImVsZW1lbnQgZXhwYW5zaW9uIiwgbmV3IE9iamVjdFtdIHsgZWxlbWVudF8xLAotCQkJCWVsZW1lbnRfMl8xIH0sIGdldFRyZWVWaWV3ZXIoKS5nZXRFeHBhbmRlZEVsZW1lbnRzKCkpOwotCQlhc3NlcnRFcXVhbHNBcnJheSgicGF0aCBleHBhbnNpb24iLCBuZXcgT2JqZWN0W10geyB0cmVlUGF0aF8xLAotCQkJCXRyZWVQYXRoXzFfMjEgfSwgZ2V0VHJlZVZpZXdlcigpLmdldEV4cGFuZGVkVHJlZVBhdGhzKCkpOwotCQlnZXRUcmVlVmlld2VyKCkuc2V0RXhwYW5kZWRUcmVlUGF0aHMoCi0JCQkJbmV3IFRyZWVQYXRoW10geyB0cmVlUGF0aF8xLCB0cmVlUGF0aF8xXzIsIHRyZWVQYXRoXzFfMl8yMSwgdHJlZVBhdGhfMiwgdHJlZVBhdGhfMl8yMSB9KTsKLQkJYXNzZXJ0RXF1YWxzQXJyYXkoInBhdGggZXhwYW5zaW9uIiwgbmV3IE9iamVjdFtdIHsgdHJlZVBhdGhfMSwgdHJlZVBhdGhfMV8yLCB0cmVlUGF0aF8xXzJfMjEsIHRyZWVQYXRoXzIsIHRyZWVQYXRoXzJfMjEgfSwgZ2V0VHJlZVZpZXdlcigpLmdldEV4cGFuZGVkVHJlZVBhdGhzKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhc3NlcnRNYXRjaGluZ1BhdGgoVHJlZVBhdGggZXhwZWN0ZWRQYXRoLCBUcmVlSXRlbSBpdGVtKSB7Ci0JCWZvciAoaW50IGkgPSBleHBlY3RlZFBhdGguZ2V0U2VnbWVudENvdW50KCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJYXNzZXJ0Tm90TnVsbChpdGVtKTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFBhdGguZ2V0U2VnbWVudChpKSwgaXRlbS5nZXREYXRhKCkpOwotCQkJaXRlbSA9IGl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQl9Ci0JCWFzc2VydE51bGwoaXRlbSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZSgpIHsKLQkJLy8gbWF0ZXJpYWxpemUKLQkJZ2V0VHJlZVZpZXdlcigpLnNldEV4cGFuZGVkVHJlZVBhdGhzKAotCQkJCW5ldyBUcmVlUGF0aFtdIHsgdHJlZVBhdGhfMV8yXzIxLCB0cmVlUGF0aF8yXzIxIH0pOwotCQlXaWRnZXRbXSBpdGVtcyA9IGdldFRyZWVWaWV3ZXIoKS50ZXN0RmluZEl0ZW1zKGVsZW1lbnRfMl8xKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCIwLTItMSBuYW1lLTEiLCAoKFRyZWVJdGVtKSBpdGVtc1tpXSkuZ2V0VGV4dCgpKTsKLQkJfQotCQllbGVtZW50XzJfMS5zZXRMYWJlbCgiYmlsbHkiKTsKLQkJLy8gdGhlIHNldExhYmVsIGNhbGwgZmlyZXMgYSBjaGFuZ2UgZXZlbnQgd2hpY2ggcmVzdWx0cyBpbiBhIGNhbGwgbGlrZSB0aGlzOgotCQkvLyBnZXRUcmVlVmlld2VyKCkudXBkYXRlKGVsZW1lbnRfMl8xLCBudWxsKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCIwLTItMSBiaWxseSIsICgoVHJlZUl0ZW0pIGl0ZW1zW2ldKS5nZXRUZXh0KCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRXaXRob3V0TWF0ZXJpYWxpemUoKSB7Ci0JCVRlc3RFbGVtZW50IG5ld0VsZW1lbnQgPSBlbGVtZW50XzIuYWRkQ2hpbGQoVGVzdE1vZGVsQ2hhbmdlLklOU0VSVCk7Ci0JCWdldFRyZWVWaWV3ZXIoKS5zZXRFeHBhbmRlZFRyZWVQYXRocygKLQkJCQluZXcgVHJlZVBhdGhbXSB7IHRyZWVQYXRoXzFfMl8yMSwgdHJlZVBhdGhfMl8yMSB9KTsKLQkJV2lkZ2V0W10gaXRlbXMgPSBnZXRUcmVlVmlld2VyKCkudGVzdEZpbmRJdGVtcyhuZXdFbGVtZW50KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLmxlbmd0aCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBZnRlck1hdGVyaWFsaXplKCkgewotCQkvLyBtYXRlcmlhbGl6ZSBiZWZvcmUgYWRkaW5nCi0JCWdldFRyZWVWaWV3ZXIoKS5zZXRFeHBhbmRlZFRyZWVQYXRocygKLQkJCQluZXcgVHJlZVBhdGhbXSB7IHRyZWVQYXRoXzFfMl8yMSwgdHJlZVBhdGhfMl8yMSB9KTsKLQkJVGVzdEVsZW1lbnQgbmV3RWxlbWVudCA9IGVsZW1lbnRfMi5hZGRDaGlsZChUZXN0TW9kZWxDaGFuZ2UuSU5TRVJUKTsKLQkJZ2V0VHJlZVZpZXdlcigpLnNldEV4cGFuZGVkVHJlZVBhdGhzKAotCQkJCW5ldyBUcmVlUGF0aFtdIHsgdHJlZVBhdGhfMV8yXzIxLCB0cmVlUGF0aF8yXzIxIH0pOwotCQlXaWRnZXRbXSBpdGVtcyA9IGdldFRyZWVWaWV3ZXIoKS50ZXN0RmluZEl0ZW1zKG5ld0VsZW1lbnQpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMubGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9TaW1wbGVWaXJ0dWFsTGF6eVRyZWVWaWV3ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvU2ltcGxlVmlydHVhbExhenlUcmVlVmlld2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGJjNTI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9TaW1wbGVWaXJ0dWFsTGF6eVRyZWVWaWV3ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYXp5VHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLS8qKgotICogVGVzdHMgVHJlZVZpZXdlcidzIFZJUlRVQUwgc3VwcG9ydCB3aXRoIGEgbGF6eSBjb250ZW50IHByb3ZpZGVyLgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVWaXJ0dWFsTGF6eVRyZWVWaWV3ZXJUZXN0IGV4dGVuZHMgVmlld2VyVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fUk9PVFMgPSAxMDA7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FsbGJhY2tzRW5hYmxlZCA9IHRydWU7Ci0KLQlwcml2YXRlIGNsYXNzIExhenlUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUxhenlUcmVlQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudChPYmplY3QgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJCXVwZGF0ZUVsZW1lbnRDYWxsQ291bnQrKzsKLQkJCVN0cmluZyBwYXJlbnRTdHJpbmcgPSAoU3RyaW5nKSBwYXJlbnQ7Ci0JCQlPYmplY3QgY2hpbGRFbGVtZW50ID0gcGFyZW50U3RyaW5nICsgIi0iICsgaW5kZXg7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oY2hpbGRFbGVtZW50KTsKLQkJCWlmIChjYWxsYmFja3NFbmFibGVkKSB7Ci0JCQkJZ2V0VHJlZVZpZXdlcigpLnJlcGxhY2UocGFyZW50LCBpbmRleCwgY2hpbGRFbGVtZW50KTsKLQkJCQlnZXRUcmVlVmlld2VyKCkuc2V0Q2hpbGRDb3VudChjaGlsZEVsZW1lbnQsIDEwKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IHVwZGF0ZUVsZW1lbnRDYWxsQ291bnQgPSAwOwotCi0JcHVibGljIFNpbXBsZVZpcnR1YWxMYXp5VHJlZVZpZXdlclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpIHsKLQkJcmV0dXJuIChUcmVlVmlld2VyKSBmVmlld2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KCkgewotCQlTdHJpbmcgbGV0dGVyUiA9ICJSIjsKLQkJZ2V0VHJlZVZpZXdlcigpLnNldElucHV0KGxldHRlclIpOwotCQlnZXRUcmVlVmlld2VyKCkuc2V0Q2hpbGRDb3VudChsZXR0ZXJSLCBOVU1fUk9PVFMpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGZTaGVsbCwgU1dULlZJUlRVQUwpOwotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IExhenlUcmVlQ29udGVudFByb3ZpZGVyKCkpOwotCQlyZXR1cm4gdHJlZVZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb24oKSB7Ci0JCXByb2Nlc3NFdmVudHMoKTsKLQkJYXNzZXJ0VHJ1ZSgidHJlZSBzaG91bGQgaGF2ZSBpdGVtcyIsIGdldFRyZWVWaWV3ZXIoKS5nZXRUcmVlKCkKLQkJCQkuZ2V0SXRlbUNvdW50KCkgPiAwKTsKLQkJYXNzZXJ0VHJ1ZSgiY2FsbCB0byB1cGRhdGVFbGVtZW50IGV4cGVjdGVkIiwgdXBkYXRlRWxlbWVudENhbGxDb3VudCA+IDApOwotCQlhc3NlcnRUcnVlKAotCQkJCSJleHBlY3RlZCBjYWxscyB0byB1cGRhdGVFbGVtZW50IGZvciBsZXNzIHRoYW4gaGFsZiBvZiB0aGUgaXRlbXMiLAotCQkJCXVwZGF0ZUVsZW1lbnRDYWxsQ291bnQgPCBOVU1fUk9PVFMgLyAyKTsKLQkJYXNzZXJ0RXF1YWxzKCJSLTAiLCBnZXRUcmVlVmlld2VyKCkuZ2V0VHJlZSgpLmdldEl0ZW0oMCkuZ2V0VGV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kKCkgewotCQkvLyBUT0RPIHRlbXBvcmFyaWx5IGNvbW1lbnRlZCBvdXQgLSB0cmFja2VkIGJ5IEJ1ZyAxMTcxODQKLS8vCQlwcm9jZXNzRXZlbnRzKCk7Ci0vLwkJVHJlZSB0cmVlID0gZ2V0VHJlZVZpZXdlcigpLmdldFRyZWUoKTsKLS8vCQlnZXRUcmVlVmlld2VyKCkuZXhwYW5kVG9MZXZlbCgiUi0wIiwgMSk7Ci0vLwkJLy8gZm9yY2UgcmVkcmF3aW5nIHRoZSB0cmVlIC0gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIFNldERhdGEgZXZlbnQKLS8vCQl0cmVlLnVwZGF0ZSgpOwotLy8JCWFzc2VydEVxdWFscygxMCwgdHJlZS5nZXRJdGVtKDApLmdldEl0ZW1Db3VudCgpKTsKLS8vCQlUcmVlSXRlbSB0cmVlSXRlbSA9IHRyZWUuZ2V0SXRlbSgwKS5nZXRJdGVtKDMpOwotLy8JCWV4cGFuZEFuZE5vdGlmeSh0cmVlSXRlbSk7Ci0vLwkJLy8gZm9yY2UgcmVkcmF3aW5nIHRoZSB0cmVlIC0gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIFNldERhdGEgZXZlbnQKLS8vCQl0cmVlLnVwZGF0ZSgpOwotLy8JCWFzc2VydEVxdWFscygxMCwgdHJlZUl0ZW0uZ2V0SXRlbUNvdW50KCkpOwotLy8JCWFzc2VydEVxdWFscygxMCwgdHJlZUl0ZW0uZ2V0SXRlbXMoKS5sZW5ndGgpOwotLy8JCS8vIGludGVyYWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZEFuZE5vdGlmeShUcmVlSXRlbSB0cmVlSXRlbSkgewotCQkvLyBjYWxsYmFja3NFbmFibGVkID0gZmFsc2U7Ci0JCVRyZWUgdHJlZSA9IHRyZWVJdGVtLmdldFBhcmVudCgpOwotCQl0cmVlLnNldFJlZHJhdyhmYWxzZSk7Ci0JCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCQl0cnkgewotCQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCWV2ZW50Lml0ZW0gPSB0cmVlSXRlbTsKLQkJCWV2ZW50LnR5cGUgPSBTV1QuRXhwYW5kOwotCQkJdHJlZS5ub3RpZnlMaXN0ZW5lcnMoU1dULkV4cGFuZCwgZXZlbnQpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gY2FsbGJhY2tzRW5hYmxlZCA9IHRydWU7Ci0JCQl0cmVlLnNldFJlZHJhdyh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9TdHJ1Y3R1cmVkSXRlbVZpZXdlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9TdHJ1Y3R1cmVkSXRlbVZpZXdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjYzhhMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvU3RydWN0dXJlZEl0ZW1WaWV3ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrYWJsZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0cnVjdHVyZWRJdGVtVmlld2VyVGVzdCBleHRlbmRzIFN0cnVjdHVyZWRWaWV3ZXJUZXN0IHsKLQotICAgIHB1YmxpYyBTdHJ1Y3R1cmVkSXRlbVZpZXdlclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrRWxlbWVudCgpIHsKLQotICAgICAgICBpZiAoZlZpZXdlciBpbnN0YW5jZW9mIElDaGVja2FibGUpIHsKLSAgICAgICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIFRlc3RFbGVtZW50IGZpcnN0Zmlyc3QgPSBmaXJzdC5nZXRGaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgICAgIElDaGVja2FibGUgY3R2ID0gKElDaGVja2FibGUpIGZWaWV3ZXI7Ci0gICAgICAgICAgICBjdHYuc2V0Q2hlY2tlZChmaXJzdCwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGN0di5nZXRDaGVja2VkKGZpcnN0KSk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNraW5nIGFuIGludmlzaWJsZSBlbGVtZW50Ci0gICAgICAgICAgICBpZiAoZlZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikgewotICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgZmlyc3QgY2hpbGQgY2FuIG9ubHkgYmUgcmVzb2x2ZWQgaW4gYSB0cmVlCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjdHYuc2V0Q2hlY2tlZChmaXJzdGZpcnN0LCB0cnVlKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjdHYuZ2V0Q2hlY2tlZChmaXJzdGZpcnN0KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIWN0di5zZXRDaGVja2VkKGZpcnN0Zmlyc3QsIHRydWUpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCFjdHYuZ2V0Q2hlY2tlZChmaXJzdGZpcnN0KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN0di5zZXRDaGVja2VkKGZpcnN0LCBmYWxzZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCFjdHYuZ2V0Q2hlY2tlZChmaXJzdCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1N0cnVjdHVyZWRTZWxlY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvU3RydWN0dXJlZFNlbGVjdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5Y2U4MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvU3RydWN0dXJlZFNlbGVjdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBTdHJ1Y3R1cmVkU2VsZWN0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0gICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihTdHJ1Y3R1cmVkU2VsZWN0aW9uVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLSAgICAgICAgU3RyaW5nIGVsZW1lbnQgPSAiQSBzZWxlY3Rpb24iOwotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbDEgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50KTsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwyID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWwxLCBzZWwyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzMigpIHsKLSAgICAgICAgU3RyaW5nIGVsZW1lbnQxID0gIkEgc2VsZWN0aW9uIjsKLSAgICAgICAgU3RyaW5nIGVsZW1lbnQyID0gIkEgc2VsZWN0aW9uIjsKLSAgICAgICAgU3RyaW5nIGVsZW1lbnQzID0gIk90aGVyIjsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwxID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudDEpOwotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbDIgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50Mik7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsMyA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVsZW1lbnQzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbDEsIHNlbDIpOwotICAgICAgICBhc3NlcnRUcnVlKCFzZWwxLmVxdWFscyhzZWwzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsczMoKSB7IC8vIHR3byBlbXB0eSBzZWxlY3Rpb25zCi0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gZW1wdHkxID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBlbXB0eTIgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotICAgICAgICBhc3NlcnRUcnVlKGVtcHR5MS5lcXVhbHMoZW1wdHkyKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZW1wdHkyLmVxdWFscyhlbXB0eTEpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzNCgpIHsgLy8gZW1wdHkgc2VsZWN0aW9uIHdpdGggbm9uLWVtcHR5IHNlbGVjdGlvbgotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCJBIHNlbGVjdGlvbiIpOwotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIGVtcHR5ID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghc2VsLmVxdWFscyhlbXB0eSkpOwotICAgICAgICBhc3NlcnRUcnVlKCFlbXB0eS5lcXVhbHMoc2VsKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsczUoKSB7IC8vIGVxdWFsaXR5IGlzIG9yZGVyLWRlcGVuZGVudAotICAgICAgICBMaXN0IGwxID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsMS5hZGQoImVsZW1lbnQgMSIpOwotICAgICAgICBsMS5hZGQoImVsZW1lbnQgMiIpOwotCi0gICAgICAgIExpc3QgbDIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGwyLmFkZCgiZWxlbWVudCAyIik7Ci0gICAgICAgIGwyLmFkZCgiZWxlbWVudCAxIik7Ci0KLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwxID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obDEpOwotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbDIgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsMik7Ci0gICAgICAgIGFzc2VydFRydWUoIXNlbDEuZXF1YWxzKHNlbDIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghc2VsMi5lcXVhbHMoc2VsMSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHM2KCkgeyAvLyBkaWZmZXJlbnQgc2VsZWN0aW9ucwotICAgICAgICBMaXN0IGwxID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsMS5hZGQoImVsZW1lbnQgMSIpOwotICAgICAgICBsMS5hZGQoImVsZW1lbnQgMiIpOwotCi0gICAgICAgIExpc3QgbDIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGwyLmFkZCgiZWxlbWVudCAyIik7Ci0gICAgICAgIGwyLmFkZCgiZWxlbWVudCAzIik7Ci0gICAgICAgIGwyLmFkZCgiZWxlbWVudCAxIik7Ci0KLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwxID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obDEpOwotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbDIgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsMik7Ci0gICAgICAgIGFzc2VydFRydWUoIXNlbDEuZXF1YWxzKHNlbDIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghc2VsMi5lcXVhbHMoc2VsMSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVtcHR5IHNlbGVjdGlvbnMgdmlhIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMuCi0gICAgICogUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNDAyNDUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsczcoKSB7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gZW1wdHkxID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBlbXB0eTIgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbXB0eTEuZXF1YWxzKGVtcHR5MikpOwotICAgICAgICBhc3NlcnRUcnVlKGVtcHR5Mi5lcXVhbHMoZW1wdHkxKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1N0cnVjdHVyZWRWaWV3ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvU3RydWN0dXJlZFZpZXdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM4ZGFlZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvU3RydWN0dXJlZFZpZXdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNpY1Byb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RydWN0dXJlZFZpZXdlclRlc3QgZXh0ZW5kcyBWaWV3ZXJUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0TGFiZWxGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9ICgoVGVzdEVsZW1lbnQpIGVsZW1lbnQpLmdldExhYmVsKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBsYWJlbC5pbmRleE9mKCItIik7Ci0gICAgICAgICAgICBpZiAoY291bnQgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIFN0cmluZyBudW1iZXIgPSBsYWJlbC5zdWJzdHJpbmcoY291bnQgKyAxKTsKLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIucGFyc2VJbnQobnVtYmVyKSAlIDIpID09IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHkuZXF1YWxzKElCYXNpY1Byb3BlcnR5Q29uc3RhbnRzLlBfVEVYVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RMYWJlbFNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdiwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLSAgICAgICAgICAgIC8vIHB1dCBncmVhdGVyIGxhYmVscyBmaXJzdAotICAgICAgICAgICAgU3RyaW5nIG5hbWUxID0gKChUZXN0RWxlbWVudCkgZTEpLmdldExhYmVsKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZTIgPSAoKFRlc3RFbGVtZW50KSBlMikuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgIHJldHVybiBuYW1lMi5jb21wYXJlVG8obmFtZTEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHkuZXF1YWxzKElCYXNpY1Byb3BlcnR5Q29uc3RhbnRzLlBfVEVYVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZnU3VmZml4ID0gIiI7Ci0KLSAgICAgICAgc3RhdGljIEltYWdlIGZnSW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoCi0gICAgICAgICAgICAgICAgVGVzdExhYmVsUHJvdmlkZXIuY2xhc3MsICJpbWFnZXMvamF2YS5naWYiKS5jcmVhdGVJbWFnZSgpOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVkU3RyaW5nKChUZXN0RWxlbWVudCkgZWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBmZ0ltYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBzdWZmaXgpIHsKLSAgICAgICAgICAgIGZnU3VmZml4ID0gc3VmZml4OwotICAgICAgICAgICAgZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKG5ldyBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50KHRoaXMpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJ1Y3R1cmVkVmlld2VyVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBidWxrQ2hhbmdlKFRlc3RNb2RlbENoYW5nZSBldmVudFRvRmlyZSkgewotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFRlc3RFbGVtZW50IG5ld0VsZW1lbnQgPSBmaXJzdC5nZXRDb250YWluZXIoKS5iYXNpY0FkZENoaWxkKCk7Ci0gICAgICAgIGZSb290RWxlbWVudC5iYXNpY0RlbGV0ZUNoaWxkKGZpcnN0KTsKLSAgICAgICAgZk1vZGVsLmZpcmVNb2RlbENoYW5nZWQoZXZlbnRUb0ZpcmUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJuZXcgc2libGluZyBpcyB2aXNpYmxlIiwgZlZpZXdlcgotICAgICAgICAgICAgICAgIC50ZXN0RmluZEl0ZW0obmV3RWxlbWVudCkpOwotICAgICAgICBhc3NlcnROdWxsKCJmaXJzdCBjaGlsZCBpcyBub3QgdmlzaWJsZSIsIGZWaWV3ZXIudGVzdEZpbmRJdGVtKGZpcnN0KSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRJdGVtQ291bnQoKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0SXRlbVRleHQoaW50IGF0KTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb3ZpZGVkU3RyaW5nKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzICsgIjxyZW5kZXJlZD4iICsgVGVzdExhYmVsUHJvdmlkZXIuZmdTdWZmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvdmlkZWRTdHJpbmcoVGVzdEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRJRCgpICsgIiAiICsgZWxlbWVudC5nZXRMYWJlbCgpICsgIjxyZW5kZXJlZD4iCi0gICAgICAgICAgICAgICAgKyBUZXN0TGFiZWxQcm92aWRlci5mZ1N1ZmZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTZWxlY3Rpb24oKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaXJzdCk7Ci0gICAgICAgIGZWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgICAgIGZWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotICAgICAgICBJU2VsZWN0aW9uIHJlc3VsdCA9IGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmlzRW1wdHkoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZUNoaWxkKCkgewotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0MiA9IGZpcnN0LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgZmlyc3QuZGVsZXRlQ2hpbGQoZmlyc3QyKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiZmlyc3QgY2hpbGQgaXMgbm90IHZpc2libGUiLCBmVmlld2VyLnRlc3RGaW5kSXRlbShmaXJzdDIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlSW5wdXQoKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3RmaXJzdCA9IGZpcnN0LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgZlJvb3RFbGVtZW50ID0gZmlyc3Q7Ci0gICAgICAgIHNldElucHV0KCk7Ci0gICAgICAgIGZSb290RWxlbWVudC5kZWxldGVDaGlsZChmaXJzdCk7Ci0gICAgICAgIGFzc2VydE51bGwoImZpcnN0IGNoaWxkIGlzIG5vdCB2aXNpYmxlIiwgZlZpZXdlcgotICAgICAgICAgICAgICAgIC50ZXN0RmluZEl0ZW0oZmlyc3RmaXJzdCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVTaWJsaW5nKCkgewotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoImZpcnN0IGNoaWxkIGlzIHZpc2libGUiLCBmVmlld2VyLnRlc3RGaW5kSXRlbShmaXJzdCkpOwotICAgICAgICBmUm9vdEVsZW1lbnQuZGVsZXRlQ2hpbGQoZmlyc3QpOwotICAgICAgICBhc3NlcnROdWxsKCJmaXJzdCBjaGlsZCBpcyBub3QgdmlzaWJsZSIsIGZWaWV3ZXIudGVzdEZpbmRJdGVtKGZpcnN0KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbHRlcigpIHsKLSAgICAgICAgVmlld2VyRmlsdGVyIGZpbHRlciA9IG5ldyBUZXN0TGFiZWxGaWx0ZXIoKTsKLSAgICAgICAgZlZpZXdlci5hZGRGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZmlsdGVyZWQgY291bnQiLCBnZXRJdGVtQ291bnQoKSA9PSA1KTsKLSAgICAgICAgZlZpZXdlci5yZW1vdmVGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgidW5maWx0ZXJlZCBjb3VudCIsIGdldEl0ZW1Db3VudCgpID09IDEwKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRDaGlsZCgpIHsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBUZXN0RWxlbWVudCBuZXdFbGVtZW50ID0gZmlyc3QuYWRkQ2hpbGQoVGVzdE1vZGVsQ2hhbmdlLklOU0VSVCk7Ci0gICAgICAgIGFzc2VydE51bGwoIm5ldyBzaWJsaW5nIGlzIG5vdCB2aXNpYmxlIiwgZlZpZXdlcgotICAgICAgICAgICAgICAgIC50ZXN0RmluZEl0ZW0obmV3RWxlbWVudCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRTaWJsaW5nKCkgewotICAgICAgICBUZXN0RWxlbWVudCBuZXdFbGVtZW50ID0gZlJvb3RFbGVtZW50LmFkZENoaWxkKFRlc3RNb2RlbENoYW5nZS5JTlNFUlQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJuZXcgc2libGluZyBpcyB2aXNpYmxlIiwgZlZpZXdlcgotICAgICAgICAgICAgICAgIC50ZXN0RmluZEl0ZW0obmV3RWxlbWVudCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRTaWJsaW5nUmV2ZWFsKCkgewotICAgICAgICBUZXN0RWxlbWVudCBuZXdFbGVtZW50ID0gZlJvb3RFbGVtZW50LmFkZENoaWxkKFRlc3RNb2RlbENoYW5nZS5JTlNFUlQKLSAgICAgICAgICAgICAgICB8IFRlc3RNb2RlbENoYW5nZS5SRVZFQUwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJuZXcgc2libGluZyBpcyB2aXNpYmxlIiwgZlZpZXdlcgotICAgICAgICAgICAgICAgIC50ZXN0RmluZEl0ZW0obmV3RWxlbWVudCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRTaWJsaW5ncygpIHsKLSAgICAgICAgVGVzdEVsZW1lbnRbXSBuZXdFbGVtZW50cyA9IGZSb290RWxlbWVudAotICAgICAgICAgICAgICAgIC5hZGRDaGlsZHJlbihUZXN0TW9kZWxDaGFuZ2UuSU5TRVJUKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdFbGVtZW50cy5sZW5ndGg7ICsraSkKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIm5ldyBzaWJsaW5ncyBhcmUgdmlzaWJsZSIsIGZWaWV3ZXIKLSAgICAgICAgICAgICAgICAgICAgLnRlc3RGaW5kSXRlbShuZXdFbGVtZW50c1tpXSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRTaWJsaW5nU2VsZWN0RXhwYW5kZWQoKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IG5ld0VsZW1lbnQgPSBmUm9vdEVsZW1lbnQuYWRkQ2hpbGQoVGVzdE1vZGVsQ2hhbmdlLklOU0VSVAotICAgICAgICAgICAgICAgIHwgVGVzdE1vZGVsQ2hhbmdlLlJFVkVBTCB8IFRlc3RNb2RlbENoYW5nZS5TRUxFQ1QpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJuZXcgc2libGluZyBpcyB2aXNpYmxlIiwgZlZpZXdlcgotICAgICAgICAgICAgICAgIC50ZXN0RmluZEl0ZW0obmV3RWxlbWVudCkpOwotICAgICAgICBhc3NlcnRTZWxlY3Rpb25FcXVhbHMoIm5ldyBlbGVtZW50IGlzIHNlbGVjdGVkIiwgbmV3RWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluc2VydFNpYmxpbmdXaXRoRmlsdGVyRmlsdGVyZWQoKSB7Ci0gICAgICAgIGZWaWV3ZXIuYWRkRmlsdGVyKG5ldyBUZXN0TGFiZWxGaWx0ZXIoKSk7Ci0gICAgICAgIFRlc3RFbGVtZW50IG5ld0VsZW1lbnQgPSBuZXcgVGVzdEVsZW1lbnQoZk1vZGVsLCBmUm9vdEVsZW1lbnQpOwotICAgICAgICBuZXdFbGVtZW50LnNldExhYmVsKCJuYW1lLTExMSIpOwotICAgICAgICBmUm9vdEVsZW1lbnQuYWRkQ2hpbGQobmV3RWxlbWVudCwgbmV3IFRlc3RNb2RlbENoYW5nZSgKLSAgICAgICAgICAgICAgICBUZXN0TW9kZWxDaGFuZ2UuSU5TRVJUIHwgVGVzdE1vZGVsQ2hhbmdlLlJFVkVBTAotICAgICAgICAgICAgICAgICAgICAgICAgfCBUZXN0TW9kZWxDaGFuZ2UuU0VMRUNULCBmUm9vdEVsZW1lbnQsIG5ld0VsZW1lbnQpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgibmV3IHNpYmxpbmcgaXMgbm90IHZpc2libGUiLCBmVmlld2VyCi0gICAgICAgICAgICAgICAgLnRlc3RGaW5kSXRlbShuZXdFbGVtZW50KSk7Ci0gICAgICAgIGFzc2VydFRydWUoZ2V0SXRlbUNvdW50KCkgPT0gNSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluc2VydFNpYmxpbmdXaXRoRmlsdGVyTm90RmlsdGVyZWQoKSB7Ci0gICAgICAgIGZWaWV3ZXIuYWRkRmlsdGVyKG5ldyBUZXN0TGFiZWxGaWx0ZXIoKSk7Ci0gICAgICAgIFRlc3RFbGVtZW50IG5ld0VsZW1lbnQgPSBuZXcgVGVzdEVsZW1lbnQoZk1vZGVsLCBmUm9vdEVsZW1lbnQpOwotICAgICAgICBuZXdFbGVtZW50LnNldExhYmVsKCJuYW1lLTIyMiIpOwotICAgICAgICBmUm9vdEVsZW1lbnQuYWRkQ2hpbGQobmV3RWxlbWVudCwgbmV3IFRlc3RNb2RlbENoYW5nZSgKLSAgICAgICAgICAgICAgICBUZXN0TW9kZWxDaGFuZ2UuSU5TRVJUIHwgVGVzdE1vZGVsQ2hhbmdlLlJFVkVBTAotICAgICAgICAgICAgICAgICAgICAgICAgfCBUZXN0TW9kZWxDaGFuZ2UuU0VMRUNULCBmUm9vdEVsZW1lbnQsIG5ld0VsZW1lbnQpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgibmV3IHNpYmxpbmcgaXMgdmlzaWJsZSIsIGZWaWV3ZXIKLSAgICAgICAgICAgICAgICAudGVzdEZpbmRJdGVtKG5ld0VsZW1lbnQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShnZXRJdGVtQ291bnQoKSA9PSA2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0U2libGluZ1dpdGhTb3J0ZXIoKSB7Ci0gICAgICAgIGZWaWV3ZXIuc2V0U29ydGVyKG5ldyBUZXN0TGFiZWxTb3J0ZXIoKSk7Ci0gICAgICAgIFRlc3RFbGVtZW50IG5ld0VsZW1lbnQgPSBuZXcgVGVzdEVsZW1lbnQoZk1vZGVsLCBmUm9vdEVsZW1lbnQpOwotICAgICAgICBuZXdFbGVtZW50LnNldExhYmVsKCJuYW1lLTk5OTkiKTsKLSAgICAgICAgZlJvb3RFbGVtZW50LmFkZENoaWxkKG5ld0VsZW1lbnQsIG5ldyBUZXN0TW9kZWxDaGFuZ2UoCi0gICAgICAgICAgICAgICAgVGVzdE1vZGVsQ2hhbmdlLklOU0VSVCB8IFRlc3RNb2RlbENoYW5nZS5SRVZFQUwKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgVGVzdE1vZGVsQ2hhbmdlLlNFTEVDVCwgZlJvb3RFbGVtZW50LCBuZXdFbGVtZW50KSk7Ci0gICAgICAgIFN0cmluZyBuZXdMYWJlbCA9IG5ld0VsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzb3J0ZWQgZmlyc3QiLCBuZXdMYWJlbCwgZ2V0SXRlbVRleHQoMCkpOwotICAgICAgICBhc3NlcnRTZWxlY3Rpb25FcXVhbHMoIm5ldyBlbGVtZW50IGlzIHNlbGVjdGVkIiwgbmV3RWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIC8vIEJVRzogbm9uLXBvbHltb3JwaGljIGJlaGF2aW91cgotICAgICAgICAvLyBpZiAoZlZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVmlld2VyIHx8IGZWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIpCi0gICAgICAgIC8vIAlyZXR1cm47Ci0gICAgICAgIGZWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihnZXRUZXN0TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBTdHJpbmcgbmV3TGFiZWwgPSBwcm92aWRlZFN0cmluZyhmaXJzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVuZGVyZWQgbGFiZWwiLCBuZXdMYWJlbCwgZ2V0SXRlbVRleHQoMCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gSUJhc2VMYWJlbFByb3ZkZXIgdXNlZCBpbiB0aGlzIHRlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgSUJhc2VMYWJlbFByb3ZpZGVyIGdldFRlc3RMYWJlbFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RMYWJlbFByb3ZpZGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExhYmVsUHJvdmlkZXJTdGF0ZUNoYW5nZSgpIHsKLSAgICAgICAgLy8gQlVHOiBub24tcG9seW1vcnBoaWMgYmVoYXZpb3VyCi0gICAgICAgIC8vIGlmIChmVmlld2VyIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIgfHwgZlZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVHJlZVZpZXdlcikKLSAgICAgICAgLy8gCXJldHVybjsKLSAgICAgICAgVGVzdExhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgVGVzdExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgZlZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgcHJvdmlkZXIuc2V0U3VmZml4KCJhZGRlZCBzdWZmaXgiKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBTdHJpbmcgbmV3TGFiZWwgPSBwcm92aWRlZFN0cmluZyhmaXJzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVuZGVyZWQgbGFiZWwiLCBuZXdMYWJlbCwgZ2V0SXRlbVRleHQoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5hbWUoKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xhYmVsID0gZmlyc3QuZ2V0TGFiZWwoKSArICIgY2hhbmdlZCI7Ci0gICAgICAgIGZpcnN0LnNldExhYmVsKG5ld0xhYmVsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGFuZ2VkIGxhYmVsIiwgZmlyc3QuZ2V0SUQoKSArICIgIiArIG5ld0xhYmVsLAotICAgICAgICAgICAgICAgIGdldEl0ZW1UZXh0KDApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuYW1lV2l0aEZpbHRlcigpIHsKLSAgICAgICAgZlZpZXdlci5hZGRGaWx0ZXIobmV3IFRlc3RMYWJlbEZpbHRlcigpKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBmaXJzdC5zZXRMYWJlbCgibmFtZS0xMTExIik7IC8vIHNob3VsZCBkaXNhcHBlYXIKLSAgICAgICAgYXNzZXJ0TnVsbCgiY2hhbmdlZCBzaWJsaW5nIGlzIG5vdCB2aXNpYmxlIiwgZlZpZXdlcgotICAgICAgICAgICAgICAgIC50ZXN0RmluZEl0ZW0oZmlyc3QpKTsKLSAgICAgICAgZmlyc3Quc2V0TGFiZWwoIm5hbWUtMjIyMiIpOyAvLyBzaG91bGQgcmVhcHBlYXIKLSAgICAgICAgZlZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoImNoYW5nZWQgc2libGluZyBpcyBub3QgdmlzaWJsZSIsIGZWaWV3ZXIKLSAgICAgICAgICAgICAgICAudGVzdEZpbmRJdGVtKGZpcnN0KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbmFtZVdpdGhMYWJlbFByb3ZpZGVyKCkgewotICAgICAgICBpZiAoZlZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVmlld2VyCi0gICAgICAgICAgICAgICAgfHwgZlZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVHJlZVZpZXdlcikKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZlZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUZXN0TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBmaXJzdC5zZXRMYWJlbCgiY2hhbmdlZCBuYW1lIik7Ci0gICAgICAgIFN0cmluZyBuZXdMYWJlbCA9IHByb3ZpZGVkU3RyaW5nKGZpcnN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW5kZXJlZCBsYWJlbCIsIG5ld0xhYmVsLCBnZXRJdGVtVGV4dCgwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbmFtZVdpdGhTb3J0ZXIoKSB7Ci0gICAgICAgIGZWaWV3ZXIuc2V0U29ydGVyKG5ldyBUZXN0TGFiZWxTb3J0ZXIoKSk7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgZmlyc3Quc2V0TGFiZWwoIm5hbWUtOTk5OSIpOwotICAgICAgICBTdHJpbmcgbmV3RWxlbWVudExhYmVsID0gZmlyc3QudG9TdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzb3J0ZWQgZmlyc3QiLCBuZXdFbGVtZW50TGFiZWwsIGdldEl0ZW1UZXh0KDApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0SW5wdXQoKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3RmaXJzdCA9IGZpcnN0LmdldEZpcnN0Q2hpbGQoKTsKLQotICAgICAgICBmUm9vdEVsZW1lbnQgPSBmaXJzdDsKLSAgICAgICAgc2V0SW5wdXQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZmlyc3QgY2hpbGQgaXMgdmlzaWJsZSIsIGZWaWV3ZXIKLSAgICAgICAgICAgICAgICAudGVzdEZpbmRJdGVtKGZpcnN0Zmlyc3QpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0U2VsZWN0aW9uKCkgewotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlyc3QpOwotICAgICAgICBmVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiByZXN1bHQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZWaWV3ZXIKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LnNpemUoKSA9PSAxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0Rmlyc3RFbGVtZW50KCkgPT0gZmlyc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb21lQ2hpbGRyZW5DaGFuZ2VkKCkgewotICAgICAgICBidWxrQ2hhbmdlKG5ldyBUZXN0TW9kZWxDaGFuZ2UoVGVzdE1vZGVsQ2hhbmdlLlNUUlVDVFVSRV9DSEFOR0UsCi0gICAgICAgICAgICAgICAgZlJvb3RFbGVtZW50KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNvcnRlcigpIHsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBUZXN0RWxlbWVudCBsYXN0ID0gZlJvb3RFbGVtZW50LmdldExhc3RDaGlsZCgpOwotICAgICAgICBpbnQgc2l6ZSA9IGZSb290RWxlbWVudC5nZXRDaGlsZENvdW50KCk7Ci0KLSAgICAgICAgU3RyaW5nIGZpcnN0TGFiZWwgPSBmaXJzdC50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgbGFzdExhYmVsID0gbGFzdC50b1N0cmluZygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInVuc29ydGVkIiwgZmlyc3RMYWJlbCwgZ2V0SXRlbVRleHQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInVuc29ydGVkIiwgbGFzdExhYmVsLCBnZXRJdGVtVGV4dChzaXplIC0gMSkpOwotICAgICAgICBmVmlld2VyLnNldFNvcnRlcihuZXcgVGVzdExhYmVsU29ydGVyKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJldmVyc2Ugc29ydGVkIiwgZmlyc3RMYWJlbCwgZ2V0SXRlbVRleHQoc2l6ZSAtIDEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXZlcnNlIHNvcnRlZCIsIGxhc3RMYWJlbCwgZ2V0SXRlbVRleHQoMCkpOwotCi0gICAgICAgIGZWaWV3ZXIuc2V0U29ydGVyKG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInVuc29ydGVkIiwgZmlyc3RMYWJlbCwgZ2V0SXRlbVRleHQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInVuc29ydGVkIiwgbGFzdExhYmVsLCBnZXRJdGVtVGV4dChzaXplIC0gMSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXb3JsZENoYW5nZWQoKSB7Ci0gICAgICAgIGJ1bGtDaGFuZ2UobmV3IFRlc3RNb2RlbENoYW5nZShUZXN0TW9kZWxDaGFuZ2UuU1RSVUNUVVJFX0NIQU5HRSwgbnVsbCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9UYWJsZUNvbG9yUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGFibGVDb2xvclByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDQ5ZDU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9UYWJsZUNvbG9yUHJvdmlkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIEluaXRpYWwgaW1wbGVtZW50YXRpb24gLSBHdW5uYXIgQWhsYmVyZyAoSUJTIEFCLCB3d3cuaWJzLm5ldCkKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBmdXJ0aGVyIHJldmlzaW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGFibGVWaWV3ZXJUZXN0LlRhYmxlVGVzdExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYXlvdXREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlQ29sb3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLS8qKgotICogVGhlIFRhYmxlQ29sb3JQcm92aWRlclRlc3QgaXMgYSB0ZXN0IHN1aXRlIGRlc2lnbmVkIHRvIHRlc3QgCi0gKiBJVGFibGVDb2xvclByb3ZpZGVycy4KLSAqLwotcHVibGljIGNsYXNzIFRhYmxlQ29sb3JQcm92aWRlclRlc3QgZXh0ZW5kcyBTdHJ1Y3R1cmVkVmlld2VyVGVzdCB7Ci0gICAgQ29sb3IgcmVkID0gbnVsbDsKLQotICAgIENvbG9yIGdyZWVuID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBUYWJsZUNvbG9yUHJvdmlkZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBUZXN0IHdpdGggYSBzdGFuZGFyZCBjb2xvciBwcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sb3JQcm92aWRlckZvcmVncm91bmQoKSB7Ci0gICAgICAgIFRhYmxlVmlld2VyIHZpZXdlciA9IChUYWJsZVZpZXdlcikgZlZpZXdlcjsKLSAgICAgICAgQ29sb3JWaWV3TGFiZWxQcm92aWRlciBwcm92aWRlciA9IG5ldyBDb2xvclZpZXdMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIAotICAgICAgICB2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0KLSAgICAgICAgLy9yZWZyZXNoIHNvIHRoYXQgdGhlIGNvbG9ycyBhcmUgc2V0Ci0gICAgICAgIGZWaWV3ZXIucmVmcmVzaCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiZm9yZWdyb3VuZCAxIGdyZWVuIiwgdmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbSgwKS5nZXRGb3JlZ3JvdW5kKDApLCBncmVlbik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoImZvcmVncm91bmQgMiBncmVlbiIsIHZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0oMCkuZ2V0Rm9yZWdyb3VuZCgxKSwgZ3JlZW4pOy8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcm92aWRlci5mRXh0ZW5kZWQgPSBmYWxzZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCB0aGUgYmFja2dyb3VuZHMgYXJlIGJlaW5nIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sb3JQcm92aWRlckJhY2tncm91bmQoKSB7Ci0gICAgICAgIFRhYmxlVmlld2VyIHZpZXdlciA9IChUYWJsZVZpZXdlcikgZlZpZXdlcjsKLSAgICAgICAgQ29sb3JWaWV3TGFiZWxQcm92aWRlciBwcm92aWRlciA9IG5ldyBDb2xvclZpZXdMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIAotICAgICAgICB2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgIAotICAgICAgICBmVmlld2VyLnJlZnJlc2goKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImJhY2tncm91bmQgMSByZWQiLCB2aWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtKDApLmdldEJhY2tncm91bmQoMCksIHJlZCk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoImJhY2tncm91bmQgMiByZWQiLCB2aWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtKDEpLmdldEJhY2tncm91bmQoMSksIHJlZCk7Ly8kTk9OLU5MUy0xJAotCi0gICAgICAgIHByb3ZpZGVyLmZFeHRlbmRlZCA9IGZhbHNlOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHRoZSBmb3JlZ3JvdW5kcyBhcmUgYmVpbmcgc2V0LgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRhYmxlSXRlbXNDb2xvclByb3ZpZGVyRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgVGFibGVWaWV3ZXIgdmlld2VyID0gKFRhYmxlVmlld2VyKSBmVmlld2VyOwotICAgICAgICBUYWJsZUNvbG9yVmlld0xhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgVGFibGVDb2xvclZpZXdMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIAotICAgICAgICB2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgIFRhYmxlIHRhYmxlID0gdmlld2VyLmdldFRhYmxlKCk7Ci0KLSAgICAgICAgZlZpZXdlci5yZWZyZXNoKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0YWJsZSBpdGVtIDEgZ3JlZW4iLCB0YWJsZS5nZXRJdGVtKDApLmdldEZvcmVncm91bmQoMCksIGdyZWVuKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscygidGFibGUgaXRlbSAyIHJlZCIsIHRhYmxlLmdldEl0ZW0oMCkuZ2V0Rm9yZWdyb3VuZCgxKSwgcmVkKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHByb3ZpZGVyLmZFeHRlbmRlZCA9IGZhbHNlOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGUgdGFibGUgaXRlbSBjb2xvdXJzLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRhYmxlSXRlbXNDb2xvclByb3ZpZGVyQmFja2dyb3VuZCgpIHsKLSAgICAgICAgVGFibGVWaWV3ZXIgdmlld2VyID0gKFRhYmxlVmlld2VyKSBmVmlld2VyOwotICAgICAgICBUYWJsZUNvbG9yVmlld0xhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgVGFibGVDb2xvclZpZXdMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIAotICAgICAgICB2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgIAotICAgICAgICBUYWJsZSB0YWJsZSA9IHZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBmVmlld2VyLnJlZnJlc2goKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoInRhYmxlIGl0ZW0gMSBiYWNrZ3JvdW5kIHJlZCIsIHRhYmxlLmdldEl0ZW0oMCkuZ2V0QmFja2dyb3VuZCgwKSwgcmVkKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscygidGFibGUgaXRlbSAyIGJhY2tncm91bmQgZ3JlZW4iLCB0YWJsZS5nZXRJdGVtKDApLmdldEJhY2tncm91bmQoMSksIGdyZWVuKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHByb3ZpZGVyLmZFeHRlbmRlZCA9IGZhbHNlOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyVGVzdCN0ZWFyRG93bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIHJlZC5kaXNwb3NlKCk7Ci0gICAgICAgIGdyZWVuLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXJUZXN0I3NldFVwKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgcmVkID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsIDAsIDApOwotICAgICAgICBncmVlbiA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMCwgMjU1LCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW4gYXMgYSBzdGFuZCBhbG9uZSB0ZXN0Ci0gICAgICogQHBhcmFtIGFyZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihUYWJsZUNvbG9yUHJvdmlkZXJUZXN0LmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXJUZXN0I2NyZWF0ZVZpZXdlcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgVGFibGVWaWV3ZXIgdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCk7Ci0gICAgICAgIHZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlc3RNb2RlbENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgCi0gICAgICAgIHZpZXdlci5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgICAgdmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHZpZXdlci5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBoZWFkZXJzW10gPSB7ICJjb2x1bW4gMSBoZWFkZXIiLCAiY29sdW1uIDIgaGVhZGVyIiB9Oy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIENvbHVtbkxheW91dERhdGEgbGF5b3V0c1tdID0geyBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDApLAotICAgICAgICAgICAgICAgIG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCkgfTsKLQotICAgICAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW5zW10gPSBuZXcgVGFibGVDb2x1bW5baGVhZGVycy5sZW5ndGhdOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbGF5b3V0LmFkZENvbHVtbkRhdGEobGF5b3V0c1tpXSk7Ci0gICAgICAgICAgICBUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbih2aWV3ZXIuZ2V0VGFibGUoKSwgU1dULk5PTkUsIGkpOwotICAgICAgICAgICAgdGMuc2V0UmVzaXphYmxlKGxheW91dHNbaV0ucmVzaXphYmxlKTsKLSAgICAgICAgICAgIHRjLnNldFRleHQoaGVhZGVyc1tpXSk7Ci0gICAgICAgICAgICBjb2x1bW5zW2ldID0gdGM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZpZXdlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldEl0ZW1Db3VudCgpIHsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBUYWJsZUl0ZW0gdGkgPSAoVGFibGVJdGVtKSBmVmlld2VyLnRlc3RGaW5kSXRlbShmaXJzdCk7Ci0gICAgICAgIFRhYmxlIHRhYmxlID0gdGkuZ2V0UGFyZW50KCk7Ci0gICAgICAgIHJldHVybiB0YWJsZS5nZXRJdGVtQ291bnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEl0ZW1UZXh0KGludCBhdCkgewotICAgICAgICBUYWJsZSB0YWJsZSA9IChUYWJsZSkgZlZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgICAgIHJldHVybiB0YWJsZS5nZXRJdGVtKGF0KS5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgY2xhc3MgVGFibGVDb2xvclZpZXdMYWJlbFByb3ZpZGVyIGV4dGVuZHMgVGFibGVUZXN0TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzCi0gICAgICAgICAgICBJVGFibGVDb2xvclByb3ZpZGVyIHsKLQotICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUNvbG9yUHJvdmlkZXIjZ2V0Rm9yZWdyb3VuZChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdyZWVuOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiByZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgCi0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlQ29sb3JQcm92aWRlciNnZXRCYWNrZ3JvdW5kKGphdmEubGFuZy5PYmplY3QsIGludCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVkOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ3JlZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2xhc3MgdG8gdGVzdCBjb2xvciBwcm92aWRpbmcgd2l0aG91dCBjb2xvdXJlZCBjb2x1bW5zLgotICAgICAqLwotICAgIGNsYXNzIENvbG9yVmlld0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBUYWJsZVRlc3RMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbG9yUHJvdmlkZXJ7Ci0gICAgCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyI2dldEJhY2tncm91bmQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gcmVkOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlciNnZXRGb3JlZ3JvdW5kKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGdyZWVuOwotCQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1RhYmxlRm9udFByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1RhYmxlRm9udFByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWIwNWM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9UYWJsZUZvbnRQcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5UYWJsZVZpZXdlclRlc3QuVGFibGVUZXN0TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxheW91dERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZvbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUZvbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi0vKioKLSAqIFRoZSBUYWJsZUZvbnRQcm92aWRlclRlc3QgaXMgYSB0ZXN0IHN1aXRlIGRlc2lnbmVkIHRvIHRlc3QKLSAqIElUYWJsZUZvbnRQcm92aWRlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUZvbnRQcm92aWRlclRlc3QgZXh0ZW5kcyBTdHJ1Y3R1cmVkVmlld2VyVGVzdCB7Ci0JRm9udCBmb250MTsKLQotCUZvbnQgZm9udDI7Ci0JCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgVGFibGVGb250UHJvdmlkZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqICBUZXN0IHRoZSBnZW5lcmFsIGZvbnQgcHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZvbnRQcm92aWRlcigpIHsKLQkJVGFibGVWaWV3ZXIgdmlld2VyID0gKFRhYmxlVmlld2VyKSBmVmlld2VyOwotCQkKLQkJRm9udFZpZXdMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEZvbnRWaWV3TGFiZWxQcm92aWRlcigpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0KLQotCQkvL3JlZnJlc2ggc28gdGhhdCB0aGUgY29sb3JzIGFyZSBzZXQKLQkJZlZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQljb21wYXJlRm9udERhdGFzKHZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0oMCkuZ2V0Rm9udCgwKSwgZm9udDEpOy8vJE5PTi1OTFMtMSQKLQkJY29tcGFyZUZvbnREYXRhcyh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtKDApLmdldEZvbnQoMSksIGZvbnQxKTsvLyROT04tTkxTLTEkCi0JCQotCi0JCXByb3ZpZGVyLmZFeHRlbmRlZCA9IGZhbHNlOwotCi0JfQotCi0JLyoqCi0JICogVGVzdCB0aGF0IHRoZSBmb250cyBhcmUgYmVpbmcgc2V0LgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVJdGVtc0ZvbnRQcm92aWRlcigpIHsKLQkJVGFibGVWaWV3ZXIgdmlld2VyID0gKFRhYmxlVmlld2VyKSBmVmlld2VyOwotCi0JCVRhYmxlRm9udFZpZXdMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFRhYmxlRm9udFZpZXdMYWJlbFByb3ZpZGVyKCk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQotCQlUYWJsZSB0YWJsZSA9IHZpZXdlci5nZXRUYWJsZSgpOwotCi0JCWZWaWV3ZXIucmVmcmVzaCgpOwotCi0JCWNvbXBhcmVGb250RGF0YXMoZm9udDEsIHRhYmxlLmdldEl0ZW0oMCkuZ2V0Rm9udCgwKSk7Ly8kTk9OLU5MUy0xJAotCQljb21wYXJlRm9udERhdGFzKGZvbnQyLHRhYmxlLmdldEl0ZW0oMCkuZ2V0Rm9udCgxKSk7Ly8kTk9OLU5MUy0xJAotCQlwcm92aWRlci5mRXh0ZW5kZWQgPSBmYWxzZTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyVGVzdCNzZXRVcCgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWZvbnQxID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udChKRmFjZVJlc291cmNlcy5CQU5ORVJfRk9OVCk7Ci0JCWZvbnQyID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udChKRmFjZVJlc291cmNlcy5IRUFERVJfRk9OVCk7Ci0JCQotCX0KLQotCS8qKgotCSAqIFJ1biBhcyBhIHN0YW5kIGFsb25lIHRlc3QKLQkgKiAKLQkgKiBAcGFyYW0gYXJncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJanVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKFRhYmxlRm9udFByb3ZpZGVyVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXJUZXN0I2NyZWF0ZVZpZXdlcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVGFibGVWaWV3ZXIgdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlc3RNb2RlbENvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLmdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl2aWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdmlld2VyLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJU3RyaW5nIGhlYWRlcnNbXSA9IHsgImNvbHVtbiAxIGhlYWRlciIsICJjb2x1bW4gMiBoZWFkZXIiIH07Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJQ29sdW1uTGF5b3V0RGF0YSBsYXlvdXRzW10gPSB7IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCksCi0JCQkJbmV3IENvbHVtbldlaWdodERhdGEoMTAwKSB9OwotCi0JCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbnNbXSA9IG5ldyBUYWJsZUNvbHVtbltoZWFkZXJzLmxlbmd0aF07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShsYXlvdXRzW2ldKTsKLQkJCVRhYmxlQ29sdW1uIHRjID0gbmV3IFRhYmxlQ29sdW1uKHZpZXdlci5nZXRUYWJsZSgpLCBTV1QuTk9ORSwgaSk7Ci0JCQl0Yy5zZXRSZXNpemFibGUobGF5b3V0c1tpXS5yZXNpemFibGUpOwotCQkJdGMuc2V0VGV4dChoZWFkZXJzW2ldKTsKLQkJCWNvbHVtbnNbaV0gPSB0YzsKLQkJfQotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0SXRlbUNvdW50KCkgewotCQlUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCVRhYmxlSXRlbSB0aSA9IChUYWJsZUl0ZW0pIGZWaWV3ZXIudGVzdEZpbmRJdGVtKGZpcnN0KTsKLQkJVGFibGUgdGFibGUgPSB0aS5nZXRQYXJlbnQoKTsKLQkJcmV0dXJuIHRhYmxlLmdldEl0ZW1Db3VudCgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SXRlbVRleHQoaW50IGF0KSB7Ci0JCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBmVmlld2VyLmdldENvbnRyb2woKTsKLQkJcmV0dXJuIHRhYmxlLmdldEl0ZW0oYXQpLmdldFRleHQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmVGb250RGF0YXMoRm9udCBmb250MSwgRm9udCBmb250Mil7Ci0JCQotCQlGb250RGF0YVtdIGZvbnQxRGF0YSA9IGZvbnQxLmdldEZvbnREYXRhKCk7Ci0JCUZvbnREYXRhW10gZm9udDJEYXRhID0gZm9udDIuZ2V0Rm9udERhdGEoKTsKLQkJCi0JCWFzc2VydFRydWUoIk1pc21hdGNoZWQgc2l6ZXMiLGZvbnQxRGF0YS5sZW5ndGggPT0gZm9udDJEYXRhLmxlbmd0aCk7Ci0JCWZvciAoaW50IGEgPSAwOyBhIDwgZm9udDJEYXRhLmxlbmd0aDsgYSsrKSB7Ci0JCQlhc3NlcnRUcnVlKCJNaXNtYXRjaGVkIGZvbnREYXRhIixmb250MURhdGFbYV0uZXF1YWxzKGZvbnQyRGF0YVthXSkpOwotCQl9Ci0JCQotCQkKLQl9Ci0KLQljbGFzcyBUYWJsZUZvbnRWaWV3TGFiZWxQcm92aWRlciBleHRlbmRzIFRhYmxlVGVzdExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cwotCQkJSVRhYmxlRm9udFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVGb250UHJvdmlkZXIjZ2V0Rm9udChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBGb250IGdldEZvbnQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwOgotCQkJCXJldHVybiBmb250MTsKLQotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZm9udDI7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEEgbGFiZWwgcHJvdmlkZXIgdGhhdCBkb2VzIG5vdCBwcm92aWRlIGZvbnQgc3VwcG9ydCBlbnRyeSBieSBlbnRyeS4KLQkgKi8KLQljbGFzcyBGb250Vmlld0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBUYWJsZVRlc3RMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMKLQkJCUlGb250UHJvdmlkZXIgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZvbnRQcm92aWRlciNnZXRGb250KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgRm9udCBnZXRGb250KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZm9udDE7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9UYWJsZVRyZWVWaWV3ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGFibGVUcmVlVmlld2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGYyZTJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9UYWJsZVRyZWVWaWV3ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxheW91dERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotCi1wdWJsaWMgY2xhc3MgVGFibGVUcmVlVmlld2VyVGVzdCBleHRlbmRzIEFic3RyYWN0VHJlZVZpZXdlclRlc3QgewotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUYWJsZVRyZWVUZXN0TGFiZWxQcm92aWRlciBleHRlbmRzIFRlc3RMYWJlbFByb3ZpZGVyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBmRXh0ZW5kZWQgPSBmYWxzZTsKLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChmRXh0ZW5kZWQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVkU3RyaW5nKChTdHJpbmcpIGVsZW1lbnQpOwotCi0gICAgICAgICAgICByZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChmRXh0ZW5kZWQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVkU3RyaW5nKChUZXN0RWxlbWVudCkgZWxlbWVudCk7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRhYmxlVHJlZVZpZXdlclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgVGFibGVUcmVlVmlld2VyIHZpZXdlciA9IG5ldyBUYWJsZVRyZWVWaWV3ZXIocGFyZW50KTsKLSAgICAgICAgdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVzdE1vZGVsQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICB2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGFibGVUcmVlVGVzdExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIHZpZXdlci5nZXRUYWJsZVRyZWUoKS5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgICAgdmlld2VyLmdldFRhYmxlVHJlZSgpLmdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHZpZXdlci5nZXRUYWJsZVRyZWUoKS5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBoZWFkZXJzW10gPSB7ICJjb2x1bW4gMSBoZWFkZXIiLCAiY29sdW1uIDIgaGVhZGVyIiB9OwotCi0gICAgICAgIENvbHVtbkxheW91dERhdGEgbGF5b3V0c1tdID0geyBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDApLAotICAgICAgICAgICAgICAgIG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCkgfTsKLQotICAgICAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW5zW10gPSBuZXcgVGFibGVDb2x1bW5baGVhZGVycy5sZW5ndGhdOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbGF5b3V0LmFkZENvbHVtbkRhdGEobGF5b3V0c1tpXSk7Ci0gICAgICAgICAgICBUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbih2aWV3ZXIuZ2V0VGFibGVUcmVlKCkuZ2V0VGFibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgU1dULk5PTkUsIGkpOwotICAgICAgICAgICAgdGMuc2V0UmVzaXphYmxlKGxheW91dHNbaV0ucmVzaXphYmxlKTsKLSAgICAgICAgICAgIHRjLnNldFRleHQoaGVhZGVyc1tpXSk7Ci0gICAgICAgICAgICBjb2x1bW5zW2ldID0gdGM7Ci0gICAgICAgIH0KLSAgICAgICAgZlRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICAgIHJldHVybiB2aWV3ZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRJdGVtQ291bnQoKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgVGFibGVUcmVlSXRlbSB0aSA9IChUYWJsZVRyZWVJdGVtKSBmVmlld2VyLnRlc3RGaW5kSXRlbShmaXJzdCk7Ci0gICAgICAgIFRhYmxlVHJlZSB0YWJsZSA9IHRpLmdldFBhcmVudCgpOwotICAgICAgICByZXR1cm4gdGFibGUuZ2V0SXRlbUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRJdGVtQ291bnQoVGVzdEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBUYWJsZVRyZWVJdGVtIHRpID0gKFRhYmxlVHJlZUl0ZW0pIGZWaWV3ZXIudGVzdEZpbmRJdGVtKGVsZW1lbnQpOwotICAgICAgICByZXR1cm4gdGkuZ2V0SXRlbUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJdGVtVGV4dChpbnQgYXQpIHsKLSAgICAgICAgVGFibGVUcmVlIHRhYmxlID0gKFRhYmxlVHJlZSkgZlZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgICAgIHJldHVybiB0YWJsZS5nZXRJdGVtcygpW2F0XS5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oVGFibGVUcmVlVmlld2VyVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIFRhYmxlVHJlZVZpZXdlciB2aWV3ZXIgPSAoVGFibGVUcmVlVmlld2VyKSBmVmlld2VyOwotICAgICAgICBUYWJsZVRyZWVUZXN0TGFiZWxQcm92aWRlciBwcm92aWRlciA9IChUYWJsZVRyZWVUZXN0TGFiZWxQcm92aWRlcikgdmlld2VyCi0gICAgICAgICAgICAgICAgLmdldExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgcHJvdmlkZXIuZkV4dGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgLy8gQlVHIDFGWjVTREM6IEpGVUlGOldJTk5UIC0gVGFibGVWaWV3ZXJDb2x1bW4gc2hvdWxkIGxpc3RlbiBmb3IgTGFiZWxQcm92aWRlciBjaGFuZ2VzCi0gICAgICAgIGZWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMYWJlbCA9IHByb3ZpZGVkU3RyaW5nKGZpcnN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW5kZXJlZCBsYWJlbCIsIG5ld0xhYmVsLCBnZXRJdGVtVGV4dCgwKSk7Ci0gICAgICAgIHByb3ZpZGVyLmZFeHRlbmRlZCA9IGZhbHNlOwotICAgICAgICAvLyBCVUcgMUZaNVNEQzogSkZVSUY6V0lOTlQgLSBUYWJsZVZpZXdlckNvbHVtbiBzaG91bGQgbGlzdGVuIGZvciBMYWJlbFByb3ZpZGVyIGNoYW5nZXMKLSAgICAgICAgZlZpZXdlci5yZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExhYmVsUHJvdmlkZXJTdGF0ZUNoYW5nZSgpIHsKLSAgICAgICAgVGFibGVUcmVlVmlld2VyIHZpZXdlciA9IChUYWJsZVRyZWVWaWV3ZXIpIGZWaWV3ZXI7Ci0gICAgICAgIFRhYmxlVHJlZVRlc3RMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gKFRhYmxlVHJlZVRlc3RMYWJlbFByb3ZpZGVyKSB2aWV3ZXIKLSAgICAgICAgICAgICAgICAuZ2V0TGFiZWxQcm92aWRlcigpOwotICAgICAgICBwcm92aWRlci5mRXh0ZW5kZWQgPSB0cnVlOwotICAgICAgICBwcm92aWRlci5zZXRTdWZmaXgoImFkZGVkIHN1ZmZpeCIpOwotICAgICAgICAvLyBCVUcgMUZaNVNEQzogSkZVSUY6V0lOTlQgLSBUYWJsZVZpZXdlckNvbHVtbiBzaG91bGQgbGlzdGVuIGZvciBMYWJlbFByb3ZpZGVyIGNoYW5nZXMKLSAgICAgICAgZlZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xhYmVsID0gcHJvdmlkZWRTdHJpbmcoZmlyc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbmRlcmVkIGxhYmVsIiwgbmV3TGFiZWwsIGdldEl0ZW1UZXh0KDApKTsKLSAgICAgICAgcHJvdmlkZXIuZkV4dGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIEJVRyAxRlo1U0RDOiBKRlVJRjpXSU5OVCAtIFRhYmxlVmlld2VyQ29sdW1uIHNob3VsZCBsaXN0ZW4gZm9yIExhYmVsUHJvdmlkZXIgY2hhbmdlcwotICAgICAgICBmVmlld2VyLnJlZnJlc2goKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGFibGVWaWV3ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGFibGVWaWV3ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NzFlYTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1RhYmxlVmlld2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYXlvdXREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi1wdWJsaWMgY2xhc3MgVGFibGVWaWV3ZXJUZXN0IGV4dGVuZHMgU3RydWN0dXJlZEl0ZW1WaWV3ZXJUZXN0IHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRhYmxlVGVzdExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBUZXN0TGFiZWxQcm92aWRlcgotCQkJaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIGJvb2xlYW4gZkV4dGVuZGVkID0gZmFsc2U7Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZkV4dGVuZGVkKQotCQkJCXJldHVybiBwcm92aWRlZFN0cmluZygoU3RyaW5nKSBlbGVtZW50KTsKLQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQkJaWYgKGZFeHRlbmRlZCkKLQkJCQlyZXR1cm4gcHJvdmlkZWRTdHJpbmcoKFRlc3RFbGVtZW50KSBlbGVtZW50KTsKLQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGFibGVWaWV3ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZpZXdlciB1c2VkIGJ5IHRoaXMgdGVzdCwgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCB3aWRnZXQuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVGFibGVWaWV3ZXIgdmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihnZXRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUYWJsZVRlc3RMYWJlbFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dChsYXlvdXQpOwotCQl2aWV3ZXIuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlTdHJpbmcgaGVhZGVyc1tdID0geyAiY29sdW1uIDEgaGVhZGVyIiwgImNvbHVtbiAyIGhlYWRlciIgfTsKLQotCQlDb2x1bW5MYXlvdXREYXRhIGxheW91dHNbXSA9IHsgbmV3IENvbHVtbldlaWdodERhdGEoMTAwKSwKLQkJCQluZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDApIH07Ci0KLQkJZmluYWwgVGFibGVDb2x1bW4gY29sdW1uc1tdID0gbmV3IFRhYmxlQ29sdW1uW2hlYWRlcnMubGVuZ3RoXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKGxheW91dHNbaV0pOwotCQkJVGFibGVDb2x1bW4gdGMgPSBuZXcgVGFibGVDb2x1bW4odmlld2VyLmdldFRhYmxlKCksIFNXVC5OT05FLCBpKTsKLQkJCXRjLnNldFJlc2l6YWJsZShsYXlvdXRzW2ldLnJlc2l6YWJsZSk7Ci0JCQl0Yy5zZXRUZXh0KGhlYWRlcnNbaV0pOwotCQkJY29sdW1uc1tpXSA9IHRjOwotCQl9Ci0KLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSB2aWV3ZXIuCi0JICogCi0JICogQHJldHVybiBJQ29udGVudFByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIFRlc3RNb2RlbENvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGVzdE1vZGVsQ29udGVudFByb3ZpZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSB0YWJsZSB2aWV3ZXIgZm9yIHRoZSB0ZXN0Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRhYmxlVmlld2VyKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRJdGVtQ291bnQoKSB7Ci0JCVRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJVGFibGVJdGVtIHRpID0gKFRhYmxlSXRlbSkgZlZpZXdlci50ZXN0RmluZEl0ZW0oZmlyc3QpOwotCQlUYWJsZSB0YWJsZSA9IHRpLmdldFBhcmVudCgpOwotCQlyZXR1cm4gdGFibGUuZ2V0SXRlbUNvdW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJdGVtVGV4dChpbnQgYXQpIHsKLQkJVGFibGUgdGFibGUgPSAoVGFibGUpIGZWaWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlyZXR1cm4gdGFibGUuZ2V0SXRlbShhdCkuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLQkJanVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKFRhYmxlVmlld2VyVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhYmVsUHJvdmlkZXIoKSB7Ci0KLQkJVGFibGVWaWV3ZXIgdmlld2VyID0gKFRhYmxlVmlld2VyKSBmVmlld2VyOwotCQlUYWJsZVRlc3RMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gKFRhYmxlVGVzdExhYmVsUHJvdmlkZXIpIHZpZXdlcgotCQkJCS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0KLQkJcHJvdmlkZXIuZkV4dGVuZGVkID0gdHJ1ZTsKLQkJLy8gQlVHIDFGWjVTREM6IEpGVUlGOldJTk5UIC0gVGFibGVWaWV3ZXJDb2x1bW4gc2hvdWxkIGxpc3RlbiBmb3IKLQkJLy8gTGFiZWxQcm92aWRlciBjaGFuZ2VzCi0JCWZWaWV3ZXIucmVmcmVzaCgpOwotCQlUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCVN0cmluZyBuZXdMYWJlbCA9IHByb3ZpZGVkU3RyaW5nKGZpcnN0KTsKLQkJYXNzZXJ0RXF1YWxzKCJyZW5kZXJlZCBsYWJlbCIsIG5ld0xhYmVsLCBnZXRJdGVtVGV4dCgwKSk7Ci0JCXByb3ZpZGVyLmZFeHRlbmRlZCA9IGZhbHNlOwotCQkvLyBCVUcgMUZaNVNEQzogSkZVSUY6V0lOTlQgLSBUYWJsZVZpZXdlckNvbHVtbiBzaG91bGQgbGlzdGVuIGZvcgotCQkvLyBMYWJlbFByb3ZpZGVyIGNoYW5nZXMKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWxQcm92aWRlclN0YXRlQ2hhbmdlKCkgewotCQlUYWJsZVZpZXdlciB0YWJsZXZpZXdlciA9IChUYWJsZVZpZXdlcikgZlZpZXdlcjsKLQkJVGFibGVUZXN0TGFiZWxQcm92aWRlciBwcm92aWRlciA9IChUYWJsZVRlc3RMYWJlbFByb3ZpZGVyKSB0YWJsZXZpZXdlcgotCQkJCS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0KLQkJcHJvdmlkZXIuZkV4dGVuZGVkID0gdHJ1ZTsKLQkJcHJvdmlkZXIuc2V0U3VmZml4KCJhZGRlZCBzdWZmaXgiKTsKLQkJLy8gQlVHIDFGWjVTREM6IEpGVUlGOldJTk5UIC0gVGFibGVWaWV3ZXJDb2x1bW4gc2hvdWxkIGxpc3RlbiBmb3IKLQkJLy8gTGFiZWxQcm92aWRlciBjaGFuZ2VzCi0JCXRhYmxldmlld2VyLnJlZnJlc2goKTsKLQkJVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlTdHJpbmcgbmV3TGFiZWwgPSBwcm92aWRlZFN0cmluZyhmaXJzdCk7Ci0JCWFzc2VydEVxdWFscygicmVuZGVyZWQgbGFiZWwiLCBuZXdMYWJlbCwgZ2V0SXRlbVRleHQoMCkpOwotCQlwcm92aWRlci5mRXh0ZW5kZWQgPSBmYWxzZTsKLQkJLy8gQlVHIDFGWjVTREM6IEpGVUlGOldJTk5UIC0gVGFibGVWaWV3ZXJDb2x1bW4gc2hvdWxkIGxpc3RlbiBmb3IKLQkJLy8gTGFiZWxQcm92aWRlciBjaGFuZ2VzCi0JCWZWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCVRhYmxlVmlld2VyIHRhYmxldmlld2VyID0gKFRhYmxlVmlld2VyKSBmVmlld2VyOwotCQlUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCSgoVGVzdEVsZW1lbnQpIGZWaWV3ZXIuZ2V0SW5wdXQoKSkuZGVsZXRlQ2hpbGQoZmlyc3QpOwotCQl0YWJsZXZpZXdlci5yZW1vdmUoZmlyc3QpOwotCQlhc3NlcnRUcnVlKCJSZW1vdmVkIGl0ZW0gc3RpbGwgZXhpc3RzIiwKLQkJCQlmVmlld2VyLnRlc3RGaW5kSXRlbShmaXJzdCkgPT0gbnVsbCk7Ci0KLQl9Ci0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1Rlc3RDb21wYXJhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGVzdENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxNGZjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGVzdENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotICAgIHB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyaXNvbnMgPSAwOwotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEudXRpbC5Db21wYXJhdG9yI2NvbXBhcmUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0gICAgICAgIGNvbXBhcmlzb25zKys7Ci0KLSAgICAgICAgcmV0dXJuIChhcmcwLnRvU3RyaW5nKCkpLmNvbXBhcmVUbyhhcmcxLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9UZXN0RWxlbWVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1Rlc3RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0M2M2NmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1Rlc3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgVGVzdEVsZW1lbnQgaW1wbGVtZW50cyBDbG9uZWFibGUgewotICAgIFRlc3RNb2RlbCBmTW9kZWw7Ci0KLSAgICBUZXN0RWxlbWVudCBmQ29udGFpbmVyOwotCi0gICAgU3RyaW5nIGZTb21lTmFtZTsKLQotICAgIFN0cmluZyBmSWQ7Ci0KLSAgICBWZWN0b3IgZkNoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotCi0gICAgYm9vbGVhbiBmSXNEZWxldGVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1NPTUVOQU1FID0gIm9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnRlc3QubmFtZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0NPTFVNTl8xID0gIm9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnRlc3QuY29sdW1uMSI7Ci0KLSAgICBwdWJsaWMgVGVzdEVsZW1lbnQoVGVzdE1vZGVsIG1vZGVsLCBUZXN0RWxlbWVudCBjb250YWluZXIpIHsKLSAgICAgICAgZk1vZGVsID0gbW9kZWw7Ci0gICAgICAgIGZDb250YWluZXIgPSBjb250YWluZXI7Ci0gICAgICAgIGludCBwID0gMDsKLSAgICAgICAgVGVzdEVsZW1lbnQgbGFzdFNpYmxpbmcgPSBjb250YWluZXIuZ2V0TGFzdENoaWxkKCk7Ci0gICAgICAgIGlmIChsYXN0U2libGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwID0gbGFzdFNpYmxpbmcuY2hpbGRJZCgpICsgMTsKLSAgICAgICAgfQotICAgICAgICBmSWQgPSBjb250YWluZXIuZ2V0SUQoKSArICItIiArIHA7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RFbGVtZW50KFRlc3RNb2RlbCBtb2RlbCwgVGVzdEVsZW1lbnQgY29udGFpbmVyLCBpbnQgbGV2ZWwsCi0gICAgICAgICAgICBpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgZk1vZGVsID0gbW9kZWw7Ci0gICAgICAgIGZDb250YWluZXIgPSBjb250YWluZXI7Ci0gICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGZJZCA9IGNvbnRhaW5lci5nZXRJRCgpICsgIi0iICsgcG9zaXRpb247Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZJZCA9IEludGVnZXIudG9TdHJpbmcocG9zaXRpb24pOwotICAgICAgICBmU29tZU5hbWUgPSAibmFtZS0iICsgcG9zaXRpb247Ci0KLSAgICAgICAgaWYgKGxldmVsIDwgbW9kZWwuZ2V0TnVtTGV2ZWxzKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kZWwuZ2V0TnVtQ2hpbGRyZW4oKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZkNoaWxkcmVuLmFkZChuZXcgVGVzdEVsZW1lbnQobW9kZWwsIHRoaXMsIGxldmVsICsgMSwgaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RFbGVtZW50IGFkZENoaWxkKGludCBldmVudCkgewotICAgICAgICBUZXN0RWxlbWVudCBlbGVtZW50ID0gbmV3IFRlc3RFbGVtZW50KGZNb2RlbCwgdGhpcyk7Ci0gICAgICAgIGVsZW1lbnQuZlNvbWVOYW1lID0gImFkZGVkIjsKLSAgICAgICAgYWRkQ2hpbGQoZWxlbWVudCwgbmV3IFRlc3RNb2RlbENoYW5nZShldmVudCwgdGhpcywgZWxlbWVudCkpOwotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEVsZW1lbnQgYWRkQ2hpbGQoVGVzdEVsZW1lbnQgZWxlbWVudCwgVGVzdE1vZGVsQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICBmQ2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotICAgICAgICBmTW9kZWwuZmlyZU1vZGVsQ2hhbmdlZChjaGFuZ2UpOwotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZHJlbihUZXN0RWxlbWVudFtdIGVsZW1lbnRzLCBUZXN0TW9kZWxDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBmQ2hpbGRyZW4uYWRkKGVsZW1lbnRzW2ldKTsKLSAgICAgICAgZk1vZGVsLmZpcmVNb2RlbENoYW5nZWQoY2hhbmdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEVsZW1lbnRbXSBhZGRDaGlsZHJlbihpbnQgZXZlbnQpIHsKLSAgICAgICAgVGVzdEVsZW1lbnQgZWxlbWVudHNbXSA9IG5ldyBUZXN0RWxlbWVudFtdIHsKLSAgICAgICAgICAgICAgICBuZXcgVGVzdEVsZW1lbnQoZk1vZGVsLCB0aGlzKSwgbmV3IFRlc3RFbGVtZW50KGZNb2RlbCwgdGhpcykgfTsKLQotICAgICAgICBlbGVtZW50c1swXS5mU29tZU5hbWUgPSAiYWRkZWQxIjsKLSAgICAgICAgZWxlbWVudHNbMV0uZlNvbWVOYW1lID0gImFkZGVkMiI7Ci0gICAgICAgIGFkZENoaWxkcmVuKGVsZW1lbnRzLCBuZXcgVGVzdE1vZGVsQ2hhbmdlKGV2ZW50LCB0aGlzLCBlbGVtZW50cykpOwotICAgICAgICByZXR1cm4gZWxlbWVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RFbGVtZW50IGJhc2ljQWRkQ2hpbGQoKSB7Ci0gICAgICAgIFRlc3RFbGVtZW50IGVsZW1lbnQgPSBuZXcgVGVzdEVsZW1lbnQoZk1vZGVsLCB0aGlzKTsKLSAgICAgICAgZWxlbWVudC5mU29tZU5hbWUgPSAiYWRkZWQiOwotICAgICAgICBmQ2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiYXNpY0RlbGV0ZUNoaWxkKFRlc3RFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgZkNoaWxkcmVuLnJlbW92ZShlbGVtZW50KTsKLSAgICAgICAgZWxlbWVudC5mSXNEZWxldGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjaGlsZElkKCkgewotICAgICAgICBTdHJpbmcgaWQgPSBmSWQuc3Vic3RyaW5nKGZJZC5sYXN0SW5kZXhPZigiLSIpICsgMSk7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpOyAvLyBzaG91bGQgbm90IGhhcHBlbgotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBUZXN0RWxlbWVudCBjcmVhdGVNb2RlbChpbnQgbnVtTGV2ZWxzLCBpbnQgbnVtQ2hpbGRyZW4pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0RWxlbWVudChuZXcgVGVzdE1vZGVsKG51bUxldmVscywgbnVtQ2hpbGRyZW4pLCBudWxsLCAwLAotICAgICAgICAgICAgICAgIDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNoaWxkKFRlc3RFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgZGVsZXRlQ2hpbGQoZWxlbWVudCwgbmV3IFRlc3RNb2RlbENoYW5nZShUZXN0TW9kZWxDaGFuZ2UuUkVNT1ZFLCB0aGlzLAotICAgICAgICAgICAgICAgIGVsZW1lbnQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVDaGlsZChUZXN0RWxlbWVudCBlbGVtZW50LCBUZXN0TW9kZWxDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGJhc2ljRGVsZXRlQ2hpbGQoZWxlbWVudCk7Ci0gICAgICAgIGZNb2RlbC5maXJlTW9kZWxDaGFuZ2VkKGNoYW5nZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlQ2hpbGRyZW4oKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBmQ2hpbGRyZW4uc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIFRlc3RFbGVtZW50IHRlID0gKFRlc3RFbGVtZW50KSBmQ2hpbGRyZW4uZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgZkNoaWxkcmVuLnJlbW92ZSh0ZSk7Ci0gICAgICAgICAgICB0ZS5mSXNEZWxldGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmTW9kZWwuZmlyZU1vZGVsQ2hhbmdlZChuZXcgVGVzdE1vZGVsQ2hhbmdlKAotICAgICAgICAgICAgICAgIFRlc3RNb2RlbENoYW5nZS5TVFJVQ1RVUkVfQ0hBTkdFLCB0aGlzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlU29tZUNoaWxkcmVuKCkgewotICAgICAgICBmb3IgKGludCBpID0gZkNoaWxkcmVuLnNpemUoKSAtIDE7IGkgPj0gMDsgaSAtPSAyKSB7Ci0gICAgICAgICAgICBUZXN0RWxlbWVudCB0ZSA9IChUZXN0RWxlbWVudCkgZkNoaWxkcmVuLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGZDaGlsZHJlbi5yZW1vdmUodGUpOwotICAgICAgICAgICAgdGUuZklzRGVsZXRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZk1vZGVsLmZpcmVNb2RlbENoYW5nZWQobmV3IFRlc3RNb2RlbENoYW5nZSgKLSAgICAgICAgICAgICAgICBUZXN0TW9kZWxDaGFuZ2UuU1RSVUNUVVJFX0NIQU5HRSwgdGhpcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYXJnKSB7Ci0gICAgICAgIGlmICghKGFyZyBpbnN0YW5jZW9mIFRlc3RFbGVtZW50KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgVGVzdEVsZW1lbnQgZWxlbWVudCA9IChUZXN0RWxlbWVudCkgYXJnOwotICAgICAgICByZXR1cm4gZWxlbWVudC5mSWQuZXF1YWxzKGZJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RFbGVtZW50IGdldENoaWxkQXQoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIChUZXN0RWxlbWVudCkgZkNoaWxkcmVuLmVsZW1lbnRBdChpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBmQ2hpbGRyZW4uc2l6ZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNoaWxkcmVuIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKiBAcmV0dXJuIFRlc3RFbGVtZW50W10KLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdEVsZW1lbnRbXSBnZXRDaGlsZHJlbigpewotICAgIAlUZXN0RWxlbWVudFtdIHJlc3VsdCA9IG5ldyBUZXN0RWxlbWVudFtmQ2hpbGRyZW4uc2l6ZSgpXTsKLSAgICAJZkNoaWxkcmVuLnRvQXJyYXkocmVzdWx0KTsKLSAgICAJcmV0dXJuIHJlc3VsdDsgICAgCQotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0RWxlbWVudCBnZXRDb250YWluZXIoKSB7Ci0gICAgICAgIHJldHVybiBmQ29udGFpbmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0RWxlbWVudCBnZXRGaXJzdENoaWxkKCkgewotICAgICAgICBpZiAoZkNoaWxkcmVuLnNpemUoKSA+IDApCi0gICAgICAgICAgICByZXR1cm4gKFRlc3RFbGVtZW50KSBmQ2hpbGRyZW4uZWxlbWVudEF0KDApOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgewotICAgICAgICByZXR1cm4gZklkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiBmU29tZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RFbGVtZW50IGdldExhc3RDaGlsZCgpIHsKLSAgICAgICAgaW50IHNpemUgPSBmQ2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA+IDApCi0gICAgICAgICAgICByZXR1cm4gKFRlc3RFbGVtZW50KSBmQ2hpbGRyZW4uZWxlbWVudEF0KHNpemUgLSAxKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RNb2RlbCBnZXRNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIGZNb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZklkLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKCkgewotICAgICAgICByZXR1cm4gZklzRGVsZXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgZlNvbWVOYW1lID0gbGFiZWw7Ci0gICAgICAgIGZNb2RlbC5maXJlTW9kZWxDaGFuZ2VkKG5ldyBUZXN0TW9kZWxDaGFuZ2UoCi0gICAgICAgICAgICAgICAgVGVzdE1vZGVsQ2hhbmdlLk5PTl9TVFJVQ1RVUkVfQ0hBTkdFLCB0aGlzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdGVzdERlbGV0ZWQoKSB7Ci0gICAgICAgIGlmIChmSXNEZWxldGVkKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChmQ29udGFpbmVyICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZkNvbnRhaW5lci50ZXN0RGVsZXRlZCgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldElEKCkgKyAiICIgKyBnZXRMYWJlbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9UZXN0TGFiZWxQcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1Rlc3RMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MmY4NjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1Rlc3RMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgVGVzdExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotICAgIHN0YXRpYyBJbWFnZSBmZ0ltYWdlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgaWYgKGZnSW1hZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgIGZnSW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoVGVzdExhYmVsUHJvdmlkZXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICJpbWFnZXMvamF2YS5naWYiKS5jcmVhdGVJbWFnZSgpOwotICAgICAgICByZXR1cm4gZmdJbWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIGdldEltYWdlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIFN0cmluZyBsYWJlbCA9IGVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIGxhYmVsICsgIiA8cmVuZGVyZWQ+IjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGVzdExhenlNb2RlbENvbnRlbnRQcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1Rlc3RMYXp5TW9kZWxDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2ZTdmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGVzdExhenlNb2RlbENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGF6eUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBUZXN0TGF6eU1vZGVsQ29udGVudFByb3ZpZGVyIGlzIHRoZSBsYXp5IHZlcnNpb24KLSAqIG9mIHRoZSBtb2RlbCBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdExhenlNb2RlbENvbnRlbnRQcm92aWRlciBleHRlbmRzIFRlc3RNb2RlbENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElMYXp5Q29udGVudFByb3ZpZGVyLCBJQ29udGVudFByb3ZpZGVyIHsKLQkKLQlUYWJsZVZpZXdlclRlc3QgdGVzdDsKLQlUZXN0RWxlbWVudCBpbnB1dDsKLQkKLQlUZXN0TGF6eU1vZGVsQ29udGVudFByb3ZpZGVyKFRhYmxlVmlld2VyVGVzdCB0ZXN0T2JqZWN0KXsKLQkJdGVzdCA9IHRlc3RPYmplY3Q7Ci0JCWlmKCEodGVzdE9iamVjdCBpbnN0YW5jZW9mIFZpcnR1YWxMYXp5VGFibGVWaWV3ZXJUZXN0KSkgewotCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJUZXN0TGF6eU1vZGVsQ29udGVudFByb3ZpZGVyIG9ubHkgd29ya3Mgd2l0aCBWaXJ0dWFsTGF6eVRhYmxlVmlld2VyVGVzdCIpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhenlDb250ZW50UHJvdmlkZXIjdXBkYXRlRWxlbWVudHMoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJCi0JCSgoVmlydHVhbExhenlUYWJsZVZpZXdlclRlc3QpdGVzdCkudXBkYXRlRWxlbWVudENhbGxlZChpbmRleCk7Ci0KLQkJaWYoaW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy9Ob3RoaW5nIHRvIHVwZGF0ZSB5ZXQKLQkJCi0gICAgICAgICgoVGFibGVWaWV3ZXIpIHRlc3QuZlZpZXdlcikucmVwbGFjZShpbnB1dC5nZXRDaGlsZEF0KGluZGV4KSwgaW5kZXgpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5UZXN0TW9kZWxDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RNb2RlbENvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlucHV0ID0gKFRlc3RFbGVtZW50KSBuZXdJbnB1dDsKLQkJKChUYWJsZVZpZXdlcil2aWV3ZXIpLnNldEl0ZW1Db3VudChpbnB1dD09bnVsbD8wOmlucHV0LmdldENoaWxkQ291bnQoKSk7Ci0JCXN1cGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdE1vZGVsQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCUFzc2VydC5pc1RydWUoZmFsc2UsIlNob3VsZCBub3QgZXZlciBjYWxsIGdldEVsZW1lbnRzIGlmIGxhenkiKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKGVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9UZXN0TW9kZWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9UZXN0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxOGIxMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGVzdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0TW9kZWwgewotICAgIFZlY3RvciBmTGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotCi0gICAgaW50IGZOdW1MZXZlbHM7Ci0KLSAgICBpbnQgZk51bUNoaWxkcmVuOwotCi0gICAgcHVibGljIFRlc3RNb2RlbChpbnQgbnVtTGV2ZWxzLCBpbnQgbnVtQ2hpbGRyZW4pIHsKLSAgICAgICAgZk51bUxldmVscyA9IG51bUxldmVsczsKLSAgICAgICAgZk51bUNoaWxkcmVuID0gbnVtQ2hpbGRyZW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVRlc3RNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGZMaXN0ZW5lcnMuYWRkRWxlbWVudChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlyZXMgYSBtb2RlbCBjaGFuZ2VkIGV2ZW50IHRvIGFsbCBsaXN0ZW5lcnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlyZU1vZGVsQ2hhbmdlZChUZXN0TW9kZWxDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZkxpc3RlbmVycy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgSVRlc3RNb2RlbExpc3RlbmVyIGxpc3RlbmVyID0gKElUZXN0TW9kZWxMaXN0ZW5lcikgZkxpc3RlbmVycwotICAgICAgICAgICAgICAgICAgICAuZ2V0KGkpOwotICAgICAgICAgICAgbGlzdGVuZXIudGVzdE1vZGVsQ2hhbmdlZChjaGFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROdW1DaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIGZOdW1DaGlsZHJlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE51bUxldmVscygpIHsKLSAgICAgICAgcmV0dXJuIGZOdW1MZXZlbHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVRlc3RNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGZMaXN0ZW5lcnMucmVtb3ZlRWxlbWVudChsaXN0ZW5lcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1Rlc3RNb2RlbENoYW5nZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1Rlc3RNb2RlbENoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OThhYmU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9UZXN0TW9kZWxDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzOwotCi1wdWJsaWMgY2xhc3MgVGVzdE1vZGVsQ2hhbmdlIHsKLSAgICBwcml2YXRlIGludCBmS2luZDsKLQotICAgIHByaXZhdGUgVGVzdEVsZW1lbnQgZlBhcmVudDsKLQotICAgIHByaXZhdGUgVGVzdEVsZW1lbnRbXSBmQ2hpbGRyZW47Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX01BU0sgPSAweDBGOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5TRVJUID0gMTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IDI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJVQ1RVUkVfQ0hBTkdFID0gMzsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTl9TVFJVQ1RVUkVfQ0hBTkdFID0gNDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFVkVBTCA9IDE2OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUID0gMzI7Ci0KLSAgICBwdWJsaWMgVGVzdE1vZGVsQ2hhbmdlKGludCBraW5kLCBUZXN0RWxlbWVudCBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyhraW5kLCBwYXJlbnQsIG5ldyBUZXN0RWxlbWVudFswXSk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RNb2RlbENoYW5nZShpbnQga2luZCwgVGVzdEVsZW1lbnQgcGFyZW50LCBUZXN0RWxlbWVudFtdIGNoaWxkcmVuKSB7Ci0gICAgICAgIGZLaW5kID0ga2luZDsKLSAgICAgICAgZlBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgZkNoaWxkcmVuID0gY2hpbGRyZW47Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RNb2RlbENoYW5nZShpbnQga2luZCwgVGVzdEVsZW1lbnQgcGFyZW50LCBUZXN0RWxlbWVudCBjaGlsZCkgewotICAgICAgICB0aGlzKGtpbmQsIHBhcmVudCwgbmV3IFRlc3RFbGVtZW50W10geyBjaGlsZCB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIGZDaGlsZHJlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0gICAgICAgIHJldHVybiBmS2luZCAmIEtJTkRfTUFTSzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKLSAgICAgICAgcmV0dXJuIGZLaW5kICYgfktJTkRfTUFTSzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEVsZW1lbnQgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gZlBhcmVudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGVzdE1vZGVsQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGVzdE1vZGVsQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDIzMTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1Rlc3RNb2RlbENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNpY1Byb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgVGVzdE1vZGVsQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRlc3RNb2RlbExpc3RlbmVyLAotICAgICAgICBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSVRyZWVDb250ZW50UHJvdmlkZXIgewotICAgIFZpZXdlciBmVmlld2VyOwotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0luc2VydChUZXN0TW9kZWxDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGlmIChmVmlld2VyIGluc3RhbmNlb2YgTGlzdFZpZXdlcikgewotICAgICAgICAgICAgaWYgKGNoYW5nZS5nZXRQYXJlbnQoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGNoYW5nZS5nZXRQYXJlbnQoKS5lcXVhbHMoZlZpZXdlci5nZXRJbnB1dCgpKSkgewotICAgICAgICAgICAgICAgICgoTGlzdFZpZXdlcikgZlZpZXdlcikuYWRkKGNoYW5nZS5nZXRDaGlsZHJlbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChmVmlld2VyIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpIHsKLSAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0UGFyZW50KCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBjaGFuZ2UuZ2V0UGFyZW50KCkuZXF1YWxzKGZWaWV3ZXIuZ2V0SW5wdXQoKSkpIHsKLSAgICAgICAgICAgICAgICAoKFRhYmxlVmlld2VyKSBmVmlld2VyKS5hZGQoY2hhbmdlLmdldENoaWxkcmVuKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpIHsKLSAgICAgICAgICAgICgoQWJzdHJhY3RUcmVlVmlld2VyKSBmVmlld2VyKS5hZGQoY2hhbmdlLmdldFBhcmVudCgpLCBjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkcmVuKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBDb21ib1ZpZXdlcikgewotICAgICAgICAgICAgKChDb21ib1ZpZXdlcikgZlZpZXdlcikuYWRkKGNoYW5nZS5nZXRDaGlsZHJlbigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGtpbmQgb2Ygdmlld2VyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb05vblN0cnVjdHVyZUNoYW5nZShUZXN0TW9kZWxDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGlmIChmVmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotICAgICAgICAgICAgKChTdHJ1Y3R1cmVkVmlld2VyKSBmVmlld2VyKS51cGRhdGUoY2hhbmdlLmdldFBhcmVudCgpLAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJQmFzaWNQcm9wZXJ0eUNvbnN0YW50cy5QX1RFWFQgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5rbm93biBraW5kIG9mIHZpZXdlciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9SZW1vdmUoVGVzdE1vZGVsQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICBpZiAoZlZpZXdlciBpbnN0YW5jZW9mIExpc3RWaWV3ZXIpIHsKLSAgICAgICAgICAgICgoTGlzdFZpZXdlcikgZlZpZXdlcikucmVtb3ZlKGNoYW5nZS5nZXRDaGlsZHJlbigpKTsKLSAgICAgICAgfSBlbHNlIGlmIChmVmlld2VyIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpIHsKLSAgICAgICAgICAgICgoVGFibGVWaWV3ZXIpIGZWaWV3ZXIpLnJlbW92ZShjaGFuZ2UuZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZlZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikgewotICAgICAgICAgICAgKChBYnN0cmFjdFRyZWVWaWV3ZXIpIGZWaWV3ZXIpLnJlbW92ZShjaGFuZ2UuZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZlZpZXdlciBpbnN0YW5jZW9mIENvbWJvVmlld2VyKSB7Ci0gICAgICAgICAgICAoKENvbWJvVmlld2VyKSBmVmlld2VyKS5yZW1vdmUoY2hhbmdlLmdldENoaWxkcmVuKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVua25vd24ga2luZCBvZiB2aWV3ZXIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU3RydWN0dXJlQ2hhbmdlKFRlc3RNb2RlbENoYW5nZSBjaGFuZ2UpIHsKLSAgICAgICAgaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0gICAgICAgICAgICAoKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXIpLnJlZnJlc2goY2hhbmdlLmdldFBhcmVudCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGtpbmQgb2Ygdmlld2VyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgVGVzdEVsZW1lbnQgdGVzdEVsZW1lbnQgPSAoVGVzdEVsZW1lbnQpIGVsZW1lbnQ7Ci0gICAgICAgIGludCBjb3VudCA9IHRlc3RFbGVtZW50LmdldENoaWxkQ291bnQoKTsKLSAgICAgICAgVGVzdEVsZW1lbnRbXSBjaGlsZHJlbiA9IG5ldyBUZXN0RWxlbWVudFtjb3VudF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkKLSAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gdGVzdEVsZW1lbnQuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuICgoVGVzdEVsZW1lbnQpIGVsZW1lbnQpLmdldENvbnRhaW5lcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiAoKFRlc3RFbGVtZW50KSBlbGVtZW50KS5nZXRDaGlsZENvdW50KCkgPiAwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICBmVmlld2VyID0gdmlld2VyOwotICAgICAgICBUZXN0RWxlbWVudCBvbGRFbGVtZW50ID0gKFRlc3RFbGVtZW50KSBvbGRJbnB1dDsKLSAgICAgICAgaWYgKG9sZEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgb2xkRWxlbWVudC5nZXRNb2RlbCgpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIFRlc3RFbGVtZW50IG5ld0VsZW1lbnQgPSAoVGVzdEVsZW1lbnQpIG5ld0lucHV0OwotICAgICAgICBpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBuZXdFbGVtZW50LmdldE1vZGVsKCkuYWRkTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuICgoVGVzdEVsZW1lbnQpIGVsZW1lbnQpLmlzRGVsZXRlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbENoYW5nZWQoVGVzdE1vZGVsQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICBzd2l0Y2ggKGNoYW5nZS5nZXRLaW5kKCkpIHsKLSAgICAgICAgY2FzZSBUZXN0TW9kZWxDaGFuZ2UuSU5TRVJUOgotICAgICAgICAgICAgZG9JbnNlcnQoY2hhbmdlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRlc3RNb2RlbENoYW5nZS5SRU1PVkU6Ci0gICAgICAgICAgICBkb1JlbW92ZShjaGFuZ2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVGVzdE1vZGVsQ2hhbmdlLlNUUlVDVFVSRV9DSEFOR0U6Ci0gICAgICAgICAgICBkb1N0cnVjdHVyZUNoYW5nZShjaGFuZ2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVGVzdE1vZGVsQ2hhbmdlLk5PTl9TVFJVQ1RVUkVfQ0hBTkdFOgotICAgICAgICAgICAgZG9Ob25TdHJ1Y3R1cmVDaGFuZ2UoY2hhbmdlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBraW5kIG9mIGNoYW5nZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjaGFuZ2UKLSAgICAgICAgICAgICAgICAuZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgICAgIGlmICgoY2hhbmdlLmdldE1vZGlmaWVycygpICYgVGVzdE1vZGVsQ2hhbmdlLlNFTEVDVCkgIT0gMCkgewotICAgICAgICAgICAgKChTdHJ1Y3R1cmVkVmlld2VyKSBmVmlld2VyKS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGNoYW5nZS5nZXRNb2RpZmllcnMoKSAmIFRlc3RNb2RlbENoYW5nZS5SRVZFQUwpICE9IDApIHsKLSAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICgoU3RydWN0dXJlZFZpZXdlcikgZlZpZXdlcikucmV2ZWFsKGVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1Rlc3RNb2RlbExhenlUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGVzdE1vZGVsTGF6eVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5NzQ0NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVGVzdE1vZGVsTGF6eVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYXp5VHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0TW9kZWxMYXp5VHJlZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIFRlc3RNb2RlbENvbnRlbnRQcm92aWRlcgotCQlpbXBsZW1lbnRzIElMYXp5VHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXB1YmxpYyBUZXN0TW9kZWxMYXp5VHJlZUNvbnRlbnRQcm92aWRlcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJdGhpcy50cmVlVmlld2VyID0gdHJlZVZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50KE9iamVjdCBwYXJlbnQsIGludCBpbmRleCkgewotCQlUZXN0RWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKFRlc3RFbGVtZW50KSBwYXJlbnQ7Ci0JCVRlc3RFbGVtZW50IGNoaWxkRWxlbWVudCA9IHBhcmVudEVsZW1lbnQuZ2V0Q2hpbGRBdChpbmRleCk7Ci0JCXRyZWVWaWV3ZXIucmVwbGFjZShwYXJlbnQsIGluZGV4LCBjaGlsZEVsZW1lbnQpOwotCQl0cmVlVmlld2VyLnNldENoaWxkQ291bnQoY2hpbGRFbGVtZW50LCBjaGlsZEVsZW1lbnQuZ2V0Q2hpbGRDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJQXNzZXJ0LmZhaWwoInNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGEgTGF6eVRyZWVDb250ZW50UHJvdmlkZXIiKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCUFzc2VydC5mYWlsKCJzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBhIExhenlUcmVlQ29udGVudFByb3ZpZGVyIik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCUFzc2VydC5mYWlsKCJzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBhIExhenlUcmVlQ29udGVudFByb3ZpZGVyIik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJZmluYWwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCXN1cGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldEl0ZW1Db3VudCgwKTsKLQkJaWYgKG5ld0lucHV0ICE9IG51bGwpIHsKLQkJCWZpbmFsIFRlc3RFbGVtZW50IHRlc3RFbGVtZW50ID0gKFRlc3RFbGVtZW50KSBuZXdJbnB1dDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1RyZWVWaWV3ZXJDb2x1bW5UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVHJlZVZpZXdlckNvbHVtblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlkMjZlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVHJlZVZpZXdlckNvbHVtblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLQotcHVibGljIGNsYXNzIFRyZWVWaWV3ZXJDb2x1bW5UZXN0IGV4dGVuZHMgQWJzdHJhY3RUcmVlVmlld2VyVGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhYmxlVHJlZVRlc3RMYWJlbFByb3ZpZGVyIGV4dGVuZHMgVGVzdExhYmVsUHJvdmlkZXIKLSAgICAgICAgICAgIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGZFeHRlbmRlZCA9IGZhbHNlOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGZFeHRlbmRlZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZWRTdHJpbmcoKFN0cmluZykgZWxlbWVudCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotICAgICAgICAgICAgaWYgKGZFeHRlbmRlZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZWRTdHJpbmcoKFRlc3RFbGVtZW50KSBlbGVtZW50KTsKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVHJlZVZpZXdlckNvbHVtblRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgVHJlZVZpZXdlciB2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQpOwotICAgICAgICB2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZXN0TW9kZWxDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUYWJsZVRyZWVUZXN0TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgdmlld2VyLmdldFRyZWUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgdmlld2VyLmdldFRyZWUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBTdHJpbmcgaGVhZGVyc1tdID0geyAiY29sdW1uIDEgaGVhZGVyIiwgImNvbHVtbiAyIGhlYWRlciIgfTsKLQotICAgICAgICBmaW5hbCBUcmVlQ29sdW1uIGNvbHVtbnNbXSA9IG5ldyBUcmVlQ29sdW1uW2hlYWRlcnMubGVuZ3RoXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICBUcmVlQ29sdW1uIHRjID0gbmV3IFRyZWVDb2x1bW4odmlld2VyLmdldFRyZWUoKSwKLSAgICAgICAgICAgICAgICAgICAgU1dULk5PTkUsIGkpOwotICAgICAgICAgICAgdGMuc2V0UmVzaXphYmxlKHRydWUpOwotICAgICAgICAgICAgdGMuc2V0VGV4dChoZWFkZXJzW2ldKTsKLSAgICAgICAgICAgIHRjLnNldFdpZHRoKDI1KTsKLSAgICAgICAgICAgIGNvbHVtbnNbaV0gPSB0YzsKLSAgICAgICAgfQotICAgICAgICBmVHJlZVZpZXdlciA9IHZpZXdlcjsKLSAgICAgICAgcmV0dXJuIHZpZXdlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldEl0ZW1Db3VudCgpIHsKLSAgICAgICAgVGVzdEVsZW1lbnQgZmlyc3QgPSBmUm9vdEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBUcmVlSXRlbSB0aSA9IChUcmVlSXRlbSkgZlZpZXdlci50ZXN0RmluZEl0ZW0oZmlyc3QpOwotICAgICAgICAgcmV0dXJuIHRpLmdldFBhcmVudCgpLmdldEl0ZW1Db3VudCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0SXRlbUNvdW50KFRlc3RFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgVHJlZUl0ZW0gdGkgPSAoVHJlZUl0ZW0pIGZWaWV3ZXIudGVzdEZpbmRJdGVtKGVsZW1lbnQpOwotICAgICAgICByZXR1cm4gdGkuZ2V0SXRlbUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJdGVtVGV4dChpbnQgYXQpIHsKLSAgICAgICAgcmV0dXJuICgoVHJlZSkgZlZpZXdlci5nZXRDb250cm9sKCkpLmdldEl0ZW1zKClbYXRdLmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0gICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihUcmVlVmlld2VyQ29sdW1uVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIFRyZWVWaWV3ZXIgdmlld2VyID0gKFRyZWVWaWV3ZXIpIGZWaWV3ZXI7Ci0gICAgICAgIFRhYmxlVHJlZVRlc3RMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gKFRhYmxlVHJlZVRlc3RMYWJlbFByb3ZpZGVyKSB2aWV3ZXIKLSAgICAgICAgICAgICAgICAuZ2V0TGFiZWxQcm92aWRlcigpOwotICAgICAgICBwcm92aWRlci5mRXh0ZW5kZWQgPSB0cnVlOwotICAgICAgICAvLyBCVUcgMUZaNVNEQzogSkZVSUY6V0lOTlQgLSBUYWJsZVZpZXdlckNvbHVtbiBzaG91bGQgbGlzdGVuIGZvciBMYWJlbFByb3ZpZGVyIGNoYW5nZXMKLSAgICAgICAgZlZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIFRlc3RFbGVtZW50IGZpcnN0ID0gZlJvb3RFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xhYmVsID0gcHJvdmlkZWRTdHJpbmcoZmlyc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbmRlcmVkIGxhYmVsIiwgbmV3TGFiZWwsIGdldEl0ZW1UZXh0KDApKTsKLSAgICAgICAgcHJvdmlkZXIuZkV4dGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIEJVRyAxRlo1U0RDOiBKRlVJRjpXSU5OVCAtIFRhYmxlVmlld2VyQ29sdW1uIHNob3VsZCBsaXN0ZW4gZm9yIExhYmVsUHJvdmlkZXIgY2hhbmdlcwotICAgICAgICBmVmlld2VyLnJlZnJlc2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGFiZWxQcm92aWRlclN0YXRlQ2hhbmdlKCkgewotICAgICAgICBUcmVlVmlld2VyIHZpZXdlciA9IChUcmVlVmlld2VyKSBmVmlld2VyOwotICAgICAgICBUYWJsZVRyZWVUZXN0TGFiZWxQcm92aWRlciBwcm92aWRlciA9IChUYWJsZVRyZWVUZXN0TGFiZWxQcm92aWRlcikgdmlld2VyCi0gICAgICAgICAgICAgICAgLmdldExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgcHJvdmlkZXIuZkV4dGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgcHJvdmlkZXIuc2V0U3VmZml4KCJhZGRlZCBzdWZmaXgiKTsKLSAgICAgICAgLy8gQlVHIDFGWjVTREM6IEpGVUlGOldJTk5UIC0gVGFibGVWaWV3ZXJDb2x1bW4gc2hvdWxkIGxpc3RlbiBmb3IgTGFiZWxQcm92aWRlciBjaGFuZ2VzCi0gICAgICAgIGZWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMYWJlbCA9IHByb3ZpZGVkU3RyaW5nKGZpcnN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW5kZXJlZCBsYWJlbCIsIG5ld0xhYmVsLCBnZXRJdGVtVGV4dCgwKSk7Ci0gICAgICAgIHByb3ZpZGVyLmZFeHRlbmRlZCA9IGZhbHNlOwotICAgICAgICAvLyBCVUcgMUZaNVNEQzogSkZVSUY6V0lOTlQgLSBUYWJsZVZpZXdlckNvbHVtbiBzaG91bGQgbGlzdGVuIGZvciBMYWJlbFByb3ZpZGVyIGNoYW5nZXMKLSAgICAgICAgZlZpZXdlci5yZWZyZXNoKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1RyZWVWaWV3ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVHJlZVZpZXdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmODNmZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVHJlZVZpZXdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotcHVibGljIGNsYXNzIFRyZWVWaWV3ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RUcmVlVmlld2VyVGVzdCB7Ci0KLSAgICBwdWJsaWMgVHJlZVZpZXdlclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZlRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQpOwotICAgICAgICBmVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlc3RNb2RlbENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgcmV0dXJuIGZUcmVlVmlld2VyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0SXRlbUNvdW50KCkgewotICAgICAgICBUZXN0RWxlbWVudCBmaXJzdCA9IGZSb290RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFRyZWVJdGVtIHRpID0gKFRyZWVJdGVtKSBmVmlld2VyLnRlc3RGaW5kSXRlbShmaXJzdCk7Ci0gICAgICAgIFRyZWUgdHJlZSA9IHRpLmdldFBhcmVudCgpOwotICAgICAgICByZXR1cm4gdHJlZS5nZXRJdGVtQ291bnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRJdGVtQ291bnQgbWV0aG9kIGNvbW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRJdGVtQ291bnQoVGVzdEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRDaGlsZENvdW50KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJdGVtVGV4dChpbnQgYXQpIHsKLSAgICAgICAgVHJlZSB0cmVlID0gKFRyZWUpIGZUcmVlVmlld2VyLmdldENvbnRyb2woKTsKLSAgICAgICAgcmV0dXJuIHRyZWUuZ2V0SXRlbXMoKVthdF0uZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLSAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKFRyZWVWaWV3ZXJUZXN0LmNsYXNzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVmlld2VyVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9WaWV3ZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTY2NTJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9WaWV3ZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVNhZmVSdW5uYWJsZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaWV3ZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotCURpc3BsYXkgZkRpc3BsYXk7Ci0JcHJvdGVjdGVkIFNoZWxsIGZTaGVsbDsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFZpZXdlciBmVmlld2VyOwotCXByb3RlY3RlZCBUZXN0RWxlbWVudCBmUm9vdEVsZW1lbnQ7Ci0JcHVibGljIFRlc3RNb2RlbCBmTW9kZWw7Ci0KLQlwdWJsaWMgVmlld2VyVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0U2VsZWN0aW9uRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBUZXN0RWxlbWVudCBleHBlY3RlZCkgewotCSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JICAgIGFzc2VydFRydWUoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gZXhwZWN0ZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkgICAgICAgICAgICBleHBlY3RlZCk7Ci0JICAgIGFzc2VydEVxdWFscygic2VsZWN0aW9uRXF1YWxzIC0gIiArIG1lc3NhZ2UsIHNlbGVjdGlvbiwgZXhwZWN0ZWRTZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KTsKLQotCXB1YmxpYyB2b2lkIGludGVyYWN0KCkgewotCSAgICBTaGVsbCBzaGVsbCA9IGZTaGVsbDsKLQkgICAgaWYgKHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotCSAgICAgICAgaWYgKGRpc3BsYXkgIT0gbnVsbCkgewotCSAgICAgICAgICAgIHdoaWxlIChzaGVsbC5pc1Zpc2libGUoKSkKLQkgICAgICAgICAgICAgICAgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKTsKLQkgICAgICAgIH0KLQkgICAgfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9wZW5Ccm93c2VyKCkgewotCSAgICBmRGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCSAgICBpZiAoZkRpc3BsYXkgPT0gbnVsbCkgewotCSAgICAgICAgZkRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCSAgICB9Ci0JICAgIGZTaGVsbCA9IG5ldyBTaGVsbChmRGlzcGxheSk7Ci0JICAgIGZTaGVsbC5zZXRTaXplKDUwMCwgNTAwKTsKLQkgICAgZlNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkgICAgZlZpZXdlciA9IGNyZWF0ZVZpZXdlcihmU2hlbGwpOwotCSAgICBmVmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JICAgIHNldElucHV0KCk7Ci0JICAgIGZTaGVsbC5vcGVuKCk7Ci0JICAgIC8vcHJvY2Vzc0V2ZW50cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KCkgewotCQlmVmlld2VyLnNldElucHV0KGZSb290RWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvY2Vzc0V2ZW50cygpIHsKLQkgICAgU2hlbGwgc2hlbGwgPSBmU2hlbGw7Ci0JICAgIGlmIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkoKTsKLQkgICAgICAgIGlmIChkaXNwbGF5ICE9IG51bGwpIHsKLQkgICAgICAgICAgICB3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCSAgICAgICAgICAgIAkvLyBsb29wIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyB0byBkaXNwYXRjaAotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlQb2xpY3kuc2V0TG9nKG5ldyBJTG9nZ2VyKCl7Ci0JCQlwdWJsaWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJCQlmYWlsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJfX0pOwotCQlTYWZlUnVubmFibGUuc2V0UnVubmVyKG5ldyBJU2FmZVJ1bm5hYmxlUnVubmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVNhZmVSdW5uYWJsZSBjb2RlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJY29kZS5ydW4oKTsKLQkJCQl9IGNhdGNoKFRocm93YWJsZSB0aCkgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0aCk7Ci0JCQkJfQotCQkJfX0pOwotCSAgICBzZXRVcE1vZGVsKCk7Ci0JICAgIG9wZW5Ccm93c2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBNb2RlbCgpIHsKLQkJZlJvb3RFbGVtZW50ID0gVGVzdEVsZW1lbnQuY3JlYXRlTW9kZWwoMywgMTApOwotCSAgICBmTW9kZWwgPSBmUm9vdEVsZW1lbnQuZ2V0TW9kZWwoKTsKLQl9Ci0KLQl2b2lkIHNsZWVwKGludCBkKSB7Ci0JICAgIHByb2Nlc3NFdmVudHMoKTsKLSAgICAgICAgdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChkICogMTAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkgICAgcHJvY2Vzc0V2ZW50cygpOwotCSAgICBmVmlld2VyID0gbnVsbDsKLQkgICAgaWYgKGZTaGVsbCAhPSBudWxsKSB7Ci0JICAgICAgICBmU2hlbGwuZGlzcG9zZSgpOwotCSAgICAgICAgZlNoZWxsID0gbnVsbDsKLQkgICAgfQotCSAgICAvLyBsZWF2ZSB0aGUgZGlzcGxheQotCSAgICBmUm9vdEVsZW1lbnQgPSBudWxsOwotCSAgICBmTW9kZWwgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1ZpcnR1YWxMYXp5VGFibGVWaWV3ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVmlydHVhbExhenlUYWJsZVZpZXdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ0NWY1Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVmlydHVhbExhenlUYWJsZVZpZXdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLQotLyoqCi0gKiBUaGUgVmlydHVhbExhenlUYWJsZVZpZXdlclRlc3QgaXMgYSB0ZXN0IG9mIHRhYmxlIHZpZXdlcnMKLSAqIHdpdGggbGF6eSBwb3B1bGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbExhenlUYWJsZVZpZXdlclRlc3QgZXh0ZW5kcyBWaXJ0dWFsVGFibGVWaWV3ZXJUZXN0IHsKLQkKLQlwcml2YXRlIExpc3QgdXBkYXRlZEVsZW1lbnRzOwotCS8vIGJ5IGRlZmF1bHQsIG5vIGZhaWx1cmUgaXMgdHJpZ2dlcmVkIHdoZW4gdXBkYXRlRWxlbWVudCBpcyBjYWxsZWQKLQlpbnQgdXBkYXRlZEVsZW1lbnRGYWlsdXJlVHJpZ2dlckluZGV4ID0gLTE7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLwotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFZpcnR1YWxMYXp5VGFibGVWaWV3ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRhYmxlVmlld2VyVGVzdCNnZXRDb250ZW50UHJvdmlkZXIoKQotCSAqLwotCXByb3RlY3RlZCBUZXN0TW9kZWxDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFRlc3RMYXp5TW9kZWxDb250ZW50UHJvdmlkZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQl1cGRhdGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXByb2Nlc3NFdmVudHMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBNb2RlbCgpIHsKLQkJZlJvb3RFbGVtZW50ID0gVGVzdEVsZW1lbnQuY3JlYXRlTW9kZWwoMiwgMTAwKTsKLSAgICAgICAgZk1vZGVsID0gZlJvb3RFbGVtZW50LmdldE1vZGVsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCXVwZGF0ZWRFbGVtZW50cyA9IG51bGw7Ci0JfQotCQotCS8vIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIFRlc3RMYXp5TW9kZWxDb250ZW50UHJvdmlkZXIKLQlwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50Q2FsbGVkKGludCBpbmRleCkgewotCQl1cGRhdGVkRWxlbWVudHMuYWRkKG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JCWlmKHVwZGF0ZWRFbGVtZW50RmFpbHVyZVRyaWdnZXJJbmRleCE9LTEgJiYgdXBkYXRlZEVsZW1lbnRzLnNpemUoKT49dXBkYXRlZEVsZW1lbnRGYWlsdXJlVHJpZ2dlckluZGV4KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGNhbGwgdG8gdXBkYXRlRWxlbWVudCwgdGhpcyBpcyB0aGUgIiArIHVwZGF0ZWRFbGVtZW50cy5zaXplKCkgKyAidGggY2FsbCIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRlc3Qgc2VsZWN0aW5nIGFsbCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW5kZXhlZFNlbGVjdGlvbigpIHsKLQkJVGVzdEVsZW1lbnRbXSBjaGlsZHJlbiA9IGZSb290RWxlbWVudC5nZXRDaGlsZHJlbigpOwotCQlpbnQgc2VsZWN0aW9uU2l6ZSA9IGNoaWxkcmVuLmxlbmd0aCAvIDI7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W3NlbGVjdGlvblNpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHsKLQkJCWluZGljZXNbaV0gID0gaSAqIDI7CQkJCi0JCX0KLQkJCi0JCVRhYmxlIHRhYmxlID0gKChUYWJsZVZpZXdlcikgZlZpZXdlcikuZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0U2VsZWN0aW9uKGluZGljZXMpOwotCi0JCS8vIHdlIGFyZSB2aXJ0dWFsLCBzbyBub3QgYWxsIGluZGljZXMgd2UgcmVxdWVzdGVkIHRvIHNlbGVjdCB3aWxsIGJlIHNlbGVjdGVkLgotCQlpbmRpY2VzID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCQlzZWxlY3Rpb25TaXplID0gaW5kaWNlcy5sZW5ndGg7Ci0JCWFzc2VydFRydWUoIkV4cGVjdGVkIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBlbGVtZW50Iiwgc2VsZWN0aW9uU2l6ZSA+IDApOwotCQkKLQkJdGFibGUuc2hvd1NlbGVjdGlvbigpOwotCQkKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gcmVzdWx0ID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoc2VsZWN0aW9uU2l6ZSwgcmVzdWx0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoIkZpcnN0IGVsZW1lbnRzIGRvIG5vdCBtYXRjaCAiLAotCQkJCXJlc3VsdC5nZXRGaXJzdEVsZW1lbnQoKSA9PSBjaGlsZHJlbltpbmRpY2VzWzBdXSk7Ci0JCWludCBsYXN0SW5kZXggPSBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV07Ci0JCWFzc2VydFRydWUoCi0JCQkJIkxhc3QgZWxlbWVudHMgZG8gbm90IG1hdGNoICIsCi0JCQkJcmVzdWx0LnRvQXJyYXkoKVtyZXN1bHQuc2l6ZSgpIC0gMV0gPT0gY2hpbGRyZW5bbGFzdEluZGV4XSk7Ci0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbnB1dERvZXNOb3RNYXRlcmlhbGl6ZUV2ZXJ5dGhpbmcoKSB7Ci0JCWZWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCXVwZGF0ZWRFbGVtZW50cy5jbGVhcigpOwotCQkvLyBBc3N1bWUgc29tZXRoaW5nIGlzIHdyb25nIGlmIGFsbCBUYWJsZUl0ZW1zIGFyZSBtYXRlcmlhbGl6ZWQ6Ci0JCXVwZGF0ZWRFbGVtZW50RmFpbHVyZVRyaWdnZXJJbmRleCA9IGZSb290RWxlbWVudC5nZXRDaGlsZENvdW50KCk7Ci0JCWZWaWV3ZXIuc2V0SW5wdXQoZlJvb3RFbGVtZW50KTsKLQotCQlpbnQgbWF0ZXJpYWxpemVkU2l6ZSA9IHVwZGF0ZWRFbGVtZW50cy5zaXplKCk7Ci0JCWFzc2VydFRydWUoIkV4cGVjdGVkIGxlc3MgdGhhbiAiICsgZlJvb3RFbGVtZW50LmdldENoaWxkQ291bnQoKQotCQkJCSsgIiwgYWN0dWFsICIgKyBtYXRlcmlhbGl6ZWRTaXplLAotCQkJCW1hdGVyaWFsaXplZFNpemUgPCBmUm9vdEVsZW1lbnQuZ2V0Q2hpbGRDb3VudCgpKTsKLQkJLy8gY3JlYXRlIGEgbmV3IG1vZGVsIGFuZCBjaGVjayBpZiB3ZSBnZXQgYW4gZXF1YWwgbnVtYmVyIG9mIGNhbGxzIHRvIHVwZGF0ZUVsZW1lbnQKLQkJc2V0VXBNb2RlbCgpOwotCQl1cGRhdGVkRWxlbWVudHMuY2xlYXIoKTsKLQkJZlZpZXdlci5zZXRJbnB1dChmUm9vdEVsZW1lbnQpOwotCQlhc3NlcnRFcXVhbHMobWF0ZXJpYWxpemVkU2l6ZSwgdXBkYXRlZEVsZW1lbnRzLnNpemUoKSk7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVmlydHVhbExhenlUcmVlVmlld2VyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1ZpcnR1YWxMYXp5VHJlZVZpZXdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1MjFjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVmlydHVhbExhenlUcmVlVmlld2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotCi1wdWJsaWMgY2xhc3MgVmlydHVhbExhenlUcmVlVmlld2VyVGVzdCBleHRlbmRzIFRyZWVWaWV3ZXJUZXN0IHsKLQotCXByb3RlY3RlZCBpbnQgc2V0RGF0YUNhbGxzID0gMDsKLQotCXB1YmxpYyBWaXJ0dWFsTGF6eVRyZWVWaWV3ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotICAgIHByb3RlY3RlZCBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgCVRyZWUgdHJlZSA9IG5ldyBUcmVlKHBhcmVudCwgU1dULlZJUlRVQUwpOwotICAgIAl0cmVlLmFkZExpc3RlbmVyKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXREYXRhQ2FsbHMrKzsKLQkJCX19KTsKLSAgICAgICAgZlRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKLSAgICAgICAgZlRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZXN0TW9kZWxMYXp5VHJlZUNvbnRlbnRQcm92aWRlcigoVHJlZVZpZXdlcikgZlRyZWVWaWV3ZXIpKTsKLSAgICAgICAgcmV0dXJuIGZUcmVlVmlld2VyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAJc3VwZXIuc2V0VXAoKTsKLSAgICAJLy8gcHJvY2VzcyBldmVudHMgYmVjYXVzZSB0aGUgY29udGVudCBwcm92aWRlciB1c2VzIGFuIGFzeW5jRXhlYyB0byBzZXQgdGhlIGl0ZW0gY291bnQgb2YgdGhlIHRyZWUKLSAgICAJcHJvY2Vzc0V2ZW50cygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dCgpIHsKLQkJc3VwZXIuc2V0SW5wdXQoKTsKLQkJKChUcmVlVmlld2VyKSBmVHJlZVZpZXdlcikuc2V0Q2hpbGRDb3VudChmVHJlZVZpZXdlci5nZXRJbnB1dCgpLCBmUm9vdEVsZW1lbnQuZ2V0Q2hpbGRDb3VudCgpKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgCXN1cGVyLnRlYXJEb3duKCk7Ci0vLyAgICAJU3lzdGVtLm91dC5wcmludGxuKCJjYWxsczogIiArIHNldERhdGFDYWxscyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RMZWFmSXNFeHBhbmRhYmxlKCkgewotICAgIAlUZXN0RWxlbWVudCBsZWFmRWxlbWVudCA9IGZSb290RWxlbWVudC5nZXRDaGlsZEF0KDIpLmdldENoaWxkQXQoMykuZ2V0Q2hpbGRBdCgyKTsKLSAgICAJYXNzZXJ0RXF1YWxzKDAsIGxlYWZFbGVtZW50LmdldENoaWxkQ291bnQoKSk7Ci0JCWFzc2VydEZhbHNlKGZUcmVlVmlld2VyLmlzRXhwYW5kYWJsZShsZWFmRWxlbWVudCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSb290SXNFeHBhbmRhYmxlKCkgewotICAgIAlUZXN0RWxlbWVudCByb290RWxlbWVudCA9IGZSb290RWxlbWVudC5nZXRDaGlsZEF0KDIpOwotICAgIAlhc3NlcnRUcnVlKHJvb3RFbGVtZW50LmdldENoaWxkQ291bnQoKSA+IDApOwotICAgIAlhc3NlcnRUcnVlKGZUcmVlVmlld2VyLmlzRXhwYW5kYWJsZShyb290RWxlbWVudCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9kZUlzRXhwYW5kYWJsZSgpIHsKLSAgICAJVGVzdEVsZW1lbnQgbm9kZUVsZW1lbnQgPSBmUm9vdEVsZW1lbnQuZ2V0Q2hpbGRBdCgyKS5nZXRDaGlsZEF0KDMpOwotICAgIAlhc3NlcnRUcnVlKG5vZGVFbGVtZW50LmdldENoaWxkQ291bnQoKSA+IDApOwotICAgIAlhc3NlcnRUcnVlKGZUcmVlVmlld2VyLmlzRXhwYW5kYWJsZShub2RlRWxlbWVudCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyRXhwYW5kZWQoKSB7Ci0gICAgCS8vIG5vIG5lZWQgdG8gdGVzdCBzaW5jZSB2aXJ0dWFsIHRyZWVzIGRvIG5vdCBzdXBwb3J0IGZpbHRlcmluZwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyKCkgewotICAgIAkvLyBubyBuZWVkIHRvIHRlc3Qgc2luY2UgdmlydHVhbCB0cmVlcyBkbyBub3Qgc3VwcG9ydCBmaWx0ZXJpbmcKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEluc2VydFNpYmxpbmdXaXRoRmlsdGVyRmlsdGVyZWQoKSB7Ci0gICAgCS8vIG5vIG5lZWQgdG8gdGVzdCBzaW5jZSB2aXJ0dWFsIHRyZWVzIGRvIG5vdCBzdXBwb3J0IGZpbHRlcmluZwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0U2libGluZ1dpdGhGaWx0ZXJOb3RGaWx0ZXJlZCgpIHsKLSAgICAJLy8gbm8gbmVlZCB0byB0ZXN0IHNpbmNlIHZpcnR1YWwgdHJlZXMgZG8gbm90IHN1cHBvcnQgZmlsdGVyaW5nCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRTaWJsaW5nV2l0aFNvcnRlcigpIHsKLSAgICAJLy8gbm8gbmVlZCB0byB0ZXN0IHNpbmNlIHZpcnR1YWwgdHJlZXMgZG8gbm90IHN1cHBvcnQgc29ydGluZwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbmFtZVdpdGhGaWx0ZXIoKSB7Ci0gICAgCS8vIG5vIG5lZWQgdG8gdGVzdCBzaW5jZSB2aXJ0dWFsIHRyZWVzIGRvIG5vdCBzdXBwb3J0IGZpbHRlcmluZwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuYW1lV2l0aFNvcnRlcigpIHsKLSAgICAJLy8gbm8gbmVlZCB0byB0ZXN0IHNpbmNlIHZpcnR1YWwgdHJlZXMgZG8gbm90IHN1cHBvcnQgc29ydGluZwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29ydGVyKCkgewotICAgIAkvLyBubyBuZWVkIHRvIHRlc3Qgc2luY2UgdmlydHVhbCB0cmVlcyBkbyBub3Qgc3VwcG9ydCBzb3J0aW5nCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRFeHBhbmRlZFdpdGhDeWNsZSgpIHsKLSAgICAJLy8gVE9ETyBmaXggZmFpbGluZyB0ZXN0IGNhc2UgKEdUSywgV2luZG93cykKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1bGtFeHBhbmQoKSB7Ci0gICAgCS8vIFRPRE8gZml4IGZhaWxpbmcgdGVzdCBjYXNlIChHVEspCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZyZXNoV2l0aER1cGxpY2F0ZUNoaWxkKCkgewotICAgIAkvLyBUT0RPIGZpeCBmYWlsaW5nIHRlc3QgY2FzZSAoR1RLLCBXaW5kb3dzKQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0U2libGluZygpIHsKLSAgICAJLy8gVE9ETyBmaXggZmFpbGluZyB0ZXN0IGNhc2UgKEdUSykKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEluc2VydFNpYmxpbmdzKCkgewotICAgIAkvLyBUT0RPIGZpeCBmYWlsaW5nIHRlc3QgY2FzZSAoR1RLKQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0U2libGluZ1NlbGVjdEV4cGFuZGVkKCkgewotICAgIAkvLyBUT0RPIGZpeCBmYWlsaW5nIHRlc3QgY2FzZSAoR1RLKQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMYWJlbFByb3ZpZGVyKCkgewotICAgIAkvLyBUT0RPIGZpeCBmYWlsaW5nIHRlc3QgY2FzZSAoR1RLLCBXaW5kb3dzKQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGFiZWxQcm92aWRlclN0YXRlQ2hhbmdlKCkgewotICAgIAkvLyBUT0RPIGZpeCBmYWlsaW5nIHRlc3QgY2FzZSAoR1RLLCBXaW5kb3dzKQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuYW1lV2l0aExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgCS8vIFRPRE8gZml4IGZhaWxpbmcgdGVzdCBjYXNlIChHVEssIFdpbmRvd3MpCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRJbnB1dCgpIHsKLSAgICAJLy8gVE9ETyBmaXggZmFpbGluZyB0ZXN0IGNhc2UgKEdUSykKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNvbWVDaGlsZHJlbkNoYW5nZWQoKSB7Ci0gICAgCS8vIFRPRE8gZml4IGZhaWxpbmcgdGVzdCBjYXNlIChHVEssIFdpbmRvd3MpCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RXb3JsZENoYW5nZWQoKSB7Ci0gICAgCS8vIFRPRE8gZml4IGZhaWxpbmcgdGVzdCBjYXNlIChHVEssIFdpbmRvd3MpCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZyZXNoV2l0aEFkZGVkQ2hpbGRyZW4oKSB7Ci0gICAgCS8vIFRPRE8gZml4IGZhaWxpbmcgdGVzdCBjYXNlIChXaW5kb3dzKQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9WaXJ0dWFsVGFibGVWaWV3ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVmlydHVhbFRhYmxlVmlld2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmRlODBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9WaXJ0dWFsVGFibGVWaWV3ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0vKioKLSAqIFRoZSBUYWJsZVZpZXdlclRlc3QgaXMgYSB0ZXN0IG9mIHRoZSBTV1QjVklSVFVBTCBzdXBwb3J0IGluIFRhYmxlVmlld2VycywKLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxUYWJsZVZpZXdlclRlc3QgZXh0ZW5kcyBUYWJsZVZpZXdlclRlc3QgewotCi0JaW50IGN1cnJlbnRWaXNpYmxlSW5kZXggPSAtMTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgVmlydHVhbFRhYmxlVmlld2VyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGFibGVWaWV3ZXJUZXN0I2NyZWF0ZVRhYmxlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUYWJsZVZpZXdlciB2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIocGFyZW50LCBTV1QuVklSVFVBTCB8IFNXVC5NVUxUSSk7Ci0JCWZpbmFsIFRhYmxlIHRhYmxlID0gdmlld2VyLmdldFRhYmxlKCk7Ci0JCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJCWlmIChpbmRleCA+IGN1cnJlbnRWaXNpYmxlSW5kZXgpCi0JCQkJCWN1cnJlbnRWaXNpYmxlSW5kZXggPSBpbmRleDsKLQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbGxlY3Rpb24gb2YgY3VycmVudGx5IHZpc2libGUgdGFibGUgaXRlbXMuCi0JICogCi0JICogQHJldHVybiBUYWJsZUl0ZW1bXQotCSAqLwotCXByaXZhdGUgVGFibGVJdGVtW10gZ2V0VmlzaWJsZUl0ZW1zKCkgewotCQlpZiAoY3VycmVudFZpc2libGVJbmRleCA8IDApLy8gQW55dGhpbmcgc2hvd24geWV0PwotCQkJcmV0dXJuIG5ldyBUYWJsZUl0ZW1bMF07Ci0JCVRhYmxlIHRhYmxlID0gKChUYWJsZVZpZXdlcikgZlZpZXdlcikuZ2V0VGFibGUoKTsKLQkJVGFibGVJdGVtW10gdmlzaWJsZSA9IG5ldyBUYWJsZUl0ZW1bY3VycmVudFZpc2libGVJbmRleF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmlzaWJsZS5sZW5ndGg7IGkrKykgewotCQkJdmlzaWJsZVtpXSA9IHRhYmxlLmdldEl0ZW0oaSk7Ci0JCX0KLQkJcmV0dXJuIHZpc2libGU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQ3JlYXRlZCgpIHsKLQotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGdldFZpc2libGVJdGVtcygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlhc3NlcnRUcnVlKCJNaXNzaW5nIGRhdGEgaW4gaXRlbSAiICsgU3RyaW5nLnZhbHVlT2YoaSksIGl0ZW0KLQkJCQkJLmdldERhdGEoKSBpbnN0YW5jZW9mIFRlc3RFbGVtZW50KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5UYWJsZVZpZXdlclRlc3QjZ2V0SXRlbUNvdW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldEl0ZW1Db3VudCgpIHsKLQkJcmV0dXJuIGdldFZpc2libGVJdGVtcygpLmxlbmd0aDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlclRlc3QjdGVzdEZpbHRlcigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlcigpIHsKLQkJLy8gVGhlIGZpbHRlciB0ZXN0IGlzIG5vIHVzZSBoZXJlIGFzIGl0IGlzCi0JCS8vIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIGl0ZW1zCi0JCS8vIGFyZSBjcmVhdGVkLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyVGVzdCN0ZXN0SW5zZXJ0U2libGluZygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluc2VydFNpYmxpbmcoKSB7Ci0JCS8vIFRoaXMgdGVzdCBpcyBubyB1c2UgaGVyZSBhcyBpdCBpcwotCQkvLyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCBpdGVtcwotCQkvLyBhcmUgY3JlYXRlZC4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlclRlc3QjdGVzdEluc2VydFNpYmxpbmdSZXZlYWwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRTaWJsaW5nUmV2ZWFsKCkgewotCQkvLyBUaGlzIHRlc3QgaXMgbm8gdXNlIGhlcmUgYXMgaXQgaXMKLQkJLy8gYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgaXRlbXMKLQkJLy8gYXJlIGNyZWF0ZWQuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXJUZXN0I3Rlc3RJbnNlcnRTaWJsaW5ncygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluc2VydFNpYmxpbmdzKCkgewotCQkvLyBUaGlzIHRlc3QgaXMgbm8gdXNlIGhlcmUgYXMgaXQgaXMKLQkJLy8gYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgaXRlbXMKLQkJLy8gYXJlIGNyZWF0ZWQuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXJUZXN0I3Rlc3RJbnNlcnRTaWJsaW5nV2l0aEZpbHRlckZpbHRlcmVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0U2libGluZ1dpdGhGaWx0ZXJGaWx0ZXJlZCgpIHsKLQkJLy8gVGhpcyB0ZXN0IGlzIG5vIHVzZSBoZXJlIGFzIGl0IGlzCi0JCS8vIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIGl0ZW1zCi0JCS8vIGFyZSBjcmVhdGVkLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyVGVzdCN0ZXN0SW5zZXJ0U2libGluZ1dpdGhGaWx0ZXJOb3RGaWx0ZXJlZCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluc2VydFNpYmxpbmdXaXRoRmlsdGVyTm90RmlsdGVyZWQoKSB7Ci0JCS8vIFRoaXMgdGVzdCBpcyBubyB1c2UgaGVyZSBhcyBpdCBpcwotCQkvLyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCBpdGVtcwotCQkvLyBhcmUgY3JlYXRlZC4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlclRlc3QjdGVzdEluc2VydFNpYmxpbmdXaXRoU29ydGVyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0U2libGluZ1dpdGhTb3J0ZXIoKSB7Ci0JCS8vIFRoaXMgdGVzdCBpcyBubyB1c2UgaGVyZSBhcyBpdCBpcwotCQkvLyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCBpdGVtcwotCQkvLyBhcmUgY3JlYXRlZC4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlclRlc3QjdGVzdFJlbmFtZVdpdGhGaWx0ZXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVXaXRoRmlsdGVyKCkgewotCQkvLyBUaGlzIHRlc3QgaXMgbm8gdXNlIGhlcmUgYXMgaXQgaXMKLQkJLy8gYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgaXRlbXMKLQkJLy8gYXJlIGNyZWF0ZWQuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXJUZXN0I3Rlc3RTZXRJbnB1dCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldElucHV0KCkgewotCQkvLyBUaGlzIHRlc3QgdXMgYmFzZWQgb24gZmluZEl0ZW0gYXNzdW1pbmcgYWxsIGl0ZW1zCi0JCS8vIGFyZSBjcmVhdGVkIHNvIGl0IGlzIG5vdCB2YWxpZC4KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVuYW1lV2l0aFNvcnRlcigpIHsKLQkJLy8gVGhpcyB0ZXN0IGlzIG5vIHVzZSBoZXJlIGFzIGl0IGlzCi0JCS8vIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIGl0ZW1zCi0JCS8vIGFyZSBjcmVhdGVkLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyVGVzdCN0ZXN0U29ydGVyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVyKCkgewotCQkvLyBUaGlzIHRlc3QgaXMgbm8gdXNlIGhlcmUgYXMgaXQgaXMKLQkJLy8gYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgaXRlbXMKLQkJLy8gYXJlIGNyZWF0ZWQuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXJUZXN0I3Rlc3RJbnNlcnRTaWJsaW5nU2VsZWN0RXhwYW5kZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRTaWJsaW5nU2VsZWN0RXhwYW5kZWQoKSB7Ci0JCS8vIFRoaXMgdGVzdCBpcyBubyB1c2UgaGVyZSBhcyBpdCBpcwotCQkvLyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCBpdGVtcwotCQkvLyBhcmUgY3JlYXRlZC4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlclRlc3QjdGVzdFNvbWVDaGlsZHJlbkNoYW5nZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTb21lQ2hpbGRyZW5DaGFuZ2VkKCkgewotCQkvLyBUaGlzIHRlc3QgaXMgbm8gdXNlIGhlcmUgYXMgaXQgaXMKLQkJLy8gYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgaXRlbXMKLQkJLy8gYXJlIGNyZWF0ZWQuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXJUZXN0I3Rlc3RXb3JsZENoYW5nZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXb3JsZENoYW5nZWQoKSB7Ci0JCS8vIFRoaXMgdGVzdCBpcyBubyB1c2UgaGVyZSBhcyBpdCBpcwotCQkvLyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCBpdGVtcwotCQkvLyBhcmUgY3JlYXRlZC4KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyVGVzdCN0ZXN0RGVsZXRlU2libGluZygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZVNpYmxpbmcoKSB7Ci0JCS8vRm9yY2UgY3JlYXRpb24gb2YgdGhlIGl0ZW0gZmlyc3QKLQkJKChUYWJsZVZpZXdlcikgZlZpZXdlcikuZ2V0VGFibGUoKS5nZXRJdGVtKDApLmdldFRleHQoKTsKLQkJc3VwZXIudGVzdERlbGV0ZVNpYmxpbmcoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyVGVzdCN0ZXN0U2V0U2VsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VsZWN0aW9uKCkgewotCQkvL0ZvcmNlIGNyZWF0aW9uIG9mIHRoZSBpdGVtIGZpcnN0Ci0JCSgoVGFibGVWaWV3ZXIpIGZWaWV3ZXIpLmdldFRhYmxlKCkuZ2V0SXRlbSgwKS5nZXRUZXh0KCk7Ci0JCXN1cGVyLnRlc3RTZXRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBzZWxlY3RpbmcgYWxsIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZXRBbGxTZWxlY3Rpb24oKSB7Ci0JCVRlc3RFbGVtZW50W10gY2hpbGRyZW4gPSBmUm9vdEVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjaGlsZHJlbik7Ci0JCWZWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHJlc3VsdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiU2l6ZSB3YXMgIiArIFN0cmluZy52YWx1ZU9mKHJlc3VsdC5zaXplKCkpICsgIiBleHBlY3RlZCAiCi0JCQkJKyBTdHJpbmcudmFsdWVPZihjaGlsZHJlbi5sZW5ndGgpLAotCQkJCShyZXN1bHQuc2l6ZSgpID09IGNoaWxkcmVuLmxlbmd0aCkpOwotCQlTZXQgY2hpbGRyZW5TZXQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGNoaWxkcmVuKSk7Ci0JCVNldCBzZWxlY3RlZFNldCA9IG5ldyBIYXNoU2V0KHJlc3VsdC50b0xpc3QoKSk7Ci0JCWFzc2VydFRydWUoIkVsZW1lbnRzIGRvIG5vdCBtYXRjaCAiLCBjaGlsZHJlblNldC5lcXVhbHMoc2VsZWN0ZWRTZXQpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVmlydHVhbFRyZWVWaWV3ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvVmlydHVhbFRyZWVWaWV3ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZmI2MGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL1ZpcnR1YWxUcmVlVmlld2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotCi0vKioKLSAqIFRlc3RzIFRyZWVWaWV3ZXIncyBWSVJUVUFMIHN1cHBvcnQgd2l0aCBhIG5vcm1hbCBjb250ZW50IHByb3ZpZGVyLgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFRyZWVWaWV3ZXJUZXN0IGV4dGVuZHMgVHJlZVZpZXdlclRlc3QgewotCi0JcHVibGljIFZpcnR1YWxUcmVlVmlld2VyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5WSVJUVUFMKTsKLQkJZlRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKLQkJZlRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZXN0TW9kZWxDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXJldHVybiBmVHJlZVZpZXdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW1hZ2VzL2phdmEuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ltYWdlcy9qYXZhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNzdhNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW1hZ2VzL2phdmEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0FkZENoaWxkQWN0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQWRkQ2hpbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlMTIzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQWRkQ2hpbGRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5UZXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RNb2RlbENoYW5nZTsKLQotcHVibGljIGNsYXNzIEFkZENoaWxkQWN0aW9uIGV4dGVuZHMgVGVzdFNlbGVjdGlvbkFjdGlvbiB7Ci0KLSAgICBpbnQgZkV2ZW50S2luZDsKLQotICAgIHB1YmxpYyBBZGRDaGlsZEFjdGlvbihTdHJpbmcgbGFiZWwsIFRlc3RCcm93c2VyIGJyb3dzZXIpIHsKLSAgICAgICAgdGhpcyhsYWJlbCwgYnJvd3NlciwgVGVzdE1vZGVsQ2hhbmdlLklOU0VSVCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFkZENoaWxkQWN0aW9uKFN0cmluZyBsYWJlbCwgVGVzdEJyb3dzZXIgYnJvd3NlciwgaW50IGV2ZW50S2luZCkgewotICAgICAgICBzdXBlcihsYWJlbCwgYnJvd3Nlcik7Ci0gICAgICAgIGZFdmVudEtpbmQgPSBldmVudEtpbmQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKFRlc3RFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgZWxlbWVudC5hZGRDaGlsZChmRXZlbnRLaW5kKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQWRkRWxlbWVudEFjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0FkZEVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiNTZlNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQWRkRWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdE1vZGVsQ2hhbmdlOwotCi1wdWJsaWMgY2xhc3MgQWRkRWxlbWVudEFjdGlvbiBleHRlbmRzIFRlc3RCcm93c2VyQWN0aW9uIHsKLQotICAgIHB1YmxpYyBBZGRFbGVtZW50QWN0aW9uKFN0cmluZyBsYWJlbCwgVGVzdEJyb3dzZXIgYnJvd3NlcikgewotICAgICAgICBzdXBlcihsYWJlbCwgYnJvd3Nlcik7Ci0gICAgICAgIC8vCQl3aW5kb3cuYWRkRm9jdXNDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBUZXN0RWxlbWVudCBlbGVtZW50ID0gKFRlc3RFbGVtZW50KSBnZXRCcm93c2VyKCkuZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgZWxlbWVudC5hZGRDaGlsZChUZXN0TW9kZWxDaGFuZ2UuSU5TRVJUKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQWRkRmlsdGVyQWN0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQWRkRmlsdGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTAzZDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0FkZEZpbHRlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBZGRGaWx0ZXJBY3Rpb24gZXh0ZW5kcyBUZXN0QnJvd3NlckFjdGlvbiB7Ci0KLSAgICBwdWJsaWMgQWRkRmlsdGVyQWN0aW9uKFN0cmluZyBsYWJlbCwgVGVzdEJyb3dzZXIgYnJvd3NlcikgewotICAgICAgICBzdXBlcihsYWJlbCwgYnJvd3Nlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBWaWV3ZXIgdmlld2VyID0gZ2V0QnJvd3NlcigpLmdldFZpZXdlcigpOwotICAgICAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikKLSAgICAgICAgICAgICgoU3RydWN0dXJlZFZpZXdlcikgdmlld2VyKS5hZGRGaWx0ZXIobmV3IEZpbHRlcigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQWRkU2libGluZ0FjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0FkZFNpYmxpbmdBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkMzgyZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQWRkU2libGluZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdE1vZGVsQ2hhbmdlOwotCi1wdWJsaWMgY2xhc3MgQWRkU2libGluZ0FjdGlvbiBleHRlbmRzIFRlc3RTZWxlY3Rpb25BY3Rpb24gewotCi0gICAgaW50IGZFdmVudEtpbmQ7Ci0KLSAgICBwdWJsaWMgQWRkU2libGluZ0FjdGlvbihTdHJpbmcgbGFiZWwsIFRlc3RCcm93c2VyIGJyb3dzZXIpIHsKLSAgICAgICAgdGhpcyhsYWJlbCwgYnJvd3NlciwgVGVzdE1vZGVsQ2hhbmdlLklOU0VSVCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFkZFNpYmxpbmdBY3Rpb24oU3RyaW5nIGxhYmVsLCBUZXN0QnJvd3NlciBicm93c2VyLCBpbnQgZXZlbnRLaW5kKSB7Ci0gICAgICAgIHN1cGVyKGxhYmVsLCBicm93c2VyKTsKLSAgICAgICAgZkV2ZW50S2luZCA9IGV2ZW50S2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oVGVzdEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBlbGVtZW50LmdldENvbnRhaW5lcigpLmFkZENoaWxkKGZFdmVudEtpbmQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9DaGFuZ2VDaGlsZExhYmVsQWN0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQ2hhbmdlQ2hpbGRMYWJlbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjU0OTk2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9DaGFuZ2VDaGlsZExhYmVsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDaGFuZ2VDaGlsZExhYmVsQWN0aW9uIGV4dGVuZHMgVGVzdFNlbGVjdGlvbkFjdGlvbiB7Ci0gICAgcHVibGljIENoYW5nZUNoaWxkTGFiZWxBY3Rpb24oU3RyaW5nIGxhYmVsLCBUZXN0QnJvd3NlciBicm93c2VyKSB7Ci0gICAgICAgIHN1cGVyKGxhYmVsLCBicm93c2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oVGVzdEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBUZXN0RWxlbWVudCBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkKLSAgICAgICAgICAgIGNoaWxkLnNldExhYmVsKGNoaWxkLmdldExhYmVsKCkgKyAiIHJlbmFtZWQgY2hpbGQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQ2hhbmdlSW5wdXRMYWJlbEFjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0NoYW5nZUlucHV0TGFiZWxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1MWQ4MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQ2hhbmdlSW5wdXRMYWJlbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQ2hhbmdlSW5wdXRMYWJlbEFjdGlvbiBleHRlbmRzIFRlc3RCcm93c2VyQWN0aW9uIHsKLQotICAgIHB1YmxpYyBDaGFuZ2VJbnB1dExhYmVsQWN0aW9uKFN0cmluZyBsYWJlbCwgVGVzdEJyb3dzZXIgYnJvd3NlcikgewotICAgICAgICBzdXBlcihsYWJlbCwgYnJvd3Nlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBUZXN0RWxlbWVudCBlbGVtZW50ID0gKFRlc3RFbGVtZW50KSBnZXRCcm93c2VyKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgZWxlbWVudC5zZXRMYWJlbChlbGVtZW50LmdldExhYmVsKCkgKyAiIGNoYW5nZWQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQ2hhbmdlTGFiZWxBY3Rpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9DaGFuZ2VMYWJlbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjU1YTJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9DaGFuZ2VMYWJlbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQ2hhbmdlTGFiZWxBY3Rpb24gZXh0ZW5kcyBUZXN0U2VsZWN0aW9uQWN0aW9uIHsKLQotICAgIHB1YmxpYyBDaGFuZ2VMYWJlbEFjdGlvbihTdHJpbmcgbGFiZWwsIFRlc3RCcm93c2VyIGJyb3dzZXIpIHsKLSAgICAgICAgc3VwZXIobGFiZWwsIGJyb3dzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bihUZXN0RWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIGVsZW1lbnQuc2V0TGFiZWwoZWxlbWVudC5nZXRMYWJlbCgpICsgIiBjaGFuZ2VkIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0NsZWFyU2VsZWN0aW9uQWN0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQ2xlYXJTZWxlY3Rpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzNDVkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQ2xlYXJTZWxlY3Rpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ2xlYXJTZWxlY3Rpb25BY3Rpb24gZXh0ZW5kcyBUZXN0QnJvd3NlckFjdGlvbiB7Ci0KLSAgICBwdWJsaWMgQ2xlYXJTZWxlY3Rpb25BY3Rpb24oU3RyaW5nIGxhYmVsLCBUZXN0QnJvd3NlciBicm93c2VyKSB7Ci0gICAgICAgIHN1cGVyKGxhYmVsLCBicm93c2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGdldEJyb3dzZXIoKS5nZXRWaWV3ZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0NvbmN1cnJlbnRUYWJsZVRlc3RWaWV3LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQ29uY3VycmVudFRhYmxlVGVzdFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiYzI4Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvQ29uY3VycmVudFRhYmxlVGVzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5UZXN0Q29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuZGVmZXJyZWQuRGVmZXJyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZC5TZXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5Xb3JrYmVuY2hKb2I7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgQ29uY3VycmVudFRhYmxlVGVzdFZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0KLSAgICBwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmFibGVTbG93Q29tcGFyaXNvbnMgPSBmYWxzZTsKLSAgICBwcml2YXRlIFRlc3RDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgVGVzdENvbXBhcmF0b3IoKSB7Ci0gICAgICAgIAotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotLy8gICAgICAgICAgICB0cnkgewotLy8gICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGEgYm9ndXMgZGVsYXkgdG8gc2ltdWxhdGUgZG9pbmcgd29yawotLy8gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEpOwotLy8gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgIH0KLQotICAgICAgICAJaWYgKGVuYWJsZVNsb3dDb21wYXJpc29ucykgewotCSAgICAgICAgICAgIGludCBkZWxheSA9IDI7IC8vIFRpbWUgdG8gc3BpbiB0aGUgQ1BVIGZvciAobWlsbGlzZWNvbmRzKQotCSAgICAgICAgICAgIAotCSAgICAgICAgICAgIC8vIERvIHNvbWUgd29yayB0byBvY2N1cHkgdGltZSAKLQkgICAgICAgICAgICBpbnQgY291bnRlciA9IDA7Ci0JICAgICAgICAgICAgbG9uZyB0aW1lc3RhbXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkgICAgICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCB0aW1lc3RhbXAgKyBkZWxheSkgewotCSAgICAgICAgICAgICAgICBjb3VudGVyKys7Ci0JICAgICAgICAgICAgfQotICAgICAgICAJfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3VwZXIuY29tcGFyZShhcmcwLCBhcmcxKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc2NoZWR1bGVDb21wYXJpc29uVXBkYXRlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIHByaXZhdGUgRGVmZXJyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotICAgIAotICAgIHByaXZhdGUgV29ya2JlbmNoSm9iIHVwZGF0ZUNvdW50UnVubmFibGUgPSBuZXcgV29ya2JlbmNoSm9iKCIiKSB7Ci0gICAgICAgIAotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2IjcnVuSW5VSVRocmVhZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgICAgICB1cGRhdGVDb3VudC5zZXRUZXh0KCJDb21wYXJpc29uIGNvdW50ID0gIiArIGNvbXBhcmF0b3IuY29tcGFyaXNvbnMpOwotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIAotICAgIHByaXZhdGUgTGFiZWwgdXBkYXRlQ291bnQ7Ci0gICAgcHJpdmF0ZSBTZXRNb2RlbCBtb2RlbCA9IG5ldyBTZXRNb2RlbCgpOwotICAgIHByaXZhdGUgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7Ci0gICAgcHJpdmF0ZSBCdXR0b24gc2xvd0NvbXBhcmlzb25zOwotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgdGVtcCkgewotICAgICAgICBDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSh0ZW1wLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICAKLSAgICAgICAgcGFyZW50LnNldExheW91dChsYXlvdXQpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSB0YWJsZQotICAgICAgICB7Ci0JICAgICAgICB0YWJsZSA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5WSVJUVUFMKTsKLQkgICAgICAgIGNvbnRlbnRQcm92aWRlciA9IG5ldyBEZWZlcnJlZENvbnRlbnRQcm92aWRlcihjb21wYXJhdG9yKTsKLQkgICAgICAgIHRhYmxlLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCSAgICAgICAgCi0JICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JICAgICAgICB0YWJsZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkgICAgICAgIHRhYmxlLnNldElucHV0KG1vZGVsKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBidXR0b25zCi0gICAgICAgIENvbXBvc2l0ZSBidXR0b25CYXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBidXR0b25CYXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgYnV0dG9uQmFyTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgYnV0dG9uQmFyTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICBidXR0b25CYXIuc2V0TGF5b3V0KGJ1dHRvbkJhckxheW91dCk7Ci0gICAgICAgIHsKLQotICAgICAgICAgICAgdXBkYXRlQ291bnQgPSBuZXcgTGFiZWwoYnV0dG9uQmFyLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICB1cGRhdGVDb3VudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICAgICAgc2xvd0NvbXBhcmlzb25zID0gbmV3IEJ1dHRvbihidXR0b25CYXIsIFNXVC5DSEVDSyk7Ci0gICAgICAgICAgICBzbG93Q29tcGFyaXNvbnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgICAgICBzbG93Q29tcGFyaXNvbnMuc2V0VGV4dCgiU2xvdyBjb21wYXJpc29ucyIpOwotICAgICAgICAgICAgc2xvd0NvbXBhcmlzb25zLnNldFNlbGVjdGlvbihlbmFibGVTbG93Q29tcGFyaXNvbnMpOwotICAgICAgICAgICAgc2xvd0NvbXBhcmlzb25zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZW5hYmxlU2xvd0NvbXBhcmlzb25zID0gc2xvd0NvbXBhcmlzb25zLmdldFNlbGVjdGlvbigpOwotCQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQl9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBCdXR0b24gbGltaXRTaXplID0gbmV3IEJ1dHRvbihidXR0b25CYXIsIFNXVC5DSEVDSyk7Ci0gICAgICAgICAgICBsaW1pdFNpemUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgICAgICBsaW1pdFNpemUuc2V0VGV4dCgiTGltaXQgdGFibGUgc2l6ZSB0byA0MDAiKTsKLSAgICAgICAgICAgIGxpbWl0U2l6ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIAkvKiAobm9uLUphdmFkb2MpCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmIChsaW1pdFNpemUuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJCWNvbnRlbnRQcm92aWRlci5zZXRMaW1pdCg0MDApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29udGVudFByb3ZpZGVyLnNldExpbWl0KC0xKTsKLQkJCQkJfQotCQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQl9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQnV0dG9uIHJlc2V0Q291bnRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkJhciwgU1dULlBVU0gpOwotICAgICAgICAgICAgcmVzZXRDb3VudEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgICAgIHJlc2V0Q291bnRCdXR0b24uc2V0VGV4dCgiUmVzZXQgY29tcGFyaXNvbiBjb3VudCIpOwotCSAgICAgICAgcmVzZXRDb3VudEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0JICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICAgICAgICAgICAgICovCi0JICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCSAgICAgICAgICAgICAgICBjb21wYXJhdG9yLmNvbXBhcmlzb25zID0gMDsKLQkgICAgICAgICAgICAgICAgc2NoZWR1bGVDb21wYXJpc29uVXBkYXRlKCk7Ci0JICAgICAgICAgICAgfSAKLQkgICAgICAgIH0pOwotCSAgICAgICAgCi0JICAgICAgICBCdXR0b24gdGVzdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQmFyLCBTV1QuUFVTSCk7Ci0JICAgICAgICB0ZXN0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCSAgICAgICAgdGVzdEJ1dHRvbi5zZXRUZXh0KCJhZGQgMTAwMDAwIGVsZW1lbnRzIik7Ci0JICAgICAgICB0ZXN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkgICAgICAgIC8qIChub24tSmF2YWRvYykKLQkgICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgICAgICAgICAgICAgKi8KLQkgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JICAgICAgICAgICAgICAgIGFkZFJhbmRvbUVsZW1lbnRzKDEwMDAwMCk7Ci0JICAgICAgICAgICAgfSAKLQkgICAgICAgIH0pOwotCSAgICAgICAgCi0JICAgICAgICBCdXR0b24gcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25CYXIsIFNXVC5QVVNIKTsKLQkgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KCJyZW1vdmUgYWxsIik7Ci0JICAgICAgICByZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotCSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAgICAgICAgICAgICAqLwotCSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkgICAgICAgICAgICAgICAgY2xlYXIoKTsKLQkgICAgICAgICAgICB9IAotCSAgICAgICAgfSk7Ci0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2NoZWR1bGVDb21wYXJpc29uVXBkYXRlKCkgewotICAgICAgICB1cGRhdGVDb3VudFJ1bm5hYmxlLnNjaGVkdWxlKDEwMCk7Ci0gICAgfQotCi0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJhbmRvbUVsZW1lbnRzKGludCBhbW91bnQpIHsKLSAgICAgICAgCi0gICAgICAgIEFycmF5TGlzdCB0ZW1wTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmb3IgKGludCBjb3VudGVyID0gMDsgY291bnRlciA8IGFtb3VudDsgY291bnRlcisrKSB7Ci0gICAgICAgICAgICB0ZW1wTGlzdC5hZGQoIiIgKyByYW5kLm5leHRMb25nKCkgKyAiICIgKyBjb3VudGVyICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1vZGVsLmFkZEFsbCh0ZW1wTGlzdCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBtb2RlbC5jbGVhcigpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9DcmVhdGVNb2RlbEFjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0NyZWF0ZU1vZGVsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjY0YWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0NyZWF0ZU1vZGVsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVNb2RlbEFjdGlvbiBleHRlbmRzIFRlc3RCcm93c2VyQWN0aW9uIHsKLSAgICBpbnQgZkxldmVsOwotCi0gICAgaW50IGZDaGlsZENvdW50OwotCi0gICAgcHVibGljIENyZWF0ZU1vZGVsQWN0aW9uKFN0cmluZyBsYWJlbCwgVGVzdEJyb3dzZXIgYnJvd3NlciwgaW50IGxldmVsLAotICAgICAgICAgICAgaW50IGNoaWxkQ291bnQpIHsKLSAgICAgICAgc3VwZXIobGFiZWwsIGJyb3dzZXIpOwotICAgICAgICBmTGV2ZWwgPSBsZXZlbDsKLSAgICAgICAgZkNoaWxkQ291bnQgPSBjaGlsZENvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgLy8gQ2xlYXIgaW5wdXQgc2luY2UgVGVzdEVsZW1lbnQuZXF1YWxzIGRvZXMgb25seQotICAgICAgICAvLyBjaGVjayB0aGUgaWQsIG5vdCB0aGUgc2l6ZSBvZiB0aGUgVGVzdEVsZW1lbnQuCi0gICAgICAgIGdldEJyb3dzZXIoKS5zZXRJbnB1dChudWxsKTsKLSAgICAgICAgZ2V0QnJvd3NlcigpLnNldElucHV0KFRlc3RFbGVtZW50LmNyZWF0ZU1vZGVsKGZMZXZlbCwgZkNoaWxkQ291bnQpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvRGVsZXRlQWN0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvRGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MGM3ODEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlQWN0aW9uIGV4dGVuZHMgVGVzdFNlbGVjdGlvbkFjdGlvbiB7Ci0KLSAgICBwdWJsaWMgRGVsZXRlQWN0aW9uKFN0cmluZyBsYWJlbCwgVGVzdEJyb3dzZXIgYnJvd3NlcikgewotICAgICAgICBzdXBlcihsYWJlbCwgYnJvd3Nlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKFRlc3RFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgZWxlbWVudC5nZXRDb250YWluZXIoKS5kZWxldGVDaGlsZChlbGVtZW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvRGVsZXRlQ2hpbGRyZW5BY3Rpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9EZWxldGVDaGlsZHJlbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjQ1YjA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9EZWxldGVDaGlsZHJlbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlQ2hpbGRyZW5BY3Rpb24gZXh0ZW5kcyBUZXN0U2VsZWN0aW9uQWN0aW9uIHsKLQotICAgIGJvb2xlYW4gZkFsbCA9IGZhbHNlOwotCi0gICAgcHVibGljIERlbGV0ZUNoaWxkcmVuQWN0aW9uKFN0cmluZyBsYWJlbCwgVGVzdEJyb3dzZXIgYnJvd3NlciwgYm9vbGVhbiBhbGwpIHsKLSAgICAgICAgc3VwZXIobGFiZWwsIGJyb3dzZXIpOwotICAgICAgICBmQWxsID0gYWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bihUZXN0RWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChmQWxsKQotICAgICAgICAgICAgZWxlbWVudC5kZWxldGVDaGlsZHJlbigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlbGVtZW50LmRlbGV0ZVNvbWVDaGlsZHJlbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9EZWxldGVTaWJsaW5nc0FjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0RlbGV0ZVNpYmxpbmdzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZmYwYTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0RlbGV0ZVNpYmxpbmdzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVTaWJsaW5nc0FjdGlvbiBleHRlbmRzIFRlc3RTZWxlY3Rpb25BY3Rpb24gewotCi0gICAgYm9vbGVhbiBmQWxsID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgRGVsZXRlU2libGluZ3NBY3Rpb24oU3RyaW5nIGxhYmVsLCBUZXN0QnJvd3NlciBicm93c2VyLCBib29sZWFuIGFsbCkgewotICAgICAgICBzdXBlcihsYWJlbCwgYnJvd3Nlcik7Ci0gICAgICAgIGZBbGwgPSBhbGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKFRlc3RFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGZBbGwpCi0gICAgICAgICAgICBlbGVtZW50LmdldENvbnRhaW5lcigpLmRlbGV0ZUNoaWxkcmVuKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVsZW1lbnQuZ2V0Q29udGFpbmVyKCkuZGVsZXRlU29tZUNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0V4cGFuZEFsbEFjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0V4cGFuZEFsbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTc0ZmI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9FeHBhbmRBbGxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHBhbmRBbGxBY3Rpb24gZXh0ZW5kcyBUZXN0QnJvd3NlckFjdGlvbiB7Ci0KLSAgICBwdWJsaWMgRXhwYW5kQWxsQWN0aW9uKFN0cmluZyBsYWJlbCwgVGVzdEJyb3dzZXIgYnJvd3NlcikgewotICAgICAgICBzdXBlcihsYWJlbCwgYnJvd3Nlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBWaWV3ZXIgdmlld2VyID0gZ2V0QnJvd3NlcigpLmdldFZpZXdlcigpOwotICAgICAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlVmlld2VyKQotICAgICAgICAgICAgKChBYnN0cmFjdFRyZWVWaWV3ZXIpIHZpZXdlcikuZXhwYW5kQWxsKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0ZpbHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDYxMmVmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotCi1wdWJsaWMgY2xhc3MgRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQotICAgIHB1YmxpYyBPYmplY3RbXSBmaWx0ZXIoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gZWxlbWVudHMpIHsKLSAgICAgICAgQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgLy8gdG9zcyBldmVyeSBzZWNvbmQgaXRlbQotICAgICAgICAgICAgaWYgKGkgJSAyID09IDEpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGVsZW1lbnRzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBPYmplY3QgYXNwZWN0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFZpZXdlckZpbHRlcgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgLy8gbm90IHVzZWQKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9GbHVzaElucHV0QWN0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvRmx1c2hJbnB1dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTNjNmM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9GbHVzaElucHV0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZTsKLQotcHVibGljIGNsYXNzIEZsdXNoSW5wdXRBY3Rpb24gZXh0ZW5kcyBUZXN0QnJvd3NlckFjdGlvbiB7Ci0KLSAgICBwdWJsaWMgRmx1c2hJbnB1dEFjdGlvbihTdHJpbmcgbGFiZWwsIFRlc3RCcm93c2VyIGJyb3dzZXIpIHsKLSAgICAgICAgc3VwZXIobGFiZWwsIGJyb3dzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgZ2V0QnJvd3NlcigpLnNldElucHV0KG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9MYXp5RGVmZXJyZWRWaXJ0dWFsVGFibGVWaWV3LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvTGF6eURlZmVycmVkVmlydHVhbFRhYmxlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTc3ZjVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9MYXp5RGVmZXJyZWRWaXJ0dWFsVGFibGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYXp5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotCi0vKioKLSAqIFRoZSBMYXp5VmlydHVhbFRhYmxlVmlldyBpcyB0aGUgVmlydHVhbFRhYmxlVmlldyB3aXRoIGxhenkgY29udGVudC4KLSAqLwotcHVibGljIGNsYXNzIExhenlEZWZlcnJlZFZpcnR1YWxUYWJsZVZpZXcgZXh0ZW5kcyBWaXJ0dWFsVGFibGVWaWV3IHsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICovCi0JcHVibGljIExhenlEZWZlcnJlZFZpcnR1YWxUYWJsZVZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlLlZpcnR1YWxUYWJsZVZpZXcjZ2V0Q29udGVudFByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSUxhenlDb250ZW50UHJvdmlkZXIoKSB7Ci0KLQkJCWludCByYW5nZVN0YXJ0ID0gLTE7Ci0KLQkJCWludCByYW5nZUVuZCA9IC0xOwotCi0JCQlVSUpvYiB1cGRhdGVKb2IgPSBuZXcgVUlKb2IoIlVwZGF0ZSIpIHsKLQkJCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQlpZih2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJaW50IHJhbmdlTGVuZ3RoID0gcmFuZ2VFbmQgLSByYW5nZVN0YXJ0OwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8PSByYW5nZUxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpbnQgaW5kZXggPSBpICsgcmFuZ2VTdGFydDsKLQkJCQkJCXZpZXdlci5yZXBsYWNlKCJFbGVtZW50ICIgKyBTdHJpbmcudmFsdWVPZihpbmRleCksCi0JCQkJCQkJCWluZGV4KTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCX07Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGF6eUNvbnRlbnRQcm92aWRlciN1cGRhdGVFbGVtZW50cyhpbnQsCi0JCQkgKiAgICAgIGludCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudChpbnQgaW5kZXgpIHsKLQotCQkJCWludCBiZWdpbiA9IE1hdGgubWF4KDAsIGluZGV4IC0gNTApOwotCQkJCWludCBlbmQgPSBNYXRoLm1pbihiZWdpbiArIDUwLCA5OTk5KTsKLQotCQkJCS8vIEluaXRpYWwgY2FzZQotCQkJCWlmIChyYW5nZVN0YXJ0ID09IC0xIHx8IHJhbmdlRW5kID09IC0xKSB7Ci0JCQkJCXJhbmdlU3RhcnQgPSBiZWdpbjsKLQkJCQkJcmFuZ2VFbmQgPSBlbmQ7Ci0JCQkJCXVwZGF0ZUpvYi5zY2hlZHVsZSgxMDAwKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIEFyZSB3ZSBpbiB0aGUgcmFuZ2UgYWxyZWFkeSBiZWluZyB3b3JrZWQgb24/Ci0JCQkJaWYgKGluZGV4ID49IHJhbmdlU3RhcnQgJiYgaW5kZXggPD0gcmFuZ2VFbmQpCi0JCQkJCXJldHVybjsKLQotCQkJCS8vIEFyZSB3ZSBvdXRzaWRlIG9mIHRoZSBvbGQgcmFuZ2U/Ci0JCQkJaWYgKGJlZ2luID4gcmFuZ2VFbmQgfHwgZW5kIDwgcmFuZ2VTdGFydCkgewotCQkJCQl2aWV3ZXIuZ2V0VGFibGUoKS5jbGVhcihyYW5nZVN0YXJ0LCByYW5nZUVuZCk7Ci0JCQkJCXJhbmdlU3RhcnQgPSBiZWdpbjsKLQkJCQkJcmFuZ2VFbmQgPSBlbmQ7Ci0JCQkJCXVwZGF0ZUpvYi5zY2hlZHVsZSgxMDAwKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIFNoaWZ0IGlmIGl0IGlzIGJlZm9yZQotCQkJCWlmIChiZWdpbiA8IHJhbmdlU3RhcnQpIHsKLQkJCQkJcmFuZ2VTdGFydCA9IGJlZ2luOwotCQkJCQlpbnQgb2xkRW5kID0gcmFuZ2VFbmQ7Ci0JCQkJCXJhbmdlRW5kID0gZW5kOwotCQkJCQl2aWV3ZXIuZ2V0VGFibGUoKS5jbGVhcihlbmQgKyAxLCBvbGRFbmQpOwotCi0JCQkJCXVwZGF0ZUpvYi5zY2hlZHVsZSgxMDAwKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIFNoaWZ0IGlmIGl0IGlzIGFmdGVyCi0JCQkJaWYgKGVuZCA+IHJhbmdlRW5kKSB7Ci0JCQkJCXJhbmdlRW5kID0gZW5kOwotCQkJCQlpbnQgb2xkU3RhcnQgPSByYW5nZVN0YXJ0OwotCQkJCQlyYW5nZVN0YXJ0ID0gYmVnaW47Ci0JCQkJCXZpZXdlci5nZXRUYWJsZSgpLmNsZWFyKG9sZFN0YXJ0LCByYW5nZVN0YXJ0IC0gMSk7Ci0JCQkJCXVwZGF0ZUpvYi5zY2hlZHVsZSgxMDAwKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy8gRG8gTm90aGluZwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCi0JCQkJCU9iamVjdCBuZXdJbnB1dCkgewotCQkJCS8vIERvIG5vdGhpbmcuCi0JCQl9Ci0JCX07Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZS5WaXJ0dWFsVGFibGVWaWV3I3Jlc2V0SW5wdXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0SW5wdXQoKSB7Ci0JCXZpZXdlci5zZXRJdGVtQ291bnQoaXRlbUNvdW50KTsKLQkJc3VwZXIucmVzZXRJbnB1dCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9MYXp5VmlydHVhbFRhYmxlVmlldy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0xhenlWaXJ0dWFsVGFibGVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDhhNjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL0xhenlWaXJ0dWFsVGFibGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYXp5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBMYXp5VmlydHVhbFRhYmxlVmlldyBpcyB0aGUgVmlydHVhbFRhYmxlVmlldyB3aXRoCi0gKiBsYXp5IGNvbnRlbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXp5VmlydHVhbFRhYmxlVmlldyBleHRlbmRzIFZpcnR1YWxUYWJsZVZpZXcgewotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkgKi8KLQlwdWJsaWMgTGF6eVZpcnR1YWxUYWJsZVZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZS5WaXJ0dWFsVGFibGVWaWV3I2dldENvbnRlbnRQcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElMYXp5Q29udGVudFByb3ZpZGVyKCkgewotCQkJCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhenlDb250ZW50UHJvdmlkZXIjdXBkYXRlRWxlbWVudHMoaW50LCBpbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoaW50IGluZGV4KSB7Ci0JCSAgICAgICAgdmlld2VyLnJlcGxhY2UoIkVsZW1lbnQgIiArIFN0cmluZy52YWx1ZU9mKGluZGV4KSwgaW5kZXgpOwotCQkJfQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy9EbyBOb3RoaW5nCi0JCQl9Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJLy8gRG8gbm90aGluZy4KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlLlZpcnR1YWxUYWJsZVZpZXcjcmVzZXRJbnB1dCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRJbnB1dCgpIHsKLQkJdmlld2VyLnNldEl0ZW1Db3VudChpdGVtQ291bnQpOwotCQlzdXBlci5yZXNldElucHV0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1Jlc2V0RmlsdGVyQWN0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvUmVzZXRGaWx0ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyYWVjNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvUmVzZXRGaWx0ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgUmVzZXRGaWx0ZXJBY3Rpb24gZXh0ZW5kcyBUZXN0QnJvd3NlckFjdGlvbiB7Ci0KLSAgICBwdWJsaWMgUmVzZXRGaWx0ZXJBY3Rpb24oU3RyaW5nIGxhYmVsLCBUZXN0QnJvd3NlciBicm93c2VyKSB7Ci0gICAgICAgIHN1cGVyKGxhYmVsLCBicm93c2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIFZpZXdlciB2aWV3ZXIgPSBnZXRCcm93c2VyKCkuZ2V0Vmlld2VyKCk7Ci0gICAgICAgIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0gICAgICAgICAgICBTdHJ1Y3R1cmVkVmlld2VyIHYgPSAoU3RydWN0dXJlZFZpZXdlcikgdmlld2VyOwotICAgICAgICAgICAgdi5yZXNldEZpbHRlcnMoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9SZXNldFNvcnRlckFjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1Jlc2V0U29ydGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzFkZjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1Jlc2V0U29ydGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotcHVibGljIGNsYXNzIFJlc2V0U29ydGVyQWN0aW9uIGV4dGVuZHMgVGVzdEJyb3dzZXJBY3Rpb24gewotCi0gICAgcHVibGljIFJlc2V0U29ydGVyQWN0aW9uKFN0cmluZyBsYWJlbCwgVGVzdEJyb3dzZXIgYnJvd3NlcikgewotICAgICAgICBzdXBlcihsYWJlbCwgYnJvd3Nlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBWaWV3ZXIgdmlld2VyID0gZ2V0QnJvd3NlcigpLmdldFZpZXdlcigpOwotICAgICAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotICAgICAgICAgICAgU3RydWN0dXJlZFZpZXdlciB2ID0gKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcjsKLSAgICAgICAgICAgIHYuc2V0U29ydGVyKG51bGwpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1NldExhYmVsUHJvdmlkZXJBY3Rpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9TZXRMYWJlbFByb3ZpZGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzlkZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1NldExhYmVsUHJvdmlkZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5UZXN0TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbnRlbnRWaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZXRMYWJlbFByb3ZpZGVyQWN0aW9uIGV4dGVuZHMgVGVzdEJyb3dzZXJBY3Rpb24gewotCi0gICAgcHVibGljIFNldExhYmVsUHJvdmlkZXJBY3Rpb24oU3RyaW5nIGxhYmVsLCBUZXN0QnJvd3NlciBicm93c2VyKSB7Ci0gICAgICAgIHN1cGVyKGxhYmVsLCBicm93c2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICgoQ29udGVudFZpZXdlcikgZ2V0QnJvd3NlcigpLmdldFZpZXdlcigpKQotICAgICAgICAgICAgICAgIC5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUZXN0TGFiZWxQcm92aWRlcigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvU2V0U29ydGVyQWN0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvU2V0U29ydGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2M2NmM2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1NldFNvcnRlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZXRTb3J0ZXJBY3Rpb24gZXh0ZW5kcyBUZXN0QnJvd3NlckFjdGlvbiB7Ci0KLSAgICBwdWJsaWMgU2V0U29ydGVyQWN0aW9uKFN0cmluZyBsYWJlbCwgVGVzdEJyb3dzZXIgYnJvd3NlcikgewotICAgICAgICBzdXBlcihsYWJlbCwgYnJvd3Nlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBWaWV3ZXIgdmlld2VyID0gZ2V0QnJvd3NlcigpLmdldFZpZXdlcigpOwotICAgICAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotICAgICAgICAgICAgU3RydWN0dXJlZFZpZXdlciB2ID0gKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcjsKLSAgICAgICAgICAgIHYuc2V0U29ydGVyKG5ldyBTb3J0ZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvU29ydGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOWU3NmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1NvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNpY1Byb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi1wdWJsaWMgY2xhc3MgU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICByZXR1cm4gSUJhc2ljUHJvcGVydHlDb25zdGFudHMuUF9URVhULmVxdWFscyhwcm9wZXJ0eSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1Rlc3RBcHBsaWNhdGlvbldpbmRvdy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1Rlc3RBcHBsaWNhdGlvbldpbmRvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmQwOTc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0QXBwbGljYXRpb25XaW5kb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBBIHNpbXBsZSBhcHBsaWNhdGlvbiB3aW5kb3cgdXNlZCBmb3IgdGVzdGluZyB2YXJpb3VzIGJ1Z3MuCi0gKiBJbnNlcnQgY29kZSBhcyBuZWVkZWQgdG8gdGVzdCBwcm9ibGVtcyBpbiBhIHJhdyBhcHBsaWNhdGlvbgotICogd2luZG93LgotICogCi0gKiBEZXNpZ25lZCB0byBiZSBzdGFydGVkIGFzIGFuIFNXVCBhcHBsaWNhdGlvbi4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLXB1YmxpYyBjbGFzcyBUZXN0QXBwbGljYXRpb25XaW5kb3cgZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdyB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBUZXN0QXBwbGljYXRpb25XaW5kb3coKS5vcGVuKCk7Ci0JfQotCi0JcHVibGljIFRlc3RBcHBsaWNhdGlvbldpbmRvdygpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXNldEJsb2NrT25PcGVuKHRydWUpOwotCQlhZGRNZW51QmFyKCk7Ci0JfQotCi0JLyoKLQkgKiBUZXN0IGluaXRpYWwgbG9jYXRpb24gYW5kIHNpemUuCi0JICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05Njk1NQotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsTG9jYXRpb24oUG9pbnQgaW5pdGlhbFNpemUpIHsKLQkJcmV0dXJuIG5ldyBQb2ludCgzMCwgMzApOwotCX0KLQotCXByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpIHsKLQkJcmV0dXJuIG5ldyBQb2ludCgxNTAsIDE1MCk7Ci0JfQotCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIAkvLyBjcmVhdGUgeW91ciBjb250ZW50cyBoZXJlCi0JCUNvbnRyb2wgY29udGVudHMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQkKLQkJLy8gZmlsbCB0aGUgbWVudSBiYXIKLSAgICAJZmlsbE1lbnVCYXIoKTsKLSAgICAJCi0gICAgCXJldHVybiBjb250ZW50czsKLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxNZW51QmFyKCkgewotICAgIAlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IGdldE1lbnVCYXJNYW5hZ2VyKCk7Ci0gICAgCU1lbnVNYW5hZ2VyIGZpbGVNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCImRmlsZSIpOwotCQltZW51TWFuYWdlci5hZGQoZmlsZU1lbnUpOwotCi0JCUFjdGlvbiBsb2FkQWN0aW9uID0gbmV3IEFjdGlvbigiJlNhdmUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9OwotCQlmaWxlTWVudS5hZGQobG9hZEFjdGlvbik7Ci0JCW1lbnVNYW5hZ2VyLnVwZGF0ZUFsbChmYWxzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdEJyb3dzZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0QnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDBhN2VjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0QnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdE1vZGVsQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RCcm93c2VyIGV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cgewotICAgIFRlc3RFbGVtZW50IGZJbnB1dDsKLQotICAgIFZpZXdlciBmVmlld2VyOwotCi0gICAgQWN0aW9uIGZDaGFuZ2VMYWJlbEFjdGlvbjsKLQotICAgIEFjdGlvbiBmQ2hhbmdlSW5wdXRMYWJlbEFjdGlvbjsKLQotICAgIEFjdGlvbiBmQ2hhbmdlQ2hpbGRMYWJlbEFjdGlvbjsKLQotICAgIEFjdGlvbiBmUmVsb2FkQWN0aW9uOwotCi0gICAgQWN0aW9uIGZSZWxvYWRBY3Rpb25MYXJnZTsKLQotICAgIEFjdGlvbiBmUmVsb2FkQWN0aW9uRmxhdDsKLQotICAgIEFjdGlvbiBmRGVsZXRlQWN0aW9uOwotCi0gICAgQWN0aW9uIGZEZWxldGVDaGlsZHJlbkFjdGlvbjsKLQotICAgIEFjdGlvbiBmRGVsZXRlU29tZUNoaWxkcmVuQWN0aW9uOwotCi0gICAgQWN0aW9uIGZEZWxldGVTaWJsaW5nc0FjdGlvbjsKLQotICAgIEFjdGlvbiBmRmx1c2hJbnB1dEFjdGlvbjsKLQotICAgIEFjdGlvbiBmQWRkRWxlbWVudEFjdGlvbjsKLQotICAgIEFjdGlvbiBmQWRkU2libGluZ0FjdGlvbjsKLQotICAgIEFjdGlvbiBmQWRkU2libGluZ1JldmVhbEFjdGlvbjsKLQotICAgIEFjdGlvbiBmQWRkU2libGluZ1NlbGVjdEFjdGlvbjsKLQotICAgIEFjdGlvbiBmQWRkQ2hpbGRBY3Rpb247Ci0KLSAgICBBY3Rpb24gZkFkZENoaWxkUmV2ZWFsQWN0aW9uOwotCi0gICAgQWN0aW9uIGZBZGRDaGlsZFNlbGVjdEFjdGlvbjsKLQotICAgIEFjdGlvbiBmV29ybGRDaGFuZ2VkQWN0aW9uOwotCi0gICAgQWN0aW9uIGZTZXRMYWJlbFByb3ZpZGVyOwotCi0gICAgQWN0aW9uIGZBZGRGaWx0ZXJBY3Rpb247Ci0KLSAgICBBY3Rpb24gZlJlc2V0RmlsdGVyczsKLQotICAgIEFjdGlvbiBmU2V0U29ydGVyOwotCi0gICAgQWN0aW9uIGZSZXNldFNvcnRlcjsKLQotICAgIEFjdGlvbiBmQ2xlYXJTZWxlY3Rpb247Ci0KLSAgICBpbnQgZlBhbmVzID0gMTsKLQotICAgIHB1YmxpYyBUZXN0QnJvd3NlcigpIHsKLSAgICAgICAgc3VwZXIobnVsbCk7Ci0gICAgICAgIGFkZE1lbnVCYXIoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpbmRvdy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgICAgIHNoZWxsLnNldFRleHQoIlRlc3QgQnJvd3NlciIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0gICAgICAgIGZDaGFuZ2VMYWJlbEFjdGlvbiA9IG5ldyBDaGFuZ2VMYWJlbEFjdGlvbigiQ2hhbmdlIExhYmVsIiwgdGhpcyk7Ci0gICAgICAgIGZDaGFuZ2VDaGlsZExhYmVsQWN0aW9uID0gbmV3IENoYW5nZUNoaWxkTGFiZWxBY3Rpb24oCi0gICAgICAgICAgICAgICAgIkNoYW5nZSBDaGlsZCBMYWJlbCIsIHRoaXMpOwotICAgICAgICAvLwlmQ2hhbmdlSW5wdXRMYWJlbEFjdGlvbiA9Ci0gICAgICAgIC8vCQluZXcgQ2hhbmdlSW5wdXRMYWJlbEFjdGlvbigiQ2hhbmdlIElucHV0IExhYmVsIiwgdGhpcyk7Ci0KLSAgICAgICAgZlJlbG9hZEFjdGlvbiA9IG5ldyBDcmVhdGVNb2RlbEFjdGlvbigiUmVsb2FkIFRlc3QgRGF0YSAoc21hbGwpIiwgdGhpcywKLSAgICAgICAgICAgICAgICAzLCAxMCk7Ci0gICAgICAgIGZSZWxvYWRBY3Rpb25MYXJnZSA9IG5ldyBDcmVhdGVNb2RlbEFjdGlvbigiUmVsb2FkIFRlc3QgRGF0YSAobGFyZ2UpIiwKLSAgICAgICAgICAgICAgICB0aGlzLCAzLCAzMyk7Ci0gICAgICAgIGZSZWxvYWRBY3Rpb25GbGF0ID0gbmV3IENyZWF0ZU1vZGVsQWN0aW9uKCJSZWxvYWQgVGVzdCBEYXRhIChmbGF0KSIsCi0gICAgICAgICAgICAgICAgdGhpcywgMSwgMjAwMCk7Ci0KLSAgICAgICAgZkRlbGV0ZUFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24oIkRlbGV0ZSIsIHRoaXMpOwotICAgICAgICBmRGVsZXRlQ2hpbGRyZW5BY3Rpb24gPSBuZXcgRGVsZXRlQ2hpbGRyZW5BY3Rpb24oIkRlbGV0ZSBDaGlsZHJlbiIsCi0gICAgICAgICAgICAgICAgdGhpcywgdHJ1ZSk7Ci0gICAgICAgIGZEZWxldGVTb21lQ2hpbGRyZW5BY3Rpb24gPSBuZXcgRGVsZXRlQ2hpbGRyZW5BY3Rpb24oCi0gICAgICAgICAgICAgICAgIkRlbGV0ZSBPZGQgQ2hpbGRyZW4iLCB0aGlzLCBmYWxzZSk7Ci0gICAgICAgIGZEZWxldGVTaWJsaW5nc0FjdGlvbiA9IG5ldyBEZWxldGVTaWJsaW5nc0FjdGlvbigiRGVsZXRlIFNpYmxpbmdzIiwKLSAgICAgICAgICAgICAgICB0aGlzLCB0cnVlKTsKLQotICAgICAgICBmRmx1c2hJbnB1dEFjdGlvbiA9IG5ldyBGbHVzaElucHV0QWN0aW9uKCJGbHVzaCBJbnB1dCIsIHRoaXMpOwotCi0gICAgICAgIGZBZGRFbGVtZW50QWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24oIkFkZCBFbGVtZW50IHRvIElucHV0IiwgdGhpcyk7Ci0gICAgICAgIGZBZGRTaWJsaW5nQWN0aW9uID0gbmV3IEFkZFNpYmxpbmdBY3Rpb24oIkFkZCBTaWJsaW5nIiwgdGhpcyk7Ci0gICAgICAgIGZBZGRTaWJsaW5nUmV2ZWFsQWN0aW9uID0gbmV3IEFkZFNpYmxpbmdBY3Rpb24oCi0gICAgICAgICAgICAgICAgIkFkZCBTaWJsaW5nIGFuZCBSZXZlYWwiLCB0aGlzLCBUZXN0TW9kZWxDaGFuZ2UuSU5TRVJUCi0gICAgICAgICAgICAgICAgICAgICAgICB8IFRlc3RNb2RlbENoYW5nZS5SRVZFQUwpOwotICAgICAgICBmQWRkU2libGluZ1NlbGVjdEFjdGlvbiA9IG5ldyBBZGRTaWJsaW5nQWN0aW9uKAotICAgICAgICAgICAgICAgICJBZGQgU2libGluZyBhbmQgU2VsZWN0IiwgdGhpcywgVGVzdE1vZGVsQ2hhbmdlLklOU0VSVAotICAgICAgICAgICAgICAgICAgICAgICAgfCBUZXN0TW9kZWxDaGFuZ2UuUkVWRUFMIHwgVGVzdE1vZGVsQ2hhbmdlLlNFTEVDVCk7Ci0gICAgICAgIGZBZGRDaGlsZEFjdGlvbiA9IG5ldyBBZGRDaGlsZEFjdGlvbigiQWRkIENoaWxkIiwgdGhpcyk7Ci0gICAgICAgIGZBZGRDaGlsZFJldmVhbEFjdGlvbiA9IG5ldyBBZGRDaGlsZEFjdGlvbigiQWRkIENoaWxkIGFuZCBSZXZlYWwiLAotICAgICAgICAgICAgICAgIHRoaXMsIFRlc3RNb2RlbENoYW5nZS5JTlNFUlQgfCBUZXN0TW9kZWxDaGFuZ2UuUkVWRUFMKTsKLSAgICAgICAgZkFkZENoaWxkU2VsZWN0QWN0aW9uID0gbmV3IEFkZENoaWxkQWN0aW9uKCJBZGQgQ2hpbGQgYW5kIFNlbGVjdCIsCi0gICAgICAgICAgICAgICAgdGhpcywgVGVzdE1vZGVsQ2hhbmdlLklOU0VSVCB8IFRlc3RNb2RlbENoYW5nZS5SRVZFQUwKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgVGVzdE1vZGVsQ2hhbmdlLlNFTEVDVCk7Ci0KLSAgICAgICAgZldvcmxkQ2hhbmdlZEFjdGlvbiA9IG5ldyBXb3JsZENoYW5nZWRBY3Rpb24oIldvcmxkIENoYW5nZWQiLCB0aGlzKTsKLQotICAgICAgICBmU2V0TGFiZWxQcm92aWRlciA9IG5ldyBTZXRMYWJlbFByb3ZpZGVyQWN0aW9uKAotICAgICAgICAgICAgICAgICJTZXQgQ3VzdG9tIExhYmVsIFByb3ZpZGVyIiwgdGhpcyk7Ci0KLSAgICAgICAgZkFkZEZpbHRlckFjdGlvbiA9IG5ldyBBZGRGaWx0ZXJBY3Rpb24oIkFkZCBGaWx0ZXIiLCB0aGlzKTsKLSAgICAgICAgZlJlc2V0RmlsdGVycyA9IG5ldyBSZXNldEZpbHRlckFjdGlvbigiUmVzZXQgQWxsIEZpbHRlcnMiLCB0aGlzKTsKLQotICAgICAgICBmU2V0U29ydGVyID0gbmV3IFNldFNvcnRlckFjdGlvbigiU2V0IFNvcnRlciIsIHRoaXMpOwotICAgICAgICBmUmVzZXRTb3J0ZXIgPSBuZXcgUmVzZXRTb3J0ZXJBY3Rpb24oIlJlc2V0IFNvcnRlciIsIHRoaXMpOwotCi0gICAgICAgIGZDbGVhclNlbGVjdGlvbiA9IG5ldyBDbGVhclNlbGVjdGlvbkFjdGlvbigiQ2xlYXIgU2VsZWN0aW9uIiwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBWaWV3Rm9ybSBmb3JtID0gbmV3IFZpZXdGb3JtKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBDTGFiZWwgbGFiZWwgPSBuZXcgQ0xhYmVsKGZvcm0sIFNXVC5OT05FKTsKLSAgICAgICAgZm9ybS5zZXRUb3BMZWZ0KGxhYmVsKTsKLSAgICAgICAgT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChpbnB1dC50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKGZQYW5lcyA9PSAxKSB7Ci0gICAgICAgICAgICBWaWV3ZXIgdmlld2VyID0gY3JlYXRlVmlld2VyKGZvcm0pOwotICAgICAgICAgICAgZm9ybS5zZXRDb250ZW50KHZpZXdlci5nZXRDb250cm9sKCkpOwotICAgICAgICAgICAgZlZpZXdlciA9IHZpZXdlcjsKLSAgICAgICAgICAgIHNldElucHV0KChUZXN0RWxlbWVudCkgaW5wdXQpOwotICAgICAgICB9IGVsc2UgaWYgKGZQYW5lcyA9PSAyKSB7Ci0gICAgICAgICAgICBTYXNoRm9ybSBzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShmb3JtLCBTV1QuVkVSVElDQUwpOwotICAgICAgICAgICAgZm9ybS5zZXRDb250ZW50KHNhc2hGb3JtKTsKLSAgICAgICAgICAgIFZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIoc2FzaEZvcm0pOwotICAgICAgICAgICAgZlZpZXdlciA9IHZpZXdlcjsKLSAgICAgICAgICAgIHZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgICAgICB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIoc2FzaEZvcm0pOwotICAgICAgICAgICAgdmlld2VyLnNldElucHV0KGlucHV0KTsKLSAgICAgICAgfQotICAgICAgICBjcmVhdGVBY3Rpb25zKCk7Ci0gICAgICAgIGZpbGxNZW51QmFyKGdldE1lbnVCYXJNYW5hZ2VyKCkpOwotICAgICAgICB2aWV3ZXJGaWxsTWVudUJhcihnZXRNZW51QmFyTWFuYWdlcigpKTsKLSAgICAgICAgZ2V0TWVudUJhck1hbmFnZXIoKS51cGRhdGVBbGwoZmFsc2UpOwotICAgICAgICByZXR1cm4gZm9ybTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KTsKLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbGxNZW51QmFyKE1lbnVNYW5hZ2VyIG1ncikgewotCi0gICAgICAgIE1lbnVNYW5hZ2VyIHNldHVwTWVudSA9IG5ldyBNZW51TWFuYWdlcigiU2V0dXAiLCAiU2V0dXAiKTsKLSAgICAgICAgbWdyLmFkZChzZXR1cE1lbnUpOwotICAgICAgICBzZXR1cE1lbnUuYWRkKGZSZWxvYWRBY3Rpb24pOwotICAgICAgICBzZXR1cE1lbnUuYWRkKGZSZWxvYWRBY3Rpb25MYXJnZSk7Ci0gICAgICAgIHNldHVwTWVudS5hZGQoZlJlbG9hZEFjdGlvbkZsYXQpOwotICAgICAgICBzZXR1cE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIHNldHVwTWVudS5hZGQoZkZsdXNoSW5wdXRBY3Rpb24pOwotICAgICAgICBzZXR1cE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIHNldHVwTWVudS5hZGQoZlNldExhYmVsUHJvdmlkZXIpOwotICAgICAgICBzZXR1cE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIHNldHVwTWVudS5hZGQoZkFkZEZpbHRlckFjdGlvbik7Ci0gICAgICAgIHNldHVwTWVudS5hZGQoZlJlc2V0RmlsdGVycyk7Ci0gICAgICAgIHNldHVwTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgc2V0dXBNZW51LmFkZChmU2V0U29ydGVyKTsKLSAgICAgICAgc2V0dXBNZW51LmFkZChmUmVzZXRTb3J0ZXIpOwotCi0gICAgICAgIE1lbnVNYW5hZ2VyIHRlc3RNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCJUZXN0cyIsICJUZXN0cyIpOwotICAgICAgICBtZ3IuYWRkKHRlc3RNZW51KTsKLSAgICAgICAgdGVzdE1lbnUuYWRkKGZDaGFuZ2VMYWJlbEFjdGlvbik7Ci0gICAgICAgIHRlc3RNZW51LmFkZChmQ2hhbmdlQ2hpbGRMYWJlbEFjdGlvbik7Ci0gICAgICAgIC8vCXRlc3RNZW51LmFkZChmQ2hhbmdlSW5wdXRMYWJlbEFjdGlvbik7Ci0gICAgICAgIHRlc3RNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgICAgIHRlc3RNZW51LmFkZChmRGVsZXRlQWN0aW9uKTsKLSAgICAgICAgdGVzdE1lbnUuYWRkKGZEZWxldGVDaGlsZHJlbkFjdGlvbik7Ci0gICAgICAgIHRlc3RNZW51LmFkZChmRGVsZXRlU29tZUNoaWxkcmVuQWN0aW9uKTsKLSAgICAgICAgdGVzdE1lbnUuYWRkKGZEZWxldGVTaWJsaW5nc0FjdGlvbik7Ci0gICAgICAgIHRlc3RNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgICAgIHRlc3RNZW51LmFkZChmQWRkRWxlbWVudEFjdGlvbik7Ci0gICAgICAgIHRlc3RNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgICAgIHRlc3RNZW51LmFkZChmQWRkU2libGluZ0FjdGlvbik7Ci0gICAgICAgIHRlc3RNZW51LmFkZChmQWRkU2libGluZ1JldmVhbEFjdGlvbik7Ci0gICAgICAgIHRlc3RNZW51LmFkZChmQWRkU2libGluZ1NlbGVjdEFjdGlvbik7Ci0gICAgICAgIHRlc3RNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgICAgIHRlc3RNZW51LmFkZChmQWRkQ2hpbGRBY3Rpb24pOwotICAgICAgICB0ZXN0TWVudS5hZGQoZkFkZENoaWxkUmV2ZWFsQWN0aW9uKTsKLSAgICAgICAgdGVzdE1lbnUuYWRkKGZBZGRDaGlsZFNlbGVjdEFjdGlvbik7Ci0gICAgICAgIHRlc3RNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgICAgIHRlc3RNZW51LmFkZChmQ2xlYXJTZWxlY3Rpb24pOwotICAgICAgICB0ZXN0TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotICAgICAgICB0ZXN0TWVudS5hZGQoZldvcmxkQ2hhbmdlZEFjdGlvbik7Ci0gICAgICAgIC8vCSgoVGVzdFRyZWUpdGhpcykudGVzdFRyZWVGaWxsTWVudUJhcih0ZXN0TWVudSk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RFbGVtZW50IGdldElucHV0KCkgewotICAgICAgICByZXR1cm4gZklucHV0OwotICAgIH0KLQotICAgIHB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotICAgICAgICByZXR1cm4gZlZpZXdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcG9zaXRlIGdldFZpZXdlckNvbnRhaW5lcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb3BlbihUZXN0RWxlbWVudCBpbnB1dCkgewotICAgIAlzZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgIHN1cGVyLm9wZW4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChUZXN0RWxlbWVudCBpbnB1dCkgewotICAgICAgICBmSW5wdXQgPSBpbnB1dDsKLSAgICAgICAgaWYgKGdldFZpZXdlcigpICE9IG51bGwpCi0gICAgICAgICAgICBnZXRWaWV3ZXIoKS5zZXRJbnB1dChpbnB1dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2hvdzJQYW5lcygpIHsKLSAgICAgICAgZlBhbmVzID0gMjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aWV3ZXJGaWxsTWVudUJhcihNZW51TWFuYWdlciBtZ3IpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1Rlc3RCcm93c2VyQWN0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdEJyb3dzZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwYWQ0MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdEJyb3dzZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RCcm93c2VyQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLSAgICBwcml2YXRlIFRlc3RCcm93c2VyIGJyb3dzZXI7Ci0KLSAgICBwdWJsaWMgVGVzdEJyb3dzZXJBY3Rpb24oU3RyaW5nIGxhYmVsLCBUZXN0QnJvd3NlciBicm93c2VyKSB7Ci0gICAgICAgIHN1cGVyKGxhYmVsKTsKLSAgICAgICAgdGhpcy5icm93c2VyID0gYnJvd3NlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXN0IGJyb3dzZXIuCi0gICAgICovCi0gICAgcHVibGljIFRlc3RCcm93c2VyIGdldEJyb3dzZXIoKSB7Ci0gICAgICAgIHJldHVybiBicm93c2VyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0Q2hlY2tib3hUcmVlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdENoZWNrYm94VHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjI5NGUxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0Q2hlY2tib3hUcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5UZXN0TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RNb2RlbENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVWaWV3ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVFeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0Q2hlY2tib3hUcmVlIGV4dGVuZHMgVGVzdFRyZWUgewotICAgIENoZWNrYm94VHJlZVZpZXdlciBmQ2hlY2tib3hWaWV3ZXI7Ci0KLSAgICBwdWJsaWMgVGVzdENoZWNrYm94VHJlZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja0NoaWxkcmVuKFRlc3RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gc3RhdGUpIHsKLSAgICAgICAgaW50IG51bUNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47IGkrKykgewotICAgICAgICAgICAgVGVzdEVsZW1lbnQgY2hpbGQgPSBlbGVtZW50LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpZiAoZkNoZWNrYm94Vmlld2VyLnNldENoZWNrZWQoY2hpbGQsIHN0YXRlKSkKLSAgICAgICAgICAgICAgICBjaGVja0NoaWxkcmVuKGNoaWxkLCBzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENoZWNrYm94VHJlZVZpZXdlciB2aWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHBhcmVudCk7Ci0gICAgICAgIHZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlc3RNb2RlbENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRlc3RMYWJlbFByb3ZpZGVyKCkpOwotCi0gICAgICAgIHZpZXdlci5hZGRUcmVlTGlzdGVuZXIobmV3IElUcmVlVmlld2VyTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVUcmVlRXhwYW5kZWQoKFRlc3RFbGVtZW50KSBlLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyZWVDb2xsYXBzZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNoZWNrQ2hpbGRyZW4oKFRlc3RFbGVtZW50KSBlLmdldEVsZW1lbnQoKSwgZS5nZXRDaGVja2VkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmQ2hlY2tib3hWaWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICAgIGZWaWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICAgIHJldHVybiB2aWV3ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaGFuZGxlVHJlZUV4cGFuZGVkKFRlc3RFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgLy8gYXBwbHkgdGhlIHNhbWUgY2hlY2sgcmVjdXJzaXZlbHkgdG8gYWxsIGNoaWxkcmVuCi0gICAgICAgIGJvb2xlYW4gY2hlY2tlZCA9IGZDaGVja2JveFZpZXdlci5nZXRDaGVja2VkKGVsZW1lbnQpOwotICAgICAgICBpbnQgbnVtQ2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgaSsrKSB7Ci0gICAgICAgICAgICBUZXN0RWxlbWVudCBjaGlsZCA9IGVsZW1lbnQuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGZDaGVja2JveFZpZXdlci5zZXRDaGVja2VkKGNoaWxkLCBjaGVja2VkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdEJyb3dzZXIgYnJvd3NlciA9IG5ldyBUZXN0Q2hlY2tib3hUcmVlKCk7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXS5lcXVhbHMoIi10d29wYW5lcyIpKQotICAgICAgICAgICAgYnJvd3Nlci5zaG93MlBhbmVzKCk7Ci0gICAgICAgIGJyb3dzZXIuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgIGJyb3dzZXIub3BlbihUZXN0RWxlbWVudC5jcmVhdGVNb2RlbCgzLCAxMCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0TGF6eVZpcnR1YWxUcmVlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdExhenlWaXJ0dWFsVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2Y3OGNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0TGF6eVZpcnR1YWxUcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdE1vZGVsTGF6eVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLXB1YmxpYyBjbGFzcyBUZXN0TGF6eVZpcnR1YWxUcmVlIGV4dGVuZHMgVGVzdFRyZWUgewotCi0JcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5WSVJUVUFMKTsKLQkJdHJlZS5hZGRMaXN0ZW5lcihTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHJpdmF0ZSBTdHJpbmcgZ2V0UG9zaXRpb24oVHJlZUl0ZW0gaXRlbSkgewotCQkJCVRyZWVJdGVtIHBhcmVudEl0ZW0gPSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCQlpZiAocGFyZW50SXRlbSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAiIiArIGl0ZW0uZ2V0UGFyZW50KCkuaW5kZXhPZihpdGVtKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGdldFBvc2l0aW9uKHBhcmVudEl0ZW0pICsgIi4iICsgcGFyZW50SXRlbS5pbmRleE9mKGl0ZW0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVN0cmluZyBwb3NpdGlvbiA9IGdldFBvc2l0aW9uKChUcmVlSXRlbSkgZXZlbnQuaXRlbSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1cGRhdGluZyAiICsgcG9zaXRpb24pOwotCQkJfQotCQl9KTsKLQkJVHJlZVZpZXdlciB2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVzdE1vZGVsTGF6eVRyZWVDb250ZW50UHJvdmlkZXIodmlld2VyKSk7Ci0JCXZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCi0JCWlmIChmVmlld2VyID09IG51bGwpCi0JCQlmVmlld2VyID0gdmlld2VyOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChUZXN0RWxlbWVudCBpbnB1dCkgewotCQlpZihmVmlld2VyIT1udWxsKSB7Ci0JCQlPYmplY3Qgb2xkSW5wdXQgPSBmVmlld2VyLmdldElucHV0KCk7Ci0JCQlpZihvbGRJbnB1dCE9bnVsbCkgewotCQkJCWZWaWV3ZXIuc2V0Q2hpbGRDb3VudChvbGRJbnB1dCwgMCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuc2V0SW5wdXQoaW5wdXQpOwotCQlpZihmVmlld2VyIT1udWxsICYmIGlucHV0IT1udWxsKSB7Ci0JCQlmVmlld2VyLnNldENoaWxkQ291bnQoaW5wdXQsIGlucHV0LmdldENoaWxkQ291bnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXJncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdEJyb3dzZXIgYnJvd3NlciA9IG5ldyBUZXN0TGF6eVZpcnR1YWxUcmVlKCk7Ci0JCWlmIChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXS5lcXVhbHMoIi10d29wYW5lcyIpKQotCQkJYnJvd3Nlci5zaG93MlBhbmVzKCk7Ci0JCWJyb3dzZXIuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWJyb3dzZXIub3BlbihUZXN0RWxlbWVudC5jcmVhdGVNb2RlbCgzLCAxMCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1Rlc3RMaXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3NWUyYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5UZXN0TW9kZWxDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIFRlc3RMaXN0IGV4dGVuZHMgVGVzdEJyb3dzZXIgewotICAgIHB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGlzdFZpZXdlciB2aWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihwYXJlbnQpOwotICAgICAgICB2aWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLSAgICAgICAgdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVzdE1vZGVsQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICByZXR1cm4gdmlld2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdExpc3QgYnJvd3NlciA9IG5ldyBUZXN0TGlzdCgpOwotICAgICAgICBicm93c2VyLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgICBicm93c2VyLm9wZW4oVGVzdEVsZW1lbnQuY3JlYXRlTW9kZWwoMywgMTApKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2aWV3ZXJGaWxsTWVudUJhcihNZW51TWFuYWdlciBtZ3IpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdFNlbGVjdGlvbkFjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1Rlc3RTZWxlY3Rpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhMWJlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdFNlbGVjdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RTZWxlY3Rpb25BY3Rpb24gZXh0ZW5kcyBUZXN0QnJvd3NlckFjdGlvbiBpbXBsZW1lbnRzCi0gICAgICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotICAgIHB1YmxpYyBUZXN0U2VsZWN0aW9uQWN0aW9uKFN0cmluZyBsYWJlbCwgVGVzdEJyb3dzZXIgYnJvd3NlcikgewotICAgICAgICBzdXBlcihsYWJlbCwgYnJvd3Nlcik7Ci0gICAgICAgIGJyb3dzZXIuZ2V0Vmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEVsZW1lbnQgZ2V0VGVzdEVsZW1lbnQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRlc3RFbGVtZW50KSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZGVuIGZyb20gQWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgVGVzdEVsZW1lbnQgdGVzdEVsZW1lbnQgPSBnZXRUZXN0RWxlbWVudChnZXRCcm93c2VyKCkuZ2V0Vmlld2VyKCkKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBpZiAodGVzdEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcnVuKHRlc3RFbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIHJ1bihUZXN0RWxlbWVudCkKLSAgICAgKiBvbiBldmVyeSBlbGVtZW50IGNvbnRhaW5lZCBpbiB0aGUgdmVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihUZXN0RWxlbWVudCBvKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc2V0RW5hYmxlZCghZXZlbnQuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdFRhYmxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdFRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Njk3NzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1Rlc3RUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5UZXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdE1vZGVsQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGF5b3V0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotCi1wdWJsaWMgY2xhc3MgVGVzdFRhYmxlIGV4dGVuZHMgVGVzdEJyb3dzZXIgewotCi0gICAgcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBUYWJsZVZpZXdlciB2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIocGFyZW50KTsKLSAgICAgICAgdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVzdE1vZGVsQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICB2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGVzdExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIHZpZXdlci5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgICAgdmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHZpZXdlci5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBoZWFkZXJzW10gPSB7ICJMYWJlbCBDb2x1bW4iLCAiU2Vjb25kIENvbHVtbiIgfTsKLQotICAgICAgICBDb2x1bW5MYXlvdXREYXRhIGxheW91dHNbXSA9IHsgbmV3IENvbHVtbldlaWdodERhdGEoMTAwLCBmYWxzZSksCi0gICAgICAgICAgICAgICAgbmV3IENvbHVtbldlaWdodERhdGEoMTAwLCBmYWxzZSkgfTsKLQotICAgICAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW5zW10gPSBuZXcgVGFibGVDb2x1bW5baGVhZGVycy5sZW5ndGhdOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbGF5b3V0LmFkZENvbHVtbkRhdGEobGF5b3V0c1tpXSk7Ci0gICAgICAgICAgICBUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbih2aWV3ZXIuZ2V0VGFibGUoKSwgU1dULk5PTkUsIGkpOwotICAgICAgICAgICAgdGMuc2V0UmVzaXphYmxlKGxheW91dHNbaV0ucmVzaXphYmxlKTsKLSAgICAgICAgICAgIHRjLnNldFRleHQoaGVhZGVyc1tpXSk7Ci0gICAgICAgICAgICBjb2x1bW5zW2ldID0gdGM7Ci0gICAgICAgIH0KLQotICAgICAgICB2aWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQotICAgICAgICByZXR1cm4gdmlld2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFRhYmxlIGJyb3dzZXIgPSBuZXcgVGVzdFRhYmxlKCk7Ci0gICAgICAgIGJyb3dzZXIuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgIGJyb3dzZXIub3BlbihUZXN0RWxlbWVudC5jcmVhdGVNb2RlbCgzLCAxMCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZpZXdlckZpbGxNZW51QmFyKE1lbnVNYW5hZ2VyIG1ncikgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0VGFibGVUcmVlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdFRhYmxlVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjMyNWQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0VGFibGVUcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5UZXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RNb2RlbENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxheW91dERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci0KLXB1YmxpYyBjbGFzcyBUZXN0VGFibGVUcmVlIGV4dGVuZHMgVGVzdEJyb3dzZXIgewotCi0gICAgVGFibGVUcmVlVmlld2VyIGZWaWV3ZXI7Ci0KLSAgICBBY3Rpb24gZkV4cGFuZEFsbEFjdGlvbjsKLQotICAgIHB1YmxpYyBUZXN0VGFibGVUcmVlKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBmRXhwYW5kQWxsQWN0aW9uID0gbmV3IEV4cGFuZEFsbEFjdGlvbigiRXhwYW5kIEFsbCIsIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgVGFibGVUcmVlVmlld2VyIHZpZXdlciA9IG5ldyBUYWJsZVRyZWVWaWV3ZXIocGFyZW50KTsKLSAgICAgICAgdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVzdE1vZGVsQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICB2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGVzdFRhYmxlVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIHZpZXdlci5nZXRUYWJsZVRyZWUoKS5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgICAgdmlld2VyLmdldFRhYmxlVHJlZSgpLmdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHZpZXdlci5nZXRUYWJsZVRyZWUoKS5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBoZWFkZXJzW10gPSB7ICJGaXJzdCBDb2x1bW4iLCAiU2Vjb25kIENvbHVtbiIgfTsKLQotICAgICAgICBDb2x1bW5MYXlvdXREYXRhIGxheW91dHNbXSA9IHsgbmV3IENvbHVtbldlaWdodERhdGEoMTAwKSwKLSAgICAgICAgICAgICAgICBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDApIH07Ci0KLSAgICAgICAgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uc1tdID0gbmV3IFRhYmxlQ29sdW1uW2hlYWRlcnMubGVuZ3RoXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKGxheW91dHNbaV0pOwotICAgICAgICAgICAgVGFibGVDb2x1bW4gdGMgPSBuZXcgVGFibGVDb2x1bW4odmlld2VyLmdldFRhYmxlVHJlZSgpLmdldFRhYmxlKCksCi0gICAgICAgICAgICAgICAgICAgIFNXVC5OT05FLCBpKTsKLSAgICAgICAgICAgIHRjLnNldFJlc2l6YWJsZShsYXlvdXRzW2ldLnJlc2l6YWJsZSk7Ci0gICAgICAgICAgICB0Yy5zZXRUZXh0KGhlYWRlcnNbaV0pOwotICAgICAgICAgICAgY29sdW1uc1tpXSA9IHRjOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmVmlld2VyID09IG51bGwpCi0gICAgICAgICAgICBmVmlld2VyID0gdmlld2VyOwotCi0gICAgICAgIHJldHVybiB2aWV3ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0QnJvd3NlciBicm93c2VyID0gbmV3IFRlc3RUYWJsZVRyZWUoKTsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCAmJiBhcmdzWzBdLmVxdWFscygiLXR3b3BhbmVzIikpCi0gICAgICAgICAgICBicm93c2VyLnNob3cyUGFuZXMoKTsKLSAgICAgICAgYnJvd3Nlci5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgICAgYnJvd3Nlci5vcGVuKFRlc3RFbGVtZW50LmNyZWF0ZU1vZGVsKDMsIDEwKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZXhwYW5kIGFsbCBhY3Rpb24gdG8gdGhlIHRlc3RzIG1lbnUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmlld2VyRmlsbE1lbnVCYXIoTWVudU1hbmFnZXIgbWdyKSB7Ci0gICAgICAgIE1lbnVNYW5hZ2VyIHRlc3RNZW51ID0gKE1lbnVNYW5hZ2VyKSAobWdyLmZpbmRNZW51VXNpbmdQYXRoKCJ0ZXN0cyIpKTsKLSAgICAgICAgdGVzdE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIHRlc3RNZW51LmFkZChmRXhwYW5kQWxsQWN0aW9uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdFRhYmxlVHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0VGFibGVUcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWRhZDIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0VGFibGVUcmVlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0VGFibGVUcmVlTGFiZWxQcm92aWRlciBleHRlbmRzIFRlc3RMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMKLSAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFiZWwgaW1hZ2UgZm9yIGEgZ2l2ZW4gY29sdW1uLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVudGlyZSByb3cuIENhbiBiZSAKLSAgICAgKiAgICAgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyB0aGF0IG5vIGlucHV0IG9iamVjdCBpcyBzZXQgaW4gdGhlIHZpZXdlci4KLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gd2hpY2ggdGhlIGxhYmVsIGFwcGVhcnMuIE51bWJlcmluZyBpcyB6ZXJvIGJhc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHJldHVybiBnZXRJbWFnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIGEgZ2l2ZW4gY29sdW1uLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVudGlyZSByb3cuIENhbiBiZSAKLSAgICAgKiAgICAgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyB0aGF0IG5vIGlucHV0IG9iamVjdCBpcyBzZXQgaW4gdGhlIHZpZXdlci4KLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gd2hpY2ggdGhlIGxhYmVsIGFwcGVhcnMuIE51bWJlcmluZyBpcyB6ZXJvIGJhc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZWxlbWVudC50b1N0cmluZygpICsgIiBjb2x1bW4gIiArIGNvbHVtbkluZGV4OwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdFRyZWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0VHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmRkNTFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0VHJlZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5UZXN0TW9kZWxDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIFRlc3RUcmVlIGV4dGVuZHMgVGVzdEJyb3dzZXIgewotICAgIFRyZWVWaWV3ZXIgZlZpZXdlcjsKLQotICAgIEFjdGlvbiBmRXhwYW5kQWxsQWN0aW9uOwotCi0gICAgcHVibGljIFRlc3RUcmVlKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBmRXhwYW5kQWxsQWN0aW9uID0gbmV3IEV4cGFuZEFsbEFjdGlvbigiRXhwYW5kIEFsbCIsIHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgVHJlZVZpZXdlciB2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQpOwotICAgICAgICB2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZXN0TW9kZWxDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCi0gICAgICAgIGlmIChmVmlld2VyID09IG51bGwpCi0gICAgICAgICAgICBmVmlld2VyID0gdmlld2VyOwotICAgICAgICByZXR1cm4gdmlld2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdEJyb3dzZXIgYnJvd3NlciA9IG5ldyBUZXN0VHJlZSgpOwotICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbMF0uZXF1YWxzKCItdHdvcGFuZXMiKSkKLSAgICAgICAgICAgIGJyb3dzZXIuc2hvdzJQYW5lcygpOwotICAgICAgICBicm93c2VyLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgICBicm93c2VyLm9wZW4oVGVzdEVsZW1lbnQuY3JlYXRlTW9kZWwoMywgMTApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJlZUZpbGxNZW51QmFyKE1lbnVNYW5hZ2VyIHRlc3RNZW51KSB7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBleHBhbmQgYWxsIGFjdGlvbiB0byB0aGUgdGVzdHMgbWVudS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2aWV3ZXJGaWxsTWVudUJhcihNZW51TWFuYWdlciBtZ3IpIHsKLSAgICAgICAgTWVudU1hbmFnZXIgdGVzdE1lbnUgPSAoTWVudU1hbmFnZXIpIChtZ3IuZmluZE1lbnVVc2luZ1BhdGgoInRlc3RzIikpOwotICAgICAgICB0ZXN0TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgdGVzdE1lbnUuYWRkKGZFeHBhbmRBbGxBY3Rpb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0VmlydHVhbFRyZWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9UZXN0VmlydHVhbFRyZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhZWYyNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIEpGYWNlIFRlc3RzL29yZy9lY2xpcHNlL2pmYWNlL3Rlc3RzL3ZpZXdlcnMvaW50ZXJhY3RpdmUvVGVzdFZpcnR1YWxUcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLlRlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuVGVzdE1vZGVsQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotCi1wdWJsaWMgY2xhc3MgVGVzdFZpcnR1YWxUcmVlIGV4dGVuZHMgVGVzdFRyZWUgewotCi0JcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5WSVJUVUFMKTsKLQkJdHJlZS5hZGRMaXN0ZW5lcihTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHJpdmF0ZSBTdHJpbmcgZ2V0UG9zaXRpb24oVHJlZUl0ZW0gaXRlbSkgewotCQkJCVRyZWVJdGVtIHBhcmVudEl0ZW0gPSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCQlpZiAocGFyZW50SXRlbSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAiIiArIGl0ZW0uZ2V0UGFyZW50KCkuaW5kZXhPZihpdGVtKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGdldFBvc2l0aW9uKHBhcmVudEl0ZW0pICsgIi4iICsgcGFyZW50SXRlbS5pbmRleE9mKGl0ZW0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVN0cmluZyBwb3NpdGlvbiA9IGdldFBvc2l0aW9uKChUcmVlSXRlbSkgZXZlbnQuaXRlbSk7Ci0JCQkJaWYgKHBvc2l0aW9uLmVuZHNXaXRoKCIuMzIiKSkKLQkJCQkJVGhyZWFkLmR1bXBTdGFjaygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidXBkYXRpbmcgIiArIHBvc2l0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCVRyZWVWaWV3ZXIgdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlc3RNb2RlbENvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0KLQkJaWYgKGZWaWV3ZXIgPT0gbnVsbCkKLQkJCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFyZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RCcm93c2VyIGJyb3dzZXIgPSBuZXcgVGVzdFZpcnR1YWxUcmVlKCk7Ci0JCWlmIChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXS5lcXVhbHMoIi10d29wYW5lcyIpKQotCQkJYnJvd3Nlci5zaG93MlBhbmVzKCk7Ci0JCWJyb3dzZXIuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWJyb3dzZXIub3BlbihUZXN0RWxlbWVudC5jcmVhdGVNb2RlbCgzLCAxMCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1ZpcnR1YWxUYWJsZVZpZXcuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9WaXJ0dWFsVGFibGVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNTgwMGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1ZpcnR1YWxUYWJsZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogVGhlIGlzIGEgdGVzdCBWaXJ0dWFsVGFibGVWaWV3IG9mIHRoZSBzdXBwb3J0IGZvciBTV1QuVklSVFVBTCBpbiBKRmFjZS4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFRhYmxlVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQotCVRhYmxlVmlld2VyIHZpZXdlcjsKLQotCWludCBpdGVtQ291bnQgPSAxMDAwMDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICovCi0JcHVibGljIFZpcnR1YWxUYWJsZVZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5WSVJUVUFMKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihnZXRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRJbnB1dCh0aGlzKTsKLQkJdmlld2VyLnNldEl0ZW1Db3VudChpdGVtQ291bnQpOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LFNXVC5OT05FKTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlCdXR0b24gcmVzZXRJbnB1dCA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLFNXVC5QVVNIKTsKLQkJcmVzZXRJbnB1dC5zZXRUZXh0KCJSZXNldCBpbnB1dCIpOwotCQlyZXNldElucHV0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpewotCQkJCXJlc2V0SW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gZGVsZXRlID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJZGVsZXRlLnNldFRleHQoIkRlbGV0ZSBzZWxlY3Rpb24iKTsKLQkJZGVsZXRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCQkJCXZpZXdlci5yZW1vdmUoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyLmdldFNlbGVjdGlvbigpKS50b0FycmF5KCkpOwotCQkJfQotCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRQcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vIE5vdGhpbmcgdG8gZG8gaGVyZS4KLQotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlTdHJpbmdbXSBlbGVtZW50cyA9IG5ldyBTdHJpbmdbaXRlbUNvdW50XTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7Ci0JCQkJCWVsZW1lbnRzW2ldID0gIkVsZW1lbnQgIiArIFN0cmluZy52YWx1ZU9mKGkpOwotCQkJCX0KLQkJCQlyZXR1cm4gZWxlbWVudHM7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwKLQkJCQkJT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJLy8gTm90aGluZyB0byBkbyBoZXJlLgotCi0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXZpZXdlci5nZXRUYWJsZSgpLnNldEZvY3VzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXNldCB0aGUgaW5wdXQgb2YgdGhlIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRJbnB1dCgpIHsKLQkJdmlld2VyLnNldElucHV0KHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1dvcmxkQ2hhbmdlZEFjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBKRmFjZSBUZXN0cy9vcmcvZWNsaXBzZS9qZmFjZS90ZXN0cy92aWV3ZXJzL2ludGVyYWN0aXZlL1dvcmxkQ2hhbmdlZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRkMzIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgSkZhY2UgVGVzdHMvb3JnL2VjbGlwc2UvamZhY2UvdGVzdHMvdmlld2Vycy9pbnRlcmFjdGl2ZS9Xb3JsZENoYW5nZWRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy52aWV3ZXJzLmludGVyYWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgV29ybGRDaGFuZ2VkQWN0aW9uIGV4dGVuZHMgVGVzdEJyb3dzZXJBY3Rpb24gewotCi0gICAgcHVibGljIFdvcmxkQ2hhbmdlZEFjdGlvbihTdHJpbmcgbGFiZWwsIFRlc3RCcm93c2VyIGJyb3dzZXIpIHsKLSAgICAgICAgc3VwZXIobGFiZWwsIGJyb3dzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgKChTdHJ1Y3R1cmVkVmlld2VyKSBnZXRCcm93c2VyKCkuZ2V0Vmlld2VyKCkpLnJlZnJlc2goKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFBhcnQgUmVmZXJlbmNlcyBUZXN0L29yZy9lY2xpcHNlL3VpL3BhcnRzL3Rlc3RzL0VkaXRvcnNSZWZlcmVuY2VzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBQYXJ0IFJlZmVyZW5jZXMgVGVzdC9vcmcvZWNsaXBzZS91aS9wYXJ0cy90ZXN0cy9FZGl0b3JzUmVmZXJlbmNlc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJmYTdmNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFBhcnQgUmVmZXJlbmNlcyBUZXN0L29yZy9lY2xpcHNlL3VpL3BhcnRzL3Rlc3RzL0VkaXRvcnNSZWZlcmVuY2VzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkucGFydHMudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0cy50ZXN0cy51dGlsLlBhcnRzVGVzdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydHMudGVzdHMudXRpbC5QYXJ0c1dvcmtiZW5jaEFkdmlzb3I7Ci0KLS8qKgotICogVGVzdCBjYXNlIHRvIGVuc3VyZSB0aGF0IGVkaXRvciByZWZlcmVuY2VzIGFyZSBjcmVhdGVkIHdoZW4gbmVlZGVkZWQuIEFsc28KLSAqIGVuc3VyZXMgdGhhdCB6b29taW5nIGJlaGF2ZXMgY29ycmVjdGx5IG9uIHN0YXJ0IHVwIChCdWcgNjQwNDMpLgotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yc1JlZmVyZW5jZXNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBEaXNwbGF5IGRpc3BsYXk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSB0ZXN0J3MgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWRpdG9yc1JlZmVyZW5jZXNUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZGlzcGxheS5kaXNwb3NlKCk7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IG9ubHkgZmlsZTAncyBwYXJ0IGhhcyBiZWVuIGNyZWF0ZWQgKGlkZWFsbHkpLgotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZlUGFydEZpbGUwKCkgewotICAgICAgICBvcGVuRWRpdG9ycygwKTsKLSAgICAgICAgY2hlY2tFZGl0b3JzUGFydHMoMCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgb25seSBmaWxlMSdzIHBhcnQgaGFzIGJlZW4gY3JlYXRlZCAoaWRlYWxseSkuCi0gICAgICogIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBY3RpdmVQYXJ0RmlsZTEoKSB7Ci0gICAgICAgIG9wZW5FZGl0b3JzKDEpOwotICAgICAgICBjaGVja0VkaXRvcnNQYXJ0cygxKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCBvbmx5IGZpbGUyJ3MgcGFydCBoYXMgYmVlbiBjcmVhdGVkIChpZGVhbGx5KS4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFjdGl2ZVBhcnRGaWxlMigpIHsKLSAgICAgICAgb3BlbkVkaXRvcnMoMik7Ci0gICAgICAgIGNoZWNrRWRpdG9yc1BhcnRzKDIpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHpvb21pbmcgZmlsZTAgb24gc3RhcnQgdXAgYW5kIG5hdmlnYXRpbmcgdG8gb3RoZXIgZWRpdG9ycwotICAgICAqIGJlaGF2ZXMgY29ycmVjbHkuCi0gICAgICogIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3Rab29tQWN0aXZlUGFydEZpbGUwKCkgewotICAgICAgICBvcGVuRWRpdG9ycygwKTsKLSAgICAgICAgem9vbUVkaXRvcigwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgem9vbWluZyBmaWxlMSBvbiBzdGFydCB1cCBhbmQgbmF2aWdhdGluZyB0byBvdGhlciBlZGl0b3JzCi0gICAgICogYmVoYXZlcyBjb3JyZWNseS4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFpvb21BY3RpdmVQYXJ0RmlsZTEoKSB7Ci0gICAgICAgIG9wZW5FZGl0b3JzKDEpOwotICAgICAgICB6b29tRWRpdG9yKDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCB6b29taW5nIGZpbGUyIG9uIHN0YXJ0IHVwIGFuZCBuYXZpZ2F0aW5nIHRvIG90aGVyIGVkaXRvcnMKLSAgICAgKiBiZWhhdmVzIGNvcnJlY2x5LgotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Wm9vbUFjdGl2ZVBhcnRGaWxlMigpIHsKLSAgICAgICAgb3BlbkVkaXRvcnMoMik7Ci0gICAgICAgIHpvb21FZGl0b3IoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbiBhbGwgdGhlIGVkaXRvcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxhc3RGaWxlVG9PcGVuCi0gICAgICogICAgICAgICAgICBUaGUgaW5kZXggb2YgdGhlIGxhc3QgZmlsZSB0byBiZSBvcGVuZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3JzKGZpbmFsIGludCBsYXN0RmlsZVRvT3BlbikgewotICAgICAgICBQYXJ0c1dvcmtiZW5jaEFkdmlzb3Igd2EgPSBuZXcgUGFydHNXb3JrYmVuY2hBZHZpc29yKCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBQYXJ0c1Rlc3RVdGlsLm51bU9mUGFydHM7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IGxhc3RGaWxlVG9PcGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgUGFydHNUZXN0VXRpbC5vcGVuRWRpdG9yKFBhcnRzVGVzdFV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpbGVOYW1lKGluZGV4KSwgcGFnZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFBhcnRzVGVzdFV0aWwub3BlbkVkaXRvcihQYXJ0c1Rlc3RVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsZU5hbWUobGFzdEZpbGVUb09wZW4pLCBwYWdlKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCkubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgUGFydHNUZXN0VXRpbC5udW1PZlBhcnRzKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFnZS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRUaXRsZSgpLCBQYXJ0c1Rlc3RVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsZU5hbWUobGFzdEZpbGVUb09wZW4pKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGF0IHRoZSBhY3RpdmUgZWRpdG9yJ3MgcGFydCBoYXMgYmVlbiBjcmVhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsYXN0RmlsZU9wZW5lZAotICAgICAqICAgICAgICAgICAgVGhlIGFjdGl2ZSBmaWxlJ3MgaW5kZXguCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRWRpdG9yc1BhcnRzKGZpbmFsIGludCBsYXN0RmlsZU9wZW5lZCkgewotCi0gICAgICAgIFBhcnRzV29ya2JlbmNoQWR2aXNvciB3YSA9IG5ldyBQYXJ0c1dvcmtiZW5jaEFkdmlzb3IoKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZShJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFjdGl2ZUZpbGVOYW1lID0gUGFydHNUZXN0VXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpbGVOYW1lKGxhc3RGaWxlT3BlbmVkKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCkubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgUGFydHNUZXN0VXRpbC5udW1PZlBhcnRzKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHBhZ2UuZ2V0QWN0aXZlUGFydCgpIGluc3RhbmNlb2YgSUVkaXRvclBhcnQpOwotICAgICAgICAgICAgICAgIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvclBhcnQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhhY3RpdmVFZGl0b3JQYXJ0LmdldFRpdGxlKCksIGFjdGl2ZUZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHBhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgICAgICAgaW50IG51bUFjdGl2ZVBhcnRzID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRvclJlZmVyZW5jZXNbaW5kZXhdLmdldEVkaXRvcihmYWxzZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUFjdGl2ZVBhcnRzKys7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9UT0RPOiBJZGVhbGx5LCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBwYXJ0cyB3b3VsZCBiZSAxCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShudW1BY3RpdmVQYXJ0cyA8PSAyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBab29tIHRoZSBhY3RpdmUgZWRpdG9yIGFuZCBuYXZpZ2F0ZSB0byB0aGUgb3RoZXIgb3BlbiBlZGl0b3JzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlZGl0b3JJbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGFjdGl2ZSBlZGl0b3IncyBpbmRleC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB6b29tRWRpdG9yKGZpbmFsIGludCBlZGl0b3JJbmRleCkgewotICAgICAgICBQYXJ0c1dvcmtiZW5jaEFkdmlzb3Igd2EgPSBuZXcgUGFydHNXb3JrYmVuY2hBZHZpc29yKCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIGFjdGl2ZVBhcnRSZWZlcmVuY2UgPSBwYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlUGFydFJlZmVyZW5jZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhY3RpdmVQYXJ0UmVmZXJlbmNlVGl0bGUgPSBhY3RpdmVQYXJ0UmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGl0bGUoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFjdGl2ZVBhcnRSZWZlcmVuY2UgaW5zdGFuY2VvZiBJRWRpdG9yUmVmZXJlbmNlKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aXZlUGFydFJlZmVyZW5jZVRpdGxlLCBQYXJ0c1Rlc3RVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsZU5hbWUoZWRpdG9ySW5kZXgpKTsKLQotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCk7Ci0KLSAgICAgICAgICAgICAgICBQYXJ0c1Rlc3RVdGlsLnpvb20oYWN0aXZlUGFydCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShQYXJ0c1Rlc3RVdGlsLmlzWm9vbWVkKGFjdGl2ZVBhcnQpKTsKLQotICAgICAgICAgICAgICAgIElFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gcGFnZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudEVkaXRvclRpdGxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudEVkaXRvclRpdGxlID0gZWRpdG9yUmVmZXJlbmNlc1tpbmRleF0uZ2V0VGl0bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50RWRpdG9yVGl0bGUuZXF1YWxzKGFjdGl2ZVBhcnRSZWZlcmVuY2VUaXRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRzVGVzdFV0aWwub3BlbkVkaXRvcihjdXJyZW50RWRpdG9yVGl0bGUsIHBhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlUGFydFJlZmVyZW5jZVRpdGxlID0gY3VycmVudEVkaXRvclRpdGxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYWN0aXZlUGFydCA9IHBhZ2UuZ2V0QWN0aXZlUGFydCgpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWN0aXZlUGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KTsKLQotICAgICAgICAgICAgICAgIGlmIChQYXJ0c1Rlc3RVdGlsLmlzWm9vbWVkKGFjdGl2ZVBhcnQpKQotICAgICAgICAgICAgICAgICAgICBQYXJ0c1Rlc3RVdGlsLnpvb20oYWN0aXZlUGFydCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwgd2EpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBQYXJ0IFJlZmVyZW5jZXMgVGVzdC9vcmcvZWNsaXBzZS91aS9wYXJ0cy90ZXN0cy9QYXJ0c1JlZmVyZW5jZXNUZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgUGFydCBSZWZlcmVuY2VzIFRlc3Qvb3JnL2VjbGlwc2UvdWkvcGFydHMvdGVzdHMvUGFydHNSZWZlcmVuY2VzVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjQzNTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBQYXJ0IFJlZmVyZW5jZXMgVGVzdC9vcmcvZWNsaXBzZS91aS9wYXJ0cy90ZXN0cy9QYXJ0c1JlZmVyZW5jZXNUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkucGFydHMudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydHMudGVzdHMudXRpbC5QYXJ0c1Rlc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5GaWxlVXRpbDsKLQotLyoqCi0gKiBUZXN0IHN1aXRlIHRvIGNoZWNrIHRoZSBiZWhhdmlvciBvZiBwYXJ0cyAoZWRpdG9ycyBhbmQgdmlld3MpIGNyZWF0aW9uIG9uCi0gKiBzdGFydCB1cC4gU3VpdGUgd3JpdHRlbiBmb3IgQnVnIDY2MDY1LgotICovCi1wdWJsaWMgY2xhc3MgUGFydHNSZWZlcmVuY2VzVGVzdFN1aXRlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRlc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCi0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVmlld3NSZWZlcmVuY2VzVGVzdC5jbGFzcykpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoRWRpdG9yc1JlZmVyZW5jZXNUZXN0LmNsYXNzKSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyYXBwZXIgdG8gc2V0IHVwIHRoZSB0ZXN0cy4gRW5zdXJlcyB0aGUgY3JlYXRpb24gb2YgZmlsZXMgb24gc2V0IHVwCi0gICAgICAgICAqIGFuZCB0aGUgZGVsZXRpb24gb24gdGVhciBkb3duLgotICAgICAgICAgKi8KLSAgICAgICAgVGVzdFNldHVwIHdyYXBwZXIgPSBuZXcgVGVzdFNldHVwKHN1aXRlKSB7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXAjc2V0VXAoKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCB0ZXN0UHJvamVjdCA9IEZpbGVVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVByb2plY3QoUGFydHNUZXN0VXRpbC5wcm9qZWN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IFBhcnRzVGVzdFV0aWwubnVtT2ZQYXJ0czsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWwuY3JlYXRlRmlsZShQYXJ0c1Rlc3RVdGlsLmdldEZpbGVOYW1lKGluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBAc2VlIGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwI3RlYXJEb3duKCkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWwuZGVsZXRlUHJvamVjdChQYXJ0c1Rlc3RVdGlsLmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICByZXR1cm4gd3JhcHBlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFBhcnQgUmVmZXJlbmNlcyBUZXN0L29yZy9lY2xpcHNlL3VpL3BhcnRzL3Rlc3RzL1ZpZXdzUmVmZXJlbmNlc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgUGFydCBSZWZlcmVuY2VzIFRlc3Qvb3JnL2VjbGlwc2UvdWkvcGFydHMvdGVzdHMvVmlld3NSZWZlcmVuY2VzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGI5NjU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgUGFydCBSZWZlcmVuY2VzIFRlc3Qvb3JnL2VjbGlwc2UvdWkvcGFydHMvdGVzdHMvVmlld3NSZWZlcmVuY2VzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkucGFydHMudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnRzLnRlc3RzLnV0aWwuUGFydHNUZXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0cy50ZXN0cy51dGlsLlBhcnRzV29ya2JlbmNoQWR2aXNvcjsKLQotLyoqCi0gKiBUZXN0IGNhc2UgdG8gZW5zdXJlIHRoYXQgdmlldyByZWZlcmVuY2VzIGFyZSBjcmVhdGVkIHdoZW4gbmVlZGVkZWQuIEFsc28KLSAqIGVuc3VyZXMgdGhhdCB6b29taW5nIGJlaGF2ZXMgY29ycmVjdGx5IG9uIHN0YXJ0IHVwIChCdWcgNjQwNDMpLgotICovCi1wdWJsaWMgY2xhc3MgVmlld3NSZWZlcmVuY2VzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgRGlzcGxheSBkaXNwbGF5OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlc3ROYW1lCi0gICAgICogICAgICAgICAgICBUaGUgdGVzdCdzIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFZpZXdzUmVmZXJlbmNlc1Rlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgZGlzcGxheSA9IFBsYXRmb3JtVUkuY3JlYXRlRGlzcGxheSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgb25seSB2aWV3MCdzIHBhcnQgaGFzIGJlZW4gY3JlYXRlZCAoaWRlYWxseSkuCi0gICAgICogIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBY3RpdmVQYXJ0VmlldzAoKSB7Ci0gICAgICAgIG9wZW5WaWV3cygwKTsKLSAgICAgICAgY2hlY2tWaWV3c1BhcnRzKDApOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IG9ubHkgdmlldzEncyBwYXJ0IGhhcyBiZWVuIGNyZWF0ZWQgKGlkZWFsbHkpLgotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZlUGFydFZpZXcxKCkgewotICAgICAgICBvcGVuVmlld3MoMSk7Ci0gICAgICAgIGNoZWNrVmlld3NQYXJ0cygxKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCBvbmx5IHZpZXcyJ3MgcGFydCBoYXMgYmVlbiBjcmVhdGVkIChpZGVhbGx5KS4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFjdGl2ZVBhcnRWaWV3MigpIHsKLSAgICAgICAgb3BlblZpZXdzKDIpOwotICAgICAgICBjaGVja1ZpZXdzUGFydHMoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHpvb21pbmcgdmlldzAgb24gc3RhcnQgdXAgYW5kIG5hdmlnYXRpbmcgdG8gb3RoZXIgdmlld3MgYmVoYXZlcwotICAgICAqIGNvcnJlY2x5LgotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Wm9vbUFjdGl2ZVBhcnRWaWV3MCgpIHsKLSAgICAgICAgb3BlblZpZXdzKDApOwotICAgICAgICB6b29tVmlldygwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgem9vbWluZyB2aWV3MSBvbiBzdGFydCB1cCBhbmQgbmF2aWdhdGluZyB0byBvdGhlciB2aWV3cyBiZWhhdmVzCi0gICAgICogY29ycmVjbHkuCi0gICAgICogIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3Rab29tQWN0aXZlUGFydFZpZXcxKCkgewotICAgICAgICBvcGVuVmlld3MoMSk7Ci0gICAgICAgIHpvb21WaWV3KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCB6b29taW5nIHZpZXcyIG9uIHN0YXJ0IHVwIGFuZCBuYXZpZ2F0aW5nIHRvIG90aGVyIHZpZXdzIGJlaGF2ZXMKLSAgICAgKiBjb3JyZWNseS4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFpvb21BY3RpdmVQYXJ0VmlldzIoKSB7Ci0gICAgICAgIG9wZW5WaWV3cygyKTsKLSAgICAgICAgem9vbVZpZXcoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbiBhbGwgdGhlIHZpZXdzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsYXN0Vmlld1RvT3BlbgotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBsYXN0IHZpZXcgdG8gYmUgb3BlbmVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvcGVuVmlld3MoZmluYWwgaW50IGxhc3RWaWV3VG9PcGVuKSB7Ci0gICAgICAgIFBhcnRzV29ya2JlbmNoQWR2aXNvciB3YSA9IG5ldyBQYXJ0c1dvcmtiZW5jaEFkdmlzb3IoKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZShJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IFBhcnRzVGVzdFV0aWwubnVtT2ZQYXJ0czsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IGxhc3RWaWV3VG9PcGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Uuc2hvd1ZpZXcoUGFydHNUZXN0VXRpbC5nZXRWaWV3KGluZGV4KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwYWdlLnNob3dWaWV3KFBhcnRzVGVzdFV0aWwuZ2V0VmlldyhsYXN0Vmlld1RvT3BlbikpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYWdlLmdldFZpZXdSZWZlcmVuY2VzKCkubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgUGFydHNUZXN0VXRpbC5udW1PZlBhcnRzKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHBhZ2UuZ2V0QWN0aXZlUGFydCgpIGluc3RhbmNlb2YgSVZpZXdQYXJ0KTsKLSAgICAgICAgICAgICAgICBJVmlld1BhcnQgYWN0aXZlUGFydCA9IChJVmlld1BhcnQpIHBhZ2UuZ2V0QWN0aXZlUGFydCgpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhhY3RpdmVQYXJ0LmdldFZpZXdTaXRlKCkuZ2V0SWQoKSwgUGFydHNUZXN0VXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZpZXcobGFzdFZpZXdUb09wZW4pKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGF0IHRoZSBhY3RpdmUgdmlldydzIHBhcnQgaGFzIGJlZW4gY3JlYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGFzdFZpZXdPcGVuZWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgZmlsZSdzIGluZGV4LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja1ZpZXdzUGFydHMoZmluYWwgaW50IGxhc3RWaWV3T3BlbmVkKSB7Ci0KLSAgICAgICAgUGFydHNXb3JrYmVuY2hBZHZpc29yIHdhID0gbmV3IFBhcnRzV29ya2JlbmNoQWR2aXNvcigpIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aXZlVmlld0lkID0gUGFydHNUZXN0VXRpbC5nZXRWaWV3KGxhc3RWaWV3T3BlbmVkKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFnZS5nZXRWaWV3UmVmZXJlbmNlcygpLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRzVGVzdFV0aWwubnVtT2ZQYXJ0cyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwYWdlLmdldEFjdGl2ZVBhcnQoKSBpbnN0YW5jZW9mIElWaWV3UGFydCk7Ci0KLSAgICAgICAgICAgICAgICBJVmlld1BhcnQgYWN0aXZlVmlld1BhcnQgPSAoSVZpZXdQYXJ0KSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aXZlVmlld1BhcnQuZ2V0Vmlld1NpdGUoKS5nZXRJZCgpLCBhY3RpdmVWaWV3SWQpOwotCi0gICAgICAgICAgICAgICAgSVZpZXdSZWZlcmVuY2VbXSB2aWV3UmVmZXJlbmNlcyA9IHBhZ2UuZ2V0Vmlld1JlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgICAgICBpbnQgbnVtQWN0aXZlUGFydHMgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCB2aWV3UmVmZXJlbmNlcy5sZW5ndGg7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdSZWZlcmVuY2VzW2luZGV4XS5nZXRWaWV3KGZhbHNlKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgbnVtQWN0aXZlUGFydHMrKzsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBJZGVhbGx5LCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBwYXJ0cyB3b3VsZCBiZSAxCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShudW1BY3RpdmVQYXJ0cyA8PSAyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogWm9vbSB0aGUgYWN0aXZlIHZpZXcgYW5kIG5hdmlnYXRlIHRvIHRoZSBvdGhlciBvcGVuIHZpZXdzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2aWV3SW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgdmlldydzIGluZGV4LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHpvb21WaWV3KGZpbmFsIGludCB2aWV3SW5kZXgpIHsKLSAgICAgICAgUGFydHNXb3JrYmVuY2hBZHZpc29yIHdhID0gbmV3IFBhcnRzV29ya2JlbmNoQWR2aXNvcigpIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBhY3RpdmVQYXJ0UmVmZXJlbmNlID0gcGFnZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFjdGl2ZVBhcnRSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aXZlUGFydFJlZmVyZW5jZUlkID0gYWN0aXZlUGFydFJlZmVyZW5jZS5nZXRJZCgpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWN0aXZlUGFydFJlZmVyZW5jZSBpbnN0YW5jZW9mIElWaWV3UmVmZXJlbmNlKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aXZlUGFydFJlZmVyZW5jZUlkLCBQYXJ0c1Rlc3RVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Vmlldyh2aWV3SW5kZXgpKTsKLQotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBJVmlld1BhcnQpOwotCi0gICAgICAgICAgICAgICAgUGFydHNUZXN0VXRpbC56b29tKGFjdGl2ZVBhcnQpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoUGFydHNUZXN0VXRpbC5pc1pvb21lZChhY3RpdmVQYXJ0KSk7Ci0KLSAgICAgICAgICAgICAgICBJVmlld1JlZmVyZW5jZVtdIHZpZXdSZWZlcmVuY2VzID0gcGFnZS5nZXRWaWV3UmVmZXJlbmNlcygpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50Vmlld0lkID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCB2aWV3UmVmZXJlbmNlcy5sZW5ndGg7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFZpZXdJZCA9IHZpZXdSZWZlcmVuY2VzW2luZGV4XS5nZXRJZCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRWaWV3SWQuZXF1YWxzKGFjdGl2ZVBhcnRSZWZlcmVuY2VJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5zaG93VmlldyhjdXJyZW50Vmlld0lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlUGFydFJlZmVyZW5jZUlkID0gY3VycmVudFZpZXdJZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBJVmlld1BhcnQpOwotCi0gICAgICAgICAgICAgICAgaWYgKFBhcnRzVGVzdFV0aWwuaXNab29tZWQoYWN0aXZlUGFydCkpCi0gICAgICAgICAgICAgICAgICAgIFBhcnRzVGVzdFV0aWwuem9vbShhY3RpdmVQYXJ0KTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBQbGF0Zm9ybVVJLmNyZWF0ZUFuZFJ1bldvcmtiZW5jaChkaXNwbGF5LCB3YSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBQYXJ0IFJlZmVyZW5jZXMgVGVzdC9vcmcvZWNsaXBzZS91aS9wYXJ0cy90ZXN0cy91dGlsL1BhcnRzVGVzdFV0aWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgUGFydCBSZWZlcmVuY2VzIFRlc3Qvb3JnL2VjbGlwc2UvdWkvcGFydHMvdGVzdHMvdXRpbC9QYXJ0c1Rlc3RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOWU2ZTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBQYXJ0IFJlZmVyZW5jZXMgVGVzdC9vcmcvZWNsaXBzZS91aS9wYXJ0cy90ZXN0cy91dGlsL1BhcnRzVGVzdFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnBhcnRzLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5Xb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5QYXJ0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5QYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHRoZSBwYXJ0cyB0ZXN0IHN1aXRlLgotICovCi1wdWJsaWMgY2xhc3MgUGFydHNUZXN0VXRpbCB7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBwcm9qZWN0TmFtZSA9ICJUZXN0UHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBmaWxlRXh0ZW5zaW9uID0gIi50eHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgcHJlRmlsZU5hbWUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWaWV3MCA9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5SZXNvdXJjZU5hdmlnYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWaWV3MSA9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWaWV3MiA9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbnVtT2ZQYXJ0cyA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHdvcmtzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB3b3Jrc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotICAgICAgICByZXR1cm4gKFdvcmtzcGFjZSkgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmlsZSBuYW1lIGZvciB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgZmlsZSBpbmRleC4KLSAgICAgKiBAcmV0dXJuIHRoZSBmaWxlJ3MgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocHJlRmlsZU5hbWUgKyBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSArIGZpbGVFeHRlbnNpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgSVdvcmtzcGFjZSB3cyA9IGdldFdvcmtzcGFjZSgpOwotICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gd3MuZ2V0Um9vdCgpOwotICAgICAgICByZXR1cm4gcm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVuIGFuIGVkaXRvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBmaWxlJ3MgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVkaXRvcihTdHJpbmcgZmlsZW5hbWUsIElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElERS5vcGVuRWRpdG9yKHBhZ2UsIFBhcnRzVGVzdFV0aWwuZ2V0UHJvamVjdCgpLmdldEZpbGUoZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UudWkuRGVmYXVsdFRleHRFZGl0b3IiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY29ycmVzcG9uZGluZyB2aWV3IGlkIGZvciB0aGUgaW5kZXguCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgdmlldyBpbmRleC4KLSAgICAgKiBAcmV0dXJuIHRoZSB2aWV3J3MgaWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmlldyhpbnQgaW5kZXgpIHsKLSAgICAgICAgc3dpdGNoIChpbmRleCkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gVmlldzA7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJldHVybiBWaWV3MTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBWaWV3MjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFpvb20gdGhlIGdpdmVuIHBhcnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcnQKLSAgICAgKiAgICAgICAgICAgIFRoZSBwYXJ0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB6b29tKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgKChXb3JrYmVuY2hQYWdlKSBwYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCkpLnRvZ2dsZVpvb20oKChQYXJ0U2l0ZSkgcGFydC5nZXRTaXRlKCkpLmdldFBhbmUoKQotICAgICAgICAgICAgICAgIC5nZXRQYXJ0UmVmZXJlbmNlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhlIHBhcnQgaXMgem9vbWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJ0Ci0gICAgICogICAgICAgICAgICBUaGUgcGF0LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB6b29tZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzWm9vbWVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgUGFydFNpdGUgc2l0ZSA9IChQYXJ0U2l0ZSkgcGFydC5nZXRTaXRlKCk7Ci0gICAgICAgIFBhcnRQYW5lIHBhbmUgPSBzaXRlLmdldFBhbmUoKTsKLSAgICAgICAgcmV0dXJuIHBhbmUuaXNab29tZWQoKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBQYXJ0IFJlZmVyZW5jZXMgVGVzdC9vcmcvZWNsaXBzZS91aS9wYXJ0cy90ZXN0cy91dGlsL1BhcnRzV29ya2JlbmNoQWR2aXNvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBQYXJ0IFJlZmVyZW5jZXMgVGVzdC9vcmcvZWNsaXBzZS91aS9wYXJ0cy90ZXN0cy91dGlsL1BhcnRzV29ya2JlbmNoQWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzdlODQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgUGFydCBSZWZlcmVuY2VzIFRlc3Qvb3JnL2VjbGlwc2UvdWkvcGFydHMvdGVzdHMvdXRpbC9QYXJ0c1dvcmtiZW5jaEFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkucGFydHMudGVzdHMudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaFdpbmRvd0Fkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkVtcHR5UGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlBsYXRmb3JtVXRpbDsKLQotLyoqCi0gKiBXb3JrYmVuY2ggYWR2aXNvciBmb3IgdGhlIHBhcnRzIHRlc3Qgc3VpdGUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYXJ0c1dvcmtiZW5jaEFkdmlzb3IgZXh0ZW5kcyBXb3JrYmVuY2hBZHZpc29yIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBQYXJ0c1dvcmtiZW5jaEFkdmlzb3IoKSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI2NyZWF0ZVdvcmtiZW5jaFdpbmRvd0Fkdmlzb3Iob3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIpCi0gICAgICovCi0gICAgcHVibGljIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IgY3JlYXRlV29ya2JlbmNoV2luZG93QWR2aXNvcihJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUGFydHNXb3JrYmVuY2hXaW5kb3dBZHZpc29yKHRoaXMsIGNvbmZpZ3VyZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNldmVudExvb3BJZGxlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXZlbnRMb29wSWRsZShEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAgICAgaWYoIVBsYXRmb3JtVXRpbC5vbk1hYygpKSB7Ci0gICAgICAgICAgICBzdXBlci5ldmVudExvb3BJZGxlKGRpc3BsYXkpOwotICAgICAgICB9Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjaW5pdGlhbGl6ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVdvcmtiZW5jaENvbmZpZ3VyZXIgY29uZmlndXJlcikgewotICAgICAgICAvLyBtYWtlIHN1cmUgd2UgYWx3YXlzIHNhdmUgYW5kIHJlc3RvcmUgd29ya3NwYWNlIHN0YXRlCi0gICAgICAgIGNvbmZpZ3VyZXIuc2V0U2F2ZUFuZFJlc3RvcmUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI3ByZVN0YXJ0dXAoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByZVN0YXJ0dXAoKSB7Ci0gICAgICAgIC8vIE92ZXJ3cml0ZSBwcmVmZXJlbmNlIHRvIHNldCBlbXB0eSBwZXNwZWN0aXZlIGFzIG91ciBkZWZhdWx0Ci0gICAgICAgIElQZXJzcGVjdGl2ZVJlZ2lzdHJ5IGZSZWcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLSAgICAgICAgZlJlZy5zZXREZWZhdWx0UGVyc3BlY3RpdmUoRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZCgpIHsKLSAgICAgICAgcmV0dXJuIEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBsYXlvdXQgb2YgdGhlIHBhZ2UgaW4gYSBuZXcgd2luZG93LgotICAgICAqIFRlc3RzIG92ZXJyaWRlIHRoaXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsaWRhdGUoSVdvcmtiZW5jaFBhZ2UgcGFnZSk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFBhcnQgUmVmZXJlbmNlcyBUZXN0L29yZy9lY2xpcHNlL3VpL3BhcnRzL3Rlc3RzL3V0aWwvUGFydHNXb3JrYmVuY2hXaW5kb3dBZHZpc29yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFBhcnQgUmVmZXJlbmNlcyBUZXN0L29yZy9lY2xpcHNlL3VpL3BhcnRzL3Rlc3RzL3V0aWwvUGFydHNXb3JrYmVuY2hXaW5kb3dBZHZpc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZmVkZWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBQYXJ0IFJlZmVyZW5jZXMgVGVzdC9vcmcvZWNsaXBzZS91aS9wYXJ0cy90ZXN0cy91dGlsL1BhcnRzV29ya2JlbmNoV2luZG93QWR2aXNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnBhcnRzLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaFdpbmRvd0Fkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLldvcmtiZW5jaEFjdGlvbkJ1aWxkZXI7Ci0KLS8qKgotICogV29ya2JlbmNoIHdpbmRvdyBhZHZpc29yIGZvciB0aGUgcGFydHMgdGVzdCBzdWl0ZS4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUGFydHNXb3JrYmVuY2hXaW5kb3dBZHZpc29yIGV4dGVuZHMgV29ya2JlbmNoV2luZG93QWR2aXNvciB7Ci0KLSAgICBwcml2YXRlIFBhcnRzV29ya2JlbmNoQWR2aXNvciB3YkFkdmlzb3I7Ci0gICAgCi0gICAgcHVibGljIFBhcnRzV29ya2JlbmNoV2luZG93QWR2aXNvcihQYXJ0c1dvcmtiZW5jaEFkdmlzb3IgYWR2aXNvciwgSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgewotICAgICAgICBzdXBlcihjb25maWd1cmVyKTsKLSAgICAgICAgdGhpcy53YkFkdmlzb3IgPSBhZHZpc29yOwotICAgIH0KLQotICAgIHB1YmxpYyBBY3Rpb25CYXJBZHZpc29yIGNyZWF0ZUFjdGlvbkJhckFkdmlzb3IoSUFjdGlvbkJhckNvbmZpZ3VyZXIgY29uZmlndXJlcikgewotICAgICAgICByZXR1cm4gbmV3IFdvcmtiZW5jaEFjdGlvbkJ1aWxkZXIoY29uZmlndXJlcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG9wZW5JbnRybygpIHsKLSAgICAgICAgLy8gRG8gbm90IG9wZW4gYW55IGludHJvIHBhcnQKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogV2hlbiB0aGUgd2luZG93IGhhcyBvcGVuZWQsIHZhbGlkYXRlIHRoZSBsYXlvdXQuICBUZXN0cyBvdmVycmlkZSB0aGUgdmFsaWRhdGUgbWV0aG9kIGluIHRoZSBhZHZpc29yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBvc3RXaW5kb3dPcGVuKCkgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0V2luZG93Q29uZmlndXJlcigpLmdldFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgd2JBZHZpc29yLnZhbGlkYXRlKHBhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvUGVyc3BlY3RpdmVTdGF0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9QZXJzcGVjdGl2ZVN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNWJmZTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9QZXJzcGVjdGl2ZVN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuWE1MTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5QZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgcGVyc3BlY3RpdmUgKGxheW91dCwgZXRjKS4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVTdGF0ZSB7Ci0KLSAgICBwcml2YXRlIElNZW1lbnRvIG1lbWVudG87Ci0gICAgCi0gICAgLyoqCi0gICAgICogIAotICAgICAqLwotICAgIHB1YmxpYyBQZXJzcGVjdGl2ZVN0YXRlKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLSAgICAgICAgV29ya2JlbmNoUGFnZSB3YlBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgcGFnZTsKLSAgICAgICAgUGVyc3BlY3RpdmUgcGVyc3AgPSB3YlBhZ2UuZ2V0QWN0aXZlUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgWE1MTWVtZW50byBtZW0gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgicGVyc3BlY3RpdmVTdGF0ZSIpOwotICAgICAgICBwZXJzcC5zYXZlU3RhdGUobWVtKTsKLSAgICAgICAgdGhpcy5tZW1lbnRvID0gbWVtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcnQgaWRzIGluIHRoZSBnaXZlbiBmb2xkZXIgKHNwZWNpZnkgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHRvcCBsZXZlbCkuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBmb2xkZXJJZCB0aGUgZm9sZGVyIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIHBhcnQgaWRzIGluIHRoZSBnaXZlbiBmb2xkZXIgKGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YgPGNvZGU+U3RyaW5nPC9jb2RlPikKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBhcnRJZHMoU3RyaW5nIGZvbGRlcklkKSB7Ci0gICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIElNZW1lbnRvW10gaW5mb3MgPSBtZW1lbnRvLmdldENoaWxkKCJsYXlvdXQiKS5nZXRDaGlsZCgibWFpbldpbmRvdyIpLmdldENoaWxkcmVuKCJpbmZvIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElNZW1lbnRvIGluZm8gPSBpbmZvc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBwYXJ0SWQgPSBpbmZvLmdldFN0cmluZygicGFydCIpOwotICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMoaW5mby5nZXRTdHJpbmcoImZvbGRlciIpKSkgewotICAgICAgICAgICAgICAgIGlmIChwYXJ0SWQuZXF1YWxzKGZvbGRlcklkKSkgewotCSAgICAgICAgICAgICAgICBJTWVtZW50b1tdIHBhZ2VzID0gaW5mby5nZXRDaGlsZCgiZm9sZGVyIikuZ2V0Q2hpbGRyZW4oInBhZ2UiKTsKLQkgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYWdlcy5sZW5ndGg7IGorKykgewotCSAgICAgICAgICAgICAgICAgICAgSU1lbWVudG8gcGFnZSA9IHBhZ2VzW2pdOwotCSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChwYWdlLmdldFN0cmluZygiY29udGVudCIpKTsKLQkgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChmb2xkZXJJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocGFydElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL1NlbGVjdGlvblByb3ZpZGVyVmlldy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9TZWxlY3Rpb25Qcm92aWRlclZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2YzM4MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL1NlbGVjdGlvblByb3ZpZGVyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi0vKioKLSAqICBUaGUgdmlldyBwcm92aWRlcyBhcGkgdG8gZmlyZSBhIHNlbGVjdGlvbiBldmVudCBmb3IgaXRzIHdvcmtiZW5jaCBwYWdlLiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uUHJvdmlkZXJWaWV3IGV4dGVuZHMgVmlld1BhcnQgaW1wbGVtZW50cwotICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgewotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLlNlbGVjdGlvblByb3ZpZGVyVmlldyI7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJRF8yID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLlNlbGVjdGlvblByb3ZpZGVyVmlldzIiOwotCi0gICAgcHJpdmF0ZSBMaXN0ZW5lckxpc3Qgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotICAgIHByaXZhdGUgSVNlbGVjdGlvbiBsYXN0U2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotICAgIHByaXZhdGUgVGV4dCB0ZXh0OwotCi0gICAgcHVibGljIFNlbGVjdGlvblByb3ZpZGVyVmlldygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIFdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICB0ZXh0LnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBXb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLSAgICAgICAgdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElWaWV3UGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOwotICAgICAgICBzdXBlci5pbml0KHNpdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElTZWxlY3Rpb25Qcm92aWRlciNnZXRTZWxlY3Rpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGxhc3RTZWxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotICAgICAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2VsZWN0aW9uIHRvIGEgcGFydGljdWxhciBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKE9iamVjdCBvYmopIHsKLSAgICAgICAgc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iaikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVNlbGVjdGlvblByb3ZpZGVyI3NldFNlbGVjdGlvbihJU2VsZWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBsYXN0U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhbiBldmVudAotICAgICAgICBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbik7Ci0KLSAgICAgICAgLy8gd3JpdGUgdGV4dAotICAgICAgICB0ZXh0LnNldFRleHQoc2VsZWN0aW9uLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIGZpcmUgdGhlIGV2ZW50Ci0gICAgICAgIE9iamVjdFtdIGxpc3RlbmVycyA9IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAoKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL1Rlc3RQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvVGVzdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjI2N2JhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvVGVzdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0czsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdGFydHVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuQmFja2dyb3VuZENvbG9yRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLlRlc3RJbnN0YWxsVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIGltcGxlbWVudHMgSVN0YXJ0dXAgewotICAgIC8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICBwcml2YXRlIHN0YXRpYyBUZXN0UGx1Z2luIHBsdWdpbjsKLQotICAgIC8vUmVzb3VyY2UgYnVuZGxlLgotICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLSAgICAvLyBUaGlzIGJvb2xlYW4gc2hvdWxkIG9ubHkgYmUgdHJ1ZSBpZiB0aGUgZWFybHlTdGFydHVwKCkgbWV0aG9kCi0gICAgLy8gaGFzIGJlZW4gY2FsbGVkLgotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZWFybHlTdGFydHVwQ2FsbGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFRlc3RQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBzdXBlcihkZXNjcmlwdG9yKTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUKLSAgICAgICAgICAgICAgICAgICAgLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdFBsdWdpblJlc291cmNlcyIpOwotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0gICAgICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gVGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4ga2V5OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4gcmVsYXRpdmUgcGF0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0gICAgICAgIFN0cmluZyBpY29uUGF0aCA9ICJpY29ucy8iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIGluc3RhbGxVUkwgPSBnZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpOwotICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgaWNvblBhdGggKyByZWxhdGl2ZVBhdGgpOwotICAgICAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbgotICAgICAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cCNlYXJseVN0YXJ0dXAoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVhcmx5U3RhcnR1cCgpIHsKLSAgICAgICAgZWFybHlTdGFydHVwQ2FsbGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RWFybHlTdGFydHVwQ2FsbGVkKCkgewotICAgICAgICByZXR1cm4gZWFybHlTdGFydHVwQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckVhcmx5U3RhcnR1cCgpIHsKLSAgICAgICAgZWFybHlTdGFydHVwQ2FsbGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0SW5zdGFsbFV0aWwuc2V0Q29udGV4dChjb250ZXh0KTsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdEluc3RhbGxVdGlsLnNldENvbnRleHQobnVsbCk7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgICAgIEJhY2tncm91bmRDb2xvckRlY29yYXRvci5jb2xvciA9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9VaVRlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9VaVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWI1NjhhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvVWlUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5hY3Rpdml0aWVzLkFjdGl2aXRpZXNUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYWRhcHRhYmxlLkFkYXB0YWJsZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuQXBpVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TdGFydHVwVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kcy5Db21tYW5kc1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5jb25jdXJyZW5jeS5Db25jdXJyZW5jeVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5jb250ZXh0cy5Db250ZXh0c1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5kYXRhdHJhbnNmZXIuRGF0YVRyYW5zZmVyVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuRGVjb3JhdG9yc1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzLlVJQXV0b21hdGVkU3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kLkRyYWdUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1BsdWdpbnNUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuZW5jb2RpbmcuRW5jb2RpbmdUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuSW50ZXJuYWxUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaW50cm8uSW50cm9UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMua2V5cy5LZXlzVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmxlYWtzLkxlYWtUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51cy5NZW51c1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5tdWx0aWVkaXRvci5NdWx0aUVkaXRvclRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5tdWx0aXBhZ2VlZGl0b3IuTXVsdGlQYWdlRWRpdG9yVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5OYXZpZ2F0b3JUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMub3BlcmF0aW9ucy5PcGVyYXRpb25zVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLnByZXNlbnRhdGlvbnMuUHJlc2VudGF0aW9uc1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5wcm9wZXJ0eXNoZWV0LlByb3BlcnR5U2hlZXRUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMudGhlbWVzLlRoZW1lc1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy56b29tLlpvb21UZXN0U3VpdGU7Ci0KLS8qKgotICogVGVzdCBhbGwgYXJlYXMgb2YgdGhlIFVJLgotICovCi1wdWJsaWMgY2xhc3MgVWlUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VpdGUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVWlUZXN0U3VpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIHRlc3Qgc3VpdGUuCi0gICAgICovCi0gICAgcHVibGljIFVpVGVzdFN1aXRlKCkgewotICAgIAkvLyBydW4gdGhlIFN0YXJ0dXBUZXN0IGZpcnN0LCBzaW5jZSB3ZSBuZWVkIHRvIGNoZWNrIGVhcmx5IHRoYXQgdGhlIHRlc3RzIAotICAgIAkvLyBydW4gb25seSBhZnRlciBlYXJseSBzdGFydHVwIGhhcyBjb21wbGV0ZWQgKGJ1ZyA5MzUxOCkuCi0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShTdGFydHVwVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBVSUF1dG9tYXRlZFN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBBcGlUZXN0U3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFByb3BlcnR5U2hlZXRUZXN0U3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IEludGVybmFsVGVzdFN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBOYXZpZ2F0b3JUZXN0U3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IERlY29yYXRvcnNUZXN0U3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IEFkYXB0YWJsZVRlc3RTdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgWm9vbVRlc3RTdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgRGF0YVRyYW5zZmVyVGVzdFN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBQcmVmZXJlbmNlc1Rlc3RTdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgRHluYW1pY1BsdWdpbnNUZXN0U3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IEtleXNUZXN0U3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IE11bHRpUGFnZUVkaXRvclRlc3RTdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgQWN0aXZpdGllc1Rlc3RTdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgQ29tbWFuZHNUZXN0U3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IENvbnRleHRzVGVzdFN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBEcmFnVGVzdFN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBUaGVtZXNUZXN0U3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IEludHJvVGVzdFN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBNZW51c1Rlc3RTdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgRW5jb2RpbmdUZXN0U3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFByZXNlbnRhdGlvbnNUZXN0U3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShMZWFrVGVzdHMuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgQ29uY3VycmVuY3lUZXN0U3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IE9wZXJhdGlvbnNUZXN0U3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IE11bHRpRWRpdG9yVGVzdFN1aXRlKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWN0aXZpdGllcy9BY3Rpdml0aWVzVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FjdGl2aXRpZXMvQWN0aXZpdGllc1Rlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDhlYjBkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWN0aXZpdGllcy9BY3Rpdml0aWVzVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYWN0aXZpdGllczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGhlIEFjdGl2aXRpZXNUZXN0U3VpdGUgY2xhc3MgcnVucyB0aGUgYWN0aXZpdGllcycgdGVzdCBzdWl0ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0aWVzVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gVGhpcyBpcyByZXF1aXJlZCB0byB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBY3Rpdml0aWVzVGVzdFN1aXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IHRoZSB0ZXN0IHN1aXRlLgotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpdml0aWVzVGVzdFN1aXRlKCkgewotICAgICAgCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShJbWFnZXNUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShVdGlsVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoU3RhdGljVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoRHluYW1pY1Rlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFBlcnNpc3RhbmNlVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQWN0aXZpdHlQcmVmZXJlbmNlVGVzdC5jbGFzcykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWN0aXZpdGllcy9BY3Rpdml0eVByZWZlcmVuY2VUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FjdGl2aXRpZXMvQWN0aXZpdHlQcmVmZXJlbmNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmViOGNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWN0aXZpdGllcy9BY3Rpdml0eVByZWZlcmVuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hY3Rpdml0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUFjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQcmVmZXJlbmNlVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotICAgIC8qKgotICAgICAqIFByZWZlcmVuY2UgcHJlZml4IC0gbXVzdCBtYXRjaCB0aGUgb25lIHNwZWNpZmllZCBpbiBBY3Rpdml0eVByZWZlcmVuY2VIZWxwZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJFRklYID0gIlVJQWN0aXZpdGllcy4iOyAvLyROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogVGhlIGFjdGl2aXR5IGlkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLnVpLlBULkEyIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpdml0eVByZWZlcmVuY2VUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgYWN0aXZpdHkgcHJlZmVyZW5jZXMgYXJlIHBlcnNpc3RlZCBhcyBzb29uIGFzIHRoZSBhY3Rpdml0eSBzZXQgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlQcmVmZXJlbmNlKCkgewotICAgICAgICBJQWN0aXZpdHlNYW5hZ2VyIG1hbmFnZXIgPSBmV29ya2JlbmNoLmdldEFjdGl2aXR5U3VwcG9ydCgpLmdldEFjdGl2aXR5TWFuYWdlcigpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpbml0aWFsU3RhdGUgPSBtYW5hZ2VyLmdldEVuYWJsZWRBY3Rpdml0eUlkcygpLmNvbnRhaW5zKElEKTsKLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbml0aWFsU3RhdGUsIHN0b3JlLmdldEJvb2xlYW4oUFJFRklYICsgSUQpKTsKLSAgICAgICAgCi0gICAgICAgIGZXb3JrYmVuY2guZ2V0QWN0aXZpdHlTdXBwb3J0KCkuc2V0RW5hYmxlZEFjdGl2aXR5SWRzKGluaXRpYWxTdGF0ZSA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihJRCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIWluaXRpYWxTdGF0ZSwgc3RvcmUuZ2V0Qm9vbGVhbihQUkVGSVggKyBJRCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hY3Rpdml0aWVzL0R5bmFtaWNNb2RlbEFjdGl2aXR5UmVnaXN0cnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWN0aXZpdGllcy9EeW5hbWljTW9kZWxBY3Rpdml0eVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMjAyN2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hY3Rpdml0aWVzL0R5bmFtaWNNb2RlbEFjdGl2aXR5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYWN0aXZpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYWN0aXZpdGllcy5BYnN0cmFjdEFjdGl2aXR5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYWN0aXZpdGllcy5BY3Rpdml0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYWN0aXZpdGllcy5BY3Rpdml0eVBhdHRlcm5CaW5kaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5hY3Rpdml0aWVzLkFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5hY3Rpdml0aWVzLkNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5hY3Rpdml0aWVzLkNhdGVnb3J5RGVmaW5pdGlvbjsKLQotLyoqCi0gKiAKLSAqIFRoZSBkeW5hbWljIGFjdGl2aXR5IHJlZ2lzdHJ5IHBvcHVsYXRlZCBhY3Rpdml0aWVzIHdpdGggZHVtbXkgZGVmaW5pdGlvbnMgZm9yCi0gKiB0ZXN0aW5nIHB1cnBvc2VzLgotICovCi1wdWJsaWMgY2xhc3MgRHluYW1pY01vZGVsQWN0aXZpdHlSZWdpc3RyeSBleHRlbmRzIEFic3RyYWN0QWN0aXZpdHlSZWdpc3RyeSB7Ci0gICAgZmluYWwgU3RyaW5nIHNvdXJjZUlkID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgcGx1Z2luIG1vZGVsIHJlZ2lzdHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBEeW5hbWljTW9kZWxBY3Rpdml0eVJlZ2lzdHJ5KCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBsb2FkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGUgZGVmaW5pdGlvbnMuCi0gICAgICogIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkKCkgewotICAgICAgICBjYXRlZ29yeURlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhY3Rpdml0eURlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBjYXRlZ29yeUFjdGl2aXR5QmluZGluZ0RlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhY3Rpdml0eVBhdHRlcm5CaW5kaW5nRGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nRGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGRlZmF1bHRFbmFibGVkQWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcG9wdWxhdGVDYXRlZ29yeURlZmluaXRpb25zKCk7Ci0gICAgICAgIHBvcHVsYXRlQWN0aXZpdHlEZWZpbml0aW9ucygpOwotICAgICAgICBwb3B1bGF0ZUNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgcG9wdWxhdGVBY3Rpdml0eVBhdHRlcm5CaW5kaW5nRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgcG9wdWxhdGVBY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZ0RlZmluaXRpb25zKCk7Ci0gICAgICAgIHBvcHVsYXRlRGVmYXVsdEVuYWJsZWRBY3Rpdml0aWVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGUgdGhlIGRlZmF1bHQgZW5hYmxlZCBhY3RpdnRpZXMuCi0gICAgICogIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZURlZmF1bHRFbmFibGVkQWN0aXZpdGllcygpIHsKLSAgICAgICAgZGVmYXVsdEVuYWJsZWRBY3Rpdml0aWVzLmFkZCgoKEFjdGl2aXR5RGVmaW5pdGlvbikgYWN0aXZpdHlEZWZpbml0aW9ucwotICAgICAgICAgICAgICAgIC50b0FycmF5KClbMF0pLmdldElkKCkpOwotICAgICAgICBkZWZhdWx0RW5hYmxlZEFjdGl2aXRpZXMuYWRkKCgoQWN0aXZpdHlEZWZpbml0aW9uKSBhY3Rpdml0eURlZmluaXRpb25zCi0gICAgICAgICAgICAgICAgLnRvQXJyYXkoKVsyXSkuZ2V0SWQoKSk7Ci0gICAgICAgIGRlZmF1bHRFbmFibGVkQWN0aXZpdGllcy5hZGQoKChBY3Rpdml0eURlZmluaXRpb24pIGFjdGl2aXR5RGVmaW5pdGlvbnMKLSAgICAgICAgICAgICAgICAudG9BcnJheSgpWzhdKS5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSB0aGUgYWN0aXZpdHkgYWN0aXZpdHkgYmluZGluZyBkZWZpbml0aW9ucy4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQWN0aXZpdHlSZXF1aXJlbWVudEJpbmRpbmdEZWZpbml0aW9ucygpIHsKLSAgICAgICAgYWN0aXZpdHlSZXF1aXJlbWVudEJpbmRpbmdEZWZpbml0aW9ucwotICAgICAgICAgICAgICAgIC5hZGQobmV3IEFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICgoQWN0aXZpdHlEZWZpbml0aW9uKSBhY3Rpdml0eURlZmluaXRpb25zLnRvQXJyYXkoKVswXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoKEFjdGl2aXR5RGVmaW5pdGlvbikgYWN0aXZpdHlEZWZpbml0aW9ucy50b0FycmF5KClbMV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJZCgpLCBzb3VyY2VJZCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nRGVmaW5pdGlvbnMKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBBY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZ0RlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAoKEFjdGl2aXR5RGVmaW5pdGlvbikgYWN0aXZpdHlEZWZpbml0aW9ucy50b0FycmF5KClbMl0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgKChBY3Rpdml0eURlZmluaXRpb24pIGFjdGl2aXR5RGVmaW5pdGlvbnMudG9BcnJheSgpWzNdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SWQoKSwgc291cmNlSWQpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvcHVsYXRlIHRoZSBhY3Rpdml0eSBwYXR0ZXJuIGJpbmRpbmcgZGVmaW5pdGlvbnMuCi0gICAgICogIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUFjdGl2aXR5UGF0dGVybkJpbmRpbmdEZWZpbml0aW9ucygpIHsKLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGFjdGl2aXR5RGVmaW5pdGlvbnMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBhY3Rpdml0eVBhdHRlcm5CaW5kaW5nRGVmaW5pdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgQWN0aXZpdHlQYXR0ZXJuQmluZGluZ0RlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBY3Rpdml0eURlZmluaXRpb24pIGFjdGl2aXR5RGVmaW5pdGlvbnMudG9BcnJheSgpW2luZGV4XSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJZCgpLCAib3JnLmVjbGlwc2UucGF0dGVybiIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4ICsgMSksIHNvdXJjZUlkKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSB0aGUgY2F0ZWdvcnkgYWN0aXZpdHkgYmluZGluZyBkZWZpbml0aW9ucy4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmdEZWZpbml0aW9ucygpIHsKLSAgICAgICAgaW50IGNvdW50ZXIgPSAxOwotICAgICAgICBmb3IgKGludCBpbmRleCA9IDE7IGluZGV4IDw9IGNhdGVnb3J5RGVmaW5pdGlvbnMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBjYXRlZ29yeUFjdGl2aXR5QmluZGluZ0RlZmluaXRpb25zCi0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IENhdGVnb3J5QWN0aXZpdHlCaW5kaW5nRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuYWN0aXZpdHkiICsgSW50ZWdlci50b1N0cmluZyhjb3VudGVyKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5jYXRlZ29yeSIgKyBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUlkKSk7Ci0gICAgICAgICAgICBjb3VudGVyKys7Ci0gICAgICAgICAgICBjYXRlZ29yeUFjdGl2aXR5QmluZGluZ0RlZmluaXRpb25zCi0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IENhdGVnb3J5QWN0aXZpdHlCaW5kaW5nRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuYWN0aXZpdHkiICsgSW50ZWdlci50b1N0cmluZyhjb3VudGVyKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5jYXRlZ29yeSIgKyBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUlkKSk7Ci0gICAgICAgICAgICBjb3VudGVyKys7Ci0gICAgICAgICAgICBjYXRlZ29yeUFjdGl2aXR5QmluZGluZ0RlZmluaXRpb25zCi0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IENhdGVnb3J5QWN0aXZpdHlCaW5kaW5nRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuYWN0aXZpdHkiICsgSW50ZWdlci50b1N0cmluZyhjb3VudGVyKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5jYXRlZ29yeSIgKyBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUlkKSk7Ci0gICAgICAgICAgICBjb3VudGVyKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSB0aGUgYWN0aXZpdHkgZGVmaW5pdGlvbnMuCi0gICAgICogIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUFjdGl2aXR5RGVmaW5pdGlvbnMoKSB7Ci0gICAgICAgIFN0cmluZyBzdHJpbmdUb0FwcGVuZCA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGluZGV4ID0gMTsgaW5kZXggPD0gY2F0ZWdvcnlEZWZpbml0aW9ucy5zaXplKCkgKiAzOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBzdHJpbmdUb0FwcGVuZCA9IEludGVnZXIudG9TdHJpbmcoaW5kZXgpOwotICAgICAgICAgICAgYWN0aXZpdHlEZWZpbml0aW9ucy5hZGQobmV3IEFjdGl2aXR5RGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmFjdGl2aXR5IiArIHN0cmluZ1RvQXBwZW5kLCAiQWN0aXZpdHkgIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZ1RvQXBwZW5kLCBzb3VyY2VJZCwgImRlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSB0aGUgY2F0ZWdvcnkgZGVmaW5pdGlvbnMuCi0gICAgICogIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUNhdGVnb3J5RGVmaW5pdGlvbnMoKSB7Ci0gICAgICAgIFN0cmluZyBzdHJpbmdUb0FwcGVuZCA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGluZGV4ID0gMTsgaW5kZXggPD0gNjsgaW5kZXgrKykgewotICAgICAgICAgICAgc3RyaW5nVG9BcHBlbmQgPSBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KTsKLSAgICAgICAgICAgIGNhdGVnb3J5RGVmaW5pdGlvbnMuYWRkKG5ldyBDYXRlZ29yeURlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5jYXRlZ29yeSIgKyBzdHJpbmdUb0FwcGVuZCwgIkNhdGVnb3J5ICIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmdUb0FwcGVuZCwgc291cmNlSWQsICJkZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGFjdGl2aXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY3Rpdml0eUlkCi0gICAgICogICAgICAgICAgICBUaGUgYWN0aXZpdHkncyBpZC4KLSAgICAgKiBAcGFyYW0gYWN0aXZpdHlOYW1lCi0gICAgICogICAgICAgICAgICBUaGUgYWN0aXZpdHkncyBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQWN0aXZpdHkoU3RyaW5nIGFjdGl2aXR5SWQsIFN0cmluZyBhY3Rpdml0eU5hbWUpIHsKLSAgICAgICAgYWN0aXZpdHlEZWZpbml0aW9ucy5hZGQobmV3IEFjdGl2aXR5RGVmaW5pdGlvbihhY3Rpdml0eUlkLAotICAgICAgICAgICAgICAgIGFjdGl2aXR5TmFtZSwgc291cmNlSWQsICJkZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaXJlQWN0aXZpdHlSZWdpc3RyeUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYWRuIGFjdGl2aXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY3Rpdml0eUlkCi0gICAgICogICAgICAgICAgICBUaGUgYWN0aXZpdHkncyBpZC4KLSAgICAgKiBAcGFyYW0gYWN0aXZpdHlOYW1lCi0gICAgICogICAgICAgICAgICBUaGUgYWN0aXZpdHkncyBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFjdGl2aXR5KFN0cmluZyBhY3Rpdml0eUlkLCBTdHJpbmcgYWN0aXZpdHlOYW1lKSB7Ci0gICAgICAgIGFjdGl2aXR5RGVmaW5pdGlvbnMucmVtb3ZlKG5ldyBBY3Rpdml0eURlZmluaXRpb24oYWN0aXZpdHlJZCwKLSAgICAgICAgICAgICAgICBhY3Rpdml0eU5hbWUsIHNvdXJjZUlkLCAiZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmlyZUFjdGl2aXR5UmVnaXN0cnlDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgY2F0ZWdvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdGVnb3J5SWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBjYXRlZ29yeSdzIGlkLgotICAgICAqIEBwYXJhbSBjYXRlZ29yeU5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBjYXRlZ29yeSdzIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5SWQsIFN0cmluZyBjYXRlZ29yeU5hbWUpIHsKLSAgICAgICAgY2F0ZWdvcnlEZWZpbml0aW9ucy5hZGQobmV3IENhdGVnb3J5RGVmaW5pdGlvbihjYXRlZ29yeUlkLAotICAgICAgICAgICAgICAgIGNhdGVnb3J5TmFtZSwgc291cmNlSWQsICJkZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaXJlQWN0aXZpdHlSZWdpc3RyeUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSBjYXRlZ29yeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnlJZAotICAgICAqICAgICAgICAgICAgVGhlIGNhdGVnb3J5J3MgaWQuCi0gICAgICogQHBhcmFtIGNhdGVnb3J5TmFtZQotICAgICAqICAgICAgICAgICAgVGhlIGNhdGVnb3J5J3MgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnlJZCwgU3RyaW5nIGNhdGVnb3J5TmFtZSkgewotICAgICAgICBjYXRlZ29yeURlZmluaXRpb25zLnJlbW92ZShuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKGNhdGVnb3J5SWQsCi0gICAgICAgICAgICAgICAgY2F0ZWdvcnlOYW1lLCBzb3VyY2VJZCwgImRlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZpcmVBY3Rpdml0eVJlZ2lzdHJ5Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbiBhY3Rpdml0eSBhY3Rpdml0eSBiaW5kaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRJZAotICAgICAqICAgICAgICAgICAgVGhlIHBhcmVudCBpZC4KLSAgICAgKiBAcGFyYW0gY2hpbGRJZAotICAgICAqICAgICAgICAgICAgVGhlIGNoaWxkIGlkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nKFN0cmluZyBjaGlsZElkLCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgYWN0aXZpdHlSZXF1aXJlbWVudEJpbmRpbmdEZWZpbml0aW9ucwotICAgICAgICAgICAgICAgIC5hZGQobmV3IEFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nRGVmaW5pdGlvbihjaGlsZElkLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SWQsIHNvdXJjZUlkKSk7Ci0gICAgICAgIGZpcmVBY3Rpdml0eVJlZ2lzdHJ5Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlb212ZSBhbiBhY3Rpdml0eSBhY3Rpdml0eSBiaW5kaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRJZAotICAgICAqICAgICAgICAgICAgVGhlIHBhcmVudCBpZC4KLSAgICAgKiBAcGFyYW0gY2hpbGRJZAotICAgICAqICAgICAgICAgICAgVGhlIGNoaWxkIGlkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nKFN0cmluZyBjaGlsZElkLCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgYWN0aXZpdHlSZXF1aXJlbWVudEJpbmRpbmdEZWZpbml0aW9ucwotICAgICAgICAgICAgICAgIC5yZW1vdmUobmV3IEFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nRGVmaW5pdGlvbihjaGlsZElkLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SWQsIHNvdXJjZUlkKSk7Ci0gICAgICAgIGZpcmVBY3Rpdml0eVJlZ2lzdHJ5Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIGNhdGVnb3J5IGFjdGl2aXR5IGJpbmRpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjdGl2aXR5SWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBhY3Rpdml0eSBpZC4KLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnlJZAotICAgICAqICAgICAgICAgICAgVGhlIGNhdGVnb3J5IGlkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENhdGVnb3J5QWN0aXZpdHlCaW5kaW5nKFN0cmluZyBhY3Rpdml0eUlkLCBTdHJpbmcgY2F0ZWdvcnlJZCkgewotICAgICAgICBjYXRlZ29yeUFjdGl2aXR5QmluZGluZ0RlZmluaXRpb25zCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgQ2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmdEZWZpbml0aW9uKGFjdGl2aXR5SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeUlkLCBzb3VyY2VJZCkpOwotICAgICAgICBmaXJlQWN0aXZpdHlSZWdpc3RyeUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSBjYXRlZ29yeSBhY3Rpdml0eSBiaW5kaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY3Rpdml0eUlkCi0gICAgICogICAgICAgICAgICBUaGUgYWN0aXZpdHkgaWQuCi0gICAgICogQHBhcmFtIGNhdGVnb3J5SWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBjYXRlZ29yeSBpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDYXRlZ29yeUFjdGl2aXR5QmluZGluZyhTdHJpbmcgYWN0aXZpdHlJZCwKLSAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeUlkKSB7Ci0gICAgICAgIGNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nRGVmaW5pdGlvbnMKLSAgICAgICAgICAgICAgICAucmVtb3ZlKG5ldyBDYXRlZ29yeUFjdGl2aXR5QmluZGluZ0RlZmluaXRpb24oYWN0aXZpdHlJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5SWQsIHNvdXJjZUlkKSk7Ci0gICAgICAgIGZpcmVBY3Rpdml0eVJlZ2lzdHJ5Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgY2F0ZWdvcnkncyBkZXNjcmlwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnlJZAotICAgICAqICAgICAgICAgICAgVGhlIGNhdGVnb3J5IElkLgotICAgICAqIEBwYXJhbSBjYXRlZ29yeURlc2NyaXB0aW9uCi0gICAgICogICAgICAgICAgICBUaGUgY2F0ZWdvcnkgZGVzY3JpcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQ2F0ZWdvcnlEZXNjcmlwdGlvbihTdHJpbmcgY2F0ZWdvcnlJZCwKLSAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeURlc2NyaXB0aW9uKSB7Ci0gICAgICAgIENhdGVnb3J5RGVmaW5pdGlvbiBjdXJyZW50Q2F0ZWdvcnkgPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjYXRlZ29yeURlZmluaXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgY3VycmVudENhdGVnb3J5ID0gKENhdGVnb3J5RGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudENhdGVnb3J5LmdldElkKCkuZXF1YWxzKGNhdGVnb3J5SWQpKSB7Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcnlEZWZpbml0aW9ucy5yZW1vdmUoY3VycmVudENhdGVnb3J5KTsKLSAgICAgICAgICAgICAgICBjYXRlZ29yeURlZmluaXRpb25zLmFkZChuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKGNhdGVnb3J5SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2F0ZWdvcnkuZ2V0TmFtZSgpLCBjdXJyZW50Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNvdXJjZUlkKCksIGNhdGVnb3J5RGVzY3JpcHRpb24pKTsKLSAgICAgICAgICAgICAgICBmaXJlQWN0aXZpdHlSZWdpc3RyeUNoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIGFjdGl2aXR5J3MgZGVzY3JpcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjdGl2aXR5SWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBhY3Rpdml0eSBpZC4KLSAgICAgKiBAcGFyYW0gYWN0aXZpdHlEZXNjcmlwdGlvbgotICAgICAqICAgICAgICAgICAgVGhlIGFjdGl2aXR5IGRlc2NyaXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oU3RyaW5nIGFjdGl2aXR5SWQsCi0gICAgICAgICAgICBTdHJpbmcgYWN0aXZpdHlEZXNjcmlwdGlvbikgewotICAgICAgICBBY3Rpdml0eURlZmluaXRpb24gY3VycmVudEFjdGl2aXR5ID0gbnVsbDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gYWN0aXZpdHlEZWZpbml0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGN1cnJlbnRBY3Rpdml0eSA9IChBY3Rpdml0eURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRBY3Rpdml0eS5nZXRJZCgpLmVxdWFscyhhY3Rpdml0eUlkKSkgewotICAgICAgICAgICAgICAgIGFjdGl2aXR5RGVmaW5pdGlvbnMucmVtb3ZlKGN1cnJlbnRBY3Rpdml0eSk7Ci0gICAgICAgICAgICAgICAgYWN0aXZpdHlEZWZpbml0aW9ucy5hZGQobmV3IEFjdGl2aXR5RGVmaW5pdGlvbihhY3Rpdml0eUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEFjdGl2aXR5LmdldE5hbWUoKSwgY3VycmVudEFjdGl2aXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTb3VyY2VJZCgpLCBhY3Rpdml0eURlc2NyaXB0aW9uKSk7Ci0gICAgICAgICAgICAgICAgZmlyZUFjdGl2aXR5UmVnaXN0cnlDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBhY3Rpdml0eSdzIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjdGl2aXR5SWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBhY3Rpdml0eSBpZC4KLSAgICAgKiBAcGFyYW0gYWN0aXZpdHlOYW1lCi0gICAgICogICAgICAgICAgICBUaGUgYWN0aXZpdHkncyBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFjdGl2aXR5TmFtZShTdHJpbmcgYWN0aXZpdHlJZCwgU3RyaW5nIGFjdGl2aXR5TmFtZSkgewotICAgICAgICBBY3Rpdml0eURlZmluaXRpb24gY3VycmVudEFjdGl2aXR5ID0gbnVsbDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gYWN0aXZpdHlEZWZpbml0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGN1cnJlbnRBY3Rpdml0eSA9IChBY3Rpdml0eURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRBY3Rpdml0eS5nZXRJZCgpLmVxdWFscyhhY3Rpdml0eUlkKSkgewotICAgICAgICAgICAgICAgIGFjdGl2aXR5RGVmaW5pdGlvbnMucmVtb3ZlKGN1cnJlbnRBY3Rpdml0eSk7Ci0gICAgICAgICAgICAgICAgYWN0aXZpdHlEZWZpbml0aW9ucy5hZGQobmV3IEFjdGl2aXR5RGVmaW5pdGlvbihhY3Rpdml0eUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlOYW1lLCBjdXJyZW50QWN0aXZpdHkuZ2V0U291cmNlSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBY3Rpdml0eS5nZXREZXNjcmlwdGlvbigpKSk7Ci0gICAgICAgICAgICAgICAgZmlyZUFjdGl2aXR5UmVnaXN0cnlDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBjYXRlZ29yeSdzIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdGVnb3J5SWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBjYXRlZ29yeSBpZC4KLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnlOYW1lCi0gICAgICogICAgICAgICAgICBUaGUgY2F0ZWdvcnkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVDYXRlZ29yeU5hbWUoU3RyaW5nIGNhdGVnb3J5SWQsIFN0cmluZyBjYXRlZ29yeU5hbWUpIHsKLSAgICAgICAgQ2F0ZWdvcnlEZWZpbml0aW9uIGN1cnJlbnRDYXRlZ29yeSA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNhdGVnb3J5RGVmaW5pdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBjdXJyZW50Q2F0ZWdvcnkgPSAoQ2F0ZWdvcnlEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50Q2F0ZWdvcnkuZ2V0SWQoKS5lcXVhbHMoY2F0ZWdvcnlJZCkpIHsKLSAgICAgICAgICAgICAgICBjYXRlZ29yeURlZmluaXRpb25zLnJlbW92ZShjdXJyZW50Q2F0ZWdvcnkpOwotICAgICAgICAgICAgICAgIGNhdGVnb3J5RGVmaW5pdGlvbnMuYWRkKG5ldyBDYXRlZ29yeURlZmluaXRpb24oY2F0ZWdvcnlJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5TmFtZSwgY3VycmVudENhdGVnb3J5LmdldFNvdXJjZUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2F0ZWdvcnkuZ2V0RGVzY3JpcHRpb24oKSkpOwotICAgICAgICAgICAgICAgIGZpcmVBY3Rpdml0eVJlZ2lzdHJ5Q2hhbmdlZCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhbiBhY3Rpdml0eSBwYXR0ZXJuIGJpbmRpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhdHRlcm4KLSAgICAgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGJpbmRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWN0aXZpdHlQYXR0ZXJuQmluZGluZyhTdHJpbmcgcGF0dGVybikgewotICAgICAgICBBY3Rpdml0eVBhdHRlcm5CaW5kaW5nRGVmaW5pdGlvbiBjdXJyZW50RGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGFjdGl2aXR5UGF0dGVybkJpbmRpbmdEZWZpbml0aW9ucy5pdGVyYXRvcigpOyBpCi0gICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGN1cnJlbnREZWZpbml0aW9uID0gKEFjdGl2aXR5UGF0dGVybkJpbmRpbmdEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50RGVmaW5pdGlvbi5nZXRQYXR0ZXJuKCkuZXF1YWxzKHBhdHRlcm4pKSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZpdHlQYXR0ZXJuQmluZGluZ0RlZmluaXRpb25zLnJlbW92ZShjdXJyZW50RGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgZmlyZUFjdGl2aXR5UmVnaXN0cnlDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGFjdGl2aXR5IHBhdHRlcm4gYmluZGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWN0aXZpdHlJZAotICAgICAqICAgICAgICAgICAgVGhlIGFjdHZpdHkgSWQuCi0gICAgICogQHBhcmFtIHBhdHRlcm4KLSAgICAgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEFjdGl2aXR5UGF0dGVybkJpbmRpbmcoU3RyaW5nIGFjdGl2aXR5SWQsIFN0cmluZyBwYXR0ZXJuKSB7Ci0gICAgICAgIGlmIChhY3Rpdml0eVBhdHRlcm5CaW5kaW5nRGVmaW5pdGlvbnMKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBBY3Rpdml0eVBhdHRlcm5CaW5kaW5nRGVmaW5pdGlvbihhY3Rpdml0eUlkLCBwYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlSWQpKSkgewotICAgICAgICAgICAgZmlyZUFjdGl2aXR5UmVnaXN0cnlDaGFuZ2VkKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIGRlZmF1bHQgZW5hYmxlbWVudCB0byB0aGUgcHJvdmlkZWQgYWN0aXZpdHkKLSAgICAgKiBAcGFyYW0gYWN0aXZpdHlJZCB0aGUgYWN0aXZpdHkgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGREZWZhdWx0RW5hYmxlZEFjdGl2aXR5KFN0cmluZyBhY3Rpdml0eUlkKSB7Ci0gICAgICAgIGlmIChkZWZhdWx0RW5hYmxlZEFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5SWQpKSB7Ci0gICAgICAgICAgICBmaXJlQWN0aXZpdHlSZWdpc3RyeUNoYW5nZWQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmUgZGVmYXVsdCBlbmFibGVtZW50IHRvIHRoZSBwcm92aWRlZCBhY3Rpdml0eQotICAgICAqIAotICAgICAqIEBwYXJhbSBhY3Rpdml0eUlkIHRoZSBhY3Rpdml0eSBpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVEZWZhdWx0RW5hYmxlZEFjdGl2aXR5KFN0cmluZyBhY3Rpdml0eUlkKSB7Ci0gICAgICAgIGlmIChkZWZhdWx0RW5hYmxlZEFjdGl2aXRpZXMucmVtb3ZlKGFjdGl2aXR5SWQpKSB7Ci0gICAgICAgICAgICBmaXJlQWN0aXZpdHlSZWdpc3RyeUNoYW5nZWQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWN0aXZpdGllcy9EeW5hbWljVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hY3Rpdml0aWVzL0R5bmFtaWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkM2FjNjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hY3Rpdml0aWVzL0R5bmFtaWNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFjdGl2aXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5BY3Rpdml0eUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuQWN0aXZpdHlNYW5hZ2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5DYXRlZ29yeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUFjdGl2aXR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQWN0aXZpdHlNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQ2F0ZWdvcnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUlkZW50aWZpZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklkZW50aWZpZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLk5vdERlZmluZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYWN0aXZpdGllcy5NdXRhYmxlQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIAotICogVGhlIGR5bmFtaWMgdGVzdCBtYW5pcHVhbHRlcyB0aGUgY2F0ZWdvcmllcywgYWN0aXZpdGllcyBhbmQgdGhlaXIgZGVmaW5pdGlvbnMKLSAqIGFuZCBlbnN1cmVzIHRoYXQgdGhlaXIgY29udGVudCBhbmQgdGhlaXIgbGlzdGVuZXJzIGFyZSBiZWhhdmluZyBwcm9wZXJseS4KLSAqLwotcHVibGljIGNsYXNzIER5bmFtaWNUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBNdXRhYmxlQWN0aXZpdHlNYW5hZ2VyIGFjdGl2aXR5TWFuYWdlcjsKLQotICAgIHByaXZhdGUgRHluYW1pY01vZGVsQWN0aXZpdHlSZWdpc3RyeSBmaXhlZE1vZGVsUmVnaXN0cnk7Ci0KLSAgICBwcml2YXRlIGludCBsaXN0ZW5lclR5cGU7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0VOQUJMRURfQ0hBTkdFRCA9IDA7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0lEU19DSEFOR0VEID0gMTsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFRF9BQ1RJVklUWUlEU19DSEFOR0VEID0gMjsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGSU5FRF9DQVRFR09SWUlEU19DSEFOR0VEID0gMzsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGSU5FRF9BQ1RJVklUWUlEU19DSEFOR0VEID0gNDsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGSU5FRF9DSEFOR0VEID0gNTsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFRF9DSEFOR0VEID0gNjsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DSEFOR0VEID0gNzsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFUVEVSTl9CSU5ESU5HU19DSEFOR0VEID0gODsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfQUNUSVZJVFlfQklORElOR1NfQ0hBTkdFRCA9IDk7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IERFU0NSSVBUSU9OX0NIQU5HRUQgPSAxMDsKLSAgICAKLSAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRU5BQkxFRF9DSEFOR0VEID0gMTE7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKiAgICAgICAgICAgIFRlc3QncyBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBEeW5hbWljVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgICAgICBmaXhlZE1vZGVsUmVnaXN0cnkgPSBuZXcgRHluYW1pY01vZGVsQWN0aXZpdHlSZWdpc3RyeSgpOwotICAgICAgICBhY3Rpdml0eU1hbmFnZXIgPSBuZXcgTXV0YWJsZUFjdGl2aXR5TWFuYWdlcihmaXhlZE1vZGVsUmVnaXN0cnkpOwotICAgICAgICBsaXN0ZW5lclR5cGUgPSAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHNpemVzIG9mIHdoYXQgaGFzIGJlZW4gcmVhZC4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNpemVzKCkgewotICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5TWFuYWdlci5nZXREZWZpbmVkQ2F0ZWdvcnlJZHMoKS5zaXplKCkgPT0gNik7Ci0gICAgICAgIGFzc2VydFRydWUoYWN0aXZpdHlNYW5hZ2VyLmdldERlZmluZWRBY3Rpdml0eUlkcygpLnNpemUoKSA9PSAxOCk7Ci0gICAgICAgIGFzc2VydFRydWUoYWN0aXZpdHlNYW5hZ2VyLmdldEVuYWJsZWRBY3Rpdml0eUlkcygpLnNpemUoKSA9PSAzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGFjdGl2aXR5IGJpbmRpbmdzLgotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlQYXR0ZXJuQmluZGluZ3MoKSB7Ci0gICAgICAgIElBY3Rpdml0eSBmaXJzdF9hY3Rpdml0eSA9IGFjdGl2aXR5TWFuYWdlcgotICAgICAgICAgICAgICAgIC5nZXRBY3Rpdml0eSgoU3RyaW5nKSBhY3Rpdml0eU1hbmFnZXIuZ2V0RGVmaW5lZEFjdGl2aXR5SWRzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KClbMF0pOwotICAgICAgICBTZXQgaW5pdGlhbFBhdHRlcm5CaW5kaW5ncyA9IGZpcnN0X2FjdGl2aXR5Ci0gICAgICAgICAgICAgICAgLmdldEFjdGl2aXR5UGF0dGVybkJpbmRpbmdzKCk7Ci0gICAgICAgIC8vIEFkZCBwYXR0ZXJuIGJpbmRpbmcKLSAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSAib3JnXFwuZWNsaXBzZVxcLnVpXFwubXlQYXR0ZXJuLy4qIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaXhlZE1vZGVsUmVnaXN0cnkuYWRkQWN0aXZpdHlQYXR0ZXJuQmluZGluZyhmaXJzdF9hY3Rpdml0eS5nZXRJZCgpLAotICAgICAgICAgICAgICAgIHBhdHRlcm4pOwotICAgICAgICBhc3NlcnRGYWxzZShpbml0aWFsUGF0dGVybkJpbmRpbmdzLnNpemUoKSA9PSBmaXJzdF9hY3Rpdml0eQotICAgICAgICAgICAgICAgIC5nZXRBY3Rpdml0eVBhdHRlcm5CaW5kaW5ncygpLnNpemUoKSk7Ci0gICAgICAgIC8vIFJlbW92ZSBwYXR0ZXJuIGJpbmRpbmcKLSAgICAgICAgZml4ZWRNb2RlbFJlZ2lzdHJ5LnJlbW92ZUFjdGl2aXR5UGF0dGVybkJpbmRpbmcocGF0dGVybik7Ci0gICAgICAgIGFzc2VydFRydWUoaW5pdGlhbFBhdHRlcm5CaW5kaW5ncy5zaXplKCkgPT0gZmlyc3RfYWN0aXZpdHkKLSAgICAgICAgICAgICAgICAuZ2V0QWN0aXZpdHlQYXR0ZXJuQmluZGluZ3MoKS5zaXplKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGVuYWJsZWQgYWN0aXZpdGllcy4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZWRBY3Rpdml0aWVzKCkgewotICAgICAgICAvLyBBZGQgYW4gZW5hYmxlZCBhY3Rpdml0eQotICAgICAgICBTZXQgY29tcGFyZVNldDsKLSAgICAgICAgU2V0IGNvcHlTZXQgPSBuZXcgSGFzaFNldChhY3Rpdml0eU1hbmFnZXIuZ2V0RW5hYmxlZEFjdGl2aXR5SWRzKCkpOwotICAgICAgICBjb3B5U2V0LmFkZChhY3Rpdml0eU1hbmFnZXIuZ2V0RGVmaW5lZEFjdGl2aXR5SWRzKCkudG9BcnJheSgpWzBdKTsKLSAgICAgICAgYWN0aXZpdHlNYW5hZ2VyLnNldEVuYWJsZWRBY3Rpdml0eUlkcyhjb3B5U2V0KTsKLSAgICAgICAgY29tcGFyZVNldCA9IGFjdGl2aXR5TWFuYWdlci5nZXRFbmFibGVkQWN0aXZpdHlJZHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlU2V0LnNpemUoKSA9PSBjb3B5U2V0LnNpemUoKSk7Ci0gICAgICAgIC8vIFJlbW92ZSBhbiBlbmFibGVkIGFjdGl2aXR5Ci0gICAgICAgIGNvcHlTZXQucmVtb3ZlKGFjdGl2aXR5TWFuYWdlci5nZXREZWZpbmVkQWN0aXZpdHlJZHMoKS50b0FycmF5KClbMF0pOwotICAgICAgICBhY3Rpdml0eU1hbmFnZXIuc2V0RW5hYmxlZEFjdGl2aXR5SWRzKGNvcHlTZXQpOwotICAgICAgICBjb21wYXJlU2V0ID0gYWN0aXZpdHlNYW5hZ2VyLmdldEVuYWJsZWRBY3Rpdml0eUlkcygpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVTZXQuc2l6ZSgpID09IGNvcHlTZXQuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBpZGVudGlmaWVyIGxpc3RlbmVyLgotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpZmllcnNMaXN0ZW5lcigpIHsKLSAgICAgICAgZmluYWwgSUlkZW50aWZpZXIgZW5hYmxlZElkZW50aWZpZXIgPSBhY3Rpdml0eU1hbmFnZXIKLSAgICAgICAgICAgICAgICAuZ2V0SWRlbnRpZmllcigib3JnLmVjbGlwc2UucGF0dGVybjMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKGVuYWJsZWRJZGVudGlmaWVyLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgZW5hYmxlZElkZW50aWZpZXIuYWRkSWRlbnRpZmllckxpc3RlbmVyKG5ldyBJSWRlbnRpZmllckxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaWRlbnRpZmllckNoYW5nZWQoSWRlbnRpZmllckV2ZW50IGlkZW50aWZpZXJFdmVudCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobGlzdGVuZXJUeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBQ1RJVklUWV9FTkFCTEVEX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaWRlbnRpZmllckV2ZW50Lmhhc0VuYWJsZWRDaGFuZ2VkKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFDVElWSVRZX0lEU19DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGlkZW50aWZpZXJFdmVudC5oYXNBY3Rpdml0eUlkc0NoYW5nZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaXN0ZW5lclR5cGUgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIC8vIFRlc3QgY29ycmVjdGVuZXNzIG9mIGlkZW50aWZpZXIKLSAgICAgICAgSUlkZW50aWZpZXIgYWN0aXZpdGllc0lkZW50aWZpZXIgPSBhY3Rpdml0eU1hbmFnZXIKLSAgICAgICAgICAgICAgICAuZ2V0SWRlbnRpZmllcigib3JnLmVjbGlwc2UucGF0dGVybjQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTZXQgaWRlbnRpZmllZEFjdGl2aXRpZXMgPSBhY3Rpdml0aWVzSWRlbnRpZmllci5nZXRBY3Rpdml0eUlkcygpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydFRydWUoaWRlbnRpZmllZEFjdGl2aXRpZXMuc2l6ZSgpID09IDEpOwotICAgICAgICBhc3NlcnRUcnVlKCgoU3RyaW5nKSBpZGVudGlmaWVkQWN0aXZpdGllcy50b0FycmF5KClbMF0pCi0gICAgICAgICAgICAgICAgLmVxdWFscygib3JnLmVjbGlwc2UuYWN0aXZpdHk0IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEZhbHNlKGFjdGl2aXRpZXNJZGVudGlmaWVyLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgLy8gRGlzYWJsZSBFbmFibGVkIGFjdGl2aXR5Ci0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDA7Ci0gICAgICAgIFNldCBjb3B5U2V0ID0gbmV3IEhhc2hTZXQoYWN0aXZpdHlNYW5hZ2VyLmdldEVuYWJsZWRBY3Rpdml0eUlkcygpKTsKLSAgICAgICAgY29weVNldC5yZW1vdmUoZW5hYmxlZElkZW50aWZpZXIuZ2V0QWN0aXZpdHlJZHMoKS50b0FycmF5KClbMF0pOwotICAgICAgICBhY3Rpdml0eU1hbmFnZXIuc2V0RW5hYmxlZEFjdGl2aXR5SWRzKGNvcHlTZXQpOwotICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyVHlwZSA9PSAtMSk7Ci0gICAgICAgIC8vIEVuYWJsZSBEaXNhYmxlZCBhY3Rpdml0eQotICAgICAgICBsaXN0ZW5lclR5cGUgPSAwOwotICAgICAgICBjb3B5U2V0LmFkZCgib3JnLmVjbGlwc2UuYWN0aXZpdHkzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWN0aXZpdHlNYW5hZ2VyLnNldEVuYWJsZWRBY3Rpdml0eUlkcyhjb3B5U2V0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclR5cGUgPT0gLTEpOwotICAgICAgICAvLyBBZGQgcGF0dGVybiBiaW5kaW5nCi0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDE7Ci0gICAgICAgIGZpeGVkTW9kZWxSZWdpc3RyeS5hZGRBY3Rpdml0eVBhdHRlcm5CaW5kaW5nKCJvcmcuZWNsaXBzZS5hY3Rpdml0eTEiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLnBhdHRlcm4zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyVHlwZSA9PSAtMSk7Ci0gICAgICAgIC8vIFRlc3QgY29ycmVjdGVuZXNzcyBvZiBpZGVudGlmaWVyCi0gICAgICAgIFNldCBtYW5pcHVsYXRlZElkZW50aWZpZXJzID0gYWN0aXZpdHlNYW5hZ2VyLmdldElkZW50aWZpZXIoCi0gICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLnBhdHRlcm4zIikuZ2V0QWN0aXZpdHlJZHMoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKG1hbmlwdWxhdGVkSWRlbnRpZmllcnMuc2l6ZSgpID09IDIpOwotICAgICAgICAvLyBSZW1vdmUgcGF0dGVybiBiaW5kaW5nCi0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDE7Ci0gICAgICAgIGZpeGVkTW9kZWxSZWdpc3RyeS5yZW1vdmVBY3Rpdml0eVBhdHRlcm5CaW5kaW5nKCJvcmcuZWNsaXBzZS5wYXR0ZXJuMyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUeXBlID09IC0xKTsKLSAgICAgICAgbWFuaXB1bGF0ZWRJZGVudGlmaWVycyA9IGFjdGl2aXR5TWFuYWdlci5nZXRJZGVudGlmaWVyKAotICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5wYXR0ZXJuMyIpLmdldEFjdGl2aXR5SWRzKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0VHJ1ZShtYW5pcHVsYXRlZElkZW50aWZpZXJzLnNpemUoKSA9PSAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBhY3Rpdml0eSBtYW5hZ2VyIGxpc3RlbmVyLgotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlNYW5hZ2VyTGlzdGVuZXIoKSB7Ci0gICAgICAgIGFjdGl2aXR5TWFuYWdlcgotICAgICAgICAgICAgICAgIC5hZGRBY3Rpdml0eU1hbmFnZXJMaXN0ZW5lcihuZXcgSUFjdGl2aXR5TWFuYWdlckxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpdml0eU1hbmFnZXJDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlckV2ZW50IGFjdGl2aXR5TWFuYWdlckV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGxpc3RlbmVyVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFTkFCTEVEX0FDVElWSVRZSURTX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eU1hbmFnZXJFdmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhdmVFbmFibGVkQWN0aXZpdHlJZHNDaGFuZ2VkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJTkVEX0NBVEVHT1JZSURTX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eU1hbmFnZXJFdmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhdmVEZWZpbmVkQ2F0ZWdvcnlJZHNDaGFuZ2VkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJTkVEX0FDVElWSVRZSURTX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eU1hbmFnZXJFdmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhdmVEZWZpbmVkQWN0aXZpdHlJZHNDaGFuZ2VkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyVHlwZSA9IC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIC8vIEFkZCBhbiBlbmFibGVkIGFjdGl2aXR5Ci0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDI7Ci0gICAgICAgIFNldCBlbmFibGVkU2V0ID0gbmV3IEhhc2hTZXQoYWN0aXZpdHlNYW5hZ2VyLmdldEVuYWJsZWRBY3Rpdml0eUlkcygpKTsKLSAgICAgICAgZW5hYmxlZFNldC5hZGQoIm9yZy5lY2xpcHNlLmFjdGl2aXR5MTkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhY3Rpdml0eU1hbmFnZXIuc2V0RW5hYmxlZEFjdGl2aXR5SWRzKGVuYWJsZWRTZXQpOwotICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyVHlwZSA9PSAtMSk7Ci0gICAgICAgIC8vIFJlbW92ZSBhbiBlbmFibGVkIGFjdGl2aXR5Ci0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDI7Ci0gICAgICAgIGVuYWJsZWRTZXQucmVtb3ZlKCJvcmcuZWNsaXBzZS5hY3Rpdml0eTE5Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWN0aXZpdHlNYW5hZ2VyLnNldEVuYWJsZWRBY3Rpdml0eUlkcyhlbmFibGVkU2V0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclR5cGUgPT0gLTEpOwotICAgICAgICAvLyBBZGQgY2F0ZWdyb3kKLSAgICAgICAgbGlzdGVuZXJUeXBlID0gMzsKLSAgICAgICAgZml4ZWRNb2RlbFJlZ2lzdHJ5LmFkZENhdGVnb3J5KCJvcmcuZWNsaXBzZS5jYXRlZ29yeTciLCAiQ2F0ZWdvcnkgNyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclR5cGUgPT0gLTEpOwotICAgICAgICAvLyBSZW1vdmUgY2F0ZWdvcnkKLSAgICAgICAgbGlzdGVuZXJUeXBlID0gMzsKLSAgICAgICAgZml4ZWRNb2RlbFJlZ2lzdHJ5LnJlbW92ZUNhdGVnb3J5KCJvcmcuZWNsaXBzZS5jYXRlZ29yeTciLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgIkNhdGVnb3J5IDciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUeXBlID09IC0xKTsKLSAgICAgICAgLy8gQWRkIGFjdGl2aXR5Ci0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDQ7Ci0gICAgICAgIGZpeGVkTW9kZWxSZWdpc3RyeS5hZGRBY3Rpdml0eSgib3JnLmVjbGlwc2UuYWN0aXZpdHkxOSIsICJBY3Rpdml0eSAxOSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclR5cGUgPT0gLTEpOwotICAgICAgICAvLyBSZW1vdmUgYWN0aXZpdHkKLSAgICAgICAgbGlzdGVuZXJUeXBlID0gNDsKLSAgICAgICAgZml4ZWRNb2RlbFJlZ2lzdHJ5LnJlbW92ZUFjdGl2aXR5KCJvcmcuZWNsaXBzZS5hY3Rpdml0eTE5IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICJBY3Rpdml0eSAxOSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclR5cGUgPT0gLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGFjdGl2aXR5IGxpc3RlbmVyLgotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlMaXN0ZW5lcigpIHsKLSAgICAgICAgZmluYWwgSUFjdGl2aXR5IGFjdGl2aXR5X3RvX2xpc3RlbiA9IGFjdGl2aXR5TWFuYWdlcgotICAgICAgICAgICAgICAgIC5nZXRBY3Rpdml0eSgoU3RyaW5nKSBhY3Rpdml0eU1hbmFnZXIuZ2V0RGVmaW5lZEFjdGl2aXR5SWRzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KClbMF0pOwotICAgICAgICBhY3Rpdml0eV90b19saXN0ZW4uYWRkQWN0aXZpdHlMaXN0ZW5lcihuZXcgSUFjdGl2aXR5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpdml0eUNoYW5nZWQoQWN0aXZpdHlFdmVudCBhY3Rpdml0eUV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChsaXN0ZW5lclR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklORURfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eUV2ZW50Lmhhc0RlZmluZWRDaGFuZ2VkKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEVOQUJMRURfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eUV2ZW50Lmhhc0VuYWJsZWRDaGFuZ2VkKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE5BTUVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eUV2ZW50Lmhhc05hbWVDaGFuZ2VkKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFBBVFRFUk5fQklORElOR1NfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eUV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhdmVBY3Rpdml0eVBhdHRlcm5CaW5kaW5nc0NoYW5nZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQUNUSVZJVFlfQUNUSVZJVFlfQklORElOR1NfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eUV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhdmVBY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZ3NDaGFuZ2VkKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFU0NSSVBUSU9OX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWN0aXZpdHlFdmVudC5oYXNEZXNjcmlwdGlvbkNoYW5nZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGQVVMVF9FTkFCTEVEX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWN0aXZpdHlFdmVudC5oYXNEZWZhdWx0RW5hYmxlZENoYW5nZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaXN0ZW5lclR5cGUgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIC8vIFJlbW92ZSBhY3Rpdml0eSBhbmQgY2hhbmdlIG5hbWUgY29uc2VxdWVudGx5Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaXhlZE1vZGVsUmVnaXN0cnkucmVtb3ZlQWN0aXZpdHkoYWN0aXZpdHlfdG9fbGlzdGVuLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3RvX2xpc3Rlbi5nZXROYW1lKCkpOwotICAgICAgICB9IGNhdGNoIChOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUeXBlID09IC0xKTsKLSAgICAgICAgLy8gQWRkIGFjdGl2aXR5Ci0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDU7Ci0gICAgICAgIGZpeGVkTW9kZWxSZWdpc3RyeS5hZGRBY3Rpdml0eShhY3Rpdml0eV90b19saXN0ZW4uZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAiQWN0aXZpdHkgMTgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUeXBlID09IC0xKTsKLSAgICAgICAgLy8gQWRkIHRvIGVuYWJsZWQgYWN0aXZpdHkKLSAgICAgICAgbGlzdGVuZXJUeXBlID0gNjsKLSAgICAgICAgU2V0IGVuYWJsZWRTZXQgPSBuZXcgSGFzaFNldChhY3Rpdml0eU1hbmFnZXIuZ2V0RW5hYmxlZEFjdGl2aXR5SWRzKCkpOwotICAgICAgICBlbmFibGVkU2V0LmFkZChhY3Rpdml0eV90b19saXN0ZW4uZ2V0SWQoKSk7Ci0gICAgICAgIGFjdGl2aXR5TWFuYWdlci5zZXRFbmFibGVkQWN0aXZpdHlJZHMoZW5hYmxlZFNldCk7Ci0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUeXBlID09IC0xKTsKLSAgICAgICAgLy8gUmVtb3ZlIGZyb20gZW5hYmxlZCBhY3Rpdml0eQotICAgICAgICBsaXN0ZW5lclR5cGUgPSA2OwotICAgICAgICBlbmFibGVkU2V0LnJlbW92ZShhY3Rpdml0eV90b19saXN0ZW4uZ2V0SWQoKSk7Ci0gICAgICAgIGFjdGl2aXR5TWFuYWdlci5zZXRFbmFibGVkQWN0aXZpdHlJZHMoZW5hYmxlZFNldCk7Ci0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUeXBlID09IC0xKTsKLSAgICAgICAgLy8gQWRkIHBhdHRlcm4gYmluZGluZwotICAgICAgICBsaXN0ZW5lclR5cGUgPSA4OwotICAgICAgICBmaXhlZE1vZGVsUmVnaXN0cnkuYWRkQWN0aXZpdHlQYXR0ZXJuQmluZGluZygib3JnLmVjbGlwc2UuYWN0aXZpdHkxOCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UucGF0dGVybjMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUeXBlID09IC0xKTsKLSAgICAgICAgLy8gUmVtb3ZlIHBhdHRlcm4gYmluZGluZwotICAgICAgICBsaXN0ZW5lclR5cGUgPSA4OwotICAgICAgICBmaXhlZE1vZGVsUmVnaXN0cnkucmVtb3ZlQWN0aXZpdHlQYXR0ZXJuQmluZGluZygib3JnLmVjbGlwc2UucGF0dGVybjMiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUeXBlID09IC0xKTsKLSAgICAgICAgLy8gQWRkIGFjdGl2aXR5IGFjdGl2aXR5IGJpbmRpbmcgYXMgcGFyZW50Ci0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDk7Ci0gICAgICAgIGZpeGVkTW9kZWxSZWdpc3RyeS5hZGRBY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZygKLSAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuYWN0aXZpdHk5IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGFjdGl2aXR5X3RvX2xpc3Rlbi5nZXRJZCgpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUeXBlID09IC0xKTsKLSAgICAgICAgLy8gUmVtb3ZlIGFjdGl2aXR5IGFjdGl2aXR5IGJpbmRpbmcgYXMgcGFyZW50Ci0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDk7Ci0gICAgICAgIGZpeGVkTW9kZWxSZWdpc3RyeS5yZW1vdmVBY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZygKLSAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuYWN0aXZpdHk5IiwgYWN0aXZpdHlfdG9fbGlzdGVuLmdldElkKCkpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclR5cGUgPT0gLTEpOwotICAgICAgICAvLwkJIFVwZGF0ZSBhY3Rpdml0eSBuYW1lCi0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDc7Ci0gICAgICAgIGZpeGVkTW9kZWxSZWdpc3RyeS51cGRhdGVBY3Rpdml0eU5hbWUoYWN0aXZpdHlfdG9fbGlzdGVuLmdldElkKCksCi0gICAgICAgICAgICAgICAgIm5hbWVfY2hhbmdlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclR5cGUgPT0gLTEpOwotICAgICAgICAvLyBVcGRhdGUgYWN0aXZpdHkgZGVzY3JpcHRpb24KLSAgICAgICAgbGlzdGVuZXJUeXBlID0gMTA7Ci0gICAgICAgIGZpeGVkTW9kZWxSZWdpc3RyeS51cGRhdGVBY3Rpdml0eURlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgIGFjdGl2aXR5X3RvX2xpc3Rlbi5nZXRJZCgpLCAiZGVzY3JpcHRpb25fY2hhbmdlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclR5cGUgPT0gLTEpOwotCi0gICAgICAgIC8vIGNoZWNrIGRlZmF1bHQgZW5hYmxlbWVudAotICAgICAgICBsaXN0ZW5lclR5cGUgPSBERUZBVUxUX0VOQUJMRURfQ0hBTkdFRDsKLSAgICAgICAgZml4ZWRNb2RlbFJlZ2lzdHJ5LmFkZERlZmF1bHRFbmFibGVkQWN0aXZpdHkoYWN0aXZpdHlfdG9fbGlzdGVuLmdldElkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyVHlwZSA9PSAtMSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5X3RvX2xpc3Rlbi5pc0RlZmF1bHRFbmFibGVkKCkpOwotICAgICAgICB9IGNhdGNoIChOb3REZWZpbmVkRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICBmYWlsKGUxLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGxpc3RlbmVyVHlwZSA9IERFRkFVTFRfRU5BQkxFRF9DSEFOR0VEOwotICAgICAgICBmaXhlZE1vZGVsUmVnaXN0cnkucmVtb3ZlRGVmYXVsdEVuYWJsZWRBY3Rpdml0eShhY3Rpdml0eV90b19saXN0ZW4uZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUeXBlID09IC0xKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKGFjdGl2aXR5X3RvX2xpc3Rlbi5pc0RlZmF1bHRFbmFibGVkKCkpOwotICAgICAgICB9IGNhdGNoIChOb3REZWZpbmVkRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICBmYWlsKGUxLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBjYXRlZ29yeSBsaXN0ZW5lci4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENhdGVnb3J5TGlzdGVuZXIoKSB7Ci0gICAgICAgIGZpbmFsIElDYXRlZ29yeSBjYXRlZ29yeV90b19saXN0ZW4gPSBhY3Rpdml0eU1hbmFnZXIKLSAgICAgICAgICAgICAgICAuZ2V0Q2F0ZWdvcnkoKFN0cmluZykgYWN0aXZpdHlNYW5hZ2VyLmdldERlZmluZWRDYXRlZ29yeUlkcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAudG9BcnJheSgpWzBdKTsKLSAgICAgICAgY2F0ZWdvcnlfdG9fbGlzdGVuLmFkZENhdGVnb3J5TGlzdGVuZXIobmV3IElDYXRlZ29yeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY2F0ZWdvcnlDaGFuZ2VkKENhdGVnb3J5RXZlbnQgY2F0ZWdvcnlFdmVudCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobGlzdGVuZXJUeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJTkVEX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY2F0ZWdvcnlFdmVudC5oYXNEZWZpbmVkQ2hhbmdlZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBOQU1FX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY2F0ZWdvcnlFdmVudC5oYXNOYW1lQ2hhbmdlZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBQQVRURVJOX0JJTkRJTkdTX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY2F0ZWdvcnlFdmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXZlQ2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmdzQ2hhbmdlZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERVNDUklQVElPTl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAvLwlhc3NlcnRUcnVlKGNhdGVnb3J5RXZlbnQuaGFzRGVzY3JpcHRpb25DaGFuZ2VkKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJUeXBlID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAvLyBSZW1vdmUgY2F0ZWdvcnksIGFuZCBjaGFuZ2UgbmFtZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZml4ZWRNb2RlbFJlZ2lzdHJ5LnJlbW92ZUNhdGVnb3J5KGNhdGVnb3J5X3RvX2xpc3Rlbi5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV90b19saXN0ZW4uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUeXBlID09IC0xKTsKLSAgICAgICAgLy8gQWRkIGNhdGVnb3J5Ci0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDU7Ci0gICAgICAgIGZpeGVkTW9kZWxSZWdpc3RyeQotICAgICAgICAgICAgICAgIC5hZGRDYXRlZ29yeShjYXRlZ29yeV90b19saXN0ZW4uZ2V0SWQoKSwgIkNhdGVnb3J5IDYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUeXBlID09IC0xKTsKLSAgICAgICAgLy8gQWRkIGNhdGVnb3J5IGFjdGl2aXR5IGJpbmRpbmcKLSAgICAgICAgbGlzdGVuZXJUeXBlID0gODsKLSAgICAgICAgZml4ZWRNb2RlbFJlZ2lzdHJ5LmFkZENhdGVnb3J5QWN0aXZpdHlCaW5kaW5nKChTdHJpbmcpIGFjdGl2aXR5TWFuYWdlcgotICAgICAgICAgICAgICAgIC5nZXREZWZpbmVkQWN0aXZpdHlJZHMoKS50b0FycmF5KClbNF0sIGNhdGVnb3J5X3RvX2xpc3RlbgotICAgICAgICAgICAgICAgIC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyVHlwZSA9PSAtMSk7Ci0gICAgICAgIC8vIFJlbW92ZSBhY3Rpdml0eSBhY3Rpdml0eSBiaW5kaW5nCi0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDg7Ci0gICAgICAgIGZpeGVkTW9kZWxSZWdpc3RyeS5yZW1vdmVDYXRlZ29yeUFjdGl2aXR5QmluZGluZygKLSAgICAgICAgICAgICAgICAoU3RyaW5nKSBhY3Rpdml0eU1hbmFnZXIuZ2V0RGVmaW5lZEFjdGl2aXR5SWRzKCkudG9BcnJheSgpWzRdLAotICAgICAgICAgICAgICAgIGNhdGVnb3J5X3RvX2xpc3Rlbi5nZXRJZCgpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIC8vIENoYW5nZSBjYXRlZ29yeSBkZXNjcmlwdGlvbgotICAgICAgICBsaXN0ZW5lclR5cGUgPSAxMDsKLSAgICAgICAgZml4ZWRNb2RlbFJlZ2lzdHJ5LnVwZGF0ZUNhdGVnb3J5RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgY2F0ZWdvcnlfdG9fbGlzdGVuLmdldElkKCksICJkZXNjcmlwdGlvbl9jaGFuZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYXRlZ29yeV90b19saXN0ZW4uZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbl9jaGFuZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyVHlwZSA9PSAtMSk7Ci0gICAgICAgIC8vIENoYW5nZSBjYXRlZ29yeSBuYW1lCi0gICAgICAgIGxpc3RlbmVyVHlwZSA9IDc7Ci0gICAgICAgIGZpeGVkTW9kZWxSZWdpc3RyeS51cGRhdGVDYXRlZ29yeU5hbWUoY2F0ZWdvcnlfdG9fbGlzdGVuLmdldElkKCksCi0gICAgICAgICAgICAgICAgIm5hbWVfY2hhbmdlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY2F0ZWdvcnlfdG9fbGlzdGVuLmdldE5hbWUoKS5lcXVhbHMoIm5hbWVfY2hhbmdlIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclR5cGUgPT0gLTEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWN0aXZpdGllcy9JbWFnZXNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FjdGl2aXRpZXMvSW1hZ2VzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTQ3NmJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWN0aXZpdGllcy9JbWFnZXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFjdGl2aXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hHcmFwaGljQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuSW1hZ2VUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZXNUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEltYWdlIGRlZmF1bHRJbWFnZTsKLQlwcml2YXRlIEltYWdlIGltYWdlMTsKLQlwcml2YXRlIEltYWdlIGltYWdlMjsKLQotCS8qKgotCSAqIEBwYXJhbSB0ZXN0TmFtZQotCSAqLwotCXB1YmxpYyBJbWFnZXNUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY3Rpdml0eUltYWdlcygpIHsKLQkJSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCBzdXBwb3J0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKTsKLQkJSUFjdGl2aXR5IGFjdGl2aXR5MSA9IHN1cHBvcnQuZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0QWN0aXZpdHkoIm9yZy5lY2xpcHNlLmFjdGl2aXR5MSIpOwotCQlhc3NlcnROb3ROdWxsKGFjdGl2aXR5MSk7Ci0JCWFzc2VydFRydWUoYWN0aXZpdHkxLmlzRGVmaW5lZCgpKTsKLQkJSUFjdGl2aXR5IGFjdGl2aXR5MiA9IHN1cHBvcnQuZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0QWN0aXZpdHkoIm9yZy5lY2xpcHNlLmFjdGl2aXR5MiIpOwotCQlhc3NlcnROb3ROdWxsKGFjdGl2aXR5Mik7Ci0JCWFzc2VydFRydWUoYWN0aXZpdHkyLmlzRGVmaW5lZCgpKTsKLQkJCi0JCUltYWdlRGVzY3JpcHRvciBkZWZhdWx0SW1hZ2VEZXNjID0gV29ya2JlbmNoSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJV29ya2JlbmNoR3JhcGhpY0NvbnN0YW50cy5JTUdfT0JKX0FDVElWSVRZKTsJCQotCQlkZWZhdWx0SW1hZ2UgPSBkZWZhdWx0SW1hZ2VEZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQotCQlJbWFnZURlc2NyaXB0b3IgZGVzYzEgPSBzdXBwb3J0LmdldEltYWdlRGVzY3JpcHRvcihhY3Rpdml0eTEpOwotCQlpbWFnZTEgPSBkZXNjMS5jcmVhdGVJbWFnZSgpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShkZWZhdWx0SW1hZ2VEZXNjLCBkZXNjMSk7Ci0JICAgIEltYWdlVGVzdHMuYXNzZXJ0Tm90RXF1YWxzKGRlZmF1bHRJbWFnZSwgaW1hZ2UxKTsKLQkgICAgCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjMiA9IHN1cHBvcnQuZ2V0SW1hZ2VEZXNjcmlwdG9yKGFjdGl2aXR5Mik7Ci0JCWltYWdlMiA9IGRlc2MyLmNyZWF0ZUltYWdlKCk7Ci0JCQotCQlhc3NlcnRTYW1lKGRlZmF1bHRJbWFnZURlc2MsIGRlc2MyKTsKLQkJSW1hZ2VUZXN0cy5hc3NlcnRFcXVhbHMoZGVmYXVsdEltYWdlLCBpbWFnZTIpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlJbWFnZXMoKSB7Ci0JCUlXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgc3VwcG9ydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCk7Ci0JCUlDYXRlZ29yeSBjYXRlZ29yeTEgPSBzdXBwb3J0LmdldEFjdGl2aXR5TWFuYWdlcigpLmdldENhdGVnb3J5KCJvcmcuZWNsaXBzZS5jYXRlZ29yeTEiKTsKLQkJYXNzZXJ0Tm90TnVsbChjYXRlZ29yeTEpOwotCQlhc3NlcnRUcnVlKGNhdGVnb3J5MS5pc0RlZmluZWQoKSk7Ci0JCUlDYXRlZ29yeSBjYXRlZ29yeTIgPSBzdXBwb3J0LmdldEFjdGl2aXR5TWFuYWdlcigpLmdldENhdGVnb3J5KCJvcmcuZWNsaXBzZS5jYXRlZ29yeTIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjYXRlZ29yeTIpOwotCQlhc3NlcnRUcnVlKGNhdGVnb3J5Mi5pc0RlZmluZWQoKSk7Ci0JCQotCQlJbWFnZURlc2NyaXB0b3IgZGVmYXVsdEltYWdlRGVzYyA9IFdvcmtiZW5jaEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVdvcmtiZW5jaEdyYXBoaWNDb25zdGFudHMuSU1HX09CSl9BQ1RJVklUWV9DQVRFR09SWSk7CQkKLQkJZGVmYXVsdEltYWdlID0gZGVmYXVsdEltYWdlRGVzYy5jcmVhdGVJbWFnZSgpOwotCQkKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MxID0gc3VwcG9ydC5nZXRJbWFnZURlc2NyaXB0b3IoY2F0ZWdvcnkxKTsKLQkJaW1hZ2UxID0gZGVzYzEuY3JlYXRlSW1hZ2UoKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUoZGVmYXVsdEltYWdlRGVzYywgZGVzYzEpOwotCSAgICBJbWFnZVRlc3RzLmFzc2VydE5vdEVxdWFscyhkZWZhdWx0SW1hZ2UsIGltYWdlMSk7Ci0JICAgIAotCQlJbWFnZURlc2NyaXB0b3IgZGVzYzIgPSBzdXBwb3J0LmdldEltYWdlRGVzY3JpcHRvcihjYXRlZ29yeTIpOwotCQlpbWFnZTIgPSBkZXNjMi5jcmVhdGVJbWFnZSgpOwotCQkKLQkJYXNzZXJ0U2FtZShkZWZhdWx0SW1hZ2VEZXNjLCBkZXNjMik7Ci0JCUltYWdlVGVzdHMuYXNzZXJ0RXF1YWxzKGRlZmF1bHRJbWFnZSwgaW1hZ2UyKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGRvVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuZG9UZWFyRG93bigpOwotCQlpZiAoZGVmYXVsdEltYWdlICE9IG51bGwpCi0JCQlkZWZhdWx0SW1hZ2UuZGlzcG9zZSgpOwotCQlpZiAoaW1hZ2UxICE9IG51bGwpCi0JCQlpbWFnZTEuZGlzcG9zZSgpOwotCQlpZiAoaW1hZ2UyICE9IG51bGwpCi0JCQlpbWFnZTIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWN0aXZpdGllcy9QZXJzaXN0YW5jZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWN0aXZpdGllcy9QZXJzaXN0YW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNiZGQzNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FjdGl2aXRpZXMvUGVyc2lzdGFuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hY3Rpdml0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuTm90RGVmaW5lZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyB0aGF0IHRoZSBQZXJzaXN0YW5jZSBjbGFzcyBpcyBjYXRjaGluZyBtYWxmb3JtZWQgcmVnaXN0cnkgZW50cmllcy4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGFuY2VUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUGVyc2lzdGFuY2VUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENhdGVnb3J5UGVybXV0YXRpb25zKCkgewotICAgICAgICB0cnkgewotCSAgICAgICAgSUFjdGl2aXR5TWFuYWdlciBtYW5hZ2VyID0gZldvcmtiZW5jaC5nZXRBY3Rpdml0eVN1cHBvcnQoKS5nZXRBY3Rpdml0eU1hbmFnZXIoKTsKLQkgICAgICAgIElDYXRlZ29yeSBjYXRlZ29yeSA9IG1hbmFnZXIuZ2V0Q2F0ZWdvcnkoIm9yZy5lY2xpcHNlLnVpLlBULkMxIik7IC8vIHNob3VsZCBub3QgYmUgZGVmaW5lZCAtIG1pc3NpbmcgbmFtZQotCSAgICAgICAgYXNzZXJ0RmFsc2UoY2F0ZWdvcnkuaXNEZWZpbmVkKCkpOwotCSAgICAgICAgCi0JICAgICAgICBjYXRlZ29yeSA9IG1hbmFnZXIuZ2V0Q2F0ZWdvcnkoIm9yZy5lY2xpcHNlLnVpLlBULkMyIik7IC8vIHNob3VsZCBiZSBkZWZpbmVkIC0gbWlzc2luZyBkZXNjCi0JICAgICAgICBhc3NlcnRUcnVlKGNhdGVnb3J5LmlzRGVmaW5lZCgpKTsKLQkgICAgICAgIGFzc2VydE5vdE51bGwoY2F0ZWdvcnkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JICAgICAgICAKLQkgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1hbmFnZXIuZ2V0RGVmaW5lZENhdGVnb3J5SWRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCSAgICAgICAgICAgIGlmIChtYW5hZ2VyLmdldENhdGVnb3J5KChTdHJpbmcpIGkubmV4dCgpKS5nZXROYW1lKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51aS5QVC5DMyIpKQotCSAgICAgICAgICAgICAgICBmYWlsKCJGb3VuZCBjYXRlZ29yeSB0aGF0IHNob3VsZCBub3QgYmUuIik7Ci0JICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZ3MoKSB7Ci0gICAgICAgIElBY3Rpdml0eU1hbmFnZXIgbWFuYWdlciA9IGZXb3JrYmVuY2guZ2V0QWN0aXZpdHlTdXBwb3J0KCkuZ2V0QWN0aXZpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIElBY3Rpdml0eSBhY3Rpdml0eSAgPSBtYW5hZ2VyLmdldEFjdGl2aXR5KCJvcmcuZWNsaXBzZS51aS5QVC5BMiIpOwotICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5LmdldEFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5ncygpLmlzRW1wdHkoKSk7ICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEFjdGl2aXR5UGF0dGVybkJpbmRpbmdzKCkgewotICAgICAgICBJQWN0aXZpdHlNYW5hZ2VyIG1hbmFnZXIgPSBmV29ya2JlbmNoLmdldEFjdGl2aXR5U3VwcG9ydCgpLmdldEFjdGl2aXR5TWFuYWdlcigpOwotICAgICAgICBJQWN0aXZpdHkgYWN0aXZpdHkgID0gbWFuYWdlci5nZXRBY3Rpdml0eSgib3JnLmVjbGlwc2UudWkuUFQuQTIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eS5nZXRBY3Rpdml0eVBhdHRlcm5CaW5kaW5ncygpLmlzRW1wdHkoKSk7ICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmdzKCkgewotICAgICAgICBJQWN0aXZpdHlNYW5hZ2VyIG1hbmFnZXIgPSBmV29ya2JlbmNoLmdldEFjdGl2aXR5U3VwcG9ydCgpLmdldEFjdGl2aXR5TWFuYWdlcigpOwotICAgICAgICBJQ2F0ZWdvcnkgY2F0ZWdvcnkgID0gbWFuYWdlci5nZXRDYXRlZ29yeSgib3JnLmVjbGlwc2UudWkuUFQuQzIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjYXRlZ29yeS5nZXRDYXRlZ29yeUFjdGl2aXR5QmluZGluZ3MoKS5pc0VtcHR5KCkpOyAgICAgCi0gICAgfSAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlQZXJtdXRhdGlvbnMoKSB7Ci0gICAgICAgIHRyeSB7Ci0JICAgICAgICBJQWN0aXZpdHlNYW5hZ2VyIG1hbmFnZXIgPSBmV29ya2JlbmNoLmdldEFjdGl2aXR5U3VwcG9ydCgpLmdldEFjdGl2aXR5TWFuYWdlcigpOwotCSAgICAgICAgSUFjdGl2aXR5IGFjdGl2aXR5ID0gbWFuYWdlci5nZXRBY3Rpdml0eSgib3JnLmVjbGlwc2UudWkuUFQuQTEiKTsgLy8gc2hvdWxkIG5vdCBiZSBkZWZpbmVkIC0gbWlzc2luZyBuYW1lCi0JICAgICAgICBhc3NlcnRGYWxzZShhY3Rpdml0eS5pc0RlZmluZWQoKSk7Ci0JICAgICAgICAKLQkgICAgICAgIGFjdGl2aXR5ID0gbWFuYWdlci5nZXRBY3Rpdml0eSgib3JnLmVjbGlwc2UudWkuUFQuQTIiKTsgLy8gc2hvdWxkIGJlIGRlZmluZWQgLSBtaXNzaW5nIGRlc2MKLQkgICAgICAgIGFzc2VydFRydWUoYWN0aXZpdHkuaXNEZWZpbmVkKCkpOwotCSAgICAgICAgYXNzZXJ0Tm90TnVsbChhY3Rpdml0eS5nZXREZXNjcmlwdGlvbigpKTsKLQkgICAgICAgIAotCSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWFuYWdlci5nZXREZWZpbmVkQWN0aXZpdHlJZHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JICAgICAgICAgICAgaWYgKG1hbmFnZXIuZ2V0QWN0aXZpdHkoKFN0cmluZykgaS5uZXh0KCkpLmdldE5hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVpLlBULkEzIikpCi0JICAgICAgICAgICAgICAgIGZhaWwoIkZvdW5kIGFjdGl2aXR5IHRoYXQgc2hvdWxkIG5vdCBiZS4iKTsKLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWN0aXZpdGllcy9TdGF0aWNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FjdGl2aXRpZXMvU3RhdGljVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDJkM2MzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWN0aXZpdGllcy9TdGF0aWNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFjdGl2aXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklBY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklBY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQWN0aXZpdHlQYXR0ZXJuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuTm90RGVmaW5lZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYWN0aXZpdGllcy5BY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5hY3Rpdml0aWVzLkNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIAotICogVGhlIHN0YXRpYyB0ZXN0IHJlYWRzIGFjdGl2aXR5IGRlZmluaXRpb25zIGZyb20gdGhlIHBsdWdpbi54bWwgKGluCi0gKiBvcmcuZWNsaXBzZS51aS50ZXN0cykgZmlsZSBhbmQgdmFsaWRlcyBpdHMgY29udGVudC4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRpY1Rlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLSAgICBwcml2YXRlIElBY3Rpdml0eU1hbmFnZXIgYWN0aXZpdHlNYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBMaXN0IGNhdGVnb3J5SWRzOwotCi0gICAgcHJpdmF0ZSBMaXN0IGFjdGl2aXR5SWRzOwotCi0gICAgcHJpdmF0ZSBMaXN0IHBhdHRlcm5BY3Rpdml0eUlkczsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqICAgICAgICAgICAgVGVzdCdzIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0YXRpY1Rlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICAgICAgYWN0aXZpdHlNYW5hZ2VyID0gV29ya2JlbmNoLmdldEluc3RhbmNlKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkKLSAgICAgICAgICAgICAgICAuZ2V0QWN0aXZpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIHBvcHVsYXRlSWRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGUgdGhlIGlkIGFycmF5cy4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlSWRzKCkgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBjYXRlZ29yeUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbmRleCA9IDE7IGluZGV4IDw9IDY7IGluZGV4KyspCi0gICAgICAgICAgICBjYXRlZ29yeUlkcy5hZGQoIm9yZy5lY2xpcHNlLmNhdGVnb3J5IiArIEludGVnZXIudG9TdHJpbmcoaW5kZXgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhY3Rpdml0eUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbmRleCA9IDE7IGluZGV4IDw9IDE4OyBpbmRleCsrKQotICAgICAgICAgICAgYWN0aXZpdHlJZHMuYWRkKCJvcmcuZWNsaXBzZS5hY3Rpdml0eSIgKyBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcGF0dGVybkFjdGl2aXR5SWRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAzOyBpbmRleCsrKQotICAgICAgICAgICAgcGF0dGVybkFjdGl2aXR5SWRzLmFkZChhY3Rpdml0eUlkcy50b0FycmF5KClbaW5kZXhdKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBhY3Rpdml0eSBtYW5hZ2VyJ3MgY29udGVudC4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFjdGl2aXR5TWFuYWdlcigpIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhlIGRlZmluZWQgY2F0ZWdvcnkgSWRzCi0gICAgICAgIGFzc2VydFRydWUoYWN0aXZpdHlNYW5hZ2VyLmdldERlZmluZWRDYXRlZ29yeUlkcygpLmNvbnRhaW5zQWxsKAotICAgICAgICAgICAgICAgIGNhdGVnb3J5SWRzKSk7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBkZWZpbmVkIGFjdGl2aXR5IElkcwotICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5TWFuYWdlci5nZXREZWZpbmVkQWN0aXZpdHlJZHMoKS5jb250YWluc0FsbCgKLSAgICAgICAgICAgICAgICBhY3Rpdml0eUlkcykpOwotICAgICAgICAvLyBDaGVjayBlbmFibGVkIGFjdGl2aXR5IElkcwotICAgICAgICBmb3IgKGludCBpbmRleCA9IDE7IGluZGV4IDw9IDQ7IGluZGV4KyspCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5TWFuYWdlci5nZXRFbmFibGVkQWN0aXZpdHlJZHMoKS5jb250YWlucygKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmFjdGl2aXR5IiArIEludGVnZXIudG9TdHJpbmcoaW5kZXgpKSk7Ci0gICAgICAgIC8vIENoZWNrIGlkZW50aWZpZXIKLSAgICAgICAgSUlkZW50aWZpZXIgYWN0aXZpdHlJZGVudGlmaWVyID0gYWN0aXZpdHlNYW5hZ2VyCi0gICAgICAgICAgICAgICAgLmdldElkZW50aWZpZXIoIm9yZy5lY2xpcHNlLnBhdHRlcm4xIik7Ci0gICAgICAgIFNldCBhY3Rpdml0eUlkcyA9IGFjdGl2aXR5SWRlbnRpZmllci5nZXRBY3Rpdml0eUlkcygpOwotICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5SWRzLmNvbnRhaW5zQWxsKHBhdHRlcm5BY3Rpdml0eUlkcykpOwotICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5SWRlbnRpZmllci5nZXRJZCgpLmVxdWFscygib3JnLmVjbGlwc2UucGF0dGVybjEiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBhbiBhY3Rpdml0aWUncyBjb250ZW50LgotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHkoKSB7Ci0gICAgICAgIElBY3Rpdml0eSBmaXJzdF9hY3Rpdml0eSA9IGFjdGl2aXR5TWFuYWdlcgotICAgICAgICAgICAgICAgIC5nZXRBY3Rpdml0eSgoU3RyaW5nKSBhY3Rpdml0eUlkcy50b0FycmF5KClbMF0pOwotICAgICAgICAvLyBDaGVjayBhY3Rpdml0eSBhY3Rpdml0eSBiaW5kaW5ncyBmb3IgcGFyZW50IGFjdGl2aXR5Ci0gICAgICAgIFNldCBhY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZ3MgPSBmaXJzdF9hY3Rpdml0eQotICAgICAgICAgICAgICAgIC5nZXRBY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZ3MoKTsKLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAyOyBpbmRleCA8PSA3OyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5ncwotICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMobmV3IEFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5hY3Rpdml0eSIgKyBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuYWN0aXZpdHkxIikpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayBhY3Rpdml0eSBwYXR0ZXJuIGJpbmRpbmdzCi0gICAgICAgIFNldCBhY3Rpdml0eVBhdHRlcm5CaW5kaW5ncyA9IGZpcnN0X2FjdGl2aXR5Ci0gICAgICAgICAgICAgICAgLmdldEFjdGl2aXR5UGF0dGVybkJpbmRpbmdzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoYWN0aXZpdHlQYXR0ZXJuQmluZGluZ3Muc2l6ZSgpICE9IDApOwotICAgICAgICBJQWN0aXZpdHlQYXR0ZXJuQmluZGluZyBhY3Rpdml0eVBhdHRlcm5CaW5kaW5nID0gKElBY3Rpdml0eVBhdHRlcm5CaW5kaW5nKSBhY3Rpdml0eVBhdHRlcm5CaW5kaW5ncwotICAgICAgICAgICAgICAgIC50b0FycmF5KClbMF07Ci0gICAgICAgIGFzc2VydFRydWUoYWN0aXZpdHlQYXR0ZXJuQmluZGluZy5nZXRBY3Rpdml0eUlkKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgIGZpcnN0X2FjdGl2aXR5LmdldElkKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eVBhdHRlcm5CaW5kaW5nLmdldFBhdHRlcm4oKS5wYXR0ZXJuKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5wYXR0ZXJuMSIpKTsKLSAgICAgICAgLy8gQ2hlY2sgZGVzY3JpcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZmlyc3RfYWN0aXZpdHkuZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHMoImRlc2NyaXB0aW9uIikpOwotICAgICAgICB9IGNhdGNoIChOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2hlY2sgYWN0aXZpdHkgaWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShmaXJzdF9hY3Rpdml0eS5nZXRJZCgpLmVxdWFscygib3JnLmVjbGlwc2UuYWN0aXZpdHkxIikpOwotICAgICAgICAvLyBDaGVjayBhY3Rpdml0eSBuYW1lCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZpcnN0X2FjdGl2aXR5LmdldE5hbWUoKS5lcXVhbHMoIkFjdGl2aXR5IDEiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgYSBjYXRlZ29yeSdzIGNvbnRlbnQuCi0gICAgICogIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDYXRlZ29yeSgpIHsKLSAgICAgICAgSUNhdGVnb3J5IGZpcnN0X2NhdGVnb3J5ID0gYWN0aXZpdHlNYW5hZ2VyCi0gICAgICAgICAgICAgICAgLmdldENhdGVnb3J5KChTdHJpbmcpIGNhdGVnb3J5SWRzLnRvQXJyYXkoKVswXSk7Ci0gICAgICAgIC8vIENoZWNrIGNhdGVnb3J5IGFjdGl2aXR5IGJpbmRpbmdzCi0gICAgICAgIFNldCBjYXRlZ29yeUFjdGl2aXR5QmluZGluZ3MgPSBmaXJzdF9jYXRlZ29yeQotICAgICAgICAgICAgICAgIC5nZXRDYXRlZ29yeUFjdGl2aXR5QmluZGluZ3MoKTsKLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAxOyBpbmRleCA8PSA0OyBpbmRleCsrKQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYXRlZ29yeUFjdGl2aXR5QmluZGluZ3MKLSAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKG5ldyBDYXRlZ29yeUFjdGl2aXR5QmluZGluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuYWN0aXZpdHkiICsgSW50ZWdlci50b1N0cmluZyhpbmRleCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfY2F0ZWdvcnkuZ2V0SWQoKSkpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENoZWNrIGNhdGVnb3J5IGRlc2NyaXB0aW9uCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZpcnN0X2NhdGVnb3J5LmdldERlc2NyaXB0aW9uKCkuZXF1YWxzKCJkZXNjcmlwdGlvbiIpKTsKLSAgICAgICAgfSBjYXRjaCAoTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIGNhdGVnb3J5IGlkCi0gICAgICAgIGFzc2VydFRydWUoZmlyc3RfY2F0ZWdvcnkuZ2V0SWQoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmNhdGVnb3J5MSIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENoZWNrIGNhdGVnb3J5IG5hbWUKLSAgICAgICAgICAgIGFzc2VydFRydWUoZmlyc3RfY2F0ZWdvcnkuZ2V0TmFtZSgpLmVxdWFscygiQ2F0ZWdvcnkgMSIpKTsKLSAgICAgICAgfSBjYXRjaCAoTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hY3Rpdml0aWVzL1V0aWxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FjdGl2aXRpZXMvVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhODA4Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FjdGl2aXRpZXMvVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYWN0aXZpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUFjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLldvcmtiZW5jaEFjdGl2aXR5SGVscGVyOwotCi0vKioKLSAqIFRlc3RzIHZhcmlvdXMgdXRpbGl0eSBtZXRob2RzIG9uIFdvcmtiZW5jaEFjdGl2aXR5SGVscGVyLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIFNldCByZW1lbWJlcmVkU2V0OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEMSA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEMiA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEMyA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElENCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElENSA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjUiOwotCQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFV0aWxUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOyAKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgaWYgeW91IGVuYWJsZSBjYXQgMSB0aGVuIGNhdCAzIHdvdWxkIGFsc28gYmUgZW5hYmxlZCAodGhleQotCSAqIGNvbnRhaW4gdGhlIHNhbWUgYWN0aXZpdHkpLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRFbmFibGVkQ2F0ZWdvcmllczEoKSB7Ci0JCVNldCBpZHMgPSBXb3JrYmVuY2hBY3Rpdml0eUhlbHBlci5nZXRFbmFibGVkQ2F0ZWdvcmllcyhnZXRBY3Rpdml0eU1hbmFnZXIoKSwgSUQxKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGlkcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGlkcy5jb250YWlucyhJRDMpKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgaWYgeW91IGVuYWJsZSBjYXQgMiB0aGVuIGNhdCAxIGFuZCBjYXQgMyB3b3VsZCBhbHNvIGJlCi0JICogZW5hYmxlZC4gQ2F0IDIgaGFzIGFjdGl2aXR5IDIsIHdoaWNoIGRlcGVuZHMgb24gYWN0aXZpdHkgMS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW5hYmxlZENhdGVnb3JpZXMyKCkgewotCQlTZXQgaWRzID0gV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuZ2V0RW5hYmxlZENhdGVnb3JpZXMoZ2V0QWN0aXZpdHlNYW5hZ2VyKCksIElEMik7Ci0JCWFzc2VydEVxdWFscygyLCBpZHMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZHMuY29udGFpbnMoSUQxKSk7Ci0JCWFzc2VydFRydWUoaWRzLmNvbnRhaW5zKElEMykpOwotCX0KLQkJCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGlmIHlvdSBlbmFibGUgY2F0IDMgdGhlbiBjYXQgMSB3b3VsZCBhbHNvIGJlIGVuYWJsZWQgKHRoZXkKLQkgKiBjb250YWluIHRoZSBzYW1lIGFjdGl2aXR5KS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW5hYmxlZENhdGVnb3JpZXMzKCkgewotCQlTZXQgaWRzID0gV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuZ2V0RW5hYmxlZENhdGVnb3JpZXMoZ2V0QWN0aXZpdHlNYW5hZ2VyKCksIElEMyk7Ci0JCWFzc2VydEVxdWFscygxLCBpZHMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZHMuY29udGFpbnMoSUQxKSk7Ci0JfQotCQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBpZiB5b3UgZW5hYmxlIGNhdCA0IHRoZW4gbm8gb3RoZXIgY2F0ZWdvcmllcyB3b3VsZCBjaGFuZ2UuLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRFbmFibGVkQ2F0ZWdvcmllczQoKSB7Ci0JCVNldCBpZHMgPSBXb3JrYmVuY2hBY3Rpdml0eUhlbHBlci5nZXRFbmFibGVkQ2F0ZWdvcmllcyhnZXRBY3Rpdml0eU1hbmFnZXIoKSwgSUQ0KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlkcy5zaXplKCkpOwotCX0KLQkKLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgaWYgeW91IGVuYWJsZSBjYXQgNSB0aGVuIGNhdCA0IHdpbGwgYmVjb21lIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW5hYmxlZENhdGVnb3JpZXM1KCkgewotCQlTZXQgaWRzID0gV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuZ2V0RW5hYmxlZENhdGVnb3JpZXMoZ2V0QWN0aXZpdHlNYW5hZ2VyKCksIElENSk7Ci0JCWFzc2VydEVxdWFscygxLCBpZHMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZHMuY29udGFpbnMoSUQ0KSk7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGlmIHlvdSBlbmFibGUgY2F0IDEgd2hlbiBpdCdzIGFjdGl2aXR5IGlzIGFscmVhZHkgZW5hYmxlZAotCSAqIHRoZW4gbm8gY2F0ZWdvcmllcyB3b3VsZCBjaGFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldEVuYWJsZWRDYXRlZ29yaWVzMV9BKCkgewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoSUQxKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKS5zZXRFbmFibGVkQWN0aXZpdHlJZHMoc2V0KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIFdvcmtiZW5jaEFjdGl2aXR5SGVscGVyLmdldEVuYWJsZWRDYXRlZ29yaWVzKGdldEFjdGl2aXR5TWFuYWdlcigpLCBJRDEpLnNpemUoKSk7Ci0JfQotCQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBpZiB5b3UgZW5hYmxlIGNhdCAyIHdoZW4gaXQncyBhY3Rpdml0eSBpcyBhbHJlYWR5IGVuYWJsZWQKLQkgKiB0aGVuIG5vIGNhdGVnb3JpZXMgd291bGQgY2hhbmdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRFbmFibGVkQ2F0ZWdvcmllczJfQSgpIHsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlzZXQuYWRkKElEMik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkuc2V0RW5hYmxlZEFjdGl2aXR5SWRzKHNldCk7Ci0JCWFzc2VydEVxdWFscygwLCBXb3JrYmVuY2hBY3Rpdml0eUhlbHBlci5nZXRFbmFibGVkQ2F0ZWdvcmllcyhnZXRBY3Rpdml0eU1hbmFnZXIoKSwgSUQyKS5zaXplKCkpOwotCX0KLQkKLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgaWYgeW91IGVuYWJsZSBjYXQgMyB3aGVuIGl0J3MgYWN0aXZpdHkgaXMgYWxyZWFkeSBlbmFibGVkCi0JICogdGhlbiBubyBjYXRlZ29yaWVzIHdvdWxkIGNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW5hYmxlZENhdGVnb3JpZXMzX0EoKSB7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJc2V0LmFkZChJRDEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2aXR5U3VwcG9ydCgpLnNldEVuYWJsZWRBY3Rpdml0eUlkcyhzZXQpOwotCQlhc3NlcnRFcXVhbHMoMCwgV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuZ2V0RW5hYmxlZENhdGVnb3JpZXMoZ2V0QWN0aXZpdHlNYW5hZ2VyKCksIElEMykuc2l6ZSgpKTsKLQl9CQotCQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBpZiB5b3UgZW5hYmxlIGNhdCA0IHdoZW4gaXQncyBhY3Rpdml0eSBpcyBhbHJlYWR5IGVuYWJsZWQKLQkgKiB0aGVuIG5vIGNhdGVnb3JpZXMgd291bGQgY2hhbmdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRFbmFibGVkQ2F0ZWdvcmllczRfQSgpIHsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlzZXQuYWRkKElENCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkuc2V0RW5hYmxlZEFjdGl2aXR5SWRzKHNldCk7Ci0JCWFzc2VydEVxdWFscygwLCBXb3JrYmVuY2hBY3Rpdml0eUhlbHBlci5nZXRFbmFibGVkQ2F0ZWdvcmllcyhnZXRBY3Rpdml0eU1hbmFnZXIoKSwgSUQ0KS5zaXplKCkpOwotCX0KLQkKLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgaWYgeW91IGVuYWJsZSBjYXQgNSB3aGVuIGFjdGl2aXR5IDQgaXMgYWxyZWFkeSBlbmFibGVkCi0JICogdGhlbiBubyBjYXRlZ29yaWVzIHdvdWxkIGNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW5hYmxlZENhdGVnb3JpZXM1X0FhKCkgewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoSUQ0KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKS5zZXRFbmFibGVkQWN0aXZpdHlJZHMoc2V0KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIFdvcmtiZW5jaEFjdGl2aXR5SGVscGVyLmdldEVuYWJsZWRDYXRlZ29yaWVzKGdldEFjdGl2aXR5TWFuYWdlcigpLCBJRDUpLnNpemUoKSk7Ci0JfQotCQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBpZiB5b3UgZW5hYmxlIGNhdCA1IHdoZW4gYWN0aXZpdHkgNSBpcyBhbHJlYWR5IGVuYWJsZWQKLQkgKiB0aGVuIGNhdCA0IHdvdWxkIGNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW5hYmxlZENhdGVnb3JpZXM1X0FiKCkgewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoSUQ1KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKS5zZXRFbmFibGVkQWN0aXZpdHlJZHMoc2V0KTsKLQkJU2V0IGlkcyA9IFdvcmtiZW5jaEFjdGl2aXR5SGVscGVyLmdldEVuYWJsZWRDYXRlZ29yaWVzKGdldEFjdGl2aXR5TWFuYWdlcigpLCBJRDUpOwotCQlhc3NlcnRFcXVhbHMoMSwgaWRzLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaWRzLmNvbnRhaW5zKElENCkpOwotCX0JCi0JCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGlmIHlvdSBkaXNhYmxlIGNhdCAxIHRoZW4gY2F0IDMgd291bGQgYWxzbyBiZSBkaXNhYmxlZCAodGhleQotCSAqIGNvbnRhaW4gdGhlIHNhbWUgYWN0aXZpdHkpLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXREaXNhYmxlZENhdGVnb3JpZXMxKCkgewotCQllbmFibGVBbGwoKTsKLQkJU2V0IGlkcyA9IFdvcmtiZW5jaEFjdGl2aXR5SGVscGVyLmdldERpc2FibGVkQ2F0ZWdvcmllcyhnZXRBY3Rpdml0eU1hbmFnZXIoKSwgSUQxKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGlkcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGlkcy5jb250YWlucyhJRDMpKTsKLQl9Ci0JCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGlmIHlvdSBkaXNhYmxlIGNhdCAyIHRoZW4gY2F0IDEgYW5kIGNhdCAzIHdvdWxkIGFsc28gYmUgZGlzYWJsZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldERpc2FibGVkQ2F0ZWdvcmllczIoKSB7Ci0JCWVuYWJsZUFsbCgpOwotCQlTZXQgaWRzID0gV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuZ2V0RGlzYWJsZWRDYXRlZ29yaWVzKGdldEFjdGl2aXR5TWFuYWdlcigpLCBJRDIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaWRzLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaWRzLmNvbnRhaW5zKElEMSkpOwotCQlhc3NlcnRUcnVlKGlkcy5jb250YWlucyhJRDMpKTsKLQl9Ci0JCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGlmIHlvdSBkaXNhYmxlIGNhdCAzIHRoZW4gY2F0IDEgd291bGQgYWxzbyBiZSBkaXNhYmxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzYWJsZWRDYXRlZ29yaWVzMygpIHsKLQkJZW5hYmxlQWxsKCk7Ci0JCVNldCBpZHMgPSBXb3JrYmVuY2hBY3Rpdml0eUhlbHBlci5nZXREaXNhYmxlZENhdGVnb3JpZXMoZ2V0QWN0aXZpdHlNYW5hZ2VyKCksIElEMyk7Ci0JCWFzc2VydEVxdWFscygxLCBpZHMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZHMuY29udGFpbnMoSUQxKSk7Ci0JfQotCQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBpZiB5b3UgZGlzYWJsZSBjYXQgNCB0aGVuIG5vIG90aGVyIGNhdGVnb3JpZXMgd291bGQgYWxzbyBiZSBkaXNhYmxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzYWJsZWRDYXRlZ29yaWVzNCgpIHsKLQkJZW5hYmxlQWxsKCk7Ci0JCVNldCBpZHMgPSBXb3JrYmVuY2hBY3Rpdml0eUhlbHBlci5nZXREaXNhYmxlZENhdGVnb3JpZXMoZ2V0QWN0aXZpdHlNYW5hZ2VyKCksIElENCk7Ci0JCWFzc2VydEVxdWFscygwLCBpZHMuc2l6ZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGlmIHlvdSBkaXNhYmxlIGNhdCA1IHRoZW4gY2F0IDQgd291bGQgYWxzbyBiZSBkaXNhYmxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzYWJsZWRDYXRlZ29yaWVzNSgpIHsKLQkJZW5hYmxlQWxsKCk7Ci0JCVNldCBpZHMgPSBXb3JrYmVuY2hBY3Rpdml0eUhlbHBlci5nZXREaXNhYmxlZENhdGVnb3JpZXMoZ2V0QWN0aXZpdHlNYW5hZ2VyKCksIElENSk7Ci0JCWFzc2VydEVxdWFscygxLCBpZHMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZHMuY29udGFpbnMoSUQ0KSk7Ci0JfQotCQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZW5hYmxlZCBjYXRlZ29yeSBjb3VudCBmb3IgYWN0aXZpdHkgMSBpcyAyIChjYXQgMSBhbmQgMykuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENhdGVnb3J5Q291bnQxX0EoKSB7Ci0JCWVuYWJsZUFsbCgpOwotCQlTZXQgaWRzID0gV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuZ2V0RW5hYmxlZENhdGVnb3JpZXNGb3JBY3Rpdml0eShnZXRBY3Rpdml0eU1hbmFnZXIoKSwgSUQxKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGlkcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGlkcy5jb250YWlucyhJRDEpKTsKLQkJYXNzZXJ0VHJ1ZShpZHMuY29udGFpbnMoSUQzKSk7Ci0JfQotCQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZW5hYmxlZCBjYXRlZ29yeSBjb3VudCBmb3IgYWN0aXZpdHkgMiBpcyAxIChjYXQgMikuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENhdGVnb3J5Q291bnQyX0EoKSB7Ci0JCWVuYWJsZUFsbCgpOwotCQlTZXQgaWRzID0gV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuZ2V0RW5hYmxlZENhdGVnb3JpZXNGb3JBY3Rpdml0eShnZXRBY3Rpdml0eU1hbmFnZXIoKSwgSUQyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGlkcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGlkcy5jb250YWlucyhJRDIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBlbmFibGVkIGNhdGVnb3J5IGNvdW50IGZvciBhY3Rpdml0eSA0IGlzIDIgKGNhdCA0IGFuZCA1KS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlDb3VudDRfQSgpIHsKLQkJZW5hYmxlQWxsKCk7Ci0JCVNldCBpZHMgPSBXb3JrYmVuY2hBY3Rpdml0eUhlbHBlci5nZXRFbmFibGVkQ2F0ZWdvcmllc0ZvckFjdGl2aXR5KGdldEFjdGl2aXR5TWFuYWdlcigpLCBJRDQpOwotCQlhc3NlcnRFcXVhbHMoMiwgaWRzLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaWRzLmNvbnRhaW5zKElENCkpOwotCQlhc3NlcnRUcnVlKGlkcy5jb250YWlucyhJRDUpKTsKLQl9Ci0JCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBlbmFibGVkIGNhdGVnb3J5IGNvdW50IGZvciBhY3Rpdml0eSA1IGlzIDEgKGNhdCA1KS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlDb3VudDVfQSgpIHsKLQkJZW5hYmxlQWxsKCk7Ci0JCVNldCBpZHMgPSBXb3JrYmVuY2hBY3Rpdml0eUhlbHBlci5nZXRFbmFibGVkQ2F0ZWdvcmllc0ZvckFjdGl2aXR5KGdldEFjdGl2aXR5TWFuYWdlcigpLCBJRDUpOwotCQlhc3NlcnRFcXVhbHMoMSwgaWRzLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaWRzLmNvbnRhaW5zKElENSkpOwotCX0KLQkKLQkvKioKLQkgKiBFbmFibGUgYWxsIHRlc3QgYWN0aXZpdGllcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5hYmxlQWxsKCkgewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoSUQxKTsKLQkJc2V0LmFkZChJRDIpOwotCQlzZXQuYWRkKElENCk7Ci0JCXNldC5hZGQoSUQ1KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKS5zZXRFbmFibGVkQWN0aXZpdHlJZHMoCi0JCQkJc2V0KTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBhY3Rpdml0eSBtYW5hZ2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBhY3Rpdml0eSBtYW5hZ2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSBJQWN0aXZpdHlNYW5hZ2VyIGdldEFjdGl2aXR5TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgIC5nZXRBY3Rpdml0eVN1cHBvcnQoKS5nZXRBY3Rpdml0eU1hbmFnZXIoKTsKLSAgICB9Ci0gICAgCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlyZW1lbWJlcmVkU2V0ID0gZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0RW5hYmxlZEFjdGl2aXR5SWRzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2aXR5U3VwcG9ydCgpLnNldEVuYWJsZWRBY3Rpdml0eUlkcygKLQkJCQlyZW1lbWJlcmVkU2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9BZGFwdGFibGVEZWNvcmF0b3JUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvQWRhcHRhYmxlRGVjb3JhdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwYzVjYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9BZGFwdGFibGVEZWNvcmF0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hZGFwdGFibGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kZWNvcmF0b3JzLkRlY29yYXRvckRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGVjb3JhdG9ycy5EZWNvcmF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0YWJsZURlY29yYXRvclRlc3RDYXNlIGV4dGVuZHMgVUlUZXN0Q2FzZSBpbXBsZW1lbnRzCi0gICAgICAgIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBEZWNvcmF0b3JEZWZpbml0aW9uIGZ1bGxEZWZpbml0aW9uOwotCi0gICAgcHJpdmF0ZSBEZWNvcmF0b3JEZWZpbml0aW9uIGxpZ2h0RGVmaW5pdGlvbjsKLQotICAgIHByaXZhdGUgQWRhcHRlZFJlc291cmNlTmF2aWdhdG9yIGFkYXB0ZWROYXZpZ2F0b3I7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXBkYXRlZCA9IGZhbHNlOwotCi0gICAgcHVibGljIFN0cmluZyBBREFQVEVEX05BVklHQVRPUl9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hZGFwdGFibGUuYWRhcHRlZEhpZXJhcmNoeSI7Ci0KLSAgICBwcm90ZWN0ZWQgSVByb2plY3QgdGVzdFByb2plY3Q7Ci0KLSAgICBwcm90ZWN0ZWQgSUZvbGRlciB0ZXN0Rm9sZGVyOwotCi0gICAgcHJvdGVjdGVkIElGaWxlIHRlc3RGaWxlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIERlY29yYXRvclRlc3RDYXNlLgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGFibGVEZWNvcmF0b3JUZXN0Q2FzZShTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdXAgdGhlIGhpZXJhcmNoeS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICAgICAgY3JlYXRlVGVzdEZpbGUoKTsKLSAgICAgICAgc2hvd0FkYXB0ZWROYXYoKTsKLQotICAgICAgICBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5hZGRMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBEZWNvcmF0b3JEZWZpbml0aW9uW10gZGVmaW5pdGlvbnMgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRBbGxEZWNvcmF0b3JEZWZpbml0aW9ucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlZmluaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbnNbaV0uZ2V0SWQoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hZGFwdGFibGUuZGVjb3JhdG9yIikpCi0gICAgICAgICAgICAgICAgZnVsbERlZmluaXRpb24gPSBkZWZpbml0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9uc1tpXS5nZXRJZCgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMubGlnaHR3ZWlnaHRkZWNvcmF0b3IiKSkKLSAgICAgICAgICAgICAgICBsaWdodERlZmluaXRpb24gPSBkZWZpbml0aW9uc1tpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRGVjb3JhdG9yTWFuYWdlciBnZXREZWNvcmF0b3JNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBsaXN0ZW5lci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHRlc3RQcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByb2plY3QuZGVsZXRlKHRydWUsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGVzdFByb2plY3QgPSBudWxsOwotICAgICAgICAgICAgdGVzdEZvbGRlciA9IG51bGw7Ci0gICAgICAgICAgICB0ZXN0RmlsZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZG9UZWFyRG93bigpOwotICAgICAgICBhZGFwdGVkTmF2aWdhdG9yID0gbnVsbDsKLQotICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZSBhIGxhYmVsIGNoYW5nZWQgZXZlbnQgZm9yIHJlc291cmNlLgotICAgICAqLwotICAgIHByaXZhdGUgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBnZXRMYWJlbENoYW5nZWRFdmVudChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50KGdldERlY29yYXRvck1hbmFnZXIoKSwgcmVzb3VyY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZW5hYmxpbmcgdGhlIGNvbnRyaWJ1dG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZURlY29yYXRvcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0RGVjb3JhdG9yTWFuYWdlcigpLnVwZGF0ZUZvckVuYWJsZW1lbnRDaGFuZ2UoKTsKLSAgICAgICAgZnVsbERlZmluaXRpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgbGlnaHREZWZpbml0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGdldERlY29yYXRvck1hbmFnZXIoKS51cGRhdGVGb3JFbmFibGVtZW50Q2hhbmdlKCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGRpc2FibGluZyB0aGUgY29udHJpYnV0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZURlY29yYXRvcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0RGVjb3JhdG9yTWFuYWdlcigpLnVwZGF0ZUZvckVuYWJsZW1lbnRDaGFuZ2UoKTsKLSAgICAgICAgZnVsbERlZmluaXRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGxpZ2h0RGVmaW5pdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZ2V0RGVjb3JhdG9yTWFuYWdlcigpLnVwZGF0ZUZvckVuYWJsZW1lbnRDaGFuZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZyZXNoIHRoZSBmdWxsIGRlY29yYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmcmVzaEZ1bGxDb250cmlidXRvcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICB1cGRhdGVkID0gZmFsc2U7Ci0gICAgICAgIGdldERlY29yYXRvck1hbmFnZXIoKS51cGRhdGVGb3JFbmFibGVtZW50Q2hhbmdlKCk7Ci0gICAgICAgIGZ1bGxEZWZpbml0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGxpZ2h0RGVmaW5pdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZ2V0RGVjb3JhdG9yTWFuYWdlcigpLnVwZGF0ZUZvckVuYWJsZW1lbnRDaGFuZ2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiR290IGFuIHVwZGF0ZSIsIHVwZGF0ZWQpOwotICAgICAgICB1cGRhdGVkID0gZmFsc2U7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZyZXNoIHRoZSBmdWxsIGRlY29yYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmcmVzaExpZ2h0Q29udHJpYnV0b3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdXBkYXRlZCA9IGZhbHNlOwotICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkudXBkYXRlRm9yRW5hYmxlbWVudENoYW5nZSgpOwotICAgICAgICBsaWdodERlZmluaXRpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgZnVsbERlZmluaXRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGdldERlY29yYXRvck1hbmFnZXIoKS51cGRhdGVGb3JFbmFibGVtZW50Q2hhbmdlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkdvdCBhbiB1cGRhdGUiLCB1cGRhdGVkKTsKLSAgICAgICAgdXBkYXRlZCA9IGZhbHNlOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIjbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHVwZGF0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBTaG93cyB0aGUgQWRhcHRlZCBSZXNvdXJjZSBOYXZpZ2F0b3IgaW4gYSBuZXcgdGVzdCB3aW5kb3cuIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNob3dBZGFwdGVkTmF2KCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBhZGFwdGVkTmF2aWdhdG9yID0gKEFkYXB0ZWRSZXNvdXJjZU5hdmlnYXRvcikgd2luZG93LmdldEFjdGl2ZVBhZ2UoKQotICAgICAgICAgICAgICAgIC5zaG93VmlldyhBREFQVEVEX05BVklHQVRPUl9JRCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGVzdFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0ZXN0UHJvamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgIHRlc3RQcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KCJBZGFwdGVkVGVzdFByb2plY3QiKTsKLSAgICAgICAgICAgIHRlc3RQcm9qZWN0LmNyZWF0ZShudWxsKTsKLSAgICAgICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXN0Rm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAodGVzdEZvbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjcmVhdGVUZXN0UHJvamVjdCgpOwotICAgICAgICAgICAgdGVzdEZvbGRlciA9IHRlc3RQcm9qZWN0LmdldEZvbGRlcigiQWRhcHRlZFRlc3RGb2xkZXIiKTsKLSAgICAgICAgICAgIHRlc3RGb2xkZXIuY3JlYXRlKGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXN0RmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRlc3RGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGNyZWF0ZVRlc3RGb2xkZXIoKTsKLSAgICAgICAgICAgIHRlc3RGaWxlID0gdGVzdEZvbGRlci5nZXRGaWxlKCJBZGFwdGVkRm9vLnR4dCIpOwotICAgICAgICAgICAgdGVzdEZpbGUuY3JlYXRlKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIlNvbWUgY29udGVudC4iLmdldEJ5dGVzKCkpLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWRhcHRhYmxlL0FkYXB0YWJsZVJlc291cmNlV3JhcHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvQWRhcHRhYmxlUmVzb3VyY2VXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkM2NhNDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvQWRhcHRhYmxlUmVzb3VyY2VXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGFibGVSZXNvdXJjZVdyYXBwZXIgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQotICAgIElSZXNvdXJjZSByZXNvdXJjZTsKLQotICAgIC8qCi0gICAgICogQHNlZSBJQWRhcHRhYmxlI2dldEFkYXB0ZXIoQ2xhc3MpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKGFkYXB0ZXIgPT0gSVJlc291cmNlLmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlOwotICAgICAgICBpZiAoYWRhcHRlciA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBUZXN0QWRhcHRhYmxlV29ya2JlbmNoQWRhcHRlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRhYmxlUmVzb3VyY2VXcmFwcGVyKElSZXNvdXJjZSB3cmFwcGVkKSB7Ci0gICAgICAgIHJlc291cmNlID0gd3JhcHBlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2UuZ2V0TmFtZSgpICsgIiBBZGFwdGVkIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRhYmxlUmVzb3VyY2VXcmFwcGVyIGdldFBhcmVudCgpIHsKLSAgICAgICAgaWYgKHJlc291cmNlLmdldFBhcmVudCgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFkYXB0YWJsZVJlc291cmNlV3JhcHBlcihyZXNvdXJjZS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBBZGFwdGFibGVSZXNvdXJjZVdyYXBwZXJbXSBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgQWRhcHRhYmxlUmVzb3VyY2VXcmFwcGVyW10gd3JhcHBlcnMgPSBuZXcgQWRhcHRhYmxlUmVzb3VyY2VXcmFwcGVyWzBdOwotCi0gICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZVtdIGNoaWxkcmVuOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbiA9ICgoSUNvbnRhaW5lcikgcmVzb3VyY2UpLm1lbWJlcnMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXJzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JhcHBlcnMgPSBuZXcgQWRhcHRhYmxlUmVzb3VyY2VXcmFwcGVyW2NoaWxkcmVuLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgd3JhcHBlcnNbaV0gPSBuZXcgQWRhcHRhYmxlUmVzb3VyY2VXcmFwcGVyKGNoaWxkcmVuW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3JhcHBlcnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvQWRhcHRhYmxlVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9BZGFwdGFibGVUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiNGRkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9BZGFwdGFibGVUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hZGFwdGFibGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRoZSBBZGFwdGFibGVUZXN0U3VpdGUgaXMgdGhlIFRlc3RTdWl0ZSBmb3IgdGhlCi0gKiBhZGFwdGFibGUgc3VwcG9ydCBpbiB0aGUgVUkuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGFibGVUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VpdGUuICBUaGlzIGlzIHJlcXVpcmVkIHRvCi0gICAgICogdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQWRhcHRhYmxlVGVzdFN1aXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEFkYXB0YWJsZVRlc3RTdWl0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRhYmxlVGVzdFN1aXRlKCkgewotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQWRhcHRhYmxlRGVjb3JhdG9yVGVzdENhc2UuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKE1hcmtlckltYWdlUHJvdmlkZXJUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShXb3JraW5nU2V0VGVzdENhc2UuY2xhc3MpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWRhcHRhYmxlL0FkYXB0ZWRSZXNvdXJjZU5hdmlnYXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvQWRhcHRlZFJlc291cmNlTmF2aWdhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNjhmZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvQWRhcHRlZFJlc291cmNlTmF2aWdhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFkYXB0YWJsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSURlY29yYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkRyaWxsRG93bkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VTb3J0ZXI7Ci0KLS8qKgotICogSW1wbGVtZW50cyB0aGUgUmVzb3VyY2UgTmF2aWdhdG9yIHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGVkUmVzb3VyY2VOYXZpZ2F0b3IgZXh0ZW5kcyBWaWV3UGFydCB7Ci0gICAgcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdlcjsKLQotICAgIHByaXZhdGUgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzOwotCi0gICAgcHJpdmF0ZSBJTWVtZW50byBtZW1lbnRvOwotCi0gICAgcHJvdGVjdGVkIFRlc3ROYXZpZ2F0b3JBY3Rpb25Hcm91cCBhY3Rpb25Hcm91cDsKLQotICAgIC8qKgotICAgICAqIFByZWZlcmVuY2UgbmFtZSBjb25zdGFudCBmb3IgbGlua2luZyBlZGl0b3Igc3dpdGNoaW5nIHRvIG5hdmlnYXRvciBzZWxlY3Rpb24uCi0gICAgICogCi0gICAgICogW0lzc3VlOiBXZSdyZSBjaGVhdGluZyBoZXJlLCBieSByZWZlcmVuY2luZyBhIHByZWZlcmVuY2Ugd2hpY2ggaXMgYWN0dWFsbHkgZGVmaW5lZAotICAgICAqIG9uIHRoZSBXb3JrYmVuY2gncyBwcmVmZXJlbmNlIHBhZ2UuICBUaGUgTmF2aWdhdG9yIHNob3VsZCBldmVudHVhbGx5IGhhdmUgaXRzIG93bgotICAgICAqIHByZWZlcmVuY2UgcGFnZSB3aXRoIHRoaXMgcHJlZmVyZW5jZSBvbiBpdCwgaW5zdGVhZCBvZiBvbiB0aGUgV29ya2JlbmNoJ3MuCi0gICAgICogVGhlIHZhbHVlIG11c3QgYmUgdGhlIHNhbWUgYXMgSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuTElOS19OQVZJR0FUT1JfVE9fRURJVE9SLl0KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19OQVZJR0FUT1JfVE9fRURJVE9SID0gIkxJTktfTkFWSUdBVE9SX1RPX0VESVRPUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KQotICAgICAgICAgICAgICAgIGVkaXRvckFjdGl2YXRlZCgoSUVkaXRvclBhcnQpIHBhcnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEFkYXB0ZWRSZXNvdXJjZU5hdmlnYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlZFJlc291cmNlTmF2aWdhdG9yKCkgewotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBnZXRQbHVnaW4oKS5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBzZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzLmdldFNlY3Rpb24oIlJlc291cmNlTmF2aWdhdG9yIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICBzZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzLmFkZE5ld1NlY3Rpb24oIlJlc291cmNlTmF2aWdhdG9yIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGludG8gYSBmb3JtIHVzYWJsZSBieSB0aGUgdmlld2VyLAotICAgICAqIHdoZXJlIHRoZSBlbGVtZW50cyBhcmUgcmVzb3VyY2VzLgotICAgICAqLwotICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gY29udmVydFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzc2VsLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IChJUmVzb3VyY2UpIG87Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IChJUmVzb3VyY2UpICgoSUFkYXB0YWJsZSkgbykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hQYXJ0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICAvLwlpbml0RHJpbGxEb3duQWRhcHRlcih2aWV3ZXIpOwotICAgICAgICB2aWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLSAgICAgICAgdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVzdEFkYXB0YWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgSURlY29yYXRvck1hbmFnZXIgbWFuYWdlciA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKQotICAgICAgICAgICAgICAgIC5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCk7Ci0gICAgICAgIHZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcigKLSAgICAgICAgICAgICAgICBuZXcgVGVzdEFkYXB0YWJsZVdvcmtiZW5jaEFkYXB0ZXIoKSwgbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLQotICAgICAgICB2aWV3ZXIuc2V0SW5wdXQoZ2V0SW5pdGlhbElucHV0KCkpOwotICAgICAgICB1cGRhdGVUaXRsZSgpOwotCi0gICAgICAgIE1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZW51TWdyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLSAgICAgICAgbWVudU1nci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgICAgICAgICBBZGFwdGVkUmVzb3VyY2VOYXZpZ2F0b3IudGhpcy5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBNZW51IG1lbnUgPSBtZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRUcmVlKCkpOwotICAgICAgICB2aWV3ZXIuZ2V0VHJlZSgpLnNldE1lbnUobWVudSk7Ci0gICAgICAgIGdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1lbnVNZ3IsIHZpZXdlcik7Ci0KLSAgICAgICAgbWFrZUFjdGlvbnMoKTsKLQotICAgICAgICAvLyBVcGRhdGUgdGhlIGdsb2JhbCBhY3Rpb24gZW5hYmxlIHN0YXRlIHRvIG1hdGNoCi0gICAgICAgIC8vIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGFjdGlvbkdyb3VwLnVwZGF0ZUdsb2JhbEFjdGlvbnMoc2VsZWN0aW9uKTsKLQotICAgICAgICB2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVEb3VibGVDbGljayhldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVLZXlQcmVzc2VkKGV2ZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVLZXlSZWxlYXNlZChldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGFjdGlvbkdyb3VwLmZpbGxBY3Rpb25CYXJzKHNlbGVjdGlvbik7Ci0KLSAgICAgICAgZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHZpZXdlcik7Ci0KLSAgICAgICAgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQotICAgICAgICBpZiAobWVtZW50byAhPSBudWxsKQotICAgICAgICAgICAgcmVzdG9yZVN0YXRlKG1lbWVudG8pOwotICAgICAgICBtZW1lbnRvID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hQYXJ0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlZGl0b3IgaGFzIGJlZW4gYWN0aXZhdGVkLiAgU2V0IHRoZSBzZWxlY3Rpb24gaW4gdGhpcyBuYXZpZ2F0b3IKLSAgICAgKiB0byBiZSB0aGUgZWRpdG9yJ3MgaW5wdXQsIGlmIGxpbmtpbmcgaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICB2b2lkIGVkaXRvckFjdGl2YXRlZChJRWRpdG9yUGFydCBlZGl0b3IpIHsKLSAgICAgICAgaWYgKCFpc0xpbmtpbmdFbmFibGVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgIElGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotICAgICAgICAgICAgSUZpbGUgZmlsZSA9IGZpbGVJbnB1dC5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBJU2VsZWN0aW9uIG5ld1NlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbGUpOwotICAgICAgICAgICAgaWYgKCF2aWV3ZXIuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ld1NlbGVjdGlvbikpIHsKLSAgICAgICAgICAgICAgICB2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgYWJvdXQgdG8gb3Blbi4KLSAgICAgKi8KLSAgICB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotICAgICAgICBhY3Rpb25Hcm91cC5zZXRDb250ZXh0KG5ldyBBY3Rpb25Db250ZXh0KGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpKSk7Ci0gICAgICAgIGFjdGlvbkdyb3VwLmZpbGxDb250ZXh0TWVudShtZW51KTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogUmV0dXJucyB0aGUgaW5pdGlhbCBpbnB1dCBmb3IgdGhlIHZpZXdlci4KLSAgICAgKiBUcmllcyB0byBjb252ZXJ0IHRoZSBpbnB1dCB0byBhIHJlc291cmNlLCBlaXRoZXIgZGlyZWN0bHkgb3IgdmlhIElBZGFwdGFibGUuCi0gICAgICogSWYgdGhlIHJlc291cmNlIGlzIGEgY29udGFpbmVyLCBpdCB1c2VzIHRoYXQuCi0gICAgICogSWYgdGhlIHJlc291cmNlIGlzIGEgZmlsZSwgaXQgdXNlcyBpdHMgcGFyZW50IGZvbGRlci4KLSAgICAgKiBJZiBhIHJlc291cmNlIGNvdWxkIG5vdCBiZSBvYnRhaW5lZCwgaXQgdXNlcyB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICAgICovCi0gICAgSUNvbnRhaW5lciBnZXRJbml0aWFsSW5wdXQoKSB7Ci0gICAgICAgIElBZGFwdGFibGUgaW5wdXQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldElucHV0KCk7Ci0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2UuRklMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBjYXNlIElSZXNvdXJjZS5GT0xERVI6Ci0gICAgICAgICAgICBjYXNlIElSZXNvdXJjZS5QUk9KRUNUOgotICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2UuUk9PVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gKElDb250YWluZXIpIHJlc291cmNlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBVbmtub3duIHJlc291cmNlIHR5cGUuICBGYWxsIHRocm91Z2guCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmF2aWdhdG9yJ3MgcGx1Z2luLgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdFVJUGx1Z2luIGdldFBsdWdpbigpIHsKLSAgICAgICAgcmV0dXJuIChBYnN0cmFjdFVJUGx1Z2luKSBQbGF0Zm9ybS5nZXRQbHVnaW4oUGxhdGZvcm1VSS5QTFVHSU5fSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc29ydGVyLgotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VTb3J0ZXIgZ2V0U29ydGVyKCkgewotICAgICAgICByZXR1cm4gKFJlc291cmNlU29ydGVyKSBnZXRWaWV3ZXIoKS5nZXRTb3J0ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0cmVlIHZpZXdlciB3aGljaCBzaG93cyB0aGUgcmVzb3VyY2UgaGllcmFyY2h5LgotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJlZVZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0gICAgICAgIHJldHVybiB2aWV3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hlbGwgdG8gdXNlIGZvciBvcGVuaW5nIGRpYWxvZ3MuCi0gICAgICogVXNlZCBpbiB0aGlzIGNsYXNzLCBhbmQgaW4gdGhlIGFjdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gZ2V0Vmlld1NpdGUoKS5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgc3RhdHVzIGxpbmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotICAgICAqIEByZXR1cm4gdGhlIHN0YXR1cyBsaW5lIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U3RhdHVzTGluZU1lc3NhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChJUmVzb3VyY2UpIG8pLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuUmVzb3VyY2VOYXZpZ2F0b3Jfb25lSXRlbVNlbGVjdGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuUmVzb3VyY2VOYXZpZ2F0b3Jfc3RhdHVzTGluZSwgbmV3IEludGVnZXIoc2VsZWN0aW9uLnNpemUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvb2wgdGlwIHRleHQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LgotICAgICAqLwotICAgIFN0cmluZyBnZXRUb29sVGlwVGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgSVBhdGggcGF0aCA9ICgoSVJlc291cmNlKSBlbGVtZW50KS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgICAgaWYgKHBhdGguaXNSb290KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5SZXNvdXJjZU1hbmFnZXJfdG9vbFRpcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAoKElMYWJlbFByb3ZpZGVyKSBnZXRWaWV3ZXIoKS5nZXRMYWJlbFByb3ZpZGVyKCkpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRUZXh0KGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBkb3VibGUgY2xpY2tzIGluIHZpZXdlci4KLSAgICAgKiBPcGVucyBlZGl0b3IgaWYgZmlsZSBkb3VibGUtY2xpY2tlZC4KLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICBPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAvLyAxR0JaSUEwOiBJVFBVSTpXSU4yMDAwIC0gRG91YmxlLWNsaWNraW5nIGluIG5hdmlnYXRvciBzaG91bGQgZXhwYW5kL2NvbGxhcHNlIGNvbnRhaW5lcnMKLSAgICAgICAgaWYgKHZpZXdlci5pc0V4cGFuZGFibGUoZWxlbWVudCkpIHsKLSAgICAgICAgICAgIHZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKGVsZW1lbnQsICF2aWV3ZXIuZ2V0RXhwYW5kZWRTdGF0ZShlbGVtZW50KSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgc2VsZWN0aW9uIGNoYW5nZWQgaW4gdmlld2VyLgotICAgICAqIFVwZGF0ZXMgZ2xvYmFsIGFjdGlvbnMuCi0gICAgICogTGlua3MgdG8gZWRpdG9yIChpZiBvcHRpb24gZW5hYmxlZCkKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgdXBkYXRlU3RhdHVzTGluZShzZWwpOwotICAgICAgICBhY3Rpb25Hcm91cC51cGRhdGVHbG9iYWxBY3Rpb25zKHNlbCk7Ci0gICAgICAgIGFjdGlvbkdyb3VwLnNlbGVjdGlvbkNoYW5nZWQoc2VsKTsKLSAgICAgICAgbGlua1RvRWRpdG9yKHNlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIGtleSBwcmVzcyBpbiB2aWV3ZXIuIEJ5IGRlZmF1bHQgZG8gbm90aGluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVLZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIGEga2V5IHJlbGVhc2UgaW4gdmlld2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUtleVJlbGVhc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElWaWV3UGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlLCBJTWVtZW50byBtZW1lbnRvKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBzdXBlci5pbml0KHNpdGUsIG1lbWVudG8pOwotICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIGEgZHJpbGwgZG93biBhZGFwdGVyIG9uIHRoZSB2aWV3ZXIuCi0gICAgICovCi0gICAgdm9pZCBpbml0RHJpbGxEb3duQWRhcHRlcihUcmVlVmlld2VyIHZpZXdlcikgewotICAgICAgICBEcmlsbERvd25BZGFwdGVyIGRyaWxsRG93bkFkYXB0ZXIgPSBuZXcgRHJpbGxEb3duQWRhcHRlcih2aWV3ZXIpIHsKLSAgICAgICAgICAgIC8vIG5lZWQgdG8gdXBkYXRlIHRpdGxlIHdoZW5ldmVyIGlucHV0IGNoYW5nZXM7Ci0gICAgICAgICAgICAvLyB1cGRhdGVOYXZpZ2F0aW9uQnV0dG9ucyBpcyBjYWxsZWQgd2hlbmV2ZXIgYW55IG9mIHRoZSBkcmlsbCBkb3duIGJ1dHRvbnMgYXJlIHVzZWQKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU5hdmlnYXRpb25CdXR0b25zKCkgewotICAgICAgICAgICAgICAgIHN1cGVyLnVwZGF0ZU5hdmlnYXRpb25CdXR0b25zKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgZHJpbGxEb3duQWRhcHRlci5hZGROYXZpZ2F0aW9uQWN0aW9ucyhnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKQotICAgICAgICAgICAgICAgIC5nZXRUb29sQmFyTWFuYWdlcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByZWZlcmVuY2UgdG8gbGluayBuYXZpZ2F0b3Igc2VsZWN0aW9uIHRvIGFjdGl2ZSBlZGl0b3IgaXMgZW5hYmxlZC4KLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMaW5raW5nRW5hYmxlZCgpIHsKLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFBsdWdpbigpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICByZXR1cm4gc3RvcmUuZ2V0Qm9vbGVhbihMSU5LX05BVklHQVRPUl9UT19FRElUT1IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpbmtzIHRvIGVkaXRvciAoaWYgb3B0aW9uIGVuYWJsZWQpCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxpbmtUb0VkaXRvcihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgaWYgKCFpc0xpbmtpbmdFbmFibGVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgb2JqOwotICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldFNpdGUoKS5nZXRQYWdlKCk7Ci0gICAgICAgICAgICBJRWRpdG9yUmVmZXJlbmNlIGVkaXRvckFycmF5W10gPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yQXJyYXkubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBlZGl0b3JBcnJheVtpXS5nZXRFZGl0b3IodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZS5lcXVhbHMoKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBwYWdlLmJyaW5nVG9Ub3AoZWRpdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCUNyZWF0ZSBzZWxmJ3MgYWN0aW9uIG9iamVjdHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucygpIHsKLSAgICAgICAgYWN0aW9uR3JvdXAgPSBuZXcgVGVzdE5hdmlnYXRvckFjdGlvbkdyb3VwKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSByZWNlaXZlciB0byB0aGUgc3RhdGUgZGVzY3JpYmVkIGluCi0gICAgICogbW9tZW50by4KLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoJUmV2ZWFsIGFuZCBzZWxlY3QgdGhlIHBhc3NlZCBlbGVtZW50IHNlbGVjdGlvbiBpbiBzZWxmJ3MgdmlzdWFsIGNvbXBvbmVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdFJldmVhbChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSBjb252ZXJ0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgICAgIGlmICghc3NlbC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGdldFZpZXdlcigpLnNldFNlbGVjdGlvbihzc2VsLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBnZXRWaWV3ZXIoKS5nZXRUcmVlKCkuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlOiBGb3IgZXhwZXJpbWVudGFsIHVzZSBvbmx5LgotICAgICAqIFNldHMgdGhlIGRlY29yYXRvciBmb3IgdGhlIG5hdmlnYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWNvcmF0b3IgYSBsYWJlbCBkZWNvcmF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIGRlY29yYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsRGVjb3JhdG9yKElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IpIHsKLSAgICAgICAgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSAoRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIpIGdldFZpZXdlcigpCi0gICAgICAgICAgICAgICAgLmdldExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgaWYgKGRlY29yYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJRGVjb3JhdG9yTWFuYWdlciBtYW5hZ2VyID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBwcm92aWRlci5zZXRMYWJlbERlY29yYXRvcihtYW5hZ2VyLmdldExhYmVsRGVjb3JhdG9yKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvdmlkZXIuc2V0TGFiZWxEZWNvcmF0b3IoZGVjb3JhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIG1lc3NhZ2Ugc2hvd24gaW4gdGhlIHN0YXR1cyBsaW5lLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVN0YXR1c0xpbmUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBtc2cgPSBnZXRTdGF0dXNMaW5lTWVzc2FnZShzZWxlY3Rpb24pOwotICAgICAgICBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLnNldE1lc3NhZ2UobXNnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB0aXRsZSB0ZXh0IGFuZCB0aXRsZSB0b29sIHRpcC4KLSAgICAgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIGlucHV0IG9mIHRoZSB2aWV3ZXIgY2hhbmdlcy4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVRpdGxlKCkgewotICAgICAgICBPYmplY3QgaW5wdXQgPSBnZXRWaWV3ZXIoKS5nZXRJbnB1dCgpOwotICAgICAgICBTdHJpbmcgdmlld05hbWUgPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCB8fCBpbnB1dC5lcXVhbHMod29ya3NwYWNlKQotICAgICAgICAgICAgICAgIHx8IGlucHV0LmVxdWFscyh3b3Jrc3BhY2UuZ2V0Um9vdCgpKSkgewotICAgICAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc2V0VGl0bGVUb29sVGlwKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IChJTGFiZWxQcm92aWRlcikgZ2V0Vmlld2VyKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihsYWJlbFByb3ZpZGVyLmdldFRleHQoaW5wdXQpKTsKLSAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNldFRpdGxlVG9vbFRpcChnZXRUb29sVGlwVGV4dChpbnB1dCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9NYXJrZXJJbWFnZVByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvTWFya2VySW1hZ2VQcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5YmZkNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9NYXJrZXJJbWFnZVByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRoZSBtYXJrZXJJbWFnZVByb3ZpZGVycyBleHRlbnNpb24gcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrZXJJbWFnZVByb3ZpZGVyVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgcHVibGljIE1hcmtlckltYWdlUHJvdmlkZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIHN0YXRpYyBmb3JtIG9mIHRoZSBleHRlbnNpb24sIHdoZXJlIGp1c3QgYSBmaWxlIHBhdGggaXMgZ2l2ZW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRpYygpIHsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIElNYXJrZXIgbWFya2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hcmtlciA9IHdvcmtzcGFjZS5nZXRSb290KCkuY3JlYXRlTWFya2VyKAotICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UudWkudGVzdHMudGVzdG1hcmtlciIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgSVdvcmtiZW5jaEFkYXB0ZXIgYWRhcHRlciA9IChJV29ya2JlbmNoQWRhcHRlcikgbWFya2VyCi0gICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpOwotICAgICAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjID0gYWRhcHRlci5nZXRJbWFnZURlc2NyaXB0b3IobWFya2VyKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpbWFnZURlc2MpOwotICAgICAgICBhc3NlcnRUcnVlKGltYWdlRGVzYy50b1N0cmluZygpLmluZGV4T2YoImFueXRoaW5nIikgIT0gLTEpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGR5bmFtaWMgZm9ybSBvZiB0aGUgZXh0ZW5zaW9uLCB3aGVyZSBhbiBJTWFya2VySW1hZ2VQcm92aWRlciBjbGFzcyBpcyBnaXZlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pYygpIHsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIElNYXJrZXIgbWFya2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hcmtlciA9IHdvcmtzcGFjZS5nZXRSb290KCkuY3JlYXRlTWFya2VyKAotICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UudWkudGVzdHMudGVzdG1hcmtlcjIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIElXb3JrYmVuY2hBZGFwdGVyIGFkYXB0ZXIgPSAoSVdvcmtiZW5jaEFkYXB0ZXIpIG1hcmtlcgotICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKTsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzYyA9IGFkYXB0ZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKG1hcmtlcik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaW1hZ2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpbWFnZURlc2MudG9TdHJpbmcoKS5pbmRleE9mKCJhbnl0aGluZyIpICE9IC0xKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvTnVsbExhYmVsRGVjb3JhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9OdWxsTGFiZWxEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmMjBiYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9OdWxsTGFiZWxEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hZGFwdGFibGU7Ci0KLS8qCi0gKiBUaGlzIGRlY29yYXRvciB0ZXN0cyB0aGUgbnVsbCBjYXNlcwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIE51bGxMYWJlbERlY29yYXRvciBpbXBsZW1lbnRzIElMYWJlbERlY29yYXRvciB7Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlSW1hZ2UoSW1hZ2UsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZGVjb3JhdGVJbWFnZShJbWFnZSBpbWFnZSwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElMYWJlbERlY29yYXRvciNkZWNvcmF0ZVRleHQoU3RyaW5nLCBPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIHRleHQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvUmVzb3VyY2VBY3Rpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWRhcHRhYmxlL1Jlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjg2ZjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5UZXN0RGVjb3JhdG9yQ29udHJpYnV0b3I7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLSAgICBPYmplY3Qgc2VsZWN0ZWRJdGVtOwotCi0gICAgLyoKLSAgICAgKiBAc2VlIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KElBY3Rpb24sIElXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCi0gICAgICAgIGlmIChzZWxlY3RlZEl0ZW0gIT0gbnVsbCkKLSAgICAgICAgICAgIFRlc3REZWNvcmF0b3JDb250cmlidXRvci5jb250cmlidXRvci5yZWZyZXNoTGlzdGVuZXJzKHNlbGVjdGVkSXRlbSk7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiwgSVNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmVkLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBudWxsOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbSA9IHN0cnVjdHVyZWQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWRhcHRhYmxlL1Rlc3RBZGFwdGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWRhcHRhYmxlL1Rlc3RBZGFwdGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5YjRjYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9UZXN0QWRhcHRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLQotLyoqCi0gKiBQcm92aWRlcyB0cmVlIGNvbnRlbnRzIGZvciBvYmplY3RzIHRoYXQgaGF2ZSB0aGUgSVdvcmtiZW5jaEFkYXB0ZXIKLSAqIGFkYXB0ZXIgcmVnaXN0ZXJlZC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QWRhcHRhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIsCi0gICAgICAgIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLSAgICBwcm90ZWN0ZWQgVmlld2VyIHZpZXdlcjsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRlbnRQcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAodmlld2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJV29ya3NwYWNlKSB7Ci0gICAgICAgICAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSAoSVdvcmtzcGFjZSkgb2JqOwotICAgICAgICAgICAgICAgIHdvcmtzcGFjZS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0gICAgICAgICAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSAoKElDb250YWluZXIpIG9iaikuZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgICAgICAgICAgd29ya3NwYWNlLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBJV29ya2JlbmNoQWRhcHRlciBmb3IgdGhlIGdpdmVuCi0gICAgICogb2JqZWN0LiAgUmV0dXJucyBudWxsIGlmIHRoZSBhZGFwdGVyIGlzIG5vdCBkZWZpbmVkIG9yIHRoZQotICAgICAqIG9iamVjdCBpcyBub3QgYWRhcHRhYmxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJV29ya2JlbmNoQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBUZXN0QWRhcHRhYmxlV29ya2JlbmNoQWRhcHRlci5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVRyZWVDb250ZW50UHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIElXb3JrYmVuY2hBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVsZW1lbnQpOwotICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJVHJlZUNvbnRlbnRQcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotICAgICAgICBJV29ya2JlbmNoQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbGVtZW50KTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVRyZWVDb250ZW50UHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udGVudFByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICAgICAgSVdvcmtzcGFjZSBvbGRXb3Jrc3BhY2UgPSBudWxsOwotICAgICAgICBJV29ya3NwYWNlIG5ld1dvcmtzcGFjZSA9IG51bGw7Ci0gICAgICAgIGlmIChvbGRJbnB1dCBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpIHsKLSAgICAgICAgICAgIG9sZFdvcmtzcGFjZSA9IChJV29ya3NwYWNlKSBvbGRJbnB1dDsKLSAgICAgICAgfSBlbHNlIGlmIChvbGRJbnB1dCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLSAgICAgICAgICAgIG9sZFdvcmtzcGFjZSA9ICgoSUNvbnRhaW5lcikgb2xkSW5wdXQpLmdldFdvcmtzcGFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpIHsKLSAgICAgICAgICAgIG5ld1dvcmtzcGFjZSA9IChJV29ya3NwYWNlKSBuZXdJbnB1dDsKLSAgICAgICAgfSBlbHNlIGlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLSAgICAgICAgICAgIG5ld1dvcmtzcGFjZSA9ICgoSUNvbnRhaW5lcikgbmV3SW5wdXQpLmdldFdvcmtzcGFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvbGRXb3Jrc3BhY2UgIT0gbmV3V29ya3NwYWNlKSB7Ci0gICAgICAgICAgICBpZiAob2xkV29ya3NwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvbGRXb3Jrc3BhY2UucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZXdXb3Jrc3BhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5ld1dvcmtzcGFjZS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGEgcmVzb3VyY2UgZGVsdGEuICAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLSAgICAgICAgLy8gVGhpcyBtZXRob2QgcnVucyBpbnNpZGUgYSBzeW5jRXhlYy4gIFRoZSB3aWRnZXQgbWF5IGhhdmUgYmVlbiBkZXN0cm95ZWQKLSAgICAgICAgLy8gYnkgdGhlIHRpbWUgdGhpcyBpcyBydW4uICBDaGVjayBmb3IgdGhpcyBhbmQgZG8gbm90aGluZyBpZiBzby4KLSAgICAgICAgQ29udHJvbCBjdHJsID0gdmlld2VyLmdldENvbnRyb2woKTsKLSAgICAgICAgaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBHZXQgdGhlIGFmZmVjdGVkIHJlc291cmNlCi0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0KLSAgICAgICAgLy8gSWYgYW55IGNoaWxkcmVuIGhhdmUgY2hhbmdlZCB0eXBlLCBqdXN0IGRvIGEgZnVsbCByZWZyZXNoIG9mIHRoaXMgcGFyZW50LAotICAgICAgICAvLyBzaW5jZSBhIHNpbXBsZSB1cGRhdGUgb24gc3VjaCBjaGlsZHJlbiB3b24ndCB3b3JrLCAKLSAgICAgICAgLy8gYW5kIHRyeWluZyB0byBtYXAgdGhlIGNoYW5nZSB0byBhIHJlbW92ZSBhbmQgYWRkIGlzIHRvbyBkaWNleS4KLSAgICAgICAgLy8gVGhlIGNhc2UgaXM6IGZvbGRlciBBIHJlbmFtZWQgdG8gZXhpc3RpbmcgZmlsZSBCLCBhbnN3ZXJpbmcgeWVzIHRvIG92ZXJ3cml0ZSBCLgotICAgICAgICBJUmVzb3VyY2VEZWx0YVtdIGFmZmVjdGVkQ2hpbGRyZW4gPSBkZWx0YQotICAgICAgICAgICAgICAgIC5nZXRBZmZlY3RlZENoaWxkcmVuKElSZXNvdXJjZURlbHRhLkNIQU5HRUQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoYWZmZWN0ZWRDaGlsZHJlbltpXS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuVFlQRSkgIT0gMCkgewotICAgICAgICAgICAgICAgICgoU3RydWN0dXJlZFZpZXdlcikgdmlld2VyKS5yZWZyZXNoKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayB0aGUgZmxhZ3MgZm9yIGNoYW5nZXMgdGhlIE5hdmlnYXRvciBjYXJlcyBhYm91dC4KLSAgICAgICAgLy8gU2VlIFJlc291cmNlTGFiZWxQcm92aWRlciBmb3IgdGhlIGFzcGVjdHMgaXQgY2FyZXMgYWJvdXQuCi0gICAgICAgIC8vIE5vdGljZSB3ZSBkb24ndCBjYXJlIGFib3V0IEZfQ09OVEVOVCBvciBGX01BUktFUlMgY3VycmVudGx5LgotICAgICAgICBpbnQgY2hhbmdlRmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOwotICAgICAgICBpZiAoKGNoYW5nZUZsYWdzICYgKElSZXNvdXJjZURlbHRhLk9QRU4gfCBJUmVzb3VyY2VEZWx0YS5TWU5DKSkgIT0gMCkgewotICAgICAgICAgICAgKChTdHJ1Y3R1cmVkVmlld2VyKSB2aWV3ZXIpLnVwZGF0ZShyZXNvdXJjZSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBIYW5kbGUgY2hhbmdlZCBjaGlsZHJlbiAuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcHJvY2Vzc0RlbHRhKGFmZmVjdGVkQ2hpbGRyZW5baV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUHJvY2VzcyByZW1vdmFscyBiZWZvcmUgYWRkaXRpb25zLCB0byBhdm9pZCBtdWx0aXBsZSBlcXVhbCBlbGVtZW50cyBpbiB0aGUgdmlld2VyLgotCi0gICAgICAgIC8vIEhhbmRsZSByZW1vdmVkIGNoaWxkcmVuLiBJc3N1ZSBvbmUgdXBkYXRlIGZvciBhbGwgcmVtb3ZhbHMuCi0gICAgICAgIGFmZmVjdGVkQ2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKElSZXNvdXJjZURlbHRhLlJFTU9WRUQpOwotICAgICAgICBpZiAoYWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBPYmplY3RbXSBhZmZlY3RlZCA9IG5ldyBPYmplY3RbYWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZmZlY3RlZENoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGFmZmVjdGVkW2ldID0gYWZmZWN0ZWRDaGlsZHJlbltpXS5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikgewotICAgICAgICAgICAgICAgICgoQWJzdHJhY3RUcmVlVmlld2VyKSB2aWV3ZXIpLnJlbW92ZShhZmZlY3RlZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICgoU3RydWN0dXJlZFZpZXdlcikgdmlld2VyKS5yZWZyZXNoKHJlc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBhZGRlZCBjaGlsZHJlbi4gSXNzdWUgb25lIHVwZGF0ZSBmb3IgYWxsIGluc2VydGlvbnMuCi0gICAgICAgIGFmZmVjdGVkQ2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKElSZXNvdXJjZURlbHRhLkFEREVEKTsKLSAgICAgICAgaWYgKGFmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgT2JqZWN0W10gYWZmZWN0ZWQgPSBuZXcgT2JqZWN0W2FmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBhZmZlY3RlZFtpXSA9IGFmZmVjdGVkQ2hpbGRyZW5baV0uZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpIHsKLSAgICAgICAgICAgICAgICAoKEFic3RyYWN0VHJlZVZpZXdlcikgdmlld2VyKS5hZGQocmVzb3VyY2UsIGFmZmVjdGVkKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKChTdHJ1Y3R1cmVkVmlld2VyKSB2aWV3ZXIpLnJlZnJlc2gocmVzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHdvcmtiZW5jaCBoYXMgY2hhbmdlZC4gIFByb2Nlc3MgdGhlIGRlbHRhIGFuZCBpc3N1ZSB1cGRhdGVzIHRvIHRoZSB2aWV3ZXIsCi0gICAgICogaW5zaWRlIHRoZSBVSSB0aHJlYWQuCi0gICAgICoKLSAgICAgKiBAc2VlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChmaW5hbCBJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICBmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0gICAgICAgIENvbnRyb2wgY3RybCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgICAgIGlmIChjdHJsICE9IG51bGwgJiYgIWN0cmwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAvLyBEbyBhIHN5bmMgZXhlYywgbm90IGFuIGFzeW5jIGV4ZWMsIHNpbmNlIHRoZSByZXNvdXJjZSBkZWx0YQotICAgICAgICAgICAgLy8gbXVzdCBiZSB0cmF2ZXJzZWQgaW4gdGhpcyBtZXRob2QuICBJdCBpcyBkZXN0cm95ZWQKLSAgICAgICAgICAgIC8vIHdoZW4gdGhpcyBtZXRob2QgcmV0dXJucy4KLSAgICAgICAgICAgIGN0cmwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWx0YShkZWx0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9UZXN0QWRhcHRhYmxlV29ya2JlbmNoQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvVGVzdEFkYXB0YWJsZVdvcmtiZW5jaEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiZDFjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9UZXN0QWRhcHRhYmxlV29ya2JlbmNoQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEFkYXB0YWJsZVdvcmtiZW5jaEFkYXB0ZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMKLSAgICAgICAgSVdvcmtiZW5jaEFkYXB0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGVzdEFkYXB0YWJsZVdvcmtiZW5jaEFkYXB0ZXIgc2luZ2xldG9uID0gbmV3IFRlc3RBZGFwdGFibGVXb3JrYmVuY2hBZGFwdGVyKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RBZGFwdGFibGVXb3JrYmVuY2hBZGFwdGVyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0QWRhcHRhYmxlV29ya2JlbmNoQWRhcHRlcigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEFkYXB0YWJsZVJlc291cmNlV3JhcHBlcikKLSAgICAgICAgICAgIHJldHVybiAoKEFkYXB0YWJsZVJlc291cmNlV3JhcHBlcikgbykuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIEFkYXB0YWJsZVJlc291cmNlV3JhcHBlciB3cmFwcGVyID0gbmV3IEFkYXB0YWJsZVJlc291cmNlV3JhcHBlcigKLSAgICAgICAgICAgICAgICAgICAgKElSZXNvdXJjZSkgbyk7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlci5nZXRDaGlsZHJlbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgQWRhcHRhYmxlUmVzb3VyY2VXcmFwcGVyKQotICAgICAgICAgICAgcmV0dXJuICgoQWRhcHRhYmxlUmVzb3VyY2VXcmFwcGVyKSBvKS5nZXRMYWJlbCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0UGFyZW50KE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEFkYXB0YWJsZVJlc291cmNlV3JhcHBlcikKLSAgICAgICAgICAgIHJldHVybiAoKEFkYXB0YWJsZVJlc291cmNlV3JhcHBlcikgbykuZ2V0UGFyZW50KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciB0aGF0IGlzIGJhc2VkIG9uIHRoZSBnaXZlbiBkZXNjcmlwdG9yLAotICAgICAqIGJ1dCBkZWNvcmF0ZWQgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBzdGF0ZQotICAgICAqIG9mIHRoZSBwcm92aWRlZCBvYmplY3QuCi0gICAgICoKLSAgICAgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBkZWNvcmF0ZSBhbiBvYmplY3QncwotICAgICAqIGltYWdlLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGRlY29yYXRlSW1hZ2UoSW1hZ2VEZXNjcmlwdG9yIGlucHV0LAotICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIGlucHV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsYWJlbCB0aGF0IGlzIGJhc2VkIG9uIHRoZSBnaXZlbiBsYWJlbCwKLSAgICAgKiBidXQgZGVjb3JhdGVkIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGluZyB0byB0aGUgc3RhdGUKLSAgICAgKiBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0LgotICAgICAqCi0gICAgICogU3ViY2xhc3NlcyBtYXkgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGRlY29yYXRlIGFuIG9iamVjdCdzCi0gICAgICogbGFiZWwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIGlucHV0LCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQmFzZUxhYmVsUHJvdmlkZXIKLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlcyBvZiBhbGwgYWxsb2NhdGVkIGltYWdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBkaXNwb3NlKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIElXb3JrYmVuY2hBZGFwdGVyIGZvciB0aGUgZ2l2ZW4KLSAgICAgKiBvYmplY3QuICBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhZGFwdGVyIGlzIG5vdCBkZWZpbmVkIG9yIHRoZQotICAgICAqIG9iamVjdCBpcyBub3QgYWRhcHRhYmxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChJV29ya2JlbmNoQWRhcHRlcikgKChJQWRhcHRhYmxlKSBvKQotICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElMYWJlbFByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIC8vb2J0YWluIHRoZSBiYXNlIGltYWdlIGJ5IHF1ZXJ5aW5nIHRoZSBlbGVtZW50Ci0gICAgICAgIElXb3JrYmVuY2hBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVsZW1lbnQpOwotICAgICAgICBpZiAoYWRhcHRlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gYWRhcHRlci5nZXRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAvL2FkZCBhbnkgYW5ub3RhdGlvbnMgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IKLSAgICAgICAgZGVzY3JpcHRvciA9IGRlY29yYXRlSW1hZ2UoZGVzY3JpcHRvciwgZWxlbWVudCk7Ci0KLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElMYWJlbFByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIC8vcXVlcnkgdGhlIGVsZW1lbnQgZm9yIGl0cyBsYWJlbAotICAgICAgICBJV29ya2JlbmNoQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbGVtZW50KTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgbGFiZWwgPSBhZGFwdGVyLmdldExhYmVsKGVsZW1lbnQpOwotCi0gICAgICAgIC8vcmV0dXJuIHRoZSBkZWNvcmF0ZWQgbGFiZWwKLSAgICAgICAgcmV0dXJuIGRlY29yYXRlVGV4dChsYWJlbCwgZWxlbWVudCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvVGVzdE1hcmtlckltYWdlUHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYWRhcHRhYmxlL1Rlc3RNYXJrZXJJbWFnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjU4ZWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvVGVzdE1hcmtlckltYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JTWFya2VySW1hZ2VQcm92aWRlcjsKLQotLyoqCi0gKiBBIHRlc3QgbWFya2VyIGltYWdlIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdE1hcmtlckltYWdlUHJvdmlkZXIgaW1wbGVtZW50cyBJTWFya2VySW1hZ2VQcm92aWRlciB7Ci0gICAgcHVibGljIFN0cmluZyBnZXRJbWFnZVBhdGgoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgcmV0dXJuICJpY29ucy9hbnl0aGluZy5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvVGVzdE5hdmlnYXRvckFjdGlvbkdyb3VwLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9UZXN0TmF2aWdhdG9yQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmMzExZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9UZXN0TmF2aWdhdG9yQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFkZEJvb2ttYXJrQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuTmV3V2l6YXJkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuTmV3V2l6YXJkTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5RGlhbG9nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgVGVzdE5hdmlnYXRvckFjdGlvbkdyb3VwIGV4dGVuZHMgQWN0aW9uR3JvdXAgewotCi0gICAgcHJpdmF0ZSBBZGFwdGVkUmVzb3VyY2VOYXZpZ2F0b3IgbmF2aWdhdG9yOwotCi0gICAgcHJpdmF0ZSBBZGRCb29rbWFya0FjdGlvbiBhZGRCb29rbWFya0FjdGlvbjsKLQotICAgIHByaXZhdGUgUHJvcGVydHlEaWFsb2dBY3Rpb24gcHJvcGVydHlEaWFsb2dBY3Rpb247Ci0KLSAgICBwcml2YXRlIE5ld1dpemFyZEFjdGlvbiBuZXdXaXphcmRBY3Rpb247Ci0KLSAgICBwdWJsaWMgVGVzdE5hdmlnYXRvckFjdGlvbkdyb3VwKEFkYXB0ZWRSZXNvdXJjZU5hdmlnYXRvciBuYXZpZ2F0b3IpIHsKLSAgICAgICAgdGhpcy5uYXZpZ2F0b3IgPSBuYXZpZ2F0b3I7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gbmF2aWdhdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpOwotICAgICAgICBhZGRCb29rbWFya0FjdGlvbiA9IG5ldyBBZGRCb29rbWFya0FjdGlvbihzaGVsbCk7Ci0gICAgICAgIG5ld1dpemFyZEFjdGlvbiA9IG5ldyBOZXdXaXphcmRBY3Rpb24oKTsKLSAgICAgICAgcHJvcGVydHlEaWFsb2dBY3Rpb24gPSBuZXcgUHJvcGVydHlEaWFsb2dBY3Rpb24oc2hlbGwsIG5hdmlnYXRvcgotICAgICAgICAgICAgICAgIC5nZXRWaWV3ZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBBY3Rpb25Hcm91cCNmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICBNZW51TWFuYWdlciBuZXdNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXMuUmVzb3VyY2VOYXZpZ2F0b3JfbmV3KTsKLSAgICAgICAgbWVudS5hZGQobmV3TWVudSk7Ci0gICAgICAgIG5ld01lbnUuYWRkKG5ldyBOZXdXaXphcmRNZW51KG5hdmlnYXRvci5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkpKTsKLQotICAgICAgICAvL1VwZGF0ZSB0aGUgc2VsZWN0aW9ucyBvZiB0aG9zZSB3aG8gbmVlZCBhIHJlZnJlc2ggYmVmb3JlIGZpbGxpbmcKLSAgICAgICAgYWRkQm9va21hcmtBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotICAgICAgICBtZW51LmFkZChhZGRCb29rbWFya0FjdGlvbik7Ci0KLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotICAgICAgICBtZW51Ci0gICAgICAgICAgICAgICAgLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TCi0gICAgICAgICAgICAgICAgICAgICAgICArICItZW5kIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLSAgICAgICAgcHJvcGVydHlEaWFsb2dBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotICAgICAgICBpZiAocHJvcGVydHlEaWFsb2dBY3Rpb24uaXNBcHBsaWNhYmxlRm9yU2VsZWN0aW9uKCkpCi0gICAgICAgICAgICBtZW51LmFkZChwcm9wZXJ0eURpYWxvZ0FjdGlvbik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIEFjdGlvbkZhY3RvcnkjZmlsbEFjdGlvbkJhck1lbnUoSU1lbnVNYW5hZ2VyLCBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFyTWVudShJTWVudU1hbmFnZXIgbWVudSwKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGdsb2JhbCBhY3Rpb25zIHdpdGggdGhlIGdpdmVuIHNlbGVjdGlvbi4KLSAgICAgKiBCZSBzdXJlIHRvIGludm9rZSBhZnRlciBhY3Rpb25zIG9iamVjdHMgaGF2ZSB1cGRhdGVkLCBzaW5jZSBjYW4qIG1ldGhvZHMgZGVsZWdhdGUgdG8gYWN0aW9uIG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlR2xvYmFsQWN0aW9ucyhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnRyaWJ1dGVzIGFjdGlvbnMgdG8gdGhlIGxvY2FsIHRvb2wgYmFyIGFuZCBsb2NhbCBwdWxsZG93biBtZW51LgotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHNlbGVjdGlvbiBmb3IgbmV3IHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hZGFwdGFibGUvV29ya2luZ1NldFRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9Xb3JraW5nU2V0VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3NTllMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FkYXB0YWJsZS9Xb3JraW5nU2V0VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklSZXNvdXJjZUFjdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsLlByb2plY3RQZXJzaXN0ZW50UHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCB0aGF0IFdvcmtpbmcgU2V0cyBhZGFwdCB0byByZXNvdXJjZSBtYXBwaW5ncwotICovCi1wdWJsaWMgY2xhc3MgV29ya2luZ1NldFRlc3RDYXNlIGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgV29ya2luZ1NldFRlc3RDYXNlKFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgUmVzb3VyY2VNYXBwaW5nIGdldFJlc291cmNlTWFwcGluZyhJV29ya2luZ1NldCBzZXQpIHsKLSAgICAgICAgcmV0dXJuIChSZXNvdXJjZU1hcHBpbmcpKChJQWRhcHRhYmxlKXNldCkuZ2V0QWRhcHRlcihSZXNvdXJjZU1hcHBpbmcuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElXb3JrYmVuY2hBZGFwdGVyIGdldFdvcmtiZW5jaEFkYXB0ZXIoSVdvcmtpbmdTZXQgc2V0KSB7Ci0gICAgICAgIHJldHVybiAoSVdvcmtiZW5jaEFkYXB0ZXIpKChJQWRhcHRhYmxlKXNldCkuZ2V0QWRhcHRlcihJV29ya2JlbmNoQWRhcHRlci5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNYXRjaGVzKFJlc291cmNlTWFwcGluZyBtYXBwaW5nLCBJUmVzb3VyY2VbXSByZXNvdXJjZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJYXNzZXJ0VHJ1ZShtYXBwaW5nICE9IG51bGwpOwotICAgICAgICBSZXNvdXJjZVRyYXZlcnNhbFtdIHRyYXZlcnNhbHMgPSBtYXBwaW5nLmdldFRyYXZlcnNhbHMobnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUodHJhdmVyc2Fscy5sZW5ndGggPT0gcmVzb3VyY2VzLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhdmVyc2Fscy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUmVzb3VyY2VUcmF2ZXJzYWwgdHJhdmVyc2FsID0gdHJhdmVyc2Fsc1tpXTsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzb3VyY2VzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgSUFkYXB0YWJsZSBlbGVtZW50ID0gcmVzb3VyY2VzW2pdOwotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmVxdWFscyh0cmF2ZXJzYWwuZ2V0UmVzb3VyY2VzKClbMF0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZvdW5kKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZ2V0TmFtZSgpICsgbmFtZSk7Ci0gICAgICAgIHByb2plY3QuY3JlYXRlKG51bGwpOwotICAgICAgICBwcm9qZWN0Lm9wZW4oSVJlc291cmNlLk5PTkUsIG51bGwpOwotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFdvcmtTZXRBZGFwdGF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgLy8gRmlyc3QsIHRlc3QgdGhhdCB0aGUgc2V0IGFkYXB0cyB0byBhIFJlc291cmNlTWFwcGluZwotICAgICAgICBJV29ya2luZ1NldE1hbmFnZXIgbWFuID0gZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2luZ1NldE1hbmFnZXIoKTsKLSAgICAgICAgSVJlc291cmNlW10gcmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVszXTsKLSAgICAgICAgcmVzb3VyY2VzWzBdID0gY3JlYXRlUHJvamVjdCgiUHJvamVjdDAiKTsKLSAgICAgICAgcmVzb3VyY2VzWzFdID0gY3JlYXRlUHJvamVjdCgiUHJvamVjdDEiKTsKLSAgICAgICAgcmVzb3VyY2VzWzJdID0gY3JlYXRlUHJvamVjdCgiUHJvamVjdDIiKTsKLSAgICAgICAgSVdvcmtpbmdTZXQgc2V0ID0gbWFuLmNyZWF0ZVdvcmtpbmdTZXQoInRlc3QiLCByZXNvdXJjZXMpOwotICAgICAgICBSZXNvdXJjZU1hcHBpbmcgbWFwcGluZyA9IGdldFJlc291cmNlTWFwcGluZyhzZXQpOwotICAgICAgICBhc3NlcnRNYXRjaGVzKG1hcHBpbmcsIHJlc291cmNlcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBOZXh0LCB0ZXN0IHRoYXQgdGhlIHNldCBhZGFwdHMgdG8gYW4gSVdvcmtiZW5jaEFkYXB0ZXIKLSAgICAgICAgSVdvcmtiZW5jaEFkYXB0ZXIgYWRhcHRlciA9IGdldFdvcmtiZW5jaEFkYXB0ZXIoc2V0KTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBhZGFwdGVyLmdldExhYmVsKHNldCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIG5hbWUpOwotICAgICAgICAKLSAgICAgICAgLy8gVGVzdCB0aGUgcGVyc2lzdGFudCBwcm9wZXJ0eSBmaWx0ZXIKLSAgICAgICAgUXVhbGlmaWVkTmFtZSBrZXkgPSBuZXcgUXVhbGlmaWVkTmFtZSgib3JnLmVjbGlwc2UudWkudGVzdCIsICJzZXQiKTsKLSAgICAgICAgUHJvamVjdFBlcnNpc3RlbnRQcm9wZXJ0eVRlc3RlciB0ZXN0ZXIgPSBuZXcgUHJvamVjdFBlcnNpc3RlbnRQcm9wZXJ0eVRlc3RlcigpOwotICAgICAgICAKLSAgICAgICAgLy8gVGVzdCB3aXRoIG5vIHBlcnNpc3RhbnQgcHJvcGVydGllcyBzZXQKLSAgICAgICAgYXNzZXJ0RmFsc2UodGVzdGVyLnRlc3QoZ2V0UmVzb3VyY2VNYXBwaW5nKHNldCksIElSZXNvdXJjZUFjdGlvbkZpbHRlci5QUk9KRUNUX1BFUlNJU1RFTlRfUFJPUEVSVFksIG5ldyBPYmplY3RbXSB7ICJvcmcuZWNsaXBzZS51aS50ZXN0LnNldD1vbmUifSwgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZSh0ZXN0ZXIudGVzdChnZXRSZXNvdXJjZU1hcHBpbmcoc2V0KSwgSVJlc291cmNlQWN0aW9uRmlsdGVyLlBST0pFQ1RfUEVSU0lTVEVOVF9QUk9QRVJUWSwgbmV3IE9iamVjdFtdIHsgIm9yZy5lY2xpcHNlLnVpLnRlc3Quc2V0PW9uZSIsICJhbGxvd1Vuc2V0UHJvamVjdHMifSwgbnVsbCkpOwotCi0gICAgICAgIC8vIFRldHMgd2l0aCBvbmUgc2V0IG9uIGEgc2V1YnNldCBvZiBwcm9qZWN0cwotICAgICAgICByZXNvdXJjZXNbMF0uc2V0UGVyc2lzdGVudFByb3BlcnR5KGtleSwgIm9uZSIpOwotICAgICAgICBhc3NlcnRGYWxzZSh0ZXN0ZXIudGVzdChnZXRSZXNvdXJjZU1hcHBpbmcoc2V0KSwgSVJlc291cmNlQWN0aW9uRmlsdGVyLlBST0pFQ1RfUEVSU0lTVEVOVF9QUk9QRVJUWSwgbmV3IE9iamVjdFtdIHsgIm9yZy5lY2xpcHNlLnVpLnRlc3Quc2V0PW9uZSJ9LCBudWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUodGVzdGVyLnRlc3QoZ2V0UmVzb3VyY2VNYXBwaW5nKHNldCksIElSZXNvdXJjZUFjdGlvbkZpbHRlci5QUk9KRUNUX1BFUlNJU1RFTlRfUFJPUEVSVFksIG5ldyBPYmplY3RbXSB7ICJvcmcuZWNsaXBzZS51aS50ZXN0LnNldD1vbmUiLCAiYWxsb3dVbnNldFByb2plY3RzIn0sIG51bGwpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlc3QgYWdhaW4gd2l0aCB0aGUgcHJvcGVydHkgc2V0IHRvIHR3byBkaWZmZXJlbnQgdmFsdWVzCi0gICAgICAgIHJlc291cmNlc1sxXS5zZXRQZXJzaXN0ZW50UHJvcGVydHkoa2V5LCAidHdvIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKHRlc3Rlci50ZXN0KGdldFJlc291cmNlTWFwcGluZyhzZXQpLCBJUmVzb3VyY2VBY3Rpb25GaWx0ZXIuUFJPSkVDVF9QRVJTSVNURU5UX1BST1BFUlRZLCBuZXcgT2JqZWN0W10geyAib3JnLmVjbGlwc2UudWkudGVzdC5zZXQ9b25lIn0sIG51bGwpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UodGVzdGVyLnRlc3QoZ2V0UmVzb3VyY2VNYXBwaW5nKHNldCksIElSZXNvdXJjZUFjdGlvbkZpbHRlci5QUk9KRUNUX1BFUlNJU1RFTlRfUFJPUEVSVFksIG5ldyBPYmplY3RbXSB7ICJvcmcuZWNsaXBzZS51aS50ZXN0LnNldD1vbmUiLCAiYWxsb3dVbnNldFByb2plY3RzIn0sIG51bGwpKTsKLQotICAgICAgICAvLyBUZXN0IHdpdGggdGhlbSBhbGwgc2V0Ci0gICAgICAgIHJlc291cmNlc1sxXS5zZXRQZXJzaXN0ZW50UHJvcGVydHkoa2V5LCAib25lIik7Ci0gICAgICAgIHJlc291cmNlc1syXS5zZXRQZXJzaXN0ZW50UHJvcGVydHkoa2V5LCAib25lIik7Ci0gICAgICAgIGFzc2VydFRydWUodGVzdGVyLnRlc3QoZ2V0UmVzb3VyY2VNYXBwaW5nKHNldCksIElSZXNvdXJjZUFjdGlvbkZpbHRlci5QUk9KRUNUX1BFUlNJU1RFTlRfUFJPUEVSVFksIG5ldyBPYmplY3RbXSB7ICJvcmcuZWNsaXBzZS51aS50ZXN0LnNldD1vbmUifSwgbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKHRlc3Rlci50ZXN0KGdldFJlc291cmNlTWFwcGluZyhzZXQpLCBJUmVzb3VyY2VBY3Rpb25GaWx0ZXIuUFJPSkVDVF9QRVJTSVNURU5UX1BST1BFUlRZLCBuZXcgT2JqZWN0W10geyAib3JnLmVjbGlwc2UudWkudGVzdC5zZXQ9b25lIiwgImFsbG93VW5zZXRQcm9qZWN0cyJ9LCBudWxsKSk7Ci0KLSAgICAgICAgLy8gVGVzdCB3aXRoIGEgY2xvc2VkIHByb2plY3QgaW4gdGhlIHNldAotICAgICAgICAoKElQcm9qZWN0KXJlc291cmNlc1swXSkuY2xvc2UobnVsbCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHRlc3Rlci50ZXN0KGdldFJlc291cmNlTWFwcGluZyhzZXQpLCBJUmVzb3VyY2VBY3Rpb25GaWx0ZXIuUFJPSkVDVF9QRVJTSVNURU5UX1BST1BFUlRZLCBuZXcgT2JqZWN0W10geyAib3JnLmVjbGlwc2UudWkudGVzdC5zZXQ9b25lIn0sIG51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0ZXIudGVzdChnZXRSZXNvdXJjZU1hcHBpbmcoc2V0KSwgSVJlc291cmNlQWN0aW9uRmlsdGVyLlBST0pFQ1RfUEVSU0lTVEVOVF9QUk9QRVJUWSwgbmV3IE9iamVjdFtdIHsgIm9yZy5lY2xpcHNlLnVpLnRlc3Quc2V0PW9uZSIsICJhbGxvd1Vuc2V0UHJvamVjdHMifSwgbnVsbCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvQXBpVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9BcGlUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyMzRkNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9BcGlUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuT3ZlcnJpZGRlblRpdGxlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydC5SYXdJVmlld1BhcnRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0LlZpZXdQYXJ0VGl0bGVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmlkZS5hcGkuRmlsZUVkaXRvcklucHV0VGVzdDsKLQotLyoqCi0gKiBUZXN0IGFsbCBhcmVhcyBvZiB0aGUgVUkgQVBJLgotICovCi1wdWJsaWMgY2xhc3MgQXBpVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1aXRlLiAgVGhpcyBpcyByZXF1aXJlZCB0bwotICAgICAqIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IEFwaVRlc3RTdWl0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCB0aGUgdGVzdCBzdWl0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXBpVGVzdFN1aXRlKCkgewotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSVBhZ2VMYXlvdXRUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShQbGF0Zm9ybVVJVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSVdvcmtiZW5jaFRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKElXb3JrYmVuY2hXaW5kb3dUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJV29ya2JlbmNoUGFnZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKElEZXByZWNhdGVkV29ya2JlbmNoUGFnZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKElBY3Rpb25GaWx0ZXJUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJUGFnZUxpc3RlbmVyVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSVBhZ2VTZXJ2aWNlVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSVBlcnNwZWN0aXZlUmVnaXN0cnlUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJUGVyc3BlY3RpdmVEZXNjcmlwdG9yVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSUZpbGVFZGl0b3JNYXBwaW5nVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSUVkaXRvckRlc2NyaXB0b3JUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJRWRpdG9yUmVnaXN0cnlUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJUGVyc3BlY3RpdmVMaXN0ZW5lclRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKElWaWV3QWN0aW9uRGVsZWdhdGVUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJVmlld1NpdGVUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJRWRpdG9yU2l0ZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKElBY3Rpb25CYXJzVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSVZpZXdQYXJ0VGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSUVkaXRvclBhcnRUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3JUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJUGFydFNlcnZpY2VUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJU2VsZWN0aW9uU2VydmljZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKElXb3JraW5nU2V0VGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSVdvcmtpbmdTZXRNYW5hZ2VyVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoTW9ja1dvcmtpbmdTZXRUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShCdWc0MjYxNlRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFN0aWNreVZpZXdUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShFZGl0b3JJY29uVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoUmF3SVZpZXdQYXJ0VGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoVmlld1BhcnRUaXRsZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKE92ZXJyaWRkZW5UaXRsZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFVJSm9iVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQnVnNzUxMThUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShGaWxlRWRpdG9ySW5wdXRUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJRWRpdG9yTWF0Y2hpbmdTdHJhdGVneVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFhNTE1lbWVudG9UZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShUcmltTGF5b3V0VGVzdC5jbGFzcykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0J1ZzQyNjE2VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvQnVnNDI2MTZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjFjZmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvQnVnNDI2MTZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgPGNvZGU+V29ya2JlbmNoUGx1Z2luLmNyZWF0ZUV4dGVuc2lvbigpPC9jb2RlPiB3aWxsIG9ubHkgCi0gKiB0aHJvdyA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPnMgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGNyZWF0aW5nIHRoZSAKLSAqIGV4dGVuc2lvbi4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQnVnNDI2MTZUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgQnVnNDI2MTZUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVycm9yQ29uZGl0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgV29ya2JlbmNoUGx1Z2luLmNyZWF0ZUV4dGVuc2lvbihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoImNyZWF0ZUV4dGVuc2lvbiB3aXRoIG51bGxzIHN1Y2NlZWRlZCIpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGV4Y2VwdGlvbiBoYXMgYSByb290IGNhdXNlLgotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ2F1c2UgaXMgbnVsbCIsIGUuZ2V0U3RhdHVzKCkuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgZmFpbCgiVGhyb3dhYmxlIG5vdCB3cmFwcGVkIGluIGNvcmUgZXhjZXB0aW9uLiIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvQnVnNzUxMThUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9CdWc3NTExOFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhZTA4NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9CdWc3NTExOFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5Xb3JrYmVuY2hXaXphcmRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnJlZ2lzdHJ5LldpemFyZHNSZWdpc3RyeVJlYWRlcjsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWc3NTExOFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQnVnNzUxMThUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEJ1Zzc1MTE4VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2l6YXJkcygpIHsKLQkJV2l6YXJkc1JlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBXaXphcmRzUmVnaXN0cnlSZWFkZXIoCi0JCQkJUGxhdGZvcm1VSS5QTFVHSU5fSUQsIElXb3JrYmVuY2hDb25zdGFudHMuUExfTkVXKTsKLQkJV29ya2JlbmNoV2l6YXJkRWxlbWVudCBbXSBwcmltYXJ5V2l6YXJkcyA9IHJlYWRlci5nZXRQcmltYXJ5V2l6YXJkcygpOwotCQlTZXQgd2l6YXJkU2V0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChwcmltYXJ5V2l6YXJkcykpOwotCQkKLQkJLy9hbnkgZHVwbGljYXRlcyB3b3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCBieSBhZGRpbmcgaXQgdG8gdGhlIHNldAotCQkvL3NvIGlmIHRoZSBzaXplcyBhcmUgZGlmZmVyZW50IHNvbWV0aGluZyBoYXMgYmVlbiByZW1vdmVkIC0gaWU6Ci0JCS8vYSBkdXBsaWNhdGUKLQkJYXNzZXJ0RXF1YWxzKHByaW1hcnlXaXphcmRzLmxlbmd0aCwgd2l6YXJkU2V0LnNpemUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvRGVwcmVjYXRlZFNlc3Npb25SZXN0b3JlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvRGVwcmVjYXRlZFNlc3Npb25SZXN0b3JlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2M3ZGU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0RlcHJlY2F0ZWRTZXNzaW9uUmVzdG9yZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkVtcHR5UGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogU2Vzc2lvblJlc3RvcmVUZXN0IHJ1bnMgdGhlIHNlY29uZCBoYWxmIG9mIG91ciBzZXNzaW9uCi0gKiBwcmVzaXN0YW5jZSB0ZXN0cy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVwcmVjYXRlZFNlc3Npb25SZXN0b3JlVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgLyoqIAotICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVwcmVjYXRlZFNlc3Npb25SZXN0b3JlVGVzdChTdHJpbmcgYXJnKSB7Ci0gICAgICAgIHN1cGVyKGFyZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgc2Vzc2lvbiBzdGF0ZSBpbiB0aGUgd29ya2JlbmNoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0b3JlU2Vzc2lvbigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBJV29ya2JlbmNoV2luZG93W10gd2luZG93czsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlczsKLQotICAgICAgICAvLyBHZXQgd2luZG93cy4KLSAgICAgICAgd2luZG93cyA9IGZXb3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMod2luZG93cy5sZW5ndGgsIDMpOwotCi0gICAgICAgIC8vIEZpcnN0IHdpbmRvdyBjb250YWlucyBlbXB0eSBwZXJzcGVjdGl2ZS4KLSAgICAgICAgcGFnZXMgPSB3aW5kb3dzWzBdLmdldFBhZ2VzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYWdlcy5sZW5ndGgsIDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFnZXNbMF0uZ2V0UGVyc3BlY3RpdmUoKS5nZXRJZCgpLAotICAgICAgICAgICAgICAgIEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQpOwotCi0gICAgICAgIC8vIFNlY29uZCB3aW5kb3cgY29udGFpbnMgZW1wdHkgKyBzZXNzaW9uLgotICAgICAgICBwYWdlcyA9IHdpbmRvd3NbMV0uZ2V0UGFnZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2VzLmxlbmd0aCwgMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYWdlc1swXS5nZXRQZXJzcGVjdGl2ZSgpLmdldElkKCksCi0gICAgICAgICAgICAgICAgRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYWdlc1sxXS5nZXRQZXJzcGVjdGl2ZSgpLmdldElkKCksIFNlc3Npb25QZXJzcGVjdGl2ZS5JRCk7Ci0gICAgICAgIHRlc3RTZXNzaW9uVmlldyhwYWdlc1sxXSk7Ci0KLSAgICAgICAgLy8gVGhpcmQgd2luZG93IGNvbnRhaW5zIDIgc2Vzc2lvbnMuCi0gICAgICAgIHBhZ2VzID0gd2luZG93c1syXS5nZXRQYWdlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFnZXMubGVuZ3RoLCAyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2VzWzBdLmdldFBlcnNwZWN0aXZlKCkuZ2V0SWQoKSwgU2Vzc2lvblBlcnNwZWN0aXZlLklEKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2VzWzFdLmdldFBlcnNwZWN0aXZlKCkuZ2V0SWQoKSwgU2Vzc2lvblBlcnNwZWN0aXZlLklEKTsKLSAgICAgICAgdGVzdFNlc3Npb25WaWV3KHBhZ2VzWzBdKTsKLSAgICAgICAgdGVzdFNlc3Npb25WaWV3KHBhZ2VzWzFdKTsKLQotICAgICAgICAvLyBMYXN0IHBhZ2UgY29udGFpbnMgMyBlZGl0b3JzLgotICAgICAgICBJRWRpdG9yUGFydFtdIGVkaXRvcnMgPSBwYWdlc1sxXS5nZXRFZGl0b3JzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3JzLmxlbmd0aCwgMyk7Ci0gICAgICAgIHRlc3RTZXNzaW9uRWRpdG9yKGVkaXRvcnNbMF0sIFNlc3Npb25DcmVhdGVUZXN0LlRFU1RfRklMRV8xKTsKLSAgICAgICAgdGVzdFNlc3Npb25FZGl0b3IoZWRpdG9yc1sxXSwgU2Vzc2lvbkNyZWF0ZVRlc3QuVEVTVF9GSUxFXzIpOwotICAgICAgICB0ZXN0U2Vzc2lvbkVkaXRvcihlZGl0b3JzWzJdLCBTZXNzaW9uQ3JlYXRlVGVzdC5URVNUX0ZJTEVfMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIHNlc3Npb24gdmlldyB3aXRoaW4gYSBwYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0U2Vzc2lvblZpZXcoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICBJVmlld1BhcnQgdmlldyA9IHBhZ2UuZmluZFZpZXcoU2Vzc2lvblZpZXcuVklFV19JRCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodmlldyk7Ci0gICAgICAgIFNlc3Npb25WaWV3IHNlc3Npb25WaWV3ID0gKFNlc3Npb25WaWV3KSB2aWV3OwotICAgICAgICBzZXNzaW9uVmlldy50ZXN0TWVtZW50b1N0YXRlKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBzdGF0ZSBvZiBhIHNlc3Npb24gZWRpdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0U2Vzc2lvbkVkaXRvcihJRWRpdG9yUGFydCBwYXJ0LCBTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgSUVkaXRvclNpdGUgc2l0ZSA9IHBhcnQuZ2V0RWRpdG9yU2l0ZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2l0ZS5nZXRJZCgpLCBNb2NrRWRpdG9yUGFydC5JRDEpOwotICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSBwYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KTsKLSAgICAgICAgSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldEZpbGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZpbGVOYW1lLCBmaWxlLmdldE5hbWUoKSk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9FZGl0b3JJY29uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvRWRpdG9ySWNvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5MTY5Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9FZGl0b3JJY29uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5JbWFnZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRvIGVuc3VyZSB0aGF0IHZhcmlvdXMgaWNvbiBzY2VuYXJpb3Mgd29yay4gIFRoZXNlIGFyZSB0ZXN0ZWQgb24gCi0gKiBlZGl0b3JzIGJ1dCBzaG91bGQgYmUgYXBwbGljYWJsZSBmb3IgYW55IGNsaWVudCBvZiAKLSAqIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigpCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvckljb25UZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgRWRpdG9ySWNvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVwZW5kYW50QnVuZGxlSWNvbigpIHsKLSAgICAgICAgSW1hZ2UgaTEgPSBudWxsOwotICAgICAgICBJbWFnZSBpMiA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotCSAgICAgICAgaTEgPSBmV29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcigKLQkgICAgICAgICAgICAgICAgImZvby5pY29udGVzdDEiKS5nZXRJbWFnZURlc2NyaXB0b3IoKS5jcmVhdGVJbWFnZSgpOwotCSAgICAgICAgaTIgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oIm9yZy5lY2xpcHNlLnVpIiwKLQkgICAgICAgICAgICAgICAgImljb25zL2Z1bGwvb2JqMTYvZm9udC5naWYiKS5jcmVhdGVJbWFnZSgpOwotCSAgICAgICAgSW1hZ2VUZXN0cy5hc3NlcnRFcXVhbHMoaTEsIGkyKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgCWlmIChpMSAhPSBudWxsKSB7Ci0gICAgICAgIAkJaTEuZGlzcG9zZSgpOwotICAgICAgICAJfQotICAgICAgICAJaWYgKGkyICE9IG51bGwpIHsKLSAgICAgICAgCQlpMi5kaXNwb3NlKCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRGVwZW5kYW50QnVuZGxlSWNvbigpIHsKLSAgICAgICAgSW1hZ2UgaTEgPSBudWxsOwotICAgICAgICBJbWFnZSBpMiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0JICAgICAgICBpMSA9IGZXb3JrYmVuY2guZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXREZWZhdWx0RWRpdG9yKAotCSAgICAgICAgICAgICAgICAiZm9vLmljb250ZXN0MiIpLmdldEltYWdlRGVzY3JpcHRvcigpLmNyZWF0ZUltYWdlKCk7Ci0JICAgICAgICBpMiA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKLQkgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC51aSIsICJpY29ucy9mdWxsL29iajE2L2NsYXNzX29iai5naWYiKQotCSAgICAgICAgICAgICAgICAuY3JlYXRlSW1hZ2UoKTsKLQkgICAgICAgIEltYWdlVGVzdHMuYXNzZXJ0RXF1YWxzKGkxLCBpMik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIAlpZiAoaTEgIT0gbnVsbCkgewotICAgICAgICAJCWkxLmRpc3Bvc2UoKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWlmIChpMiAhPSBudWxsKSB7Ci0gICAgICAgIAkJaTIuZGlzcG9zZSgpOwotICAgICAgICAJfQotICAgICAgICB9CSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZEljb24oKSB7Ci0gICAgICAgIEltYWdlIGkxID0gbnVsbDsKLSAgICAgICAgSW1hZ2UgaTIgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLQkgICAgICAgIGkxID0gZldvcmtiZW5jaC5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldERlZmF1bHRFZGl0b3IoCi0JICAgICAgICAgICAgICAgICJmb28uaWNvbnRlc3QzIikuZ2V0SW1hZ2VEZXNjcmlwdG9yKCkuY3JlYXRlSW1hZ2UoKTsKLQkgICAgICAgIGkyID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS51aSIsCi0JICAgICAgICAgICAgICAgICJpY29ucy9mdWxsL29iajE2L2ZpbGVfb2JqLmdpZiIpLmNyZWF0ZUltYWdlKCk7Ci0JICAgICAgICBJbWFnZVRlc3RzLmFzc2VydEVxdWFscyhpMSwgaTIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAJaWYgKGkxICE9IG51bGwpIHsKLSAgICAgICAgCQlpMS5kaXNwb3NlKCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAlpZiAoaTIgIT0gbnVsbCkgewotICAgICAgICAJCWkyLmRpc3Bvc2UoKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQkgICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lBY3Rpb25CYXJzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSUFjdGlvbkJhcnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNTI0OWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSUFjdGlvbkJhcnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0IHRoZSBsaWZlY3ljbGUgb2YgYW4gYWN0aW9uIGRlbGVnYXRlLgotICovCi1wdWJsaWMgY2xhc3MgSUFjdGlvbkJhcnNUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpbmRvdyBmV2luZG93OwotCi0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hQYWdlIGZQYWdlOwotCi0gICAgcHJpdmF0ZSBjbGFzcyBNb2NrQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUnVuID0gZmFsc2U7Ci0KLSAgICAgICAgcHVibGljIE1vY2tBY3Rpb24oKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaGFzUnVuID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJQWN0aW9uRGVsZWdhdGVUZXN0Ci0gICAgICovCi0gICAgcHVibGljIElBY3Rpb25CYXJzVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICBmV2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICAgICAgZlBhZ2UgPSBmV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVudU1hbmFnZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiUmV0dXJucyB0aGUgbWVudSBtYW5hZ2VyLiIKLQotICAgICAgICBJVmlld1BhcnQgcGFydCA9IGZQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRCk7Ci0gICAgICAgIElBY3Rpb25CYXJzIGJhcnMgPSBwYXJ0LmdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGJhcnMpOwotICAgICAgICBJTWVudU1hbmFnZXIgbWdyID0gYmFycy5nZXRNZW51TWFuYWdlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1ncik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIEZyb20gSmF2YWRvYzogIlJldHVybnMgdGhlIHN0YXR1cyBsaW5lIG1hbmFnZXIuIgotCi0gICAgICAgIElWaWV3UGFydCBwYXJ0ID0gZlBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEKTsKLSAgICAgICAgSUFjdGlvbkJhcnMgYmFycyA9IHBhcnQuZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYmFycyk7Ci0gICAgICAgIElTdGF0dXNMaW5lTWFuYWdlciBtZ3IgPSBiYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWdyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VG9vbEJhck1hbmFnZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiUmV0dXJucyB0aGUgdG9vbCBiYXIgbWFuYWdlci4iCi0KLSAgICAgICAgSVZpZXdQYXJ0IHBhcnQgPSBmUGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQpOwotICAgICAgICBJQWN0aW9uQmFycyBiYXJzID0gcGFydC5nZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChiYXJzKTsKLSAgICAgICAgSVRvb2xCYXJNYW5hZ2VyIG1nciA9IGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZ3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIEZyb20gSmF2YWRvYzogIlJldHVybnMgdGhlIGdsb2JhbCBhY3Rpb24gaGFuZGxlciBmb3IgCi0gICAgICAgIC8vIHRoZSBhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gaWQuICAKLQotICAgICAgICBJVmlld1BhcnQgcGFydCA9IGZQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRCk7Ci0gICAgICAgIElBY3Rpb25CYXJzIGJhcnMgPSBwYXJ0LmdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGJhcnMpOwotCi0gICAgICAgIC8vIEdldCBhY3Rpb25zLiAgVGhleSBzaG91bGQgYWxsIGJlIG51bGwuCi0gICAgICAgIGFzc2VydE51bGwoYmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ1VUKSk7Ci0gICAgICAgIGFzc2VydE51bGwoYmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ09QWSkpOwotICAgICAgICBhc3NlcnROdWxsKGJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlVORE8pKTsKLQotICAgICAgICAvLyBDcmVhdGUgYWN0aW9ucy4KLSAgICAgICAgTW9ja0FjdGlvbiBjdXQgPSBuZXcgTW9ja0FjdGlvbigpOwotICAgICAgICBNb2NrQWN0aW9uIGNvcHkgPSBuZXcgTW9ja0FjdGlvbigpOwotICAgICAgICBNb2NrQWN0aW9uIHVuZG8gPSBuZXcgTW9ja0FjdGlvbigpOwotCi0gICAgICAgIC8vIFNldCBhY3Rpb25zLgotICAgICAgICBiYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DVVQsIGN1dCk7Ci0gICAgICAgIGJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkNPUFksIGNvcHkpOwotICAgICAgICBiYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5VTkRPLCB1bmRvKTsKLSAgICAgICAgYmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0KLSAgICAgICAgLy8gR2V0IGFjdGlvbnMuICBUaGV5IHNob3VsZCBub3QgYmUgbnVsbC4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGN1dCwgYmFycwotICAgICAgICAgICAgICAgIC5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ1VUKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjb3B5LCBiYXJzCi0gICAgICAgICAgICAgICAgLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DT1BZKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh1bmRvLCBiYXJzCi0gICAgICAgICAgICAgICAgLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5VTkRPKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEdsb2JhbEFjdGlvbkhhbmRsZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiUmV0dXJucyB0aGUgZ2xvYmFsIGFjdGlvbiBoYW5kbGVyIGZvciAKLSAgICAgICAgLy8gdGhlIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBpZC4gIAotCi0gICAgICAgIElWaWV3UGFydCBwYXJ0ID0gZlBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEKTsKLSAgICAgICAgSUFjdGlvbkJhcnMgYmFycyA9IHBhcnQuZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYmFycyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGFjdGlvbnMuCi0gICAgICAgIE1vY2tBY3Rpb24gY3V0ID0gbmV3IE1vY2tBY3Rpb24oKTsKLSAgICAgICAgTW9ja0FjdGlvbiBjb3B5ID0gbmV3IE1vY2tBY3Rpb24oKTsKLSAgICAgICAgTW9ja0FjdGlvbiB1bmRvID0gbmV3IE1vY2tBY3Rpb24oKTsKLQotICAgICAgICAvLyBTZXQgYWN0aW9ucy4KLSAgICAgICAgYmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ1VULCBjdXQpOwotICAgICAgICBiYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DT1BZLCBjb3B5KTsKLSAgICAgICAgYmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuVU5ETywgdW5kbyk7Ci0gICAgICAgIGJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCi0gICAgICAgIC8vIFJ1biB0aGUgcmVhbCB3b3JrYmVuY2ggYWN0aW9ucy4KLSAgICAgICAgLy8gVmVyaWZ5IHRoZSBhY3Rpb25zIGFyZSBpbnZva2VkLgotICAgICAgICBjdXQuaGFzUnVuID0gY29weS5oYXNSdW4gPSB1bmRvLmhhc1J1biA9IGZhbHNlOwotICAgICAgICBBY3Rpb25VdGlsLnJ1bkFjdGlvblVzaW5nUGF0aCh0aGlzLCBmV2luZG93LAotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUICsgJy8nCi0gICAgICAgICAgICAgICAgICAgICAgICArIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ1VUKTsKLSAgICAgICAgQWN0aW9uVXRpbC5ydW5BY3Rpb25Vc2luZ1BhdGgodGhpcywgZldpbmRvdywKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCArICcvJwotICAgICAgICAgICAgICAgICAgICAgICAgKyBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlVORE8pOwotICAgICAgICBhc3NlcnRUcnVlKGN1dC5oYXNSdW4pOwotICAgICAgICBhc3NlcnRUcnVlKCFjb3B5Lmhhc1J1bik7Ci0gICAgICAgIGFzc2VydFRydWUodW5kby5oYXNSdW4pOwotCi0gICAgICAgIC8vIE5vdyBjcmVhdGUgYSBzZWNvbmQgdmlldyBhbmQgcnVuIHRoZSBhY3Rpb25zIGFnYWluLgotICAgICAgICAvLyBPdXIgZ2xvYmFsIGFjdGlvbnMgc2hvdWxkIG5vdCBiZSBpbnZva2VkLgotICAgICAgICBmUGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQyKTsKLSAgICAgICAgY3V0Lmhhc1J1biA9IGNvcHkuaGFzUnVuID0gdW5kby5oYXNSdW4gPSBmYWxzZTsKLSAgICAgICAgQWN0aW9uVXRpbC5ydW5BY3Rpb25Vc2luZ1BhdGgodGhpcywgZldpbmRvdywKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCArICcvJwotICAgICAgICAgICAgICAgICAgICAgICAgKyBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkNVVCk7Ci0gICAgICAgIEFjdGlvblV0aWwucnVuQWN0aW9uVXNpbmdQYXRoKHRoaXMsIGZXaW5kb3csCi0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQgKyAnLycKLSAgICAgICAgICAgICAgICAgICAgICAgICsgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5VTkRPKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghY3V0Lmhhc1J1bik7Ci0gICAgICAgIGFzc2VydFRydWUoIWNvcHkuaGFzUnVuKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghdW5kby5oYXNSdW4pOwotCi0gICAgICAgIC8vIFJlYWN0aXZhdGUgdGVzdCB2aWV3IGFuZCBydW4gYWN0aW9ucyBhZ2Fpbi4KLSAgICAgICAgLy8gVGhpcyB0aW1lIG91ciBnbG9iYWwgYWN0aW9ucyBzaG91bGQgYmUgaW52b2tlZC4JCQotICAgICAgICBmUGFnZS5hY3RpdmF0ZShwYXJ0KTsKLSAgICAgICAgY3V0Lmhhc1J1biA9IGNvcHkuaGFzUnVuID0gdW5kby5oYXNSdW4gPSBmYWxzZTsKLSAgICAgICAgQWN0aW9uVXRpbC5ydW5BY3Rpb25Vc2luZ1BhdGgodGhpcywgZldpbmRvdywKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCArICcvJwotICAgICAgICAgICAgICAgICAgICAgICAgKyBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkNVVCk7Ci0gICAgICAgIEFjdGlvblV0aWwucnVuQWN0aW9uVXNpbmdQYXRoKHRoaXMsIGZXaW5kb3csCi0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQgKyAnLycKLSAgICAgICAgICAgICAgICAgICAgICAgICsgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5VTkRPKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjdXQuaGFzUnVuKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghY29weS5oYXNSdW4pOwotICAgICAgICBhc3NlcnRUcnVlKHVuZG8uaGFzUnVuKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lBY3Rpb25EZWxlZ2F0ZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lBY3Rpb25EZWxlZ2F0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3ZDNkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JQWN0aW9uRGVsZWdhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0IHRoZSBsaWZlY3ljbGUgb2YgYW4gYWN0aW9uIGRlbGVnYXRlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSUFjdGlvbkRlbGVnYXRlVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgZldpbmRvdzsKLQotICAgIHByb3RlY3RlZCBJV29ya2JlbmNoUGFnZSBmUGFnZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJQWN0aW9uRGVsZWdhdGVUZXN0Ci0gICAgICovCi0gICAgcHVibGljIElBY3Rpb25EZWxlZ2F0ZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICAgICAgZldpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0gICAgICAgIGZQYWdlID0gZldpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJ1bigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBDcmVhdGUgdGhlIGFjdGlvbi4KLSAgICAgICAgT2JqZWN0IG9iaiA9IGNyZWF0ZUFjdGlvbldpZGdldCgpOwotCi0gICAgICAgIC8vIFJ1biB0aGUgYWN0aW9uIGRlbGVnYXRlLgotICAgICAgICAvLyBUaGUgc2VsZWN0aW9uQ2hhbmdlZCBhbmQgcnVuIG1ldGhvZHMgc2hvdWxkIGJlIGNhbGxlZCwgaW4gdGhhdCBvcmRlci4KLSAgICAgICAgcnVuQWN0aW9uKG9iaik7Ci0gICAgICAgIE1vY2tBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZSA9IGdldERlbGVnYXRlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGVsZWdhdGUpOwotICAgICAgICBhc3NlcnRUcnVlKGRlbGVnYXRlLmNhbGxIaXN0b3J5LnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgInNlbGVjdGlvbkNoYW5nZWQiLCAicnVuIiB9KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkNoYW5nZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBkZWxlZ2F0ZSBieSBydW5uaW5nIGl0LgotICAgICAgICBPYmplY3Qgb2JqID0gY3JlYXRlQWN0aW9uV2lkZ2V0KCk7Ci0gICAgICAgIHJ1bkFjdGlvbihvYmopOwotICAgICAgICBNb2NrQWN0aW9uRGVsZWdhdGUgZGVsZWdhdGUgPSBnZXREZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRlbGVnYXRlKTsKLQotICAgICAgICAvLyBGaXJlIGEgc2VsZWN0aW9uLgotICAgICAgICAvLyBUaGUgc2VsZWN0aW9uQ2hhbmdlZCBtZXRob2Qgc2hvdWxkIGJlIGludm9rZWQuCi0gICAgICAgIGRlbGVnYXRlLmNhbGxIaXN0b3J5LmNsZWFyKCk7Ci0gICAgICAgIGZpcmVTZWxlY3Rpb24ob2JqKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkZWxlZ2F0ZS5jYWxsSGlzdG9yeS5jb250YWlucygic2VsZWN0aW9uQ2hhbmdlZCIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXN0IG1vY2sgYWN0aW9uIGRlbGVnYXRlIHdoaWNoIHdhcyBjcmVhdGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBNb2NrQWN0aW9uRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgTW9ja0FjdGlvbkRlbGVnYXRlIGRlbGVnYXRlID0gTW9ja0FjdGlvbkRlbGVnYXRlLmxhc3REZWxlZ2F0ZTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZWxlZ2F0ZSk7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB3aWRnZXQgZm9yIGFuIGFjdGlvbiwgYW5kIGFkZHMgdGhlIGFjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gcnVuQWN0aW9uIGFuZCAKLSAgICAgKiBmaXJlU2VsZWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgY3JlYXRlQWN0aW9uV2lkZ2V0KCkgdGhyb3dzIFRocm93YWJsZTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYW5kIHJ1bnMgdGhlIGFjdGlvbiBkZWxlZ2F0ZS4gIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIGNyZWF0ZUFjdGlvbldpZGdldC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBydW5BY3Rpb24oT2JqZWN0IHdpZGdldCkgdGhyb3dzIFRocm93YWJsZTsKLQotICAgIC8qKgotICAgICAqIEZpcmVzIGEgc2VsZWN0aW9uIGZyb20gdGhlIHNvdXJjZS4gIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIGNyZWF0ZUFjdGlvbldpZGdldC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaXJlU2VsZWN0aW9uKE9iamVjdCB3aWRnZXQpIHRocm93cyBUaHJvd2FibGU7Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lBY3Rpb25GaWx0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JQWN0aW9uRmlsdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNkOTQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lBY3Rpb25GaWx0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5BY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3QgdGhlIGxpZmVjeWNsZSBvZiBhbiBhY3Rpb24gZmlsdGVyLgotICogCi0gKiBGcm9tIEphdmFkb2M6ICJBbiBJQWN0aW9uRmlsdGVyIHJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWMgYXR0cmlidXRlCi0gKiAJCW1hdGNoZXMgdGhlIHN0YXRlIG9mIHRoZSB0YXJnZXQgb2JqZWN0LiIKLSAqIAotICogU2V0dXA6IFRoZSBwbHVnaW4ueG1sIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHBvcHVwIG1lbnUgYWN0aW9uIAotICogdGFyZ2V0dGVkIHRvIExpc3RFbGVtZW50cyAKLSAqIAotICogCQlyZWRBY3Rpb24gLT4gKG5hbWUgPSByZWQpCi0gKiAJCWJsdWVBY3Rpb24gLT4gKG5hbWUgPSBibHVlKQotICogCQl0cnVlQWN0aW9uIC0+IChmbGFnID0gdHJ1ZSkKLSAqIAkJZmFsc2VBY3Rpb24gLT4gKGZsYWcgPSBmYWxzZSkKLSAqIAkJcmVkVHJ1ZUFjdGlvbiAtPiAobmFtZSA9IHJlZCkgKGZsYWcgPSB0cnVlKQotICovCi1wdWJsaWMgY2xhc3MgSUFjdGlvbkZpbHRlclRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCBJV29ya2JlbmNoV2luZG93IGZXaW5kb3c7Ci0KLSAgICBwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhZ2UgZlBhZ2U7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIFNUQVRJQ19NRU5VX1ZJRVdfSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLklBY3Rpb25GaWx0ZXJUZXN0MSI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIERZTkFNSUNfTUVOVV9WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5JQWN0aW9uRmlsdGVyVGVzdDIiOwotCi0gICAgcHVibGljIElBY3Rpb25GaWx0ZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIGZXaW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBmUGFnZSA9IGZXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNMaWZlY3ljbGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdGVzdExpZmVjeWNsZShTVEFUSUNfTUVOVV9WSUVXX0lEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY0xpZmVjeWNsZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB0ZXN0TGlmZWN5Y2xlKERZTkFNSUNfTUVOVV9WSUVXX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3QgYSBsaXN0IGVsZW1lbnQsIHBvcHVwIHRoZSBtZW51LCBhbmQgdmVyaWZ5IHRoYXQgdGhlIAotICAgICAqIGFjdGlvbiBmaWx0ZXIgaXMgY2FsbGVkLgotICAgICAqIAotICAgICAqIFNlZSBTZXR1cCBhYm92ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdExpZmVjeWNsZShTdHJpbmcgdmlld0lkKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgbGlzdCB2aWV3LiAgCi0gICAgICAgIExpc3RWaWV3IHZpZXcgPSAoTGlzdFZpZXcpIGZQYWdlLnNob3dWaWV3KHZpZXdJZCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSB0ZXN0IG9iamVjdHMuCi0gICAgICAgIExpc3RFbGVtZW50IHJlZCA9IG5ldyBMaXN0RWxlbWVudCgicmVkIik7Ci0gICAgICAgIHZpZXcuYWRkRWxlbWVudChyZWQpOwotICAgICAgICB2aWV3LnNlbGVjdEVsZW1lbnQocmVkKTsKLQotICAgICAgICAvLyBHZXQgYWN0aW9uIGZpbHRlci4KLSAgICAgICAgTGlzdEVsZW1lbnRBY3Rpb25GaWx0ZXIgZmlsdGVyID0gTGlzdEVsZW1lbnRBY3Rpb25GaWx0ZXIuZ2V0U2luZ2xldG9uKCk7Ci0KLSAgICAgICAgLy8gT3BlbiBtZW51LiAgVmVyaWZ5IHRoYXQgYWN0aW9uIGZpbHRlciBpcyBjYWxsZWQuCQkJCi0gICAgICAgIE1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSB2aWV3LmdldE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIEFjdGlvblV0aWwuZmlyZUFib3V0VG9TaG93KG1lbnVNZ3IpOwotICAgICAgICBhc3NlcnRUcnVlKGZpbHRlci5nZXRDYWxsZWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZW51Q29udHJpYnV0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHRlc3RNZW51KERZTkFNSUNfTUVOVV9WSUVXX0lEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljTWVudUNvbnRyaWJ1dGlvbigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB0ZXN0TWVudShTVEFUSUNfTUVOVV9WSUVXX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3QgYSBMaXN0RWxlbWVudCwgcG9wdXAgYSBtZW51IGFuZCB2ZXJpZnkgdGhhdCB0aGUgCi0gICAgICogTGlzdEVsZW1lbnRBY3Rpb25GaWx0ZXIudGVzdEF0dHJpYnV0ZSBtZXRob2QgaXMgaW52b2tlZC4gIAotICAgICAqIFRoZW4gdmVyaWZ5IHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyBhcmUgYWRkZWQgdG8gdGhlCi0gICAgICogcG9wdXAgbWVudS4KLSAgICAgKiAKLSAgICAgKiBTZWUgU2V0dXAgYWJvdmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RNZW51KFN0cmluZyB2aWV3SWQpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBDcmVhdGUgdGhlIHRlc3Qgb2JqZWN0cy4KLSAgICAgICAgTGlzdEVsZW1lbnQgcmVkID0gbmV3IExpc3RFbGVtZW50KCJyZWQiKTsKLSAgICAgICAgTGlzdEVsZW1lbnQgYmx1ZSA9IG5ldyBMaXN0RWxlbWVudCgiYmx1ZSIpOwotICAgICAgICBMaXN0RWxlbWVudCBncmVlbiA9IG5ldyBMaXN0RWxlbWVudCgiZ3JlZW4iKTsKLSAgICAgICAgTGlzdEVsZW1lbnQgcmVkVHJ1ZSA9IG5ldyBMaXN0RWxlbWVudCgicmVkIiwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgbGlzdCB2aWV3LiAgCi0gICAgICAgIExpc3RWaWV3IHZpZXcgPSAoTGlzdFZpZXcpIGZQYWdlLnNob3dWaWV3KHZpZXdJZCk7Ci0gICAgICAgIE1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSB2aWV3LmdldE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIHZpZXcuYWRkRWxlbWVudChyZWQpOwotICAgICAgICB2aWV3LmFkZEVsZW1lbnQoYmx1ZSk7Ci0gICAgICAgIHZpZXcuYWRkRWxlbWVudChncmVlbik7Ci0gICAgICAgIHZpZXcuYWRkRWxlbWVudChyZWRUcnVlKTsKLQotICAgICAgICAvLyBHZXQgYWN0aW9uIGZpbHRlci4KLSAgICAgICAgTGlzdEVsZW1lbnRBY3Rpb25GaWx0ZXIgZmlsdGVyID0gTGlzdEVsZW1lbnRBY3Rpb25GaWx0ZXIuZ2V0U2luZ2xldG9uKCk7Ci0KLSAgICAgICAgLy8gU2VsZWN0IHJlZCwgdmVyaWZ5IHBvcHVwLgotICAgICAgICB2aWV3LnNlbGVjdEVsZW1lbnQocmVkKTsKLSAgICAgICAgQWN0aW9uVXRpbC5maXJlQWJvdXRUb1Nob3cobWVudU1ncik7Ci0gICAgICAgIGFzc2VydFRydWUoZmlsdGVyLmdldENhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZW51TWdyLCAicmVkQWN0aW9uX3YxIikpOwotICAgICAgICBhc3NlcnROdWxsKEFjdGlvblV0aWwuZ2V0QWN0aW9uV2l0aExhYmVsKG1lbnVNZ3IsICJibHVlQWN0aW9uX3YxIikpOwotICAgICAgICBhc3NlcnROdWxsKEFjdGlvblV0aWwuZ2V0QWN0aW9uV2l0aExhYmVsKG1lbnVNZ3IsICJ0cnVlQWN0aW9uX3YxIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKEFjdGlvblV0aWwuZ2V0QWN0aW9uV2l0aExhYmVsKG1lbnVNZ3IsICJmYWxzZUFjdGlvbl92MSIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZW51TWdyLCAicmVkVHJ1ZUFjdGlvbl92MSIpKTsKLSAgICAgICAgdmlldy52ZXJpZnlBY3Rpb25zKHRoaXMsIG1lbnVNZ3IpOwotCi0gICAgICAgIC8vIFNlbGVjdCBibHVlLCB2ZXJpZnkgcG9wdXAuCi0gICAgICAgIGZpbHRlci5jbGVhckNhbGxlZCgpOwotICAgICAgICB2aWV3LnNlbGVjdEVsZW1lbnQoYmx1ZSk7Ci0gICAgICAgIEFjdGlvblV0aWwuZmlyZUFib3V0VG9TaG93KG1lbnVNZ3IpOwotICAgICAgICBhc3NlcnRUcnVlKGZpbHRlci5nZXRDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoQWN0aW9uVXRpbC5nZXRBY3Rpb25XaXRoTGFiZWwobWVudU1nciwgInJlZEFjdGlvbl92MSIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZW51TWdyLCAiYmx1ZUFjdGlvbl92MSIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZW51TWdyLCAidHJ1ZUFjdGlvbl92MSIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZW51TWdyLCAiZmFsc2VBY3Rpb25fdjEiKSk7Ci0gICAgICAgIGFzc2VydE51bGwoQWN0aW9uVXRpbC5nZXRBY3Rpb25XaXRoTGFiZWwobWVudU1nciwgInJlZFRydWVBY3Rpb25fdjEiKSk7Ci0gICAgICAgIHZpZXcudmVyaWZ5QWN0aW9ucyh0aGlzLCBtZW51TWdyKTsKLQotICAgICAgICAvLyBTZWxlY3QgZ3JlZW4sIHZlcmlmeSBwb3B1cC4KLSAgICAgICAgZmlsdGVyLmNsZWFyQ2FsbGVkKCk7Ci0gICAgICAgIHZpZXcuc2VsZWN0RWxlbWVudChncmVlbik7Ci0gICAgICAgIEFjdGlvblV0aWwuZmlyZUFib3V0VG9TaG93KG1lbnVNZ3IpOwotICAgICAgICBhc3NlcnRUcnVlKGZpbHRlci5nZXRDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoQWN0aW9uVXRpbC5nZXRBY3Rpb25XaXRoTGFiZWwobWVudU1nciwgInJlZEFjdGlvbl92MSIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZW51TWdyLCAiYmx1ZUFjdGlvbl92MSIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZW51TWdyLCAidHJ1ZUFjdGlvbl92MSIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZW51TWdyLCAiZmFsc2VBY3Rpb25fdjEiKSk7Ci0gICAgICAgIGFzc2VydE51bGwoQWN0aW9uVXRpbC5nZXRBY3Rpb25XaXRoTGFiZWwobWVudU1nciwgInJlZFRydWVBY3Rpb25fdjEiKSk7Ci0gICAgICAgIHZpZXcudmVyaWZ5QWN0aW9ucyh0aGlzLCBtZW51TWdyKTsKLQotICAgICAgICAvLyBTZWxlY3QgcmVkVHJ1ZSwgdmVyaWZ5IHBvcHVwLgotICAgICAgICBmaWx0ZXIuY2xlYXJDYWxsZWQoKTsKLSAgICAgICAgdmlldy5zZWxlY3RFbGVtZW50KHJlZFRydWUpOwotICAgICAgICBBY3Rpb25VdGlsLmZpcmVBYm91dFRvU2hvdyhtZW51TWdyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmaWx0ZXIuZ2V0Q2FsbGVkKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKEFjdGlvblV0aWwuZ2V0QWN0aW9uV2l0aExhYmVsKG1lbnVNZ3IsICJyZWRBY3Rpb25fdjEiKSk7Ci0gICAgICAgIGFzc2VydE51bGwoQWN0aW9uVXRpbC5nZXRBY3Rpb25XaXRoTGFiZWwobWVudU1nciwgImJsdWVBY3Rpb25fdjEiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoQWN0aW9uVXRpbC5nZXRBY3Rpb25XaXRoTGFiZWwobWVudU1nciwgInRydWVBY3Rpb25fdjEiKSk7Ci0gICAgICAgIGFzc2VydE51bGwoQWN0aW9uVXRpbC5nZXRBY3Rpb25XaXRoTGFiZWwobWVudU1nciwgImZhbHNlQWN0aW9uX3YxIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKEFjdGlvblV0aWwKLSAgICAgICAgICAgICAgICAuZ2V0QWN0aW9uV2l0aExhYmVsKG1lbnVNZ3IsICJyZWRUcnVlQWN0aW9uX3YxIikpOwotICAgICAgICB2aWV3LnZlcmlmeUFjdGlvbnModGhpcywgbWVudU1ncik7Ci0KLSAgICAgICAgLy8gU2VsZWN0IG5vdGhpbmcsIHZlcmlmeSBwb3B1cC4KLSAgICAgICAgZmlsdGVyLmNsZWFyQ2FsbGVkKCk7Ci0gICAgICAgIHZpZXcuc2VsZWN0RWxlbWVudChudWxsKTsKLSAgICAgICAgQWN0aW9uVXRpbC5maXJlQWJvdXRUb1Nob3cobWVudU1ncik7Ci0gICAgICAgIGFzc2VydFRydWUoIWZpbHRlci5nZXRDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoQWN0aW9uVXRpbC5nZXRBY3Rpb25XaXRoTGFiZWwobWVudU1nciwgInJlZEFjdGlvbl92MSIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZW51TWdyLCAiYmx1ZUFjdGlvbl92MSIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZW51TWdyLCAidHJ1ZUFjdGlvbl92MSIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZW51TWdyLCAiZmFsc2VBY3Rpb25fdjEiKSk7Ci0gICAgICAgIGFzc2VydE51bGwoQWN0aW9uVXRpbC5nZXRBY3Rpb25XaXRoTGFiZWwobWVudU1nciwgInJlZFRydWVBY3Rpb25fdjEiKSk7Ci0gICAgICAgIHZpZXcudmVyaWZ5QWN0aW9ucyh0aGlzLCBtZW51TWdyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JQ29uc3RhbnRzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMzlmZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotcHVibGljIGludGVyZmFjZSBJQ29uc3RhbnRzIHsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBGYWtlSUQgPSAiSXMgdGhpcyBmYWtlIElEIGZvciBidXlpbmcgYmVlciBvciBnZXR0aW5nIGludG8gYSBjbHViPyIsCi0gICAgICAgICAgICBGYWtlTGFiZWwgPSAiSG1tbS4gV2hvJ3MgdG8gc2F5IHRoaXMgaXMgYSBmYWtlIGxhYmVsPyBJIG1lYW4sIHNvbWVkYXksIHRoaXMgY2FuIGJlIGEgcmVhbCBsYWJlbC4iLAotICAgICAgICAgICAgVW5rbm93bkZpbGVOYW1lW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIG5vdCBhIGtub3duIGZpbGUgbmFtZSB0byB0aGUgd29ybGQud2l0aCBhIGNvb2wgZXh0ZW5zaW9uIiwKLSAgICAgICAgICAgICAgICAgICAgInRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBvdGhlci5hbnl3YXlzIHRoaXMgaXMgYSBmaWxlIGV4dGVuc2lvbiIgfSwKLSAgICAgICAgICAgIEtub3duRmlsZU5hbWVbXSA9IHsgInBsdWdpbi54bWwiIH0sCi0gICAgICAgICAgICBQcm9qZWN0TmFtZSA9ICJKVW5pdFRlc3RpbmdQcm9qZWN0TmFtZSI7Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lEZXByZWNhdGVkV29ya2JlbmNoUGFnZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lEZXByZWNhdGVkV29ya2JlbmNoUGFnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkZTFmOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRGVwcmVjYXRlZFdvcmtiZW5jaFBhZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuSUFjdGlvblNldERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkFycmF5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQ2FsbEhpc3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkVtcHR5UGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgSURlcHJlY2F0ZWRXb3JrYmVuY2hQYWdlVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBmQWN0aXZlUGFnZTsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyBmV2luOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBwYXJ0TWFzazsKLQotICAgIHByaXZhdGUgSVByb2plY3QgcHJvajsKLQotICAgIHB1YmxpYyBJRGVwcmVjYXRlZFdvcmtiZW5jaFBhZ2VUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIGZXaW4gPSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBmQWN0aXZlUGFnZSA9IGZXaW4uZ2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9UZWFyRG93bigpOwotICAgICAgICBpZiAocHJvaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBGaWxlVXRpbC5kZWxldGVQcm9qZWN0KHByb2opOwotICAgICAgICAgICAgcHJvaiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgl0ZXN0cyBib3RoIG9mIHRoZSBmb2xsb3dpbmc6CQotICAgICAqCXNldEVkaXRvckFyZWFWaXNpYmxlKCkKLSAgICAgKglpc0VkaXRvckFyZWFWaXNpYmxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0X1NldEVkaXRvckFyZWFWaXNpYmxlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZBY3RpdmVQYWdlLnNldEVkaXRvckFyZWFWaXNpYmxlKHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKGZBY3RpdmVQYWdlLmlzRWRpdG9yQXJlYVZpc2libGUoKSA9PSB0cnVlKTsKLQotICAgICAgICBmQWN0aXZlUGFnZS5zZXRFZGl0b3JBcmVhVmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIGFzc2VydFRydWUoZkFjdGl2ZVBhZ2UuaXNFZGl0b3JBcmVhVmlzaWJsZSgpID09IGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGVyc3BlY3RpdmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmQWN0aXZlUGFnZS5nZXRQZXJzcGVjdGl2ZSgpKTsKLQotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZldpbi5vcGVuUGFnZShFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lELCBnZXRQYWdlSW5wdXQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lELCBwYWdlLmdldFBlcnNwZWN0aXZlKCkuZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFBlcnNwZWN0aXZlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgIC5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCkuZmluZFBlcnNwZWN0aXZlV2l0aElkKAotICAgICAgICAgICAgICAgICAgICAgICAgRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCk7Ci0gICAgICAgIGZBY3RpdmVQYWdlLnNldFBlcnNwZWN0aXZlKHBlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwZXIsIGZBY3RpdmVQYWdlLmdldFBlcnNwZWN0aXZlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMYWJlbCgpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmQWN0aXZlUGFnZS5nZXRMYWJlbCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5wdXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSUFkYXB0YWJsZSBpbnB1dCA9IGdldFBhZ2VJbnB1dCgpOwotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZldpbi5vcGVuUGFnZShpbnB1dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnB1dCwgcGFnZS5nZXRJbnB1dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgTW9ja1ZpZXdQYXJ0IHBhcnQgPSAoTW9ja1ZpZXdQYXJ0KSBmQWN0aXZlUGFnZQotICAgICAgICAgICAgICAgIC5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQpOwotICAgICAgICBNb2NrVmlld1BhcnQgcGFydDIgPSAoTW9ja1ZpZXdQYXJ0KSBmQWN0aXZlUGFnZQotICAgICAgICAgICAgICAgIC5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQyKTsKLQotICAgICAgICBNb2NrUGFydExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vY2tQYXJ0TGlzdGVuZXIoKTsKLSAgICAgICAgZkFjdGl2ZVBhZ2UuYWRkUGFydExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgZkFjdGl2ZVBhZ2UuYWN0aXZhdGUocGFydCk7Ci0KLSAgICAgICAgQ2FsbEhpc3RvcnkgY2FsbFRyYWNlOwotCi0gICAgICAgIGNhbGxUcmFjZSA9IHBhcnQyLmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIGNhbGxUcmFjZS5jbGVhcigpOwotICAgICAgICBmQWN0aXZlUGFnZS5hY3RpdmF0ZShwYXJ0Mik7Ci0gICAgICAgIGFzc2VydFRydWUoY2FsbFRyYWNlLmNvbnRhaW5zKCJzZXRGb2N1cyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5nZXRDYWxsSGlzdG9yeSgpLmNvbnRhaW5zKCJwYXJ0QWN0aXZhdGVkIikpOwotCi0gICAgICAgIGNhbGxUcmFjZSA9IHBhcnQuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgIGZBY3RpdmVQYWdlLmFjdGl2YXRlKHBhcnQpOwotICAgICAgICBhc3NlcnRUcnVlKGNhbGxUcmFjZS5jb250YWlucygic2V0Rm9jdXMiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXIuZ2V0Q2FsbEhpc3RvcnkoKS5jb250YWlucygicGFydEFjdGl2YXRlZCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnJpbmdUb1RvcCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgSUVkaXRvclBhcnQgcGFydCA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBGaWxlVXRpbC5jcmVhdGVGaWxlKAotICAgICAgICAgICAgICAgICJhLm1vY2sxIiwgcHJvaiksIHRydWUpOwotICAgICAgICBJRWRpdG9yUGFydCBwYXJ0MiA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBGaWxlVXRpbC5jcmVhdGVGaWxlKAotICAgICAgICAgICAgICAgICJiLm1vY2sxIiwgcHJvaiksIHRydWUpOwotCi0gICAgICAgIE1vY2tQYXJ0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTW9ja1BhcnRMaXN0ZW5lcigpOwotICAgICAgICBmQWN0aXZlUGFnZS5hZGRQYXJ0TGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBDYWxsSGlzdG9yeSBjYWxsVHJhY2UgPSBsaXN0ZW5lci5nZXRDYWxsSGlzdG9yeSgpOwotCi0gICAgICAgIC8vYXQgdGhpcyBwb2ludCwgcGFydDIgaXMgYWN0aXZlCi0gICAgICAgIGZBY3RpdmVQYWdlLmJyaW5nVG9Ub3AocGFydCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UuY29udGFpbnMoInBhcnRCcm91Z2h0VG9Ub3AiKSwgdHJ1ZSk7Ci0KLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgIGZBY3RpdmVQYWdlLmJyaW5nVG9Ub3AocGFydDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJwYXJ0QnJvdWdodFRvVG9wIiksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXb3JrYmVuY2hXaW5kb3coKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbW1lbnRlZCBvdXQgYmVjYXVzZSB1bnRpbCB0ZXN0IGNhc2UgY2FuIGJlIHVwZGF0ZWQgdG8gd29yawotICAgICAgICAgKiB3aXRoIG5ldyB3aW5kb3cvcGFnZS9wZXJzcGVjdGl2ZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgKiAKLSAgICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKSwgZldpbik7Ci0gICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gb3BlblRlc3RQYWdlKGZXaW4pOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCksIGZXaW4pOwotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvd1ZpZXcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IFNob3dzIGEgdmlldyBpbiB0aGlzIHBhZ2UgYW5kIGdpdmUgaXQgZm9jdXMKLSAgICAgICAgICovCi0gICAgICAgIE1vY2tWaWV3UGFydCB2aWV3ID0gKE1vY2tWaWV3UGFydCkgZkFjdGl2ZVBhZ2UKLSAgICAgICAgICAgICAgICAuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2aWV3KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2aWV3LmdldENhbGxIaXN0b3J5KCkudmVyaWZ5T3JkZXIoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgImluaXQiLCAiY3JlYXRlUGFydENvbnRyb2wiLCAic2V0Rm9jdXMiIH0pKTsKLQotICAgICAgICBmQWN0aXZlUGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQyKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogSWYgdGhlIHZpZXcgaXMgYWxyZWFkeSB2aXNpYmxlLCBpdCBpcyBnaXZlbiBmb2N1cwotICAgICAgICAgKi8KLSAgICAgICAgQ2FsbEhpc3RvcnkgY2FsbFRyYWNlID0gdmlldy5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRCksIHZpZXcpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJzZXRGb2N1cyIpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglvcGVuRWRpdG9yKElGaWxlIGlucHV0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuRWRpdG9yKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJ0ZXN0T3BlbkVkaXRvciIpOwotCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZhZG9jOiAxLiBUaGUgd29ya2JlbmNoIGVkaXRvciByZWdpc3RyeSBpcyBjb25zdWx0ZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGVkaXRvciBleHRlbnNpb24gaGFzIGJlZW4KLSAgICAgICAgIHJlZ2lzdGVyZWQgZm9yIHRoZSBmaWxlIHR5cGUuIElmIHNvLCBhbiBpbnN0YW5jZSBvZiB0aGUgZWRpdG9yIGV4dGVuc2lvbiBpcyBvcGVuZWQgb24gdGhlIGZpbGUKLSAgICAgICAgICovCi0gICAgICAgIElGaWxlIGZpbGUgPSBGaWxlVXRpbC5jcmVhdGVGaWxlKCJ0ZXN0Lm1vY2sxIiwgcHJvaik7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBmaWxlLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5VXRpbC5jb250YWlucyhmQWN0aXZlUGFnZS5nZXRFZGl0b3JzKCksIGVkaXRvciksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCksIGVkaXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IuZ2V0U2l0ZSgpLmdldElkKCksIGZXb3JrYmVuY2guZ2V0RWRpdG9yUmVnaXN0cnkoKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpKS5nZXRJZCgpKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogMi4gTmV4dCwgdGhlIG5hdGl2ZSBvcGVyYXRpbmcgc3lzdGVtIHdpbGwgYmUgY29uc3VsdGVkIHRvIGRldGVybWluZSBpZiBhIG5hdGl2ZSBlZGl0b3IgZXhpc3RzIGZvciAKLSAgICAgICAgIHRoZSBmaWxlIHR5cGUuIElmIHNvLCBhIG5ldyBwcm9jZXNzIGlzIHN0YXJ0ZWQgYW5kIHRoZSBuYXRpdmUgZWRpdG9yIGlzIG9wZW5lZCBvbiB0aGUgZmlsZS4KLSAgICAgICAgICovCi0gICAgICAgIC8vY2FuIG5vdCBiZSB0ZXN0ZWQKLSAgICAgICAgLyoKLQkJICogamF2YWRvYzogMy4gSWYgYWxsIGVsc2UgZmFpbHMgdGhlIGZpbGUgd2lsbCBiZSBvcGVuZWQgaW4gYSBkZWZhdWx0Ci0JCSAqIHRleHQgZWRpdG9yLgotCQkgKi8KLQkJZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoImEubnVsbCBhbmQgdm9pZCIsIHByb2opOwotCQllZGl0b3IgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgZmlsZSwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhBcnJheVV0aWwuY29udGFpbnMoZkFjdGl2ZVBhZ2UuZ2V0RWRpdG9ycygpLCBlZGl0b3IpLCB0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpLCBlZGl0b3IpOwotCQlhc3NlcnRFcXVhbHMoZWRpdG9yLmdldFNpdGUoKS5nZXRJZCgpLAotCQkJCSJvcmcuZWNsaXBzZS51aS5EZWZhdWx0VGV4dEVkaXRvciIpOwotCi0gICAgICAgIC8vIG9wZW4gYW5vdGhlciBlZGl0b3IgdG8gdGFrZSB0aGUgZm9jdXMgYXdheSBmcm9tIHRoZSBmaXJzdCBlZGl0b3IKLSAgICAgICAgSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIEZpbGVVdGlsLmNyZWF0ZUZpbGUoInRlc3QubW9jazIiLCBwcm9qKSwKLSAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICAvKgkKLSAgICAgICAgIGphdmFkb2M6IElmIHRoaXMgcGFnZSBhbHJlYWR5IGhhcyBhbiBlZGl0b3Igb3BlbiBvbiB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IGVkaXRvciBpcyBhY3RpdmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIC8vb3BlbiB0aGUgZWRpdG9yIHNlY29uZCB0aW1lLgkJCi0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IsIElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBmaWxlLCB0cnVlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IsIGZBY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBvcGVuRWRpdG9yKElGaWxlIGlucHV0LCBTdHJpbmcgZWRpdG9ySUQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5FZGl0b3IyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJ0ZXN0T3BlbkVkaXRvciIpOwotICAgICAgICBmaW5hbCBJRmlsZSBmaWxlID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgiYXNmYXNkYXNkZiIsIHByb2opOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBNb2NrRWRpdG9yUGFydC5JRDE7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IFRoZSBlZGl0b3IgdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IG1hcHBpbmcgZWRpdG9ySWQgdG8gYW4gZWRpdG9yIGV4dGVuc2lvbiByZWdpc3RlcmVkIHdpdGggdGhlIHdvcmtiZW5jaC4KLSAgICAgICAgICovCi0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGZBY3RpdmVQYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwKLSAgICAgICAgICAgICAgICBpZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IuZ2V0U2l0ZSgpLmdldElkKCksIGlkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5VXRpbC5jb250YWlucyhmQWN0aXZlUGFnZS5nZXRFZGl0b3JzKCksIGVkaXRvciksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCksIGVkaXRvcik7Ci0KLSAgICAgICAgLy9vcGVuIGFub3RoZXIgZWRpdG9yIHRvIHRha2UgdGhlIGZvY3VzIGF3YXkgZnJvbSB0aGUgZmlyc3QgZWRpdG9yCi0gICAgICAgIElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBGaWxlVXRpbC5jcmVhdGVGaWxlKCJ0ZXN0Lm1vY2syIiwgcHJvaiksCi0gICAgICAgICAgICAgICAgdHJ1ZSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IElmIHRoaXMgcGFnZSBhbHJlYWR5IGhhcyBhbiBlZGl0b3Igb3BlbiBvbiB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IGVkaXRvciBpcyBhY3RpdmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIC8vb3BlbiB0aGUgZmlyc3QgZWRpdG9yIHNlY29uZCB0aW1lLgotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBpZCksCi0gICAgICAgICAgICAgICAgZWRpdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpLCBlZGl0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG9wZW5FZGl0b3IoSUVkaXRvcklucHV0IGlucHV0LFN0cmluZyBlZGl0b3JJZCkgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuRWRpdG9yMygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gTW9ja0VkaXRvclBhcnQuSUQxOwotICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KEZpbGVVdGlsLmNyZWF0ZUZpbGUoCi0gICAgICAgICAgICAgICAgInRlc3QubW9jazEiLCBwcm9qKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IFRoZSBlZGl0b3IgdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IG1hcHBpbmcgZWRpdG9ySWQgdG8gYW4gZWRpdG9yIGV4dGVuc2lvbiByZWdpc3RlcmVkIHdpdGggdGhlIHdvcmtiZW5jaAotICAgICAgICAgKi8KLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZkFjdGl2ZVBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgaWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldEVkaXRvcklucHV0KCksIGlucHV0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvci5nZXRTaXRlKCkuZ2V0SWQoKSwgaWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlVdGlsLmNvbnRhaW5zKGZBY3RpdmVQYWdlLmdldEVkaXRvcnMoKSwgZWRpdG9yKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSwgZWRpdG9yKTsKLQotICAgICAgICAvL29wZW4gYW5vdGhlciBlZGl0b3IgdG8gdGFrZSB0aGUgZm9jdXMgYXdheSBmcm9tIHRoZSBmaXJzdCBlZGl0b3IKLSAgICAgICAgSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIEZpbGVVdGlsLmNyZWF0ZUZpbGUoInRlc3QubW9jazIiLCBwcm9qKSwKLSAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogSWYgdGhpcyBwYWdlIGFscmVhZHkgaGFzIGFuIGVkaXRvciBvcGVuIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgZWRpdG9yIGlzIGFjdGl2YXRlZAotICAgICAgICAgKi8KLSAgICAgICAgLy9vcGVuIHRoZSBmaXJzdCBlZGl0b3Igc2Vjb25kIHRpbWUuCi0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5vcGVuRWRpdG9yKGlucHV0LCBpZCksIGVkaXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSwgZWRpdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBvcGVuRWRpdG9yKElFZGl0b3JJbnB1dCBpbnB1dCwgU3RyaW5nIGVkaXRvcklkLCBib29sZWFuIGFjdGl2YXRlKSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkVkaXRvcjQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgcHJvaiA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoInRlc3RPcGVuRWRpdG9yIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IE1vY2tFZGl0b3JQYXJ0LklEMTsKLSAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEZpbGVFZGl0b3JJbnB1dChGaWxlVXRpbC5jcmVhdGVGaWxlKAotICAgICAgICAgICAgICAgICJ0ZXN0Lm1vY2sxIiwgcHJvaikpOwotICAgICAgICBNb2NrUGFydExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vY2tQYXJ0TGlzdGVuZXIoKTsKLSAgICAgICAgZkFjdGl2ZVBhZ2UuYWRkUGFydExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgQ2FsbEhpc3RvcnkgY2FsbFRyYWNlID0gbGlzdGVuZXIuZ2V0Q2FsbEhpc3RvcnkoKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogVGhlIGVkaXRvciB0eXBlIGlzIGRldGVybWluZWQgYnkgbWFwcGluZyBlZGl0b3JJZCB0byBhbiBlZGl0b3IgZXh0ZW5zaW9uIAotICAgICAgICAgcmVnaXN0ZXJlZCB3aXRoIHRoZSB3b3JrYmVuY2guIAotICAgICAgICAgamF2YWRvYzogSWYgYWN0aXZhdGUgPT0gdHJ1ZSB0aGUgZWRpdG9yIHdpbGwgYmUgYWN0aXZhdGVkCi0gICAgICAgICAqLwotICAgICAgICAvL29wZW4gYW4gZWRpdG9yIHdpdGggYWN0aXZhdGlvbgotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBmQWN0aXZlUGFnZS5vcGVuRWRpdG9yKGlucHV0LCBpZCwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSwgaW5wdXQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldFNpdGUoKS5nZXRJZCgpLCBpZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBcnJheVV0aWwuY29udGFpbnMoZkFjdGl2ZVBhZ2UuZ2V0RWRpdG9ycygpLCBlZGl0b3IpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpLCBlZGl0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJwYXJ0QWN0aXZhdGVkIiksIHRydWUpOwotCi0gICAgICAgIC8vd2UgbmVlZCBhbm90aGVyIGVkaXRvciBzbyB0aGF0IHRoZSBlZGl0b3IgdW5kZXIgdGVzdCBjYW4gcmVjZWl2ZSBldmVudHMuCi0gICAgICAgIC8vb3RoZXJ3aXNlLCBldmVudHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICBJRWRpdG9yUGFydCBleHRyYSA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBGaWxlVXRpbC5jcmVhdGVGaWxlKAotICAgICAgICAgICAgICAgICJhYWFhYSIsIHByb2opLCB0cnVlKTsKLQotICAgICAgICAvL2Nsb3NlIHRoZSBmaXJzdCBlZGl0b3IgYWZ0ZXIgdGhlIHNlY29uZCBoYXMgb3BlbmVkOyBuZWNlc3NhcnkgZm9yCi0gICAgICAgIC8vdGVzdCB0byB3b3JrIHdpdGggZml4IHRvIFBSIDc3NDMKLSAgICAgICAgZkFjdGl2ZVBhZ2UuY2xvc2VFZGl0b3IoZWRpdG9yLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gQWN0aXZhdGUgc29tZXRoaW5nIGluIGEgZGlmZmVyZW50IHN0YWNrLCBvciB0aGUgZWRpdG9yIHdpbGwgZW5kIHVwIGFjdGl2YXRlZCByZWdhcmRsZXNzIG9mCi0gICAgICAgIC8vIHRoZSBhY3RpdmF0ZSBmbGFnLgotICAgICAgICBmQWN0aXZlUGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcsIG51bGwsIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUpOwotICAgICAgICAvL29wZW4gYW4gZWRpdG9yIHdpdGhvdXQgYWN0aXZhdGlvbgotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLSAgICAgICAgZWRpdG9yID0gZkFjdGl2ZVBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgaWQsIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpLCBpbnB1dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IuZ2V0U2l0ZSgpLmdldElkKCksIGlkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5VXRpbC5jb250YWlucyhmQWN0aXZlUGFnZS5nZXRFZGl0b3JzKCksIGVkaXRvciksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJwYXJ0QWN0aXZhdGVkIiksIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygicGFydEJyb3VnaHRUb1RvcCIpLCB0cnVlKTsKLQotICAgICAgICBmQWN0aXZlUGFnZS5hY3RpdmF0ZShleHRyYSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IElmIHRoaXMgcGFnZSBhbHJlYWR5IGhhcyBhbiBlZGl0b3Igb3BlbiBvbiB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IGVkaXRvciBpcyBicm91Z2h0IHRvIHRoZSBmcm9udAotICAgICAgICAgKi8KLSAgICAgICAgLy8gQWN0aXZhdGUgc29tZXRoaW5nIGluIGEgZGlmZmVyZW50IHN0YWNrLCBvciB0aGUgZWRpdG9yIHdpbGwgZW5kIHVwIGFjdGl2YXRlZCByZWdhcmRsZXNzIG9mCi0gICAgICAgIC8vIHRoZSBhY3RpdmF0ZSBmbGFnLgotICAgICAgICBmQWN0aXZlUGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcsIG51bGwsIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUpOwotICAgICAgICAvL29wZW4gdGhlIGVkaXRvciB1bmRlciB0ZXN0IHNlY29uZCB0aW1lIHdpdGhvdXQgYWN0aXZhdGlvbgotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLm9wZW5FZGl0b3IoaW5wdXQsIGlkLCBmYWxzZSksIGVkaXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UuY29udGFpbnMoInBhcnRCcm91Z2h0VG9Ub3AiKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UuY29udGFpbnMoInBhcnRBY3RpdmF0ZWQiKSwgZmFsc2UpOwotCi0gICAgICAgIC8vYWN0aXZhdGUgdGhlIG90aGVyIGVkaXRvcgotICAgICAgICBmQWN0aXZlUGFnZS5hY3RpdmF0ZShleHRyYSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IElmIGFjdGl2YXRlID09IHRydWUgdGhlIGVkaXRvciB3aWxsIGJlIGFjdGl2YXRlZAotICAgICAgICAgKi8KLSAgICAgICAgLy9vcGVuIHRoZSBlZGl0b3IgdW5kZXIgdGVzdCBzZWNvbmQgdGltZSB3aXRoIGFjdGl2YXRpb24KLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5vcGVuRWRpdG9yKGlucHV0LCBpZCwgdHJ1ZSksIGVkaXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UuY29udGFpbnMoInBhcnRCcm91Z2h0VG9Ub3AiKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UuY29udGFpbnMoInBhcnRBY3RpdmF0ZWQiKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogb3BlbkVkaXRvcihJTWFya2VyIG1hcmtlcikgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuRWRpdG9yNSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBGaWxlVXRpbC5jcmVhdGVGaWxlKCJhYS5tb2NrMiIsIHByb2opLmNyZWF0ZU1hcmtlcigKLSAgICAgICAgICAgICAgICBJTWFya2VyLlRBU0spOwotICAgICAgICBDYWxsSGlzdG9yeSBjYWxsVHJhY2U7Ci0KLSAgICAgICAgLyoJCi0gICAgICAgICBqYXZhZG9jOiB0aGUgY3Vyc29yIGFuZCBzZWxlY3Rpb24gc3RhdGUgb2YgdGhlIGVkaXRvciBpcyB0aGVuIHVwZGF0ZWQgZnJvbSBpbmZvcm1hdGlvbiAKLSAgICAgICAgIHJlY29yZGVkIGluIHRoZSBtYXJrZXIuIAotICAgICAgICAgKi8KLSAgICAgICAgLy9vcGVuIHRoZSByZWdpc3RlcmVkIGVkaXRvciBmb3IgdGhlIG1hcmtlciByZXNvdXJjZSAKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIG1hcmtlciwgdHJ1ZSk7Ci0gICAgICAgIGNhbGxUcmFjZSA9ICgoTW9ja0VkaXRvclBhcnQpIGVkaXRvcikuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvci5nZXRTaXRlKCkuZ2V0SWQoKSwgTW9ja0VkaXRvclBhcnQuSUQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5VXRpbC5jb250YWlucyhmQWN0aXZlUGFnZS5nZXRFZGl0b3JzKCksIGVkaXRvciksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCksIGVkaXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UuY29udGFpbnMoImdvdG9NYXJrZXIiKSwgdHJ1ZSk7Ci0gICAgICAgIGZBY3RpdmVQYWdlLmNsb3NlRWRpdG9yKGVkaXRvciwgZmFsc2UpOwotCi0gICAgICAgIC8qCQotICAgICAgICAgamF2YWRvYzogSWYgdGhlIG1hcmtlciBjb250YWlucyBhbiBFRElUT1JfSURfQVRUUiBhdHRyaWJ1dGUgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gCi0gICAgICAgICBkZXRlcm1pbmUgdGhlIGVkaXRvciB0eXBlIHRvIGJlIG9wZW5lZAotICAgICAgICAgKi8KLSAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZShJV29ya2JlbmNoUGFnZS5FRElUT1JfSURfQVRUUiwgTW9ja0VkaXRvclBhcnQuSUQxKTsKLSAgICAgICAgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIG1hcmtlciwgdHJ1ZSk7Ci0gICAgICAgIGNhbGxUcmFjZSA9ICgoTW9ja0VkaXRvclBhcnQpIGVkaXRvcikuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvci5nZXRTaXRlKCkuZ2V0SWQoKSwgTW9ja0VkaXRvclBhcnQuSUQxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5VXRpbC5jb250YWlucyhmQWN0aXZlUGFnZS5nZXRFZGl0b3JzKCksIGVkaXRvciksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCksIGVkaXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UuY29udGFpbnMoImdvdG9NYXJrZXIiKSwgdHJ1ZSk7Ci0gICAgICAgIC8vZG8gbm90IGNsb3NlIHRoZSBlZGl0b3IgdGhpcyB0aW1lCi0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmRvYzogSWYgdGhpcyBwYWdlIGFscmVhZHkgaGFzIGFuIGVkaXRvciBvcGVuIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgZWRpdG9yIGlzIGFjdGl2YXRlZAotICAgICAgICAgKi8KLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgbWFya2VyLCB0cnVlKSwgZWRpdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpLCBlZGl0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJnb3RvTWFya2VyIiksIHRydWUpOwotICAgICAgICBmQWN0aXZlUGFnZS5jbG9zZUVkaXRvcihlZGl0b3IsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglvcGVuRWRpdG9yKElNYXJrZXIgbWFya2VyLCBib29sZWFuIGFjdGl2YXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkVkaXRvcjYoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgcHJvaiA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoInRlc3RPcGVuRWRpdG9yIik7Ci0gICAgICAgIElNYXJrZXIgbWFya2VyID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgiYWEubW9jazIiLCBwcm9qKS5jcmVhdGVNYXJrZXIoCi0gICAgICAgICAgICAgICAgSU1hcmtlci5UQVNLKTsKLSAgICAgICAgTW9ja1BhcnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb2NrUGFydExpc3RlbmVyKCk7Ci0gICAgICAgIGZBY3RpdmVQYWdlLmFkZFBhcnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIENhbGxIaXN0b3J5IGxpc3RlbmVyQ2FsbCA9IGxpc3RlbmVyLmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIENhbGxIaXN0b3J5IGVkaXRvckNhbGw7Ci0KLSAgICAgICAgLy93ZSBuZWVkIGFub3RoZXIgZWRpdG9yIHNvIHRoYXQgdGhlIGVkaXRvciB1bmRlciB0ZXN0IGNhbiByZWNlaXZlIGV2ZW50cy4KLSAgICAgICAgLy9vdGhlcndpc2UsIGV2ZW50cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgIElFZGl0b3JQYXJ0IGV4dHJhID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIEZpbGVVdGlsLmNyZWF0ZUZpbGUoCi0gICAgICAgICAgICAgICAgImFhYWFhIiwgcHJvaiksIHRydWUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZhZG9jOiBJZiBhY3RpdmF0ZSA9PSB0cnVlIHRoZSBlZGl0b3Igd2lsbCBiZSBhY3RpdmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIC8vb3BlbiB0aGUgcmVnaXN0ZXJlZCBlZGl0b3IgZm9yIHRoZSBtYXJrZXIgcmVzb3VyY2Ugd2l0aCBhY3RpdmF0aW9uCi0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBtYXJrZXIsIHRydWUpOwotICAgICAgICBlZGl0b3JDYWxsID0gKChNb2NrRWRpdG9yUGFydCkgZWRpdG9yKS5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldFNpdGUoKS5nZXRJZCgpLCBNb2NrRWRpdG9yUGFydC5JRDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlVdGlsLmNvbnRhaW5zKGZBY3RpdmVQYWdlLmdldEVkaXRvcnMoKSwgZWRpdG9yKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSwgZWRpdG9yKTsKLQotICAgICAgICAvKgkKLSAgICAgICAgIGphdmFkb2M6IHRoZSBjdXJzb3IgYW5kIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGUgZWRpdG9yIGlzIHRoZW4gdXBkYXRlZCBmcm9tIGluZm9ybWF0aW9uIAotICAgICAgICAgcmVjb3JkZWQgaW4gdGhlIG1hcmtlci4gCi0gICAgICAgICAqLwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yQ2FsbC5jb250YWlucygiZ290b01hcmtlciIpLCB0cnVlKTsKLSAgICAgICAgZkFjdGl2ZVBhZ2UuY2xvc2VFZGl0b3IoZWRpdG9yLCBmYWxzZSk7Ci0KLSAgICAgICAgZkFjdGl2ZVBhZ2UuYWN0aXZhdGUoZXh0cmEpOwotCi0gICAgICAgIC8vIEFjdGl2YXRlIHNvbWV0aGluZyBpbiBhIGRpZmZlcmVudCBzdGFjaywgb3IgdGhlIGVkaXRvciB3aWxsIGVuZCB1cCBhY3RpdmF0ZWQgcmVnYXJkbGVzcyBvZgotICAgICAgICAvLyB0aGUgYWN0aXZhdGUgZmxhZy4KLSAgICAgICAgZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFKTsKLSAgICAgICAgCi0gICAgICAgIC8vb3BlbiB0aGUgcmVnaXN0ZXJlZCBlZGl0b3IgZm9yIHRoZSBtYXJrZXIgcmVzb3VyY2Ugd2l0aG91dCBhY3RpdmF0aW9uCi0gICAgICAgIGxpc3RlbmVyQ2FsbC5jbGVhcigpOwotICAgICAgICBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgbWFya2VyLCBmYWxzZSk7Ci0gICAgICAgIGVkaXRvckNhbGwgPSAoKE1vY2tFZGl0b3JQYXJ0KSBlZGl0b3IpLmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IuZ2V0U2l0ZSgpLmdldElkKCksIE1vY2tFZGl0b3JQYXJ0LklEMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBcnJheVV0aWwuY29udGFpbnMoZkFjdGl2ZVBhZ2UuZ2V0RWRpdG9ycygpLCBlZGl0b3IpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2FsbC5jb250YWlucygicGFydEJyb3VnaHRUb1RvcCIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2FsbC5jb250YWlucygicGFydEFjdGl2YXRlZCIpLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3JDYWxsLmNvbnRhaW5zKCJnb3RvTWFya2VyIiksIHRydWUpOwotICAgICAgICBmQWN0aXZlUGFnZS5jbG9zZUVkaXRvcihlZGl0b3IsIGZhbHNlKTsKLQotICAgICAgICAvKgkKLSAgICAgICAgIGphdmFkb2M6IElmIHRoZSBtYXJrZXIgY29udGFpbnMgYW4gRURJVE9SX0lEX0FUVFIgYXR0cmlidXRlIHRoZSBhdHRyaWJ1dGUgdmFsdWUgd2lsbCBiZSB1c2VkIHRvIAotICAgICAgICAgZGV0ZXJtaW5lIHRoZSBlZGl0b3IgdHlwZSB0byBiZSBvcGVuZWQKLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBpZCA9IE1vY2tFZGl0b3JQYXJ0LklEMTsKLSAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZShJV29ya2JlbmNoUGFnZS5FRElUT1JfSURfQVRUUiwgaWQpOwotCi0gICAgICAgIC8vb3BlbiBhbiBlZGl0b3Igd2l0aCBhY3RpdmF0aW9uCi0gICAgICAgIGxpc3RlbmVyQ2FsbC5jbGVhcigpOwotCi0gICAgICAgIGVkaXRvciA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBtYXJrZXIsIHRydWUpOwotICAgICAgICBlZGl0b3JDYWxsID0gKChNb2NrRWRpdG9yUGFydCkgZWRpdG9yKS5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldFNpdGUoKS5nZXRJZCgpLCBpZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBcnJheVV0aWwuY29udGFpbnMoZkFjdGl2ZVBhZ2UuZ2V0RWRpdG9ycygpLCBlZGl0b3IpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpLCBlZGl0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yQ2FsbC5jb250YWlucygiZ290b01hcmtlciIpLCB0cnVlKTsKLSAgICAgICAgZkFjdGl2ZVBhZ2UuY2xvc2VFZGl0b3IoZWRpdG9yLCBmYWxzZSk7Ci0KLSAgICAgICAgZkFjdGl2ZVBhZ2UuYWN0aXZhdGUoZXh0cmEpOwotCi0gICAgICAgIC8vIEFjdGl2YXRlIHNvbWV0aGluZyBpbiBhIGRpZmZlcmVudCBzdGFjaywgb3IgdGhlIGVkaXRvciB3aWxsIGVuZCB1cCBhY3RpdmF0ZWQgcmVnYXJkbGVzcyBvZgotICAgICAgICAvLyB0aGUgYWN0aXZhdGUgZmxhZy4KLSAgICAgICAgZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFKTsKLSAgICAgICAgCi0gICAgICAgIC8vb3BlbiBhbiBlZGl0b3Igd2l0aG91dCBhY3RpdmF0aW9uCi0gICAgICAgIGxpc3RlbmVyQ2FsbC5jbGVhcigpOwotICAgICAgICBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgbWFya2VyLCBmYWxzZSk7Ci0gICAgICAgIGVkaXRvckNhbGwgPSAoKE1vY2tFZGl0b3JQYXJ0KSBlZGl0b3IpLmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IuZ2V0U2l0ZSgpLmdldElkKCksIGlkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5VXRpbC5jb250YWlucyhmQWN0aXZlUGFnZS5nZXRFZGl0b3JzKCksIGVkaXRvciksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yQ2FsbC5jb250YWlucygiZ290b01hcmtlciIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2FsbC5jb250YWlucygicGFydEFjdGl2YXRlZCIpLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0ZW5lckNhbGwuY29udGFpbnMoInBhcnRCcm91Z2h0VG9Ub3AiKSwgdHJ1ZSk7Ci0gICAgICAgIC8vZG8gbm90IGNsb3NlIHRoZSBlZGl0b3IgdGhpcyB0aW1lCi0KLSAgICAgICAgZkFjdGl2ZVBhZ2UuYWN0aXZhdGUoZXh0cmEpOwotCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZhZG9jOiBJZiB0aGlzIHBhZ2UgYWxyZWFkeSBoYXMgYW4gZWRpdG9yIG9wZW4gb24gdGhlIHRhcmdldCBvYmplY3QgdGhhdCBlZGl0b3IgaXMgYnJvdWdodCB0byBmcm9udAotICAgICAgICAgKi8KLSAgICAgICAgLy8gQWN0aXZhdGUgc29tZXRoaW5nIGluIGEgZGlmZmVyZW50IHN0YWNrLCBvciB0aGUgZWRpdG9yIHdpbGwgZW5kIHVwIGFjdGl2YXRlZCByZWdhcmRsZXNzIG9mCi0gICAgICAgIC8vIHRoZSBhY3RpdmF0ZSBmbGFnLgotICAgICAgICBmQWN0aXZlUGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcsIG51bGwsIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUpOwotICAgICAgICAvL29wZW4gdGhlIGVkaXRvciBzZWNvbmQgdGltZSB3aXRob3V0IGFjdGl2YXRpb24KLSAgICAgICAgbGlzdGVuZXJDYWxsLmNsZWFyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgbWFya2VyLCBmYWxzZSksIGVkaXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0ZW5lckNhbGwuY29udGFpbnMoInBhcnRCcm91Z2h0VG9Ub3AiKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0ZW5lckNhbGwuY29udGFpbnMoInBhcnRBY3RpdmF0ZWQiKSwgZmFsc2UpOwotCi0gICAgICAgIGZBY3RpdmVQYWdlLmFjdGl2YXRlKGV4dHJhKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2ZG9jOiBJZiBhY3RpdmF0ZSA9PSB0cnVlIHRoZSBlZGl0b3Igd2lsbCBiZSBhY3RpdmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIC8vb3BlbiB0aGUgZWRpdG9yIHNlY29uZCB0aW1lIHdpdGggYWN0aXZhdGlvbiAJCQotICAgICAgICBsaXN0ZW5lckNhbGwuY2xlYXIoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBtYXJrZXIsIHRydWUpLCBlZGl0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yQ2FsbC5jb250YWlucygiZ290b01hcmtlciIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2FsbC5jb250YWlucygicGFydEJyb3VnaHRUb1RvcCIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2FsbC5jb250YWlucygicGFydEFjdGl2YXRlZCIpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZFZpZXcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgU3RyaW5nIGlkID0gTW9ja1ZpZXdQYXJ0LklEMzsKLSAgICAgICAgLy9pZCBvZiB2YWxpZCwgYnV0IG5vdCBvcGVuIHZpZXcKLSAgICAgICAgYXNzZXJ0TnVsbChmQWN0aXZlUGFnZS5maW5kVmlldyhpZCkpOwotCi0gICAgICAgIElWaWV3UGFydCB2aWV3ID0gZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoaWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuZmluZFZpZXcoaWQpLCB2aWV3KTsKLQotICAgICAgICAvL2Nsb3NlIHZpZXcJCQotICAgICAgICBmQWN0aXZlUGFnZS5oaWRlVmlldyh2aWV3KTsKLSAgICAgICAgYXNzZXJ0TnVsbChmQWN0aXZlUGFnZS5maW5kVmlldyhpZCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRWaWV3cygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBpbnQgdG90YWxCZWZvcmUgPSBmQWN0aXZlUGFnZS5nZXRWaWV3cygpLmxlbmd0aDsKLQotICAgICAgICBJVmlld1BhcnQgdmlldyA9IGZBY3RpdmVQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlVdGlsLmNvbnRhaW5zKGZBY3RpdmVQYWdlLmdldFZpZXdzKCksIHZpZXcpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmdldFZpZXdzKCkubGVuZ3RoLCB0b3RhbEJlZm9yZSArIDEpOwotCi0gICAgICAgIGZBY3RpdmVQYWdlLmhpZGVWaWV3KHZpZXcpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlVdGlsLmNvbnRhaW5zKGZBY3RpdmVQYWdlLmdldFZpZXdzKCksIHZpZXcpLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRWaWV3cygpLmxlbmd0aCwgdG90YWxCZWZvcmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIaWRlVmlldygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBJVmlld1BhcnQgdmlldyA9IGZBY3RpdmVQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRDMpOwotCi0gICAgICAgIGZBY3RpdmVQYWdlLmhpZGVWaWV3KHZpZXcpOwotICAgICAgICBDYWxsSGlzdG9yeSBjYWxsVHJhY2UgPSAoKE1vY2tWaWV3UGFydCkgdmlldykuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjYWxsVHJhY2UuY29udGFpbnMoImRpc3Bvc2UiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBvcGVuVGVzdFBhZ2UoZldpbik7Ci0KLSAgICAgICAgcHJvaiA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoInRlc3RPcGVuRWRpdG9yIik7Ci0gICAgICAgIGZpbmFsIElGaWxlIGZpbGUgPSBGaWxlVXRpbC5jcmVhdGVGaWxlKCJhYWEubW9jazEiLCBwcm9qKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0gICAgICAgIENhbGxIaXN0b3J5IGNhbGxUcmFjZSA9ICgoTW9ja0VkaXRvclBhcnQpIGVkaXRvcikuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IElmIHRoZSBwYWdlIGhhcyBvcGVuIGVkaXRvcnMgd2l0aCB1bnNhdmVkIGNvbnRlbnQgYW5kIHNhdmUgaXMgdHJ1ZSwgdGhlIHVzZXIgd2lsbCBiZSBnaXZlbiB0aGUgb3Bwb3J0dW5pdHkgdG8gc2F2ZSB0aGVtCi0gICAgICAgICAqLwotICAgICAgICBhc3NlcnRFcXVhbHMocGFnZS5jbG9zZSgpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZQotICAgICAgICAgICAgICAgIC52ZXJpZnlPcmRlcihuZXcgU3RyaW5nW10geyAiaXNEaXJ0eSIsICJkaXNwb3NlIiB9KSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmV2luLmdldEFjdGl2ZVBhZ2UoKSwgZkFjdGl2ZVBhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUVkaXRvcigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgZmluYWwgSUZpbGUgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoInRlc3QubW9jazEiLCBwcm9qKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yOwotICAgICAgICBDYWxsSGlzdG9yeSBjYWxsVHJhY2U7Ci0gICAgICAgIE1vY2tFZGl0b3JQYXJ0IG1vY2s7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IFBhcmFtZXRlcnM6IHNhdmUgLSB0cnVlIHRvIHNhdmUgdGhlIGVkaXRvciBjb250ZW50cyBpZiByZXF1aXJlZCAocmVjb21tZW5kZWQpCi0gICAgICAgICAqLwotICAgICAgICAvL2NyZWF0ZSBhIGNsZWFuIGVkaXRvciB0aGF0IG5lZWRzIHRvIGJlIHNhdmVkIG9uIGNsb3NpbmcKLSAgICAgICAgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIGZpbGUsIHRydWUpOwotICAgICAgICBtb2NrID0gKE1vY2tFZGl0b3JQYXJ0KSBlZGl0b3I7Ci0gICAgICAgIG1vY2suc2V0U2F2ZU5lZWRlZCh0cnVlKTsKLSAgICAgICAgY2FsbFRyYWNlID0gbW9jay5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLSAgICAgICAgLy9jbG9zZSB0aGUgZWRpdG9yIHdpdGggc2F2ZSBjb25maXJtYXRpb24KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmNsb3NlRWRpdG9yKGVkaXRvciwgdHJ1ZSksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlCi0gICAgICAgICAgICAgICAgLnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7ICJpc0RpcnR5IiwgImRpc3Bvc2UiIH0pLCB0cnVlKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogSWYgdGhlIGVkaXRvciBoYXMgdW5zYXZlZCBjb250ZW50IGFuZCBzYXZlIGlzIHRydWUsIHRoZSB1c2VyIHdpbGwgYmUgZ2l2ZW4gdGhlIG9wcG9ydHVuaXR5IHRvIHNhdmUgaXQuCi0gICAgICAgICAqLwotICAgICAgICAvL2Nhbid0IGJlIHRlc3RlZAotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogUGFyYW1ldGVyczogc2F2ZSAtIGZhbHNlIHRvIGRpc2NhcmQgYW55IHVuc2F2ZWQgY2hhbmdlcwotICAgICAgICAgKi8KLSAgICAgICAgLy9jcmVhdGUgYSBkaXJ0eSBlZGl0b3IKLSAgICAgICAgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIGZpbGUsIHRydWUpOwotICAgICAgICBtb2NrID0gKE1vY2tFZGl0b3JQYXJ0KSBlZGl0b3I7Ci0gICAgICAgIG1vY2suc2V0RGlydHkodHJ1ZSk7Ci0gICAgICAgIG1vY2suc2V0U2F2ZU5lZWRlZCh0cnVlKTsKLSAgICAgICAgY2FsbFRyYWNlID0gbW9jay5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLSAgICAgICAgLy9jbG9zZSB0aGUgZWRpdG9yIGFuZCBkaXNjYXJkIGNoYW5nZXMKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmNsb3NlRWRpdG9yKGVkaXRvciwgZmFsc2UpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygiaXNTYXZlT25DbG9zZU5lZWRlZCIpLCBmYWxzZSk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZSBhY3Rpb24gbWF5IHF1ZXJ5IHRoZSBpc0RpcnR5IHZhbHVlIG9mCi0gICAgICAgICAqIHRoZSBlZGl0b3IgdG8gdXBkYXRlIGl0cyBlbmFibGVkIHN0YXRlLiBUaGVyZSBpcyBub3RoaW5nIHdyb25nCi0gICAgICAgICAqIGluIGRvaW5nIHRoYXQsIHNvIGRvIG5vdCB0ZXN0IGZvciBubyBpc0RpcnR5IGNhbGwgaGVyZS4KLSAgICAgICAgICoKLSAgICAgICAgICogYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucyggImlzRGlydHkiKSwgZmFsc2UpOwotICAgICAgICAgKi8KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygiZG9TYXZlIiksIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygiZGlzcG9zZSIpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VBbGxFZGl0b3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGludCB0b3RhbCA9IDU7Ci0gICAgICAgIGZpbmFsIElGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbdG90YWxdOwotICAgICAgICBJRWRpdG9yUGFydFtdIGVkaXRvcnMgPSBuZXcgSUVkaXRvclBhcnRbdG90YWxdOwotICAgICAgICBDYWxsSGlzdG9yeVtdIGNhbGxUcmFjZXMgPSBuZXcgQ2FsbEhpc3RvcnlbdG90YWxdOwotICAgICAgICBNb2NrRWRpdG9yUGFydFtdIG1vY2tzID0gbmV3IE1vY2tFZGl0b3JQYXJ0W3RvdGFsXTsKLQotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKQotICAgICAgICAgICAgZmlsZXNbaV0gPSBGaWxlVXRpbC5jcmVhdGVGaWxlKGkgKyAiLm1vY2syIiwgcHJvaik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IElmIHRoZSBwYWdlIGhhcyBvcGVuIGVkaXRvcnMgd2l0aCB1bnNhdmVkIGNvbnRlbnQgYW5kIHNhdmUgaXMgdHJ1ZSwgdGhlIHVzZXIgd2lsbCBiZSBnaXZlbiB0aGUgb3Bwb3J0dW5pdHkgdG8gc2F2ZSB0aGVtLgotICAgICAgICAgKi8KLSAgICAgICAgLy9jbG9zZSBhbGwgY2xlYW4gZWRpdG9ycyB3aXRoIGNvbmZpcm1hdGlvbgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKLSAgICAgICAgICAgIGVkaXRvcnNbaV0gPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgZmlsZXNbaV0sIHRydWUpOwotICAgICAgICAgICAgY2FsbFRyYWNlc1tpXSA9ICgoTW9ja0VkaXRvclBhcnQpIGVkaXRvcnNbaV0pLmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmNsb3NlQWxsRWRpdG9ycyh0cnVlKSwgdHJ1ZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWw7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZXNbaV0uY29udGFpbnMoImlzRGlydHkiKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlc1tpXS5jb250YWlucygiZG9TYXZlIiksIGZhbHNlKTsKLSAgICAgICAgICAgIGNhbGxUcmFjZXNbaV0uY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vY2xvc2UgYWxsIGRpcnR5IGVkaXRvcnMgd2l0aCBjb25maXJtYXRpb24KLSAgICAgICAgLy9jYW4ndCBiZSB0ZXN0ZWQJCQotCi0gICAgICAgIC8vY2xvc2UgYWxsIGRpcnR5IGVkaXRvcnMgZGlzY2FyZGluZyB0aGVtCQkKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7Ci0gICAgICAgICAgICBlZGl0b3JzW2ldID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIGZpbGVzW2ldLCB0cnVlKTsKLSAgICAgICAgICAgIG1vY2tzW2ldID0gKE1vY2tFZGl0b3JQYXJ0KSBlZGl0b3JzW2ldOwotICAgICAgICAgICAgbW9ja3NbaV0uc2V0RGlydHkodHJ1ZSk7Ci0gICAgICAgICAgICBjYWxsVHJhY2VzW2ldID0gbW9ja3NbaV0uZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKSwgdHJ1ZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWw7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZXNbaV0uY29udGFpbnMoImRvU2F2ZSIpLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUVkaXRvcigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgZmluYWwgSUZpbGUgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoInRlc3QubW9jazEiLCBwcm9qKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yOwotICAgICAgICBDYWxsSGlzdG9yeSBjYWxsVHJhY2U7Ci0gICAgICAgIE1vY2tFZGl0b3JQYXJ0IG1vY2s7Ci0KLSAgICAgICAgLy9jcmVhdGUgYSBjbGVhbiBlZGl0b3IKLSAgICAgICAgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIGZpbGUsIHRydWUpOwotICAgICAgICBtb2NrID0gKE1vY2tFZGl0b3JQYXJ0KSBlZGl0b3I7Ci0gICAgICAgIGNhbGxUcmFjZSA9IG1vY2suZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IFNhdmVzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZWRpdG9yIGlmIGRpcnR5LiAKLSAgICAgICAgIElmIG5vdCwgdGhpcyBtZXRob2QgcmV0dXJucyB3aXRob3V0IGVmZmVjdAotICAgICAgICAgKi8KLSAgICAgICAgLy9zYXZlIHRoZSBjbGVhbiBlZGl0b3Igd2l0aCBjb25maXJtYXRpb24JCQotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2Uuc2F2ZUVkaXRvcihlZGl0b3IsIHRydWUpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygiaXNEaXJ0eSIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygiZG9TYXZlIiksIGZhbHNlKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogSWYgY29uZmlybSBpcyB0cnVlIHRoZSB1c2VyIGlzIHByb21wdGVkIHRvIGNvbmZpcm0gdGhlIGNvbW1hbmQuIAotICAgICAgICAgKi8KLSAgICAgICAgLy9jYW4ndCBiZSB0ZXN0ZWQKLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IE90aGVyd2lzZSwgdGhlIHNhdmUgaGFwcGVucyB3aXRob3V0IHByb21wdC4gCi0gICAgICAgICAqLwotICAgICAgICAvL3NhdmUgdGhlIGNsZWFuIGVkaXRvciB3aXRob3V0IGNvbmZpcm1hdGlvbgotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2Uuc2F2ZUVkaXRvcihlZGl0b3IsIGZhbHNlKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UuY29udGFpbnMoImlzRGlydHkiKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UuY29udGFpbnMoImRvU2F2ZSIpLCBmYWxzZSk7Ci0KLSAgICAgICAgLy9zYXZlIHRoZSBkaXJ0eSBlZGl0b3Igd2l0aG91dCBjb25maXJtYXRpb24KLSAgICAgICAgbW9jay5zZXREaXJ0eSh0cnVlKTsKLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5zYXZlRWRpdG9yKGVkaXRvciwgZmFsc2UpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZQotICAgICAgICAgICAgICAgIC52ZXJpZnlPcmRlcihuZXcgU3RyaW5nW10geyAiaXNEaXJ0eSIsICJkb1NhdmUiIH0pLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUFsbEVkaXRvcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaW50IHRvdGFsID0gMzsKLQotICAgICAgICBmaW5hbCBJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlW3RvdGFsXTsKLSAgICAgICAgSUVkaXRvclBhcnRbXSBlZGl0b3JzID0gbmV3IElFZGl0b3JQYXJ0W3RvdGFsXTsKLSAgICAgICAgQ2FsbEhpc3RvcnlbXSBjYWxsVHJhY2VzID0gbmV3IENhbGxIaXN0b3J5W3RvdGFsXTsKLSAgICAgICAgTW9ja0VkaXRvclBhcnRbXSBtb2NrcyA9IG5ldyBNb2NrRWRpdG9yUGFydFt0b3RhbF07Ci0KLSAgICAgICAgcHJvaiA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoInRlc3RPcGVuRWRpdG9yIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWw7IGkrKykgewotICAgICAgICAgICAgZmlsZXNbaV0gPSBGaWxlVXRpbC5jcmVhdGVGaWxlKGkgKyAiLm1vY2syIiwgcHJvaik7Ci0gICAgICAgICAgICBlZGl0b3JzW2ldID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIGZpbGVzW2ldLCB0cnVlKTsKLSAgICAgICAgICAgIG1vY2tzW2ldID0gKE1vY2tFZGl0b3JQYXJ0KSBlZGl0b3JzW2ldOwotICAgICAgICAgICAgY2FsbFRyYWNlc1tpXSA9IG1vY2tzW2ldLmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogSWYgdGhlcmUgYXJlIG5vIGRpcnR5IGVkaXRvcnMgdGhpcyBtZXRob2QgcmV0dXJucyB3aXRob3V0IGVmZmVjdC4KLSAgICAgICAgIGphdmFkb2M6IElmIGNvbmZpcm0gaXMgdHJ1ZSB0aGUgdXNlciBpcyBwcm9tcHRlZCB0byBjb25maXJtIHRoZSBjb21tYW5kCi0gICAgICAgICAqLwotICAgICAgICAvL3NhdmUgYWxsIGNsZWFuIGVkaXRvcnMgd2l0aCBjb25maXJtYXRpb24KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLnNhdmVBbGxFZGl0b3JzKHRydWUpLCB0cnVlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlc1tpXS5jb250YWlucygiaXNEaXJ0eSIpLCB0cnVlKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2VzW2ldLmNvbnRhaW5zKCJkb1NhdmUiKSwgZmFsc2UpOwotICAgICAgICAgICAgY2FsbFRyYWNlc1tpXS5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zYXZlIGFsbCBkaXJ0eSBlZGl0b3JzIHdpdGggY29uZmlybWF0aW9uIGNhbid0IGJlIHRlc3RlZAotCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZhZG9jOiBQYXJhbWV0ZXJzOiBjb25maXJtIC0gZmFsc2UgdG8gc2F2ZSB1bnNhdmVkIGNoYW5nZXMgd2l0aG91dCBhc2tpbmcKLSAgICAgICAgICovCi0gICAgICAgIC8vc2F2ZSBhbGwgY2xlYW4gZWRpdG9ycyB3aXRob3V0IGNvbmZpcm1hdGlvbgotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2Uuc2F2ZUFsbEVkaXRvcnMoZmFsc2UpLCB0cnVlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlc1tpXS5jb250YWlucygiaXNEaXJ0eSIpLCB0cnVlKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2VzW2ldLmNvbnRhaW5zKCJkb1NhdmUiKSwgZmFsc2UpOwotICAgICAgICAgICAgY2FsbFRyYWNlc1tpXS5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zYXZlIGFsbCBkaXJ0eSBlZGl0b3JzIHdpdGhvdXQgY29uZmlybWF0aW9uCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWw7IGkrKykKLSAgICAgICAgICAgIG1vY2tzW2ldLnNldERpcnR5KHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2Uuc2F2ZUFsbEVkaXRvcnMoZmFsc2UpLCB0cnVlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZXNbaV0udmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgImlzRGlydHkiLAotICAgICAgICAgICAgICAgICAgICAiZG9TYXZlIiB9KSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEVkaXRvcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgcHJvaiA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoInRlc3RPcGVuRWRpdG9yIik7Ci0gICAgICAgIGludCB0b3RhbEJlZm9yZSA9IGZBY3RpdmVQYWdlLmdldEVkaXRvcnMoKS5sZW5ndGg7Ci0gICAgICAgIGludCBudW0gPSAzOwotICAgICAgICBJRWRpdG9yUGFydFtdIGVkaXRvcnMgPSBuZXcgSUVkaXRvclBhcnRbbnVtXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0gICAgICAgICAgICBlZGl0b3JzW2ldID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIEZpbGVVdGlsLmNyZWF0ZUZpbGUoaQotICAgICAgICAgICAgICAgICAgICArICIubW9jazIiLCBwcm9qKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlVdGlsLmNvbnRhaW5zKGZBY3RpdmVQYWdlLmdldEVkaXRvcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgZWRpdG9yc1tpXSksIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRFZGl0b3JzKCkubGVuZ3RoLCB0b3RhbEJlZm9yZSArIG51bSk7Ci0KLSAgICAgICAgZkFjdGl2ZVBhZ2UuY2xvc2VFZGl0b3IoZWRpdG9yc1swXSwgZmFsc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlVdGlsLmNvbnRhaW5zKGZBY3RpdmVQYWdlLmdldEVkaXRvcnMoKSwgZWRpdG9yc1swXSksCi0gICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuZ2V0RWRpdG9ycygpLmxlbmd0aCwgdG90YWxCZWZvcmUgKyBudW0gLSAxKTsKLQotICAgICAgICBmQWN0aXZlUGFnZS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuZ2V0RWRpdG9ycygpLmxlbmd0aCwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3dBY3Rpb25TZXQoKSB7Ci0gICAgICAgIFN0cmluZyBpZCA9IE1vY2tBY3Rpb25EZWxlZ2F0ZS5BQ1RJT05fU0VUX0lEOwotICAgICAgICBXb3JrYmVuY2hQYWdlIHBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgZkFjdGl2ZVBhZ2U7Ci0KLSAgICAgICAgaW50IHRvdGFsQmVmb3JlID0gcGFnZS5nZXRBY3Rpb25TZXRzKCkubGVuZ3RoOwotICAgICAgICBmQWN0aXZlUGFnZS5zaG93QWN0aW9uU2V0KGlkKTsKLQotICAgICAgICBJQWN0aW9uU2V0RGVzY3JpcHRvcltdIHNldHMgPSAoKFdvcmtiZW5jaFBhZ2UpIGZBY3RpdmVQYWdlKQotICAgICAgICAgICAgICAgIC5nZXRBY3Rpb25TZXRzKCk7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhzZXRzW2ldLmdldElkKCkpKQotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCB0cnVlKTsKLQotICAgICAgICAvL2NoZWNrIHRoYXQgdGhlIG1ldGhvZCBkb2VzIG5vdCBhZGQgYW4gaW52YWxpZCBhY3Rpb24gc2V0IHRvIGl0c2VsZgotICAgICAgICBpZCA9IElDb25zdGFudHMuRmFrZUlEOwotICAgICAgICBmQWN0aXZlUGFnZS5zaG93QWN0aW9uU2V0KGlkKTsKLQotICAgICAgICBzZXRzID0gKChXb3JrYmVuY2hQYWdlKSBmQWN0aXZlUGFnZSkuZ2V0QWN0aW9uU2V0cygpOwotICAgICAgICBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKHNldHNbaV0uZ2V0SWQoKSkpCi0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICBhc3NlcnRFcXVhbHMoZm91bmQsIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2UuZ2V0QWN0aW9uU2V0cygpLmxlbmd0aCwgdG90YWxCZWZvcmUgKyAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGlkZUFjdGlvblNldCgpIHsKLSAgICAgICAgV29ya2JlbmNoUGFnZSBwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIGZBY3RpdmVQYWdlOwotICAgICAgICBpbnQgdG90YWxCZWZvcmUgPSBwYWdlLmdldEFjdGlvblNldHMoKS5sZW5ndGg7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gTW9ja1dvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlLlNFVF9JRDsKLSAgICAgICAgZkFjdGl2ZVBhZ2Uuc2hvd0FjdGlvblNldChpZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYWdlLmdldEFjdGlvblNldHMoKS5sZW5ndGgsIHRvdGFsQmVmb3JlICsgMSk7Ci0KLSAgICAgICAgZkFjdGl2ZVBhZ2UuaGlkZUFjdGlvblNldChpZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYWdlLmdldEFjdGlvblNldHMoKS5sZW5ndGgsIHRvdGFsQmVmb3JlKTsKLQotICAgICAgICBJQWN0aW9uU2V0RGVzY3JpcHRvcltdIHNldHMgPSBwYWdlLmdldEFjdGlvblNldHMoKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKHNldHNbaV0uZ2V0SWQoKSkpCi0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICBhc3NlcnRFcXVhbHMoZm91bmQsIGZhbHNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDBhYjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5DYWxsSGlzdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGhpcyBpcyBhIHRlc3QgZm9yIElFZGl0b3JQYXJ0LiAgU2luY2UgSUVkaXRvclBhcnQgaXMgYW4KLSAqIGludGVyZmFjZSB0aGlzIHRlc3QgdmVyaWZpZXMgdGhlIElFZGl0b3JQYXJ0IGxpZmVjeWNsZSByYXRoZXIKLSAqIHRoYW4gdGhlIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgZldpbmRvdzsKLQotICAgIHByb3RlY3RlZCBJV29ya2JlbmNoUGFnZSBmUGFnZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIEVESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yVGVzdCI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgSUVkaXRvclBhcnRUZXN0Ci0gICAgICovCi0gICAgcHVibGljIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvclRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICAgICAgZldpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0gICAgICAgIGZQYWdlID0gZldpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluaXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBqYXZhZG9jOiAiSW5pdGlhbGl6ZXMgdGhpcyBjb250cmlidXRvciwgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gCi0gICAgICAgIC8vIGFkZCBjb250cmlidXRpb25zIGFzIHJlcXVpcmVkIHRvIHRoZSBnaXZlbiBhY3Rpb24gYmFycyBhbmQgZ2xvYmFsIAotICAgICAgICAvLyBhY3Rpb24gaGFuZGxlcnMuIgotCi0gICAgICAgIC8vIE9wZW4gYSBwYXJ0LgotICAgICAgICBNb2NrRWRpdG9yUGFydCBwYXJ0ID0gb3BlbkVkaXRvcihmUGFnZSwgIjEiKTsKLQotICAgICAgICAvLyBHZXQgY29udHJpYnV0b3IgYW5kIHZlcmlmeSBjYWxsIGhpc3RvcnkuCi0gICAgICAgIE1vY2tFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250cmlidXRvciA9IChNb2NrRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIHBhcnQKLSAgICAgICAgICAgICAgICAuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIENhbGxIaXN0b3J5IGhpc3RvcnkgPSBjb250cmlidXRvci5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkKLSAgICAgICAgICAgICAgICAudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgImluaXQiLCAic2V0QWN0aXZlRWRpdG9yIiB9KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJ0LCBjb250cmlidXRvci5nZXRBY3RpdmVFZGl0b3IoKSk7Ci0KLSAgICAgICAgLy8gQ2xvc2UgdGhlIHBhcnQuCi0gICAgICAgIGZQYWdlLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEFjdGl2ZUVkaXRvcigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBGcm9tIGphdmFkb2M6ICJTZXRzIHRoZSBhY3RpdmUgZWRpdG9yIGZvciB0aGUgY29udHJpYnV0b3IuIgotCi0gICAgICAgIC8vIE9wZW4gYW4gZWRpdG9yLgotICAgICAgICBNb2NrRWRpdG9yUGFydCBwYXJ0ID0gb3BlbkVkaXRvcihmUGFnZSwgIlgiKTsKLQotICAgICAgICAvLyBHZXQgY29udHJpYnV0b3IgYW5kIHZlcmlmeSBjYWxsIGhpc3RvcnkuCi0gICAgICAgIE1vY2tFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250cmlidXRvciA9IChNb2NrRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIHBhcnQKLSAgICAgICAgICAgICAgICAuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIENhbGxIaXN0b3J5IGhpc3RvcnkgPSBjb250cmlidXRvci5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkKLSAgICAgICAgICAgICAgICAudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgImluaXQiLCAic2V0QWN0aXZlRWRpdG9yIiB9KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJ0LCBjb250cmlidXRvci5nZXRBY3RpdmVFZGl0b3IoKSk7Ci0KLSAgICAgICAgLy8gT3BlbiBhIGZldyBtb3JlIGFuZCB2ZXJpZnkgc2V0QWN0aXZlRWRpdG9yLgotICAgICAgICBpbnQgZWRpdG9yQ291bnQgPSA1OwotICAgICAgICBNb2NrRWRpdG9yUGFydFtdIHBhcnRzID0gbmV3IE1vY2tFZGl0b3JQYXJ0W2VkaXRvckNvdW50XTsKLSAgICAgICAgZm9yIChpbnQgblggPSAwOyBuWCA8IGVkaXRvckNvdW50OyBuWCsrKSB7Ci0gICAgICAgICAgICBoaXN0b3J5LmNsZWFyKCk7Ci0gICAgICAgICAgICBwYXJ0c1tuWF0gPSBvcGVuRWRpdG9yKGZQYWdlLCBJbnRlZ2VyLnRvU3RyaW5nKG5YKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgInNldEFjdGl2ZUVkaXRvciIgfSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnRzW25YXSwgY29udHJpYnV0b3IuZ2V0QWN0aXZlRWRpdG9yKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWN0aXZhdGUgdGhlIHBhcnRzIGFuZCB2ZXJpZnkgc2V0QWN0aXZlRWRpdG9yLgotICAgICAgICBmb3IgKGludCBuWCA9IDA7IG5YIDwgZWRpdG9yQ291bnQ7IG5YKyspIHsKLSAgICAgICAgICAgIGhpc3RvcnkuY2xlYXIoKTsKLSAgICAgICAgICAgIGZQYWdlLmFjdGl2YXRlKHBhcnRzW25YXSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgInNldEFjdGl2ZUVkaXRvciIgfSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnRzW25YXSwgY29udHJpYnV0b3IuZ2V0QWN0aXZlRWRpdG9yKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xvc2UgdGhlIHBhcnRzLgotICAgICAgICBmUGFnZS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFBhcnRUZXN0I29wZW5QYXJ0KElXb3JrYmVuY2hQYWdlKQotICAgICAqLwotICAgIHByb3RlY3RlZCBNb2NrRWRpdG9yUGFydCBvcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIFN0cmluZyBzdWZmaXgpCi0gICAgICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSVByb2plY3QgcHJvaiA9IEZpbGVVdGlsCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb2plY3QoIklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvclRlc3QiKTsKLSAgICAgICAgSUZpbGUgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoInRlc3QiICsgc3VmZml4ICsgIi50eHQiLCBwcm9qKTsKLSAgICAgICAgcmV0dXJuIChNb2NrRWRpdG9yUGFydCkgcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSksCi0gICAgICAgICAgICAgICAgRURJVE9SX0lEKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lFZGl0b3JBY3Rpb25EZWxlZ2F0ZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lFZGl0b3JBY3Rpb25EZWxlZ2F0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlZTdmNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRWRpdG9yQWN0aW9uRGVsZWdhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci0KLS8qKgotICogVGVzdHMgdGhlIGxpZmVjeWNsZSBmb3IgYW4gZWRpdG9yIGFjdGlvbiBkZWxlZ2F0ZS4KLSAqLwotcHVibGljIGNsYXNzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZVRlc3QgZXh0ZW5kcyBJQWN0aW9uRGVsZWdhdGVUZXN0IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuSUVkaXRvckFjdGlvbkRlbGVnYXRlVGVzdCI7Ci0KLSAgICBwcml2YXRlIE1vY2tFZGl0b3JQYXJ0IGVkaXRvcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGVUZXN0Ci0gICAgICovCi0gICAgcHVibGljIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QWN0aXZlRWRpdG9yKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIFdoZW4gYW4gYWN0aW9uIGRlbGVnYXRlIGlzIHJ1biB0aGUKLSAgICAgICAgLy8gc2V0QWN0aXZlRWRpdG9yLCBzZWxlY3Rpb25DaGFuZ2VkLCBhbmQgcnVuIG1ldGhvZHMgc2hvdWxkCi0gICAgICAgIC8vIGJlIGNhbGxlZCwgaW4gdGhhdCBvcmRlci4KLQotICAgICAgICAvLyBSdW4gdGhlIGFjdGlvbi4KLSAgICAgICAgdGVzdFJ1bigpOwotCi0gICAgICAgIC8vIFZlcmlmeSBsaWZlY3ljbGUuCi0gICAgICAgIE1vY2tBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZSA9IGdldERlbGVnYXRlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGVsZWdhdGUpOwotICAgICAgICBhc3NlcnRUcnVlKGRlbGVnYXRlLmNhbGxIaXN0b3J5LnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgInNldEFjdGl2ZUVkaXRvciIsICJzZWxlY3Rpb25DaGFuZ2VkIiwgInJ1biIgfSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlVGVzdCNjcmVhdGVBY3Rpb25XaWRnZXQoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQWN0aW9uV2lkZ2V0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGVkaXRvciA9IG9wZW5FZGl0b3IoZlBhZ2UsICJYIik7Ci0gICAgICAgIHJldHVybiBlZGl0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJQWN0aW9uRGVsZWdhdGVUZXN0I3J1bkFjdGlvbigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuQWN0aW9uKE9iamVjdCB3aWRnZXQpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBNb2NrRWRpdG9yUGFydCBlZGl0b3IgPSAoTW9ja0VkaXRvclBhcnQpIHdpZGdldDsKLSAgICAgICAgTW9ja0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gKE1vY2tFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgZWRpdG9yCi0gICAgICAgICAgICAgICAgLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotICAgICAgICBJTWVudU1hbmFnZXIgbWdyID0gY29udHJpYnV0b3IuZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIEFjdGlvblV0aWwucnVuQWN0aW9uV2l0aExhYmVsKHRoaXMsIG1nciwgIk1vY2sgQWN0aW9uIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJQWN0aW9uRGVsZWdhdGVUZXN0I2ZpcmVTZWxlY3Rpb24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVTZWxlY3Rpb24oT2JqZWN0IHdpZGdldCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIE1vY2tFZGl0b3JQYXJ0IGVkaXRvciA9IChNb2NrRWRpdG9yUGFydCkgd2lkZ2V0OwotICAgICAgICBlZGl0b3IuZmlyZVNlbGVjdGlvbigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNb2NrRWRpdG9yUGFydCBvcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIFN0cmluZyBzdWZmaXgpCi0gICAgICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSVByb2plY3QgcHJvaiA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIklFZGl0b3JBY3Rpb25EZWxlZ2F0ZVRlc3QiKTsKLSAgICAgICAgSUZpbGUgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoInRlc3QiICsgc3VmZml4ICsgIi50eHQiLCBwcm9qKTsKLSAgICAgICAgcmV0dXJuIChNb2NrRWRpdG9yUGFydCkgcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSksCi0gICAgICAgICAgICAgICAgRURJVE9SX0lEKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSUVkaXRvckRlc2NyaXB0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRWRpdG9yRGVzY3JpcHRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyMzc5Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRWRpdG9yRGVzY3JpcHRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQXJyYXlVdGlsOwotCi1wdWJsaWMgY2xhc3MgSUVkaXRvckRlc2NyaXB0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIElFZGl0b3JEZXNjcmlwdG9yW10gZkVkaXRvcnM7Ci0KLSAgICBwdWJsaWMgSUVkaXRvckRlc2NyaXB0b3JUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIElGaWxlRWRpdG9yTWFwcGluZyBtYXBwaW5nID0gKElGaWxlRWRpdG9yTWFwcGluZykgQXJyYXlVdGlsCi0gICAgICAgICAgICAgICAgLnBpY2tSYW5kb20oUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsZUVkaXRvck1hcHBpbmdzKCkpOwotICAgICAgICBmRWRpdG9ycyA9IG1hcHBpbmcuZ2V0RWRpdG9ycygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJZCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZFZGl0b3JzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmRWRpdG9yc1tpXS5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW1hZ2VEZXNjcmlwdG9yKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZkVkaXRvcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZFZGl0b3JzW2ldLmdldEltYWdlRGVzY3JpcHRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGFiZWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmRWRpdG9ycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZkVkaXRvcnNbaV0uZ2V0TGFiZWwoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSUVkaXRvckxhdW5jaGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSUVkaXRvckxhdW5jaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjNmMGFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lFZGl0b3JMYXVuY2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLXB1YmxpYyBjbGFzcyBJRWRpdG9yTGF1bmNoZXJUZXN0IHsKLQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGRmNjFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRoZSA8Y29kZT5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneVRlc3Q8L2NvZGU+IEFQSSBhbmQgYmVoYXZpb3VyLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBJRWRpdG9yTWF0Y2hpbmdTdHJhdGVneVRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVRDSElOR19FRElUT1JfSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tNYXRjaGluZ0VkaXRvclBhcnQxIjsKLQotICAgIHB1YmxpYyBJRWRpdG9yTWF0Y2hpbmdTdHJhdGVneVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3Blbk1hdGNoaW5nRWRpdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElQcm9qZWN0IHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJJRWRpdG9yTWF0Y2hpbmdTdHJhdGVneVRlc3QiKTsKLSAgICAgICAgSUZpbGUgZmlsZTEgPSBGaWxlVXRpbC5jcmVhdGVGaWxlKCJwbHVnaW4ueG1sIiwgcHJvaik7Ci0gICAgICAgIElGaWxlIGZpbGUyID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgiTUFOSUZFU1QuTUYiLCBwcm9qKTsKLSAgICAgICAgSUZpbGUgZmlsZTMgPSBGaWxlVXRpbC5jcmVhdGVGaWxlKCJidWlsZC5wcm9wZXJ0aWVzIiwgcHJvaik7Ci0gICAgICAgIElGaWxlIGZpbGU0ID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgic29tZXRoaW5nLnR4dCIsIHByb2opOwotICAgICAgICAKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG9wZW5UZXN0V2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IxID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZTEpLCBNQVRDSElOR19FRElUT1JfSUQpOwotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IxYiA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUxKSwgTUFUQ0hJTkdfRURJVE9SX0lEKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yMiA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUyKSwgTUFUQ0hJTkdfRURJVE9SX0lEKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yMyA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUzKSwgTUFUQ0hJTkdfRURJVE9SX0lEKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yNCA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGU0KSwgTUFUQ0hJTkdfRURJVE9SX0lEKTsKLSAgICAgICAgYXNzZXJ0U2FtZShlZGl0b3IxLCBlZGl0b3IxYik7Ci0gICAgICAgIGFzc2VydFNhbWUoZWRpdG9yMSwgZWRpdG9yMik7Ci0gICAgICAgIGFzc2VydFNhbWUoZWRpdG9yMSwgZWRpdG9yMyk7Ci0gICAgICAgIGFzc2VydE5vdFNhbWUoZWRpdG9yMSwgZWRpdG9yNCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmRNYXRjaGluZ0VkaXRvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJUHJvamVjdCBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgiSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3lUZXN0Iik7Ci0gICAgICAgIElGaWxlIGZpbGUxID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgicGx1Z2luLnhtbCIsIHByb2opOwotICAgICAgICBJRmlsZSBmaWxlMiA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoIk1BTklGRVNULk1GIiwgcHJvaik7Ci0gICAgICAgIElGaWxlIGZpbGUzID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgiYnVpbGQucHJvcGVydGllcyIsIHByb2opOwotICAgICAgICBJRmlsZSBmaWxlNCA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoInNvbWV0aGluZy50eHQiLCBwcm9qKTsKLSAgICAgICAgCi0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBvcGVuVGVzdFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZTEpLCBNQVRDSElOR19FRElUT1JfSUQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLCBwYWdlLmZpbmRFZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlMSkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvciwgcGFnZS5maW5kRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZTIpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IsIHBhZ2UuZmluZEVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUzKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgcGFnZS5maW5kRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZTQpKSk7Ci0gICAgfQotICAgIAotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRWRpdG9yUGFydFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lFZGl0b3JQYXJ0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg3MTk2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lFZGl0b3JQYXJ0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5DYWxsSGlzdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci0KLS8qKgotICogVGhpcyBpcyBhIHRlc3QgZm9yIElFZGl0b3JQYXJ0LiAgU2luY2UgSUVkaXRvclBhcnQgaXMgYW4KLSAqIGludGVyZmFjZSB0aGlzIHRlc3QgdmVyaWZpZXMgdGhlIElFZGl0b3JQYXJ0IGxpZmVjeWNsZSByYXRoZXIKLSAqIHRoYW4gdGhlIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSUVkaXRvclBhcnRUZXN0IGV4dGVuZHMgSVdvcmtiZW5jaFBhcnRUZXN0IHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJRWRpdG9yUGFydFRlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgSUVkaXRvclBhcnRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJV29ya2JlbmNoUGFydFRlc3Qjb3BlblBhcnQoSVdvcmtiZW5jaFBhZ2UpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1vY2tQYXJ0IG9wZW5QYXJ0KElXb3JrYmVuY2hQYWdlIHBhZ2UpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBJUHJvamVjdCBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgiSUVkaXRvclBhcnRUZXN0Iik7Ci0gICAgICAgIElGaWxlIGZpbGUgPSBGaWxlVXRpbC5jcmVhdGVGaWxlKCJJRWRpdG9yUGFydFRlc3QudHh0IiwgcHJvaik7Ci0gICAgICAgIHJldHVybiAoTW9ja1dvcmtiZW5jaFBhcnQpIHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLAotICAgICAgICAgICAgICAgIE1vY2tFZGl0b3JQYXJ0LklEMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJV29ya2JlbmNoUGFydFRlc3QjY2xvc2VQYXJ0KElXb3JrYmVuY2hQYWdlLCBNb2NrV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZVBhcnQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgTW9ja1BhcnQgcGFydCkKLSAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBwYWdlLmNsb3NlRWRpdG9yKChJRWRpdG9yUGFydCkgcGFydCwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdGhlIGVkaXRvciBpcyBjbG9zZWQgd2l0aG91dCBzYXZpbmcgaWYgaXNTYXZlT25DbG9zZU5lZWRlZCgpCi0gICAgICogcmV0dXJucyBmYWxzZS4KLSAgICAgKiBAc2VlIElTYXZlYWJsZSNpc1NhdmVPbkNsb3NlTmVlZGVkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZENsb3NlU2F2ZU5vdE5lZWRlZCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBPcGVuIGEgcGFydC4KLSAgICAgICAgTW9ja0VkaXRvclBhcnQgcGFydCA9IChNb2NrRWRpdG9yUGFydCkgb3BlblBhcnQoZlBhZ2UpOwotICAgICAgICBwYXJ0LnNldERpcnR5KHRydWUpOwotICAgICAgICBwYXJ0LnNldFNhdmVOZWVkZWQoZmFsc2UpOwotICAgICAgICBjbG9zZVBhcnQoZlBhZ2UsIHBhcnQpOwotICAgICAgICAKLSAgICAgICAgQ2FsbEhpc3RvcnkgaGlzdG9yeSA9IHBhcnQuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoaXN0b3J5LnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7ICJzZXRJbml0aWFsaXphdGlvbkRhdGEiLCAiaW5pdCIsCi0gICAgICAgICAgICAgICAgImNyZWF0ZVBhcnRDb250cm9sIiwgInNldEZvY3VzIiwgImlzU2F2ZU9uQ2xvc2VOZWVkZWQiLCAid2lkZ2V0RGlzcG9zZWQiLCAiZGlzcG9zZSIgfSkpOwotICAgICAgICBhc3NlcnRGYWxzZShoaXN0b3J5LmNvbnRhaW5zKCJkb1NhdmUiKSk7Ci0gICAgfQotICAgIAotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRWRpdG9yUmVnaXN0cnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRWRpdG9yUmVnaXN0cnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYmJkNWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSUVkaXRvclJlZ2lzdHJ5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5FZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5GaWxlRWRpdG9yTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5BcnJheVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkNhbGxIaXN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5GaWxlVXRpbDsKLQotcHVibGljIGNsYXNzIElFZGl0b3JSZWdpc3RyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBJRWRpdG9yUmVnaXN0cnkgZlJlZzsKLQotICAgIHByaXZhdGUgSVByb2plY3QgcHJvajsKLQotICAgIHB1YmxpYyBJRWRpdG9yUmVnaXN0cnlUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIGZSZWcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgICAgIGlmIChwcm9qICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWwuZGVsZXRlUHJvamVjdChwcm9qKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmlsZUVkaXRvck1hcHBpbmdzKCkgewotICAgICAgICBhc3NlcnRUcnVlKEFycmF5VXRpbC5jaGVja05vdE51bGwoZlJlZy5nZXRGaWxlRWRpdG9yTWFwcGluZ3MoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCXRlc3RzIGJvdGggb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgKglJRWRpdG9yRGVzY3JpcHRvcltdIGdldEVkaXRvcnMoSUZpbGUgZmlsZSkgCi0gICAgICoJSUVkaXRvckRlc2NyaXB0b3JbXSBnZXRFZGl0b3JzKFN0cmluZyBmaWxlbmFtZSkgIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFZGl0b3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElFZGl0b3JEZXNjcmlwdG9yW10gZWRpdG9ycywgZWRpdG9yczI7Ci0gICAgICAgIFN0cmluZ1tdW10gbWFwcyA9IHsgeyAiYS5tb2NrMSIsIE1vY2tFZGl0b3JQYXJ0LklEMSB9LAotICAgICAgICAgICAgICAgIHsgImIubW9jazIiLCBNb2NrRWRpdG9yUGFydC5JRDIgfSB9OwotCi0gICAgICAgIHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJ0ZXN0UHJvamVjdCIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZWRpdG9ycyA9IGZSZWcuZ2V0RWRpdG9ycyhtYXBzW2ldWzBdKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3JzLmxlbmd0aCwgMSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yc1swXS5nZXRJZCgpLCBtYXBzW2ldWzFdKTsKLSAgICAgICAgICAgIGVkaXRvcnMyID0gZlJlZy5nZXRFZGl0b3JzKEZpbGVVdGlsLmNyZWF0ZUZpbGUobWFwc1tpXVswXSwgcHJvaikKLSAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlVdGlsLmVxdWFscyhlZGl0b3JzLCBlZGl0b3JzMiksIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy90aGVyZSBpcyBubyBtYXRjaGluZyBlZGl0b3IKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gSUNvbnN0YW50cy5Vbmtub3duRmlsZU5hbWVbMF07Ci0gICAgICAgIGVkaXRvcnMgPSBmUmVnLmdldEVkaXRvcnMoZmlsZU5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9ycy5sZW5ndGgsIDApOwotICAgICAgICBlZGl0b3JzID0gZlJlZwotICAgICAgICAgICAgICAgIC5nZXRFZGl0b3JzKEZpbGVVdGlsLmNyZWF0ZUZpbGUoZmlsZU5hbWUsIHByb2opLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3JzLmxlbmd0aCwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmRFZGl0b3IoKSB7Ci0gICAgICAgIFN0cmluZyBpZCA9IE1vY2tFZGl0b3JQYXJ0LklEMTsKLSAgICAgICAgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yID0gZlJlZy5maW5kRWRpdG9yKGlkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvci5nZXRJZCgpLCBpZCk7Ci0KLSAgICAgICAgLy9lZGl0b3IgaXMgbm90IGZvdW5kCi0gICAgICAgIGlkID0gSUNvbnN0YW50cy5GYWtlSUQ7Ci0gICAgICAgIGVkaXRvciA9IGZSZWcuZmluZEVkaXRvcihpZCk7Ci0gICAgICAgIGFzc2VydE51bGwoZWRpdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXREZWZhdWx0RWRpdG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEVkaXRvcigpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmUmVnLmdldERlZmF1bHRFZGl0b3IoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0RGVmYXVsdEVkaXRvcihTdHJpbmcgZmlsZU5hbWUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRFZGl0b3IyKCkgewotICAgICAgICBJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3IgPSBmUmVnLmdldERlZmF1bHRFZGl0b3IoImEubW9jazEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvci5nZXRJZCgpLCBNb2NrRWRpdG9yUGFydC5JRDEpOwotCi0gICAgICAgIC8vIHNhbWUgZXh0ZW5zaW9uIHdpdGggZGlmZmVyZW50IG5hbWUKLSAgICAgICAgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yMiA9IGZSZWcuZ2V0RGVmYXVsdEVkaXRvcigiYi5tb2NrMSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLCBlZGl0b3IyKTsKLQotICAgICAgICAvL2VkaXRvciBub3QgZm91bmQJCQotICAgICAgICBhc3NlcnROdWxsKGZSZWcuZ2V0RGVmYXVsdEVkaXRvcihJQ29uc3RhbnRzLlVua25vd25GaWxlTmFtZVswXSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldERlZmF1bHRFZGl0b3IoSUZpbGUgZmlsZSkJCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRFZGl0b3IzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJ0ZXN0UHJvamVjdCIpOwotCi0gICAgICAgIElGaWxlIGZpbGUgPSBGaWxlVXRpbC5jcmVhdGVGaWxlKCJXaGF0cyB1cC5icm8iLCBwcm9qKTsKLSAgICAgICAgU3RyaW5nIGlkID0gTW9ja0VkaXRvclBhcnQuSUQxOwotICAgICAgICBJREUuc2V0RGVmYXVsdEVkaXRvcihmaWxlLCBpZCk7Ci0gICAgICAgIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvciA9IElERS5nZXREZWZhdWx0RWRpdG9yKGZpbGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldElkKCksIGlkKTsKLQotICAgICAgICAvL2F0dGFjaCBhbiBJRmlsZSBvYmplY3Qgd2l0aCBhIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uIHRvIGEgZGlmZmVyZW50IGVkaXRvcgotICAgICAgICBmaWxlID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgiYW1idXNoLm1vY2sxIiwgcHJvaik7Ci0gICAgICAgIGlkID0gTW9ja0VkaXRvclBhcnQuSUQyOwotICAgICAgICBJREUuc2V0RGVmYXVsdEVkaXRvcihmaWxlLCBpZCk7Ci0gICAgICAgIGVkaXRvciA9IElERS5nZXREZWZhdWx0RWRpdG9yKGZpbGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldElkKCksIGlkKTsKLQotICAgICAgICAvL2Egbm9uLXJlZ2lzdGVyZWQgSUZpbGUgb2JqZWN0IHdpdGggYSByZWdpc3RlcmVkIGV4dGVuc2lvbgotICAgICAgICBTdHJpbmcgbmFtZSA9ICJ3aGF0Lm1vY2syIjsKLSAgICAgICAgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUobmFtZSwgcHJvaik7Ci0gICAgICAgIGVkaXRvciA9IElERS5nZXREZWZhdWx0RWRpdG9yKGZpbGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLCBmUmVnLmdldERlZmF1bHRFZGl0b3IobmFtZSkpOwotCi0gICAgICAgIC8vYSBub24tcmVnaXN0ZXJlZCBJRmlsZSBvYmplY3Qgd2l0aCBhbiB1bnJlZ2lzdGVyZWQgZXh0ZW5zaW9uCi0gICAgICAgIG5hbWUgPSBJQ29uc3RhbnRzLlVua25vd25GaWxlTmFtZVswXTsKLSAgICAgICAgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUobmFtZSwgcHJvaik7Ci0gICAgICAgIGFzc2VydE51bGwoSURFLmdldERlZmF1bHRFZGl0b3IoZmlsZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXREZWZhdWx0RWRpdG9yKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJ0ZXN0UHJvamVjdCIpOwotICAgICAgICBJRmlsZSBmaWxlID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgiZ29vZC5maWxlIiwgcHJvaik7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gTW9ja0VkaXRvclBhcnQuSUQxOwotICAgICAgICBJREUuc2V0RGVmYXVsdEVkaXRvcihmaWxlLCBpZCk7Ci0gICAgICAgIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvciA9IElERS5nZXREZWZhdWx0RWRpdG9yKGZpbGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldElkKCksIGlkKTsKLQotICAgICAgICAvL2NoYW5nZSB0aGUgZGVmYXVsdCBlZGl0b3IKLSAgICAgICAgaWQgPSBNb2NrRWRpdG9yUGFydC5JRDI7Ci0gICAgICAgIElERS5zZXREZWZhdWx0RWRpdG9yKGZpbGUsIGlkKTsKLSAgICAgICAgZWRpdG9yID0gSURFLmdldERlZmF1bHRFZGl0b3IoZmlsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IuZ2V0SWQoKSwgaWQpOwotCi0gICAgICAgIC8vcmVnaXN0ZXIgdGhlIGRlZmF1bHQgZWRpdG9yIHdpdGggYW4gaW52YWxpZCBlZGl0b3IgaWQKLSAgICAgICAgSURFLnNldERlZmF1bHRFZGl0b3IoZmlsZSwgSUNvbnN0YW50cy5GYWtlSUQpOwotICAgICAgICBhc3NlcnROdWxsKElERS5nZXREZWZhdWx0RWRpdG9yKGZpbGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgl0ZXN0cyBib3RoIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICoJZ2V0SW1hZ2VEZXNjcmlwdG9yKElGaWxlIGZpbGUpICAgIAotICAgICAqIAlnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGZpbGVuYW1lKSAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEltYWdlRGVzY3JpcHRvcigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdFByb2plY3QiKTsKLQotICAgICAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2UxLCBpbWFnZTI7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZTsKLQotICAgICAgICBmaWxlTmFtZSA9ICJhLm1vY2sxIjsKLSAgICAgICAgSUZpbGUgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoZmlsZU5hbWUsIHByb2opOwotICAgICAgICBpbWFnZTEgPSBmUmVnLmdldEltYWdlRGVzY3JpcHRvcihmaWxlTmFtZSk7Ci0gICAgICAgIGltYWdlMiA9IGZSZWcuZ2V0RGVmYXVsdEVkaXRvcihmaWxlTmFtZSkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbWFnZTEsIGltYWdlMik7Ci0gICAgICAgIC8vZm9yIGdldEltYWdlRGVzY3JpcHRvcihJRmlsZSBmaWxlKQotICAgICAgICBhc3NlcnRFcXVhbHMoaW1hZ2UxLCBmUmVnLmdldEltYWdlRGVzY3JpcHRvcihmaWxlLmdldE5hbWUoKSkpOwotCi0gICAgICAgIC8vc2FtZSBleHRlbnNpb24sIGRpZmZlcmVudCBmaWxlIG5hbWUKLSAgICAgICAgZmlsZU5hbWUgPSAiYi5tb2NrMSI7Ci0gICAgICAgIGZpbGUgPSBGaWxlVXRpbC5jcmVhdGVGaWxlKGZpbGVOYW1lLCBwcm9qKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGltYWdlMSwgZlJlZy5nZXRJbWFnZURlc2NyaXB0b3IoZmlsZU5hbWUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGltYWdlMSwgZlJlZy5nZXRJbWFnZURlc2NyaXB0b3IoZmlsZS5nZXROYW1lKCkpKTsKLQotICAgICAgICAvL2RlZmF1bHQgaW1hZ2UJCQotICAgICAgICBmaWxlTmFtZSA9ICJhLm51bGxBbmRWb2lkIjsKLSAgICAgICAgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoZmlsZU5hbWUsIHByb2opOwotICAgICAgICBpbWFnZTEgPSBmUmVnLmdldEltYWdlRGVzY3JpcHRvcihmaWxlTmFtZSk7Ci0gICAgICAgIGltYWdlMiA9IGZSZWcuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJiLnRoaXNfaXNfbm90X2dvb2QiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpbWFnZTEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaW1hZ2UxLCBpbWFnZTIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaW1hZ2UyLCBmUmVnLmdldEltYWdlRGVzY3JpcHRvcihmaWxlLmdldE5hbWUoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQcm9wZXJ0eUxpc3RlbmVyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBNRVRIT0QgPSAicHJvcGVydHlDaGFuZ2VkIjsKLQotICAgICAgICAvL3Rha2Ugb3V0IG1hcHBpbmdzIGZyb20gdGhlIHJlZ2lzdHJ5IGFuZCBwdXQgdGhlbSBiYWNrIHJpZ2h0IGF3YXkKLSAgICAgICAgLy9zbyB0aGF0IHRoZSBldmVudCBnZXRzIHRyaWdnZXJlZCB3aXRob3V0IG1ha2luZyBjaGFuZ2UgdG8gdGhlIHJlZ2lzdHJ5Ci0gICAgICAgIElGaWxlRWRpdG9yTWFwcGluZ1tdIHNyYyA9IGZSZWcuZ2V0RmlsZUVkaXRvck1hcHBpbmdzKCk7Ci0gICAgICAgIEZpbGVFZGl0b3JNYXBwaW5nW10gbWFwcyA9IG5ldyBGaWxlRWRpdG9yTWFwcGluZ1tzcmMubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShzcmMsIDAsIG1hcHMsIDAsIHNyYy5sZW5ndGgpOwotCi0gICAgICAgIE1vY2tQcm9wZXJ0eUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vY2tQcm9wZXJ0eUxpc3RlbmVyKGZSZWcsCi0gICAgICAgICAgICAgICAgSUVkaXRvclJlZ2lzdHJ5LlBST1BfQ09OVEVOVFMpOwotICAgICAgICBmUmVnLmFkZFByb3BlcnR5TGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBDYWxsSGlzdG9yeSBjYWxsVHJhY2UgPSBsaXN0ZW5lci5nZXRDYWxsSGlzdG9yeSgpOwotCi0gICAgICAgIC8vbXVsdGlwbGUgbGlzdGVuZXIKLSAgICAgICAgTW9ja1Byb3BlcnR5TGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IE1vY2tQcm9wZXJ0eUxpc3RlbmVyKGZSZWcsCi0gICAgICAgICAgICAgICAgSUVkaXRvclJlZ2lzdHJ5LlBST1BfQ09OVEVOVFMpOwotICAgICAgICBmUmVnLmFkZFByb3BlcnR5TGlzdGVuZXIobGlzdGVuZXIyKTsKLSAgICAgICAgQ2FsbEhpc3RvcnkgY2FsbFRyYWNlMiA9IGxpc3RlbmVyMi5nZXRDYWxsSGlzdG9yeSgpOwotCi0gICAgICAgIC8vZmlyZSEhCQkKLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgIGNhbGxUcmFjZTIuY2xlYXIoKTsKLSAgICAgICAgKChFZGl0b3JSZWdpc3RyeSkgZlJlZykuc2V0RmlsZUVkaXRvck1hcHBpbmdzKG1hcHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKE1FVEhPRCksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlMi5jb250YWlucyhNRVRIT0QpLCB0cnVlKTsKLQotICAgICAgICAvL2FkZCB0aGUgc2FtZSBsaXN0ZW5lciBzZWNvbmQgdGltZQotICAgICAgICBmUmVnLmFkZFByb3BlcnR5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIC8vZmlyZSEhCQkKLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgICgoRWRpdG9yUmVnaXN0cnkpIGZSZWcpLnNldEZpbGVFZGl0b3JNYXBwaW5ncyhtYXBzKTsKLSAgICAgICAgLy9tYWtlIHN1cmUgdGhlIG1ldGhvZCB3YXMgY2FsbGVkIG9ubHkgb25jZQotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7IE1FVEhPRCB9KSwgdHJ1ZSk7Ci0KLSAgICAgICAgZlJlZy5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgZlJlZy5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0gICAgICAgIElGaWxlRWRpdG9yTWFwcGluZ1tdIHNyYyA9IGZSZWcuZ2V0RmlsZUVkaXRvck1hcHBpbmdzKCk7Ci0gICAgICAgIEZpbGVFZGl0b3JNYXBwaW5nW10gbWFwcyA9IG5ldyBGaWxlRWRpdG9yTWFwcGluZ1tzcmMubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShzcmMsIDAsIG1hcHMsIDAsIHNyYy5sZW5ndGgpOwotCi0gICAgICAgIE1vY2tQcm9wZXJ0eUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vY2tQcm9wZXJ0eUxpc3RlbmVyKGZSZWcsCi0gICAgICAgICAgICAgICAgSUVkaXRvclJlZ2lzdHJ5LlBST1BfQ09OVEVOVFMpOwotICAgICAgICBmUmVnLmFkZFByb3BlcnR5TGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAvL3JlbW92ZSB0aGUgbGlzdGVuZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgYWRkaW5nIGl0Ci0gICAgICAgIGZSZWcucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIENhbGxIaXN0b3J5IGNhbGxUcmFjZSA9IGxpc3RlbmVyLmdldENhbGxIaXN0b3J5KCk7Ci0KLSAgICAgICAgLy9maXJlISEJCQotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLSAgICAgICAgKChFZGl0b3JSZWdpc3RyeSkgZlJlZykuc2V0RmlsZUVkaXRvck1hcHBpbmdzKG1hcHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJwcm9wZXJ0eUNoYW5nZWQiKSwgZmFsc2UpOwotCi0gICAgICAgIC8vcmVtb3ZpbmcgdGhlIGxpc3RlbmVyIHRoYXQgaXMgbm90IHJlZ2lzdGVyZWQgeWV0IHNob3VsZCBoYXZlIG5vIGVmZmVjdAotICAgICAgICB0cnkgewotICAgICAgICAgICAgZlJlZy5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQkKLQkvKioKLQkgKiBBc3NlcnQgdGhhdCB0aGUgY29udGVudC10eXBlIGJhc2VkIGVkaXRvciBpcyBjaG9zZW4uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEVkaXRvckNvbnRlbnRUeXBlQnlGaWxlbmFtZVdpdGhDb250ZW50VHlwZSgpIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRlbnQtdHlwZTEiKTsKLQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGZSZWcuZ2V0RGVmYXVsdEVkaXRvcigiY29udGVudC10eXBlMS5ibGFoIiwgY29udGVudFR5cGUpOwotCQlhc3NlcnROb3ROdWxsKGRlc2NyaXB0b3IpOwotCQlhc3NlcnRFcXVhbHMoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRlbnRUeXBlMUVkaXRvci1mYWxsYmFjayIsIGRlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0JfQotCQotCS8qKgotCSAqIEFzc2VydCB0aGF0IHRoZSBjb250ZW50IHR5cGUgYmFzZWQgZWRpdG9yIGlzIGNob3Nlbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RWRpdG9yQ29udGVudFR5cGVCeUV4dFdpdGhDb250ZW50VHlwZSgpIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRlbnQtdHlwZTEiKTsKLQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGZSZWcuZ2V0RGVmYXVsdEVkaXRvcigiYmxhaC5jb250ZW50LXR5cGUxIiwgY29udGVudFR5cGUpOwotCQlhc3NlcnROb3ROdWxsKGRlc2NyaXB0b3IpOwotCQlhc3NlcnRFcXVhbHMoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRlbnRUeXBlMUVkaXRvci1mYWxsYmFjayIsIGRlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0IHRoYXQgaW4gdGhlIGFic2VuY2Ugb2YgY29udGVudCB0eXBlLCBmYWxsIGJhY2sgdG8gdGhlIHRyYWRpdGlvbmFsIGZpbGVuYW1lIGJpbmRpbmcuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEVkaXRvckNvbnRlbnRUeXBlQnlFeHRXaXRob3V0Q29udGVudFR5cGUxKCkgewotCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZlJlZy5nZXREZWZhdWx0RWRpdG9yKCJibGFoLmNvbnRlbnQtdHlwZTEiKTsKLQkJYXNzZXJ0Tm90TnVsbChkZXNjcmlwdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb250ZW50VHlwZTFFZGl0b3ItZmFsbGJhY2siLCBkZXNjcmlwdG9yLmdldElkKCkpOwotCX0KLQotCS8qKgotCSAqIEFzc2VydCB0aGF0IGluIHRoZSBhYnNlbmNlIG9mIGNvbnRlbnQgdHlwZSwgZmFsbCBiYWNrIHRvIHRoZSB0cmFkaXRpb25hbCBmaWxlbmFtZSBiaW5kaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFZGl0b3JDb250ZW50VHlwZUJ5RmlsZW5hbWVXaXRob3V0Q29udGVudFR5cGUxKCkgewotCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZlJlZy5nZXREZWZhdWx0RWRpdG9yKCJjb250ZW50LXR5cGUxLmJsYWgiKTsKLQkJYXNzZXJ0Tm90TnVsbChkZXNjcmlwdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb250ZW50VHlwZTFFZGl0b3ItZmFsbGJhY2siLCBkZXNjcmlwdG9yLmdldElkKCkpOwotCX0KLSAgICAKLQkvKioKLQkgKiBBc3NlcnQgdGhhdCBpbiB0aGUgYWJzZW5jZSBvZiBjb250ZW50IHR5cGUsIGNob29zZSB0aGUgY29udGVudCB0eXBlCi0JICogZWRpdG9yIGJhc2VkIG9uIGNvbnRlbnQgdHlwZSBndWVzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RWRpdG9yQ29udGVudFR5cGVCeUZpbGVuYW1lV2l0aG91dENvbnRlbnRUeXBlMigpIHsKLQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGZSZWcuZ2V0RGVmYXVsdEVkaXRvcigiY29udGVudC10eXBlMi5ibGFoIik7Ci0JCWFzc2VydE5vdE51bGwoZGVzY3JpcHRvcik7Ci0JCWFzc2VydEVxdWFscygib3JnLmVjbGlwc2UudWkudGVzdHMuY29udGVudFR5cGUyRWRpdG9yIiwgZGVzY3JpcHRvci5nZXRJZCgpKTsJCi0JfQotCQotCS8qKgotCSAqIEFzc2VydCB0aGF0IGluIHRoZSBhYnNlbmNlIG9mIGNvbnRlbnQgdHlwZSwgY2hvb3NlIHRoZSBjb250ZW50IHR5cGUKLQkgKiBlZGl0b3IgYmFzZWQgb24gY29udGVudCB0eXBlIGd1ZXNzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFZGl0b3JDb250ZW50VHlwZUJ5RXh0V2l0aG91dENvbnRlbnRUeXBlMigpIHsKLQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGZSZWcuZ2V0RGVmYXVsdEVkaXRvcigiYmxhaC5jb250ZW50LXR5cGUyIik7Ci0JCWFzc2VydE5vdE51bGwoZGVzY3JpcHRvcik7Ci0JCWFzc2VydEVxdWFscygib3JnLmVjbGlwc2UudWkudGVzdHMuY29udGVudFR5cGUyRWRpdG9yIiwgZGVzY3JpcHRvci5nZXRJZCgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0ZWRDb250ZW50VHlwZUVkaXRvcigpIHsKLQkJLy8gY2hlY2sgdGhlIGRlZmF1bHQgZWRpdG9yCi0JCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBmUmVnLmdldERlZmF1bHRFZGl0b3IoImZvby5kZWZhdWx0ZWRDb250ZW50VHlwZSIpOwotCQlhc3NlcnROb3ROdWxsKGRlc2NyaXB0b3IpOwotCQlhc3NlcnRFcXVhbHMoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlZmF1bHRlZENvbnRlbnRUeXBlRWRpdG9yIiwgZGVzY3JpcHRvci5nZXRJZCgpKTsJCi0JCQotCQkvLyBjaGVjayB0aGUgZW50aXJlIGxpc3QKLQkJSUVkaXRvckRlc2NyaXB0b3IgW10gZGVzY3JpcHRvcnMgPSBmUmVnLmdldEVkaXRvcnMoImZvby5kZWZhdWx0ZWRDb250ZW50VHlwZSIpOwotCQlhc3NlcnROb3ROdWxsKGRlc2NyaXB0b3JzKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGRlc2NyaXB0b3JzLmxlbmd0aCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlZmF1bHRlZENvbnRlbnRUeXBlRWRpdG9yIiwgZGVzY3JpcHRvcnNbMF0uZ2V0SWQoKSk7CQotCQlhc3NlcnRFcXVhbHMoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLm5vbmRlZmF1bHRlZENvbnRlbnRUeXBlRWRpdG9yMSIsIGRlc2NyaXB0b3JzWzFdLmdldElkKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJvcmcuZWNsaXBzZS51aS50ZXN0cy5ub25kZWZhdWx0ZWRDb250ZW50VHlwZUVkaXRvcjIiLCBkZXNjcmlwdG9yc1syXS5nZXRJZCgpKTsJCi0JCWFzc2VydEVxdWFscygib3JnLmVjbGlwc2UudWkudGVzdHMubm9uZGVmYXVsdGVkQ29udGVudFR5cGVFZGl0b3IzIiwgZGVzY3JpcHRvcnNbM10uZ2V0SWQoKSk7CQotCX0KLQkKLSAgICAvKioKLSAgICAgKiBBc3NlcnQgdGhhdCBJRWRpdG9yUmVnaXN0cnkuZ2V0RWRpdG9ycygpIGRvZXMgbm90IHJldHVybiBudWxsIGNoaWxkcmVuCi0gICAgICogd2hlbiB0aGUgZGVmYXVsdCBlZGl0b3IgaGFzIGJlZW4gc2V0IHRvIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vRGVmYXVsdEVkaXRvcnMoKSB7Ci0gICAgICAgIElFZGl0b3JEZXNjcmlwdG9yIGRlc2MgPSBmUmVnLmdldERlZmF1bHRFZGl0b3IoImJvZ3VzZmlsZS50eHQiKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmUmVnLnNldERlZmF1bHRFZGl0b3IoIioudHh0IiwgbnVsbCk7Ci0gICAgICAgICAgICBJRWRpdG9yRGVzY3JpcHRvciBbXSBkZXNjcmlwdG9ycyA9IGZSZWcuZ2V0RWRpdG9ycygiYm9ndXNmaWxlLnR4dCIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZGVzY3JpcHRvcnNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBmUmVnLnNldERlZmF1bHRFZGl0b3IoIioudHh0IiwgZGVzYy5nZXRJZCgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSUVkaXRvclNpdGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRWRpdG9yU2l0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2ZDUzYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRWRpdG9yU2l0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5GaWxlVXRpbDsKLQotcHVibGljIGNsYXNzIElFZGl0b3JTaXRlVGVzdCBleHRlbmRzIElXb3JrYmVuY2hQYXJ0U2l0ZVRlc3QgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIElFZGl0b3JTaXRlVGVzdAotICAgICAqLwotICAgIHB1YmxpYyBJRWRpdG9yU2l0ZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hQYXJ0U2l0ZVRlc3QjZ2V0VGVzdFBhcnROYW1lKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRlc3RQYXJ0TmFtZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICByZXR1cm4gTW9ja0VkaXRvclBhcnQuTkFNRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hQYXJ0U2l0ZVRlc3QjZ2V0VGVzdFBhcnRJZCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUZXN0UGFydElkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHJldHVybiBNb2NrRWRpdG9yUGFydC5JRDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJV29ya2JlbmNoUGFydFNpdGVUZXN0I2NyZWF0ZVRlc3RQYXJ0KElXb3JrYmVuY2hQYWdlKQotICAgICAqLwotICAgIHByb3RlY3RlZCBJV29ya2JlbmNoUGFydCBjcmVhdGVUZXN0UGFydChJV29ya2JlbmNoUGFnZSBwYWdlKQotICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJjcmVhdGVUZXN0UGFydCIpOwotICAgICAgICBJRmlsZSBmaWxlID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgidGVzdDEubW9jazEiLCBwcm9qKTsKLSAgICAgICAgcmV0dXJuIElERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBGcm9tIEphdmFkb2M6ICJSZXR1cm5zIHRoZSBlZGl0b3IgYWN0aW9uIGJhciBjb250cmlidXRvciBmb3IgCi0gICAgICAgIC8vIHRoaXMgZWRpdG9yLgotCi0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IChJRWRpdG9yUGFydCkgY3JlYXRlVGVzdFBhcnQoZlBhZ2UpOwotICAgICAgICBJRWRpdG9yU2l0ZSBzaXRlID0gZWRpdG9yLmdldEVkaXRvclNpdGUoKTsKLSAgICAgICAgYXNzZXJ0TnVsbChzaXRlLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpOwotCi0gICAgICAgIC8vIFRCRDogRmxlc2ggdGhpcyBvdXQgd2l0aCBhIHJlYWwgY29udHJpYnV0b3IuCi0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lGaWxlRWRpdG9yTWFwcGluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lGaWxlRWRpdG9yTWFwcGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhYmMwMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JRmlsZUVkaXRvck1hcHBpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkFycmF5VXRpbDsKLQotcHVibGljIGNsYXNzIElGaWxlRWRpdG9yTWFwcGluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBJRmlsZUVkaXRvck1hcHBpbmdbXSBmTWFwcGluZ3M7Ci0KLSAgICBwdWJsaWMgSUZpbGVFZGl0b3JNYXBwaW5nVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBmTWFwcGluZ3MgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkKLSAgICAgICAgICAgICAgICAuZ2V0RmlsZUVkaXRvck1hcHBpbmdzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmTWFwcGluZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZNYXBwaW5nc1tpXS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMYWJlbCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBTdHJpbmcgbGFiZWw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZk1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBsYWJlbCA9IGZNYXBwaW5nc1tpXS5nZXRMYWJlbCgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChsYWJlbCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGxhYmVsLmVxdWFscyhmTWFwcGluZ3NbaV0uZ2V0TmFtZSgpICsgIi4iCi0gICAgICAgICAgICAgICAgICAgICsgZk1hcHBpbmdzW2ldLmdldEV4dGVuc2lvbigpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXh0ZW5zaW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZk1hcHBpbmdzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmTWFwcGluZ3NbaV0uZ2V0RXh0ZW5zaW9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFZGl0b3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElFZGl0b3JEZXNjcmlwdG9yW10gZWRpdG9yczsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZNYXBwaW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZWRpdG9ycyA9IGZNYXBwaW5nc1tpXS5nZXRFZGl0b3JzKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5VXRpbC5jaGVja05vdE51bGwoZWRpdG9ycykgPT0gdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW1hZ2VEZXNjcmlwdG9yKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZk1hcHBpbmdzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmTWFwcGluZ3NbaV0uZ2V0SW1hZ2VEZXNjcmlwdG9yKCkpOwotICAgIH0KLQotICAgIC8vaG93IGRvIGkgc2V0IHRoZSBkZWZhdWx0IGVkaXRvcj8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEVkaXRvcigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvKgkJZm9yKCBpbnQgaSA9IDA7IGkgPCBmTWFwcGluZ3MubGVuZ3RoOyBpICsrICkKLSAgICAgICAgIGFzc2VydE5vdE51bGwoIGZNYXBwaW5nc1sgaSBdLmdldERlZmF1bHRFZGl0b3IoKSApOyovCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVBhZ2VMYXlvdXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JUGFnZUxheW91dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhNDBhMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JUGFnZUxheW91dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkVtcHR5UGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCBjYXNlcyBmb3IgdGhlIDxjb2RlPklQYWdlTGF5b3V0PC9jb2RlPiBBUEkuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIElQYWdlTGF5b3V0VGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0JcHVibGljIElQYWdlTGF5b3V0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZXNjcmlwdG9yKCkgewotCQlFbXB0eVBlcnNwZWN0aXZlLnNldExhc3RQZXJzcGVjdGl2ZShudWxsKTsKLQkJb3BlblRlc3RXaW5kb3coRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCk7Ci0JCWFzc2VydEVxdWFscyhFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lELCBFbXB0eVBlcnNwZWN0aXZlLmdldExhc3RQZXJzcGVjdGl2ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JUGFnZUxpc3RlbmVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVBhZ2VMaXN0ZW5lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjMjExMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JUGFnZUxpc3RlbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgdGhlIElQYWdlTGlzdGVuZXIgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBJUGFnZUxpc3RlbmVyVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgaW1wbGVtZW50cyBJUGFnZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgZldpbmRvdzsKLQotICAgIHByaXZhdGUgaW50IGV2ZW50c1JlY2VpdmVkID0gMDsKLQotICAgIGZpbmFsIHByaXZhdGUgaW50IE9QRU4gPSAweDAxOwotCi0gICAgZmluYWwgcHJpdmF0ZSBpbnQgQ0xPU0UgPSAweDAyOwotCi0gICAgZmluYWwgcHJpdmF0ZSBpbnQgQUNUSVZBVEUgPSAweDA0OwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBwYWdlTWFzazsKLQotICAgIHB1YmxpYyBJUGFnZUxpc3RlbmVyVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICBmV2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICAgICAgZldpbmRvdy5hZGRQYWdlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmV2luZG93LnJlbW92ZVBhZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgc3VwZXIuZG9UZWFyRG93bigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBwYWdlT3BlbmVkIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFnZU9wZW5lZCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvKgotICAgICAgICAgKiBDb21tZW50ZWQgb3V0IGJlY2F1c2UgdW50aWwgdGVzdCBjYXNlIGNhbiBiZSB1cGRhdGVkIHRvIHdvcmsKLSAgICAgICAgICogd2l0aCBuZXcgd2luZG93L3BhZ2UvcGVyc3BlY3RpdmUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICogCi0gICAgICAgICAvLyBGcm9tIEphdmFkb2M6ICJOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgdGhlIGdpdmVuIHBhZ2UgaGFzIGJlZW4gb3BlbmVkLiIKLSAgICAgICAgIAotICAgICAgICAgLy8gVGVzdCBvcGVuIHBhZ2UuCi0gICAgICAgICBldmVudHNSZWNlaXZlZCA9IDA7Ci0gICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZldpbmRvdy5vcGVuUGFnZShFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lELAotICAgICAgICAgZldvcmtzcGFjZSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnRzUmVjZWl2ZWQsIE9QRU58QUNUSVZBVEUpOwotICAgICAgICAgCi0gICAgICAgICAvLyBDbG9zZSBwYWdlLgotICAgICAgICAgcGFnZS5jbG9zZSgpOwotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgcGFnZUNsb3NlZCBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBhZ2VDbG9zZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ29tbWVudGVkIG91dCBiZWNhdXNlIHVudGlsIHRlc3QgY2FzZSBjYW4gYmUgdXBkYXRlZCB0byB3b3JrCi0gICAgICAgICAqIHdpdGggbmV3IHdpbmRvdy9wYWdlL3BlcnNwZWN0aXZlIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAqIAotICAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBnaXZlbiBwYWdlIGhhcyBiZWVuIGNsb3NlZC4iCi0gICAgICAgICAKLSAgICAgICAgIC8vIE9wZW4gcGFnZS4KLSAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBmV2luZG93Lm9wZW5QYWdlKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQsCi0gICAgICAgICBmV29ya3NwYWNlKTsKLSAgICAgICAgIAotICAgICAgICAgLy8gVGVzdCBjbG9zZSBwYWdlLgotICAgICAgICAgZXZlbnRzUmVjZWl2ZWQgPSAwOwotICAgICAgICAgcGFnZU1hc2sgPSBwYWdlOwotICAgICAgICAgcGFnZS5jbG9zZSgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50c1JlY2VpdmVkLCBDTE9TRSk7Ci0gICAgICAgICAqLwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBwYWdlQWN0aXZhdGVkIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFnZUFjdGl2YXRlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbW1lbnRlZCBvdXQgYmVjYXVzZSB1bnRpbCB0ZXN0IGNhc2UgY2FuIGJlIHVwZGF0ZWQgdG8gd29yawotICAgICAgICAgKiB3aXRoIG5ldyB3aW5kb3cvcGFnZS9wZXJzcGVjdGl2ZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgKiAKLSAgICAgICAgIC8vIEZyb20gSmF2YWRvYzogIk5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgZ2l2ZW4gcGFnZSBoYXMgYmVlbiBhY3RpdmF0ZWQuIgotICAgICAgICAgCi0gICAgICAgICAvLyBBZGQgcGFnZXMuCi0gICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlMSA9IGZXaW5kb3cub3BlblBhZ2UoRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCwKLSAgICAgICAgIGZXb3Jrc3BhY2UpOwotICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZTIgPSBmV2luZG93Lm9wZW5QYWdlKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQsCi0gICAgICAgICBmV29ya3NwYWNlKTsKLSAgICAgICAgIAotICAgICAgICAgLy8gVGVzdCBhY3RpdmF0aW9uIG9mIHBhZ2UgMS4KLSAgICAgICAgIGV2ZW50c1JlY2VpdmVkID0gMDsKLSAgICAgICAgIHBhZ2VNYXNrID0gcGFnZTE7Ci0gICAgICAgICBmV2luZG93LnNldEFjdGl2ZVBhZ2UocGFnZTEpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50c1JlY2VpdmVkLCBBQ1RJVkFURSk7Ci0KLSAgICAgICAgIC8vIFRlc3QgYWN0aXZhdGlvbiBvZiBwYWdlIDIuCi0gICAgICAgICBldmVudHNSZWNlaXZlZCA9IDA7CQkKLSAgICAgICAgIHBhZ2VNYXNrID0gcGFnZTI7Ci0gICAgICAgICBmV2luZG93LnNldEFjdGl2ZVBhZ2UocGFnZTIpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50c1JlY2VpdmVkLCBBQ1RJVkFURSk7Ci0gICAgICAgICAKLSAgICAgICAgIC8vIENsZWFudXAuCi0gICAgICAgICBwYWdlMS5jbG9zZSgpOwotICAgICAgICAgcGFnZTIuY2xvc2UoKTsKLSAgICAgICAgICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUGFnZUxpc3RlbmVyI3BhZ2VBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFnZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0gICAgICAgIGlmIChwYWdlTWFzayA9PSBudWxsIHx8IHBhZ2UgPT0gcGFnZU1hc2spCi0gICAgICAgICAgICBldmVudHNSZWNlaXZlZCB8PSBBQ1RJVkFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElQYWdlTGlzdGVuZXIjcGFnZUNsb3NlZChJV29ya2JlbmNoUGFnZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYWdlQ2xvc2VkKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLSAgICAgICAgaWYgKHBhZ2VNYXNrID09IG51bGwgfHwgcGFnZSA9PSBwYWdlTWFzaykKLSAgICAgICAgICAgIGV2ZW50c1JlY2VpdmVkIHw9IENMT1NFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVBhZ2VMaXN0ZW5lciNwYWdlT3BlbmVkKElXb3JrYmVuY2hQYWdlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhZ2VPcGVuZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICBpZiAocGFnZU1hc2sgPT0gbnVsbCB8fCBwYWdlID09IHBhZ2VNYXNrKQotICAgICAgICAgICAgZXZlbnRzUmVjZWl2ZWQgfD0gT1BFTjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lQYWdlU2VydmljZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lQYWdlU2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5OWY1Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JUGFnZVNlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkVtcHR5UGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgdGhlIElQYWdlU2VydmljZSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIElQYWdlU2VydmljZVRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIGltcGxlbWVudHMgSVBhZ2VMaXN0ZW5lciwKLSAgICAgICAgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlTGlzdGVuZXIgewotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyBmV2luZG93OwotCi0gICAgcHJpdmF0ZSBJV29ya3NwYWNlIGZXb3Jrc3BhY2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcGFnZUV2ZW50UmVjZWl2ZWQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcGVyc3BFdmVudFJlY2VpdmVkOwotCi0gICAgcHVibGljIElQYWdlU2VydmljZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICAgICAgZldpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0gICAgICAgIGZXb3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGFkZFBhZ2VMaXN0ZW5lciBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFBhZ2VMaXN0ZW5lcigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvKgotICAgICAgICAgKiBDb21tZW50ZWQgb3V0IGJlY2F1c2UgdW50aWwgdGVzdCBjYXNlIGNhbiBiZSB1cGRhdGVkIHRvIHdvcmsKLSAgICAgICAgICogd2l0aCBuZXcgd2luZG93L3BhZ2UvcGVyc3BlY3RpdmUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICogCi0gICAgICAgICAvLyBGcm9tIEphdmFkb2M6ICJBZGRzIHRoZSBnaXZlbiBsaXN0ZW5lciBmb3IgcGFnZSBsaWZlY3ljbGUgZXZlbnRzLgotICAgICAgICAgLy8gSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiIKLSAgICAgICAgIAotICAgICAgICAgLy8gQWRkIGxpc3RlbmVyLgotICAgICAgICAgZldpbmRvdy5hZGRQYWdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAKLSAgICAgICAgIC8vIE9wZW4gYW5kIGNsb3NlIHBhZ2UuCi0gICAgICAgICAvLyBWZXJpZnkgZXZlbnRzIGFyZSByZWNlaXZlZC4KLSAgICAgICAgIHBhZ2VFdmVudFJlY2VpdmVkID0gZmFsc2U7Ci0gICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZldpbmRvdy5vcGVuUGFnZShFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lELAotICAgICAgICAgZldvcmtzcGFjZSk7Ci0gICAgICAgICBwYWdlLmNsb3NlKCk7Ci0gICAgICAgICBhc3NlcnRUcnVlKHBhZ2VFdmVudFJlY2VpdmVkKTsKLSAgICAgICAgIAotICAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyLgkKLSAgICAgICAgIGZXaW5kb3cucmVtb3ZlUGFnZUxpc3RlbmVyKHRoaXMpOwkJCi0gICAgICAgICAqLwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSByZW1vdmVQYWdlTGlzdGVuZXIgbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQYWdlTGlzdGVuZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiUmVtb3ZlcyB0aGUgZ2l2ZW4gcGFnZSBsaXN0ZW5lci4KLSAgICAgICAgLy8gSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuIgotCi0gICAgICAgIC8vIEFkZCBhbmQgcmVtb3ZlIGxpc3RlbmVyLgotICAgICAgICBmV2luZG93LmFkZFBhZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgZldpbmRvdy5yZW1vdmVQYWdlTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgLy8gT3BlbiBhbmQgY2xvc2UgcGFnZS4KLSAgICAgICAgLy8gVmVyaWZ5IG5vIGV2ZW50cyBhcmUgcmVjZWl2ZWQuCi0gICAgICAgIHBhZ2VFdmVudFJlY2VpdmVkID0gZmFsc2U7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBmV2luZG93Lm9wZW5QYWdlKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQsIGdldFBhZ2VJbnB1dCgpKTsKLSAgICAgICAgcGFnZS5jbG9zZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCFwYWdlRXZlbnRSZWNlaXZlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgZ2V0QWN0aXZlUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0aXZlUGFnZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvKgotICAgICAgICAgKiBDb21tZW50ZWQgb3V0IGJlY2F1c2UgdW50aWwgdGVzdCBjYXNlIGNhbiBiZSB1cGRhdGVkIHRvIHdvcmsKLSAgICAgICAgICogd2l0aCBuZXcgd2luZG93L3BhZ2UvcGVyc3BlY3RpdmUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICogCi0gICAgICAgICAvLyBGcm9tIEphdmFkb2M6ICJyZXR1cm4gdGhlIGFjdGl2ZSBwYWdlLCBvciBudWxsIGlmIG5vIHBhZ2UgCi0gICAgICAgICAvLyBpcyBjdXJyZW50bHkgYWN0aXZlIgotICAgICAgICAgCi0gICAgICAgICAvLyBBZGQgcGFnZS4KLSAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UxID0gZldpbmRvdy5vcGVuUGFnZShFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lELAotICAgICAgICAgZldvcmtzcGFjZSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMoZldpbmRvdy5nZXRBY3RpdmVQYWdlKCksIHBhZ2UxKTsKLSAgICAgICAgIAotICAgICAgICAgLy8gQWRkIHNlY29uZCBwYWdlLgotICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZTIgPSBmV2luZG93Lm9wZW5QYWdlKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQsCi0gICAgICAgICBmV29ya3NwYWNlKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhmV2luZG93LmdldEFjdGl2ZVBhZ2UoKSwgcGFnZTIpOwotICAgICAgICAgCi0gICAgICAgICAvLyBTZXQgYWN0aXZlIHBhZ2UuCi0gICAgICAgICBmV2luZG93LnNldEFjdGl2ZVBhZ2UocGFnZTEpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKGZXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLCBwYWdlMSk7Ci0gICAgICAgICBmV2luZG93LnNldEFjdGl2ZVBhZ2UocGFnZTIpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKGZXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLCBwYWdlMik7Ci0gICAgICAgICAKLSAgICAgICAgIC8vIENsZWFudXAuCi0gICAgICAgICBwYWdlMS5jbG9zZSgpOwotICAgICAgICAgcGFnZTIuY2xvc2UoKTsKLSAgICAgICAgICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGFkZFBlcnNwZWN0aXZlTGlzdGVuZXIgbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQZXJzcGVjdGl2ZUxpc3RlbmVyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbW1lbnRlZCBvdXQgYmVjYXVzZSB1bnRpbCB0ZXN0IGNhc2UgY2FuIGJlIHVwZGF0ZWQgdG8gd29yawotICAgICAgICAgKiB3aXRoIG5ldyB3aW5kb3cvcGFnZS9wZXJzcGVjdGl2ZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgKiAKLSAgICAgICAgIC8vIEZyb20gSmF2YWRvYzogIkFkZHMgdGhlIGdpdmVuIGxpc3RlbmVyIGZvciBhIHBhZ2UncyBwZXJzcGVjdGl2ZSBsaWZlY3ljbGUgZXZlbnRzLgotICAgICAgICAgLy8gSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiIKLSAgICAgICAgIAotICAgICAgICAgLy8gQWRkIGxpc3RlbmVyLgotICAgICAgICAgZldpbmRvdy5hZGRQZXJzcGVjdGl2ZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgCi0gICAgICAgICAvLyBPcGVuIHBhZ2UgYW5kIGNoYW5nZSBwZXJzcCBmZWF0dXJlLgotICAgICAgICAgLy8gVmVyaWZ5IGV2ZW50cyBhcmUgcmVjZWl2ZWQuCi0gICAgICAgICBwZXJzcEV2ZW50UmVjZWl2ZWQgPSBmYWxzZTsKLSAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBmV2luZG93Lm9wZW5QYWdlKElXb3JrYmVuY2hDb25zdGFudHMuREVGQVVMVF9MQVlPVVRfSUQsCi0gICAgICAgICBmV29ya3NwYWNlKTsKLSAgICAgICAgIHBhZ2Uuc2V0RWRpdG9yQXJlYVZpc2libGUoZmFsc2UpOwotICAgICAgICAgcGFnZS5zZXRFZGl0b3JBcmVhVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgIHBhZ2UuY2xvc2UoKTsKLSAgICAgICAgIGFzc2VydFRydWUocGVyc3BFdmVudFJlY2VpdmVkKTsKLSAgICAgICAgIAotICAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyLgkKLSAgICAgICAgIGZXaW5kb3cucmVtb3ZlUGVyc3BlY3RpdmVMaXN0ZW5lcih0aGlzKTsJCQotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgcmVtb3ZlUGVyc3BlY3RpdmVMaXN0ZW5lciBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVBlcnNwZWN0aXZlTGlzdGVuZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiUmVtb3ZlcyB0aGUgZ2l2ZW4gcGFnZSdzIHBlcnNwZWN0aXZlIGxpc3RlbmVyLgotICAgICAgICAvLyBIYXMgbm8gYWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4iCi0KLSAgICAgICAgLy8gQWRkIGFuZCByZW1vdmUgbGlzdGVuZXIuCi0gICAgICAgIGZXaW5kb3cuYWRkUGVyc3BlY3RpdmVMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgZldpbmRvdy5yZW1vdmVQZXJzcGVjdGl2ZUxpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIC8vIE9wZW4gcGFnZSBhbmQgY2hhbmdlIHBlcnNwIGZlYXR1cmUuCi0gICAgICAgIC8vIFZlcmlmeSBubyBldmVudHMgYXJlIHJlY2VpdmVkLgotICAgICAgICBwZXJzcEV2ZW50UmVjZWl2ZWQgPSBmYWxzZTsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGZXaW5kb3cub3BlblBhZ2UoSURFLlJFU09VUkNFX1BFUlNQRUNUSVZFX0lELCBnZXRQYWdlSW5wdXQoKSk7Ci0gICAgICAgIHBhZ2Uuc2V0RWRpdG9yQXJlYVZpc2libGUoZmFsc2UpOwotICAgICAgICBwYWdlLnNldEVkaXRvckFyZWFWaXNpYmxlKHRydWUpOwotICAgICAgICBwYWdlLmNsb3NlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIXBlcnNwRXZlbnRSZWNlaXZlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUGFnZUxpc3RlbmVyI3BhZ2VBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFnZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0gICAgICAgIHBhZ2VFdmVudFJlY2VpdmVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElQYWdlTGlzdGVuZXIjcGFnZUNsb3NlZChJV29ya2JlbmNoUGFnZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYWdlQ2xvc2VkKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLSAgICAgICAgcGFnZUV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVBhZ2VMaXN0ZW5lciNwYWdlT3BlbmVkKElXb3JrYmVuY2hQYWdlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhZ2VPcGVuZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICBwYWdlRXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUGVyc3BlY3RpdmVMaXN0ZW5lciNwZXJzcGVjdGl2ZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSwgSVBlcnNwZWN0aXZlRGVzY3JpcHRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotICAgICAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBwZXJzcGVjdGl2ZSkgewotICAgICAgICBwZXJzcEV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVBlcnNwZWN0aXZlTGlzdGVuZXIjcGVyc3BlY3RpdmVDaGFuZ2VkKElXb3JrYmVuY2hQYWdlLCBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yLCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGVyc3BlY3RpdmVDaGFuZ2VkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0gICAgICAgICAgICBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnNwZWN0aXZlLCBTdHJpbmcgY2hhbmdlSWQpIHsKLSAgICAgICAgcGVyc3BFdmVudFJlY2VpdmVkID0gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lQYXJ0U2VydmljZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lQYXJ0U2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNjZmZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JUGFydFNlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5DYWxsSGlzdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRW1wdHlQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgdGhlIElQYXJ0U2VydmljZSwgSVBhcnRMaXN0ZW5lciBhbmQgSVBhcnRMaXN0ZW5lcjIgaW50ZXJmYWNlcy4KLSAqLwotcHVibGljIGNsYXNzIElQYXJ0U2VydmljZVRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyBmV2luZG93OwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBmUGFnZTsKLQotICAgIC8vIEV2ZW50IHN0YXRlLgotICAgIHByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZXZlbnRQYXJ0OwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBldmVudFBhcnRSZWY7Ci0KLSAgICBjbGFzcyBUZXN0UGFydExpc3RlbmVyIGltcGxlbWVudHMgSVBhcnRMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICAgICAgaGlzdG9yeS5hZGQoInBhcnRBY3RpdmF0ZWQiKTsKLSAgICAgICAgICAgIGV2ZW50UGFydCA9IHBhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgICAgIGhpc3RvcnkuYWRkKCJwYXJ0QnJvdWdodFRvVG9wIik7Ci0gICAgICAgICAgICBldmVudFBhcnQgPSBwYXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgICAgICBoaXN0b3J5LmFkZCgicGFydENsb3NlZCIpOwotICAgICAgICAgICAgZXZlbnRQYXJ0ID0gcGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgICAgICBoaXN0b3J5LmFkZCgicGFydERlYWN0aXZhdGVkIik7Ci0gICAgICAgICAgICBldmVudFBhcnQgPSBwYXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgICAgICBoaXN0b3J5LmFkZCgicGFydE9wZW5lZCIpOwotICAgICAgICAgICAgZXZlbnRQYXJ0ID0gcGFydDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIFRlc3RQYXJ0TGlzdGVuZXIyIGltcGxlbWVudHMgSVBhcnRMaXN0ZW5lcjIgewotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgaGlzdG9yeTIuYWRkKCJwYXJ0QWN0aXZhdGVkIik7Ci0gICAgICAgICAgICBldmVudFBhcnRSZWYgPSByZWY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgaGlzdG9yeTIuYWRkKCJwYXJ0QnJvdWdodFRvVG9wIik7Ci0gICAgICAgICAgICBldmVudFBhcnRSZWYgPSByZWY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgaGlzdG9yeTIuYWRkKCJwYXJ0Q2xvc2VkIik7Ci0gICAgICAgICAgICBldmVudFBhcnRSZWYgPSByZWY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgICAgICBoaXN0b3J5Mi5hZGQoInBhcnREZWFjdGl2YXRlZCIpOwotICAgICAgICAgICAgZXZlbnRQYXJ0UmVmID0gcmVmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgICAgIGhpc3RvcnkyLmFkZCgicGFydE9wZW5lZCIpOwotICAgICAgICAgICAgZXZlbnRQYXJ0UmVmID0gcmVmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFydEhpZGRlbihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgICAgIGhpc3RvcnkyLmFkZCgicGFydEhpZGRlbiIpOwotICAgICAgICAgICAgZXZlbnRQYXJ0UmVmID0gcmVmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFydFZpc2libGUoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgICAgICBoaXN0b3J5Mi5hZGQoInBhcnRWaXNpYmxlIik7Ci0gICAgICAgICAgICBldmVudFBhcnRSZWYgPSByZWY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0SW5wdXRDaGFuZ2VkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgaGlzdG9yeTIuYWRkKCJwYXJ0SW5wdXRDaGFuZ2VkIik7Ci0gICAgICAgICAgICBldmVudFBhcnRSZWYgPSByZWY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0gbmV3IFRlc3RQYXJ0TGlzdGVuZXIoKTsKLQotICAgIHByaXZhdGUgSVBhcnRMaXN0ZW5lcjIgcGFydExpc3RlbmVyMiA9IG5ldyBUZXN0UGFydExpc3RlbmVyMigpOwotCi0gICAgcHJpdmF0ZSBDYWxsSGlzdG9yeSBoaXN0b3J5ID0gbmV3IENhbGxIaXN0b3J5KHBhcnRMaXN0ZW5lcik7Ci0KLSAgICBwcml2YXRlIENhbGxIaXN0b3J5IGhpc3RvcnkyID0gbmV3IENhbGxIaXN0b3J5KHBhcnRMaXN0ZW5lcjIpOwotCi0gICAgcHVibGljIElQYXJ0U2VydmljZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgZXZlbnQgc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFyRXZlbnRTdGF0ZSgpIHsKLSAgICAgICAgZXZlbnRQYXJ0ID0gbnVsbDsKLSAgICAgICAgZXZlbnRQYXJ0UmVmID0gbnVsbDsKLSAgICAgICAgaGlzdG9yeS5jbGVhcigpOwotICAgICAgICBoaXN0b3J5Mi5jbGVhcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICBmV2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICAgICAgZlBhZ2UgPSBmV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIGdldFJlZihJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIHJldHVybiAoKFBhcnRTaXRlKSBwYXJ0LmdldFNpdGUoKSkuZ2V0UGFydFJlZmVyZW5jZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBhZGRQYXJ0TGlzdGVuZXIgbWV0aG9kIG9uIElXb3JrYmVuY2hQYWdlJ3MgcGFydCBzZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQYXJ0TGlzdGVuZXJUb1BhZ2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiQWRkcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZm9yIHBhcnQgbGlmZWN5Y2xlIGV2ZW50cy4KLSAgICAgICAgLy8gSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiIKLSAgICAgICAgZlBhZ2UuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0gICAgICAgIGZQYWdlLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIyKTsKLQotICAgICAgICAvLyBPcGVuIGEgdmlldy4KLSAgICAgICAgLy8gVmVyaWZ5IGV2ZW50cyBhcmUgcmVjZWl2ZWQuCi0gICAgICAgIGNsZWFyRXZlbnRTdGF0ZSgpOwotICAgICAgICBNb2NrVmlld1BhcnQgdmlldyA9IChNb2NrVmlld1BhcnQpIGZQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRCk7Ci0gICAgICAgIGFzc2VydFRydWUoaGlzdG9yeS52ZXJpZnlPcmRlcihuZXcgU3RyaW5nW10geyAicGFydE9wZW5lZCIsCi0gICAgICAgICAgICAgICAgInBhcnRBY3RpdmF0ZWQiIH0pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZpZXcsIGV2ZW50UGFydCk7Ci0gICAgICAgIGFzc2VydFRydWUoaGlzdG9yeTIudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgInBhcnRPcGVuZWQiLAotICAgICAgICAgICAgICAgICJwYXJ0VmlzaWJsZSIsICJwYXJ0QWN0aXZhdGVkIiB9KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhnZXRSZWYodmlldyksIGV2ZW50UGFydFJlZik7Ci0KLSAgICAgICAgLy8gSGlkZSB0aGUgdmlldwotICAgICAgICAvLyBWZXJpZnkgZXZlbnRzIGFyZSByZWNlaXZlZC4KLSAgICAgICAgY2xlYXJFdmVudFN0YXRlKCk7Ci0gICAgICAgIGZQYWdlLmhpZGVWaWV3KHZpZXcpOwotICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgInBhcnREZWFjdGl2YXRlZCIsCi0gICAgICAgICAgICAgICAgInBhcnRDbG9zZWQiIH0pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZpZXcsIGV2ZW50UGFydCk7Ci0gICAgICAgIGFzc2VydFRydWUoaGlzdG9yeTIudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgInBhcnREZWFjdGl2YXRlZCIsCi0gICAgICAgICAgICAgICAgInBhcnRIaWRkZW4iLCAicGFydENsb3NlZCIgfSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UmVmKHZpZXcpLCBldmVudFBhcnRSZWYpOwotICAgICAgICAKLSAgICAgICAgZlBhZ2UucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0gICAgICAgIGZQYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgYWRkUGFydExpc3RlbmVyIG1ldGhvZCBvbiBJV29ya2JlbmNoV2luZG93J3MgcGFydCBzZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQYXJ0TGlzdGVuZXJUb1dpbmRvdygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBGcm9tIEphdmFkb2M6ICJBZGRzIHRoZSBnaXZlbiBsaXN0ZW5lciBmb3IgcGFydCBsaWZlY3ljbGUgZXZlbnRzLgotICAgICAgICAvLyBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuIgotICAgICAgICBmV2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0gICAgICAgIGZXaW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyMik7Ci0KLSAgICAgICAgLy8gT3BlbiBhIHZpZXcuCi0gICAgICAgIC8vIFZlcmlmeSBldmVudHMgYXJlIHJlY2VpdmVkLgotICAgICAgICBjbGVhckV2ZW50U3RhdGUoKTsKLSAgICAgICAgTW9ja1ZpZXdQYXJ0IHZpZXcgPSAoTW9ja1ZpZXdQYXJ0KSBmUGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQpOwotICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgInBhcnRPcGVuZWQiLAotICAgICAgICAgICAgICAgICJwYXJ0QWN0aXZhdGVkIiB9KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh2aWV3LCBldmVudFBhcnQpOwotICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkyLnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7ICJwYXJ0T3BlbmVkIiwKLSAgICAgICAgICAgICAgICAicGFydFZpc2libGUiLCAicGFydEFjdGl2YXRlZCIgfSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UmVmKHZpZXcpLCBldmVudFBhcnRSZWYpOwotCi0gICAgICAgIC8vIEhpZGUgdGhlIHZpZXcKLSAgICAgICAgLy8gVmVyaWZ5IGV2ZW50cyBhcmUgcmVjZWl2ZWQuCi0gICAgICAgIGNsZWFyRXZlbnRTdGF0ZSgpOwotICAgICAgICBmUGFnZS5oaWRlVmlldyh2aWV3KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoaXN0b3J5LnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7ICJwYXJ0RGVhY3RpdmF0ZWQiLAotICAgICAgICAgICAgICAgICJwYXJ0Q2xvc2VkIiB9KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh2aWV3LCBldmVudFBhcnQpOwotICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkyLnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7ICJwYXJ0RGVhY3RpdmF0ZWQiLAotICAgICAgICAgICAgICAgICJwYXJ0SGlkZGVuIiwgInBhcnRDbG9zZWQiIH0pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFJlZih2aWV3KSwgZXZlbnRQYXJ0UmVmKTsKLSAgICAgICAgCi0gICAgICAgIGZQYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotICAgICAgICBmUGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIHJlbW92ZVBhcnRMaXN0ZW5lciBtZXRob2Qgb24gSVdvcmtiZW5jaFBhZ2UncyBwYXJ0IHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVBhcnRMaXN0ZW5lckZyb21QYWdlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIEZyb20gSmF2YWRvYzogIlJlbW92ZXMgdGhlIGdpdmVuIHBhcnQgbGlzdGVuZXIuCi0gICAgICAgIC8vIEhhcyBubyBhZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLiIKLQotICAgICAgICAvLyBBZGQgYW5kIHJlbW92ZSBsaXN0ZW5lci4KLSAgICAgICAgZlBhZ2UuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0gICAgICAgIGZQYWdlLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIyKTsKLSAgICAgICAgZlBhZ2UucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0gICAgICAgIGZQYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIyKTsKLQotICAgICAgICAvLyBPcGVuIGEgdmlldy4KLSAgICAgICAgLy8gVmVyaWZ5IG5vIGV2ZW50cyBhcmUgcmVjZWl2ZWQuCi0gICAgICAgIGNsZWFyRXZlbnRTdGF0ZSgpOwotICAgICAgICBmUGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQpOwotICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoaXN0b3J5Mi5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSByZW1vdmVQYXJ0TGlzdGVuZXIgbWV0aG9kIG9uIElXb3JrYmVuY2hXaW5kb3cncyBwYXJ0IHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVBhcnRMaXN0ZW5lckZyb21XaW5kb3coKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiUmVtb3ZlcyB0aGUgZ2l2ZW4gcGFydCBsaXN0ZW5lci4KLSAgICAgICAgLy8gSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuIgotCi0gICAgICAgIC8vIEFkZCBhbmQgcmVtb3ZlIGxpc3RlbmVyLgotICAgICAgICBmV2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0gICAgICAgIGZXaW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyMik7Ci0gICAgICAgIGZXaW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLSAgICAgICAgZldpbmRvdy5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIyKTsKLQotICAgICAgICAvLyBPcGVuIGEgdmlldy4KLSAgICAgICAgLy8gVmVyaWZ5IG5vIGV2ZW50cyBhcmUgcmVjZWl2ZWQuCi0gICAgICAgIGNsZWFyRXZlbnRTdGF0ZSgpOwotICAgICAgICBmUGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQpOwotICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoaXN0b3J5Mi5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBwYXJ0SGlkZGVuIG1ldGhvZCBieSBjbG9zaW5nIGEgdmlldyB3aGVuIGl0IGlzIG5vdCBzaGFyZWQgd2l0aCBhbm90aGVyIHBlcnNwZWN0aXZlLgotICAgICAqIEluY2x1ZGVzIHJlZ3Jlc3Npb24gdGVzdCBmb3I6IAotICAgICAqICAgQnVnIDYwMDM5IFtWaWV3TWdtdF0gKHJlZ3Jlc3Npb24pIElXb3JrYmVuY2hQYWdlI2ZpbmRWaWV3IHJldHVybnMgbm9uLW51bGwgdmFsdWUgYWZ0ZXIgcGFydCBoYXMgYmVlbiBjbG9zZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydEhpZGRlbldoZW5DbG9zZWRBbmRVbnNoYXJlZCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBJUGFydExpc3RlbmVyMiBsaXN0ZW5lciA9IG5ldyBUZXN0UGFydExpc3RlbmVyMigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhcnRIaWRkZW4oSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucGFydEhpZGRlbihyZWYpOwotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBub3RpZmljYXRpb24gaXMgZm9yIHRoZSB2aWV3IHdlIGNsb3NlZAotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhNb2NrVmlld1BhcnQuSUQsIHJlZi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgdmlldyBjYW5ub3QgYmUgZm91bmQKLSAgICAgICAgICAgICAgICBhc3NlcnROdWxsKGZQYWdlLmZpbmRWaWV3KE1vY2tWaWV3UGFydC5JRCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBNb2NrVmlld1BhcnQgdmlldyA9IChNb2NrVmlld1BhcnQpIGZQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRCk7Ci0gICAgICAgIGZQYWdlLmFkZFBhcnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGNsZWFyRXZlbnRTdGF0ZSgpOwotICAgICAgICBmUGFnZS5oaWRlVmlldyh2aWV3KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoaXN0b3J5Mi5jb250YWlucygicGFydEhpZGRlbiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFJlZih2aWV3KSwgZXZlbnRQYXJ0UmVmKTsKLSAgICAgICAgZlBhZ2UucmVtb3ZlUGFydExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgcGFydEhpZGRlbiBtZXRob2QgYnkgY2xvc2luZyBhIHZpZXcgd2hlbiBpdCBpcyBzaGFyZWQgd2l0aCBhbm90aGVyIHBlcnNwZWN0aXZlLgotICAgICAqIEluY2x1ZGVzIHJlZ3Jlc3Npb24gdGVzdCBmb3I6IAotICAgICAqICAgQnVnIDYwMDM5IFtWaWV3TWdtdF0gKHJlZ3Jlc3Npb24pIElXb3JrYmVuY2hQYWdlI2ZpbmRWaWV3IHJldHVybnMgbm9uLW51bGwgdmFsdWUgYWZ0ZXIgcGFydCBoYXMgYmVlbiBjbG9zZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydEhpZGRlbldoZW5DbG9zZWRBbmRTaGFyZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSVBhcnRMaXN0ZW5lcjIgbGlzdGVuZXIgPSBuZXcgVGVzdFBhcnRMaXN0ZW5lcjIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0SGlkZGVuKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgICAgIHN1cGVyLnBhcnRIaWRkZW4ocmVmKTsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgbm90aWZpY2F0aW9uIGlzIGZvciB0aGUgdmlldyB3ZSBjbG9zZWQKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTW9ja1ZpZXdQYXJ0LklELCByZWYuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIHZpZXcgY2Fubm90IGJlIGZvdW5kCi0gICAgICAgICAgICAgICAgYXNzZXJ0TnVsbChmUGFnZS5maW5kVmlldyhNb2NrVmlld1BhcnQuSUQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgTW9ja1ZpZXdQYXJ0IHZpZXcgPSAoTW9ja1ZpZXdQYXJ0KSBmUGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQpOwotICAgICAgICBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGVtcHR5UGVyc3BEZXNjMiA9IGZXaW5kb3cuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQyKTsKLSAgICAgICAgZlBhZ2Uuc2V0UGVyc3BlY3RpdmUoZW1wdHlQZXJzcERlc2MyKTsKLSAgICAgICAgTW9ja1ZpZXdQYXJ0IHZpZXcyID0gKE1vY2tWaWV3UGFydCkgZlBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2aWV3ID09IHZpZXcyKTsKLSAgICAgICAgZlBhZ2UuYWRkUGFydExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgY2xlYXJFdmVudFN0YXRlKCk7Ci0gICAgICAgIGZQYWdlLmhpZGVWaWV3KHZpZXcpOwotICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkyLmNvbnRhaW5zKCJwYXJ0SGlkZGVuIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UmVmKHZpZXcpLCBldmVudFBhcnRSZWYpOwotICAgICAgICBmUGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBwYXJ0SGlkZGVuIG1ldGhvZCBieSBhY3RpdmF0aW5nIGFub3RoZXIgdmlldyBpbiB0aGUgc2FtZSBmb2xkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnRIaWRkZW5XaGVuT2JzY3VyZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbltdIGV2ZW50UmVjZWl2ZWQgPSB7IGZhbHNlIH07Ci0gICAgICAgIElQYXJ0TGlzdGVuZXIyIGxpc3RlbmVyID0gbmV3IFRlc3RQYXJ0TGlzdGVuZXIyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcGFydEhpZGRlbihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5wYXJ0SGlkZGVuKHJlZik7Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG5vdGlmaWNhdGlvbiBpcyBmb3IgdGhlIHZpZXcgdGhhdCB3YXMgb2JzY3VyZWQKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTW9ja1ZpZXdQYXJ0LklELCByZWYuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIHZpZXcgY2FuIHN0aWxsIGJlIGZvdW5kCi0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmUGFnZS5maW5kVmlldyhNb2NrVmlld1BhcnQuSUQpKTsKLSAgICAgICAgICAgICAgICBldmVudFJlY2VpdmVkWzBdID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgTW9ja1ZpZXdQYXJ0IHZpZXcyID0gKE1vY2tWaWV3UGFydCkgZlBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEMik7Ci0gICAgICAgIE1vY2tWaWV3UGFydCB2aWV3ID0gKE1vY2tWaWV3UGFydCkgZlBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZpZXcsIGZQYWdlLmdldEFjdGl2ZVBhcnQoKSk7Ci0gICAgICAgIGZQYWdlLmFkZFBhcnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGNsZWFyRXZlbnRTdGF0ZSgpOwotICAgICAgICBmUGFnZS5hY3RpdmF0ZSh2aWV3Mik7Ci0gICAgICAgIGZQYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGFzc2VydFRydWUoZXZlbnRSZWNlaXZlZFswXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIHBhcnRWaXNpYmxlIG1ldGhvZCBieSBzaG93aW5nIGEgdmlldyB3aGVuIGl0IGlzIG5vdAotICAgICAqIG9wZW4gaW4gYW55IG90aGVyIHBlcnNwZWN0aXZlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydFZpc2libGVXaGVuT3BlbmVkVW5zaGFyZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbltdIGV2ZW50UmVjZWl2ZWQgPSB7IGZhbHNlIH07Ci0gICAgICAgIElQYXJ0TGlzdGVuZXIyIGxpc3RlbmVyID0gbmV3IFRlc3RQYXJ0TGlzdGVuZXIyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcGFydFZpc2libGUoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucGFydFZpc2libGUocmVmKTsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgbm90aWZpY2F0aW9uIGlzIGZvciB0aGUgdmlldyB3ZSBvcGVuZWQKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTW9ja1ZpZXdQYXJ0LklELCByZWYuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIHZpZXcgY2FuIGJlIGZvdW5kCi0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmUGFnZS5maW5kVmlldyhNb2NrVmlld1BhcnQuSUQpKTsKLSAgICAgICAgICAgICAgICBldmVudFJlY2VpdmVkWzBdID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgZlBhZ2UuYWRkUGFydExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgY2xlYXJFdmVudFN0YXRlKCk7Ci0gICAgICAgIE1vY2tWaWV3UGFydCB2aWV3ID0gKE1vY2tWaWV3UGFydCkgZlBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEKTsKLSAgICAgICAgZlBhZ2UucmVtb3ZlUGFydExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZpZXcsIGZQYWdlLmdldEFjdGl2ZVBhcnQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZXZlbnRSZWNlaXZlZFswXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIHBhcnRWaXNpYmxlIG1ldGhvZCBieSBzaG93aW5nIGEgdmlldyB3aGVuIGl0IGlzIGFscmVhZHkKLSAgICAgKiBvcGVuIGluIGFub3RoZXIgcGVyc3BlY3RpdmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnRWaXNpYmxlV2hlbk9wZW5lZFNoYXJlZCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmaW5hbCBib29sZWFuW10gZXZlbnRSZWNlaXZlZCA9IHsgZmFsc2UgfTsKLSAgICAgICAgSVBhcnRMaXN0ZW5lcjIgbGlzdGVuZXIgPSBuZXcgVGVzdFBhcnRMaXN0ZW5lcjIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0VmlzaWJsZShJV29ya2JlbmNoUGFydFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5wYXJ0VmlzaWJsZShyZWYpOwotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBub3RpZmljYXRpb24gaXMgZm9yIHRoZSB2aWV3IHdlIG9wZW5lZAotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhNb2NrVmlld1BhcnQuSUQsIHJlZi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgdmlldyBjYW4gYmUgZm91bmQKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZQYWdlLmZpbmRWaWV3KE1vY2tWaWV3UGFydC5JRCkpOwotICAgICAgICAgICAgICAgIGV2ZW50UmVjZWl2ZWRbMF0gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBNb2NrVmlld1BhcnQgdmlldyA9IChNb2NrVmlld1BhcnQpIGZQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRCk7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZW1wdHlQZXJzcERlc2MyID0gZldpbmRvdy5nZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgIC5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCkuZmluZFBlcnNwZWN0aXZlV2l0aElkKAotICAgICAgICAgICAgICAgICAgICAgICAgRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRDIpOwotICAgICAgICBmUGFnZS5zZXRQZXJzcGVjdGl2ZShlbXB0eVBlcnNwRGVzYzIpOwotICAgICAgICBmUGFnZS5hZGRQYXJ0TGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBjbGVhckV2ZW50U3RhdGUoKTsKLSAgICAgICAgTW9ja1ZpZXdQYXJ0IHZpZXcyID0gKE1vY2tWaWV3UGFydCkgZlBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2aWV3ID09IHZpZXcyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZpZXcyLCBmUGFnZS5nZXRBY3RpdmVQYXJ0KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGV2ZW50UmVjZWl2ZWRbMF0pOwotICAgICAgICBmUGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgYm90aCBhIHBhcnQgaGlkZGVuIGFuZCBhIHBhcnQgY2xvc2VkIGV2ZW50IGFyZSBzZW50IHdoZW4KLSAgICAgKiBhIHBhcnQgaXMgY2xvc2VkCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFRocm93YWJsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0SGlkZGVuQmVmb3JlQ2xvc2luZygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAKLSAgICAgICAgZmluYWwgYm9vbGVhbltdIGV2ZW50UmVjZWl2ZWQgPSB7ZmFsc2UsIGZhbHNlfTsKLSAgICAgICAgSVBhcnRMaXN0ZW5lcjIgbGlzdGVuZXIgPSBuZXcgVGVzdFBhcnRMaXN0ZW5lcjIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0SGlkZGVuKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgICAgIHN1cGVyLnBhcnRIaWRkZW4ocmVmKTsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgbm90aWZpY2F0aW9uIGlzIGZvciB0aGUgdmlldyB3ZSByZXZlYWxlZAotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhNb2NrVmlld1BhcnQuSUQsIHJlZi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgcGFydCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHBhZ2UKLSAgICAgICAgICAgICAgICBhc3NlcnROdWxsKGZQYWdlLmZpbmRWaWV3KE1vY2tWaWV3UGFydC5JRCkpOwotICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHBhcnRIaWRkZW4gaXMgc2VudCBmaXJzdAotICAgICAgICAgICAgICAgIGV2ZW50UmVjZWl2ZWRbMF0gPSB0cnVlOwotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGV2ZW50UmVjZWl2ZWRbMV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5wYXJ0Q2xvc2VkKHJlZik7Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG5vdGlmaWNhdGlvbiBpcyBmb3IgdGhlIHZpZXcgd2UgcmV2ZWFsZWQKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTW9ja1ZpZXdQYXJ0LklELCByZWYuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIHZpZXcgY2FuIG5vIGxvbmdlciBiZSBmb3VuZAotICAgICAgICAgICAgICAgIGFzc2VydE51bGwoZlBhZ2UuZmluZFZpZXcoTW9ja1ZpZXdQYXJ0LklEKSk7Ci0gICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgcGFydEhpZGRlbiBpcyBzZW50IGZpcnN0Ci0gICAgICAgICAgICAgICAgZXZlbnRSZWNlaXZlZFsxXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShldmVudFJlY2VpdmVkWzBdKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBNb2NrVmlld1BhcnQgdmlldyA9IChNb2NrVmlld1BhcnQpIGZQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh2aWV3LCBmUGFnZS5nZXRBY3RpdmVQYXJ0KCkpOwotICAgICAgICBmUGFnZS5hZGRQYXJ0TGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBjbGVhckV2ZW50U3RhdGUoKTsKLSAgICAgICAgZlBhZ2UuaGlkZVZpZXcodmlldyk7Ci0gICAgICAgIGZQYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGhpc3RvcnkudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsicGFydEhpZGRlbiIsICJwYXJ0Q2xvc2VkIn0pOwotICAgICAgICBhc3NlcnRUcnVlKGV2ZW50UmVjZWl2ZWRbMF0pOwotICAgICAgICBhc3NlcnRUcnVlKGV2ZW50UmVjZWl2ZWRbMV0pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgcGFydFZpc2libGUgbWV0aG9kIGJ5IGFjdGl2YXRpbmcgYSB2aWV3IG9ic2N1cmVkIGJ5Ci0gICAgICogYW5vdGhlciB2aWV3IGluIHRoZSBzYW1lIGZvbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydFZpc2libGVXaGVuT2JzY3VyZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbltdIGV2ZW50UmVjZWl2ZWQgPSB7IGZhbHNlIH07Ci0gICAgICAgIElQYXJ0TGlzdGVuZXIyIGxpc3RlbmVyID0gbmV3IFRlc3RQYXJ0TGlzdGVuZXIyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcGFydFZpc2libGUoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucGFydFZpc2libGUocmVmKTsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgbm90aWZpY2F0aW9uIGlzIGZvciB0aGUgdmlldyB3ZSByZXZlYWxlZAotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhNb2NrVmlld1BhcnQuSUQsIHJlZi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgdmlldyBjYW4gc3RpbGwgYmUgZm91bmQKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZQYWdlLmZpbmRWaWV3KE1vY2tWaWV3UGFydC5JRCkpOwotICAgICAgICAgICAgICAgIGV2ZW50UmVjZWl2ZWRbMF0gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBNb2NrVmlld1BhcnQgdmlldyA9IChNb2NrVmlld1BhcnQpIGZQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRCk7Ci0gICAgICAgIE1vY2tWaWV3UGFydCB2aWV3MiA9IChNb2NrVmlld1BhcnQpIGZQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRDIpOwotICAgICAgICBhc3NlcnRFcXVhbHModmlldzIsIGZQYWdlLmdldEFjdGl2ZVBhcnQoKSk7Ci0gICAgICAgIGZQYWdlLmFkZFBhcnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGNsZWFyRXZlbnRTdGF0ZSgpOwotICAgICAgICBmUGFnZS5hY3RpdmF0ZSh2aWV3KTsKLSAgICAgICAgZlBhZ2UucmVtb3ZlUGFydExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShldmVudFJlY2VpdmVkWzBdKTsKLSAgICB9Ci0gICAgCi0vLyAgICAvKioKLS8vICAgICAqIFRlc3RzIHRoYXQgd2hlbiBhIHBhcnRPcGVuZWQgaXMgcmVjZWl2ZWQgZm9yIGEgdmlldyBiZWluZyBzaG93biwKLS8vICAgICAqIHRoZSB2aWV3IGlzIGF2YWlsYWJsZSB2aWEgZmluZFZpZXcsIGZpbmRWaWV3UmVmZXJlbmNlLCBnZXRWaWV3cyBhbmQgZ2V0Vmlld1JlZmVyZW5jZXMuCi0vLyAgICAgKiAKLS8vICAgICAqIEBzaW5jZSAzLjEKLS8vICAgICAqLwotLy8gVGhpcyBkb2VzIG5vdCB3b3JrIGFzIGV4cGVjdGVkLiAgU2VlIGJ1ZyA5Mzc4NC4KLS8vICAKLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RWaWV3Rm91bmRXaGVuT3BlbmVkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0vLyAgICAJZmluYWwgU3RyaW5nIHZpZXdJZCA9IE1vY2tWaWV3UGFydC5JRDsKLS8vICAgICAgICBmaW5hbCBib29sZWFuW10gZXZlbnRSZWNlaXZlZCA9IHsgZmFsc2UsIGZhbHNlIH07Ci0vLyAgICAgICAgSVBhcnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0UGFydExpc3RlbmVyKCkgewotLy8gICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLS8vICAgICAgICAgICAgICAgIHN1cGVyLnBhcnRPcGVuZWQocGFydCk7Ci0vLyAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgbm90aWZpY2F0aW9uIGlzIGZvciB0aGUgdmlldyB3ZSBvcGVuZWQKLS8vICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2aWV3SWQsIHBhcnQuZ2V0U2l0ZSgpLmdldElkKCkpOwotLy8gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIHZpZXcgY2FuIGJlIGZvdW5kCi0vLyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZQYWdlLmZpbmRWaWV3KHZpZXdJZCkpOwotLy8gICAgICAgICAgICAgICAgSVZpZXdQYXJ0W10gdmlld3MgPSBmUGFnZS5nZXRWaWV3cygpOwotLy8gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHZpZXdzLmxlbmd0aCk7Ci0vLyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModmlld0lkLCB2aWV3c1swXS5nZXRTaXRlKCkuZ2V0SWQoKSk7Ci0vLyAgICAgICAgICAgICAgICBldmVudFJlY2VpdmVkWzBdID0gdHJ1ZTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH07Ci0vLyAgICAgICAgSVBhcnRMaXN0ZW5lcjIgbGlzdGVuZXIyID0gbmV3IFRlc3RQYXJ0TGlzdGVuZXIyKCkgewotLy8gICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZikgewotLy8gICAgICAgICAgICAgICAgc3VwZXIucGFydE9wZW5lZChyZWYpOwotLy8gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG5vdGlmaWNhdGlvbiBpcyBmb3IgdGhlIHZpZXcgd2Ugb3BlbmVkCi0vLyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModmlld0lkLCByZWYuZ2V0SWQoKSk7Ci0vLyAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgdmlldyBjYW4gYmUgZm91bmQKLS8vICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZlBhZ2UuZmluZFZpZXdSZWZlcmVuY2Uodmlld0lkKSk7Ci0vLyAgICAgICAgICAgICAgICBJVmlld1JlZmVyZW5jZVtdIHJlZnMgPSBmUGFnZS5nZXRWaWV3UmVmZXJlbmNlcygpOwotLy8gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlZnMubGVuZ3RoKTsKLS8vICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2aWV3SWQsIHJlZnNbMF0uZ2V0SWQoKSk7Ci0vLyAgICAgICAgICAgICAgICBldmVudFJlY2VpdmVkWzFdID0gdHJ1ZTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH07Ci0vLyAgICAgICAgZlBhZ2UuYWRkUGFydExpc3RlbmVyKGxpc3RlbmVyKTsKLS8vICAgICAgICBmUGFnZS5hZGRQYXJ0TGlzdGVuZXIobGlzdGVuZXIyKTsKLS8vICAgICAgICBmUGFnZS5zaG93Vmlldyh2aWV3SWQpOwotLy8gICAgICAgIGZQYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLyAgICAgICAgZlBhZ2UucmVtb3ZlUGFydExpc3RlbmVyKGxpc3RlbmVyMik7Ci0vLyAgICAgICAgYXNzZXJ0VHJ1ZShldmVudFJlY2VpdmVkWzBdKTsKLS8vICAgICAgICBhc3NlcnRUcnVlKGV2ZW50UmVjZWl2ZWRbMV0pOwotLy8gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB3aGVuIGEgcGFydE9wZW5lZCBpcyByZWNlaXZlZCBmb3IgYW4gZWRpdG9yIGJlaW5nIG9wZW5lZCwKLSAgICAgKiB0aGUgZWRpdG9yIGlzIGF2YWlsYWJsZSB2aWEgZmluZEVkaXRvciwgZ2V0RWRpdG9ycywgYW5kIGdldEVkaXRvclJlZmVyZW5jZXMuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFZGl0b3JGb3VuZFdoZW5PcGVuZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAJZmluYWwgU3RyaW5nIGVkaXRvcklkID0gTW9ja0VkaXRvclBhcnQuSUQxOwotCQlJUHJvamVjdCBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgiSVBhcnRTZXJ2aWNlVGVzdCIpOwotCQlJRmlsZSBmaWxlID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgidGVzdEVkaXRvckZvdW5kV2hlbk9wZW5lZC50eHQiLCBwcm9qKTsKLQkJZmluYWwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKTsKLSAgICAJCi0gICAgICAgIGZpbmFsIGJvb2xlYW5bXSBldmVudFJlY2VpdmVkID0geyBmYWxzZSwgZmFsc2UgfTsKLSAgICAgICAgSVBhcnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0UGFydExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucGFydE9wZW5lZChwYXJ0KTsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgbm90aWZpY2F0aW9uIGlzIGZvciB0aGUgZWRpdG9yIHdlIG9wZW5lZAotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3JJZCwgcGFydC5nZXRTaXRlKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIGVkaXRvciBjYW4gYmUgZm91bmQKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZQYWdlLmZpbmRFZGl0b3IoZWRpdG9ySW5wdXQpKTsKLSAgICAgICAgICAgICAgICBJRWRpdG9yUGFydFtdIGVkaXRvcnMgPSBmUGFnZS5nZXRFZGl0b3JzKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVkaXRvcnMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9ySWQsIGVkaXRvcnNbMF0uZ2V0U2l0ZSgpLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGV2ZW50UmVjZWl2ZWRbMF0gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBJUGFydExpc3RlbmVyMiBsaXN0ZW5lcjIgPSBuZXcgVGVzdFBhcnRMaXN0ZW5lcjIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgICAgIHN1cGVyLnBhcnRPcGVuZWQocmVmKTsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgbm90aWZpY2F0aW9uIGlzIGZvciB0aGUgZWRpdG9yIHdlIG9wZW5lZAotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3JJZCwgcmVmLmdldElkKCkpOwotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBlZGl0b3IgY2FuIGJlIGZvdW5kCi0gICAgICAgICAgICAgICAgSUVkaXRvclJlZmVyZW5jZVtdIHJlZnMgPSBmUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlZnMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9ySWQsIHJlZnNbMF0uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgZXZlbnRSZWNlaXZlZFsxXSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGZQYWdlLmFkZFBhcnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGZQYWdlLmFkZFBhcnRMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlmUGFnZS5vcGVuRWRpdG9yKGVkaXRvcklucHV0LCBlZGl0b3JJZCk7Ci0gICAgICAgIGZQYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGZQYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcihsaXN0ZW5lcjIpOwotICAgICAgICBhc3NlcnRUcnVlKGV2ZW50UmVjZWl2ZWRbMF0pOwotICAgICAgICBhc3NlcnRUcnVlKGV2ZW50UmVjZWl2ZWRbMV0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVBlcnNwZWN0aXZlRGVzY3JpcHRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lQZXJzcGVjdGl2ZURlc2NyaXB0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Zjg3MGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVBlcnNwZWN0aXZlRGVzY3JpcHRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1wdWJsaWMgY2xhc3MgSVBlcnNwZWN0aXZlRGVzY3JpcHRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIElQZXJzcGVjdGl2ZURlc2NyaXB0b3JbXSBmUGVyc3BlY3RpdmVzOwotCi0gICAgcHVibGljIElQZXJzcGVjdGl2ZURlc2NyaXB0b3JUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIGZQZXJzcGVjdGl2ZXMgPSBQbGF0Zm9ybVVJCi0gICAgICAgICAgICAgICAgLmdldFdvcmtiZW5jaCgpLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKS5nZXRQZXJzcGVjdGl2ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSBpZHMgZm9yIGFsbCBwZXJzcGVjdGl2ZSBkZXNjcmlwdG9ycyBhcmUgbm9uLW51bGwgYW5kIG5vbi1lbXB0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SWQoKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZlBlcnNwZWN0aXZlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGlkID0gZlBlcnNwZWN0aXZlc1tpXS5nZXRJZCgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpZCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlkLmxlbmd0aCgpID4gMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSBsYWJlbHMgZm9yIGFsbCBwZXJzcGVjdGl2ZSBkZXNjcmlwdG9ycyBhcmUgbm9uLW51bGwgYW5kIG5vbi1lbXB0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGFiZWwoKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZlBlcnNwZWN0aXZlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gZlBlcnNwZWN0aXZlc1tpXS5nZXRMYWJlbCgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChsYWJlbCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGxhYmVsLmxlbmd0aCgpID4gMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSBpbWFnZSBkZXNjcmlwdG9ycyBmb3IgYWxsIHBlcnNwZWN0aXZlIGRlc2NyaXB0b3JzIGFyZSBub24tbnVsbC4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgc29tZSBwZXJzcGVjdGl2ZSBleHRlbnNpb25zIGluIHRoZSB0ZXN0IHN1aXRlIGRvIG5vdCBzcGVjaWZ5IGFuIGljb24KLSAgICAgKiBhdHRyaWJ1dGUuICBnZXRJbWFnZURlc2NyaXB0b3Igc2hvdWxkIHJldHVybiBhIGRlZmF1bHQgaW1hZ2UgZGVzY3JpcHRvciBpbiB0aGlzCi0gICAgICogY2FzZS4gIFRoaXMgaXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA2ODMyNS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEltYWdlRGVzY3JpcHRvcigpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmUGVyc3BlY3RpdmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgPSBmUGVyc3BlY3RpdmVzW2ldLmdldEltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbWFnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lQZXJzcGVjdGl2ZUxpc3RlbmVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVBlcnNwZWN0aXZlTGlzdGVuZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTU4MDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVBlcnNwZWN0aXZlTGlzdGVuZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIElQZXJzcGVjdGl2ZUxpc3RlbmVyVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgaW1wbGVtZW50cwotICAgICAgICBJUGVyc3BlY3RpdmVMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBpbnQgZkV2ZW50OwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IGZXaW5kb3c7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYWdlIGZQYWdlTWFzazsKLQotICAgIHByaXZhdGUgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBmUGVyTWFzazsKLQotICAgIC8qKgotICAgICAqIGJpdCBtYXNrcyBmb3IgZXZlbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDB4MDAsIE9QRU4gPSAweDAxLCBDTE9TRUQgPSAweDAyLAotICAgICAgICAgICAgQUNUSVZBVEVEID0gMHgwNCwgQ0hBTkdFRCA9IDB4MDg7Ci0KLSAgICBwdWJsaWMgSVBlcnNwZWN0aXZlTGlzdGVuZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIGZFdmVudCA9IE5PTkU7Ci0gICAgICAgIGZXaW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBmV2luZG93LmFkZFBlcnNwZWN0aXZlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmV2luZG93LnJlbW92ZVBlcnNwZWN0aXZlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIHN1cGVyLmRvVGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc3BlY3RpdmVBY3RpdmF0ZWQoKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbW1lbnRlZCBvdXQgYmVjYXVzZSB1bnRpbCB0ZXN0IGNhc2UgY2FuIGJlIHVwZGF0ZWQgdG8gd29yawotICAgICAgICAgKiB3aXRoIG5ldyB3aW5kb3cvcGFnZS9wZXJzcGVjdGl2ZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgKiAKLSAgICAgICAgIGZQYWdlTWFzayA9IGZXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgZlBlck1hc2sgPSBmV29ya2JlbmNoLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKS5maW5kUGVyc3BlY3RpdmVXaXRoSWQoRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCApOwotICAgICAgICAgZlBhZ2VNYXNrLnNldFBlcnNwZWN0aXZlKCBmUGVyTWFzayApOwotICAgICAgICAgCi0gICAgICAgICBhc3NlcnRFcXVhbHMoIGlzQWN0aXZhdGVkKCBmRXZlbnQgKSwgdHJ1ZSApOwotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc3BlY3RpdmVDaGFuZ2VkKCkgewotICAgICAgICAvKgotICAgICAgICAgKiBDb21tZW50ZWQgb3V0IGJlY2F1c2UgdW50aWwgdGVzdCBjYXNlIGNhbiBiZSB1cGRhdGVkIHRvIHdvcmsKLSAgICAgICAgICogd2l0aCBuZXcgd2luZG93L3BhZ2UvcGVyc3BlY3RpdmUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICogCi0gICAgICAgICBmUGFnZU1hc2sgPSBmV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgIGZQZXJNYXNrID0gZldvcmtiZW5jaC5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCkuZmluZFBlcnNwZWN0aXZlV2l0aElkKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQgKTsKLSAgICAgICAgIGZQYWdlTWFzay5zZXRQZXJzcGVjdGl2ZSggZlBlck1hc2sgKTsKLSAgICAgICAgIAotICAgICAgICAgYXNzZXJ0RXF1YWxzKCBpc0FjdGl2YXRlZCggZkV2ZW50ICksIHRydWUgKTsKLSAgICAgICAgICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUGVyc3BlY3RpdmVMaXN0ZW5lciNwZXJzcGVjdGl2ZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSwgSVBlcnNwZWN0aXZlRGVzY3JpcHRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotICAgICAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBwZXJzcGVjdGl2ZSkgewotICAgICAgICBpZiAocGFnZSA9PSBmUGFnZU1hc2sgJiYgcGVyc3BlY3RpdmUgPT0gZlBlck1hc2spCi0gICAgICAgICAgICBmRXZlbnQgfD0gQUNUSVZBVEVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVBlcnNwZWN0aXZlTGlzdGVuZXIjcGVyc3BlY3RpdmVDaGFuZ2VkKElXb3JrYmVuY2hQYWdlLCBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yLCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGVyc3BlY3RpdmVDaGFuZ2VkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0gICAgICAgICAgICBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnNwZWN0aXZlLCBTdHJpbmcgY2hhbmdlSWQpIHsKLSAgICAgICAgaWYgKHBhZ2UgPT0gZlBhZ2VNYXNrICYmIHBlcnNwZWN0aXZlID09IGZQZXJNYXNrKQotICAgICAgICAgICAgZkV2ZW50IHw9IENIQU5HRUQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3BlbihpbnQgYml0cykgewotICAgICAgICByZXR1cm4gKChiaXRzICYgT1BFTikgIT0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xvc2VkKGludCBiaXRzKSB7Ci0gICAgICAgIHJldHVybiAoKGJpdHMgJiBDTE9TRUQpICE9IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjdGl2YXRlZChpbnQgYml0cykgewotICAgICAgICByZXR1cm4gKChiaXRzICYgQUNUSVZBVEVEKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDaGFuZ2VkKGludCBiaXRzKSB7Ci0gICAgICAgIHJldHVybiAoKGJpdHMgJiBDTE9TRUQpICE9IDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lQZXJzcGVjdGl2ZVJlZ2lzdHJ5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVBlcnNwZWN0aXZlUmVnaXN0cnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZTIwNDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVBlcnNwZWN0aXZlUmVnaXN0cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5BcnJheVV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBJUGVyc3BlY3RpdmVSZWdpc3RyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIElQZXJzcGVjdGl2ZVJlZ2lzdHJ5IGZSZWc7Ci0KLSAgICBwdWJsaWMgSVBlcnNwZWN0aXZlUmVnaXN0cnlUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIGZSZWcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZFBlcnNwZWN0aXZlV2l0aElkKCkgewotICAgICAgICBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnMgPSAoSVBlcnNwZWN0aXZlRGVzY3JpcHRvcikgQXJyYXlVdGlsCi0gICAgICAgICAgICAgICAgLnBpY2tSYW5kb20oZlJlZy5nZXRQZXJzcGVjdGl2ZXMoKSk7Ci0KLSAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBzdXNwZWN0ID0gZlJlZy5maW5kUGVyc3BlY3RpdmVXaXRoSWQocGVycwotICAgICAgICAgICAgICAgIC5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdXNwZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBlcnMsIHN1c3BlY3QpOwotCi0gICAgICAgIHN1c3BlY3QgPSBmUmVnLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChJQ29uc3RhbnRzLkZha2VJRCk7Ci0gICAgICAgIGFzc2VydE51bGwoc3VzcGVjdCk7Ci0gICAgfQotCi0gICAgLyoJCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kUGVyc3BlY3RpdmVXaXRoTGFiZWwoKQotICAgICB7Ci0gICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVycyA9ICggSVBlcnNwZWN0aXZlRGVzY3JpcHRvciApQXJyYXlVdGlsLnBpY2tSYW5kb20oIGZSZWcuZ2V0UGVyc3BlY3RpdmVzKCkgKTsKLSAgICAgCi0gICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3Igc3VzcGVjdCA9IGZSZWcuZmluZFBlcnNwZWN0aXZlV2l0aExhYmVsKCBwZXJzLmdldExhYmVsKCkgKTsKLSAgICAgYXNzZXJ0Tm90TnVsbCggc3VzcGVjdCApOwotICAgICBhc3NlcnRFcXVhbHMoIHBlcnMsIHN1c3BlY3QgKTsKLSAgICAgCi0gICAgIHN1c3BlY3QgPSBmUmVnLmZpbmRQZXJzcGVjdGl2ZVdpdGhMYWJlbCggSUNvbnN0YW50cy5GYWtlTGFiZWwgKTsKLSAgICAgYXNzZXJ0TnVsbCggc3VzcGVjdCApOwotICAgICB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRQZXJzcGVjdGl2ZSgpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gZlJlZy5nZXREZWZhdWx0UGVyc3BlY3RpdmUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZCk7Ci0KLSAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBzdXNwZWN0ID0gZlJlZy5maW5kUGVyc3BlY3RpdmVXaXRoSWQoaWQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN1c3BlY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXREZWZhdWx0UGVyc3BlY3RpdmUoKSB7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVycyA9IChJUGVyc3BlY3RpdmVEZXNjcmlwdG9yKSBBcnJheVV0aWwKLSAgICAgICAgICAgICAgICAucGlja1JhbmRvbShmUmVnLmdldFBlcnNwZWN0aXZlcygpKTsKLSAgICAgICAgZlJlZy5zZXREZWZhdWx0UGVyc3BlY3RpdmUocGVycy5nZXRJZCgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMocGVycy5nZXRJZCgpLCBmUmVnLmdldERlZmF1bHRQZXJzcGVjdGl2ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGVyc3BlY3RpdmVzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3JbXSBwZXJzID0gZlJlZy5nZXRQZXJzcGVjdGl2ZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZXJzKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBlcnNbaV0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lTZWxlY3Rpb25TZXJ2aWNlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVNlbGVjdGlvblNlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MmNiN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVNlbGVjdGlvblNlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuU2VsZWN0aW9uUHJvdmlkZXJWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRoZSBJU2VsZWN0aW9uU2VydmljZSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIElTZWxlY3Rpb25TZXJ2aWNlVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgaW1wbGVtZW50cwotICAgICAgICBJU2VsZWN0aW9uTGlzdGVuZXIgewotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyBmV2luZG93OwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBmUGFnZTsKLQotICAgIC8vIEV2ZW50IHN0YXRlLgotICAgIHByaXZhdGUgYm9vbGVhbiBldmVudFJlY2VpdmVkOwotCi0gICAgcHJpdmF0ZSBJU2VsZWN0aW9uIGV2ZW50U2VsZWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBldmVudFBhcnQ7Ci0KLSAgICBwdWJsaWMgSVNlbGVjdGlvblNlcnZpY2VUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIGZXaW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBmUGFnZSA9IGZXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBhZGRTZWxlY3Rpb25MaXN0ZW5lciBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFNlbGVjdGlvbkxpc3RlbmVyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIEZyb20gSmF2YWRvYzogIkFkZHMgdGhlIGdpdmVuIHNlbGVjdGlvbiBsaXN0ZW5lci4KLSAgICAgICAgLy8gSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiIKLQotICAgICAgICAvLyBBZGQgbGlzdGVuZXIuCi0gICAgICAgIGZQYWdlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIC8vIE9wZW4gYSB2aWV3IGFuZCBzZWxlY3Qgc29tZXRoaW5nLgotICAgICAgICAvLyBWZXJpZnkgZXZlbnRzIGFyZSByZWNlaXZlZC4KLSAgICAgICAgY2xlYXJFdmVudFN0YXRlKCk7Ci0gICAgICAgIFNlbGVjdGlvblByb3ZpZGVyVmlldyB2aWV3ID0gKFNlbGVjdGlvblByb3ZpZGVyVmlldykgZlBhZ2UKLSAgICAgICAgICAgICAgICAuc2hvd1ZpZXcoU2VsZWN0aW9uUHJvdmlkZXJWaWV3LklEKTsKLSAgICAgICAgdmlldy5zZXRTZWxlY3Rpb24oIlNlbGVjdGlvbiIpOwotICAgICAgICBhc3NlcnRUcnVlKCJFdmVudFJlY2VpdmVkIiwgZXZlbnRSZWNlaXZlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIHJlbW92ZVBhZ2VMaXN0ZW5lciBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIEZyb20gSmF2YWRvYzogIlJlbW92ZXMgdGhlIGdpdmVuIHNlbGVjdGlvbiBsaXN0ZW5lci4KLSAgICAgICAgLy8gSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuIgotCi0gICAgICAgIC8vIEFkZCBhbmQgcmVtb3ZlIGxpc3RlbmVyLgotICAgICAgICBmUGFnZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgZlBhZ2UucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgLy8gT3BlbiBhIHZpZXcgYW5kIHNlbGVjdCBzb21ldGhpbmcuCi0gICAgICAgIC8vIFZlcmlmeSBubyBldmVudHMgYXJlIHJlY2VpdmVkLgotICAgICAgICBjbGVhckV2ZW50U3RhdGUoKTsKLSAgICAgICAgU2VsZWN0aW9uUHJvdmlkZXJWaWV3IHZpZXcgPSAoU2VsZWN0aW9uUHJvdmlkZXJWaWV3KSBmUGFnZQotICAgICAgICAgICAgICAgIC5zaG93VmlldyhTZWxlY3Rpb25Qcm92aWRlclZpZXcuSUQpOwotICAgICAgICB2aWV3LnNldFNlbGVjdGlvbigiU2VsZWN0aW9uIik7Ci0gICAgICAgIGFzc2VydFRydWUoIkV2ZW50UmVjZWl2ZWQiLCAhZXZlbnRSZWNlaXZlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgZ2V0QWN0aXZlUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2VsZWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIEZyb20gSmF2YWRvYzogIlJldHVybnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIHRoZSBhY3RpdmUgcGFydC4gIAotICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGluIHRoZSBhY3RpdmUgcGFydCBpcyA8ZW0+dW5kZWZpbmVkPC9lbT4gKHRoZSAKLSAgICAgICAgLy8gYWN0aXZlIHBhcnQgaGFzIG5vIHNlbGVjdGlvbiBwcm92aWRlcikgdGhlIHJlc3VsdCB3aWxsIGJlIAotICAgICAgICAvLyA8Y29kZT5udWxsPC9jb2RlPiIKLSAgICAgICAgT2JqZWN0IGFjdHVhbFNlbCwgc2VsMSA9ICJTZWxlY3Rpb24gMSIsIHNlbDIgPSAiU2VsZWN0aW9uIDIiOwotCi0gICAgICAgIC8vIE9wZW4gdmlldy4KLSAgICAgICAgU2VsZWN0aW9uUHJvdmlkZXJWaWV3IHZpZXcgPSAoU2VsZWN0aW9uUHJvdmlkZXJWaWV3KSBmUGFnZQotICAgICAgICAgICAgICAgIC5zaG93VmlldyhTZWxlY3Rpb25Qcm92aWRlclZpZXcuSUQpOwotCi0gICAgICAgIC8vIEZpcmUgc2VsZWN0aW9uIGFuZCB2ZXJpZnkuCi0gICAgICAgIHZpZXcuc2V0U2VsZWN0aW9uKHNlbDEpOwotICAgICAgICBhY3R1YWxTZWwgPSB1bndyYXBTZWxlY3Rpb24oZlBhZ2UuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNlbGVjdGlvbiIsIHNlbDEsIGFjdHVhbFNlbCk7Ci0KLSAgICAgICAgLy8gRmlyZSBzZWxlY3Rpb24gYW5kIHZlcmlmeS4KLSAgICAgICAgdmlldy5zZXRTZWxlY3Rpb24oc2VsMik7Ci0gICAgICAgIGFjdHVhbFNlbCA9IHVud3JhcFNlbGVjdGlvbihmUGFnZS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2VsZWN0aW9uIiwgc2VsMiwgYWN0dWFsU2VsKTsKLQotICAgICAgICAvLyBDbG9zZSB2aWV3IGFuZCB2ZXJpZnkuCi0gICAgICAgIGZQYWdlLmhpZGVWaWV3KHZpZXcpOwotICAgICAgICBhc3NlcnROdWxsKCJnZXRTZWxlY3Rpb24iLCBmUGFnZS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBldmVudCBmaXJpbmcgZm9yIGluYWN0aXZlIHBhcnRzLiAgSW4gdGhpcyBzY2VuYXJpbyAKLSAgICAgKiB0aGUgZXZlbnQgc2hvdWxkIG5vdCBiZSBmaXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uRXZlbnRXaGVuSW5hY3RpdmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgT2JqZWN0IHNlbDEgPSAiU2VsZWN0aW9uIDEiLCBzZWwyID0gIlNlbGVjdGlvbiAyIjsKLQotICAgICAgICAvLyBBZGQgbGlzdGVuZXIuCi0gICAgICAgIGZQYWdlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIC8vIE9wZW4gdHdvIHZpZXdzLgotICAgICAgICBTZWxlY3Rpb25Qcm92aWRlclZpZXcgdmlldzEgPSAoU2VsZWN0aW9uUHJvdmlkZXJWaWV3KSBmUGFnZQotICAgICAgICAgICAgICAgIC5zaG93VmlldyhTZWxlY3Rpb25Qcm92aWRlclZpZXcuSUQpOwotICAgICAgICBTZWxlY3Rpb25Qcm92aWRlclZpZXcgdmlldzIgPSAoU2VsZWN0aW9uUHJvdmlkZXJWaWV3KSBmUGFnZQotICAgICAgICAgICAgICAgIC5zaG93VmlldyhTZWxlY3Rpb25Qcm92aWRlclZpZXcuSURfMik7Ci0KLSAgICAgICAgLy8gRmlyZSBzZWxlY3Rpb24gZnJvbSB0aGUgc2Vjb25kLgotICAgICAgICAvLyBWZXJpZnkgaXQgaXMgcmVjZWl2ZWQuCi0gICAgICAgIGNsZWFyRXZlbnRTdGF0ZSgpOwotICAgICAgICB2aWV3Mi5zZXRTZWxlY3Rpb24oc2VsMik7Ci0gICAgICAgIGFzc2VydFRydWUoIkV2ZW50UmVjZWl2ZWQiLCBldmVudFJlY2VpdmVkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudFBhcnQiLCB2aWV3MiwgZXZlbnRQYXJ0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudCBTZWxlY3Rpb24iLCBzZWwyLCB1bndyYXBTZWxlY3Rpb24oZXZlbnRTZWxlY3Rpb24pKTsKLQotICAgICAgICAvLyBGaXJlIHNlbGVjdGlvbiBmcm9tIHRoZSBmaXJzdC4KLSAgICAgICAgLy8gVmVyaWZ5IGl0IGlzIE5PVCByZWNlaXZlZC4KLSAgICAgICAgY2xlYXJFdmVudFN0YXRlKCk7Ci0gICAgICAgIHZpZXcxLnNldFNlbGVjdGlvbihzZWwxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBzZWxlY3Rpb24gZXZlbnRzIHJlY2VpdmVkIiwgIWV2ZW50UmVjZWl2ZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZXZlbnQgZmlyaW5nIHdoZW4gYWN0aXZhdGVkLiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkV2ZW50V2hlbkFjdGl2YXRlZCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBGcm9tIEphdmFkb2M6ICJBZGRzIHRoZSBnaXZlbiBzZWxlY3Rpb24gbGlzdGVuZXIuCi0gICAgICAgIC8vIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4iCi0gICAgICAgIE9iamVjdCBzZWwxID0gIlNlbGVjdGlvbiAxIiwgc2VsMiA9ICJTZWxlY3Rpb24gMiI7Ci0KLSAgICAgICAgLy8gQWRkIGxpc3RlbmVyLgotICAgICAgICBmUGFnZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICAvLyBPcGVuIGEgdmlldyBhbmQgc2VsZWN0IHNvbWV0aGluZy4KLSAgICAgICAgU2VsZWN0aW9uUHJvdmlkZXJWaWV3IHZpZXcxID0gKFNlbGVjdGlvblByb3ZpZGVyVmlldykgZlBhZ2UKLSAgICAgICAgICAgICAgICAuc2hvd1ZpZXcoU2VsZWN0aW9uUHJvdmlkZXJWaWV3LklEKTsKLSAgICAgICAgdmlldzEuc2V0U2VsZWN0aW9uKHNlbDEpOwotCi0gICAgICAgIC8vIE9wZW4gYW5vdGhlciB2aWV3IGFuZCBzZWxlY3Qgc29tZXRoaW5nLgotICAgICAgICBTZWxlY3Rpb25Qcm92aWRlclZpZXcgdmlldzIgPSAoU2VsZWN0aW9uUHJvdmlkZXJWaWV3KSBmUGFnZQotICAgICAgICAgICAgICAgIC5zaG93VmlldyhTZWxlY3Rpb25Qcm92aWRlclZpZXcuSURfMik7Ci0gICAgICAgIHZpZXcyLnNldFNlbGVjdGlvbihzZWwyKTsKLQotICAgICAgICAvLyBBY3RpdmF0ZSB0aGUgZmlyc3Qgdmlldy4KLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgc2VsZWN0aW9uIGV2ZW50cyBhcmUgZmlyZWQuCi0gICAgICAgIGNsZWFyRXZlbnRTdGF0ZSgpOwotICAgICAgICBmUGFnZS5hY3RpdmF0ZSh2aWV3MSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV2ZW50UmVjZWl2ZWQiLCBldmVudFJlY2VpdmVkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudFBhcnQiLCB2aWV3MSwgZXZlbnRQYXJ0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudCBTZWxlY3Rpb24iLCBzZWwxLCB1bndyYXBTZWxlY3Rpb24oZXZlbnRTZWxlY3Rpb24pKTsKLQotICAgICAgICAvLyBBY3RpdmF0ZSB0aGUgc2Vjb25kIHZpZXcuCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHNlbGVjdGlvbiBldmVudHMgYXJlIGZpcmVkLgotICAgICAgICBjbGVhckV2ZW50U3RhdGUoKTsKLSAgICAgICAgZlBhZ2UuYWN0aXZhdGUodmlldzIpOwotICAgICAgICBhc3NlcnRUcnVlKCJFdmVudFJlY2VpdmVkIiwgZXZlbnRSZWNlaXZlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXZlbnRQYXJ0IiwgdmlldzIsIGV2ZW50UGFydCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXZlbnQgU2VsZWN0aW9uIiwgc2VsMiwgdW53cmFwU2VsZWN0aW9uKGV2ZW50U2VsZWN0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW53cmFwIGEgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IHVud3JhcFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbCkgewotICAgICAgICBpZiAoc2VsIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3QgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwotICAgICAgICAgICAgaWYgKHN0cnVjdC5zaXplKCkgPT0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RydWN0LmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBldmVudCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xlYXJFdmVudFN0YXRlKCkgewotICAgICAgICBldmVudFJlY2VpdmVkID0gZmFsc2U7Ci0gICAgICAgIGV2ZW50UGFydCA9IG51bGw7Ci0gICAgICAgIGV2ZW50U2VsZWN0aW9uID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVNlbGVjdGlvbkxpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQsIElTZWxlY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBldmVudFJlY2VpdmVkID0gdHJ1ZTsKLSAgICAgICAgZXZlbnRQYXJ0ID0gcGFydDsKLSAgICAgICAgZXZlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JVmlld0FjdGlvbkRlbGVnYXRlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVZpZXdBY3Rpb25EZWxlZ2F0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQxNTQyYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JVmlld0FjdGlvbkRlbGVnYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkFjdGlvblV0aWw7Ci0KLS8qKgotICogVGVzdHMgdGhlIGxpZmVjeWNsZSBmb3IgYSB2aWV3IGFjdGlvbiBkZWxlZ2F0ZS4KLSAqLwotcHVibGljIGNsYXNzIElWaWV3QWN0aW9uRGVsZWdhdGVUZXN0IGV4dGVuZHMgSUFjdGlvbkRlbGVnYXRlVGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBURVNUX1ZJRVdfSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLklWaWV3QWN0aW9uRGVsZWdhdGVUZXN0IjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGVUZXN0Ci0gICAgICovCi0gICAgcHVibGljIElWaWV3QWN0aW9uRGVsZWdhdGVUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluaXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gV2hlbiBhbiBhY3Rpb24gZGVsZWdhdGUgaXMgcnVuIHRoZQotICAgICAgICAvLyBpbml0LCBzZWxlY3Rpb25DaGFuZ2VkLCBhbmQgcnVuIG1ldGhvZHMgc2hvdWxkCi0gICAgICAgIC8vIGJlIGNhbGxlZCwgaW4gdGhhdCBvcmRlci4KLQotICAgICAgICAvLyBSdW4gdGhlIGFjdGlvbi4KLSAgICAgICAgdGVzdFJ1bigpOwotCi0gICAgICAgIC8vIFZlcmlmeSBsaWZlY3ljbGUuCi0gICAgICAgIE1vY2tBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZSA9IGdldERlbGVnYXRlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGVsZWdhdGUpOwotICAgICAgICBhc3NlcnRUcnVlKGRlbGVnYXRlLmNhbGxIaXN0b3J5LnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7ICJpbml0IiwKLSAgICAgICAgICAgICAgICAic2VsZWN0aW9uQ2hhbmdlZCIsICJydW4iIH0pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElBY3Rpb25EZWxlZ2F0ZVRlc3QjY3JlYXRlQWN0aW9uV2lkZ2V0KCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUFjdGlvbldpZGdldCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBNb2NrVmlld1BhcnQgdmlldyA9IChNb2NrVmlld1BhcnQpIGZQYWdlLnNob3dWaWV3KFRFU1RfVklFV19JRCk7Ci0gICAgICAgIHJldHVybiB2aWV3OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlVGVzdCNydW5BY3Rpb24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJ1bkFjdGlvbihPYmplY3Qgd2lkZ2V0KSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgTW9ja1ZpZXdQYXJ0IHZpZXcgPSAoTW9ja1ZpZXdQYXJ0KSB3aWRnZXQ7Ci0gICAgICAgIElNZW51TWFuYWdlciBtZ3IgPSB2aWV3LmdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIEFjdGlvblV0aWwucnVuQWN0aW9uV2l0aExhYmVsKHRoaXMsIG1nciwgIk1vY2sgQWN0aW9uIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJQWN0aW9uRGVsZWdhdGVUZXN0I2ZpcmVTZWxlY3Rpb24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVTZWxlY3Rpb24oT2JqZWN0IHdpZGdldCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIE1vY2tWaWV3UGFydCB2aWV3ID0gKE1vY2tWaWV3UGFydCkgd2lkZ2V0OwotICAgICAgICB2aWV3LmZpcmVTZWxlY3Rpb24oKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lWaWV3UGFydFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lWaWV3UGFydFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyYjY5My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JVmlld1BhcnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5DYWxsSGlzdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgdGVzdCBmb3IgSVZpZXdQYXJ0LiAgU2luY2UgSVZpZXdQYXJ0IGlzIGFuCi0gKiBpbnRlcmZhY2UgdGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBJVmlld1BhcnQgbGlmZWN5Y2xlIHJhdGhlcgotICogdGhhbiB0aGUgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBJVmlld1BhcnRUZXN0IGV4dGVuZHMgSVdvcmtiZW5jaFBhcnRUZXN0IHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJRWRpdG9yUGFydFRlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgSVZpZXdQYXJ0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFBhcnRUZXN0I29wZW5QYXJ0KElXb3JrYmVuY2hQYWdlKQotICAgICAqLwotICAgIHByb3RlY3RlZCBNb2NrUGFydCBvcGVuUGFydChJV29ya2JlbmNoUGFnZSBwYWdlKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgcmV0dXJuIChNb2NrV29ya2JlbmNoUGFydCkgcGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFBhcnRUZXN0I2Nsb3NlUGFydChJV29ya2JlbmNoUGFnZSwgTW9ja1dvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xvc2VQYXJ0KElXb3JrYmVuY2hQYWdlIHBhZ2UsIE1vY2tQYXJ0IHBhcnQpCi0gICAgICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgcGFnZS5oaWRlVmlldygoSVZpZXdQYXJ0KSBwYXJ0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgdmlldyBpcyBjbG9zZWQgd2l0aG91dCBzYXZpbmcgaWYgaXNTYXZlT25DbG9zZU5lZWRlZCgpCi0gICAgICogcmV0dXJucyBmYWxzZS4gVGhpcyBhbHNvIHRlc3RzIHNvbWUgZGlzcG9zYWwgYmVoYXZpb3JzIHNwZWNpZmljIHRvIAotICAgICAqIHZpZXdzOiBuYW1lbHksIHRoYXQgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtcyBhcmUgZGlzcG9zZWQgaW4gdGhlIGNvcnJlY3QKLSAgICAgKiBvcmRlciB3aXRoIHJlc3BlY3QgdG8gdGhlIGRpc3Bvc2FsIG9mIHRoZSB2aWV3LiAKLSAgICAgKiAKLSAgICAgKiBAc2VlIElTYXZlYWJsZSNpc1NhdmVPbkNsb3NlTmVlZGVkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZENsb3NlU2F2ZU5vdE5lZWRlZCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBPcGVuIGEgcGFydC4KLSAgICAgICAgU2F2ZWFibGVNb2NrVmlld1BhcnQgcGFydCA9IChTYXZlYWJsZU1vY2tWaWV3UGFydCkgZlBhZ2Uuc2hvd1ZpZXcoU2F2ZWFibGVNb2NrVmlld1BhcnQuSUQpOwotICAgICAgICBwYXJ0LnNldERpcnR5KHRydWUpOwotICAgICAgICBwYXJ0LnNldFNhdmVOZWVkZWQoZmFsc2UpOwotICAgICAgICBjbG9zZVBhcnQoZlBhZ2UsIHBhcnQpOwotICAgICAgICAKLSAgICAgICAgQ2FsbEhpc3RvcnkgaGlzdG9yeSA9IHBhcnQuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE86IFRoaXMgdmVyaWZpZXMgdGhlIDMuMCBkaXNwb3NhbCBvcmRlci4gSG93ZXZlciwgdGhlcmUgbWF5IGJlIGEgYnVnIGhlcmUuCi0gICAgICAgIC8vIFRoYXQgaXMsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoaXMgYW5kIGRpc3Bvc2UgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtcyAKLSAgICAgICAgLy8gYWZ0ZXIgdGhlIHZpZXcncyBkaXNwb3NlIG1ldGhvZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgc2l0ZSBpcyBuZXZlciByZXR1cm5pbmcKLSAgICAgICAgLy8gYSBkaXNwb3NlZCBjb250cmlidXRpb24gaXRlbS4gU2VlIGJ1ZyA5NDQ1NyBmb3IgZGV0YWlscy4KLSAgICAgICAgYXNzZXJ0VHJ1ZShoaXN0b3J5LnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7ICJzZXRJbml0aWFsaXphdGlvbkRhdGEiLCAiaW5pdCIsCi0gICAgICAgICAgICAgICAgImNyZWF0ZVBhcnRDb250cm9sIiwgInNldEZvY3VzIiwgImlzU2F2ZU9uQ2xvc2VOZWVkZWQiLCAKLSAgICAgICAgICAgICAgICAid2lkZ2V0RGlzcG9zZWQiLCAidG9vbGJhckNvbnRyaWJ1dGlvbkl0ZW1XaWRnZXREaXNwb3NlZCIsIAotICAgICAgICAgICAgICAgICJ0b29sYmFyQ29udHJpYnV0aW9uSXRlbURpc3Bvc2VkIiwgImRpc3Bvc2UiIH0pKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaGlzdG9yeS5jb250YWlucygiZG9TYXZlIikpOwotICAgIH0KLSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVZpZXdTaXRlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVZpZXdTaXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGU0Y2EyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lWaWV3U2l0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi1wdWJsaWMgY2xhc3MgSVZpZXdTaXRlVGVzdCBleHRlbmRzIElXb3JrYmVuY2hQYXJ0U2l0ZVRlc3QgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIElWaWV3UGFydFNpdGVUZXN0Ci0gICAgICovCi0gICAgcHVibGljIElWaWV3U2l0ZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hQYXJ0U2l0ZVRlc3QjZ2V0VGVzdFBhcnROYW1lKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRlc3RQYXJ0TmFtZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICByZXR1cm4gTW9ja1ZpZXdQYXJ0Lk5BTUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJV29ya2JlbmNoUGFydFNpdGVUZXN0I2dldFRlc3RQYXJ0SWQoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGVzdFBhcnRJZCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICByZXR1cm4gTW9ja1ZpZXdQYXJ0LklEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFBhcnRTaXRlVGVzdCNjcmVhdGVUZXN0UGFydChJV29ya2JlbmNoUGFnZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgY3JlYXRlVGVzdFBhcnQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkKLSAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICByZXR1cm4gcGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY3Rpb25CYXJzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIEZyb20gSmF2YWRvYzogIlJldHVybnMgdGhlIGFjdGlvbiBiYXJzIGZvciB0aGlzIHBhcnQgc2l0ZS4iCi0KLSAgICAgICAgSVZpZXdQYXJ0IHZpZXcgPSAoSVZpZXdQYXJ0KSBjcmVhdGVUZXN0UGFydChmUGFnZSk7Ci0gICAgICAgIElWaWV3U2l0ZSBzaXRlID0gdmlldy5nZXRWaWV3U2l0ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNpdGUuZ2V0QWN0aW9uQmFycygpKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVdvcmtiZW5jaFBhZ2VUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2JlbmNoUGFnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyN2ZiMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2JlbmNoUGFnZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuWE1MTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLkNsb3NlUGVyc3BlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuU2F2ZWFibGVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuSUFjdGlvblNldERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuUGVyc3BlY3RpdmVTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQ2FsbEhpc3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkVtcHR5UGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgSVdvcmtiZW5jaFBhZ2VUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYWdlIGZBY3RpdmVQYWdlOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IGZXaW47Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2o7Ci0KLSAgICBwdWJsaWMgSVdvcmtiZW5jaFBhZ2VUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIGZXaW4gPSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBmQWN0aXZlUGFnZSA9IGZXaW4uZ2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9UZWFyRG93bigpOwotICAgICAgICBpZiAocHJvaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBGaWxlVXRpbC5kZWxldGVQcm9qZWN0KHByb2opOwotICAgICAgICAgICAgcHJvaiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0JICogVGVzdHMgdGhlIG5ldyB3b3JraW5nIHNldCBBUEkuCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXb3JraW5nU2V0czEoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBmQWN0aXZlUGFnZTsKLQkJSVdvcmtpbmdTZXRbXSBzZXRzID0gcGFnZS5nZXRXb3JraW5nU2V0cygpOwotCQlhc3NlcnROb3ROdWxsKHNldHMpOwotCQlhc3NlcnRFcXVhbHMoMCwgc2V0cy5sZW5ndGgpOwotCi0JCUlXb3JraW5nU2V0TWFuYWdlciBtYW5hZ2VyID0gcGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRXb3JraW5nU2V0TWFuYWdlcigpOwotCi0JCUlXb3JraW5nU2V0IHNldDEgPSBudWxsLCBzZXQyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNldDEgPSBtYW5hZ2VyLmNyZWF0ZVdvcmtpbmdTZXQoIncxIiwgbmV3IElBZGFwdGFibGVbMF0pOwotCQkJbWFuYWdlci5hZGRXb3JraW5nU2V0KHNldDEpOwotCQkJc2V0MiA9IG1hbmFnZXIuY3JlYXRlV29ya2luZ1NldCgidzIiLCBuZXcgSUFkYXB0YWJsZVswXSk7Ci0JCQltYW5hZ2VyLmFkZFdvcmtpbmdTZXQoc2V0Mik7Ci0JCQkKLQkJCXBhZ2Uuc2V0V29ya2luZ1NldHMobmV3IElXb3JraW5nU2V0W10ge3NldDF9KTsKLQkJCXNldHMgPSBwYWdlLmdldFdvcmtpbmdTZXRzKCk7Ci0JCQkKLQkJCWFzc2VydE5vdE51bGwoc2V0cyk7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgc2V0cy5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKHNldDEsIHNldHNbMF0pOwotCQkJCi0JCQlwYWdlLnNldFdvcmtpbmdTZXRzKG5ldyBJV29ya2luZ1NldFswXSk7Ci0JCQlzZXRzID0gcGFnZS5nZXRXb3JraW5nU2V0cygpOwotCQkJYXNzZXJ0Tm90TnVsbChzZXRzKTsKLQkJCWFzc2VydEVxdWFscygwLCBzZXRzLmxlbmd0aCk7Ci0JCQkKLQkJCXBhZ2Uuc2V0V29ya2luZ1NldHMobmV3IElXb3JraW5nU2V0W10ge3NldDEsIHNldDJ9KTsKLQkJCXNldHMgPSBwYWdlLmdldFdvcmtpbmdTZXRzKCk7Ci0JCQkKLQkJCWFzc2VydE5vdE51bGwoc2V0cyk7Ci0JCQlhc3NlcnRFcXVhbHMoMiwgc2V0cy5sZW5ndGgpOwotCQkJU2V0IHJlYWxTZXQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KHNldHMpKTsKLQkJCWFzc2VydFRydWUocmVhbFNldC5jb250YWlucyhzZXQxKSk7Ci0JCQlhc3NlcnRUcnVlKHJlYWxTZXQuY29udGFpbnMoc2V0MikpOwotCQkJCi0JCQlwYWdlLnNldFdvcmtpbmdTZXRzKG5ldyBJV29ya2luZ1NldFswXSk7Ci0JCQlzZXRzID0gcGFnZS5nZXRXb3JraW5nU2V0cygpOwotCQkJYXNzZXJ0Tm90TnVsbChzZXRzKTsKLQkJCWFzc2VydEVxdWFscygwLCBzZXRzLmxlbmd0aCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc2V0MSAhPSBudWxsKSAKLQkJCQltYW5hZ2VyLnJlbW92ZVdvcmtpbmdTZXQoc2V0MSk7Ci0JCQlpZiAoc2V0MiAhPSBudWxsKQotCQkJCW1hbmFnZXIucmVtb3ZlV29ya2luZ1NldChzZXQyKTsKLQkJfQotCX0KLQkKLQkgLyoqCi0JICogVGVzdHMgdGhlIG5ldyB3b3JraW5nIHNldCBBUEkuCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXb3JraW5nU2V0czIoKSB7Ci0JCWZBY3RpdmVQYWdlLnNldFdvcmtpbmdTZXRzKG51bGwpOwotCQlJV29ya2luZ1NldCBbXSBzZXRzID0gZkFjdGl2ZVBhZ2UuZ2V0V29ya2luZ1NldHMoKTsKLQkJYXNzZXJ0Tm90TnVsbChzZXRzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNldHMubGVuZ3RoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlIHdvcmtpbmcgc2V0IGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdvcmtpbmdTZXRzMygpIHsKLQkJSVdvcmtpbmdTZXRNYW5hZ2VyIG1hbmFnZXIgPSBmQWN0aXZlUGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRXb3JraW5nU2V0TWFuYWdlcigpOwotCi0JCUlXb3JraW5nU2V0IHNldDEgPSBudWxsOwotCQlmaW5hbCBJV29ya2luZ1NldCBbXVtdIHNldHMgPSBuZXcgSVdvcmtpbmdTZXRbMV1bXTsKLQkJc2V0c1swXSA9IG5ldyBJV29ya2luZ1NldFswXTsKLQkJSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJV29ya2luZ1NldCBbXSBvbGRTZXRzID0gKElXb3JraW5nU2V0W10pIGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHNldHNbMF0sIG9sZFNldHMpKTsKLQkJCQlzZXRzWzBdID0gKElXb3JraW5nU2V0W10pIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQl9fTsKLQkJdHJ5IHsKLQkJCXNldDEgPSBtYW5hZ2VyLmNyZWF0ZVdvcmtpbmdTZXQoIncxIiwgbmV3IElBZGFwdGFibGVbMF0pOwotCQkJbWFuYWdlci5hZGRXb3JraW5nU2V0KHNldDEpOwotCi0JCQlmQWN0aXZlUGFnZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCQotCQkJZkFjdGl2ZVBhZ2Uuc2V0V29ya2luZ1NldHMobmV3IElXb3JraW5nU2V0W10geyBzZXQxIH0pOwotCQkJZkFjdGl2ZVBhZ2Uuc2V0V29ya2luZ1NldHMobmV3IElXb3JraW5nU2V0W10geyB9KTsKLQkJCWZBY3RpdmVQYWdlLnNldFdvcmtpbmdTZXRzKG5ldyBJV29ya2luZ1NldFtdIHsgc2V0MSB9KTsKLQkJCQotCQkJc2V0c1swXSA9IGZBY3RpdmVQYWdlLmdldFdvcmtpbmdTZXRzKCk7Ci0KLQkJCWFzc2VydE5vdE51bGwoc2V0c1swXSk7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgc2V0c1swXS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKHNldDEsIHNldHNbMF1bMF0pOwotCi0JCX0gZmluYWxseSB7Ci0JCQlmQWN0aXZlUGFnZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWlmIChzZXQxICE9IG51bGwpCi0JCQkJbWFuYWdlci5yZW1vdmVXb3JraW5nU2V0KHNldDEpOwotCQl9Ci0JfQotICAgIAotICAgIC8qKgotCSAqIFRlc3QgdGhlIFZJRVdfVklTSUJMRSBwYXJhbWV0ZXIgZm9yIHNob3dWaWV3LCBvcGVuaW5nIHRoZSB2aWV3IGluIHRoZQotCSAqIHN0YWNrIHRoYXQgZG9lcyBub3QgY29udGFpbiB0aGUgYWN0aXZlIHZpZXcuIEVuc3VyZXMgdGhhdCB0aGUgY3JlYXRlZAotCSAqIHZpZXcgaXMgbm90IHRoZSBhY3RpdmUgcGFydCBidXQgaXMgdGhlIHRvcCBwYXJ0IGluIGl0cyBzdGFjay4KLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Vmlld19WSVNJQkxFMigpIHsKLSAgICAgICAgV29ya2JlbmNoUGFnZSBwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIGZBY3RpdmVQYWdlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFnZS5zZXRQZXJzcGVjdGl2ZShXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCkuZmluZFBlcnNwZWN0aXZlV2l0aElkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuVmlld1BlcnNwZWN0aXZlIikpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL2NyZWF0ZSBhIHBhcnQgdG8gYmUgYWN0aXZlCi0gICAgICAgICAgICBJVmlld1BhcnQgYWN0aXZlUGFydCA9IHBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEMyk7Ci0KLSAgICAgICAgICAgIElWaWV3UGFydCBjcmVhdGVkUGFydCA9IHBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEMiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UuVklFV19WSVNJQkxFKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgSVZpZXdQYXJ0W10gc3RhY2sgPSBwYWdlLmdldFZpZXdTdGFjayhjcmVhdGVkUGFydCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3RhY2subGVuZ3RoKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNyZWF0ZWRQYXJ0LCBzdGFja1swXSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFnZS5maW5kVmlldyhNb2NrVmlld1BhcnQuSUQpLCBzdGFja1sxXSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUocGFnZS5pc1BhcnRWaXNpYmxlKGNyZWF0ZWRQYXJ0KSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhhY3RpdmVQYXJ0LCBwYWdlLmdldEFjdGl2ZVBhcnQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIG9wZW5FZGl0b3IoSUVkaXRvcklucHV0IGlucHV0LCBTdHJpbmcgZWRpdG9ySWQsIGJvb2xlYW4gYWN0aXZhdGUpIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuRWRpdG9yNCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gTW9ja0VkaXRvclBhcnQuSUQxOwotICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KEZpbGVVdGlsLmNyZWF0ZUZpbGUoCi0gICAgICAgICAgICAgICAgInRlc3QubW9jazEiLCBwcm9qKSk7Ci0gICAgICAgIE1vY2tQYXJ0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTW9ja1BhcnRMaXN0ZW5lcigpOwotICAgICAgICBmQWN0aXZlUGFnZS5hZGRQYXJ0TGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBDYWxsSGlzdG9yeSBjYWxsVHJhY2UgPSBsaXN0ZW5lci5nZXRDYWxsSGlzdG9yeSgpOwotCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZhZG9jOiBUaGUgZWRpdG9yIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSBtYXBwaW5nIGVkaXRvcklkIHRvIGFuIGVkaXRvciBleHRlbnNpb24gCi0gICAgICAgICByZWdpc3RlcmVkIHdpdGggdGhlIHdvcmtiZW5jaC4gCi0gICAgICAgICBqYXZhZG9jOiBJZiBhY3RpdmF0ZSA9PSB0cnVlIHRoZSBlZGl0b3Igd2lsbCBiZSBhY3RpdmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIC8vb3BlbiBhbiBlZGl0b3Igd2l0aCBhY3RpdmF0aW9uCi0gICAgICAgIAotICAgICAgICAvLyBTdGFydCB3aXRoIGEgdmlldyBhY3RpdmUgaW4gb3JkZXIgdG8gdmVyaWZ5IHRoYXQgdGhlIGVkaXRvciBnZXRzIGFjdGl2YXRlZAotICAgICAgICBmQWN0aXZlUGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcsIG51bGwsIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUpOwotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIGlucHV0LCBpZCwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSwgaW5wdXQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldFNpdGUoKS5nZXRJZCgpLCBpZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhoYXNFZGl0b3IoZWRpdG9yKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSwgZWRpdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygicGFydEFjdGl2YXRlZCIpLCB0cnVlKTsKLQotICAgICAgICAvL3dlIG5lZWQgYW5vdGhlciBlZGl0b3Igc28gdGhhdCB0aGUgZWRpdG9yIHVuZGVyIHRlc3QgY2FuIHJlY2VpdmUgZXZlbnRzLgotICAgICAgICAvL290aGVyd2lzZSwgZXZlbnRzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgSUVkaXRvclBhcnQgZXh0cmEgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgRmlsZVV0aWwuY3JlYXRlRmlsZSgKLSAgICAgICAgICAgICAgICAiYWFhYWEiLCBwcm9qKSk7Ci0KLSAgICAgICAgLy9jbG9zZSB0aGUgZmlyc3QgZWRpdG9yIGFmdGVyIHRoZSBzZWNvbmQgaGFzIG9wZW5lZDsgbmVjZXNzYXJ5IGZvcgotICAgICAgICAvL3Rlc3QgdG8gd29yayB3aXRoIGZpeCB0byBQUiA3NzQzCi0gICAgICAgIGZBY3RpdmVQYWdlLmNsb3NlRWRpdG9yKGVkaXRvciwgZmFsc2UpOwotCi0gICAgICAgIC8vIFN0YXJ0IHdpdGggYSB2aWV3IGFjdGl2ZSBpbiBvcmRlciB0byB2ZXJpZnkgdGhhdCB0aGUgZWRpdG9yIGRvZXMgbm90IGdldCBhY3RpdmF0ZWQKLSAgICAgICAgLy8gKG5vdGU6IHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdGl2YXRlPWZhbHNlIGZsYWcsIHRoZSBlZGl0b3Igd291bGQgYWx3YXlzIGJlIGFjdGl2YXRlZAotICAgICAgICAvLyBpZiBpdCBpcyBiZWluZyBvcGVuZWQgaW4gdGhlIHNhbWUgc3RhY2sgYXMgdGhlIGFjdGl2ZSBlZGl0b3IuIE1ha2luZyBhIHZpZXcgYWN0aXZlCi0gICAgICAgIC8vIGluaXRpYWxseSB0ZXN0cyB0aGUgZnVuY3Rpb24gb2YgdGhlIGFjdGl2YXRlIGZsYWcpCi0gICAgICAgIGZBY3RpdmVQYWdlLnNob3dWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVywgbnVsbCwgSVdvcmtiZW5jaFBhZ2UuVklFV19BQ1RJVkFURSk7Ci0gICAgICAgIGNhbGxUcmFjZS5jbGVhcigpOwotICAgICAgICAvL29wZW4gYW4gZWRpdG9yIHdpdGhvdXQgYWN0aXZhdGlvbgotICAgICAgICBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgaW5wdXQsIGlkLCBmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldEVkaXRvcklucHV0KCksIGlucHV0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvci5nZXRTaXRlKCkuZ2V0SWQoKSwgaWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaGFzRWRpdG9yKGVkaXRvciksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJwYXJ0QWN0aXZhdGVkIiksIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygicGFydEJyb3VnaHRUb1RvcCIpLCB0cnVlKTsKLQotICAgICAgICBmQWN0aXZlUGFnZS5hY3RpdmF0ZShleHRyYSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IElmIHRoaXMgcGFnZSBhbHJlYWR5IGhhcyBhbiBlZGl0b3Igb3BlbiBvbiB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IGVkaXRvciBpcyBicm91Z2h0IHRvIHRoZSBmcm9udAotICAgICAgICAgKi8KLSAgICAgICAgLy9vcGVuIHRoZSBlZGl0b3IgdW5kZXIgdGVzdCBzZWNvbmQgdGltZSB3aXRob3V0IGFjdGl2YXRpb24KLSAgICAgICAgZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFKTsKLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgaW5wdXQsIGlkLCBmYWxzZSksIGVkaXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UuY29udGFpbnMoInBhcnRCcm91Z2h0VG9Ub3AiKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UuY29udGFpbnMoInBhcnRBY3RpdmF0ZWQiKSwgZmFsc2UpOwotCi0gICAgICAgIC8vYWN0aXZhdGUgdGhlIG90aGVyIGVkaXRvcgotICAgICAgICBmQWN0aXZlUGFnZS5hY3RpdmF0ZShleHRyYSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IElmIGFjdGl2YXRlID09IHRydWUgdGhlIGVkaXRvciB3aWxsIGJlIGFjdGl2YXRlZAotICAgICAgICAgKi8KLSAgICAgICAgLy9vcGVuIHRoZSBlZGl0b3IgdW5kZXIgdGVzdCBzZWNvbmQgdGltZSB3aXRoIGFjdGl2YXRpb24KLSAgICAgICAgZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFKTsKLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgaW5wdXQsIGlkLCB0cnVlKSwgZWRpdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygicGFydEJyb3VnaHRUb1RvcCIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygicGFydEFjdGl2YXRlZCIpLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgIGphdmFkb2M6IElmIGFjdGl2YXRlID09IGZhbHNlIGJ1dCBhbm90aGVyIGVkaXRvciBpbiB0aGUgc2FtZSBzdGFjayB3YXMgYWN0aXZlLCB0aGUgCi0gICAgICAgIG5ldyBlZGl0b3Igd2lsbCBiZSBhY3RpdmF0ZWQgcmVnYXJkbGVzcy4KLSAgICAgICAgKi8KLSAgICAgICAgLy8gQ2xvc2UgdGhlIG9sZCBlZGl0b3IKLSAgICAgICAgZkFjdGl2ZVBhZ2UuY2xvc2VFZGl0b3IoZWRpdG9yLCBmYWxzZSk7Ci0gICAgICAgIC8vIEVuc3VyZSBhbm90aGVyIGVkaXRvciBpbiB0aGUgc3RhY2sgaXMgYWN0aXZlCi0gICAgICAgIGZBY3RpdmVQYWdlLmFjdGl2YXRlKGV4dHJhKTsKLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBlZGl0b3IgaXMgc3RpbGwgYWN0aXZhdGVkCi0gICAgICAgIElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBpbnB1dCwgaWQsIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygicGFydEJyb3VnaHRUb1RvcCIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygicGFydEFjdGl2YXRlZCIpLCB0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICoJdGVzdHMgYm90aCBvZiB0aGUgZm9sbG93aW5nOgkKLSAgICAgKglzZXRFZGl0b3JBcmVhVmlzaWJsZSgpCi0gICAgICoJaXNFZGl0b3JBcmVhVmlzaWJsZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldF9TZXRFZGl0b3JBcmVhVmlzaWJsZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmQWN0aXZlUGFnZS5zZXRFZGl0b3JBcmVhVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmQWN0aXZlUGFnZS5pc0VkaXRvckFyZWFWaXNpYmxlKCkgPT0gdHJ1ZSk7Ci0KLSAgICAgICAgZkFjdGl2ZVBhZ2Uuc2V0RWRpdG9yQXJlYVZpc2libGUoZmFsc2UpOwotICAgICAgICBhc3NlcnRUcnVlKGZBY3RpdmVQYWdlLmlzRWRpdG9yQXJlYVZpc2libGUoKSA9PSBmYWxzZSk7Ci0gICAgfQotCi0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogIG9wZW5FZGl0b3IoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgSUZpbGUgaW5wdXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5FZGl0b3IoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgcHJvaiA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoInRlc3RPcGVuRWRpdG9yIik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IDEuIFRoZSB3b3JrYmVuY2ggZWRpdG9yIHJlZ2lzdHJ5IGlzIGNvbnN1bHRlZCB0byBkZXRlcm1pbmUgaWYgYW4gZWRpdG9yIGV4dGVuc2lvbiBoYXMgYmVlbgotICAgICAgICAgcmVnaXN0ZXJlZCBmb3IgdGhlIGZpbGUgdHlwZS4gSWYgc28sIGFuIGluc3RhbmNlIG9mIHRoZSBlZGl0b3IgZXh0ZW5zaW9uIGlzIG9wZW5lZCBvbiB0aGUgZmlsZQotICAgICAgICAgKi8KLSAgICAgICAgSUZpbGUgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoInRlc3QubW9jazEiLCBwcm9qKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIGZpbGUpOwotCi0gICAgICAgIGJvb2xlYW4gZm91bmRFZGl0b3IgPSBoYXNFZGl0b3IoZWRpdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kRWRpdG9yLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpLCBlZGl0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldFNpdGUoKS5nZXRJZCgpLCBmV29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEVkaXRvcihmaWxlLmdldE5hbWUoKSkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IDIuIE5leHQsIHRoZSBuYXRpdmUgb3BlcmF0aW5nIHN5c3RlbSB3aWxsIGJlIGNvbnN1bHRlZCB0byBkZXRlcm1pbmUgaWYgYSBuYXRpdmUgZWRpdG9yIGV4aXN0cyBmb3IgCi0gICAgICAgICB0aGUgZmlsZSB0eXBlLiBJZiBzbywgYSBuZXcgcHJvY2VzcyBpcyBzdGFydGVkIGFuZCB0aGUgbmF0aXZlIGVkaXRvciBpcyBvcGVuZWQgb24gdGhlIGZpbGUuCi0gICAgICAgICAqLwotICAgICAgICAvL2NhbiBub3QgYmUgdGVzdGVkCi0gICAgICAgIC8qCi0JCSAqIGphdmFkb2M6IDMuIElmIGFsbCBlbHNlIGZhaWxzIHRoZSBmaWxlIHdpbGwgYmUgb3BlbmVkIGluIGEgZGVmYXVsdAotCQkgKiB0ZXh0IGVkaXRvci4KLQkJICovCi0KLQkJZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoImEubnVsbCBhbmQgdm9pZCIsIHByb2opOwotCQllZGl0b3IgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgZmlsZSk7Ci0JCWFzc2VydEVxdWFscyhoYXNFZGl0b3IoZWRpdG9yKSwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSwgZWRpdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKGVkaXRvci5nZXRTaXRlKCkuZ2V0SWQoKSwKLQkJCQkib3JnLmVjbGlwc2UudWkuRGVmYXVsdFRleHRFZGl0b3IiKTsKLQotICAgICAgICAvLyBvcGVuIGFub3RoZXIgZWRpdG9yIHRvIHRha2UgdGhlIGZvY3VzIGF3YXkgZnJvbSB0aGUgZmlyc3QgZWRpdG9yCi0gICAgICAgIElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBGaWxlVXRpbC5jcmVhdGVGaWxlKCJ0ZXN0Lm1vY2syIiwgcHJvaikpOwotCi0gICAgICAgIC8qICAKLSAgICAgICAgIGphdmFkb2M6IElmIHRoaXMgcGFnZSBhbHJlYWR5IGhhcyBhbiBlZGl0b3Igb3BlbiBvbiB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IGVkaXRvciBpcyBhY3RpdmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIC8vb3BlbiB0aGUgZWRpdG9yIHNlY29uZCB0aW1lLiAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLCBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgZmlsZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLCBmQWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogb3BlbkVkaXRvcihJV29ya2JlbmNoUGFnZSBwYWdlLCBJRmlsZSBpbnB1dCwgU3RyaW5nIGVkaXRvcklEKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuRWRpdG9yMigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgZmluYWwgSUZpbGUgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoImFzZmFzZGFzZGYiLCBwcm9qKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gTW9ja0VkaXRvclBhcnQuSUQxOwotCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZhZG9jOiBUaGUgZWRpdG9yIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSBtYXBwaW5nIGVkaXRvcklkIHRvIGFuIGVkaXRvciBleHRlbnNpb24gcmVnaXN0ZXJlZCB3aXRoIHRoZSB3b3JrYmVuY2guCi0gICAgICAgICAqLwotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgZmlsZSwgaWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldFNpdGUoKS5nZXRJZCgpLCBpZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhoYXNFZGl0b3IoZWRpdG9yKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSwgZWRpdG9yKTsKLQotICAgICAgICAvL29wZW4gYW5vdGhlciBlZGl0b3IgdG8gdGFrZSB0aGUgZm9jdXMgYXdheSBmcm9tIHRoZSBmaXJzdCBlZGl0b3IKLSAgICAgICAgSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIEZpbGVVdGlsLmNyZWF0ZUZpbGUoInRlc3QubW9jazIiLCBwcm9qKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IElmIHRoaXMgcGFnZSBhbHJlYWR5IGhhcyBhbiBlZGl0b3Igb3BlbiBvbiB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IGVkaXRvciBpcyBhY3RpdmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIC8vb3BlbiB0aGUgZmlyc3QgZWRpdG9yIHNlY29uZCB0aW1lLgotICAgICAgICBhc3NlcnRFcXVhbHMoSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIGZpbGUsIGlkKSwgZWRpdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpLCBlZGl0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG9wZW5FZGl0b3IoSUVkaXRvcklucHV0IGlucHV0LFN0cmluZyBlZGl0b3JJZCkgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuRWRpdG9yMygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gTW9ja0VkaXRvclBhcnQuSUQxOwotICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KEZpbGVVdGlsLmNyZWF0ZUZpbGUoCi0gICAgICAgICAgICAgICAgInRlc3QubW9jazEiLCBwcm9qKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IFRoZSBlZGl0b3IgdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IG1hcHBpbmcgZWRpdG9ySWQgdG8gYW4gZWRpdG9yIGV4dGVuc2lvbiByZWdpc3RlcmVkIHdpdGggdGhlIHdvcmtiZW5jaAotICAgICAgICAgKi8KLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIGlucHV0LCBpZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSwgaW5wdXQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldFNpdGUoKS5nZXRJZCgpLCBpZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhoYXNFZGl0b3IoZWRpdG9yKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSwgZWRpdG9yKTsKLQotICAgICAgICAvL29wZW4gYW5vdGhlciBlZGl0b3IgdG8gdGFrZSB0aGUgZm9jdXMgYXdheSBmcm9tIHRoZSBmaXJzdCBlZGl0b3IKLSAgICAgICAgSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIEZpbGVVdGlsLmNyZWF0ZUZpbGUoInRlc3QubW9jazIiLCBwcm9qKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IElmIHRoaXMgcGFnZSBhbHJlYWR5IGhhcyBhbiBlZGl0b3Igb3BlbiBvbiB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IGVkaXRvciBpcyBhY3RpdmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIC8vb3BlbiB0aGUgZmlyc3QgZWRpdG9yIHNlY29uZCB0aW1lLgotICAgICAgICBhc3NlcnRFcXVhbHMoSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIGlucHV0LCBpZCksIGVkaXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSwgZWRpdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBvcGVuRWRpdG9yKElNYXJrZXIgbWFya2VyKSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5FZGl0b3I1KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJ0ZXN0T3BlbkVkaXRvciIpOwotICAgICAgICBJTWFya2VyIG1hcmtlciA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoImFhLm1vY2syIiwgcHJvaikuY3JlYXRlTWFya2VyKAotICAgICAgICAgICAgICAgIElNYXJrZXIuVEFTSyk7Ci0gICAgICAgIENhbGxIaXN0b3J5IGNhbGxUcmFjZTsKLQotICAgICAgICAvKiAgCi0gICAgICAgICBqYXZhZG9jOiB0aGUgY3Vyc29yIGFuZCBzZWxlY3Rpb24gc3RhdGUgb2YgdGhlIGVkaXRvciBpcyB0aGVuIHVwZGF0ZWQgZnJvbSBpbmZvcm1hdGlvbiAKLSAgICAgICAgIHJlY29yZGVkIGluIHRoZSBtYXJrZXIuIAotICAgICAgICAgKi8KLSAgICAgICAgLy9vcGVuIHRoZSByZWdpc3RlcmVkIGVkaXRvciBmb3IgdGhlIG1hcmtlciByZXNvdXJjZSAKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIG1hcmtlcik7Ci0gICAgICAgIGNhbGxUcmFjZSA9ICgoTW9ja0VkaXRvclBhcnQpIGVkaXRvcikuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvci5nZXRTaXRlKCkuZ2V0SWQoKSwgTW9ja0VkaXRvclBhcnQuSUQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGhhc0VkaXRvcihlZGl0b3IpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpLCBlZGl0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJnb3RvTWFya2VyIiksIHRydWUpOwotICAgICAgICBmQWN0aXZlUGFnZS5jbG9zZUVkaXRvcihlZGl0b3IsIGZhbHNlKTsKLQotICAgICAgICAvKiAgCi0gICAgICAgICBqYXZhZG9jOiBJZiB0aGUgbWFya2VyIGNvbnRhaW5zIGFuIEVESVRPUl9JRF9BVFRSIGF0dHJpYnV0ZSB0aGUgYXR0cmlidXRlIHZhbHVlIHdpbGwgYmUgdXNlZCB0byAKLSAgICAgICAgIGRldGVybWluZSB0aGUgZWRpdG9yIHR5cGUgdG8gYmUgb3BlbmVkCi0gICAgICAgICAqLwotICAgICAgICBtYXJrZXIuc2V0QXR0cmlidXRlKElERS5FRElUT1JfSURfQVRUUiwgTW9ja0VkaXRvclBhcnQuSUQxKTsKLSAgICAgICAgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIG1hcmtlcik7Ci0gICAgICAgIGNhbGxUcmFjZSA9ICgoTW9ja0VkaXRvclBhcnQpIGVkaXRvcikuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvci5nZXRTaXRlKCkuZ2V0SWQoKSwgTW9ja0VkaXRvclBhcnQuSUQxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGhhc0VkaXRvcihlZGl0b3IpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpLCBlZGl0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJnb3RvTWFya2VyIiksIHRydWUpOwotICAgICAgICAvL2RvIG5vdCBjbG9zZSB0aGUgZWRpdG9yIHRoaXMgdGltZQotCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZkb2M6IElmIHRoaXMgcGFnZSBhbHJlYWR5IGhhcyBhbiBlZGl0b3Igb3BlbiBvbiB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IGVkaXRvciBpcyBhY3RpdmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIGNhbGxUcmFjZS5jbGVhcigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIG1hcmtlciksIGVkaXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSwgZWRpdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygiZ290b01hcmtlciIpLCB0cnVlKTsKLSAgICAgICAgZkFjdGl2ZVBhZ2UuY2xvc2VFZGl0b3IoZWRpdG9yLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIG9wZW5FZGl0b3IoSU1hcmtlciBtYXJrZXIsIGJvb2xlYW4gYWN0aXZhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuRWRpdG9yNigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBGaWxlVXRpbC5jcmVhdGVGaWxlKCJhYS5tb2NrMiIsIHByb2opLmNyZWF0ZU1hcmtlcigKLSAgICAgICAgICAgICAgICBJTWFya2VyLlRBU0spOwotICAgICAgICBNb2NrUGFydExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vY2tQYXJ0TGlzdGVuZXIoKTsKLSAgICAgICAgZkFjdGl2ZVBhZ2UuYWRkUGFydExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgQ2FsbEhpc3RvcnkgbGlzdGVuZXJDYWxsID0gbGlzdGVuZXIuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgQ2FsbEhpc3RvcnkgZWRpdG9yQ2FsbDsKLQotICAgICAgICAvL3dlIG5lZWQgYW5vdGhlciBlZGl0b3Igc28gdGhhdCB0aGUgZWRpdG9yIHVuZGVyIHRlc3QgY2FuIHJlY2VpdmUgZXZlbnRzLgotICAgICAgICAvL290aGVyd2lzZSwgZXZlbnRzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgSUVkaXRvclBhcnQgZXh0cmEgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgRmlsZVV0aWwuY3JlYXRlRmlsZSgKLSAgICAgICAgICAgICAgICAiYWFhYWEiLCBwcm9qKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IElmIGFjdGl2YXRlID09IHRydWUgdGhlIGVkaXRvciB3aWxsIGJlIGFjdGl2YXRlZAotICAgICAgICAgKi8KLSAgICAgICAgLy9vcGVuIHRoZSByZWdpc3RlcmVkIGVkaXRvciBmb3IgdGhlIG1hcmtlciByZXNvdXJjZSB3aXRoIGFjdGl2YXRpb24KLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIG1hcmtlciwgdHJ1ZSk7Ci0gICAgICAgIGVkaXRvckNhbGwgPSAoKE1vY2tFZGl0b3JQYXJ0KSBlZGl0b3IpLmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3IuZ2V0U2l0ZSgpLmdldElkKCksIE1vY2tFZGl0b3JQYXJ0LklEMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhoYXNFZGl0b3IoZWRpdG9yKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSwgZWRpdG9yKTsKLQotICAgICAgICAvKiAgCi0gICAgICAgICBqYXZhZG9jOiB0aGUgY3Vyc29yIGFuZCBzZWxlY3Rpb24gc3RhdGUgb2YgdGhlIGVkaXRvciBpcyB0aGVuIHVwZGF0ZWQgZnJvbSBpbmZvcm1hdGlvbiAKLSAgICAgICAgIHJlY29yZGVkIGluIHRoZSBtYXJrZXIuIAotICAgICAgICAgKi8KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvckNhbGwuY29udGFpbnMoImdvdG9NYXJrZXIiKSwgdHJ1ZSk7Ci0gICAgICAgIGZBY3RpdmVQYWdlLmNsb3NlRWRpdG9yKGVkaXRvciwgZmFsc2UpOwotCi0gICAgICAgIGZBY3RpdmVQYWdlLmFjdGl2YXRlKGV4dHJhKTsKLQotICAgICAgICAvL29wZW4gdGhlIHJlZ2lzdGVyZWQgZWRpdG9yIGZvciB0aGUgbWFya2VyIHJlc291cmNlIHdpdGhvdXQgYWN0aXZhdGlvbgotICAgICAgICBmQWN0aXZlUGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcsIG51bGwsIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUpOwotICAgICAgICBsaXN0ZW5lckNhbGwuY2xlYXIoKTsKLSAgICAgICAgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIG1hcmtlciwgZmFsc2UpOwotICAgICAgICBlZGl0b3JDYWxsID0gKChNb2NrRWRpdG9yUGFydCkgZWRpdG9yKS5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yLmdldFNpdGUoKS5nZXRJZCgpLCBNb2NrRWRpdG9yUGFydC5JRDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaGFzRWRpdG9yKGVkaXRvciksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdGVuZXJDYWxsLmNvbnRhaW5zKCJwYXJ0QnJvdWdodFRvVG9wIiksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdGVuZXJDYWxsLmNvbnRhaW5zKCJwYXJ0QWN0aXZhdGVkIiksIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvckNhbGwuY29udGFpbnMoImdvdG9NYXJrZXIiKSwgdHJ1ZSk7Ci0gICAgICAgIGZBY3RpdmVQYWdlLmNsb3NlRWRpdG9yKGVkaXRvciwgZmFsc2UpOwotCi0gICAgICAgIC8qICAKLSAgICAgICAgIGphdmFkb2M6IElmIHRoZSBtYXJrZXIgY29udGFpbnMgYW4gRURJVE9SX0lEX0FUVFIgYXR0cmlidXRlIHRoZSBhdHRyaWJ1dGUgdmFsdWUgd2lsbCBiZSB1c2VkIHRvIAotICAgICAgICAgZGV0ZXJtaW5lIHRoZSBlZGl0b3IgdHlwZSB0byBiZSBvcGVuZWQKLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBpZCA9IE1vY2tFZGl0b3JQYXJ0LklEMTsKLSAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZShJREUuRURJVE9SX0lEX0FUVFIsIGlkKTsKLQotICAgICAgICAvL29wZW4gYW4gZWRpdG9yIHdpdGggYWN0aXZhdGlvbgotICAgICAgICBsaXN0ZW5lckNhbGwuY2xlYXIoKTsKLQotICAgICAgICBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgbWFya2VyLCB0cnVlKTsKLSAgICAgICAgZWRpdG9yQ2FsbCA9ICgoTW9ja0VkaXRvclBhcnQpIGVkaXRvcikuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvci5nZXRTaXRlKCkuZ2V0SWQoKSwgaWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaGFzRWRpdG9yKGVkaXRvciksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCksIGVkaXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlZGl0b3JDYWxsLmNvbnRhaW5zKCJnb3RvTWFya2VyIiksIHRydWUpOwotICAgICAgICBmQWN0aXZlUGFnZS5jbG9zZUVkaXRvcihlZGl0b3IsIGZhbHNlKTsKLQotICAgICAgICBmQWN0aXZlUGFnZS5hY3RpdmF0ZShleHRyYSk7Ci0KLSAgICAgICAgLy9vcGVuIGFuIGVkaXRvciB3aXRob3V0IGFjdGl2YXRpb24KLSAgICAgICAgZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFKTsKLSAgICAgICAgbGlzdGVuZXJDYWxsLmNsZWFyKCk7Ci0gICAgICAgIGVkaXRvciA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBtYXJrZXIsIGZhbHNlKTsKLSAgICAgICAgZWRpdG9yQ2FsbCA9ICgoTW9ja0VkaXRvclBhcnQpIGVkaXRvcikuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvci5nZXRTaXRlKCkuZ2V0SWQoKSwgaWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaGFzRWRpdG9yKGVkaXRvciksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yQ2FsbC5jb250YWlucygiZ290b01hcmtlciIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2FsbC5jb250YWlucygicGFydEFjdGl2YXRlZCIpLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0ZW5lckNhbGwuY29udGFpbnMoInBhcnRCcm91Z2h0VG9Ub3AiKSwgdHJ1ZSk7Ci0gICAgICAgIC8vZG8gbm90IGNsb3NlIHRoZSBlZGl0b3IgdGhpcyB0aW1lCi0KLSAgICAgICAgZkFjdGl2ZVBhZ2UuYWN0aXZhdGUoZXh0cmEpOwotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogSWYgdGhpcyBwYWdlIGFscmVhZHkgaGFzIGFuIGVkaXRvciBvcGVuIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgZWRpdG9yIGlzIGJyb3VnaHQgdG8gZnJvbnQKLSAgICAgICAgIE5vdGU6IHdlIG5lZWQgdG8gbWFrZSBhIG5vbi1lZGl0b3IgYWN0aXZlIGZpcnN0IG9yIGJyaW5naW5nIHRoZSBlZGl0b3IgdG8gZnJvbnQgd291bGQgYWN0aXZhdGUgaXQKLSAgICAgICAgICovCi0gICAgICAgIC8vb3BlbiB0aGUgZWRpdG9yIHNlY29uZCB0aW1lIHdpdGhvdXQgYWN0aXZhdGlvbgotICAgICAgICBmQWN0aXZlUGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcsIG51bGwsIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUpOwotICAgICAgICBsaXN0ZW5lckNhbGwuY2xlYXIoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBtYXJrZXIsIGZhbHNlKSwgZWRpdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2FsbC5jb250YWlucygicGFydEJyb3VnaHRUb1RvcCIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2FsbC5jb250YWlucygicGFydEFjdGl2YXRlZCIpLCBmYWxzZSk7Ci0KLSAgICAgICAgZkFjdGl2ZVBhZ2UuYWN0aXZhdGUoZXh0cmEpOwotCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZkb2M6IElmIGFjdGl2YXRlID09IHRydWUgdGhlIGVkaXRvciB3aWxsIGJlIGFjdGl2YXRlZAotICAgICAgICAgKi8KLSAgICAgICAgLy9vcGVuIHRoZSBlZGl0b3Igc2Vjb25kIHRpbWUgd2l0aCBhY3RpdmF0aW9uICAgICAgIAotICAgICAgICBsaXN0ZW5lckNhbGwuY2xlYXIoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBtYXJrZXIsIHRydWUpLCBlZGl0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWRpdG9yQ2FsbC5jb250YWlucygiZ290b01hcmtlciIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2FsbC5jb250YWlucygicGFydEJyb3VnaHRUb1RvcCIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2FsbC5jb250YWlucygicGFydEFjdGl2YXRlZCIpLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgIGphdmFkb2M6IElmIGFjdGl2YXRlID09IGZhbHNlIGJ1dCBhbm90aGVyIGVkaXRvciBpbiB0aGUgc2FtZSBzdGFjayB3YXMgYWN0aXZlLCB0aGUgCi0gICAgICAgIG5ldyBlZGl0b3Igd2lsbCBiZSBhY3RpdmF0ZWQgcmVnYXJkbGVzcy4KLSAgICAgICAgKi8KLSAgICAgICAgLy8gQ2xvc2UgdGhlIG9sZCBlZGl0b3IKLSAgICAgICAgZkFjdGl2ZVBhZ2UuY2xvc2VFZGl0b3IoZWRpdG9yLCBmYWxzZSk7Ci0gICAgICAgIC8vIEVuc3VyZSBhbm90aGVyIGVkaXRvciBpbiB0aGUgc3RhY2sgaXMgYWN0aXZlCi0gICAgICAgIGZBY3RpdmVQYWdlLmFjdGl2YXRlKGV4dHJhKTsKLSAgICAgICAgbGlzdGVuZXJDYWxsLmNsZWFyKCk7Ci0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBlZGl0b3IgaXMgc3RpbGwgYWN0aXZhdGVkCi0gICAgICAgIElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBtYXJrZXIsIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2FsbC5jb250YWlucygicGFydEJyb3VnaHRUb1RvcCIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2FsbC5jb250YWlucygicGFydEFjdGl2YXRlZCIpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGVyc3BlY3RpdmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmQWN0aXZlUGFnZS5nZXRQZXJzcGVjdGl2ZSgpKTsKLQotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZldpbi5vcGVuUGFnZShFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lELCBnZXRQYWdlSW5wdXQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lELCBwYWdlLmdldFBlcnNwZWN0aXZlKCkuZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFBlcnNwZWN0aXZlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgIC5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCkuZmluZFBlcnNwZWN0aXZlV2l0aElkKAotICAgICAgICAgICAgICAgICAgICAgICAgRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCk7Ci0gICAgICAgIGZBY3RpdmVQYWdlLnNldFBlcnNwZWN0aXZlKHBlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwZXIsIGZBY3RpdmVQYWdlLmdldFBlcnNwZWN0aXZlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMYWJlbCgpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmQWN0aXZlUGFnZS5nZXRMYWJlbCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5wdXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSUFkYXB0YWJsZSBpbnB1dCA9IGdldFBhZ2VJbnB1dCgpOwotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZldpbi5vcGVuUGFnZShpbnB1dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnB1dCwgcGFnZS5nZXRJbnB1dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgTW9ja1ZpZXdQYXJ0IHBhcnQgPSAoTW9ja1ZpZXdQYXJ0KSBmQWN0aXZlUGFnZQotICAgICAgICAgICAgICAgIC5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQpOwotICAgICAgICBNb2NrVmlld1BhcnQgcGFydDIgPSAoTW9ja1ZpZXdQYXJ0KSBmQWN0aXZlUGFnZQotICAgICAgICAgICAgICAgIC5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQyKTsKLQotICAgICAgICBNb2NrUGFydExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vY2tQYXJ0TGlzdGVuZXIoKTsKLSAgICAgICAgZkFjdGl2ZVBhZ2UuYWRkUGFydExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgZkFjdGl2ZVBhZ2UuYWN0aXZhdGUocGFydCk7Ci0KLSAgICAgICAgQ2FsbEhpc3RvcnkgY2FsbFRyYWNlOwotCi0gICAgICAgIGNhbGxUcmFjZSA9IHBhcnQyLmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIGNhbGxUcmFjZS5jbGVhcigpOwotICAgICAgICBmQWN0aXZlUGFnZS5hY3RpdmF0ZShwYXJ0Mik7Ci0gICAgICAgIGFzc2VydFRydWUoY2FsbFRyYWNlLmNvbnRhaW5zKCJzZXRGb2N1cyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5nZXRDYWxsSGlzdG9yeSgpLmNvbnRhaW5zKCJwYXJ0QWN0aXZhdGVkIikpOwotCi0gICAgICAgIGNhbGxUcmFjZSA9IHBhcnQuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgIGZBY3RpdmVQYWdlLmFjdGl2YXRlKHBhcnQpOwotICAgICAgICBhc3NlcnRUcnVlKGNhbGxUcmFjZS5jb250YWlucygic2V0Rm9jdXMiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXIuZ2V0Q2FsbEhpc3RvcnkoKS5jb250YWlucygicGFydEFjdGl2YXRlZCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnJpbmdUb1RvcCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgSUVkaXRvclBhcnQgcGFydCA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBGaWxlVXRpbC5jcmVhdGVGaWxlKAotICAgICAgICAgICAgICAgICJhLm1vY2sxIiwgcHJvaikpOwotICAgICAgICBJRWRpdG9yUGFydCBwYXJ0MiA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBGaWxlVXRpbC5jcmVhdGVGaWxlKAotICAgICAgICAgICAgICAgICJiLm1vY2sxIiwgcHJvaikpOwotCi0gICAgICAgIE1vY2tQYXJ0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTW9ja1BhcnRMaXN0ZW5lcigpOwotICAgICAgICBmQWN0aXZlUGFnZS5hZGRQYXJ0TGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBDYWxsSGlzdG9yeSBjYWxsVHJhY2UgPSBsaXN0ZW5lci5nZXRDYWxsSGlzdG9yeSgpOwotCi0gICAgICAgIC8vYXQgdGhpcyBwb2ludCwgcGFydDIgaXMgYWN0aXZlCi0gICAgICAgIGZBY3RpdmVQYWdlLmJyaW5nVG9Ub3AocGFydCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UuY29udGFpbnMoInBhcnRCcm91Z2h0VG9Ub3AiKSwgdHJ1ZSk7Ci0KLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgIGZBY3RpdmVQYWdlLmJyaW5nVG9Ub3AocGFydDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJwYXJ0QnJvdWdodFRvVG9wIiksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXb3JrYmVuY2hXaW5kb3coKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbW1lbnRlZCBvdXQgYmVjYXVzZSB1bnRpbCB0ZXN0IGNhc2UgY2FuIGJlIHVwZGF0ZWQgdG8gd29yawotICAgICAgICAgKiB3aXRoIG5ldyB3aW5kb3cvcGFnZS9wZXJzcGVjdGl2ZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgKiAKLSAgICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKSwgZldpbik7Ci0gICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gb3BlblRlc3RQYWdlKGZXaW4pOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCksIGZXaW4pOwotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvd1ZpZXcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IFNob3dzIGEgdmlldyBpbiB0aGlzIHBhZ2UgYW5kIGdpdmUgaXQgZm9jdXMKLSAgICAgICAgICovCi0gICAgICAgIE1vY2tWaWV3UGFydCB2aWV3ID0gKE1vY2tWaWV3UGFydCkgZkFjdGl2ZVBhZ2UKLSAgICAgICAgICAgICAgICAuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2aWV3KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2aWV3LmdldENhbGxIaXN0b3J5KCkudmVyaWZ5T3JkZXIoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgImluaXQiLCAiY3JlYXRlUGFydENvbnRyb2wiLCAic2V0Rm9jdXMiIH0pKTsKLQotICAgICAgICBmQWN0aXZlUGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQyKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogSWYgdGhlIHZpZXcgaXMgYWxyZWFkeSB2aXNpYmxlLCBpdCBpcyBnaXZlbiBmb2N1cwotICAgICAgICAgKi8KLSAgICAgICAgQ2FsbEhpc3RvcnkgY2FsbFRyYWNlID0gdmlldy5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRCksIHZpZXcpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJzZXRGb2N1cyIpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBzaG93aW5nIG11bHRpLWluc3RhbmNlIHZpZXdzIChkb2NrZWQgbm9ybWFsbHkpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93Vmlld011bHQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IFNob3dzIHRoZSB2aWV3IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHZpZXcgaWQgYW5kIHNlY29uZGFyeSBpZCAKLSAgICAgICAgIGluIHRoaXMgcGFnZSBhbmQgZ2l2ZXMgaXQgZm9jdXMuIAotICAgICAgICAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGEgcGFydGljdWxhciB2aWV3IHRvIGJlIGNyZWF0ZWQuICAKLSAgICAgICAgIFRoZXkgYXJlIGRpc2FtYmlndWF0ZWQgdXNpbmcgdGhlIHNlY29uZGFyeSBpZC4KLSAgICAgICAgICovCi0gICAgICAgIE1vY2tWaWV3UGFydCB2aWV3ID0gKE1vY2tWaWV3UGFydCkgZkFjdGl2ZVBhZ2UKLSAgICAgICAgICAgICAgICAuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklETVVMVCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodmlldyk7Ci0gICAgICAgIGFzc2VydFRydWUodmlldy5nZXRDYWxsSGlzdG9yeSgpLnZlcmlmeU9yZGVyKAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJpbml0IiwgImNyZWF0ZVBhcnRDb250cm9sIiwgInNldEZvY3VzIiB9KSk7Ci0gICAgICAgIE1vY2tWaWV3UGFydCB2aWV3MiA9IChNb2NrVmlld1BhcnQpIGZBY3RpdmVQYWdlLnNob3dWaWV3KAotICAgICAgICAgICAgICAgIE1vY2tWaWV3UGFydC5JRE1VTFQsICIyIiwgSVdvcmtiZW5jaFBhZ2UuVklFV19BQ1RJVkFURSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodmlldzIpOwotICAgICAgICBhc3NlcnRUcnVlKHZpZXcyLmdldENhbGxIaXN0b3J5KCkudmVyaWZ5T3JkZXIoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgImluaXQiLCAiY3JlYXRlUGFydENvbnRyb2wiLCAic2V0Rm9jdXMiIH0pKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghdmlldy5lcXVhbHModmlldzIpKTsKLSAgICAgICAgTW9ja1ZpZXdQYXJ0IHZpZXczID0gKE1vY2tWaWV3UGFydCkgZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoCi0gICAgICAgICAgICAgICAgTW9ja1ZpZXdQYXJ0LklETVVMVCwgIjMiLCBJV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2aWV3Myk7Ci0gICAgICAgIGFzc2VydFRydWUodmlldzMuZ2V0Q2FsbEhpc3RvcnkoKS52ZXJpZnlPcmRlcigKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAiaW5pdCIsICJjcmVhdGVQYXJ0Q29udHJvbCIsICJzZXRGb2N1cyIgfSkpOwotICAgICAgICBhc3NlcnRUcnVlKCF2aWV3LmVxdWFscyh2aWV3MykpOwotICAgICAgICBhc3NlcnRUcnVlKCF2aWV3Mi5lcXVhbHModmlldzMpKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogSWYgdGhlcmUgaXMgYSB2aWV3IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHZpZXcgaWQgYW5kIAotICAgICAgICAgc2Vjb25kYXJ5IGlkIGFscmVhZHkgb3BlbiBpbiB0aGlzIHBhZ2UsIGl0IGlzIGdpdmVuIGZvY3VzLgotICAgICAgICAgKi8KLSAgICAgICAgQ2FsbEhpc3RvcnkgY2FsbFRyYWNlID0gdmlldy5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRE1VTFQpLCB2aWV3KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygic2V0Rm9jdXMiKSwgdHJ1ZSk7Ci0gICAgICAgIENhbGxIaXN0b3J5IGNhbGxUcmFjZTIgPSB2aWV3Mi5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLSAgICAgICAgY2FsbFRyYWNlMi5jbGVhcigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklETVVMVCwgIjIiLAotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUpLCB2aWV3Mik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UyLmNvbnRhaW5zKCJzZXRGb2N1cyIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygic2V0Rm9jdXMiKSwgZmFsc2UpOwotICAgICAgICBDYWxsSGlzdG9yeSBjYWxsVHJhY2UzID0gdmlldzMuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgY2FsbFRyYWNlLmNsZWFyKCk7Ci0gICAgICAgIGNhbGxUcmFjZTIuY2xlYXIoKTsKLSAgICAgICAgY2FsbFRyYWNlMy5jbGVhcigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklETVVMVCwgIjMiLAotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUpLCB2aWV3Myk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UzLmNvbnRhaW5zKCJzZXRGb2N1cyIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygic2V0Rm9jdXMiKSwgZmFsc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlMi5jb250YWlucygic2V0Rm9jdXMiKSwgZmFsc2UpOwotCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZhZG9jOiBJZiBhIHNlY29uZGFyeSBpZCBpcyBnaXZlbiwgdGhlIHZpZXcgbXVzdCBhbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMgYnkKLSAgICAgICAgIGhhdmluZyBzcGVjaWZpZWQgYWxsb3dNdWx0aXBsZT0idHJ1ZSIgaW4gaXRzIGV4dGVuc2lvbi4KLSAgICAgICAgICovCi0gICAgICAgIGJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmQWN0aXZlUGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQsICIyIiwKLSAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UuVklFV19BQ1RJVkFURSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJtdWx0IikgIT0gLTEsIHRydWUpOwotICAgICAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoZXhjZXB0aW9uVGhyb3duLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBzaG93aW5nIG11bHRpLWluc3RhbmNlIHZpZXdzIChhcyBmYXN0IHZpZXdzKS4KLSAgICAgKiBUaGlzIGlzIGEgcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNzY2NjkgLSBbUGVyc3BlY3RpdmVzXSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBQZXJzcGVjdGl2ZS5nZXRGYXN0Vmlld1dpZHRoUmF0aW8oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93Vmlld011bHRGYXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8qCi0gICAgICAgICBqYXZhZG9jOiBTaG93cyB0aGUgdmlldyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiB2aWV3IGlkIGFuZCBzZWNvbmRhcnkgaWQgCi0gICAgICAgICBpbiB0aGlzIHBhZ2UgYW5kIGdpdmVzIGl0IGZvY3VzLiAKLSAgICAgICAgIFRoaXMgYWxsb3dzIG11bHRpcGxlIGluc3RhbmNlcyBvZiBhIHBhcnRpY3VsYXIgdmlldyB0byBiZSBjcmVhdGVkLiAgCi0gICAgICAgICBUaGV5IGFyZSBkaXNhbWJpZ3VhdGVkIHVzaW5nIHRoZSBzZWNvbmRhcnkgaWQuCi0gICAgICAgICAqLwotICAgICAgICBNb2NrVmlld1BhcnQgdmlldyA9IChNb2NrVmlld1BhcnQpIGZBY3RpdmVQYWdlCi0gICAgICAgICAgICAgICAgLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRE1VTFQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHZpZXcpOwotICAgICAgICBhc3NlcnRUcnVlKHZpZXcuZ2V0Q2FsbEhpc3RvcnkoKS52ZXJpZnlPcmRlcigKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAiaW5pdCIsICJjcmVhdGVQYXJ0Q29udHJvbCIsICJzZXRGb2N1cyIgfSkpOwotICAgICAgICBNb2NrVmlld1BhcnQgdmlldzIgPSAoTW9ja1ZpZXdQYXJ0KSBmQWN0aXZlUGFnZS5zaG93VmlldygKLSAgICAgICAgICAgICAgICBNb2NrVmlld1BhcnQuSURNVUxULCAiMiIsIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHZpZXcyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2aWV3Mi5nZXRDYWxsSGlzdG9yeSgpLnZlcmlmeU9yZGVyKAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJpbml0IiwgImNyZWF0ZVBhcnRDb250cm9sIiwgInNldEZvY3VzIiB9KSk7Ci0gICAgICAgIGFzc2VydFRydWUoIXZpZXcuZXF1YWxzKHZpZXcyKSk7Ci0gICAgICAgIAotICAgICAgICBXb3JrYmVuY2hQYWdlIHBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgZkFjdGl2ZVBhZ2U7Ci0gICAgICAgIElWaWV3UmVmZXJlbmNlIHJlZiA9IChJVmlld1JlZmVyZW5jZSkgcGFnZS5nZXRSZWZlcmVuY2Uodmlldyk7Ci0gICAgICAgIElWaWV3UmVmZXJlbmNlIHJlZjIgPSAoSVZpZXdSZWZlcmVuY2UpIHBhZ2UuZ2V0UmVmZXJlbmNlKHZpZXcyKTsKLSAgICAgICAgcGFnZS5hZGRGYXN0VmlldyhyZWYpOwotICAgICAgICBwYWdlLmFkZEZhc3RWaWV3KHJlZjIpOwotCi0gICAgICAgIHBhZ2UuYWN0aXZhdGUodmlldyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh2aWV3LCBwYWdlLmdldEFjdGl2ZVBhcnQoKSk7Ci0KLSAgICAgICAgcGFnZS5hY3RpdmF0ZSh2aWV3Mik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh2aWV3MiwgcGFnZS5nZXRBY3RpdmVQYXJ0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHNhdmluZyB0aGUgcGFnZSBzdGF0ZSB3aGVuIHRoZXJlIGlzIGEgZmFzdCB2aWV3IHRoYXQgaXMgYWxzbyBhIG11bHRpLWluc3RhbmNlIHZpZXcuCi0gICAgICogVGhpcyBpcyBhIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDc2NjY5IC0gW1BlcnNwZWN0aXZlc10gTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gUGVyc3BlY3RpdmUuZ2V0RmFzdFZpZXdXaWR0aFJhdGlvKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnVnNzY2NjkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgTW9ja1ZpZXdQYXJ0IHZpZXcgPSAoTW9ja1ZpZXdQYXJ0KSBmQWN0aXZlUGFnZQotICAgICAgICAgICAgICAgIC5zaG93VmlldyhNb2NrVmlld1BhcnQuSURNVUxUKTsKLSAgICAgICAgTW9ja1ZpZXdQYXJ0IHZpZXcyID0gKE1vY2tWaWV3UGFydCkgZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoCi0gICAgICAgICAgICAgICAgTW9ja1ZpZXdQYXJ0LklETVVMVCwgIjIiLCBJV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFKTsKLSAgICAgICAgCi0gICAgICAgIFdvcmtiZW5jaFBhZ2UgcGFnZSA9IChXb3JrYmVuY2hQYWdlKSBmQWN0aXZlUGFnZTsKLSAgICAgICAgSVZpZXdSZWZlcmVuY2UgcmVmID0gKElWaWV3UmVmZXJlbmNlKSBwYWdlLmdldFJlZmVyZW5jZSh2aWV3KTsKLSAgICAgICAgSVZpZXdSZWZlcmVuY2UgcmVmMiA9IChJVmlld1JlZmVyZW5jZSkgcGFnZS5nZXRSZWZlcmVuY2UodmlldzIpOwotICAgICAgICBwYWdlLmFkZEZhc3RWaWV3KHJlZik7Ci0gICAgICAgIHBhZ2UuYWRkRmFzdFZpZXcocmVmMik7Ci0KLSAgICAgICAgSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJwYWdlIik7Ci0gICAgICAgIHBhZ2Uuc2F2ZVN0YXRlKG1lbWVudG8pOwotICAgICAgICBJTWVtZW50byBwZXJzcHMgPSBtZW1lbnRvLmdldENoaWxkKCJwZXJzcGVjdGl2ZXMiKTsKLSAgICAgICAgSU1lbWVudG8gcGVyc3AgPSBwZXJzcHMuZ2V0Q2hpbGRyZW4oInBlcnNwZWN0aXZlIilbMF07Ci0gICAgICAgIElNZW1lbnRvW10gZmFzdFZpZXdzID0gcGVyc3AuZ2V0Q2hpbGQoImZhc3RWaWV3cyIpLmdldENoaWxkcmVuKCJ2aWV3Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBmYXN0Vmlld3MubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZFZpZXcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgU3RyaW5nIGlkID0gTW9ja1ZpZXdQYXJ0LklEMzsKLSAgICAgICAgLy9pZCBvZiB2YWxpZCwgYnV0IG5vdCBvcGVuIHZpZXcKLSAgICAgICAgYXNzZXJ0TnVsbChmQWN0aXZlUGFnZS5maW5kVmlldyhpZCkpOwotCi0gICAgICAgIElWaWV3UGFydCB2aWV3ID0gZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoaWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuZmluZFZpZXcoaWQpLCB2aWV3KTsKLQotICAgICAgICAvL2Nsb3NlIHZpZXcJCQotICAgICAgICBmQWN0aXZlUGFnZS5oaWRlVmlldyh2aWV3KTsKLSAgICAgICAgYXNzZXJ0TnVsbChmQWN0aXZlUGFnZS5maW5kVmlldyhpZCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kVmlld1JlZmVyZW5jZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmQWN0aXZlUGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKS5zaG93UGVyc3BlY3RpdmUoCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBlcnNwZWN0aXZlLklELCBmQWN0aXZlUGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0gICAgICAgIGFzc2VydE51bGwoZkFjdGl2ZVBhZ2UuZmluZFZpZXdSZWZlcmVuY2UoTW9ja1ZpZXdQYXJ0LklENCkpOwotCi0gICAgICAgIGZBY3RpdmVQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRDQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGZBY3RpdmVQYWdlLmZpbmRWaWV3UmVmZXJlbmNlKE1vY2tWaWV3UGFydC5JRDQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Vmlld3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaW50IHRvdGFsQmVmb3JlID0gZkFjdGl2ZVBhZ2UuZ2V0Vmlld1JlZmVyZW5jZXMoKS5sZW5ndGg7Ci0KLSAgICAgICAgSVZpZXdQYXJ0IHZpZXcgPSBmQWN0aXZlUGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGhhc1ZpZXcodmlldyksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuZ2V0Vmlld1JlZmVyZW5jZXMoKS5sZW5ndGgsIHRvdGFsQmVmb3JlICsgMSk7Ci0KLSAgICAgICAgZkFjdGl2ZVBhZ2UuaGlkZVZpZXcodmlldyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhoYXNWaWV3KHZpZXcpLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRWaWV3UmVmZXJlbmNlcygpLmxlbmd0aCwgdG90YWxCZWZvcmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIaWRlVmlld1dpdGhQYXJ0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIHRlc3QgdGhhdCBub3RoaW5nIGJhZCBoYXBwZW5zIHdpdGggYSBudWxsIHBhcmFtZXRlcgotICAgICAgICB0cnkgewotICAgICAgICAgICAgZkFjdGl2ZVBhZ2UuaGlkZVZpZXcoKElWaWV3UGFydCkgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJVmlld1BhcnQgdmlldyA9IGZBY3RpdmVQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRDMpOwotCi0gICAgICAgIGZBY3RpdmVQYWdlLmhpZGVWaWV3KHZpZXcpOwotICAgICAgICBDYWxsSGlzdG9yeSBjYWxsVHJhY2UgPSAoKE1vY2tWaWV3UGFydCkgdmlldykuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjYWxsVHJhY2UuY29udGFpbnMoImRpc3Bvc2UiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhpZGVWaWV3V2l0aFJlZmVyZW5jZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyB0ZXN0IHRoYXQgbm90aGluZyBiYWQgaGFwcGVucyB3aXRoIGEgbnVsbCBwYXJhbWV0ZXIKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZBY3RpdmVQYWdlLmhpZGVWaWV3KChJVmlld1JlZmVyZW5jZSkgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJVmlld1BhcnQgdmlldyA9IGZBY3RpdmVQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRDQpOwotICAgICAgICBJVmlld1JlZmVyZW5jZSByZWYgPSBmQWN0aXZlUGFnZS5maW5kVmlld1JlZmVyZW5jZShNb2NrVmlld1BhcnQuSUQ0KTsKLSAgICAgICAgZkFjdGl2ZVBhZ2UuaGlkZVZpZXcocmVmKTsKLSAgICAgICAgQ2FsbEhpc3RvcnkgY2FsbFRyYWNlID0gKChNb2NrVmlld1BhcnQpIHZpZXcpLmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIGFzc2VydFRydWUoY2FsbFRyYWNlLmNvbnRhaW5zKCJkaXNwb3NlIikpOwotCi0gICAgfQotCi0JcHVibGljIHZvaWQgdGVzdEhpZGVTYXZlYWJsZVZpZXcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJU3RyaW5nIHZpZXdJZCA9IFNhdmVhYmxlTW9ja1ZpZXdQYXJ0LklEOwotCQlTYXZlYWJsZU1vY2tWaWV3UGFydCB2aWV3ID0gKFNhdmVhYmxlTW9ja1ZpZXdQYXJ0KSBmQWN0aXZlUGFnZS5zaG93Vmlldyh2aWV3SWQpOwotCQlmQWN0aXZlUGFnZS5oaWRlVmlldyh2aWV3KTsKLQkJQ2FsbEhpc3RvcnkgY2FsbFRyYWNlID0gdmlldy5nZXRDYWxsSGlzdG9yeSgpOwotCQlhc3NlcnRUcnVlKGNhbGxUcmFjZS5jb250YWlucygiaXNEaXJ0eSIpKTsKLQkJYXNzZXJ0VHJ1ZShjYWxsVHJhY2UuY29udGFpbnMoImRpc3Bvc2UiKSk7Ci0JCWFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5maW5kVmlldyh2aWV3SWQpLCBudWxsKTsKLQotCQl0cnkgewotCQkJU2F2ZWFibGVIZWxwZXIudGVzdFNldEF1dG9tYXRlZFJlc3BvbnNlKDEpOyAgLy8gTm8KLQkJCXZpZXcgPSAoU2F2ZWFibGVNb2NrVmlld1BhcnQpIGZBY3RpdmVQYWdlLnNob3dWaWV3KHZpZXdJZCk7Ci0JCQl2aWV3LnNldERpcnR5KHRydWUpOwotCQkJZkFjdGl2ZVBhZ2UuaGlkZVZpZXcodmlldyk7Ci0JCQljYWxsVHJhY2UgPSB2aWV3LmdldENhbGxIaXN0b3J5KCk7Ci0JCQlhc3NlcnRUcnVlKGNhbGxUcmFjZS5jb250YWlucygiaXNEaXJ0eSIpKTsJCQotCQkJYXNzZXJ0RmFsc2UoY2FsbFRyYWNlLmNvbnRhaW5zKCJkb1NhdmUiKSk7CQkKLQkJCWFzc2VydFRydWUoY2FsbFRyYWNlLmNvbnRhaW5zKCJkaXNwb3NlIikpOwotCQkJYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmZpbmRWaWV3KHZpZXdJZCksIG51bGwpOwotCi0JCQlTYXZlYWJsZUhlbHBlci50ZXN0U2V0QXV0b21hdGVkUmVzcG9uc2UoMik7ICAvLyBDYW5jZWwKLQkJCXZpZXcgPSAoU2F2ZWFibGVNb2NrVmlld1BhcnQpIGZBY3RpdmVQYWdlLnNob3dWaWV3KHZpZXdJZCk7Ci0JCQl2aWV3LnNldERpcnR5KHRydWUpOwotCQkJZkFjdGl2ZVBhZ2UuaGlkZVZpZXcodmlldyk7Ci0JCQljYWxsVHJhY2UgPSB2aWV3LmdldENhbGxIaXN0b3J5KCk7Ci0JCQlhc3NlcnRUcnVlKGNhbGxUcmFjZS5jb250YWlucygiaXNEaXJ0eSIpKTsJCQotCQkJYXNzZXJ0RmFsc2UoY2FsbFRyYWNlLmNvbnRhaW5zKCJkb1NhdmUiKSk7CQkKLQkJCWFzc2VydEZhbHNlKGNhbGxUcmFjZS5jb250YWlucygiZGlzcG9zZSIpKTsKLQkJCWFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5maW5kVmlldyh2aWV3SWQpLCB2aWV3KTsKLQotCQkJU2F2ZWFibGVIZWxwZXIudGVzdFNldEF1dG9tYXRlZFJlc3BvbnNlKDApOyAgLy8gWWVzCi0JCQl2aWV3ID0gKFNhdmVhYmxlTW9ja1ZpZXdQYXJ0KSBmQWN0aXZlUGFnZS5zaG93Vmlldyh2aWV3SWQpOwotCQkJdmlldy5zZXREaXJ0eSh0cnVlKTsKLQkJCWZBY3RpdmVQYWdlLmhpZGVWaWV3KHZpZXcpOwotCQkJY2FsbFRyYWNlID0gdmlldy5nZXRDYWxsSGlzdG9yeSgpOwotCQkJYXNzZXJ0VHJ1ZShjYWxsVHJhY2UuY29udGFpbnMoImlzRGlydHkiKSk7CQkKLQkJCWFzc2VydFRydWUoY2FsbFRyYWNlLmNvbnRhaW5zKCJkb1NhdmUiKSk7Ci0JCQlhc3NlcnRUcnVlKGNhbGxUcmFjZS5jb250YWlucygiZGlzcG9zZSIpKTsKLQkJCWFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5maW5kVmlldyh2aWV3SWQpLCBudWxsKTsKLQotCQkJLy8gZG9uJ3QgbGVhdmUgdGhlIHZpZXcgc2hvd2luZywgb3IgdGhlIFVJIHdpbGwgYmxvY2sgb24gd2luZG93IGNsb3NlCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlTYXZlYWJsZUhlbHBlci50ZXN0U2V0QXV0b21hdGVkUmVzcG9uc2UoLTEpOyAgLy8gcmVzdG9yZSBkZWZhdWx0IChwcm9tcHQpCi0JCX0KLQl9Ci0JCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBhIGNsb3NlIHdpbGwgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGlmIHRoZSB2aWV3IHJldHVybnMKLSAgICAgKiBJU2F2ZWFibGUyLkRFRkFVTFQuCi0gICAgICogCi0gICAgICogQHRocm93cyBUaHJvd2FibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VXaXRoU2F2ZU5lZWRlZCgpIHRocm93cyBUaHJvd2FibGUgewotCQlTdHJpbmcgdmlld0lkID0gVXNlclNhdmVhYmxlTW9ja1ZpZXdQYXJ0LklEOwotCQlVc2VyU2F2ZWFibGVNb2NrVmlld1BhcnQgdmlldyA9IChVc2VyU2F2ZWFibGVNb2NrVmlld1BhcnQpIGZBY3RpdmVQYWdlCi0JCQkJLnNob3dWaWV3KHZpZXdJZCk7Ci0JCWZBY3RpdmVQYWdlLmhpZGVWaWV3KHZpZXcpOwotCi0JCVVzZXJTYXZlYWJsZU1vY2tWaWV3UGFydCB2aWV3MiA9IG51bGw7Ci0KLQkJQ2FsbEhpc3RvcnkgY2FsbFRyYWNlID0gdmlldy5nZXRDYWxsSGlzdG9yeSgpOwotCQlhc3NlcnRUcnVlKGNhbGxUcmFjZS5jb250YWlucygiaXNEaXJ0eSIpKTsKLQkJYXNzZXJ0VHJ1ZShjYWxsVHJhY2UuY29udGFpbnMoImRpc3Bvc2UiKSk7Ci0JCWFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5maW5kVmlldyhVc2VyU2F2ZWFibGVNb2NrVmlld1BhcnQuSUQpLCBudWxsKTsKLQotCQl0cnkgewotCQkJU2F2ZWFibGVIZWxwZXIudGVzdFNldEF1dG9tYXRlZFJlc3BvbnNlKDMpOyAvLyBERUZBVUxUCi0JCQl2aWV3ID0gKFVzZXJTYXZlYWJsZU1vY2tWaWV3UGFydCkgZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcodmlld0lkKTsKLQkJCXZpZXcuc2V0RGlydHkodHJ1ZSk7Ci0JCQl2aWV3MiA9IChVc2VyU2F2ZWFibGVNb2NrVmlld1BhcnQpIGZBY3RpdmVQYWdlLnNob3dWaWV3KHZpZXdJZCwKLQkJCQkJIjIiLCBJV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFKTsKLQkJCWFzc2VydE5vdE51bGwodmlldzIpOwotCQkJdmlldzIuc2V0RGlydHkodHJ1ZSk7Ci0KLQkJCVdvcmtiZW5jaFBhZ2UgcGFnZSA9IChXb3JrYmVuY2hQYWdlKSBmQWN0aXZlUGFnZTsKLQkJCXBhZ2UuZ2V0RWRpdG9yTWFuYWdlcigpLnNhdmVBbGwodHJ1ZSwgZmFsc2UpOwotCQkJCi0JCQlhc3NlcnRGYWxzZSh2aWV3LmlzRGlydHkoKSk7Ci0JCQlhc3NlcnRGYWxzZSh2aWV3Mi5pc0RpcnR5KCkpOwotCi0JCQljYWxsVHJhY2UgPSB2aWV3LmdldENhbGxIaXN0b3J5KCk7Ci0JCQlmQWN0aXZlUGFnZS5oaWRlVmlldyh2aWV3KTsKLQkJCWZBY3RpdmVQYWdlLmhpZGVWaWV3KHZpZXcyKTsKLQkJCQotCQkJYXNzZXJ0VHJ1ZShjYWxsVHJhY2UuY29udGFpbnMoImlzRGlydHkiKSk7Ci0JCQlhc3NlcnRUcnVlKGNhbGxUcmFjZS5jb250YWlucygiZG9TYXZlIikpOwotCQkJYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmZpbmRWaWV3KHZpZXdJZCksIG51bGwpOwotCi0JCQkvLyBkb24ndCBsZWF2ZSB0aGUgdmlldyBzaG93aW5nLCBvciB0aGUgVUkgd2lsbCBibG9jayBvbiB3aW5kb3cKLQkJCS8vIGNsb3NlCi0JCX0gZmluYWxseSB7Ci0JCQlTYXZlYWJsZUhlbHBlci50ZXN0U2V0QXV0b21hdGVkUmVzcG9uc2UoU2F2ZWFibGVIZWxwZXIuVVNFUl9SRVNQT05TRSk7IC8vIHJlc3RvcmUgZGVmYXVsdAotCQkJLy8gKHByb21wdCkKLQkJfQotCX0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgYSBjbG9zZSB3aWxsIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBpZiB0aGUgdmlldyByZXR1cm5zCi0gICAgICogSVNhdmVhYmxlMi5ERUZBVUxULgotICAgICAqIAotICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVFZmZlY3RzU2hhcmVkTW9kZWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJU3RyaW5nIHZpZXdJZCA9IFVzZXJTYXZlYWJsZVNoYXJlZFZpZXdQYXJ0LklEOwotCQlVc2VyU2F2ZWFibGVTaGFyZWRWaWV3UGFydCB2aWV3ID0gbnVsbDsKLQotCQlVc2VyU2F2ZWFibGVTaGFyZWRWaWV3UGFydCB2aWV3MiA9IG51bGw7Ci0KLQkJYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmZpbmRWaWV3KFVzZXJTYXZlYWJsZVNoYXJlZFZpZXdQYXJ0LklEKSwgbnVsbCk7Ci0KLQkJdHJ5IHsKLQkJCVNhdmVhYmxlSGVscGVyLnRlc3RTZXRBdXRvbWF0ZWRSZXNwb25zZSgzKTsgLy8gREVGQVVMVAotCQkJVXNlclNhdmVhYmxlU2hhcmVkVmlld1BhcnQuU2hhcmVkTW9kZWwgbW9kZWwgPSBuZXcgVXNlclNhdmVhYmxlU2hhcmVkVmlld1BhcnQuU2hhcmVkTW9kZWwoKTsKLQkJCXZpZXcgPSAoVXNlclNhdmVhYmxlU2hhcmVkVmlld1BhcnQpIGZBY3RpdmVQYWdlLnNob3dWaWV3KHZpZXdJZCk7Ci0JCQl2aWV3LnNldFNoYXJlZE1vZGVsKG1vZGVsKTsKLQotCQkJdmlldzIgPSAoVXNlclNhdmVhYmxlU2hhcmVkVmlld1BhcnQpIGZBY3RpdmVQYWdlLnNob3dWaWV3KHZpZXdJZCwKLQkJCQkJIjIiLCBJV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFKTsKLQkJCWFzc2VydE5vdE51bGwodmlldzIpOwotCQkJdmlldzIuc2V0U2hhcmVkTW9kZWwobW9kZWwpOwotCi0JCQlXb3JrYmVuY2hQYWdlIHBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgZkFjdGl2ZVBhZ2U7Ci0JCQlwYWdlLmdldEVkaXRvck1hbmFnZXIoKS5zYXZlQWxsKHRydWUsIGZhbHNlKTsKLQotCQkJYXNzZXJ0RmFsc2Uodmlldy5pc0RpcnR5KCkpOwotCQkJYXNzZXJ0RmFsc2UodmlldzIuaXNEaXJ0eSgpKTsKLQotCQkJQ2FsbEhpc3RvcnkgY2FsbFRyYWNlID0gdmlldy5nZXRDYWxsSGlzdG9yeSgpOwotCQkJQ2FsbEhpc3RvcnkgY2FsbDIgPSB2aWV3Mi5nZXRDYWxsSGlzdG9yeSgpOwotCi0JCQlhc3NlcnRUcnVlKGNhbGxUcmFjZS5jb250YWlucygiaXNEaXJ0eSIpKTsKLQkJCWFzc2VydFRydWUoY2FsbDIuY29udGFpbnMoImlzRGlydHkiKSk7Ci0JCQlhc3NlcnRUcnVlKCJBdCBsZWFzdCBvbmUgc2hvdWxkIGNhbGwgZG9TYXZlIiwgY2FsbFRyYWNlCi0JCQkJCS5jb250YWlucygiZG9TYXZlIikKLQkJCQkJfHwgY2FsbDIuY29udGFpbnMoImRvU2F2ZSIpKTsKLQkJCWFzc2VydEZhbHNlKCJCb3RoIHNob3VsZCBub3QgY2FsbCBkb1NhdmUiLCBjYWxsVHJhY2UKLQkJCQkJLmNvbnRhaW5zKCJkb1NhdmUiKQotCQkJCQkmJiBjYWxsMi5jb250YWlucygiZG9TYXZlIikpOwotCi0JCQkvLyBkb24ndCBsZWF2ZSB0aGUgdmlldyBzaG93aW5nLCBvciB0aGUgVUkgd2lsbCBibG9jayBvbiB3aW5kb3cKLQkJCS8vIGNsb3NlCi0JCX0gZmluYWxseSB7Ci0JCQlTYXZlYWJsZUhlbHBlcgotCQkJCQkudGVzdFNldEF1dG9tYXRlZFJlc3BvbnNlKFNhdmVhYmxlSGVscGVyLlVTRVJfUkVTUE9OU0UpOyAvLyByZXN0b3JlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRlZmF1bHQKLQkJCS8vIChwcm9tcHQpCi0JCQlmQWN0aXZlUGFnZS5oaWRlVmlldyh2aWV3KTsKLQkJCWZBY3RpdmVQYWdlLmhpZGVWaWV3KHZpZXcyKTsKLQkJfQotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG9wZW5UZXN0UGFnZShmV2luKTsKLQotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgZmluYWwgSUZpbGUgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoImFhYS5tb2NrMSIsIHByb2opOwotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlKTsKLSAgICAgICAgQ2FsbEhpc3RvcnkgY2FsbFRyYWNlID0gKChNb2NrRWRpdG9yUGFydCkgZWRpdG9yKS5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogSWYgdGhlIHBhZ2UgaGFzIG9wZW4gZWRpdG9ycyB3aXRoIHVuc2F2ZWQgY29udGVudCBhbmQgc2F2ZSBpcyB0cnVlLCB0aGUgdXNlciB3aWxsIGJlIGdpdmVuIHRoZSBvcHBvcnR1bml0eSB0byBzYXZlIHRoZW0KLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydEVxdWFscyhwYWdlLmNsb3NlKCksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlCi0gICAgICAgICAgICAgICAgLnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7ICJpc0RpcnR5IiwgImRpc3Bvc2UiIH0pLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZXaW4uZ2V0QWN0aXZlUGFnZSgpLCBmQWN0aXZlUGFnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlRWRpdG9yKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJ0ZXN0T3BlbkVkaXRvciIpOwotICAgICAgICBmaW5hbCBJRmlsZSBmaWxlID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgidGVzdC5tb2NrMSIsIHByb2opOwotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3I7Ci0gICAgICAgIENhbGxIaXN0b3J5IGNhbGxUcmFjZTsKLSAgICAgICAgTW9ja0VkaXRvclBhcnQgbW9jazsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogUGFyYW1ldGVyczogc2F2ZSAtIHRydWUgdG8gc2F2ZSB0aGUgZWRpdG9yIGNvbnRlbnRzIGlmIHJlcXVpcmVkIChyZWNvbW1lbmRlZCkKLSAgICAgICAgICovCi0gICAgICAgIC8vY3JlYXRlIGEgY2xlYW4gZWRpdG9yIHRoYXQgbmVlZHMgdG8gYmUgc2F2ZWQgb24gY2xvc2luZwotICAgICAgICBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgZmlsZSk7Ci0gICAgICAgIG1vY2sgPSAoTW9ja0VkaXRvclBhcnQpIGVkaXRvcjsKLSAgICAgICAgbW9jay5zZXRTYXZlTmVlZGVkKHRydWUpOwotICAgICAgICBjYWxsVHJhY2UgPSBtb2NrLmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIGNhbGxUcmFjZS5jbGVhcigpOwotICAgICAgICAvL2Nsb3NlIHRoZSBlZGl0b3Igd2l0aCBzYXZlIGNvbmZpcm1hdGlvbgotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuY2xvc2VFZGl0b3IoZWRpdG9yLCB0cnVlKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2UKLSAgICAgICAgICAgICAgICAudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgImlzRGlydHkiLCAiZGlzcG9zZSIgfSksIHRydWUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZhZG9jOiBJZiB0aGUgZWRpdG9yIGhhcyB1bnNhdmVkIGNvbnRlbnQgYW5kIHNhdmUgaXMgdHJ1ZSwgdGhlIHVzZXIgd2lsbCBiZSBnaXZlbiB0aGUgb3Bwb3J0dW5pdHkgdG8gc2F2ZSBpdC4KLSAgICAgICAgICovCi0gICAgICAgIC8vY2FuJ3QgYmUgdGVzdGVkCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZhZG9jOiBQYXJhbWV0ZXJzOiBzYXZlIC0gZmFsc2UgdG8gZGlzY2FyZCBhbnkgdW5zYXZlZCBjaGFuZ2VzCi0gICAgICAgICAqLwotICAgICAgICAvL2NyZWF0ZSBhIGRpcnR5IGVkaXRvcgotICAgICAgICBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgZmlsZSk7Ci0gICAgICAgIG1vY2sgPSAoTW9ja0VkaXRvclBhcnQpIGVkaXRvcjsKLSAgICAgICAgbW9jay5zZXREaXJ0eSh0cnVlKTsKLSAgICAgICAgbW9jay5zZXRTYXZlTmVlZGVkKHRydWUpOwotICAgICAgICBjYWxsVHJhY2UgPSBtb2NrLmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIGNhbGxUcmFjZS5jbGVhcigpOwotICAgICAgICAvL2Nsb3NlIHRoZSBlZGl0b3IgYW5kIGRpc2NhcmQgY2hhbmdlcwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuY2xvc2VFZGl0b3IoZWRpdG9yLCBmYWxzZSksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJpc1NhdmVPbkNsb3NlTmVlZGVkIiksIGZhbHNlKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogSXQgaXMgcG9zc2libGUgdGhhdCBzb21lIGFjdGlvbiBtYXkgcXVlcnkgdGhlIGlzRGlydHkgdmFsdWUgb2YKLSAgICAgICAgICogdGhlIGVkaXRvciB0byB1cGRhdGUgaXRzIGVuYWJsZWQgc3RhdGUuIFRoZXJlIGlzIG5vdGhpbmcgd3JvbmcKLSAgICAgICAgICogaW4gZG9pbmcgdGhhdCwgc28gZG8gbm90IHRlc3QgZm9yIG5vIGlzRGlydHkgY2FsbCBoZXJlLgotICAgICAgICAgKgotICAgICAgICAgKiBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCAiaXNEaXJ0eSIpLCBmYWxzZSk7Ci0gICAgICAgICAqLwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJkb1NhdmUiKSwgZmFsc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJkaXNwb3NlIiksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUVkaXRvcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaW50IHRvdGFsID0gNTsKLSAgICAgICAgZmluYWwgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVt0b3RhbF07Ci0gICAgICAgIElFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IG5ldyBJRWRpdG9yUGFydFt0b3RhbF07Ci0gICAgICAgIElFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gbmV3IElFZGl0b3JSZWZlcmVuY2VbdG90YWxdOwotICAgICAgICBDYWxsSGlzdG9yeVtdIGNhbGxUcmFjZXMgPSBuZXcgQ2FsbEhpc3RvcnlbdG90YWxdOwotICAgICAgICBNb2NrRWRpdG9yUGFydFtdIG1vY2tzID0gbmV3IE1vY2tFZGl0b3JQYXJ0W3RvdGFsXTsKLQotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdENsb3NlRWRpdG9ycyIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspCi0gICAgICAgICAgICBmaWxlc1tpXSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoaSArICIubW9jazIiLCBwcm9qKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogSWYgdGhlIHBhZ2UgaGFzIG9wZW4gZWRpdG9ycyB3aXRoIHVuc2F2ZWQgY29udGVudCBhbmQgc2F2ZSBpcyB0cnVlLCB0aGUgdXNlciB3aWxsIGJlIGdpdmVuIHRoZSBvcHBvcnR1bml0eSB0byBzYXZlIHRoZW0uCi0gICAgICAgICAqLwotICAgICAgICAvL2Nsb3NlIGFsbCBjbGVhbiBlZGl0b3JzIHdpdGggY29uZmlybWF0aW9uCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWw7IGkrKykgewotICAgICAgICAgICAgZWRpdG9yc1tpXSA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICBjYWxsVHJhY2VzW2ldID0gKChNb2NrRWRpdG9yUGFydCkgZWRpdG9yc1tpXSkuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVkaXRvclJlZnMgPSBmQWN0aXZlUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5jbG9zZUVkaXRvcnMoZWRpdG9yUmVmcywgdHJ1ZSksIHRydWUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2VzW2ldLmNvbnRhaW5zKCJpc0RpcnR5IiksIHRydWUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZXNbaV0uY29udGFpbnMoImRvU2F2ZSIpLCBmYWxzZSk7Ci0gICAgICAgICAgICBjYWxsVHJhY2VzW2ldLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2Nsb3NlIGFsbCBkaXJ0eSBlZGl0b3JzIHdpdGggY29uZmlybWF0aW9uCi0gICAgICAgIC8vY2FuJ3QgYmUgdGVzdGVkCQkKLQotICAgICAgICAvL2Nsb3NlIGFsbCBkaXJ0eSBlZGl0b3JzIGRpc2NhcmRpbmcgdGhlbQkJCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWw7IGkrKykgewotICAgICAgICAgICAgZWRpdG9yc1tpXSA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICBtb2Nrc1tpXSA9IChNb2NrRWRpdG9yUGFydCkgZWRpdG9yc1tpXTsKLSAgICAgICAgICAgIG1vY2tzW2ldLnNldERpcnR5KHRydWUpOwotICAgICAgICAgICAgY2FsbFRyYWNlc1tpXSA9IG1vY2tzW2ldLmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWRpdG9yUmVmcyA9IGZBY3RpdmVQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmNsb3NlRWRpdG9ycyhlZGl0b3JSZWZzLCBmYWxzZSksIHRydWUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2VzW2ldLmNvbnRhaW5zKCJkb1NhdmUiKSwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9jbG9zZSBlbXB0eSBhcnJheSBvZiBlZGl0b3JzCi0gICAgICAgIHRvdGFsID0gMTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7Ci0gICAgICAgICAgICBlZGl0b3JzW2ldID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIGZpbGVzW2ldKTsKLSAgICAgICAgICAgIG1vY2tzW2ldID0gKE1vY2tFZGl0b3JQYXJ0KSBlZGl0b3JzW2ldOwotICAgICAgICAgICAgbW9ja3NbaV0uc2V0RGlydHkodHJ1ZSk7Ci0gICAgICAgICAgICBjYWxsVHJhY2VzW2ldID0gbW9ja3NbaV0uZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBlbXB0eSBhcnJheSB0ZXN0Ci0gICAgICAgIGVkaXRvclJlZnMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVswXTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmNsb3NlRWRpdG9ycyhlZGl0b3JSZWZzLCB0cnVlKSwgdHJ1ZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWw7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZXNbaV0uY29udGFpbnMoImlzRGlydHkiKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlc1tpXS5jb250YWlucygiZG9TYXZlIiksIGZhbHNlKTsKLSAgICAgICAgICAgIGNhbGxUcmFjZXNbaV0uY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNsb3NlIHRoZSBsYXN0IHJlbWFpbmluZyBlZGl0b3IsIHdpdGggc2F2ZT1mYWxzZQotICAgICAgICBlZGl0b3JSZWZzID0gZkFjdGl2ZVBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotICAgICAgICBmQWN0aXZlUGFnZS5jbG9zZUVkaXRvcnMoZWRpdG9yUmVmcywgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUFsbEVkaXRvcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaW50IHRvdGFsID0gNTsKLSAgICAgICAgZmluYWwgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVt0b3RhbF07Ci0gICAgICAgIElFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IG5ldyBJRWRpdG9yUGFydFt0b3RhbF07Ci0gICAgICAgIENhbGxIaXN0b3J5W10gY2FsbFRyYWNlcyA9IG5ldyBDYWxsSGlzdG9yeVt0b3RhbF07Ci0gICAgICAgIE1vY2tFZGl0b3JQYXJ0W10gbW9ja3MgPSBuZXcgTW9ja0VkaXRvclBhcnRbdG90YWxdOwotCi0gICAgICAgIHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJ0ZXN0T3BlbkVkaXRvciIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspCi0gICAgICAgICAgICBmaWxlc1tpXSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoaSArICIubW9jazIiLCBwcm9qKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogSWYgdGhlIHBhZ2UgaGFzIG9wZW4gZWRpdG9ycyB3aXRoIHVuc2F2ZWQgY29udGVudCBhbmQgc2F2ZSBpcyB0cnVlLCB0aGUgdXNlciB3aWxsIGJlIGdpdmVuIHRoZSBvcHBvcnR1bml0eSB0byBzYXZlIHRoZW0uCi0gICAgICAgICAqLwotICAgICAgICAvL2Nsb3NlIGFsbCBjbGVhbiBlZGl0b3JzIHdpdGggY29uZmlybWF0aW9uCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWw7IGkrKykgewotICAgICAgICAgICAgZWRpdG9yc1tpXSA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICBjYWxsVHJhY2VzW2ldID0gKChNb2NrRWRpdG9yUGFydCkgZWRpdG9yc1tpXSkuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuY2xvc2VBbGxFZGl0b3JzKHRydWUpLCB0cnVlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlc1tpXS5jb250YWlucygiaXNEaXJ0eSIpLCB0cnVlKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2VzW2ldLmNvbnRhaW5zKCJkb1NhdmUiKSwgZmFsc2UpOwotICAgICAgICAgICAgY2FsbFRyYWNlc1tpXS5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9jbG9zZSBhbGwgZGlydHkgZWRpdG9ycyB3aXRoIGNvbmZpcm1hdGlvbgotICAgICAgICAvL2Nhbid0IGJlIHRlc3RlZAkJCi0KLSAgICAgICAgLy9jbG9zZSBhbGwgZGlydHkgZWRpdG9ycyBkaXNjYXJkaW5nIHRoZW0JCQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKLSAgICAgICAgICAgIGVkaXRvcnNbaV0gPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgZmlsZXNbaV0pOwotICAgICAgICAgICAgbW9ja3NbaV0gPSAoTW9ja0VkaXRvclBhcnQpIGVkaXRvcnNbaV07Ci0gICAgICAgICAgICBtb2Nrc1tpXS5zZXREaXJ0eSh0cnVlKTsKLSAgICAgICAgICAgIGNhbGxUcmFjZXNbaV0gPSBtb2Nrc1tpXS5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpLCB0cnVlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlc1tpXS5jb250YWlucygiZG9TYXZlIiksIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlRWRpdG9yKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJ0ZXN0T3BlbkVkaXRvciIpOwotICAgICAgICBmaW5hbCBJRmlsZSBmaWxlID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgidGVzdC5tb2NrMSIsIHByb2opOwotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3I7Ci0gICAgICAgIENhbGxIaXN0b3J5IGNhbGxUcmFjZTsKLSAgICAgICAgTW9ja0VkaXRvclBhcnQgbW9jazsKLQotICAgICAgICAvL2NyZWF0ZSBhIGNsZWFuIGVkaXRvcgotICAgICAgICBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgZmlsZSk7Ci0gICAgICAgIG1vY2sgPSAoTW9ja0VkaXRvclBhcnQpIGVkaXRvcjsKLSAgICAgICAgY2FsbFRyYWNlID0gbW9jay5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBlZGl0b3IgaWYgZGlydHkuIAotICAgICAgICAgSWYgbm90LCB0aGlzIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgZWZmZWN0Ci0gICAgICAgICAqLwotICAgICAgICAvL3NhdmUgdGhlIGNsZWFuIGVkaXRvciB3aXRoIGNvbmZpcm1hdGlvbgkJCi0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5zYXZlRWRpdG9yKGVkaXRvciwgdHJ1ZSksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJpc0RpcnR5IiksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlLmNvbnRhaW5zKCJkb1NhdmUiKSwgZmFsc2UpOwotCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZhZG9jOiBJZiBjb25maXJtIGlzIHRydWUgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gY29uZmlybSB0aGUgY29tbWFuZC4gCi0gICAgICAgICAqLwotICAgICAgICAvL2Nhbid0IGJlIHRlc3RlZAotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogT3RoZXJ3aXNlLCB0aGUgc2F2ZSBoYXBwZW5zIHdpdGhvdXQgcHJvbXB0LiAKLSAgICAgICAgICovCi0gICAgICAgIC8vc2F2ZSB0aGUgY2xlYW4gZWRpdG9yIHdpdGhvdXQgY29uZmlybWF0aW9uCi0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5zYXZlRWRpdG9yKGVkaXRvciwgZmFsc2UpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygiaXNEaXJ0eSIpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZS5jb250YWlucygiZG9TYXZlIiksIGZhbHNlKTsKLQotICAgICAgICAvL3NhdmUgdGhlIGRpcnR5IGVkaXRvciB3aXRob3V0IGNvbmZpcm1hdGlvbgotICAgICAgICBtb2NrLnNldERpcnR5KHRydWUpOwotICAgICAgICBjYWxsVHJhY2UuY2xlYXIoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLnNhdmVFZGl0b3IoZWRpdG9yLCBmYWxzZSksIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlCi0gICAgICAgICAgICAgICAgLnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7ICJpc0RpcnR5IiwgImRvU2F2ZSIgfSksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJREVTYXZlQWxsRWRpdG9ycygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBpbnQgdG90YWwgPSAzOwotCi0gICAgICAgIGZpbmFsIElGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbdG90YWxdOwotICAgICAgICBJRWRpdG9yUGFydFtdIGVkaXRvcnMgPSBuZXcgSUVkaXRvclBhcnRbdG90YWxdOwotICAgICAgICBDYWxsSGlzdG9yeVtdIGNhbGxUcmFjZXMgPSBuZXcgQ2FsbEhpc3RvcnlbdG90YWxdOwotICAgICAgICBNb2NrRWRpdG9yUGFydFtdIG1vY2tzID0gbmV3IE1vY2tFZGl0b3JQYXJ0W3RvdGFsXTsKLQotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3IiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7Ci0gICAgICAgICAgICBmaWxlc1tpXSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoaSArICIubW9jazIiLCBwcm9qKTsKLSAgICAgICAgICAgIGVkaXRvcnNbaV0gPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgZmlsZXNbaV0pOwotICAgICAgICAgICAgbW9ja3NbaV0gPSAoTW9ja0VkaXRvclBhcnQpIGVkaXRvcnNbaV07Ci0gICAgICAgICAgICBjYWxsVHJhY2VzW2ldID0gbW9ja3NbaV0uZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICBqYXZhZG9jOiBJZiB0aGVyZSBhcmUgbm8gZGlydHkgZWRpdG9ycyB0aGlzIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgZWZmZWN0LgotICAgICAgICAgamF2YWRvYzogSWYgY29uZmlybSBpcyB0cnVlIHRoZSB1c2VyIGlzIHByb21wdGVkIHRvIGNvbmZpcm0gdGhlIGNvbW1hbmQKLSAgICAgICAgICovCi0gICAgICAgIC8vc2F2ZSBhbGwgY2xlYW4gZWRpdG9ycyB3aXRoIGNvbmZpcm1hdGlvbgotICAgICAgICBhc3NlcnRFcXVhbHMoSURFLnNhdmVBbGxFZGl0b3JzKG5ldyBJUmVzb3VyY2VbXSB7IHByb2ogfSwgdHJ1ZSksIHRydWUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2VzW2ldLmNvbnRhaW5zKCJpc0RpcnR5IiksIHRydWUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZXNbaV0uY29udGFpbnMoImRvU2F2ZSIpLCBmYWxzZSk7Ci0gICAgICAgICAgICBjYWxsVHJhY2VzW2ldLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3NhdmUgYWxsIGRpcnR5IGVkaXRvcnMgd2l0aCBjb25maXJtYXRpb24gY2FuJ3QgYmUgdGVzdGVkCi0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IFBhcmFtZXRlcnM6IGNvbmZpcm0gLSBmYWxzZSB0byBzYXZlIHVuc2F2ZWQgY2hhbmdlcyB3aXRob3V0IGFza2luZwotICAgICAgICAgKi8KLSAgICAgICAgLy9zYXZlIGFsbCBjbGVhbiBlZGl0b3JzIHdpdGhvdXQgY29uZmlybWF0aW9uCi0gICAgICAgIGFzc2VydEVxdWFscyhJREUuc2F2ZUFsbEVkaXRvcnMobmV3IElSZXNvdXJjZVtdIHsgcHJvaiB9LCBmYWxzZSksIHRydWUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2VzW2ldLmNvbnRhaW5zKCJpc0RpcnR5IiksIHRydWUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZXNbaV0uY29udGFpbnMoImRvU2F2ZSIpLCBmYWxzZSk7Ci0gICAgICAgICAgICBjYWxsVHJhY2VzW2ldLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3NhdmUgYWxsIGRpcnR5IGVkaXRvcnMgd2l0aCByZXNvdXJjZSB0aGF0IElTIE5PVCBhIHBhcmVudAotICAgICAgICAvLyBvZiB0aGUgY29udGVudHMgb2YgdGhlIGRpcnR5IGVkaXRvcnMgd2l0aG91dCBjb25maXJtYXRpb24sIHRoaXMgc2hvdWxkIG5vdCAKLSAgICAgICAgLy8gc2F2ZSBhbnkgYXMgdGhleSBhcmUgbm90IHBhcmVudGVkIGJ5IHRoZSByZXNvdXJjZSBwcm92aWRlZAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspCi0gICAgICAgICAgICBtb2Nrc1tpXS5zZXREaXJ0eSh0cnVlKTsKLQotICAgICAgICBJUmVzb3VyY2UgZW1wdHlQcm9qID0gRmlsZVV0aWwKLSAgICAgICAgICAgICAgICAuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3JFbXB0eVByb2plY3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKElERS5zYXZlQWxsRWRpdG9ycyhuZXcgSVJlc291cmNlW10geyBlbXB0eVByb2ogfSwgZmFsc2UpLAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKLSAgICAgICAgICAgIC8vIHRoZSBlZGl0b3JzIHdlcmUgbm90IGluIHRoZSBlbXB0eSBwcm9qZWN0IGhlbmNlIHN0aWxsIGRpcnR5Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobW9ja3NbaV0uaXNEaXJ0eSgpLCB0cnVlKTsKLSAgICAgICAgICAgIGNhbGxUcmFjZXNbaV0uY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2F2ZSBhbGwgZGlydHkgZWRpdG9ycyB3aXRoIHJlc291cmNlIHRoYXQgSVMgYSBwYXJlbnQKLSAgICAgICAgLy8gb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3JzIHdpdGhvdXQgY29uZmlybWF0aW9uLCB0aGlzIHNob3VsZCAKLSAgICAgICAgLy8gc2F2ZSB0aGVtIGFzIHRoZXkgYXJlIHBhcmVudGVkIGJ5IHRoZSByZXNvdXJjZSBwcm92aWRlZAotICAgICAgICBhc3NlcnRFcXVhbHMoSURFLnNhdmVBbGxFZGl0b3JzKG5ldyBJUmVzb3VyY2VbXSB7IHByb2ogfSwgZmFsc2UpLCB0cnVlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7Ci0gICAgICAgICAgICAvLyB0aGUgZWRpdG9ycyB3ZXJlIG5vdCBpbiB0aGUgZW1wdHkgcHJvamVjdCBoZW5jZSBzdGlsbCBkaXJ0eQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vY2tzW2ldLmlzRGlydHkoKSwgZmFsc2UpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZXNbaV0uY29udGFpbnMoImlzRGlydHkiKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlc1tpXS5jb250YWlucygiZG9TYXZlIiksIHRydWUpOwotICAgICAgICAgICAgY2FsbFRyYWNlc1tpXS5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zYXZlIGFsbCBkaXJ0eSBlZGl0b3JzIHdpdGggcmVzb3VyY2UgdGhhdCBJUyBOT1QgYSBwYXJlbnQKLSAgICAgICAgLy8gb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJ0eSBlZGl0b3JzIHdpdGhvdXQgY29uZmlybWF0aW9uLCB0aGlzIHNob3VsZCBub3QgCi0gICAgICAgIC8vIHNhdmUgYW55IGFzIHRoZXkgYXJlIG5vdCBwYXJlbnRlZCBieSB0aGUgcmVzb3VyY2UgcHJvdmlkZWQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKQotICAgICAgICAgICAgbW9ja3NbaV0uc2V0RGlydHkodHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJREUuc2F2ZUFsbEVkaXRvcnMobmV3IElSZXNvdXJjZVtdIHt9LCBmYWxzZSksIHRydWUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKLSAgICAgICAgICAgIC8vIHRoZSBlZGl0b3JzIHdlcmUgbm90IGluIHRoZSBlbXB0eSBwcm9qZWN0IGhlbmNlIHN0aWxsIGRpcnR5Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobW9ja3NbaV0uaXNEaXJ0eSgpLCB0cnVlKTsKLSAgICAgICAgICAgIGNhbGxUcmFjZXNbaV0uY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNsZWFyIHRoZSBkaXJ0eSBzdGF0ZSBzbyB0aGUgdGVhckRvd24gZG9lcyBub3Qgb3BlbiBhIGNvbmZpcm0gZGlhbG9nLgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspCi0gICAgICAgICAgICBtb2Nrc1tpXS5zZXREaXJ0eShmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVBbGxFZGl0b3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGludCB0b3RhbCA9IDM7Ci0KLSAgICAgICAgZmluYWwgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVt0b3RhbF07Ci0gICAgICAgIElFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IG5ldyBJRWRpdG9yUGFydFt0b3RhbF07Ci0gICAgICAgIENhbGxIaXN0b3J5W10gY2FsbFRyYWNlcyA9IG5ldyBDYWxsSGlzdG9yeVt0b3RhbF07Ci0gICAgICAgIE1vY2tFZGl0b3JQYXJ0W10gbW9ja3MgPSBuZXcgTW9ja0VkaXRvclBhcnRbdG90YWxdOwotCi0gICAgICAgIHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJ0ZXN0T3BlbkVkaXRvciIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKLSAgICAgICAgICAgIGZpbGVzW2ldID0gRmlsZVV0aWwuY3JlYXRlRmlsZShpICsgIi5tb2NrMiIsIHByb2opOwotICAgICAgICAgICAgZWRpdG9yc1tpXSA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICBtb2Nrc1tpXSA9IChNb2NrRWRpdG9yUGFydCkgZWRpdG9yc1tpXTsKLSAgICAgICAgICAgIGNhbGxUcmFjZXNbaV0gPSBtb2Nrc1tpXS5nZXRDYWxsSGlzdG9yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgIGphdmFkb2M6IElmIHRoZXJlIGFyZSBubyBkaXJ0eSBlZGl0b3JzIHRoaXMgbWV0aG9kIHJldHVybnMgd2l0aG91dCBlZmZlY3QuCi0gICAgICAgICBqYXZhZG9jOiBJZiBjb25maXJtIGlzIHRydWUgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gY29uZmlybSB0aGUgY29tbWFuZAotICAgICAgICAgKi8KLSAgICAgICAgLy9zYXZlIGFsbCBjbGVhbiBlZGl0b3JzIHdpdGggY29uZmlybWF0aW9uCi0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5zYXZlQWxsRWRpdG9ycyh0cnVlKSwgdHJ1ZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWw7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZXNbaV0uY29udGFpbnMoImlzRGlydHkiKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlc1tpXS5jb250YWlucygiZG9TYXZlIiksIGZhbHNlKTsKLSAgICAgICAgICAgIGNhbGxUcmFjZXNbaV0uY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2F2ZSBhbGwgZGlydHkgZWRpdG9ycyB3aXRoIGNvbmZpcm1hdGlvbiBjYW4ndCBiZSB0ZXN0ZWQKLQotICAgICAgICAvKgotICAgICAgICAgamF2YWRvYzogUGFyYW1ldGVyczogY29uZmlybSAtIGZhbHNlIHRvIHNhdmUgdW5zYXZlZCBjaGFuZ2VzIHdpdGhvdXQgYXNraW5nCi0gICAgICAgICAqLwotICAgICAgICAvL3NhdmUgYWxsIGNsZWFuIGVkaXRvcnMgd2l0aG91dCBjb25maXJtYXRpb24KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLnNhdmVBbGxFZGl0b3JzKGZhbHNlKSwgdHJ1ZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWw7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxUcmFjZXNbaV0uY29udGFpbnMoImlzRGlydHkiKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbFRyYWNlc1tpXS5jb250YWlucygiZG9TYXZlIiksIGZhbHNlKTsKLSAgICAgICAgICAgIGNhbGxUcmFjZXNbaV0uY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2F2ZSBhbGwgZGlydHkgZWRpdG9ycyB3aXRob3V0IGNvbmZpcm1hdGlvbgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsOyBpKyspCi0gICAgICAgICAgICBtb2Nrc1tpXS5zZXREaXJ0eSh0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLnNhdmVBbGxFZGl0b3JzKGZhbHNlKSwgdHJ1ZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWw7IGkrKykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjYWxsVHJhY2VzW2ldLnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7ICJpc0RpcnR5IiwKLSAgICAgICAgICAgICAgICAgICAgImRvU2F2ZSIgfSksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFZGl0b3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJ0ZXN0T3BlbkVkaXRvciIpOwotICAgICAgICBpbnQgdG90YWxCZWZvcmUgPSBmQWN0aXZlUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCkubGVuZ3RoOwotICAgICAgICBpbnQgbnVtID0gMzsKLSAgICAgICAgSUVkaXRvclBhcnRbXSBlZGl0b3JzID0gbmV3IElFZGl0b3JQYXJ0W251bV07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewotICAgICAgICAgICAgZWRpdG9yc1tpXSA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBGaWxlVXRpbC5jcmVhdGVGaWxlKGkKLSAgICAgICAgICAgICAgICAgICAgKyAiLm1vY2syIiwgcHJvaikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGhhc0VkaXRvcihlZGl0b3JzW2ldKSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZBY3RpdmVQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKS5sZW5ndGgsIHRvdGFsQmVmb3JlCi0gICAgICAgICAgICAgICAgKyBudW0pOwotCi0gICAgICAgIGZBY3RpdmVQYWdlLmNsb3NlRWRpdG9yKGVkaXRvcnNbMF0sIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGhhc0VkaXRvcihlZGl0b3JzWzBdKSwgZmFsc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpLmxlbmd0aCwgdG90YWxCZWZvcmUKLSAgICAgICAgICAgICAgICArIG51bSAtIDEpOwotCi0gICAgICAgIGZBY3RpdmVQYWdlLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCkubGVuZ3RoLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvd0FjdGlvblNldCgpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gTW9ja0FjdGlvbkRlbGVnYXRlLkFDVElPTl9TRVRfSUQ7Ci0gICAgICAgIFdvcmtiZW5jaFBhZ2UgcGFnZSA9IChXb3JrYmVuY2hQYWdlKSBmQWN0aXZlUGFnZTsKLQotICAgICAgICBpbnQgdG90YWxCZWZvcmUgPSBwYWdlLmdldEFjdGlvblNldHMoKS5sZW5ndGg7Ci0gICAgICAgIGZBY3RpdmVQYWdlLnNob3dBY3Rpb25TZXQoaWQpOwotCi0gICAgICAgIElBY3Rpb25TZXREZXNjcmlwdG9yW10gc2V0cyA9ICgoV29ya2JlbmNoUGFnZSkgZkFjdGl2ZVBhZ2UpCi0gICAgICAgICAgICAgICAgLmdldEFjdGlvblNldHMoKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKHNldHNbaV0uZ2V0SWQoKSkpCi0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICBhc3NlcnRFcXVhbHMoZm91bmQsIHRydWUpOwotCi0gICAgICAgIC8vY2hlY2sgdGhhdCB0aGUgbWV0aG9kIGRvZXMgbm90IGFkZCBhbiBpbnZhbGlkIGFjdGlvbiBzZXQgdG8gaXRzZWxmCi0gICAgICAgIGlkID0gSUNvbnN0YW50cy5GYWtlSUQ7Ci0gICAgICAgIGZBY3RpdmVQYWdlLnNob3dBY3Rpb25TZXQoaWQpOwotCi0gICAgICAgIHNldHMgPSAoKFdvcmtiZW5jaFBhZ2UpIGZBY3RpdmVQYWdlKS5nZXRBY3Rpb25TZXRzKCk7Ci0gICAgICAgIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2V0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoc2V0c1tpXS5nZXRJZCgpKSkKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgZmFsc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFnZS5nZXRBY3Rpb25TZXRzKCkubGVuZ3RoLCB0b3RhbEJlZm9yZSArIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIaWRlQWN0aW9uU2V0KCkgewotICAgICAgICBXb3JrYmVuY2hQYWdlIHBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgZkFjdGl2ZVBhZ2U7Ci0gICAgICAgIGludCB0b3RhbEJlZm9yZSA9IHBhZ2UuZ2V0QWN0aW9uU2V0cygpLmxlbmd0aDsKLQotICAgICAgICBTdHJpbmcgaWQgPSBNb2NrV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUuU0VUX0lEOwotICAgICAgICBmQWN0aXZlUGFnZS5zaG93QWN0aW9uU2V0KGlkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2UuZ2V0QWN0aW9uU2V0cygpLmxlbmd0aCwgdG90YWxCZWZvcmUgKyAxKTsKLQotICAgICAgICBmQWN0aXZlUGFnZS5oaWRlQWN0aW9uU2V0KGlkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2UuZ2V0QWN0aW9uU2V0cygpLmxlbmd0aCwgdG90YWxCZWZvcmUpOwotCi0gICAgICAgIElBY3Rpb25TZXREZXNjcmlwdG9yW10gc2V0cyA9IHBhZ2UuZ2V0QWN0aW9uU2V0cygpOwotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2V0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoc2V0c1tpXS5nZXRJZCgpKSkKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgZWRpdG9yIGV4aXN0cyBpbiB0aGUgY3VycmVudCBwYWdlLgotICAgICAqIEBwYXJhbSBlZGl0b3IKLSAgICAgKiAgQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0VkaXRvcihJRWRpdG9yUGFydCBlZGl0b3IpIHsKLSAgICAgICAgSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBmQWN0aXZlUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHJlZmVyZW5jZXNbaV0uZ2V0RWRpdG9yKGZhbHNlKS5lcXVhbHMoZWRpdG9yKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSB2aWV3IGV4aXN0cyBpbiB0aGUgY3VycmVudCBwYWdlLgotICAgICAqIEBwYXJhbSBlZGl0b3IKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzVmlldyhJVmlld1BhcnQgdmlldykgewotICAgICAgICBJVmlld1JlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBmQWN0aXZlUGFnZS5nZXRWaWV3UmVmZXJlbmNlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VzW2ldLmdldFZpZXcoZmFsc2UpLmVxdWFscyh2aWV3KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YWNrT3JkZXIoKSB7Ci0gICAgICAgIFdvcmtiZW5jaFBhZ2UgcGFnZSA9IChXb3JrYmVuY2hQYWdlKSBmQWN0aXZlUGFnZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElWaWV3UGFydCBwYXJ0MSA9IHBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEKTsKLSAgICAgICAgICAgIElWaWV3UGFydCBwYXJ0MiA9IHBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEMik7Ci0gICAgICAgICAgICBJVmlld1BhcnQgcGFydDMgPSBwYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRDMpOwotICAgICAgICAgICAgSVZpZXdQYXJ0IHBhcnQ0ID0gcGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQ0KTsKLQotICAgICAgICAgICAgSVZpZXdQYXJ0W10gc3RhY2sgPSBwYWdlLmdldFZpZXdTdGFjayhwYXJ0MSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHN0YWNrLmxlbmd0aCA9PSA0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc3RhY2tbMF0gPT0gcGFydDQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdGFja1sxXSA9PSBwYXJ0Myk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHN0YWNrWzJdID09IHBhcnQyKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc3RhY2tbM10gPT0gcGFydDEpOwotCi0gICAgICAgICAgICBwYWdlLmFjdGl2YXRlKHBhcnQyKTsKLSAgICAgICAgICAgIHN0YWNrID0gcGFnZS5nZXRWaWV3U3RhY2socGFydDEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdGFjay5sZW5ndGggPT0gNCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHN0YWNrWzBdID09IHBhcnQyKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc3RhY2tbMV0gPT0gcGFydDQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdGFja1syXSA9PSBwYXJ0Myk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHN0YWNrWzNdID09IHBhcnQxKTsKLQotICAgICAgICAgICAgcGFnZS5hY3RpdmF0ZShwYXJ0MSk7Ci0gICAgICAgICAgICBzdGFjayA9IHBhZ2UuZ2V0Vmlld1N0YWNrKHBhcnQxKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc3RhY2subGVuZ3RoID09IDQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdGFja1swXSA9PSBwYXJ0MSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHN0YWNrWzFdID09IHBhcnQyKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc3RhY2tbMl0gPT0gcGFydDQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdGFja1szXSA9PSBwYXJ0Myk7Ci0KLSAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocGFydDMpOwotICAgICAgICAgICAgc3RhY2sgPSBwYWdlLmdldFZpZXdTdGFjayhwYXJ0MSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHN0YWNrLmxlbmd0aCA9PSA0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc3RhY2tbMF0gPT0gcGFydDMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdGFja1sxXSA9PSBwYXJ0MSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHN0YWNrWzJdID09IHBhcnQyKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc3RhY2tbM10gPT0gcGFydDQpOwotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIFZJRVdfQ1JFQVRFIHBhcmFtZXRlciBmb3Igc2hvd1ZpZXcuICBFbnN1cmVzIHRoYXQgdGhlIGNyZWF0ZWQKLSAgICAgKiB2aWV3IGlzIG5vdCB0aGUgYWN0aXZlIHBhcnQuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Vmlld19DUkVBVEUxKCkgewotICAgICAgICBXb3JrYmVuY2hQYWdlIHBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgZkFjdGl2ZVBhZ2U7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHBhZ2Uuc2V0UGVyc3BlY3RpdmUoV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlZpZXdQZXJzcGVjdGl2ZSIpKTsKLQotICAgICAgICAgICAgLy9jcmVhdGUgYSBwYXJ0IHRvIGJlIGFjdGl2ZQotICAgICAgICAgICAgSVZpZXdQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRCk7Ci0gICAgICAgICAgICBJVmlld1BhcnQgY3JlYXRlZFBhcnQgPSBwYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRDIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlLlZJRVdfQ1JFQVRFKTsKLQotICAgICAgICAgICAgSVZpZXdQYXJ0W10gc3RhY2sgPSBwYWdlLmdldFZpZXdTdGFjayhhY3RpdmVQYXJ0KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBzdGFjay5sZW5ndGgpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aXZlUGFydCwgc3RhY2tbMF0pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNyZWF0ZWRQYXJ0LCBzdGFja1sxXSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHBhZ2UuaXNQYXJ0VmlzaWJsZShjcmVhdGVkUGFydCkpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aXZlUGFydCwgcGFnZS5nZXRBY3RpdmVQYXJ0KCkpOwotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIFZJRVdfQ1JFQVRFIHBhcmFtZXRlciBmb3Igc2hvd1ZpZXcuICBFbnN1cmVzIHRoYXQgdGhlIGNyZWF0ZWQKLSAgICAgKiB2aWV3IGlzIG5vdCB0aGUgYWN0aXZlIHBhcnQgYW5kIGlzIG5vdCB2aXNpYmxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFZpZXdfQ1JFQVRFMigpIHsKLSAgICAgICAgV29ya2JlbmNoUGFnZSBwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIGZBY3RpdmVQYWdlOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBwYWdlLnNldFBlcnNwZWN0aXZlKFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKS5maW5kUGVyc3BlY3RpdmVXaXRoSWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5WaWV3UGVyc3BlY3RpdmUiKSk7Ci0KLSAgICAgICAgICAgIC8vY3JlYXRlIGEgcGFydCB0byBiZSBhY3RpdmUKLSAgICAgICAgICAgIElWaWV3UGFydCBhY3RpdmVQYXJ0ID0gcGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQzKTsKLSAgICAgICAgICAgIElWaWV3UGFydCBjcmVhdGVkUGFydCA9IHBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEMiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UuVklFV19DUkVBVEUpOwotCi0gICAgICAgICAgICBJVmlld1BhcnRbXSBzdGFjayA9IHBhZ2UuZ2V0Vmlld1N0YWNrKGNyZWF0ZWRQYXJ0KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBzdGFjay5sZW5ndGgpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFnZS5maW5kVmlldyhNb2NrVmlld1BhcnQuSUQpLCBzdGFja1swXSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3JlYXRlZFBhcnQsIHN0YWNrWzFdKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UocGFnZS5pc1BhcnRWaXNpYmxlKGNyZWF0ZWRQYXJ0KSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhhY3RpdmVQYXJ0LCBwYWdlLmdldEFjdGl2ZVBhcnQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGUgVklFV19DUkVBVEUgcGFyYW1ldGVyIGZvciBzaG93Vmlldy4gIEVuc3VyZXMgdGhhdCB0aGUgY3JlYXRlZAotICAgICAqIHZpZXcgaXMgbm90IHRoZSBhY3RpdmUgcGFydCBhbmQgaXMgdmlzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Vmlld19DUkVBVEUzKCkgewotICAgICAgICBXb3JrYmVuY2hQYWdlIHBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgZkFjdGl2ZVBhZ2U7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHBhZ2Uuc2V0UGVyc3BlY3RpdmUoV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlZpZXdQZXJzcGVjdGl2ZSIpKTsKLQotICAgICAgICAgICAgLy9jcmVhdGUgYSBwYXJ0IHRvIGJlIGFjdGl2ZQotICAgICAgICAgICAgSVZpZXdQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRDMpOwotICAgICAgICAgICAgSVZpZXdQYXJ0IGNyZWF0ZWRQYXJ0ID0gcGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQ0LCBudWxsLAotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZS5WSUVXX0NSRUFURSk7Ci0KLSAgICAgICAgICAgIElWaWV3UGFydFtdIHN0YWNrID0gcGFnZS5nZXRWaWV3U3RhY2soY3JlYXRlZFBhcnQpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0YWNrLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjcmVhdGVkUGFydCwgc3RhY2tbMF0pOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHBhZ2UuaXNQYXJ0VmlzaWJsZShjcmVhdGVkUGFydCkpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aXZlUGFydCwgcGFnZS5nZXRBY3RpdmVQYXJ0KCkpOwotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIFZJRVdfVklTSUJMRSBwYXJhbWV0ZXIgZm9yIHNob3dWaWV3LCBvcGVuaW5nIHRoZSB2aWV3IGluIHRoZSAKLSAgICAgKiBzdGFjayBjb250YWluaW5nIHRoZSBhY3RpdmUgdmlldy4gIEVuc3VyZXMgdGhhdCB0aGUgY3JlYXRlZCB2aWV3IGlzIG5vdCAKLSAgICAgKiB0aGUgYWN0aXZlIHBhcnQgYW5kIGlzIG5vdCB2aXNpYmxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWaWV3X1ZJU0lCTEUxKCkgewotICAgICAgICBXb3JrYmVuY2hQYWdlIHBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgZkFjdGl2ZVBhZ2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYWdlLnNldFBlcnNwZWN0aXZlKFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKS5maW5kUGVyc3BlY3RpdmVXaXRoSWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5WaWV3UGVyc3BlY3RpdmUiKSk7Ci0KLSAgICAgICAgICAgIC8vY3JlYXRlIGEgcGFydCB0byBiZSBhY3RpdmUKLSAgICAgICAgICAgIElWaWV3UGFydCBhY3RpdmVQYXJ0ID0gcGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQpOwotICAgICAgICAgICAgSVZpZXdQYXJ0IGNyZWF0ZWRQYXJ0ID0gcGFnZS5zaG93VmlldyhNb2NrVmlld1BhcnQuSUQyLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZS5WSUVXX1ZJU0lCTEUpOwotICAgICAgICAgICAgSVZpZXdQYXJ0W10gc3RhY2sgPSBwYWdlLmdldFZpZXdTdGFjayhhY3RpdmVQYXJ0KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBzdGFjay5sZW5ndGgpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aXZlUGFydCwgc3RhY2tbMF0pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNyZWF0ZWRQYXJ0LCBzdGFja1sxXSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHBhZ2UuaXNQYXJ0VmlzaWJsZShjcmVhdGVkUGFydCkpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aXZlUGFydCwgcGFnZS5nZXRBY3RpdmVQYXJ0KCkpOwotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIFZJRVdfVklTSUJMRSBwYXJhbWV0ZXIgZm9yIHNob3dWaWV3LCBvcGVuaW5nIHRoZSB2aWV3IGluIGl0cyAKLSAgICAgKiBvd24gc3RhY2suICBFbnN1cmVzIHRoYXQgdGhlIGNyZWF0ZWQgdmlldyBpcyBub3QgYWN0aXZlIHBhcnQgYnV0IGlzIHRoZSAKLSAgICAgKiB0b3AgcGFydCBpbiBpdHMgc3RhY2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFZpZXdfVklTSUJMRTMoKSB7Ci0gICAgICAgIFdvcmtiZW5jaFBhZ2UgcGFnZSA9IChXb3JrYmVuY2hQYWdlKSBmQWN0aXZlUGFnZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhZ2Uuc2V0UGVyc3BlY3RpdmUoV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlZpZXdQZXJzcGVjdGl2ZSIpKTsKLQotICAgICAgICAgICAgLy9jcmVhdGUgYSBwYXJ0IHRvIGJlIGFjdGl2ZQotICAgICAgICAgICAgSVZpZXdQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRDMpOwotCi0gICAgICAgICAgICBJVmlld1BhcnQgY3JlYXRlZFBhcnQgPSBwYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRDQsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlLlZJRVdfVklTSUJMRSk7Ci0gICAgICAgICAgICBJVmlld1BhcnRbXSBzdGFjayA9IHBhZ2UuZ2V0Vmlld1N0YWNrKGNyZWF0ZWRQYXJ0KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGFjay5sZW5ndGgpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3JlYXRlZFBhcnQsIHN0YWNrWzBdKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwYWdlLmlzUGFydFZpc2libGUoY3JlYXRlZFBhcnQpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFjdGl2ZVBhcnQsIHBhZ2UuZ2V0QWN0aXZlUGFydCgpKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IG9wZW5pbmcgYSBwZXJzcGVjdGl2ZSB3aXRoIGEgZmFzdCB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuUGVyc3BlY3RpdmVXaXRoRmFzdFZpZXcoKSB7Ci0gICAgICAgIFdvcmtiZW5jaFBhZ2UgcGFnZSA9IChXb3JrYmVuY2hQYWdlKSBmQWN0aXZlUGFnZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZldpbi5nZXRXb3JrYmVuY2goKS5zaG93UGVyc3BlY3RpdmUoCi0gICAgICAgICAgICAgICAgICAgIFBlcnNwZWN0aXZlV2l0aEZhc3RWaWV3LlBFUlNQX0lELCBmV2luKTsKLSAgICAgICAgfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgV29ya2JlbmNoRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMocGFnZS5nZXRGYXN0Vmlld3MoKS5sZW5ndGgsIDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFnZS5nZXRGYXN0Vmlld3MoKVswXS5nZXRJZCgpLAotICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS52aWV3cy5SZXNvdXJjZU5hdmlnYXRvciIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFnZS5nZXRWaWV3UmVmZXJlbmNlcygpLmxlbmd0aCwgMSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFnZS5nZXRWaWV3UmVmZXJlbmNlcygpWzBdLmlzRmFzdFZpZXcoKSk7Ci0KLSAgICAgICAgQ2xvc2VQZXJzcGVjdGl2ZUFjdGlvbiBjbG9zZVBlc3BlY3RpdmUgPSBuZXcgQ2xvc2VQZXJzcGVjdGl2ZUFjdGlvbigKLSAgICAgICAgICAgICAgICBmV2luKTsKLSAgICAgICAgY2xvc2VQZXNwZWN0aXZlLnJ1bigpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBvcGVuaW5nIGEgcGVyc3BlY3RpdmUgd2l0aCBwbGFjZWhvbGRlcnMgZm9yIG11bHRpIGluc3RhbmNlIHZpZXdzLgotICAgICAqIFRoZSBwbGFjZWhvbGRlcnMgYXJlIGFkZGVkIGF0IHRvcCBsZXZlbCAobm90IGluIGFueSBmb2xkZXIpLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlblBlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0F0VG9wTGV2ZWwoKSB7Ci0gICAgICAgIFdvcmtiZW5jaFBhZ2UgcGFnZSA9IChXb3JrYmVuY2hQYWdlKSBmQWN0aXZlUGFnZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZldpbi5nZXRXb3JrYmVuY2goKS5zaG93UGVyc3BlY3RpdmUoCi0gICAgICAgICAgICAgICAgICAgIFBlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0F0VG9wTGV2ZWwuUEVSU1BfSUQsIGZXaW4pOwotICAgICAgICB9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBXb3JrYmVuY2hFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBlcnNwZWN0aXZlU3RhdGUgc3RhdGUgPSBuZXcgUGVyc3BlY3RpdmVTdGF0ZShwYWdlKTsKLSAgICAgICAgQXJyYXlMaXN0IHBhcnRJZHMgPSBzdGF0ZS5nZXRQYXJ0SWRzKG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnRJZHMuY29udGFpbnMoIioiKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydElkcy5jb250YWlucyhNb2NrVmlld1BhcnQuSURNVUxUKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydElkcy5jb250YWlucyhNb2NrVmlld1BhcnQuSURNVUxUICsgIjpzZWNvbmRhcnlJZCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0SWRzLmNvbnRhaW5zKE1vY2tWaWV3UGFydC5JRE1VTFQgKyAiOioiKSk7Ci0gICAgfQotCi0gICAvKioKLSAgICAgKiBUZXN0IG9wZW5pbmcgYSBwZXJzcGVjdGl2ZSB3aXRoIHBsYWNlaG9sZGVycyBmb3IgbXVsdGkgaW5zdGFuY2Ugdmlld3MuCi0gICAgICogVGhlIHBsYWNlaG9sZGVycyBhcmUgYWRkZWQgaW4gYSBwbGFjZWhvbGRlciBmb2xkZXIuCi0gICAgICogVGhpcyBpcyBhIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDcyMzgzIFtQZXJzcGVjdGl2ZXNdIFBsYWNlaG9sZGVyIGZvbGRlciBlcnJvciB3aXRoIG11bHRpcGxlIGluc3RhbmNlIHZpZXdzCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuUGVyc3BlY3RpdmVXaXRoTXVsdGlWaWV3UGxhY2Vob2xkZXJzSW5QbGFjZWhvbGRlckZvbGRlcigpIHsKLSAgICAgICAgV29ya2JlbmNoUGFnZSBwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIGZBY3RpdmVQYWdlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmV2luLmdldFdvcmtiZW5jaCgpLnNob3dQZXJzcGVjdGl2ZSgKLSAgICAgICAgICAgICAgICAgICAgUGVyc3BlY3RpdmVXaXRoTXVsdGlWaWV3UGxhY2Vob2xkZXJzSW5QbGFjZWhvbGRlckZvbGRlci5QRVJTUF9JRCwgZldpbik7Ci0gICAgICAgIH0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIFdvcmtiZW5jaEV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGVyc3BlY3RpdmVTdGF0ZSBzdGF0ZSA9IG5ldyBQZXJzcGVjdGl2ZVN0YXRlKHBhZ2UpOwotICAgICAgICBBcnJheUxpc3QgcGFydElkcyA9IHN0YXRlLmdldFBhcnRJZHMoInBsYWNlaG9sZGVyRm9sZGVyIik7Ci0gICAgICAgIGFzc2VydFRydWUocGFydElkcy5jb250YWlucygiKiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0SWRzLmNvbnRhaW5zKE1vY2tWaWV3UGFydC5JRE1VTFQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0SWRzLmNvbnRhaW5zKE1vY2tWaWV3UGFydC5JRE1VTFQgKyAiOnNlY29uZGFyeUlkIikpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnRJZHMuY29udGFpbnMoTW9ja1ZpZXdQYXJ0LklETVVMVCArICI6KiIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCBvcGVuaW5nIGEgcGVyc3BlY3RpdmUgd2l0aCBwbGFjZWhvbGRlcnMgZm9yIG11bHRpIGluc3RhbmNlIHZpZXdzLgotICAgICAqIFRoZSBwbGFjZWhvbGRlcnMgYXJlIGFkZGVkIGF0IHRvcCBsZXZlbCAobm90IGluIGFueSBmb2xkZXIpLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlblBlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0luRm9sZGVyKCkgewotICAgICAgICBXb3JrYmVuY2hQYWdlIHBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgZkFjdGl2ZVBhZ2U7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZXaW4uZ2V0V29ya2JlbmNoKCkuc2hvd1BlcnNwZWN0aXZlKAotICAgICAgICAgICAgICAgICAgICBQZXJzcGVjdGl2ZVdpdGhNdWx0aVZpZXdQbGFjZWhvbGRlcnNJbkZvbGRlci5QRVJTUF9JRCwgZldpbik7Ci0gICAgICAgIH0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIFdvcmtiZW5jaEV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGVyc3BlY3RpdmVTdGF0ZSBzdGF0ZSA9IG5ldyBQZXJzcGVjdGl2ZVN0YXRlKHBhZ2UpOwotICAgICAgICBBcnJheUxpc3QgcGFydElkcyA9IHN0YXRlLmdldFBhcnRJZHMoImZvbGRlciIpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnRJZHMuY29udGFpbnMoIioiKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydElkcy5jb250YWlucyhNb2NrVmlld1BhcnQuSURNVUxUKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydElkcy5jb250YWlucyhNb2NrVmlld1BhcnQuSURNVUxUICsgIjpzZWNvbmRhcnlJZCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0SWRzLmNvbnRhaW5zKE1vY2tWaWV3UGFydC5JRE1VTFQgKyAiOioiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGdldE5ld1dpemFyZFNob3J0Y3V0cygpIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmV3V2l6YXJkU2hvcnRjdXRzKCkgewotICAgICAgICBTdHJpbmdbXSBzaG9ydGN1dHMgPSBmQWN0aXZlUGFnZS5nZXROZXdXaXphcmRTaG9ydGN1dHMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzaG9ydGN1dHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc2hvcnRjdXRzLmxlbmd0aCk7Ci0gICAgICAgIAotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbiA9IG9wZW5UZXN0V2luZG93KElERS5SRVNPVVJDRV9QRVJTUEVDVElWRV9JRCk7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW4uZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBzaG9ydGN1dHMgPSBwYWdlLmdldE5ld1dpemFyZFNob3J0Y3V0cygpOwotICAgICAgICBMaXN0IHNob3J0Y3V0TGlzdCA9IEFycmF5cy5hc0xpc3Qoc2hvcnRjdXRzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzaG9ydGN1dExpc3QuY29udGFpbnMoIm9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZvbGRlciIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzaG9ydGN1dExpc3QuY29udGFpbnMoIm9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZpbGUiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGdldFNob3dWaWV3U2hvcnRjdXRzKCkgbWV0aG9kLgotICAgICAqCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaG93Vmlld1Nob3J0Y3V0cygpIHsKLSAgICAgICAgU3RyaW5nW10gc2hvcnRjdXRzID0gZkFjdGl2ZVBhZ2UuZ2V0U2hvd1ZpZXdTaG9ydGN1dHMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzaG9ydGN1dHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc2hvcnRjdXRzLmxlbmd0aCk7Ci0gICAgICAgIAotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbiA9IG9wZW5UZXN0V2luZG93KElERS5SRVNPVVJDRV9QRVJTUEVDVElWRV9JRCk7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW4uZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBzaG9ydGN1dHMgPSBwYWdlLmdldFNob3dWaWV3U2hvcnRjdXRzKCk7Ci0gICAgICAgIExpc3Qgc2hvcnRjdXRMaXN0ID0gQXJyYXlzLmFzTGlzdChzaG9ydGN1dHMpOwotICAgICAgICBhc3NlcnRUcnVlKHNob3J0Y3V0TGlzdC5jb250YWlucyhJUGFnZUxheW91dC5JRF9SRVNfTkFWKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2hvcnRjdXRMaXN0LmNvbnRhaW5zKElQYWdlTGF5b3V0LklEX09VVExJTkUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzaG9ydGN1dExpc3QuY29udGFpbnMoSVBhZ2VMYXlvdXQuSURfUFJPUF9TSEVFVCkpOwotICAgICAgICBhc3NlcnRUcnVlKHNob3J0Y3V0TGlzdC5jb250YWlucyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgZ2V0UGVyc3BlY3RpdmVTaG9ydGN1dHMoKSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFBlcnNwZWN0aXZlU2hvcnRjdXRzKCkgewotICAgICAgICBTdHJpbmdbXSBzaG9ydGN1dHMgPSBmQWN0aXZlUGFnZS5nZXRQZXJzcGVjdGl2ZVNob3J0Y3V0cygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNob3J0Y3V0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBzaG9ydGN1dHMubGVuZ3RoKTsKLSAgICAgICAgLy8gbm90IG11Y2ggb2YgYSB0ZXN0Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBnZXRPcGVuUGVyc3BlY3RpdmVzKCkgbWV0aG9kLgotICAgICAqCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPcGVuUGVyc3BlY3RpdmVzKCkgewotICAgICAgICBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yW10gb3BlblBlcnNwcyA9IGZBY3RpdmVQYWdlLmdldE9wZW5QZXJzcGVjdGl2ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG9wZW5QZXJzcHMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQsIG9wZW5QZXJzcHNbMF0uZ2V0SWQoKSk7Ci0gICAgICAgIAotICAgICAgICBJUGVyc3BlY3RpdmVSZWdpc3RyeSByZWcgPSBmV29ya2JlbmNoLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLSAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciByZXNvdXJjZVBlcnNwID0gcmVnLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChJREUuUkVTT1VSQ0VfUEVSU1BFQ1RJVkVfSUQpOwotICAgICAgICBmQWN0aXZlUGFnZS5zZXRQZXJzcGVjdGl2ZShyZXNvdXJjZVBlcnNwKTsKLSAgICAgICAgb3BlblBlcnNwcyA9IGZBY3RpdmVQYWdlLmdldE9wZW5QZXJzcGVjdGl2ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG9wZW5QZXJzcHMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQsIG9wZW5QZXJzcHNbMF0uZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJREUuUkVTT1VSQ0VfUEVSU1BFQ1RJVkVfSUQsIG9wZW5QZXJzcHNbMV0uZ2V0SWQoKSk7Ci0gICAgICAgIAotICAgICAgICBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGVtcHR5UGVyc3AgPSByZWcuZmluZFBlcnNwZWN0aXZlV2l0aElkKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQpOwotICAgICAgICBmQWN0aXZlUGFnZS5zZXRQZXJzcGVjdGl2ZShlbXB0eVBlcnNwKTsKLSAgICAgICAgb3BlblBlcnNwcyA9IGZBY3RpdmVQYWdlLmdldE9wZW5QZXJzcGVjdGl2ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG9wZW5QZXJzcHMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQsIG9wZW5QZXJzcHNbMF0uZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJREUuUkVTT1VSQ0VfUEVSU1BFQ1RJVkVfSUQsIG9wZW5QZXJzcHNbMV0uZ2V0SWQoKSk7Ci0gICAgICAgIAotICAgICAgICBmQWN0aXZlUGFnZS5jbG9zZUFsbFBlcnNwZWN0aXZlcyhmYWxzZSwgZmFsc2UpOwotICAgICAgICBvcGVuUGVyc3BzID0gZkFjdGl2ZVBhZ2UuZ2V0T3BlblBlcnNwZWN0aXZlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgb3BlblBlcnNwcy5sZW5ndGgpOwotICAgICAgICAKLSAgICAgICAgZkFjdGl2ZVBhZ2UuY2xvc2UoKTsKLSAgICAgICAgb3BlblBlcnNwcyA9IGZBY3RpdmVQYWdlLmdldE9wZW5QZXJzcGVjdGl2ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG9wZW5QZXJzcHMubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgZ2V0U29ydGVkUGVyc3BlY3RpdmVzKCkgbWV0aG9kLgotICAgICAqCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTb3J0ZWRQZXJzcGVjdGl2ZXMoKSB7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3JbXSBvcGVuUGVyc3BzID0gZkFjdGl2ZVBhZ2UuZ2V0U29ydGVkUGVyc3BlY3RpdmVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBvcGVuUGVyc3BzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lELCBvcGVuUGVyc3BzWzBdLmdldElkKCkpOwotICAgICAgICAKLSAgICAgICAgSVBlcnNwZWN0aXZlUmVnaXN0cnkgcmVnID0gZldvcmtiZW5jaC5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCk7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcmVzb3VyY2VQZXJzcCA9IHJlZy5maW5kUGVyc3BlY3RpdmVXaXRoSWQoSURFLlJFU09VUkNFX1BFUlNQRUNUSVZFX0lEKTsKLSAgICAgICAgZkFjdGl2ZVBhZ2Uuc2V0UGVyc3BlY3RpdmUocmVzb3VyY2VQZXJzcCk7Ci0gICAgICAgIG9wZW5QZXJzcHMgPSBmQWN0aXZlUGFnZS5nZXRTb3J0ZWRQZXJzcGVjdGl2ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG9wZW5QZXJzcHMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQsIG9wZW5QZXJzcHNbMF0uZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJREUuUkVTT1VSQ0VfUEVSU1BFQ1RJVkVfSUQsIG9wZW5QZXJzcHNbMV0uZ2V0SWQoKSk7Ci0gICAgICAgIAotICAgICAgICBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGVtcHR5UGVyc3AgPSByZWcuZmluZFBlcnNwZWN0aXZlV2l0aElkKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQpOwotICAgICAgICBmQWN0aXZlUGFnZS5zZXRQZXJzcGVjdGl2ZShlbXB0eVBlcnNwKTsKLSAgICAgICAgb3BlblBlcnNwcyA9IGZBY3RpdmVQYWdlLmdldFNvcnRlZFBlcnNwZWN0aXZlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgb3BlblBlcnNwcy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSURFLlJFU09VUkNFX1BFUlNQRUNUSVZFX0lELCBvcGVuUGVyc3BzWzBdLmdldElkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCwgb3BlblBlcnNwc1sxXS5nZXRJZCgpKTsKLSAgICAgICAgCi0gICAgICAgIGZBY3RpdmVQYWdlLmNsb3NlQWxsUGVyc3BlY3RpdmVzKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIG9wZW5QZXJzcHMgPSBmQWN0aXZlUGFnZS5nZXRTb3J0ZWRQZXJzcGVjdGl2ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG9wZW5QZXJzcHMubGVuZ3RoKTsKLSAgICAgICAgCi0gICAgICAgIGZBY3RpdmVQYWdlLmNsb3NlKCk7Ci0gICAgICAgIG9wZW5QZXJzcHMgPSBmQWN0aXZlUGFnZS5nZXRTb3J0ZWRQZXJzcGVjdGl2ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG9wZW5QZXJzcHMubGVuZ3RoKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNsb3NlUGVyc3BlY3RpdmUgbWV0aG9kLgotICAgICAqCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVBlcnNwZWN0aXZlKCkgewotICAgICAgICAvLyBUT0RPOiBOZWVkIHRvIHRlc3QgdmFyaWFudHMgd2l0aCBzYXZlRWRpdG9ycz09dHJ1ZQotICAgICAgICAKLSAgICAgICAgSVBlcnNwZWN0aXZlUmVnaXN0cnkgcmVnID0gZldvcmtiZW5jaC5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCk7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZW1wdHlQZXJzcCA9IHJlZy5maW5kUGVyc3BlY3RpdmVXaXRoSWQoRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCk7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcmVzb3VyY2VQZXJzcCA9IHJlZy5maW5kUGVyc3BlY3RpdmVXaXRoSWQoSURFLlJFU09VUkNFX1BFUlNQRUNUSVZFX0lEKTsKLQotICAgICAgICBmQWN0aXZlUGFnZS5zZXRQZXJzcGVjdGl2ZShyZXNvdXJjZVBlcnNwKTsKLSAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvcltdIG9wZW5QZXJzcHMgPSBmQWN0aXZlUGFnZS5nZXRPcGVuUGVyc3BlY3RpdmVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBvcGVuUGVyc3BzLmxlbmd0aCk7Ci0gICAgICAgIAotICAgICAgICBmQWN0aXZlUGFnZS5jbG9zZVBlcnNwZWN0aXZlKHJlc291cmNlUGVyc3AsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIG9wZW5QZXJzcHMgPSBmQWN0aXZlUGFnZS5nZXRPcGVuUGVyc3BlY3RpdmVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBvcGVuUGVyc3BzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lELCBvcGVuUGVyc3BzWzBdLmdldElkKCkpOwotICAgICAgICAKLSAgICAgICAgZkFjdGl2ZVBhZ2UuY2xvc2VQZXJzcGVjdGl2ZShlbXB0eVBlcnNwLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZkFjdGl2ZVBhZ2UsIGZXaW4uZ2V0QWN0aXZlUGFnZSgpKTsgIC8vIHBhZ2Ugbm90IGNsb3NlZAotICAgICAgICBvcGVuUGVyc3BzID0gZkFjdGl2ZVBhZ2UuZ2V0T3BlblBlcnNwZWN0aXZlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgb3BlblBlcnNwcy5sZW5ndGgpOwotICAgICAgICAKLSAgICAgICAgZkFjdGl2ZVBhZ2Uuc2V0UGVyc3BlY3RpdmUoZW1wdHlQZXJzcCk7Ci0gICAgICAgIG9wZW5QZXJzcHMgPSBmQWN0aXZlUGFnZS5nZXRPcGVuUGVyc3BlY3RpdmVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBvcGVuUGVyc3BzLmxlbmd0aCk7Ci0KLSAgICAgICAgZkFjdGl2ZVBhZ2UuY2xvc2VQZXJzcGVjdGl2ZShlbXB0eVBlcnNwLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIG9wZW5QZXJzcHMgPSBmQWN0aXZlUGFnZS5nZXRPcGVuUGVyc3BlY3RpdmVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBvcGVuUGVyc3BzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydE51bGwoZldpbi5nZXRBY3RpdmVQYWdlKCkpOyAgLy8gcGFnZSBjbG9zZWQKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNsb3NlQWxsUGVyc3BlY3RpdmVzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VBbGxQZXJzcGVjdGl2ZXMoKSB7Ci0gICAgICAgIC8vIFRPRE86IE5lZWQgdG8gdGVzdCB2YXJpYW50cyB3aXRoIHNhdmVFZGl0b3JzPT10cnVlCi0gICAgICAgIAotICAgICAgICBJUGVyc3BlY3RpdmVSZWdpc3RyeSByZWcgPSBmV29ya2JlbmNoLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLSAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBlbXB0eVBlcnNwID0gcmVnLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lEKTsKLSAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciByZXNvdXJjZVBlcnNwID0gcmVnLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChJREUuUkVTT1VSQ0VfUEVSU1BFQ1RJVkVfSUQpOwotCi0gICAgICAgIGZBY3RpdmVQYWdlLnNldFBlcnNwZWN0aXZlKHJlc291cmNlUGVyc3ApOwotICAgICAgICBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yW10gb3BlblBlcnNwcyA9IGZBY3RpdmVQYWdlLmdldE9wZW5QZXJzcGVjdGl2ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG9wZW5QZXJzcHMubGVuZ3RoKTsKLSAgICAgICAgCi0gICAgICAgIGZBY3RpdmVQYWdlLmNsb3NlQWxsUGVyc3BlY3RpdmVzKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmQWN0aXZlUGFnZSwgZldpbi5nZXRBY3RpdmVQYWdlKCkpOyAgLy8gcGFnZSBub3QgY2xvc2VkCi0gICAgICAgIG9wZW5QZXJzcHMgPSBmQWN0aXZlUGFnZS5nZXRPcGVuUGVyc3BlY3RpdmVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBvcGVuUGVyc3BzLmxlbmd0aCk7Ci0KLSAgICAgICAgZkFjdGl2ZVBhZ2Uuc2V0UGVyc3BlY3RpdmUoZW1wdHlQZXJzcCk7Ci0gICAgICAgIG9wZW5QZXJzcHMgPSBmQWN0aXZlUGFnZS5nZXRPcGVuUGVyc3BlY3RpdmVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBvcGVuUGVyc3BzLmxlbmd0aCk7Ci0KLSAgICAgICAgZkFjdGl2ZVBhZ2UuY2xvc2VBbGxQZXJzcGVjdGl2ZXMoZmFsc2UsIHRydWUpOwotICAgICAgICBvcGVuUGVyc3BzID0gZkFjdGl2ZVBhZ2UuZ2V0T3BlblBlcnNwZWN0aXZlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgb3BlblBlcnNwcy5sZW5ndGgpOwotICAgICAgICBhc3NlcnROdWxsKGZXaW4uZ2V0QWN0aXZlUGFnZSgpKTsgIC8vIHBhZ2UgY2xvc2VkCi0gICAgfSAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWdyZXNzaW9uIHRlc3QgZm9yIEJ1ZyA3NjI4NSBbUHJlc2VudGF0aW9uc10gRm9sZGVyIHRhYiBkb2VzIG5vdCBpbmRpY2F0ZSBjdXJyZW50IHZpZXcuCi0gICAgICogVGVzdHMgdGhhdCwgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBwZXJzcGVjdGl2ZXMsIHRoZSByZW1lbWJlcmVkIG9sZCBwYXJ0IGNvcnJlY3RseQotICAgICAqIGhhbmRsZXMgbXVsdGktdmlldyBpbnN0YW5jZXMuIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RCdWc3NjI4NSgpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGZBY3RpdmVQYWdlOwotICAgICAgICBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIG9yaWdpbmFsUGVyc3AgPSBwYWdlLmdldFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgIElQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcmVzb3VyY2VQZXJzcCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIElERS5SRVNPVVJDRV9QRVJTUEVDVElWRV9JRCk7Ci0gICAgICAgIC8vIHRlc3QgcmVxdWlyZXMgc3dpdGNoaW5nIGJldHdlZW4gdHdvIGRpZmZlcmVudCBwZXJzcGVjdGl2ZXMKLSAgICAgICAgYXNzZXJ0Tm90U2FtZShvcmlnaW5hbFBlcnNwLCByZXNvdXJjZVBlcnNwKTsKLSAgICAgICAgCi0gICAgICAgIGludCBuID0gNTsKLSAgICAgICAgSVZpZXdQYXJ0W10gdmlld3MgPSBuZXcgSVZpZXdQYXJ0W25dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB2aWV3c1tpXSA9IHBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklETVVMVCwgSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKGkpLCBJV29ya2JlbmNoUGFnZS5WSUVXX0NSRUFURSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHBhZ2UuZ2V0Vmlld3MoKS5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgcGFnZS5hY3RpdmF0ZSh2aWV3c1tpXSk7Ci0gICAgICAgICAgICBwYWdlLnNldFBlcnNwZWN0aXZlKHJlc291cmNlUGVyc3ApOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UocGFnZS5nZXRBY3RpdmVQYXJ0KCkgaW5zdGFuY2VvZiBNb2NrVmlld1BhcnQpOwotICAgICAgICAgICAgcGFnZS5zZXRQZXJzcGVjdGl2ZShvcmlnaW5hbFBlcnNwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh2aWV3c1tpXSwgcGFnZS5nZXRBY3RpdmVQYXJ0KCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgSVNob3dFZGl0b3JJbnB1dC5zaG93RWRpdG9ySW5wdXQgaXMgY2FsbGVkIHdoZW4gYQotICAgICAqIG1hdGNoaW5nIGVkaXRvciBpcyBmb3VuZCBkdXJpbmcgb3BlbkVkaXRvciwgYW5kIGlzIG5vdCBjYWxsZWQKLSAgICAgKiB3aGVuIGEgbmV3IGVkaXRvciBpcyBvcGVuZWQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93RWRpdG9ySW5wdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGZBY3RpdmVQYWdlOwotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdFNob3dFZGl0b3JJbnB1dCIpOwotICAgICAgICBJRmlsZSBmaWxlID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgiYS5tb2NrMSIsIHByb2opOwotICAgICAgICBNb2NrRWRpdG9yUGFydCBwYXJ0MSA9IChNb2NrRWRpdG9yUGFydCkgSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHBhcnQxLmdldENhbGxIaXN0b3J5KCkuY29udGFpbnMoInNob3dFZGl0b3JJbnB1dCIpKTsKLQotICAgICAgICBNb2NrRWRpdG9yUGFydCBwYXJ0MiA9IChNb2NrRWRpdG9yUGFydCkgSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydDEgPT0gcGFydDIpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnQyLmdldENhbGxIaXN0b3J5KCkuY29udGFpbnMoInNob3dFZGl0b3JJbnB1dCIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgb3BlbkVkaXRvciBhbmQgZmluZEVkaXRvciB2YXJpYW50cyB0aGF0IGFjY2VwdHMgbWF0Y2ggZmxhZ3Mgd29yayBhcyBleHBlY3RlZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbmRGaW5kRWRpdG9yV2l0aE1hdGNoRmxhZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGZBY3RpdmVQYWdlOwotICAgICAgICBwcm9qID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE9wZW5FZGl0b3JNYXRjaEZsYWdzIik7Ci0gICAgICAgIElGaWxlIGZpbGUxID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgiYS5tb2NrMSIsIHByb2opOwotICAgICAgICBJRmlsZSBmaWxlMiA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoImEubW9jazIiLCBwcm9qKTsKLSAgICAgICAgRmlsZUVkaXRvcklucHV0IGlucHV0MSA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZTEpOwotICAgICAgICBGaWxlRWRpdG9ySW5wdXQgaW5wdXQyID0gbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlMik7Ci0gICAgICAgIFN0cmluZyBpZDEgPSBNb2NrRWRpdG9yUGFydC5JRDE7Ci0gICAgICAgIFN0cmluZyBpZDIgPSBNb2NrRWRpdG9yUGFydC5JRDI7Ci0gICAgICAgIAotICAgICAgICAvLyBmaXJzdCBlZGl0b3IgKG5vIG1hdGNoKQotICAgICAgICBNb2NrRWRpdG9yUGFydCBwYXJ0MSA9IChNb2NrRWRpdG9yUGFydCkgcGFnZS5vcGVuRWRpdG9yKGlucHV0MSwgaWQxLCB0cnVlLCBJV29ya2JlbmNoUGFnZS5NQVRDSF9JTlBVVCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFydDEpOwotICAgICAgICAKLSAgICAgICAgLy8gc2FtZSBpbnB1dCwgc2FtZSBpZCwgbWF0Y2hpbmcgaW5wdXQgKHNob3VsZCBtYXRjaCBwYXJ0MSkKLSAgICAgICAgTW9ja0VkaXRvclBhcnQgcGFydDIgPSAoTW9ja0VkaXRvclBhcnQpIHBhZ2Uub3BlbkVkaXRvcihpbnB1dDEsIGlkMSwgdHJ1ZSwgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSU5QVVQpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnQxID09IHBhcnQyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHNhbWUgaW5wdXQsIGRpZmZlcmVudCBpZCwgbWF0Y2hpbmcgaW5wdXQgKHNob3VsZCBtYXRjaCBwYXJ0MSkKLSAgICAgICAgTW9ja0VkaXRvclBhcnQgcGFydDMgPSAoTW9ja0VkaXRvclBhcnQpIHBhZ2Uub3BlbkVkaXRvcihpbnB1dDEsIGlkMiwgdHJ1ZSwgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSU5QVVQpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnQxID09IHBhcnQzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHNhbWUgaW5wdXQsIGRpZmZlcmVudCBpZCwgbWF0Y2hpbmcgaW5wdXQgYW5kIGlkIChubyBtYXRjaCkKLSAgICAgICAgTW9ja0VkaXRvclBhcnQgcGFydDQgPSAoTW9ja0VkaXRvclBhcnQpIHBhZ2Uub3BlbkVkaXRvcihpbnB1dDEsIGlkMiwgdHJ1ZSwgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSU5QVVQgfCBJV29ya2JlbmNoUGFnZS5NQVRDSF9JRCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFydDQpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnQ0ICE9IHBhcnQxKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHNhbWUgaW5wdXQsIHNhbWUgaWQsIG1hdGNoaW5nIG5vdGhpbmcgKG5vIG1hdGNoKQotICAgICAgICBNb2NrRWRpdG9yUGFydCBwYXJ0NSA9IChNb2NrRWRpdG9yUGFydCkgcGFnZS5vcGVuRWRpdG9yKGlucHV0MSwgaWQxLCB0cnVlLCBJV29ya2JlbmNoUGFnZS5NQVRDSF9OT05FKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJ0NSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydDUgIT0gcGFydDEpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnQ1ICE9IHBhcnQ0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGRpZmZlcmVudCBpbnB1dCwgc2FtZSBpZCwgbWF0Y2hpbmcgaWQgKHNob3VsZCBtYXRjaCBwYXJ0NSBpbnN0ZWFkIG9mIHBhcnQxLCBiZWNhdXNlIGl0IHdhcyBhY3RpdmUpCi0gICAgICAgIE1vY2tFZGl0b3JQYXJ0IHBhcnQ2ID0gKE1vY2tFZGl0b3JQYXJ0KSBwYWdlLm9wZW5FZGl0b3IoaW5wdXQyLCBpZDEsIHRydWUsIElXb3JrYmVuY2hQYWdlLk1BVENIX0lEKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0NiA9PSBwYXJ0NSk7Ci0gICAgICAgIAotICAgICAgICAvLyBkaWZmZXJlbnQgaW5wdXQsIGRpZmZlcmVudCBpZCwgbWF0Y2hpbmcgaW5wdXQgYW5kIGlkIChubyBtYXRjaCkKLSAgICAgICAgTW9ja0VkaXRvclBhcnQgcGFydDcgPSAoTW9ja0VkaXRvclBhcnQpIHBhZ2Uub3BlbkVkaXRvcihpbnB1dDIsIGlkMiwgdHJ1ZSwgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSU5QVVQgfCBJV29ya2JlbmNoUGFnZS5NQVRDSF9JRCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFydDcpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnQ3ICE9IHBhcnQxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0NyAhPSBwYXJ0NCk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydDcgIT0gcGFydDUpOwotCi0gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZXJlIGFyZSA0IGVkaXRvcnMgb3BlbjogCi0gICAgICAgIC8vICAgcGFydDEgKGlucHV0MSwgaWQxKSwgcGFydDQgKGlucHV0MSwgaWQyKSwgcGFydDUgKGlucHV0MSwgaWQxKSwgYW5kIHBhcnQ3IChpbnB1dDIsIGlkMikuCi0gICAgICAgIC8vIHdpdGggcGFydDcgYWN0aXZlLgotICAgICAgICAKLSAgICAgICAgLy8gZmluZCB3aXRoIE1BVENIX05PTkUgaXMgYWx3YXlzIGVtcHR5Ci0gICAgICAgIElFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gcGFnZS5maW5kRWRpdG9ycyhpbnB1dDEsIGlkMSwgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfTk9ORSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCByZWZzLmxlbmd0aCk7Ci0KLSAgICAgICAgLy8gZmluZCBpbnB1dDEgd2l0aCBNQVRDSF9JTlBVVCBmaW5kcyAzIGVkaXRvcnM6IHBhcnQxLCBwYXJ0NCBhbmQgcGFydDUgKGluIG9yZGVyKQotICAgICAgICByZWZzID0gcGFnZS5maW5kRWRpdG9ycyhpbnB1dDEsIG51bGwsIElXb3JrYmVuY2hQYWdlLk1BVENIX0lOUFVUKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlZnMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnQxLCByZWZzWzBdLmdldFBhcnQodHJ1ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFydDQsIHJlZnNbMV0uZ2V0UGFydCh0cnVlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJ0NSwgcmVmc1syXS5nZXRQYXJ0KHRydWUpKTsKLQotICAgICAgICAvLyBmaW5kIGlucHV0MiB3aXRoIE1BVENIX0lOUFVUIGZpbmRzIDEgZWRpdG9yOiBwYXJ0NwotICAgICAgICByZWZzID0gcGFnZS5maW5kRWRpdG9ycyhpbnB1dDIsIG51bGwsIElXb3JrYmVuY2hQYWdlLk1BVENIX0lOUFVUKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlZnMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnQ3LCByZWZzWzBdLmdldFBhcnQodHJ1ZSkpOwotICAgICAgICAKLSAgICAgICAgLy8gZmluZCBpZDEgd2l0aCBNQVRDSF9JRCBmaW5kcyAyIGVkaXRvcnM6IHBhcnQxIGFuZCBwYXJ0NSAoaW4gb3JkZXIpCi0gICAgICAgIHJlZnMgPSBwYWdlLmZpbmRFZGl0b3JzKG51bGwsIGlkMSwgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSUQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVmcy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFydDEsIHJlZnNbMF0uZ2V0UGFydCh0cnVlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJ0NSwgcmVmc1sxXS5nZXRQYXJ0KHRydWUpKTsKLQotICAgICAgICAvLyBmaW5kIGlkMiB3aXRoIE1BVENIX0lEIGZpbmRzIDIgZWRpdG9yczogcGFydDQgYW5kIHBhcnQ3ICh3aXRoIHBhcnQ3IGZpcnN0IGJlY2F1c2UgaXQgd2FzIGFjdGl2ZSkKLSAgICAgICAgcmVmcyA9IHBhZ2UuZmluZEVkaXRvcnMobnVsbCwgaWQyLCBJV29ya2JlbmNoUGFnZS5NQVRDSF9JRCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZWZzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJ0NywgcmVmc1swXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnQ0LCByZWZzWzFdLmdldFBhcnQodHJ1ZSkpOwotCi0gICAgICAgIC8vIGZpbmQgaW5wdXQxIGFuZCBpZDEgd2l0aCBNQVRDSF9JTlBVVCBhbmQgTUFUQ0hfSUQgZmluZHMgMiBlZGl0b3JzOiBwYXJ0MSBhbmQgcGFydDUgKGluIG9yZGVyKQotICAgICAgICByZWZzID0gcGFnZS5maW5kRWRpdG9ycyhpbnB1dDEsIGlkMSwgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSU5QVVQgfCBJV29ya2JlbmNoUGFnZS5NQVRDSF9JRCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZWZzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJ0MSwgcmVmc1swXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnQ1LCByZWZzWzFdLmdldFBhcnQodHJ1ZSkpOwotCi0gICAgICAgIC8vIGZpbmQgaW5wdXQxIGFuZCBpZDIgd2l0aCBNQVRDSF9JTlBVVCBhbmQgTUFUQ0hfSUQgZmluZHMgMSBlZGl0b3JzOiBwYXJ0NAotICAgICAgICByZWZzID0gcGFnZS5maW5kRWRpdG9ycyhpbnB1dDEsIGlkMiwgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSU5QVVQgfCBJV29ya2JlbmNoUGFnZS5NQVRDSF9JRCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZWZzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJ0NCwgcmVmc1swXS5nZXRQYXJ0KHRydWUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2JlbmNoUGFydFNpdGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2JlbmNoUGFydFNpdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYTZjOTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVdvcmtiZW5jaFBhcnRTaXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyB0aGUgc2l0ZSBmb3IgYW4gSVdvcmtiZW5jaFBhcnQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJV29ya2JlbmNoUGFydFNpdGVUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpbmRvdyBmV2luZG93OwotCi0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hQYWdlIGZQYWdlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIElXb3JrYmVuY2hQYXJ0U2l0ZVRlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtiZW5jaFBhcnRTaXRlVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICBmV2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICAgICAgZlBhZ2UgPSBmV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiUmV0dXJucyB0aGUgcGFydCByZWdpc3RyeSBleHRlbnNpb24gaWQgZm9yIAotICAgICAgICAvLyB0aGlzIHdvcmtiZW5jaCBzaXRlJ3MgcGFydC4iCi0KLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IGNyZWF0ZVRlc3RQYXJ0KGZQYWdlKTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSBwYXJ0LmdldFNpdGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFRlc3RQYXJ0SWQoKSwgc2l0ZS5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFnZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBGcm9tIEphdmFkb2M6ICJSZXR1cm5zIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhpcyB3b3JrYmVuY2ggCi0gICAgICAgIC8vIHNpdGUncyBwYXJ0LiIKLQotICAgICAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gY3JlYXRlVGVzdFBhcnQoZlBhZ2UpOwotICAgICAgICBJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IHBhcnQuZ2V0U2l0ZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZlBhZ2UsIHNpdGUuZ2V0UGFnZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGx1Z2luSWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiUmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIAotICAgICAgICAvLyBwbHVnLWluIHRoYXQgZGVmaW5lcyB0aGlzIHdvcmtiZW5jaCBzaXRlJ3MgcGFydC4iCi0KLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IGNyZWF0ZVRlc3RQYXJ0KGZQYWdlKTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSBwYXJ0LmdldFNpdGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFRlc3RQYXJ0UGx1Z2luSWQoKSwgc2l0ZS5nZXRQbHVnaW5JZCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVnaXN0ZXJlZE5hbWUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiUmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBuYW1lIGZvciB0aGlzIAotICAgICAgICAvLyB3b3JrYmVuY2ggc2l0ZSdzIHBhcnQuIgotCi0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHBhcnQgPSBjcmVhdGVUZXN0UGFydChmUGFnZSk7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gcGFydC5nZXRTaXRlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhnZXRUZXN0UGFydE5hbWUoKSwgc2l0ZS5nZXRSZWdpc3RlcmVkTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2hlbGwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiUmV0dXJucyB0aGUgc2hlbGwgY29udGFpbmluZyB0aGlzIAotICAgICAgICAvLyB3b3JrYmVuY2ggc2l0ZSdzIHBhcnQiCi0KLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IGNyZWF0ZVRlc3RQYXJ0KGZQYWdlKTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSBwYXJ0LmdldFNpdGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZXaW5kb3cuZ2V0U2hlbGwoKSwgc2l0ZS5nZXRTaGVsbCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya2JlbmNoV2luZG93KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIEZyb20gSmF2YWRvYzogIlJldHVybnMgdGhlIHdvcmtiZW5jaCB3aW5kb3cgCi0gICAgICAgIC8vIGNvbnRhaW5pbmcgdGhpcyB3b3JrYmVuY2ggc2l0ZSdzIHBhcnQuIgotCi0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHBhcnQgPSBjcmVhdGVUZXN0UGFydChmUGFnZSk7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gcGFydC5nZXRTaXRlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmV2luZG93LCBzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2VsZWN0aW9uUHJvdmlkZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiJ0dldCcgcmV0dXJucyB0aGUgc2VsZWN0aW9uIHByb3ZpZGVyIAotICAgICAgICAvLyBmb3IgdGhpcyB3b3JrYmVuY2ggc2l0ZSdzIHBhcnQuICAKLQotICAgICAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gY3JlYXRlVGVzdFBhcnQoZlBhZ2UpOwotICAgICAgICBJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IHBhcnQuZ2V0U2l0ZSgpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnQgaW5zdGFuY2VvZiBNb2NrV29ya2JlbmNoUGFydCk7Ci0gICAgICAgIE1vY2tXb3JrYmVuY2hQYXJ0IG1vY2sgPSAoTW9ja1dvcmtiZW5jaFBhcnQpIHBhcnQ7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtb2NrLmdldFNlbGVjdGlvblByb3ZpZGVyKCksIHNpdGUuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFNlbGVjdGlvblByb3ZpZGVyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIEZyb20gSmF2YWRvYzogJ1NldCcgc2V0cyB0aGUgc2VsZWN0aW9uIHByb3ZpZGVyLgotCi0gICAgICAgIC8vIFNldCBzZWxlY3Rpb24gcHJvdmlkZXIgdG8gbnVsbC4KLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IGNyZWF0ZVRlc3RQYXJ0KGZQYWdlKTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSBwYXJ0LmdldFNpdGUoKTsKLSAgICAgICAgc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcihudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChzaXRlLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpOwotCi0gICAgICAgIC8vIFNldCBzZWxlY3Rpb24gcHJvdmlkZXIgdG8gcmVhbC4KLSAgICAgICAgTW9ja1NlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IE1vY2tTZWxlY3Rpb25Qcm92aWRlcigpOwotICAgICAgICBzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHByb3ZpZGVyLCBzaXRlLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0ZXN0IHBhcnQgaW4gdGhlIHBhZ2UuCQotICAgICAqLwotICAgIGFic3RyYWN0IHByb3RlY3RlZCBJV29ya2JlbmNoUGFydCBjcmVhdGVUZXN0UGFydChJV29ya2JlbmNoUGFnZSBwYWdlKQotICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGV4cGVjdGVkIGlkIGZvciBhIHRlc3QgcGFydC4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldFRlc3RQYXJ0SWQoKSB0aHJvd3MgVGhyb3dhYmxlOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXhwZWN0ZWQgbmFtZSBmb3IgYSB0ZXN0IHBhcnQuCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBnZXRUZXN0UGFydE5hbWUoKSB0aHJvd3MgVGhyb3dhYmxlOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXhwZWN0ZWQgaWQgZm9yIGEgdGVzdCBwYXJ0IHBsdWdpbi4gIFN1YmNsYXNzZXMgbWF5Ci0gICAgICogb3ZlcnJpZGUgdGhpcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRlc3RQYXJ0UGx1Z2luSWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgcmV0dXJuICJvcmcuZWNsaXBzZS51aS50ZXN0cyI7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2JlbmNoUGFydFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lXb3JrYmVuY2hQYXJ0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWExMjc0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lXb3JrYmVuY2hQYXJ0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkNhbGxIaXN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRoaXMgaXMgYSB0ZXN0IGZvciBJV29ya2JlbmNoUGFydC4gIFNpbmNlIElXb3JrYmVuY2hQYXJ0IGlzIGFuCi0gKiBpbnRlcmZhY2UgdGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBJV29ya2JlbmNoUGFydCBsaWZlY3ljbGUgcmF0aGVyCi0gKiB0aGFuIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIElXb3JrYmVuY2hQYXJ0VGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgZldpbmRvdzsKLQotICAgIHByb3RlY3RlZCBJV29ya2JlbmNoUGFnZSBmUGFnZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJQWN0aW9uRGVsZWdhdGVUZXN0Ci0gICAgICovCi0gICAgcHVibGljIElXb3JrYmVuY2hQYXJ0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICBmV2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICAgICAgZlBhZ2UgPSBmV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZENsb3NlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIE9wZW4gYSBwYXJ0LgotICAgICAgICBNb2NrUGFydCBwYXJ0ID0gb3BlblBhcnQoZlBhZ2UpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnQuaXNTaXRlSW5pdGlhbGl6ZWQoKSk7Ci0gICAgICAgIENhbGxIaXN0b3J5IGhpc3RvcnkgPSBwYXJ0LmdldENhbGxIaXN0b3J5KCk7Ci0gICAgICAgIGFzc2VydFRydWUoaGlzdG9yeS52ZXJpZnlPcmRlcihuZXcgU3RyaW5nW10geyAic2V0SW5pdGlhbGl6YXRpb25EYXRhIiwgImluaXQiLAotICAgICAgICAgICAgICAgICJjcmVhdGVQYXJ0Q29udHJvbCIsICJzZXRGb2N1cyIgfSkpOwotCi0gICAgICAgIC8vIENsb3NlIHRoZSBwYXJ0LgotICAgICAgICBjbG9zZVBhcnQoZlBhZ2UsIHBhcnQpOwotICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgInNldEluaXRpYWxpemF0aW9uRGF0YSIsICJpbml0IiwKLSAgICAgICAgICAgICAgICAiY3JlYXRlUGFydENvbnRyb2wiLCAic2V0Rm9jdXMiLCAid2lkZ2V0RGlzcG9zZWQiLCAiZGlzcG9zZSIgfSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIGEgcGFydC4gIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE1vY2tQYXJ0IG9wZW5QYXJ0KElXb3JrYmVuY2hQYWdlIHBhZ2UpIHRocm93cyBUaHJvd2FibGU7Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgYSBwYXJ0LiAgU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjbG9zZVBhcnQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgTW9ja1BhcnQgcGFydCkKLSAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGU7Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lXb3JrYmVuY2hUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2JlbmNoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWE1ZDU2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lXb3JrYmVuY2hUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5BcnJheVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkVtcHR5UGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgdGhlIElXb3JrYmVuY2ggaW50ZXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgSVdvcmtiZW5jaFRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBJV29ya2JlbmNoVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBhY3RpdmF0aW9uIG9mIHR3byB3aW5kb3dzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW4xLCB3aW4yOwotCi0gICAgICAgIC8vIFRlc3QgaW5pdGlhbCB3aW5kb3cuCi0gICAgICAgIHdpbjEgPSBmV29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdpbjEpOwotCi0gICAgICAgIC8vIFRlc3Qgb3BlbiB3aW5kb3cuCi0gICAgICAgIHdpbjEgPSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBhc3NlcnRFcXVhbHMod2luMSwgZldvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBvcGVuIHNlY29uZCB3aW5kb3cuCi0gICAgICAgIHdpbjIgPSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBhc3NlcnRFcXVhbHMod2luMiwgZldvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBzZXQgZm9jdXMuCi0gICAgICAgIHdpbjEuZ2V0U2hlbGwoKS5mb3JjZUZvY3VzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh3aW4xLCBmV29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLQotICAgICAgICAvLyBUZXN0IHNldCBmb2N1cy4KLSAgICAgICAgd2luMi5nZXRTaGVsbCgpLmZvcmNlRm9jdXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHdpbjIsIGZXb3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotCi0gICAgICAgIC8vIENsZWFudXAgaW4gdGVhckRvd24uCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEVkaXRvclJlZ2lzdHJ5KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElFZGl0b3JSZWdpc3RyeSByZWcgPSBmV29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBJUGVyc3BlY3RpdmVSZWdpc3RyeSByZWcgPSBmV29ya2JlbmNoLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcmVmZXJlbmVNYW5hZ2VyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyIG1nciA9IGZXb3JrYmVuY2guZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZ3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaGFyZWRJbWFnZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSVNoYXJlZEltYWdlcyBpbWcgPSBmV29ya2JlbmNoLmdldFNoYXJlZEltYWdlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGltZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFdvcmtpbmdTZXRNYW5hZ2VyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElXb3JraW5nU2V0TWFuYWdlciB3b3JraW5nU2V0TWFuYWdlciA9IGZXb3JrYmVuY2gKLSAgICAgICAgICAgICAgICAuZ2V0V29ya2luZ1NldE1hbmFnZXIoKTsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3b3JraW5nU2V0TWFuYWdlcik7Ci0KLSAgICAgICAgSVdvcmtpbmdTZXQgd29ya2luZ1NldCA9IHdvcmtpbmdTZXRNYW5hZ2VyLmNyZWF0ZVdvcmtpbmdTZXQoIndzMSIsCi0gICAgICAgICAgICAgICAgbmV3IElBZGFwdGFibGVbXSB7IHdvcmtzcGFjZS5nZXRSb290KCkgfSk7Ci0gICAgICAgIHdvcmtpbmdTZXRNYW5hZ2VyLmFkZFdvcmtpbmdTZXQod29ya2luZ1NldCk7Ci0gICAgICAgIHdvcmtpbmdTZXRNYW5hZ2VyID0gZldvcmtiZW5jaC5nZXRXb3JraW5nU2V0TWFuYWdlcigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgd29ya2luZ1NldE1hbmFnZXIuZ2V0V29ya2luZ1NldHMoKS5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMod29ya2luZ1NldCwgd29ya2luZ1NldE1hbmFnZXIuZ2V0V29ya2luZ1NldHMoKVswXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFdvcmtiZW5jaFdpbmRvd3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvd1tdIHdpbnMgPSBmV29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5VXRpbC5jaGVja05vdE51bGwod2lucyksIHRydWUpOwotICAgICAgICBpbnQgb2xkVG90YWwgPSB3aW5zLmxlbmd0aDsKLSAgICAgICAgaW50IG51bSA9IDM7Ci0KLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvd1tdIG5ld1dpbnMgPSBuZXcgSVdvcmtiZW5jaFdpbmRvd1tudW1dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKQotICAgICAgICAgICAgbmV3V2luc1tpXSA9IG9wZW5UZXN0V2luZG93KCk7Ci0KLSAgICAgICAgd2lucyA9IGZXb3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWwuY29udGFpbnMod2lucywgbmV3V2luc1tpXSkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyh3aW5zLmxlbmd0aCwgb2xkVG90YWwgKyBudW0pOwotCi0gICAgICAgIGNsb3NlQWxsVGVzdFdpbmRvd3MoKTsKLSAgICAgICAgd2lucyA9IGZXb3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMod2lucy5sZW5ndGgsIG9sZFRvdGFsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBvcGVuV29ya2JlbmNoV2luZG93KFN0cmluZywgSUFkYXB0YWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbldvcmtiZW5jaFdpbmRvdygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBvcGVuIGEgd2luZG93IHdpdGggdmFsaWQgcGVyc3BlY3RpdmUgCi0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdpbiA9IGZXb3JrYmVuY2gub3BlbldvcmtiZW5jaFdpbmRvdyhFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lELCBnZXRQYWdlSW5wdXQoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdpbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMod2luLCBmV29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhFbXB0eVBlcnNwZWN0aXZlLlBFUlNQX0lELCB3aW4uZ2V0QWN0aXZlUGFnZSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQZXJzcGVjdGl2ZSgpLmdldElkKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHdpbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHdpbi5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb3BlbiBhIHdpbmRvdyB3aXRoIGludmFsaWQgcGVyc3BlY3RpdmUuIFdvcmtiZW5jaEV4Y2VwdGlvbiBpcyBleHBlY3RlZC4KLSAgICAgICAgYm9vbGVhbiBleGNlcHRpb25PY2N1cmVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aW4gPSBmV29ya2JlbmNoLm9wZW5Xb3JrYmVuY2hXaW5kb3coImFmZGFzZmRhc2YiLCBnZXRQYWdlSW5wdXQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXhjZXB0aW9uT2NjdXJlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoZXhjZXB0aW9uT2NjdXJlZCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogb3BlbldvcmtiZW5jaFdpbmRvdyhJQWRhcHRhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuV29ya2JlbmNoV2luZG93MigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBvcGVuIGEgd2luZG93IHdpdGggdmFsaWQgcGVyc3BlY3RpdmUgCi0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2luID0gZldvcmtiZW5jaAotICAgICAgICAgICAgICAgICAgICAub3BlbldvcmtiZW5jaFdpbmRvdyhnZXRQYWdlSW5wdXQoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdpbik7Ci0JCQlhc3NlcnRFcXVhbHMod2luLCBmV29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0SUQgPSBmV29ya2JlbmNoLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMod2luLmdldEFjdGl2ZVBhZ2UoKS5nZXRQZXJzcGVjdGl2ZSgpLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRJRCk7Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh3aW4gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB3aW4uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuUGFnZTEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW4gPSBudWxsOwotICAgICAgICAvL0lXb3JrYmVuY2hQYWdlIHBhZ2UxLCBwYWdlMjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDb21tZW50ZWQgb3V0IHVudGlsIHRlc3QgY2FzZSBjYW4gYmUgdXBkYXRlZCB0byBtYXRjaCBuZXcKLSAgICAgICAgICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHNpbmdsZSBwYWdlIHBlciB3aW5kb3cKLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgIC8vIE9wZW4gdGVzdCB3aW5kb3cuCi0gICAgICAgICAgICAgd2luID0gZldvcmtiZW5jaC5vcGVuV29ya2JlbmNoV2luZG93KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0gICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3aW4pOwotCi0gICAgICAgICAgICAgLy8gU2V0IHBsYXRmb3JtIHByZWYgZm9yIG9wZW5QYWdlLgotICAgICAgICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICAgICAgIHN0b3JlLnNldFZhbHVlKElQcmVmZXJlbmNlQ29uc3RhbnRzLlJFVVNFX1BFUlNQRUNUSVZFUywgCi0gICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgLy8gQ2FsbCBvcGVuUGFnZSB0d2ljZSB3aXRoIHRoZSBzYW1lIGlucHV0LgotICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGdldCB0aGUgc2FtZSBwYWdlIGJhY2sgYm90aCB0aW1lcy4KLSAgICAgICAgICAgICBwYWdlMSA9IGZXb3JrYmVuY2gub3BlblBhZ2UoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpKTsKLSAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhZ2UxKTsKLSAgICAgICAgICAgICBwYWdlMiA9IGZXb3JrYmVuY2gub3BlblBhZ2UoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpKTsKLSAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhZ2UyKTsKLSAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlBhZ2VzIHNob3VsZCBiZSBlcXVhbCIsIHBhZ2UxLCBwYWdlMik7Ci0KLSAgICAgICAgICAgICAvLyBSZXNldCBwbGF0Zm9ybSBwcmVmIGZvciBvcGVuUGFnZS4KLSAgICAgICAgICAgICBzdG9yZS5zZXRWYWx1ZShJUHJlZmVyZW5jZUNvbnN0YW50cy5SRVVTRV9QRVJTUEVDVElWRVMsIAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLy8gQ2FsbCBvcGVuUGFnZSB0d2ljZSB3aXRoIHRoZSBzYW1lIGlucHV0LgotICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgd2UgZ2V0IHR3byBkaWZmZXJlbnQgcGFnZXMgYmFjay4KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDb21tZW50ZWQgb3V0IHVudGlsIE5pY2sgaGFzIHRpbWUgdG8gdXBkYXRlIHRoaXMKLSAgICAgICAgICAgICAqIHRlc3QgY2FzZSB0byBtYXRjaCBuZXcgaW1wbGVtZW50YXRpb24gb2Ygb3BlblBhZ2UKLSAgICAgICAgICAgICAqIG90aGVyd2lzZSB0aGlzIHRlc3QgYWx3YXlzIGZhaWxzLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICBwYWdlMSA9IGZXb3JrYmVuY2gub3BlblBhZ2UoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpKTsKLSAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhZ2UxKTsKLSAgICAgICAgICAgICBwYWdlMiA9IGZXb3JrYmVuY2gub3BlblBhZ2UoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpKTsKLSAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhZ2UyKTsKLSAgICAgICAgICAgICBhc3NlcnRUcnVlKCJQYWdlcyBzaG91bGQgYmUgbm90IGVxdWFsIiwgcGFnZTEgIT0gcGFnZTIpOwotICAgICAgICAgICAgICovCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBDbG9zZSB0ZXN0IHdpbmRvdy4KLSAgICAgICAgICAgIGlmICh3aW4gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB3aW4uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuUGFnZTIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW4gPSBudWxsOwotICAgICAgICAvL0lXb3JrYmVuY2hQYWdlIHBhZ2UxLCBwYWdlMjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDb21tZW50ZWQgb3V0IHVudGlsIHRlc3QgY2FzZSBjYW4gYmUgdXBkYXRlZCB0byBtYXRjaCBuZXcKLSAgICAgICAgICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHNpbmdsZSBwYWdlIHBlciB3aW5kb3cKLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgIC8vIE9wZW4gdGVzdCB3aW5kb3cuCi0gICAgICAgICAgICAgd2luID0gZldvcmtiZW5jaC5vcGVuV29ya2JlbmNoV2luZG93KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0gICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3aW4pOwotCi0gICAgICAgICAgICAgLy8gU2V0IHBsYXRmb3JtIHByZWYgZm9yIG9wZW5QYWdlLgotICAgICAgICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICAgICAgIHN0b3JlLnNldFZhbHVlKElQcmVmZXJlbmNlQ29uc3RhbnRzLlJFVVNFX1BFUlNQRUNUSVZFUywgCi0gICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgLy8gQ2FsbCBvcGVuUGFnZSB0d2ljZSB3aXRoIHRoZSBzYW1lIGlucHV0LgotICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGdldCB0aGUgc2FtZSBwYWdlIGJhY2sgYm90aCB0aW1lcy4KLSAgICAgICAgICAgICBwYWdlMSA9IGZXb3JrYmVuY2gub3BlblBhZ2UoRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCwKLSAgICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCksIDApOwotICAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFnZTEpOwotICAgICAgICAgICAgIHBhZ2UyID0gZldvcmtiZW5jaC5vcGVuUGFnZShJV29ya2JlbmNoQ29uc3RhbnRzLkRFRkFVTFRfTEFZT1VUX0lELAotICAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSwgMCk7Ci0gICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwYWdlMik7Ci0gICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQYWdlcyBzaG91bGQgYmUgZXF1YWwiLCBwYWdlMSwgcGFnZTIpOwotCi0gICAgICAgICAgICAgLy8gUmVzZXQgcGxhdGZvcm0gcHJlZiBmb3Igb3BlblBhZ2UuCi0gICAgICAgICAgICAgc3RvcmUuc2V0VmFsdWUoSVByZWZlcmVuY2VDb25zdGFudHMuUkVVU0VfUEVSU1BFQ1RJVkVTLCAKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgLy8gQ2FsbCBvcGVuUGFnZSB0d2ljZSB3aXRoIHRoZSBzYW1lIGlucHV0LgotICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGdldCB0d28gZGlmZmVyZW50IHBhZ2VzIGJhY2suCi0gICAgICAgICAgICAgcGFnZTEgPSBmV29ya2JlbmNoLm9wZW5QYWdlKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQsCi0gICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLCAwKTsKLSAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhZ2UxKTsKLSAgICAgICAgICAgICBwYWdlMiA9IGZXb3JrYmVuY2gub3BlblBhZ2UoSVdvcmtiZW5jaENvbnN0YW50cy5ERUZBVUxUX0xBWU9VVF9JRCwKLSAgICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCksIDApOwotICAgICAgICAgICAgIGFzc2VydFRydWUoIlBhZ2VzIHNob3VsZCBiZSBub3QgZXF1YWwiLCBwYWdlMSAhPSBwYWdlMik7Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIENsb3NlIHRlc3Qgd2luZG93LgotICAgICAgICAgICAgaWYgKHdpbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHdpbi5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY2xvc2UoKSBjb3VsZG4ndCBiZSB0ZXN0ZWQgYmVjYXVzZSBjYWxsaW5nIGNsb3NlKCkgd291bGQgbGVhZCB0byBlYXJseSB0ZXJtaW5hdGlvbiAKLSAgICAgKiB0byBlbnRpcmUgdGVzdCBzdWl0ZXMJCQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZSgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2JlbmNoVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2JlbmNoVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhN2FjMDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVdvcmtiZW5jaFRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGVzdCB0aGUgd29ya2JlbmNoLiBUaGlzIHN1aXRlIHdhcyBjcmVhdGVkIGFzIGEgCi0gKiB3b3JrYXJvdW5kIGZvciBwcm9ibGVtcyBydW5uaW5nIHRoZSBzdWl0ZXMgZnJvbSB0aGUKLSAqIGNvbW1hbmQgbGluZS4KLSAqLwotcHVibGljIGNsYXNzIElXb3JrYmVuY2hUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VpdGUuICBUaGlzIGlzIHJlcXVpcmVkIHRvCi0gICAgICogdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSVdvcmtiZW5jaFRlc3RTdWl0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCB0aGUgdGVzdCBzdWl0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtiZW5jaFRlc3RTdWl0ZSgpIHsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKElXb3JrYmVuY2hUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJV29ya2JlbmNoV2luZG93VGVzdC5jbGFzcykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1NWRlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5BY3Rpb25VdGlsOwotCi0vKioKLSAqIFRlc3RzIHRoZSBsaWZlY3ljbGUgZm9yIGEgd2luZG93IGFjdGlvbiBkZWxlZ2F0ZS4KLSAqLwotcHVibGljIGNsYXNzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZVRlc3QgZXh0ZW5kcyBJQWN0aW9uRGVsZWdhdGVUZXN0IHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGVUZXN0Ci0gICAgICovCi0gICAgcHVibGljIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBSdW4gdGhlIGFjdGlvbi4KLSAgICAgICAgdGVzdFJ1bigpOwotCi0gICAgICAgIC8vIFZlcmlmeSBsaWZlY3ljbGUuCi0gICAgICAgIC8vIFRoZSBpbml0LCBzZWxlY3Rpb25DaGFuZ2VkLCBhbmQgcnVuIG1ldGhvZHMgc2hvdWxkCi0gICAgICAgIC8vIGJlIGNhbGxlZCwgaW4gdGhhdCBvcmRlci4KLSAgICAgICAgTW9ja0FjdGlvbkRlbGVnYXRlIGRlbGVnYXRlID0gZ2V0RGVsZWdhdGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoZGVsZWdhdGUuY2FsbEhpc3RvcnkudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgImluaXQiLAotICAgICAgICAgICAgICAgICJzZWxlY3Rpb25DaGFuZ2VkIiwgInJ1biIgfSkpOwotICAgIH0KLQotICAgIC8vIEJ1ZyA0ODc5OS4gIENvbW1lbnRlZCBvdXQgdGVzdERpc3Bvc2UgdG8gYXZvaWQgYSB0ZXN0IGZhaWx1cmUuICBUaGlzIHNob3VsZCBiZSBhIHRlbXBvcmFyeSBzb2x1dGlvbi4KLSAgICAvLwlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgIC8vCQkvLyBSdW4gdGhlIGFjdGlvbi4KLSAgICAvLwkJdGVzdFJ1bigpOwotICAgIC8vCQkKLSAgICAvLwkJLy8gR2V0IHRoZSBhY3Rpb24uCi0gICAgLy8JCU1vY2tBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZSA9IGdldERlbGVnYXRlKCk7Ci0gICAgLy8JCWFzc2VydE5vdE51bGwoZGVsZWdhdGUpOwotICAgIC8vCQkKLSAgICAvLwkJLy8gRGlzcG9zZSBhY3Rpb24uCi0gICAgLy8JCS8vIFZlcmlmeSB0aGF0IHRoZSBkaXNwb3NlIG1ldGhvZCBpcyBjYWxsZWQuCi0gICAgLy8JCWRlbGVnYXRlLmNhbGxIaXN0b3J5LmNsZWFyKCk7Ci0gICAgLy8JCXJlbW92ZUFjdGlvbigpOwotICAgIC8vCQlhc3NlcnRUcnVlKGRlbGVnYXRlLmNhbGxIaXN0b3J5LmNvbnRhaW5zKCJkaXNwb3NlIikpOwotICAgIC8vCX0KLQotICAgIC8qKgotICAgICAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDgxNDIyLiAgVGVzdHMgdG8gZW5zdXJlIHRoYXQgZGlzcG9zZSgpIGlzIG9ubHkKLSAgICAgKiBjYWxsZWQgb25jZSBpZiB0aGUgZGVsZWdhdGUgaW1wbGVtZW50cyBib3RoIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZQotICAgICAqIGFuZCBJQWN0aW9uRGVsZWdhdGUyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwb3NlV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGVCdWc4MTQyMigpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gTW9ja1dvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlLlNFVF9JRDsKLSAgICAgICAgZlBhZ2Uuc2hvd0FjdGlvblNldChpZCk7Ci0gICAgICAgIE1vY2tXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSBtb2NrV1dpbkFjdGlvbkRlbGVnYXRlID0gTW9ja1dvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlLmxhc3REZWxlZ2F0ZTsKLSAgICAgICAgLy8gaGlkZSAoZnJvbSB0aGUgY29tcGlsZXIpIHRoZSBmYWN0IHRoYXQgdGhlIGludGVyZmFjZXMgYXJlIGltcGxlbWVudGVkCi0gICAgICAgIE9iamVjdCBtb2NrQXNPYmplY3QgPSBtb2NrV1dpbkFjdGlvbkRlbGVnYXRlOyAKLSAgICAgICAgLy8gYXNzZXJ0cyB0aGF0IHRoZSBtb2NrIG9iamVjdCBhY3R1YWxseSBpbXBsZW1lbnRzIGJvdGggaW50ZXJmYWNlcyBtZW50aW9uZWQgaW4gdGhlIFBSCi0gICAgICAgIGFzc2VydFRydWUobW9ja0FzT2JqZWN0IGluc3RhbmNlb2YgSUFjdGlvbkRlbGVnYXRlMik7Ci0gICAgICAgIGFzc2VydFRydWUobW9ja0FzT2JqZWN0IGluc3RhbmNlb2YgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlKTsKLSAgICAgICAgLy8gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgY2FsbHMgZnJvbSBub3cgb24KLSAgICAgICAgbW9ja1dXaW5BY3Rpb25EZWxlZ2F0ZS5jYWxsSGlzdG9yeS5jbGVhcigpOwotICAgICAgICAvLyB0aGlzIGNhdXNlcyB0aGUgYWN0aW9uIHNldCB0byBiZSBkaXNwb3NlZAotICAgICAgICBmUGFnZS5jbG9zZSgpOwotICAgICAgICAvLyBhc3NlcnQgdGhhdCBkaXNwb3NlIHdhcyBjYWxsZWQKLSAgICAJYXNzZXJ0VHJ1ZShtb2NrV1dpbkFjdGlvbkRlbGVnYXRlLmNhbGxIaXN0b3J5LmNvbnRhaW5zKCJkaXNwb3NlIikpOwotICAgIAkvLyBhc3NlcnQgdGhhdCBkaXNwb3NlIHdhcyBub3QgY2FsbGVkIHR3aWNlCi0gICAgCWFzc2VydEZhbHNlKG1vY2tXV2luQWN0aW9uRGVsZWdhdGUuY2FsbEhpc3RvcnkudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsiZGlzcG9zZSIsICJkaXNwb3NlIn0pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElBY3Rpb25EZWxlZ2F0ZVRlc3QjY3JlYXRlQWN0aW9uV2lkZ2V0KCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUFjdGlvbldpZGdldCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmUGFnZS5zaG93QWN0aW9uU2V0KCJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvblNldCIpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElBY3Rpb25EZWxlZ2F0ZVRlc3QjcnVuQWN0aW9uKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5BY3Rpb24oT2JqZWN0IHdpZGdldCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIEFjdGlvblV0aWwucnVuQWN0aW9uV2l0aExhYmVsKHRoaXMsIGZXaW5kb3csICJNb2NrIEFjdGlvbiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlVGVzdCNmaXJlU2VsZWN0aW9uKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlU2VsZWN0aW9uKE9iamVjdCB3aWRnZXQpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBNb2NrVmlld1BhcnQgdmlldyA9IChNb2NrVmlld1BhcnQpIGZQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRCk7Ci0gICAgICAgIHZpZXcuZmlyZVNlbGVjdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBY3Rpb24oKSB7Ci0gICAgICAgIGZQYWdlLmhpZGVBY3Rpb25TZXQoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uU2V0Iik7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2JlbmNoV2luZG93VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVdvcmtiZW5jaFdpbmRvd1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwNmRmMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2JlbmNoV2luZG93VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkFycmF5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIElXb3JrYmVuY2hXaW5kb3dUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgZldpbjsKLQotICAgIHB1YmxpYyBJV29ya2JlbmNoV2luZG93VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICBmV2luID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZXaW4uY2xvc2UoKSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICBBcnJheVV0aWwuY29udGFpbnMoZldvcmtiZW5jaC5nZXRXb3JrYmVuY2hXaW5kb3dzKCksIGZXaW4pLAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0aXZlUGFnZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvKgotICAgICAgICAgKiBDb21tZW50ZWQgb3V0IGJlY2F1c2UgdW50aWwgdGVzdCBjYXNlIGNhbiBiZSB1cGRhdGVkIHRvIHdvcmsKLSAgICAgICAgICogd2l0aCBuZXcgd2luZG93L3BhZ2UvcGVyc3BlY3RpdmUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICogCi0gICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlMSwgcGFnZTI7Ci0gICAgICAgICBwYWdlMSA9IG9wZW5UZXN0UGFnZShmV2luKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhmV2luLmdldEFjdGl2ZVBhZ2UoKSwgcGFnZTEpOwotCi0gICAgICAgICBwYWdlMiA9IG9wZW5UZXN0UGFnZShmV2luKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhmV2luLmdldEFjdGl2ZVBhZ2UoKSwgcGFnZTIpOwotCi0gICAgICAgICBmV2luLnNldEFjdGl2ZVBhZ2UocGFnZTEpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKGZXaW4uZ2V0QWN0aXZlUGFnZSgpLCBwYWdlMSk7Ci0KLSAgICAgICAgIGZXaW4uc2V0QWN0aXZlUGFnZShwYWdlMik7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMoZldpbi5nZXRBY3RpdmVQYWdlKCksIHBhZ2UyKTsKLQotICAgICAgICAgLy9ubyBwYWdlcwotICAgICAgICAgY2xvc2VBbGxQYWdlcyhmV2luKTsKLSAgICAgICAgIGFzc2VydE51bGwoZldpbi5nZXRBY3RpdmVQYWdlKCkpOwotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QWN0aXZlUGFnZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBvcGVuVGVzdFBhZ2UoZldpbiwgNSk7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSBmV2luLmdldFBhZ2VzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZldpbi5zZXRBY3RpdmVQYWdlKHBhZ2VzW2ldKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYWdlc1tpXSwgZldpbi5nZXRBY3RpdmVQYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZldpbi5zZXRBY3RpdmVQYWdlKG51bGwpOwotICAgICAgICBhc3NlcnROdWxsKGZXaW4uZ2V0QWN0aXZlUGFnZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFnZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ29tbWVudGVkIG91dCBiZWNhdXNlIHVudGlsIHRlc3QgY2FzZSBjYW4gYmUgdXBkYXRlZCB0byB3b3JrCi0gICAgICAgICAqIHdpdGggbmV3IHdpbmRvdy9wYWdlL3BlcnNwZWN0aXZlIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAqIAotICAgICAgICAgaW50IHRvdGFsQmVmb3JlOwotICAgICAgICAgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcywgZG9tYWluUGFnZXM7Ci0KLSAgICAgICAgIHRvdGFsQmVmb3JlID0gZldpbi5nZXRQYWdlcygpLmxlbmd0aDsKLSAgICAgICAgIGludCBudW0gPSA1OwotICAgICAgICAgcGFnZXMgPSBvcGVuVGVzdFBhZ2UoZldpbiwgbnVtKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhmV2luLmdldFBhZ2VzKCkubGVuZ3RoLCB0b3RhbEJlZm9yZSArIG51bSk7Ci0KLSAgICAgICAgIGRvbWFpblBhZ2VzID0gZldpbi5nZXRQYWdlcygpOwotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheVV0aWwuY29udGFpbnMoZG9tYWluUGFnZXMsIHBhZ2VzW2ldKSwgdHJ1ZSk7Ci0KLSAgICAgICAgIGNsb3NlQWxsUGFnZXMoZldpbik7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMoZldpbi5nZXRQYWdlcygpLmxlbmd0aCwgMCk7Ci0gICAgICAgICAqLwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaGVsbCgpIHsKLSAgICAgICAgU2hlbGwgc2ggPSBmV2luLmdldFNoZWxsKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2gpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXb3JrYmVuY2goKSB7Ci0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luID0gZldvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHdpbi5nZXRXb3JrYmVuY2goKSwgZldvcmtiZW5jaCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGVzdHMgb3BlblBhZ2UoU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuUGFnZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvKgotICAgICAgICAgKiBDb21tZW50ZWQgb3V0IGJlY2F1c2UgdW50aWwgdGVzdCBjYXNlIGNhbiBiZSB1cGRhdGVkIHRvIHdvcmsKLSAgICAgICAgICogd2l0aCBuZXcgd2luZG93L3BhZ2UvcGVyc3BlY3RpdmUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICogCi0gICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gbnVsbDsKLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICBwYWdlID0gZldpbi5vcGVuUGFnZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkpOwotICAgICAgICAgYXNzZXJ0Tm90TnVsbChwYWdlKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhmV2luLmdldEFjdGl2ZVBhZ2UoKSwgcGFnZSk7Ci0gICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgIHBhZ2UuY2xvc2UoKTsKLSAgICAgICAgIH0KLSAgICAgICAgICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGVzdHMgb3BlblBhZ2UoU3RyaW5nLCBJQWRhcHRhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuUGFnZTIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ29tbWVudGVkIG91dCBiZWNhdXNlIHVudGlsIHRlc3QgY2FzZSBjYW4gYmUgdXBkYXRlZCB0byB3b3JrCi0gICAgICAgICAqIHdpdGggbmV3IHdpbmRvdy9wYWdlL3BlcnNwZWN0aXZlIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAqIAotICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG51bGw7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgcGFnZSA9IGZXaW4ub3BlblBhZ2UoRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpKTsKLSAgICAgICAgIGFzc2VydE5vdE51bGwocGFnZSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMoZldpbi5nZXRBY3RpdmVQYWdlKCksIHBhZ2UpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgZldpbi5nZXRBY3RpdmVQYWdlKCkuZ2V0UGVyc3BlY3RpdmUoKS5nZXRJZCgpLAotICAgICAgICAgRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCk7Ci0gICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgIHBhZ2UuY2xvc2UoKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgLy90ZXN0IG9wZW5QYWdlKCkgZmFpbHMKLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICBwYWdlID0gZldpbi5vcGVuUGFnZSgiKioqKioqKioqKioqKiIsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0gICAgICAgICBmYWlsKCk7Ci0gICAgICAgICB9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgIH0KLQotICAgICAgICAgcGFnZS5jbG9zZSgpOwotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBcHBsaWNhdGlvbk1lbnUoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGlkcyA9IHsgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0ZJTEUsCi0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX1dJTkRPVywgfTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhmV2luLmlzQXBwbGljYXRpb25NZW51KGlkc1tpXSksIHRydWUpOwotCi0gICAgICAgIGlkcyA9IG5ldyBTdHJpbmdbXSB7IElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElULAotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9IRUxQLAotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9MQVVOQ0ggfTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhmV2luLmlzQXBwbGljYXRpb25NZW51KGlkc1tpXSksIGZhbHNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2luZ1NldE1hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9JV29ya2luZ1NldE1hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjQ4MTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVdvcmtpbmdTZXRNYW5hZ2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5YTUxNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkFycmF5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIElXb3JraW5nU2V0TWFuYWdlclRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLSAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIFdPUktJTkdfU0VUX05BTUVfMSA9ICJ3czEiOwotCi0gICAgZmluYWwgc3RhdGljIFN0cmluZyBXT1JLSU5HX1NFVF9OQU1FXzIgPSAid3MyIjsKLSAgICAKLSAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIFdPUktJTkdfU0VUX05BTUVfMyA9ICJ3czMiOwotCi0gICAgSVdvcmtpbmdTZXRNYW5hZ2VyIGZXb3JraW5nU2V0TWFuYWdlcjsKLQotICAgIElXb3Jrc3BhY2UgZldvcmtzcGFjZTsKLQotICAgIElXb3JraW5nU2V0IGZXb3JraW5nU2V0OwotCi0gICAgU3RyaW5nIGZDaGFuZ2VQcm9wZXJ0eTsKLQotICAgIE9iamVjdCBmQ2hhbmdlTmV3VmFsdWU7Ci0KLSAgICBPYmplY3QgZkNoYW5nZU9sZFZhbHVlOwotCi0gICAgY2xhc3MgVGVzdFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGZDaGFuZ2VQcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0gICAgICAgICAgICBmQ2hhbmdlTmV3VmFsdWUgPSBldmVudC5nZXROZXdWYWx1ZSgpOwotICAgICAgICAgICAgZkNoYW5nZU9sZFZhbHVlID0gZXZlbnQuZ2V0T2xkVmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJV29ya2luZ1NldE1hbmFnZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIGZXb3JraW5nU2V0TWFuYWdlciA9IGZXb3JrYmVuY2guZ2V0V29ya2luZ1NldE1hbmFnZXIoKTsKLSAgICAgICAgZldvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgZldvcmtpbmdTZXQgPSBmV29ya2luZ1NldE1hbmFnZXIuY3JlYXRlV29ya2luZ1NldChXT1JLSU5HX1NFVF9OQU1FXzEsCi0gICAgICAgICAgICAgICAgbmV3IElBZGFwdGFibGVbXSB7IGZXb3Jrc3BhY2UuZ2V0Um9vdCgpIH0pOwotCi0gICAgICAgIElXb3JraW5nU2V0W10gd29ya2luZ1NldHMgPSBmV29ya2luZ1NldE1hbmFnZXIuZ2V0V29ya2luZ1NldHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JraW5nU2V0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZldvcmtpbmdTZXRNYW5hZ2VyLnJlbW92ZVdvcmtpbmdTZXQod29ya2luZ1NldHNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCByZXNldENoYW5nZURhdGEoKSB7Ci0gICAgICAgIGZDaGFuZ2VQcm9wZXJ0eSA9ICIiOwotICAgICAgICBmQ2hhbmdlTmV3VmFsdWUgPSBudWxsOwotICAgICAgICBmQ2hhbmdlT2xkVmFsdWUgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgICAgIGZXb3JraW5nU2V0TWFuYWdlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICByZXNldENoYW5nZURhdGEoKTsKLSAgICAgICAgZldvcmtpbmdTZXRNYW5hZ2VyLnJlbW92ZVdvcmtpbmdTZXQoZldvcmtpbmdTZXQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGZDaGFuZ2VQcm9wZXJ0eSk7Ci0KLSAgICAgICAgcmVzZXRDaGFuZ2VEYXRhKCk7Ci0gICAgICAgIGZXb3JraW5nU2V0TWFuYWdlci5hZGRXb3JraW5nU2V0KGZXb3JraW5nU2V0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKElXb3JraW5nU2V0TWFuYWdlci5DSEFOR0VfV09SS0lOR19TRVRfQURELCBmQ2hhbmdlUHJvcGVydHkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgZkNoYW5nZU9sZFZhbHVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZXb3JraW5nU2V0LCBmQ2hhbmdlTmV3VmFsdWUpOwotCi0gICAgICAgIHJlc2V0Q2hhbmdlRGF0YSgpOwotICAgICAgICBmV29ya2luZ1NldE1hbmFnZXIucmVtb3ZlV29ya2luZ1NldChmV29ya2luZ1NldCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJV29ya2luZ1NldE1hbmFnZXIuQ0hBTkdFX1dPUktJTkdfU0VUX1JFTU9WRSwKLSAgICAgICAgICAgICAgICBmQ2hhbmdlUHJvcGVydHkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZldvcmtpbmdTZXQsIGZDaGFuZ2VPbGRWYWx1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBmQ2hhbmdlTmV3VmFsdWUpOwotCi0gICAgICAgIHJlc2V0Q2hhbmdlRGF0YSgpOwotCQlmV29ya2luZ1NldC5zZXRMYWJlbChXT1JLSU5HX1NFVF9OQU1FXzMpOyAvLyBzZXQgdGhlIGxhYmVsIGZpcnN0IHRvCi0JCQkJCQkJCQkJCQkJLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlCi0JCQkJCQkJCQkJCQkJLy8gbmV3IG5hbWUuIFRoaXMgd2lsbCBhbGxvdwotCQkJCQkJCQkJCQkJCS8vIHVzIHRvIHRlc3QgZm9yIHRoZSBuYW1lCi0JCQkJCQkJCQkJCQkJLy8gcHJvcGVydHkgYXBhcnQgZnJvbSB0aGUKLQkJCQkJCQkJCQkJCQkvLyBsYWJlbCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoSVdvcmtpbmdTZXRNYW5hZ2VyLkNIQU5HRV9XT1JLSU5HX1NFVF9MQUJFTF9DSEFOR0UsCi0JCQkJZkNoYW5nZVByb3BlcnR5KTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGZDaGFuZ2VPbGRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhmV29ya2luZ1NldCwgZkNoYW5nZU5ld1ZhbHVlKTsKLQkJZldvcmtpbmdTZXQuc2V0TmFtZShXT1JLSU5HX1NFVF9OQU1FXzIpOwotCQlhc3NlcnRFcXVhbHMoSVdvcmtpbmdTZXRNYW5hZ2VyLkNIQU5HRV9XT1JLSU5HX1NFVF9OQU1FX0NIQU5HRSwKLQkJCQlmQ2hhbmdlUHJvcGVydHkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZkNoYW5nZU9sZFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKGZXb3JraW5nU2V0LCBmQ2hhbmdlTmV3VmFsdWUpOwotCi0gICAgICAgIHJlc2V0Q2hhbmdlRGF0YSgpOwotICAgICAgICBmV29ya2luZ1NldC5zZXRFbGVtZW50cyhuZXcgSUFkYXB0YWJsZVtdIHt9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKElXb3JraW5nU2V0TWFuYWdlci5DSEFOR0VfV09SS0lOR19TRVRfQ09OVEVOVF9DSEFOR0UsCi0gICAgICAgICAgICAgICAgZkNoYW5nZVByb3BlcnR5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGZDaGFuZ2VPbGRWYWx1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmV29ya2luZ1NldCwgZkNoYW5nZU5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUmVjZW50V29ya2luZ1NldCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmV29ya2luZ1NldE1hbmFnZXIuYWRkUmVjZW50V29ya2luZ1NldChmV29ya2luZ1NldCk7Ci0gICAgICAgIGZXb3JraW5nU2V0TWFuYWdlci5hZGRXb3JraW5nU2V0KGZXb3JraW5nU2V0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWwuZXF1YWxzKG5ldyBJV29ya2luZ1NldFtdIHsgZldvcmtpbmdTZXQgfSwKLSAgICAgICAgICAgICAgICBmV29ya2luZ1NldE1hbmFnZXIuZ2V0UmVjZW50V29ya2luZ1NldHMoKSkpOwotCi0gICAgICAgIElXb3JraW5nU2V0IHdvcmtpbmdTZXQyID0gZldvcmtpbmdTZXRNYW5hZ2VyLmNyZWF0ZVdvcmtpbmdTZXQoCi0gICAgICAgICAgICAgICAgV09SS0lOR19TRVRfTkFNRV8yLCBuZXcgSUFkYXB0YWJsZVtdIHsgZldvcmtzcGFjZS5nZXRSb290KCkgfSk7Ci0gICAgICAgIGZXb3JraW5nU2V0TWFuYWdlci5hZGRSZWNlbnRXb3JraW5nU2V0KHdvcmtpbmdTZXQyKTsKLSAgICAgICAgZldvcmtpbmdTZXRNYW5hZ2VyLmFkZFdvcmtpbmdTZXQod29ya2luZ1NldDIpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5VXRpbC5lcXVhbHMobmV3IElXb3JraW5nU2V0W10geyB3b3JraW5nU2V0MiwKLSAgICAgICAgICAgICAgICBmV29ya2luZ1NldCB9LCBmV29ya2luZ1NldE1hbmFnZXIuZ2V0UmVjZW50V29ya2luZ1NldHMoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRXb3JraW5nU2V0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZXb3JraW5nU2V0TWFuYWdlci5hZGRXb3JraW5nU2V0KGZXb3JraW5nU2V0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWwuZXF1YWxzKG5ldyBJV29ya2luZ1NldFtdIHsgZldvcmtpbmdTZXQgfSwKLSAgICAgICAgICAgICAgICBmV29ya2luZ1NldE1hbmFnZXIuZ2V0V29ya2luZ1NldHMoKSkpOwotCi0gICAgICAgIGJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmV29ya2luZ1NldE1hbmFnZXIuYWRkV29ya2luZ1NldChmV29ya2luZ1NldCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWwuZXF1YWxzKG5ldyBJV29ya2luZ1NldFtdIHsgZldvcmtpbmdTZXQgfSwKLSAgICAgICAgICAgICAgICBmV29ya2luZ1NldE1hbmFnZXIuZ2V0V29ya2luZ1NldHMoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVXb3JraW5nU2V0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElXb3JraW5nU2V0IHdvcmtpbmdTZXQyID0gZldvcmtpbmdTZXRNYW5hZ2VyLmNyZWF0ZVdvcmtpbmdTZXQoCi0gICAgICAgICAgICAgICAgV09SS0lOR19TRVRfTkFNRV8yLCBuZXcgSUFkYXB0YWJsZVtdIHsgZldvcmtzcGFjZS5nZXRSb290KCkgfSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXT1JLSU5HX1NFVF9OQU1FXzIsIHdvcmtpbmdTZXQyLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlVdGlsLmVxdWFscyhuZXcgSUFkYXB0YWJsZVtdIHsgZldvcmtzcGFjZS5nZXRSb290KCkgfSwKLSAgICAgICAgICAgICAgICB3b3JraW5nU2V0Mi5nZXRFbGVtZW50cygpKSk7Ci0KLSAgICAgICAgd29ya2luZ1NldDIgPSBmV29ya2luZ1NldE1hbmFnZXIuY3JlYXRlV29ya2luZ1NldCgiIiwKLSAgICAgICAgICAgICAgICBuZXcgSUFkYXB0YWJsZVtdIHt9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3b3JraW5nU2V0Mi5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5VXRpbC5lcXVhbHMobmV3IElBZGFwdGFibGVbXSB7fSwgd29ya2luZ1NldDIKLSAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudHMoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVXb3JraW5nU2V0RnJvbU1lbWVudG8oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSVdvcmtpbmdTZXQgd29ya2luZ1NldDIgPSBmV29ya2luZ1NldE1hbmFnZXIuY3JlYXRlV29ya2luZ1NldCgKLSAgICAgICAgICAgICAgICBXT1JLSU5HX1NFVF9OQU1FXzIsIG5ldyBJQWRhcHRhYmxlW10geyBmV29ya3NwYWNlLmdldFJvb3QoKSB9KTsKLSAgICAgICAgSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJzYXZlZFN0YXRlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd29ya2luZ1NldDIuc2F2ZVN0YXRlKG1lbWVudG8pOwotICAgICAgICBJV29ya2luZ1NldCByZXN0b3JlZFdvcmtpbmdTZXQyID0gZldvcmtpbmdTZXRNYW5hZ2VyCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVdvcmtpbmdTZXQobWVtZW50byk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXT1JLSU5HX1NFVF9OQU1FXzIsIHJlc3RvcmVkV29ya2luZ1NldDIuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWwuZXF1YWxzKG5ldyBJQWRhcHRhYmxlW10geyBmV29ya3NwYWNlLmdldFJvb3QoKSB9LAotICAgICAgICAgICAgICAgIHJlc3RvcmVkV29ya2luZ1NldDIuZ2V0RWxlbWVudHMoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVXb3JraW5nU2V0U2VsZWN0aW9uRGlhbG9nKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICAgICAgSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gZldvcmtpbmdTZXRNYW5hZ2VyCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2cod2luZG93LmdldFNoZWxsKCksIHRydWUpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoZGlhbG9nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVjZW50V29ya2luZ1NldHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGZXb3JraW5nU2V0TWFuYWdlci5nZXRSZWNlbnRXb3JraW5nU2V0cygpLmxlbmd0aCk7Ci0KLSAgICAgICAgZldvcmtpbmdTZXRNYW5hZ2VyLmFkZFJlY2VudFdvcmtpbmdTZXQoZldvcmtpbmdTZXQpOwotICAgICAgICBmV29ya2luZ1NldE1hbmFnZXIuYWRkV29ya2luZ1NldChmV29ya2luZ1NldCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlVdGlsLmVxdWFscyhuZXcgSVdvcmtpbmdTZXRbXSB7IGZXb3JraW5nU2V0IH0sCi0gICAgICAgICAgICAgICAgZldvcmtpbmdTZXRNYW5hZ2VyLmdldFJlY2VudFdvcmtpbmdTZXRzKCkpKTsKLQotICAgICAgICBJV29ya2luZ1NldCB3b3JraW5nU2V0MiA9IGZXb3JraW5nU2V0TWFuYWdlci5jcmVhdGVXb3JraW5nU2V0KAotICAgICAgICAgICAgICAgIFdPUktJTkdfU0VUX05BTUVfMiwgbmV3IElBZGFwdGFibGVbXSB7IGZXb3Jrc3BhY2UuZ2V0Um9vdCgpIH0pOwotICAgICAgICBmV29ya2luZ1NldE1hbmFnZXIuYWRkUmVjZW50V29ya2luZ1NldCh3b3JraW5nU2V0Mik7Ci0gICAgICAgIGZXb3JraW5nU2V0TWFuYWdlci5hZGRXb3JraW5nU2V0KHdvcmtpbmdTZXQyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWwuZXF1YWxzKG5ldyBJV29ya2luZ1NldFtdIHsgd29ya2luZ1NldDIsCi0gICAgICAgICAgICAgICAgZldvcmtpbmdTZXQgfSwgZldvcmtpbmdTZXRNYW5hZ2VyLmdldFJlY2VudFdvcmtpbmdTZXRzKCkpKTsKLQotICAgICAgICBmV29ya2luZ1NldE1hbmFnZXIucmVtb3ZlV29ya2luZ1NldCh3b3JraW5nU2V0Mik7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlVdGlsLmVxdWFscyhuZXcgSVdvcmtpbmdTZXRbXSB7IGZXb3JraW5nU2V0IH0sCi0gICAgICAgICAgICAgICAgZldvcmtpbmdTZXRNYW5hZ2VyLmdldFJlY2VudFdvcmtpbmdTZXRzKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya2luZ1NldCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBhc3NlcnROdWxsKGZXb3JraW5nU2V0TWFuYWdlci5nZXRXb3JraW5nU2V0KFdPUktJTkdfU0VUX05BTUVfMSkpOwotCi0gICAgICAgIGZXb3JraW5nU2V0TWFuYWdlci5hZGRXb3JraW5nU2V0KGZXb3JraW5nU2V0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmV29ya2luZ1NldE1hbmFnZXIuZ2V0V29ya2luZ1NldChmV29ya2luZ1NldC5nZXROYW1lKCkpKTsKLQotICAgICAgICBhc3NlcnROdWxsKGZXb3JraW5nU2V0TWFuYWdlci5nZXRXb3JraW5nU2V0KCIiKSk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChmV29ya2luZ1NldE1hbmFnZXIuZ2V0V29ya2luZ1NldChudWxsKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFdvcmtpbmdTZXRzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWFzc2VydFRydWUoQXJyYXlVdGlsLmVxdWFscyhuZXcgSVdvcmtpbmdTZXRbXSB7fSwgZldvcmtpbmdTZXRNYW5hZ2VyCi0JCQkJLmdldFdvcmtpbmdTZXRzKCkpKTsKLQotCQlmV29ya2luZ1NldE1hbmFnZXIuYWRkV29ya2luZ1NldChmV29ya2luZ1NldCk7Ci0JCWFzc2VydFRydWUoQXJyYXlVdGlsLmVxdWFscyhuZXcgSVdvcmtpbmdTZXRbXSB7IGZXb3JraW5nU2V0IH0sCi0JCQkJZldvcmtpbmdTZXRNYW5hZ2VyLmdldFdvcmtpbmdTZXRzKCkpKTsKLQotCQl0cnkgewotCQkJZldvcmtpbmdTZXRNYW5hZ2VyLmFkZFdvcmtpbmdTZXQoZldvcmtpbmdTZXQpOwotCQkJZmFpbCgiQWRkZWQgdGhlIHNhbWUgc2V0IHR3aWNlIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShBcnJheVV0aWwuZXF1YWxzKG5ldyBJV29ya2luZ1NldFtdIHsgZldvcmtpbmdTZXQgfSwKLQkJCQlmV29ya2luZ1NldE1hbmFnZXIuZ2V0V29ya2luZ1NldHMoKSkpOwotCi0JCUlXb3JraW5nU2V0IHdvcmtpbmdTZXQyID0gZldvcmtpbmdTZXRNYW5hZ2VyLmNyZWF0ZVdvcmtpbmdTZXQoCi0JCQkJV09SS0lOR19TRVRfTkFNRV8yLCBuZXcgSUFkYXB0YWJsZVtdIHsgZldvcmtzcGFjZS5nZXRSb290KCkgfSk7Ci0JCWZXb3JraW5nU2V0TWFuYWdlci5hZGRXb3JraW5nU2V0KHdvcmtpbmdTZXQyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVV0aWwuY29udGFpbnMoZldvcmtpbmdTZXRNYW5hZ2VyLmdldFdvcmtpbmdTZXRzKCksCi0JCQkJd29ya2luZ1NldDIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVV0aWwuY29udGFpbnMoZldvcmtpbmdTZXRNYW5hZ2VyLmdldFdvcmtpbmdTZXRzKCksCi0JCQkJZldvcmtpbmdTZXQpKTsKLQotCQlJV29ya2luZ1NldCB3b3JraW5nU2V0MyA9IGZXb3JraW5nU2V0TWFuYWdlci5jcmVhdGVXb3JraW5nU2V0KAotCQkJCVdPUktJTkdfU0VUX05BTUVfMiwgbmV3IElBZGFwdGFibGVbXSB7IGZXb3Jrc3BhY2UuZ2V0Um9vdCgpIH0pOwotCQl3b3JraW5nU2V0My5zZXROYW1lKCJ3czAiKTsKLQkJd29ya2luZ1NldDMuc2V0TGFiZWwoV09SS0lOR19TRVRfTkFNRV8yKTsgLy8gcmVzZXQgdGhlIGxhYmVsIC0gaXQKLQkJCQkJCQkJCQkJCQkvLyB3b3VsZCBiZSBzZXQgdG8gd3MwIGJ5Ci0JCQkJCQkJCQkJCQkJLy8gdGhlIGFib3ZlIGNhbGwuCi0JCWZXb3JraW5nU2V0TWFuYWdlci5hZGRXb3JraW5nU2V0KHdvcmtpbmdTZXQzKTsKLQotCQkvLyBhc3NlcnRzIHRoZSBvcmRlciBpcyBjb3JyZWN0IC0gdGhlIG5hbWUgb2Ygc2V0IHRocmVlIHNob3VsZCBwdXNoIGl0Ci0JCS8vIGFib3ZlIHNldCB0d28gZXZlbiB0aG91Z2ggdGhlaXIgbGFiZWxzIGFyZSB0aGUgc2FtZQotCQlJV29ya2luZ1NldFtdIHNldHMgPSBmV29ya2luZ1NldE1hbmFnZXIuZ2V0V29ya2luZ1NldHMoKTsKLQkJYXNzZXJ0RXF1YWxzKGZXb3JraW5nU2V0LCBzZXRzWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKHdvcmtpbmdTZXQyLCBzZXRzWzJdKTsKLQkJYXNzZXJ0RXF1YWxzKHdvcmtpbmdTZXQzLCBzZXRzWzFdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCi0gICAgICAgIGZXb3JraW5nU2V0TWFuYWdlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBmV29ya2luZ1NldE1hbmFnZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGZXb3JraW5nU2V0TWFuYWdlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICByZXNldENoYW5nZURhdGEoKTsKLSAgICAgICAgZldvcmtpbmdTZXQuc2V0TmFtZShXT1JLSU5HX1NFVF9OQU1FXzEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGZDaGFuZ2VQcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVdvcmtpbmdTZXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZldvcmtpbmdTZXRNYW5hZ2VyLnJlbW92ZVdvcmtpbmdTZXQoZldvcmtpbmdTZXQpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5VXRpbC5lcXVhbHMobmV3IElXb3JraW5nU2V0W10ge30sIGZXb3JraW5nU2V0TWFuYWdlcgotICAgICAgICAgICAgICAgIC5nZXRXb3JraW5nU2V0cygpKSk7Ci0KLSAgICAgICAgZldvcmtpbmdTZXRNYW5hZ2VyLmFkZFdvcmtpbmdTZXQoZldvcmtpbmdTZXQpOwotICAgICAgICBJV29ya2luZ1NldCB3b3JraW5nU2V0MiA9IGZXb3JraW5nU2V0TWFuYWdlci5jcmVhdGVXb3JraW5nU2V0KAotICAgICAgICAgICAgICAgIFdPUktJTkdfU0VUX05BTUVfMiwgbmV3IElBZGFwdGFibGVbXSB7IGZXb3Jrc3BhY2UuZ2V0Um9vdCgpIH0pOwotICAgICAgICBmV29ya2luZ1NldE1hbmFnZXIuYWRkV29ya2luZ1NldCh3b3JraW5nU2V0Mik7Ci0gICAgICAgIGZXb3JraW5nU2V0TWFuYWdlci5yZW1vdmVXb3JraW5nU2V0KGZXb3JraW5nU2V0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWwuZXF1YWxzKG5ldyBJV29ya2luZ1NldFtdIHsgd29ya2luZ1NldDIgfSwKLSAgICAgICAgICAgICAgICBmV29ya2luZ1NldE1hbmFnZXIuZ2V0V29ya2luZ1NldHMoKSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0lXb3JraW5nU2V0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVdvcmtpbmdTZXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NjQwOGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvSVdvcmtpbmdTZXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQXJyYXlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIElXb3JraW5nU2V0VGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgV09SS0lOR19TRVRfTkFNRV8xID0gIndzMSI7Ci0KLSAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIFdPUktJTkdfU0VUX05BTUVfMiA9ICJ3czIiOwotCi0gICAgSVdvcmtzcGFjZSBmV29ya3NwYWNlOwotCi0gICAgSVdvcmtpbmdTZXQgZldvcmtpbmdTZXQ7Ci0KLSAgICBwdWJsaWMgSVdvcmtpbmdTZXRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIElXb3JraW5nU2V0TWFuYWdlciB3b3JraW5nU2V0TWFuYWdlciA9IGZXb3JrYmVuY2gKLSAgICAgICAgICAgICAgICAuZ2V0V29ya2luZ1NldE1hbmFnZXIoKTsKLQotICAgICAgICBmV29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBmV29ya2luZ1NldCA9IHdvcmtpbmdTZXRNYW5hZ2VyLmNyZWF0ZVdvcmtpbmdTZXQoV09SS0lOR19TRVRfTkFNRV8xLAotICAgICAgICAgICAgICAgIG5ldyBJQWRhcHRhYmxlW10geyBmV29ya3NwYWNlLmdldFJvb3QoKSB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZXb3Jrc3BhY2UuZ2V0Um9vdCgpLCBmV29ya2luZ1NldC5nZXRFbGVtZW50cygpWzBdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGZXb3JraW5nU2V0LmdldElkKCkpOwotICAgICAgICBmV29ya2luZ1NldC5zZXRJZCgiYm9ndXNJZCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImJvZ3VzSWQiLCBmV29ya2luZ1NldC5nZXRJZCgpKTsKLSAgICAgICAgZldvcmtpbmdTZXQuc2V0SWQobnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBmV29ya2luZ1NldC5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBhc3NlcnRFcXVhbHMoV09SS0lOR19TRVRfTkFNRV8xLCBmV29ya2luZ1NldC5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRFbGVtZW50cygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmV29ya2luZ1NldC5zZXRFbGVtZW50cyhudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0gICAgICAgIElQcm9qZWN0IHAxID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgiVFAxIik7Ci0gICAgICAgIElGaWxlIGYxID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgiZjEudHh0IiwgcDEpOwotICAgICAgICBJQWRhcHRhYmxlW10gZWxlbWVudHMgPSBuZXcgSUFkYXB0YWJsZVtdIHsgZjEsIHAxIH07Ci0gICAgICAgIGZXb3JraW5nU2V0LnNldEVsZW1lbnRzKGVsZW1lbnRzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWwuZXF1YWxzKGVsZW1lbnRzLCBmV29ya2luZ1NldC5nZXRFbGVtZW50cygpKSk7Ci0KLSAgICAgICAgZldvcmtpbmdTZXQuc2V0RWxlbWVudHMobmV3IElBZGFwdGFibGVbXSB7IGYxIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoZjEsIGZXb3JraW5nU2V0LmdldEVsZW1lbnRzKClbMF0pOwotCi0gICAgICAgIGZXb3JraW5nU2V0LnNldEVsZW1lbnRzKG5ldyBJQWRhcHRhYmxlW10ge30pOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZldvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKS5sZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRJZCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgZldvcmtpbmdTZXQuZ2V0SWQoKSk7Ci0gICAgICAgIGZXb3JraW5nU2V0LnNldElkKCJib2d1c0lkIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYm9ndXNJZCIsIGZXb3JraW5nU2V0LmdldElkKCkpOwotICAgICAgICBmV29ya2luZ1NldC5zZXRJZChudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGZXb3JraW5nU2V0LmdldElkKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZXb3JraW5nU2V0LnNldE5hbWUobnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQotICAgICAgICBmV29ya2luZ1NldC5zZXROYW1lKFdPUktJTkdfU0VUX05BTUVfMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXT1JLSU5HX1NFVF9OQU1FXzIsIGZXb3JraW5nU2V0LmdldE5hbWUoKSk7Ci0KLSAgICAgICAgZldvcmtpbmdTZXQuc2V0TmFtZSgiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgZldvcmtpbmdTZXQuZ2V0TmFtZSgpKTsKLQotICAgICAgICBmV29ya2luZ1NldC5zZXROYW1lKCIgIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiICIsIGZXb3JraW5nU2V0LmdldE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlmV29ya2luZ1NldC5zZXRFbGVtZW50cyhuZXcgSUFkYXB0YWJsZVtdIHt9KTsKLQkJYXNzZXJ0VHJ1ZShmV29ya2luZ1NldC5pc0VtcHR5KCkpOwotCQlmV29ya2luZ1NldC5zZXRFbGVtZW50cyhuZXcgSUFkYXB0YWJsZVtdIHsgbmV3IElBZGFwdGFibGUoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9IH0pOwotCQlhc3NlcnRGYWxzZShmV29ya2luZ1NldC5pc0VtcHR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0xpc3RDb250ZW50UHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0xpc3RDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkMjYwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9MaXN0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgTGlzdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChMaXN0KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0xpc3RFbGVtZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9MaXN0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTY5MzVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0xpc3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlcjsKLQotcHVibGljIGNsYXNzIExpc3RFbGVtZW50IGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGZsYWc7Ci0KLSAgICBwdWJsaWMgTGlzdEVsZW1lbnQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcyhuYW1lLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3RFbGVtZW50KFN0cmluZyBuYW1lLCBib29sZWFuIGZsYWcpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5mbGFnID0gZmxhZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmFtZSArICc6JyArIGZsYWc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRGbGFnKCkgewotICAgICAgICByZXR1cm4gZmxhZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotICAgICAgICBpZiAoYWRhcHRlciA9PSBJQWN0aW9uRmlsdGVyLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gTGlzdEVsZW1lbnRBY3Rpb25GaWx0ZXIuZ2V0U2luZ2xldG9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0xpc3RFbGVtZW50QWN0aW9uRmlsdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9MaXN0RWxlbWVudEFjdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjFiZTU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0xpc3RFbGVtZW50QWN0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlcjsKLQotcHVibGljIGNsYXNzIExpc3RFbGVtZW50QWN0aW9uRmlsdGVyIGltcGxlbWVudHMgSUFjdGlvbkZpbHRlciB7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FsbGVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZMQUcgPSAiZmxhZyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxfVFJVRSA9ICJ0cnVlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTF9GQUxTRSA9ICJmYWxzZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0RWxlbWVudEFjdGlvbkZpbHRlciBzaW5nbGV0b247Ci0KLSAgICBwdWJsaWMgc3RhdGljIExpc3RFbGVtZW50QWN0aW9uRmlsdGVyIGdldFNpbmdsZXRvbigpIHsKLSAgICAgICAgaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotICAgICAgICAgICAgc2luZ2xldG9uID0gbmV3IExpc3RFbGVtZW50QWN0aW9uRmlsdGVyKCk7Ci0gICAgICAgIHJldHVybiBzaW5nbGV0b247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0RWxlbWVudEFjdGlvbkZpbHRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElBY3Rpb25GaWx0ZXIjdGVzdEF0dHJpYnV0ZShPYmplY3QsIFN0cmluZywgU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGUoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBjYWxsZWQgPSB0cnVlOwotICAgICAgICBMaXN0RWxlbWVudCBsZSA9IChMaXN0RWxlbWVudCkgdGFyZ2V0OwotICAgICAgICBpZiAobmFtZS5lcXVhbHMoQVRUUl9OQU1FKSkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmVxdWFscyhsZS5nZXROYW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEFUVFJfRkxBRykpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZmxhZyA9IGxlLmdldEZsYWcoKTsKLSAgICAgICAgICAgIGlmIChmbGFnKQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5lcXVhbHMoVkFMX1RSVUUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5lcXVhbHMoVkFMX0ZBTFNFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJDYWxsZWQoKSB7Ci0gICAgICAgIGNhbGxlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldENhbGxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxlZDsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTGlzdEVsZW1lbnRQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTGlzdEVsZW1lbnRQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI5MDZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0xpc3RFbGVtZW50UHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotCi1wdWJsaWMgY2xhc3MgTGlzdEVsZW1lbnRQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsKLQotICAgIHB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsCi0gICAgICAgICAgICBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotICAgICAgICBMaXN0RWxlbWVudCBsZSA9IChMaXN0RWxlbWVudCkgcmVjZWl2ZXI7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoQVRUUl9OQU1FKSkgewotICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkVmFsdWUuZXF1YWxzKGxlLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTGlzdFZpZXcuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL0xpc3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MDRhMzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTGlzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotCi0vKioKLSAqIEFuIEVsZW1lbnRWaWV3UGFydCBzaG93cyBhIGJ1bmNoIG9mIGVsZW1lbnRzIGluIGEgbGlzdAotICogdmlld2VyLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdFZpZXcgZXh0ZW5kcyBNb2NrVmlld1BhcnQgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyIHsKLQotICAgIExpc3RWaWV3ZXIgdmlld2VyOwotCi0gICAgQXJyYXlMaXN0IGlucHV0OwotCi0gICAgTWVudU1hbmFnZXIgbWVudU1ncjsKLQotICAgIE1lbnUgbWVudTsKLQotICAgIEFjdGlvbiBhZGRBY3Rpb247Ci0KLSAgICBTdHJpbmcgQUREX0FDVElPTl9JRCA9ICJhZGRBY3Rpb24iOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEVsZW1lbnRWaWV3UGFydAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0VmlldygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjYWxsVHJhY2UuYWRkKCJjcmVhdGVQYXJ0Q29udHJvbCIpOwotCi0gICAgICAgIC8vIENyZWF0ZSB2aWV3ZXIuCi0gICAgICAgIHZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCk7Ci0gICAgICAgIHZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICB2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBMaXN0Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICB2aWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBwb3B1cCBtZW51LgotICAgICAgICBjcmVhdGVQb3B1cE1lbnUoKTsKLQotICAgICAgICAvLyBSZWdpc3RlciBzdHVmZi4KLSAgICAgICAgZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHZpZXdlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHBvcHVwIG1lbnUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUG9wdXBNZW51KCkgewotICAgICAgICAvLyBDcmVhdGUgYWN0aW9ucy4KLSAgICAgICAgYWRkQWN0aW9uID0gbmV3IEFjdGlvbigiQWRkIFN0YW5kYXJkIEl0ZW1zIikgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGFkZFN0YW5kYXJkSXRlbXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgYWRkQWN0aW9uLnNldElkKEFERF9BQ1RJT05fSUQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBwb3B1cCBtZW51LgotICAgICAgICBpZiAodXNlU3RhdGljTWVudSgpKQotICAgICAgICAgICAgY3JlYXRlU3RhdGljUG9wdXBNZW51KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNyZWF0ZUR5bmFtaWNQb3B1cE1lbnUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZHluYW1pYyBwb3B1cCBtZW51LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUR5bmFtaWNQb3B1cE1lbnUoKSB7Ci0gICAgICAgIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoKTsKLSAgICAgICAgbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0gICAgICAgIG1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKHRoaXMpOwotICAgICAgICBtZW51ID0gbWVudU1nci5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotICAgICAgICBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZW51TWdyLCB2aWV3ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdGF0aWMgcG9wdXAgbWVudS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVTdGF0aWNQb3B1cE1lbnUoKSB7Ci0gICAgICAgIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoKTsKLSAgICAgICAgbWVudSA9IG1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0gICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLSAgICAgICAgZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWVudU1nciwgdmlld2VyKTsKLSAgICAgICAgbWVudUFib3V0VG9TaG93KG1lbnVNZ3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoTGlzdEVsZW1lbnQgZWwpIHsKLSAgICAgICAgaW5wdXQuYWRkKGVsKTsKLSAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS51cGRhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3RFbGVtZW50KExpc3RFbGVtZW50IGVsKSB7Ci0gICAgICAgIGlmIChlbCA9PSBudWxsKQotICAgICAgICAgICAgdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZW51TWFuYWdlciBnZXRNZW51TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIG1lbnVNZ3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTWVudUxpc3RlbmVyI21lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWdyKSB7Ci0gICAgICAgIG1lbnVNZ3IuYWRkKGFkZEFjdGlvbik7Ci0gICAgICAgIG1lbnVNZ3IuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSBtZW51IG1nciBjb250YWlucyB0aGUgZXhwZWN0ZWQgYWN0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnlBY3Rpb25zKFRlc3RDYXNlIHRlc3QsIElNZW51TWFuYWdlciBtZW51TWdyKSB7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydE5vdE51bGwobWVudU1nci5maW5kKEFERF9BQ1RJT05fSUQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTdGFuZGFyZEl0ZW1zKCkgewotICAgICAgICBhZGRFbGVtZW50KG5ldyBMaXN0RWxlbWVudCgicmVkIikpOwotICAgICAgICBhZGRFbGVtZW50KG5ldyBMaXN0RWxlbWVudCgiYmx1ZSIpKTsKLSAgICAgICAgYWRkRWxlbWVudChuZXcgTGlzdEVsZW1lbnQoImdyZWVuIikpOwotICAgICAgICBhZGRFbGVtZW50KG5ldyBMaXN0RWxlbWVudCgicmVkIiwgdHJ1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaW5kaWNhdGUgdGhhdCBhIHN0YXRpYyBtZW51IHNob3VsZCBiZSB1c2VkLAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBpbmRpY2F0ZSBhIGR5bmFtaWMgbWVudS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlU3RhdGljTWVudSgpIHsKLSAgICAgICAgT2JqZWN0IGRhdGEgPSBnZXREYXRhKCk7Ci0gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJnID0gKFN0cmluZykgZGF0YTsKLSAgICAgICAgICAgIHJldHVybiBhcmcuaW5kZXhPZigiLXN0YXRpY01lbnUiKSA+PSAwOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja0FjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTVjYjk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0UGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTW9ja0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzUnVuID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTW9ja0FjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBNb2NrQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHN1cGVyKHRleHQpOwotICAgICAgICBUZXN0UGx1Z2luIHBsdWdpbiA9IFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpOwotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IocGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiYW55dGhpbmcuZ2lmIikpOwotICAgICAgICBzZXRUb29sVGlwVGV4dCh0ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTW9ja0FjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBNb2NrQWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpIHsKLSAgICAgICAgc3VwZXIodGV4dCwgaW1hZ2UpOwotICAgICAgICBzZXRUb29sVGlwVGV4dCh0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGhhc1J1biA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJSdW4oKSB7Ci0gICAgICAgIGhhc1J1biA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFJ1bigpIHsKLSAgICAgICAgcmV0dXJuIGhhc1J1bjsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja0FjdGlvbkRlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzNTE3Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkNhbGxIaXN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTW9ja0FjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotICAgIHB1YmxpYyBDYWxsSGlzdG9yeSBjYWxsSGlzdG9yeTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25TZXQiOwotCi0gICAgcHVibGljIHN0YXRpYyBNb2NrQWN0aW9uRGVsZWdhdGUgbGFzdERlbGVnYXRlOwotCi0gICAgcHVibGljIE1vY2tBY3Rpb25EZWxlZ2F0ZSgpIHsKLSAgICAgICAgY2FsbEhpc3RvcnkgPSBuZXcgQ2FsbEhpc3RvcnkodGhpcyk7Ci0gICAgICAgIGxhc3REZWxlZ2F0ZSA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KElXb3JrYmVuY2hXaW5kb3cpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBjYWxsSGlzdG9yeS5hZGQoInJ1biIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiwgSVNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBjYWxsSGlzdG9yeS5hZGQoInNlbGVjdGlvbkNoYW5nZWQiKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YzMwNTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5DYWxsSGlzdG9yeTsKLQotcHVibGljIGNsYXNzIE1vY2tFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLSAgICBwcm90ZWN0ZWQgQ2FsbEhpc3RvcnkgY2FsbEhpc3Rvcnk7Ci0KLSAgICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgdGFyZ2V0OwotCi0gICAgcHJvdGVjdGVkIGludCBBQ1RJT05fQ09VTlQgPSA1OwotCi0gICAgcHJvdGVjdGVkIE1vY2tBY3Rpb25bXSBhY3Rpb25zOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIE1vY2tFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcgotICAgICAqLwotICAgIHB1YmxpYyBNb2NrRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGNhbGxIaXN0b3J5ID0gbmV3IENhbGxIaXN0b3J5KHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBDYWxsSGlzdG9yeSBnZXRDYWxsSGlzdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxIaXN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQoSUFjdGlvbkJhcnMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzKSB7Ci0gICAgICAgIGNhbGxIaXN0b3J5LmFkZCgiaW5pdCIpOwotICAgICAgICBhY3Rpb25zID0gbmV3IE1vY2tBY3Rpb25bQUNUSU9OX0NPVU5UXTsKLSAgICAgICAgZm9yIChpbnQgblggPSAwOyBuWCA8IEFDVElPTl9DT1VOVDsgblgrKykgewotICAgICAgICAgICAgYWN0aW9uc1tuWF0gPSBuZXcgTW9ja0FjdGlvbihJbnRlZ2VyLnRvU3RyaW5nKG5YKSk7Ci0gICAgICAgICAgICBpZiAoblggJSAyID4gMCkKLSAgICAgICAgICAgICAgICBhY3Rpb25zW25YXS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5pbml0KGJhcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQoYWN0aW9uc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotICAgICAgICBjYWxsSGlzdG9yeS5hZGQoInNldEFjdGl2ZUVkaXRvciIpOwotICAgICAgICB0YXJnZXQgPSB0YXJnZXRFZGl0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aXZlIGVkaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIE1vY2tBY3Rpb25bXSBnZXRBY3Rpb25zKCkgewotICAgICAgICByZXR1cm4gYWN0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGVuYWJsZW1lbnQgZm9yIGFsbCBhY3Rpb25zLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUFjdGlvbnMoYm9vbGVhbiBiKSB7Ci0gICAgICAgIGZvciAoaW50IG5YID0gMDsgblggPCBBQ1RJT05fQ09VTlQ7IG5YKyspIHsKLSAgICAgICAgICAgIGFjdGlvbnNbblhdLnNldEVuYWJsZWQoYik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja0VkaXRvckFjdGlvbkRlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrRWRpdG9yQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwNGNkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrRWRpdG9yQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBNb2NrRWRpdG9yQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBNb2NrQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cwotICAgICAgICBJRWRpdG9yQWN0aW9uRGVsZWdhdGUgewotICAgIHByaXZhdGUgSUVkaXRvclBhcnQgdGFyZ2V0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIE1vY2tFZGl0b3JBY3Rpb25EZWxlZ2F0ZQotICAgICAqLwotICAgIHB1YmxpYyBNb2NrRWRpdG9yQWN0aW9uRGVsZWdhdGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJRWRpdG9yQWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24sIElFZGl0b3JQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0gICAgICAgIGNhbGxIaXN0b3J5LmFkZCgic2V0QWN0aXZlRWRpdG9yIik7Ci0gICAgICAgIHRhcmdldCA9IHRhcmdldEVkaXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgZWRpdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrRWRpdG9yTWF0Y2hpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWNiMDMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuUmVzb3VyY2VVdGlsOwotCi0vKioKLSAqIEFuIGVkaXRvciBtYXRjaGluZyBzdHJhdGVneSB0byBzdXBwb3J0IHRoZSBJRWRpdG9yTWF0Y2hpbmdTdHJhdGVneVRlc3QgdGVzdHMuCi0gKiBUaGlzIG1vZGVscyB0aGUgc2NlbmFyaW8gZm9yIFBERSBtYW5pZmVzdCBlZGl0b3JzIGRlc2NyaWJlZCBpbiBidWcgNTM3MDAuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIE1vY2tFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgewotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0gICAgICAgIElGaWxlIGlucHV0RmlsZSA9IFJlc291cmNlVXRpbC5nZXRGaWxlKGlucHV0KTsKLSAgICAgICAgaWYgKGlucHV0RmlsZSAhPSBudWxsICYmIGlucHV0RmlsZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGlucHV0RmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInBsdWdpbi54bWwiKSB8fCBuYW1lLmVxdWFscygiTUFOSUZFU1QuTUYiKSB8fCBuYW1lLmVxdWFscygiYnVpbGQucHJvcGVydGllcyIpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgZWRpdG9yRmlsZSA9IFJlc291cmNlVXRpbC5nZXRGaWxlKGVkaXRvclJlZi5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkaXRvckZpbGUgIT0gbnVsbCAmJiBpbnB1dEZpbGUuZ2V0UHJvamVjdCgpLmVxdWFscyhlZGl0b3JGaWxlLmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tFZGl0b3JQYXJ0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrRWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ1NTg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tFZGl0b3JQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNob3dFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2NrRWRpdG9yUGFydCBleHRlbmRzIE1vY2tXb3JrYmVuY2hQYXJ0IGltcGxlbWVudHMgSUVkaXRvclBhcnQsCi0gICAgICAgIElHb3RvTWFya2VyLCBJU2hvd0VkaXRvcklucHV0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrRWRpdG9yUGFydCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRDEgPSBCQVNFICsgIjEiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQyID0gQkFTRSArICIyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiTW9jayBFZGl0b3IgMSI7Ci0KLSAgICBwcml2YXRlIElFZGl0b3JJbnB1dCBpbnB1dDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBkaXJ0eSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNhdmVOZWVkZWQgPSB0cnVlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNhdmVBc0FsbG93ZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBNb2NrRWRpdG9yUGFydCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCi0gICAgICAgIGZpbmFsIEJ1dHRvbiBkaXJ0eVRvZ2dsZSA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBkaXJ0eVRvZ2dsZS5zZXRUZXh0KCJEaXJ0eSIpOwotICAgICAgICBkaXJ0eVRvZ2dsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXREaXJ0eShkaXJ0eVRvZ2dsZS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBkaXJ0eVRvZ2dsZS5zZXRTZWxlY3Rpb24oaXNEaXJ0eSgpKTsKLQotICAgICAgICBmaW5hbCBCdXR0b24gc2F2ZU5lZWRlZFRvZ2dsZSA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBzYXZlTmVlZGVkVG9nZ2xlLnNldFRleHQoIlNhdmUgb24gY2xvc2UiKTsKLSAgICAgICAgc2F2ZU5lZWRlZFRvZ2dsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRTYXZlTmVlZGVkKHNhdmVOZWVkZWRUb2dnbGUuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgc2F2ZU5lZWRlZFRvZ2dsZS5zZXRTZWxlY3Rpb24oc2F2ZU5lZWRlZCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBCdXR0b24gc2F2ZUFzVG9nZ2xlID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHNhdmVBc1RvZ2dsZS5zZXRUZXh0KCJTYXZlIGFzIGFsbG93ZWQiKTsKLSAgICAgICAgc2F2ZUFzVG9nZ2xlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNldFNhdmVBc0FsbG93ZWQoc2F2ZUFzVG9nZ2xlLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHNhdmVBc1RvZ2dsZS5zZXRTZWxlY3Rpb24oc2F2ZUFzQWxsb3dlZCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBzZWUgSUVkaXRvclBhcnQjZG9TYXZlKElQcm9ncmVzc01vbml0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBzZXREaXJ0eShmYWxzZSk7Ci0gICAgICAgIGNhbGxUcmFjZS5hZGQoImRvU2F2ZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUVkaXRvclBhcnQjZG9TYXZlQXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUVkaXRvclBhcnQjZ2V0RWRpdG9ySW5wdXQoKQotICAgICAqLwotICAgIHB1YmxpYyBJRWRpdG9ySW5wdXQgZ2V0RWRpdG9ySW5wdXQoKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElFZGl0b3JQYXJ0I2dldEVkaXRvclNpdGUoKQotICAgICAqLwotICAgIHB1YmxpYyBJRWRpdG9yU2l0ZSBnZXRFZGl0b3JTaXRlKCkgewotICAgICAgICByZXR1cm4gKElFZGl0b3JTaXRlKSBnZXRTaXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIGNhbGxUcmFjZS5hZGQoImdvdG9NYXJrZXIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElFZGl0b3JQYXJ0I2luaXQoSUVkaXRvclNpdGUsIElFZGl0b3JJbnB1dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkKLSAgICAgICAgICAgIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICAgICAgc2V0U2l0ZShzaXRlKTsKLSAgICAgICAgY2FsbFRyYWNlLmFkZCgiaW5pdCIpOwotICAgICAgICBzZXRTaXRlSW5pdGlhbGl6ZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElFZGl0b3JQYXJ0I2lzRGlydHkoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgICAgIGNhbGxUcmFjZS5hZGQoImlzRGlydHkiKTsKLSAgICAgICAgcmV0dXJuIGRpcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERpcnR5KGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgZGlydHkgPSB2YWx1ZTsKLSAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUVkaXRvclBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0gICAgICAgIGNhbGxUcmFjZS5hZGQoImlzU2F2ZUFzQWxsb3dlZCIpOwotICAgICAgICByZXR1cm4gc2F2ZUFzQWxsb3dlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElFZGl0b3JQYXJ0I2lzU2F2ZU9uQ2xvc2VOZWVkZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZU9uQ2xvc2VOZWVkZWQoKSB7Ci0gICAgICAgIGNhbGxUcmFjZS5hZGQoImlzU2F2ZU9uQ2xvc2VOZWVkZWQiKTsKLSAgICAgICAgcmV0dXJuIHNhdmVOZWVkZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2F2ZUFzQWxsb3dlZChib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCkgewotICAgICAgICB0aGlzLnNhdmVBc0FsbG93ZWQgPSBpc1NhdmVBc0FsbG93ZWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFNhdmVOZWVkZWQoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBzYXZlTmVlZGVkID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tXb3JrYmVuY2hQYXJ0I2dldEFjdGlvbkJhcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgewotICAgICAgICByZXR1cm4gZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2hvd0VkaXRvcklucHV0I3Nob3dFZGl0b3JJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd0VkaXRvcklucHV0KElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgewotICAgICAgICBjYWxsVHJhY2UuYWRkKCJzaG93RWRpdG9ySW5wdXQiKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tQYXJ0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjc3ZjM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5FdmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5DYWxsSGlzdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIG1vY2sgaW50cm8gYW5kIHdvcmtiZW5jaCBwYXJ0cy4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgTW9ja1BhcnQgZXh0ZW5kcyBFdmVudE1hbmFnZXIgaW1wbGVtZW50cyBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgTW9ja1BhcnQoKSB7Ci0gICAgICAgIGNhbGxUcmFjZSA9IG5ldyBDYWxsSGlzdG9yeSh0aGlzKTsKLSAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIgPSBuZXcgTW9ja1NlbGVjdGlvblByb3ZpZGVyKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENhbGxIaXN0b3J5IGNhbGxUcmFjZTsKLQotICAgIHByb3RlY3RlZCBNb2NrU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0KLSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWc7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBkYXRhOwotCi0gICAgcHJpdmF0ZSBJbWFnZSB0aXRsZUltYWdlOwotCi0gICAgcHJpdmF0ZSBEaXNwb3NlTGlzdGVuZXIgZGlzcG9zZUxpc3RlbmVyID0gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAJLyogKG5vbi1KYXZhZG9jKQotICAgIAkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyI3dpZGdldERpc3Bvc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50KQotICAgIAkgKi8KLSAgICAJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLSAgICAJCU1vY2tQYXJ0LnRoaXMud2lkZ2V0RGlzcG9zZWQoKTsKLSAgICAJfQotICAgIH07Ci0gICAgCi0gICAgcHVibGljIENhbGxIaXN0b3J5IGdldENhbGxIaXN0b3J5KCkgewotICAgICAgICByZXR1cm4gY2FsbFRyYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBJU2VsZWN0aW9uUHJvdmlkZXIgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3Rpb25Qcm92aWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgCQotICAgIAljYWxsVHJhY2UuYWRkKCJzZXRJbml0aWFsaXphdGlvbkRhdGEiKTsKLSAgICAJCi0gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwotICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwotCi0gICAgICAgIC8vIEljb24uCi0gICAgICAgIFN0cmluZyBzdHJJY29uID0gY29uZmlnLmdldEF0dHJpYnV0ZSgiaWNvbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHN0ckljb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIAlCdW5kbGUgcGx1Z2luID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGNvbmZpZy5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgVVJMIGluc3RhbGxVUkwgPSBwbHVnaW4uZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIFVSTCBmdWxsUGF0aFN0cmluZyA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgc3RySWNvbik7Ci0gICAgICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzYyA9IEltYWdlRGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUZyb21VUkwoZnVsbFBhdGhTdHJpbmcpOwotICAgICAgICAgICAgICAgIHRpdGxlSW1hZ2UgPSBpbWFnZURlc2MuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZygpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERhdGEoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIC8vIFRoaXMgaXNuJ3QgYWN0dWFsbHkgcGFydCBvZiB0aGUgcGFydCBBUEksIGJ1dCB3ZSBjYWxsIHRoaXMgbWV0aG9kIGZyb20gYSBkaXNwb3NlIGxpc3RlbmVyCi0gICAgLy8gaW4gb3JkZXIgdG8gbWFyayB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgd2lkZ2V0cyBhcmUgZGlzcG9zZWQKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZCgpIHsKLSAgICAJY2FsbFRyYWNlLmFkZCgid2lkZ2V0RGlzcG9zZWQiKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBJV29ya2JlbmNoUGFydCNhZGRQcm9wZXJ0eUxpc3RlbmVyKElQcm9wZXJ0eUxpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgYWRkTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY2FsbFRyYWNlLmFkZCgiY3JlYXRlUGFydENvbnRyb2wiKTsKLSAgICAgICAgCi0gICAgICAgIHBhcmVudC5hZGREaXNwb3NlTGlzdGVuZXIoZGlzcG9zZUxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGNhbGxUcmFjZS5hZGQoImRpc3Bvc2UiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hQYXJ0I2dldFRpdGxlSW1hZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRUaXRsZUltYWdlKCkgewotICAgICAgICByZXR1cm4gdGl0bGVJbWFnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hQYXJ0I3JlbW92ZVByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcihJUHJvcGVydHlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICByZW1vdmVMaXN0ZW5lck9iamVjdChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIGNhbGxUcmFjZS5hZGQoInNldEZvY3VzIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJQWRhcHRhYmxlI2dldEFkYXB0ZXIoQ2xhc3MpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFyZzApIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlyZXMgYSBzZWxlY3Rpb24gb3V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpcmVTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLmZpcmVTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaXJlcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoaW50IHByb3BlcnR5SWQpIHsKLSAgICAgICAgT2JqZWN0W10gbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJUHJvcGVydHlMaXN0ZW5lciBsID0gKElQcm9wZXJ0eUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICBsLnByb3BlcnR5Q2hhbmdlZCh0aGlzLCBwcm9wZXJ0eUlkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGJvb2xlYW4gdG8gZGVjbGFyZSB3aGV0aGVyIHRoZSBzaXRlIHdhcyBwcm9wZXJseSBpbml0aWFsaXplZCBpbiB0aGUgaW5pdCBtZXRob2QuIAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaXRlU3RhdGUgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGUgc2l0ZSB3YXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQgaW4gdGhlIGluaXQgbWV0aG9kLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFNpdGVJbml0aWFsaXplZChib29sZWFuIGluaXRpYWxpemVkKSB7Ci0gICAgICAgIHNpdGVTdGF0ZSA9IGluaXRpYWxpemVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgc2l0ZSB3YXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQgaW4gdGhlIGluaXQgbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2l0ZUluaXRpYWxpemVkKCkgewotICAgICAgICByZXR1cm4gc2l0ZVN0YXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tQYXJ0TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tQYXJ0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwNTQ2ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrUGFydExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQ2FsbEhpc3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBNb2NrUGFydExpc3RlbmVyIGltcGxlbWVudHMgSVBhcnRMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBDYWxsSGlzdG9yeSBjYWxsVHJhY2U7Ci0KLSAgICBwdWJsaWMgTW9ja1BhcnRMaXN0ZW5lcigpIHsKLSAgICAgICAgY2FsbFRyYWNlID0gbmV3IENhbGxIaXN0b3J5KHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBDYWxsSGlzdG9yeSBnZXRDYWxsSGlzdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxUcmFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgY2FsbFRyYWNlLmFkZCgicGFydEFjdGl2YXRlZCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICBjYWxsVHJhY2UuYWRkKCJwYXJ0QnJvdWdodFRvVG9wIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIGNhbGxUcmFjZS5hZGQoInBhcnRDbG9zZWQiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIGNhbGxUcmFjZS5hZGQoInBhcnREZWFjdGl2YXRlZCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICBjYWxsVHJhY2UuYWRkKCJwYXJ0T3BlbmVkIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja1Byb3BlcnR5TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tQcm9wZXJ0eUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDY1MGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja1Byb3BlcnR5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQ2FsbEhpc3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBNb2NrUHJvcGVydHlMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIENhbGxIaXN0b3J5IGNhbGxUcmFjZTsKLQotICAgIHByaXZhdGUgT2JqZWN0IHNvdXJjZU1hc2s7Ci0KLSAgICBwcml2YXRlIGludCBzb3VyY2VJZDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIGV2ZW50IHNvdXJjZSB0aGF0IGZpcmVzIHRoZSBldmVudCB0byB0aGlzIGxpc3RlbmVyCi0gICAgICogQHBhcmFtIGlkIHRoZSBwcm9wZXJ0eSBpZCBmb3IgdGhlIGV2ZW50Ci0gICAgICovCi0gICAgcHVibGljIE1vY2tQcm9wZXJ0eUxpc3RlbmVyKE9iamVjdCBzb3VyY2UsIGludCBpZCkgewotICAgICAgICBzb3VyY2VNYXNrID0gc291cmNlOwotICAgICAgICBzb3VyY2VJZCA9IGlkOwotICAgICAgICBjYWxsVHJhY2UgPSBuZXcgQ2FsbEhpc3RvcnkodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUHJvcGVydHlMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0LCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBzb3VyY2VNYXNrICYmIHByb3BJZCA9PSBzb3VyY2VJZCkKLSAgICAgICAgICAgIGNhbGxUcmFjZS5hZGQoInByb3BlcnR5Q2hhbmdlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDYWxsSGlzdG9yeSBnZXRDYWxsSGlzdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxUcmFjZTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja1NlbGVjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZWUwMjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja1NlbGVjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIE1vY2tTZWxlY3Rpb25Qcm92aWRlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgzKTsKLQotICAgIC8qKgotICAgICAqIEZpcmVzIG91dCBhIHNlbGVjdGlvbiB0byBhbGwgbGlzdGVuZXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpcmVTZWxlY3Rpb24oKSB7Ci0gICAgICAgIGZpcmVTZWxlY3Rpb24obmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlyZXMgb3V0IGEgc2VsZWN0aW9uIHRvIGFsbCBsaXN0ZW5lcnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlyZVNlbGVjdGlvbihTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICgoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgaXRlci5uZXh0KCkpLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVNlbGVjdGlvblByb3ZpZGVyI3JlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLSAgICAgICAgICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrVmlld0FjdGlvbkRlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrVmlld0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNTk0MGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja1ZpZXdBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotCi0vKioKLSAqIFRoaXMgbW9jayBpcyB1c2VkIHRvIHRlc3QgSVZpZXdBY3Rpb25EZWxlZ2F0ZSBsaWZlY3ljbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2NrVmlld0FjdGlvbkRlbGVnYXRlIGV4dGVuZHMgTW9ja0FjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMKLSAgICAgICAgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIE1vY2tXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZQotICAgICAqLwotICAgIHB1YmxpYyBNb2NrVmlld0FjdGlvbkRlbGVnYXRlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KElWaWV3UGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0gICAgICAgIGNhbGxIaXN0b3J5LmFkZCgiaW5pdCIpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja1ZpZXdQYXJ0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrVmlld1BhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4MGY0OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrVmlld1BhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaEltYWdlczsKLQotcHVibGljIGNsYXNzIE1vY2tWaWV3UGFydCBleHRlbmRzIE1vY2tXb3JrYmVuY2hQYXJ0IGltcGxlbWVudHMgSVZpZXdQYXJ0IHsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1ZpZXdQYXJ0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEMiA9IElEICsgIjIiOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQzID0gSUQgKyAiMyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRDQgPSBJRCArICI0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElETVVMVCA9IElEICsgIk11bHQiOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTkFNRSA9ICJNb2NrIFZpZXcgMSI7Ci0KLSAgICBwcml2YXRlIENvbnRyaWJ1dGlvbkl0ZW0gdG9vbGJhckl0ZW0gPSBuZXcgQ29udHJpYnV0aW9uSXRlbSgic29tZUlkIikgewotCi0gICAgCXByaXZhdGUgRGlzcG9zZUxpc3RlbmVyIGRpc3Bvc2VMaXN0ZW5lciA9IG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotICAgIAkJCXRvb2xiYXJDb250cmlidXRpb25JdGVtV2lkZ2V0RGlzcG9zZWQoKTsKLSAgICAJCX0KLQotICAgIAl9OwotICAgIAkKLSAgICAJcHVibGljIHZvaWQgZmlsbChUb29sQmFyIHBhcmVudCwgaW50IGluZGV4KSB7Ci0gICAgCQlzdXBlci5maWxsKHBhcmVudCwgaW5kZXgpOwotICAgIAkJCi0gICAgCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKHBhcmVudCwgaW5kZXgpOwotICAgIAkJCi0gICAgCQlpdGVtLmFkZERpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlTGlzdGVuZXIpOwotICAgIAkJaXRlbS5zZXRJbWFnZShXb3JrYmVuY2hJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfREVGX1ZJRVcpKTsKLSAgICAJfQotICAgIAkKLSAgICAJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAJCXRvb2xiYXJDb250cmlidXRpb25JdGVtRGlzcG9zZWQoKTsKLSAgICAJCXN1cGVyLmRpc3Bvc2UoKTsKLSAgICAJfQotICAgIH07Ci0gICAgCi0gICAgcHVibGljIE1vY2tWaWV3UGFydCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLQkvKioKLSAgICAgKiBAc2VlIElWaWV3UGFydCNnZXRWaWV3U2l0ZSgpCi0gICAgICovCi0gICAgcHVibGljIElWaWV3U2l0ZSBnZXRWaWV3U2l0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChJVmlld1NpdGUpIGdldFNpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElWaWV3UGFydCNpbml0KElWaWV3U2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBzZXRTaXRlKHNpdGUpOwotICAgICAgICBjYWxsVHJhY2UuYWRkKCJpbml0Iik7Ci0gICAgICAgIHNldFNpdGVJbml0aWFsaXplZCgpOwotICAgICAgICBhZGRUb29sYmFyQ29udHJpYnV0aW9uSXRlbSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVZpZXdQYXJ0I2luaXQoSVZpZXdTaXRlLCBJTWVtZW50bykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlLCBJTWVtZW50byBtZW1lbnRvKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBzZXRTaXRlKHNpdGUpOwotICAgICAgICBjYWxsVHJhY2UuYWRkKCJpbml0Iik7Ci0gICAgICAgIHNldFNpdGVJbml0aWFsaXplZCgpOwotICAgICAgICBhZGRUb29sYmFyQ29udHJpYnV0aW9uSXRlbSgpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1BhcnQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gVGVzdCBmb3IgYnVnIDk0NDU3OiBUaGUgY29udHJpYnV0aW9uIGl0ZW1zIG11c3Qgc3RpbGwgYmUgaW4gdGhlIHRvb2xiYXIgbWFuYWdlciBhdCB0aGUKLQkJLy8gdGltZSB0aGUgcGFydCBpcyBkaXNwb3NlZC4gKENoYW5naW5nIHRoaXMgYmVoYXZpb3Igd291bGQgYmUgYSBicmVha2luZyBjaGFuZ2UgZm9yIHNvbWUKLQkJLy8gY2xpZW50cykuCi0JCUFzc2VydC5hc3NlcnRUcnVlKCAKLQkJCQkiQ29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzaXRlIHVudGlsIGFmdGVyIHRoZSBwYXJ0IGlzIGRpc3Bvc2VkIiwgCi0JCQkJZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKS5maW5kKHRvb2xiYXJJdGVtLmdldElkKCkpCi0JCQkJPT0gdG9vbGJhckl0ZW0gKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUb29sYmFyQ29udHJpYnV0aW9uSXRlbSgpIHsKLSAgICAJZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKS5hZGQodG9vbGJhckl0ZW0pOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIHRvb2xiYXJDb250cmlidXRpb25JdGVtV2lkZ2V0RGlzcG9zZWQoKSB7Ci0JCWNhbGxUcmFjZS5hZGQoInRvb2xiYXJDb250cmlidXRpb25JdGVtV2lkZ2V0RGlzcG9zZWQiKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdG9vbGJhckNvbnRyaWJ1dGlvbkl0ZW1EaXNwb3NlZCgpIHsKLSAgICAJY2FsbFRyYWNlLmFkZCgidG9vbGJhckNvbnRyaWJ1dGlvbkl0ZW1EaXNwb3NlZCIpOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBAc2VlIElWaWV3UGFydCNzYXZlU3RhdGUoSU1lbWVudG8pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1dvcmtiZW5jaFBhcnQjZ2V0QWN0aW9uQmFycygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tWaWV3UGFydE11bHQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tWaWV3UGFydE11bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjODA1MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrVmlld1BhcnRNdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIG11bHRpLWluc3RhbmNlIG1vY2sgdmlldy4KLSAqIEhhcyBhIGJ1dHRvbiB0byBvcGVuIGFub3RoZXIuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIE1vY2tWaWV3UGFydE11bHQgZXh0ZW5kcyBNb2NrVmlld1BhcnQgewotCXN0YXRpYyBpbnQgY291bnRlciA9IDE7Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCQkKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJPcGVuIEFub3RoZXIiKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9wZW5Bbm90aGVyKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IHN1cGVyLmdldFRpdGxlKCk7Ci0JCVN0cmluZyBzZWNvbmRhcnlJZCA9IGdldFZpZXdTaXRlKCkuZ2V0U2Vjb25kYXJ5SWQoKTsKLQkJaWYgKHNlY29uZGFyeUlkICE9IG51bGwpIHsKLQkJCXRpdGxlICs9ICIgIiArIHNlY29uZGFyeUlkOwotCQl9Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIG9wZW5Bbm90aGVyKCkgewotCQlTdHJpbmcgc2Vjb25kYXJ5SWQgPSBTdHJpbmcudmFsdWVPZigrK2NvdW50ZXIpOwotCQl0cnkgewotCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5zaG93VmlldyhNb2NrVmlld1BhcnQuSURNVUxULCBzZWNvbmRhcnlJZCwgSVdvcmtiZW5jaFBhZ2UuVklFV19BQ1RJVkFURSk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrV29ya2JlbmNoUGFydC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja1dvcmtiZW5jaFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1N2I3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrV29ya2JlbmNoUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9ja1dvcmtiZW5jaFBhcnQgZXh0ZW5kcyBNb2NrUGFydCBpbXBsZW1lbnRzCi0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotICAgIHB1YmxpYyBNb2NrV29ya2JlbmNoUGFydCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaXRlKElXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlKSB7Ci0gICAgICAgIHRoaXMuc2l0ZSA9IHNpdGU7Ci0gICAgICAgIHNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIoc2VsZWN0aW9uUHJvdmlkZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KHRpdGxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVdvcmtiZW5jaFBhcnRTaXRlIGdldFNpdGUoKSB7Ci0gICAgICAgIHJldHVybiBzaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFBhcnQjZ2V0VGl0bGUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiB0aXRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hQYXJ0I2dldFRpdGxlVG9vbFRpcCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUaXRsZVRvb2xUaXAoKSB7Ci0gICAgICAgIHJldHVybiB0aXRsZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1BhcnQjc2V0SW5pdGlhbGl6YXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsCi0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHN1cGVyLnNldEluaXRpYWxpemF0aW9uRGF0YShjb25maWcsIHByb3BlcnR5TmFtZSwgZGF0YSk7Ci0gICAgICAgIHRpdGxlID0gY29uZmlnLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFNpdGVJbml0aWFsaXplZCgpIHsKLSAgICAgICAgc2V0U2l0ZUluaXRpYWxpemVkKGdldFNpdGUoKS5nZXRLZXlCaW5kaW5nU2VydmljZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmIGdldFNpdGUoKS5nZXRQYWdlKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYgZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYgZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmIHRlc3RBY3Rpb25CYXJzKGdldEFjdGlvbkJhcnMoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhY3Rpb25CYXJzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBiYXJzKSB7Ci0gICAgICAgIHJldHVybiBiYXJzICE9IG51bGwgJiYgYmFycy5nZXRNZW51TWFuYWdlcigpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSAhPSBudWxsOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja1dvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYmE5NzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja1dvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIE1vY2tXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIE1vY2tBY3Rpb25EZWxlZ2F0ZQotICAgICAgICBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiB7Ci0gICAgcHVibGljIHN0YXRpYyBNb2NrV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgbGFzdERlbGVnYXRlOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VUX0lEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uU2V0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrV2luZG93QWN0aW9uIjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBNb2NrV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTW9ja1dvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBsYXN0RGVsZWdhdGUgPSB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQoSVdvcmtiZW5jaFdpbmRvdykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgIGNhbGxIaXN0b3J5LmFkZCgiaW5pdCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGNhbGxIaXN0b3J5LmFkZCgiZGlzcG9zZSIpOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJY2FsbEhpc3RvcnkuYWRkKCJpbml0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQljYWxsSGlzdG9yeS5hZGQoInJ1bldpdGhFdmVudCIpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvTW9ja1dvcmtpbmdTZXRQYWdlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrV29ya2luZ1NldFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2ODQ4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrV29ya2luZ1NldFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVdvcmtpbmdTZXRQYWdlOwotCi0vKioKLSAqIFRlc3RzIHRoZSBvcmcuZWNsaXBzZS51aS53b3JraW5nU2V0cyBleHRlbnNpb24gcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2NrV29ya2luZ1NldFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgSVdvcmtpbmdTZXRQYWdlIHsKLSAgICBwcml2YXRlIElXb3JraW5nU2V0IHdvcmtpbmdTZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTW9ja1dvcmtpbmdTZXRQYWdlKCkgewotICAgICAgICBzdXBlcigKLSAgICAgICAgICAgICAgICAiTW9ja1dvcmtpbmdTZXRQYWdlIiwgIlRlc3QgV29ya2luZyBTZXQiLCBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKTsgLy8kTk9OLU5MUy0xJCAkTk9OLU5MUy0yJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlcyBtZXRob2QgaW4gV2l6YXJkUGFnZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudHMgSVdvcmtpbmdTZXRQYWdlLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JV29ya2luZ1NldFBhZ2UjZ2V0U2VsZWN0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtpbmdTZXQgZ2V0U2VsZWN0aW9uKCkgewotICAgICAgICByZXR1cm4gd29ya2luZ1NldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRzIElXb3JraW5nU2V0UGFnZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVdvcmtpbmdTZXRQYWdlI3NldFNlbGVjdGlvbihJV29ya2luZ1NldCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVdvcmtpbmdTZXQgd29ya2luZ1NldCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JV29ya2luZ1NldFBhZ2UjZmluaXNoKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Nb2NrV29ya2luZ1NldFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tXb3JraW5nU2V0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Y4M2Q0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL01vY2tXb3JraW5nU2V0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5Xb3JraW5nU2V0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5Xb3JraW5nU2V0UmVnaXN0cnk7Ci0KLS8qKgotICogVGVzdHMgdGhlIFdvcmtpbmdTZXREZXNjcmlwdG9yIGFuZCBXb3JraW5nU2V0UmVnaXN0cnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2NrV29ya2luZ1NldFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgZmluYWwgc3RhdGljIFN0cmluZyBXT1JLSU5HX1NFVF9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1dvcmtpbmdTZXQiOwotCi0gICAgZmluYWwgc3RhdGljIFN0cmluZyBXT1JLSU5HX1NFVF9OQU1FID0gIk1vY2sgV29ya2luZyBTZXQiOwotCi0gICAgZmluYWwgc3RhdGljIFN0cmluZyBXT1JLSU5HX1NFVF9QQUdFX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tXb3JraW5nU2V0UGFnZSI7Ci0KLSAgICBXb3JraW5nU2V0UmVnaXN0cnkgZlJlZ2lzdHJ5OwotCi0gICAgcHVibGljIE1vY2tXb3JraW5nU2V0VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgZlJlZ2lzdHJ5ID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JraW5nU2V0UmVnaXN0cnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V29ya2luZ1NldERlc2NyaXB0b3IoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgV29ya2luZ1NldERlc2NyaXB0b3Igd29ya2luZ1NldERlc2NyaXB0b3IgPSBmUmVnaXN0cnkKLSAgICAgICAgICAgICAgICAuZ2V0V29ya2luZ1NldERlc2NyaXB0b3IoV09SS0lOR19TRVRfSUQpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwod29ya2luZ1NldERlc2NyaXB0b3IuZ2V0SWNvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdPUktJTkdfU0VUX0lELCB3b3JraW5nU2V0RGVzY3JpcHRvci5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdPUktJTkdfU0VUX05BTUUsIHdvcmtpbmdTZXREZXNjcmlwdG9yLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXT1JLSU5HX1NFVF9QQUdFX0NMQVNTX05BTUUsIHdvcmtpbmdTZXREZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgLmdldFBhZ2VDbGFzc05hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdvcmtpbmdTZXRSZWdpc3RyeSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBXb3JraW5nU2V0RGVzY3JpcHRvcltdIHdvcmtpbmdTZXREZXNjcmlwdG9ycyA9IGZSZWdpc3RyeQotICAgICAgICAgICAgICAgIC5nZXRXb3JraW5nU2V0RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogU2hvdWxkIGhhdmUgYXQgbGVhc3QgcmVzb3VyY2VXb3JraW5nU2V0UGFnZSBhbmQgTW9ja1dvcmtpbmdTZXQKLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydFRydWUod29ya2luZ1NldERlc2NyaXB0b3JzLmxlbmd0aCA+PSAyKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xhc3MuZm9yTmFtZShXT1JLSU5HX1NFVF9QQUdFX0NMQVNTX05BTUUpLCBmUmVnaXN0cnkKLSAgICAgICAgICAgICAgICAuZ2V0V29ya2luZ1NldFBhZ2UoV09SS0lOR19TRVRfSUQpLmdldENsYXNzKCkpOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9QZXJzcGVjdGl2ZVZpZXdzQnVnMTIwOTM0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9QZXJzcGVjdGl2ZVZpZXdzQnVnMTIwOTM0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDIzM2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvUGVyc3BlY3RpdmVWaWV3c0J1ZzEyMDkzNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotCi0vKioKLSAqIEEgbGF5b3V0IHRoYXQgY2FuIHRyaWdnZXIgYW4gcHJvYmxlbSBpbnRlcmFjdGlvbiBiZXR3ZWVuIAotICoge0BsaW5rIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMudXRpbC5QcmVzZW50YWJsZVBhcnRGb2xkZXJ9Ci0gKiBhbmQge0BsaW5rIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZXNlbnRhdGlvbnMuZGVmYXVsdHByZXNlbnRhdGlvbi5FbXB0eVRhYkZvbGRlcn0uCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlVmlld3NCdWcxMjA5MzQgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTUF9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuUGVyc3BlY3RpdmVWaWV3c0J1ZzEyMDkzNCI7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3RvcnkjY3JlYXRlSW5pdGlhbExheW91dChvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotCQlsYXlvdXQuYWRkVmlldyhJUGFnZUxheW91dC5JRF9CT09LTUFSS1MsIElQYWdlTGF5b3V0LlJJR0hULCAwLjI1ZiwKLQkJCQlJUGFnZUxheW91dC5JRF9FRElUT1JfQVJFQSk7Ci0JCWxheW91dC5hZGRTdGFuZGFsb25lVmlldyhJUGFnZUxheW91dC5JRF9PVVRMSU5FLCBmYWxzZSwKLQkJCQlJUGFnZUxheW91dC5UT1AsIC4zZiwgSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTKTsKLQkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKGZhbHNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9QZXJzcGVjdGl2ZVZpZXdzQnVnODgzNDUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1BlcnNwZWN0aXZlVmlld3NCdWc4ODM0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDQ2MWM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1BlcnNwZWN0aXZlVmlld3NCdWc4ODM0NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBwZXJzcGVjdGl2ZSBpcyB1c2VkIGZvciB0ZXN0aW5nIGFwaS4gSXQgZGVmaW5lcyBhbiBpbml0aWFsIGxheW91dCB3aXRoCi0gKiBwbGFjZWhvbGRlcnMgZm9yIHNvbWUgdmlld3MsIHRvIGJlIHVzZWQgdG8gdGVzdCBjbG9zaW5nIGZhc3Qgdmlld3MuIFRoZQotICogcGxhY2Vob2xkZXJzIGFyZSBhZGRlZCBhdCB0b3AgbGV2ZWwgKG5vdCBpbiBhbnkgZm9sZGVyKS4KLSAqIAotICogQHNpbmNlIDMuMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVZpZXdzQnVnODgzNDUgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PUk1BTF9WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLkNvbnRlbnRPdXRsaW5lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTUF9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuUGVyc3BlY3RpdmVWaWV3c0J1Zzg4MzQ1IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFX0lEID0gTW9ja1ZpZXdQYXJ0LklETVVMVCArICI6MSI7Ci0JLyoqCi0JICogQSB2aWV3IHdpdGggYSB0b29sYmFyIChub3QgYSByb29tIHdpdGggYSB2aWV3KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NIRUVUX0lEID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiOwotCi0JcHVibGljIFBlcnNwZWN0aXZlVmlld3NCdWc4ODM0NSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCWxheW91dC5hZGRWaWV3KE1vY2tWaWV3UGFydC5JRE1VTFQsIElQYWdlTGF5b3V0LkxFRlQsIDAuMzNmLAotCQkJCUlQYWdlTGF5b3V0LklEX0VESVRPUl9BUkVBKTsKLQkJbGF5b3V0LmFkZFZpZXcoTk9STUFMX1ZJRVdfSUQsCi0JCQkJSVBhZ2VMYXlvdXQuUklHSFQsIDAuMjVmLCBJUGFnZUxheW91dC5JRF9FRElUT1JfQVJFQSk7Ci0JCWxheW91dC5hZGRWaWV3KFBST1BfU0hFRVRfSUQsIElQYWdlTGF5b3V0LlJJR0hULCAwLjc1ZiwgTk9STUFMX1ZJRVdfSUQpOwotCQlsYXlvdXQuZ2V0Vmlld0xheW91dChNb2NrVmlld1BhcnQuSURNVUxUKS5zZXRDbG9zZWFibGUoZmFsc2UpOwotCQkKLQkJLy8gYWRkZWQgZm9yIHRoZSBidWcgOTk3MjMgdGVzdAotCQlsYXlvdXQuYWRkRmFzdFZpZXcoTU9WRV9JRCk7Ci0JCWxheW91dC5nZXRWaWV3TGF5b3V0KE1PVkVfSUQpLnNldE1vdmVhYmxlKGZhbHNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9QZXJzcGVjdGl2ZVdpdGhGYXN0Vmlldy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvUGVyc3BlY3RpdmVXaXRoRmFzdFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlN2YxNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9QZXJzcGVjdGl2ZVdpdGhGYXN0Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBwZXJzcGVjdGl2ZSBpcyB1c2VkIGZvciB0ZXN0aW5nIGFwaS4gSXQgZGVmaW5lcyBhbiBpbml0aWFsIGxheW91dCB3aXRoIGEKLSAqIGZhc3Qgdmlldy4KLSAqLwotcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlV2l0aEZhc3RWaWV3IGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTUF9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5mYXN0dmlld19wZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRGVmYXVsdCBsYXlvdXQgZW5naW5lLgotICAgICAqLwotICAgIHB1YmxpYyBQZXJzcGVjdGl2ZVdpdGhGYXN0VmlldygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3RvcnkjY3JlYXRlSW5pdGlhbExheW91dChvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotICAgICAgICBkZWZpbmVMYXlvdXQobGF5b3V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmUgdGhlIGluaXRpYWwgbGF5b3V0IGJ5IGFkZGluZyBhIGZhc3Qgdmlldy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGF5b3V0Ci0gICAgICogICAgICAgICAgICBUaGUgcGFnZSBsYXlvdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVmaW5lTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotICAgICAgICBsYXlvdXQuYWRkRmFzdFZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlJlc291cmNlTmF2aWdhdG9yIiwgLjhmKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1BlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0F0VG9wTGV2ZWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1BlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0F0VG9wTGV2ZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2YjA3Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9QZXJzcGVjdGl2ZVdpdGhNdWx0aVZpZXdQbGFjZWhvbGRlcnNBdFRvcExldmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIHBlcnNwZWN0aXZlIGlzIHVzZWQgZm9yIHRlc3RpbmcgYXBpLiBJdCBkZWZpbmVzIGFuIGluaXRpYWwgbGF5b3V0IHdpdGggCi0gKiBwbGFjZWhvbGRlcnMgZm9yIG11bHRpLWluc3RhbmNlIHZpZXdzLCBpbmNsdWRpbmcgd2lsZGNhcmRzLgotICogVGhlIHBsYWNlaG9sZGVycyBhcmUgYWRkZWQgYXQgdG9wIGxldmVsIChub3QgaW4gYW55IGZvbGRlcikuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0F0VG9wTGV2ZWwgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNQX0lEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLlBlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0F0VG9wTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgUGVyc3BlY3RpdmVXaXRoTXVsdGlWaWV3UGxhY2Vob2xkZXJzQXRUb3BMZXZlbCgpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0gICAgICAgIGxheW91dC5hZGRQbGFjZWhvbGRlcigiKiIsIElQYWdlTGF5b3V0LkxFRlQsIDAuNWYsIElQYWdlTGF5b3V0LklEX0VESVRPUl9BUkVBKTsKLSAgICAgICAgbGF5b3V0LmFkZFBsYWNlaG9sZGVyKE1vY2tWaWV3UGFydC5JRE1VTFQsIElQYWdlTGF5b3V0LkxFRlQsIDAuNWYsIElQYWdlTGF5b3V0LklEX0VESVRPUl9BUkVBKTsKLSAgICAgICAgbGF5b3V0LmFkZFBsYWNlaG9sZGVyKE1vY2tWaWV3UGFydC5JRE1VTFQgKyAiOnNlY29uZGFyeUlkIiwgSVBhZ2VMYXlvdXQuTEVGVCwgMC41ZiwgSVBhZ2VMYXlvdXQuSURfRURJVE9SX0FSRUEpOwotICAgICAgICBsYXlvdXQuYWRkUGxhY2Vob2xkZXIoTW9ja1ZpZXdQYXJ0LklETVVMVCArICI6KiIsIElQYWdlTGF5b3V0LkxFRlQsIDAuNWYsIElQYWdlTGF5b3V0LklEX0VESVRPUl9BUkVBKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9QZXJzcGVjdGl2ZVdpdGhNdWx0aVZpZXdQbGFjZWhvbGRlcnNJbkZvbGRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvUGVyc3BlY3RpdmVXaXRoTXVsdGlWaWV3UGxhY2Vob2xkZXJzSW5Gb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1ODYyOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9QZXJzcGVjdGl2ZVdpdGhNdWx0aVZpZXdQbGFjZWhvbGRlcnNJbkZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci0KLS8qKgotICogVGhpcyBwZXJzcGVjdGl2ZSBpcyB1c2VkIGZvciB0ZXN0aW5nIGFwaS4gSXQgZGVmaW5lcyBhbiBpbml0aWFsIGxheW91dCB3aXRoIAotICogcGxhY2Vob2xkZXJzIGZvciBtdWx0aS1pbnN0YW5jZSB2aWV3cywgaW5jbHVkaW5nIHdpbGRjYXJkcy4KLSAqIFRoZSBwbGFjZWhvbGRlcnMgYXJlIGFkZGVkIGluIGEgZm9sZGVyIChub3QgYSBwbGFjZWhvbGRlciBmb2xkZXIpLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVdpdGhNdWx0aVZpZXdQbGFjZWhvbGRlcnNJbkZvbGRlciBleHRlbmRzIFBlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0luUGxhY2Vob2xkZXJGb2xkZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU1BfSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuUGVyc3BlY3RpdmVXaXRoTXVsdGlWaWV3UGxhY2Vob2xkZXJzSW5Gb2xkZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgUGVyc3BlY3RpdmVXaXRoTXVsdGlWaWV3UGxhY2Vob2xkZXJzSW5Gb2xkZXIoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotICAgICAgICBJRm9sZGVyTGF5b3V0IGZvbGRlciA9IGxheW91dC5jcmVhdGVGb2xkZXIoImZvbGRlciIsIElQYWdlTGF5b3V0LkxFRlQsIDAuNWYsIElQYWdlTGF5b3V0LklEX0VESVRPUl9BUkVBKTsKLSAgICAgICAgYWRkUGxhY2Vob2xkZXJzKGZvbGRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvUGVyc3BlY3RpdmVXaXRoTXVsdGlWaWV3UGxhY2Vob2xkZXJzSW5QbGFjZWhvbGRlckZvbGRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvUGVyc3BlY3RpdmVXaXRoTXVsdGlWaWV3UGxhY2Vob2xkZXJzSW5QbGFjZWhvbGRlckZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzM3YjdjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1BlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0luUGxhY2Vob2xkZXJGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQbGFjZWhvbGRlckZvbGRlckxheW91dDsKLQotLyoqCi0gKiBUaGlzIHBlcnNwZWN0aXZlIGlzIHVzZWQgZm9yIHRlc3RpbmcgYXBpLiBJdCBkZWZpbmVzIGFuIGluaXRpYWwgbGF5b3V0IHdpdGggCi0gKiBwbGFjZWhvbGRlcnMgZm9yIG11bHRpLWluc3RhbmNlIHZpZXdzLCBpbmNsdWRpbmcgd2lsZGNhcmRzLgotICogVGhlIHBsYWNlaG9sZGVycyBhcmUgYWRkZWQgaW4gYSBwbGFjZWhvbGRlciBmb2xkZXIuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0luUGxhY2Vob2xkZXJGb2xkZXIgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNQX0lEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLlBlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0luUGxhY2Vob2xkZXJGb2xkZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgUGVyc3BlY3RpdmVXaXRoTXVsdGlWaWV3UGxhY2Vob2xkZXJzSW5QbGFjZWhvbGRlckZvbGRlcigpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0gICAgICAgIElQbGFjZWhvbGRlckZvbGRlckxheW91dCBmb2xkZXIgPSBsYXlvdXQuY3JlYXRlUGxhY2Vob2xkZXJGb2xkZXIoInBsYWNlaG9sZGVyRm9sZGVyIiwgSVBhZ2VMYXlvdXQuTEVGVCwgMC41ZiwgSVBhZ2VMYXlvdXQuSURfRURJVE9SX0FSRUEpOwotICAgICAgICBhZGRQbGFjZWhvbGRlcnMoZm9sZGVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUGxhY2Vob2xkZXJzKElQbGFjZWhvbGRlckZvbGRlckxheW91dCBmb2xkZXIpIHsKLSAgICAgICAgZm9sZGVyLmFkZFBsYWNlaG9sZGVyKCIqIik7Ci0gICAgICAgIGZvbGRlci5hZGRQbGFjZWhvbGRlcihNb2NrVmlld1BhcnQuSURNVUxUKTsKLSAgICAgICAgZm9sZGVyLmFkZFBsYWNlaG9sZGVyKE1vY2tWaWV3UGFydC5JRE1VTFQgKyAiOnNlY29uZGFyeUlkIik7Ci0gICAgICAgIGZvbGRlci5hZGRQbGFjZWhvbGRlcihNb2NrVmlld1BhcnQuSURNVUxUICsgIjoqIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvUGxhdGZvcm1VSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1BsYXRmb3JtVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZmUyNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvUGxhdGZvcm1VSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGVzdHMgdGhlIFBsYXRmb3JtVUkgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybVVJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBQbGF0Zm9ybVVJVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXb3JrYmVuY2goKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRnJvbSBKYXZhZG9jOiAiUmV0dXJucyB0aGUgd29ya2JlbmNoIGludGVyZmFjZS4iCi0gICAgICAgIElXb3JrYmVuY2ggd2IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UExVR0lOX0lEKCkgewotICAgICAgICAvLyBGcm9tIEphdmFkb2M6ICJJZGVudGlmaWVzIHRoZSB3b3JrYmVuY2ggcGx1Z2luLiIKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChQbGF0Zm9ybVVJLlBMVUdJTl9JRCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvU2F2ZWFibGVNb2NrVmlld1BhcnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1NhdmVhYmxlTW9ja1ZpZXdQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MGJiMWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvU2F2ZWFibGVNb2NrVmlld1BhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0OwotCi0vKioKLSAqIE1vY2sgdmlldyBwYXJ0IHRoYXQgaW1wbGVtZW50cyBJU2F2ZWFibGVQYXJ0LgotICogVXNlZCBmb3IgdGVzdGluZyBoaWRlVmlldyBhbmQgb3RoZXIgdmlldyBsaWZlY3ljbGUgb24gc2F2ZWFibGUgdmlld3MuCi0gKiAKLSAqIEBzaW5jZSAzLjAuMQotICovCi1wdWJsaWMgY2xhc3MgU2F2ZWFibGVNb2NrVmlld1BhcnQgZXh0ZW5kcyBNb2NrVmlld1BhcnQgaW1wbGVtZW50cwotCQlJU2F2ZWFibGVQYXJ0IHsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU2F2ZWFibGVNb2NrVmlld1BhcnQiOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGlydHkgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBzYXZlQXNBbGxvd2VkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2F2ZU5lZWRlZCA9IHRydWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCi0gICAgICAgIGZpbmFsIEJ1dHRvbiBkaXJ0eVRvZ2dsZSA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBkaXJ0eVRvZ2dsZS5zZXRUZXh0KCJEaXJ0eSIpOwotICAgICAgICBkaXJ0eVRvZ2dsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXREaXJ0eShkaXJ0eVRvZ2dsZS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBkaXJ0eVRvZ2dsZS5zZXRTZWxlY3Rpb24oaXNEaXJ0eSgpKTsKLQotICAgICAgICBmaW5hbCBCdXR0b24gc2F2ZU5lZWRlZFRvZ2dsZSA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBzYXZlTmVlZGVkVG9nZ2xlLnNldFRleHQoIlNhdmUgb24gY2xvc2UiKTsKLSAgICAgICAgc2F2ZU5lZWRlZFRvZ2dsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRTYXZlTmVlZGVkKHNhdmVOZWVkZWRUb2dnbGUuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgc2F2ZU5lZWRlZFRvZ2dsZS5zZXRTZWxlY3Rpb24oc2F2ZU5lZWRlZCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBCdXR0b24gc2F2ZUFzVG9nZ2xlID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHNhdmVBc1RvZ2dsZS5zZXRUZXh0KCJTYXZlIGFzIGFsbG93ZWQiKTsKLSAgICAgICAgc2F2ZUFzVG9nZ2xlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNldFNhdmVBc0FsbG93ZWQoc2F2ZUFzVG9nZ2xlLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHNhdmVBc1RvZ2dsZS5zZXRTZWxlY3Rpb24oc2F2ZUFzQWxsb3dlZCk7Ci0gICAgfQotICAgIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJY2FsbFRyYWNlLmFkZCgiZG9TYXZlIiApOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCQljYWxsVHJhY2UuYWRkKCJkb1NhdmVBcyIgKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWNhbGxUcmFjZS5hZGQoImlzRGlydHkiICk7Ci0JCXJldHVybiBpc0RpcnR5OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCWNhbGxUcmFjZS5hZGQoImlzU2F2ZUFzQWxsb3dlZCIgKTsKLQkJcmV0dXJuIHNhdmVBc0FsbG93ZWQgOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlT25DbG9zZU5lZWRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlT25DbG9zZU5lZWRlZCgpIHsKLQkJY2FsbFRyYWNlLmFkZCgiaXNTYXZlT25DbG9zZU5lZWRlZCIgKTsKLQkJcmV0dXJuIHNhdmVOZWVkZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBpc0RpcnR5KSB7Ci0JCXRoaXMuaXNEaXJ0eSA9IGlzRGlydHk7Ci0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U2F2ZUFzQWxsb3dlZChib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCkgewotICAgICAgICB0aGlzLnNhdmVBc0FsbG93ZWQgPSBpc1NhdmVBc0FsbG93ZWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFNhdmVOZWVkZWQoYm9vbGVhbiBpc1NhdmVPbkNsb3NlTmVlZGVkKSB7Ci0gICAgICAgIHRoaXMuc2F2ZU5lZWRlZCA9IGlzU2F2ZU9uQ2xvc2VOZWVkZWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvU2Vzc2lvbkNyZWF0ZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1Nlc3Npb25DcmVhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMGQwNTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvU2Vzc2lvbkNyZWF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRW1wdHlQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogU2Vzc2lvbkNyZWF0ZVRlc3QgcnVucyB0aGUgZmlyc3QgaGFsZiBvZiBvdXIgc2Vzc2lvbgotICogcHJlc2lzdGFuY2UgdGVzdHMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25DcmVhdGVUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hXaW5kb3dbXSBvbGRXaW5kb3dzOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEVTVF9QUk9KID0gInNlc3Npb25UZXN0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRFU1RfRklMRV8xID0gIm9uZS5tb2NrMSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBURVNUX0ZJTEVfMiA9ICJ0d28ubW9jazEiOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEVTVF9GSUxFXzMgPSAidGhyZWUubW9jazEiOwotCi0gICAgLyoqIAotICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2Vzc2lvbkNyZWF0ZVRlc3QoU3RyaW5nIGFyZykgewotICAgICAgICBzdXBlcihhcmcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhIHNlc3Npb24gc3RhdGUgaW4gdGhlIHdvcmtiZW5jaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2Vzc2lvbkNyZWF0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlOwotCi0gICAgICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIHdpbmRvd3MuICBXZSBjbG9zZSBhbGwgb2YKLSAgICAgICAgLy8gdGhlc2UgYXQgdGhlIGVuZCwgYWZ0ZXIgdGhlIHRlc3Qgd2luZG93cyBoYXZlCi0gICAgICAgIC8vIGJlZW4gY3JlYXRlZC4KLSAgICAgICAgc2F2ZU9yaWdpbmFsV2luZG93cygpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0ZXN0IHdpbmRvdyB3aXRoIGVtcHR5IHBlcnNwZWN0aXZlLgotICAgICAgICB3aW5kb3cgPSBmV29ya2JlbmNoLm9wZW5Xb3JrYmVuY2hXaW5kb3coRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCwgZ2V0UGFnZUlucHV0KCkpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0ZXN0IHdpbmRvdyB3aXRoIGVtcHR5IHBlcnNwZWN0aXZlIGFuZAotICAgICAgICAvLyBzZXNzaW9uIHBlcnNwZWN0aXZlLgotICAgICAgICB3aW5kb3cgPSBmV29ya2JlbmNoLm9wZW5Xb3JrYmVuY2hXaW5kb3coRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCwgZ2V0UGFnZUlucHV0KCkpOwotICAgICAgICBwYWdlID0gd2luZG93Lm9wZW5QYWdlKFNlc3Npb25QZXJzcGVjdGl2ZS5JRCwgZ2V0UGFnZUlucHV0KCkpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0ZXN0IHdpbmRvdyB3aXRoIHR3byBzZXNzaW9uIHBlcnNwZWN0aXZlcy4KLSAgICAgICAgd2luZG93ID0gZldvcmtiZW5jaC5vcGVuV29ya2JlbmNoV2luZG93KFNlc3Npb25QZXJzcGVjdGl2ZS5JRCwgZ2V0UGFnZUlucHV0KCkpOwotICAgICAgICBwYWdlID0gd2luZG93Lm9wZW5QYWdlKFNlc3Npb25QZXJzcGVjdGl2ZS5JRCwgZ2V0UGFnZUlucHV0KCkpOwotCi0gICAgICAgIC8vIE9wZW4gMyBlZGl0b3JzIGluIGxhc3QgcGFnZS4KLSAgICAgICAgSVByb2plY3QgcHJvaiA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoVEVTVF9QUk9KKTsKLSAgICAgICAgSUZpbGUgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoVEVTVF9GSUxFXzEsIHByb2opOwotICAgICAgICBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgTW9ja0VkaXRvclBhcnQuSUQxKTsKLSAgICAgICAgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoVEVTVF9GSUxFXzIsIHByb2opOwotICAgICAgICBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgTW9ja0VkaXRvclBhcnQuSUQxKTsKLSAgICAgICAgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoVEVTVF9GSUxFXzMsIHByb2opOwotICAgICAgICBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgTW9ja0VkaXRvclBhcnQuSUQxKTsKLQotICAgICAgICAvLyBDbG9zZSB0aGUgb3JpZ2luYWwgd2luZG93cy4KLSAgICAgICAgY2xvc2VPcmlnaW5hbFdpbmRvd3MoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgb3JpZ2luYWwgd2luZG93IHNldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2F2ZU9yaWdpbmFsV2luZG93cygpIHsKLSAgICAgICAgb2xkV2luZG93cyA9IGZXb3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGUgb3JpZ2luYWwgd2luZG93IHNldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xvc2VPcmlnaW5hbFdpbmRvd3MoKSB7Ci0gICAgICAgIGZvciAoaW50IG5YID0gMDsgblggPCBvbGRXaW5kb3dzLmxlbmd0aDsgblgrKykgewotICAgICAgICAgICAgb2xkV2luZG93c1tuWF0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9TZXNzaW9uRWRpdG9yUGFydC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvU2Vzc2lvbkVkaXRvclBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3YmY2Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9TZXNzaW9uRWRpdG9yUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkVkaXRvclBhcnQgZXh0ZW5kcyBFZGl0b3JQYXJ0IHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IGluc3RhbnRpYXRlZEVkaXRvcnMgPSAwOwotCQotCXByaXZhdGUgQ29tcG9zaXRlIGZNYWluUGFuZWw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvbkVkaXRvclBhcnQoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmICghKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkpCi0JCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oCi0JCQkJCSJJbnZhbGlkIElucHV0OiBNdXN0IGJlIElGaWxlRWRpdG9ySW5wdXQiKTsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJc2V0SW5wdXQoaW5wdXQpOwotCQkrK1Nlc3Npb25FZGl0b3JQYXJ0Lmluc3RhbnRpYXRlZEVkaXRvcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JICAgICAgIGZNYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCSAgICAgICBmTWFpblBhbmVsLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCSAgICAgICAKLQkgICAgICAgTGFiZWwgbCA9IG5ldyBMYWJlbChmTWFpblBhbmVsLCBTV1QuTk9ORSk7Ci0JICAgICAgIGwuc2V0VGV4dCgiRWRpdG9yIFRpdGxlOiIpOwotCSAgICAgICAKLQkgICAgICAgbCA9IG5ldyBMYWJlbChmTWFpblBhbmVsLCBTV1QuQk9SREVSKTsKLQkgICAgICAgbC5zZXRUZXh0KGdldEVkaXRvcklucHV0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWZNYWluUGFuZWwuc2V0Rm9jdXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1Nlc3Npb25QZXJzcGVjdGl2ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvU2Vzc2lvblBlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZmQ1OWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvU2Vzc2lvblBlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHRlc3RzIHRoZSBwZXJzaXN0YW5jZSBvZiBhIHBlcnNwZWN0aXZlLgotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvblBlcnNwZWN0aXZlIGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU2Vzc2lvblBlcnNwZWN0aXZlIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgSVBlcnNwZWN0aXZlRmFjdG9yeSNjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0gICAgICAgIFN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLSAgICAgICAgbGF5b3V0Ci0gICAgICAgICAgICAgICAgLmFkZFZpZXcoU2Vzc2lvblZpZXcuVklFV19JRCwgSVBhZ2VMYXlvdXQuTEVGVCwgMC4zM2YsCi0gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3JBcmVhKTsKLSAgICAgICAgbGF5b3V0LmFkZFBsYWNlaG9sZGVyKE1vY2tWaWV3UGFydC5JRDQsIElQYWdlTGF5b3V0LlJJR0hULCAuMDMzZiwKLSAgICAgICAgICAgICAgICBlZGl0b3JBcmVhKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvU2Vzc2lvblJlc3RvcmVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9TZXNzaW9uUmVzdG9yZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhYjExMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9TZXNzaW9uUmVzdG9yZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRW1wdHlQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBTZXNzaW9uUmVzdG9yZVRlc3QgcnVucyB0aGUgc2Vjb25kIGhhbGYgb2Ygb3VyIHNlc3Npb24KLSAqIHByZXNpc3RhbmNlIHRlc3RzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uUmVzdG9yZVRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIC8qKiAKLSAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIFNlc3Npb25SZXN0b3JlVGVzdChTdHJpbmcgYXJnKSB7Ci0gICAgICAgIHN1cGVyKGFyZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgc2Vzc2lvbiBzdGF0ZSBpbiB0aGUgd29ya2JlbmNoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0b3JlU2Vzc2lvbigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBJV29ya2JlbmNoV2luZG93W10gd2luZG93czsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlczsKLQotICAgICAgICAvLyBHZXQgd2luZG93cy4KLSAgICAgICAgd2luZG93cyA9IGZXb3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMod2luZG93cy5sZW5ndGgsIDMpOwotCi0gICAgICAgIC8vIEZpcnN0IHdpbmRvdyBjb250YWlucyBlbXB0eSBwZXJzcGVjdGl2ZS4KLSAgICAgICAgcGFnZXMgPSB3aW5kb3dzWzBdLmdldFBhZ2VzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYWdlcy5sZW5ndGgsIDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFnZXNbMF0uZ2V0UGVyc3BlY3RpdmUoKS5nZXRJZCgpLAotICAgICAgICAgICAgICAgIEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQpOwotCi0gICAgICAgIC8vIFNlY29uZCB3aW5kb3cgY29udGFpbnMgZW1wdHkgKyBzZXNzaW9uLgotICAgICAgICBwYWdlcyA9IHdpbmRvd3NbMV0uZ2V0UGFnZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2VzLmxlbmd0aCwgMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYWdlc1swXS5nZXRQZXJzcGVjdGl2ZSgpLmdldElkKCksCi0gICAgICAgICAgICAgICAgRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYWdlc1sxXS5nZXRQZXJzcGVjdGl2ZSgpLmdldElkKCksIFNlc3Npb25QZXJzcGVjdGl2ZS5JRCk7Ci0gICAgICAgIHRlc3RTZXNzaW9uVmlldyhwYWdlc1sxXSk7Ci0KLSAgICAgICAgLy8gVGhpcmQgd2luZG93IGNvbnRhaW5zIDIgc2Vzc2lvbnMuCi0gICAgICAgIHBhZ2VzID0gd2luZG93c1syXS5nZXRQYWdlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFnZXMubGVuZ3RoLCAyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2VzWzBdLmdldFBlcnNwZWN0aXZlKCkuZ2V0SWQoKSwgU2Vzc2lvblBlcnNwZWN0aXZlLklEKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2VzWzFdLmdldFBlcnNwZWN0aXZlKCkuZ2V0SWQoKSwgU2Vzc2lvblBlcnNwZWN0aXZlLklEKTsKLSAgICAgICAgdGVzdFNlc3Npb25WaWV3KHBhZ2VzWzBdKTsKLSAgICAgICAgdGVzdFNlc3Npb25WaWV3KHBhZ2VzWzFdKTsKLQotICAgICAgICAvLyBMYXN0IHBhZ2UgY29udGFpbnMgMyBlZGl0b3JzLgotICAgICAgICBJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9ycyA9IHBhZ2VzWzFdLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkaXRvcnMubGVuZ3RoLCAzKTsKLSAgICAgICAgdGVzdFNlc3Npb25FZGl0b3IoZWRpdG9yc1swXS5nZXRFZGl0b3IodHJ1ZSksCi0gICAgICAgICAgICAgICAgU2Vzc2lvbkNyZWF0ZVRlc3QuVEVTVF9GSUxFXzEpOwotICAgICAgICB0ZXN0U2Vzc2lvbkVkaXRvcihlZGl0b3JzWzFdLmdldEVkaXRvcih0cnVlKSwKLSAgICAgICAgICAgICAgICBTZXNzaW9uQ3JlYXRlVGVzdC5URVNUX0ZJTEVfMik7Ci0gICAgICAgIHRlc3RTZXNzaW9uRWRpdG9yKGVkaXRvcnNbMl0uZ2V0RWRpdG9yKHRydWUpLAotICAgICAgICAgICAgICAgIFNlc3Npb25DcmVhdGVUZXN0LlRFU1RfRklMRV8zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgc2Vzc2lvbiB2aWV3IHdpdGhpbiBhIHBhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTZXNzaW9uVmlldyhJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0gICAgICAgIElWaWV3UGFydCB2aWV3ID0gcGFnZS5maW5kVmlldyhTZXNzaW9uVmlldy5WSUVXX0lEKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2aWV3KTsKLSAgICAgICAgU2Vzc2lvblZpZXcgc2Vzc2lvblZpZXcgPSAoU2Vzc2lvblZpZXcpIHZpZXc7Ci0gICAgICAgIHNlc3Npb25WaWV3LnRlc3RNZW1lbnRvU3RhdGUodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIHN0YXRlIG9mIGEgc2Vzc2lvbiBlZGl0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTZXNzaW9uRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQsIFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICBJRWRpdG9yU2l0ZSBzaXRlID0gcGFydC5nZXRFZGl0b3JTaXRlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzaXRlLmdldElkKCksIE1vY2tFZGl0b3JQYXJ0LklEMSk7Ci0gICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IHBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpOwotICAgICAgICBJRmlsZSBmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZmlsZU5hbWUsIGZpbGUuZ2V0TmFtZSgpKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1Nlc3Npb25WaWV3LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9TZXNzaW9uVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjA1NzIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1Nlc3Npb25WaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIHZpZXcgaXMgdXNlZCB0byB0ZXN0IHRoZSBjcmVhdGlvbiBhbmQgcmVzdG9yYXRpb24gb2YgCi0gKiB2aWV3IHN0YXRlIGJldHdlZW4gc2Vzc2lvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uVmlldyBleHRlbmRzIE1vY2tWaWV3UGFydCB7Ci0KLSAgICBwcml2YXRlIElNZW1lbnRvIG1lbWVudG87Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBWSUVXX0lEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TZXNzaW9uVmlldyI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU2Vzc2lvblZpZXcKLSAgICAgKi8KLSAgICBwdWJsaWMgU2Vzc2lvblZpZXcoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJVmlld1BhcnQjaW5pdChJVmlld1NpdGUsIElNZW1lbnRvKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUsIElNZW1lbnRvIG1lbWVudG8pIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQoc2l0ZSwgbWVtZW50byk7Ci0gICAgICAgIHRoaXMubWVtZW50byA9IG1lbWVudG87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIElNZW1lbnRvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIGNyZWF0ZU1lbWVudG9TdGF0ZShtZW1lbnRvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIElNZW1lbnRvLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNZW1lbnRvU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotICAgICAgICAvLyBDcmVhdGUgZmxvYXQsIGludGVnZXIgYW5kIHN0cmluZy4KLSAgICAgICAgbWVtZW50by5wdXRGbG9hdCgiZmxvYXQiLCAwLjUwZik7Ci0gICAgICAgIG1lbWVudG8ucHV0SW50ZWdlcigiaW50ZWdlciIsIDUwKTsKLSAgICAgICAgbWVtZW50by5wdXRTdHJpbmcoInN0cmluZyIsICI1MCIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIHNpbmdsZSBjaGlsZC4KLSAgICAgICAgSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJzaW5nbGUiKTsKLSAgICAgICAgY2hpbGQucHV0SW50ZWdlcigiaWQiLCAxKTsKLQotICAgICAgICAvLyBDcmVhdGUgbXVsdGlwbGUgY2hpbGRyZW4uCi0gICAgICAgIGludCBjb3VudCA9IDEwOwotICAgICAgICBmb3IgKGludCBuWCA9IDA7IG5YIDwgY291bnQ7IG5YKyspIHsKLSAgICAgICAgICAgIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgibXVsdGlwbGUiKTsKLSAgICAgICAgICAgIGNoaWxkLnB1dEludGVnZXIoImlkIiwgblgpOwotICAgICAgICB9Ci0gICAgICAgIG1lbWVudG8ucHV0SW50ZWdlcigibXVsdGlwbGUuY291bnQiLCBjb3VudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZSBhbiBJTWVtZW50by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVtZW50b1N0YXRlKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBtZW1lbnRvIHdhcyBwYXNzZWQgdG8gdXMgaW4KLSAgICAgICAgLy8gY29uc3RydWN0b3IuCi0gICAgICAgIFRlc3RDYXNlLmFzc2VydE5vdE51bGwobWVtZW50byk7Ci0KLSAgICAgICAgLy8gUmVhZCBmbG9hdC4JCi0gICAgICAgIEZsb2F0IGJpZ0Zsb2F0ID0gbWVtZW50by5nZXRGbG9hdCgiZmxvYXQiKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChiaWdGbG9hdCk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhiaWdGbG9hdC5mbG9hdFZhbHVlKCksIDAuNTBmLCAwLjAwMDEpOwotCi0gICAgICAgIC8vIFJlYWQgaW50LgkKLSAgICAgICAgSW50ZWdlciBiaWdJbnQgPSBtZW1lbnRvLmdldEludGVnZXIoImludGVnZXIiKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKGJpZ0ludCwgbmV3IEludGVnZXIoNTApKTsKLQotICAgICAgICAvLyBSZWFkIHN0cmluZy4KLSAgICAgICAgU3RyaW5nIHN0ciA9IG1lbWVudG8uZ2V0U3RyaW5nKCJzdHJpbmciKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKHN0ciwgIjUwIik7Ci0KLSAgICAgICAgLy8gUmVhZCBzaW5nbGUgY2hpbGQuCi0gICAgICAgIElNZW1lbnRvIGNoaWxkID0gbWVtZW50by5nZXRDaGlsZCgic2luZ2xlIik7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydE5vdE51bGwoY2hpbGQpOwotICAgICAgICBiaWdJbnQgPSBjaGlsZC5nZXRJbnRlZ2VyKCJpZCIpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoYmlnSW50LCBuZXcgSW50ZWdlcigxKSk7Ci0KLSAgICAgICAgLy8gUmVhZCBtdWx0aXBsZSBjaGlsZHJlbi4KLSAgICAgICAgYmlnSW50ID0gbWVtZW50by5nZXRJbnRlZ2VyKCJtdWx0aXBsZS5jb3VudCIpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKGJpZ0ludCk7Ci0gICAgICAgIGludCBjb3VudCA9IGJpZ0ludC5pbnRWYWx1ZSgpOwotICAgICAgICBJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigibXVsdGlwbGUiKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKGNvdW50LCBjaGlsZHJlbi5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBuWCA9IDA7IG5YIDwgY291bnQ7IG5YKyspIHsKLSAgICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5bblhdOwotICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChjaGlsZCk7Ci0gICAgICAgICAgICBiaWdJbnQgPSBjaGlsZC5nZXRJbnRlZ2VyKCJpZCIpOwotICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKGJpZ0ludCwgbmV3IEludGVnZXIoblgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvU3RhcnR1cENsYXNzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9TdGFydHVwQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxOWE0Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9TdGFydHVwQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsKLQotcHVibGljIGNsYXNzIFN0YXJ0dXBDbGFzcyBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgYm9vbGVhbiBzaG91bGQgb25seSBiZSB0cnVlIGlmIHRoZSBlYXJseVN0YXJ0dXAoKSBtZXRob2QKLSAgICAgKiBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlYXJseVN0YXJ0dXBDYWxsZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgYm9vbGVhbiBzaG91bGQgb25seSBiZSB0cnVlIGlmIHRoZSBlYXJseVN0YXJ0dXAoKSBtZXRob2QKLSAgICAgKiBoYXMgY29tcGxldGVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZWFybHlTdGFydHVwQ29tcGxldGVkID0gZmFsc2U7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cCNlYXJseVN0YXJ0dXAoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVhcmx5U3RhcnR1cCgpIHsKLSAgICAgICAgZWFybHlTdGFydHVwQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoIklTdGFydHVwIHNob3VsZCBydW4gaW4gbm9uLVVJIHRocmVhZCIsIERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLSAgICAgICAgdHJ5IHsKLQkJCVRocmVhZC5zbGVlcCgzMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJZWFybHlTdGFydHVwQ29tcGxldGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RWFybHlTdGFydHVwQ2FsbGVkKCkgewotICAgICAgICByZXR1cm4gZWFybHlTdGFydHVwQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFYXJseVN0YXJ0dXBDb21wbGV0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBlYXJseVN0YXJ0dXBDb21wbGV0ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXQgdGhlIGZsYWdzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgZWFybHlTdGFydHVwQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgIGVhcmx5U3RhcnR1cENvbXBsZXRlZCA9IGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1N0YXJ0dXBUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9TdGFydHVwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjBlOGYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1N0YXJ0dXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFN0YXJ0dXBUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBTdGFydHVwVGVzdChTdHJpbmcgYXJnKSB7Ci0gICAgICAgIHN1cGVyKGFyZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0dXAoKSB7Ci0gICAgICAgIGFzc2VydFRydWUoIlN0YXJ0dXAgLSBleHBsaWNpdCIsIFN0YXJ0dXBDbGFzcy5nZXRFYXJseVN0YXJ0dXBDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlN0YXJ0dXAgLSBpbXBsaWNpdCIsIFRlc3RQbHVnaW4uZ2V0RWFybHlTdGFydHVwQ2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJTdGFydHVwIC0gY29tcGxldGVkIGJlZm9yZSB0ZXN0cyIsIFN0YXJ0dXBDbGFzcy5nZXRFYXJseVN0YXJ0dXBDb21wbGV0ZWQoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1RlYXJEb3duKCk7Ci0gICAgICAgIC8vIE5PVEU6ICB0ZWFyRG93biB3aWxsIHJ1biBhZnRlciBlYWNoIHRlc3QuICBUaGVyZWZvcmUsIHdlCi0gICAgICAgIC8vIG9ubHkgd2FudCBvbmUgdGVzdCBpbiB0aGlzIHN1aXRlIChvciB0aGUgdmFsdWVzIHNldCB3aGVuCi0gICAgICAgIC8vIHRoaXMgcGx1Z2luIHN0YXJ0ZWQgdXAgd2lsbCBiZSBsb3N0KS4KLSAgICAgICAgU3RhcnR1cENsYXNzLnJlc2V0KCk7Ci0gICAgICAgIFRlc3RQbHVnaW4uY2xlYXJFYXJseVN0YXJ0dXAoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9TdGlja3lWaWV3VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvU3RpY2t5Vmlld1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiOWY4MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9TdGlja3lWaWV3VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5GYXN0Vmlld0JhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5GYXN0Vmlld0JhckNvbnRleHRNZW51Q29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlZpZXdQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuSVN0aWNreVZpZXdEZXNjcmlwdG9yOwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFN0aWNreVZpZXdUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0JCi0JLyoqCi0JICogQWxsb3cgdGVzdHMgdG8gcnVuIGp1c3QgaW4gdGhpcyBjbGFzcy4KLQkgKiBAcmV0dXJuIHRoZSBUZXN0U3VpdGUgdG8gcnVuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTdGlja3lWaWV3VGVzdC5jbGFzcyk7Ci0JfQotCQotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYWdlIHBhZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RpY2t5Vmlld1Rlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhY2tQbGFjZW1lbnRSaWdodCgpIHsKLSAgICAgICAgdGVzdFN0YWNrUGxhY2VtZW50KCJSaWdodCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFja1BsYWNlbWVudExlZnQoKSB7Ci0gICAgICAgIHRlc3RTdGFja1BsYWNlbWVudCgiTGVmdCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFja1BsYWNlbWVudFRvcCgpIHsKLSAgICAgICAgdGVzdFN0YWNrUGxhY2VtZW50KCJUb3AiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhY2tQbGFjZW1lbnRCb3R0b20oKSB7Ci0gICAgICAgIHRlc3RTdGFja1BsYWNlbWVudCgiQm90dG9tIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdG8gZW5zdXJlIHRoYXQgc3RpY2t5IHZpZXdzIGFyZSBvcGVuZWQgaW4gdGhlIHNhbWUgc3RhY2suCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTdGFja1BsYWNlbWVudChTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElWaWV3UGFydCBwYXJ0MSA9IHBhZ2UKLSAgICAgICAgICAgICAgICAgICAgLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RpY2t5VmlldyIgKyBsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjEiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFydDEpOwotICAgICAgICAgICAgSVZpZXdQYXJ0IHBhcnQyID0gcGFnZQotICAgICAgICAgICAgICAgICAgICAuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TdGlja3lWaWV3IiArIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiMiIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJ0Mik7Ci0gICAgICAgICAgICBJVmlld1BhcnRbXSBzdGFjayA9IHBhZ2UuZ2V0Vmlld1N0YWNrKHBhcnQxKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShWaWV3VXRpbHMuZmluZEluU3RhY2soc3RhY2ssIHBhcnQxKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKFZpZXdVdGlscy5maW5kSW5TdGFjayhzdGFjaywgcGFydDIpKTsKLQotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdG8gZW5zdXJlIHRoYXQgYWxsIHZpZXdzIGluIGEgc3RhY2sgd2l0aCBhIGtub3duIHN0aWNreSB2aWV3IGFyZSBhbHNvIHN0aWNreS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhY2tDb250ZW50cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElWaWV3UGFydCBwYXJ0MSA9IHBhZ2UKLSAgICAgICAgICAgICAgICAgICAgLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RpY2t5Vmlld1JpZ2h0MSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJ0MSk7Ci0KLSAgICAgICAgICAgIElWaWV3UGFydFtdIHN0YWNrID0gcGFnZS5nZXRWaWV3U3RhY2socGFydDEpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdGFja1tpXS5nZXRUaXRsZSgpLCBWaWV3VXRpbHMuaXNTdGlja3koc3RhY2tbaV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBtb3ZlYWJsZSBmbGFnIGlzIGJlaW5nIHBpY2tlZCB1cCBhbmQgaG9ub3VyZWQKLSAgICAgKiBmcm9tIHRoZSBYTUwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NhYmxlRmxhZygpIHsKLSAgICAgICAgLy9leHBsaWNpdCBjbG9zZWFibGUgPSB0cnVlCi0gICAgICAgIHRlc3RDbG9zZWFibGUoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TdGlja3lWaWV3UmlnaHQxIiwgdHJ1ZSk7Ci0gICAgICAgIC8vZXhwbGljaXQgY2xvc2VhYmxlID0gZmFsc2UKLSAgICAgICAgdGVzdENsb3NlYWJsZSgib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlN0aWNreVZpZXdSaWdodDIiLCBmYWxzZSk7Ci0gICAgICAgIC8vaW1wbGljaXQgY2xvc2VhYmxlID0gdHJ1ZQotICAgICAgICB0ZXN0Q2xvc2VhYmxlKCJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RpY2t5Vmlld0xlZnQxIiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1vdmVhYmxlRmxhZygpIHsKLSAgICAgICAgLy9leHBsaWNpdCBjbG9zZWFibGUgPSB0cnVlCi0gICAgICAgIHRlc3RNb3ZlYWJsZSgib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlN0aWNreVZpZXdSaWdodDEiLCB0cnVlKTsKLSAgICAgICAgLy9leHBsaWNpdCBjbG9zZWFibGUgPSBmYWxzZQotICAgICAgICB0ZXN0TW92ZWFibGUoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TdGlja3lWaWV3UmlnaHQyIiwgZmFsc2UpOwotICAgICAgICAvL2ltcGxpY2l0IGNsb3NlYWJsZSA9IHRydWUKLSAgICAgICAgdGVzdE1vdmVhYmxlKCJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RpY2t5Vmlld0xlZnQxIiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRlc3RzIHdoZXRoZXIgYSBzdGlja3kgdmlldyB3aXRoIHRoZSBnaXZlbiBpZCBpcyBtb3ZlYWJsZSBvciBub3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBpZAotICAgICAqIEBwYXJhbSBleHBlY3RhdGlvbiB0aGUgZXhwZWN0ZWQgbW92ZWFibGUgc3RhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdE1vdmVhYmxlKFN0cmluZyBpZCwgYm9vbGVhbiBleHBlY3RhdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVZpZXdQYXJ0IHBhcnQgPSBwYWdlLnNob3dWaWV3KGlkKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFydCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKFZpZXdVdGlscy5pc1N0aWNreShwYXJ0KSk7Ci0KLSAgICAgICAgICAgIC8vdGVzdHMgdG8gZW5zdXJlIHRoYXQgdGhlIFhNTCB3YXMgcmVhZCBjb3JyZWN0bHkgICAgICAgICAgICAKLSAgICAgICAgICAgIElTdGlja3lWaWV3RGVzY3JpcHRvcltdIGRlc2NzID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0Vmlld1JlZ2lzdHJ5KCkuZ2V0U3RpY2t5Vmlld3MoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVzY3NbaV0uZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RhdGlvbiwgZGVzY3NbaV0uaXNNb3ZlYWJsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBwcm9wZXJ0eSBpcyBiZWluZyBob25vdXJlZCBieSB0aGUgcGVyc3BlY3RpdmUKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RhdGlvbiwgVmlld1V0aWxzLmlzTW92ZWFibGUocGFydCkpOwotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUZXN0cyB3aGV0aGVyIGEgc3RpY2t5IHZpZXcgd2l0aCB0aGUgZ2l2ZW4gaWQgaXMgY2xvc2VhYmxlIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGlkCi0gICAgICogQHBhcmFtIGV4cGVjdGF0aW9uIHRoZSBleHBlY3RlZCBjbG9zZWFibGUgc3RhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdENsb3NlYWJsZShTdHJpbmcgaWQsIGJvb2xlYW4gZXhwZWN0YXRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElWaWV3UGFydCBwYXJ0ID0gcGFnZS5zaG93VmlldyhpZCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhcnQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShWaWV3VXRpbHMuaXNTdGlja3kocGFydCkpOwotCi0gICAgICAgICAgICAvL3Rlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBYTUwgd2FzIHJlYWQgY29ycmVjdGx5ICAgICAgICAgICAgCi0gICAgICAgICAgICBJU3RpY2t5Vmlld0Rlc2NyaXB0b3JbXSBkZXNjcyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFZpZXdSZWdpc3RyeSgpLmdldFN0aWNreVZpZXdzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2NzW2ldLmdldElkKCkuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0YXRpb24sIGRlc2NzW2ldLmlzQ2xvc2VhYmxlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdGVzdHMgdG8gZW5zdXJlIHRoYXQgdGhlIHByb3BlcnR5IGlzIGJlaW5nIGhvbm91cmVkIGJ5IHRoZSBwZXJzcGVjdGl2ZQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGF0aW9uLCBWaWV3VXRpbHMuaXNDbG9zZWFibGUocGFydCkpOwotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0aWNreSB2aWV3cyBzaG91bGQgcmVtYWluIGFmdGVyIHBlcnNwZWN0aXZlIHJlc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJzcGVjdGl2ZVJlc2V0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFnZS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlN0aWNreVZpZXdSaWdodDEiKTsKLSAgICAgICAgICAgIHBhZ2UucmVzZXRQZXJzcGVjdGl2ZSgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwYWdlCi0gICAgICAgICAgICAgICAgICAgIC5maW5kVmlldygib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlN0aWNreVZpZXdSaWdodDEiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBhIHN0aWNreSB2aWV3IGlzIG9wZW5lZCBpbiBzdWNjZXNzaXZlIHBlcnNwZWN0aXZlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc3BlY3RpdmVPcGVuKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFnZS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlN0aWNreVZpZXdSaWdodDEiKTsKLSAgICAgICAgICAgIHBhZ2Uuc2V0UGVyc3BlY3RpdmUoV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlNlc3Npb25QZXJzcGVjdGl2ZSIpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFnZQotICAgICAgICAgICAgICAgICAgICAuZmluZFZpZXcoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TdGlja3lWaWV3UmlnaHQxIikpOwotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgY2xvc2luZyBhIHN0YW5kLWFsb25lIHZpZXcgcmVtb3ZlIHRoZSBlZGl0b3Igc3RhY2sgYW5kCi0gICAgICogZG9lc24ndCB0aHJvdyBhbiBOUEUuCi0gICAgICogCi0gICAgICogQHRocm93cyBUaHJvd2FibGUgb24gZXJyb3IKLSAgICAgKiBAc2luY2UgMy4yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBlcnNwZWN0aXZlQ2xvc2VTdGFuZGFsb25lVmlldygpIHRocm93cyBUaHJvd2FibGUgewotCQlwYWdlLnNldFBlcnNwZWN0aXZlKFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZCgKLQkJCQkJCVBlcnNwZWN0aXZlVmlld3NCdWcxMjA5MzQuUEVSU1BfSUQpKTsKLQotCQl0cnkgewotCQkJLy8gZmluZCB0aGUgc3RhbmQtYWxvbmUgdmlldwotCQkJSVZpZXdSZWZlcmVuY2Ugc3RhbmRBbG9uZVJlZiA9IHBhZ2UKLQkJCQkJLmZpbmRWaWV3UmVmZXJlbmNlKElQYWdlTGF5b3V0LklEX09VVExJTkUpOwotCi0JCQlwYWdlLmhpZGVWaWV3KHN0YW5kQWxvbmVSZWYpOwotCQl9IGZpbmFsbHkgewotCQkJcGFnZS5jbG9zZVBlcnNwZWN0aXZlKHBhZ2UuZ2V0UGVyc3BlY3RpdmUoKSwgZmFsc2UsIGZhbHNlKTsKLQkJfQotICAgIH0KLSAgICAKLQkvKioKLQkgKiBUZXN0IHRoYXQgYSB2aWV3IG1hcmtlZCBhcyBub24tY2xvc2FibGUgY2Fubm90IGJlIGNsb3NlZCBhcyBhIGZhc3Qgdmlldy4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqIEBzaW5jZSAzLjEuMQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQZXJzcGVjdGl2ZUNsb3NlRmFzdFZpZXcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJcGFnZS5zZXRQZXJzcGVjdGl2ZShXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKS5maW5kUGVyc3BlY3RpdmVXaXRoSWQoCi0JCQkJCQlQZXJzcGVjdGl2ZVZpZXdzQnVnODgzNDUuUEVSU1BfSUQpKTsKLQotCQl0cnkgewotCQkJLy8gdGhlIG5vbi1jbG9zZWFibGUgdmlldwotCQkJSVZpZXdSZWZlcmVuY2Ugc3RpY2t5UmVmID0gcGFnZQotCQkJCQkuZmluZFZpZXdSZWZlcmVuY2UoTW9ja1ZpZXdQYXJ0LklETVVMVCk7Ci0JCQlJVmlld1BhcnQgc3RpY2t5VmlldyA9IChJVmlld1BhcnQpIHN0aWNreVJlZi5nZXRQYXJ0KHRydWUpOwotCQkJcGFnZS5hY3RpdmF0ZShzdGlja3lWaWV3KTsKLQotCQkJSVZpZXdSZWZlcmVuY2Ugdmlld1JlZiA9IHBhZ2UKLQkJCQkJLmZpbmRWaWV3UmVmZXJlbmNlKFBlcnNwZWN0aXZlVmlld3NCdWc4ODM0NS5OT1JNQUxfVklFV19JRCk7Ci0KLQkJCVdvcmtiZW5jaFBhZ2Ugd3BhZ2UgPSAoV29ya2JlbmNoUGFnZSkgcGFnZTsKLQkJCWFzc2VydEZhbHNlKHdwYWdlLmlzRmFzdFZpZXcoc3RpY2t5UmVmKSk7Ci0KLQkJCXdwYWdlLmFkZEZhc3RWaWV3KHN0aWNreVJlZik7Ci0JCQlhc3NlcnRUcnVlKHdwYWdlLmlzRmFzdFZpZXcoc3RpY2t5UmVmKSk7Ci0KLQkJCXdwYWdlLmFkZEZhc3RWaWV3KHZpZXdSZWYpOwotCQkJYXNzZXJ0VHJ1ZSh3cGFnZS5pc0Zhc3RWaWV3KHZpZXdSZWYpKTsKLQotCQkJRmFzdFZpZXdCYXIgZmFzdFZpZXdCYXIgPSAoKFdvcmtiZW5jaFdpbmRvdykgcGFnZQotCQkJCQkuZ2V0V29ya2JlbmNoV2luZG93KCkpLmdldEZhc3RWaWV3QmFyKCk7Ci0JCQlGYXN0Vmlld0JhckNvbnRleHRNZW51Q29udHJpYnV0aW9uIG1lbnVDb250cmlidXRpb24gPSBmYXN0Vmlld0JhcgotCQkJCQkudGVzdENvbnRleHRNZW51KCk7Ci0KLQkJCS8vIHNldCB0aGUgdGFyZ2V0IG9mIGEgbm9ybWFsIHZpZXcgdGhhdCBpcyBub3cgYSBmYXN0IHZpZXcKLQkJCS8vIGNsb3NlIHNob3VsZCBiZSBlbmFibGVkCi0JCQltZW51Q29udHJpYnV0aW9uLnNldFRhcmdldCh2aWV3UmVmKTsKLQkJCWNoZWNrRW5hYmxlZE1lbnVJdGVtKHdwYWdlLCBtZW51Q29udHJpYnV0aW9uLCAiQ2xvc2UiLCB0cnVlKTsKLQotCQkJLy8gc2V0IHRoZSB0YXJnZXQgb2Ygb3VyIG5vbi1jbG9zZWFibGUgZmFzdCB2aWV3Ci0JCQkvLyBjbG9zZSBzaG91bGQgbm90IGJlIGVuYWJsZWQKLQkJCW1lbnVDb250cmlidXRpb24uc2V0VGFyZ2V0KHN0aWNreVJlZik7Ci0JCQljaGVja0VuYWJsZWRNZW51SXRlbSh3cGFnZSwgbWVudUNvbnRyaWJ1dGlvbiwgIkNsb3NlIiwgZmFsc2UpOwotCQl9IGZpbmFsbHkgewotCQkJcGFnZS5jbG9zZVBlcnNwZWN0aXZlKHBhZ2UuZ2V0UGVyc3BlY3RpdmUoKSwgZmFsc2UsIGZhbHNlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRoYXQgYSBmYXN0IHZpZXcgbWFya2VkIGFzIG5vbi1tb3ZlYWJsZSBjYW5ub3QgYmUgZG9ja2VkLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICogQHNpbmNlIDMuMS4xCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFBlcnNwZWN0aXZlTW92ZUZhc3RWaWV3KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXBhZ2Uuc2V0UGVyc3BlY3RpdmUoV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCkuZmluZFBlcnNwZWN0aXZlV2l0aElkKAotCQkJCQkJUGVyc3BlY3RpdmVWaWV3c0J1Zzg4MzQ1LlBFUlNQX0lEKSk7Ci0KLQkJdHJ5IHsKLQkJCS8vIHRoZSBub24tbW92ZWFibGUgdmlldwotCQkJSVZpZXdSZWZlcmVuY2Ugc3RpY2t5UmVmID0gcGFnZQotCQkJCQkuZmluZFZpZXdSZWZlcmVuY2UoTW9ja1ZpZXdQYXJ0LklETVVMVCwgIjEiKTsKLQotCQkJSVZpZXdSZWZlcmVuY2Ugdmlld1JlZiA9IHBhZ2UKLQkJCQkJLmZpbmRWaWV3UmVmZXJlbmNlKFBlcnNwZWN0aXZlVmlld3NCdWc4ODM0NS5OT1JNQUxfVklFV19JRCk7Ci0KLQkJCVdvcmtiZW5jaFBhZ2Ugd3BhZ2UgPSAoV29ya2JlbmNoUGFnZSkgcGFnZTsKLQkJCWFzc2VydEZhbHNlKHdwYWdlLmlzRmFzdFZpZXcodmlld1JlZikpOwotCQkJYXNzZXJ0VHJ1ZSh3cGFnZS5pc0Zhc3RWaWV3KHN0aWNreVJlZikpOwotCi0JCQl3cGFnZS5hZGRGYXN0Vmlldyh2aWV3UmVmKTsKLQkJCWFzc2VydFRydWUod3BhZ2UuaXNGYXN0Vmlldyh2aWV3UmVmKSk7Ci0KLQkJCUZhc3RWaWV3QmFyIGZhc3RWaWV3QmFyID0gKChXb3JrYmVuY2hXaW5kb3cpIHBhZ2UKLQkJCQkJLmdldFdvcmtiZW5jaFdpbmRvdygpKS5nZXRGYXN0Vmlld0JhcigpOwotCQkJRmFzdFZpZXdCYXJDb250ZXh0TWVudUNvbnRyaWJ1dGlvbiBtZW51Q29udHJpYnV0aW9uID0gZmFzdFZpZXdCYXIKLQkJCQkJLnRlc3RDb250ZXh0TWVudSgpOwotCi0JCQkvLyBzZXQgdGhlIHRhcmdldCBvZiBhIG5vcm1hbCB2aWV3IHRoYXQgaXMgbm93IGEgZmFzdCB2aWV3Ci0JCQkvLyBGYXN0IFZpZXcgc2hvdWxkIGJlIGVuYWJsZWQKLQkJCW1lbnVDb250cmlidXRpb24uc2V0VGFyZ2V0KHZpZXdSZWYpOwotCQkJY2hlY2tFbmFibGVkTWVudUl0ZW0od3BhZ2UsIG1lbnVDb250cmlidXRpb24sICJGYXN0IFZpZXciLCB0cnVlKTsKLQotCQkJLy8gc2V0IHRoZSB0YXJnZXQgb2Ygb3VyIG5vbi1jbG9zZWFibGUgZmFzdCB2aWV3Ci0JCQkvLyBGYXN0IFZpZXcgc2hvdWxkIG5vdCBiZSBlbmFibGVkCi0JCQltZW51Q29udHJpYnV0aW9uLnNldFRhcmdldChzdGlja3lSZWYpOwotCQkJY2hlY2tFbmFibGVkTWVudUl0ZW0od3BhZ2UsIG1lbnVDb250cmlidXRpb24sICJGYXN0IFZpZXciLCBmYWxzZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlwYWdlLmNsb3NlUGVyc3BlY3RpdmUocGFnZS5nZXRQZXJzcGVjdGl2ZSgpLCBmYWxzZSwgZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgc3VwcGxpZWQgbWVudSBpdGVtIGFuZCBtYWtlIHN1cmUgaXQncyBlbmFibGVkL2Rpc2FibGVkLgotCSAqIAotCSAqIEBwYXJhbSB3cGFnZSB0aGUgd29ya2JlbmNoIHBhZ2UKLQkgKiBAcGFyYW0gbWVudUNvbnRyaWJ1dGlvbiB0aGUgZmFzdCBiYXIgbWVudSBjb250cmlidXRpb24gaXRlbQotCSAqIEBwYXJhbSBpc0VuYWJsZWQgc2hvdWxkIHRoZSBpdGVtIGJlIGVuYWJsZWQKLQkgKiBAc2luY2UgMy4xLjEKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tFbmFibGVkTWVudUl0ZW0oV29ya2JlbmNoUGFnZSB3cGFnZSwKLQkJCUZhc3RWaWV3QmFyQ29udGV4dE1lbnVDb250cmlidXRpb24gbWVudUNvbnRyaWJ1dGlvbiwKLQkJCVN0cmluZyBpdGVtTmFtZSwKLQkJCWJvb2xlYW4gaXNFbmFibGVkKSB7Ci0JCU1lbnUgbSA9IG5ldyBNZW51KHdwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotCQl0cnkgewotCQkJbWVudUNvbnRyaWJ1dGlvbi5maWxsKG0sIDApOwotCQkJTWVudUl0ZW1bXSBpdGVtcyA9IG0uZ2V0SXRlbXMoKTsKLQkJCU1lbnVJdGVtIGNoZWNrSXRlbSA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJTWVudUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJCWlmIChpdGVtLmdldFRleHQoKS5pbmRleE9mKGl0ZW1OYW1lKSA+PSAwKSB7Ci0JCQkJCWNoZWNrSXRlbSA9IGl0ZW07Ci0JCQkJfQotCQkJfQotCQkJYXNzZXJ0Tm90TnVsbChjaGVja0l0ZW0pOwotCQkJYXNzZXJ0RXF1YWxzKGlzRW5hYmxlZCwgY2hlY2tJdGVtLmlzRW5hYmxlZCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1lbnVDb250cmlidXRpb24uZGlzcG9zZSgpOwotCQkJbS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHRoYXQgdGhlIHZpZXcgdG9vbGJhciB2aXNpYmlsaXR5IG1hdGNoZXMgdGhlIHByZXNlbnRhdGlvbgotCSAqIHZpc2liaWxpdHkgZm9yIGEgdmlldy4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZSBvbiBhbiBlcnJvcgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyc3BlY3RpdmVWaWV3VG9vbEJhclZpc2libGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBwZXJzcGVjdGl2ZSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZCgKLQkJCQkJCVBlcnNwZWN0aXZlVmlld3NCdWc4ODM0NS5QRVJTUF9JRCk7Ci0JCXBhZ2Uuc2V0UGVyc3BlY3RpdmUocGVyc3BlY3RpdmUpOwotCi0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IG51bGw7Ci0JCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IHdpbmRvdy5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHNlY29uZFBlcnNwZWN0aXZlID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCkuZmluZFBlcnNwZWN0aXZlV2l0aElkKAotCQkJCQkJU2Vzc2lvblBlcnNwZWN0aXZlLklEKTsKLQkJdHJ5IHsKLQkJCS8vIGEgdmlldyB3aXRoIGl0J3MgdG9vbGJhciBvbiB0aGUgbGluZSBiZWxvdyB0aGUgdGFiCi0JCQlwYWdlLnNob3dWaWV3KFBlcnNwZWN0aXZlVmlld3NCdWc4ODM0NS5QUk9QX1NIRUVUX0lEKTsKLQkJCUlWaWV3UmVmZXJlbmNlIHZpZXdSZWYgPSBwYWdlCi0JCQkJCS5maW5kVmlld1JlZmVyZW5jZShQZXJzcGVjdGl2ZVZpZXdzQnVnODgzNDUuUFJPUF9TSEVFVF9JRCk7Ci0KLQkJCUlQcm9qZWN0IHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJUQlRlc3QiKTsKLQkJCUlGaWxlIHRlc3QwMSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoInRlc3QwMS50eHQiLCBwcm9qKTsKLQotCQkJV29ya2JlbmNoUGFnZSB3cGFnZSA9IChXb3JrYmVuY2hQYWdlKSBwYWdlOwotCi0JCQkvLyBtYWtlIHN1cmUgdGhlIHZpZXcgaXMgYWN0aXZlCi0JCQlhc3NlcnROb3ROdWxsKCJUaGUgdmlldyBtdXN0IGV4aXN0Iiwgdmlld1JlZi5nZXRQYXJ0KHRydWUpKTsKLQkJCXdwYWdlLmFjdGl2YXRlKHZpZXdSZWYuZ2V0UGFydCh0cnVlKSk7Ci0JCQlQYXJ0U2l0ZSBzaXRlID0gKFBhcnRTaXRlKSB2aWV3UmVmLmdldFBhcnQodHJ1ZSkuZ2V0U2l0ZSgpOwotCQkJVmlld1BhbmUgcGFuZSA9IChWaWV3UGFuZSkgc2l0ZS5nZXRQYW5lKCk7Ci0KLQkJCWFzc2VydFRydWUocGFuZS5pc1Zpc2libGUoKSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJUaGlzIHZpZXcgbXVzdCBoYXZlIGEgdG9vbGJhciIsIHBhbmUuZ2V0VG9vbEJhcigpKTsKLQkJCWFzc2VydFRydWUocGFuZS5nZXRUb29sQmFyKCkuaXNWaXNpYmxlKCkpOwotCi0JCQkvLyBvcGVuIHRoZSBlZGl0b3IgYW5kIHpvb20gaXQuCi0JCQllZGl0b3IgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dCh0ZXN0MDEpLCByZWdpc3RyeQotCQkJCQkuZ2V0RGVmYXVsdEVkaXRvcih0ZXN0MDEuZ2V0TmFtZSgpKS5nZXRJZCgpKTsKLQkJCWFzc2VydE5vdE51bGwoIm11c3QgaGF2ZSBteSBlZGl0b3IiLCBlZGl0b3IpOwotCi0JCQlJV29ya2JlbmNoUGFydFJlZmVyZW5jZSByZWYgPSB3cGFnZS5nZXRSZWZlcmVuY2UoZWRpdG9yKTsKLQkJCXdwYWdlLnRvZ2dsZVpvb20ocmVmKTsKLQkJCWFzc2VydEZhbHNlKHBhbmUuaXNWaXNpYmxlKCkpOwotCQkJYXNzZXJ0RmFsc2UocGFuZS5nZXRUb29sQmFyKCkuaXNWaXNpYmxlKCkpOwotCi0JCQkvLyBzd2l0Y2ggdG8gYW5vdGhlciBwZXJzcGVjdGl2ZSwgYW5kIHRoZW4gc3dpdGNoIGJhY2suCi0JCQlwYWdlLnNldFBlcnNwZWN0aXZlKHNlY29uZFBlcnNwZWN0aXZlKTsKLQotCQkJYXNzZXJ0RmFsc2UocGFuZS5pc1Zpc2libGUoKSk7Ci0JCQlhc3NlcnRGYWxzZShwYW5lLmdldFRvb2xCYXIoKS5pc1Zpc2libGUoKSk7Ci0KLQkJCXBhZ2Uuc2V0UGVyc3BlY3RpdmUocGVyc3BlY3RpdmUpOwotCQkJcHJvY2Vzc0V2ZW50cygpOwotCi0JCQkvLyBib3RoIHRoZSB2aWV3IGFuZCB0aGUgdG9vbGJhciBtdXN0IGJlIG5vdCB2aXNpYmxlCi0JCQlhc3NlcnRGYWxzZShwYW5lLmlzVmlzaWJsZSgpKTsKLQkJCWFzc2VydEZhbHNlKHBhbmUuZ2V0VG9vbEJhcigpLmlzVmlzaWJsZSgpKTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJcGFnZS5jbG9zZUVkaXRvcihlZGl0b3IsIGZhbHNlKTsKLQkJCX0KLQkJCXBhZ2UuY2xvc2VQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZSwgZmFsc2UsIGZhbHNlKTsKLQkJCXBhZ2UuY2xvc2VQZXJzcGVjdGl2ZShzZWNvbmRQZXJzcGVjdGl2ZSwgZmFsc2UsIGZhbHNlKTsKLQkJfQotCX0KLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC5VSVRlc3RDYXNlI2RvU2V0VXAoKQotCSAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgd2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICAgICAgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvVHJpbUxheW91dFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1RyaW1MYXlvdXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzI2NTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvVHJpbUxheW91dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVHJpbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd1RyaW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5YTUxNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV2luZG93VHJpbVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC51dGlsLlByZWZVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3QgdG8gZXhlcmNpc2UgdGhlIHRyaW0gbGF5b3V0IHNhdmUvcmVzdG9yZS9tb2RpZnkgc3VwcG9ydC4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgVHJpbUxheW91dFRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVVRUT05fQl9JRCA9ICJteS5idXR0b24uYiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfQk9UVE9NID0gewotCQkJIm9yZy5lY2xpc2UudWkuaW50ZXJuYWwuRmFzdFZpZXdCYXIiLAotCQkJIm9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdGF0dXNMaW5lTWFuYWdlciIsCi0JCQkib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSGVhcFN0YXR1cyIsCi0JCQkib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvZ3Jlc3MuUHJvZ3Jlc3NSZWdpb24iIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNXQVBQRURfU1RBVFVTX0xJTkUgPSB7Ci0JCQkib3JnLmVjbGlzZS51aS5pbnRlcm5hbC5GYXN0Vmlld0JhciIsCi0JCQkib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJvZ3Jlc3MuUHJvZ3Jlc3NSZWdpb24iLAotCQkJIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLkhlYXBTdGF0dXMiLAotCQkJIm9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdGF0dXNMaW5lTWFuYWdlciIgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1dBUFBFRF9GQVNUVklFVyA9IHsKLQkJCSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcm9ncmVzcy5Qcm9ncmVzc1JlZ2lvbiIsCi0JCQkib3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN0YXR1c0xpbmVNYW5hZ2VyIiwKLQkJCSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5IZWFwU3RhdHVzIiwKLQkJCSJvcmcuZWNsaXNlLnVpLmludGVybmFsLkZhc3RWaWV3QmFyIiwgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVNT1ZFRF9IRUFQX1NUQVRVUyA9IHsKLQkJCSJvcmcuZWNsaXNlLnVpLmludGVybmFsLkZhc3RWaWV3QmFyIiwKLQkJCSJvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3RhdHVzTGluZU1hbmFnZXIiLAotCQkJIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb2dyZXNzLlByb2dyZXNzUmVnaW9uIiB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBUT1BfVFJJTV9MSVNUID0gewotCQkJIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFdpbmRvdy50b3BCYXIiLAotCQkJVHJpbUxpc3QuVFJJTV9MSVNUX0lEIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRPUF9CVVRUT05fVFJJTSA9IHsKLQkJCSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hXaW5kb3cudG9wQmFyIiwgQlVUVE9OX0JfSUQsCi0JCQlUcmltTGlzdC5UUklNX0xJU1RfSUQgfTsKLQotCXByaXZhdGUgYm9vbGVhbiBmSGVhcFN0YXR1c1ByZWY7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGVzdE5hbWUKLQkgKi8KLQlwdWJsaWMgVHJpbUxheW91dFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBXaWxsIHRlc3QgdGhhdCB0aGUgdHJpbSBhcmVhIElEcyBhcmUgcmV0dXJuZWQuCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SURzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLQkJSVRyaW1NYW5hZ2VyIHRyaW1NYW5hZ2VyID0gd2luZG93LmdldFRyaW1NYW5hZ2VyKCk7Ci0JCWludFtdIGlkcyA9IHRyaW1NYW5hZ2VyLmdldEFyZWFJZHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJudW1iZXIgb2YgdHJpbSBhcmVhcyIsIDQsIGlkcy5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIGJhc2ljIHRyaW0gbGF5b3V0IG9mIGEgd29ya2JlbmNoIHdpbmRvdy4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqICAgICAgICAgICAgIG9uIGVycm9yCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRyaW1JbmZvcm1hdGlvbigpIHRocm93cyBUaHJvd2FibGUgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0JCUlUcmltTWFuYWdlciB0cmltTWFuYWdlciA9IHdpbmRvdy5nZXRUcmltTWFuYWdlcigpOwotCi0JCUxpc3QgZGVzY3MgPSB0cmltTWFuYWdlci5nZXRBcmVhVHJpbShTV1QuQk9UVE9NKTsKLQkJdmFsaWRhdGVQb3NpdGlvbnMoREVGQVVMVF9CT1RUT00sIGRlc2NzKTsKLQl9Ci0KLQkvKioKLQkgKiBTd2FwIHRoZSBzdGF0dXMgbGluZSB3aXRoIHRoZSBQcm9ncmVzc1JlZ2lvbiwgYW5kIGNoZWNrIHRoYXQgdGhlIGNvbnRyb2wKLQkgKiBvcmRlciBoYXMgYmVlbiB1cGRhdGVkLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTdGF0dXNMaW5lKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLQkJSVRyaW1NYW5hZ2VyIHRyaW1NYW5hZ2VyID0gd2luZG93LmdldFRyaW1NYW5hZ2VyKCk7Ci0KLQkJTGlzdCB0cmltID0gdHJpbU1hbmFnZXIuZ2V0QXJlYVRyaW0oSVRyaW1NYW5hZ2VyLkJPVFRPTSk7Ci0JCXZhbGlkYXRlUG9zaXRpb25zKERFRkFVTFRfQk9UVE9NLCB0cmltKTsKLQotCQlzd2FwUG9zdGl0aW9uKHRyaW0sIDEsIDMpOwotCQl0cmltTWFuYWdlci51cGRhdGVBcmVhVHJpbShJVHJpbU1hbmFnZXIuQk9UVE9NLCB0cmltLCBmYWxzZSk7Ci0KLQkJd2luZG93LmdldFNoZWxsKCkubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCXRyaW0gPSB0cmltTWFuYWdlci5nZXRBcmVhVHJpbShJVHJpbU1hbmFnZXIuQk9UVE9NKTsKLQkJdmFsaWRhdGVQb3NpdGlvbnMoU1dBUFBFRF9TVEFUVVNfTElORSwgdHJpbSk7Ci0JfQotCi0JLyoqCi0JICogU3dhcCB0aGUgZmFzdCB2aWV3IGJhciBhbmQgdGhlIHByb2dyZXNzIHJlZ2lvbiwgYW5kIHRoZW4gY2hlY2sgdGhhdCB0aGUKLQkgKiBjb250cm9scyBoYXZlIGJlZW4gdXBkYXRlZC4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlRmFzdFZpZXdCYXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotCQlJVHJpbU1hbmFnZXIgdHJpbU1hbmFnZXIgPSB3aW5kb3cuZ2V0VHJpbU1hbmFnZXIoKTsKLQotCQlMaXN0IHRyaW0gPSB0cmltTWFuYWdlci5nZXRBcmVhVHJpbShJVHJpbU1hbmFnZXIuQk9UVE9NKTsKLQkJdmFsaWRhdGVQb3NpdGlvbnMoREVGQVVMVF9CT1RUT00sIHRyaW0pOwotCi0JCXN3YXBQb3N0aXRpb24odHJpbSwgMCwgMyk7Ci0JCXRyaW1NYW5hZ2VyLnVwZGF0ZUFyZWFUcmltKElUcmltTWFuYWdlci5CT1RUT00sIHRyaW0sIGZhbHNlKTsKLQotCQl3aW5kb3cuZ2V0U2hlbGwoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJdHJpbSA9IHRyaW1NYW5hZ2VyLmdldEFyZWFUcmltKElUcmltTWFuYWdlci5CT1RUT00pOwotCQl2YWxpZGF0ZVBvc2l0aW9ucyhTV0FQUEVEX0ZBU1RWSUVXLCB0cmltKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHRlc3QgaXNuJ3QgcmVhbGx5IGFib3V0IHJlbW92aW5nIHRyaW0sIGp1c3QgdGVzdGluZyB0aGF0IHRoZSBpZiB0aGUKLQkgKiBoZWFwIHN0YXR1cyB0cmltIGlzIG5vdCBpbiB0aGUgdHJpbSBsaXN0LCBpdCdzIHJlbW92ZWQgZnJvbSB0aGUgYm90dG9tCi0JICogdHJpbSBhcmVhLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICogICAgICAgICAgICAgb24gZXJyb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGVhcFN0YXR1cygpIHRocm93cyBUaHJvd2FibGUgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0JCUlUcmltTWFuYWdlciB0cmltTWFuYWdlciA9IHdpbmRvdy5nZXRUcmltTWFuYWdlcigpOwotCi0JCUxpc3QgdHJpbSA9IHRyaW1NYW5hZ2VyLmdldEFyZWFUcmltKElUcmltTWFuYWdlci5CT1RUT00pOwotCQl2YWxpZGF0ZVBvc2l0aW9ucyhERUZBVUxUX0JPVFRPTSwgdHJpbSk7Ci0KLQkJdHJpbS5yZW1vdmUoMik7Ci0JCXRyaW1NYW5hZ2VyLnVwZGF0ZUFyZWFUcmltKElUcmltTWFuYWdlci5CT1RUT00sIHRyaW0sIHRydWUpOwotCi0JCXdpbmRvdy5nZXRTaGVsbCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQl0cmltID0gdHJpbU1hbmFnZXIuZ2V0QXJlYVRyaW0oSVRyaW1NYW5hZ2VyLkJPVFRPTSk7Ci0JCXZhbGlkYXRlUG9zaXRpb25zKFJFTU9WRURfSEVBUF9TVEFUVVMsIHRyaW0pOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIHB1YmxpYyBBUEkgdG8gYWRkIGEgcGllY2Ugb2YgdHJpbSB0byB0aGUgZW5kIG9mIHRoZSB0cmltIGFyZWEuCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkRXh0cmFUcmltKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLQkJSVRyaW1NYW5hZ2VyIHRyaW1NYW5hZ2VyID0gd2luZG93LmdldFRyaW1NYW5hZ2VyKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCQkiVGhlIHdpbmRvdyBzaG91bGQgaGF2ZSBpdCdzIHRvcCBiYW5uZXIgaW4gcGxhY2UiLAotCQkJCXRyaW1NYW5hZ2VyCi0JCQkJCQkuZ2V0VHJpbSgib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoV2luZG93LnRvcEJhciIpICE9IG51bGwpOwotCQkKLQkJVHJpbUxpc3QgdHJpbUxpc3QgPSBuZXcgVHJpbUxpc3Qod2luZG93LmdldFNoZWxsKCkpOwotCQl0cmltTWFuYWdlci5hZGRUcmltKElUcmltTWFuYWdlci5UT1AsIHRyaW1MaXN0KTsKLQkJd2luZG93LmdldFNoZWxsKCkubGF5b3V0KCk7Ci0KLQkJTGlzdCB0cmltID0gdHJpbU1hbmFnZXIuZ2V0QXJlYVRyaW0oSVRyaW1NYW5hZ2VyLlRPUCk7Ci0JCXZhbGlkYXRlUG9zaXRpb25zKFRPUF9UUklNX0xJU1QsIHRyaW0pOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIHB1YmxpYyBBUEkgdG8gYWRkIGEgcGllY2Ugb2YgdHJpbSBiZWZvcmUgYW4gZXhpc3RpbmcgcGllY2Ugb2YKLQkgKiB0cmltLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFBsYWNlRXh0cmFUcmltKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLQkJSVRyaW1NYW5hZ2VyIHRyaW1NYW5hZ2VyID0gd2luZG93LmdldFRyaW1NYW5hZ2VyKCk7Ci0JCQotCQlUcmltTGlzdCB0cmltTGlzdCA9IG5ldyBUcmltTGlzdCh3aW5kb3cuZ2V0U2hlbGwoKSk7Ci0JCXRyaW1NYW5hZ2VyLmFkZFRyaW0oSVRyaW1NYW5hZ2VyLlRPUCwgdHJpbUxpc3QpOwotCi0JCS8vIFdpbmRvd1RyaW1Qcm94eSBpcyBhbiBpbnRlcm5hbCAicXVpY2sgYW5kIGRpcnR5IiB3YXkKLQkJLy8gdG8ganVzdCBwcm92aWRlIGEgY29udHJvbCB0byB0aGUgdHJpbSAuLi4gbm90IHB1YmxpYyBBUEkKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHdpbmRvdy5nZXRTaGVsbCgpLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dCgiQiIpOwotCQlJV2luZG93VHJpbSBidXR0b25UcmltID0gbmV3IFdpbmRvd1RyaW1Qcm94eShiLCBCVVRUT05fQl9JRCwKLQkJCQkiQnV0dG9uIEIiLCBTV1QuVE9QIHwgU1dULkJPVFRPTSwgZmFsc2UpOwotCQkKLQkJLy8gZmluZCBhbiBleGlzdGluZyBwaWVjZSBvZiB0cmltIHRvIHVzZSBhcyBhIHJlZmVyZW5jZQotCQlJV2luZG93VHJpbSB0cmltID0gdHJpbU1hbmFnZXIuZ2V0VHJpbShUcmltTGlzdC5UUklNX0xJU1RfSUQpOwotCQlhc3NlcnRUcnVlKHRyaW1MaXN0ID09IHRyaW0pOwotCQl0cmltTWFuYWdlci5hZGRUcmltKElUcmltTWFuYWdlci5UT1AsIGJ1dHRvblRyaW0sIHRyaW0pOwotCQl3aW5kb3cuZ2V0U2hlbGwoKS5sYXlvdXQoKTsKLQotCQlMaXN0IHRvcFRyaW0gPSB0cmltTWFuYWdlci5nZXRBcmVhVHJpbShJVHJpbU1hbmFnZXIuVE9QKTsKLQkJdmFsaWRhdGVQb3NpdGlvbnMoVE9QX0JVVFRPTl9UUklNLCB0b3BUcmltKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHRoYXQgdGhlIHNhdmUtc3RhdGUgaXMgcmVjb3JkaW5nIHRyaW0gbGF5b3V0LgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNhdmVXb3JrYmVuY2hXaW5kb3coKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IChXb3JrYmVuY2hXaW5kb3cpIG9wZW5UZXN0V2luZG93KCk7Ci0KLQkJWE1MTWVtZW50byBzdGF0ZSA9IFhNTE1lbWVudG8KLQkJCQkuY3JlYXRlV3JpdGVSb290KElXb3JrYmVuY2hDb25zdGFudHMuVEFHX1dJTkRPVyk7Ci0JCUlTdGF0dXMgcmMgPSB3aW5kb3cuc2F2ZVN0YXRlKHN0YXRlKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHJjLmdldFNldmVyaXR5KCkpOwotCi0JCUlNZW1lbnRvIHRyaW0gPSBzdGF0ZS5nZXRDaGlsZChJV29ya2JlbmNoQ29uc3RhbnRzLlRBR19UUklNKTsKLQkJYXNzZXJ0Tm90TnVsbCh0cmltKTsKLQotCQlpbnRbXSBpZHMgPSB3aW5kb3cuZ2V0VHJpbU1hbmFnZXIoKS5nZXRBcmVhSWRzKCk7Ci0JCUlNZW1lbnRvW10gY2hpbGRyZW4gPSB0cmltCi0JCQkJLmdldENoaWxkcmVuKElXb3JrYmVuY2hDb25zdGFudHMuVEFHX1RSSU1fQVJFQSk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBoYXZlIDw9ICIgKyBpZHMubGVuZ3RoICsgIiB0cmltIGFyZWFzIiwKLQkJCQljaGlsZHJlbi5sZW5ndGggPD0gaWRzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiT3VyIHRyaW0gY29uZmlndXJhdGlvbiBzdGFydHMgd2l0aCIsIDIsIGNoaWxkcmVuLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB0aGF0IHRoZSB3b3JrYmVuY2ggd2luZG93IGNhbiByZXN0b3JlIHRyaW0gc3RhdGUgZnJvbSBhbgotCSAqIDxjb2RlPklNZW1lbnRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZXN0b3JlU3RhdGVXaXRoQ2hhbmdlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSAoV29ya2JlbmNoV2luZG93KSBvcGVuVGVzdFdpbmRvdygpOwotCQlJVHJpbU1hbmFnZXIgdHJpbU1hbmFnZXIgPSB3aW5kb3cuZ2V0VHJpbU1hbmFnZXIoKTsKLQotCQlYTUxNZW1lbnRvIHN0YXRlID0gWE1MTWVtZW50bwotCQkJCS5jcmVhdGVXcml0ZVJvb3QoSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfV0lORE9XKTsKLQkJSVN0YXR1cyByYyA9IHdpbmRvdy5zYXZlU3RhdGUoc3RhdGUpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcmMuZ2V0U2V2ZXJpdHkoKSk7Ci0JCUlNZW1lbnRvIHRyaW0gPSBzdGF0ZS5nZXRDaGlsZChJV29ya2JlbmNoQ29uc3RhbnRzLlRBR19UUklNKTsKLQkJYXNzZXJ0Tm90TnVsbCh0cmltKTsKLQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IHRyaW0KLQkJCQkuZ2V0Q2hpbGRyZW4oSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfVFJJTV9BUkVBKTsKLQkJaW50IGNoaWxkSWR4ID0gMDsKLQkJSU1lbWVudG8gYm90dG9tVHJpbSA9IG51bGw7Ci0JCVN0cmluZyBib3R0b21JZCA9IG5ldyBJbnRlZ2VyKFNXVC5CT1RUT00pLnRvU3RyaW5nKCk7Ci0KLQkJZm9yICg7IGNoaWxkSWR4IDwgY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZElkeCsrKSB7Ci0JCQlpZiAoY2hpbGRyZW5bY2hpbGRJZHhdLmdldElEKCkuZXF1YWxzKGJvdHRvbUlkKSkgewotCQkJCWJvdHRvbVRyaW0gPSBjaGlsZHJlbltjaGlsZElkeF07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0Tm90TnVsbChib3R0b21UcmltKTsKLQotCQljaGlsZHJlbiA9IGJvdHRvbVRyaW0uZ2V0Q2hpbGRyZW4oSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfVFJJTV9JVEVNKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGNoaWxkcmVuLmxlbmd0aCk7Ci0KLQkJU3RyaW5nIGlkID0gY2hpbGRyZW5bMF0uZ2V0SUQoKTsKLQkJY2hpbGRyZW5bMF0ucHV0U3RyaW5nKElNZW1lbnRvLlRBR19JRCwgY2hpbGRyZW5bM10uZ2V0SUQoKSk7Ci0JCWNoaWxkcmVuWzNdLnB1dFN0cmluZyhJTWVtZW50by5UQUdfSUQsIGlkKTsKLQotCQl3aW5kb3cucmVzdG9yZVN0YXRlKHN0YXRlLCB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldFBlcnNwZWN0aXZlKCkpOwotCQl3aW5kb3cuZ2V0U2hlbGwoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJTGlzdCB3aW5kb3dUcmltID0gdHJpbU1hbmFnZXIuZ2V0QXJlYVRyaW0oSVRyaW1NYW5hZ2VyLkJPVFRPTSk7Ci0JCXZhbGlkYXRlUG9zaXRpb25zKFNXQVBQRURfRkFTVFZJRVcsIHdpbmRvd1RyaW0pOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhhdCB0aGUgd29ya2JlbmNoIHdpbmRvdyBjYW4gcmVzdG9yZSB0cmltIHN0YXRlIGZyb20gYW4KLQkgKiA8Y29kZT5JTWVtZW50bzwvY29kZT4gd2hlcmUgYSB0cmltIGl0ZW0gaGFzIG1vdmVkIHNpZGVzLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlc3RvcmVTdGF0ZVdpdGhMb2NhdGlvbkNoYW5nZSgpIHRocm93cyBUaHJvd2FibGUgewotCQlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gKFdvcmtiZW5jaFdpbmRvdykgb3BlblRlc3RXaW5kb3coKTsKLQkJSVRyaW1NYW5hZ2VyIHRyaW1NYW5hZ2VyID0gd2luZG93LmdldFRyaW1NYW5hZ2VyKCk7Ci0KLQkJWE1MTWVtZW50byBzdGF0ZSA9IFhNTE1lbWVudG8KLQkJCQkuY3JlYXRlV3JpdGVSb290KElXb3JrYmVuY2hDb25zdGFudHMuVEFHX1dJTkRPVyk7Ci0JCUlTdGF0dXMgcmMgPSB3aW5kb3cuc2F2ZVN0YXRlKHN0YXRlKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHJjLmdldFNldmVyaXR5KCkpOwotCQlJTWVtZW50byB0cmltID0gc3RhdGUuZ2V0Q2hpbGQoSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfVFJJTSk7Ci0JCWFzc2VydE5vdE51bGwodHJpbSk7Ci0KLQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IHRyaW0KLQkJCQkuZ2V0Q2hpbGRyZW4oSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfVFJJTV9BUkVBKTsKLQkJaW50IGNoaWxkSWR4ID0gMDsKLQkJSU1lbWVudG8gYm90dG9tVHJpbSA9IG51bGw7Ci0JCVN0cmluZyBib3R0b21JZCA9IG5ldyBJbnRlZ2VyKFNXVC5CT1RUT00pLnRvU3RyaW5nKCk7Ci0JCWZvciAoOyBjaGlsZElkeCA8IGNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJZHgrKykgewotCQkJaWYgKGNoaWxkcmVuW2NoaWxkSWR4XS5nZXRJRCgpLmVxdWFscyhib3R0b21JZCkpIHsKLQkJCQlib3R0b21UcmltID0gY2hpbGRyZW5bY2hpbGRJZHhdOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydE5vdE51bGwoYm90dG9tVHJpbSk7Ci0KLQkJY2hpbGRyZW4gPSBib3R0b21UcmltLmdldENoaWxkcmVuKElXb3JrYmVuY2hDb25zdGFudHMuVEFHX1RSSU1fSVRFTSk7Ci0JCWFzc2VydEVxdWFscyg0LCBjaGlsZHJlbi5sZW5ndGgpOwotCQkvLyBraW5kYSBmYWtlIHRvIHJlbW92ZSB0aGUgZmFzdCB2aWV3IGJhciBmcm9tIHRoZSBib3R0b20KLQkJU3RyaW5nIGlkID0gY2hpbGRyZW5bMF0uZ2V0SUQoKTsKLQkJY2hpbGRyZW5bMF0ucHV0U3RyaW5nKElNZW1lbnRvLlRBR19JRCwgY2hpbGRyZW5bM10uZ2V0SUQoKSk7Ci0KLQkJSU1lbWVudG8gbGVmdCA9IHRyaW0uY3JlYXRlQ2hpbGQoSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfVFJJTV9BUkVBLAotCQkJCW5ldyBJbnRlZ2VyKFNXVC5MRUZUKS50b1N0cmluZygpKTsKLQkJbGVmdC5jcmVhdGVDaGlsZChJV29ya2JlbmNoQ29uc3RhbnRzLlRBR19UUklNX0lURU0sIGlkKTsKLQkJd2luZG93LnJlc3RvcmVTdGF0ZShzdGF0ZSwgd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRQZXJzcGVjdGl2ZSgpKTsKLQkJd2luZG93LmdldFNoZWxsKCkubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCUxpc3Qgd2luZG93VHJpbSA9IHRyaW1NYW5hZ2VyLmdldEFyZWFUcmltKElUcmltTWFuYWdlci5CT1RUT00pOwotCQlhc3NlcnRFcXVhbHMoMywgd2luZG93VHJpbS5zaXplKCkpOwotCi0JCXdpbmRvd1RyaW0gPSB0cmltTWFuYWdlci5nZXRBcmVhVHJpbShJVHJpbU1hbmFnZXIuTEVGVCk7Ci0JCWFzc2VydEVxdWFscygxLCB3aW5kb3dUcmltLnNpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogU3dhcCAyIElEcyBpbiB0aGUgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGRlc2NzCi0JICogICAgICAgICAgICB0aGUgZGVzY3JpcHRpb24gYXJyYXkKLQkgKiBAcGFyYW0gcG9zMQotCSAqICAgICAgICAgICAgcG9zaXRpb24gMSwgZnJvbSAwCi0JICogQHBhcmFtIHBvczIKLQkgKiAgICAgICAgICAgIHBvc2l0aW9uIDIsIGZyb20gMAotCSAqLwotCXByaXZhdGUgdm9pZCBzd2FwUG9zdGl0aW9uKExpc3QgdHJpbSwgaW50IHBvczEsIGludCBwb3MyKSB7Ci0JCU9iamVjdCB0bXAgPSB0cmltLmdldChwb3MxKTsKLQkJdHJpbS5zZXQocG9zMSwgdHJpbS5nZXQocG9zMikpOwotCQl0cmltLnNldChwb3MyLCB0bXApOwotCX0KLQotCS8qKgotCSAqIE1hdGNoIHRoZSByZXR1cm5lZCBzZXQgb2YgSURzIGV4YWN0bHkgd2l0aCBleHBlY3RlZCBJRHMuCi0JICogCi0JICogQHBhcmFtIGV4cGVjdGVkSURzCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIElEcyBpbiBvcmRlci4KLQkgKiBAcGFyYW0gcmV0cmlldmVkSURzCi0JICogICAgICAgICAgICB0aGUgY3VycmVudCBJRHMgaW4gb3JkZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUG9zaXRpb25zKFN0cmluZ1tdIGV4cGVjdGVkSURzLCBMaXN0IHJldHJpZXZlZElEcykgewotCQlhc3NlcnRFcXVhbHMoIk51bWJlciBvZiB0cmltIGl0ZW1zIGRvbid0IG1hdGNoIiwgZXhwZWN0ZWRJRHMubGVuZ3RoLAotCQkJCXJldHJpZXZlZElEcy5zaXplKCkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRJRHMubGVuZ3RoOyArK2kpIHsKLQkJCWFzc2VydEVxdWFscygiRmFpbGVkIGZvciBwb3N0aXRpb24gIiArIGksIGV4cGVjdGVkSURzW2ldLAotCQkJCQkoKElXaW5kb3dUcmltKSByZXRyaWV2ZWRJRHMuZ2V0KGkpKS5nZXRJZCgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC5VSVRlc3RDYXNlI2RvU2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuZG9TZXRVcCgpOwotCQlmSGVhcFN0YXR1c1ByZWYgPSBQcmVmVXRpbC5nZXRBUElQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCUlXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLlNIT1dfTUVNT1JZX01PTklUT1IpOwotCQlQcmVmVXRpbC5nZXRBUElQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cy5TSE9XX01FTU9SWV9NT05JVE9SLCB0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuVUlUZXN0Q2FzZSNkb1RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVByZWZVdGlsLmdldEFQSVByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCUlXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLlNIT1dfTUVNT1JZX01PTklUT1IsCi0JCQkJZkhlYXBTdGF0dXNQcmVmKTsKLQkJc3VwZXIuZG9UZWFyRG93bigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvVHJpbUxpc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1RyaW1MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZDFmYjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvVHJpbUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXaW5kb3dUcmltOwotCi0vKioKLSAqIFRyaW1MaXN0IGlzIGEgY29udHJvbCB0aGF0IHdlJ2QgbGlrZSB0byBjb250cmlidXRlIHRvIHRoZQotICogd2luZG93IHRyaW0sIHBsdXMgdGhlIHN1cHBvcnRpbmcgdHJpbSBpbnRlcmZhY2UuICBJdCBnZW5lcmF0ZXMgYQotICogc3RhdGljIGxpc3QgYW5kIGRvZXNuJ3QgcmVtZW1iZXIgYW55dGhpbmcsIGJ1dCBhIHJlYWwgdHJpbQotICogY29udHJpYnV0aW9uIGNvdWxkIGJlIGFueSBjb250cm9sK21vZGVsLgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgVHJpbUxpc3QgaW1wbGVtZW50cyBJV2luZG93VHJpbSB7Ci0JLyoqCi0JICogT3VyIHRyaW0gSUQgLi4uIG11c3QgYmUgdW5pcXVlLCBhcyBpZiB3ZSBjb250cmlidXRlZCB0aGlzCi0JICogdHJpbSBmcm9tIGFuIGV4dGVuc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUklNX0xJU1RfSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlRyaW1MaXN0IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElOSVRfTElTVCA9IHsgIk9mZmxpbmUiLCAiT25saW5lIiwgIlByb3hpZWQiIH07Ci0KLQlwcml2YXRlIENvbWJvIGZDb21ibzsKLQotCS8qKgotCSAqIFRoZSB0cmltIG9iamVjdHMgbXVzdCBhbGwgaGF2ZSB0aGUgc2FtZSBwYXJlbnQuICBBZnRlciAzLjJNNCAKLQkgKiB0aGUgSVdpbmRvd1RyaW0gaW50ZXJmYWNlIHdpbGwgYmUgdXBkYXRlZCBzbyB0aGF0IHRoZSB3b3JrYmVuY2gKLQkgKiB3aW5kb3cgY2FuIGdpdmUgZWFjaCBwaWVjZSBvZiB0cmltIHRoZSBjb3JyZWN0IHBhcmVudC4KLQkgKiBAcGFyYW0gc2hlbGwgdGhlIHBhcmVudCBvZiB0aGlzIHRyaW0KLQkgKi8KLQlwdWJsaWMgVHJpbUxpc3QoU2hlbGwgc2hlbGwpIHsKLQkJZkNvbWJvID0gbmV3IENvbWJvKHNoZWxsLCBTV1QuRFJPUF9ET1dOfFNXVC5SRUFEX09OTFkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IElOSVRfTElTVC5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHZhbHVlID0gSU5JVF9MSVNUW2ldOwotCQkJZkNvbWJvLmFkZCh2YWx1ZSk7Ci0JCX0KLQkJZkNvbWJvLnNlbGVjdCgwKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dUcmltI2dldENvbnRyb2woKQotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBmQ29tYm87Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93VHJpbSNnZXRWYWxpZFNpZGVzKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbGlkU2lkZXMoKSB7Ci0JCXJldHVybiBTV1QuVE9QIHwgU1dULkJPVFRPTTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dUcmltI2RvY2soaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY2soaW50IGRyb3BTaWRlKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8sIHdlIGRvbid0IGhhdmUgdG8gcmUtb3JpZW50IG91ciBjb250cm9sCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93VHJpbSNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIFRSSU1fTElTVF9JRDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dUcmltI2dldERpc3BsYXlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQkvLyBTaG91bGQgYmUgdGhlIE5MUyBzdHJpbmcgbmFtZSwgYnV0IEknbGwgY2hlYXQgZm9yIG5vdwotCQlyZXR1cm4gIlRyaW0gTGlzdCI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93VHJpbSNpc0Nsb3NlYWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dUcmltI2hhbmRsZUNsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVDbG9zZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbyBoZXJlLgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dUcmltI2dldFdpZHRoSGludCgpCi0JICovCi0JcHVibGljIGludCBnZXRXaWR0aEhpbnQoKSB7Ci0JCXJldHVybiBTV1QuREVGQVVMVDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93VHJpbSNnZXRIZWlnaHRIaW50KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEhlaWdodEhpbnQoKSB7Ci0JCXJldHVybiBTV1QuREVGQVVMVDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93VHJpbSNpc1Jlc2l6ZWFibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzaXplYWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1VJSm9iVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvVUlKb2JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMTI4MjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvVUlKb2JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgVUlKb2JUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpbmRvdyBmV2luZG93OwotCi0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hQYWdlIGZQYWdlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3JUZXN0IjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJRWRpdG9yUGFydFRlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgVUlKb2JUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIGZXaW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBmUGFnZSA9IGZXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiB1aUpvYkZpbmlzaGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGJhY2tncm91bmRUaHJlYWRTdGFydGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGJhY2tncm91bmRUaHJlYWRJbnRlcnJ1cHRlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBiYWNrZ3JvdW5kVGhyZWFkRmluaXNoZWRCZWZvcmVVSUpvYiA9IGZhbHNlOwotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBiYWNrZ3JvdW5kVGhyZWFkRmluaXNoZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gdWlKb2JGaW5pc2hlZEJlZm9yZUJhY2tncm91bmRUaHJlYWQgPSBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRvIGVuc3VyZSB0aGF0IGNhbGxpbmcgam9pbigpIG9uIGEgVUlKb2Igd2lsbCBibG9jayB0aGUgY2FsbGluZwotICAgICAqIHRocmVhZCB1bnRpbCB0aGUgam9iIGhhcyBmaW5pc2hlZC4gCi0gICAgICogCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEpvaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICB1aUpvYkZpbmlzaGVkID0gZmFsc2U7Ci0gICAgICAgIGJhY2tncm91bmRUaHJlYWRTdGFydGVkID0gZmFsc2U7Ci0gICAgICAgIGJhY2tncm91bmRUaHJlYWRGaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICBiYWNrZ3JvdW5kVGhyZWFkSW50ZXJydXB0ZWQgPSBmYWxzZTsKLSAgICAgICAgdWlKb2JGaW5pc2hlZEJlZm9yZUJhY2tncm91bmRUaHJlYWQgPSBmYWxzZTsKLQotICAgICAgICBmaW5hbCBVSUpvYiB0ZXN0Sm9iID0gbmV3IFVJSm9iKCJibGFoIGJsYWggYmxhaCIpIHsKLQkgICAgICAgIC8qIChub24tSmF2YWRvYykKLQkgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2IjcnVuSW5VSVRocmVhZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgICAgICAgICAqLwotCSAgICAgICAgcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkgICAgICAgICAgICBiYWNrZ3JvdW5kVGhyZWFkRmluaXNoZWRCZWZvcmVVSUpvYiA9IGJhY2tncm91bmRUaHJlYWRGaW5pc2hlZDsKLQkgICAgICAgICAgICB1aUpvYkZpbmlzaGVkID0gdHJ1ZTsKLQkgICAgICAgICAgICAKLQkgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHRlc3RKb2Iuc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEJhY2tncm91bmQgdGhyZWFkIHRoYXQgd2lsbCB0cnkgdG8gc2NoZWR1bGUgYW5kIGpvaW4gYSBVSUpvYi4gSWYgYWxsIGdvZXMgd2VsbAotICAgICAgICAvLyBpdCBzaG91bGQgbG9jayB1cCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5IGJsb2NraW5nIHRoZSBVSSB0aHJlYWQsIHByZXZlbnRpbmcKLSAgICAgICAgLy8gaXQgZnJvbSBydW5uaW5nLgotICAgICAgICBUaHJlYWQgdGVzdFRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuVGhyZWFkI3J1bigpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB0ZXN0Sm9iLnNjaGVkdWxlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJhY2tncm91bmRUaHJlYWRTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0ZXN0Sm9iLmpvaW4oKTsKLSAgICAgICAgICAgICAgICB1aUpvYkZpbmlzaGVkQmVmb3JlQmFja2dyb3VuZFRocmVhZCA9IHVpSm9iRmluaXNoZWQ7Ci0gICAgICAgICAgICAgICAgYmFja2dyb3VuZFRocmVhZEZpbmlzaGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kVGhyZWFkSW50ZXJydXB0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICAvLyBUaGlzIGpvYiBkb2VzIG5vdGhpbmcuIFdlIHVzZSBhIGJvZ3VzIGxvdy1wcmlvcml0eSBqb2IgaW5zdGVhZCBvZiBhIHNpbXBsZQotICAgICAgICAvLyBzbGVlcCh4eHh4KSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCB3YWtlIHVwIGJlZm9yZSB0aGUgdGVzdCBqb2Igd2FzCi0gICAgICAgIC8vIHNjaGVkdWxlZC4KLSAgICAgICAgSm9iIGRlbGF5Sm9iID0gbmV3IEpvYigiYmxhaCIpIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9OwotICAgICAgICBkZWxheUpvYi5zZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotCSAgICAgICAgLy8gU2NoZWR1bGUgdGhlIHRlc3QgdGhyZWFkCi0JICAgICAgICB0ZXN0VGhyZWFkLnN0YXJ0KCk7Ci0JICAgICAgICAKLQkgICAgICAgIC8vIE1lYXN1cmUgY3VycmVudCB0aW1lCi0JICAgICAgICBsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JICAgICAgICAgICAgICAgIAotCSAgICAgICAgLy8gV2UgbmVlZCB0byBjcmVhdGUgYSBzaXR1YXRpb24gaW4gd2hpY2ggdGhlIHJ1bigpIG1ldGhvZCBvZiB0aGUgVUlKb2Igd2lsbCBoYXZlCi0JICAgICAgICAvLyBiZWVuIGNhbGxlZCBhbmQgZXhpdGVkLCBidXQgdGhlIHJ1bkluVUlUaHJlYWQoKSBtZXRob2Qgd2lsbCBub3QgaGF2ZSBiZWVuIGNhbGxlZC4KLQkgICAgICAgIC8vIFdlIHRoZW4gcHV0IGV2ZXJ5dGhpbmcgZWxzZSB0byBzbGVlcCwgbWFraW5nIGEgaGlnaCBwcm9iYWJpbGl0eSB0aGF0IHRoZSBiYWNrZ3JvdW5kCi0JICAgICAgICAvLyB0aHJlYWQgd291bGQgd2FrZSB1cCBpZiB0aGVyZSB3YXMgbm90aGluZyBibG9ja2luZyBpdC4gTm90ZTogaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgCi0JICAgICAgICAvLyB0ZXN0IHdvdWxkIHN0aWxsIHBhc3MgaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSBhbmQgdGhlIGJhY2tncm91bmQgdGhyZWFkIGZhaWxlZCB0bwotCSAgICAgICAgLy8gd2FrZSB1cCBmb3IgcmVhc29ucyBvdGhlciB0aGFuIGl0cyBqb2luKCkuLi4gYnV0IGl0IGNyZWF0ZXMgYSBoaWdoIHByb2JhYmlsaXR5IG9mIAotCSAgICAgICAgLy8gdGhpbmdzIGZhaWxpbmcgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCi0JICAgICAgICAvLwotCSAgICAgICAgLy8gVGhlIHBvaW50IG9mIHRoaXMgam9pbigpIGlzIHRvIGJsb2NrIHRoZSBVSSB0aHJlYWQsIG1ha2luZyBpdCBpbXBvc3NpYmxlIHRvIAotCSAgICAgICAgLy8gcnVuICpzeW5jRXhlY3MuIEpvaW5pbmcgYSBsb3cgcHJpb3JpdHkgam9iIG1lYW5zIHRoYXQgdGhlIFVJSm9iIHNob3VsZCBnZXQKLQkgICAgICAgIC8vIHNjaGVkdWxlZCBmaXJzdCAobWVhbmluZyBpdHMgcnVuKC4uLikgbWV0aG9kIHdpbGwgYmUgY2FsbGVkKS4gVGhlIGZhY3QgdGhhdCB3ZSdyZSAKLQkgICAgICAgIC8vIGluIHRoZSBVSSB0aHJlYWQgcmlnaHQgbm93IG1lYW5zIHRoYXQgdGhlIFVJSm9iJ3MgcnVuSW5VSVRocmVhZCBtZXRob2Qgc2hvdWxkbid0IAotCSAgICAgICAgLy8gYmUgY2FsbGVkLgotCSAgICAgICAgCi0JICAgICAgICAvLyBCbG9jayB0aGUgVUkgdGhyZWFkIHVudGlsIHRoZSBVSUpvYidzIHJ1bigpIG1ldGhvZCBpcyBjYWxsZWQuCi0JICAgICAgICBkZWxheUpvYi5zY2hlZHVsZSgyMDApOwotCSAgICAgICAgZGVsYXlKb2Iuam9pbigpOwotCSAgICAgICAgCi0JICAgICAgICBsb25nIGZpbmFsVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCSAgICAgICAgCi0JICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBzbGVwdCBmb3IgYXQgbGVhc3QgMjAwbXMKLQkgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJXZSB0cmllZCB0byBzbGVlcCB0aGUgVUkgdGhyZWFkLCBidXQgaXQgd29rZSB1cCB0b28gZWFybHkuICIsCi0JICAgICAgICAgICAgICAgIGZpbmFsVGltZSAtIGN1cnJlbnRUaW1lID49IDIwMCk7Ci0JICAgICAgICAKLQkgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJCYWNrZ3JvdW5kIHRocmVhZCBkaWQgbm90IHN0YXJ0LCBzbyB0aGVyZSB3YXMgbm8gcG9zc2liaWxpdHkgIgotCSAgICAgICAgICAgICAgICArICJvZiB0ZXN0aW5nIHdoZXRoZXIgaXRzIGJlaGF2aW9yIHdhcyBjb3JyZWN0LiBUaGlzIGlzIG5vdCBhIHRlc3QgZmFpbHVyZS4gIgotCSAgICAgICAgICAgICAgICArICJJdCBtZWFucyB3ZSB3ZXJlIHVuYWJsZSB0byBydW4gdGhlIHRlc3QuICIsCi0JICAgICAgICAgICAgICAgIGJhY2tncm91bmRUaHJlYWRTdGFydGVkKTsKLQkgICAgICAgIAotCSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKCJBIFVJIGpvYiBzb21laG93IHJhbiB0byBjb21wbGV0aW9uIHdoaWxlIHRoZSBVSSB0aHJlYWQgd2FzIGJsb2NrZWQiLCB1aUpvYkZpbmlzaGVkKTsKLQkgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiQmFja2dyb3VuZCBqb2IgbWFuYWdlZCB0byBydW4gdG8gY29tcGxldGlvbiwgZXZlbiB0aG91Z2ggaXQgam9pbmVkIGEgVUkgdGhyZWFkIHRoYXQgc3RpbGwgaGFzbid0IGZpbmlzaGVkIiwKLQkgICAgICAgICAgICAgICAgYmFja2dyb3VuZFRocmVhZEZpbmlzaGVkKTsKLQkgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiQmFja2dyb3VuZCB0aHJlYWQgd2FzIGludGVycnVwdGVkIiwgYmFja2dyb3VuZFRocmVhZEludGVycnVwdGVkKTsKLQkgICAgICAgIAotCSAgICAgICAgLy8gTm93IHJ1biB0aGUgZXZlbnQgbG9vcC4gR2l2ZSB0aGUgYXN5bmNFeGVjIGEgY2hhbmNlIHRvIHJ1bi4KLQkJCS8vVXNlIHRoZSBkaXNwbGF5IHByb3ZpZGVkIGJ5IHRoZSBzaGVsbCBpZiBwb3NzaWJsZQotCSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZldpbmRvdy5nZXRTaGVsbCgpLmdldERpc3BsYXkoKTsKLQkgICAgICAgIAotCSAgICAgICAgLy8gV2FpdCB1bnRpbCBib3RoIHRocmVhZHMgaGF2ZSBydW4gdG8gY29tcGxldGlvbi4gSWYgd2Ugd2FpdCBmb3IgbW9yZSB0aGFuIDNzLCBzb21ldGhpbmcKLQkgICAgICAgIC8vIHByb2JhYmx5IGRlYWRsb2NrZWQuCi0JICAgICAgICB3aGlsZSAoISh1aUpvYkZpbmlzaGVkICYmIGJhY2tncm91bmRUaHJlYWRGaW5pc2hlZCkgKSB7ICAgIAotCSAgICAgICAgICAgIC8vIElmIHdlJ3ZlIHdhaXRlZCBtb3JlIHRoYW4gM3MgZm9yIHRoZSB0ZXN0IGpvYiB0byBydW4sIHRoZW4gc29tZXRoaW5nIGlzIHdyb25nLgotCSAgICAgICAgICAgIGlmIChmaW5hbFRpbWUgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA+IDMwMDApIHsKLQkgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCSAgICAgICAgICAgICAgICBkaXNwbGF5LnNsZWVwKCk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgCi0JICAgICAgICAvLyBOb3cgdGhhdCB0aGUgZXZlbnQgcXVldWUgaXMgZW1wdHksIGNoZWNrIHRoYXQgb3VyIGZpbmFsIHN0YXRlIGlzIG9rYXkuCi0JICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQmFja2dyb3VuZCB0aHJlYWQgZGlkIG5vdCBmaW5pc2ggKHBvc3NpYmxlIGRlYWRsb2NrKSIsIGJhY2tncm91bmRUaHJlYWRGaW5pc2hlZCk7Ci0JICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiVGVzdCBqb2IgZGlkIG5vdCBmaW5pc2ggKHBvc3NpYmxlIGRlYWRsb2NrKSIsIHVpSm9iRmluaXNoZWQpOwotCSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKCJCYWNrZ3JvdW5kIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQgIiwgYmFja2dyb3VuZFRocmVhZEludGVycnVwdGVkKTsKLQkgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiQmFja2dyb3VuZCB0aHJlYWQgZmluaXNoZWQgYmVmb3JlIHRoZSBVSUpvYiwgZXZlbiB0aG91Z2ggdGhlIGJhY2tncm91bmQgdGhyZWFkIHdhcyBzdXBwb3NlZCB0byBiZSB3YWl0aW5nIGZvciB0aGUgVUlKb2IiLCAKLQkgICAgICAgICAgICAgICAgYmFja2dyb3VuZFRocmVhZEZpbmlzaGVkQmVmb3JlVUlKb2IpOwotCSAgICAgICAgCi0JICAgICAgICAvLyBUaGlzIGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgdGVzdDogZW5zdXJlIHRoYXQgdGhlIGJhY2tncm91bmQgam9iIGFjdHVhbGx5IHdhaXRlZCBmb3IgdGhlIFVJIGpvYgotCSAgICAgICAgLy8gdG8gcnVuIHRvIGNvbXBsZXRpb24uCi0JICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkJhY2tncm91bmQgdGhyZWFkIGZpbmlzaGVkIGJlZm9yZSB0aGUgVUlKb2IsIGV2ZW4gdGhvdWdoIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCB3YXMgc3VwcG9zZWQgdG8gYmUgd2FpdGluZyBmb3IgdGhlIFVJSm9iIiwgCi0JICAgICAgICAgICAgICAgIGJhY2tncm91bmRUaHJlYWRGaW5pc2hlZEJlZm9yZVVJSm9iKTsKLQkgICAgICAgIAotCSAgICAgICAgLy8gUGFyYW5vaWEgY2hlY2s6IHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIHRlc3QgYXMgYWJvdmUsIGJ1dCBpdCBjb25maXJtcyB0aGF0IGJvdGgKLQkgICAgICAgIC8vIHRocmVhZHMgYWdyZWVkIG9uIHRoZSBhbnN3ZXIuCi0JICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQmFja2dyb3VuZCB0aHJlYWQgZmluaXNoZWQgYmVmb3JlIHRoZSBVSUpvYiwgZXZlbiB0aG91Z2ggdGhlIGJhY2tncm91bmQgdGhyZWFkIHdhcyBzdXBwb3NlZCB0byBiZSB3YWl0aW5nIGZvciB0aGUgVUlKb2IiLCAKLQkgICAgICAgICAgICAgICAgdWlKb2JGaW5pc2hlZEJlZm9yZUJhY2tncm91bmRUaHJlYWQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9Vc2VyU2F2ZWFibGVNb2NrVmlld1BhcnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1VzZXJTYXZlYWJsZU1vY2tWaWV3UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzMwYTA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1VzZXJTYXZlYWJsZU1vY2tWaWV3UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydDI7Ci0KLS8qKgotICogTW9jayB2aWV3IHBhcnQgdGhhdCBpbXBsZW1lbnRzIElTYXZlYWJsZVBhcnQuCi0gKiBVc2VkIGZvciB0ZXN0aW5nIGhpZGVWaWV3IGFuZCBvdGhlciB2aWV3IGxpZmVjeWNsZSBvbiBzYXZlYWJsZSB2aWV3cy4KLSAqIAotICogQHNpbmNlIDMuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VyU2F2ZWFibGVNb2NrVmlld1BhcnQgZXh0ZW5kcyBNb2NrVmlld1BhcnQgaW1wbGVtZW50cwotCQlJU2F2ZWFibGVQYXJ0MiB7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlVzZXJTYXZlYWJsZU1vY2tWaWV3UGFydCI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEaXJ0eSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIHNhdmVBc0FsbG93ZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBzYXZlTmVlZGVkID0gdHJ1ZTsKLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0gICAgfQotICAgIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJY2FsbFRyYWNlLmFkZCgiZG9TYXZlIiApOwotCQlpc0RpcnR5ID0gZmFsc2U7Ci0JCXNhdmVOZWVkZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJY2FsbFRyYWNlLmFkZCgiZG9TYXZlQXMiICk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQljYWxsVHJhY2UuYWRkKCJpc0RpcnR5IiApOwotCQlyZXR1cm4gaXNEaXJ0eTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQljYWxsVHJhY2UuYWRkKCJpc1NhdmVBc0FsbG93ZWQiICk7Ci0JCXJldHVybiBzYXZlQXNBbGxvd2VkIDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzU2F2ZU9uQ2xvc2VOZWVkZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU9uQ2xvc2VOZWVkZWQoKSB7Ci0JCWNhbGxUcmFjZS5hZGQoImlzU2F2ZU9uQ2xvc2VOZWVkZWQiICk7Ci0JCXJldHVybiBzYXZlTmVlZGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpcnR5KGJvb2xlYW4gZCkgewotCQl0aGlzLmlzRGlydHkgPSBkOwotICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0JfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFNhdmVBc0FsbG93ZWQoYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQpIHsKLSAgICAgICAgdGhpcy5zYXZlQXNBbGxvd2VkID0gaXNTYXZlQXNBbGxvd2VkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTYXZlTmVlZGVkKGJvb2xlYW4gaXNTYXZlT25DbG9zZU5lZWRlZCkgewotICAgICAgICB0aGlzLnNhdmVOZWVkZWQgPSBpc1NhdmVPbkNsb3NlTmVlZGVkOwotICAgIH0KLQotCXB1YmxpYyBpbnQgcHJvbXB0VG9TYXZlT25DbG9zZSgpIHsKLQkJcmV0dXJuIElTYXZlYWJsZVBhcnQyLkRFRkFVTFQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvVXNlclNhdmVhYmxlU2hhcmVkVmlld1BhcnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1VzZXJTYXZlYWJsZVNoYXJlZFZpZXdQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZTNjNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvVXNlclNhdmVhYmxlU2hhcmVkVmlld1BhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQ7Ci0KLS8qKgotICogTW9jayB2aWV3IHBhcnQgdGhhdCBpbXBsZW1lbnRzIElTYXZlYWJsZVBhcnQuIFVzZWQgZm9yIHRlc3RpbmcgaGlkZVZpZXcgYW5kCi0gKiBvdGhlciB2aWV3IGxpZmVjeWNsZSBvbiBzYXZlYWJsZSB2aWV3cy4KLSAqIAotICogQHNpbmNlIDMuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VyU2F2ZWFibGVTaGFyZWRWaWV3UGFydCBleHRlbmRzIE1vY2tWaWV3UGFydCBpbXBsZW1lbnRzCi0JCUlTYXZlYWJsZVBhcnQgewotCS8qKgotCSAqIFRoZSBzaGFyZWQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlVzZXJTYXZlYWJsZVNoYXJlZFZpZXdQYXJ0IjsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2hhcmVkTW9kZWwgewotCQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5ID0gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBTaGFyZWRNb2RlbCBmU2hhcmVkTW9kZWwgPSBuZXcgU2hhcmVkTW9kZWwoKTsKLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJY2FsbFRyYWNlLmFkZCgiZG9TYXZlIik7Ci0JCWZTaGFyZWRNb2RlbC5pc0RpcnR5ID0gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJY2FsbFRyYWNlLmFkZCgiZG9TYXZlQXMiKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJY2FsbFRyYWNlLmFkZCgiaXNEaXJ0eSIpOwotCQlyZXR1cm4gZlNoYXJlZE1vZGVsLmlzRGlydHk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzU2F2ZU9uQ2xvc2VOZWVkZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU9uQ2xvc2VOZWVkZWQoKSB7Ci0JCWNhbGxUcmFjZS5hZGQoImlzU2F2ZU9uQ2xvc2VOZWVkZWQiKTsKLQkJcmV0dXJuIGZTaGFyZWRNb2RlbC5pc0RpcnR5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWRNb2RlbChTaGFyZWRNb2RlbCBzKSB7Ci0JCWZTaGFyZWRNb2RlbCA9IHM7Ci0JfQotCQotCXB1YmxpYyBTaGFyZWRNb2RlbCBnZXRTaGFyZWRNb2RlbCgpIHsKLQkJcmV0dXJuIGZTaGFyZWRNb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9WaWV3UGVyc3BlY3RpdmUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1ZpZXdQZXJzcGVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGMxNTdjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1ZpZXdQZXJzcGVjdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLQotLyoqCi0gKiBTdXBwbGllcyBhbiBhcnJhbmdlbWVudCBvZiB2aWV3cyB0byB0ZXN0IHZhcmlvdXMgZm9ybXMgb2YgdmlldyBhY3RpdmF0aW9uLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3UGVyc3BlY3RpdmUgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3RvcnkjY3JlYXRlSW5pdGlhbExheW91dChvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotICAgICAgICBTdHJpbmcgZWRpdG9yQXJlYSA9IGxheW91dC5nZXRFZGl0b3JBcmVhKCk7Ci0gICAgICAgIElGb2xkZXJMYXlvdXQgZm9sZGVyMSA9IGxheW91dC5jcmVhdGVGb2xkZXIoImZvbGRlcjEiLAotICAgICAgICAgICAgICAgIElQYWdlTGF5b3V0LkxFRlQsIC4yNWYsIGVkaXRvckFyZWEpOwotICAgICAgICBmb2xkZXIxLmFkZFZpZXcoTW9ja1ZpZXdQYXJ0LklEKTsKLSAgICAgICAgZm9sZGVyMS5hZGRQbGFjZWhvbGRlcihNb2NrVmlld1BhcnQuSUQyKTsKLSAgICAgICAgbGF5b3V0LmFkZFZpZXcoTW9ja1ZpZXdQYXJ0LklEMywgSVBhZ2VMYXlvdXQuUklHSFQsIC43NWYsIGVkaXRvckFyZWEpOwotICAgICAgICBsYXlvdXQuYWRkUGxhY2Vob2xkZXIoTW9ja1ZpZXdQYXJ0LklENCwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAuNzVmLAotICAgICAgICAgICAgICAgIGVkaXRvckFyZWEpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvVmlld1V0aWxzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9WaWV3VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmZmExMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9WaWV3VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuSVN0aWNreVZpZXdEZXNjcmlwdG9yOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCB3aWxsIHRlc3QgdmFyaW91cyB2aWV3IHByb3BlcnRpZXMuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZpZXdVdGlscyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmluZEluU3RhY2soSVZpZXdQYXJ0W10gc3RhY2ssIElWaWV3UGFydCB0YXJnZXQpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHN0YWNrW2ldID09IHRhcmdldCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xvc2VhYmxlKElWaWV3UGFydCBwYXJ0KSB7Ci0gICAgICAgIFZpZXdTaXRlIHZpZXdTaXRlID0gKFZpZXdTaXRlKSBwYXJ0LmdldFNpdGUoKTsKLSAgICAgICAgU3RyaW5nIGlkID0gdmlld1NpdGUuZ2V0SWQoKTsKLSAgICAgICAgSVZpZXdSZWZlcmVuY2UgcmVmID0gdmlld1NpdGUuZ2V0UGFnZSgpLmZpbmRWaWV3UmVmZXJlbmNlKGlkKTsKLSAgICAgICAgcmV0dXJuICgoV29ya2JlbmNoUGFnZSkgdmlld1NpdGUuZ2V0UGFnZSgpKS5nZXRBY3RpdmVQZXJzcGVjdGl2ZSgpCi0gICAgICAgICAgICAgICAgLmlzQ2xvc2VhYmxlKHJlZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTW92ZWFibGUoSVZpZXdQYXJ0IHBhcnQpIHsKLSAgICAgICAgVmlld1NpdGUgdmlld1NpdGUgPSAoVmlld1NpdGUpIHBhcnQuZ2V0U2l0ZSgpOwotICAgICAgICBTdHJpbmcgaWQgPSB2aWV3U2l0ZS5nZXRJZCgpOwotICAgICAgICBJVmlld1JlZmVyZW5jZSByZWYgPSB2aWV3U2l0ZS5nZXRQYWdlKCkuZmluZFZpZXdSZWZlcmVuY2UoaWQpOwotICAgICAgICByZXR1cm4gKChXb3JrYmVuY2hQYWdlKSB2aWV3U2l0ZS5nZXRQYWdlKCkpLmdldEFjdGl2ZVBlcnNwZWN0aXZlKCkKLSAgICAgICAgICAgICAgICAuaXNNb3ZlYWJsZShyZWYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0aWNreShJVmlld1BhcnQgcGFydCkgewotICAgICAgICBTdHJpbmcgaWQgPSBwYXJ0LmdldFNpdGUoKS5nZXRJZCgpOwotICAgICAgICBJU3RpY2t5Vmlld0Rlc2NyaXB0b3JbXSBkZXNjcyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0Vmlld1JlZ2lzdHJ5KCkuZ2V0U3RpY2t5Vmlld3MoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGRlc2NzW2ldLmdldElkKCkuZXF1YWxzKGlkKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZpZXdVdGlscygpIHsKLSAgICAgICAgLy9uby1vcAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1hNTE1lbWVudG9UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS9YTUxNZW1lbnRvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDBjODU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL1hNTE1lbWVudG9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlhNTE1lbWVudG87Ci0KLS8qKgotICogVGVzdGluZyBYTUxNZW1lbnRvIChzZWUgYnVnIDkzMjYyKS4gRW1waGFzaXMgaXMgb24gZW5zdXJpbmcgdGhhdCB0aGUgMy4xCi0gKiB2ZXJzaW9uIGJlaGF2ZXMganVzdCBsaWtlIHRoZSAzLjAuMSB2ZXJzaW9uLgotICogCi0gKiBAc2luY2UgMy4xCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTE1lbWVudG9UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEVTVF9TVFJJTkdTID0geyAidmFsdWUiLAotCQkJIiB2YWx1ZSB3aXRoIHNwYWNlcyAiLCAidmFsdWUud2l0aC5tYW55LmRvdHMiLAotCQkJInZhbHVlX3dpdGhfdW5kZXJzY29yZXMiLCAidmFsdWU8d2l0aDxsZXNzdGhhbiIsCi0JCQkidmFsdWU+d2l0aD5ncmVhdGVydGhhbiIsICJ2YWx1ZSZ3aXRoJmFtcGVyc2FuZCIsCi0JCQkidmFsdWVcIndpdGhcInF1b3RlIiwgInZhbHVlI3dpdGgjaGFzaCIsICIiLAotCQkJLyoKLQkJCSAqIHRoZSBmb2xsb3dpbmcgY2FzZXMgYXJlIGZvciBidWcgOTM3MjAKLQkJCSAqLwotCQkJIlxudmFsdWVcbndpdGhcbm5ld2xpbmVzXG4iLCAiXHR2YWx1ZVx0d2l0aFx0dGFiXHQiLAotCQkJIlxydmFsdWVccndpdGhccnJldHVyblxyIiwgfTsKLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgWE1MTWVtZW50byBjcmVhdGVSZWFkUm9vdChSZWFkZXIpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVJlYWRSb290UmVhZGVyRXhjZXB0aW9uQ2FzZXMoKSB7Ci0JCXRyeSB7Ci0JCQlYTUxNZW1lbnRvLmNyZWF0ZVJlYWRSb290KG5ldyBTdHJpbmdSZWFkZXIoIkludmFsaWQgZm9ybWF0IikpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IFdvcmtiZW5jaEV4Y2VwdGlvbiBiZWNhdXNlIG9mIGludmFsaWQgZm9ybWF0Iik7Ci0JCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQlYTUxNZW1lbnRvLmNyZWF0ZVJlYWRSb290KG5ldyBTdHJpbmdSZWFkZXIoCi0JCQkJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJJU08tODg1OS0xXCI/PiIpKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBXb3JrYmVuY2hFeGNlcHRpb24gYmVjYXVzZSB0aGVyZSBpcyBubyBlbGVtZW50Iik7Ci0JCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQlYTUxNZW1lbnRvLmNyZWF0ZVJlYWRSb290KG5ldyBSZWFkZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBpbnQgcmVhZChjaGFyW10gYXJnMCwgaW50IGFyZzEsIGludCBhcmcyKQotCQkJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgV29ya2JlbmNoRXhjZXB0aW9uIGJlY2F1c2Ugb2YgSU9FeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUmVhZFJvb3RSZWFkZXIoKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50bwotCQkJCS5jcmVhdGVSZWFkUm9vdChuZXcgU3RyaW5nUmVhZGVyKAotCQkJCQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIklTTy04ODU5LTFcIj8+PHNpbXBsZT5zb21lIHRleHQgZGF0YTwvc2ltcGxlPiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzb21lIHRleHQgZGF0YSIsIG1lbWVudG8uZ2V0VGV4dERhdGEoKSk7Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBYTUxNZW1lbnRvIGNyZWF0ZVJlYWRSb290KFJlYWRlciwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVSZWFkUm9vdFJlYWRlclN0cmluZygpIHsKLQkJLy8gVE9ETyAtIEkgZG9uJ3Qga25vdyBob3cgdG8gdGVzdCB0aGlzLiBUaGUgbWV0aG9kIGlzIG5vdCBjYWxsZWQgYnkKLQkJLy8gYW55b25lIGFzIG9mIDIwMDUvMDQvMDUuCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVdyaXRlUm9vdCgpIHsKLQkJU3RyaW5nW10gcm9vdFR5cGVzID0geyAidHlwZSIsICJ0eXBlLndpdGguZG90cyIsCi0JCQkJInR5cGVfd2l0aF91bmRlcnNjb3JlcyIgfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB0eXBlID0gcm9vdFR5cGVzW2ldOwotCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QodHlwZSk7Ci0JCQlhc3NlcnROb3ROdWxsKG1lbWVudG8pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwYWNlc0luUm9vdEFyZUlsbGVnYWwoKSB7Ci0JCXRyeSB7Ci0JCQlYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgid2l0aCBzcGFjZSIpOwotCQkJZmFpbCgic2hvdWxkIGZhaWwiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BhY2VzSW5LZXlzQXJlSWxsZWdhbCgpIHsKLQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoImZvbyIpOwotCQl0cnkgewotCQkJbWVtZW50by5jcmVhdGVDaGlsZCgid2l0aCBzcGFjZSIsICJiYXIiKTsKLQkJCWZhaWwoInNob3VsZCBmYWlsIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQltZW1lbnRvLnB1dFN0cmluZygid2l0aCBzcGFjZSIsICJiYXIiKTsKLQkJCWZhaWwoInNob3VsZCBmYWlsIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvcHlDaGlsZCgpIHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQl0ZXN0UHV0QW5kR2V0KG5ldyBNZW1lbnRvQ2hlY2tlcigpIHsKLQotCQkJcHVibGljIHZvaWQgcHJlcGFyZUFuZENoZWNrQmVmb3JlU2VyaWFsaXphdGlvbigKLQkJCQkJWE1MTWVtZW50byBtZW1lbnRvVG9TZXJpYWxpemUpIHsKLQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG9Ub1NlcmlhbGl6ZS5jcmVhdGVDaGlsZCgiYyIsICJpIik7Ci0JCQkJZmlsbE1lbWVudG8oY2hpbGQpOwotCQkJCUlNZW1lbnRvIGNvcGllZENoaWxkID0gbWVtZW50b1RvU2VyaWFsaXplLmNvcHlDaGlsZChjaGlsZCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJpIiwgY29waWVkQ2hpbGQuZ2V0SUQoKSk7Ci0JCQkJY2hlY2tNZW1lbnRvKGNvcGllZENoaWxkLCB0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY2hlY2tBZnRlckRlc2VyaWFsaXphdGlvbihYTUxNZW1lbnRvIGRlc2VyaWFsaXplZE1lbWVudG8pIHsKLQkJCQlJTWVtZW50byBjaGlsZCA9IGRlc2VyaWFsaXplZE1lbWVudG8uZ2V0Q2hpbGQoImMiKTsKLQkJCQljaGVja01lbWVudG8oY2hpbGQsIHRydWUpOwotCQkJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBkZXNlcmlhbGl6ZWRNZW1lbnRvLmdldENoaWxkcmVuKCJjIik7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIsIGNoaWxkcmVuLmxlbmd0aCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJpIiwgY2hpbGRyZW5bMF0uZ2V0SUQoKSk7Ci0JCQkJY2hlY2tNZW1lbnRvKGNoaWxkcmVuWzBdLCB0cnVlKTsKLQkJCQlhc3NlcnRFcXVhbHMoImkiLCBjaGlsZHJlblsxXS5nZXRJRCgpKTsKLQkJCQljaGVja01lbWVudG8oY2hpbGRyZW5bMV0sIHRydWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGZpbGwgYSBtZW1lbnRvIHRvIGJlIGNoZWNrZWQgbGF0ZXIgYnkgY2hlY2tNZW1lbnRvLgotCSAqIAotCSAqIEBwYXJhbSBtZW1lbnRvCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbGxNZW1lbnRvKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJbWVtZW50by5wdXRGbG9hdCgiZmxvYXRLZXkiLCAwLjRmKTsKLQkJbWVtZW50by5wdXRJbnRlZ2VyKCJpbnRlZ2VyS2V5IiwgMzI0NzY1KTsKLQkJbWVtZW50by5wdXRTdHJpbmcoInN0cmluZ0tleSIsICJhIHN0cmluZyIpOwotCQltZW1lbnRvLnB1dFRleHREYXRhKCJzb21lIHRleHQgZGF0YSIpOwotCQltZW1lbnRvLmNyZWF0ZUNoaWxkKCJjaGlsZDEiKTsKLQkJbWVtZW50by5jcmVhdGVDaGlsZCgiY2hpbGQyIiwgImNoaWxkMmlkMSIpOwotCQltZW1lbnRvLmNyZWF0ZUNoaWxkKCJjaGlsZDIiLCAiY2hpbGQyaWQyIik7Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBjaGVjayBpZiB0aGUgdmFsdWVzIHNldCBieSBmaWxsTWVtZW50byBhcmUgc3RpbGwgdGhlcmUuCi0JICogVGhlIGJvb2xlYW4gcGFyYW1ldGVyIGlzIG5lZWRlZCBiZWNhdXNlIGluIHNvbWUgY2FzZXMKLQkgKiAoSU1lbWVtZW50byNwdXRNZW1lbnRvKSwgdGhlIHRleHQgZGF0YSBnZXRzIGxvc3QuCi0JICogCi0JICogQHBhcmFtIG1lbWVudG8KLQkgKiBAcGFyYW0gY2hlY2tGb3JUZXh0RGF0YQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrTWVtZW50byhJTWVtZW50byBtZW1lbnRvLCBib29sZWFuIGNoZWNrRm9yVGV4dERhdGEpIHsKLQkJYXNzZXJ0RXF1YWxzKDAuNGYsIG1lbWVudG8uZ2V0RmxvYXQoImZsb2F0S2V5IikuZmxvYXRWYWx1ZSgpLCAwLjBmKTsKLQkJYXNzZXJ0RXF1YWxzKDMyNDc2NSwgbWVtZW50by5nZXRJbnRlZ2VyKCJpbnRlZ2VyS2V5IikuaW50VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYSBzdHJpbmciLCBtZW1lbnRvLmdldFN0cmluZygic3RyaW5nS2V5IikpOwotCQlpZiAoY2hlY2tGb3JUZXh0RGF0YSkgewotCQkJYXNzZXJ0RXF1YWxzKCJzb21lIHRleHQgZGF0YSIsIG1lbWVudG8uZ2V0VGV4dERhdGEoKSk7Ci0JCX0KLQkJSU1lbWVudG8gY2hpbGQxID0gbWVtZW50by5nZXRDaGlsZCgiY2hpbGQxIik7Ci0JCWFzc2VydE5vdE51bGwoY2hpbGQxKTsKLQkJSU1lbWVudG8gY2hpbGQyID0gbWVtZW50by5nZXRDaGlsZCgiY2hpbGQyIik7Ci0JCWFzc2VydE5vdE51bGwoY2hpbGQyKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaGlsZDJpZDEiLCBjaGlsZDIuZ2V0SUQoKSk7Ci0JCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvLmdldENoaWxkcmVuKCJjaGlsZDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjaGlsZHJlbik7Ci0JCWFzc2VydEVxdWFscygyLCBjaGlsZHJlbi5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoImNoaWxkMmlkMSIsIGNoaWxkcmVuWzBdLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMoImNoaWxkMmlkMiIsIGNoaWxkcmVuWzFdLmdldElEKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRHZXRDaGlsZCgpIHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIHR5cGUxID0gInR5cGUxIjsKLQkJZmluYWwgU3RyaW5nIHR5cGUyID0gInR5cGUyIjsKLQkJZmluYWwgU3RyaW5nIGlkID0gImlkIjsKLQotCQl0ZXN0UHV0QW5kR2V0KG5ldyBNZW1lbnRvQ2hlY2tlcigpIHsKLQotCQkJcHVibGljIHZvaWQgcHJlcGFyZUFuZENoZWNrQmVmb3JlU2VyaWFsaXphdGlvbigKLQkJCQkJWE1MTWVtZW50byBtZW1lbnRvVG9TZXJpYWxpemUpIHsKLQkJCQkvLyBjaGVjayB0aGF0IG5vdGhpbmcgaXMgdGhlcmUgeWV0Ci0JCQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1lbWVudG9Ub1NlcmlhbGl6ZS5nZXRDaGlsZCh0eXBlMSkpOwotCQkJCWFzc2VydEVxdWFscyhudWxsLCBtZW1lbnRvVG9TZXJpYWxpemUuZ2V0Q2hpbGQodHlwZTIpKTsKLQotCQkJCS8vIGNyZWF0aW9uIHdpdGhvdXQgSUQKLQkJCQlJTWVtZW50byBjaGlsZDEgPSBtZW1lbnRvVG9TZXJpYWxpemUuY3JlYXRlQ2hpbGQodHlwZTEpOwotCQkJCWFzc2VydE5vdE51bGwoY2hpbGQxKTsKLQkJCQlhc3NlcnROb3ROdWxsKG1lbWVudG9Ub1NlcmlhbGl6ZS5nZXRDaGlsZCh0eXBlMSkpOwotCi0JCQkJLy8gY3JlYXRpb24gd2l0aCBJRAotCQkJCUlNZW1lbnRvIGNoaWxkMiA9IG1lbWVudG9Ub1NlcmlhbGl6ZS5jcmVhdGVDaGlsZCh0eXBlMiwgaWQpOwotCQkJCWFzc2VydE5vdE51bGwoY2hpbGQyKTsKLQkJCQlhc3NlcnROb3ROdWxsKG1lbWVudG9Ub1NlcmlhbGl6ZS5nZXRDaGlsZCh0eXBlMikpOwotCQkJCWFzc2VydEVxdWFscyhpZCwgY2hpbGQyLmdldElEKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjaGVja0FmdGVyRGVzZXJpYWxpemF0aW9uKFhNTE1lbWVudG8gZGVzZXJpYWxpemVkTWVtZW50bykgewotCQkJCUlNZW1lbnRvIGNoaWxkMSA9IGRlc2VyaWFsaXplZE1lbWVudG8uZ2V0Q2hpbGQodHlwZTEpOwotCQkJCWFzc2VydE5vdE51bGwoY2hpbGQxKTsKLQkJCQlJTWVtZW50byBjaGlsZDIgPSBkZXNlcmlhbGl6ZWRNZW1lbnRvLmdldENoaWxkKHR5cGUyKTsKLQkJCQlhc3NlcnROb3ROdWxsKGNoaWxkMik7Ci0JCQkJYXNzZXJ0RXF1YWxzKGlkLCBjaGlsZDIuZ2V0SUQoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGlsZHJlbigpIHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIHR5cGUgPSAidHlwZSI7Ci0JCWZpbmFsIFN0cmluZyBpZDEgPSAiaWQiOwotCQlmaW5hbCBTdHJpbmcgaWQyID0gImlkMiI7Ci0KLQkJdGVzdFB1dEFuZEdldChuZXcgTWVtZW50b0NoZWNrZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHByZXBhcmVBbmRDaGVja0JlZm9yZVNlcmlhbGl6YXRpb24oCi0JCQkJCVhNTE1lbWVudG8gbWVtZW50b1RvU2VyaWFsaXplKSB7Ci0JCQkJLy8gY2hlY2sgdGhhdCBub3RoaW5nIGlzIHRoZXJlIHlldAotCQkJCWFzc2VydEVxdWFscyhudWxsLCBtZW1lbnRvVG9TZXJpYWxpemUuZ2V0Q2hpbGQodHlwZSkpOwotCi0JCQkJSU1lbWVudG8gY2hpbGQxID0gbWVtZW50b1RvU2VyaWFsaXplLmNyZWF0ZUNoaWxkKHR5cGUsIGlkMSk7Ci0JCQkJYXNzZXJ0Tm90TnVsbChjaGlsZDEpOwotCQkJCWFzc2VydE5vdE51bGwobWVtZW50b1RvU2VyaWFsaXplLmdldENoaWxkKHR5cGUpKTsKLQkJCQlhc3NlcnRFcXVhbHMoaWQxLCBjaGlsZDEuZ2V0SUQoKSk7Ci0KLQkJCQkvLyBzZWNvbmQgY2hpbGQgd2l0aCB0aGUgc2FtZSB0eXBlCi0JCQkJSU1lbWVudG8gY2hpbGQyID0gbWVtZW50b1RvU2VyaWFsaXplLmNyZWF0ZUNoaWxkKHR5cGUsIGlkMik7Ci0JCQkJYXNzZXJ0Tm90TnVsbChjaGlsZDIpOwotCQkJCWFzc2VydEVxdWFscygyLCBtZW1lbnRvVG9TZXJpYWxpemUuZ2V0Q2hpbGRyZW4odHlwZSkubGVuZ3RoKTsKLQkJCQlhc3NlcnRFcXVhbHMoaWQyLCBjaGlsZDIuZ2V0SUQoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNoZWNrQWZ0ZXJEZXNlcmlhbGl6YXRpb24oWE1MTWVtZW50byBkZXNlcmlhbGl6ZWRNZW1lbnRvKSB7Ci0JCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IGRlc2VyaWFsaXplZE1lbWVudG8uZ2V0Q2hpbGRyZW4odHlwZSk7Ci0JCQkJYXNzZXJ0Tm90TnVsbChjaGlsZHJlbik7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIsIGNoaWxkcmVuLmxlbmd0aCk7Ci0KLQkJCQkvLyB0aGlzIGNoZWNrcyB0aGF0IHRoZSBvcmRlciBpcyBtYWludGFpbmVkLgotCQkJCS8vIHRoZSBzcGVjIGRvZXMgbm90IHByb21pc2UgdGhpcywgYnV0IGNsaWVudHMKLQkJCQkvLyBtYXkgcmVseSBvbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBiZWhhdmlvdXIuCi0JCQkJYXNzZXJ0RXF1YWxzKGlkMSwgY2hpbGRyZW5bMF0uZ2V0SUQoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKGlkMiwgY2hpbGRyZW5bMV0uZ2V0SUQoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJRCgpIHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIHR5cGUgPSAidHlwZSI7Ci0KLQkJU3RyaW5nW10gaWRzID0geyAiaWQiLCAiIiwgImlkLndpdGgubWFueS5kb3RzIiwgImlkX3dpdGhfdW5kZXJzY29yZXMiLAotCQkJCSJpZDx3aXRoPGxlc3N0aGFuIiwgImlkPndpdGg+Z3JlYXRlcnRoYW4iLCAiaWQmd2l0aCZhbXBlcnNhbmQiLAotCQkJCSJpZFwid2l0aFwicXVvdGUiLCAiaWQjd2l0aCNoYXNoIiB9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBTdHJpbmcgaWQgPSBpZHNbaV07Ci0KLQkJCXRlc3RQdXRBbmRHZXQobmV3IE1lbWVudG9DaGVja2VyKCkgewotCi0JCQkJcHVibGljIHZvaWQgcHJlcGFyZUFuZENoZWNrQmVmb3JlU2VyaWFsaXphdGlvbigKLQkJCQkJCVhNTE1lbWVudG8gbWVtZW50b1RvU2VyaWFsaXplKSB7Ci0JCQkJCWFzc2VydEVxdWFscyhudWxsLCBtZW1lbnRvVG9TZXJpYWxpemUuZ2V0Q2hpbGQodHlwZSkpOwotCQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG9Ub1NlcmlhbGl6ZS5jcmVhdGVDaGlsZCh0eXBlLCBpZCk7Ci0JCQkJCWFzc2VydEVxdWFscyhpZCwgY2hpbGQuZ2V0SUQoKSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgY2hlY2tBZnRlckRlc2VyaWFsaXphdGlvbigKLQkJCQkJCVhNTE1lbWVudG8gZGVzZXJpYWxpemVkTWVtZW50bykgewotCQkJCQlJTWVtZW50byBjaGlsZCA9IGRlc2VyaWFsaXplZE1lbWVudG8uZ2V0Q2hpbGQodHlwZSk7Ci0JCQkJCWFzc2VydE5vdE51bGwoY2hpbGQpOwotCQkJCQlhc3NlcnRFcXVhbHMoaWQsIGNoaWxkLmdldElEKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFB1dEFuZEdldEZsb2F0KCkgdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlmaW5hbCBTdHJpbmcga2V5ID0gImtleSI7Ci0KLQkJZmluYWwgRmxvYXRbXSB2YWx1ZXMgPSBuZXcgRmxvYXRbXSB7IG5ldyBGbG9hdCgtMy4xNDE1KSwgbmV3IEZsb2F0KDEpLAotCQkJCW5ldyBGbG9hdCgwKSwgbmV3IEZsb2F0KDQ1NTQuNDUyMzUpLAotCQkJCW5ldyBGbG9hdChGbG9hdC5NQVhfVkFMVUUpLCBuZXcgRmxvYXQoRmxvYXQuTUlOX1ZBTFVFKSwKLQkJCQluZXcgRmxvYXQoRmxvYXQuTmFOKSwgbmV3IEZsb2F0KEZsb2F0LlBPU0lUSVZFX0lORklOSVRZKSwKLQkJCQluZXcgRmxvYXQoRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkpIH07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIEZsb2F0IHZhbHVlID0gdmFsdWVzW2ldOwotCQkJdGVzdFB1dEFuZEdldChuZXcgTWVtZW50b0NoZWNrZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBwcmVwYXJlQW5kQ2hlY2tCZWZvcmVTZXJpYWxpemF0aW9uKAotCQkJCQkJWE1MTWVtZW50byBtZW1lbnRvVG9TZXJpYWxpemUpIHsKLQkJCQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1lbWVudG9Ub1NlcmlhbGl6ZS5nZXRGbG9hdChrZXkpKTsKLQkJCQkJbWVtZW50b1RvU2VyaWFsaXplLnB1dEZsb2F0KGtleSwgdmFsdWUuZmxvYXRWYWx1ZSgpKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKHZhbHVlLCBtZW1lbnRvVG9TZXJpYWxpemUuZ2V0RmxvYXQoa2V5KSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgY2hlY2tBZnRlckRlc2VyaWFsaXphdGlvbigKLQkJCQkJCVhNTE1lbWVudG8gZGVzZXJpYWxpemVkTWVtZW50bykgewotCQkJCQlhc3NlcnRFcXVhbHModmFsdWUsIGRlc2VyaWFsaXplZE1lbWVudG8uZ2V0RmxvYXQoa2V5KSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHV0QW5kR2V0SW50ZWdlcigpIHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIGtleSA9ICJrZXkiOwotCi0JCUludGVnZXJbXSB2YWx1ZXMgPSBuZXcgSW50ZWdlcltdIHsgbmV3IEludGVnZXIoMzYyNTQpLCBuZXcgSW50ZWdlcigwKSwKLQkJCQluZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoLTM2MjU0KSwKLQkJCQluZXcgSW50ZWdlcihJbnRlZ2VyLk1BWF9WQUxVRSksIG5ldyBJbnRlZ2VyKEludGVnZXIuTUlOX1ZBTFVFKSB9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBJbnRlZ2VyIHZhbHVlID0gdmFsdWVzW2ldOwotCi0JCQl0ZXN0UHV0QW5kR2V0KG5ldyBNZW1lbnRvQ2hlY2tlcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHByZXBhcmVBbmRDaGVja0JlZm9yZVNlcmlhbGl6YXRpb24oCi0JCQkJCQlYTUxNZW1lbnRvIG1lbWVudG9Ub1NlcmlhbGl6ZSkgewotCQkJCQlhc3NlcnRFcXVhbHMobnVsbCwgbWVtZW50b1RvU2VyaWFsaXplLmdldEludGVnZXIoa2V5KSk7Ci0JCQkJCW1lbWVudG9Ub1NlcmlhbGl6ZS5wdXRJbnRlZ2VyKGtleSwgdmFsdWUuaW50VmFsdWUoKSk7Ci0JCQkJCWFzc2VydEVxdWFscyh2YWx1ZSwgbWVtZW50b1RvU2VyaWFsaXplLmdldEludGVnZXIoa2V5KSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgY2hlY2tBZnRlckRlc2VyaWFsaXphdGlvbigKLQkJCQkJCVhNTE1lbWVudG8gZGVzZXJpYWxpemVkTWVtZW50bykgewotCQkJCQlhc3NlcnRFcXVhbHModmFsdWUsIGRlc2VyaWFsaXplZE1lbWVudG8uZ2V0SW50ZWdlcihrZXkpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFB1dE1lbWVudG8oKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXRlc3RQdXRBbmRHZXQobmV3IE1lbWVudG9DaGVja2VyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBwcmVwYXJlQW5kQ2hlY2tCZWZvcmVTZXJpYWxpemF0aW9uKAotCQkJCQlYTUxNZW1lbnRvIG1lbWVudG9Ub1NlcmlhbGl6ZSkgewotCQkJCW1lbWVudG9Ub1NlcmlhbGl6ZS5wdXRUZXh0RGF0YSgidW5jaGFuZ2VkIHRleHQgZGF0YSIpOwotCQkJCW1lbWVudG9Ub1NlcmlhbGl6ZS5wdXRTdHJpbmcoIm5ldmVybG9zdCIsICJyZXRhaW5lZCB2YWx1ZSIpOwotCi0JCQkJSU1lbWVudG8gYU1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgiZm9vIik7Ci0JCQkJZmlsbE1lbWVudG8oYU1lbWVudG8pOwotCi0JCQkJLy8gbm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgY29weSB0aGUgdGV4dCBkYXRhOgotCQkJCW1lbWVudG9Ub1NlcmlhbGl6ZS5wdXRNZW1lbnRvKGFNZW1lbnRvKTsKLQotCQkJCS8vIGRvIG5vdCBjaGVjayBmb3IgdGV4dCBkYXRhOgotCQkJCWNoZWNrTWVtZW50byhtZW1lbnRvVG9TZXJpYWxpemUsIGZhbHNlKTsKLQotCQkJCWFzc2VydEVxdWFscygidW5jaGFuZ2VkIHRleHQgZGF0YSIsIG1lbWVudG9Ub1NlcmlhbGl6ZQotCQkJCQkJLmdldFRleHREYXRhKCkpOwotCQkJCWFzc2VydEVxdWFscygicmV0YWluZWQgdmFsdWUiLCBtZW1lbnRvVG9TZXJpYWxpemUKLQkJCQkJCS5nZXRTdHJpbmcoIm5ldmVybG9zdCIpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY2hlY2tBZnRlckRlc2VyaWFsaXphdGlvbihYTUxNZW1lbnRvIGRlc2VyaWFsaXplZE1lbWVudG8pIHsKLQkJCQkvLyBkbyBub3QgY2hlY2sgZm9yIHRleHQgZGF0YToKLQkJCQljaGVja01lbWVudG8oZGVzZXJpYWxpemVkTWVtZW50bywgZmFsc2UpOwotCi0JCQkJYXNzZXJ0RXF1YWxzKCJ1bmNoYW5nZWQgdGV4dCBkYXRhIiwgZGVzZXJpYWxpemVkTWVtZW50bwotCQkJCQkJLmdldFRleHREYXRhKCkpOwotCQkJCWFzc2VydEVxdWFscygicmV0YWluZWQgdmFsdWUiLCBkZXNlcmlhbGl6ZWRNZW1lbnRvCi0JCQkJCQkuZ2V0U3RyaW5nKCJuZXZlcmxvc3QiKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQdXRBbmRHZXRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBrZXkgPSAia2V5IjsKLQotCQkvLyB2YWx1ZXMgd2l0aCBuZXdsaW5lLCB0YWIsIG9yIHJldHVybiBjaGFyYWN0ZXJzIGxlYWQgdG8gYnVnIDkzNzIwLgotCQlTdHJpbmdbXSB2YWx1ZXMgPSBURVNUX1NUUklOR1M7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIFN0cmluZyB2YWx1ZSA9IHZhbHVlc1tpXTsKLQotCQkJdGVzdFB1dEFuZEdldChuZXcgTWVtZW50b0NoZWNrZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBwcmVwYXJlQW5kQ2hlY2tCZWZvcmVTZXJpYWxpemF0aW9uKAotCQkJCQkJWE1MTWVtZW50byBtZW1lbnRvVG9TZXJpYWxpemUpIHsKLQkJCQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1lbWVudG9Ub1NlcmlhbGl6ZS5nZXRTdHJpbmcoa2V5KSk7Ci0JCQkJCVN0cmluZyBoZWxwZXIgPSB2YWx1ZTsKLQkJCQkJbWVtZW50b1RvU2VyaWFsaXplLnB1dFN0cmluZyhrZXksIHZhbHVlKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKHZhbHVlLCBtZW1lbnRvVG9TZXJpYWxpemUuZ2V0U3RyaW5nKGtleSkpOwotCQkJCQloZWxwZXIudG9TdHJpbmcoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBjaGVja0FmdGVyRGVzZXJpYWxpemF0aW9uKAotCQkJCQkJWE1MTWVtZW50byBkZXNlcmlhbGl6ZWRNZW1lbnRvKSB7Ci0JCQkJCWFzc2VydEVxdWFscyh2YWx1ZSwgZGVzZXJpYWxpemVkTWVtZW50by5nZXRTdHJpbmcoa2V5KSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHV0QW5kR2V0VGV4dERhdGEoKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IFRFU1RfU1RSSU5HUzsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgU3RyaW5nIGRhdGEgPSB2YWx1ZXNbaV07Ci0JCQl0ZXN0UHV0QW5kR2V0KG5ldyBNZW1lbnRvQ2hlY2tlcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHByZXBhcmVBbmRDaGVja0JlZm9yZVNlcmlhbGl6YXRpb24oCi0JCQkJCQlYTUxNZW1lbnRvIG1lbWVudG9Ub1NlcmlhbGl6ZSkgewotCQkJCQlhc3NlcnRFcXVhbHMobnVsbCwgbWVtZW50b1RvU2VyaWFsaXplLmdldFRleHREYXRhKCkpOwotCQkJCQltZW1lbnRvVG9TZXJpYWxpemUucHV0VGV4dERhdGEoZGF0YSk7Ci0JCQkJCWFzc2VydEVxdWFscyhkYXRhLCBtZW1lbnRvVG9TZXJpYWxpemUuZ2V0VGV4dERhdGEoKSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgY2hlY2tBZnRlckRlc2VyaWFsaXphdGlvbigKLQkJCQkJCVhNTE1lbWVudG8gZGVzZXJpYWxpemVkTWVtZW50bykgewotCQkJCQlpZiAoZGF0YS5lcXVhbHMoIiIpKSB7Ci0JCQkJCQkvLyB0aGlzIGNvbWVzIGJhY2sgYXMgbnVsbC4uLgotCQkJCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2VyaWFsaXplZE1lbWVudG8uZ2V0VGV4dERhdGEoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhc3NlcnRFcXVhbHMoZGF0YSwgZGVzZXJpYWxpemVkTWVtZW50by5nZXRUZXh0RGF0YSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExlZ2FsS2V5cygpIHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gbGVnYWxLZXlzID0geyAidmFsdWUiLCAidmFsdWUud2l0aC5tYW55LmRvdHMiLAotCQkJCSJ2YWx1ZV93aXRoX3VuZGVyc2NvcmVzIiB9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVnYWxLZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBTdHJpbmcga2V5ID0gbGVnYWxLZXlzW2ldOwotCQkJdGVzdFB1dEFuZEdldChuZXcgTWVtZW50b0NoZWNrZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBwcmVwYXJlQW5kQ2hlY2tCZWZvcmVTZXJpYWxpemF0aW9uKAotCQkJCQkJWE1MTWVtZW50byBtZW1lbnRvVG9TZXJpYWxpemUpIHsKLQkJCQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1lbWVudG9Ub1NlcmlhbGl6ZS5nZXRTdHJpbmcoa2V5KSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltZW1lbnRvVG9TZXJpYWxpemUucHV0U3RyaW5nKGtleSwgInNvbWUgc3RyaW5nIik7Ci0JCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigib2ZmZW5kaW5nIGtleTogJyIgKyBrZXkgKyAiJyIpOwotCQkJCQkJdGhyb3cgZXg7Ci0JCQkJCX0KLQkJCQkJYXNzZXJ0RXF1YWxzKCJzb21lIHN0cmluZyIsIG1lbWVudG9Ub1NlcmlhbGl6ZQotCQkJCQkJCS5nZXRTdHJpbmcoa2V5KSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgY2hlY2tBZnRlckRlc2VyaWFsaXphdGlvbigKLQkJCQkJCVhNTE1lbWVudG8gZGVzZXJpYWxpemVkTWVtZW50bykgewotCQkJCQlhc3NlcnRFcXVhbHMoInNvbWUgc3RyaW5nIiwgZGVzZXJpYWxpemVkTWVtZW50bwotCQkJCQkJCS5nZXRTdHJpbmcoa2V5KSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsS2V5cygpIHsKLQkJU3RyaW5nW10gaWxsZWdhbEtleXMgPSB7ICIiLCAiICIsICIga2V5IiwgImtleSAiLCAia2V5IGtleSIsICJcdCIsCi0JCQkJIlx0a2V5IiwgImtleVx0IiwgImtleVx0a2V5IiwgIlxuIiwgIlxua2V5IiwgImtleVxuIiwKLQkJCQkia2V5XG5rZXkiLCAia2V5PHdpdGg8bGVzc3RoYW4iLCAia2V5PndpdGg+Z3JlYXRlcnRoYW4iLAotCQkJCSJrZXkmd2l0aCZhbXBlcnNhbmQiLCAia2V5I3dpdGgjaGFzaCIsICJrZXlcIndpdGhcInF1b3RlIiwgIlwiIiB9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWxsZWdhbEtleXMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIFN0cmluZyBrZXkgPSBpbGxlZ2FsS2V5c1tpXTsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJmb28iKTsKLQkJCXRyeSB7Ci0JCQkJbWVtZW50by5wdXRTdHJpbmcoa2V5LCAic29tZSBzdHJpbmciKTsKLQkJCQlmYWlsKCJwdXRTdHJpbmcgd2l0aCBpbGxlZ2FsIGtleSBzaG91bGQgZmFpbCIpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gZXhwZWN0ZWQKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQdXRUZXh0RGF0YVdpdGhDaGlsZHJlbkJ1ZzkzNzE4KCkKLQkJCXRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIHRleHREYXRhID0gIlxuXHRUaGlzIGlzXG50ZXh0IGRhdGFcblx0XHR3aXRoIG5ld2xpbmVzIGFuZCBcdHRhYnNcdFxuXHQgIjsKLQkJdGVzdFB1dEFuZEdldChuZXcgTWVtZW50b0NoZWNrZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHByZXBhcmVBbmRDaGVja0JlZm9yZVNlcmlhbGl6YXRpb24oCi0JCQkJCVhNTE1lbWVudG8gbWVtZW50b1RvU2VyaWFsaXplKSB7Ci0JCQkJbWVtZW50b1RvU2VyaWFsaXplLmNyZWF0ZUNoaWxkKCJ0eXBlIiwgImlkIik7Ci0JCQkJbWVtZW50b1RvU2VyaWFsaXplLnB1dFRleHREYXRhKHRleHREYXRhKTsKLQkJCQltZW1lbnRvVG9TZXJpYWxpemUuY3JlYXRlQ2hpbGQoInR5cGUiLCAiaWQiKTsKLQkJCQltZW1lbnRvVG9TZXJpYWxpemUuY3JlYXRlQ2hpbGQoInR5cGUiLCAiaWQiKTsKLQkJCQlhc3NlcnRFcXVhbHModGV4dERhdGEsIG1lbWVudG9Ub1NlcmlhbGl6ZS5nZXRUZXh0RGF0YSgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY2hlY2tBZnRlckRlc2VyaWFsaXphdGlvbihYTUxNZW1lbnRvIGRlc2VyaWFsaXplZE1lbWVudG8pIHsKLQkJCQlhc3NlcnRFcXVhbHModGV4dERhdGEsIGRlc2VyaWFsaXplZE1lbWVudG8uZ2V0VGV4dERhdGEoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludGVyZmFjZSBNZW1lbnRvQ2hlY2tlciB7Ci0JCXZvaWQgcHJlcGFyZUFuZENoZWNrQmVmb3JlU2VyaWFsaXphdGlvbihYTUxNZW1lbnRvIG1lbWVudG9Ub1NlcmlhbGl6ZSk7Ci0KLQkJdm9pZCBjaGVja0FmdGVyRGVzZXJpYWxpemF0aW9uKFhNTE1lbWVudG8gZGVzZXJpYWxpemVkTWVtZW50byk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RQdXRBbmRHZXQoTWVtZW50b0NoZWNrZXIgbWVtZW50b0NoZWNrZXIpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24sIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0JCVhNTE1lbWVudG8gbWVtZW50b1RvU2VyaWFsaXplID0gWE1MTWVtZW50bwotCQkJCS5jcmVhdGVXcml0ZVJvb3QoIlhNTE1lbWVudG9UZXN0Iik7Ci0KLQkJbWVtZW50b0NoZWNrZXIucHJlcGFyZUFuZENoZWNrQmVmb3JlU2VyaWFsaXphdGlvbihtZW1lbnRvVG9TZXJpYWxpemUpOwotCi0JCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCW1lbWVudG9Ub1NlcmlhbGl6ZS5zYXZlKHdyaXRlcik7Ci0JCXdyaXRlci5jbG9zZSgpOwotCi0JCVN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHdyaXRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpKTsKLQkJWE1MTWVtZW50byBkZXNlcmlhbGl6ZWRNZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVSZWFkUm9vdChyZWFkZXIpOwotCi0JCW1lbWVudG9DaGVja2VyLmNoZWNrQWZ0ZXJEZXNlcmlhbGl6YXRpb24oZGVzZXJpYWxpemVkTWVtZW50byk7Ci0JfQotCQotCSAgIHB1YmxpYyB2b2lkIHRlc3RNZW1lbnRvV2l0aFRleHRDb250ZW50MTEzNjU5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICAgICAgICBJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoInJvb3QiKTsKLQkgICAgICAgIElNZW1lbnRvIG1lbWVudG9XaXRoQ2hpbGQgPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgicm9vdCIpOwotCSAgICAgICAgSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvV2l0aENoaWxkLmNyZWF0ZUNoaWxkKCJjaGlsZCIpOwotCSAgICAgICAgY2hpbGQucHV0VGV4dERhdGEoInRleHQiKTsKLQkgICAgICAgIG1lbWVudG8ucHV0TWVtZW50byhtZW1lbnRvV2l0aENoaWxkKTsKLQkgICAgICAgIElNZW1lbnRvIGNvcGllZENoaWxkID0gbWVtZW50by5nZXRDaGlsZCgiY2hpbGQiKTsKLQkgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIGNvcGllZENoaWxkLmdldFRleHREYXRhKCkpOwotCSAgICB9Ci0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L0N1c3RvbVRpdGxlVmlldy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9DdXN0b21UaXRsZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTgxYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L0N1c3RvbVRpdGxlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0OwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbVRpdGxlVmlldyBleHRlbmRzIEVtcHR5VmlldyB7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgQ3VzdG9tVGl0bGVWaWV3KCkgewotICAgICAgICBzdXBlcigpOwotCi0gICAgICAgIHNldFRpdGxlKCJDdXN0b20gdGl0bGUiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvRWRpdG9yV2l0aENyZWF0ZUNvbnRyb2xzRXhjZXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L0VkaXRvcldpdGhDcmVhdGVDb250cm9sc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2QyZjljLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvRWRpdG9yV2l0aENyZWF0ZUNvbnRyb2xzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OwotCi1wdWJsaWMgY2xhc3MgRWRpdG9yV2l0aENyZWF0ZUNvbnRyb2xzRXhjZXB0aW9uIGV4dGVuZHMgRWRpdG9yUGFydCB7Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotICAgICAgICAgICAgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSkKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbigiSW52YWxpZCBJbnB1dDogTXVzdCBiZSBJRmlsZUVkaXRvcklucHV0Iik7Ci0gICAgICAgIHNldFNpdGUoc2l0ZSk7Ci0gICAgICAgIHNldElucHV0KGlucHV0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCB0ZXN0TGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIAotICAgICAgICB0ZXN0TGFiZWwuc2V0VGV4dCgiSWYgeW91IGNhbiByZWFkIHRoaXMsIHdpZGdldHMgYXJlIG5vdCBiZWluZyBkaXNwb3NlZCBwcm9wZXJseSB3aGVuIGVycm9ycyBvY2N1ciBpbiBjcmVhdGVQYXJ0Q29udHJvbCIpOwotICAgICAgICAKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24gaW50ZW50aW9uYWxseSBhcyBwYXJ0IG9mIGFuIGVycm9yIGhhbmRsaW5nIHRlc3QiKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L0VkaXRvcldpdGhEaXNwb3NlRXhjZXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L0VkaXRvcldpdGhEaXNwb3NlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMDY5ZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9FZGl0b3JXaXRoRGlzcG9zZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0b3JXaXRoRGlzcG9zZUV4Y2VwdGlvbiBleHRlbmRzIEVkaXRvclBhcnQgewotCi0gICAgcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotICAgICAgICAgICAgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIGlmICghKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgSUZpbGVFZGl0b3JJbnB1dCIpOwotICAgICAgICBzZXRTaXRlKHNpdGUpOwotICAgICAgICBzZXRJbnB1dChpbnB1dCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgcGFyZW50LnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLSAgICAgICAgCi0gICAgICAgIExhYmVsIHRlc3RMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgCi0gICAgICAgIHRlc3RMYWJlbC5zZXRUZXh0KCJUaGlzIGVkaXRvciBpcyBzdXBwb3NlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBjbG9zZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBleGNlcHRpb24gd2FzIHRocm93biBpbnRlbnRpb25hbGx5IGFzIHBhcnQgb2YgYW4gZXJyb3IgaGFuZGxpbmcgdGVzdCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9FZGl0b3JXaXRoSW5pdEV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9FZGl0b3JXaXRoSW5pdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNmNzk0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvRWRpdG9yV2l0aEluaXRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydDsKLQotcHVibGljIGNsYXNzIEVkaXRvcldpdGhJbml0RXhjZXB0aW9uIGV4dGVuZHMgRWRpdG9yUGFydCB7Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotICAgICAgICAgICAgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIHRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbigiVGhpcyBleGNlcHRpb24gd2FzIHRocm93biBpbnRlbnRpb25hbGx5IGFzIHBhcnQgb2YgYW4gZXJyb3IgaGFuZGxpbmcgdGVzdCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgcGFyZW50LnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLSAgICAgICAgCi0gICAgICAgIExhYmVsIG1lc3NhZ2UgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIG1lc3NhZ2Uuc2V0VGV4dCgiVGhpcyBlZGl0b3IgdGhyZXcgYW4gZXhjZXB0aW9uIG9uIGluaXQuIFlvdSBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCB0aGlzIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvRWRpdG9yV2l0aEluaXRSdW50aW1lRXhjZXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L0VkaXRvcldpdGhJbml0UnVudGltZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDcxZjRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvRWRpdG9yV2l0aEluaXRSdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0b3JXaXRoSW5pdFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBFZGl0b3JQYXJ0IHsKLQotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0gICAgICAgICAgICB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24gaW50ZW50aW9uYWxseSBhcyBwYXJ0IG9mIGFuIGVycm9yIGhhbmRsaW5nIHRlc3QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgICAgIAotICAgICAgICBMYWJlbCBtZXNzYWdlID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBtZXNzYWdlLnNldFRleHQoIlRoaXMgZWRpdG9yIHRocmV3IGFuIGV4Y2VwdGlvbiBvbiBpbml0LiBZb3Ugc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhpcyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L0VkaXRvcldpdGhJbnB1dEV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9FZGl0b3JXaXRoSW5wdXRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkNWQyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L0VkaXRvcldpdGhJbnB1dEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydDsKLQotcHVibGljIGNsYXNzIEVkaXRvcldpdGhJbnB1dEV4Y2VwdGlvbiBleHRlbmRzIEVkaXRvclBhcnQgewotCi0gICAgcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkKLSAgICAgICAgICAgIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgSUZpbGVFZGl0b3JJbnB1dCIpOwotICAgICAgICBzZXRTaXRlKHNpdGUpOwotICAgICAgICBzZXRJbnB1dChpbnB1dCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUVkaXRvcklucHV0IGdldEVkaXRvcklucHV0KCkgewotICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhjZXB0aW9uID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyBleGNlcHRpb24gd2FzIHRocm93biBpbnRlbnRpb25hbGx5IGFzIHBhcnQgb2YgYW4gZXJyb3IgaGFuZGxpbmcgdGVzdCIpOwotICAgICAgICB0aHJvdyBleGNlcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCB0ZXN0TGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIAotICAgICAgICB0ZXN0TGFiZWwuc2V0VGV4dCgiVGhpcyB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGdldEVkaXRvcklucHV0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvRW1wdHlWaWV3LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L0VtcHR5Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2QzYTE2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvRW1wdHlWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbXB0eVZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgRW1wdHlWaWV3KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Q29udGVudERlc2NyaXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICBzdXBlci5zZXRDb250ZW50RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRQYXJ0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcnROYW1lKFN0cmluZyBwYXJ0TmFtZSkgewotICAgICAgICBzdXBlci5zZXRQYXJ0TmFtZShwYXJ0TmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldFRpdGxlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFRpdGxlKHRpdGxlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L0hlYXZ5UmVzb3VyY2VWaWV3LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L0hlYXZ5UmVzb3VyY2VWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZmE1NjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9IZWF2eVJlc291cmNlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBIZWF2eVJlc291cmNlVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQotICAgIHByaXZhdGUgQnV0dG9uIHVzZUFsbENvbXBvc2l0ZXM7Ci0gICAgcHJpdmF0ZSBCdXR0b24gcmVsZWFzZUFsbENvbXBvc2l0ZXM7Ci0gICAgCi0gICAgcHJpdmF0ZSBTaGVsbCB0ZW1wU2hlbGw7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgY29udHJvbDsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGNvbnRyb2wgPSBwYXJlbnQ7Ci0gICAgICAgIAotICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZS53aWRnZXQgPT0gdXNlQWxsQ29tcG9zaXRlcykgewotICAgICAgICAgICAgICAgICAgICB1c2VBbGwoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHJlbGVhc2VBbGxDb21wb3NpdGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VBbGwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIExhYmVsIGV4cGxhbmF0aW9uID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotICAgICAgICBleHBsYW5hdGlvbi5zZXRUZXh0KCJUaGlzIHZpZXcgYWxsb2NhdGVzIGFsbCBhdmFpbGFibGUgU1dUIHJlc291cmNlcyBvbiBkZW1hbmQuICIgCi0gICAgICAgICAgICAgICAgKyAiVGhpcyBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgYSByZWNvdmVyYWJsZSBlcnJvciwgYW5kIGlzIGV4cGVjdGVkIHRvIGNyYXNoIHRoZSB3b3JrYmVuY2guICIKLSAgICAgICAgICAgICAgICArICJUaGlzIHZpZXcgYWxsb3dzIHVzIG9ic2VydmUgdGhlIHdvcmtiZW5jaCB3aGVuIGl0IGNyYXNoZXMgaW4gdGhpcyBtYW5uZXIuIik7Ci0gICAgICAgIAotICAgICAgICB1c2VBbGxDb21wb3NpdGVzID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgdXNlQWxsQ29tcG9zaXRlcy5zZXRUZXh0KCImQWxsb2NhdGUgYWxsIGF2YWlsYWJsZSBjb21wb3NpdGVzICh2ZXJ5IHNsb3chKSIpOwotICAgICAgICB1c2VBbGxDb21wb3NpdGVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgCi0gICAgICAgIHJlbGVhc2VBbGxDb21wb3NpdGVzID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgcmVsZWFzZUFsbENvbXBvc2l0ZXMuc2V0VGV4dCgiJlJlbGVhc2UgYWxsIGNvbXBvc2l0ZXMiKTsKLSAgICAgICAgcmVsZWFzZUFsbENvbXBvc2l0ZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgY29udHJvbC5zZXRGb2N1cygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB1c2VBbGwoKSB7Ci0gICAgICAgIHJlbGVhc2VBbGwoKTsKLSAgICAgICAgdGVtcFNoZWxsID0gbmV3IFNoZWxsKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBTV1QuTk9ORSk7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IoOzspIHsKLSAgICAgICAgICAgICAgICBDb21wb3NpdGUgbmV4dCA9IG5ldyBDb21wb3NpdGUodGVtcFNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU1dURXJyb3IgZSkgewotICAgICAgICAgICAgVGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKFdvcmtiZW5jaFBsdWdpbi5nZXRTdGF0dXMoZSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VBbGwoKSB7Ci0gICAgICAgIGlmICh0ZW1wU2hlbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgdGVtcFNoZWxsLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHRlbXBTaGVsbCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgcmVsZWFzZUFsbCgpOwotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L092ZXJyaWRkZW5UaXRsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvT3ZlcnJpZGRlblRpdGxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGM4ODViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvT3ZlcnJpZGRlblRpdGxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgT3ZlcnJpZGRlblRpdGxlVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBPdmVycmlkZGVuVGl0bGVUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotICAgIFdvcmtiZW5jaFBhZ2UgcGFnZTsKLQotICAgIE92ZXJyaWRkZW5UaXRsZVZpZXcgdmlldzsKLQotICAgIGJvb2xlYW4gdGl0bGVDaGFuZ2VFdmVudCA9IGZhbHNlOwotCi0gICAgYm9vbGVhbiBuYW1lQ2hhbmdlRXZlbnQgPSBmYWxzZTsKLQotICAgIGJvb2xlYW4gY29udGVudENoYW5nZUV2ZW50ID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIElQcm9wZXJ0eUxpc3RlbmVyIHByb3BlcnR5TGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZWQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAocHJvcElkKSB7Ci0gICAgICAgICAgICBjYXNlIElXb3JrYmVuY2hQYXJ0Q29uc3RhbnRzLlBST1BfVElUTEU6Ci0gICAgICAgICAgICAgICAgdGl0bGVDaGFuZ2VFdmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElXb3JrYmVuY2hQYXJ0Q29uc3RhbnRzLlBST1BfUEFSVF9OQU1FOgotICAgICAgICAgICAgICAgIG5hbWVDaGFuZ2VFdmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElXb3JrYmVuY2hQYXJ0Q29uc3RhbnRzLlBST1BfQ09OVEVOVF9ERVNDUklQVElPTjoKLSAgICAgICAgICAgICAgICBjb250ZW50Q2hhbmdlRXZlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICB3aW5kb3cgPSAoV29ya2JlbmNoV2luZG93KSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIHZpZXcgPSAoT3ZlcnJpZGRlblRpdGxlVmlldykgcGFnZQotICAgICAgICAgICAgICAgIC5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudGVzdHMud29ya2JlbmNocGFydC5PdmVycmlkZGVuVGl0bGVWaWV3Iik7Ci0gICAgICAgIHZpZXcuYWRkUHJvcGVydHlMaXN0ZW5lcihwcm9wZXJ0eUxpc3RlbmVyKTsKLSAgICAgICAgdGl0bGVDaGFuZ2VFdmVudCA9IGZhbHNlOwotICAgICAgICBuYW1lQ2hhbmdlRXZlbnQgPSBmYWxzZTsKLSAgICAgICAgY29udGVudENoYW5nZUV2ZW50ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC5VSVRlc3RDYXNlI2RvVGVhckRvd24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdmlldy5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHByb3BlcnR5TGlzdGVuZXIpOwotICAgICAgICBwYWdlLmhpZGVWaWV3KHZpZXcpOwotICAgICAgICBzdXBlci5kb1RlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlTZXR0aW5ncyhJV29ya2JlbmNoUGFydDIgcGFydCwKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFRpdGxlLCBTdHJpbmcgZXhwZWN0ZWRQYXJ0TmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZENvbnRlbnREZXNjcmlwdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkluY29ycmVjdCB2aWV3IHRpdGxlIiwgZXhwZWN0ZWRUaXRsZSwgcGFydAotICAgICAgICAgICAgICAgIC5nZXRUaXRsZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IHBhcnQgbmFtZSIsIGV4cGVjdGVkUGFydE5hbWUsIHBhcnQKLSAgICAgICAgICAgICAgICAuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkluY29ycmVjdCBjb250ZW50IGRlc2NyaXB0aW9uIiwKLSAgICAgICAgICAgICAgICBleHBlY3RlZENvbnRlbnREZXNjcmlwdGlvbiwgcGFydC5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVNldHRpbmdzKFN0cmluZyBleHBlY3RlZFRpdGxlLCBTdHJpbmcgZXhwZWN0ZWRQYXJ0TmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZENvbnRlbnREZXNjcmlwdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeVNldHRpbmdzKHZpZXcsIGV4cGVjdGVkVGl0bGUsIGV4cGVjdGVkUGFydE5hbWUsCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWRDb250ZW50RGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IHdlJ3ZlIHJlY2VpdmVkIHRoZSBnaXZlbiBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgdGVzdAotICAgICAqIAotICAgICAqIEBwYXJhbSB0aXRsZUV2ZW50IFBST1BfVElUTEUKLSAgICAgKiBAcGFyYW0gbmFtZUV2ZW50IFBST1BfUEFSVF9OQU1FCi0gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uRXZlbnQgUFJPUF9DT05URU5UX0RFU0NSSVBUSU9OCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50cyhib29sZWFuIHRpdGxlRXZlbnQsIGJvb2xlYW4gbmFtZUV2ZW50LAotICAgICAgICAgICAgYm9vbGVhbiBkZXNjcmlwdGlvbkV2ZW50KSB7Ci0gICAgICAgIGlmICh0aXRsZUV2ZW50KSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJNaXNzaW5nIHRpdGxlIGNoYW5nZSBldmVudCIsIHRpdGxlRXZlbnQsCi0gICAgICAgICAgICAgICAgICAgIHRpdGxlQ2hhbmdlRXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lRXZlbnQpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk1pc3NpbmcgbmFtZSBjaGFuZ2UgZXZlbnQiLCBuYW1lRXZlbnQsCi0gICAgICAgICAgICAgICAgICAgIG5hbWVDaGFuZ2VFdmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uRXZlbnQpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk1pc3NpbmcgY29udGVudCBkZXNjcmlwdGlvbiBldmVudCIsCi0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uRXZlbnQsIGNvbnRlbnRDaGFuZ2VFdmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdmVyaWZ5U2V0dGluZ3MoIk92ZXJyaWRkZW5UaXRsZSIsICJPdmVycmlkZGVuVGl0bGVWaWV3IiwKLSAgICAgICAgICAgICAgICAiT3ZlcnJpZGRlblRpdGxlIik7Ci0gICAgICAgIHZlcmlmeUV2ZW50cyhmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tTmFtZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB2aWV3LnNldFBhcnROYW1lKCJDdXN0b21QYXJ0TmFtZSIpOwotICAgICAgICB2ZXJpZnlTZXR0aW5ncygiT3ZlcnJpZGRlblRpdGxlIiwgIkN1c3RvbVBhcnROYW1lIiwgIk92ZXJyaWRkZW5UaXRsZSIpOwotICAgICAgICB2ZXJpZnlFdmVudHMoZmFsc2UsIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlDb250ZW50RGVzY3JpcHRpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdmlldy5zZXRDb250ZW50RGVzY3JpcHRpb24oIiIpOwotICAgICAgICB2ZXJpZnlTZXR0aW5ncygiT3ZlcnJpZGRlblRpdGxlIiwgIk92ZXJyaWRkZW5UaXRsZVZpZXciLCAiIik7Ci0gICAgICAgIHZlcmlmeUV2ZW50cyhmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21UaXRsZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB2aWV3LmN1c3RvbVNldFRpdGxlKCJDdXN0b21UaXRsZSIpOwotICAgICAgICB2ZXJpZnlTZXR0aW5ncygiQ3VzdG9tVGl0bGUiLCAiT3ZlcnJpZGRlblRpdGxlVmlldyIsICJDdXN0b21UaXRsZSIpOwotICAgICAgICB2ZXJpZnlFdmVudHModHJ1ZSwgZmFsc2UsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21Db250ZW50RGVzY3JpcHRpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdmlldy5zZXRDb250ZW50RGVzY3JpcHRpb24oIkN1c3RvbUNvbnRlbnREZXNjcmlwdGlvbiIpOwotICAgICAgICB2ZXJpZnlTZXR0aW5ncygiT3ZlcnJpZGRlblRpdGxlIiwgIk92ZXJyaWRkZW5UaXRsZVZpZXciLAotICAgICAgICAgICAgICAgICJDdXN0b21Db250ZW50RGVzY3JpcHRpb24iKTsKLSAgICAgICAgdmVyaWZ5RXZlbnRzKGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbU5hbWVBbmRDb250ZW50RGVzY3JpcHRpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdmlldy5zZXRQYXJ0TmFtZSgiQ3VzdG9tTmFtZSIpOwotICAgICAgICB2aWV3LnNldENvbnRlbnREZXNjcmlwdGlvbigiQ3VzdG9tQ29udGVudERlc2NyaXB0aW9uIik7Ci0gICAgICAgIHZlcmlmeVNldHRpbmdzKCJPdmVycmlkZGVuVGl0bGUiLCAiQ3VzdG9tTmFtZSIsCi0gICAgICAgICAgICAgICAgIkN1c3RvbUNvbnRlbnREZXNjcmlwdGlvbiIpOwotICAgICAgICB2ZXJpZnlFdmVudHMoZmFsc2UsIHRydWUsIHRydWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9PdmVycmlkZGVuVGl0bGVWaWV3LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L092ZXJyaWRkZW5UaXRsZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyZjdiZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L092ZXJyaWRkZW5UaXRsZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnV0aWwuVXRpbDsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVycmlkZGVuVGl0bGVWaWV3IGV4dGVuZHMgRW1wdHlWaWV3IHsKLQotICAgIFN0cmluZyBvdmVycmlkZGVuVGl0bGUgPSAiT3ZlcnJpZGRlblRpdGxlIjsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBPdmVycmlkZGVuVGl0bGVWaWV3KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2dldFRpdGxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotICAgICAgICByZXR1cm4gb3ZlcnJpZGRlblRpdGxlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRUaXRsZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGN1c3RvbVNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotICAgICAgICBvdmVycmlkZGVuVGl0bGUgPSBVdGlsLnNhZmVTdHJpbmcodGl0bGUpOwotCi0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShJV29ya2JlbmNoUGFydENvbnN0YW50cy5QUk9QX1RJVExFKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvUmF3SVZpZXdQYXJ0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L1Jhd0lWaWV3UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmY0MGFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvUmF3SVZpZXdQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uRXZlbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSYXdJVmlld1BhcnQgZXh0ZW5kcyBFdmVudE1hbmFnZXIgaW1wbGVtZW50cyBJVmlld1BhcnQgewotCi0gICAgcHJpdmF0ZSBJVmlld1NpdGUgc2l0ZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlID0gIlNvbWVUaXRsZSI7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgUmF3SVZpZXdQYXJ0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCNnZXRWaWV3U2l0ZSgpCi0gICAgICovCi0gICAgcHVibGljIElWaWV3U2l0ZSBnZXRWaWV3U2l0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHNpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIG5ld1RpdGxlKSB7Ci0gICAgICAgIHRpdGxlID0gbmV3VGl0bGU7Ci0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShJV29ya2JlbmNoUGFydENvbnN0YW50cy5QUk9QX1RJVExFKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgc2l0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zaXRlID0gc2l0ZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1NpdGUsIG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUsIElNZW1lbnRvIG1lbWVudG8pIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuc2l0ZSA9IHNpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlyZXMgYSBwcm9wZXJ0eSBjaGFuZ2VkIGV2ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnR5SWQgdGhlIGlkIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoZmluYWwgaW50IHByb3BlcnR5SWQpIHsKLSAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgblggPSAwOyBuWCA8IGFycmF5Lmxlbmd0aDsgblgrKykgewotICAgICAgICAgICAgZmluYWwgSVByb3BlcnR5TGlzdGVuZXIgbCA9IChJUHJvcGVydHlMaXN0ZW5lcikgYXJyYXlbblhdOwotICAgICAgICAgICAgUGxhdGZvcm0ucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBsLnByb3BlcnR5Q2hhbmdlZChSYXdJVmlld1BhcnQudGhpcywgcHJvcGVydHlJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQjc2F2ZVN0YXRlKG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNhZGRQcm9wZXJ0eUxpc3RlbmVyKG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgYWRkTGlzdGVuZXJPYmplY3QobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjZ2V0U2l0ZSgpCi0gICAgICovCi0gICAgcHVibGljIElXb3JrYmVuY2hQYXJ0U2l0ZSBnZXRTaXRlKCkgewotICAgICAgICByZXR1cm4gc2l0ZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNnZXRUaXRsZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRpdGxlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2dldFRpdGxlSW1hZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRUaXRsZUltYWdlKCkgewotICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZSgKLSAgICAgICAgICAgICAgICBJU2hhcmVkSW1hZ2VzLklNR19ERUZfVklFVyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjZ2V0VGl0bGVUb29sVGlwKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlVG9vbFRpcCgpIHsKLSAgICAgICAgcmV0dXJuICJibGFoIjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNyZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbCkgewotICAgICAgICByZW1vdmVMaXN0ZW5lck9iamVjdChsKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvUmF3SVZpZXdQYXJ0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9SYXdJVmlld1BhcnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjE3OTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9SYXdJVmlld1BhcnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFJhd0lWaWV3UGFydFRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUmF3SVZpZXdQYXJ0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIFdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLSAgICBXb3JrYmVuY2hQYWdlIHBhZ2U7Ci0KLSAgICBSYXdJVmlld1BhcnQgdmlldzsKLQotICAgIElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZjsKLQotICAgIGJvb2xlYW4gdGl0bGVDaGFuZ2VFdmVudCA9IGZhbHNlOwotCi0gICAgYm9vbGVhbiBuYW1lQ2hhbmdlRXZlbnQgPSBmYWxzZTsKLQotICAgIGJvb2xlYW4gY29udGVudENoYW5nZUV2ZW50ID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIElQcm9wZXJ0eUxpc3RlbmVyIHByb3BlcnR5TGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZWQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAocHJvcElkKSB7Ci0gICAgICAgICAgICBjYXNlIElXb3JrYmVuY2hQYXJ0Q29uc3RhbnRzLlBST1BfVElUTEU6Ci0gICAgICAgICAgICAgICAgdGl0bGVDaGFuZ2VFdmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElXb3JrYmVuY2hQYXJ0Q29uc3RhbnRzLlBST1BfUEFSVF9OQU1FOgotICAgICAgICAgICAgICAgIG5hbWVDaGFuZ2VFdmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElXb3JrYmVuY2hQYXJ0Q29uc3RhbnRzLlBST1BfQ09OVEVOVF9ERVNDUklQVElPTjoKLSAgICAgICAgICAgICAgICBjb250ZW50Q2hhbmdlRXZlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICB3aW5kb3cgPSAoV29ya2JlbmNoV2luZG93KSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIHZpZXcgPSAoUmF3SVZpZXdQYXJ0KSBwYWdlCi0gICAgICAgICAgICAgICAgLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS50ZXN0cy53b3JrYmVuY2hwYXJ0LlJhd0lWaWV3UGFydCIpOwotICAgICAgICByZWYgPSBwYWdlCi0gICAgICAgICAgICAgICAgLmZpbmRWaWV3UmVmZXJlbmNlKCJvcmcuZWNsaXBzZS51aS50ZXN0cy53b3JrYmVuY2hwYXJ0LlJhd0lWaWV3UGFydCIpOwotICAgICAgICByZWYuYWRkUHJvcGVydHlMaXN0ZW5lcihwcm9wZXJ0eUxpc3RlbmVyKTsKLSAgICAgICAgdGl0bGVDaGFuZ2VFdmVudCA9IGZhbHNlOwotICAgICAgICBuYW1lQ2hhbmdlRXZlbnQgPSBmYWxzZTsKLSAgICAgICAgY29udGVudENoYW5nZUV2ZW50ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC5VSVRlc3RDYXNlI2RvVGVhckRvd24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdmlldy5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHByb3BlcnR5TGlzdGVuZXIpOwotICAgICAgICBwYWdlLmhpZGVWaWV3KHZpZXcpOwotICAgICAgICBzdXBlci5kb1RlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVNldHRpbmdzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFN0cmluZyBleHBlY3RlZFRpdGxlLAotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkUGFydE5hbWUsIFN0cmluZyBleHBlY3RlZENvbnRlbnREZXNjcmlwdGlvbikKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdmlldyB0aXRsZSIsIGV4cGVjdGVkVGl0bGUsIHBhcnQKLSAgICAgICAgICAgICAgICAuZ2V0VGl0bGUoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IHRpdGxlIGluIHZpZXcgcmVmZXJlbmNlIiwgZXhwZWN0ZWRUaXRsZSwKLSAgICAgICAgICAgICAgICByZWYuZ2V0VGl0bGUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwYXJ0IG5hbWUgaW4gdmlldyByZWZlcmVuY2UiLAotICAgICAgICAgICAgICAgIGV4cGVjdGVkUGFydE5hbWUsIHJlZi5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IGNvbnRlbnQgZGVzY3JpcHRpb24gaW4gdmlldyByZWZlcmVuY2UiLAotICAgICAgICAgICAgICAgIGV4cGVjdGVkQ29udGVudERlc2NyaXB0aW9uLCByZWYuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlTZXR0aW5ncyhTdHJpbmcgZXhwZWN0ZWRUaXRsZSwgU3RyaW5nIGV4cGVjdGVkUGFydE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRDb250ZW50RGVzY3JpcHRpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnlTZXR0aW5ncyh2aWV3LCBleHBlY3RlZFRpdGxlLCBleHBlY3RlZFBhcnROYW1lLAotICAgICAgICAgICAgICAgIGV4cGVjdGVkQ29udGVudERlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmUgdGhhdCB3ZSd2ZSByZWNlaXZlZCB0aGUgZ2l2ZW4gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBzaW5jZSB0aGUgc3RhcnQgb2YgdGhlIHRlc3QKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGl0bGVFdmVudCBQUk9QX1RJVExFCi0gICAgICogQHBhcmFtIG5hbWVFdmVudCBQUk9QX1BBUlRfTkFNRQotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbkV2ZW50IFBST1BfQ09OVEVOVF9ERVNDUklQVElPTgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudHMoYm9vbGVhbiB0aXRsZUV2ZW50LCBib29sZWFuIG5hbWVFdmVudCwKLSAgICAgICAgICAgIGJvb2xlYW4gZGVzY3JpcHRpb25FdmVudCkgewotICAgICAgICBpZiAodGl0bGVFdmVudCkgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiTWlzc2luZyB0aXRsZSBjaGFuZ2UgZXZlbnQiLCB0aXRsZUV2ZW50LAotICAgICAgICAgICAgICAgICAgICB0aXRsZUNoYW5nZUV2ZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZUV2ZW50KSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJNaXNzaW5nIG5hbWUgY2hhbmdlIGV2ZW50IiwgbmFtZUV2ZW50LAotICAgICAgICAgICAgICAgICAgICBuYW1lQ2hhbmdlRXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbkV2ZW50KSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJNaXNzaW5nIGNvbnRlbnQgZGVzY3JpcHRpb24gZXZlbnQiLAotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkV2ZW50LCBjb250ZW50Q2hhbmdlRXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHZlcmlmeVNldHRpbmdzKCJTb21lVGl0bGUiLCAiUmF3SVZpZXdQYXJ0IiwgIlNvbWVUaXRsZSIpOwotICAgICAgICB2ZXJpZnlFdmVudHMoZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVRpdGxlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHZpZXcuc2V0VGl0bGUoIkN1c3RvbVRpdGxlIik7Ci0gICAgICAgIHZlcmlmeVNldHRpbmdzKCJDdXN0b21UaXRsZSIsICJSYXdJVmlld1BhcnQiLCAiQ3VzdG9tVGl0bGUiKTsKLSAgICAgICAgdmVyaWZ5RXZlbnRzKHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gaXMgZW1wdHkgd2hlbiB0aGUgdGl0bGUgaXMgdGhlIHNhbWUKLSAgICAgKiBhcyB0aGUgZGVmYXVsdCBwYXJ0IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlDb250ZW50RGVzY3JpcHRpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdmlldy5zZXRUaXRsZSgiUmF3SVZpZXdQYXJ0Iik7Ci0gICAgICAgIHZlcmlmeVNldHRpbmdzKCJSYXdJVmlld1BhcnQiLCAiUmF3SVZpZXdQYXJ0IiwgIiIpOwotICAgICAgICB2ZXJpZnlFdmVudHModHJ1ZSwgZmFsc2UsIHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvVGl0bGVUZXN0RWRpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L1RpdGxlVGVzdEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjU5MDA3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvVGl0bGVUZXN0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubGF5b3V0LkNlbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubGF5b3V0LlJvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVGl0bGVUZXN0RWRpdG9yIGV4dGVuZHMgRWRpdG9yUGFydCB7Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0gICAgVGV4dCB0aXRsZTsKLQotICAgIFRleHQgbmFtZTsKLQotICAgIFRleHQgY29udGVudERlc2NyaXB0aW9uOwotCi0gICAgTGFiZWwgdGl0bGVMYWJlbDsKLQotICAgIExhYmVsIG5hbWVMYWJlbDsKLQotICAgIExhYmVsIGNkTGFiZWw7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgVGl0bGVUZXN0RWRpdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlQXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotICAgICAgICAgICAgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpKQotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBJbnB1dDogTXVzdCBiZSBJRmlsZUVkaXRvcklucHV0Iik7Ci0gICAgICAgIHNldFNpdGUoc2l0ZSk7Ci0gICAgICAgIHNldElucHV0KGlucHV0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzRGlydHkoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIENlbGxMYXlvdXQgbGF5b3V0ID0gbmV3IENlbGxMYXlvdXQoMikuc2V0Q29sdW1uKDAsIFJvdy5maXhlZCgpKQotICAgICAgICAgICAgICAgIC5zZXRDb2x1bW4oMSwgUm93Lmdyb3dpbmcoKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgICAgICBMYWJlbCBmaXJzdExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBmaXJzdExhYmVsLnNldFRleHQoIlRpdGxlIik7Ci0gICAgICAgIHRpdGxlID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICAgICAgdGl0bGUuc2V0VGV4dChnZXRUaXRsZSgpKTsKLQotICAgICAgICB0aXRsZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRUaXRsZSh0aXRsZS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBMYWJlbCBzZWNvbmRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgc2Vjb25kTGFiZWwuc2V0VGV4dCgiTmFtZSIpOwotICAgICAgICBuYW1lID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICAgICAgbmFtZS5zZXRUZXh0KGdldFBhcnROYW1lKCkpOwotICAgICAgICBuYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNldFBhcnROYW1lKG5hbWUuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTGFiZWwgdGhpcmRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgdGhpcmRMYWJlbC5zZXRUZXh0KCJDb250ZW50Iik7Ci0gICAgICAgIGNvbnRlbnREZXNjcmlwdGlvbiA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIGNvbnRlbnREZXNjcmlwdGlvbi5zZXRUZXh0KGdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgY29udGVudERlc2NyaXB0aW9uLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihjb250ZW50RGVzY3JpcHRpb24uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTGFiZWwgdGxMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgdGxMYWJlbC5zZXRUZXh0KCJnZXRUaXRsZSgpID0gIik7Ci0gICAgICAgIHRpdGxlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgTGFiZWwgbm1MYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbm1MYWJlbC5zZXRUZXh0KCJnZXRQYXJ0TmFtZSgpID0gIik7Ci0gICAgICAgIG5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotICAgICAgICBMYWJlbCBkZXNjTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGRlc2NMYWJlbC5zZXRUZXh0KCJnZXRDb250ZW50RGVzY3JpcHRpb24oKSA9ICIpOwotICAgICAgICBjZExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0gICAgICAgIHVwZGF0ZUxhYmVscygpOwotCi0gICAgICAgIGFkZFByb3BlcnR5TGlzdGVuZXIobmV3IElQcm9wZXJ0eUxpc3RlbmVyKCkgewotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZWQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUxhYmVscygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTGFiZWxzKCkgewotICAgICAgICB0aXRsZUxhYmVsLnNldFRleHQoZ2V0VGl0bGUoKSk7Ci0gICAgICAgIG5hbWVMYWJlbC5zZXRUZXh0KGdldFBhcnROYW1lKCkpOwotICAgICAgICBjZExhYmVsLnNldFRleHQoZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgY29tcG9zaXRlLnNldEZvY3VzKCk7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvVGl0bGVUZXN0Vmlldy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9UaXRsZVRlc3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDA4YTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9UaXRsZVRlc3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubGF5b3V0LkNlbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubGF5b3V0LlJvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFRpdGxlVGVzdFZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0gICAgVGV4dCB0aXRsZTsKLQotICAgIFRleHQgbmFtZTsKLQotICAgIFRleHQgY29udGVudERlc2NyaXB0aW9uOwotCi0gICAgTGFiZWwgdGl0bGVMYWJlbDsKLQotICAgIExhYmVsIG5hbWVMYWJlbDsKLQotICAgIExhYmVsIGNkTGFiZWw7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBDZWxsTGF5b3V0IGxheW91dCA9IG5ldyBDZWxsTGF5b3V0KDIpLnNldENvbHVtbigwLCBSb3cuZml4ZWQoKSkKLSAgICAgICAgICAgICAgICAuc2V0Q29sdW1uKDEsIFJvdy5ncm93aW5nKCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICAgICAgTGFiZWwgZmlyc3RMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgZmlyc3RMYWJlbC5zZXRUZXh0KCJUaXRsZSIpOwotICAgICAgICB0aXRsZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIHRpdGxlLnNldFRleHQoZ2V0VGl0bGUoKSk7Ci0KLSAgICAgICAgdGl0bGUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0VGl0bGUodGl0bGUuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTGFiZWwgc2Vjb25kTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHNlY29uZExhYmVsLnNldFRleHQoIk5hbWUiKTsKLSAgICAgICAgbmFtZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIG5hbWUuc2V0VGV4dChnZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRQYXJ0TmFtZShuYW1lLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIExhYmVsIHRoaXJkTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRoaXJkTGFiZWwuc2V0VGV4dCgiQ29udGVudCIpOwotICAgICAgICBjb250ZW50RGVzY3JpcHRpb24gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBjb250ZW50RGVzY3JpcHRpb24uc2V0VGV4dChnZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIGNvbnRlbnREZXNjcmlwdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24oY29udGVudERlc2NyaXB0aW9uLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIExhYmVsIHRsTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRsTGFiZWwuc2V0VGV4dCgiZ2V0VGl0bGUoKSA9ICIpOwotICAgICAgICB0aXRsZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0gICAgICAgIExhYmVsIG5tTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG5tTGFiZWwuc2V0VGV4dCgiZ2V0UGFydE5hbWUoKSA9ICIpOwotICAgICAgICBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgTGFiZWwgZGVzY0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBkZXNjTGFiZWwuc2V0VGV4dCgiZ2V0Q29udGVudERlc2NyaXB0aW9uKCkgPSAiKTsKLSAgICAgICAgY2RMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotICAgICAgICB1cGRhdGVMYWJlbHMoKTsKLQotICAgICAgICBhZGRQcm9wZXJ0eUxpc3RlbmVyKG5ldyBJUHJvcGVydHlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXIjcHJvcGVydHlDaGFuZ2VkKGphdmEubGFuZy5PYmplY3QsIGludCkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYWJlbHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxhYmVscygpIHsKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRUZXh0KGdldFRpdGxlKCkpOwotICAgICAgICBuYW1lTGFiZWwuc2V0VGV4dChnZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgY2RMYWJlbC5zZXRUZXh0KGdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvVmlld1BhcnRUaXRsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvVmlld1BhcnRUaXRsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmZjA4My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L1ZpZXdQYXJ0VGl0bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0MjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyBidWcgNTY4MjIgLS0gTlBFIHRocm93biB3aGVuIHNldFRpdGxlKG51bGwpIGlzIGNhbGxlZC4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVmlld1BhcnRUaXRsZVRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBWaWV3UGFydFRpdGxlVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIFdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLSAgICBXb3JrYmVuY2hQYWdlIHBhZ2U7Ci0KLSAgICBFbXB0eVZpZXcgdmlldzsKLQotICAgIElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHJlZjsKLQotICAgIGJvb2xlYW4gdGl0bGVDaGFuZ2VFdmVudCA9IGZhbHNlOwotCi0gICAgYm9vbGVhbiBuYW1lQ2hhbmdlRXZlbnQgPSBmYWxzZTsKLQotICAgIGJvb2xlYW4gY29udGVudENoYW5nZUV2ZW50ID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIElQcm9wZXJ0eUxpc3RlbmVyIHByb3BlcnR5TGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZWQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAocHJvcElkKSB7Ci0gICAgICAgICAgICBjYXNlIElXb3JrYmVuY2hQYXJ0Q29uc3RhbnRzLlBST1BfVElUTEU6Ci0gICAgICAgICAgICAgICAgdGl0bGVDaGFuZ2VFdmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElXb3JrYmVuY2hQYXJ0Q29uc3RhbnRzLlBST1BfUEFSVF9OQU1FOgotICAgICAgICAgICAgICAgIG5hbWVDaGFuZ2VFdmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElXb3JrYmVuY2hQYXJ0Q29uc3RhbnRzLlBST1BfQ09OVEVOVF9ERVNDUklQVElPTjoKLSAgICAgICAgICAgICAgICBjb250ZW50Q2hhbmdlRXZlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICB3aW5kb3cgPSAoV29ya2JlbmNoV2luZG93KSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIFN0cmluZyB2aWV3SWQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMud29ya2JlbmNocGFydC5FbXB0eVZpZXciOwotICAgICAgICB2aWV3ID0gKEVtcHR5VmlldykgcGFnZS5zaG93Vmlldyh2aWV3SWQpOwotICAgICAgICByZWYgPSBwYWdlLmZpbmRWaWV3UmVmZXJlbmNlKHZpZXdJZCk7Ci0gICAgICAgIHZpZXcuYWRkUHJvcGVydHlMaXN0ZW5lcihwcm9wZXJ0eUxpc3RlbmVyKTsKLSAgICAgICAgdGl0bGVDaGFuZ2VFdmVudCA9IGZhbHNlOwotICAgICAgICBuYW1lQ2hhbmdlRXZlbnQgPSBmYWxzZTsKLSAgICAgICAgY29udGVudENoYW5nZUV2ZW50ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC5VSVRlc3RDYXNlI2RvVGVhckRvd24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdmlldy5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHByb3BlcnR5TGlzdGVuZXIpOwotICAgICAgICBwYWdlLmhpZGVWaWV3KHZpZXcpOwotICAgICAgICBzdXBlci5kb1RlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVNldHRpbmdzKElXb3JrYmVuY2hQYXJ0MiBwYXJ0LCBTdHJpbmcgZXhwZWN0ZWRUaXRsZSwKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFBhcnROYW1lLCBTdHJpbmcgZXhwZWN0ZWRDb250ZW50RGVzY3JpcHRpb24pCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IHZpZXcgdGl0bGUiLCBleHBlY3RlZFRpdGxlLCBwYXJ0Ci0gICAgICAgICAgICAgICAgLmdldFRpdGxlKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcGFydCBuYW1lIiwgZXhwZWN0ZWRQYXJ0TmFtZSwgcGFydAotICAgICAgICAgICAgICAgIC5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IGNvbnRlbnQgZGVzY3JpcHRpb24iLAotICAgICAgICAgICAgICAgIGV4cGVjdGVkQ29udGVudERlc2NyaXB0aW9uLCBwYXJ0LmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdGl0bGUgaW4gdmlldyByZWZlcmVuY2UiLCBleHBlY3RlZFRpdGxlLAotICAgICAgICAgICAgICAgIHJlZi5nZXRUaXRsZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IHBhcnQgbmFtZSBpbiB2aWV3IHJlZmVyZW5jZSIsCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWRQYXJ0TmFtZSwgcmVmLmdldFBhcnROYW1lKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgY29udGVudCBkZXNjcmlwdGlvbiBpbiB2aWV3IHJlZmVyZW5jZSIsCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWRDb250ZW50RGVzY3JpcHRpb24sIHJlZi5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVNldHRpbmdzKFN0cmluZyBleHBlY3RlZFRpdGxlLCBTdHJpbmcgZXhwZWN0ZWRQYXJ0TmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZENvbnRlbnREZXNjcmlwdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeVNldHRpbmdzKHZpZXcsIGV4cGVjdGVkVGl0bGUsIGV4cGVjdGVkUGFydE5hbWUsCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWRDb250ZW50RGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IHdlJ3ZlIHJlY2VpdmVkIHRoZSBnaXZlbiBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgdGVzdAotICAgICAqIAotICAgICAqIEBwYXJhbSB0aXRsZUV2ZW50IFBST1BfVElUTEUKLSAgICAgKiBAcGFyYW0gbmFtZUV2ZW50IFBST1BfUEFSVF9OQU1FCi0gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uRXZlbnQgUFJPUF9DT05URU5UX0RFU0NSSVBUSU9OCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50cyhib29sZWFuIHRpdGxlRXZlbnQsIGJvb2xlYW4gbmFtZUV2ZW50LAotICAgICAgICAgICAgYm9vbGVhbiBkZXNjcmlwdGlvbkV2ZW50KSB7Ci0gICAgICAgIGlmICh0aXRsZUV2ZW50KSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJNaXNzaW5nIHRpdGxlIGNoYW5nZSBldmVudCIsIHRpdGxlRXZlbnQsCi0gICAgICAgICAgICAgICAgICAgIHRpdGxlQ2hhbmdlRXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lRXZlbnQpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk1pc3NpbmcgbmFtZSBjaGFuZ2UgZXZlbnQiLCBuYW1lRXZlbnQsCi0gICAgICAgICAgICAgICAgICAgIG5hbWVDaGFuZ2VFdmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uRXZlbnQpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk1pc3NpbmcgY29udGVudCBkZXNjcmlwdGlvbiBldmVudCIsCi0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uRXZlbnQsIGNvbnRlbnRDaGFuZ2VFdmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdmVyaWZ5U2V0dGluZ3MoIkVtcHR5VmlldyIsICJFbXB0eVZpZXciLCAiIik7Ci0gICAgICAgIHZlcmlmeUV2ZW50cyhmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoYXQgd2UgY2FuIGNhbGwgVmlld1BhcnQuc2V0VGl0bGUobnVsbCkgd2l0aG91dCB0aHJvd2luZwotICAgICAqIGFueSBleGNlcHRpb25zCi0gICAgICogCi0gICAgICogQHRocm93cyBUaHJvd2FibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbFRpdGxlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHZpZXcuc2V0VGl0bGUobnVsbCk7Ci0KLSAgICAgICAgdmVyaWZ5U2V0dGluZ3MoIiIsICJFbXB0eVZpZXciLCAiIik7Ci0gICAgICAgIHZlcmlmeUV2ZW50cyh0cnVlLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21OYW1lKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHZpZXcuc2V0UGFydE5hbWUoIkN1c3RvbVBhcnROYW1lIik7Ci0gICAgICAgIHZlcmlmeVNldHRpbmdzKCJDdXN0b21QYXJ0TmFtZSIsICJDdXN0b21QYXJ0TmFtZSIsICIiKTsKLSAgICAgICAgdmVyaWZ5RXZlbnRzKHRydWUsIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tVGl0bGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdmlldy5zZXRUaXRsZSgiQ3VzdG9tVGl0bGUiKTsKLSAgICAgICAgdmVyaWZ5U2V0dGluZ3MoIkN1c3RvbVRpdGxlIiwgIkVtcHR5VmlldyIsICJDdXN0b21UaXRsZSIpOwotICAgICAgICB2ZXJpZnlFdmVudHModHJ1ZSwgZmFsc2UsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21Db250ZW50RGVzY3JpcHRpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdmlldy5zZXRDb250ZW50RGVzY3JpcHRpb24oIkN1c3RvbUNvbnRlbnREZXNjcmlwdGlvbiIpOwotICAgICAgICB2ZXJpZnlTZXR0aW5ncygiRW1wdHlWaWV3IChDdXN0b21Db250ZW50RGVzY3JpcHRpb24pIiwgIkVtcHR5VmlldyIsCi0gICAgICAgICAgICAgICAgIkN1c3RvbUNvbnRlbnREZXNjcmlwdGlvbiIpOwotICAgICAgICB2ZXJpZnlFdmVudHModHJ1ZSwgZmFsc2UsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21OYW1lQW5kQ29udGVudERlc2NyaXB0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHZpZXcuc2V0UGFydE5hbWUoIkN1c3RvbU5hbWUiKTsKLSAgICAgICAgdmlldy5zZXRDb250ZW50RGVzY3JpcHRpb24oIkN1c3RvbUNvbnRlbnREZXNjcmlwdGlvbiIpOwotICAgICAgICB2ZXJpZnlTZXR0aW5ncygiQ3VzdG9tTmFtZSAoQ3VzdG9tQ29udGVudERlc2NyaXB0aW9uKSIsICJDdXN0b21OYW1lIiwKLSAgICAgICAgICAgICAgICAiQ3VzdG9tQ29udGVudERlc2NyaXB0aW9uIik7Ci0gICAgICAgIHZlcmlmeUV2ZW50cyh0cnVlLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L1ZpZXdUaGF0Q2FjaGVzSXRzU2hlbGwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvVmlld1RoYXRDYWNoZXNJdHNTaGVsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWIxZjU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvVmlld1RoYXRDYWNoZXNJdHNTaGVsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBWaWV3VGhhdENhY2hlc0l0c1NoZWxsIHsKLSAgICAKLSAgICBwcml2YXRlIERpYWxvZyBjYWNoZWREaWFsb2c7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotICAgIAotICAgIHB1YmxpYyBWaWV3VGhhdENhY2hlc0l0c1NoZWxsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgICAgIAotICAgICAgICBCdXR0b24gcHVzaEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIHB1c2hCdXR0b24uc2V0VGV4dCgiQ2FjaGUgbm93Iik7Ci0gICAgICAgIHB1c2hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgIGNhY2hlTm93KCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGNhY2hlTm93KCk7Ci0gICAgICAgIAotICAgICAgICBCdXR0b24gb3BlbkRpYWxvZyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIG9wZW5EaWFsb2cuc2V0VGV4dCgiT3BlbiBEaWFsb2ciKTsKLSAgICAgICAgb3BlbkRpYWxvZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgY2FjaGVkRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNhY2hlTm93KCkgewotICAgICAgICBjYWNoZWREaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhwYXJlbnQuZ2V0U2hlbGwoKSwgInRlc3QiLCBudWxsLCAiaGVsbG8gd29ybGQiLCBNZXNzYWdlRGlhbG9nLklORk9STUFUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Ik9rYXkifSwgMCk7ICAgICAgICAgICAgCi0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvVmlld1dpdGhDcmVhdGVDb250cm9sc0V4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9WaWV3V2l0aENyZWF0ZUNvbnRyb2xzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTY3NmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9WaWV3V2l0aENyZWF0ZUNvbnRyb2xzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBWaWV3V2l0aENyZWF0ZUNvbnRyb2xzRXhjZXB0aW9uIGV4dGVuZHMgVmlld1BhcnQgewotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBleGNlcHRpb24gd2FzIHRocm93biBpbnRlbnRpb25hbGx5IGFzIHBhcnQgb2YgYW4gZXJyb3IgaGFuZGxpbmcgdGVzdCIpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvVmlld1dpdGhEaXNwb3NlRXhjZXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L1ZpZXdXaXRoRGlzcG9zZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2RkMDVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXBpL3dvcmtiZW5jaHBhcnQvVmlld1dpdGhEaXNwb3NlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBWaWV3V2l0aERpc3Bvc2VFeGNlcHRpb24gZXh0ZW5kcyBWaWV3UGFydCB7Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgICAgIAotICAgICAgICBMYWJlbCB0ZXN0TGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIAotICAgICAgICB0ZXN0TGFiZWwuc2V0VGV4dCgiVGhpcyB2aWV3IGlzIHN1cHBvc2VkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIGNsb3NlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24gaW50ZW50aW9uYWxseSBhcyBwYXJ0IG9mIGFuIGVycm9yIGhhbmRsaW5nIHRlc3QiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L1ZpZXdXaXRoSW5pdEV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9WaWV3V2l0aEluaXRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0ODliNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L1ZpZXdXaXRoSW5pdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotcHVibGljIGNsYXNzIFZpZXdXaXRoSW5pdEV4Y2VwdGlvbiBleHRlbmRzIFZpZXdQYXJ0IHsKLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbigiVGhpcyBleGNlcHRpb24gd2FzIHRocm93biBpbnRlbnRpb25hbGx5IGFzIHBhcnQgb2YgYW4gZXJyb3IgaGFuZGxpbmcgdGVzdCIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgICAgIAotICAgICAgICBMYWJlbCBtZXNzYWdlID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBtZXNzYWdlLnNldFRleHQoIlRoaXMgdmlldyB0aHJldyBhbiBleGNlcHRpb24gb24gaW5pdC4gWW91IHNob3VsZCBub3QgYmUgYWJsZSB0byByZWFkIHRoaXMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hcGkvd29ya2JlbmNocGFydC9WaWV3V2l0aEluaXRSdW50aW1lRXhjZXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L1ZpZXdXaXRoSW5pdFJ1bnRpbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyZDRmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2FwaS93b3JrYmVuY2hwYXJ0L1ZpZXdXaXRoSW5pdFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBWaWV3V2l0aEluaXRSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgVmlld1BhcnQgewotCi0gICAgcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgc2l0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24gaW50ZW50aW9uYWxseSBhcyBwYXJ0IG9mIGFuIGVycm9yIGhhbmRsaW5nIHRlc3QiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBwYXJlbnQuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotICAgICAgICAKLSAgICAgICAgTGFiZWwgbWVzc2FnZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbWVzc2FnZS5zZXRUZXh0KCJUaGlzIHZpZXcgdGhyZXcgYW4gZXhjZXB0aW9uIG9uIGluaXQuIFlvdSBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCB0aGlzIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXV0b3Rlc3RzL0Fic3RyYWN0VGVzdExvZ2dlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hdXRvdGVzdHMvQWJzdHJhY3RUZXN0TG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZmE1YmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hdXRvdGVzdHMvQWJzdHJhY3RUZXN0TG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXV0b3Rlc3RzOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVzdExvZ2dlciB7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVwb3J0UmVzdWx0KFN0cmluZyB0ZXN0TmFtZSwgVGVzdFJlc3VsdCByZXN1bHQpIHRocm93cyBUaHJvd2FibGU7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2F1dG90ZXN0cy9BdXRvVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hdXRvdGVzdHMvQXV0b1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3NzRmNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2F1dG90ZXN0cy9BdXRvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmF1dG90ZXN0czsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXV0b1Rlc3QgewotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgcGVyZm9ybVRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hdXRvdGVzdHMvQXV0b1Rlc3RMb2dnZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXV0b3Rlc3RzL0F1dG9UZXN0TG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDU0MTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hdXRvdGVzdHMvQXV0b1Rlc3RMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hdXRvdGVzdHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgQXV0b1Rlc3RMb2dnZXIgZXh0ZW5kcyBBYnN0cmFjdFRlc3RMb2dnZXIgewotCi0gICAgcHJpdmF0ZSBUZXN0UmVzdWx0cyBlcnJvcnMgPSBuZXcgVGVzdFJlc3VsdHMoKTsKLSAgICBwcml2YXRlIFRlc3RSZXN1bHRzIGV4cGVjdGVkUmVzdWx0czsKLSAgICBwcml2YXRlIFRlc3RSZXN1bHRzIHVua25vd25UZXN0cyA9IG5ldyBUZXN0UmVzdWx0cygpOwotICAgIAotICAgIHB1YmxpYyBBdXRvVGVzdExvZ2dlcihVUkwgZXhwZWN0ZWRSZXN1bHRzRmlsZSkgdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMobmV3IFRlc3RSZXN1bHRzKFhtbFV0aWwucmVhZChleHBlY3RlZFJlc3VsdHNGaWxlKSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQXV0b1Rlc3RMb2dnZXIoVGVzdFJlc3VsdHMgZXhwZWN0ZWRSZXN1bHRzKSB7Ci0gICAgICAgIHRoaXMuZXhwZWN0ZWRSZXN1bHRzID0gZXhwZWN0ZWRSZXN1bHRzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQXV0b1Rlc3RMb2dnZXIoKSB7Ci0gICAgICAgIHRoaXMobmV3IFRlc3RSZXN1bHRzKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFJlc3VsdHMoVGVzdFJlc3VsdHMgcmVzdWx0cykgewotICAgICAgICB0aGlzLmV4cGVjdGVkUmVzdWx0cyA9IHJlc3VsdHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUZXN0UmVzdWx0cyBnZXRFcnJvcnMoKSB7Ci0gICAgICAgIHJldHVybiBlcnJvcnM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUZXN0UmVzdWx0cyBnZXRVbmtub3duVGVzdHMoKSB7Ci0gICAgICAgIHJldHVybiB1bmtub3duVGVzdHM7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnJlc3VsdC5BdXRvVGVzdFJlc3VsdCNyZXBvcnRSZXN1bHQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXBvcnRSZXN1bHQoU3RyaW5nIHRlc3ROYW1lLCBUZXN0UmVzdWx0IHJlc3VsdCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIFRlc3RSZXN1bHRGaWx0ZXIgZXhwZWN0ZWRSZXN1bHQgPSBleHBlY3RlZFJlc3VsdHMuZ2V0KHRlc3ROYW1lKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChleHBlY3RlZFJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJZiB1bmtub3duIHRlc3QgbmFtZQotICAgICAgICAgICAgdW5rbm93blRlc3RzLnB1dCh0ZXN0TmFtZSwgbmV3IFRlc3RSZXN1bHRGaWx0ZXIocmVzdWx0KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgdGhlIGV4cGVjdGVkIHJlc3VsdAotICAgICAgICAgICAgICAgIGV4cGVjdGVkUmVzdWx0LmFzc2VydFJlc3VsdChyZXN1bHQpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBub3QsIHJlY29yZCB0aGUgaW52YWxpZCByZXN1bHQKLSAgICAgICAgICAgICAgICBlcnJvcnMucHV0KHRlc3ROYW1lLCBuZXcgVGVzdFJlc3VsdEZpbHRlcihyZXN1bHQpKTsKLSAgICAgICAgICAgICAgICB0aHJvdyB0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBUZXN0IHBhc3NlZC4gTm90aGluZyB0byBkby4KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2F1dG90ZXN0cy9BdXRvVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2F1dG90ZXN0cy9BdXRvVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODViMTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hdXRvdGVzdHMvQXV0b1Rlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hdXRvdGVzdHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuWE1MTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0UGx1Z2luOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIEF1dG9UZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotICAgIHByaXZhdGUgQXV0b1Rlc3RMb2dnZXIgbG9nZ2VyOwotICAgIAotICAgIHB1YmxpYyBBdXRvVGVzdFN1aXRlKFVSTCBleHBlY3RlZFJlc3VsdHMpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkUmVzdWx0cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2dnZXIgPSBuZXcgQXV0b1Rlc3RMb2dnZXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyID0gbmV3IEF1dG9UZXN0TG9nZ2VyKGV4cGVjdGVkUmVzdWx0cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZ2dlciA9IG5ldyBBdXRvVGVzdExvZ2dlcigpOwotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEF1dG9UZXN0TG9nZ2VyIGdldExvZygpIHsKLSAgICAgICAgcmV0dXJuIGxvZ2dlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkV3JhcHBlcihBdXRvVGVzdCB0ZXN0KSB7Ci0gICAgICAgIGFkZFRlc3QobmV3IEF1dG9UZXN0V3JhcHBlcih0ZXN0LCBsb2dnZXIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZSNydW4oanVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgIHN1cGVyLnJ1bihyZXN1bHQpOwotCi0gICAgICAgIElQYXRoIHN0YXRlUGF0aCA9IFBsYXRmb3JtLmdldFN0YXRlTG9jYXRpb24oVGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHRlc3ROYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0gICAgICAgIGlmICh0ZXN0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXN0TmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghbG9nZ2VyLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgSVBhdGggZXJyb3JzUGF0aCA9IHN0YXRlUGF0aC5hcHBlbmQodGVzdE5hbWUpLmFwcGVuZCgiZXJyb3JzLnhtbCIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9ycyBkZXRlY3RlZC4gUmVzdWx0cyB3cml0dGVuIHRvICIgKyBlcnJvcnNQYXRoLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBYTUxNZW1lbnRvIG91dHB1dCA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJlcnJvcnMiKTsKLSAgICAgICAgICAgIGxvZ2dlci5nZXRFcnJvcnMoKS5zYXZlU3RhdGUob3V0cHV0KTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWG1sVXRpbC53cml0ZShlcnJvcnNQYXRoLnRvRmlsZSgpLCBvdXRwdXQpOwotICAgICAgICAgICAgfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIWxvZ2dlci5nZXRVbmtub3duVGVzdHMoKS5pc0VtcHR5KCkpIHsKLQotICAgICAgICAgICAgSVBhdGggdW5rbm93blBhdGggPSBzdGF0ZVBhdGguYXBwZW5kKHRlc3ROYW1lKS5hcHBlbmQoIm5ld3Rlc3RzLnhtbCIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5ldyB0ZXN0cyBkZXRlY3RlZC4gUmVzdWx0cyB3cml0dGVuIHRvICIgKyB1bmtub3duUGF0aC50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgWE1MTWVtZW50byBvdXRwdXQgPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgidW5rbm93biIpOwotICAgICAgICAgICAgbG9nZ2VyLmdldFVua25vd25UZXN0cygpLnNhdmVTdGF0ZShvdXRwdXQpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBYbWxVdGlsLndyaXRlKHVua25vd25QYXRoLnRvRmlsZSgpLCBvdXRwdXQpOwotICAgICAgICAgICAgfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGZpbmRJbkFycmF5KFN0cmluZ1tdIGhheVN0YWNrLCBTdHJpbmcgbmVlZGxlKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGF5U3RhY2subGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuZXh0ID0gaGF5U3RhY2tbaV07Ci0gICAgICAgICAgICBpZiAobmV4dC5lcXVhbHMobmVlZGxlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaGF5U3RhY2subGVuZ3RoOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXV0b3Rlc3RzL0F1dG9UZXN0V3JhcHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hdXRvdGVzdHMvQXV0b1Rlc3RXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZTZjNjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hdXRvdGVzdHMvQXV0b1Rlc3RXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXV0b3Rlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIEF1dG9UZXN0V3JhcHBlciBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIEF1dG9UZXN0IHRlc3Q7Ci0gICAgcHJpdmF0ZSBBYnN0cmFjdFRlc3RMb2dnZXIgbG9nOwotCi0gICAgcHVibGljIEF1dG9UZXN0V3JhcHBlcihBdXRvVGVzdCB0ZXN0LCBBYnN0cmFjdFRlc3RMb2dnZXIgcmVzdWx0TG9nKSB7Ci0gICAgICAgIHN1cGVyKHRlc3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7Ci0gICAgICAgIHRoaXMubG9nID0gcmVzdWx0TG9nOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjcnVuVGVzdCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBTdHJpbmcgdGVzdE5hbWUgPSB0ZXN0LmdldE5hbWUoKTsKLSAgICAgICAgCi0gICAgICAgIFRlc3RSZXN1bHQgcmVzdWx0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RSZXN1bHQodGVzdC5wZXJmb3JtVGVzdCgpKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0UmVzdWx0KHQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBsb2cucmVwb3J0UmVzdWx0KHRlc3ROYW1lLCByZXN1bHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXV0b3Rlc3RzL1Rlc3RSZXN1bHQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXV0b3Rlc3RzL1Rlc3RSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwOWM5NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2F1dG90ZXN0cy9UZXN0UmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXV0b3Rlc3RzOwotCi0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgVGVzdFJlc3VsdCB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzdWx0OwotICAgIHByaXZhdGUgVGhyb3dhYmxlIHRocm93bkV4Y2VwdGlvbjsKLSAgICAKLSAgICBwdWJsaWMgVGVzdFJlc3VsdChTdHJpbmcgZXhwZWN0ZWRSZXN1bHQpIHsKLSAgICAgICAgdGhpcy5yZXN1bHQgPSBleHBlY3RlZFJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFRlc3RSZXN1bHQoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgdGhpcy5yZXN1bHQgPSBudWxsOwotICAgICAgICB0aGlzLnRocm93bkV4Y2VwdGlvbiA9IHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZXhwZWN0ZWQgcmVzdWx0IG9yIG51bGwgaWYgdGhlIHRlc3QgdGhyZXcgYW4KLSAgICAgKiBleGNlcHRpb24gcmF0aGVyIHRoYW4gdGVybWluYXRlIG5vcm1hbGx5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZXhwZWN0ZWQgcmVzdWx0IG9yIG51bGwgaWYgdGhlIHRlc3QgdGhyZXcgYW4KLSAgICAgKiBleGNlcHRpb24gcmF0aGVyIHRoYW4gdGVybWluYXRlIG5vcm1hbGx5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhyb3duRXhjZXB0aW9uOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXV0b3Rlc3RzL1Rlc3RSZXN1bHRGaWx0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXV0b3Rlc3RzL1Rlc3RSZXN1bHRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlOTFjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2F1dG90ZXN0cy9UZXN0UmVzdWx0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXV0b3Rlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFRlc3RSZXN1bHRGaWx0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUkVTVUxUID0gInJlc3VsdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9FWENFUFRJT04gPSAiZXhjZXB0aW9uIjsKLSAgICBwcml2YXRlIFN0cmluZyByZXN1bHQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXhwZWN0ZWRFeGNlcHRpb247Ci0gICAgCi0gICAgcHVibGljIFRlc3RSZXN1bHRGaWx0ZXIoSU1lbWVudG8gdG9Mb2FkKSB7Ci0gICAgICAgIHRoaXMucmVzdWx0ID0gdG9Mb2FkLmdldFN0cmluZyhBVFRfUkVTVUxUKTsKLSAgICAgICAgdGhpcy5leHBlY3RlZEV4Y2VwdGlvbiA9IHRvTG9hZC5nZXRTdHJpbmcoQVRUX0VYQ0VQVElPTik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZmlsdGVyIHRoYXQgYWNjZXB0cyB0aGUgZ2l2ZW4gdGVzdCByZXN1bHQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9BY2NlcHQKLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdFJlc3VsdEZpbHRlcihUZXN0UmVzdWx0IHRvQWNjZXB0KSB7Ci0gICAgICAgIGlmICh0b0FjY2VwdC5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgZXhwZWN0ZWRFeGNlcHRpb24gPSB0b0FjY2VwdC5nZXRFeGNlcHRpb24oKS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gdG9BY2NlcHQuZ2V0UmV0dXJuVmFsdWUoKTsKLSAgICAgICAgICAgIGV4cGVjdGVkRXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gdG9TYXZlKSB7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgdG9TYXZlLnB1dFN0cmluZyhBVFRfUkVTVUxULCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZXhwZWN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdG9TYXZlLnB1dFN0cmluZyhBVFRfRVhDRVBUSU9OLCBleHBlY3RlZEV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYXNzZXJ0UmVzdWx0KFRlc3RSZXN1bHQgYWN0dWFsKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBhY3R1YWwuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0LCBhY3R1YWwuZ2V0UmV0dXJuVmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7ICAgICAgIAotICAgICAgICAgICAgaWYgKGFjdHVhbC5nZXRFeGNlcHRpb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlRlc3Qgc2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiAiICsgZXhwZWN0ZWRFeGNlcHRpb24gKyAiIGJ1dCByZXR1cm5lZCByZXN1bHQgIiAKLSAgICAgICAgICAgICAgICAgICAgKyBhY3R1YWwuZ2V0UmV0dXJuVmFsdWUoKSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVGVzdCB0aHJldyB3cm9uZyB0eXBlIG9mIGV4Y2VwdGlvbiIsIGFjdHVhbC5nZXRFeGNlcHRpb24oKS50b1N0cmluZygpLCBleHBlY3RlZEV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2F1dG90ZXN0cy9UZXN0UmVzdWx0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hdXRvdGVzdHMvVGVzdFJlc3VsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk2N2FkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2F1dG90ZXN0cy9UZXN0UmVzdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmF1dG90ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgVGVzdFJlc3VsdHMgewotICAgIHByaXZhdGUgTWFwIHJlc3VsdHMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX1RFU1QgPSAidGVzdCI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9SRVNVTFQgPSAicmVzdWx0IjsKLSAgICAKLSAgICBwdWJsaWMgVGVzdFJlc3VsdHMoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUZXN0UmVzdWx0cyhJTWVtZW50byB0b0xvYWQpIHsKLSAgICAgICAgSU1lbWVudG9bXSB0ZXN0cyA9IHRvTG9hZC5nZXRDaGlsZHJlbihBVFRfVEVTVCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJTWVtZW50byBtZW1lbnRvID0gdGVzdHNbaV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWVtZW50by5nZXRTdHJpbmcoQVRUX05BTUUpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHRzLnB1dChuYW1lLCBuZXcgVGVzdFJlc3VsdEZpbHRlcihtZW1lbnRvKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFRlc3ROYW1lcygpIHsKLSAgICAgICAgQ29sbGVjdGlvbiBpZHMgPSByZXN1bHRzLmtleVNldCgpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSlpZHMudG9BcnJheShuZXcgU3RyaW5nW2lkcy5zaXplKCldKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFRlc3RSZXN1bHRGaWx0ZXIgZ2V0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICByZXR1cm4gKFRlc3RSZXN1bHRGaWx0ZXIpIHJlc3VsdHMuZ2V0KHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIHRlc3ROYW1lLCBUZXN0UmVzdWx0RmlsdGVyIGZpbHRlcikgewotICAgICAgICByZXN1bHRzLnB1dCh0ZXN0TmFtZSwgZmlsdGVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXN1bHRzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIHRlc3ROYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRlc3RSZXN1bHRGaWx0ZXIgbmV4dCA9IGdldCh0ZXN0TmFtZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIElNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZChBVFRfVEVTVCk7ICAKLSAgICAgICAgICAgIGNoaWxkLnB1dFN0cmluZyhBVFRfTkFNRSwgdGVzdE5hbWUpOwotICAgICAgICAgICAgbmV4dC5zYXZlU3RhdGUoY2hpbGQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hdXRvdGVzdHMvVUlUZXN0Q2FzZVdpdGhSZXN1bHQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXV0b3Rlc3RzL1VJVGVzdENhc2VXaXRoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjFhNjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9hdXRvdGVzdHMvVUlUZXN0Q2FzZVdpdGhSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hdXRvdGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVSVRlc3RDYXNlV2l0aFJlc3VsdCBleHRlbmRzIFVJVGVzdENhc2UgaW1wbGVtZW50cyBBdXRvVGVzdCB7Ci0gICAgcHJpdmF0ZSBBYnN0cmFjdFRlc3RMb2dnZXIgcmVzdWx0TG9nOwotICAgIAotICAgIHB1YmxpYyBVSVRlc3RDYXNlV2l0aFJlc3VsdChTdHJpbmcgdGVzdE5hbWUsIEFic3RyYWN0VGVzdExvZ2dlciBsb2cpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgICAgICB0aGlzLnJlc3VsdExvZyA9IGxvZzsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3J1blRlc3QoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgU3RyaW5nIHRlc3ROYW1lID0gZ2V0TmFtZSgpOwotICAgICAgICAKLSAgICAgICAgVGVzdFJlc3VsdCByZXN1bHQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFJlc3VsdChwZXJmb3JtVGVzdCgpKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0UmVzdWx0KHQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXN1bHRMb2cucmVwb3J0UmVzdWx0KHRlc3ROYW1lLCByZXN1bHQpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXV0b3Rlc3RzL1htbFV0aWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvYXV0b3Rlc3RzL1htbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAxYTQ0Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2F1dG90ZXN0cy9YbWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuYXV0b3Rlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5YTUxNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RQbHVnaW47Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgWG1sVXRpbCB7Ci0gICAgcHVibGljIHN0YXRpYyBJTWVtZW50byByZWFkKElucHV0U3RyZWFtIHRvUmVhZCkgdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcih0b1JlYWQpOwotCi0gICAgICAgIHJldHVybiBYTUxNZW1lbnRvLmNyZWF0ZVJlYWRSb290KHJlYWRlcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSU1lbWVudG8gcmVhZChVUkwgdG9SZWFkKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiByZWFkKHRvUmVhZC5vcGVuU3RyZWFtKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2JlbmNoRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgCi0gICAgICAgICAgICAgICAgICAgIFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLk9LLCBudWxsLCBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJTWVtZW50byByZWFkKEZpbGUgdG9SZWFkKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRvUmVhZCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZChpbnB1dCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2JlbmNoRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgCi0gICAgICAgICAgICAgICAgICAgIFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLk9LLCBudWxsLCBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKEZpbGUgZmlsZSwgWE1MTWVtZW50byBkYXRhKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIGZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCi0gICAgICAgICAgICBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dCk7Ci0gICAgICAgICAgICBkYXRhLnNhdmUod3JpdGVyKTsKLSAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtiZW5jaEV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIAotICAgICAgICAgICAgICAgICAgICBUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgSVN0YXR1cy5PSywgZS50b1N0cmluZygpLCBlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXb3JrYmVuY2hFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAKLSAgICAgICAgICAgICAgICAgICAgVGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIElTdGF0dXMuT0ssIGUudG9TdHJpbmcoKSwgZSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb21tYW5kcy9CdWc2NjE4MlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQnVnNjYxODJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZDkzZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb21tYW5kcy9CdWc2NjE4MlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5IYW5kbGVyU3VibWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JV29ya2JlbmNoQ29tbWFuZFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuTm90SGFuZGxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5Qcmlvcml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyB0aGF0IGRpYWxvZ3Mgd2lsbCBpbmhlcml0IHRoZSBoYW5kbGVycyBmcm9tIHRoZSB3b3JrYmVuY2ggd2luZG93LCBpZgotICogbm9uZSBpcyBkZWZpbmVkIGZvciB0aGUgZGlhbG9nIGl0c2VsZi4gSXQgdGVzdHMgYWxsIG9mIHRoZSB2YXJpb3VzCi0gKiBjb21iaW5hdGlvbnMgb2YgdGhpcyBzaXR1YXRpb24uCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJ1ZzY2MTgyVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEJ1ZzY2MTgyVGVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHRlc3QKLQkgKi8KLQlwdWJsaWMgQnVnNjYxODJUZXN0KGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoYXQgdGhlIGRpYWxvZyBoYW5kbGVycyB3aWxsIHRha2UgcHJpb3JpdHkuIFRoZSBzZXQtdXAgaXMgYQotCSAqIHdvcmtiZW5jaCB3aW5kb3cgd2l0aCBhIGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIGNvbW1hbmQgdG8gdGVzdC4gVGhlbgotCSAqIHRoZXJlIGlzIGEgZGlhbG9nIG9wZW5lZCB3aXRoIGEgaGFuZGxlciBmb3IgdGhlIHNhbWUgY29tbWFuZC4gVGhlIHRlc3QgaXMKLQkgKiB0byBzZWUgdGhhdCB0aGUgZGlhbG9nJ3MgaGFuZGxlciBnZXRzIHByaW9yaXR5LgotCSAqIAotCSAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBhbmQgaW5kaWNhdGVzIGEgcHJvYmxlbSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgIHRlc3QuCi0JICogQHRocm93cyBOb3RIYW5kbGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgbm8gaGFuZGxlciB3YXMgZm91bmQgd2hlcmUgb25lIHNob3VsZCBoYXZlCi0JICogICAgICAgICAgICAgYmVlbiBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RGlhbG9nSGFuZGxlcnMoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLAotCQkJTm90SGFuZGxlZEV4Y2VwdGlvbiB7Ci0JCS8vIE9wZW4gYSB0ZXN0IHdpbmRvdy4KLS8vCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0vLwotLy8JCS8vIERlZmluZSBhIGhhbmRsZXIgZm9yIHNvbWUgcmFuZG9tIGNvbW1hbmQgaWRlbnRpZmllci4KLS8vCQlmaW5hbCBPYmplY3Qgd2luZG93UmVzdWx0ID0gbmV3IE9iamVjdCgpOwotLy8JCWZpbmFsIElIYW5kbGVyIHdpbmRvd0hhbmRsZXIgPSBuZXcgQWJzdHJhY3RIYW5kbGVyKCkgewotLy8KLS8vCQkJcHVibGljIE9iamVjdCBleGVjdXRlKE1hcCBwYXJhbWV0ZXJWYWx1ZXNCeU5hbWUpCi0vLwkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0vLwkJCQkvLyBEbyBub3RoaW5nLgotLy8JCQkJcmV0dXJuIHdpbmRvd1Jlc3VsdDsKLS8vCQkJfQotLy8JCX07Ci0vLwkJZmluYWwgSVdvcmtiZW5jaENvbW1hbmRTdXBwb3J0IGNvbW1hbmRTdXBwb3J0ID0gZldvcmtiZW5jaAotLy8JCQkJLmdldENvbW1hbmRTdXBwb3J0KCk7Ci0vLwkJZmluYWwgU3RyaW5nIGNvbW1hbmRJZCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5CdWc2NjE4MiI7Ci0vLwkJZmluYWwgU2hlbGwgd2luZG93U2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLS8vCQlmaW5hbCBIYW5kbGVyU3VibWlzc2lvbiB3aW5kb3dTdWJtaXNzaW9uID0gbmV3IEhhbmRsZXJTdWJtaXNzaW9uKG51bGwsCi0vLwkJCQl3aW5kb3dTaGVsbCwgbnVsbCwgY29tbWFuZElkLCB3aW5kb3dIYW5kbGVyLCBQcmlvcml0eS5NRURJVU0pOwotLy8JCWNvbW1hbmRTdXBwb3J0LmFkZEhhbmRsZXJTdWJtaXNzaW9uKHdpbmRvd1N1Ym1pc3Npb24pOwotLy8KLS8vCQkvLyBPcGVuIGEgZGlhbG9nLgotLy8JCWZpbmFsIFNoZWxsIGRpYWxvZ1NoZWxsID0gbmV3IFNoZWxsKHdpbmRvd1NoZWxsKTsKLS8vCQlkaWFsb2dTaGVsbC5wYWNrKCk7Ci0vLwkJZGlhbG9nU2hlbGwub3BlbigpOwotLy8JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGRpYWxvZ1NoZWxsLmdldERpc3BsYXkoKTsKLS8vCQl3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLS8vCQkJOwotLy8KLS8vCQkvKgotLy8JCSAqIERlZmluZSBhIGhhbmRsZXIgZm9yIHRoZSBzYW1lIGNvbW1hbmQgaWRlbnRpZmllciwgYnV0IGZvciB0aGlzCi0vLwkJICogZGlhbG9nLgotLy8JCSAqLwotLy8JCWZpbmFsIE9iamVjdCBkaWFsb2dSZXN1bHQgPSBuZXcgT2JqZWN0KCk7Ci0vLwkJZmluYWwgSUhhbmRsZXIgZGlhbG9nSGFuZGxlciA9IG5ldyBBYnN0cmFjdEhhbmRsZXIoKSB7Ci0vLwotLy8JCQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoTWFwIHBhcmFtZXRlclZhbHVlc0J5TmFtZSkKLS8vCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLS8vCQkJCS8vIERvIG5vdGhpbmcuCi0vLwkJCQlyZXR1cm4gZGlhbG9nUmVzdWx0OwotLy8JCQl9Ci0vLwkJfTsKLS8vCQlmaW5hbCBIYW5kbGVyU3VibWlzc2lvbiBkaWFsb2dTdWJtaXNzaW9uID0gbmV3IEhhbmRsZXJTdWJtaXNzaW9uKG51bGwsCi0vLwkJCQlkaWFsb2dTaGVsbCwgbnVsbCwgY29tbWFuZElkLCBkaWFsb2dIYW5kbGVyLCBQcmlvcml0eS5NRURJVU0pOwotLy8JCWNvbW1hbmRTdXBwb3J0LmFkZEhhbmRsZXJTdWJtaXNzaW9uKGRpYWxvZ1N1Ym1pc3Npb24pOwotLy8KLS8vCQkvLyBDaGVjayB0byBzZWUgd2hpY2ggaGFuZGxlciBpcyB0aGUgcmlnaHQgaGFuZGxlci4KLS8vCQlmaW5hbCBJQ29tbWFuZCBjb21tYW5kID0gY29tbWFuZFN1cHBvcnQuZ2V0Q29tbWFuZE1hbmFnZXIoKS5nZXRDb21tYW5kKAotLy8JCQkJY29tbWFuZElkKTsKLS8vCQlhc3NlcnRTYW1lKAotLy8JCQkJIlRoZSBhY3RpdmUgc2hlbGwgbXVzdCBiZSB0aGUgZGlhbG9nLiAgSWYgeW91IGFyZSBhY3RpdmF0aW5nIG90aGVyIHNoZWxscyB3aGlsZSB0aGlzIHRlc3QgaXMgcnVubmluZywgdGhlbiB0aGlzIHRlc3Qgd2lsbCBmYWlsIiwKLS8vCQkJCWRpYWxvZ1NoZWxsLCBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCkpOwotLy8JCWFzc2VydFNhbWUoCi0vLwkJCQkiVGhlIGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93IG11c3QgYmUgdGhlIHdpbmRvdyBjcmVhdGVkIGluIHRoaXMgdGVzdC4gIElmIHlvdSBhcmUgYWN0aXZhdGluZyBvdGhlciB3b3JrYmVuY2ggd2luZG93cywgdGhlbiB0aGlzIHRlc3Qgd2lsbCBmYWlsIiwKLS8vCQkJCXdpbmRvd1NoZWxsLCBmV29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotLy8JCWZpbmFsIE9iamVjdCByZXN1bHQgPSBjb21tYW5kLmV4ZWN1dGUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLS8vCQlhc3NlcnRTYW1lKAotLy8JCQkJIlRoZSBkaWFsb2cgaGFuZGxlciB3YXMgbm90IGNob3NlbiB3aGVuIGJvdGggYSB3aW5kb3cgYW5kIGRpYWxvZyBoYW5kbGVyIHdlcmUgZGVmaW5lZC4iLAotLy8JCQkJZGlhbG9nUmVzdWx0LCByZXN1bHQpOwotLy8KLS8vCQkvLyBDbG9zZSB0aGUgZGlhbG9nIGFuZCBsZXQgdGhlIGV2ZW50IGxvb3Agc3Bpbi4KLS8vCQljb21tYW5kU3VwcG9ydC5yZW1vdmVIYW5kbGVyU3VibWlzc2lvbih3aW5kb3dTdWJtaXNzaW9uKTsKLS8vCQljb21tYW5kU3VwcG9ydC5yZW1vdmVIYW5kbGVyU3VibWlzc2lvbihkaWFsb2dTdWJtaXNzaW9uKTsKLS8vCQlkaWFsb2dTaGVsbC5jbG9zZSgpOwotLy8JCXdoaWxlIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotLy8JCQk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCwgaW4gdGhlIGFic2VuY2Ugb2YgYSBkaWFsb2cgaGFuZGxlciwgdGhhdCB0aGUgd2luZG93IGhhbmRsZXIKLQkgKiB3aWxsIGJlIGdpdmVuIGEgY2hhbmNlIHRvIHRha2Ugb3Zlci4gVGhlIHNldC11cCBpcyBhIHdvcmtiZW5jaCB3aW5kb3cKLQkgKiB3aXRoIGEgaGFuZGxlciByZWdpc3RlcmVkIGZvciB0aGUgY29tbWFuZCB0byB0ZXN0LiBUaGVuIHRoZXJlIGlzIGEgZGlhbG9nCi0JICogb3BlbmVkLCBidXQgd2l0aCBubyBoYW5kbGVyLiBUaGUgdGVzdCBpcyB0byBzZWUgdGhhdCB0aGUgd2luZG93J3MgaGFuZGxlcgotCSAqIGlzIGFjdGl2ZS4KLQkgKiAKLQkgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYW5kIGluZGljYXRlcyBhIHByb2JsZW0gd2l0aCB0aGUKLQkgKiAgICAgICAgICAgICB0ZXN0LgotCSAqIEB0aHJvd3MgTm90SGFuZGxlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IG5vIGhhbmRsZXIgd2FzIGZvdW5kIHdoZXJlIG9uZSBzaG91bGQgaGF2ZQotCSAqICAgICAgICAgICAgIGJlZW4gZm91bmQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdEZhbGxiYWNrVG9XaW5kb3coKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLAotCQkJTm90SGFuZGxlZEV4Y2VwdGlvbiB7Ci0JCS8vIE9wZW4gYSB0ZXN0IHdpbmRvdy4KLS8vCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0vLwotLy8JCS8vIERlZmluZSBhIGhhbmRsZXIgZm9yIHNvbWUgcmFuZG9tIGNvbW1hbmQgaWRlbnRpZmllci4KLS8vCQlmaW5hbCBPYmplY3Qgd2luZG93UmVzdWx0ID0gbmV3IE9iamVjdCgpOwotLy8JCWZpbmFsIElIYW5kbGVyIHdpbmRvd0hhbmRsZXIgPSBuZXcgQWJzdHJhY3RIYW5kbGVyKCkgewotLy8KLS8vCQkJcHVibGljIE9iamVjdCBleGVjdXRlKE1hcCBwYXJhbWV0ZXJWYWx1ZXNCeU5hbWUpCi0vLwkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0vLwkJCQkvLyBEbyBub3RoaW5nLgotLy8JCQkJcmV0dXJuIHdpbmRvd1Jlc3VsdDsKLS8vCQkJfQotLy8JCX07Ci0vLwkJZmluYWwgSVdvcmtiZW5jaENvbW1hbmRTdXBwb3J0IGNvbW1hbmRTdXBwb3J0ID0gZldvcmtiZW5jaAotLy8JCQkJLmdldENvbW1hbmRTdXBwb3J0KCk7Ci0vLwkJZmluYWwgU3RyaW5nIGNvbW1hbmRJZCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5CdWc2NjE4MiI7Ci0vLwkJZmluYWwgU2hlbGwgd2luZG93U2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLS8vCQlmaW5hbCBIYW5kbGVyU3VibWlzc2lvbiB3aW5kb3dTdWJtaXNzaW9uID0gbmV3IEhhbmRsZXJTdWJtaXNzaW9uKG51bGwsCi0vLwkJCQl3aW5kb3dTaGVsbCwgbnVsbCwgY29tbWFuZElkLCB3aW5kb3dIYW5kbGVyLCBQcmlvcml0eS5NRURJVU0pOwotLy8JCWNvbW1hbmRTdXBwb3J0LmFkZEhhbmRsZXJTdWJtaXNzaW9uKHdpbmRvd1N1Ym1pc3Npb24pOwotLy8KLS8vCQkvLyBPcGVuIGEgZGlhbG9nLgotLy8JCWZpbmFsIFNoZWxsIGRpYWxvZ1NoZWxsID0gbmV3IFNoZWxsKHdpbmRvd1NoZWxsKTsKLS8vCQlmaW5hbCBJV29ya2JlbmNoQ29udGV4dFN1cHBvcnQgY29udGV4dFN1cHBvcnQgPSBmV29ya2JlbmNoCi0vLwkJCQkuZ2V0Q29udGV4dFN1cHBvcnQoKTsKLS8vCQljb250ZXh0U3VwcG9ydC5yZWdpc3RlclNoZWxsKGRpYWxvZ1NoZWxsLAotLy8JCQkJSVdvcmtiZW5jaENvbnRleHRTdXBwb3J0LlRZUEVfV0lORE9XKTsKLS8vCQlkaWFsb2dTaGVsbC5wYWNrKCk7Ci0vLwkJZGlhbG9nU2hlbGwub3BlbigpOwotLy8JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGRpYWxvZ1NoZWxsLmdldERpc3BsYXkoKTsKLS8vCQl3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLS8vCQkJOwotLy8KLS8vCQkvLyBDaGVjayB0byBzZWUgd2hpY2ggaGFuZGxlciBpcyB0aGUgcmlnaHQgaGFuZGxlci4KLS8vCQlmaW5hbCBJQ29tbWFuZCBjb21tYW5kID0gY29tbWFuZFN1cHBvcnQuZ2V0Q29tbWFuZE1hbmFnZXIoKS5nZXRDb21tYW5kKAotLy8JCQkJY29tbWFuZElkKTsKLS8vCQlhc3NlcnRTYW1lKAotLy8JCQkJIlRoZSBhY3RpdmUgc2hlbGwgbXVzdCBiZSB0aGUgZGlhbG9nLiAgSWYgeW91IGFyZSBhY3RpdmF0aW5nIG90aGVyIHNoZWxscyB3aGlsZSB0aGlzIHRlc3QgaXMgcnVubmluZywgdGhlbiB0aGlzIHRlc3Qgd2lsbCBmYWlsIiwKLS8vCQkJCWRpYWxvZ1NoZWxsLCBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCkpOwotLy8JCWFzc2VydFNhbWUoCi0vLwkJCQkiVGhlIGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93IG11c3QgYmUgdGhlIHdpbmRvdyBjcmVhdGVkIGluIHRoaXMgdGVzdC4gIElmIHlvdSBhcmUgYWN0aXZhdGluZyBvdGhlciB3b3JrYmVuY2ggd2luZG93cywgdGhlbiB0aGlzIHRlc3Qgd2lsbCBmYWlsIiwKLS8vCQkJCXdpbmRvd1NoZWxsLCBmV29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotLy8JCWZpbmFsIE9iamVjdCByZXN1bHQgPSBjb21tYW5kLmV4ZWN1dGUobmV3IEhhc2hNYXAoKSk7Ci0vLwkJYXNzZXJ0U2FtZSgKLS8vCQkJCSJUaGUgd2luZG93IGhhbmRsZXIgd2FzIG5vdCBjaG9zZW4gd2hlbiBib3RoIGEgZGlhbG9nIHdhcyBvcGVuIHdpdGggbm8gaGFuZGxlciwgYnV0IHRoZSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdyBkaWQgaGF2ZSBhIGhhbmRsZXIuIiwKLS8vCQkJCXdpbmRvd1Jlc3VsdCwgcmVzdWx0KTsKLS8vCi0vLwkJLy8gQ2xvc2UgdGhlIGRpYWxvZyBhbmQgbGV0IHRoZSBldmVudCBsb29wIHNwaW4uCi0vLwkJY29tbWFuZFN1cHBvcnQucmVtb3ZlSGFuZGxlclN1Ym1pc3Npb24od2luZG93U3VibWlzc2lvbik7Ci0vLwkJY29udGV4dFN1cHBvcnQudW5yZWdpc3RlclNoZWxsKGRpYWxvZ1NoZWxsKTsKLS8vCQlkaWFsb2dTaGVsbC5jbG9zZSgpOwotLy8JCXdoaWxlIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotLy8JCQk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCBpZiBhIGRpYWxvZyBpcyBvcGVuLCB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5vdCBmYWxsIGJhY2sKLQkgKiB0byB0aGUgZGlhbG9nLiBUaGUgc2V0LXVwIGlzIGEgd29ya2JlbmNoIHdpbmRvdyB3aXRoIGEgaGFuZGxlciByZWdpc3RlcmVkCi0JICogZm9yIHRoZSBjb21tYW5kIHRvIHRlc3QuIFRoZW4gdGhlcmUgaXMgYSBkaWFsb2cgb3BlbmVkLCBidXQgd2l0aCBubwotCSAqIGhhbmRsZXIuIFRoZSB0ZXN0IGlzIHRvIHNlZSB0aGF0IG5vIGhhbmRsZXIgaXMgYWN0aXZlLgotCSAqIAotCSAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBhbmQgaW5kaWNhdGVzIGEgcHJvYmxlbSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgIHRlc3QuCi0JICogQHRocm93cyBOb3RIYW5kbGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgbm8gaGFuZGxlciB3YXMgZm91bmQgd2hlcmUgb25lIHNob3VsZCBoYXZlCi0JICogICAgICAgICAgICAgYmVlbiBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RmFsbGJhY2tUb1dpbmRvd0Jsb2NrZWRCeURpYWxvZygpCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBOb3RIYW5kbGVkRXhjZXB0aW9uIHsKLQkJLy8gT3BlbiBhIHRlc3Qgd2luZG93LgotCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0KLQkJLy8gRGVmaW5lIGEgaGFuZGxlciBmb3Igc29tZSByYW5kb20gY29tbWFuZCBpZGVudGlmaWVyLgotCQlmaW5hbCBPYmplY3Qgd2luZG93UmVzdWx0ID0gbmV3IE9iamVjdCgpOwotCQlmaW5hbCBJSGFuZGxlciB3aW5kb3dIYW5kbGVyID0gbmV3IEFic3RyYWN0SGFuZGxlcigpIHsKLQotCQkJcHVibGljIE9iamVjdCBleGVjdXRlKE1hcCBwYXJhbWV0ZXJWYWx1ZXNCeU5hbWUpCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCS8vIERvIG5vdGhpbmcuCi0JCQkJcmV0dXJuIHdpbmRvd1Jlc3VsdDsKLQkJCX0KLQkJfTsKLQkJZmluYWwgSVdvcmtiZW5jaENvbW1hbmRTdXBwb3J0IGNvbW1hbmRTdXBwb3J0ID0gZldvcmtiZW5jaAotCQkJCS5nZXRDb21tYW5kU3VwcG9ydCgpOwotCQlmaW5hbCBTdHJpbmcgY29tbWFuZElkID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLkJ1ZzY2MTgyIjsKLQkJZmluYWwgU2hlbGwgd2luZG93U2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJZmluYWwgSGFuZGxlclN1Ym1pc3Npb24gd2luZG93U3VibWlzc2lvbiA9IG5ldyBIYW5kbGVyU3VibWlzc2lvbihudWxsLAotCQkJCXdpbmRvd1NoZWxsLCBudWxsLCBjb21tYW5kSWQsIHdpbmRvd0hhbmRsZXIsIFByaW9yaXR5Lk1FRElVTSk7Ci0JCWNvbW1hbmRTdXBwb3J0LmFkZEhhbmRsZXJTdWJtaXNzaW9uKHdpbmRvd1N1Ym1pc3Npb24pOwotCi0JCS8vIE9wZW4gYSBkaWFsb2cuCi0JCWZpbmFsIFNoZWxsIGRpYWxvZ1NoZWxsID0gbmV3IFNoZWxsKHdpbmRvd1NoZWxsKTsKLQkJZGlhbG9nU2hlbGwucGFjaygpOwotCQlkaWFsb2dTaGVsbC5vcGVuKCk7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGRpYWxvZ1NoZWxsLmdldERpc3BsYXkoKTsKLQkJd2hpbGUgKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQk7Ci0KLQkJLy8gQ2hlY2sgdG8gc2VlIHdoaWNoIGhhbmRsZXIgaXMgdGhlIHJpZ2h0IGhhbmRsZXIuCi0JCWZpbmFsIElDb21tYW5kIGNvbW1hbmQgPSBjb21tYW5kU3VwcG9ydC5nZXRDb21tYW5kTWFuYWdlcigpLmdldENvbW1hbmQoCi0JCQkJY29tbWFuZElkKTsKLQkJYXNzZXJ0U2FtZSgKLQkJCQkiVGhlIGFjdGl2ZSBzaGVsbCBtdXN0IGJlIHRoZSBkaWFsb2cuICBJZiB5b3UgYXJlIGFjdGl2YXRpbmcgb3RoZXIgc2hlbGxzIHdoaWxlIHRoaXMgdGVzdCBpcyBydW5uaW5nLCB0aGVuIHRoaXMgdGVzdCB3aWxsIGZhaWwiLAotCQkJCWRpYWxvZ1NoZWxsLCBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCkpOwotCQlhc3NlcnRTYW1lKAotCQkJCSJUaGUgYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3cgbXVzdCBiZSB0aGUgd2luZG93IGNyZWF0ZWQgaW4gdGhpcyB0ZXN0LiAgSWYgeW91IGFyZSBhY3RpdmF0aW5nIG90aGVyIHdvcmtiZW5jaCB3aW5kb3dzLCB0aGVuIHRoaXMgdGVzdCB3aWxsIGZhaWwiLAotCQkJCXdpbmRvd1NoZWxsLCBmV29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotCQlhc3NlcnRUcnVlKAotCQkJCSJXaGVuIGEgZGlhbG9nIGlzIG9wZW4sIGl0IHNob3VsZCBub3QgZmFsbCBiYWNrIHRvIHRoZSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdy4iLAotCQkJCSFjb21tYW5kLmlzSGFuZGxlZCgpKTsKLQotCQkvLyBDbG9zZSB0aGUgZGlhbG9nIGFuZCBsZXQgdGhlIGV2ZW50IGxvb3Agc3Bpbi4KLQkJY29tbWFuZFN1cHBvcnQucmVtb3ZlSGFuZGxlclN1Ym1pc3Npb24od2luZG93U3VibWlzc2lvbik7Ci0JCWRpYWxvZ1NoZWxsLmNsb3NlKCk7Ci0JCXdoaWxlIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoYXQgaWYgdGhlIHdvcmtiZW5jaCB3aW5kb3cgaXMgdGhlIGFjdGl2ZSBzaGVsbCwgdGhhdCBpdHMgaGFuZGxlcnMKLQkgKiB3aWxsIHRha2UgcHJpb3JpdHkuIFRoZSBzY2VuYXJpbyBoYXMgdHdvIGhhbmRsZXJzIGRlZmluZWQ6IG9uZSBmb3IgdGhlCi0JICogd29ya2JlbmNoIHdpbmRvdywgYW5kIG9uZSBmb3IgYSBkaWFsb2cgdGhhdCBpcyBub3Qgb3Blbi4gVGhlIHdvcmtiZW5jaAotCSAqIHdpbmRvdyBoYW5kbGVyIHNob3VsZCBiZSB0aGUgYWN0aXZlIGhhbmRsZXIuCi0JICogCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGFuZCBpbmRpY2F0ZXMgYSBwcm9ibGVtIHdpdGggdGhlCi0JICogICAgICAgICAgICAgdGVzdC4KLQkgKiBAdGhyb3dzIE5vdEhhbmRsZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCBubyBoYW5kbGVyIHdhcyBmb3VuZCB3aGVyZSBvbmUgc2hvdWxkIGhhdmUKLQkgKiAgICAgICAgICAgICBiZWVuIGZvdW5kLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RXaW5kb3coKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLAotCQkJTm90SGFuZGxlZEV4Y2VwdGlvbiB7Ci0JCS8vIE9wZW4gYSB0ZXN0IHdpbmRvdy4KLS8vCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0vLwotLy8JCS8vIERlZmluZSBhIGhhbmRsZXIgZm9yIHNvbWUgcmFuZG9tIGNvbW1hbmQgaWRlbnRpZmllci4KLS8vCQlmaW5hbCBPYmplY3Qgd2luZG93UmVzdWx0ID0gbmV3IE9iamVjdCgpOwotLy8JCWZpbmFsIElIYW5kbGVyIHdpbmRvd0hhbmRsZXIgPSBuZXcgQWJzdHJhY3RIYW5kbGVyKCkgewotLy8KLS8vCQkJcHVibGljIE9iamVjdCBleGVjdXRlKE1hcCBwYXJhbWV0ZXJWYWx1ZXNCeU5hbWUpCi0vLwkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0vLwkJCQkvLyBEbyBub3RoaW5nLgotLy8JCQkJcmV0dXJuIHdpbmRvd1Jlc3VsdDsKLS8vCQkJfQotLy8JCX07Ci0vLwkJZmluYWwgSVdvcmtiZW5jaENvbW1hbmRTdXBwb3J0IGNvbW1hbmRTdXBwb3J0ID0gZldvcmtiZW5jaAotLy8JCQkJLmdldENvbW1hbmRTdXBwb3J0KCk7Ci0vLwkJZmluYWwgU3RyaW5nIGNvbW1hbmRJZCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5CdWc2NjE4MiI7Ci0vLwkJZmluYWwgU2hlbGwgd2luZG93U2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLS8vCQlmaW5hbCBIYW5kbGVyU3VibWlzc2lvbiB3aW5kb3dTdWJtaXNzaW9uID0gbmV3IEhhbmRsZXJTdWJtaXNzaW9uKG51bGwsCi0vLwkJCQl3aW5kb3dTaGVsbCwgbnVsbCwgY29tbWFuZElkLCB3aW5kb3dIYW5kbGVyLCBQcmlvcml0eS5NRURJVU0pOwotLy8JCWNvbW1hbmRTdXBwb3J0LmFkZEhhbmRsZXJTdWJtaXNzaW9uKHdpbmRvd1N1Ym1pc3Npb24pOwotLy8KLS8vCQkvLyBDcmVhdGUgYSBkaWFsb2cuCi0vLwkJZmluYWwgU2hlbGwgZGlhbG9nU2hlbGwgPSBuZXcgU2hlbGwod2luZG93U2hlbGwpOwotLy8KLS8vCQkvKgotLy8JCSAqIERlZmluZSBhIGhhbmRsZXIgZm9yIHRoZSBzYW1lIGNvbW1hbmQgaWRlbnRpZmllciwgYnV0IGZvciB0aGlzCi0vLwkJICogZGlhbG9nLgotLy8JCSAqLwotLy8JCWZpbmFsIE9iamVjdCBkaWFsb2dSZXN1bHQgPSBuZXcgT2JqZWN0KCk7Ci0vLwkJZmluYWwgSUhhbmRsZXIgZGlhbG9nSGFuZGxlciA9IG5ldyBBYnN0cmFjdEhhbmRsZXIoKSB7Ci0vLwotLy8JCQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoTWFwIHBhcmFtZXRlclZhbHVlc0J5TmFtZSkKLS8vCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLS8vCQkJCS8vIERvIG5vdGhpbmcuCi0vLwkJCQlyZXR1cm4gZGlhbG9nUmVzdWx0OwotLy8JCQl9Ci0vLwkJfTsKLS8vCQlmaW5hbCBIYW5kbGVyU3VibWlzc2lvbiBkaWFsb2dTdWJtaXNzaW9uID0gbmV3IEhhbmRsZXJTdWJtaXNzaW9uKG51bGwsCi0vLwkJCQlkaWFsb2dTaGVsbCwgbnVsbCwgY29tbWFuZElkLCBkaWFsb2dIYW5kbGVyLCBQcmlvcml0eS5NRURJVU0pOwotLy8JCWNvbW1hbmRTdXBwb3J0LmFkZEhhbmRsZXJTdWJtaXNzaW9uKGRpYWxvZ1N1Ym1pc3Npb24pOwotLy8KLS8vCQkvLyBDaGVjayB0byBzZWUgd2hpY2ggaGFuZGxlciBpcyB0aGUgcmlnaHQgaGFuZGxlci4KLS8vCQlmaW5hbCBJQ29tbWFuZCBjb21tYW5kID0gY29tbWFuZFN1cHBvcnQuZ2V0Q29tbWFuZE1hbmFnZXIoKS5nZXRDb21tYW5kKAotLy8JCQkJY29tbWFuZElkKTsKLS8vCQlhc3NlcnRTYW1lKAotLy8JCQkJIlRoZSBhY3RpdmUgc2hlbGwgbXVzdCBiZSB0aGUgZGlhbG9nLiAgSWYgeW91IGFyZSBhY3RpdmF0aW5nIG90aGVyIHNoZWxscyB3aGlsZSB0aGlzIHRlc3QgaXMgcnVubmluZywgdGhlbiB0aGlzIHRlc3Qgd2lsbCBmYWlsIiwKLS8vCQkJCXdpbmRvd1NoZWxsLCBmV29ya2JlbmNoLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLS8vCQlhc3NlcnRTYW1lKAotLy8JCQkJIlRoZSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdyBtdXN0IGJlIHRoZSB3aW5kb3cgY3JlYXRlZCBpbiB0aGlzIHRlc3QuICBJZiB5b3UgYXJlIGFjdGl2YXRpbmcgb3RoZXIgd29ya2JlbmNoIHdpbmRvd3MsIHRoZW4gdGhpcyB0ZXN0IHdpbGwgZmFpbCIsCi0vLwkJCQl3aW5kb3dTaGVsbCwgZldvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLS8vCQlmaW5hbCBPYmplY3QgcmVzdWx0ID0gY29tbWFuZC5leGVjdXRlKG5ldyBIYXNoTWFwKCkpOwotLy8JCWFzc2VydFNhbWUoCi0vLwkJCQkiVGhlIHdpbmRvdyBoYW5kbGVyIHdhcyBub3QgY2hvc2VuIHdoZW4gYm90aCBhIGRpYWxvZyB3YXMgb3BlbiB3aXRoIG5vIGhhbmRsZXIsIGJ1dCB0aGUgYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3cgZGlkIGhhdmUgYSBoYW5kbGVyLiIsCi0vLwkJCQl3aW5kb3dSZXN1bHQsIHJlc3VsdCk7Ci0vLwotLy8JCS8vIENsb3NlIHRoZSBkaWFsb2cgYW5kIGxldCB0aGUgZXZlbnQgbG9vcCBzcGluLgotLy8JCWNvbW1hbmRTdXBwb3J0LnJlbW92ZUhhbmRsZXJTdWJtaXNzaW9uKHdpbmRvd1N1Ym1pc3Npb24pOwotLy8JCWRpYWxvZ1NoZWxsLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbW1hbmRzL0J1ZzcwNTAzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb21tYW5kcy9CdWc3MDUwM1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlNGY4Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbW1hbmRzL0J1ZzcwNTAzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZXRhcmdldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5BY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRoaXMgdGVzdCB3aGV0aGVyIGFuIEFjdGlvbkhhbmRsZXIgd2lsbCB1cGRhdGUgaXRzIGludGVybmFsIGNhY2hlIG9mCi0gKiBwcm9wZXJ0aWVzIHdoZW4gYSBSZXRhcmdldEFjdGlvbiBjaGFuZ2VzIG9ubHkgaXRzIGhhbmRsZXIuCi0gKiAKLSAqIEBzaW5jZSAzLjAuMQotICovCi1wdWJsaWMgY2xhc3MgQnVnNzA1MDNUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIGNsYXNzIFB1YmxpY2x5UmV0YXJnZXR0YWJsZUFjdGlvbiBleHRlbmRzIFJldGFyZ2V0QWN0aW9uIHsKLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+UHVibGljbHlSZXRhcmdldHRhYmxlQWN0aW9uPC9jb2RlPi4KLQkJICogCi0JCSAqIEBwYXJhbSBhY3Rpb25JRAotCQkgKiAgICAgICAgICAgIFRoZSBhY3Rpb24gaWRlbnRpZmllciB0byBwYXNzIHRvIHRoZQotCQkgKiAgICAgICAgICAgIDxjb2RlPlJldGFyZ2V0QWN0aW9uPC9jb2RlPjsgc2hvdWxkIG5vdCBiZQotCQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCQkgKiBAcGFyYW0gdGV4dAotCQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgYWN0aW9uOyBtYXkgYmUKLQkJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBzaG91bGQgYmUgbm8gdGV4dC4KLQkJICovCi0JCXB1YmxpYyBQdWJsaWNseVJldGFyZ2V0dGFibGVBY3Rpb24oU3RyaW5nIGFjdGlvbklELCBTdHJpbmcgdGV4dCkgewotCQkJc3VwZXIoYWN0aW9uSUQsIHRleHQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEEgcHVibGljIHZlcnNpb24gb2YgdGhlIDxjb2RlPnNldEFjdGlvbkhhbmRsZXI8L2NvZGU+IG1ldGhvZC4KLQkJICogCi0JCSAqIEBwYXJhbSBoYW5kbGVyCi0JCSAqICAgICAgICAgICAgVGhlIG5ldyBhY3Rpb24gaGFuZGxlcjsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JCSAqICAgICAgICAgICAgdGhlcmUgaXMgbm8gaGFuZGxlciBjdXJyZW50bHkuCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIHZvaWQgY2hhbmdlSGFuZGxlcihmaW5hbCBJQWN0aW9uIGhhbmRsZXIpIHsKLQkJCXN1cGVyLnNldEFjdGlvbkhhbmRsZXIoaGFuZGxlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQnVnNzA1MDNUZXN0LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotCSAqLwotCXB1YmxpYyBCdWc3MDUwM1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciBjaGFuZ2luZyBvbmx5IHRoZSBoYW5kbGVyIHdpbGwgdXBkYXRlIGFuIGFjdGlvbiBoYW5kbGVyLgotCSAqIFRoZSBzZXQgdXAgaXMgYSA8Y29kZT5SZXRhcmdldEFjdGlvbjwvY29kZT4gd3JhcHBlZCBpbiBhbgotCSAqIDxjb2RlPkFjdGlvbkhhbmRsZXI8L2NvZGU+LiBUaGUgdGVzdCB2ZXJpZmllcyBhIHN3aXRjaCBiYWNrIGFuZCBmb3J0aAotCSAqIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB1cGRhdGVzIGFyZSBoYXBwZW5pbmcuCi0JICogIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RIYW5kbGVyQ2hhbmdlQ2F1c2VzVXBkYXRlKCkgewotCQlmaW5hbCBQdWJsaWNseVJldGFyZ2V0dGFibGVBY3Rpb24gcmV0YXJnZXRBY3Rpb24gPSBuZXcgUHVibGljbHlSZXRhcmdldHRhYmxlQWN0aW9uKAotCQkJCSJhY3Rpb25JRCIsICJ0ZXh0Iik7Ci0JCWZpbmFsIEFjdGlvbkhhbmRsZXIgYWN0aW9uSGFuZGxlciA9IG5ldyBBY3Rpb25IYW5kbGVyKHJldGFyZ2V0QWN0aW9uKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSByZXRhcmdldCBhY3Rpb24gaGFuZGxlciBzaG91bGQgc3RhcnQgJ3VuaGFuZGxlZCciLAotCQkJCSgoQm9vbGVhbikgYWN0aW9uSGFuZGxlci5nZXRBdHRyaWJ1dGVWYWx1ZXNCeU5hbWUoKS5nZXQoCi0JCQkJCQkiaGFuZGxlZCIpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCXJldGFyZ2V0QWN0aW9uLmNoYW5nZUhhbmRsZXIobmV3IFB1YmxpY2x5UmV0YXJnZXR0YWJsZUFjdGlvbigKLQkJCQkiYWN0aW9uSUQiLCAidGV4dCIpKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCQkiVGhlIHJldGFyZ2V0IGFjdGlvbiBoYW5kbGVyIHNob3VsZCByZWNvZ25pemUgdGhlIG5ldyBoYW5kbGVyLiIsCi0JCQkJKChCb29sZWFuKSBhY3Rpb25IYW5kbGVyLmdldEF0dHJpYnV0ZVZhbHVlc0J5TmFtZSgpLmdldCgKLQkJCQkJCSJoYW5kbGVkIikpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJcmV0YXJnZXRBY3Rpb24uY2hhbmdlSGFuZGxlcihudWxsKTsKLQkJYXNzZXJ0RmFsc2UoCi0JCQkJIlRoZSByZXRhcmdldCBhY3Rpb24gaGFuZGxlciBzaG91bGQgcmVjb2duaXplIHRoYXQgdGhlIGhhbmRsZXIgaXMgbm93IGdvbmUuIiwKLQkJCQkoKEJvb2xlYW4pIGFjdGlvbkhhbmRsZXIuZ2V0QXR0cmlidXRlVmFsdWVzQnlOYW1lKCkuZ2V0KAotCQkJCQkJImhhbmRsZWQiKSkuYm9vbGVhblZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQnVnNzM3NTZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbW1hbmRzL0J1ZzczNzU2VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmM3MWExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQnVnNzM3NTZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5FeHRlcm5hbEFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIEEgdGVzdHMgd2hldGhlciBpcyBhY3RpdmUgd2lsbCBsb2cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGlzIG5vdAotICogZGVmaW5lZC4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQnVnNzM3NTZUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIGEgbG9nIG1lc3NhZ2UgaGFzIG9jY3VycmVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBsb2dXcml0dGVuID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPkJ1ZzczNzU2VGVzdDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIEJ1ZzczNzU2VGVzdChmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGNhbGxpbmcgPGNvZGU+aXNBY3RpdmUoKTwvY29kZT4gb24gYW4gdW5kZWZpbmVkIGNvbW1hbmQKLSAgICAgKiBjYXVzZXMgYSBsb2cgbWVzc2FnZSB0byBiZSB3cml0dGVuLiBUaGlzIHNpbXBsZSBjYWxscwotICAgICAqIDxjb2RlPmlzQWN0aXZlKCk8L2NvZGU+IGZvciBhIGJvZ3VzIGNvbW1hbmQgaWRlbnRpZmllci4gQSBsb2cgbGlzdGVuZXIKLSAgICAgKiBmbGlwcyBhIGJvb2xlYW4gZmxhZyBpZiBhIGxvZyBtZXNzYWdlIGlzIHdyaXR0ZW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFVuZGVmaW5lZENvbW1hbmRJc0FjdGl2ZUxvZ2dlZCgpIHsKLSAgICAgICAgLy8gQXR0YWNoIHRoZSBsb2cgbGlzdGVuZXIuCi0gICAgICAgIGZpbmFsIElMb2cgbG9nID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKTsKLSAgICAgICAgZmluYWwgSUxvZ0xpc3RlbmVyIGxvZ0xpc3RlbmVyID0gbmV3IElMb2dMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGxvZ2dpbmcoSVN0YXR1cyBzdGF0dXMsIFN0cmluZyBwbHVnaW4pIHsKLSAgICAgICAgICAgICAgICBsb2dXcml0dGVuID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbG9nLmFkZExvZ0xpc3RlbmVyKGxvZ0xpc3RlbmVyKTsKLQotICAgICAgICAvLyBDaGVjayBpZiBhIGJvZ3VzIGNvbW1hbmQgaXMgYWN0aXZlLgotICAgICAgICBFeHRlcm5hbEFjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDYWxsYmFjaygpLmlzQWN0aXZlKAotICAgICAgICAgICAgICAgICJhIGNvbW1hbmQgdGhhdCBpcyBub3QgZGVmaW5lZCIpOwotCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbG9nIHdhcyB3cml0dGVuIHRvLgotICAgICAgICBhc3NlcnRUcnVlKCJBIHdhcm5pbmcgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQuIiwgbG9nV3JpdHRlbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb21tYW5kcy9CdWc3NDk4MlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQnVnNzQ5ODJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzIxYmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb21tYW5kcy9CdWc3NDk4MlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSVdvcmtiZW5jaENvbW1hbmRTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLk5vdEhhbmRsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogQSB0ZXN0IGZvciB3aGV0aGVyIHRoZSBzZWxlY3QgYWxsIGhhbmRsZXIgd2lsbCBzZW5kIGEgc2VsZWN0aW9uIGV2ZW50LgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCdWc3NDk4MlRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiBldmVudCBoYXMgYmVlbiBmaXJlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2VsZWN0aW9uRXZlbnRGaXJlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5CdWc3NDk4MlRlc3Q8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBCdWc3NDk4MlRlc3QoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgPGNvZGU+U2VsZWN0QWxsSGFuZGxlcjwvY29kZT4gdHJpZ2dlcnMgYSBzZWxlY3Rpb24KLSAgICAgKiBldmVudC4gQ3JlYXRlcyBhIGRpYWxvZyB3aXRoIGEgdGV4dCB3aWRnZXQsIGdpdmVzIHRoZSB0ZXh0IHdpZGdldCBmb2N1cywKLSAgICAgKiBhbmQgdGhlbiBjYWxscyB0aGUgc2VsZWN0IGFsbCBjb21tYW5kLiBUaGlzIHNob3VsZCB0aGVuIGNhbGwgdGhlCi0gICAgICogPGNvZGU+U2VsZWN0QWxsSGFuZGxlcjwvY29kZT4gYW5kIHRyaWdnZXIgYSBzZWxlY3Rpb24gZXZlbnQuCi0gICAgICogCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgPGNvZGU+U2VsZWN0QWxsSGFuZGxlcjwvY29kZT4gaXMgYnJva2VuIGluIHNvbWUgd2F5LgotICAgICAqIEB0aHJvd3MgTm90SGFuZGxlZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBkaWFsb2cgZG9lcyBub3QgaGF2ZSBmb2N1cywgb3IgaWYgdGhlCi0gICAgICogICAgICAgICAgICAgPGNvZGU+V29ya2JlbmNoQ29tbWFuZFN1cHBvcnQ8L2NvZGU+IGNsYXNzIGlzIGJyb2tlbiBpbgotICAgICAqICAgICAgICAgICAgIHNvbWUgd2F5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZWxlY3RBbGxIYW5kbGVyU2VuZHNTZWxlY3Rpb25FdmVudCgpCi0gICAgICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBOb3RIYW5kbGVkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgZGlhbG9nIHdpdGggYSB0ZXh0IHdpZGdldC4KLSAgICAgICAgZmluYWwgU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsKGZXb3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLSAgICAgICAgICAgICAgICAuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGRpYWxvZy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KGRpYWxvZywgU1dULlNJTkdMRSk7Ci0gICAgICAgIHRleHQuc2V0VGV4dCgiTW9vb29vb29vb29vb29vb29vb29vb29vb29vb29vIik7Ci0gICAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0gICAgICAgIHRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uRXZlbnRGaXJlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIE9wZW4gdGhlIGRpYWxvZyBhbmQgZ2l2ZSB0aGUgdGV4dCB3aWRnZXQgZm9jdXMuCi0gICAgICAgIGRpYWxvZy5wYWNrKCk7Ci0gICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIHRleHQuc2V0Rm9jdXMoKTsKLQotICAgICAgICAvLyBTcGluIHRoZSBldmVudCBsb29wIHRvIG1ha2Ugc3VyZSBmb2N1cyBpcyBzZXQtdXAgcHJvcGVybHkuCi0gICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGZXb3JrYmVuY2guZ2V0RGlzcGxheSgpOwotICAgICAgICB3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotICAgICAgICAJLy8gRG8gbm90aGluZwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBzZWxlY3QgYWxsIGNvbW1hbmQgYW5kIGV4ZWN1dGUgaXQuCi0gICAgICAgIGZpbmFsIElXb3JrYmVuY2hDb21tYW5kU3VwcG9ydCBjb21tYW5kU3VwcG9ydCA9IGZXb3JrYmVuY2gKLSAgICAgICAgICAgICAgICAuZ2V0Q29tbWFuZFN1cHBvcnQoKTsKLSAgICAgICAgZmluYWwgSUNvbW1hbmQgc2VsZWN0QWxsQ29tbWFuZCA9IGNvbW1hbmRTdXBwb3J0LmdldENvbW1hbmRNYW5hZ2VyKCkKLSAgICAgICAgICAgICAgICAuZ2V0Q29tbWFuZCgib3JnLmVjbGlwc2UudWkuZWRpdC5zZWxlY3RBbGwiKTsKLSAgICAgICAgc2VsZWN0QWxsQ29tbWFuZC5leGVjdXRlKG51bGwpOwotCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgc2VsZWN0aW9uIGV2ZW50IGhhcyBiZWVuIGZpcmVkLgotICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICJUaGUgc2VsZWN0aW9uIGV2ZW50IHdhcyBub3QgZmlyZWQgd2hlbiB0aGUgU2VsZWN0QWxsSGFuZGxlciB3YXMgdXNlZC4iLAotICAgICAgICAgICAgICAgIHNlbGVjdGlvbkV2ZW50RmlyZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQnVnNzQ5OTBUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbW1hbmRzL0J1Zzc0OTkwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDgyYzE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQnVnNzQ5OTBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLkhhbmRsZXJTdWJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklXb3JrYmVuY2hDb21tYW5kU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5Qcmlvcml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBBIHRlc3QgZm9yIHdoZXRoZXIgcGFydCBpZGVudGlmaWVycyB3b3JrIHByb3Blcmx5IGZvciBIYW5kbGVyU3VibWlzc2lvbnMuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJ1Zzc0OTkwVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5CdWc3NDk5MFRlc3Q8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotCSAqLwotCXB1YmxpYyBCdWc3NDk5MFRlc3QoZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciBhIHBhcnQtc3BlY2lmaWMgaGFuZGxlciAtLSBzdWJtaXR0ZWQgdmlhIEphdmEgY29kZSAtLSBpcwotCSAqIG1hdGNoZWQgcHJvcGVybHkuIFRoaXMgaXMgb25seSB1c2luZyB0aGUgcGFydCBpZC4gVGhlIHRlc3QgdmVyaWZpZXMgdGhhdAotCSAqIGl0IGlzIGFjdGl2ZSB3aGVuIHRoZSBwYXJ0IGlzIGFjdGl2ZSwgYW5kIG5vdCBhY3RpdmUgd2hlbiB0aGUgcGFydCBpcyBub3QKLQkgKiBhY3RpdmUuCi0JICogCi0JICogQHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHNvbWV0aGluZyBnb2VzIHdyb25nIGNyZWF0aW5nIHRoZSBwYXJ0IHRvIHdoaWNoIHRoaXMKLQkgKiAgICAgICAgICAgICBoYW5kbGVyIGlzIHRpZWQuCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdFBhcnRJZFN1Ym1pc3Npb24oKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQkvLyBEZWZpbmUgYSBjb21tYW5kLgotCQlmaW5hbCBTdHJpbmcgdGVzdENvbW1hbmRJZCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kcy5CdWc3NDk5MCI7Ci0JCWZpbmFsIElXb3JrYmVuY2hDb21tYW5kU3VwcG9ydCBjb21tYW5kU3VwcG9ydCA9IGZXb3JrYmVuY2gKLQkJCQkuZ2V0Q29tbWFuZFN1cHBvcnQoKTsKLQkJZmluYWwgSUNvbW1hbmQgdGVzdENvbW1hbmQgPSBjb21tYW5kU3VwcG9ydC5nZXRDb21tYW5kTWFuYWdlcigpCi0JCQkJLmdldENvbW1hbmQodGVzdENvbW1hbmRJZCk7Ci0KLQkJLy8gQ3JlYXRlIGEgaGFuZGxlciBzdWJtaXNzaW9uLgotCQlmaW5hbCBJSGFuZGxlciBoYW5kbGVyID0gbmV3IEFic3RyYWN0SGFuZGxlcigpIHsKLQkJCXB1YmxpYyBmaW5hbCBPYmplY3QgZXhlY3V0ZShmaW5hbCBNYXAgcGFyYW1ldGVyVmFsdWVzQnlOYW1lKQotCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkvLyBEbyBub3RoaW5nLgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlmaW5hbCBIYW5kbGVyU3VibWlzc2lvbiB0ZXN0U3VibWlzc2lvbiA9IG5ldyBIYW5kbGVyU3VibWlzc2lvbigKLQkJCQkib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydCIsIG51bGwsIG51bGwsCi0JCQkJdGVzdENvbW1hbmRJZCwgaGFuZGxlciwgUHJpb3JpdHkuTUVESVVNKTsKLQkJY29tbWFuZFN1cHBvcnQuYWRkSGFuZGxlclN1Ym1pc3Npb24odGVzdFN1Ym1pc3Npb24pOwotCi0JCXRyeSB7Ci0JCQkvLyBUZXN0IHRvIG1ha2Ugc3VyZSB0aGUgY29tbWFuZCBpcyBub3QgY3VycmVudGx5IGhhbmRsZWQuCi0JCQlhc3NlcnRUcnVlKCJUaGUgTW9ja1ZpZXdQYXJ0IGNvbW1hbmQgc2hvdWxkIG5vdCBiZSBoYW5kbGVkIiwKLQkJCQkJIXRlc3RDb21tYW5kLmlzSGFuZGxlZCgpKTsKLQotCQkJLyoKLQkJCSAqIE9wZW4gYSB3aW5kb3cgd2l0aCB0aGUgTW9ja1ZpZXdQYXJ0LCBhbmQgbWFrZSBzdXJlIGl0IGlzIG5vdwotCQkJICogaGFuZGxlZC4KLQkJCSAqLwotCQkJZmluYWwgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG9wZW5UZXN0V2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJZmluYWwgSVZpZXdQYXJ0IG9wZW5lZFZpZXcgPSBwYWdlCi0JCQkJCS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydCIpOwotCQkJcGFnZS5hY3RpdmF0ZShvcGVuZWRWaWV3KTsKLQkJCXdoaWxlIChmV29ya2JlbmNoLmdldERpc3BsYXkoKS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCQkJCS8vIFJlYWQgdGhlIGV2ZW50IHF1ZXVlCi0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJUaGUgTW9ja1ZpZXdQYXJ0IGNvbW1hbmQgc2hvdWxkIGJlIGhhbmRsZWQiLAotCQkJCQl0ZXN0Q29tbWFuZC5pc0hhbmRsZWQoKSk7Ci0KLQkJCS8vIEhpZGUgdGhlIHZpZXcsIGFuZCB0ZXN0IHRoYXQgaXMgYmVjb21lcyB1bmhhbmRsZWQgYWdhaW4uCi0JCQlwYWdlLmhpZGVWaWV3KG9wZW5lZFZpZXcpOwotCQkJd2hpbGUgKGZXb3JrYmVuY2guZ2V0RGlzcGxheSgpLnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJLy8gUmVhZCB0aGUgZXZlbnQgcXVldWUKLQkJCX0KLQkJCWFzc2VydFRydWUoIlRoZSBNb2NrVmlld1BhcnQgY29tbWFuZCBzaG91bGQgbm90IGJlIGhhbmRsZWQiLAotCQkJCQkhdGVzdENvbW1hbmQuaXNIYW5kbGVkKCkpOwotCi0JCX0gZmluYWxseSB7Ci0JCQljb21tYW5kU3VwcG9ydC5yZW1vdmVIYW5kbGVyU3VibWlzc2lvbih0ZXN0U3VibWlzc2lvbik7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQnVnODc4NTZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbW1hbmRzL0J1Zzg3ODU2VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjRlODAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQnVnODc4NTZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLkhhbmRsZXJTdWJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklDb21tYW5kU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JV29ya2JlbmNoQ29tbWFuZFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGhpcyB0ZXN0cyB3aGV0aGVyIHdlIGFyZSBsZWFraW5nIGhhbmRsZXJzIGFmdGVyIHRoZWlyIHN1Ym1pc3Npb24gaGFzIGJlZW4KLSAqIHJlbW92ZWQuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIEJ1Zzg3ODU2VGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5CdWc4Nzg1NlRlc3Q8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotCSAqLwotCXB1YmxpYyBCdWc4Nzg1NlRlc3QoZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgd29ya2JlbmNoIGNvbW1hbmQgc3VwcG9ydCAob3IgaXRzIGRlcGVuZGVuY2llcykgd2lsbAotCSAqIGxlYWsgaGFuZGxlcnMgd2hlbiB0aGUgcHJvY2VzcyBsb29wIGlzIHJ1bi4gQmFzaWNhbGx5LCB3ZSdyZSBjaGVja2luZyB0bwotCSAqIHNlZSB0aGF0IHJlbW92aW5nIGEgaGFuZGxlciBzdWJtaXNzaW9uIHJlYWxseSB3b3Jrcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SGFuZGxlckxlYWsoKSB7Ci0JCWZpbmFsIElXb3JrYmVuY2hDb21tYW5kU3VwcG9ydCBjb21tYW5kU3VwcG9ydCA9IGZXb3JrYmVuY2gKLQkJCQkuZ2V0Q29tbWFuZFN1cHBvcnQoKTsKLQkJZmluYWwgSUNvbW1hbmRTZXJ2aWNlIGNvbW1hbmRTZXJ2aWNlID0gKElDb21tYW5kU2VydmljZSkgZldvcmtiZW5jaAotCQkJCS5nZXRBZGFwdGVyKElDb21tYW5kU2VydmljZS5jbGFzcyk7Ci0JCWZpbmFsIFN0cmluZyBjb21tYW5kSWQgPSBCdWc4Nzg1NlRlc3QuY2xhc3MuZ2V0TmFtZSgpOwotCQlmaW5hbCBDb21tYW5kIGNvbW1hbmQgPSBjb21tYW5kU2VydmljZS5nZXRDb21tYW5kKGNvbW1hbmRJZCk7Ci0KLQkJLy8gU3VibWl0IGEgaGFuZGxlci4KLQkJSUhhbmRsZXIgaGFuZGxlciA9IG5ldyBBYnN0cmFjdEhhbmRsZXIoKSB7Ci0KLQkJCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShNYXAgcGFyYW1ldGVyVmFsdWVzQnlOYW1lKQotCQkJCQl0aHJvd3Mgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkvLyBEbyBub3RoaW5nCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJfTsKLQkJSGFuZGxlclN1Ym1pc3Npb24gc3VibWlzc2lvbiA9IG5ldyBIYW5kbGVyU3VibWlzc2lvbihudWxsLCBudWxsLCBudWxsLAotCQkJCWNvbW1hbmQuZ2V0SWQoKSwgaGFuZGxlciwgUHJpb3JpdHkuTUVESVVNKTsKLQkJY29tbWFuZFN1cHBvcnQuYWRkSGFuZGxlclN1Ym1pc3Npb24oc3VibWlzc2lvbik7Ci0KLQkJLyoKLQkJICogUmVtb3ZlIHRoZSBoYW5kbGVyIHdpdGggbm8gcmVwbGFjZW1lbnQsIGFuZCBob2xkIG9uIHRvIHRoZSBoYW5kbGVyCi0JCSAqIHZpYSBhIHdlYWsgcmVmZXJlbmNlLgotCQkgKi8KLQkJY29tbWFuZFN1cHBvcnQucmVtb3ZlSGFuZGxlclN1Ym1pc3Npb24oc3VibWlzc2lvbik7Ci0JCXN1Ym1pc3Npb24gPSBudWxsOwotCQlmaW5hbCBXZWFrUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBXZWFrUmVmZXJlbmNlKGhhbmRsZXIpOwotCQloYW5kbGVyID0gbnVsbDsKLQotCQkvLyBBdHRlbXB0IHRvIGZvcmNlIGdhcmJhZ2UgY29sbGVjdGlvbi4KLQkJU3lzdGVtLmdjKCk7Ci0JCVN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKLQkJVGhyZWFkLnlpZWxkKCk7Ci0JCVN5c3RlbS5nYygpOwotCQlTeXN0ZW0ucnVuRmluYWxpemF0aW9uKCk7Ci0JCVRocmVhZC55aWVsZCgpOwotCQlTeXN0ZW0uZ2MoKTsKLQkJU3lzdGVtLnJ1bkZpbmFsaXphdGlvbigpOwotCQlUaHJlYWQueWllbGQoKTsKLQotCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlIHJlZmVyZW5jZSBoYXMgYmVlbiBjbGVhcmVkLgotCQlhc3NlcnRUcnVlKAotCQkJCSJXZSBzaG91bGQgbm90IGhvbGQgb24gdG8gYSBoYW5kbGVyIGFmdGVyIHRoZSBzdWJtaXNzaW9uIGhhcyBiZWVuIHJlbW92ZWQuIiwKLQkJCQlyZWZlcmVuY2UuaXNFbnF1ZXVlZCgpIHx8IChyZWZlcmVuY2UuZ2V0KCkgPT0gbnVsbCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQ29tbWFuZE1hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbW1hbmRzL0NvbW1hbmRNYW5hZ2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2NlNGMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQ29tbWFuZE1hbmFnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQ29tbWFuZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklFeGVjdXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLk5vdEhhbmRsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgc29tZSBvZiB0aGUgQVBJIG9uIGNvbW1hbmQgbWFuYWdlci4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tbWFuZE1hbmFnZXJUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBBbiBleGVjdXRpb24gbGlzdGVuZXIgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlIGNvbW1hbmQgbWFuYWdlci4gSXQKLQkgKiB3aWxsIHRyYWNrIHdoaWNoIGV2ZW50cyBpdCBsYXN0IGhlYXJkLgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIEV4ZWN1dGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSUV4ZWN1dGlvbkxpc3RlbmVyIHsKLQotCQkvKioKLQkJICogVGhlIGxhc3QgY29tbWFuZCBpZGVudGlmaWVyIHRvIGJlIG5vdCBoYW5kbGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCQkgKiBpZiBub25lLgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgbm90SGFuZGxlZElkID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIGxhc3QgY29tbWFuZCBpZGVudGlmaWVyIHRvIGJlIGV4ZWN1dGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCQkgKiBub25lLgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgcHJlRXhlY3V0ZUlkID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIGxhc3Qgbm90IGhhbmRsZWQgZXhjZXB0aW9uIHRocm93LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCQkgKi8KLQkJcHJpdmF0ZSBOb3RIYW5kbGVkRXhjZXB0aW9uIG5vdEhhbmRsZWRFeGNlcHRpb24gPSBudWxsOwotCi0JCS8qKgotCQkgKiBUaGUgbGFzdCBleGVjdXRpb24gZXZlbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JCSAqLwotCQlwcml2YXRlIEV4ZWN1dGlvbkV2ZW50IHByZUV4ZWN1dGVFdmVudCA9IG51bGw7Ci0KLQkJcHVibGljIGZpbmFsIHZvaWQgbm90SGFuZGxlZChmaW5hbCBTdHJpbmcgY29tbWFuZElkLAotCQkJCWZpbmFsIE5vdEhhbmRsZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlub3RIYW5kbGVkSWQgPSBjb21tYW5kSWQ7Ci0JCQlub3RIYW5kbGVkRXhjZXB0aW9uID0gZXhjZXB0aW9uOwotCQl9Ci0KLQkJcHVibGljIGZpbmFsIHZvaWQgcG9zdEV4ZWN1dGVGYWlsdXJlKGZpbmFsIFN0cmluZyBjb21tYW5kSWQsCi0JCQkJZmluYWwgRXhlY3V0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy8gRG8gbm90aGluZy4KLQkJfQotCi0JCXB1YmxpYyBmaW5hbCB2b2lkIHBvc3RFeGVjdXRlU3VjY2VzcyhmaW5hbCBTdHJpbmcgY29tbWFuZElkLAotCQkJCWZpbmFsIE9iamVjdCByZXR1cm5WYWx1ZSkgewotCQkJLy8gRG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIGZpbmFsIHZvaWQgcHJlRXhlY3V0ZShmaW5hbCBTdHJpbmcgY29tbWFuZElkLAotCQkJCWZpbmFsIEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlwcmVFeGVjdXRlSWQgPSBjb21tYW5kSWQ7Ci0JCQlwcmVFeGVjdXRlRXZlbnQgPSBldmVudDsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5Db21tYW5kTWFuYWdlclRlc3Q8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotCSAqLwotCXB1YmxpYyBDb21tYW5kTWFuYWdlclRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RXhlY3V0aW9uTGlzdGVuZXIoKSB7Ci0JCWZpbmFsIFN0cmluZyBjb21tYW5kSWQgPSAibXlDb21tYW5kIjsKLQkJZmluYWwgQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXIgPSBuZXcgQ29tbWFuZE1hbmFnZXIoKTsKLQkJZmluYWwgQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBjb21tYW5kTWFuYWdlci5nZXRDYXRlZ29yeShjb21tYW5kSWQpOwotCQljYXRlZ29yeS5kZWZpbmUoIm5hbWUiLCBudWxsKTsKLQkJZmluYWwgQ29tbWFuZCBjb21tYW5kID0gY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZChjb21tYW5kSWQpOwotCQljb21tYW5kLmRlZmluZSgibmFtZSIsIG51bGwsIGNhdGVnb3J5LCBudWxsKTsKLQkJZmluYWwgRXhlY3V0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXhlY3V0aW9uTGlzdGVuZXIoKTsKLQkJY29tbWFuZE1hbmFnZXIuYWRkRXhlY3V0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKLQkJZmluYWwgRXhlY3V0aW9uRXZlbnQgZXZlbnQgPSBuZXcgRXhlY3V0aW9uRXZlbnQoKTsKLQkJdHJ5IHsKLQkJCWNvbW1hbmQuZXhlY3V0ZShldmVudCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb24gPSBlOwotCQl9IGNhdGNoIChmaW5hbCBOb3RIYW5kbGVkRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQotCQlhc3NlcnRTYW1lKAotCQkJCSJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIHByZS1leGVjdXRlIGV2ZW50IGZvciB0aGUgY29ycmVjdCBjb21tYW5kIiwKLQkJCQljb21tYW5kSWQsIGxpc3RlbmVyLnByZUV4ZWN1dGVJZCk7Ci0JCWFzc2VydFNhbWUoCi0JCQkJIlNob3VsZCBoYXZlIHJlY2VpdmVkIGEgcHJlLWV4ZWN1dGUgZXZlbnQgd2l0aCB0aGUgY29ycmVjdCBldmVudCIsCi0JCQkJZXZlbnQsIGxpc3RlbmVyLnByZUV4ZWN1dGVFdmVudCk7Ci0JCWFzc2VydFNhbWUoCi0JCQkJIlNob3VsZCBoYXZlIHJlY2VpdmVkIGEgbm90LWhhbmRsZWQgZXZlbnQgZm9yIHRoZSBjb3JyZWN0IGNvbW1hbmQiLAotCQkJCWNvbW1hbmRJZCwgbGlzdGVuZXIubm90SGFuZGxlZElkKTsKLQkJYXNzZXJ0U2FtZSgKLQkJCQkiU2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBub3QtaGFuZGxlZCBldmVudCB3aXRoIHRoZSBjb3JyZWN0IGV4Y2VwdGlvbiIsCi0JCQkJZXhjZXB0aW9uLCBsaXN0ZW5lci5ub3RIYW5kbGVkRXhjZXB0aW9uKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQ29tbWFuZFBhcmFtZXRlclR5cGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbW1hbmRzL0NvbW1hbmRQYXJhbWV0ZXJUeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmM5NGJlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQ29tbWFuZFBhcmFtZXRlclR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSVR5cGVkUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuUGFyYW1ldGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlclZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklDb21tYW5kU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIENvbW1hbmRQYXJhbWV0ZXJUeXBlVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTVUJUUkFDVCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kcy5zdWJ0cmFjdEludGVnZXIiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOVUVORCA9ICJtaW51ZW5kIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlRSQUhFTkQgPSAic3VidHJhaGVuZCI7Ci0JCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzLkludGVnZXIiOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+Q29tbWFuZFBhcmFtZXRlclR5cGVUZXN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHRlc3QKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZFBhcmFtZXRlclR5cGVUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIGludm9raW5nIGEgY29tbWFuZCB0aGF0IHN1YnRyYWN0cyBvbmUgbnVtYmVyIGZyb20gYW5vdGhlci4gVGhlCi0JICogaGFuZGxlciBmb3IgdGhlIHN1YnRyYWN0IGNvbW1hbmQgd2lsbCBjb252ZXJ0IHRoZSBzdHJpbmcgcGFyYW1ldGVycyB0bwotCSAqIGludGVnZXJzIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi4gVGhpcyB0ZXN0IGRyaXZlcyBtdWNoIG9mIHRoZSBjb21tYW5kCi0JICogcGFyYW1ldGVyIHR5cGUgaW5mcmFzdHJ1Y3R1cmUgaW5jbHVkaW5nIG9idGFpbmluZyBwYXJhbWV0ZXIgdHlwZXMgYW5kCi0JICogcGVyZm9ybWluZyBzdHJpbmdUb09iamVjdCBhbmQgb2JqZWN0VG9TdHJpbmcgY29udmVyc2lvbnMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFN1YnRyYWN0KCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0ZXN0U3VidHJhY3QoOCwgNSwgMyk7Ci0JCXRlc3RTdWJ0cmFjdCgtNCwgMTIsIC0xNik7Ci0JfQotCQotCS8qKgotCSAqIFRlc3Qgc3VidHJhY3QgYWdhaW4gd2l0aCBpbnZhbGlkIHBhcmFtZXRlcnMgYW5kIGNoZWNrIGZvciBmYWlsdXJlCi0JICogZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTdWJ0cmFjdFR5cGVFcnJvcigpIHsKLQkJdHJ5IHsKLQkJCS8vIHRyeSB0byBwYXNzIGEgQm9vbGVhbiBpbnN0ZWFkIG9mIGFuIEludGVnZXIKLQkJCXRlc3RTdWJ0cmFjdChuZXcgSW50ZWdlcigzKSwgQm9vbGVhbi5GQUxTRSwgMyk7Ci0JCQlmYWlsKCJleHBlY3RlZCBQYXJhbWV0ZXJWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24iKTsKLQkJfQotCQljYXRjaCAoUGFyYW1ldGVyVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBwYXNzZWQKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlmYWlsKCJleHBlY3RlZCBQYXJhbWV0ZXJWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24iKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRoZSBjb21wbGV0ZSBleGVjdXRpb24gZmxvdyBmb3IgdGhlIHN1YnRyYWN0IGNvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdGVzdFN1YnRyYWN0KGludCBtaW51ZW5kLCBpbnQgc3VidHJhaGVuZCwgaW50IGRpZmZlcmVuY2UpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdGVzdFN1YnRyYWN0KG5ldyBJbnRlZ2VyKG1pbnVlbmQpLCBuZXcgSW50ZWdlcihzdWJ0cmFoZW5kKSwgZGlmZmVyZW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdGhlIGNvbXBsZXRlIGV4ZWN1dGlvbiBmbG93IGZvciB0aGUgc3VidHJhY3QgY29tbWFuZAotCSAqLwotCXByaXZhdGUgdm9pZCB0ZXN0U3VidHJhY3QoT2JqZWN0IG1pbnVlbmQsIE9iamVjdCBzdWJ0cmFoZW5kLCBpbnQgZGlmZmVyZW5jZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlJQ29tbWFuZFNlcnZpY2UgY29tbWFuZFNlcnZpY2UgPSBnZXRDb21tYW5kU2VydmljZSgpOwotCQlDb21tYW5kIGNvbW1hbmQgPSBjb21tYW5kU2VydmljZS5nZXRDb21tYW5kKFNVQlRSQUNUKTsKLQotCQkvLyBmaXJzdCBjb252ZXJ0IHRoZSBvYmplY3QgcGFyYW1zIHRvIHN0cmluZ3MKLQkJU3RyaW5nIG1pbnVlbmRTdHIgPSBjb21tYW5kLmdldFBhcmFtZXRlclR5cGUoTUlOVUVORCkKLQkJCQkuZ2V0VmFsdWVDb252ZXJ0ZXIoKS5jb252ZXJ0VG9TdHJpbmcobWludWVuZCk7Ci0JCVN0cmluZyBzdWJ0cmFoZW5kU3RyID0gY29tbWFuZC5nZXRQYXJhbWV0ZXJUeXBlKFNVQlRSQUhFTkQpCi0JCQkJLmdldFZhbHVlQ29udmVydGVyKCkuY29udmVydFRvU3RyaW5nKHN1YnRyYWhlbmQpOwotCi0JCS8vIHNldHVwIHRoZSBwYXJhbWV0ZXJpemF0aW9ucwotCQlQYXJhbWV0ZXJpemF0aW9uIG1pbnVlbmRQYXJhbSA9IG5ldyBQYXJhbWV0ZXJpemF0aW9uKGNvbW1hbmQKLQkJCQkuZ2V0UGFyYW1ldGVyKE1JTlVFTkQpLCBtaW51ZW5kU3RyKTsKLQkJUGFyYW1ldGVyaXphdGlvbiBzdWJ0cmFoZW5kUGFyYW0gPSBuZXcgUGFyYW1ldGVyaXphdGlvbihjb21tYW5kCi0JCQkJLmdldFBhcmFtZXRlcihTVUJUUkFIRU5EKSwgc3VidHJhaGVuZFN0cik7Ci0JCVBhcmFtZXRlcml6YXRpb25bXSBwYXJhbWV0ZXJpemF0aW9ucyA9IG5ldyBQYXJhbWV0ZXJpemF0aW9uW10gewotCQkJCW1pbnVlbmRQYXJhbSwgc3VidHJhaGVuZFBhcmFtIH07Ci0KLQkJLy8gZXhlY3V0ZSB0aGUgY29tbWFuZCBhbmQgY2hlY2sgdGhlIHJlc3VsdAotCQlQYXJhbWV0ZXJpemVkQ29tbWFuZCBwQ29tbWFuZCA9IG5ldyBQYXJhbWV0ZXJpemVkQ29tbWFuZChjb21tYW5kLAotCQkJCXBhcmFtZXRlcml6YXRpb25zKTsKLQkJSW50ZWdlciByZXN1bHQgPSAoSW50ZWdlcikgcENvbW1hbmQuZXhlY3V0ZVdpdGhDaGVja3MobnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhkaWZmZXJlbmNlLCByZXN1bHQuaW50VmFsdWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIEFic3RyYWN0UGFyYW1ldGVyVmFsdWVDb252ZXJ0ZXIuY29udmVydFRvT2JqZWN0IGZvciB0aGUgSW50ZWdlcgotCSAqIGNvbnZlcnRlciB1c2VkIGluIHRoaXMgdGVzdCBzdWl0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFN0cmluZ1RvSW50ZWdlcigpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdGVzdENvbnZlcnRTdHJpbmdUb0ludGVnZXIoIjMzIiwgMzMsIGZhbHNlKTsKLQkJdGVzdENvbnZlcnRTdHJpbmdUb0ludGVnZXIoIi0xIiwgLTEsIGZhbHNlKTsKLQkJdGVzdENvbnZlcnRTdHJpbmdUb0ludGVnZXIoImJsYWgiLCAzMywgdHJ1ZSk7Ci0JCXRlc3RDb252ZXJ0U3RyaW5nVG9JbnRlZ2VyKG51bGwsIDMzLCB0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRlc3RDb252ZXJ0U3RyaW5nVG9JbnRlZ2VyKFN0cmluZyB2YWx1ZSwgaW50IGV4cGVjdGVkLAotCQkJYm9vbGVhbiBleHBlY3RGYWlsKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCUlDb21tYW5kU2VydmljZSBjb21tYW5kU2VydmljZSA9IGdldENvbW1hbmRTZXJ2aWNlKCk7Ci0JCVBhcmFtZXRlclR5cGUgdHlwZSA9IGNvbW1hbmRTZXJ2aWNlLmdldFBhcmFtZXRlclR5cGUoVFlQRSk7Ci0KLQkJT2JqZWN0IGNvbnZlcnRlZCA9IG51bGw7Ci0JCWlmIChleHBlY3RGYWlsKSB7Ci0JCQl0cnkgewotCQkJCWNvbnZlcnRlZCA9IHR5cGUuZ2V0VmFsdWVDb252ZXJ0ZXIoKS5jb252ZXJ0VG9PYmplY3QodmFsdWUpOwotCQkJCWZhaWwoImV4cGVjdGVkIFBhcmFtZXRlclZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiIpOwotCQkJfSBjYXRjaCAoUGFyYW1ldGVyVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gcGFzc2VkCi0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZmFpbCgiZXhwZWN0ZWQgUGFyYW1ldGVyVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0ZWQgPSB0eXBlLmdldFZhbHVlQ29udmVydGVyKCkuY29udmVydFRvT2JqZWN0KHZhbHVlKTsKLQkJfQotCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihleHBlY3RlZCksIGNvbnZlcnRlZCk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIEFic3RyYWN0UGFyYW1ldGVyVmFsdWVDb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nIGZvciB0aGUgSW50ZWdlcgotCSAqIGNvbnZlcnRlciB1c2VkIGluIHRoaXMgdGVzdCBzdWl0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydEludGVnZXJUb1N0cmluZygpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdGVzdENvbnZlcnRJbnRlZ2VyVG9TdHJpbmcobmV3IEludGVnZXIoNiksICI2IiwgZmFsc2UpOwotCQl0ZXN0Q29udmVydEludGVnZXJUb1N0cmluZyhuZXcgSW50ZWdlcigwKSwgIjAiLCBmYWxzZSk7Ci0JCXRlc3RDb252ZXJ0SW50ZWdlclRvU3RyaW5nKG5ldyBJbnRlZ2VyKC0zMiksICItMzIiLCBmYWxzZSk7Ci0JCXRlc3RDb252ZXJ0SW50ZWdlclRvU3RyaW5nKG51bGwsIG51bGwsIHRydWUpOwotCQl0ZXN0Q29udmVydEludGVnZXJUb1N0cmluZyhCb29sZWFuLlRSVUUsIG51bGwsIHRydWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdGVzdENvbnZlcnRJbnRlZ2VyVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBTdHJpbmcgZXhwZWN0ZWQsCi0JCQlib29sZWFuIGV4cGVjdEZhaWwpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJSUNvbW1hbmRTZXJ2aWNlIGNvbW1hbmRTZXJ2aWNlID0gZ2V0Q29tbWFuZFNlcnZpY2UoKTsKLQkJUGFyYW1ldGVyVHlwZSB0eXBlID0gY29tbWFuZFNlcnZpY2UuZ2V0UGFyYW1ldGVyVHlwZShUWVBFKTsKLQotCQlTdHJpbmcgY29udmVydGVkID0gbnVsbDsKLQkJaWYgKGV4cGVjdEZhaWwpIHsKLQkJCXRyeSB7Ci0JCQkJY29udmVydGVkID0gdHlwZS5nZXRWYWx1ZUNvbnZlcnRlcigpLmNvbnZlcnRUb1N0cmluZyh2YWx1ZSk7Ci0JCQkJZmFpbCgiZXhwZWN0ZWQgUGFyYW1ldGVyVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIik7Ci0JCQl9IGNhdGNoIChQYXJhbWV0ZXJWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBwYXNzZWQKLQkJCQlyZXR1cm47Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlmYWlsKCJleHBlY3RlZCBQYXJhbWV0ZXJWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24iKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNvbnZlcnRlZCA9IHR5cGUuZ2V0VmFsdWVDb252ZXJ0ZXIoKS5jb252ZXJ0VG9TdHJpbmcodmFsdWUpOwotCQl9Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgY29udmVydGVkKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgUGFyYW1ldGVyVHlwZS5pc0NvbXBhdGlibGUgZm9yIHZhcmlvdXMgdmFsdWVzIHdpdGggdGhlIEludGVnZXIKLQkgKiBwYXJhbWV0ZXIgdHlwZSB1c2VkIGluIHRoaXMgdGVzdCBzdWl0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDb21wYXRpYmxlKCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlJQ29tbWFuZFNlcnZpY2UgY29tbWFuZFNlcnZpY2UgPSBnZXRDb21tYW5kU2VydmljZSgpOwotCQlQYXJhbWV0ZXJUeXBlIHR5cGUgPSBjb21tYW5kU2VydmljZS5nZXRQYXJhbWV0ZXJUeXBlKFRZUEUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh0eXBlLmlzQ29tcGF0aWJsZShuZXcgSW50ZWdlcig0KSkpOwotCQlhc3NlcnRUcnVlKHR5cGUuaXNDb21wYXRpYmxlKG5ldyBJbnRlZ2VyKDApKSk7Ci0JCWFzc2VydFRydWUodHlwZS5pc0NvbXBhdGlibGUobmV3IEludGVnZXIoLTQzNCkpKTsKLQkJYXNzZXJ0RmFsc2UodHlwZS5pc0NvbXBhdGlibGUobnVsbCkpOwotCQlhc3NlcnRGYWxzZSh0eXBlLmlzQ29tcGF0aWJsZSgiNCIpKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJ5IHRvIGZpbmQgYSBjb21tYW5kIHRoYXQgdGFrZXMgaW50ZWdlcnMgYXMgcGFyYW1ldGVycy4gV2UgbWlnaHQgZmluZAotCSAqIG11bHRpcGxlIGNvbW1hbmRzIC0ganVzdCBtYWtlIHN1cmUgd2UgY2FuIGF0IGxlYXN0IGZpbmQgdGhlIHN1YnRyYWN0Ci0JICogY29tbWFuZCB1c2VkIGVsc2V3aGVyZSBpbiB0aGlzIHRlc3Qgc3VpdGUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZpbmRJbnRlZ2VyUGFyYW1Db21tYW5kKCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlJbnRlZ2VyIHZhbHVlID0gbmV3IEludGVnZXIoNik7Ci0JCQotCQlJQ29tbWFuZFNlcnZpY2UgY29tbWFuZFNlcnZpY2UgPSBnZXRDb21tYW5kU2VydmljZSgpOwotCQlDb21tYW5kW10gY29tbWFuZHMgPSBjb21tYW5kU2VydmljZS5nZXREZWZpbmVkQ29tbWFuZHMoKTsKLQkJCi0JCWJvb2xlYW4gZm91bmRTdWJ0cmFjdCA9IGZhbHNlOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7IGkrKykgewotCQkJQ29tbWFuZCBjb21tYW5kID0gY29tbWFuZHNbaV07Ci0JCQlpZiAoIWNvbW1hbmQuaXNEZWZpbmVkKCkpCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCUlQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gY29tbWFuZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQlpZiAocGFyYW1ldGVycyA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQlpZiAocGFyYW1ldGVycy5sZW5ndGggPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCQotCQkJaWYgKGNoZWNrUGFyYW1UeXBlMShjb21tYW5kLCBwYXJhbWV0ZXJzWzBdLCB2YWx1ZSkKLQkJCQkJJiYgY2hlY2tQYXJhbVR5cGUyKHBhcmFtZXRlcnNbMF0sIHZhbHVlKSkgewotCQkJCWlmIChTVUJUUkFDVC5lcXVhbHMoY29tbWFuZC5nZXRJZCgpKSkgewotCQkJCQlmb3VuZFN1YnRyYWN0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGZvdW5kU3VidHJhY3QpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tQYXJhbVR5cGUxKENvbW1hbmQgY29tbWFuZCwgSVBhcmFtZXRlciBwYXJhbWV0ZXIsCi0JCQlPYmplY3QgdmFsdWUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJUGFyYW1ldGVyVHlwZSB0eXBlID0gY29tbWFuZC5nZXRQYXJhbWV0ZXJUeXBlKHBhcmFtZXRlci5nZXRJZCgpKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHR5cGUuaXNDb21wYXRpYmxlKHZhbHVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrUGFyYW1UeXBlMihJUGFyYW1ldGVyIHBhcmFtZXRlciwgT2JqZWN0IHZhbHVlKQotCQkJdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoIShwYXJhbWV0ZXIgaW5zdGFuY2VvZiBJVHlwZWRQYXJhbWV0ZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlQYXJhbWV0ZXJUeXBlIHR5cGUgPSAoKElUeXBlZFBhcmFtZXRlcikgcGFyYW1ldGVyKS5nZXRQYXJhbWV0ZXJUeXBlKCk7Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0eXBlLmlzQ29tcGF0aWJsZSh2YWx1ZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbW1hbmRTZXJ2aWNlIGdldENvbW1hbmRTZXJ2aWNlKCkgewotCQlPYmplY3Qgc2VydmljZU9iamVjdCA9IGdldFdvcmtiZW5jaCgpLmdldEFkYXB0ZXIoSUNvbW1hbmRTZXJ2aWNlLmNsYXNzKTsKLQkJaWYgKHNlcnZpY2VPYmplY3QgIT0gbnVsbCkgewotCQkJSUNvbW1hbmRTZXJ2aWNlIHNlcnZpY2UgPSAoSUNvbW1hbmRTZXJ2aWNlKSBzZXJ2aWNlT2JqZWN0OwotCQkJcmV0dXJuIHNlcnZpY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb21tYW5kcy9Db21tYW5kU2VyaWFsaXphdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvQ29tbWFuZFNlcmlhbGl6YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjQzNDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb21tYW5kcy9Db21tYW5kU2VyaWFsaXphdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuU2VyaWFsaXphdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSUNvbW1hbmRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3Qgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uIG9mIFBhcmFtZXRlcml6ZWRDb21tYW5kcy4gU2VlIDxhCi0gKiBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwNTIzIj5idWcgMTIwNTIzPC9hPi4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZFNlcmlhbGl6YXRpb25UZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPkNvbW1hbmRTZXJpYWxpemF0aW9uVGVzdDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0JICovCi0JcHVibGljIENvbW1hbmRTZXJpYWxpemF0aW9uVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzaG93UGVyc3BlY3RpdmVDb21tYW5kSWQgPSAib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZSI7Ci0JCi0JLyoqCi0JICogVGVzdCBhIHNlcmlhbGl6YXRpb24gb2YgdGhlIHNob3cgcGVyc3BlY3RpdmUgY29tbWFuZCB3aXRoIG5vIHBhcmFtZXRlcnMuCi0JICogCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZVNob3dQZXJzcGVjdGl2ZSgpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQotCQl0ZXN0RGVzZXJpYWxpemVBbmRTZXJpYWxpemUoc2hvd1BlcnNwZWN0aXZlQ29tbWFuZElkLAotCQkJCXNob3dQZXJzcGVjdGl2ZUNvbW1hbmRJZCwgMCwgbnVsbCwgbnVsbCk7Ci0KLQkJLy8gdGVzdCB3aXRoIHVubmVjZXNzYXJ5IChidXQgdmFsaWQpIHRyYWlsaW5nICIoKSIgY2hhcmFjdGVycwotCQl0ZXN0RGVzZXJpYWxpemVBbmRTZXJpYWxpemUoc2hvd1BlcnNwZWN0aXZlQ29tbWFuZElkKyIoKSIsCi0JCQkJc2hvd1BlcnNwZWN0aXZlQ29tbWFuZElkLCAwLCBudWxsLCBudWxsKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogVGVzdCBhIHNlcmlhbGl6YXRpb24gb2YgdGhlIHNob3cgcGVyc3BlY3RpdmUgY29tbWFuZCB3aXRoIGEgcGFyYW1ldGVyLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVTaG93UmVzb3VyY2VQZXJzcGVjdGl2ZSgpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJCi0JCWZpbmFsIFN0cmluZyBzZXJpYWxpemVkU2hvd1Jlc291cmNlUGVyc3BlY3RpdmVDb21tYW5kID0gIm9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUob3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZS5wZXJzcGVjdGl2ZUlkPW9yZy5lY2xpcHNlLnVpLnJlc291cmNlUGVyc3BlY3RpdmUpIjsKLQkJZmluYWwgU3RyaW5nIHNob3dQZXJzcGVjdGl2ZVBhcmFtZXRlcklkID0gIm9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUucGVyc3BlY3RpdmVJZCI7Ci0JCWZpbmFsIFN0cmluZyByZXNvdXJjZVBlcnNwZWN0aXZlSWQgPSAib3JnLmVjbGlwc2UudWkucmVzb3VyY2VQZXJzcGVjdGl2ZSI7Ci0KLQkJdGVzdERlc2VyaWFsaXplQW5kU2VyaWFsaXplKHNlcmlhbGl6ZWRTaG93UmVzb3VyY2VQZXJzcGVjdGl2ZUNvbW1hbmQsCi0JCQkJc2hvd1BlcnNwZWN0aXZlQ29tbWFuZElkLCAxLAotCQkJCW5ldyBTdHJpbmdbXSB7IHNob3dQZXJzcGVjdGl2ZVBhcmFtZXRlcklkIH0sCi0JCQkJbmV3IFN0cmluZ1tdIHsgcmVzb3VyY2VQZXJzcGVjdGl2ZUlkIH0pOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBzZXJpYWxpemF0aW9uIG9mIGEgY29tbWFuZCB3aXRoIHplcm8gcGFyYW1ldGVycy4KLQkgKiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhcmFtZXRlckNvbW1hbmQoKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyB6ZXJvUGFyYW1ldGVyQ29tbWFuZElkID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzLnplcm9QYXJhbWV0ZXJDb21tYW5kIjsKLQotCQkvLyBiYXNpYyB0ZXN0Ci0JCXRlc3REZXNlcmlhbGl6ZUFuZFNlcmlhbGl6ZSh6ZXJvUGFyYW1ldGVyQ29tbWFuZElkLAotCQkJCXplcm9QYXJhbWV0ZXJDb21tYW5kSWQsIDAsIG51bGwsIG51bGwpOwotCQkKLQkJLy8gdGVzdCB3aXRoIGEgYm9ndXMgcGFyYW1ldGVyCi0JCXRlc3REZXNlcmlhbGl6ZUFuZFNlcmlhbGl6ZSh6ZXJvUGFyYW1ldGVyQ29tbWFuZElkCi0JCQkJKyAiKGJvZ3VzLnBhcmFtPWhlbGxvKSIsIHplcm9QYXJhbWV0ZXJDb21tYW5kSWQsIDEsIG51bGwsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHNlcmlhbGl6YXRpb24gb2YgYSBjb21tYW5kIHdpdGggb25lIHBhcmFtZXRlci4KLQkgKiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0T25lUGFyYW1ldGVyQ29tbWFuZCgpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIG9uZVBhcmFtZXRlckNvbW1hbmRJZCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kcy5vbmVQYXJhbWV0ZXJDb21tYW5kIjsKLQkJZmluYWwgU3RyaW5nIHBhcmFtSWQxID0gInBhcmFtMS4xIjsKLQotCQkvLyBiYXNpYyB0ZXN0Ci0JCXRlc3REZXNlcmlhbGl6ZUFuZFNlcmlhbGl6ZShvbmVQYXJhbWV0ZXJDb21tYW5kSWQgKyAiKHBhcmFtMS4xPWhlbGxvKSIsCi0JCQkJb25lUGFyYW1ldGVyQ29tbWFuZElkLCAxLCBuZXcgU3RyaW5nW10geyBwYXJhbUlkMSB9LAotCQkJCW5ldyBTdHJpbmdbXSB7ICJoZWxsbyIgfSk7Ci0KLQkJLy8gdHJ5IGl0IHdpdGggbnVsbCB2YWx1ZSBwYXJhbQotCQl0ZXN0RGVzZXJpYWxpemVBbmRTZXJpYWxpemUob25lUGFyYW1ldGVyQ29tbWFuZElkICsgIihwYXJhbTEuMSkiLAotCQkJCW9uZVBhcmFtZXRlckNvbW1hbmRJZCwgMSwgbmV3IFN0cmluZ1tdIHsgcGFyYW1JZDEgfSwKLQkJCQluZXcgU3RyaW5nW10geyBudWxsIH0pOwotCi0JCS8vIHRyeSBpdCB3aXRob3V0IHRoZSBwYXJhbQotCQl0ZXN0RGVzZXJpYWxpemVBbmRTZXJpYWxpemUob25lUGFyYW1ldGVyQ29tbWFuZElkLAotCQkJCW9uZVBhcmFtZXRlckNvbW1hbmRJZCwgMCwgbnVsbCwgbnVsbCk7Ci0JCQotCQkvLyB0ZXN0IHdpdGggYSBib2d1cyBwYXJhbWV0ZXIKLQkJdGVzdERlc2VyaWFsaXplQW5kU2VyaWFsaXplKG9uZVBhcmFtZXRlckNvbW1hbmRJZAotCQkJCSsgIihib2d1cy5wYXJhbT1oZWxsbykiLCBvbmVQYXJhbWV0ZXJDb21tYW5kSWQsIDEsIG51bGwsIG51bGwpOwotCQkKLQkJLy8gdGVzdCB3aXRoIGEgYm9ndXMgcGFyYW1ldGVyIGFuZCB0aGUgcmVhbCBvbmUKLQkJdGVzdERlc2VyaWFsaXplQW5kU2VyaWFsaXplKG9uZVBhcmFtZXRlckNvbW1hbmRJZAotCQkJCSsgIihib2d1cy5wYXJhbT1oZWxsbyxwYXJhbTEuMT1mb28pIiwgb25lUGFyYW1ldGVyQ29tbWFuZElkLCAyLAotCQkJCW5ldyBTdHJpbmdbXSB7IHBhcmFtSWQxIH0sIG5ldyBTdHJpbmdbXSB7ICJmb28iIH0pOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHNlcmlhbGl6YXRpb24gb2YgYSBjb21tYW5kIHdpdGggdHdvIHBhcmFtZXRlcnMuCi0JICogCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFR3b1BhcmFtZXRlckNvbW1hbmQoKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyB0d29QYXJhbWV0ZXJDb21tYW5kSWQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuY29tbWFuZHMudHdvUGFyYW1ldGVyQ29tbWFuZCI7Ci0JCWZpbmFsIFN0cmluZyBwYXJhbUlkMSA9ICJwYXJhbTIuMSI7Ci0JCWZpbmFsIFN0cmluZyBwYXJhbUlkMiA9ICJwYXJhbTIuMiI7Ci0KLQkJLy8gYmFzaWMgdGVzdAotCQl0ZXN0RGVzZXJpYWxpemVBbmRTZXJpYWxpemUodHdvUGFyYW1ldGVyQ29tbWFuZElkCi0JCQkJKyAiKHBhcmFtMi4xPWhlbGxvLHBhcmFtMi4yPWdvb2RieWUpIiwgdHdvUGFyYW1ldGVyQ29tbWFuZElkLCAyLAotCQkJCW5ldyBTdHJpbmdbXSB7IHBhcmFtSWQxLCBwYXJhbUlkMiB9LCBuZXcgU3RyaW5nW10geyAiaGVsbG8iLAotCQkJCQkJImdvb2RieWUiIH0pOwotCQkKLQkJLy8gcmUtb3JkZXIgcGFyYW1ldGVycwotCQl0ZXN0RGVzZXJpYWxpemVBbmRTZXJpYWxpemUodHdvUGFyYW1ldGVyQ29tbWFuZElkCi0JCQkJKyAiKHBhcmFtMi4yPWdvb2RieWUscGFyYW0yLjE9aGVsbG8pIiwgdHdvUGFyYW1ldGVyQ29tbWFuZElkLCAyLAotCQkJCW5ldyBTdHJpbmdbXSB7IHBhcmFtSWQxLCBwYXJhbUlkMiB9LCBuZXcgU3RyaW5nW10geyAiaGVsbG8iLAotCQkJCQkJImdvb2RieWUiIH0pOwotCQkKLQkJLy8gcGFyYW1ldGVyIHZhbHVlcyB0aGF0IG5lZWQgZXNjYXBpbmcKLQkJZmluYWwgU3RyaW5nIHZhbHVlMUVzY2FwZWQgPSAiaGVsbG8lKCUpJSUlPSUsIjsKLQkJZmluYWwgU3RyaW5nIHZhbHVlMkVzY2FwZWQgPSAiJSUlPSUoJSklLHdvcmxkIjsKLQkJdGVzdERlc2VyaWFsaXplQW5kU2VyaWFsaXplKHR3b1BhcmFtZXRlckNvbW1hbmRJZCArICIocGFyYW0yLjE9IgotCQkJCSsgdmFsdWUxRXNjYXBlZCArICIscGFyYW0yLjI9IiArIHZhbHVlMkVzY2FwZWQgKyAiKSIsCi0JCQkJdHdvUGFyYW1ldGVyQ29tbWFuZElkLCAyLCBuZXcgU3RyaW5nW10geyBwYXJhbUlkMSwgcGFyYW1JZDIgfSwKLQkJCQluZXcgU3RyaW5nW10geyAiaGVsbG8oKSU9LCIsICIlPSgpLHdvcmxkIiB9KTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBzZXJpYWxpemF0aW9uIG9mIGEgY29tbWFuZCB3aXRoIHRocmVlIHBhcmFtZXRlcnMuCi0JICogCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRocmVlUGFyYW1ldGVyQ29tbWFuZCgpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIHRocmVlUGFyYW1ldGVyQ29tbWFuZElkID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzLnRocmVlUGFyYW1ldGVyQ29tbWFuZCI7Ci0JCWZpbmFsIFN0cmluZyBwYXJhbUlkMSA9ICJwYXJhbTMuMSI7Ci0JCWZpbmFsIFN0cmluZyBwYXJhbUlkMiA9ICJwYXJhbTMuMiI7Ci0JCWZpbmFsIFN0cmluZyBwYXJhbUlkMyA9ICJwYXJhbTMuMyI7Ci0KLQkJLy8gYmFzaWMgdGVzdAotCQl0ZXN0RGVzZXJpYWxpemVBbmRTZXJpYWxpemUodGhyZWVQYXJhbWV0ZXJDb21tYW5kSWQKLQkJCQkrICIocGFyYW0zLjE9Zm9vLHBhcmFtMy4yPWJhcixwYXJhbTMuMz1iYXopIiwKLQkJCQl0aHJlZVBhcmFtZXRlckNvbW1hbmRJZCwgMywgbmV3IFN0cmluZ1tdIHsgcGFyYW1JZDEsIHBhcmFtSWQyLAotCQkJCQkJcGFyYW1JZDMgfSwgbmV3IFN0cmluZ1tdIHsgImZvbyIsICJiYXIiLCAiYmF6IiB9KTsKLQkJCi0JCS8vIHRlc3Qgd2l0aCBhIG51bGwgcGFyYW1ldGVyCi0JCXRlc3REZXNlcmlhbGl6ZUFuZFNlcmlhbGl6ZSh0aHJlZVBhcmFtZXRlckNvbW1hbmRJZAotCQkJCSsgIihwYXJhbTMuMSxwYXJhbTMuMj1iYXIscGFyYW0zLjM9YmF6KSIsCi0JCQkJdGhyZWVQYXJhbWV0ZXJDb21tYW5kSWQsIDMsIG5ldyBTdHJpbmdbXSB7IHBhcmFtSWQxLCBwYXJhbUlkMiwKLQkJCQkJCXBhcmFtSWQzIH0sIG5ldyBTdHJpbmdbXSB7IG51bGwsICJiYXIiLCAiYmF6IiB9KTsKLQkJCi0JCS8vIHRlc3Qgd2l0aCBhbGwgbnVsbCBwYXJhbWV0ZXJzCi0JCXRlc3REZXNlcmlhbGl6ZUFuZFNlcmlhbGl6ZSh0aHJlZVBhcmFtZXRlckNvbW1hbmRJZAotCQkJCSsgIihwYXJhbTMuMSxwYXJhbTMuMixwYXJhbTMuMykiLAotCQkJCXRocmVlUGFyYW1ldGVyQ29tbWFuZElkLCAzLCBuZXcgU3RyaW5nW10geyBwYXJhbUlkMSwgcGFyYW1JZDIsCi0JCQkJCQlwYXJhbUlkMyB9LCBuZXcgU3RyaW5nW10geyBudWxsLCBudWxsLCBudWxsIH0pOwotCQkKLQkJLy8gdGVzdCB3aXRoIGEgbWlzc2luZyBwYXJhbWV0ZXIKLQkJdGVzdERlc2VyaWFsaXplQW5kU2VyaWFsaXplKHRocmVlUGFyYW1ldGVyQ29tbWFuZElkCi0JCQkJKyAiKHBhcmFtMy4xPWZvbyxwYXJhbTMuMz1iYXopIiwgdGhyZWVQYXJhbWV0ZXJDb21tYW5kSWQsIDIsCi0JCQkJbmV3IFN0cmluZ1tdIHsgcGFyYW1JZDEsIHBhcmFtSWQzIH0sIG5ldyBTdHJpbmdbXSB7ICJmb28iLAotCQkJCQkJImJheiIgfSk7Ci0JfQotCi0JCi0JLyoqCi0JICogVGVzdCBzZXJpYWxpemF0aW9uIG9mIGEgY29tbWFuZCB3aXRoIG5hbWVzIHRoYXQgbmVlZCBVVEYtOCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RnVubnlOYW1lc0NvbW1hbmQoKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBmdW5ueU5hbWVzQ29tbWFuZElkID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmQud2l0aC5mPSUpKCx1bm55Lm5hbWUiOwotCQlmaW5hbCBTdHJpbmcgZnVubnlOYW1lc0NvbW1hbmRJZEVuY29kZWQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuY29tbWFuZC53aXRoLmYlPSUlJSklKCUsdW5ueS5uYW1lIjsKLQotCQlmaW5hbCBTdHJpbmcgZnVubnlOYW1lc1BhcmFtSWQgPSAicGFyYW0ud2l0aC5GKHsnPjwrfC4pPSwlLm5hbWUiOwotCQlmaW5hbCBTdHJpbmcgZnVubnlOYW1lc1BhcmFtSWRFbmNvZGVkID0gInBhcmFtLndpdGguRiUoeyc+PCt8LiUpJT0lLCUlLm5hbWUiOwotCi0JCWZpbmFsIFN0cmluZyBmdW5ueVZhbHVlID0gIj0gJSwuJlxuXHRccj8qW10oKXt9IjsKLQkJZmluYWwgU3RyaW5nIGZ1bm55VmFsdWVFbmNvZGVkID0gIiU9ICUlJSwuJlxuXHRccj8qW10lKCUpe30iOwotCi0JCWZpbmFsIFN0cmluZyBzZXJpYWxpemVkRnVubnlOYW1lc0NvbW1hbmQgPSBmdW5ueU5hbWVzQ29tbWFuZElkRW5jb2RlZAotCQkJCSsgIigiICsgZnVubnlOYW1lc1BhcmFtSWRFbmNvZGVkICsgIj0iICsgZnVubnlWYWx1ZUVuY29kZWQgKyAiKSI7Ci0KLQkJLy8gYmFzaWMgdGVzdAotCQl0ZXN0RGVzZXJpYWxpemVBbmRTZXJpYWxpemUoc2VyaWFsaXplZEZ1bm55TmFtZXNDb21tYW5kLAotCQkJCWZ1bm55TmFtZXNDb21tYW5kSWQsIDEsIG5ldyBTdHJpbmdbXSB7IGZ1bm55TmFtZXNQYXJhbUlkIH0sCi0JCQkJbmV3IFN0cmluZ1tdIHsgZnVubnlWYWx1ZSB9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hbGZvcm1lZFNlcmlhbGl6YXRpb25TdHJpbmdzKCkgewotCQkvLyB0cnkgYSBtaXNzaW5nIGNsb3NpbmcgJyknCi0JCWV4cGVjdFNlcmlhbGl6YXRpb25FeGNlcHRpb24oc2hvd1BlcnNwZWN0aXZlQ29tbWFuZElkICsgIigiKTsKLQkJCi0JCS8vIHRyeSBhIGJhZCBlc2NhcGUgc2VxdWVuY2UKLQkJZXhwZWN0U2VyaWFsaXphdGlvbkV4Y2VwdGlvbigic29tZS5jb21tYW5kLmZvbyViYXIiKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuZGVmaW5lZENvbW1hbmRzKCkgewotCQlleHBlY3ROb3REZWZpbmVkRXhjZXB0aW9uKCJ0aGlzLmNvbW1hbmQuYWluJ3QuZGVmaW5lZChpLmhvcGUpIik7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgZGVzZXJpYWxpemluZyBhIHN0b3JlZCBjb21tYW5kIGFuZCB0aGVuIHNlcmlhbGl6aW5nIGl0IGJhY2sgaW50byBhCi0JICogc3RyaW5nLiBUaGUgPGNvZGU+c2VyaWFsaXplZFBhcmFtZXRlcml6ZWRDb21tYW5kPC9jb2RlPiBtYXkgY29udGFpbgotCSAqIHNvbWUgImJvZ3VzIiBwYXJhbWV0ZXJzIChvbmVzIG5vdCBkZWZpbmVkIGluIHRoZSBjb21tYW5kIHJlZ2lzdHJ5IGZvciB0aGUKLQkgKiBjb21tYW5kKS4gVGhlIDxjb2RlPnBhcmFtSWRzPC9jb2RlPiBhbmQgPGNvZGU+cGFyYW1WYWx1ZXM8L2NvZGU+Ci0JICogYXJyYXlzIHJlcHJlc2VudCBvbmx5IHRoZSBpZHMgYW5kIHZhbHVlcyBvZiB0aGUgbm9uLWJvZ3VzIHNlcmlhbGl6ZWQKLQkgKiBwYXJhbWV0ZXJzLgotCSAqIAotCSAqIEBwYXJhbSBzZXJpYWxpemVkUGFyYW1ldGVyaXplZENvbW1hbmQKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzZXJpYWxpemF0aW9uIHN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kSWQKLQkgKiAgICAgICAgICAgIGlkIG9mIHRoZSBzZXJpYWxpemVkIGNvbW1hbmQKLQkgKiBAcGFyYW0gc2VyaWFsaXplZFBhcmFtQ291bnQKLQkgKiAgICAgICAgICAgIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIHRoZSBzZXJpYWxpemF0aW9uIChzb21lIG1heSBiZSBib2d1cykKLQkgKiBAcGFyYW0gcGFyYW1JZHMKLQkgKiAgICAgICAgICAgIHBhcmFtZXRlciBpZHMgaW4gdGhlIHNlcmlhbGl6YXRpb24gdGhhdCByZXByZXNlbnQgcmVhbAotCSAqICAgICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgY29tbWFuZAotCSAqIEBwYXJhbSBwYXJhbVZhbHVlcwotCSAqICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlcyBpbiB0aGUgc2VyaWFsaXphdGlvbiAoc2FtZSBudW1iZXIgYW5kIG9yZGVyCi0JICogICAgICAgICAgICBhcyBwYXJhbUlkcykKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgdGVzdERlc2VyaWFsaXplQW5kU2VyaWFsaXplKAotCQkJU3RyaW5nIHNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZCwgU3RyaW5nIGNvbW1hbmRJZCwKLQkJCWludCBzZXJpYWxpemVkUGFyYW1Db3VudCwgU3RyaW5nW10gcGFyYW1JZHMsIFN0cmluZ1tdIHBhcmFtVmFsdWVzKQotCQkJdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQkKLQkJSUNvbW1hbmRTZXJ2aWNlIGNvbW1hbmRTZXJ2aWNlID0gZ2V0Q29tbWFuZFNlcnZpY2UoKTsKLQkJCi0JCWludCByZWFsUGFyYW1Db3VudCA9IChwYXJhbUlkcyA9PSBudWxsKSA/IDAgOiBwYXJhbUlkcy5sZW5ndGg7Ci0KLQkJLy8gZmlyc3QgY29udmVydCB0aGUgc2VyaWFsaXplZCBzdHJpbmcgdG8gYSBQYXJhbWV0ZXJpemVkQ29tbWFuZCBhbmQKLQkJLy8gY2hlY2sgdGhlIHBhcnRzCi0JCVBhcmFtZXRlcml6ZWRDb21tYW5kIHBDb21tYW5kID0gY29tbWFuZFNlcnZpY2UKLQkJCQkuZGVzZXJpYWxpemUoc2VyaWFsaXplZFBhcmFtZXRlcml6ZWRDb21tYW5kKTsKLQkJYXNzZXJ0Tm90TnVsbChwQ29tbWFuZCk7Ci0JCWFzc2VydEVxdWFscyhjb21tYW5kSWQsIHBDb21tYW5kLmdldElkKCkpOwotCi0JCU1hcCBwYXJhbU1hcCA9IHBDb21tYW5kLmdldFBhcmFtZXRlck1hcCgpOwotCQlhc3NlcnRFcXVhbHMocmVhbFBhcmFtQ291bnQsIHBhcmFtTWFwLnNpemUoKSk7Ci0KLQkJaWYgKHBhcmFtSWRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVhbFBhcmFtQ291bnQ7IGkrKykgewotCQkJCWFzc2VydFRydWUocGFyYW1NYXAuY29udGFpbnNLZXkocGFyYW1JZHNbaV0pKTsKLQkJCQlhc3NlcnRFcXVhbHMocGFyYW1WYWx1ZXNbaV0sIHBhcmFtTWFwLmdldChwYXJhbUlkc1tpXSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gbm93IGNvbnZlcnQgdGhlIFBhcmFtZXRlcml6ZWRDb21tYW5kIGJhY2sgdG8gYSBzZXJpYWxpemVkIHN0cmluZwotCQlTdHJpbmcgc2VyaWFsaXphdGlvbiA9IHBDb21tYW5kLnNlcmlhbGl6ZSgpOwotCQkKLQkJaWYgKChyZWFsUGFyYW1Db3VudCA9PSBzZXJpYWxpemVkUGFyYW1Db3VudCkgJiYgKHJlYWxQYXJhbUNvdW50IDwgMikpIHsKLQkJCWlmICgocmVhbFBhcmFtQ291bnQgPT0gMCkKLQkJCQkJJiYgKHNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZC5lbmRzV2l0aCgiKCkiKSkpIHsKLQkJCQkvLyBlbXB0eSAiKCkiIGlzIG9rLCBidXQgdGhlIHJlLXNlcmlhbGl6YXRpb24gd29uJ3QgaGF2ZSBpdAotCQkJCS8vIHNvIGFkZCBpdCBiYWNrIGZvciBjb21wYXJpc29uLi4uLgotCQkJCWFzc2VydEVxdWFscyhzZXJpYWxpemVkUGFyYW1ldGVyaXplZENvbW1hbmQsIHNlcmlhbGl6YXRpb24KLQkJCQkJCSsgIigpIik7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydEVxdWFscyhzZXJpYWxpemVkUGFyYW1ldGVyaXplZENvbW1hbmQsIHNlcmlhbGl6YXRpb24pOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gcGFyYW1zIG1heSBoYXZlIGJlZW4gcmUtb3JkZXJlZCBzbyB3ZSBjYW4ndCBjb21wYXJlCi0JCX0KLQkJCi0JCS8vIGRlc2VyaWFsaXplIGFnYWluIGFuZCB1c2UgLmVxdWFscygpIG9uIHRoZSBQYXJhbWV0ZXJpemVkQ29tbWFuZHMKLQkJUGFyYW1ldGVyaXplZENvbW1hbmQgcENvbW1hbmQyID0gY29tbWFuZFNlcnZpY2UuZGVzZXJpYWxpemUoc2VyaWFsaXphdGlvbik7Ci0JCWFzc2VydEVxdWFscyhwQ29tbWFuZCwgcENvbW1hbmQyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGV4cGVjdFNlcmlhbGl6YXRpb25FeGNlcHRpb24oU3RyaW5nIHNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZCkgewotCQlJQ29tbWFuZFNlcnZpY2UgY29tbWFuZFNlcnZpY2UgPSBnZXRDb21tYW5kU2VydmljZSgpOwotCQkKLQkJdHJ5IHsKLQkJCWNvbW1hbmRTZXJ2aWNlLmRlc2VyaWFsaXplKHNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZCk7Ci0JCQlmYWlsKCJleHBlY3RlZCBTZXJpYWxpemF0aW9uRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKFNlcmlhbGl6YXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCS8vIHBhc3NlZAotCQl9IGNhdGNoIChOb3REZWZpbmVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlmYWlsKCJleHBlY3RlZCBTZXJpYWxpemF0aW9uRXhjZXB0aW9uIik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGV4cGVjdE5vdERlZmluZWRFeGNlcHRpb24oU3RyaW5nIHNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZCkgewotCQlJQ29tbWFuZFNlcnZpY2UgY29tbWFuZFNlcnZpY2UgPSBnZXRDb21tYW5kU2VydmljZSgpOwotCQkKLQkJdHJ5IHsKLQkJCWNvbW1hbmRTZXJ2aWNlLmRlc2VyaWFsaXplKHNlcmlhbGl6ZWRQYXJhbWV0ZXJpemVkQ29tbWFuZCk7Ci0JCQlmYWlsKCJleHBlY3RlZCBOb3REZWZpbmVkRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKFNlcmlhbGl6YXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWZhaWwoImV4cGVjdGVkIE5vdERlZmluZWRFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTm90RGVmaW5lZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gcGFzc2VkCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tbWFuZFNlcnZpY2UgZ2V0Q29tbWFuZFNlcnZpY2UoKSB7Ci0JCU9iamVjdCBzZXJ2aWNlT2JqZWN0ID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWRhcHRlcihJQ29tbWFuZFNlcnZpY2UuY2xhc3MpOwotCQlpZiAoc2VydmljZU9iamVjdCAhPSBudWxsKSB7Ci0JCQlJQ29tbWFuZFNlcnZpY2Ugc2VydmljZSA9IChJQ29tbWFuZFNlcnZpY2UpIHNlcnZpY2VPYmplY3Q7Ci0JCQlyZXR1cm4gc2VydmljZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbW1hbmRzL0NvbW1hbmRzVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbW1hbmRzL0NvbW1hbmRzVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMGU2NGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb21tYW5kcy9Db21tYW5kc1Rlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUZXN0cyBmb3IgYWxsIGFyZWFzIG9mIGNvbW1hbmQgc3VwcG9ydCBmb3IgdGhlIHBsYXRmb3JtLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tbWFuZHNUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3VpdGUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZHNUZXN0U3VpdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgdGhlIHRlc3Qgc3VpdGUuCi0JICovCi0JcHVibGljIENvbW1hbmRzVGVzdFN1aXRlKCkgewotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQnVnNjYxODJUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShCdWc3MDUwM1Rlc3QuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1ZzczNzU2VGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQnVnNzQ5ODJUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShCdWc3NDk5MFRlc3QuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1Zzg3ODU2VGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQ29tbWFuZE1hbmFnZXJUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShDb21tYW5kUGFyYW1ldGVyVHlwZVRlc3QuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKENvbW1hbmRTZXJpYWxpemF0aW9uVGVzdC5jbGFzcykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tbWFuZHMvSW50ZWdlckNvbnZlcnRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb21tYW5kcy9JbnRlZ2VyQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzcwZTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb21tYW5kcy9JbnRlZ2VyQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RQYXJhbWV0ZXJWYWx1ZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlclZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludGVnZXJDb252ZXJ0ZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcmFtZXRlclZhbHVlQ29udmVydGVyIHsKLQotCXB1YmxpYyBPYmplY3QgY29udmVydFRvT2JqZWN0KFN0cmluZyBwYXJhbWV0ZXJWYWx1ZSkKLQkJCXRocm93cyBQYXJhbWV0ZXJWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJaW50IHZhbCA9IEludGVnZXIucGFyc2VJbnQocGFyYW1ldGVyVmFsdWUpOwotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHZhbCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFBhcmFtZXRlclZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbigKLQkJCQkJIkVycm9yIHBhcnNpbmcgdmFsdWU6ICIgKyBwYXJhbWV0ZXJWYWx1ZSwgZXgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBwYXJhbWV0ZXJWYWx1ZSkKLQkJCXRocm93cyBQYXJhbWV0ZXJWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gewotCQlpZiAoIShwYXJhbWV0ZXJWYWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpKSB7Ci0JCQl0aHJvdyBuZXcgUGFyYW1ldGVyVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKCJJbnZhbGlkIG9iamVjdCB0eXBlOiAiCi0JCQkJCSsgcGFyYW1ldGVyVmFsdWUpOwotCQl9Ci0JCUludGVnZXIgdmFsID0gKEludGVnZXIpIHBhcmFtZXRlclZhbHVlOwotCQlyZXR1cm4gdmFsLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb21tYW5kcy9TdWJ0cmFjdEludGVnZXJIYW5kbGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbW1hbmRzL1N1YnRyYWN0SW50ZWdlckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzZDIwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbW1hbmRzL1N1YnRyYWN0SW50ZWdlckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBIYW5kbGVyIGZvciB0aGUgPGNvZGU+b3JnLmVjbGlwc2UudWkudGVzdHMuY29tbWFuZHMuc3VidHJhY3RJbnRlZ2VyPC9jb2RlPgotICogY29tbWFuZC4KLSAqLwotcHVibGljIGNsYXNzIFN1YnRyYWN0SW50ZWdlckhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSW50ZWdlciBtaW51ZW5kID0gKEludGVnZXIpIGV2ZW50Ci0JCQkJLmdldE9iamVjdFBhcmFtZXRlckZvckV4ZWN1dGlvbihDb21tYW5kUGFyYW1ldGVyVHlwZVRlc3QuTUlOVUVORCk7Ci0JCUludGVnZXIgc3VidHJhaGVuZCA9IChJbnRlZ2VyKSBldmVudAotCQkJCS5nZXRPYmplY3RQYXJhbWV0ZXJGb3JFeGVjdXRpb24oQ29tbWFuZFBhcmFtZXRlclR5cGVUZXN0LlNVQlRSQUhFTkQpOwotCQlyZXR1cm4gbmV3IEludGVnZXIobWludWVuZC5pbnRWYWx1ZSgpIC0gc3VidHJhaGVuZC5pbnRWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbXBhcmUvVUlDb21wYXJlUHJlZmVyZW5jZXMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tcGFyZS9VSUNvbXBhcmVQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2JhODZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29tcGFyZS9VSUNvbXBhcmVQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBhcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzLlByZWZlcmVuY2VEaWFsb2dXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5EaWFsb2dDaGVjazsKLQotcHVibGljIGNsYXNzIFVJQ29tcGFyZVByZWZlcmVuY2VzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIFVJQ29tcGFyZVByZWZlcmVuY2VzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0gICAgICAgIHJldHVybiBEaWFsb2dDaGVjay5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJlZmVyZW5jZURpYWxvZyBnZXRQcmVmZXJlbmNlRGlhbG9nKFN0cmluZyBpZCkgewotICAgICAgICBQcmVmZXJlbmNlRGlhbG9nV3JhcHBlciBkaWFsb2cgPSBudWxsOwotICAgICAgICBQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZ1dyYXBwZXIoZ2V0U2hlbGwoKSwgbWFuYWdlcik7Ci0gICAgICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5QUkVGRVJFTkNFX0RJQUxPRyk7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYW5hZ2VyLmdldEVsZW1lbnRzKAotICAgICAgICAgICAgICAgICAgICBQcmVmZXJlbmNlTWFuYWdlci5QUkVfT1JERVIpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IChJUHJlZmVyZW5jZU5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRJZCgpLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlhbG9nLnNob3dQYWdlKG5vZGUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpYWxvZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVZpZXdlcnNQcmVmKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJlZmVyZW5jZURpYWxvZygib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlUHJlZmVyZW5jZVBhZ2UiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbXBhcmUvVUlDb21wYXJlUHJlZmVyZW5jZXNBdXRvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbXBhcmUvVUlDb21wYXJlUHJlZmVyZW5jZXNBdXRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YWU1NjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb21wYXJlL1VJQ29tcGFyZVByZWZlcmVuY2VzQXV0by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBhcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzLlByZWZlcmVuY2VEaWFsb2dXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5EaWFsb2dDaGVjazsKLQotcHVibGljIGNsYXNzIFVJQ29tcGFyZVByZWZlcmVuY2VzQXV0byBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBVSUNvbXBhcmVQcmVmZXJlbmNlc0F1dG8oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gRGlhbG9nQ2hlY2suZ2V0U2hlbGwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByZWZlcmVuY2VEaWFsb2cgZ2V0UHJlZmVyZW5jZURpYWxvZyhTdHJpbmcgaWQpIHsKLSAgICAgICAgUHJlZmVyZW5jZURpYWxvZ1dyYXBwZXIgZGlhbG9nID0gbnVsbDsKLSAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlciA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZGlhbG9nID0gbmV3IFByZWZlcmVuY2VEaWFsb2dXcmFwcGVyKGdldFNoZWxsKCksIG1hbmFnZXIpOwotICAgICAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoSGVscENvbnRleHRJZHMuUFJFRkVSRU5DRV9ESUFMT0cpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFuYWdlci5nZXRFbGVtZW50cygKLSAgICAgICAgICAgICAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgSVByZWZlcmVuY2VOb2RlIG5vZGUgPSAoSVByZWZlcmVuY2VOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVWaWV3ZXJzUHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQ29tcGFyZVByZWZlcmVuY2VQYWdlIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbmN1cnJlbmN5L0NvbmN1cnJlbmN5VGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbmN1cnJlbmN5L0NvbmN1cnJlbmN5VGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjVlMDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb25jdXJyZW5jeS9Db25jdXJyZW5jeVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbmN1cnJlbmN5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUaGUgc3VpdGUgb2YgdGVzdHMgcmVsYXRlZCB0byBjb25jdXJyZW5jeSBhbmQgZGVhZGxvY2suCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbmN1cnJlbmN5VGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1aXRlLiBUaGlzIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbmN1cnJlbmN5VGVzdFN1aXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5Db25jdXJyZW5jeVRlc3RTdWl0ZTwvY29kZT4gd2l0aCBhbGwgb2YKLSAgICAgKiB0aGUgcmVsZXZhbnQgdGVzdCBjYXNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uY3VycmVuY3lUZXN0U3VpdGUoKSB7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShOZXN0ZWRTeW5jRXhlY0RlYWRsb2NrVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShUZXN0QnVnOTg2MjEuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoVGVzdEJ1ZzEwODE2Mi5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShUcmFuc2ZlclJ1bGVUZXN0LmNsYXNzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbmN1cnJlbmN5L05lc3RlZFN5bmNFeGVjRGVhZGxvY2tUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbmN1cnJlbmN5L05lc3RlZFN5bmNFeGVjRGVhZGxvY2tUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMWM4MGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb25jdXJyZW5jeS9OZXN0ZWRTeW5jRXhlY0RlYWRsb2NrVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSmVyZW1pYWggTG90dCBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIEplcmVtaWFoIExvdHQgKGplcmVtaWFoLmxvdHRAdGltZXN5cy5jb20pIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICBJQk0gQWRkZWQgY29tbWVudHMsIHJlbW92ZWQgcHJpbnRsbnMsIGFuZCBpbmNvcnBvcmF0ZWQgaW50byBwbGF0Zm9ybSB0ZXN0IHN1aXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbmN1cnJlbmN5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgcmVncmVzc2lvbiB0ZXN0IGZvciBhIGNhc2Ugd2hlcmUgYSByZWN1cnNpdmUgYXR0ZW1wdCB0byBzeW5jRXhlYwotICogZnJvbSB3aXRoaW4gY29kZSB0aGF0IG93bnMgYSBsb2NrIHdvdWxkIGNhdXNlIGRlYWRsb2NrLiBTZWUgYnVnIDc2Mzc4IGZvciBkZXRhaWxzLgotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkU3luY0V4ZWNEZWFkbG9ja1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIGNsYXNzIFJlc291cmNlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0JcHJpdmF0ZSBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQotCXB1YmxpYyBOZXN0ZWRTeW5jRXhlY0RlYWRsb2NrVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGVkU3luY0V4ZWNEZWFkbG9ja1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9UZXN0KGZpbmFsIGxvbmcgdGltZVRvU2xlZXApIHRocm93cyBFeGNlcHRpb24gewotCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhuZXcgU2hlbGwoKSk7Ci0JCWRpYWxvZy5ydW4odHJ1ZSwgZmFsc2UsIG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJd29ya3NwYWNlLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCQkJCXByb2plY3QudG91Y2gobnVsbCk7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCS8vIHdhaXQgbG9uZyBlbm91Z2ggdG8gYmUgc3VyZSB0byB0cmlnZ2VyIG5vdGlmaWNhdGlvbgotCQkJCQkJCQkJCVRocmVhZC5zbGVlcCh0aW1lVG9TbGVlcCk7Ci0JCQkJCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSwgd29ya3NwYWNlLmdldFJvb3QoKSwgSVJlc291cmNlLk5PTkUsIHBtKTsKLQkJCQkJCQl3b3Jrc3BhY2UucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbikgewotCQkJCQkJCQl9Ci0JCQkJCQkJfSwgcG0pOwotCi0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdCgidGVzdC1kZWFkbG9jayIpOwotCi0JCXRlYXJEb3duKCk7Ci0KLQkJcHJvamVjdC5jcmVhdGUobnVsbCk7Ci0JCXByb2plY3Qub3BlbihudWxsKTsKLQotCQlsaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUxpc3RlbmVyKCk7Ci0JCXdvcmtzcGFjZS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCXdvcmtzcGFjZS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVhZGxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZG9UZXN0KDEwMDAgKiAzMCk7IC8vIDMwIHNlY3MgYWxtb3N0IGFsd2F5cyBsb2NrcwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPSygpIHRocm93cyBFeGNlcHRpb24gewotCQlkb1Rlc3QoMCk7IC8vIDAgcmFyZWx5IGxvY2tzCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb25jdXJyZW5jeS9UZXN0QnVnMTA1NDkxLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbmN1cnJlbmN5L1Rlc3RCdWcxMDU0OTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzMmFkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbmN1cnJlbmN5L1Rlc3RCdWcxMDU0OTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5jb25jdXJyZW5jeTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVRocmVhZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci0KLS8qKgotICogVGVzdHMgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBvZiBldmVudHM6Ci0gKiAxKSBXb3Jrc3BhY2Ugb3BlcmF0aW9uIHN0YXJ0cyBpbiB0aGUgVUkgdGhyZWFkLiAgV29ya3NwYWNlIGxvY2sgaXMgdGFrZW4sIGFuZCBhIG1vZGFsIGNvbnRleHQgdGhyZWFkIGlzIGZvcmtlZCAoY2FsbCB0aGlzIG1vZGFsIGNvbnRleHQgTUMxKS4KLSAqIDIpIE9wZXJhdGlvbiB0cmFuc2ZlcnMgdGhlIHdvcmtzcGFjZSBsb2NrIHRvIE1DMSB1c2luZyBJSm9iTWFuYWdlci50cmFuc2ZlclJ1bGUKLSAqIDMpIE9wZXJhdGlvbiBydW5zIGluIE1DMSwgc2NoZWR1bGluZyBhbiBhc3luY0V4ZWMuCi0gKiA0KSBNQzEgcGFzc2VzIHRoZSBzY2hlZHVsaW5nIHJ1bGUgYmFjayB0byBVSSB0aHJlYWQsIGFuZCBleGl0cwotICogNSkgQWZ0ZXIgcGFzc2luZyB0aGUgcnVsZSBiYWNrIHRvIHRoZSBVSSB0aHJlYWQsIGJ1dCBiZWZvcmUgTUMxIGRpZXMsIHRoZSBhc3luY0V4ZWMgaXMgcnVuLgotICogNikgVGhlIGFzeW5jRXhlYyBmb3JrcyBhbm90aGVyIG1vZGVsIGNvbnRleHQgKE1DMiksIGFuZCBibG9ja3MgdGhlIFVJIHRocmVhZCBpbiBhbm90aGVyIGV2ZW50IGxvb3AuCi0gKiA3KSBNQzIgdHJpZXMgdG8gYWNxdWlyZSB0aGUgd29ya3NwYWNlIGxvY2sgYW5kIGRlYWRsb2NrcywgYmVjYXVzZSBhdCB0aGlzIHBvaW50IGl0IGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvIHRoZSBVSSB0aHJlYWQKLSAqIAotICogTk9URTogVGhpcyBidWcgaGFzIG5vdCB5ZXQgYmVlbiBmaXhlZC4gIFRoaXMgdGVzdCBpbGx1c3RyYXRlcyB0aGUgcHJvYmxlbSwgYnV0IG11c3QKLSAqIG5vdCBiZSBhZGRlZCB0byB0aGUgcGFyZW50IHRlc3Qgc3VpdGUgdW50aWwgdGhlIHByb2JsZW0gaGFzIGJlZW4gZml4ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QnVnMTA1NDkxIGV4dGVuZHMgVGVzdENhc2UgewotCWNsYXNzIFRyYW5zZmVyVGVzdE9wZXJhdGlvbiBleHRlbmRzIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBpbXBsZW1lbnRzIElUaHJlYWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkJLy9jbGllbnRzIGFzc3VtZSB0aGlzIHdvdWxkIG5vdCBkZWFkbG9jayBiZWNhdXNlIGl0IHJ1bnMgaW4gYW4gYXN5bmNFeGVjCi0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2cobmV3IFNoZWxsKCkpOwotCQkJCQl0cnkgewotCQkJCQkJZGlhbG9nLnJ1bih0cnVlLCBmYWxzZSwgbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCQkJCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikge30KLQkJCQkJCX0pOwotCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJLy9pZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGhyZWFkQ2hhbmdlKFRocmVhZCB0aHJlYWQpIHsKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS50cmFuc2ZlclJ1bGUod29ya3NwYWNlLmdldFJvb3QoKSwgdGhyZWFkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0KLQlwdWJsaWMgVGVzdEJ1ZzEwNTQ5MSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdEJ1ZzEwNTQ5MShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgdGVzdAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RCdWcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXdvcmtzcGFjZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhuZXcgU2hlbGwoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJZGlhbG9nLnJ1bih0cnVlLCBmYWxzZSwgbmV3IFRyYW5zZmVyVGVzdE9wZXJhdGlvbigpKTsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvL2lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfSwgd29ya3NwYWNlLmdldFJvb3QoKSwgSVJlc291cmNlLk5PTkUsIG51bGwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbmN1cnJlbmN5L1Rlc3RCdWcxMDgxNjIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29uY3VycmVuY3kvVGVzdEJ1ZzEwODE2Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWFkOGJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29uY3VycmVuY3kvVGVzdEJ1ZzEwODE2Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbmN1cnJlbmN5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIG9mIGV2ZW50czoKLSAqIDEpIGFjcXVpcmUgYSBsb2NrIGluIHRoZSBVSSB0aHJlYWQKLSAqIDIpIGV4ZWN1dGUgYW4gb3BlcmF0aW9uIChlLmcuIE1vdmVGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24pIHdoaWNoIHNwYXducyBhIG1vZGFsIGNvbnRleHQgdGhyZWFkCi0gKiAzKSBtb2RhbCBjb250ZXh0IHRyaWVzIHRvIGFjcXVpcmUgbG9jayBoZWxkIGJ5IFVJIHRocmVhZAotICogCi0gKiBOT1RFOiBUaGlzIGJ1ZyBoYXMgbm90IHlldCBiZWVuIGZpeGVkLiAgVGhpcyB0ZXN0IGlsbHVzdHJhdGVzIHRoZSBwcm9ibGVtLCBidXQgbXVzdAotICogbm90IGJlIGFkZGVkIHRvIHRoZSBwYXJlbnQgdGVzdCBzdWl0ZSB1bnRpbCB0aGUgcHJvYmxlbSBoYXMgYmVlbiBmaXhlZC4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RCdWcxMDgxNjIgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JY2xhc3MgTG9ja0FjcXVyaW5nT3BlcmF0aW9uIGV4dGVuZHMgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCQkvL2VtcHR5IG9wZXJhdGlvbiBpcyBzdWZmaWNpZW50IHRvIGNhdXNlIGRlYWRsb2NrCi0JCX0KLQl9Ci0KLQlwcml2YXRlIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCi0JcHVibGljIFRlc3RCdWcxMDgxNjIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRlc3RCdWcxMDgxNjIoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIHRlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl3b3Jrc3BhY2UucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2cobmV3IFNoZWxsKCkpOwotCQkJCXRyeSB7Ci0JCQkJCWRpYWxvZy5ydW4odHJ1ZSwgZmFsc2UsIG5ldyBMb2NrQWNxdXJpbmdPcGVyYXRpb24oKSk7Ci0JCQkJCS8vc2hvdWxkIG5vdCBzdWNjZWVkCi0JCQkJCWFzc2VydFRydWUoIlNob3VsZCBub3QgZ2V0IGhlcmUiLCBmYWxzZSk7Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9pZ25vcmUKLQkJCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJCQkvL3RoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCBiZWNhdXNlIGl0IHRyaWVkIHRvIGZvcmsgYW5kIGJsb2NrIHdoaWxlIG93bmluZyBhIGxvY2suCi0JCQkJfQotCQkJfQotCQl9LCB3b3Jrc3BhY2UuZ2V0Um9vdCgpLCBJUmVzb3VyY2UuTk9ORSwgbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29uY3VycmVuY3kvVGVzdEJ1Zzk4NjIxLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbmN1cnJlbmN5L1Rlc3RCdWc5ODYyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTNhYzdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29uY3VycmVuY3kvVGVzdEJ1Zzk4NjIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuY29uY3VycmVuY3k7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklUaHJlYWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotCi0vKioKLSAqIFRlc3RzIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2YgZXZlbnRzOgotICogIDEpIExvY2sgaXMgYWNxdWlyZWQgaW4gVUkgdGhyZWFkCi0gKiAgMikgTW9kYWwgY29udGV4dCB0aHJlYWQgaXMgc3RhcnRlZCB1c2luZyBJVGhyZWFkTGlzdGVuZXIKLSAqICAzKSBMb2NrIGlzIHRyYW5zZmVycmVkIHRvIG1vZGFsIGNvbnRleHQgdGhyZWFkCi0gKiAgNCkgTW9kYWwgY29udGV4dCB0aHJlYWQgcGVyZm9ybXMgYW4gYXN5bmNFeGVjCi0gKiAgNSkgVGhlIGFzeW5jRXhlYyB0cmllcyB0byBhY3F1aXJlIHRoZSBzYW1lIGxvY2sgaGVsZCBieSB0aGUgbW9kYWwgY29udGV4dAotICogIDYpIFRoZSBtb2RhbCBjb250ZXh0IHRocmVhZCBleGl0cywgdGh1cyB0cmFuc2ZlcnJpbmcgdGhlIHJ1bGUgYmFjayB0byB0aGUgVUkgdGhyZWFkCi0gKiAgPHA+Ci0gKiAgTm93IHRoZSBydWxlIGhhcyBiZWVuIHRyYW5zZmVycmVkIGJhY2sgdG8gdGhlIFVJIHRocmVhZCwgYnV0IHRoZSBVSSB0aHJlYWQKLSAqICBpcyBpbiBhIHdhaXQgbG9vcCB3YWl0aW5nIHRvIG9idGFpbiB0aGUgcnVsZS4gVGhlIFVJIHRocmVhZCBzaG91bGQgcmVhbGl6ZSB0aGF0Ci0gKiAgaXQgbm93IG93bnMgdGhlIGxvY2sgaXQgaXMgd2FpdGluZyBmb3IsIGFuZCBjb250aW51ZSB3aXRoIGl0cyBleGVjdXRpb24uCi0gKiAgPHA+Ci0gKiAgU2VlIGJ1ZyA5ODYyMSBmb3IgbW9yZSBkZXRhaWxzLgotICogIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFRlc3RCdWc5ODYyMSBleHRlbmRzIFRlc3RDYXNlIHsKLQljbGFzcyBUcmFuc2ZlclRlc3RPcGVyYXRpb24gZXh0ZW5kcyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gaW1wbGVtZW50cyBJVGhyZWFkTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJd29ya3NwYWNlLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbikgewotCQkJCQkJCQkvLwotCQkJCQkJCX0KLQkJCQkJCX0sIHdvcmtzcGFjZS5nZXRSb290KCksIElSZXNvdXJjZS5OT05FLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCS8vd2FpdCB1bnRpbCB0aGUgYXN5bmNFeGVjIGlzIGJsb2NraW5nIHRoZSBVSSB0aHJlYWQKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlCi0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0aHJlYWRDaGFuZ2UoVGhyZWFkIHRocmVhZCkgewotCQkJUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLnRyYW5zZmVyUnVsZSh3b3Jrc3BhY2UuZ2V0Um9vdCgpLCB0aHJlYWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQotCXB1YmxpYyBUZXN0QnVnOTg2MjEoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRlc3RCdWc5ODYyMShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgdGVzdAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RCdWcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXdvcmtzcGFjZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhuZXcgU2hlbGwoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJZGlhbG9nLnJ1bih0cnVlLCBmYWxzZSwgbmV3IFRyYW5zZmVyVGVzdE9wZXJhdGlvbigpKTsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvL2lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfSwgd29ya3NwYWNlLmdldFJvb3QoKSwgSVJlc291cmNlLk5PTkUsIG51bGwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbmN1cnJlbmN5L1RyYW5zZmVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29uY3VycmVuY3kvVHJhbnNmZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTVkMTczLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29uY3VycmVuY3kvVHJhbnNmZXJSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbmN1cnJlbmN5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklUaHJlYWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIElKb2JNYW5nZXIjdHJhbnNmZXJSdWxlIGluIGNvbmp1bmN0aW9uIHdpdGggTW9kYWxDb250ZXh0LnJ1bi4KLSAqIFRoaXMgYWxzbyBleGVyY2lzZXMgdGhlIElUaHJlYWRMaXN0ZW5lciBBUEkgdG8gYWxsb3cgdGhlIHJ1bm5hYmxlIHRvIHRyYW5zZmVyCi0gKiBhbmQgb2J0YWluIHRoZSBydWxlIG93bmVkIGJ5IHRoZSBjYWxsaW5nIHRocmVhZC4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZmVyUnVsZVRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQljbGFzcyBUZXN0UnVsZSBpbXBsZW1lbnRzIElTY2hlZHVsaW5nUnVsZSB7Ci0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCQlyZXR1cm4gcnVsZSA9PSB0aGlzOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQkJcmV0dXJuIHJ1bGUgPT0gdGhpczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgc2ltcGxlIHJ1bm5hYmxlIHRoYXQgdXNlcyB0aGUgSVRocmVhZExpc3RlbmVyIGludGVyZmFjZSB0byB0cmFuc2ZlcgotCSAqIGEgc2NoZWR1bGluZyBydWxlLgotCSAqLwotCWNsYXNzIFRlc3RSdW5uYWJsZSBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcywgSVRocmVhZExpc3RlbmVyIHsKLQkJVGhyb3dhYmxlIGVycm9yOwotCQlwcml2YXRlIGZpbmFsIElTY2hlZHVsaW5nUnVsZSBydWxlOwotCi0JCXB1YmxpYyBUZXN0UnVubmFibGUoSVNjaGVkdWxpbmdSdWxlIGFSdWxlKSB7Ci0JCQl0aGlzLnJ1bGUgPSBhUnVsZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGVycm9yIGRvbid0IHJ1biB0aGUgcmVzdCBvZiB0aGUgdGVzdAotCQkJaWYgKGVycm9yICE9IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJdHJ5IHsKLQkJCQl0cnkgewotCQkJCQkvL2FjcXVpcmUgdGhlIHJ1bGUgdGhhdCB3YXMgdHJhbnNmZXJyZWQgKHdpbGwgaGFuZyBpZiB0aGUgcnVsZSB0cmFuc2ZlciBmYWlsZWQpCi0JCQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5iZWdpblJ1bGUocnVsZSwgbW9uaXRvcik7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmVuZFJ1bGUocnVsZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkvL3JlbWVtYmVyIGFueSBlcnJvciBzbyB3ZSBjYW4gZmFpbCB0aGUgdGVzdAotCQkJCWVycm9yID0gdDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRocmVhZENoYW5nZShUaHJlYWQgdGhyZWFkKSB7Ci0JCQl0cnkgewotCQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS50cmFuc2ZlclJ1bGUocnVsZSwgdGhyZWFkKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJLy9yZW1lbWJlciBhbnkgZXJyb3Igc28gd2UgY2FuIGZhaWwgdGhlIHRlc3QKLQkJCQllcnJvciA9IHQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVHJhbnNmZXJSdWxlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kYWxDb250ZXh0VHJhbnNmZXIoKSB7Ci0JCUlTY2hlZHVsaW5nUnVsZSBydWxlID0gbmV3IFRlc3RSdWxlKCk7Ci0JCVRlc3RSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBUZXN0UnVubmFibGUocnVsZSk7Ci0JCXRyeSB7Ci0JCQkvL2ZpcnN0IGdldCB0aGUgcnVsZSBpbiB0aGUgdGVzdCB0aHJlYWQKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5iZWdpblJ1bGUocnVsZSwgbnVsbCk7Ci0JCQkvL25vdyBleGVjdXRlIHRoZSBydW5uYWJsZSB1c2luZyBNb2RhbENvbnRleHQgLSB0aGUgcnVsZSBzaG91bGQgdHJhbnNmZXIgY29ycmVjdGx5Ci0JCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIHRydWUsIHJ1bm5hYmxlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJZmFpbCgiMS4wIik7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlmYWlsKCIxLjEiKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vbXVzdCByZWxlYXNlIHRoZSBydWxlIHdoZW4gZmluaXNoZWQKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5lbmRSdWxlKHJ1bGUpOwotCQl9Ci0JCS8vY2hlY2sgdGhlIHJ1bm5hYmxlIGZvciBlcnJvcnMKLQkJaWYgKHJ1bm5hYmxlLmVycm9yICE9IG51bGwpIHsKLQkJCXJ1bm5hYmxlLmVycm9yLnByaW50U3RhY2tUcmFjZSgpOwotCQkJZmFpbCgiMS4yIik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbnRleHRzL0J1Zzc0OTkwVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb250ZXh0cy9CdWc3NDk5MFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRkMmIwYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbnRleHRzL0J1Zzc0OTkwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRleHRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLkVuYWJsZWRTdWJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLklXb3JrYmVuY2hDb250ZXh0U3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBBIHRlc3QgZm9yIHdoZXRoZXIgcGFydCBpZGVudGlmaWVycyB3b3JrIHByb3Blcmx5IGZvciBFbmFibGVkU3VibWlzc2lvbnMuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJ1Zzc0OTkwVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5CdWc3NDk5MFRlc3Q8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBCdWc3NDk5MFRlc3QoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciBhIHBhcnQtc3BlY2lmaWMgY29udGV4dCAtLSBzdWJtaXR0ZWQgdmlhIEphdmEgY29kZSAtLSBpcwotICAgICAqIG1hdGNoZWQgcHJvcGVybHkuIFRoaXMgaXMgb25seSB1c2luZyB0aGUgcGFydCBpZC4gVGhlIHRlc3QgdmVyaWZpZXMgdGhhdAotICAgICAqIGl0IGlzIGFjdGl2ZSB3aGVuIHRoZSBwYXJ0IGlzIGFjdGl2ZSwgYW5kIG5vdCBhY3RpdmUgd2hlbiB0aGUgcGFydCBpcyBub3QKLSAgICAgKiBhY3RpdmUuCi0gICAgICogCi0gICAgICogQHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHNvbWV0aGluZyBnb2VzIHdyb25nIGNyZWF0aW5nIHRoZSBwYXJ0IHRvIHdoaWNoIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBoYW5kbGVyIGlzIHRpZWQuCi0gICAgICogIAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQYXJ0SWRTdWJtaXNzaW9uKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRGVmaW5lIGEgY29tbWFuZC4KLSAgICAgICAgZmluYWwgU3RyaW5nIHRlc3RDb250ZXh0SWQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuY29udGV4dHMuQnVnNzQ5OTAiOwotICAgICAgICBmaW5hbCBJV29ya2JlbmNoQ29udGV4dFN1cHBvcnQgY29udGV4dFN1cHBvcnQgPSBmV29ya2JlbmNoCi0gICAgICAgICAgICAgICAgLmdldENvbnRleHRTdXBwb3J0KCk7Ci0gICAgICAgIGZpbmFsIElDb250ZXh0IHRlc3RDb250ZXh0ID0gY29udGV4dFN1cHBvcnQuZ2V0Q29udGV4dE1hbmFnZXIoKQotICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KHRlc3RDb250ZXh0SWQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhbiBlbmFibGVkIHN1Ym1pc3Npb24uCi0gICAgICAgIGZpbmFsIEVuYWJsZWRTdWJtaXNzaW9uIHRlc3RTdWJtaXNzaW9uID0gbmV3IEVuYWJsZWRTdWJtaXNzaW9uKAotICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1ZpZXdQYXJ0IiwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICB0ZXN0Q29udGV4dElkKTsKLSAgICAgICAgY29udGV4dFN1cHBvcnQuYWRkRW5hYmxlZFN1Ym1pc3Npb24odGVzdFN1Ym1pc3Npb24pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBUZXN0IHRvIG1ha2Ugc3VyZSB0aGUgY29udGV4dCBpcyBub3QgY3VycmVudGx5IGVuYWJsZWQuCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgTW9ja1ZpZXdQYXJ0IGNvbnRleHQgc2hvdWxkIG5vdCBiZSBlbmFibGVkIiwKLSAgICAgICAgICAgICAgICAgICAgIXRlc3RDb250ZXh0LmlzRW5hYmxlZCgpKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIE9wZW4gYSB3aW5kb3cgd2l0aCB0aGUgTW9ja1ZpZXdQYXJ0LCBhbmQgbWFrZSBzdXJlIGl0IG5vdwotICAgICAgICAgICAgICogZW5hYmxlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZmluYWwgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG9wZW5UZXN0V2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgZmluYWwgSVZpZXdQYXJ0IG9wZW5lZFZpZXcgPSBwYWdlCi0gICAgICAgICAgICAgICAgICAgIC5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydCIpOwotICAgICAgICAgICAgcGFnZS5hY3RpdmF0ZShvcGVuZWRWaWV3KTsKLSAgICAgICAgICAgIHdoaWxlIChmV29ya2JlbmNoLmdldERpc3BsYXkoKS5yZWFkQW5kRGlzcGF0Y2goKSkKLSAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgTW9ja1ZpZXdQYXJ0IGNvbnRleHQgc2hvdWxkIGJlIGVuYWJsZWQiLAotICAgICAgICAgICAgICAgICAgICB0ZXN0Q29udGV4dC5pc0VuYWJsZWQoKSk7Ci0KLSAgICAgICAgICAgIC8vIEhpZGUgdGhlIHZpZXcsIGFuZCB0ZXN0IHRoYXQgaXMgYmVjb21lcyBkaXNhYmxlZCBhZ2Fpbi4KLSAgICAgICAgICAgIHBhZ2UuaGlkZVZpZXcob3BlbmVkVmlldyk7Ci0gICAgICAgICAgICB3aGlsZSAoZldvcmtiZW5jaC5nZXREaXNwbGF5KCkucmVhZEFuZERpc3BhdGNoKCkpCi0gICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIE1vY2tWaWV3UGFydCBjb250ZXh0IHNob3VsZCBub3QgYmUgZW5hYmxlZCIsCi0gICAgICAgICAgICAgICAgICAgICF0ZXN0Q29udGV4dC5pc0VuYWJsZWQoKSk7Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNvbnRleHRTdXBwb3J0LnJlbW92ZUVuYWJsZWRTdWJtaXNzaW9uKHRlc3RTdWJtaXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb250ZXh0cy9CdWc4NDc2M1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29udGV4dHMvQnVnODQ3NjNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNGU5YjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb250ZXh0cy9CdWc4NDc2M1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5jb250ZXh0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Db21tYW5kTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0cy5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHMuQ29udGV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0cy5Db250ZXh0TWFuYWdlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHMuSUNvbnRleHRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5TY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5jb250ZXh0cy5JQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBBIHRlc3QgY2FzZSBjb3ZlcmluZyB0aGUgc2NlbmFyaW8gZGVzY3JpYmVkIGluIEJ1ZyA4NDc2My4gVGhlIHByb2JsZW0gd2FzCi0gKiB0aGF0IHRoZSBjb250ZXh0IG1hbmFnZXIgd2FzIGV4cG9zaW5nIGl0cyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMsIGFuZCB0aGUKLSAqIGJpbmRpbmcgbWFuYWdlciB3YXMgbWFuZ2xpbmcgdGhlbS4gRGVidWcgdGhlbiByZXNwb25kZWQgdG8gYmFkIGluZm9ybWF0aW9uIGluCi0gKiB0aGUgPGNvZGU+cHJldmlvdXNseUVuYWJsZWRDb250ZXh0SWRzPC9jb2RlPiBwcm9wZXJ0eSBvbiB0aGUgY29udGV4dCBldmVudC4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQnVnODQ3NjNUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBUaGUgYmluZGluZyBtYW5hZ2VyIHRvIHVzZSBpbiBlYWNoIHRlc3QgY2FzZS4gQSBuZXcgYmluZGluZyBtYW5hZ2VyIGlzCi0JICogY3JlYXRlZCBmb3IgZWFjaCB0ZXN0IGNhc2UsIGFuZCBpdCBpcyBkaXNwb3NlZCB3aGVuIHRoZSB0ZXN0IGlzIG92ZXIuCi0JICovCi0JcHJpdmF0ZSBCaW5kaW5nTWFuYWdlciBiaW5kaW5nTWFuYWdlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY29udGV4dCBtYW5hZ2VyIHRvIHVzZSBpbiBlYWNoIHRlc3QgY2FzZS4gQSBuZXcgY29udGV4dCBtYW5hZ2VyIGlzCi0JICogY3JlYXRlZCBmb3IgZWFjaCB0ZXN0IGNhc2UsIGFuZCBpdCBpcyBkaXNwb3NlZCB3aGVuIHRoZSB0ZXN0IGlzIG92ZXIuCi0JICovCi0JcHJpdmF0ZSBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY29udGV4dCBtYW5hZ2VyIGxpc3RlbmVyIHRvIHVzZSBpbiBlYWNoIHRlc3QgY2FzZS4gQSBuZXcgY29udGV4dAotCSAqIG1hbmFnZXIgbGlzdGVuZXIgaXMgY3JlYXRlZCBmb3IgZWFjaCB0ZXN0IGNhc2UsIGFuZCBpdCBpcyBkaXNwb3NlZCB3aGVuCi0JICogdGhlIHRlc3QgaXMgb3Zlci4KLQkgKi8KLQlwcml2YXRlIElDb250ZXh0TWFuYWdlckxpc3RlbmVyIGNvbnRleHRNYW5hZ2VyTGlzdGVuZXIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIHNldCBvZiB0aGUgcHJldmlvdXMgY29udGV4dCBpZGVudGlmaWVycyByZXR1cm5lZCBieSB0aGUgbGFzdCBjb250ZXh0Ci0JICogbWFuYWdlciBldmVudC4gVGhpcyB2YWx1ZSBpcyBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4gYXQgdGhlIGVuZCBvZgotCSAqIGVhY2ggdGVzdC4KLQkgKi8KLQlwcml2YXRlIFNldCBwcmV2aW91c0NvbnRleHRJZHMgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIDxjb2RlPkJ1Zzg0NzYzVGVzdDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0JICovCi0JcHVibGljIEJ1Zzg0NzYzVGVzdChmaW5hbCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgbWFuYWdlciBhbmQgYSBiaW5kaW5nIG1hbmFnZXIgZm9yIHVzZSBpbiB0aGUgdGVzdAotCSAqIGNhc2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB7Ci0JCWNvbnRleHRNYW5hZ2VyID0gbmV3IENvbnRleHRNYW5hZ2VyKCk7Ci0JCWNvbnRleHRNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgSUNvbnRleHRNYW5hZ2VyTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbnRleHRNYW5hZ2VyQ2hhbmdlZCgKLQkJCQkJQ29udGV4dE1hbmFnZXJFdmVudCBjb250ZXh0TWFuYWdlckV2ZW50KSB7Ci0JCQkJcHJldmlvdXNDb250ZXh0SWRzID0gY29udGV4dE1hbmFnZXJFdmVudAotCQkJCQkJLmdldFByZXZpb3VzbHlBY3RpdmVDb250ZXh0SWRzKCk7Ci0JCQkJaWYgKHByZXZpb3VzQ29udGV4dElkcyAhPSBudWxsKSB7Ci0JCQkJCXByZXZpb3VzQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KHByZXZpb3VzQ29udGV4dElkcyk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0JCWNvbnRleHRNYW5hZ2VyLmFkZENvbnRleHRNYW5hZ2VyTGlzdGVuZXIoY29udGV4dE1hbmFnZXJMaXN0ZW5lcik7Ci0JCWJpbmRpbmdNYW5hZ2VyID0gbmV3IEJpbmRpbmdNYW5hZ2VyKGNvbnRleHRNYW5hZ2VyLAotCQkJCW5ldyBDb21tYW5kTWFuYWdlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlcyB0aGUgY29udGV4dCBtYW5hZ2VyIGFuZCBiaW5kaW5nIG1hbmFnZXIgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgewotCQljb250ZXh0TWFuYWdlciA9IG51bGw7Ci0JCWNvbnRleHRNYW5hZ2VyTGlzdGVuZXIgPSBudWxsOwotCQlwcmV2aW91c0NvbnRleHRJZHMgPSBudWxsOwotCQliaW5kaW5nTWFuYWdlciA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGVzdHN0IHdoZXRoZXIgdGhlIGJpbmRpbmcgbWFuYWdlciB3aWxsIG92ZXJ3cml0ZSBpbmZvcm1hdGlvbiBpbiB0aGUKLQkgKiBjb250ZXh0IG1hbmFnZXIuIEluIHBhcnRpY3VsYXIsIHdoZXRoZXIgdGhlIGxpc3Qgb2YgcHJldmlvdXMgZW5hYmxlZAotCSAqIGNvbnRleHQgaWRlbnRpZmllcnMgd2lsbCBiZSBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc2NoZW1lIHdlIHRyeSB0byBhY3RpdmF0ZSBpcyBub3QgZGVmaW5lZC4KLQkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgIkNUUkwrRiIgY2Fubm90IGJlIHBhcnNlZCBmb3Igc29tZSByZWFzb24uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdpbmRvd0NoaWxkV2hlbkRpYWxvZygpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uLAotCQkJUGFyc2VFeGNlcHRpb24gewotCQkvLyBEZWZpbmUgdGhlIGNvbnRleHRzIHRvIHVzZS4KLQkJZmluYWwgQ29udGV4dCBkaWFsb2dBbmRXaW5kb3dzQ29udGV4dCA9IGNvbnRleHRNYW5hZ2VyCi0JCQkJLmdldENvbnRleHQoSUNvbnRleHRJZHMuQ09OVEVYVF9JRF9ESUFMT0dfQU5EX1dJTkRPVyk7Ci0JCWRpYWxvZ0FuZFdpbmRvd3NDb250ZXh0LmRlZmluZSgiSW4gRGlhbG9ncyBhbmQgV2luZG93cyIsIG51bGwsIG51bGwpOwotCQlmaW5hbCBDb250ZXh0IGRpYWxvZ0NvbnRleHQgPSBjb250ZXh0TWFuYWdlcgotCQkJCS5nZXRDb250ZXh0KElDb250ZXh0SWRzLkNPTlRFWFRfSURfRElBTE9HKTsKLQkJZGlhbG9nQ29udGV4dC5kZWZpbmUoIkluIERpYWxvZ3MiLCBudWxsLAotCQkJCUlDb250ZXh0SWRzLkNPTlRFWFRfSURfRElBTE9HX0FORF9XSU5ET1cpOwotCQlmaW5hbCBDb250ZXh0IHdpbmRvd0NvbnRleHQgPSBjb250ZXh0TWFuYWdlcgotCQkJCS5nZXRDb250ZXh0KElDb250ZXh0SWRzLkNPTlRFWFRfSURfV0lORE9XKTsKLQkJd2luZG93Q29udGV4dC5kZWZpbmUoIkluIFdpbmRvd3MiLCBudWxsLAotCQkJCUlDb250ZXh0SWRzLkNPTlRFWFRfSURfRElBTE9HX0FORF9XSU5ET1cpOwotCQlmaW5hbCBDb250ZXh0IHdpbmRvd0NoaWxkQ29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoInNpYmxpbmciKTsKLQkJd2luZG93Q2hpbGRDb250ZXh0LmRlZmluZSgiU2libGluZyIsIG51bGwsCi0JCQkJSUNvbnRleHRJZHMuQ09OVEVYVF9JRF9XSU5ET1cpOwotCi0JCS8vIEZvcmNlIGEgYmluZGluZyBjb21wdXRhdGlvbi4KLQkJZmluYWwgU2NoZW1lIHNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZSgibmEiKTsKLQkJc2NoZW1lLmRlZmluZSgibmFtZSIsIG51bGwsIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoc2NoZW1lKTsKLQkJZmluYWwgQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXIgPSBuZXcgQ29tbWFuZE1hbmFnZXIoKTsKLQkJZmluYWwgQ29tbWFuZCBjb21tYW5kID0gY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZCgiY29tbWFuZElkIik7Ci0JCWZpbmFsIFBhcmFtZXRlcml6ZWRDb21tYW5kIHBhcmFtZXRlcml6ZWRDb21tYW5kID0gbmV3IFBhcmFtZXRlcml6ZWRDb21tYW5kKAotCQkJCWNvbW1hbmQsIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKG5ldyBLZXlCaW5kaW5nKEtleVNlcXVlbmNlCi0JCQkJLmdldEluc3RhbmNlKCJDVFJMK0YiKSwgcGFyYW1ldGVyaXplZENvbW1hbmQsIHNjaGVtZS5nZXRJZCgpLAotCQkJCXdpbmRvd0NoaWxkQ29udGV4dC5nZXRJZCgpLCBudWxsLCBudWxsLCBudWxsLCBCaW5kaW5nLlNZU1RFTSkpOwotCQliaW5kaW5nTWFuYWdlci5nZXRBY3RpdmVCaW5kaW5nc0ZvcigoUGFyYW1ldGVyaXplZENvbW1hbmQpIG51bGwpOwotCi0JCS8vIEFjdGl2YXRlIHRoZSBkaWFsb2cgY29udGV4dCBhbmQgdGhlIHNpYmxpbmcuCi0JCWZpbmFsIFNldCBhY3RpdmVDb250ZXh0SWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJYWN0aXZlQ29udGV4dElkcy5hZGQoSUNvbnRleHRJZHMuQ09OVEVYVF9JRF9ESUFMT0cpOwotCQlhY3RpdmVDb250ZXh0SWRzLmFkZChJQ29udGV4dElkcy5DT05URVhUX0lEX0RJQUxPR19BTkRfV0lORE9XKTsKLQkJYWN0aXZlQ29udGV4dElkcy5hZGQod2luZG93Q2hpbGRDb250ZXh0LmdldElkKCkpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCi0JCS8vIEZvcmNlIGEgYmluZGluZyBjb21wdXRhdGlvbi4KLQkJYmluZGluZ01hbmFnZXIuZ2V0QWN0aXZlQmluZGluZ3NGb3IoKFBhcmFtZXRlcml6ZWRDb21tYW5kKSBudWxsKTsKLQotCQkvLyBBY3RpdmUgdGhlIHdpbmRvdyBjb250ZXh0LgotCQlhY3RpdmVDb250ZXh0SWRzLnJlbW92ZShJQ29udGV4dElkcy5DT05URVhUX0lEX0RJQUxPRyk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKElDb250ZXh0SWRzLkNPTlRFWFRfSURfV0lORE9XKTsKLQkJY29udGV4dE1hbmFnZXIuc2V0QWN0aXZlQ29udGV4dElkcyhhY3RpdmVDb250ZXh0SWRzKTsKLQotCQkvLyBGb3JjZSBhIGJpbmRpbmcgY29tcHV0YXRpb24uCi0JCWJpbmRpbmdNYW5hZ2VyLmdldEFjdGl2ZUJpbmRpbmdzRm9yKChQYXJhbWV0ZXJpemVkQ29tbWFuZCkgbnVsbCk7Ci0KLQkJLyoKLQkJICogQ2hlY2sgdG8gc2VlIHdoYXQgdGhlIGxpc3RlbmVyIGdvdCBhcyB0aGUgbGlzdCBvZiBwcmV2aW91c2x5IGFjdGl2ZQotCQkgKiBjb250ZXh0IGlkZW50aWZpZXJzLgotCQkgKi8KLQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgaGF2ZSBiZWVuIDMgY29udGV4dCBpZHMgYWN0aXZlIHByZXZpb3VzbHkiLAotCQkJCTMsIHByZXZpb3VzQ29udGV4dElkcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgcHJldmlvdXMgY29udGV4dHMgc2hvdWxkIGluY2x1ZGUgdGhlIGRpYWxvZyBjb250ZXh0IiwKLQkJCQlwcmV2aW91c0NvbnRleHRJZHMuY29udGFpbnMoSUNvbnRleHRJZHMuQ09OVEVYVF9JRF9ESUFMT0cpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHByZXZpb3VzIGNvbnRleHRzIHNob3VsZCBpbmNsdWRlIHRoZSBkaWFsb2cgY29udGV4dCIsCi0JCQkJcHJldmlvdXNDb250ZXh0SWRzCi0JCQkJCQkuY29udGFpbnMoSUNvbnRleHRJZHMuQ09OVEVYVF9JRF9ESUFMT0dfQU5EX1dJTkRPVykpOwotCQlhc3NlcnRUcnVlKCJUaGUgcHJldmlvdXMgY29udGV4dHMgc2hvdWxkIGluY2x1ZGUgdGhlIGRpYWxvZyBjb250ZXh0IiwKLQkJCQlwcmV2aW91c0NvbnRleHRJZHMuY29udGFpbnMod2luZG93Q2hpbGRDb250ZXh0LmdldElkKCkpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0U2libGluZ0NvbnRleHQiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbnRleHRzL0NvbnRleHRzVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbnRleHRzL0NvbnRleHRzVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NzVlNmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9jb250ZXh0cy9Db250ZXh0c1Rlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRleHRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUaGUgc3VpdGUgb2YgdGVzdHMgcmVsYXRlZCB0byB0aGUgIm9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIiBleHRlbnNpb24gcG9pbnQsCi0gKiBhbmQgdGhlICJvcmcuZWNsaXNlLnVpLmNvbnRleHRzIiBKYXZhIEFQSS4gVGhpcyBpbmNsdWRlcyB0ZXN0cyBkZWFsaW5nIHdpdGgKLSAqIG90aGVyIGV4dGVuc2lvbiBwb2ludHMgb3IgZWxlbWVudHMgaW4gb3RoZXIgZXh0ZW5zaW9uIHBvaW50cyB0aGF0IGhhdmUgYmVlbgotICogZGVwcmVjYXRlZCB0byBiZSByZXBsYWNlZCBieSB0aGlzIG9uZS4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGV4dHNUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VpdGUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29udGV4dHNUZXN0U3VpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPkNvbnRleHRzVGVzdFN1aXRlPC9jb2RlPiB3aXRoIGFsbCBvZgotICAgICAqIHRoZSByZWxldmVudCB0ZXN0IGNhc2VzLgotICAgICAqLwotICAgIHB1YmxpYyBDb250ZXh0c1Rlc3RTdWl0ZSgpIHsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEJ1Zzc0OTkwVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShCdWc4NDc2M1Rlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoRXh0ZW5zaW9uVGVzdENhc2UuY2xhc3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29udGV4dHMvRXh0ZW5zaW9uVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvY29udGV4dHMvRXh0ZW5zaW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhN2YxNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2NvbnRleHRzL0V4dGVuc2lvblRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRleHRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29udGV4dHMuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29udGV4dHMuSUNvbnRleHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLklXb3JrYmVuY2hDb250ZXh0U3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5Ob3REZWZpbmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRoZSB0ZXN0IGNhc2UgZm9yIHJlYWRpbmcgaW4gZWxlbWVudHMgZnJvbSB0aGUgZXh0ZW5zaW9uIHBvaW50LiBUaGlzIHZlcmlmaWVzCi0gKiB0aGF0IGNvbnRleHRzIGRlZmluZWQgaW4gdGhpcyB0ZXN0IHBsdWctaW4ncyBleHRlbnNpb25zIGFyZSBhbGwgcHJvcGVybHkgcmVhZAotICogaW4uIFRoaXMgaW5jbHVkZXMgZXh0ZW5zaW9ucyByZWFkIGZyb20gZGVwcmVjYXRlZCBsb2NhdGlvbnMsIGFzIHdlbGwgYXMgdGhlCi0gKiBjdXJyZW50bHkgcHJlZmVycmVkIHdheSBvZiBzcGVjaWZ5aW5nIGNvbnRleHRzLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25UZXN0Q2FzZSBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5FeHRlbnNpb25UZXN0Q2FzZTwvY29kZT4gd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHRlc3Q7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXh0ZW5zaW9uVGVzdENhc2UoZmluYWwgU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSAib3JnLmVjbGlwc2UudWkuYWNjZWxlcmF0b3JTY29wZXMiIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUKLSAgICAgKiByZWFkIGluIGJ5IEVjbGlwc2UuIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGN1cnJlbnRseSBkZXByZWNhdGVkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFRoaXMgc2hvdWxkbid0IHJlYWxseSBiZSBwb3NzaWJsZSwgYXMgdGhlIHRlc3Qgc2hvdWxkIGZhaWwKLSAgICAgKiAgICAgICAgICAgICBncmFjZWZ1bGx5IGJlZm9yZSB0aGlzIGNvdWxkIGhhcHBlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0QWNjZWxlcmF0b3JTY29wZXMoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIElXb3JrYmVuY2hDb250ZXh0U3VwcG9ydCBjb250ZXh0U3VwcG9ydCA9IGZXb3JrYmVuY2gKLSAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dFN1cHBvcnQoKTsKLSAgICAgICAgZmluYWwgSUNvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyID0gY29udGV4dFN1cHBvcnQKLSAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dE1hbmFnZXIoKTsKLQotICAgICAgICBmaW5hbCBJQ29udGV4dCBjb250ZXh0MSA9IGNvbnRleHRNYW5hZ2VyCi0gICAgICAgICAgICAgICAgLmdldENvbnRleHQoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFjY2VsZXJhdG9yU2NvcGVzLnRlc3QxIik7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgIkNvbnRleHQgY29udHJpYnV0ZWQgdmlhICdvcmcuZWNsaXBzZS51aS5hY2NlbGVyYXRvclNjb3BlcycgaXMgbm90IGxvYWRlZCBwcm9wZXJseS4iLAotICAgICAgICAgICAgICAgIGNvbnRleHQxLmlzRGVmaW5lZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJDb250ZXh0IGNvbnRyaWJ1dGVkIHZpYSAnb3JnLmVjbGlwc2UudWkuYWNjZWxlcmF0b3JTY29wZXMnIGRvZXMgbm90IGdldCBpdHMgbmFtZS4iLAotICAgICAgICAgICAgICAgICJUZXN0IEFjY2VsZXJhdG9yIFNjb3BlIDEiLCBjb250ZXh0MS5nZXROYW1lKCkpOwotCi0gICAgICAgIGZpbmFsIElDb250ZXh0IGNvbnRleHQyID0gY29udGV4dE1hbmFnZXIKLSAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgib3JnLmVjbGlwc2UudWkudGVzdHMuYWNjZWxlcmF0b3JTY29wZXMudGVzdDIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAiQ29udGV4dCBjb250cmlidXRlZCB2aWEgJ29yZy5lY2xpcHNlLnVpLmFjY2VsZXJhdG9yU2NvcGVzJyBpcyBub3QgbG9hZGVkIHByb3Blcmx5LiIsCi0gICAgICAgICAgICAgICAgY29udGV4dDIuaXNEZWZpbmVkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIkNvbnRleHQgY29udHJpYnV0ZWQgdmlhICdvcmcuZWNsaXBzZS51aS5hY2NlbGVyYXRvclNjb3BlcycgZG9lcyBub3QgZ2V0IGl0cyBuYW1lLiIsCi0gICAgICAgICAgICAgICAgIlRlc3QgQWNjZWxlcmF0b3IgU2NvcGUgMiIsIGNvbnRleHQyLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiQ29udGV4dCBjb250cmlidXRlZCB2aWEgJ29yZy5lY2xpcHNlLnVpLmFjY2VsZXJhdG9yU2NvcGVzJyBkb2VzIG5vdCBnZXQgaXRzIHBhcmVudC4iLAotICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hY2NlbGVyYXRvclNjb3Blcy50ZXN0MSIsIGNvbnRleHQyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyZW50SWQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgInNjb3BlcyIgZWxlbWVudCBpbiB0aGUgIm9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIgotICAgICAqIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgcmVhZCBpbiBhcyBhIGNvbnRleHQgYnkgRWNsaXBzZS4gVGhpcyBlbGVtZW50IGlzCi0gICAgICogY3VycmVudGx5IGRlcHJlY2F0ZWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGJlIHBvc3NpYmxlLCBhcyB0aGUgdGVzdCBzaG91bGQgZmFpbAotICAgICAqICAgICAgICAgICAgIGdyYWNlZnVsbHkgYmVmb3JlIHRoaXMgY291bGQgaGFwcGVuLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDb21tYW5kc1Njb3BlcygpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgSVdvcmtiZW5jaENvbnRleHRTdXBwb3J0IGNvbnRleHRTdXBwb3J0ID0gZldvcmtiZW5jaAotICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0U3VwcG9ydCgpOwotICAgICAgICBmaW5hbCBJQ29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXIgPSBjb250ZXh0U3VwcG9ydAotICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0TWFuYWdlcigpOwotCi0gICAgICAgIGZpbmFsIElDb250ZXh0IGNvbnRleHQxID0gY29udGV4dE1hbmFnZXIKLSAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgib3JnLmVjbGlwc2UudWkudGVzdHMuY29tbWFuZHMuc2NvcGUxIik7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgIkNvbnRleHQgY29udHJpYnV0ZWQgdmlhICdvcmcuZWNsaXBzZS51aS5jb21tYW5kcycgaXMgbm90IGxvYWRlZCBwcm9wZXJseS4iLAotICAgICAgICAgICAgICAgIGNvbnRleHQxLmlzRGVmaW5lZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJDb250ZXh0IGNvbnRyaWJ1dGVkIHZpYSAnb3JnLmVjbGlwc2UudWkuY29tbWFuZHMnIGRvZXMgbm90IGdldCBpdHMgbmFtZS4iLAotICAgICAgICAgICAgICAgICJUZXN0IFNjb3BlIDEiLCBjb250ZXh0MS5nZXROYW1lKCkpOwotCi0gICAgICAgIGZpbmFsIElDb250ZXh0IGNvbnRleHQyID0gY29udGV4dE1hbmFnZXIKLSAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgib3JnLmVjbGlwc2UudWkudGVzdHMuY29tbWFuZHMuc2NvcGUyIik7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgIkNvbnRleHQgY29udHJpYnV0ZWQgdmlhICdvcmcuZWNsaXBzZS51aS5jb21tYW5kcycgaXMgbm90IGxvYWRlZCBwcm9wZXJseS4iLAotICAgICAgICAgICAgICAgIGNvbnRleHQyLmlzRGVmaW5lZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJDb250ZXh0IGNvbnRyaWJ1dGVkIHZpYSAnb3JnLmVjbGlwc2UudWkuY29tbWFuZHMnIGRvZXMgbm90IGdldCBpdHMgbmFtZS4iLAotICAgICAgICAgICAgICAgICJUZXN0IFNjb3BlIDIiLCBjb250ZXh0Mi5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIkNvbnRleHQgY29udHJpYnV0ZWQgdmlhICdvcmcuZWNsaXBzZS51aS5jb21tYW5kcycgZG9lcyBub3QgZ2V0IGl0cyBwYXJlbnQuIiwKLSAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UudWkudGVzdHMuY29tbWFuZHMuc2NvcGUxIiwgY29udGV4dDIuZ2V0UGFyZW50SWQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgY3VycmVudGx5IHByZWZlcnJlZCB3YXkgb2Ygc3BlY2lmaXlpbmcgY29udGV4dHMgY2FuIGJlCi0gICAgICogcmVhZCBpbiBwcm9wZXJseSBieSBFY2xpcHNlLiBUaGlzIHVzZXMgYWxsIG9mIHRoZSBub24tZGVwcmVjYXRlZAotICAgICAqIGF0dHJpYnV0ZXMuCi0gICAgICogCi0gICAgICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGJlIHBvc3NpYmxlLCBhcyB0aGUgdGVzdCBzaG91bGQgZmFpbAotICAgICAqICAgICAgICAgICAgIGdyYWNlZnVsbHkgYmVmb3JlIHRoaXMgY291bGQgaGFwcGVuLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDb250ZXh0cygpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgSVdvcmtiZW5jaENvbnRleHRTdXBwb3J0IGNvbnRleHRTdXBwb3J0ID0gZldvcmtiZW5jaAotICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0U3VwcG9ydCgpOwotICAgICAgICBmaW5hbCBJQ29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXIgPSBjb250ZXh0U3VwcG9ydAotICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0TWFuYWdlcigpOwotCi0gICAgICAgIGZpbmFsIElDb250ZXh0IGNvbnRleHQxID0gY29udGV4dE1hbmFnZXIKLSAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgib3JnLmVjbGlwc2UudWkudGVzdHMuY29udGV4dHMuY29udGV4dDEiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAiQ29udGV4dCBjb250cmlidXRlZCB2aWEgJ29yZy5lY2xpcHNlLnVpLmNvbnRleHRzJyBpcyBub3QgbG9hZGVkIHByb3Blcmx5LiIsCi0gICAgICAgICAgICAgICAgY29udGV4dDEuaXNEZWZpbmVkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIkNvbnRleHQgY29udHJpYnV0ZWQgdmlhICdvcmcuZWNsaXBzZS51aS5jb250ZXh0cycgZG9lcyBub3QgZ2V0IGl0cyBuYW1lLiIsCi0gICAgICAgICAgICAgICAgIlRlc3QgQ29udGV4dCAxIiwgY29udGV4dDEuZ2V0TmFtZSgpKTsKLQotICAgICAgICBmaW5hbCBJQ29udGV4dCBjb250ZXh0MiA9IGNvbnRleHRNYW5hZ2VyCi0gICAgICAgICAgICAgICAgLmdldENvbnRleHQoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRleHRzLmNvbnRleHQyIik7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgIkNvbnRleHQgY29udHJpYnV0ZWQgdmlhICdvcmcuZWNsaXBzZS51aS5jb250ZXh0cycgaXMgbm90IGxvYWRlZCBwcm9wZXJseS4iLAotICAgICAgICAgICAgICAgIGNvbnRleHQyLmlzRGVmaW5lZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJDb250ZXh0IGNvbnRyaWJ1dGVkIHZpYSAnb3JnLmVjbGlwc2UudWkuY29udGV4dHMnIGRvZXMgbm90IGdldCBpdHMgbmFtZS4iLAotICAgICAgICAgICAgICAgICJUZXN0IENvbnRleHQgMiIsIGNvbnRleHQyLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiQ29udGV4dCBjb250cmlidXRlZCB2aWEgJ29yZy5lY2xpcHNlLnVpLmNvbnRleHRzJyBkb2VzIG5vdCBnZXQgaXRzIHBhcmVudC4iLAotICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb250ZXh0cy5jb250ZXh0MSIsIGNvbnRleHQyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyZW50SWQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kYXRhdHJhbnNmZXIvRGF0YVRyYW5zZmVyVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2ZlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNDNjMjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kYXRhdHJhbnNmZXIvRGF0YVRyYW5zZmVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGF0YXRyYW5zZmVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhVHJhbnNmZXJUZXN0Q2FzZSBleHRlbmRzIFVJVGVzdENhc2UgewotCi0JcHVibGljIERhdGFUcmFuc2ZlclRlc3RDYXNlKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCS8qKgotCSAqIERlbGV0ZSBhbGwgZmlsZXMgYW5kIGZvbGRlcnMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBkZWxldGUgdGhlIHJvb3QgZm9sZGVyIG9mIHRoZQotCSAqIGdpdmVuIGRpcmVjdG9yeS4gCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpewotCQlpZiAoZGlyZWN0b3J5LmV4aXN0cygpKXsKLQkgICAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKXsKLQkJICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5pc0RpcmVjdG9yeSgpKXsKLQkJICAgICAgICAgICAgICAgIGRlbGV0ZURpcmVjdG9yeShjaGlsZHJlbltpXSk7Ci0JCSAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgZWxzZXsKLQkJICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW5baV0uZGVsZXRlKCkpCi0JCSAgICAgICAgICAgICAgICAJZmFpbCgiQ291bGQgbm90IGRlbGV0ZSAiICsgY2hpbGRyZW5baV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkgICAgICAgICAgICB9Ci0JCSAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgaWYgKCFkaXJlY3RvcnkuZGVsZXRlKCkpCi0JICAgICAgICAJZmFpbCgiQ291bGQgbm90IGRlbGV0ZSAiICsgZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9EYXRhVHJhbnNmZXJUZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2ZlclRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWNjYTMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2ZlclRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogLgotICovCi1wdWJsaWMgY2xhc3MgRGF0YVRyYW5zZmVyVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1aXRlLiAgVGhpcyBpcyByZXF1aXJlZCB0bwotICAgICAqIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IERhdGFUcmFuc2ZlclRlc3RTdWl0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCB0aGUgdGVzdCBzdWl0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0YVRyYW5zZmVyVGVzdFN1aXRlKCkgewotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSW1wb3J0T3BlcmF0aW9uVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSW1wb3J0QXJjaGl2ZU9wZXJhdGlvblRlc3QuY2xhc3MpKTsgCi0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShFeHBvcnRGaWxlU3lzdGVtT3BlcmF0aW9uVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoRXhwb3J0QXJjaGl2ZUZpbGVPcGVyYXRpb25UZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJbXBvcnRFeGlzdGluZ1Rlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKEltcG9ydEV4cG9ydFdpemFyZHNDYXRlZ29yeVRlc3RzLmNsYXNzKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kYXRhdHJhbnNmZXIvRXhwb3J0QXJjaGl2ZUZpbGVPcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9FeHBvcnRBcmNoaXZlRmlsZU9wZXJhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxODBjNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9FeHBvcnRBcmNoaXZlRmlsZU9wZXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuaGFybmVzcy5GaWxlU3lzdGVtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSU92ZXJ3cml0ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLkFyY2hpdmVGaWxlRXhwb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLlRhckVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLlRhckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgRXhwb3J0QXJjaGl2ZUZpbGVPcGVyYXRpb25UZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSBpbXBsZW1lbnRzCi0JCUlPdmVyd3JpdGVRdWVyeSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEZJTEVfTkFNRSA9ICJ0ZXN0IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgWklQX0ZJTEVfRVhUID0gInppcCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRBUl9GSUxFX0VYVCA9ICJ0YXIiOwotCQotICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsRGlyZWN0b3J5OwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGZpbGVQYXRoOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBkaXJlY3RvcnlOYW1lcyA9IHsgImRpcjEiLCAiZGlyMiIgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nW10gZmlsZU5hbWVzID0geyAiZmlsZTEudHh0IiwgImZpbGUyLnR4dCIgfTsKLQotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gZmxhdHRlblBhdGhzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGV4Y2x1ZGVQcm9qZWN0UGF0aCA9IGZhbHNlOwotICAgIAotCXB1YmxpYyBFeHBvcnRBcmNoaXZlRmlsZU9wZXJhdGlvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBxdWVyeU92ZXJ3cml0ZShTdHJpbmcgcGF0aFN0cmluZykgewotCQlyZXR1cm4gIiI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnRTdGF0dXMoKXsKLQkJTGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc291cmNlcy5hZGQocHJvamVjdCk7Ci0gICAgICAgIEFyY2hpdmVGaWxlRXhwb3J0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IAotICAgICAgICAJbmV3IEFyY2hpdmVGaWxlRXhwb3J0T3BlcmF0aW9uKHJlc291cmNlcywgbG9jYWxEaXJlY3RvcnkpOwotCi0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJU3RhdHVzLk9LKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0WmlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbGVQYXRoID0gbG9jYWxEaXJlY3RvcnkgKyAiLyIgKyBGSUxFX05BTUUgKyAiLiIgKyBaSVBfRklMRV9FWFQ7Ci0JCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXNvdXJjZXMuYWRkKHByb2plY3QpOwotICAgICAgICBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSAKLSAgICAgICAgCW5ldyBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbihyZXNvdXJjZXMsIGZpbGVQYXRoKTsKLQotICAgICAgICBvcGVyYXRpb24uc2V0VXNlQ29tcHJlc3Npb24oZmFsc2UpOwotICAgICAgICBvcGVyYXRpb24uc2V0VXNlVGFyRm9ybWF0KGZhbHNlKTsKLSAgICAgICAgb3BlblRlc3RXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIHZlcmlmeUZvbGRlcnMoZGlyZWN0b3J5TmFtZXMubGVuZ3RoLCBaSVBfRklMRV9FWFQpOwkKLSAgICAgICAgCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnRaaXBDb21wcmVzc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbGVQYXRoID0gbG9jYWxEaXJlY3RvcnkgKyAiLyIgKyBGSUxFX05BTUUgKyAiLiIgKyBaSVBfRklMRV9FWFQ7Ci0JCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXNvdXJjZXMuYWRkKHByb2plY3QpOwotICAgICAgICBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSAKLSAgICAgICAgCW5ldyBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbihyZXNvdXJjZXMsIGZpbGVQYXRoKTsKLQotICAgICAgICBvcGVyYXRpb24uc2V0VXNlQ29tcHJlc3Npb24odHJ1ZSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRVc2VUYXJGb3JtYXQoZmFsc2UpOwotICAgICAgICBvcGVuVGVzdFdpbmRvdygpLnJ1bih0cnVlLCB0cnVlLCBvcGVyYXRpb24pOwkJCi0JCXZlcmlmeUNvbXByZXNzZWQoWklQX0ZJTEVfRVhUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEV4cG9ydFppcENyZWF0ZVNlbGVjdGVkRGlyZWN0b3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmlsZVBhdGggPSBsb2NhbERpcmVjdG9yeSArICIvIiArIEZJTEVfTkFNRSArICIuIiArIFpJUF9GSUxFX0VYVDsKLQkJTGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBwcm9qZWN0Lm1lbWJlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKXsKLQkJCWlmIChpc0RpcmVjdG9yeShtZW1iZXJzW2ldKSl7Ci0JCQkJSVJlc291cmNlW10gZm9sZGVyTWVtYmVycyA9ICgoSUZvbGRlciltZW1iZXJzW2ldKS5tZW1iZXJzKCk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBmb2xkZXJNZW1iZXJzLmxlbmd0aDsgaysrKXsKLQkJCQkJaWYgKGlzRmlsZShmb2xkZXJNZW1iZXJzW2tdKSl7Ci0JCQkJCQlyZXNvdXJjZXMuYWRkKGZvbGRlck1lbWJlcnNba10pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgICAgIEFyY2hpdmVGaWxlRXhwb3J0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IAotICAgICAgICAJbmV3IEFyY2hpdmVGaWxlRXhwb3J0T3BlcmF0aW9uKHJlc291cmNlcywgZmlsZVBhdGgpOwotCi0gICAgICAgIG9wZXJhdGlvbi5zZXRDcmVhdGVMZWFkdXBTdHJ1Y3R1cmUoZmFsc2UpOwotICAgICAgICBvcGVyYXRpb24uc2V0VXNlQ29tcHJlc3Npb24oZmFsc2UpOwotICAgICAgICBvcGVyYXRpb24uc2V0VXNlVGFyRm9ybWF0KGZhbHNlKTsKLSAgICAgICAgb3BlblRlc3RXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgZmxhdHRlblBhdGhzID0gdHJ1ZTsKLQkJdmVyaWZ5Rm9sZGVycyhkaXJlY3RvcnlOYW1lcy5sZW5ndGgsIFpJUF9GSUxFX0VYVCk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEV4cG9ydFppcENyZWF0ZVNlbGVjdGVkRGlyZWN0b3JpZXNXaXRoRm9sZGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlmaWxlUGF0aCA9IGxvY2FsRGlyZWN0b3J5ICsgIi8iICsgRklMRV9OQU1FICsgIi4iICsgWklQX0ZJTEVfRVhUOwotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVJlc291cmNlW10gbWVtYmVycyA9IHByb2plY3QubWVtYmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspewotCQkJaWYgKGlzRGlyZWN0b3J5KG1lbWJlcnNbaV0pKQotCQkJCXJlc291cmNlcy5hZGQobWVtYmVyc1tpXSk7Ci0JCX0KLSAgICAgICAgQXJjaGl2ZUZpbGVFeHBvcnRPcGVyYXRpb24gb3BlcmF0aW9uID0gCi0gICAgICAgIAluZXcgQXJjaGl2ZUZpbGVFeHBvcnRPcGVyYXRpb24ocmVzb3VyY2VzLCBmaWxlUGF0aCk7Ci0KLSAgICAgICAgb3BlcmF0aW9uLnNldENyZWF0ZUxlYWR1cFN0cnVjdHVyZShmYWxzZSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRVc2VDb21wcmVzc2lvbihmYWxzZSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRVc2VUYXJGb3JtYXQoZmFsc2UpOwotICAgICAgICBvcGVuVGVzdFdpbmRvdygpLnJ1bih0cnVlLCB0cnVlLCBvcGVyYXRpb24pOwotICAgICAgICBleGNsdWRlUHJvamVjdFBhdGggPSB0cnVlOwotCQl2ZXJpZnlGb2xkZXJzKGRpcmVjdG9yeU5hbWVzLmxlbmd0aCwgWklQX0ZJTEVfRVhUKTsJCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnRaaXBDcmVhdGVTZWxlY3RlZERpcmVjdG9yaWVzQ29tcHJlc3NlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmaWxlUGF0aCA9IGxvY2FsRGlyZWN0b3J5ICsgIi8iICsgRklMRV9OQU1FICsgIi4iICsgWklQX0ZJTEVfRVhUOwotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVJlc291cmNlW10gbWVtYmVycyA9IHByb2plY3QubWVtYmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspewotCQkJaWYgKGlzRGlyZWN0b3J5KG1lbWJlcnNbaV0pKXsKLQkJCQlJUmVzb3VyY2VbXSBmb2xkZXJNZW1iZXJzID0gKChJRm9sZGVyKW1lbWJlcnNbaV0pLm1lbWJlcnMoKTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGZvbGRlck1lbWJlcnMubGVuZ3RoOyBrKyspewotCQkJCQlpZiAoaXNGaWxlKGZvbGRlck1lbWJlcnNba10pKXsKLQkJCQkJCXJlc291cmNlcy5hZGQoZm9sZGVyTWVtYmVyc1trXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICAgICAgQXJjaGl2ZUZpbGVFeHBvcnRPcGVyYXRpb24gb3BlcmF0aW9uID0gCi0gICAgICAgIAluZXcgQXJjaGl2ZUZpbGVFeHBvcnRPcGVyYXRpb24ocmVzb3VyY2VzLCBmaWxlUGF0aCk7Ci0KLSAgICAgICAgb3BlcmF0aW9uLnNldENyZWF0ZUxlYWR1cFN0cnVjdHVyZShmYWxzZSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRVc2VDb21wcmVzc2lvbih0cnVlKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFVzZVRhckZvcm1hdChmYWxzZSk7Ci0gICAgICAgIG9wZW5UZXN0V2luZG93KCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7Ci0gICAgICAgIGZsYXR0ZW5QYXRocyA9IHRydWU7Ci0JCXZlcmlmeUNvbXByZXNzZWQoWklQX0ZJTEVfRVhUKTsJCi0JCXZlcmlmeUZvbGRlcnMoZGlyZWN0b3J5TmFtZXMubGVuZ3RoLCBaSVBfRklMRV9FWFQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0VGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbGVQYXRoID0gbG9jYWxEaXJlY3RvcnkgKyAiLyIgKyBGSUxFX05BTUUgKyAiLiIgKyBUQVJfRklMRV9FWFQ7Ci0JCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXNvdXJjZXMuYWRkKHByb2plY3QpOwotICAgICAgICBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSAKLSAgICAgICAgCW5ldyBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbihyZXNvdXJjZXMsIGZpbGVQYXRoKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFVzZVRhckZvcm1hdCh0cnVlKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFVzZUNvbXByZXNzaW9uKGZhbHNlKTsKLQotICAgICAgICBvcGVuVGVzdFdpbmRvdygpLnJ1bih0cnVlLCB0cnVlLCBvcGVyYXRpb24pOwotICAgICAgICAKLSAgICAgICAgdmVyaWZ5Rm9sZGVycyhkaXJlY3RvcnlOYW1lcy5sZW5ndGgsIFRBUl9GSUxFX0VYVCk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0VGFyQ29tcHJlc3NlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmaWxlUGF0aCA9IGxvY2FsRGlyZWN0b3J5ICsgIi8iICsgRklMRV9OQU1FICsgIi4iICsgVEFSX0ZJTEVfRVhUOwotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzb3VyY2VzLmFkZChwcm9qZWN0KTsKLSAgICAgICAgQXJjaGl2ZUZpbGVFeHBvcnRPcGVyYXRpb24gb3BlcmF0aW9uID0gCi0gICAgICAgIAluZXcgQXJjaGl2ZUZpbGVFeHBvcnRPcGVyYXRpb24ocmVzb3VyY2VzLCBmaWxlUGF0aCk7Ci0KLSAgICAgICAgb3BlcmF0aW9uLnNldFVzZVRhckZvcm1hdCh0cnVlKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFVzZUNvbXByZXNzaW9uKHRydWUpOwotICAgICAgICBvcGVuVGVzdFdpbmRvdygpLnJ1bih0cnVlLCB0cnVlLCBvcGVyYXRpb24pOwkJCi0JCXZlcmlmeUNvbXByZXNzZWQoVEFSX0ZJTEVfRVhUKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0VGFyQ3JlYXRlU2VsZWN0ZWREaXJlY3RvcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQlmaWxlUGF0aCA9IGxvY2FsRGlyZWN0b3J5ICsgIi8iICsgRklMRV9OQU1FICsgIi4iICsgVEFSX0ZJTEVfRVhUOwotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVJlc291cmNlW10gbWVtYmVycyA9IHByb2plY3QubWVtYmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspewotCQkJaWYgKGlzRGlyZWN0b3J5KG1lbWJlcnNbaV0pKXsKLQkJCQlJUmVzb3VyY2VbXSBmb2xkZXJNZW1iZXJzID0gKChJRm9sZGVyKW1lbWJlcnNbaV0pLm1lbWJlcnMoKTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGZvbGRlck1lbWJlcnMubGVuZ3RoOyBrKyspewotCQkJCQlpZiAoaXNGaWxlKGZvbGRlck1lbWJlcnNba10pKXsKLQkJCQkJCXJlc291cmNlcy5hZGQoZm9sZGVyTWVtYmVyc1trXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICAgICAgQXJjaGl2ZUZpbGVFeHBvcnRPcGVyYXRpb24gb3BlcmF0aW9uID0gCi0gICAgICAgIAluZXcgQXJjaGl2ZUZpbGVFeHBvcnRPcGVyYXRpb24ocmVzb3VyY2VzLCBmaWxlUGF0aCk7Ci0KLSAgICAgICAgb3BlcmF0aW9uLnNldENyZWF0ZUxlYWR1cFN0cnVjdHVyZShmYWxzZSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRVc2VDb21wcmVzc2lvbihmYWxzZSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRVc2VUYXJGb3JtYXQodHJ1ZSk7Ci0gICAgICAgIG9wZW5UZXN0V2luZG93KCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7Ci0gICAgICAgIGZsYXR0ZW5QYXRocyA9IHRydWU7Ci0JCXZlcmlmeUZvbGRlcnMoZGlyZWN0b3J5TmFtZXMubGVuZ3RoLCBUQVJfRklMRV9FWFQpOwkJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0VGFyQ3JlYXRlU2VsZWN0ZWREaXJlY3Rvcmllc1dpdGhGb2xkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbGVQYXRoID0gbG9jYWxEaXJlY3RvcnkgKyAiLyIgKyBGSUxFX05BTUUgKyAiLiIgKyBUQVJfRklMRV9FWFQ7Ci0JCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gcHJvamVjdC5tZW1iZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAoaXNEaXJlY3RvcnkobWVtYmVyc1tpXSkpCi0JCQkJcmVzb3VyY2VzLmFkZChtZW1iZXJzW2ldKTsKLQkJfQotICAgICAgICBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSAKLSAgICAgICAgCW5ldyBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbihyZXNvdXJjZXMsIGZpbGVQYXRoKTsKLQotICAgICAgICBvcGVyYXRpb24uc2V0Q3JlYXRlTGVhZHVwU3RydWN0dXJlKGZhbHNlKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFVzZUNvbXByZXNzaW9uKGZhbHNlKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFVzZVRhckZvcm1hdCh0cnVlKTsKLSAgICAgICAgb3BlblRlc3RXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgZXhjbHVkZVByb2plY3RQYXRoID0gdHJ1ZTsKLQkJdmVyaWZ5Rm9sZGVycyhkaXJlY3RvcnlOYW1lcy5sZW5ndGgsIFRBUl9GSUxFX0VYVCk7CQkJCQotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEV4cG9ydFRhckNyZWF0ZVNlbGVjdGVkRGlyZWN0b3JpZXNDb21wcmVzc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbGVQYXRoID0gbG9jYWxEaXJlY3RvcnkgKyAiLyIgKyBGSUxFX05BTUUgKyAiLiIgKyBUQVJfRklMRV9FWFQ7Ci0JCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gcHJvamVjdC5tZW1iZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAoaXNEaXJlY3RvcnkobWVtYmVyc1tpXSkpewotCQkJCUlSZXNvdXJjZVtdIGZvbGRlck1lbWJlcnMgPSAoKElGb2xkZXIpbWVtYmVyc1tpXSkubWVtYmVycygpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgZm9sZGVyTWVtYmVycy5sZW5ndGg7IGsrKyl7Ci0JCQkJCWlmIChpc0ZpbGUoZm9sZGVyTWVtYmVyc1trXSkpewotCQkJCQkJcmVzb3VyY2VzLmFkZChmb2xkZXJNZW1iZXJzW2tdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotICAgICAgICBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSAKLSAgICAgICAgCW5ldyBBcmNoaXZlRmlsZUV4cG9ydE9wZXJhdGlvbihyZXNvdXJjZXMsIGZpbGVQYXRoKTsKLQotICAgICAgICBvcGVyYXRpb24uc2V0Q3JlYXRlTGVhZHVwU3RydWN0dXJlKGZhbHNlKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFVzZUNvbXByZXNzaW9uKHRydWUpOwotICAgICAgICBvcGVyYXRpb24uc2V0VXNlVGFyRm9ybWF0KHRydWUpOwotICAgICAgICBvcGVuVGVzdFdpbmRvdygpLnJ1bih0cnVlLCB0cnVlLCBvcGVyYXRpb24pOwotICAgICAgICBmbGF0dGVuUGF0aHMgPSB0cnVlOwotCQl2ZXJpZnlDb21wcmVzc2VkKFRBUl9GSUxFX0VYVCk7CQotCQl2ZXJpZnlGb2xkZXJzKGRpcmVjdG9yeU5hbWVzLmxlbmd0aCwgVEFSX0ZJTEVfRVhUKTsKLQkJCi0JfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5kb1NldFVwKCk7Ci0JCXByb2plY3QgPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJFeHBvcnQiICsgZ2V0TmFtZSgpKTsKLQkJRmlsZSBkZXN0aW5hdGlvbiA9IAotCQkJbmV3IEZpbGUoRmlsZVN5c3RlbUhlbHBlci5nZXRSYW5kb21Mb2NhdGlvbihGaWxlU3lzdGVtSGVscGVyLmdldFRlbXBEaXIoKSkKLSAgICAJCQkudG9PU1N0cmluZygpKTsKLQkJbG9jYWxEaXJlY3RvcnkgPSBkZXN0aW5hdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJaWYgKCFkZXN0aW5hdGlvbi5ta2RpcnMoKSkKLQkJCWZhaWwoIkNvdWxkIG5vdCBzZXQgdXAgZGVzdGluYXRpb24gZGlyZWN0b3J5IGZvciAiICsgZ2V0TmFtZSgpKTsKLQkgICAgc2V0VXBEYXRhKCk7Ci0JICAgIGZsYXR0ZW5QYXRocyA9IGZhbHNlOwotCSAgICBleGNsdWRlUHJvamVjdFBhdGggPSBmYWxzZTsKLQl9Ci0gICAgCi0JcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1RlYXJEb3duKCk7Ci0gICAgICAgIC8vIGRlbGV0ZSBleHBvcnRlZCBkYXRhCi0gICAgICAgIEZpbGUgcm9vdCA9IG5ldyBGaWxlKGxvY2FsRGlyZWN0b3J5KTsKLSAgICAgICAgaWYgKHJvb3QuZXhpc3RzKCkpewotICAgICAgICAJRmlsZVtdIGZpbGVzID0gcm9vdC5saXN0RmlsZXMoKTsKLSAgICAgICAgCWlmIChmaWxlcyAhPSBudWxsKXsKLSAgICAgICAgCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAJCQlpZiAoIWZpbGVzW2ldLmRlbGV0ZSgpKQotICAgICAgICAJCQkJZmFpbCgiQ291bGQgbm90IGRlbGV0ZSAiICsgZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAJfQotICAgICAgICAJcm9vdC5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0JfQotCQotICAgIHByaXZhdGUgdm9pZCBzZXRVcERhdGEoKXsKLSAgICAJdHJ5ewotCSAgICAJZm9yKGludCBpID0gMDsgaSA8IGRpcmVjdG9yeU5hbWVzLmxlbmd0aDsgaSsrKXsKLQkgICAgCQlJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKGRpcmVjdG9yeU5hbWVzW2ldKTsKLQkgICAgCQlmb2xkZXIuY3JlYXRlKGZhbHNlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkgICAgCQlmb3IgKGludCBrID0gMDsgayA8IGZpbGVOYW1lcy5sZW5ndGg7IGsrKyl7Ci0JICAgIAkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShmaWxlTmFtZXNba10pOwotCSAgICAJCQlTdHJpbmcgY29udGVudHMgPQotCSAgICAJCQkJZGlyZWN0b3J5TmFtZXNbaV0gKyAiLCAiICsgZmlsZU5hbWVzW2tdOwkJCi0JICAgIAkJCWZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50cy5nZXRCeXRlcygpKSwgCi0JICAgIAkJCQl0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkgICAgCQl9Ci0JICAgIAl9Ci0gICAgCX0KLSAgICAJY2F0Y2goRXhjZXB0aW9uIGUpewotICAgIAkJZmFpbChlLnRvU3RyaW5nKCkpOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlDb21wcmVzc2VkKFN0cmluZyB0eXBlKXsKLSAgICAJU3RyaW5nIGZpbGVOYW1lID0gIiI7Ci0JCWJvb2xlYW4gY29tcHJlc3NlZCA9IGZhbHNlOwotICAgIAl0cnl7Ci0JICAgIAlpZiAoWklQX0ZJTEVfRVhULmVxdWFscyh0eXBlKSl7Ci0JCQkJWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUoZmlsZVBhdGgpOwotCQkJCWZpbGVOYW1lID0gemlwRmlsZS5nZXROYW1lKCk7Ci0JICAgIAkJRW51bWVyYXRpb24gZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOwotCSAgICAJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKXsKLQkgICAgCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpZW50cmllcy5uZXh0RWxlbWVudCgpOwotCSAgICAJCQljb21wcmVzc2VkID0gZW50cnkuZ2V0TWV0aG9kKCkgPT0gWmlwRW50cnkuREVGTEFURUQ7Ci0JICAgIAkJfQotCSAgICAJCXppcEZpbGUuY2xvc2UoKTsKLQkgICAgCX0KLQkgICAgCWVsc2V7Ci0JICAgIAkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOwotCSAgICAJCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkgICAgCQkvLyBDaGVjayBpZiBpdCdzIGEgR1pJUElucHV0U3RyZWFtLgotCSAgICAJCXRyeSB7Ci0JICAgIAkJCWluID0gbmV3IEdaSVBJbnB1dFN0cmVhbShpbik7Ci0JICAgIAkJCWNvbXByZXNzZWQgPSB0cnVlOwotCSAgICAJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCSAgICAJCQljb21wcmVzc2VkID0gZmFsc2U7Ci0JICAgIAkJfQotCSAgICAJCWZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JICAgIAkJaW4uY2xvc2UoKTsKLQkgICAgCX0KLSAgICAJfQotICAgIAljYXRjaCAoRXhjZXB0aW9uIGUpewotICAgIAkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgCX0KLSAgICAJYXNzZXJ0VHJ1ZShmaWxlTmFtZSArICIgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGNvbXByZXNzZWQuIiwgY29tcHJlc3NlZCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlGb2xkZXJzKGludCBmb2xkZXJDb3VudCwgU3RyaW5nIHR5cGUpewotICAgIAl0cnl7Ci0gICAgCQlMaXN0IGFsbEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgIAlpZiAoWklQX0ZJTEVfRVhULmVxdWFscyh0eXBlKSl7Ci0JICAgIAkJWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUoZmlsZVBhdGgpOwotCSAgICAJCUVudW1lcmF0aW9uIGVudHJpZXMgPSB6aXBGaWxlLmVudHJpZXMoKTsKLQkgICAgCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSl7Ci0JICAgIAkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KWVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkgICAgCQkJYWxsRW50cmllcy5hZGQoZW50cnkuZ2V0TmFtZSgpKTsKLQkgICAgCQl9Ci0JICAgIAkJemlwRmlsZS5jbG9zZSgpOwotCSAgICAJfQotCSAgICAJZWxzZXsKLQkgICAgCQlUYXJGaWxlIHRhckZpbGUgPSBuZXcgVGFyRmlsZShmaWxlUGF0aCk7Ci0JICAgIAkJRW51bWVyYXRpb24gZW50cmllcyA9IHRhckZpbGUuZW50cmllcygpOwotCSAgICAJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKXsKLQkgICAgCQkJVGFyRW50cnkgZW50cnkgPSAoVGFyRW50cnkpZW50cmllcy5uZXh0RWxlbWVudCgpOwotCSAgICAJCQlhbGxFbnRyaWVzLmFkZChlbnRyeS5nZXROYW1lKCkpOwotCSAgICAJCX0KLQkgICAgCQl0YXJGaWxlLmNsb3NlKCk7Ci0JICAgIAl9Ci0JICAgIAlpZiAoZmxhdHRlblBhdGhzKQotCSAgICAJCXZlcmlmeUZpbGVzKGFsbEVudHJpZXMpOwotCSAgICAJZWxzZQotCSAgICAJCXZlcmlmeUFyY2hpdmUoZm9sZGVyQ291bnQsIGFsbEVudHJpZXMpOwotICAgIAl9Ci0gICAgCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0gICAgCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5QXJjaGl2ZShpbnQgZm9sZGVyQ291bnQsIExpc3QgZW50cmllcyl7Ci0gICAgCWludCBjb3VudCA9IDA7Ci0gICAgCVNldCBmb2xkZXJOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCUl0ZXJhdG9yIGFyY2hpdmVFbnRyaWVzID0gZW50cmllcy5pdGVyYXRvcigpOwotICAgIAl3aGlsZSAoYXJjaGl2ZUVudHJpZXMuaGFzTmV4dCgpKXsKLSAgICAJCVN0cmluZyBlbnRyeU5hbWUgPSAoU3RyaW5nKWFyY2hpdmVFbnRyaWVzLm5leHQoKTsKLQkJCWludCBpZHggPSBlbnRyeU5hbWUubGFzdEluZGV4T2YoIi8iKTsKLQkJCVN0cmluZyBmb2xkZXJQYXRoID0gZW50cnlOYW1lLnN1YnN0cmluZygwLCBpZHgpOwotCQkJU3RyaW5nIGZpbGVOYW1lID0gZW50cnlOYW1lLnN1YnN0cmluZyhpZHgrMSwgZW50cnlOYW1lLmxlbmd0aCgpKTsKLQkJCWZpbGVzLmFkZChmaWxlTmFtZSk7Ci0JCQlpbnQgaWR4MiA9IGZvbGRlclBhdGgubGFzdEluZGV4T2YoIi8iKTsKLQkJCWlmIChpZHgyICE9IC0xKXsKLSAgICAJCQlTdHJpbmcgZm9sZGVyTmFtZSA9IGZvbGRlclBhdGguc3Vic3RyaW5nKGlkeDIgKyAxLCBmb2xkZXJQYXRoLmxlbmd0aCgpKTsKLSAgICAJCQlmb2xkZXJOYW1lcy5hZGQoZm9sZGVyTmFtZSk7Ci0JCQl9Ci0JCQllbHNlIAotCQkJCWZvbGRlck5hbWVzLmFkZChmb2xkZXJQYXRoKTsKLQotICAgIAl9Ci0gICAgCXZlcmlmeUZvbGRlcnMoZm9sZGVyTmFtZXMpOwotICAgIAl2ZXJpZnlGaWxlcyhmaWxlcyk7Ci0gICAgCWNvdW50ICs9IGZvbGRlck5hbWVzLnNpemUoKTsKLSAgICAJaWYgKCFmbGF0dGVuUGF0aHMgJiYgIWV4Y2x1ZGVQcm9qZWN0UGF0aCkKLSAgICAJCWZvbGRlckNvdW50Kys7Ci0gICAgCWFzc2VydFRydWUoCi0gICAgCQkJIk51bWJlciBvZiBmb2xkZXJzIGV4cGVjdGVkIGFuZCBmb3VuZCBub3QgZXF1YWw6IGV4cGVjdGVkPSIgKyBmb2xkZXJDb3VudCArICIsIGFjdHVhbD0iICsgY291bnQsIAotICAgIAkJCWZvbGRlckNvdW50ID09IGNvdW50KTsKLQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RmlsZXMoTGlzdCBmaWxlcyl7Ci0gICAgCUl0ZXJhdG9yIGl0ZXIgPSBmaWxlcy5pdGVyYXRvcigpOwotICAgIAl3aGlsZSAoaXRlci5oYXNOZXh0KCkpewotICAgIAkJU3RyaW5nIGZpbGUgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotICAgIAkJdmVyaWZ5RmlsZShmaWxlKTsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RmlsZShTdHJpbmcgZW50cnlOYW1lKXsKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTmFtZXMubGVuZ3RoOyBpKyspewotICAgIAkJYm9vbGVhbiBkb3RQcm9qZWN0RmlsZVNob3VsZEJlUHJlc2VudCA9ICIucHJvamVjdCIuZXF1YWxzKGVudHJ5TmFtZSkgJiYgIWZsYXR0ZW5QYXRocyAmJiAhZXhjbHVkZVByb2plY3RQYXRoOwotICAgIAkJaWYgKGZpbGVOYW1lc1tpXS5lcXVhbHMoZW50cnlOYW1lKSB8fCBkb3RQcm9qZWN0RmlsZVNob3VsZEJlUHJlc2VudCkKLSAgICAJCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJZmFpbCgiQ291bGQgbm90IGZpbmQgZmlsZSBuYW1lZDogIiArIGVudHJ5TmFtZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlGb2xkZXJzKFNldCBmb2xkZXJOYW1lcyl7Ci0gICAgCUl0ZXJhdG9yIGZvbGRlcnMgPSBmb2xkZXJOYW1lcy5pdGVyYXRvcigpOwotICAgIAl3aGlsZSAoZm9sZGVycy5oYXNOZXh0KCkpewotICAgIAkJU3RyaW5nIGZvbGRlck5hbWUgPSAoU3RyaW5nKWZvbGRlcnMubmV4dCgpOwotICAgIAkJaWYgKCFpc0RpcmVjdG9yeShmb2xkZXJOYW1lKSl7Ci0gICAgCQkJaWYgKGZsYXR0ZW5QYXRocykKLSAgICAJCQkJZmFpbChmb2xkZXJOYW1lICsgIiBpcyBub3QgYW4gZXhwZWN0ZWQgZm9sZGVyIik7Ci0gICAgCQkJZWxzZSBpZiAoIXByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyhmb2xkZXJOYW1lKSkKLSAgICAJCQkJZmFpbChmb2xkZXJOYW1lICsgIiBpcyBub3QgYW4gZXhwZWN0ZWQgZm9sZGVyIik7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGlyZWN0b3J5KFN0cmluZyBuYW1lKXsKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3RvcnlOYW1lcy5sZW5ndGg7IGkrKyl7Ci0gICAgCQlpZiAoZGlyZWN0b3J5TmFtZXNbaV0uZXF1YWxzKG5hbWUpKQotICAgIAkJCXJldHVybiB0cnVlOwotICAgIAl9Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBib29sZWFuIGlzRGlyZWN0b3J5KElSZXNvdXJjZSByZXNvdXJjZSl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0b3J5TmFtZXMubGVuZ3RoOyBpKyspewotCQkJaWYgKGRpcmVjdG9yeU5hbWVzW2ldLmVxdWFscyhyZXNvdXJjZS5nZXROYW1lKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzRmlsZShJUmVzb3VyY2UgcmVzb3VyY2UpewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVOYW1lcy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAoZmlsZU5hbWVzW2ldLmVxdWFscyhyZXNvdXJjZS5nZXROYW1lKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsJCQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL0V4cG9ydEZpbGVTeXN0ZW1PcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9FeHBvcnRGaWxlU3lzdGVtT3BlcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWU3YjRkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL0V4cG9ydEZpbGVTeXN0ZW1PcGVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzLkZpbGVTeXN0ZW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JT3ZlcndyaXRlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXIuRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBFeHBvcnRGaWxlU3lzdGVtT3BlcmF0aW9uVGVzdCBleHRlbmRzIERhdGFUcmFuc2ZlclRlc3RDYXNlIGltcGxlbWVudHMKLQkJSU92ZXJ3cml0ZVF1ZXJ5IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsRGlyZWN0b3J5OwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBkaXJlY3RvcnlOYW1lcyA9IHsgImRpcjEiLCAiZGlyMiIgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nW10gZmlsZU5hbWVzID0geyAiZmlsZTEudHh0IiwgImZpbGUyLnR4dCIgfTsKLQotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgICAKLQlwdWJsaWMgRXhwb3J0RmlsZVN5c3RlbU9wZXJhdGlvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHF1ZXJ5T3ZlcndyaXRlKFN0cmluZyBwYXRoU3RyaW5nKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuZG9TZXRVcCgpOwotCQlwcm9qZWN0ID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgiRXhwb3J0IiArIGdldE5hbWUoKSk7Ci0JCUZpbGUgZGVzdGluYXRpb24gPSAKLQkJCW5ldyBGaWxlKEZpbGVTeXN0ZW1IZWxwZXIuZ2V0UmFuZG9tTG9jYXRpb24oRmlsZVN5c3RlbUhlbHBlci5nZXRUZW1wRGlyKCkpCi0gICAgCQkJLnRvT1NTdHJpbmcoKSk7Ci0JCWxvY2FsRGlyZWN0b3J5ID0gZGVzdGluYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWlmICghZGVzdGluYXRpb24ubWtkaXJzKCkpCi0JCQlmYWlsKCJDb3VsZCBub3Qgc2V0IHVwIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgIiArIGdldE5hbWUoKSk7Ci0JICAgIHNldFVwRGF0YSgpOwkJCi0JfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFVwRGF0YSgpewotICAgIAl0cnl7Ci0JICAgIAlmb3IoaW50IGkgPSAwOyBpIDwgZGlyZWN0b3J5TmFtZXMubGVuZ3RoOyBpKyspewotCSAgICAJCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoZGlyZWN0b3J5TmFtZXNbaV0pOwotCSAgICAJCWZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCSAgICAJCWZvciAoaW50IGsgPSAwOyBrIDwgZmlsZU5hbWVzLmxlbmd0aDsgaysrKXsKLQkgICAgCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKGZpbGVOYW1lc1trXSk7Ci0JICAgIAkJCVN0cmluZyBjb250ZW50cyA9Ci0JICAgIAkJCQlkaXJlY3RvcnlOYW1lc1tpXSArICIsICIgKyBmaWxlTmFtZXNba107CQkKLQkgICAgCQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRzLmdldEJ5dGVzKCkpLCAKLQkgICAgCQkJCXRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCSAgICAJCX0KLQkgICAgCX0KLSAgICAJfQotICAgIAljYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0JcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1RlYXJEb3duKCk7Ci0gICAgICAgIC8vIGRlbGV0ZSBleHBvcnRlZCBkYXRhCi0gICAgICAgIEZpbGUgcm9vdCA9IG5ldyBGaWxlKGxvY2FsRGlyZWN0b3J5KTsKLSAgICAgICAgaWYgKHJvb3QuZXhpc3RzKCkpewotICAgICAgICAJZGVsZXRlRGlyZWN0b3J5KHJvb3QpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFN0YXR1cygpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzb3VyY2VzLmFkZChwcm9qZWN0KTsKLSAgICAgICAgRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSAKLSAgICAgICAgCW5ldyBGaWxlU3lzdGVtRXhwb3J0T3BlcmF0aW9uKAotICAgICAgICAJCQludWxsLCByZXNvdXJjZXMsIGxvY2FsRGlyZWN0b3J5LCB0aGlzKTsKLQotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbi5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSVN0YXR1cy5PSyk7Ci0gICAgfQotCQotCS8qIEV4cG9ydCBhIHByb2plY3QsIHdpdGggYWxsIGRpcmVjdG9yaWVzICovCi0JcHVibGljIHZvaWQgdGVzdEV4cG9ydFJvb3RSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzb3VyY2VzLmFkZChwcm9qZWN0KTsKLSAgICAgICAgRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSAKLSAgICAgICAgCW5ldyBGaWxlU3lzdGVtRXhwb3J0T3BlcmF0aW9uKAotICAgICAgICAJCQludWxsLCByZXNvdXJjZXMsIGxvY2FsRGlyZWN0b3J5LCB0aGlzKTsKLSAgICAgICAgb3BlblRlc3RXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIHZlcmlmeUZvbGRlcnMoZGlyZWN0b3J5TmFtZXMubGVuZ3RoKTsJCQotCX0KLQkKLQkvKiBFeHBvcnQgYSBwcm9qZWN0LCBjcmVhdGUgYWxsIGxlYWR1cCBmb2xkZXJzLiAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnRSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBwcm9qZWN0Lm1lbWJlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKXsKLQkJCXJlc291cmNlcy5hZGQobWVtYmVyc1tpXSk7Ci0JCX0KLSAgICAgICAgRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSAKLSAgICAgICAgCW5ldyBGaWxlU3lzdGVtRXhwb3J0T3BlcmF0aW9uKAotICAgICAgICAJCQludWxsLCByZXNvdXJjZXMsIGxvY2FsRGlyZWN0b3J5LCB0aGlzKTsKLSAgICAgICAgb3BlblRlc3RXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIHZlcmlmeUZvbGRlcnMoZGlyZWN0b3J5TmFtZXMubGVuZ3RoKTsJCQkJCi0JfQotCQotCS8qIEV4cG9ydCBmb2xkZXJzLCBkbyBub3QgY3JlYXRlIGxlYWR1cCBmb2xkZXJzLiAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnRGb2xkZXJDcmVhdGVEaXJlY3RvcnlTdHJ1Y3R1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBwcm9qZWN0Lm1lbWJlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKXsKLQkJCWlmIChpc0RpcmVjdG9yeShtZW1iZXJzW2ldKSkKLQkJCQlyZXNvdXJjZXMuYWRkKG1lbWJlcnNbaV0pOwotCQl9Ci0gICAgICAgIEZpbGVTeXN0ZW1FeHBvcnRPcGVyYXRpb24gb3BlcmF0aW9uID0gCi0gICAgICAgIAluZXcgRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbigKLSAgICAgICAgCQkJbnVsbCwgcmVzb3VyY2VzLCBsb2NhbERpcmVjdG9yeSwgdGhpcyk7Ci0KLSAgICAgICAgb3BlcmF0aW9uLnNldENyZWF0ZUNvbnRhaW5lckRpcmVjdG9yaWVzKHRydWUpOwotICAgICAgICBvcGVyYXRpb24uc2V0Q3JlYXRlTGVhZHVwU3RydWN0dXJlKGZhbHNlKTsKLSAgICAgICAgb3BlblRlc3RXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIHZlcmlmeUZvbGRlcnMoZGlyZWN0b3J5TmFtZXMubGVuZ3RoLCBmYWxzZSk7CQkKLQl9Ci0JCi0JLyogRXhwb3J0IGZpbGVzLCBkbyBub3QgY3JlYXRlIGxlYWR1cCBmb2xkZXJzLiAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnRGaWxlc0NyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVJlc291cmNlW10gbWVtYmVycyA9IHByb2plY3QubWVtYmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspewotCQkJaWYgKGlzRGlyZWN0b3J5KG1lbWJlcnNbaV0pKXsKLQkJCQlJUmVzb3VyY2VbXSBmb2xkZXJNZW1iZXJzID0gKChJRm9sZGVyKW1lbWJlcnNbaV0pLm1lbWJlcnMoKTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGZvbGRlck1lbWJlcnMubGVuZ3RoOyBrKyspewotCQkJCQlpZiAoaXNGaWxlKGZvbGRlck1lbWJlcnNba10pKXsKLQkJCQkJCXJlc291cmNlcy5hZGQoZm9sZGVyTWVtYmVyc1trXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSAKLSAgICAgICAgCW5ldyBGaWxlU3lzdGVtRXhwb3J0T3BlcmF0aW9uKAotICAgICAgICAJCQludWxsLCByZXNvdXJjZXMsIGxvY2FsRGlyZWN0b3J5LCB0aGlzKTsKLQotICAgICAgICBvcGVyYXRpb24uc2V0Q3JlYXRlQ29udGFpbmVyRGlyZWN0b3JpZXModHJ1ZSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRDcmVhdGVMZWFkdXBTdHJ1Y3R1cmUoZmFsc2UpOwotICAgICAgICBvcGVuVGVzdFdpbmRvdygpLnJ1bih0cnVlLCB0cnVlLCBvcGVyYXRpb24pOwotICAgICAgICAKLSAgICAgICAgdmVyaWZ5RmlsZXMocmVzb3VyY2VzKTsJCQkKLQl9Ci0JCi0JLyogRXhwb3J0IGZpbGVzLCBvdmVyd3JpdGUgLSBkbyBub3QgY3JlYXRlIGNvbnRhaW5lciBkaXJlY3RvcmllcyBvciBsZWFkIHVwIGZvbGRlcnMuICovCi0JcHVibGljIHZvaWQgdGVzdEV4cG9ydE92ZXJ3cml0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzb3VyY2VzLmFkZChwcm9qZWN0KTsKLSAgICAgICAgRmlsZVN5c3RlbUV4cG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSAKLSAgICAgICAgCW5ldyBGaWxlU3lzdGVtRXhwb3J0T3BlcmF0aW9uKAotICAgICAgICAJCQludWxsLCByZXNvdXJjZXMsIGxvY2FsRGlyZWN0b3J5LCB0aGlzKTsKLSAgICAgICAgb3BlblRlc3RXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldE92ZXJ3cml0ZUZpbGVzKHRydWUpOwotICAgICAgICBvcGVyYXRpb24uc2V0Q3JlYXRlQ29udGFpbmVyRGlyZWN0b3JpZXMoZmFsc2UpOwotICAgICAgICBvcGVyYXRpb24uc2V0Q3JlYXRlTGVhZHVwU3RydWN0dXJlKGZhbHNlKTsKLSAgICAgICAgb3BlblRlc3RXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIHZlcmlmeUZvbGRlcnMoZGlyZWN0b3J5TmFtZXMubGVuZ3RoKTsJCQotCX0JCi0JCi0JcHJpdmF0ZSBib29sZWFuIGlzRmlsZShJUmVzb3VyY2UgcmVzb3VyY2UpewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVOYW1lcy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAoZmlsZU5hbWVzW2ldLmVxdWFscyhyZXNvdXJjZS5nZXROYW1lKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmVyaWZ5RmlsZXMoTGlzdCByZXNvdXJjZXMpewotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKyl7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKXJlc291cmNlcy5nZXQoaSk7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCSJFeHBvcnQgc2hvdWxkIGhhdmUgZXhwb3J0ZWQgIiArIHJlc291cmNlLmdldE5hbWUoKSwKLQkJCQlpc0ZpbGUocmVzb3VyY2UpKTsKLQkJCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmVyaWZ5Rm9sZGVycyhpbnQgZm9sZGVyQ291bnQpewotCQl2ZXJpZnlGb2xkZXJzKGZvbGRlckNvdW50LCB0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUZvbGRlcnMoaW50IGZvbGRlckNvdW50LCBib29sZWFuIGluY2x1ZGVSb290Rm9sZGVyKXsKLQkJRmlsZSByb290OyAKLQkJaWYgKGluY2x1ZGVSb290Rm9sZGVyKXsKLQkJCXJvb3QgPSBuZXcgRmlsZShsb2NhbERpcmVjdG9yeSwgcHJvamVjdC5nZXROYW1lKCkpOwotCQkJYXNzZXJ0VHJ1ZSgiRXhwb3J0IGZhaWxlZDogIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiBmb2xkZXIgZG9lcyBub3QgZXhpc3QiLCByb290LmV4aXN0cygpKTsKLQkJfQotCQllbHNlewotCQkJcm9vdCA9IG5ldyBGaWxlKGxvY2FsRGlyZWN0b3J5KTsKLQkJfQotICAgICAgICBGaWxlW10gZmlsZXMgPSByb290Lmxpc3RGaWxlcygpOwotICAgICAgICBMaXN0IGRpcmVjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCl7CSAgICAgICAgCi0JICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKXsKLQkgICAgICAgIAlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkKLQkgICAgICAgIAkJZGlyZWN0b3JpZXMuYWRkKGZpbGVzW2ldKTsKLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cG9ydCBmYWlsZWQgdG8gRXhwb3J0IGFsbCBkaXJlY3RvcmllcyIsCi0gICAgICAgICAgICAgICAgZm9sZGVyQ291bnQsIGRpcmVjdG9yaWVzLnNpemUoKSk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdG9yaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIAlGaWxlIGRpcmVjdG9yeSA9IChGaWxlKWRpcmVjdG9yaWVzLmdldChpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cG9ydCBmYWlsZWQgdG8gZXhwb3J0IGRpcmVjdG9yeSAiICsgZGlyZWN0b3J5LmdldE5hbWUoKSwgZGlyZWN0b3J5LmV4aXN0cygpKTsKLSAgICAgICAgICAgIHZlcmlmeUZvbGRlcihkaXJlY3RvcnkpOwotICAgICAgICB9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB2ZXJpZnlGb2xkZXIoRmlsZSBkaXJlY3RvcnkpewotICAgIAlGaWxlW10gZmlsZXMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0gICAgCWlmIChmaWxlcyAhPSBudWxsKXsKLQkgICAgCWZvciAoaW50IGsgPSAwOyBrIDwgZmlsZXMubGVuZ3RoOyBrKyspewotCSAgICAJCUZpbGUgZmlsZSA9IGZpbGVzW2tdOwotCSAgICAJCWFzc2VydFRydWUoIkV4cG9ydCBmYWlsZWQgdG8gZXhwb3J0IGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSwgZmlsZS5leGlzdHMoKSk7Ci0JICAgIAl9Ci0gICAgCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEaXJlY3RvcnkoSVJlc291cmNlIHJlc291cmNlKXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3RvcnlOYW1lcy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAoZGlyZWN0b3J5TmFtZXNbaV0uZXF1YWxzKHJlc291cmNlLmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL0ltcG9ydEFyY2hpdmVPcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9JbXBvcnRBcmNoaXZlT3BlcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWY1MTFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL0ltcG9ydEFyY2hpdmVPcGVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSU92ZXJ3cml0ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLlRhckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXIuVGFyTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLlppcExldmVsZWRTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JbXBvcnRPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRBcmNoaXZlT3BlcmF0aW9uVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgaW1wbGVtZW50cyBJT3ZlcndyaXRlUXVlcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1BBVEhfUFJFRklYID0gImRhdGEvb3JnLmVjbGlwc2UuZGF0YXRyYW5zZmVyQXJjaGl2ZXMvIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFX1NPVVJDRV9QUk9QRVJUWSA9ICJhcmNoaXZlU291cmNlIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJDSElWRV8xMTU4MDBfUFJPUEVSVFkgPSAiYnVnMTE1ODAwU291cmNlIjsKLQkKLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbERpcmVjdG9yeTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHJvb3RSZXNvdXJjZU5hbWUgPSAidGVzdC50eHQiOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nW10gZGlyZWN0b3J5TmFtZXMgPSB7ICJkaXIxIiwgImRpcjIiIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGZpbGVOYW1lcyA9IHsgImZpbGUxLnR4dCIsICJmaWxlMi50eHQiIH07Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gICAgCi0gICAgcHJpdmF0ZSBVUkwgemlwRmlsZVVSTDsKLSAgICAKLSAgICBwcml2YXRlIFVSTCB0YXJGaWxlVVJMOwotICAgIAotICAgIHB1YmxpYyBJbXBvcnRBcmNoaXZlT3BlcmF0aW9uVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJT3ZlcndyaXRlUXVlcnkjcXVlcnlPdmVyd3JpdGUoU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgcXVlcnlPdmVyd3JpdGUoU3RyaW5nIHBhdGhTdHJpbmcpIHsKLSAgICAgICAgLy9BbHdheXMgcmV0dXJuIGFuIGVtcHR5IFN0cmluZyAtIHdlIGFyZW4ndAotICAgICAgICAvL2RvaW5nIGFueXRoaW5nIGludGVyZXN0aW5nCi0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWFyIGRvd24uIERlbGV0ZSB0aGUgcHJvamVjdCB3ZSBjcmVhdGVkIGFuZCBhbGwgb2YgdGhlCi0gICAgICogZmlsZXMgb24gdGhlIGZpbGUgc3lzdGVtLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9UZWFyRG93bigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IENsYXNzCi0JCSAgICAgICAgLmZvck5hbWUoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmRhdGF0cmFuc2Zlci5JbXBvcnRBcmNoaXZlT3BlcmF0aW9uVGVzdCIpOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSB0ZXN0Q2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgidGVzdHMuaW5pIik7Ci0JCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXByb3BlcnRpZXMubG9hZChzdHJlYW0pOwotCQlTdHJpbmcgemlwRmlsZU5hbWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWxvY2FsRGlyZWN0b3J5ID0gemlwRmlsZU5hbWU7Ci0JCQotCQl6aXBGaWxlVVJMID0gUGxhdGZvcm0uYXNMb2NhbFVSTChQbGF0Zm9ybS5maW5kKFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLCAKLQkJCQluZXcgUGF0aChEQVRBX1BBVEhfUFJFRklYKS5hcHBlbmQoemlwRmlsZU5hbWUrICIuemlwIikpKTsKLQkJdGFyRmlsZVVSTCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwoUGxhdGZvcm0uZmluZChUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSwgCi0JCQkJbmV3IFBhdGgoREFUQV9QQVRIX1BSRUZJWCkuYXBwZW5kKHppcEZpbGVOYW1lKyAiLnRhciIpKSk7ICAgIAkKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFppcEdldFN0YXR1cygpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlzZXR1cChBUkNISVZFX1NPVVJDRV9QUk9QRVJUWSk7Ci0gICAgICAgIHByb2plY3QgPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJJbXBvcnRaaXBHZXRTdGF0dXMiKTsKLSAgICAgICAgWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUoemlwRmlsZVVSTC5nZXRQYXRoKCkpOwotICAgICAgICAKLSAgICAgICAgWmlwTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyID0gbmV3IFppcExldmVsZWRTdHJ1Y3R1cmVQcm92aWRlcih6aXBGaWxlKTsKLSAgICAgICAgCi0gICAgICAgIEVudW1lcmF0aW9uIHppcEVudHJpZXMgPSB6aXBGaWxlLmVudHJpZXMoKTsKLSAgICAgICAgTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAoemlwRW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgIAllbnRyaWVzLmFkZCh6aXBFbnRyaWVzLm5leHRFbGVtZW50KCkpOwotICAgICAgICB9Ci0JCUltcG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgSW1wb3J0T3BlcmF0aW9uKAotCQkJCW5ldyBQYXRoKHppcEZpbGVVUkwuZ2V0UGF0aCgpKSwgc3RydWN0dXJlUHJvdmlkZXIuZ2V0Um9vdCgpLAotCQkJCXN0cnVjdHVyZVByb3ZpZGVyLCB0aGlzLCBlbnRyaWVzKTsKLQotCQljbG9zZVppcEZpbGUoemlwRmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJU3RhdHVzLk9LKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyR2V0U3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCXNldHVwKEFSQ0hJVkVfU09VUkNFX1BST1BFUlRZKTsKLSAgICAgICAgcHJvamVjdCA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIkltcG9ydFRhckdldFN0YXR1cyIpOwotICAgICAgICBUYXJGaWxlIHRhckZpbGUgPSBuZXcgVGFyRmlsZSh0YXJGaWxlVVJMLmdldFBhdGgoKSk7Ci0gICAgICAgIFRhckxldmVsZWRTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IG5ldyBUYXJMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIodGFyRmlsZSk7Ci0gICAgICAgIAotICAgICAgICBFbnVtZXJhdGlvbiB0YXJFbnRyaWVzID0gdGFyRmlsZS5lbnRyaWVzKCk7Ci0gICAgICAgIExpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgd2hpbGUgKHRhckVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpewotICAgICAgICAJZW50cmllcy5hZGQodGFyRW50cmllcy5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgfQotCQlJbXBvcnRPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEltcG9ydE9wZXJhdGlvbigKLQkJCQluZXcgUGF0aCh0YXJGaWxlVVJMLmdldFBhdGgoKSksIHN0cnVjdHVyZVByb3ZpZGVyLmdldFJvb3QoKSwKLQkJCQlzdHJ1Y3R1cmVQcm92aWRlciwgdGhpcywgZW50cmllcyk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvcGVyYXRpb24uZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElTdGF0dXMuT0spOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0WmlwSW1wb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCXNldHVwKEFSQ0hJVkVfU09VUkNFX1BST1BFUlRZKTsKLSAgICAgICAgcHJvamVjdCA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIkltcG9ydFppcCIpOwotICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZSh6aXBGaWxlVVJMLmdldFBhdGgoKSk7Ci0gICAgICAgIFppcExldmVsZWRTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IG5ldyBaaXBMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIoemlwRmlsZSk7Ci0gICAgICAgIHppcEZpbGUgPSBuZXcgWmlwRmlsZSh6aXBGaWxlVVJMLmdldFBhdGgoKSk7Ci0JICAgIEVudW1lcmF0aW9uIHppcEVudHJpZXMgPSB6aXBGaWxlLmVudHJpZXMoKTsKLQkgICAgTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICB3aGlsZSAoemlwRW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSl7Ci0JICAgIAlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSl6aXBFbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JICAgIAlpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpCi0JICAgIAkJZW50cmllcy5hZGQoZW50cnkpOwotCSAgICB9Ci0JCUltcG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgSW1wb3J0T3BlcmF0aW9uKAotCQkJCW5ldyBQYXRoKHByb2plY3QuZ2V0TmFtZSgpKSwgc3RydWN0dXJlUHJvdmlkZXIuZ2V0Um9vdCgpLAotCQkJCXN0cnVjdHVyZVByb3ZpZGVyLCB0aGlzLCBlbnRyaWVzKTsKLQkJCi0gICAgICAgIG9wZW5UZXN0V2luZG93KCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7Ci0gICAgICAgIGNsb3NlWmlwRmlsZSh6aXBGaWxlKTsKLSAgICAgICAgCi0gICAgICAgIHZlcmlmeUZpbGVzKGRpcmVjdG9yeU5hbWVzLmxlbmd0aCwgZmFsc2UpOwotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUYXJJbXBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJc2V0dXAoQVJDSElWRV9TT1VSQ0VfUFJPUEVSVFkpOwotICAgICAgICBwcm9qZWN0ID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgiSW1wb3J0VGFyIik7Ci0gICAgICAgIFRhckZpbGUgdGFyRmlsZSA9IG5ldyBUYXJGaWxlKHRhckZpbGVVUkwuZ2V0UGF0aCgpKTsKLSAgICAgICAgVGFyTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyID0gbmV3IFRhckxldmVsZWRTdHJ1Y3R1cmVQcm92aWRlcih0YXJGaWxlKTsKLSAgICAKLQkgICAgRW51bWVyYXRpb24gdGFyRW50cmllcyA9IHRhckZpbGUuZW50cmllcygpOwotCSAgICBMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgIHdoaWxlICh0YXJFbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKXsKLQkgICAgCWVudHJpZXMuYWRkKHRhckVudHJpZXMubmV4dEVsZW1lbnQoKSk7Ci0JICAgIH0KLQkJSW1wb3J0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBJbXBvcnRPcGVyYXRpb24oCi0JCQkJbmV3IFBhdGgocHJvamVjdC5nZXROYW1lKCkpLCBzdHJ1Y3R1cmVQcm92aWRlci5nZXRSb290KCksCi0JCQkJc3RydWN0dXJlUHJvdmlkZXIsIHRoaXMsIGVudHJpZXMpOwotICAgICAgICAKLSAgICAgICAgb3BlblRlc3RXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLQotICAgICAgICB2ZXJpZnlGaWxlcyhkaXJlY3RvcnlOYW1lcy5sZW5ndGgsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyU2V0T3ZlcndyaXRlUmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCXNldHVwKEFSQ0hJVkVfU09VUkNFX1BST1BFUlRZKTsKLSAgICAgICAgcHJvamVjdCA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIkltcG9ydFRhclNldE92ZXJ3cml0ZVJlc291cmNlcyIpOwotICAgICAgICBUYXJGaWxlIHRhckZpbGUgPSBuZXcgVGFyRmlsZSh0YXJGaWxlVVJMLmdldFBhdGgoKSk7Ci0gICAgICAgIFRhckxldmVsZWRTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IG5ldyBUYXJMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIodGFyRmlsZSk7Ci0gICAgCi0JICAgIEVudW1lcmF0aW9uIHRhckVudHJpZXMgPSB0YXJGaWxlLmVudHJpZXMoKTsKLQkgICAgTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICB3aGlsZSAodGFyRW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSl7Ci0JICAgIAllbnRyaWVzLmFkZCh0YXJFbnRyaWVzLm5leHRFbGVtZW50KCkpOwotCSAgICB9Ci0JCUltcG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgSW1wb3J0T3BlcmF0aW9uKAotCQkJCW5ldyBQYXRoKHByb2plY3QuZ2V0TmFtZSgpKSwgc3RydWN0dXJlUHJvdmlkZXIuZ2V0Um9vdCgpLAotCQkJCXN0cnVjdHVyZVByb3ZpZGVyLCB0aGlzLCBlbnRyaWVzKTsKLSAgICAgICAgCi0gICAgICAgIG9wZW5UZXN0V2luZG93KCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRPdmVyd3JpdGVSZXNvdXJjZXModHJ1ZSk7Ci0gICAgICAgIG9wZW5UZXN0V2luZG93KCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7Ci0gICAgICAgIHZlcmlmeUZpbGVzKGRpcmVjdG9yeU5hbWVzLmxlbmd0aCwgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0WmlwU2V0T3ZlcndyaXRlUmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCXNldHVwKEFSQ0hJVkVfU09VUkNFX1BST1BFUlRZKTsKLSAgICAJcHJvamVjdCA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIkltcG9yWmlwclNldE92ZXJ3cml0ZVJlc291cmNlcyIpOwotICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZSh6aXBGaWxlVVJMLmdldFBhdGgoKSk7Ci0gICAgICAgIFppcExldmVsZWRTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IG5ldyBaaXBMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIoemlwRmlsZSk7Ci0gICAgICAgIHppcEZpbGUgPSBuZXcgWmlwRmlsZSh6aXBGaWxlVVJMLmdldFBhdGgoKSk7Ci0JICAgIEVudW1lcmF0aW9uIHppcEVudHJpZXMgPSB6aXBGaWxlLmVudHJpZXMoKTsKLQkgICAgTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICB3aGlsZSAoemlwRW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSl7Ci0JICAgIAlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSl6aXBFbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JICAgIAlpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpCi0JICAgIAkJZW50cmllcy5hZGQoZW50cnkpOwotCSAgICB9Ci0JCUltcG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgSW1wb3J0T3BlcmF0aW9uKAotCQkJCW5ldyBQYXRoKHByb2plY3QuZ2V0TmFtZSgpKSwgc3RydWN0dXJlUHJvdmlkZXIuZ2V0Um9vdCgpLAotCQkJCXN0cnVjdHVyZVByb3ZpZGVyLCB0aGlzLCBlbnRyaWVzKTsKLQkJCi0gICAgICAgIG9wZW5UZXN0V2luZG93KCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRPdmVyd3JpdGVSZXNvdXJjZXModHJ1ZSk7Ci0gICAgICAgIG9wZW5UZXN0V2luZG93KCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7Ci0gICAgICAgIGNsb3NlWmlwRmlsZSh6aXBGaWxlKTsgIAotICAgICAgICB2ZXJpZnlGaWxlcyhkaXJlY3RvcnlOYW1lcy5sZW5ndGgsIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFppcFdpdGhGaWxlQXRSb290KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCXNldHVwKEFSQ0hJVkVfMTE1ODAwX1BST1BFUlRZKTsKLSAgICAgICAgcHJvamVjdCA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIkltcG9ydFppcFdpdGhGaWxlQXRSb290Iik7Ci0gICAgICAgIFppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKHppcEZpbGVVUkwuZ2V0UGF0aCgpKTsKLSAgICAgICAgWmlwTGV2ZWxlZFN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyID0gbmV3IFppcExldmVsZWRTdHJ1Y3R1cmVQcm92aWRlcih6aXBGaWxlKTsKLSAgICAgICAgemlwRmlsZSA9IG5ldyBaaXBGaWxlKHppcEZpbGVVUkwuZ2V0UGF0aCgpKTsKLQkgICAgRW51bWVyYXRpb24gemlwRW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOwotCSAgICBMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgIHdoaWxlICh6aXBFbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKXsKLQkgICAgCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KXppcEVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkgICAgCWlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkKLQkgICAgCQllbnRyaWVzLmFkZChlbnRyeSk7Ci0JICAgIH0KLQkJSW1wb3J0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBJbXBvcnRPcGVyYXRpb24oCi0JCQkJbmV3IFBhdGgocHJvamVjdC5nZXROYW1lKCkpLCBzdHJ1Y3R1cmVQcm92aWRlci5nZXRSb290KCksCi0JCQkJc3RydWN0dXJlUHJvdmlkZXIsIHRoaXMsIGVudHJpZXMpOwotCQkKLSAgICAgICAgb3BlblRlc3RXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgY2xvc2VaaXBGaWxlKHppcEZpbGUpOwotICAgICAgICAKLSAgICAgICAgdmVyaWZ5RmlsZXMoZGlyZWN0b3J5TmFtZXMubGVuZ3RoLCB0cnVlKTsgICAgCQotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUYXJXaXRoRmlsZUF0Um9vdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlzZXR1cChBUkNISVZFXzExNTgwMF9QUk9QRVJUWSk7Ci0gICAgICAgIHByb2plY3QgPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJJbXBvcnRUYXJXaXRoRmlsZUF0Um9vdCIpOwotICAgICAgICBUYXJGaWxlIHRhckZpbGUgPSBuZXcgVGFyRmlsZSh0YXJGaWxlVVJMLmdldFBhdGgoKSk7Ci0gICAgICAgIFRhckxldmVsZWRTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IG5ldyBUYXJMZXZlbGVkU3RydWN0dXJlUHJvdmlkZXIodGFyRmlsZSk7Ci0gICAgCi0JICAgIEVudW1lcmF0aW9uIHRhckVudHJpZXMgPSB0YXJGaWxlLmVudHJpZXMoKTsKLQkgICAgTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICB3aGlsZSAodGFyRW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSl7Ci0JICAgIAllbnRyaWVzLmFkZCh0YXJFbnRyaWVzLm5leHRFbGVtZW50KCkpOwotCSAgICB9Ci0JCUltcG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgSW1wb3J0T3BlcmF0aW9uKAotCQkJCW5ldyBQYXRoKHByb2plY3QuZ2V0TmFtZSgpKSwgc3RydWN0dXJlUHJvdmlkZXIuZ2V0Um9vdCgpLAotCQkJCXN0cnVjdHVyZVByb3ZpZGVyLCB0aGlzLCBlbnRyaWVzKTsKLSAgICAgICAgCi0gICAgICAgIG9wZW5UZXN0V2luZG93KCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7Ci0KLSAgICAgICAgdmVyaWZ5RmlsZXMoZGlyZWN0b3J5TmFtZXMubGVuZ3RoLCB0cnVlKTsKLSAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCBhbGwgZmlsZXMgd2VyZSBpbXBvcnRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9sZGVyQ291bnQgbnVtYmVyIG9mIGZvbGRlcnMgdGhhdCB3ZXJlIGltcG9ydGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUZpbGVzKGludCBmb2xkZXJDb3VudCwgYm9vbGVhbiBoYXNSb290TWVtYmVycykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2FsRGlyZWN0b3J5KTsKLSAgICAgICAgICAgIElSZXNvdXJjZSB0YXJnZXRGb2xkZXIgPSBwcm9qZWN0LmZpbmRNZW1iZXIocGF0aC5tYWtlUmVsYXRpdmUoKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIkltcG9ydCBmYWlsZWQiLCB0YXJnZXRGb2xkZXIgaW5zdGFuY2VvZiBJQ29udGFpbmVyKTsKLQotICAgICAgICAgICAgSVJlc291cmNlW10gcmVzb3VyY2VzID0gKChJQ29udGFpbmVyKSB0YXJnZXRGb2xkZXIpLm1lbWJlcnMoKTsKLSAgICAgICAgICAgIGlmICghaGFzUm9vdE1lbWJlcnMpewotCSAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW1wb3J0IGZhaWxlZCB0byBpbXBvcnQgYWxsIGRpcmVjdG9yaWVzIiwKLQkgICAgICAgICAgICAgICAgICAgIGZvbGRlckNvdW50LCByZXNvdXJjZXMubGVuZ3RoKTsKLQkgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbXBvcnQgZmFpbGVkIiwgcmVzb3VyY2VzW2ldIGluc3RhbmNlb2YgSUNvbnRhaW5lcik7Ci0JICAgICAgICAgICAgICAgIHZlcmlmeUZvbGRlcigoSUNvbnRhaW5lcikgcmVzb3VyY2VzW2ldKTsKLQkgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIAlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKyl7Ci0gICAgICAgICAgICAJCWlmIChyZXNvdXJjZXNbaV0gaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotICAgICAgICAgICAgCQkJdmVyaWZ5Rm9sZGVyKChJQ29udGFpbmVyKXJlc291cmNlc1tpXSk7Ci0gICAgICAgICAgICAJCWVsc2UKLSAgICAgICAgICAgIAkJCWFzc2VydFRydWUoIlJvb3QgcmVzb3VyY2UgaXMgbm90IHByZXNlbnQgb3IgaXMgbm90IHByZXNlbnQgYXMgYSBmaWxlOiAiICsgcm9vdFJlc291cmNlTmFtZSwgCi0gICAgICAgICAgICAJCQkJCXJlc291cmNlc1tpXSBpbnN0YW5jZW9mIElGaWxlICYmIHJvb3RSZXNvdXJjZU5hbWUuZXF1YWxzKHJlc291cmNlc1tpXS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IGFsbCBmaWxlcyB3ZXJlIGltcG9ydGVkIGludG8gdGhlIHNwZWNpZmllZCBmb2xkZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUZvbGRlcihJQ29udGFpbmVyIGZvbGRlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVJlc291cmNlW10gZmlsZXMgPSBmb2xkZXIubWVtYmVycygpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBvcnQgZmFpbGVkIHRvIGltcG9ydCBhbGwgZmlsZXMiLCBmaWxlTmFtZXMubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICBmaWxlcy5sZW5ndGgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlTmFtZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlTmFtZXNbal07Ci0gICAgICAgICAgICAgICAgaW50IGs7Ci0gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGZpbGVzLmxlbmd0aDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZS5lcXVhbHMoZmlsZXNba10uZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbXBvcnQgZmFpbGVkIHRvIGltcG9ydCBmaWxlICIgKyBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGsgPCBmaWxlTmFtZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlWmlwRmlsZShaaXBGaWxlIHppcEZpbGUpewotICAgIAl0cnl7Ci0gICAgCQl6aXBGaWxlLmNsb3NlKCk7Ci0gICAgCX0KLSAgICAJY2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0gICAgCQlmYWlsKCJDb3VsZCBub3QgY2xvc2UgemlwIGZpbGUgIiArIHppcEZpbGUuZ2V0TmFtZSgpLCBlKTsKLSAgICAJCXJldHVybiBmYWxzZTsKLSAgICAJfQotICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9JbXBvcnRFeGlzdGluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL0ltcG9ydEV4aXN0aW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2U4YjUxMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9JbXBvcnRFeGlzdGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQ29weXJpZ2h0IChjKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEJpdHMgb2YgaW1wb3J0V2l6YXJkIGZyb20gRGVwcmVjYXRlZFVJV2l6YXJkcyAKLSAqICAgICBSZWQgSGF0LCBJbmMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MuRmlsZVN5c3RlbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5JbXBvcnRFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXIuV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLldpemFyZFByb2plY3RzSW1wb3J0UGFnZS5Qcm9qZWN0UmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkRpYWxvZ0NoZWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5GaWxlVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRFeGlzdGluZ1Rlc3QgZXh0ZW5kcyBEYXRhVHJhbnNmZXJUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfUEFUSF9QUkVGSVggPSAiZGF0YS9vcmcuZWNsaXBzZS5kYXRhdHJhbnNmZXJBcmNoaXZlcy8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU19EQVRBX1BSRUZJWCA9ICJkYXRhL3dvcmtzcGFjZXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU19EQVRBX0xPQ0FUSU9OID0gImltcG9ydEV4aXN0aW5nRnJvbURpclRlc3QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFX0hFTExPV09STEQgPSAiaGVsbG93b3JsZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSQ0hJVkVfRklMRV9XSVRIX0VNUFRZX0ZPTERFUiA9ICJFbXB0eUZvbGRlckluQXJjaGl2ZSI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRklMRV9MSVNUID0gbmV3IFN0cmluZ1tdIHsKLQkJCSJ0ZXN0LWZpbGUtMS50eHQiLCAidGVzdC1maWxlLTIuZG9jIiwgIi5wcm9qZWN0IiB9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFSQ0hJVkVfRklMRV9FTVBUWV9GT0xERVJfTElTVCA9IG5ldyBTdHJpbmdbXXsKLQkJCSJlbXB0eSIsICJmb2xkZXIiIH07Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGF0YUxvY2F0aW9uID0gbnVsbDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gb3JpZ2luYWxSZWZyZXNoU2V0dGluZzsKLQkKLQlwdWJsaWMgSW1wb3J0RXhpc3RpbmdUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCQotCXByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBEaWFsb2dDaGVjay5nZXRTaGVsbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRvU2V0VXAoKTsKLQkJb3JpZ2luYWxSZWZyZXNoU2V0dGluZyA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKQotICAgICAgICAJLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihSZXNvdXJjZXNQbHVnaW4uUFJFRl9BVVRPX1JFRlJFU0gpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkKLSAgICAJCS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFJlc291cmNlc1BsdWdpbi5QUkVGX0FVVE9fUkVGUkVTSCwgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5kb1RlYXJEb3duKCk7Ci0JCUlXb3Jrc3BhY2VSb290IHdzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSB3c1Jvb3QuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKyl7Ci0JCQlGaWxlVXRpbC5kZWxldGVQcm9qZWN0KHByb2plY3RzW2ldKTsKLQkJfQotCQkvLyBjbGVhbiB1cCBhbnkgZGF0YSBkaXJlY3RvcmllcyBjcmVhdGVkCi0JCWlmIChkYXRhTG9jYXRpb24gIT0gbnVsbCl7Ci0JCQlGaWxlIHJvb3QgPSBuZXcgRmlsZShkYXRhTG9jYXRpb24pOwotCQkJaWYgKHJvb3QuZXhpc3RzKCkpewotCQkJCWRlbGV0ZURpcmVjdG9yeShyb290KTsKLQkJCX0KLQkJfQotCQlkYXRhTG9jYXRpb24gPSBudWxsOwkvLyByZXNldCBmb3IgbmV4dCB0ZXN0Ci0JCQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkKLQkJCS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFJlc291cmNlc1BsdWdpbi5QUkVGX0FVVE9fUkVGUkVTSCwgCi0JCQkJCQlvcmlnaW5hbFJlZnJlc2hTZXR0aW5nKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdhaXRGb3JSZWZyZXNoKCl7Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fUkVGUkVTSCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbmRTaW5nbGVaaXAoKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgYXJjaGl2ZUZpbGUgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKFBsYXRmb3JtLmZpbmQoVGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCksIAotCQkJCQluZXcgUGF0aChEQVRBX1BBVEhfUFJFRklYICsgQVJDSElWRV9IRUxMT1dPUkxEICsgIi56aXAiKSkpOwotCQkJV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlIHdwaXAgPSBnZXROZXdXaXphcmQoKTsKLQkJCUhhc2hTZXQgcHJvamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJcHJvamVjdHMuYWRkKCJIZWxsb1dvcmxkIik7Ci0JCQkKLQkJCXdwaXAuZ2V0UHJvamVjdEZyb21EaXJlY3RvcnlSYWRpbygpLnNldFNlbGVjdGlvbigoZmFsc2UpKTsgLy9XZSB3YW50IHRoZSBvdGhlciBvbmUgc2VsZWN0ZWQKLQkJCXdwaXAudXBkYXRlUHJvamVjdHNMaXN0KGFyY2hpdmVGaWxlLmdldFBhdGgoKSk7Ci0KLQkJCVByb2plY3RSZWNvcmRbXSBzZWxlY3RlZFByb2plY3RzPSB3cGlwLmdldFZhbGlkUHJvamVjdHMoKTsKLQkJCUFycmF5TGlzdCBwcm9qZWN0TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlwcm9qZWN0TmFtZXMuYWRkKHNlbGVjdGVkUHJvamVjdHNbaV0uZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCQl9Ci0JCQkKLQkJCWFzc2VydFRydWUoIk5vdCBhbGwgcHJvamVjdHMgd2VyZSBmb3VuZCBjb3JyZWN0bHkgaW4gemlwIiwgcHJvamVjdE5hbWVzLmNvbnRhaW5zQWxsKHByb2plY3RzKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmluZFNpbmdsZVRhcigpIHsKLQkJdHJ5IHsKLQkJCVVSTCBhcmNoaXZlRmlsZSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwoUGxhdGZvcm0uZmluZChUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSwgCi0JCQkJCW5ldyBQYXRoKERBVEFfUEFUSF9QUkVGSVggKyBBUkNISVZFX0hFTExPV09STEQgKyAiLnRhciIpKSk7Ci0JCQlXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2Ugd3BpcCA9IGdldE5ld1dpemFyZCgpOwotCQkJSGFzaFNldCBwcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlwcm9qZWN0cy5hZGQoIkhlbGxvV29ybGQiKTsKLQkJCQotCQkJd3BpcC5nZXRQcm9qZWN0RnJvbURpcmVjdG9yeVJhZGlvKCkuc2V0U2VsZWN0aW9uKChmYWxzZSkpOyAvL1dlIHdhbnQgdGhlIG90aGVyIG9uZSBzZWxlY3RlZAotCQkJd3BpcC51cGRhdGVQcm9qZWN0c0xpc3QoYXJjaGl2ZUZpbGUuZ2V0UGF0aCgpKTsKLQkJCQotCQkJUHJvamVjdFJlY29yZFtdIHNlbGVjdGVkUHJvamVjdHM9IHdwaXAuZ2V0VmFsaWRQcm9qZWN0cygpOwotCQkJQXJyYXlMaXN0IHByb2plY3ROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCXByb2plY3ROYW1lcy5hZGQoc2VsZWN0ZWRQcm9qZWN0c1tpXS5nZXRQcm9qZWN0TmFtZSgpKTsKLQkJCX0KLQkJCQotCQkJYXNzZXJ0VHJ1ZSgiTm90IGFsbCBwcm9qZWN0cyB3ZXJlIGZvdW5kIGNvcnJlY3RseSBpbiB0YXIiLCBwcm9qZWN0TmFtZXMuY29udGFpbnNBbGwocHJvamVjdHMpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbmRTaW5nbGVEaXJlY3RvcnkoKSB7Ci0JCXRyeSB7Ci0JCQlkYXRhTG9jYXRpb24gPSBjb3B5RGF0YUxvY2F0aW9uKCk7Ci0JCQlJUGF0aCB3c1BhdGggPSBuZXcgUGF0aChkYXRhTG9jYXRpb24pLmFwcGVuZCgiSGVsbG9Xb3JsZCIpOwotCQkJV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlIHdwaXAgPSBnZXROZXdXaXphcmQoKTsKLQkJCUhhc2hTZXQgcHJvamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJcHJvamVjdHMuYWRkKCJIZWxsb1dvcmxkIik7Ci0JCQkvLyBXZSdyZSBpbXBvcnRpbmcgYSBkaXJlY3RvcnkKLQkJCXdwaXAuZ2V0UHJvamVjdEZyb21EaXJlY3RvcnlSYWRpbygpLnNldFNlbGVjdGlvbigodHJ1ZSkpOyAKLQkJCXdwaXAudXBkYXRlUHJvamVjdHNMaXN0KHdzUGF0aC50b09TU3RyaW5nKCkpOwotCi0JCQlQcm9qZWN0UmVjb3JkW10gc2VsZWN0ZWRQcm9qZWN0cyA9IHdwaXAuZ2V0VmFsaWRQcm9qZWN0cygpOwotCQkJQXJyYXlMaXN0IHByb2plY3ROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCXByb2plY3ROYW1lcy5hZGQoc2VsZWN0ZWRQcm9qZWN0c1tpXS5nZXRQcm9qZWN0TmFtZSgpKTsKLQkJCX0KLQotCQkJYXNzZXJ0VHJ1ZSgiTm90IGFsbCBwcm9qZWN0cyB3ZXJlIGZvdW5kIGNvcnJlY3RseSBpbiBkaXJlY3RvcnkiLAotCQkJCQlwcm9qZWN0TmFtZXMuY29udGFpbnNBbGwocHJvamVjdHMpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3REb05vdFNob3dQcm9qZWN0V2l0aFNhbWVOYW1lKCl7Ci0JCXRyeSB7Ci0JCQlkYXRhTG9jYXRpb24gPSBjb3B5RGF0YUxvY2F0aW9uKCk7Ci0JCQlJUGF0aCB3c1BhdGggPSBuZXcgUGF0aChkYXRhTG9jYXRpb24pOwotCQkJCi0JCQlGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJIZWxsb1dvcmxkIik7Ci0JCQkKLQkJCVdpemFyZFByb2plY3RzSW1wb3J0UGFnZSB3cGlwID0gZ2V0TmV3V2l6YXJkKCk7Ci0JCQkvLyBXZSdyZSBpbXBvcnRpbmcgYSBkaXJlY3RvcnkKLQkJCXdwaXAuZ2V0UHJvamVjdEZyb21EaXJlY3RvcnlSYWRpbygpLnNldFNlbGVjdGlvbigodHJ1ZSkpOyAKLQkJCXdwaXAudXBkYXRlUHJvamVjdHNMaXN0KHdzUGF0aC50b09TU3RyaW5nKCkpOwotCi0JCQlQcm9qZWN0UmVjb3JkW10gc2VsZWN0ZWRQcm9qZWN0cyA9IHdwaXAuZ2V0VmFsaWRQcm9qZWN0cygpOwotCQkJQXJyYXlMaXN0IHByb2plY3ROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCXByb2plY3ROYW1lcy5hZGQoc2VsZWN0ZWRQcm9qZWN0c1tpXS5nZXRQcm9qZWN0TmFtZSgpKTsKLQkJCX0KLQotCQkJYXNzZXJ0RXF1YWxzKCJ0aGVyZSBzaG91bGQgb25seSBiZSB0aGUgV29ybGRIZWxsbyBwcm9qZWN0IGxlZnQiLCAKLQkJCQkJMSwgcHJvamVjdE5hbWVzLnNpemUoKSk7Ci0JCQkKLQkJCWFzc2VydFRydWUoIkhlbGxvV29ybGQgcHJvamVjdCBzaG91bGQgbm90IGJlIGZvdW5kIGluIHByb2plY3QgbGlzdC4iLAotCQkJCQkhcHJvamVjdE5hbWVzLmNvbnRhaW5zKCJIZWxsb1dvcmxkIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEltcG9ydFNpbmdsZVppcCgpIHsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCi0JCQlJUHJvamVjdFtdIHdvcmtzcGFjZVByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3Jrc3BhY2VQcm9qZWN0cy5sZW5ndGg7IGkrKykgCi0gICAgICAgICAgICAJRmlsZVV0aWwuZGVsZXRlUHJvamVjdCh3b3Jrc3BhY2VQcm9qZWN0c1tpXSk7Ci0JCQlVUkwgYXJjaGl2ZUZpbGUgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKFBsYXRmb3JtLmZpbmQoVGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCksIAotCQkJCQluZXcgUGF0aChEQVRBX1BBVEhfUFJFRklYICsgQVJDSElWRV9IRUxMT1dPUkxEICsgIi56aXAiKSkpOwotCQkJV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlIHdwaXAgPSBnZXROZXdXaXphcmQoKTsKLQkJCUhhc2hTZXQgcHJvamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJcHJvamVjdHMuYWRkKCJIZWxsb1dvcmxkIik7Ci0JCQkKLQkJCXdwaXAuZ2V0UHJvamVjdEZyb21EaXJlY3RvcnlSYWRpbygpLnNldFNlbGVjdGlvbigoZmFsc2UpKTsgLy9XZSB3YW50IHRoZSBvdGhlciBvbmUgc2VsZWN0ZWQKLQkJCXdwaXAudXBkYXRlUHJvamVjdHNMaXN0KGFyY2hpdmVGaWxlLmdldFBhdGgoKSk7Ci0JCQkKLQkJCVByb2plY3RSZWNvcmRbXSBzZWxlY3RlZFByb2plY3RzPSB3cGlwLmdldFZhbGlkUHJvamVjdHMoKTsKLQkJCUFycmF5TGlzdCBwcm9qZWN0TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlwcm9qZWN0TmFtZXMuYWRkKHNlbGVjdGVkUHJvamVjdHNbaV0uZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCQl9Ci0KLQkJCWFzc2VydFRydWUoIk5vdCBhbGwgcHJvamVjdHMgd2VyZSBmb3VuZCBjb3JyZWN0bHkgaW4gemlwIiwgcHJvamVjdE5hbWVzLmNvbnRhaW5zQWxsKHByb2plY3RzKSk7Ci0KLQkJCUNoZWNrYm94VHJlZVZpZXdlciBwcm9qZWN0c0xpc3Q9IHdwaXAuZ2V0UHJvamVjdHNMaXN0KCk7Ci0JCQlwcm9qZWN0c0xpc3Quc2V0Q2hlY2tlZEVsZW1lbnRzKHNlbGVjdGVkUHJvamVjdHMpOwotCQkJd3BpcC5jcmVhdGVQcm9qZWN0cygpOyAvLyBUcnkgaW1wb3J0aW5nIGFsbCB0aGUgcHJvamVjdHMgd2UgZm91bmQKLQkJCXdhaXRGb3JSZWZyZXNoKCk7Ci0JCQkKLQkJCS8vICJIZWxsb1dvcmxkIiBzaG91bGQgYmUgdGhlIG9ubHkgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JCQl3b3Jrc3BhY2VQcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKLQkJCWlmICh3b3Jrc3BhY2VQcm9qZWN0cy5sZW5ndGggIT0gMSkKLQkJCQlmYWlsKCJJbmNvcnJlY3QgTnVtYmVyIG9mIHByb2plY3RzIGltcG9ydGVkIik7Ci0JCQlJRm9sZGVyIGhlbGxvRm9sZGVyID0gd29ya3NwYWNlUHJvamVjdHNbMF0uZ2V0Rm9sZGVyKCJIZWxsb1dvcmxkIik7Ci0JCQlpZiAoaGVsbG9Gb2xkZXIuZXhpc3RzKCkpCi0JCQkJZmFpbCgiUHJvamVjdCB3YXMgaW1wb3J0ZWQgYXMgYSBmb2xkZXIgaW50byBpdHNlbGYiKTsKLQkJCQotCQkJdmVyaWZ5UHJvamVjdEluV29ya3NwYWNlKHRydWUsIHdvcmtzcGFjZVByb2plY3RzWzBdLCBGSUxFX0xJU1QsIHRydWUpOwotCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0WmlwV2l0aEVtcHR5Rm9sZGVyKCl7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQotCQkJSVByb2plY3RbXSB3b3Jrc3BhY2VQcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29ya3NwYWNlUHJvamVjdHMubGVuZ3RoOyBpKyspIAotICAgICAgICAgICAgCUZpbGVVdGlsLmRlbGV0ZVByb2plY3Qod29ya3NwYWNlUHJvamVjdHNbaV0pOwotCQkJVVJMIGFyY2hpdmVGaWxlID0gUGxhdGZvcm0uYXNMb2NhbFVSTChQbGF0Zm9ybS5maW5kKFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLCAKLQkJCQkJbmV3IFBhdGgoREFUQV9QQVRIX1BSRUZJWCArIEFSQ0hJVkVfRklMRV9XSVRIX0VNUFRZX0ZPTERFUiArICIuemlwIikpKTsKLQkJCVdpemFyZFByb2plY3RzSW1wb3J0UGFnZSB3cGlwID0gZ2V0TmV3V2l6YXJkKCk7Ci0JCQlIYXNoU2V0IHByb2plY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCXByb2plY3RzLmFkZCgiQSIpOwotCQkJCi0JCQl3cGlwLmdldFByb2plY3RGcm9tRGlyZWN0b3J5UmFkaW8oKS5zZXRTZWxlY3Rpb24oKGZhbHNlKSk7IC8vV2Ugd2FudCB0aGUgb3RoZXIgb25lIHNlbGVjdGVkCi0JCQl3cGlwLnVwZGF0ZVByb2plY3RzTGlzdChhcmNoaXZlRmlsZS5nZXRQYXRoKCkpOwotCQkJCi0JCQlQcm9qZWN0UmVjb3JkW10gc2VsZWN0ZWRQcm9qZWN0cz0gd3BpcC5nZXRWYWxpZFByb2plY3RzKCk7Ci0JCQlBcnJheUxpc3QgcHJvamVjdE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZFByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJvamVjdE5hbWVzLmFkZChzZWxlY3RlZFByb2plY3RzW2ldLmdldFByb2plY3ROYW1lKCkpOwotCQkJfQotCi0JCQlhc3NlcnRUcnVlKCJOb3QgYWxsIHByb2plY3RzIHdlcmUgZm91bmQgY29ycmVjdGx5IGluIHppcCIsIHByb2plY3ROYW1lcy5jb250YWluc0FsbChwcm9qZWN0cykpOwotCi0JCQlDaGVja2JveFRyZWVWaWV3ZXIgcHJvamVjdHNMaXN0PSB3cGlwLmdldFByb2plY3RzTGlzdCgpOwotCQkJcHJvamVjdHNMaXN0LnNldENoZWNrZWRFbGVtZW50cyhzZWxlY3RlZFByb2plY3RzKTsKLQkJCXdwaXAuY3JlYXRlUHJvamVjdHMoKTsgLy8gVHJ5IGltcG9ydGluZyBhbGwgdGhlIHByb2plY3RzIHdlIGZvdW5kCi0JCQl3YWl0Rm9yUmVmcmVzaCgpOwotCQkJCi0JCQkvLyAiSGVsbG9Xb3JsZCIgc2hvdWxkIGJlIHRoZSBvbmx5IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCQkJd29ya3NwYWNlUHJvamVjdHMgPSByb290LmdldFByb2plY3RzKCk7Ci0JCQlpZiAod29ya3NwYWNlUHJvamVjdHMubGVuZ3RoICE9IDEpCi0JCQkJZmFpbCgiSW5jb3JyZWN0IE51bWJlciBvZiBwcm9qZWN0cyBpbXBvcnRlZCIpOwotCQkJSUZvbGRlciBoZWxsb0ZvbGRlciA9IHdvcmtzcGFjZVByb2plY3RzWzBdLmdldEZvbGRlcigiSGVsbG9Xb3JsZCIpOwotCQkJaWYgKGhlbGxvRm9sZGVyLmV4aXN0cygpKQotCQkJCWZhaWwoIlByb2plY3Qgd2FzIGltcG9ydGVkIGFzIGEgZm9sZGVyIGludG8gaXRzZWxmIik7Ci0JCQkKLQkJCXZlcmlmeVByb2plY3RJbldvcmtzcGFjZSh0cnVlLCB3b3Jrc3BhY2VQcm9qZWN0c1swXSwgQVJDSElWRV9GSUxFX0VNUFRZX0ZPTERFUl9MSVNULCBmYWxzZSk7Ci0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0U2luZ2xlVGFyKCkgewotCQl0cnkgewotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkKLQkJCUlQcm9qZWN0W10gd29ya3NwYWNlUHJvamVjdHMgPSByb290LmdldFByb2plY3RzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aDsgaSsrKSAKLSAgICAgICAgICAgIAlGaWxlVXRpbC5kZWxldGVQcm9qZWN0KHdvcmtzcGFjZVByb2plY3RzW2ldKTsKLSAgICAgICAgICAgIFVSTCBhcmNoaXZlRmlsZSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwoUGxhdGZvcm0uZmluZChUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSwgCi0gICAgICAgICAgICAJCW5ldyBQYXRoKERBVEFfUEFUSF9QUkVGSVggKyBBUkNISVZFX0hFTExPV09STEQgKyAiLnRhciIpKSk7Ci0JCQlXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2Ugd3BpcCA9IGdldE5ld1dpemFyZCgpOwotCQkJSGFzaFNldCBwcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlwcm9qZWN0cy5hZGQoIkhlbGxvV29ybGQiKTsKLQkJCQotCQkJd3BpcC5nZXRQcm9qZWN0RnJvbURpcmVjdG9yeVJhZGlvKCkuc2V0U2VsZWN0aW9uKChmYWxzZSkpOyAvL1dlIHdhbnQgdGhlIG90aGVyIG9uZSBzZWxlY3RlZAotCQkJd3BpcC51cGRhdGVQcm9qZWN0c0xpc3QoYXJjaGl2ZUZpbGUuZ2V0UGF0aCgpKTsKLQkJCQotCQkJUHJvamVjdFJlY29yZFtdIHNlbGVjdGVkUHJvamVjdHM9IHdwaXAuZ2V0VmFsaWRQcm9qZWN0cygpOwotCQkJQXJyYXlMaXN0IHByb2plY3ROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCXByb2plY3ROYW1lcy5hZGQoc2VsZWN0ZWRQcm9qZWN0c1tpXS5nZXRQcm9qZWN0TmFtZSgpKTsKLQkJCX0KLQotCQkJYXNzZXJ0VHJ1ZSgiTm90IGFsbCBwcm9qZWN0cyB3ZXJlIGZvdW5kIGNvcnJlY3RseSBpbiB0YXIiLCBwcm9qZWN0TmFtZXMuY29udGFpbnNBbGwocHJvamVjdHMpKTsKLQotCQkJQ2hlY2tib3hUcmVlVmlld2VyIHByb2plY3RzTGlzdD0gd3BpcC5nZXRQcm9qZWN0c0xpc3QoKTsKLQkJCXByb2plY3RzTGlzdC5zZXRDaGVja2VkRWxlbWVudHMoc2VsZWN0ZWRQcm9qZWN0cyk7Ci0JCQl3cGlwLmNyZWF0ZVByb2plY3RzKCk7IC8vIFRyeSBpbXBvcnRpbmcgYWxsIHRoZSBwcm9qZWN0cyB3ZSBmb3VuZAotCQkJd2FpdEZvclJlZnJlc2goKTsKLQkJCQotCQkJLy8gIkhlbGxvV29ybGQiIHNob3VsZCBiZSB0aGUgb25seSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkJCXdvcmtzcGFjZVByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotCQkJaWYgKHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aCAhPSAxKQotCQkJCWZhaWwoIkluY29ycmVjdCBOdW1iZXIgb2YgcHJvamVjdHMgaW1wb3J0ZWQiKTsKLQkJCUlGb2xkZXIgaGVsbG9Gb2xkZXIgPSB3b3Jrc3BhY2VQcm9qZWN0c1swXS5nZXRGb2xkZXIoIkhlbGxvV29ybGQiKTsKLQkJCWlmIChoZWxsb0ZvbGRlci5leGlzdHMoKSkKLQkJCQlmYWlsKCJQcm9qZWN0IHdhcyBpbXBvcnRlZCBhcyBhIGZvbGRlciBpbnRvIGl0c2VsZiIpOwotCQkJCi0JCQl2ZXJpZnlQcm9qZWN0SW5Xb3Jrc3BhY2UodHJ1ZSwgd29ya3NwYWNlUHJvamVjdHNbMF0sIEZJTEVfTElTVCwgdHJ1ZSk7Ci0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJfQotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUYXJXaXRoRW1wdHlGb2xkZXIoKXsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCi0JCQlJUHJvamVjdFtdIHdvcmtzcGFjZVByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3Jrc3BhY2VQcm9qZWN0cy5sZW5ndGg7IGkrKykgCi0gICAgICAgICAgICAJRmlsZVV0aWwuZGVsZXRlUHJvamVjdCh3b3Jrc3BhY2VQcm9qZWN0c1tpXSk7Ci0gICAgICAgICAgICBVUkwgYXJjaGl2ZUZpbGUgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKFBsYXRmb3JtLmZpbmQoVGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCksIAotICAgICAgICAgICAgCQluZXcgUGF0aChEQVRBX1BBVEhfUFJFRklYICsgQVJDSElWRV9GSUxFX1dJVEhfRU1QVFlfRk9MREVSICsgIi50YXIiKSkpOwotCQkJV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlIHdwaXAgPSBnZXROZXdXaXphcmQoKTsKLQkJCUhhc2hTZXQgcHJvamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJcHJvamVjdHMuYWRkKCJBIik7Ci0JCQkKLQkJCXdwaXAuZ2V0UHJvamVjdEZyb21EaXJlY3RvcnlSYWRpbygpLnNldFNlbGVjdGlvbigoZmFsc2UpKTsgLy9XZSB3YW50IHRoZSBvdGhlciBvbmUgc2VsZWN0ZWQKLQkJCXdwaXAudXBkYXRlUHJvamVjdHNMaXN0KGFyY2hpdmVGaWxlLmdldFBhdGgoKSk7Ci0JCQkKLQkJCVByb2plY3RSZWNvcmRbXSBzZWxlY3RlZFByb2plY3RzPSB3cGlwLmdldFZhbGlkUHJvamVjdHMoKTsKLQkJCUFycmF5TGlzdCBwcm9qZWN0TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlwcm9qZWN0TmFtZXMuYWRkKHNlbGVjdGVkUHJvamVjdHNbaV0uZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCQl9Ci0KLQkJCWFzc2VydFRydWUoIk5vdCBhbGwgcHJvamVjdHMgd2VyZSBmb3VuZCBjb3JyZWN0bHkgaW4gdGFyIiwgcHJvamVjdE5hbWVzLmNvbnRhaW5zQWxsKHByb2plY3RzKSk7Ci0KLQkJCUNoZWNrYm94VHJlZVZpZXdlciBwcm9qZWN0c0xpc3Q9IHdwaXAuZ2V0UHJvamVjdHNMaXN0KCk7Ci0JCQlwcm9qZWN0c0xpc3Quc2V0Q2hlY2tlZEVsZW1lbnRzKHNlbGVjdGVkUHJvamVjdHMpOwotCQkJd3BpcC5jcmVhdGVQcm9qZWN0cygpOyAvLyBUcnkgaW1wb3J0aW5nIGFsbCB0aGUgcHJvamVjdHMgd2UgZm91bmQKLQkJCXdhaXRGb3JSZWZyZXNoKCk7Ci0JCQkKLQkJCS8vICJIZWxsb1dvcmxkIiBzaG91bGQgYmUgdGhlIG9ubHkgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JCQl3b3Jrc3BhY2VQcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKLQkJCWlmICh3b3Jrc3BhY2VQcm9qZWN0cy5sZW5ndGggIT0gMSkKLQkJCQlmYWlsKCJJbmNvcnJlY3QgTnVtYmVyIG9mIHByb2plY3RzIGltcG9ydGVkOiBFeHBlY3RlZD0xLCBBY3R1YWw9IiArIHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aCk7Ci0JCQlJRm9sZGVyIGhlbGxvRm9sZGVyID0gd29ya3NwYWNlUHJvamVjdHNbMF0uZ2V0Rm9sZGVyKCJBIik7Ci0JCQlpZiAoaGVsbG9Gb2xkZXIuZXhpc3RzKCkpCi0JCQkJZmFpbCgiUHJvamVjdCB3YXMgaW1wb3J0ZWQgYXMgYSBmb2xkZXIgaW50byBpdHNlbGYiKTsKLQkJCQotCQkJdmVyaWZ5UHJvamVjdEluV29ya3NwYWNlKHRydWUsIHdvcmtzcGFjZVByb2plY3RzWzBdLCBBUkNISVZFX0ZJTEVfRU1QVFlfRk9MREVSX0xJU1QsIGZhbHNlKTsKLQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEltcG9ydFNpbmdsZURpcmVjdG9yeSgpIHsKLQkJSVBhdGggd3NQYXRoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCi0JCQlJUHJvamVjdFtdIHdvcmtzcGFjZVByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3Jrc3BhY2VQcm9qZWN0cy5sZW5ndGg7IGkrKykgCi0gICAgICAgICAgICAJRmlsZVV0aWwuZGVsZXRlUHJvamVjdCh3b3Jrc3BhY2VQcm9qZWN0c1tpXSk7Ci0JCQkKLSAgICAgICAgICAgIGRhdGFMb2NhdGlvbiA9IGNvcHlEYXRhTG9jYXRpb24oKTsKLSAgICAgICAgICAgIHdzUGF0aCA9IG5ldyBQYXRoKGRhdGFMb2NhdGlvbikuYXBwZW5kKCJIZWxsb1dvcmxkIik7Ci0gICAgICAgICAgICBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2Ugd3BpcCA9IGdldE5ld1dpemFyZCgpOwotCQkJSGFzaFNldCBwcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlwcm9qZWN0cy5hZGQoIkhlbGxvV29ybGQiKTsKLQkJCQotCQkJd3BpcC5nZXRQcm9qZWN0RnJvbURpcmVjdG9yeVJhZGlvKCkuc2V0U2VsZWN0aW9uKCh0cnVlKSk7IAotCQkJd3BpcC51cGRhdGVQcm9qZWN0c0xpc3Qod3NQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQlQcm9qZWN0UmVjb3JkW10gc2VsZWN0ZWRQcm9qZWN0cz0gd3BpcC5nZXRWYWxpZFByb2plY3RzKCk7Ci0JCQlBcnJheUxpc3QgcHJvamVjdE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZFByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJvamVjdE5hbWVzLmFkZChzZWxlY3RlZFByb2plY3RzW2ldLmdldFByb2plY3ROYW1lKCkpOwotCQkJfQotCi0JCQlhc3NlcnRUcnVlKCJOb3QgYWxsIHByb2plY3RzIHdlcmUgZm91bmQgY29ycmVjdGx5IGluIGRpcmVjdG9yeSIsIHByb2plY3ROYW1lcy5jb250YWluc0FsbChwcm9qZWN0cykpOwotCi0JCQlDaGVja2JveFRyZWVWaWV3ZXIgcHJvamVjdHNMaXN0PSB3cGlwLmdldFByb2plY3RzTGlzdCgpOwotCQkJcHJvamVjdHNMaXN0LnNldENoZWNrZWRFbGVtZW50cyhzZWxlY3RlZFByb2plY3RzKTsKLQkJCXdwaXAuY3JlYXRlUHJvamVjdHMoKTsgLy8gVHJ5IGltcG9ydGluZyBhbGwgdGhlIHByb2plY3RzIHdlIGZvdW5kCi0JCQl3YWl0Rm9yUmVmcmVzaCgpOwotCQkJCi0JCQkvLyAiSGVsbG9Xb3JsZCIgc2hvdWxkIGJlIHRoZSBvbmx5IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCQkJd29ya3NwYWNlUHJvamVjdHMgPSByb290LmdldFByb2plY3RzKCk7Ci0JCQlpZiAod29ya3NwYWNlUHJvamVjdHMubGVuZ3RoICE9IDEpCi0JCQkJZmFpbCgiSW5jb3JyZWN0IE51bWJlciBvZiBwcm9qZWN0cyBpbXBvcnRlZCIpOwotCQkJSUZvbGRlciBoZWxsb0ZvbGRlciA9IHdvcmtzcGFjZVByb2plY3RzWzBdLmdldEZvbGRlcigiSGVsbG9Xb3JsZCIpOwotCQkJaWYgKGhlbGxvRm9sZGVyLmV4aXN0cygpKQotCQkJCWZhaWwoIlByb2plY3Qgd2FzIGltcG9ydGVkIGFzIGEgZm9sZGVyIGludG8gaXRzZWxmIik7Ci0JCQkKLQkJCXZlcmlmeVByb2plY3RJbldvcmtzcGFjZShmYWxzZSwgd29ya3NwYWNlUHJvamVjdHNbMF0sIEZJTEVfTElTVCwgdHJ1ZSk7Ci0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0U2luZ2xlRGlyZWN0b3J5V2l0aENvcHkoKSB7Ci0JCUlQYXRoIHdzUGF0aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQotCQkJSVByb2plY3RbXSB3b3Jrc3BhY2VQcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29ya3NwYWNlUHJvamVjdHMubGVuZ3RoOyBpKyspIAotICAgICAgICAgICAgCUZpbGVVdGlsLmRlbGV0ZVByb2plY3Qod29ya3NwYWNlUHJvamVjdHNbaV0pOwotCQkJCi0gICAgICAgICAgICBkYXRhTG9jYXRpb24gPSBjb3B5RGF0YUxvY2F0aW9uKCk7Ci0gICAgICAgICAgICB3c1BhdGggPSBuZXcgUGF0aChkYXRhTG9jYXRpb24pLmFwcGVuZCgiSGVsbG9Xb3JsZCIpOwotICAgICAgICAgICAgV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlIHdwaXAgPSBnZXROZXdXaXphcmQoKTsKLQkJCUhhc2hTZXQgcHJvamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJcHJvamVjdHMuYWRkKCJIZWxsb1dvcmxkIik7Ci0JCQkKLQkJCXdwaXAuZ2V0UHJvamVjdEZyb21EaXJlY3RvcnlSYWRpbygpLnNldFNlbGVjdGlvbigodHJ1ZSkpOwotCQkJd3BpcC5nZXRDb3B5Q2hlY2tib3goKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl3cGlwLnNhdmVXaWRnZXRWYWx1ZXMoKTsKLQkJCXdwaXAucmVzdG9yZVdpZGdldFZhbHVlcygpOwotCi0JCQl3cGlwLnVwZGF0ZVByb2plY3RzTGlzdCh3c1BhdGgudG9PU1N0cmluZygpKTsKLQkJCVByb2plY3RSZWNvcmRbXSBzZWxlY3RlZFByb2plY3RzPSB3cGlwLmdldFZhbGlkUHJvamVjdHMoKTsKLQkJCUFycmF5TGlzdCBwcm9qZWN0TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlwcm9qZWN0TmFtZXMuYWRkKHNlbGVjdGVkUHJvamVjdHNbaV0uZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCQl9Ci0KLQkJCWFzc2VydFRydWUoIk5vdCBhbGwgcHJvamVjdHMgd2VyZSBmb3VuZCBjb3JyZWN0bHkgaW4gemlwIiwgcHJvamVjdE5hbWVzLmNvbnRhaW5zQWxsKHByb2plY3RzKSk7Ci0KLQkJCUNoZWNrYm94VHJlZVZpZXdlciBwcm9qZWN0c0xpc3Q9IHdwaXAuZ2V0UHJvamVjdHNMaXN0KCk7Ci0JCQlwcm9qZWN0c0xpc3Quc2V0Q2hlY2tlZEVsZW1lbnRzKHNlbGVjdGVkUHJvamVjdHMpOwotCQkJd3BpcC5jcmVhdGVQcm9qZWN0cygpOyAvLyBUcnkgaW1wb3J0aW5nIGFsbCB0aGUgcHJvamVjdHMgd2UgZm91bmQKLQkJCXdhaXRGb3JSZWZyZXNoKCk7Ci0JCQkKLQkJCS8vICJIZWxsb1dvcmxkIiBzaG91bGQgYmUgdGhlIG9ubHkgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JCQl3b3Jrc3BhY2VQcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKLQkJCWlmICh3b3Jrc3BhY2VQcm9qZWN0cy5sZW5ndGggIT0gMSkKLQkJCQlmYWlsKCJJbmNvcnJlY3QgTnVtYmVyIG9mIHByb2plY3RzIGltcG9ydGVkIik7Ci0JCQlJRm9sZGVyIGhlbGxvRm9sZGVyID0gd29ya3NwYWNlUHJvamVjdHNbMF0uZ2V0Rm9sZGVyKCJIZWxsb1dvcmxkIik7Ci0JCQlpZiAoaGVsbG9Gb2xkZXIuZXhpc3RzKCkpCi0JCQkJZmFpbCgiUHJvamVjdCB3YXMgaW1wb3J0ZWQgYXMgYSBmb2xkZXIgaW50byBpdHNlbGYiKTsKLQkJCQotCQkJdmVyaWZ5UHJvamVjdEluV29ya3NwYWNlKHRydWUsIHdvcmtzcGFjZVByb2plY3RzWzBdLCBGSUxFX0xJU1QsIHRydWUpOwotCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEltcG9ydFNpbmdsZURpcmVjdG9yeVdpdGhDb3B5RGVsZXRlUHJvamVjdEtlZXBDb250ZW50cygpewotCQlJUGF0aCB3c1BhdGggPSBudWxsOwotCQl0cnkgewotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkKLQkJCUlQcm9qZWN0W10gd29ya3NwYWNlUHJvamVjdHMgPSByb290LmdldFByb2plY3RzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aDsgaSsrKSAKLSAgICAgICAgICAgIAlGaWxlVXRpbC5kZWxldGVQcm9qZWN0KHdvcmtzcGFjZVByb2plY3RzW2ldKTsKLQkJCQotICAgICAgICAgICAgZGF0YUxvY2F0aW9uID0gY29weURhdGFMb2NhdGlvbigpOwotICAgICAgICAgICAgd3NQYXRoID0gbmV3IFBhdGgoZGF0YUxvY2F0aW9uKS5hcHBlbmQoIkhlbGxvV29ybGQiKTsKLSAgICAgICAgICAgIFdpemFyZFByb2plY3RzSW1wb3J0UGFnZSB3cGlwID0gZ2V0TmV3V2l6YXJkKCk7Ci0JCQlIYXNoU2V0IHByb2plY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCXByb2plY3RzLmFkZCgiSGVsbG9Xb3JsZCIpOwotCQkJCi0JCQl3cGlwLmdldFByb2plY3RGcm9tRGlyZWN0b3J5UmFkaW8oKS5zZXRTZWxlY3Rpb24oKHRydWUpKTsKLQkJCXdwaXAuZ2V0Q29weUNoZWNrYm94KCkuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJd3BpcC5zYXZlV2lkZ2V0VmFsdWVzKCk7Ci0JCQl3cGlwLnJlc3RvcmVXaWRnZXRWYWx1ZXMoKTsKLQotCQkJd3BpcC51cGRhdGVQcm9qZWN0c0xpc3Qod3NQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQlQcm9qZWN0UmVjb3JkW10gc2VsZWN0ZWRQcm9qZWN0cz0gd3BpcC5nZXRWYWxpZFByb2plY3RzKCk7Ci0JCQlBcnJheUxpc3QgcHJvamVjdE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZFByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJvamVjdE5hbWVzLmFkZChzZWxlY3RlZFByb2plY3RzW2ldLmdldFByb2plY3ROYW1lKCkpOwotCQkJfQotCi0JCQlhc3NlcnRUcnVlKCJOb3QgYWxsIHByb2plY3RzIHdlcmUgZm91bmQgY29ycmVjdGx5IGluIHppcCIsIHByb2plY3ROYW1lcy5jb250YWluc0FsbChwcm9qZWN0cykpOwotCi0JCQlDaGVja2JveFRyZWVWaWV3ZXIgcHJvamVjdHNMaXN0PSB3cGlwLmdldFByb2plY3RzTGlzdCgpOwotCQkJcHJvamVjdHNMaXN0LnNldENoZWNrZWRFbGVtZW50cyhzZWxlY3RlZFByb2plY3RzKTsKLQkJCXdwaXAuY3JlYXRlUHJvamVjdHMoKTsgLy8gVHJ5IGltcG9ydGluZyBhbGwgdGhlIHByb2plY3RzIHdlIGZvdW5kCi0JCQl3YWl0Rm9yUmVmcmVzaCgpOwotCQkJCi0JCQkvLyAiSGVsbG9Xb3JsZCIgc2hvdWxkIGJlIHRoZSBvbmx5IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCQkJd29ya3NwYWNlUHJvamVjdHMgPSByb290LmdldFByb2plY3RzKCk7Ci0JCQlpZiAod29ya3NwYWNlUHJvamVjdHMubGVuZ3RoICE9IDEpCi0JCQkJZmFpbCgiSW5jb3JyZWN0IE51bWJlciBvZiBwcm9qZWN0cyBpbXBvcnRlZDogIiArIHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aCArICIgcHJvamVjdHMgaW4gd29ya3NwYWNlLiIpOwotCQkJSUZvbGRlciBoZWxsb0ZvbGRlciA9IHdvcmtzcGFjZVByb2plY3RzWzBdLmdldEZvbGRlcigiSGVsbG9Xb3JsZCIpOwotCQkJaWYgKGhlbGxvRm9sZGVyLmV4aXN0cygpKQotCQkJCWZhaWwoIlByb2plY3Qgd2FzIGltcG9ydGVkIGFzIGEgZm9sZGVyIGludG8gaXRzZWxmIik7Ci0JCQkKLQkJCXZlcmlmeVByb2plY3RJbldvcmtzcGFjZSh0cnVlLCB3b3Jrc3BhY2VQcm9qZWN0c1swXSwgRklMRV9MSVNULCB0cnVlKTsKLQkJCQotCQkJLy8gZGVsZXRlIHByb2plY3RzIGluIHdvcmtzcGFjZSBidXQgbm90IGNvbnRlbnRzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aDsgaSsrKXsKLQkJCQl3b3Jrc3BhY2VQcm9qZWN0c1tpXS5kZWxldGUoZmFsc2UsIHRydWUsIG51bGwpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiVGVzdCBwcm9qZWN0IG5vdCBkZWxldGVkIHN1Y2Nlc3NmdWxseS4iLCByb290LmdldFByb2plY3RzKCkubGVuZ3RoID09IDApOwotCQkJCi0JCQkvLyBwZXJmb3JtIHNhbWUgdGVzdCBhZ2FpbiwgYnV0IHRoaXMgdGltZSBpbXBvcnQgZnJvbSB0aGlzIHdvcmtzcGFjZQotCQkJZmluYWwgV2l6YXJkUHJvamVjdHNJbXBvcnRQYWdlIHdwaXAyID0gZ2V0TmV3V2l6YXJkKCk7Ci0JCQlIYXNoU2V0IHByb2plY3RzMiA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlwcm9qZWN0czIuYWRkKCJIZWxsb1dvcmxkIik7Ci0JCQkKLQkJCXdwaXAyLmdldFByb2plY3RGcm9tRGlyZWN0b3J5UmFkaW8oKS5zZXRTZWxlY3Rpb24oKHRydWUpKTsKLQkJCXdwaXAyLmdldENvcHlDaGVja2JveCgpLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCXdwaXAyLnNhdmVXaWRnZXRWYWx1ZXMoKTsKLQkJCXdwaXAyLnJlc3RvcmVXaWRnZXRWYWx1ZXMoKTsKLQotCQkJd3BpcDIudXBkYXRlUHJvamVjdHNMaXN0KHdzUGF0aC50b09TU3RyaW5nKCkpOwotCQkJUHJvamVjdFJlY29yZFtdIHNlbGVjdGVkUHJvamVjdHMyID0gd3BpcDIuZ2V0VmFsaWRQcm9qZWN0cygpOwotCQkJYXNzZXJ0VHJ1ZSgiTm90IGFsbCBwcm9qZWN0cyB3ZXJlIGZvdW5kIGNvcnJlY3RseSBpbiB6aXAgKDIpLiIsIHNlbGVjdGVkUHJvamVjdHMyLmxlbmd0aCA9PSAxKTsKLQkJCQotCQkJQXJyYXlMaXN0IHByb2plY3ROYW1lczIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkUHJvamVjdHMyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJvamVjdE5hbWVzMi5hZGQoc2VsZWN0ZWRQcm9qZWN0czJbaV0uZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCQl9Ci0JCQkKLQkJCWFzc2VydFRydWUoIk5vdCBhbGwgcHJvamVjdHMgd2VyZSBmb3VuZCBjb3JyZWN0bHkgaW4gemlwICgyKSIsIHByb2plY3ROYW1lczIuY29udGFpbnNBbGwocHJvamVjdHMyKSk7Ci0KLQkJCUNoZWNrYm94VHJlZVZpZXdlciBwcm9qZWN0czJMaXN0PSB3cGlwMi5nZXRQcm9qZWN0c0xpc3QoKTsKLQkJCXByb2plY3RzMkxpc3Quc2V0Q2hlY2tlZEVsZW1lbnRzKHNlbGVjdGVkUHJvamVjdHMyKTsKLSAgICAgICAgICAgCXdwaXAyLmNyZWF0ZVByb2plY3RzKCk7IC8vIFRyeSBpbXBvcnRpbmcgYWxsIHRoZSBwcm9qZWN0cyB3ZSBmb3VuZAotICAgICAgICAgICAJd2FpdEZvclJlZnJlc2goKTsKLSAgICAgICAgICAgCQotCQkJLy8gIkhlbGxvV29ybGQiIHNob3VsZCBiZSB0aGUgb25seSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkJCXdvcmtzcGFjZVByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotCQkJaWYgKHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aCAhPSAxKQotCQkJCWZhaWwoIkluY29ycmVjdCBOdW1iZXIgb2YgcHJvamVjdHMgaW1wb3J0ZWQiKTsKLQkJCWhlbGxvRm9sZGVyID0gd29ya3NwYWNlUHJvamVjdHNbMF0uZ2V0Rm9sZGVyKCJIZWxsb1dvcmxkIik7Ci0JCQlpZiAoaGVsbG9Gb2xkZXIuZXhpc3RzKCkpCi0JCQkJZmFpbCgiUHJvamVjdCB3YXMgaW1wb3J0ZWQgYXMgYSBmb2xkZXIgaW50byBpdHNlbGYgKDIpIik7Ci0JCQkKLQkJCXZlcmlmeVByb2plY3RJbldvcmtzcGFjZSh0cnVlLCB3b3Jrc3BhY2VQcm9qZWN0c1swXSwgRklMRV9MSVNULCB0cnVlKTsKLQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmeSB3aGV0aGVyIG9yIG5vdCB0aGUgaW1wb3J0ZWQgcHJvamVjdCBpcyBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UgbG9jYXRpb24KLQkgKiAoaS5lLiBjb3B5IHByb2plY3RzIHdhcyB0cnVlKSBvciBpbiBhbm90aGVyIHdvcmtzcGFjZSBsb2NhdGlvbiAoaS5lLiBjb3B5IHByb2plY3RzCi0JICogd2FzIGZhbHNlKS4gIAotCSAqIAotCSAqIEBwYXJhbSBpbldvcmtzcGFjZQotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb2plY3RJbldvcmtzcGFjZShmaW5hbCBib29sZWFuIGluV29ya3NwYWNlLCAKLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIGZpbGVMaXN0LCBib29sZWFuIGlzTGlzdEZpbGVzKXsKLQkJCi0JCUlQYXRoIHJvb3RMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJSVBhdGggcHJvamVjdExvY2F0aW9uID0gcHJvamVjdC5nZXRMb2NhdGlvbigpOwotCQlib29sZWFuIGlzUHJvamVjdEluV29ya3NwYWNlID0gcm9vdExvY2F0aW9uLmlzUHJlZml4T2YocHJvamVjdExvY2F0aW9uKTsKLQkJaWYgKGluV29ya3NwYWNlKXsKLQkJCWlmICghaXNQcm9qZWN0SW5Xb3Jrc3BhY2UpCi0JCQkJZmFpbChwcm9qZWN0LmdldE5hbWUoKSArICIgc2hvdWxkIGJlIGluIHRoZSB3b3Jrc3BhY2UgbG9jYXRpb246ICIgKyByb290TG9jYXRpb24udG9PU1N0cmluZygpKTsKLQkJfQotCQllbHNlewotCQkJaWYgKGlzUHJvamVjdEluV29ya3NwYWNlKQotCQkJCWZhaWwocHJvamVjdC5nZXROYW1lKCkgKyAiIHNob3VsZCBub3QgYmUgaW4gdGhlIHdvcmtzcGFjZSBsb2NhdGlvbjogIiArIHJvb3RMb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBmaWxlc05vdEltcG9ydGVkID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyBtYWtlIHN1cmUgdGhlIGZpbGVzIGluIHRoZSBwcm9qZWN0IHdlcmUgaW1wb3J0ZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7IGkrKyl7Ci0JCQlJUmVzb3VyY2UgcmVzID0gaXNMaXN0RmlsZXMgPyAoSVJlc291cmNlKXByb2plY3QuZ2V0RmlsZShmaWxlTGlzdFtpXSkgCi0JCQkJCTogKElSZXNvdXJjZSlwcm9qZWN0LmdldEZvbGRlcihmaWxlTGlzdFtpXSk7Ci0JCQlpZiAoIXJlcy5leGlzdHMoKSkKLQkJCQlmaWxlc05vdEltcG9ydGVkLmFwcGVuZChyZXMuZ2V0TmFtZSgpICsgIiwgIik7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCQkiRmlsZXMgZXhwZWN0ZWQgYnV0IG5vdCBpbiB3b3Jrc3BhY2U6ICIgKyBmaWxlc05vdEltcG9ydGVkLnRvU3RyaW5nKCksIAotCQkJCWZpbGVzTm90SW1wb3J0ZWQubGVuZ3RoKCkgPT0gMCk7CQotCX0KLQkKLQkvKioKLQkgKiBDb3BpZXMgdGhlIGRhdGEgdG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBuZXcgbG9jYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYXRpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjb3B5RGF0YUxvY2F0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFBsdWdpbiBwbHVnaW4gPSBUZXN0UGx1Z2luLmdldERlZmF1bHQoKTsKLSAgICAgICAgaWYgKHBsdWdpbiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRlc3RQbHVnaW4gZGVmYXVsdCByZWZlcmVuY2UgaXMgbnVsbCIpOwotICAgICAgICAKLSAgICAgICAgVVJMIGZ1bGxQYXRoU3RyaW5nID0gcGx1Z2luLmdldERlc2NyaXB0b3IoKS5maW5kKAotCQkJCW5ldyBQYXRoKFdTX0RBVEFfUFJFRklYKS5hcHBlbmQoV1NfREFUQV9MT0NBVElPTiArICIuemlwIikpOwotICAgICAgICAKLSAgICAgICAgaWYgKGZ1bGxQYXRoU3RyaW5nID09IG51bGwpIAotICAgICAgICAJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAKLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZ1bGxQYXRoU3RyaW5nLmdldFBhdGgoKSk7Ci0KLSAgICAgICAgRmlsZSBvcmlnaW4gPSBwYXRoLnRvRmlsZSgpOwotICAgICAgICBpZiAoIW9yaWdpbi5leGlzdHMoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIFppcEZpbGUgekZpbGUgPSBuZXcgWmlwRmlsZShvcmlnaW4pOyAgICAgICAgCi0JCQotCQlGaWxlIGRlc3RpbmF0aW9uID0gbmV3IEZpbGUoRmlsZVN5c3RlbUhlbHBlci5nZXRSYW5kb21Mb2NhdGlvbihGaWxlU3lzdGVtSGVscGVyLmdldFRlbXBEaXIoKSkudG9PU1N0cmluZygpKTsKLQkJRmlsZVRvb2wudW56aXAoekZpbGUsIGRlc3RpbmF0aW9uKTsKLQkJcmV0dXJuIGRlc3RpbmF0aW9uLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQkKLQlwcml2YXRlIFdpemFyZFByb2plY3RzSW1wb3J0UGFnZSBnZXROZXdXaXphcmQoKXsKLQkJSW1wb3J0RXhwb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBJbXBvcnRFeHBvcnRXaXphcmQoSW1wb3J0RXhwb3J0V2l6YXJkLklNUE9SVCk7Ci0JCXdpemFyZC5pbml0KGdldFdvcmtiZW5jaCgpLCBudWxsKTsKLQkJSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotCQkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLQkJLmdldFNlY3Rpb24oIkltcG9ydEV4cG9ydFRlc3RzIik7Ci0JCWlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotCQkJd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotCQkJLmFkZE5ld1NlY3Rpb24oIkltcG9ydEV4cG9ydFRlc3RzIik7Ci0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0JCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JCQotCQlXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2Ugd3BpcCA9IG5ldyBXaXphcmRQcm9qZWN0c0ltcG9ydFBhZ2UoKTsKLQkJCi0JCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoCi0JCQkJTWF0aC5tYXgoMTAwLCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0JCQkJMTAwKTsKLQotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwkJCi0JCXdwaXAuc2V0V2l6YXJkKGRpYWxvZy5nZXRDdXJyZW50UGFnZSgpLmdldFdpemFyZCgpKTsKLQkJd3BpcC5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCXJldHVybiB3cGlwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL0ltcG9ydEV4cG9ydFdpemFyZHNDYXRlZ29yeVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9JbXBvcnRFeHBvcnRXaXphcmRzQ2F0ZWdvcnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGYzZDJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL0ltcG9ydEV4cG9ydFdpemFyZHNDYXRlZ29yeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuV2l6YXJkc1JlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZERlc2NyaXB0b3I7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRFeHBvcnRXaXphcmRzQ2F0ZWdvcnlUZXN0cyBleHRlbmRzIFVJVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBXSVpBUkRfSURfSU1QT1JUX05PX0NBVEVHT1JZID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmltcG9ydC5Ob0NhdGVnb3J5IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgV0laQVJEX0lEX0lNUE9SVF9JTlZBTElEX0NBVEVHT1JZID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmltcG9ydC5JbnZhbGlkQ2F0ZWdvcnkiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBXSVpBUkRfSU1QT1JUX05FV19DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0SW1wb3J0IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgV0laQVJEX0lEX0lNUE9SVF9ORVdfQ0FURUdPUlkgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuaW1wb3J0Lk5ld0NhdGVnb3J5IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgV0laQVJEX0lNUE9SVF9ORVdfUEFSRU5URURfQ0FURUdPUlkgPSAib3JnLmVjbGlwc2UudWkuQmFzaWMvb3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdEltcG9ydFBhcmVudGVkIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgV0laQVJEX0lEX0lNUE9SVF9QQVJFTlRFRF9DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbXBvcnQuTmV3UGFyZW50ZWRDYXRlZ29yeSI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFdJWkFSRF9JTVBPUlRfRFVQTElDQVRFX0NBVEVHT1JZID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RJbXBvcnREdXAiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBXSVpBUkRfSURfSU1QT1JUX0RVUExJQ0FURV9DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbXBvcnQuRHVwbGljYXRlQ2F0ZWdvcnkiOwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBXSVpBUkRfSURfRVhQT1JUX05PX0NBVEVHT1JZID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmV4cG9ydC5Ob0NhdGVnb3J5IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgV0laQVJEX0lEX0VYUE9SVF9JTlZBTElEX0NBVEVHT1JZID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmV4cG9ydC5JbnZhbGlkQ2F0ZWdvcnkiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBXSVpBUkRfRVhQT1JUX05FV19DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0RXhwb3J0IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgV0laQVJEX0lEX0VYUE9SVF9ORVdfQ0FURUdPUlkgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuZXhwb3J0Lk5ld0NhdGVnb3J5IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgV0laQVJEX0VYUE9SVF9ORVdfUEFSRU5URURfQ0FURUdPUlkgPSAib3JnLmVjbGlwc2UudWkuQmFzaWMvb3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdEV4cG9ydFBhcmVudGVkIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgV0laQVJEX0lEX0VYUE9SVF9QQVJFTlRFRF9DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5leHBvcnQuTmV3UGFyZW50ZWRDYXRlZ29yeSI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFdJWkFSRF9FWFBPUlRfRFVQTElDQVRFX0NBVEVHT1JZID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RFeHBvcnREdXAiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBXSVpBUkRfSURfRVhQT1JUX0RVUExJQ0FURV9DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5leHBvcnQuRHVwbGljYXRlQ2F0ZWdvcnkiOwotCQotCUlXaXphcmRDYXRlZ29yeSBleHBvcnRSb290OwkKLQlJV2l6YXJkQ2F0ZWdvcnkgaW1wb3J0Um9vdDsKLQkKLQlwdWJsaWMgSW1wb3J0RXhwb3J0V2l6YXJkc0NhdGVnb3J5VGVzdHMoU3RyaW5nIHRlc3ROYW1lKXsKLQkJc3VwZXIodGVzdE5hbWUpOwotCQlleHBvcnRSb290ID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEV4cG9ydFdpemFyZFJlZ2lzdHJ5KCkuZ2V0Um9vdENhdGVnb3J5KCk7Ci0JCWltcG9ydFJvb3QgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1wb3J0V2l6YXJkUmVnaXN0cnkoKS5nZXRSb290Q2F0ZWdvcnkoKTsKLQl9Ci0KLQkvKiBJbXBvcnQgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0Tm9DYXRlZ29yeVByb3ZpZGVkKCl7Ci0JCUlXaXphcmRDYXRlZ29yeSBvdGhlckNhdGVnb3J5ID0gaW1wb3J0Um9vdC5maW5kQ2F0ZWdvcnkobmV3IFBhdGgoCi0JCQkJV2l6YXJkc1JlZ2lzdHJ5UmVhZGVyLlVOQ0FURUdPUklaRURfV0laQVJEX0NBVEVHT1JZKSk7Ci0JCWlmIChvdGhlckNhdGVnb3J5ICE9IG51bGwpewotCQkJSVdpemFyZERlc2NyaXB0b3Igd2l6YXJkRGVzYyA9IAotCQkJCW90aGVyQ2F0ZWdvcnkuZmluZFdpemFyZChXSVpBUkRfSURfSU1QT1JUX05PX0NBVEVHT1JZKTsKLQkJCWFzc2VydFRydWUoCi0JCQkJIkNvdWxkIG5vdCBmaW5kIHdpemFyZCB3aXRoIGlkIiArIFdJWkFSRF9JRF9JTVBPUlRfTk9fQ0FURUdPUlkrICJpbiBPdGhlciBjYXRlZ29yeS4iLCAKLQkJCQl3aXphcmREZXNjICE9IG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIE90aGVyIGNhdGVnb3J5IiwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0Q2F0ZWdvcnlEb2VzTm90RXhpc3QoKXsKLQkJSVdpemFyZENhdGVnb3J5IG90aGVyQ2F0ZWdvcnkgPSBpbXBvcnRSb290LmZpbmRDYXRlZ29yeShuZXcgUGF0aCgKLQkJCQlXaXphcmRzUmVnaXN0cnlSZWFkZXIuVU5DQVRFR09SSVpFRF9XSVpBUkRfQ0FURUdPUlkpKTsKLQkJaWYgKG90aGVyQ2F0ZWdvcnkgIT0gbnVsbCl7Ci0JCQlJV2l6YXJkRGVzY3JpcHRvciB3aXphcmREZXNjID0gCi0JCQkJb3RoZXJDYXRlZ29yeS5maW5kV2l6YXJkKFdJWkFSRF9JRF9JTVBPUlRfSU5WQUxJRF9DQVRFR09SWSk7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCSJDb3VsZCBub3QgZmluZCB3aXphcmQgd2l0aCBpZCIgKyBXSVpBUkRfSURfSU1QT1JUX0lOVkFMSURfQ0FURUdPUlkrICJpbiBPdGhlciBjYXRlZ29yeS4iLCAKLQkJCQl3aXphcmREZXNjICE9IG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIE90aGVyIGNhdGVnb3J5IiwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0QWRkVG9OZXdDYXRlZ29yeSgpewotCQlJV2l6YXJkQ2F0ZWdvcnkgbmV3Q2F0ZWdvcnkgPSBpbXBvcnRSb290LmZpbmRDYXRlZ29yeSgKLQkJCQluZXcgUGF0aChXSVpBUkRfSU1QT1JUX05FV19DQVRFR09SWSkpOwotCQlpZiAobmV3Q2F0ZWdvcnkgIT0gbnVsbCl7Ci0JCQlJV2l6YXJkRGVzY3JpcHRvciB3aXphcmREZXNjID0gCi0JCQkJbmV3Q2F0ZWdvcnkuZmluZFdpemFyZChXSVpBUkRfSURfSU1QT1JUX05FV19DQVRFR09SWSk7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCSJDb3VsZCBub3QgZmluZCB3aXphcmQgd2l0aCBpZCIgKyBXSVpBUkRfSURfSU1QT1JUX05FV19DQVRFR09SWSsgImluIGNhdGVnb3J5ICIgKyBXSVpBUkRfSU1QT1JUX05FV19DQVRFR09SWSwgCi0JCQkJd2l6YXJkRGVzYyAhPSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBjYXRlZ29yeSBuYW1lZCAiICsgV0laQVJEX0lNUE9SVF9ORVdfQ0FURUdPUlksIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEltcG9ydEFkZFRvUGFyZW50ZWRDYXRlZ29yeSgpewotCQlJV2l6YXJkQ2F0ZWdvcnkgbmV3Q2F0ZWdvcnkgPSBpbXBvcnRSb290LmZpbmRDYXRlZ29yeSgKLQkJCQluZXcgUGF0aChXSVpBUkRfSU1QT1JUX05FV19QQVJFTlRFRF9DQVRFR09SWSkpOwotCQlpZiAobmV3Q2F0ZWdvcnkgIT0gbnVsbCl7Ci0JCQlJV2l6YXJkRGVzY3JpcHRvciB3aXphcmREZXNjID0gCi0JCQkJbmV3Q2F0ZWdvcnkuZmluZFdpemFyZChXSVpBUkRfSURfSU1QT1JUX1BBUkVOVEVEX0NBVEVHT1JZKTsKLQkJCWFzc2VydFRydWUoCi0JCQkJIkNvdWxkIG5vdCBmaW5kIHdpemFyZCB3aXRoIGlkIiArIFdJWkFSRF9JRF9JTVBPUlRfUEFSRU5URURfQ0FURUdPUlkrICJpbiBjYXRlZ29yeSAiICsgV0laQVJEX0lNUE9SVF9ORVdfUEFSRU5URURfQ0FURUdPUlksIAotCQkJCXdpemFyZERlc2MgIT0gbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgY2F0ZWdvcnkgbmFtZWQgIiArIFdJWkFSRF9JTVBPUlRfTkVXX1BBUkVOVEVEX0NBVEVHT1JZLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnREdXBsaWNhdGVDYXRlZ29yeSgpewotCQlJV2l6YXJkQ2F0ZWdvcnkgbmV3Q2F0ZWdvcnkgPSBpbXBvcnRSb290LmZpbmRDYXRlZ29yeSgKLQkJCQluZXcgUGF0aChXSVpBUkRfSU1QT1JUX0RVUExJQ0FURV9DQVRFR09SWSkpOwotCQlpZiAobmV3Q2F0ZWdvcnkgIT0gbnVsbCl7Ci0JCQlJV2l6YXJkRGVzY3JpcHRvciB3aXphcmREZXNjID0gCi0JCQkJbmV3Q2F0ZWdvcnkuZmluZFdpemFyZChXSVpBUkRfSURfSU1QT1JUX0RVUExJQ0FURV9DQVRFR09SWSk7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCSJDb3VsZCBub3QgZmluZCB3aXphcmQgd2l0aCBpZCIgKyBXSVpBUkRfSURfSU1QT1JUX0RVUExJQ0FURV9DQVRFR09SWSsgImluIGNhdGVnb3J5ICIgKyBXSVpBUkRfSU1QT1JUX0RVUExJQ0FURV9DQVRFR09SWSwgCi0JCQkJd2l6YXJkRGVzYyAhPSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBjYXRlZ29yeSBuYW1lZCAiICsgV0laQVJEX0lNUE9SVF9EVVBMSUNBVEVfQ0FURUdPUlksIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEltcG9ydFVzaW5nRXhwb3J0Q2F0ZWdvcnkoKXsKLQkJSVdpemFyZENhdGVnb3J5IGNhdGVnb3J5ID0gaW1wb3J0Um9vdC5maW5kQ2F0ZWdvcnkoCi0JCQkJbmV3IFBhdGgoV0laQVJEX0VYUE9SVF9ORVdfQ0FURUdPUlkpKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCQkiSW1wb3J0IHdpemFyZHMgc2hvdWxkIG5vdCBoYXZlIGNhdGVnb3J5IG5hbWVkICIgKyBXSVpBUkRfRVhQT1JUX05FV19DQVRFR09SWSwgCi0JCQkJY2F0ZWdvcnkgPT0gbnVsbCk7Ci0JfQkKLQkKLQkvKiBFeHBvcnQgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0Tm9DYXRlZ29yeVByb3ZpZGVkKCl7Ci0JCUlXaXphcmRDYXRlZ29yeSBvdGhlckNhdGVnb3J5ID0gZXhwb3J0Um9vdC5maW5kQ2F0ZWdvcnkobmV3IFBhdGgoCi0JCQkJV2l6YXJkc1JlZ2lzdHJ5UmVhZGVyLlVOQ0FURUdPUklaRURfV0laQVJEX0NBVEVHT1JZKSk7Ci0JCWlmIChvdGhlckNhdGVnb3J5ICE9IG51bGwpewotCQkJSVdpemFyZERlc2NyaXB0b3Igd2l6YXJkRGVzYyA9IAotCQkJCW90aGVyQ2F0ZWdvcnkuZmluZFdpemFyZChXSVpBUkRfSURfRVhQT1JUX05PX0NBVEVHT1JZKTsKLQkJCWFzc2VydFRydWUoCi0JCQkJIkNvdWxkIG5vdCBmaW5kIHdpemFyZCB3aXRoIGlkIiArIFdJWkFSRF9JRF9FWFBPUlRfTk9fQ0FURUdPUlkrICJpbiBPdGhlciBjYXRlZ29yeS4iLCAKLQkJCQl3aXphcmREZXNjICE9IG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIE90aGVyIGNhdGVnb3J5IiwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0Q2F0ZWdvcnlEb2VzTm90RXhpc3QoKXsKLQkJSVdpemFyZENhdGVnb3J5IG90aGVyQ2F0ZWdvcnkgPSBleHBvcnRSb290LmZpbmRDYXRlZ29yeShuZXcgUGF0aCgKLQkJCQlXaXphcmRzUmVnaXN0cnlSZWFkZXIuVU5DQVRFR09SSVpFRF9XSVpBUkRfQ0FURUdPUlkpKTsKLQkJaWYgKG90aGVyQ2F0ZWdvcnkgIT0gbnVsbCl7Ci0JCQlJV2l6YXJkRGVzY3JpcHRvciB3aXphcmREZXNjID0gCi0JCQkJb3RoZXJDYXRlZ29yeS5maW5kV2l6YXJkKFdJWkFSRF9JRF9FWFBPUlRfSU5WQUxJRF9DQVRFR09SWSk7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCSJDb3VsZCBub3QgZmluZCB3aXphcmQgd2l0aCBpZCIgKyBXSVpBUkRfSURfRVhQT1JUX0lOVkFMSURfQ0FURUdPUlkrICJpbiBPdGhlciBjYXRlZ29yeS4iLCAKLQkJCQl3aXphcmREZXNjICE9IG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIE90aGVyIGNhdGVnb3J5IiwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0QWRkVG9OZXdDYXRlZ29yeSgpewotCQlJV2l6YXJkQ2F0ZWdvcnkgbmV3Q2F0ZWdvcnkgPSBleHBvcnRSb290LmZpbmRDYXRlZ29yeSgKLQkJCQluZXcgUGF0aChXSVpBUkRfRVhQT1JUX05FV19DQVRFR09SWSkpOwotCQlpZiAobmV3Q2F0ZWdvcnkgIT0gbnVsbCl7Ci0JCQlJV2l6YXJkRGVzY3JpcHRvciB3aXphcmREZXNjID0gCi0JCQkJbmV3Q2F0ZWdvcnkuZmluZFdpemFyZChXSVpBUkRfSURfRVhQT1JUX05FV19DQVRFR09SWSk7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCSJDb3VsZCBub3QgZmluZCB3aXphcmQgd2l0aCBpZCIgKyBXSVpBUkRfSURfRVhQT1JUX05FV19DQVRFR09SWSsgImluIGNhdGVnb3J5ICIgKyBXSVpBUkRfRVhQT1JUX05FV19DQVRFR09SWSwgCi0JCQkJd2l6YXJkRGVzYyAhPSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBjYXRlZ29yeSBuYW1lZCAiICsgV0laQVJEX0VYUE9SVF9ORVdfQ0FURUdPUlksIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEV4cG9ydEFkZFRvUGFyZW50ZWRDYXRlZ29yeSgpewotCQlJV2l6YXJkQ2F0ZWdvcnkgbmV3Q2F0ZWdvcnkgPSBleHBvcnRSb290LmZpbmRDYXRlZ29yeSgKLQkJCQluZXcgUGF0aChXSVpBUkRfRVhQT1JUX05FV19QQVJFTlRFRF9DQVRFR09SWSkpOwotCQlpZiAobmV3Q2F0ZWdvcnkgIT0gbnVsbCl7Ci0JCQlJV2l6YXJkRGVzY3JpcHRvciB3aXphcmREZXNjID0gCi0JCQkJbmV3Q2F0ZWdvcnkuZmluZFdpemFyZChXSVpBUkRfSURfRVhQT1JUX1BBUkVOVEVEX0NBVEVHT1JZKTsKLQkJCWFzc2VydFRydWUoCi0JCQkJIkNvdWxkIG5vdCBmaW5kIHdpemFyZCB3aXRoIGlkIiArIFdJWkFSRF9JRF9FWFBPUlRfUEFSRU5URURfQ0FURUdPUlkrICJpbiBjYXRlZ29yeSAiICsgV0laQVJEX0VYUE9SVF9ORVdfUEFSRU5URURfQ0FURUdPUlksIAotCQkJCXdpemFyZERlc2MgIT0gbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgY2F0ZWdvcnkgbmFtZWQgIiArIFdJWkFSRF9FWFBPUlRfTkVXX1BBUkVOVEVEX0NBVEVHT1JZLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnREdXBsaWNhdGVDYXRlZ29yeSgpewotCQlJV2l6YXJkQ2F0ZWdvcnkgbmV3Q2F0ZWdvcnkgPSBleHBvcnRSb290LmZpbmRDYXRlZ29yeSgKLQkJCQluZXcgUGF0aChXSVpBUkRfRVhQT1JUX0RVUExJQ0FURV9DQVRFR09SWSkpOwotCQlpZiAobmV3Q2F0ZWdvcnkgIT0gbnVsbCl7Ci0JCQlJV2l6YXJkRGVzY3JpcHRvciB3aXphcmREZXNjID0gCi0JCQkJbmV3Q2F0ZWdvcnkuZmluZFdpemFyZChXSVpBUkRfSURfRVhQT1JUX0RVUExJQ0FURV9DQVRFR09SWSk7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCSJDb3VsZCBub3QgZmluZCB3aXphcmQgd2l0aCBpZCIgKyBXSVpBUkRfSURfRVhQT1JUX0RVUExJQ0FURV9DQVRFR09SWSsgImluIGNhdGVnb3J5ICIgKyBXSVpBUkRfRVhQT1JUX0RVUExJQ0FURV9DQVRFR09SWSwgCi0JCQkJd2l6YXJkRGVzYyAhPSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBjYXRlZ29yeSBuYW1lZCAiICsgV0laQVJEX0VYUE9SVF9EVVBMSUNBVEVfQ0FURUdPUlksIGZhbHNlKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnRVc2luZ0ltcG9ydENhdGVnb3J5KCl7Ci0JCUlXaXphcmRDYXRlZ29yeSBjYXRlZ29yeSA9IGV4cG9ydFJvb3QuZmluZENhdGVnb3J5KAotCQkJCW5ldyBQYXRoKFdJWkFSRF9JTVBPUlRfTkVXX0NBVEVHT1JZKSk7Ci0JCWFzc2VydFRydWUoCi0JCQkJIkV4cG9ydCB3aXphcmRzIHNob3VsZCBub3QgaGF2ZSBjYXRlZ29yeSBuYW1lZCAiICsgV0laQVJEX0lNUE9SVF9ORVdfQ0FURUdPUlksIAotCQkJCWNhdGVnb3J5ID09IG51bGwpOwotCX0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9JbXBvcnRPcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9JbXBvcnRPcGVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0M2MxMjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kYXRhdHJhbnNmZXIvSW1wb3J0T3BlcmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JT3ZlcndyaXRlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JbXBvcnRPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRPcGVyYXRpb25UZXN0IGV4dGVuZHMgRGF0YVRyYW5zZmVyVGVzdENhc2UgaW1wbGVtZW50cyBJT3ZlcndyaXRlUXVlcnkgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxEaXJlY3Rvcnk7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGRpcmVjdG9yeU5hbWVzID0geyAiZGlyMSIsICJkaXIyIiB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBmaWxlTmFtZXMgPSB7ICJmaWxlMS50eHQiLCAiZmlsZTIudHh0IiB9OwotCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0gICAgcHVibGljIEltcG9ydE9wZXJhdGlvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU3ViRGlyZWN0b3J5KFN0cmluZyBwYXJlbnROYW1lLCBTdHJpbmcgbmV3RGlyTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuZXdEaXJQYXRoID0gcGFyZW50TmFtZSArIEZpbGUuc2VwYXJhdG9yQ2hhciArIG5ld0Rpck5hbWU7Ci0gICAgICAgIEZpbGUgbmV3RGlyID0gbmV3IEZpbGUobmV3RGlyUGF0aCk7Ci0gICAgICAgIG5ld0Rpci5ta2RpcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdG9yeU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjcmVhdGVGaWxlKG5ld0RpclBhdGgsIGZpbGVOYW1lc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRmlsZShTdHJpbmcgcGFyZW50TmFtZSwgU3RyaW5nIGZpbGVQYXRoKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5ld0ZpbGVQYXRoID0gcGFyZW50TmFtZSArIEZpbGUuc2VwYXJhdG9yQ2hhciArIGZpbGVQYXRoOwotICAgICAgICBGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShuZXdGaWxlUGF0aCk7Ci0gICAgICAgIG5ld0ZpbGUuY3JlYXRlTmV3RmlsZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJT3ZlcndyaXRlUXVlcnkjcXVlcnlPdmVyd3JpdGUoU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgcXVlcnlPdmVyd3JpdGUoU3RyaW5nIHBhdGhTdHJpbmcpIHsKLSAgICAgICAgLy9BbHdheXMgcmV0dXJuIGFuIGVtcHR5IFN0cmluZyAtIHdlIGFyZW4ndAotICAgICAgICAvL2RvaW5nIGFueXRoaW5nIGludGVyZXN0aW5nCi0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gQ2xhc3MKLSAgICAgICAgICAgICAgICAuZm9yTmFtZSgib3JnLmVjbGlwc2UudWkudGVzdHMuZGF0YXRyYW5zZmVyLkltcG9ydE9wZXJhdGlvblRlc3QiKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gdGVzdENsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oInRlc3RzLmluaSIpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wZXJ0aWVzLmxvYWQoc3RyZWFtKTsKLSAgICAgICAgbG9jYWxEaXJlY3RvcnkgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJsb2NhbFNvdXJjZSIpOwotICAgICAgICBzZXRVcERpcmVjdG9yeSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB1cCB0aGUgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIHVzZWQgZm9yIHRoZSB0ZXN0LgotICAgICAqLwotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFVwRGlyZWN0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSByb290RGlyZWN0b3J5ID0gbmV3IEZpbGUobG9jYWxEaXJlY3RvcnkpOwotICAgICAgICByb290RGlyZWN0b3J5Lm1rZGlyKCk7Ci0gICAgICAgIGxvY2FsRGlyZWN0b3J5ID0gcm9vdERpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3RvcnlOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY3JlYXRlU3ViRGlyZWN0b3J5KGxvY2FsRGlyZWN0b3J5LCBkaXJlY3RvcnlOYW1lc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWFyIGRvd24uIERlbGV0ZSB0aGUgcHJvamVjdCB3ZSBjcmVhdGVkIGFuZCBhbGwgb2YgdGhlCi0gICAgICogZmlsZXMgb24gdGhlIGZpbGUgc3lzdGVtLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9UZWFyRG93bigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgICAgICBGaWxlIHRvcERpcmVjdG9yeSA9IG5ldyBGaWxlKGxvY2FsRGlyZWN0b3J5KTsKLSAgICAgICAgICAgIGRlbGV0ZURpcmVjdG9yeSh0b3BEaXJlY3RvcnkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdGF0dXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvamVjdCA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIkltcG9ydEdldFN0YXR1cyIpOwotICAgICAgICBGaWxlIGVsZW1lbnQgPSBuZXcgRmlsZShsb2NhbERpcmVjdG9yeSk7Ci0gICAgICAgIExpc3QgaW1wb3J0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGltcG9ydEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLSAgICAgICAgSW1wb3J0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBJbXBvcnRPcGVyYXRpb24ocHJvamVjdC5nZXRGdWxsUGF0aCgpLAotICAgICAgICAgICAgICAgIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSwgdGhpcywgaW1wb3J0RWxlbWVudHMpOwotCi0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJU3RhdHVzLk9LKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0TGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwcm9qZWN0ID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgiSW1wb3J0TGlzdCIpOwotICAgICAgICBGaWxlIGVsZW1lbnQgPSBuZXcgRmlsZShsb2NhbERpcmVjdG9yeSk7Ci0gICAgICAgIExpc3QgaW1wb3J0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGltcG9ydEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLSAgICAgICAgSW1wb3J0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBJbXBvcnRPcGVyYXRpb24ocHJvamVjdC5nZXRGdWxsUGF0aCgpLAotICAgICAgICAgICAgICAgIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSwgdGhpcywgaW1wb3J0RWxlbWVudHMpOwotICAgICAgICBvcGVuVGVzdFdpbmRvdygpLnJ1bih0cnVlLCB0cnVlLCBvcGVyYXRpb24pOwotCi0gICAgICAgIHZlcmlmeUZpbGVzKGRpcmVjdG9yeU5hbWVzLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltcG9ydFNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwcm9qZWN0ID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgiSW1wb3J0U291cmNlIik7Ci0gICAgICAgIEltcG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgSW1wb3J0T3BlcmF0aW9uKHByb2plY3QuZ2V0RnVsbFBhdGgoKSwKLSAgICAgICAgICAgICAgICBuZXcgRmlsZShsb2NhbERpcmVjdG9yeSksIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSwKLSAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICAgICAgb3BlblRlc3RXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgdmVyaWZ5RmlsZXMoZGlyZWN0b3J5TmFtZXMubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0U291cmNlTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwcm9qZWN0ID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgiSW1wb3J0U291cmNlTGlzdCIpOwotICAgICAgICBGaWxlIGVsZW1lbnQgPSBuZXcgRmlsZShsb2NhbERpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgKyBkaXJlY3RvcnlOYW1lc1swXSk7Ci0gICAgICAgIExpc3QgaW1wb3J0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGltcG9ydEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLSAgICAgICAgSW1wb3J0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBJbXBvcnRPcGVyYXRpb24ocHJvamVjdC5nZXRGdWxsUGF0aCgpLAotICAgICAgICAgICAgICAgIG5ldyBGaWxlKGxvY2FsRGlyZWN0b3J5KSwgRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFLAotICAgICAgICAgICAgICAgIHRoaXMsIGltcG9ydEVsZW1lbnRzKTsKLSAgICAgICAgb3BlblRlc3RXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgdmVyaWZ5RmlsZXMoaW1wb3J0RWxlbWVudHMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udGV4dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwcm9qZWN0ID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgiSW1wb3J0U2V0Q29udGV4dCIpOwotICAgICAgICBGaWxlIGVsZW1lbnQgPSBuZXcgRmlsZShsb2NhbERpcmVjdG9yeSk7Ci0gICAgICAgIExpc3QgaW1wb3J0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGltcG9ydEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLSAgICAgICAgSW1wb3J0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBJbXBvcnRPcGVyYXRpb24ocHJvamVjdC5nZXRGdWxsUGF0aCgpLAotICAgICAgICAgICAgICAgIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSwgdGhpcywgaW1wb3J0RWxlbWVudHMpOwotCi0gICAgICAgIG9wZXJhdGlvbi5zZXRDb250ZXh0KG51bGwpOwotICAgICAgICBvcGVyYXRpb24uc2V0Q29udGV4dChvcGVuVGVzdFdpbmRvdygpLmdldFNoZWxsKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvamVjdCA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIkltcG9ydFNldENyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZSIpOwotICAgICAgICBGaWxlIGVsZW1lbnQgPSBuZXcgRmlsZShsb2NhbERpcmVjdG9yeSk7Ci0gICAgICAgIExpc3QgaW1wb3J0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGltcG9ydEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLSAgICAgICAgSW1wb3J0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBJbXBvcnRPcGVyYXRpb24ocHJvamVjdC5nZXRGdWxsUGF0aCgpLAotICAgICAgICAgICAgICAgIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSwgdGhpcywgaW1wb3J0RWxlbWVudHMpOwotCi0gICAgICAgIG9wZXJhdGlvbi5zZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmUoZmFsc2UpOwotICAgICAgICBvcGVuVGVzdFdpbmRvdygpLnJ1bih0cnVlLCB0cnVlLCBvcGVyYXRpb24pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYWxEaXJlY3RvcnkpOwotICAgICAgICAgICAgSVJlc291cmNlIHRhcmdldEZvbGRlciA9IHByb2plY3QuZmluZE1lbWJlcihwYXRoLmxhc3RTZWdtZW50KCkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJJbXBvcnQgZmFpbGVkIiwgdGFyZ2V0Rm9sZGVyIGluc3RhbmNlb2YgSUNvbnRhaW5lcik7Ci0KLSAgICAgICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9ICgoSUNvbnRhaW5lcikgdGFyZ2V0Rm9sZGVyKS5tZW1iZXJzKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkltcG9ydCBmYWlsZWQgdG8gaW1wb3J0IGFsbCBkaXJlY3RvcmllcyIsCi0gICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeU5hbWVzLmxlbmd0aCwgcmVzb3VyY2VzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkltcG9ydCBmYWlsZWQiLCByZXNvdXJjZXNbaV0gaW5zdGFuY2VvZiBJQ29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICB2ZXJpZnlGb2xkZXIoKElDb250YWluZXIpIHJlc291cmNlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEZpbGVzVG9JbXBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvamVjdCA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIkltcG9ydFNldEZpbGVzVG9JbXBvcnQiKTsKLSAgICAgICAgRmlsZSBlbGVtZW50ID0gbmV3IEZpbGUobG9jYWxEaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvcgotICAgICAgICAgICAgICAgICsgZGlyZWN0b3J5TmFtZXNbMF0pOwotICAgICAgICBJbXBvcnRPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEltcG9ydE9wZXJhdGlvbihwcm9qZWN0LmdldEZ1bGxQYXRoKCksCi0gICAgICAgICAgICAgICAgbmV3IEZpbGUobG9jYWxEaXJlY3RvcnkpLCBGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIuSU5TVEFOQ0UsCi0gICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgICAgIExpc3QgaW1wb3J0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGltcG9ydEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLSAgICAgICAgb3BlcmF0aW9uLnNldEZpbGVzVG9JbXBvcnQoaW1wb3J0RWxlbWVudHMpOwotICAgICAgICBvcGVuVGVzdFdpbmRvdygpLnJ1bih0cnVlLCB0cnVlLCBvcGVyYXRpb24pOwotICAgICAgICB2ZXJpZnlGaWxlcyhpbXBvcnRFbGVtZW50cy5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRPdmVyd3JpdGVSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvamVjdCA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIkltcG9ydFNldE92ZXJ3cml0ZVJlc291cmNlcyIpOwotICAgICAgICBGaWxlIGVsZW1lbnQgPSBuZXcgRmlsZShsb2NhbERpcmVjdG9yeSk7Ci0gICAgICAgIExpc3QgaW1wb3J0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGltcG9ydEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLSAgICAgICAgSW1wb3J0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBJbXBvcnRPcGVyYXRpb24ocHJvamVjdC5nZXRGdWxsUGF0aCgpLAotICAgICAgICAgICAgICAgIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSwgdGhpcywgaW1wb3J0RWxlbWVudHMpOwotCi0gICAgICAgIG9wZW5UZXN0V2luZG93KCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRPdmVyd3JpdGVSZXNvdXJjZXModHJ1ZSk7Ci0gICAgICAgIG9wZW5UZXN0V2luZG93KCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCBhbGwgZmlsZXMgd2VyZSBpbXBvcnRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9sZGVyQ291bnQgbnVtYmVyIG9mIGZvbGRlcnMgdGhhdCB3ZXJlIGltcG9ydGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUZpbGVzKGludCBmb2xkZXJDb3VudCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2FsRGlyZWN0b3J5KTsKLSAgICAgICAgICAgIElSZXNvdXJjZSB0YXJnZXRGb2xkZXIgPSBwcm9qZWN0LmZpbmRNZW1iZXIocGF0aC5tYWtlUmVsYXRpdmUoKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIkltcG9ydCBmYWlsZWQiLCB0YXJnZXRGb2xkZXIgaW5zdGFuY2VvZiBJQ29udGFpbmVyKTsKLQotICAgICAgICAgICAgSVJlc291cmNlW10gcmVzb3VyY2VzID0gKChJQ29udGFpbmVyKSB0YXJnZXRGb2xkZXIpLm1lbWJlcnMoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW1wb3J0IGZhaWxlZCB0byBpbXBvcnQgYWxsIGRpcmVjdG9yaWVzIiwKLSAgICAgICAgICAgICAgICAgICAgZm9sZGVyQ291bnQsIHJlc291cmNlcy5sZW5ndGgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbXBvcnQgZmFpbGVkIiwgcmVzb3VyY2VzW2ldIGluc3RhbmNlb2YgSUNvbnRhaW5lcik7Ci0gICAgICAgICAgICAgICAgdmVyaWZ5Rm9sZGVyKChJQ29udGFpbmVyKSByZXNvdXJjZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHRoYXQgYWxsIGZpbGVzIHdlcmUgaW1wb3J0ZWQgaW50byB0aGUgc3BlY2lmaWVkIGZvbGRlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Rm9sZGVyKElDb250YWluZXIgZm9sZGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2VbXSBmaWxlcyA9IGZvbGRlci5tZW1iZXJzKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkltcG9ydCBmYWlsZWQgdG8gaW1wb3J0IGFsbCBmaWxlcyIsIGZpbGVOYW1lcy5sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpbGVOYW1lcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGVOYW1lc1tqXTsKLSAgICAgICAgICAgICAgICBpbnQgazsKLSAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZmlsZXMubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmVxdWFscyhmaWxlc1trXS5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkltcG9ydCBmYWlsZWQgdG8gaW1wb3J0IGZpbGUgIiArIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgayA8IGZpbGVOYW1lcy5sZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL1Rlc3RFeHBvcnRXaXphcmQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL1Rlc3RFeHBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2ZDQyZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9UZXN0RXhwb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RXhwb3J0V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUV4cG9ydFdpemFyZCB7Ci0KLQlwdWJsaWMgVGVzdEV4cG9ydFdpemFyZCgpewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9UZXN0SW1wb3J0V2l6YXJkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RhdGF0cmFuc2Zlci9UZXN0SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YTE5YmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kYXRhdHJhbnNmZXIvVGVzdEltcG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi1wdWJsaWMgY2xhc3MgVGVzdEltcG9ydFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JcHVibGljIFRlc3RJbXBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kYXRhdHJhbnNmZXIvdGVzdHMuaW5pIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kYXRhdHJhbnNmZXIvdGVzdHMuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTY3OTViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGF0YXRyYW5zZmVyL3Rlc3RzLmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotbG9jYWxTb3VyY2U9SW1wb3J0VGVzdFNvdXJjZQotYXJjaGl2ZVNvdXJjZT1BcmNoaXZlVGVzdFNvdXJjZQotYnVnMTE1ODAwU291cmNlPUZpbGVBdFJvb3RUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvQmFja2dyb3VuZENvbG9yRGVjb3JhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvQmFja2dyb3VuZENvbG9yRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzM4NWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0JhY2tncm91bmRDb2xvckRlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBCYWNrZ3JvdW5kQ29sb3JEZWNvcmF0b3IgaXMgYSB0ZXN0IGZvciBiYWNrZ3JvdW5kIGNvbG9yaW5nIG9mIHRoZQotICogbmF2aWdhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgQmFja2dyb3VuZENvbG9yRGVjb3JhdG9yIGltcGxlbWVudHMgSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuYmFja2dyb3VuZERlY29yYXRvciI7Ci0KLQlwdWJsaWMgc3RhdGljIENvbG9yIGNvbG9yOwotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IjZGVjb3JhdGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZGVjb3JhdGUoT2JqZWN0IGVsZW1lbnQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLQotCQlpZihjb2xvciA9PSBudWxsKXsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJc2V0VXBDb2xvcigpOwotCi0JCQkJfQotCQkJfSk7Ci0KLQkJfQotCQlkZWNvcmF0aW9uLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENvbG9yKCl7Ci0JCWNvbG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0NZQU4pOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0RlY29yYXRvckFkYXB0YWJsZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yQWRhcHRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyZjU0Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yQWRhcHRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFwcGluZy5SZXNvdXJjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGVjb3JhdG9ycy5EZWNvcmF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRlY29yYXRvcnMuRGVjb3JhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kZWNvcmF0b3JzLkxpZ2h0d2VpZ2h0RGVjb3JhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51cy5PYmplY3RDb250cmlidXRpb25DbGFzc2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLm1lbnVzLk9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuSUNvbW1vbjsKLQotcHVibGljIGNsYXNzIERlY29yYXRvckFkYXB0YWJsZVRlc3RzIGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgRGVjb3JhdG9yQWRhcHRhYmxlVGVzdHMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERlY29yYXRvck1hbmFnZXIgZ2V0RGVjb3JhdG9yTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXREZWNvcmF0aW9uVGV4dEZvcihPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIERlY29yYXRvck1hbmFnZXIgZG0gPSBnZXREZWNvcmF0b3JNYW5hZ2VyKCk7Ci0gICAgICAgIExpZ2h0d2VpZ2h0RGVjb3JhdG9yTWFuYWdlciBsZG0gPSBkbS5nZXRMaWdodHdlaWdodE1hbmFnZXIoKTsKLSAgICAgICAgRGVjb3JhdGlvblJlc3VsdCByZXN1bHQgPSBsZG0uZ2V0RGVjb3JhdGlvblJlc3VsdChvYmplY3QpOwotICAgICAgICByZXR1cm4gcmVzdWx0LmRlY29yYXRlV2l0aFRleHQoIkRlZmF1bHQgbGFiZWwiKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydERlY29yYXRlZChTdHJpbmcgdGVzdFN1Yk5hbWUsIFN0cmluZ1tdIGV4cGVjdGVkU3VmZml4ZXMsIE9iamVjdFtdIGVsZW1lbnRzLCBDbGFzcyBhZGFwdGVkQ2xhc3MsIGJvb2xlYW4gc2hvdWxkSGF2ZU1hdGNoZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGVsZW1lbnRzW2ldOwotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBnZXREZWNvcmF0aW9uVGV4dEZvcihvYmplY3QpOwotICAgICAgICAgICAgYm9vbGVhbiBhbGxNYXRjaGVzRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZFN1ZmZpeGVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN1ZmZpeCA9IGV4cGVjdGVkU3VmZml4ZXNbal07Ci0gICAgICAgICAgICAgICAgaWYgKHRleHQuaW5kZXhPZihzdWZmaXgpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsbE1hdGNoZXNGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIkFkYXB0YWJsZSB0ZXN0ICIgKyB0ZXN0U3ViTmFtZSArICIgaGFzIGZhaWxlZCBmb3Igb2JqZWN0ICIgKyBvYmplY3QudG9TdHJpbmcoKSwgYWxsTWF0Y2hlc0ZvdW5kID09IHNob3VsZEhhdmVNYXRjaGVzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLnNldEVuYWJsZWQoVGVzdEFkYXB0YWJsZURlY29yYXRvckNvbnRyaWJ1dG9yLklELCB0cnVlKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuc2V0RW5hYmxlZChUZXN0VW5hZGFwdGFibGVEZWNvcmF0b3JDb250cmlidXRvci5JRCwgdHJ1ZSk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLnNldEVuYWJsZWQoVGVzdFJlc291cmNlRGVjb3JhdG9yQ29udHJpYnV0b3IuSUQsIHRydWUpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5zZXRFbmFibGVkKFRlc3RSZXNvdXJjZU1hcHBpbmdEZWNvcmF0b3JDb250cmlidXRvci5JRCwgdHJ1ZSk7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5zZXRFbmFibGVkKFRlc3RBZGFwdGFibGVEZWNvcmF0b3JDb250cmlidXRvci5JRCwgZmFsc2UpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5zZXRFbmFibGVkKFRlc3RVbmFkYXB0YWJsZURlY29yYXRvckNvbnRyaWJ1dG9yLklELCBmYWxzZSk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLnNldEVuYWJsZWQoVGVzdFJlc291cmNlRGVjb3JhdG9yQ29udHJpYnV0b3IuSUQsIGZhbHNlKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuc2V0RW5hYmxlZChUZXN0UmVzb3VyY2VNYXBwaW5nRGVjb3JhdG9yQ29udHJpYnV0b3IuSUQsIGZhbHNlKTsKLSAgICAgICAgc3VwZXIuZG9UZWFyRG93bigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIHRlc3RzIGFkYXB0YWJsZSBjb250cmlidXRpb25zIHRoYXQgYXJlIG5vdCBJUmVzb3VyY2UuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RBZGFwdGFibGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBBc3NlcnQgdGhhdCBkZWNvcmF0b3JzIGNvbnRyaWJ1dGVkIHRvIElDb21tb24gYXJlIGFwcGxpZWQgdG8gdGhlIGdpdmVuIG9iamVjdAotICAgICAgICBhc3NlcnREZWNvcmF0ZWQoIjEiLCAKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge1Rlc3RBZGFwdGFibGVEZWNvcmF0b3JDb250cmlidXRvci5TVUZGSVh9LCAKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ29tbW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkEoKQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgSUNvbW1vbi5jbGFzcywKLSAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgICAgICApOwotICAgICAgICAvLyBBc3NlcnQgdGhhdCBkZWNvcmF0b3JzIGNvbnRyaWJ1dGVkIHRvIElDb21tb24gYXJlIG5vdCBhcHBsaWVkIHRvIHRoZSBnaXZlbiBvYmplY3QKLSAgICAgICAgYXNzZXJ0RGVjb3JhdGVkKCIyIiwgCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtUZXN0QWRhcHRhYmxlRGVjb3JhdG9yQ29udHJpYnV0b3IuU1VGRklYfSwgCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0KCkgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBJQ29tbW9uLmNsYXNzLAotICAgICAgICAgICAgICAgIGZhbHNlCi0gICAgICAgICAgICApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IG5vbi1hZGFwdGFibGUgY29udHJpYnV0aW9ucwotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Tm9uQWRhcHRhYmxlQ29udHJpYnV0aW9ucygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RGVjb3JhdGVkKCIxIiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge1Rlc3RVbmFkYXB0YWJsZURlY29yYXRvckNvbnRyaWJ1dG9yLlNVRkZJWH0sIAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5BKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5CKCl9LAotICAgICAgICAgICAgICAgIElDb21tb24uY2xhc3MsCi0gICAgICAgICAgICAgICAgZmFsc2UKLSAgICAgICAgICAgICk7Ci0gICAgICAgIGFzc2VydERlY29yYXRlZCgiMiIsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtUZXN0VW5hZGFwdGFibGVEZWNvcmF0b3JDb250cmlidXRvci5TVUZGSVh9LCAKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuRCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQygpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ29tbW9uKCl9LAotICAgICAgICAgICAgICAgIElDb21tb24uY2xhc3MsCi0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgICAgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB0ZXN0cyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBzdXBwb3J0IGZvciBhZGFwdGFibGUgSVJlc291cmNlIG9iamVjdENvbnRyaWJ1dGlvbnMuIFRoaXMKLSAgICAgKiBhbGxvd3MgSVJlc291cmNlIGFkYXB0YWJsZSBjb250cmlidXRpb25zIHdpdGhvdXQgYW4gYWRhcHRlciBmYWN0b3J5IGFuZCB1c2luZwotICAgICAqIHRoZSBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIgZmFjdG9yeS4gSW4gYWRkaXRpb24sIHRlc3QgdGhlIFJlc291cmNlTWFwcGluZyBhZGFwdGF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHRlc3RQcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgaWYoISB0ZXN0UHJvamVjdC5leGlzdHMoKSkgewotICAgICAgICAgICAgdGVzdFByb2plY3QuY3JlYXRlKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEgdGVzdFByb2plY3QuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydERlY29yYXRlZCgiMSIsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiSVJlc291cmNlLjEifSwgCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ1Jlc291cmNlKCksIAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DRmlsZSgpfSwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnREZWNvcmF0ZWQoIjIiLCAKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJSZXNvdXJjZU1hcHBpbmcuMSJ9LCAKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ0ZpbGUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DUmVzb3VyY2UoKX0sCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VNYXBwaW5nLmNsYXNzLAotICAgICAgICAgICAgICAgIHRydWUKLSAgICAgICAgICAgICk7Ci0gICAgICAgIGFzc2VydERlY29yYXRlZCgiMyIsIAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IlJlc291cmNlTWFwcGluZy4xIiwgIklSZXNvdXJjZS4xIn0sIAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLk1vZGVsRWxlbWVudCgpfSwKLSAgICAgICAgICAgICAgICBSZXNvdXJjZU1hcHBpbmcuY2xhc3MsCi0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgICAgKTsKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGNhc2Ugd2hlcmUgYW4gb2JqZWN0IHVzZXMgYSBjb250cmlidXRpb24gYWRhcHRlciB0aGF0IGRvZXNuJ3QgaGFuZGxlIG1hcHBpbmdzCi0gICAgICAgIC8vIHdpbGwgc3RpbGwgc2hvdyB0aGUgbWVudXMgZm9yIHJlc291cmNlIG1hcHBpbmdzCi0gICAgICAgIGFzc2VydERlY29yYXRlZCgiNCIsIAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IlJlc291cmNlTWFwcGluZy4xIiwgIklSZXNvdXJjZS4xIn0sIAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNSZXNvdXJjZU9ubHkoKX0sCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VNYXBwaW5nLmNsYXNzLAotICAgICAgICAgICAgICAgIHRydWUKLSAgICAgICAgICAgICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0RlY29yYXRvckVuYWJsZW1lbnRUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0RlY29yYXRvckVuYWJsZW1lbnRUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTk5YTA2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JFbmFibGVtZW50VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kZWNvcmF0b3JzLkRlY29yYXRvckRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGVjb3JhdG9ycy5EZWNvcmF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvci5BYnN0cmFjdE5hdmlnYXRvclRlc3Q7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVjb3JhdG9yRW5hYmxlbWVudFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3ROYXZpZ2F0b3JUZXN0Ci0gICAgICAgIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciB7Ci0KLSAgICBwcm90ZWN0ZWQgRGVjb3JhdG9yRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIERlY29yYXRvclRlc3RDYXNlLgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBEZWNvcmF0b3JFbmFibGVtZW50VGVzdENhc2UoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHVwIHRoZSBoaWVyYXJjaHkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIGNyZWF0ZVRlc3RGaWxlKCk7Ci0gICAgICAgIHNob3dOYXYoKTsKLQotICAgICAgICBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5hZGRMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBEZWNvcmF0b3JEZWZpbml0aW9uW10gZGVmaW5pdGlvbnMgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRBbGxEZWNvcmF0b3JEZWZpbml0aW9ucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlZmluaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbnNbaV0uZ2V0SWQoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzLmxpZ2h0d2VpZ2h0ZGVjb3JhdG9yIikpCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb25zW2ldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERlY29yYXRvck1hbmFnZXIgZ2V0RGVjb3JhdG9yTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgbGlzdGVuZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1RlYXJEb3duKCk7Ci0gICAgICAgIGdldERlY29yYXRvck1hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlIGEgbGFiZWwgY2hhbmdlZCBldmVudCBmb3IgcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGdldExhYmVsQ2hhbmdlZEV2ZW50KElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICByZXR1cm4gbmV3IExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQoZ2V0RGVjb3JhdG9yTWFuYWdlcigpLCByZXNvdXJjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBlbmFibGluZyB0aGUgY29udHJpYnV0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlRGVjb3JhdG9yKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkuY2xlYXJDYWNoZXMoKTsKLSAgICAgICAgZGVmaW5pdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkudXBkYXRlRm9yRW5hYmxlbWVudENoYW5nZSgpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBkaXNhYmxpbmcgdGhlIGNvbnRyaWJ1dG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVEZWNvcmF0b3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldERlY29yYXRvck1hbmFnZXIoKS5jbGVhckNhY2hlcygpOwotICAgICAgICBkZWZpbml0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkudXBkYXRlRm9yRW5hYmxlbWVudENoYW5nZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJTGFiZWxQcm92aWRlckxpc3RlbmVyI2xhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICB1cGRhdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JUYWJsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JUYWJsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1M2ZlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yVGFibGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubWlzYy5Bc3NlcnQ7Ci0KLS8qKgotICogVGhlIERlY29yYXRvclRhYmxlVGVzdCBpcyB0aGUgdGVzdCBmb3IgZGVjb3JhdGluZyB0YWJsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNvcmF0b3JUYWJsZVRlc3QgZXh0ZW5kcyBEZWNvcmF0b3JWaWV3ZXJUZXN0IHsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICogQHBhcmFtIHRlc3ROYW1lCi0JICovCi0JcHVibGljIERlY29yYXRvclRhYmxlVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuRGVjb3JhdG9yVmlld2VyVGVzdCNiYWNrZ3JvdW5kQ2hlY2sob3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBiYWNrZ3JvdW5kQ2hlY2soSVZpZXdQYXJ0IHZpZXcpIHsKLQkJVGFibGVJdGVtIGZpcnN0ID0gKChEZWNvcmF0b3JUYWJsZVZpZXcpIHZpZXcpLnZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0oMCk7Ci0JCUFzc2VydC5pc1RydWUoZmlyc3QuZ2V0QmFja2dyb3VuZCgpLmdldFJHQigpCi0JCQkJLmVxdWFscyhCYWNrZ3JvdW5kQ29sb3JEZWNvcmF0b3IuY29sb3IuZ2V0UkdCKCkpKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuRGVjb3JhdG9yVmlld2VyVGVzdCNmb3JlZ3JvdW5kQ2hlY2sob3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JlZ3JvdW5kQ2hlY2soSVZpZXdQYXJ0IHZpZXcpIHsKLQkJVGFibGVJdGVtIGZpcnN0ID0gKChEZWNvcmF0b3JUYWJsZVZpZXcpIHZpZXcpLnZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0oMCk7Ci0JCUFzc2VydC5pc1RydWUoZmlyc3QuZ2V0Rm9yZWdyb3VuZCgpLmdldFJHQigpCi0JCQkJLmVxdWFscyhGb3JlZ3JvdW5kQ29sb3JEZWNvcmF0b3IuY29sb3IuZ2V0UkdCKCkpKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuRGVjb3JhdG9yVmlld2VyVGVzdCNvcGVuVmlldyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZSkKLQkgKi8KLQlwcm90ZWN0ZWQgSVZpZXdQYXJ0IG9wZW5WaWV3KElXb3JrYmVuY2hQYWdlIHBhZ2UpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwYWdlLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3IuVGFibGVWaWV3VGVzdCIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuRGVjb3JhdG9yVmlld2VyVGVzdCNmb250Q2hlY2sob3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb250Q2hlY2soSVZpZXdQYXJ0IHZpZXcpIHsKLQkJVGFibGVJdGVtIGZpcnN0ID0gKChEZWNvcmF0b3JUYWJsZVZpZXcpIHZpZXcpLnZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0oMCk7Ci0JCUFzc2VydC5pc1RydWUoZmlyc3QuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF0uZXF1YWxzKEZvbnREZWNvcmF0b3IuZm9udC5nZXRGb250RGF0YSgpWzBdKSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JUYWJsZVRyZWVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yVGFibGVUcmVlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWZlYzlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JUYWJsZVRyZWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubWlzYy5Bc3NlcnQ7Ci0KLS8qKgotICogVGhlIERlY29yYXRvclRhYmxlVHJlZVRlc3QgaXMgdGhlIHRlc3QgZm9yIHRhYmxlIAotICogdHJlZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNvcmF0b3JUYWJsZVRyZWVUZXN0IGV4dGVuZHMgRGVjb3JhdG9yVmlld2VyVGVzdCB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotCSAqIEBwYXJhbSB0ZXN0TmFtZQotCSAqLwotCXB1YmxpYyBEZWNvcmF0b3JUYWJsZVRyZWVUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuRGVjb3JhdG9yVmlld2VyVGVzdCNiYWNrZ3JvdW5kQ2hlY2sob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJhY2tncm91bmRDaGVjayhJVmlld1BhcnQgdmlldykgewotCQlUYWJsZVRyZWVJdGVtIGZpcnN0ID0gKChEZWNvcmF0b3JUYWJsZVRyZWVWaWV3KSB2aWV3KS52aWV3ZXIuZ2V0VGFibGVUcmVlKCkuZ2V0SXRlbXMoKVswXTsKLQkJQXNzZXJ0LmlzVHJ1ZShmaXJzdC5nZXRCYWNrZ3JvdW5kKCkuZ2V0UkdCKCkKLQkJCQkuZXF1YWxzKEJhY2tncm91bmRDb2xvckRlY29yYXRvci5jb2xvci5nZXRSR0IoKSkpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5EZWNvcmF0b3JWaWV3ZXJUZXN0I2ZvcmVncm91bmRDaGVjayhvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9yZWdyb3VuZENoZWNrKElWaWV3UGFydCB2aWV3KSB7Ci0JCVRhYmxlVHJlZUl0ZW0gZmlyc3QgPSAoKERlY29yYXRvclRhYmxlVHJlZVZpZXcpIHZpZXcpLnZpZXdlci5nZXRUYWJsZVRyZWUoKS5nZXRJdGVtcygpWzBdOwotCQlBc3NlcnQuaXNUcnVlKGZpcnN0LmdldEZvcmVncm91bmQoKS5nZXRSR0IoKQotCQkJCS5lcXVhbHMoRm9yZWdyb3VuZENvbG9yRGVjb3JhdG9yLmNvbG9yLmdldFJHQigpKSk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzLkRlY29yYXRvclZpZXdlclRlc3Qjb3BlblZpZXcob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2UpCi0JICovCi0JcHJvdGVjdGVkIElWaWV3UGFydCBvcGVuVmlldyhJV29ya2JlbmNoUGFnZSBwYWdlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlyZXR1cm4gcGFnZS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yLlRhYmxlVHJlZVRlc3QiKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzLkRlY29yYXRvclZpZXdlclRlc3QjZm9udENoZWNrKG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb250Q2hlY2soSVZpZXdQYXJ0IHZpZXcpIHsKLQkJVGFibGVUcmVlSXRlbSBmaXJzdCA9ICgoRGVjb3JhdG9yVGFibGVUcmVlVmlldykgdmlldykudmlld2VyLmdldFRhYmxlVHJlZSgpLmdldEl0ZW1zKClbMF07Ci0JCUFzc2VydC5pc1RydWUoZmlyc3QuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF0KLQkJCQkuZXF1YWxzKEZvbnREZWNvcmF0b3IuZm9udC5nZXRGb250RGF0YSgpWzBdKSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JUYWJsZVRyZWVWaWV3LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yVGFibGVUcmVlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWM3ODk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JUYWJsZVRyZWVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBEZWNvcmF0b3JUYWJsZVRyZWVWaWV3IGlzIHRoZSB2aWV3IHRoYXQgdGVzdHMgZGVjb3JhdG9ycwotICogZm9yIHRhYmxlIHRyZWVzLgotICovCi1wdWJsaWMgY2xhc3MgRGVjb3JhdG9yVGFibGVUcmVlVmlldyBleHRlbmRzIERlY29yYXRvclRlc3RQYXJ0IHsKLQkKLQlUYWJsZVRyZWVWaWV3ZXIgdmlld2VyOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KLQkgKi8KLQlwdWJsaWMgRGVjb3JhdG9yVGFibGVUcmVlVmlldygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl2aWV3ZXIgPSBuZXcgVGFibGVUcmVlVmlld2VyKHBhcmVudCk7Ci0KLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIoZ2V0TGFiZWxQcm92aWRlcigpKTsKLQotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZXN0VHJlZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldElucHV0KHRoaXMpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTAotCQkJCXwgR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCi0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JUYWJsZVZpZXcuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JUYWJsZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlYWZhYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yVGFibGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIERlY29yYXRvclRhYmxlVmlldyBpcyBhIHZpZXcgdGhhdCB0ZXN0cyB0aGUgZGVjb3JhdG9yIHN1cHBvcnQgZm9yIHRhYmxlcy4KLSAqLwotcHVibGljIGNsYXNzIERlY29yYXRvclRhYmxlVmlldyBleHRlbmRzIERlY29yYXRvclRlc3RQYXJ0IHsKLQotCVRhYmxlVmlld2VyIHZpZXdlcjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICovCi0JcHVibGljIERlY29yYXRvclRhYmxlVmlldygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQpOwotCi0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGdldExhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVzdFRhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0SW5wdXQodGhpcyk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5GSUxMX0JPVEgpOwotCi0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDcyM2IxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRlY29yYXRvcnMuRGVjb3JhdG9yRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kZWNvcmF0b3JzLkRlY29yYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLkFic3RyYWN0TmF2aWdhdG9yVGVzdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNvcmF0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0TmF2aWdhdG9yVGVzdCBpbXBsZW1lbnRzCi0gICAgICAgIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBEZWNvcmF0b3JEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXBkYXRlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIERlY29yYXRvclRlc3RDYXNlLgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBEZWNvcmF0b3JUZXN0Q2FzZShTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdXAgdGhlIGhpZXJhcmNoeS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICAgICAgY3JlYXRlVGVzdEZpbGUoKTsKLSAgICAgICAgc2hvd05hdigpOwotCi0gICAgICAgIFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmFkZExpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIERlY29yYXRvckRlZmluaXRpb25bXSBkZWZpbml0aW9ucyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldEFsbERlY29yYXRvckRlZmluaXRpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmaW5pdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9uc1tpXS5nZXRJZCgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFkYXB0YWJsZS5kZWNvcmF0b3IiKSkKLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbnNbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIERlY29yYXRvck1hbmFnZXIgZ2V0RGVjb3JhdG9yTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgbGlzdGVuZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1RlYXJEb3duKCk7Ci0gICAgICAgIGdldERlY29yYXRvck1hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlIGEgbGFiZWwgY2hhbmdlZCBldmVudCBmb3IgcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGdldExhYmVsQ2hhbmdlZEV2ZW50KElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICByZXR1cm4gbmV3IExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQoZ2V0RGVjb3JhdG9yTWFuYWdlcigpLCByZXNvdXJjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBlbmFibGluZyB0aGUgY29udHJpYnV0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlRGVjb3JhdG9yKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkuY2xlYXJDYWNoZXMoKTsKLSAgICAgICAgZGVmaW5pdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkudXBkYXRlRm9yRW5hYmxlbWVudENoYW5nZSgpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBkaXNhYmxpbmcgdGhlIGNvbnRyaWJ1dG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVEZWNvcmF0b3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldERlY29yYXRvck1hbmFnZXIoKS5jbGVhckNhY2hlcygpOwotICAgICAgICBkZWZpbml0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkudXBkYXRlRm9yRW5hYmxlbWVudENoYW5nZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZnJlc2ggdGhlIHRlc3QgZGVjb3JhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZyZXNoQ29udHJpYnV0b3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdXBkYXRlZCA9IGZhbHNlOwotICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkuY2xlYXJDYWNoZXMoKTsKLSAgICAgICAgZGVmaW5pdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkudXBkYXRlRm9yRW5hYmxlbWVudENoYW5nZSgpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkdvdCBhbiB1cGRhdGUiLCB1cGRhdGVkKTsKLSAgICAgICAgdXBkYXRlZCA9IGZhbHNlOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIjbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHVwZGF0ZWQgPSB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0RlY29yYXRvclRlc3RQYXJ0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yVGVzdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFiMDlkNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yVGVzdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSURlY29yYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi0vKioKLSAqIFRoZSBEZWNvcmF0b3JUZXN0UGFydCBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiB0aGUgVmlld1BhcnRzIHRoYXQgYXJlCi0gKiB1c2VkIGZvciBkZWNvcmF0b3IgdGVzdHMuCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlY29yYXRvclRlc3RQYXJ0IGV4dGVuZHMgVmlld1BhcnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEFZX1RJTUUgPSAyMDAwOy8vIFdhaXQgMiBzZWNvbmRzCi0KLQlwdWJsaWMgYm9vbGVhbiB3YWl0aW5nRm9yRGVjb3JhdGlvbiA9IHRydWU7Ci0KLQlwcml2YXRlIGxvbmcgZW5kVGltZTsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBEZWNvcmF0b3JUZXN0UGFydCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBEZWNvcmF0aW5nTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCi0JCUlEZWNvcmF0b3JNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldERlY29yYXRvck1hbmFnZXIoKTsKLQkJbWFuYWdlci5hZGRMaXN0ZW5lcihnZXREZWNvcmF0b3JNYW5hZ2VyTGlzdGVuZXIoKSk7Ci0JCXJldHVybiBuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIobmV3IFRlc3RMYWJlbFByb3ZpZGVyKCksIG1hbmFnZXIpOwotCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBsaXN0ZW5lciBmb3IgdGhlIHN1aXRlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgZ2V0RGVjb3JhdG9yTWFuYWdlckxpc3RlbmVyKCkgewotCQlsaXN0ZW5lciA9IG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyKCkgewotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciNsYWJlbFByb3ZpZGVyQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBSZXNldCB0aGUgZW5kIHRpbWUgZWFjaCB0aW1lIHdlIGdldCBhbiB1cGRhdGUKLQkJCQllbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBERUxBWV9USU1FOwotCi0JCQl9Ci0JCX07Ci0KLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlYWRBbmREaXNwYXRjaEZvclVwZGF0ZXMoKSB7Ci0JCXdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8IGVuZFRpbWUpCi0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5yZWFkQW5kRGlzcGF0Y2goKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwRm9yRGVjb3JhdG9ycygpIHsKLQkJZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgREVMQVlfVElNRTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpCi0JCQkJLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0RlY29yYXRvclRyZWVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yVHJlZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzMmI5MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yVHJlZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBEZWNvcmF0b3JUcmVlVGVzdCB0ZXN0cyB0aGUgZm9udCBhbmQgY29sb3Igc3VwcG9ydCBvbiAKLSAqIHRyZWUgdmlld2Vycy4KLSAqLwotcHVibGljIGNsYXNzIERlY29yYXRvclRyZWVUZXN0IGV4dGVuZHMgRGVjb3JhdG9yVmlld2VyVGVzdCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGVzdE5hbWUKLQkgKi8KLQlwdWJsaWMgRGVjb3JhdG9yVHJlZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuVUlUZXN0Q2FzZSNkb1NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRvU2V0VXAoKTsKLQkJY3JlYXRlVGVzdEZpbGUoKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuRGVjb3JhdG9yVmlld2VyVGVzdCNiYWNrZ3JvdW5kQ2hlY2sob3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBiYWNrZ3JvdW5kQ2hlY2soSVZpZXdQYXJ0IHZpZXcpIHsKLQkJVHJlZUl0ZW0gZmlyc3QgPSAoKERlY29yYXRvclRyZWVWaWV3KSB2aWV3KS52aWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1zKClbMF07Ci0JCWFzc2VydEVxdWFscyhCYWNrZ3JvdW5kQ29sb3JEZWNvcmF0b3IuY29sb3IuZ2V0UkdCKCksIGZpcnN0LmdldEJhY2tncm91bmQoKS5nZXRSR0IoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5EZWNvcmF0b3JWaWV3ZXJUZXN0I2ZvcmVncm91bmRDaGVjayhvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcmVncm91bmRDaGVjayhJVmlld1BhcnQgdmlldykgewotCi0JCVRyZWVJdGVtIGZpcnN0ID0gKChEZWNvcmF0b3JUcmVlVmlldykgdmlldykudmlld2VyLmdldFRyZWUoKS5nZXRJdGVtcygpWzBdOwotCQlhc3NlcnRFcXVhbHMoRm9yZWdyb3VuZENvbG9yRGVjb3JhdG9yLmNvbG9yLmdldFJHQigpLCBmaXJzdC5nZXRGb3JlZ3JvdW5kKCkuZ2V0UkdCKCkpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5EZWNvcmF0b3JWaWV3ZXJUZXN0I29wZW5WaWV3KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlKQotCSAqLwotCXByb3RlY3RlZCBJVmlld1BhcnQgb3BlblZpZXcoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gcGFnZS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5UcmVlVmlld1Rlc3QiKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuRGVjb3JhdG9yVmlld2VyVGVzdCNmb250Q2hlY2sob3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb250Q2hlY2soSVZpZXdQYXJ0IHZpZXcpIHsKLQkJVHJlZUl0ZW0gZmlyc3QgPSAoKERlY29yYXRvclRyZWVWaWV3KSB2aWV3KS52aWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1zKClbMF07Ci0JCWFzc2VydEVxdWFscyhGb250RGVjb3JhdG9yLmZvbnQuZ2V0Rm9udERhdGEoKVswXSwgZmlyc3QuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JUcmVlVmlldy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0RlY29yYXRvclRyZWVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyY2I4ZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0RlY29yYXRvclRyZWVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgRGVjb3JhdG9yVHJlZVZpZXcgaXMgYSBUcmVlVmlldyB0aGF0IHRlc3RzIHRoZSAKLSAqIGZvbnQgYW5kIGNvbG9yIGRlY29yYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgRGVjb3JhdG9yVHJlZVZpZXcgZXh0ZW5kcyBEZWNvcmF0b3JUZXN0UGFydCB7Ci0JCi0JVHJlZVZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVjb3JhdG9yVHJlZVZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJIHZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCl7Ci0JCSAJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlciNsYWJlbFByb3ZpZGVyQ2hhbmdlZCgpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKCkgewotCQkJCXN1cGVyLmxhYmVsUHJvdmlkZXJDaGFuZ2VkKCk7Ci0JCQl9Ci0JCSB9OwotCi0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGdldExhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVzdFRyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRJbnB1dCh0aGlzKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwKLQkJCQl8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0RlY29yYXRvclZpZXdlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9EZWNvcmF0b3JWaWV3ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTQ5MjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0RlY29yYXRvclZpZXdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRGVjb3JhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kZWNvcmF0b3JzLkRlY29yYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubWlzYy5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLkFic3RyYWN0TmF2aWdhdG9yVGVzdDsKLQotLyoqCi0gKiBEZWNvcmF0b3JWaWV3ZXJUZXN0IGlzIHRoZSBhYnN0cmFjdCBjbGFzcyBvZiB0aGUgdGVzdHMgZm9yIHRoZSB2aWV3ZXJzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVjb3JhdG9yVmlld2VyVGVzdCBleHRlbmRzIEFic3RyYWN0TmF2aWdhdG9yVGVzdCB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXN0TmFtZQotCSAqLwotCXB1YmxpYyBEZWNvcmF0b3JWaWV3ZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLlVJVGVzdENhc2UjZG9TZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5kb1NldFVwKCk7Ci0JCWNyZWF0ZVRlc3RGaWxlKCk7Ci0JCUZvcmVncm91bmRDb2xvckRlY29yYXRvci5zZXRVcENvbG9yKCk7Ci0JCUJhY2tncm91bmRDb2xvckRlY29yYXRvci5zZXRVcENvbG9yKCk7Ci0JCUZvbnREZWNvcmF0b3Iuc2V0VXBGb250KCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB0aGUgYmFja2dyb3VuZCBvbiB0aGUgdmlld2VyLgotCSAqIAotCSAqIEB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEJhY2tncm91bmQoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0KLQkJQmFja2dyb3VuZENvbG9yRGVjb3JhdG9yLnNldFVwQ29sb3IoKTsKLQotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHBhZ2UsICJObyBhY3RpdmUgcGFnZSIpOwotCi0JCWZpbmFsIElWaWV3UGFydCB2aWV3ID0gb3BlblZpZXcocGFnZSk7Ci0JCSgoRGVjb3JhdG9yVGVzdFBhcnQpIHZpZXcpLnNldFVwRm9yRGVjb3JhdG9ycygpOwotCQkKLQotCQlJRGVjb3JhdG9yTWFuYWdlciBtYW5hZ2VyID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXREZWNvcmF0b3JNYW5hZ2VyKCk7Ci0JCW1hbmFnZXIuc2V0RW5hYmxlZChCYWNrZ3JvdW5kQ29sb3JEZWNvcmF0b3IuSUQsIHRydWUpOwotCQkKLQkJUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmpvaW4oRGVjb3JhdG9yTWFuYWdlci5GQU1JTFlfREVDT1JBVEUsIG51bGwpOwotCi0JCWRpc3BhdGNoRHVyaW5nVXBkYXRlcygoRGVjb3JhdG9yVGVzdFBhcnQpIHZpZXcpOwotCQliYWNrZ3JvdW5kQ2hlY2sodmlldyk7Ci0JCW1hbmFnZXIuc2V0RW5hYmxlZChCYWNrZ3JvdW5kQ29sb3JEZWNvcmF0b3IuSUQsIGZhbHNlKTsKLQotCX0KLQotCS8qKgotCSAqIENoZWNrIHRoZSBiYWNrZ3JvdW5kIGNvbG9ycyBpbiB0aGUgdmlldwotCSAqIAotCSAqIEBwYXJhbSB2aWV3Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYmFja2dyb3VuZENoZWNrKElWaWV3UGFydCB2aWV3KTsKLQotCS8qKgotCSAqIFRlc3QgdGhlIGZvcmVncm91bmQgb24gdGhlIHZpZXdlci4KLQkgKiAKLQkgKiBAdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGb3JlZ3JvdW5kKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCi0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCUFzc2VydC5pc05vdE51bGwocGFnZSwgIk5vIGFjdGl2ZSBwYWdlIik7Ci0KLQkJZmluYWwgSVZpZXdQYXJ0IHZpZXcgPSBvcGVuVmlldyhwYWdlKTsKLQotCQkoKERlY29yYXRvclRlc3RQYXJ0KSB2aWV3KS5zZXRVcEZvckRlY29yYXRvcnMoKTsKLQkJCi0KLQkJSURlY29yYXRvck1hbmFnZXIgbWFuYWdlciA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpOwotCQltYW5hZ2VyLnNldEVuYWJsZWQoRm9yZWdyb3VuZENvbG9yRGVjb3JhdG9yLklELCB0cnVlKTsKLQkJCi0JCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKERlY29yYXRvck1hbmFnZXIuRkFNSUxZX0RFQ09SQVRFLCBudWxsKTsKLQkJZGlzcGF0Y2hEdXJpbmdVcGRhdGVzKChEZWNvcmF0b3JUZXN0UGFydCkgdmlldyk7Ci0KLQkJZm9yZWdyb3VuZENoZWNrKHZpZXcpOwotCQltYW5hZ2VyLnNldEVuYWJsZWQoRm9yZWdyb3VuZENvbG9yRGVjb3JhdG9yLklELCBmYWxzZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZWFkIGFuZCBkaXNwYXRjaCB3aGlsZSB1cGRhdGVzIGFyZSBvY2N1cmluZwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNwYXRjaER1cmluZ1VwZGF0ZXMoRGVjb3JhdG9yVGVzdFBhcnQgdmlldykgewotCQl2aWV3LnJlYWRBbmREaXNwYXRjaEZvclVwZGF0ZXMoKTsKLQotCX0KLQotCS8qKgotCSAqIENoZWNrIHRoZSBmb3JlZ3JvdW5kIGNvbG9ycy4KLQkgKiAKLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvcmVncm91bmRDaGVjayhJVmlld1BhcnQgdmlldyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFnZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElWaWV3UGFydCBvcGVuVmlldyhJV29ya2JlbmNoUGFnZSBwYWdlKQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGVzdCB0aGUgZm9udCBvbiB0aGUgdmlld2VyLgotCSAqIAotCSAqIEB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZvbnQoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChwYWdlLCAiTm8gYWN0aXZlIHBhZ2UiKTsKLQotCQkKLQkJZmluYWwgSVZpZXdQYXJ0IHZpZXcgPSBvcGVuVmlldyhwYWdlKTsKLQkJKChEZWNvcmF0b3JUZXN0UGFydCkgdmlldykuc2V0VXBGb3JEZWNvcmF0b3JzKCk7Ci0JCQotCi0JCUlEZWNvcmF0b3JNYW5hZ2VyIG1hbmFnZXIgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldERlY29yYXRvck1hbmFnZXIoKTsKLQkJbWFuYWdlci5zZXRFbmFibGVkKEZvbnREZWNvcmF0b3IuSUQsIHRydWUpOwotCQkKLQkJUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmpvaW4oRGVjb3JhdG9yTWFuYWdlci5GQU1JTFlfREVDT1JBVEUsIG51bGwpOwotCi0JCWRpc3BhdGNoRHVyaW5nVXBkYXRlcygoRGVjb3JhdG9yVGVzdFBhcnQpIHZpZXcpOwotCQlmb250Q2hlY2sodmlldyk7Ci0JCQotCQltYW5hZ2VyLnNldEVuYWJsZWQoRm9udERlY29yYXRvci5JRCwgZmFsc2UpOwotCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgdGhlIGZvbnRzIGluIHRoZSB2aWV3Ci0JICogCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmb250Q2hlY2soSVZpZXdQYXJ0IHZpZXcpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IuQWJzdHJhY3ROYXZpZ2F0b3JUZXN0I2RvVGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdXBlci5kb1RlYXJEb3duKCk7Ci0JCUlEZWNvcmF0b3JNYW5hZ2VyIG1hbmFnZXIgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldERlY29yYXRvck1hbmFnZXIoKTsKLQkJbWFuYWdlci5zZXRFbmFibGVkKEZvcmVncm91bmRDb2xvckRlY29yYXRvci5JRCwgZmFsc2UpOwotCQltYW5hZ2VyLnNldEVuYWJsZWQoQmFja2dyb3VuZENvbG9yRGVjb3JhdG9yLklELCBmYWxzZSk7Ci0JCW1hbmFnZXIuc2V0RW5hYmxlZChGb250RGVjb3JhdG9yLklELCBmYWxzZSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yc1Rlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0RlY29yYXRvcnNUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlOGI0NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRGVjb3JhdG9yc1Rlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgRGVjb3JhdG9yc1Rlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gIFRoaXMgaXMgcmVxdWlyZWQgdG8KLQkgKiB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWNvcmF0b3JzVGVzdFN1aXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHRoZSB0ZXN0IHN1aXRlLgotCSAqLwotCXB1YmxpYyBEZWNvcmF0b3JzVGVzdFN1aXRlKCkgewotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoRXhjZXB0aW9uRGVjb3JhdG9yVGVzdENhc2UuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKERlY29yYXRvclRlc3RDYXNlLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShMaWdodHdlaWdodERlY29yYXRvclRlc3RDYXNlLmNsYXNzKSk7Ci0vLwkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKERlY29yYXRvclRyZWVUZXN0LmNsYXNzKSk7Ci0vLwkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKERlY29yYXRvclRhYmxlVGVzdC5jbGFzcykpOwotLy8JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShEZWNvcmF0b3JUYWJsZVRyZWVUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShEZWNvcmF0b3JBZGFwdGFibGVUZXN0cy5jbGFzcykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0V4Y2VwdGlvbkRlY29yYXRvclRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRXhjZXB0aW9uRGVjb3JhdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlM2Y5ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRXhjZXB0aW9uRGVjb3JhdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGVjb3JhdG9ycy5EZWNvcmF0b3JEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRlY29yYXRvcnMuRGVjb3JhdG9yTWFuYWdlcjsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25EZWNvcmF0b3JUZXN0Q2FzZSBleHRlbmRzIERlY29yYXRvckVuYWJsZW1lbnRUZXN0Q2FzZQotICAgICAgICBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgewotICAgIHByaXZhdGUgQ29sbGVjdGlvbiBwcm9ibGVtRGVjb3JhdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgRGVjb3JhdG9yRGVmaW5pdGlvbiBsaWdodDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRGVjb3JhdG9yVGVzdENhc2UuCi0gICAgICogQHBhcmFtIHRlc3ROYW1lCi0gICAgICovCi0gICAgcHVibGljIEV4Y2VwdGlvbkRlY29yYXRvclRlc3RDYXNlKFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB1cCB0aGUgaGllcmFyY2h5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICAvL3Jlc2V0IHRoZSBzdGF0aWMgZmllbGRzIHNvIHRoYXQgdGhlIGRlY29yYXRvcnMgd2lsbCBmYWlsCi0gICAgICAgIEhlYXZ5TnVsbEltYWdlRGVjb3JhdG9yLmZhaWwgPSB0cnVlOwotICAgICAgICBIZWF2eU51bGxUZXh0RGVjb3JhdG9yLmZhaWwgPSB0cnVlOwotICAgICAgICBOdWxsSW1hZ2VEZWNvcmF0b3IuZmFpbCA9IHRydWU7Ci0gICAgICAgIERlY29yYXRvckRlZmluaXRpb25bXSBkZWZpbml0aW9ucyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldEFsbERlY29yYXRvckRlZmluaXRpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmaW5pdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBpZCA9IGRlZmluaXRpb25zW2ldLmdldElkKCk7Ci0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKCJvcmcuZWNsaXBzZS51aS50ZXN0cy5oZWF2eU51bGxJbWFnZURlY29yYXRvciIpCi0gICAgICAgICAgICAgICAgICAgIHx8IGlkLmVxdWFscygib3JnLmVjbGlwc2UudWkudGVzdHMuaGVhdnlOdWxsVGV4dERlY29yYXRvciIpKSB7Ci0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbnNbaV0uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBwcm9ibGVtRGVjb3JhdG9ycy5hZGQoZGVmaW5pdGlvbnNbaV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL0RvIG5vdCBjYWNoZSB0aGUgbGlnaHQgb25lIC0gdGhlIGRpc2FibGluZyBpc3N1ZXMKLSAgICAgICAgICAgIC8vc3RpbGwgbmVlZCB0byBiZSB3b3JrZWQgb3V0LgotICAgICAgICAgICAgaWYgKGlkLmVxdWFscygib3JnLmVjbGlwc2UudWkudGVzdHMubGlnaHROdWxsSW1hZ2VEZWNvcmF0b3IiKSkgewotICAgICAgICAgICAgICAgIGRlZmluaXRpb25zW2ldLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbGlnaHQgPSBkZWZpbml0aW9uc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yLkxpZ2h0d2VpZ2h0RGVjb3JhdG9yVGVzdENhc2UjZG9UZWFyRG93bigpCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvVGVhckRvd24oKTsKLQotICAgICAgICAvL05lZWQgdG8gd2FpdCBmb3IgZGVjb3JhdGlvbiB0byBlbmQgdG8gYWxsb3cgZm9yIGFsbCAKLSAgICAgICAgLy9lcnJvcnMgdG8gb2NjdXIKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKERlY29yYXRvck1hbmFnZXIuRkFNSUxZX0RFQ09SQVRFLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0JlIHN1cmUgdGhhdCB0aGUgZGVjb3JhdG9ycyB3ZXJlIGFsbCBkaXNhYmxlZCBvbiBlcnJvcnMuCi0gICAgICAgIEl0ZXJhdG9yIHByb2JsZW1JdGVyYXRvciA9IHByb2JsZW1EZWNvcmF0b3JzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChwcm9ibGVtSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBEZWNvcmF0b3JEZWZpbml0aW9uIG5leHQgPSAoRGVjb3JhdG9yRGVmaW5pdGlvbikgcHJvYmxlbUl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgICAgIC5uZXh0KCk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSgiRW5hYmxlZCAiICsgbmV4dC5nZXROYW1lKCksIG5leHQuaXNFbmFibGVkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9UdXJub2ZmIHRoZSBsaWdodHdlaWdodCBvbmUgc28gYXMgbm90IHRvIGNsdXR0ZXIgdGhlIG1ldGhvZHMuCi0gICAgICAgIGxpZ2h0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9Gb250RGVjb3JhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRm9udERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDUxMzI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9Gb250RGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhlIEZvbnREZWNvcmF0b3IgaXMgZm9yIHRlc3RpbmcgdGhlIGZvbnQgZW5hYmxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEZvbnREZWNvcmF0b3IgaW1wbGVtZW50cyBJTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5mb250RGVjb3JhdG9yIjsKLQotCXB1YmxpYyBzdGF0aWMgRm9udCBmb250OwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yI2RlY29yYXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7Ci0JCQotCQlpZihmb250ID09IG51bGwpewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlzZXRVcEZvbnQoKTsKLQotCQkJCX0KLQkJCX0pOwotCi0JCX0KLQkJCi0JCWRlY29yYXRpb24uc2V0Rm9udChmb250KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JfQotCi0JLyoqCi0JICogU2V0dXAgdGhlIGZvbnQgdXNlZCBieSB0aGlzIGRlY29yYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBGb250KCkgewotCQlmb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udChKRmFjZVJlc291cmNlcy5IRUFERVJfRk9OVCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRm9yZWdyb3VuZENvbG9yRGVjb3JhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvRm9yZWdyb3VuZENvbG9yRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNjU2YTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0ZvcmVncm91bmRDb2xvckRlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBGb3JlZ3JvdW5kQ29sb3JEZWNvcmF0b3IgaXMgZm9yIHRlc3RpbmcgdGhlIGZvcmVncm91bmQgZW5hYmxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEZvcmVncm91bmRDb2xvckRlY29yYXRvciBpbXBsZW1lbnRzIElMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmZvcmVncm91bmREZWNvcmF0b3IiOwotCQotCXB1YmxpYyBzdGF0aWMgQ29sb3IgY29sb3I7Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yI2RlY29yYXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7Ci0KLQkJaWYoY29sb3IgPT0gbnVsbCl7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXNldFVwQ29sb3IoKTsKLQotCQkJCX0KLQkJCX0pOwotCi0JCX0KLQkJZGVjb3JhdGlvbi5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENvbG9yKCl7Ci0JCWNvbG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfWUVMTE9XKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0hlYXZ5TnVsbEltYWdlRGVjb3JhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvSGVhdnlOdWxsSW1hZ2VEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyMzFkMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvSGVhdnlOdWxsSW1hZ2VEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5Gb3JjZWRFeGNlcHRpb247Ci0KLS8qKgotICogQHNlZSBJTGFiZWxEZWNvcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEhlYXZ5TnVsbEltYWdlRGVjb3JhdG9yIGltcGxlbWVudHMgSUxhYmVsRGVjb3JhdG9yIHsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgd2Ugc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmFpbCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVhdnlOdWxsSW1hZ2VEZWNvcmF0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGFiZWxEZWNvcmF0b3IjYWRkTGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGFiZWxEZWNvcmF0b3IjZGlzcG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGFiZWxEZWNvcmF0b3IjaXNMYWJlbFByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUxhYmVsRGVjb3JhdG9yI3JlbW92ZUxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlSW1hZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZGVjb3JhdGVJbWFnZShJbWFnZSBpbWFnZSwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGZhaWwpIHsKLSAgICAgICAgICAgIGZhaWwgPSBmYWxzZTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGb3JjZWRFeGNlcHRpb24oIkhlYXZ5IGltYWdlIGRlY29yYXRvciBib29tIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVUZXh0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIHRleHQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9IZWF2eU51bGxUZXh0RGVjb3JhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvSGVhdnlOdWxsVGV4dERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWFiZGJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9IZWF2eU51bGxUZXh0RGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuRm9yY2VkRXhjZXB0aW9uOwotCi0vKioKLSAqIEBzZWUgSUxhYmVsRGVjb3JhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWF2eU51bGxUZXh0RGVjb3JhdG9yIGltcGxlbWVudHMgSUxhYmVsRGVjb3JhdG9yIHsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgd2Ugc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmFpbCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVhdnlOdWxsVGV4dERlY29yYXRvcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElMYWJlbERlY29yYXRvciNhZGRMaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElMYWJlbERlY29yYXRvciNkaXNwb3NlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElMYWJlbERlY29yYXRvciNpc0xhYmVsUHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGFiZWxEZWNvcmF0b3IjcmVtb3ZlTGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVJbWFnZQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBkZWNvcmF0ZUltYWdlKEltYWdlIGltYWdlLCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVUZXh0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIHRleHQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChmYWlsKSB7Ci0gICAgICAgICAgICBmYWlsID0gZmFsc2U7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRm9yY2VkRXhjZXB0aW9uKCJIZWF2eSB0ZXh0IGRlY29yYXRvciBib29tIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0xpZ2h0d2VpZ2h0RGVjb3JhdG9yVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9MaWdodHdlaWdodERlY29yYXRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZGYxZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL0xpZ2h0d2VpZ2h0RGVjb3JhdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqLwotcHVibGljIGNsYXNzIExpZ2h0d2VpZ2h0RGVjb3JhdG9yVGVzdENhc2UgZXh0ZW5kcyBEZWNvcmF0b3JFbmFibGVtZW50VGVzdENhc2UKLSAgICAgICAgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlckxpc3RlbmVyIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBEZWNvcmF0b3JUZXN0Q2FzZS4KLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlnaHR3ZWlnaHREZWNvcmF0b3JUZXN0Q2FzZShTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZnJlc2ggdGhlIHRlc3QgZGVjb3JhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZyZXNoQ29udHJpYnV0b3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdXBkYXRlZCA9IGZhbHNlOwotICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkuY2xlYXJDYWNoZXMoKTsKLSAgICAgICAgZGVmaW5pdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkudXBkYXRlRm9yRW5hYmxlbWVudENoYW5nZSgpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkdvdCBhbiB1cGRhdGUiLCB1cGRhdGVkKTsKLSAgICAgICAgdXBkYXRlZCA9IGZhbHNlOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvTnVsbEltYWdlRGVjb3JhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvTnVsbEltYWdlRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYWFiMzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL051bGxJbWFnZURlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLkZvcmNlZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAc2VlIElMYWJlbERlY29yYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTnVsbEltYWdlRGVjb3JhdG9yIGltcGxlbWVudHMgSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgewotICAgIC8qKgotICAgICAqIFdoZXRoZXIgd2Ugc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmFpbCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgTnVsbEltYWdlRGVjb3JhdG9yKCkgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIC8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IjZGVjb3JhdGUoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotICAgICAgICBpZiAoZmFpbCkgewotICAgICAgICAgICAgZmFpbCA9IGZhbHNlOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmNlZEV4Y2VwdGlvbigiTGlnaHdlaWdodCBkZWNvcmF0b3IgYm9vbSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvVGFibGVFbGVtZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvVGFibGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOGQzNmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1RhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnM7Ci0KLS8qKgotICogVGhlIFRhYmxlRWxlbWVudCBpcyB0aGUgY29udGVudCBmb3IgdGFibGVzIGluIHRoZSBkZWNvcmF0b3IKLSAqIHRlc3RpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUVsZW1lbnQgZXh0ZW5kcyBUZXN0RWxlbWVudHsKLQotCWludCBpbmRleDsKLQkKLQlwdWJsaWMgVGFibGVFbGVtZW50KGludCBuZXdJbmRleCkgewotCQlzdXBlcigpOwotCQlpbmRleCA9IG5ld0luZGV4OwotCQluYW1lID0gIlRhYmxlIEl0ZW0gIiArIFN0cmluZy52YWx1ZU9mKGluZGV4KTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RBZGFwdGFibGVEZWNvcmF0b3JDb250cmlidXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RBZGFwdGFibGVEZWNvcmF0b3JDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDhjMjRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9UZXN0QWRhcHRhYmxlRGVjb3JhdG9yQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLm1lbnVzLk9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXM7Ci0KLS8qKgotICogRGVjb3JhdG9yIGZvciB0ZXN0aW5nIGFkYXB0YWJpbGl0eS4gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHRlc3QKLSAqIHRoZSBhZGFwdGFibGUgY29udHJpYnV0aW9uLiBJdCBjYW4gYWxzbyBiZSBzdWJjbGFzc2VkCi0gKiBhbmQgdGhlIGV4cGVjdGVkIGNsYXNzIGFuZCBzdWZmaXggY2FuIGJlIGN1c3RvbWl6ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlc3RBZGFwdGFibGVEZWNvcmF0b3JDb250cmlidXRvciBleHRlbmRzIFRlc3RMaWdodHdlaWdodERlY29yYXRvckNvbnRyaWJ1dG9yIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWCA9ICJJQ29tbW9uLjEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuZ2VuZXJhbEFkYXB0YWJpbGl0eU9uIjsKLSAgICAKLSAgICBwcml2YXRlIENsYXNzIGNsYXp6OwotICAgIHByaXZhdGUgU3RyaW5nIHN1ZmZpeDsKLQotICAgIHB1YmxpYyBUZXN0QWRhcHRhYmxlRGVjb3JhdG9yQ29udHJpYnV0b3IoKSB7Ci0gICAgICAgIHNldEV4cGVjdGVkRWxlbWVudFR5cGUoT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5JQ29tbW9uLmNsYXNzKTsKLSAgICAgICAgc2V0U3VmZml4KFNVRkZJWCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U3VmZml4KFN0cmluZyBzdWZmaXgpIHsKLSAgICAgICAgdGhpcy5zdWZmaXggPSBzdWZmaXg7ICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldEV4cGVjdGVkRWxlbWVudFR5cGUoQ2xhc3MgY2xhenopIHsKLSAgICAgICAgdGhpcy5jbGF6eiA9IGNsYXp6OyAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGVjb3JhdGUoT2JqZWN0IGVsZW1lbnQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY2xhenouaXNJbnN0YW5jZShlbGVtZW50KSk7Ci0gICAgICAgIGRlY29yYXRpb24uYWRkU3VmZml4KHN1ZmZpeCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3REZWNvcmF0b3JDb250cmlidXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3REZWNvcmF0b3JDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjhiNjBmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9UZXN0RGVjb3JhdG9yQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubWlzYy5Bc3NlcnQ7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RGVjb3JhdG9yQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJTGFiZWxEZWNvcmF0b3IgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0RGVjb3JhdG9yQ29udHJpYnV0b3IgY29udHJpYnV0b3I7Ci0KLSAgICBwcml2YXRlIFNldCBsaXN0ZW5lcnMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVDT1JBVE9SX1NVRkZJWCA9ICJfU1VGRklYIjsKLQotICAgIHB1YmxpYyBUZXN0RGVjb3JhdG9yQ29udHJpYnV0b3IoKSB7Ci0gICAgICAgIGNvbnRyaWJ1dG9yID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlVGV4dChTdHJpbmcsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGRlY29yYXRlVGV4dChTdHJpbmcgdGV4dCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgLy9DaGVjayB0aGF0IHRoZSBlbGVtZW50IGlzIGFkYXB0ZWQgdG8gSVJlc291cmNlCi0gICAgICAgIEFzc2VydC5pc1RydWUoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSk7Ci0gICAgICAgIHJldHVybiB0ZXh0ICsgREVDT1JBVE9SX1NVRkZJWDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlSW1hZ2UoSW1hZ2UsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZGVjb3JhdGVJbWFnZShJbWFnZSBpbWFnZSwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZShlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKTsKLSAgICAgICAgcmV0dXJuIGltYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgY29udHJpYnV0b3IgPSBudWxsOwotICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgSGFzaFNldCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZyZXNoIHRoZSBsaXN0ZW5lcnMgdG8gdXBkYXRlIHRoZSBkZWNvcmF0b3JzIGZvciAKLSAgICAgKiBlbGVtZW50LgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaExpc3RlbmVycyhPYmplY3QgZWxlbWVudCkgewotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIGVsZW1lbnQpOwotICAgICAgICAgICAgKChJTGFiZWxQcm92aWRlckxpc3RlbmVyKSBpdGVyYXRvci5uZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIC5sYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9UZXN0RWxlbWVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZGZiNjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotLyoqCi0gKiBUaGUgVGVzdEVsZW1lbnQgaXMgdGhlIGFic3RyYWN0IHN1cGVyIGNsYXNzIGZvciB0aGUgZWxlbWVudHMKLSAqIGZvciB0aGUgdGFibGUgYW5kIHRyZWUgZGVjb3JhdG9yIHRlc3RpbmcuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0RWxlbWVudCB7Ci0JCi0JU3RyaW5nIG5hbWU7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9UZXN0TGFiZWxQcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MWViZDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZvbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0UGx1Z2luOwotCi0vKioKLSAqIFRlc3RUcmVlTGFiZWxQcm92aWRlciBpcyB0aGUgbGFibGUgcHJvdmlkZXIgZm9yIHRoZSB0cmVlIAotICogZGVjb3JhdG9yIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyLCBJQ29sb3JQcm92aWRlciwgSUZvbnRQcm92aWRlciB7Ci0KLQlJbWFnZSBpbWFnZTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCVRlc3RQbHVnaW4gcGx1Z2luID0gVGVzdFBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCQlpbWFnZSA9IHBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImFueXRoaW5nLmdpZiIpLmNyZWF0ZUltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gKChUZXN0RWxlbWVudCkgZWxlbWVudCkubmFtZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyI2dldEJhY2tncm91bmQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZChPYmplY3QgZWxlbWVudCkgewotCQkKLQkJaW50IHN3aXRjaE51bWJlciA9IDA7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBUcmVlRWxlbWVudCkKLQkJCXN3aXRjaE51bWJlciA9ICgoVHJlZUVsZW1lbnQpIGVsZW1lbnQpLmxldmVsOwotCQllbHNlCi0JCQlzd2l0Y2hOdW1iZXIgPSAoKFRhYmxlRWxlbWVudCkgZWxlbWVudCkuaW5kZXglNDsKLQkJCi0JCXN3aXRjaCAoc3dpdGNoTnVtYmVyKSB7Ci0JCWNhc2UgMDoKLQkJCXJldHVybiBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKTsKLQkJY2FzZSAxOgotCQkJcmV0dXJuIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTik7Ci0JCWNhc2UgMjoKLQkJCXJldHVybiBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkVFTik7Ci0JCWNhc2UgMzoKLQkJCXJldHVybiBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlciNnZXRGb3JlZ3JvdW5kKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCi0JCWludCBzd2l0Y2hOdW1iZXIgPSAwOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVHJlZUVsZW1lbnQpCi0JCQlzd2l0Y2hOdW1iZXIgPSAoKFRyZWVFbGVtZW50KSBlbGVtZW50KS5sZXZlbDsKLQkJZWxzZQotCQkJc3dpdGNoTnVtYmVyID0gKChUYWJsZUVsZW1lbnQpIGVsZW1lbnQpLmluZGV4JTQ7Ci0JCQotCQkKLQkJc3dpdGNoIChzd2l0Y2hOdW1iZXIpIHsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX1JFRCk7Ci0JCWNhc2UgMToKLQkJCXJldHVybiBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkJY2FzZSAyOgotCQkJcmV0dXJuIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9DWUFOKTsKLQkJY2FzZSAzOgotCQkJcmV0dXJuIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZvbnRQcm92aWRlciNnZXRGb250KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEZvbnQgZ2V0Rm9udChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0SXRhbGljKEpGYWNlUmVzb3VyY2VzLkRFRkFVTFRfRk9OVCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChpbWFnZSAhPSBudWxsKQotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RMaWdodHdlaWdodERlY29yYXRvckNvbnRyaWJ1dG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvVGVzdExpZ2h0d2VpZ2h0RGVjb3JhdG9yQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0NTFjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvVGVzdExpZ2h0d2VpZ2h0RGVjb3JhdG9yQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLm1pc2MuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBUZXN0TGlnaHR3ZWlnaHREZWNvcmF0b3JDb250cmlidXRvciBpbXBsZW1lbnRzCi0gICAgICAgIElMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdExpZ2h0d2VpZ2h0RGVjb3JhdG9yQ29udHJpYnV0b3IgY29udHJpYnV0b3I7Ci0KLSAgICBwcml2YXRlIFNldCBsaXN0ZW5lcnMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVDT1JBVE9SX1NVRkZJWCA9ICJfU1VGRklYIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFQ09SQVRPUl9QUkVGSVggPSAiUFJFRklYXyI7Ci0KLSAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0gICAgcHVibGljIFRlc3RMaWdodHdlaWdodERlY29yYXRvckNvbnRyaWJ1dG9yKCkgewotICAgICAgICBjb250cmlidXRvciA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBjb250cmlidXRvciA9IG51bGw7Ci0gICAgICAgIGxpc3RlbmVycyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoT2JqZWN0LCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZnJlc2ggdGhlIGxpc3RlbmVycyB0byB1cGRhdGUgdGhlIGRlY29yYXRvcnMgZm9yIAotICAgICAqIGVsZW1lbnQuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoTGlzdGVuZXJzKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCgKLSAgICAgICAgICAgICAgICAgICAgdGhpcywgZWxlbWVudCk7Ci0gICAgICAgICAgICAoKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpIGl0ZXJhdG9yLm5leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgLmxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciNnZXRPdmVybGF5KGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRPdmVybGF5KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSk7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIFVSTCBzb3VyY2UgPSBUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbGxVUkwoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ldyBVUkwoc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgImljb25zL2JpbmFyeV9jby5naWYiKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IjZGVjb3JhdGUoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotICAgICAgICBkZWNvcmF0aW9uLmFkZE92ZXJsYXkoZ2V0T3ZlcmxheShlbGVtZW50KSk7Ci0gICAgICAgIGRlY29yYXRpb24uYWRkUHJlZml4KERFQ09SQVRPUl9QUkVGSVgpOwotICAgICAgICBkZWNvcmF0aW9uLmFkZFN1ZmZpeChERUNPUkFUT1JfU1VGRklYKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9UZXN0TGlnaHR3ZWlnaHREZWNvcmF0b3JNdWx0aXBsZVF1YWRyYW50Q29udHJpYnV0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9UZXN0TGlnaHR3ZWlnaHREZWNvcmF0b3JNdWx0aXBsZVF1YWRyYW50Q29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyNDViMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvVGVzdExpZ2h0d2VpZ2h0RGVjb3JhdG9yTXVsdGlwbGVRdWFkcmFudENvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5taXNjLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0UGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgYSBjb250cmlidXRvciB0aGF0IHVzZXMgdGhlIG11bHRpIHF1YWRyYW50Ci0gKiBzdXBwb3J0LgotICovCi0KLXB1YmxpYyBjbGFzcyBUZXN0TGlnaHR3ZWlnaHREZWNvcmF0b3JNdWx0aXBsZVF1YWRyYW50Q29udHJpYnV0b3IgaW1wbGVtZW50cwotICAgICAgICBJTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RMaWdodHdlaWdodERlY29yYXRvck11bHRpcGxlUXVhZHJhbnRDb250cmlidXRvciBjb250cmlidXRvcjsKLQotICAgIHByaXZhdGUgU2V0IGxpc3RlbmVycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0gICAgcHVibGljIFRlc3RMaWdodHdlaWdodERlY29yYXRvck11bHRpcGxlUXVhZHJhbnRDb250cmlidXRvcigpIHsKLSAgICAgICAgY29udHJpYnV0b3IgPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgY29udHJpYnV0b3IgPSBudWxsOwotICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgSGFzaFNldCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZyZXNoIHRoZSBsaXN0ZW5lcnMgdG8gdXBkYXRlIHRoZSBkZWNvcmF0b3JzIGZvciAKLSAgICAgKiBlbGVtZW50LgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaExpc3RlbmVycyhPYmplY3QgZWxlbWVudCkgewotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIGVsZW1lbnQpOwotICAgICAgICAgICAgKChJTGFiZWxQcm92aWRlckxpc3RlbmVyKSBpdGVyYXRvci5uZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIC5sYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IjZ2V0T3ZlcmxheShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0T3ZlcmxheShPYmplY3QgZWxlbWVudCkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpOwotICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBVUkwgc291cmNlID0gVGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YWxsVVJMKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXcgVVJMKHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJpY29ucy9iaW5hcnlfY28uZ2lmIikpOwotICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdG9yOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yI2RlY29yYXRlKGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVjb3JhdGUoT2JqZWN0IGVsZW1lbnQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLSAgICAgICAgZGVjb3JhdGlvbi5hZGRPdmVybGF5KGdldE92ZXJsYXkoZWxlbWVudCksIElEZWNvcmF0aW9uLkJPVFRPTV9MRUZUKTsKLSAgICAgICAgZGVjb3JhdGlvbi5hZGRPdmVybGF5KGdldE92ZXJsYXkoZWxlbWVudCksIElEZWNvcmF0aW9uLkJPVFRPTV9SSUdIVCk7Ci0gICAgICAgIGRlY29yYXRpb24uYWRkT3ZlcmxheShnZXRPdmVybGF5KGVsZW1lbnQpLCBJRGVjb3JhdGlvbi5UT1BfTEVGVCk7Ci0gICAgICAgIGRlY29yYXRpb24uYWRkT3ZlcmxheShnZXRPdmVybGF5KGVsZW1lbnQpLCBJRGVjb3JhdGlvbi5UT1BfUklHSFQpOwotICAgICAgICBkZWNvcmF0aW9uLmFkZE92ZXJsYXkoZ2V0T3ZlcmxheShlbGVtZW50KSwgSURlY29yYXRpb24uVU5ERVJMQVkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RSZXNvdXJjZURlY29yYXRvckNvbnRyaWJ1dG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvVGVzdFJlc291cmNlRGVjb3JhdG9yQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE3N2UyMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvVGVzdFJlc291cmNlRGVjb3JhdG9yQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIFRlc3RSZXNvdXJjZURlY29yYXRvckNvbnRyaWJ1dG9yIGV4dGVuZHMgVGVzdEFkYXB0YWJsZURlY29yYXRvckNvbnRyaWJ1dG9yIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUZGSVggPSAiSVJlc291cmNlLjEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMucmVzb3VyY2VEZXNjb3JhdG9yIjsKLSAgICBwdWJsaWMgVGVzdFJlc291cmNlRGVjb3JhdG9yQ29udHJpYnV0b3IoKSB7Ci0gICAgICAgIHNldEV4cGVjdGVkRWxlbWVudFR5cGUoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgc2V0U3VmZml4KFNVRkZJWCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RSZXNvdXJjZU1hcHBpbmdEZWNvcmF0b3JDb250cmlidXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RSZXNvdXJjZU1hcHBpbmdEZWNvcmF0b3JDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWE2Y2IyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9UZXN0UmVzb3VyY2VNYXBwaW5nRGVjb3JhdG9yQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgVGVzdFJlc291cmNlTWFwcGluZ0RlY29yYXRvckNvbnRyaWJ1dG9yIGV4dGVuZHMKLSAgICAgICAgVGVzdEFkYXB0YWJsZURlY29yYXRvckNvbnRyaWJ1dG9yIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUZGSVggPSAiUmVzb3VyY2VNYXBwaW5nLjEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMucmVzb3VyY2VNYXBwaW5nRGVzY29yYXRvciI7Ci0gICAgcHVibGljIFRlc3RSZXNvdXJjZU1hcHBpbmdEZWNvcmF0b3JDb250cmlidXRvcigpIHsKLSAgICAgICAgc2V0RXhwZWN0ZWRFbGVtZW50VHlwZShSZXNvdXJjZU1hcHBpbmcuY2xhc3MpOwotICAgICAgICBzZXRTdWZmaXgoU1VGRklYKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvVGVzdFRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvVGVzdFRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNDE4YjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RUYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBUZXN0VGFibGVDb250ZW50UHJvdmlkZXIgaXMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZQotICogdGFiZWwgdmlld3MgaW4gdGhlIGRlY29yYXRvciB0ZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFRhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJVGFibGVFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgVGFibGVFbGVtZW50WzEwMF07Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQllbGVtZW50c1tpXSA9IG5ldyBUYWJsZUVsZW1lbnQoaSk7CQkJCi0JCX0KLQkJCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdAotCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdAotCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvVGVzdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNDI1ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvVGVzdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBBIGNvbnRlbnQgcHJvdmlkZXIgd2l0aCBhIGR1bW15IHRyZWUgc3RydWN0dXJlLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJVHJlZUVsZW1lbnQgcGFyZW50ID0gKFRyZWVFbGVtZW50KSBwYXJlbnRFbGVtZW50OwotCQlUcmVlRWxlbWVudFtdIGNoaWxkcmVuID0gbmV3IFRyZWVFbGVtZW50WzEwXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQljaGlsZHJlbltpXSA9IG5ldyBUcmVlRWxlbWVudChwYXJlbnQsIGkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuICgoVHJlZUVsZW1lbnQpIGVsZW1lbnQpLnBhcmVudDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCVRyZWVFbGVtZW50IHJvb3QgPSBuZXcgVHJlZUVsZW1lbnQobnVsbCwgMCk7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10geyByb290IH07Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vTm8gZGlzcG9zZSBiZWhhdmlvcgotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9UZXN0VW5hZGFwdGFibGVEZWNvcmF0b3JDb250cmlidXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RVbmFkYXB0YWJsZURlY29yYXRvckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTIyZDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kZWNvcmF0b3JzL1Rlc3RVbmFkYXB0YWJsZURlY29yYXRvckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnM7Ci0KLS8qKgotICogRGVjb3JhdG9yIHVzZWQgdG8gdGVzdCBhbiB1bmFkYXB0YWVkIGNvbnRyaWJ1dGlvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFVuYWRhcHRhYmxlRGVjb3JhdG9yQ29udHJpYnV0b3IgZXh0ZW5kcyBUZXN0QWRhcHRhYmxlRGVjb3JhdG9yQ29udHJpYnV0b3IgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWCA9ICJJQ29tbW9uLjIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuZ2VuZXJhbEFkYXB0YWJpbGl0eU9mZiI7Ci0gICAgcHVibGljIFRlc3RVbmFkYXB0YWJsZURlY29yYXRvckNvbnRyaWJ1dG9yKCkgewotICAgICAgICBzZXRTdWZmaXgoU1VGRklYKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RlY29yYXRvcnMvVHJlZUVsZW1lbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9UcmVlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzVlMTQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGVjb3JhdG9ycy9UcmVlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIFRoZSBUcmVlRWxlbWVudCBpcyB0aGUgZWxlbWVudCBkaXNwbGF5ZWQgaW4gdGhlCi0gKiB0ZXN0IHRyZWUgdmlld3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlRWxlbWVudCBleHRlbmRzIFRlc3RFbGVtZW50IHsKLQlpbnQgbGV2ZWw7Ci0KLQlUcmVlRWxlbWVudCBwYXJlbnQ7Ci0KLQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgxMCk7Ci0KLQlUcmVlRWxlbWVudChUcmVlRWxlbWVudCBwYXJlbnQsIGludCBpbmRleCkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCW5hbWUgPSAiUm9vdCI7Ci0JCQlsZXZlbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlsZXZlbCA9IHBhcmVudC5sZXZlbCArIDE7Ci0JCQluYW1lID0gIkxldmVsIiArIFN0cmluZy52YWx1ZU9mKGxldmVsKSArICIgLSAiICsgU3RyaW5nLnZhbHVlT2YoaW5kZXgpOwotCQkJcGFyZW50LmNoaWxkcmVuLmFkZCh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9EYXRhVHJhbnNmZXJUZXN0U3R1Yi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL0RhdGFUcmFuc2ZlclRlc3RTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MTgxOTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL0RhdGFUcmFuc2ZlclRlc3RTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotLyoqCi0gKiBGT1IgVVNFIEJZIFRFU1RTIE9OTFkhCi0gKiA8cD4KLSAqIFN0dWIgY2xhc3MgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gY2xhc3NlcyB2aXNpYmxlIHRvIHRoZSBwYWNrYWdlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2ZlcjwvY29kZT4uICBGb3IgdGhlIHB1cnBvc2UKLSAqIG9mIHRlc3RpbmcuCi0gKiA8L3A+Ci0gKiBAcHJpdmF0ZQotICovCi1wdWJsaWMgY2xhc3MgRGF0YVRyYW5zZmVyVGVzdFN0dWIgewotICAgIC8vUHJldmVudCBpbnN0YW50aWF0aW9uCi0gICAgcHJpdmF0ZSBEYXRhVHJhbnNmZXJUZXN0U3R1YigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlcyBhY2Nlc3MgdG8gYW4gaW5zdGFuY2Ugb2YgV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlRXhwb3J0UGFnZTEuCi0gICAgICogQHJldHVybiBJV2l6YXJkUGFnZSBhbiBpbnN0YW5jZSBvZiBXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VFeHBvcnRQYWdlMQotICAgICAqLwotICAgIC8qKgotICAgICAqIDFHSldEMkU6IElUUFVJOkFMTCAtIFRlc3QgY2xhc3NlcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkIGluIHB1YmxpYyBwYWNrYWdlcy4KLSAgICAgKiAKLSAgICAgcHVibGljIHN0YXRpYyBJV2l6YXJkUGFnZSBuZXdGaWxlU3lzdGVtUmVzb3VyY2VFeHBvcnRQYWdlMShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgcmV0dXJuIG5ldyBXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VFeHBvcnRQYWdlMShzZWxlY3Rpb24pOwotICAgICB9Ci0gICAgICovCi0gICAgLyoqCi0gICAgICogR2l2ZXMgYWNjZXNzIHRvIGFuIGluc3RhbmNlIG9mIFdpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUltcG9ydFBhZ2UxLgotICAgICAqIEByZXR1cm4gSVdpemFyZFBhZ2UgYW4gaW5zdGFuY2Ugb2YgV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlSW1wb3J0UGFnZTEKLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiAxR0pXRDJFOiBJVFBVSTpBTEwgLSBUZXN0IGNsYXNzZXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCBpbiBwdWJsaWMgcGFja2FnZXMuCi0gICAgICogCi0gICAgIHB1YmxpYyBzdGF0aWMgSVdpemFyZFBhZ2UgbmV3RmlsZVN5c3RlbVJlc291cmNlSW1wb3J0UGFnZTEoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICByZXR1cm4gbmV3IFdpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUltcG9ydFBhZ2UxKHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLSAgICAgfQotICAgICAqLwotICAgIC8qKgotICAgICAqIEdpdmVzIGFjY2VzcyB0byBhbiBpbnN0YW5jZSBvZiBXaXphcmRaaXBGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMS4KLSAgICAgKiBAcmV0dXJuIElXaXphcmRQYWdlIGFuIGluc3RhbmNlIG9mIFdpemFyZFppcEZpbGVSZXNvdXJjZUV4cG9ydFBhZ2UxCi0gICAgICovCi0gICAgLyoqCi0gICAgICogMUdKV0QyRTogSVRQVUk6QUxMIC0gVGVzdCBjbGFzc2VzIHNob3VsZCBub3QgYmUgcmVsZWFzZWQgaW4gcHVibGljIHBhY2thZ2VzLgotICAgICAqIAotICAgICBwdWJsaWMgc3RhdGljIElXaXphcmRQYWdlIG5ld1ppcEZpbGVSZXNvdXJjZUV4cG9ydFBhZ2UxKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICByZXR1cm4gbmV3IFdpemFyZFppcEZpbGVSZXNvdXJjZUV4cG9ydFBhZ2UxKHNlbGVjdGlvbik7Ci0gICAgIH0KLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBHaXZlcyBhY2Nlc3MgdG8gYW4gaW5zdGFuY2Ugb2YgV2l6YXJkWmlwRmlsZVJlc291cmNlSW1wb3J0UGFnZTEuCi0gICAgICogQHJldHVybiBJV2l6YXJkUGFnZSBhbiBpbnN0YW5jZSBvZiBXaXphcmRaaXBGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMQotICAgICAqLwotICAgIC8qKgotICAgICAqIDFHSldEMkU6IElUUFVJOkFMTCAtIFRlc3QgY2xhc3NlcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkIGluIHB1YmxpYyBwYWNrYWdlcy4KLSAgICAgKiAKLSAgICAgcHVibGljIHN0YXRpYyBJV2l6YXJkUGFnZSBuZXdaaXBGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgcmV0dXJuIG5ldyBXaXphcmRaaXBGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMShzZWxlY3Rpb24pOwotICAgICB9Ci0gICAgICovCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9EZXByZWNhdGVkVUlEaWFsb2dzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvRGVwcmVjYXRlZFVJRGlhbG9ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDlmY2NmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9EZXByZWNhdGVkVUlEaWFsb2dzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuWWVzTm9DYW5jZWxMaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLkFkYXB0YWJsZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaFBhcnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5EaWFsb2dDaGVjazsKLQotcHVibGljIGNsYXNzIERlcHJlY2F0ZWRVSURpYWxvZ3MgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgRGVwcmVjYXRlZFVJRGlhbG9ncyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gRGlhbG9nQ2hlY2suZ2V0U2hlbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUFsbCgpIHsKLSAgICAgICAgWWVzTm9DYW5jZWxMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBZZXNOb0NhbmNlbExpc3RTZWxlY3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSwgbmV3IEFkYXB0YWJsZUxpc3QoKSwKLSAgICAgICAgICAgICAgICBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCksCi0gICAgICAgICAgICAgICAgbmV3IFdvcmtiZW5jaFBhcnRMYWJlbFByb3ZpZGVyKCksIFdvcmtiZW5jaE1lc3NhZ2VzLkVkaXRvck1hbmFnZXJfc2F2ZVJlc291cmNlc01lc3NhZ2UpOwotICAgICAgICBkaWFsb2cuc2V0VGl0bGUoV29ya2JlbmNoTWVzc2FnZXMuRWRpdG9yTWFuYWdlcl9zYXZlUmVzb3VyY2VzVGl0bGUpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL0RlcHJlY2F0ZWRVSURpYWxvZ3NBdXRvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvRGVwcmVjYXRlZFVJRGlhbG9nc0F1dG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3ZTBlNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvRGVwcmVjYXRlZFVJRGlhbG9nc0F1dG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5ZZXNOb0NhbmNlbExpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuQWRhcHRhYmxlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoUGFydExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkRpYWxvZ0NoZWNrOwotCi1wdWJsaWMgY2xhc3MgRGVwcmVjYXRlZFVJRGlhbG9nc0F1dG8gZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgRGVwcmVjYXRlZFVJRGlhbG9nc0F1dG8oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgcmV0dXJuIERpYWxvZ0NoZWNrLmdldFNoZWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVBbGwoKSB7Ci0gICAgICAgIFllc05vQ2FuY2VsTGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgWWVzTm9DYW5jZWxMaXN0U2VsZWN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgIGdldFNoZWxsKCksIG5ldyBBZGFwdGFibGVMaXN0KCksCi0gICAgICAgICAgICAgICAgbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpLAotICAgICAgICAgICAgICAgIG5ldyBXb3JrYmVuY2hQYXJ0TGFiZWxQcm92aWRlcigpLCBXb3JrYmVuY2hNZXNzYWdlcy5FZGl0b3JNYW5hZ2VyX3NhdmVSZXNvdXJjZXNNZXNzYWdlKTsKLSAgICAgICAgZGlhbG9nLnNldFRpdGxlKFdvcmtiZW5jaE1lc3NhZ2VzLkVkaXRvck1hbmFnZXJfc2F2ZVJlc291cmNlc1RpdGxlKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL0RlcHJlY2F0ZWRVSVByZWZlcmVuY2VzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvRGVwcmVjYXRlZFVJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzNjIxNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvRGVwcmVjYXRlZFVJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlByb3BlcnR5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUHJvcGVydHlQYWdlQ29udHJpYnV0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUHJvcGVydHlQYWdlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRGlhbG9nQ2hlY2s7Ci0KLXB1YmxpYyBjbGFzcyBEZXByZWNhdGVkVUlQcmVmZXJlbmNlcyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIElQcm9qZWN0IF9wcm9qZWN0OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJEdW1teVByb2plY3QiOwotCi0gICAgcHVibGljIERlcHJlY2F0ZWRVSVByZWZlcmVuY2VzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0gICAgICAgIHJldHVybiBEaWFsb2dDaGVjay5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgSVByb2plY3QgZ2V0RHVtbXlQcm9qZWN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdHNbXSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb2plY3RzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2plY3RzW2ldLmdldE5hbWUoKS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0c1tpXS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9wcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotICAgICAgICAgICAgICAgICAgICBQUk9KRUNUX05BTUUpOwotICAgICAgICAgICAgX3Byb2plY3QuY3JlYXRlKG51bGwpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX3Byb2plY3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUR1bW15UHJvamVjdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChfcHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgX3Byb2plY3QuZGVsZXRlKHRydWUsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUHJlZmVyZW5jZURpYWxvZyBnZXRQcmVmZXJlbmNlRGlhbG9nKFN0cmluZyBpZCkgewotICAgICAgICBQcmVmZXJlbmNlRGlhbG9nV3JhcHBlciBkaWFsb2cgPSBudWxsOwotICAgICAgICBQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZ1dyYXBwZXIoZ2V0U2hlbGwoKSwgbWFuYWdlcik7Ci0gICAgICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IElXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5QUkVGRVJFTkNFX0RJQUxPRyB9KTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hbmFnZXIuZ2V0RWxlbWVudHMoCi0gICAgICAgICAgICAgICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyLlBSRV9PUkRFUikuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIElQcmVmZXJlbmNlTm9kZSBub2RlID0gKElQcmVmZXJlbmNlTm9kZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChub2RlLmdldElkKCkuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICBkaWFsb2cuc2hvd1BhZ2Uobm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlhbG9nOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJvcGVydHlEaWFsb2cgZ2V0UHJvcGVydHlEaWFsb2coU3RyaW5nIGlkKSB7Ci0gICAgICAgIFByb3BlcnR5RGlhbG9nV3JhcHBlciBkaWFsb2cgPSBudWxsOwotCi0gICAgICAgIFByb3BlcnR5UGFnZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBQcm9wZXJ0eVBhZ2VNYW5hZ2VyKCk7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9ICIiOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICIiOwotCi0gICAgICAgIElQcm9qZWN0IGVsZW1lbnQgPSBnZXREdW1teVByb2plY3QoKTsKLSAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbG9hZCBwYWdlcyBmb3IgdGhlIHNlbGVjdGlvbgotICAgICAgICAvLyBmaWxsIHRoZSBtYW5hZ2VyIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBtYXRjaGluZyBjb250cmlidXRvcnMKLSAgICAgICAgUHJvcGVydHlQYWdlQ29udHJpYnV0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKQotICAgICAgICAgICAgICAgIC5jb250cmlidXRlKG1hbmFnZXIsIGVsZW1lbnQpOwotCi0gICAgICAgIElXb3JrYmVuY2hBZGFwdGVyIGFkYXB0ZXIgPSAoSVdvcmtiZW5jaEFkYXB0ZXIpIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJV29ya2JlbmNoQWRhcHRlci5jbGFzcyk7Ci0gICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5hbWUgPSBhZGFwdGVyLmdldExhYmVsKGVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGVzdGluZyBpZiB0aGVyZSBhcmUgcGFnZXMgaW4gdGhlIG1hbmFnZXIKLSAgICAgICAgSXRlcmF0b3IgcGFnZXMgPSBtYW5hZ2VyLmdldEVsZW1lbnRzKFByZWZlcmVuY2VNYW5hZ2VyLlBSRV9PUkRFUikKLSAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKTsKLSAgICAgICAgaWYgKCFwYWdlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGl0bGUgPSBOTFMuYmluZChXb3JrYmVuY2hNZXNzYWdlcy5Qcm9wZXJ0eURpYWxvZ19wcm9wZXJ0eU1lc3NhZ2UsIChuZXcgT2JqZWN0W10geyBuYW1lIH0pKTsKLSAgICAgICAgICAgIGRpYWxvZyA9IG5ldyBQcm9wZXJ0eURpYWxvZ1dyYXBwZXIoZ2V0U2hlbGwoKSwgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudCkpOwotICAgICAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0gICAgICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IElXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5QUk9QRVJUWV9ESUFMT0cgfSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFuYWdlci5nZXRFbGVtZW50cygKLSAgICAgICAgICAgICAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgSVByZWZlcmVuY2VOb2RlIG5vZGUgPSAoSVByZWZlcmVuY2VOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdvcmtiZW5jaFByZWYoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRQcmVmZXJlbmNlRGlhbG9nKCJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuV29ya2JlbmNoIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlYXJhbmNlUHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5WaWV3cyIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRleHRFZGl0b3JQcmVmKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJlZmVyZW5jZURpYWxvZygib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLlRleHRFZGl0b3IiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVFZGl0b3JzUHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5GaWxlRWRpdG9ycyIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxIaXN0b3J5UHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5GaWxlU3RhdGVzIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJzcGVjdGl2ZXNQcmVmKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJlZmVyZW5jZURpYWxvZygib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLlBlcnNwZWN0aXZlcyIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mb1Byb3AoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRQcm9wZXJ0eURpYWxvZygib3JnLmVjbGlwc2UudWkucHJvcGVydHlwYWdlcy5pbmZvLmZpbGUiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2plY3RSZWZlcmVuY2VzUHJvcCgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByb3BlcnR5RGlhbG9nKCJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eXBhZ2VzLnByb2plY3QucmVmZXJlbmNlIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL0RlcHJlY2F0ZWRVSVByZWZlcmVuY2VzQXV0by5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL0RlcHJlY2F0ZWRVSVByZWZlcmVuY2VzQXV0by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTc3M2I3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9EZXByZWNhdGVkVUlQcmVmZXJlbmNlc0F1dG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlByb3BlcnR5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUHJvcGVydHlQYWdlQ29udHJpYnV0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUHJvcGVydHlQYWdlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRGlhbG9nQ2hlY2s7Ci0KLXB1YmxpYyBjbGFzcyBEZXByZWNhdGVkVUlQcmVmZXJlbmNlc0F1dG8gZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IF9wcm9qZWN0OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJEdW1teVByb2plY3QiOwotCi0gICAgcHVibGljIERlcHJlY2F0ZWRVSVByZWZlcmVuY2VzQXV0byhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0gICAgICAgIHJldHVybiBEaWFsb2dDaGVjay5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgSVByb2plY3QgZ2V0RHVtbXlQcm9qZWN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdHNbXSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb2plY3RzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2plY3RzW2ldLmdldE5hbWUoKS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0c1tpXS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9wcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotICAgICAgICAgICAgICAgICAgICBQUk9KRUNUX05BTUUpOwotICAgICAgICAgICAgX3Byb2plY3QuY3JlYXRlKG51bGwpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX3Byb2plY3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUR1bW15UHJvamVjdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChfcHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgX3Byb2plY3QuZGVsZXRlKHRydWUsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUHJlZmVyZW5jZURpYWxvZyBnZXRQcmVmZXJlbmNlRGlhbG9nKFN0cmluZyBpZCkgewotICAgICAgICBQcmVmZXJlbmNlRGlhbG9nV3JhcHBlciBkaWFsb2cgPSBudWxsOwotICAgICAgICBQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZ1dyYXBwZXIoZ2V0U2hlbGwoKSwgbWFuYWdlcik7Ci0gICAgICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IElXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5QUkVGRVJFTkNFX0RJQUxPRyB9KTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hbmFnZXIuZ2V0RWxlbWVudHMoCi0gICAgICAgICAgICAgICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyLlBSRV9PUkRFUikuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIElQcmVmZXJlbmNlTm9kZSBub2RlID0gKElQcmVmZXJlbmNlTm9kZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChub2RlLmdldElkKCkuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICBkaWFsb2cuc2hvd1BhZ2Uobm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlhbG9nOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJvcGVydHlEaWFsb2cgZ2V0UHJvcGVydHlEaWFsb2coU3RyaW5nIGlkKSB7Ci0gICAgICAgIFByb3BlcnR5RGlhbG9nV3JhcHBlciBkaWFsb2cgPSBudWxsOwotCi0gICAgICAgIFByb3BlcnR5UGFnZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBQcm9wZXJ0eVBhZ2VNYW5hZ2VyKCk7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9ICIiOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICIiOwotCi0gICAgICAgIElQcm9qZWN0IGVsZW1lbnQgPSBnZXREdW1teVByb2plY3QoKTsKLSAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbG9hZCBwYWdlcyBmb3IgdGhlIHNlbGVjdGlvbgotICAgICAgICAvLyBmaWxsIHRoZSBtYW5hZ2VyIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBtYXRjaGluZyBjb250cmlidXRvcnMKLSAgICAgICAgUHJvcGVydHlQYWdlQ29udHJpYnV0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKQotICAgICAgICAgICAgICAgIC5jb250cmlidXRlKG1hbmFnZXIsIGVsZW1lbnQpOwotCi0gICAgICAgIElXb3JrYmVuY2hBZGFwdGVyIGFkYXB0ZXIgPSAoSVdvcmtiZW5jaEFkYXB0ZXIpIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJV29ya2JlbmNoQWRhcHRlci5jbGFzcyk7Ci0gICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5hbWUgPSBhZGFwdGVyLmdldExhYmVsKGVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGVzdGluZyBpZiB0aGVyZSBhcmUgcGFnZXMgaW4gdGhlIG1hbmFnZXIKLSAgICAgICAgSXRlcmF0b3IgcGFnZXMgPSBtYW5hZ2VyLmdldEVsZW1lbnRzKFByZWZlcmVuY2VNYW5hZ2VyLlBSRV9PUkRFUikKLSAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKTsKLSAgICAgICAgaWYgKCFwYWdlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGl0bGUgPSBOTFMuYmluZChXb3JrYmVuY2hNZXNzYWdlcy5Qcm9wZXJ0eURpYWxvZ19wcm9wZXJ0eU1lc3NhZ2UsIChuZXcgT2JqZWN0W10geyBuYW1lIH0pKTsKLSAgICAgICAgICAgIGRpYWxvZyA9IG5ldyBQcm9wZXJ0eURpYWxvZ1dyYXBwZXIoZ2V0U2hlbGwoKSwgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudCkpOwotICAgICAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0gICAgICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IElXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5QUk9QRVJUWV9ESUFMT0cgfSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFuYWdlci5nZXRFbGVtZW50cygKLSAgICAgICAgICAgICAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgSVByZWZlcmVuY2VOb2RlIG5vZGUgPSAoSVByZWZlcmVuY2VOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdvcmtiZW5jaFByZWYoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRQcmVmZXJlbmNlRGlhbG9nKCJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuV29ya2JlbmNoIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcGVhcmFuY2VQcmVmKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJlZmVyZW5jZURpYWxvZygib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLlZpZXdzIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRUZXh0RWRpdG9yUHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5UZXh0RWRpdG9yIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVFZGl0b3JzUHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5GaWxlRWRpdG9ycyIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbEhpc3RvcnlQcmVmKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJlZmVyZW5jZURpYWxvZygib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkZpbGVTdGF0ZXMiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc3BlY3RpdmVzUHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5QZXJzcGVjdGl2ZXMiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvL09ubHkgcmVhbGx5IGNoZWNraW5nIGlmIHRoaXMgb3BlbnMgd2l0aG91dCBhbiBleGNlcHRpb24KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9udEVkaXRvcnNQcmVmKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJlZmVyZW5jZURpYWxvZygib3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9ncy5Gb250RmllbGRFZGl0b3JUZXN0UHJlZmVyZW5jZVBhZ2UiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mb1Byb3AoKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbW1lbnRlZCBvdXQgYmVjYXVzZSBpdCBnZW5lcmF0ZXMgYSBmYWlsdXJlCi0gICAgICAgICAqIG9mIGV4cGVjdCBhbmQgYWN0dWFsIHdpZHRoIHZhbHVlcy4gU3VzcGVjdCB0aGlzCi0gICAgICAgICAqIGlzIGFuIFNXVCBpc3N1ZS4KLSAgICAgICAgICogCi0gICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJvcGVydHlEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByb3BlcnR5cGFnZXMuaW5mby5maWxlIik7Ci0gICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdFJlZmVyZW5jZXNQcm9wKCkgewotICAgICAgICAvKgotICAgICAgICAgKiBDb21tZW50ZWQgb3V0IGJlY2F1c2UgaXQgZ2VuZXJhdGVzIGEgZmFpbHVyZQotICAgICAgICAgKiBvZiBleHBlY3QgYW5kIGFjdHVhbCB3aWR0aCB2YWx1ZXMuIFN1c3BlY3QgdGhpcwotICAgICAgICAgKiBpcyBhbiBTV1QgaXNzdWUuCi0gICAgICAgICAqIAotICAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByb3BlcnR5RGlhbG9nKCJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eXBhZ2VzLnByb2plY3QucmVmZXJlbmNlIik7Ci0gICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBlZGl0b3JzIHByZWZlcmVuY2UgcGFnZSBhbmQgdG9nZ2xlIHRoZQotICAgICAqIGVuYWJsZSBzdGF0ZSB0d2ljZSB0byBiZSBzdXJlIHRoZXJlIGFyZSBubyBlcnJvcnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZpZWxkRWRpdG9yRW5hYmxlUHJlZigpIHsKLQotICAgICAgICBQcmVmZXJlbmNlRGlhbG9nV3JhcHBlciBkaWFsb2cgPSBudWxsOwotICAgICAgICBQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZ1dyYXBwZXIoZ2V0U2hlbGwoKSwgbWFuYWdlcik7Ci0gICAgICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYW5hZ2VyLmdldEVsZW1lbnRzKAotICAgICAgICAgICAgICAgICAgICBQcmVmZXJlbmNlTWFuYWdlci5QUkVfT1JERVIpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IChJUHJlZmVyZW5jZU5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAobm9kZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzLkVuYWJsZVRlc3RQcmVmZXJlbmNlUGFnZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgRW5hYmxlVGVzdFByZWZlcmVuY2VQYWdlIHBhZ2UgPSAoRW5hYmxlVGVzdFByZWZlcmVuY2VQYWdlKSBkaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFnZShub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgcGFnZS5mbGlwU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgcGFnZS5mbGlwU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9EZXByZWNhdGVkVUlXaXphcmRzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvRGVwcmVjYXRlZFVJV2l6YXJkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWM3MDQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9EZXByZWNhdGVkVUlXaXphcmRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRpYWxvZ3M7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5FeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5JbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5OZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLm5ld3Jlc291cmNlLlJlc291cmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkRpYWxvZ0NoZWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdGaWxlUmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld0ZvbGRlclJlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQ7Ci0KLXB1YmxpYyBjbGFzcyBEZXByZWNhdGVkVUlXaXphcmRzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX1dJRFRIID0gNDcwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfSEVJR0hUID0gNTUwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfV0lEVEhfMiA9IDUwMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX0hFSUdIVF8yID0gNTAwOwotCi0gICAgcHVibGljIERlcHJlY2F0ZWRVSVdpemFyZHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgcmV0dXJuIERpYWxvZ0NoZWNrLmdldFNoZWxsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLSAgICAgICAgcmV0dXJuIFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBXaXphcmREaWFsb2cgZXhwb3J0V2l6YXJkKElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgRXhwb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBFeHBvcnRXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkLmluaXQoZ2V0V29ya2JlbmNoKCksIG51bGwpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oIkV4cG9ydFJlc291cmNlc0FjdGlvbiIpOwotICAgICAgICBpZiAod2l6YXJkU2V0dGluZ3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgLmFkZE5ld1NlY3Rpb24oIkV4cG9ydFJlc291cmNlc0FjdGlvbiIpOwotICAgICAgICB3aXphcmQuc2V0RGlhbG9nU2V0dGluZ3Mod2l6YXJkU2V0dGluZ3MpOwotICAgICAgICB3aXphcmQuc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoCi0gICAgICAgICAgICAgICAgTWF0aC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSCwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUKTsKLSAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IElXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5FWFBPUlRfV0laQVJEIH0pOwotCi0gICAgICAgIGlmIChwYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhZ2Uuc2V0V2l6YXJkKHdpemFyZCk7Ci0gICAgICAgICAgICBkaWFsb2cuc2hvd1BhZ2UocGFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpYWxvZzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFdpemFyZERpYWxvZyBpbXBvcnRXaXphcmQoSVdpemFyZFBhZ2UgcGFnZSkgewotICAgICAgICBJbXBvcnRXaXphcmQgd2l6YXJkID0gbmV3IEltcG9ydFdpemFyZCgpOwotICAgICAgICB3aXphcmQuaW5pdChnZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAuZ2V0U2VjdGlvbigiSW1wb3J0UmVzb3VyY2VzQWN0aW9uIik7Ci0gICAgICAgIGlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotICAgICAgICAgICAgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAuYWRkTmV3U2VjdGlvbigiSW1wb3J0UmVzb3VyY2VzQWN0aW9uIik7Ci0gICAgICAgIHdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0gICAgICAgIHdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0KLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEgsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLSAgICAgICAgICAgICAgICBTSVpJTkdfV0laQVJEX0hFSUdIVCk7Ci0gICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBJV29ya2JlbmNoSGVscENvbnRleHRJZHMuSU1QT1JUX1dJWkFSRCB9KTsKLQotICAgICAgICBpZiAocGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYWdlLnNldFdpemFyZCh3aXphcmQpOwotICAgICAgICAgICAgZGlhbG9nLnNob3dQYWdlKHBhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4cG9ydFJlc291cmNlcygpIHsvL3JlZmVyZW5jZTogRXhwb3J0UmVzb3VyY2VzQWN0aW9uCi0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBleHBvcnRXaXphcmQobnVsbCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDFHSldEMkU6IElUUFVJOkFMTCAtIFRlc3QgY2xhc3NlcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkIGluIHB1YmxpYyBwYWNrYWdlcy4KLSAgICAgKiAKLSAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVTeXN0ZW1FeHBvcnQoKSB7Ci0gICAgIERpYWxvZyBkaWFsb2cgPSBleHBvcnRXaXphcmQoIERhdGFUcmFuc2ZlclRlc3RTdHViLm5ld0ZpbGVTeXN0ZW1SZXNvdXJjZUV4cG9ydFBhZ2UxKG51bGwpICk7Ci0gICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgICB9Ci0gICAgIHB1YmxpYyB2b2lkIHRlc3RaaXBGaWxlRXhwb3J0KCkgewotICAgICBEaWFsb2cgZGlhbG9nID0gZXhwb3J0V2l6YXJkKCBEYXRhVHJhbnNmZXJUZXN0U3R1Yi5uZXdaaXBGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMShudWxsKSApOwotICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICAgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRSZXNvdXJjZXMoKSB7Ly9yZWZlcmVuY2U6IEltcG9ydFJlc291cmNlc0FjdGlvbgotICAgICAgICBEaWFsb2cgZGlhbG9nID0gaW1wb3J0V2l6YXJkKG51bGwpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAxR0pXRDJFOiBJVFBVSTpBTEwgLSBUZXN0IGNsYXNzZXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCBpbiBwdWJsaWMgcGFja2FnZXMuCi0gICAgICogCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlU3lzdGVtSW1wb3J0KCkgewotICAgICBEaWFsb2cgZGlhbG9nID0gaW1wb3J0V2l6YXJkKCBEYXRhVHJhbnNmZXJUZXN0U3R1Yi5uZXdGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMShXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSApOwotICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICAgfQotICAgICBwdWJsaWMgdm9pZCB0ZXN0WmlwRmlsZUltcG9ydCgpIHsKLSAgICAgRGlhbG9nIGRpYWxvZyA9IGltcG9ydFdpemFyZCggRGF0YVRyYW5zZmVyVGVzdFN0dWIubmV3WmlwRmlsZVJlc291cmNlSW1wb3J0UGFnZTEobnVsbCkgKTsKLSAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3RmlsZSgpIHsKLSAgICAgICAgQmFzaWNOZXdGaWxlUmVzb3VyY2VXaXphcmQgd2l6YXJkID0gbmV3IEJhc2ljTmV3RmlsZVJlc291cmNlV2l6YXJkKCk7Ci0gICAgICAgIHdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotICAgICAgICB3aXphcmQuc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCgiQ3JlYXRlRmlsZUFjdGlvbl90aXRsZSIpOwotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgSUlERUhlbHBDb250ZXh0SWRzLk5FV19GSUxFX1dJWkFSRCB9KTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld0ZvbGRlcigpIHsKLSAgICAgICAgQmFzaWNOZXdGb2xkZXJSZXNvdXJjZVdpemFyZCB3aXphcmQgPSBuZXcgQmFzaWNOZXdGb2xkZXJSZXNvdXJjZVdpemFyZCgpOwotICAgICAgICB3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLSAgICAgICAgd2l6YXJkLnNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoCi0gICAgICAgICAgICAgICAgIkNyZWF0ZUZvbGRlckFjdGlvbl90aXRsZSIpOyAKLSAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IElJREVIZWxwQ29udGV4dElkcy5ORVdfRk9MREVSX1dJWkFSRCB9KTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld1Byb2plY3RQYWdlMSgpIHsKLSAgICAgICAgQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQgd2l6YXJkID0gbmV3IEJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkKCk7Ci0gICAgICAgIHdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotICAgICAgICB3aXphcmQuc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0KLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEhfMiwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUXzIpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KCJDcmVhdGVGaWxlQWN0aW9uX3RpdGxlIik7IAotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1dJWkFSRCB9KTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld1Byb2plY3RQYWdlMigpIHsKLSAgICAgICAgQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQgd2l6YXJkID0gbmV3IEJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkKCk7Ci0gICAgICAgIHdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotICAgICAgICB3aXphcmQuc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0KLSAgICAgICAgV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZVBhZ2UgcGFnZSA9IG5ldyBXaXphcmROZXdQcm9qZWN0UmVmZXJlbmNlUGFnZSgKLSAgICAgICAgICAgICAgICAiYmFzaWNSZWZlcmVuY2VQcm9qZWN0UGFnZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcGFnZS5zZXRUaXRsZShSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfcmVmZXJlbmNlVGl0bGUpOwotICAgICAgICBwYWdlLnNldERlc2NyaXB0aW9uKFJlc291cmNlTWVzc2FnZXMuTmV3UHJvamVjdF9yZWZlcmVuY2VEZXNjcmlwdGlvbik7Ci0gICAgICAgIHBhZ2Uuc2V0V2l6YXJkKHdpemFyZCk7Ci0KLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEhfMiwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUXzIpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KCJDcmVhdGVGaWxlQWN0aW9uX3RpdGxlIik7IAotICAgICAgICBkaWFsb2cuc2hvd1BhZ2UocGFnZSk7Ci0gICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBJSURFSGVscENvbnRleHRJZHMuTkVXX1BST0pFQ1RfV0laQVJEIH0pOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3UHJvamVjdCgpIHsKLSAgICAgICAgLy8gQ3JlYXRlIHdpemFyZCBzZWxlY3Rpb24gd2l6YXJkLgotICAgICAgICBOZXdXaXphcmQgd2l6YXJkID0gbmV3IE5ld1dpemFyZCgpOwotICAgICAgICB3aXphcmQuc2V0UHJvamVjdHNPbmx5KHRydWUpOwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uVG9QYXNzID0gbnVsbDsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgICAgc2VsZWN0aW9uVG9QYXNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNlbGVjdGlvblRvUGFzcyA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0gICAgICAgIHdpemFyZC5pbml0KGdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb25Ub1Bhc3MpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oIk5ld1dpemFyZEFjdGlvbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHdpemFyZFNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzLmFkZE5ld1NlY3Rpb24oIk5ld1dpemFyZEFjdGlvbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLSAgICAgICAgd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQotICAgICAgICAvLyBDcmVhdGUgd2l6YXJkIGRpYWxvZy4KLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEhfMiwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUXzIpOwotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1dJWkFSRCB9KTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld1Jlc291cmNlKCkgewotICAgICAgICBOZXdXaXphcmQgd2l6YXJkID0gbmV3IE5ld1dpemFyZCgpOwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uVG9QYXNzID0gbnVsbDsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgICAgc2VsZWN0aW9uVG9QYXNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNlbGVjdGlvblRvUGFzcyA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0gICAgICAgIHdpemFyZC5pbml0KGdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb25Ub1Bhc3MpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oIk5ld1dpemFyZEFjdGlvbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHdpemFyZFNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzLmFkZE5ld1NlY3Rpb24oIk5ld1dpemFyZEFjdGlvbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLSAgICAgICAgd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoCi0gICAgICAgICAgICAgICAgTWF0aC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSF8yLCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0gICAgICAgICAgICAgICAgU0laSU5HX1dJWkFSRF9IRUlHSFRfMik7Ci0gICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBJV29ya2JlbmNoSGVscENvbnRleHRJZHMuTkVXX1dJWkFSRCB9KTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvRGVwcmVjYXRlZFVJV2l6YXJkc0F1dG8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9EZXByZWNhdGVkVUlXaXphcmRzQXV0by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDdiMjNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9EZXByZWNhdGVkVUlXaXphcmRzQXV0by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdQcm9qZWN0UmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLkV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLkltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMubmV3cmVzb3VyY2UuUmVzb3VyY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRGlhbG9nQ2hlY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdGaWxlUmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld0ZvbGRlclJlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQ7Ci0KLXB1YmxpYyBjbGFzcyBEZXByZWNhdGVkVUlXaXphcmRzQXV0byBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9XSURUSCA9IDQ3MDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX0hFSUdIVCA9IDU1MDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX1dJRFRIXzIgPSA1MDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9IRUlHSFRfMiA9IDUwMDsKLQotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotICAgIHB1YmxpYyBEZXByZWNhdGVkVUlXaXphcmRzQXV0byhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gRGlhbG9nQ2hlY2suZ2V0U2hlbGwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotICAgICAgICByZXR1cm4gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFdpemFyZERpYWxvZyBleHBvcnRXaXphcmQoSVdpemFyZFBhZ2UgcGFnZSkgewotICAgICAgICBFeHBvcnRXaXphcmQgd2l6YXJkID0gbmV3IEV4cG9ydFdpemFyZCgpOwotICAgICAgICB3aXphcmQuaW5pdChnZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAuZ2V0U2VjdGlvbigiRXhwb3J0UmVzb3VyY2VzQWN0aW9uIik7Ci0gICAgICAgIGlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotICAgICAgICAgICAgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAuYWRkTmV3U2VjdGlvbigiRXhwb3J0UmVzb3VyY2VzQWN0aW9uIik7Ci0gICAgICAgIHdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0gICAgICAgIHdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0gICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSgKLSAgICAgICAgICAgICAgICBNYXRoLm1heChTSVpJTkdfV0laQVJEX1dJRFRILCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0gICAgICAgICAgICAgICAgU0laSU5HX1dJWkFSRF9IRUlHSFQpOwotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzLkVYUE9SVF9XSVpBUkQgfSk7Ci0KLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFnZS5zZXRXaXphcmQod2l6YXJkKTsKLSAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShwYWdlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlhbG9nOwotICAgIH0KLQotICAgIHByaXZhdGUgV2l6YXJkRGlhbG9nIGltcG9ydFdpemFyZChJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgIEltcG9ydFdpemFyZCB3aXphcmQgPSBuZXcgSW1wb3J0V2l6YXJkKCk7Ci0gICAgICAgIHdpemFyZC5pbml0KGdldFdvcmtiZW5jaCgpLCBudWxsKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uKCJJbXBvcnRSZXNvdXJjZXNBY3Rpb24iKTsKLSAgICAgICAgaWYgKHdpemFyZFNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgIC5hZGROZXdTZWN0aW9uKCJJbXBvcnRSZXNvdXJjZXNBY3Rpb24iKTsKLSAgICAgICAgd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLSAgICAgICAgd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoCi0gICAgICAgICAgICAgICAgTWF0aC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSCwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUKTsKLSAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IElXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5JTVBPUlRfV0laQVJEIH0pOwotCi0gICAgICAgIGlmIChwYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhZ2Uuc2V0V2l6YXJkKHdpemFyZCk7Ci0gICAgICAgICAgICBkaWFsb2cuc2hvd1BhZ2UocGFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpYWxvZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLSAgICAgICAgICAgICAgICBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0UmVzb3VyY2VzKCkgey8vcmVmZXJlbmNlOiBFeHBvcnRSZXNvdXJjZXNBY3Rpb24KLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGV4cG9ydFdpemFyZChudWxsKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAxR0pXRDJFOiBJVFBVSTpBTEwgLSBUZXN0IGNsYXNzZXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCBpbiBwdWJsaWMgcGFja2FnZXMuCi0gICAgICogCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlU3lzdGVtRXhwb3J0KCkgewotICAgICBEaWFsb2cgZGlhbG9nID0gZXhwb3J0V2l6YXJkKCBEYXRhVHJhbnNmZXJUZXN0U3R1Yi5uZXdGaWxlU3lzdGVtUmVzb3VyY2VFeHBvcnRQYWdlMShudWxsKSApOwotICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgICB9Ci0gICAgIHB1YmxpYyB2b2lkIHRlc3RaaXBGaWxlRXhwb3J0KCkgewotICAgICBEaWFsb2cgZGlhbG9nID0gZXhwb3J0V2l6YXJkKCBEYXRhVHJhbnNmZXJUZXN0U3R1Yi5uZXdaaXBGaWxlUmVzb3VyY2VFeHBvcnRQYWdlMShudWxsKSApOwotICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgICB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEltcG9ydFJlc291cmNlcygpIHsvL3JlZmVyZW5jZTogSW1wb3J0UmVzb3VyY2VzQWN0aW9uCi0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBpbXBvcnRXaXphcmQobnVsbCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogMUdKV0QyRTogSVRQVUk6QUxMIC0gVGVzdCBjbGFzc2VzIHNob3VsZCBub3QgYmUgcmVsZWFzZWQgaW4gcHVibGljIHBhY2thZ2VzLgotICAgICAqIAotICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVN5c3RlbUltcG9ydCgpIHsKLSAgICAgRGlhbG9nIGRpYWxvZyA9IGltcG9ydFdpemFyZCggRGF0YVRyYW5zZmVyVGVzdFN0dWIubmV3RmlsZVN5c3RlbVJlc291cmNlSW1wb3J0UGFnZTEoV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkgKTsKLSAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICAgfQotICAgICBwdWJsaWMgdm9pZCB0ZXN0WmlwRmlsZUltcG9ydCgpIHsKLSAgICAgRGlhbG9nIGRpYWxvZyA9IGltcG9ydFdpemFyZCggRGF0YVRyYW5zZmVyVGVzdFN0dWIubmV3WmlwRmlsZVJlc291cmNlSW1wb3J0UGFnZTEobnVsbCkgKTsKLSAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICAgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdGaWxlKCkgewotICAgICAgICBCYXNpY05ld0ZpbGVSZXNvdXJjZVdpemFyZCB3aXphcmQgPSBuZXcgQmFzaWNOZXdGaWxlUmVzb3VyY2VXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIHdpemFyZC5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KCJDcmVhdGVGaWxlQWN0aW9uX3RpdGxlIik7IAotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgSUlERUhlbHBDb250ZXh0SWRzLk5FV19GSUxFX1dJWkFSRCB9KTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBidWcgMzA3MTkgW0xpbmtlZCBSZXNvdXJjZXNdIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gc2V0dGluZyBmaWxlbmFtZSBmb3IgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3RmlsZTIoKSB7Ci0gICAgICAgIEJhc2ljTmV3RmlsZVJlc291cmNlV2l6YXJkIHdpemFyZCA9IG5ldyBCYXNpY05ld0ZpbGVSZXNvdXJjZVdpemFyZCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotICAgICAgICAgICAgICAgIHN1cGVyLmFkZFBhZ2VzKCk7Ci0gICAgICAgICAgICAgICAgSVdpemFyZFBhZ2UgcGFnZSA9IGdldFBhZ2UoIm5ld0ZpbGVQYWdlMSIpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIG5ld0ZpbGVQYWdlMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGluc3RhbmNlb2YgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSk7Ci0gICAgICAgICAgICAgICAgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBmaWxlQ3JlYXRpb25QYWdlID0gKFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UpIHBhZ2U7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgidGVzdE5ld0ZpbGUyIik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKHByb2plY3QuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgZmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZSgidGVzdEZpbGVOYW1lLnRlc3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICB3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLSAgICAgICAgd2l6YXJkLnNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoIkNyZWF0ZUZpbGVBY3Rpb25fdGl0bGUiKTsgCi0gICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBJSURFSGVscENvbnRleHRJZHMuTkVXX0ZJTEVfV0laQVJEKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3Rm9sZGVyKCkgewotICAgICAgICBCYXNpY05ld0ZvbGRlclJlc291cmNlV2l6YXJkIHdpemFyZCA9IG5ldyBCYXNpY05ld0ZvbGRlclJlc291cmNlV2l6YXJkKCk7Ci0gICAgICAgIHdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotICAgICAgICB3aXphcmQuc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCgiQ3JlYXRlRm9sZGVyQWN0aW9uX3RpdGxlIik7IAotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgSUlERUhlbHBDb250ZXh0SWRzLk5FV19GT0xERVJfV0laQVJEIH0pOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdQcm9qZWN0UGFnZTEoKSB7Ci0gICAgICAgIEJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkIHdpemFyZCA9IG5ldyBCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZCgpOwotICAgICAgICB3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBudWxsKTsKLSAgICAgICAgd2l6YXJkLnNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCi0gICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSgKLSAgICAgICAgICAgICAgICBNYXRoLm1heChTSVpJTkdfV0laQVJEX1dJRFRIXzIsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLSAgICAgICAgICAgICAgICBTSVpJTkdfV0laQVJEX0hFSUdIVF8yKTsKLSAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCgiQ3JlYXRlRmlsZUFjdGlvbl90aXRsZSIpOwotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1dJWkFSRCB9KTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3UHJvamVjdFBhZ2UyKCkgewotICAgICAgICBCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZCB3aXphcmQgPSBuZXcgQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0gICAgICAgIHdpemFyZC5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQotICAgICAgICBXaXphcmROZXdQcm9qZWN0UmVmZXJlbmNlUGFnZSBwYWdlID0gbmV3IFdpemFyZE5ld1Byb2plY3RSZWZlcmVuY2VQYWdlKAotICAgICAgICAgICAgICAgICJiYXNpY1JlZmVyZW5jZVByb2plY3RQYWdlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBwYWdlLnNldFRpdGxlKFJlc291cmNlTWVzc2FnZXMuTmV3UHJvamVjdF9yZWZlcmVuY2VUaXRsZSk7Ci0gICAgICAgIHBhZ2Uuc2V0RGVzY3JpcHRpb24oUmVzb3VyY2VNZXNzYWdlcy5OZXdQcm9qZWN0X3JlZmVyZW5jZURlc2NyaXB0aW9uKTsKLSAgICAgICAgcGFnZS5zZXRXaXphcmQod2l6YXJkKTsKLQotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoCi0gICAgICAgICAgICAgICAgTWF0aC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSF8yLCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0gICAgICAgICAgICAgICAgU0laSU5HX1dJWkFSRF9IRUlHSFRfMik7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoIkNyZWF0ZUZpbGVBY3Rpb25fdGl0bGUiKTsgCQkKLSAgICAgICAgZGlhbG9nLnNob3dQYWdlKHBhZ2UpOwotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1dJWkFSRCB9KTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3UHJvamVjdCgpIHsKLSAgICAgICAgLy8gQ3JlYXRlIHdpemFyZCBzZWxlY3Rpb24gd2l6YXJkLgotICAgICAgICBOZXdXaXphcmQgd2l6YXJkID0gbmV3IE5ld1dpemFyZCgpOwotICAgICAgICB3aXphcmQuc2V0UHJvamVjdHNPbmx5KHRydWUpOwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uVG9QYXNzID0gbnVsbDsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgICAgc2VsZWN0aW9uVG9QYXNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNlbGVjdGlvblRvUGFzcyA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0gICAgICAgIHdpemFyZC5pbml0KGdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb25Ub1Bhc3MpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oIk5ld1dpemFyZEFjdGlvbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHdpemFyZFNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzLmFkZE5ld1NlY3Rpb24oIk5ld1dpemFyZEFjdGlvbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLSAgICAgICAgd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQotICAgICAgICAvLyBDcmVhdGUgd2l6YXJkIGRpYWxvZy4KLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEhfMiwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUXzIpOwotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1dJWkFSRCB9KTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3UmVzb3VyY2UoKSB7Ci0gICAgICAgIE5ld1dpemFyZCB3aXphcmQgPSBuZXcgTmV3V2l6YXJkKCk7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLSAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOwotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25Ub1Bhc3MgPSBudWxsOwotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICAgICAgICBzZWxlY3Rpb25Ub1Bhc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2VsZWN0aW9uVG9QYXNzID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLSAgICAgICAgd2l6YXJkLmluaXQoZ2V0V29ya2JlbmNoKCksIHNlbGVjdGlvblRvUGFzcyk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAuZ2V0U2VjdGlvbigiTmV3V2l6YXJkQWN0aW9uIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBpZiAod2l6YXJkU2V0dGluZ3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MuYWRkTmV3U2VjdGlvbigiTmV3V2l6YXJkQWN0aW9uIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB3aXphcmQuc2V0RGlhbG9nU2V0dGluZ3Mod2l6YXJkU2V0dGluZ3MpOwotICAgICAgICB3aXphcmQuc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCi0gICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSgKLSAgICAgICAgICAgICAgICBNYXRoLm1heChTSVpJTkdfV0laQVJEX1dJRFRIXzIsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLSAgICAgICAgICAgICAgICBTSVpJTkdfV0laQVJEX0hFSUdIVF8yKTsKLSAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IElXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5ORVdfV0laQVJEIH0pOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvRW5hYmxlVGVzdFByZWZlcmVuY2VQYWdlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvRW5hYmxlVGVzdFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNTAyMDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL0VuYWJsZVRlc3RQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Db2xvckZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZvbnRGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlBhdGhFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5SYWRpb0dyb3VwRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFbmFibGVUZXN0UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlCi0gICAgICAgIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotICAgIHByaXZhdGUgQm9vbGVhbkZpZWxkRWRpdG9yIGJlOwotCi0gICAgcHJpdmF0ZSBDb2xvckZpZWxkRWRpdG9yIGNlOwotCi0gICAgcHJpdmF0ZSBGb250RmllbGRFZGl0b3IgZmU7Ci0KLSAgICBwcml2YXRlIFBhdGhFZGl0b3IgcGU7Ci0KLSAgICBwcml2YXRlIFJhZGlvR3JvdXBGaWVsZEVkaXRvciByZzsKLQotICAgIHByaXZhdGUgU3RyaW5nRmllbGRFZGl0b3Igc2U7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBiZVBhcmVudDsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIGNlUGFyZW50OwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgZmVQYXJlbnQ7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBwZVBhcmVudDsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIHJnUGFyZW50OwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgc2VQYXJlbnQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlZFN0YXRlID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBFbmFibGVUZXN0UHJlZmVyZW5jZVBhZ2UoKSB7Ci0gICAgICAgIHN1cGVyKEdSSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZsaXBTdGF0ZSgpIHsKLSAgICAgICAgaWYgKGVuYWJsZWRTdGF0ZSkKLSAgICAgICAgICAgIGVuYWJsZWRTdGF0ZSA9IGZhbHNlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlbmFibGVkU3RhdGUgPSB0cnVlOwotCi0gICAgICAgIGJlLnNldEVuYWJsZWQoZW5hYmxlZFN0YXRlLCBiZVBhcmVudCk7Ci0gICAgICAgIGNlLnNldEVuYWJsZWQoZW5hYmxlZFN0YXRlLCBjZVBhcmVudCk7Ci0gICAgICAgIGZlLnNldEVuYWJsZWQoZW5hYmxlZFN0YXRlLCBmZVBhcmVudCk7Ci0gICAgICAgIHBlLnNldEVuYWJsZWQoZW5hYmxlZFN0YXRlLCBwZVBhcmVudCk7Ci0gICAgICAgIHJnLnNldEVuYWJsZWQoZW5hYmxlZFN0YXRlLCByZ1BhcmVudCk7Ci0gICAgICAgIHNlLnNldEVuYWJsZWQoZW5hYmxlZFN0YXRlLCBzZVBhcmVudCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSNjcmVhdGVGaWVsZEVkaXRvcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLQotICAgICAgICBTdHJpbmdbXVtdIGxhYmVsc0FuZFZhbHVlcyA9IG5ldyBTdHJpbmdbXVtdIHsgeyAiTGFiZWwgMSIsICJWYWx1ZSAxIiB9LAotICAgICAgICAgICAgICAgIHsgIkxhYmVsIDIiLCAiVmFsdWUgMiIgfSB9OwotCi0gICAgICAgIGJlUGFyZW50ID0gZ2V0RmllbGRFZGl0b3JQYXJlbnQoKTsKLSAgICAgICAgYmUgPSBuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKCJCb29sZWFuVmFsdWUiLCAiQm9vbGVhblRlc3QiLCBiZVBhcmVudCk7Ci0gICAgICAgIGFkZEZpZWxkKGJlKTsKLQotICAgICAgICBjZVBhcmVudCA9IGdldEZpZWxkRWRpdG9yUGFyZW50KCk7Ci0gICAgICAgIGNlID0gbmV3IENvbG9yRmllbGRFZGl0b3IoIkNvbG9yVmFsdWUiLCAiQ29sb3IgVGVzdCIsIGNlUGFyZW50KTsKLSAgICAgICAgYWRkRmllbGQoY2UpOwotCi0gICAgICAgIGZlUGFyZW50ID0gZ2V0RmllbGRFZGl0b3JQYXJlbnQoKTsKLSAgICAgICAgZmUgPSBuZXcgRm9udEZpZWxkRWRpdG9yKCJGb250VmFsdWUiLCAiRm9udCBUZXN0IiwgZmVQYXJlbnQpOwotICAgICAgICBhZGRGaWVsZChmZSk7Ci0KLSAgICAgICAgcGVQYXJlbnQgPSBnZXRGaWVsZEVkaXRvclBhcmVudCgpOwotICAgICAgICBwZSA9IG5ldyBQYXRoRWRpdG9yKCJQYXRoVmFsdWUiLCAiUGF0aCBUZXN0IiwgIkM6XHRlbXAiLCBwZVBhcmVudCk7Ci0gICAgICAgIGFkZEZpZWxkKHBlKTsKLQotICAgICAgICByZ1BhcmVudCA9IGdldEZpZWxkRWRpdG9yUGFyZW50KCk7Ci0gICAgICAgIHJnID0gbmV3IFJhZGlvR3JvdXBGaWVsZEVkaXRvcigiUmFkaW8gVmFsdWUiLCAiUmFkaW8gVGVzdCIsIDIsCi0gICAgICAgICAgICAgICAgbGFiZWxzQW5kVmFsdWVzLCByZ1BhcmVudCk7Ci0gICAgICAgIGFkZEZpZWxkKHJnKTsKLQotICAgICAgICBzZVBhcmVudCA9IGdldEZpZWxkRWRpdG9yUGFyZW50KCk7Ci0gICAgICAgIHNlID0gbmV3IFN0cmluZ0ZpZWxkRWRpdG9yKCJTdHJpbmcgVmFsdWUiLCAiU3RyaW5nIEVkaXRvciIsIHNlUGFyZW50KTsKLSAgICAgICAgYWRkRmllbGQoc2UpOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICAgICAgICBCdXR0b24gZW5hYmxlZEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGVuYWJsZWRCdXR0b24uc2V0VGV4dCgiU3dpdGNoIEVuYWJsZWQgU3RhdGUiKTsKLQotICAgICAgICBlbmFibGVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBmbGlwU3RhdGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBmbGlwU3RhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChJV29ya2JlbmNoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9Gb250RmllbGRFZGl0b3JUZXN0UHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9Gb250RmllbGRFZGl0b3JUZXN0UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlYjc4OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvRm9udEZpZWxkRWRpdG9yVGVzdFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZvbnRGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogVGhlIEZpZWxkIEVkaXRvciBQcmVmZXJlbmNlIHBhZ2UgaXMgYSB0ZXN0IG9mIHRoZSBmb250IGZpZWxkCi0gKiBlZGl0b3JzIHdpdGggYW5kIHdpdGhvdXQgcHJldmlld2Vycy4KLSAqLwotcHVibGljIGNsYXNzIEZvbnRGaWVsZEVkaXRvclRlc3RQcmVmZXJlbmNlUGFnZSBleHRlbmRzCi0gICAgICAgIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBwcmVmZXJlbmNlIHBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIEZvbnRGaWVsZEVkaXRvclRlc3RQcmVmZXJlbmNlUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoR1JJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UjY3JlYXRlRmllbGRFZGl0b3JzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGZlUGFyZW50ID0gZ2V0RmllbGRFZGl0b3JQYXJlbnQoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgLy9DcmVhdGUgb25lIHdpdGggYSBwcmV2aWV3Ci0gICAgICAgICAgICBhZGRGaWVsZChuZXcgRm9udEZpZWxkRWRpdG9yKCJGb250VmFsdWUiICsgU3RyaW5nLnZhbHVlT2YoaSksCi0gICAgICAgICAgICAgICAgICAgICJGb250IFRlc3QiICsgU3RyaW5nLnZhbHVlT2YoaSksICJQcmV2aWV3IiwgZmVQYXJlbnQpKTsKLQotICAgICAgICAgICAgLy9DcmVhdGUgb25lIHdpdGhvdXQKLSAgICAgICAgICAgIGFkZEZpZWxkKG5ldyBGb250RmllbGRFZGl0b3IoCi0gICAgICAgICAgICAgICAgICAgICJGb250VmFsdWVEZWZhdWx0IiArIFN0cmluZy52YWx1ZU9mKGkpLCAiRm9udCBUZXN0IERlZmF1bHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmcudmFsdWVPZihpKSwgZmVQYXJlbnQpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9OYXZpZ2F0b3JUZXN0U3R1Yi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL05hdmlnYXRvclRlc3RTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTI0MjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL05hdmlnYXRvclRlc3RTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotLyoqCi0gKiBGT1IgVVNFIEJZIFRFU1RTIE9OTFkhCi0gKiA8cD4KLSAqIFN0dWIgY2xhc3MgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gY2xhc3NlcyB2aXNpYmxlIHRvIHRoZSBwYWNrYWdlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I8L2NvZGU+LiAgRm9yIHRoZSBwdXJwb3NlIG9mCi0gKiB0ZXN0aW5nLgotICogPC9wPgotICogQHByaXZhdGUKLSAqLwotCi1wdWJsaWMgY2xhc3MgTmF2aWdhdG9yVGVzdFN0dWIgewotICAgIC8vUHJldmVudCBpbnN0YW50aWF0aW9uCi0gICAgcHJpdmF0ZSBOYXZpZ2F0b3JUZXN0U3R1YigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlcyBhY2Nlc3MgdG8gYW4gaW5zdGFuY2Ugb2YgR290b1Jlc291cmNlRGlhbG9nLgotICAgICAqIEByZXR1cm4gR290b1Jlc291cmNlRGlhbG9nIGFuIGluc3RhbmNlIG9mIEdvdG9SZXNvdXJjZURpYWxvZy4KLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiAxR0pXRDJFOiBJVFBVSTpBTEwgLSBUZXN0IGNsYXNzZXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCBpbiBwdWJsaWMgcGFja2FnZXMuCi0gICAgICogCi0gICAgIHB1YmxpYyBzdGF0aWMgR290b1Jlc291cmNlRGlhbG9nIG5ld0dvdG9SZXNvdXJjZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCxJUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKLSAgICAgcmV0dXJuIG5ldyBHb3RvUmVzb3VyY2VEaWFsb2cocGFyZW50U2hlbGwsIHJlc291cmNlcyk7Ci0gICAgIH0KLSAgICAgKi8KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1ByZWZlcmVuY2VEaWFsb2dXcmFwcGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvUHJlZmVyZW5jZURpYWxvZ1dyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyMWM4OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvUHJlZmVyZW5jZURpYWxvZ1dyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLldvcmtpbmdDb3B5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2luZ0NvcHlNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZURpYWxvZ1dyYXBwZXIgZXh0ZW5kcyBQcmVmZXJlbmNlRGlhbG9nIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXJ7Ci0KLSAgICBwdWJsaWMgUHJlZmVyZW5jZURpYWxvZ1dyYXBwZXIoU2hlbGwgcGFyZW50U2hlbGwsIFByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwsIG1hbmFnZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNob3dQYWdlKElQcmVmZXJlbmNlTm9kZSBub2RlKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5zaG93UGFnZShub2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByZWZlcmVuY2VQYWdlIGdldFBhZ2UoSVByZWZlcmVuY2VOb2RlIG5vZGUpIHsKLSAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgcGFnZSBpZiBuZXNzZXNzYXJ5Ci0gICAgICAgIGlmIChub2RlLmdldFBhZ2UoKSA9PSBudWxsKQotICAgICAgICAgICAgbm9kZS5jcmVhdGVQYWdlKCk7Ci0KLSAgICAgICAgaWYgKG5vZGUuZ2V0UGFnZSgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gbm9kZS5nZXRQYWdlKCk7Ci0gICAgfQotCi0JcHVibGljIElXb3JraW5nQ29weU1hbmFnZXIgZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkgewotCQlyZXR1cm4gbmV3IFdvcmtpbmdDb3B5TWFuYWdlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG9wZW5QYWdlKFN0cmluZyBwcmVmZXJlbmNlUGFnZUlkLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIjcmVnaXN0ZXJVcGRhdGVKb2Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyVXBkYXRlSm9iKEpvYiBqb2IpIHsKLQkJLy9EbyBub3RoaW5nIGFzIHdlIGFyZSBub3QgdGVzdGluZyB0aGlzLgotCX0KLSAgICAKLSAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvUHJvcGVydHlEaWFsb2dXcmFwcGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvUHJvcGVydHlEaWFsb2dXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkY2NiNzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1Byb3BlcnR5RGlhbG9nV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlByb3BlcnR5RGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEaWFsb2dXcmFwcGVyIGV4dGVuZHMgUHJvcGVydHlEaWFsb2cgewotCi0gICAgcHVibGljIFByb3BlcnR5RGlhbG9nV3JhcHBlcihTaGVsbCBwYXJlbnRTaGVsbCwgUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlciwKLSAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsLCBtYW5hZ2VyLCBzZWxlY3Rpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHNob3dQYWdlKElQcmVmZXJlbmNlTm9kZSBub2RlKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5zaG93UGFnZShub2RlKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9UYXNrTGlzdFRlc3RTdHViLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVGFza0xpc3RUZXN0U3R1Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGIxNTRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9UYXNrTGlzdFRlc3RTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotLyoqCi0gKiBGT1IgVVNFIEJZIFRFU1RTIE9OTFkhCi0gKiA8cD4KLSAqIFN0dWIgY2xhc3MgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gY2xhc3NlcyB2aXNpYmxlIHRvIHRoZSBwYWNrYWdlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS51aS52aWV3cy50YXNrbGlzdDwvY29kZT4uICBGb3IgdGhlIHB1cnBvc2UKLSAqIG9mIHRlc3RpbmcuCi0gKiA8L3A+Ci0gKiBAcHJpdmF0ZQotICovCi1wdWJsaWMgY2xhc3MgVGFza0xpc3RUZXN0U3R1YiB7Ci0gICAgLy9QcmV2ZW50IGluc3RhbnRpYXRpb24KLSAgICBwcml2YXRlIFRhc2tMaXN0VGVzdFN0dWIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZXMgYWNjZXNzIHRvIGFuIGluc3RhbmNlIG9mIEZpbHRlcnNEaWFsb2cuCi0gICAgICogQHJldHVybiBGaWx0ZXJzRGlhbG9nIGFuIGluc3RhbmNlIG9mIEZpbHRlcnNEaWFsb2cuCi0gICAgICovCi0gICAgLyoqCi0gICAgICogMUdKV0QyRTogSVRQVUk6QUxMIC0gVGVzdCBjbGFzc2VzIHNob3VsZCBub3QgYmUgcmVsZWFzZWQgaW4gcHVibGljIHBhY2thZ2VzLgotICAgICAqIAotICAgICBwdWJsaWMgc3RhdGljIEZpbHRlcnNEaWFsb2cgbmV3RmlsdGVyc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotICAgICByZXR1cm4gbmV3IEZpbHRlcnNEaWFsb2cocGFyZW50U2hlbGwpOwotICAgICB9Ci0gICAgICovCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9UZXh0RWRpdG9yVGVzdFN0dWIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9UZXh0RWRpdG9yVGVzdFN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxYmUzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVGV4dEVkaXRvclRlc3RTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotLyoqCi0gKiBGT1IgVVNFIEJZIFRFU1RTIE9OTFkhCi0gKiA8cD4KLSAqIFN0dWIgY2xhc3MgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gY2xhc3NlcyB2aXNpYmxlIHRvIHRoZSBwYWNrYWdlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yPC9jb2RlPi4gIEZvciB0aGUgcHVycG9zZSBvZgotICogdGVzdGluZy4KLSAqIDwvcD4KLSAqIEBwcml2YXRlCi0gKi8KLQotcHVibGljIGNsYXNzIFRleHRFZGl0b3JUZXN0U3R1YiB7Ci0gICAgLy9QcmV2ZW50IGluc3RhbnRpYXRpb24KLSAgICBwcml2YXRlIFRleHRFZGl0b3JUZXN0U3R1YigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlcyBhY2Nlc3MgdG8gYW4gaW5zdGFuY2Ugb2YgRmluZFJlcGxhY2VEaWFsb2cuCi0gICAgICogQHJldHVybiBGaW5kUmVwbGFjZURpYWxvZyBhbiBpbnN0YW5jZSBvZiBGaW5kUmVwbGFjZURpYWxvZy4KLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiAxR0pXRDJFOiBJVFBVSTpBTEwgLSBUZXN0IGNsYXNzZXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCBpbiBwdWJsaWMgcGFja2FnZXMuCi0gICAgICogCi0gICAgIHB1YmxpYyBzdGF0aWMgRmluZFJlcGxhY2VEaWFsb2cgbmV3RmluZFJlcGxhY2VEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLSAgICAgcmV0dXJuIG5ldyBGaW5kUmVwbGFjZURpYWxvZyhwYXJlbnRTaGVsbCk7Ci0gICAgIH0KLSAgICAgKi8KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1RleHRNZXNzYWdlRGlhbG9ncy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1RleHRNZXNzYWdlRGlhbG9ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTE5NGUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9UZXh0TWVzc2FnZURpYWxvZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkRpYWxvZ0NoZWNrOwotCi1wdWJsaWMgY2xhc3MgVGV4dE1lc3NhZ2VEaWFsb2dzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIFRleHRNZXNzYWdlRGlhbG9ncyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gRGlhbG9nQ2hlY2suZ2V0U2hlbGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgZnJvbSB0aGUgVGV4dCBFZGl0b3IncyByZXNvdXJjZSBidW5kbGUuCi0gICAgICogU2hvdWxkIGNhbGwgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5FZGl0b3JNZXNzYWdlcyBkaXJlY3RseSwKLSAgICAgKiBidXQgaXQgaGFzIHBhY2thZ2UgdmlzaWJpbGl0eS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRFZGl0b3JTdHJpbmcoU3RyaW5nIGlkKSB7Ci0gICAgICAgIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlCi0gICAgICAgICAgICAgICAgLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5FZGl0b3JNZXNzYWdlcyIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJFZGl0b3JNZXNzYWdlcyIsIGJ1bmRsZSk7Ci0gICAgICAgIFN0cmluZyBzdHJpbmcgPSBidW5kbGUuZ2V0U3RyaW5nKGlkKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZCwgc3RyaW5nKTsKLSAgICAgICAgcmV0dXJuIHN0cmluZzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBzaW1saWFyIHRvIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzo6b3BlbkNvbmZpcm0uCi0gICAgICogVGhlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgZGlhbG9nIGluc3RlYWQgb2Ygb3BlbmluZy4KLSAgICAgKiBAcGFyYW0gdGl0bGUgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLgotICAgICAqIEByZXR1cm4gRGlhbG9nIHRoZSBjb25maXJtIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1lc3NhZ2VEaWFsb2cgZ2V0Q29uZmlybURpYWxvZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVzc2FnZURpYWxvZyhnZXRTaGVsbCgpLCB0aXRsZSwgbnVsbCwgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOwotICAgIH0KLQotIAotCi0gICAgLyoKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2Qgc2ltbGlhciB0byBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c6Om9wZW5RdWVzdGlvbi4KLSAgICAgKiBUaGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBkaWFsb2cgaW5zdGVhZCBvZiBvcGVuaW5nLgotICAgICAqIEBwYXJhbSB0aXRsZSB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UuCi0gICAgICogQHJldHVybiBNZXNzYWdlRGlhbG9nIHRoZSBxdWVzdGlvbiBkaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlRGlhbG9nIGdldFF1ZXN0aW9uRGlhbG9nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCBudWxsLCBtZXNzYWdlLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMIH0sIDApOwotICAgIH0KLQotICAgcHVibGljIHZvaWQgdGVzdENsb3NlRmlsZURlbGV0ZWQoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRDb25maXJtRGlhbG9nKAotICAgICAgICAgICAgICAgIGdldEVkaXRvclN0cmluZygiRWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9kZWxldGVkX2Nsb3NlX3RpdGxlIiksCi0gICAgICAgICAgICAgICAgZ2V0RWRpdG9yU3RyaW5nKCJFZGl0b3JfZXJyb3JfYWN0aXZhdGVkX2RlbGV0ZWRfY2xvc2VfbWVzc2FnZSIpKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVDaGFuZ2VkKCkgewotICAgICAgICBNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IGdldFF1ZXN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgIGdldEVkaXRvclN0cmluZygiRWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfdGl0bGUiKSwKLSAgICAgICAgICAgICAgICBnZXRFZGl0b3JTdHJpbmcoIkVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2UiKSk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUZpbGVEZWxldGVkKCkgewotICAgICAgICBNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKAotICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgZ2V0RWRpdG9yU3RyaW5nKCJFZGl0b3JfZXJyb3JfYWN0aXZhdGVkX2RlbGV0ZWRfc2F2ZV90aXRsZSIpLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgZ2V0RWRpdG9yU3RyaW5nKCJFZGl0b3JfZXJyb3JfYWN0aXZhdGVkX2RlbGV0ZWRfc2F2ZV9tZXNzYWdlIiksCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWRpdG9yU3RyaW5nKCJFZGl0b3JfZXJyb3JfYWN0aXZhdGVkX2RlbGV0ZWRfc2F2ZV9idXR0b25fc2F2ZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWRpdG9yU3RyaW5nKCJFZGl0b3JfZXJyb3JfYWN0aXZhdGVkX2RlbGV0ZWRfc2F2ZV9idXR0b25fY2xvc2UiKSB9LAotICAgICAgICAgICAgICAgIDApOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29uZmxpY3QoKSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gZ2V0UXVlc3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgZ2V0RWRpdG9yU3RyaW5nKCJFZGl0b3JfZXJyb3Jfc2F2ZV9vdXRvZnN5bmNfdGl0bGUiKSwKLSAgICAgICAgICAgICAgICBnZXRFZGl0b3JTdHJpbmcoIkVkaXRvcl9lcnJvcl9zYXZlX291dG9mc3luY19tZXNzYWdlIikpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVGV4dE1lc3NhZ2VEaWFsb2dzQXV0by5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1RleHRNZXNzYWdlRGlhbG9nc0F1dG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmM2NlNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVGV4dE1lc3NhZ2VEaWFsb2dzQXV0by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRGlhbG9nQ2hlY2s7Ci0KLXB1YmxpYyBjbGFzcyBUZXh0TWVzc2FnZURpYWxvZ3NBdXRvIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIFRleHRNZXNzYWdlRGlhbG9nc0F1dG8oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgcmV0dXJuIERpYWxvZ0NoZWNrLmdldFNoZWxsKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2Qgc2ltbGlhciB0byBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c6Om9wZW5Db25maXJtLgotICAgICAqIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGRpYWxvZyBpbnN0ZWFkIG9mIG9wZW5pbmcuCi0gICAgICogQHBhcmFtIHRpdGxlIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZS4KLSAgICAgKiBAcmV0dXJuIERpYWxvZyB0aGUgY29uZmlybSBkaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlRGlhbG9nIGdldENvbmZpcm1EaWFsb2coU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIG51bGwsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBzaW1saWFyIHRvIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzo6b3BlblF1ZXN0aW9uLgotICAgICAqIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGRpYWxvZyBpbnN0ZWFkIG9mIG9wZW5pbmcuCi0gICAgICogQHBhcmFtIHRpdGxlIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZS4KLSAgICAgKiBAcmV0dXJuIE1lc3NhZ2VEaWFsb2cgdGhlIHF1ZXN0aW9uIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1lc3NhZ2VEaWFsb2cgZ2V0UXVlc3Rpb25EaWFsb2coU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIG51bGwsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwgfSwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlRmlsZURlbGV0ZWQoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBudWxsOwotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZQotICAgICAgICAgICAgICAgIC5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuRWRpdG9yTWVzc2FnZXMiKTsKLSAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaWFsb2cgPSBnZXRDb25maXJtRGlhbG9nKAotICAgICAgICAgICAgICAgICAgICBidW5kbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJFZGl0b3JfZXJyb3JfYWN0aXZhdGVkX2RlbGV0ZWRfY2xvc2VfdGl0bGUiKSwKLSAgICAgICAgICAgICAgICAgICAgYnVuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiRWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9kZWxldGVkX2Nsb3NlX21lc3NhZ2UiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0gCi0gICAgcHVibGljIHZvaWQgdGVzdEVycm9yQ2xvc2luZygpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFF1ZXN0aW9uRGlhbG9nKFdvcmtiZW5jaE1lc3NhZ2VzLkVycm9yLAotICAgICAgICAgICAgICAgIFdvcmtiZW5jaE1lc3NhZ2VzLkVycm9yQ2xvc2luZ05vQXJnKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUNoYW5nZWQoKSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbnVsbDsKLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUKLSAgICAgICAgICAgICAgICAuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkVkaXRvck1lc3NhZ2VzIik7Ci0gICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZGlhbG9nID0gZ2V0UXVlc3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5nZXRTdHJpbmcoIkVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlIiksCi0gICAgICAgICAgICAgICAgICAgIGJ1bmRsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2UiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVGaWxlRGVsZXRlZCgpIHsKLSAgICAgICAgTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBudWxsOwotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZQotICAgICAgICAgICAgICAgIC5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuRWRpdG9yTWVzc2FnZXMiKTsKLSAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZygKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgYnVuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiRWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9kZWxldGVkX3NhdmVfdGl0bGUiKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgYnVuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiRWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9kZWxldGVkX3NhdmVfbWVzc2FnZSIpLAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiRWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9kZWxldGVkX3NhdmVfYnV0dG9uX3NhdmUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfZGVsZXRlZF9zYXZlX2J1dHRvbl9jbG9zZSIpIH0sCi0gICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICB9Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbmZsaWN0KCkgewotICAgICAgICBNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG51bGw7Ci0gICAgICAgIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlCi0gICAgICAgICAgICAgICAgLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5FZGl0b3JNZXNzYWdlcyIpOwotICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRpYWxvZyA9IGdldFF1ZXN0aW9uRGlhbG9nKGJ1bmRsZQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJFZGl0b3JfZXJyb3Jfc2F2ZV9vdXRvZnN5bmNfdGl0bGUiKSwgYnVuZGxlCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkVkaXRvcl9lcnJvcl9zYXZlX291dG9mc3luY19tZXNzYWdlIikpOwotICAgICAgICB9Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9VSUF1dG9tYXRlZFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlBdXRvbWF0ZWRTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTMwYzk5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9VSUF1dG9tYXRlZFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wYXJlLlVJQ29tcGFyZVByZWZlcmVuY2VzQXV0bzsKLQotLyoqCi0gKiBUZXN0IGFsbCBhcmVhcyBvZiB0aGUgVUkuCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUF1dG9tYXRlZFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1aXRlLiAgVGhpcyBpcyByZXF1aXJlZCB0bwotICAgICAqIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFVJQXV0b21hdGVkU3VpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIHRlc3Qgc3VpdGUuCi0gICAgICovCi0gICAgcHVibGljIFVJQXV0b21hdGVkU3VpdGUoKSB7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShVSURpYWxvZ3NBdXRvLmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShEZXByZWNhdGVkVUlEaWFsb2dzQXV0by5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoVUlXaXphcmRzQXV0by5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoRGVwcmVjYXRlZFVJV2l6YXJkc0F1dG8uY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFVJUHJlZmVyZW5jZXNBdXRvLmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShVSUNvbXBhcmVQcmVmZXJlbmNlc0F1dG8uY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKERlcHJlY2F0ZWRVSVByZWZlcmVuY2VzQXV0by5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoVUlNZXNzYWdlRGlhbG9nc0F1dG8uY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFVJTmV3V29ya2luZ1NldFdpemFyZEF1dG8uY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFVJRWRpdFdvcmtpbmdTZXRXaXphcmRBdXRvLmNsYXNzKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJRGlhbG9ncy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJRGlhbG9ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmNkZDJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9VSURpYWxvZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlR5cGVGaWx0ZXJpbmdEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuQWJvdXREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0b3JTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5GaWxlRXh0ZW5zaW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuU2F2ZVBlcnNwZWN0aXZlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0UGVyc3BlY3RpdmVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5TaG93Vmlld0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5TaW1wbGVMaXN0Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnJlZ2lzdHJ5LlBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5QZXJzcGVjdGl2ZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5EaWFsb2dDaGVjazsKLQotcHVibGljIGNsYXNzIFVJRGlhbG9ncyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9TRUxFQ1RJT05fTUVTU0FHRSA9ICJTZWxlY3QgUHJvamVjdCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX1NFTEVDVElPTl9NRVNTQUdFID0gUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5GaWx0ZXJTZWxlY3Rpb25fbWVzc2FnZTsKLQotICAgIHB1YmxpYyBVSURpYWxvZ3MoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgcmV0dXJuIERpYWxvZ0NoZWNrLmdldFNoZWxsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFib3V0KCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gbnVsbDsKLSAgICAgICAgZGlhbG9nID0gbmV3IEFib3V0RGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUHJvamVjdHMoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBudWxsLAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVMaXN0Q29udGVudFByb3ZpZGVyKCksIG5ldyBMYWJlbFByb3ZpZGVyKCksCi0gICAgICAgICAgICAgICAgUFJPSkVDVF9TRUxFQ1RJT05fTUVTU0FHRSk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5TW92ZVByb2plY3QoKSB7Ci0gICAgICAgIElQcm9qZWN0IGR1bW15UHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLSAgICAgICAgICAgICAgICAuZ2V0UHJvamVjdCgiRHVtbXlQcm9qZWN0Iik7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgZHVtbXlQcm9qZWN0KTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvcHlNb3ZlUmVzb3VyY2UoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIG51bGwsIHRydWUsCi0gICAgICAgICAgICAgICAgIlNlbGVjdCBEZXN0aW5hdGlvbiIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWRpdEFjdGlvblNldHNEaWFsb2coKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2c7Ci0gICAgICAgIFBlcnNwZWN0aXZlIHBlcnNwID0gbnVsbDsKLSAgICAgICAgLy9UZXN0IHBlcnNwZWN0aXZlOiB1c2UgY3VycmVudCBwZXJzcGVjdGl2ZSBvZiB0ZXN0IGNhc2UKLSAgICAgICAgdHJ5IHsgLyoKLSAgICAgICAgICogZml4bWU6IHNob3VsZCB0cnkgdG8gZ2V0IGN1cnJlbnQgcGVyc3BlY3RpdmUsIG9yIGRlZmF1bHQ7Ci0gICAgICAgICAqIGN1cnJlbnRseSBvbmx5Ci0gICAgICAgICAqLwotICAgICAgICAgICAgV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IChXb3JrYmVuY2hXaW5kb3cpIGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICAgICAgcGVyc3AgPSBuZXcgUGVyc3BlY3RpdmUoKFBlcnNwZWN0aXZlRGVzY3JpcHRvcikgZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKS5nZXRQZXJzcGVjdGl2ZXMoKVswXSwKLSAgICAgICAgICAgICAgICAgICAgKFdvcmtiZW5jaFBhZ2UpIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCkpOwotICAgICAgICAgICAgZGlhbG9nID0gd2luZG93LmNyZWF0ZUN1c3RvbWl6ZVBlcnNwZWN0aXZlRGlhbG9nKHBlcnNwKTsKLSAgICAgICAgfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGRpYWxvZyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgICAgIGlmIChwZXJzcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwZXJzcC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWRpdG9yU2VsZWN0aW9uKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gbmV3IEVkaXRvclNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogMUdKV0QyRTogSVRQVUk6QUxMIC0gVGVzdCBjbGFzc2VzIHNob3VsZCBub3QgYmUgcmVsZWFzZWQgaW4gcHVibGljCi0gICAgICogcGFja2FnZXMuIHB1YmxpYyB2b2lkIHRlc3RGaW5kUmVwbGFjZSgpIHsgRGlhbG9nIGRpYWxvZyA9Ci0gICAgICogVGV4dEVkaXRvclRlc3RTdHViLm5ld0ZpbmRSZXBsYWNlRGlhbG9nKCBnZXRTaGVsbCgpICk7Ci0gICAgICogRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7IH0gcHVibGljIHZvaWQgdGVzdEdvdG9SZXNvdXJjZSgpIHsKLSAgICAgKiBEaWFsb2cgZGlhbG9nID0gTmF2aWdhdG9yVGVzdFN0dWIubmV3R290b1Jlc291cmNlRGlhbG9nKGdldFNoZWxsKCksIG5ldwotICAgICAqIElSZXNvdXJjZVswXSk7IERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5hdmlnYXRvckZpbHRlcigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIG51bGwsCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZUxpc3RDb250ZW50UHJvdmlkZXIoKSwgbmV3IExhYmVsUHJvdmlkZXIoKSwKLSAgICAgICAgICAgICAgICBGSUxURVJfU0VMRUNUSU9OX01FU1NBR0UpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3RmlsZVR5cGUoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZUV4dGVuc2lvbkRpYWxvZyhnZXRTaGVsbCgpKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2dyZXNzSW5mb3JtYXRpb24oKSB7Ci0gICAgICAgIFByb2dyZXNzTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlQXMoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZVBlcnNwZWN0aXZlKCkgewotICAgICAgICBQZXJzcGVjdGl2ZVJlZ2lzdHJ5IHJlZyA9IChQZXJzcGVjdGl2ZVJlZ2lzdHJ5KSBXb3JrYmVuY2hQbHVnaW4KLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdCgpLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLSAgICAgICAgLy8gR2V0IHBlcnNwIG5hbWUuCi0gICAgICAgIFNhdmVQZXJzcGVjdGl2ZURpYWxvZyBkaWFsb2cgPSBuZXcgU2F2ZVBlcnNwZWN0aXZlRGlhbG9nKGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgcmVnKTsKLSAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjcmlwdGlvbiA9IHJlZwotICAgICAgICAgICAgICAgIC5maW5kUGVyc3BlY3RpdmVXaXRoSWQoZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQZXJzcGVjdGl2ZSgpLmdldElkKCkpOwotICAgICAgICBkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3RQZXJzcGVjdGl2ZSgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RQZXJzcGVjdGl2ZURpYWxvZyhnZXRTaGVsbCgpLCBQbGF0Zm9ybVVJCi0gICAgICAgICAgICAgICAgLmdldFdvcmtiZW5jaCgpLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKSk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3RUeXBlcygpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBUeXBlRmlsdGVyaW5nRGlhbG9nKGdldFNoZWxsKCksIG51bGwpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvd1ZpZXcoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgU2hvd1ZpZXdEaWFsb2coZ2V0U2hlbGwoKSwgV29ya2JlbmNoUGx1Z2luCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHQoKS5nZXRWaWV3UmVnaXN0cnkoKSk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiAxR0pXRDJFOiBJVFBVSTpBTEwgLSBUZXN0IGNsYXNzZXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCBpbiBwdWJsaWMKLSAgICAgKiBwYWNrYWdlcy4gcHVibGljIHZvaWQgdGVzdFRhc2tGaWx0ZXJzKCkgeyBEaWFsb2cgZGlhbG9nID0KLSAgICAgKiBUYXNrTGlzdFRlc3RTdHViLm5ld0ZpbHRlcnNEaWFsb2coIGdldFNoZWxsKCkgKTsKLSAgICAgKiBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsgfQotICAgICAqLwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJRGlhbG9nc0F1dG8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9VSURpYWxvZ3NBdXRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzY4MWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJRGlhbG9nc0F1dG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvamVjdExvY2F0aW9uU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuVHlwZUZpbHRlcmluZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5BYm91dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRvclNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLkZpbGVFeHRlbnNpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5TYXZlUGVyc3BlY3RpdmVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RQZXJzcGVjdGl2ZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlNob3dWaWV3RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLlNpbXBsZUxpc3RDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuUGVyc3BlY3RpdmVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRGlhbG9nQ2hlY2s7Ci0KLXB1YmxpYyBjbGFzcyBVSURpYWxvZ3NBdXRvIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX1NFTEVDVElPTl9NRVNTQUdFID0iU2VsZWN0IE90aGVyIFByb2plY3RzIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfU0VMRUNUSU9OX01FU1NBR0UgPSBSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLkZpbHRlclNlbGVjdGlvbl9tZXNzYWdlOwotCi0gICAgcHVibGljIFVJRGlhbG9nc0F1dG8oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgcmV0dXJuIERpYWxvZ0NoZWNrLmdldFNoZWxsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFib3V0KCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gbnVsbDsKLSAgICAgICAgZGlhbG9nID0gbmV3IEFib3V0RGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQcm9qZWN0cygpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIG51bGwsCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZUxpc3RDb250ZW50UHJvdmlkZXIoKSwgbmV3IExhYmVsUHJvdmlkZXIoKSwKLSAgICAgICAgICAgICAgICBQUk9KRUNUX1NFTEVDVElPTl9NRVNTQUdFKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weU1vdmVQcm9qZWN0KCkgewotICAgICAgICBJUHJvamVjdCBkdW1teVByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0gICAgICAgICAgICAgICAgLmdldFByb2plY3QoIkR1bW15UHJvamVjdCIpOwotICAgICAgICBEaWFsb2cgZGlhbG9nID0gbmV3IFByb2plY3RMb2NhdGlvblNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIGR1bW15UHJvamVjdCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvcHlNb3ZlUmVzb3VyY2UoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIG51bGwsIHRydWUsCi0gICAgICAgICAgICAgICAgIkNvcHkgUmVzb3VyY2VzIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVkaXRBY3Rpb25TZXRzRGlhbG9nKCkgewotICAgICAgICAvLyBAaXNzdWUgbmVlZCB0byB1bmNvbW1lbnQgdGhpcyBvbmNlIGN1c3RvbWl6ZSBwZXJzcCBkaWFsb2cgZml4ZWQgdXAKLSAgICAgICAgLyoKLSAgICAgICAgICogRGlhbG9nIGRpYWxvZzsgUGVyc3BlY3RpdmUgcGVyc3AgPSBudWxsOyAvL1Rlc3QgcGVyc3BlY3RpdmU6IHVzZQotICAgICAgICAgKiBjdXJyZW50IHBlcnNwZWN0aXZlIG9mIHRlc3QgY2FzZSB0cnkgey8vZml4bWU6IHNob3VsZCB0cnkgdG8gZ2V0Ci0gICAgICAgICAqIGN1cnJlbnQgcGVyc3BlY3RpdmUsIG9yIGRlZmF1bHQ7IGN1cnJlbnRseSBvbmx5IC8vZ2V0cyBmaXJzdAotICAgICAgICAgKiBwZXJzcGVjdGl2ZSBpbiB0aGUgcmVnaXN0cnkuIHBlcnNwID0gbmV3Ci0gICAgICAgICAqIFBlcnNwZWN0aXZlKChQZXJzcGVjdGl2ZURlc2NyaXB0b3IpZ2V0V29ya2JlbmNoKCkuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpLmdldFBlcnNwZWN0aXZlcygpWzBdLAotICAgICAgICAgKiAoV29ya2JlbmNoUGFnZSlnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkgKTsKLSAgICAgICAgICogZGlhbG9nID0gbmV3IEN1c3RvbWl6ZVBlcnNwZWN0aXZlRGlhbG9nKGdldFNoZWxsKCksIHBlcnNwKTsgfSBjYXRjaAotICAgICAgICAgKiAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsgZGlhbG9nID0gbnVsbDsgfQotICAgICAgICAgKiBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOyBpZiAocGVyc3AgIT0gbnVsbCkgewotICAgICAgICAgKiBwZXJzcC5kaXNwb3NlKCk7IH0KLSAgICAgICAgICovCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVkaXRvclNlbGVjdGlvbigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0b3JTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogMUdKV0QyRTogSVRQVUk6QUxMIC0gVGVzdCBjbGFzc2VzIHNob3VsZCBub3QgYmUgcmVsZWFzZWQgaW4gcHVibGljCi0gICAgICogcGFja2FnZXMuIHB1YmxpYyB2b2lkIHRlc3RGaW5kUmVwbGFjZSgpIHsgRGlhbG9nIGRpYWxvZyA9Ci0gICAgICogVGV4dEVkaXRvclRlc3RTdHViLm5ld0ZpbmRSZXBsYWNlRGlhbG9nKCBnZXRTaGVsbCgpICk7Ci0gICAgICogRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsgfSBwdWJsaWMgdm9pZAotICAgICAqIHRlc3RHb3RvUmVzb3VyY2UoKSB7IERpYWxvZyBkaWFsb2cgPQotICAgICAqIE5hdmlnYXRvclRlc3RTdHViLm5ld0dvdG9SZXNvdXJjZURpYWxvZyhnZXRTaGVsbCgpLCBuZXcgSVJlc291cmNlWzBdKTsKLSAgICAgKiBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5hdmlnYXRvckZpbHRlcigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIG51bGwsCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZUxpc3RDb250ZW50UHJvdmlkZXIoKSwgbmV3IExhYmVsUHJvdmlkZXIoKSwKLSAgICAgICAgICAgICAgICBGSUxURVJfU0VMRUNUSU9OX01FU1NBR0UpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdGaWxlVHlwZSgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRXh0ZW5zaW9uRGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9ncmVzc0luZm9ybWF0aW9uKCkgewotICAgICAgICBQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKTsKLSAgICAgICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlQXMoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlUGVyc3BlY3RpdmUoKSB7Ci0gICAgICAgIFBlcnNwZWN0aXZlUmVnaXN0cnkgcmVnID0gKFBlcnNwZWN0aXZlUmVnaXN0cnkpIFdvcmtiZW5jaFBsdWdpbgotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0KCkuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpOwotICAgICAgICAvLyBHZXQgcGVyc3AgbmFtZS4KLSAgICAgICAgU2F2ZVBlcnNwZWN0aXZlRGlhbG9nIGRpYWxvZyA9IG5ldyBTYXZlUGVyc3BlY3RpdmVEaWFsb2coZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICByZWcpOwotICAgICAgICBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2NyaXB0aW9uID0gcmVnCi0gICAgICAgICAgICAgICAgLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChnZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBlcnNwZWN0aXZlKCkuZ2V0SWQoKSk7Ci0gICAgICAgIGRpYWxvZy5zZXRJbml0aWFsU2VsZWN0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0UGVyc3BlY3RpdmUoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0UGVyc3BlY3RpdmVEaWFsb2coZ2V0U2hlbGwoKSwgUGxhdGZvcm1VSQotICAgICAgICAgICAgICAgIC5nZXRXb3JrYmVuY2goKS5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCkpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3RUeXBlcygpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBUeXBlRmlsdGVyaW5nRGlhbG9nKGdldFNoZWxsKCksIG51bGwpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93VmlldygpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBTaG93Vmlld0RpYWxvZyhnZXRTaGVsbCgpLCBXb3JrYmVuY2hQbHVnaW4KLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdCgpLmdldFZpZXdSZWdpc3RyeSgpKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogMUdKV0QyRTogSVRQVUk6QUxMIC0gVGVzdCBjbGFzc2VzIHNob3VsZCBub3QgYmUgcmVsZWFzZWQgaW4gcHVibGljCi0gICAgICogcGFja2FnZXMuIHB1YmxpYyB2b2lkIHRlc3RUYXNrRmlsdGVycygpIHsgRGlhbG9nIGRpYWxvZyA9Ci0gICAgICogVGFza0xpc3RUZXN0U3R1Yi5uZXdGaWx0ZXJzRGlhbG9nKCBnZXRTaGVsbCgpICk7Ci0gICAgICogRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsgfQotICAgICAqLwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJRWRpdFdvcmtpbmdTZXRXaXphcmRBdXRvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlFZGl0V29ya2luZ1NldFdpemFyZEF1dG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwNGYwZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlFZGl0V29ya2luZ1NldFdpemFyZEF1dG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVdvcmtpbmdTZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLldvcmtpbmdTZXRFZGl0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnJlZ2lzdHJ5LldvcmtpbmdTZXRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQXJyYXlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5EaWFsb2dDaGVjazsKLQotLyoqCi0gKiBUZXN0cyB0aGUgV29ya2luZ1NldEVkaXRXaXphcmQKLSAqIFRlc3RzIGlucHV0IHZhbGlkYXRpb24sIHByZXNlbmNlIG9mIGNvcnJlY3QgZWRpdCBwYWdlIGFuZCAKLSAqIHdpemFyZCBwYWdlIHRleHRzLgotICovCi1wdWJsaWMgY2xhc3MgVUlFZGl0V29ya2luZ1NldFdpemFyZEF1dG8gZXh0ZW5kcyBVSVdvcmtpbmdTZXRXaXphcmRzQXV0byB7Ci0gICAgSVdvcmtpbmdTZXRQYWdlIGZEZWZhdWx0RWRpdFBhZ2U7Ci0KLSAgICBwdWJsaWMgVUlFZGl0V29ya2luZ1NldFdpemFyZEF1dG8oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBXb3JraW5nU2V0UmVnaXN0cnkgcmVnaXN0cnkgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldFdvcmtpbmdTZXRSZWdpc3RyeSgpOwotICAgICAgICBmRGVmYXVsdEVkaXRQYWdlID0gcmVnaXN0cnkuZ2V0RGVmYXVsdFdvcmtpbmdTZXRQYWdlKCk7Ci0gICAgICAgIGZXaXphcmQgPSBuZXcgV29ya2luZ1NldEVkaXRXaXphcmQoZkRlZmF1bHRFZGl0UGFnZSk7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWRpdFBhZ2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSVdpemFyZFBhZ2UgcGFnZSA9IGZXaXphcmREaWFsb2cuZ2V0Q3VycmVudFBhZ2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYWdlIGluc3RhbmNlb2YgSVdvcmtpbmdTZXRQYWdlKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBWZXJpZnkgdGhhdCBjb3JyZWN0IHdvcmtpbmcgc2V0IGVkaXQgcGFnZSBpcyBkaXNwbGF5ZWQKLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydFRydWUocGFnZS5nZXRDbGFzcygpID09IGZEZWZhdWx0RWRpdFBhZ2UuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRlc3QgaW5pdGlhbCBwYWdlIHN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBhc3NlcnRUcnVlKHBhZ2UuY2FuRmxpcFRvTmV4dFBhZ2UoKSA9PSBmYWxzZSk7Ci0gICAgICAgIGFzc2VydFRydWUoZldpemFyZC5jYW5GaW5pc2goKSA9PSBmYWxzZSk7Ci0gICAgICAgIGFzc2VydE51bGwocGFnZS5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRlc3QgcGFnZSBzdGF0ZSB3aXRoIHByZXNldCBwYWdlIGlucHV0Ci0gICAgICAgICAqLwotICAgICAgICBJV29ya2luZ1NldE1hbmFnZXIgd29ya2luZ1NldE1hbmFnZXIgPSBmV29ya2JlbmNoCi0gICAgICAgICAgICAgICAgLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCk7Ci0gICAgICAgIElXb3JraW5nU2V0IHdvcmtpbmdTZXQgPSB3b3JraW5nU2V0TWFuYWdlci5jcmVhdGVXb3JraW5nU2V0KAotICAgICAgICAgICAgICAgIFdPUktJTkdfU0VUX05BTUVfMSwgbmV3IElBZGFwdGFibGVbXSB7IHAxLCBmMiB9KTsKLSAgICAgICAgKChXb3JraW5nU2V0RWRpdFdpemFyZCkgZldpemFyZCkuc2V0U2VsZWN0aW9uKHdvcmtpbmdTZXQpOwotCi0gICAgICAgIExpc3Qgd2lkZ2V0cyA9IGdldFdpZGdldHMoKENvbXBvc2l0ZSkgcGFnZS5nZXRDb250cm9sKCksIFRleHQuY2xhc3MpOwotICAgICAgICBUZXh0IHRleHQgPSAoVGV4dCkgd2lkZ2V0cy5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXT1JLSU5HX1NFVF9OQU1FXzEsIHRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYWdlLmNhbkZsaXBUb05leHRQYWdlKCkgPT0gZmFsc2UpOwotICAgICAgICBhc3NlcnRUcnVlKGZXaXphcmQuY2FuRmluaXNoKCkgPT0gZmFsc2UpOwotICAgICAgICBhc3NlcnROdWxsKHBhZ2UuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICB3aWRnZXRzID0gZ2V0V2lkZ2V0cygoQ29tcG9zaXRlKSBwYWdlLmdldENvbnRyb2woKSwgVHJlZS5jbGFzcyk7Ci0gICAgICAgIFRyZWUgdHJlZSA9IChUcmVlKSB3aWRnZXRzLmdldCgwKTsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkubGVuZ3RoLCB0cmVlCi0gICAgICAgICAgICAgICAgLmdldEl0ZW1Db3VudCgpKTsKLSAgICAgICAgc2V0VGV4dFdpZGdldFRleHQoV09SS0lOR19TRVRfTkFNRV8yLCBwYWdlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmV2l6YXJkLmNhbkZpbmlzaCgpKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUZXN0IHBhZ2Ugc3RhdGUgd2l0aCBwYXJ0aWFsIHBhZ2UgaW5wdXQKLSAgICAgICAgICovCi0gICAgICAgIHNldFRleHRXaWRnZXRUZXh0KCIiLCBwYWdlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYWdlLmNhbkZsaXBUb05leHRQYWdlKCkgPT0gZmFsc2UpOwotICAgICAgICBhc3NlcnRUcnVlKGZXaXphcmQuY2FuRmluaXNoKCkgPT0gZmFsc2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhZ2UuZ2V0RXJyb3JNZXNzYWdlKCkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRlc3QgcGFnZSBzdGF0ZSB3aXRoIGNvbXBsZXRlIHBhZ2UgaW5wdXQKLSAgICAgICAgICovCi0gICAgICAgIHNldFRleHRXaWRnZXRUZXh0KFdPUktJTkdfU0VUX05BTUVfMiwgcGFnZSk7Ci0gICAgICAgIGNoZWNrVHJlZUl0ZW1zKCk7Ci0gICAgICAgIGFzc2VydFRydWUocGFnZS5jYW5GbGlwVG9OZXh0UGFnZSgpID09IGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmV2l6YXJkLmNhbkZpbmlzaCgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChwYWdlLmdldEVycm9yTWVzc2FnZSgpKTsKLQotICAgICAgICBmV2l6YXJkLnBlcmZvcm1GaW5pc2goKTsKLSAgICAgICAgd29ya2luZ1NldCA9ICgoV29ya2luZ1NldEVkaXRXaXphcmQpIGZXaXphcmQpLmdldFNlbGVjdGlvbigpOwotICAgICAgICBJQWRhcHRhYmxlW10gd29ya2luZ1NldEl0ZW1zID0gd29ya2luZ1NldC5nZXRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV09SS0lOR19TRVRfTkFNRV8yLCB3b3JraW5nU2V0LmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlVdGlsLmNvbnRhaW5zKHdvcmtpbmdTZXRJdGVtcywgcDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWwuY29udGFpbnMod29ya2luZ1NldEl0ZW1zLCBwMikpOwotCi0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGZXaXphcmREaWFsb2csIHRoaXMpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJRXJyb3JEaWFsb2dzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlFcnJvckRpYWxvZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1OTBkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlFcnJvckRpYWxvZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRGlhbG9nQ2hlY2s7Ci0KLXB1YmxpYyBjbGFzcyBVSUVycm9yRGlhbG9ncyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBVSUVycm9yRGlhbG9ncyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gRGlhbG9nQ2hlY2suZ2V0U2hlbGwoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEdldCBhbiBleGFtcGxlIEVycm9yRGlhbG9nIHdpdGggYSBzdGF0dXMgYW5kIGEgY291cGxlIG9mIAotICAgICAqIGNoaWxkIHN0YXR1c2VzLgotICAgICAqLwotICAgIHByaXZhdGUgRXJyb3JEaWFsb2cgZ2V0TXVsdGlTdGF0dXNFcnJvckRpYWxvZygpIHsKLQotICAgICAgICBJU3RhdHVzW10gY2hpbGRTdGF0dXNlcyA9IG5ldyBJU3RhdHVzWzJdOwotICAgICAgICBjaGlsZFN0YXR1c2VzWzBdID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2UudWkudGVzdHMiLAotICAgICAgICAgICAgICAgIElTdGF0dXMuRVJST1IsICJFcnJvciBtZXNzYWdlIDEiLCBuZXcgVGhyb3dhYmxlKCkpOwotICAgICAgICBjaGlsZFN0YXR1c2VzWzFdID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2UudWkudGVzdHMiLAotICAgICAgICAgICAgICAgIElTdGF0dXMuRVJST1IsICJFcnJvciBtZXNzYWdlIDIiLCBuZXcgVGhyb3dhYmxlKCkpOwotICAgICAgICBNdWx0aVN0YXR1cyBtYWluU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKCJvcmcuZWNsaXBzZS51aS50ZXN0cyIsCi0gICAgICAgICAgICAgICAgSVN0YXR1cy5FUlJPUiwgY2hpbGRTdGF0dXNlcywgIk1haW4gZXJyb3IiLCBuZXcgVGhyb3dhYmxlKCkpOwotCi0gICAgICAgIHJldHVybiBuZXcgRXJyb3JEaWFsb2coZ2V0U2hlbGwoKSwgIkVycm9yIFRlc3QiLCAiRXJyb3IgbWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgbWFpblN0YXR1cywgSVN0YXR1cy5FUlJPUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVycm9yQ2xpcGJvYXJkKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0TXVsdGlTdGF0dXNFcnJvckRpYWxvZygpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9VSUludGVyYWN0aXZlU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9VSUludGVyYWN0aXZlU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MTZkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlJbnRlcmFjdGl2ZVN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wYXJlLlVJQ29tcGFyZVByZWZlcmVuY2VzOwotCi0vKioKLSAqIFRlc3QgYWxsIGFyZWFzIG9mIHRoZSBVSS4KLSAqLwotcHVibGljIGNsYXNzIFVJSW50ZXJhY3RpdmVTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gIFRoaXMgaXMgcmVxdWlyZWQgdG8KLSAgICAgKiB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVSUludGVyYWN0aXZlU3VpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIHRlc3Qgc3VpdGUuCi0gICAgICovCi0gICAgcHVibGljIFVJSW50ZXJhY3RpdmVTdWl0ZSgpIHsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFVJUHJlZmVyZW5jZXMuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFVJQ29tcGFyZVByZWZlcmVuY2VzLmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShEZXByZWNhdGVkVUlQcmVmZXJlbmNlcy5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoVUlXaXphcmRzLmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShEZXByZWNhdGVkVUlXaXphcmRzLmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShVSURpYWxvZ3MuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKERlcHJlY2F0ZWRVSURpYWxvZ3MuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFVJTWVzc2FnZURpYWxvZ3MuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFVJRXJyb3JEaWFsb2dzLmNsYXNzKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlNZXNzYWdlRGlhbG9ncy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJTWVzc2FnZURpYWxvZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0MjQwNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlNZXNzYWdlRGlhbG9ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkRpYWxvZ0NoZWNrOwotCi1wdWJsaWMgY2xhc3MgVUlNZXNzYWdlRGlhbG9ncyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNTVlfUkVTT1VSQ0UgPSAiRHVtbXkucmVzb3VyY2UiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVTU1ZX1BST0pFQ1QgPSAiRHVtbXlQcm9qZWN0IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1NWV9BQlNPTFVURV9QQVRIID0gIkM6XFxEdW1teXBhdGhcXER1bW15LnJlc291cmNlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1NWV9SRUxBVElWRV9QQVRIID0gIlxcIiArIERVTU1ZX1BST0pFQ1QKLSAgICAgICAgICAgICsgIlxcIiArIERVTU1ZX1JFU09VUkNFOwotCi0gICAgcHVibGljIFVJTWVzc2FnZURpYWxvZ3MoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgcmV0dXJuIERpYWxvZ0NoZWNrLmdldFNoZWxsKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2Qgc2ltbGlhciB0byBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c6Om9wZW5JbmZvcm1hdGlvbi4KLSAgICAgKiBUaGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBkaWFsb2cgaW5zdGVhZCBvZiBvcGVuaW5nLgotICAgICAqIEBwYXJhbSB0aXRsZSB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UuCi0gICAgICogQHJldHVybiBNZXNzYWdlRGlhbG9nIHRoZSBpbmZvcm1hdGlvbiBkaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlRGlhbG9nIGdldEluZm9ybWF0aW9uRGlhbG9nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCBudWxsLCBtZXNzYWdlLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cuSU5GT1JNQVRJT04sCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCB9LCAwKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBzaW1saWFyIHRvIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzo6b3BlblF1ZXN0aW9uLgotICAgICAqIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGRpYWxvZyBpbnN0ZWFkIG9mIG9wZW5pbmcuCi0gICAgICogQHBhcmFtIHRpdGxlIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZS4KLSAgICAgKiBAcmV0dXJuIE1lc3NhZ2VEaWFsb2cgdGhlIHF1ZXN0aW9uIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1lc3NhZ2VEaWFsb2cgZ2V0UXVlc3Rpb25EaWFsb2coU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIG51bGwsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwgfSwgMCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2Qgc2ltbGlhciB0byBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c6OmdldFdhcm5pbmdEaWFsb2cuCi0gICAgICogVGhlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgZGlhbG9nIGluc3RlYWQgb2Ygb3BlbmluZy4KLSAgICAgKiBAcGFyYW0gdGl0bGUgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLgotICAgICAqIEByZXR1cm4gTWVzc2FnZURpYWxvZyB0aGUgY29uZmlybSBkaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlRGlhbG9nIGdldFdhcm5pbmdEaWFsb2coU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIG51bGwsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5XQVJOSU5HLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwgfSwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFib3J0UGFnZUZsaXBwaW5nKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0V2FybmluZ0RpYWxvZyhKRmFjZVJlc291cmNlcwotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkFib3J0UGFnZUZsaXBwaW5nRGlhbG9nLnRpdGxlIiksIEpGYWNlUmVzb3VyY2VzCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiQWJvcnRQYWdlRmxpcHBpbmdEaWFsb2cubWVzc2FnZSIpKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5T3ZlcndyaXRlKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UXVlc3Rpb25EaWFsb2coIkV4aXN0cyIsIk92ZXJ3cml0ZT8iKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVByb2plY3QoKSB7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9IkRlbGV0ZSBQcm9qZWN0IjsKLSAgICAgICAgU3RyaW5nIG1zZyA9IE5MUy5iaW5kKCJEZWxldGUiLCAobmV3IE9iamVjdFtdIHsKLQkJRFVNTVlfUFJPSkVDVCwgRFVNTVlfQUJTT0xVVEVfUEFUSCB9KSk7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRTaGVsbCgpLCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0IHdpbmRvdyBpY29uCi0gICAgICAgICAgICAgICAgbXNnLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVJlYWRPbmx5Q2hlY2soKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRTaGVsbCgpLCJEZWxldGU/IiwgbnVsbCwKLSAgICAgICAgICAgICAgICJUaGlzPyIsCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlUmVzb3VyY2UoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRRdWVzdGlvbkRpYWxvZygiRGVsZXRlIiwiRGVsZXRlPyIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlUmVzb3VyY2VzKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UXVlc3Rpb25EaWFsb2coIkRlbGV0ZSIsIk9LPyIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHJvcE92ZXJ3cml0ZSgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKAotICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Ecm9wQWRhcHRlcl9xdWVzdGlvbiwKLSAgICAgICAgICAgICAgICBudWxsLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLkRyb3BBZGFwdGVyX292ZXJ3cml0ZVF1ZXJ5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IERVTU1ZX1JFTEFUSVZFX1BBVEggfSksCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXJyb3JDbG9zaW5nKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UXVlc3Rpb25EaWFsb2coV29ya2JlbmNoTWVzc2FnZXMuRXJyb3IsCi0gICAgICAgICAgICAgICAgV29ya2JlbmNoTWVzc2FnZXMuRXJyb3JDbG9zaW5nTm9BcmcpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUV4dGVuc2lvbkVtcHR5KCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0SW5mb3JtYXRpb25EaWFsb2coIiIsIiIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZU5hbWVXcm9uZygpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldEluZm9ybWF0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgICJJbnZhbGlkIiwKLSAgICAgICAgICAgICAgICJJbnZhbGlkIGZpbGUiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVUeXBlRXhpc3RzKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0SW5mb3JtYXRpb25EaWFsb2coIkV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIkFscmVhZHkgRXhpc3RzIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHlwZV8xKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0V2FybmluZ0RpYWxvZygiSW52YWxpZD8iLCAiSXMgdGhpcyBpbnZhbGlkPyIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFR5cGVfMigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFdhcm5pbmdEaWFsb2coIkludmFsaWQiLCAgIklzIHRoaXMgaW52YWxpZD8iKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1vdmVSZWFkT25seUNoZWNrKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgIk1vdmUiLCBudWxsLCAiT0sgdG8gbW92ZSIsCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9CdWlsZGVycygpIHsKLSAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFdhcm5pbmdEaWFsb2coCi0gICAgIFdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiQnVpbGRBY3Rpb24ud2FybmluZyIpLAotICAgICBXb3JrYmVuY2hNZXNzYWdlcy5nZXRTdHJpbmcoIkJ1aWxkQWN0aW9uLm5vQnVpbGRlcnMiKSApOwotICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICAgfQotICAgICAqLwotICAgIC8qCi0gICAgIHB1YmxpYyB2b2lkIHRlc3ROb0dsb2JhbEJ1aWxkZXJzRGlhbG9nKCkgewotICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0V2FybmluZ0RpYWxvZygKLSAgICAgV29ya2JlbmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHbG9iYWxCdWlsZEFjdGlvbi53YXJuaW5nIiksCi0gICAgIFdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiR2xvYmFsQnVpbGRBY3Rpb24ubm9CdWlsZGVycyIpICk7Ci0gICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgICB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vUHJvcGVydHlQYWdlKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0SW5mb3JtYXRpb25EaWFsb2coV29ya2JlbmNoTWVzc2FnZXMuUHJvcGVydHlEaWFsb2dfbWVzc2FnZVRpdGxlLCBOTFMuYmluZChXb3JrYmVuY2hNZXNzYWdlcy5Qcm9wZXJ0eURpYWxvZ19ub1Byb3BlcnR5TWVzc2FnZSwgKG5ldyBPYmplY3RbXSB7ICJEdW1teVByb3BlcnR5UGFnZSIgfSkpKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZXJhdGlvbk5vdEF2YWlsYWJsZSgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldEluZm9ybWF0aW9uRGlhbG9nKFdvcmtiZW5jaE1lc3NhZ2VzLkluZm9ybWF0aW9uLCAiTm90IGF2YWlsYWJsZSIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcndyaXRlUGVyc3BlY3RpdmUoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRTaGVsbCgpLCBXb3JrYmVuY2hNZXNzYWdlcy5TYXZlUGVyc3BlY3RpdmVfb3ZlcndyaXRlVGl0bGUsIG51bGwsCi0gICAgICAgICAgICAgICAgTkxTLmJpbmQoV29ya2JlbmNoTWVzc2FnZXMuU2F2ZVBlcnNwZWN0aXZlX292ZXJ3cml0ZVF1ZXN0aW9uLCAobmV3IE9iamVjdFtdIHsgIkR1bW15IFBlcnNwZWN0aXZlIiB9KSksCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwgfSwgMCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZyZXNoRGVsZXRlUHJvamVjdCgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksICJSZWZyZXNoIiwgbnVsbCwKLSAgICAgICAgICAgICAgICBOTFMuYmluZCgiZGVsZXRlZCBsb2NhdGlvbiIsIChuZXcgT2JqZWN0W10gewotCQkJCURVTU1ZX1BST0pFQ1QsCi0JCQkJImM6XFxkdW1teXBhdGhcXCIgKyBEVU1NWV9QUk9KRUNUIH0pKSwKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCB9LCAwKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbmFtZU92ZXJ3cml0ZSgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFF1ZXN0aW9uRGlhbG9nKCJFeGlzdHMiLCJPdmVyd3JpdGUiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc2V0UGVyc3BlY3RpdmUoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRTaGVsbCgpLCBXb3JrYmVuY2hNZXNzYWdlcy5SZXNldFBlcnNwZWN0aXZlX3RpdGxlLCBudWxsLCBOTFMuYmluZChXb3JrYmVuY2hNZXNzYWdlcy5SZXNldFBlcnNwZWN0aXZlX21lc3NhZ2UsIChuZXcgT2JqZWN0W10geyAiRHVtbXkgUGVyc3BlY3RpdmUiIH0pKSwKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUFzT3ZlcndyaXRlKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgIk9LPyIsIG51bGwsICJPdmVyd3JpdGU/IiwgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVDaGFuZ2VzKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgV29ya2JlbmNoTWVzc2FnZXMuU2F2ZV9SZXNvdXJjZSwgbnVsbCwgTkxTLmJpbmQoV29ya2JlbmNoTWVzc2FnZXMuRWRpdG9yTWFuYWdlcl9zYXZlQ2hhbmdlc1F1ZXN0aW9uLCAobmV3IE9iamVjdFtdIHsgRFVNTVlfUkVTT1VSQ0UgfSkpLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2l6YXJkQ2xvc2luZygpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksIEpGYWNlUmVzb3VyY2VzCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiV2l6YXJkQ2xvc2luZ0RpYWxvZy50aXRsZSIpLCBudWxsLCBKRmFjZVJlc291cmNlcwotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIldpemFyZENsb3NpbmdEaWFsb2cubWVzc2FnZSIpLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCB9LCAwKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdpemFyZE92ZXJ3cml0ZSgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksICJPSz8iLCBudWxsLCAiRXhpc3RzIiwgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlNZXNzYWdlRGlhbG9nc0F1dG8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9VSU1lc3NhZ2VEaWFsb2dzQXV0by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmU4NGFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9VSU1lc3NhZ2VEaWFsb2dzQXV0by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkRpYWxvZ0NoZWNrOwotCi1wdWJsaWMgY2xhc3MgVUlNZXNzYWdlRGlhbG9nc0F1dG8gZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVTU1ZX1JFU09VUkNFID0gIkR1bW15LnJlc291cmNlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1NWV9QUk9KRUNUID0gIkR1bW15UHJvamVjdCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNTVlfUkVMQVRJVkVfUEFUSCA9ICJcXCIgKyBEVU1NWV9QUk9KRUNUCi0gICAgICAgICAgICArICJcXCIgKyBEVU1NWV9SRVNPVVJDRTsKLQotICAgIHB1YmxpYyBVSU1lc3NhZ2VEaWFsb2dzQXV0byhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gRGlhbG9nQ2hlY2suZ2V0U2hlbGwoKTsKLSAgICB9Ci0KLSAgCi0gICAgLyoKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2Qgc2ltbGlhciB0byBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c6Om9wZW5JbmZvcm1hdGlvbi4KLSAgICAgKiBUaGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBkaWFsb2cgaW5zdGVhZCBvZiBvcGVuaW5nLgotICAgICAqIEBwYXJhbSB0aXRsZSB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UuCi0gICAgICogQHJldHVybiBNZXNzYWdlRGlhbG9nIHRoZSBpbmZvcm1hdGlvbiBkaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlRGlhbG9nIGdldEluZm9ybWF0aW9uRGlhbG9nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCBudWxsLCBtZXNzYWdlLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cuSU5GT1JNQVRJT04sCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCB9LCAwKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBzaW1saWFyIHRvIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzo6b3BlblF1ZXN0aW9uLgotICAgICAqIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGRpYWxvZyBpbnN0ZWFkIG9mIG9wZW5pbmcuCi0gICAgICogQHBhcmFtIHRpdGxlIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZS4KLSAgICAgKiBAcmV0dXJuIE1lc3NhZ2VEaWFsb2cgdGhlIHF1ZXN0aW9uIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1lc3NhZ2VEaWFsb2cgZ2V0UXVlc3Rpb25EaWFsb2coU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIG51bGwsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwgfSwgMCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2Qgc2ltbGlhciB0byBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c6OmdldFdhcm5pbmdEaWFsb2cuCi0gICAgICogVGhlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgZGlhbG9nIGluc3RlYWQgb2Ygb3BlbmluZy4KLSAgICAgKiBAcGFyYW0gdGl0bGUgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLgotICAgICAqIEByZXR1cm4gTWVzc2FnZURpYWxvZyB0aGUgY29uZmlybSBkaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlRGlhbG9nIGdldFdhcm5pbmdEaWFsb2coU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIG51bGwsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5XQVJOSU5HLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwgfSwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFib3J0UGFnZUZsaXBwaW5nKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0V2FybmluZ0RpYWxvZyhKRmFjZVJlc291cmNlcwotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIkFib3J0UGFnZUZsaXBwaW5nRGlhbG9nLnRpdGxlIiksIEpGYWNlUmVzb3VyY2VzCi0gICAgICAgICAgICAgICAgLmdldFN0cmluZygiQWJvcnRQYWdlRmxpcHBpbmdEaWFsb2cubWVzc2FnZSIpKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weU92ZXJ3cml0ZSgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFF1ZXN0aW9uRGlhbG9nKCJFeGlzdHMiLCIiKTsKLSAgICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVByb2plY3QoKSB7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9ICJQcm9qZWN0IjsKLSAgICAgICAgU3RyaW5nIG1zZyA9IiI7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRTaGVsbCgpLCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0IHdpbmRvdyBpY29uCi0gICAgICAgICAgICAgICAgbXNnLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlUmVhZE9ubHlDaGVjaygpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksICJEZWxldGUiLCBudWxsLAotICAgICAgICAgICAgICAiRXhpc3RzIiwKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwgfSwgMCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVJlc291cmNlKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UXVlc3Rpb25EaWFsb2coIkRlbGV0ZSIsIiIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVSZXNvdXJjZXMoKSB7Ci0JCSAgRGlhbG9nIGRpYWxvZyA9IGdldFF1ZXN0aW9uRGlhbG9nKCJEZWxldGUiLCIiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHJvcE92ZXJ3cml0ZSgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKAotICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VOYXZpZ2F0b3JNZXNzYWdlcy5Ecm9wQWRhcHRlcl9xdWVzdGlvbiwKLSAgICAgICAgICAgICAgICBudWxsLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChSZXNvdXJjZU5hdmlnYXRvck1lc3NhZ2VzLkRyb3BBZGFwdGVyX292ZXJ3cml0ZVF1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgRFVNTVlfUkVMQVRJVkVfUEFUSCB9KSwKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwgfSwgMCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVycm9yQ2xvc2luZygpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFF1ZXN0aW9uRGlhbG9nKFdvcmtiZW5jaE1lc3NhZ2VzLkVycm9yLAotICAgICAgICAgICAgICAgIFdvcmtiZW5jaE1lc3NhZ2VzLkVycm9yQ2xvc2luZ05vQXJnKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVFeHRlbnNpb25FbXB0eSgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldEluZm9ybWF0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgICJFbXB0eSIsCi0gICAgICAgICAgICAgICAgIkV4dGVuc2lvbkVtcHR5TWVzc2FnZSIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlTmFtZVdyb25nKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0SW5mb3JtYXRpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgIkludmFsaWRUaXRsZSIsCi0gICAgICAgICAgICAgICAiSW52YWxpZE1lc3NhZ2UiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVR5cGVFeGlzdHMoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRJbmZvcm1hdGlvbkRpYWxvZyhXb3JrYmVuY2hNZXNzYWdlcy5GaWxlRWRpdG9yUHJlZmVyZW5jZV9leGlzdHNUaXRsZSwKLSAgICAgICAgICAgICAgICBXb3JrYmVuY2hNZXNzYWdlcy5GaWxlRWRpdG9yUHJlZmVyZW5jZV9leGlzdHNNZXNzYWdlKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFR5cGVfMSgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFdhcm5pbmdEaWFsb2coImludmFsaWRUaXRsZSIsImludmFsaWRNZXNzYWdlIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRUeXBlXzIoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRXYXJuaW5nRGlhbG9nKCJpbnZhbGlkVHlwZSIsICJpbnZhbGlkVHlwZU1lc3NhZ2UiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW92ZVJlYWRPbmx5Q2hlY2soKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRTaGVsbCgpLCAiTW92ZV90aXRsZSIsIG51bGwsICIuTW92ZVJlc291cmNlQWN0aW9uIiwKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwgfSwgMCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vQnVpbGRlcnMoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRXYXJuaW5nRGlhbG9nKCJCdWlsZEFjdGlvbl93YXJuaW5nIiwgIm5vQnVpbGRlcnMiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9HbG9iYWxCdWlsZGVyc0RpYWxvZygpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFdhcm5pbmdEaWFsb2coIkdsb2JhbEJ1aWxkQWN0aW9uX3dhcm5pbmciLCJHbG9iYWxCdWlsZEFjdGlvbl9ub0J1aWxkZXJzIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vUHJvcGVydHlQYWdlKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0SW5mb3JtYXRpb25EaWFsb2coV29ya2JlbmNoTWVzc2FnZXMuUHJvcGVydHlEaWFsb2dfbWVzc2FnZVRpdGxlLCBOTFMuYmluZChXb3JrYmVuY2hNZXNzYWdlcy5Qcm9wZXJ0eURpYWxvZ19ub1Byb3BlcnR5TWVzc2FnZSwgKG5ldyBPYmplY3RbXSB7ICJEdW1teVByb3BlcnR5UGFnZSIgfSkpKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVyYXRpb25Ob3RBdmFpbGFibGUoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRJbmZvcm1hdGlvbkRpYWxvZyhXb3JrYmVuY2hNZXNzYWdlcy5JbmZvcm1hdGlvbiwgIm9wZXJhdGlvbk5vdEF2YWlsYWJsZU1lc3NhZ2UiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcndyaXRlUGVyc3BlY3RpdmUoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRTaGVsbCgpLCBXb3JrYmVuY2hNZXNzYWdlcy5TYXZlUGVyc3BlY3RpdmVfb3ZlcndyaXRlVGl0bGUsIG51bGwsCi0gICAgICAgICAgICAgICAgTkxTLmJpbmQoV29ya2JlbmNoTWVzc2FnZXMuU2F2ZVBlcnNwZWN0aXZlX292ZXJ3cml0ZVF1ZXN0aW9uLCAobmV3IE9iamVjdFtdIHsgIkR1bW15IFBlcnNwZWN0aXZlIiB9KSksCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwgfSwgMCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlZnJlc2hEZWxldGVQcm9qZWN0KCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgIlJlZnJlc2hBY3Rpb25fZGlhbG9nVGl0bGUiLCBudWxsLAotICAgICAgICAgICAgICAgImM6XFxkdW1teXBhdGhcXCIgKyBEVU1NWV9QUk9KRUNULAotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMIH0sIDApOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5hbWVPdmVyd3JpdGUoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRRdWVzdGlvbkRpYWxvZygiLlJlbmFtZVJlc291cmNlQWN0aW9uX3Jlc291cmNlRXhpc3QiLERVTU1ZX1JFTEFUSVZFX1BBVEgpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNldFBlcnNwZWN0aXZlKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgV29ya2JlbmNoTWVzc2FnZXMuUmVzZXRQZXJzcGVjdGl2ZV90aXRsZSwgbnVsbCwgTkxTLmJpbmQoV29ya2JlbmNoTWVzc2FnZXMuUmVzZXRQZXJzcGVjdGl2ZV9tZXNzYWdlLCAobmV3IE9iamVjdFtdIHsgIkR1bW15IFBlcnNwZWN0aXZlIiB9KSksCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUFzT3ZlcndyaXRlKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgIldvcmtiZW5jaE1lc3NhZ2VzLlF1ZXN0aW9uIiwgbnVsbCxEVU1NWV9SRUxBVElWRV9QQVRILCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlQ2hhbmdlcygpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksIFdvcmtiZW5jaE1lc3NhZ2VzLlNhdmVfUmVzb3VyY2UsIG51bGwsIE5MUy5iaW5kKFdvcmtiZW5jaE1lc3NhZ2VzLkVkaXRvck1hbmFnZXJfc2F2ZUNoYW5nZXNRdWVzdGlvbiwgKG5ldyBPYmplY3RbXSB7IERVTU1ZX1JFU09VUkNFIH0pKSwgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdpemFyZENsb3NpbmcoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRTaGVsbCgpLCBKRmFjZVJlc291cmNlcwotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIldpemFyZENsb3NpbmdEaWFsb2dfdGl0bGUiKSwgbnVsbCwgSkZhY2VSZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJXaXphcmRDbG9zaW5nRGlhbG9nX21lc3NhZ2UiKSwKLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwgfSwgMCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdpemFyZE92ZXJ3cml0ZSgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksICJXb3JrYmVuY2hNZXNzYWdlcy5RdWVzdGlvbiIsIG51bGwsICJXaXphcmREYXRhVHJhbnNmZXJfZXhpc3RzUXVlc3Rpb24iLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlOZXdXb3JraW5nU2V0V2l6YXJkQXV0by5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJTmV3V29ya2luZ1NldFdpemFyZEF1dG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4ZTYwNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlOZXdXb3JraW5nU2V0V2l6YXJkQXV0by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JV29ya2luZ1NldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuV29ya2luZ1NldE5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLldvcmtpbmdTZXRUeXBlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5Xb3JraW5nU2V0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5Xb3JraW5nU2V0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkFycmF5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRGlhbG9nQ2hlY2s7Ci0KLS8qKgotICogVGVzdHMgdGhlIFdvcmtpbmdTZXROZXdXaXphcmQuCi0gKiBUZXN0cyBpbnB1dCB2YWxpZGF0aW9uLCBwcmVzZW5jZSBvZiB0eXBlIHBhZ2UgYW5kIGNvcnJlY3QgZWRpdCBwYWdlCi0gKiBhbmQgd2l6YXJkIHBhZ2UgdGV4dHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVSU5ld1dvcmtpbmdTZXRXaXphcmRBdXRvIGV4dGVuZHMgVUlXb3JraW5nU2V0V2l6YXJkc0F1dG8gewotCi0gICAgcHVibGljIFVJTmV3V29ya2luZ1NldFdpemFyZEF1dG8oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmV2l6YXJkID0gZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2luZ1NldE1hbmFnZXIoKS5jcmVhdGVXb3JraW5nU2V0TmV3V2l6YXJkKG51bGwpOwotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFR5cGVQYWdlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElXaXphcmRQYWdlIHBhZ2UgPSBmV2l6YXJkRGlhbG9nLmdldEN1cnJlbnRQYWdlKCk7Ci0gICAgICAgIFdvcmtpbmdTZXREZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBnZXRFZGl0YWJsZVdvcmtpbmdTZXREZXNjcmlwdG9ycygpOwotICAgICAgICAKLSAgICAgICAgLy8gdGhlIGZpcnN0IHBhZ2UgbXVzdCBiZSB0aGUgdHlwZSBzZWxlY3Rpb24gcGFnZSBpZmYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSB3b3JraW5nIHNldCB0eXBlCi0gICAgICAgIGFzc2VydEVxdWFscyhkZXNjcmlwdG9ycy5sZW5ndGggPiAxLCAocGFnZSBpbnN0YW5jZW9mIFdvcmtpbmdTZXRUeXBlUGFnZSkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNob3VsZCBoYXZlIGF0IGxlYXN0IHJlc291cmNlV29ya2luZ1NldFBhZ2UgYW5kIE1vY2tXb3JraW5nU2V0Ci0gICAgICAgICAqLwotICAgICAgICBhc3NlcnRUcnVlKGRlc2NyaXB0b3JzLmxlbmd0aCA+PSAyKTsKLSAgICAgICAgaWYgKHBhZ2UgaW5zdGFuY2VvZiBXb3JraW5nU2V0VHlwZVBhZ2UpIHsKLSAgICAgICAgICAgIFdvcmtpbmdTZXRUeXBlUGFnZSB0eXBlUGFnZSA9IChXb3JraW5nU2V0VHlwZVBhZ2UpIHBhZ2U7Ci0gICAgICAgICAgICBMaXN0IHdpZGdldHMgPSBnZXRXaWRnZXRzKChDb21wb3NpdGUpIHBhZ2UuZ2V0Q29udHJvbCgpLAotICAgICAgICAgICAgICAgICAgICBUYWJsZS5jbGFzcyk7Ci0gICAgICAgICAgICBUYWJsZSB0YWJsZSA9IChUYWJsZSkgd2lkZ2V0cy5nZXQoMCk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGVzdCBpbml0aWFsIHBhZ2Ugc3RhdGUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRlc2NyaXB0b3JzLmxlbmd0aCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0eXBlUGFnZS5jYW5GbGlwVG9OZXh0UGFnZSgpID09IGZhbHNlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZldpemFyZC5jYW5GaW5pc2goKSA9PSBmYWxzZSk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGVzdCBwYWdlIHN0YXRlIHdpdGggcGFnZSBjb21wbGV0ZSBpbnB1dAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oZGVzY3JpcHRvcnMubGVuZ3RoIC0gMSk7Ci0gICAgICAgICAgICB0YWJsZS5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbiwgbmV3IEV2ZW50KCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0eXBlUGFnZS5jYW5GbGlwVG9OZXh0UGFnZSgpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZldpemFyZC5jYW5GaW5pc2goKSA9PSBmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDaGVjayBwYWdlIHRleHRzIAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhmV2l6YXJkRGlhbG9nLCB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFZGl0UGFnZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBXb3JraW5nU2V0UmVnaXN0cnkgcmVnaXN0cnkgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldFdvcmtpbmdTZXRSZWdpc3RyeSgpOwotICAgICAgICBJV2l6YXJkUGFnZSBwYWdlID0gZldpemFyZERpYWxvZy5nZXRDdXJyZW50UGFnZSgpOwotICAgICAgICBJV2l6YXJkUGFnZSBkZWZhdWx0RWRpdFBhZ2UgPSByZWdpc3RyeS5nZXREZWZhdWx0V29ya2luZ1NldFBhZ2UoKTsKLSAgICAgICAgU3RyaW5nIGRlZmF1bHRFZGl0UGFnZUNsYXNzTmFtZSA9IGRlZmF1bHRFZGl0UGFnZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgV29ya2luZ1NldERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGdldEVkaXRhYmxlV29ya2luZ1NldERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIAotICAgICAgICAvLyB0aGUgZmlyc3QgcGFnZSBtdXN0IGJlIHRoZSB0eXBlIHNlbGVjdGlvbiBwYWdlIGlmZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHdvcmtpbmcgc2V0IHR5cGUKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRlc2NyaXB0b3JzLmxlbmd0aCA+IDEsIChwYWdlIGluc3RhbmNlb2YgV29ya2luZ1NldFR5cGVQYWdlKSk7Ci0KLSAgICAgICAgaWYgKHBhZ2UgaW5zdGFuY2VvZiBXb3JraW5nU2V0VHlwZVBhZ2UpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTZWxlY3QgdGhlIGRlZmF1bHQgKFJlc291cmNlKSB3b3JraW5nIHNldCB0eXBlCi0gICAgICAgICAgICAgKiBhbmQgYWR2YW5jZSB0byBlZGl0IHBhZ2UuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExpc3Qgd2lkZ2V0cyA9IGdldFdpZGdldHMoKENvbXBvc2l0ZSkgcGFnZS5nZXRDb250cm9sKCksCi0gICAgICAgICAgICAgICAgICAgIFRhYmxlLmNsYXNzKTsKLSAgICAgICAgICAgIFRhYmxlIHRhYmxlID0gKFRhYmxlKSB3aWRnZXRzLmdldCgwKTsKLSAgICAgICAgICAgIFRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nU2V0TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGludCBkZXNjcmlwdG9ySW5kZXggPSAwOyBkZXNjcmlwdG9ySW5kZXggPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGRlc2NyaXB0b3JJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgV29ya2luZ1NldERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW2Rlc2NyaXB0b3JJbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRFZGl0UGFnZUNsYXNzTmFtZS5lcXVhbHMoZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhZ2VDbGFzc05hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgd29ya2luZ1NldE5hbWUgPSBkZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3b3JraW5nU2V0TmFtZSk7Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLmdldFRleHQoKS5lcXVhbHMod29ya2luZ1NldE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbihpKTsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZvdW5kKTsKLSAgICAgICAgICAgIGZXaXphcmREaWFsb2cuc2hvd1BhZ2UoZldpemFyZC5nZXROZXh0UGFnZShwYWdlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFnZSA9IGZXaXphcmREaWFsb2cuZ2V0Q3VycmVudFBhZ2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYWdlIGluc3RhbmNlb2YgSVdvcmtpbmdTZXRQYWdlKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBWZXJpZnkgdGhhdCBjb3JyZWN0IHdvcmtpbmcgc2V0IGVkaXQgcGFnZSBpcyBkaXNwbGF5ZWQKLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydFRydWUocGFnZS5nZXRDbGFzcygpID09IGRlZmF1bHRFZGl0UGFnZS5nZXRDbGFzcygpKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogVGVzdCBpbml0aWFsIHBhZ2Ugc3RhdGUKLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydEZhbHNlKHBhZ2UuY2FuRmxpcFRvTmV4dFBhZ2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGZXaXphcmQuY2FuRmluaXNoKCkpOwotICAgICAgICBhc3NlcnROdWxsKHBhZ2UuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICBhc3NlcnROdWxsKHBhZ2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRlc3QgcGFnZSBzdGF0ZSB3aXRoIHBhcnRpYWwgcGFnZSBpbnB1dAotICAgICAgICAgKi8KLSAgICAgICAgc2V0VGV4dFdpZGdldFRleHQoV09SS0lOR19TRVRfTkFNRV8xLCBwYWdlKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocGFnZS5jYW5GbGlwVG9OZXh0UGFnZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmV2l6YXJkLmNhbkZpbmlzaCgpKTsgIC8vIGFsbG93IGZvciBlbXB0eSBzZXRzCi0gICAgICAgIGFzc2VydE51bGwocGFnZS5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFnZS5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRlc3QgcGFnZSBzdGF0ZSB3aXRoIHBhZ2UgY29tcGxldGUgaW5wdXQKLSAgICAgICAgICovCi0gICAgICAgIGNoZWNrVHJlZUl0ZW1zKCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHBhZ2UuY2FuRmxpcFRvTmV4dFBhZ2UoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZldpemFyZC5jYW5GaW5pc2goKSk7Ci0gICAgICAgIGFzc2VydE51bGwocGFnZS5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwocGFnZS5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIGZXaXphcmQucGVyZm9ybUZpbmlzaCgpOwotICAgICAgICBJV29ya2luZ1NldCB3b3JraW5nU2V0ID0gKChXb3JraW5nU2V0TmV3V2l6YXJkKSBmV2l6YXJkKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgSUFkYXB0YWJsZVtdIHdvcmtpbmdTZXRJdGVtcyA9IHdvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdPUktJTkdfU0VUX05BTUVfMSwgd29ya2luZ1NldC5nZXROYW1lKCkpOwotCi0gICAgICAgIExpc3Qgd2lkZ2V0cyA9IGdldFdpZGdldHMoKENvbXBvc2l0ZSkgcGFnZS5nZXRDb250cm9sKCksIFRyZWUuY2xhc3MpOwotICAgICAgICBUcmVlIHRyZWUgPSAoVHJlZSkgd2lkZ2V0cy5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh3b3JraW5nU2V0SXRlbXMubGVuZ3RoLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWwuY29udGFpbnMod29ya2luZ1NldEl0ZW1zLCBwMSkpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5VXRpbC5jb250YWlucyh3b3JraW5nU2V0SXRlbXMsIHAyKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ2hlY2sgcGFnZSB0ZXh0cyAKLSAgICAgICAgICovCi0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGZXaXphcmREaWFsb2csIHRoaXMpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJUHJlZmVyZW5jZXMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9VSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDBlZDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlByb3BlcnR5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUHJvcGVydHlQYWdlQ29udHJpYnV0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUHJvcGVydHlQYWdlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRGlhbG9nQ2hlY2s7Ci0KLXB1YmxpYyBjbGFzcyBVSVByZWZlcmVuY2VzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgSVByb2plY3QgX3Byb2plY3Q7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIkR1bW15UHJvamVjdCI7Ci0KLSAgICBwdWJsaWMgVUlQcmVmZXJlbmNlcyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gRGlhbG9nQ2hlY2suZ2V0U2hlbGwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IGdldER1bW15UHJvamVjdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3RzW10gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9qZWN0cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0c1tpXS5nZXROYW1lKCkuZXF1YWxzKFBST0pFQ1RfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdHNbaV0uZGVsZXRlKHRydWUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLSAgICAgICAgICAgICAgICAgICAgUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgICAgIF9wcm9qZWN0LmNyZWF0ZShudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9wcm9qZWN0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWxldGVEdW1teVByb2plY3QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoX3Byb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIF9wcm9qZWN0LmRlbGV0ZSh0cnVlLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFByZWZlcmVuY2VEaWFsb2cgZ2V0UHJlZmVyZW5jZURpYWxvZyhTdHJpbmcgaWQpIHsKLSAgICAgICAgUHJlZmVyZW5jZURpYWxvZ1dyYXBwZXIgZGlhbG9nID0gbnVsbDsKLSAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlciA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZGlhbG9nID0gbmV3IFByZWZlcmVuY2VEaWFsb2dXcmFwcGVyKGdldFNoZWxsKCksIG1hbmFnZXIpOwotICAgICAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoSGVscENvbnRleHRJZHMuUFJFRkVSRU5DRV9ESUFMT0cpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFuYWdlci5nZXRFbGVtZW50cygKLSAgICAgICAgICAgICAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgSVByZWZlcmVuY2VOb2RlIG5vZGUgPSAoSVByZWZlcmVuY2VOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eURpYWxvZyBnZXRQcm9wZXJ0eURpYWxvZyhTdHJpbmcgaWQpIHsKLSAgICAgICAgUHJvcGVydHlEaWFsb2dXcmFwcGVyIGRpYWxvZyA9IG51bGw7Ci0KLSAgICAgICAgUHJvcGVydHlQYWdlTWFuYWdlciBtYW5hZ2VyID0gbmV3IFByb3BlcnR5UGFnZU1hbmFnZXIoKTsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gIiI7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gIiI7Ci0KLSAgICAgICAgSVByb2plY3QgZWxlbWVudCA9IGdldER1bW15UHJvamVjdCgpOwotICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvLyBsb2FkIHBhZ2VzIGZvciB0aGUgc2VsZWN0aW9uCi0gICAgICAgIC8vIGZpbGwgdGhlIG1hbmFnZXIgd2l0aCBjb250cmlidXRpb25zIGZyb20gdGhlIG1hdGNoaW5nIGNvbnRyaWJ1dG9ycwotICAgICAgICBQcm9wZXJ0eVBhZ2VDb250cmlidXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpCi0gICAgICAgICAgICAgICAgLmNvbnRyaWJ1dGUobWFuYWdlciwgZWxlbWVudCk7Ci0KLSAgICAgICAgSVdvcmtiZW5jaEFkYXB0ZXIgYWRhcHRlciA9IChJV29ya2JlbmNoQWRhcHRlcikgZWxlbWVudAotICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbmFtZSA9IGFkYXB0ZXIuZ2V0TGFiZWwoZWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0ZXN0aW5nIGlmIHRoZXJlIGFyZSBwYWdlcyBpbiB0aGUgbWFuYWdlcgotICAgICAgICBJdGVyYXRvciBwYWdlcyA9IG1hbmFnZXIuZ2V0RWxlbWVudHMoUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKQotICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpOwotICAgICAgICBpZiAoIXBhZ2VzLmhhc05leHQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aXRsZSA9IE5MUy5iaW5kKFdvcmtiZW5jaE1lc3NhZ2VzLlByb3BlcnR5RGlhbG9nX3Byb3BlcnR5TWVzc2FnZSwgKG5ldyBPYmplY3RbXSB7IG5hbWUgfSkpOwotICAgICAgICAgICAgZGlhbG9nID0gbmV3IFByb3BlcnR5RGlhbG9nV3JhcHBlcihnZXRTaGVsbCgpLCBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50KSk7Ci0gICAgICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLSAgICAgICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzLlBST1BFUlRZX0RJQUxPRyk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFuYWdlci5nZXRFbGVtZW50cygKLSAgICAgICAgICAgICAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgSVByZWZlcmVuY2VOb2RlIG5vZGUgPSAoSVByZWZlcmVuY2VOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdvcmtiZW5jaFByZWYoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRQcmVmZXJlbmNlRGlhbG9nKCJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuV29ya2JlbmNoIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlYXJhbmNlUHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5WaWV3cyIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRleHRFZGl0b3JQcmVmKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJlZmVyZW5jZURpYWxvZygib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLlRleHRFZGl0b3IiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVFZGl0b3JzUHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5GaWxlRWRpdG9ycyIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxIaXN0b3J5UHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5GaWxlU3RhdGVzIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJzcGVjdGl2ZXNQcmVmKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJlZmVyZW5jZURpYWxvZygib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLlBlcnNwZWN0aXZlcyIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mb1Byb3AoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRQcm9wZXJ0eURpYWxvZygib3JnLmVjbGlwc2UudWkucHJvcGVydHlwYWdlcy5pbmZvLmZpbGUiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2plY3RSZWZlcmVuY2VzUHJvcCgpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByb3BlcnR5RGlhbG9nKCJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eXBhZ2VzLnByb2plY3QucmVmZXJlbmNlIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJUHJlZmVyZW5jZXNBdXRvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlQcmVmZXJlbmNlc0F1dG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2OGIzOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlQcmVmZXJlbmNlc0F1dG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlByb3BlcnR5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUHJvcGVydHlQYWdlQ29udHJpYnV0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUHJvcGVydHlQYWdlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRGlhbG9nQ2hlY2s7Ci0KLXB1YmxpYyBjbGFzcyBVSVByZWZlcmVuY2VzQXV0byBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgSVByb2plY3QgX3Byb2plY3Q7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIkR1bW15UHJvamVjdCI7Ci0KLSAgICBwdWJsaWMgVUlQcmVmZXJlbmNlc0F1dG8oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gRGlhbG9nQ2hlY2suZ2V0U2hlbGwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IGdldER1bW15UHJvamVjdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3RzW10gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9qZWN0cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0c1tpXS5nZXROYW1lKCkuZXF1YWxzKFBST0pFQ1RfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdHNbaV0uZGVsZXRlKHRydWUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLSAgICAgICAgICAgICAgICAgICAgUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgICAgIF9wcm9qZWN0LmNyZWF0ZShudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9wcm9qZWN0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWxldGVEdW1teVByb2plY3QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoX3Byb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIF9wcm9qZWN0LmRlbGV0ZSh0cnVlLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFByZWZlcmVuY2VEaWFsb2cgZ2V0UHJlZmVyZW5jZURpYWxvZyhTdHJpbmcgaWQpIHsKLSAgICAgICAgUHJlZmVyZW5jZURpYWxvZ1dyYXBwZXIgZGlhbG9nID0gbnVsbDsKLSAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlciA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZGlhbG9nID0gbmV3IFByZWZlcmVuY2VEaWFsb2dXcmFwcGVyKGdldFNoZWxsKCksIG1hbmFnZXIpOwotICAgICAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoSGVscENvbnRleHRJZHMuUFJFRkVSRU5DRV9ESUFMT0cpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFuYWdlci5nZXRFbGVtZW50cygKLSAgICAgICAgICAgICAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgSVByZWZlcmVuY2VOb2RlIG5vZGUgPSAoSVByZWZlcmVuY2VOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eURpYWxvZyBnZXRQcm9wZXJ0eURpYWxvZyhTdHJpbmcgaWQpIHsKLSAgICAgICAgUHJvcGVydHlEaWFsb2dXcmFwcGVyIGRpYWxvZyA9IG51bGw7Ci0KLSAgICAgICAgUHJvcGVydHlQYWdlTWFuYWdlciBtYW5hZ2VyID0gbmV3IFByb3BlcnR5UGFnZU1hbmFnZXIoKTsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gIiI7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gIiI7Ci0KLSAgICAgICAgSVByb2plY3QgZWxlbWVudCA9IGdldER1bW15UHJvamVjdCgpOwotICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvLyBsb2FkIHBhZ2VzIGZvciB0aGUgc2VsZWN0aW9uCi0gICAgICAgIC8vIGZpbGwgdGhlIG1hbmFnZXIgd2l0aCBjb250cmlidXRpb25zIGZyb20gdGhlIG1hdGNoaW5nIGNvbnRyaWJ1dG9ycwotICAgICAgICBQcm9wZXJ0eVBhZ2VDb250cmlidXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpCi0gICAgICAgICAgICAgICAgLmNvbnRyaWJ1dGUobWFuYWdlciwgZWxlbWVudCk7Ci0KLSAgICAgICAgSVdvcmtiZW5jaEFkYXB0ZXIgYWRhcHRlciA9IChJV29ya2JlbmNoQWRhcHRlcikgZWxlbWVudAotICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbmFtZSA9IGFkYXB0ZXIuZ2V0TGFiZWwoZWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0ZXN0aW5nIGlmIHRoZXJlIGFyZSBwYWdlcyBpbiB0aGUgbWFuYWdlcgotICAgICAgICBJdGVyYXRvciBwYWdlcyA9IG1hbmFnZXIuZ2V0RWxlbWVudHMoUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKQotICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpOwotICAgICAgICBpZiAoIXBhZ2VzLmhhc05leHQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aXRsZSA9IE5MUy5iaW5kKFdvcmtiZW5jaE1lc3NhZ2VzLlByb3BlcnR5RGlhbG9nX3Byb3BlcnR5TWVzc2FnZSwgKG5ldyBPYmplY3RbXSB7IG5hbWUgfSkpOwotICAgICAgICAgICAgZGlhbG9nID0gbmV3IFByb3BlcnR5RGlhbG9nV3JhcHBlcihnZXRTaGVsbCgpLCBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50KSk7Ci0gICAgICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLSAgICAgICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzLlBST1BFUlRZX0RJQUxPRyk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFuYWdlci5nZXRFbGVtZW50cygKLSAgICAgICAgICAgICAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuUFJFX09SREVSKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgSVByZWZlcmVuY2VOb2RlIG5vZGUgPSAoSVByZWZlcmVuY2VOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdvcmtiZW5jaFByZWYoKSB7Ci0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBnZXRQcmVmZXJlbmNlRGlhbG9nKCJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuV29ya2JlbmNoIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcGVhcmFuY2VQcmVmKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJlZmVyZW5jZURpYWxvZygib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLlZpZXdzIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRUZXh0RWRpdG9yUHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5UZXh0RWRpdG9yIik7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVFZGl0b3JzUHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5GaWxlRWRpdG9ycyIpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbEhpc3RvcnlQcmVmKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJlZmVyZW5jZURpYWxvZygib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkZpbGVTdGF0ZXMiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc3BlY3RpdmVzUHJlZigpIHsKLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByZWZlcmVuY2VEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5QZXJzcGVjdGl2ZXMiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvL09ubHkgcmVhbGx5IGNoZWNraW5nIGlmIHRoaXMgb3BlbnMgd2l0aG91dCBhbiBleGNlcHRpb24KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9udEVkaXRvcnNQcmVmKCkgewotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJlZmVyZW5jZURpYWxvZygib3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9ncy5Gb250RmllbGRFZGl0b3JUZXN0UHJlZmVyZW5jZVBhZ2UiKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mb1Byb3AoKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbW1lbnRlZCBvdXQgYmVjYXVzZSBpdCBnZW5lcmF0ZXMgYSBmYWlsdXJlCi0gICAgICAgICAqIG9mIGV4cGVjdCBhbmQgYWN0dWFsIHdpZHRoIHZhbHVlcy4gU3VzcGVjdCB0aGlzCi0gICAgICAgICAqIGlzIGFuIFNXVCBpc3N1ZS4KLSAgICAgICAgICogCi0gICAgICAgICBEaWFsb2cgZGlhbG9nID0gZ2V0UHJvcGVydHlEaWFsb2coIm9yZy5lY2xpcHNlLnVpLnByb3BlcnR5cGFnZXMuaW5mby5maWxlIik7Ci0gICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdFJlZmVyZW5jZXNQcm9wKCkgewotICAgICAgICAvKgotICAgICAgICAgKiBDb21tZW50ZWQgb3V0IGJlY2F1c2UgaXQgZ2VuZXJhdGVzIGEgZmFpbHVyZQotICAgICAgICAgKiBvZiBleHBlY3QgYW5kIGFjdHVhbCB3aWR0aCB2YWx1ZXMuIFN1c3BlY3QgdGhpcwotICAgICAgICAgKiBpcyBhbiBTV1QgaXNzdWUuCi0gICAgICAgICAqIAotICAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGdldFByb3BlcnR5RGlhbG9nKCJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eXBhZ2VzLnByb2plY3QucmVmZXJlbmNlIik7Ci0gICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBlZGl0b3JzIHByZWZlcmVuY2UgcGFnZSBhbmQgdG9nZ2xlIHRoZQotICAgICAqIGVuYWJsZSBzdGF0ZSB0d2ljZSB0byBiZSBzdXJlIHRoZXJlIGFyZSBubyBlcnJvcnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZpZWxkRWRpdG9yRW5hYmxlUHJlZigpIHsKLQotICAgICAgICBQcmVmZXJlbmNlRGlhbG9nV3JhcHBlciBkaWFsb2cgPSBudWxsOwotICAgICAgICBQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZ1dyYXBwZXIoZ2V0U2hlbGwoKSwgbWFuYWdlcik7Ci0gICAgICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYW5hZ2VyLmdldEVsZW1lbnRzKAotICAgICAgICAgICAgICAgICAgICBQcmVmZXJlbmNlTWFuYWdlci5QUkVfT1JERVIpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IChJUHJlZmVyZW5jZU5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAobm9kZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzLkVuYWJsZVRlc3RQcmVmZXJlbmNlUGFnZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgRW5hYmxlVGVzdFByZWZlcmVuY2VQYWdlIHBhZ2UgPSAoRW5hYmxlVGVzdFByZWZlcmVuY2VQYWdlKSBkaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFnZShub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgcGFnZS5mbGlwU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgcGFnZS5mbGlwU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9VSVdpemFyZHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZGlhbG9ncy9VSVdpemFyZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5NWM3Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlXaXphcmRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRpYWxvZ3M7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5FeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5JbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5OZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklJREVIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLm5ld3Jlc291cmNlLlJlc291cmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkRpYWxvZ0NoZWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdGaWxlUmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld0ZvbGRlclJlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQ7Ci0KLXB1YmxpYyBjbGFzcyBVSVdpemFyZHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfV0lEVEggPSA0NzA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9IRUlHSFQgPSA1NTA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9XSURUSF8yID0gNTAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfSEVJR0hUXzIgPSA1MDA7Ci0KLSAgICBwdWJsaWMgVUlXaXphcmRzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0gICAgICAgIHJldHVybiBEaWFsb2dDaGVjay5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgV2l6YXJkRGlhbG9nIGV4cG9ydFdpemFyZChJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgIEV4cG9ydFdpemFyZCB3aXphcmQgPSBuZXcgRXhwb3J0V2l6YXJkKCk7Ci0gICAgICAgIHdpemFyZC5pbml0KGdldFdvcmtiZW5jaCgpLCBudWxsKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uKCJFeHBvcnRSZXNvdXJjZXNBY3Rpb24iKTsKLSAgICAgICAgaWYgKHdpemFyZFNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgIC5hZGROZXdTZWN0aW9uKCJFeHBvcnRSZXNvdXJjZXNBY3Rpb24iKTsKLSAgICAgICAgd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLSAgICAgICAgd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEgsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLSAgICAgICAgICAgICAgICBTSVpJTkdfV0laQVJEX0hFSUdIVCk7Ci0gICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwgSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzLkVYUE9SVF9XSVpBUkQpOwotCi0gICAgICAgIGlmIChwYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhZ2Uuc2V0V2l6YXJkKHdpemFyZCk7Ci0gICAgICAgICAgICBkaWFsb2cuc2hvd1BhZ2UocGFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpYWxvZzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFdpemFyZERpYWxvZyBpbXBvcnRXaXphcmQoSVdpemFyZFBhZ2UgcGFnZSkgewotICAgICAgICBJbXBvcnRXaXphcmQgd2l6YXJkID0gbmV3IEltcG9ydFdpemFyZCgpOwotICAgICAgICB3aXphcmQuaW5pdChnZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAuZ2V0U2VjdGlvbigiSW1wb3J0UmVzb3VyY2VzQWN0aW9uIik7Ci0gICAgICAgIGlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotICAgICAgICAgICAgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAuYWRkTmV3U2VjdGlvbigiSW1wb3J0UmVzb3VyY2VzQWN0aW9uIik7Ci0gICAgICAgIHdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0gICAgICAgIHdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0KLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEgsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLSAgICAgICAgICAgICAgICBTSVpJTkdfV0laQVJEX0hFSUdIVCk7Ci0gICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwgSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzLklNUE9SVF9XSVpBUkQpOwotCi0gICAgICAgIGlmIChwYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhZ2Uuc2V0V2l6YXJkKHdpemFyZCk7Ci0gICAgICAgICAgICBkaWFsb2cuc2hvd1BhZ2UocGFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpYWxvZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0UmVzb3VyY2VzKCkgey8vcmVmZXJlbmNlOiBFeHBvcnRSZXNvdXJjZXNBY3Rpb24KLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGV4cG9ydFdpemFyZChudWxsKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogMUdKV0QyRTogSVRQVUk6QUxMIC0gVGVzdCBjbGFzc2VzIHNob3VsZCBub3QgYmUgcmVsZWFzZWQgaW4gcHVibGljIHBhY2thZ2VzLgotICAgICAqIAotICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVN5c3RlbUV4cG9ydCgpIHsKLSAgICAgRGlhbG9nIGRpYWxvZyA9IGV4cG9ydFdpemFyZCggRGF0YVRyYW5zZmVyVGVzdFN0dWIubmV3RmlsZVN5c3RlbVJlc291cmNlRXhwb3J0UGFnZTEobnVsbCkgKTsKLSAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgIH0KLSAgICAgcHVibGljIHZvaWQgdGVzdFppcEZpbGVFeHBvcnQoKSB7Ci0gICAgIERpYWxvZyBkaWFsb2cgPSBleHBvcnRXaXphcmQoIERhdGFUcmFuc2ZlclRlc3RTdHViLm5ld1ppcEZpbGVSZXNvdXJjZUV4cG9ydFBhZ2UxKG51bGwpICk7Ci0gICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgICB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEltcG9ydFJlc291cmNlcygpIHsvL3JlZmVyZW5jZTogSW1wb3J0UmVzb3VyY2VzQWN0aW9uCi0gICAgICAgIERpYWxvZyBkaWFsb2cgPSBpbXBvcnRXaXphcmQobnVsbCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDFHSldEMkU6IElUUFVJOkFMTCAtIFRlc3QgY2xhc3NlcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkIGluIHB1YmxpYyBwYWNrYWdlcy4KLSAgICAgKiAKLSAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVTeXN0ZW1JbXBvcnQoKSB7Ci0gICAgIERpYWxvZyBkaWFsb2cgPSBpbXBvcnRXaXphcmQoIERhdGFUcmFuc2ZlclRlc3RTdHViLm5ld0ZpbGVTeXN0ZW1SZXNvdXJjZUltcG9ydFBhZ2UxKFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpICk7Ci0gICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgICB9Ci0gICAgIHB1YmxpYyB2b2lkIHRlc3RaaXBGaWxlSW1wb3J0KCkgewotICAgICBEaWFsb2cgZGlhbG9nID0gaW1wb3J0V2l6YXJkKCBEYXRhVHJhbnNmZXJUZXN0U3R1Yi5uZXdaaXBGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMShudWxsKSApOwotICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICAgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdGaWxlKCkgewotICAgICAgICBCYXNpY05ld0ZpbGVSZXNvdXJjZVdpemFyZCB3aXphcmQgPSBuZXcgQmFzaWNOZXdGaWxlUmVzb3VyY2VXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIHdpemFyZC5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KCJDcmVhdGVGaWxlQWN0aW9uX3RpdGxlIik7IAotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLk5FV19GSUxFX1dJWkFSRCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdGb2xkZXIoKSB7Ci0gICAgICAgIEJhc2ljTmV3Rm9sZGVyUmVzb3VyY2VXaXphcmQgd2l6YXJkID0gbmV3IEJhc2ljTmV3Rm9sZGVyUmVzb3VyY2VXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIHdpemFyZC5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KCJDcmVhdGVGb2xkZXJBY3Rpb25fdGl0bGUiKTsgCi0gICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLSAgICAgICAgCQlJSURFSGVscENvbnRleHRJZHMuTkVXX0ZPTERFUl9XSVpBUkQpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3UHJvamVjdFBhZ2UxKCkgewotICAgICAgICBCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZCB3aXphcmQgPSBuZXcgQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0gICAgICAgIHdpemFyZC5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoCi0gICAgICAgICAgICAgICAgTWF0aC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSF8yLCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0gICAgICAgICAgICAgICAgU0laSU5HX1dJWkFSRF9IRUlHSFRfMik7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoIkNyZWF0ZUZpbGVBY3Rpb25fdGl0bGUiKTsgCi0gICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLSAgICAgICAgCQlJSURFSGVscENvbnRleHRJZHMuTkVXX1BST0pFQ1RfV0laQVJEKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld1Byb2plY3RQYWdlMigpIHsKLSAgICAgICAgQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQgd2l6YXJkID0gbmV3IEJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkKCk7Ci0gICAgICAgIHdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotICAgICAgICB3aXphcmQuc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0KLSAgICAgICAgV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZVBhZ2UgcGFnZSA9IG5ldyBXaXphcmROZXdQcm9qZWN0UmVmZXJlbmNlUGFnZSgKLSAgICAgICAgICAgICAgICAiYmFzaWNSZWZlcmVuY2VQcm9qZWN0UGFnZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcGFnZS5zZXRUaXRsZShSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfcmVmZXJlbmNlVGl0bGUpOwotICAgICAgICBwYWdlLnNldERlc2NyaXB0aW9uKFJlc291cmNlTWVzc2FnZXMuTmV3UHJvamVjdF9yZWZlcmVuY2VEZXNjcmlwdGlvbik7Ci0gICAgICAgIHBhZ2Uuc2V0V2l6YXJkKHdpemFyZCk7Ci0KLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEhfMiwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUXzIpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KCJDcmVhdGVGaWxlQWN0aW9uX3RpdGxlIik7IAkJCi0gICAgICAgIGRpYWxvZy5zaG93UGFnZShwYWdlKTsKLSAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAJCUlJREVIZWxwQ29udGV4dElkcy5ORVdfUFJPSkVDVF9XSVpBUkQpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2coZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3UHJvamVjdCgpIHsKLSAgICAgICAgLy8gQ3JlYXRlIHdpemFyZCBzZWxlY3Rpb24gd2l6YXJkLgotICAgICAgICBOZXdXaXphcmQgd2l6YXJkID0gbmV3IE5ld1dpemFyZCgpOwotICAgICAgICB3aXphcmQuc2V0UHJvamVjdHNPbmx5KHRydWUpOwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uVG9QYXNzID0gbnVsbDsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgICAgc2VsZWN0aW9uVG9QYXNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNlbGVjdGlvblRvUGFzcyA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0gICAgICAgIHdpemFyZC5pbml0KGdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb25Ub1Bhc3MpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oIk5ld1dpemFyZEFjdGlvbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHdpemFyZFNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzLmFkZE5ld1NlY3Rpb24oIk5ld1dpemFyZEFjdGlvbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLSAgICAgICAgd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQotICAgICAgICAvLyBDcmVhdGUgd2l6YXJkIGRpYWxvZy4KLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEhfMiwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUXzIpOwotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgIAkJSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1dJWkFSRCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdSZXNvdXJjZSgpIHsKLSAgICAgICAgTmV3V2l6YXJkIHdpemFyZCA9IG5ldyBOZXdXaXphcmQoKTsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvblRvUGFzcyA9IG51bGw7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgICAgIHNlbGVjdGlvblRvUGFzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZWxlY3Rpb25Ub1Bhc3MgPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotICAgICAgICB3aXphcmQuaW5pdChnZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uVG9QYXNzKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uKCJOZXdXaXphcmRBY3Rpb24iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotICAgICAgICAgICAgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncy5hZGROZXdTZWN0aW9uKCJOZXdXaXphcmRBY3Rpb24iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0gICAgICAgIHdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0KLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEhfMiwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUXzIpOwotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksIElXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5ORVdfV0laQVJEKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlXaXphcmRzQXV0by5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJV2l6YXJkc0F1dG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlNjc3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlXaXphcmRzQXV0by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdQcm9qZWN0UmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLkV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLkltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSUlERUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMubmV3cmVzb3VyY2UuUmVzb3VyY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRGlhbG9nQ2hlY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdGaWxlUmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld0ZvbGRlclJlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQ7Ci0KLXB1YmxpYyBjbGFzcyBVSVdpemFyZHNBdXRvIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX1dJRFRIID0gNDcwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfSEVJR0hUID0gNTUwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfV0lEVEhfMiA9IDUwMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX0hFSUdIVF8yID0gNTAwOwotCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0gICAgcHVibGljIFVJV2l6YXJkc0F1dG8oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgcmV0dXJuIERpYWxvZ0NoZWNrLmdldFNoZWxsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBXaXphcmREaWFsb2cgZXhwb3J0V2l6YXJkKElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgRXhwb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBFeHBvcnRXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkLmluaXQoZ2V0V29ya2JlbmNoKCksIG51bGwpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldFNlY3Rpb24oIkV4cG9ydFJlc291cmNlc0FjdGlvbiIpOwotICAgICAgICBpZiAod2l6YXJkU2V0dGluZ3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgLmFkZE5ld1NlY3Rpb24oIkV4cG9ydFJlc291cmNlc0FjdGlvbiIpOwotICAgICAgICB3aXphcmQuc2V0RGlhbG9nU2V0dGluZ3Mod2l6YXJkU2V0dGluZ3MpOwotICAgICAgICB3aXphcmQuc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoCi0gICAgICAgICAgICAgICAgTWF0aC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSCwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUKTsKLSAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLCBJV29ya2JlbmNoSGVscENvbnRleHRJZHMuRVhQT1JUX1dJWkFSRCk7Ci0KLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFnZS5zZXRXaXphcmQod2l6YXJkKTsKLSAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShwYWdlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlhbG9nOwotICAgIH0KLQotICAgIHByaXZhdGUgV2l6YXJkRGlhbG9nIGltcG9ydFdpemFyZChJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgIEltcG9ydFdpemFyZCB3aXphcmQgPSBuZXcgSW1wb3J0V2l6YXJkKCk7Ci0gICAgICAgIHdpemFyZC5pbml0KGdldFdvcmtiZW5jaCgpLCBudWxsKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uKCJJbXBvcnRSZXNvdXJjZXNBY3Rpb24iKTsKLSAgICAgICAgaWYgKHdpemFyZFNldHRpbmdzID09IG51bGwpCi0gICAgICAgICAgICB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgIC5hZGROZXdTZWN0aW9uKCJJbXBvcnRSZXNvdXJjZXNBY3Rpb24iKTsKLSAgICAgICAgd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLSAgICAgICAgd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoCi0gICAgICAgICAgICAgICAgTWF0aC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSCwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUKTsKLSAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLCBJV29ya2JlbmNoSGVscENvbnRleHRJZHMuSU1QT1JUX1dJWkFSRCk7Ci0KLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFnZS5zZXRXaXphcmQod2l6YXJkKTsKLSAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShwYWdlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlhbG9nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotICAgICAgICAgICAgICAgIHByb2plY3QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBvcnRSZXNvdXJjZXMoKSB7Ly9yZWZlcmVuY2U6IEV4cG9ydFJlc291cmNlc0FjdGlvbgotICAgICAgICBEaWFsb2cgZGlhbG9nID0gZXhwb3J0V2l6YXJkKG51bGwpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDFHSldEMkU6IElUUFVJOkFMTCAtIFRlc3QgY2xhc3NlcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkIGluIHB1YmxpYyBwYWNrYWdlcy4KLSAgICAgKiAKLSAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVTeXN0ZW1FeHBvcnQoKSB7Ci0gICAgIERpYWxvZyBkaWFsb2cgPSBleHBvcnRXaXphcmQoIERhdGFUcmFuc2ZlclRlc3RTdHViLm5ld0ZpbGVTeXN0ZW1SZXNvdXJjZUV4cG9ydFBhZ2UxKG51bGwpICk7Ci0gICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgIH0KLSAgICAgcHVibGljIHZvaWQgdGVzdFppcEZpbGVFeHBvcnQoKSB7Ci0gICAgIERpYWxvZyBkaWFsb2cgPSBleHBvcnRXaXphcmQoIERhdGFUcmFuc2ZlclRlc3RTdHViLm5ld1ppcEZpbGVSZXNvdXJjZUV4cG9ydFBhZ2UxKG51bGwpICk7Ci0gICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0UmVzb3VyY2VzKCkgey8vcmVmZXJlbmNlOiBJbXBvcnRSZXNvdXJjZXNBY3Rpb24KLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IGltcG9ydFdpemFyZChudWxsKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAxR0pXRDJFOiBJVFBVSTpBTEwgLSBUZXN0IGNsYXNzZXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCBpbiBwdWJsaWMgcGFja2FnZXMuCi0gICAgICogCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlU3lzdGVtSW1wb3J0KCkgewotICAgICBEaWFsb2cgZGlhbG9nID0gaW1wb3J0V2l6YXJkKCBEYXRhVHJhbnNmZXJUZXN0U3R1Yi5uZXdGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMShXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSApOwotICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgICB9Ci0gICAgIHB1YmxpYyB2b2lkIHRlc3RaaXBGaWxlSW1wb3J0KCkgewotICAgICBEaWFsb2cgZGlhbG9nID0gaW1wb3J0V2l6YXJkKCBEYXRhVHJhbnNmZXJUZXN0U3R1Yi5uZXdaaXBGaWxlUmVzb3VyY2VJbXBvcnRQYWdlMShudWxsKSApOwotICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgICB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld0ZpbGUoKSB7Ci0gICAgICAgIEJhc2ljTmV3RmlsZVJlc291cmNlV2l6YXJkIHdpemFyZCA9IG5ldyBCYXNpY05ld0ZpbGVSZXNvdXJjZVdpemFyZCgpOwotICAgICAgICB3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLSAgICAgICAgd2l6YXJkLnNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoIkNyZWF0ZUZpbGVBY3Rpb25fdGl0bGUiKTsKLSAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5ORVdfRklMRV9XSVpBUkQpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIGJ1ZyAzMDcxOSBbTGlua2VkIFJlc291cmNlc10gTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBzZXR0aW5nIGZpbGVuYW1lIGZvciBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdGaWxlMigpIHsKLSAgICAgICAgQmFzaWNOZXdGaWxlUmVzb3VyY2VXaXphcmQgd2l6YXJkID0gbmV3IEJhc2ljTmV3RmlsZVJlc291cmNlV2l6YXJkKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuYWRkUGFnZXMoKTsKLSAgICAgICAgICAgICAgICBJV2l6YXJkUGFnZSBwYWdlID0gZ2V0UGFnZSgibmV3RmlsZVBhZ2UxIik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgbmV3RmlsZVBhZ2UxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgaW5zdGFuY2VvZiBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKTsKLSAgICAgICAgICAgICAgICBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIGZpbGVDcmVhdGlvblBhZ2UgPSAoV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSkgcGFnZTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QgPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJ0ZXN0TmV3RmlsZTIiKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbGVDcmVhdGlvblBhZ2Uuc2V0Q29udGFpbmVyRnVsbFBhdGgocHJvamVjdC5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICAgICAgICBmaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKCJ0ZXN0RmlsZU5hbWUudGVzdCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotICAgICAgICB3aXphcmQuc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCgiQ3JlYXRlRmlsZUFjdGlvbl90aXRsZSIpOyAKLSAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5ORVdfRklMRV9XSVpBUkQpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdGb2xkZXIoKSB7Ci0gICAgICAgIEJhc2ljTmV3Rm9sZGVyUmVzb3VyY2VXaXphcmQgd2l6YXJkID0gbmV3IEJhc2ljTmV3Rm9sZGVyUmVzb3VyY2VXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIHdpemFyZC5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KCJDcmVhdGVGb2xkZXJBY3Rpb25fdGl0bGUiKTsgCi0gICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBJSURFSGVscENvbnRleHRJZHMuTkVXX0ZPTERFUl9XSVpBUkQpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdQcm9qZWN0UGFnZTEoKSB7Ci0gICAgICAgIEJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkIHdpemFyZCA9IG5ldyBCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZCgpOwotICAgICAgICB3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBudWxsKTsKLSAgICAgICAgd2l6YXJkLnNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCi0gICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSgKLSAgICAgICAgICAgICAgICBNYXRoLm1heChTSVpJTkdfV0laQVJEX1dJRFRIXzIsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLSAgICAgICAgICAgICAgICBTSVpJTkdfV0laQVJEX0hFSUdIVF8yKTsKLSAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCgiQ3JlYXRlRmlsZUFjdGlvbl90aXRsZSIpOwotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1dJWkFSRCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld1Byb2plY3RQYWdlMigpIHsKLSAgICAgICAgQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQgd2l6YXJkID0gbmV3IEJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkKCk7Ci0gICAgICAgIHdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotICAgICAgICB3aXphcmQuc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0KLSAgICAgICAgV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZVBhZ2UgcGFnZSA9IG5ldyBXaXphcmROZXdQcm9qZWN0UmVmZXJlbmNlUGFnZSgKLSAgICAgICAgICAgICAgICAiYmFzaWNSZWZlcmVuY2VQcm9qZWN0UGFnZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcGFnZS5zZXRUaXRsZShSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfcmVmZXJlbmNlVGl0bGUpOwotICAgICAgICBwYWdlLnNldERlc2NyaXB0aW9uKFJlc291cmNlTWVzc2FnZXMuTmV3UHJvamVjdF9yZWZlcmVuY2VEZXNjcmlwdGlvbik7Ci0gICAgICAgIHBhZ2Uuc2V0V2l6YXJkKHdpemFyZCk7Ci0KLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEhfMiwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUXzIpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KCJDcmVhdGVGaWxlQWN0aW9uX3RpdGxlIik7IAkKLSAgICAgICAgZGlhbG9nLnNob3dQYWdlKHBhZ2UpOwotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgSUlERUhlbHBDb250ZXh0SWRzLk5FV19QUk9KRUNUX1dJWkFSRCk7Ci0gICAgICAgIERpYWxvZ0NoZWNrLmFzc2VydERpYWxvZ1RleHRzKGRpYWxvZywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld1Byb2plY3QoKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB3aXphcmQgc2VsZWN0aW9uIHdpemFyZC4KLSAgICAgICAgTmV3V2l6YXJkIHdpemFyZCA9IG5ldyBOZXdXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkLnNldFByb2plY3RzT25seSh0cnVlKTsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvblRvUGFzcyA9IG51bGw7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgICAgIHNlbGVjdGlvblRvUGFzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZWxlY3Rpb25Ub1Bhc3MgPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotICAgICAgICB3aXphcmQuaW5pdChnZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uVG9QYXNzKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uKCJOZXdXaXphcmRBY3Rpb24iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotICAgICAgICAgICAgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncy5hZGROZXdTZWN0aW9uKCJOZXdXaXphcmRBY3Rpb24iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0gICAgICAgIHdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHdpemFyZCBkaWFsb2cuCi0gICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSgKLSAgICAgICAgICAgICAgICBNYXRoLm1heChTSVpJTkdfV0laQVJEX1dJRFRIXzIsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLSAgICAgICAgICAgICAgICBTSVpJTkdfV0laQVJEX0hFSUdIVF8yKTsKLSAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIElJREVIZWxwQ29udGV4dElkcy5ORVdfUFJPSkVDVF9XSVpBUkQpOwotICAgICAgICBEaWFsb2dDaGVjay5hc3NlcnREaWFsb2dUZXh0cyhkaWFsb2csIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdSZXNvdXJjZSgpIHsKLSAgICAgICAgTmV3V2l6YXJkIHdpemFyZCA9IG5ldyBOZXdXaXphcmQoKTsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvblRvUGFzcyA9IG51bGw7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgICAgIHNlbGVjdGlvblRvUGFzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZWxlY3Rpb25Ub1Bhc3MgPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotICAgICAgICB3aXphcmQuaW5pdChnZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uVG9QYXNzKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uKCJOZXdXaXphcmRBY3Rpb24iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotICAgICAgICAgICAgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncy5hZGROZXdTZWN0aW9uKCJOZXdXaXphcmRBY3Rpb24iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0gICAgICAgIHdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0KLSAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotICAgICAgICAgICAgICAgIE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEhfMiwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotICAgICAgICAgICAgICAgIFNJWklOR19XSVpBUkRfSEVJR0hUXzIpOwotICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksIElXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5ORVdfV0laQVJEKTsKLSAgICAgICAgRGlhbG9nQ2hlY2suYXNzZXJ0RGlhbG9nVGV4dHMoZGlhbG9nLCB0aGlzKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kaWFsb2dzL1VJV29ya2luZ1NldFdpemFyZHNBdXRvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlXb3JraW5nU2V0V2l6YXJkc0F1dG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzY2EwNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RpYWxvZ3MvVUlXb3JraW5nU2V0V2l6YXJkc0F1dG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5Xb3JraW5nU2V0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5Xb3JraW5nU2V0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRGlhbG9nQ2hlY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIEFic3RyYWN0IHRlc3QgY2xhc3MgZm9yIHRoZSB3b3JraW5nIHNldCB3aXphcmQgdGVzdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVSVdvcmtpbmdTZXRXaXphcmRzQXV0byBleHRlbmRzIFVJVGVzdENhc2UgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfV0lEVEggPSA0NzA7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX0hFSUdIVCA9IDU1MDsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfV0lEVEhfMiA9IDUwMDsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfSEVJR0hUXzIgPSA1MDA7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLSU5HX1NFVF9OQU1FXzEgPSAid3MxIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktJTkdfU0VUX05BTUVfMiA9ICJ3czIiOwotCi0gICAgcHJvdGVjdGVkIFdpemFyZERpYWxvZyBmV2l6YXJkRGlhbG9nOwotCi0gICAgcHJvdGVjdGVkIElXaXphcmQgZldpemFyZDsKLQotICAgIHByb3RlY3RlZCBJUHJvamVjdCBwMTsKLQotICAgIHByb3RlY3RlZCBJUHJvamVjdCBwMjsKLQotICAgIHByb3RlY3RlZCBJRmlsZSBmMTsKLQotICAgIHByb3RlY3RlZCBJRmlsZSBmMjsKLQotICAgIHB1YmxpYyBVSVdvcmtpbmdTZXRXaXphcmRzQXV0byhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1RyZWVJdGVtcygpIHsKLSAgICAgICAgTGlzdCB3aWRnZXRzID0gZ2V0V2lkZ2V0cygoQ29tcG9zaXRlKSBmV2l6YXJkRGlhbG9nLmdldEN1cnJlbnRQYWdlKCkKLSAgICAgICAgICAgICAgICAuZ2V0Q29udHJvbCgpLCBUcmVlLmNsYXNzKTsKLSAgICAgICAgVHJlZSB0cmVlID0gKFRyZWUpIHdpZGdldHMuZ2V0KDApOwotICAgICAgICBUcmVlSXRlbVtdIHRyZWVJdGVtcyA9IHRyZWUuZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlSXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyZWVJdGVtc1tpXS5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IFNXVC5DSEVDSzsKLSAgICAgICAgICAgIGV2ZW50Lml0ZW0gPSB0cmVlSXRlbXNbaV07Ci0gICAgICAgICAgICB0cmVlLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVsZXRlUmVzb3VyY2VzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHAxICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBGaWxlVXRpbC5kZWxldGVQcm9qZWN0KHAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWwuZGVsZXRlUHJvamVjdChwMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgICAgICB0aHJvdyAoZSk7Ci0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICAgICAgcmV0dXJuIERpYWxvZ0NoZWNrLmdldFNoZWxsKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0V2lkZ2V0cyhDb21wb3NpdGUgY29tcG9zaXRlLCBDbGFzcyBjbGF6eikgewotICAgICAgICBXaWRnZXRbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgICBMaXN0IHNlbGVjdGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgV2lkZ2V0IGNoaWxkID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0Q2xhc3MoKSA9PSBjbGF6eikgewotICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hpbGRyZW4uYWRkKGNoaWxkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hpbGRyZW4uYWRkQWxsKGdldFdpZGdldHMoKENvbXBvc2l0ZSkgY2hpbGQsIGNsYXp6KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkQ2hpbGRyZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPGNvZGU+ZldpemFyZDwvY29kZT4gbXVzdCBiZSBpbml0aWFsaXplZCBieSBzdWJjbGFzc2VzIHByaW9yIHRvCi0gICAgICogY2FsbGluZyB0aGlzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotCi0gICAgICAgIGZXaXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIGZXaXphcmQpOwotICAgICAgICBmV2l6YXJkRGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICBTaGVsbCBkaWFsb2dTaGVsbCA9IGZXaXphcmREaWFsb2cuZ2V0U2hlbGwoKTsKLSAgICAgICAgZGlhbG9nU2hlbGwuc2V0U2l6ZShNYXRoLm1heChTSVpJTkdfV0laQVJEX1dJRFRIXzIsIGRpYWxvZ1NoZWxsCi0gICAgICAgICAgICAgICAgLmdldFNpemUoKS54KSwgU0laSU5HX1dJWkFSRF9IRUlHSFRfMik7Ci0gICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChmV2l6YXJkRGlhbG9nLmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzLldPUktJTkdfU0VUX05FV19XSVpBUkQpOwotCi0gICAgICAgIElXb3JraW5nU2V0TWFuYWdlciB3b3JraW5nU2V0TWFuYWdlciA9IGZXb3JrYmVuY2gKLSAgICAgICAgICAgICAgICAuZ2V0V29ya2luZ1NldE1hbmFnZXIoKTsKLSAgICAgICAgSVdvcmtpbmdTZXRbXSB3b3JraW5nU2V0cyA9IHdvcmtpbmdTZXRNYW5hZ2VyLmdldFdvcmtpbmdTZXRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29ya2luZ1NldHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHdvcmtpbmdTZXRNYW5hZ2VyLnJlbW92ZVdvcmtpbmdTZXQod29ya2luZ1NldHNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHNldHVwUmVzb3VyY2VzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwUmVzb3VyY2VzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBwMSA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIlRQMSIpOwotICAgICAgICBwMiA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIlRQMiIpOwotICAgICAgICBmMSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoImYxLnR4dCIsIHAxKTsKLSAgICAgICAgZjIgPSBGaWxlVXRpbC5jcmVhdGVGaWxlKCJmMi50eHQiLCBwMik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VGV4dFdpZGdldFRleHQoU3RyaW5nIHRleHQsIElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgTGlzdCB3aWRnZXRzID0gZ2V0V2lkZ2V0cygoQ29tcG9zaXRlKSBwYWdlLmdldENvbnRyb2woKSwgVGV4dC5jbGFzcyk7Ci0gICAgICAgIFRleHQgdGV4dFdpZGdldCA9IChUZXh0KSB3aWRnZXRzLmdldCgwKTsKLSAgICAgICAgdGV4dFdpZGdldC5zZXRUZXh0KHRleHQpOwotICAgICAgICB0ZXh0V2lkZ2V0Lm5vdGlmeUxpc3RlbmVycyhTV1QuTW9kaWZ5LCBuZXcgRXZlbnQoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkZWxldGVSZXNvdXJjZXMoKTsKLSAgICAgICAgc3VwZXIuZG9UZWFyRG93bigpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgV29ya2luZ1NldERlc2NyaXB0b3JbXSBnZXRFZGl0YWJsZVdvcmtpbmdTZXREZXNjcmlwdG9ycygpIHsKLSAgICAgICAgV29ya2luZ1NldFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JraW5nU2V0UmVnaXN0cnkoKTsKLSAgICAgICAgV29ya2luZ1NldERlc2NyaXB0b3JbXSBhbGwgPSByZWdpc3RyeS5nZXRXb3JraW5nU2V0RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgQXJyYXlMaXN0IGVkaXRhYmxlID0gbmV3IEFycmF5TGlzdChhbGwubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFdvcmtpbmdTZXREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBhbGxbaV07Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5pc0VkaXRhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBlZGl0YWJsZS5hZGQoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChXb3JraW5nU2V0RGVzY3JpcHRvcltdKSBlZGl0YWJsZS50b0FycmF5KG5ldyBXb3JraW5nU2V0RGVzY3JpcHRvcltlZGl0YWJsZS5zaXplKCldKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0J1Zzg3MjExVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvQnVnODcyMTFUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDM1YjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvQnVnODcyMTFUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLQotcHVibGljIGNsYXNzIEJ1Zzg3MjExVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQnVnODcyMTFUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFdvcmtiZW5jaFBhZ2UgZlBhZ2U7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgZldpbmRvdzsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlmUGFnZSA9IChXb3JrYmVuY2hQYWdlKSBmV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBkcmFnZ2luZyBhIHN0YW5kYWxvbmUgdmlldyB0byBhIG5ldyBwb3NpdGlvbiwgdGhlbiBkcmFnZ2luZwotCSAqIGFub3RoZXIgdmlldyBvbiB0b3Agb2YgaXQuICBUaGUgdmlld3Mgc2hvdWxkIHN0aWxsIGJlIGluIHRoZWlyCi0JICogc2VwYXJhdGUgc3RhY2tzLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERyYWdTdGFuZGFsb25lVmlldygpIHRocm93cyBUaHJvd2FibGUgewotCQlmUGFnZS5zZXRQZXJzcGVjdGl2ZShXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKS5maW5kUGVyc3BlY3RpdmVXaXRoSWQoCi0JCQkJCQlTdGFuZGFsb25lVmlld1BlcnNwZWN0aXZlLlBFUlNQX0lEKSk7Ci0JCXRyeSB7Ci0JCQlJVmlld1BhcnQgb3V0bGluZSA9IGZQYWdlCi0JCQkJCS5maW5kVmlldyhTdGFuZGFsb25lVmlld1BlcnNwZWN0aXZlLk9VVExJTkVfSUQpOwotCQkJVmlld0RyYWdTb3VyY2Ugc291cmNlID0gbmV3IFZpZXdEcmFnU291cmNlKAotCQkJCQlTdGFuZGFsb25lVmlld1BlcnNwZWN0aXZlLk9VVExJTkVfSUQsIHRydWUpOwotCQkJVmlld0Ryb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IFZpZXdEcm9wVGFyZ2V0KAotCQkJCQluZXcgRXhpc3RpbmdXaW5kb3dQcm92aWRlcihmV2luZG93KSwKLQkJCQkJU3RhbmRhbG9uZVZpZXdQZXJzcGVjdGl2ZS5SRVNPVVJDRV9JRCwgU1dULkNFTlRFUik7Ci0JCQlzb3VyY2UuZHJhZyh0YXJnZXQpOwotCi0JCQlJVmlld1BhcnRbXSByZWZzID0gZlBhZ2UuZ2V0Vmlld1N0YWNrKG91dGxpbmUpOwotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCQkiQ2Fubm90IGRyb3Agc3RhbmRhbG9uZSB2aWV3IG9udG8gYW5vdGhlciBzdGFuZGFsb25lIHZpZXciLAotCQkJCQkxLCByZWZzLmxlbmd0aCk7Ci0KLQkJCS8vIHRoZSBidWcgcmVzdWx0ZWQgaW4gdGhlIGRyb3BwZWQgc3RhbmRhbG9uZSB2aWV3IGxvc2luZwotCQkJLy8gaXQncyBzdGFuZGFsb25lIHN0YXR1cywgc28gb3RoZXIgdmlld3MgY291bGQgYmUgZHJvcHBlZAotCQkJLy8gb24gaXQuCi0JCQlWaWV3RHJhZ1NvdXJjZSBzZWNvbmRWaWV3U291cmNlID0gbmV3IFZpZXdEcmFnU291cmNlKAotCQkJCQlTdGFuZGFsb25lVmlld1BlcnNwZWN0aXZlLlRBU0tfSUQsIHRydWUpOwotCQkJVmlld0Ryb3BUYXJnZXQgZHJhZ2dlZFRhcmdldCA9IG5ldyBWaWV3RHJvcFRhcmdldCgKLQkJCQkJbmV3IEV4aXN0aW5nV2luZG93UHJvdmlkZXIoZldpbmRvdyksCi0JCQkJCVN0YW5kYWxvbmVWaWV3UGVyc3BlY3RpdmUuT1VUTElORV9JRCwgU1dULkNFTlRFUik7Ci0JCQlzZWNvbmRWaWV3U291cmNlLmRyYWcoZHJhZ2dlZFRhcmdldCk7Ci0KLQkJCXJlZnMgPSBmUGFnZS5nZXRWaWV3U3RhY2sob3V0bGluZSk7Ci0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJCSJDYW5ub3QgZHJvcCBhIHNlY29uZCB2aWV3IG9udG8gdGhlIG1vdmVkIHN0YW5kYWxvbmUgdmlldyIsCi0JCQkJCTEsIHJlZnMubGVuZ3RoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZQYWdlLmNsb3NlUGVyc3BlY3RpdmUoZlBhZ2UuZ2V0UGVyc3BlY3RpdmUoKSwgZmFsc2UsIGZhbHNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0RldGFjaGVkRHJvcFRhcmdldC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvRGV0YWNoZWREcm9wVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjc1YzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvRGV0YWNoZWREcm9wVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRuZC5UZXN0RHJvcExvY2F0aW9uOwotCi1wdWJsaWMgY2xhc3MgRGV0YWNoZWREcm9wVGFyZ2V0IGltcGxlbWVudHMgVGVzdERyb3BMb2NhdGlvbiB7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIm91dCBvZiB0aGUgd2luZG93IjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kbmQuVGVzdERyb3BMb2NhdGlvbiNnZXRMb2NhdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IFBvaW50KDAsMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNoZWxsW10gZ2V0U2hlbGxzKCkgewotICAgICAgICByZXR1cm4gbmV3IFNoZWxsWzBdOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0RldGFjaGVkV2luZG93RHJhZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0RldGFjaGVkV2luZG93RHJhZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5MmUwZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9EZXRhY2hlZFdpbmRvd0RyYWdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRuZC5UZXN0RHJvcExvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmF1dG90ZXN0cy5BYnN0cmFjdFRlc3RMb2dnZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgYXMgdGVzdCBlbnRyaWVzIGZvciAnRGV0YWNoZWQgV2luZG93JyB0ZXN0cyAoaS5lLiB3aGVyZSB0aGUgZHJvcCB0YXJnZXQgaXMKLSAqIGluIGEgZGV0YWNoZWQgd2luZG93LiBJdCdzICdkb1NldHVwJyBhdWdtZW50cyB0aGUgYmFzZSBiZWhhdmlvdXIgYnkgJ2RldGFjaGluZycgYSBzdGFjayBjb250YWluaW5nCi0gKiB0d28gJ21vY2snIHZpZXdzIGFuZCBzZXBhcmF0ZWx5IGRldGFjaGluZyBhbiBpbmRpdmlkdWFsIHZpZXcsIG1ha2luZyB0aGVtIGFwcHJvcHJpYXRlIGRyb3AgdGFyZ2V0cwotICogZm9yIHRoZXNlIHRlc3RzLgotICogPHA+Ci0gKiBJbiBzb21lIGNhc2VzIHRoZSBzb3VyY2VzIGFuZCB0YXJnZXRzIG1heSBvdmVybGFwIHdpdGggbm9uLWRldGFjaGVkIHRlc3RzIHNvIGluIG9yZGVyIHRvIGF2b2lkCi0gKiBuYW1lIGNsYXNoZXMgaW4gdGhlIHRlc3RzIHdlIGFkZCBhIHN1ZmZpeCwgIihEZXRhY2hlZCkiLCB0byB0aGUgdGVzdCdzICduYW1lJyB3aGVuIHRoZSB0YXJnZXQgaXMKLSAqICdEZXRhY2hlZCcuICAKLSAqIDxwPgotICogQHNpbmNlIDMuMQotICoKLSAqLwotcHVibGljIGNsYXNzIERldGFjaGVkV2luZG93RHJhZ1Rlc3QJZXh0ZW5kcyBEcmFnVGVzdCB7Ci0JCi0JcHVibGljIERldGFjaGVkV2luZG93RHJhZ1Rlc3QoVGVzdERyYWdTb3VyY2UgZHJhZ1NvdXJjZSwKLQkJCVRlc3REcm9wTG9jYXRpb24gZHJvcFRhcmdldCwgQWJzdHJhY3RUZXN0TG9nZ2VyIGxvZykgewotCQlzdXBlcihkcmFnU291cmNlLCBkcm9wVGFyZ2V0LCBsb2csICIgLSBkZXRhY2hlZCIpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCXN1cGVyLmRvU2V0VXAoKTsKLSAgICAJCi0gICAgCS8vIEZpcnN0LCBzaG93IGFsbCB0aGUgbmVjZXNzYXJ5IHZpZXdzIChub3RlIHRoYXQgd2Ugc2hvdyB2aWV3ICcyJyBmaXJzdCwgdGhpcyBzaG91bGQKLSAgICAJLy8gbWFrZSB2aWV3ICcxJyB0aGUgYWN0aXZlIHZpZXcgaW4gdGhlIGZvbGRlcgotICAgIAlwYWdlLnNob3dWaWV3KERyYWdEcm9wUGVyc3BlY3RpdmVGYWN0b3J5LmRyb3BWaWV3SWQyKTsKLSAgICAJcGFnZS5zaG93VmlldyhEcmFnRHJvcFBlcnNwZWN0aXZlRmFjdG9yeS5kcm9wVmlld0lkMSk7Ci0gICAgCXBhZ2Uuc2hvd1ZpZXcoRHJhZ0Ryb3BQZXJzcGVjdGl2ZUZhY3RvcnkuZHJvcFZpZXdJZDMpOwotICAgIAkKLSAgICAJLy8gU2luY2Ugd2UgY2Fubm90IHlldCAnZGV0YWNoJyBhIHZpZXcgcHJvZ3JhbW1hdGljYWxseSB3ZSdsbCBoYXZlCi0gICAgCS8vIHRvIGRvIGl0IHRoZSBoYXJkIHdheS4uLgotICAgIAkKLSAgICAJLy8gJ2RldGFjaCcgdGhlIHdob2xlIHN0YWNrIGNvbnRhaW5pbmcgdGhlIE1vY2sgdmlldyAxCi0gICAgCUlWaWV3UGFydCB2aWV3UGFydCA9IHBhZ2Uuc2hvd1ZpZXcoRHJhZ0Ryb3BQZXJzcGVjdGl2ZUZhY3RvcnkuZHJvcFZpZXdJZDEpOyAKLSAgICAgICAgRHJhZ09wZXJhdGlvbnMuZHJhZyh2aWV3UGFydCwgbmV3IERldGFjaGVkRHJvcFRhcmdldCgpLCB0cnVlKTsKLSAgICAJCi0gICAgCS8vIE5vdyB3ZSdsbCAnZGV0YWNoJyBNb2NrIHZpZXcgMwotICAgIAl2aWV3UGFydCA9IHBhZ2Uuc2hvd1ZpZXcoRHJhZ0Ryb3BQZXJzcGVjdGl2ZUZhY3RvcnkuZHJvcFZpZXdJZDMpOyAKLSAgICAgICAgRHJhZ09wZXJhdGlvbnMuZHJhZyh2aWV3UGFydCwgbmV3IERldGFjaGVkRHJvcFRhcmdldCgpLCBmYWxzZSk7Ci0gICAgfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBoaWRlIGRldGFjaGVkIHZpZXdzIHNvIHRoZXkgZG9uJ3Qgc2NhcmUgYW55IGZvbGxvd2luZyB0ZXN0cwotCQkKLQkJSVZpZXdSZWZlcmVuY2UgdmlldyA9IHBhZ2UuZmluZFZpZXdSZWZlcmVuY2UoRHJhZ0Ryb3BQZXJzcGVjdGl2ZUZhY3RvcnkuZHJvcFZpZXdJZDEpOwotCQlwYWdlLmF0dGFjaFZpZXcodmlldyk7Ci0vLwkJcGFnZS5oaWRlVmlldyh2aWV3LmdldFZpZXcoZmFsc2UpKTsKLQkJdmlldyA9IHBhZ2UuZmluZFZpZXdSZWZlcmVuY2UoRHJhZ0Ryb3BQZXJzcGVjdGl2ZUZhY3RvcnkuZHJvcFZpZXdJZDIpOwotCQlwYWdlLmF0dGFjaFZpZXcodmlldyk7Ci0vLwkJcGFnZS5oaWRlVmlldyh2aWV3LmdldFZpZXcoZmFsc2UpKTsKLQkJdmlldyA9IHBhZ2UuZmluZFZpZXdSZWZlcmVuY2UoRHJhZ0Ryb3BQZXJzcGVjdGl2ZUZhY3RvcnkuZHJvcFZpZXdJZDMpOwotCQlwYWdlLmF0dGFjaFZpZXcodmlldyk7Ci0vLwkJcGFnZS5oaWRlVmlldyh2aWV3LmdldFZpZXcoZmFsc2UpKTsKLQkJCi0JCXN1cGVyLmRvVGVhckRvd24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9EcmFnRHJvcFBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvRHJhZ0Ryb3BQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdlMDcyNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9EcmFnRHJvcFBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGxhY2Vob2xkZXJGb2xkZXJMYXlvdXQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRHJhZ0Ryb3BQZXJzcGVjdGl2ZUZhY3RvcnkgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotCS8vIElkJ3MgbmVlZGVkIGJ5IHRoZSAnRGV0YWNoZWQgV2luZG93JyBEcmFnIC8gRHJvcCB0ZXN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHZpZXdGb2xkZXJJZCA9ICJvb3JnLmVjbGlwc2UudWkudGVzdC5kbmQuZGV0YWNoZWQuTW9ja0ZvbGRlcjEiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRyb3BWaWV3SWQxID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrVmlld1BhcnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRyb3BWaWV3SWQyID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrVmlld1BhcnQyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkcm9wVmlld0lkMyA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1ZpZXdQYXJ0MyI7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5I2NyZWF0ZUluaXRpYWxMYXlvdXQob3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLSAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gIm9yZy5lY2xpcHNlLnVpLnRlc3QuZG5kLm15c3RhY2siOwotCi0gICAgICAgIElGb2xkZXJMYXlvdXQgZm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcihmb2xkZXJJZCwKLSAgICAgICAgICAgICAgICBJUGFnZUxheW91dC5CT1RUT00sIDAuNWYsIElQYWdlTGF5b3V0LklEX0VESVRPUl9BUkVBKTsKLSAgICAgICAgZm9sZGVyLmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0gICAgICAgIGZvbGRlci5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0gICAgICAgIGZvbGRlci5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOwotCi0gICAgICAgIGxheW91dC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1JFU19OQVYsIElQYWdlTGF5b3V0LkxFRlQsIDAuNWYsCi0gICAgICAgICAgICAgICAgSVBhZ2VMYXlvdXQuSURfRURJVE9SX0FSRUEpOwotCi0gICAgICAgIC8vIEV4dHJhIHN0YWNrcyBhbmQgdmlld3MgdGhhdCB3aWxsIGJlIHNob3duIGFuZCBkZXRhY2hlZCBkdXJpbmcgdGhlICdEZXRhY2hlZCBXaW5kb3cnIHRlc3RzCi0gICAgICAgIElQbGFjZWhvbGRlckZvbGRlckxheW91dCBmb2xkZXIyID0gbGF5b3V0LmNyZWF0ZVBsYWNlaG9sZGVyRm9sZGVyKHZpZXdGb2xkZXJJZCwKLSAgICAgICAgICAgICAgICBJUGFnZUxheW91dC5SSUdIVCwgMC41ZiwgSVBhZ2VMYXlvdXQuSURfRURJVE9SX0FSRUEpOwotICAgICAgICBmb2xkZXIyLmFkZFBsYWNlaG9sZGVyKGRyb3BWaWV3SWQxKTsKLSAgICAgICAgZm9sZGVyMi5hZGRQbGFjZWhvbGRlcihkcm9wVmlld0lkMik7Ci0gICAgICAgIAotICAgICAgICBsYXlvdXQuYWRkUGxhY2Vob2xkZXIoZHJvcFZpZXdJZDMsIElQYWdlTGF5b3V0LkJPVFRPTSwgMC41Ziwgdmlld0ZvbGRlcklkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9EcmFnT3BlcmF0aW9ucy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvRHJhZ09wZXJhdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyNGZiZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9EcmFnT3BlcmF0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkdlb21ldHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5MYXlvdXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlBhcnRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlBhcnRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5WaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRuZC5EcmFnVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kbmQuVGVzdERyb3BMb2NhdGlvbjsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEcmFnT3BlcmF0aW9ucyB7Ci0KLSAgICAvKioKLSAgICAgKiBEcmFncyB0aGUgZ2l2ZW4gdmlldyBPUiBlZGl0b3IgdG8gdGhlIGdpdmVuIGxvY2F0aW9uIChpLmUuIGl0IG9ubHkgY2FyZXMgdGhhdCB3ZSdyZSBnaXZlbgotICAgICAqIGEgJ1BhcnQnIGFuZCBkb2Vzbid0IGNhcmUgd2hldGhlciBpdCdzIGEgJ1ZpZXcnIG9yIGFuICdFZGl0b3InLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBldmVudHVhbGx5IHJlcGxhY2UgdGhlIG9yaWdpbmFsIG9uZSBvbmNlIHRoZSBXb3JrYmVuY2ggaGFzIGJlZW4gdXBkYXRlZAotICAgICAqIHRvIGhhbmRsZSBWaWV3cyBhbmQgRWRpdG9ycyB3aXRob3V0IGRpc3RpbmN0b24uIAotICAgICAqIAotICAgICAqIEBwYXJhbSBlZGl0b3IKLSAgICAgKiBAcGFyYW0gdGFyZ2V0Ci0gICAgICogQHBhcmFtIHdob2xlRm9sZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRyYWcoSVdvcmtiZW5jaFBhcnQgcGFydCwgVGVzdERyb3BMb2NhdGlvbiB0YXJnZXQsCi0gICAgICAgICAgICBib29sZWFuIHdob2xlRm9sZGVyKSB7Ci0gICAgICAgIERyYWdVdGlsLmZvcmNlRHJvcExvY2F0aW9uKHRhcmdldCk7Ci0KLSAgICAgICAgUGFydFNpdGUgc2l0ZSA9IChQYXJ0U2l0ZSkgcGFydC5nZXRTaXRlKCk7Ci0gICAgICAgIFBhcnRQYW5lIHBhbmUgPSBzaXRlLmdldFBhbmUoKTsKLSAgICAgICAgUGFydFN0YWNrIHBhcmVudCA9ICgoUGFydFN0YWNrKSAocGFuZS5nZXRDb250YWluZXIoKSkpOwotCi0gICAgICAgIHBhcmVudC5wYW5lRHJhZ1N0YXJ0KHdob2xlRm9sZGVyID8gbnVsbCA6IHBhbmUsIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEN1cnNvckxvY2F0aW9uKCksIGZhbHNlKTsKLQotICAgICAgICBEcmFnVXRpbC5mb3JjZURyb3BMb2NhdGlvbihudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBlZGl0b3IKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWRpdG9yCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0gICAgICAgIFBhcnRQYW5lIHBhbmUgPSAoKEVkaXRvclNpdGUpIGVkaXRvci5nZXRTaXRlKCkpLmdldFBhbmUoKTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcmVmID0gcGFuZS5nZXRQYXJ0UmVmZXJlbmNlKCk7Ci0gICAgICAgIHJldHVybiByZWYuZ2V0UGFydE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFBhcnRQYW5lIGdldFBhbmUoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0gICAgICAgIHJldHVybiAoKEVkaXRvclNpdGUpIGVkaXRvci5nZXRTaXRlKCkpLmdldFBhbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFBhcnRQYW5lIGdldFBhbmUoSVZpZXdQYXJ0IHZpZXcpIHsKLSAgICAgICAgcmV0dXJuICgoVmlld1NpdGUpIHZpZXcuZ2V0U2l0ZSgpKS5nZXRQYW5lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZWN0YW5nbGUgZ2V0RGlzcGxheUJvdW5kcyhQYXJ0UGFuZSBwYW5lKSB7Ci0gICAgICAgIExheW91dFBhcnQgcGFyZW50ID0gKChMYXlvdXRQYXJ0KSAocGFuZS5nZXRDb250YWluZXIoKSkpOwotICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gRHJhZ1V0aWwuZ2V0RGlzcGxheUJvdW5kcyhwYXJlbnQuZ2V0Q29udHJvbCgpKTsKLQotICAgICAgICByZXR1cm4gYm91bmRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUG9pbnQgZ2V0TG9jYXRpb24oUGFydFBhbmUgcGFuZSwgaW50IHNpZGUpIHsKLQotICAgICAgICByZXR1cm4gRHJhZ09wZXJhdGlvbnMuZ2V0UG9pbnQoZ2V0RGlzcGxheUJvdW5kcyhwYW5lKSwgc2lkZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhZ2UKLSAgICAgKiBAcGFyYW0gaQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFBvaW50IGdldFBvaW50SW5FZGl0b3JBcmVhKFdvcmtiZW5jaFBhZ2UgcGFnZSwgaW50IHNpZGUpIHsKLSAgICAgICAgcmV0dXJuIERyYWdPcGVyYXRpb25zLmdldFBvaW50KERyYWdVdGlsLmdldERpc3BsYXlCb3VuZHMocGFnZQotICAgICAgICAgICAgICAgIC5nZXRFZGl0b3JQcmVzZW50YXRpb24oKS5nZXRMYXlvdXRQYXJ0KCkuZ2V0Q29udHJvbCgpKSwgc2lkZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQb2ludCBnZXRQb2ludChSZWN0YW5nbGUgYm91bmRzLCBpbnQgc2lkZSkgewotICAgICAgICBQb2ludCBjZW50ZXJQb2ludCA9IEdlb21ldHJ5LmNlbnRlclBvaW50KGJvdW5kcyk7Ci0KLSAgICAgICAgc3dpdGNoIChzaWRlKSB7Ci0gICAgICAgIGNhc2UgU1dULlRPUDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQoY2VudGVyUG9pbnQueCwgYm91bmRzLnkgKyAxKTsKLSAgICAgICAgY2FzZSBTV1QuQk9UVE9NOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChjZW50ZXJQb2ludC54LCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgLSAxKTsKLSAgICAgICAgY2FzZSBTV1QuTEVGVDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQoYm91bmRzLnggKyAxLCBjZW50ZXJQb2ludC55KTsKLSAgICAgICAgY2FzZSBTV1QuUklHSFQ6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KGJvdW5kcy54ICsgYm91bmRzLndpZHRoIC0gMSwgY2VudGVyUG9pbnQueSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2VudGVyUG9pbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUZvckNvbnN0YW50KGludCBzd3RTaWRlQ29uc3RhbnQpIHsKLSAgICAgICAgc3dpdGNoIChzd3RTaWRlQ29uc3RhbnQpIHsKLSAgICAgICAgY2FzZSBTV1QuVE9QOgotICAgICAgICAgICAgcmV0dXJuICJ0b3AiOwotICAgICAgICBjYXNlIFNXVC5CT1RUT006Ci0gICAgICAgICAgICByZXR1cm4gImJvdHRvbSI7Ci0gICAgICAgIGNhc2UgU1dULkxFRlQ6Ci0gICAgICAgICAgICByZXR1cm4gImxlZnQiOwotICAgICAgICBjYXNlIFNXVC5SSUdIVDoKLSAgICAgICAgICAgIHJldHVybiAicmlnaHQiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICJjZW50ZXIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0YXJnZXRQYXJ0Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoSVZpZXdQYXJ0IHRhcmdldFBhcnQpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldFBhcnQuZ2V0VGl0bGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFnZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYXlvdXREZXNjcmlwdGlvbihXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBwYWdlLmdldEFjdGl2ZVBlcnNwZWN0aXZlKCkuZGVzY3JpYmVMYXlvdXQoYnVmKTsKLQotICAgICAgICAvLyBUZXN0IHJlc3VsdCAtLSB0aGlzIHdpbGwgYmUgYSB2YWx1ZSBpbiB0aGUgcmVzdWx0aW5nIG1hcAotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvRHJhZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0RyYWdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMmNlYzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvRHJhZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kbmQuVGVzdERyb3BMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC51dGlsLlByZWZVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5hdXRvdGVzdHMuQWJzdHJhY3RUZXN0TG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmF1dG90ZXN0cy5VSVRlc3RDYXNlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci0KLS8qKgotICogVGVzdHMgYSBzaW5nbGUgZHJhZy1kcm9wIHNjZW5hcmlvLCBnaXZlbiBhIGRyYWdTb3VyY2UgY2FwYWJsZSBvZiBpbml0aWF0aW5nIHRoZSBkcmFnIGFuZAotICogYSBkcm9wVGFyZ2V0IHRoYXQgY2FuIGxvY2F0ZSB0aGUgZHJvcCBsb2NhdGlvbi4gRHJhZ1Rlc3RTdWl0ZSB3aWxsIGNyZWF0ZSBhIGxhcmdlIG51bWJlcgotICogb2YgRHJhZ1Rlc3RzIGJ5IG1hdGNoaW5nIGNvbWJpbnRhdGlvbnMgb2YgZHJhZyBzb3VyY2VzIHdpdGggZHJvcCB0YXJnZXRzLiAgCi0gKjxwPjwvcD4KLSAqIDxwPgotICogPGI+VEVTVCBOQU1FUzo8L2I+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IGluZGljYXRlcyB3aGF0IGRyYWcgc2NlbmFyaW8gd2FzIGJlaW5nIGF0dGVtcHRlZC4gRm9yIGV4YW1wbGUsIHRoZQotICogdGVzdCAiZHJhZyBOYXZpZ2F0b3IgdG8gcmlnaHQgb2YgZWRpdG9yIGFyZWEiIGRyYWdzIHRoZSBOYXZpZ2F0b3IgdmlldyBvdmVyCi0gKiB0aGUgZWRpdG9yIGFyZWEsIGRyb3BwaW5nIGl0IG5lYXIgdGhlIHJpZ2h0IGVkZ2UuIERyYWcgc291cmNlcyBhcmUgZGVzY3JpYmVkIGFzIGZvbGxvd3M6ICAKLSAqIDwvcD4KLSAqIDxwPjwvcD4gIAotICogPHA+Ci0gKiBbbWF4aW1pemVkXSB2aWV3bmFtZSBbZm9sZGVyXSAKLSAqIDwvcD4KLSAqIDxwPjwvcD4KLSAqIDxwPkRyYWcgc291cmNlcyBwcmVmaXhlZCBieSAibWF4aW1pemVkIiB3ZXJlIG1heGltaXplZCBhdCB0aGUgdGltZSB0aGUgZHJhZyBzdGFydGVkLgotICogVGhlIHdvcmQgW2ZvbGRlcl0gaW5kaWNhdGVzIHRoYXQgZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGVkaXRvciBvciB2aWV3IHdhcyBiZWluZyBkcmFnZ2VkLgotICogT3RoZXJ3aXNlLCB0aGUgdmlldyBpdHNlbGYgd2FzIGJlaW5nIGRyYWdnZWQuPC9wPgotICogPHA+PC9wPgotICogPHA+RHJvcCB0YXJnZXRzIGFyZSBkZXNjcmliZWQgYXMgZm9sbG93czo8L3A+IAotICogPHA+PC9wPiAgCi0gKiA8cD4KLSAqIFtsZWZ0fHJpZ2h0fHRvcHxib3R0b218Y2VudGVyXSBvZiB0YXJnZXRuYW1lIAotICogPC9wPgotICogPHA+PC9wPgotICogPHA+RHJvcCB0YXJnZXRzIGFyZSBhbHdheXMgb24gdG9wIG9mIHRoZSB0YXJnZXQuIFRoYXQgaXMsICJyaWdodCBvZiBOYXZpZ2F0b3IiIG1lYW5zICJvbiB0b3Agb2YKLSAqIHRoZSBuYXZpZ2F0b3IgdmlldyBuZWFyIGl0cyByaWdodCBlZGdlIiAtLSBOT1QgInRvIHRoZSByaWdodCBvZiB0aGUgTmF2aWdhdG9yIHZpZXciLiBXaGVuIHRoZQotICogZHJvcCB0YXJnZXQgaXMgb24gYW4gZWRnZSwgaXQgaXMgYWx3YXlzIGxvY2F0ZWQgMSBwaXhlbCBhd2F5IGZyb20gdGhlIG1pZGRsZSBvZiB0aGF0IGVkZ2UuPC9wPiAgCi0gKgotICo8cD48L3A+Ci0gKiA8cD4KLSAqIDxiPldIQVQgVE8gRE8gSUYgVEhJUyBURVNUIEZBSUxTOjwvYj4KLSAqIDwvcD4KLSAqIDxwPgotICogSWYgYSBkcmFnIG9wZXJhdGlvbiBkaWQgbm90IGhhdmUgdGhlIGludGVuZGVkIGVmZmVjdCwgdGhlIHRlc3Qgd2lsbCBmYWlsIHdpdGgKLSAqIGEgcmVzdWx0IGxpa2U6IAotICogPC9wPgotICogPHA+PC9wPgotICogPHA+Ci0gKiBFeHBlY3RpbmcgJ2xheW91dCAoKCgoKk5hdmlnYXRvciktYWN0aXZlICgqUHJvYmxlbXMpKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvcGVydGllcykpJyBhbmQgZm91bmQgJ2xheW91dCAoKGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSktYWN0aXZlICgqTmF2aWdhdG9yKSknCi0gKiA8L3A+Ci0gKiA8cD48L3A+Ci0gKiA8cD4KLSAqIFRoZSBleHBlY3RlZCBhbmQgYWN0dWFsIHJlc3VsdHMgYXJlIEFTQ0lJIHBpY3R1cmVzIG9mIHRoZSBsYXlvdXQuIEEgc3RhY2sgb2Ygdmlld3Mgb3IgZWRpdG9ycwotICogaXMgc2hvd24gYXMgYSBsaXN0IGVuY2xvc2VkIGluIGJyYWNrZXRzLCB3aXRoIGFuIGFzdGVyaXNrIGluZGljYXRpbmcgdGhlIHNlbGVjdGVkIHBhbmUuIFRoZSBzdGFjawotICogbWF5IGJlIHByZWZpeGVkIGJ5IHRoZSB3b3JkcyAiYWN0aXZlIiBvciAiYWN0aXZlX25vZm9jdXMiIGlmIHRoZXkgY3VycmVudGx5IGhhdmUgdGhlIGFjdGl2ZSBvciAKLSAqIGFjdGl2ZV9ub2ZvY3VzIGFwcGVhcmFuY2UuIEluYWN0aXZlIHN0YWNrcyBoYXZlIG5vIHByZWZpeC4gCi0gKiA8L3A+Ci0gKiA8cD48L3A+Ci0gKiA8cD4KLSAqIEZvciBleGFtcGxlLCAoUHJvYmxlbXMsICpDb25zb2xlLCBQcm9wZXJ0aWVzKSBpbmRpY2F0ZXMgYSBzdGFjayBjb250YWluaW5nIHRoZSBQcm9ibGVtcywgQ29uc29sZSwgYW5kIFByb3BlcnRpZXMgdmlld3MsIAotICogd2hlcmUgdGhlIENvbnNvbGUgdmlldyB3YXMgY3VycmVudGx5IHNlbGVjdGVkLiBUaGUgcm9vdCBsYXlvdXQgYW5kIGVkaXRvciBhcmVhcyBhcmUgc2hvd24gYXMgImxheW91dCAoLi4uKSIuIEEgdmVydGljYWwgc2FzaCBpcyBzaG93biBhcyBhIAotICogYmFyICJ8IiBhbmQgYSBob3Jpem9udGFsIHNhc2ggaXMgc2hvd24gdXNpbmcgYSBkYXNoICItIi4gIEFsbCBkcmFnIHRlc3RzIGFyZSBkb25lIGluIHRoZSBEcmFnIFRlc3QgCi0gKiBQZXJzcGVjdGl2ZS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGluaXRpYWwgbGF5b3V0IGlzOgotICogPC9wPgotICogPHA+PC9wPgotICogPHA+Ci0gKiBsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpCi0gKiA8L3A+Ci0gKiA8cD48L3A+Ci0gKiA8cD4KLSAqIFdoZXJlIGVkaXRvciAwIGlzICJNb2NrIEVkaXRvciAxIiwgYW5kIGVkaXRvcnMgMSBhbmQgMiBhcmUgc2hvd24gYXMgIk1vY2sgRWRpdG9yIDIiLgotICogPC9wPgotICogPHA+PC9wPgotICogPHA+Ci0gKiBJZiB5b3Ugc2VlIGEgbWVzc2FnZSBsaWtlICJkcmFndGVzdHMueG1sIGlzIG91dCBvZiBkYXRlIiwgdGhpcyBpbmRpY2F0ZXMgdGhhdCBuZXcgdGVzdHMKLSAqIHdlcmUgYWRkZWQgd2l0aG91dCBkZXNjcmliaW5nIHRoZWlyIGludGVuZGVkIGJlaGF2aW9yIGluIGRyYWd0ZXN0cy54bWwuIEluIHRoYXQgY2FzZSwgZW5zdXJlIHRoYXQKLSAqIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZmFpbHVyZXMgYW5kIHJlZ2VuZXJhdGUgZHJhZ3Rlc3RzLnhtbCBhcyBkZXNjcmliZWQgYmVsb3cuCi0gKiA8L3A+Ci0gKiA8cD48L3A+Ci0gKiA8cD4KLSAqIDxiPldIQVQgVE8gRE8gSUYgVEhFIElOVEVOVEVEIEJFSEFWSU9SIENIQU5HRVM6PC9iPgotICogPC9wPgotICogPHA+Ci0gKiBJZiBuZXcgdGVzdHMgYXJlIGFkZGVkIG9yIHRoZSBleGlzdGluZyBkcmFnL2Ryb3AgYmVoYXZpb3IgaXMgY2hhbmdlZCwgaXQgd2lsbAotICogYmUgbmVjZXNzYXJ5IHRvIHVwZGF0ZSBkcmFndGVzdHMueG1sLiBEbyB0aGlzIGFzIGZvbGxvd3M6PC9wPgotICogPHVsPgotICogPGxpPmluY2x1ZGUgb3JnLmVjbGlwc2UudWkudGVzdHMgd2l0aCB5b3VyIG90aGVyIHBsdWdpbnMgYW5kIGxhdW5jaCBhbiBpbm5lciB3b3Jrc3BhY2U8L2xpPgotICogPGxpPkdvIHRvIGN1c3RvbWl6ZSBwZXJzcGVjdGl2ZS4uLiAtPiBjb21tYW5kcyAtPiBEcmFnIFRlc3QuIFRoaXMgd2lsbCBhZGQgdGhlICJEcmFnLURyb3AgU25hcHNob3QiIGl0ZW0gdG8geW91ciBtZW51YmFyLjwvbGk+Ci0gKiA8bGk+U2VsZWN0ICJEcmFnLURyb3AgU25hcHNob3QiPC9saT4KLSAqIDxsaT5TZWxlY3QgYSBmaWxlIHdoZXJlIHRoZSBuZXcgc2hhcHNob3Qgd2lsbCBiZSBzYXZlZCwgYW5kIGNsaWNrIE9rYXk8L2xpPgotICogPGxpPkRPIE5PVCB1c2UgdGhlIG1vdXNlIHdoaWxlIGdlbmVyYXRpbmcgZHJhZ3Rlc3RzLnhtbC4gVGhpcwotICogICAgIGNhbiBpbnRlcmZlcmUgd2l0aCB0aGUgdGVzdHMgYW5kIGNhdXNlIGFuIGluY29ycmVjdCBiZWhhdmlvciB0byBiZSByZWNvcmRlZCBhcyB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IuCi0gKiAgICAgSW4gcGFydGljdWxhciwgZm9jdXMgY2hhbmdlcyBzaG91bGQgYmUgYXZvaWRlZC48L2xpPgotICogPGxpPldhaXQgZm9yIHNldmVyYWwgbWludXRlcyB3aGlsZSB0aGUgdGVzdCBydW5zPC9saT4KLSAqIDxsaT5XaGVuIHRoZSB0ZXN0IGlzIGNvbXBsZXRlLCBjb3B5IHRoZSBmaWxlIG92ZXIgdGhlIG9sZCBkYXRhL2RyYWd0ZXN0cy54bWwgZmlsZTwvbGk+IAotICogPC91bD4KLSAqIDxwPgotICogQXQgdGhpcyBwb2ludCwgdGhlIGN1cnJlbnQgZHJhZy9kcm9wIGJlaGF2aW9yIHdpbGwgYmUgY29uc2lkZXJlZCB0aGUgY29ycmVjdCBiZWhhdmlvciwKLSAqIGFuZCBkZXZpYXRpb25zIHdpbGwgY2F1c2UgdGhlIHRlc3Qgc3VpdGVzIHRvIGZhaWwuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIERyYWdUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZVdpdGhSZXN1bHQgewotICAgIFRlc3REcmFnU291cmNlIGRyYWdTb3VyY2U7Ci0KLSAgICBUZXN0RHJvcExvY2F0aW9uIGRyb3BUYXJnZXQ7Ci0KLSAgICBTdHJpbmcgaW50ZW5kZWRSZXN1bHQ7Ci0KLSAgICAvLyAKLSAgICBzdGF0aWMgSVByb2plY3QgcHJvamVjdDsKLQotICAgIHN0YXRpYyBJRmlsZSBmaWxlMSwgZmlsZTI7Ci0KLSAgICBJRWRpdG9yUGFydCBlZGl0b3IxLCBlZGl0b3IyOwotCi0gICAgc3RhdGljIElGaWxlIGZpbGUzOwotCi0gICAgSUVkaXRvclBhcnQgZWRpdG9yMzsKLQotICAgIHN0YXRpYyBXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0gICAgc3RhdGljIFdvcmtiZW5jaFBhZ2UgcGFnZTsKLQotICAgIHB1YmxpYyBEcmFnVGVzdChUZXN0RHJhZ1NvdXJjZSBkcmFnU291cmNlLCBUZXN0RHJvcExvY2F0aW9uIGRyb3BUYXJnZXQsIEFic3RyYWN0VGVzdExvZ2dlciBsb2csIFN0cmluZyBzdWZmaXgpIHsKLSAgICAgICAgc3VwZXIoImRyYWcgIiArIGRyYWdTb3VyY2UudG9TdHJpbmcoKSArICIgdG8gIiArIGRyb3BUYXJnZXQudG9TdHJpbmcoKSArIHN1ZmZpeCwgbG9nKTsKLSAgICAgICAgdGhpcy5kcmFnU291cmNlID0gZHJhZ1NvdXJjZTsKLSAgICAgICAgdGhpcy5kcm9wVGFyZ2V0ID0gZHJvcFRhcmdldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRHJhZ1Rlc3QoVGVzdERyYWdTb3VyY2UgZHJhZ1NvdXJjZSwgVGVzdERyb3BMb2NhdGlvbiBkcm9wVGFyZ2V0LCBBYnN0cmFjdFRlc3RMb2dnZXIgbG9nKSB7Ci0gICAgCXRoaXMoZHJhZ1NvdXJjZSwgZHJvcFRhcmdldCwgbG9nLCAiIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZG9uJ3QgYWxsb3cgVUlUZXN0Q2FzZSB0byBtYW5hZ2UgdGhlIGRlYWN0aXZhdGlvbiBvZiBvdXIgd2luZG93Ci0gICAgICAgIG1hbmFnZVdpbmRvd3MoZmFsc2UpOwotICAgICAgICAvL3dpbmRvdyA9IChXb3JrYmVuY2hXaW5kb3cpb3BlblRlc3RXaW5kb3coKTsKLQotICAgICAgICAvL2luaXRpYWxpemUgdGhlIHdpbmRvdwotICAgICAgICBpZiAod2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgIHdpbmRvdyA9IChXb3JrYmVuY2hXaW5kb3cpIGZXb3JrYmVuY2gub3BlbldvcmtiZW5jaFdpbmRvdygKLSAgICAgICAgICAgIAkib3JnLmVjbGlwc2UudWkudGVzdHMuZG5kLmRyYWdkcm9wIiwgZ2V0UGFnZUlucHV0KCkpOwotCi0gICAgICAgICAgICBwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0KLSAgICAgICAgICAgIHByb2plY3QgPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJEcmFnVGVzdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBmaWxlMSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoIkRyYWdUZXN0MS50eHQiLCBwcm9qZWN0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgZmlsZTIgPSBGaWxlVXRpbC5jcmVhdGVGaWxlKCJEcmFnVGVzdDIudHh0IiwgcHJvamVjdCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGZpbGUzID0gRmlsZVV0aWwuY3JlYXRlRmlsZSgiRHJhZ1Rlc3QzLnR4dCIsIHByb2plY3QpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgIC8vIERpc2FibGUgYW5pbWF0aW9ucyBzaW5jZSB0aGV5IG9jY3VyIGNvbmN1cnJlbnRseSBhbmQgY2FuIGludGVyZmVycmUKLSAgICAgICAgICAgIC8vIHdpdGggbG9jYXRpbmcgZHJvcCB0YXJnZXRzCi0gICAgICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIGFwaVN0b3JlID0gUHJlZlV0aWwuZ2V0QVBJUHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgICAgICBhcGlTdG9yZS5zZXRWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHMuRU5BQkxFX0FOSU1BVElPTlMsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcGFnZS5yZXNldFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgIHBhZ2UuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIC8vZW5zdXJlIHRoYXQgY29udGVudG91dGxpbmUgaXMgdGhlIGZvY3VzIHBhcnQgKGFuZCBhdCB0aGUgdG9wIG9mIGl0cyBzdGFjaykKLSAgICAgICAgcGFnZS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuQ29udGVudE91dGxpbmUiKTsKLSAgICAgICAgcGFnZS5oaWRlVmlldyhwYWdlLmZpbmRWaWV3KCJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pbnRyb3ZpZXciKSk7Ci0gICAgICAgIGVkaXRvcjEgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlMSksCi0gICAgICAgICAgICAgICAgTW9ja0VkaXRvclBhcnQuSUQxKTsKLSAgICAgICAgZWRpdG9yMiA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUyKSwKLSAgICAgICAgICAgICAgICBNb2NrRWRpdG9yUGFydC5JRDIpOwotICAgICAgICBlZGl0b3IzID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZTMpLAotICAgICAgICAgICAgICAgIE1vY2tFZGl0b3JQYXJ0LklEMik7Ci0KLSAgICAgICAgd2luZG93LmdldFNoZWxsKCkuc2V0QWN0aXZlKCk7Ci0gICAgICAgIERyYWdPcGVyYXRpb25zCi0gICAgICAgICAgICAgICAgLmRyYWcoZWRpdG9yMiwgbmV3IEVkaXRvckRyb3BUYXJnZXQobmV3IEV4aXN0aW5nV2luZG93UHJvdmlkZXIod2luZG93KSwgMCwgU1dULkNFTlRFUiksIGZhbHNlKTsKLSAgICAgICAgRHJhZ09wZXJhdGlvbnMKLSAgICAgICAgICAgICAgICAuZHJhZyhlZGl0b3IzLCBuZXcgRWRpdG9yQXJlYURyb3BUYXJnZXQobmV3IEV4aXN0aW5nV2luZG93UHJvdmlkZXIod2luZG93KSwgU1dULlJJR0hUKSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpbiBvcmRlciB0byAnZnJlZXplJyB0aGUgdGVzdCBlbnZpcm9ubWVudCBhZnRlciBhIHBhcnRpY3VsYXIgdGVzdCBpbiBvcmRlciB0byAKLSAgICAgKiBtYW5pcHVsYXRlIHRoZSBlbnZpcm9ubWVudCB0byBmaWd1cmUgb3V0IHdoYXQncyBnb2luZyBvbi4gSXQgZXNzZW50aWFsbHkgb3BlbnMgYSBuZXcgc2hlbGwgYW5kIGVudGVycwotICAgICAqIGEgbW9kYWwgbG9vcCBvbiBpdCwgcHJldmVudGluZyB0aGUgdGVzdHMgZnJvbSBjb250aW51aW5nIHVudGlsIHRoZSAnc3RhbGwnIHNoZWxsIGlzIGNsb3NlZC4gTm90ZSB0aGF0Ci0gICAgICogdXNpbmcgYSBkaWFsb2cgd291bGQgcHJldmVudCB1cyBmcm9tIG1hbmlwdWxhdGluZyB0aGUgc2hlbGwgdGhhdCB0aGUgZHJhZyBhbmQgZHJvcCB0ZXN0cyBhcmUgYmVpbmcgcGVyZm9ybWVkIGluCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhbGxUZXN0KCkgewotICAgIAkvLyBBZGQgdGhlIGV4cGxpY2l0IHRlc3QgbmFtZXMgdGhhdCB5b3Ugd2FudCB0byBzdGFsbCBvbiBoZXJlLi4uCi0gICAgCS8vIChJdCdzIHByb2JhYmx5IGVhc2llc3QgdG8gY3V0IHRoZW0gZGlyZWN0bHkgZnJvbSB0aGUgZXhlY3RlZCByZXN1bHRzIGZpbGUpCi0gICAgCVN0cmluZ1tdIHRlc3ROYW1lcyA9IHsKLSAgICAJfTsKLSAgICAJCi0gICAgCS8vIERvZXMgdGhlIG5hbWUgbWF0Y2ggYW55IG9mIHRoZSBleHBsaWNpdCB0ZXN0IG5hbWVzPz8KLSAgICAJYm9vbGVhbiB0ZXN0TmFtZU1hdGNoZXMgPSBmYWxzZTsKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0TmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAJCWlmICh0ZXN0TmFtZXNbaV0uZXF1YWxzKHRoaXMuZ2V0TmFtZSgpKSkgewotICAgIAkJCXRlc3ROYW1lTWF0Y2hlcyA9IHRydWU7Ci0gICAgCQkJYnJlYWs7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJCi0gICAgCS8vIFN0YWxsIGFsd2F5cyBpZiBubyBleHBsaWNpdCBuYW1lcyBhcmUgc3VwcGxpZWQuIE90aGVyd2lzZSBvbmx5IHN0YWxsIHdoZW4gdGhlcmUncyBhCi0gICAgCS8vIG1hdGNoLgotICAgIAlpZiAodGVzdE5hbWVzLmxlbmd0aCA9PSAwIHx8IHRlc3ROYW1lTWF0Y2hlcykgewotCSAgICAJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JICAgIAlTaGVsbCBsb29wU2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0pOwotCSAgICAJbG9vcFNoZWxsLnNldEJvdW5kcygwLDAsMjAwLDEwMCk7Ci0JICAgIAlsb29wU2hlbGwuc2V0VGV4dCgiVGVzdCBTdGFsbCBTaGVsbCIpOwotCSAgICAJbG9vcFNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JICAgIAkKLQkgICAgCXdoaWxlIChsb29wU2hlbGwgIT0gbnVsbCAmJiAhbG9vcFNoZWxsLmlzRGlzcG9zZWQoKSkgewotCSAgICAJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkgICAgCQkJZGlzcGxheS5zbGVlcCgpOwotCSAgICAJfQotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgcGVyZm9ybVRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byAnc3RhbGwnIHRoZSB0ZXN0cyBoZXJlLi4uCi0gICAgICAgIC8vc3RhbGxUZXN0KCk7Ci0KLSAgICAJZHJhZ1NvdXJjZS5zZXRQYWdlKHBhZ2UpOwotCi0gICAgICAgIGRyYWdTb3VyY2UuZHJhZyhkcm9wVGFyZ2V0KTsKLQotICAgICAgICBwYWdlLnRlc3RJbnZhcmlhbnRzKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvICdzdGFsbCcgdGhlIHRlc3RzIGhlcmUuLi4KLSAgICAgICAgLy9zdGFsbFRlc3QoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBEcmFnT3BlcmF0aW9ucy5nZXRMYXlvdXREZXNjcmlwdGlvbihwYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9EcmFnVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9EcmFnVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTFkMTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvRHJhZ1Rlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRuZC5UZXN0RHJvcExvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXV0b3Rlc3RzLkF1dG9UZXN0U3VpdGU7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRHJhZ1Rlc3RTdWl0ZSBleHRlbmRzIEF1dG9UZXN0U3VpdGUgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VpdGUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRHJhZ1Rlc3RTdWl0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIHBsYXRmb3JtIHdlJ3JlIHJ1bm5pbmcgb24gc3VwcG9ydHMgdGhlIGRldGFjaGluZyBvZiB2aWV3cy4gIAotICAgICAqIFRoaXMgaXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGZvbGxvd2luZyBzdGF0aWMgYmxvY2suCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMgotICAgICAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEZXRhY2hpbmdTdXBwb3J0ZWQ7Ci0JCi0Jc3RhdGljIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWlzRGV0YWNoaW5nU3VwcG9ydGVkICA9IGMuaXNSZXBhcmVudGFibGUoKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0KLQotICAgIHB1YmxpYyBEcmFnVGVzdFN1aXRlKCkgewotICAgICAgICBzdXBlcihQbGF0Zm9ybS5maW5kKFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLCBuZXcgUGF0aCgiZGF0YS9kcmFndGVzdHMueG1sIikpKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyByZXNOYXYgPSBJUGFnZUxheW91dC5JRF9SRVNfTkFWOwotICAgICAgICBTdHJpbmcgcHJvYlZpZXcgPSBJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVc7Ci0KLSAgICAgICAgLy8gRHJhZyBzb3VyY2VzIGZvciB2aWV3cwotICAgICAgICBUZXN0RHJhZ1NvdXJjZVtdIHZpZXdEcmFnU291cmNlcyA9IG5ldyBUZXN0RHJhZ1NvdXJjZVtdIHsKLSAgICAgICAgICAgICAgICBuZXcgVmlld0RyYWdTb3VyY2UocmVzTmF2LCBmYWxzZSksCi0gICAgICAgICAgICAgICAgbmV3IFZpZXdEcmFnU291cmNlKHJlc05hdiwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgbmV3IFZpZXdEcmFnU291cmNlKHByb2JWaWV3LCBmYWxzZSksCi0gICAgICAgICAgICAgICAgbmV3IFZpZXdEcmFnU291cmNlKHByb2JWaWV3LCB0cnVlKSB9OwotCi0gICAgICAgIC8vIERyYWcgc291cmNlcyBmb3IgZWRpdG9ycwotICAgICAgICBUZXN0RHJhZ1NvdXJjZVtdIGVkaXRvckRyYWdTb3VyY2VzID0gbmV3IFRlc3REcmFnU291cmNlW10gewotICAgICAgICAgICAgICAgIG5ldyBFZGl0b3JEcmFnU291cmNlKDAsIGZhbHNlKSwgbmV3IEVkaXRvckRyYWdTb3VyY2UoMCwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgbmV3IEVkaXRvckRyYWdTb3VyY2UoMiwgZmFsc2UpLCBuZXcgRWRpdG9yRHJhZ1NvdXJjZSgyLCB0cnVlKSB9OwotCi0gICAgICAgIC8vIERyb3AgdGFyZ2V0cyB0aGF0IHdpbGwgb25seSBiZSB0ZXN0ZWQgZm9yIHZpZXdzCi0KLSAgICAgICAgLy8gRHJhZyBzb3VyY2VzIGZvciBtYXhpbWl6ZWQgdmlld3MKLSAgICAgICAgVGVzdERyYWdTb3VyY2VbXSBtYXhpbWl6ZWRWaWV3RHJhZ1NvdXJjZXMgPSBuZXcgVGVzdERyYWdTb3VyY2VbXSB7Ci0gICAgICAgICAgICAgICAgbmV3IFZpZXdEcmFnU291cmNlKHJlc05hdiwgZmFsc2UsIHRydWUpLAotICAgICAgICAgICAgICAgIG5ldyBWaWV3RHJhZ1NvdXJjZShyZXNOYXYsIHRydWUsIHRydWUpLAotICAgICAgICAgICAgICAgIG5ldyBWaWV3RHJhZ1NvdXJjZShwcm9iVmlldywgZmFsc2UsIHRydWUpLAotICAgICAgICAgICAgICAgIG5ldyBWaWV3RHJhZ1NvdXJjZShwcm9iVmlldywgdHJ1ZSwgdHJ1ZSkgfTsKLQotICAgICAgICAvLyBOb3cgZ2VuZXJhdGUgYWxsIHRlc3QgY2FzZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhpbWl6ZWRWaWV3RHJhZ1NvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRlc3REcmFnU291cmNlIHNvdXJjZSA9IG1heGltaXplZFZpZXdEcmFnU291cmNlc1tpXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYWRkQWxsQ29tYmluYXRpb25zKHNvdXJjZSwgZ2V0TWF4aW1pemVkVmlld0Ryb3BUYXJnZXRzKHNvdXJjZSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZpZXdEcmFnU291cmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGVzdERyYWdTb3VyY2Ugc291cmNlID0gdmlld0RyYWdTb3VyY2VzW2ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGRBbGxDb21iaW5hdGlvbnMoc291cmNlLCBnZXRWaWV3RHJvcFRhcmdldHMoc291cmNlKSk7Ci0gICAgICAgICAgICBhZGRBbGxDb21iaW5hdGlvbnMoc291cmNlLCBnZXRDb21tb25Ecm9wVGFyZ2V0cyhzb3VyY2UpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGVzdCBkcmFnZ2luZyBvbnRvIGEgZGV0YWNoZWQgd2luZG93Ci0gICAgICAgICAgICBhZGRBbGxDb21iaW5hdGlvbnNEZXRhY2hlZChzb3VyY2UsIGdldERldGFjaGVkV2luZG93RHJvcFRhcmdldHMoc291cmNlKSk7Ci0gICAgICAgIH0KLSAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvckRyYWdTb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUZXN0RHJhZ1NvdXJjZSBzb3VyY2UgPSBlZGl0b3JEcmFnU291cmNlc1tpXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYWRkQWxsQ29tYmluYXRpb25zKHNvdXJjZSwgZ2V0RWRpdG9yRHJvcFRhcmdldHMoc291cmNlKSk7Ci0gICAgICAgICAgICBhZGRBbGxDb21iaW5hdGlvbnMoc291cmNlLCBnZXRDb21tb25Ecm9wVGFyZ2V0cyhzb3VyY2UpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGVzdCBkcmFnZ2luZyBvbnRvIGEgZGV0YWNoZWQgd2luZG93Ci0gICAgICAgICAgICBhZGRBbGxDb21iaW5hdGlvbnNEZXRhY2hlZChzb3VyY2UsIGdldERldGFjaGVkV2luZG93RHJvcFRhcmdldHMoc291cmNlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1Zzg3MjExVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgZHJvcCB0YXJnZXRzIHRoYXQgd2lsbCBvbmx5IGJlIHRlc3RlZCBmb3IgbWF4aW1pemVkIHZpZXdzLiAod2Ugb25seSBuZWVkIHRvIGVuc3VyZQotICAgICAqIHRoYXQgdGhlIHZpZXcgd2lsbCBiZWNvbWUgdW4tbWF4aW1pemVkIC0tIHRoZSByZWd1bGFyIHZpZXcgdGVzdCBjYXNlcyB3aWxsIGV4Y2VyY2lzZQotICAgICAqIHRoZSByZW1haW5kZXIgb2YgdGhlIHZpZXcgZHJhZ2dpbmcgY29kZSkuIFdlIG5lZWQgdG8gZHJhZyBlYWNoIGtpbmQgb2YgbWF4aW1pemVkIHZpZXcKLSAgICAgKiB0byBzb21ldGhpbmcgdGhhdCBjb3VsZG4ndCBiZSBzZWVuIHdoaWxlIHRoZSB2aWV3IGlzIG1heGltaXplZCAtLSBsaWtlIHRoZSBlZGl0b3IgYXJlYSkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRyYWdTb3VyY2UKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgVGVzdERyb3BMb2NhdGlvbltdIGdldE1heGltaXplZFZpZXdEcm9wVGFyZ2V0cyhJV29ya2JlbmNoV2luZG93UHJvdmlkZXIgb3JpZ2luYXRpbmdXaW5kb3cpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0RHJvcExvY2F0aW9uW10geyAKLSAgICAgICAgICAgICAgICBuZXcgRWRpdG9yQXJlYURyb3BUYXJnZXQob3JpZ2luYXRpbmdXaW5kb3csIFNXVC5SSUdIVCkgfTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFRlc3REcm9wTG9jYXRpb25bXSBnZXRDb21tb25Ecm9wVGFyZ2V0cyhJV29ya2JlbmNoV2luZG93UHJvdmlkZXIgZHJhZ1NvdXJjZSkgewotICAgICAgICBUZXN0RHJvcExvY2F0aW9uW10gdGFyZ2V0cyA9IHsgCi0gICAgICAgICAgICAvLyBUZXN0IGRyYWdnaW5nIHRvIHRoZSBlZGdlcyBvZiB0aGUgd29ya2JlbmNoIHdpbmRvdwotICAgICAgICAgICAgbmV3IFdpbmRvd0Ryb3BUYXJnZXQoZHJhZ1NvdXJjZSwgU1dULlRPUCksCi0gICAgICAgICAgICBuZXcgV2luZG93RHJvcFRhcmdldChkcmFnU291cmNlLCBTV1QuQk9UVE9NKSwKLSAgICAgICAgICAgIG5ldyBXaW5kb3dEcm9wVGFyZ2V0KGRyYWdTb3VyY2UsIFNXVC5MRUZUKSwgCi0gICAgICAgICAgICBuZXcgV2luZG93RHJvcFRhcmdldChkcmFnU291cmNlLCBTV1QuUklHSFQpIH07Ci0gICAgICAgIAkKLQkJcmV0dXJuIHRhcmdldHM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiBhbGwgZHJvcCB0YXJnZXRzIHRoYXQgb25seSBhcHBseSB0byB2aWV3cywgZ2l2ZW4gdGhlIHdpbmRvdyBiZWluZyBkcmFnZ2VkIGZyb20uCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3ZpZGVyCi0gICAgICogQHJldHVybgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIFRlc3REcm9wTG9jYXRpb25bXSBnZXRWaWV3RHJvcFRhcmdldHMoSVdvcmtiZW5jaFdpbmRvd1Byb3ZpZGVyIGRyYWdTb3VyY2UpIHsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyByZXNOYXYgPSBJUGFnZUxheW91dC5JRF9SRVNfTkFWOwotICAgICAgICBTdHJpbmcgcHJvYlZpZXcgPSBJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVc7Ci0gICAgICAgIAotICAgICAgICBUZXN0RHJvcExvY2F0aW9uW10gdGFyZ2V0cyA9IG5ldyBUZXN0RHJvcExvY2F0aW9uW10gewotICAgICAgICAgICAgLy8gRWRpdG9yIGFyZWEKLSAgICAgICAgICAgIG5ldyBFZGl0b3JBcmVhRHJvcFRhcmdldChkcmFnU291cmNlLCBTV1QuTEVGVCksCi0gICAgICAgICAgICBuZXcgRWRpdG9yQXJlYURyb3BUYXJnZXQoZHJhZ1NvdXJjZSwgU1dULlJJR0hUKSwKLSAgICAgICAgICAgIG5ldyBFZGl0b3JBcmVhRHJvcFRhcmdldChkcmFnU291cmNlLCBTV1QuVE9QKSwKLSAgICAgICAgICAgIG5ldyBFZGl0b3JBcmVhRHJvcFRhcmdldChkcmFnU291cmNlLCBTV1QuQk9UVE9NKSwKLQotICAgICAgICAgICAgLy8gUmVzb3VyY2UgbmF2aWdhdG9yIChhIHZpZXcgdGhhdCBpc24ndCBpbiBhIHN0YWNrKQotICAgICAgICAgICAgbmV3IFZpZXdEcm9wVGFyZ2V0KGRyYWdTb3VyY2UsIHJlc05hdiwgU1dULkxFRlQpLAotICAgICAgICAgICAgbmV3IFZpZXdEcm9wVGFyZ2V0KGRyYWdTb3VyY2UsIHJlc05hdiwgU1dULlJJR0hUKSwKLSAgICAgICAgICAgIG5ldyBWaWV3RHJvcFRhcmdldChkcmFnU291cmNlLCByZXNOYXYsIFNXVC5CT1RUT00pLAotICAgICAgICAgICAgbmV3IFZpZXdEcm9wVGFyZ2V0KGRyYWdTb3VyY2UsIHJlc05hdiwgU1dULkNFTlRFUiksCi0gICAgICAgICAgICBuZXcgVmlld0Ryb3BUYXJnZXQoZHJhZ1NvdXJjZSwgcmVzTmF2LCBTV1QuVE9QKSwKLQotICAgICAgICAgICAgLy8gUHJvYmxlbXMgdmlldyAoYSB2aWV3IHRoYXQgaXMgaW4gYSBzdGFjaykKLSAgICAgICAgICAgIC8vIE9taXQgdGhlIHRvcCBmcm9tIHRoaXMgdGVzdCwgc2luY2UgdGhlIG1lYW5pbmcgb2YgZHJvcHBpbmcgb24gdGhlIHRvcCBib3JkZXIgb2YgCi0gICAgICAgICAgICAvLyBhIHN0YWNrIG1heSBjaGFuZ2UgaW4gdGhlIG5lYXIgZnV0dXJlCi0gICAgICAgICAgICBuZXcgVmlld0Ryb3BUYXJnZXQoZHJhZ1NvdXJjZSwgcHJvYlZpZXcsIFNXVC5MRUZUKSwKLSAgICAgICAgICAgIG5ldyBWaWV3RHJvcFRhcmdldChkcmFnU291cmNlLCBwcm9iVmlldywgU1dULlJJR0hUKSwKLSAgICAgICAgICAgIG5ldyBWaWV3RHJvcFRhcmdldChkcmFnU291cmNlLCBwcm9iVmlldywgU1dULkJPVFRPTSksCi0gICAgICAgICAgICBuZXcgVmlld0Ryb3BUYXJnZXQoZHJhZ1NvdXJjZSwgcHJvYlZpZXcsIFNXVC5DRU5URVIpLAotICAgICAgICAgICAgbmV3IFZpZXdEcm9wVGFyZ2V0KGRyYWdTb3VyY2UsIHByb2JWaWV3LCBTV1QuVE9QKSwKLQotICAgICAgICAgICAgLy8gRmFzdCB2aWV3IGJhcgotICAgICAgICAgICAgbmV3IEZhc3RWaWV3QmFyRHJvcFRhcmdldChkcmFnU291cmNlKSwKLQotICAgICAgICAgICAgLy8gVmlldyB0YWJzCi0gICAgICAgICAgICBuZXcgVmlld1RhYkRyb3BUYXJnZXQoZHJhZ1NvdXJjZSwgcmVzTmF2KSwgCi0gICAgICAgICAgICBuZXcgVmlld1RhYkRyb3BUYXJnZXQoZHJhZ1NvdXJjZSwgcHJvYlZpZXcpLAotICAgICAgICAgICAgbmV3IFZpZXdUaXRsZURyb3BUYXJnZXQoZHJhZ1NvdXJjZSwgcHJvYlZpZXcpLAotICAgICAgICAgICAgfTsKLSAgICAgICAgCQotCQlyZXR1cm4gdGFyZ2V0czsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFsbCBkcm9wIHRhcmdldHMgdGhhdCBhcHBseSB0byBkZXRhY2hlZCB3aW5kb3dzLCBnaXZlbiB0aGUgd2luZG93IGJlaW5nIGRyYWdnZWQgZnJvbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgVGVzdERyb3BMb2NhdGlvbltdIGdldERldGFjaGVkV2luZG93RHJvcFRhcmdldHMoSVdvcmtiZW5jaFdpbmRvd1Byb3ZpZGVyIGRyYWdTb3VyY2UpIHsKLSAgICAgICAgVGVzdERyb3BMb2NhdGlvbltdIHRhcmdldHMgPSBuZXcgVGVzdERyb3BMb2NhdGlvbltdIHsKLSAgICAgICAgICAgIC8vIEVkaXRvciBhcmVhCi0gICAgICAgICAgICBuZXcgVmlld0Ryb3BUYXJnZXQoZHJhZ1NvdXJjZSwgRHJhZ0Ryb3BQZXJzcGVjdGl2ZUZhY3RvcnkuZHJvcFZpZXdJZDEsIFNXVC5DRU5URVIpLAotICAgICAgICAgICAgbmV3IFZpZXdEcm9wVGFyZ2V0KGRyYWdTb3VyY2UsIERyYWdEcm9wUGVyc3BlY3RpdmVGYWN0b3J5LmRyb3BWaWV3SWQzLCBTV1QuQ0VOVEVSKSwKLSAgICAgICAgICAgIG5ldyBWaWV3VGFiRHJvcFRhcmdldChkcmFnU291cmNlLCBEcmFnRHJvcFBlcnNwZWN0aXZlRmFjdG9yeS5kcm9wVmlld0lkMSksCi0gICAgICAgICAgICBuZXcgRGV0YWNoZWREcm9wVGFyZ2V0KCkKLSAgICAgICAgfTsKLSAgICAgICAgCi0JCXJldHVybiB0YXJnZXRzOwotICAgIH0KLQotICAgIHByaXZhdGUgVGVzdERyb3BMb2NhdGlvbltdIGdldEVkaXRvckRyb3BUYXJnZXRzKElXb3JrYmVuY2hXaW5kb3dQcm92aWRlciBvcmlnaW5hdGluZ1dpbmRvdykgewotICAgICAgICBTdHJpbmcgcmVzTmF2ID0gSVBhZ2VMYXlvdXQuSURfUkVTX05BVjsKLSAgICAgICAgLy8gRHJvcCB0YXJnZXRzIHRoYXQgd2lsbCBvbmx5IGJlIHRlc3RlZCBmb3IgZWRpdG9ycwotICAgICAgICByZXR1cm4gbmV3IFRlc3REcm9wTG9jYXRpb25bXSB7Ci0gICAgICAgIC8vIEEgdmlldwotICAgICAgICAgICAgICAgIG5ldyBWaWV3RHJvcFRhcmdldChvcmlnaW5hdGluZ1dpbmRvdywgcmVzTmF2LCBTV1QuQ0VOVEVSKSwKLSAgICAKLSAgICAgICAgICAgICAgICAvLyBBIHN0YW5kLWFsb25lIGVkaXRvcgotICAgICAgICAgICAgICAgIG5ldyBFZGl0b3JEcm9wVGFyZ2V0KG9yaWdpbmF0aW5nV2luZG93LCAyLCBTV1QuTEVGVCksCi0gICAgICAgICAgICAgICAgbmV3IEVkaXRvckRyb3BUYXJnZXQob3JpZ2luYXRpbmdXaW5kb3csIDIsIFNXVC5SSUdIVCksCi0gICAgICAgICAgICAgICAgbmV3IEVkaXRvckRyb3BUYXJnZXQob3JpZ2luYXRpbmdXaW5kb3csIDIsIFNXVC5UT1ApLAotICAgICAgICAgICAgICAgIG5ldyBFZGl0b3JEcm9wVGFyZ2V0KG9yaWdpbmF0aW5nV2luZG93LCAyLCBTV1QuQk9UVE9NKSwKLSAgICAgICAgICAgICAgICBuZXcgRWRpdG9yRHJvcFRhcmdldChvcmlnaW5hdGluZ1dpbmRvdywgMiwgU1dULkNFTlRFUiksCi0gICAgCi0gICAgICAgICAgICAgICAgLy8gRWRpdG9ycyAoYSBzdGFjayBvZiBlZGl0b3JzKQotICAgICAgICAgICAgICAgIG5ldyBFZGl0b3JEcm9wVGFyZ2V0KG9yaWdpbmF0aW5nV2luZG93LCAwLCBTV1QuTEVGVCksCi0gICAgICAgICAgICAgICAgbmV3IEVkaXRvckRyb3BUYXJnZXQob3JpZ2luYXRpbmdXaW5kb3csIDAsIFNXVC5SSUdIVCksCi0gICAgICAgICAgICAgICAgbmV3IEVkaXRvckRyb3BUYXJnZXQob3JpZ2luYXRpbmdXaW5kb3csIDAsIFNXVC5CT1RUT00pLAotICAgICAgICAgICAgICAgIG5ldyBFZGl0b3JEcm9wVGFyZ2V0KG9yaWdpbmF0aW5nV2luZG93LCAwLCBTV1QuQ0VOVEVSKSwKLSAgICAgICAgICAgICAgICBuZXcgRWRpdG9yVGFiRHJvcFRhcmdldChvcmlnaW5hdGluZ1dpbmRvdywgMCksCi0gICAgICAgICAgICAgICAgbmV3IEVkaXRvclRpdGxlRHJvcFRhcmdldChvcmlnaW5hdGluZ1dpbmRvdywgMCksIAotICAgICAgICAgICAgICAgIH07Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGRBbGxDb21iaW5hdGlvbnMoVGVzdERyYWdTb3VyY2UgZHJhZ1NvdXJjZSwKLSAgICAgICAgICAgIFRlc3REcm9wTG9jYXRpb25bXSBkcm9wVGFyZ2V0cykgewotCi0gICAgICAgIGZvciAoaW50IGRlc3RJZCA9IDA7IGRlc3RJZCA8IGRyb3BUYXJnZXRzLmxlbmd0aDsgZGVzdElkKyspIHsKLSAgICAgICAgICAgIERyYWdUZXN0IG5ld1Rlc3QgPSBuZXcgRHJhZ1Rlc3QoZHJhZ1NvdXJjZSwgZHJvcFRhcmdldHNbZGVzdElkXSwgZ2V0TG9nKCkpOwotICAgICAgICAgICAgYWRkVGVzdChuZXdUZXN0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYWRkQWxsQ29tYmluYXRpb25zRGV0YWNoZWQoVGVzdERyYWdTb3VyY2UgZHJhZ1NvdXJjZSwKLSAgICAgICAgICAgIFRlc3REcm9wTG9jYXRpb25bXSBkcm9wVGFyZ2V0cykgewotCi0gICAgCWlmIChpc0RldGFjaGluZ1N1cHBvcnRlZCkgewotCSAgICAgICAgZm9yIChpbnQgZGVzdElkID0gMDsgZGVzdElkIDwgZHJvcFRhcmdldHMubGVuZ3RoOyBkZXN0SWQrKykgewotCSAgICAgICAgICAgIERyYWdUZXN0IG5ld1Rlc3QgPSBuZXcgRGV0YWNoZWRXaW5kb3dEcmFnVGVzdChkcmFnU291cmNlLCBkcm9wVGFyZ2V0c1tkZXN0SWRdLCBnZXRMb2coKSk7Ci0JICAgICAgICAgICAgYWRkVGVzdChuZXdUZXN0KTsKLQkgICAgICAgIH0KLSAgICAJfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvRWRpdG9yQXJlYURyb3BUYXJnZXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0VkaXRvckFyZWFEcm9wVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDYzMWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvRWRpdG9yQXJlYURyb3BUYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yQXJlYURyb3BUYXJnZXQgZXh0ZW5kcyBXb3JrYmVuY2hXaW5kb3dEcm9wVGFyZ2V0IHsKLSAgICBpbnQgc2lkZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3aW5kb3cKLSAgICAgKiBAcGFyYW0gc2lkZQotICAgICAqLwotICAgIHB1YmxpYyBFZGl0b3JBcmVhRHJvcFRhcmdldChJV29ya2JlbmNoV2luZG93UHJvdmlkZXIgcHJvdmlkZXIsIGludCBzaWRlKSB7Ci0gICAgICAgIHN1cGVyKHByb3ZpZGVyKTsKLSAgICAgICAgdGhpcy5zaWRlID0gc2lkZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQuVGVzdERyb3BUYXJnZXQjZ2V0TmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIERyYWdPcGVyYXRpb25zLm5hbWVGb3JDb25zdGFudChzaWRlKSArICIgb2YgZWRpdG9yIGFyZWEiOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5UZXN0RHJvcFRhcmdldCNnZXRMb2NhdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gRHJhZ09wZXJhdGlvbnMuZ2V0UG9pbnRJbkVkaXRvckFyZWEoZ2V0UGFnZSgpLCBzaWRlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0VkaXRvckRyYWdTb3VyY2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0VkaXRvckRyYWdTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhYjgzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9FZGl0b3JEcmFnU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZG5kLlRlc3REcm9wTG9jYXRpb247Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yRHJhZ1NvdXJjZSBleHRlbmRzIFRlc3REcmFnU291cmNlIHsKLQotICAgIGludCBlZGl0b3JJZHg7Ci0KLSAgICBib29sZWFuIHdob2xlRm9sZGVyOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVkaXRvcgotICAgICAqIEBwYXJhbSB3aG9sZUZvbGRlcgotICAgICAqLwotICAgIHB1YmxpYyBFZGl0b3JEcmFnU291cmNlKGludCBlZGl0b3JJZHgsIGJvb2xlYW4gd2hvbGVGb2xkZXIpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5lZGl0b3JJZHggPSBlZGl0b3JJZHg7Ci0gICAgICAgIHRoaXMud2hvbGVGb2xkZXIgPSB3aG9sZUZvbGRlcjsKLSAgICB9Ci0KLSAgICBJRWRpdG9yUGFydCBnZXRQYXJ0KCkgewotICAgICAgICByZXR1cm4gZ2V0UGFnZSgpLmdldEVkaXRvcnMoKVtlZGl0b3JJZHhdOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5UZXN0RHJhZ1NvdXJjZSNnZXROYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgdGl0bGUgPSAiZWRpdG9yICIgKyBlZGl0b3JJZHg7Ci0KLSAgICAgICAgaWYgKHdob2xlRm9sZGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGl0bGUgKyAiIGZvbGRlciI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRpdGxlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5UZXN0RHJhZ1NvdXJjZSNkcmFnKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkcmFnKFRlc3REcm9wTG9jYXRpb24gdGFyZ2V0KSB7Ci0gICAgICAgIERyYWdPcGVyYXRpb25zLmRyYWcoZ2V0UGFydCgpLCB0YXJnZXQsIHdob2xlRm9sZGVyKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0VkaXRvckRyb3BUYXJnZXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0VkaXRvckRyb3BUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2ZTJhNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9FZGl0b3JEcm9wVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvckRyb3BUYXJnZXQgZXh0ZW5kcyBXb3JrYmVuY2hXaW5kb3dEcm9wVGFyZ2V0IHsKLQotICAgIGludCBlZGl0b3JJZHg7Ci0KLSAgICBpbnQgc2lkZTsKLQotICAgIHB1YmxpYyBFZGl0b3JEcm9wVGFyZ2V0KElXb3JrYmVuY2hXaW5kb3dQcm92aWRlciBwcm92aWRlciwgaW50IGVkaXRvcklkeCwgaW50IHNpZGUpIHsKLSAgICAgICAgc3VwZXIocHJvdmlkZXIpOwotICAgICAgICB0aGlzLmVkaXRvcklkeCA9IGVkaXRvcklkeDsKLSAgICAgICAgdGhpcy5zaWRlID0gc2lkZTsKLSAgICB9Ci0KLSAgICBJRWRpdG9yUGFydCBnZXRQYXJ0KCkgewotICAgICAgICByZXR1cm4gZ2V0UGFnZSgpLmdldEVkaXRvcnMoKVtlZGl0b3JJZHhdOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5UZXN0RHJvcFRhcmdldCNnZXROYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gRHJhZ09wZXJhdGlvbnMubmFtZUZvckNvbnN0YW50KHNpZGUpICsgIiBvZiBlZGl0b3IgIiArIGVkaXRvcklkeDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQuVGVzdERyb3BUYXJnZXQjZ2V0TG9jYXRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIERyYWdPcGVyYXRpb25zLmdldExvY2F0aW9uKERyYWdPcGVyYXRpb25zLmdldFBhbmUoZ2V0UGFydCgpKSwKLSAgICAgICAgICAgICAgICBzaWRlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotICAgIAlyZXR1cm4gZ2V0UGFydCgpLmdldFNpdGUoKS5nZXRTaGVsbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0VkaXRvclRhYkRyb3BUYXJnZXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0VkaXRvclRhYkRyb3BUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkZjY2ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9FZGl0b3JUYWJEcm9wVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yVGFiRHJvcFRhcmdldCBleHRlbmRzIFdvcmtiZW5jaFdpbmRvd0Ryb3BUYXJnZXQgewotCi0gICAgaW50IGVkaXRvcklkeDsKLQotICAgIHB1YmxpYyBFZGl0b3JUYWJEcm9wVGFyZ2V0KElXb3JrYmVuY2hXaW5kb3dQcm92aWRlciBwcm92aWRlciwgaW50IGVkaXRvcklkeCkgewotICAgICAgICBzdXBlcihwcm92aWRlcik7Ci0gICAgICAgIHRoaXMuZWRpdG9ySWR4ID0gZWRpdG9ySWR4OwotICAgIH0KLQotICAgIElFZGl0b3JQYXJ0IGdldFBhcnQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYWdlKCkuZ2V0RWRpdG9ycygpW2VkaXRvcklkeF07Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kLlRlc3REcm9wVGFyZ2V0I2dldE5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiZWRpdG9yICIgKyBlZGl0b3JJZHggKyAiIHRhYiBhcmVhIjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotICAgIAlyZXR1cm4gZ2V0UGFydCgpLmdldFNpdGUoKS5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5UZXN0RHJvcFRhcmdldCNnZXRMb2NhdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gRHJhZ09wZXJhdGlvbnMuZ2V0RGlzcGxheUJvdW5kcyhEcmFnT3BlcmF0aW9ucwotICAgICAgICAgICAgICAgIC5nZXRQYW5lKGdldFBhcnQoKSkpOwotCi0gICAgICAgIHJldHVybiBuZXcgUG9pbnQoYm91bmRzLnggKyA4LCBib3VuZHMueSArIDgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0VkaXRvclRpdGxlRHJvcFRhcmdldC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvRWRpdG9yVGl0bGVEcm9wVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMTFkYWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvRWRpdG9yVGl0bGVEcm9wVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yVGl0bGVEcm9wVGFyZ2V0IGV4dGVuZHMgV29ya2JlbmNoV2luZG93RHJvcFRhcmdldCB7Ci0KLSAgICBpbnQgZWRpdG9ySWR4OwotCi0gICAgcHVibGljIEVkaXRvclRpdGxlRHJvcFRhcmdldChJV29ya2JlbmNoV2luZG93UHJvdmlkZXIgcHJvdmlkZXIsIGludCBlZGl0b3JJZHgpIHsKLSAgICAgICAgc3VwZXIocHJvdmlkZXIpOwotICAgICAgICB0aGlzLmVkaXRvcklkeCA9IGVkaXRvcklkeDsKLSAgICB9Ci0KLSAgICBJRWRpdG9yUGFydCBnZXRQYXJ0KCkgewotICAgICAgICByZXR1cm4gZ2V0UGFnZSgpLmdldEVkaXRvcnMoKVtlZGl0b3JJZHhdOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5UZXN0RHJvcFRhcmdldCNnZXROYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gImVkaXRvciAiICsgZWRpdG9ySWR4ICsgIiB0aXRsZSBhcmVhIjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotICAgIAlyZXR1cm4gZ2V0UGFydCgpLmdldFNpdGUoKS5nZXRTaGVsbCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5UZXN0RHJvcFRhcmdldCNnZXRMb2NhdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gRHJhZ09wZXJhdGlvbnMuZ2V0RGlzcGxheUJvdW5kcyhEcmFnT3BlcmF0aW9ucwotICAgICAgICAgICAgICAgIC5nZXRQYW5lKGdldFBhcnQoKSkpOwotCi0gICAgICAgIHJldHVybiBuZXcgUG9pbnQoIChib3VuZHMueCArIGJvdW5kcy53aWR0aCkgLSA4LCBib3VuZHMueSArIDgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0V4aXN0aW5nV2luZG93UHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0V4aXN0aW5nV2luZG93UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1ZDAwYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9FeGlzdGluZ1dpbmRvd1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotcHVibGljIGNsYXNzIEV4aXN0aW5nV2luZG93UHJvdmlkZXIgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93UHJvdmlkZXIgewotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLSAgICAKLSAgICBwdWJsaWMgRXhpc3RpbmdXaW5kb3dQcm92aWRlcihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICB0aGlzLndpbmRvdyA9IHdpbmRvdzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElXb3JrYmVuY2hXaW5kb3cgZ2V0V29ya2JlbmNoV2luZG93KCkgewotICAgICAgICByZXR1cm4gd2luZG93OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvRmFzdFZpZXdCYXJEcm9wVGFyZ2V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9GYXN0Vmlld0JhckRyb3BUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4ZTU4Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9GYXN0Vmlld0JhckRyb3BUYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkdlb21ldHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRuZC5EcmFnVXRpbDsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGYXN0Vmlld0JhckRyb3BUYXJnZXQgZXh0ZW5kcyBXb3JrYmVuY2hXaW5kb3dEcm9wVGFyZ2V0IHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3aW5kb3cKLSAgICAgKi8KLSAgICBwdWJsaWMgRmFzdFZpZXdCYXJEcm9wVGFyZ2V0KElXb3JrYmVuY2hXaW5kb3dQcm92aWRlciBwcm92aWRlcikgewotICAgICAgICBzdXBlcihwcm92aWRlcik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJmYXN0IHZpZXcgYmFyIjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQuVGVzdERyb3BUYXJnZXQjZ2V0TG9jYXRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IChXb3JrYmVuY2hXaW5kb3cpIGdldFBhZ2UoKQotICAgICAgICAgICAgICAgIC5nZXRXb3JrYmVuY2hXaW5kb3coKTsKLQotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSB3aW5kb3cuZ2V0RmFzdFZpZXdCYXIoKS5nZXRDb250cm9sKCk7Ci0gICAgICAgIFJlY3RhbmdsZSByZWdpb24gPSBEcmFnVXRpbC5nZXREaXNwbGF5Qm91bmRzKGNvbnRyb2wpOwotICAgICAgICBQb2ludCByZXN1bHQgPSBHZW9tZXRyeS5jZW50ZXJQb2ludChyZWdpb24pOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9JV29ya2JlbmNoV2luZG93UHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0lXb3JrYmVuY2hXaW5kb3dQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODFiM2JkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL0lXb3JrYmVuY2hXaW5kb3dQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdvcmtiZW5jaFdpbmRvd1Byb3ZpZGVyIHsKLSAgICBwdWJsaWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRXb3JrYmVuY2hXaW5kb3coKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL1N0YW5kYWxvbmVWaWV3UGVyc3BlY3RpdmUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL1N0YW5kYWxvbmVWaWV3UGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3OWJlMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9TdGFuZGFsb25lVmlld1BlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqIEBzaW5jZSAzLjEuMQotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRhbG9uZVZpZXdQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUTElORV9JRCA9IElQYWdlTGF5b3V0LklEX09VVExJTkU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9JRCA9IElQYWdlTGF5b3V0LklEX1JFU19OQVY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0lEID0gSVBhZ2VMYXlvdXQuSURfVEFTS19MSVNUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU1BfSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuZG5kLlN0YW5kYWxvbmVWaWV3UGVyc3BlY3RpdmUiOwotCi0JcHVibGljIFN0YW5kYWxvbmVWaWV3UGVyc3BlY3RpdmUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotCQlsYXlvdXQuc2V0RWRpdG9yQXJlYVZpc2libGUodHJ1ZSk7Ci0KLQkJbGF5b3V0LmFkZFN0YW5kYWxvbmVWaWV3KFJFU09VUkNFX0lELCB0cnVlLCBJUGFnZUxheW91dC5MRUZULCAwLjI1ZiwKLQkJCQlJUGFnZUxheW91dC5JRF9FRElUT1JfQVJFQSk7Ci0JCWxheW91dC5hZGRTdGFuZGFsb25lVmlldyhPVVRMSU5FX0lELCB0cnVlLCBJUGFnZUxheW91dC5SSUdIVCwgMC4yNWYsCi0JCQkJSVBhZ2VMYXlvdXQuSURfRURJVE9SX0FSRUEpOwotCQlsYXlvdXQuZ2V0Vmlld0xheW91dChPVVRMSU5FX0lEKS5zZXRDbG9zZWFibGUoZmFsc2UpOwotCQlsYXlvdXQuYWRkU3RhbmRhbG9uZVZpZXcoVEFTS19JRCwgdHJ1ZSwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAwLjI1ZiwKLQkJCQlJUGFnZUxheW91dC5JRF9FRElUT1JfQVJFQSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvVGVzdERyYWdTb3VyY2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL1Rlc3REcmFnU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWUwMGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvVGVzdERyYWdTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZG5kLlRlc3REcm9wTG9jYXRpb247Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdERyYWdTb3VyY2UgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93UHJvdmlkZXIgewotICAgIHByaXZhdGUgV29ya2JlbmNoUGFnZSBwYWdlOwotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhZyhUZXN0RHJvcExvY2F0aW9uIHRhcmdldCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlKFdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBJV29ya2JlbmNoV2luZG93IGdldFdvcmtiZW5jaFdpbmRvdygpIHsKLSAgICAgICAgcmV0dXJuIGdldFBhZ2UoKS5nZXRXb3JrYmVuY2hXaW5kb3coKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFdvcmtiZW5jaFBhZ2UgZ2V0UGFnZSgpIHsKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcGFnZSA9IChXb3JrYmVuY2hQYWdlKSAoKFdvcmtiZW5jaFdpbmRvdykgUGxhdGZvcm1VSQotICAgICAgICAgICAgICAgICAgICAuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFnZTsKLSAgICB9Ci0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9WaWV3RHJhZ1NvdXJjZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvVmlld0RyYWdTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZDAzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9WaWV3RHJhZ1NvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlBhcnRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlZpZXdTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kbmQuRHJhZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZG5kLlRlc3REcm9wTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuSVZpZXdEZXNjcmlwdG9yOwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFZpZXdEcmFnU291cmNlIGV4dGVuZHMgVGVzdERyYWdTb3VyY2UgewotCi0gICAgU3RyaW5nIHRhcmdldFBhcnQ7Ci0KLSAgICBib29sZWFuIHdob2xlRm9sZGVyOwotCi0gICAgYm9vbGVhbiBtYXhpbWl6ZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBWaWV3RHJhZ1NvdXJjZShTdHJpbmcgcGFydCwgYm9vbGVhbiBkcmFnV2hvbGVGb2xkZXIpIHsKLSAgICAgICAgdGhpcyhwYXJ0LCBkcmFnV2hvbGVGb2xkZXIsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlld0RyYWdTb3VyY2UoU3RyaW5nIHBhcnQsIGJvb2xlYW4gZHJhZ1dob2xlRm9sZGVyLAotICAgICAgICAgICAgYm9vbGVhbiBtYXhpbWl6ZWQpIHsKLSAgICAgICAgdGhpcy5tYXhpbWl6ZWQgPSBtYXhpbWl6ZWQ7Ci0gICAgICAgIHRoaXMudGFyZ2V0UGFydCA9IHBhcnQ7Ci0KLSAgICAgICAgd2hvbGVGb2xkZXIgPSBkcmFnV2hvbGVGb2xkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIElWaWV3UGFydCBnZXRQYXJ0KCkgewotICAgICAgICByZXR1cm4gZ2V0UGFnZSgpLmZpbmRWaWV3KHRhcmdldFBhcnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5UZXN0RHJhZ1NvdXJjZSNnZXROYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBJVmlld0Rlc2NyaXB0b3IgZGVzYyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Vmlld1JlZ2lzdHJ5KCkKLSAgICAgICAgICAgICAgICAuZmluZCh0YXJnZXRQYXJ0KTsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gZGVzYy5nZXRMYWJlbCgpOwotCi0gICAgICAgIGlmICh3aG9sZUZvbGRlcikgewotICAgICAgICAgICAgdGl0bGUgPSB0aXRsZSArICIgZm9sZGVyIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXhpbWl6ZWQpIHsKLSAgICAgICAgICAgIHRpdGxlID0gIm1heGltaXplZCAiICsgdGl0bGU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGl0bGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kLlRlc3REcmFnU291cmNlI2RyYWcob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRyYWcoVGVzdERyb3BMb2NhdGlvbiB0YXJnZXQpIHsKLSAgICAgICAgSVZpZXdQYXJ0IHBhcnQgPSBnZXRQYXJ0KCk7Ci0KLSAgICAgICAgV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0UGFnZSgpOwotICAgICAgICBQYXJ0UGFuZSBwYW5lID0gKChWaWV3U2l0ZSkgcGFydC5nZXRTaXRlKCkpLmdldFBhbmUoKTsKLSAgICAgICAgaWYgKG1heGltaXplZCkgewotICAgICAgICAgICAgcGFnZS50b2dnbGVab29tKHBhbmUuZ2V0UGFydFJlZmVyZW5jZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRHJhZ1V0aWwuZm9yY2VEcm9wTG9jYXRpb24odGFyZ2V0KTsKLSAgICAgICAgVmlld1N0YWNrIHBhcmVudCA9ICgoVmlld1N0YWNrKSAocGFuZS5nZXRDb250YWluZXIoKSkpOwotICAgICAgICAKLSAgICAgICAgUGFydFBhbmUgcHJlc2VudGFibGVQYXJ0ID0gd2hvbGVGb2xkZXIgPyBudWxsIDogcGFuZTsKLSAgICAgICAgcGFyZW50LnBhbmVEcmFnU3RhcnQocHJlc2VudGFibGVQYXJ0LCBEaXNwbGF5LmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXRDdXJzb3JMb2NhdGlvbigpLCBmYWxzZSk7Ci0KLSAgICAgICAgRHJhZ1V0aWwuZm9yY2VEcm9wTG9jYXRpb24obnVsbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9WaWV3RHJvcFRhcmdldC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvVmlld0Ryb3BUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk3NDIyYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9WaWV3RHJvcFRhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLklWaWV3RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3RHJvcFRhcmdldCBleHRlbmRzIFdvcmtiZW5jaFdpbmRvd0Ryb3BUYXJnZXQgewotCi0gICAgU3RyaW5nIHRhcmdldFBhcnQ7Ci0KLSAgICBpbnQgc2lkZTsKLQotICAgIHB1YmxpYyBWaWV3RHJvcFRhcmdldChJV29ya2JlbmNoV2luZG93UHJvdmlkZXIgcHJvdmlkZXIsIFN0cmluZyBwYXJ0LCBpbnQgc2lkZSkgewotICAgICAgICBzdXBlcihwcm92aWRlcik7Ci0gICAgICAgIHRhcmdldFBhcnQgPSBwYXJ0OwotICAgICAgICB0aGlzLnNpZGUgPSBzaWRlOwotICAgIH0KLQotICAgIElWaWV3UGFydCBnZXRQYXJ0KCkgewotICAgICAgICByZXR1cm4gZ2V0UGFnZSgpLmZpbmRWaWV3KHRhcmdldFBhcnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5UZXN0RHJvcFRhcmdldCNnZXROYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBJVmlld0Rlc2NyaXB0b3IgZGVzYyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Vmlld1JlZ2lzdHJ5KCkKLSAgICAgICAgICAgICAgICAuZmluZCh0YXJnZXRQYXJ0KTsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gZGVzYy5nZXRMYWJlbCgpOwotCi0gICAgICAgIHJldHVybiBEcmFnT3BlcmF0aW9ucy5uYW1lRm9yQ29uc3RhbnQoc2lkZSkgKyAiIG9mICIgKyB0aXRsZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQuVGVzdERyb3BUYXJnZXQjZ2V0TG9jYXRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIERyYWdPcGVyYXRpb25zLmdldExvY2F0aW9uKERyYWdPcGVyYXRpb25zLmdldFBhbmUoZ2V0UGFydCgpKSwKLSAgICAgICAgICAgICAgICBzaWRlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotICAgIAlyZXR1cm4gZ2V0UGFydCgpLmdldFNpdGUoKS5nZXRTaGVsbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL1ZpZXdUYWJEcm9wVGFyZ2V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9WaWV3VGFiRHJvcFRhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmU1YTZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL1ZpZXdUYWJEcm9wVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5JVmlld0Rlc2NyaXB0b3I7Ci0KLS8qKgotICogTm90ZTogdGhpcyBkcm9wIGxvY2F0aW9uIGlzIGhhcmRjb2RlZCB0byBhc3N1bWUgYSBwcmVzZW50YXRpb24gdGhhdCBoYXMKLSAqIGEgdGFiIGRyb3AgbG9jYXRpb24gYXQgdGhlIHVwcGVyIGxlZnQgY29ybmVyLCA4IHBpeGVscyBhd2F5IGZyb20gdGhlCi0gKiBlZGdlIGluIGJvdGggZGltZW5zaW9ucy4gVGhpcyBkcm9wIGxvY2F0aW9uIHNob3VsZCBiZSBvbWl0dGVkIGZyb20gdGhlCi0gKiB0ZXN0cyBpbiBzaXR1YXRpb25zIHdoZXJlIHRoaXMgZG9lcyBub3QgYXBwbHkgKHRoaXMgaXMgbm90IGEgcHJvYmxlbQotICogcmlnaHQgbm93IHNpbmNlIHRoZSBjdXJyZW50IHRlc3RzIG9ubHkgdXNlIHRoZSB0YWJzLW9uLXRvcCBkcm9wCi0gKiBsb2NhdGlvbikuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFZpZXdUYWJEcm9wVGFyZ2V0IGV4dGVuZHMgV29ya2JlbmNoV2luZG93RHJvcFRhcmdldCB7Ci0KLSAgICBTdHJpbmcgdGFyZ2V0UGFydDsKLQotICAgIHB1YmxpYyBWaWV3VGFiRHJvcFRhcmdldChJV29ya2JlbmNoV2luZG93UHJvdmlkZXIgcHJvdmlkZXIsIFN0cmluZyBwYXJ0KSB7Ci0gICAgICAgIHN1cGVyKHByb3ZpZGVyKTsKLSAgICAgICAgdGFyZ2V0UGFydCA9IHBhcnQ7Ci0gICAgfQotCi0gICAgSVZpZXdQYXJ0IGdldFBhcnQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYWdlKCkuZmluZFZpZXcodGFyZ2V0UGFydCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kLlRlc3REcm9wVGFyZ2V0I2dldE5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIElWaWV3RGVzY3JpcHRvciBkZXNjID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRWaWV3UmVnaXN0cnkoKQotICAgICAgICAgICAgICAgIC5maW5kKHRhcmdldFBhcnQpOwotICAgICAgICBTdHJpbmcgdGl0bGUgPSBkZXNjLmdldExhYmVsKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRpdGxlICsgIiB2aWV3IHRhYiBhcmVhIjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQuVGVzdERyb3BUYXJnZXQjZ2V0TG9jYXRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IERyYWdPcGVyYXRpb25zLmdldERpc3BsYXlCb3VuZHMoRHJhZ09wZXJhdGlvbnMKLSAgICAgICAgICAgICAgICAuZ2V0UGFuZShnZXRQYXJ0KCkpKTsKLQotICAgICAgICByZXR1cm4gbmV3IFBvaW50KGJvdW5kcy54ICsgOCwgYm91bmRzLnkgKyA4KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotICAgIAlyZXR1cm4gZ2V0UGFydCgpLmdldFNpdGUoKS5nZXRTaGVsbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL1ZpZXdUaXRsZURyb3BUYXJnZXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL1ZpZXdUaXRsZURyb3BUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxZTcxZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9WaWV3VGl0bGVEcm9wVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5JVmlld0Rlc2NyaXB0b3I7Ci0KLS8qKgotICogTm90ZTogdGhpcyBkcm9wIGxvY2F0aW9uIGlzIGhhcmRjb2RlZCB0byBhc3N1bWUgYSBwcmVzZW50YXRpb24gdGhhdCBoYXMKLSAqIGEgdGFiIGRyb3AgbG9jYXRpb24gYXQgdGhlIHVwcGVyIGxlZnQgY29ybmVyLCA4IHBpeGVscyBhd2F5IGZyb20gdGhlCi0gKiBlZGdlIGluIGJvdGggZGltZW5zaW9ucy4gVGhpcyBkcm9wIGxvY2F0aW9uIHNob3VsZCBiZSBvbWl0dGVkIGZyb20gdGhlCi0gKiB0ZXN0cyBpbiBzaXR1YXRpb25zIHdoZXJlIHRoaXMgZG9lcyBub3QgYXBwbHkgKHRoaXMgaXMgbm90IGEgcHJvYmxlbQotICogcmlnaHQgbm93IHNpbmNlIHRoZSBjdXJyZW50IHRlc3RzIG9ubHkgdXNlIHRoZSB0YWJzLW9uLXRvcCBkcm9wCi0gKiBsb2NhdGlvbikuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFZpZXdUaXRsZURyb3BUYXJnZXQgZXh0ZW5kcyBXb3JrYmVuY2hXaW5kb3dEcm9wVGFyZ2V0IHsKLQotICAgIFN0cmluZyB0YXJnZXRQYXJ0OwotCi0gICAgcHVibGljIFZpZXdUaXRsZURyb3BUYXJnZXQoSVdvcmtiZW5jaFdpbmRvd1Byb3ZpZGVyIHByb3ZpZGVyLCBTdHJpbmcgcGFydCkgewotICAgICAgICBzdXBlcihwcm92aWRlcik7Ci0gICAgICAgIHRhcmdldFBhcnQgPSBwYXJ0OwotICAgIH0KLQotICAgIElWaWV3UGFydCBnZXRQYXJ0KCkgewotICAgICAgICByZXR1cm4gZ2V0UGFnZSgpLmZpbmRWaWV3KHRhcmdldFBhcnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5UZXN0RHJvcFRhcmdldCNnZXROYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBJVmlld0Rlc2NyaXB0b3IgZGVzYyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Vmlld1JlZ2lzdHJ5KCkKLSAgICAgICAgICAgICAgICAuZmluZCh0YXJnZXRQYXJ0KTsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gZGVzYy5nZXRMYWJlbCgpOwotCi0gICAgICAgIHJldHVybiB0aXRsZSArICIgdmlldyB0aXRsZSBhcmVhIjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQuVGVzdERyb3BUYXJnZXQjZ2V0TG9jYXRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IERyYWdPcGVyYXRpb25zLmdldERpc3BsYXlCb3VuZHMoRHJhZ09wZXJhdGlvbnMKLSAgICAgICAgICAgICAgICAuZ2V0UGFuZShnZXRQYXJ0KCkpKTsKLQotICAgICAgICByZXR1cm4gbmV3IFBvaW50KCAoYm91bmRzLnggKyBib3VuZHMud2lkdGgpIC0gOCwgYm91bmRzLnkgKyA4KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotICAgIAlyZXR1cm4gZ2V0UGFydCgpLmdldFNpdGUoKS5nZXRTaGVsbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL1dpbmRvd0Ryb3BUYXJnZXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL1dpbmRvd0Ryb3BUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2NmI2MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2RuZC9XaW5kb3dEcm9wVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5HZW9tZXRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXaW5kb3dEcm9wVGFyZ2V0IGV4dGVuZHMgV29ya2JlbmNoV2luZG93RHJvcFRhcmdldCB7Ci0KLSAgICBwcml2YXRlIGludCBzaWRlOwotCi0gICAgcHVibGljIFdpbmRvd0Ryb3BUYXJnZXQoSVdvcmtiZW5jaFdpbmRvd1Byb3ZpZGVyIHByb3ZpZGVyLCBpbnQgc2lkZSkgewotICAgICAgICBzdXBlcihwcm92aWRlcik7Ci0gICAgICAgIHRoaXMuc2lkZSA9IHNpZGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kLlRlc3REcm9wVGFyZ2V0I2dldE5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBEcmFnT3BlcmF0aW9ucy5uYW1lRm9yQ29uc3RhbnQoc2lkZSkgKyAiIG9mIHdpbmRvdyI7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kLlRlc3REcm9wVGFyZ2V0I2dldExvY2F0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLSAgICAgICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBzaGVsbC5nZXRDbGllbnRBcmVhKCk7Ci0KLSAgICAgICAgcmV0dXJuIERyYWdPcGVyYXRpb25zLmdldFBvaW50KEdlb21ldHJ5LnRvRGlzcGxheShzaGVsbCwgY2xpZW50QXJlYSksCi0gICAgICAgICAgICAgICAgc2lkZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvV29ya2JlbmNoV2luZG93RHJvcFRhcmdldC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9kbmQvV29ya2JlbmNoV2luZG93RHJvcFRhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzdhNmNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZG5kL1dvcmtiZW5jaFdpbmRvd0Ryb3BUYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRuZC5UZXN0RHJvcExvY2F0aW9uOwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdvcmtiZW5jaFdpbmRvd0Ryb3BUYXJnZXQgaW1wbGVtZW50cyBUZXN0RHJvcExvY2F0aW9uIHsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvd1Byb3ZpZGVyIHdpbmRvdzsKLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRvU3RyaW5nKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgUG9pbnQgZ2V0TG9jYXRpb24oKTsKLQotICAgIHB1YmxpYyBXb3JrYmVuY2hXaW5kb3dEcm9wVGFyZ2V0KElXb3JrYmVuY2hXaW5kb3dQcm92aWRlciB3aW5kb3cpIHsKLSAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJV29ya2JlbmNoV2luZG93IGdldFdpbmRvdygpIHsKLSAgICAgICAgcmV0dXJuIHdpbmRvdy5nZXRXb3JrYmVuY2hXaW5kb3coKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gZ2V0V2luZG93KCkuZ2V0U2hlbGwoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFdvcmtiZW5jaFBhZ2UgZ2V0UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIChXb3JrYmVuY2hQYWdlKWdldFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNoZWxsW10gZ2V0U2hlbGxzKCkgewotICAgICAgICByZXR1cm4gbmV3IFNoZWxsW10ge2dldFNoZWxsKCl9OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9BY2NlbGVyYXRvckNvbmZpZ3VyYXRpb25zRXh0ZW5zaW9uRHluYW1pY1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uc0V4dGVuc2lvbkR5bmFtaWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZTc3ODcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9BY2NlbGVyYXRvckNvbmZpZ3VyYXRpb25zRXh0ZW5zaW9uRHluYW1pY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5OYW1lZEhhbmRsZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Ob3REZWZpbmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5JQmluZGluZ1NlcnZpY2U7Ci0KLS8qKgotICogVGVzdHMgd2hldGhlciB0aGUgIm9yZy5lY2xpcHNlLnVpLmFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbnMiIGV4dGVuc2lvbiBwb2ludAotICogY2FuIGJlIGFkZGVkIGFuZCByZW1vdmVkIGR5bmFtaWNhbGx5LgotICogCi0gKiBAc2luY2UgMy4xLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbnNFeHRlbnNpb25EeW5hbWljVGVzdCBleHRlbmRzCi0JCUR5bmFtaWNUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mCi0JICogPGNvZGU+QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uc0V4dGVuc2lvbkR5bmFtaWNUZXN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdGVzdE5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0OyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbnNFeHRlbnNpb25EeW5hbWljVGVzdChmaW5hbCBTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGwtcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiB0byBiZSB0ZXN0ZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgZXh0ZW5zaW9uIGlkZW50aWZpZXI7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0RXh0ZW5zaW9uSWQoKSB7Ci0JCXJldHVybiAiYWNjZWxlcmF0b3JDb25maWd1cmF0aW9uc0V4dGVuc2lvbkR5bmFtaWNUZXN0LnRlc3REeW5hbWljQWNjZWxlcmF0b3JDb25maWd1cmF0aW9uQWRkaXRpb24iOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVucXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCB0byBiZSB0ZXN0ZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgZXh0ZW5zaW9uIHBvaW50IGlkZW50aWZpZXI7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBJV29ya2JlbmNoQ29uc3RhbnRzLlBMX0FDQ0VMRVJBVE9SX0NPTkZJR1VSQVRJT05TOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbGF0aXZlIGxvY2F0aW9uIG9mIHRoZSBmb2xkZXIgb24gZGlzayBjb250YWluaW5nIHRoZQotCSAqIHBsdWdpbi54bWwgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSByZWxhdGl2ZSBpbnN0YWxsIGxvY2F0aW9uOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldEluc3RhbGxMb2NhdGlvbigpIHsKLQkJcmV0dXJuICJkYXRhL29yZy5lY2xpcHNlLmFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbnNFeHRlbnNpb25EeW5hbWljVGVzdCI7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgaXRlbXMgZGVmaW5lZCBpbiB0aGUgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSBhZGRlZCBhbmQKLQkgKiByZW1vdmVkIGR5bmFtaWNhbGx5LiBJdCB0ZXN0cyB0aGF0IHRoZSBkYXRhIGRvZXNuJ3QgZXhpc3QsIGFuZCB0aGVuIGxvYWRzCi0JICogdGhlIGV4dGVuc2lvbi4gSXQgdGVzdHMgdGhhdCB0aGUgZGF0YSB0aGVuIGV4aXN0cywgYW5kIHVubG9hZHMgdGhlCi0JICogZXh0ZW5zaW9uLiBJdCB0ZXN0cyB0aGF0IHRoZSBkYXRhIHRoZW4gZG9lc24ndCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9ucygpIHsKLQkJZmluYWwgSUJpbmRpbmdTZXJ2aWNlIHNlcnZpY2UgPSAoSUJpbmRpbmdTZXJ2aWNlKSBnZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBZGFwdGVyKElCaW5kaW5nU2VydmljZS5jbGFzcyk7Ci0JCU5hbWVkSGFuZGxlT2JqZWN0IG5hbWVkSGFuZGxlT2JqZWN0OwotCi0JCW5hbWVkSGFuZGxlT2JqZWN0ID0gc2VydmljZS5nZXRTY2hlbWUoIm1vbmtleSIpOwotCQl0cnkgewotCQkJbmFtZWRIYW5kbGVPYmplY3QuZ2V0TmFtZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQotCQlnZXRCdW5kbGUoKTsKLQotCQluYW1lZEhhbmRsZU9iamVjdCA9IHNlcnZpY2UuZ2V0U2NoZW1lKCJtb25rZXkiKTsKLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUoIk1vbmtleSIuZXF1YWxzKG5hbWVkSGFuZGxlT2JqZWN0LmdldE5hbWUoKSkpOwotCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoKTsKLQkJfQotCi0JCXJlbW92ZUJ1bmRsZSgpOwotCi0JCW5hbWVkSGFuZGxlT2JqZWN0ID0gc2VydmljZS5nZXRTY2hlbWUoIm1vbmtleSIpOwotCQl0cnkgewotCQkJbmFtZWRIYW5kbGVPYmplY3QuZ2V0TmFtZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0FjY2VsZXJhdG9yU2NvcGVzRXh0ZW5zaW9uRHluYW1pY1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvQWNjZWxlcmF0b3JTY29wZXNFeHRlbnNpb25EeW5hbWljVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWE5N2NjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvQWNjZWxlcmF0b3JTY29wZXNFeHRlbnNpb25EeW5hbWljVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5hbWVkSGFuZGxlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29udGV4dHMuSUNvbnRleHRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci0KLS8qKgotICogVGVzdHMgd2hldGhlciB0aGUgIm9yZy5lY2xpcHNlLnVpLmFjY2VsZXJhdG9yU2NvcGVzIiBleHRlbnNpb24gcG9pbnQgY2FuIGJlCi0gKiBhZGRlZCBhbmQgcmVtb3ZlZCBkeW5hbWljYWxseS4KLSAqIAotICogQHNpbmNlIDMuMS4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBY2NlbGVyYXRvclNjb3Blc0V4dGVuc2lvbkR5bmFtaWNUZXN0IGV4dGVuZHMKLQkJRHluYW1pY1Rlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YKLQkgKiA8Y29kZT5BY2NlbGVyYXRvclNjb3Blc0V4dGVuc2lvbkR5bmFtaWNUZXN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdGVzdE5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0OyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEFjY2VsZXJhdG9yU2NvcGVzRXh0ZW5zaW9uRHluYW1pY1Rlc3QoZmluYWwgU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxsLXF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gdG8gYmUgdGVzdGVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbiBpZGVudGlmaWVyOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldEV4dGVuc2lvbklkKCkgewotCQlyZXR1cm4gImFjY2VsZXJhdG9yU2NvcGVzRXh0ZW5zaW9uRHluYW1pY1Rlc3QudGVzdER5bmFtaWNBY2NlbGVyYXRvclNjb3BlQWRkaXRpb24iOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVucXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCB0byBiZSB0ZXN0ZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgZXh0ZW5zaW9uIHBvaW50IGlkZW50aWZpZXI7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBJV29ya2JlbmNoQ29uc3RhbnRzLlBMX0FDQ0VMRVJBVE9SX1NDT1BFUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBsb2NhdGlvbiBvZiB0aGUgZm9sZGVyIG9uIGRpc2sgY29udGFpbmluZyB0aGUKLQkgKiBwbHVnaW4ueG1sIGZpbGUuCi0JICogCi0JICogQHJldHVybiBUaGUgcmVsYXRpdmUgaW5zdGFsbCBsb2NhdGlvbjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCXJldHVybiAiZGF0YS9vcmcuZWNsaXBzZS5hY2NlbGVyYXRvclNjb3Blc0V4dGVuc2lvbkR5bmFtaWNUZXN0IjsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHRoZSBpdGVtcyBkZWZpbmVkIGluIHRoZSBleHRlbnNpb24gcG9pbnQgY2FuIGJlIGFkZGVkIGFuZAotCSAqIHJlbW92ZWQgZHluYW1pY2FsbHkuIEl0IHRlc3RzIHRoYXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdCwgYW5kIHRoZW4gbG9hZHMKLQkgKiB0aGUgZXh0ZW5zaW9uLiBJdCB0ZXN0cyB0aGF0IHRoZSBkYXRhIHRoZW4gZXhpc3RzLCBhbmQgdW5sb2FkcyB0aGUKLQkgKiBleHRlbnNpb24uIEl0IHRlc3RzIHRoYXQgdGhlIGRhdGEgdGhlbiBkb2Vzbid0IGV4aXN0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RBY2NlbGVyYXRvclNjb3BlcygpIHsKLQkJZmluYWwgSUNvbnRleHRTZXJ2aWNlIHNlcnZpY2UgPSAoSUNvbnRleHRTZXJ2aWNlKSBnZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBZGFwdGVyKElDb250ZXh0U2VydmljZS5jbGFzcyk7Ci0JCU5hbWVkSGFuZGxlT2JqZWN0IG5hbWVkSGFuZGxlT2JqZWN0OwotCi0JCW5hbWVkSGFuZGxlT2JqZWN0ID0gc2VydmljZS5nZXRDb250ZXh0KCJtb25rZXkiKTsKLQkJdHJ5IHsKLQkJCW5hbWVkSGFuZGxlT2JqZWN0LmdldE5hbWUoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoZmluYWwgTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9Ci0KLQkJZ2V0QnVuZGxlKCk7Ci0KLQkJbmFtZWRIYW5kbGVPYmplY3QgPSBzZXJ2aWNlLmdldENvbnRleHQoIm1vbmtleSIpOwotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSgiTW9ua2V5Ii5lcXVhbHMobmFtZWRIYW5kbGVPYmplY3QuZ2V0TmFtZSgpKSk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9Ci0KLQkJcmVtb3ZlQnVuZGxlKCk7Ci0KLQkJbmFtZWRIYW5kbGVPYmplY3QgPSBzZXJ2aWNlLmdldENvbnRleHQoIm1vbmtleSIpOwotCQl0cnkgewotCQkJbmFtZWRIYW5kbGVPYmplY3QuZ2V0TmFtZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0FjdGlvbkRlZmluaXRpb25zRXh0ZW5zaW9uRHluYW1pY1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvQWN0aW9uRGVmaW5pdGlvbnNFeHRlbnNpb25EeW5hbWljVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDI0NDQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvQWN0aW9uRGVmaW5pdGlvbnNFeHRlbnNpb25EeW5hbWljVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5hbWVkSGFuZGxlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSUNvbW1hbmRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci0KLS8qKgotICogVGVzdHMgd2hldGhlciB0aGUgIm9yZy5lY2xpcHNlLnVpLmFjdGlvbkRlZmluaXRpb25zIiBleHRlbnNpb24gcG9pbnQgY2FuIGJlCi0gKiBhZGRlZCBhbmQgcmVtb3ZlZCBkeW5hbWljYWxseS4KLSAqIAotICogQHNpbmNlIDMuMS4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBY3Rpb25EZWZpbml0aW9uc0V4dGVuc2lvbkR5bmFtaWNUZXN0IGV4dGVuZHMKLQkJRHluYW1pY1Rlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YKLQkgKiA8Y29kZT5BY3Rpb25EZWZpbml0aW9uc0V4dGVuc2lvbkR5bmFtaWNUZXN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdGVzdE5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0OyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEFjdGlvbkRlZmluaXRpb25zRXh0ZW5zaW9uRHluYW1pY1Rlc3QoZmluYWwgU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxsLXF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gdG8gYmUgdGVzdGVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbiBpZGVudGlmaWVyOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldEV4dGVuc2lvbklkKCkgewotCQlyZXR1cm4gImFjdGlvbkRlZmluaXRpb25zRXh0ZW5zaW9uRHluYW1pY1Rlc3QudGVzdER5bmFtaWNBY3Rpb25EZWZpbml0aW9uQWRkaXRpb24iOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVucXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCB0byBiZSB0ZXN0ZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgZXh0ZW5zaW9uIHBvaW50IGlkZW50aWZpZXI7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBJV29ya2JlbmNoQ29uc3RhbnRzLlBMX0FDVElPTl9ERUZJTklUSU9OUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBsb2NhdGlvbiBvZiB0aGUgZm9sZGVyIG9uIGRpc2sgY29udGFpbmluZyB0aGUKLQkgKiBwbHVnaW4ueG1sIGZpbGUuCi0JICogCi0JICogQHJldHVybiBUaGUgcmVsYXRpdmUgaW5zdGFsbCBsb2NhdGlvbjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCXJldHVybiAiZGF0YS9vcmcuZWNsaXBzZS5hY3Rpb25EZWZpbml0aW9uc0V4dGVuc2lvbkR5bmFtaWNUZXN0IjsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHRoZSBpdGVtcyBkZWZpbmVkIGluIHRoZSBleHRlbnNpb24gcG9pbnQgY2FuIGJlIGFkZGVkIGFuZAotCSAqIHJlbW92ZWQgZHluYW1pY2FsbHkuIEl0IHRlc3RzIHRoYXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdCwgYW5kIHRoZW4gbG9hZHMKLQkgKiB0aGUgZXh0ZW5zaW9uLiBJdCB0ZXN0cyB0aGF0IHRoZSBkYXRhIHRoZW4gZXhpc3RzLCBhbmQgdW5sb2FkcyB0aGUKLQkgKiBleHRlbnNpb24uIEl0IHRlc3RzIHRoYXQgdGhlIGRhdGEgdGhlbiBkb2Vzbid0IGV4aXN0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RBY3Rpb25EZWZpbml0aW9ucygpIHsKLQkJZmluYWwgSUNvbW1hbmRTZXJ2aWNlIHNlcnZpY2UgPSAoSUNvbW1hbmRTZXJ2aWNlKSBnZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBZGFwdGVyKElDb21tYW5kU2VydmljZS5jbGFzcyk7Ci0JCU5hbWVkSGFuZGxlT2JqZWN0IG5hbWVkSGFuZGxlT2JqZWN0OwotCi0JCW5hbWVkSGFuZGxlT2JqZWN0ID0gc2VydmljZS5nZXRDb21tYW5kKCJtb25rZXkiKTsKLQkJdHJ5IHsKLQkJCW5hbWVkSGFuZGxlT2JqZWN0LmdldE5hbWUoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoZmluYWwgTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9Ci0KLQkJZ2V0QnVuZGxlKCk7Ci0KLQkJbmFtZWRIYW5kbGVPYmplY3QgPSBzZXJ2aWNlLmdldENvbW1hbmQoIm1vbmtleSIpOwotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSgiTW9ua2V5Ii5lcXVhbHMobmFtZWRIYW5kbGVPYmplY3QuZ2V0TmFtZSgpKSk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9Ci0KLQkJcmVtb3ZlQnVuZGxlKCk7Ci0KLQkJbmFtZWRIYW5kbGVPYmplY3QgPSBzZXJ2aWNlLmdldENvbW1hbmQoIm1vbmtleSIpOwotCQl0cnkgewotCQkJbmFtZWRIYW5kbGVPYmplY3QuZ2V0TmFtZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0FjdGlvblNldFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0FjdGlvblNldFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTUxZGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9BY3Rpb25TZXRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlBsdWdpbkFjdGlvblNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5XV2luUGx1Z2luQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuQWN0aW9uU2V0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuSUFjdGlvblNldDsKLQotLyoqCi0gKiBUZXN0cyB0byBlbnN1cmUgdGhlIGFkZGl0aW9uIG9mIG5ldyBhY3Rpb24gc2V0cyB3aXRoIGR5bmFtaWMgcGx1Zy1pbnMuCi0gKi8KLQotcHVibGljIGNsYXNzIEFjdGlvblNldFRlc3RzIGV4dGVuZHMgRHluYW1pY1Rlc3RDYXNlIGltcGxlbWVudHMKLSAgICAgICAgSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfSUQgPSAib3JnLmVjbGlwc2UubmV3QWN0aW9uU2V0MS5uZXdBY3Rpb25TZXQxIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5wYXJ0MSI7Ci0KLSAgICBwdWJsaWMgQWN0aW9uU2V0VGVzdHMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uU2V0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnROdWxsKGdldEFjdGlvblNldFJlZ2lzdHJ5KCkuZmluZEFjdGlvblNldChBQ1RJT05fU0VUX0lEKSk7Ci0gICAgICAgIGdldEJ1bmRsZSgpOwotICAgICAgICBXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gKFdvcmtiZW5jaFdpbmRvdykgb3BlblRlc3RXaW5kb3coKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRBY3Rpb25TZXRSZWdpc3RyeSgpLmZpbmRBY3Rpb25TZXQoQUNUSU9OX1NFVF9JRCkpOwotICAgICAgICBJQWN0aW9uU2V0IFtdIHNldHMgPSB3aW5kb3cuZ2V0QWN0aW9uUHJlc2VudGF0aW9uKCkuZ2V0QWN0aW9uU2V0cygpOwotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIFdXaW5QbHVnaW5BY3Rpb24gYWN0aW9uID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKChQbHVnaW5BY3Rpb25TZXQpc2V0c1tpXSkuZ2V0RGVzYygpLmdldElkKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5uZXdBY3Rpb25TZXQxLm5ld0FjdGlvblNldDIiKSkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBJQWN0aW9uIFtdIHBsdWdpbkFjdGlvbnMgPSAoKFBsdWdpbkFjdGlvblNldClzZXRzW2ldKS5nZXRQbHVnaW5BY3Rpb25zKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwbHVnaW5BY3Rpb25zLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW5BY3Rpb25zW2pdLmdldElkKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51aS50ZXN0cy5hY3Rpb24xIikpCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAoV1dpblBsdWdpbkFjdGlvbikgcGx1Z2luQWN0aW9uc1tqXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQWN0aW9uIHNldCBub3QgZm91bmQiLCBmb3VuZCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkFjdGlvbiBub3QgZm91bmQiLCBhY3Rpb24pOwotLy8gICAgICAgIFJlZmVyZW5jZVF1ZXVlIHF1ZXVlID0gbmV3IFJlZmVyZW5jZVF1ZXVlKCk7Ci0vLyAgICAgICAgV2Vha1JlZmVyZW5jZSByZWYgPSBuZXcgV2Vha1JlZmVyZW5jZShhY3Rpb24sIHF1ZXVlKTsKLS8vICAgICAgICBhY3Rpb24gPSBudWxsOwotICAgICAgICByZW1vdmVCdW5kbGUoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwod2luZG93LmdldEFjdGlvbkJhcnMoKS5nZXRNZW51TWFuYWdlcigpLmZpbmRNZW51VXNpbmdQYXRoKCJtZW51MSIpKTsKLS8vICAgICAgICBMZWFrVGVzdHMuY2hlY2tSZWYocXVldWUsIHJlZik7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKGdldEFjdGlvblNldFJlZ2lzdHJ5KCkuZmluZEFjdGlvblNldChBQ1RJT05fU0VUX0lEKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgQWN0aW9uU2V0UmVnaXN0cnkgZ2V0QWN0aW9uU2V0UmVnaXN0cnkoKSB7Ci0gICAgICAgIHJldHVybiBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEFjdGlvblNldFJlZ2lzdHJ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBnZXRBY3Rpb25TZXRSZWdpc3RyeSgpLmdldEFjdGlvblNldHNGb3IoUEFSVF9JRCkubGVuZ3RoKTsKLSAgICAgICAgZ2V0QnVuZGxlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBnZXRBY3Rpb25TZXRSZWdpc3RyeSgpLmdldEFjdGlvblNldHNGb3IoUEFSVF9JRCkubGVuZ3RoKTsKLSAgICAgICAgcmVtb3ZlQnVuZGxlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBnZXRBY3Rpb25TZXRSZWdpc3RyeSgpLmdldEFjdGlvblNldHNGb3IoUEFSVF9JRCkubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRFeHRlbnNpb25JZCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb25JZCgpIHsKLSAgICAgICAgcmV0dXJuICJuZXdBY3Rpb25TZXQxLnRlc3REeW5hbWljQWN0aW9uU2V0QWRkaXRpb24iOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEV4dGVuc2lvblBvaW50KCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvblBvaW50KCkgewotICAgICAgICByZXR1cm4gSVdvcmtiZW5jaENvbnN0YW50cy5QTF9BQ1RJT05fU0VUUzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRJbnN0YWxsTG9jYXRpb24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW5zdGFsbExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gImRhdGEvb3JnLmVjbGlwc2UubmV3QWN0aW9uU2V0MSI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9BY3Rpdml0eVN1cHBvcnRUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9BY3Rpdml0eVN1cHBvcnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjdjNTUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvQWN0aXZpdHlTdXBwb3J0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkltYWdlVGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVN1cHBvcnRUZXN0cyBleHRlbmRzIER5bmFtaWNUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlTdXBwb3J0VGVzdHMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbklkKCkgewotCQlyZXR1cm4gIm5ld0FjdGl2aXR5U3VwcG9ydDEudGVzdE5ld0FjdGl2aXR5U3VwcG9ydEFkZGl0aW9uIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvblBvaW50KCkgewotCQlyZXR1cm4gSVdvcmtiZW5jaENvbnN0YW50cy5QTF9BQ1RJVklUWVNVUFBPUlQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCXJldHVybiAiZGF0YS9vcmcuZWNsaXBzZS5uZXdBY3Rpdml0eVN1cHBvcnQxIjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlJbWFnZXMoKSB7Ci0JCUlBY3Rpdml0eSBiYXNlbGluZUFjdGl2aXR5ID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkKLQkJCQkuZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0QWN0aXZpdHkoInNvbWVCb2d1c0FjdGl2aXR5SWQiKTsKLQkJYXNzZXJ0Tm90TnVsbChiYXNlbGluZUFjdGl2aXR5KTsKLQkJYXNzZXJ0RmFsc2UoYmFzZWxpbmVBY3Rpdml0eS5pc0RlZmluZWQoKSk7Ci0KLQkJSUFjdGl2aXR5IGFjdGl2aXR5V2l0aEljb24gPSBnZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKQotCQkJCS5nZXRBY3Rpdml0eU1hbmFnZXIoKS5nZXRBY3Rpdml0eSgib3JnLmVjbGlwc2UuYWN0aXZpdHkyIik7Ci0JCWFzc2VydE5vdE51bGwoYWN0aXZpdHlXaXRoSWNvbik7Ci0JCWFzc2VydFRydWUoYWN0aXZpdHlXaXRoSWNvbi5pc0RlZmluZWQoKSk7Ci0KLQkJSW1hZ2VEZXNjcmlwdG9yIGJhc2VsaW5lRGVzY3JpcHRvciA9IGdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2aXR5U3VwcG9ydCgpLmdldEltYWdlRGVzY3JpcHRvcihiYXNlbGluZUFjdGl2aXR5KTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGN1c3RvbURlc2NyaXB0b3IgPSBnZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKQotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoYWN0aXZpdHlXaXRoSWNvbik7Ci0KLQkJSW1hZ2UgYmFzZWxpbmVJbWFnZSA9IG51bGwsIGN1c3RvbUltYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJhc2VsaW5lSW1hZ2UgPSBiYXNlbGluZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJCWFzc2VydE5vdE51bGwoYmFzZWxpbmVJbWFnZSk7Ci0JCQljdXN0b21JbWFnZSA9IGN1c3RvbURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJCWFzc2VydE5vdE51bGwoY3VzdG9tSW1hZ2UpOwotCi0JCQkvLyBlbnN1cmUgdGhhdCB0aGUgaW1hZ2VzIGFyZSB0aGUgc2FtZSBiZWZvcmUgbG9hZGluZyB0aGUgcGx1Z2luCi0JCQlJbWFnZVRlc3RzLmFzc2VydEVxdWFscyhiYXNlbGluZUltYWdlLCBjdXN0b21JbWFnZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYmFzZWxpbmVJbWFnZSAhPSBudWxsKQotCQkJCWJhc2VsaW5lSW1hZ2UuZGlzcG9zZSgpOwotCQkJaWYgKGN1c3RvbUltYWdlICE9IG51bGwpCi0JCQkJY3VzdG9tSW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0KLQkJZ2V0QnVuZGxlKCk7Ci0KLQkJYmFzZWxpbmVEZXNjcmlwdG9yID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGJhc2VsaW5lQWN0aXZpdHkpOwotCQljdXN0b21EZXNjcmlwdG9yID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGFjdGl2aXR5V2l0aEljb24pOwotCi0JCXRyeSB7Ci0JCQliYXNlbGluZUltYWdlID0gYmFzZWxpbmVEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGJhc2VsaW5lSW1hZ2UpOwotCQkJY3VzdG9tSW1hZ2UgPSBjdXN0b21EZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGN1c3RvbUltYWdlKTsKLQotCQkJLy8gZW5zdXJlIHRoYXQgdGhlIGltYWdlcyBhcmUgZGlmZmVybnQgYWZ0ZXIgbG9hZGluZyB0aGUgcGx1Z2luCi0JCQlJbWFnZVRlc3RzLmFzc2VydE5vdEVxdWFscyhiYXNlbGluZUltYWdlLCBjdXN0b21JbWFnZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYmFzZWxpbmVJbWFnZSAhPSBudWxsKQotCQkJCWJhc2VsaW5lSW1hZ2UuZGlzcG9zZSgpOwotCQkJaWYgKGN1c3RvbUltYWdlICE9IG51bGwpCi0JCQkJY3VzdG9tSW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmVtb3ZlQnVuZGxlKCk7Ci0KLQkJYmFzZWxpbmVEZXNjcmlwdG9yID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGJhc2VsaW5lQWN0aXZpdHkpOwotCQljdXN0b21EZXNjcmlwdG9yID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGFjdGl2aXR5V2l0aEljb24pOwotCi0JCXRyeSB7Ci0JCQliYXNlbGluZUltYWdlID0gYmFzZWxpbmVEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGJhc2VsaW5lSW1hZ2UpOwotCQkJY3VzdG9tSW1hZ2UgPSBjdXN0b21EZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGN1c3RvbUltYWdlKTsKLQotCQkJLy8gZW5zdXJlIHRoYXQgdGhlIGltYWdlcyBhcmUgdGhlIHNhbWUgYWZ0ZXIgdW5sb2FkaW5nIHRoZSBwbHVnaW4KLQkJCUltYWdlVGVzdHMuYXNzZXJ0RXF1YWxzKGJhc2VsaW5lSW1hZ2UsIGN1c3RvbUltYWdlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChiYXNlbGluZUltYWdlICE9IG51bGwpCi0JCQkJYmFzZWxpbmVJbWFnZS5kaXNwb3NlKCk7Ci0JCQlpZiAoY3VzdG9tSW1hZ2UgIT0gbnVsbCkKLQkJCQljdXN0b21JbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlJbWFnZXMoKSB7Ci0JCUlDYXRlZ29yeSBiYXNlbGluZUNhdGVnb3J5ID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkKLQkJCQkuZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0Q2F0ZWdvcnkoInNvbWVCb2d1c0NhdGVnb3J5SWQiKTsKLQkJYXNzZXJ0Tm90TnVsbChiYXNlbGluZUNhdGVnb3J5KTsKLQkJYXNzZXJ0RmFsc2UoYmFzZWxpbmVDYXRlZ29yeS5pc0RlZmluZWQoKSk7Ci0KLQkJSUNhdGVnb3J5IGNhdGVnb3J5V2l0aEljb24gPSBnZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKQotCQkJCS5nZXRBY3Rpdml0eU1hbmFnZXIoKS5nZXRDYXRlZ29yeSgib3JnLmVjbGlwc2UuY2F0ZWdvcnkyIik7Ci0JCWFzc2VydE5vdE51bGwoY2F0ZWdvcnlXaXRoSWNvbik7Ci0JCWFzc2VydFRydWUoY2F0ZWdvcnlXaXRoSWNvbi5pc0RlZmluZWQoKSk7Ci0KLQkJSW1hZ2VEZXNjcmlwdG9yIGJhc2VsaW5lRGVzY3JpcHRvciA9IGdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2aXR5U3VwcG9ydCgpLmdldEltYWdlRGVzY3JpcHRvcihiYXNlbGluZUNhdGVnb3J5KTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGN1c3RvbURlc2NyaXB0b3IgPSBnZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKQotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoY2F0ZWdvcnlXaXRoSWNvbik7Ci0KLQkJSW1hZ2UgYmFzZWxpbmVJbWFnZSA9IG51bGwsIGN1c3RvbUltYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJhc2VsaW5lSW1hZ2UgPSBiYXNlbGluZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJCWFzc2VydE5vdE51bGwoYmFzZWxpbmVJbWFnZSk7Ci0JCQljdXN0b21JbWFnZSA9IGN1c3RvbURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJCWFzc2VydE5vdE51bGwoY3VzdG9tSW1hZ2UpOwotCi0JCQkvLyBlbnN1cmUgdGhhdCB0aGUgaW1hZ2VzIGFyZSB0aGUgc2FtZSBiZWZvcmUgbG9hZGluZyB0aGUgcGx1Z2luCi0JCQlJbWFnZVRlc3RzLmFzc2VydEVxdWFscyhiYXNlbGluZUltYWdlLCBjdXN0b21JbWFnZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYmFzZWxpbmVJbWFnZSAhPSBudWxsKQotCQkJCWJhc2VsaW5lSW1hZ2UuZGlzcG9zZSgpOwotCQkJaWYgKGN1c3RvbUltYWdlICE9IG51bGwpCi0JCQkJY3VzdG9tSW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0KLQkJZ2V0QnVuZGxlKCk7Ci0KLQkJYmFzZWxpbmVEZXNjcmlwdG9yID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGJhc2VsaW5lQ2F0ZWdvcnkpOwotCQljdXN0b21EZXNjcmlwdG9yID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNhdGVnb3J5V2l0aEljb24pOwotCi0JCXRyeSB7Ci0JCQliYXNlbGluZUltYWdlID0gYmFzZWxpbmVEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGJhc2VsaW5lSW1hZ2UpOwotCQkJY3VzdG9tSW1hZ2UgPSBjdXN0b21EZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGN1c3RvbUltYWdlKTsKLQotCQkJLy8gZW5zdXJlIHRoYXQgdGhlIGltYWdlcyBhcmUgZGlmZmVybnQgYWZ0ZXIgbG9hZGluZyB0aGUgcGx1Z2luCi0JCQlJbWFnZVRlc3RzLmFzc2VydE5vdEVxdWFscyhiYXNlbGluZUltYWdlLCBjdXN0b21JbWFnZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYmFzZWxpbmVJbWFnZSAhPSBudWxsKQotCQkJCWJhc2VsaW5lSW1hZ2UuZGlzcG9zZSgpOwotCQkJaWYgKGN1c3RvbUltYWdlICE9IG51bGwpCi0JCQkJY3VzdG9tSW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmVtb3ZlQnVuZGxlKCk7Ci0KLQkJYmFzZWxpbmVEZXNjcmlwdG9yID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGJhc2VsaW5lQ2F0ZWdvcnkpOwotCQljdXN0b21EZXNjcmlwdG9yID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNhdGVnb3J5V2l0aEljb24pOwotCi0JCXRyeSB7Ci0JCQliYXNlbGluZUltYWdlID0gYmFzZWxpbmVEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGJhc2VsaW5lSW1hZ2UpOwotCQkJY3VzdG9tSW1hZ2UgPSBjdXN0b21EZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGN1c3RvbUltYWdlKTsKLQotCQkJLy8gZW5zdXJlIHRoYXQgdGhlIGltYWdlcyBhcmUgdGhlIHNhbWUgYWZ0ZXIgdW5sb2FkaW5nIHRoZSBwbHVnaW4KLQkJCUltYWdlVGVzdHMuYXNzZXJ0RXF1YWxzKGJhc2VsaW5lSW1hZ2UsIGN1c3RvbUltYWdlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChiYXNlbGluZUltYWdlICE9IG51bGwpCi0JCQkJYmFzZWxpbmVJbWFnZS5kaXNwb3NlKCk7Ci0JCQlpZiAoY3VzdG9tSW1hZ2UgIT0gbnVsbCkKLQkJCQljdXN0b21JbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvQmluZGluZ3NFeHRlbnNpb25EeW5hbWljVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9CaW5kaW5nc0V4dGVuc2lvbkR5bmFtaWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDQ2NTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9CaW5kaW5nc0V4dGVuc2lvbkR5bmFtaWNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uTm90RGVmaW5lZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmNvbnRleHRzLklDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5JQmluZGluZ1NlcnZpY2U7Ci0KLS8qKgotICogVGVzdHMgd2hldGhlciB0aGUgIm9yZy5lY2xpcHNlLnVpLmJpbmRpbmdzIiBleHRlbnNpb24gcG9pbnQgY2FuIGJlIGFkZGVkIGFuZAotICogcmVtb3ZlZCBkeW5hbWljYWxseS4KLSAqIAotICogQHNpbmNlIDMuMS4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5kaW5nc0V4dGVuc2lvbkR5bmFtaWNUZXN0IGV4dGVuZHMgRHluYW1pY1Rlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+QmluZGluZ3NFeHRlbnNpb25EeW5hbWljVGVzdDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHRlc3ROYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBCaW5kaW5nc0V4dGVuc2lvbkR5bmFtaWNUZXN0KGZpbmFsIFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbC1xdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIHRvIGJlIHRlc3RlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24gaWRlbnRpZmllcjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRFeHRlbnNpb25JZCgpIHsKLQkJcmV0dXJuICJiaW5kaW5nc0V4dGVuc2lvbkR5bmFtaWNUZXN0LnRlc3REeW5hbWljQmluZGluZ0FkZGl0aW9uIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1bnF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgdG8gYmUgdGVzdGVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbiBwb2ludCBpZGVudGlmaWVyOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldEV4dGVuc2lvblBvaW50KCkgewotCQlyZXR1cm4gSVdvcmtiZW5jaENvbnN0YW50cy5QTF9CSU5ESU5HUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBsb2NhdGlvbiBvZiB0aGUgZm9sZGVyIG9uIGRpc2sgY29udGFpbmluZyB0aGUKLQkgKiBwbHVnaW4ueG1sIGZpbGUuCi0JICogCi0JICogQHJldHVybiBUaGUgcmVsYXRpdmUgaW5zdGFsbCBsb2NhdGlvbjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCXJldHVybiAiZGF0YS9vcmcuZWNsaXBzZS5iaW5kaW5nc0V4dGVuc2lvbkR5bmFtaWNUZXN0IjsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHRoZSBpdGVtcyBkZWZpbmVkIGluIHRoZSBleHRlbnNpb24gcG9pbnQgY2FuIGJlIGFkZGVkIGFuZAotCSAqIHJlbW92ZWQgZHluYW1pY2FsbHkuIEl0IHRlc3RzIHRoYXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdCwgYW5kIHRoZW4gbG9hZHMKLQkgKiB0aGUgZXh0ZW5zaW9uLiBJdCB0ZXN0cyB0aGF0IHRoZSBkYXRhIHRoZW4gZXhpc3RzLCBhbmQgdW5sb2FkcyB0aGUKLQkgKiBleHRlbnNpb24uIEl0IHRlc3RzIHRoYXQgdGhlIGRhdGEgdGhlbiBkb2Vzbid0IGV4aXN0LgotCSAqIAotCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiAiTTErVyIgY2FuJ3QgYmUgcGFyc2VkIGJ5IHRoZSBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEJpbmRpbmdzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLQkJZmluYWwgSUJpbmRpbmdTZXJ2aWNlIGJpbmRpbmdTZXJ2aWNlID0gKElCaW5kaW5nU2VydmljZSkgZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWRhcHRlcihJQmluZGluZ1NlcnZpY2UuY2xhc3MpOwotCQlmaW5hbCBUcmlnZ2VyU2VxdWVuY2UgdHJpZ2dlclNlcXVlbmNlID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2UoIk0xK1ciKTsKLQkJQmluZGluZ1tdIGJpbmRpbmdzOwotCQlTY2hlbWUgc2NoZW1lOwotCQlib29sZWFuIGZvdW5kOwotCi0JCWZvdW5kID0gZmFsc2U7Ci0JCWJpbmRpbmdzID0gYmluZGluZ1NlcnZpY2UuZ2V0QmluZGluZ3MoKTsKLQkJaWYgKGJpbmRpbmdzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcgPSBiaW5kaW5nc1tpXTsKLQkJCQlpZiAoIm1vbmtleSIuZXF1YWxzKGJpbmRpbmcuZ2V0U2NoZW1lSWQoKSkKLQkJCQkJCSYmIElDb250ZXh0SWRzLkNPTlRFWFRfSURfV0lORE9XLmVxdWFscyhiaW5kaW5nCi0JCQkJCQkJCS5nZXRDb250ZXh0SWQoKSkKLQkJCQkJCSYmICJvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93VmlldyIuZXF1YWxzKGJpbmRpbmcKLQkJCQkJCQkJLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCkuZ2V0SWQoKSkKLQkJCQkJCSYmIGJpbmRpbmcuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKS5nZXRQYXJhbWV0ZXJNYXAoKQotCQkJCQkJCQkuY29udGFpbnNLZXkoCi0JCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnZpZXdzLnNob3dWaWV3LnZpZXdJZCIpCi0JCQkJCQkmJiBiaW5kaW5nLmdldFBsYXRmb3JtKCkgPT0gbnVsbAotCQkJCQkJJiYgYmluZGluZy5nZXRMb2NhbGUoKSA9PSBudWxsCi0JCQkJCQkmJiBiaW5kaW5nLmdldFR5cGUoKSA9PSBCaW5kaW5nLlNZU1RFTQotCQkJCQkJJiYgdHJpZ2dlclNlcXVlbmNlLmVxdWFscyhiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSghZm91bmQpOwotCQlzY2hlbWUgPSBiaW5kaW5nU2VydmljZS5nZXRTY2hlbWUoIm1vbmtleSIpOwotCQl0cnkgewotCQkJc2NoZW1lLmdldE5hbWUoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoZmluYWwgTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9Ci0KLQkJZ2V0QnVuZGxlKCk7Ci0KLQkJZm91bmQgPSBmYWxzZTsKLQkJYmluZGluZ3MgPSBiaW5kaW5nU2VydmljZS5nZXRCaW5kaW5ncygpOwotCQlpZiAoYmluZGluZ3MgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIEJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdzW2ldOwotCQkJCWlmICgibW9ua2V5Ii5lcXVhbHMoYmluZGluZy5nZXRTY2hlbWVJZCgpKQotCQkJCQkJJiYgSUNvbnRleHRJZHMuQ09OVEVYVF9JRF9XSU5ET1cuZXF1YWxzKGJpbmRpbmcKLQkJCQkJCQkJLmdldENvbnRleHRJZCgpKQotCQkJCQkJJiYgIm9yZy5lY2xpcHNlLnVpLnZpZXdzLnNob3dWaWV3Ii5lcXVhbHMoYmluZGluZwotCQkJCQkJCQkuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKS5nZXRJZCgpKQotCQkJCQkJJiYgYmluZGluZy5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpLmdldFBhcmFtZXRlck1hcCgpCi0JCQkJCQkJCS5jb250YWluc0tleSgKLQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3Muc2hvd1ZpZXcudmlld0lkIikKLQkJCQkJCSYmIGJpbmRpbmcuZ2V0UGxhdGZvcm0oKSA9PSBudWxsCi0JCQkJCQkmJiBiaW5kaW5nLmdldExvY2FsZSgpID09IG51bGwKLQkJCQkJCSYmIGJpbmRpbmcuZ2V0VHlwZSgpID09IEJpbmRpbmcuU1lTVEVNCi0JCQkJCQkmJiB0cmlnZ2VyU2VxdWVuY2UuZXF1YWxzKGJpbmRpbmcuZ2V0VHJpZ2dlclNlcXVlbmNlKCkpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGZvdW5kKTsKLQkJc2NoZW1lID0gYmluZGluZ1NlcnZpY2UuZ2V0U2NoZW1lKCJtb25rZXkiKTsKLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUoIk1vbmtleSIuZXF1YWxzKHNjaGVtZS5nZXROYW1lKCkpKTsKLQkJfSBjYXRjaCAoZmluYWwgTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQotCQlyZW1vdmVCdW5kbGUoKTsKLQotCQlmb3VuZCA9IGZhbHNlOwotCQliaW5kaW5ncyA9IGJpbmRpbmdTZXJ2aWNlLmdldEJpbmRpbmdzKCk7Ci0JCWlmIChiaW5kaW5ncyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgQmluZGluZyBiaW5kaW5nID0gYmluZGluZ3NbaV07Ci0JCQkJaWYgKCJtb25rZXkiLmVxdWFscyhiaW5kaW5nLmdldFNjaGVtZUlkKCkpCi0JCQkJCQkmJiBJQ29udGV4dElkcy5DT05URVhUX0lEX1dJTkRPVy5lcXVhbHMoYmluZGluZwotCQkJCQkJCQkuZ2V0Q29udGV4dElkKCkpCi0JCQkJCQkmJiAib3JnLmVjbGlwc2UudWkudmlld3Muc2hvd1ZpZXciLmVxdWFscyhiaW5kaW5nCi0JCQkJCQkJCS5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpLmdldElkKCkpCi0JCQkJCQkmJiBiaW5kaW5nLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCkuZ2V0UGFyYW1ldGVyTWFwKCkKLQkJCQkJCQkJLmNvbnRhaW5zS2V5KAotCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93Vmlldy52aWV3SWQiKQotCQkJCQkJJiYgYmluZGluZy5nZXRQbGF0Zm9ybSgpID09IG51bGwKLQkJCQkJCSYmIGJpbmRpbmcuZ2V0TG9jYWxlKCkgPT0gbnVsbAotCQkJCQkJJiYgYmluZGluZy5nZXRUeXBlKCkgPT0gQmluZGluZy5TWVNURU0KLQkJCQkJCSYmIHRyaWdnZXJTZXF1ZW5jZS5lcXVhbHMoYmluZGluZy5nZXRUcmlnZ2VyU2VxdWVuY2UoKSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCi0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIWZvdW5kKTsKLQkJc2NoZW1lID0gYmluZGluZ1NlcnZpY2UuZ2V0U2NoZW1lKCJtb25rZXkiKTsKLQkJdHJ5IHsKLQkJCXNjaGVtZS5nZXROYW1lKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvQnJvd3NlclRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0Jyb3dzZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzkyYzExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvQnJvd3NlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlclRlc3RzIGV4dGVuZHMgRHluYW1pY1Rlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBCcm93c2VyVGVzdHMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnJvd3NlclN1cHBvcnQoKSB7Ci0gICAgICAgIFdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IHN1cHBvcnQgPSAoV29ya2JlbmNoQnJvd3NlclN1cHBvcnQpIFdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdXBwb3J0LnNldERlc2lyZWRCcm93c2VyU3VwcG9ydElkKGdldEV4dGVuc2lvbklkKCkpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3VwcG9ydC5oYXNOb25EZWZhdWx0QnJvd3NlcigpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ2V0QnVuZGxlKCk7Ci0gICAgICAgICAgICBzdXBwb3J0LnNldERlc2lyZWRCcm93c2VyU3VwcG9ydElkKGdldEV4dGVuc2lvbklkKCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdXBwb3J0Lmhhc05vbkRlZmF1bHRCcm93c2VyKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZW1vdmVCdW5kbGUoKTsKLSAgICAgICAgICAgIHN1cHBvcnQuc2V0RGVzaXJlZEJyb3dzZXJTdXBwb3J0SWQoZ2V0RXh0ZW5zaW9uSWQoKSk7ICAgIAotICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3VwcG9ydC5oYXNOb25EZWZhdWx0QnJvd3NlcigpKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIHN1cHBvcnQuc2V0RGVzaXJlZEJyb3dzZXJTdXBwb3J0SWQobnVsbCk7ICAgIAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRFeHRlbnNpb25JZCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb25JZCgpIHsKLSAgICAgICAgcmV0dXJuICJuZXdCcm93c2VyMS50ZXN0RHluYW1pY0Jyb3dzZXJBZGRpdGlvbiI7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEV4dGVuc2lvblBvaW50KCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvblBvaW50KCkgewotICAgICAgICByZXR1cm4gSVdvcmtiZW5jaENvbnN0YW50cy5QTF9CUk9XU0VSX1NVUFBPUlQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEluc3RhbGxMb2NhdGlvbigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiZGF0YS9vcmcuZWNsaXBzZS5uZXdCcm93c2VyMSI7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRNYXJrZXJDbGFzcygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuICJvcmcuZWNsaXBzZS51aS5keW5hbWljLkR5bmFtaWNCcm93c2VyU3VwcG9ydCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0NvbW1hbmRzRXh0ZW5zaW9uRHluYW1pY1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvQ29tbWFuZHNFeHRlbnNpb25EeW5hbWljVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDg1MTdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvQ29tbWFuZHNFeHRlbnNpb25EeW5hbWljVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuTm90SGFuZGxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5OYW1lZEhhbmRsZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Ob3REZWZpbmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuVHJpZ2dlclNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5jb250ZXh0cy5JQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JQ29tbWFuZFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29udGV4dHMuSUNvbnRleHRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5JQmluZGluZ1NlcnZpY2U7Ci0KLS8qKgotICogVGVzdHMgd2hldGhlciB0aGUgIm9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIiBleHRlbnNpb24gcG9pbnQgY2FuIGJlIGFkZGVkIGFuZAotICogcmVtb3ZlZCBkeW5hbWljYWxseS4KLSAqIAotICogQHNpbmNlIDMuMS4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tYW5kc0V4dGVuc2lvbkR5bmFtaWNUZXN0IGV4dGVuZHMgRHluYW1pY1Rlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+Q29tbWFuZHNFeHRlbnNpb25EeW5hbWljVGVzdDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHRlc3ROYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDb21tYW5kc0V4dGVuc2lvbkR5bmFtaWNUZXN0KGZpbmFsIFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbC1xdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIHRvIGJlIHRlc3RlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24gaWRlbnRpZmllcjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRFeHRlbnNpb25JZCgpIHsKLQkJcmV0dXJuICJjb21tYW5kc0V4dGVuc2lvbkR5bmFtaWNUZXN0LnRlc3REeW5hbWljQ29tbWFuZEFkZGl0aW9uIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1bnF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgdG8gYmUgdGVzdGVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbiBwb2ludCBpZGVudGlmaWVyOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldEV4dGVuc2lvblBvaW50KCkgewotCQlyZXR1cm4gSVdvcmtiZW5jaENvbnN0YW50cy5QTF9DT01NQU5EUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBsb2NhdGlvbiBvZiB0aGUgZm9sZGVyIG9uIGRpc2sgY29udGFpbmluZyB0aGUKLQkgKiBwbHVnaW4ueG1sIGZpbGUuCi0JICogCi0JICogQHJldHVybiBUaGUgcmVsYXRpdmUgaW5zdGFsbCBsb2NhdGlvbjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCXJldHVybiAiZGF0YS9vcmcuZWNsaXBzZS5jb21tYW5kc0V4dGVuc2lvbkR5bmFtaWNUZXN0IjsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHRoZSBpdGVtcyBkZWZpbmVkIGluIHRoZSBleHRlbnNpb24gcG9pbnQgY2FuIGJlIGFkZGVkIGFuZAotCSAqIHJlbW92ZWQgZHluYW1pY2FsbHkuIEl0IHRlc3RzIHRoYXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdCwgYW5kIHRoZW4gbG9hZHMKLQkgKiB0aGUgZXh0ZW5zaW9uLiBJdCB0ZXN0cyB0aGF0IHRoZSBkYXRhIHRoZW4gZXhpc3RzLCBhbmQgdW5sb2FkcyB0aGUKLQkgKiBleHRlbnNpb24uIEl0IHRlc3RzIHRoYXQgdGhlIGRhdGEgdGhlbiBkb2Vzbid0IGV4aXN0LgotCSAqIAotCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiAiTTErVyIgY2FuJ3QgYmUgcGFyc2VkIGJ5IHRoZSBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdENvbW1hbmRzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLQkJZmluYWwgSUJpbmRpbmdTZXJ2aWNlIGJpbmRpbmdTZXJ2aWNlID0gKElCaW5kaW5nU2VydmljZSkgZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWRhcHRlcihJQmluZGluZ1NlcnZpY2UuY2xhc3MpOwotCQlmaW5hbCBJQ29tbWFuZFNlcnZpY2UgY29tbWFuZFNlcnZpY2UgPSAoSUNvbW1hbmRTZXJ2aWNlKSBnZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBZGFwdGVyKElDb21tYW5kU2VydmljZS5jbGFzcyk7Ci0JCWZpbmFsIElDb250ZXh0U2VydmljZSBjb250ZXh0U2VydmljZSA9IChJQ29udGV4dFNlcnZpY2UpIGdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFkYXB0ZXIoSUNvbnRleHRTZXJ2aWNlLmNsYXNzKTsKLQkJZmluYWwgVHJpZ2dlclNlcXVlbmNlIHRyaWdnZXJTZXF1ZW5jZSA9IEtleVNlcXVlbmNlLmdldEluc3RhbmNlKCJNMStXIik7Ci0JCU5hbWVkSGFuZGxlT2JqZWN0IG5hbWVkSGFuZGxlT2JqZWN0OwotCQlCaW5kaW5nW10gYmluZGluZ3M7Ci0JCUNvbW1hbmQgY29tbWFuZDsKLQkJYm9vbGVhbiBmb3VuZDsKLQotCQlhc3NlcnRUcnVlKCEibW9ua2V5Ii5lcXVhbHMoYmluZGluZ1NlcnZpY2UuZ2V0QWN0aXZlU2NoZW1lKCkuZ2V0SWQoKSkpOwotCQlmb3VuZCA9IGZhbHNlOwotCQliaW5kaW5ncyA9IGJpbmRpbmdTZXJ2aWNlLmdldEJpbmRpbmdzKCk7Ci0JCWlmIChiaW5kaW5ncyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgQmluZGluZyBiaW5kaW5nID0gYmluZGluZ3NbaV07Ci0JCQkJaWYgKCJtb25rZXkiLmVxdWFscyhiaW5kaW5nLmdldFNjaGVtZUlkKCkpCi0JCQkJCQkmJiBJQ29udGV4dElkcy5DT05URVhUX0lEX1dJTkRPVy5lcXVhbHMoYmluZGluZwotCQkJCQkJCQkuZ2V0Q29udGV4dElkKCkpCi0JCQkJCQkmJiAibW9ua2V5Ii5lcXVhbHMoYmluZGluZy5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpCi0JCQkJCQkJCS5nZXRJZCgpKSAmJiBiaW5kaW5nLmdldFBsYXRmb3JtKCkgPT0gbnVsbAotCQkJCQkJJiYgYmluZGluZy5nZXRMb2NhbGUoKSA9PSBudWxsCi0JCQkJCQkmJiBiaW5kaW5nLmdldFR5cGUoKSA9PSBCaW5kaW5nLlNZU1RFTQotCQkJCQkJJiYgdHJpZ2dlclNlcXVlbmNlLmVxdWFscyhiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSghZm91bmQpOwotCQluYW1lZEhhbmRsZU9iamVjdCA9IGJpbmRpbmdTZXJ2aWNlLmdldFNjaGVtZSgibW9ua2V5Iik7Ci0JCXRyeSB7Ci0JCQluYW1lZEhhbmRsZU9iamVjdC5nZXROYW1lKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCQluYW1lZEhhbmRsZU9iamVjdCA9IGNvbW1hbmRTZXJ2aWNlLmdldENhdGVnb3J5KCJtb25rZXkiKTsKLQkJdHJ5IHsKLQkJCW5hbWVkSGFuZGxlT2JqZWN0LmdldE5hbWUoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoZmluYWwgTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9Ci0JCWNvbW1hbmQgPSBjb21tYW5kU2VydmljZS5nZXRDb21tYW5kKCJtb25rZXkiKTsKLQkJdHJ5IHsKLQkJCWNvbW1hbmQuZXhlY3V0ZShuZXcgRXhlY3V0aW9uRXZlbnQoKSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdEhhbmRsZWRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCQl0cnkgewotCQkJY29tbWFuZC5nZXROYW1lKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCQluYW1lZEhhbmRsZU9iamVjdCA9IGNvbnRleHRTZXJ2aWNlLmdldENvbnRleHQoImNvbnRleHQiKTsKLQkJdHJ5IHsKLQkJCW5hbWVkSGFuZGxlT2JqZWN0LmdldE5hbWUoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoZmluYWwgTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9Ci0JCW5hbWVkSGFuZGxlT2JqZWN0ID0gY29udGV4dFNlcnZpY2UuZ2V0Q29udGV4dCgic2NvcGUiKTsKLQkJdHJ5IHsKLQkJCW5hbWVkSGFuZGxlT2JqZWN0LmdldE5hbWUoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoZmluYWwgTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9Ci0KLQkJZ2V0QnVuZGxlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgibW9ua2V5Ii5lcXVhbHMoYmluZGluZ1NlcnZpY2UuZ2V0QWN0aXZlU2NoZW1lKCkuZ2V0SWQoKSkpOwotCQlmb3VuZCA9IGZhbHNlOwotCQliaW5kaW5ncyA9IGJpbmRpbmdTZXJ2aWNlLmdldEJpbmRpbmdzKCk7Ci0JCWlmIChiaW5kaW5ncyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgQmluZGluZyBiaW5kaW5nID0gYmluZGluZ3NbaV07Ci0JCQkJaWYgKCJtb25rZXkiLmVxdWFscyhiaW5kaW5nLmdldFNjaGVtZUlkKCkpCi0JCQkJCQkmJiBJQ29udGV4dElkcy5DT05URVhUX0lEX1dJTkRPVy5lcXVhbHMoYmluZGluZwotCQkJCQkJCQkuZ2V0Q29udGV4dElkKCkpCi0JCQkJCQkmJiAibW9ua2V5Ii5lcXVhbHMoYmluZGluZy5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpCi0JCQkJCQkJCS5nZXRJZCgpKSAmJiBiaW5kaW5nLmdldFBsYXRmb3JtKCkgPT0gbnVsbAotCQkJCQkJJiYgYmluZGluZy5nZXRMb2NhbGUoKSA9PSBudWxsCi0JCQkJCQkmJiBiaW5kaW5nLmdldFR5cGUoKSA9PSBCaW5kaW5nLlNZU1RFTQotCQkJCQkJJiYgdHJpZ2dlclNlcXVlbmNlLmVxdWFscyhiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShmb3VuZCk7Ci0JCW5hbWVkSGFuZGxlT2JqZWN0ID0gYmluZGluZ1NlcnZpY2UuZ2V0U2NoZW1lKCJtb25rZXkiKTsKLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUoIk1vbmtleSIuZXF1YWxzKG5hbWVkSGFuZGxlT2JqZWN0LmdldE5hbWUoKSkpOwotCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQljb21tYW5kID0gY29tbWFuZFNlcnZpY2UuZ2V0Q29tbWFuZCgibW9ua2V5Iik7Ci0JCXRyeSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUobmV3IEV4ZWN1dGlvbkV2ZW50KCkpOwotCQl9IGNhdGNoIChmaW5hbCBFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChmaW5hbCBOb3RIYW5kbGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCJNb25rZXkiLCBjb21tYW5kLmdldE5hbWUoKSk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9Ci0JCW5hbWVkSGFuZGxlT2JqZWN0ID0gY29tbWFuZFNlcnZpY2UuZ2V0Q29tbWFuZCgibW9ua2V5Iik7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRUcnVlKCJNb25rZXkiLmVxdWFscyhuYW1lZEhhbmRsZU9iamVjdC5nZXROYW1lKCkpKTsKLQkJfSBjYXRjaCAoZmluYWwgTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJbmFtZWRIYW5kbGVPYmplY3QgPSBjb250ZXh0U2VydmljZS5nZXRDb250ZXh0KCJjb250ZXh0Iik7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRUcnVlKCJNb25rZXkiLmVxdWFscyhuYW1lZEhhbmRsZU9iamVjdC5nZXROYW1lKCkpKTsKLQkJfSBjYXRjaCAoZmluYWwgTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJbmFtZWRIYW5kbGVPYmplY3QgPSBjb250ZXh0U2VydmljZS5nZXRDb250ZXh0KCJzY29wZSIpOwotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSgiTW9ua2V5Ii5lcXVhbHMobmFtZWRIYW5kbGVPYmplY3QuZ2V0TmFtZSgpKSk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9Ci0KLQkJcmVtb3ZlQnVuZGxlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSghIm1vbmtleSIuZXF1YWxzKGJpbmRpbmdTZXJ2aWNlLmdldEFjdGl2ZVNjaGVtZSgpLmdldElkKCkpKTsKLQkJZm91bmQgPSBmYWxzZTsKLQkJYmluZGluZ3MgPSBiaW5kaW5nU2VydmljZS5nZXRCaW5kaW5ncygpOwotCQlpZiAoYmluZGluZ3MgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIEJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdzW2ldOwotCQkJCWlmICgibW9ua2V5Ii5lcXVhbHMoYmluZGluZy5nZXRTY2hlbWVJZCgpKQotCQkJCQkJJiYgSUNvbnRleHRJZHMuQ09OVEVYVF9JRF9XSU5ET1cuZXF1YWxzKGJpbmRpbmcKLQkJCQkJCQkJLmdldENvbnRleHRJZCgpKQotCQkJCQkJJiYgIm1vbmtleSIuZXF1YWxzKGJpbmRpbmcuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKQotCQkJCQkJCQkuZ2V0SWQoKSkgJiYgYmluZGluZy5nZXRQbGF0Zm9ybSgpID09IG51bGwKLQkJCQkJCSYmIGJpbmRpbmcuZ2V0TG9jYWxlKCkgPT0gbnVsbAotCQkJCQkJJiYgYmluZGluZy5nZXRUeXBlKCkgPT0gQmluZGluZy5TWVNURU0KLQkJCQkJCSYmIHRyaWdnZXJTZXF1ZW5jZS5lcXVhbHMoYmluZGluZy5nZXRUcmlnZ2VyU2VxdWVuY2UoKSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCi0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIWZvdW5kKTsKLQkJbmFtZWRIYW5kbGVPYmplY3QgPSBiaW5kaW5nU2VydmljZS5nZXRTY2hlbWUoIm1vbmtleSIpOwotCQl0cnkgewotCQkJbmFtZWRIYW5kbGVPYmplY3QuZ2V0TmFtZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQkJbmFtZWRIYW5kbGVPYmplY3QgPSBjb21tYW5kU2VydmljZS5nZXRDYXRlZ29yeSgibW9ua2V5Iik7Ci0JCXRyeSB7Ci0JCQluYW1lZEhhbmRsZU9iamVjdC5nZXROYW1lKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCQljb21tYW5kID0gY29tbWFuZFNlcnZpY2UuZ2V0Q29tbWFuZCgibW9ua2V5Iik7Ci0JCXRyeSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUobmV3IEV4ZWN1dGlvbkV2ZW50KCkpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChmaW5hbCBFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChmaW5hbCBOb3RIYW5kbGVkRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWNvbW1hbmQuZ2V0TmFtZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQkJbmFtZWRIYW5kbGVPYmplY3QgPSBjb250ZXh0U2VydmljZS5nZXRDb250ZXh0KCJjb250ZXh0Iik7Ci0JCXRyeSB7Ci0JCQluYW1lZEhhbmRsZU9iamVjdC5nZXROYW1lKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCQluYW1lZEhhbmRsZU9iamVjdCA9IGNvbnRleHRTZXJ2aWNlLmdldENvbnRleHQoInNjb3BlIik7Ci0JCXRyeSB7Ci0JCQluYW1lZEhhbmRsZU9iamVjdC5nZXROYW1lKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvQ29udGV4dHNFeHRlbnNpb25EeW5hbWljVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9Db250ZXh0c0V4dGVuc2lvbkR5bmFtaWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDMwODIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9Db250ZXh0c0V4dGVuc2lvbkR5bmFtaWNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uTmFtZWRIYW5kbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uTm90RGVmaW5lZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5JQ29udGV4dFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaENvbnN0YW50czsKLQotLyoqCi0gKiBUZXN0cyB3aGV0aGVyIHRoZSAib3JnLmVjbGlwc2UudWkuY29udGV4dHMiIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgYWRkZWQgYW5kCi0gKiByZW1vdmVkIGR5bmFtaWNhbGx5LgotICogCi0gKiBAc2luY2UgMy4xLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRleHRzRXh0ZW5zaW9uRHluYW1pY1Rlc3QgZXh0ZW5kcyBEeW5hbWljVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5Db250ZXh0c0V4dGVuc2lvbkR5bmFtaWNUZXN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdGVzdE5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0OyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIENvbnRleHRzRXh0ZW5zaW9uRHluYW1pY1Rlc3QoZmluYWwgU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxsLXF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gdG8gYmUgdGVzdGVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbiBpZGVudGlmaWVyOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldEV4dGVuc2lvbklkKCkgewotCQlyZXR1cm4gImNvbnRleHRzRXh0ZW5zaW9uRHluYW1pY1Rlc3QudGVzdER5bmFtaWNDb250ZXh0QWRkaXRpb24iOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVucXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCB0byBiZSB0ZXN0ZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgZXh0ZW5zaW9uIHBvaW50IGlkZW50aWZpZXI7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBJV29ya2JlbmNoQ29uc3RhbnRzLlBMX0NPTlRFWFRTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbGF0aXZlIGxvY2F0aW9uIG9mIHRoZSBmb2xkZXIgb24gZGlzayBjb250YWluaW5nIHRoZQotCSAqIHBsdWdpbi54bWwgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSByZWxhdGl2ZSBpbnN0YWxsIGxvY2F0aW9uOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldEluc3RhbGxMb2NhdGlvbigpIHsKLQkJcmV0dXJuICJkYXRhL29yZy5lY2xpcHNlLmNvbnRleHRzRXh0ZW5zaW9uRHluYW1pY1Rlc3QiOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhlIGl0ZW1zIGRlZmluZWQgaW4gdGhlIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgYWRkZWQgYW5kCi0JICogcmVtb3ZlZCBkeW5hbWljYWxseS4gSXQgdGVzdHMgdGhhdCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LCBhbmQgdGhlbiBsb2FkcwotCSAqIHRoZSBleHRlbnNpb24uIEl0IHRlc3RzIHRoYXQgdGhlIGRhdGEgdGhlbiBleGlzdHMsIGFuZCB1bmxvYWRzIHRoZQotCSAqIGV4dGVuc2lvbi4gSXQgdGVzdHMgdGhhdCB0aGUgZGF0YSB0aGVuIGRvZXNuJ3QgZXhpc3QuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdENvbnRleHRzKCkgewotCQlmaW5hbCBJQ29udGV4dFNlcnZpY2Ugc2VydmljZSA9IChJQ29udGV4dFNlcnZpY2UpIGdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFkYXB0ZXIoSUNvbnRleHRTZXJ2aWNlLmNsYXNzKTsKLQkJTmFtZWRIYW5kbGVPYmplY3QgbmFtZWRIYW5kbGVPYmplY3Q7Ci0KLQkJbmFtZWRIYW5kbGVPYmplY3QgPSBzZXJ2aWNlLmdldENvbnRleHQoIm1vbmtleSIpOwotCQl0cnkgewotCQkJbmFtZWRIYW5kbGVPYmplY3QuZ2V0TmFtZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQotCQlnZXRCdW5kbGUoKTsKLQotCQluYW1lZEhhbmRsZU9iamVjdCA9IHNlcnZpY2UuZ2V0Q29udGV4dCgibW9ua2V5Iik7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRUcnVlKCJNb25rZXkiLmVxdWFscyhuYW1lZEhhbmRsZU9iamVjdC5nZXROYW1lKCkpKTsKLQkJfSBjYXRjaCAoZmluYWwgTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQotCQlyZW1vdmVCdW5kbGUoKTsKLQotCQluYW1lZEhhbmRsZU9iamVjdCA9IHNlcnZpY2UuZ2V0Q29udGV4dCgibW9ua2V5Iik7Ci0JCXRyeSB7Ci0JCQluYW1lZEhhbmRsZU9iamVjdC5nZXROYW1lKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvRGVjb3JhdG9yVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvRGVjb3JhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzMDg3MzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9EZWNvcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGVjb3JhdG9ycy5EZWNvcmF0b3JEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRlY29yYXRvcnMuRGVjb3JhdG9yTWFuYWdlcjsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNvcmF0b3JUZXN0cyBleHRlbmRzIER5bmFtaWNUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTDEgPSAiZnVsbERlY29yYXRvcjEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJR0hUMSA9ICJsaWdodERlY29yYXRvcjEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJR0hUMiA9ICJsaWdodERlY29yYXRvcjIiOwotCi0JLyoqCi0JICogQHBhcmFtIHRlc3ROYW1lCi0JICovCi0JcHVibGljIERlY29yYXRvclRlc3RzKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWNvcmF0b3JzKCkgewotCQlhc3NlcnRGYWxzZShoYXNEZWNvcmF0b3IoRlVMTDEpKTsKLQkJYXNzZXJ0RmFsc2UoaGFzRGVjb3JhdG9yKExJR0hUMSkpOwotCQlhc3NlcnRGYWxzZShoYXNEZWNvcmF0b3IoTElHSFQyKSk7Ci0JCWdldEJ1bmRsZSgpOwotCQlhc3NlcnRUcnVlKGhhc0RlY29yYXRvcihGVUxMMSkpOwotCQlhc3NlcnRUcnVlKGhhc0RlY29yYXRvcihMSUdIVDEpKTsKLQkJYXNzZXJ0VHJ1ZShoYXNEZWNvcmF0b3IoTElHSFQyKSk7Ci0JCXJlbW92ZUJ1bmRsZSgpOwotCQlhc3NlcnRGYWxzZShoYXNEZWNvcmF0b3IoRlVMTDEpKTsKLQkJYXNzZXJ0RmFsc2UoaGFzRGVjb3JhdG9yKExJR0hUMSkpOwotCQlhc3NlcnRGYWxzZShoYXNEZWNvcmF0b3IoTElHSFQyKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0RlY29yYXRvcihTdHJpbmcgaWQpIHsKLQkJRGVjb3JhdG9yTWFuYWdlciBtYW5hZ2VyID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCk7Ci0JCURlY29yYXRvckRlZmluaXRpb24gW10gZGVmaW5pdGlvbnMgPSBtYW5hZ2VyLmdldEFsbERlY29yYXRvckRlZmluaXRpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmaW5pdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkZWZpbml0aW9uc1tpXS5nZXRJZCgpLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0RXh0ZW5zaW9uSWQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uSWQoKSB7Ci0JCXJldHVybiAibmV3RGVjb3JhdG9yMS50ZXN0RHluYW1pY0RlY29yYXRvckFkZGl0aW9uIjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0RXh0ZW5zaW9uUG9pbnQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBJV29ya2JlbmNoQ29uc3RhbnRzLlBMX0RFQ09SQVRPUlM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEluc3RhbGxMb2NhdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCXJldHVybiAiZGF0YS9vcmcuZWNsaXBzZS5uZXdEZWNvcmF0b3IxIjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldE1hcmtlckNsYXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcmtlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnVpLmR5bmFtaWMuRHluYW1pY0xhYmVsRGVjb3JhdG9yIjsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0R5bmFtaWNQbHVnaW5zVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0R5bmFtaWNQbHVnaW5zVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYmNmYTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9EeW5hbWljUGx1Z2luc1Rlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUZXN0IHN1aXRlIGZvciBkeW5hbWljIHBsdWctaW4gc3VwcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIER5bmFtaWNQbHVnaW5zVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gIFRoaXMgaXMgcmVxdWlyZWQgdG8KLSAgICAgKiB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljUGx1Z2luc1Rlc3RTdWl0ZSgpOwotICAgIH0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB0aGUgdGVzdCBzdWl0ZS4KLQkgKi8KLQlwdWJsaWMgRHluYW1pY1BsdWdpbnNUZXN0U3VpdGUoKSB7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZSgKLQkJCQlBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb25zRXh0ZW5zaW9uRHluYW1pY1Rlc3QuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKEFjY2VsZXJhdG9yU2NvcGVzRXh0ZW5zaW9uRHluYW1pY1Rlc3QuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKEFjdGlvbkRlZmluaXRpb25zRXh0ZW5zaW9uRHluYW1pY1Rlc3QuY2xhc3MpKTsKLQkgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKEFjdGlvblNldFRlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShBY3Rpdml0eVN1cHBvcnRUZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQmluZGluZ3NFeHRlbnNpb25EeW5hbWljVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQnJvd3NlclRlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShDb21tYW5kc0V4dGVuc2lvbkR5bmFtaWNUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShDb250ZXh0c0V4dGVuc2lvbkR5bmFtaWNUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShIYW5kbGVyc0V4dGVuc2lvbkR5bmFtaWNUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShQcmVmZXJlbmNlUGFnZVRlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShLZXl3b3JkVGVzdHMuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKFByb3BlcnR5UGFnZVRlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShIZWxwU3VwcG9ydFRlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShFbmNvZGluZ1Rlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShEZWNvcmF0b3JUZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoU3RhcnR1cFRlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShFZGl0b3JUZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoSW50cm9UZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoUGVyc3BlY3RpdmVUZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoVmlld1Rlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShBY3Rpb25TZXRUZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoTmV3V2l6YXJkVGVzdHMuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKE9iamVjdENvbnRyaWJ1dGlvblRlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShEeW5hbWljU3VwcG9ydFRlc3RzLmNsYXNzKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9EeW5hbWljU3VwcG9ydFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0R5bmFtaWNTdXBwb3J0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkZTQ5MmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9EeW5hbWljU3VwcG9ydFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmR5bmFtaWNoZWxwZXJzLkV4dGVuc2lvblRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmR5bmFtaWNoZWxwZXJzLklFeHRlbnNpb25UcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmxlYWtzLkxlYWtUZXN0czsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljU3VwcG9ydFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBJRXh0ZW5zaW9uVHJhY2tlciB0cmFja2VyOwotCXByaXZhdGUgSUV4dGVuc2lvbiBlMSwgZTI7Ci0JcHJpdmF0ZSBPYmplY3QgbzEsIG8yOwotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgRHluYW1pY1N1cHBvcnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdHJhY2tlciA9IG5ldyBFeHRlbnNpb25UcmFja2VyKCk7CQkKLQkJSUV4dGVuc2lvbiBbXSBlbGVtZW50cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLnVpLnZpZXdzIikuZ2V0RXh0ZW5zaW9ucygpOwotCQlhc3NlcnROb3ROdWxsKGVsZW1lbnRzKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudHMubGVuZ3RoIDwgMik7Ci0JCWUxID0gZWxlbWVudHNbMF07Ci0JCWUyID0gZWxlbWVudHNbMV07Ci0JCQotCQlvMSA9IG5ldyBPYmplY3QoKTsKLQkJbzIgPSBuZXcgV2Vha1JlZmVyZW5jZShvMSk7IAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQkoKEV4dGVuc2lvblRyYWNrZXIpdHJhY2tlcikuY2xvc2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25FbGVtZW50VHJhY2tlcjEoKSB7Ci0JCXRyYWNrZXIucmVnaXN0ZXJPYmplY3QoZTEsIG8xLCBJRXh0ZW5zaW9uVHJhY2tlci5SRUZfV0VBSyk7Ci0JCU9iamVjdCBbXSByZXN1bHRzID0gdHJhY2tlci5nZXRPYmplY3RzKGUxKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHRzKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdHMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKG8xLCByZXN1bHRzWzBdKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25FbGVtZW50VHJhY2tlcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhY2tlci5yZWdpc3Rlck9iamVjdChlMSwgbzEsIElFeHRlbnNpb25UcmFja2VyLlJFRl9XRUFLKTsKLQkJUmVmZXJlbmNlUXVldWUgcXVldWUgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsKLQkJV2Vha1JlZmVyZW5jZSByZWYgPSBuZXcgV2Vha1JlZmVyZW5jZShvMSwgcXVldWUpOwotCQlvMSA9IG51bGw7Ci0JCUxlYWtUZXN0cy5jaGVja1JlZihxdWV1ZSwgcmVmKTsKLQkJT2JqZWN0IFtdIHJlc3VsdHMgPSB0cmFja2VyLmdldE9iamVjdHMoZTEpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdHMpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzdWx0cy5sZW5ndGgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbkVsZW1lbnRUcmFja2VyMygpIHsKLQkJdHJhY2tlci5yZWdpc3Rlck9iamVjdChlMiwgbzIsIElFeHRlbnNpb25UcmFja2VyLlJFRl9XRUFLKTsKLQkJT2JqZWN0IFtdIHJlc3VsdHMgPSB0cmFja2VyLmdldE9iamVjdHMoZTIpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdHMpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0cy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMobzIsIHJlc3VsdHNbMF0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbkVsZW1lbnRUcmFja2VyNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFja2VyLnJlZ2lzdGVyT2JqZWN0KGUxLCBvMSwgSUV4dGVuc2lvblRyYWNrZXIuUkVGX1NUUk9ORyk7Ci0JCVJlZmVyZW5jZVF1ZXVlIHF1ZXVlID0gbmV3IFJlZmVyZW5jZVF1ZXVlKCk7Ci0JCVdlYWtSZWZlcmVuY2UgcmVmID0gbmV3IFdlYWtSZWZlcmVuY2UobzEsIHF1ZXVlKTsKLQkJbzEgPSBudWxsOwotCQl0cnkgewotCQkJTGVha1Rlc3RzLmNoZWNrUmVmKHF1ZXVlLCByZWYpOwotCQkJZmFpbCgiU2hvdWxkbid0IGhhdmUgZW5xdWV1ZWQgdGhlIHJlZiIpOwotCQl9Ci0JCWNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJLy93b250IGJlIGVucXVldWVkCi0JCX0KLQkJT2JqZWN0IFtdIHJlc3VsdHMgPSB0cmFja2VyLmdldE9iamVjdHMoZTEpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdHMpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0cy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMocmVmLmdldCgpLCByZXN1bHRzWzBdKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0R5bmFtaWNUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9EeW5hbWljVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0YzA3YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0R5bmFtaWNUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25EZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVJlZ2lzdHJ5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklSZWdpc3RyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMubGVha3MuTGVha1Rlc3RzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBCYXNlY2xhc3MgZm9yIGFsbCBkeW5hbWljIHRlc3RzLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEeW5hbWljVGVzdENhc2UgZXh0ZW5kcyBVSVRlc3RDYXNlIGltcGxlbWVudHMKLQkJSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGFkZGVkUmVjaWV2ZWQ7Ci0KLQlwcml2YXRlIEJ1bmRsZSBuZXdCdW5kbGU7Ci0KLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gcmVtb3ZlZFJlY2lldmVkOwotCQotCXByaXZhdGUgV2Vha1JlZmVyZW5jZSBhZGRlZERlbHRhOwotCQotCXByaXZhdGUgV2Vha1JlZmVyZW5jZSByZW1vdmVkRGVsdGE7Ci0JCi0JcHJpdmF0ZSBSZWZlcmVuY2VRdWV1ZSBxdWV1ZTsKLQotCS8qKgotCSAqIEBwYXJhbSB0ZXN0TmFtZQotCSAqLwotCXB1YmxpYyBEeW5hbWljVGVzdENhc2UoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuVUlUZXN0Q2FzZSNkb1RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRvVGVhckRvd24oKTsKLQkJdHJ5IHsKLQkJCXJlbW92ZUJ1bmRsZSgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5yZW1vdmVSZWdpc3RyeUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBidW5kbGUgZm9yIHRoaXMgdGVzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBidW5kbGUgZm9yIHRoaXMgdGVzdAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlpZiAobmV3QnVuZGxlID09IG51bGwpIHsKLQkJCVBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuYWRkUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCXJlc2V0KCk7Ci0JCQlxdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOwotCQkJLy8gSnVzdCB0cnkgdG8gZmluZCB0aGUgbmV3IHBlcnNwZWN0aXZlLiBEb24ndCBhY3R1YWxseSB0cnkgdG8KLQkJCS8vIGRvIGFueXRoaW5nIHdpdGggaXQgYXMgdGhlIGNsYXNzIGl0IHJlZmVycyB0byBkb2VzIG5vdCBleGlzdC4KLQkJCXRyeSB7Ci0JCQkJbmV3QnVuZGxlID0gRHluYW1pY1V0aWxzLmluc3RhbGxQbHVnaW4oZ2V0SW5zdGFsbExvY2F0aW9uKCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQotCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWxvbmcgcG90ZW50aWFsRW5kVGltZSA9IHN0YXJ0VGltZSArIDUwMDA7Ci0JCQlib29sZWFuIHRpbWVUb0ZhaWwgPSBmYWxzZTsKLQkJCXdoaWxlICghaGFzQWRkZWRFdmVudFByb3BhZ2F0ZWQoKSAmJiAhdGltZVRvRmFpbCkgewotCQkJCXByb2Nlc3NFdmVudHMoKTsKLQkJCQl0aW1lVG9GYWlsID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPiBwb3RlbnRpYWxFbmRUaW1lOwotICAgICAJCQlUaHJlYWQueWllbGQoKTsKLQkJCX0KLQkJCWFzc2VydEZhbHNlKCJUZXN0IGZhaWxlZCBkdWUgdG8gdGltZW91dCBvbiBhZGRpdGlvbiIsIHRpbWVUb0ZhaWwpOwotCQkJdHJ5IHsKLQkJCQlMZWFrVGVzdHMuY2hlY2tSZWYocXVldWUsIGFkZGVkRGVsdGEpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJcHJvY2Vzc0V2ZW50cygpOwotCQkJUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5yZW1vdmVSZWdpc3RyeUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBuZXdCdW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHBsdWdpbiB0aGF0IGRlZmluZXMgdGhlIGV4dGVuc2lvbiBwb2ludCBiZWluZwotCSAqIHRlc3RlZC4gRGVmYXVsdCBpcyAib3JnLmVjbGlwc2UudWkiLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgZGVjbGFyaW5nIHBsdWdpbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjbGFyaW5nTmFtZXNwYWNlKCkgewotCQlyZXR1cm4gV29ya2JlbmNoUGx1Z2luLlBJX1dPUktCRU5DSDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGlkIG9mIHRoZSBleHRlbnNpb24gdG8gYmUgdGVzdGVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSBleHRlbnNpb24gdG8gYmUgdGVzdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRFeHRlbnNpb25JZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgdGhhdCBpcyBiZWluZyB0ZXN0ZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgZXh0ZW5zaW9uIHBvaW50IGJlaW5nIHRlc3RlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RXh0ZW5zaW9uUG9pbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5zdGFsbCBsb2NhdGlvbiBvZiB0aGUgYnVuZGxlIHRvIHRlc3QuCi0JICogCi0JICogQHJldHVybiB0aGUgaW5zdGFsbCBsb2NhdGlvbiBvZiB0aGUgYnVuZGxlIHRvIHRlc3QKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEluc3RhbGxMb2NhdGlvbigpOwotCQotCS8qKgotCSAqIFJldHVybiBhIDxjb2RlPkNsYXNzPC9jb2RlPiB0aGF0IHdlIGtub3cgdG8gYmUgaW4gdGVoIGJ1bmRsZSB0byB0ZXN0LgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5DbGFzczwvY29kZT4gdGhhdCB3ZSBrbm93IHRvIGJlIGluIHRlaCBidW5kbGUgdG8gdGVzdC4gIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJDbGFzcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBtYXJrZXIgY2xhc3MgaXMgcmVsZWFzZWQgd2hlbiB0aGUgYnVuZGxlIGlzIHVubG9hZGVkLgotCSAqIElmIDxjb2RlPmdldE1hcmtlckNsYXNzKCk8L2NvZGU+IHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiB0aGlzIG1ldGhvZCAKLQkgKiB3aWxsIGFsd2F5cyBzdWNjZWVkLgotCSAqIAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewkKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldE1hcmtlckNsYXNzKCk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsJCQotCQkKLQkJQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSgpOwotCQkKLQkJQ2xhc3MgY2xhenogPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCWFzc2VydE5vdE51bGwoY2xhenopOwotCQlSZWZlcmVuY2VRdWV1ZSBteVF1ZXVlID0gbmV3IFJlZmVyZW5jZVF1ZXVlKCk7Ci0JCVdlYWtSZWZlcmVuY2UgcmVmID0gbmV3IFdlYWtSZWZlcmVuY2UoY2xhenouZ2V0Q2xhc3NMb2FkZXIoKSwgbXlRdWV1ZSk7Ci0JCWNsYXp6ID0gbnVsbDsgLy9udWxsIG91ciByZWZzCi0JCWJ1bmRsZSA9IG51bGw7Ci0JCXJlbW92ZUJ1bmRsZSgpOwotCQlMZWFrVGVzdHMuY2hlY2tSZWYobXlRdWV1ZSwgcmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYnVuZGxlIEFEREVEIGV2ZW50IGhhcyBiZWVuIHJlY2lldmVkLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgYnVuZGxlIEFEREVEIGV2ZW50IGhhcyBiZWVuIHJlY2lldmVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzQWRkZWRFdmVudFByb3BhZ2F0ZWQoKSB7Ci0JCXJldHVybiBhZGRlZFJlY2lldmVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBidW5kbGUgUkVNT1ZFRCBldmVudCBoYXMgYmVlbiByZWNpZXZlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGJ1bmRsZSBSRU1PVkVEIGV2ZW50IGhhcyBiZWVuIHJlY2lldmVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzUmVtb3ZlZEV2ZW50UHJvcGFnYXRlZCgpIHsKLQkJcmV0dXJuIHJlbW92ZWRSZWNpZXZlZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGVuc3VyZSByZWNvcmRpbmcgb2YgYWRkaXRpb24gYW5kIHJlbW92YWwgb2YgZXh0ZW5zaW9ucwotCSAqIGRlc2NyaWJlZCBieSBhIGNvbWJpbmF0aW9uIG9mCi0JICoge0BsaW5rIER5bmFtaWNUZXN0Q2FzZSNnZXREZWNsYXJpbmdOYW1lc3BhY2UoKX0sCi0JICoge0BsaW5rIER5bmFtaWNUZXN0Q2FzZSNnZXRFeHRlbnNpb25Qb2ludCgpfSwgYW5kCi0JICoge0BsaW5rIER5bmFtaWNUZXN0Q2FzZSNnZXRFeHRlbnNpb25JZCgpfS4KLQkgKiAKLQkgKiBDdXN0b20gaW1wbGVtZW50YXRpb25zcyBzaG91bGQgZW5zdXJlIHRoYXQgYWRkaXRpb24gYW5kIHJlbW92YWwgb2YgdGhlCi0JICogdGFyZ2V0IGV4dGVuc2lvbiBhcmUgcmVjb3JkZWQuCi0JICogCi0JICogQHNlZSBEeW5hbWljVGVzdENhc2Ujc2V0QWRkZWRFdmVudFByb3BhZ2F0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIER5bmFtaWNUZXN0Q2FzZSNzZXRSZW1vdmVkRXZlbnRQcm9wYWdhdGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0cnlDaGFuZ2VkKElSZWdpc3RyeUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUlFeHRlbnNpb25EZWx0YSBkZWx0YSA9IGV2ZW50LmdldEV4dGVuc2lvbkRlbHRhKAotCQkJCWdldERlY2xhcmluZ05hbWVzcGFjZSgpLCBnZXRFeHRlbnNpb25Qb2ludCgpLCBnZXRFeHRlbnNpb25JZCgpKTsKLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUV4dGVuc2lvbkRlbHRhLkFEREVEKSB7Ci0JCQkJYWRkZWREZWx0YSA9IG5ldyBXZWFrUmVmZXJlbmNlKGRlbHRhLCBxdWV1ZSk7Ci0JCQkJc2V0QWRkZWRFdmVudFByb3BhZ2F0ZWQodHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUV4dGVuc2lvbkRlbHRhLlJFTU9WRUQpIHsKLQkJCQlyZW1vdmVkRGVsdGEgPSBuZXcgV2Vha1JlZmVyZW5jZShkZWx0YSwgcXVldWUpOwotCQkJCXNldFJlbW92ZWRFdmVudFByb3BhZ2F0ZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbmxvYWQgdGhlIGJ1bmRsZSwgaWYgcHJlc2VudC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1vdmVCdW5kbGUoKSB7Ci0JCWlmIChuZXdCdW5kbGUgIT0gbnVsbCkgewotCQkJUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5hZGRSZWdpc3RyeUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJcXVldWUgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsKLQkJCXRyeSB7Ci0JCQkJRHluYW1pY1V0aWxzLnVuaW5zdGFsbFBsdWdpbihuZXdCdW5kbGUpOwotCQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJbG9uZyBwb3RlbnRpYWxFbmRUaW1lID0gc3RhcnRUaW1lICsgNTAwMDsKLQkJCQlib29sZWFuIHRpbWVUb0ZhaWwgPSBmYWxzZTsKLQkJCQl3aGlsZSAoIWhhc1JlbW92ZWRFdmVudFByb3BhZ2F0ZWQoKSAmJiAhdGltZVRvRmFpbCkgewotCQkJCQlwcm9jZXNzRXZlbnRzKCk7Ci0JCQkJCXRpbWVUb0ZhaWwgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA+IHBvdGVudGlhbEVuZFRpbWU7Ci0JCQkJCVRocmVhZC55aWVsZCgpOwotCQkJCX0KLQkJCQlhc3NlcnRGYWxzZSgiVGVzdCBmYWlsZWQgZHVlIHRvIHRpbWVvdXQgb24gcmVtb3ZhbCIsIHRpbWVUb0ZhaWwpOwotCQkJCXRyeSB7Ci0JCQkJCUxlYWtUZXN0cy5jaGVja1JlZihxdWV1ZSwgcmVtb3ZlZERlbHRhKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZTEpIHsKLQkJCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLQkJCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbmV3QnVuZGxlID0gbnVsbDsKLQkJCX0KLQkJCXByb2Nlc3NFdmVudHMoKTsKLQkJCVBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkucmVtb3ZlUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc2V0IHRoZSBhZGRlZC9yZW1vdmVkIGZsYWdzLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldCgpIHsKLQkJYWRkZWREZWx0YSA9IG51bGw7Ci0JCXJlbW92ZWREZWx0YSA9IG51bGw7Ci0JCXNldEFkZGVkRXZlbnRQcm9wYWdhdGVkKGZhbHNlKTsKLQkJc2V0UmVtb3ZlZEV2ZW50UHJvcGFnYXRlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhlIGJ1bmRsZSBBRERFRCBldmVudCBoYXMgYmVlbiByZWNpZXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRkZWQKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGJ1bmRsZSBBRERFRCBldmVudCBoYXMgYmVlbiByZWNpZXZlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEFkZGVkRXZlbnRQcm9wYWdhdGVkKGJvb2xlYW4gYWRkZWQpIHsKLQkJdGhpcy5hZGRlZFJlY2lldmVkID0gYWRkZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhlIGJ1bmRsZSBSRU1PVkVEIGV2ZW50IGhhcyBiZWVuIHJlY2lldmVkLgotCSAqIAotCSAqIEBwYXJhbSBhZGRlZAotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgYnVuZGxlIFJFTU9WRUQgZXZlbnQgaGFzIGJlZW4gcmVjaWV2ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRSZW1vdmVkRXZlbnRQcm9wYWdhdGVkKGJvb2xlYW4gcmVtb3ZlZCkgewotCQl0aGlzLnJlbW92ZWRSZWNpZXZlZCA9IHJlbW92ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9EeW5hbWljVXRpbHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvRHluYW1pY1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MzJhNzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9EeW5hbWljVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRHluYW1pY1V0aWxzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQnVuZGxlIGluc3RhbGxQbHVnaW4oU3RyaW5nIHBsdWdpbk5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFByb2dyYW1tYXRpY2FsbHkgaW5zdGFsbCBhIG5ldyBwbHVnaW4KLSAgICAgICAgVGVzdFBsdWdpbiBwbHVnaW4gPSBUZXN0UGx1Z2luLmdldERlZmF1bHQoKTsKLSAgICAgICAgaWYgKHBsdWdpbiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRlc3RQbHVnaW4gZGVmYXVsdCByZWZlcmVuY2UgaXMgbnVsbCIpOwotICAgICAgICBTdHJpbmcgcGx1Z2luTG9jYXRpb24gPSBudWxsOwotICAgICAgICBVUkwgZGF0YVVSTCA9IFBsYXRmb3JtLnJlc29sdmUocGx1Z2luLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBsdWdpbk5hbWUpKTsKLSAgICAgICAgcGx1Z2luTG9jYXRpb24gPSAicmVmZXJlbmNlOiIgKyBkYXRhVVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgIHJldHVybiBUZXN0SW5zdGFsbFV0aWwuaW5zdGFsbEJ1bmRsZShwbHVnaW5Mb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHVuaW5zdGFsbFBsdWdpbihCdW5kbGUgYnVuZGxlKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdEluc3RhbGxVdGlsLnVuaW5zdGFsbEJ1bmRsZShidW5kbGUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9FZGl0b3JUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9FZGl0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2FmZGM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvRWRpdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5sZWFrcy5MZWFrVGVzdHM7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yVGVzdHMgZXh0ZW5kcyBEeW5hbWljVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5uZXdFZGl0b3IxLm5ld0VkaXRvcjEiOwotCS8qKgotCSAqIEBwYXJhbSB0ZXN0TmFtZQotCSAqLwotCXB1YmxpYyBFZGl0b3JUZXN0cyhTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRFeHRlbnNpb25JZCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb25JZCgpIHsKLQkJcmV0dXJuICJuZXdFZGl0b3IxLnRlc3REeW5hbWljRWRpdG9yQWRkaXRpb24iOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRFeHRlbnNpb25Qb2ludCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb25Qb2ludCgpIHsKLQkJcmV0dXJuIElXb3JrYmVuY2hDb25zdGFudHMuUExfRURJVE9SOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRJbnN0YWxsTG9jYXRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5zdGFsbExvY2F0aW9uKCkgewotCQlyZXR1cm4gImRhdGEvb3JnLmVjbGlwc2UubmV3RWRpdG9yMSI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFZGl0b3JDbG9zdXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG9wZW5UZXN0V2luZG93KElERS5SRVNPVVJDRV9QRVJTUEVDVElWRV9JRCk7Ci0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKCk7Ci0JCWdldEJ1bmRsZSgpOwotCQkJCQotCQlSZWZlcmVuY2VRdWV1ZSBxdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOwotCQlJRWRpdG9yUGFydCBwYXJ0ID0gSURFLm9wZW5FZGl0b3Iod2luZG93LmdldEFjdGl2ZVBhZ2UoKSwgZmlsZSwgRURJVE9SX0lEKTsKLQkJV2Vha1JlZmVyZW5jZSByZWYgPSBuZXcgV2Vha1JlZmVyZW5jZShwYXJ0LCBxdWV1ZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFydCk7Ci0gICAgICAgIHBhcnQgPSBudWxsOyAvL251bGwgdGhlIHJlZmVyZW5jZQotCi0JCXJlbW92ZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJTGVha1Rlc3RzLmNoZWNrUmVmKHF1ZXVlLCByZWYpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gCi0JCQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRFZGl0b3JzKCkubGVuZ3RoKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFZGl0b3JQcm9wZXJ0aWVzKCkgewotCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlZ2lzdHJ5LmZpbmRFZGl0b3IoRURJVE9SX0lEKSk7Ci0JCWdldEJ1bmRsZSgpOwotCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjID0gcmVnaXN0cnkuZmluZEVkaXRvcihFRElUT1JfSUQpOwotCQlhc3NlcnROb3ROdWxsKGRlc2MpOwotCSAgICAKLQkJdGVzdEVkaXRvclByb3BlcnRpZXMoZGVzYyk7Ci0JCXJlbW92ZUJ1bmRsZSgpOwkKLQkJYXNzZXJ0TnVsbChyZWdpc3RyeS5maW5kRWRpdG9yKEVESVRPUl9JRCkpOwotCQl0cnkgewotCQkJdGVzdEVkaXRvclByb3BlcnRpZXMoZGVzYyk7Ci0JCQlmYWlsKCk7CQkKLQkJfQotCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGRlc2MKLQkgKi8KLQlwcml2YXRlIHZvaWQgdGVzdEVkaXRvclByb3BlcnRpZXMoSUVkaXRvckRlc2NyaXB0b3IgZGVzYykgewotCQlhc3NlcnROb3ROdWxsKGRlc2MuZ2V0SWQoKSk7Ci0JCWFzc2VydE5vdE51bGwoZGVzYy5nZXRMYWJlbCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChkZXNjLmdldEltYWdlRGVzY3JpcHRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBJUHJvamVjdCB0ZXN0UHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChnZXROYW1lKCkpOwotICAgICAgICB0ZXN0UHJvamVjdC5jcmVhdGUobnVsbCk7Ci0gICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obnVsbCk7ICAgICAgICAKLQotICAgICAgICBJRmlsZSBpRmlsZSA9IHRlc3RQcm9qZWN0LmdldEZpbGUoInNvbWVGaWxlIik7Ci0gICAgICAgIGlGaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7ICdcbicgfSksIHRydWUsIG51bGwpOwotICAgICAgICByZXR1cm4gaUZpbGU7Ci0JfQkKLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcmtlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnVpLmR5bmFtaWMuRHluYW1pY0VkaXRvciI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9FbmNvZGluZ1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0VuY29kaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhODlmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0VuY29kaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEVuY29kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREVFbmNvZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoQ29uc3RhbnRzOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nVGVzdHMgZXh0ZW5kcyBEeW5hbWljVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HID0gIkNwMTI1NyI7Ci0JLyoqCi0JICogQHBhcmFtIHRlc3ROYW1lCi0JICovCi0JcHVibGljIEVuY29kaW5nVGVzdHMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdvcmtiZW5jaEVuY29kaW5ncygpIHsKLQkJYXNzZXJ0RmFsc2UoV29ya2JlbmNoRW5jb2RpbmcuZ2V0RGVmaW5lZEVuY29kaW5ncygpLmNvbnRhaW5zKEVOQ09ESU5HKSk7Ci0JCWdldEJ1bmRsZSgpOwotCQlhc3NlcnRUcnVlKFdvcmtiZW5jaEVuY29kaW5nLmdldERlZmluZWRFbmNvZGluZ3MoKS5jb250YWlucyhFTkNPRElORykpOwotCQlyZW1vdmVCdW5kbGUoKTsKLQkJYXNzZXJ0RmFsc2UoV29ya2JlbmNoRW5jb2RpbmcuZ2V0RGVmaW5lZEVuY29kaW5ncygpLmNvbnRhaW5zKEVOQ09ESU5HKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJREVFbmNvZGluZ3MoKSB7Ci0JCWFzc2VydEZhbHNlKElERUVuY29kaW5nLmdldElERUVuY29kaW5ncygpLmNvbnRhaW5zKEVOQ09ESU5HKSk7Ci0JCWdldEJ1bmRsZSgpOwotCQlhc3NlcnRUcnVlKElERUVuY29kaW5nLmdldElERUVuY29kaW5ncygpLmNvbnRhaW5zKEVOQ09ESU5HKSk7Ci0JCXJlbW92ZUJ1bmRsZSgpOwotCQlhc3NlcnRGYWxzZShJREVFbmNvZGluZy5nZXRJREVFbmNvZGluZ3MoKS5jb250YWlucyhFTkNPRElORykpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0RXh0ZW5zaW9uSWQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uSWQoKSB7Ci0JCXJldHVybiAibmV3RW5jb2RpbmcxLnRlc3REeW5hbWljRW5jb2RpbmdBZGRpdGlvbiI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEV4dGVuc2lvblBvaW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvblBvaW50KCkgewotCQlyZXR1cm4gSVdvcmtiZW5jaENvbnN0YW50cy5QTF9FTkNPRElOR1M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEluc3RhbGxMb2NhdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCXJldHVybiAiZGF0YS9vcmcuZWNsaXBzZS5uZXdFbmNvZGluZzEiOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvSGFuZGxlcnNFeHRlbnNpb25EeW5hbWljVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9IYW5kbGVyc0V4dGVuc2lvbkR5bmFtaWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTZiOTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9IYW5kbGVyc0V4dGVuc2lvbkR5bmFtaWNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Ob3RIYW5kbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklDb21tYW5kU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoQ29uc3RhbnRzOwotCi0vKioKLSAqIFRlc3RzIHdoZXRoZXIgdGhlICJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyIgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSBhZGRlZCBhbmQKLSAqIHJlbW92ZWQgZHluYW1pY2FsbHkuCi0gKiAKLSAqIEBzaW5jZSAzLjEuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSGFuZGxlcnNFeHRlbnNpb25EeW5hbWljVGVzdCBleHRlbmRzIER5bmFtaWNUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPkhhbmRsZXJzRXh0ZW5zaW9uRHluYW1pY1Rlc3Q8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB0ZXN0TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHRlc3Q7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSGFuZGxlcnNFeHRlbnNpb25EeW5hbWljVGVzdChmaW5hbCBTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGwtcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiB0byBiZSB0ZXN0ZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgZXh0ZW5zaW9uIGlkZW50aWZpZXI7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0RXh0ZW5zaW9uSWQoKSB7Ci0JCXJldHVybiAiaGFuZGxlcnNFeHRlbnNpb25EeW5hbWljVGVzdC50ZXN0RHluYW1pY0hhbmRsZXJBZGRpdGlvbiI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5xdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IHRvIGJlIHRlc3RlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24gcG9pbnQgaWRlbnRpZmllcjsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRFeHRlbnNpb25Qb2ludCgpIHsKLQkJcmV0dXJuIElXb3JrYmVuY2hDb25zdGFudHMuUExfSEFORExFUlM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVsYXRpdmUgbG9jYXRpb24gb2YgdGhlIGZvbGRlciBvbiBkaXNrIGNvbnRhaW5pbmcgdGhlCi0JICogcGx1Z2luLnhtbCBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHJlbGF0aXZlIGluc3RhbGwgbG9jYXRpb247IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0SW5zdGFsbExvY2F0aW9uKCkgewotCQlyZXR1cm4gImRhdGEvb3JnLmVjbGlwc2UuaGFuZGxlcnNFeHRlbnNpb25EeW5hbWljVGVzdCI7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgaXRlbXMgZGVmaW5lZCBpbiB0aGUgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSBhZGRlZCBhbmQKLQkgKiByZW1vdmVkIGR5bmFtaWNhbGx5LiBJdCB0ZXN0cyB0aGF0IHRoZSBkYXRhIGRvZXNuJ3QgZXhpc3QsIGFuZCB0aGVuIGxvYWRzCi0JICogdGhlIGV4dGVuc2lvbi4gSXQgdGVzdHMgdGhhdCB0aGUgZGF0YSB0aGVuIGV4aXN0cywgYW5kIHVubG9hZHMgdGhlCi0JICogZXh0ZW5zaW9uLiBJdCB0ZXN0cyB0aGF0IHRoZSBkYXRhIHRoZW4gZG9lc24ndCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SGFuZGxlcnMoKSB7Ci0JCWZpbmFsIElDb21tYW5kU2VydmljZSBjb21tYW5kU2VydmljZSA9IChJQ29tbWFuZFNlcnZpY2UpIGdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFkYXB0ZXIoSUNvbW1hbmRTZXJ2aWNlLmNsYXNzKTsKLQkJQ29tbWFuZCBjb21tYW5kOwotCi0JCWNvbW1hbmQgPSBjb21tYW5kU2VydmljZS5nZXRDb21tYW5kKCJtb25rZXkiKTsKLQkJdHJ5IHsKLQkJCWNvbW1hbmQuZXhlY3V0ZShuZXcgRXhlY3V0aW9uRXZlbnQoKSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdEhhbmRsZWRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCi0JCWdldEJ1bmRsZSgpOwotCi0JCWNvbW1hbmQgPSBjb21tYW5kU2VydmljZS5nZXRDb21tYW5kKCJtb25rZXkiKTsKLQkJdHJ5IHsKLQkJCWNvbW1hbmQuZXhlY3V0ZShuZXcgRXhlY3V0aW9uRXZlbnQoKSk7Ci0JCX0gY2F0Y2ggKGZpbmFsIEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdEhhbmRsZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9Ci0KLQkJcmVtb3ZlQnVuZGxlKCk7Ci0KLQkJY29tbWFuZCA9IGNvbW1hbmRTZXJ2aWNlLmdldENvbW1hbmQoIm1vbmtleSIpOwotCQl0cnkgewotCQkJY29tbWFuZC5leGVjdXRlKG5ldyBFeGVjdXRpb25FdmVudCgpKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoZmluYWwgRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoZmluYWwgTm90SGFuZGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9IZWxwU3VwcG9ydFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0hlbHBTdXBwb3J0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0MjE0Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0hlbHBTdXBwb3J0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaGVscC5Xb3JrYmVuY2hIZWxwU3lzdGVtOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIEhlbHBTdXBwb3J0VGVzdHMgZXh0ZW5kcyBEeW5hbWljVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIHRlc3ROYW1lCi0JICovCi0JcHVibGljIEhlbHBTdXBwb3J0VGVzdHMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGVscFN1cHBvcnQoKSB7Ci0JCVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscCA9IFdvcmtiZW5jaEhlbHBTeXN0ZW0uZ2V0SW5zdGFuY2UoKTsKLQkJaGVscC5zZXREZXNpcmVkSGVscFN5c3RlbUlkKGdldEV4dGVuc2lvbklkKCkpOwotCQlhc3NlcnRGYWxzZShoZWxwLmhhc0hlbHBVSSgpKTsKLQkJCi0JCWdldEJ1bmRsZSgpOwotCQloZWxwLmRpc3Bvc2UoKTsKLQkJYXNzZXJ0VHJ1ZShoZWxwLmhhc0hlbHBVSSgpKTsKLQkJCi0JCXJlbW92ZUJ1bmRsZSgpOwotCQloZWxwLmRpc3Bvc2UoKTsJCQotCQlhc3NlcnRGYWxzZShoZWxwLmhhc0hlbHBVSSgpKTsKLQkJCi0JCWhlbHAuc2V0RGVzaXJlZEhlbHBTeXN0ZW1JZChudWxsKTsJCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0RXh0ZW5zaW9uSWQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uSWQoKSB7Ci0JCXJldHVybiAibmV3SGVscFN1cHBvcnQxLnRlc3REeW5hbWljSGVscFN1cHBvcnRBZGRpdGlvbiI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEV4dGVuc2lvblBvaW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvblBvaW50KCkgewotCQlyZXR1cm4gSVdvcmtiZW5jaENvbnN0YW50cy5QTF9IRUxQU1VQUE9SVDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0SW5zdGFsbExvY2F0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluc3RhbGxMb2NhdGlvbigpIHsKLQkJcmV0dXJuICJkYXRhL29yZy5lY2xpcHNlLm5ld0hlbHBTdXBwb3J0MSI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRNYXJrZXJDbGFzcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS51aS5keW5hbWljLkR5bmFtaWNIZWxwU3VwcG9ydCI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0ludHJvVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvSW50cm9UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWQ2NTY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvSW50cm9UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaW50cm8uSUludHJvRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pbnRyby5JSW50cm9SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pbnRyby5JbnRyb0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5sZWFrcy5MZWFrVGVzdHM7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgSW50cm9UZXN0cyBleHRlbmRzIER5bmFtaWNUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5zb21lUHJvZHVjdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVFJPX0lEID0gIm9yZy5lY2xpcHNlLm5ld0ludHJvMS5uZXdJbnRybzEiOwotCXByaXZhdGUgSW50cm9EZXNjcmlwdG9yIG9sZERlc2M7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQkvKioKLQkgKiBAcGFyYW0gdGVzdE5hbWUKLQkgKi8KLQlwdWJsaWMgSW50cm9UZXN0cyhTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW50cm9DbG9zdXJlKCkgewkKLQkJZ2V0QnVuZGxlKCk7Ci0JCVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBXb3JrYmVuY2guZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSW50cm9EZXNjcmlwdG9yIHRlc3REZXNjID0gKEludHJvRGVzY3JpcHRvcikgV29ya2JlbmNoUGx1Z2luCi0gICAgICAgIC5nZXREZWZhdWx0KCkuZ2V0SW50cm9SZWdpc3RyeSgpLmdldEludHJvKAotICAgICAgICAJCUlOVFJPX0lEKTsKLSAgICAgICAgd29ya2JlbmNoLnNldEludHJvRGVzY3JpcHRvcih0ZXN0RGVzYyk7Ci0KLQkJUmVmZXJlbmNlUXVldWUgcXVldWUgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsKLQkJSUludHJvUGFydCBpbnRybyA9IHdvcmtiZW5jaC5nZXRJbnRyb01hbmFnZXIoKS5zaG93SW50cm8od2luZG93LCBmYWxzZSk7Ci0JCVdlYWtSZWZlcmVuY2UgcmVmID0gbmV3IFdlYWtSZWZlcmVuY2UoaW50cm8sIHF1ZXVlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnRybyk7Ci0gICAgICAgIGludHJvID0gbnVsbDsgLy9udWxsIHRoZSByZWZlcmVuY2UKLSAgICAgICAgcmVtb3ZlQnVuZGxlKCk7Ci0gICAgICAgIHRyeSB7Ci0JCQlMZWFrVGVzdHMuY2hlY2tSZWYocXVldWUsIHJlZik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSAKLSAgICAgICAgYXNzZXJ0TnVsbCh3b3JrYmVuY2guZ2V0SW50cm9NYW5hZ2VyKCkuZ2V0SW50cm8oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnRyb1Byb3BlcnRpZXMoKSB7Ci0JCUlJbnRyb1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnRyb1JlZ2lzdHJ5KCk7Ci0JCWFzc2VydE51bGwocmVnaXN0cnkuZ2V0SW50cm9Gb3JQcm9kdWN0KFBST0RVQ1RfSUQpKTsKLQkJYXNzZXJ0TnVsbChyZWdpc3RyeS5nZXRJbnRybyhJTlRST19JRCkpOwotCQlnZXRCdW5kbGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWdpc3RyeS5nZXRJbnRyb0ZvclByb2R1Y3QoUFJPRFVDVF9JRCkpOwotCQlJSW50cm9EZXNjcmlwdG9yIGRlc2MgPSByZWdpc3RyeS5nZXRJbnRybyhJTlRST19JRCk7Ci0JCWFzc2VydE5vdE51bGwoZGVzYyk7Ci0JCXRyeSB7Ci0JCQl0ZXN0SW50cm9Qcm9wZXJ0aWVzKGRlc2MpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJlbW92ZUJ1bmRsZSgpOwkKLQkJYXNzZXJ0TnVsbChyZWdpc3RyeS5nZXRJbnRybyhJTlRST19JRCkpOwotCQlhc3NlcnROdWxsKHJlZ2lzdHJ5LmdldEludHJvRm9yUHJvZHVjdChQUk9EVUNUX0lEKSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0SW50cm9Qcm9wZXJ0aWVzKGRlc2MpOwotCQkJZmFpbCgpOwkJCi0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewkJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2MKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgdGVzdEludHJvUHJvcGVydGllcyhJSW50cm9EZXNjcmlwdG9yIGRlc2MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChkZXNjLmdldElkKCkpOwotCQl0cnkgewotCQkJYXNzZXJ0Tm90TnVsbChkZXNjLmNyZWF0ZUludHJvKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEV4dGVuc2lvbklkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbklkKCkgewkJCi0JCXJldHVybiAibmV3SW50cm8xLnRlc3REeW5hbWljSW50cm9BZGRpdGlvbiI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEV4dGVuc2lvblBvaW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvblBvaW50KCkgewotCQlyZXR1cm4gSVdvcmtiZW5jaENvbnN0YW50cy5QTF9JTlRSTzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0SW5zdGFsbExvY2F0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluc3RhbGxMb2NhdGlvbigpIHsKLQkJcmV0dXJuICJkYXRhL29yZy5lY2xpcHNlLm5ld0ludHJvMSI7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuVUlUZXN0Q2FzZSNkb1NldFVwKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICAgICAgb2xkRGVzYyA9IFdvcmtiZW5jaC5nZXRJbnN0YW5jZSgpLmdldEludHJvRGVzY3JpcHRvcigpOwotICAgICAgICB3aW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuVUlUZXN0Q2FzZSNkb1RlYXJEb3duKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvVGVhckRvd24oKTsKLSAgICAgICAgV29ya2JlbmNoLmdldEluc3RhbmNlKCkuc2V0SW50cm9EZXNjcmlwdG9yKG9sZERlc2MpOwotICAgIH0gICAgCi0gICAgCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldE1hcmtlckNsYXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcmtlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnVpLmR5bmFtaWMuRHluYW1pY0ludHJvIjsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0tleXdvcmRUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9LZXl3b3JkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlZTgxNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL0tleXdvcmRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5LZXl3b3JkUmVnaXN0cnk7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgS2V5d29yZFRlc3RzIGV4dGVuZHMgRHluYW1pY1Rlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9LRVlXT1JEID0gImR5bmFtaWNLZXl3b3JkMSI7Ci0JcHVibGljIEtleXdvcmRUZXN0cyhTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZHMoKSB7Ci0JCUtleXdvcmRSZWdpc3RyeSByZWdpc3RyeSA9IEtleXdvcmRSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlhc3NlcnROdWxsKHJlZ2lzdHJ5LmdldEtleXdvcmRMYWJlbChJRF9LRVlXT1JEKSk7Ci0JCWdldEJ1bmRsZSgpOwotCQlTdHJpbmcgbGFiZWwgPSByZWdpc3RyeS5nZXRLZXl3b3JkTGFiZWwoSURfS0VZV09SRCk7Ci0JCWFzc2VydE5vdE51bGwobGFiZWwpOwotCQlhc3NlcnRFcXVhbHMoSURfS0VZV09SRCwgbGFiZWwpOwotCQlyZW1vdmVCdW5kbGUoKTsKLQkJYXNzZXJ0TnVsbChyZWdpc3RyeS5nZXRLZXl3b3JkTGFiZWwoSURfS0VZV09SRCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uSWQoKSB7Ci0JCXJldHVybiAibmV3S2V5d29yZDEudGVzdER5bmFtaWNLZXl3b3JkQWRkaXRpb24iOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBJV29ya2JlbmNoQ29uc3RhbnRzLlBMX0tFWVdPUkRTOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5zdGFsbExvY2F0aW9uKCkgewotCQlyZXR1cm4gImRhdGEvb3JnLmVjbGlwc2UubmV3S2V5d29yZDEiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9NYXJrZXJTdXBwb3J0VGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvTWFya2VyU3VwcG9ydFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMmFiMDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9NYXJrZXJTdXBwb3J0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuRmllbGRNYXJrZXJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlclN1cHBvcnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLlByb2JsZW1GaWx0ZXI7Ci0KLS8qKgotICogVGVzdCB0aGUgbG9hZGluZyBhbmQgdW5sb2FkaW5nIG9mIHRoZSBtYXJrZXIgc3VwcG9ydCBjb21wb25lbnRzLgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrZXJTdXBwb3J0VGVzdHMgZXh0ZW5kcyBEeW5hbWljVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSMSA9ICJmaWx0ZXIxIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTFRFUjIgPSAiZmlsdGVyMiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVIzID0gImZpbHRlcjMiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFlOQU1JQ19DQVRFR09SWSA9ICJkeW5hbWljQ2F0ZWdvcnkiOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX1BST0JMRU1fTUFSS0VSID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNUZXN0TWFya2VyIjsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9NQVJLRVIgPSAib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGVzdE5hbWUKLQkgKi8KLQlwdWJsaWMgTWFya2VyU3VwcG9ydFRlc3RzKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlcnMoKSB7Ci0JCWFzc2VydEZhbHNlKGhhc0ZpbHRlcihGSUxURVIxKSk7Ci0JCWFzc2VydEZhbHNlKGhhc0ZpbHRlcihGSUxURVIyKSk7Ci0JCWFzc2VydEZhbHNlKGhhc0ZpbHRlcihGSUxURVIzKSk7Ci0JCWdldEJ1bmRsZSgpOwotCQlhc3NlcnRUcnVlKGhhc0ZpbHRlcihGSUxURVIxKSk7Ci0JCWFzc2VydFRydWUoaGFzRmlsdGVyKEZJTFRFUjIpKTsKLQkJYXNzZXJ0VHJ1ZShoYXNGaWx0ZXIoRklMVEVSMykpOwotCQlyZW1vdmVCdW5kbGUoKTsKLQkJYXNzZXJ0RmFsc2UoaGFzRmlsdGVyKEZJTFRFUjEpKTsKLQkJYXNzZXJ0RmFsc2UoaGFzRmlsdGVyKEZJTFRFUjIpKTsKLQkJYXNzZXJ0RmFsc2UoaGFzRmlsdGVyKEZJTFRFUjMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFya2VyR3JvdXAoKSB7Ci0JCWFzc2VydEZhbHNlKGhhc01hcmtlckdyb3VwKCkpOwotCQlnZXRCdW5kbGUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNNYXJrZXJHcm91cCgpKTsKLQkJcmVtb3ZlQnVuZGxlKCk7Ci0JCWFzc2VydEZhbHNlKGhhc01hcmtlckdyb3VwKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXRlZ29yaWVzKCkgewotCQlhc3NlcnRGYWxzZShoYXNDYXRlZ29yeSgpKTsKLQkJZ2V0QnVuZGxlKCk7Ci0JCWFzc2VydFRydWUoaGFzQ2F0ZWdvcnkoKSk7Ci0JCXJlbW92ZUJ1bmRsZSgpOwotCQlhc3NlcnRGYWxzZShoYXNDYXRlZ29yeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGllcmFyY2hpZXMoKSB7Ci0JCWFzc2VydEZhbHNlKGhhc0hpZXJhcmNoeSgpKTsKLQkJZ2V0QnVuZGxlKCk7Ci0JCWFzc2VydFRydWUoaGFzSGllcmFyY2h5KCkpOwotCQlyZW1vdmVCdW5kbGUoKTsKLQkJYXNzZXJ0RmFsc2UoaGFzSGllcmFyY2h5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldE1hcmtlckNsYXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcmtlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnVpLmR5bmFtaWMubWFya2VyU3VwcG9ydC5EeW5hbWljVGVzdHNTdWJDYXRlZ29yeVByb3ZpZGVyIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlcmUgaXMgYSBoaWVyYXJjaHkgZm9yIHRoZSBkeW5hbWljIHR5cGUgb3IgaWYgaXQKLQkgKiBpcyB1c2luZyB0aGUgZGVmYXVsdC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc0hpZXJhcmNoeSgpIHsKLQkJcmV0dXJuIE1hcmtlclN1cHBvcnRSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFNvcnRlckZvcigKLQkJCQlEWU5BTUlDX1BST0JMRU1fTUFSS0VSKSAhPSBNYXJrZXJTdXBwb3J0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRTb3J0ZXJGb3IoUFJPQkxFTV9NQVJLRVIpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXJrZXJHcm91cCgpIHsKLQkJSXRlcmF0b3IgZ3JvdXBzID0gTWFya2VyU3VwcG9ydFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJLmdldE1hcmtlckdyb3VwcygpLml0ZXJhdG9yKCk7Ci0JCQotCQl3aGlsZSAoZ3JvdXBzLmhhc05leHQoKSkgewotCQkJRmllbGRNYXJrZXJHcm91cCBlbGVtZW50ID0gKEZpZWxkTWFya2VyR3JvdXApIGdyb3Vwcy5uZXh0KCk7Ci0JCQlpZihlbGVtZW50LmdldERlc2NyaXB0aW9uKCkuZXF1YWxzKCJEeW5hbWljIFRlc3QgR3JvdXBpbmciKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBhIGZpbHRlciBmb3IgdGhlIGR5bmFtaWMgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc0NhdGVnb3J5KCkgewotCQlyZXR1cm4gTWFya2VyU3VwcG9ydFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q2F0ZWdvcnkoCi0JCQkJRFlOQU1JQ19QUk9CTEVNX01BUktFUikgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlcmUgaXMgYSBmaWx0ZXIgZm9yIGlkLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzRmlsdGVyKFN0cmluZyBpZCkgewotCQlJdGVyYXRvciBmaWx0ZXJzID0gTWFya2VyU3VwcG9ydFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UmVnaXN0ZXJlZEZpbHRlcnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZmlsdGVycy5oYXNOZXh0KCkpIHsKLQkJCVByb2JsZW1GaWx0ZXIgZmlsdGVyID0gKFByb2JsZW1GaWx0ZXIpIGZpbHRlcnMubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhmaWx0ZXIuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEV4dGVuc2lvbklkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbklkKCkgewotCQlyZXR1cm4gIm5ld1Byb2JsZW1GaWx0ZXIudGVzdER5bmFtaWNGaWx0ZXJBZGRpdGlvbiI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0RXh0ZW5zaW9uUG9pbnQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBNYXJrZXJTdXBwb3J0UmVnaXN0cnkuTUFSS0VSX1NVUFBPUlQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0SW5zdGFsbExvY2F0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluc3RhbGxMb2NhdGlvbigpIHsKLQkJcmV0dXJuICJkYXRhL29yZy5lY2xpcHNlLm5ld01hcmtlclN1cHBvcnQiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldERlY2xhcmluZ05hbWVzcGFjZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWNsYXJpbmdOYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvTmV3V2l6YXJkVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvTmV3V2l6YXJkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczY2M1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL05ld1dpemFyZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLklXaXphcmRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLklXaXphcmREZXNjcmlwdG9yOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIE5ld1dpemFyZFRlc3RzIGV4dGVuZHMgRHluYW1pY1Rlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSAib3JnLmVjbGlwc2UubmV3TmV3V2l6YXJkMS5uZXdOZXdXaXphcmQxIjsKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTmV3V2l6YXJkVGVzdHMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5ld1dpemFyZFByb3BlcnRpZXMoKSB7Ci0JCUlXaXphcmRSZWdpc3RyeSByZWdpc3RyeSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TmV3V2l6YXJkUmVnaXN0cnkoKTsKLQkJYXNzZXJ0TnVsbChyZWdpc3RyeS5maW5kV2l6YXJkKFdJWkFSRF9JRCkpOwotCQlnZXRCdW5kbGUoKTsKLQkJSVdpemFyZERlc2NyaXB0b3Igd2l6YXJkID0gcmVnaXN0cnkuZmluZFdpemFyZChXSVpBUkRfSUQpOwotCQlhc3NlcnROb3ROdWxsKHdpemFyZCk7Ci0JCXRlc3ROZXdXaXphcmRQcm9wZXJ0aWVzKHdpemFyZCk7Ci0JCXJlbW92ZUJ1bmRsZSgpOwotCQlhc3NlcnROdWxsKHJlZ2lzdHJ5LmZpbmRXaXphcmQoV0laQVJEX0lEKSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0TmV3V2l6YXJkUHJvcGVydGllcyh3aXphcmQpOwotCQkJZmFpbCgpOwotCQl9Ci0JCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vbm8tb3AKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gd2l6YXJkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRlc3ROZXdXaXphcmRQcm9wZXJ0aWVzKElXaXphcmREZXNjcmlwdG9yIHdpemFyZCkgewotCQlhc3NlcnROb3ROdWxsKHdpemFyZC5nZXRJZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh3aXphcmQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWFzc2VydE5vdE51bGwod2l6YXJkLmdldEhlbHBIcmVmKCkpOwotCQlhc3NlcnROb3ROdWxsKHdpemFyZC5nZXREZXNjcmlwdGlvbkltYWdlKCkpOwotCQlhc3NlcnROb3ROdWxsKHdpemFyZC5nZXRJbWFnZURlc2NyaXB0b3IoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEV4dGVuc2lvbklkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbklkKCkgewkJCi0JCXJldHVybiAibmV3TmV3V2l6YXJkMS50ZXN0RHluYW1pY05ld1dpemFyZEFkZGl0aW9uIjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0RXh0ZW5zaW9uUG9pbnQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBJV29ya2JlbmNoQ29uc3RhbnRzLlBMX05FVzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0SW5zdGFsbExvY2F0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluc3RhbGxMb2NhdGlvbigpIHsKLQkJcmV0dXJuICJkYXRhL29yZy5lY2xpcHNlLm5ld05ld1dpemFyZDEiOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0TWFya2VyQ2xhc3MoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFya2VyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UudWkuZHluYW1pYy5EeW5hbWljV2l6YXJkIjsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL09iamVjdENvbnRyaWJ1dGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL09iamVjdENvbnRyaWJ1dGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWMzOGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9PYmplY3RDb250cmlidXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuT2JqZWN0QWN0aW9uQ29udHJpYnV0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlBvcHVwTWVudUV4dGVuZGVyOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIE9iamVjdENvbnRyaWJ1dGlvblRlc3RzIGV4dGVuZHMgRHluYW1pY1Rlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9JRCA9ICIjT0MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQUNUSU9OX0lEID0gIm9yZy5lY2xpcHNlLm5ld09DMSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdFUl9BQ1RJT05fSUQgPSAib3JnLmVjbGlwc2UubmV3T0MyIjsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoT2JqZWN0Q29udHJpYnV0aW9uVGVzdHMuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdGVzdE5hbWUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0Q29udHJpYnV0aW9uVGVzdHMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0RXh0ZW5zaW9uSWQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uSWQoKSB7Ci0JCXJldHVybiAibmV3T0MxLnRlc3REeW5hbWljT0NBZGRpdGlvbiI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEV4dGVuc2lvblBvaW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvblBvaW50KCkgewotCQlyZXR1cm4gSVdvcmtiZW5jaENvbnN0YW50cy5QTF9QT1BVUF9NRU5VOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRJbnN0YWxsTG9jYXRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5zdGFsbExvY2F0aW9uKCkgewkJCi0JCXJldHVybiAiZGF0YS9vcmcuZWNsaXBzZS5uZXdPQzEiOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Vmlld2VyQ29udHJpYnV0aW9ucygpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBvcGVuVGVzdFdpbmRvdyhJREUuUkVTT1VSQ0VfUEVSU1BFQ1RJVkVfSUQpOwotCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCU1lbnVNYW5hZ2VyIG1lbnUgPSBuZXcgTWVudU1hbmFnZXIoKTsKLQkJcmVzZXRWaWV3ZXJNZW51KG1lbnUpOwotCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSVNlbGVjdGlvblByb3ZpZGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBSYW5kb20oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJfQotCQkJCi0JCX07Ci0JCQotCQlQb3B1cE1lbnVFeHRlbmRlciBleHRlbmRlciA9IG5ldyBQb3B1cE1lbnVFeHRlbmRlcihHUk9VUF9JRCwgbWVudSwgcHJvdmlkZXIsIHBhcnQpOwotCQlleHRlbmRlci5tZW51QWJvdXRUb1Nob3cobWVudSk7Ci0JCQkJCQotCQlhc3NlcnROdWxsKG1lbnUuZmluZChWSUVXRVJfQUNUSU9OX0lEKSk7Ci0JCXJlc2V0Vmlld2VyTWVudShtZW51KTsKLQkJZ2V0QnVuZGxlKCk7Ci0JCQotCQlleHRlbmRlci5tZW51QWJvdXRUb1Nob3cobWVudSk7Ci0JCWFzc2VydE5vdE51bGwobWVudS5maW5kKFZJRVdFUl9BQ1RJT05fSUQpKTsKLQkJcmVzZXRWaWV3ZXJNZW51KG1lbnUpOwotCQlyZW1vdmVCdW5kbGUoKTsKLQkJCi0JCWV4dGVuZGVyLm1lbnVBYm91dFRvU2hvdyhtZW51KTsJCQotCQlhc3NlcnROdWxsKG1lbnUuZmluZChWSUVXRVJfQUNUSU9OX0lEKSk7CQotCQkKLQkJZXh0ZW5kZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbWVudQotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldFZpZXdlck1lbnUoTWVudU1hbmFnZXIgbWVudSkgewotCQltZW51LnJlbW92ZUFsbCgpOwotCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKEdST1VQX0lEKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9iamVjdENvbnRyaWJ0aW9ucygpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBvcGVuVGVzdFdpbmRvdyhJREUuUkVTT1VSQ0VfUEVSU1BFQ1RJVkVfSUQpOwotCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCU9iamVjdEFjdGlvbkNvbnRyaWJ1dG9yTWFuYWdlciBtYW5hZ2VyID0gT2JqZWN0QWN0aW9uQ29udHJpYnV0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKTsKLQkJSU1lbnVNYW5hZ2VyIG1lbnUgPSBuZXcgTWVudU1hbmFnZXIoKTsKLQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IElTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgUmFuZG9tKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCX0KLQkJCQotCQl9OwotCi0JCW1hbmFnZXIuY29udHJpYnV0ZU9iamVjdEFjdGlvbnMocGFydCwgbWVudSwgcHJvdmlkZXIpOwkJCi0JCWFzc2VydE51bGwobWVudS5maW5kKE9CSkVDVF9BQ1RJT05fSUQpKTsKLQkJbWVudS5yZW1vdmVBbGwoKTsKLQkJZ2V0QnVuZGxlKCk7Ci0JCQotCQltYW5hZ2VyLmNvbnRyaWJ1dGVPYmplY3RBY3Rpb25zKHBhcnQsIG1lbnUsIHByb3ZpZGVyKTsKLQkJYXNzZXJ0Tm90TnVsbChtZW51LmZpbmQoT0JKRUNUX0FDVElPTl9JRCkpOwotCQltZW51LnJlbW92ZUFsbCgpOwotCQlyZW1vdmVCdW5kbGUoKTsKLQkJCi0JCW1hbmFnZXIuY29udHJpYnV0ZU9iamVjdEFjdGlvbnMocGFydCwgbWVudSwgcHJvdmlkZXIpOwkJCi0JCWFzc2VydE51bGwobWVudS5maW5kKE9CSkVDVF9BQ1RJT05fSUQpKTsKLQkJbWVudS5yZW1vdmVBbGwoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldE1hcmtlckNsYXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcmtlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnVpLmR5bmFtaWMuTW9ja09iamVjdEFjdGlvbkRlbGVnYXRlIjsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL1BlcnNwZWN0aXZlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvUGVyc3BlY3RpdmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjkxMWRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvUGVyc3BlY3RpdmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotCi0vKioKLSAqIFRlc3RzIHRvIGNoZWNrIHRoZSBhZGRpdGlvbiBvZiBhIG5ldyBwZXJzcGVjdGl2ZSBvbmNlIHRoZSBwZXJzcGVjdGl2ZQotICogcmVnaXN0cnkgaXMgbG9hZGVkLgotICovCi1wdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVUZXN0cyBleHRlbmRzIER5bmFtaWNUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU1BFQ1RJVkVfSUQgPSAib3JnLmVjbGlwc2UubmV3UGVyc3BlY3RpdmUxLm5ld1BlcnNwZWN0aXZlMSI7Ci0KLQlwdWJsaWMgUGVyc3BlY3RpdmVUZXN0cyhTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBkZXNjcmlwdG9yIGlzIGFkZGVkIGFuZCByZW1vdmVkIHdpdGggYnVuZGxlCi0JICogbG9hZGluZy91bmxvYWRpbmcuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZpbmRQZXJzcGVjdGl2ZUluUmVnaXN0cnkoKSB7Ci0JCUlQZXJzcGVjdGl2ZVJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpOwotCi0JCWFzc2VydE51bGwocmVnLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChQRVJTUEVDVElWRV9JRCkpOwotCi0JCWdldEJ1bmRsZSgpOyAvLyBlbnN1cmUgdGhlIGJ1bmRsZSBpcyBsb2FkZWQKLQkJYXNzZXJ0Tm90TnVsbChyZWcuZmluZFBlcnNwZWN0aXZlV2l0aElkKFBFUlNQRUNUSVZFX0lEKSk7Ci0KLQkJcmVtb3ZlQnVuZGxlKCk7IC8vIHVubG9hZCB0aGUgYnVuZGxlCi0KLQkJYXNzZXJ0TnVsbChyZWcuZmluZFBlcnNwZWN0aXZlV2l0aElkKFBFUlNQRUNUSVZFX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCB0aGUgcGVyc3BlY3RpdmUgaXMgY2xvc2VkIGlmIGl0IGlzIHRoZSBjdXJyZW50bHkgYWN0aXZlCi0JICogcGVyc3BlY3RpdmUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFBlcnNwZWN0aXZlQ2xvc2UxKCkgewotCQlJUGVyc3BlY3RpdmVSZWdpc3RyeSByZWcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLQotCQlnZXRCdW5kbGUoKTsKLQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjID0gcmVnLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChQRVJTUEVDVElWRV9JRCk7Ci0JCWFzc2VydE5vdE51bGwoZGVzYyk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBvcGVuVGVzdFdpbmRvdyhJREUuUkVTT1VSQ0VfUEVSU1BFQ1RJVkVfSUQpOwotCQl3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpLnNldFBlcnNwZWN0aXZlKGRlc2MpOwotCi0JCXJlbW92ZUJ1bmRsZSgpOwotCQlhc3NlcnROdWxsKCgoV29ya2JlbmNoUGFnZSkgd2luZG93LmdldEFjdGl2ZVBhZ2UoKSkKLQkJCQkuZmluZFBlcnNwZWN0aXZlKGRlc2MpKTsKLQkJYXNzZXJ0RmFsc2Uod2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRQZXJzcGVjdGl2ZSgpLmdldElkKCkuZXF1YWxzKAotCQkJCWRlc2MuZ2V0SWQoKSkpOwotCQlhc3NlcnRFcXVhbHMoSURFLlJFU09VUkNFX1BFUlNQRUNUSVZFX0lELCB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJLmdldFBlcnNwZWN0aXZlKCkuZ2V0SWQoKSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCB0aGUgcGVyc3BlY3RpdmUgaXMgY2xvc2VkIGlmIGl0IGlzIG5vdCB0aGUgY3VycmVudGx5IGFjdGl2ZQotCSAqIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQZXJzcGVjdGl2ZUNsb3NlMigpIHsKLQkJSVBlcnNwZWN0aXZlUmVnaXN0cnkgcmVnID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCk7Ci0KLQkJZ2V0QnVuZGxlKCk7Ci0JCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYyA9IHJlZy5maW5kUGVyc3BlY3RpdmVXaXRoSWQoUEVSU1BFQ1RJVkVfSUQpOwotCQlhc3NlcnROb3ROdWxsKGRlc2MpOwotCi0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coUEVSU1BFQ1RJVkVfSUQpOwotCQl3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpLnNldFBlcnNwZWN0aXZlKAotCQkJCXJlZy5maW5kUGVyc3BlY3RpdmVXaXRoSWQoSURFLlJFU09VUkNFX1BFUlNQRUNUSVZFX0lEKSk7Ci0KLQkJcmVtb3ZlQnVuZGxlKCk7Ci0JCWFzc2VydE51bGwoKChXb3JrYmVuY2hQYWdlKSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpKQotCQkJCS5maW5kUGVyc3BlY3RpdmUoZGVzYykpOwotCi0JCWFzc2VydEZhbHNlKHdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0UGVyc3BlY3RpdmUoKS5nZXRJZCgpLmVxdWFscygKLQkJCQlQRVJTUEVDVElWRV9JRCkpOwotCQlhc3NlcnRFcXVhbHMoSURFLlJFU09VUkNFX1BFUlNQRUNUSVZFX0lELCB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJLmdldFBlcnNwZWN0aXZlKCkuZ2V0SWQoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0SW5zdGFsbExvY2F0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluc3RhbGxMb2NhdGlvbigpIHsKLQkJcmV0dXJuICJkYXRhL29yZy5lY2xpcHNlLm5ld1BlcnNwZWN0aXZlMSI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0RXh0ZW5zaW9uUG9pbnQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBJV29ya2JlbmNoQ29uc3RhbnRzLlBMX1BFUlNQRUNUSVZFUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRFeHRlbnNpb25JZCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb25JZCgpIHsKLQkJcmV0dXJuICJuZXdQZXJzcGVjdGl2ZTEudGVzdER5bmFtaWNQZXJzcGVjdGl2ZUFkZGl0aW9uIjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRNYXJrZXJDbGFzcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS51aS5keW5hbWljLkR5bmFtaWNQZXJzcGVjdGl2ZSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9QcmVmZXJlbmNlUGFnZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL1ByZWZlcmVuY2VQYWdlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiNDcxNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL1ByZWZlcmVuY2VQYWdlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuV29ya2JlbmNoUHJlZmVyZW5jZU5vZGU7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVBhZ2VUZXN0cyBleHRlbmRzIER5bmFtaWNUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGVzdE5hbWUKLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVBhZ2VUZXN0cyhTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZU1hbmFnZXIgcHJlZmVyZW5jZU1hbmFnZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCWFzc2VydE51bGwocHJlZmVyZW5jZU1hbmFnZXIuZmluZCgiZHluYW1pYy5wYXJlbnRQYWdlIikpOwotCQlhc3NlcnROdWxsKHByZWZlcmVuY2VNYW5hZ2VyLmZpbmQoImR5bmFtaWMucGFyZW50UGFnZS9keW5hbWljLmNoaWxkUGFnZSIpKTsKLQkJZ2V0QnVuZGxlKCk7Ci0JCVdvcmtiZW5jaFByZWZlcmVuY2VOb2RlIG5vZGUgPSAoV29ya2JlbmNoUHJlZmVyZW5jZU5vZGUpIHByZWZlcmVuY2VNYW5hZ2VyLmZpbmQoImR5bmFtaWMucGFyZW50UGFnZSIpOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQkvL21ha2Ugc3VyZSB3ZSBoYXZlIGEgcGFnZQotCQlub2RlLmNyZWF0ZVBhZ2UoKTsKLQkJbm9kZSA9IChXb3JrYmVuY2hQcmVmZXJlbmNlTm9kZSkgcHJlZmVyZW5jZU1hbmFnZXIuZmluZCgiZHluYW1pYy5wYXJlbnRQYWdlL2R5bmFtaWMuY2hpbGRQYWdlIik7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCS8vbWFrZSBzdXJlIHdlIGhhdmUgYSBwYWdlCi0JCW5vZGUuY3JlYXRlUGFnZSgpOwotCQlyZW1vdmVCdW5kbGUoKTsKLQkJYXNzZXJ0TnVsbChwcmVmZXJlbmNlTWFuYWdlci5maW5kKCJkeW5hbWljLnBhcmVudFBhZ2UiKSk7Ci0JCWFzc2VydE51bGwocHJlZmVyZW5jZU1hbmFnZXIuZmluZCgiZHluYW1pYy5wYXJlbnRQYWdlL2R5bmFtaWMuY2hpbGRQYWdlIikpOwkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRFeHRlbnNpb25JZCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb25JZCgpIHsKLQkJcmV0dXJuICJuZXdQcmVmZXJlbmNlUGFnZTEudGVzdER5bmFtaWNQcmVmZXJlbmNlUGFnZUFkZGl0aW9uIjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0RXh0ZW5zaW9uUG9pbnQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBJV29ya2JlbmNoQ29uc3RhbnRzLlBMX1BSRUZFUkVOQ0VTOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRJbnN0YWxsTG9jYXRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5zdGFsbExvY2F0aW9uKCkgewotCQlyZXR1cm4gImRhdGEvb3JnLmVjbGlwc2UubmV3UHJlZmVyZW5jZVBhZ2UxIjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldE1hcmtlckNsYXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcmtlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnVpLmR5bmFtaWMuRHluYW1pY1ByZWZlcmVuY2VQYWdlIjsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL1Byb3BlcnR5UGFnZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL1Byb3BlcnR5UGFnZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZmRmNDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9Qcm9wZXJ0eVBhZ2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlByb3BlcnR5UGFnZUNvbnRyaWJ1dG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlByb3BlcnR5UGFnZU1hbmFnZXI7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlQYWdlVGVzdHMgZXh0ZW5kcyBEeW5hbWljVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZUEFHRSA9ICJkeW5hbWljUHJvcGVydHlQYWdlMSI7Ci0JLyoqCi0JICogQHBhcmFtIHRlc3ROYW1lCi0JICovCi0JcHVibGljIFByb3BlcnR5UGFnZVRlc3RzKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5UGFnZUNvdW50KCkgewotCQlQcm9wZXJ0eVBhZ2VDb250cmlidXRvck1hbmFnZXIgbWFuYWdlciA9IFByb3BlcnR5UGFnZUNvbnRyaWJ1dG9yTWFuYWdlci5nZXRNYW5hZ2VyKCk7Ci0JCWludCBzaXplID0gbWFuYWdlci5nZXRDb250cmlidXRvcnMoKS5zaXplKCk7Ci0JCWdldEJ1bmRsZSgpOwotCQlhc3NlcnRFcXVhbHMoc2l6ZSArIDEsIG1hbmFnZXIuZ2V0Q29udHJpYnV0b3JzKCkuc2l6ZSgpKTsKLQkJcmVtb3ZlQnVuZGxlKCk7Ci0JCWFzc2VydEVxdWFscyhzaXplLCBtYW5hZ2VyLmdldENvbnRyaWJ1dG9ycygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eVBhZ2VDb250cmlidXRpb24oKSB7Ci0JCVByb3BlcnR5UGFnZUNvbnRyaWJ1dG9yTWFuYWdlciBjTWFuYWdlciA9IFByb3BlcnR5UGFnZUNvbnRyaWJ1dG9yTWFuYWdlci5nZXRNYW5hZ2VyKCk7Ci0JCVByb3BlcnR5UGFnZU1hbmFnZXIgbWFuYWdlcjsgCi0JCUlBZGFwdGFibGUgYWRhcHRhYmxlID0gbmV3IElBZGFwdGFibGUoKSB7Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JCQkgKi8KLQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gT2JqZWN0LmNsYXNzKQotCQkJCQlyZXR1cm4gdGhpczsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX19OwotCQkJCi0JCWNNYW5hZ2VyLmNvbnRyaWJ1dGUobWFuYWdlciA9IG5ldyBQcm9wZXJ0eVBhZ2VNYW5hZ2VyKCksIGFkYXB0YWJsZSk7Ci0JCWFzc2VydE51bGwobWFuYWdlci5maW5kKFBST1BFUlRZUEFHRSkpOwotCQlnZXRCdW5kbGUoKTsKLQkJY01hbmFnZXIuY29udHJpYnV0ZShtYW5hZ2VyID0gbmV3IFByb3BlcnR5UGFnZU1hbmFnZXIoKSwgYWRhcHRhYmxlKTsKLQkJSVByZWZlcmVuY2VOb2RlIHJlc3VsdCA9IG1hbmFnZXIuZmluZChQUk9QRVJUWVBBR0UpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCXJlc3VsdC5jcmVhdGVQYWdlKCk7IC8vIG11Y2sgYXJvdW5kIGFuZCBlbnN1cmUgd2UndmUgY3JlYXRlZCBzb21lIHBvdGVudGlhbCBnYXJiYWdlCi0JCXJlc3VsdC5kaXNwb3NlUmVzb3VyY2VzKCk7Ci0JCXJlbW92ZUJ1bmRsZSgpOwotCQljTWFuYWdlci5jb250cmlidXRlKG1hbmFnZXIgPSBuZXcgUHJvcGVydHlQYWdlTWFuYWdlcigpLCBhZGFwdGFibGUpOwotCQlhc3NlcnROdWxsKG1hbmFnZXIuZmluZChQUk9QRVJUWVBBR0UpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEV4dGVuc2lvbklkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbklkKCkgewotCQlyZXR1cm4gIm5ld1Byb3BlcnR5UGFnZTEudGVzdER5bmFtaWNQcm9wZXJ0eVBhZ2VBZGRpdGlvbiI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEV4dGVuc2lvblBvaW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvblBvaW50KCkgewotCQlyZXR1cm4gSVdvcmtiZW5jaENvbnN0YW50cy5QTF9QUk9QRVJUWV9QQUdFUzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0SW5zdGFsbExvY2F0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluc3RhbGxMb2NhdGlvbigpIHsKLQkJcmV0dXJuICJkYXRhL29yZy5lY2xpcHNlLm5ld1Byb3BlcnR5UGFnZTEiOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRNYXJrZXJDbGFzcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS51aS5keW5hbWljLkR5bmFtaWNQcm9wZXJ0eVBhZ2UiOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvU3RhcnR1cFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL1N0YXJ0dXBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjAwODE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvU3RhcnR1cFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFydHVwVGVzdHMgZXh0ZW5kcyBEeW5hbWljVGVzdENhc2UgewotCS8qKgotCSAqIEBwYXJhbSB0ZXN0TmFtZQotCSAqLwotCXB1YmxpYyBTdGFydHVwVGVzdHMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0byBlbnN1cmUgdGhhdCB0aGUgSVN0YXJ0dXAgaW1wbGVtZW50YXRpb24gaW4gdGhlIGJ1bmRsZSBpcyBydW4KLQkgKiB3aGVuIHRoZSBidW5kbGUgaXMgbG9hZGVkLgotCSAqIAotCSAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLQkgKiBAdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhcnR1cFJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLAotCQkJU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sCi0JCQlJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSgpOwotCQlDbGFzcyBjbGF6eiA9IGJ1bmRsZS5sb2FkQ2xhc3MoZ2V0TWFya2VyQ2xhc3MoKSk7Ci0JCWFzc2VydE5vdE51bGwoY2xhenopOwotCQlGaWVsZCBmaWVsZCA9IGNsYXp6LmdldERlY2xhcmVkRmllbGQoImhpc3RvcnkiKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWVsZCk7Ci0JCWFzc2VydFRydWUoKGZpZWxkLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuU1RBVElDKSAhPSAwKTsKLQkJLy8gaWYgdGhlIHN0YXJ0dXAgY29kZSBoYXMgcnVuIHRoZW4gdGhpcyB3aWxsIG5vdCBiZSBudWxsIC0gdGhlIGVhcmx5Ci0JCS8vIHN0YXJ0dXAgbWV0aG9kIHNldHMgdGhpcwotCQlhc3NlcnROb3ROdWxsKGZpZWxkLmdldChudWxsKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0RXh0ZW5zaW9uSWQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uSWQoKSB7Ci0JCXJldHVybiAibmV3U3RhcnR1cDEudGVzdER5bmFtaWNTdGFydHVwQWRkaXRpb24iOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEV4dGVuc2lvblBvaW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvblBvaW50KCkgewotCQlyZXR1cm4gSVdvcmtiZW5jaENvbnN0YW50cy5QTF9TVEFSVFVQOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEluc3RhbGxMb2NhdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCXJldHVybiAiZGF0YS9vcmcuZWNsaXBzZS5uZXdTdGFydHVwMSI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0TWFya2VyQ2xhc3MoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFya2VyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UudWkuZHluYW1pYy5EeW5hbWljU3RhcnR1cCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9UZXN0SW5zdGFsbFV0aWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvVGVzdEluc3RhbGxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NDUyYWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9keW5hbWljcGx1Z2lucy9UZXN0SW5zdGFsbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2luczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuRnJhbWV3b3JrRXZlbnQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkZyYW1ld29ya0xpc3RlbmVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLlBhY2thZ2VBZG1pbjsKLQotcHVibGljIGNsYXNzIFRlc3RJbnN0YWxsVXRpbCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbnRleHQoQnVuZGxlQ29udGV4dCBuZXdDb250ZXh0KSB7Ci0gICAgICAgIGNvbnRleHQgPSBuZXdDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnVuZGxlIGluc3RhbGxCdW5kbGUoU3RyaW5nIHBsdWdpbkxvY2F0aW9uKQotICAgICAgICAgICAgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgQnVuZGxlIHRhcmdldCA9IGNvbnRleHQuaW5zdGFsbEJ1bmRsZShwbHVnaW5Mb2NhdGlvbik7Ci0gICAgICAgIGludCBzdGF0ZSA9IHRhcmdldC5nZXRTdGF0ZSgpOwotICAgICAgICBpZiAoc3RhdGUgIT0gQnVuZGxlLklOU1RBTExFRCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkJ1bmRsZSAiICsgdGFyZ2V0Ci0gICAgICAgICAgICAgICAgICAgICsgIiBpcyBpbiBhIHdyb25nIHN0YXRlOiAiICsgc3RhdGUpOwotICAgICAgICByZWZyZXNoUGFja2FnZXMobmV3IEJ1bmRsZVtdIHsgdGFyZ2V0IH0pOwotICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bmluc3RhbGxCdW5kbGUoQnVuZGxlIHRhcmdldCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRhcmdldC51bmluc3RhbGwoKTsKLSAgICAgICAgcmVmcmVzaFBhY2thZ2VzKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUGFja2FnZXMoQnVuZGxlW10gYnVuZGxlcykgewotICAgICAgICBTZXJ2aWNlUmVmZXJlbmNlIHBhY2thZ2VBZG1pblJlZiA9IGNvbnRleHQKLSAgICAgICAgICAgICAgICAuZ2V0U2VydmljZVJlZmVyZW5jZShQYWNrYWdlQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgUGFja2FnZUFkbWluIHBhY2thZ2VBZG1pbiA9IG51bGw7Ci0gICAgICAgIGlmIChwYWNrYWdlQWRtaW5SZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFja2FnZUFkbWluID0gKFBhY2thZ2VBZG1pbikgY29udGV4dC5nZXRTZXJ2aWNlKHBhY2thZ2VBZG1pblJlZik7Ci0gICAgICAgICAgICBpZiAocGFja2FnZUFkbWluID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbltdIGZsYWcgPSBuZXcgYm9vbGVhbltdIHsgZmFsc2UgfTsKLSAgICAgICAgRnJhbWV3b3JrTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRnJhbWV3b3JrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBmcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkgPT0gRnJhbWV3b3JrRXZlbnQuUEFDS0FHRVNfUkVGUkVTSEVEKQotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGZsYWcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdbMF0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZy5ub3RpZnlBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBjb250ZXh0LmFkZEZyYW1ld29ya0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgcGFja2FnZUFkbWluLnJlZnJlc2hQYWNrYWdlcyhidW5kbGVzKTsKLSAgICAgICAgc3luY2hyb25pemVkIChmbGFnKSB7Ci0gICAgICAgICAgICB3aGlsZSAoIWZsYWdbMF0pIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmbGFnLndhaXQoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRleHQucmVtb3ZlRnJhbWV3b3JrTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBjb250ZXh0LnVuZ2V0U2VydmljZShwYWNrYWdlQWRtaW5SZWYpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvVmlld1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2R5bmFtaWNwbHVnaW5zL1ZpZXdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTRmN2U4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZHluYW1pY3BsdWdpbnMvVmlld1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSUNvbW1hbmRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuVmlld0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuVmlld1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmxlYWtzLkxlYWtUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5JU3RpY2t5Vmlld0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuSVZpZXdDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5JVmlld0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuSVZpZXdSZWdpc3RyeTsKLQotLyoqCi0gKiBUZXN0cyB0byBlbnN1cmUgdGhlIGFkZGl0aW9uIG9mIG5ldyB2aWV3cyB3aXRoIGR5bmFtaWMgcGx1Zy1pbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3VGVzdHMgZXh0ZW5kcyBEeW5hbWljVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUQxID0gIm9yZy5lY2xpcHNlLm5ld1ZpZXcxLm5ld1ZpZXcxIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRDIgPSAib3JnLmVjbGlwc2UubmV3VmlldzEubmV3VmlldzIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9JRCA9ICJvcmcuZWNsaXBzZS5uZXdWaWV3MS5uZXdDYXRlZ29yeTEiOwotICAgIAotCXB1YmxpYyBWaWV3VGVzdHMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgdGVzdFZpZXdDbG9zdXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG9wZW5UZXN0V2luZG93KElERS5SRVNPVVJDRV9QRVJTUEVDVElWRV9JRCk7Ci0JCWdldEJ1bmRsZSgpOwotCQkJCQotCQlSZWZlcmVuY2VRdWV1ZSBxdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOwotCQlJVmlld1BhcnQgcGFydCA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuc2hvd1ZpZXcoVklFV19JRDEpOwotCQkvLyB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSB2aWV3IGlzIGNsb3NlZCBpbiBhbGwgb3BlbiBwZXJzcGVjdGl2ZXMgYnV0IHRoaXMgaXMgbm90IGN1cnJlbnRseSBwb3NzaWJsZS4KLQkJLy8gd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5zZXRQZXJzcGVjdGl2ZShXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKS5maW5kUGVyc3BlY3RpdmVXaXRoSWQoRW1wdHlQZXJzcGVjdGl2ZS5QRVJTUF9JRDIpKTsKLQkJV2Vha1JlZmVyZW5jZSByZWYgPSBuZXcgV2Vha1JlZmVyZW5jZShwYXJ0LCBxdWV1ZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFydCk7Ci0gICAgICAgIHBhcnQgPSBudWxsOyAvL251bGwgdGhlIHJlZmVyZW5jZQotCi0JCXJlbW92ZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJTGVha1Rlc3RzLmNoZWNrUmVmKHF1ZXVlLCByZWYpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gCi0JCQotICAgICAgICBhc3NlcnROdWxsKHdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZmluZFZpZXcoVklFV19JRDEpKTsJCQotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0byBlbnN1cmUgdGhhdCB0aGUgc2hvd1ZpZXcgaGFuZGxlciBpcyByZW1vdmVkIHdoZW4gdGhlIHBsdWdpbiBpcyB1bmxvYWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlbW92YWwoKSB7Ci0gICAgICAgIElWaWV3UmVnaXN0cnkgcmVnaXN0cnkgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFZpZXdSZWdpc3RyeSgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbChyZWdpc3RyeS5maW5kKFZJRVdfSUQxKSk7Ci0gICAgICAgIGdldEJ1bmRsZSgpOwotICAgICAgICBWaWV3RGVzY3JpcHRvciBkZXNjID0gKFZpZXdEZXNjcmlwdG9yKSByZWdpc3RyeS5maW5kKFZJRVdfSUQxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjKTsKLQkJZmluYWwgSUNvbW1hbmRTZXJ2aWNlIGNvbW1hbmRTZXJ2aWNlID0gKElDb21tYW5kU2VydmljZSkgZldvcmtiZW5jaC5nZXRBZGFwdGVyKElDb21tYW5kU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGZpbmFsIENvbW1hbmQgY29tbWFuZCA9IGNvbW1hbmRTZXJ2aWNlLmdldENvbW1hbmQoZGVzYy5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb21tYW5kLmlzSGFuZGxlZCgpKTsKLSAgICAgICAgcmVtb3ZlQnVuZGxlKCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNvbW1hbmQuaXNIYW5kbGVkKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Vmlld1dpdGhvdXRDYXRlZ29yeSgpIHsKLSAgICAJCUlWaWV3UmVnaXN0cnkgcmVnaXN0cnkgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFZpZXdSZWdpc3RyeSgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZWdpc3RyeS5maW5kKFZJRVdfSUQyKSk7Ci0JCWdldEJ1bmRsZSgpOwotCQlJVmlld0Rlc2NyaXB0b3IgZGVzYyA9IHJlZ2lzdHJ5LmZpbmQoVklFV19JRDIpOwotCQlhc3NlcnROb3ROdWxsKGRlc2MpOwotCSAgICAKLQkJdGVzdFZpZXdQcm9wZXJ0aWVzKGRlc2MpOwotCQlyZW1vdmVCdW5kbGUoKTsJCi0JCWFzc2VydE51bGwocmVnaXN0cnkuZmluZChWSUVXX0lEMikpOwotCQl0cnkgewotCQkJdGVzdFZpZXdQcm9wZXJ0aWVzKGRlc2MpOwotCQkJZmFpbCgpOwkJCi0JCX0KLQkJY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewkKLQkJCS8vIG5vLW9wCi0JCX0KLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Vmlld1dpdGhDYXRlZ29yeSgpIHsKLQkJSVZpZXdSZWdpc3RyeSByZWdpc3RyeSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Vmlld1JlZ2lzdHJ5KCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlZ2lzdHJ5LmZpbmQoVklFV19JRDEpKTsKLQkJZ2V0QnVuZGxlKCk7Ci0JCUlWaWV3RGVzY3JpcHRvciBkZXNjID0gcmVnaXN0cnkuZmluZChWSUVXX0lEMSk7Ci0JCWFzc2VydE5vdE51bGwoZGVzYyk7Ci0JICAgIAotCQl0ZXN0Vmlld1Byb3BlcnRpZXMoZGVzYyk7Ci0JCXJlbW92ZUJ1bmRsZSgpOwkKLQkJYXNzZXJ0TnVsbChyZWdpc3RyeS5maW5kKFZJRVdfSUQxKSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0Vmlld1Byb3BlcnRpZXMoZGVzYyk7Ci0JCQlmYWlsKCk7CQkKLQkJfQotCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CQotCQkJLy8gbm8tb3AKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3RpY2t5Vmlld1Byb3BlcnRpZXMoKSB7Ci0JCVZpZXdSZWdpc3RyeSByZWdpc3RyeSA9IChWaWV3UmVnaXN0cnkpV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRWaWV3UmVnaXN0cnkoKTsKLQkJSVN0aWNreVZpZXdEZXNjcmlwdG9yIFtdIGRlc2NzID0gcmVnaXN0cnkuZ2V0U3RpY2t5Vmlld3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RmFsc2UoVklFV19JRDEuZXF1YWxzKGRlc2NzW2ldLmdldElkKCkpKTsKLQkJfQotCQkKLQkJZ2V0QnVuZGxlKCk7Ci0JCQotCQlkZXNjcyA9IHJlZ2lzdHJ5LmdldFN0aWNreVZpZXdzKCk7Ci0JCUlTdGlja3lWaWV3RGVzY3JpcHRvciBkZXNjID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFZJRVdfSUQxLmVxdWFscyhkZXNjc1tpXS5nZXRJZCgpKSkgewotCQkJCWRlc2MgPSBkZXNjc1tpXTsKLQkJCQlicmVhazsKLQkJCX0JCQkJCQotCQl9Ci0JCWFzc2VydE5vdE51bGwoZGVzYyk7Ci0JCXRlc3RTdGlja3lWaWV3UHJvcGVydGllcyhkZXNjKTsKLQkJcmVtb3ZlQnVuZGxlKCk7CQotCQkKLQkJZGVzY3MgPSByZWdpc3RyeS5nZXRTdGlja3lWaWV3cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRGYWxzZShWSUVXX0lEMS5lcXVhbHMoZGVzY3NbaV0uZ2V0SWQoKSkpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJdGVzdFN0aWNreVZpZXdQcm9wZXJ0aWVzKGRlc2MpOwotCQkJZmFpbCgpOwkJCQotCQl9Ci0JCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsJCi0JCQkvLyBuby1vcAotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRlc3RTdGlja3lWaWV3UHJvcGVydGllcyhJU3RpY2t5Vmlld0Rlc2NyaXB0b3IgZGVzYykgewotCQlhc3NlcnROb3ROdWxsKGRlc2MuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGRlc2MuaXNNb3ZlYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVzYy5pc0Nsb3NlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKElQYWdlTGF5b3V0LkJPVFRPTSwgZGVzYy5nZXRMb2NhdGlvbigpKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXRlZ29yeVZpZXdDb250YWlubWVudFByb3BlcnRpZXMoKSB7Ci0JCVZpZXdSZWdpc3RyeSByZWdpc3RyeSA9IChWaWV3UmVnaXN0cnkpV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRWaWV3UmVnaXN0cnkoKTsKLQkJCi0JCWFzc2VydE51bGwocmVnaXN0cnkuZmluZChWSUVXX0lEMSkpOwotCQlhc3NlcnROdWxsKHJlZ2lzdHJ5LmZpbmRDYXRlZ29yeShDQVRFR09SWV9JRCkpOwotCi0JCWdldEJ1bmRsZSgpOwotCQkKLQkJSVZpZXdEZXNjcmlwdG9yIGRlc2MgPSByZWdpc3RyeS5maW5kKFZJRVdfSUQxKTsKLQkJYXNzZXJ0Tm90TnVsbChkZXNjKTsJICAgIAotCQlJVmlld0NhdGVnb3J5IGNhdGVnb3J5ID0gcmVnaXN0cnkuZmluZENhdGVnb3J5KENBVEVHT1JZX0lEKTsKLQkJYXNzZXJ0Tm90TnVsbChjYXRlZ29yeSk7Ci0JCQotCQl0ZXN0Q2F0ZWdvcnlQcm9wZXJ0aWVzKGNhdGVnb3J5KTsKLQkJYXNzZXJ0VHJ1ZShjYXRlZ29yeS5nZXRWaWV3cygpWzBdID09IGRlc2MpOwotCi0JCXJlbW92ZUJ1bmRsZSgpOwkKLQkJYXNzZXJ0TnVsbChyZWdpc3RyeS5maW5kKFZJRVdfSUQxKSk7Ci0JCWFzc2VydE51bGwocmVnaXN0cnkuZmluZENhdGVnb3J5KENBVEVHT1JZX0lEKSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0Q2F0ZWdvcnlQcm9wZXJ0aWVzKGNhdGVnb3J5KTsKLQkJCWZhaWwoKTsKLQkJfQotCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CQotCQkJLy8gbm8tb3AKLQkJfQotCQotCX0JCi0JCi0JLyoqCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHRlc3RDYXRlZ29yeVByb3BlcnRpZXMoSVZpZXdDYXRlZ29yeSBkZXNjKSB7Ci0JCWFzc2VydE5vdE51bGwoZGVzYy5nZXRJZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChkZXNjLmdldExhYmVsKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZGVzYy5nZXRWaWV3cygpLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2MKLQkgKi8KLQlwcml2YXRlIHZvaWQgdGVzdFZpZXdQcm9wZXJ0aWVzKElWaWV3RGVzY3JpcHRvciBkZXNjKSB7Ci0JCWFzc2VydE5vdE51bGwoZGVzYy5nZXRJZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChkZXNjLmdldExhYmVsKCkpOwotCQlhc3NlcnROb3ROdWxsKGRlc2MuZ2V0SW1hZ2VEZXNjcmlwdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKGRlc2MuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0RXh0ZW5zaW9uSWQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uSWQoKSB7Ci0JCXJldHVybiAibmV3VmlldzEudGVzdER5bmFtaWNWaWV3QWRkaXRpb24iOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmR5bmFtaWNwbHVnaW5zLkR5bmFtaWNUZXN0Q2FzZSNnZXRFeHRlbnNpb25Qb2ludCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb25Qb2ludCgpIHsKLQkJcmV0dXJuIElXb3JrYmVuY2hDb25zdGFudHMuUExfVklFV1M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY3BsdWdpbnMuRHluYW1pY1Rlc3RDYXNlI2dldEluc3RhbGxMb2NhdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCXJldHVybiAiZGF0YS9vcmcuZWNsaXBzZS5uZXdWaWV3MSI7Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljcGx1Z2lucy5EeW5hbWljVGVzdENhc2UjZ2V0TWFya2VyQ2xhc3MoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFya2VyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UudWkuZHluYW1pYy5EeW5hbWljVmlldyI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9lbmNvZGluZy9FbmNvZGluZ1Rlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2VuY29kaW5nL0VuY29kaW5nVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkODg1NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2VuY29kaW5nL0VuY29kaW5nVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFbmNvZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5taXNjLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUaGUgRW5jb2RpbmdUZXN0Q2FzZSBpcyB0aGUgc3VpdGUgdGhhdCB0ZXN0cyB0aGUgMy4xIAotICogZW5jb2Rpbmcgc3VwcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nVGVzdENhc2UgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCi0JICogQHBhcmFtIHRlc3ROYW1lCi0JICovCi0JcHVibGljIEVuY29kaW5nVGVzdENhc2UoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHRoYXQgdGhlIHdvcmtiZW5jaCBlbmNvZGluZ3MgYXJlIGFsbCB2YWxpZC4gVGhlCi0JICogc3VpdGUgaW5jbHVkZXMgYW4gaW52YWxpZCBvbmUuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V29ya2JlbmNoRW5jb2RpbmdzKCkgewotCQlMaXN0IGVuY29kaW5ncyA9IFdvcmtiZW5jaEVuY29kaW5nLmdldERlZmluZWRFbmNvZGluZ3MoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbmNvZGluZ3MuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgbmV4dEVuY29kaW5nID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlBc3NlcnQuaXNUcnVlKENoYXJzZXQuaXNTdXBwb3J0ZWQobmV4dEVuY29kaW5nKSwgIlVuc3VwcG9ydGVkIGNoYXJzZXQgIiArIG5leHRFbmNvZGluZyk7Ci0JCQkJCi0JCQl9IGNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbnN1cHBvcnRlZCBjaGFyc2V0ICIgKyBuZXh0RW5jb2RpbmcpOwotCQkJfQotCQkJCi0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9lbmNvZGluZy9FbmNvZGluZ1Rlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9lbmNvZGluZy9FbmNvZGluZ1Rlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmEyM2QxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvZW5jb2RpbmcvRW5jb2RpbmdUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5lbmNvZGluZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGhlIEVuY29kaW5nVGVzdFN1aXRlIGlzIHRoZSBzdWl0ZSBmb3IgZW5jb2RpbmcgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1Rlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3VpdGUuICBUaGlzIGlzIHJlcXVpcmVkIHRvCi0JICogdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLQkgKiBAcmV0dXJuIFRlc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgRW5jb2RpbmdUZXN0U3VpdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHN1aXRlLgotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1Rlc3RTdWl0ZSgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKEVuY29kaW5nVGVzdENhc2UuY2xhc3MpKTsKLQl9Ci0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pZGUvYXBpL0ZpbGVFZGl0b3JJbnB1dFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaWRlL2FwaS9GaWxlRWRpdG9ySW5wdXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNTllNzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pZGUvYXBpL0ZpbGVFZGl0b3JJbnB1dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaWRlLmFwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyBbSV1GaWxlRWRpdG9ySW5wdXQgQVBJLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlRWRpdG9ySW5wdXRUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZUVkaXRvcklucHV0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA3MjMzNyAtIFtJREVdIEZpbGVFZGl0b3JJbnB1dCAuZXF1YWxzKCkgbm90IGltcGxlbWVudGVkIGFnYWluc3QgaW50ZXJmYWNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1ZzcyMzM3KCkgewotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKCIvZm9vL2Jhci50eHQiKTsKLSAgICAgICAgSUZpbGUgZmlsZUEgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0gICAgICAgIEZpbGVFZGl0b3JJbnB1dCBpbnB1dEExID0gbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlQSk7Ci0gICAgICAgIE90aGVyRmlsZUVkaXRvcklucHV0IGlucHV0QTIgPSBuZXcgT3RoZXJGaWxlRWRpdG9ySW5wdXQoZmlsZUEpOwotICAgICAgICBhc3NlcnRUcnVlKGlucHV0QTEuZXF1YWxzKGlucHV0QTIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dEEyLmVxdWFscyhpbnB1dEExKSk7Ci0gICAgfQotICAgIAotICAgIGNsYXNzIE90aGVyRmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSUZpbGVFZGl0b3JJbnB1dCB7Ci0gICAgICAgIHByaXZhdGUgSUZpbGUgZmlsZTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPdGhlckZpbGVFZGl0b3JJbnB1dChJRmlsZSBmaWxlKSB7Ci0gICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElTdG9yYWdlIGdldFN0b3JhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlLmV4aXN0cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLSAgICAgICAgICAgIGlmIChhZGFwdGVyID09IElSZXNvdXJjZS5jbGFzcykKLSAgICAgICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgICAgIGlmIChhZGFwdGVyID09IElGaWxlLmNsYXNzKQotICAgICAgICAgICAgICAgIHJldHVybiBmaWxlOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBJRmlsZUVkaXRvcklucHV0IG90aGVyID0gKElGaWxlRWRpdG9ySW5wdXQpIG9iajsKLSAgICAgICAgICAgIHJldHVybiBmaWxlLmVxdWFscyhvdGhlci5nZXRGaWxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIGZpbGUuaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvQWN0aW9uRXhwcmVzc2lvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvQWN0aW9uRXhwcmVzc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhMTQ2NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL0FjdGlvbkV4cHJlc3Npb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRlc3RzIGZvciBwb3B1cCBtZW51IGVuYWJsZW1lbnQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbkV4cHJlc3Npb25UZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgZldpbmRvdzsKLQotICAgIHByb3RlY3RlZCBJV29ya2JlbmNoUGFnZSBmUGFnZTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgVklFV19JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5BY3Rpb25FeHByZXNzaW9uVGVzdCI7Ci0KLSAgICBMaXN0RWxlbWVudCByZWQgPSBuZXcgTGlzdEVsZW1lbnQoInJlZCIpOwotCi0gICAgTGlzdEVsZW1lbnQgYmx1ZSA9IG5ldyBMaXN0RWxlbWVudCgiYmx1ZSIpOwotCi0gICAgTGlzdEVsZW1lbnQgcmVkVHJ1ZSA9IG5ldyBMaXN0RWxlbWVudCgicmVkIiwgdHJ1ZSk7Ci0KLSAgICBwdWJsaWMgQWN0aW9uRXhwcmVzc2lvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICAgICAgZldpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0gICAgICAgIGZQYWdlID0gZldpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFsbEFjdGlvbigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBTZXR1cC4KLSAgICAgICAgTGlzdFZpZXcgdmlldyA9IHNob3dMaXN0VmlldygpOwotICAgICAgICBNZW51TWFuYWdlciBtZ3IgPSBnZXRBY3Rpb25NZW51TWFuYWdlcih2aWV3KTsKLQotICAgICAgICAvLyBUZXN0IG51bGwgc2VsZWN0aW9uLgotICAgICAgICBzZWxlY3RBbmRVcGRhdGVNZW51KHZpZXcsIG51bGwsIG1ncik7Ci0gICAgICAgIHRlc3RBY3Rpb24obWdyLCAiYWxsQWN0aW9uX3YyIiwgZmFsc2UpOwotCi0gICAgICAgIC8vIFRlc3QgcmVkIHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudSh2aWV3LCByZWQsIG1ncik7Ci0gICAgICAgIHRlc3RBY3Rpb24obWdyLCAiYWxsQWN0aW9uX3YyIiwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGVzdCBibHVlIHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudSh2aWV3LCBibHVlLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgImFsbEFjdGlvbl92MiIsIHRydWUpOwotCi0gICAgICAgIC8vIFRlc3QgcmVkICsgdHJ1ZSBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUodmlldywgcmVkVHJ1ZSwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJhbGxBY3Rpb25fdjIiLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkQWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIFNldHVwLgotICAgICAgICBMaXN0VmlldyB2aWV3ID0gc2hvd0xpc3RWaWV3KCk7Ci0gICAgICAgIE1lbnVNYW5hZ2VyIG1nciA9IGdldEFjdGlvbk1lbnVNYW5hZ2VyKHZpZXcpOwotCi0gICAgICAgIC8vIFRlc3QgbnVsbCBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUodmlldywgbnVsbCwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJyZWRBY3Rpb25fdjIiLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gVGVzdCByZWQgc2VsZWN0aW9uLgotICAgICAgICBzZWxlY3RBbmRVcGRhdGVNZW51KHZpZXcsIHJlZCwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJyZWRBY3Rpb25fdjIiLCB0cnVlKTsKLQotICAgICAgICAvLyBUZXN0IGJsdWUgc2VsZWN0aW9uLgotICAgICAgICBzZWxlY3RBbmRVcGRhdGVNZW51KHZpZXcsIGJsdWUsIG1ncik7Ci0gICAgICAgIHRlc3RBY3Rpb24obWdyLCAicmVkQWN0aW9uX3YyIiwgZmFsc2UpOwotCi0gICAgICAgIC8vIFRlc3QgcmVkICsgdHJ1ZSBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUodmlldywgcmVkVHJ1ZSwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJyZWRBY3Rpb25fdjIiLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90UmVkQWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIFNldHVwLgotICAgICAgICBMaXN0VmlldyB2aWV3ID0gc2hvd0xpc3RWaWV3KCk7Ci0gICAgICAgIE1lbnVNYW5hZ2VyIG1nciA9IGdldEFjdGlvbk1lbnVNYW5hZ2VyKHZpZXcpOwotCi0gICAgICAgIC8vIFRlc3QgbnVsbCBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUodmlldywgbnVsbCwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJub3RSZWRBY3Rpb25fdjIiLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gVGVzdCByZWQgc2VsZWN0aW9uLgotICAgICAgICBzZWxlY3RBbmRVcGRhdGVNZW51KHZpZXcsIHJlZCwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJub3RSZWRBY3Rpb25fdjIiLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gVGVzdCBibHVlIHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudSh2aWV3LCBibHVlLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgIm5vdFJlZEFjdGlvbl92MiIsIHRydWUpOwotCi0gICAgICAgIC8vIFRlc3QgcmVkICsgdHJ1ZSBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUodmlldywgcmVkVHJ1ZSwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJub3RSZWRBY3Rpb25fdjIiLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRydWVBY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gU2V0dXAuCi0gICAgICAgIExpc3RWaWV3IHZpZXcgPSBzaG93TGlzdFZpZXcoKTsKLSAgICAgICAgTWVudU1hbmFnZXIgbWdyID0gZ2V0QWN0aW9uTWVudU1hbmFnZXIodmlldyk7Ci0KLSAgICAgICAgLy8gVGVzdCBudWxsIHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudSh2aWV3LCBudWxsLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgInRydWVBY3Rpb25fdjIiLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gVGVzdCByZWQgc2VsZWN0aW9uLgotICAgICAgICBzZWxlY3RBbmRVcGRhdGVNZW51KHZpZXcsIHJlZCwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJ0cnVlQWN0aW9uX3YyIiwgZmFsc2UpOwotCi0gICAgICAgIC8vIFRlc3QgYmx1ZSBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUodmlldywgYmx1ZSwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJ0cnVlQWN0aW9uX3YyIiwgZmFsc2UpOwotCi0gICAgICAgIC8vIFRlc3QgcmVkICsgdHJ1ZSBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUodmlldywgcmVkVHJ1ZSwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJ0cnVlQWN0aW9uX3YyIiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlZE9yQmx1ZUFjdGlvbigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBTZXR1cC4KLSAgICAgICAgTGlzdFZpZXcgdmlldyA9IHNob3dMaXN0VmlldygpOwotICAgICAgICBNZW51TWFuYWdlciBtZ3IgPSBnZXRBY3Rpb25NZW51TWFuYWdlcih2aWV3KTsKLQotICAgICAgICAvLyBUZXN0IG51bGwgc2VsZWN0aW9uLgotICAgICAgICBzZWxlY3RBbmRVcGRhdGVNZW51KHZpZXcsIG51bGwsIG1ncik7Ci0gICAgICAgIHRlc3RBY3Rpb24obWdyLCAicmVkT3JCbHVlQWN0aW9uX3YyIiwgZmFsc2UpOwotCi0gICAgICAgIC8vIFRlc3QgcmVkIHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudSh2aWV3LCByZWQsIG1ncik7Ci0gICAgICAgIHRlc3RBY3Rpb24obWdyLCAicmVkT3JCbHVlQWN0aW9uX3YyIiwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGVzdCBibHVlIHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudSh2aWV3LCBibHVlLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgInJlZE9yQmx1ZUFjdGlvbl92MiIsIHRydWUpOwotCi0gICAgICAgIC8vIFRlc3QgcmVkICsgdHJ1ZSBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUodmlldywgcmVkVHJ1ZSwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJyZWRPckJsdWVBY3Rpb25fdjIiLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkQW5kVHJ1ZUFjdGlvbigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBTZXR1cC4KLSAgICAgICAgTGlzdFZpZXcgdmlldyA9IHNob3dMaXN0VmlldygpOwotICAgICAgICBNZW51TWFuYWdlciBtZ3IgPSBnZXRBY3Rpb25NZW51TWFuYWdlcih2aWV3KTsKLQotICAgICAgICAvLyBUZXN0IG51bGwgc2VsZWN0aW9uLgotICAgICAgICBzZWxlY3RBbmRVcGRhdGVNZW51KHZpZXcsIG51bGwsIG1ncik7Ci0gICAgICAgIHRlc3RBY3Rpb24obWdyLCAicmVkQW5kVHJ1ZUFjdGlvbl92MiIsIGZhbHNlKTsKLQotICAgICAgICAvLyBUZXN0IHJlZCBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUodmlldywgcmVkLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgInJlZEFuZFRydWVBY3Rpb25fdjIiLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gVGVzdCBibHVlIHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudSh2aWV3LCBibHVlLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgInJlZEFuZFRydWVBY3Rpb25fdjIiLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gVGVzdCByZWQgKyB0cnVlIHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudSh2aWV3LCByZWRUcnVlLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgInJlZEFuZFRydWVBY3Rpb25fdjIiLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luU3RhdGVBY3Rpb25zKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIFNldHVwLgotICAgICAgICBMaXN0VmlldyB2aWV3ID0gc2hvd0xpc3RWaWV3KCk7Ci0gICAgICAgIE1lbnVNYW5hZ2VyIG1nciA9IGdldEFjdGlvbk1lbnVNYW5hZ2VyKHZpZXcpOwotCi0gICAgICAgIC8vIE9wZW4gdGhlIG1lbnUgYW5kIHRlc3QgYWN0aW9ucy4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudSh2aWV3LCByZWQsIG1ncik7Ci0gICAgICAgIHRlc3RBY3Rpb24obWdyLCAicGx1Z2luTm90SW5zdGFsbGVkQWN0aW9uX3YyIiwgZmFsc2UpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgInBsdWdpbkluc3RhbGxlZEFjdGlvbl92MiIsIHRydWUpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgInBsdWdpbk5vdEFjdGl2YXRlZEFjdGlvbl92MiIsIGZhbHNlKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJwbHVnaW5BY3RpdmF0ZWRBY3Rpb25fdjIiLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtUHJvcGVydHlBY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gU2V0dXAuCi0gICAgICAgIExpc3RWaWV3IHZpZXcgPSBzaG93TGlzdFZpZXcoKTsKLSAgICAgICAgTWVudU1hbmFnZXIgbWdyID0gZ2V0QWN0aW9uTWVudU1hbmFnZXIodmlldyk7Ci0KLSAgICAgICAgLy8gQ2xlYXIgdGhlIHN5c3RlbSBwcm9wZXJ0eSwgcmVmcmVzaCB0aGUgbWVudSwKLSAgICAgICAgLy8gYW5kIHRlc3QgdGhlIGFjdGlvbi4KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJBY3Rpb25FeHByZXNzaW9uVmFyIiwgIiIpOwotICAgICAgICBzZWxlY3RBbmRVcGRhdGVNZW51KHZpZXcsIHJlZCwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJzeXN0ZW1Qcm9wZXJ0eUFjdGlvbl92MiIsIGZhbHNlKTsKLQotICAgICAgICAvLyBTZXQgdGhlIHN5c3RlbSBwcm9wZXJ0eSwgcmVmcmVzaCB0aGUgbWVudSwKLSAgICAgICAgLy8gYW5kIHRlc3QgdGhlIGFjdGlvbi4KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJBY3Rpb25FeHByZXNzaW9uVmFyIiwgImJ1YmJhIik7Ci0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUodmlldywgYmx1ZSwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJzeXN0ZW1Qcm9wZXJ0eUFjdGlvbl92MiIsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGxpc3Qgdmlldy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdFZpZXcgc2hvd0xpc3RWaWV3KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIExpc3RWaWV3IHZpZXcgPSAoTGlzdFZpZXcpIChmUGFnZS5zaG93VmlldyhWSUVXX0lEKSk7Ci0gICAgICAgIHJlZCA9IG5ldyBMaXN0RWxlbWVudCgicmVkIik7Ci0gICAgICAgIGJsdWUgPSBuZXcgTGlzdEVsZW1lbnQoImJsdWUiKTsKLSAgICAgICAgcmVkVHJ1ZSA9IG5ldyBMaXN0RWxlbWVudCgicmVkIiwgdHJ1ZSk7Ci0gICAgICAgIHZpZXcuYWRkRWxlbWVudChyZWQpOwotICAgICAgICB2aWV3LmFkZEVsZW1lbnQoYmx1ZSk7Ci0gICAgICAgIHZpZXcuYWRkRWxlbWVudChyZWRUcnVlKTsKLSAgICAgICAgcmV0dXJuIHZpZXc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0IGFuIG9iamVjdCBhbmQgZmlyZSBhYm91dCB0byBzaG93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdEFuZFVwZGF0ZU1lbnUoTGlzdFZpZXcgdmlldywgTGlzdEVsZW1lbnQgZWxlbWVudCwKLSAgICAgICAgICAgIE1lbnVNYW5hZ2VyIG1ncikgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHZpZXcuc2VsZWN0RWxlbWVudChlbGVtZW50KTsKLSAgICAgICAgQWN0aW9uVXRpbC5maXJlQWJvdXRUb1Nob3cobWdyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZW51IG1hbmFnZXIgY29udGFpbmluZyB0aGUgYWN0aW9ucy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWVudU1hbmFnZXIgZ2V0QWN0aW9uTWVudU1hbmFnZXIoTGlzdFZpZXcgdmlldykKLSAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGU7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgZW5hYmxlbWVudCAvIHZpc2liaWxpdHkgb2YgYW4gYWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHRlc3RBY3Rpb24oTWVudU1hbmFnZXIgbWdyLCBTdHJpbmcgYWN0aW9uLAotICAgICAgICAgICAgYm9vbGVhbiBleHBlY3RlZCkgdGhyb3dzIFRocm93YWJsZTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvQWN0aW9uU2V0RXhwcmVzc2lvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvQWN0aW9uU2V0RXhwcmVzc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmNDY4ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL0FjdGlvblNldEV4cHJlc3Npb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTGlzdFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkFjdGlvblV0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyB0ZXN0cyBmb3IgYWN0aW9uIHNldCBlbmFibGVtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25TZXRFeHByZXNzaW9uVGVzdCBleHRlbmRzIEFjdGlvbkV4cHJlc3Npb25UZXN0IHsKLQotICAgIHB1YmxpYyBBY3Rpb25TZXRFeHByZXNzaW9uVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIHRoZSBhY3Rpb24gc2V0LiAgUmV0dXJucyB0aGUgbWVudSBtYW5hZ2VyIGNvbnRhaW5pbmcgaXQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGdldEFjdGlvbk1lbnVNYW5hZ2VyKExpc3RWaWV3IHZpZXcpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmUGFnZS5zaG93QWN0aW9uU2V0KCJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5MaXN0RWxlbWVudEFjdGlvbnMiKTsKLSAgICAgICAgV29ya2JlbmNoV2luZG93IHdpbiA9IChXb3JrYmVuY2hXaW5kb3cpIGZXaW5kb3c7Ci0gICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSB3aW4uZ2V0TWVudUJhck1hbmFnZXIoKS5maW5kKAotICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5MaXN0RWxlbWVudE1lbnUiKTsKLSAgICAgICAgd2hpbGUgKGl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7Ci0gICAgICAgICAgICBpdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKSBpdGVtKS5nZXRJbm5lckl0ZW0oKTsKLSAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgTWVudU1hbmFnZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChNZW51TWFuYWdlcikgaXRlbTsKLSAgICAgICAgfQotICAgICAgICBmYWlsKCJVbmFibGUgdG8gZmluZCBtZW51IG1hbmFnZXIiKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGVuYWJsZW1lbnQgb2YgYW4gYWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRlc3RBY3Rpb24oTWVudU1hbmFnZXIgbWdyLCBTdHJpbmcgYWN0aW9uLCBib29sZWFuIGV4cGVjdGVkKQotICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhY3Rpb24sIGV4cGVjdGVkLCBBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZ3IsCi0gICAgICAgICAgICAgICAgYWN0aW9uKS5pc0VuYWJsZWQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9CdWc0MTkzMVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvQnVnNDE5MzFUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2N2JlYzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9CdWc0MTkzMVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCBmb3IgQnVnIDQxOTMxLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWc0MTkzMVRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyB0ZXN0IGNhc2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlc3ROYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBCdWc0MTkzMVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSA8Y29kZT5icmluZ1RvVG9wKElXb3JrYmVuY2hQYXJ0KTwvY29kZT4gY29ycmVjdGx5Ci0gICAgICogdXBkYXRlcyB0aGUgYWN0aXZhdGlvbiBsaXN0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSB0ZXN0IHByb2plY3QgY2Fubm90IGJlIGNyZWF0ZWQgb3Igb3BlbmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RCcmluZ1RvVG9wKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBPcGVuIGEgd2luZG93LgotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIHRlc3QgcHJvamVjdC4KLSAgICAgICAgSVByb2plY3QgdGVzdFByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QoIkJ1ZzQxOTMxIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGVzdFByb2plY3QuY3JlYXRlKG51bGwpOwotICAgICAgICB0ZXN0UHJvamVjdC5vcGVuKG51bGwpOwotCi0gICAgICAgIC8vIE9wZW4gdGhyZWUgdGVzdCBmaWxlcy4KLSAgICAgICAgSW5wdXRTdHJlYW0gY29udGVudHMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pOwotICAgICAgICBJRmlsZSBmaWxlQSA9IHRlc3RQcm9qZWN0LmdldEZpbGUoImEudHh0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmlsZUEuY3JlYXRlKGNvbnRlbnRzLCB0cnVlLCBudWxsKTsKLSAgICAgICAgSUZpbGUgZmlsZUIgPSB0ZXN0UHJvamVjdC5nZXRGaWxlKCJiLnR4dCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZpbGVCLmNyZWF0ZShjb250ZW50cywgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIElGaWxlIGZpbGVDID0gdGVzdFByb2plY3QuZ2V0RmlsZSgiYy50eHQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaWxlQy5jcmVhdGUoY29udGVudHMsIHRydWUsIG51bGwpOwotCi0gICAgICAgIC8vIE9wZW4gZWRpdG9ycyBvbiB0aG9zZSBmaWxlcy4KLSAgICAgICAgV29ya2JlbmNoUGFnZSBwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvckEgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlQSwgdHJ1ZSk7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvckIgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlQiwgdHJ1ZSk7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvckMgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlQywgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBlZGl0b3JzIGFyZSBvcGVuIGluIHRoZSBvcmRlcjogQSwgQiwgQwotICAgICAgICBJRWRpdG9yUGFydFtdIGV4cGVjdGVkUmVzdWx0cyA9IHsgZWRpdG9yQSwgZWRpdG9yQiwgZWRpdG9yQyB9OwotICAgICAgICBJV29ya2JlbmNoUGFydFJlZmVyZW5jZVtdIGFjdHVhbFJlc3VsdHMgPSBwYWdlLmdldFNvcnRlZFBhcnRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRSZXN1bHRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICJQcmUtdGVzdCBvcmRlciBpcyBub3QgY29ycmVjdC4iLCBleHBlY3RlZFJlc3VsdHNbaV0uZ2V0VGl0bGUoKSwgYWN0dWFsUmVzdWx0c1tpXS5nZXRQYXJ0KGZhbHNlKS5nZXRUaXRsZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQnJpbmcgZWRpdG9yIEIgdG8gdGhlIHRvcC4KLSAgICAgICAgcGFnZS5icmluZ1RvVG9wKGVkaXRvckIpOwotCi0gICAgICAgIC8vIFRlc3QgdGhhdCB0aGUgZWRpdG9ycyBhcmUgb3BlbiBpbiB0aGUgb3JkZXI6IEEsIEMsIEIKLSAgICAgICAgZXhwZWN0ZWRSZXN1bHRzID0gbmV3IElFZGl0b3JQYXJ0W10geyBlZGl0b3JBLCBlZGl0b3JDLCBlZGl0b3JCIH07Ci0gICAgICAgIGFjdHVhbFJlc3VsdHMgPSBwYWdlLmdldFNvcnRlZFBhcnRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRSZXN1bHRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICJicmluZ1RvVG9wKCkgZG9lcyBub3QgY2hhbmdlIHNvcnRlZCBwYXJ0IG9yZGVyLiIsIGV4cGVjdGVkUmVzdWx0c1tpXS5nZXRUaXRsZSgpLCBhY3R1YWxSZXN1bHRzW2ldLmdldFBhcnQoZmFsc2UpLmdldFRpdGxlKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL0J1Zzc4NDcwVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9CdWc3ODQ3MFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QxMzczMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL0J1Zzc4NDcwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgQnVnNzg0NzBUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE15UGVyc3BlY3RpdmUgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuQnVnNzg0NzBUZXN0Lk15UGVyc3BlY3RpdmUiOwotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCQlTdHJpbmcgZWRpdG9yQXJlYSA9IGxheW91dC5nZXRFZGl0b3JBcmVhKCk7Ci0JCQlJRm9sZGVyTGF5b3V0IGZvbGRlcjEgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJmb2xkZXIxIiwKLQkJCQkJSVBhZ2VMYXlvdXQuTEVGVCwgLjc1ZiwgZWRpdG9yQXJlYSk7Ci0JCQkvLyB0aGUgb3JkZXIgaXMgaW1wb3J0YW50Ci0JCQlmb2xkZXIxLmFkZFBsYWNlaG9sZGVyKE15Vmlld1BhcnQuSUQyKTsKLQkJCWZvbGRlcjEuYWRkVmlldyhNeVZpZXdQYXJ0LklEKTsKLQkJCWZvbGRlcjEuYWRkUGxhY2Vob2xkZXIoTXlWaWV3UGFydC5JRDMpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNeVZpZXdQYXJ0IGV4dGVuZHMgVmlld1BhcnQgewotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5CdWc3ODQ3MFRlc3QuTXlWaWV3UGFydCI7Ci0KLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgSUQyID0gSUQgKyAiMiI7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEMyA9IElEICsgIjMiOwotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChnZXRTaXRlKCkuZ2V0SWQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJfQotCX0KLQotCXB1YmxpYyBCdWc3ODQ3MFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlib29sZWFuIHBhcnRWaXNpYmxlRXhlY3V0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyB2b2lkIHRlc3Q3ODQ3MCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IGdldFdvcmtiZW5jaCgpOwotCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaAotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJZmluYWwgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IGFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCWFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcigKLQkJCQluZXcgSVBhcnRMaXN0ZW5lcjIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgcGFydEhpZGRlbihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgcGFydFZpc2libGUoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQkJaWYgKHBhcnRSZWYuZ2V0SWQoKS5lcXVhbHMoTXlWaWV3UGFydC5JRCkpIHsKLQkJCQkJCQlwYXJ0VmlzaWJsZUV4ZWN1dGVkID0gdHJ1ZTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlhY3RpdmVQYWdlLnNob3dWaWV3KE15Vmlld1BhcnQuSUQyKTsKLQkJCQkJCQkJYWN0aXZlUGFnZS5zaG93VmlldyhNeVZpZXdQYXJ0LklEMyk7Ci0JCQkJCQkJfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIHBhcnRJbnB1dENoYW5nZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQl9Ci0JCQkJfSk7Ci0JCXdvcmtiZW5jaC5zaG93UGVyc3BlY3RpdmUoTXlQZXJzcGVjdGl2ZS5JRCwgYWN0aXZlV29ya2JlbmNoV2luZG93KTsKLQkJcHJvY2Vzc0V2ZW50cygpOwotCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCWFzc2VydFRydWUoInZpZXcgd2FzIG5vdCBtYWRlIHZpc2libGUiLCBwYXJ0VmlzaWJsZUV4ZWN1dGVkKTsKLQkJYXNzZXJ0Tm90TnVsbChhY3RpdmVQYWdlLmZpbmRWaWV3KE15Vmlld1BhcnQuSUQyKSk7Ci0JCWFzc2VydE5vdE51bGwoYWN0aXZlUGFnZS5maW5kVmlldyhNeVZpZXdQYXJ0LklEMykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9CdWc5OTg1OFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvQnVnOTk4NThUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjc3MWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9CdWc5OTg1OFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5EZWxldGVSZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlRleHRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3I7Ci0KLS8qKgotICogYnVnIDk5ODU4IFtJREVdIEVycm9yIHVwb24gZGVsZXRpbmcgYSBwcm9qZWN0LiBUZXN0cyB0aGF0IG91ciBkZWxldGUgY29kZSBubwotICogbG9uZ2VyIHRocm93cyBhIENvcmVFeGNlcHRpb24gd2hlbiBkZWxldGluZyBhIGNsb3NlZCBwcm9qZWN0LgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWc5OTg1OFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFWSUdBVE9SX1ZJRVcgPSAib3JnLmVjbGlwc2UudWkudmlld3MuUmVzb3VyY2VOYXZpZ2F0b3IiOwotCi0JcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEJ1Zzk5ODU4VGVzdC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIEJ1Zzk5ODU4VGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnVnOTk4NThUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHByb2plY3Qgd2l0aCBzb21lIGZpbGVzLCBjbG9zZSBpdCwgYW5kIGRlbGV0ZSBpdC4gV2l0aCB0aGUKLQkgKiBjaGFuZ2VzIGluIHJ1bnRpbWUgdG8gdGhyb3cgYSBDb3JlRXhjZXB0aW9uIGZyb20gSUNvbnRhaW5lciNtZW1iZXJzKCksCi0JICogdGhlIHByb2plY3Qgd29uJ3QgZ2V0IGRlbGV0ZWQgaWYgUmVhZE9ubHlTdGF0ZUNoZWNrZXIgaXMgbm90IGZpeGVkLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICogICAgICAgICAgICAgaWYgaXQgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVDbG9zZWRQcm9qZWN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3QgdGVzdFByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QoCi0JCQkJIlRlc3RDbG9zZWREZWxldGUiKTsKLQkJdGVzdFByb2plY3QuY3JlYXRlKG51bGwpOwotCQl0ZXN0UHJvamVjdC5vcGVuKG51bGwpOwotCi0JCVN0cmluZyBjb250ZW50cyA9ICJGaWxlIHJlYWR5IGZvciBleGVjdXRpb24sIHNpciEiOwotCQljcmVhdGVQcm9qZWN0RmlsZSh0ZXN0UHJvamVjdCwgImEudHh0IiwgY29udGVudHMpOwotCQljcmVhdGVQcm9qZWN0RmlsZSh0ZXN0UHJvamVjdCwgImIudHh0IiwgY29udGVudHMpOwotCi0JCVJlc291cmNlTmF2aWdhdG9yIHZpZXcgPSAoUmVzb3VyY2VOYXZpZ2F0b3IpIHBhZ2UKLQkJCQkuc2hvd1ZpZXcoTkFWSUdBVE9SX1ZJRVcpOwotCQl2aWV3LnNldEZvY3VzKCk7Ci0KLQkJLy8gZ2V0IGEgdGVzdGluZyB2ZXJzaW9uIG9mIHRoZSBkZWxldGUgYWN0aW9uLCBhbmQgc2V0IGl0IHVwLgotCQlNeURlbGV0ZVJlc291cmNlQWN0aW9uIG5ld0RlbCA9IG5ldyBNeURlbGV0ZVJlc291cmNlQWN0aW9uKHZpZXcKLQkJCQkuZ2V0Vmlld1NpdGUoKS5nZXRTaGVsbCgpKTsKLQkJbmV3RGVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCVRleHRBY3Rpb25IYW5kbGVyIHRtcEhhbmRsZXIgPSBuZXcgVGV4dEFjdGlvbkhhbmRsZXIodmlldy5nZXRWaWV3U2l0ZSgpCi0JCQkJLmdldEFjdGlvbkJhcnMoKSk7Ci0JCXRtcEhhbmRsZXIuc2V0RGVsZXRlQWN0aW9uKG5ld0RlbCk7Ci0KLQkJdmlldy5nZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS51cGRhdGVBY3Rpb25CYXJzKCk7Ci0KLQkJY2hld1VwRXZlbnRzKCk7Ci0KLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVzdFByb2plY3QpOwotCi0JCS8vIGNsb3NlIHRoZSBwcm9qZWN0IGFuZCB1cGRhdGUgdGhlIHNlbGVjdGlvbiBldmVudHMuCi0JCXRlc3RQcm9qZWN0LmNsb3NlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0ZXN0UHJvamVjdC5pc0FjY2Vzc2libGUoKSk7Ci0JCXZpZXcuZ2V0Vmlld1NpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihzKTsKLQkJbmV3RGVsLnNlbGVjdGlvbkNoYW5nZWQocyk7Ci0JCWNoZXdVcEV2ZW50cygpOwotCi0JCUlBY3Rpb24gZGVsID0gdmlldy5nZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKQotCQkJCS5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCi0JCWFzc2VydFRydWUoZGVsLmlzRW5hYmxlZCgpKTsKLQotCQkvLyBydW4gdGhlIGRlbGV0ZSBldmVudC4KLQkJZGVsLnJ1bldpdGhFdmVudChudWxsKTsKLQotCQljaGV3VXBFdmVudHMoKTsKLQotCQkvLyB0aGUgZGVsZXRlIGV2ZW4gcmFuCi0JCWFzc2VydFRydWUobmV3RGVsLmZSYW4pOwotCi0JCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKAotCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLkRlbGV0ZVJlc291cmNlQWN0aW9uX2pvYk5hbWUsIG51bGwpOwotCi0JCS8vIGlmIG91ciBwcm9qZWN0IHN0aWxsIGV4aXN0cywgdGhlIGRlbGV0ZSBmYWlsZWQuCi0JCWFzc2VydEZhbHNlKHRlc3RQcm9qZWN0LmV4aXN0cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzcyB0aGUgZGVsZXRlIGFjdGlvbiBhbmQgZ28gaW50byB0ZXN0aW5nIG1vZGUsIHdoaWNoIGxpbWl0cyB1c2VyCi0JICogZGlhbG9ncy4KLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBNeURlbGV0ZVJlc291cmNlQWN0aW9uIGV4dGVuZHMgRGVsZXRlUmVzb3VyY2VBY3Rpb24gewotCi0JCXB1YmxpYyBib29sZWFuIGZSYW4gPSBmYWxzZTsKLQotCQlwdWJsaWMgTXlEZWxldGVSZXNvdXJjZUFjdGlvbihTaGVsbCBzaGVsbCkgewotCQkJc3VwZXIoc2hlbGwpOwotCQkJZlRlc3RpbmdNb2RlID0gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXN1cGVyLnJ1bigpOwotCQkJZlJhbiA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBxdWljayBwcm9qZWN0IGZpbGUsIHNvIHRoZSBwcm9qZWN0IGhhcyBzb21lIGNoaWxkcmVuIHRvIGRlbGV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGVzdFByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0Ci0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlbmFtZQotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqICAgICAgICAgICAgQSBzbWFsbCBzdHJpbmcgZm9yIGNvbnRlbnRzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgSUZpbGUjY3JlYXRlKC4uLikgdGhyb3dzIGFuIGV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0RmlsZShJUHJvamVjdCB0ZXN0UHJvamVjdCwgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmcgY29udGVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZpbGUgdGV4dEZpbGUgPSB0ZXN0UHJvamVjdC5nZXRGaWxlKG5hbWUpOwotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50cwotCQkJCS5nZXRCeXRlcygpKTsKLQkJdGV4dEZpbGUuY3JlYXRlKGlucHV0U3RyZWFtLCB0cnVlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZnRlciBhbiBpbnRlcm5hbCBhY3Rpb24sIHNlZSBpZiB0aGVyZSBhcmUgYW55IG91dHN0YW5kaW5nIFNXVCBldmVudHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZXdVcEV2ZW50cygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQl3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL0VkaXRvckFjdGlvbkJhcnNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL0VkaXRvckFjdGlvbkJhcnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OGQ2Y2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9FZGl0b3JBY3Rpb25CYXJzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0VkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyB0ZXN0cyBmb3IgdGhlIGVkaXRvciBhY3Rpb24gYmFycwotICogaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JBY3Rpb25CYXJzVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgZldpbmRvdzsKLQotICAgIHByb3RlY3RlZCBJV29ya2JlbmNoUGFnZSBmUGFnZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIEVESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5FZGl0b3JBY3Rpb25CYXJzVGVzdCI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgSUVkaXRvclBhcnRUZXN0Ci0gICAgICovCi0gICAgcHVibGljIEVkaXRvckFjdGlvbkJhcnNUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIGZXaW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBmUGFnZSA9IGZXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgYWN0aW9uIGVuYWJsZW1lbnQgLyBkaXNhYmxlbWVudCB3aGVuIGEKLSAgICAgKiBwYXJ0IGlzIGFjdGl2ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBDcmVhdGVkIGZvciBQUiAxR0pOQjUyOiBUb29sSXRlbXMgaW4gRWRpdG9yVG9vbEJhck1hbmFnZXIgY2FuIGdldCAKLSAgICAgKiBvdXQgb2Ygc3luY2ggd2l0aCB0aGUgc3RhdGUgb2YgdGhlIElBY3Rpb24KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFjdGlvbkVuYWJsZW1lbnRXaGVuQWN0aXZlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIE9wZW4gYW4gZWRpdG9yLgotICAgICAgICBNb2NrRWRpdG9yUGFydCBlZGl0b3IgPSBvcGVuRWRpdG9yKGZQYWdlLCAiMSIpOwotICAgICAgICBNb2NrRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoTW9ja0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBlZGl0b3IKLSAgICAgICAgICAgICAgICAuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0KLSAgICAgICAgLy8gRW5hYmxlIGFsbCBhY3Rpb25zLgotICAgICAgICBjb250cmlidXRvci5lbmFibGVBY3Rpb25zKHRydWUpOwotICAgICAgICB2ZXJpZnlUb29sSXRlbVN0YXRlKGNvbnRyaWJ1dG9yLCB0cnVlKTsKLQotICAgICAgICAvLyBEaXNhYmxlIGFsbCBhY3Rpb25zLgotICAgICAgICBjb250cmlidXRvci5lbmFibGVBY3Rpb25zKGZhbHNlKTsKLSAgICAgICAgdmVyaWZ5VG9vbEl0ZW1TdGF0ZShjb250cmlidXRvciwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgYWN0aW9uIGVuYWJsZW1lbnQgLyBkaXNhYmxlbWVudCB3aGVuIGEKLSAgICAgKiBwYXJ0IGlzIGluYWN0aXZlLgotICAgICAqIDxwPgotICAgICAqIENyZWF0ZWQgZm9yIFBSIDFHSk5CNTI6IFRvb2xJdGVtcyBpbiBFZGl0b3JUb29sQmFyTWFuYWdlciBjYW4gZ2V0IAotICAgICAqIG91dCBvZiBzeW5jaCB3aXRoIHRoZSBzdGF0ZSBvZiB0aGUgSUFjdGlvbgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uRW5hYmxlbWVudFdoZW5JbmFjdGl2ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBPcGVuIGFuIGVkaXRvci4KLSAgICAgICAgTW9ja0VkaXRvclBhcnQgZWRpdG9yID0gb3BlbkVkaXRvcihmUGFnZSwgIjIiKTsKLSAgICAgICAgTW9ja0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gKE1vY2tFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgZWRpdG9yCi0gICAgICAgICAgICAgICAgLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCi0gICAgICAgIC8vIEVuYWJsZSBhbGwgYWN0aW9ucy4KLSAgICAgICAgY29udHJpYnV0b3IuZW5hYmxlQWN0aW9ucyh0cnVlKTsKLSAgICAgICAgdmVyaWZ5VG9vbEl0ZW1TdGF0ZShjb250cmlidXRvciwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gQWN0aXZhdGUgc29tZSBvdGhlciBwYXJ0LiAgRGlzYWJsZSB0aGUgYWN0aW9ucy4KLSAgICAgICAgLy8gVGhlbiBhY3RpdmF0ZSB0aGUgZWRpdG9yIGFuZCB0ZXN0IHRvb2wgaXRlbSBzdGF0ZS4KLSAgICAgICAgZlBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEKTsKLSAgICAgICAgY29udHJpYnV0b3IuZW5hYmxlQWN0aW9ucyhmYWxzZSk7Ci0gICAgICAgIGZQYWdlLmFjdGl2YXRlKGVkaXRvcik7Ci0gICAgICAgIHZlcmlmeVRvb2xJdGVtU3RhdGUoY29udHJpYnV0b3IsIGZhbHNlKTsKLQotICAgICAgICAvLyBBY3RpdmF0ZSBzb21lIG90aGVyIHBhcnQuICBFbmFibGUgdGhlIGFjdGlvbnMuCi0gICAgICAgIC8vIFRoZW4gYWN0aXZhdGUgdGhlIGVkaXRvciBhbmQgdGVzdCB0b29sIGl0ZW0gc3RhdGUuCi0gICAgICAgIGZQYWdlLnNob3dWaWV3KE1vY2tWaWV3UGFydC5JRCk7Ci0gICAgICAgIGNvbnRyaWJ1dG9yLmVuYWJsZUFjdGlvbnModHJ1ZSk7Ci0gICAgICAgIGZQYWdlLmFjdGl2YXRlKGVkaXRvcik7Ci0gICAgICAgIHZlcmlmeVRvb2xJdGVtU3RhdGUoY29udHJpYnV0b3IsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW4gYSB0ZXN0IGVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTW9ja0VkaXRvclBhcnQgb3BlbkVkaXRvcihJV29ya2JlbmNoUGFnZSBwYWdlLCBTdHJpbmcgc3VmZml4KQotICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2ogPSBGaWxlVXRpbC5jcmVhdGVQcm9qZWN0KCJJRWRpdG9yQWN0aW9uQmFyc1Rlc3QiKTsKLSAgICAgICAgSUZpbGUgZmlsZSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoInRlc3QiICsgc3VmZml4ICsgIi50eHQiLCBwcm9qKTsKLSAgICAgICAgcmV0dXJuIChNb2NrRWRpdG9yUGFydCkgcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSksCi0gICAgICAgICAgICAgICAgRURJVE9SX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIGFjdGlvbnMgYXJlIGVuYWJsZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmVyaWZ5VG9vbEl0ZW1TdGF0ZShNb2NrRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY3RyLAotICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIE1vY2tBY3Rpb25bXSBhY3Rpb25zID0gY3RyLmdldEFjdGlvbnMoKTsKLSAgICAgICAgZm9yIChpbnQgblggPSAwOyBuWCA8IGFjdGlvbnMubGVuZ3RoOyBuWCsrKQotICAgICAgICAgICAgdmVyaWZ5VG9vbEl0ZW1TdGF0ZShhY3Rpb25zW25YXSwgZW5hYmxlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciBhbiBhY3Rpb24gaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlUb29sSXRlbVN0YXRlKElBY3Rpb24gYWN0aW9uLCBib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgU3RyaW5nIGFjdGlvblRleHQgPSBhY3Rpb24uZ2V0VGV4dCgpOwotICAgICAgICBJQ29vbEJhck1hbmFnZXIgdGJtID0gKChXb3JrYmVuY2hXaW5kb3cpIGZXaW5kb3cpLmdldENvb2xCYXJNYW5hZ2VyKCk7Ci0gICAgICAgIElDb250cmlidXRpb25JdGVtW10gY29vbEl0ZW1zID0gdGJtLmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29vbEl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoY29vbEl0ZW1zW2ldIGluc3RhbmNlb2YgVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0pIHsKLSAgICAgICAgICAgICAgICBUb29sQmFyQ29udHJpYnV0aW9uSXRlbSBjb29sSXRlbSA9IChUb29sQmFyQ29udHJpYnV0aW9uSXRlbSkgY29vbEl0ZW1zW2ldOwotICAgICAgICAgICAgICAgIElUb29sQmFyTWFuYWdlciBjaXRibSA9IGNvb2xJdGVtLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgVG9vbEJhciB0YiA9ICgoVG9vbEJhck1hbmFnZXIpIGNpdGJtKS5nZXRDb250cm9sKCk7Ci0gICAgICAgICAgICAgICAgdmVyaWZ5TnVsbFRvb2xiYXIodGIsIGFjdGlvblRleHQsIGNpdGJtKTsKLSAgICAgICAgICAgICAgICBpZiAodGIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBUb29sSXRlbVtdIGl0ZW1zID0gdGIuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpdGVtcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1UZXh0ID0gaXRlbXNbal0uZ2V0VG9vbFRpcFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UZXh0LmVxdWFscyhpdGVtVGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZW5hYmxlZCwgaXRlbXNbal0uZ2V0RW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiQWN0aW9uIGZvciAiICsgYWN0aW9uVGV4dCArICIgbm90IGZvdW5kIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZmlybXMgdGhhdCBhIFRvb2xCYXIgaXMgbm90IG51bGwgd2hlbiB5b3UncmUgbG9va2luZyBhIG1hbmFnZXIgdGhhdCAKLSAgICAgKiBpcyBhIENvb2xJdGVtVG9vbEJhck1hbmFnZXIgYW5kIGl0IGhhcyBub24tc2VwYXJhdG9yL25vbi1pbnZpc2libGUgCi0gICAgICogY29udHJpYnV0aW9ucy4KLSAgICAgKiBUaGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIGNoYW5nZXMgbWFkZSB0byAKLSAgICAgKiBDb29sSXRlbVRvb2xCYXJNYW5hZ2VyLnVwZGF0ZSgpIHRoYXQgaGlkZXMgdGhlIGEgYmFyIGlmIGl0IGRvZXMgbm90Ci0gICAgICogY29udGFpbiBhbnl0aGluZyBhcyBwZXIgdGhlIGFib3ZlIG1lbnRpb25lZCBjcml0ZXJpYS4gIFVuZGVyIHRoaXMgCi0gICAgICogY2lyY3Vtc3RhbmNlLCB0aGUgdW5kZXJseWluZyBUb29sQmFyIGlzIG5vdCBjcmVhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0YiB0aGUgVG9vbEJhciB0byBjaGVjawotICAgICAqIEBwYXJhbSBhY3Rpb25UZXh0IHRoZSBhY3Rpb24gdGV4dAotICAgICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSBJVG9vbEJhck1hbmFnZXIgY29udGFpbmluZyBpdGVtcwotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5TnVsbFRvb2xiYXIoVG9vbEJhciB0YiwgU3RyaW5nIGFjdGlvblRleHQsCi0gICAgICAgICAgICBJVG9vbEJhck1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICBpZiAodGIgPT0gbnVsbCkgeyAvLyB0b29sYmFyIHNob3VsZCBvbmx5IGJlIG51bGwgaWYgdGhlIGdpdmVuIG1hbmFnZXIgaXMKLSAgICAgICAgICAgIC8vIGEgQ29vbEJhck1hbmFnZXIgYW5kIGl0IGNvbnRhaW5zIG9ubHkgc2VwYXJhdG9ycyBvciBpbnZpc2libGUgCi0gICAgICAgICAgICAvLyBvYmplY3RzLiAgCi0gICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICghKGl0ZW1zW2ldIGluc3RhbmNlb2YgU2VwYXJhdG9yKSAmJiBpdGVtc1tpXS5pc1Zpc2libGUoKSkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJObyB0b29sYmFyIGZvciBhIHZpc2libGUgYWN0aW9uIHRleHQgXCIiICsgYWN0aW9uVGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvRXh0ZW5kZWRTb3VyY2VWaWV3ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvRXh0ZW5kZWRTb3VyY2VWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxOGM2My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL0V4dGVuZGVkU291cmNlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFNvdXJjZVZpZXdlciBleHRlbmRzIFNvdXJjZVZpZXdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNvdXJjZSB2aWV3ZXIuIFRoZSB2ZXJ0aWNhbCBydWxlciBpcyBpbml0aWFsbHkgdmlzaWJsZS4KLSAgICAgKiBUaGUgdmlld2VyIGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhIHNvdXJjZSB2aWV3ZXIgY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGUgdmlld2VyJ3MgY29udHJvbAotICAgICAqIEBwYXJhbSBydWxlciB0aGUgdmVydGljYWwgcnVsZXIgdXNlZCBieSB0aGlzIHNvdXJjZSB2aWV3ZXIKLSAgICAgKiBAcGFyYW0gc3R5bGVzIHRoZSBTV1Qgc3R5bGUgYml0cwotICAgICAqLwotICAgIHB1YmxpYyBFeHRlbmRlZFNvdXJjZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJVmVydGljYWxSdWxlciBydWxlciwKLSAgICAgICAgICAgIGludCBzdHlsZXMpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBydWxlciwgc3R5bGVzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgVmlld2VyI2dldFNlbGVjdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotICAgICAgICBQb2ludCBwID0gZ2V0U2VsZWN0ZWRSYW5nZSgpOwotICAgICAgICBpZiAocC54ID09IC0xIHx8IHAueSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiBFeHRlbmRlZFRleHRTZWxlY3Rpb24uZW1wdHlTZWxlY3Rpb24oKTsKLQotICAgICAgICByZXR1cm4gbmV3IEV4dGVuZGVkVGV4dFNlbGVjdGlvbihnZXREb2N1bWVudCgpLCBwLngsIHAueSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgb3V0IGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSBuZXdseSBzZWxlY3RlZCByYW5nZQotICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgbmV3bHkgc2VsZWN0ZWQgcmFuZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgRXh0ZW5kZWRUZXh0U2VsZWN0aW9uKGdldERvY3VtZW50KCksIG9mZnNldCwKLSAgICAgICAgICAgICAgICBsZW5ndGgpOwotICAgICAgICBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbik7Ci0gICAgICAgIGZpcmVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvRXh0ZW5kZWRUZXh0RWRpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL0V4dGVuZGVkVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGViYmVmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvRXh0ZW5kZWRUZXh0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFRleHRFZGl0b3IgZXh0ZW5kcyBUZXh0RWRpdG9yIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBUZXh0U2VsZWN0aW9uQWN0aW9uRmlsdGVyRWRpdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBFeHRlbmRlZFRleHRFZGl0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgc291cmNlIHZpZXdlciB0byBiZSB1c2VkIGJ5IHRoaXMgZWRpdG9yLgotICAgICAqIFN1YmNsYXNzZXMgbWF5IHJlLWltcGxlbWVudCB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICogQHBhcmFtIHJ1bGVyIHRoZSB2ZXJ0aWNhbCBydWxlcgotICAgICAqIEBwYXJhbSBzdHlsZXMgc3R5bGUgYml0cwotICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSB2aWV3ZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVNvdXJjZVZpZXdlciBjcmVhdGVTb3VyY2VWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIElWZXJ0aWNhbFJ1bGVyIHJ1bGVyLCBpbnQgc3R5bGVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0ZW5kZWRTb3VyY2VWaWV3ZXIocGFyZW50LCBydWxlciwgc3R5bGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB0ZXh0IGluIHRoZSBlZGl0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICBFeHRlbmRlZFNvdXJjZVZpZXdlciB2aWV3ZXIgPSAoRXh0ZW5kZWRTb3VyY2VWaWV3ZXIpIGdldFNvdXJjZVZpZXdlcigpOwotICAgICAgICBTdHlsZWRUZXh0IHdpZGdldCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0gICAgICAgIHdpZGdldC5zZXRUZXh0KHRleHQpOwotICAgICAgICB2aWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZSgwLCB0ZXh0Lmxlbmd0aCgpKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9FeHRlbmRlZFRleHRTZWxlY3Rpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvRXh0ZW5kZWRUZXh0U2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MmFhNmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9FeHRlbmRlZFRleHRTZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRUZXh0U2VsZWN0aW9uIGV4dGVuZHMgVGV4dFNlbGVjdGlvbiBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotICAgIHN0YXRpYyBwcml2YXRlIEV4dGVuZGVkVGV4dFNlbGVjdGlvbkFjdGlvbkZpbHRlciBmaWx0ZXIgPSBuZXcgRXh0ZW5kZWRUZXh0U2VsZWN0aW9uQWN0aW9uRmlsdGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRXh0ZW5kZWRUZXh0U2VsZWN0aW9uLgotICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICovCi0gICAgcHVibGljIEV4dGVuZGVkVGV4dFNlbGVjdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIHN1cGVyKG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRXh0ZW5kZWRUZXh0U2VsZWN0aW9uLgotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICovCi0gICAgcHVibGljIEV4dGVuZGVkVGV4dFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgc3VwZXIoZG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSUFkYXB0YWJsZSNnZXRBZGFwdGVyKENsYXNzKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChhZGFwdGVyID09IElBY3Rpb25GaWx0ZXIuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWx0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvRXh0ZW5kZWRUZXh0U2VsZWN0aW9uQWN0aW9uRmlsdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL0V4dGVuZGVkVGV4dFNlbGVjdGlvbkFjdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2NjZWMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvRXh0ZW5kZWRUZXh0U2VsZWN0aW9uQWN0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFRleHRTZWxlY3Rpb25BY3Rpb25GaWx0ZXIgaW1wbGVtZW50cyBJQWN0aW9uRmlsdGVyIHsKLQotICAgIC8qKgotICAgICAqIEFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBzZWxlY3Rpb24gbGVuZ3RoICh2YWx1ZSA8Y29kZT4iaXNFbXB0eSI8L2NvZGU+KS4gIAotICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4geG1sIG11c3QgYmUgb25lIG9mIDxjb2RlPiJ0cnVlIiBvciAiZmFsc2UiPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19FTVBUWSA9ICJpc0VtcHR5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQW4gYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIHNlbGVjdGlvbiB0ZXh0ICh2YWx1ZSA8Y29kZT4idGV4dCI8L2NvZGU+KS4gIAotICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4geG1sIGlzIHVuY29uc3RyYWluZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQW4gYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIHNlbGVjdGlvbiB0ZXh0ICh2YWx1ZSA8Y29kZT4idGV4dCI8L2NvZGU+KS4gIAotICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4geG1sIGlzIHVuY29uc3RyYWluZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTRV9JTlNFTlNJVElWRV9URVhUID0gImNhc2VJbnNlbnNpdGl2ZVRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKgotICAgICAqIEBzZWUgSUFjdGlvbkZpbHRlciN0ZXN0QXR0cmlidXRlKE9iamVjdCwgU3RyaW5nLCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdGVzdEF0dHJpYnV0ZShPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIElUZXh0U2VsZWN0aW9uIHNlbCA9IChJVGV4dFNlbGVjdGlvbikgdGFyZ2V0OwotICAgICAgICBpZiAobmFtZS5lcXVhbHMoSVNfRU1QVFkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHNlbC5nZXRMZW5ndGgoKSA9PSAwKTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhURVhUKSkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBzZWwuZ2V0VGV4dCgpOwotICAgICAgICAgICAgcmV0dXJuICh0ZXh0LmluZGV4T2YodmFsdWUpID49IDApOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKENBU0VfSU5TRU5TSVRJVkVfVEVYVCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gc2VsLmdldFRleHQoKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgcmV0dXJuICh0ZXh0LmluZGV4T2YodmFsdWUpID49IDApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9Gb3JjZWRFeGNlcHRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvRm9yY2VkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NGNlNWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9Gb3JjZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi0vKioKLSAqIEFuIGludGVudGlvbmFsbHkgdGhyb3duIGV4Y2VwdGlvbiBmb3IgdXNlIGluIHRlc3RpbmcgZXJyb3IgaGFuZGxpbmcgY29kZS4KLSAqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JjZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCSBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQ9IDFMOwotCi0JIC8qKgotCSAgKiBDcmVhdGVzIGEgPGNvZGU+Rm9yY2VkRXhjZXB0aW9uPC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotCSAgKiAgCi0JICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCi0JICAqLwotCSBwdWJsaWMgRm9yY2VkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCSBzdXBlcihtZXNzYWdlKTsKLQkgfQotCSAKLQkgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHMpIHsKLQkgCQkgcy5wcmludGxuKCIhRk9SQ0VEIEJZIFRFU1Q6IHRoaXMgZW50cnkgaXMgaW50ZW50aW9uYWw6ICIgKyBnZXRNZXNzYWdlKCkpOwotCSB9Ci0JIAkJIAkJIAotCSBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgcykgewotCSAJCSBzLnByaW50bG4oIiFGT1JDRUQgQlkgVEVTVDogdGhpcyBlbnRyeSBpcyBpbnRlbnRpb25hbDoiICsgZ2V0TWVzc2FnZSgpKTsKLQkgfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL0ludGVybmFsVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL0ludGVybmFsVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZjIwNGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9JbnRlcm5hbFRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMubWFya2Vycy5CdWc3NTkwOVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMubWFya2Vycy5EZWNsYXJhdGl2ZUZpbHRlckFjdGl2aXR5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5tYXJrZXJzLkRlY2xhcmF0aXZlRmlsdGVyRGVjbGFyYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLm1hcmtlcnMuUmVzb3VyY2VNYXBwaW5nTWFya2Vyc1Rlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRlc3QgYWxsIGFyZWFzIG9mIHRoZSBVSSBJbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEludGVybmFsVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1aXRlLiAgVGhpcyBpcyByZXF1aXJlZCB0bwotICAgICAqIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IEludGVybmFsVGVzdFN1aXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IHRoZSB0ZXN0IHN1aXRlLgotICAgICAqLwotICAgIHB1YmxpYyBJbnRlcm5hbFRlc3RTdWl0ZSgpIHsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKEVkaXRvckFjdGlvbkJhcnNUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShBY3Rpb25TZXRFeHByZXNzaW9uVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoUG9wdXBNZW51RXhwcmVzc2lvblRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1ZzQxOTMxVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KEJ1Zzc1OTA5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1Zzc4NDcwVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoRGVjbGFyYXRpdmVGaWx0ZXJBY3Rpdml0eVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKERlY2xhcmF0aXZlRmlsdGVyRGVjbGFyYXRpb25UZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShSZXNvdXJjZU1hcHBpbmdNYXJrZXJzVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KEJ1Zzk5ODU4VGVzdC5zdWl0ZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL1BvcHVwTWVudUV4cHJlc3Npb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL1BvcHVwTWVudUV4cHJlc3Npb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NTZlNmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9Qb3B1cE1lbnVFeHByZXNzaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQWN0aW9uVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRlc3RzIGZvciBwb3B1cCBtZW51IHZpc2liaWxpdHkKLSAqLwotcHVibGljIGNsYXNzIFBvcHVwTWVudUV4cHJlc3Npb25UZXN0IGV4dGVuZHMgQWN0aW9uRXhwcmVzc2lvblRlc3QgewotCi0gICAgcHVibGljIFBvcHVwTWVudUV4cHJlc3Npb25UZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVudSBtYW5hZ2VyIGNvbnRhaW5pbmcgdGhlIGFjdGlvbnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGdldEFjdGlvbk1lbnVNYW5hZ2VyKExpc3RWaWV3IHZpZXcpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICByZXR1cm4gdmlldy5nZXRNZW51TWFuYWdlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSB2aXNpYmlsaXR5IG9mIGFuIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0QWN0aW9uKE1lbnVNYW5hZ2VyIG1nciwgU3RyaW5nIGFjdGlvbiwgYm9vbGVhbiBleHBlY3RlZCkKLSAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBpZiAoZXhwZWN0ZWQpCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFjdGlvbiwgQWN0aW9uVXRpbC5nZXRBY3Rpb25XaXRoTGFiZWwobWdyLCBhY3Rpb24pKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNzZXJ0TnVsbChhY3Rpb24sIEFjdGlvblV0aWwuZ2V0QWN0aW9uV2l0aExhYmVsKG1nciwgYWN0aW9uKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4cHJlc3Npb25FbmFibGVkQWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIFNldHVwLgotICAgICAgICBMaXN0VmlldyB2aWV3ID0gc2hvd0xpc3RWaWV3KCk7Ci0gICAgICAgIE1lbnVNYW5hZ2VyIG1nciA9IGdldEFjdGlvbk1lbnVNYW5hZ2VyKHZpZXcpOwotCi0gICAgICAgIC8vIFRlc3QgbnVsbCBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUodmlldywgbnVsbCwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJleHByZXNzaW9uRW5hYmxlbWVudEFjdGlvbl92MiIsIGZhbHNlKTsKLQotICAgICAgICAvLyBUZXN0IHJlZCBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUodmlldywgcmVkLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgImV4cHJlc3Npb25FbmFibGVtZW50QWN0aW9uX3YyIiwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGVzdCBibHVlIHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudSh2aWV3LCBibHVlLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgImV4cHJlc3Npb25FbmFibGVtZW50QWN0aW9uX3YyIiwgZmFsc2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9UZXN0TWVtZW50by5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRlcm5hbC9UZXN0TWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzJhODVmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvVGVzdE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLQotcHVibGljIGNsYXNzIFRlc3RNZW1lbnRvIGltcGxlbWVudHMgSU1lbWVudG8gewotCQotCVN0cmluZyB0eXBlTmFtZTsKLQlTdHJpbmcgaWQ7Ci0JSGFzaFNldCBjaGlsZHJlbiA9IG5ldyBIYXNoU2V0KCk7Ci0JSGFzaHRhYmxlIHZhbHVlcyA9IG5ldyBIYXNodGFibGUoKTsKLQlTdHJpbmcgdGV4dERhdGE7Ci0JCi0JcHVibGljIFRlc3RNZW1lbnRvKFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpewotCQl0eXBlTmFtZSA9IHR5cGU7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIGNyZWF0ZUNoaWxkKHR5cGUsIG51bGwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvI2NyZWF0ZUNoaWxkKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpIHsKLQkJSU1lbWVudG8gY2hpbGQgID0gbmV3IFRlc3RNZW1lbnRvKHR5cGVOYW1lLGlkKTsKLQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvI2dldENoaWxkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCVRlc3RNZW1lbnRvIG5leHQgPSAoVGVzdE1lbWVudG8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG5leHQudHlwZU5hbWUuZXF1YWxzKHR5cGUpKQotCQkJCXJldHVybiBuZXh0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJTWVtZW50b1tdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvbiBtYXRjaGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCVRlc3RNZW1lbnRvIG5leHQgPSAoVGVzdE1lbWVudG8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG5leHQudHlwZU5hbWUuZXF1YWxzKHR5cGUpKXsKLQkJCQltYXRjaGVzLmFkZChuZXh0KTsKLQkJCX0KLQkJfQotCQkKLQkJSU1lbWVudG9bXSByZXR1cm5WYWx1ZSA9IG5ldyBJTWVtZW50b1ttYXRjaGVzLnNpemUoKV07Ci0JCW1hdGNoZXMudG9BcnJheShyZXR1cm5WYWx1ZSk7Ci0JCXJldHVybiByZXR1cm5WYWx1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWVtZW50byNnZXRGbG9hdChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBGbG9hdCBnZXRGbG9hdChTdHJpbmcga2V5KSB7Ci0JCWlmKHZhbHVlcy5jb250YWluc0tleShrZXkpKQotCQkJcmV0dXJuIChGbG9hdCkgdmFsdWVzLmdldChrZXkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWVtZW50byNnZXRJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvI2dldEludGVnZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJbnRlZ2VyKFN0cmluZyBrZXkpIHsKLQkJaWYodmFsdWVzLmNvbnRhaW5zS2V5KGtleSkpCi0JCQlyZXR1cm4gKEludGVnZXIpIHZhbHVlcy5nZXQoa2V5KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1lbWVudG8jZ2V0U3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZih2YWx1ZXMuY29udGFpbnNLZXkoa2V5KSkKLQkJCXJldHVybiAoU3RyaW5nKSB2YWx1ZXMuZ2V0KGtleSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvI2dldFRleHREYXRhKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHREYXRhKCkgewotCQlyZXR1cm4gdGV4dERhdGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1lbWVudG8jcHV0RmxvYXQoamF2YS5sYW5nLlN0cmluZywgZmxvYXQpCi0JICovCi0JcHVibGljIHZvaWQgcHV0RmxvYXQoU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpIHsKLQkJdmFsdWVzLnB1dChrZXksbmV3IEZsb2F0KHZhbHVlKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1lbWVudG8jcHV0SW50ZWdlcihqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgdmFsdWUpIHsKLQkJdmFsdWVzLnB1dChrZXksbmV3IEludGVnZXIodmFsdWUpKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvI3B1dE1lbWVudG8ob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHVibGljIHZvaWQgcHV0TWVtZW50byhJTWVtZW50byBtZW1lbnRvKSB7Ci0JCVRlc3RNZW1lbnRvIG5ld01lbWVudG8gPSAoVGVzdE1lbWVudG8pIG1lbWVudG87Ci0JCXR5cGVOYW1lID0gbmV3TWVtZW50by50eXBlTmFtZTsKLQkJaWQgPSAgbmV3TWVtZW50by5pZDsKLQkJY2hpbGRyZW4gPSAgbmV3TWVtZW50by5jaGlsZHJlbjsKLQkJdmFsdWVzID0gIG5ld01lbWVudG8udmFsdWVzOwotCQl0ZXh0RGF0YSA9ICBuZXdNZW1lbnRvLnRleHREYXRhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvI3B1dFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJdmFsdWVzLnB1dChrZXksdmFsdWUpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1lbWVudG8jcHV0VGV4dERhdGEoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRUZXh0RGF0YShTdHJpbmcgZGF0YSkgewotCQl0ZXh0RGF0YSA9IGRhdGE7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvVGV4dFNlbGVjdGlvbkFjdGlvbkV4cHJlc3Npb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludGVybmFsL1RleHRTZWxlY3Rpb25BY3Rpb25FeHByZXNzaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3MmY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50ZXJuYWwvVGV4dFNlbGVjdGlvbkFjdGlvbkV4cHJlc3Npb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5BY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRlc3RzIGZvciB0ZXh0IHNlbGVjdGlvbiBhY3Rpb24gZW5hYmxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgVGV4dFNlbGVjdGlvbkFjdGlvbkV4cHJlc3Npb25UZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgZldpbmRvdzsKLQotICAgIHByb3RlY3RlZCBJV29ya2JlbmNoUGFnZSBmUGFnZTsKLQotICAgIHB1YmxpYyBUZXh0U2VsZWN0aW9uQWN0aW9uRXhwcmVzc2lvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICAgICAgZldpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0gICAgICAgIGZQYWdlID0gZldpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFueVRleHRBY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gU2V0dXAuCi0gICAgICAgIEV4dGVuZGVkVGV4dEVkaXRvciBlZGl0b3IgPSBzaG93VGV4dEVkaXRvcigiYW55VGV4dC5leHR0eHQiKTsKLSAgICAgICAgTWVudU1hbmFnZXIgbWdyID0gZ2V0QWN0aW9uTWVudU1hbmFnZXIoZWRpdG9yKTsKLQotICAgICAgICAvLyBUZXN0IGVtcHR5IHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudShlZGl0b3IsICIiLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgImFueVRleHQiLCB0cnVlKTsKLQotICAgICAgICAvLyBUZXN0IGZ1bGwgc2VsZWN0aW9uLgotICAgICAgICBzZWxlY3RBbmRVcGRhdGVNZW51KGVkaXRvciwgImJvYiIsIG1ncik7Ci0gICAgICAgIHRlc3RBY3Rpb24obWdyLCAiYW55VGV4dCIsIHRydWUpOwotCi0gICAgICAgIC8vIEFjdGl2YXRlIGFub3RoZXIgdmlldy4KLSAgICAgICAgZlBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJhbnlUZXh0IiwgZmFsc2UpOwotCi0gICAgICAgIC8vIEFjdGl2YXRlIGVkaXRvci4KLSAgICAgICAgLy8gVGVzdCBvbGQgc2VsZWN0aW9uLgotICAgICAgICBmUGFnZS5hY3RpdmF0ZShlZGl0b3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgImFueVRleHQiLCB0cnVlKTsKLQotICAgICAgICAvLyBUZXN0IGVtcHR5IHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudShlZGl0b3IsICIiLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgImFueVRleHQiLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlUZXh0QWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIFNldHVwLgotICAgICAgICBFeHRlbmRlZFRleHRFZGl0b3IgZWRpdG9yID0gc2hvd1RleHRFZGl0b3IoImVtcHR5VGV4dC5leHR0eHQiKTsKLSAgICAgICAgTWVudU1hbmFnZXIgbWdyID0gZ2V0QWN0aW9uTWVudU1hbmFnZXIoZWRpdG9yKTsKLQotICAgICAgICAvLyBUZXN0IGVtcHR5IHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudShlZGl0b3IsICIiLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgImVtcHR5VGV4dCIsIHRydWUpOwotCi0gICAgICAgIC8vIFRlc3QgZnVsbCBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUoZWRpdG9yLCAiYm9iIiwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJlbXB0eVRleHQiLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gQWN0aXZhdGUgYW5vdGhlciB2aWV3LgotICAgICAgICBmUGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgImVtcHR5VGV4dCIsIGZhbHNlKTsKLQotICAgICAgICAvLyBBY3RpdmF0ZSBlZGl0b3IuCi0gICAgICAgIC8vIFRlc3Qgb2xkIHNlbGVjdGlvbi4KLSAgICAgICAgZlBhZ2UuYWN0aXZhdGUoZWRpdG9yKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJlbXB0eVRleHQiLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gVGVzdCBlbXB0eSBzZWxlY3Rpb24uCi0gICAgICAgIHNlbGVjdEFuZFVwZGF0ZU1lbnUoZWRpdG9yLCAiIiwgbWdyKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJlbXB0eVRleHQiLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9UZXh0QWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIFNldHVwLgotICAgICAgICBFeHRlbmRlZFRleHRFZGl0b3IgZWRpdG9yID0gc2hvd1RleHRFZGl0b3IoImhlbGxvVGV4dC5leHR0eHQiKTsKLSAgICAgICAgTWVudU1hbmFnZXIgbWdyID0gZ2V0QWN0aW9uTWVudU1hbmFnZXIoZWRpdG9yKTsKLQotICAgICAgICAvLyBUZXN0IGVtcHR5IHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudShlZGl0b3IsICIiLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgImhlbGxvVGV4dCIsIGZhbHNlKTsKLQotICAgICAgICAvLyBUZXN0IHdyb25nIHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudShlZGl0b3IsICJib2IiLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgImhlbGxvVGV4dCIsIGZhbHNlKTsKLQotICAgICAgICAvLyBUZXN0IHJpZ2h0IHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudShlZGl0b3IsICJIZWxsbyIsIG1ncik7Ci0gICAgICAgIHRlc3RBY3Rpb24obWdyLCAiaGVsbG9UZXh0IiwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gQWN0aXZhdGUgYW5vdGhlciB2aWV3LgotICAgICAgICBmUGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgImhlbGxvVGV4dCIsIGZhbHNlKTsKLQotICAgICAgICAvLyBBY3RpdmF0ZSBlZGl0b3IuCi0gICAgICAgIC8vIFRlc3Qgb2xkIHNlbGVjdGlvbi4KLSAgICAgICAgZlBhZ2UuYWN0aXZhdGUoZWRpdG9yKTsKLSAgICAgICAgdGVzdEFjdGlvbihtZ3IsICJoZWxsb1RleHQiLCB0cnVlKTsKLQotICAgICAgICAvLyBUZXN0IHdyb25nIHNlbGVjdGlvbi4KLSAgICAgICAgc2VsZWN0QW5kVXBkYXRlTWVudShlZGl0b3IsICJib2IiLCBtZ3IpOwotICAgICAgICB0ZXN0QWN0aW9uKG1nciwgImhlbGxvVGV4dCIsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBsaXN0IHZpZXcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFeHRlbmRlZFRleHRFZGl0b3Igc2hvd1RleHRFZGl0b3IoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSVByb2plY3QgcHJvaiA9IEZpbGVVdGlsCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb2plY3QoIlRleHRTZWxlY3Rpb25BY3Rpb25FeHByZXNzaW9uVGVzdCIpOwotICAgICAgICBJRmlsZSBmaWxlID0gRmlsZVV0aWwuY3JlYXRlRmlsZShmaWxlTmFtZSwgcHJvaik7Ci0gICAgICAgIHJldHVybiAoRXh0ZW5kZWRUZXh0RWRpdG9yKSBJREUub3BlbkVkaXRvcihmUGFnZSwgZmlsZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0IGFuIG9iamVjdCBhbmQgZmlyZSBhYm91dCB0byBzaG93LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZWxlY3RBbmRVcGRhdGVNZW51KEV4dGVuZGVkVGV4dEVkaXRvciBlZGl0b3IsIFN0cmluZyBzdHIsCi0gICAgICAgICAgICBNZW51TWFuYWdlciBtZ3IpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBlZGl0b3Iuc2V0VGV4dChzdHIpOwotICAgICAgICBmUGFnZS5zYXZlRWRpdG9yKGVkaXRvciwgZmFsc2UpOwotICAgICAgICBBY3Rpb25VdGlsLmZpcmVBYm91dFRvU2hvdyhtZ3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lbnUgbWFuYWdlciBjb250YWluaW5nIHRoZSBhY3Rpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgTWVudU1hbmFnZXIgZ2V0QWN0aW9uTWVudU1hbmFnZXIoRXh0ZW5kZWRUZXh0RWRpdG9yIGVkaXRvcikKLSAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmUGFnZQotICAgICAgICAgICAgICAgIC5zaG93QWN0aW9uU2V0KCJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5UZXh0U2VsZWN0aW9uQWN0aW9ucyIpOwotICAgICAgICBXb3JrYmVuY2hXaW5kb3cgd2luID0gKFdvcmtiZW5jaFdpbmRvdykgZldpbmRvdzsKLSAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IHdpbi5nZXRNZW51QmFyTWFuYWdlcigpLmZpbmQoCi0gICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLlRleHRTZWxlY3Rpb25NZW51Iik7Ci0gICAgICAgIHdoaWxlIChpdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgewotICAgICAgICAgICAgaXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0SW5uZXJJdGVtKCk7Ci0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIE1lbnVNYW5hZ2VyKQotICAgICAgICAgICAgICAgIHJldHVybiAoTWVudU1hbmFnZXIpIGl0ZW07Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiVW5hYmxlIHRvIGZpbmQgbWVudSBtYW5hZ2VyIik7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBlbmFibGVtZW50IC8gdmlzaWJpbGl0eSBvZiBhbiBhY3Rpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RBY3Rpb24oTWVudU1hbmFnZXIgbWdyLCBTdHJpbmcgYWN0aW9uLCBib29sZWFuIGV4cGVjdGVkKQotICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhY3Rpb24sIGV4cGVjdGVkLCBBY3Rpb25VdGlsLmdldEFjdGlvbldpdGhMYWJlbChtZ3IsCi0gICAgICAgICAgICAgICAgYWN0aW9uKS5pc0VuYWJsZWQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRyby9JbnRyb1BhcnRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludHJvL0ludHJvUGFydFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkMzI2Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludHJvL0ludHJvUGFydFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaW50cm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmludHJvLkludHJvRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRyby5JSW50cm9QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5JV29ya2JlbmNoUGFydFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5DYWxsSGlzdG9yeTsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRyb1BhcnRUZXN0IGV4dGVuZHMgSVdvcmtiZW5jaFBhcnRUZXN0IHsKLQotICAgIHByaXZhdGUgSW50cm9EZXNjcmlwdG9yIG9sZERlc2M7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgSW50cm9QYXJ0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5JV29ya2JlbmNoUGFydFRlc3Qjb3BlblBhcnQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2UpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1vY2tQYXJ0IG9wZW5QYXJ0KElXb3JrYmVuY2hQYWdlIHBhZ2UpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICByZXR1cm4gKE1vY2tJbnRyb1BhcnQpIHBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0SW50cm9NYW5hZ2VyKCkuc2hvd0ludHJvKHBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuSVdvcmtiZW5jaFBhcnRUZXN0I2Nsb3NlUGFydChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZSwgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlUGFydChJV29ya2JlbmNoUGFnZSBwYWdlLCBNb2NrUGFydCBwYXJ0KQotICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGFzc2VydFRydWUocGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKS5nZXRJbnRyb01hbmFnZXIoKQotICAgICAgICAgICAgICAgIC5jbG9zZUludHJvKChJSW50cm9QYXJ0KSBwYXJ0KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbmRDbG9zZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBPcGVuIGEgcGFydC4KLSAgICAgICAgTW9ja1BhcnQgcGFydCA9IG9wZW5QYXJ0KGZQYWdlKTsKLSAgICAgICAgQ2FsbEhpc3RvcnkgaGlzdG9yeSA9IHBhcnQuZ2V0Q2FsbEhpc3RvcnkoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoaXN0b3J5LnZlcmlmeU9yZGVyKG5ldyBTdHJpbmdbXSB7ICJpbml0IiwKLSAgICAgICAgICAgICAgICAiY3JlYXRlUGFydENvbnRyb2wiLCAic2V0Rm9jdXMiLCAic3RhbmRieVN0YXRlQ2hhbmdlZCIgfSkpOwotCi0gICAgICAgIC8vIENsb3NlIHRoZSBwYXJ0LgotICAgICAgICBjbG9zZVBhcnQoZlBhZ2UsIHBhcnQpOwotICAgICAgICBhc3NlcnRUcnVlKGhpc3RvcnkudmVyaWZ5T3JkZXIobmV3IFN0cmluZ1tdIHsgImluaXQiLAotICAgICAgICAgICAgICAgICJjcmVhdGVQYXJ0Q29udHJvbCIsICJzZXRGb2N1cyIsICJkaXNwb3NlIiB9KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdG8gZW5zdXJlIHRoYXQgdGhlIGltYWdlIG9mIHRoZSBkZXNjcmlwdG9yIGlzIHRoZSBzYW1lIGFzIHRoZSBwYXJ0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEltYWdlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIE1vY2tQYXJ0IHBhcnQgPSBvcGVuUGFydChmUGFnZSk7Ci0gICAgICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbnRyb0Rlc2MoKS5nZXRJbWFnZURlc2NyaXB0b3IoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpbWFnZURlc2NyaXB0b3IpOwotCi0gICAgICAgIEltYWdlIGRlc2NJbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZShmYWxzZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGVzY0ltYWdlKTsKLQotICAgICAgICBJbWFnZSBwYXJ0SW1hZ2UgPSBwYXJ0LmdldFRpdGxlSW1hZ2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJ0SW1hZ2UpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZGVzY0ltYWdlLmdldEltYWdlRGF0YSgpLmRhdGEsIHBhcnRJbWFnZQotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURhdGEoKS5kYXRhKSk7Ci0gICAgICAgIGlmIChkZXNjSW1hZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIGRlc2NJbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIGNsb3NlUGFydChmUGFnZSwgcGFydCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC5VSVRlc3RDYXNlI2RvU2V0VXAoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICBvbGREZXNjID0gV29ya2JlbmNoLmdldEluc3RhbmNlKCkuZ2V0SW50cm9EZXNjcmlwdG9yKCk7Ci0gICAgICAgIEludHJvRGVzY3JpcHRvciB0ZXN0RGVzYyA9IGdldEludHJvRGVzYygpOwotICAgICAgICBXb3JrYmVuY2guZ2V0SW5zdGFuY2UoKS5zZXRJbnRyb0Rlc2NyaXB0b3IodGVzdERlc2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIEludHJvRGVzY3JpcHRvciBnZXRJbnRyb0Rlc2MoKSB7Ci0gICAgICAgIHJldHVybiAoSW50cm9EZXNjcmlwdG9yKSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldEludHJvUmVnaXN0cnkoKS5nZXRJbnRybygib3JnLmVjbGlwc2UudWkudGVzdGludHJvIik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC5VSVRlc3RDYXNlI2RvVGVhckRvd24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9UZWFyRG93bigpOwotICAgICAgICBXb3JrYmVuY2guZ2V0SW5zdGFuY2UoKS5zZXRJbnRyb0Rlc2NyaXB0b3Iob2xkRGVzYyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRyby9JbnRyb1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50cm8vSW50cm9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxODRhNTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRyby9JbnRyb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaW50cm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaW50cm8uSUludHJvQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmludHJvLkludHJvRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRyby5JSW50cm9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlBlcnNwZWN0aXZlV2l0aEZhc3RWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5FbXB0eVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEludHJvVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBJbnRyb0Rlc2NyaXB0b3Igb2xkRGVzYzsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBJbnRyb1Rlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlSW5GYXN0Vmlld1BlcnNwZWN0aXZlKCkgewotICAgIAl0ZXN0Q2xvc2UoUGVyc3BlY3RpdmVXaXRoRmFzdFZpZXcuUEVSU1BfSUQpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUluRW1wdHlQZXJzcGVjdGl2ZSgpIHsKLSAgICAJdGVzdENsb3NlKEVtcHR5UGVyc3BlY3RpdmUuUEVSU1BfSUQpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUluTm9uRW1wdHlQZXJzcGVjdGl2ZSgpIHsKLSAgICAJdGVzdENsb3NlKCJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RDbG9zZShTdHJpbmcgcGVyc3BlY3RpdmVJZCkgewotCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSB3aW5kb3cuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZCgKLQkJCQkJCXBlcnNwZWN0aXZlSWQpOwotCQl3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpLnNldFBlcnNwZWN0aXZlKGRlc2NyaXB0b3IpOwotCi0JCUlJbnRyb01hbmFnZXIgaW50cm9NYW5hZ2VyID0gd2luZG93LmdldFdvcmtiZW5jaCgpLmdldEludHJvTWFuYWdlcigpOwotCQlJSW50cm9QYXJ0IHBhcnQgPSBpbnRyb01hbmFnZXIuc2hvd0ludHJvKHdpbmRvdywgZmFsc2UpOwotCQlpbnRyb01hbmFnZXIuY2xvc2VJbnRybyhwYXJ0KTsKLQotCQlhc3NlcnRUcnVlKCgoV29ya2JlbmNoV2luZG93KSB3aW5kb3cpLmdldENvb2xCYXJWaXNpYmxlKCkpOwotCQlhc3NlcnRUcnVlKCgoV29ya2JlbmNoV2luZG93KSB3aW5kb3cpLmdldFBlcnNwZWN0aXZlQmFyVmlzaWJsZSgpKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3coKSB7Ci0gICAgICAgIElJbnRyb01hbmFnZXIgaW50cm9NYW5hZ2VyID0gd2luZG93LmdldFdvcmtiZW5jaCgpLmdldEludHJvTWFuYWdlcigpOwotICAgICAgICBJSW50cm9QYXJ0IHBhcnQgPSBpbnRyb01hbmFnZXIuc2hvd0ludHJvKHdpbmRvdywgZmFsc2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcnQpOwotICAgICAgICBhc3NlcnRGYWxzZShpbnRyb01hbmFnZXIuaXNJbnRyb1N0YW5kYnkocGFydCkpOwotICAgICAgICBpbnRyb01hbmFnZXIuY2xvc2VJbnRybyhwYXJ0KTsKLSAgICAgICAgYXNzZXJ0TnVsbChpbnRyb01hbmFnZXIuZ2V0SW50cm8oKSk7Ci0KLSAgICAgICAgcGFydCA9IGludHJvTWFuYWdlci5zaG93SW50cm8od2luZG93LCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJ0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnRyb01hbmFnZXIuaXNJbnRyb1N0YW5kYnkocGFydCkpOwotICAgICAgICBhc3NlcnRUcnVlKGludHJvTWFuYWdlci5jbG9zZUludHJvKHBhcnQpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChpbnRyb01hbmFnZXIuZ2V0SW50cm8oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYnkoKSB7Ci0gICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gd2luZG93LmdldFdvcmtiZW5jaCgpOwotICAgICAgICBJSW50cm9QYXJ0IHBhcnQgPSB3b3JrYmVuY2guZ2V0SW50cm9NYW5hZ2VyKCkuc2hvd0ludHJvKHdpbmRvdywgZmFsc2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcnQpOwotICAgICAgICBhc3NlcnRGYWxzZSh3b3JrYmVuY2guZ2V0SW50cm9NYW5hZ2VyKCkuaXNJbnRyb1N0YW5kYnkocGFydCkpOwotICAgICAgICB3b3JrYmVuY2guZ2V0SW50cm9NYW5hZ2VyKCkuc2V0SW50cm9TdGFuZGJ5KHBhcnQsIHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKHdvcmtiZW5jaC5nZXRJbnRyb01hbmFnZXIoKS5pc0ludHJvU3RhbmRieShwYXJ0KSk7Ci0gICAgICAgIGFzc2VydFRydWUod29ya2JlbmNoLmdldEludHJvTWFuYWdlcigpLmNsb3NlSW50cm8ocGFydCkpOwotICAgICAgICBhc3NlcnROdWxsKHdvcmtiZW5jaC5nZXRJbnRyb01hbmFnZXIoKS5nZXRJbnRybygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVuIHRoZSBpbnRybywgY2hhbmdlIHBlcnNwZWN0aXZlLCBjbG9zZSB0aGUgaW50cm8gKGVuc3VyZSBpdCBzdGlsbCAKLSAgICAgKiBleGlzdHMpLCBjaGFuZ2UgYmFjayB0byB0aGUgZmlyc3QgcGVyc3BlY3RpdmUsIGNsb3NlIHRoZSBpbnRybywgZW5zdXJlIAotICAgICAqIHRoYXQgaXQgbm8gbG9uZ2VyIGV4aXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc3BlY3RpdmVDaGFuZ2UoKSB7Ci0gICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gd2luZG93LmdldFdvcmtiZW5jaCgpOwotICAgICAgICBJSW50cm9QYXJ0IHBhcnQgPSB3b3JrYmVuY2guZ2V0SW50cm9NYW5hZ2VyKCkuc2hvd0ludHJvKHdpbmRvdywgZmFsc2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcnQpOwotICAgICAgICBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBvbGREZXNjID0gYWN0aXZlUGFnZS5nZXRQZXJzcGVjdGl2ZSgpOwotICAgICAgICBhY3RpdmVQYWdlLnNldFBlcnNwZWN0aXZlKFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU2Vzc2lvblBlcnNwZWN0aXZlIikpOwotICAgICAgICBhc3NlcnRGYWxzZSh3b3JrYmVuY2guZ2V0SW50cm9NYW5hZ2VyKCkuY2xvc2VJbnRybyhwYXJ0KSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod29ya2JlbmNoLmdldEludHJvTWFuYWdlcigpLmdldEludHJvKCkpOwotCi0gICAgICAgIGFjdGl2ZVBhZ2Uuc2V0UGVyc3BlY3RpdmUob2xkRGVzYyk7Ci0gICAgICAgIGFzc2VydFRydWUod29ya2JlbmNoLmdldEludHJvTWFuYWdlcigpLmNsb3NlSW50cm8ocGFydCkpOwotICAgICAgICBhc3NlcnROdWxsKHdvcmtiZW5jaC5nZXRJbnRyb01hbmFnZXIoKS5nZXRJbnRybygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc3BlY3RpdmVSZXNldCgpIHsKLSAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSB3aW5kb3cuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIElJbnRyb1BhcnQgcGFydCA9IHdvcmtiZW5jaC5nZXRJbnRyb01hbmFnZXIoKS5zaG93SW50cm8od2luZG93LCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFydCk7Ci0gICAgICAgIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCkucmVzZXRQZXJzcGVjdGl2ZSgpOwotICAgICAgICBwYXJ0ID0gd29ya2JlbmNoLmdldEludHJvTWFuYWdlcigpLmdldEludHJvKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFydCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHdvcmtiZW5jaC5nZXRJbnRyb01hbmFnZXIoKS5pc0ludHJvU3RhbmRieShwYXJ0KSk7Ci0KLSAgICAgICAgd29ya2JlbmNoLmdldEludHJvTWFuYWdlcigpLnNldEludHJvU3RhbmRieShwYXJ0LCB0cnVlKTsKLSAgICAgICAgd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5yZXNldFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgIHBhcnQgPSB3b3JrYmVuY2guZ2V0SW50cm9NYW5hZ2VyKCkuZ2V0SW50cm8oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJ0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh3b3JrYmVuY2guZ2V0SW50cm9NYW5hZ2VyKCkuaXNJbnRyb1N0YW5kYnkocGFydCkpOwotICAgICAgICBhc3NlcnRUcnVlKHdvcmtiZW5jaC5nZXRJbnRyb01hbmFnZXIoKS5jbG9zZUludHJvKHBhcnQpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh3b3JrYmVuY2guZ2V0SW50cm9NYW5hZ2VyKCkuZ2V0SW50cm8oKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotCSAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgdGhlIHBhcnQgaXMgcHJvcGVybHkgbnVsbGVkIG91dCB3aGVuIHRoZSBpbnRybyBpcwotCSAqIGNsb3NlZCB2aWEgdGhlIHZpZXcgY2xvc2UgbWVjaGFuaXNtLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RWaWV3Q2xvc3VyZSgpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSB3aW5kb3cuZ2V0V29ya2JlbmNoKCk7Ci0JCUlJbnRyb1BhcnQgcGFydCA9IHdvcmtiZW5jaC5nZXRJbnRyb01hbmFnZXIoKS5zaG93SW50cm8od2luZG93LCBmYWxzZSk7Ci0JCWFzc2VydE5vdE51bGwocGFydCk7Ci0JCUlWaWV3UGFydCB2aWV3UGFydCA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZmluZFZpZXcoCi0JCQkJSUludHJvQ29uc3RhbnRzLklOVFJPX1ZJRVdfSUQpOwotCQlhc3NlcnROb3ROdWxsKHZpZXdQYXJ0KTsKLQkJd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5oaWRlVmlldyh2aWV3UGFydCk7Ci0JCWFzc2VydE51bGwod29ya2JlbmNoLmdldEludHJvTWFuYWdlcigpLmdldEludHJvKCkpOwotCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuVUlUZXN0Q2FzZSNkb1NldFVwKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICAgICAgb2xkRGVzYyA9IFdvcmtiZW5jaC5nZXRJbnN0YW5jZSgpLmdldEludHJvRGVzY3JpcHRvcigpOwotICAgICAgICBJbnRyb0Rlc2NyaXB0b3IgdGVzdERlc2MgPSAoSW50cm9EZXNjcmlwdG9yKSBXb3JrYmVuY2hQbHVnaW4KLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdCgpLmdldEludHJvUmVnaXN0cnkoKS5nZXRJbnRybygKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS51aS50ZXN0aW50cm8iKTsKLSAgICAgICAgV29ya2JlbmNoLmdldEluc3RhbmNlKCkuc2V0SW50cm9EZXNjcmlwdG9yKHRlc3REZXNjKTsKLSAgICAgICAgd2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLlVJVGVzdENhc2UjZG9UZWFyRG93bigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1RlYXJEb3duKCk7Ci0gICAgICAgIFdvcmtiZW5jaC5nZXRJbnN0YW5jZSgpLnNldEludHJvRGVzY3JpcHRvcihvbGREZXNjKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludHJvL0ludHJvVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludHJvL0ludHJvVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNGJkNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRyby9JbnRyb1Rlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmludHJvOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRyb1Rlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW50cm9UZXN0U3VpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgSW50cm9UZXN0U3VpdGUoKSB7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShJbnRyb1BhcnRUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShOb0ludHJvUGFydFRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKEludHJvVGVzdC5jbGFzcykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50cm8vTW9ja0ludHJvUGFydC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRyby9Nb2NrSW50cm9QYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MWJmNWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9pbnRyby9Nb2NrSW50cm9QYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaW50cm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRyby5JSW50cm9QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tQYXJ0OwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIE1vY2tJbnRyb1BhcnQgZXh0ZW5kcyBNb2NrUGFydCBpbXBsZW1lbnRzIElJbnRyb1BhcnQgewotCi0gICAgcHJpdmF0ZSBJSW50cm9TaXRlIHNpdGU7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgTW9ja0ludHJvUGFydCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUludHJvU2l0ZSBnZXRJbnRyb1NpdGUoKSB7Ci0gICAgICAgIHJldHVybiBzaXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSUludHJvU2l0ZSBzaXRlLCBJTWVtZW50byBtZW1lbnRvKQotICAgICAgICAgICAgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0U2l0ZShzaXRlKTsKLSAgICAgICAgY2FsbFRyYWNlLmFkZCgiaW5pdCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzaXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFNpdGUoSUludHJvU2l0ZSBzaXRlKSB7Ci0gICAgICAgIHRoaXMuc2l0ZSA9IHNpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJVmlld1BhcnQjc2F2ZVN0YXRlKElNZW1lbnRvKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvUGFydCNzdGFuZGJ5U3RhdGVDaGFuZ2VkKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhbmRieVN0YXRlQ2hhbmdlZChib29sZWFuIHN0YW5kYnkpIHsKLSAgICAgICAgY2FsbFRyYWNlLmFkZCgic3RhbmRieVN0YXRlQ2hhbmdlZCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50cm8vTm9JbnRyb1BhcnRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2ludHJvL05vSW50cm9QYXJ0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmQ5OWE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvaW50cm8vTm9JbnRyb1BhcnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuaW50cm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaW50cm8uSW50cm9EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLklXb3JrYmVuY2hQYXJ0VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1BhcnQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgTm9JbnRyb1BhcnRUZXN0IGV4dGVuZHMgSVdvcmtiZW5jaFBhcnRUZXN0IHsKLQotICAgIHByaXZhdGUgSW50cm9EZXNjcmlwdG9yIG9sZERlc2M7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgTm9JbnRyb1BhcnRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5JV29ya2JlbmNoUGFydFRlc3Qjb3BlblBhcnQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2UpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1vY2tQYXJ0IG9wZW5QYXJ0KElXb3JrYmVuY2hQYWdlIHBhZ2UpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICByZXR1cm4gKE1vY2tQYXJ0KSBwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgLmdldEludHJvTWFuYWdlcigpLnNob3dJbnRybyhwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLklXb3JrYmVuY2hQYXJ0VGVzdCNjbG9zZVBhcnQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2UsIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZVBhcnQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgTW9ja1BhcnQgcGFydCkKLSAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBhc3NlcnRUcnVlKHBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkuZ2V0SW50cm9NYW5hZ2VyKCkKLSAgICAgICAgICAgICAgICAuY2xvc2VJbnRybygoSUludHJvUGFydCkgcGFydCkpOwotICAgIH0KLQotICAgIC8vb25seSB0ZXN0IG9wZW4uLnNob3VsZG4ndCB3b3JrLgotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kQ2xvc2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gT3BlbiBhIHBhcnQuCi0gICAgICAgIE1vY2tQYXJ0IHBhcnQgPSBvcGVuUGFydChmUGFnZSk7Ci0gICAgICAgIGFzc2VydE51bGwocGFydCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC5VSVRlc3RDYXNlI2RvU2V0VXAoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICBvbGREZXNjID0gV29ya2JlbmNoLmdldEluc3RhbmNlKCkuZ2V0SW50cm9EZXNjcmlwdG9yKCk7Ci0gICAgICAgIFdvcmtiZW5jaC5nZXRJbnN0YW5jZSgpLnNldEludHJvRGVzY3JpcHRvcihudWxsKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLlVJVGVzdENhc2UjZG9UZWFyRG93bigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1RlYXJEb3duKCk7Ci0gICAgICAgIFdvcmtiZW5jaC5nZXRJbnN0YW5jZSgpLnNldEludHJvRGVzY3JpcHRvcihvbGREZXNjKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CaW5kaW5nSW50ZXJhY3Rpb25zVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0JpbmRpbmdJbnRlcmFjdGlvbnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmQyNjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0JpbmRpbmdJbnRlcmFjdGlvbnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmtleXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0cy5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHMuQ29udGV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5TY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuVHJpZ2dlclNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCBjYXNlcyBjb3ZlcmluZyB0aGUgdmFyaW91cyBpbnRlcmFjdGlvbiBiZXR3ZWVuIGJpbmRpbmdzLiBCaW5kaW5ncyB0aGF0Ci0gKiBoYXZlIGJlZW4gcmVtb3ZlZC4gQmluZGluZ3MgdGhhdCBoYXZlIGJlZW4gYWRkZWQuIEluaGVyaXRhbmNlIG9mIHZhcmlvdXMKLSAqIHByb3BlcnRpZXMuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmRpbmdJbnRlcmFjdGlvbnNUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBUaGUgYmluZGluZyBtYW5hZ2VyIHRvIHVzZSBpbiBlYWNoIHRlc3QgY2FzZS4gQSBuZXcgYmluZGluZyBtYW5hZ2VyIGlzCi0JICogY3JlYXRlZCBmb3IgZWFjaCB0ZXN0IGNhc2UsIGFuZCBpdCBpcyBkaXNwb3NlZCB3aGVuIHRoZSB0ZXN0IGlzIG92ZXIuCi0JICovCi0JcHJpdmF0ZSBCaW5kaW5nTWFuYWdlciBiaW5kaW5nTWFuYWdlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY29udGV4dCBtYW5hZ2VyIHRvIHVzZSBpbiBlYWNoIHRlc3QgY2FzZS4gQSBuZXcgY29udGV4dCBtYW5hZ2VyIGlzCi0JICogY3JlYXRlZCBmb3IgZWFjaCB0ZXN0IGNhc2UsIGFuZCBpdCBpcyBkaXNwb3NlZCB3aGVuIHRoZSB0ZXN0IGlzIG92ZXIuCi0JICovCi0JcHJpdmF0ZSBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgPGNvZGU+QmluZGluZ0ludGVyYWN0aW9uc1Rlc3Q8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotCSAqLwotCXB1YmxpYyBCaW5kaW5nSW50ZXJhY3Rpb25zVGVzdChmaW5hbCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgbWFuYWdlciBhbmQgYSBiaW5kaW5nIG1hbmFnZXIgZm9yIHVzZSBpbiB0aGUgdGVzdAotCSAqIGNhc2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB7Ci0JCWNvbnRleHRNYW5hZ2VyID0gbmV3IENvbnRleHRNYW5hZ2VyKCk7Ci0JCWJpbmRpbmdNYW5hZ2VyID0gbmV3IEJpbmRpbmdNYW5hZ2VyKGNvbnRleHRNYW5hZ2VyLAotCQkJCW5ldyBDb21tYW5kTWFuYWdlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlcyB0aGUgY29udGV4dCBtYW5hZ2VyIGFuZCBiaW5kaW5nIG1hbmFnZXIgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgewotCQljb250ZXh0TWFuYWdlciA9IG51bGw7Ci0JCWJpbmRpbmdNYW5hZ2VyID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUZXN0cyB3aGV0aGVyIHR3byBpZGVudGljYWwgYmluZGluZ3MgbGVhZCB0byBhIGNvbmZsaWN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc2NoZW1lIHdlIHRyeSB0byBhY3RpdmF0ZSBpcyBub3QgZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZmxpY3QoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIENvbnRleHQgY29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoIm5hIik7Ci0JCWNvbnRleHQuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0KLQkJZmluYWwgU2NoZW1lIHNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZSgibmEiKTsKLQkJc2NoZW1lLmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCi0JCWJpbmRpbmdNYW5hZ2VyLnNldEFjdGl2ZVNjaGVtZShzY2hlbWUpOwotCQlmaW5hbCBTZXQgYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJuYSIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCi0JCWZpbmFsIEJpbmRpbmcgYmluZGluZzEgPSBuZXcgVGVzdEJpbmRpbmcoImNvbmZsaWN0MSIsICJuYSIsICJuYSIsIG51bGwsCi0JCQkJbnVsbCwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmcxKTsKLQkJZmluYWwgQmluZGluZyBiaW5kaW5nMiA9IG5ldyBUZXN0QmluZGluZygiY29uZmxpY3QyIiwgIm5hIiwgIm5hIiwgbnVsbCwKLQkJCQludWxsLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZzIpOwotCi0JCVRyaWdnZXJTZXF1ZW5jZVtdIGFjdGl2ZUJpbmRpbmdzID0gYmluZGluZ01hbmFnZXIKLQkJCQkuZ2V0QWN0aXZlQmluZGluZ3NGb3IoYmluZGluZzEuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKSk7Ci0JCWFzc2VydFRydWUoIk5laXRoZXIgYmluZGluZyBzaG91bGQgYmUgYWN0aXZlIiwKLQkJCQlhY3RpdmVCaW5kaW5ncy5sZW5ndGggPT0gMCk7Ci0JCWFjdGl2ZUJpbmRpbmdzID0gYmluZGluZ01hbmFnZXIuZ2V0QWN0aXZlQmluZGluZ3NGb3IoYmluZGluZzIKLQkJCQkuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKSk7Ci0JCWFzc2VydFRydWUoIk5laXRoZXIgYmluZGluZyBzaG91bGQgYmUgYWN0aXZlIiwKLQkJCQlhY3RpdmVCaW5kaW5ncy5sZW5ndGggPT0gMCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGVzdHMgd2hldGhlciBhIHBsdWctaW4gZGV2ZWxvcGVyIGNhbiBvdmVycmlkZSBhIGJpbmRpbmcgaW4gYSBjaGlsZAotCSAqIGNvbnRleHQuCi0JICogPC9wPgotCSAqIAotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzY2hlbWUgd2UgdHJ5IHRvIGFjdGl2YXRlIGlzIG5vdCBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDb250ZXh0T3ZlcnJpZGUoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIENvbnRleHQgcGFyZW50Q29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoInBhcmVudCIpOwotCQlwYXJlbnRDb250ZXh0LmRlZmluZSgicGFyZW50IiwgInBhcmVudCBjb250ZXh0IiwgbnVsbCk7Ci0KLQkJZmluYWwgQ29udGV4dCBjaGlsZENvbnRleHQgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0KCJjaGlsZCIpOwotCQljaGlsZENvbnRleHQuZGVmaW5lKCJjaGlsZCIsICJjaGlsZCBjb250ZXh0IiwgInBhcmVudCIpOwotCi0JCWZpbmFsIFNjaGVtZSBzY2hlbWUgPSBiaW5kaW5nTWFuYWdlci5nZXRTY2hlbWUoIm5hIik7Ci0JCXNjaGVtZS5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQotCQliaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoc2NoZW1lKTsKLQotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcxID0gbmV3IFRlc3RCaW5kaW5nKCJwYXJlbnQiLCAibmEiLCAicGFyZW50IiwKLQkJCQludWxsLCBudWxsLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZzEpOwotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcyID0gbmV3IFRlc3RCaW5kaW5nKCJjaGlsZCIsICJuYSIsICJjaGlsZCIsIG51bGwsCi0JCQkJbnVsbCwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmcyKTsKLQotCQkvLyBPbmx5ICJwYXJlbnQiCi0JCWZpbmFsIFNldCBhY3RpdmVDb250ZXh0SWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJYWN0aXZlQ29udGV4dElkcy5hZGQoInBhcmVudCIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkJIldoZW4gb25seSB0aGUgcGFyZW50IGNvbnRleHQgaXMgYWN0aXZlLCBvbmx5IHRoZSBwYXJlbnQgYmluZGluZyBpcyBhY3RpdmUuIiwKLQkJCQliaW5kaW5nMSwgYmluZGluZ01hbmFnZXIKLQkJCQkJCS5nZXRQZXJmZWN0TWF0Y2goVGVzdEJpbmRpbmcuVFJJR0dFUl9TRVFVRU5DRSkpOwotCi0JCS8vIE9ubHkgImNoaWxkIgotCQlhY3RpdmVDb250ZXh0SWRzLmNsZWFyKCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJjaGlsZCIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkJIldoZW4gb25seSB0aGUgY2hpbGQgY29udGV4dCBpcyBhY3RpdmUsIG9ubHkgdGhlIGNoaWxkIGJpbmRpbmcgaXMgYWN0aXZlLiIsCi0JCQkJYmluZGluZzIsIGJpbmRpbmdNYW5hZ2VyCi0JCQkJCQkuZ2V0UGVyZmVjdE1hdGNoKFRlc3RCaW5kaW5nLlRSSUdHRVJfU0VRVUVOQ0UpKTsKLQotCQkvLyBCb3RoICJwYXJlbnQiIGFuZCAiY2hpbGQiCi0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJwYXJlbnQiKTsKLQkJY29udGV4dE1hbmFnZXIuc2V0QWN0aXZlQ29udGV4dElkcyhhY3RpdmVDb250ZXh0SWRzKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJXaGVuIGJvdGggY29udGV4dHMgYXJlIGFjdGl2ZSwgb25seSB0aGUgY2hpbGQgYmluZGluZyBpcyBhY3RpdmUuIiwKLQkJCQliaW5kaW5nMiwgYmluZGluZ01hbmFnZXIKLQkJCQkJCS5nZXRQZXJmZWN0TWF0Y2goVGVzdEJpbmRpbmcuVFJJR0dFUl9TRVFVRU5DRSkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRlc3RzIHdoZXRoZXIgYSB1c2VyLWRlZmluZWQgZGVsZXRpb24gYWN0dWFsbHkgd29ya3MuCi0JICogPC9wPgotCSAqIAotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzY2hlbWUgd2UgdHJ5IHRvIGFjdGl2YXRlIGlzIG5vdCBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVkQmluZGluZygpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dCgibmEiKTsKLQkJY29udGV4dC5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQotCQlmaW5hbCBTY2hlbWUgc2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKCJuYSIpOwotCQlzY2hlbWUuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0KLQkJYmluZGluZ01hbmFnZXIuc2V0QWN0aXZlU2NoZW1lKHNjaGVtZSk7Ci0JCWZpbmFsIFNldCBhY3RpdmVDb250ZXh0SWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJYWN0aXZlQ29udGV4dElkcy5hZGQoIm5hIik7Ci0JCWNvbnRleHRNYW5hZ2VyLnNldEFjdGl2ZUNvbnRleHRJZHMoYWN0aXZlQ29udGV4dElkcyk7Ci0KLQkJZmluYWwgQmluZGluZyBiaW5kaW5nMSA9IG5ldyBUZXN0QmluZGluZyhudWxsLCAibmEiLCAibmEiLCBudWxsLCBudWxsLAotCQkJCUJpbmRpbmcuVVNFUiwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZzEpOwotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcyID0gbmV3IFRlc3RCaW5kaW5nKCJzeXN0ZW0iLCAibmEiLCAibmEiLCBudWxsLAotCQkJCW51bGwsIEJpbmRpbmcuU1lTVEVNLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhiaW5kaW5nMik7Ci0JCWFzc2VydEVxdWFscygiVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIGJpbmRpbmdzIiwgbnVsbCwKLQkJCQliaW5kaW5nTWFuYWdlci5nZXRQZXJmZWN0TWF0Y2goVGVzdEJpbmRpbmcuVFJJR0dFUl9TRVFVRU5DRSkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRlc3RzIHdoZXRoZXIgYSB1c2VyLWRlZmluZWQgZGVsZXRpb24gaW4gb25lIGNvbnRleHQgd2lsbCBhbGxvdyBhIGJpbmRpbmcKLQkgKiBpbiBhIHBhcmVudCBjb250ZXh0IHRvIG1hdGNoLiAgQnVnIDEwNTY1NS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHNjaGVtZSB3ZSB0cnkgdG8gYWN0aXZhdGUgaXMgbm90IGRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZWRCaW5kaW5nQWxsb3dzUGFyZW50KCkgdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24gewotCQlmaW5hbCBDb250ZXh0IHBhcmVudENvbnRleHQgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0KCJwYXJlbnQiKTsKLQkJcGFyZW50Q29udGV4dC5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQkJZmluYWwgQ29udGV4dCBjaGlsZENvbnRleHQgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0KCJjaGlsZCIpOwotCQljaGlsZENvbnRleHQuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgInBhcmVudCIpOwotCi0JCWZpbmFsIFNjaGVtZSBzY2hlbWUgPSBiaW5kaW5nTWFuYWdlci5nZXRTY2hlbWUoIm5hIik7Ci0JCXNjaGVtZS5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQotCQliaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoc2NoZW1lKTsKLQkJZmluYWwgU2V0IGFjdGl2ZUNvbnRleHRJZHMgPSBuZXcgSGFzaFNldCgpOwotCQlhY3RpdmVDb250ZXh0SWRzLmFkZCgicGFyZW50Iik7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJjaGlsZCIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCi0JCWZpbmFsIEJpbmRpbmcgY2hpbGRCaW5kaW5nID0gbmV3IFRlc3RCaW5kaW5nKCJjaGlsZENvbW1hbmQiLCAibmEiLAotCQkJCSJjaGlsZCIsIG51bGwsIG51bGwsIEJpbmRpbmcuU1lTVEVNLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhjaGlsZEJpbmRpbmcpOwotCQlmaW5hbCBCaW5kaW5nIGRlbGV0aW9uID0gbmV3IFRlc3RCaW5kaW5nKG51bGwsICJuYSIsICJjaGlsZCIsIG51bGwsCi0JCQkJbnVsbCwgQmluZGluZy5VU0VSLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhkZWxldGlvbik7Ci0JCWZpbmFsIEJpbmRpbmcgcGFyZW50QmluZGluZyA9IG5ldyBUZXN0QmluZGluZygicGFyZW50Q29tbWFuZCIsICJuYSIsCi0JCQkJInBhcmVudCIsIG51bGwsIG51bGwsIEJpbmRpbmcuU1lTVEVNLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhwYXJlbnRCaW5kaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byByZW1vdmUgYmluZGluZ3MgdG8gYWxsb3cgYSBwYXJlbnQgYmluZGluZyIsCi0JCQkJInBhcmVudENvbW1hbmQiLCBiaW5kaW5nTWFuYWdlci5nZXRQZXJmZWN0TWF0Y2goCi0JCQkJCQlUZXN0QmluZGluZy5UUklHR0VSX1NFUVVFTkNFKS5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpCi0JCQkJCQkuZ2V0SWQoKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGVzdHMgYSBjb21tb24gY2FzZSBmb3IgYmluZGluZyBkZWxldGlvbi4gVGhlIGJpbmRpbmcgaXMgZGVmaW5lZCBvbiBhbGwKLQkgKiBwbGF0Zm9ybXMsIHRoZW4gZGVsZXRlZCBvbiBhIHNwZWNpZmljIHBsYXRmb3JtLCBhbmQgZGVmaW5lZCBhZ2FpbiBhcwotCSAqIHNvbWV0aGluZyBlbHNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc2NoZW1lIHdlIHRyeSB0byBhY3RpdmF0ZSBpcyBub3QgZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlZEJpbmRpbmdQbGF0Zm9ybSgpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIG5hID0gIm5hIjsKLQotCQlmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0KG5hKTsKLQkJY29udGV4dC5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQotCQlmaW5hbCBTY2hlbWUgc2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKG5hKTsKLQkJc2NoZW1lLmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCi0JCWJpbmRpbmdNYW5hZ2VyLnNldEFjdGl2ZVNjaGVtZShzY2hlbWUpOwotCQlmaW5hbCBTZXQgYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJuYSIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCi0JCWZpbmFsIEJpbmRpbmcgYWxsUGxhdGZvcm1zID0gbmV3IFRlc3RCaW5kaW5nKCJhbGxQbGF0Zm9ybXMiLCBuYSwgbmEsCi0JCQkJbnVsbCwgbnVsbCwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGFsbFBsYXRmb3Jtcyk7Ci0JCWZpbmFsIEJpbmRpbmcgZGVsZXRpb24gPSBuZXcgVGVzdEJpbmRpbmcobnVsbCwgbmEsIG5hLCBudWxsLCBTV1QKLQkJCQkuZ2V0UGxhdGZvcm0oKSwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGRlbGV0aW9uKTsKLQkJZmluYWwgQmluZGluZyBwbGF0Zm9ybVNwZWNpZmljID0gbmV3IFRlc3RCaW5kaW5nKCJwbGF0Zm9ybVNwZWNpZmljIiwKLQkJCQluYSwgbmEsIG51bGwsIFNXVC5nZXRQbGF0Zm9ybSgpLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcocGxhdGZvcm1TcGVjaWZpYyk7Ci0JCWFzc2VydEVxdWFscygKLQkJCQkiV2Ugc2hvdWxkIGJlIGFibGUgdG8gY2hhbmdlIGEgYmluZGluZyBvbiBhIHBhcnRpY3VsYXIgcGxhdGZvcm0iLAotCQkJCXBsYXRmb3JtU3BlY2lmaWMsIGJpbmRpbmdNYW5hZ2VyCi0JCQkJCQkuZ2V0UGVyZmVjdE1hdGNoKFRlc3RCaW5kaW5nLlRSSUdHRVJfU0VRVUVOQ0UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUZXN0cyB3aGV0aGVyIGEgc3lzdGVtIGRlbGV0aW9uIGZvciBhIGRpZmZlcmVudCBsb2NhbGUgb3IgcGxhdGZvcm0KLQkgKiBhY3R1YWxseSB3b3Jrcy4gSXQgc2hvdWxkbid0LiBEZWxldGlvbnMgc2hvdWxkIG9ubHkgd29yayBpZiB0aGV5IHNwZWNpZnkKLQkgKiBhIG1hdGNoaW5nIGxvY2FsZSBvciBwbGF0Zm9ybS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHNjaGVtZSB3ZSB0cnkgdG8gYWN0aXZhdGUgaXMgbm90IGRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZWRCaW5kaW5nVW5uZWNlc3NhcmlseSgpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dCgibmEiKTsKLQkJY29udGV4dC5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQotCQlmaW5hbCBTY2hlbWUgc2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKCJuYSIpOwotCQlzY2hlbWUuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0KLQkJYmluZGluZ01hbmFnZXIuc2V0QWN0aXZlU2NoZW1lKHNjaGVtZSk7Ci0JCWZpbmFsIFNldCBhY3RpdmVDb250ZXh0SWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJYWN0aXZlQ29udGV4dElkcy5hZGQoIm5hIik7Ci0JCWNvbnRleHRNYW5hZ2VyLnNldEFjdGl2ZUNvbnRleHRJZHMoYWN0aXZlQ29udGV4dElkcyk7Ci0KLQkJZmluYWwgQmluZGluZyBiaW5kaW5nMSA9IG5ldyBUZXN0QmluZGluZyhudWxsLCAibmEiLCAibmEiLAotCQkJCSJub3QgdGhlIGN1cnJlbnQgbG9jYWxlIiwgbnVsbCwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcyID0gbmV3IFRlc3RCaW5kaW5nKCJzeXN0ZW0iLCAibmEiLCAibmEiLCBudWxsLAotCQkJCW51bGwsIEJpbmRpbmcuU1lTVEVNLCBudWxsKTsKLQkJZmluYWwgQmluZGluZyBiaW5kaW5nMyA9IG5ldyBUZXN0QmluZGluZyhudWxsLCAibmEiLCAibmEiLCBudWxsLAotCQkJCSJub3QgdGhlIGN1cnJlbnQgcGxhdGZvcm0iLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWZpbmFsIEJpbmRpbmdbXSBiaW5kaW5ncyA9IG5ldyBCaW5kaW5nWzNdOwotCQliaW5kaW5nc1swXSA9IGJpbmRpbmcxOwotCQliaW5kaW5nc1sxXSA9IGJpbmRpbmcyOwotCQliaW5kaW5nc1syXSA9IGJpbmRpbmczOwotCQliaW5kaW5nTWFuYWdlci5zZXRCaW5kaW5ncyhiaW5kaW5ncyk7Ci0JCWFzc2VydEVxdWFscygKLQkJCQkiQSBiaW5kaW5nIHNob3VsZCBub3QgY2F1c2UgYSBkZWxldGlvbiBpZiBpdHMgbG9jYWxlIG9yIHBsYXRmb3JtIGRvZXNuJ3QgbWF0Y2giLAotCQkJCWJpbmRpbmcyLCBiaW5kaW5nTWFuYWdlcgotCQkJCQkJLmdldFBlcmZlY3RNYXRjaChUZXN0QmluZGluZy5UUklHR0VSX1NFUVVFTkNFKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGVzdHMgd2hldGhlciBhIHVzZXIgY2FuIGFkZCBhIGJpbmRpbmcgdG8gdGhlIHNhbWUgY29uZGl0aW9ucyBvbmNlCi0JICogdGhleSd2ZSBkZWxldGVkIHRoZSBzeXN0ZW0gYmluZGluZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHNjaGVtZSB3ZSB0cnkgdG8gYWN0aXZhdGUgaXMgbm90IGRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZWRCaW5kaW5nV2l0aEFkZGl0aW9uKCkgdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24gewotCQlmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0KCJuYSIpOwotCQljb250ZXh0LmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCi0JCWZpbmFsIFNjaGVtZSBzY2hlbWUgPSBiaW5kaW5nTWFuYWdlci5nZXRTY2hlbWUoIm5hIik7Ci0JCXNjaGVtZS5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQotCQliaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoc2NoZW1lKTsKLQkJZmluYWwgU2V0IGFjdGl2ZUNvbnRleHRJZHMgPSBuZXcgSGFzaFNldCgpOwotCQlhY3RpdmVDb250ZXh0SWRzLmFkZCgibmEiKTsKLQkJY29udGV4dE1hbmFnZXIuc2V0QWN0aXZlQ29udGV4dElkcyhhY3RpdmVDb250ZXh0SWRzKTsKLQotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcxID0gbmV3IFRlc3RCaW5kaW5nKG51bGwsICJuYSIsICJuYSIsIG51bGwsIG51bGwsCi0JCQkJQmluZGluZy5VU0VSLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhiaW5kaW5nMSk7Ci0JCWZpbmFsIEJpbmRpbmcgYmluZGluZzIgPSBuZXcgVGVzdEJpbmRpbmcoInN5c3RlbSIsICJuYSIsICJuYSIsIG51bGwsCi0JCQkJbnVsbCwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmcyKTsKLQkJZmluYWwgQmluZGluZyBiaW5kaW5nMyA9IG5ldyBUZXN0QmluZGluZygidXNlciIsICJuYSIsICJuYSIsIG51bGwsCi0JCQkJbnVsbCwgQmluZGluZy5VU0VSLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhiaW5kaW5nMyk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHVzZXIgcmVkZWZpbmUgYSBwYXJ0aWN1bGFyIGJpbmRpbmciLCBiaW5kaW5nMywKLQkJCQliaW5kaW5nTWFuYWdlci5nZXRQZXJmZWN0TWF0Y2goVGVzdEJpbmRpbmcuVFJJR0dFUl9TRVFVRU5DRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgdGVzdHMgdGhlIGNhc2Ugd2hlcmUgYSBwbHVnLWluIGRldmVsb3BlciB1bmJpbmRzIGEga2V5LCBhbmQgdGhlbiBhCi0JICogdXNlciB0cmllcyB0byBiaW5kIHRvIHRoYXQga2V5LiBUaGUgdXNlciBzaG91bGQgYmUgYWxsb3dlZCB0byBiaW5kLgotCSAqIAotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzY2hlbWUgd2UgdHJ5IHRvIGFjdGl2YXRlIGlzIG5vdCBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVkQmluZGluZ1dpdGhVc2VyT3ZlcnJpZGUoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIENvbnRleHQgY29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoIm5hIik7Ci0JCWNvbnRleHQuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0KLQkJZmluYWwgU2NoZW1lIHNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZSgibmEiKTsKLQkJc2NoZW1lLmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCi0JCWJpbmRpbmdNYW5hZ2VyLnNldEFjdGl2ZVNjaGVtZShzY2hlbWUpOwotCQlmaW5hbCBTZXQgYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJuYSIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCi0JCWZpbmFsIEJpbmRpbmcgZ2VuZXJhbEJpbmRpbmcgPSBuZXcgVGVzdEJpbmRpbmcoImdlbmVyYWwiLCBzY2hlbWUKLQkJCQkuZ2V0SWQoKSwgY29udGV4dC5nZXRJZCgpLCBudWxsLCBudWxsLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoZ2VuZXJhbEJpbmRpbmcpOwotCQlmaW5hbCBCaW5kaW5nIGNhbmNlbE9uUGxhdGZvcm0gPSBuZXcgVGVzdEJpbmRpbmcobnVsbCwgc2NoZW1lLmdldElkKCksCi0JCQkJY29udGV4dC5nZXRJZCgpLCBudWxsLCBiaW5kaW5nTWFuYWdlci5nZXRQbGF0Zm9ybSgpLAotCQkJCUJpbmRpbmcuU1lTVEVNLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhjYW5jZWxPblBsYXRmb3JtKTsKLQkJZmluYWwgQmluZGluZyB1c2VyT3ZlcnJpZGUgPSBuZXcgVGVzdEJpbmRpbmcoInVzZXIiLCBzY2hlbWUuZ2V0SWQoKSwKLQkJCQljb250ZXh0LmdldElkKCksIG51bGwsIGJpbmRpbmdNYW5hZ2VyLmdldFBsYXRmb3JtKCksCi0JCQkJQmluZGluZy5VU0VSLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyh1c2VyT3ZlcnJpZGUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB1c2VyIHJlZGVmaW5lIGEgYmluZGluZyBkZWxldGVkIGluIHRoZSBzeXN0ZW0iLAotCQkJCXVzZXJPdmVycmlkZSwgYmluZGluZ01hbmFnZXIKLQkJCQkJCS5nZXRQZXJmZWN0TWF0Y2goVGVzdEJpbmRpbmcuVFJJR0dFUl9TRVFVRU5DRSkpOwotCi0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoYXQgaWYgbW9yZSB0aGFuIG9uZSBkZWxldGlvbiBpcyBkZWZpbmVkIGZvciB0aGUgc2FtZSBiaW5kaW5nLAotCSAqIHRoYXQgdGhlIGRlbGV0aW9uIHdpbGwgc3RpbGwgd29yay4gIEJ1ZyAxMDY1NzQgcG9pbnRzIG91dCBhIGNhc2Ugd2hlcmUgaXQKLQkgKiBpcyBwb3NzaWJsZSBmb3IgYSBkZWxldGlvbiB0byBjbG9iYmVyIGFub3RoZXIgZGVsZXRpb24uCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVEZWxldGVkQmluZGluZygpIHsKLQkJZmluYWwgU3RyaW5nIHBhcmVudCA9ICJwYXJlbnQiOwotCQlmaW5hbCBTdHJpbmcgY2hpbGQgPSAiY2hpbGQiOwotCi0JCS8vIFNldC11cCB0aGUgY29udGV4dHMKLQkJZmluYWwgQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChwYXJlbnQpOwotCQlwYXJlbnRDb250ZXh0LmRlZmluZShwYXJlbnQsIHBhcmVudCwgbnVsbCk7Ci0JCWZpbmFsIENvbnRleHQgY2hpbGRDb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChjaGlsZCk7Ci0JCWNoaWxkQ29udGV4dC5kZWZpbmUoY2hpbGQsIGNoaWxkLCBwYXJlbnQpOwotCQlmaW5hbCBTZXQgYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKHBhcmVudCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKGNoaWxkKTsKLQkJY29udGV4dE1hbmFnZXIuc2V0QWN0aXZlQ29udGV4dElkcyhhY3RpdmVDb250ZXh0SWRzKTsKLQotCQkvLyBTZXQtdXAgdGhlIHNjaGVtZXMuCi0JCWZpbmFsIFNjaGVtZSBzY2hlbWUgPSBiaW5kaW5nTWFuYWdlci5nZXRTY2hlbWUoIm5hIik7Ci0JCXNjaGVtZS5kZWZpbmUocGFyZW50LCBwYXJlbnQsIG51bGwpOwotCi0JCS8qCi0JCSAqIFNldC11cCBhIGJpbmRpbmcsIHdpdGggdHdvIGRlbGV0aW9ucy4gVGhlIGZpcnN0IGRlbGV0aW9uIG1hdGNoZXMgdGhlCi0JCSAqIGNvbnRleHQsIGJ1dCB0aGUgc2Vjb25kIGRvZXMgbm90LgotCQkgKi8KLQkJZmluYWwgQmluZGluZyBiaW5kaW5nID0gbmV3IFRlc3RCaW5kaW5nKCJjb21tYW5kIiwgIm5hIiwgcGFyZW50LCBudWxsLAotCQkJCW51bGwsIEJpbmRpbmcuU1lTVEVNLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhiaW5kaW5nKTsKLQkJZmluYWwgQmluZGluZyBjb3JyZWN0RGVsZXRpb24gPSBuZXcgVGVzdEJpbmRpbmcobnVsbCwgIm5hIiwgcGFyZW50LAotCQkJCW51bGwsIG51bGwsIEJpbmRpbmcuVVNFUiwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoY29ycmVjdERlbGV0aW9uKTsKLQkJZmluYWwgQmluZGluZyB3cm9uZ0RlbGV0aW9uID0gbmV3IFRlc3RCaW5kaW5nKG51bGwsICJuYSIsIGNoaWxkLCBudWxsLAotCQkJCW51bGwsIEJpbmRpbmcuVVNFUiwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcod3JvbmdEZWxldGlvbik7Ci0KLQkJLy8gVGVzdCB0aGF0IHRoZSBkZWxldGlvbiB3b3JrZWQuCi0JCWFzc2VydEVxdWFscygiVGhlIHBhcmVudCBzaG91bGQgbm90IGJlIGFjdGl2ZSIsIG51bGwsIGJpbmRpbmdNYW5hZ2VyCi0JCQkJLmdldFBlcmZlY3RNYXRjaChiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB0ZXN0cyBhIGNvbXBsaWNhdGVkIHNjZW5hcmlvIHRoYXQgYXJpc2VzIHdpdGggdGhlIEVtYWNzIGtleSBiaW5kaW5nCi0JICogc2V0IGluIHRoZSBFY2xpcHNlIHdvcmtiZW5jaC4gVGhlIGZpcnN0IGJpbmRpbmcgYmVsb25ncyB0byBhIHBhcmVudAotCSAqIGNvbnRleHQsIGJ1dCBhIGNoaWxkIHNjaGVtZS4gVGhlIHRyaWdnZXIgc2VxdWVuY2VzIGFyZSBub3QgdGhlIHNhbWUuCi0JICogCi0JICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHNjaGVtZSB3ZSB0cnkgdG8gYWN0aXZhdGUgaXMgbm90IGRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERvdWJsZVBhcmVudCgpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIHBhcmVudCA9ICJwYXJlbnQiOwotCQlmaW5hbCBTdHJpbmcgY2hpbGQgPSAiY2hpbGQiOwotCi0JCS8vIFNldC11cCB0aGUgY29udGV4dHMKLQkJZmluYWwgQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChwYXJlbnQpOwotCQlwYXJlbnRDb250ZXh0LmRlZmluZShwYXJlbnQsIHBhcmVudCwgbnVsbCk7Ci0JCWZpbmFsIENvbnRleHQgY2hpbGRDb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChjaGlsZCk7Ci0JCWNoaWxkQ29udGV4dC5kZWZpbmUoY2hpbGQsIGNoaWxkLCBwYXJlbnQpOwotCQlmaW5hbCBTZXQgYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKHBhcmVudCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKGNoaWxkKTsKLQkJY29udGV4dE1hbmFnZXIuc2V0QWN0aXZlQ29udGV4dElkcyhhY3RpdmVDb250ZXh0SWRzKTsKLQotCQkvLyBTZXQtdXAgdGhlIHNjaGVtZXMuCi0JCWZpbmFsIFNjaGVtZSBwYXJlbnRTY2hlbWUgPSBiaW5kaW5nTWFuYWdlci5nZXRTY2hlbWUocGFyZW50KTsKLQkJcGFyZW50U2NoZW1lLmRlZmluZShwYXJlbnQsIHBhcmVudCwgbnVsbCk7Ci0JCWZpbmFsIFNjaGVtZSBjaGlsZFNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZShjaGlsZCk7Ci0JCWNoaWxkU2NoZW1lLmRlZmluZShjaGlsZCwgY2hpbGQsIHBhcmVudCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLnNldEFjdGl2ZVNjaGVtZShjaGlsZFNjaGVtZSk7Ci0KLQkJLy8gQWRkIHR3byBiaW5kaW5ncy4KLQkJZmluYWwgQmluZGluZyBwYXJlbnRCaW5kaW5nID0gbmV3IFRlc3RCaW5kaW5nKHBhcmVudCwgcGFyZW50LCBwYXJlbnQsCi0JCQkJbnVsbCwgbnVsbCwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQlmaW5hbCBCaW5kaW5nIGNoaWxkQmluZGluZyA9IG5ldyBUZXN0QmluZGluZyhjaGlsZCwgY2hpbGQsIGNoaWxkLCBudWxsLAotCQkJCW51bGwsIEJpbmRpbmcuU1lTVEVNLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhwYXJlbnRCaW5kaW5nKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhjaGlsZEJpbmRpbmcpOwotCi0JCS8vIFRlc3QgdG8gc2VlIHRoYXQgb25seSB0aGUgY2hpbGQgaXMgYWN0aXZlLgotCQlhc3NlcnRUcnVlKCJUaGUgcGFyZW50IHNob3VsZCBub3QgYmUgYWN0aXZlIiwKLQkJCQliaW5kaW5nTWFuYWdlci5nZXRBY3RpdmVCaW5kaW5nc0ZvcihwYXJlbnRCaW5kaW5nCi0JCQkJCQkuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKSkubGVuZ3RoID09IDApOwotCQlhc3NlcnRUcnVlKCJUaGUgY2hpbGQgc2hvdWxkIGJlIGFjdGl2ZSIsCi0JCQkJYmluZGluZ01hbmFnZXIuZ2V0QWN0aXZlQmluZGluZ3NGb3IoY2hpbGRCaW5kaW5nCi0JCQkJCQkuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKSkubGVuZ3RoICE9IDApOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRlc3RzIHdoZXRoZXIgYSBwbHVnLWluIGRldmVsb3BlciBjYW4gb3ZlcnJpZGUgYSBiaW5kaW5nIGZvciBhIHBhcnRpY3VsYXIKLQkgKiBsb2NhbGUuCi0JICogPC9wPgotCSAqIAotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzY2hlbWUgd2UgdHJ5IHRvIGFjdGl2YXRlIGlzIG5vdCBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbGVPdmVycmlkZSgpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dCgibmEiKTsKLQkJY29udGV4dC5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQotCQlmaW5hbCBTY2hlbWUgc2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKCJuYSIpOwotCQlzY2hlbWUuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0KLQkJYmluZGluZ01hbmFnZXIuc2V0QWN0aXZlU2NoZW1lKHNjaGVtZSk7Ci0JCWZpbmFsIFNldCBhY3RpdmVDb250ZXh0SWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJYWN0aXZlQ29udGV4dElkcy5hZGQoIm5hIik7Ci0JCWNvbnRleHRNYW5hZ2VyLnNldEFjdGl2ZUNvbnRleHRJZHMoYWN0aXZlQ29udGV4dElkcyk7Ci0KLQkJZmluYWwgQmluZGluZyBiaW5kaW5nMSA9IG5ldyBUZXN0QmluZGluZygiYmFzZSIsICJuYSIsICJuYSIsIG51bGwsCi0JCQkJbnVsbCwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmcxKTsKLQkJZmluYWwgQmluZGluZyBiaW5kaW5nMiA9IG5ldyBUZXN0QmluZGluZyhudWxsLCAibmEiLCAibmEiLCBMb2NhbGUKLQkJCQkuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCksIG51bGwsIEJpbmRpbmcuU1lTVEVNLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhiaW5kaW5nMik7Ci0JCWZpbmFsIEJpbmRpbmcgYmluZGluZzMgPSBuZXcgVGVzdEJpbmRpbmcoImxvY2FsZS1zcGVjaWZpYyIsICJuYSIsICJuYSIsCi0JCQkJTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLCBudWxsLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZzMpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkJIkEgcGx1Zy1pbiBkZXZlbG9wZXIgc2hvdWxkIGJlIGFibGUgdG8gY2hhbmdlIGEgYmluZGluZyBmb3IgYSBsb2NhbGUiLAotCQkJCWJpbmRpbmczLCBiaW5kaW5nTWFuYWdlcgotCQkJCQkJLmdldFBlcmZlY3RNYXRjaChUZXN0QmluZGluZy5UUklHR0VSX1NFUVVFTkNFKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGVzdHMgd2hldGhlciBhIHBsdWctaW4gZGV2ZWxvcGVyIGNhbiBvdmVycmlkZSBhIGJpbmRpbmcgZm9yIGEgcGFydGljdWxhcgotCSAqIHBsYXRmb3JtLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc2NoZW1lIHdlIHRyeSB0byBhY3RpdmF0ZSBpcyBub3QgZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UGxhdGZvcm1PdmVycmlkZSgpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dCgibmEiKTsKLQkJY29udGV4dC5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQotCQlmaW5hbCBTY2hlbWUgc2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKCJuYSIpOwotCQlzY2hlbWUuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0KLQkJYmluZGluZ01hbmFnZXIuc2V0QWN0aXZlU2NoZW1lKHNjaGVtZSk7Ci0JCWZpbmFsIFNldCBhY3RpdmVDb250ZXh0SWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJYWN0aXZlQ29udGV4dElkcy5hZGQoIm5hIik7Ci0JCWNvbnRleHRNYW5hZ2VyLnNldEFjdGl2ZUNvbnRleHRJZHMoYWN0aXZlQ29udGV4dElkcyk7Ci0KLQkJZmluYWwgQmluZGluZyBiaW5kaW5nMSA9IG5ldyBUZXN0QmluZGluZygiYmFzZSIsICJuYSIsICJuYSIsIG51bGwsCi0JCQkJbnVsbCwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmcxKTsKLQkJZmluYWwgQmluZGluZyBiaW5kaW5nMiA9IG5ldyBUZXN0QmluZGluZyhudWxsLCAibmEiLCAibmEiLCBudWxsLCBTV1QKLQkJCQkuZ2V0UGxhdGZvcm0oKSwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmcyKTsKLQkJZmluYWwgQmluZGluZyBiaW5kaW5nMyA9IG5ldyBUZXN0QmluZGluZygicGxhdGZvcm0tc3BlY2lmaWMiLCAibmEiLAotCQkJCSJuYSIsIG51bGwsIFNXVC5nZXRQbGF0Zm9ybSgpLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZzMpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkJIkEgcGx1Zy1pbiBkZXZlbG9wZXIgc2hvdWxkIGJlIGFibGUgdG8gY2hhbmdlIGEgYmluZGluZyBmb3IgYSBwbGF0Zm9ybSIsCi0JCQkJYmluZGluZzMsIGJpbmRpbmdNYW5hZ2VyCi0JCQkJCQkuZ2V0UGVyZmVjdE1hdGNoKFRlc3RCaW5kaW5nLlRSSUdHRVJfU0VRVUVOQ0UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUZXN0cyB3aGV0aGVyIGEgYmluZGluZyBpbiBhIGNoaWxkIHNjaGVtZSB3aWxsIG92ZXJyaWRlIGEgYmluZGluZyBpbiBhCi0JICogcGFyZW50IHNjaGVtZS4gVGhlIHRlc3QgaXMgc2V0LXVwIGFzIGZvbGxvd3M6Ci0JICogPC9wPgotCSAqIDx1bD4KLQkgKiA8bGk+QmluZGluZzEoY29tbWFuZElkPSJjaGlsZCIsc2NoZW1lSWQ9ImNoaWxkIixjb250ZXh0SWQ9Im5hIixsb2NhbGU9bnVsbCxwbGF0Zm9ybT1udWxsLHR5cGU9U1lTVEVNKTwvbGk+Ci0JICogPGxpPkJpbmRpbmcyKGNvbW1hbmRJZD0icGFyZW50IixzY2hlbWVJZD0icGFyZW50Iixjb250ZXh0SWQ9Im5hIixsb2NhbGU9bnVsbCxwbGF0Zm9ybT1udWxsLHR5cGU9U1lTVEVNKTwvbGk+Ci0JICogPC91bD4KLQkgKiA8cD4KLQkgKiBCaW5kaW5nMSBzaG91bGQgd2luLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc2NoZW1lIHdlIHRyeSB0byBhY3RpdmF0ZSBpcyBub3QgZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1lT3ZlcnJpZGUoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIENvbnRleHQgY29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoIm5hIik7Ci0JCWNvbnRleHQuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0KLQkJZmluYWwgU2NoZW1lIHBhcmVudFNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZSgicGFyZW50Iik7Ci0JCXBhcmVudFNjaGVtZS5kZWZpbmUoInBhcmVudCIsICJwYXJlbnQgc2NoZW1lIiwgbnVsbCk7Ci0KLQkJZmluYWwgU2NoZW1lIGNoaWxkU2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKCJjaGlsZCIpOwotCQljaGlsZFNjaGVtZS5kZWZpbmUoImNoaWxkIiwgImNoaWxkIHNjaGVtZSIsICJwYXJlbnQiKTsKLQotCQliaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoY2hpbGRTY2hlbWUpOwotCQlmaW5hbCBTZXQgYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJuYSIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCi0JCWZpbmFsIEJpbmRpbmcgYmluZGluZzEgPSBuZXcgVGVzdEJpbmRpbmcoImNoaWxkIiwgImNoaWxkIiwgIm5hIiwgbnVsbCwKLQkJCQludWxsLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZzEpOwotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcyID0gbmV3IFRlc3RCaW5kaW5nKCJwYXJlbnQiLCAicGFyZW50IiwgIm5hIiwKLQkJCQludWxsLCBudWxsLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZzIpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBiaW5kaW5nIGZyb20gdGhlIGNoaWxkIHNjaGVtZSBzaG91bGQgYmUgYWN0aXZlIiwKLQkJCQliaW5kaW5nMSwgYmluZGluZ01hbmFnZXIKLQkJCQkJCS5nZXRQZXJmZWN0TWF0Y2goVGVzdEJpbmRpbmcuVFJJR0dFUl9TRVFVRU5DRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgdGVzdHMgYSBFbWFjcy1zdHlsZSBzY2VuYXJpby4gSW4gdGhpcyBzY2VuYXJpbyBhIGNoaWxkIHNjaGVtZQotCSAqIGRlZmluZXMgYSBiaW5kaW5nIGluIGEgcGFyZW50IGNvbnRleHQuIFRoZSBwYXJlbnQgc2NoZW1lIGJpbmRpbmdzIHRoZQotCSAqIHNhbWUgdHJpZ2dlciBzZXF1ZW5jZSBpbiBhIGNoaWxkIGNvbnRleHQuIFRoZSBjaGlsZCBzY2hlbWUgZGVmaW5pdGlvbgotCSAqIHNob3VsZCB3aW4uCi0JICogCi0JICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHNjaGVtZSB3ZSB0cnkgdG8gYWN0aXZhdGUgaXMgbm90IGRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtZU92ZXJyaWRlRGlmZmVyZW50Q29udGV4dHMoKQotCQkJdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24gewotCQlmaW5hbCBTdHJpbmcgcGFyZW50ID0gInBhcmVudCI7Ci0JCWZpbmFsIFN0cmluZyBjaGlsZCA9ICJjaGlsZCI7Ci0KLQkJZmluYWwgQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChwYXJlbnQpOwotCQlwYXJlbnRDb250ZXh0LmRlZmluZSgicGFyZW50IiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0JCWZpbmFsIENvbnRleHQgY2hpbGRDb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChjaGlsZCk7Ci0JCWNoaWxkQ29udGV4dC5kZWZpbmUoImNoaWxkIiwgImRlc2NyaXB0aW9uIiwgcGFyZW50KTsKLQotCQlmaW5hbCBTY2hlbWUgcGFyZW50U2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKHBhcmVudCk7Ci0JCXBhcmVudFNjaGVtZS5kZWZpbmUoInBhcmVudCIsICJwYXJlbnQgc2NoZW1lIiwgbnVsbCk7Ci0JCWZpbmFsIFNjaGVtZSBjaGlsZFNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZShjaGlsZCk7Ci0JCWNoaWxkU2NoZW1lLmRlZmluZSgiY2hpbGQiLCAiY2hpbGQgc2NoZW1lIiwgcGFyZW50KTsKLQotCQliaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoY2hpbGRTY2hlbWUpOwotCQlmaW5hbCBTZXQgYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKHBhcmVudENvbnRleHQuZ2V0SWQoKSk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKGNoaWxkQ29udGV4dC5nZXRJZCgpKTsKLQkJY29udGV4dE1hbmFnZXIuc2V0QWN0aXZlQ29udGV4dElkcyhhY3RpdmVDb250ZXh0SWRzKTsKLQotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcxID0gbmV3IFRlc3RCaW5kaW5nKCJwYXJlbnQiLAotCQkJCXBhcmVudFNjaGVtZS5nZXRJZCgpLCBjaGlsZENvbnRleHQuZ2V0SWQoKSwgbnVsbCwgbnVsbCwKLQkJCQlCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZzEpOwotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcyID0gbmV3IFRlc3RCaW5kaW5nKCJjaGlsZCIsIGNoaWxkU2NoZW1lLmdldElkKCksCi0JCQkJcGFyZW50Q29udGV4dC5nZXRJZCgpLCBudWxsLCBudWxsLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZzIpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBiaW5kaW5nIGZyb20gdGhlIGNoaWxkIHNjaGVtZSBzaG91bGQgYmUgYWN0aXZlIiwKLQkJCQliaW5kaW5nMiwgYmluZGluZ01hbmFnZXIKLQkJCQkJCS5nZXRQZXJmZWN0TWF0Y2goVGVzdEJpbmRpbmcuVFJJR0dFUl9TRVFVRU5DRSkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRlc3RzIHdoZXRoZXIgYSBiaW5kaW5nIGluIGEgY2hpbGQgc2NoZW1lIHdpbGwgb3ZlcnJpZGUgYSBiaW5kaW5nIGluIGEKLQkgKiBwYXJlbnQgc2NoZW1lIC0tIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgdHlwZS4gVGhlIHRlc3QgaXMgc2V0LXVwIGFzIGZvbGxvd3M6Ci0JICogPC9wPgotCSAqIDx1bD4KLQkgKiA8bGk+QmluZGluZzEoY29tbWFuZElkPSJjaGlsZCIsc2NoZW1lSWQ9ImNoaWxkIixjb250ZXh0SWQ9Im5hIixsb2NhbGU9bnVsbCxwbGF0Zm9ybT1udWxsLHR5cGU9U1lTVEVNKTwvbGk+Ci0JICogPGxpPkJpbmRpbmcyKGNvbW1hbmRJZD0icGFyZW50IixzY2hlbWVJZD0icGFyZW50Iixjb250ZXh0SWQ9Im5hIixsb2NhbGU9bnVsbCxwbGF0Zm9ybT1udWxsLHR5cGU9VVNFUik8L2xpPgotCSAqIDwvdWw+Ci0JICogPHA+Ci0JICogQmluZGluZzEgc2hvdWxkIHdpbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHNjaGVtZSB3ZSB0cnkgdG8gYWN0aXZhdGUgaXMgbm90IGRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtZU92ZXJyaWRlRGlmZmVyZW50VHlwZXMoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIENvbnRleHQgY29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoIm5hIik7Ci0JCWNvbnRleHQuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0KLQkJZmluYWwgU2NoZW1lIHBhcmVudFNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZSgicGFyZW50Iik7Ci0JCXBhcmVudFNjaGVtZS5kZWZpbmUoInBhcmVudCIsICJwYXJlbnQgc2NoZW1lIiwgbnVsbCk7Ci0KLQkJZmluYWwgU2NoZW1lIGNoaWxkU2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKCJjaGlsZCIpOwotCQljaGlsZFNjaGVtZS5kZWZpbmUoImNoaWxkIiwgImNoaWxkIHNjaGVtZSIsICJwYXJlbnQiKTsKLQotCQliaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoY2hpbGRTY2hlbWUpOwotCQlmaW5hbCBTZXQgYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJuYSIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCi0JCWZpbmFsIEJpbmRpbmcgYmluZGluZzEgPSBuZXcgVGVzdEJpbmRpbmcoImNoaWxkIiwgImNoaWxkIiwgIm5hIiwgbnVsbCwKLQkJCQludWxsLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZzEpOwotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcyID0gbmV3IFRlc3RCaW5kaW5nKCJwYXJlbnQiLCAicGFyZW50IiwgIm5hIiwKLQkJCQludWxsLCBudWxsLCBCaW5kaW5nLlVTRVIsIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmcyKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgYmluZGluZyBmcm9tIHRoZSBjaGlsZCBzY2hlbWUgc2hvdWxkIGJlIGFjdGl2ZSIsCi0JCQkJYmluZGluZzEsIGJpbmRpbmdNYW5hZ2VyCi0JCQkJCQkuZ2V0UGVyZmVjdE1hdGNoKFRlc3RCaW5kaW5nLlRSSUdHRVJfU0VRVUVOQ0UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUZXN0cyB3aGV0aGVyIHR3byBiaW5kaW5ncyBkZWZpbmVkIGZvciBzaWJsaW5nIGFjdGl2ZSBjb250ZXh0cyBsZWFkcyB0byBhCi0JICogY29uZmxpY3QuCi0JICogPC9wPgotCSAqIAotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzY2hlbWUgd2UgdHJ5IHRvIGFjdGl2YXRlIGlzIG5vdCBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTaWJsaW5nQ29udGV4dENvbmZsaWN0KCkgdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24gewotCQlmaW5hbCBDb250ZXh0IGNvbnRleHQxID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dCgic2libGluZzEiKTsKLQkJY29udGV4dDEuZGVmaW5lKCJzaWJsaW5nMSIsICJmaXJzdCBzaWJsaW5nIGNvbnRleHQiLCBudWxsKTsKLQotCQlmaW5hbCBDb250ZXh0IGNvbnRleHQyID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dCgic2libGluZzIiKTsKLQkJY29udGV4dDIuZGVmaW5lKCJzaWJsaW5nMiIsICJzZWNvbmQgc2libGluZyBjb250ZXh0IiwgbnVsbCk7Ci0KLQkJZmluYWwgU2NoZW1lIHNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZSgibmEiKTsKLQkJc2NoZW1lLmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCi0JCWJpbmRpbmdNYW5hZ2VyLnNldEFjdGl2ZVNjaGVtZShzY2hlbWUpOwotCi0JCWZpbmFsIEJpbmRpbmcgYmluZGluZzEgPSBuZXcgVGVzdEJpbmRpbmcoInNpYmxpbmcxIiwgIm5hIiwgInNpYmxpbmcxIiwKLQkJCQludWxsLCBudWxsLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZzEpOwotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcyID0gbmV3IFRlc3RCaW5kaW5nKCJzaWJsaW5nMiIsICJuYSIsICJzaWJsaW5nMiIsCi0JCQkJbnVsbCwgbnVsbCwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmcyKTsKLQotCQkvLyBPbmUgc2libGluZyBhY3RpdmUKLQkJZmluYWwgU2V0IGFjdGl2ZUNvbnRleHRJZHMgPSBuZXcgSGFzaFNldCgpOwotCQlhY3RpdmVDb250ZXh0SWRzLmFkZCgic2libGluZzEiKTsKLQkJY29udGV4dE1hbmFnZXIuc2V0QWN0aXZlQ29udGV4dElkcyhhY3RpdmVDb250ZXh0SWRzKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJXaGVuIG9ubHkgdGhlIGZpcnN0IHNpYmxpbmcgaXMgYWN0aXZlLCBvbmx5IHRoZSBmaXJzdCBiaW5kaW5nIGlzIGFjdGl2ZSIsCi0JCQkJYmluZGluZzEsIGJpbmRpbmdNYW5hZ2VyCi0JCQkJCQkuZ2V0UGVyZmVjdE1hdGNoKFRlc3RCaW5kaW5nLlRSSUdHRVJfU0VRVUVOQ0UpKTsKLQotCQkvLyBPdGhlciBzaWJsaW5nIGFjdGl2ZQotCQlhY3RpdmVDb250ZXh0SWRzLmNsZWFyKCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJzaWJsaW5nMiIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkJIldoZW4gb25seSB0aGUgc2Vjb25kIHNpYmxpbmcgaXMgYWN0aXZlLCBvbmx5IHRoZSBzZWNvbmQgYmluZGluZyBpcyBhY3RpdmUiLAotCQkJCWJpbmRpbmcyLCBiaW5kaW5nTWFuYWdlcgotCQkJCQkJLmdldFBlcmZlY3RNYXRjaChUZXN0QmluZGluZy5UUklHR0VSX1NFUVVFTkNFKSk7Ci0KLQkJLy8gQm90aCBzaWJsaW5ncyBhcmUgYWN0aXZlCi0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJzaWJsaW5nMSIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCQlhc3NlcnRFcXVhbHMoIldoZW4gYm90aCBjb250ZXh0cyBhcmUgYWN0aXZlLCBhIGNvbmZsaWN0IHNob3VsZCBvY2N1ciIsCi0JCQkJbnVsbCwgYmluZGluZ01hbmFnZXIKLQkJCQkJCS5nZXRQZXJmZWN0TWF0Y2goVGVzdEJpbmRpbmcuVFJJR0dFUl9TRVFVRU5DRSkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRlc3RzIHdoZXRoZXIgYSB1c2VyLWRlZmluZWQgYmluZGluZyB3aWxsIG92ZXJyaWRlIHRoZSBleGFjdCBzYW1lIGJpbmRpbmcKLQkgKiBkZWZpbmVkIGluIHRoZSBzeXN0ZW0uCi0JICogPC9wPgotCSAqIDx1bD4KLQkgKiA8bGk+QmluZGluZzEoY29tbWFuZElkPSJ1c2VyIixzY2hlbWVJZD0ibmEiLGNvbnRleHRJZD0ibmEiLGxvY2FsZT1udWxsLHBsYXRmb3JtPW51bGwsdHlwZT1VU0VSKTwvbGk+Ci0JICogPGxpPkJpbmRpbmcyKGNvbW1hbmRJZD0ic3lzdGVtIixzY2hlbWVJZD0ibmEiLGNvbnRleHRJZD0ibmEiLGxvY2FsZT1udWxsLHBsYXRmb3JtPW51bGwsdHlwZT1TWVNURU0pPC9saT4KLQkgKiA8L3VsPgotCSAqIDxwPgotCSAqIEJpbmRpbmcxIHNob3VsZCB3aW4uCi0JICogPC9wPgotCSAqIAotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzY2hlbWUgd2UgdHJ5IHRvIGFjdGl2YXRlIGlzIG5vdCBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RVc2VyT3ZlcnJpZGUoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIENvbnRleHQgY29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoIm5hIik7Ci0JCWNvbnRleHQuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0KLQkJZmluYWwgU2NoZW1lIHNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZSgibmEiKTsKLQkJc2NoZW1lLmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCi0JCWJpbmRpbmdNYW5hZ2VyLnNldEFjdGl2ZVNjaGVtZShzY2hlbWUpOwotCQlmaW5hbCBTZXQgYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJuYSIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCi0JCWZpbmFsIEJpbmRpbmcgYmluZGluZzEgPSBuZXcgVGVzdEJpbmRpbmcoInVzZXIiLCAibmEiLCAibmEiLCBudWxsLAotCQkJCW51bGwsIEJpbmRpbmcuVVNFUiwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZzEpOwotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcyID0gbmV3IFRlc3RCaW5kaW5nKCJzeXN0ZW0iLCAibmEiLCAibmEiLCBudWxsLAotCQkJCW51bGwsIEJpbmRpbmcuU1lTVEVNLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhiaW5kaW5nMik7Ci0JCWFzc2VydEVxdWFscygiVGhlIHVzZXItZGVmaW5lZCBiaW5kaW5nIHNob3VsZCBiZSBhY3RpdmUiLCBiaW5kaW5nMSwKLQkJCQliaW5kaW5nTWFuYWdlci5nZXRQZXJmZWN0TWF0Y2goVGVzdEJpbmRpbmcuVFJJR0dFUl9TRVFVRU5DRSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CaW5kaW5nTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CaW5kaW5nTWFuYWdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5N2YwNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQmluZGluZ01hbmFnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmtleXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Db21tYW5kTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0cy5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHMuQ29udGV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nTWFuYWdlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLklCaW5kaW5nTWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgdGVzdCBjYXNlIGNvdmVycyB0aGUgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSBiaW5kaW5nIG1hbmFnZXIncyBBUEkKLSAqIG1ldGhvZHMuIFRoaXMgaXMgbm90IGludGVuZGVkIHRvIHRlc3QgdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIGJpbmRpbmdzCi0gKiB0aGVtc2VsdmVzIChlLmcuLCBzb2x2aW5nIGEgYmluZGluZyBzZXQpLiBGb3IgdGVzdHMgZGVhbGluZyB3aXRoCi0gKiBpbnRlcmFjdGlvbnMsIHBsZWFzZSBsb29rIGF0IDxjb2RlPkJpbmRpbmdJbnRlcmFjdGlvbnNUZXN0PC9jb2RlPi4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGxpc3RlbmVyIGNvZGUgaXMgdGVzdGVkIHRocm91Z2hvdXQgdGhlIHZhcmlvdXMgdGVzdHMuIFRoZXJlIGlzIG5vCi0gKiBpbmRpdmlkdWFsIHRlc3QgbWV0aG9kIGZvciB0aGUgbGlzdGVuZXIgY29kZS4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5rZXlzLkJpbmRpbmdJbnRlcmFjdGlvbnNUZXN0Ci0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5kaW5nTWFuYWdlclRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEEgdGVzdCBsaXN0ZW5lciB0aGF0IHNob3VsZCBiZSBhdHRhY2hlZCB0byB0aGUgYmluZGluZyBtYW5hZ2VyLiBUaGUKLQkgKiBsaXN0ZW5lciByZWNvcmRzIHRoZSBsYXN0IGZpcmVkIGV2ZW50LgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBJQmluZGluZ01hbmFnZXJMaXN0ZW5lciB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBsYXN0IGV2ZW50IHRoYXQgdGhpcyBsaXN0ZW5lciBzYXcuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JCSAqLwotCQlwcml2YXRlIEJpbmRpbmdNYW5hZ2VyRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuSUJpbmRpbmdNYW5hZ2VyTGlzdGVuZXIjYmluZGluZ01hbmFnZXJDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLkJpbmRpbmdNYW5hZ2VyRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBiaW5kaW5nTWFuYWdlckNoYW5nZWQoQmluZGluZ01hbmFnZXJFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50ID0gZTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBsYXN0IGV2ZW50LgotCQkgKiAKLQkJICogQHJldHVybiBUaGUgbGFzdCBldmVudDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgQmluZGluZ01hbmFnZXJFdmVudCBnZXRMYXN0RXZlbnQoKSB7Ci0JCQlyZXR1cm4gZXZlbnQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgYmluZGluZyBtYW5hZ2VyIHRvIHVzZSBpbiBlYWNoIHRlc3QgY2FzZS4gQSBuZXcgYmluZGluZyBtYW5hZ2VyIGlzCi0JICogY3JlYXRlZCBmb3IgZWFjaCB0ZXN0IGNhc2UsIGFuZCBpdCBpcyBkaXNwb3NlZCB3aGVuIHRoZSB0ZXN0IGlzIG92ZXIuCi0JICovCi0JcHJpdmF0ZSBCaW5kaW5nTWFuYWdlciBiaW5kaW5nTWFuYWdlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY29tbWFuZCBtYW5hZ2VyIGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4gPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY29udGV4dCBtYW5hZ2VyIHRvIHVzZSBpbiBlYWNoIHRlc3QgY2FzZS4gQSBuZXcgY29udGV4dCBtYW5hZ2VyIGlzCi0JICogY3JlYXRlZCBmb3IgZWFjaCB0ZXN0IGNhc2UsIGFuZCBpdCBpcyBkaXNwb3NlZCB3aGVuIHRoZSB0ZXN0IGlzIG92ZXIuCi0JICovCi0JcHJpdmF0ZSBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgYXR0YWNoZWQgdG8gdGhlIGJpbmRpbmcgbWFuYWdlci4gVGhpcyBsaXN0ZW5lciBpcyBhdHRhY2hlZAotCSAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCB0ZXN0IGNhc2UsIGFuZCBpdCBpcyBkaXNwb3NlZCB3aGVuIHRoZSB0ZXN0IGlzCi0JICogb3Zlci4KLQkgKi8KLQlwcml2YXRlIFRlc3RMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgPGNvZGU+QmluZGluZ0ludGVyYWN0aW9uc1Rlc3Q8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotCSAqLwotCXB1YmxpYyBCaW5kaW5nTWFuYWdlclRlc3QoZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250ZXh0IG1hbmFnZXIgYW5kIGEgYmluZGluZyBtYW5hZ2VyIGZvciB1c2UgaW4gdGhlIHRlc3QKLQkgKiBjYXNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBkb1NldFVwKCkgewotCQljb21tYW5kTWFuYWdlciA9IG5ldyBDb21tYW5kTWFuYWdlcigpOwotCQljb250ZXh0TWFuYWdlciA9IG5ldyBDb250ZXh0TWFuYWdlcigpOwotCQliaW5kaW5nTWFuYWdlciA9IG5ldyBCaW5kaW5nTWFuYWdlcihjb250ZXh0TWFuYWdlciwgY29tbWFuZE1hbmFnZXIpOwotCQlsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZ01hbmFnZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZXMgdGhlIGNvbnRleHQgbWFuYWdlciBhbmQgYmluZGluZyBtYW5hZ2VyIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9UZWFyRG93bigpIHsKLQkJYmluZGluZ01hbmFnZXIucmVtb3ZlQmluZGluZ01hbmFnZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWxpc3RlbmVyID0gbnVsbDsKLQkJYmluZGluZ01hbmFnZXIgPSBudWxsOwotCQljb250ZXh0TWFuYWdlciA9IG51bGw7Ci0JCWNvbW1hbmRNYW5hZ2VyID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0aGF0IHRoZSBjb25zdHJ1Y3RvciBkaXNhbGxvd3MgYSBudWxsIGNvbnRleHQgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCXRyeSB7Ci0JCQluZXcgQmluZGluZ01hbmFnZXIobnVsbCwgbnVsbCk7Ci0JCQlmYWlsKCJBIGJpbmRpbmcgbWFuYWdlciBjYW5ub3QgYmUgY29uc3RydWN0ZWQgd2l0aCBhIG51bGwgY29udGV4dCBtYW5hZ2VyIik7Ci0JCX0gY2F0Y2ggKGZpbmFsIE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFN1Y2Nlc3MKLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGFkZCBhIG51bGwgYmluZGluZy4gVGVzdHMgdGhhdCBhZGRpbmcgYQotCSAqIGJpbmRpbmcgZm9yY2VzIGEgcmVjb21wdXRhdGlvbi4KLQkgKiAKLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc2NoZW1lIHdlIHRyeSB0byBhY3RpdmF0ZSBpcyBub3QgZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0QWRkQmluZGluZygpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJLy8gU2V0IHVwIGEgc3RhdGUgaW4gd2hpY2ggYSBiaW5kaW5nIG1heSBiZWNvbWUgYWN0aXZlLgotCQlmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0KCJuYSIpOwotCQljb250ZXh0LmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCQlmaW5hbCBTY2hlbWUgc2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKCJuYSIpOwotCQlzY2hlbWUuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLnNldEFjdGl2ZVNjaGVtZShzY2hlbWUpOwotCQlmaW5hbCBTZXQgYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJuYSIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCi0JCS8vIFRyeSB0byBhZGQgYSBudWxsIGJpbmRpbmcuCi0JCXRyeSB7Ci0JCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKG51bGwpOwotCQkJZmFpbCgiSXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBhZGQgYSBudWxsIGJpbmRpbmciKTsKLQkJfSBjYXRjaCAoZmluYWwgTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gU3VjY2Vzcy4KLQkJfQotCi0JCS8vIFRyeSB0byBhZGQgYSBiaW5kaW5nIHRoYXQgc2hvdWxkIGJlY29tZSBhY3RpdmUuCi0JCWZpbmFsIEJpbmRpbmcgYmluZGluZyA9IG5ldyBUZXN0QmluZGluZygiY29uZmxpY3QxIiwgIm5hIiwgIm5hIiwgbnVsbCwKLQkJCQludWxsLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZyk7Ci0JCWFzc2VydFNhbWUoIlRoZSBiaW5kaW5nIHNob3VsZCBiZSBhY3RpdmUiLCBiaW5kaW5nLCBiaW5kaW5nTWFuYWdlcgotCQkJCS5nZXRQZXJmZWN0TWF0Y2goVGVzdEJpbmRpbmcuVFJJR0dFUl9TRVFVRU5DRSkpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoYXQgPGNvZGU+Z2V0QWN0aXZlQmluZGluZ3NEaXNyZWdhcmRpbmdDb250ZXh0KCk8L2NvZGU+IG5ldmVyCi0JICogcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgaXMgdGVzdGVkIGluCi0JICogPGNvZGU+QmluZGluZ0ludGVyYWN0aW9uc1Rlc3Q8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgQmluZGluZ0ludGVyYWN0aW9uc1Rlc3QKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0QWN0aXZlQmluZGluZ3NEaXNyZWdhcmRpbmdDb250ZXh0KCkgewotCQlmaW5hbCBNYXAgYWN0aXZlQmluZGluZ3MgPSBiaW5kaW5nTWFuYWdlcgotCQkJCS5nZXRBY3RpdmVCaW5kaW5nc0Rpc3JlZ2FyZGluZ0NvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIGFjdGl2ZSBiaW5kaW5ncyBzaG91bGQgbmV2ZXIgYmUgbnVsbCIsCi0JCQkJYWN0aXZlQmluZGluZ3MpOwotCQlhc3NlcnRUcnVlKCJUaGUgYWN0aXZlIGJpbmRpbmdzIHNob3VsZCBzdGFydCBlbXB0eSIsIGFjdGl2ZUJpbmRpbmdzCi0JCQkJLmlzRW1wdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCA8Y29kZT5nZXRBY3RpdmVCaW5kaW5nc0Rpc3JlZ2FyZGluZ0NvbnRleHRGbGF0KCk8L2NvZGU+Ci0JICogbmV2ZXIgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgaXMKLQkgKiB0ZXN0ZWQgaW4gPGNvZGU+QmluZGluZ0ludGVyYWN0aW9uc1Rlc3Q8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgQmluZGluZ0ludGVyYWN0aW9uc1Rlc3QKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0QWN0aXZlQmluZGluZ3NEaXNyZWdhcmRpbmdDb250ZXh0RmxhdCgpIHsKLQkJZmluYWwgQ29sbGVjdGlvbiBhY3RpdmVCaW5kaW5ncyA9IGJpbmRpbmdNYW5hZ2VyCi0JCQkJLmdldEFjdGl2ZUJpbmRpbmdzRGlzcmVnYXJkaW5nQ29udGV4dEZsYXQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIGFjdGl2ZSBiaW5kaW5ncyBzaG91bGQgbmV2ZXIgYmUgbnVsbCIsCi0JCQkJYWN0aXZlQmluZGluZ3MpOwotCQlhc3NlcnRUcnVlKCJUaGUgYWN0aXZlIGJpbmRpbmdzIHNob3VsZCBzdGFydCBlbXB0eSIsIGFjdGl2ZUJpbmRpbmdzCi0JCQkJLmlzRW1wdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgbWV0aG9kIHdvcmtzIHdpdGggYSBudWxsIGFyZ3VtZW50LiBUZXN0cyB0aGF0IGl0IHdvcmtzCi0JICogaW4gYSBzaW1wbGUgY2FzZS4KLQkgKiAKLQkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc2NoZW1lIHdlIHRyeSB0byBhY3RpdmF0ZSBpcyBub3QgZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0QWN0aXZlQmluZGluZ3NGb3IoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3Qgd2l0aCBhIG51bGwgYXJndW1lbnQuCi0JCWZpbmFsIFRyaWdnZXJTZXF1ZW5jZVtdIGFjdGl2ZUJpbmRpbmdzRm9yTnVsbCA9IGJpbmRpbmdNYW5hZ2VyCi0JCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKChQYXJhbWV0ZXJpemVkQ29tbWFuZCkgbnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSBhY3RpdmUgYmluZGluZ3MgZm9yIGEgY29tbWFuZCBzaG91bGQgbmV2ZXIgYmUgbnVsbCIsCi0JCQkJYWN0aXZlQmluZGluZ3NGb3JOdWxsKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCQkiVGhlIGFjdGl2ZSBiaW5kaW5nIGZvciBhIG51bGwgY29tbWFuZCBzaG91bGQgYWx3YXlzIGJlIGVtcHR5IiwKLQkJCQlhY3RpdmVCaW5kaW5nc0Zvck51bGwubGVuZ3RoID09IDApOwotCi0JCS8vIFRlc3QgYSBzaW1wbGUgY2FzZS4KLQkJZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dCgibmEiKTsKLQkJY29udGV4dC5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQotCQlmaW5hbCBTY2hlbWUgc2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKCJuYSIpOwotCQlzY2hlbWUuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0KLQkJYmluZGluZ01hbmFnZXIuc2V0QWN0aXZlU2NoZW1lKHNjaGVtZSk7Ci0JCWZpbmFsIFNldCBhY3RpdmVDb250ZXh0SWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJYWN0aXZlQ29udGV4dElkcy5hZGQoIm5hIik7Ci0JCWNvbnRleHRNYW5hZ2VyLnNldEFjdGl2ZUNvbnRleHRJZHMoYWN0aXZlQ29udGV4dElkcyk7Ci0KLQkJZmluYWwgU3RyaW5nIGNvbW1hbmRJZCA9ICJjb21tYW5kSWQiOwotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcgPSBuZXcgVGVzdEJpbmRpbmcoY29tbWFuZElkLCAibmEiLCAibmEiLCBudWxsLAotCQkJCW51bGwsIEJpbmRpbmcuU1lTVEVNLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhiaW5kaW5nKTsKLQotCQlmaW5hbCBUcmlnZ2VyU2VxdWVuY2VbXSBiaW5kaW5ncyA9IGJpbmRpbmdNYW5hZ2VyCi0JCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKGJpbmRpbmcuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKSk7Ci0JCWFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIGJlIG9uZSBiaW5kaW5nIiwgMSwgYmluZGluZ3MubGVuZ3RoKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIGJpbmRpbmcgc2hvdWxkIG1hdGNoIiwgVGVzdEJpbmRpbmcuVFJJR0dFUl9TRVFVRU5DRSwKLQkJCQliaW5kaW5nc1swXSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCB0aGUgYWN0aXZlIHNjaGVtZSBzdGFydHMgb2ZmIDxjb2RlPm51bGw8L2NvZGU+LiBUaGUgcmVzdCBvZgotCSAqIHRoZSBhY3RpdmUgc2NoZW1lIHRlc3RpbmcgaGFwcGVucyBpbiA8Y29kZT50ZXN0U2V0QWN0aXZlU2NoZW1lKCk8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgQmluZGluZ01hbmFnZXJUZXN0I3Rlc3RTZXRBY3RpdmVTY2hlbWUoKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRBY3RpdmVTY2hlbWUoKSB7Ci0JCWFzc2VydE51bGwoIlRoZSBhY3RpdmUgc2NoZW1lIHNob3VsZCBzdGFydCBudWxsIiwgYmluZGluZ01hbmFnZXIKLQkJCQkuZ2V0QWN0aXZlU2NoZW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoYXQgPGNvZGU+Z2V0QmluZGluZ3M8L2NvZGU+IGZpcnN0IHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogSXQgdGhlbiB2ZXJpZmllcyB0aGF0IGFuIGFkZGVkIGJpbmRpbmcgaXMgcmV0dXJuIGZyb20gdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEJpbmRpbmdzKCkgewotCQkvLyBDaGVjayB0aGUgc3RhcnRpbmcgY29uZGl0aW9uLgotCQlhc3NlcnROdWxsKCJUaGUgYmluZGluZ3Mgc2hvdWxkIHN0YXJ0IG9mZiBudWxsIiwgYmluZGluZ01hbmFnZXIKLQkJCQkuZ2V0QmluZGluZ3MoKSk7Ci0KLQkJLy8gQ2hlY2sgdGhhdCBhbiBhZGRlZCBiaW5kaW5nIGlzIGluY2x1ZGVkLgotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcgPSBuZXcgVGVzdEJpbmRpbmcobnVsbCwgInNjaGVtZUlkIiwgImNvbnRleHRJZCIsCi0JCQkJbnVsbCwgbnVsbCwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmcpOwotCQlmaW5hbCBCaW5kaW5nW10gYmluZGluZ3MgPSBiaW5kaW5nTWFuYWdlci5nZXRCaW5kaW5ncygpOwotCQlhc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZCBiZSBvbmUgYmluZGluZyIsIDEsIGJpbmRpbmdzLmxlbmd0aCk7Ci0JCWFzc2VydFNhbWUoIlRoZSBiaW5kaW5nIHNob3VsZCBiZSB0aGUgc2FtZSIsIGJpbmRpbmcsIGJpbmRpbmdzWzBdKTsKLQotCQkvKgotCQkgKiBDaGVjayB0aGF0IG1vZGlmeWluZyB0aGlzIHNldCBkb2VzIG5vdCBtb2RpZnkgdGhlIGludGVybmFsIGRhdGEKLQkJICogc3RydWN0dXJlcy4KLQkJICovCi0JCWJpbmRpbmdzWzBdID0gbnVsbDsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZSIsCi0JCQkJYmluZGluZ01hbmFnZXIuZ2V0QmluZGluZ3MoKVswXSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCB0aGUgbGlzdCBvZiBkZWZpbmVkIHNjaGVtZXMgc3RheXMgdXAtdG8tZGF0ZQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXREZWZpbmVkU2NoZW1lSWRzKCkgewotCQkvLyBTdGFydGluZyBjb25kaXRpb24uCi0JCWFzc2VydFRydWUoIlRoZSBzZXQgb2YgZGVmaW5lZCBzY2hlbWVzIHNob3VsZCBzdGFydCBlbXB0eSIsCi0JCQkJYmluZGluZ01hbmFnZXIuZ2V0RGVmaW5lZFNjaGVtZXMoKS5sZW5ndGggPT0gMCk7Ci0KLQkJLy8gUmV0cmlldmluZyBhIHNjaGVtZSBzaG91bGRuJ3QgY2hhbmdlIGFueXRoaW5nLgotCQlmaW5hbCBTY2hlbWUgc2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKCJzY2hlbWVJZCIpOwotCQlhc3NlcnRUcnVlKAotCQkJCSJUaGUgc2V0IG9mIGRlZmluZWQgc2NoZW1lcyBzaG91bGQgc3RpbGwgYmUgZW1wdHkgYWZ0ZXIgYSBnZXQiLAotCQkJCWJpbmRpbmdNYW5hZ2VyLmdldERlZmluZWRTY2hlbWVzKCkubGVuZ3RoID09IDApOwotCi0JCS8vIERlZmluaW5nIHRoZSBzY2hlbWUgc2hvdWxkIGNoYW5nZSB0aGluZ3MuCi0JCXNjaGVtZS5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQkJU2NoZW1lW10gZGVmaW5lZFNjaGVtZXMgPSBiaW5kaW5nTWFuYWdlci5nZXREZWZpbmVkU2NoZW1lcygpOwotCQlhc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZCBiZSBvbmUgZGVmaW5lZCBzY2hlbWUgaWQiLCAxLAotCQkJCWRlZmluZWRTY2hlbWVzLmxlbmd0aCk7Ci0JCWFzc2VydFNhbWUoIlRoZSBkZWZpbmVkIHNjaGVtZSBpZCBzaG91bGQgbWF0Y2giLCBzY2hlbWUsCi0JCQkJZGVmaW5lZFNjaGVtZXNbMF0pOwotCi0JCWRlZmluZWRTY2hlbWVzWzBdID0gbnVsbDsKLQkJZGVmaW5lZFNjaGVtZXMgPSBiaW5kaW5nTWFuYWdlci5nZXREZWZpbmVkU2NoZW1lcygpOwotCQlhc3NlcnRTYW1lKCJUaGUgQVBJIHNob3VsZCBub3QgZXhwb3NlIGludGVybmFsIGNvbGxlY3Rpb25zIiwgc2NoZW1lLAotCQkJCWRlZmluZWRTY2hlbWVzWzBdKTsKLQotCQkvLyBVbmRlZmluaW5nIHRoZSBzY2hlbWUgc2hvdWxkIGFsc28gY2hhbmdlIHRoaW5ncy4KLQkJc2NoZW1lLnVuZGVmaW5lKCk7Ci0JCWFzc2VydFRydWUoCi0JCQkJIlRoZSBzZXQgb2YgZGVmaW5lZCBzY2hlbWVzIHNob3VsZCBiZSBlbXB0eSBhZnRlciBhbiB1bmRlZmluZSIsCi0JCQkJYmluZGluZ01hbmFnZXIuZ2V0RGVmaW5lZFNjaGVtZXMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCB0aGUgYWN0aXZlIGxvY2FsZSBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0TG9jYWxlKCkgewotCQlhc3NlcnROb3ROdWxsKCJUaGUgbG9jYWxlIHNob3VsZCBuZXZlciBiZSBudWxsIiwgYmluZGluZ01hbmFnZXIKLQkJCQkuZ2V0TG9jYWxlKCkpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoYXQgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZXhwZWN0ZWQgbGlzdCBvZiBzZXF1ZW5jZXMgZm9yIGEKLQkgKiBjb3VwbGUgb2Ygc2NlbmFyaW9zLiBJbiB0aGUgZmlyc3Qgc2NlbmFyaW8sIHRoZXJlIGlzIG9uZSBwZXJmZWN0IG1hdGNoCi0JICogYmluZGluZ3MgYW5kIGEgcGFydGlhbCBtYXRjaCBiaW5kaW5nLiBJbiB0aGUgc2Vjb25kIHNjZW5hcmlvLCB0aGVyZSBhcmUKLQkgKiB0d28gcGFydGlhbCBtYXRjaCBiaW5kaW5ncy4gSW4gdGhlIHRoaXJkIHNjZW5hcmlvLCB3ZSBhcmUgY2hlY2tpbmcgdGhhdAotCSAqIGFsbCBiaW5kaW5ncyBtYXRjaCBhbiBlbXB0eSB0cmlnZ2VyIHNlcXVlbmNlLgotCSAqIAotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzY2hlbWUgd2UgdHJ5IHRvIGFjdGl2YXRlIGlzIG5vdCBkZWZpbmVkLgotCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgaGFyZC1jb2RlZCBzdHJpbmdzIGFyZW4ndCBjb25zdHJ1Y3RlZCBwcm9wZXJseS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UGFydGlhbE1hdGNoZXMoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiwKLQkJCVBhcnNlRXhjZXB0aW9uIHsKLQkJLy8gR0VORVJBTCBTRVQtVVAKLQkJZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dCgibmEiKTsKLQkJY29udGV4dC5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQkJZmluYWwgU2NoZW1lIHNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZSgibmEiKTsKLQkJc2NoZW1lLmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoc2NoZW1lKTsKLQkJZmluYWwgU2V0IGFjdGl2ZUNvbnRleHRJZHMgPSBuZXcgSGFzaFNldCgpOwotCQlhY3RpdmVDb250ZXh0SWRzLmFkZCgibmEiKTsKLQkJY29udGV4dE1hbmFnZXIuc2V0QWN0aXZlQ29udGV4dElkcyhhY3RpdmVDb250ZXh0SWRzKTsKLQotCQkvLyBTQ0VOQVJJTyAxCi0JCWZpbmFsIEtleVNlcXVlbmNlIHBlcmZlY3RNYXRjaCA9IEtleVNlcXVlbmNlLmdldEluc3RhbmNlKCJDVFJMK0YiKTsKLQkJZmluYWwgQ29tbWFuZCBwZXJmZWN0Q29tbWFuZCA9IGNvbW1hbmRNYW5hZ2VyLmdldENvbW1hbmQoInBlcmZlY3QiKTsKLQkJZmluYWwgUGFyYW1ldGVyaXplZENvbW1hbmQgcGVyZmVjdFBhcmFtZXRlcml6ZWRDb21tYW5kID0gbmV3IFBhcmFtZXRlcml6ZWRDb21tYW5kKAotCQkJCXBlcmZlY3RDb21tYW5kLCBudWxsKTsKLQkJZmluYWwgQmluZGluZyBwZXJmZWN0TWF0Y2hCaW5kaW5nID0gbmV3IEtleUJpbmRpbmcocGVyZmVjdE1hdGNoLAotCQkJCXBlcmZlY3RQYXJhbWV0ZXJpemVkQ29tbWFuZCwgIm5hIiwgIm5hIiwgbnVsbCwgbnVsbCwgbnVsbCwKLQkJCQlCaW5kaW5nLlNZU1RFTSk7Ci0JCWZpbmFsIEtleVNlcXVlbmNlIHBhcnRpYWxNYXRjaDEgPSBLZXlTZXF1ZW5jZQotCQkJCS5nZXRJbnN0YW5jZSgiQ1RSTCtGIENUUkwrRiIpOwotCQlmaW5hbCBDb21tYW5kIHBhcnRpYWxDb21tYW5kMSA9IGNvbW1hbmRNYW5hZ2VyLmdldENvbW1hbmQoInBhcnRpYWwxIik7Ci0JCWZpbmFsIFBhcmFtZXRlcml6ZWRDb21tYW5kIHBhcnRpYWxQYXJhbWV0ZXJpemVkQ29tbWFuZDEgPSBuZXcgUGFyYW1ldGVyaXplZENvbW1hbmQoCi0JCQkJcGFydGlhbENvbW1hbmQxLCBudWxsKTsKLQkJZmluYWwgQmluZGluZyBwYXJ0aWFsTWF0Y2hCaW5kaW5nMSA9IG5ldyBLZXlCaW5kaW5nKHBhcnRpYWxNYXRjaDEsCi0JCQkJcGFydGlhbFBhcmFtZXRlcml6ZWRDb21tYW5kMSwgIm5hIiwgIm5hIiwgbnVsbCwgbnVsbCwgbnVsbCwKLQkJCQlCaW5kaW5nLlNZU1RFTSk7Ci0JCWZpbmFsIEJpbmRpbmdbXSBiaW5kaW5ncyA9IG5ldyBCaW5kaW5nWzJdOwotCQliaW5kaW5nc1swXSA9IHBlcmZlY3RNYXRjaEJpbmRpbmc7Ci0JCWJpbmRpbmdzWzFdID0gcGFydGlhbE1hdGNoQmluZGluZzE7Ci0JCWJpbmRpbmdNYW5hZ2VyLnNldEJpbmRpbmdzKGJpbmRpbmdzKTsKLQkJTWFwIHBhcnRpYWxNYXRjaGVzID0gYmluZGluZ01hbmFnZXIuZ2V0UGFydGlhbE1hdGNoZXMocGVyZmVjdE1hdGNoKTsKLQkJYXNzZXJ0VHJ1ZSgiQSBwYXJ0aWFsIG1hdGNoIHNob3VsZCBvdmVycmlkZSBhIHBlcmZlY3QgbWF0Y2giLAotCQkJCSFwYXJ0aWFsTWF0Y2hlcy5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKCJBIHBhcnRpYWwgbWF0Y2ggc2hvdWxkIG92ZXJyaWRlIGEgcGVyZmVjdCBtYXRjaCIsCi0JCQkJcGFydGlhbE1hdGNoZXMuY29udGFpbnNLZXkocGFydGlhbE1hdGNoMSkpOwotCi0JCS8vIFNDRU5BUklPIDIKLQkJZmluYWwgS2V5U2VxdWVuY2UgcGFydGlhbE1hdGNoMiA9IEtleVNlcXVlbmNlCi0JCQkJLmdldEluc3RhbmNlKCJDVFJMK0YgQ1RSTCtGIENUUkwrRiIpOwotCQlmaW5hbCBDb21tYW5kIHBhcnRpYWxDb21tYW5kMiA9IGNvbW1hbmRNYW5hZ2VyLmdldENvbW1hbmQoInBhcnRpYWwyIik7Ci0JCWZpbmFsIFBhcmFtZXRlcml6ZWRDb21tYW5kIHBhcnRpYWxQYXJhbWV0ZXJpemVkQ29tbWFuZDIgPSBuZXcgUGFyYW1ldGVyaXplZENvbW1hbmQoCi0JCQkJcGFydGlhbENvbW1hbmQyLCBudWxsKTsKLQkJZmluYWwgQmluZGluZyBwYXJ0aWFsTWF0Y2hCaW5kaW5nMiA9IG5ldyBLZXlCaW5kaW5nKHBhcnRpYWxNYXRjaDIsCi0JCQkJcGFydGlhbFBhcmFtZXRlcml6ZWRDb21tYW5kMiwgIm5hIiwgIm5hIiwgbnVsbCwgbnVsbCwgbnVsbCwKLQkJCQlCaW5kaW5nLlNZU1RFTSk7Ci0JCWJpbmRpbmdzWzBdID0gcGFydGlhbE1hdGNoQmluZGluZzE7Ci0JCWJpbmRpbmdzWzFdID0gcGFydGlhbE1hdGNoQmluZGluZzI7Ci0JCWJpbmRpbmdNYW5hZ2VyLnNldEJpbmRpbmdzKGJpbmRpbmdzKTsKLQkJcGFydGlhbE1hdGNoZXMgPSBiaW5kaW5nTWFuYWdlci5nZXRQYXJ0aWFsTWF0Y2hlcyhwZXJmZWN0TWF0Y2gpOwotCQlhc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZCBiZSB0d28gcGFydGlhbCBtYXRjaGVzIiwgMiwgcGFydGlhbE1hdGNoZXMKLQkJCQkuc2l6ZSgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHBhcnRpYWwgbWF0Y2ggc2hvdWxkIGJlIHRoZSBvbmUgZGVmaW5lZCIsCi0JCQkJcGFydGlhbE1hdGNoQmluZGluZzEsIHBhcnRpYWxNYXRjaGVzLmdldChwYXJ0aWFsTWF0Y2gxKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBwYXJ0aWFsIG1hdGNoIHNob3VsZCBiZSB0aGUgb25lIGRlZmluZWQiLAotCQkJCXBhcnRpYWxNYXRjaEJpbmRpbmcyLCBwYXJ0aWFsTWF0Y2hlcy5nZXQocGFydGlhbE1hdGNoMikpOwotCi0JCS8vIFNDRU5BUklPIDMKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhwZXJmZWN0TWF0Y2hCaW5kaW5nKTsKLQkJcGFydGlhbE1hdGNoZXMgPSBiaW5kaW5nTWFuYWdlci5nZXRQYXJ0aWFsTWF0Y2hlcyhLZXlTZXF1ZW5jZQotCQkJCS5nZXRJbnN0YW5jZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgYmUgdGhyZWUgcGFydGlhbCBtYXRjaGVzIiwgMywgcGFydGlhbE1hdGNoZXMKLQkJCQkuc2l6ZSgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHBhcnRpYWwgbWF0Y2ggc2hvdWxkIGJlIHRoZSBvbmUgZGVmaW5lZCIsCi0JCQkJcGVyZmVjdE1hdGNoQmluZGluZywgcGFydGlhbE1hdGNoZXMuZ2V0KHBlcmZlY3RNYXRjaCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgcGFydGlhbCBtYXRjaCBzaG91bGQgYmUgdGhlIG9uZSBkZWZpbmVkIiwKLQkJCQlwYXJ0aWFsTWF0Y2hCaW5kaW5nMSwgcGFydGlhbE1hdGNoZXMuZ2V0KHBhcnRpYWxNYXRjaDEpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHBhcnRpYWwgbWF0Y2ggc2hvdWxkIGJlIHRoZSBvbmUgZGVmaW5lZCIsCi0JCQkJcGFydGlhbE1hdGNoQmluZGluZzIsIHBhcnRpYWxNYXRjaGVzLmdldChwYXJ0aWFsTWF0Y2gyKSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBleHBlY3RlZCBjb21tYW5kIGlkZW50aWZpZXIuIEluIHRoZQotCSAqIGZpcnN0IHNjZW5hcmlvLCB0aGVyZSBpcyBvbmUgcGVyZmVjdCBtYXRjaCBiaW5kaW5ncyBhbmQgYSBwYXJ0aWFsIG1hdGNoCi0JICogYmluZGluZy4gSW4gdGhlIHNlY29uZCBzY2VuYXJpbywgdGhlcmUgYXJlIHR3byBwYXJ0aWFsIG1hdGNoIGJpbmRpbmdzLiBJbgotCSAqIHRoZSB0aGlyZCBzY2VuYXJpbywgd2UgYXJlIGNoZWNraW5nIHRoYXQgbm90aGluZyBtYXRjaGVzIGFuIGVtcHR5Ci0JICogc2VxdWVuY2UuCi0JICogCi0JICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHNjaGVtZSB3ZSB0cnkgdG8gYWN0aXZhdGUgaXMgbm90IGRlZmluZWQuCi0JICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBoYXJkLWNvZGVkIHN0cmluZ3MgYXJlbid0IGNvbnN0cnVjdGVkIHByb3Blcmx5LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRQZXJmZWN0TWF0Y2goKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiwKLQkJCVBhcnNlRXhjZXB0aW9uIHsKLQkJLy8gR0VORVJBTCBTRVQtVVAKLQkJZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dCgibmEiKTsKLQkJY29udGV4dC5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQkJZmluYWwgU2NoZW1lIHNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZSgibmEiKTsKLQkJc2NoZW1lLmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoc2NoZW1lKTsKLQkJZmluYWwgU2V0IGFjdGl2ZUNvbnRleHRJZHMgPSBuZXcgSGFzaFNldCgpOwotCQlhY3RpdmVDb250ZXh0SWRzLmFkZCgibmEiKTsKLQkJY29udGV4dE1hbmFnZXIuc2V0QWN0aXZlQ29udGV4dElkcyhhY3RpdmVDb250ZXh0SWRzKTsKLQotCQkvLyBTQ0VOQVJJTyAxCi0JCWZpbmFsIEtleVNlcXVlbmNlIHBlcmZlY3RNYXRjaCA9IEtleVNlcXVlbmNlLmdldEluc3RhbmNlKCJDVFJMK0YiKTsKLQkJZmluYWwgQ29tbWFuZCBwZXJmZWN0Q29tbWFuZCA9IGNvbW1hbmRNYW5hZ2VyLmdldENvbW1hbmQoInBlcmZlY3QiKTsKLQkJZmluYWwgUGFyYW1ldGVyaXplZENvbW1hbmQgcGVyZmVjdFBhcmFtZXRlcml6ZWRDb21tYW5kID0gbmV3IFBhcmFtZXRlcml6ZWRDb21tYW5kKAotCQkJCXBlcmZlY3RDb21tYW5kLCBudWxsKTsKLQkJZmluYWwgQmluZGluZyBwZXJmZWN0TWF0Y2hCaW5kaW5nID0gbmV3IEtleUJpbmRpbmcocGVyZmVjdE1hdGNoLAotCQkJCXBlcmZlY3RQYXJhbWV0ZXJpemVkQ29tbWFuZCwgIm5hIiwgIm5hIiwgbnVsbCwgbnVsbCwgbnVsbCwKLQkJCQlCaW5kaW5nLlNZU1RFTSk7Ci0JCWZpbmFsIEtleVNlcXVlbmNlIHBhcnRpYWxNYXRjaDEgPSBLZXlTZXF1ZW5jZQotCQkJCS5nZXRJbnN0YW5jZSgiQ1RSTCtGIENUUkwrRiIpOwotCQlmaW5hbCBDb21tYW5kIHBhcnRpYWxDb21tYW5kMSA9IGNvbW1hbmRNYW5hZ2VyLmdldENvbW1hbmQoInBhcnRpYWwxIik7Ci0JCWZpbmFsIFBhcmFtZXRlcml6ZWRDb21tYW5kIHBhcnRpYWxQYXJhbWV0ZXJpemVkQ29tbWFuZDEgPSBuZXcgUGFyYW1ldGVyaXplZENvbW1hbmQoCi0JCQkJcGFydGlhbENvbW1hbmQxLCBudWxsKTsKLQkJZmluYWwgQmluZGluZyBwYXJ0aWFsTWF0Y2hCaW5kaW5nMSA9IG5ldyBLZXlCaW5kaW5nKHBhcnRpYWxNYXRjaDEsCi0JCQkJcGFydGlhbFBhcmFtZXRlcml6ZWRDb21tYW5kMSwgIm5hIiwgIm5hIiwgbnVsbCwgbnVsbCwgbnVsbCwKLQkJCQlCaW5kaW5nLlNZU1RFTSk7Ci0JCWZpbmFsIEJpbmRpbmdbXSBiaW5kaW5ncyA9IG5ldyBCaW5kaW5nWzJdOwotCQliaW5kaW5nc1swXSA9IHBlcmZlY3RNYXRjaEJpbmRpbmc7Ci0JCWJpbmRpbmdzWzFdID0gcGFydGlhbE1hdGNoQmluZGluZzE7Ci0JCWJpbmRpbmdNYW5hZ2VyLnNldEJpbmRpbmdzKGJpbmRpbmdzKTsKLQkJQmluZGluZyBhY3R1YWxCaW5kaW5nID0gYmluZGluZ01hbmFnZXIuZ2V0UGVyZmVjdE1hdGNoKHBlcmZlY3RNYXRjaCk7Ci0JCWFzc2VydFNhbWUoIlRoaXMgc2hvdWxkIGJlIGEgcGVyZmVjdCBtYXRjaCIsIHBlcmZlY3RNYXRjaEJpbmRpbmcsCi0JCQkJYWN0dWFsQmluZGluZyk7Ci0KLQkJLy8gU0NFTkFSSU8gMgotCQlmaW5hbCBLZXlTZXF1ZW5jZSBwYXJ0aWFsTWF0Y2gyID0gS2V5U2VxdWVuY2UKLQkJCQkuZ2V0SW5zdGFuY2UoIkNUUkwrRiBDVFJMK0YgQ1RSTCtGIik7Ci0JCWZpbmFsIENvbW1hbmQgcGFydGlhbENvbW1hbmQyID0gY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZCgicGFydGlhbDIiKTsKLQkJZmluYWwgUGFyYW1ldGVyaXplZENvbW1hbmQgcGFydGlhbFBhcmFtZXRlcml6ZWRDb21tYW5kMiA9IG5ldyBQYXJhbWV0ZXJpemVkQ29tbWFuZCgKLQkJCQlwYXJ0aWFsQ29tbWFuZDIsIG51bGwpOwotCQlmaW5hbCBCaW5kaW5nIHBhcnRpYWxNYXRjaEJpbmRpbmcyID0gbmV3IEtleUJpbmRpbmcocGFydGlhbE1hdGNoMiwKLQkJCQlwYXJ0aWFsUGFyYW1ldGVyaXplZENvbW1hbmQyLCAibmEiLCAibmEiLCBudWxsLCBudWxsLCBudWxsLAotCQkJCUJpbmRpbmcuU1lTVEVNKTsKLQkJYmluZGluZ3NbMF0gPSBwYXJ0aWFsTWF0Y2hCaW5kaW5nMTsKLQkJYmluZGluZ3NbMV0gPSBwYXJ0aWFsTWF0Y2hCaW5kaW5nMjsKLQkJYmluZGluZ01hbmFnZXIuc2V0QmluZGluZ3MoYmluZGluZ3MpOwotCQlhY3R1YWxCaW5kaW5nID0gYmluZGluZ01hbmFnZXIuZ2V0UGVyZmVjdE1hdGNoKHBlcmZlY3RNYXRjaCk7Ci0JCWFzc2VydE51bGwoIlRoZXJlIHNob3VsZCBiZSBubyBwZXJmZWN0IG1hdGNoZXMiLCBhY3R1YWxCaW5kaW5nKTsKLQotCQkvLyBTQ0VOQVJJTyAzCi0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcocGVyZmVjdE1hdGNoQmluZGluZyk7Ci0JCWFjdHVhbEJpbmRpbmcgPSBiaW5kaW5nTWFuYWdlci5nZXRQZXJmZWN0TWF0Y2goS2V5U2VxdWVuY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKSk7Ci0JCWFzc2VydE51bGwoIlRoaXMgc2hvdWxkIGJlIG5vIHBlcmZlY3QgbWF0Y2hlcyBmb3IgYW4gZW1wdHkgc2VxdWVuY2UiLAotCQkJCWFjdHVhbEJpbmRpbmcpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoYXQgdGhlIHBsYXRmb3JtIGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRQbGF0Zm9ybSgpIHsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHBsYXRmb3JtIGNhbiBuZXZlciBiZSBudWxsIiwgYmluZGluZ01hbmFnZXIKLQkJCQkuZ2V0UGxhdGZvcm0oKSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCB3aGVuIGEgc2NoZW1lIGlzIGZpcnN0IHJldHJpZXZlZCwgaXQgaXMgdW5kZWZpbmVkLiBUZXN0cyB0aGF0Ci0JICogYSBzZWNvbmQgYWNjZXNzIHRvIGEgc2NoZW1lIHJldHVybnMgdGhlIHNhbWUgc2NoZW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRTY2hlbWUoKSB7Ci0JCWZpbmFsIFN0cmluZyBzY2hlbWVJZCA9ICJzY2hlbWVJZCI7Ci0JCWZpbmFsIFNjaGVtZSBmaXJzdFNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZShzY2hlbWVJZCk7Ci0JCWFzc2VydFRydWUoIkEgc2NoZW1lIHNob3VsZCBzdGFydCB1bmRlZmluZWQiLCAhZmlyc3RTY2hlbWUuaXNEZWZpbmVkKCkpOwotCQlmaW5hbCBTY2hlbWUgc2Vjb25kU2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKHNjaGVtZUlkKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHR3byBzY2hlbWUgc2hvdWxkIGJlIHRoZSBzYW1lIiwgZmlyc3RTY2hlbWUsCi0JCQkJc2Vjb25kU2NoZW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiBleHBlY3RlZC4gSW4gdGhlCi0JICogZmlyc3Qgc2NlbmFyaW8sIHRoZXJlIGlzIG9uZSBwZXJmZWN0IG1hdGNoIGJpbmRpbmdzIGFuZCBhIHBhcnRpYWwgbWF0Y2gKLQkgKiBiaW5kaW5nLiBJbiB0aGUgc2Vjb25kIHNjZW5hcmlvLCB0aGVyZSBhcmUgdHdvIHBhcnRpYWwgbWF0Y2ggYmluZGluZ3MuIEluCi0JICogdGhlIHRoaXJkIHNjZW5hcmlvLCB3ZSBhcmUgY2hlY2tpbmcgdGhhdCBhbGwgYmluZGluZ3MgbWF0Y2ggYW4gZW1wdHkKLQkgKiB0cmlnZ2VyIHNlcXVlbmNlLgotCSAqIAotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzY2hlbWUgd2UgdHJ5IHRvIGFjdGl2YXRlIGlzIG5vdCBkZWZpbmVkLgotCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgaGFyZC1jb2RlZCBzdHJpbmdzIGFyZW4ndCBjb25zdHJ1Y3RlZCBwcm9wZXJseS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SXNQYXJ0aWFsTWF0Y2goKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiwKLQkJCVBhcnNlRXhjZXB0aW9uIHsKLQkJLy8gR0VORVJBTCBTRVQtVVAKLQkJZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dCgibmEiKTsKLQkJY29udGV4dC5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQkJZmluYWwgU2NoZW1lIHNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZSgibmEiKTsKLQkJc2NoZW1lLmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoc2NoZW1lKTsKLQkJZmluYWwgU2V0IGFjdGl2ZUNvbnRleHRJZHMgPSBuZXcgSGFzaFNldCgpOwotCQlhY3RpdmVDb250ZXh0SWRzLmFkZCgibmEiKTsKLQkJY29udGV4dE1hbmFnZXIuc2V0QWN0aXZlQ29udGV4dElkcyhhY3RpdmVDb250ZXh0SWRzKTsKLQotCQkvLyBTQ0VOQVJJTyAxCi0JCWZpbmFsIEtleVNlcXVlbmNlIHBlcmZlY3RNYXRjaCA9IEtleVNlcXVlbmNlLmdldEluc3RhbmNlKCJDVFJMK0YiKTsKLQkJZmluYWwgQ29tbWFuZCBwZXJmZWN0Q29tbWFuZCA9IGNvbW1hbmRNYW5hZ2VyLmdldENvbW1hbmQoInBlcmZlY3QiKTsKLQkJZmluYWwgUGFyYW1ldGVyaXplZENvbW1hbmQgcGVyZmVjdFBhcmFtZXRlcml6ZWRDb21tYW5kID0gbmV3IFBhcmFtZXRlcml6ZWRDb21tYW5kKAotCQkJCXBlcmZlY3RDb21tYW5kLCBudWxsKTsKLQkJZmluYWwgQmluZGluZyBwZXJmZWN0TWF0Y2hCaW5kaW5nID0gbmV3IEtleUJpbmRpbmcocGVyZmVjdE1hdGNoLAotCQkJCXBlcmZlY3RQYXJhbWV0ZXJpemVkQ29tbWFuZCwgIm5hIiwgIm5hIiwgbnVsbCwgbnVsbCwgbnVsbCwKLQkJCQlCaW5kaW5nLlNZU1RFTSk7Ci0JCWZpbmFsIEtleVNlcXVlbmNlIHBhcnRpYWxNYXRjaDEgPSBLZXlTZXF1ZW5jZQotCQkJCS5nZXRJbnN0YW5jZSgiQ1RSTCtGIENUUkwrRiIpOwotCQlmaW5hbCBDb21tYW5kIHBhcnRpYWxDb21tYW5kMSA9IGNvbW1hbmRNYW5hZ2VyLmdldENvbW1hbmQoInBhcnRpYWwxIik7Ci0JCWZpbmFsIFBhcmFtZXRlcml6ZWRDb21tYW5kIHBhcnRpYWxQYXJhbWV0ZXJpemVkQ29tbWFuZDEgPSBuZXcgUGFyYW1ldGVyaXplZENvbW1hbmQoCi0JCQkJcGFydGlhbENvbW1hbmQxLCBudWxsKTsKLQkJZmluYWwgQmluZGluZyBwYXJ0aWFsTWF0Y2hCaW5kaW5nMSA9IG5ldyBLZXlCaW5kaW5nKHBhcnRpYWxNYXRjaDEsCi0JCQkJcGFydGlhbFBhcmFtZXRlcml6ZWRDb21tYW5kMSwgIm5hIiwgIm5hIiwgbnVsbCwgbnVsbCwgbnVsbCwKLQkJCQlCaW5kaW5nLlNZU1RFTSk7Ci0JCWZpbmFsIEJpbmRpbmdbXSBiaW5kaW5ncyA9IG5ldyBCaW5kaW5nWzJdOwotCQliaW5kaW5nc1swXSA9IHBlcmZlY3RNYXRjaEJpbmRpbmc7Ci0JCWJpbmRpbmdzWzFdID0gcGFydGlhbE1hdGNoQmluZGluZzE7Ci0JCWJpbmRpbmdNYW5hZ2VyLnNldEJpbmRpbmdzKGJpbmRpbmdzKTsKLQkJYXNzZXJ0VHJ1ZSgiQSBwZXJmZWN0IG1hdGNoIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IGEgcGFydGlhbCIsCi0JCQkJYmluZGluZ01hbmFnZXIuaXNQYXJ0aWFsTWF0Y2gocGVyZmVjdE1hdGNoKSk7Ci0KLQkJLy8gU0NFTkFSSU8gMgotCQlmaW5hbCBLZXlTZXF1ZW5jZSBwYXJ0aWFsTWF0Y2gyID0gS2V5U2VxdWVuY2UKLQkJCQkuZ2V0SW5zdGFuY2UoIkNUUkwrRiBDVFJMK0YgQ1RSTCtGIik7Ci0JCWZpbmFsIENvbW1hbmQgcGFydGlhbENvbW1hbmQyID0gY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZCgicGFydGlhbDIiKTsKLQkJZmluYWwgUGFyYW1ldGVyaXplZENvbW1hbmQgcGFydGlhbFBhcmFtZXRlcml6ZWRDb21tYW5kMiA9IG5ldyBQYXJhbWV0ZXJpemVkQ29tbWFuZCgKLQkJCQlwYXJ0aWFsQ29tbWFuZDIsIG51bGwpOwotCQlmaW5hbCBCaW5kaW5nIHBhcnRpYWxNYXRjaEJpbmRpbmcyID0gbmV3IEtleUJpbmRpbmcocGFydGlhbE1hdGNoMiwKLQkJCQlwYXJ0aWFsUGFyYW1ldGVyaXplZENvbW1hbmQyLCAibmEiLCAibmEiLCBudWxsLCBudWxsLCBudWxsLAotCQkJCUJpbmRpbmcuU1lTVEVNKTsKLQkJYmluZGluZ3NbMF0gPSBwYXJ0aWFsTWF0Y2hCaW5kaW5nMTsKLQkJYmluZGluZ3NbMV0gPSBwYXJ0aWFsTWF0Y2hCaW5kaW5nMjsKLQkJYmluZGluZ01hbmFnZXIuc2V0QmluZGluZ3MoYmluZGluZ3MpOwotCQlhc3NlcnRUcnVlKCJUd28gcGFydGlhbCBtYXRjaGVzIHNob3VsZCBjb3VudCBhcyBhIHBhcnRpYWwiLAotCQkJCWJpbmRpbmdNYW5hZ2VyLmlzUGFydGlhbE1hdGNoKHBlcmZlY3RNYXRjaCkpOwotCi0JCS8vIFNDRU5BUklPIDMKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhwZXJmZWN0TWF0Y2hCaW5kaW5nKTsKLQkJYmluZGluZ01hbmFnZXIuc2V0QmluZGluZ3MoYmluZGluZ3MpOwotCQlhc3NlcnRUcnVlKCJBbiBlbXB0eSBzZXF1ZW5jZSBtYXRjaGVzIGV2ZXJ5dGhpbmcgcGFydGlhbGx5IiwKLQkJCQliaW5kaW5nTWFuYWdlci5pc1BhcnRpYWxNYXRjaChLZXlTZXF1ZW5jZS5nZXRJbnN0YW5jZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gZXhwZWN0ZWQuIEluIHRoZQotCSAqIGZpcnN0IHNjZW5hcmlvLCB0aGVyZSBpcyBvbmUgcGVyZmVjdCBtYXRjaCBiaW5kaW5ncyBhbmQgYSBwYXJ0aWFsIG1hdGNoCi0JICogYmluZGluZy4gSW4gdGhlIHNlY29uZCBzY2VuYXJpbywgdGhlcmUgYXJlIHR3byBwYXJ0aWFsIG1hdGNoIGJpbmRpbmdzLiBJbgotCSAqIHRoZSB0aGlyZCBzY2VuYXJpbywgd2UgYXJlIGNoZWNraW5nIHRoYXQgbm90aGluZyBtYXRjaGVzIGFuIGVtcHR5Ci0JICogc2VxdWVuY2UuCi0JICogCi0JICogQHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHNjaGVtZSB3ZSB0cnkgdG8gYWN0aXZhdGUgaXMgbm90IGRlZmluZWQuCi0JICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBoYXJkLWNvZGVkIHN0cmluZ3MgYXJlbid0IGNvbnN0cnVjdGVkIHByb3Blcmx5LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RJc1BlcmZlY3RNYXRjaCgpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uLAotCQkJUGFyc2VFeGNlcHRpb24gewotCQkvLyBHRU5FUkFMIFNFVC1VUAotCQlmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0KCJuYSIpOwotCQljb250ZXh0LmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCQlmaW5hbCBTY2hlbWUgc2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKCJuYSIpOwotCQlzY2hlbWUuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLnNldEFjdGl2ZVNjaGVtZShzY2hlbWUpOwotCQlmaW5hbCBTZXQgYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJuYSIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCi0JCS8vIFNDRU5BUklPIDEKLQkJZmluYWwgS2V5U2VxdWVuY2UgcGVyZmVjdE1hdGNoID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2UoIkNUUkwrRiIpOwotCQlmaW5hbCBDb21tYW5kIHBlcmZlY3RDb21tYW5kID0gY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZCgicGVyZmVjdCIpOwotCQlmaW5hbCBQYXJhbWV0ZXJpemVkQ29tbWFuZCBwZXJmZWN0UGFyYW1ldGVyaXplZENvbW1hbmQgPSBuZXcgUGFyYW1ldGVyaXplZENvbW1hbmQoCi0JCQkJcGVyZmVjdENvbW1hbmQsIG51bGwpOwotCQlmaW5hbCBCaW5kaW5nIHBlcmZlY3RNYXRjaEJpbmRpbmcgPSBuZXcgS2V5QmluZGluZyhwZXJmZWN0TWF0Y2gsCi0JCQkJcGVyZmVjdFBhcmFtZXRlcml6ZWRDb21tYW5kLCAibmEiLCAibmEiLCBudWxsLCBudWxsLCBudWxsLAotCQkJCUJpbmRpbmcuU1lTVEVNKTsKLQkJZmluYWwgS2V5U2VxdWVuY2UgcGFydGlhbE1hdGNoMSA9IEtleVNlcXVlbmNlCi0JCQkJLmdldEluc3RhbmNlKCJDVFJMK0YgQ1RSTCtGIik7Ci0JCWZpbmFsIENvbW1hbmQgcGFydGlhbENvbW1hbmQxID0gY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZCgicGFydGlhbDEiKTsKLQkJZmluYWwgUGFyYW1ldGVyaXplZENvbW1hbmQgcGFydGlhbFBhcmFtZXRlcml6ZWRDb21tYW5kMSA9IG5ldyBQYXJhbWV0ZXJpemVkQ29tbWFuZCgKLQkJCQlwYXJ0aWFsQ29tbWFuZDEsIG51bGwpOwotCQlmaW5hbCBCaW5kaW5nIHBhcnRpYWxNYXRjaEJpbmRpbmcxID0gbmV3IEtleUJpbmRpbmcocGFydGlhbE1hdGNoMSwKLQkJCQlwYXJ0aWFsUGFyYW1ldGVyaXplZENvbW1hbmQxLCAibmEiLCAibmEiLCBudWxsLCBudWxsLCBudWxsLAotCQkJCUJpbmRpbmcuU1lTVEVNKTsKLQkJZmluYWwgQmluZGluZ1tdIGJpbmRpbmdzID0gbmV3IEJpbmRpbmdbMl07Ci0JCWJpbmRpbmdzWzBdID0gcGVyZmVjdE1hdGNoQmluZGluZzsKLQkJYmluZGluZ3NbMV0gPSBwYXJ0aWFsTWF0Y2hCaW5kaW5nMTsKLQkJYmluZGluZ01hbmFnZXIuc2V0QmluZGluZ3MoYmluZGluZ3MpOwotCQlhc3NlcnRUcnVlKCJUaGlzIHNob3VsZCBiZSBhIHBlcmZlY3QgbWF0Y2giLCBiaW5kaW5nTWFuYWdlcgotCQkJCS5pc1BlcmZlY3RNYXRjaChwZXJmZWN0TWF0Y2gpKTsKLQotCQkvLyBTQ0VOQVJJTyAyCi0JCWZpbmFsIEtleVNlcXVlbmNlIHBhcnRpYWxNYXRjaDIgPSBLZXlTZXF1ZW5jZQotCQkJCS5nZXRJbnN0YW5jZSgiQ1RSTCtGIENUUkwrRiBDVFJMK0YiKTsKLQkJZmluYWwgQ29tbWFuZCBwYXJ0aWFsQ29tbWFuZDIgPSBjb21tYW5kTWFuYWdlci5nZXRDb21tYW5kKCJwZXJmZWN0Iik7Ci0JCWZpbmFsIFBhcmFtZXRlcml6ZWRDb21tYW5kIHBhcnRpYWxQYXJhbWV0ZXJpemVkQ29tbWFuZDIgPSBuZXcgUGFyYW1ldGVyaXplZENvbW1hbmQoCi0JCQkJcGFydGlhbENvbW1hbmQyLCBudWxsKTsKLQkJZmluYWwgQmluZGluZyBwYXJ0aWFsTWF0Y2hCaW5kaW5nMiA9IG5ldyBLZXlCaW5kaW5nKHBhcnRpYWxNYXRjaDIsCi0JCQkJcGFydGlhbFBhcmFtZXRlcml6ZWRDb21tYW5kMiwgIm5hIiwgIm5hIiwgbnVsbCwgbnVsbCwgbnVsbCwKLQkJCQlCaW5kaW5nLlNZU1RFTSk7Ci0JCWJpbmRpbmdzWzBdID0gcGFydGlhbE1hdGNoQmluZGluZzE7Ci0JCWJpbmRpbmdzWzFdID0gcGFydGlhbE1hdGNoQmluZGluZzI7Ci0JCWJpbmRpbmdNYW5hZ2VyLnNldEJpbmRpbmdzKGJpbmRpbmdzKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhpcyBzaG91bGQgYmUgbm8gcGVyZmVjdCBtYXRjaGVzIiwgIWJpbmRpbmdNYW5hZ2VyCi0JCQkJLmlzUGVyZmVjdE1hdGNoKHBlcmZlY3RNYXRjaCkpOwotCi0JCS8vIFNDRU5BUklPIDMKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhwZXJmZWN0TWF0Y2hCaW5kaW5nKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhpcyBzaG91bGQgYmUgbm8gcGVyZmVjdCBtYXRjaGVzIiwgIWJpbmRpbmdNYW5hZ2VyCi0JCQkJLmlzUGVyZmVjdE1hdGNoKEtleVNlcXVlbmNlLmdldEluc3RhbmNlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0aGF0IHlvdSBjYW4gcmVtb3ZlIGJpbmRpbmcsIGFuZCB0aGF0IGl0IHdpbGwgY2hhbmdlIHRoZSBhY3RpdmUKLQkgKiBiaW5kaW5ncyBhcyB3ZWxsLgotCSAqIAotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzY2hlbWUgd2UgdHJ5IHRvIGFjdGl2YXRlIGlzIG5vdCBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSZW1vdmVCaW5kaW5ncygpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKLQkJLy8gR0VORVJBTCBTRVQtVVAKLQkJZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dCgibmEiKTsKLQkJY29udGV4dC5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQkJZmluYWwgU2NoZW1lIHNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZSgibmEiKTsKLQkJc2NoZW1lLmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoc2NoZW1lKTsKLQkJZmluYWwgU2V0IGFjdGl2ZUNvbnRleHRJZHMgPSBuZXcgSGFzaFNldCgpOwotCQlhY3RpdmVDb250ZXh0SWRzLmFkZCgibmEiKTsKLQkJY29udGV4dE1hbmFnZXIuc2V0QWN0aXZlQ29udGV4dElkcyhhY3RpdmVDb250ZXh0SWRzKTsKLQotCQkvLyBBREQgU09NRSBCSU5ESU5HUwotCQlmaW5hbCBCaW5kaW5nIGJpbmRpbmcxID0gbmV3IFRlc3RCaW5kaW5nKCJjb21tYW5kMSIsICJuYSIsICJuYSIsIG51bGwsCi0JCQkJbnVsbCwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmcxKTsKLQkJZmluYWwgQmluZGluZyBiaW5kaW5nMiA9IG5ldyBUZXN0QmluZGluZygiY29tbWFuZDIiLCAibmEiLCAibmEiLCAiemgiLAotCQkJCW51bGwsIEJpbmRpbmcuU1lTVEVNLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuYWRkQmluZGluZyhiaW5kaW5nMik7Ci0JCWZpbmFsIEJpbmRpbmcgYmluZGluZzMgPSBuZXcgVGVzdEJpbmRpbmcoImNvbW1hbmQzIiwgIm5hIiwgIm5hIiwgbnVsbCwKLQkJCQkiZ3RrIiwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmczKTsKLQkJZmluYWwgQmluZGluZyBiaW5kaW5nNCA9IG5ldyBUZXN0QmluZGluZygiY29tbWFuZDQiLCAibmEiLCAibmEiLCBudWxsLAotCQkJCSJndGsiLCBCaW5kaW5nLlVTRVIsIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmc0KTsKLQkJZmluYWwgQmluZGluZyBiaW5kaW5nNSA9IG5ldyBUZXN0QmluZGluZygiY29tbWFuZDUiLCAibmEiLCAibmEiLCAiemgiLAotCQkJCSJndGsiLCBCaW5kaW5nLlVTRVIsIG51bGwpOwotCQliaW5kaW5nTWFuYWdlci5hZGRCaW5kaW5nKGJpbmRpbmc1KTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlcmUgc2hvdWxkIGJlIHRocmVlIGFjdGl2ZSBiaW5kaW5ncyIsIGJpbmRpbmdNYW5hZ2VyCi0JCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKGJpbmRpbmcxLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlcmUgc2hvdWxkIGJlIHRocmVlIGFjdGl2ZSBiaW5kaW5ncyIsIGJpbmRpbmdNYW5hZ2VyCi0JCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKGJpbmRpbmcyLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlcmUgc2hvdWxkIGJlIHRocmVlIGFjdGl2ZSBiaW5kaW5ncyIsIGJpbmRpbmdNYW5hZ2VyCi0JCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKGJpbmRpbmc0LmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCkpKTsKLQotCQkvLyBSRU1PVkUgU09NRSBCSU5ESU5HUwotCQliaW5kaW5nTWFuYWdlci5yZW1vdmVCaW5kaW5ncyhUZXN0QmluZGluZy5UUklHR0VSX1NFUVVFTkNFLCAibmEiLCAibmEiLAotCQkJCSJ6aCIsICJndGsiLCBudWxsLCBCaW5kaW5nLlVTRVIpOwotCQlhc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZCBiZSBmb3VyIGJpbmRpbmdzIGxlZnQiLCA0LCBiaW5kaW5nTWFuYWdlcgotCQkJCS5nZXRCaW5kaW5ncygpLmxlbmd0aCk7Ci0JCWFzc2VydE5vdE51bGwoIlRoZXJlIHNob3VsZCBiZSBmb3VyIGFjdGl2ZSBiaW5kaW5ncyIsIGJpbmRpbmdNYW5hZ2VyCi0JCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKGJpbmRpbmcxLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlcmUgc2hvdWxkIGJlIGZvdXIgYWN0aXZlIGJpbmRpbmdzIiwgYmluZGluZ01hbmFnZXIKLQkJCQkuZ2V0QWN0aXZlQmluZGluZ3NGb3IoYmluZGluZzIuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKSkpOwotCQlhc3NlcnROb3ROdWxsKCJUaGVyZSBzaG91bGQgYmUgZm91ciBhY3RpdmUgYmluZGluZ3MiLCBiaW5kaW5nTWFuYWdlcgotCQkJCS5nZXRBY3RpdmVCaW5kaW5nc0ZvcihiaW5kaW5nMy5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpKSk7Ci0JCWFzc2VydE5vdE51bGwoIlRoZXJlIHNob3VsZCBiZSBmb3VyIGFjdGl2ZSBiaW5kaW5ncyIsIGJpbmRpbmdNYW5hZ2VyCi0JCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKGJpbmRpbmc0LmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IHNlbGVjdGluZyBhbiB1bmRlZmltbmVkIHNjaGVtZSBkb2Vzbid0IHdvcmsuIFZlcmlmaWVzIHRoYXQKLQkgKiBzZWxlY3RpbmcgYSBzY2hlbWUgd29ya3MuIFZlcmlmaWVzIHRoYXQgdW5kZWZpbmluZyBzY2hlbWUgcmVtb3ZlcyBpdCBhcwotCSAqIHRoZSBhY3RpdmUgc2NoZW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZXRBY3RpdmVTY2hlbWUoKSB7Ci0JCS8vIFNFTEVDVCBVTkRFRklORUQKLQkJZmluYWwgU3RyaW5nIHNjaGVtZUlkID0gInNjaGVtZUlkIjsKLQkJZmluYWwgU2NoZW1lIHNjaGVtZSA9IGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZShzY2hlbWVJZCk7Ci0JCXRyeSB7Ci0JCQliaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoc2NoZW1lKTsKLQkJCWZhaWwoIkNhbm5vdCBhY3RpdmF0ZSBhbiB1bmRlZmluZWQgc2NoZW1lIik7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJLy8gU3VjY2VzcwotCQl9Ci0KLQkJLy8gU0VMRUNUIERFRklORUQKLQkJc2NoZW1lLmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCQl0cnkgewotCQkJYmluZGluZ01hbmFnZXIuc2V0QWN0aXZlU2NoZW1lKHNjaGVtZSk7Ci0JCQlhc3NlcnRTYW1lKCJUaGUgc2NoZW1lcyBzaG91bGQgbWF0Y2giLCBzY2hlbWUsIGJpbmRpbmdNYW5hZ2VyCi0JCQkJCS5nZXRBY3RpdmVTY2hlbWUoKSk7Ci0JCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiU2hvdWxkIGJlIGFibGUgdG8gYWN0aXZhdGUgYSBzY2hlbWUiKTsKLQkJfQotCi0JCS8vIFVOREVGSU5FIFNFTEVDVEVECi0JCXNjaGVtZS51bmRlZmluZSgpOwotCQlhc3NlcnROdWxsKCJUaGUgc2NoZW1lIHNob3VsZCBoYXZlIGJlY29tZSB1bnNlbGVjdGVkIiwgYmluZGluZ01hbmFnZXIKLQkJCQkuZ2V0QWN0aXZlU2NoZW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgeW91IGNhbiBzZXQgdGhlIGJpbmRpbmdzIHRvIG51bGwuIFZlcmlmaWVzIHRoYXQgc2V0dGluZyB0aGUKLQkgKiBiaW5kaW5ncyBjbGVhcnMgdGhlIGNhY2hlLgotCSAqIAotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoaXMgdGVzdCBkb2Vzbid0IHByb3Blcmx5IGRlZmluZSBhIHNjaGVtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0QmluZGluZ3MoKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCS8vIEdFTkVSQUwgU0VULVVQCi0JCWZpbmFsIENvbnRleHQgY29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoIm5hIik7Ci0JCWNvbnRleHQuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0JCWZpbmFsIFNjaGVtZSBzY2hlbWUgPSBiaW5kaW5nTWFuYWdlci5nZXRTY2hlbWUoIm5hIik7Ci0JCXNjaGVtZS5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuc2V0QWN0aXZlU2NoZW1lKHNjaGVtZSk7Ci0JCWZpbmFsIFNldCBhY3RpdmVDb250ZXh0SWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJYWN0aXZlQ29udGV4dElkcy5hZGQoIm5hIik7Ci0JCWNvbnRleHRNYW5hZ2VyLnNldEFjdGl2ZUNvbnRleHRJZHMoYWN0aXZlQ29udGV4dElkcyk7Ci0KLQkJLy8gU0VUIE5VTEwKLQkJYmluZGluZ01hbmFnZXIuc2V0QmluZGluZ3MobnVsbCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBubyBhY3RpdmUgYmluZGluZ3MiLCBiaW5kaW5nTWFuYWdlcgotCQkJCS5nZXRBY3RpdmVCaW5kaW5nc0ZvcigoUGFyYW1ldGVyaXplZENvbW1hbmQpIG51bGwpLmxlbmd0aCA9PSAwKTsKLQotCQkvLyBBREQgQklORElORwotCQlmaW5hbCBTdHJpbmcgY29tbWFuZElkID0gImNvbW1hbmRJZCI7Ci0JCWZpbmFsIEJpbmRpbmcgYmluZGluZyA9IG5ldyBUZXN0QmluZGluZyhjb21tYW5kSWQsICJuYSIsICJuYSIsIG51bGwsCi0JCQkJbnVsbCwgQmluZGluZy5TWVNURU0sIG51bGwpOwotCQlmaW5hbCBCaW5kaW5nW10gYmluZGluZ3MgPSBuZXcgQmluZGluZ1sxXTsKLQkJYmluZGluZ3NbMF0gPSBiaW5kaW5nOwotCQliaW5kaW5nTWFuYWdlci5zZXRCaW5kaW5ncyhiaW5kaW5ncyk7Ci0JCWZpbmFsIFRyaWdnZXJTZXF1ZW5jZVtdIGFjdGl2ZUJpbmRpbmdzID0gYmluZGluZ01hbmFnZXIKLQkJCQkuZ2V0QWN0aXZlQmluZGluZ3NGb3IoYmluZGluZy5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgYmUgb25lIGFjdGl2ZSBiaW5kaW5nIiwgMSwKLQkJCQlhY3RpdmVCaW5kaW5ncy5sZW5ndGgpOwotCQlhc3NlcnRTYW1lKCJUaGUgYmluZGluZyBzaG91bGQgYmUgdGhlIG9uZSB3ZSBzZXQiLAotCQkJCVRlc3RCaW5kaW5nLlRSSUdHRVJfU0VRVUVOQ0UsIGFjdGl2ZUJpbmRpbmdzWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGl0IGNhbm5vdCBiZSBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uIFZlcmlmaWVzIHRoYXQgaXQKLQkgKiBjbGVhcnMgdGhlIGNhY2hlLgotCSAqIAotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoaXMgdGVzdCBkb2Vzbid0IHByb3Blcmx5IGRlZmluZSBhIHNjaGVtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0TG9jYWxlKCkgdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24gewotCQkvLyBHRU5FUkFMIFNFVC1VUAotCQlmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0KCJuYSIpOwotCQljb250ZXh0LmRlZmluZSgibmFtZSIsICJkZXNjcmlwdGlvbiIsIG51bGwpOwotCQlmaW5hbCBTY2hlbWUgc2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0U2NoZW1lKCJuYSIpOwotCQlzY2hlbWUuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLnNldEFjdGl2ZVNjaGVtZShzY2hlbWUpOwotCQlmaW5hbCBTZXQgYWN0aXZlQ29udGV4dElkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFjdGl2ZUNvbnRleHRJZHMuYWRkKCJuYSIpOwotCQljb250ZXh0TWFuYWdlci5zZXRBY3RpdmVDb250ZXh0SWRzKGFjdGl2ZUNvbnRleHRJZHMpOwotCi0JCS8vIFNFVCBUTyBOVUxMCi0JCXRyeSB7Ci0JCQliaW5kaW5nTWFuYWdlci5zZXRMb2NhbGUobnVsbCk7Ci0JCQlmYWlsKCJDYW5ub3Qgc2V0IHRoZSBsb2NhbGUgdG8gbnVsbCIpOwotCQl9IGNhdGNoIChmaW5hbCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTdWNjZXNzCi0JCX0KLQotCQkvLyBTRVQgVE8gU09NRVRISU5HCi0JCWZpbmFsIFN0cmluZyBjb21tYW5kSWQgPSAiY29tbWFuZElkIjsKLQkJZmluYWwgQmluZGluZyBiaW5kaW5nID0gbmV3IFRlc3RCaW5kaW5nKGNvbW1hbmRJZCwgIm5hIiwgIm5hIiwgInh4IiwKLQkJCQludWxsLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZyk7Ci0JCWFzc2VydFRydWUoIlRoZSBiaW5kaW5nIHNob3VsZG4ndCBiZSBhY3RpdmUiLAotCQkJCWJpbmRpbmdNYW5hZ2VyLmdldEFjdGl2ZUJpbmRpbmdzRm9yKGJpbmRpbmcKLQkJCQkJCS5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpKS5sZW5ndGggPT0gMCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLnNldExvY2FsZSgieHhfWFgiKTsKLQkJZmluYWwgVHJpZ2dlclNlcXVlbmNlW10gYWN0aXZlQmluZGluZ3MgPSBiaW5kaW5nTWFuYWdlcgotCQkJCS5nZXRBY3RpdmVCaW5kaW5nc0ZvcihiaW5kaW5nLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBiaW5kaW5nIHNob3VsZCBiZWNvbWUgYWN0aXZlIiwgMSwKLQkJCQlhY3RpdmVCaW5kaW5ncy5sZW5ndGgpOwotCQlhc3NlcnRTYW1lKCJUaGUgYmluZGluZyBzaG91bGQgYmUgdGhlIHNhbWUiLAotCQkJCVRlc3RCaW5kaW5nLlRSSUdHRVJfU0VRVUVOQ0UsIGFjdGl2ZUJpbmRpbmdzWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGl0IGNhbm5vdCBiZSBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uIFZlcmlmaWVzIHRoYXQgaXQKLQkgKiBjbGVhcnMgdGhlIGNhY2hlLgotCSAqIAotCSAqIEB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoaXMgdGVzdCBkb2Vzbid0IHByb3Blcmx5IGRlZmluZSBhIHNjaGVtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0UGxhdGZvcm0oKSB0aHJvd3MgTm90RGVmaW5lZEV4Y2VwdGlvbiB7Ci0JCS8vIEdFTkVSQUwgU0VULVVQCi0JCWZpbmFsIENvbnRleHQgY29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoIm5hIik7Ci0JCWNvbnRleHQuZGVmaW5lKCJuYW1lIiwgImRlc2NyaXB0aW9uIiwgbnVsbCk7Ci0JCWZpbmFsIFNjaGVtZSBzY2hlbWUgPSBiaW5kaW5nTWFuYWdlci5nZXRTY2hlbWUoIm5hIik7Ci0JCXNjaGVtZS5kZWZpbmUoIm5hbWUiLCAiZGVzY3JpcHRpb24iLCBudWxsKTsKLQkJYmluZGluZ01hbmFnZXIuc2V0QWN0aXZlU2NoZW1lKHNjaGVtZSk7Ci0JCWZpbmFsIFNldCBhY3RpdmVDb250ZXh0SWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJYWN0aXZlQ29udGV4dElkcy5hZGQoIm5hIik7Ci0JCWNvbnRleHRNYW5hZ2VyLnNldEFjdGl2ZUNvbnRleHRJZHMoYWN0aXZlQ29udGV4dElkcyk7Ci0KLQkJLy8gU0VUIFRPIE5VTEwKLQkJdHJ5IHsKLQkJCWJpbmRpbmdNYW5hZ2VyLnNldFBsYXRmb3JtKG51bGwpOwotCQkJZmFpbCgiQ2Fubm90IHNldCB0aGUgcGxhdGZvcm0gdG8gbnVsbCIpOwotCQl9IGNhdGNoIChmaW5hbCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTdWNjZXNzCi0JCX0KLQotCQkvLyBTRVQgVE8gU09NRVRISU5HCi0JCWZpbmFsIFN0cmluZyBjb21tYW5kSWQgPSAiY29tbWFuZElkIjsKLQkJZmluYWwgQmluZGluZyBiaW5kaW5nID0gbmV3IFRlc3RCaW5kaW5nKGNvbW1hbmRJZCwgIm5hIiwgIm5hIiwgbnVsbCwKLQkJCQkiYXRhcmkiLCBCaW5kaW5nLlNZU1RFTSwgbnVsbCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLmFkZEJpbmRpbmcoYmluZGluZyk7Ci0JCWFzc2VydFRydWUoIlRoZSBiaW5kaW5nIHNob3VsZG4ndCBiZSBhY3RpdmUiLAotCQkJCWJpbmRpbmdNYW5hZ2VyLmdldEFjdGl2ZUJpbmRpbmdzRm9yKGJpbmRpbmcKLQkJCQkJCS5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpKS5sZW5ndGggPT0gMCk7Ci0JCWJpbmRpbmdNYW5hZ2VyLnNldFBsYXRmb3JtKCJhdGFyaSIpOwotCQlmaW5hbCBUcmlnZ2VyU2VxdWVuY2VbXSBhY3RpdmVCaW5kaW5ncyA9IGJpbmRpbmdNYW5hZ2VyCi0JCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKGJpbmRpbmcuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIGJpbmRpbmcgc2hvdWxkIGJlY29tZSBhY3RpdmUiLCAxLAotCQkJCWFjdGl2ZUJpbmRpbmdzLmxlbmd0aCk7Ci0JCWFzc2VydFNhbWUoIlRoZSBiaW5kaW5nIHNob3VsZCBiZSB0aGUgc2FtZSIsCi0JCQkJVGVzdEJpbmRpbmcuVFJJR0dFUl9TRVFVRU5DRSwgYWN0aXZlQmluZGluZ3NbMF0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CaW5kaW5nUGVyc2lzdGVuY2VUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQmluZGluZ1BlcnNpc3RlbmNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDcyYzAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CaW5kaW5nUGVyc2lzdGVuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmtleXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JQ29tbWFuZFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmtleXMuSUJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3QgY2FzZXMgY292ZXJpbmcgdGhlIHZhcmlvdXMgaW50ZXJhY3Rpb24gYmV0d2VlbiBiaW5kaW5ncy4gQmluZGluZ3MgdGhhdAotICogaGF2ZSBiZWVuIHJlbW92ZWQuIEJpbmRpbmdzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkLiBJbmhlcml0YW5jZSBvZiB2YXJpb3VzCi0gKiBwcm9wZXJ0aWVzLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5kaW5nUGVyc2lzdGVuY2VUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgPGNvZGU+QmluZGluZ1BlcnNpc3RlbmNlVGVzdDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIEJpbmRpbmdQZXJzaXN0ZW5jZVRlc3QoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGVzdHMgd2hldGhlciB0aGUgcHJlZmVyZW5jZSBzdG9yZSB3aWxsIGJlIHJlYWQgYXV0b21hdGljYWxseSB3aGVuIGEKLSAgICAgKiBjaGFuZ2UgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUgaXMgbWFkZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmICJBTFQrU0hJRlQrUSBBIiBjYW5ub3QgYmUgcGFyc2VkIGJ5IEtleVNlcXVlbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RBdXRvTG9hZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgc2VydmljZXMuCi0gICAgICAgIElDb21tYW5kU2VydmljZSBjb21tYW5kU2VydmljZSA9IChJQ29tbWFuZFNlcnZpY2UpIGZXb3JrYmVuY2gKLSAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJQ29tbWFuZFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBJQmluZGluZ1NlcnZpY2UgYmluZGluZ1NlcnZpY2UgPSAoSUJpbmRpbmdTZXJ2aWNlKSBmV29ya2JlbmNoCi0gICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSUJpbmRpbmdTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgYmluZGluZ1NlcnZpY2UucmVhZFJlZ2lzdHJ5QW5kUHJlZmVyZW5jZXMoY29tbWFuZFNlcnZpY2UpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSBwcmUtY29uZGl0aW9ucy4KLSAgICAgICAgZmluYWwgU3RyaW5nIGVtYWNzU2NoZW1lSWQgPSAib3JnLmVjbGlwc2UudWkuZW1hY3NBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iOwotICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGFjdGl2ZSBzY2hlbWUgc2hvdWxkIGJlIEVtYWNzIHlldCIsIGVtYWNzU2NoZW1lSWQKLSAgICAgICAgICAgICAgICAuZXF1YWxzKGJpbmRpbmdTZXJ2aWNlLmdldEFjdGl2ZVNjaGVtZSgpLmdldElkKCkpKTsKLSAgICAgICAgZmluYWwgS2V5U2VxdWVuY2UgZm9ybWFsS2V5U2VxdWVuY2UgPSBLZXlTZXF1ZW5jZQotICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZSgiQUxUK1NISUZUK1EgQSIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZElkID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLnNob3dWaWV3IjsKLSAgICAgICAgQmluZGluZ1tdIGJpbmRpbmdzID0gYmluZGluZ1NlcnZpY2UuZ2V0QmluZGluZ3MoKTsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgQmluZGluZyBiaW5kaW5nID0gYmluZGluZ3NbaV07Ci0gICAgICAgICAgICBpZiAoKGJpbmRpbmcuZ2V0VHlwZSgpID09IEJpbmRpbmcuVVNFUikKLSAgICAgICAgICAgICAgICAgICAgJiYgKGZvcm1hbEtleVNlcXVlbmNlLmVxdWFscyhiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpKSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kID0gYmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbENvbW1hbmRJZCA9IChjb21tYW5kID09IG51bGwpID8gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgOiBjb21tYW5kLmdldENvbW1hbmQoKS5nZXRJZCgpOwotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY29tbWFuZCBzaG91bGQgbm90IHlldCBiZSBib3VuZCIsIGNvbW1hbmRJZAotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhhY3R1YWxDb21tYW5kSWQpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZG4ndCBiZSBhIG1hdGNoaW5nIGNvbW1hbmQgeWV0IiwKLSAgICAgICAgICAgICAgICBiaW5kaW5ncy5sZW5ndGgsIGkpOwotCi0gICAgICAgIC8vIE1vZGlmeSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICAgICAgZmluYWwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIHN0b3JlCi0gICAgICAgICAgICAgICAgLnNldFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz48b3JnLmVjbGlwc2UudWkuY29tbWFuZHM+PGFjdGl2ZUtleUNvbmZpZ3VyYXRpb24ga2V5Q29uZmlndXJhdGlvbklkPVwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVtYWNzU2NoZW1lSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIvPjxrZXlCaW5kaW5nIGNvbW1hbmRJZD1cIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb21tYW5kSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgY29udGV4dElkPVwib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93XCIga2V5Q29uZmlndXJhdGlvbklkPVwib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvblwiIGtleVNlcXVlbmNlPVwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZvcm1hbEtleVNlcXVlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiLz48L29yZy5lY2xpcHNlLnVpLmNvbW1hbmRzPiIpOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdmFsdWVzIGhhdmUgY2hhbmdlZC4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgYWN0aXZlIHNjaGVtZSBzaG91bGQgbm93IGJlIEVtYWNzIiwgZW1hY3NTY2hlbWVJZCwKLSAgICAgICAgICAgICAgICBiaW5kaW5nU2VydmljZS5nZXRBY3RpdmVTY2hlbWUoKS5nZXRJZCgpKTsKLSAgICAgICAgYmluZGluZ3MgPSBiaW5kaW5nU2VydmljZS5nZXRCaW5kaW5ncygpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIEJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdzW2ldOwotICAgICAgICAgICAgaWYgKChiaW5kaW5nLmdldFR5cGUoKSA9PSBCaW5kaW5nLlVTRVIpCi0gICAgICAgICAgICAgICAgICAgICYmIChmb3JtYWxLZXlTZXF1ZW5jZS5lcXVhbHMoYmluZGluZy5nZXRUcmlnZ2VyU2VxdWVuY2UoKSkpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyaXplZENvbW1hbmQgY29tbWFuZCA9IGJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWxDb21tYW5kSWQgPSAoY29tbWFuZCA9PSBudWxsKSA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgIDogY29tbWFuZC5nZXRDb21tYW5kKCkuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBjb21tYW5kIHNob3VsZCBiZSBib3VuZCB0byAnQUxUK1NISUZUK1EgQSciLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZElkLCBhY3R1YWxDb21tYW5kSWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEZhbHNlKCJUaGVyZSBzaG91bGQgYmUgYSBtYXRjaGluZyBjb21tYW5kIG5vdyIsCi0gICAgICAgICAgICAgICAgKGJpbmRpbmdzLmxlbmd0aCA9PSBpKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzM2NDIwVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzM2NDIwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmZjMzBmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWczNjQyMFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5rZXlzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5WZXJzaW9uSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSUNvbW1hbmRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5LZXlTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyBCdWcgMzY0MjAKLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQnVnMzY0MjBUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQnVnMzY0MjBUZXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBCdWczNjQyMFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBpbXBvcnRpbmcga2V5IHByZWZlcmVuY2VzIGFjdHVhbGx5IGhhcyBhbiBlZmZlY3QuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHByZWZlcmVuY2VzIGNhbid0IGJlIGltcG9ydGVkLgotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHRlbXBvcmFyeSBmaWxlIGlzIHJlbW92ZWQgYWZ0ZXIgaXQgaXMgY3JlYXRlZCwgYnV0Ci0gICAgICogICAgICAgICAgICAgYmVmb3JlIGl0IGlzIG9wZW5lZC4gKFdvdykKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgc29tZXRoaW5nIGZhaWxzIGR1cmluZyBvdXRwdXQgb2YgdGhlIHByZWZlcmVuY2VzIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEltcG9ydEtleVByZWZlcmVuY2VzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0gICAgICAgICAgICBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNvbW1hbmRJZCA9ICJvcmcuZWNsaXBzZS51aS53aW5kb3cubmV4dFZpZXciOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBrZXlTZXF1ZW5jZVRleHQgPSAiRiBTIEMgSyI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvKgotICAgICAgICAgKiBETyBOT1QgVVNFIFByZWZlcmVuY2VNdXRhdG9yIGZvciB0aGlzIHNlY3Rpb24uIFRoaXMgdGVzdCBjYXNlIG11c3QKLSAgICAgICAgICogdXNlIHRoZXNlIGV4YWN0IHN0ZXBzLCB3aGlsZSBQcmVmZXJlbmNlTXV0YXRvciBtaWdodCB1c2Ugc29tZXRoaW5nCi0gICAgICAgICAqIGVsc2UgaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgICovCi0gICAgICAgIC8vIFNldCB1cCB0aGUgcHJlZmVyZW5jZXMuCi0gICAgICAgIFByb3BlcnRpZXMgcHJlZmVyZW5jZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBTdHJpbmcga2V5ID0gIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC9vcmcuZWNsaXBzZS51aS5jb21tYW5kcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzPjxhY3RpdmVLZXlDb25maWd1cmF0aW9uIGtleUNvbmZpZ3VyYXRpb25JZD1cIiIgKyBJV29ya2JlbmNoQ29uc3RhbnRzLkRFRkFVTFRfQUNDRUxFUkFUT1JfQ09ORklHVVJBVElPTl9JRCArICJcIj48L2FjdGl2ZUtleUNvbmZpZ3VyYXRpb24+PGtleUJpbmRpbmcJa2V5Q29uZmlndXJhdGlvbklkPVwib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvblwiIGNvbW1hbmRJZD1cIiIgKyBjb21tYW5kSWQgKyAiXCIga2V5U2VxdWVuY2U9XCIiICsga2V5U2VxdWVuY2VUZXh0ICsgIlwiLz48L29yZy5lY2xpcHNlLnVpLmNvbW1hbmRzPiI7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotICAgICAgICBwcmVmZXJlbmNlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBwYXNzIHdheSB0byAid2FsayIgdGhyb3VnaCB0aGUgbGlzdAotICAgICAgICAvLyBvZiBidW5kbGVzCi0gICAgICAgIFN0cmluZ1tdIHBsdWdpbklkcyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0TmFtZXNwYWNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbklkcy5sZW5ndGg7IGkrKykgewotCQkJcHJlZmVyZW5jZXMucHV0KHBsdWdpbklkc1tpXSwgbmV3IFBsdWdpblZlcnNpb25JZGVudGlmaWVyKAotCQkJCQkoU3RyaW5nKSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWRzW2ldKS5nZXRIZWFkZXJzKCkuZ2V0KAotCQkJCQkJCW9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHMuQlVORExFX1ZFUlNJT04pKSk7Ci0JCX0KLQotICAgICAgICAvLyBFeHBvcnQgdGhlIHByZWZlcmVuY2VzLgotICAgICAgICBGaWxlIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJwcmVmZXJlbmNlcyIsICIudHh0Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0gICAgICAgIGZpbGUuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSk7Ci0gICAgICAgIHByZWZlcmVuY2VzLnN0b3JlKGJvcywgbnVsbCk7Ci0gICAgICAgIGJvcy5jbG9zZSgpOwotCi0gICAgICAgIC8vIEF0dGVtcHQgdG8gaW1wb3J0IHRoZSBrZXkgYmluZGluZy4KLSAgICAgICAgUHJlZmVyZW5jZXMuaW1wb3J0UHJlZmVyZW5jZXMobmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotICAgICAgICAvKgotICAgICAgICAgKiBFTkQgU0VDVElPTgotICAgICAgICAgKi8KLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgdGhhdCB0aGUga2V5IGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBjb21tYW5kIG1hdGNoZXMuCi0gICAgICAgIElDb21tYW5kTWFuYWdlciBtYW5hZ2VyID0gZldvcmtiZW5jaC5nZXRDb21tYW5kU3VwcG9ydCgpCi0gICAgICAgICAgICAgICAgLmdldENvbW1hbmRNYW5hZ2VyKCk7Ci0gICAgICAgIExpc3Qga2V5QmluZGluZ3MgPSBtYW5hZ2VyLmdldENvbW1hbmQoY29tbWFuZElkKQotICAgICAgICAgICAgICAgIC5nZXRLZXlTZXF1ZW5jZUJpbmRpbmdzKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGtleUJpbmRpbmdJdHIgPSBrZXlCaW5kaW5ncy5pdGVyYXRvcigpOwotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChrZXlCaW5kaW5nSXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgS2V5U2VxdWVuY2Uga2V5QmluZGluZyA9IChLZXlTZXF1ZW5jZSkga2V5QmluZGluZ0l0ci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgY3VycmVudFRleHQgPSBrZXlCaW5kaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoa2V5U2VxdWVuY2VUZXh0LmVxdWFscyhjdXJyZW50VGV4dCkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCJLZXkgYmluZGluZyBub3QgaW1wb3J0ZWQuIiwgZm91bmQpOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzM2NTM3VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzM2NTM3VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDBlOTQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWczNjUzN1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5rZXlzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuUGFyYW1ldGVyaXplZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmtleXMuSUJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIEJ1ZyAzNjUzNwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWczNjUzN1Rlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCdWczNjUzN1Rlc3QuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0JICovCi0JcHVibGljIEJ1ZzM2NTM3VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0aGF0IHRoZXJlIGFyZSBubyByZWR1bmRhbnQga2V5IGJpbmRpbmdzIGRlZmluZWQgaW4gdGhlCi0JICogYXBwbGljYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZvclJlZHVuZGFudEtleVNlcXVlbmNlQmluZGluZ3MoKSB7Ci0JCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSB3aW5kb3cuZ2V0V29ya2JlbmNoKCk7Ci0JCWZpbmFsIElCaW5kaW5nU2VydmljZSBiaW5kaW5nU2VydmljZSA9IChJQmluZGluZ1NlcnZpY2UpIHdvcmtiZW5jaAotCQkJCS5nZXRBZGFwdGVyKElCaW5kaW5nU2VydmljZS5jbGFzcyk7Ci0JCWZpbmFsIEJpbmRpbmdbXSBiaW5kaW5ncyA9IGJpbmRpbmdTZXJ2aWNlLmdldEJpbmRpbmdzKCk7Ci0JCWZpbmFsIGludCBiaW5kaW5nQ291bnQgPSBiaW5kaW5ncy5sZW5ndGg7Ci0JCU1hcCBrZXlTZXF1ZW5jZUJpbmRpbmdzQnlLZXlTZXF1ZW5jZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5nQ291bnQ7IGkrKykgewotCQkJLy8gUmV0cmlldmUgdGhlIGtleSBiaW5kaW5nLgotCQkJZmluYWwgQmluZGluZyBiaW5kaW5nID0gYmluZGluZ3NbaV07Ci0KLQkJCS8vIEZpbmQgdGhlIHBvaW50IHRoZSBiaW5kaW5ncyB3aXRoIG1hdGNoaW5nIGtleSBzZXF1ZW5jZXMuCi0JCQlUcmlnZ2VyU2VxdWVuY2UgdHJpZ2dlclNlcXVlbmNlID0gYmluZGluZy5nZXRUcmlnZ2VyU2VxdWVuY2UoKTsKLQkJCUxpc3QgbWF0Y2hlcyA9IChMaXN0KSBrZXlTZXF1ZW5jZUJpbmRpbmdzQnlLZXlTZXF1ZW5jZQotCQkJCQkuZ2V0KHRyaWdnZXJTZXF1ZW5jZSk7Ci0JCQlpZiAobWF0Y2hlcyA9PSBudWxsKSB7Ci0JCQkJbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlrZXlTZXF1ZW5jZUJpbmRpbmdzQnlLZXlTZXF1ZW5jZS5wdXQodHJpZ2dlclNlcXVlbmNlLCBtYXRjaGVzKTsKLQkJCX0KLQotCQkJLy8gQ2hlY2sgdGhhdCB3ZSBkb24ndCBoYXZlIGFueSByZWR1bmRhbmN5IG9yIG90aGVyIHdhY2tpbmVzcy4KLQkJCUl0ZXJhdG9yIG1hdGNoSXRyID0gbWF0Y2hlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKG1hdGNoSXRyLmhhc05leHQoKSkgewotCQkJCWZpbmFsIEJpbmRpbmcgbWF0Y2hlZEJpbmRpbmcgPSAoQmluZGluZykgbWF0Y2hJdHIubmV4dCgpOwotCQkJCVBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmRBID0gYmluZGluZwotCQkJCQkJLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCk7Ci0JCQkJUGFyYW1ldGVyaXplZENvbW1hbmQgY29tbWFuZEIgPSBtYXRjaGVkQmluZGluZwotCQkJCQkJLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCk7Ci0JCQkJU3RyaW5nIGNvbnRleHRBID0gYmluZGluZy5nZXRDb250ZXh0SWQoKTsKLQkJCQlTdHJpbmcgY29udGV4dEIgPSBtYXRjaGVkQmluZGluZy5nZXRDb250ZXh0SWQoKTsKLQkJCQlTdHJpbmcga2V5Q29uZkEgPSBiaW5kaW5nLmdldFNjaGVtZUlkKCk7Ci0JCQkJU3RyaW5nIGtleUNvbmZCID0gbWF0Y2hlZEJpbmRpbmcuZ2V0U2NoZW1lSWQoKTsKLQkJCQlTdHJpbmcgbG9jYWxlQSA9IGJpbmRpbmcuZ2V0TG9jYWxlKCk7Ci0JCQkJU3RyaW5nIGxvY2FsZUIgPSBtYXRjaGVkQmluZGluZy5nZXRMb2NhbGUoKTsKLQkJCQlTdHJpbmcgcGxhdGZvcm1BID0gYmluZGluZy5nZXRQbGF0Zm9ybSgpOwotCQkJCVN0cmluZyBwbGF0Zm9ybUIgPSBtYXRjaGVkQmluZGluZy5nZXRQbGF0Zm9ybSgpOwotCi0JCQkJYm9vbGVhbiBzYW1lID0gdHJ1ZTsKLQkJCQlpbnQgbnVsbE1hdGNoZXMgPSAwOwotCQkJCXNhbWUgJj0gKGNvbW1hbmRBID09IG51bGwpID8gKGNvbW1hbmRCID09IG51bGwpIDogKGNvbW1hbmRBCi0JCQkJCQkuZXF1YWxzKGNvbW1hbmRCKSk7Ci0JCQkJc2FtZSAmPSAoY29udGV4dEEgPT0gbnVsbCkgfHwgKGNvbnRleHRCID09IG51bGwpCi0JCQkJCQl8fCAoY29udGV4dEEuZXF1YWxzKGNvbnRleHRCKSk7Ci0JCQkJaWYgKCgoY29udGV4dEEgPT0gbnVsbCkgfHwgKGNvbnRleHRCID09IG51bGwpKQotCQkJCQkJJiYgKGNvbnRleHRBICE9IGNvbnRleHRCKSkgewotCQkJCQludWxsTWF0Y2hlcysrOwotCQkJCX0KLQkJCQlzYW1lICY9IChrZXlDb25mQSA9PSBudWxsKSB8fCAoa2V5Q29uZkIgPT0gbnVsbCkKLQkJCQkJCXx8IChrZXlDb25mQS5lcXVhbHMoa2V5Q29uZkIpKTsKLQkJCQlpZiAoKChrZXlDb25mQSA9PSBudWxsKSB8fCAoa2V5Q29uZkIgPT0gbnVsbCkpCi0JCQkJCQkmJiAoa2V5Q29uZkEgIT0ga2V5Q29uZkIpKSB7Ci0JCQkJCW51bGxNYXRjaGVzKys7Ci0JCQkJfQotCQkJCXNhbWUgJj0gKGxvY2FsZUEgPT0gbnVsbCkgfHwgKGxvY2FsZUIgPT0gbnVsbCkKLQkJCQkJCXx8IChsb2NhbGVBLmVxdWFscyhsb2NhbGVCKSk7Ci0JCQkJaWYgKCgobG9jYWxlQSA9PSBudWxsKSB8fCAobG9jYWxlQiA9PSBudWxsKSkKLQkJCQkJCSYmIChsb2NhbGVBICE9IGxvY2FsZUIpKSB7Ci0JCQkJCW51bGxNYXRjaGVzKys7Ci0JCQkJfQotCQkJCXNhbWUgJj0gKHBsYXRmb3JtQSA9PSBudWxsKSB8fCAocGxhdGZvcm1CID09IG51bGwpCi0JCQkJCQl8fCAocGxhdGZvcm1BLmVxdWFscyhwbGF0Zm9ybUIpKTsKLQkJCQlpZiAoKChwbGF0Zm9ybUEgPT0gbnVsbCkgfHwgKHBsYXRmb3JtQiA9PSBudWxsKSkKLQkJCQkJCSYmIChwbGF0Zm9ybUEgIT0gcGxhdGZvcm1CKSkgewotCQkJCQludWxsTWF0Y2hlcysrOwotCQkJCX0KLQotCQkJCWFzc2VydEZhbHNlKAotCQkJCQkJIlJlZHVuZGFudCBrZXkgYmluZGluZ3M6ICIgKyBiaW5kaW5nICsgIiwgIiArIG1hdGNoZWRCaW5kaW5nLCBzYW1lICYmIChudWxsTWF0Y2hlcyA8IDEpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCS8vIEFkZCB0aGUga2V5IGJpbmRpbmcuCi0JCQltYXRjaGVzLmFkZChiaW5kaW5nKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWc0MDAyM1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWc0MDAyM1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2YjEyNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDAwMjNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMua2V5czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTdHJva2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5rZXlzLkJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmtleXMuSUJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIEJ1ZyA0MDAyMwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWc0MDAyM1Rlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhIG1lbnUgaXRlbSBtYXRjaGluZyBvciBzdGFydGluZyB3aXRoIHRoZSBnaXZlbiBuYW1lIGZyb20gYW4KLSAgICAgKiBhcnJheSBvZiBtZW51IGl0ZW1zLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZW51SXRlbXMKLSAgICAgKiAgICAgICAgICAgIFRoZSBhcnJheSBvZiBtZW51IGl0ZW1zIHRvIHNlYXJjaDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAcGFyYW0gdGV4dAotICAgICAqICAgICAgICAgICAgVGhlIHRleHQgdG8gbG9vayBmb3I7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIFRoZSBtZW51IGl0ZW0sIGlmIGFueSBpcyBmb3VuZDsgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVudUl0ZW0gZ2V0TWVudUl0ZW0oTWVudUl0ZW1bXSBtZW51SXRlbXMsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVudUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobWVudUl0ZW1zW2ldLmdldFRleHQoKS5zdGFydHNXaXRoKHRleHQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1lbnVJdGVtc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBCdWc0MDAyM1Rlc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIEJ1ZzQwMDIzVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGNoZWNrIGJveCBpdGVtcyBvbiB0aGUgbWVudSBhcmUgY2hlY2tlZCB3aGVuIGFjdGl2YXRlZCBmcm9tCi0gICAgICogdGhlIGtleWJvYXJkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGV4ZWN1dGlvbiBvZiB0aGUgaGFuZGxlciBmYWlscy4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZXhwb3J0ZWQgcHJlZmVyZW5jZXMgZmlsZSBpcyBpbnZhbGlkIGZvciBzb21lIHJlYXNvbi4KLSAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSB0ZW1wb3JhcnkgZmlsZSBpcyByZW1vdmVkIGJlZm9yZSBpdCBjYW4gYmUgcmVhZCBpbi4KLSAgICAgKiAgICAgICAgICAgICAoV293KQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY3JlYXRpb24gb2Ygb3IgdGhlIHdyaXRpbmcgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICogICAgICAgICAgICAgZmFpbHMgZm9yIHNvbWUgcmVhc29uLgotICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUga2V5IGJpbmRpbmcgY2Fubm90IGJlIHBhcnNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tPbkNoZWNrYm94KCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIENvbW1hbmRFeGNlcHRpb24sCi0gICAgICAgICAgICBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE9wZW4gYSB3aW5kb3cgdG8gcnVuIHRoZSB0ZXN0LgotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0gICAgICAgIFdvcmtiZW5jaCB3b3JrYmVuY2ggPSAoV29ya2JlbmNoKSB3aW5kb3cuZ2V0V29ya2JlbmNoKCk7Ci0KLSAgICAgICAgLy8gU2V0IHVwIGEga2V5IGJpbmRpbmcgZm9yICJMb2NrIFRvb2xiYXJzIi4KLSAgICAgICAgU3RyaW5nIGNvbW1hbmRJZCA9ICJvcmcuZWNsaXBzZS51aS53aW5kb3cubG9ja1Rvb2xCYXIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBrZXlTZXF1ZW5jZVRleHQgPSAiQ1RSTCtBTFQrTCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgUHJlZmVyZW5jZU11dGF0b3Iuc2V0S2V5QmluZGluZyhjb21tYW5kSWQsIGtleVNlcXVlbmNlVGV4dCk7Ci0KLSAgICAgICAgLy8gUHJlc3MgIkNUUkwrQUxUK0wiIHRvIGxvY2sgdGhlIHRvb2xiYXJzLgotICAgICAgICBMaXN0IGtleVN0cm9rZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGtleVN0cm9rZXMuYWRkKEtleVN0cm9rZS5nZXRJbnN0YW5jZShrZXlTZXF1ZW5jZVRleHQpKTsKLSAgICAgICAgRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJQmluZGluZ1NlcnZpY2Ugc3VwcG9ydCA9IChCaW5kaW5nU2VydmljZSkgd29ya2JlbmNoCi0JCQkJLmdldEFkYXB0ZXIoSUJpbmRpbmdTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgc3VwcG9ydC5nZXRLZXlib2FyZCgpLnByZXNzKGtleVN0cm9rZXMsIGV2ZW50KTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSAiTG9jayBUb29sYmFycyIgbWVudSBpdGVtIGlzIG5vdyBjaGVja2VkLgotICAgICAgICBTaGVsbCBzaGVsbCA9IHdpbmRvdy5nZXRTaGVsbCgpOwotICAgICAgICBNZW51SXRlbSB3aW5kb3dNZW51ID0gZ2V0TWVudUl0ZW0oc2hlbGwuZ2V0TWVudUJhcigpLmdldEl0ZW1zKCksCi0gICAgICAgICAgICAgICAgIiZXaW5kb3ciKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBNZW51SXRlbSBsb2NrVG9vbEJhcnNNZW51SXRlbSA9IGdldE1lbnVJdGVtKHdpbmRvd01lbnUuZ2V0TWVudSgpCi0gICAgICAgICAgICAgICAgLmdldEl0ZW1zKCksICJMb2NrIHRoZSAmVG9vbGJhcnMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKCJDaGVja2JveCBtZW51IGl0ZW0gaXMgbm90IGNoZWNrZWQuIiwgbG9ja1Rvb2xCYXJzTWVudUl0ZW0gLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzQyMDI0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzQyMDI0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTUzOGQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWc0MjAyNFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5rZXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVNlcXVlbmNlVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIEJ1ZyA0MjAyNAotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWc0MjAyNFRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIC8qKiBUaGUgc2hlbGwgb24gd2hpY2ggdGhlIDxjb2RlPktleVNlcXVlbmNlVGV4dDwvY29kZT4gaXMgcGxhY2VkLiAqLwotICAgIHByaXZhdGUgU2hlbGwgc2hlbGwgPSBudWxsOwotCi0gICAgLyoqIFRoZSBpbnN0YW5jZSBvZiA8Y29kZT5LZXlTZXF1ZW5jZVRleHQ8L2NvZGU+IHdlIHNob3VsZCB0aW5rZXIgd2l0aC4gKi8KLSAgICBwcml2YXRlIEtleVNlcXVlbmNlVGV4dCB0ZXh0ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBCdWc0MjAyNFRlc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIEJ1ZzQyMDI0VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIHdpbmRvdyB3aXRoIGEgS2V5U2VxdWVuY2VUZXh0Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgICAgICBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLSAgICAgICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0gICAgICAgIHRleHQgPSBuZXcgS2V5U2VxdWVuY2VUZXh0KG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKSk7Ci0KLSAgICAgICAgLy8gT3BlbiBpdAotICAgICAgICBzaGVsbC5wYWNrKCk7Ci0gICAgICAgIHNoZWxsLm9wZW4oKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvVGVhckRvd24oKTsKLQotICAgICAgICAvLyBDbG9zZSBhbmQgZGVzdHJveSB0aGUgd2luZG93Ci0gICAgICAgIHNoZWxsLmNsb3NlKCk7Ci0gICAgICAgIHNoZWxsLmRpc3Bvc2UoKTsKLQotICAgICAgICAvLyBSZWxlYXNlIHRoZSBtZW1vcnkuCi0gICAgICAgIHNoZWxsID0gbnVsbDsKLSAgICAgICAgdGV4dCA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgbGltaXRpbmcgZmFjaWxpdHkgb24gS2V5U2VxdWVuY2VUZXh0IGFsbG93cyBhbiBhcmJpdHJhcnkKLSAgICAgKiBudW1iZXIgb2Yga2V5IHN0cm9rZXMsIHdoZW4gdGhlIHRoZSBsaW1pdCBpcyBzZXQgdG8gImluZmluaXRlIi4gSW4gdGhpcwotICAgICAqIGNhc2UsIHdlIHdpbGwgdXNlIGEgc2l4IHN0cm9rZSBzZXF1ZW5jZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHRlc3Qgc2VxdWVuY2UgY2Fubm90IGJlIHBhcnNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5maW5pdGVTdHJva2VzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGtleVNlcXVlbmNlVGV4dCA9ICJBIEIgQyBEIEUgRiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgS2V5U2VxdWVuY2Uga2V5U2VxdWVuY2UgPSBLZXlTZXF1ZW5jZS5nZXRJbnN0YW5jZShrZXlTZXF1ZW5jZVRleHQpOwotICAgICAgICB0ZXh0LnNldEtleVN0cm9rZUxpbWl0KEtleVNlcXVlbmNlVGV4dC5JTkZJTklURSk7Ci0gICAgICAgIHRleHQuc2V0S2V5U2VxdWVuY2Uoa2V5U2VxdWVuY2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIkluZmluaXRlIGxpbWl0IGJ1dCBzZXF1ZW5jZSBjaGFuZ2VkLiIsIGtleVNlcXVlbmNlLCB0ZXh0LmdldEtleVNlcXVlbmNlKCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBpbnNlcnRpbmcgYSBrZXkgc2VxdWVuY2Ugb2YgbWF0Y2hpbmcgbGVuZ3RoIGNhdXNlcyBubyBjaGFuZ2UsCi0gICAgICogYnV0IGluc2VydGVkIGEga2V5IHNlcXVlbmNlIG9mIG9uZSBncmVhdGVyIGRvZXMgY2F1c2UgYSBjaGFuZ2UgLS0KLSAgICAgKiBzcGVjaWZpY2FsbHkgdHJ1bmNhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHRlc3Qgc2VxdWVuY2VzIGNhbm5vdCBiZSBwYXJzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gNDsKLSAgICAgICAgdGV4dC5zZXRLZXlTdHJva2VMaW1pdChsZW5ndGgpOwotCi0gICAgICAgIC8vIFRlc3QgbWF0Y2hpbmcgbGVuZ3RoLgotICAgICAgICBTdHJpbmcgbWF0Y2hpbmdLZXlTZXF1ZW5jZVRleHQgPSAiMSAyIDMgNCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgS2V5U2VxdWVuY2UgbWF0Y2hpbmdLZXlTZXF1ZW5jZSA9IEtleVNlcXVlbmNlCi0gICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKG1hdGNoaW5nS2V5U2VxdWVuY2VUZXh0KTsKLSAgICAgICAgdGV4dC5zZXRLZXlTZXF1ZW5jZShtYXRjaGluZ0tleVNlcXVlbmNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJMaW1pdCBvZiBmb3VyIGNoYW5nZSBmb3VyIHN0cm9rZSBzZXF1ZW5jZS4iLCBtYXRjaGluZ0tleVNlcXVlbmNlLCB0ZXh0LmdldEtleVNlcXVlbmNlKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy8gVGVzdCBvbmUgZ3JlYXRlciB0aGFuIGxlbmd0aC4KLSAgICAgICAgU3RyaW5nIGxvbmdlcktleVNlcXVlbmNlVGV4dCA9ICIxIDIgMyA0IDUiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEtleVNlcXVlbmNlIGxvbmdlcktleVNlcXVlbmNlID0gS2V5U2VxdWVuY2UKLSAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UobG9uZ2VyS2V5U2VxdWVuY2VUZXh0KTsKLSAgICAgICAgdGV4dC5zZXRLZXlTZXF1ZW5jZShsb25nZXJLZXlTZXF1ZW5jZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiTGltaXQgb2YgZm91ciBkaWQgbm90IHRydW5jYXRlIHRvIGZvdXIuIiwgbGVuZ3RoLCB0ZXh0LmdldEtleVNlcXVlbmNlKCkuZ2V0S2V5U3Ryb2tlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGEgemVyby1sZW5ndGggc3Ryb2tlIGNhbiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBLZXlTZXF1ZW5jZVRleHQgLS0KLSAgICAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHN0cm9rZSBsaW1pdCBpcyBzb21lIHBvc2l0aXZlIGludGVnZXIgb3IKLSAgICAgKiBpbmZpbml0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WmVyb1N0cm9rZSgpIHsKLSAgICAgICAgS2V5U2VxdWVuY2UgemVyb1N0cm9rZVNlcXVlbmNlID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICAvLyBUZXN0IHdpdGggYSBsaW1pdCBvZiBmb3VyLgotICAgICAgICB0ZXh0LnNldEtleVN0cm9rZUxpbWl0KDQpOwotICAgICAgICB0ZXh0LnNldEtleVNlcXVlbmNlKHplcm9TdHJva2VTZXF1ZW5jZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiTGltaXQgb2YgZm91ciBjaGFuZ2VkIHplcm8gc3Ryb2tlIHNlcXVlbmNlLiIsIHplcm9TdHJva2VTZXF1ZW5jZSwgdGV4dC5nZXRLZXlTZXF1ZW5jZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIFRlc3Qgd2l0aCBhbiBpbmZpbml0ZSBsaW1pdC4KLSAgICAgICAgdGV4dC5zZXRLZXlTdHJva2VMaW1pdChLZXlTZXF1ZW5jZVRleHQuSU5GSU5JVEUpOwotICAgICAgICB0ZXh0LnNldEtleVNlcXVlbmNlKHplcm9TdHJva2VTZXF1ZW5jZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiSW5maW5pdGUgbGltaXQgY2hhbmdlZCB6ZXJvIHN0cm9rZSBzZXF1ZW5jZS4iLCB6ZXJvU3Ryb2tlU2VxdWVuY2UsIHRleHQuZ2V0S2V5U2VxdWVuY2UoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDIwMzVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDIwMzVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYjhlMzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzQyMDM1VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmtleXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmtleXMuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmtleXMuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5TV1RLZXlTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3QgZm9yIEJ1ZyA0MjAzNS4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQnVnNDIwMzVUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgZ2l2ZW4ga2V5IGV2ZW50IHRvIHNlZSBpZiBnZW5lcmF0ZXMgdGhlIHRocmVlIGtleSBzdHJva2VzCi0gICAgICogcmVwcmVzZW50ZWQgYnkgdGhlIHN0cmluZ3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleUV2ZW50Ci0gICAgICogICAgICAgICAgICBUaGUga2V5IGV2ZW50IHRvIGdlbmVyYXRlIGtleSBzdHJva2VzIGZyb207IG11c3Qgbm90IGJlCi0gICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEBwYXJhbSBmaXJzdE1hdGNoCi0gICAgICogICAgICAgICAgICBUaGUgdGV4dCBmb3JtYXQgb2YgdGhlIGZpcnN0IG1hdGNoOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gc2Vjb25kTWF0Y2gKLSAgICAgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvcm1hdCBvZiB0aGUgc2Vjb25kIG1hdGNoOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gdGhpcmRNYXRjaAotICAgICAqICAgICAgICAgICAgVGhlIHRleHQgZm9ybWF0IG9mIHRoZSB0aGlyZCBtYXRjaDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFueW9uZSBvZiB0aGUgdGV4dCBmb3JtYXRzIHByb3ZpZGVkIGNhbm5vdCBiZSBwYXJzZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0S2V5RXZlbnQoRXZlbnQga2V5RXZlbnQsIFN0cmluZyBmaXJzdE1hdGNoLAotICAgICAgICAgICAgU3RyaW5nIHNlY29uZE1hdGNoLCBTdHJpbmcgdGhpcmRNYXRjaCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgS2V5U3Ryb2tlIGRlc2lyZWRLZXlTdHJva2UgPSBudWxsOwotICAgICAgICBLZXlTdHJva2UgYWN0dWFsS2V5U3Ryb2tlID0gbnVsbDsKLQotICAgICAgICAvLyBUZXN0IHRoZSBmaXJzdC1sZXZlbCBtYXRjaC4KLSAgICAgICAgZGVzaXJlZEtleVN0cm9rZSA9IEtleVN0cm9rZS5nZXRJbnN0YW5jZShmaXJzdE1hdGNoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhY3R1YWxLZXlTdHJva2UgPSBTV1RLZXlTdXBwb3J0Ci0gICAgICAgICAgICAgICAgLmNvbnZlcnRBY2NlbGVyYXRvclRvS2V5U3Ryb2tlKFNXVEtleVN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jb252ZXJ0RXZlbnRUb1VubW9kaWZpZWRBY2NlbGVyYXRvcihrZXlFdmVudCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIlVubW9kaWZpZWQgY2hhcmFjdGVyIHdpdGggYWxsIG1vZGlmaWVycyBkb2Vzbid0IG1hdGNoLiIsIGRlc2lyZWRLZXlTdHJva2UsIGFjdHVhbEtleVN0cm9rZSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyBUZXN0IHRoZSBzZWNvbmQtbGV2ZWwgbWF0Y2guCi0gICAgICAgIGRlc2lyZWRLZXlTdHJva2UgPSBLZXlTdHJva2UuZ2V0SW5zdGFuY2Uoc2Vjb25kTWF0Y2gpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFjdHVhbEtleVN0cm9rZSA9IFNXVEtleVN1cHBvcnQKLSAgICAgICAgICAgICAgICAuY29udmVydEFjY2VsZXJhdG9yVG9LZXlTdHJva2UoU1dUS2V5U3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnZlcnRFdmVudFRvVW5zaGlmdGVkTW9kaWZpZWRBY2NlbGVyYXRvcihrZXlFdmVudCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIk1vZGlmaWVkIGNoYXJhY3RlciB3aXRoIG5vIHNoaWZ0IGRvZXNuJ3QgbWF0Y2guIiwgZGVzaXJlZEtleVN0cm9rZSwgYWN0dWFsS2V5U3Ryb2tlKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIFRlc3QgdGhlIHRoaXJkLWxldmVsIG1hdGNoLgotICAgICAgICBkZXNpcmVkS2V5U3Ryb2tlID0gS2V5U3Ryb2tlLmdldEluc3RhbmNlKHRoaXJkTWF0Y2gpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFjdHVhbEtleVN0cm9rZSA9IFNXVEtleVN1cHBvcnQKLSAgICAgICAgICAgICAgICAuY29udmVydEFjY2VsZXJhdG9yVG9LZXlTdHJva2UoU1dUS2V5U3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnZlcnRFdmVudFRvTW9kaWZpZWRBY2NlbGVyYXRvcihrZXlFdmVudCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIk1vZGlmaWVkIGNoYXJhY3RlciB3aXRoIGFsbCBtb2RpZmllcnMgZG9lc24ndCBtYXRjaC4iLCBkZXNpcmVkS2V5U3Ryb2tlLCBhY3R1YWxLZXlTdHJva2UpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHRlc3QgY2FzZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIEJ1ZzQyMDM1VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgIkN0cmwrIiBnZW5lcmF0ZXMgIkN0cmwrIiwgIkN0cmwrIiBhbmQgIkN0cmwrIi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgIkNUUkwrIiBjYW5ub3QgYmUgcHJvY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDdHJsKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgRXZlbnQga2V5RXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAga2V5RXZlbnQua2V5Q29kZSA9IDB4NDAwMDA7Ci0gICAgICAgIGtleUV2ZW50LmNoYXJhY3RlciA9IDB4MDA7Ci0gICAgICAgIGtleUV2ZW50LnN0YXRlTWFzayA9IFNXVC5OT05FOwotCi0gICAgICAgIEtleVN0cm9rZSBkZXNpcmVkS2V5U3Ryb2tlID0gS2V5U3Ryb2tlLmdldEluc3RhbmNlKCJDVFJMKyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEtleVN0cm9rZSBhY3R1YWxLZXlTdHJva2UgPSBTV1RLZXlTdXBwb3J0Ci0gICAgICAgICAgICAgICAgLmNvbnZlcnRBY2NlbGVyYXRvclRvS2V5U3Ryb2tlKFNXVEtleVN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jb252ZXJ0RXZlbnRUb1VubW9kaWZpZWRBY2NlbGVyYXRvcihrZXlFdmVudCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIlVubW9kaWZpZWQgY2hhcmFjdGVyIHdpdGggYWxsIG1vZGlmaWVycyBkb2Vzbid0IG1hdGNoIiwgZGVzaXJlZEtleVN0cm9rZSwgYWN0dWFsS2V5U3Ryb2tlKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgIkN0cmwrRW50ZXIiIGdlbmVyYXRlcyAiQ3RybCtFbnRlciIsICJDdHJsK0VudGVyIiBhbmQKLSAgICAgKiAiQ3RybCtFbnRlciIuCi0gICAgICogCi0gICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmICJDVFJMK0VOVEVSIiBjYW5ub3QgYmUgcHJvY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDdHJsRW50ZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBFdmVudCBrZXlFdmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBrZXlFdmVudC5rZXlDb2RlID0gMHgwRDsKLSAgICAgICAga2V5RXZlbnQuY2hhcmFjdGVyID0gMHgwRDsKLSAgICAgICAga2V5RXZlbnQuc3RhdGVNYXNrID0gU1dULkNUUkw7Ci0KLSAgICAgICAgdGVzdEtleUV2ZW50KGtleUV2ZW50LCAiQ1RSTCtDUiIsICJDVFJMK0NSIiwgIkNUUkwrQ1IiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCAiQ3RybCtKIiBnZW5lcmF0ZXMgIkN0cmwrTSIsICJDdHJsK00iIGFuZCAiQ3RybCtNIi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgIkNUUkwrTSIgY2Fubm90IGJlIHByb2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3RybE0oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBFdmVudCBrZXlFdmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBrZXlFdmVudC5rZXlDb2RlID0gMHg2RDsKLSAgICAgICAga2V5RXZlbnQuY2hhcmFjdGVyID0gMHgwRDsKLSAgICAgICAga2V5RXZlbnQuc3RhdGVNYXNrID0gU1dULkNUUkw7Ci0KLSAgICAgICAgdGVzdEtleUV2ZW50KGtleUV2ZW50LCAiQ1RSTCtNIiwgIkNUUkwrTSIsICJDVFJMK00iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCAiQ3RybCtTaGlmdCsyIiBnZW5lcmF0ZXMgIkN0cmwrU2hpZnQrMiIsICJDdHJsK0AiIGFuZAotICAgICAqICJDdHJsK1NoaWZ0K0AiLiBUaGlzIHNpbXVsYXRlcyBhIFUuUy4ga2V5Ym9hcmQgbGF5b3V0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiAiQ1RSTCtTSElGVCsyIiwgIkNUUkwrQCIgb3IgIkNUUkwrU0hJRlQrQCIgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgcHJvY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDdHJsU2hpZnQyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgRXZlbnQga2V5RXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAga2V5RXZlbnQua2V5Q29kZSA9ICcyJzsKLSAgICAgICAga2V5RXZlbnQuY2hhcmFjdGVyID0gMHgwMDsKLSAgICAgICAga2V5RXZlbnQuc3RhdGVNYXNrID0gU1dULkNUUkwgfCBTV1QuU0hJRlQ7Ci0KLSAgICAgICAgdGVzdEtleUV2ZW50KGtleUV2ZW50LCAiQ1RSTCtTSElGVCsyIiwgIkNUUkwrQCIsICJDVFJMK1NISUZUK0AiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCAiQ3RybCtTaGlmdCs3IiBnZW5lcmF0ZXMgIkN0cmwrU2hpZnQrNyIsICJDdHJsKy8iIGFuZAotICAgICAqICJDdHJsK1NoaWZ0Ky8iLiBUaGlzIHNpbXVsYXRlcyBhIFN3aXNzLUdlcm1hbiBrZXlib2FyZCBsYXlvdXQuCi0gICAgICogCi0gICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmICJDVFJMK1NISUZUKzciLCAiQ1RSTCsvIiBvciAiQ1RSTCtTSElGVCsvIiBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgICBwcm9jZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEN0cmxTaGlmdDdfU3dpc3NHZXJtYW4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBFdmVudCBrZXlFdmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBrZXlFdmVudC5rZXlDb2RlID0gJzcnOwotICAgICAgICBrZXlFdmVudC5jaGFyYWN0ZXIgPSAnLyc7Ci0gICAgICAgIGtleUV2ZW50LnN0YXRlTWFzayA9IFNXVC5DVFJMIHwgU1dULlNISUZUOwotCi0gICAgICAgIHRlc3RLZXlFdmVudChrZXlFdmVudCwgIkNUUkwrU0hJRlQrNyIsICJDVFJMKy8iLCAiQ1RSTCtTSElGVCsvIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgIkN0cmwrU2hpZnQrNyIgZ2VuZXJhdGVzICJDdHJsK1NoaWZ0KzciLCAiQ3RybCsmIiBhbmQKLSAgICAgKiAiQ3RybCtTaGlmdCsmIi4gVGhpcyBzaW11bGF0ZXMgYSBVUyBrZXlib2FyZCBsYXlvdXQuCi0gICAgICogCi0gICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmICJDVFJMK1NISUZUKzciLCAiQ1RSTCsmIiBvciAiQ1RSTCtTSElGVCsmIiBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgICBwcm9jZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEN0cmxTaGlmdDdfVVMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBFdmVudCBrZXlFdmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBrZXlFdmVudC5rZXlDb2RlID0gJzcnOwotICAgICAgICBrZXlFdmVudC5jaGFyYWN0ZXIgPSAnJic7Ci0gICAgICAgIGtleUV2ZW50LnN0YXRlTWFzayA9IFNXVC5DVFJMIHwgU1dULlNISUZUOwotCi0gICAgICAgIHRlc3RLZXlFdmVudChrZXlFdmVudCwgIkNUUkwrU0hJRlQrNyIsICJDVFJMKyYiLCAiQ1RSTCtTSElGVCsmIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWc0MjYyN1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWc0MjYyN1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhNzg0OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDI2MjdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5rZXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgQnVnIDQyNjI3Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEJ1ZzQyNjI3VGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgLy8gVE9ETyBTZWUgaWYgdGhpcyBpcyBuZWVkZWQgZm9yIGFueXRoaW5nLgotICAgIC8vCXByaXZhdGUgY2xhc3MgRHVtbXlWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotICAgIC8vCQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgLy8JCQkvLyBEbyBub3RoaW5nCi0gICAgLy8JCX0KLSAgICAvLwkJCi0gICAgLy8JCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgIC8vCQkJLy8gRG8gbm90aGluZwotICAgIC8vCQl9Ci0gICAgLy8JfQotCi0gICAgLyoqCi0gICAgICogQSBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiBhbiA8Y29kZT5BY3Rpb248L2NvZGU+LgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICAvLwlwcml2YXRlIGNsYXNzIER1bW15QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLSAgICAvLwkJLy8gTm90aGluZyB0byBpbXBsZW1lbnQKLSAgICAvLwl9Ci0gICAgLy8JcHJpdmF0ZSBib29sZWFuIGxvZ2dlZDsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQnVnNDI2MjdUZXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIEJ1ZzQyNjI3VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICAgICAgLy8JCWxvZ2dlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgYWN0aW9ucyB3aXRoIG5vIGRlZmluZWQgY29tbWFuZCBJRCBhcmUgbG9nZ2VkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgSWYgc29tZXRoaW5nIGZhaWxzIHdoZW4gdHJ5aW5nIHRvIG9wZW4gYSBuZXcgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nVW5kZWZpbmVkKCkgLyp0aHJvd3MgQ29yZUV4Y2VwdGlvbiovewotICAgICAgICAvLyBUT0RPIE5vIGxvZyBpcyBiZWluZyBnZW5lcmF0ZWQuICBXaGF0IHdhcyBDaHJpcycgZml4PwotICAgICAgICAvLwkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICAvLwkJUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmFkZExvZ0xpc3RlbmVyKG5ldyBJTG9nTGlzdGVuZXIoKSB7Ci0gICAgICAgIC8vCQkJcHVibGljIHZvaWQgbG9nZ2luZyhJU3RhdHVzIHN0YXR1cywgU3RyaW5nIHN0cmluZykgewotICAgICAgICAvLwkJCQlsb2dnZWQgPSB0cnVlOwotICAgICAgICAvLwkJCX0KLSAgICAgICAgLy8JCX0pOwotICAgICAgICAvLwkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIC8vCQlJUHJvamVjdCB0ZXN0UHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdCgiQnVnNDI2MjdQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLy8JCXRlc3RQcm9qZWN0LmNyZWF0ZShudWxsKTsKLSAgICAgICAgLy8JCXRlc3RQcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgICAgIC8vCQlBYnN0cmFjdFRleHRFZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0VGV4dEVkaXRvcikgd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKHRlc3RQcm9qZWN0LmdldEZpbGUoIi5wcm9qZWN0IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8vCQllZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKDAsIDEpOwotICAgICAgICAvLwkJRWRpdG9yU2l0ZSBzaXRlID0gKEVkaXRvclNpdGUpIGVkaXRvci5nZXRTaXRlKCk7Ci0gICAgICAgIC8vCQlzaXRlLmdldEFjdGlvbkJhcnMoKS5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJCb2d1cyBhY3Rpb24gbmFtZSB0aGF0IGhvcGVmdWxseSB3aWxsIG5vdCBleGlzdCIsIG5ldyBEdW1teUFjdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAvLwkJd2luZG93LmdldFNoZWxsKCkuc2V0Rm9jdXMoKTsKLSAgICAgICAgLy8JCWFzc2VydFRydWUoIk5vdGhpbmcgaGFzIGJlZW4gbG9nZ2VkLiIsIGxvZ2dlZCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDMxNjhUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDMxNjhUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMWY2N2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzQzMTY4VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMua2V5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTZXF1ZW5jZVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyBCdWcgNDMxNjgKLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQnVnNDMxNjhUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQnVnNDMxNjhUZXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBCdWc0MzE2OFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBhIDxjb2RlPlN0YWNrT3ZlcmZsb3dFcnJvcjwvY29kZT4gZG9lcyBub3Qgb2NjdXIgd2hlbgotICAgICAqIHRyeWluZyB0byBzZXQgdGhlIGtleSBzZXF1ZW5jZSBpbiBhIGtleSBzZXF1ZW5jZSBlbnRyeSB3aWRnZXQuCi0gICAgICogCi0gICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmICJDVFJMKyIgaXMgbm90IHJlY29nbml6ZWQgYXMgYSBrZXkgc2VxdWVuY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YWNrT3ZlcmZsb3coKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgICAgIHNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotICAgICAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUik7Ci0gICAgICAgIEtleVNlcXVlbmNlVGV4dCBrZXlTZXF1ZW5jZVRleHQgPSBuZXcgS2V5U2VxdWVuY2VUZXh0KHRleHQpOwotCi0gICAgICAgIHNoZWxsLnBhY2soKTsKLSAgICAgICAgc2hlbGwub3BlbigpOwotICAgICAgICBrZXlTZXF1ZW5jZVRleHQuc2V0S2V5U2VxdWVuY2UoS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2UoIkNUUkwrIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNoZWxsLmNsb3NlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzQzMzIxVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzQzMzIxVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2I3NTNhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWc0MzMyMVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmtleXM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwua2V5cy5CaW5kaW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5rZXlzLklCaW5kaW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvcjsKLQotLyoqCi0gKiBUZXN0cyBCdWcgNDMzMjEKLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQnVnNDMzMjFUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQnVnNDMzMjFUZXN0LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotCSAqLwotCXB1YmxpYyBCdWc0MzMyMVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCBub24tY2hlY2sgYm94IGl0ZW1zIG9uIHRoZSBtZW51IGFyZSBub3QgY2hlY2tlZCB3aGVuIGFjdGl2YXRlZAotCSAqIGZyb20gdGhlIGtleWJvYXJkLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIGV4ZWN1dGlvbiBvZiB0aGUgaGFuZGxlciBmYWlscy4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgdGVzdCBwcm9qZWN0IGNhbm5vdCBiZSBjcmVhdGVkIGFuZCBvcGVuZWQuCi0JICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmICJDVFJMK0MiIGlzbid0IGEgdmFsaWQga2V5IHN0cm9rZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9DaGVja09uTm9uQ2hlY2tib3goKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiwKLQkJCUNvcmVFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3QgdGVzdFByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QoIlRlc3RQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJdGVzdFByb2plY3QuY3JlYXRlKG51bGwpOwotCQl0ZXN0UHJvamVjdC5vcGVuKG51bGwpOwotCQlJRmlsZSB0ZXh0RmlsZSA9IHRlc3RQcm9qZWN0LmdldEZpbGUoIkEudHh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNvbnRlbnRzID0gIkEgYmx1cmIiOyAvLyROT04tTkxTLTEkCi0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRzCi0JCQkJLmdldEJ5dGVzKCkpOwotCQl0ZXh0RmlsZS5jcmVhdGUoaW5wdXRTdHJlYW0sIHRydWUsIG51bGwpOwotCQlBYnN0cmFjdFRleHRFZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0VGV4dEVkaXRvcikgSURFLm9wZW5FZGl0b3Iod2luZG93Ci0JCQkJLmdldEFjdGl2ZVBhZ2UoKSwgdGV4dEZpbGUsIHRydWUpOwotCQllZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKDAsIDEpOwotCi0JCS8vIFByZXNzICJDdHJsK0MiIHRvIHBlcmZvcm0gYSBjb3B5LgotCQlMaXN0IGtleVN0cm9rZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWtleVN0cm9rZXMuYWRkKEtleVN0cm9rZS5nZXRJbnN0YW5jZSgiQ1RSTCtDIikpOyAvLyROT04tTkxTLTEkCi0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCVdvcmtiZW5jaCB3b3JrYmVuY2ggPSAoKFdvcmtiZW5jaCkgd2luZG93LmdldFdvcmtiZW5jaCgpKTsKLQkJQmluZGluZ1NlcnZpY2Ugc3VwcG9ydCA9IChCaW5kaW5nU2VydmljZSkgd29ya2JlbmNoCi0JCQkJLmdldEFkYXB0ZXIoSUJpbmRpbmdTZXJ2aWNlLmNsYXNzKTsKLQkJc3VwcG9ydC5nZXRLZXlib2FyZCgpLnByZXNzKGtleVN0cm9rZXMsIGV2ZW50KTsKLQotCQkvLyBHZXQgdGhlIG1lbnUgaXRlbSB3ZSd2ZSBqdXN0IHNlbGVjdGVkLgotCQlJQWN0aW9uIGFjdGlvbiA9IGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpCi0JCQkJLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKCJOb24tY2hlY2tib3ggbWVudSBpdGVtIGlzIGNoZWNrZWQuIiwgIWFjdGlvbi5pc0NoZWNrZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDM1MzhUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDM1MzhUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmN2I5ZDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzQzNTM4VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMua2V5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5BdXRvbWF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0IGZvciBCdWcgNDM1MzguCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEJ1ZzQzNTM4VGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHRlc3QgY2FzZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIEJ1ZzQzNTM4VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgaWYgIkN0cmwrU3BhY2UiIGlzIHByZXNzZWQgb25seSBvbmUga2V5IGRvd24gZXZlbnQgd2l0aCB0aGUKLSAgICAgKiAiQ1RSTCIgbWFzayBpcyByZWNlaXZlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3RybFNwYWNlKCkgewotICAgICAgICAvLyBTZXQgdXAgYSB3b3JraW5nIGVudmlyb25tZW50LgotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICAgICAgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5zdGF0ZU1hc2sgPT0gU1dULkNUUkwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBrZXkgZG93biBldmVudHMgZm9yICdDdHJsK1NwYWNlJyIsIDAsIGNvdW50KyspOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBkaXNwbGF5LmFkZEZpbHRlcihTV1QuS2V5RG93biwgbGlzdGVuZXIpOwotCi0gICAgICAgIEF1dG9tYXRpb25VdGlsLnBlcmZvcm1LZXlDb2RlRXZlbnQoZGlzcGxheSwgU1dULktleURvd24sIFNXVC5DT05UUk9MKTsKLSAgICAgICAgQXV0b21hdGlvblV0aWwucGVyZm9ybUtleUNvZGVFdmVudChkaXNwbGF5LCBTV1QuS2V5RG93biwgQWN0aW9uLmZpbmRLZXlDb2RlKCJTUEFDRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBBdXRvbWF0aW9uVXRpbC5wZXJmb3JtS2V5Q29kZUV2ZW50KGRpc3BsYXksIFNXVC5LZXlVcCwgQWN0aW9uLmZpbmRLZXlDb2RlKCJTUEFDRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBBdXRvbWF0aW9uVXRpbC5wZXJmb3JtS2V5Q29kZUV2ZW50KGRpc3BsYXksIFNXVC5LZXlVcCwgU1dULkNPTlRST0wpOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0gICAgICAgICAgICA7Ci0KLSAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIHdvcmtpbmcgZW52aXJvbm1lbnQuCi0gICAgICAgIGRpc3BsYXkucmVtb3ZlRmlsdGVyKFNXVC5LZXlEb3duLCBsaXN0ZW5lcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzQzNTk3VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzQzNTk3VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmIxOTc1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWc0MzU5N1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmtleXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyBCdWcgNDM1OTcKLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQnVnNDM1OTdUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQnVnNDM1OTdUZXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBCdWc0MzU5N1Rlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBzZXR0aW5nIHRoZSB0ZXh0IG9uIGEgdGV4dCB3aWRnZXQgdG8gYW4gZW1wdHkgc3RyaW5nIGRvZXMgbm90Ci0gICAgICogcmVzZXQgdGhlIGZvbnQuIFRoaXMgd2FzIGEgcHJvYmxlbSBvbmx5IG9uIGNhcmJvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9udFJlc2V0KCkgewotICAgICAgICBTdHJpbmcgbWV0YUNoYXJhY3RlciA9ICJcdTIzMjVYIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIFNldCB1cCBhIHdvcmtpbmcgZW52aXJvbm1lbnQuCi0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgICAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgc2hlbGwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkxFRlQpOwotICAgICAgICB0ZXh0LnNldEZvbnQobmV3IEZvbnQodGV4dC5nZXREaXNwbGF5KCksCi0gICAgICAgICAgICAgICAgIkx1Y2lkYSBHcmFuZGUiLCAxMywgU1dULk5PUk1BTCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIHNoZWxsLnBhY2soKTsKLSAgICAgICAgc2hlbGwub3BlbigpOwotCi0gICAgICAgIC8vIFNldCB0aGUgdGV4dCBvbmNlLCBhbmQgZ2V0IHRoZSBmb250LgotICAgICAgICB0ZXh0LnNldFRleHQobWV0YUNoYXJhY3Rlcik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgRm9udCBmb250QmVmb3JlID0gdGV4dC5nZXRGb250KCk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBmb250IGFnYWluLCBhbmQgZ2V0IHRoZSBmb250IGFmdGVyd2FyZC4KLSAgICAgICAgdGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0ZXh0LnNldFRleHQobWV0YUNoYXJhY3Rlcik7Ci0gICAgICAgIEZvbnQgZm9udEFmdGVyID0gdGV4dC5nZXRGb250KCk7Ci0KLSAgICAgICAgLy8gVGVzdC4KLQkJYXNzZXJ0RXF1YWxzKCJDbGVhcmluZyB0ZXh0IHJlc2V0cyBmb250LiIsIGZvbnRCZWZvcmUsIGZvbnRBZnRlcik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyBDbGVhbiB1cCBhZnRlciBteXNlbGYuCi0gICAgICAgIHNoZWxsLmNsb3NlKCk7Ci0gICAgICAgIHNoZWxsLmRpc3Bvc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDM2MTBUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDM2MTBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MzIzMDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzQzNjEwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMua2V5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQXV0b21hdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCBmb3IgQnVnIDQzNjEwLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWc0MzYxMFRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyB0ZXN0IGNhc2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlc3ROYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBCdWc0MzYxMFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGlmICJTaGlmdCtBbHQrIiBpcyBwcmVzc2VkLCB0aGVuIHRoZSBrZXkgY29kZSBzaG91bGQKLSAgICAgKiByZXByZXNlbnQgdGhlICJBbHQrIiBrZXkgcHJlc3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNoaWZ0QWx0KCkgewotICAgICAgICAvLyBTZXQgdXAgYSB3b3JraW5nIGVudmlyb25tZW50LgotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICAgICAgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5zdGF0ZU1hc2sgPT0gU1dULlNISUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IGtleSBjb2RlIGZvciAnU2hpZnQrQWx0KyciLCBTV1QuQUxULCBldmVudC5rZXlDb2RlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgZGlzcGxheS5hZGRGaWx0ZXIoU1dULktleURvd24sIGxpc3RlbmVyKTsKLSAgICAgICAgCi0gICAgICAgIEF1dG9tYXRpb25VdGlsLnBlcmZvcm1LZXlDb2RlRXZlbnQoZGlzcGxheSwgU1dULktleURvd24sIFNXVC5TSElGVCk7Ci0gICAgICAgIEF1dG9tYXRpb25VdGlsLnBlcmZvcm1LZXlDb2RlRXZlbnQoZGlzcGxheSwgU1dULktleURvd24sIFNXVC5BTFQpOwotICAgICAgICBBdXRvbWF0aW9uVXRpbC5wZXJmb3JtS2V5Q29kZUV2ZW50KGRpc3BsYXksIFNXVC5LZXlVcCwgU1dULkFMVCk7Ci0gICAgICAgIEF1dG9tYXRpb25VdGlsLnBlcmZvcm1LZXlDb2RlRXZlbnQoZGlzcGxheSwgU1dULktleVVwLCBTV1QuU0hJRlQpOwotICAgICAgICBBdXRvbWF0aW9uVXRpbC5wZXJmb3JtS2V5Q29kZUV2ZW50KGRpc3BsYXksIFNXVC5LZXlEb3duLCBTV1QuRVNDKTsKLSAgICAgICAgQXV0b21hdGlvblV0aWwucGVyZm9ybUtleUNvZGVFdmVudChkaXNwbGF5LCBTV1QuS2V5VXAsIFNXVC5FU0MpOwotCQotICAgICAgICB3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLSAgICAgICAgICAgIDsKLQotICAgICAgICAvLyBDbGVhbiB1cCB0aGUgd29ya2luZyBlbnZpcm9ubWVudC4KLSAgICAgICAgZGlzcGxheS5yZW1vdmVGaWx0ZXIoU1dULktleURvd24sIGxpc3RlbmVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDM4MDBUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDM4MDBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MGIxYzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0J1ZzQzODAwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMua2V5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5TV1RLZXlTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3QgZm9yIEJ1ZyA0MzgwMC4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQnVnNDM4MDBUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgdGVzdCBjYXNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBCdWc0MzgwMFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGtleSBwcmVzc2VkIHdpdGgga2V5IGNvZGVzIGdyZWF0ZXIgdGhhbiAxNiBiaXRzIGFyZSBjb3JyZWN0bHkKLSAgICAgKiBjb252ZXJ0ZWQgaW50byBhY2NlbGVyYXRvciB2YWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRpbmdDYXN0KCkgewotICAgICAgICAvKgotICAgICAgICAgKiBNYWtlIGFuIGV2ZW50IHJlcHJlc2VudGluZyBhIGtleSBzdHJva2Ugd2l0aCBhIGtleSBjb2RlIGdyZWF0ZXIgdGhhbgotICAgICAgICAgKiAxNiBiaXRzLgotICAgICAgICAgKi8KLSAgICAgICAgRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQua2V5Q29kZSA9IFNXVC5BUlJPV19MRUZUOwotICAgICAgICBldmVudC5jaGFyYWN0ZXIgPSAweDAwOwotICAgICAgICBldmVudC5zdGF0ZU1hc2sgPSAweDAwOwotCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIGV2ZW50LCBhbmQgdGVzdCB0aGUgcmVzdWx0aW5nIGFjY2VsZXJhdG9yIHZhbHVlLgotICAgICAgICBpbnQgYWNjZWxlcmF0b3IgPSBTV1RLZXlTdXBwb3J0Ci0gICAgICAgICAgICAgICAgLmNvbnZlcnRFdmVudFRvVW5tb2RpZmllZEFjY2VsZXJhdG9yKGV2ZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBcnJvd19MZWZ0IGtleSB0cnVuY2F0ZWQuIiwgU1dULkFSUk9XX0xFRlQsIGFjY2VsZXJhdG9yKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWc0NDQ2MFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWc0NDQ2MFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4ZjU1MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNDQ0NjBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMua2V5czsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuZXZlbnRzLkJ1aWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5rZXlzLkJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmtleXMuV29ya2JlbmNoS2V5Ym9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5JQmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCBmb3IgQnVnIDQ0NDYwLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWc0NDQ2MFRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyB0ZXN0IGNhc2UuCi0JICogCi0JICogQHBhcmFtIHRlc3ROYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdAotCSAqLwotCXB1YmxpYyBCdWc0NDQ2MFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHRoYXQgcHJlc3NpbmcgIkN0cmwrU2hpZnQrVCIgaW4gdGhlIFRlYW0gU3luY2hyb25pemluZyBwZXJzcGVjdGl2ZQotCSAqIGRvZXMgbm90IG1hdGNoIGFueXRoaW5nLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIGV4ZWN1dGlvbiBvZiB0aGUgaGFuZGxlciBmYWlscy4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgcHJvamVjdCBjYW5ub3QgYmUgY3JlYXRlZCBvciBvcGVuZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEN0cmxTaGlmdFQoKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE9wZW4gYSBuZXcgdGVzdCB3aW5kb3cuCi0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLQotCQkvLyBPcGVuIGEgbmV3IEphdmEgcHJvamVjdCwgd2l0aCBhIG5ldyBjbGFzcy4KLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0IHRlc3RQcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotCQkJCSJCdWcgNDQ0NjAgUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCXRlc3RQcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkJdGVzdFByb2plY3Qub3BlbihudWxsKTsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBwcm9qZWN0RGVzY3JpcHRpb24gPSB0ZXN0UHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBuYXR1cmVJZHMgPSB7ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIiB9OyAvLyROT04tTkxTLTEkCi0JCXByb2plY3REZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmF0dXJlSWRzKTsKLQkJSUNvbW1hbmQgYnVpbGRDb21tYW5kID0gbmV3IEJ1aWxkQ29tbWFuZCgpOwotCQlidWlsZENvbW1hbmQuc2V0QnVpbGRlck5hbWUoIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJvamVjdERlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXcgSUNvbW1hbmRbXSB7IGJ1aWxkQ29tbWFuZCB9KTsKLQkJdGVzdFByb2plY3Quc2V0RGVzY3JpcHRpb24ocHJvamVjdERlc2NyaXB0aW9uLCBudWxsKTsKLQkJSUZpbGUgamF2YUZpbGUgPSB0ZXN0UHJvamVjdC5nZXRGaWxlKCJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY2xhc3NDb250ZW50cyA9ICJwdWJsaWMgY2xhc3MgTWFpbiB7IHB1YmxpYyBzdGF0aWMgbWFpbihTdHJpbmdbXSBhcmdzKSB7IDsgfSB9IjsgLy8kTk9OLU5MUy0xJAotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLQkJCQljbGFzc0NvbnRlbnRzLmdldEJ5dGVzKCkpOwotCQlqYXZhRmlsZS5jcmVhdGUoaW5wdXRTdHJlYW0sIHRydWUsIG51bGwpOwotCQlJREUub3BlbkVkaXRvcih3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpLCBqYXZhRmlsZSwgdHJ1ZSk7Ci0KLQkJLy8gU3dpdGNoIHRvIHRoZSB0ZWFtIHN5bmNocm9uaXppbmcgcGVyc3BlY3RpdmUuCi0JCUlQZXJzcGVjdGl2ZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCk7Ci0JCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyc3BlY3RpdmVEZXNjcmlwdG9yID0gcmVnaXN0cnkKLQkJCQkuZmluZFBlcnNwZWN0aXZlV2l0aElkKCJvcmcuZWNsaXBzZS50ZWFtLnVpLlRlYW1TeW5jaHJvbml6aW5nUGVyc3BlY3RpdmUiKTsgLy8kTk9OLU5MUy0xJAotCQlXb3JrYmVuY2hQYWdlIHBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJcGFnZS5zZXRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZURlc2NyaXB0b3IpOwotCi0JCS8vIFByZXNzICJDdHJsK1NoaWZ0K1QiLgotCQlFdmVudCBjdHJsU2hpZnRUID0gbmV3IEV2ZW50KCk7Ci0JCWN0cmxTaGlmdFQuc3RhdGVNYXNrID0gU1dULlNISUZUIHwgU1dULkNUUkw7Ci0JCWN0cmxTaGlmdFQuY2hhcmFjdGVyID0gJ1QnOwotCQljdHJsU2hpZnRULmtleUNvZGUgPSAndCc7Ci0JCUxpc3Qga2V5U3Ryb2tlcyA9IFdvcmtiZW5jaEtleWJvYXJkCi0JCQkJLmdlbmVyYXRlUG9zc2libGVLZXlTdHJva2VzKGN0cmxTaGlmdFQpOwotCQlXb3JrYmVuY2ggd29ya2JlbmNoID0gKFdvcmtiZW5jaCkgd2luZG93LmdldFdvcmtiZW5jaCgpOwotCQlCaW5kaW5nU2VydmljZSBzdXBwb3J0ID0gKEJpbmRpbmdTZXJ2aWNlKSB3b3JrYmVuY2gKLQkJCQkuZ2V0QWRhcHRlcihJQmluZGluZ1NlcnZpY2UuY2xhc3MpOwotCQlzdXBwb3J0LmdldEtleWJvYXJkKCkucHJlc3Moa2V5U3Ryb2tlcywgbnVsbCk7Ci0KLQkJLy8gVGVzdCB0aGF0IG9ubHkgdHdvIGNoaWxkIHNoZWxscyBhcmUgb3BlbiAoZGVmYXVsdCkuCi0JCVNoZWxsIHdpbmRvd1NoZWxsID0gd2luZG93LmdldFNoZWxsKCk7Ci0JCVNoZWxsW10gY2hpbGRTaGVsbHMgPSB3aW5kb3dTaGVsbC5nZXRTaGVsbHMoKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCQkiVHlwZSBoaWVyYXJjaHkgZGlhbG9nIG9wZW5lZCBpbmFwcHJvcHJpYXRlbHkgb24gJ0N0cmwrU2hpZnQrVCciLCAoY2hpbGRTaGVsbHMubGVuZ3RoID09IDIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWc1MzQ4OVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9CdWc1MzQ4OVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRkYmZhZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvQnVnNTM0ODlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMua2V5czsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uTGluZU51bWJlclJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQXV0b21hdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgdGhhdCBwcmVzc2luZyBkZWxldGUgaW4gYSBzdHlsZWQgdGV4dCB3aWRnZXQgZG9lcyBub3QgY2F1c2UgYSBkb3VibGUKLSAqIGRlbGV0ZSBzaXR1YXRpb24uCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEJ1ZzUzNDg5VGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEJ1ZzUzNDg5VGVzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHRlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgQnVnNTM0ODlUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgcHJlc3NpbmcgZGVsZXRlIGluIGEgc3R5bGVkIHRleHQgd2lkZ2V0IChpbiBhIHJ1bm5pbmcKLSAgICAgKiBFY2xpcHNlKSBkb2VzIG5vdCBjYXVzZSBhIGRvdWJsZSBkZWxldGUuCi0gICAgICogCi0gICAgICogQHRocm93cyBBV1RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY3JlYXRpb24gb2Ygcm9ib3QKLSAgICAgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBleGVjdXRpb24gb2YgdGhlIGhhbmRsZXIgZmFpbHMuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHRlc3QgcHJvamVjdCBjYW5ub3QgYmUgY3JlYXRlZCBhbmQgb3BlbmVkLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgcmVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlRGVsZXRlKCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24sCi0gICAgICAgICAgICBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIElQcm9qZWN0IHRlc3RQcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotICAgICAgICAgICAgICAgICJEb3VibGVEZWxldGVlc3RQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGVzdFByb2plY3QuY3JlYXRlKG51bGwpOwotICAgICAgICB0ZXN0UHJvamVjdC5vcGVuKG51bGwpOwotICAgICAgICBJRmlsZSB0ZXh0RmlsZSA9IHRlc3RQcm9qZWN0LmdldEZpbGUoIkEudHh0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsQ29udGVudHMgPSAiQSBibHVyYiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgb3JpZ2luYWxDb250ZW50cy5nZXRCeXRlcygpKTsKLSAgICAgICAgdGV4dEZpbGUuY3JlYXRlKGlucHV0U3RyZWFtLCB0cnVlLCBudWxsKTsKLSAgICAgICAgSURFLm9wZW5FZGl0b3Iod2luZG93LmdldEFjdGl2ZVBhZ2UoKSwgdGV4dEZpbGUsCi0gICAgICAgICAgICAgICAgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gQWxsb3cgdGhlIGVkaXRvciB0byBmaW5pc2ggb3BlbmluZy4KLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAgIHdoaWxlIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotICAgICAgICAgICAgOwotCi0gICAgICAgIEF1dG9tYXRpb25VdGlsLnBlcmZvcm1LZXlDb2RlRXZlbnQoZGlzcGxheSwgU1dULktleURvd24sIFNXVC5ERUwpOwotICAgICAgICBBdXRvbWF0aW9uVXRpbC5wZXJmb3JtS2V5Q29kZUV2ZW50KGRpc3BsYXksIFNXVC5LZXlVcCwgU1dULkRFTCk7Ci0gICAgICAgIEF1dG9tYXRpb25VdGlsLnBlcmZvcm1LZXlDb2RlRXZlbnQoZGlzcGxheSwgU1dULktleURvd24sIFNXVC5DVFJMKTsKLSAgICAgICAgQXV0b21hdGlvblV0aWwucGVyZm9ybUNoYXJhY3RlckV2ZW50KGRpc3BsYXksIFNXVC5LZXlEb3duLCdTJyk7Ci0gICAgICAgIEF1dG9tYXRpb25VdGlsLnBlcmZvcm1DaGFyYWN0ZXJFdmVudChkaXNwbGF5LCBTV1QuS2V5VXAsJ1MnKTsKLSAgICAgICAgQXV0b21hdGlvblV0aWwucGVyZm9ybUtleUNvZGVFdmVudChkaXNwbGF5LCBTV1QuS2V5VXAsIFNXVC5DVFJMKTsKLSAgICAgIAotICAgICAgICAvLyBTcGluIHRoZSBldmVudCBsb29wLgotICAgICAgICB3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLSAgICAgICAgICAgIDsKLQotICAgICAgICAvLyBUZXN0IHRoZSB0ZXh0IGlzIG9ubHkgb25lIGNoYXJhY3RlciBkaWZmZXJlbnQuCi0gICAgICAgIExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIHRleHRGaWxlLmdldENvbnRlbnRzKCkpKTsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRDb250ZW50cyA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCInREVMJyBkZWxldGVkIG1vcmUgdGhhbiBvbmUga2V5LiIsIChvcmlnaW5hbENvbnRlbnRzIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAubGVuZ3RoKCkgPT0gKGN1cnJlbnRDb250ZW50cy5sZW5ndGgoKSArIDEpKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0tleXNUZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMva2V5cy9LZXlzVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTFhOTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL0tleXNUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5rZXlzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUZXN0cyBmb3IgYWxsIGFyZWFzIG9mIHRoZSBrZXkgc3VwcG9ydCBmb3IgdGhlIHBsYXRmb3JtLgotICovCi1wdWJsaWMgY2xhc3MgS2V5c1Rlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gVGhpcyBpcyByZXF1aXJlZCB0byB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLZXlzVGVzdFN1aXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IHRoZSB0ZXN0IHN1aXRlLgotICAgICAqLwotICAgIHB1YmxpYyBLZXlzVGVzdFN1aXRlKCkgewotICAgIAlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQmluZGluZ0ludGVyYWN0aW9uc1Rlc3QuY2xhc3MpKTsKLSAgICAJYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJpbmRpbmdNYW5hZ2VyVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQmluZGluZ1BlcnNpc3RlbmNlVGVzdC5jbGFzcykpOwotICAgICAgICAvLyBUT0RPIFRoaXMgbm8gbG9uZ2VyIHdvcmtzIGR1ZSB0byBmb2N1cyBpc3N1ZXMgcmVsYXRlZCB0byBrZXkgYmluZGluZ3MKLSAgICAgICAgLy9hZGRUZXN0KG5ldyBUZXN0U3VpdGUoQnVnMzY0MjBUZXN0LmNsYXNzKSk7Ci0gICAgICAgIC8vCQlUT0RPIFRoaXMgdGVzdCBpcyBicm9rZW4gdW50aWwgSkRUIGZpeGVzIEJ1ZyA0NDE0OAotICAgICAgICAvLwkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1ZzM2NTM3VGVzdC5jbGFzcykpOwotICAgICAgICAvLwkJVE9ETyBJbnRlcm1pdHRlbnQgZmFpbHVyZS4gIFNXVCBCdWcgNDQzNDQuICBYR3JhYlBvaW50ZXI/Ci0gICAgICAgIC8vCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQnVnNDAwMjNUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShCdWc0MjAyNFRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1ZzQyMDM1VGVzdC5jbGFzcykpOwotICAgICAgICAvLwkJVE9ETyBMb2dnaW5nIHBpZWNlIG9mIGZpeCBkaWQgbm90IGdvIGluIE00LgotICAgICAgICAvLwkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1ZzQyNjI3VGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQnVnNDMxNjhUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShCdWc0MzMyMVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1ZzQzNTM4VGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQnVnNDM1OTdUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShCdWc0MzYxMFRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1ZzQzODAwVGVzdC5jbGFzcykpOwotICAgICAgICAvLwkJVE9ETyBkaXNhYmxlZCBzaW5jZSBpdCByZWZlcnMgdG8gdGhlIEphdmEgYnVpbGRlciBhbmQgbmF0dXJlLAotICAgICAgICAvLyAgICAgIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIGluIGFuIFJDUCBidWlsZAotICAgICAgICAvLwkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1ZzQ0NDYwVGVzdC5jbGFzcykpOwotICAgICAgICAvKiBUT0RPIGRpc2FibGVkIGFzIGl0IGlzIGNhdXNpbmcgZmFpbHVyZXMgaW4gdGhlIG5pZ2h0bHkgYnVpbGRzLgotICAgICAgICAgKiBmb2N1cyByZWxhdGVkPwotICAgICAgICAgKi8KLSAgICAgICAgLy9hZGRUZXN0KG5ldyBUZXN0U3VpdGUoQnVnNTM0ODlUZXN0LmNsYXNzKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL1ByZWZlcmVuY2VNdXRhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvUHJlZmVyZW5jZU11dGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhZjY2Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvUHJlZmVyZW5jZU11dGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmtleXM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luVmVyc2lvbklkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIEEgdXRpbGl0eSBjbGFzcyBmb3Igc2V0dGluZyBwcmVmZXJlbmNlcyByZWxhdGVkIHRvIGtleSBiaW5kaW5ncy4gVGhpcyBjbGFzcwotICogY3VycmVudGx5IHVzZXMgdGhlIHJvdW5kLWFib3V0IHByb2NlZHVyZSBvZiBtYW51YWxseSB3cml0aW5nIGEgcHJlZmVyZW5jZXMKLSAqIGZpbGUsIGFuZCB0aGVuIGxvYWRpbmcgaXQgYmFjayBpbnRvIHRoZSBhcHBsaWNhdGlvbi4gSW4gdGhlIGZ1dHVyZSwgaXQgbWlnaHQKLSAqIHVzZSBhIGRpcmVjdCBBUEkuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByZWZlcmVuY2VNdXRhdG9yIHsKLSAgICAvKioKLSAgICAgKiBTZXRzIGEga2V5IGJpbmRpbmcgaW4gdGhlIGN1cnJlbnRseSBydW5uaW5nIEVjbGlwc2UgYXBwbGljYXRpb24uIEl0Ci0gICAgICogYWNjb21wbGlzaGVzIHRoaXMgYnkgd3JpdGluZyBvdXQgYW4gZXhwb3J0ZWQgcHJlZmVyZW5jZXMgZmlsZSBieSBoYW5kLAotICAgICAqIGFuZCB0aGVuIGltcG9ydGluZyBpdCBiYWNrIGludG8gdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21tYW5kSWQKLSAgICAgKiAgICAgICAgICAgVGhlIGNvbW1hbmQgaWRlbnRpZmllciB0byB3aGljaCB0aGUga2V5IGJpbmRpbmcgc2hvdWxkIGJlCi0gICAgICogICAgICAgICAgIGFzc29jaWF0ZWQ7IHNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHBhcmFtIGtleVNlcXVlbmNlVGV4dAotICAgICAqICAgICAgICAgICBUaGUgdGV4dCBvZiB0aGUga2V5IHNlcXVlbmNlIGZvciB0aGlzIGtleSBiaW5kaW5nOyBtdXN0IG5vdCBiZQotICAgICAqICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgIElmIHRoZSBleHBvcnRlZCBwcmVmZXJlbmNlcyBmaWxlIGlzIGludmFsaWQgZm9yIHNvbWUgcmVhc29uLgotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICBJZiB0aGUgdGVtcG9yYXJ5IGZpbGUgaXMgcmVtb3ZlZCBiZWZvcmUgaXQgY2FuIGJlIHJlYWQgaW4uCi0gICAgICogICAgICAgICAgICAoV293KQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgIElmIHRoZSBjcmVhdGlvbiBvZiBvciB0aGUgd3JpdGluZyB0byB0aGUgdGVtcG9yYXJ5IGZpbGUgZmFpbHMKLSAgICAgKiAgICAgICAgICAgIGZvciBzb21lIHJlYXNvbi4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgdm9pZCBzZXRLZXlCaW5kaW5nKFN0cmluZyBjb21tYW5kSWQsIFN0cmluZyBrZXlTZXF1ZW5jZVRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldCB1cCB0aGUgcHJlZmVyZW5jZXMuCi0gICAgICAgIFByb3BlcnRpZXMgcHJlZmVyZW5jZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBTdHJpbmcga2V5ID0gIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC9vcmcuZWNsaXBzZS51aS5jb21tYW5kcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzPjxhY3RpdmVLZXlDb25maWd1cmF0aW9uLz48a2V5QmluZGluZyBjb21tYW5kSWQ9XCIiICsgY29tbWFuZElkICsgIlwiIGtleVNlcXVlbmNlPVwiIiArIGtleVNlcXVlbmNlVGV4dCArICJcIi8+PC9vcmcuZWNsaXBzZS51aS5jb21tYW5kcz4iOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgIHByZWZlcmVuY2VzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHBsdWdpbklkcyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0TmFtZXNwYWNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbklkcy5sZW5ndGg7IGkrKykgewotCQkJcHJlZmVyZW5jZXMucHV0KHBsdWdpbklkc1tpXSwgbmV3IFBsdWdpblZlcnNpb25JZGVudGlmaWVyKAotCQkJCQkoU3RyaW5nKSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWRzW2ldKS5nZXRIZWFkZXJzKCkuZ2V0KAotCQkJCQkJCW9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHMuQlVORExFX1ZFUlNJT04pKSk7Ci0JCX0KLQotICAgICAgICAvLyBFeHBvcnQgdGhlIHByZWZlcmVuY2VzLgotICAgICAgICBGaWxlIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJwcmVmZXJlbmNlcyIsICIudHh0Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0gICAgICAgIGZpbGUuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSk7Ci0gICAgICAgIHByZWZlcmVuY2VzLnN0b3JlKGJvcywgbnVsbCk7Ci0gICAgICAgIGJvcy5jbG9zZSgpOwotCi0gICAgICAgIC8vIEF0dGVtcHQgdG8gaW1wb3J0IHRoZSBrZXkgYmluZGluZy4KLSAgICAgICAgUHJlZmVyZW5jZXMuaW1wb3J0UHJlZmVyZW5jZXMobmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9rZXlzL1Rlc3RCaW5kaW5nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvVGVzdEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlZDc3Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL2tleXMvVGVzdEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMua2V5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQ29tbWFuZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuUGFyYW1ldGVyaXplZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlV0aWw7Ci0KLS8qKgotICogQSBiaW5kaW5nIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuIFRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZQotICogcHJvcGVydGllcyB0ZXN0ZWQgYXJlIGluaGVyZW50IHRvIGFsbCBiaW5kaW5ncywgYW5kIG5vdCBqdXN0IGEgc3BlY2lmaWMgdHlwZQotICogb2YgYmluZGluZ3MuCi0gKi8KLWZpbmFsIGNsYXNzIFRlc3RCaW5kaW5nIGV4dGVuZHMgQmluZGluZyB7Ci0KLQkvKioKLQkgKiBBIHNpbXBsZSB0cmlnZ2VyIHNlcXVlbmNlIGZvciB0aGlzIHRlc3QuCi0JICovCi0Jc3RhdGljIGZpbmFsIGNsYXNzIFRlc3RUcmlnZ2VyU2VxdWVuY2UgZXh0ZW5kcyBUcmlnZ2VyU2VxdWVuY2UgewotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPlRlc3RUcmlnZ2VyU2VxdWVuY2U8L2NvZGU+LgotCQkgKiAKLQkJICogQHBhcmFtIG15VHJpZ2dlcnMKLQkJICogICAgICAgICAgICBUaGUgdHJpZ2dlcnMgdG8gdXNlIGluIGNvbnN0cnVjdGluZyB0aGlzIHNlcXVlbmNlOyBtdXN0Ci0JCSAqICAgICAgICAgICAgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCQkgKi8KLQkJcHVibGljIFRlc3RUcmlnZ2VyU2VxdWVuY2UoKSB7Ci0JCQlzdXBlcihuZXcgVHJpZ2dlclswXSk7Ci0JCX0KLQotCQlwdWJsaWMgZmluYWwgU3RyaW5nIGZvcm1hdCgpIHsKLQkJCXJldHVybiB0b1N0cmluZygpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyU2VxdWVuY2UjZ2V0UHJlZml4ZXMoKQotCQkgKi8KLQkJcHVibGljIFRyaWdnZXJTZXF1ZW5jZVtdIGdldFByZWZpeGVzKCkgewotCQkJcmV0dXJuIG5ldyBUcmlnZ2VyU2VxdWVuY2VbMF07Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIGNvbW1hbmQgbWFuYWdlciB0byB1c2UgZm9yIGNyZWF0aW5nIGNvbW1hbmRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyID0gbmV3IENvbW1hbmRNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBBIHRyaWdnZXIgc2VxdWVuY2UgdG8gYmUgdXNlZCBieSBhbGwgdGVzdCBiaW5kaW5ncy4gVGhpcyB2YWx1ZSBpcyBuZXZlcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXN0YXRpYyBmaW5hbCBUcmlnZ2VyU2VxdWVuY2UgVFJJR0dFUl9TRVFVRU5DRSA9IG5ldyBUZXN0VHJpZ2dlclNlcXVlbmNlKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPlRlc3RCaW5kaW5nPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kSWQKLQkgKiAgICAgICAgICAgIFRoZSBjb21tYW5kIGlkCi0JICogQHBhcmFtIHNjaGVtZUlkCi0JICogICAgICAgICAgICBUaGUgc2NoZW1lIGlkCi0JICogQHBhcmFtIGNvbnRleHRJZAotCSAqICAgICAgICAgICAgVGhlIGNvbnRleHQgaWQKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBUaGUgbG9jYWxlCi0JICogQHBhcmFtIHBsYXRmb3JtCi0JICogICAgICAgICAgICBUaGUgcGxhdGZvcm0KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgVGhlIHR5cGU6IFNZU1RFTSBvciBVU0VSCi0JICogQHBhcmFtIHBhcmFtYXRlcml6YXRpb25zCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycwotCSAqLwotCVRlc3RCaW5kaW5nKGZpbmFsIFN0cmluZyBjb21tYW5kSWQsIGZpbmFsIFN0cmluZyBzY2hlbWVJZCwKLQkJCWZpbmFsIFN0cmluZyBjb250ZXh0SWQsIGZpbmFsIFN0cmluZyBsb2NhbGUsIGZpbmFsIFN0cmluZyBwbGF0Zm9ybSwKLQkJCWZpbmFsIGludCB0eXBlLCBmaW5hbCBQYXJhbWV0ZXJpemF0aW9uW10gcGFyYW1ldGVyaXphdGlvbnMpIHsKLQkJc3VwZXIoKGNvbW1hbmRJZCA9PSBudWxsKSA/IG51bGwgOiBuZXcgUGFyYW1ldGVyaXplZENvbW1hbmQoCi0JCQkJY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZChjb21tYW5kSWQpLCBwYXJhbWV0ZXJpemF0aW9ucyksCi0JCQkJc2NoZW1lSWQsIGNvbnRleHRJZCwgbG9jYWxlLCBwbGF0Zm9ybSwgbnVsbCwgdHlwZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nI2dldFRyaWdnZXJTZXF1ZW5jZSgpCi0JICovCi0JcHVibGljIGZpbmFsIFRyaWdnZXJTZXF1ZW5jZSBnZXRUcmlnZ2VyU2VxdWVuY2UoKSB7Ci0JCXJldHVybiBUUklHR0VSX1NFUVVFTkNFOwotCX0KLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBVdGlsLlpFUk9fTEVOR1RIX1NUUklORzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9sZWFrcy9MZWFrVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbGVha3MvTGVha1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYjQ3ODcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9sZWFrcy9MZWFrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubGVha3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLlBoYW50b21SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVmVyeSBzaW1wbGUgbGVhayB0ZXN0cyB0byBkZXRlcm1pbmUgaWYgYW55IG9mIG91ciBoZWF2eSBvYmplY3RzIGFyZSBub3QgYmVpbmcKLSAqIGRpc3Bvc2VkIHByb3Blcmx5LiBOb3RlIHRoYXQgdGhlIHJlc3VsdHMgb2YgdGhlc2UgdGVzdHMgd2lsbCBpbiBubyB3YXkKLSAqIGFjdHVhbGx5IGFzc2lzdCB5b3UgaW4gdHJhY2tpbmcgZG93biB0aGUgbGVhay4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgTGVha1Rlc3RzIGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBmQWN0aXZlUGFnZTsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyBmV2luOwotCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lCi0gICAgICovCi0gICAgcHVibGljIExlYWtUZXN0cyhTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1JlZihSZWZlcmVuY2VRdWV1ZSBxdWV1ZSwgUmVmZXJlbmNlIHJlZikKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBmbGFnID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICAgICAgICAgIFN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKLSAgICAgICAgICAgIFN5c3RlbS5nYygpOwotICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7Ci0gICAgICAgICAgICBwcm9jZXNzRXZlbnRzKCk7Ci0gICAgICAgICAgICBSZWZlcmVuY2UgY2hlY2tSZWYgPSBxdWV1ZS5yZW1vdmUoMTAwKTsKLSAgICAgICAgICAgIGlmIChjaGVja1JlZiAhPSBudWxsICYmIGNoZWNrUmVmLmVxdWFscyhyZWYpKSB7Ci0gICAgICAgICAgICAgICAgZmxhZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCJSZWZlcmVuY2Ugbm90IGVucXVldWVkIiwgZmxhZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHF1ZXVlCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFJlZmVyZW5jZSBjcmVhdGVSZWZlcmVuY2UoUmVmZXJlbmNlUXVldWUgcXVldWUsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQaGFudG9tUmVmZXJlbmNlKG9iamVjdCwgcXVldWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICBmV2luID0gb3BlblRlc3RXaW5kb3coSURFLlJFU09VUkNFX1BFUlNQRUNUSVZFX0lEKTsKLSAgICAgICAgZkFjdGl2ZVBhZ2UgPSBmV2luLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvVGVhckRvd24oKTsKLSAgICAgICAgZldpbiA9IG51bGw7Ci0gICAgICAgIGZBY3RpdmVQYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKHByb2ogIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZVV0aWwuZGVsZXRlUHJvamVjdChwcm9qKTsKLSAgICAgICAgICAgIHByb2ogPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUVkaXRvckxlYWsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvaiA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoInRlc3RFZGl0b3JMZWFrcyIpOwotCi0gICAgICAgIElGaWxlIGZpbGUgPSBGaWxlVXRpbC5jcmVhdGVGaWxlKCJ0ZXN0Lm1vY2sxIiwgcHJvaik7Ci0KLSAgICAgICAgUmVmZXJlbmNlUXVldWUgcXVldWUgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIGZpbGUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkaXRvcik7Ci0gICAgICAgIFJlZmVyZW5jZSByZWYgPSBjcmVhdGVSZWZlcmVuY2UocXVldWUsIGVkaXRvcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmQWN0aXZlUGFnZS5jbG9zZUVkaXRvcihlZGl0b3IsIGZhbHNlKTsKLSAgICAgICAgICAgIGVkaXRvciA9IG51bGw7Ci0gICAgICAgICAgICBjaGVja1JlZihxdWV1ZSwgcmVmKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlZi5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVZpZXdMZWFrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlZmVyZW5jZVF1ZXVlIHF1ZXVlID0gbmV3IFJlZmVyZW5jZVF1ZXVlKCk7Ci0gICAgICAgIElWaWV3UGFydCB2aWV3ID0gZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoTW9ja1ZpZXdQYXJ0LklEKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2aWV3KTsKLSAgICAgICAgUmVmZXJlbmNlIHJlZiA9IGNyZWF0ZVJlZmVyZW5jZShxdWV1ZSwgdmlldyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZBY3RpdmVQYWdlLmhpZGVWaWV3KHZpZXcpOwotICAgICAgICAgICAgdmlldyA9IG51bGw7Ci0gICAgICAgICAgICBjaGVja1JlZihxdWV1ZSwgcmVmKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlZi5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIE5vIGlkZWEgd2h5IHRoZSBmb2xsb3dpbmcgdGVzdCBpcyBmYWlsaW5nLiAgRG91ZyBoYXMgcmFuIHRoaXMgdGhyb3VnaCBhIAotICAgICAgICogcHJvZmlsZXIgYW5kIGZvciBzb21lIHJlYXNvbiB0aGUgd2luZG93IGp1c3QgaXNuJ3QgYmVpbmcgR0NkIGRlc3BpdGUgCi0gICAgICAgKiB0aGVyZSBub3QgYmVpbmcgbmF5IGluY29taW5nIHJlZmVyZW5jZXMuCi0gICAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVXaW5kb3dMZWFrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgLy90dXJuIG9mZiB3aW5kb3cgbWFuYWdlbWVudCBzbyB0aGF0IHdlIGRvbnQgaGF2ZSBhIHJlZmVyZW5jZSB0byBvdXIKLS8vICAgICAgICAvLyBuZXcKLS8vICAgICAgICAvL3dpbmRvdyBpbiB0aGUgbGlzdGVuZXIKLS8vICAgICAgICBtYW5hZ2VXaW5kb3dzKGZhbHNlKTsKLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBSZWZlcmVuY2VRdWV1ZSBxdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOwotLy8gICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IG5ld1dpbmRvdyA9IG9wZW5UZXN0V2luZG93KCk7Ci0vLwotLy8gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG5ld1dpbmRvdyk7Ci0vLyAgICAgICAgICAgIFJlZmVyZW5jZSByZWYgPSBjcmVhdGVSZWZlcmVuY2UocXVldWUsIG5ld1dpbmRvdyk7Ci0vLyAgICAgICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgICAgICBuZXdXaW5kb3cuY2xvc2UoKTsKLS8vICAgICAgICAgICAgICAgIG5ld1dpbmRvdyA9IG51bGw7Ci0vLyAgICAgICAgICAgICAgICBjaGVja1JlZihxdWV1ZSwgcmVmKTsKLS8vICAgICAgICAgICAgfSBmaW5hbGx5IHsKLS8vICAgICAgICAgICAgICAgIHJlZi5jbGVhcigpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfSBmaW5hbGx5IHsKLS8vICAgICAgICAgICAgbWFuYWdlV2luZG93cyh0cnVlKTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgbGVha3MgaWYgZGlhbG9nIGlzIGRpc3Bvc2VkIGJlZm9yZSBpdCBpcyBjbG9zZWQuCi0gICAgICogVGhpcyBpcyByZWFsbHkgdGVzdGluZyB0aGUgZnJhbWV3b3JrIHJhdGhlciB0aGFuIGluZGl2aWR1YWwKLSAgICAgKiBkaWFsb2dzLCBzaW5jZSBtYW55IGRpYWxvZ3Mgb3Igd2luZG93cyB3aWxsIGZhaWwgaWYgdGhlIHNoZWxsCi0gICAgICogaXMgZGVzdHJveWVkIHByaW9yIHRvIGNsb3NpbmcgdGhlbS4KLSAgICAgKiBTZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjMyOTYKLSAgICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdERlc3Ryb3llZERpYWxvZ0xlYWtzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICBSZWZlcmVuY2VRdWV1ZSBxdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOwotCSAgLy8gVXNlIFNhdmVBcyBkaWFsb2cgYmVjYXVzZSBpdCdzIHNpbXBsZSB0byBpbnZva2UgYW5kIHV0aWxpemVzCi0JICAvLyBmcmFtZXdvcmsgZnVuY3Rpb24gc3VjaCBhcyBzdG9yaW5nIGRpYWxvZyBib3VuZHMuICAKLQkgIC8vIFdlIGFyZSByZWFsbHkgdGVzdGluZyB0aGUgZnJhbWV3b3JrIGl0c2VsZiBoZXJlLgotCSAgRGlhbG9nIG5ld0RpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coZldpbi5nZXRTaGVsbCgpKTsKLSAgICAgIG5ld0RpYWxvZy5zZXRCbG9ja09uT3BlbihmYWxzZSk7Ci0gICAgICBuZXdEaWFsb2cub3BlbigpOwotICAgICAgYXNzZXJ0Tm90TnVsbChuZXdEaWFsb2cpOwotICAgICAgUmVmZXJlbmNlIHJlZiA9IGNyZWF0ZVJlZmVyZW5jZShxdWV1ZSwgbmV3RGlhbG9nKTsKLSAgICAgIHRyeSB7Ci0gICAgICAJICAvLyBEaXNwb3NlIHRoZSB3aW5kb3cgYmVmb3JlIGNsb3NpbmcgaXQuICAKLSAgICAgICAJICBuZXdEaWFsb2cuZ2V0U2hlbGwoKS5kaXNwb3NlKCk7Ci0gICAgICAgCSAgbmV3RGlhbG9nLmNsb3NlKCk7Ci0gICAgICAgCSAgbmV3RGlhbG9nID0gbnVsbDsKLSAgICAgICAgICBjaGVja1JlZihxdWV1ZSwgcmVmKTsKLSAgICAgIH0gZmluYWxseSB7Ci0gICAgCSAgcmVmLmNsZWFyKCk7Ci0gICAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFudWFsL0Jyb2tlblVwZGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21hbnVhbC9Ccm9rZW5VcGRhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWQwY2M2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFudWFsL0Jyb2tlblVwZGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm1hbnVhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC51dGlsLlByZWZVdGlsOwotCi0vKioKLSAqIFRoaXMgaXMgYSB0ZXN0IHByZWZlcmVuY2UgcGFnZSBkZXNpZ25lZCB0bwotICogZ2VuZXJhdGUgZXJyb3JzIG9uIHVwZGF0ZQotICovCi1wdWJsaWMgY2xhc3MgQnJva2VuVXBkYXRlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0gICAgICAgIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLSAgICBwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJhZExpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAvL0ludGVudGlvbmFsbHkgZ2VuZXJhdGUgYW4gZXJyb3IKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0cmluZ3NbMl0pOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIEZvbnREYXRhW10gZGF0YTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhDb21wb3NpdGUpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIGRhdGEgPSBwYXJlbnQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICBCdXR0b24gZm9udEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgIGZvbnRCdXR0b24uc2V0VGV4dCgiVXBkYXRlIEZvbnQiKTsKLSAgICAgICAgZm9udEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlRm9udCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNoYW5nZUZvbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQnV0dG9uIHByZWZlcmVuY2VQbHVnaW5CdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICBwcmVmZXJlbmNlUGx1Z2luQnV0dG9uLnNldFRleHQoIlVwZGF0ZSBQbHVnaW4gUHJlZmVyZW5jZXMiKTsKLSAgICAgICAgcHJlZmVyZW5jZVBsdWdpbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlUGx1Z2luUHJlZmVyZW5jZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNoYW5nZVBsdWdpblByZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQnV0dG9uIHByZWZlcmVuY2VCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICBwcmVmZXJlbmNlQnV0dG9uLnNldFRleHQoIlVwZGF0ZSBEaWFsb2cgUHJlZmVyZW5jZXMiKTsKLSAgICAgICAgcHJlZmVyZW5jZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlUGx1Z2luUHJlZmVyZW5jZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNoYW5nZVBsdWdpblByZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1dHRvbkNvbXBvc2l0ZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQoSVdvcmtiZW5jaCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0KLSAgICAgICAgSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuYWRkTGlzdGVuZXIoYmFkTGlzdGVuZXIpOwotCi0gICAgICAgIFByZWZVdGlsLmdldEludGVybmFsUHJlZmVyZW5jZVN0b3JlKCkKLSAgICAgICAgICAgICAgICAuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihiYWRMaXN0ZW5lcik7Ci0KLSAgICB9Ci0KLSAgICAvKioJCi0gICAgICogc2VlQERpYWxvZ1BhZ2UuZGlzcG9zZSgpOwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkucmVtb3ZlTGlzdGVuZXIoYmFkTGlzdGVuZXIpOwotCi0gICAgICAgIFByZWZVdGlsLmdldEludGVybmFsUHJlZmVyZW5jZVN0b3JlKCkKLSAgICAgICAgICAgICAgICAucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihiYWRMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hhbmdlRm9udCgpIHsKLSAgICAgICAgSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkucHV0KCJGQUtPIiwgZGF0YSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hhbmdlUGx1Z2luUHJlZmVyZW5jZSgpIHsKLSAgICAgICAgUHJlZlV0aWwuZ2V0SW50ZXJuYWxQcmVmZXJlbmNlU3RvcmUoKS5maXJlUHJvcGVydHlDaGFuZ2VFdmVudCgKLSAgICAgICAgICAgICAgICAiRkFLTyIsICJPbGQiLCAiTmV3Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hhbmdlUHJlZmVyZW5jZSgpIHsKLSAgICAgICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoIkZBS08iLCAiT2xkIiwgIk5ldyIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFudWFsL1VJUHJlZmVyZW5jZXNNYW51YWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFudWFsL1VJUHJlZmVyZW5jZXNNYW51YWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxMGFjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21hbnVhbC9VSVByZWZlcmVuY2VzTWFudWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubWFudWFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuZGlhbG9ncy5QcmVmZXJlbmNlRGlhbG9nV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5kaWFsb2dzLlVJUHJlZmVyZW5jZXNBdXRvOwotCi0vKioKLSAqIFRoZSBVSVByZWZlcmVuY2VzTWFudWFsIGlzIGEgdGVzdCBjYXNlIHRoYXQgcmVxdWlyZXMKLSAqIHRoZSB1c2VyIHRvIGNsaWNrIE9LIG9uIG1lc3NhZ2UgZGlhbG9nIHdoZW4gaXQgaXMKLSAqIHJ1bgotICovCi0KLXB1YmxpYyBjbGFzcyBVSVByZWZlcmVuY2VzTWFudWFsIGV4dGVuZHMgVUlQcmVmZXJlbmNlc0F1dG8gewotCi0gICAgcHVibGljIFVJUHJlZmVyZW5jZXNNYW51YWwoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGUgYmFkIHVwZGF0ZSBwcmVmZXJlbmNlIHBhZ2UgYnkgZ2VuZXJhdGluZyBhbGwKLSAgICAgKiBvZiB0aGUgZGlhbG9nIGVycm9ycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnJva2VuTGlzdGVuZXJQcmVmKCkgewotCi0gICAgICAgIFByZWZlcmVuY2VEaWFsb2dXcmFwcGVyIGRpYWxvZyA9IG51bGw7Ci0gICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldFByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRpYWxvZyA9IG5ldyBQcmVmZXJlbmNlRGlhbG9nV3JhcHBlcihnZXRTaGVsbCgpLCBtYW5hZ2VyKTsKLSAgICAgICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hbmFnZXIuZ2V0RWxlbWVudHMoCi0gICAgICAgICAgICAgICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyLlBSRV9PUkRFUikuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIElQcmVmZXJlbmNlTm9kZSBub2RlID0gKElQcmVmZXJlbmNlTm9kZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChub2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLnVpLnRlc3RzLm1hbnVhbC5Ccm9rZW5VcGRhdGVQcmVmZXJlbmNlUGFnZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zaG93UGFnZShub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgQnJva2VuVXBkYXRlUHJlZmVyZW5jZVBhZ2UgcGFnZSA9IChCcm9rZW5VcGRhdGVQcmVmZXJlbmNlUGFnZSkgZGlhbG9nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhZ2Uobm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhZ2UuY2hhbmdlRm9udCgpOwotICAgICAgICAgICAgICAgICAgICBwYWdlLmNoYW5nZVBsdWdpblByZWZlcmVuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9CdWc3NTkwOVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9CdWc3NTkwOVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyOWRkOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21hcmtlcnMvQnVnNzU5MDlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5tYXJrZXJzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5UZXN0TWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5Qcm9ibGVtRmlsdGVyOwotCi0vKioKLSAqIFRlc3RpbmcgZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NTkwOSAuCi0gKiBPbmx5IHRoZSBtYXJrZXIgSURzIG9mIHRoZSBzZWxlY3RlZCBmaWx0ZXJzIGFyZSBzYXZlZCBmb3IgdGhlIFByb2JsZW1zIHZpZXcuCi0gKiBJZiBhIG5ldyBwbHVnaW4gaXMgZGVwbG95ZWQgd2l0aCBhIG5ldyBNYXJrZXJUeXBlLCB3aGVuIHRoZSBzZXNzaW9uIAotICogcmVzdGFydHMgaXQgbG9va3MgbGlrZSBpdCB3YXMgInVuc2VsZWN0ZWQiIGZyb20gdGhlIGZpbHRlciBsaXN0LCBhbmQKLSAqIHNvIGl0IGRvZXNuJ3Qgc2hvdyB1cC4KLSAqIAotICogVGhlc2UgdGVzdHMgY292ZXIgcmVzdG9yaW5nIHN0YXRlIGZyb20gb2xkIGFuZCBuZXcgc2V0dGluZ3MgZmlsZXMuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWc3NTkwOVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0xEX1NFVFRJTkdTX1NFTEVDVEVEID0gNDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVEX01BUktFUl9JRCA9ICJvcmcuZWNsaXBzZS5wZGUudmFsaWRhdGlvbi1tYXJrZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVEX01BUktFUl9JRCA9ICJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX01BUktFUl9JRCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5wcm9ibGVtIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfRElBTE9HX1NFVFRJTkdTX1hNTCA9ICJvbGRfZGlhbG9nX3NldHRpbmdzLnhtbCI7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQnVnNzU5MDlUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBNYXJrZXJGaWx0ZXIucmVzZXRTdGF0ZSgpIHNob3VsZCBtYWtlIGFsbCBvZiB0aGUgYXZhaWxhYmxlCi0JICogTWFya2VyVHlwZXMgc2VsZWN0ZWQuICBUaGUganVzdCB0ZXN0cyB0aGF0IHRoZSBlbnZpcm9ubWVudAotCSAqIGhhcyBzb21lIGRhdGFmaWxsIGluIGl0LgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljRmlsdGVyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCVByb2JsZW1GaWx0ZXIgZmlsdGVyID0gbmV3IFByb2JsZW1GaWx0ZXIoIkJ1Zzc1OTA5VGVzdCIpOwotCQlmaWx0ZXIucmVzZXRTdGF0ZSgpOwotCi0JCUxpc3QgYWxsVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbHRlci5hZGRBbGxTdWJUeXBlcyhhbGxUeXBlcyk7Ci0JCWludCBudW1fdHlwZXMgPSBhbGxUeXBlcy5zaXplKCk7Ci0KLQkJLy8gdGhlcmUgYXJlIG1vcmUgdGhhbiA0IG1hcmtlciB0eXBlcyBpbiB0aGUgZGVmYXVsdCBlbnYuCi0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBtb3JlIHRoYW4gNCB0eXBlcyBpbiB0aGUgc3lzdGVtIiwKLQkJCQludW1fdHlwZXMgPiA0KTsKLQotCQkvLyBhZnRlciBhIHJlc2V0LCB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIHR5cGVzIHNob3VsZAotCQkvLyBlcXVhbCB0aGUgdG90YWwgbnVtYmVyIG9mIHR5cGVzLgotCQlhc3NlcnRFcXVhbHMobnVtX3R5cGVzLCBmaWx0ZXIuZ2V0U2VsZWN0ZWRUeXBlcygpLnNpemUoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXR0aW5ncyBjYW4gYmUgcmVzdG9yZWQgKGF0IGxlYXN0IG9uY2UgOi0pIGZyb20gdGhlIG9sZCBzZXR0aW5ncwotCSAqIGF0dHJpYnV0ZSBmb3JtYXQuICBBbnkgbWFya2VyIHR5cGUgbm90IGxpc3RlZCBpbiB0aGUgYXR0cmlidXRlCi0JICogd2lsbCBhcHBlYXIgYXMgbm90IHNlbGVjdGVkLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlc3RvcmVPbGRTdGF0ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgRGlhbG9nU2V0dGluZ3MoIldvcmtiZW5jaCIpOwotCQlsb2FkU2V0dGluZ3Moc2V0dGluZ3MsIEJ1Zzc1OTA5VGVzdC5PTERfRElBTE9HX1NFVFRJTkdTX1hNTCk7Ci0KLQkJUHJvYmxlbUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvYmxlbUZpbHRlcigiQnVnNzU5MDlUZXN0Iik7Ci0JCWZpbHRlci5yZXN0b3JlRmlsdGVyU2V0dGluZ3MoZ2V0RmlsdGVyU2V0dGluZ3Moc2V0dGluZ3MpKTsKLQotCQlMaXN0IHNlbGVjdGVkID0gZmlsdGVyLmdldFNlbGVjdGVkVHlwZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKEJ1Zzc1OTA5VGVzdC5PTERfU0VUVElOR1NfU0VMRUNURUQsIHNlbGVjdGVkLnNpemUoKSk7Ci0KLQkJTWFya2VyVHlwZSBtYXJrZXIgPSBnZXRUeXBlKGZpbHRlciwgQnVnNzU5MDlUZXN0LklOQ0xVREVEX01BUktFUl9JRCk7Ci0JCS8vIHRoaXMgd2FzIG1hcmtlZCBhcyBzZWxlY3RlZCBpbiB0aGUgb2xkIGF0dHJpYnV0ZQotCQlhc3NlcnRUcnVlKHNlbGVjdGVkLmNvbnRhaW5zKG1hcmtlcikpOwotCi0JCU1hcmtlclR5cGUgcmVtb3ZlZCA9IGdldFR5cGUoZmlsdGVyLCBCdWc3NTkwOVRlc3QuUkVNT1ZFRF9NQVJLRVJfSUQpOwotCQkvLyB0aGlzIHdhcyBtaXNzaW5nIGZyb20gdGhlIG9sZCBhdHRyaWJ1dGUsIHNvIGl0IHNob3VsZCBub3QgYmUKLQkJLy8gc2VsZWN0ZWQKLQkJYXNzZXJ0RmFsc2Uoc2VsZWN0ZWQuY29udGFpbnMocmVtb3ZlZCkpOwotCX0KLQotCS8qKgotCSAqIFdoZW4gcmVzdG9yaW5nIHNldHRpbmdzIGZyb20gdGhlIG5ldyBhdHRyaWJ1dGUsIGEgbWFya2VyIHR5cGUKLQkgKiBpZCB0aGF0IGlzIG5vdCB0cnVlIG9yIGZhbHNlIGhhcyBqdXN0IGJlZW4gaW50cm9kdWNlZC4gIFRlc3QgdGhhdAotCSAqIHRoZSBuZXcgbWFya2VyIHR5cGUgc2hvd3MgdXAgYXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzdG9yZU5ld1N0YXRlTWlzc2luZ0lkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlNZW1lbnRvIHNldHRpbmdzID0gY3JlYXRlTWlzc2luZ01lbWVudG8oKTsKLQotCQlQcm9ibGVtRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9ibGVtRmlsdGVyKCJCdWc3NTkwOVRlc3QiKTsKLQkJZmlsdGVyLnJlc3RvcmVTdGF0ZShzZXR0aW5ncyk7Ci0KLQkJTGlzdCBpbmNsdWRlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmlsdGVyLmFkZEFsbFN1YlR5cGVzKGluY2x1ZGVkKTsKLQkJCi0JCUxpc3Qgc2VsZWN0ZWQgPSBmaWx0ZXIuZ2V0U2VsZWN0ZWRUeXBlcygpOwotCQlhc3NlcnRFcXVhbHMoaW5jbHVkZWQuc2l6ZSgpIC0gMSwgc2VsZWN0ZWQuc2l6ZSgpKTsKLQotCQlNYXJrZXJUeXBlIG1hcmtlciA9IGdldFR5cGUoZmlsdGVyLCBCdWc3NTkwOVRlc3QuSU5DTFVERURfTUFSS0VSX0lEKTsKLQkJLy8gd2FzIGluIHRoZSBmaWxlIGFzIHRydWUsIHNvIGl0IHNob3VsZCBiZSBzZWxlY3RlZC4KLQkJYXNzZXJ0VHJ1ZShzZWxlY3RlZC5jb250YWlucyhtYXJrZXIpKTsKLQotCQlNYXJrZXJUeXBlIHJlbW92ZWQgPSBnZXRUeXBlKGZpbHRlciwgQnVnNzU5MDlUZXN0LlJFTU9WRURfTUFSS0VSX0lEKTsKLQkJLy8gd2FzIGluIHRoZSBmaWxlIGFzIGZhbHNlLCBzbyBpdCB3b24ndCBiZSBzZWxlY3RlZC4KLQkJYXNzZXJ0RmFsc2Uoc2VsZWN0ZWQuY29udGFpbnMocmVtb3ZlZCkpOwotCi0JCU1hcmtlclR5cGUgbWlzc2luZyA9IGdldFR5cGUoZmlsdGVyLCBCdWc3NTkwOVRlc3QuTUlTU0lOR19NQVJLRVJfSUQpOwotCQkvLyB3YXMgbWlzc2luZyBmcm9tIHRoZSBmaWxlLCBzbyBpdCBzaG91bGQgYmUgc2VsZWN0ZWQuCi0JCWFzc2VydFRydWUoc2VsZWN0ZWQuY29udGFpbnMobWlzc2luZykpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBtaXNzaW5nIG1lbWVudG8gdGhhdCBpcyBtaXNzaW5nIGl0J3MgbmFtZS4KLQkgKiBAcmV0dXJuIElNZW1lbnRvCi0JICovCi0JcHJpdmF0ZSBJTWVtZW50byBjcmVhdGVNaXNzaW5nTWVtZW50bygpIHsKLQkJVGVzdE1lbWVudG8gbWVtZW50byA9IG5ldyBUZXN0TWVtZW50bygiZmlsdGVyIiwiRmlsdGVyIFRlc3QiKTsKLQkJbWVtZW50by5wdXRTdHJpbmcoInNlbGVjdEJ5U2V2ZXJpdHkiLCJmYWxzZSIpOwotCQltZW1lbnRvLnB1dFN0cmluZygiY29udGFpbnMiLCJ0cnVlIik7Ci0JCW1lbWVudG8ucHV0U3RyaW5nKCJlbmFibGVkIiwidHJ1ZSIpOwotCQltZW1lbnRvLnB1dEludGVnZXIoInNldmVyaXR5IiwwKTsKLQkJbWVtZW50by5wdXRTdHJpbmcoImRlc2NyaXB0aW9uIiwiIik7Ci0JCW1lbWVudG8ucHV0U3RyaW5nKCJmaWx0ZXJPbk1hcmtlckxpbWl0IiwidHJ1ZSIpOwotCQltZW1lbnRvLnB1dFN0cmluZygic2VsZWN0aW9uU3RhdHVzIiAsIm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2JsZW1tYXJrZXI6dHJ1ZTpvcmcuZWNsaXBzZS5wZGUudmFsaWRhdGlvbi1tYXJrZXI6ZmFsc2U6b3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRwYXRoX3Byb2JsZW06dHJ1ZTpvcmcuZWNsaXBzZS5hbnQudWkuYnVpbGRGaWxlUHJvYmxlbTp0cnVlOiIpOwotCQltZW1lbnRvLnB1dEludGVnZXIoIm9uUmVzb3VyY2UiLDApOwotCQlyZXR1cm4gbWVtZW50bzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNldHRpbmdzIGZvciB0aGUgZmlsdGVyIHRhZy4KLQkgKiBAcGFyYW0gc2V0dGluZ3MKLQkgKiBAcmV0dXJuIElEaWFsb2dTZXR0aW5ncwotCSAqLwotCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIGdldEZpbHRlclNldHRpbmdzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncykgewotCQlyZXR1cm4gc2V0dGluZ3MuZ2V0U2VjdGlvbigiZmlsdGVyIik7Ci0JfQotCi0JLyoqCi0JICogTWFya2VyRmlsdGVyLnNhdmVTdGF0ZShJRGlhbG9nU2V0dGluZ3MpIHNob3VsZCBub3cgc2F2ZSBzZWxlY3RlZAotCSAqIHR5cGVzIHdpdGggPGI+dHJ1ZTwvYj4gYW5kIHVuc2VsZWN0ZWQgdHlwZXMgYXJlIG5vdyBzYXZlZCB0byB0aGUKLQkgKiBsaXN0IHdpdGggPGI+ZmFsc2U8L2I+LiAgVGhpcyBpcyBhbiAiaWRlbnRpdHkgdHJhbnNmb3JtIiB0ZXN0LgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNhdmVTdGF0ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQlQcm9ibGVtRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9ibGVtRmlsdGVyKCJCdWc3NTkwOVRlc3QiKTsKLQkJZmlsdGVyLnJlc2V0U3RhdGUoKTsKLQotCQlMaXN0IGFsbFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmaWx0ZXIuYWRkQWxsU3ViVHlwZXMoYWxsVHlwZXMpOwotCi0JCU1hcmtlclR5cGUgcmVtb3ZlZCA9IGdldFR5cGUoZmlsdGVyLCBCdWc3NTkwOVRlc3QuUkVNT1ZFRF9NQVJLRVJfSUQpOwotCQkKLQkJZmlsdGVyLmdldFNlbGVjdGVkVHlwZXMoKS5yZW1vdmUocmVtb3ZlZCk7Ci0JCS8vIHRoZXJlIHNob3VsZCBiZSBvbmUgbGVzcyBzZWxlY3QgdHlwZSB0aGFuIGFsbCBvZiB0aGUgdHlwZXMuCi0JCWFzc2VydEVxdWFscyhhbGxUeXBlcy5zaXplKCkgLSAxLCBmaWx0ZXIuZ2V0U2VsZWN0ZWRUeXBlcygpLnNpemUoKSk7Ci0KLQkJSU1lbWVudG8gc2V0dGluZ3MgPSBuZXcgVGVzdE1lbWVudG8oIlRlc3QiLCJCdWc3NTkwOVRlc3QiKTsKLQkJZmlsdGVyLnNhdmVGaWx0ZXJTZXR0aW5ncyhzZXR0aW5ncyk7Ci0KLQkJUHJvYmxlbUZpbHRlciBmMiA9IG5ldyBQcm9ibGVtRmlsdGVyKCJCdWc3NTkwOVRlc3QiKTsKLQkJZjIucmVzdG9yZVN0YXRlKHNldHRpbmdzKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmaWx0ZXIuZ2V0U2VsZWN0ZWRUeXBlcygpLnNpemUoKSwKLQkJCQlmMi5nZXRTZWxlY3RlZFR5cGVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZjIuZ2V0U2VsZWN0ZWRUeXBlcygpLmNvbnRhaW5zKHJlbW92ZWQpKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBsb2FkU2V0dGluZ3MoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzLCBTdHJpbmcgcmVzb3VyY2UpCi0JCQl0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbyA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZSk7Ci0JCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCQlpbywgInV0Zi04IikpOwotCQkJc2V0dGluZ3MubG9hZChyZWFkZXIpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlvICE9IG51bGwpIHsKLQkJCQlpby5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBNYXJrZXJUeXBlIGdldFR5cGUoUHJvYmxlbUZpbHRlciBmaWx0ZXIsIFN0cmluZyBpZCkgewotCQlyZXR1cm4gZmlsdGVyLmdldE1hcmtlclR5cGUoaWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tYXJrZXJzL0RlY2xhcmF0aXZlRmlsdGVyQWN0aXZpdHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21hcmtlcnMvRGVjbGFyYXRpdmVGaWx0ZXJBY3Rpdml0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliNjkwYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21hcmtlcnMvRGVjbGFyYXRpdmVGaWx0ZXJBY3Rpdml0eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubWFya2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuUHJvYmxlbUZpbHRlcjsKLQotcHVibGljIGNsYXNzIERlY2xhcmF0aXZlRmlsdGVyQWN0aXZpdHlUZXN0IGV4dGVuZHMgRGVjbGFyYXRpdmVGaWx0ZXJUZXN0IHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9GSUxURVJfVEVTVF9BQ1RJVklUWSA9ICJwcm9ibGVtRmlsdGVyVGVzdEFjdGl2aXR5IjsKLQotCS8qKgotCSAqIFRoZSBEZWNsYXJhdGl2ZVByb2JsZW1UZXN0IGlzIGEgdGVzdCBvZiB0aGUgZGVjbGFyYXRpdmUgZmlsdGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVzdE5hbWUKLQkgKi8KLQlwdWJsaWMgRGVjbGFyYXRpdmVGaWx0ZXJBY3Rpdml0eVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0aGF0IHRoZSBhY3Rpdml0aWVzIGFyZSBlbmFibGluZyBhcyBleHBlY3RlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlFbmFibGVtZW50KCkgewotCQllbmFibGVGaWx0ZXJBY3Rpdml0eSgpOwotCQkKLQkJY2hlY2tGaWx0ZXJlZE91dChmYWxzZSk7Ci0JCQotCQlkaXNhYmxlRmlsdGVyQWN0aXZpdHkoKTsKLQkJY2hlY2tGaWx0ZXJlZE91dCh0cnVlKTsKLQkJZW5hYmxlRmlsdGVyQWN0aXZpdHkoKTsKLQotCX0KLQotCS8qKgotCSAqIENoZWNrIHRoYXQgYWxsIG9mIHRoZSBmaWx0ZXJzIG1hdGNoIGZpbHRlcmVkT3V0LgotCSAqIEBwYXJhbSBmaWx0ZXJlZE91dAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0ZpbHRlcmVkT3V0KGJvb2xlYW4gZmlsdGVyZWRPdXQpIHsKLQkJU3RyaW5nW10gYWxsRmlsdGVyTmFtZXMgPSBnZXRBbGxGaWx0ZXJOYW1lcygpOwotCQlTdHJpbmcgZmFpbHVyZU1lc3NhZ2UgPSBmaWx0ZXJlZE91dCA/ICIgc2hvdWxkIGJlIGZpbHRlcmVkIG91dCIgOiAiIHNob3VsZCBub3QgYmUgZmlsdGVyZWQgb3V0IjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxGaWx0ZXJOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJUHJvYmxlbUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoYWxsRmlsdGVyTmFtZXNbaV0pOwotCQkJaWYoZmlsdGVyZWRPdXQpCi0JCQkJYXNzZXJ0TnVsbCgiU2hvdWxkIGZpbHRlciBvdXQgIiArIGFsbEZpbHRlck5hbWVzW2ldICxmaWx0ZXIpOwotCQkJZWxzZXsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGZpbHRlciBmb3IgIiArIGFsbEZpbHRlck5hbWVzW2ldICxmaWx0ZXIpOwotCQkJYXNzZXJ0VHJ1ZShhbGxGaWx0ZXJOYW1lc1tpXSArIGZhaWx1cmVNZXNzYWdlLCBmaWx0ZXIuaXNGaWx0ZXJlZE91dEJ5QWN0aXZpdHkoKSA9PSBmaWx0ZXJlZE91dCk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogRW5hYmxlIHRoZSBhY3Rpdml0eSBmb3IgdGhlIGRlY2xhcmF0aXZlIGZpbHRlcnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUZpbHRlckFjdGl2aXR5KCkgewotCQlJQWN0aXZpdHkgYWN0aXZpdHkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2aXR5U3VwcG9ydCgpCi0JCQkJLmdldEFjdGl2aXR5TWFuYWdlcigpLmdldEFjdGl2aXR5KFBST0JMRU1fRklMVEVSX1RFU1RfQUNUSVZJVFkpOwotCQlTZXQgZW5hYmxlZEFjdGl2aXR5SWRzID0gbmV3IEhhc2hTZXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3Rpdml0eVN1cHBvcnQoKS5nZXRBY3Rpdml0eU1hbmFnZXIoKQotCQkJCS5nZXRFbmFibGVkQWN0aXZpdHlJZHMoKSk7Ci0JCQotCQlpZiAoIWVuYWJsZWRBY3Rpdml0eUlkcy5jb250YWlucyhhY3Rpdml0eS5nZXRJZCgpKSkKLQkJCWVuYWJsZWRBY3Rpdml0eUlkcy5hZGQoYWN0aXZpdHkuZ2V0SWQoKSk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2aXR5U3VwcG9ydCgpLnNldEVuYWJsZWRBY3Rpdml0eUlkcygKLQkJCQllbmFibGVkQWN0aXZpdHlJZHMpOwotCX0KLQkKLQkvKioKLQkgKiBEaXNhYmxlIHRoZSBhY3Rpdml0eSBmb3IgdGhlIGRlY2xhcmF0aXZlIGZpbHRlcnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc2FibGVGaWx0ZXJBY3Rpdml0eSgpIHsKLQkJSUFjdGl2aXR5IGFjdGl2aXR5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKQotCQkJCS5nZXRBY3Rpdml0eU1hbmFnZXIoKS5nZXRBY3Rpdml0eShQUk9CTEVNX0ZJTFRFUl9URVNUX0FDVElWSVRZKTsKLQkJU2V0IGVuYWJsZWRBY3Rpdml0eUlkcyA9IG5ldyBIYXNoU2V0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkuZ2V0QWN0aXZpdHlNYW5hZ2VyKCkKLQkJCQkuZ2V0RW5hYmxlZEFjdGl2aXR5SWRzKCkpOwotCQkKLQkJaWYgKGVuYWJsZWRBY3Rpdml0eUlkcy5jb250YWlucyhhY3Rpdml0eS5nZXRJZCgpKSkKLQkJCWVuYWJsZWRBY3Rpdml0eUlkcy5yZW1vdmUoYWN0aXZpdHkuZ2V0SWQoKSk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2aXR5U3VwcG9ydCgpLnNldEVuYWJsZWRBY3Rpdml0eUlkcygKLQkJCQllbmFibGVkQWN0aXZpdHlJZHMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tYXJrZXJzL0RlY2xhcmF0aXZlRmlsdGVyRGVjbGFyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21hcmtlcnMvRGVjbGFyYXRpdmVGaWx0ZXJEZWNsYXJhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlOGI2NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21hcmtlcnMvRGVjbGFyYXRpdmVGaWx0ZXJEZWNsYXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubWFya2VyczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLlByb2JsZW1GaWx0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBEZWNsYXJhdGl2ZUZpbHRlckRlY2xhcmF0aW9uVGVzdCBleHRlbmRzIERlY2xhcmF0aXZlRmlsdGVyVGVzdCB7Ci0KLQkvKioKLQkgKiBUaGUgRGVjbGFyYXRpdmVGaWx0ZXJBY3Rpdml0eVRlc3QgaXMgYSB0ZXN0IHRoYXQgdGhlCi0JICogZGVjbGFyYXRpdmUgZmlsdGVycyBhcmUgcmVtb3ZlZCBieSBhY3Rpdml0aWVzCi0JICogCi0JICogQHBhcmFtIHRlc3ROYW1lCi0JICovCi0JcHVibGljIERlY2xhcmF0aXZlRmlsdGVyRGVjbGFyYXRpb25UZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdGhlIGZpbHRlciBvbiBhbnkgZXJyb3IuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEFueUVycm9yRmlsdGVyKCkgewotCQlTdHJpbmcgZmlsdGVyTmFtZSA9IFBST0JMRU1fVEVTVF9PTl9BTllfRVJST1I7Ci0JCVByb2JsZW1GaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKGZpbHRlck5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbHRlck5hbWUgKyAiIG5vdCBmb3VuZCAiLCBmaWx0ZXIgIT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoZmlsdGVyTmFtZSArICIgaXMgbm90IGVuYWJsZWQgIiwgZmlsdGVyLmlzRW5hYmxlZCgpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJOYW1lICsgIm5vdCBzZWxlY3RpbmcgYnkgc2V2ZXJpdHkiLCBmaWx0ZXIKLQkJCQkuZ2V0U2VsZWN0QnlTZXZlcml0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJOYW1lICsgInNob3VsZCBiZSBvbiBlcnJvciIsCi0JCQkJZmlsdGVyLmdldFNldmVyaXR5KCkgPT0gUHJvYmxlbUZpbHRlci5TRVZFUklUWV9FUlJPUik7Ci0JCWFzc2VydFRydWUoZmlsdGVyTmFtZSArICJzaG91bGQgYmUgb24gYW55IiwKLQkJCQlmaWx0ZXIuZ2V0T25SZXNvdXJjZSgpID09IE1hcmtlckZpbHRlci5PTl9BTlkpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIGZpbHRlciBvbiBzZWxlY3RlZCB3YXJuaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3RlZFdhcm5pbmcoKSB7Ci0JCVN0cmluZyBmaWx0ZXJOYW1lID0gUFJPQkxFTV9URVNUX09OX1NFTEVDVEVEX1dBUk5JTkc7Ci0JCVByb2JsZW1GaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKGZpbHRlck5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbHRlck5hbWUgKyAiIG5vdCBmb3VuZCAiLCBmaWx0ZXIgIT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoZmlsdGVyTmFtZSArICIgaXMgbm90IGVuYWJsZWQgIiwgZmlsdGVyLmlzRW5hYmxlZCgpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJOYW1lICsgIm5vdCBzZWxlY3RpbmcgYnkgc2V2ZXJpdHkiLCBmaWx0ZXIKLQkJCQkuZ2V0U2VsZWN0QnlTZXZlcml0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJOYW1lICsgInNob3VsZCBiZSBvbiB3YXJuaW5nIiwKLQkJCQlmaWx0ZXIuZ2V0U2V2ZXJpdHkoKSA9PSBQcm9ibGVtRmlsdGVyLlNFVkVSSVRZX1dBUk5JTkcpOwotCQlhc3NlcnRUcnVlKGZpbHRlck5hbWUgKyAic2hvdWxkIGJlIG9uIHNlbGVjdGVkIG9ubHkiLCBmaWx0ZXIKLQkJCQkuZ2V0T25SZXNvdXJjZSgpID09IE1hcmtlckZpbHRlci5PTl9TRUxFQ1RFRF9PTkxZKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSBmaWx0ZXIgb24gc2VsZWN0ZWQgYW5kIGNoaWxkcmVuIGluZm9zLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbmZvQW5kQ2hpbGRyZW4oKSB7Ci0JCVN0cmluZyBmaWx0ZXJOYW1lID0gUFJPQkxFTV9URVNUX0lORk9fQU5EX0NISUxEUkVOOwotCQlQcm9ibGVtRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcihmaWx0ZXJOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJOYW1lICsgIiBub3QgZm91bmQgIiwgZmlsdGVyICE9IG51bGwpOwotCQlhc3NlcnRUcnVlKGZpbHRlck5hbWUgKyAiIGlzIG5vdCBlbmFibGVkICIsIGZpbHRlci5pc0VuYWJsZWQoKSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyTmFtZSArICJub3Qgc2VsZWN0aW5nIGJ5IHNldmVyaXR5IiwgZmlsdGVyCi0JCQkJLmdldFNlbGVjdEJ5U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyTmFtZSArICJzaG91bGQgYmUgb24gaW5mbyIsCi0JCQkJZmlsdGVyLmdldFNldmVyaXR5KCkgPT0gUHJvYmxlbUZpbHRlci5TRVZFUklUWV9JTkZPKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJOYW1lICsgInNob3VsZCBiZSBvbiBzZWxlY3RlZCBhbmQgY2hpbGRyZW4iLCBmaWx0ZXIKLQkJCQkuZ2V0T25SZXNvdXJjZSgpID09IE1hcmtlckZpbHRlci5PTl9TRUxFQ1RFRF9BTkRfQ0hJTERSRU4pOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIGZpbHRlciBvbiBzYW1lIGNvbnRhaW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2FtZUNvbnRhaW5lcigpIHsKLQkJU3RyaW5nIGZpbHRlck5hbWUgPSBQUk9CTEVNX1RFU1RfU0FNRV9DT05UQUlORVJfTk9fU0VWRVJJVFk7Ci0JCVByb2JsZW1GaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKGZpbHRlck5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbHRlck5hbWUgKyAiIG5vdCBmb3VuZCAiLCBmaWx0ZXIgIT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoZmlsdGVyTmFtZSArICIgaXMgbm90IGVuYWJsZWQgIiwgZmlsdGVyLmlzRW5hYmxlZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZmlsdGVyTmFtZSArICJzZWxlY3RpbmcgYnkgc2V2ZXJpdHkiLCBmaWx0ZXIKLQkJCQkuZ2V0U2VsZWN0QnlTZXZlcml0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJOYW1lICsgInNob3VsZCBiZSBvbiBvbiBhbnkgaW4gc2FtZSBjb250YWluZXIiLCBmaWx0ZXIKLQkJCQkuZ2V0T25SZXNvdXJjZSgpID09IE1hcmtlckZpbHRlci5PTl9BTllfSU5fU0FNRV9DT05UQUlORVIpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIGZpbHRlciBvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRpb24oKSB7Ci0JCVN0cmluZyBmaWx0ZXJOYW1lID0gUFJPQkxFTV9URVNUX09OX01FVEhPRDsKLQkJUHJvYmxlbUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoZmlsdGVyTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyTmFtZSArICIgbm90IGZvdW5kICIsIGZpbHRlciAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJOYW1lICsgIiBpcyBub3QgZW5hYmxlZCAiLCBmaWx0ZXIuaXNFbmFibGVkKCkpOwotCQlhc3NlcnRUcnVlKGZpbHRlck5hbWUgKyAiZG9lcyBub3QgaGF2ZSBkZXNjcmlwdGlvbiIsIGZpbHRlcgotCQkJCS5nZXREZXNjcmlwdGlvbigpLmxlbmd0aCgpID4gMCk7Ci0JCWFzc2VydFRydWUoZmlsdGVyTmFtZSArICJub3QgY2hlY2tpbmcgY29udGFpbnMiLCBmaWx0ZXIuZ2V0Q29udGFpbnMoKSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB0aGUgZmlsdGVyIG5vdCBvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90T25EZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIGZpbHRlck5hbWUgPSBQUk9CTEVNX1RFU1RfTk9UX09OX01FVEhPRDsKLQkJUHJvYmxlbUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoZmlsdGVyTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyTmFtZSArICIgbm90IGZvdW5kICIsIGZpbHRlciAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJOYW1lICsgIiBpcyBub3QgZW5hYmxlZCAiLCBmaWx0ZXIuaXNFbmFibGVkKCkpOwotCQlhc3NlcnRUcnVlKGZpbHRlck5hbWUgKyAiZG9lcyBub3QgaGF2ZSBkZXNjcmlwdGlvbiIsIGZpbHRlcgotCQkJCS5nZXREZXNjcmlwdGlvbigpLmxlbmd0aCgpID4gMCk7Ci0JCWFzc2VydEZhbHNlKGZpbHRlck5hbWUgKyAiY2hlY2tpbmcgY29udGFpbnMiLCBmaWx0ZXIuZ2V0Q29udGFpbnMoKSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB0aGUgZmlsdGVyIG9uIHByb2JsZW0gdHlwZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFByb2JsZW1UeXBlcygpIHsKLQkJU3RyaW5nIGZpbHRlck5hbWUgPSBQUk9CTEVNX1RFU1RfT05fUFJPQkxFTTsKLQkJUHJvYmxlbUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoZmlsdGVyTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyTmFtZSArICIgbm90IGZvdW5kICIsIGZpbHRlciAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJOYW1lICsgIiBpcyBub3QgZW5hYmxlZCAiLCBmaWx0ZXIuaXNFbmFibGVkKCkpOwotCQlMaXN0IHR5cGVzID0gZmlsdGVyLmdldFNlbGVjdGVkVHlwZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCQlmaWx0ZXJOYW1lICsgInNob3VsZCBvbmx5IGhhdmUgb25lIHR5cGUgaGFzICIgKyB0eXBlcy5zaXplKCksCi0JCQkJdHlwZXMuc2l6ZSgpID09IDEpOwotCQlhc3NlcnRUcnVlKGZpbHRlck5hbWUgKyAic2hvdWxkIGJlIGVuYWJsZWQgZm9yIHByb2JsZW1zIiwKLQkJCQkoKE1hcmtlclR5cGUpIHR5cGVzLmdldCgwKSkuZ2V0SWQoKS5lcXVhbHMoCi0JCQkJCQkib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9EZWNsYXJhdGl2ZUZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9EZWNsYXJhdGl2ZUZpbHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJkYTQxYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21hcmtlcnMvRGVjbGFyYXRpdmVGaWx0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm1hcmtlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlclN1cHBvcnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLlByb2JsZW1GaWx0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWNsYXJhdGl2ZUZpbHRlclRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fVEVTVF9PTl9QUk9CTEVNID0gInByb2JsZW1UZXN0Lm9uUHJvYmxlbSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNX1RFU1RfTk9UX09OX01FVEhPRCA9ICJwcm9ibGVtVGVzdC5ub3RPbk1ldGhvZCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNX1RFU1RfT05fTUVUSE9EID0gInByb2JsZW1UZXN0Lm9uTWV0aG9kIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fVEVTVF9TQU1FX0NPTlRBSU5FUl9OT19TRVZFUklUWSA9ICJwcm9ibGVtVGVzdC5zYW1lQ29udGFpbmVyTm9TZXZlcml0eSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNX1RFU1RfSU5GT19BTkRfQ0hJTERSRU4gPSAicHJvYmxlbVRlc3QuaW5mb0FuZENoaWxkcmVuIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fVEVTVF9PTl9TRUxFQ1RFRF9XQVJOSU5HID0gInByb2JsZW1UZXN0Lm9uU2VsZWN0ZWRXYXJuaW5nIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fVEVTVF9PTl9BTllfRVJST1IgPSAicHJvYmxlbVRlc3Qub25BbnlFcnJvciI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXN0TmFtZQotCSAqLwotCXB1YmxpYyBEZWNsYXJhdGl2ZUZpbHRlclRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpbHRlciB3aXRoIGlkLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4gUHJvYmxlbUZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBQcm9ibGVtRmlsdGVyIGdldEZpbHRlcihTdHJpbmcgaWQpIHsKLQkJSXRlcmF0b3IgZmlsdGVycyA9IE1hcmtlclN1cHBvcnRSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFJlZ2lzdGVyZWRGaWx0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGZpbHRlcnMuaGFzTmV4dCgpKSB7Ci0JCQlQcm9ibGVtRmlsdGVyIGZpbHRlciA9IChQcm9ibGVtRmlsdGVyKSBmaWx0ZXJzLm5leHQoKTsKLQkJCWlmIChmaWx0ZXIuZ2V0SWQoKS5lcXVhbHMoaWQpKQotCQkJCXJldHVybiBmaWx0ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5hbWVzIG9mIGFsbCBvZiB0aGUgZmlsdGVycyB3ZSBhcmUgdGVzdGluZy4KLQkgKiBAcmV0dXJuIFN0cmluZ1tdCi0JICovCi0JU3RyaW5nW10gZ2V0QWxsRmlsdGVyTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBQUk9CTEVNX1RFU1RfT05fUFJPQkxFTSwKLQkJCQlQUk9CTEVNX1RFU1RfTk9UX09OX01FVEhPRCwgUFJPQkxFTV9URVNUX09OX01FVEhPRCwKLQkJCQlQUk9CTEVNX1RFU1RfU0FNRV9DT05UQUlORVJfTk9fU0VWRVJJVFksCi0JCQkJUFJPQkxFTV9URVNUX0lORk9fQU5EX0NISUxEUkVOLAotCQkJCVBST0JMRU1fVEVTVF9PTl9TRUxFQ1RFRF9XQVJOSU5HLCBQUk9CTEVNX1RFU1RfT05fQU5ZX0VSUk9SIH07Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21hcmtlcnMvUmVzb3VyY2VNYXBwaW5nTWFya2Vyc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9SZXNvdXJjZU1hcHBpbmdNYXJrZXJzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2Y5MjM1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9SZXNvdXJjZU1hcHBpbmdNYXJrZXJzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5tYXJrZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3IuQWJzdHJhY3ROYXZpZ2F0b3JUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuUHJvYmxlbVZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hcHBpbmdNYXJrZXJzVGVzdCBleHRlbmRzIEFic3RyYWN0TmF2aWdhdG9yVGVzdCB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXN0TmFtZQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZU1hcHBpbmdNYXJrZXJzVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldCB1cCB0aGUgcmVjZWl2ZXIuCi0JICogCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRvU2V0VXAoKTsKLQkJY3JlYXRlVGVzdEZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VNYXBwaW5ncygpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJUmVzb3VyY2VNYXBwaW5nVGVzdFZpZXcgdmlldzsKLQotCQl0cnkgewotCQkJdmlldyA9IChSZXNvdXJjZU1hcHBpbmdUZXN0VmlldykgcGFnZQotCQkJCQkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnRlc3RzLnJlc291cmNlTWFwcGluZ1ZpZXciKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZShlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIGJvb2xlYW5bXSB3YWl0aW5nID0gbmV3IGJvb2xlYW5bXSB7IHRydWUgfTsKLQotCQlmaW5hbCBQcm9ibGVtVmlldyBwcm9ibGVtVmlldzsKLQkJdHJ5IHsKLQkJCXByb2JsZW1WaWV3ID0gKFByb2JsZW1WaWV3KSBwYWdlCi0JCQkJCS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZShlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUpvYkNoYW5nZUxpc3RlbmVyIGRvbmVMaXN0ZW5lciA9IG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAocHJvYmxlbVZpZXcuZ2V0Q3VycmVudE1hcmtlcnMoKS50b0FycmF5KCkubGVuZ3RoID4gMCkKLQkJCQkJd2FpdGluZ1swXSA9IGZhbHNlOwotCQkJfQotCQl9OwotCi0JCXByb2JsZW1WaWV3LmFkZFVwZGF0ZUZpbmlzaExpc3RlbmVyKGRvbmVMaXN0ZW5lcik7Ci0JCXZpZXcuYWRkTWFya2VyVG9GaXJzdFByb2plY3QoKTsKLQkJbG9uZyB0aW1lT3V0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAyMDAwOwotCQl3YWl0aW5nWzBdID0gcHJvYmxlbVZpZXcuZ2V0Q3VycmVudE1hcmtlcnMoKS50b0FycmF5KCkubGVuZ3RoID09IDA7Ci0KLQkJd2hpbGUgKHdhaXRpbmdbMF0gJiYgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCB0aW1lT3V0KSB7Ci0JCQl2aWV3LmdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5yZWFkQW5kRGlzcGF0Y2goKTsKLQkJfQotCi0JCWFzc2VydFRydWUoIk5vIG1hcmtlcnMgZ2VuZXJhdGVkIiwgcHJvYmxlbVZpZXcuZ2V0Q3VycmVudE1hcmtlcnMoKQotCQkJCS50b0FycmF5KCkubGVuZ3RoID4gMCk7Ci0JCXByb2JsZW1WaWV3LnJlbW92ZVVwZGF0ZUZpbmlzaExpc3RlbmVyKGRvbmVMaXN0ZW5lcik7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21hcmtlcnMvUmVzb3VyY2VNYXBwaW5nVGVzdFZpZXcuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9SZXNvdXJjZU1hcHBpbmdUZXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGUwMjlhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9SZXNvdXJjZU1hcHBpbmdUZXN0Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5tYXJrZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdFBsdWdpbjsKLQotcHVibGljIGNsYXNzIFJlc291cmNlTWFwcGluZ1Rlc3RWaWV3IGV4dGVuZHMgVmlld1BhcnQgaW1wbGVtZW50cyBJVmlld1BhcnQgewotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdlcjsKLQotCXB1YmxpYyBSZXNvdXJjZU1hcHBpbmdUZXN0VmlldygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YSgKLQkJCQluZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0KLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChUZXN0UmVzb3VyY2VNYXBwaW5nKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZ2V0Q29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0SW5wdXQobmV3IFRlc3RSZXNvdXJjZU1hcHBpbmcoVGVzdFBsdWdpbi5nZXRXb3Jrc3BhY2UoKQotCQkJCS5nZXRSb290KCkpKTsKLQl9Ci0KLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChUZXN0UmVzb3VyY2VNYXBwaW5nKSBwYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKFRlc3RSZXNvdXJjZU1hcHBpbmcpIGVsZW1lbnQpLmdldFBhcmVudCgpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKFRlc3RSZXNvdXJjZU1hcHBpbmcpIGVsZW1lbnQpLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMDsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChUZXN0UmVzb3VyY2VNYXBwaW5nKSBpbnB1dEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwKLQkJCQkJT2JqZWN0IG5ld0lucHV0KSB7Ci0KLQkJCX0KLQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgVGVzdFJlc291cmNlTWFwcGluZygKLQkJCQlUZXN0UGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNYXJrZXJUb0ZpcnN0UHJvamVjdCgpIHsKLQkJCi0JCVRlc3RSZXNvdXJjZU1hcHBpbmcgdG9wID0gKChUZXN0UmVzb3VyY2VNYXBwaW5nKSB2aWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCUlSZXNvdXJjZSBlbGVtZW50ID0gdG9wLmdldENoaWxkcmVuKClbMF0uZWxlbWVudDsKLQkJCi0JCXRyeSB7Ci0JCQllbGVtZW50LmNyZWF0ZU1hcmtlcigib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21hcmtlcnMvVGVzdFJlc29sdXRpb25HZW5lcmF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9UZXN0UmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTkwMWRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9UZXN0UmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm1hcmtlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5NYXJrZXJWaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLldvcmtiZW5jaE1hcmtlclJlc29sdXRpb247Ci0KLS8qKgotICogVGVzdFJlc29sdXRpb25HZW5lcmF0b3IgaXMgYSBtYXJrZXIgcmVzb2x1dGlvbiBnZW5lcmF0b3IgZm9yIHRlc3RpbmcKLSAqIHtAbGluayBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLldvcmtiZW5jaE1hcmtlclJlc29sdXRpb259Ci0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGVzdFJlc29sdXRpb25HZW5lcmF0b3IgaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcjIgewotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TWFya2VyUmVzb2x1dGlvbiBleHRlbmRzIFdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24gewotCi0JCXB1YmxpYyBJTWFya2VyW10gZmluZE90aGVyTWFya2VycyhJTWFya2VyW10gbWFya2VycykgewotCQkJcmV0dXJuIG1hcmtlcnM7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uMiNnZXREZXNjcmlwdGlvbigpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuICJBIHRlc3Qgb2YgdGhlIG5ldyBzdHlsZSByZXNvbHV0aW9uIjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb24yI2dldEltYWdlKCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNnZXRMYWJlbCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuICIzLjIgTXVsdGkgcmVzb2x1dGlvbiI7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKElNYXJrZXIgbWFya2VyKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtYXJrZXIKLQkJCQkJCS5nZXRBdHRyaWJ1dGUoTWFya2VyVmlld1V0aWwuTkFNRV9BVFRSSUJVVEUpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbiNydW4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcltdLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKElNYXJrZXJbXSBtYXJrZXJzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQotCQkJCXRyeSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtYXJrZXIKLQkJCQkJCQkuZ2V0QXR0cmlidXRlKE1hcmtlclZpZXdVdGlsLk5BTUVfQVRUUklCVVRFKSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIENvbXBhdGliaWxpdHlUZXN0TWFya2VyUmVzb2x1dGlvbiBpbXBsZW1lbnRzCi0JCQlJTWFya2VyUmVzb2x1dGlvbiB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNnZXRMYWJlbCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuICIzLjEgQ29tcGF0aWJpbGl0eSBSZXNvbHV0aW9uIjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb24jcnVuKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oSU1hcmtlciBtYXJrZXIpIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1hcmtlcgotCQkJCQkJLmdldEF0dHJpYnV0ZShNYXJrZXJWaWV3VXRpbC5OQU1FX0FUVFJJQlVURSkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yMiNoYXNSZXNvbHV0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Jlc29sdXRpb25zKElNYXJrZXIgbWFya2VyKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IjZ2V0UmVzb2x1dGlvbnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgewotCQlJTWFya2VyUmVzb2x1dGlvbltdIHJlc29sdXRpb25zID0gbmV3IElNYXJrZXJSZXNvbHV0aW9uWzJdOwotCi0JCXJlc29sdXRpb25zWzBdID0gbmV3IFRlc3RNYXJrZXJSZXNvbHV0aW9uKCk7Ci0JCXJlc29sdXRpb25zWzFdID0gbmV3IENvbXBhdGliaWxpdHlUZXN0TWFya2VyUmVzb2x1dGlvbigpOwotCi0JCXJldHVybiByZXNvbHV0aW9uczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9UZXN0UmVzb3VyY2VNYXBwaW5nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21hcmtlcnMvVGVzdFJlc291cmNlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWUzYjZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9UZXN0UmVzb3VyY2VNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm1hcmtlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlTWFwcGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFwcGluZy5SZXNvdXJjZVRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0UGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVGVzdFJlc291cmNlTWFwcGluZyBleHRlbmRzIFJlc291cmNlTWFwcGluZyB7Ci0KLQlJUmVzb3VyY2UgZWxlbWVudDsKLQlwcml2YXRlIFRlc3RSZXNvdXJjZU1hcHBpbmcgcGFyZW50OwotCi0JcHVibGljIFRlc3RSZXNvdXJjZU1hcHBpbmcoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWVsZW1lbnQgPSByZXNvdXJjZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nI2dldE1vZGVsT2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nI2dldFByb2plY3RzKCkKLQkgKi8KLQlwdWJsaWMgSVByb2plY3RbXSBnZXRQcm9qZWN0cygpIHsKLQkJaWYgKGVsZW1lbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5ST09UKQotCQkJcmV0dXJuICgoSVdvcmtzcGFjZVJvb3QpIGVsZW1lbnQpLmdldFByb2plY3RzKCk7Ci0JCXJldHVybiBuZXcgSVByb2plY3RbXSB7IGVsZW1lbnQuZ2V0UHJvamVjdCgpIH07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlTWFwcGluZyNnZXRUcmF2ZXJzYWxzKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nQ29udGV4dCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVRyYXZlcnNhbFtdIGdldFRyYXZlcnNhbHMoUmVzb3VyY2VNYXBwaW5nQ29udGV4dCBjb250ZXh0LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVJlc291cmNlVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBSZXNvdXJjZVRyYXZlcnNhbCgKLQkJCQluZXcgSVJlc291cmNlW10geyBlbGVtZW50IH0sIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwKLQkJCQlJUmVzb3VyY2UuTk9ORSk7Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VUcmF2ZXJzYWxbXSB7IHRyYXZlcnNhbCB9OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2hpbGRyZW4gb2YgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEByZXR1cm4gVGVzdFJlc291cmNlTWFwcGluZyBbXQotCSAqLwotCXB1YmxpYyBUZXN0UmVzb3VyY2VNYXBwaW5nW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCWlmIChlbGVtZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCXJldHVybiBuZXcgVGVzdFJlc291cmNlTWFwcGluZ1swXTsKLQkJSVJlc291cmNlW10gY2hpbGRyZW47Ci0JCXRyeSB7Ci0JCQljaGlsZHJlbiA9ICgoSUNvbnRhaW5lcikgZWxlbWVudCkubWVtYmVycygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCXJldHVybiBuZXcgVGVzdFJlc291cmNlTWFwcGluZ1swXTsKLQkJfQotCQlUZXN0UmVzb3VyY2VNYXBwaW5nW10gcmVzdWx0ID0gbmV3IFRlc3RSZXNvdXJjZU1hcHBpbmdbY2hpbGRyZW4ubGVuZ3RoXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgVGVzdFJlc291cmNlTWFwcGluZyhjaGlsZHJlbltpXSk7Ci0JCQlyZXN1bHRbaV0uc2V0UGFyZW50KHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChUZXN0UmVzb3VyY2VNYXBwaW5nIG1hcHBpbmcpIHsKLQkJcGFyZW50ID0gbWFwcGluZzsKLQkJCi0JfQotCi0JcHVibGljIFRlc3RSZXNvdXJjZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tYXJrZXJzL29sZF9kaWFsb2dfc2V0dGluZ3MueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tYXJrZXJzL29sZF9kaWFsb2dfc2V0dGluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWE5MjAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWFya2Vycy9vbGRfZGlhbG9nX3NldHRpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2VjdGlvbiBuYW1lPSJXb3JrYmVuY2giPgotCTxzZWN0aW9uIG5hbWU9ImZpbHRlciI+Ci0JCTxpdGVtIGtleT0ic2VsZWN0QnlTZXZlcml0eSIgdmFsdWU9ImZhbHNlIi8+Ci0JCTxpdGVtIGtleT0iY29udGFpbnMiIHZhbHVlPSJ0cnVlIi8+Ci0JCTxpdGVtIGtleT0iZW5hYmxlZCIgdmFsdWU9InRydWUiLz4KLQkJPGl0ZW0ga2V5PSJzZXZlcml0eSIgdmFsdWU9IjAiLz4KLQkJPGl0ZW0ga2V5PSJkZXNjcmlwdGlvbiIgdmFsdWU9IiIvPgotCQk8aXRlbSBrZXk9ImZpbHRlck9uTWFya2VyTGltaXQiIHZhbHVlPSJ0cnVlIi8+Ci0JCTxpdGVtIGtleT0ibWFya2VyTGltaXQiIHZhbHVlPSIxMDAiLz4KLQkJPGl0ZW0ga2V5PSJzZWxlY3RlZFR5cGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyOm9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkcGF0aF9wcm9ibGVtOm9yZy5lY2xpcHNlLmFudC51aS5idWlsZEZpbGVQcm9ibGVtOm9yZy5lY2xpcHNlLmpkdC5jb3JlLnByb2JsZW06Ii8+Ci0JCTxpdGVtIGtleT0ib25SZXNvdXJjZSIgdmFsdWU9IjAiLz4KLQk8L3NlY3Rpb24+Ci08L3NlY3Rpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21lbnVzL0FkZE1hcmtlcnNBY3Rpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWVudXMvQWRkTWFya2Vyc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJjMTY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWVudXMvQWRkTWFya2Vyc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5NYXJrZXJWaWV3VXRpbDsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRNYXJrZXJzQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfVEVTVF9NQVJLRVIgPSAib3JnLmVjbGlwc2UudWkudGVzdHMuY2F0ZWdvcnlUZXN0TWFya2VyIjsKLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93KSB7Ci0gICAgICAgIHRoaXMud2luZG93ID0gd29ya2JlbmNoV2luZG93OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0JICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkgICAgICAgIE1hcCBhdHRyaWJzID0gbmV3IEhhc2hNYXAoKTsKLQkgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7Ci0JICAgICAgICAJCi0JICAgICAgICAJaWYoaSAvMiA9PSAwKXsKLQkgICAgICAgIAkJYXR0cmlicy5wdXQoTWFya2VyVmlld1V0aWwuTkFNRV9BVFRSSUJVVEUgLCAiVGVzdCBOYW1lICIgKyBpKTsKLQkJICAgICAgICAgICAgYXR0cmlicy5wdXQoTWFya2VyVmlld1V0aWwuUEFUSF9BVFRSSUJVVEUgLCAiVGVzdCBQYXRoICIgKyBpKTsKLQkgICAgICAgIAl9Ci0JICAgICAgICAJCi0JICAgICAgICAgICAgYXR0cmlicy5wdXQoSU1hcmtlci5TRVZFUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5TRVZFUklUWV9FUlJPUikpOwotCSAgICAgICAgICAgIGF0dHJpYnMucHV0KElNYXJrZXIuTUVTU0FHRSwgInRoaXMgaXMgYSB0ZXN0ICIgKyBpKTsKLQkgICAgICAgICAgICBhdHRyaWJzLnB1dChJTWFya2VyLkxPQ0FUSU9OLCAiTG9jYXRpb24gIiArIGkpOwotCSAgICAgICAgICAgIGF0dHJpYnMucHV0KCJjYXRlZ29yeSIgLCBTdHJpbmcudmFsdWVPZihpLzIpKTsKLQkgICAgICAgICAgICBNYXJrZXJVdGlsaXRpZXMuY3JlYXRlTWFya2VyKHJvb3QsIGF0dHJpYnMsIENBVEVHT1JZX1RFU1RfTUFSS0VSKTsKLQkgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBvcGVuRXJyb3IoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb3BlbkVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtc2cgPSBlLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBUZXN0UGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpLCAwLCBtc2csIGUpOwotCi0gICAgICAgIFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCi0gICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcih3aW5kb3cuZ2V0U2hlbGwoKSwgIkVycm9yIiwgbXNnLCBzdGF0dXMpOwotICAgIH0KLQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21lbnVzL0Jyb2tlbldvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWVudXMvQnJva2VuV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGFhYWJlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWVudXMvQnJva2VuV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuRm9yY2VkRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgYSBicm9rZW4gcHVsbGRvd24gZGVsZWdhdGUgdGhhdCB0aHJvd3MgZXhjZXB0aW9ucyBpZiB5b3UgdHJ5IHRvIGdldAotICogdGhlIG1lbnUuIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgc2ltcGx5IHNhbml0eS4gRWNsaXBzZSBzaG91bGQgYmUgYWJsZSB0bwotICogc3RhcnQgaW4gdGhlIGZhY2Ugb2YgY29kZSBicm9rZW4gbGlrZSB0aGlzLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCcm9rZW5Xb3JrYmVuY2hXaW5kb3dQdWxsZG93bkRlbGVnYXRlIGltcGxlbWVudHMKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyIHsKLSAgICAvL3doZXRoZXIgd2Ugc2hvdWxkIHRocm93IG9uIGdldE1lbnUoTWVudSkKLSAgICBzdGF0aWMgYm9vbGVhbiB0aHJvd01lbnUgPSB0cnVlOwotCi0gICAgLy93aGV0aGVyIHdlIHNob3VsZCB0aHJvdyBvbiBnZXRNZW51KENvbnRyb2wpCi0gICAgc3RhdGljIGJvb2xlYW4gdGhyb3dDb250cm9sID0gdHJ1ZTsKLQotICAgIC8va2VlcCByZWZlcmVuY2VzIHRvIHRoZSBtZW51cyBmb3IgZGlzcG9zYWwKLSAgICBNZW51IG1lbnVNZW51OwotCi0gICAgTWVudSBtZW51Q29udHJvbDsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudSkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KSB7Ci0gICAgICAgIGlmICh0aHJvd01lbnUpIHsKLSAgICAgICAgICAgIHRocm93TWVudSA9IGZhbHNlOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmNlZEV4Y2VwdGlvbigKLQkJCQkJIlRoZSB3b3JrYmVuY2ggc2hvdWxkIGhhbmRsZSBob3N0aWxlIHB1bGxkb3duIGRlbGVnYXRlcy4iKTsKLSAgICAgICAgfQotICAgICAgICBtZW51TWVudSA9IG5ldyBNZW51KHBhcmVudCk7Ci0gICAgICAgIHJldHVybiBtZW51TWVudTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dQdWxsZG93bkRlbGVnYXRlI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVudSBnZXRNZW51KENvbnRyb2wgcGFyZW50KSB7Ci0gICAgICAgIGlmICh0aHJvd0NvbnRyb2wpIHsKLSAgICAgICAgICAgIHRocm93Q29udHJvbCA9IGZhbHNlOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmNlZEV4Y2VwdGlvbigKLQkJCQkJIlRoZSB3b3JrYmVuY2ggc2hvdWxkIGhhbmRsZSBob3N0aWxlIHB1bGxkb3duIGRlbGVnYXRlcy4iKTsKLSAgICAgICAgfQotICAgICAgICBtZW51Q29udHJvbCA9IG5ldyBNZW51KHBhcmVudCk7Ci0gICAgICAgIHJldHVybiBtZW51Q29udHJvbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAobWVudUNvbnRyb2wgIT0gbnVsbCkKLSAgICAgICAgICAgIG1lbnVDb250cm9sLmRpc3Bvc2UoKTsKLQotICAgICAgICBpZiAobWVudU1lbnUgIT0gbnVsbCkKLSAgICAgICAgICAgIG1lbnVNZW51LmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotICAgICAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21lbnVzL01lbnVzVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21lbnVzL01lbnVzVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDJmMmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tZW51cy9NZW51c1Rlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm1lbnVzOwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRlc3RzIGZvciBhbGwgY29kZSByZWxhdGVkIHRvIG1lbnVzLiBUaGlzIGluY2x1ZGVzIHRoZQotICogPGNvZGU+cG9wdXBNZW51czwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LCBhbmQgb3RoZXJzLgotICovCi1wdWJsaWMgY2xhc3MgTWVudXNUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VpdGUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVudXNUZXN0U3VpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIHRlc3Qgc3VpdGUuCi0gICAgICovCi0gICAgcHVibGljIE1lbnVzVGVzdFN1aXRlKCkgewotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoT2JqZWN0Q29udHJpYnV0aW9uVGVzdC5jbGFzcykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWVudXMvT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tZW51cy9PYmplY3RDb250cmlidXRpb25DbGFzc2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNDQ2ODcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tZW51cy9PYmplY3RDb250cmlidXRpb25DbGFzc2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm1lbnVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm1PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIyOwotCi1wdWJsaWMgY2xhc3MgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3NlcyBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gInRlc3RDb250cmlidXRvclJlc291cmNlQWRhcHRlciI7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUNvbW1vbiB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tbW9uIGltcGxlbWVudHMgSUNvbW1vbiB7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUEgewotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEEgaW1wbGVtZW50cyBJQSB7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEExIGV4dGVuZHMgQSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQTExIGV4dGVuZHMgQTEgewotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJQiB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQiBpbXBsZW1lbnRzIElCIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBCMiBpbXBsZW1lbnRzIElCIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEIGV4dGVuZHMgQ29tbW9uIGltcGxlbWVudHMgSUEgewotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEMgaW1wbGVtZW50cyBJQ29tbW9uIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDUmVzb3VyY2UgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCWlmKGFkYXB0ZXIgPT0gSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyLmNsYXNzKSB7Ci0JCQkJcmV0dXJuIG5ldyBSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJCX0JCQkKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDRmlsZSBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJaWYoYWRhcHRlciA9PSBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIuY2xhc3MpIHsKLQkJCQlyZXR1cm4gbmV3IFJlc291cmNlQWRhcHRlcigpOwotCQkJfQkJCQotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCX0KLQkKLQkvLyBSZXR1cm5zIGEgY29udHJpYnV0aW9uIGFkYXB0ZXIgdGhhdCBkb2Vzbid0IGhhbmRsZSBSZXNvdXJjZU1hcHBpbmdzCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDUmVzb3VyY2VPbmx5IGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQlpZihhZGFwdGVyID09IElDb250cmlidXRvclJlc291cmNlQWRhcHRlci5jbGFzcykgewotCQkJCXJldHVybiBuZXcgUmVzb3VyY2VPbmx5QWRhcHRlcigpOwotCQkJfQkJCQotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCX0KLSAgICAKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElNb2RlbEVsZW1lbnQgewotICAgIH0KLQkKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZGVsRWxlbWVudCBleHRlbmRzIFBsYXRmb3JtT2JqZWN0IGltcGxlbWVudHMgSU1vZGVsRWxlbWVudCB7Ci0gICAgfQotICAgIAotCS8vIERlZmF1bHQgY29udHJpYnV0b3IgYWRhcHRlcgotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VBZGFwdGVyIGltcGxlbWVudHMgSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyMiB7Ci0JCXB1YmxpYyBJUmVzb3VyY2UgZ2V0QWRhcHRlZFJlc291cmNlKElBZGFwdGFibGUgYWRhcHRhYmxlKSB7Ci0JCQlpZihhZGFwdGFibGUgaW5zdGFuY2VvZiBDUmVzb3VyY2UpIHsKLQkJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCX0KLQkJCWlmKGFkYXB0YWJsZSBpbnN0YW5jZW9mIENGaWxlKSB7Ci0JCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpLmdldEZpbGUoImR1bW15Iik7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotICAgICAgICBwdWJsaWMgUmVzb3VyY2VNYXBwaW5nIGdldEFkYXB0ZWRSZXNvdXJjZU1hcHBpbmcoSUFkYXB0YWJsZSBhZGFwdGFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiAoUmVzb3VyY2VNYXBwaW5nKWdldEFkYXB0ZWRSZXNvdXJjZShhZGFwdGFibGUpLmdldEFkYXB0ZXIoUmVzb3VyY2VNYXBwaW5nLmNsYXNzKTsKLSAgICAgICAgfQkKLQl9Ci0JCi0JLy8gQ29udHJpYnV0b3IgYWRhcHRlciB0aGF0IGRvZXNuJ3QgaGFuZGxlIHJlc291cmNlIG1hcHBpbmdzCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZU9ubHlBZGFwdGVyIGltcGxlbWVudHMgSUNvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyIHsKLQkJcHVibGljIElSZXNvdXJjZSBnZXRBZGFwdGVkUmVzb3VyY2UoSUFkYXB0YWJsZSBhZGFwdGFibGUpIHsKLQkJCWlmKGFkYXB0YWJsZSBpbnN0YW5jZW9mIENSZXNvdXJjZU9ubHkpIHsKLQkJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8vIEFkYXB0ZXIgbWV0aG9kcwotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZihhZGFwdGVyVHlwZSA9PSBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIuY2xhc3MpIHsKLQkJCXJldHVybiBuZXcgUmVzb3VyY2VBZGFwdGVyKCk7Ci0JCX0KLQkJaWYoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSUEgJiYgYWRhcHRlclR5cGUgPT0gSUEuY2xhc3MpIHsKLQkJCXJldHVybiBuZXcgQSgpOwotCQl9Ci0JCWlmKGFkYXB0ZXJUeXBlID09IElSZXNvdXJjZS5jbGFzcykgewotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCX0KLQkJaWYoYWRhcHRlclR5cGUgPT0gSUNvbW1vbi5jbGFzcykgewotCQkJcmV0dXJuIG5ldyBDb21tb24oKTsKLQkJfQotICAgICAgICBpZihhZGFwdGVyVHlwZSA9PSBSZXNvdXJjZU1hcHBpbmcuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VNYXBwaW5nKCkgeyAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgUmVzb3VyY2VUcmF2ZXJzYWxbXSBnZXRUcmF2ZXJzYWxzKFJlc291cmNlTWFwcGluZ0NvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VUcmF2ZXJzYWxbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlVHJhdmVyc2FsKG5ldyBJUmVzb3VyY2VbXSB7UmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKX0sIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgSVJlc291cmNlLk5PTkUpCi0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyBJUHJvamVjdFtdIGdldFByb2plY3RzKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRhcHRhYmxlT2JqZWN0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyBJQ29tbW9uLmNsYXNzLCBJUmVzb3VyY2UuY2xhc3MsIElGaWxlLmNsYXNzLCBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsIFJlc291cmNlTWFwcGluZy5jbGFzc307Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tZW51cy9PYmplY3RDb250cmlidXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21lbnVzL09iamVjdENvbnRyaWJ1dGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NDIwYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL21lbnVzL09iamVjdENvbnRyaWJ1dGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubWVudXM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLlJlc291cmNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuUGx1Z2luQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Qb3B1cE1lbnVFeHRlbmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMubWVudXMuT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5JQ29tbW9uOwotCi0vKioKLSAqIFRlc3RzIHRoYXQgb2JqZWN0IGNvbnRyaWJ1dGlvbnMgYXJlIGVuYWJsZWQgYW5kIHNob3duIGNvcnJlY3RseSBpbiBwb3AtdXAKLSAqIG1lbnVzIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIHdvcmtiZW5jaC4gVGhpcyB0ZXN0IHJlbGllcyBvbiB0aGUKLSAqIDxjb2RlPnBsdWdpbi54bWw8L2NvZGU+IGZpbGUgY29udGFpbmluZyBjZXJ0YWluIHZhbHVlcy4gUGxlYXNlIHNlZSB0aGUKLSAqIGFwcHJvcHJpYXRlIHNlY3Rpb24gaW4gdGhhdCBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbml0aWFsCi0gKiBzZXQtdXAuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE9iamVjdENvbnRyaWJ1dGlvblRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+T2JqZWN0Q29udHJpYnV0aW9uVGVzdDwvY29kZT4gd2l0aAotICAgICAqIHRoZSBuYW1lIG9mIHRoZSB0ZXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdGVzdDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RDb250cmlidXRpb25UZXN0KGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIGNvbnRlbnQtdHlwZSBvYmplY3QgY29udHJpYnV0aW9uIHdvcmtzLiBUaGlzIGlzIHRlc3RpbmcKLSAgICAgKiBhIHVzZSBjYXJlIGZhbWlsaWFyIHRvIEFudCBVSS4gVGhlIGNvbnRlbnQtdHlwZSBzY2FucyBhbiBYTUwgZmlsZSB0byBzZWUKLSAgICAgKiBpZiBpdHMgcm9vdCBlbGVtZW50IGlzIDxjb2RlPiZsdDtwcm9qZWN0Jmd0OzwvY29kZT4uCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyB3aGVuIGNyZWF0aW5nIHRoZSBwcm9qZWN0IG9yIGZpbGUsIG9yIGlmCi0gICAgICogICAgICAgICAgICAgdGhlIHByb2plY3QgY2FuJ3QgYmUgb3BlbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RPYmplY3RTdGF0ZUNvbnRlbnRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBDcmVhdGUgYW4gWE1MIGZpbGUgd2l0aCA8cHJvamVjdD4gYXMgaXRzIHJvb3QgZWxlbWVudC4KLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHRlc3RQcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotICAgICAgICAgICAgICAgICJPYmplY3RDb250cmlidXRpb25UZXN0UHJvamVjdCIpOwotICAgICAgICB0ZXN0UHJvamVjdC5jcmVhdGUobnVsbCk7Ci0gICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgICAgIGZpbmFsIElGaWxlIHhtbEZpbGUgPSB0ZXN0UHJvamVjdC5nZXRGaWxlKCJPYmplY3RDb250cmlidXRpb25UZXN0LnhtbCIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgY29udGVudHMgPSAiPHRlc3RPYmplY3RTdGF0ZUNvbnRlbnRUeXBlRWxlbWVudD48L3Rlc3RPYmplY3RTdGF0ZUNvbnRlbnRUeXBlRWxlbWVudD4iOwotICAgICAgICBmaW5hbCBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICBjb250ZW50cy5nZXRCeXRlcygpKTsKLSAgICAgICAgeG1sRmlsZS5jcmVhdGUoaW5wdXRTdHJlYW0sIHRydWUsIG51bGwpOwotICAgICAgICBmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHhtbEZpbGUpOwotICAgICAgICBhc3NlcnRQb3B1cE1lbnVzKCIxIiwgbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UudWkudGVzdHMudGVzdE9iamVjdFN0YXRlQ29udGVudFR5cGUifSwgc2VsZWN0aW9uLCBudWxsLCB0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB0ZXN0cyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBzdXBwb3J0IGZvciBhZGFwdGFibGUgSVJlc291cmNlIG9iamVjdENvbnRyaWJ1dGlvbnMuIFRoaXMKLSAgICAgKiBhbGxvd3MgSVJlc291cmNlIGFkYXB0YWJsZSBjb250cmlidXRpb25zIHdpdGhvdXQgYW4gYWRhcHRlciBmYWN0b3J5IGFuZCB1c2luZwotICAgICAqIHRoZSBJQ29udHJpYnV0b3JSZXNvdXJjZUFkYXB0ZXIgZmFjdG9yeS4gSW4gYWRkaXRpb24sIHRlc3QgdGhlIFJlc291cmNlTWFwcGluZyBhZGFwdGF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENvbnRyaWJ1dG9yUmVzb3VyY2VBZGFwdGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgIAkKLSAgICAJZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHRlc3RQcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgaWYoISB0ZXN0UHJvamVjdC5leGlzdHMoKSkgewotICAgICAgICAJdGVzdFByb2plY3QuY3JlYXRlKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEgdGVzdFByb2plY3QuaXNPcGVuKCkpIHsKLSAgICAgICAgCXRlc3RQcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgICAgIH0KLSAgICAJCi0gICAgCWFzc2VydFBvcHVwTWVudXMoIjEiLAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklSZXNvdXJjZS4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ1Jlc291cmNlKCl9KSwKLQkJCQlJUmVzb3VyY2UuY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiMiIsCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSVByb2plY3QuMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10ge25ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNGaWxlKCl9KSwKLQkJCQludWxsLAotCQkJCWZhbHNlCi0JCQkpOwotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCIzIiwgCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUZpbGUuMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10ge25ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNGaWxlKCl9KSwKLQkJCQlJRmlsZS5jbGFzcywKLQkJCQl0cnVlCi0JCQkpOwotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCI0IiwgCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSVJlc291cmNlLjEifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DRmlsZSgpLCBuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DUmVzb3VyY2UoKX0pLAotCQkJCUlSZXNvdXJjZS5jbGFzcywKLQkJCQl0cnVlCi0JCQkpOwotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCI1IiwgCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUZpbGUuMSIsICJJUHJvamVjdC4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ0ZpbGUoKSwgbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ1Jlc291cmNlKCl9KSwKLQkJCQlJUmVzb3VyY2UuY2xhc3MsCi0JCQkJZmFsc2UKLQkJCSk7Ci0gICAgICAgIGFzc2VydFBvcHVwTWVudXMoIjYiLCAKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJSZXNvdXJjZU1hcHBpbmcuMSJ9LCAKLSAgICAgICAgICAgICAgICBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10ge25ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNGaWxlKCksIG5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNSZXNvdXJjZSgpfSksCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VNYXBwaW5nLmNsYXNzLAotICAgICAgICAgICAgICAgIHRydWUKLSAgICAgICAgICAgICk7Ci0gICAgICAgIGFzc2VydFBvcHVwTWVudXMoIjciLCAKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJSZXNvdXJjZU1hcHBpbmcuMSIsICJJUmVzb3VyY2UuMSJ9LCAKLSAgICAgICAgICAgICAgICBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10ge25ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLk1vZGVsRWxlbWVudCgpfSksCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VNYXBwaW5nLmNsYXNzLAotICAgICAgICAgICAgICAgIHRydWUKLSAgICAgICAgICAgICk7Ci0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBjYXNlIHdoZXJlIGFuIG9iamVjdCB1c2VzIGEgY29udHJpYnV0aW9uIGFkYXB0ZXIgdGhhdCBkb2Vzbid0IGhhbmRsZSBtYXBwaW5ncwotICAgICAgICAvLyB3aWxsIHN0aWxsIHNob3cgdGhlIG1lbnVzIGZvciByZXNvdXJjZSBtYXBwaW5ncwotICAgICAgICBhc3NlcnRQb3B1cE1lbnVzKCI4IiwgCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiUmVzb3VyY2VNYXBwaW5nLjEiLCAiSVJlc291cmNlLjEifSwgCi0gICAgICAgICAgICAgICAgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DUmVzb3VyY2VPbmx5KCl9KSwKLSAgICAgICAgICAgICAgICBSZXNvdXJjZU1hcHBpbmcuY2xhc3MsCi0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgICAgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB0ZXN0cyBhZGFwdGFibGUgY29udHJpYnV0aW9ucyB0aGF0IGFyZSBub3QgSVJlc291cmNlLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0QWRhcHRhYmxlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiMSIsIAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklDb21tb24uMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10gewotICAgIAkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQSgpfSksCi0JCQkJSUNvbW1vbi5jbGFzcywKLQkJCQl0cnVlCi0JCQkpOyAgCi0gICAgCWFzc2VydFBvcHVwTWVudXMoIjIiLCAKLSAgICAJCQluZXcgU3RyaW5nW10geyJJQ29tbW9uLjEifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsKLSAgICAJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkEoKSwgCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5CKCl9KSwKLQkJCQlJQ29tbW9uLmNsYXNzLAotCQkJCXRydWUKLQkJCSk7ICAgICAgCQotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCIzIiwgCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7Ci0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5BKCksIAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQigpLCAKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkMoKSwKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNvbW1vbigpCi0JCQkJfSksCi0JCQkJSUNvbW1vbi5jbGFzcywKLQkJCQl0cnVlCi0JCQkpOwotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCI0IiwgCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7Ci0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5Db21tb24oKSwgCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DKCksIAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQigpLAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQSgpCi0JCQkJfSksCi0JCQkJSUNvbW1vbi5jbGFzcywKLQkJCQl0cnVlCi0JCQkpOwotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCI1IiwgCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7Ci0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5Db21tb24oKSwgCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DKCksIAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQigpLAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQygpLCAKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkEoKSwKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNvbW1vbigpIAotCQkJCX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiNiIsIAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklDb21tb24uMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10geyAKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkMoKSwKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNvbW1vbigpCi0JCQkJfSksCi0JCQkJSUNvbW1vbi5jbGFzcywKLQkJCQl0cnVlCi0JCQkpOwotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCI3IiwgCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IAotCQkJCQkJbmV3IE9iamVjdCgpCQkJCQotCQkJCX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJZmFsc2UKLQkJCSk7Ci0gICAgCWFzc2VydFBvcHVwTWVudXMoIjgiLCAKLSAgICAJCQluZXcgU3RyaW5nW10geyJJQ29tbW9uLjEifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgCi0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DKCksCi0JCQkJCQluZXcgT2JqZWN0KCkJCQkJCi0JCQkJfSksCi0JCQkJSUNvbW1vbi5jbGFzcywKLQkJCQlmYWxzZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiOSIsIAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklDb21tb24uMSJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10geyAKLSAgICAJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkMoKSwKLSAgICAJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkEoKSwKLQkJCQkJCW5ldyBPYmplY3QoKQkJCQkKLQkJCQl9KSwKLQkJCQlJQ29tbW9uLmNsYXNzLAotCQkJCWZhbHNlCi0JCQkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBFbnN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlIGNvbnRyaWJ1dGlvbnMuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3REdXBsaWNhdGVBZGFwdGFibGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCIxIiwKLSAgICAJCQluZXcgU3RyaW5nW10geyJJQ29tbW9uLjEifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsKLSAgICAJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkQoKX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsKLSAgICAJLy8gcmVwZWF0IHRlc3Qgb24gcHVycG9zZSB0byBlbnN1cmUgbm8gZG91YmxlIGNhbGwgZHVwbGljYXRlcy4gICAgCQotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCIxIiwKLSAgICAJCQluZXcgU3RyaW5nW10geyJJQ29tbW9uLjEifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsKLSAgICAJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkQoKX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiMiIsCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7Ci0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5EKCksCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5BKCkKLQkJCQkJCX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiMyIsCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7Ci0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5BKCksCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5EKCkKLQkJCQkJCX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJdHJ1ZQotCQkJKTsKLSAgICAJYXNzZXJ0UG9wdXBNZW51cygiNCIsCi0gICAgCQkJbmV3IFN0cmluZ1tdIHsiSUNvbW1vbi4xIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7Ci0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5Db21tb24oKSwKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkQoKQotCQkJCQkJfSksCi0JCQkJSUNvbW1vbi5jbGFzcywKLQkJCQl0cnVlCi0JCQkpOwotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCI1IiwKLSAgICAJCQluZXcgU3RyaW5nW10geyJJQ29tbW9uLjEifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgICAgCQkJCQkKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkQoKSwKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkNvbW1vbigpCi0JCQkJCQl9KSwKLQkJCQlJQ29tbW9uLmNsYXNzLAotCQkJCXRydWUKLQkJCSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3Qgbm9uLWFkYXB0YWJsZSBjb250cmlidXRpb25zCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3ROb25BZGFwdGFibGVDb250cmlidXRpb25zKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCIxIiwKLSAgICAJCQluZXcgU3RyaW5nW10geyJJQ29tbW9uLjIifSwgCi0gICAgCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsKLSAgICAJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkEoKSwKLQkJCQkJCW5ldyBPYmplY3RDb250cmlidXRpb25DbGFzc2VzLkIoKX0pLAotCQkJCUlDb21tb24uY2xhc3MsCi0JCQkJZmFsc2UKLQkJCSk7Ci0gICAgCWFzc2VydFBvcHVwTWVudXMoIjIiLAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IklDb21tb24uMiJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10gewotICAgIAkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuRCgpLAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQygpLAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQ29tbW9uKCl9KSwKLQkJCQlJQ29tbW9uLmNsYXNzLAotCQkJCXRydWUKLQkJCSk7IAotICAgIAlhc3NlcnRQb3B1cE1lbnVzKCIzIiwKLSAgICAJCQluZXcgU3RyaW5nW10geyJDb21tb24uMiJ9LCAKLSAgICAJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10gewotICAgIAkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuRCgpLAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQygpLAotCQkJCQkJbmV3IE9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMuQSgpfSksCi0JCQkJSUNvbW1vbi5jbGFzcywKLQkJCQlmYWxzZQotCQkJKTsgCi0gICAgCWFzc2VydFBvcHVwTWVudXMoIjQiLAotICAgIAkJCW5ldyBTdHJpbmdbXSB7IkNvbW1vbi4yIn0sIAotICAgIAkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7Ci0gICAgCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5CKCksCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5DKCksCi0JCQkJCQluZXcgT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3Nlcy5BKCl9KSwKLQkJCQlJQ29tbW9uLmNsYXNzLAotCQkJCWZhbHNlCi0JCQkpOyAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGVscGVyIGNsYXNzIHRoYXQgd2lsbCBjcmVhdGUgYSBwb3B1cCBtZW51IGJhc2VkIG9uIHRoZSBnaXZlbiBzZWxlY3Rpb24gYW5kCi0gICAgICogdGhlbiBlbnN1cmUgdGhhdCB0aGUgcHJvdmlkZWQgY29tbWFuZElkcyBhcmUgYWRkZWQgdG8gdGhlIG1lbnUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbW1hbmRJZHMgdGhlIGNvbW1hbmQgaWRzIHRoYXQgc2hvdWxkIGFwcGVhciBpbiB0aGUgbWVudQotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIHNlbGVjdGlvbiBvbiB3aGljaCB0byBjb250cmlidXRlIG9iamVjdCBjb250cmlidXRpb25zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXNzZXJ0UG9wdXBNZW51cyhTdHJpbmcgbmFtZSwgU3RyaW5nW10gY29tbWFuZElkcywgZmluYWwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sIENsYXNzIHNlbGVjdGlvblR5cGUsIGJvb2xlYW4gZXhpc3RhbmNlKSB7Ci0gICAgCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBJU2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJfQotCQkJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQkJCXJldHVybiBzZWxlY3Rpb247Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQl9Ci0JCX07Ci0JCQotCQkvLyBUaGUgcG9wdXAgZXh0ZW5kZXIgbmVlZHMgYSBwYXJ0IHRvIG5vdGlmeSBhY3Rpb25zIG9mIHRoZSBhY3RpdmUgcGFydAotICAgICAgICBmaW5hbCBXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gKFdvcmtiZW5jaFdpbmRvdykgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgZmluYWwgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnRSZWZlcmVuY2UoKS5nZXRQYXJ0KHRydWUpOwotICAgIAkKLSAgICAJIC8vIENyZWF0ZSBhIGZha2UgUG9wdXBNZW51RXh0ZW5kZXIgc28gd2UgY2FuIGdldCBzb21lIGRhdGEgYmFjay4KLSAgICAgICAgZmluYWwgTWVudU1hbmFnZXIgZmFrZU1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIGZha2VNZW51TWFuYWdlci5hZGQobmV3IEdyb3VwTWFya2VyKAotICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0gICAgICAgIGZpbmFsIFBvcHVwTWVudUV4dGVuZGVyIGV4dGVuZGVyID0gbmV3IFBvcHVwTWVudUV4dGVuZGVyKG51bGwsCi0gICAgICAgICAgICAgICAgZmFrZU1lbnVNYW5hZ2VyLCBzZWxlY3Rpb25Qcm92aWRlciwgcGFydCk7Ci0gICAgICAgIAotICAgICAgICAKLQotICAgICAgICAvKgotICAgICAgICAgKiBQcmV0ZW5kIHRvIHNob3cgdGhlIHBvcC11cCBtZW51IC0tIGxvb2tpbmcgdG8gbW90aXZhdGUgdGhlIGV4dGVuZGVyCi0gICAgICAgICAqIHRvIGZpbGwgdGhlIG1lbnUgYmFzZWQgb24gdGhlIHNlbGVjdGlvbiBwcm92aWRlci4KLSAgICAgICAgICogCi0gICAgICAgICAqIFRPRE8gVGhpcyBjYXVzZXMgYSBiaWcgZGVsYXkgKGluIHRoZSBvcmRlciBvZiBhIG1pbnV0ZSBvciBtb3JlKSB3aGlsZQotICAgICAgICAgKiB0cnlpbmcgdG8gZmlsbCB0aGlzIG1lbnUuIEl0IHNlZW1zIHRvIGJlIGxvYWRpbmcgYSBidW5jaCBvZiBwbHVnLWlucywKLSAgICAgICAgICogYW5kIGRvaW5nIGNsYXNzIGxvYWRpbmcuCi0gICAgICAgICAqLwotICAgICAgICBleHRlbmRlci5tZW51QWJvdXRUb1Nob3coZmFrZU1lbnVNYW5hZ2VyKTsKLQotICAgICAgICBleHRlbmRlci5kaXNwb3NlKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGFwcHJvcHJpYXRlIG9iamVjdCBjb250cmlidXRpb25zIGFyZSBwcmVzZW50LgotICAgICAgICBmaW5hbCBJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gZmFrZU1lbnVNYW5hZ2VyLmdldEl0ZW1zKCk7Ci0gICAgICAgIFNldCBzZWVuQ29tbWFuZHMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGNvbW1hbmRJZHMpKTsKLSAgICAgICAgTGlzdCBjb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChjb21tYW5kSWRzKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAvLyBTdGVwIDE6IHRlc3QgdGhlIHNlbGVjdGlvbgotICAgICAgICAgICBpZiAoc2VsZWN0aW9uVHlwZSAhPSBudWxsKSB7Ci0JCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IGNvbnRyaWJ1dGlvbkl0ZW07Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7Ci0JCQkJCWl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbkl0ZW0pLmdldElubmVySXRlbSgpOwotCQkJCX0KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFBsdWdpbkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJLy8gVmVyaWZ5IHRoYXQgdGhlIHNlbGVjdGlvbiBwYXNzZWQgdG8gdGhlIGFjdGlvbiBoYXMgYmVlbgotCQkJCQkvLyBjb252ZXJ0ZWQKLQkJCQkJUGx1Z2luQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBwYSA9IChQbHVnaW5BY3Rpb25Db250cmlidXRpb25JdGVtKSBpdGVtOwotCQkJCQlJU2VsZWN0aW9uIHMgPSBudWxsOwotCQkJCQlpZiAocyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgcykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXQubmV4dCgpOwotCQkJCQkJCWFzc2VydFRydWUobmFtZSArICIgc2VsZWN0aW9uIG5vdCBjb252ZXJ0ZWQiLCBzZWxlY3Rpb25UeXBlLmlzSW5zdGFuY2UoZWxlbWVudCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotICAgICAgICAgICAvLyBTdGVwIDI6IHJlbWVtYmVyIHRoYXQgd2Ugc2F3IHRoaXMgZWxlbWVudAotICAgICAgICAgICBTdHJpbmcgaWQgPSBjb250cmlidXRpb25JdGVtLmdldElkKCk7Ci0gICAgICAgICAgIGlmKGV4aXN0YW5jZSkgeyAgICAJCQotICAgICAgICAgICAJCWJvb2xlYW4gcmVtb3ZlZCA9IGNvbW1hbmRzLnJlbW92ZShpZCk7CQotICAgICAgICAgICAJCWlmKHNlZW5Db21tYW5kcy5jb250YWlucyhpZCkgJiYgISByZW1vdmVkKSB7Ci0gICAgICAgICAgIAkJCWZhaWwobmFtZSArICIgaXRlbSBkdXBsaWNhdGVkIGluIHRoZSBjb250ZXh0IG1lbnU6ICIgKyBpZCk7Ci0gICAgICAgICAgIAkJfSAgICAgICAgICAgCQkKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgCQlhc3NlcnRUcnVlKG5hbWUgKyAiIGl0ZW0gc2hvdWxkIG5vdCBiZSBpbiB0aGUgY29udGV4dCBtZW51IiwgISBjb21tYW5kcy5jb250YWlucyhpZCkpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKGV4aXN0YW5jZSAmJiAhIGNvbW1hbmRzLmlzRW1wdHkoKSkgewotICAgICAgICAJZmFpbChuYW1lICsgIiBNaXNzaW5nICIgKyBjb21tYW5kcy50b1N0cmluZygpICsgIiBmcm9tIGNvbnRleHQgbWVudS4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbWVudXMvUmVtb3ZlTWFya2Vyc0FjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tZW51cy9SZW1vdmVNYXJrZXJzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MjZjZTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tZW51cy9SZW1vdmVNYXJrZXJzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubWVudXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0UGx1Z2luOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZU1hcmtlcnNBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICB0aGlzLndpbmRvdyA9IHdpbmRvdzsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICB0cnkgewotCSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JICAgICAgICAKLQkgICAgICAgIElNYXJrZXJbXSBtYXJrZXJzID0gcm9vdC5maW5kTWFya2VycyhBZGRNYXJrZXJzQWN0aW9uLkNBVEVHT1JZX1RFU1RfTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCSAgICAgICAgCi0JICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IChTdHJpbmcpIG1hcmtlcnNbaV0uZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSk7Ci0KLQkgICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2Uuc3RhcnRzV2l0aCgidGhpcyBpcyBhIHRlc3QiKSkgewotCSAgICAgICAgICAgICAgICBtYXJrZXJzW2ldLmRlbGV0ZSgpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBvcGVuRXJyb3IoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb3BlbkVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtc2cgPSBlLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBUZXN0UGx1Z2luLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpLCAwLCBtc2csIGUpOwotCi0gICAgICAgIFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCi0gICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcih3aW5kb3cuZ2V0U2hlbGwoKSwgIkVycm9yIiwgbXNnLCBzdGF0dXMpOwotICAgIH0KLQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpZWRpdG9yL011bHRpRWRpdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tdWx0aWVkaXRvci9NdWx0aUVkaXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiMTMxNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpZWRpdG9yL011bHRpRWRpdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5tdWx0aWVkaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklDb250cmlidXRlZENvbnRlbnRzVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5DYWxsSGlzdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0IE11bHRpRWRpdG9yIGJlaGF2aW91ciB0byBoaWdobGlnaHQgc29tZSBvZiB0aGUgYnJva2VuIGZ1bmN0aW9uYWxpdHkuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIE11bHRpRWRpdG9yVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVE9PTFRJUCA9ICJNdWx0aUVkaXRvckFjdGlvblRoaW5nIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiVGlsZWRFZGl0b3JQcm9qZWN0IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX09VVExJTkUgPSAib3JnLmVjbGlwc2UudWkudmlld3MuQ29udGVudE91dGxpbmUiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RFRElUT1JfQ09PTEJBUiA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5tdWx0aWVkaXRvci5hY3Rpb25TZXQiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTEVEX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5tdWx0aWVkaXRvci5UaWxlZEVkaXRvciI7Ci0KLQkvLyB0aWxlZCBlZGl0b3IgdGVzdCBmaWxlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0ZJTEVTX0RJUiA9ICIvZGF0YS9vcmcuZWNsaXBzZS5uZXdNdWx0aUVkaXRvci8iOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1QwMV9UWFQgPSAidGVzdDAxLnR4dCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVDAyX1RYVCA9ICJ0ZXN0MDIudHh0IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUMDNfRVRFU1QgPSAidGVzdDAzLmV0ZXN0IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUMDRfUFJPUEVSVElFUyA9ICJ0ZXN0MDQucHJvcGVydGllcyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfWE1MID0gImJ1aWxkLnhtbCI7Ci0KLQkvLwotCS8vIGNhbGwgdHJhY2UgZm9yIHRoZSBlZGl0b3Igb3BlbiAtIHNldEZvY3VzIC0gY2xvc2UgdGVzdAotCS8vCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ0VkaXRvck9wZW5UcmFjZSA9IHsgInNldEluaXRpYWxpemF0aW9uRGF0YSIsCi0JCQkiaW5pdCIsICJjcmVhdGVQYXJ0Q29udHJvbCIsICJjcmVhdGVJbm5lclBhcnRDb250cm9sIiwKLQkJCSJjcmVhdGVJbm5lclBhcnRDb250cm9sIiwgInNldEZvY3VzIiwgInVwZGF0ZUdyYWRpZW50IiwKLQkJCSJ1cGRhdGVHcmFkaWVudCIsIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnRWRpdG9yRm9jdXNUcmFjZSA9IHsgInNldEluaXRpYWxpemF0aW9uRGF0YSIsCi0JCQkiaW5pdCIsICJjcmVhdGVQYXJ0Q29udHJvbCIsICJjcmVhdGVJbm5lclBhcnRDb250cm9sIiwKLQkJCSJjcmVhdGVJbm5lclBhcnRDb250cm9sIiwgInNldEZvY3VzIiwgInVwZGF0ZUdyYWRpZW50IiwKLQkJCSJ1cGRhdGVHcmFkaWVudCIsICJ1cGRhdGVHcmFkaWVudCIsICJ1cGRhdGVHcmFkaWVudCIsIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnRWRpdG9yQ2xvc2VUcmFjZSA9IHsgInNldEluaXRpYWxpemF0aW9uRGF0YSIsCi0JCQkiaW5pdCIsICJjcmVhdGVQYXJ0Q29udHJvbCIsICJjcmVhdGVJbm5lclBhcnRDb250cm9sIiwKLQkJCSJjcmVhdGVJbm5lclBhcnRDb250cm9sIiwgInNldEZvY3VzIiwgInVwZGF0ZUdyYWRpZW50IiwKLQkJCSJ1cGRhdGVHcmFkaWVudCIsICJ1cGRhdGVHcmFkaWVudCIsICJ1cGRhdGVHcmFkaWVudCIsCi0JCQkid2lkZ2V0c0Rpc3Bvc2VkIiwgImRpc3Bvc2UiIH07Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoTXVsdGlFZGl0b3JUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDYW4gY2F0Y2ggYSBNdWx0aUVkaXRvciB1bmV4cGVjdCBFeGNlcHRpb24gb24gaW5pdC4KLQkgKi8KLQlwcml2YXRlIEVkaXRvckVycm9yTGlzdGVuZXIgZkVycm9yTGlzdGVuZXI7Ci0KLQlwdWJsaWMgTXVsdGlFZGl0b3JUZXN0KFN0cmluZyB0YykgewotCQlzdXBlcih0Yyk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB0aGF0IHRoZSB0ZXN0IHRpbGVkIGVkaXRvciBjYW4gYmUgb3BlbmVkIHdpdGggYSBiYXNpYwotCSAqIE11bHRpRWRpdG9ySW5wdXQgd2l0aCB0aGUgc2FtZSB0eXBlIG9mIGZpbGVzLgotCSAqIAotCSAqIFRlc3Q6IFNlbGVjdCBhIGNvdXBsZSBvZiBmaWxlcyBmcm9tIG5hdmlnYXRvciBhbmQgdXNlIHRoZSBUaWxlZEVkaXRvcgotCSAqIG1lbnUgdG8gb3BlbiB0aGUgZWRpdG9yLiBJdCBzaG91bGQgb3BlbiB3aXRoIHRoZSBmaXJzdCBzZWxlY3RlZCBmaWxlIG9uCi0JICogdG9wLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICogICAgICAgICAgICAgb24gYW4gZXJyb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0T3BlbkJhc2ljRWRpdG9yKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWZpbmFsIFN0cmluZ1tdIHNpbXBsZUZpbGVzID0geyBURVNUMDFfVFhULCBURVNUMDJfVFhUIH07Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBmV29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQotCQlJUHJvamVjdCB0ZXN0UHJvamVjdCA9IGZpbmRPckNyZWF0ZVByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQotCQlNdWx0aUVkaXRvcklucHV0IGlucHV0ID0gZ2VuZXJhdGVFZGl0b3JJbnB1dChzaW1wbGVGaWxlcywgdGVzdFByb2plY3QpOwotCi0JCS8vIHZhbGlkYXRlIHRoZXJlIGFyZSBubyBOdWxsUG9pbnRlckV4Y2VwdGlvbnMgZHVyaW5nIGVkaXRvcgotCQkvLyBpbml0aWFsaXphdGlvbgotCQlvcGVuQW5kVmFsaWRhdGVFZGl0b3IocGFnZSwgaW5wdXQpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhhdCB0aGUgcHVibGljIG1ldGhvZHMgaW4gVGlsZWRFZGl0b3IgKGFuZCBNdWx0aUVkaXRvcikgYXJlIGNhbGxlZAotCSAqIGluIHRoZSBjb3JyZWN0IG9yZGVyIGZyb20gMy4wIHRvIDMuMS4KLQkgKiAKLQkgKiBUZXN0OiB0aGlzIHRlc3QgaW52b2x2ZXMgb3BlbmluZyB0aGUgdGlsZWQgZWRpdG9yIG9uIDIgZmlsZXMsIGNoYW5naW5nCi0JICogdGhlIGZvY3VzIGZyb20gdGhlIGZpcnN0IGZpbGUgdG8gdGhlIHNlY29uZCBmaWxlLCBhbmQgY2xvc2luZyB0aGUgdGlsZWQKLQkgKiBlZGl0b3IuCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0T3BlblRlc3RGaWxlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWZpbmFsIFN0cmluZ1tdIHNpbXBsZUZpbGVzID0geyBURVNUMDFfVFhULCBURVNUMDNfRVRFU1QgfTsKLQotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGZXb3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCVdvcmtiZW5jaFBhZ2UgcGFnZSA9IChXb3JrYmVuY2hQYWdlKSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCi0JCUlQcm9qZWN0IHRlc3RQcm9qZWN0ID0gZmluZE9yQ3JlYXRlUHJvamVjdChQUk9KRUNUX05BTUUpOwotCi0JCU11bHRpRWRpdG9ySW5wdXQgaW5wdXQgPSBnZW5lcmF0ZUVkaXRvcklucHV0KHNpbXBsZUZpbGVzLCB0ZXN0UHJvamVjdCk7Ci0KLQkJLy8gY2F0Y2hlcyB0aGUgZnJhbWV3b3JrIE5QRQotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBvcGVuQW5kVmFsaWRhdGVFZGl0b3IocGFnZSwgaW5wdXQpOwotCi0JCS8vIGRpZCB3ZSBnZXQgYSBtdWx0aWVkaXRvciBiYWNrPwotCQlhc3NlcnRUcnVlKGVkaXRvciBpbnN0YW5jZW9mIE11bHRpRWRpdG9yKTsKLQkJTXVsdGlFZGl0b3IgbXVsdGlFZGl0b3IgPSAoTXVsdGlFZGl0b3IpIGVkaXRvcjsKLQotCQljaGV3VXBFdmVudHMoKTsKLQotCQkvLyBsaXN0SGlzdG9yeSgoKFRpbGVkRWRpdG9yKSBtdWx0aUVkaXRvcikuY2FsbEhpc3RvcnkpOwotCi0JCS8vIGNoZWNrIHRoZSBwdWJsaWMgQVBJIGNhbGxlZCBmb3Igb3BlbmluZyB0aGUgVGlsZWRFZGl0b3IKLS8vCQkoKFRpbGVkRWRpdG9yKSBtdWx0aUVkaXRvcikuY2FsbEhpc3RvcnkucHJpbnRUb0NvbnNvbGUoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGVkaXRvciBvcGVuIHRyYWNlIHdhcyBpbmNvcnJlY3QiLAotCQkJCSgoVGlsZWRFZGl0b3IpIG11bHRpRWRpdG9yKS5jYWxsSGlzdG9yeQotCQkJCQkJLnZlcmlmeU9yZGVyKGdFZGl0b3JPcGVuVHJhY2UpKTsKLQotCQkvLyBzd2FwIGZvY3VzIHRvIHRoZSBsYXN0IGVkaXRvciwgd2hpY2ggaXMgdGhlIHRlc3QgZWRpdG9yCi0JCS8vIHdpdGggdGhlIHRlc3QgY29vbGJhciBjb250cmlidXRpb24KLQkJSUVkaXRvclBhcnRbXSBpbm5lckVkaXRvcnMgPSBtdWx0aUVkaXRvci5nZXRJbm5lckVkaXRvcnMoKTsKLQkJaW5uZXJFZGl0b3JzW2lubmVyRWRpdG9ycy5sZW5ndGggLSAxXS5zZXRGb2N1cygpOwotCi0JCWNoZXdVcEV2ZW50cygpOwotCi0JCS8vICgoVGlsZWRFZGl0b3IpIG11bHRpRWRpdG9yKS5jYWxsSGlzdG9yeS5wcmludFRvQ29uc29sZSgpOwotCQlhc3NlcnRUcnVlKCJFZGl0b3Igc2V0Rm9jdXMgdHJhY2Ugd2FzIGluY29ycmVjdCIsCi0JCQkJKChUaWxlZEVkaXRvcikgbXVsdGlFZGl0b3IpLmNhbGxIaXN0b3J5Ci0JCQkJCQkudmVyaWZ5T3JkZXIoZ0VkaXRvckZvY3VzVHJhY2UpKTsKLQotCQlwYWdlLmNsb3NlRWRpdG9yKG11bHRpRWRpdG9yLCBmYWxzZSk7Ci0KLQkJY2hld1VwRXZlbnRzKCk7Ci0KLQkJLy8gKChUaWxlZEVkaXRvcikgbXVsdGlFZGl0b3IpLmNhbGxIaXN0b3J5LnByaW50VG9Db25zb2xlKCk7Ci0JCWFzc2VydFRydWUoIkVkaXRvciBjbG9zZSB0cmFjZSB3YXMgaW5jb3JyZWN0IiwKLQkJCQkoKFRpbGVkRWRpdG9yKSBtdWx0aUVkaXRvcikuY2FsbEhpc3RvcnkKLQkJCQkJCS52ZXJpZnlPcmRlcihnRWRpdG9yQ2xvc2VUcmFjZSkpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhhdCBjb29sYmFyIGl0ZW1zIGluIHRoZSB3b3JrYmVuY2ggYXJlIHVwZGF0ZWQgd2hlbiBmb2N1cyBtb3ZlcwotCSAqIHRocm91Z2ggdGhlIGRpZmZlcmVudCBpbm5lciBlZGl0b3JzIC4uLiB0aGlzIHRlc3QgYXMgd3JpdHRlbiBpcyBub3QgMTAwJQotCSAqIGFjY3VyYXRlLCBhcyB0aGUgaXRlbXMgYXJlIGVuYWJsZWQuCi0JICogCi0JICogVGVzdDogT3BlbiB0d28gZmlsZXMgd2hlcmUgdGhlIGZpcnN0IGlzIGEgdGV4dCBmaWxlIGFuZCB0aGUgc2Vjb25kIGlzIG9mCi0JICogdHlwZSBldGVzdC4gQ2hhbmdlIGZvY3VzIHRvIHRoZSBldGVzdCBmaWxlLCBhbmQgdGhlIGNvb2xiYXIgc2hvdWxkIHVwZGF0ZQotCSAqIHdpdGggYSBuZXcgYWN0aW9uIGljb24gYW5kIGl0IHNob3VsZCBiZSBlbmFibGVkLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICogICAgICAgICAgICAgb24gYW4gZXJyb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhY2tDb29sQmFyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWZpbmFsIFN0cmluZ1tdIHNpbXBsZUZpbGVzID0geyBURVNUMDFfVFhULCBURVNUMDJfVFhULAotCQkJCVRFU1QwNF9QUk9QRVJUSUVTLCBCVUlMRF9YTUwsIFRFU1QwM19FVEVTVCB9OwotCi0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZldvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJV29ya2JlbmNoUGFnZSBwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0KLQkJSVByb2plY3QgdGVzdFByb2plY3QgPSBmaW5kT3JDcmVhdGVQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0KLQkJTXVsdGlFZGl0b3JJbnB1dCBpbnB1dCA9IGdlbmVyYXRlRWRpdG9ySW5wdXQoc2ltcGxlRmlsZXMsIHRlc3RQcm9qZWN0KTsKLQotCQkvLyBjYXRjaGVzIHRoZSBmcmFtZXdvcmsgTlBFCi0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IG9wZW5BbmRWYWxpZGF0ZUVkaXRvcihwYWdlLCBpbnB1dCk7Ci0KLQkJLy8gZGlkIHdlIGdldCBhIG11bHRpZWRpdG9yIGJhY2s/Ci0JCWFzc2VydFRydWUoZWRpdG9yIGluc3RhbmNlb2YgTXVsdGlFZGl0b3IpOwotCQlNdWx0aUVkaXRvciBtdWx0aUVkaXRvciA9IChNdWx0aUVkaXRvcikgZWRpdG9yOwotCi0JCWNoZXdVcEV2ZW50cygpOwotCi0JCS8vIGdldCBhY2Nlc3MgdG8gdGhlIGFwcHJvcHJpYXRlIGNvb2xiYXIKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uID0gZmluZE15Q29vbEJhcihwYWdlKTsKLQotCQkvLyBvdXIgdGVzdCBlZGl0b3IgY29udHJpYnV0aW9uIHNob3VsZCBub3QgYmUgdmlzaWJsZQotCQkvLyBidXQgaXQgc2hvdWxkIGJlIGVuYWJsZWQKLQkJdmFsaWRhdGVJY29uU3RhdGUoY29udHJpYnV0aW9uLCBBQ1RJT05fVE9PTFRJUCwgZmFsc2UpOwotCi0JCS8vIHN3YXAgZm9jdXMgdG8gdGhlIGxhc3QgZWRpdG9yLCB3aGljaCBpcyB0aGUgdGVzdCBlZGl0b3IKLQkJLy8gd2l0aCB0aGUgdGVzdCBjb29sYmFyIGNvbnRyaWJ1dGlvbgotCQlJRWRpdG9yUGFydFtdIGlubmVyRWRpdG9ycyA9IG11bHRpRWRpdG9yLmdldElubmVyRWRpdG9ycygpOwotCQlpbm5lckVkaXRvcnNbaW5uZXJFZGl0b3JzLmxlbmd0aCAtIDFdLnNldEZvY3VzKCk7Ci0KLQkJY2hld1VwRXZlbnRzKCk7Ci0KLQkJY29udHJpYnV0aW9uID0gZmluZE15Q29vbEJhcihwYWdlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiSXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBub3ciLCBjb250cmlidXRpb24pOwotCi0JCS8vIG91ciB0ZXN0IGVkaXRvciBjb250cmlidXRpb24gc2hvdWxkIG5vdyBiZSB2aXNpYmxlIGFuZAotCQkvLyBlbmFibGVkCi0JCXZhbGlkYXRlSWNvblN0YXRlKGNvbnRyaWJ1dGlvbiwgQUNUSU9OX1RPT0xUSVAsIHRydWUpOwotCi0JfQotCi0JLyoqCi0JICogVGVzdCB0aGF0IHRoZSBvdXRsaW5lIHZpZXcgaXMgdXBkYXRlZCB3aGVuIGZvY3VzIG1vdmVzIGZyb20gYW4gZWRpdG9yIHRvCi0JICogdGhlIGFudCBlZGl0b3IuCi0JICogCi0JICogVGVzdDogT3BlbiAyIGZpbGVzIHdoZXJlIHRoZSBmaXJzdCBpcyBhIHRleHQgZmlsZSBhbmQgdGhlIHNlY29uZCBpcyBhbgotCSAqIGFudCBmaWxlLiBTZXQgZm9jdXMgb24gdGhlIGFudCBmaWxlLCBhbmQgdGhlIG91dGxpbmUgc2hvdWxkIGJlIHVwZGF0ZWQgdG8KLQkgKiByZWZsZWN0IHRoZSBidWlsZGZpbGUgb3V0bGluZS4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqICAgICAgICAgICAgIG9uIGFuIGVycm9yCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRyYWNrT3V0bGluZSgpIHRocm93cyBUaHJvd2FibGUgewotCQlmaW5hbCBTdHJpbmdbXSBzaW1wbGVGaWxlcyA9IHsgVEVTVDAxX1RYVCwgVEVTVDAyX1RYVCwKLQkJCQlURVNUMDRfUFJPUEVSVElFUywgQlVJTERfWE1MLCBURVNUMDNfRVRFU1QgfTsKLQotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGZXb3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCVdvcmtiZW5jaFBhZ2UgcGFnZSA9IChXb3JrYmVuY2hQYWdlKSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCi0JCUlQcm9qZWN0IHRlc3RQcm9qZWN0ID0gZmluZE9yQ3JlYXRlUHJvamVjdChQUk9KRUNUX05BTUUpOwotCi0JCU11bHRpRWRpdG9ySW5wdXQgaW5wdXQgPSBnZW5lcmF0ZUVkaXRvcklucHV0KHNpbXBsZUZpbGVzLCB0ZXN0UHJvamVjdCk7Ci0KLQkJLy8gY2F0Y2hlcyB0aGUgZnJhbWV3b3JrIE5QRQotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBvcGVuQW5kVmFsaWRhdGVFZGl0b3IocGFnZSwgaW5wdXQpOwotCi0JCS8vIGRpZCB3ZSBnZXQgYSBtdWx0aWVkaXRvciBiYWNrPwotCQlhc3NlcnRUcnVlKGVkaXRvciBpbnN0YW5jZW9mIE11bHRpRWRpdG9yKTsKLQkJTXVsdGlFZGl0b3IgbXVsdGlFZGl0b3IgPSAoTXVsdGlFZGl0b3IpIGVkaXRvcjsKLQotCQljaGV3VXBFdmVudHMoKTsKLQotCQkvLyBTd2FwIHRvIHRoZSBzZWNvbmQgbGFzdCBlZGl0b3IsIHdoaWNoIHNob3VsZCBiZSB0aGUgYW50Ci0JCS8vIGJ1aWxkIGVkaXRvci4KLQkJSUVkaXRvclBhcnRbXSBpbm5lckVkaXRvcnMgPSBtdWx0aUVkaXRvci5nZXRJbm5lckVkaXRvcnMoKTsKLQkJaW5uZXJFZGl0b3JzW2lubmVyRWRpdG9ycy5sZW5ndGggLSAyXS5zZXRGb2N1cygpOwotCQljaGV3VXBFdmVudHMoKTsKLQotCQkvLyBnZXQgdGhlIG91dGxpbmUgdmlldyBwYXJ0Ci0JCUlWaWV3UGFydCBvdXRsaW5lID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5zaG93VmlldyhDT05URU5UX09VVExJTkUpOwotCQlhc3NlcnROb3ROdWxsKG91dGxpbmUpOwotCi0JCS8vIGZpbmQgb3V0IHdobyBpcyBjb250cmlidXRpbmcgdGhlIG91dGxpbmUgdmlldy4KLQkJSUNvbnRyaWJ1dGVkQ29udGVudHNWaWV3IHZpZXcgPSAoSUNvbnRyaWJ1dGVkQ29udGVudHNWaWV3KSBvdXRsaW5lCi0JCQkJLmdldEFkYXB0ZXIoSUNvbnRyaWJ1dGVkQ29udGVudHNWaWV3LmNsYXNzKTsKLQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHZpZXcuZ2V0Q29udHJpYnV0aW5nUGFydCgpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgT3V0bGluZSB2aWV3IGhhcyBub3QgYmVlbiB1cGRhdGVkIGJ5IHRoZSBlZGl0b3IiLAotCQkJCXBhcnQpOwotCQlhc3NlcnRUcnVlKCJUaGUgT3V0bGluZSB2aWV3IGlzIG5vdCB0YWxraW5nIHRvIGFuIGVkaXRvciIsCi0JCQkJcGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KTsKLQotCQlJRWRpdG9yUGFydCBvdXRsaW5lRWRpdG9yID0gKElFZGl0b3JQYXJ0KSBwYXJ0OwotCi0JCS8vIHRoZSBhY3RpdmUgaW5uZXIgZWRpdG9yICh0aGUgYW50IGVkaXRvcikgc2hvdWxkIGFsc28KLQkJLy8gYmUgdGhlIG91dGxpbmUgZWRpdG9yIGNvbnRyaWJ1dG9yIC4uLiB0aGlzIHdvcmtzIGluCi0JCS8vIDMuMCwgZmFpbHMgaW4gMy4xCi0JCWFzc2VydEVxdWFscygiVGhlIE91dGxpbmUgdmlldyBpcyBub3QgdGFsa2luZyB0byB0aGUgY29ycmVjdCBlZGl0b3IiLAotCQkJCW11bHRpRWRpdG9yLmdldEFjdGl2ZUVkaXRvcigpLCBvdXRsaW5lRWRpdG9yKTsKLQkJCi0JCXBhZ2UuY2xvc2VFZGl0b3IoZWRpdG9yLCBmYWxzZSk7Ci0JCWNoZXdVcEV2ZW50cygpOwotCQkKLQkJdmlldyA9IChJQ29udHJpYnV0ZWRDb250ZW50c1ZpZXcpIG91dGxpbmUKLQkJCQkuZ2V0QWRhcHRlcihJQ29udHJpYnV0ZWRDb250ZW50c1ZpZXcuY2xhc3MpOwotCQlhc3NlcnROdWxsKHZpZXcuZ2V0Q29udHJpYnV0aW5nUGFydCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlc3QgZWRpdG9yIGNvb2xiYXIuCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSB3b3JrYmVuY2ggcGFnZQotCSAqIEByZXR1cm4gdGhlIElDb250cmlidXRpb25JdGVtIGZvciB0aGUgdGVzdCBlZGl0b3IgY29vbCBiYXIuCi0JICovCi0JcHJpdmF0ZSBJQ29udHJpYnV0aW9uSXRlbSBmaW5kTXlDb29sQmFyKFdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQkvLyBsaXN0SXRlbXMocGFnZSk7Ci0JCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbiA9ICgoSUFjdGlvbkJhcnMyKSBwYWdlLmdldEFjdGlvbkJhcnMoKSkKLQkJCQkuZ2V0Q29vbEJhck1hbmFnZXIoKS5maW5kKFRFU1RFRElUT1JfQ09PTEJBUik7Ci0JCS8vIGFzc2VydE5vdE51bGwoY29udHJpYnV0aW9uKTsKLQotCQlyZXR1cm4gY29udHJpYnV0aW9uOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBzdGF0ZSBvZiBhbiBpY29uIGluIHRoZSB0b29sYmFyLgotCSAqIAotCSAqIEBwYXJhbSBjb250cmlidXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBoaWdoIGxldmVsIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBjb29sYmFyIHRvIGxvb2sgdGhyb3VnaAotCSAqIEBwYXJhbSB0b29sdGlwCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgYWN0aW9uJ3MgdG9vbHRpcAotCSAqIEBwYXJhbSBzdGF0ZQotCSAqICAgICAgICAgICAgc2hvdWxkIGl0IGJlIHRydWUgb3IgZmFsc2UKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVJY29uU3RhdGUoSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uLAotCQkJU3RyaW5nIHRvb2x0aXAsIGJvb2xlYW4gc3RhdGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiV2UgbWlnaHQgbm90IGhhdmUgdGhlIGNvbnRyaWJ1dGlvbiBvciBleHBlY3QgaXQiLAotCQkJCWNvbnRyaWJ1dGlvbiAhPSBudWxsIHx8ICFzdGF0ZSk7Ci0JCWlmIChjb250cmlidXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIgPSAoVG9vbEJhck1hbmFnZXIpICgoVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbikKLQkJCQkuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJVG9vbEJhciBiYXIgPSB0b29sQmFyTWFuYWdlci5nZXRDb250cm9sKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiSXQncyBPSyBmb3IgYmFyIHRvIGJlIG51bGwgaWYgd2UgZXhwZWN0IHN0YXRlIHRvIGJlIGZhbHNlIiwKLQkJCQliYXIgIT0gbnVsbCB8fCAhc3RhdGUpOwotCQlpZiAoYmFyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVRvb2xJdGVtW10gaXRlbXMgPSBiYXIuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewotCQkJLy8gU3lzdGVtLmVyci5wcmludGxuKCJJdGVtOiAiICsgaXRlbXNbaV0uZ2V0VG9vbFRpcFRleHQoKSk7Ci0JCQlpZiAodG9vbHRpcC5lcXVhbHMoaXRlbXNbaV0uZ2V0VG9vbFRpcFRleHQoKSkpIHsKLQkJCQlhc3NlcnRFcXVhbHMoIkludmFsaWQgaWNvbiBzdGF0ZSBmb3IgIiArIHRvb2x0aXAsIHN0YXRlLAotCQkJCQkJaXRlbXNbaV0uZ2V0RW5hYmxlZCgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RmFsc2UoIldlIGhhdmVuJ3QgZm91bmQgb3VyIGl0ZW0iLCBzdGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBwcm9qZWN0IHRvIHdvcmsgaW4uIElmIGl0IGFscmVhZHkgZXhpc3RzLCBqdXN0IG9wZW4gaXQuCi0JICogCi0JICogQHBhcmFtIHByb2plY3ROYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0byBjcmVhdGUKLQkgKiBAcmV0dXJuIHRoZSBuZXdseSBvcGVuZWQgcHJvamVjdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgSVByb2plY3QgZmluZE9yQ3JlYXRlUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUHJvamVjdCB0ZXN0UHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmICghdGVzdFByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXRlc3RQcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkJfQotCQl0ZXN0UHJvamVjdC5vcGVuKG51bGwpOwotCQlyZXR1cm4gdGVzdFByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwgcHJpbnRpbmcgbWV0aG9kLCBvbmx5IHVzZWQgZm9yIGludmVzdGlnYXRpb24uCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSB3b3JrYmVuY2ggcGFnZQotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja1ZpZXcoV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCUlWaWV3UGFydFtdIHZpZXdzID0gcGFnZS5nZXRWaWV3cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZpZXdzLmxlbmd0aDsgKytpKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oInZpZXc6ICIgKyB2aWV3c1tpXS5nZXRWaWV3U2l0ZSgpLmdldElkKCkgKyAiLyIKLQkJCQkJKyB2aWV3c1tpXS5nZXRWaWV3U2l0ZSgpLmdldFJlZ2lzdGVyZWROYW1lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgdGhlIGNhbGwgaGlzdG9yeSB0byBjb25zb2xlLiBPbmx5IHVzZWQgZm9yIGludmVzdGlnYXRpb24uCi0JICogCi0JICogQHBhcmFtIGhpc3RvcnkKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0b3IgY2FsbCBoaXN0b3J5IG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbGlzdEhpc3RvcnkoQ2FsbEhpc3RvcnkgaGlzdG9yeSkgewotCQloaXN0b3J5LnByaW50VG9Db25zb2xlKCk7Ci0JfQotCi0JLyoqCi0JICogTGlzdCBiaXRzIGFuZCBpbnRlcm5hbHMgb2YgdGhlIGNvb2xiYXIgbWFuYWdlciBjb250cmlidXRpb24gaXRlbXMuIE9ubHkKLQkgKiB1c2VkIGZvciBpbnZlc3RpZ2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlCi0JICogICAgICAgICAgICB0aGUgd29ya2JlbmNoIHBhZ2UKLQkgKi8KLQlwcml2YXRlIHZvaWQgbGlzdEl0ZW1zKFdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQljaGVja1ZpZXcocGFnZSk7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSAoKElBY3Rpb25CYXJzMikgcGFnZS5nZXRBY3Rpb25CYXJzKCkpCi0JCQkJLmdldENvb2xCYXJNYW5hZ2VyKCkuZ2V0SXRlbXMoKTsKLQkJU3lzdGVtLmVyci5wcmludGxuKCJMZW5ndGg6ICIgKyBpdGVtcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIiIgKyBpdGVtc1tpXS5pc0VuYWJsZWQoKSArICI6IgotCQkJCQkrIGl0ZW1zW2ldLmlzVmlzaWJsZSgpICsgIiAiICsgaXRlbXNbaV0uZ2V0SWQoKSArICJcblx0IgotCQkJCQkrIGl0ZW1zW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCWlmIChpdGVtc1tpXSBpbnN0YW5jZW9mIFRvb2xCYXJDb250cmlidXRpb25JdGVtKSB7Ci0JCQkJZGlzcGxheUl0ZW0oaXRlbXNbaV0pOwotCQkJfQotCQl9Ci0JCVN5c3RlbS5lcnIucHJpbnRsbigiLS0tLSIpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgYml0cyBvZiBjb250cmlidXRpb24gaXRlbSBpbnRlcm5hbHMgdG8gdGhlIGNvbnNvbGUuIE9ubHkgdXNlZCBmb3IKLQkgKiBpbnZlc3RpZ2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb250cmlidXRpb25JdGVtCi0JICogICAgICAgICAgICB0aGUgSUNvbnRyaWJ1dGlvbkl0ZW0gdG8gZGlzcGxheQotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNwbGF5SXRlbShJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtKSB7Ci0JCVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyID0gKFRvb2xCYXJNYW5hZ2VyKSAoKFRvb2xCYXJDb250cmlidXRpb25JdGVtKSBjb250cmlidXRpb25JdGVtKQotCQkJCS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQlUb29sQmFyIGJhciA9IHRvb2xCYXJNYW5hZ2VyLmdldENvbnRyb2woKTsKLQkJaWYgKGJhciA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlx0SW5mby1pdGVtczogLTEiKTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiXHRJbmZvLWl0ZW1zOiAiICsgYmFyLmdldEl0ZW1Db3VudCgpICsgIi8iCi0JCQkJCSsgYmFyLmdldEVuYWJsZWQoKSArICIvIiArIGJhci5pc0VuYWJsZWQoKSArICIvIgotCQkJCQkrIGJhci5pc1Zpc2libGUoKSk7Ci0JCQlUb29sSXRlbVtdIHRvb2xzID0gYmFyLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCB0ID0gMDsgdCA8IHRvb2xzLmxlbmd0aDsgKyt0KSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJcdFx0aXRlbTogIiArIHRvb2xzW3RdLmdldEVuYWJsZWQoKSArICIgIgotCQkJCQkJKyB0b29sc1t0XS5nZXRUb29sVGlwVGV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFmdGVyIGFuIGludGVybmFsIGFjdGlvbiwgc2VlIGlmIHRoZXJlIGFyZSBhbnkgb3V0c3RhbmRpbmcgU1dUIGV2ZW50cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hld1VwRXZlbnRzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQl3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIHRoZSB0ZXN0IGVkaXRvci4gSXQgZG9lcyBiYXNpYyB2YWxpZGF0aW9uIHRoYXQgdGhlcmUgaXMgbm8KLQkgKiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSB3b3JrYmVuY2ggcGFnZQotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgdGhlIGVkaXRvciBpbnB1dCB3aXRoIG11bHRpcGxlIGZpbGVzCi0JICogQHJldHVybiB0aGUgTXVsdGlFZGl0b3IKLQkgKiBAdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBJRWRpdG9yUGFydCBvcGVuQW5kVmFsaWRhdGVFZGl0b3IoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCU11bHRpRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0KLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzZXR1cEVycm9yTGlzdGVuZXIoKTsKLQkJCWVkaXRvclBhcnQgPSBwYWdlCi0JCQkJCS5vcGVuRWRpdG9yKGlucHV0LCBNdWx0aUVkaXRvclRlc3QuVElMRURfRURJVE9SX0lEKTsKLQkJCWFzc2VydE5vdE51bGwoZWRpdG9yUGFydCk7Ci0KLQkJCS8vIDMuMS4wIG9ubHkKLQkJCS8vIGFzc2VydEZhbHNlKCJUaGUgZWRpdG9yIG5ldmVyIGFjdHVhbGl6ZWQiLAotCQkJLy8gZWRpdG9yUGFydCBpbnN0YW5jZW9mIEVycm9yRWRpdG9yUGFydCk7Ci0KLQkJCWFzc2VydFRydWUoIkNyZWF0aW9uIGVycm9yOiAiICsgZkVycm9yTGlzdGVuZXIuZkVycm9yTXNnLAotCQkJCQlmRXJyb3JMaXN0ZW5lci5mTm9FcnJvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVFcnJvckxpc3RlbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRvclBhcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHVwIHRvIGNhdGNoIGFueSBlZGl0b3IgaW5pdGlhbGl6YXRpb24gZXhjZXB0aW9ucy4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBFcnJvckxpc3RlbmVyKCkgewotCQlmaW5hbCBJTG9nIGxvZyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCk7Ci0JCWZFcnJvckxpc3RlbmVyID0gbmV3IEVkaXRvckVycm9yTGlzdGVuZXIoKTsKLQkJbG9nLmFkZExvZ0xpc3RlbmVyKGZFcnJvckxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGVkaXRvciBlcnJvciBsaXN0ZW5lci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRXJyb3JMaXN0ZW5lcigpIHsKLQkJZmluYWwgSUxvZyBsb2cgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpOwotCQlpZiAoZkVycm9yTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJbG9nLnJlbW92ZUxvZ0xpc3RlbmVyKGZFcnJvckxpc3RlbmVyKTsKLQkJCWZFcnJvckxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgbXVsdGkgZWRpdG9yIGlucHV0IGluIHRoZSBnaXZlbiBwcm9qZWN0LiBDcmVhdGVzIHRoZSBmaWxlcyBpbgotCSAqIHRoZSBwcm9qZWN0IGZyb20gdGVtcGxhdGUgZmlsZXMgaW4gdGhlIGNsYXNzcGF0aCBpZiB0aGV5IGRvbid0IGFscmVhZHkKLQkgKiBleGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gc2ltcGxlRmlsZXMKLQkgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBmaWxlbmFtZXMgdG8gY29weSBvdmVyCi0JICogQHBhcmFtIHRlc3RQcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0byBjcmVhdGUgdGhlIGZpbGVzIGluCi0JICogQHJldHVybiB0aGUgZWRpdG9yIGlucHV0IHVzZWQgdG8gb3BlbiB0aGUgbXVsdGllZGl0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBNdWx0aUVkaXRvcklucHV0IGdlbmVyYXRlRWRpdG9ySW5wdXQoU3RyaW5nW10gc2ltcGxlRmlsZXMsCi0JCQlJUHJvamVjdCB0ZXN0UHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1tzaW1wbGVGaWxlcy5sZW5ndGhdOwotCQlJRWRpdG9ySW5wdXRbXSBpbnB1dHMgPSBuZXcgSUVkaXRvcklucHV0W3NpbXBsZUZpbGVzLmxlbmd0aF07Ci0JCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IGZXb3JrYmVuY2guZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQotCQlmb3IgKGludCBmID0gMDsgZiA8IHNpbXBsZUZpbGVzLmxlbmd0aDsgKytmKSB7Ci0JCQlJRmlsZSBmMSA9IHRlc3RQcm9qZWN0LmdldEZpbGUoc2ltcGxlRmlsZXNbZl0pOwotCQkJaWYgKCFmMS5leGlzdHMoKSkgewotCQkJCVVSTCBmaWxlID0gUGxhdGZvcm0uYXNMb2NhbFVSTChUZXN0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldEJ1bmRsZSgpLmdldEVudHJ5KERBVEFfRklMRVNfRElSICsgc2ltcGxlRmlsZXNbZl0pKTsKLQkJCQlmMS5jcmVhdGUoZmlsZS5vcGVuU3RyZWFtKCksIHRydWUsIG51bGwpOwotCQkJfQotCQkJaWRzW2ZdID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmMS5nZXROYW1lKCkpLmdldElkKCk7Ci0JCQlpbnB1dHNbZl0gPSBuZXcgRmlsZUVkaXRvcklucHV0KGYxKTsKLQkJfQotCi0JCU11bHRpRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgTXVsdGlFZGl0b3JJbnB1dChpZHMsIGlucHV0cyk7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSBhbnkgZWRpdG9ycyBhdCB0aGUgYmVnaW5uZXIgb2YgYSB0ZXN0LCBzbyB0aGUgdGVzdCBjYW4gYmUgY2xlYW4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5kb1NldFVwKCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBmV29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJcGFnZS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCi0JfQotCi0JLyoqCi0JICogTGlzdGVucyBmb3IgdGhlIHN0YW5kYXJkIG1lc3NhZ2UgdGhhdCBpbmRpY2F0ZXMgdGhlIE11bHRpRWRpdG9yIGZhaWxlZAotCSAqIC4uLiB1c3VhbGx5IGNhdXNlZCBieSBpbmNvcnJlY3QgZnJhbWV3b3JrIGluaXRpYWxpemF0aW9uIHRoYXQgZG9lc24ndCBzZXQKLQkgKiB0aGUgaW5uZXJDaGlsZHJlbi4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFZGl0b3JFcnJvckxpc3RlbmVyIGltcGxlbWVudHMgSUxvZ0xpc3RlbmVyIHsKLQkJcHVibGljIGJvb2xlYW4gZk5vRXJyb3IgPSB0cnVlOwotCi0JCXB1YmxpYyBTdHJpbmcgZkVycm9yTXNnID0gbnVsbDsKLQotCQlwdWJsaWMgdm9pZCBsb2dnaW5nKElTdGF0dXMgc3RhdHVzLCBTdHJpbmcgcGx1Z2luKSB7Ci0JCQlmTm9FcnJvciA9IGZhbHNlOwotCQkJZkVycm9yTXNnID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCVRocm93YWJsZSBleCA9IHN0YXR1cy5nZXRFeGNlcHRpb24oKTsKLQkJCWlmIChleCAhPSBudWxsKSB7Ci0JCQkJZkVycm9yTXNnICs9ICI6ICIgKyBleC5nZXRNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpZWRpdG9yL011bHRpRWRpdG9yVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpZWRpdG9yL011bHRpRWRpdG9yVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmZmZjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tdWx0aWVkaXRvci9NdWx0aUVkaXRvclRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpZWRpdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIE11bHRpRWRpdG9yVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBNdWx0aUVkaXRvclRlc3RTdWl0ZSgpOwotCX0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIHRlc3Qgc3VpdGUuCi0gICAgICovCi0gICAgcHVibGljIE11bHRpRWRpdG9yVGVzdFN1aXRlKCkgewotICAgICAgICBhZGRUZXN0U3VpdGUoTXVsdGlFZGl0b3JUZXN0LmNsYXNzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpZWRpdG9yL1Rlc3RBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tdWx0aWVkaXRvci9UZXN0QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyYTBjOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpZWRpdG9yL1Rlc3RBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi1wdWJsaWMgY2xhc3MgVGVzdEFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JcHVibGljIFRlc3RBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb0Nvb2xCYXIob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb29sQmFyTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Db29sQmFyKElDb29sQmFyTWFuYWdlciBjb29sQmFyTWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9Db29sQmFyKGNvb2xCYXJNYW5hZ2VyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpZWRpdG9yL1Rlc3RFZGl0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbXVsdGllZGl0b3IvVGVzdEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDJiZDMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbXVsdGllZGl0b3IvVGVzdEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OwotCi0vKioKLSAqIEEgdGVzdCBlZGl0b3IgdGhhdCBkb2VzIHByZXR0eS13ZWxsIG5vdGhpbmcuICBBY3RpdmF0aW5nIGl0IHdpbGwKLSAqIHVwZGF0ZSB0aGUgY29vbGJhciwgYW5kIHBvc3NpYmx5IGV2ZW50dWFsbHkgdGhlIG91dGxpbmUgYXMgd2VsbC4KLSAqIAotICogQHNpbmNlIDMuMQotICoKLSAqLwotcHVibGljIGNsYXNzIFRlc3RFZGl0b3IgZXh0ZW5kcyBFZGl0b3JQYXJ0IHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGZNYWluUGFuZWw7Ci0KLQlwdWJsaWMgVGVzdEVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlpZiAoIShpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpKQotCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKAotCQkJCQkiSW52YWxpZCBJbnB1dDogTXVzdCBiZSBJRmlsZUVkaXRvcklucHV0Iik7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlmTWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJZk1haW5QYW5lbC5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuVkVSVElDQUwpKTsKLQotCQlMYWJlbCBsID0gbmV3IExhYmVsKGZNYWluUGFuZWwsIFNXVC5OT05FKTsKLQkJbC5zZXRUZXh0KCJFZGl0b3IgVGl0bGU6Iik7Ci0KLQkJbCA9IG5ldyBMYWJlbChmTWFpblBhbmVsLCBTV1QuQk9SREVSKTsKLQkJbC5zZXRUZXh0KGdldEVkaXRvcklucHV0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWZNYWluUGFuZWwuc2V0Rm9jdXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbXVsdGllZGl0b3IvVGlsZWRFZGl0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbXVsdGllZGl0b3IvVGlsZWRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5NDQ1Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpZWRpdG9yL1RpbGVkRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuQ2FsbEhpc3Rvcnk7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgYSBUaWxlZEVkaXRvci4gVGhpcyBpcyB0aGUgdGVzdGFibGUgdmVyc2lvbiBjb3BpZWQgZnJvbSBidWcKLSAqIDQyNjQxLgotICovCi1wdWJsaWMgY2xhc3MgVGlsZWRFZGl0b3IgZXh0ZW5kcyBNdWx0aUVkaXRvciB7Ci0KLQlwcml2YXRlIENMYWJlbCBpbm5lckVkaXRvclRpdGxlW107Ci0KLQlwdWJsaWMgQ2FsbEhpc3RvcnkgY2FsbEhpc3Rvcnk7Ci0KLQlwdWJsaWMgVGlsZWRFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCWNhbGxIaXN0b3J5ID0gbmV3IENhbGxIaXN0b3J5KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIHRlY2huaWNhbGx5IG5vdCBwYXJ0IG9mIG91ciBmcmFtZXdvcmsgQVBJLCBidXQgaXQgd2lsbCBtYXJrIHdoZW4gdGhlCi0JICogd2lkZ2V0cyB3ZXJlIGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldHNEaXNwb3NlZCgpIHsKLQkJY2FsbEhpc3RvcnkuYWRkKCJ3aWRnZXRzRGlzcG9zZWQiKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVdvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY2FsbEhpc3RvcnkuYWRkKCJjcmVhdGVQYXJ0Q29udHJvbCIpOwotCi0JCXBhcmVudC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJd2lkZ2V0c0Rpc3Bvc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuQk9SREVSKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlTYXNoRm9ybSBzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5IT1JJWk9OVEFMKTsKLQkJSUVkaXRvclBhcnQgaW5uZXJFZGl0b3JzW10gPSBnZXRJbm5lckVkaXRvcnMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGlubmVyRWRpdG9ycy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgSUVkaXRvclBhcnQgZSA9IGlubmVyRWRpdG9yc1tpXTsKLQkJCVZpZXdGb3JtIHZpZXdGb3JtID0gbmV3IFZpZXdGb3JtKHNhc2hGb3JtLCBTV1QuTk9ORSk7Ci0JCQl2aWV3Rm9ybS5tYXJnaW5XaWR0aCA9IDA7Ci0JCQl2aWV3Rm9ybS5tYXJnaW5IZWlnaHQgPSAwOwotCi0JCQljcmVhdGVJbm5lckVkaXRvclRpdGxlKGksIHZpZXdGb3JtKTsKLQotCQkJQ29tcG9zaXRlIGNvbnRlbnQgPSBjcmVhdGVJbm5lclBhcnRDb250cm9sKHZpZXdGb3JtLCBlKTsKLQotCQkJdmlld0Zvcm0uc2V0Q29udGVudChjb250ZW50KTsKLQkJCXVwZGF0ZUlubmVyRWRpdG9yVGl0bGUoZSwgaW5uZXJFZGl0b3JUaXRsZVtpXSk7Ci0KLQkJCWZpbmFsIGludCBpbmRleCA9IGk7Ci0JCQllLmFkZFByb3BlcnR5TGlzdGVuZXIobmV3IElQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgc291cmNlLCBpbnQgcHJvcGVydHkpIHsKLQkJCQkJaWYgKHByb3BlcnR5ID09IElFZGl0b3JQYXJ0LlBST1BfRElSVFkKLQkJCQkJCQl8fCBwcm9wZXJ0eSA9PSBJV29ya2JlbmNoUGFydC5QUk9QX1RJVExFKQotCQkJCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KQotCQkJCQkJCXVwZGF0ZUlubmVyRWRpdG9yVGl0bGUoKElFZGl0b3JQYXJ0KSBzb3VyY2UsCi0JCQkJCQkJCQlpbm5lckVkaXRvclRpdGxlW2luZGV4XSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEcmF3IHRoZSBncmFkaWVudCBmb3IgdGhlIHNwZWNpZmllZCBlZGl0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0dyYWRpZW50KElFZGl0b3JQYXJ0IGlubmVyRWRpdG9yLCBHcmFkaWVudCBnKSB7Ci0JCUNMYWJlbCBsYWJlbCA9IGlubmVyRWRpdG9yVGl0bGVbZ2V0SW5kZXgoaW5uZXJFZGl0b3IpXTsKLQkJaWYgKChsYWJlbCA9PSBudWxsKSB8fCBsYWJlbC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJbGFiZWwuc2V0Rm9yZWdyb3VuZChnLmZnQ29sb3IpOwotCQlsYWJlbC5zZXRCYWNrZ3JvdW5kKGcuYmdDb2xvcnMsIGcuYmdQZXJjZW50cyk7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGUgdGhlIGxhYmVsIGZvciBlYWNoIGlubmVyIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVJbm5lckVkaXRvclRpdGxlKGludCBpbmRleCwgVmlld0Zvcm0gcGFyZW50KSB7Ci0KLQkJQ0xhYmVsIHRpdGxlTGFiZWwgPSBuZXcgQ0xhYmVsKHBhcmVudCwgU1dULlNIQURPV19OT05FKTsKLQkJLy8gaG9va0ZvY3VzKHRpdGxlTGFiZWwpOwotCQl0aXRsZUxhYmVsLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCXRpdGxlTGFiZWwuc2V0QmFja2dyb3VuZChudWxsLCBudWxsKTsKLQkJcGFyZW50LnNldFRvcExlZnQodGl0bGVMYWJlbCk7Ci0JCWlmIChpbm5lckVkaXRvclRpdGxlID09IG51bGwpCi0JCQlpbm5lckVkaXRvclRpdGxlID0gbmV3IENMYWJlbFtnZXRJbm5lckVkaXRvcnMoKS5sZW5ndGhdOwotCQlpbm5lckVkaXRvclRpdGxlW2luZGV4XSA9IHRpdGxlTGFiZWw7Ci0JfQotCi0JLyoKLQkgKiBVcGRhdGUgdGhlIHRhYiBmb3IgYW4gZWRpdG9yLiBUaGlzIGlzIHR5cGljYWxseSBjYWxsZWQgYnkgYSBzaXRlIHdoZW4gdGhlCi0JICogdGFiIHRpdGxlIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlSW5uZXJFZGl0b3JUaXRsZShJRWRpdG9yUGFydCBlZGl0b3IsIENMYWJlbCBsYWJlbCkgewotCi0JCWlmICgobGFiZWwgPT0gbnVsbCkgfHwgbGFiZWwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgdGl0bGUgPSBlZGl0b3IuZ2V0VGl0bGUoKTsKLQkJaWYgKGVkaXRvci5pc0RpcnR5KCkpCi0JCQl0aXRsZSA9ICIqIiArIHRpdGxlOyAvLyROT04tTkxTLTEkCi0JCWxhYmVsLnNldFRleHQodGl0bGUpOwotCQlJbWFnZSBpbWFnZSA9IGVkaXRvci5nZXRUaXRsZUltYWdlKCk7Ci0JCWlmIChpbWFnZSAhPSBudWxsKQotCQkJaWYgKCFpbWFnZS5lcXVhbHMobGFiZWwuZ2V0SW1hZ2UoKSkpCi0JCQkJbGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotCQlsYWJlbC5zZXRUb29sVGlwVGV4dChlZGl0b3IuZ2V0VGl0bGVUb29sVGlwKCkpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRJbmRleChJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJSUVkaXRvclBhcnQgaW5uZXJFZGl0b3JzW10gPSBnZXRJbm5lckVkaXRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbm5lckVkaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpbm5lckVkaXRvcnNbaV0gPT0gZWRpdG9yKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvLwotCS8vIFRoZXNlIGFyZSBwdWJsaWMgbWV0aG9kcyBmcm9tIHRoZSBwYXJlbnQgdGhhdCBhcmUgb3ZlcnJpZGVuIHRvCi0JLy8gYWRkIHRoZW0gdG8gdGhlIGNhbGwgaGlzdG9yeS4KLQkvLwotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVJbm5lclBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGUpIHsKLQkJY2FsbEhpc3RvcnkuYWRkKCJjcmVhdGVJbm5lclBhcnRDb250cm9sIik7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVJbm5lclBhcnRDb250cm9sKHBhcmVudCwgZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQljYWxsSGlzdG9yeS5hZGQoImluaXQiKTsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWNhbGxIaXN0b3J5LmFkZCgic2V0Rm9jdXMiKTsKLQkJc3VwZXIuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVHcmFkaWVudChJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJY2FsbEhpc3RvcnkuYWRkKCJ1cGRhdGVHcmFkaWVudCIpOwotCQlzdXBlci51cGRhdGVHcmFkaWVudChlZGl0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2ZpZywKLQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB7Ci0JCWNhbGxIaXN0b3J5LmFkZCgic2V0SW5pdGlhbGl6YXRpb25EYXRhIik7Ci0JCXN1cGVyLnNldEluaXRpYWxpemF0aW9uRGF0YShjZmlnLCBwcm9wZXJ0eU5hbWUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNhbGxIaXN0b3J5LmFkZCgiZGlzcG9zZSIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tdWx0aXBhZ2VlZGl0b3IvTXVsdGlFZGl0b3JJbnB1dFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbXVsdGlwYWdlZWRpdG9yL011bHRpRWRpdG9ySW5wdXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjc5MjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tdWx0aXBhZ2VlZGl0b3IvTXVsdGlFZGl0b3JJbnB1dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5tdWx0aXBhZ2VlZGl0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBUZXN0cyB0aGUgQVBJIG9mIDxjb2RlPk11bHRpUGFnZUVkaXRvcklucHV0PC9jb2RlPi4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlFZGl0b3JJbnB1dFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPk11bHRpUGFnZUVkaXRvcklucHV0VGVzdDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IHRvIGJlIHJ1bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlFZGl0b3JJbnB1dFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGVxdWFscyBhbmQgaGFzaENvZGUgbWV0aG9kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQW5kSGFzaCgpIHsKLSAgICAgICAgU3RyaW5nIGVhID0gImR1bW15LmVkaXRvci5pZC5BIjsKLSAgICAgICAgU3RyaW5nIGViID0gImR1bW15LmVkaXRvci5pZC5CIjsKLSAgICAgICAgU3RyaW5nIGVjID0gImR1bW15LmVkaXRvci5pZC5DIjsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIElFZGl0b3JJbnB1dCBpYSA9IG5ldyBGaWxlRWRpdG9ySW5wdXQocm9vdC5nZXRGaWxlKG5ldyBQYXRoKCIvRHVtbXlQcm9qZWN0L0ZpbGVBIikpKTsKLSAgICAgICAgSUVkaXRvcklucHV0IGliID0gbmV3IEZpbGVFZGl0b3JJbnB1dChyb290LmdldEZpbGUobmV3IFBhdGgoIi9EdW1teVByb2plY3QvRmlsZUIiKSkpOwotICAgICAgICBJRWRpdG9ySW5wdXQgaWMgPSBuZXcgRmlsZUVkaXRvcklucHV0KHJvb3QuZ2V0RmlsZShuZXcgUGF0aCgiL0R1bW15UHJvamVjdC9GaWxlQyIpKSk7Ci0gICAgICAgIE11bHRpRWRpdG9ySW5wdXQgYSA9IG5ldyBNdWx0aUVkaXRvcklucHV0KG5ldyBTdHJpbmdbXSB7IGVhIH0sIG5ldyBJRWRpdG9ySW5wdXRbXSB7IGlhIH0pOwotICAgICAgICBNdWx0aUVkaXRvcklucHV0IGEyID0gbmV3IE11bHRpRWRpdG9ySW5wdXQobmV3IFN0cmluZ1tdIHsgZWEgfSwgbmV3IElFZGl0b3JJbnB1dFtdIHsgaWEgfSk7Ci0gICAgICAgIE11bHRpRWRpdG9ySW5wdXQgYiA9IG5ldyBNdWx0aUVkaXRvcklucHV0KG5ldyBTdHJpbmdbXSB7IGViIH0sIG5ldyBJRWRpdG9ySW5wdXRbXSB7IGliIH0pOwotICAgICAgICBNdWx0aUVkaXRvcklucHV0IGFiYyA9IG5ldyBNdWx0aUVkaXRvcklucHV0KG5ldyBTdHJpbmdbXSB7IGVhLCBlYiwgZWMgfSwgbmV3IElFZGl0b3JJbnB1dFtdIHsgaWEsIGliLCBpYyB9KTsKLSAgICAgICAgTXVsdGlFZGl0b3JJbnB1dCBhYmMyID0gbmV3IE11bHRpRWRpdG9ySW5wdXQobmV3IFN0cmluZ1tdIHsgZWEsIGViLCBlYyB9LCBuZXcgSUVkaXRvcklucHV0W10geyBpYSwgaWIsIGljIH0pOwotCi0gICAgICAgIGFzc2VydFRydWUoYS5lcXVhbHMoYSkpOwotICAgICAgICBhc3NlcnRUcnVlKGFiYy5lcXVhbHMoYWJjKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhLmVxdWFscyhhMikpOwotICAgICAgICBhc3NlcnRUcnVlKGEuaGFzaENvZGUoKSA9PSBhMi5oYXNoQ29kZSgpKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShhLmVxdWFscyhiKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKGFiYy5lcXVhbHMoYWJjMikpOwotICAgICAgICBhc3NlcnRUcnVlKGFiYy5oYXNoQ29kZSgpID09IGFiYzIuaGFzaENvZGUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayB0aGF0IGRpZmZlcmluZyBhcnJheSBsZW5ndGhzIGFyZSBoYW5kbGVkIHByb3Blcmx5Ci0gICAgICAgIGFzc2VydEZhbHNlKGEuZXF1YWxzKGFiYykpOwotICAgICAgICBhc3NlcnRGYWxzZShhYmMuZXF1YWxzKGEpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpcGFnZWVkaXRvci9NdWx0aVBhZ2VFZGl0b3JUZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbXVsdGlwYWdlZWRpdG9yL011bHRpUGFnZUVkaXRvclRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDg1Zjk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbXVsdGlwYWdlZWRpdG9yL011bHRpUGFnZUVkaXRvclRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpcGFnZWVkaXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGhlIHN1aXRlIG9mIHRlc3RzIGZvciBtdWx0aS1wYWdlIGVkaXRvcnMuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpUGFnZUVkaXRvclRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gVGhpcyBpcyByZXF1aXJlZCB0byB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotICAgICAqIEByZXR1cm4gQSBuZXcgdGVzdCBzdWl0ZTsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uOwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVBhZ2VFZGl0b3JUZXN0U3VpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIHRlc3Qgc3VpdGUuCi0gICAgICovCi0gICAgcHVibGljIE11bHRpUGFnZUVkaXRvclRlc3RTdWl0ZSgpIHsKLSAgICAgICAgYWRkVGVzdFN1aXRlKE11bHRpRWRpdG9ySW5wdXRUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKE11bHRpVmFyaWFibGVQYWdlVGVzdC5jbGFzcyk7Ci0gICAgICAgIC8vIEZvY3VzIGlzc3VlcwotICAgICAgICAvLyBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoTXVsdGlQYWdlS2V5QmluZGluZ1Rlc3QuY2xhc3MpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpcGFnZWVkaXRvci9NdWx0aVBhZ2VLZXlCaW5kaW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tdWx0aXBhZ2VlZGl0b3IvTXVsdGlQYWdlS2V5QmluZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyNjYyMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpcGFnZWVkaXRvci9NdWx0aVBhZ2VLZXlCaW5kaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpcGFnZWVkaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklDb21tYW5kTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JV29ya2JlbmNoQ29tbWFuZFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5LZXlTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5rZXlzLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRoYXQga2V5IGJpbmRpbmdzIGFyZSB0cmVhdGVkIGNvcnJlY3RseSBpbiBhIG11bHRpLXBhZ2UgZWRpdG9yLiBUaGlzCi0gKiBlbnN1cmVzIHRoYXQga2V5IGJpbmRpbmdzIGFyZSBzd2l0Y2hlZCBhdCB0aGUgZ3JhbnVsYXJpdHkgb2YgYSBwYWdlIGluIGEKLSAqIG11bHRpLXBhZ2UgZWRpdG9yLiBTZWUgQnVnIDM3NjEyIGZvciByZWZlcmVuY2VzLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aVBhZ2VLZXlCaW5kaW5nVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5NdWx0aVBhZ2VLZXlCaW5kaW5nVGVzdDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IHRvIGJlIHJ1bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlQYWdlS2V5QmluZGluZ1Rlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUga2V5IGJpbmRpbmdzIGFyZSB1cGRhdGVkIHdoZW4gdGhlIHBhZ2UgaXMgc3dpdGNoZWQgaW4gYQotICAgICAqIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHByb2plY3Qgb3IgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgVGhlIGV4cGVjdGVkIGtleSBzZXF1ZW5jZSBjYW5ub3QgYmUgcGFyc2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTd2l0Y2goKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uID0gIm11bHRpIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZU5hbWUgPSAiQS4iICsgZXh0ZW5zaW9uOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy8gT3BlbiBhIG5ldyB0ZXN0IHdpbmRvdy4KLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIGJsdXJiIGZpbGUuCi0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgSVByb2plY3QgdGVzdFByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QoCi0gICAgICAgICAgICAgICAgIk11bHRpUGFnZUtleUJpbmRpbmdUZXN0IFByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0ZXN0UHJvamVjdC5jcmVhdGUobnVsbCk7Ci0gICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgICAgIElGaWxlIG11bHRpRmlsZSA9IHRlc3RQcm9qZWN0LmdldEZpbGUoZmlsZU5hbWUpOwotICAgICAgICBtdWx0aUZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSksIHRydWUsIG51bGwpOwotCi0gICAgICAgIC8vIE9wZW4gYSBibHVyYiBmaWxlLgotICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KG11bHRpRmlsZSk7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBwYWdlLm9wZW5FZGl0b3IoZWRpdG9ySW5wdXQsCi0gICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpcGFnZWVkaXRvci5UZXN0TXVsdGlQYWdlRWRpdG9yIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgVGVzdE11bHRpUGFnZUVkaXRvciBtdWx0aVBhZ2VFZGl0b3JQYXJ0ID0gKFRlc3RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQ7Ci0KLSAgICAgICAgLy8gU3dpdGNoIHRvIHRoZSBzZWNvbmQgdGFiCi0gICAgICAgIHdpbmRvdy5nZXRTaGVsbCgpLmZvcmNlQWN0aXZlKCk7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgICAgICB3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLSAgICAgICAgICAgIDsKLSAgICAgICAgbXVsdGlQYWdlRWRpdG9yUGFydC5zZXRQYWdlKDEpOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgIkN0cmwrU2hpZnQrNSIgaXMgdGhlIGJvdW5kIGtleS4KLSAgICAgICAgSVdvcmtiZW5jaENvbW1hbmRTdXBwb3J0IGNvbW1hbmRTdXBwb3J0ID0gd2luZG93LmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgLmdldENvbW1hbmRTdXBwb3J0KCk7Ci0gICAgICAgIElDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlciA9IGNvbW1hbmRTdXBwb3J0LmdldENvbW1hbmRNYW5hZ2VyKCk7Ci0gICAgICAgIEtleVNlcXVlbmNlIGV4cGVjdGVkS2V5QmluZGluZyA9IEtleVNlcXVlbmNlCi0gICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCJDdHJsK1NoaWZ0KzUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgY29tbWFuZElkID0gY29tbWFuZE1hbmFnZXIuZ2V0UGVyZmVjdE1hdGNoKGV4cGVjdGVkS2V5QmluZGluZyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdENvbW1hbmRJZCIsIGNvbW1hbmRJZCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpcGFnZWVkaXRvci9NdWx0aVZhcmlhYmxlUGFnZUVkaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tdWx0aXBhZ2VlZGl0b3IvTXVsdGlWYXJpYWJsZVBhZ2VFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5MDM3ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpcGFnZWVkaXRvci9NdWx0aVZhcmlhYmxlUGFnZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5tdWx0aXBhZ2VlZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXI7Ci0KLS8qKgotICogQSBNdWx0aVBhZ2VFZGl0b3JQYXJ0IHdpdGggbWV0aG9kcyB0aGF0IHRha2UgYSBwZWVrIGF0IHRoaW5ncyBsaWtlCi0gKiBzZWxlY3Rpb24gZXZlbnRzIG9yIHNlbGVjdGlvbiBzdGF0dXMgb3IgcGFnZSBjaGFuZ2UgZXZlbnRzLgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aVZhcmlhYmxlUGFnZUVkaXRvciBleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgbGFzdFBhZ2U7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IHdpdGggMiBwYWdlcywgYWx0aG91Z2ggdGhleSdyZSBvbiB0aGUgc2FtZSBlZGl0b3IgaW5wdXQKLQkgKiBhbmQgdGhleSdyZSB0aGUgVGV4dEVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKLQkJdHJ5IHsKLQkJCVRleHRFZGl0b3Igc2VjdGlvbjEgPSBuZXcgVGV4dEVkaXRvcigpOwotCQkJaW50IGluZGV4ID0gYWRkUGFnZShzZWN0aW9uMSwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlzZXRQYWdlVGV4dChpbmRleCwgc2VjdGlvbjEuZ2V0VGl0bGUoKSk7Ci0KLQkJCVRleHRFZGl0b3Igc2VjdGlvbjIgPSBuZXcgVGV4dEVkaXRvcigpOwotCQkJaW5kZXggPSBhZGRQYWdlKHNlY3Rpb24yLCBnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCXNldFBhZ2VUZXh0KGluZGV4LCBzZWN0aW9uMi5nZXRUaXRsZSgpKTsKLQotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0JCQkJImRvU2F2ZUFzIHNob3VsZCBub3QgYmUgY2FsbGVkLiIpOwotCX0KLQotCS8qKgotCSAqIE5vIHNhdmUgYXMuCi0JICogQHJldHVybiBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I3BhZ2VDaGFuZ2UoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkgewotCQlzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0JCUlFZGl0b3JQYXJ0IHBhcnQgPSBnZXRFZGl0b3IobmV3UGFnZUluZGV4KTsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBUZXh0RWRpdG9yKSB7Ci0JCQlUZXh0RWRpdG9yIGVkaXRvciA9IChUZXh0RWRpdG9yKSBwYXJ0OwotCQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQkJSURvY3VtZW50IGRvYyA9IHByb3ZpZGVyLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQkJRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgZmluZCA9IG5ldyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigKLQkJCQkJZG9jKTsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiByZWdpb24gPSBmaW5kLmZpbmQoMCwgIiNzZWN0aW9uMCIgKyAobmV3UGFnZUluZGV4ICsgMSksCi0JCQkJCQl0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQllZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uCi0JCQkJCQkJLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJGYWlsZWQgdG8gZmluZCBhIHNlY3Rpb24iKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYWN0aXZlIHBhZ2UgaW4gdGhpcyBNUEVQLiAgSnVzdCBkZWxlZ2F0ZSBiYWNrIHRvCi0JICogc2V0QWN0aXZlUGFnZShpbnQpLgotCSAqIEBwYXJhbSBpbmRleCBUaGUgcGFnZSBpbmRleCB3aGljaCBtdXN0IGJlIHZhbGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2UoaW50IGluZGV4KSB7Ci0JCXN1cGVyLnNldEFjdGl2ZVBhZ2UoaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYSBwYWdlIHdpdGggYSBjb21wb3NpdGUgZm9yIHRlc3RpbmcuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMYXN0UGFnZSgpIHsKLQkJbGFzdFBhZ2UgPSBuZXcgQ29tcG9zaXRlKGdldENvbnRhaW5lcigpLCBTV1QuTk9ORSk7Ci0JCUxhYmVsIGwgPSBuZXcgTGFiZWwobGFzdFBhZ2UsIFNXVC5TSEFET1dfSU4pOwotCQlsLnNldFRleHQoZ2V0RWRpdG9ySW5wdXQoKS5nZXROYW1lKCkpOwotCQlhZGRQYWdlKDIsIGxhc3RQYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogcmVtb3ZlIHRoZSBsYXN0IHBhZ2UgZm9yIHRlc3RpbmcuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMYXN0UGFnZSgpIHsKLQkJaWYgKGdldFBhZ2VDb3VudCgpPjApIHsKLQkJCXJlbW92ZVBhZ2UoZ2V0UGFnZUNvdW50KCktMSk7Ci0JCX0KLQkJbGFzdFBhZ2UgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxhc3QgcGFnZSBjb21wb3NpdGUgZm9yIHRlc3RpbmcuCi0JICogQHJldHVybiB0aGUgbGFzdCBwYWdlLgotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldExhc3RQYWdlKCkgewotCQlyZXR1cm4gbGFzdFBhZ2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udHJvbCBmb3IgdGVzdGluZyAobGlrZSB0aGUgZWRpdG9yIGNvbnRyb2wpLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleCB0aGUgcGFnZSBpbmRleCB0byBnZXQKLQkgKiBAcmV0dXJuIHRoZSBjb250cm9sIGZvciB0aGF0IHBhZ2UKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRUZXN0Q29udHJvbChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGdldENvbnRyb2woaW5kZXgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbXVsdGlwYWdlZWRpdG9yL011bHRpVmFyaWFibGVQYWdlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tdWx0aXBhZ2VlZGl0b3IvTXVsdGlWYXJpYWJsZVBhZ2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2NkYjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tdWx0aXBhZ2VlZGl0b3IvTXVsdGlWYXJpYWJsZVBhZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpcGFnZWVkaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3QgdGhhdCB0aGUgTXVsdGlQYWdlRWRpdG9yUGFydCBpcyBhY3Rpbmcgb24gZXZlbnRzIGFuZCBjaGFuZ2VzLiAgCi0gKiBUaGVzZSB0ZXN0cyBhcmUgZm9yIG1ha2luZyBzdXJlIHRoYXQgc2VsZWN0aW9uIGV2ZW50cyBhbmQgcGFnZQotICogY2hhbmdlIGV2ZW50cyBhcmUgaGFuZGxlZC4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlWYXJpYWJsZVBhZ2VUZXN0IGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9DT05URU5UUyA9ICIjc2VjdGlvbjAxXG5zZWN0aW9uIDFcbiNzZWN0aW9uMDJcbnNlY3Rpb24gMlxud2l0aCBpbmZvXG4jc2VjdGlvbjAzXG5MYXN0IHBhZ2VcbiI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVRFU1QwMV9GSUxFID0gIm10ZXN0MDEubXVsdGl2YXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJX1ZBUklBQkxFX1BST0ogPSAiTXVsdGlWYXJpYWJsZVRlc3QiOwotCi0JcHJpdmF0ZSBpbnQgZlBvc3RDYWxsZWQ7Ci0KLQlwdWJsaWMgTXVsdGlWYXJpYWJsZVBhZ2VUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBzdXJlIHRoYXQgc2V0dGluZyB0aGUgYWN0aXZlIHBhZ2UgcHJvZ3JhbW1hdGljYWxseSBjYWxscwotCSAqIHBhZ2VDaGFuZ2VkKGludCkgb24gdGhlIHdheS4gIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gaW4gYSBsb3QKLQkgKiBvZiBlZGl0b3JzIHRvIHByb3ZpZGUgdGhlaXIgZnVuY3Rpb25hbGl0eSBvbiBwYWdlIGNoYW5nZXMuCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0QWN0aXZlUGFnZSgpIHRocm93cyBUaHJvd2FibGUgewotCQkvLyBPcGVuIGEgbmV3IHRlc3Qgd2luZG93LgotCQkvLyBDcmVhdGUgYW5kIG9wZW4gYSBibHVyYiBmaWxlLgotCQlJRWRpdG9yUGFydCBwYXJ0ID0gb3Blbk11bHRpdmFyRmlsZSgpOwotCi0JCU11bHRpVmFyaWFibGVQYWdlRWRpdG9yIGVkaXRvciA9IChNdWx0aVZhcmlhYmxlUGFnZUVkaXRvcikgcGFydDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCVRleHRTZWxlY3Rpb24gdGV4dCA9IChUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCS8vIHdoZW4gdGhlIGZpcnN0IHBhZ2UgY29tZXMgdXAsIHdlIHNob3VsZCBoYXZlIHNlbGVjdGVkIHRoZSBmaXJzdAotCQkvLyBzZWN0aW9uLgotCQlhc3NlcnRFcXVhbHMoIiNzZWN0aW9uMDEiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQkJZWRpdG9yLnNldFBhZ2UoMSk7Ci0JCXNlbGVjdGlvbiA9IGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKQotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJdGV4dCA9IChUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCS8vIHdoZW4gd2UgY2hhbmdlIHRvIHRoZSBzZWNvbmQgcGFnZSwgdGhlIHNlbGVjdGlvbiBzaG91bGQgYmUKLQkJLy8gdXBkYXRlZC4KLQkJYXNzZXJ0RXF1YWxzKCIjc2VjdGlvbjAyIiwgdGV4dC5nZXRUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIE1ha2Ugc3VyZSB0aGF0IHJlbW92aW5nIGEgcGFnZSB0aGF0IGlzIGEgQ29udHJvbCAoaW5zdGVhZCBvZiBhbgotCSAqIGVkaXRvcikgZGlzcG9zZXMgb2YgdGhlIENvbnRyb2wgaW1tZWRpYXRlbHkuCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUGFnZSgpIHRocm93cyBUaHJvd2FibGUgewotCQkvLyBPcGVuIGEgbmV3IHRlc3Qgd2luZG93LgotCQkvLyBDcmVhdGUgYW5kIG9wZW4gYSBibHVyYiBmaWxlLgotCQlJRWRpdG9yUGFydCBwYXJ0ID0gb3Blbk11bHRpdmFyRmlsZSgpOwotCi0JCU11bHRpVmFyaWFibGVQYWdlRWRpdG9yIGVkaXRvciA9IChNdWx0aVZhcmlhYmxlUGFnZUVkaXRvcikgcGFydDsKLQkJZWRpdG9yLmFkZExhc3RQYWdlKCk7Ci0JCUNvbnRyb2wgYyA9IGVkaXRvci5nZXRMYXN0UGFnZSgpOwotCQlhc3NlcnRGYWxzZShjLmlzRGlzcG9zZWQoKSk7Ci0JCWVkaXRvci5yZW1vdmVMYXN0UGFnZSgpOwotCQlhc3NlcnRUcnVlKGMuaXNEaXNwb3NlZCgpKTsKLQkJCi0JCWMgPSBlZGl0b3IuZ2V0VGVzdENvbnRyb2woMSk7Ci0JCWFzc2VydEZhbHNlKGMuaXNEaXNwb3NlZCgpKTsKLQkJZWRpdG9yLnJlbW92ZUxhc3RQYWdlKCk7Ci0JCWFzc2VydFRydWUoYy5pc0Rpc3Bvc2VkKCkpOwotCQllZGl0b3Iuc2V0UGFnZSgwKTsKLQkJZWRpdG9yLmdldFNpdGUoKS5nZXRQYWdlKCkuYWN0aXZhdGUoZWRpdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogTm93IHRoZSBNUEVQIHNpdGUncyBzZWxlY3Rpb24gcHJvdmlkZXIgc2hvdWxkIGJ5IGRlZmF1bHQgc3VwcG9ydAotCSAqIHBvc3Qgc2VsZWN0aW9uIGxpc3RlbmVycy4gIFNpbmNlIHRoZSBNVlBFIGlzIGJhc2VkIG9uIFRleHQKLQkgKiBlZGl0b3JzLCB3ZSBzaG91bGQgYmUgZ2V0dGluZyB0aGUgcG9zdCBzZWxlY3Rpb24gZXZlbnRzIHdoZW4KLQkgKiB3ZSBjaGFuZ2UgcGFnZXMuCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGUgb24gZXJyb3IgY2FzZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UG9zdFNlbGVjdGlvbigpIHRocm93cyBUaHJvd2FibGUgewotCQkvLyBPcGVuIGEgbmV3IHRlc3Qgd2luZG93LgotCQkvLyBDcmVhdGUgYW5kIG9wZW4gYSBibHVyYiBmaWxlLgotCQlJRWRpdG9yUGFydCBwYXJ0ID0gb3Blbk11bHRpdmFyRmlsZSgpOwotCi0JCU11bHRpVmFyaWFibGVQYWdlRWRpdG9yIGVkaXRvciA9IChNdWx0aVZhcmlhYmxlUGFnZUVkaXRvcikgcGFydDsKLQkJSVNlbGVjdGlvblByb3ZpZGVyIHNwID0gZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlhc3NlcnRUcnVlKHNwIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcik7Ci0JCQotCQlJUG9zdFNlbGVjdGlvblByb3ZpZGVyIHBvc3RQcm92aWRlciA9IChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBzcDsKLQkJCi0JCWZQb3N0Q2FsbGVkID0gMDsKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkrK2ZQb3N0Q2FsbGVkOwotCQkJfQotCQl9OwotCQkKLQkJdHJ5IHsKLQkJCXBvc3RQcm92aWRlci5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWVkaXRvci5zZXRQYWdlKDEpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIGZQb3N0Q2FsbGVkKTsKLQkJCWVkaXRvci5zZXRQYWdlKDApOwotCQkJYXNzZXJ0RXF1YWxzKDIsIGZQb3N0Q2FsbGVkKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXBvc3RQcm92aWRlci5yZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUVkaXRvclBhcnQgb3Blbk11bHRpdmFyRmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBvcGVuVGVzdFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0IHRlc3RQcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotCQkJCU1VTFRJX1ZBUklBQkxFX1BST0opOwotCQlpZiAoIXRlc3RQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQl0ZXN0UHJvamVjdC5jcmVhdGUobnVsbCk7Ci0JCX0KLQkJdGVzdFByb2plY3Qub3BlbihudWxsKTsKLQkJSUZpbGUgbXVsdGlGaWxlID0gdGVzdFByb2plY3QuZ2V0RmlsZShNVEVTVDAxX0ZJTEUpOwotCQlpZiAoIW11bHRpRmlsZS5leGlzdHMoKSkgewotCQkJbXVsdGlGaWxlLmNyZWF0ZSgKLQkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKEZJTEVfQ09OVEVOVFMuZ2V0Qnl0ZXMoKSksIHRydWUsCi0JCQkJCW51bGwpOwotCQl9Ci0JCQotCQkvLyBJIGNhbid0IGJlIGJvdGhlcmVkIHRvIHVzZSB0aGUgSUQsIGJ1dCB0aGlzIGVkaXRvciBoYXMgYW4KLQkJLy8gZXh0ZW50aW9uIHJlZ2lzdGVyZWQgYWdhaW5zdCBpdC4KLQkJSUVkaXRvclBhcnQgcGFydCA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIG11bHRpRmlsZSk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBoYXZlIG9wZW5lZCBvdXIgbXVsdGkgdmFyaWFibGUgcGFnZSBlZGl0b3IiLAotCQkJCXBhcnQgaW5zdGFuY2VvZiBNdWx0aVZhcmlhYmxlUGFnZUVkaXRvcik7Ci0JCXJldHVybiBwYXJ0OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbXVsdGlwYWdlZWRpdG9yL1Rlc3RLZXlCaW5kaW5nTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tdWx0aXBhZ2VlZGl0b3IvVGVzdEtleUJpbmRpbmdNdWx0aVBhZ2VFZGl0b3JQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZjQwYjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9tdWx0aXBhZ2VlZGl0b3IvVGVzdEtleUJpbmRpbmdNdWx0aVBhZ2VFZGl0b3JQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpcGFnZWVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUtleUJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydDsKLQotLyoqCi0gKiBBIG11bHRpLXBhZ2UgZWRpdG9yIGZvciB0ZXN0aW5nIGtleSBiaW5kaW5ncyB3aGlsZSBzd2l0Y2hpbmcgcGFnZXMuIFRoaXMKLSAqIGlzIG9uZSBvZiB0d28gcGFnZXMgLS0gZWFjaCB3aXRoIGEgZGlmZmVyZW50IGNvbnRleHQuIFRoZSBmaXJzdCBjb250ZXh0IGJpbmRzCi0gKiAiQ3RybCtTaGlmdCs0IiAtLSB0aGUgc2Vjb25kIGJpbmRzICJDdHJsK1NoaWZ0KzUiIC0tIHRvIHRoZSBjb21tYW5kCi0gKiAib3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdENvbW1hbmQiLiBXaGljaCBjb250ZXh0IHRvIHVzZSBpcyBkZXRlcm1pbmVkIGJ5IGEKLSAqIHBhZ2UgbnVtYmVyLCB3aGljaCBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RLZXlCaW5kaW5nTXVsdGlQYWdlRWRpdG9yUGFydCBleHRlbmRzIEVkaXRvclBhcnQgewotCi0gICAgLyoqCi0gICAgICogVGhlIHBhZ2UgbnVtYmVyIGZvciB0aGlzIHBhcnQuCi0gICAgICogIAotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IG51bWJlcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+VGVzdEtleUJpbmRpbmdNdWx0aVBhZ2VFZGl0b3JQYXJ0PC9jb2RlPgotICAgICAqIHdpdGggdGhlIHBhZ2UgbnVtYmVyIG9mIHRoaXMgcGFnZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbnVtYmVyCi0gICAgICogICAgICAgICAgICBUaGUgcGFnZSBudW1iZXIgZm9yIHRoaXMgcGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdEtleUJpbmRpbmdNdWx0aVBhZ2VFZGl0b3JQYXJ0KGludCBudW1iZXIpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLSAgICAgICAgVGV4dCB0ZXh0MSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICB0ZXh0MS5zZXRUZXh0KCJCbHVlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgVGV4dCB0ZXh0MiA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICB0ZXh0Mi5zZXRUZXh0KCJSZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjZG9TYXZlQXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHRlc3QuIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2dvdG9NYXJrZXIob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLSAgICAgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkKLSAgICAgICAgICAgIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldElucHV0KGlucHV0KTsKLSAgICAgICAgc2V0U2l0ZShzaXRlKTsKLSAgICAgICAgc2V0UGFydE5hbWUoIkVkaXRvciIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldFRpdGxlSW1hZ2UoaW5wdXQuZ2V0SW1hZ2VEZXNjcmlwdG9yKCkuY3JlYXRlSW1hZ2UoKSk7Ci0gICAgICAgIHNldFRpdGxlVG9vbFRpcCgiTW9vb29vbyIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaXNEaXJ0eSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBmaW5hbCBib29sZWFuIG9kZHMgPSAobnVtYmVyICUgMikgPiAwOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2NvcGUxID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLnNjb3BlMSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmluYWwgU3RyaW5nIHNjb3BlMiA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5zY29wZTIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIElLZXlCaW5kaW5nU2VydmljZSBrZXlCaW5kaW5nU2VydmljZSA9IGdldEVkaXRvclNpdGUoKQotICAgICAgICAgICAgICAgIC5nZXRLZXlCaW5kaW5nU2VydmljZSgpOwotICAgICAgICBrZXlCaW5kaW5nU2VydmljZS5zZXRTY29wZXMobmV3IFN0cmluZ1tdIHsgKG9kZHMpID8gc2NvcGUxIDogc2NvcGUyIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbXVsdGlwYWdlZWRpdG9yL1Rlc3RNdWx0aVBhZ2VFZGl0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbXVsdGlwYWdlZWRpdG9yL1Rlc3RNdWx0aVBhZ2VFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiMTAyMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL211bHRpcGFnZWVkaXRvci9UZXN0TXVsdGlQYWdlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubXVsdGlwYWdlZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci0KLS8qKgotICogQSBtdWx0aS1wYWdlIGVkaXRvciBmb3IgdGVzdGluZyBrZXkgYmluZGluZ3Mgd2hpbGUgc3dpdGNoaW5nIHBhZ2VzLiBUaGlzCi0gKiBjcmVhdGVzIHR3byBwYWdlcyAtLSBlYWNoIHdpdGggYSBkaWZmZXJlbnQgY29udGV4dC4gVGhlIGZpcnN0IGNvbnRleHQgYmluZHMKLSAqICJDdHJsK1NoaWZ0KzQiIC0tIHRoZSBzZWNvbmQgYmluZHMgIkN0cmwrU2hpZnQrNSIgLS0gdG8gdGhlIGNvbW1hbmQKLSAqICJvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0Q29tbWFuZCIuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RNdWx0aVBhZ2VFZGl0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0IHsKLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2NyZWF0ZVBhZ2VzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElFZGl0b3JQYXJ0IHBhcnQxID0gbmV3IFRlc3RLZXlCaW5kaW5nTXVsdGlQYWdlRWRpdG9yUGFydCgwKTsKLSAgICAgICAgICAgIGFkZFBhZ2UocGFydDEsIGdldEVkaXRvcklucHV0KCkpOwotCi0gICAgICAgICAgICBJRWRpdG9yUGFydCBwYXJ0MiA9IG5ldyBUZXN0S2V5QmluZGluZ011bHRpUGFnZUVkaXRvclBhcnQoMSk7Ci0gICAgICAgICAgICBhZGRQYWdlKHBhcnQyLCBnZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2RvU2F2ZUFzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB0ZXN0LiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjZ290b01hcmtlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYWN0aXZlIHBhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhZ2UKLSAgICAgKiAgICAgICAgICAgIFRoZSBwYWdlIHRvIGFjdGl2YXRlOyBzaG91bGQgYmUgZWl0aGVyIDxjb2RlPjA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICA8Y29kZT4xPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlKGludCBwYWdlKSB7Ci0gICAgICAgIHNldEFjdGl2ZVBhZ2UocGFnZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9BYnN0cmFjdE5hdmlnYXRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL0Fic3RyYWN0TmF2aWdhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDcyZGQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL0Fic3RyYWN0TmF2aWdhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yOwotCi0vKioKLSAqIFRoZSBBYnN0cmFjdE5hdmlnYXRvclRlc3QgaXMgdGhlIGFic3RyYWN0IHN1cGVyY2xhc3MKLSAqIG9mIHRlc3RzIHRoYXQgdXNlIGEgcG9wdWxhdGVkIFJlc291cmNlIE5hdmlnYXRvci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmF2aWdhdG9yVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVklHQVRPUl9WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlJlc291cmNlTmF2aWdhdG9yIjsKLQotICAgIHByb3RlY3RlZCBJUHJvamVjdCB0ZXN0UHJvamVjdDsKLQotICAgIHByb3RlY3RlZCBJRm9sZGVyIHRlc3RGb2xkZXI7Ci0KLSAgICBwcm90ZWN0ZWQgSUZpbGUgdGVzdEZpbGU7Ci0KLSAgICBwcm90ZWN0ZWQgUmVzb3VyY2VOYXZpZ2F0b3IgbmF2aWdhdG9yOwotCi0gICAgcHVibGljIEFic3RyYWN0TmF2aWdhdG9yVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVRlc3RQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAodGVzdFByb2plY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgICAgICB0ZXN0UHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdCgiVGVzdFByb2plY3QiKTsKLSAgICAgICAgICAgIHRlc3RQcm9qZWN0LmNyZWF0ZShudWxsKTsKLSAgICAgICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXN0Rm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAodGVzdEZvbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjcmVhdGVUZXN0UHJvamVjdCgpOwotICAgICAgICAgICAgdGVzdEZvbGRlciA9IHRlc3RQcm9qZWN0LmdldEZvbGRlcigiVGVzdEZvbGRlciIpOwotICAgICAgICAgICAgdGVzdEZvbGRlci5jcmVhdGUoZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVRlc3RGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAodGVzdEZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY3JlYXRlVGVzdEZvbGRlcigpOwotICAgICAgICAgICAgdGVzdEZpbGUgPSB0ZXN0Rm9sZGVyLmdldEZpbGUoIkZvby50eHQiKTsKLSAgICAgICAgICAgIHRlc3RGaWxlLmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJTb21lIGNvbnRlbnQuIi5nZXRCeXRlcygpKSwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIFNob3dzIHRoZSBOYXZpZ2F0b3IgaW4gYSBuZXcgdGVzdCB3aW5kb3cuICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2hvd05hdigpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICAgICAgbmF2aWdhdG9yID0gKFJlc291cmNlTmF2aWdhdG9yKSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpLnNob3dWaWV3KAotICAgICAgICAgICAgICAgIE5BVklHQVRPUl9WSUVXX0lEKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0ZXN0UHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRlc3RQcm9qZWN0LmRlbGV0ZSh0cnVlLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRlc3RQcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIHRlc3RGb2xkZXIgPSBudWxsOwotICAgICAgICAgICAgdGVzdEZpbGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmRvVGVhckRvd24oKTsKLSAgICAgICAgbmF2aWdhdG9yID0gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL0R1cGxpY2F0ZU1lbnVJdGVtVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvRHVwbGljYXRlTWVudUl0ZW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTdiOTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvRHVwbGljYXRlTWVudUl0ZW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoV2luZG93OwotCi0vKioKLSAqIFRoZSBEdXBsaWNhdGVNZW51SXRlbVRlc3QgaXMgYSBjbGFzcyBmb3IgdGVzdGluZyB0aGUgcG9wdXBzCi0gKiBhbmQgd2luZG93IG1lbnVzIGZvciB0aGUgbmF2aWdhdG9yIHRvIGNoZWNrIGZvciBkdXBsaWNhdGUgbWVudQotICogZW50cmllcy4KLSAqLwotcHVibGljIGNsYXNzIER1cGxpY2F0ZU1lbnVJdGVtVGVzdCBleHRlbmRzIEFic3RyYWN0TmF2aWdhdG9yVGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRHVwbGljYXRlTWVudUl0ZW1UZXN0LgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBEdXBsaWNhdGVNZW51SXRlbVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uKCkgewotCi0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRlc3RQcm9qZWN0KTsKLSAgICAgICAgY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICAgICAgc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVzdEZvbGRlcik7Ci0gICAgICAgIGNoZWNrU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgICAgIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRlc3RGaWxlKTsKLSAgICAgICAgY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNZW51KE1lbnUgbWVudSwgU3RyaW5nIG1lbnVOYW1lKSB7Ci0KLSAgICAgICAgTWVudUl0ZW1bXSBpdGVtcyA9IG1lbnUuZ2V0SXRlbXMoKTsKLSAgICAgICAgSGFzaFNldCBsYWJlbHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBpdGVtc1tpXS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obGFiZWwpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkR1cGxpY2F0ZSBtZW51IGVudHJ5IGluOiAiICsgbWVudU5hbWUgKyAiICIKLSAgICAgICAgICAgICAgICAgICAgKyBsYWJlbCwgIWxhYmVscy5jb250YWlucyhsYWJlbCkpOwotICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLmdldE1lbnUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNoZWNrTWVudShpdGVtc1tpXS5nZXRNZW51KCksIGxhYmVsKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrV29ya2JlbmNoTWVudSgpIHsKLQotICAgICAgICBNZW51TWFuYWdlciB3b3JrYmVuY2hNYW5hZ2VyID0gKChXb3JrYmVuY2hXaW5kb3cpIG5hdmlnYXRvcgotICAgICAgICAgICAgICAgIC5nZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKS5nZXRNZW51TWFuYWdlcigpOwotCi0gICAgICAgIGNoZWNrTWVudSh3b3JrYmVuY2hNYW5hZ2VyLmdldE1lbnUoKSwgIldvcmtiZW5jaCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1NlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgbmF2aWdhdG9yLnNlbGVjdFJldmVhbChzZWxlY3Rpb24pOwotICAgICAgICBjaGVja1dvcmtiZW5jaE1lbnUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHVwIHRoZSBoaWVyYXJjaHkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIGNyZWF0ZVRlc3RGaWxlKCk7Ci0gICAgICAgIHNob3dOYXYoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL05hdmlnYXRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL05hdmlnYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0ZjZlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9OYXZpZ2F0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogVGVzdHMgdGhlIFJlc291cmNlIE5hdmlnYXRvciB2aWV3LgotICovCi1wdWJsaWMgY2xhc3MgTmF2aWdhdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0TmF2aWdhdG9yVGVzdCB7Ci0KLSAgICBwdWJsaWMgTmF2aWdhdG9yVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdGhlIE5hdmlnYXRvciBpcyBpbml0aWFsbHkgcG9wdWxhdGVkIHdpdGgKLSAgICAgKiB0aGUgY29ycmVjdCBlbGVtZW50cyBmcm9tIHRoZSB3b3Jrc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxQb3B1bGF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgY3JlYXRlVGVzdEZpbGUoKTsKLSAgICAgICAgc2hvd05hdigpOwotCi0gICAgICAgIC8vIHRlc3QgaXRzIGluaXRpYWwgY29udGVudCBieSBzZXR0aW5nIGFuZCBnZXR0aW5nIHNlbGVjdGlvbiBvbiB0aGUgZmlsZQotICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsUHJvdiA9IG5hdmlnYXRvci5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0ZXN0RmlsZSk7Ci0gICAgICAgIHNlbFByb3Yuc2V0U2VsZWN0aW9uKHNlbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWwuc2l6ZSgpLCAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbFByb3YuZ2V0U2VsZWN0aW9uKCkpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWwuZ2V0Rmlyc3RFbGVtZW50KCksICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsUHJvdi5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdGhlIE5hdmlnYXRvciB1cGRhdGVzIHByb3Blcmx5IHdoZW4gYSBmaWxlIGlzIGFkZGVkIHRvIHRoZSB3b3JrYmVuY2guCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVBZGRpdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNyZWF0ZVRlc3RGb2xkZXIoKTsgLy8gY3JlYXRlIHRoZSBwcm9qZWN0IGFuZCBmb2xkZXIgYmVmb3JlIHRoZSBOYXZpZ2F0b3IgaXMgc2hvd24KLSAgICAgICAgc2hvd05hdigpOwotICAgICAgICBjcmVhdGVUZXN0RmlsZSgpOyAvLyBjcmVhdGUgdGhlIGZpbGUgYWZ0ZXIgdGhlIE5hdmlnYXRvciBpcyBzaG93bgotCi0gICAgICAgIC8vIHRlc3QgaXRzIGluaXRpYWwgY29udGVudCBieSBzZXR0aW5nIGFuZCBnZXR0aW5nIHNlbGVjdGlvbiBvbiB0aGUgZmlsZQotICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsUHJvdiA9IG5hdmlnYXRvci5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0ZXN0RmlsZSk7Ci0gICAgICAgIHNlbFByb3Yuc2V0U2VsZWN0aW9uKHNlbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWwuc2l6ZSgpLCAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbFByb3YuZ2V0U2VsZWN0aW9uKCkpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWwuZ2V0Rmlyc3RFbGVtZW50KCksICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsUHJvdi5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvTmF2aWdhdG9yVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9OYXZpZ2F0b3JUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyYzQ5Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL25hdmlnYXRvci9OYXZpZ2F0b3JUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgTmF2aWdhdG9yVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1aXRlLiAgVGhpcyBpcyByZXF1aXJlZCB0bwotICAgICAqIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IE5hdmlnYXRvclRlc3RTdWl0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCB0aGUgdGVzdCBzdWl0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTmF2aWdhdG9yVGVzdFN1aXRlKCkgewotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoUmVzb3VyY2VOYXZpZ2F0b3JUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShOYXZpZ2F0b3JUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL1Jlc291cmNlTmF2aWdhdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9uYXZpZ2F0b3IvUmVzb3VyY2VOYXZpZ2F0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMGViMWVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvbmF2aWdhdG9yL1Jlc291cmNlTmF2aWdhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5BY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU5hdmlnYXRvclRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2U7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93OwotCi0gICAgcHJpdmF0ZSBJVmlld1BhcnQgdmlldzsKLQotICAgIHByaXZhdGUgSVByb2plY3QgcDE7Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IHAyOwotCi0gICAgcHJpdmF0ZSBJRmlsZSBmMTsKLQotICAgIHByaXZhdGUgSUZpbGUgZjI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgUmVzb3VyY2VOYXZpZ2F0b3JUZXN0LgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZU5hdmlnYXRvclRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VXAoKTsKLSAgICAgICAgd29ya2JlbmNoV2luZG93ID0gb3BlblRlc3RXaW5kb3coKTsKLSAgICAgICAgYWN0aXZlUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwVmlldygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB2aWV3ID0gYWN0aXZlUGFnZS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUmVzb3VyY2VOYXZpZ2F0b3IiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBSZXNvdXJjZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaWYgKHAxID09IG51bGwpIHsKLSAgICAgICAgICAgIHAxID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgiVFAxIik7Ci0gICAgICAgICAgICBmMSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHAyID09IG51bGwpIHsKLSAgICAgICAgICAgIHAyID0gRmlsZVV0aWwuY3JlYXRlUHJvamVjdCgiVFAyIik7Ci0gICAgICAgICAgICBmMiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGYxID09IG51bGwpCi0gICAgICAgICAgICBmMSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoImYxLnR4dCIsIHAxKTsKLSAgICAgICAgaWYgKGYyID09IG51bGwpCi0gICAgICAgICAgICBmMiA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoImYyLnR4dCIsIHAyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaXhUZXN0R2xvYmFsQm9va21hcmtBY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgc2V0dXBWaWV3KCk7Ci0gICAgICAgIHNldHVwUmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgLy8gU2VsZWN0IGEgZmlsZQotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmMSk7Ci0gICAgICAgICgoUmVzb3VyY2VOYXZpZ2F0b3IpIHZpZXcpLnNlbGVjdFJldmVhbChzZWwpOwotCi0gICAgICAgIC8vIFJlbWVtYmVyIHRoZSBwcmV2aW91cyBtYXJrZXIgY291bnQgb24gdGhlIGZpbGUKLSAgICAgICAgaW50IG9sZENvdW50ID0gKGYxLmZpbmRNYXJrZXJzKElNYXJrZXIuQk9PS01BUkssIHRydWUsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKSkubGVuZ3RoOwotCi0gICAgICAgIC8vIE5vdyB0cnkgdGhlIGJvb2ttYXJrIGFjdGlvbgotICAgICAgICBBY3Rpb25VdGlsLnJ1bkFjdGlvblVzaW5nUGF0aCh0aGlzLCB3b3JrYmVuY2hXaW5kb3csCi0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQgKyAnLycKLSAgICAgICAgICAgICAgICAgICAgICAgICsgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5CT09LTUFSSyk7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByZXNvdXJjZSB3YXMgYm9va21hcmtlZAotICAgICAgICBpbnQgbmV3Q291bnQgPSAoZjEuZmluZE1hcmtlcnMoSU1hcmtlci5CT09LTUFSSywgdHJ1ZSwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpKS5sZW5ndGg7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgIlNlbGVjdGVkIGZpbGUgd2FzIG5vdCBib29rbWFya2VkIHZpYSBFZGl0LT5Cb29rbWFyayBhY3Rpb24uIiwKLSAgICAgICAgICAgICAgICBvbGRDb3VudCArIDEgPT0gbmV3Q291bnQpOwotICAgIH0KLQotICAgIC8qCQotICAgICAqIFRoaXMgdGVzdCBzaG91bGQgYmUgbW92ZWQgdG8gYW4gaW50ZXJhY3RpdmUgdGVzdCBzdWl0ZSBhcyB0aGlzCi0gICAgICogdGVzdCBjYXVzZXMgYSBkaWFsb2cgdG8gcG9wdXAgd2hlbiB0aGUgcmVzb3VyY2UgaXMgZGVsZXRlZCBieQotICAgICAqIHRoZSBkZWxldGUgYWN0aW9uCi0gICAgICogCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RHbG9iYWxEZWxldGVBY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgc2V0dXBWaWV3KCk7Ci0gICAgIHNldHVwUmVzb3VyY2VzKCk7Ci0KLSAgICAgLy8gU2VsZWN0IGEgZmlsZQotICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmMSk7Ci0gICAgICgoUmVzb3VyY2VOYXZpZ2F0b3IpIHZpZXcpLnNlbGVjdFJldmVhbChzZWwpOwotICAgICAKLSAgICAgLy8gTm93IHRyeSB0aGUgZGVsZXRlIGFjdGlvbgotICAgICBBY3Rpb25VdGlsLnJ1bkFjdGlvblVzaW5nUGF0aCh0aGlzLCB3b3JrYmVuY2hXaW5kb3csIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUICsgJy8nICsgSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5ERUxFVEUpOwotICAgICAKLSAgICAgLy8gTWFrZSBzdXJlIHRoZSByZXNvdXJjZSB3YXMgZGVsZXRlZAotICAgICBhc3NlcnRUcnVlKCJTZWxlY3RlZCBmaWxlIHdhcyBub3QgZGVsZXRlZCB2aWEgRWRpdC0+RGVsZXRlIGFjdGlvbi4iLCBwMS5maW5kTWVtYmVyKGYxLmdldE5hbWUoKSkgPT0gbnVsbCk7Ci0gICAgIGYxID0gbnVsbDsKLSAgICAgfQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdFJldmVhbCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBzZXR1cFZpZXcoKTsKLSAgICAgICAgc2V0dXBSZXNvdXJjZXMoKTsKLQotICAgICAgICBJU2V0U2VsZWN0aW9uVGFyZ2V0IHBhcnQgPSAoSVNldFNlbGVjdGlvblRhcmdldCkgdmlldzsKLSAgICAgICAgVHJlZVZpZXdlciB0cmVlID0gKChSZXNvdXJjZU5hdmlnYXRvcikgdmlldykuZ2V0Vmlld2VyKCk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gaW4gdGhlIG5hdmlnYXRvcgotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwxID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZjEpOwotICAgICAgICBwYXJ0LnNlbGVjdFJldmVhbChzZWwxKTsKLSAgICAgICAgLy8gR2V0IHRoZSBzZWxlY3Rpb24gdGhlIHRyZWUgaGFzCi0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHRyZWVTZWwxID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICBhc3NlcnRUcnVlKCJGaXJzdCBzZWxlY3Rpb24gd3Jvbmcgc2l6ZSwgc2hvdWxkIGJlIG9ubHkgb25lLiIsIHRyZWVTZWwxCi0gICAgICAgICAgICAgICAgLnNpemUoKSA9PSAxKTsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlMSA9IChJUmVzb3VyY2UpIHRyZWVTZWwxLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJGaXJzdCBzZWxlY3Rpb24gY29udGFpbnMgd3JvbmcgZmlsZSByZXNvdXJjZS4iLCByZXNvdXJjZTEKLSAgICAgICAgICAgICAgICAuZXF1YWxzKGYxKSk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gaW4gdGhlIG5hdmlnYXRvcgotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwyID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocDIpOwotICAgICAgICBwYXJ0LnNlbGVjdFJldmVhbChzZWwyKTsKLSAgICAgICAgLy8gR2V0IHRoZSBzZWxlY3Rpb24gdGhlIHRyZWUgaGFzCi0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHRyZWVTZWwyID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOwotICAgICAgICBhc3NlcnRUcnVlKCJTZWNvbmQgc2VsZWN0aW9uIHdyb25nIHNpemUsIHNob3VsZCBiZSBvbmx5IG9uZS4iLCB0cmVlU2VsMgotICAgICAgICAgICAgICAgIC5zaXplKCkgPT0gMSk7Ci0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZTIgPSAoSVJlc291cmNlKSB0cmVlU2VsMi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU2Vjb25kIHNlbGVjdGlvbiBjb250YWlucyB3cm9uZyBwcm9qZWN0IHJlc291cmNlLiIsCi0gICAgICAgICAgICAgICAgcmVzb3VyY2UyLmVxdWFscyhwMikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXb3JraW5nU2V0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHNldHVwVmlldygpOwotICAgICAgICBzZXR1cFJlc291cmNlcygpOwotCi0gICAgICAgIFJlc291cmNlTmF2aWdhdG9yIG5hdmlnYXRvciA9ICgoUmVzb3VyY2VOYXZpZ2F0b3IpIHZpZXcpOwotICAgICAgICBJV29ya2luZ1NldE1hbmFnZXIgd29ya2luZ1NldE1hbmFnZXIgPSBmV29ya2JlbmNoCi0gICAgICAgICAgICAgICAgLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCk7Ci0gICAgICAgIElXb3JraW5nU2V0IHdvcmtpbmdTZXQgPSB3b3JraW5nU2V0TWFuYWdlci5jcmVhdGVXb3JraW5nU2V0KCJ3czEiLAotICAgICAgICAgICAgICAgIG5ldyBJQWRhcHRhYmxlW10geyBmMSB9KTsKLQotICAgICAgICBhc3NlcnROdWxsKG5hdmlnYXRvci5nZXRXb3JraW5nU2V0KCkpOwotCi0gICAgICAgIG5hdmlnYXRvci5zZXRXb3JraW5nU2V0KHdvcmtpbmdTZXQpOwotICAgICAgICBhc3NlcnRFcXVhbHMod29ya2luZ1NldCwgbmF2aWdhdG9yLmdldFdvcmtpbmdTZXQoKSk7Ci0KLSAgICAgICAgbmF2aWdhdG9yLnNldFdvcmtpbmdTZXQobnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwobmF2aWdhdG9yLmdldFdvcmtpbmdTZXQoKSk7Ci0KLSAgICAgICAgRmlsZVV0aWwuY3JlYXRlRmlsZSgiZjExLnR4dCIsIHAxKTsKLSAgICAgICAgbmF2aWdhdG9yLnNldFdvcmtpbmdTZXQod29ya2luZ1NldCk7Ci0gICAgICAgIFRyZWVWaWV3ZXIgdmlld2VyID0gbmF2aWdhdG9yLmdldFRyZWVWaWV3ZXIoKTsKLSAgICAgICAgdmlld2VyLmV4cGFuZEFsbCgpOwotICAgICAgICBUcmVlSXRlbVtdIGl0ZW1zID0gdmlld2VyLmdldFRyZWUoKS5nZXRJdGVtcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocDEsIGl0ZW1zWzBdLmdldERhdGEoKSk7Ci0gICAgICAgIGl0ZW1zID0gaXRlbXNbMF0uZ2V0SXRlbXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGYxLCBpdGVtc1swXS5nZXREYXRhKCkpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9vcGVyYXRpb25zL0FkdmFuY2VkVGVzdE9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9vcGVyYXRpb25zL0FkdmFuY2VkVGVzdE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWE5ODI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvb3BlcmF0aW9ucy9BZHZhbmNlZFRlc3RPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklBZHZhbmNlZFVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGlzdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBBZHZhbmNlZFRlc3RPcGVyYXRpb24gZXh0ZW5kcyBUZXN0T3BlcmF0aW9uIGltcGxlbWVudHMKLQkJSUFkdmFuY2VkVW5kb2FibGVPcGVyYXRpb24gewotCi0Jc3RhdGljIGZpbmFsIGludCBJTkZPID0gMDsKLQotCXN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSAxOwotCi0Jc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gMjsKLQotCXB1YmxpYyBpbnQgc3RhdHVzID0gMDsKLQotCXB1YmxpYyBBZHZhbmNlZFRlc3RPcGVyYXRpb24oKSB7Ci0JCXN1cGVyKCJBIHZlcnkgbG9uZyBzdHJpbmcgdGhhdCBleGNlZWRzIHRoZSBtZW51IGxhYmVsIGxpbWl0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWJvdXRUb05vdGlmeShPcGVyYXRpb25IaXN0b3J5RXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGNvbXB1dGVVbmRvYWJsZVN0YXR1cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJY2FzZSBJTkZPOgotCQkJcmV0dXJuIElPcGVyYXRpb25IaXN0b3J5Lk5PVEhJTkdfVE9fVU5ET19TVEFUVVM7Ci0JCWNhc2UgRVJST1I6Ci0JCQlyZXR1cm4gSU9wZXJhdGlvbkhpc3RvcnkuT1BFUkFUSU9OX0lOVkFMSURfU1RBVFVTOwotCQljYXNlIFdBUk5JTkc6Ci0JCQlyZXR1cm4gbmV3IE9wZXJhdGlvblN0YXR1cyhJU3RhdHVzLldBUk5JTkcsICJvcmcuZWNsaXBzZS51aS50ZXN0cyIsIDAsICJVbmRvIHdhcm5pbmcgbWVzc2FnZSIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgY29tcHV0ZVJlZG9hYmxlU3RhdHVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzd2l0Y2ggKHN0YXR1cykgewotCQljYXNlIElORk86Ci0JCQlyZXR1cm4gSU9wZXJhdGlvbkhpc3RvcnkuTk9USElOR19UT19SRURPX1NUQVRVUzsKLQkJY2FzZSBFUlJPUjoKLQkJCXJldHVybiBJT3BlcmF0aW9uSGlzdG9yeS5PUEVSQVRJT05fSU5WQUxJRF9TVEFUVVM7Ci0JCWNhc2UgV0FSTklORzoKLQkJCXJldHVybiBuZXcgT3BlcmF0aW9uU3RhdHVzKElTdGF0dXMuV0FSTklORywgIm9yZy5lY2xpcHNlLnVpLnRlc3RzIiwgMCwgIlJlZG8gd2FybmluZyBtZXNzYWdlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvb3BlcmF0aW9ucy9NdWx0aVRocmVhZGVkT3BlcmF0aW9uc1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL29wZXJhdGlvbnMvTXVsdGlUaHJlYWRlZE9wZXJhdGlvbnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjc2ZWRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvb3BlcmF0aW9ucy9NdWx0aVRocmVhZGVkT3BlcmF0aW9uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5vcGVyYXRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFJ1bnMgdGhlIG9wZXJhdGlvbnMgQVBJIHRlc3RzIGFuZCB3b3JrYmVuY2ggb3BlcmF0aW9uIGhpc3RvcnkgdGVzdHMgZnJvbQotICogYmFja2dyb3VuZCB0aHJlYWRzCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIE11bHRpVGhyZWFkZWRPcGVyYXRpb25zVGVzdHMgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotCXB1YmxpYyBNdWx0aVRocmVhZGVkT3BlcmF0aW9uc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcGVyYXRpb25zQVBJaW5UaHJlYWRzKCkgewotCQkvLyBydW4gdGhlIG9wZXJhdGlvbnMgQVBJIHRlc3Qgc3VpdGUgZnJvbSB0aHJlZSBkaWZmZXJlbnQgam9icy4KLQkJY2xhc3MgT3BlcmF0aW9uc1Rlc3RKb2IgZXh0ZW5kcyBKb2IgewotCQkJcHVibGljIE9wZXJhdGlvbnNUZXN0Sm9iKCkgewotCQkJCXN1cGVyKCJPcGVyYXRpb25zIFRlc3QgSm9iIik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJ1bm5pbmcgT3BlcmF0aW9uc0FQSVRlc3QgZnJvbSBiYWNrZ3JvdW5kIGpvYiIpOwotCQkJCW5ldyBUZXN0U3VpdGUoT3BlcmF0aW9uc0FQSVRlc3QuY2xhc3MpLnJ1bihuZXcgVGVzdFJlc3VsdCgpKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJ1bm5pbmcgV29ya2JlbmNoT3BlcmF0aW9uSGlzdG9yeVRlc3RzIGZyb20gYmFja2dyb3VuZCBqb2IiKTsKLQkJCQluZXcgVGVzdFN1aXRlKFdvcmtiZW5jaE9wZXJhdGlvbkhpc3RvcnlUZXN0cy5jbGFzcykucnVuKG5ldyBUZXN0UmVzdWx0KCkpOwotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9Ci0KLQkJT3BlcmF0aW9uc1Rlc3RKb2Igam9iMSA9IG5ldyBPcGVyYXRpb25zVGVzdEpvYigpOwotCQlPcGVyYXRpb25zVGVzdEpvYiBqb2IyID0gbmV3IE9wZXJhdGlvbnNUZXN0Sm9iKCk7Ci0JCU9wZXJhdGlvbnNUZXN0Sm9iIGpvYjMgPSBuZXcgT3BlcmF0aW9uc1Rlc3RKb2IoKTsKLQotCQlqb2IxLnNjaGVkdWxlKCk7Ci0JCWpvYjIuc2NoZWR1bGUoKTsKLQkJam9iMy5zY2hlZHVsZSgpOwotCi0JCS8vIGRvbid0IHJldHVybiBmcm9tIHRoZSB0ZXN0IG1ldGhvZCB1bnRpbCB0aGUgam9icyBhcmUgY29tcGxldGUuCi0JCXRyeSB7Ci0JCQlqb2IxLmpvaW4oKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKb2IgaW50ZXJydXB0ZWQgaW4gdGVzdCBjYXNlIik7Ci0JCX0KLQkJdHJ5IHsKLQkJCWpvYjIuam9pbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpvYiBpbnRlcnJ1cHRlZCBpbiB0ZXN0IGNhc2UiKTsKLQkJfQotCQl0cnkgewotCQkJam9iMy5qb2luKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSm9iIGludGVycnVwdGVkIGluIHRlc3QgY2FzZSIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9vcGVyYXRpb25zL09wZXJhdGlvbnNBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL29wZXJhdGlvbnMvT3BlcmF0aW9uc0FQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjZTEzOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL29wZXJhdGlvbnMvT3BlcmF0aW9uc0FQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5vcGVyYXRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkRlZmF1bHRPcGVyYXRpb25IaXN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JQ29tcG9zaXRlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGlzdG9yeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25BcHByb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhpc3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkxpbmVhclVuZG9FbmZvcmNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT2JqZWN0VW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvblN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuVHJpZ2dlcmVkT3BlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0vKioKLSAqIFRlc3RzIHRoZSBPcGVyYXRpb25zIEZyYW1ld29yayBBUEkuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvbnNBUElUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JT2JqZWN0VW5kb0NvbnRleHQgY29udGV4dEEsIGNvbnRleHRCLCBjb250ZXh0QywgY29udGV4dFc7Ci0JSU9wZXJhdGlvbkhpc3RvcnkgaGlzdG9yeTsKLQotCUlVbmRvYWJsZU9wZXJhdGlvbiBvcDEsIG9wMiwgb3AzLCBvcDQsIG9wNSwgb3A2LCBsb2NhbEEsIGxvY2FsQiwgbG9jYWxDOwotCUlDb21wb3NpdGVPcGVyYXRpb24gcmVmYWN0b3I7Ci0JCi0JaW50IHByZUV4ZWMsIHBvc3RFeGVjLCBwcmVVbmRvLCBwb3N0VW5kbywgcHJlUmVkbywgcG9zdFJlZG8sIGFkZCwgcmVtb3ZlLCBub3RPSywgY2hhbmdlZCA9IDA7Ci0JSU9wZXJhdGlvbkhpc3RvcnlMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBPcGVyYXRpb25zQVBJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGVzdE5hbWUKLQkgKi8KLQlwdWJsaWMgT3BlcmF0aW9uc0FQSVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaGlzdG9yeSA9IG5ldyBEZWZhdWx0T3BlcmF0aW9uSGlzdG9yeSgpOwotCQljb250ZXh0QSA9IG5ldyBPYmplY3RVbmRvQ29udGV4dCgiQSIpOwotCQljb250ZXh0QiA9IG5ldyBPYmplY3RVbmRvQ29udGV4dCgiQiIpOwotCQljb250ZXh0QyA9IG5ldyBPYmplY3RVbmRvQ29udGV4dCgiQyIpOwotCQlvcDEgPSBuZXcgVGVzdE9wZXJhdGlvbigib3AxIik7Ci0JCW9wMS5hZGRDb250ZXh0KGNvbnRleHRBKTsKLQkJb3AyID0gbmV3IFRlc3RPcGVyYXRpb24oIm9wMiIpOwotCQlvcDIuYWRkQ29udGV4dChjb250ZXh0Qik7Ci0JCW9wMi5hZGRDb250ZXh0KGNvbnRleHRDKTsKLQkJb3AzID0gbmV3IFRlc3RPcGVyYXRpb24oIm9wMyIpOwotCQlvcDMuYWRkQ29udGV4dChjb250ZXh0Qyk7Ci0JCW9wNCA9IG5ldyBUZXN0T3BlcmF0aW9uKCJvcDQiKTsKLQkJb3A0LmFkZENvbnRleHQoY29udGV4dEEpOwotCQlvcDUgPSBuZXcgVGVzdE9wZXJhdGlvbigib3A1Iik7Ci0JCW9wNS5hZGRDb250ZXh0KGNvbnRleHRCKTsKLQkJb3A2ID0gbmV3IFRlc3RPcGVyYXRpb24oIm9wNiIpOwotCQlvcDYuYWRkQ29udGV4dChjb250ZXh0Qyk7Ci0JCW9wNi5hZGRDb250ZXh0KGNvbnRleHRBKTsKLQkJaGlzdG9yeS5leGVjdXRlKG9wMSwgbnVsbCwgbnVsbCk7Ci0JCWhpc3RvcnkuZXhlY3V0ZShvcDIsIG51bGwsIG51bGwpOwotCQloaXN0b3J5LmV4ZWN1dGUob3AzLCBudWxsLCBudWxsKTsKLQkJaGlzdG9yeS5leGVjdXRlKG9wNCwgbnVsbCwgbnVsbCk7Ci0JCWhpc3RvcnkuZXhlY3V0ZShvcDUsIG51bGwsIG51bGwpOwotCQloaXN0b3J5LmV4ZWN1dGUob3A2LCBudWxsLCBudWxsKTsKLQkJcHJlRXhlYyA9IDA7IHBvc3RFeGVjID0gMDsKLQkJcHJlVW5kbyA9IDA7IHBvc3RVbmRvID0gMDsgCi0JCXByZVJlZG8gPSAwOyBwb3N0UmVkbyA9IDA7Ci0JCWFkZCA9IDA7IHJlbW92ZSA9IDA7IG5vdE9LID0gMDsKLQkJbGlzdGVuZXIgPSBuZXcgSU9wZXJhdGlvbkhpc3RvcnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhpc3RvcnlOb3RpZmljYXRpb24oT3BlcmF0aW9uSGlzdG9yeUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgT3BlcmF0aW9uSGlzdG9yeUV2ZW50LkFCT1VUX1RPX0VYRUNVVEU6Ci0JCQkJCXByZUV4ZWMrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBPcGVyYXRpb25IaXN0b3J5RXZlbnQuQUJPVVRfVE9fVU5ETzoKLQkJCQkJcHJlVW5kbysrOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE9wZXJhdGlvbkhpc3RvcnlFdmVudC5BQk9VVF9UT19SRURPOgotCQkJCQlwcmVSZWRvKys7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgT3BlcmF0aW9uSGlzdG9yeUV2ZW50LkRPTkU6Ci0JCQkJCXBvc3RFeGVjKys7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgT3BlcmF0aW9uSGlzdG9yeUV2ZW50LlVORE9ORToKLQkJCQkJcG9zdFVuZG8rKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBPcGVyYXRpb25IaXN0b3J5RXZlbnQuUkVET05FOgotCQkJCQlwb3N0UmVkbysrOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE9wZXJhdGlvbkhpc3RvcnlFdmVudC5PUEVSQVRJT05fQURERUQ6Ci0JCQkJCWFkZCsrOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE9wZXJhdGlvbkhpc3RvcnlFdmVudC5PUEVSQVRJT05fUkVNT1ZFRDoKLQkJCQkJcmVtb3ZlKys7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgT3BlcmF0aW9uSGlzdG9yeUV2ZW50Lk9QRVJBVElPTl9OT1RfT0s6Ci0JCQkJCW5vdE9LKys7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgT3BlcmF0aW9uSGlzdG9yeUV2ZW50Lk9QRVJBVElPTl9DSEFOR0VEOgotCQkJCQljaGFuZ2VkKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJaGlzdG9yeS5hZGRPcGVyYXRpb25IaXN0b3J5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJaGlzdG9yeS5yZW1vdmVPcGVyYXRpb25IaXN0b3J5TGlzdGVuZXIobGlzdGVuZXIpOwotCQloaXN0b3J5LmRpc3Bvc2UoSU9wZXJhdGlvbkhpc3RvcnkuR0xPQkFMX1VORE9fQ09OVEVYVCwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250ZXh0RGlzcG9zZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlhc3NlcnRTYW1lKGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihjb250ZXh0QSksIG9wNik7Ci0JCWFzc2VydFNhbWUoaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKGNvbnRleHRDKSwgb3A2KTsKLQkJaGlzdG9yeS5kaXNwb3NlKGNvbnRleHRBLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0JCWFzc2VydFNhbWUoaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKGNvbnRleHRDKSwgb3A2KTsKLQkJYXNzZXJ0RmFsc2Uob3A2Lmhhc0NvbnRleHQoY29udGV4dEEpKTsKLQkJaGlzdG9yeS51bmRvKGNvbnRleHRDLCBudWxsLCBudWxsKTsKLQkJaGlzdG9yeS5kaXNwb3NlKGNvbnRleHRDLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQlhc3NlcnRGYWxzZShoaXN0b3J5LmNhblVuZG8oY29udGV4dEMpKTsKLQkJYXNzZXJ0VHJ1ZShoaXN0b3J5LmNhblJlZG8oY29udGV4dEMpKTsKLQkJaGlzdG9yeS5yZWRvKGNvbnRleHRDLCBudWxsLCBudWxsKTsKLQkJSVVuZG9hYmxlT3BlcmF0aW9uW10gb3BzID0gaGlzdG9yeS5nZXRVbmRvSGlzdG9yeShJT3BlcmF0aW9uSGlzdG9yeS5HTE9CQUxfVU5ET19DT05URVhUKTsKLQkJYXNzZXJ0RXF1YWxzKG9wcy5sZW5ndGgsIDMpOwotCQlvcHMgPSBoaXN0b3J5LmdldFVuZG9IaXN0b3J5KGNvbnRleHRDKTsKLQkJYXNzZXJ0RXF1YWxzKG9wcy5sZW5ndGgsIDEpOwotCQlvcHMgPSBoaXN0b3J5LmdldFVuZG9IaXN0b3J5KGNvbnRleHRCKTsKLQkJYXNzZXJ0RXF1YWxzKG9wcy5sZW5ndGgsIDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250ZXh0SGlzdG9yaWVzKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWFzc2VydFNhbWUoaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKGNvbnRleHRBKSwgb3A2KTsKLQkJYXNzZXJ0U2FtZShoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oY29udGV4dEIpLCBvcDUpOwotCQlhc3NlcnRTYW1lKGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihjb250ZXh0QyksIG9wNik7Ci0JCUlTdGF0dXMgc3RhdHVzID0gaGlzdG9yeS51bmRvKGNvbnRleHRDLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiU3RhdHVzIHNob3VsZCBiZSBvayIsIHN0YXR1cy5pc09LKCkpOwotCQlhc3NlcnRTYW1lKGhpc3RvcnkuZ2V0UmVkb09wZXJhdGlvbihjb250ZXh0QyksIG9wNik7Ci0JCWFzc2VydFNhbWUoaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKGNvbnRleHRDKSwgb3AzKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIGFibGUgdG8gcmVkbyBpbiBjMyIsIGhpc3RvcnkuY2FuUmVkbyhjb250ZXh0QykpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgYWJsZSB0byByZWRvIGluIGMxIiwgaGlzdG9yeS5jYW5SZWRvKGNvbnRleHRBKSk7Ci0JCWhpc3RvcnkucmVkbyhjb250ZXh0QSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFNhbWUoaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKGNvbnRleHRDKSwgb3A2KTsKLQkJYXNzZXJ0U2FtZShoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oY29udGV4dEEpLCBvcDYpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIaXN0b3J5TGltaXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaGlzdG9yeS5zZXRMaW1pdChjb250ZXh0QSwgMik7Ci0JCWFzc2VydFRydWUoaGlzdG9yeS5nZXRVbmRvSGlzdG9yeShjb250ZXh0QSkubGVuZ3RoID09IDIpOwotCQloaXN0b3J5LmFkZChvcDEpOwotCQlhc3NlcnRUcnVlKGhpc3RvcnkuZ2V0VW5kb0hpc3RvcnkoY29udGV4dEEpLmxlbmd0aCA9PSAyKTsKLQkJaGlzdG9yeS5zZXRMaW1pdChjb250ZXh0QiwgMSk7Ci0JCWFzc2VydFRydWUoaGlzdG9yeS5nZXRVbmRvSGlzdG9yeShjb250ZXh0QikubGVuZ3RoID09IDEpOwotCQlhc3NlcnRGYWxzZShvcDIuaGFzQ29udGV4dChjb250ZXh0QikpOwotCQloaXN0b3J5LnVuZG8oY29udGV4dEIsIG51bGwsIG51bGwpOwotCQlhc3NlcnRUcnVlKGhpc3RvcnkuZ2V0UmVkb0hpc3RvcnkoY29udGV4dEIpLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZShoaXN0b3J5LmdldFVuZG9IaXN0b3J5KGNvbnRleHRCKS5sZW5ndGggPT0gMCk7Ci0JCWhpc3RvcnkucmVkbyhjb250ZXh0QiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoaGlzdG9yeS5nZXRSZWRvSGlzdG9yeShjb250ZXh0QikubGVuZ3RoID09IDApOwotCQlhc3NlcnRUcnVlKGhpc3RvcnkuZ2V0VW5kb0hpc3RvcnkoY29udGV4dEIpLmxlbmd0aCA9PSAxKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExvY2FsSGlzdG9yeUxpbWl0cygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQloaXN0b3J5LnNldExpbWl0KGNvbnRleHRDLCAyKTsKLQkJYXNzZXJ0VHJ1ZShoaXN0b3J5LmdldFVuZG9IaXN0b3J5KGNvbnRleHRDKS5sZW5ndGggPT0gMik7Ci0JCS8vIG9wMiBzaG91bGQgaGF2ZSBjb250ZXh0IGMzIHJlbW92ZWQgYXMgcGFydCBvZiBmb3JjaW5nIHRoZSBsaW1pdAotCQlhc3NlcnRGYWxzZShvcDIuaGFzQ29udGV4dChjb250ZXh0QykpOwotCQlhc3NlcnRUcnVlKGhpc3RvcnkuZ2V0VW5kb0hpc3RvcnkoY29udGV4dEIpLmxlbmd0aCA9PSAyKTsKLQkJCi0JCWhpc3Rvcnkuc2V0TGltaXQoY29udGV4dEIsIDEpOwotCQlhc3NlcnRUcnVlKGhpc3RvcnkuZ2V0VW5kb0hpc3RvcnkoY29udGV4dEIpLmxlbmd0aCA9PSAxKTsKLQkJaGlzdG9yeS51bmRvKGNvbnRleHRCLCBudWxsLCBudWxsKTsKLQkJb3AyLmFkZENvbnRleHQoY29udGV4dEMpOwotCQloaXN0b3J5LmFkZChvcDIpOwotCQlhc3NlcnRTYW1lKGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihjb250ZXh0QiksIG9wMik7Ci0JCWFzc2VydFRydWUoaGlzdG9yeS5nZXRVbmRvSGlzdG9yeShjb250ZXh0QikubGVuZ3RoID09IDEpOwotCQkKLQkJaGlzdG9yeS5zZXRMaW1pdChjb250ZXh0QSwgMCk7Ci0JCWFzc2VydFRydWUoaGlzdG9yeS5nZXRVbmRvSGlzdG9yeShjb250ZXh0QSkubGVuZ3RoID09IDApOwotCQloaXN0b3J5LmFkZChvcDEpOwotCQlhc3NlcnRUcnVlKGhpc3RvcnkuZ2V0VW5kb0hpc3RvcnkoY29udGV4dEEpLmxlbmd0aCA9PSAwKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3Blbk9wZXJhdGlvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBjbGVhciBvdXQgaGlzdG9yeSB3aGljaCB3aWxsIGFsc28gcmVzZXQgb3BlcmF0aW9uIGV4ZWN1dGlvbiBjb3VudHMKLQkJaGlzdG9yeS5kaXNwb3NlKElPcGVyYXRpb25IaXN0b3J5LkdMT0JBTF9VTkRPX0NPTlRFWFQsIHRydWUsIHRydWUsIGZhbHNlKTsKLQkJSUNvbXBvc2l0ZU9wZXJhdGlvbiBiYXRjaCA9IG5ldyBUcmlnZ2VyZWRPcGVyYXRpb25zKG9wMSwgaGlzdG9yeSk7Ci0JCWhpc3Rvcnkub3Blbk9wZXJhdGlvbihiYXRjaCwgSU9wZXJhdGlvbkhpc3RvcnkuRVhFQ1VURSk7Ci0JCW9wMS5leGVjdXRlKG51bGwsIG51bGwpOwotCQlvcDIuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJaGlzdG9yeS5hZGQob3AyKTsKLQkJaGlzdG9yeS5leGVjdXRlKG9wMywgbnVsbCwgbnVsbCk7Ci0JCUlVbmRvYWJsZU9wZXJhdGlvbiBvcCA9IGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihJT3BlcmF0aW9uSGlzdG9yeS5HTE9CQUxfVU5ET19DT05URVhUKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gb3BlcmF0aW9ucyBzaG91bGQgYmUgaW4gaGlzdG9yeSB5ZXQiLCBvcCA9PSBudWxsKTsKLQkJaGlzdG9yeS5jbG9zZU9wZXJhdGlvbih0cnVlLCB0cnVlLCBJT3BlcmF0aW9uSGlzdG9yeS5FWEVDVVRFKTsKLQkJb3AgPSBoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oSU9wZXJhdGlvbkhpc3RvcnkuR0xPQkFMX1VORE9fQ09OVEVYVCk7Ci0JCWFzc2VydFRydWUoIk9wZXJhdGlvbiBzaG91bGQgYmUgYmF0Y2hpbmciLCBvcCA9PSBiYXRjaCk7Ci0JCW9wLnJlbW92ZUNvbnRleHQoY29udGV4dEIpOwotCQlhc3NlcnRGYWxzZSgiT3BlcmF0aW9uIHNob3VsZCBub3QgaGF2ZSBjb250ZXh0Iiwgb3AuaGFzQ29udGV4dChjb250ZXh0QikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0OTQ0NTkoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gY2xlYXIgb3V0IGhpc3Rvcnkgd2hpY2ggd2lsbCBhbHNvIHJlc2V0IG9wZXJhdGlvbiBleGVjdXRpb24gY291bnRzCi0JCWhpc3RvcnkuZGlzcG9zZShJT3BlcmF0aW9uSGlzdG9yeS5HTE9CQUxfVU5ET19DT05URVhULCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0JCW9wMi5leGVjdXRlKG51bGwsIG51bGwpOwotCQlJQ29tcG9zaXRlT3BlcmF0aW9uIGJhdGNoID0gbmV3IFRyaWdnZXJlZE9wZXJhdGlvbnMob3AyLCBoaXN0b3J5KTsKLQkJaGlzdG9yeS5vcGVuT3BlcmF0aW9uKGJhdGNoLCBJT3BlcmF0aW9uSGlzdG9yeS5FWEVDVVRFKTsKLQkJaGlzdG9yeS5zZXRMaW1pdChjb250ZXh0QSwgMCk7Ci0JCW9wMS5leGVjdXRlKG51bGwsIG51bGwpOwotCQloaXN0b3J5LmFkZChvcDEpOwotCQloaXN0b3J5LmNsb3NlT3BlcmF0aW9uKHRydWUsIHRydWUsIElPcGVyYXRpb25IaXN0b3J5LkVYRUNVVEUpOwotCQlJVW5kb2FibGVPcGVyYXRpb24gb3AgPSBoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oSU9wZXJhdGlvbkhpc3RvcnkuR0xPQkFMX1VORE9fQ09OVEVYVCk7Ci0JCWFzc2VydFRydWUoIk9wZXJhdGlvbiBzaG91bGQgYmUgYmF0Y2hpbmciLCBvcCA9PSBiYXRjaCk7Ci0JCWFzc2VydEZhbHNlKCJPcGVyYXRpb24gc2hvdWxkIG5vdCBoYXZlIGNvbnRleHQiLCBvcC5oYXNDb250ZXh0KGNvbnRleHRBKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3Q5NDQ1OUFsbENvbnRleHRzRW1wdHkoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gY2xlYXIgb3V0IGhpc3Rvcnkgd2hpY2ggd2lsbCBhbHNvIHJlc2V0IG9wZXJhdGlvbiBleGVjdXRpb24gY291bnRzCi0JCWhpc3RvcnkuZGlzcG9zZShJT3BlcmF0aW9uSGlzdG9yeS5HTE9CQUxfVU5ET19DT05URVhULCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0JCW9wMi5leGVjdXRlKG51bGwsIG51bGwpOwotCQlJQ29tcG9zaXRlT3BlcmF0aW9uIGJhdGNoID0gbmV3IFRyaWdnZXJlZE9wZXJhdGlvbnMob3AyLCBoaXN0b3J5KTsKLQkJaGlzdG9yeS5vcGVuT3BlcmF0aW9uKGJhdGNoLCBJT3BlcmF0aW9uSGlzdG9yeS5FWEVDVVRFKTsKLQkJaGlzdG9yeS5zZXRMaW1pdChjb250ZXh0QSwgMCk7Ci0JCWhpc3Rvcnkuc2V0TGltaXQoY29udGV4dEIsIDApOwotCQloaXN0b3J5LnNldExpbWl0KGNvbnRleHRDLCAwKTsKLQkJb3AxLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCWhpc3RvcnkuYWRkKG9wMSk7Ci0JCWhpc3RvcnkuY2xvc2VPcGVyYXRpb24odHJ1ZSwgdHJ1ZSwgSU9wZXJhdGlvbkhpc3RvcnkuRVhFQ1VURSk7Ci0JCUlVbmRvYWJsZU9wZXJhdGlvbiBvcCA9IGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihJT3BlcmF0aW9uSGlzdG9yeS5HTE9CQUxfVU5ET19DT05URVhUKTsKLQkJYXNzZXJ0VHJ1ZSgiT3BlcmF0aW9uIHNob3VsZCBub3QgaGF2ZSBiZWVuIGFkZGVkIiwgb3AgPT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDk0NDAwKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCVVucmVkb2FibGVUZXN0T3BlcmF0aW9uIG9wID0gbmV3IFVucmVkb2FibGVUZXN0T3BlcmF0aW9uKCJ0cm91YmxlZCBvcCIpOwotCQlvcC5hZGRDb250ZXh0KGNvbnRleHRBKTsKLQkJaGlzdG9yeS5leGVjdXRlKG9wLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiT3BlcmF0aW9uIHNob3VsZCBiZSB1bmRvYWJsZSIsIGhpc3RvcnkuY2FuVW5kbyhjb250ZXh0QSkpOwotCQloaXN0b3J5LnVuZG8oY29udGV4dEEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRGYWxzZSgiT3BlcmF0aW9uIHNob3VsZCBub3QgYmUgaW4gcmVkbyBoaXN0b3J5IiwgaGlzdG9yeS5nZXRSZWRvT3BlcmF0aW9uKGNvbnRleHRBKSA9PSBvcCk7Ci0JCWFzc2VydFRydWUoIk9wZXJhdGlvbiBzaG91bGQgYmUgZGlzcG9zZWQiLCBvcC5kaXNwb3NlZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1Y2Nlc3NmdWxPcGVuT3BlcmF0aW9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIGNsZWFyIG91dCBoaXN0b3J5IHdoaWNoIHdpbGwgYWxzbyByZXNldCBvcGVyYXRpb24gZXhlY3V0aW9uIGNvdW50cwotCQloaXN0b3J5LmRpc3Bvc2UoSU9wZXJhdGlvbkhpc3RvcnkuR0xPQkFMX1VORE9fQ09OVEVYVCwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotCQlJQ29tcG9zaXRlT3BlcmF0aW9uIGJhdGNoID0gbmV3IFRyaWdnZXJlZE9wZXJhdGlvbnMob3AxLCBoaXN0b3J5KTsKLQkJaGlzdG9yeS5vcGVuT3BlcmF0aW9uKGJhdGNoLCBJT3BlcmF0aW9uSGlzdG9yeS5FWEVDVVRFKTsKLQkJb3AxLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCW9wMi5leGVjdXRlKG51bGwsIG51bGwpOwotCQloaXN0b3J5LmFkZChvcDIpOwotCQloaXN0b3J5LmV4ZWN1dGUob3AzLCBudWxsLCBudWxsKTsKLQkJSVVuZG9hYmxlT3BlcmF0aW9uIG9wID0gaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKElPcGVyYXRpb25IaXN0b3J5LkdMT0JBTF9VTkRPX0NPTlRFWFQpOwotCQlhc3NlcnRUcnVlKCJubyBvcGVyYXRpb25zIHNob3VsZCBiZSBpbiBoaXN0b3J5IHlldCIsIG9wID09IG51bGwpOwotCQloaXN0b3J5LmNsb3NlT3BlcmF0aW9uKGZhbHNlLCB0cnVlLCBJT3BlcmF0aW9uSGlzdG9yeS5FWEVDVVRFKTsKLQkJb3AgPSBoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oSU9wZXJhdGlvbkhpc3RvcnkuR0xPQkFMX1VORE9fQ09OVEVYVCk7Ci0JCWFzc2VydE51bGwoIlVuc3VjY2Vzc2Z1bCBvcGVyYXRpb24gc2hvdWxkIG5vdCBiZSBhZGRlZCB0byBoaXN0b3J5Iiwgb3ApOwotCQlhc3NlcnRUcnVlKCJOT1RfT0sgbm90aWZpY2F0aW9uIHNob3VsZCBoYXZlIGJlZW4gcmVjZWl2ZWQiLCBub3RPSyA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiRE9ORSBzaG91bGQgbm90IGJlIHNlbnQgd2hpbGUgYmF0Y2hpbmciLCBwb3N0RXhlYyA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSgiQURERUQgc2hvdWxkIG5vdCBoYXZlIGJlZW4gc2VudCB3aGlsZSBiYXRjaGluZyIsIGFkZCA9PSAwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vdEFkZGVkT3Blbk9wZXJhdGlvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBjbGVhciBvdXQgaGlzdG9yeSB3aGljaCB3aWxsIGFsc28gcmVzZXQgb3BlcmF0aW9uIGV4ZWN1dGlvbiBjb3VudHMKLQkJaGlzdG9yeS5kaXNwb3NlKElPcGVyYXRpb25IaXN0b3J5LkdMT0JBTF9VTkRPX0NPTlRFWFQsIHRydWUsIHRydWUsIGZhbHNlKTsKLQkJSUNvbXBvc2l0ZU9wZXJhdGlvbiBiYXRjaCA9IG5ldyBUcmlnZ2VyZWRPcGVyYXRpb25zKG9wMSwgaGlzdG9yeSk7Ci0JCWhpc3Rvcnkub3Blbk9wZXJhdGlvbihiYXRjaCwgSU9wZXJhdGlvbkhpc3RvcnkuRVhFQ1VURSk7Ci0JCW9wMS5leGVjdXRlKG51bGwsIG51bGwpOwotCQlvcDIuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJaGlzdG9yeS5hZGQob3AyKTsKLQkJaGlzdG9yeS5leGVjdXRlKG9wMywgbnVsbCwgbnVsbCk7Ci0JCUlVbmRvYWJsZU9wZXJhdGlvbiBvcCA9IGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihJT3BlcmF0aW9uSGlzdG9yeS5HTE9CQUxfVU5ET19DT05URVhUKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gb3BlcmF0aW9ucyBzaG91bGQgYmUgaW4gaGlzdG9yeSB5ZXQiLCBvcCA9PSBudWxsKTsKLQkJaGlzdG9yeS5jbG9zZU9wZXJhdGlvbih0cnVlLCBmYWxzZSwgSU9wZXJhdGlvbkhpc3RvcnkuRVhFQ1VURSk7Ci0JCW9wID0gaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKElPcGVyYXRpb25IaXN0b3J5LkdMT0JBTF9VTkRPX0NPTlRFWFQpOwotCQlhc3NlcnROdWxsKCJPcGVyYXRpb24gc2hvdWxkIG5vdCBiZSBhZGRlZCB0byBoaXN0b3J5Iiwgb3ApOwotCQlhc3NlcnRUcnVlKCJET05FIG5vdGlmaWNhdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHJlY2VpdmVkIiwgcG9zdEV4ZWMgPT0gMSk7Ci0JCWFzc2VydFRydWUoIkFEREVEIHNob3VsZCBub3QgaGF2ZSBvY2N1cnJlZCBvciBiZSBzZW50IHdoaWxlIGJhdGNoaW5nIiwgYWRkID09IDApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVPcGVuT3BlcmF0aW9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIGNsZWFyIG91dCBoaXN0b3J5IHdoaWNoIHdpbGwgYWxzbyByZXNldCBvcGVyYXRpb24gZXhlY3V0aW9uIGNvdW50cwotCQlib29sZWFuIGZhaWx1cmUgPSBmYWxzZTsKLQkJaGlzdG9yeS5kaXNwb3NlKElPcGVyYXRpb25IaXN0b3J5LkdMT0JBTF9VTkRPX0NPTlRFWFQsIHRydWUsIHRydWUsIGZhbHNlKTsKLQkJSUNvbXBvc2l0ZU9wZXJhdGlvbiBjb21wMSA9IG5ldyBUcmlnZ2VyZWRPcGVyYXRpb25zKG9wMSwgaGlzdG9yeSk7Ci0JCWhpc3Rvcnkub3Blbk9wZXJhdGlvbihjb21wMSwgSU9wZXJhdGlvbkhpc3RvcnkuRVhFQ1VURSk7Ci0JCW9wMS5leGVjdXRlKG51bGwsIG51bGwpOwotCQlvcDIuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJaGlzdG9yeS5hZGQob3AyKTsKLQkJaGlzdG9yeS5leGVjdXRlKG9wMywgbnVsbCwgbnVsbCk7Ci0JCUlDb21wb3NpdGVPcGVyYXRpb24gY29tcDIgPSBuZXcgVHJpZ2dlcmVkT3BlcmF0aW9ucyhvcDQsIGhpc3RvcnkpOwotCQl0cnkgewotCQkJaGlzdG9yeS5vcGVuT3BlcmF0aW9uKGNvbXAyLCBJT3BlcmF0aW9uSGlzdG9yeS5FWEVDVVRFKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWx1cmUgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIkV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBmb3Igc2Vjb25kIG9wZW4gb3BlcmF0aW9uIiwgZmFpbHVyZSk7Ci0JCUlVbmRvYWJsZU9wZXJhdGlvbiBvcCA9IGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihJT3BlcmF0aW9uSGlzdG9yeS5HTE9CQUxfVU5ET19DT05URVhUKTsKLQkJYXNzZXJ0TnVsbCgiVW5leHBlY3RlZCBuZXN0ZWQgb3BlbiBzaG91bGQgbm90IGFkZCBvcmlnaW5hbCIsIG9wKTsKLQkJaGlzdG9yeS5jbG9zZU9wZXJhdGlvbih0cnVlLCB0cnVlLCBJT3BlcmF0aW9uSGlzdG9yeS5FWEVDVVRFKTsKLQkJb3AgPSBoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oSU9wZXJhdGlvbkhpc3RvcnkuR0xPQkFMX1VORE9fQ09OVEVYVCk7Ci0JCWFzc2VydFNhbWUoIkZpcnN0IG9wZXJhdGlvbiBzaG91bGQgYmUgY2xvc2VkIiwgb3AsIGNvbXAxKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFib3J0ZWRPcGVuT3BlcmF0aW9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWhpc3RvcnkuZGlzcG9zZShJT3BlcmF0aW9uSGlzdG9yeS5HTE9CQUxfVU5ET19DT05URVhULCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0JCWhpc3Rvcnkub3Blbk9wZXJhdGlvbihuZXcgVHJpZ2dlcmVkT3BlcmF0aW9ucyhvcDEsIGhpc3RvcnkpLCBJT3BlcmF0aW9uSGlzdG9yeS5FWEVDVVRFKTsKLQkJb3AxLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCWhpc3RvcnkuZXhlY3V0ZShvcDIsIG51bGwsIG51bGwpOwotCQkvLyBmbHVzaCBoaXN0b3J5IHdoaWxlIG9wZXJhdGlvbiBpcyBvcGVuCi0JCWhpc3RvcnkuZGlzcG9zZShJT3BlcmF0aW9uSGlzdG9yeS5HTE9CQUxfVU5ET19DT05URVhULCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0JCS8vIG9wMyBzaG91bGQgYmUgYWRkZWQgYXMgaXRzIG93biBvcCBzaW5jZSB3ZSBmbHVzaGVkIHdoaWxlIG9wZW4KLQkJaGlzdG9yeS5hZGQob3AzKTsKLQkJLy8gc2hvdWxkIHJlYWxseSBoYXZlIG5vIGVmZmVjdAotCQloaXN0b3J5LmNsb3NlT3BlcmF0aW9uKHRydWUsIHRydWUsIElPcGVyYXRpb25IaXN0b3J5LkVYRUNVVEUpOwotCQlJVW5kb2FibGVPcGVyYXRpb24gb3AgPSBoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oSU9wZXJhdGlvbkhpc3RvcnkuR0xPQkFMX1VORE9fQ09OVEVYVCk7Ci0JCWFzc2VydFRydWUoIk9wZW4gb3BlcmF0aW9uIHNob3VsZCBiZSBmbHVzaGVkIiwgb3AgPT0gb3AzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BlcmF0aW9uQXBwcm92YWwoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaGlzdG9yeS5hZGRPcGVyYXRpb25BcHByb3ZlcihuZXcgTGluZWFyVW5kb0VuZm9yY2VyKCkpOwotCQkvLyB0aGUgZmlyc3QgdW5kbyBzaG91bGQgYmUgZmluZQotCQlJU3RhdHVzIHN0YXR1cyA9IGhpc3RvcnkudW5kbyhjb250ZXh0QiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoc3RhdHVzLmlzT0soKSk7Ci0KLQkJLy8gdGhlIHNlY29uZCBjYXVzZXMgYSBsaW5lYXIgdmlvbGF0aW9uIG9uIEMKLQkJYXNzZXJ0VHJ1ZShoaXN0b3J5LmNhblVuZG8oY29udGV4dEIpKTsKLQkJc3RhdHVzID0gaGlzdG9yeS51bmRvKGNvbnRleHRCLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RmFsc2Uoc3RhdHVzLmlzT0soKSk7Ci0KLQkJLy8gdW5kbyB0aGUgbmV3ZXIgQyBpdGVtcwotCQlzdGF0dXMgPSBoaXN0b3J5LnVuZG8oY29udGV4dEMsIG51bGwsIG51bGwpOwotCQlhc3NlcnRUcnVlKHN0YXR1cy5pc09LKCkpOwotCQlzdGF0dXMgPSBoaXN0b3J5LnVuZG8oY29udGV4dEMsIG51bGwsIG51bGwpOwotCQlhc3NlcnRUcnVlKHN0YXR1cy5pc09LKCkpOwotCi0JCS8vIG5vdyB3ZSBzaG91bGQgYmUgb2theSBpbiBCCi0JCXN0YXR1cyA9IGhpc3RvcnkudW5kbyhjb250ZXh0QiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoc3RhdHVzLmlzT0soKSk7Ci0KLQkJaGlzdG9yeS5hZGRPcGVyYXRpb25BcHByb3ZlcihuZXcgSU9wZXJhdGlvbkFwcHJvdmVyKCkgewotCi0JCQlwdWJsaWMgSVN0YXR1cyBwcm9jZWVkUmVkb2luZyhJVW5kb2FibGVPcGVyYXRpb24gbywgSU9wZXJhdGlvbkhpc3RvcnkgaCwgSUFkYXB0YWJsZSBhKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCQkJcHVibGljIElTdGF0dXMgcHJvY2VlZFVuZG9pbmcoSVVuZG9hYmxlT3BlcmF0aW9uIG8sIElPcGVyYXRpb25IaXN0b3J5IGgsIElBZGFwdGFibGUgYSkgewotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQkJfSk7Ci0JCS8vIGV2ZXJ5dGhpbmcgc2hvdWxkIGZhaWwgbm93Ci0JCWFzc2VydEZhbHNlKGhpc3RvcnkucmVkbyhjb250ZXh0QiwgbnVsbCwgbnVsbCkuaXNPSygpKTsKLQkJYXNzZXJ0RmFsc2UoaGlzdG9yeS5yZWRvKGNvbnRleHRDLCBudWxsLCBudWxsKS5pc09LKCkpOwotCQlhc3NlcnRGYWxzZShoaXN0b3J5LnVuZG8oY29udGV4dEEsIG51bGwsIG51bGwpLmlzT0soKSk7Ci0JCWFzc2VydEZhbHNlKGhpc3RvcnkudW5kbyhjb250ZXh0QiwgbnVsbCwgbnVsbCkuaXNPSygpKTsKLQkJYXNzZXJ0RmFsc2UoaGlzdG9yeS51bmRvKGNvbnRleHRDLCBudWxsLCBudWxsKS5pc09LKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcGVyYXRpb25GYWlsdXJlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWhpc3RvcnkuYWRkT3BlcmF0aW9uQXBwcm92ZXIobmV3IElPcGVyYXRpb25BcHByb3ZlcigpIHsKLQotCQkJcHVibGljIElTdGF0dXMgcHJvY2VlZFJlZG9pbmcoSVVuZG9hYmxlT3BlcmF0aW9uIG8sIElPcGVyYXRpb25IaXN0b3J5IGgsIElBZGFwdGFibGUgYSkgewotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQkJcHVibGljIElTdGF0dXMgcHJvY2VlZFVuZG9pbmcoSVVuZG9hYmxlT3BlcmF0aW9uIG8sIElPcGVyYXRpb25IaXN0b3J5IGgsIElBZGFwdGFibGUgYSkgewotCQkJCWlmIChvID09IG9wNikKLQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCWlmIChvID09IG9wNSkKLQkJCQkJcmV0dXJuIG5ldyBPcGVyYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgIm9yZy5lY2xpcHNlLnVpLnRlc3RzIiwgMCwgIkVycm9yIiwgbnVsbCk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIHNob3VsZCBmYWlsIGJ1dCBzdGlsbCBrZWVwIG9wNiBvbiB0aGUgc3RhY2sgc2luY2UgaXQncyBjYW5jZWxsZWQKLQkJSVN0YXR1cyBzdGF0dXMgPSBoaXN0b3J5LnVuZG8oY29udGV4dEMsIG51bGwsIG51bGwpOwotCQlhc3NlcnRGYWxzZShzdGF0dXMuaXNPSygpKTsKLQkJYXNzZXJ0U2FtZShoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oY29udGV4dEMpLCBvcDYpOwotCi0JCS8vIHNob3VsZCBmYWlsIHNpbmNlIGl0J3MgYW4gZXJyb3IKLQkJc3RhdHVzID0gaGlzdG9yeS51bmRvKGNvbnRleHRCLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RmFsc2Uoc3RhdHVzLmlzT0soKSk7Ci0KLQkJLy8gb3BlcmF0aW9uIHJlbWFpbnMgb24gc3RhY2sgKHNlZSBidWcjOTI1MDYpCi0JCWFzc2VydFNhbWUoaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKGNvbnRleHRCKSwgb3A1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BlcmF0aW9uUmVkbygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQloaXN0b3J5LnVuZG8oY29udGV4dEIsIG51bGwsIG51bGwpOwotCQloaXN0b3J5LnVuZG8oY29udGV4dEIsIG51bGwsIG51bGwpOwotCQloaXN0b3J5LnVuZG8oY29udGV4dEMsIG51bGwsIG51bGwpOwotCQloaXN0b3J5LnVuZG8oY29udGV4dEMsIG51bGwsIG51bGwpOwotCQlhc3NlcnRTYW1lKGhpc3RvcnkuZ2V0UmVkb09wZXJhdGlvbihjb250ZXh0QiksIG9wMik7Ci0JCWFzc2VydFNhbWUoaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKGNvbnRleHRBKSwgb3A0KTsKLQkJYXNzZXJ0VHJ1ZShoaXN0b3J5LmNhblVuZG8oY29udGV4dEEpKTsKLQkJYXNzZXJ0RmFsc2UoaGlzdG9yeS5jYW5VbmRvKGNvbnRleHRCKSk7Ci0JCWFzc2VydEZhbHNlKGhpc3RvcnkuY2FuVW5kbyhjb250ZXh0QykpOwotCQlhc3NlcnRUcnVlKHByZVVuZG8gPT0gNCk7Ci0JCWFzc2VydFRydWUocG9zdFVuZG8gPT0gNCk7Ci0JCWhpc3RvcnkucmVkbyhjb250ZXh0QiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUocG9zdFJlZG8gPT0gMSk7Ci0JCWFzc2VydFRydWUoaGlzdG9yeS5jYW5VbmRvKGNvbnRleHRCKSk7Ci0JCWFzc2VydFRydWUoaGlzdG9yeS5jYW5VbmRvKGNvbnRleHRDKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wZXJhdGlvblVuZG8oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaGlzdG9yeS51bmRvKGNvbnRleHRBLCBudWxsLCBudWxsKTsKLQkJaGlzdG9yeS51bmRvKGNvbnRleHRBLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0U2FtZShoaXN0b3J5LmdldFJlZG9PcGVyYXRpb24oY29udGV4dEEpLCBvcDQpOwotCQlhc3NlcnRTYW1lKGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihjb250ZXh0QSksIG9wMSk7Ci0JCWhpc3RvcnkudW5kbyhjb250ZXh0QSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUocHJlVW5kbyA9PSAzKTsKLQkJYXNzZXJ0VHJ1ZShwb3N0VW5kbyA9PSAzKTsKLQkJYXNzZXJ0RmFsc2UoIlNob3VsZG4ndCBiZSBhYmxlIHRvIHVuZG8gaW4gYzEiLCBoaXN0b3J5LmNhblVuZG8oY29udGV4dEEpKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIGFibGUgdG8gdW5kbyBpbiBjMiIsIGhpc3RvcnkuY2FuVW5kbyhjb250ZXh0QikpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgYWJsZSB0byB1bmRvIGluIGMzIiwgaGlzdG9yeS5jYW5VbmRvKGNvbnRleHRDKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaXN0b3J5RmFjdG9yeSgpIHsKLQkJSU9wZXJhdGlvbkhpc3RvcnkgYW5vdGhlckhpc3RvcnkgPSBPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCk7Ci0JCWFzc2VydE5vdE51bGwoYW5vdGhlckhpc3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3BlcmF0aW9uQ2hhbmdlZCgpIHsKLQkJaGlzdG9yeS5vcGVyYXRpb25DaGFuZ2VkKG9wMSk7Ci0JCWhpc3Rvcnkub3BlcmF0aW9uQ2hhbmdlZChvcDIpOwotCQloaXN0b3J5Lm9wZXJhdGlvbkNoYW5nZWQobmV3IFRlc3RPcGVyYXRpb24oIk5ldyBvcCIpKTsKLQkJYXNzZXJ0VHJ1ZSgic2hvdWxkIG5vdCBub3RpZnkgYWJvdXQgY2hhbmdlcyBpZiBub3QgaW4gdGhlIGhpc3RvcnkiLCBjaGFuZ2VkID09IDIpOwotCX0KLQkKLQkvLyB0aGUgc2V0dXAgZm9yIHRoZSBpbmZhbW91cyAobG9jYWwgY29uZmxpY3Qgb24gdG9wIG9mIGNvbXBvc2l0ZSBhbmQgY29tcG9zaXRlIGdldHMgcHJ1bmVkKSBjYXNlCi0JcHJpdmF0ZSB2b2lkIHNldHVwODc2NzUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gY2xlYXIgZXZlcnl0aGluZyBvdXQuICBzcGVjaWFsIHNldHVwIGZvciB0aGlzIHRlc3QgY2FzZQotCQloaXN0b3J5LmRpc3Bvc2UoSU9wZXJhdGlvbkhpc3RvcnkuR0xPQkFMX1VORE9fQ09OVEVYVCwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotCQljb250ZXh0QSA9IG5ldyBPYmplY3RVbmRvQ29udGV4dCgiQSIpOwotCQljb250ZXh0QiA9IG5ldyBPYmplY3RVbmRvQ29udGV4dCgiQiIpOwotCQljb250ZXh0QyA9IG5ldyBPYmplY3RVbmRvQ29udGV4dCgiQyIpOwotCQljb250ZXh0VyA9IG5ldyBPYmplY3RVbmRvQ29udGV4dCgiVyIpOwotCQloaXN0b3J5LmFkZE9wZXJhdGlvbkFwcHJvdmVyKG5ldyBMaW5lYXJVbmRvRW5mb3JjZXIoKSk7Ci0JCQotCQkvLyBsb2NhbCBlZGl0cyBvbiBBLCBCLCBDIGFyZSBhZGRlZCBmaXJzdAotCQlJVW5kb2FibGVPcGVyYXRpb24gb3AgPSBuZXcgVGVzdE9wZXJhdGlvbigib3AxYSIpOwotCQlvcC5hZGRDb250ZXh0KGNvbnRleHRBKTsKLQkJaGlzdG9yeS5leGVjdXRlKG9wLCBudWxsLCBudWxsKTsKLQkJb3AgPSBuZXcgVGVzdE9wZXJhdGlvbigib3AxYiIpOwotCQlvcC5hZGRDb250ZXh0KGNvbnRleHRCKTsKLQkJaGlzdG9yeS5leGVjdXRlKG9wLCBudWxsLCBudWxsKTsKLQkJb3AgPSBuZXcgVGVzdE9wZXJhdGlvbigib3AxYyIpOwotCQlvcC5hZGRDb250ZXh0KGNvbnRleHRDKTsKLQkJaGlzdG9yeS5leGVjdXRlKG9wLCBudWxsLCBudWxsKTsKLQkJCi0JCS8vIG5vdyB3ZSBjcmVhdGUgdGhlICJyZWZhY3RvcmluZyBvcCIgd2hpY2ggdG91Y2hlcyB0aGVtIGFsbAotCQlvcCA9IG5ldyBUZXN0T3BlcmF0aW9uKCJSZWZhY3RvcmluZyIpOwotCQlvcC5hZGRDb250ZXh0KGNvbnRleHRXKTsKLQkJb3AuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJcmVmYWN0b3IgPSBuZXcgVHJpZ2dlcmVkT3BlcmF0aW9ucyhvcCwgaGlzdG9yeSk7Ci0JCWhpc3Rvcnkub3Blbk9wZXJhdGlvbihyZWZhY3RvciwgSU9wZXJhdGlvbkhpc3RvcnkuRVhFQ1VURSk7Ci0JCWxvY2FsQSA9IG5ldyBUZXN0T3BlcmF0aW9uKCJvcDJhIik7Ci0JCWxvY2FsQS5hZGRDb250ZXh0KGNvbnRleHRBKTsKLQkJaGlzdG9yeS5leGVjdXRlKGxvY2FsQSwgbnVsbCwgbnVsbCk7Ci0JCWxvY2FsQiA9IG5ldyBUZXN0T3BlcmF0aW9uKCJvcDJiIik7Ci0JCWxvY2FsQi5hZGRDb250ZXh0KGNvbnRleHRCKTsKLQkJaGlzdG9yeS5leGVjdXRlKGxvY2FsQiwgbnVsbCwgbnVsbCk7Ci0JCWxvY2FsQyA9IG5ldyBUZXN0T3BlcmF0aW9uKCJvcDJjIik7Ci0JCWxvY2FsQy5hZGRDb250ZXh0KGNvbnRleHRDKTsKLQkJaGlzdG9yeS5leGVjdXRlKGxvY2FsQywgbnVsbCwgbnVsbCk7Ci0JCQotCQkvLyBjbG9zZSBvZmYgdGhlIGNvbXBvc2l0ZQotCQloaXN0b3J5LmNsb3NlT3BlcmF0aW9uKHRydWUsIHRydWUsIElPcGVyYXRpb25IaXN0b3J5LkVYRUNVVEUpOwotCQkKLQkJLy8gc3Vic2VxdWVudCBsb2NhbCBlZGl0IHRvIEMKLQkJb3AgPSBuZXcgVGVzdE9wZXJhdGlvbigib3AzYyIpOwotCQlvcC5hZGRDb250ZXh0KGNvbnRleHRDKTsKLQkJaGlzdG9yeS5leGVjdXRlKG9wLCBudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDg3Njc1X3NwbGl0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXNldHVwODc2NzUoKTsKLQkJSVVuZG9hYmxlT3BlcmF0aW9uIG9wOwotCQkKLQkJLy8gY2hlY2sgc2V0dXAKLQkJb3AgPSBoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oY29udGV4dEEpOwotCQlhc3NlcnRUcnVlKCJSZWZhY3RvcmluZyBzaG91bGQgYmUgbmV4dCBvcCBmb3IgY29udGV4dCBBIiwgb3AgPT0gcmVmYWN0b3IpOwotCQlvcCA9IGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihjb250ZXh0Qik7Ci0JCWFzc2VydFRydWUoIlJlZmFjdG9yaW5nIHNob3VsZCBiZSBuZXh0IG9wIGZvciBjb250ZXh0IEIiLCBvcCA9PSByZWZhY3Rvcik7Ci0JCW9wID0gaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKGNvbnRleHRXKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVmYWN0b3Jpbmcgc2hvdWxkIGJlIG5leHQgb3AgZm9yIGNvbnRleHQgVyIsIG9wID09IHJlZmFjdG9yKTsKLQkJb3AgPSBoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oY29udGV4dEMpOwotCQlhc3NlcnRGYWxzZSgiUmVmYWN0b3Jpbmcgc2hvdWxkIG5vdCBiZSBuZXh0IG9wIGZvciBjb250ZXh0IEMiLCBvcCA9PSByZWZhY3Rvcik7Ci0KLQkJLy8gdHJ5IGEgYm9ndXMgdW5kbwotCQlJU3RhdHVzIHN0YXR1cyA9IGhpc3RvcnkudW5kbyhjb250ZXh0VywgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEZhbHNlKCJVbmRvIHNob3VsZCBub3QgYmUgcGVybWl0dGVkIGR1ZSB0byBsaW5lYXIgY29uZmxpY3QiLCBzdGF0dXMuaXNPSygpKTsKLQkJCi0JCS8vIHBydW5lIHRoZSBoaXN0b3J5IGZvciBjb250ZXh0VwotCQloaXN0b3J5LmRpc3Bvc2UoY29udGV4dFcsIHRydWUsIHRydWUsIGZhbHNlKTsKLQkJCi0JCS8vIHJlZmFjdG9yaW5nIG9wIHNob3VsZCBoYXZlIGJlZW4gYnJva2VuIHVwIGludG8gcGllY2VzCi0JCW9wID0gaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKGNvbnRleHRBKTsKLQkJYXNzZXJ0VHJ1ZSgiTG9jYWwgZWRpdCBBIHNob3VsZCBiZSBhdG9taWMiLCBvcCA9PSBsb2NhbEEpOwotCQlvcCA9IGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihjb250ZXh0Qik7Ci0JCWFzc2VydFRydWUoIkxvY2FsIGVkaXQgQiBzaG91bGQgYmUgYXRvbWljIiwgb3AgPT0gbG9jYWxCKTsKLQkJb3AgPSBoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oY29udGV4dEMpOwotCQlhc3NlcnRGYWxzZSgiTG9jYWwgZWRpdCBDIHNob3VsZCBub3QgYmUgcmVmYWN0b3JpbmcgZWRpdCIsIG9wID09IGxvY2FsQyk7Ci0JCQotCQkvLyBub3cgdGhlIHJlZmFjdG9yaW5nIEMgZWRpdCBzaG91bGQgYmUgdGhlIG5leHQgb25lCi0JCWhpc3RvcnkudW5kbyhjb250ZXh0QywgbnVsbCwgbnVsbCk7Ci0JCW9wID0gaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKGNvbnRleHRDKTsKLQkJYXNzZXJ0VHJ1ZSgiTG9jYWwgZWRpdCBDIHNob3VsZCBiZSByZWZhY3RvcmluZyBlZGl0Iiwgb3AgPT0gbG9jYWxDKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDg3Njc1X3VuZG9yZWRvKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXNldHVwODc2NzUoKTsKLQkJSVVuZG9hYmxlT3BlcmF0aW9uIG9wOwotCQkKLQkJLy8gdW5kbyB0aGUgbG9jYWwgZWRpdCB0byBDCi0JCWhpc3RvcnkudW5kbyhjb250ZXh0QywgbnVsbCwgbnVsbCk7Ci0JCQotCQkvLyB1bmRvIHRoZSByZWZhY3RvcmluZyBvcGVyYXRpb24gdmlhIGNvbnRleHQgQwotCQloaXN0b3J5LnVuZG8oY29udGV4dEMsIG51bGwsIG51bGwpOwotCQkKLQkJLy8gY2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gbmV3IG9wZXJhdGlvbnMgaW4gdGhlIHVuZG8gbGlzdCBmb3IgQSwgQiwgQwotCQlvcCA9IGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihjb250ZXh0Qyk7Ci0JCWFzc2VydFRydWUoIkxvY2FsIGVkaXQgQyBzaG91bGQgYmUgb3JpZ2luYWwgZWRpdCIsIG9wLmdldExhYmVsKCkuZXF1YWxzKCJvcDFjIikpOwotCi0JCW9wID0gaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKGNvbnRleHRCKTsKLQkJYXNzZXJ0VHJ1ZSgiTG9jYWwgZWRpdCBCIHNob3VsZCBiZSBvcmlnaW5hbCBlZGl0Iiwgb3AuZ2V0TGFiZWwoKS5lcXVhbHMoIm9wMWIiKSk7Ci0KLQkJb3AgPSBoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oY29udGV4dEEpOwotCQlhc3NlcnRUcnVlKCJMb2NhbCBlZGl0IEEgc2hvdWxkIGJlIG9yaWdpbmFsIGVkaXQiLCBvcC5nZXRMYWJlbCgpLmVxdWFscygib3AxYSIpKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCB0aGUgcmVkbyBvcGVyYXRpb24gaGFzIGFsbCBjb250ZXh0cwotCQlvcCA9IGhpc3RvcnkuZ2V0UmVkb09wZXJhdGlvbihjb250ZXh0Vyk7Ci0JCWFzc2VydFRydWUoIm9wZXJhdGlvbiBzaG91bGQgaGF2ZSBjb250ZXh0IEEiLCBvcC5oYXNDb250ZXh0KGNvbnRleHRBKSk7Ci0JCWFzc2VydFRydWUoIm9wZXJhdGlvbiBzaG91bGQgaGF2ZSBjb250ZXh0IEIiLCBvcC5oYXNDb250ZXh0KGNvbnRleHRCKSk7Ci0JCWFzc2VydFRydWUoIm9wZXJhdGlvbiBzaG91bGQgaGF2ZSBjb250ZXh0IEMiLCBvcC5oYXNDb250ZXh0KGNvbnRleHRDKSk7Ci0JCQotCQkvLyBub3cgcmVkbyB0aGUgb3BlcmF0aW9uCi0JCWhpc3RvcnkucmVkbyhjb250ZXh0QSwgbnVsbCwgbnVsbCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgdGhlIG5leHQgdW5kbyBpcyBvdXIgcmVmYWN0b3Jpbmcgb3BlcmF0aW9uCi0JCW9wID0gaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKElPcGVyYXRpb25IaXN0b3J5LkdMT0JBTF9VTkRPX0NPTlRFWFQpOwotCQlhc3NlcnRUcnVlKCJvcGVyYXRpb24gc2hvdWxkIGhhdmUgY29udGV4dCBXIiwgb3AuaGFzQ29udGV4dChjb250ZXh0VykpOwotCQkKLQkJLy8gdW5kbyBhZ2FpbiBhbmQgY2hlY2sgdGhhdCBubyBzaWRlIGVmZmVjdCBvcHMgd2VyZSBsZWZ0IG9uIHRoZSB1bmRvIHN0YWNrCi0JCWhpc3RvcnkudW5kbyhjb250ZXh0VywgbnVsbCwgbnVsbCk7Ci0KLQkJb3AgPSBoaXN0b3J5LmdldFVuZG9PcGVyYXRpb24oY29udGV4dEMpOwotCQlhc3NlcnRUcnVlKCJMb2NhbCBlZGl0IEMgc2hvdWxkIGJlIG9yaWdpbmFsIGVkaXQiLCBvcC5nZXRMYWJlbCgpLmVxdWFscygib3AxYyIpKTsKLQotCQlvcCA9IGhpc3RvcnkuZ2V0VW5kb09wZXJhdGlvbihjb250ZXh0Qik7Ci0JCWFzc2VydFRydWUoIkxvY2FsIGVkaXQgQiBzaG91bGQgYmUgb3JpZ2luYWwgZWRpdCIsIG9wLmdldExhYmVsKCkuZXF1YWxzKCJvcDFiIikpOwotCi0JCW9wID0gaGlzdG9yeS5nZXRVbmRvT3BlcmF0aW9uKGNvbnRleHRBKTsKLQkJYXNzZXJ0VHJ1ZSgiTG9jYWwgZWRpdCBBIHNob3VsZCBiZSBvcmlnaW5hbCBlZGl0Iiwgb3AuZ2V0TGFiZWwoKS5lcXVhbHMoIm9wMWEiKSk7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvb3BlcmF0aW9ucy9PcGVyYXRpb25zVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL29wZXJhdGlvbnMvT3BlcmF0aW9uc1Rlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGQwZjZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvb3BlcmF0aW9ucy9PcGVyYXRpb25zVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5vcGVyYXRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUZXN0cyBmb3IgdGhlIHBsYXRmb3JtIG9wZXJhdGlvbnMgc3VwcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvbnNUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHN1aXRlLiBUaGlzIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IE9wZXJhdGlvbnNUZXN0U3VpdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgdGhlIHRlc3Qgc3VpdGUuCi0JICovCi0JcHVibGljIE9wZXJhdGlvbnNUZXN0U3VpdGUoKSB7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShPcGVyYXRpb25zQVBJVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoV29ya2JlbmNoT3BlcmF0aW9uSGlzdG9yeVRlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShNdWx0aVRocmVhZGVkT3BlcmF0aW9uc1Rlc3RzLmNsYXNzKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9vcGVyYXRpb25zL1Rlc3RPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvb3BlcmF0aW9ucy9UZXN0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNmVjNzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9vcGVyYXRpb25zL1Rlc3RPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLS8qKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgVGVzdE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIHsKLQotCXByaXZhdGUgaW50IGZFeGVjdXRpb25Db3VudCA9IDA7Ci0KLQlUZXN0T3BlcmF0aW9uKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVkbygpIHsKLQkJcmV0dXJuIGZFeGVjdXRpb25Db3VudCA9PSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBmRXhlY3V0aW9uQ291bnQgPiAwOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIHVpSW5mbykgewotCQlmRXhlY3V0aW9uQ291bnQrKzsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIHVpSW5mbykgewotCQlyZXR1cm4gZXhlY3V0ZShtb25pdG9yLCB1aUluZm8pOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIHVpSW5mbykgewotCQlmRXhlY3V0aW9uQ291bnQtLTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZFeGVjdXRpb25Db3VudCA9IDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL29wZXJhdGlvbnMvVW5yZWRvYWJsZVRlc3RPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvb3BlcmF0aW9ucy9VbnJlZG9hYmxlVGVzdE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDcyZDNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvb3BlcmF0aW9ucy9VbnJlZG9hYmxlVGVzdE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLm9wZXJhdGlvbnM7Ci0KLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBVbnJlZG9hYmxlVGVzdE9wZXJhdGlvbiBleHRlbmRzIFRlc3RPcGVyYXRpb24gewotCVVucmVkb2FibGVUZXN0T3BlcmF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCWJvb2xlYW4gZGlzcG9zZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SZWRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc3Bvc2VkID0gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvb3BlcmF0aW9ucy9Xb3JrYmVuY2hPcGVyYXRpb25IaXN0b3J5VGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvb3BlcmF0aW9ucy9Xb3JrYmVuY2hPcGVyYXRpb25IaXN0b3J5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg3ODI1MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL29wZXJhdGlvbnMvV29ya2JlbmNoT3BlcmF0aW9uSGlzdG9yeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGlzdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT2JqZWN0VW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgdGhlIE9wZXJhdGlvbnMgRnJhbWV3b3JrIEFQSS4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoT3BlcmF0aW9uSGlzdG9yeVRlc3RzIGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0JSVVuZG9Db250ZXh0IGNvbnRleHQsIGNvbnRleHRBLCBjb250ZXh0QjsKLQotCUlPcGVyYXRpb25IaXN0b3J5IGhpc3Rvcnk7Ci0KLQlJVW5kb2FibGVPcGVyYXRpb24gb3AxLCBvcDIsIG9wMywgb3A0LCBvcDUsIG9wNjsKLQotCS8qKgotCSAqIEBwYXJhbSB0ZXN0TmFtZQotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hPcGVyYXRpb25IaXN0b3J5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQloaXN0b3J5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRPcGVyYXRpb25TdXBwb3J0KCkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpOwotCQljb250ZXh0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRPcGVyYXRpb25TdXBwb3J0KCkuZ2V0VW5kb0NvbnRleHQoKTsKLQkJY29udGV4dEEgPSBuZXcgT2JqZWN0VW5kb0NvbnRleHQoIkEiKTsKLQkJY29udGV4dEIgPSBuZXcgT2JqZWN0VW5kb0NvbnRleHQoIkIiKTsKLQkJb3AxID0gbmV3IFRlc3RPcGVyYXRpb24oIm9wMSIpOwotCQlvcDEuYWRkQ29udGV4dChjb250ZXh0KTsKLQkJb3AyID0gbmV3IFRlc3RPcGVyYXRpb24oIm9wMiIpOwotCQlvcDIuYWRkQ29udGV4dChjb250ZXh0KTsKLQkJb3AyLmFkZENvbnRleHQoY29udGV4dEEpOwotCQlvcDMgPSBuZXcgVGVzdE9wZXJhdGlvbigib3AzIik7Ci0JCW9wMy5hZGRDb250ZXh0KGNvbnRleHRCKTsKLQkJb3A0ID0gbmV3IFRlc3RPcGVyYXRpb24oIm9wNCIpOwotCQlvcDQuYWRkQ29udGV4dChjb250ZXh0KTsKLQkJb3A1ID0gbmV3IFRlc3RPcGVyYXRpb24oIm9wNSIpOwotCQlvcDUuYWRkQ29udGV4dChjb250ZXh0QSk7Ci0JCW9wNiA9IG5ldyBUZXN0T3BlcmF0aW9uKCJvcDYiKTsKLQkJb3A2LmFkZENvbnRleHQoY29udGV4dCk7Ci0JCW9wNi5hZGRDb250ZXh0KGNvbnRleHRCKTsKLQkJaGlzdG9yeS5leGVjdXRlKG9wMSwgbnVsbCwgbnVsbCk7Ci0JCWhpc3RvcnkuZXhlY3V0ZShvcDIsIG51bGwsIG51bGwpOwotCQloaXN0b3J5LmV4ZWN1dGUob3AzLCBudWxsLCBudWxsKTsKLQkJaGlzdG9yeS5leGVjdXRlKG9wNCwgbnVsbCwgbnVsbCk7Ci0JCWhpc3RvcnkuZXhlY3V0ZShvcDUsIG51bGwsIG51bGwpOwotCQloaXN0b3J5LmV4ZWN1dGUob3A2LCBudWxsLCBudWxsKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaGlzdG9yeS5kaXNwb3NlKElPcGVyYXRpb25IaXN0b3J5LkdMT0JBTF9VTkRPX0NPTlRFWFQsIHRydWUsIHRydWUsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0V29ya3NwYWNlQWRhcHRlcigpIHsKLQkJSVVuZG9Db250ZXh0IHdvcmtzcGFjZUNvbnRleHQgPSAoSVVuZG9Db250ZXh0KVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRBZGFwdGVyKElVbmRvQ29udGV4dC5jbGFzcyk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBoYXZlIGNvbnRleHQgcmVnaXN0ZXJlZCBvbiB3b3Jrc3BhY2UiLCB3b3Jrc3BhY2VDb250ZXh0ID09IGNvbnRleHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hpbmdDb250ZXh0KCkgewotCQlJVW5kb0NvbnRleHQgbmV3Q29udGV4dCA9IG5ldyBJVW5kb0NvbnRleHQoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeyByZXR1cm4gIk1hdGNoaW5nIFRlc3QgQ29udGV4dCI7IH0KLQkJCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoSVVuZG9Db250ZXh0IG90aGVyQ29udGV4dCkgeyByZXR1cm4gZmFsc2U7IH0KLQkJfTsKLQkJYXNzZXJ0RmFsc2UobmV3Q29udGV4dC5tYXRjaGVzKGNvbnRleHQpKTsKLQkJKChPYmplY3RVbmRvQ29udGV4dCljb250ZXh0KS5hZGRNYXRjaChuZXdDb250ZXh0KTsKLQkJYXNzZXJ0VHJ1ZShoaXN0b3J5LmdldFVuZG9IaXN0b3J5KGNvbnRleHQpLmxlbmd0aCA9PSBoaXN0b3J5LmdldFVuZG9IaXN0b3J5KG5ld0NvbnRleHQpLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUob3AxLmhhc0NvbnRleHQobmV3Q29udGV4dCkpOwotCQlhc3NlcnRGYWxzZShvcDMuaGFzQ29udGV4dChjb250ZXh0KSk7Ci0JCW9wMy5hZGRDb250ZXh0KG5ld0NvbnRleHQpOwotCQlhc3NlcnRUcnVlKG9wMy5oYXNDb250ZXh0KGNvbnRleHQpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3ByZWZlcmVuY2VzL0RlcHJlY2F0ZWRGb250UHJlZmVyZW5jZVRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3ByZWZlcmVuY2VzL0RlcHJlY2F0ZWRGb250UHJlZmVyZW5jZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMGExMmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcmVmZXJlbmNlcy9EZXByZWNhdGVkRm9udFByZWZlcmVuY2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkZvbnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi0vKioKLSAqIFRoZSBGb250UHJlZmVyZW5jZVRlc3RDYXNlIHRlc3RzIGFkZGluZyBmb250cyB0bwotICogdGhlIHByZWZlcmVuY2Ugc3RvcmUgYW5kIHdoYXQgb2NjdXJzIGlmIHRoZSB2YWx1ZXMKLSAqIGFyZSBib2d1cwotICovCi0KLXB1YmxpYyBjbGFzcyBEZXByZWNhdGVkRm9udFByZWZlcmVuY2VUZXN0Q2FzZSBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgcHVibGljIFN0cmluZyBCQURfRk9OVF9ERUZJTklUSU9OID0gIkJhZEZvbnQtcmVndWxhci0xMCI7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIFRFU1RfRk9OVF9JRCA9ICJvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5wcmVmZXJlbmNlLnRlc3Rmb250IjsKLQotICAgIHB1YmxpYyBTdHJpbmcgTUlTU0lOR19GT05UX0lEID0gIm9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnByZWZlcmVuY2UubWlzc2luZ2ZvbnQiOwotCi0gICAgcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBGb250UHJlZmVyZW5jZVRlc3RDYXNlLgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBEZXByZWNhdGVkRm9udFByZWZlcmVuY2VUZXN0Q2FzZShTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICBBYnN0cmFjdFVJUGx1Z2luIHBsdWdpbiA9IChBYnN0cmFjdFVJUGx1Z2luKSBQbGF0Zm9ybQotICAgICAgICAgICAgICAgIC5nZXRQbHVnaW4oUGxhdGZvcm1VSS5QTFVHSU5fSUQpOwotICAgICAgICBwcmVmZXJlbmNlU3RvcmUgPSBwbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICAgICAgLy9TZXQgdXAgdGhlIGJvZ3VzIGVudHJ5IGZvciB0aGUgYmFkIGZpcnN0IHRlc3QKLSAgICAgICAgRm9udERhdGEgYm9ndXNEYXRhID0gbmV3IEZvbnREYXRhKCk7Ci0gICAgICAgIGJvZ3VzRGF0YS5zZXROYW1lKCJCYWREYXRhIik7Ci0gICAgICAgIGJvZ3VzRGF0YS5zZXRIZWlnaHQoMTEpOwotICAgICAgICBGb250RGF0YVtdIHN0b3JlZFZhbHVlID0gbmV3IEZvbnREYXRhWzJdOwotCi0gICAgICAgIC8vV2UgYXNzdW1lIGhlcmUgdGhhdCB0aGUgdGV4dCBmb250IGlzIE9LCi0gICAgICAgIHN0b3JlZFZhbHVlWzBdID0gYm9ndXNEYXRhOwotICAgICAgICBzdG9yZWRWYWx1ZVsxXSA9IChQcmVmZXJlbmNlQ29udmVydGVyLmdldERlZmF1bHRGb250RGF0YUFycmF5KAotICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTdG9yZSwgSkZhY2VSZXNvdXJjZXMuVEVYVF9GT05UKSlbMF07Ci0gICAgICAgIFByZWZlcmVuY2VDb252ZXJ0ZXIKLSAgICAgICAgICAgICAgICAuc2V0VmFsdWUocHJlZmVyZW5jZVN0b3JlLCBURVNUX0ZPTlRfSUQsIHN0b3JlZFZhbHVlKTsKLSAgICAgICAgUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHByZWZlcmVuY2VTdG9yZSwgVEVTVF9GT05UX0lELAotICAgICAgICAgICAgICAgIHN0b3JlZFZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBhIHZhbGlkIGZvbnQgbGlrZSB0aGUgdGVzdCBmb250LiBUaGUgZmlyc3QgZ29vZCBvbmUKLSAgICAgKiB3ZSBzaG91bGQgZmluZCBzaG91bGQgYmUgdGhlIGZpcnN0IG9uZSBpbiB0aGUgbGlzdC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHb29kRm9udERlZmluaXRpb24oKSB7Ci0KLSAgICAgICAgRm9udFJlZ2lzdHJ5IGZvbnRSZWdpc3RyeSA9IEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpOwotICAgICAgICBGb250RGF0YVtdIGN1cnJlbnRUZXh0Rm9udHMgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhQXJyYXkoCi0gICAgICAgICAgICAgICAgcHJlZmVyZW5jZVN0b3JlLCBKRmFjZVJlc291cmNlcy5URVhUX0ZPTlQpOwotICAgICAgICBGb250RGF0YSBiZXN0Rm9udCA9IGZvbnRSZWdpc3RyeS5maWx0ZXJEYXRhKGN1cnJlbnRUZXh0Rm9udHMsIERpc3BsYXkKLSAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudCgpKVswXTsKLQotICAgICAgICAvL0Fzc2VydCB0aGF0IGl0IGlzIHRoZSBmaXJzdCBmb250IHRoYXQgd2UgZ2V0IGFzIHRoZQotICAgICAgICAvL3ZhbGlkIG9uZQotICAgICAgICBhc3NlcnRFcXVhbHMoYmVzdEZvbnQuZ2V0TmFtZSgpLCBjdXJyZW50VGV4dEZvbnRzWzBdLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhiZXN0Rm9udC5nZXRIZWlnaHQoKSwgY3VycmVudFRleHRGb250c1swXS5nZXRIZWlnaHQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IGlmIHRoZSBmaXJzdCBmb250IGluIHRoZSBsaXN0IGlzIGJhZCB0aGF0IHRoZSAKLSAgICAgKiBzZWNvbmQgb25lIGNvbWVzIGJhY2sgYXMgdmFsaWQuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkRmlyc3RGb250RGVmaW5pdGlvbigpIHsKLQotICAgICAgICBGb250UmVnaXN0cnkgZm9udFJlZ2lzdHJ5ID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCk7Ci0gICAgICAgIEZvbnREYXRhW10gY3VycmVudFRlc3RGb250cyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGFBcnJheSgKLSAgICAgICAgICAgICAgICBwcmVmZXJlbmNlU3RvcmUsIFRFU1RfRk9OVF9JRCk7Ci0gICAgICAgIEZvbnREYXRhIGJlc3RGb250ID0gZm9udFJlZ2lzdHJ5LmZpbHRlckRhdGEoY3VycmVudFRlc3RGb250cywgRGlzcGxheQotICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50KCkpWzBdOwotCi0gICAgICAgIC8vQXNzZXJ0IHRoYXQgaXQgaXMgdGhlIHNlY29uZCBmb250IHRoYXQgd2UgZ2V0IGFzIHRoZQotICAgICAgICAvL3ZhbGlkIG9uZQotICAgICAgICBhc3NlcnRFcXVhbHMoYmVzdEZvbnQuZ2V0TmFtZSgpLCBjdXJyZW50VGVzdEZvbnRzWzFdLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhiZXN0Rm9udC5nZXRIZWlnaHQoKSwgY3VycmVudFRlc3RGb250c1sxXS5nZXRIZWlnaHQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHRoZSBubyB2YWxpZCBmb250IGlzIHJldHVybmVkIHdoZW4gdGhlIGVudHJ5Ci0gICAgICogaXMgbWlzc2luZy4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0ZvbnREZWZpbml0aW9uKCkgewotCi0gICAgICAgIEZvbnRSZWdpc3RyeSBmb250UmVnaXN0cnkgPSBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKTsKLSAgICAgICAgRm9udERhdGFbXSBjdXJyZW50VGVzdEZvbnRzID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YUFycmF5KAotICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTdG9yZSwgTUlTU0lOR19GT05UX0lEKTsKLSAgICAgICAgRm9udERhdGEgYmVzdEZvbnQgPSBmb250UmVnaXN0cnkuZmlsdGVyRGF0YShjdXJyZW50VGVzdEZvbnRzLCBEaXNwbGF5Ci0gICAgICAgICAgICAgICAgLmdldEN1cnJlbnQoKSlbMF07Ci0KLSAgICAgICAgRm9udERhdGFbXSBzeXN0ZW1Gb250RGF0YSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUZvbnQoKQotICAgICAgICAgICAgICAgIC5nZXRGb250RGF0YSgpOwotCi0gICAgICAgIC8vQXNzZXJ0IHRoYXQgdGhlIGZpcnN0IGZvbnQgaXMgdGhlIHN5c3RlbSBmb250Ci0gICAgICAgIGFzc2VydEVxdWFscyhiZXN0Rm9udC5nZXROYW1lKCksIHN5c3RlbUZvbnREYXRhWzBdLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhiZXN0Rm9udC5nZXRIZWlnaHQoKSwgc3lzdGVtRm9udERhdGFbMF0uZ2V0SGVpZ2h0KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcHJlZmVyZW5jZXMvRm9udFByZWZlcmVuY2VUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcmVmZXJlbmNlcy9Gb250UHJlZmVyZW5jZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMjk3MWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcmVmZXJlbmNlcy9Gb250UHJlZmVyZW5jZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuRm9udFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGhlIEZvbnRQcmVmZXJlbmNlVGVzdENhc2UgdGVzdHMgYWRkaW5nIGZvbnRzIHRvCi0gKiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhbmQgd2hhdCBvY2N1cnMgaWYgdGhlIHZhbHVlcwotICogYXJlIGJvZ3VzCi0gKi8KLQotcHVibGljIGNsYXNzIEZvbnRQcmVmZXJlbmNlVGVzdENhc2UgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBTdHJpbmcgQkFEX0ZPTlRfREVGSU5JVElPTiA9ICJCYWRGb250LXJlZ3VsYXItMTAiOwotCi0gICAgcHVibGljIFN0cmluZyBURVNUX0ZPTlRfSUQgPSAib3JnLmVjbGlwc2UuamZhY2UudGVzdHMucHJlZmVyZW5jZS50ZXN0Zm9udCI7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIE1JU1NJTkdfRk9OVF9JRCA9ICJvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5wcmVmZXJlbmNlLm1pc3Npbmdmb250IjsKLQotICAgIHByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRm9udFByZWZlcmVuY2VUZXN0Q2FzZS4KLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgRm9udFByZWZlcmVuY2VUZXN0Q2FzZShTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICBBYnN0cmFjdFVJUGx1Z2luIHBsdWdpbiA9IChBYnN0cmFjdFVJUGx1Z2luKSBQbGF0Zm9ybQotICAgICAgICAgICAgICAgIC5nZXRQbHVnaW4oUGxhdGZvcm1VSS5QTFVHSU5fSUQpOwotICAgICAgICBwcmVmZXJlbmNlU3RvcmUgPSBwbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICAgICAgLy9TZXQgdXAgdGhlIGJvZ3VzIGVudHJ5IGZvciB0aGUgYmFkIGZpcnN0IHRlc3QKLSAgICAgICAgRm9udERhdGEgYm9ndXNEYXRhID0gbmV3IEZvbnREYXRhKCk7Ci0gICAgICAgIGJvZ3VzRGF0YS5zZXROYW1lKCJCYWREYXRhIik7Ci0gICAgICAgIGJvZ3VzRGF0YS5zZXRIZWlnaHQoMTEpOwotICAgICAgICBGb250RGF0YVtdIHN0b3JlZFZhbHVlID0gbmV3IEZvbnREYXRhWzJdOwotCi0gICAgICAgIC8vV2UgYXNzdW1lIGhlcmUgdGhhdCB0aGUgdGV4dCBmb250IGlzIE9LCi0gICAgICAgIHN0b3JlZFZhbHVlWzBdID0gYm9ndXNEYXRhOwotICAgICAgICBzdG9yZWRWYWx1ZVsxXSA9IChQcmVmZXJlbmNlQ29udmVydGVyLmdldERlZmF1bHRGb250RGF0YUFycmF5KAotICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTdG9yZSwgSkZhY2VSZXNvdXJjZXMuVEVYVF9GT05UKSlbMF07Ci0gICAgICAgIFByZWZlcmVuY2VDb252ZXJ0ZXIKLSAgICAgICAgICAgICAgICAuc2V0VmFsdWUocHJlZmVyZW5jZVN0b3JlLCBURVNUX0ZPTlRfSUQsIHN0b3JlZFZhbHVlKTsKLSAgICAgICAgUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHByZWZlcmVuY2VTdG9yZSwgVEVTVF9GT05UX0lELAotICAgICAgICAgICAgICAgIHN0b3JlZFZhbHVlKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIGEgdmFsaWQgZm9udCBsaWtlIHRoZSB0ZXN0IGZvbnQuIFRoZSBmaXJzdCBnb29kIG9uZQotICAgICAqIHdlIHNob3VsZCBmaW5kIHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lIGluIHRoZSBsaXN0LgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdEdvb2RGb250RGVmaW5pdGlvbigpIHsKLQotICAgICAgICBGb250UmVnaXN0cnkgZm9udFJlZ2lzdHJ5ID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCk7Ci0gICAgICAgIEZvbnREYXRhW10gY3VycmVudFRleHRGb250cyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGFBcnJheSgKLSAgICAgICAgICAgICAgICBwcmVmZXJlbmNlU3RvcmUsIEpGYWNlUmVzb3VyY2VzLlRFWFRfRk9OVCk7Ci0gICAgICAgIEZvbnREYXRhW10gYmVzdEZvbnQgPSBmb250UmVnaXN0cnkuYmVzdERhdGFBcnJheShjdXJyZW50VGV4dEZvbnRzLAotICAgICAgICAgICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQotICAgICAgICAvL0Fzc2VydCB0aGF0IGl0IGlzIHRoZSBmaXJzdCBmb250IHRoYXQgd2UgZ2V0IGFzIHRoZQotICAgICAgICAvL3ZhbGlkIG9uZQotICAgICAgICBhc3NlcnRFcXVhbHMoYmVzdEZvbnRbMF0uZ2V0TmFtZSgpLCBjdXJyZW50VGV4dEZvbnRzWzBdLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhiZXN0Rm9udFswXS5nZXRIZWlnaHQoKSwgY3VycmVudFRleHRGb250c1swXS5nZXRIZWlnaHQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IGlmIHRoZSBmaXJzdCBmb250IGluIHRoZSBsaXN0IGlzIGJhZCB0aGF0IHRoZSAKLSAgICAgKiBzZWNvbmQgb25lIGNvbWVzIGJhY2sgYXMgdmFsaWQuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkRmlyc3RGb250RGVmaW5pdGlvbigpIHsKLQotICAgICAgICBGb250UmVnaXN0cnkgZm9udFJlZ2lzdHJ5ID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCk7Ci0gICAgICAgIEZvbnREYXRhW10gY3VycmVudFRlc3RGb250cyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGFBcnJheSgKLSAgICAgICAgICAgICAgICBwcmVmZXJlbmNlU3RvcmUsIFRFU1RfRk9OVF9JRCk7Ci0gICAgICAgIEZvbnREYXRhW10gYmVzdEZvbnQgPSBmb250UmVnaXN0cnkuZmlsdGVyRGF0YShjdXJyZW50VGVzdEZvbnRzLAotICAgICAgICAgICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQotICAgICAgICAvL0Fzc2VydCB0aGF0IGl0IGlzIHRoZSBzZWNvbmQgZm9udCB0aGF0IHdlIGdldCBhcyB0aGUKLSAgICAgICAgLy92YWxpZCBvbmUKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJlc3RGb250WzBdLmdldE5hbWUoKSwgY3VycmVudFRlc3RGb250c1sxXS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYmVzdEZvbnRbMF0uZ2V0SGVpZ2h0KCksIGN1cnJlbnRUZXN0Rm9udHNbMV0uZ2V0SGVpZ2h0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCB0aGUgbm8gdmFsaWQgZm9udCBpcyByZXR1cm5lZCB3aGVuIHRoZSBlbnRyeQotICAgICAqIGlzIG1pc3NpbmcuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Gb250RGVmaW5pdGlvbigpIHsKLQotICAgICAgICBGb250UmVnaXN0cnkgZm9udFJlZ2lzdHJ5ID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCk7Ci0gICAgICAgIEZvbnREYXRhW10gY3VycmVudFRlc3RGb250cyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGFBcnJheSgKLSAgICAgICAgICAgICAgICBwcmVmZXJlbmNlU3RvcmUsIE1JU1NJTkdfRk9OVF9JRCk7Ci0gICAgICAgIEZvbnREYXRhW10gYmVzdEZvbnQgPSBmb250UmVnaXN0cnkuZmlsdGVyRGF0YShjdXJyZW50VGVzdEZvbnRzLAotICAgICAgICAgICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQotICAgICAgICBGb250RGF0YVtdIHN5c3RlbUZvbnREYXRhID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtRm9udCgpCi0gICAgICAgICAgICAgICAgLmdldEZvbnREYXRhKCk7Ci0KLSAgICAgICAgLy9Bc3NlcnQgdGhhdCB0aGUgZmlyc3QgZm9udCBpcyB0aGUgc3lzdGVtIGZvbnQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJlc3RGb250WzBdLmdldE5hbWUoKSwgc3lzdGVtRm9udERhdGFbMF0uZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJlc3RGb250WzBdLmdldEhlaWdodCgpLCBzeXN0ZW1Gb250RGF0YVswXS5nZXRIZWlnaHQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlc1Rlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlc1Rlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk3NzE0Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VzVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRlc3Qgc3VpdGUgZm9yIHByZWZlcmVuY2VzLgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXNUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VpdGUuICBUaGlzIGlzIHJlcXVpcmVkIHRvCi0gICAgICogdXNlIHRoZSBKVW5pdCBMYXVuY2hlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZmVyZW5jZXNUZXN0U3VpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIHRlc3Qgc3VpdGUuCi0gICAgICovCi0gICAgcHVibGljIFByZWZlcmVuY2VzVGVzdFN1aXRlKCkgewotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoRm9udFByZWZlcmVuY2VUZXN0Q2FzZS5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoRGVwcmVjYXRlZEZvbnRQcmVmZXJlbmNlVGVzdENhc2UuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFNjb3BlZFByZWZlcmVuY2VTdG9yZVRlc3RDYXNlLmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShXb3JraW5nQ29weVByZWZlcmVuY2VzVGVzdENhc2UuY2xhc3MpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3ByZWZlcmVuY2VzL1Njb3BlZFByZWZlcmVuY2VTdG9yZVRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3ByZWZlcmVuY2VzL1Njb3BlZFByZWZlcmVuY2VTdG9yZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTgyMzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcmVmZXJlbmNlcy9TY29wZWRQcmVmZXJlbmNlU3RvcmVUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuU2NvcGVkUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU2NvcGVkUHJlZmVyZW5jZVN0b3JlVGVzdENhc2UgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotCWZpbmFsIFN0cmluZyBERUZBVUxUX0RFRkFVTFRfU1RSSU5HID0gIiI7Ci0KLQlwdWJsaWMgU2NvcGVkUHJlZmVyZW5jZVN0b3JlVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lZWRzU2F2aW5nKCkgewotCQlJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgSW5zdGFuY2VTY29wZSgpOwotCQlTdHJpbmcgcXVhbGlmaWVyID0gIm9yZy5lY2xpcHNlLnVpLnRlc3RzLnByZWZlcmVuY2VzIjsKLQkJU2NvcGVkUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gbmV3IFNjb3BlZFByZWZlcmVuY2VTdG9yZShjb250ZXh0LAotCQkJCXF1YWxpZmllcik7Ci0JCVN0cmluZyBrZXkgPSAia2V5MSI7Ci0JCVN0cmluZyB2YWx1ZSA9ICJ2YWx1ZTEiOwotCi0JCS8vIG5vdGhpbmcgdGhlcmUKLQkJYXNzZXJ0RmFsc2UoIjAuMSIsIHN0b3JlLm5lZWRzU2F2aW5nKCkpOwotCQlhc3NlcnRGYWxzZSgiMC4yIiwgc3RvcmUuY29udGFpbnMoa2V5KSk7Ci0JCWFzc2VydEVxdWFscygiMC4zIiwgREVGQVVMVF9ERUZBVUxUX1NUUklORywgc3RvcmUuZ2V0U3RyaW5nKGtleSkpOwotCi0JCS8vIHNldCB0aGUgdmFsdWUKLQkJc3RvcmUuc2V0VmFsdWUoa2V5LCB2YWx1ZSk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHN0b3JlLm5lZWRzU2F2aW5nKCkpOwotCQlhc3NlcnRUcnVlKCIxLjEiLCBzdG9yZS5jb250YWlucyhrZXkpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCB2YWx1ZSwgc3RvcmUuZ2V0U3RyaW5nKGtleSkpOwotCi0JCS8vIGZsdXNoCi0JCXRyeSB7Ci0JCQlzdG9yZS5zYXZlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjIuOTkiLCBlKTsKLQkJfQotCi0JCS8vIGRvIHRoZSB0ZXN0Ci0JCWFzc2VydEZhbHNlKCIzLjAiLCBzdG9yZS5uZWVkc1NhdmluZygpKTsKLQotCQkvLyBjaGFuZ2UgdGhlIG5vZGUgb3V0c2lkZSBvZiB0aGUgc2NvcGVkIHN0b3JlCi0JCVN0cmluZyBrZXkyID0gImtleTIiOwotCQlTdHJpbmcgdmFsdWUyID0gInZhbHVlMiI7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IGNvbnRleHQuZ2V0Tm9kZShxdWFsaWZpZXIpOwotCQlub2RlLnB1dChrZXkyLCB2YWx1ZTIpOwotCQlhc3NlcnRFcXVhbHMoIjQuMCIsIHZhbHVlMiwgbm9kZS5nZXQoa2V5MiwgbnVsbCkpOwotCQlhc3NlcnRGYWxzZSgiNC4xIiwgc3RvcmUubmVlZHNTYXZpbmcoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcmVmZXJlbmNlcy9Xb3JraW5nQ29weVByZWZlcmVuY2VzVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcHJlZmVyZW5jZXMvV29ya2luZ0NvcHlQcmVmZXJlbmNlc1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MDMzNDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcmVmZXJlbmNlcy9Xb3JraW5nQ29weVByZWZlcmVuY2VzVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuV29ya2luZ0NvcHlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgV29ya2luZ0NvcHlQcmVmZXJlbmNlc1Rlc3RDYXNlIGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgV29ya2luZ0NvcHlQcmVmZXJlbmNlc1Rlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qCi0JICogU2VlIGJ1ZyA5NDkyNiAtIFdvcmtpbmdDb3B5UHJlZmVyZW5jZXMucmVtb3ZlKGtleSkgbm90IHdvcmtpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlS2V5KCkgewotCi0JCS8vIHNldCB0aGUgdmFsdWUgaW4gdGhlIHJlYWwgbm9kZQotCQlTdHJpbmcga2V5ID0gImtleSI7Ci0JCVN0cmluZyB2YWx1ZSA9ICJ2YWx1ZSI7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgZU5vZGUgPSBuZXcgSW5zdGFuY2VTY29wZSgpLmdldE5vZGUoIndvcmtpbmcuY29weS50ZXN0cy50ZXN0UmVtb3ZlS2V5Iik7Ci0JCWVOb2RlLnB1dChrZXksIHZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCB2YWx1ZSwgZU5vZGUuZ2V0KGtleSwgbnVsbCkpOwotCi0JCS8vIGNyZWF0ZSBhIHdvcmtpbmcgY29weQotCQlXb3JraW5nQ29weU1hbmFnZXIgbWFuYWdlciA9IG5ldyBXb3JraW5nQ29weU1hbmFnZXIoKTsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcyA9IG1hbmFnZXIuZ2V0V29ya2luZ0NvcHkoZU5vZGUpOwotCQlwcmVmcy5yZW1vdmUoa2V5KTsKLQotCQkvLyBhcHBseSB0aGUgY2hhbmdlcwotCQl0cnkgewotCQkJbWFuYWdlci5hcHBseUNoYW5nZXMoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjIuOTkiLCBlKTsKLQkJfQotCi0JCS8vIHNlZSBpZiBvdXIgY2hhbmdlIHdhcyBhcHBsaWVkCi0JCWFzc2VydE51bGwoIjMuMCIsIGVOb2RlLmdldChrZXksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTm9kZSgpIHsKLQkJLy8gc2V0IHRoZSB2YWx1ZSBpbiB0aGUgcmVhbCBub2RlCi0JCVN0cmluZyBrZXkgPSAia2V5IjsKLQkJU3RyaW5nIHZhbHVlID0gInZhbHVlIjsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBlTm9kZSA9IG5ldyBJbnN0YW5jZVNjb3BlKCkuZ2V0Tm9kZSgid29ya2luZy5jb3B5LnRlc3RzLnRlc3RSZW1vdmVLZXkiKTsKLQkJZU5vZGUucHV0KGtleSwgdmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIHZhbHVlLCBlTm9kZS5nZXQoa2V5LCBudWxsKSk7Ci0KLQkJLy8gY3JlYXRlIGEgd29ya2luZyBjb3B5Ci0JCVdvcmtpbmdDb3B5TWFuYWdlciBtYW5hZ2VyID0gbmV3IFdvcmtpbmdDb3B5TWFuYWdlcigpOwotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gbWFuYWdlci5nZXRXb3JraW5nQ29weShlTm9kZSk7Ci0JCQotCQkvLyByZW1vdmUgdGhlIG5vZGUKLQkJdHJ5IHsKLQkJCXByZWZzLnJlbW92ZU5vZGUoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjIuOTkiLCBlKTsKLQkJfQotCi0JCS8vIGFwcGx5IHRoZSBjaGFuZ2VzCi0JCXRyeSB7Ci0JCQltYW5hZ2VyLmFwcGx5Q2hhbmdlcygpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMy45OSIsIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcmVzZW50YXRpb25zL0J1ZzQ4NTg5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcmVzZW50YXRpb25zL0J1ZzQ4NTg5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODc3MjVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcHJlc2VudGF0aW9ucy9CdWc0ODU4OVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnByZXNlbnRhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLkVkaXRvclNhc2hDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuVUlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0IGZvciBCdWcgNDg1ODkuIFRoaXMgdmVyaWZpZXMgdGhhdCB0aGUgZWRpdG9yIHRhYnMgZXNjYXBlIHRoZSAiJiIKLSAqIGNoYXJhY3RlciBjb3JyZWN0bHkuIFRoaXMgY3JlYXRlcyBhIHRlc3QgcHJvamVjdCwgYW5kIGNyZWF0ZXMgYSBmaWxlIHdpdGhpbgotICogaXRzIHdob3NlIG5hbWUgY29udGFpbnMgYW4gYW1wZXJzYW5kLiBJdCB0aGVuIHJldHJpZXZlcyB0aGUgdGV4dCBvZiB0aGUgdGFiCi0gKiBpdGVtIGFuZCBjaGVja3MgdG8gc2VlIHRoYXQgaXQgaXMgYXBwcm9wcmlhdGUuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJ1ZzQ4NTg5VGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHRlc3QgY2FzZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIEJ1ZzQ4NTg5VGVzdChmaW5hbCBTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIEJ1ZyA0ODU4OS4gVGhpcyB2ZXJpZmllcyB0aGF0IHRoZSBlZGl0b3IgdGFicyBlc2NhcGUgdGhlICImIgotICAgICAqIGNoYXJhY3RlciBjb3JyZWN0bHkuIFRoaXMgY3JlYXRlcyBhIHRlc3QgcHJvamVjdCwgYW5kIGNyZWF0ZXMgYSBmaWxlCi0gICAgICogd2l0aGluIGl0cyB3aG9zZSBuYW1lIGNvbnRhaW5zIGFuIGFtcGVyc2FuZC4gSXQgdGhlbiByZXRyaWV2ZXMgdGhlIHRleHQKLSAgICAgKiBvZiB0aGUgdGFiIGl0ZW0gYW5kIGNoZWNrcyB0byBzZWUgdGhhdCBpdCBpcyBhcHByb3ByaWF0ZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcHJvamVjdCBjYW5ub3QgYmUgY3JlYXRlZCBvciBvcGVuZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVOYW1lV2l0aEFtcGVyc2FuZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gT3BlbiBhIG5ldyB0ZXN0IHdpbmRvdy4KLSAgICAgICAgZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotCi0gICAgICAgIC8vIE9wZW4gYSBuZXcgcHJvamVjdCwgd2l0aCBhIHRleHQgZmlsZS4KLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHRlc3RQcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotICAgICAgICAgICAgICAgICJCdWcgNDg1ODkgUHJvamVjdCIpOwotICAgICAgICB0ZXN0UHJvamVjdC5jcmVhdGUobnVsbCk7Ci0gICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmaWxlTmFtZSA9ICJBJkIudHh0IjsKLSAgICAgICAgZmluYWwgSUZpbGUgdGV4dEZpbGUgPSB0ZXN0UHJvamVjdC5nZXRGaWxlKGZpbGVOYW1lKTsKLSAgICAgICAgZmluYWwgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgZmlsZU5hbWUuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIHRleHRGaWxlLmNyZWF0ZShpbnB1dFN0cmVhbSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIElERS5vcGVuRWRpdG9yKHdpbmRvdy5nZXRBY3RpdmVQYWdlKCksCi0gICAgICAgICAgICAgICAgdGV4dEZpbGUsIHRydWUpOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHRpdGxlIG9mIHRoZSB0ZXh0IGVkaXRvci4KLSAgICAgICAgZmluYWwgV29ya2JlbmNoUGFnZSBwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGZpbmFsIEVkaXRvclNhc2hDb250YWluZXIgY29udGFpbmVyID0gKEVkaXRvclNhc2hDb250YWluZXIpIHBhZ2UuZ2V0RWRpdG9yUHJlc2VudGF0aW9uKCkuZ2V0TGF5b3V0UGFydCgpOwotICAgICAgICBmaW5hbCBDVGFiRm9sZGVyIHRhYkZvbGRlciA9IChDVGFiRm9sZGVyKSBjb250YWluZXIuZ2V0QWN0aXZlV29ya2Jvb2soKS5nZXRDb250cm9sKCk7Ci0gICAgICAgIGZpbmFsIENUYWJJdGVtIGl0ZW0gPSB0YWJGb2xkZXIuZ2V0SXRlbSgwKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbFRpdGxlID0gaXRlbS5nZXRUZXh0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdGl0bGUgaXMgZXNjYXBlZCwgYXMgZXhwZWN0ZWQuCi0gICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFRpdGxlID0gIkEmJkIudHh0IjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdGl0bGUgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSAiLCBleHBlY3RlZFRpdGxlLAotICAgICAgICAgICAgICAgIGFjdHVhbFRpdGxlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3ByZXNlbnRhdGlvbnMvUHJlc2VudGF0aW9uc1Rlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcmVzZW50YXRpb25zL1ByZXNlbnRhdGlvbnNUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwMjdmZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3ByZXNlbnRhdGlvbnMvUHJlc2VudGF0aW9uc1Rlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnByZXNlbnRhdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRlc3RzIGZvciBhbGwgYXJlYXMgb2YgdGhlIHByZXNlbnRhdGlvbnMgY29kZSBmb3IgdGhlIHBsYXRmb3JtLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJlc2VudGF0aW9uc1Rlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gVGhpcyBpcyByZXF1aXJlZCB0byB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVzZW50YXRpb25zVGVzdFN1aXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IHRoZSB0ZXN0IHN1aXRlLgotICAgICAqLwotICAgIHB1YmxpYyBQcmVzZW50YXRpb25zVGVzdFN1aXRlKCkgewotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoQnVnNDg1ODlUZXN0LmNsYXNzKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcm9wZXJ0eXNoZWV0L0NvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcm9wZXJ0eXNoZWV0L0NvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWM4NmEzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcHJvcGVydHlzaGVldC9Db21ib0JveFByb3BlcnR5RGVzY3JpcHRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5wcm9wZXJ0eXNoZWV0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Db21ib0JveExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Db21ib0JveFByb3BlcnR5RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUZXN0IGZvciBuZXcgZnVuY3Rpb25hbGl0eSBwZXJ0YWluaW5nIHRvIEJ1ZyAyMTAxMy4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgSUQgPSAiSUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFN0cmluZyBOQU1FID0gIk5BTUUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFN0cmluZ1tdIHZhbHVlcyA9IHsgIk9uZSIsICJUd28iLCAiVGhyZWUiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLSAgICBwcml2YXRlIENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGRlc2NyaXB0b3IgPSBuZXcgQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoSUQsIE5BTUUsIHZhbHVlcyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBjYXNlIHdoZXJlIHRoZSB1c2VyIGRvZXMgbm90IHNldCBhbiBJTGFiZWxQcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIElMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gZGVzY3JpcHRvci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRGVmYXVsdCBsYWJlbCBwcm92aWRlciBpcyBvZiB0aGUgd3JvbmcgdHlwZSIsIC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgICAgICAgQ29tYm9Cb3hMYWJlbFByb3ZpZGVyLmNsYXNzLCBwcm92aWRlci5nZXRDbGFzcygpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gdmFsdWVzW2ldOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBsYWJlbCBwcm92aWRlZCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIHByb3ZpZGVyLmdldFRleHQobmV3IEludGVnZXIoaSkpKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdFdyb25nTGFiZWwocHJvdmlkZXIsIG5ldyBPYmplY3QoKSk7Ci0gICAgICAgIHRlc3RXcm9uZ0xhYmVsKHByb3ZpZGVyLCBudWxsKTsKLSAgICAgICAgdGVzdFdyb25nTGFiZWwocHJvdmlkZXIsIG5ldyBJbnRlZ2VyKC0xKSk7Ci0gICAgICAgIHRlc3RXcm9uZ0xhYmVsKHByb3ZpZGVyLCBuZXcgSW50ZWdlcih2YWx1ZXMubGVuZ3RoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBhIGJhZCBlbGVtZW50IG9iamVjdCAoYW4gSW50ZWdlciBvdXRzaWRlIHRoZSBhY2NlcHRlZCByYW5nZSwgCi0gICAgICogbnVsbCBvciBhbiBvdGhlciBPYmplY3QpIHJldHVybnMgdGhlIGVtcHR5IFN0cmluZy4KLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHByb3ZpZGVyIHRvIHRlc3QgYWdhaW5zdC4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byB0ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0xhYmVsKElMYWJlbFByb3ZpZGVyIHByb3ZpZGVyLCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGxhYmVsIHByb3ZpZGVkIGluIGJhZCBjYXNlIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICIiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgc2V0cyB0aGVpciBvd24gSUxhYmVsUHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEdldExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIElMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgSUxhYmVsUHJvdmlkZXIgZGVzY1Byb3ZpZGVyID0gZGVzY3JpcHRvci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIGFzc2VydFNhbWUoIldyb25nIGxhYmVsIHByb3ZpZGVyIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHByb3ZpZGVyLCBkZXNjUHJvdmlkZXIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9wcm9wZXJ0eXNoZWV0L1Byb3BlcnR5U2hlZXRBdXRvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3Byb3BlcnR5c2hlZXQvUHJvcGVydHlTaGVldEF1dG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM1N2VlMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3Byb3BlcnR5c2hlZXQvUHJvcGVydHlTaGVldEF1dG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucHJvcGVydHlzaGVldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuU2VsZWN0aW9uUHJvdmlkZXJWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuQ29sb3JQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLQotLyoqCi0gKiAgVGhlIGNsYXNzIGltcGxlbWVudHMgYSB0ZXN0IGZvciB0aGUgd29ya2JlbmNoJ3MgZGVmYXVsdAotICogcHJvcGVydHkgc2hlZXQgcGFnZS4gSXQgZG9lcyB0aGlzIGJ5IGZpcmluZyBhIHNlcXVlbmNlIG9mIAotICogc2VsZWN0aW9uIGV2ZW50cy4gVGhlIHByb3BlcnR5IHNoZWV0IHZpZXcgcmVjZWl2ZXMgdGhlc2UgZXZlbnRzIAotICogYW5kIGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgb2JqZWN0cy4KLSAqIFdlIGFyZSBhYmxlIHRvIHRlc3QgdGhlIHByb3BlcnR5IHNoZWV0IGNvZGUgd2hpY2ggZGlzcGxheXMgCi0gKiBwcm9wZXJ0aWVzIGFuZCBoYW5kbGVzIHRoZSB0cmFuc2l0aW9uIHRvIGFub3RoZXIgc2V0IG9mIAotICogcHJvcGVydGllcy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlTaGVldEF1dG8gZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY2FyIHNlcnZlcyBhcyBhIHNpbXBsZSBwb3JwZXJ0eSBzb3VyY2UuCi0gICAgICogVGhlIG9ubHkgaW50ZXJlc3RpbmcgYmVoYXZpb3IgaXQgaGFzIGlzIHRoYXQgaWYKLSAgICAgKiBvbmUgb2YgaXRzIHByb3BlcnRpZXMgaGFzIGEgIm51bGwiIHZhbHVlIHRoZW4KLSAgICAgKiBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoYXQgcHJvcGVydHkgaW4gaXRzIGxpc3QKLSAgICAgKiBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIENhciBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZSB7Ci0gICAgICAgIHByaXZhdGUgaW50IG1vZGVsWWVhciA9IDA7Ci0KLSAgICAgICAgcHJpdmF0ZSBSR0IgY29sb3IgPSBudWxsOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1hbnVmYWN0dXJlciA9IG51bGw7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbW9kZWwgPSBudWxsOwotCi0gICAgICAgIHByaXZhdGUgZG91YmxlIGVuZ2luZVNpemUgPSAwLjA7Ci0KLSAgICAgICAgLy8gcHJvcGVydHkgaWRzCi0gICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBwcmVmaXggPSAib3JnLmVjbGlwc2UudWkudGVzdHMuc3RhbmRhcmRjb21wb25lbnRzLnByb3BlcnR5c2hlZXRhdXRvLiI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE1PREVMX1lFQVIgPSBwcmVmaXggKyAibW9kZWx5ZWFyIjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MT1IgPSBwcmVmaXggKyAiY29sb3IiOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNQU5VRkFDVFVSRVIgPSBwcmVmaXggKyAibWFudWZhY3R1cmVyIjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTU9ERUwgPSBwcmVmaXggKyAibW9kZWwiOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFTkdJTkVfU0laRSA9IHByZWZpeCArICJlbmdpbmVzaXplIjsKLQotICAgICAgICBwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9yczsKLQotICAgICAgICBwdWJsaWMgQ2FyKGludCBjYXJNb2RlbFllYXIsIFJHQiBjYXJDb2xvciwgU3RyaW5nIGNhck1hbnVmYWN0dXJlciwKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2FyTW9kZWwsIGRvdWJsZSBjYXJFbmdpbmVTaXplKSB7Ci0gICAgICAgICAgICBtb2RlbFllYXIgPSBjYXJNb2RlbFllYXI7Ci0gICAgICAgICAgICBjb2xvciA9IGNhckNvbG9yOwotICAgICAgICAgICAgbWFudWZhY3R1cmVyID0gY2FyTWFudWZhY3R1cmVyOwotICAgICAgICAgICAgbW9kZWwgPSBjYXJNb2RlbDsKLSAgICAgICAgICAgIGVuZ2luZVNpemUgPSBjYXJFbmdpbmVTaXplOwotCi0gICAgICAgICAgICBjcmVhdGVEZXNjcmlwdG9ycygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBDcmVhdGVzIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4KLSAgICAgICAgICogSWYgb25lIG9mIHRoZSBwcm9wZXJ0aWVzIGhhcyBhICJudWxsIiB2YWx1ZSB0aGVuCi0gICAgICAgICAqIHRoYXQgcHJvcGVydHkgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mCi0gICAgICAgICAqIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURlc2NyaXB0b3JzKCkgewotICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KDUpOwotICAgICAgICAgICAgaWYgKG1vZGVsWWVhciAhPSAwKQotICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKE1PREVMX1lFQVIsICJtb2RlbCB5ZWFyIikpOwotICAgICAgICAgICAgaWYgKGNvbG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbGlzdC5hZGQobmV3IENvbG9yUHJvcGVydHlEZXNjcmlwdG9yKENPTE9SLCAiY29sb3IiKSk7Ci0gICAgICAgICAgICBpZiAobWFudWZhY3R1cmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbGlzdC5hZGQobmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoTUFOVUZBQ1RVUkVSLCAibWFrZSIpKTsKLSAgICAgICAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKE1PREVMLCAibW9kZWwiKSk7Ci0gICAgICAgICAgICBpZiAoZW5naW5lU2l6ZSAhPSAwLjApCi0gICAgICAgICAgICAgICAgbGlzdC5hZGQobmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoRU5HSU5FX1NJWkUsICJlbmdpbmUiKSk7Ci0gICAgICAgICAgICBkZXNjcmlwdG9ycyA9IChJUHJvcGVydHlEZXNjcmlwdG9yW10pIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbbGlzdC5zaXplKCldKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkgewotICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhNT0RFTF9ZRUFSKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhtb2RlbFllYXIpOwotICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhDT0xPUikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yOwotICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhNQU5VRkFDVFVSRVIpKQotICAgICAgICAgICAgICAgIHJldHVybiBtYW51ZmFjdHVyZXI7Ci0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKE1PREVMKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKEVOR0lORV9TSVpFKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRG91YmxlLnRvU3RyaW5nKGVuZ2luZVNpemUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhNT0RFTF9ZRUFSKSkKLSAgICAgICAgICAgICAgICBtb2RlbFllYXIgPSBuZXcgSW50ZWdlcigoU3RyaW5nKSB2YWx1ZSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoQ09MT1IpKQotICAgICAgICAgICAgICAgIGNvbG9yID0gKFJHQikgdmFsdWU7Ci0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKE1BTlVGQUNUVVJFUikpCi0gICAgICAgICAgICAgICAgbWFudWZhY3R1cmVyID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKE1PREVMKSkKLSAgICAgICAgICAgICAgICBtb2RlbCA9IChTdHJpbmcpIHZhbHVlOwotICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhFTkdJTkVfU0laRSkpCi0gICAgICAgICAgICAgICAgZW5naW5lU2l6ZSA9IG5ldyBEb3VibGUoKFN0cmluZykgdmFsdWUpLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiPCIpOwotICAgICAgICAgICAgaWYgKG1vZGVsWWVhciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQobW9kZWxZZWFyKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChjb2xvcik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtYW51ZmFjdHVyZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHMuYXBwZW5kKG1hbnVmYWN0dXJlcik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtb2RlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQobW9kZWwpOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5naW5lU2l6ZSAhPSAwLjApIHsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChlbmdpbmVTaXplKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcy5hcHBlbmQoIj4iKTsKLSAgICAgICAgICAgIHJldHVybiBzLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2U7Ci0KLSAgICBwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93OwotCi0gICAgcHJpdmF0ZSBTZWxlY3Rpb25Qcm92aWRlclZpZXcgc2VsZWN0aW9uUHJvdmlkZXJWaWV3OwotCi0gICAgcHJpdmF0ZSBDYXJbXSBjYXJzOwotCi0gICAgcHJpdmF0ZSBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTUJFUl9PRl9DQVJTID0gMTA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSX09GX1NFTEVDVElPTlMgPSAxMDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtYWtlcnMgPSBuZXcgU3RyaW5nW10geyAiRm9yZCIsICJHTSIsCi0gICAgICAgICAgICAiQ2hyeXNsZXIiLCAiQk1XIiwgIlRveW90YSIsICJOaXNzYW4iLCAiSG9uZGEiLCAiVm9sdm8iIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtb2RlbHMgPSBuZXcgU3RyaW5nW10geyAiVGh1bmRlcmJpcmQiLAotICAgICAgICAgICAgIkRldmlsbGUiLCAiVmlwZXIiLCAiMzIwaSIsICJDYW1yeSIsICJVbHRpbWEiLCAiUHJlbHVkZSIsICJWNzAiIH07Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlTaGVldEF1dG8oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIENyZWF0ZXMgYSBhcnJheSBvZiBjYXIgb2JqZWN0cwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDYXJzKCkgewotICAgICAgICBjYXJzID0gbmV3IENhcltOVU1CRVJfT0ZfQ0FSU107Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2Fycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2Fyc1tpXSA9IGNyZWF0ZUNhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNhciBpbml0aWFsaXplZCB3aXRoIHJhbmRvbSB2YWx1ZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIENhciBjcmVhdGVDYXIoKSB7Ci0gICAgICAgIGludCBtb2RlbFllYXIgPSAwOwotICAgICAgICBSR0IgY29sb3IgPSBudWxsOwotICAgICAgICBTdHJpbmcgbWFudWZhY3R1cmVyID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG1vZGVsID0gbnVsbDsKLSAgICAgICAgZG91YmxlIGVuZ2luZVNpemUgPSAwLjA7Ci0gICAgICAgIC8vIG9ubHkgc2V0IDI1JSBvZiB0aGUgcHJvcGVydGllcwotICAgICAgICBpbnQgRkFDVE9SID0gNDsKLSAgICAgICAgaWYgKHJhbmRvbS5uZXh0SW50KEZBQ1RPUikgPCBGQUNUT1IgLSAxKQotICAgICAgICAgICAgbW9kZWxZZWFyID0gMTk5MCArIHJhbmRvbS5uZXh0SW50KDE1KTsKLSAgICAgICAgaWYgKHJhbmRvbS5uZXh0SW50KEZBQ1RPUikgPCBGQUNUT1IgLSAxKQotICAgICAgICAgICAgY29sb3IgPSBuZXcgUkdCKHJhbmRvbS5uZXh0SW50KDI1NiksIHJhbmRvbS5uZXh0SW50KDI1NiksIHJhbmRvbQotICAgICAgICAgICAgICAgICAgICAubmV4dEludCgyNTYpKTsKLSAgICAgICAgaWYgKHJhbmRvbS5uZXh0SW50KEZBQ1RPUikgPCBGQUNUT1IgLSAxKQotICAgICAgICAgICAgbWFudWZhY3R1cmVyID0gbWFrZXJzW3JhbmRvbS5uZXh0SW50KG1ha2Vycy5sZW5ndGgpXTsKLSAgICAgICAgaWYgKHJhbmRvbS5uZXh0SW50KEZBQ1RPUikgPCBGQUNUT1IgLSAxKQotICAgICAgICAgICAgbW9kZWwgPSBtb2RlbHNbcmFuZG9tLm5leHRJbnQobW9kZWxzLmxlbmd0aCldOwotICAgICAgICBpZiAocmFuZG9tLm5leHRJbnQoRkFDVE9SKSA8IEZBQ1RPUiAtIDEpCi0gICAgICAgICAgICBlbmdpbmVTaXplID0gcmFuZG9tLm5leHREb3VibGUoKSAqIDY7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FyKG1vZGVsWWVhciwgY29sb3IsIG1hbnVmYWN0dXJlciwgbW9kZWwsIGVuZ2luZVNpemUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9TZXRVcCgpOwotICAgICAgICB3b3JrYmVuY2hXaW5kb3cgPSBvcGVuVGVzdFdpbmRvdygpOwotICAgICAgICBhY3RpdmVQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgY3JlYXRlVGVzdFBhcnQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkKLSAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBJVmlld1BhcnQgdmlldyA9IHBhZ2Uuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsKLSAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXJWaWV3ID0gKFNlbGVjdGlvblByb3ZpZGVyVmlldykgcGFnZQotICAgICAgICAgICAgICAgIC5zaG93VmlldyhTZWxlY3Rpb25Qcm92aWRlclZpZXcuSUQpOwotICAgICAgICByZXR1cm4gdmlldzsKLQotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBTdXBwbHkgc2VsZWN0aW9uIGV2ZW50cyB3aXRoIGEgcmFuZG9tIGNhciBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgY3JlYXRlVGVzdFBhcnQoYWN0aXZlUGFnZSk7Ci0gICAgICAgIGNyZWF0ZUNhcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1CRVJfT0ZfU0VMRUNUSU9OUzsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHNlbGVjdGlvbgotICAgICAgICAgICAgaW50IG51bWJlclRvU2VsZWN0ID0gcmFuZG9tLm5leHRJbnQoTlVNQkVSX09GX0NBUlMgLSAyKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KG51bWJlclRvU2VsZWN0KTsKLSAgICAgICAgICAgIHdoaWxlIChzZWxlY3Rpb24uc2l6ZSgpIDwgbnVtYmVyVG9TZWxlY3QpIHsKLSAgICAgICAgICAgICAgICBpbnQgaiA9IHJhbmRvbS5uZXh0SW50KE5VTUJFUl9PRl9DQVJTKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5jb250YWlucyhjYXJzW2pdKSkKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmFkZChjYXJzW2pdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24pOwotICAgICAgICAgICAgLy8gZmlyZSB0aGUgc2VsZWN0aW9uCQotICAgICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXJWaWV3LnNldFNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLSAgICAgICAgICAgIHdoaWxlIChEaXNwbGF5LmdldEN1cnJlbnQoKS5yZWFkQW5kRGlzcGF0Y2goKSkKLSAgICAgICAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcHJvcGVydHlzaGVldC9Qcm9wZXJ0eVNoZWV0VGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3Byb3BlcnR5c2hlZXQvUHJvcGVydHlTaGVldFRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmU0MGY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvcHJvcGVydHlzaGVldC9Qcm9wZXJ0eVNoZWV0VGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMucHJvcGVydHlzaGVldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGVzdCBhcmVhcyBvZiB0aGUgUHJvcGVydHkgU2hlZXQgQVBJLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlTaGVldFRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gIFRoaXMgaXMgcmVxdWlyZWQgdG8KLSAgICAgKiB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVNoZWV0VGVzdFN1aXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IHRoZSB0ZXN0IHN1aXRlLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0eVNoZWV0VGVzdFN1aXRlKCkgewotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoUHJvcGVydHlTaGVldEF1dG8uY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yVGVzdC5jbGFzcykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvc2Vzc2lvbi9CdWcxMDgwMzNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3Nlc3Npb24vQnVnMTA4MDMzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGQ4NTU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvc2Vzc2lvbi9CdWcxMDgwMzNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnNlc3Npb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5WaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5WaWV3U3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy5QcmVzZW50YWJsZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucHJlc2VudGF0aW9ucy51dGlsLlRhYmJlZFN0YWNrUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuSVByZXNlbnRhYmxlUGFydDsKLQotLyoqCi0gKiBCdWcgMTA4MDMzIE5lZWQgYSB0ZXN0IHRvIGVuc3VyZSB0aGF0IHZpZXcgdGFiIG9yZGVyIGlzIHRoZSBzYW1lIG9uIHN0YXJ0IHVwCi0gKiBhcyBpdCB3YXMgaW4gdGhlIGxhc3Qgc2Vzc2lvbi4KLSAqIAotICogVGhlc2UgdGVzdHMgbW9yZSBvciBsZXNzIGRlcGVuZCBvbiBiZWluZyBydW4gaW4gb3JkZXIuIFRoZSB3b3Jrc3BhY2UgZXhpc3RzCi0gKiBmcm9tIG1ldGhvZCB0byBtZXRob2QuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQnVnMTA4MDMzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fVklFV19JRCA9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1ZJRVdfSUQgPSAib3JnLmVjbGlwc2UudWkudmlld3MuVGFza0xpc3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPR1JFU1NfVklFV19JRCA9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ncmVzc1ZpZXciOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX0lEID0gIm9yZy5lY2xpcHNlLnVpLnJlc291cmNlUGVyc3BlY3RpdmUiOwotCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IGZXaW47Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYWdlIGZBY3RpdmVQYWdlOwotCi0JcHJpdmF0ZSBJV29ya2JlbmNoIGZXb3JrYmVuY2g7Ci0KLQlwdWJsaWMgQnVnMTA4MDMzVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZXb3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCi0JCWZXaW4gPSBmV29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCWZBY3RpdmVQYWdlID0gZldpbi5nZXRBY3RpdmVQYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBzdXJlIHRoZSBwZXJzcGVjdGl2ZSBoYXMgYmVlbiByZXNldCwgYW5kIHRoZW4gc2hvdyB0aGUgdmlld3MgaW4gdGhlCi0JICogZXhwZWN0ZWQgb3JkZXIuIFRoZXNlIHRlc3RzIGRlcGVuZCBvbiBiZWluZyBydW4gaW4gb3JkZXIgaW4gdGhlIHNhbWUKLQkgKiBlbnZpcm9ubWVudCwgc28gd2UgY2FuJ3QgdXNlIHRoZSBzdGFuZGFyZCBvcGVuV2luZG93KCkgdG8gcHJvdGVjdAotCSAqIG91cnNlbHZlcyBmcm9tIHNpZGUgZWZmZWN0cy4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqICAgICAgICAgICAgIGFuIGVycm9yCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNob3dNdWx0aXBsZVZpZXdzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYyA9IGZBY3RpdmVQYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKS5maW5kUGVyc3BlY3RpdmVXaXRoSWQoCi0JCQkJCQlSRVNPVVJDRV9JRCk7Ci0JCWZBY3RpdmVQYWdlLnNldFBlcnNwZWN0aXZlKGRlc2MpOwotCQlmQWN0aXZlUGFnZS5yZXNldFBlcnNwZWN0aXZlKCk7Ci0JCWFzc2VydE5vdE51bGwoZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoVEFTS19WSUVXX0lEKSk7Ci0JCWFzc2VydE5vdE51bGwoZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoUFJPR1JFU1NfVklFV19JRCkpOwotCQlhc3NlcnROb3ROdWxsKGZBY3RpdmVQYWdlLnNob3dWaWV3KFBST0JMRU1fVklFV19JRCkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRoZSB2aWV3cyBhcmUgc3RpbGwgaW4gdGhlIGNvcnJlY3Qgb3JkZXIsIHRoZW4gbW92ZSB0aGUgcHJvYmxlbXMKLQkgKiB2aWV3IHRvIHRoZSBmaXJzdCB0YWIuCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKiAgICAgICAgICAgICBhbiBlcnJvcgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDaGVja011bHRpcGxlVmlld3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSVZpZXdQYXJ0IHByb2JsZW1WaWV3ID0gaW5zdGFudGlhdGVWaWV3cygpOwotCi0JCVZpZXdTaXRlIHNpdGUgPSAoVmlld1NpdGUpIHByb2JsZW1WaWV3LmdldFNpdGUoKTsKLQkJVmlld1N0YWNrIHN0YWNrID0gKFZpZXdTdGFjaykgc2l0ZS5nZXRQYW5lKCkuZ2V0Q29udGFpbmVyKCk7Ci0KLQkJVGFiYmVkU3RhY2tQcmVzZW50YXRpb24gcHJlcyA9IChUYWJiZWRTdGFja1ByZXNlbnRhdGlvbikgc3RhY2sKLQkJCQkuZ2V0VGVzdFByZXNlbnRhdGlvbigpOwotCi0JCXZlcmlmeU9yZGVyKHByZXMsIG5ldyBTdHJpbmdbXSB7ICJUYXNrcyIsICJQcm9ncmVzcyIsICJQcm9ibGVtcyIgfSk7Ci0JCUlQcmVzZW50YWJsZVBhcnQgcGFydCA9IGdldFByZXNlbnRhYmxlUGFydChzaXRlKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJ0KTsKLQotCQlwcmVzLm1vdmVUYWIocGFydCwgMCk7Ci0KLQkJdmVyaWZ5T3JkZXIocHJlcywgbmV3IFN0cmluZ1tdIHsgIlByb2JsZW1zIiwgIlRhc2tzIiwgIlByb2dyZXNzIiB9KTsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZnkgdGhlIHZpZXdzIGFyZSBvcmRlcmVkIHdpdGggdGhlIHByb2JsZW1zIHZpZXcgZmlyc3QgYWZ0ZXIgdGhlCi0JICogcmVzdGFydC4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqICAgICAgICAgICAgIGFuIGVycm9yCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1vdmVkTXVsdGlwbGVWaWV3cygpIHRocm93cyBUaHJvd2FibGUgewotCQlJVmlld1BhcnQgcHJvYmxlbVZpZXcgPSBpbnN0YW50aWF0ZVZpZXdzKCk7Ci0KLQkJVmlld1NpdGUgc2l0ZSA9IChWaWV3U2l0ZSkgcHJvYmxlbVZpZXcuZ2V0U2l0ZSgpOwotCQlWaWV3U3RhY2sgc3RhY2sgPSAoVmlld1N0YWNrKSBzaXRlLmdldFBhbmUoKS5nZXRDb250YWluZXIoKTsKLQotCQlUYWJiZWRTdGFja1ByZXNlbnRhdGlvbiBwcmVzID0gKFRhYmJlZFN0YWNrUHJlc2VudGF0aW9uKSBzdGFjawotCQkJCS5nZXRUZXN0UHJlc2VudGF0aW9uKCk7Ci0KLQkJdmVyaWZ5T3JkZXIocHJlcywgbmV3IFN0cmluZ1tdIHsgIlByb2JsZW1zIiwgIlRhc2tzIiwgIlByb2dyZXNzIiB9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFueSBOUEVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2JsZW0gdmlldy4KLQkgKiBAdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSB2aWV3IGZhaWxzIHRvIGluc3RhbnRpYXRlLgotCSAqLwotCXByaXZhdGUgSVZpZXdQYXJ0IGluc3RhbnRpYXRlVmlld3MoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlJVmlld1BhcnQgcHJvYmxlbVZpZXcgPSBmQWN0aXZlUGFnZS5zaG93VmlldyhQUk9CTEVNX1ZJRVdfSUQpOwotCQlhc3NlcnROb3ROdWxsKHByb2JsZW1WaWV3KTsKLQotCQkvLyBtYWtlIHN1cmUgYWxsIG9mIHRoZSB2aWV3cyBoYXZlIGJlZW4gaW5zdGFudGlhdGVkCi0JCWFzc2VydE5vdE51bGwoZkFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoUFJPR1JFU1NfVklFV19JRCkpOwotCQlhc3NlcnROb3ROdWxsKGZBY3RpdmVQYWdlLnNob3dWaWV3KFRBU0tfVklFV19JRCkpOwotCQlyZXR1cm4gcHJvYmxlbVZpZXc7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZ5IHRoZSB0YWJzIGFyZSBpbiB0aGUgY29ycmVjdCBvcmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlcwotCSAqICAgICAgICAgICAgdGhlIHN0YWNrIHByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBvcmRlcgotCSAqICAgICAgICAgICAgdGhlIGV4cGVjdGVkIG9yZGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU9yZGVyKFRhYmJlZFN0YWNrUHJlc2VudGF0aW9uIHByZXMsIFN0cmluZ1tdIG9yZGVyKSB7Ci0JCUlQcmVzZW50YWJsZVBhcnRbXSB0YWJzID0gcHJlcy5nZXRQYXJ0TGlzdCgpOwotCQlhc3NlcnRFcXVhbHMoIkRpZmZlcmVudCBudW1iZXIgb2YgdGFicyIsIG9yZGVyLmxlbmd0aCwgdGFicy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyArK2kpIHsKLQkJCWFzc2VydEVxdWFscygiRmFpbGVkIG9uIHRhYiAiICsgaSwgb3JkZXJbaV0sIHRhYnNbaV0uZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJlc2VudGFibGUgcGFydCBmb3IgdGhlIHZpZXcgKHZpZXcgc2l0ZSkuCi0JICogCi0JICogQHBhcmFtIHNpdGUKLQkgKiAgICAgICAgICAgIHRoZSBzaXRlIG9mIHRoZSB2aWV3IHdlIHdhbnQKLQkgKiBAcmV0dXJuIGl0J3MgcHJlc2VudGFibGUgcGFydC4KLQkgKi8KLQlwcml2YXRlIElQcmVzZW50YWJsZVBhcnQgZ2V0UHJlc2VudGFibGVQYXJ0KFZpZXdTaXRlIHNpdGUpIHsKLQkJSVByZXNlbnRhYmxlUGFydFtdIHBhcnRMaXN0ID0gKElQcmVzZW50YWJsZVBhcnRbXSkgKChWaWV3U3RhY2spIHNpdGUKLQkJCQkuZ2V0UGFuZSgpLmdldENvbnRhaW5lcigpKS5nZXRQcmVzZW50YWJsZVBhcnRzKCkudG9BcnJheSgKLQkJCQluZXcgSVByZXNlbnRhYmxlUGFydFswXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydExpc3QubGVuZ3RoOyBpKyspIHsKLQkJCUlQcmVzZW50YWJsZVBhcnQgcGFydCA9IHBhcnRMaXN0W2ldOwotCQkJaWYgKCgoUHJlc2VudGFibGVQYXJ0KSBwYXJ0KS5nZXRQYW5lKCkgPT0gc2l0ZS5nZXRQYW5lKCkpIHsKLQkJCQlyZXR1cm4gcGFydDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3Nlc3Npb24vQnVnOTUzNTdUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3Nlc3Npb24vQnVnOTUzNTdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmJhNDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9zZXNzaW9uL0J1Zzk1MzU3VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuc2Vzc2lvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLkVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuRWRpdG9yU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlNlc3Npb25FZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5EcmFnT3BlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQuRWRpdG9yRHJvcFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQuRXhpc3RpbmdXaW5kb3dQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci0KLS8qKgotICogQnVnIDk1MzU3IE5lZWQgYSB0ZXN0IHRvIGVuc3VyZSBlZGl0b3IgYWN0aXZhdGlvbiBpcyBub3QgYnJva2VuIG9uIHN0YXJ0dXAuCi0gKiBXaGVuIGVjbGlwc2Ugc3RhcnRzLCB0aGVyZSBzaG91bGQgYmUgdGFicyBmb3IgYWxsIG9mIHRoZSBvcGVuIGVkaXRvciB3aW5kb3dzCi0gKiBidXQgb25seSB0aGUgPGI+YWN0aXZlPC9iPiBlZGl0b3Igd2luZG93KHMpIHNob3VsZCBoYXZlIGJlZW4gaW5zdGFudGlhdGVkLiBBCi0gKiBidWcgdGhhdCBjcm9wcyB1cCBvY2Nhc2lvbmFsbHkgaXMgdGhhdCBhbGwgb2YgdGhlIGVkaXRvcnMgaGF2ZSBiZWVuCi0gKiBpbnN0YW50aWF0ZWQsIHdoaWNoIGltcGFjdHMgcGVyZm9ybWFuY2UuCi0gKiAKLSAqIFRoZXNlIHRlc3RzIG1vcmUgb3IgbGVzcyBkZXBlbmQgb24gYmVpbmcgcnVuIGluIG9yZGVyLiBUaGUgd29ya3NwYWNlIGV4aXN0cwotICogZnJvbSBtZXRob2QgdG8gbWV0aG9kLgotICogCi0gKiBAc2luY2UgMy4xCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJ1Zzk1MzU3VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUc5NTM1N1BST0pFQ1QgPSAiQnVnOTUzNTdwcm9qZWN0IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUxFX01BWCA9IDg7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgZldpbjsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgZkFjdGl2ZVBhZ2U7Ci0KLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0OwotCi0JcHJpdmF0ZSBJV29ya2JlbmNoIGZXb3JrYmVuY2g7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGl0c0ZpbGVuYW1lOwotCi0JcHVibGljIEJ1Zzk1MzU3VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCQlmV29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJZlByb2plY3QgPSBudWxsOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cEZpbGVuYW1lcyhTdHJpbmcgZXh0KSB7Ci0JCWl0c0ZpbGVuYW1lID0gbmV3IFN0cmluZ1tCdWc5NTM1N1Rlc3QuRklMRV9NQVhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IEJ1Zzk1MzU3VGVzdC5GSUxFX01BWDsgKytpKSB7Ci0JCQlpdHNGaWxlbmFtZVtpXSA9ICJ0ZXN0IiArIGkgKyBleHQ7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmV2luID0gZldvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQotCQlmQWN0aXZlUGFnZSA9IGZXaW4uZ2V0QWN0aXZlUGFnZSgpOwotCQlmUHJvamVjdCA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoQnVnOTUzNTdUZXN0LkJVRzk1MzU3UFJPSkVDVCk7Ci0JfQotCi0JLyoqCi0JICogTXVsdGlwbGUgZWRpdG9ycyBvcGVuIC0gcGFydCAxIG9mIDIuIFRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZXJlIGFyZQotCSAqIEZJTEVfTUFYIGVkaXRvcnMgb3BlbiwgYW5kIHRoZSBmaWxlcyBoYXZlIGJlZW4gY3JlYXRlZC4gVGhlbiB0aGUgc2Vzc2lvbgotCSAqIHN0b3BzLgotCSAqIAotCSAqIEB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgbXVsdGlwbGVFZGl0b3JzKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJZkFjdGl2ZVBhZ2UuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQkJCi0JCUlFZGl0b3JQYXJ0W10gcGFydCA9IG5ldyBJRWRpdG9yUGFydFtpdHNGaWxlbmFtZS5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0c0ZpbGVuYW1lLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXJ0W2ldID0gSURFLm9wZW5FZGl0b3IoZkFjdGl2ZVBhZ2UsIEZpbGVVdGlsLmNyZWF0ZUZpbGUoCi0JCQkJCWl0c0ZpbGVuYW1lW2ldLCBmUHJvamVjdCksIHRydWUpOwotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZShmQWN0aXZlUGFnZS5pc0VkaXRvckFyZWFWaXNpYmxlKCkpOwotCQlhc3NlcnRGYWxzZShmQWN0aXZlUGFnZS5pc1BhcnRWaXNpYmxlKHBhcnRbMF0pKTsKLQkJYXNzZXJ0VHJ1ZShmQWN0aXZlUGFnZS5pc1BhcnRWaXNpYmxlKHBhcnRbcGFydC5sZW5ndGggLSAxXSkpOwotCX0KLQotCS8qKgotCSAqIE11bHRpcGxlIGVkaXRvcnMgb3BlbiAtIHBhcnQgMiBvZiAyLiBXZSBjYW4gdGVzdCB0aGUgc3RhdGUgb2YgZWNsaXBzZQotCSAqIGFmdGVyIHRoZSBzeXN0ZW0gaGFzIHJlc3RhcnRlZC4gV2UgZXhwZWN0IHRoYXQgdGhlIGxhc3QgZWRpdG9yIHdpbGwgYmUKLQkgKiBhY3RpdmUgYW5kIGluc3RhbnRpYXRlZCwgYnV0IHRoZSBvdGhlciBlZGl0b3JzIHdvbid0IGhhdmUgYmVlbgotCSAqIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbXVsdGlwbGVFZGl0b3JzT3BlbigpIHsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvcnMgPSBmQWN0aXZlUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWFzc2VydEVxdWFscyhCdWc5NTM1N1Rlc3QuRklMRV9NQVgsIGVkaXRvcnMubGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvcnMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlhc3NlcnROdWxsKCJFZGl0b3IgIiArIGkgKyAiICIgKyBlZGl0b3JzW2ldLmdldE5hbWUoKQotCQkJCQkrICIgc2hvdWxkIG5vdCBiZSBhY3RpdmUiLCBlZGl0b3JzW2ldLmdldEVkaXRvcihmYWxzZSkpOwotCQl9Ci0JCWFzc2VydE5vdE51bGwoZWRpdG9yc1tlZGl0b3JzLmxlbmd0aCAtIDFdLmdldEVkaXRvcihmYWxzZSkpOwotCQlhc3NlcnROb3ROdWxsKGVkaXRvcnNbMF0uZ2V0RWRpdG9yKHRydWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBNdWx0aXBsZSBlZGl0b3JzIGluIDIgc3RhY2tzIC0gcGFydCAxIG9mIDIuIFNldCB1cCBlY2xpcHNlIHdpdGggRklMRV9NQVgKLQkgKiBlZGl0b3JzIG9wZW4gaW4gMiBzdGFja3MuCi0JICogCi0JICogQHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBtdWx0aXBsZVN0YWNrcygpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBmMSA9IGl0c0ZpbGVuYW1lWzBdOwotCQlmaW5hbCBTdHJpbmcgZjIgPSBpdHNGaWxlbmFtZVsxXTsKLQkJZmluYWwgaW50IHN0YXJ0QXQgPSAyOwotCi0JCWZBY3RpdmVQYWdlLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7Ci0KLQkJSUVkaXRvclBhcnQgbGFzdCA9IElERS5vcGVuRWRpdG9yKGZBY3RpdmVQYWdlLCBGaWxlVXRpbC5jcmVhdGVGaWxlKGYxLAotCQkJCWZQcm9qZWN0KSwgdHJ1ZSk7Ci0JCUlFZGl0b3JQYXJ0IGN1cnJlbnQgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgRmlsZVV0aWwuY3JlYXRlRmlsZSgKLQkJCQlmMiwgZlByb2plY3QpLCB0cnVlKTsKLQotCQkvLyBjcmVhdGUgdGhlIHNlY29uZCBlZGl0b3Igc3RhY2sgdXNpbmcgdGhlIHNlY29uZCBlZGl0b3IKLQkJRHJhZ09wZXJhdGlvbnMuZHJhZyhjdXJyZW50LCBuZXcgRWRpdG9yRHJvcFRhcmdldCgKLQkJCQluZXcgRXhpc3RpbmdXaW5kb3dQcm92aWRlcihmV2luKSwgMCwgU1dULkJPVFRPTSksIGZhbHNlKTsKLQotCQlFZGl0b3JTdGFjayBmaXJzdFN0YWNrID0gKEVkaXRvclN0YWNrKSAoKEVkaXRvclNpdGUpIGxhc3QKLQkJCQkuZ2V0RWRpdG9yU2l0ZSgpKS5nZXRQYW5lKCkuZ2V0Q29udGFpbmVyKCk7Ci0JCUVkaXRvclN0YWNrIHNlY29uZFN0YWNrID0gKEVkaXRvclN0YWNrKSAoKEVkaXRvclNpdGUpIGN1cnJlbnQKLQkJCQkuZ2V0RWRpdG9yU2l0ZSgpKS5nZXRQYW5lKCkuZ2V0Q29udGFpbmVyKCk7Ci0KLQkJZm9yIChpbnQgaSA9IHN0YXJ0QXQ7IGkgPCBpdHNGaWxlbmFtZS5sZW5ndGg7ICsraSkgewotCQkJZkFjdGl2ZVBhZ2UuYWN0aXZhdGUobGFzdCk7Ci0JCQlsYXN0ID0gY3VycmVudDsKLQkJCWN1cnJlbnQgPSBJREUub3BlbkVkaXRvcihmQWN0aXZlUGFnZSwgRmlsZVV0aWwuY3JlYXRlRmlsZSgKLQkJCQkJaXRzRmlsZW5hbWVbaV0sIGZQcm9qZWN0KSwgdHJ1ZSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKEJ1Zzk1MzU3VGVzdC5GSUxFX01BWCAvIDIsIGZpcnN0U3RhY2suZ2V0SXRlbUNvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoQnVnOTUzNTdUZXN0LkZJTEVfTUFYIC8gMiwgc2Vjb25kU3RhY2suZ2V0SXRlbUNvdW50KCkpOwotCX0KLQotCS8qKgotCSAqIE11bHRpcGxlIGVkaXRvcnMgaW4gMiBzdGFja3MgLSBwYXJ0IDIgb2YgMi4gMiBvZiB0aGUgZWRpdG9ycyBzaG91bGQgaGF2ZQotCSAqIGJlZW4gaW5zdGFudGlhdGVkLiBUaGUgcmVzdCBzaG91bGQgc3RpbGwgYmUgaW5hY3RpdmUuCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIG11bHRpcGxlU3RhY2tzT25TdGFydHVwKCkgewotCQlJRWRpdG9yUmVmZXJlbmNlIGxhc3RGaWxlID0gbnVsbDsKLQkJSUVkaXRvclJlZmVyZW5jZSBzZWNvbmRMYXN0RmlsZSA9IG51bGw7Ci0KLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvcnMgPSBmQWN0aXZlUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWFzc2VydEVxdWFscyhCdWc5NTM1N1Rlc3QuRklMRV9NQVgsIGVkaXRvcnMubGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpdHNGaWxlbmFtZVtpdHNGaWxlbmFtZS5sZW5ndGggLSAxXQotCQkJCQkuZXF1YWxzKGVkaXRvcnNbaV0uZ2V0TmFtZSgpKSkgewotCQkJCWxhc3RGaWxlID0gZWRpdG9yc1tpXTsKLQkJCX0gZWxzZSBpZiAoaXRzRmlsZW5hbWVbaXRzRmlsZW5hbWUubGVuZ3RoIC0gMl0uZXF1YWxzKGVkaXRvcnNbaV0KLQkJCQkJLmdldE5hbWUoKSkpIHsKLQkJCQlzZWNvbmRMYXN0RmlsZSA9IGVkaXRvcnNbaV07Ci0JCQl9Ci0JCX0KLQotCQlhc3NlcnROb3ROdWxsKGxhc3RGaWxlLmdldEVkaXRvcihmYWxzZSkpOwotCQlhc3NlcnROb3ROdWxsKHNlY29uZExhc3RGaWxlLmdldEVkaXRvcihmYWxzZSkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvcnMubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChlZGl0b3JzW2ldICE9IGxhc3RGaWxlICYmIGVkaXRvcnNbaV0gIT0gc2Vjb25kTGFzdEZpbGUpIHsKLQkJCQlhc3NlcnROdWxsKCJGb3IgZmlsZSAiICsgaSArICIgIiArIGVkaXRvcnNbaV0uZ2V0TmFtZSgpLAotCQkJCQkJZWRpdG9yc1tpXS5nZXRFZGl0b3IoZmFsc2UpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3QgZm9yIC50eHQgZmlsZXMgYW5kIHRoZSBiYXNpYyBlZGl0b3IuIFBhcnQgMSBvZiAyCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVFZGl0b3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXNldHVwRmlsZW5hbWVzKCIudHh0Iik7Ci0JCQotCQltdWx0aXBsZUVkaXRvcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGZvciAudHh0IGZpbGVzIGFuZCB0aGUgYmFzaWMgZWRpdG9yLiBQYXJ0IDIgb2YgMgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlRWRpdG9yc09wZW4oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJc2V0dXBGaWxlbmFtZXMoIi50eHQiKTsKLQkKLQkJbXVsdGlwbGVFZGl0b3JzT3BlbigpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgbXVsdGlwbGUgc3RhY2tzIHdpdGggLnR4dCBlZGl0b3IuIFBhcnQgMSBvZiAyCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTdGFja3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJc2V0dXBGaWxlbmFtZXMoIi50eHQiKTsKLQkJbXVsdGlwbGVTdGFja3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IG11bHRpcGxlIHN0YWNrcyB3aXRoIC50eHQgZWRpdG9yLiBQYXJ0IDIgb2YgMgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU3RhY2tzT25TdGFydHVwKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXNldHVwRmlsZW5hbWVzKCIudHh0Iik7Ci0JCW11bHRpcGxlU3RhY2tzT25TdGFydHVwKCk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IGZvciAuc2Vzc2lvbiBmaWxlcyBhbmQgdGhlIFNlc3Npb25FZGl0b3JQYXJ0IGVkaXRvci4gUGFydCAxIG9mIDIKLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUVkaXRvcnNTZXNzaW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXNldHVwRmlsZW5hbWVzKCIuc2Vzc2lvbiIpOwotCQltdWx0aXBsZUVkaXRvcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKEJ1Zzk1MzU3VGVzdC5GSUxFX01BWCwgU2Vzc2lvbkVkaXRvclBhcnQuaW5zdGFudGlhdGVkRWRpdG9ycyk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IGZvciAuc2Vzc2lvbiBmaWxlcyBhbmQgdGhlIFNlc3Npb25FZGl0b3JQYXJ0IGVkaXRvci4gUGFydCAyIG9mIDIKLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUVkaXRvcnNPcGVuU2Vzc2lvbigpIHRocm93cyBUaHJvd2FibGUgewotCQlzZXR1cEZpbGVuYW1lcygiLnNlc3Npb24iKTsKLQkJbXVsdGlwbGVFZGl0b3JzT3BlbigpOwotCQlhc3NlcnRFcXVhbHMoMiwgU2Vzc2lvbkVkaXRvclBhcnQuaW5zdGFudGlhdGVkRWRpdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBtdWx0aXBsZSBzdGFja3Mgd2l0aCAuc2Vzc2lvbiBlZGl0b3IuIFBhcnQgMSBvZiAyCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTdGFja3NTZXNzaW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXNldHVwRmlsZW5hbWVzKCIuc2Vzc2lvbiIpOwotCQlTZXNzaW9uRWRpdG9yUGFydC5pbnN0YW50aWF0ZWRFZGl0b3JzID0gMDsKLQkJbXVsdGlwbGVTdGFja3MoKTsKLQkJYXNzZXJ0RXF1YWxzKEJ1Zzk1MzU3VGVzdC5GSUxFX01BWCwgU2Vzc2lvbkVkaXRvclBhcnQuaW5zdGFudGlhdGVkRWRpdG9ycyk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IG11bHRpcGxlIHN0YWNrcyB3aXRoIC5zZXNzaW9uIGVkaXRvci4gUGFydCAyIG9mIDIKLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVN0YWNrc09uU3RhcnR1cFNlc3Npb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJc2V0dXBGaWxlbmFtZXMoIi5zZXNzaW9uIik7Ci0JCW11bHRpcGxlU3RhY2tzT25TdGFydHVwKCk7Ci0JCWFzc2VydEVxdWFscygyLCBTZXNzaW9uRWRpdG9yUGFydC5pbnN0YW50aWF0ZWRFZGl0b3JzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3Nlc3Npb24vQnVnOTg4MDBUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3Nlc3Npb24vQnVnOTg4MDBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWU2YzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9zZXNzaW9uL0J1Zzk4ODAwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnNlc3Npb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIElmIGEgdmlldyBpcyBub3QgYWN0aXZhdGVkIGR1cmluZyBhIHNlc3Npb24sIGl0J3MgcGFydCBpcyBub3QgaW5zdGFudGlhdGVkLgotICogVGhpcyB0ZXN0cyB0aGF0IGNhc2UsIGFuZCB0aGUgb3V0Y29tZSBzaG91bGQgYmUgdGhlIHZpZXcgaGFzIGl0J3MgbGFzdAotICogc2Vzc2lvbiBzdGF0ZSB3aGVuIGl0IGlzIGZpbmFsbHkgaW5zdGFudGlhdGVkIGluIHRoZSB3b3JrYmVuY2guCi0gKiAKLSAqIEBzaW5jZSAzLjEuMQotICovCi1wdWJsaWMgY2xhc3MgQnVnOTg4MDBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNX1ZJRVdfSUQgPSAib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfV0lUSF9TVEFURV9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy5zZXNzaW9uLlZpZXdXaXRoU3RhdGUiOwotCi0JcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEJ1Zzk4ODAwVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBmUGFnZTsKLQotCXB1YmxpYyBCdWc5ODgwMFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQkJZlBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBmaXJzdCBwYXJ0IG9mIGEgMyBwYXJ0IHRlc3RzLiAgRmlyc3QgaW5zdGFudGlhdGUgYSB2aWV3Ci0JICogYW5kIHNldCBhIHN0YXRlLgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEFjdGl2YXRlVmlldygpIHRocm93cyBUaHJvd2FibGUgewotCQlJVmlld1BhcnQgdiA9IGZQYWdlLnNob3dWaWV3KFZJRVdfV0lUSF9TVEFURV9JRCk7Ci0JCQotCQkvLyBwdXQgYW5vdGhlciB2aWV3IGluIGZyb250IG9mIG91ciB2aWV3Ci0JCWZQYWdlLnNob3dWaWV3KFBST0JMRU1fVklFV19JRCk7Ci0JCQotCQkvLyBzZXQgYSBzdGF0ZSBzbyBpdCBjYW4gYmUgc2F2ZWQKLQkJVmlld1dpdGhTdGF0ZSB2aWV3ID0gKFZpZXdXaXRoU3RhdGUpIHY7Ci0JCXZpZXcuZlN0YXRlID0gMTA7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNlY29uZCBzZXNzaW9uIGRvZXNuJ3QgYWN0aXZhdGUgdGhlIHZpZXcsIHNvIGl0IHNob3VsZCBub3QKLQkgKiBiZSBpbnN0YW50aWF0ZWQuCi0JICogIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNlY29uZE9wZW5pbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSVZpZXdSZWZlcmVuY2VbXSB2aWV3cyA9IGZQYWdlLmdldFZpZXdSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmlld3MubGVuZ3RoOyBpKyspIHsKLQkJCUlWaWV3UmVmZXJlbmNlIHJlZiA9IHZpZXdzW2ldOwotCQkJaWYgKHJlZi5nZXRJZCgpLmVxdWFscyhWSUVXX1dJVEhfU1RBVEVfSUQpKSB7Ci0JCQkJYXNzZXJ0TnVsbCgiVGhlIHZpZXcgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQiLCByZWYKLQkJCQkJCS5nZXRQYXJ0KGZhbHNlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBY3RpdmF0ZSB0aGUgdmlldyBhbmQgaXQncyBzdGF0ZSBzaG91bGQgcmUtYXBwZWFyLgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNhdmVkTWVtZW50bygpIHRocm93cyBUaHJvd2FibGUgewotCQlJVmlld1BhcnQgdiA9IGZQYWdlLnNob3dWaWV3KFZJRVdfV0lUSF9TVEFURV9JRCk7Ci0JCVZpZXdXaXRoU3RhdGUgdmlldyA9IChWaWV3V2l0aFN0YXRlKSB2OwotCQlhc3NlcnRFcXVhbHMoCi0JCQkJInRoZSB2aWV3IHN0YXRlIHNob3VsZCBoYXZlIG1hZGUgaXQgdGhyb3VnaCBhIHNlc3Npb24gd2l0aG91dCBpbnN0YW50aWF0aW9uIiwKLQkJCQkxMCwgdmlldy5mU3RhdGUpOwotCi0JCS8vIHRoZSBzdGF0ZSBzaG91bGQgbm90IGJlIHNhdmVkIGJldHdlZW4gYSBjbG9zZSBhbmQKLQkJLy8gYW4gb3BlbiBpbiB0aGUgc2FtZSBzZXNzaW9uCi0JCWZQYWdlLmhpZGVWaWV3KHYpOwotCQl2ID0gZlBhZ2Uuc2hvd1ZpZXcoVklFV19XSVRIX1NUQVRFX0lEKTsKLQkJdmlldyA9IChWaWV3V2l0aFN0YXRlKSB2OwotCQlhc3NlcnRFcXVhbHMoIlRoZSB2aWV3IHN0YXRlIHNob3VsZCBiZSByZXNldCIsIDAsIHZpZXcuZlN0YXRlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3Nlc3Npb24vSW50cm9TZXNzaW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvc2Vzc2lvbi9JbnRyb1Nlc3Npb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzIzZmEzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvc2Vzc2lvbi9JbnRyb1Nlc3Npb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnNlc3Npb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRlc3RzIGludHJvLXJlbGF0ZWQgc2Vzc2lvbiBwcm9wZXJ0aWVzLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRyb1Nlc3Npb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBJbnRyb1Nlc3Npb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEludHJvKCkgewotCQkvL2Fzc2VydCB0aGF0IHRoZSBpbnRybyB3YXMgbm90IHNob3duCi0JCWFzc2VydE51bGwoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRJbnRyb01hbmFnZXIoKS5nZXRJbnRybygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3Nlc3Npb24vU2Vzc2lvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3Nlc3Npb24vU2Vzc2lvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OGU4NWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9zZXNzaW9uL1Nlc3Npb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnNlc3Npb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25UZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvblRlc3RzKCkgewotCQlhZGRJbnRyb1Rlc3RzKCk7Ci0JCWFkZEVkaXRvclRlc3RzKCk7Ci0JCWFkZFZpZXdTdGF0ZVRlc3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBTZXNzaW9uVGVzdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGludHJvIHJlbGF0ZWQgc2Vzc2lvbiB0ZXN0cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSW50cm9UZXN0cygpIHsKLQkJYWRkVGVzdChuZXcgV29ya2JlbmNoU2Vzc2lvblRlc3QoImludHJvU2Vzc2lvblRlc3RzIiwKLQkJCQlJbnRyb1Nlc3Npb25UZXN0cy5jbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEFkZCBlZGl0b3IgdGVzdHMgdGhhdCBpbnZvbHZlIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBzZXNzaW9ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRWRpdG9yVGVzdHMoKSB7Ci0JCWFkZFRlc3QobmV3IFdvcmtiZW5jaFNlc3Npb25UZXN0KCJlZGl0b3JTZXNzaW9uVGVzdHMiLAotCQkJCUJ1Zzk1MzU3VGVzdC5jbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHZpZXcgc3RhdGUgdGVzdCB0aGF0IGludm9sdmVzIHN0YXRlIGZyb20gb25lIHNlc3Npb24gdG8gdGhlIG90aGVyLgotCSAqIAotCSAqIEJUVzogdGhlIDxiPmVkaXRvclNlc3Npb25UZXN0czwvYj4gaXMgdGhlIHppcCBmaWxlIHRvIGdyYWIgdGhlCi0JICogZGVmYXVsdCB3b3Jrc3BhY2UgZm9yIHRoZXNlIHBhcnRpY3VsYXIgc2Vzc2lvbiB0ZXN0cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVmlld1N0YXRlVGVzdHMoKSB7Ci0JCWFkZFRlc3QobmV3IFdvcmtiZW5jaFNlc3Npb25UZXN0KCJlZGl0b3JTZXNzaW9uVGVzdHMiLAotCQkJCUJ1Zzk4ODAwVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBXb3JrYmVuY2hTZXNzaW9uVGVzdCgiZWRpdG9yU2Vzc2lvblRlc3RzIiwKLQkJCQlCdWcxMDgwMzNUZXN0LmNsYXNzKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9zZXNzaW9uL1ZpZXdXaXRoU3RhdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvc2Vzc2lvbi9WaWV3V2l0aFN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTkzNDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9zZXNzaW9uL1ZpZXdXaXRoU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5zZXNzaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBWaWV3V2l0aFN0YXRlIGV4dGVuZHMgVmlld1BhcnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFID0gInN0YXRlIjsKLQotCXB1YmxpYyBpbnQgZlN0YXRlID0gMDsKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbC5zZXRUZXh0KCJUaGlzIHZpZXcgc2hvdWxkIGhhdmUgc29tZSBzYXZlZCBzdGF0ZTogIiArIGZTdGF0ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlLCBJTWVtZW50byBtZW1lbnRvKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUsIG1lbWVudG8pOwotCQlpZiAobWVtZW50byAhPSBudWxsKSB7Ci0JCQlJbnRlZ2VyIGkgPSBtZW1lbnRvLmdldEludGVnZXIoU1RBVEUpOwotCQkJaWYgKGkgIT0gbnVsbCkgewotCQkJCWZTdGF0ZSA9IGkuaW50VmFsdWUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCW1lbWVudG8ucHV0SW50ZWdlcihTVEFURSwgZlN0YXRlKTsKLQkJc3VwZXIuc2F2ZVN0YXRlKG1lbWVudG8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvc2Vzc2lvbi9Xb3JrYmVuY2hTZXNzaW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9zZXNzaW9uL1dvcmtiZW5jaFNlc3Npb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzg3MjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9zZXNzaW9uL1dvcmtiZW5jaFNlc3Npb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuc2Vzc2lvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzLkZpbGVTeXN0ZW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5zZXNzaW9uLlNlc3Npb25UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5zZXNzaW9uLlNldHVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuc2Vzc2lvbi5TZXR1cE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5zZXNzaW9uLlNldHVwTWFuYWdlci5TZXR1cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5GaWxlVG9vbDsKLQotLyoqCi0gKiBXcmFwcGVyIGZvciB3b3JrYmVuY2ggc2Vzc2lvbiB0ZXN0cy4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoU2Vzc2lvblRlc3QgZXh0ZW5kcyBTZXNzaW9uVGVzdFN1aXRlIHsKLQotCXByaXZhdGUgU3RyaW5nIGRhdGFMb2NhdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgd29ya2JlbmNoIHNlc3Npb24gdGVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gZGF0YUxvY2F0aW9uCi0JICogICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgdGhlIHdvcmtzcGFjZSB0byB0ZXN0LCByZWxhdGl2ZSB0bwotCSAqICAgICAgICAgICAgZGF0YS93b3Jrc3BhY2VzCi0JICogQHBhcmFtIGNsYXp6Ci0JICogICAgICAgICAgICB0aGUgPGNvZGU+VGVzdDwvY29kZT4gY2xhc3MKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoU2Vzc2lvblRlc3QoU3RyaW5nIGRhdGFMb2NhdGlvbiwgQ2xhc3MgY2xhenopIHsKLQkJc3VwZXIoIm9yZy5lY2xpcHNlLnVpLnRlc3RzIiwgY2xhenopOwotCQlzZXRBcHBsaWNhdGlvbklkKFNlc3Npb25UZXN0U3VpdGUuVUlfVEVTVF9BUFBMSUNBVElPTik7CQkKLQkJdGhpcy5kYXRhTG9jYXRpb24gPSBkYXRhTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyBzZXR1cCB1c2VzIHRoaXMgc3VpdGUncyBpbnN0YW5jZSBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAdGhyb3dzIFNldHVwRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIFNldHVwIG5ld1NldHVwKCkgdGhyb3dzIFNldHVwRXhjZXB0aW9uIHsKLQkJU2V0dXAgYmFzZSA9IHN1cGVyLm5ld1NldHVwKCk7Ci0JCXRyeSB7Ci0JCQliYXNlLnNldEVjbGlwc2VBcmd1bWVudChTZXR1cC5EQVRBLCBjb3B5RGF0YUxvY2F0aW9uKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgU2V0dXBNYW5hZ2VyLmdldEluc3RhbmNlKCkubmV3IFNldHVwRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLAotCQkJCQllKTsKLQkJfQotCQlyZXR1cm4gYmFzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGRhdGEgdG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBuZXcgbG9jYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYXRpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjb3B5RGF0YUxvY2F0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFBsdWdpbiBwbHVnaW4gPSBUZXN0UGx1Z2luLmdldERlZmF1bHQoKTsKLSAgICAgICAgaWYgKHBsdWdpbiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRlc3RQbHVnaW4gZGVmYXVsdCByZWZlcmVuY2UgaXMgbnVsbCIpOwotICAgICAgICAKLSAgICAgICAgVVJMIGZ1bGxQYXRoU3RyaW5nID0gcGx1Z2luLmdldERlc2NyaXB0b3IoKS5maW5kKAotCQkJCW5ldyBQYXRoKCJkYXRhL3dvcmtzcGFjZXMvIiArIGRhdGFMb2NhdGlvbiArICIuemlwIikpOwotICAgICAgICAKLSAgICAgICAgaWYgKGZ1bGxQYXRoU3RyaW5nID09IG51bGwpIAotICAgICAgICAJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAKLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZ1bGxQYXRoU3RyaW5nLmdldFBhdGgoKSk7Ci0KLSAgICAgICAgRmlsZSBvcmlnaW4gPSBwYXRoLnRvRmlsZSgpOwotICAgICAgICBpZiAoIW9yaWdpbi5leGlzdHMoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIFppcEZpbGUgekZpbGUgPSBuZXcgWmlwRmlsZShvcmlnaW4pOyAgICAgICAgCi0JCQotCQlGaWxlIGRlc3RpbmF0aW9uID0gbmV3IEZpbGUoRmlsZVN5c3RlbUhlbHBlci5nZXRSYW5kb21Mb2NhdGlvbihGaWxlU3lzdGVtSGVscGVyLmdldFRlbXBEaXIoKSkudG9PU1N0cmluZygpKTsKLQkJRmlsZVRvb2wudW56aXAoekZpbGUsIGRlc3RpbmF0aW9uKTsKLQkJcmV0dXJuIGRlc3RpbmF0aW9uLmdldEFic29sdXRlUGF0aCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvc3RyZXNzL09wZW5DbG9zZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvc3RyZXNzL09wZW5DbG9zZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMTJhOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3N0cmVzcy9PcGVuQ2xvc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnN0cmVzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuQ2xvc2VQZXJzcGVjdGl2ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5oYXJuZXNzLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCBvcGVuaW5nIGFuZCBjbG9zaW5nIG9mIGl0ZW1zLgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNsb3NlVGVzdCBleHRlbmRzIFVJVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGludCBpbmRleDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBudW1JdGVyYXRpb25zID0gMTA7Ci0KLSAgICBwcml2YXRlIFdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3c7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKiAgICAgICAgICAgIFRlc3QncyBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBPcGVuQ2xvc2VUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgICAgIHdvcmtiZW5jaFdpbmRvdyA9IChXb3JrYmVuY2hXaW5kb3cpIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBvZiBhIGZpbGUuCi0gICAgICogIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQ2xvc2VGaWxlKCkgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIlRlc3RQcm9qZWN0Iik7Ci0gICAgICAgICAgICBJUHJvamVjdCB0ZXN0UHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb2plY3QoIlRlc3RQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEZpbGVVdGlsLmNyZWF0ZUZpbGUoInRlbXBGaWxlLnR4dCIsIHRlc3RQcm9qZWN0KTsKLSAgICAgICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KHRlc3RQcm9qZWN0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRGaWxlKCJ0ZW1wRmlsZS50eHQiKSk7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bUl0ZXJhdGlvbnM7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKGVkaXRvcklucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLnVpLkRlZmF1bHRUZXh0RWRpdG9yIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBwYWdlLmNsb3NlRWRpdG9yKGVkaXRvclBhcnQsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGVVdGlsLmRlbGV0ZVByb2plY3QodGVzdFByb2plY3QpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IG9wZW5pbmcgYW5kIGNsb3Npbmcgb2Ygd29ya2JlbmNoIHdpbmRvdy4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5DbG9zZVdvcmtiZW5jaFdpbmRvdygpIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyBzZWNvbmRXb3JrYmVuY2hXaW5kb3cgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtSXRlcmF0aW9uczsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgIHNlY29uZFdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuV29ya2JlbmNoV2luZG93KGdldFBhZ2VJbnB1dCgpKTsKLSAgICAgICAgICAgICAgICBzZWNvbmRXb3JrYmVuY2hXaW5kb3cuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBvcGVuIGFuZCBjbG9zZSBvZiBwZXJzcGVjdGl2ZS4KLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5DbG9zZVBlcnNwZWN0aXZlKCkgewotICAgICAgICBDbG9zZVBlcnNwZWN0aXZlQWN0aW9uIGNsb3NlUGVzcGVjdGl2ZSA9IG5ldyBDbG9zZVBlcnNwZWN0aXZlQWN0aW9uKAotICAgICAgICAgICAgICAgIHdvcmtiZW5jaFdpbmRvdyk7Ci0gICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bUl0ZXJhdGlvbnM7IGluZGV4KyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5zaG93UGVyc3BlY3RpdmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuamR0LnVpLkphdmFQZXJzcGVjdGl2ZSIsIHdvcmtiZW5jaFdpbmRvdyk7Ci0gICAgICAgICAgICAgICAgY2xvc2VQZXNwZWN0aXZlLnJ1bigpOwotICAgICAgICAgICAgfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBvcGVuIGFuZCBjbG9zZSBvZiB2aWV3LgotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkNsb3NlVmlldygpIHsKLSAgICAgICAgSVZpZXdQYXJ0IGNvbnNvbGVWaWV3ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnNob3dQZXJzcGVjdGl2ZSgKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiLCB3b3JrYmVuY2hXaW5kb3cpOwotICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtSXRlcmF0aW9uczsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgIGNvbnNvbGVWaWV3ID0gcGFnZQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5SZXNvdXJjZU5hdmlnYXRvciIpOwotICAgICAgICAgICAgICAgIHBhZ2UuaGlkZVZpZXcoY29uc29sZVZpZXcpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qgb3BlbiBhbmQgY2xvc2UgaW50cm8uCi0gICAgICogIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQ2xvc2VJbnRybygpIHsKLSAgICAgICAgSUludHJvUGFydCBpbnRyb1BhcnQgPSBudWxsOwotICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1JdGVyYXRpb25zOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBpbnRyb1BhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEludHJvTWFuYWdlcigpLnNob3dJbnRybygKLSAgICAgICAgICAgICAgICAgICAgd29ya2JlbmNoV2luZG93LCBmYWxzZSk7Ci0gICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEludHJvTWFuYWdlcigpLmNsb3NlSW50cm8oaW50cm9QYXJ0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvc3RyZXNzL09wZW5DbG9zZVRlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9zdHJlc3MvT3BlbkNsb3NlVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNWZiZDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy9zdHJlc3MvT3BlbkNsb3NlVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuc3RyZXNzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUZXN0IGFsbCBhcmVhcyBvZiB0aGUgVUkgQVBJLgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNsb3NlVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1aXRlLiAgVGhpcyBpcyByZXF1aXJlZCB0bwotICAgICAqIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IE9wZW5DbG9zZVRlc3RTdWl0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCB0aGUgdGVzdCBzdWl0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlbkNsb3NlVGVzdFN1aXRlKCkgewotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoT3BlbkNsb3NlVGVzdC5jbGFzcykpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy90aGVtZXMvSkZhY2VUaGVtZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvdGhlbWVzL0pGYWNlVGhlbWVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2N2YzNzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy90aGVtZXMvSkZhY2VUaGVtZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy50aGVtZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkZvbnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRoZW1lcy5JVGhlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGhlbWVzLklUaGVtZU1hbmFnZXI7Ci0KLS8qKgotICogVGVzdHMgdGhlIHB1c2hpbmcgZG93biBvZiBjdXJyZW50IHRoZW1lIGNoYW5nZXMgaW50byBKRmFjZS4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VUaGVtZVRlc3QgZXh0ZW5kcyBUaGVtZVRlc3QgewotCi0gICAgcHVibGljIEpGYWNlVGhlbWVUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEFuZFRlc3QoU3RyaW5nIHRoZW1lSWQsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgSkZhY2VSZXNvdXJjZXMuZ2V0Q29sb3JSZWdpc3RyeSgpLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgZk1hbmFnZXIuc2V0Q3VycmVudFRoZW1lKHRoZW1lSWQpOwotICAgICAgICBJVGhlbWUgdGhlbWUgPSBmTWFuYWdlci5nZXRUaGVtZSh0aGVtZUlkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRoZW1lLCBmTWFuYWdlci5nZXRDdXJyZW50VGhlbWUoKSk7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZvbnRSZWdpc3RyeSBqZmFjZUZvbnRzID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICBGb250UmVnaXN0cnkgdGhlbWVGb250cyA9IHRoZW1lLmdldEZvbnRSZWdpc3RyeSgpOwotICAgICAgICAgICAgLy8gZG9uJ3QgdGVzdCBmb3IgZXF1YWxpdHkgLSBvdGhlciB0ZXN0cyAob3IgY2xpZW50cykgbWF5IGJlIHB1c2hpbmcgCi0gICAgICAgICAgICAvLyBuZXcgaXRlbXMgaW50byBqZmFjZQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShqZmFjZUZvbnRzLmdldEtleVNldCgpLmNvbnRhaW5zQWxsKAotICAgICAgICAgICAgICAgICAgICB0aGVtZUZvbnRzLmdldEtleVNldCgpKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0aGVtZUZvbnRzLmdldEtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh0aGVtZUZvbnRzLmdldEZvbnREYXRhKGtleSksIGpmYWNlRm9udHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGb250RGF0YShrZXkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBDb2xvclJlZ2lzdHJ5IGpmYWNlQ29sb3JzID0gSkZhY2VSZXNvdXJjZXMuZ2V0Q29sb3JSZWdpc3RyeSgpOwotICAgICAgICAgICAgQ29sb3JSZWdpc3RyeSB0aGVtZUNvbG9ycyA9IHRoZW1lLmdldENvbG9yUmVnaXN0cnkoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoamZhY2VDb2xvcnMuZ2V0S2V5U2V0KCkuY29udGFpbnNBbGwoCi0gICAgICAgICAgICAgICAgICAgIHRoZW1lQ29sb3JzLmdldEtleVNldCgpKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0aGVtZUNvbG9ycy5nZXRLZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRoZW1lQ29sb3JzLmdldFJHQihrZXkpLCBqZmFjZUNvbG9ycy5nZXRSR0Ioa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBKRmFjZVJlc291cmNlcy5nZXRDb2xvclJlZ2lzdHJ5KCkucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRPRE86IGRldGFpbGVkIGNoZWNraW5nIG9mIHRoZSBldmVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHVzaGRvd24oKSB7Ci0gICAgICAgIFRoZW1lUHJvcGVydHlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUaGVtZVByb3BlcnR5TGlzdGVuZXIoKTsKLSAgICAgICAgc2V0QW5kVGVzdChUSEVNRTEsIGxpc3RlbmVyKTsKLSAgICAgICAgLy8gdGVuIGNoYW5nZXMsIG5vdCB0aGUgYXBwYXJlbnQgNiAtIHJlbWVtYmVyIHRoZSBjaGFuZ2VzIGZvciB0aGUgZGVmYXVsdGVkIGVsZW1lbnRzCi0gICAgICAgIGFzc2VydEVxdWFscygxMCwgbGlzdGVuZXIuZ2V0RXZlbnRzKCkuc2l6ZSgpKTsKLSAgICAgICAgbGlzdGVuZXIuZ2V0RXZlbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgc2V0QW5kVGVzdChJVGhlbWVNYW5hZ2VyLkRFRkFVTFRfVEhFTUUsIGxpc3RlbmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBsaXN0ZW5lci5nZXRFdmVudHMoKS5zaXplKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvdGhlbWVzL1Rlc3RDb2xvckZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvdGhlbWVzL1Rlc3RDb2xvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5MmNlNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3RoZW1lcy9UZXN0Q29sb3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMudGhlbWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50aGVtZXMuSUNvbG9yRmFjdG9yeTsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q29sb3JGYWN0b3J5IGltcGxlbWVudHMgSUNvbG9yRmFjdG9yeSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJHQiBSR0IgPSBuZXcgUkdCKDkxLCA5MiwgOTMpOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGhlbWVzLklDb2xvckZhY3RvcnkjY3JlYXRlQ29sb3IoKQotICAgICAqLwotICAgIHB1YmxpYyBSR0IgY3JlYXRlQ29sb3IoKSB7Ci0gICAgICAgIHJldHVybiBSR0I7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3RoZW1lcy9UaGVtZUFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvdGhlbWVzL1RoZW1lQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWFmZmE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvdGhlbWVzL1RoZW1lQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy50aGVtZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Gb250UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudGhlbWVzLlRoZW1lRWxlbWVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC51dGlsLlByZWZVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRoZW1lcy5JVGhlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGhlbWVzLklUaGVtZU1hbmFnZXI7Ci0KLS8qKgotICogVGVzdHMgdGhlIHRoZW1lIEFQSS4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVGhlbWVBUElUZXN0IGV4dGVuZHMgVGhlbWVUZXN0IHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBUaGVtZUFQSVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tFdmVudHMoVGhlbWVQcm9wZXJ0eUxpc3RlbmVyIGxpc3RlbmVyLCBPYmplY3Qgc291cmNlLAotICAgICAgICAgICAgT2JqZWN0IG9sZE9iamVjdCwgT2JqZWN0IG5ld09iamVjdCkgewotICAgICAgICBib29sZWFuIGFycmF5ID0gb2xkT2JqZWN0IGluc3RhbmNlb2YgT2JqZWN0W107Ci0gICAgICAgIExpc3QgZXZlbnRzID0gbGlzdGVuZXIuZ2V0RXZlbnRzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBldmVudHMuc2l6ZSgpKTsKLSAgICAgICAgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IChQcm9wZXJ0eUNoYW5nZUV2ZW50KSBldmVudHMuZ2V0KDApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLSAgICAgICAgaWYgKGFycmF5KSB7Ci0gICAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscygoT2JqZWN0W10pIG9sZE9iamVjdCwgKE9iamVjdFtdKSBldmVudAotICAgICAgICAgICAgICAgICAgICAuZ2V0T2xkVmFsdWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscygoT2JqZWN0W10pIG5ld09iamVjdCwgKE9iamVjdFtdKSBldmVudAotICAgICAgICAgICAgICAgICAgICAuZ2V0TmV3VmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMob2xkT2JqZWN0LCBldmVudC5nZXRPbGRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXdPYmplY3QsIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXZlbnQgPSAoUHJvcGVydHlDaGFuZ2VFdmVudCkgZXZlbnRzLmdldCgxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotICAgICAgICBpZiAoYXJyYXkpIHsKLSAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKChPYmplY3RbXSkgb2xkT2JqZWN0LCAoT2JqZWN0W10pIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXROZXdWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKChPYmplY3RbXSkgbmV3T2JqZWN0LCAoT2JqZWN0W10pIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRPbGRWYWx1ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhvbGRPYmplY3QsIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld09iamVjdCwgZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkRhdGFDb252ZXJzaW9uKCkgewotICAgICAgICBJVGhlbWUgZGVmYXVsdFRoZW1lID0gZ2V0RGVmYXVsdFRoZW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdFRoZW1lLmdldEJvb2xlYW4oImRhdGExIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRUaGVtZS5nZXRCb29sZWFuKCJkYXRhMiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0VGhlbWUuZ2V0Qm9vbGVhbigiaW50MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0VGhlbWUuZ2V0Qm9vbGVhbigiQk9HVVNLRVkiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0VGhlbWUuZ2V0Qm9vbGVhbigiYm9vbDEiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbG9yQ2FzY2FkZUV2ZW50cygpIHsKLSAgICAgICAgSVRoZW1lIGN1cnJlbnRUaGVtZSA9IGZNYW5hZ2VyLmdldEN1cnJlbnRUaGVtZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGN1cnJlbnRUaGVtZSk7Ci0KLSAgICAgICAgVGhlbWVQcm9wZXJ0eUxpc3RlbmVyIG1hbmFnZXJMaXN0ZW5lciA9IG5ldyBUaGVtZVByb3BlcnR5TGlzdGVuZXIoKTsKLSAgICAgICAgVGhlbWVQcm9wZXJ0eUxpc3RlbmVyIHRoZW1lTGlzdGVuZXIgPSBuZXcgVGhlbWVQcm9wZXJ0eUxpc3RlbmVyKCk7Ci0gICAgICAgIGZNYW5hZ2VyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobWFuYWdlckxpc3RlbmVyKTsKLSAgICAgICAgY3VycmVudFRoZW1lLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhlbWVMaXN0ZW5lcik7Ci0KLSAgICAgICAgQ29sb3JSZWdpc3RyeSBjb2xvclJlZ2lzdHJ5ID0gY3VycmVudFRoZW1lLmdldENvbG9yUmVnaXN0cnkoKTsKLSAgICAgICAgUkdCIG9sZENvbG9yID0gY29sb3JSZWdpc3RyeS5nZXRSR0IoInJnYmNvbG9yIik7Ci0gICAgICAgIFJHQiBuZXdDb2xvciA9IG5ldyBSR0IoMTIxLCA5LCAxMjEpOwotICAgICAgICBjb2xvclJlZ2lzdHJ5LnB1dCgicmdiY29sb3IiLCBuZXdDb2xvcik7Ci0gICAgICAgIGNvbG9yUmVnaXN0cnkucHV0KCJyZ2Jjb2xvciIsIG9sZENvbG9yKTsKLQotICAgICAgICBjaGVja0V2ZW50cyhtYW5hZ2VyTGlzdGVuZXIsIGNvbG9yUmVnaXN0cnksIG9sZENvbG9yLCBuZXdDb2xvcik7Ci0gICAgICAgIGNoZWNrRXZlbnRzKHRoZW1lTGlzdGVuZXIsIGNvbG9yUmVnaXN0cnksIG9sZENvbG9yLCBuZXdDb2xvcik7Ci0KLSAgICAgICAgZk1hbmFnZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihtYW5hZ2VyTGlzdGVuZXIpOwotICAgICAgICBjdXJyZW50VGhlbWUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGVtZUxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sb3JGYWN0b3J5KCkgewotICAgICAgICBJVGhlbWUgZGVmYXVsdFRoZW1lID0gZ2V0RGVmYXVsdFRoZW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0Q29sb3JGYWN0b3J5LlJHQiwgZGVmYXVsdFRoZW1lLmdldENvbG9yUmVnaXN0cnkoKQotICAgICAgICAgICAgICAgIC5nZXRSR0IoImZhY3Rvcnljb2xvciIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sb3JQcmVmZXJlbmNlTGlzdGVuZXJfZGVmX3N3dGNvbG9yKCkgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUHJlZlV0aWwuZ2V0SW50ZXJuYWxQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgSVRoZW1lIGRlZmF1bHRUaGVtZSA9IGdldERlZmF1bHRUaGVtZSgpOwotCi0gICAgICAgIHRlc3RPdmVycmlkZUNvbG9yUHJlZmVyZW5jZShkZWZhdWx0VGhlbWUsIHN0b3JlLCAic3d0Y29sb3IiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sb3JQcmVmZXJlbmNlTGlzdGVuZXJfZGVmX3JnYmNvbG9yKCkgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUHJlZlV0aWwuZ2V0SW50ZXJuYWxQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgSVRoZW1lIGRlZmF1bHRUaGVtZSA9IGdldERlZmF1bHRUaGVtZSgpOwotCi0gICAgICAgIHRlc3RPdmVycmlkZUNvbG9yUHJlZmVyZW5jZShkZWZhdWx0VGhlbWUsIHN0b3JlLCAicmdiY29sb3IiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sb3JQcmVmZXJlbmNlTGlzdGVuZXJfZGVmX2RlZmF1bHRlZGNvbG9yKCkgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUHJlZlV0aWwuZ2V0SW50ZXJuYWxQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgSVRoZW1lIGRlZmF1bHRUaGVtZSA9IGdldERlZmF1bHRUaGVtZSgpOwotCi0gICAgICAgIHRlc3RPdmVycmlkZUNvbG9yUHJlZmVyZW5jZShkZWZhdWx0VGhlbWUsIHN0b3JlLCAiZGVmYXVsdGVkY29sb3IiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sb3JQcmVmZXJlbmNlTGlzdGVuZXJfZGVmX25vb3ZlcnJpZGVjb2xvcigpIHsKLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFByZWZVdGlsLmdldEludGVybmFsUHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLQotICAgICAgICB0ZXN0T3ZlcnJpZGVDb2xvclByZWZlcmVuY2UoZGVmYXVsdFRoZW1lLCBzdG9yZSwgIm5vb3ZlcnJpZGVjb2xvciIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xvclByZWZlcmVuY2VMaXN0ZW5lcl90aDFfc3d0Y29sb3IoKSB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcmVmVXRpbC5nZXRJbnRlcm5hbFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICBJVGhlbWUgdGhlbWUxID0gZ2V0VGhlbWUxKCk7Ci0KLSAgICAgICAgdGVzdE92ZXJyaWRlQ29sb3JQcmVmZXJlbmNlKHRoZW1lMSwgc3RvcmUsICJzd3Rjb2xvciIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xvclByZWZlcmVuY2VMaXN0ZW5lcl90aDFfcmdiY29sb3IoKSB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcmVmVXRpbC5nZXRJbnRlcm5hbFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICBJVGhlbWUgdGhlbWUxID0gZ2V0VGhlbWUxKCk7Ci0KLSAgICAgICAgdGVzdE92ZXJyaWRlQ29sb3JQcmVmZXJlbmNlKHRoZW1lMSwgc3RvcmUsICJyZ2Jjb2xvciIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xvclByZWZlcmVuY2VMaXN0ZW5lcl90aDFfZGVmYXVsdGVkY29sb3IoKSB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcmVmVXRpbC5nZXRJbnRlcm5hbFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICBJVGhlbWUgdGhlbWUxID0gZ2V0VGhlbWUxKCk7Ci0KLSAgICAgICAgdGVzdE92ZXJyaWRlQ29sb3JQcmVmZXJlbmNlKHRoZW1lMSwgc3RvcmUsICJkZWZhdWx0ZWRjb2xvciIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xvclByZWZlcmVuY2VMaXN0ZW5lcl90aDFfbm9vdmVycmlkZWNvbG9yKCkgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUHJlZlV0aWwuZ2V0SW50ZXJuYWxQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgSVRoZW1lIHRoZW1lMSA9IGdldFRoZW1lMSgpOwotCi0gICAgICAgIHRlc3RPdmVycmlkZUNvbG9yUHJlZmVyZW5jZSh0aGVtZTEsIHN0b3JlLCAibm9vdmVycmlkZWNvbG9yIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERhdGFLZXlTZXRfZGF0YTEoKSB7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLSAgICAgICAgU2V0IHRoZW1lS2V5cyA9IGRlZmF1bHRUaGVtZS5rZXlTZXQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHRoZW1lS2V5cy5jb250YWlucygiZGF0YTEiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERhdGFLZXlTZXRfZGF0YTIoKSB7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLSAgICAgICAgU2V0IHRoZW1lS2V5cyA9IGRlZmF1bHRUaGVtZS5rZXlTZXQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHRoZW1lS2V5cy5jb250YWlucygiZGF0YTIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERhdGFLZXlTZXRfaW50MSgpIHsKLSAgICAgICAgSVRoZW1lIGRlZmF1bHRUaGVtZSA9IGdldERlZmF1bHRUaGVtZSgpOwotICAgICAgICBTZXQgdGhlbWVLZXlzID0gZGVmYXVsdFRoZW1lLmtleVNldCgpOwotCi0gICAgICAgIGFzc2VydFRydWUodGhlbWVLZXlzLmNvbnRhaW5zKCJpbnQxIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhS2V5U2V0X2Jvb2wxKCkgewotICAgICAgICBJVGhlbWUgZGVmYXVsdFRoZW1lID0gZ2V0RGVmYXVsdFRoZW1lKCk7Ci0gICAgICAgIFNldCB0aGVtZUtleXMgPSBkZWZhdWx0VGhlbWUua2V5U2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0aGVtZUtleXMuY29udGFpbnMoImJvb2wxIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhS2V5U2V0X0JPR1VTS0VZKCkgewotICAgICAgICBJVGhlbWUgZGVmYXVsdFRoZW1lID0gZ2V0RGVmYXVsdFRoZW1lKCk7Ci0gICAgICAgIFNldCB0aGVtZUtleXMgPSBkZWZhdWx0VGhlbWUua2V5U2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UodGhlbWVLZXlzLmNvbnRhaW5zKCJCT0dVU0tFWSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YU92ZXJyaWRlX2RhdGExKCkgewotICAgICAgICBJVGhlbWUgdGhlbWUxID0gZ2V0VGhlbWUxKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvdmVycmlkZTEiLCB0aGVtZTEuZ2V0U3RyaW5nKCJkYXRhMSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YU92ZXJyaWRlX2RhdGEyKCkgewotICAgICAgICBJVGhlbWUgdGhlbWUxID0gZ2V0VGhlbWUxKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTIiLCB0aGVtZTEuZ2V0U3RyaW5nKCJkYXRhMiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdGVkQ29sb3JfcmdiY29sb3IoKSB7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRlZmF1bHRUaGVtZS5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0UkdCKCJyZ2Jjb2xvciIpLAotICAgICAgICAgICAgICAgIGRlZmF1bHRUaGVtZS5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0UkdCKCJkZWZhdWx0ZWRjb2xvciIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdGVkQ29sb3JfZGVmYXVsdGVkY29sb3IoKSB7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRlZmF1bHRUaGVtZS5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0UkdCKCJkZWZhdWx0ZWRjb2xvciIpLAotICAgICAgICAgICAgICAgIGRlZmF1bHRUaGVtZS5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0UkdCKCJkZWZhdWx0ZWRjb2xvcjIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRlZENvbG9yX2RlZmF1bHRlZGNvbG9yMigpIHsKLSAgICAgICAgSVRoZW1lIGRlZmF1bHRUaGVtZSA9IGdldERlZmF1bHRUaGVtZSgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhkZWZhdWx0VGhlbWUuZ2V0Q29sb3JSZWdpc3RyeSgpLmdldFJHQigiZGVmYXVsdGVkY29sb3IyIiksCi0gICAgICAgICAgICAgICAgZGVmYXVsdFRoZW1lLmdldENvbG9yUmVnaXN0cnkoKS5nZXRSR0IoImRlZmF1bHRlZGNvbG9yMyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdGVkRm9udF92YWxmb250KCkgewotICAgICAgICBJVGhlbWUgZGVmYXVsdFRoZW1lID0gZ2V0RGVmYXVsdFRoZW1lKCk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKAotICAgICAgICAgICAgICAgIGRlZmF1bHRUaGVtZS5nZXRGb250UmVnaXN0cnkoKS5nZXRGb250RGF0YSgidmFsZm9udCIpLAotICAgICAgICAgICAgICAgIGRlZmF1bHRUaGVtZS5nZXRGb250UmVnaXN0cnkoKS5nZXRGb250RGF0YSgiZGVmYXVsdGVkZm9udCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdGVkRm9udF9kZWZhdWx0ZWRmb250KCkgewotICAgICAgICBJVGhlbWUgZGVmYXVsdFRoZW1lID0gZ2V0RGVmYXVsdFRoZW1lKCk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGRlZmF1bHRUaGVtZS5nZXRGb250UmVnaXN0cnkoKS5nZXRGb250RGF0YSgKLSAgICAgICAgICAgICAgICAiZGVmYXVsdGVkZm9udCIpLCBkZWZhdWx0VGhlbWUuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Rm9udERhdGEoCi0gICAgICAgICAgICAgICAgImRlZmF1bHRlZGZvbnQyIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0ZWRGb250X2RlZmF1bHRlZGZvbnQyKCkgewotICAgICAgICBJVGhlbWUgZGVmYXVsdFRoZW1lID0gZ2V0RGVmYXVsdFRoZW1lKCk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGRlZmF1bHRUaGVtZS5nZXRGb250UmVnaXN0cnkoKS5nZXRGb250RGF0YSgKLSAgICAgICAgICAgICAgICAiZGVmYXVsdGVkZm9udDIiKSwgZGVmYXVsdFRoZW1lLmdldEZvbnRSZWdpc3RyeSgpLmdldEZvbnREYXRhKAotICAgICAgICAgICAgICAgICJkZWZhdWx0ZWRmb250MyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdGVkRm9udE92ZXJyaWRlX3ZhbGZvbnQoKSB7Ci0gICAgICAgIElUaGVtZSB0aGVtZTEgPSBnZXRUaGVtZTEoKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHModGhlbWUxLmdldEZvbnRSZWdpc3RyeSgpLmdldEZvbnREYXRhKCJ2YWxmb250IiksCi0gICAgICAgICAgICAgICAgdGhlbWUxLmdldEZvbnRSZWdpc3RyeSgpLmdldEZvbnREYXRhKCJkZWZhdWx0ZWRmb250IikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0ZWRGb250T3ZlcnJpZGVfZGVmYXVsdGVkZm9udDIoKSB7Ci0gICAgICAgIElUaGVtZSB0aGVtZTEgPSBnZXRUaGVtZTEoKTsKLQotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgRm9udERhdGFbXSB7IG5ldyBGb250RGF0YSgiQ291cmllciIsIDE2LAotICAgICAgICAgICAgICAgIFNXVC5OT1JNQUwpIH0sIHRoZW1lMS5nZXRGb250UmVnaXN0cnkoKS5nZXRGb250RGF0YSgKLSAgICAgICAgICAgICAgICAiZGVmYXVsdGVkZm9udDIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRlZEZvbnRPdmVycmlkZV9kZWZhdWx0ZWRmb250MygpIHsKLSAgICAgICAgSVRoZW1lIHRoZW1lMSA9IGdldFRoZW1lMSgpOwotCi0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHRoZW1lMS5nZXRGb250UmVnaXN0cnkoKQotICAgICAgICAgICAgICAgIC5nZXRGb250RGF0YSgiZGVmYXVsdGVkZm9udDIiKSwgdGhlbWUxLmdldEZvbnRSZWdpc3RyeSgpCi0gICAgICAgICAgICAgICAgLmdldEZvbnREYXRhKCJkZWZhdWx0ZWRmb250MyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdGVkT3ZlcnJpZGVDb2xvcl9yZ2Jjb2xvcigpIHsKLSAgICAgICAgSVRoZW1lIHRoZW1lMSA9IGdldFRoZW1lMSgpOwotICAgICAgICBhc3NlcnRFcXVhbHModGhlbWUxLmdldENvbG9yUmVnaXN0cnkoKS5nZXRSR0IoInJnYmNvbG9yIiksIHRoZW1lMQotICAgICAgICAgICAgICAgIC5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0UkdCKCJkZWZhdWx0ZWRjb2xvciIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdGVkT3ZlcnJpZGVDb2xvcl9kZWZhdWx0ZWRjb2xvcjIoKSB7Ci0gICAgICAgIElUaGVtZSB0aGVtZTEgPSBnZXRUaGVtZTEoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSR0IoOSwgOSwgOSksIHRoZW1lMS5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0UkdCKAotICAgICAgICAgICAgICAgICJkZWZhdWx0ZWRjb2xvcjIiKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdGVkT3ZlcnJpZGVDb2xvcl9kZWZhdWx0ZWRjb2xvcjMoKSB7Ci0gICAgICAgIElUaGVtZSB0aGVtZTEgPSBnZXRUaGVtZTEoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRoZW1lMS5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0UkdCKCJkZWZhdWx0ZWRjb2xvcjIiKSwKLSAgICAgICAgICAgICAgICB0aGVtZTEuZ2V0Q29sb3JSZWdpc3RyeSgpLmdldFJHQigiZGVmYXVsdGVkY29sb3IzIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGb250Q2FzY2FkZUV2ZW50cygpIHsKLSAgICAgICAgSVRoZW1lIGN1cnJlbnRUaGVtZSA9IGZNYW5hZ2VyLmdldEN1cnJlbnRUaGVtZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGN1cnJlbnRUaGVtZSk7Ci0KLSAgICAgICAgVGhlbWVQcm9wZXJ0eUxpc3RlbmVyIG1hbmFnZXJMaXN0ZW5lciA9IG5ldyBUaGVtZVByb3BlcnR5TGlzdGVuZXIoKTsKLSAgICAgICAgVGhlbWVQcm9wZXJ0eUxpc3RlbmVyIHRoZW1lTGlzdGVuZXIgPSBuZXcgVGhlbWVQcm9wZXJ0eUxpc3RlbmVyKCk7Ci0gICAgICAgIGZNYW5hZ2VyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobWFuYWdlckxpc3RlbmVyKTsKLSAgICAgICAgY3VycmVudFRoZW1lLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhlbWVMaXN0ZW5lcik7Ci0KLSAgICAgICAgRm9udFJlZ2lzdHJ5IGZvbnRSZWdpc3RyeSA9IGN1cnJlbnRUaGVtZS5nZXRGb250UmVnaXN0cnkoKTsKLSAgICAgICAgRm9udERhdGFbXSBvbGRGb250ID0gZm9udFJlZ2lzdHJ5LmdldEZvbnREYXRhKCJ2YWxmb250Iik7Ci0gICAgICAgIEZvbnREYXRhW10gbmV3Rm9udCA9IG5ldyBGb250RGF0YVtdIHsgbmV3IEZvbnREYXRhKCJDb3VyaWVyIiwgMzAsCi0gICAgICAgICAgICAgICAgU1dULklUQUxJQykgfTsKLSAgICAgICAgZm9udFJlZ2lzdHJ5LnB1dCgidmFsZm9udCIsIG5ld0ZvbnQpOwotICAgICAgICBmb250UmVnaXN0cnkucHV0KCJ2YWxmb250Iiwgb2xkRm9udCk7Ci0KLSAgICAgICAgY2hlY2tFdmVudHMobWFuYWdlckxpc3RlbmVyLCBmb250UmVnaXN0cnksIG9sZEZvbnQsIG5ld0ZvbnQpOwotICAgICAgICBjaGVja0V2ZW50cyh0aGVtZUxpc3RlbmVyLCBmb250UmVnaXN0cnksIG9sZEZvbnQsIG5ld0ZvbnQpOwotCi0gICAgICAgIGZNYW5hZ2VyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobWFuYWdlckxpc3RlbmVyKTsKLSAgICAgICAgY3VycmVudFRoZW1lLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhlbWVMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZvbnRQcmVmZXJlbmNlTGlzdGVuZXJfZGVmX25vdmFsZm9udCgpIHsKLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFByZWZVdGlsLmdldEludGVybmFsUHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLSAgICAgICAgdGVzdE92ZXJyaWRlRm9udFByZWZlcmVuY2UoZGVmYXVsdFRoZW1lLCBzdG9yZSwgIm5vdmFsZm9udCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGb250UHJlZmVyZW5jZUxpc3RlbmVyX2RlZl92YWxmb250KCkgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUHJlZlV0aWwuZ2V0SW50ZXJuYWxQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgSVRoZW1lIGRlZmF1bHRUaGVtZSA9IGdldERlZmF1bHRUaGVtZSgpOwotCi0gICAgICAgIHRlc3RPdmVycmlkZUZvbnRQcmVmZXJlbmNlKGRlZmF1bHRUaGVtZSwgc3RvcmUsICJ2YWxmb250Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZvbnRQcmVmZXJlbmNlTGlzdGVuZXJfZGVmX2RlZmF1bHRlZGZvbnQoKSB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcmVmVXRpbC5nZXRJbnRlcm5hbFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICBJVGhlbWUgZGVmYXVsdFRoZW1lID0gZ2V0RGVmYXVsdFRoZW1lKCk7Ci0KLSAgICAgICAgdGVzdE92ZXJyaWRlRm9udFByZWZlcmVuY2UoZGVmYXVsdFRoZW1lLCBzdG9yZSwgImRlZmF1bHRlZGZvbnQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9udFByZWZlcmVuY2VMaXN0ZW5lcl9kZWZfbm9vdmVycmlkZWZvbnQoKSB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcmVmVXRpbC5nZXRJbnRlcm5hbFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICBJVGhlbWUgZGVmYXVsdFRoZW1lID0gZ2V0RGVmYXVsdFRoZW1lKCk7Ci0KLSAgICAgICAgdGVzdE92ZXJyaWRlRm9udFByZWZlcmVuY2UoZGVmYXVsdFRoZW1lLCBzdG9yZSwgIm5vb3ZlcnJpZGVmb250Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZvbnRQcmVmZXJlbmNlTGlzdGVuZXJfdGgxX3ZhbGZvbnQoKSB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcmVmVXRpbC5nZXRJbnRlcm5hbFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICBJVGhlbWUgdGhlbWUxID0gZ2V0VGhlbWUxKCk7Ci0KLSAgICAgICAgdGVzdE92ZXJyaWRlRm9udFByZWZlcmVuY2UodGhlbWUxLCBzdG9yZSwgInZhbGZvbnQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9udFByZWZlcmVuY2VMaXN0ZW5lcl90aDFfbm92YWxmb250KCkgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUHJlZlV0aWwuZ2V0SW50ZXJuYWxQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgSVRoZW1lIHRoZW1lMSA9IGdldFRoZW1lMSgpOwotCi0gICAgICAgIHRlc3RPdmVycmlkZUZvbnRQcmVmZXJlbmNlKHRoZW1lMSwgc3RvcmUsICJub3ZhbGZvbnQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9udFByZWZlcmVuY2VMaXN0ZW5lcl90aDFfZGVmYXVsdGVkZm9udCgpIHsKLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFByZWZVdGlsLmdldEludGVybmFsUHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIElUaGVtZSB0aGVtZTEgPSBnZXRUaGVtZTEoKTsKLQotICAgICAgICB0ZXN0T3ZlcnJpZGVGb250UHJlZmVyZW5jZSh0aGVtZTEsIHN0b3JlLCAiZGVmYXVsdGVkZm9udCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGb250UHJlZmVyZW5jZUxpc3RlbmVyX3RoMV9ub292ZXJyaWRlZm9udCgpIHsKLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFByZWZVdGlsLmdldEludGVybmFsUHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIElUaGVtZSB0aGVtZTEgPSBnZXRUaGVtZTEoKTsKLQotICAgICAgICB0ZXN0T3ZlcnJpZGVGb250UHJlZmVyZW5jZSh0aGVtZTEsIHN0b3JlLCAibm9vdmVycmlkZWZvbnQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QmFkVGhlbWUoKSB7Ci0gICAgICAgIElUaGVtZSBiYWRUaGVtZSA9IGZNYW5hZ2VyLmdldFRoZW1lKEJPR1VTSUQpOwotICAgICAgICBhc3NlcnROdWxsKGJhZFRoZW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW50RGF0YUNvbnZlcnNpb24oKSB7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRUaGVtZS5nZXRJbnQoImRhdGExIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdFRoZW1lLmdldEludCgiZGF0YTIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBkZWZhdWx0VGhlbWUuZ2V0SW50KCJib29sMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRUaGVtZS5nZXRJbnQoIkJPR1VTS0VZIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMzEzMywgZGVmYXVsdFRoZW1lLmdldEludCgiaW50MSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9WYWxGb250KCkgewotICAgICAgICBJVGhlbWUgZGVmYXVsdFRoZW1lID0gZ2V0RGVmYXVsdFRoZW1lKCk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGRlZmF1bHRUaGVtZS5nZXRGb250UmVnaXN0cnkoKS5kZWZhdWx0Rm9udCgpCi0gICAgICAgICAgICAgICAgLmdldEZvbnREYXRhKCksIGRlZmF1bHRUaGVtZS5nZXRGb250UmVnaXN0cnkoKS5nZXRGb250RGF0YSgKLSAgICAgICAgICAgICAgICAibm92YWxmb250IikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1ZhbEZvbnRPdmVycmlkZSgpIHsKLSAgICAgICAgSVRoZW1lIHRoZW1lMSA9IGdldFRoZW1lMSgpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgRm9udERhdGFbXSB7IG5ldyBGb250RGF0YSgiQ291cmllciIsIDEwLAotICAgICAgICAgICAgICAgIFNXVC5JVEFMSUMpIH0sIHRoZW1lMS5nZXRGb250UmVnaXN0cnkoKQotICAgICAgICAgICAgICAgIC5nZXRGb250RGF0YSgibm92YWxmb250IikpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RPdmVycmlkZUNvbG9yUHJlZmVyZW5jZShJVGhlbWUgdGhlbWUsCi0gICAgICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgY29sb3IpIHsKLSAgICAgICAgUkdCIG9sZFJHQiA9IHRoZW1lLmdldENvbG9yUmVnaXN0cnkoKS5nZXRSR0IoY29sb3IpOwotICAgICAgICBSR0IgbmV3UkdCID0gbmV3IFJHQig3NSwgMjEsIDY4KTsKLQotICAgICAgICBzdG9yZS5zZXRWYWx1ZShUaGVtZUVsZW1lbnRIZWxwZXIuY3JlYXRlUHJlZmVyZW5jZUtleSh0aGVtZSwgY29sb3IpLAotICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlci5hc1N0cmluZyhuZXdSR0IpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld1JHQiwgdGhlbWUuZ2V0Q29sb3JSZWdpc3RyeSgpLmdldFJHQihjb2xvcikpOwotICAgICAgICBzdG9yZQotICAgICAgICAgICAgICAgIC5zZXRUb0RlZmF1bHQoVGhlbWVFbGVtZW50SGVscGVyLmNyZWF0ZVByZWZlcmVuY2VLZXkodGhlbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcikpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2xkUkdCLCB0aGVtZS5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0UkdCKGNvbG9yKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RPdmVycmlkZUZvbnRQcmVmZXJlbmNlKElUaGVtZSB0aGVtZSwKLSAgICAgICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBmb250KSB7Ci0gICAgICAgIEZvbnREYXRhW10gb2xkRm9udCA9IHRoZW1lLmdldEZvbnRSZWdpc3RyeSgpLmdldEZvbnREYXRhKGZvbnQpOwotICAgICAgICBGb250RGF0YVtdIG5ld0ZvbnQgPSBuZXcgRm9udERhdGFbXSB7IG5ldyBGb250RGF0YSgiQ291cmllciIsIDMwLAotICAgICAgICAgICAgICAgIFNXVC5JVEFMSUMpIH07Ci0gICAgICAgIHN0b3JlLnNldFZhbHVlKFRoZW1lRWxlbWVudEhlbHBlci5jcmVhdGVQcmVmZXJlbmNlS2V5KHRoZW1lLCBmb250KSwKLSAgICAgICAgICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLmdldFN0b3JlZFJlcHJlc2VudGF0aW9uKG5ld0ZvbnQpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3Rm9udCwgdGhlbWUuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Rm9udERhdGEoZm9udCkpOwotICAgICAgICBzdG9yZS5zZXRUb0RlZmF1bHQoVGhlbWVFbGVtZW50SGVscGVyLmNyZWF0ZVByZWZlcmVuY2VLZXkodGhlbWUsIGZvbnQpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMob2xkRm9udCwgdGhlbWUuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Rm9udERhdGEoZm9udCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF0Zm9ybUNvbG9yKCkgewotICAgICAgICBJVGhlbWUgZGVmYXVsdFRoZW1lID0gZ2V0RGVmYXVsdFRoZW1lKCk7Ci0gICAgICAgIFJHQiByZ2IgPSBudWxsOwotICAgICAgICAvLyB0ZXN0IGZvciB0d28gc3BlY2lmaWMgcGxhdGZvcm1zIGFuZCBvbmUgZ2VuZXJhbAotICAgICAgICBpZiAoUGxhdGZvcm0uZ2V0V1MoKS5lcXVhbHMoIndpbjMyIikKLSAgICAgICAgICAgICAgICAmJiBQbGF0Zm9ybS5nZXRPUygpLmVxdWFscygid2luMzIiKSkKLSAgICAgICAgICAgIHJnYiA9IG5ldyBSR0IoNTAsIDUwLCA1MCk7Ci0gICAgICAgIGVsc2UgaWYgKFBsYXRmb3JtLmdldFdTKCkuZXF1YWxzKCJndGsiKQotICAgICAgICAgICAgICAgICYmIFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKCJsaW51eCIpKQotICAgICAgICAgICAgcmdiID0gbmV3IFJHQigyNSwgMjUsIDI1KTsKLSAgICAgICAgZWxzZSBpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoImxpbnV4IikpCi0gICAgICAgICAgICByZ2IgPSBuZXcgUkdCKDc1LCA3NSwgNzUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZ2IgPSBuZXcgUkdCKDAsIDAsIDApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhyZ2IsIGRlZmF1bHRUaGVtZS5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0UkdCKAotICAgICAgICAgICAgICAgICJwbGF0Zm9ybWNvbG9yIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF0Zm9ybUZvbnQoKSB7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLSAgICAgICAgRm9udERhdGFbXSBkYXRhID0gbnVsbDsKLSAgICAgICAgaWYgKFBsYXRmb3JtLmdldFdTKCkuZXF1YWxzKCJ3aW4zMiIpCi0gICAgICAgICAgICAgICAgJiYgUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpCi0gICAgICAgICAgICBkYXRhID0gbmV3IEZvbnREYXRhW10geyBuZXcgRm9udERhdGEoIkNvdXJpZXIgTmV3IiwgMTIsIFNXVC5OT1JNQUwpIH07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRm9udERhdGFbXSB7IG5ldyBGb250RGF0YSgiU2FucyIsIDE1LCBTV1QuQk9MRCkgfTsKLQotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhkYXRhLCBkZWZhdWx0VGhlbWUuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Rm9udERhdGEoCi0gICAgICAgICAgICAgICAgInBsYXRmb3JtZm9udCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UkdCQ29sb3IoKSB7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSR0IoMSwgMSwgMiksIGRlZmF1bHRUaGVtZS5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0UkdCKAotICAgICAgICAgICAgICAgICJyZ2Jjb2xvciIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UkdCQ29sb3JPdmVycmlkZSgpIHsKLSAgICAgICAgSVRoZW1lIHRoZW1lMSA9IGdldFRoZW1lMSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJHQigyLCAxLCAxKSwgdGhlbWUxLmdldENvbG9yUmVnaXN0cnkoKS5nZXRSR0IoCi0gICAgICAgICAgICAgICAgInJnYmNvbG9yIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUaGVtZSgpIHsKLSAgICAgICAgVGhlbWVQcm9wZXJ0eUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRoZW1lUHJvcGVydHlMaXN0ZW5lcigpOwotICAgICAgICBmTWFuYWdlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgSVRoZW1lIGN1cnJlbnRUaGVtZSA9IGZNYW5hZ2VyLmdldEN1cnJlbnRUaGVtZSgpOwotICAgICAgICBmTWFuYWdlci5zZXRDdXJyZW50VGhlbWUoQk9HVVNJRCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjdXJyZW50VGhlbWUsIGZNYW5hZ2VyLmdldEN1cnJlbnRUaGVtZSgpKTsKLSAgICAgICAgZk1hbmFnZXIuc2V0Q3VycmVudFRoZW1lKFRIRU1FMSk7Ci0gICAgICAgIGFzc2VydE5vdFNhbWUoY3VycmVudFRoZW1lLCBmTWFuYWdlci5nZXRDdXJyZW50VGhlbWUoKSk7Ci0gICAgICAgIElUaGVtZSBuZXdDdXJyZW50VGhlbWUgPSBmTWFuYWdlci5nZXRDdXJyZW50VGhlbWUoKTsKLSAgICAgICAgSVRoZW1lIHRoZW1lMSA9IGdldFRoZW1lMSgpOwotICAgICAgICBhc3NlcnRFcXVhbHModGhlbWUxLCBuZXdDdXJyZW50VGhlbWUpOwotICAgICAgICBMaXN0IGV2ZW50cyA9IGxpc3RlbmVyLmdldEV2ZW50cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0gICAgICAgIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSAoKFByb3BlcnR5Q2hhbmdlRXZlbnQpIGV2ZW50cy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSVRoZW1lTWFuYWdlci5DSEFOR0VfQ1VSUkVOVF9USEVNRSwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjdXJyZW50VGhlbWUsIGV2ZW50LmdldE9sZFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3Q3VycmVudFRoZW1lLCBldmVudC5nZXROZXdWYWx1ZSgpKTsKLSAgICAgICAgZk1hbmFnZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0RhdGEoKSB7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLCBkZWZhdWx0VGhlbWUuZ2V0U3RyaW5nKCJkYXRhMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTIiLCBkZWZhdWx0VGhlbWUuZ2V0U3RyaW5nKCJkYXRhMiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIzMTMzIiwgZGVmYXVsdFRoZW1lLmdldFN0cmluZygiaW50MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgZGVmYXVsdFRoZW1lLmdldFN0cmluZygiYm9vbDEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0VGhlbWUuZ2V0U3RyaW5nKCJCT0dVU0tFWSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U1dUQ29sb3IoKSB7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0JMVUUpCi0gICAgICAgICAgICAgICAgLmdldFJHQigpLCBkZWZhdWx0VGhlbWUuZ2V0Q29sb3JSZWdpc3RyeSgpLmdldFJHQigic3d0Y29sb3IiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNXVENvbG9yT3ZlcnJpZGUoKSB7Ci0gICAgICAgIElUaGVtZSB0aGVtZTEgPSBnZXRUaGVtZTEoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0dSRUVOKQotICAgICAgICAgICAgICAgIC5nZXRSR0IoKSwgdGhlbWUxLmdldENvbG9yUmVnaXN0cnkoKS5nZXRSR0IoInN3dGNvbG9yIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUaGVtZURlc2NyaXB0aW9uX2RlZmF1bHQoKSB7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKElUaGVtZU1hbmFnZXIuREVGQVVMVF9USEVNRSwgZGVmYXVsdFRoZW1lLmdldElkKCkpOwotICAgICAgICAvLyBkb24ndCBib3RoZXIgdGVzdGluZyBhZ2FpbnN0IHRoZSBhY3R1YWwgdmFsdWUKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZWZhdWx0VGhlbWUuZ2V0TGFiZWwoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRoZW1lRGVzY3JpcHRpb25fdGhlbWUxKCkgewotICAgICAgICBJVGhlbWUgdGhlbWUxID0gZ2V0VGhlbWUxKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUSEVNRTEsIHRoZW1lMS5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IHRoZW1lIDEiLCB0aGVtZTEuZ2V0TGFiZWwoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbEZvbnQoKSB7Ci0gICAgICAgIElUaGVtZSBkZWZhdWx0VGhlbWUgPSBnZXREZWZhdWx0VGhlbWUoKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoCi0gICAgICAgICAgICAgICAgbmV3IEZvbnREYXRhW10geyBuZXcgRm9udERhdGEoIlRhaG9tYSIsIDIwLCBTV1QuQk9MRCkgfSwKLSAgICAgICAgICAgICAgICBkZWZhdWx0VGhlbWUuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Rm9udERhdGEoInZhbGZvbnQiKSk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGhlIGZvbGxvd2luZyB0ZXN0cyBjaGVjayB0byBlbnN1cmUgdGhhdCBzdXBwb3J0IGZvciBtdWx0aXBsZSBleHRlbnNpb25zCi0gICAgICogY29udHJpYnV0aW5nIHRvIHRoZSBzYW1lIHRoZWVtZSB3b3JrLiBUaGV5IGFsc28gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICAgICogZmlyc3QgdmFsdWUgZW5jb3VudGVyZWQgZm9yIGEgZ2l2ZW4gZm9udC9jb2xvdXIgaXMgdGhlIG9ubHkgb25lIHVzZWQuCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFRoZW1lRXh0ZW5zaW9uTmFtZSgpIHsKLSAgICAgICAgSVRoZW1lIGV4dDEgPSBmTWFuYWdlci5nZXRUaGVtZSgiZXh0ZW5kZWRUaGVtZTEiKTsKLSAgICAgICAgSVRoZW1lIGV4dDIgPSBmTWFuYWdlci5nZXRUaGVtZSgiZXh0ZW5kZWRUaGVtZTIiKTsKLSAgICAgICAgSVRoZW1lIGV4dDMgPSBmTWFuYWdlci5nZXRUaGVtZSgiZXh0ZW5kZWRUaGVtZTMiKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygiRXh0ZW5kZWQgVGhlbWUgMSIsIGV4dDEuZ2V0TGFiZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXh0ZW5kZWQgVGhlbWUgMiIsIGV4dDIuZ2V0TGFiZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXh0ZW5kZWQgVGhlbWUgMyIsIGV4dDMuZ2V0TGFiZWwoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUaGVtZUV4dGVuc2lvbkRhdGEoKSB7Ci0gICAgICAgIElUaGVtZSBleHQxID0gZk1hbmFnZXIuZ2V0VGhlbWUoImV4dGVuZGVkVGhlbWUxIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0MS5nZXRTdHJpbmcoImQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImQxIiwgZXh0MS5nZXRTdHJpbmcoImQxIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dDEuZ2V0U3RyaW5nKCJkMiIpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFRoZW1lRXh0ZW5zaW9uQ29sb3IoKSB7Ci0gICAgICAgIElUaGVtZSBleHQxID0gZk1hbmFnZXIuZ2V0VGhlbWUoImV4dGVuZGVkVGhlbWUxIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkVFTikKLSAgICAgICAgICAgICAgICAuZ2V0UkdCKCksIGV4dDEuZ2V0Q29sb3JSZWdpc3RyeSgpLmdldFJHQigic3d0Y29sb3IiKSk7IAotCi0gICAgICAgIGFzc2VydEVxdWFscyhEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkVFTikKLSAgICAgICAgICAgICAgICAuZ2V0UkdCKCksIGV4dDEuZ2V0Q29sb3JSZWdpc3RyeSgpLmdldFJHQigicmdiY29sb3IiKSk7IAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGhlbWVFeHRlbnNpb25Gb250KCkgewotICAgICAgICBJVGhlbWUgZXh0MSA9IGZNYW5hZ2VyLmdldFRoZW1lKCJleHRlbmRlZFRoZW1lMSIpOwotICAgICAgICAKLSAgICAgICAgRm9udERhdGFbXSBmZCA9IG5ldyBGb250RGF0YVtdIHsgbmV3IEZvbnREYXRhKCJTYW5zIiwgMTAsCi0gICAgICAgICAgICAgICAgU1dULk5PUk1BTCkgfTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGZkLCBleHQxLmdldEZvbnRSZWdpc3RyeSgpCi0gICAgICAgICAgICAgICAgLmdldEZvbnREYXRhKCJ2YWxmb250IikpOwotCi0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGZkLCBleHQxLmdldEZvbnRSZWdpc3RyeSgpCi0gICAgICAgICAgICAgICAgLmdldEZvbnREYXRhKCJub3ZhbGZvbnQiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy90aGVtZXMvVGhlbWVQcm9wZXJ0eUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3RoZW1lcy9UaGVtZVByb3BlcnR5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwMzkxMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3RoZW1lcy9UaGVtZVByb3BlcnR5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy50aGVtZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVGhlbWVQcm9wZXJ0eUxpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZXZlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICBldmVudHMuYWRkKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRFdmVudHMoKSB7Ci0gICAgICAgIHJldHVybiBldmVudHM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy90aGVtZXMvVGhlbWVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3RoZW1lcy9UaGVtZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5ZmNiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3RoZW1lcy9UaGVtZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy50aGVtZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLlVJVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGhlbWVzLklUaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50aGVtZXMuSVRoZW1lTWFuYWdlcjsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUaGVtZVRlc3QgZXh0ZW5kcyBVSVRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJPR1VTSUQgPSAiQk9HVVNJRCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVNRTEgPSAidGhlbWUxIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhPYmplY3RbXSBkYXRhcywgT2JqZWN0W10gZGF0YXMyKSB7Ci0gICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhkYXRhcywgZGF0YXMyKSkgewotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gZm9ybWF0QXJyYXkoZGF0YXMpOwotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbCA9IGZvcm1hdEFycmF5KGRhdGFzMik7Ci0gICAgICAgICAgICBmYWlsKCJleHBlY3RlZDo8IiArIGV4cGVjdGVkICsgIj4gYnV0IHdhczo8IiArIGFjdHVhbCArICI+Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmb3JtYXRBcnJheShPYmplY3RbXSBkYXRhcykgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpZiAoZGF0YXMgPT0gbnVsbCkKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIm51bGwiKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCdbJyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChkYXRhc1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKGkgIT0gZGF0YXMubGVuZ3RoIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSVRoZW1lTWFuYWdlciBmTWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBUaGVtZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLlVJVGVzdENhc2UjZG9TZXRVcCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIGZNYW5hZ2VyID0gZldvcmtiZW5jaC5nZXRUaGVtZU1hbmFnZXIoKTsKLSAgICAgICAgZk1hbmFnZXIuc2V0Q3VycmVudFRoZW1lKElUaGVtZU1hbmFnZXIuREVGQVVMVF9USEVNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBJVGhlbWUgZ2V0RGVmYXVsdFRoZW1lKCkgewotICAgICAgICBJVGhlbWUgZGVmYXVsdFRoZW1lID0gZk1hbmFnZXIuZ2V0VGhlbWUoSVRoZW1lTWFuYWdlci5ERUZBVUxUX1RIRU1FKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZWZhdWx0VGhlbWUpOwotICAgICAgICByZXR1cm4gZGVmYXVsdFRoZW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVRoZW1lIGdldFRoZW1lMSgpIHsKLSAgICAgICAgSVRoZW1lIHRoZW1lMSA9IGZNYW5hZ2VyLmdldFRoZW1lKFRIRU1FMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGhlbWUxKTsKLSAgICAgICAgcmV0dXJuIHRoZW1lMTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvdGhlbWVzL1RoZW1lc1Rlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy90aGVtZXMvVGhlbWVzVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMmZhYWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy90aGVtZXMvVGhlbWVzVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMudGhlbWVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUaGVtZXNUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRoZW1lc1Rlc3RTdWl0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBUaGVtZXNUZXN0U3VpdGUoKSB7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShUaGVtZUFQSVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKEpGYWNlVGhlbWVUZXN0LmNsYXNzKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy96b29tL0FjdGl2YXRlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy96b29tL0FjdGl2YXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWYwZDU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9BY3RpdmF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuem9vbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aXZhdGVUZXN0IGV4dGVuZHMgWm9vbVRlc3RDYXNlIHsKLSAgICBwdWJsaWMgQWN0aXZhdGVUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3QgSVdvcmtiZW5jaFBhcnQgZ2V0U3RhY2tlZFBhcnQxKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IElXb3JrYmVuY2hQYXJ0IGdldFN0YWNrZWRQYXJ0MigpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBJV29ya2JlbmNoUGFydCBnZXRVbnN0YWNrZWRQYXJ0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+VGVzdDogWm9vbSBhIHBhcnQgYW5kIGFjdGl2YXRlIGl0PC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogUGFydCByZW1haW5zIHpvb21lZDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Wm9vbUFuZEFjdGl2YXRlKCkgewotICAgICAgICBJV29ya2JlbmNoUGFydCBzdGFja2VkMSA9IGdldFN0YWNrZWRQYXJ0MSgpOwotICAgICAgICAKLSAgICAgICAgem9vbShzdGFja2VkMSk7Ci0gICAgICAgIHBhZ2UuYWN0aXZhdGUoc3RhY2tlZDEpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKHN0YWNrZWQxKTsKLSAgICAgICAgYXNzZXJ0QWN0aXZlKHN0YWNrZWQxKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIDxwPlRlc3Q6IFpvb20gYSB2aWV3IHRoZW4gYWN0aXZhdGUgYW5vdGhlciB2aWV3IGluIHRoZSBzYW1lIHN0YWNrPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogU3RhY2sgcmVtYWlucyB6b29tZWQ8L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBY3RpdmF0ZVNhbWVTdGFjaygpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgc3RhY2tlZDEgPSBnZXRTdGFja2VkUGFydDEoKTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgc3RhY2tlZDIgPSBnZXRTdGFja2VkUGFydDIoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IGV2ZXJ5IHZpZXcgaW4gdGhlIHN0YWNrIGlzIHpvb21lZAotICAgICAgICB6b29tKHN0YWNrZWQxKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IGFjdGl2YXRpbmcgYW5vdGhlciB6b29tZWQgcGFydCBpbiB0aGUgc2FtZSBzdGFjayBkb2Vzbid0IGFmZmVjdCB6b29tCi0gICAgICAgIHBhZ2UuYWN0aXZhdGUoc3RhY2tlZDIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKHN0YWNrZWQyKTsKLSAgICAgICAgYXNzZXJ0QWN0aXZlKHN0YWNrZWQyKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogPHA+VGVzdDogWm9vbSBhIHZpZXcgdGhhbiBhY3RpdmF0ZSBhIHZpZXcgaW4gYSBkaWZmZXJlbnQgc3RhY2s8L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiBwYWdlIHVuem9vbXM8L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBY3RpdmF0ZU90aGVyU3RhY2soKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHN0YWNrZWQxID0gZ2V0U3RhY2tlZFBhcnQxKCk7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHVuc3RhY2tlZCA9IGdldFVuc3RhY2tlZFBhcnQoKTsKLSAgICAgICAgCi0gICAgICAgIHpvb20oc3RhY2tlZDEpOwotICAgICAgICBwYWdlLmFjdGl2YXRlKHVuc3RhY2tlZCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRab29tZWQobnVsbCk7Ci0gICAgICAgIGFzc2VydEFjdGl2ZSh1bnN0YWNrZWQpOwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogPHA+VGVzdDogWm9vbSBhIHZpZXcsIGFjdGl2YXRlIGEgZmFzdCB2aWV3LCB0aGVuIGFjdGl2YXRlIHRoZSB6b29tZWQgdmlldyBhZ2FpbjwvcD4KLSAgICAgKiA8cD5FeHBlY3RlZCByZXN1bHQ6IHZpZXcgcmVtYWlucyB6b29tZWQ8L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBY3RpdmF0ZUZhc3RWaWV3KCkgewotICAgICAgICBJV29ya2JlbmNoUGFydCBzdGFja2VkMSA9IGdldFN0YWNrZWRQYXJ0MSgpOwotICAgICAgICB6b29tKHN0YWNrZWQxKTsKLSAgICAgICAgcGFnZS5hY3RpdmF0ZShmYXN0Vmlldyk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRab29tZWQoc3RhY2tlZDEpOwotICAgICAgICBhc3NlcnRBY3RpdmUoZmFzdFZpZXcpOwotICAgICAgICAKLSAgICAgICAgcGFnZS5hY3RpdmF0ZShzdGFja2VkMSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRab29tZWQoc3RhY2tlZDEpOwotICAgICAgICBhc3NlcnRBY3RpdmUoc3RhY2tlZDEpOwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogPHA+VGVzdDogWm9vbSBhIHBhbmUgdGhlbiBjcmVhdGUgYSBuZXcgZmFzdCB2aWV3IHdpdGggdGhlIFZJRVdfQUNUSVZBVEUgbW9kZTwvcD4KLSAgICAgKiA8cD5FeHBlY3RlZCByZXN1bHQ6IHRoZSBvcmlnaW5hbCBwYW5lIHJlbWFpbnMgem9vbWVkPC9wPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRmFzdFZpZXcoKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHpvb21lZFBhcnQgPSBnZXRTdGFja2VkUGFydDEoKTsKLSAgICAgICAgCi0gICAgICAgIGNsb3NlKGZhc3RWaWV3KTsKLSAgICAgICAgem9vbSh6b29tZWRQYXJ0KTsKLSAgICAgICAgZmFzdFZpZXcgPSBzaG93RmFzdFZpZXcoWm9vbVBlcnNwZWN0aXZlRmFjdG9yeS5GQVNUVklFVzEpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKHpvb21lZFBhcnQpOwotICAgICAgICBhc3NlcnRBY3RpdmUoZmFzdFZpZXcpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiA8cD5UZXN0OiBab29tIGEgcGFuZSwgdGhlbiB0dXJuIHRoZSBmYXN0IHZpZXcgYmFjayBpbnRvIGEgcmVndWxhciB2aWV3PC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogdGhlIG9yaWdpbmFsIHBhbmUgcmVtYWlucyB6b29tZWQ8L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0b3JlRmFzdFZpZXcoKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHpvb21lZFBhcnQgPSBnZXRTdGFja2VkUGFydDEoKTsKLSAgICAgICAgCi0gICAgICAgIHpvb20oem9vbWVkUGFydCk7Ci0gICAgICAgIAotICAgICAgICAvLyBSZXN0b3JlIHRoZSBmYXN0IHZpZXcuIFNob3VsZG4ndCBoYXZlIGFueSBlZmZlY3Qgb24gem9vbS4KLSAgICAgICAgcGFnZS5yZW1vdmVGYXN0VmlldygoSVZpZXdSZWZlcmVuY2UpcGFnZS5nZXRSZWZlcmVuY2UoZmFzdFZpZXcpKTsKLQotICAgICAgICBhc3NlcnRab29tZWQoem9vbWVkUGFydCk7Ci0gICAgICAgIGFzc2VydEFjdGl2ZSh6b29tZWRQYXJ0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+VGVzdDogWm9vbSBhIHBhbmUsIHRoZW4gcmVzZXQgcGVyc3BlY3RpdmUuPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogdGhlIHBhZ2UgdW56b29tcyBidXQgdGhlIG9yaWdpbmFsIHBhbmUgcmVtYWlucyBhY3RpdmU8L3A+Ci0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNldFBlcnNwZWN0aXZlKCkgewotICAgICAgICBJV29ya2JlbmNoUGFydCB6b29tZWRQYXJ0ID0gZ2V0U3RhY2tlZFBhcnQxKCk7Ci0gICAgICAgIAotICAgICAgICB6b29tKHpvb21lZFBhcnQpOwotICAgICAgICAKLSAgICAgICAgcGFnZS5yZXNldFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRab29tZWQobnVsbCk7Ci0gICAgICAgIGFzc2VydEFjdGl2ZSh6b29tZWRQYXJ0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9DbG9zZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9DbG9zZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2M2M4Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3pvb20vQ2xvc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnpvb207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRlc3RzIHRoYXQgYXBwbHkgdG8gYm90aCB2aWV3cyBhbmQgZWRpdG9ycy4gU3ViY2xhc3NlcwotICogd2lsbCBvdmVybG9hZCB0aGUgYWJzdHJhY3QgbWV0aG9kcyB0byBkZXRlcm1pbmUgd2hldGhlciBlZGl0b3JzIG9yIHZpZXdzCi0gKiBhcmUgYmVpbmcgdGVzdGVkLCBhbmQgY2FuIGRlZmluZSBhZGRpdGlvbmFsIHRlc3RzIHRoYXQgb25seSBhcHBseSB0byBlZGl0b3JzCi0gKiBvciB2aWV3cyAob3IgdGhhdCBoYXZlIGRpZmZlcmVudCByZXN1bHRzKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENsb3NlVGVzdCBleHRlbmRzIFpvb21UZXN0Q2FzZSB7Ci0gICAgcHVibGljIENsb3NlVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGFic3RyYWN0IElXb3JrYmVuY2hQYXJ0IGdldFN0YWNrZWRQYXJ0MSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBJV29ya2JlbmNoUGFydCBnZXRTdGFja2VkUGFydDIoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgSVdvcmtiZW5jaFBhcnQgZ2V0VW5zdGFja2VkUGFydCgpOwotICAgIAotICAgIC8qKgotICAgICAqIDxwPlRlc3Q6IFpvb20gYSBwYXJ0IGFuZCBoaWRlIGFuIGluYWN0aXZlIGZhc3QgdmlldzwvcD4KLSAgICAgKiA8cD5FeHBlY3RlZCByZXN1bHQ6IFBhcnQgcmVtYWlucyB6b29tZWQ8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlSW5hY3RpdmVGYXN0VmlldygpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgem9vbVBhcnQgPSBnZXRTdGFja2VkUGFydDEoKTsKLSAgICAgICAgCi0gICAgICAgIHpvb20oem9vbVBhcnQpOwotICAgICAgICBjbG9zZShmYXN0Vmlldyk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRab29tZWQoem9vbVBhcnQpOwotICAgICAgICBhc3NlcnRBY3RpdmUoem9vbVBhcnQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5UZXN0OiBab29tIGEgcGFydCwgYWN0aXZhdGUgYSBmYXN0IHZpZXcsIHRoZW4gaGlkZSB0aGUgZmFzdCB2aWV3PC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogUGFydCByZW1haW5zIHpvb21lZDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VBY3RpdmVGYXN0VmlldygpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgem9vbVBhcnQgPSBnZXRTdGFja2VkUGFydDEoKTsKLSAgICAgICAgCi0gICAgICAgIHpvb20oem9vbVBhcnQpOwotICAgICAgICBwYWdlLmFjdGl2YXRlKGZhc3RWaWV3KTsKLSAgICAgICAgY2xvc2UoZmFzdFZpZXcpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKHpvb21QYXJ0KTsKLSAgICAgICAgYXNzZXJ0QWN0aXZlKHpvb21QYXJ0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+VGVzdDogQWN0aXZhdGUgYW4gdW5zdGFja2VkIHZpZXcsIHpvb20gYW5kIGFjdGl2YXRlIGEgc3RhY2tlZCBwYXJ0LCB0aGVuIGNsb3NlIHRoZSBhY3RpdmUgcGFydC48L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiBTdGFjayByZW1haW5zIHpvb21lZCwgYW5vdGhlciBwYXJ0IGluIHRoZSB6b29tZWQgc3RhY2sgaXMgYWN0aXZlPC9wPgotICAgICAqIDxwPk5vdGU6IFRoaXMgZW5zdXJlcyB0aGF0IHdoZW4gdGhlIGFjdGl2ZSBwYXJ0IGlzIGNsb3NlZCwgaXQgd2lsbCB0cnkgdG8gYWN0aXZhdGUgYSBwYXJ0IHRoYXQKLSAgICAgKiAgICBkb2Vzbid0IGFmZmVjdCB0aGUgem9vbSBldmVuIGlmIHNvbWV0aGluZyBlbHNlIHdhcyBhY3RpdmF0ZWQgbW9yZSByZWNlbnRseS48L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlWm9vbWVkU3RhY2tlZFBhcnRBZnRlckFjdGl2YXRpbmdWaWV3KCkgewotICAgICAgICBJV29ya2JlbmNoUGFydCB6b29tUGFydCA9IGdldFN0YWNrZWRQYXJ0MSgpOwotICAgICAgICBJV29ya2JlbmNoUGFydCBvdGhlclN0YWNrZWRQYXJ0ID0gZ2V0U3RhY2tlZFBhcnQyKCk7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHVuc3RhY2tlZFBhcnQgPSB1bnN0YWNrZWRWaWV3OwotICAgICAgICAKLSAgICAgICAgcGFnZS5hY3RpdmF0ZSh1bnN0YWNrZWRQYXJ0KTsKLSAgICAgICAgem9vbSh6b29tUGFydCk7Ci0gICAgICAgIGNsb3NlKHpvb21QYXJ0KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKG90aGVyU3RhY2tlZFBhcnQpOwotICAgICAgICBhc3NlcnRBY3RpdmUob3RoZXJTdGFja2VkUGFydCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+VGVzdDogQWN0aXZhdGUgYW4gdW5zdGFja2VkIGVkaXRvciwgem9vbSBhbmQgYWN0aXZhdGUgYSBzdGFja2VkIHBhcnQsIHRoZW4gY2xvc2UgdGhlIGFjdGl2ZSBwYXJ0LjwvcD4KLSAgICAgKiA8cD5FeHBlY3RlZCByZXN1bHQ6IFN0YWNrIHJlbWFpbnMgem9vbWVkLCBhbm90aGVyIHBhcnQgaW4gdGhlIHpvb21lZCBzdGFjayBpcyBhY3RpdmU8L3A+Ci0gICAgICogPHA+Tm90ZTogVGhpcyBlbnN1cmVzIHRoYXQgd2hlbiB0aGUgYWN0aXZlIHBhcnQgaXMgY2xvc2VkLCBpdCB3aWxsIHRyeSB0byBhY3RpdmF0ZSBhIHBhcnQgdGhhdAotICAgICAqICAgIGRvZXNuJ3QgYWZmZWN0IHRoZSB6b29tIGV2ZW4gaWYgc29tZXRoaW5nIGVsc2Ugd2FzIGFjdGl2YXRlZCBtb3JlIHJlY2VudGx5LjwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2Vab29tZWRTdGFja2VkUGFydEFmdGVyQWN0aXZhdGluZ0VkaXRvcigpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgem9vbVBhcnQgPSBnZXRTdGFja2VkUGFydDEoKTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgb3RoZXJTdGFja2VkUGFydCA9IGdldFN0YWNrZWRQYXJ0MigpOwotICAgICAgICBJV29ya2JlbmNoUGFydCB1bnN0YWNrZWRQYXJ0ID0gZWRpdG9yMzsKLSAgICAgICAgCi0gICAgICAgIHBhZ2UuYWN0aXZhdGUodW5zdGFja2VkUGFydCk7Ci0gICAgICAgIHpvb20oem9vbVBhcnQpOwotICAgICAgICBjbG9zZSh6b29tUGFydCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRab29tZWQob3RoZXJTdGFja2VkUGFydCk7Ci0gICAgICAgIGFzc2VydEFjdGl2ZShvdGhlclN0YWNrZWRQYXJ0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5UZXN0OiBBY3RpdmF0ZSBhbiB1bnN0YWNrZWQgZWRpdG9yLCBhY3RpdmF0ZSBhIHN0YWNrZWQgcGFydCwgdGhlbiBjbG9zZSB0aGUgYWN0aXZlIHBhcnQuPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogVGhlIHVuc3RhY2tlZCBwYXJ0IGJlY29tZXMgYWN0aXZlPC9wPgotICAgICAqIDxwPk5vdGU6IFRoaXMgaXNuJ3QgcmVhbGx5IGEgem9vbSB0ZXN0LCBidXQgaXQgZW5zdXJlcyB0aGF0IHRoZSBiZWhhdmlvciB0ZXN0ZWQgYnkgCi0gICAgICogICAgdGVzdEhpZGVab29tZWRTdGFja2VkUGFydEFmdGVyQWN0aXZhdGluZ0VkaXRvciBkb2VzIG5vdCBhZmZlY3QgYWN0aXZhdGlvbiB3aGVuIHRoZXJlIGlzIG5vIHpvb20uPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVVuem9vbWVkU3RhY2tlZFBhcnRBZnRlckFjdGl2YXRpbmdFZGl0b3IoKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRTdGFja2VkUGFydDEoKTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgb3RoZXJTdGFja2VkUGFydCA9IGdldFN0YWNrZWRQYXJ0MigpOwotICAgICAgICBJV29ya2JlbmNoUGFydCB1bnN0YWNrZWRQYXJ0ID0gZWRpdG9yMzsKLSAgICAgICAgCi0gICAgICAgIHBhZ2UuYWN0aXZhdGUodW5zdGFja2VkUGFydCk7Ci0gICAgICAgIHBhZ2UuYWN0aXZhdGUoYWN0aXZlUGFydCk7Ci0gICAgICAgIGNsb3NlKGFjdGl2ZVBhcnQpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKG51bGwpOwotICAgICAgICBhc3NlcnRBY3RpdmUodW5zdGFja2VkUGFydCk7Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiA8cD5UZXN0OiBab29tIGFuIHVuc3RhY2tlZCBwYXJ0IGFuZCBjbG9zZSBpdC48L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiBUaGUgcGFnZSBpcyB1bnpvb21lZCBhbmQgdGhlIHByZXZpb3VzbHkgYWN0aXZlIHBhcnQgYmVjb21lcyBhY3RpdmU8L3A+Ci0gICAgICogPHA+Tm90ZTogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGFjdGl2YXRpb24gbGlzdCBpcyB1c2VkIGlmIHRoZXJlIGlzIG5vdGhpbmcgYXZhaWxhYmxlCi0gICAgICogICAgaW4gdGhlIGN1cnJlbnRseSB6b29tZWQgc3RhY2suPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVpvb21lZFVuc3RhY2tlZFBhcnRBZnRlckFjdGl2YXRpbmdFZGl0b3IoKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHByZXZpb3VzQWN0aXZlID0gZWRpdG9yMTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgem9vbWVkUGFydCA9IGdldFVuc3RhY2tlZFBhcnQoKTsKLSAgICAgICAgCi0gICAgICAgIHBhZ2UuYWN0aXZhdGUocHJldmlvdXNBY3RpdmUpOwotICAgICAgICB6b29tKHpvb21lZFBhcnQpOwotICAgICAgICBjbG9zZSh6b29tZWRQYXJ0KTsKLQotICAgICAgICBhc3NlcnRab29tZWQobnVsbCk7Ci0gICAgICAgIGFzc2VydEFjdGl2ZShwcmV2aW91c0FjdGl2ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+VGVzdDogWm9vbSBhIHN0YWNrZWQgcGFydCBhbmQgY2xvc2UgYW4gaW5hY3RpdmUsIHVuc3RhY2tlZCBlZGl0b3IuPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogTm8gY2hhbmdlIGluIGFjdGl2YXRpb24gb3Igem9vbTwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VIaWRkZW5VbnN0YWNrZWRFZGl0b3IoKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHpvb21lZFBhcnQgPSBnZXRTdGFja2VkUGFydDEoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFjdGl2YXRlIGFub3RoZXIgZWRpdG9yIHRvIGVuc3VyZSB0aGF0IHdlIGFyZW4ndCBjbG9zaW5nIHRoZSBhY3RpdmUgZWRpdG9yCi0gICAgICAgIHBhZ2UuYWN0aXZhdGUoZWRpdG9yMSk7Ci0gICAgICAgIHpvb20oem9vbWVkUGFydCk7Ci0gICAgICAgIGNsb3NlKGVkaXRvcjMpOwotCi0gICAgICAgIGFzc2VydFpvb21lZCh6b29tZWRQYXJ0KTsKLSAgICAgICAgYXNzZXJ0QWN0aXZlKHpvb21lZFBhcnQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5UZXN0OiBab29tIGEgc3RhY2tlZCBwYXJ0IGFuZCBjbG9zZSBhbiBpbmFjdGl2ZSwgdW5zdGFja2VkIHZpZXcuPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogTm8gY2hhbmdlIGluIGFjdGl2YXRpb24gb3Igem9vbTwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VIaWRkZW5VbnN0YWNrZWRWaWV3KCkgewotICAgICAgICBJV29ya2JlbmNoUGFydCB6b29tZWRQYXJ0ID0gZ2V0U3RhY2tlZFBhcnQxKCk7Ci0gICAgICAgIAotICAgICAgICB6b29tKHpvb21lZFBhcnQpOwotICAgICAgICBjbG9zZSh1bnN0YWNrZWRWaWV3KTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFpvb21lZCh6b29tZWRQYXJ0KTsKLSAgICAgICAgYXNzZXJ0QWN0aXZlKHpvb21lZFBhcnQpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9PcGVuRWRpdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy96b29tL09wZW5FZGl0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNGJmYWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy96b29tL09wZW5FZGl0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnpvb207Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi0KLXB1YmxpYyBjbGFzcyBPcGVuRWRpdG9yVGVzdCBleHRlbmRzIFpvb21UZXN0Q2FzZSB7Ci0gICAgcHVibGljIE9wZW5FZGl0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiA8cD5UZXN0OiBab29tIGFuIGVkaXRvciB0aGVuIG9wZW4gYW4gZXhpc3RpbmcgZWRpdG9yIGluIHRoZSBzYW1lIHN0YWNrLiBEbyBub3QgZm9yY2UgYWN0aXZhdGlvbi48L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiB0aGUgbmV3IGVkaXRvciBpcyB6b29tZWQgYW5kIGFjdGl2ZTwvcD4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5FeGlzdGluZ0VkaXRvckluWm9vbWVkU3RhY2soKSB7Ci0gICAgICAgIHpvb20oZWRpdG9yMSk7Ci0gICAgICAgIG9wZW5FZGl0b3IoZmlsZTIsIGZhbHNlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaXNab29tZWQoZWRpdG9yMikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwYWdlLmdldEFjdGl2ZVBhcnQoKSA9PSBlZGl0b3IyKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogPHA+VGVzdDogT3BlbiBhIG5ldyBlZGl0b3Igd2hpbGUgYSB2aWV3IGlzIHpvb21lZC4gRG8gbm90IGZvcmNlIGFjdGl2YXRpb24uPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogdGhlIHBhZ2UgcmVtYWlucyB6b29tZWQsIHRoZSB2aWV3IGlzIGFjdGl2ZTwvcD4gCi0gICAgICogCi0gICAgICogPHA+Tm90ZTogdGhlIGV4cGVjdGVkIHJlc3VsdCBjaGFuZ2VkIGludGVudGlvbmFsbHkgb24gMDUvMDQvMTg8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5OZXdFZGl0b3JXaGlsZVZpZXdab29tZWQoKSB7Ci0gICAgICAgIGNsb3NlKGVkaXRvcjEpOwotICAgICAgICAKLSAgICAgICAgem9vbShzdGFja2VkVmlldzEpOwotICAgICAgICBvcGVuRWRpdG9yKGZpbGUxLCBmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRab29tZWQoc3RhY2tlZFZpZXcxKTsKLSAgICAgICAgYXNzZXJ0QWN0aXZlKHN0YWNrZWRWaWV3MSk7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiA8cD5UZXN0OiBab29tIGFuIGVkaXRvciB0aGVuIG9wZW4gYSBuZXcgZWRpdG9yIGluIHRoZSBzYW1lIHN0YWNrLiBEbyBub3QgZm9yY2UgYWN0aXZhdGlvbi48L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiB0aGUgbmV3IGVkaXRvciBpcyB6b29tZWQgYW5kIGFjdGl2ZTwvcD4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5OZXdFZGl0b3JJblpvb21lZFN0YWNrKCkgewotICAgICAgICBjbG9zZShlZGl0b3IyKTsKLSAgICAgICAgCi0gICAgICAgIHpvb20oZWRpdG9yMSk7Ci0gICAgICAgIG9wZW5FZGl0b3IoZmlsZTIsIGZhbHNlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaXNab29tZWQoZWRpdG9yMikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwYWdlLmdldEFjdGl2ZVBhcnQoKSA9PSBlZGl0b3IyKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIDxwPlRlc3Q6IE9wZW4gYW4gZXhpc3RpbmcgZWRpdG9yIHdoaWxlIGEgdmlldyBpcyB6b29tZWQuIERvIG5vdCBmb3JjZSBhY3RpdmF0aW9uLjwvcD4KLSAgICAgKiA8cD5FeHBlY3RlZCByZXN1bHQ6IHRoZSBwYWdlIHJlbWFpbnMgem9vbWVkLCB0aGUgdmlldyBpcyBhY3RpdmU8L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuRXhpc3RpbmdFZGl0b3JXaGlsZVZpZXdab29tZWQoKSB7Ci0gICAgICAgIHpvb20oc3RhY2tlZFZpZXcxKTsKLSAgICAgICAgb3BlbkVkaXRvcihmaWxlMSwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKHN0YWNrZWRWaWV3MSk7Ci0gICAgICAgIGFzc2VydEFjdGl2ZShzdGFja2VkVmlldzEpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiA8cD5UZXN0OiBPcGVuIGFuIGV4aXN0aW5nIGVkaXRvciB3aGlsZSBhIHZpZXcgaXMgem9vbWVkLiBVc2UgdGhlIGFjdGl2YXRlLW9uLW9wZW4gbW9kZS48L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiB0aGUgcGFnZSBpcyB1bnpvb21lZCwgdGhlIHZpZXcgaXMgYWN0aXZlPC9wPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZEFjdGl2YXRlRXhpc3RpbmdFZGl0b3JXaGlsZVZpZXdab29tZWQoKSB7Ci0gICAgICAgIHpvb20oc3RhY2tlZFZpZXcxKTsKLSAgICAgICAgb3BlbkVkaXRvcihmaWxlMSwgdHJ1ZSk7Ci0KLSAgICAgICAgYXNzZXJ0Wm9vbWVkKG51bGwpOwotICAgICAgICBhc3NlcnRBY3RpdmUoZWRpdG9yMSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIDxwPlRlc3Q6IE9wZW4gYSBuZXcgZWRpdG9yIHdoaWxlIGEgdmlldyBpcyB6b29tZWQuIFVzZSB0aGUgYWN0aXZhdGUtb24tb3BlbiBtb2RlLjwvcD4KLSAgICAgKiA8cD5FeHBlY3RlZCByZXN1bHQ6IHRoZSBwYWdlIGlzIHVuem9vbWVkLCB0aGUgdmlldyBpcyBhY3RpdmU8L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kQWN0aXZhdGVOZXdFZGl0b3JXaGlsZVZpZXdab29tZWQoKSB7Ci0gICAgICAgIGNsb3NlKGVkaXRvcjEpOwotICAgICAgICAKLSAgICAgICAgem9vbShzdGFja2VkVmlldzEpOwotICAgICAgICBvcGVuRWRpdG9yKGZpbGUxLCB0cnVlKTsKLSAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKG51bGwpOwotICAgICAgICBhc3NlcnRBY3RpdmUoZWRpdG9yMSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIDxwPlRlc3Q6IFpvb20gYW4gZWRpdG9yIHRoZW4gb3BlbiBhbiBleGlzdGluZyBpbiB0aGUgc2FtZSBzdGFjay4gVXNlIHRoZSBhY3RpdmF0ZS1vbi1vcGVuIG1vZGUuPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogdGhlIG5ldyBlZGl0b3IgaXMgem9vbWVkIGFuZCBhY3RpdmU8L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kQWN0aXZhdGVFeGlzdGluZ0VkaXRvckluWm9vbWVkU3RhY2soKSB7Ci0gICAgICAgIHpvb20oZWRpdG9yMSk7Ci0gICAgICAgIG9wZW5FZGl0b3IoZmlsZTIsIHRydWUpOwotCi0gICAgICAgIGFzc2VydFpvb21lZChlZGl0b3IyKTsKLSAgICAgICAgYXNzZXJ0QWN0aXZlKGVkaXRvcjIpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiA8cD5UZXN0OiBab29tIGFuIGVkaXRvciB0aGVuIG9wZW4gYSBuZXcgZWRpdG9yIGluIHRoZSBzYW1lIHN0YWNrLiBVc2UgdGhlIGFjdGl2YXRlLW9uLW9wZW4gbW9kZS48L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiB0aGUgbmV3IGVkaXRvciBpcyB6b29tZWQgYW5kIGFjdGl2ZTwvcD4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbmRBY3RpdmF0ZU5ld0VkaXRvckluWm9vbWVkU3RhY2soKSB7Ci0gICAgICAgIGNsb3NlKGVkaXRvcjIpOwotICAgICAgICAKLSAgICAgICAgem9vbShlZGl0b3IxKTsKLSAgICAgICAgb3BlbkVkaXRvcihmaWxlMiwgdHJ1ZSk7Ci0KLSAgICAgICAgYXNzZXJ0Wm9vbWVkKGVkaXRvcjIpOwotICAgICAgICBhc3NlcnRBY3RpdmUoZWRpdG9yMik7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiA8cD5UZXN0OiBab29tIGFuIGVkaXRvciB0aGVuIG9wZW4gYW4gZXhpc3RpbmcgZWRpdG9yIGluIGEgZGlmZmVyZW50IHN0YWNrLiBEbyBub3QgZm9yY2UgYWN0aXZhdGlvbi48L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiB0aGUgcGFnZSByZW1haW5zIHpvb21lZCBhbmQgdGhlIG9yaWdpbmFsIGVkaXRvciBpcyBhY3RpdmU8L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuRXhpc3RpbmdFZGl0b3JJbk90aGVyU3RhY2soKSB7Ci0gICAgICAgIHpvb20oZWRpdG9yMyk7Ci0gICAgICAgIG9wZW5FZGl0b3IoZmlsZTIsIGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFpvb21lZChlZGl0b3IzKTsKLSAgICAgICAgYXNzZXJ0QWN0aXZlKGVkaXRvcjMpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiA8cD5UZXN0OiBab29tIGFuIGVkaXRvciB0aGVuIG9wZW4gYW4gZXhpc3RpbmcgZWRpdG9yIGluIGEgZGlmZmVyZW50IHN0YWNrLiBVc2UgdGhlIGFjdGl2YXRlLW9uLW9wZW4gbW9kZS48L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiB0aGUgcGFnZSBpcyB1bnpvb21lZCBhbmQgdGhlIG5ldyBlZGl0b3IgYW5kIGFjdGl2ZTwvcD4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbmRBY3RpdmF0ZUV4aXN0aW5nRWRpdG9ySW5PdGhlclN0YWNrKCkgewotICAgICAgICB6b29tKGVkaXRvcjMpOwotICAgICAgICBvcGVuRWRpdG9yKGZpbGUyLCB0cnVlKTsKLQotICAgICAgICBhc3NlcnRab29tZWQobnVsbCk7Ci0gICAgICAgIGFzc2VydEFjdGl2ZShlZGl0b3IyKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3pvb20vU2hvd1ZpZXdUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3pvb20vU2hvd1ZpZXdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDNhMmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy96b29tL1Nob3dWaWV3VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy56b29tOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5QYXJ0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5QYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5QYXJ0U3RhY2s7Ci0KLXB1YmxpYyBjbGFzcyBTaG93Vmlld1Rlc3QgZXh0ZW5kcyBab29tVGVzdENhc2UgewotICAgIHB1YmxpYyBTaG93Vmlld1Rlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0vLyBDb21tZW50ZWQgb3V0IHVudGlsIHRoZSAocG9zc2libGUpIGFtYmlndWl0eSBpbiBidWcgOTE3NzUgaXMgcmVzb2x2ZWQKLS8vICAgIC8qKiAKLS8vICAgICAqIDxwPlRlc3Q6IFpvb20gYSB2aWV3LCBjcmVhdGUgYSBuZXcgdmlldyBpbiB0aGUgc2FtZSBzdGFjayB1c2luZyB0aGUgCi0vLyAgICAgKiAgICBJV29ya2JlbmNoUGFnZS5WSUVXX1ZJU0lCTEUgZmxhZzwvcD4KLS8vICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogdGhlIG5ldyB2aWV3IGlzIHpvb21lZCBhbmQgYWN0aXZlPC9wPiAKLS8vICAgICAqLwotLy8gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVZpZXdBbmRNYWtlVmlzaWJsZUluWm9vbWVkU3RhY2soKSB7Ci0vLyAgICAgICAgem9vbShzdGFja2VkVmlldzEpOwotLy8gICAgICAgIElWaWV3UGFydCBuZXdQYXJ0ID0gc2hvd1JlZ3VsYXJWaWV3KFpvb21QZXJzcGVjdGl2ZUZhY3RvcnkuU1RBQ0sxX1BMQUNFSE9MREVSMSwgCi0vLyAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZS5WSUVXX1ZJU0lCTEUpOwotLy8gICAgICAgIAotLy8gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHBhZ2UuZ2V0QWN0aXZlUGFydCgpID09IG5ld1BhcnQpOwotLy8gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGlzWm9vbWVkKG5ld1BhcnQpKTsKLS8vICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogPHA+VGVzdDogWm9vbSBhIHZpZXcsIGNyZWF0ZSBhIG5ldyB2aWV3IGluIHRoZSBzYW1lIHN0YWNrIHVzaW5nIHRoZSAKLSAgICAgKiAgICBJV29ya2JlbmNoUGFnZS5WSUVXX0NSRUFURSBmbGFnLCB0aGVuIGJyaW5nIGl0IHRvIHRvcCB1c2luZyA8L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiB0aGUgbmV3IHZpZXcgaXMgem9vbWVkIGFuZCBhY3RpdmU8L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVWaWV3QW5kQnJpbmdUb1RvcCgpIHsKLSAgICAgICAgem9vbShzdGFja2VkVmlldzEpOwotICAgICAgICBJVmlld1BhcnQgbmV3UGFydCA9IHNob3dSZWd1bGFyVmlldyhab29tUGVyc3BlY3RpdmVGYWN0b3J5LlNUQUNLMV9QTEFDRUhPTERFUjEsIAotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlLlZJRVdfQ1JFQVRFKTsKLSAgICAgICAgCi0gICAgICAgIHBhZ2UuYnJpbmdUb1RvcChuZXdQYXJ0KTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHBhZ2UuZ2V0QWN0aXZlUGFydCgpID09IG5ld1BhcnQpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpc1pvb21lZChuZXdQYXJ0KSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIDxwPlRlc3Q6IFpvb20gYSB2aWV3LCBjcmVhdGUgYSBuZXcgdmlldyBpbiBhIGRpZmZlcmVudCBzdGFjayB1c2luZyB0aGUgCi0gICAgICogICAgSVdvcmtiZW5jaFBhZ2UuVklFV19DUkVBVEUgZmxhZyBhbmQgYnJpbmcgaXQgdG8gZnJvbnQgdXNpbmcgcGFnZS5icmluZ1RvVG9wPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogbm8gY2hhbmdlIGluIHpvb20gb3IgYWN0aXZhdGlvbi4gVGhlIG5ld2x5IGNyZWF0ZWQgdmlldyBpcyBvYnNjdXJlZCBieSB0aGUgem9vbSwgCi0gICAgICogICAgYnV0IHdpbGwgYmUgdGhlIHRvcCB2aWV3IGluIGl0cyAoY3VycmVudGx5IGludmlzaWJsZSkgc3RhY2suPC9wPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVmlld0FuZEJyaW5nVG9Ub3BJbk90aGVyU3RhY2soKSB7Ci0gICAgICAgIHpvb20odW5zdGFja2VkVmlldyk7Ci0gICAgICAgIElWaWV3UGFydCBuZXdQYXJ0ID0gc2hvd1JlZ3VsYXJWaWV3KFpvb21QZXJzcGVjdGl2ZUZhY3RvcnkuU1RBQ0sxX1BMQUNFSE9MREVSMSwgSVdvcmtiZW5jaFBhZ2UuVklFV19DUkVBVEUpOwotICAgICAgICBwYWdlLmJyaW5nVG9Ub3AobmV3UGFydCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHBhZ2UuZ2V0QWN0aXZlUGFydCgpID09IHVuc3RhY2tlZFZpZXcpOwotICAgICAgICAKLSAgICAgICAgLy8gRW5zdXJlIG5vIGNoYW5nZSB0byB6b29tCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGlzWm9vbWVkKHVuc3RhY2tlZFZpZXcpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBuZXcgcGFydCB3YXMgYnJvdWdodCB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawotICAgICAgICBQYXJ0UGFuZSBwYW5lID0gKChQYXJ0U2l0ZSkgbmV3UGFydC5nZXRTaXRlKCkpLmdldFBhbmUoKTsKLSAgICAgICAgUGFydFN0YWNrIHN0YWNrID0gKFBhcnRTdGFjaylwYW5lLmdldENvbnRhaW5lcigpOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoc3RhY2suZ2V0U2VsZWN0aW9uKCkgPT0gcGFuZSk7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiA8cD5UZXN0OiBab29tIGEgdmlldywgY3JlYXRlIGEgbmV3IHZpZXcgaW4gYSBkaWZmZXJlbnQgc3RhY2sgdXNpbmcgdGhlIAotICAgICAqICAgIElXb3JrYmVuY2hQYWdlLlZJRVdfVklTSUJMRSBmbGFnPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogbm8gY2hhbmdlIGluIHpvb20gb3IgYWN0aXZhdGlvbi4gVGhlIG5ld2x5IGNyZWF0ZWQgdmlldyBpcyBvYnNjdXJlZCBieSB0aGUgem9vbSwgCi0gICAgICogICAgYnV0IHdpbGwgYmUgdGhlIHRvcCB2aWV3IGluIGl0cyAoY3VycmVudGx5IGludmlzaWJsZSkgc3RhY2suPC9wPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVmlld0FuZE1ha2VWaXNpYmxlSW5PdGhlclN0YWNrKCkgewotICAgICAgICB6b29tKHVuc3RhY2tlZFZpZXcpOwotICAgICAgICBJVmlld1BhcnQgbmV3UGFydCA9IHNob3dSZWd1bGFyVmlldyhab29tUGVyc3BlY3RpdmVGYWN0b3J5LlNUQUNLMV9QTEFDRUhPTERFUjEsIElXb3JrYmVuY2hQYWdlLlZJRVdfVklTSUJMRSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHBhZ2UuZ2V0QWN0aXZlUGFydCgpID09IHVuc3RhY2tlZFZpZXcpOwotICAgICAgICAKLSAgICAgICAgLy8gRW5zdXJlIG5vIGNoYW5nZSB0byB6b29tCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGlzWm9vbWVkKHVuc3RhY2tlZFZpZXcpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBuZXcgcGFydCB3YXMgYnJvdWdodCB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawotICAgICAgICBQYXJ0UGFuZSBwYW5lID0gKChQYXJ0U2l0ZSkgbmV3UGFydC5nZXRTaXRlKCkpLmdldFBhbmUoKTsKLSAgICAgICAgUGFydFN0YWNrIHN0YWNrID0gKFBhcnRTdGFjaylwYW5lLmdldENvbnRhaW5lcigpOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoc3RhY2suZ2V0U2VsZWN0aW9uKCkgPT0gcGFuZSk7Ci0gICAgfQotICAgIC8qKiAKLSAgICAgKiA8cD5UZXN0OiBab29tIGFuIGVkaXRvciwgY3JlYXRlIGEgbmV3IHZpZXcgdXNpbmcgdGhlIElXb3JrYmVuY2hQYWdlLlZJRVdfVklTSUJMRSBtb2RlPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogTm8gY2hhbmdlIHRvIHpvb20gb3IgYWN0aXZhdGlvbi4gVGhlIG5ldyB2aWV3IHdhcyBicm91Z2h0IHRvIHRoZSB0b3AKLSAgICAgKiAgICBvZiBpdHMgc3RhY2suPC9wPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVmlld0FuZE1ha2VWaXNpYmxlV2hpbGVFZGl0b3Jab29tZWQoKSB7Ci0gICAgICAgIHpvb20oZWRpdG9yMSk7Ci0gICAgICAgIElWaWV3UGFydCBuZXdQYXJ0ID0gc2hvd1JlZ3VsYXJWaWV3KFpvb21QZXJzcGVjdGl2ZUZhY3RvcnkuU1RBQ0sxX1BMQUNFSE9MREVSMSwgSVdvcmtiZW5jaFBhZ2UuVklFV19WSVNJQkxFKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaXNab29tZWQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHBhZ2UuZ2V0QWN0aXZlUGFydCgpID09IGVkaXRvcjEpOwotICAgICAgICAKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIG5ldyBwYXJ0IHdhcyBicm91Z2h0IHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0gICAgICAgIFBhcnRQYW5lIHBhbmUgPSAoKFBhcnRTaXRlKSBuZXdQYXJ0LmdldFNpdGUoKSkuZ2V0UGFuZSgpOwotICAgICAgICBQYXJ0U3RhY2sgc3RhY2sgPSAoUGFydFN0YWNrKXBhbmUuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzdGFjay5nZXRTZWxlY3Rpb24oKSA9PSBwYW5lKTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qKiAKLSAgICAgKiA8cD5UZXN0OiBab29tIGEgdmlldywgY3JlYXRlIGEgbmV3IHZpZXcgaW4gdGhlIHNhbWUgc3RhY2sgdXNpbmcgdGhlIAotICAgICAqICAgIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUgZmxhZzwvcD4KLSAgICAgKiA8cD5FeHBlY3RlZCByZXN1bHQ6IHRoZSBuZXcgdmlldyBpcyB6b29tZWQgYW5kIGFjdGl2ZTwvcD4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVZpZXdBbmRBY3RpdmF0ZUluWm9vbWVkU3RhY2soKSB7Ci0gICAgICAgIHpvb20oc3RhY2tlZFZpZXcxKTsKLSAgICAgICAgSVZpZXdQYXJ0IG5ld1BhcnQgPSBzaG93UmVndWxhclZpZXcoWm9vbVBlcnNwZWN0aXZlRmFjdG9yeS5TVEFDSzFfUExBQ0VIT0xERVIxLCBJV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFpvb21lZChuZXdQYXJ0KTsKLSAgICAgICAgYXNzZXJ0QWN0aXZlKG5ld1BhcnQpOwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogPHA+VGVzdDogWm9vbSBhIHZpZXcsIGNyZWF0ZSBhIG5ldyB2aWV3IGluIHRoZSBzYW1lIHN0YWNrIHVzaW5nIHRoZSAKLSAgICAgKiAgICBJV29ya2JlbmNoUGFnZS5WSUVXX0NSRUFURSBmbGFnPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogbm8gY2hhbmdlIGluIGFjdGl2YXRpb24gb3Igem9vbTwvcD4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVZpZXdJblpvb21lZFN0YWNrKCkgewotICAgICAgICB6b29tKHN0YWNrZWRWaWV3MSk7Ci0gICAgICAgIElWaWV3UGFydCBuZXdQYXJ0ID0gc2hvd1JlZ3VsYXJWaWV3KFpvb21QZXJzcGVjdGl2ZUZhY3RvcnkuU1RBQ0sxX1BMQUNFSE9MREVSMSwgCi0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UuVklFV19DUkVBVEUpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKHN0YWNrZWRWaWV3MSk7Ci0gICAgICAgIGFzc2VydEFjdGl2ZShzdGFja2VkVmlldzEpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiA8cD5UZXN0OiBab29tIGEgdmlldywgY3JlYXRlIGEgbmV3IHZpZXcgaW4gYSBkaWZmZXJlbnQgc3RhY2sgdXNpbmcgdGhlIAotICAgICAqICAgIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUgZmxhZzwvcD4KLSAgICAgKiA8cD5FeHBlY3RlZCByZXN1bHQ6IHRoZSBwYWdlIGlzIHVuem9vbWVkIGFuZCB0aGUgbmV3IHZpZXcgaXMgYWN0aXZlPC9wPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVmlld0FuZEFjdGl2YXRlSW5PdGhlclN0YWNrKCkgewotICAgICAgICB6b29tKHVuc3RhY2tlZFZpZXcpOwotICAgICAgICBJVmlld1BhcnQgbmV3UGFydCA9IHNob3dSZWd1bGFyVmlldyhab29tUGVyc3BlY3RpdmVGYWN0b3J5LlNUQUNLMV9QTEFDRUhPTERFUjEsIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKG51bGwpOwotICAgICAgICBhc3NlcnRBY3RpdmUobmV3UGFydCk7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiA8cD5UZXN0OiBab29tIGEgdmlldywgY3JlYXRlIGEgbmV3IHZpZXcgaW4gYSBkaWZmZXJlbnQgc3RhY2sgdXNpbmcgdGhlIAotICAgICAqICAgIElXb3JrYmVuY2hQYWdlLlZJRVdfQ1JFQVRFIGZsYWc8L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiBObyBjaGFuZ2UgdG8gem9vbSBvciBhY3RpdmF0aW9uLiBUaGUgbmV3bHkgY3JlYXRlZCB2aWV3IGlzIGhpZGRlbjwvcD4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVZpZXdJbk90aGVyU3RhY2soKSB7Ci0gICAgICAgIHpvb20odW5zdGFja2VkVmlldyk7Ci0gICAgICAgIElWaWV3UGFydCBuZXdQYXJ0ID0gc2hvd1JlZ3VsYXJWaWV3KFpvb21QZXJzcGVjdGl2ZUZhY3RvcnkuU1RBQ0sxX1BMQUNFSE9MREVSMSwgSVdvcmtiZW5jaFBhZ2UuVklFV19DUkVBVEUpOwotCi0gICAgICAgIGFzc2VydFpvb21lZCh1bnN0YWNrZWRWaWV3KTsKLSAgICAgICAgYXNzZXJ0QWN0aXZlKHVuc3RhY2tlZFZpZXcpOwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogPHA+VGVzdDogWm9vbSBhbiBlZGl0b3IsIGNyZWF0ZSBhIG5ldyB2aWV3IHVzaW5nIHRoZSBJV29ya2JlbmNoUGFnZS5WSUVXX0FDVElWQVRFIG1vZGU8L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiB0aGUgcGFnZSBpcyB1bnpvb21lZCBhbmQgdGhlIG5ldyB2aWV3IGlzIGFjdGl2ZTwvcD4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVZpZXdBbmRBY3RpdmF0ZVdoaWxlRWRpdG9yWm9vbWVkKCkgewotICAgICAgICB6b29tKGVkaXRvcjEpOwotICAgICAgICBJVmlld1BhcnQgbmV3UGFydCA9IHNob3dSZWd1bGFyVmlldyhab29tUGVyc3BlY3RpdmVGYWN0b3J5LlNUQUNLMV9QTEFDRUhPTERFUjEsIElXb3JrYmVuY2hQYWdlLlZJRVdfQUNUSVZBVEUpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKG51bGwpOwotICAgICAgICBhc3NlcnRBY3RpdmUobmV3UGFydCk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIDxwPlRlc3Q6IFpvb20gYW4gZWRpdG9yLCBjcmVhdGUgYSBuZXcgdmlldyB1c2luZyB0aGUgSVdvcmtiZW5jaFBhZ2UuVklFV19DUkVBVEUgbW9kZTwvcD4KLSAgICAgKiA8cD5FeHBlY3RlZCByZXN1bHQ6IFRoZSBlZGl0b3IgcmVtYWlucyB6b29tZWQgYW5kIGFjdGl2ZS48L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVWaWV3V2hpbGVFZGl0b3Jab29tZWQoKSB7Ci0gICAgICAgIHpvb20oZWRpdG9yMSk7Ci0gICAgICAgIElWaWV3UGFydCBuZXdQYXJ0ID0gc2hvd1JlZ3VsYXJWaWV3KFpvb21QZXJzcGVjdGl2ZUZhY3RvcnkuU1RBQ0sxX1BMQUNFSE9MREVSMSwgSVdvcmtiZW5jaFBhZ2UuVklFV19DUkVBVEUpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKGVkaXRvcjEpOwotICAgICAgICBhc3NlcnRBY3RpdmUoZWRpdG9yMSk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy96b29tL1pvb21QZXJzcGVjdGl2ZUZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9ab29tUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNTQxN2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy96b29tL1pvb21QZXJzcGVjdGl2ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51aS50ZXN0cy56b29tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFpvb21QZXJzcGVjdGl2ZUZhY3RvcnkgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTUF9JRCA9ICJvcmcuZWNsaXBzZS51aS50ZXN0cy56b29tLlpvb21QZXJzcGVjdGl2ZUZhY3RvcnkiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBQ0sxX1ZJRVcxID0gSVBhZ2VMYXlvdXQuSURfT1VUTElORTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFDSzFfVklFVzIgPSBJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBQ0sxX1BMQUNFSE9MREVSMSA9IElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBQ0sxX1ZJRVczID0gSVBhZ2VMYXlvdXQuSURfVEFTS19MSVNUOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOU1RBQ0tFRF9WSUVXMSA9IElQYWdlTGF5b3V0LklEX1JFU19OQVY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFTVFZJRVcxID0gSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTOwotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3RvcnkjY3JlYXRlSW5pdGlhbExheW91dChvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSAib3JnLmVjbGlwc2UudWkudGVzdC56b29tLm15c3RhY2siOwotCi0gICAgICAgIElGb2xkZXJMYXlvdXQgZm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcihmb2xkZXJJZCwKLSAgICAgICAgICAgICAgICBJUGFnZUxheW91dC5MRUZULCAwLjVmLCBJUGFnZUxheW91dC5JRF9FRElUT1JfQVJFQSk7Ci0gICAgICAgIGZvbGRlci5hZGRWaWV3KFNUQUNLMV9WSUVXMSk7Ci0gICAgICAgIGZvbGRlci5hZGRWaWV3KFNUQUNLMV9WSUVXMik7Ci0gICAgICAgIGZvbGRlci5hZGRQbGFjZWhvbGRlcihTVEFDSzFfUExBQ0VIT0xERVIxKTsKLSAgICAgICAgZm9sZGVyLmFkZFZpZXcoU1RBQ0sxX1ZJRVczKTsKLSAgICAgICAgCi0gICAgICAgIGxheW91dC5hZGRWaWV3KFVOU1RBQ0tFRF9WSUVXMSwgIElQYWdlTGF5b3V0LlRPUCwgMC41ZiwgSVBhZ2VMYXlvdXQuSURfRURJVE9SX0FSRUEpOwotICAgICAgICAKLSAgICAgICAgbGF5b3V0LmFkZEZhc3RWaWV3KEZBU1RWSUVXMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy96b29tL1pvb21UZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy96b29tL1pvb21UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTI5N2FiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9ab29tVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuem9vbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5QYXJ0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5QYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudXRpbC5QcmVmVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5EcmFnT3BlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQuRWRpdG9yQXJlYURyb3BUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuZG5kLkV4aXN0aW5nV2luZG93UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdHMuaGFybmVzcy51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MudXRpbC5VSVRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgWm9vbVRlc3RDYXNlIGV4dGVuZHMgVUlUZXN0Q2FzZSB7Ci0vLyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyB2aWV3MUlkID0gSVBhZ2VMYXlvdXQuSURfUkVTX05BVjsKLS8vCi0vLyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyB2aWV3MklkID0gSVBhZ2VMYXlvdXQuSURfT1VUTElORTsKLQotICAgIHByb3RlY3RlZCBXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0gICAgcHJvdGVjdGVkIFdvcmtiZW5jaFBhZ2UgcGFnZTsKLQotICAgIHByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCi0gICAgcHJvdGVjdGVkIElGaWxlIGZpbGUxLCBmaWxlMjsKLSAgICAKLSAgICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yMSwgZWRpdG9yMiwgZWRpdG9yMzsKLQotICAgIHByb3RlY3RlZCBJVmlld1BhcnQgc3RhY2tlZFZpZXcxOwotICAgIHByb3RlY3RlZCBJVmlld1BhcnQgc3RhY2tlZFZpZXcyOwotICAgIHByb3RlY3RlZCBJVmlld1BhcnQgdW5zdGFja2VkVmlldzsKLSAgICBwcm90ZWN0ZWQgSVZpZXdQYXJ0IGZhc3RWaWV3OwotCi0gICAgcHJpdmF0ZSBJRmlsZSBmaWxlMzsKLSAgICAKLSAgICBwdWJsaWMgWm9vbVRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuVUlUZXN0Q2FzZSNkb1RlYXJEb3duKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1RlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBhZ2UudGVzdEludmFyaWFudHMoKTsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLmRvVGVhckRvd24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb1NldFVwKCk7Ci0gICAgICAgIHdpbmRvdyA9IChXb3JrYmVuY2hXaW5kb3cpIG9wZW5UZXN0V2luZG93KFpvb21QZXJzcGVjdGl2ZUZhY3RvcnkuUEVSU1BfSUQpOwotICAgICAgICBwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0KLSAgICAgICAgLy8gRGlzYWJsZSBhbmltYXRpb25zIHNpbmNlIHRoZXkgb2NjdXIgY29uY3VycmVudGx5IGFuZCBjYW4gaW50ZXJmZXJyZQotICAgICAgICAvLyB3aXRoIGxvY2F0aW5nIGRyb3AgdGFyZ2V0cwotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIGFwaVN0b3JlID0gUHJlZlV0aWwuZ2V0QVBJUHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIGFwaVN0b3JlLnNldFZhbHVlKAotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLkVOQUJMRV9BTklNQVRJT05TLAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvamVjdCA9IEZpbGVVdGlsLmNyZWF0ZVByb2plY3QoIklFZGl0b3JQYXJ0VGVzdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBmaWxlMSA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoIlRlc3QxLnR4dCIsIHByb2plY3QpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBmaWxlMiA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoIlRlc3QyLnR4dCIsIHByb2plY3QpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBmaWxlMyA9IEZpbGVVdGlsLmNyZWF0ZUZpbGUoIlRlc3QzLnR4dCIsIHByb2plY3QpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBlZGl0b3IxID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZTEpLAotICAgICAgICAgICAgICAgICAgICBNb2NrRWRpdG9yUGFydC5JRDEpOwotICAgICAgICAgICAgZWRpdG9yMiA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUyKSwKLSAgICAgICAgICAgICAgICAgICAgTW9ja0VkaXRvclBhcnQuSUQyKTsKLSAgICAgICAgICAgIGVkaXRvcjMgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlMyksCi0gICAgICAgICAgICAgICAgICAgIE1vY2tFZGl0b3JQYXJ0LklEMik7Ci0KLSAgICAgICAgICAgIERyYWdPcGVyYXRpb25zCi0gICAgICAgIAkJLmRyYWcoZWRpdG9yMywgbmV3IEVkaXRvckFyZWFEcm9wVGFyZ2V0KG5ldyBFeGlzdGluZ1dpbmRvd1Byb3ZpZGVyKHdpbmRvdyksIFNXVC5SSUdIVCksIGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3RhY2tlZFZpZXcxID0gZmluZFZpZXcoWm9vbVBlcnNwZWN0aXZlRmFjdG9yeS5TVEFDSzFfVklFVzEpOwotICAgICAgICBzdGFja2VkVmlldzIgPSBmaW5kVmlldyhab29tUGVyc3BlY3RpdmVGYWN0b3J5LlNUQUNLMV9WSUVXMik7Ci0gICAgICAgIHVuc3RhY2tlZFZpZXcgPSBmaW5kVmlldyhab29tUGVyc3BlY3RpdmVGYWN0b3J5LlVOU1RBQ0tFRF9WSUVXMSk7Ci0gICAgICAgIGZhc3RWaWV3ID0gZmluZFZpZXcoWm9vbVBlcnNwZWN0aXZlRmFjdG9yeS5GQVNUVklFVzEpOwotICAgIH0KLQotICAgIC8vIHpvb21zIHRoZSBnaXZlbiBwYXJ0Ci0gICAgcHJvdGVjdGVkIHZvaWQgem9vbShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIGlmIChwYXJ0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgcGFnZS5hY3RpdmF0ZShwYXJ0KTsKLSAgICAgICAgcGFnZS50b2dnbGVab29tKCgoUGFydFNpdGUpIHBhcnQuZ2V0U2l0ZSgpKS5nZXRQYW5lKCkKLSAgICAgICAgICAgICAgICAuZ2V0UGFydFJlZmVyZW5jZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocGFnZS5pc1pvb21lZCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaXNab29tZWQocGFydCkpOwotICAgIH0KLQotICAgIC8vIG9wZW4gdGhlIGdpdmVuIGZpbGUgaW4gYW4gZWRpdG9yCi0gICAgcHJvdGVjdGVkIHZvaWQgb3BlbkVkaXRvcihJRmlsZSBmaWxlLCBib29sZWFuIGFjdGl2YXRlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZmlsZSA9PSBmaWxlMSkKLSAgICAgICAgICAgICAgICBlZGl0b3IxID0gSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgYWN0aXZhdGUpOwotICAgICAgICAgICAgaWYgKGZpbGUgPT0gZmlsZTIpCi0gICAgICAgICAgICAgICAgZWRpdG9yMiA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIGFjdGl2YXRlKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElWaWV3UGFydCBmaW5kVmlldyhTdHJpbmcgaWQpIHsKLSAgICAgICAgSVZpZXdQYXJ0IHZpZXcgPSBwYWdlLmZpbmRWaWV3KGlkKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVmlldyAiICsgaWQgKyAiIG5vdCBmb3VuZCIsIHZpZXcpOwotICAgICAgICByZXR1cm4gdmlldzsKLSAgICB9Ci0gICAgCi0gICAgLy8gc2hvdyB0aGUgZ2l2ZW4gdmlldyBhcyBhIHJlZ3VsYXIgdmlldwotICAgIHByb3RlY3RlZCBJVmlld1BhcnQgc2hvd1JlZ3VsYXJWaWV3KFN0cmluZyBpZCwgaW50IG1vZGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElWaWV3UGFydCB2aWV3ID0gcGFnZS5zaG93VmlldyhpZCwgbnVsbCwgbW9kZSk7Ci0gICAgICAgICAgICBJVmlld1JlZmVyZW5jZSByZWYgPSAoSVZpZXdSZWZlcmVuY2UpIHBhZ2UuZ2V0UmVmZXJlbmNlKHZpZXcpOwotICAgICAgICAgICAgaWYgKHBhZ2UuaXNGYXN0VmlldyhyZWYpKQotICAgICAgICAgICAgICAgIHBhZ2UucmVtb3ZlRmFzdFZpZXcocmVmKTsKLSAgICAgICAgICAgIHJldHVybiB2aWV3OwotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gc2hvdyB0aGUgZ2l2ZW4gdmlldwotICAgIHByb3RlY3RlZCBJVmlld1BhcnQgc2hvd0Zhc3RWaWV3KFN0cmluZyBpZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIGludCBvbGRNb2RlID0gc3RvcmUuZ2V0SW50KElQcmVmZXJlbmNlQ29uc3RhbnRzLk9QRU5fVklFV19NT0RFKTsKLQkJCXN0b3JlLnNldFZhbHVlKElQcmVmZXJlbmNlQ29uc3RhbnRzLk9QRU5fVklFV19NT0RFLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5PVk1fRkFTVCk7Ci0JCQkKLSAgICAgICAgICAgIElWaWV3UGFydCB2aWV3ID0gcGFnZS5zaG93VmlldyhpZCk7Ci0gICAgICAgICAgICBJVmlld1JlZmVyZW5jZSByZWYgPSAoSVZpZXdSZWZlcmVuY2UpIHBhZ2UuZ2V0UmVmZXJlbmNlKHZpZXcpOwotICAgICAgICAgICAgcGFnZS5hZGRGYXN0VmlldyhyZWYpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocGFnZS5pc0Zhc3RWaWV3KHJlZikpOwotICAgICAgICAgICAgc3RvcmUuc2V0VmFsdWUoSVByZWZlcmVuY2VDb25zdGFudHMuT1BFTl9WSUVXX01PREUsIG9sZE1vZGUpOwotICAgICAgICAgICAgcmV0dXJuIHZpZXc7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBwYXJ0IGlzIHpvb21lZAotICAgIHByb3RlY3RlZCBib29sZWFuIGlzWm9vbWVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgUGFydFNpdGUgc2l0ZSA9IChQYXJ0U2l0ZSkgcGFydC5nZXRTaXRlKCk7Ci0gICAgICAgIFBhcnRQYW5lIHBhbmUgPSBzaXRlLmdldFBhbmUoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwYW5lLmlzWm9vbWVkKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gcGFydCBpcyB6b29tZWQuIElmIHRoZSBwYXJ0IGlzIG51bGwsIGFzc2VydHMKLSAgICAgKiB0aGF0IG5vIHBhcnRzIGFyZSB6b29tZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcnQKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Wm9vbWVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgaWYgKHBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKCJQYWdlIHNob3VsZCBub3QgYmUgem9vbWVkIiwgaXNab29tZWQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGUgcGFydCBpcyB6b29tZWQKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJFeHBlY3RpbmcgIiArIHBhcnROYW1lKHBhcnQpICsgIiB0byBiZSB6b29tZWQiLCBpc1pvb21lZChwYXJ0KSk7Ci0gICAgICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGUgcGFnZSBpcyB6b29tZWQgKHBhcmFub2lhIGNoZWNrKQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlBhZ2Ugc2hvdWxkIGJlIHpvb21lZCIsIGlzWm9vbWVkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBwYXJ0IGlzIGFjdGl2ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFydAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRBY3RpdmUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICBJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gcGFnZS5nZXRBY3RpdmVQYXJ0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGUgcGFydCBpcyBhY3RpdmUKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlVuZXhwZWN0ZWQgYWN0aXZlIHBhcnQ6IGV4cGVjdGVkICIgKyBwYXJ0TmFtZShwYXJ0KSAKLSAgICAgICAgICAgICAgICArICIgYW5kIGZvdW5kICIgKyBwYXJ0TmFtZShhY3RpdmVQYXJ0KSwgYWN0aXZlUGFydCA9PSBwYXJ0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZSBwYXJ0IGlzIGFuIGVkaXRvciwgYXNzZXJ0IHRoYXQgdGhlIGVkaXRvciBpcyBhY3RpdmUKLSAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotICAgICAgICAgICAgYXNzZXJ0QWN0aXZlRWRpdG9yKChJRWRpdG9yUGFydClwYXJ0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhcnROYW1lKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgaWYgKHBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIFV0aWwuc2FmZVN0cmluZyhwYXJ0LmdldFRpdGxlKCkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgewotICAgICAgICBJV29ya2JlbmNoUGFydCBhY3RpdmVFZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlVuZXhwZWN0ZWQgYWN0aXZlIGVkaXRvcjogZXhwZWN0ZWQgIiArIHBhcnROYW1lKHBhcnQpIAotICAgICAgICAgICAgICAgICsgIiBhbmQgZm91bmQgIiArIHBhcnROYW1lKGFjdGl2ZUVkaXRvciksIGFjdGl2ZUVkaXRvciA9PSBwYXJ0KTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvLyByZXR1cm5zIHRydWUgaWYgdGhlIHBhZ2UgaXMgbm90IHpvb21lZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNab29tZWQoKSB7Ci0gICAgICAgIHJldHVybiBwYWdlLmlzWm9vbWVkKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNsb3NlKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBJVmlld1BhcnQpIHsKLSAgICAgICAgICAgIHBhZ2UuaGlkZVZpZXcoKElWaWV3UGFydClwYXJ0KTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLSAgICAgICAgICAgIHBhZ2UuY2xvc2VFZGl0b3IoKElFZGl0b3JQYXJ0KXBhcnQsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9ab29tVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3pvb20vWm9vbVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDk1NTA4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9ab29tVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuem9vbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQSB0ZXN0IHN1aXRlIHRvIHRlc3QgdGhlIHpvb21pbmcgYmVoYXZpb3Igb2YgRWNsaXBzZS4KLSAqLwotcHVibGljIGNsYXNzIFpvb21UZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1aXRlLiAgVGhpcyBpcyByZXF1aXJlZCB0bwotICAgICAqIHVzZSB0aGUgSlVuaXQgTGF1bmNoZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFpvb21UZXN0U3VpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIHRlc3Qgc3VpdGUuCi0gICAgICovCi0gICAgcHVibGljIFpvb21UZXN0U3VpdGUoKSB7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShab29tZWRFZGl0b3JBY3RpdmF0ZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFpvb21lZFZpZXdBY3RpdmF0ZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVGVzdFN1aXRlKFpvb21lZEVkaXRvckNsb3NlVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoWm9vbWVkVmlld0Nsb3NlVGVzdC5jbGFzcykpOwotICAgICAgICBhZGRUZXN0KG5ldyBUZXN0U3VpdGUoU2hvd1ZpZXdUZXN0LmNsYXNzKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFRlc3RTdWl0ZShPcGVuRWRpdG9yVGVzdC5jbGFzcykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9ab29tZWRFZGl0b3JBY3RpdmF0ZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9ab29tZWRFZGl0b3JBY3RpdmF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI3MWQwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3pvb20vWm9vbWVkRWRpdG9yQWN0aXZhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuem9vbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFpvb21lZEVkaXRvckFjdGl2YXRlVGVzdCBleHRlbmRzIEFjdGl2YXRlVGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBab29tZWRFZGl0b3JBY3RpdmF0ZVRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuem9vbS5BY3RpdmF0ZVRlc3QjZ2V0U3RhY2tlZFBhcnQxKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtiZW5jaFBhcnQgZ2V0U3RhY2tlZFBhcnQxKCkgewotICAgICAgICByZXR1cm4gZWRpdG9yMTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy56b29tLkFjdGl2YXRlVGVzdCNnZXRTdGFja2VkUGFydDIoKQotICAgICAqLwotICAgIHB1YmxpYyBJV29ya2JlbmNoUGFydCBnZXRTdGFja2VkUGFydDIoKSB7Ci0gICAgICAgIHJldHVybiBlZGl0b3IyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnpvb20uQWN0aXZhdGVUZXN0I2dldFVuc3RhY2tlZFBhcnQoKQotICAgICAqLwotICAgIHB1YmxpYyBJV29ya2JlbmNoUGFydCBnZXRVbnN0YWNrZWRQYXJ0KCkgewotICAgICAgICByZXR1cm4gZWRpdG9yMzsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogPHA+VGVzdDogWm9vbSBhbiBlZGl0b3IgdGhlbiBhY3RpdmF0ZSBhIHZpZXc8L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiBwYWdlIHVuem9vbXM8L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBY3RpdmF0ZVZpZXcoKSB7Ci0gICAgICAgIHpvb20oZWRpdG9yMSk7Ci0gICAgICAgIHBhZ2UuYWN0aXZhdGUoc3RhY2tlZFZpZXcxKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFpvb21lZChudWxsKTsKLSAgICAgICAgYXNzZXJ0QWN0aXZlKHN0YWNrZWRWaWV3MSk7Ci0gICAgfQotCi0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3pvb20vWm9vbWVkRWRpdG9yQ2xvc2VUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3pvb20vWm9vbWVkRWRpdG9yQ2xvc2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZmZjOTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy96b29tL1pvb21lZEVkaXRvckNsb3NlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnpvb207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBab29tZWRFZGl0b3JDbG9zZVRlc3QgZXh0ZW5kcyBDbG9zZVRlc3QgewotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgWm9vbWVkRWRpdG9yQ2xvc2VUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnpvb20uQ2xvc2VUZXN0I2dldFN0YWNrZWRQYXJ0MSgpCi0gICAgICovCi0gICAgcHVibGljIElXb3JrYmVuY2hQYXJ0IGdldFN0YWNrZWRQYXJ0MSgpIHsKLSAgICAgICAgcmV0dXJuIGVkaXRvcjE7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuem9vbS5DbG9zZVRlc3QjZ2V0U3RhY2tlZFBhcnQyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtiZW5jaFBhcnQgZ2V0U3RhY2tlZFBhcnQyKCkgewotICAgICAgICByZXR1cm4gZWRpdG9yMjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy56b29tLkNsb3NlVGVzdCNnZXRVbnN0YWNrZWRQYXJ0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtiZW5jaFBhcnQgZ2V0VW5zdGFja2VkUGFydCgpIHsKLSAgICAgICAgcmV0dXJuIGVkaXRvcjM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPlRlc3Q6IEFjdGl2YXRlIGEgdmlldywgdGhlbiB6b29tIGFuIHVuc3RhY2tlZCBlZGl0b3IgYW5kIGNsb3NlIGl0LjwvcD4KLSAgICAgKiA8cD5FeHBlY3RlZCByZXN1bHQ6IFRoZSBwcmV2aW91c2x5IGFjdGl2ZSBFZGl0b3IgYmVjb21lcyBhY3RpdmUgYW5kIHVuem9vbWVkPC9wPgotICAgICAqIDxwPk5vdGU6IFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBhY3RpdmF0aW9uIGxpc3QgaXMgdXNlZCBpZiB0aGVyZSBpcyBub3RoaW5nIGF2YWlsYWJsZQotICAgICAqICAgIGluIHRoZSBjdXJyZW50bHkgem9vbWVkIHN0YWNrLiBJdCBhbHNvIGVuc3VyZXMgdGhhdCBhY3RpdmF0aW9uIG5ldmVyIG1vdmVzIGZyb20KLSAgICAgKiAgICBhbiBlZGl0b3IgdG8gYSB2aWV3IHdoZW4gYW4gZWRpdG9yIGlzIGNsb3NlZC48L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlWm9vbWVkVW5zdGFja2VkRWRpdG9yQWZ0ZXJBY3RpdmF0aW5nVmlldygpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgcHJldmlvdXNFZGl0b3IgPSBlZGl0b3IxOwotICAgICAgICBJV29ya2JlbmNoUGFydCBwcmV2aW91c0FjdGl2ZSA9IHN0YWNrZWRWaWV3MTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgem9vbWVkUGFydCA9IGVkaXRvcjM7Ci0gICAgICAgIAotICAgICAgICBwYWdlLmFjdGl2YXRlKGVkaXRvcjEpOwotICAgICAgICBwYWdlLmFjdGl2YXRlKHByZXZpb3VzQWN0aXZlKTsKLSAgICAgICAgem9vbSh6b29tZWRQYXJ0KTsKLSAgICAgICAgY2xvc2Uoem9vbWVkUGFydCk7Ci0KLSAgICAgICAgYXNzZXJ0Wm9vbWVkKG51bGwpOwotICAgICAgICBhc3NlcnRBY3RpdmUoZWRpdG9yMSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPlRlc3Q6IEFjdGl2YXRlIGFuIHVuc3RhY2tlZCBlZGl0b3IsIGFjdGl2YXRlIGFuIHVuc3RhY2tlZCB2aWV3LCBhY3RpdmF0ZSBhIHN0YWNrZWQgZWRpdG9yLCAKLSAgICAgKiAgICB0aGVuIGNsb3NlIHRoZSBhY3RpdmUgZWRpdG9yLjwvcD4KLSAgICAgKiA8cD5FeHBlY3RlZCByZXN1bHQ6IFRoZSBwcmV2aW91c2x5IGFjdGl2ZSBlZGl0b3IgYmVjb21lcyBhY3RpdmUgKGV2ZW4gdGhvdWdoIGEgdmlldyBpcyBuZXh0Ci0gICAgICogICAgaW4gdGhlIGFjdGl2YXRpb24gbGlzdCk8L3A+Ci0gICAgICogPHA+Tm90ZTogVGhpcyBpc24ndCByZWFsbHkgYSB6b29tIHRlc3QsIGJ1dCBpdCBlbnN1cmVzIHRoYXQgYWN0aXZhdGlvbiBkb2Vzbid0IG1vdmUgZnJvbSBhbiBlZGl0b3IKLSAgICAgKiAgICB0byBhIHZpZXcgd2hlbiB0aGUgYWN0aXZlIGVkaXRvciBpcyBjbG9zZWQuIEFjdGl2YXRpbmcgYW4gZWRpdG9yIGluIGEgZGlmZmVyZW50IHN0YWNrIGZpcnN0IAotICAgICAqICAgIGVuc3VyZXMgdGhhdCBhY3RpdmF0aW9uIFdJTEwgbW92ZSBiZXR3ZWVuIGVkaXRvciBzdGFja3MgdG8gZm9sbG93IHRoZSBhY3RpdmF0aW9uIG9yZGVyLjwvcD4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlVW56b29tZWRTdGFja2VkRWRpdG9yQWZ0ZXJBY3RpdmF0aW5nVmlldygpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgcHJldmlvdXNBY3RpdmVFZGl0b3IgPSBlZGl0b3IyOwotICAgICAgICBJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gZ2V0U3RhY2tlZFBhcnQxKCk7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IG90aGVyU3RhY2tlZFBhcnQgPSBnZXRTdGFja2VkUGFydDIoKTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgdW5zdGFja2VkUGFydCA9IHVuc3RhY2tlZFZpZXc7Ci0gICAgICAgIAotICAgICAgICBwYWdlLmFjdGl2YXRlKGVkaXRvcjMpOwotICAgICAgICBwYWdlLmFjdGl2YXRlKHVuc3RhY2tlZFZpZXcpOwotICAgICAgICBwYWdlLmFjdGl2YXRlKGVkaXRvcjEpOwotICAgICAgICBjbG9zZShlZGl0b3IxKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IGFjdGl2YXRpb24gbW92ZWQgdG8gdGhlIHByZXZpb3VzbHkgYWN0aXZlIGVkaXRvciwgZXZlbiB0aG91Z2gKLSAgICAgICAgLy8gYSB2aWV3IHdhcyBuZXh0IGluIHRoZSBhY3RpdmF0aW9uIGxpc3QuCi0gICAgICAgIGFzc2VydFpvb21lZChudWxsKTsKLSAgICAgICAgYXNzZXJ0QWN0aXZlKGVkaXRvcjMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9ab29tZWRWaWV3QWN0aXZhdGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9FY2xpcHNlIFVJIFRlc3RzL29yZy9lY2xpcHNlL3VpL3Rlc3RzL3pvb20vWm9vbWVkVmlld0FjdGl2YXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzIzNmIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9ab29tZWRWaWV3QWN0aXZhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuem9vbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFpvb21lZFZpZXdBY3RpdmF0ZVRlc3QgZXh0ZW5kcyBBY3RpdmF0ZVRlc3QgewotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgWm9vbWVkVmlld0FjdGl2YXRlVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy56b29tLkFjdGl2YXRlVGVzdCNnZXRTdGFja2VkUGFydDEoKQotICAgICAqLwotICAgIHB1YmxpYyBJV29ya2JlbmNoUGFydCBnZXRTdGFja2VkUGFydDEoKSB7Ci0gICAgICAgIHJldHVybiBzdGFja2VkVmlldzE7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuem9vbS5BY3RpdmF0ZVRlc3QjZ2V0U3RhY2tlZFBhcnQyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtiZW5jaFBhcnQgZ2V0U3RhY2tlZFBhcnQyKCkgewotICAgICAgICByZXR1cm4gc3RhY2tlZFZpZXcyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnpvb20uQWN0aXZhdGVUZXN0I2dldFVuc3RhY2tlZFBhcnQoKQotICAgICAqLwotICAgIHB1YmxpYyBJV29ya2JlbmNoUGFydCBnZXRVbnN0YWNrZWRQYXJ0KCkgewotICAgICAgICByZXR1cm4gdW5zdGFja2VkVmlldzsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogPHA+VGVzdDogWm9vbSBhIHZpZXcgdGhlbiBhY3RpdmF0ZSBhbiBlZGl0b3I8L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiBwYWdlIHVuem9vbXM8L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBY3RpdmF0ZUVkaXRvcigpIHsKLSAgICAgICAgem9vbShzdGFja2VkVmlldzEpOwotICAgICAgICBwYWdlLmFjdGl2YXRlKGVkaXRvcjEpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKG51bGwpOwotICAgICAgICBhc3NlcnRBY3RpdmUoZWRpdG9yMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy96b29tL1pvb21lZFZpZXdDbG9zZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL0VjbGlwc2UgVUkgVGVzdHMvb3JnL2VjbGlwc2UvdWkvdGVzdHMvem9vbS9ab29tZWRWaWV3Q2xvc2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNjU2NmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvRWNsaXBzZSBVSSBUZXN0cy9vcmcvZWNsaXBzZS91aS90ZXN0cy96b29tL1pvb21lZFZpZXdDbG9zZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudWkudGVzdHMuem9vbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFpvb21lZFZpZXdDbG9zZVRlc3QgZXh0ZW5kcyBDbG9zZVRlc3QgewotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgWm9vbWVkVmlld0Nsb3NlVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXN0cy56b29tLkNsb3NlVGVzdCNnZXRTdGFja2VkUGFydDEoKQotICAgICAqLwotICAgIHB1YmxpYyBJV29ya2JlbmNoUGFydCBnZXRTdGFja2VkUGFydDEoKSB7Ci0gICAgICAgIHJldHVybiBzdGFja2VkVmlldzE7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGVzdHMuem9vbS5DbG9zZVRlc3QjZ2V0U3RhY2tlZFBhcnQyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVdvcmtiZW5jaFBhcnQgZ2V0U3RhY2tlZFBhcnQyKCkgewotICAgICAgICByZXR1cm4gc3RhY2tlZFZpZXcyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnpvb20uQ2xvc2VUZXN0I2dldFVuc3RhY2tlZFBhcnQoKQotICAgICAqLwotICAgIHB1YmxpYyBJV29ya2JlbmNoUGFydCBnZXRVbnN0YWNrZWRQYXJ0KCkgewotICAgICAgICByZXR1cm4gdW5zdGFja2VkVmlldzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5UZXN0OiBab29tIGEgdmlldywgdGhlbiBjbG9zZSB0aGUgYWN0aXZlIGVkaXRvci48L3A+Ci0gICAgICogPHA+RXhwZWN0ZWQgcmVzdWx0OiBUaGUgdmlldyByZW1haW5zIHpvb21lZCBhbmQgYWN0aXZlLiBBIG5ldyBlZGl0b3IgaXMgc2VsZWN0ZWQgYXMgdGhlCi0gICAgICogICAgYWN0aXZlIGVkaXRvci48L3A+Ci0gICAgICogPHA+Tm90ZTogVGhlIGJlaGF2aW9yIG9mIHRoaXMgdGVzdCBjaGFuZ2VkIGludGVudGlvbmFsbHkgb24gMDUwNDE2LiBDbG9zaW5nIHRoZSBhY3RpdmUgZWRpdG9yCi0gICAgICogICAgbm8gbG9uZ2VyIHVuem9vbXMgaWYgYSB2aWV3IGlzIHpvb21lZC48L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUFjdGl2ZUVkaXRvcldoaWxlVmlld1pvb21lZCgpIHsKLSAgICAgICAgcGFnZS5hY3RpdmF0ZShlZGl0b3IxKTsKLSAgICAgICAgem9vbShzdGFja2VkVmlldzEpOwotICAgICAgICBjbG9zZShlZGl0b3IxKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFpvb21lZChzdGFja2VkVmlldzEpOwotICAgICAgICBhc3NlcnRBY3RpdmUoc3RhY2tlZFZpZXcxKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+VGVzdDogWm9vbSBhbiB1bnN0YWNrZWQgdmlldyBhbmQgY2xvc2UgaXQuPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogVGhlIHByZXZpb3VzbHkgYWN0aXZlIHBhcnQgYmVjb21lcyBhY3RpdmUgYW5kIHVuem9vbWVkPC9wPgotICAgICAqIDxwPk5vdGU6IFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBhY3RpdmF0aW9uIGxpc3QgaXMgdXNlZCBpZiB0aGVyZSBpcyBub3RoaW5nIGF2YWlsYWJsZQotICAgICAqICAgIGluIHRoZSBjdXJyZW50bHkgem9vbWVkIHN0YWNrLjwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2Vab29tZWRVbnN0YWNrZWRWaWV3QWZ0ZXJBY3RpdmF0aW5nVmlldygpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgcHJldmlvdXNBY3RpdmUgPSBzdGFja2VkVmlldzE7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHpvb21lZFBhcnQgPSBnZXRVbnN0YWNrZWRQYXJ0KCk7Ci0gICAgICAgIAotICAgICAgICBwYWdlLmFjdGl2YXRlKHByZXZpb3VzQWN0aXZlKTsKLSAgICAgICAgem9vbSh6b29tZWRQYXJ0KTsKLSAgICAgICAgY2xvc2Uoem9vbWVkUGFydCk7Ci0KLSAgICAgICAgYXNzZXJ0Wm9vbWVkKG51bGwpOwotICAgICAgICBhc3NlcnRBY3RpdmUocHJldmlvdXNBY3RpdmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPlRlc3Q6IEFjdGl2YXRlIGFuIHVuc3RhY2tlZCB2aWV3LCBhY3RpdmF0ZSBhIHN0YWNrZWQgcGFydCwgdGhlbiBjbG9zZSB0aGUgYWN0aXZlIHBhcnQuPC9wPgotICAgICAqIDxwPkV4cGVjdGVkIHJlc3VsdDogVGhlIHVuc3RhY2tlZCBwYXJ0IGJlY29tZXMgYWN0aXZlPC9wPgotICAgICAqIDxwPk5vdGU6IFRoaXMgaXNuJ3QgcmVhbGx5IGEgem9vbSB0ZXN0LCBidXQgaXQgZW5zdXJlcyB0aGF0IGFjdGl2YXRpb24gCi0gICAgICogICAgd2lsbCBtb3ZlIGJldHdlZW4gc3RhY2tzIHdoZW4gdGhlcmUgaXMgbm8gem9vbS48L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlVW56b29tZWRTdGFja2VkVmlld0FmdGVyQWN0aXZhdGluZ1ZpZXcoKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRTdGFja2VkUGFydDEoKTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgb3RoZXJTdGFja2VkUGFydCA9IGdldFN0YWNrZWRQYXJ0MigpOwotICAgICAgICBJV29ya2JlbmNoUGFydCB1bnN0YWNrZWRQYXJ0ID0gdW5zdGFja2VkVmlldzsKLSAgICAgICAgCi0gICAgICAgIHBhZ2UuYWN0aXZhdGUodW5zdGFja2VkUGFydCk7Ci0gICAgICAgIHBhZ2UuYWN0aXZhdGUoYWN0aXZlUGFydCk7Ci0gICAgICAgIGNsb3NlKGFjdGl2ZVBhcnQpOwotICAgICAgICAKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIG90aGVyIHBhcnQgaW4gdGhlIHpvb21lZCBzdGFjayBpcyBub3cgem9vbWVkIGFuZCBhY3RpdmUKLSAgICAgICAgYXNzZXJ0Wm9vbWVkKG51bGwpOwotICAgICAgICBhc3NlcnRBY3RpdmUodW5zdGFja2VkUGFydCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhYWExNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVjbGlwc2UgVUkgVGVzdHMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVpLnRlc3RzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IHVpdGVzdHMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbXBhdGliaWxpdHkuUGx1Z2luQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHksCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucywKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UudWkudmlld3MsCi0gb3JnLmVjbGlwc2UudGV4dCwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UsCi0gb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzLAotIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmhhcm5lc3MKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCi1QbHVnaW4tQ2xhc3M6IG9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RQbHVnaW4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvQ29tbW9uTmF2aWdhdG9yLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvQ29tbW9uTmF2aWdhdG9yLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmNmZjZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL0NvbW1vbk5hdmlnYXRvci50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi1UaGlzIGlzIGEgdGVzdCBsaXN0IGZvciB0aGUgQ29tbW9uIE5hdmlnYXRvciB2aWV3LiBUaGlzIGxpc3QgaXMgYSB0cmltbWVkIAotZG93biB2ZXJzaW9uIG9mIHRoZSBSZXNvdXJjZSBOYXZpZ2F0b3IgdmlldyBjb21wb25lbnQgdGVzdCBwbGFuLgotCi1FZGl0IEFjdGlvbnMgKE5vdCB5ZXQgc3VwcG9ydGVkIGluIENvbW1vbiBOYXZpZ2F0b3IgdGVzdCBwYXNzIFtDb21pbmcgaW4gTTVdKQotCVZlcmlmeSB0aGF0IGVuYWJsZW1lbnQgb2YgQ29weSwgRGVsZXRlLCBBZGQgQm9va21hcmsgaXMgY29uc2lzdGVudCB3aXRoIHRoYXQgb2YgdGhlIE5hdmlnYXRvciB2aWV3J3MgY29udGV4dCBtZW51LCBhbmQgdGhhdCAKLQkJdGhlIHNhbWUgYmVoYXZpb3VyIG9jY3Vycy4KLQotUHJlc2VudGF0aW9uCi0JVmVyaWZ5IHRoYXQgYXBwcm9wcmlhdGUgc3RyaW5ncyBhcHBlYXIgaW4gYWxsIG1lbnUgaXRlbXMgYW5kIHRleHQgZmllbGRzLgotCVZlcmlmeSBpY29ucyBmb3IgZmlsZSwgZm9sZGVyIGFuZCBwcm9qZWN0LgotCVZlcmlmeSB0aGF0IHRoZSB2aWV3IHNob3dzIGFwcHJvcHJpYXRlIHNjcm9sbGJhcnMgd2hlbiBpdHMgY29udGVudHMgZXh0ZW5kcyBiZXlvbmQgaXRzIGNsaWVudCBhcmVhLgotCi1TdGFuZGFyZCBPYmplY3QgQWN0aW9ucyAoTm90IHlldCBzdXBwb3J0ZWQgaW4gQ29tbW9uIE5hdmlnYXRvciB0ZXN0IHBhc3MgW0NvbWluZyBpbiBNNV0pCi0JVmVyaWZ5IG1lbnUgaXRlbXM6IENvcHksIE1vdmUsIFJlbmFtZSwgRGVsZXRlIGZvciBhbGwgcmVzb3VjZXMuCi0JVmVyaWZ5IHRoYXQgdGhlIERFTEVURSBrZXkgbWFwcyB0byB0aGUgRGVsZXRlIGFjdGlvbi4KLQlWZXJpZnkgRGVsZXRlIG9uIGEgcmVhZC1vbmx5IHJlc291cmNlLgotCVZlcmlmeSBQcm9wZXJ0aWVzIGZvciBwcm9qZWN0cywgZm9sZGVycywgZmlsZXMsIGFuZCBjb21iaW5hdGlvbnMgb2YgdGhlIHNhbWUuIAotCVZlcmlmeSB0aGF0IHdoZW4gdGhlIHZpZXcgaXMgYWN0aXZlLCB0aGUgc3RhdHVzIGJhciBzaG93cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBzZWxlY3RlZCByZXNvdXJjZS4KLQotQWN0aW9ucyBvbiBNdWx0aXNlbGVjdGVkIEl0ZW1zIChOb3QgeWV0IHN1cHBvcnRlZCBpbiBDb21tb24gTmF2aWdhdG9yIHRlc3QgcGFzcyBbQ29taW5nIGluIE01XSkKLQlJZiB0d28gb3IgbW9yZSByZXNvdXJjZXMgYXJlIG11bHRpc2VsZWN0ZWQsIFJlbmFtZSBpcyBkaXNhYmxlZC4KLQlJZiBhIHByb2plY3QgYW5kIGl0cyByZXNvdXJjZShzKSBhcmUgbXVsdGlzZWxlY3RlZCwgQ29weSBhbmQgTW92ZSBhcmUgZGlzYWJsZWQuCi0JSWYgYSBmb2xkZXIgYW5kIGl0cyBjaGlsZCByZXNvdXJjZShzKSBhcmUgbXVsdGlzZWxlY3RlZCwgQ29weSBhbmQgTW92ZSBhcmUgZGlzYWJsZWQuIAotCVZlcmlmeSBEZWxldGUgb24gbXVsdGlzZWxlY3RlZCByZXNvdXJjZXMuCi0JVmVyaWZ5IENvcHkgYW5kIE1vdmUgb24gbXVsdGlzZWxlY3RlZCBmaWxlcyBpbiB0aGUgc2FtZSBwcm9qZWN0LgotCi1GaWxlIFNwZWNpZmljIEFjdGlvbnMgCi0JVmVyaWZ5IG1lbnUgY29udGVudCB3aGVuIGZpbGUgc2VsZWN0ZWQuCVtTaG91bGQgaW5jbHVkZSBOZXc+IHdpdGggJ1Byb2plY3QnIGFuZCAnT3RoZXInLCBPcGVuLCBhbmQgT3BlbiBXaXRoLCBpbiBhZGRpdGlvbiB0byBiYXNpYyBvYmplY3QgY29udHJpYnV0aW9uc10gCSAKLQlWZXJpZnkgQWRkIEJvb2ttYXJrIG9ubHkgYXBwZWFycyBvbiBmaWxlcyBhbmQgdGhlIGJvb2ttYXJrIGlzIGNyZWF0ZWQgd2hlbiBpbnZva2VkLiAoTm90IHlldCBzdXBwb3J0ZWQgaW4gQ29tbW9uIE5hdmlnYXRvciB0ZXN0IHBhc3MgW0NvbWluZyBpbiBNNV0pCi0KLUZvbGRlciBTcGVjaWZpYyBBY3Rpb25zIChOb3QgeWV0IHN1cHBvcnRlZCBpbiBDb21tb24gTmF2aWdhdG9yIHRlc3QgcGFzcyBbQ29taW5nIGluIE01XSkKLQlWZXJpZnkgdGhlIGNvcHkgdG8gdGhlIHNhbWUgZm9sZGVyIGFuZCB0aGUgZGlmZmVyZW50IGZvbGRlci4KLQotUHJvamVjdCBTcGVjaWZpYyBBY3Rpb25zIChOb3QgeWV0IHN1cHBvcnRlZCBpbiBDb21tb24gTmF2aWdhdG9yIHRlc3QgcGFzcyBbQ29taW5nIGluIE01XSkKLQlNZW51IGluY2x1ZGVzIGdyb3VwIHdpdGggQnVpbGQsIFJlZnJlc2gsIENsb3NlIFByb2plY3QgYW5kIE9wZW4gUHJvamVjdAotCUNsb3NlIFByb2plY3QgYXBwZWFycyBvbmx5IG9uIGFuIG9wZW4gcHJvamVjdAotCU9wZW4gUHJvamVjdCBhcHBlYXJzIG9ubHkgb24gYSBjbG9zZWQgcHJvamVjdAotCUJvdGggT3BlbiBQcm9qZWN0IGFuZCBDbG9zZSBQcm9qZWN0IGFwcGVhciB3aGVuIHNlbGVjdGlvbiBpbmNsdWRlcyBib3RoIGFuIG9wZW4gYW5kIGEgY2xvc2VkIHByb2plY3QKLQlGb3IgYSBjbG9zZWQgcHJvamVjdCwgUmVuYW1lIGlzIGRpc2FibGVkIGFuZCBHbyBJbnRvLCBCdWlsZCwgUmVmcmVzaCwgQ2xvc2UgUHJvamVjdCBkbyBub3QgYXBwZWFyCi0KLU5ldyBPYmplY3QgQWN0aW9ucyAKLQlJbnZva2UgRmlsZSBOZXcgLi4gcHJvamVjdHMsIGl0ZW1zLCBvdGhlci4JCi0JVmVyaWZ5IHRoYXQgdGhlIHZpZXcncyBOZXcgbWVudSBpcyB0aGUgc2FtZSBhcyBGaWxlIHwgTmV3IGluIHRoZSBXaW5kb3cuIChOb3QgeWV0IHN1cHBvcnRlZCBpbiBDb21tb24gTmF2aWdhdG9yIHRlc3QgcGFzcyBbQ29taW5nIGluIE01XSkKLQotVmlldyBBY3Rpb25zIChOb3QgeWV0IHN1cHBvcnRlZCBpbiBDb21tb24gTmF2aWdhdG9yIHRlc3QgcGFzcyBbQ29taW5nIGluIE01XSkKLQlJbnZva2UgU29ydCB8IGJ5IE5hbWUsIHwgYnkgVHlwZSBpbiB0aGUgcHVsbGRvd24gbWVudS4gQXZvaWQgdXNpbmcgb25seSBhLmphdmEgYW5kIGIudHh0IGZvciBhIHRlc3RpbmcgY2FzZSBzaW5jZSB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lCi0JCXJlZ2FyZGxlc3Mgb2YgdGhlIHNvcnQga2V5LgotCUludm9rZSBGaWx0ZXJzLi4uIHdpdGggU2VsZWN0IEFsbCwgRGVzZWxlY3QgQWxsIG9wdGlvbnMuCi0JCi1OYXZpZ2F0aW9uIEFjdGlvbnMgKE5vdCB5ZXQgc3VwcG9ydGVkIGluIENvbW1vbiBOYXZpZ2F0b3IgdGVzdCBwYXNzIFtDb21pbmcgaW4gTTVdKQotCVRoZSB2aWV3IGtlZXBzIHRyYWNrIG9mIG5hdmlnYXRpb24gaGlzdG9yeS4gR28gSW50byBhbmQgR28gVXAgYWRkIGFuIGl0ZW0uIEJhY2sgYW5kIEZvcndhcmQgY2hhbmdlIHRoZSBjdXJzb3IgaW4gdGhlIGhpc3RvcnkgbGlzdC4KLQlTZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlciwgaW52b2tlIEdvIEludG8sIEdvIHRvIHwgQmFjaywgR28gdG8gfCBGb3J3YXJkLCBhbmQgR28gdG8gfCBVcC4KLQlWZXJpZnkgZW5hYmxlbWVudCBvZiBHbyB4eCBhY3Rpb25zIHJlZmxlY3Qgc2VsZWN0aW9uIGFuZCBuYXZpZ2F0aW9uIGhpc3RvcnkuCi0JCS0gR28gSW50byBpcyBlbmFibGVkIHdoZW4gYW4gb3Blbiwgbm9uLWVtcHR5IHByb2plY3Qgb3IgYSBub24tZW1wdHkgZm9sZGVyIGlzIHNlbGVjdGVkIAkJCi0JCS0gR28gVXAgaXMgZW5hYmxlZCB3aGVuIHRoZSBpbnB1dCBoYXMgYSBwYXJlbnQgLiAgCi0JCS0gR28gRm9yd2FyZCBpcyBlbmFibGVkIHdoZW4gdGhlcmUgYXJlIGZvbGxvd2luZyBpdGVtcyBpbiB0aGUgbGlzdCwgR28gQmFjayBlbmFibGVkIHdoZW4gdGhlcmUgYXJlIHByZXZpb3VzIGl0ZW1zLgotCVZlcmlmeSB0aGF0IHRoZSB2aWV3J3MgdGl0bGViYXIgZGlzcGxheXMgdGhlIHNpbXBsZSBuYW1lIG9mIGl0cyBpbnB1dCwgYW5kIHRoYXQgaXRzIHRvb2x0aXAgZGlzcGxheXMgdGhlIGZ1bGwgcGF0aCBvZiBpdHMgaW5wdXQuCi0JVmVyaWZ5IHRoYXQgdGhlIGVuYWJsZW1lbnQgYW5kIHRoZSBhY3Rpb25zIG9mIHRoZSBuYXZpZ2F0aW9uIGJ1dHRvbnMgaW4gdGhlIGxvY2FsIHRvb2xiYXIgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgTmF2aWdhdGUgbWFpbiBtZW51LgotCVZlcmlmeSB0aGF0IHdoZW4gYSBuYXZpZ2F0aW9uIGJ1dHRvbiBpbiB0aGUgbG9jYWwgdG9vbGJhciBpcyBlbmFibGVkLCB0aGUgZnVsbHBhdGggb2Ygd2hlcmUgdGhlIGJ1dHRvbiBsZWFkcyB0byBpcyBhcHBlbmRlZCB0byB0aGUgYnV0dG9uJ3MgdG9vbHRpcC4KLQkJZS5nIElmIHRoZSBwYXRoIG9mIHRoZSB2aWV3J3MgaW5wdXQgaXMgUHJvamVjdC9Gb2xkZXIvTXlGb2xkZXIsIHRoZSAnVXAnIGJ1dHRvbiBoYXMgdGhlIHRvb2x0aXAgdGhhdCBzYXlzICdVcCB0byBQcm9qZWN0L0ZvbGRlcicKLQotUGVyc2lzdGVuY2UgKE5vdCB5ZXQgc3VwcG9ydGVkIGluIENvbW1vbiBOYXZpZ2F0b3IgdGVzdCBwYXNzIFtDb21pbmcgaW4gTTVdKQotCVZlcmlmeSB0aGF0IHRoZSBzb3J0IHR5cGUgcmVtYWlucyB0aGUgc2FtZSBhZnRlciBjbG9zaW5nIGFuZCByZW9wZW5pbmcgdGhlIE5hdmlnYXRvciB2aWV3Ci0JVmVyaWZ5IHRoYXQgdGhlIGlucHV0IGlzIHBlcnNpc3RlbnQgYmV0d2VlbiBzZXNzaW9ucy4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvQ29tcG9uZW50IFRlc3RzLmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL0NvbXBvbmVudCBUZXN0cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI5NDMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvQ29tcG9uZW50IFRlc3RzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPldvcmtiZW5jaCBNYW51YWwgQ29tcG9uZW50IFRlc3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+Ci08Yj5NYW51YWwgQ29tcG9uZW50IFRlc3RzIGZvciB0aGUgV29ya2JlbmNoIChvcmcuZWNsaXBzZS51aSk8L2I+PC9oMj4KLUxhc3QgdXBkYXRlZCBNYXkgOSwgMjAwNQotCi08cD4KLTxicj48YSBocmVmPSJXb3JrYmVuY2hMYXlvdXQudHh0Ij5Xb3JrYmVuY2ggTGF5b3V0PC9hPgotPGJyPjxhIGhyZWY9IldvcmtiZW5jaEFjdGlvbi50eHQiPldvcmtiZW5jaCBBY3Rpb25zPC9hPgotPGJyPjxhIGhyZWY9IldlbGNvbWVFZGl0b3IudHh0Ij5XZWxjb21lIEVkaXRvcjwvYT4KLTxicj48YSBocmVmPSJJbXBvcnQudHh0Ij5JbXBvcnQ8L2E+Ci08YnI+PGEgaHJlZj0iRXhwb3J0LnR4dCI+RXhwb3J0PC9hPgotPGJyPjxhIGhyZWY9Ik5hdmlnYXRvci50eHQiPk5hdmlnYXRvciBWaWV3PC9hPgotPGJyPjxhIGhyZWY9IkNvbW1vbk5hdmlnYXRvci50eHQiPkV4cGVyaW1lbnRhbCBOYXZpZ2F0b3IgVmlldzwvYT4KLTxicj48YSBocmVmPSJPdXRsaW5lLnR4dCI+T3V0bGluZSBWaWV3PC9hPgotPGJyPjxhIGhyZWY9IlByb3BlcnRpZXNWaWV3LnR4dCI+UHJvcGVydGllcyBWaWV3PC9hPgotPGJyPjxhIGhyZWY9IlRhc2tzLnR4dCI+VGFza3MgVmlldzwvYT4KLTxicj48YSBocmVmPSJQcmVmZXJlbmNlcy50eHQiPlByZWZlcmVuY2VzPC9hPgotPGJyPjxhIGhyZWY9IlByb3BlcnRpZXNEaWFsb2cudHh0Ij5Qcm9wZXJ0aWVzIERpYWxvZzwvYT4KLTxicj48YSBocmVmPSJUZXh0RWRpdG9yLnR4dCI+VGV4dCBFZGl0b3I8L2E+Ci08YnI+PGEgaHJlZj0iVW5kby50eHQiPkludGVncmF0ZWQgVW5kbzwvYT4KLQotPGJyPiZuYnNwOwotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL0V4cG9ydC50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL0V4cG9ydC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMzNjOWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9FeHBvcnQudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLVRoaXMgaXMgYSB0ZXN0IHNjcmlwdCBmb3IgdGhlIGV4cG9ydCB3aXphcmQuCi0KLUNvbW1vbiBQcm9wZXJ0aWVzIGZvciBBbGwgUGFnZXMKLQlWZXJpZnkgdGhhdCBhbGwgbGlzdGJveGVzIHNob3cgYXBwcm9wcmlhdGUgc2Nyb2xsYmFycyB3aGVuIAotCQl0aGVpciBjb250ZW50cyBleHRlbmRzIGJleW9uZCB0aGVpciBjbGllbnQgYXJlYS4KLQlUaGUgQ2FuY2VsIGJ1dHRvbiBpcyBlbmFibGVkIGFsbCB0aGUgdGltZS4KLQlWZXJpZnkgdGhhdCBDYW5jZWwgZGlzY2FyZHMgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgd2l6YXJkIGJ5IAotCQlkb2luZyB0aGUgZm9sbG93aW5nOgotCQktIG9uIHRoZSBTZWxlY3QgcGFnZSwgY2hvb3NlIGFueSBvbmUgb2YgaXRlbXMgaW4gdGhlIGxpc3QgYW5kIGNsaWNrIE5leHQuCi0JCS0gbWFrZSBjaGFuZ2UgdG8gdGhlIGRlc3RpbmF0aW9uIG9yIHRoZSBvcHRpb24gc2V0dGluZ3Mgb3IgYm90aC4KLQkJLSBjYW5jZWwgdGhlIHdpemFyZC4KLQkJLSBvcGVuIHRoZSB3aXphcmQgYWdhaW4gYW5kIGVuc3VyZSB0aGF0IHRoZSBwcmVzZWxlY3Rpb24gb2YgdGhlIFNlbGVjdCBwYWdlKCBpZiB0aGVyZSB3YXMgYW55ICksIGFuZCB0aGUgdmFsdWVzIG9mIAotCQkJdGhlIGRlc3RpbmF0aW9uIGFuZCB0aGUgb3B0aW9ucyByZW1haW4gdGhlIHNhbWUgYXMgYmVmb3JlIHRoZSBjaGFuZ2UuCi0KLVNlbGVjdCBQYWdlKCBmaXJzdCBwYWdlICkKLQlUaGUgTmV4dCBidXR0b24gaXMgZW5hYmxlZCBvbmx5IGlmIHRoZXJlIGlzIHNlbGVjdGlvbiBpbiB0aGUgbGlzdC4KLQlWZXJpZnkgdGhhdCB0aGUgZGVzdGluYXRpb24gZnJvbSB0aGUgbW9zdCByZWNlbnQgZXhwb3J0LCByZWdhcmRsZXNzIAkKLQkJb2Ygc2Vzc2lvbiwgaXMgcHJlc2VsZWN0ZWQgaW4gdGhlIGxpc3Rib3guCi0JVmVyaWZ5IGljb25zIGZvciBpdGVtcyBpbiB0aGUgbGlzdC4KLQotQ29tbW9uIFByb3BlcnRpZXMgZm9yIHRoZSBGaWxlIFN5c3RlbSBQYWdlIGFuZCB0aGUgWmlwIEZpbGUgUGFnZSggc2Vjb25kIHBhZ2UgKQotKiBQbGVhc2UgcnVuIHRoaXMgdGVzdCBzZXBhcmF0ZWx5IGZvciBlYWNoIG9mIHRoZSBwYWdlcy4KLQlbUHJlc2VudGF0aW9uXQotCQlUaGUgZm9sZGVyIHRyZWUgc2hvd3Mgb3BlbiBwcm9qZWN0cyBvbmx5LgotCQlWZXJpZnkgaWNvbnMgZm9yIGZpbGVzIGluIHRoZSBmaWxlIGxpc3Rib3guCi0JW0VuYWJsZW1lbnRdCi0JCVRoZSBCYWNrIGFuZCBCcm93c2UgYnV0dG9uIGFyZSBlbmFibGVkIGFuZCB0aGUgTmV4dCBidXR0b24gCi0JCQlpcyBkaXNhYmxlZCBhbGwgdGhlIHRpbWUuCi0JCUZpbmlzaCBpcyBkaXNhYmxlZCBpZiB0aGUgZGVzdGluYXRpb24gZm9sZGVyIGlzIGVtcHR5LgotCQlJZiBub3RoaW5nIGlzIHNlbGVjdGVkIHdoZW4gRmluaXNoIGlzIHByZXNzZWQgYSB3YXJuaW5nIGRpYWxvZyAKLQkJCWFwcGVhcnMuCi0JCVRoZSAnU2VsZWN0IFR5cGVzJywgJ1NlbGVjdCBBbGwnLCBhbmQgJ0Rlc2VsZWN0IEFsbCcgYnV0dG9ucyAKLQkJCWFyZSBhbHdheXMgZW5hYmxlZC4KLQlbU2VsZWN0aW9uIEFjdGlvbl0KLQkJVmVyaWZ5IHRoYXQgJ1NlbGVjdCBBbGwnIGFuZCAnRGVzZWxlY3QgQWxsJyB3b3JrLgotCQlTZWxlY3RpbmcgYSBmb2xkZXIgcmVzb3VyY2Ugc2hvd3MgYWxsIGZpbGVzIGl0IGhhcyBpbiB0aGUgCi0JCQlmaWxlIGxpc3Rib3guCi0JCUNoZWNraW5nIGEgZm9sZGVyIHJlc291cmNlIGNoZWNrcyBhbGwgb2YgaXRzIHN1YmZvbGRlcnMgYW5kIAotCQkJaXRzIGZpbGVzLCBhbmQgYWx3YXlzIGdyZXktY2hlY2tzIGl0cyBhbmNlc3RvciBmb2xkZXJzLgotCQlVbmNoZWNraW5nIGEgZm9sZGVyIHVuY2hlY2tzIGZpbGVzIGFuZCBzdWJmb2xkZXJzIHVuZGVybmVhdGggaXQuIAotCQkJSXQgdW5jaGVja3MgaXRzIGFuY2VzdG9yIGZvbGRlciByZWN1cnNpdmVseS4gCi0JCQlJZiBpdCBpcyBsYXN0IHJlc291cmNlIGNoZWNrZWQuIE90aGVyd2lzZSwgaXQgZ3JleS1jaGVja3MgCi0JCQkJaXRzIGFuY2VzdG9yIHJlY3Vyc2l2ZWx5LgotCQlDaGVja2luZyBhIGZpbGUgYWx3YXlzIGdyZXktY2hlY2tzIHRoZSBmb2xkZXIgaXQgaXMgaW4uCi0JCVVuY2hlY2tpbmcgYSBmaWxlIHVuY2hlY2tzIGl0cyBhbmNlc3RvciBmb2xkZXIgcmVjdXJzaXZlbHkgCi0JCQlpZiBpdCBpcyBsYXN0IHJlc291cmNlIHNlbGVjdGVkLiAKLQkJCU90aGVyd2lzZSwgaXQgZ3JleS1jaGVja3MgaXRzIGFuY2VzdG9yIHJlY3Vyc2l2ZWx5LgotCVtTZWxlY3QgVHlwZXMgRGlhbG9nXQotCQlWZXJpZnkgdGhhdCB0aGUgJ090aGVyIEV4dGVuc2lvbnMnIHRleHQgYm94IHNob3dzIG9ubHkgdGhvc2UgCi0JCQl1c2VyLWRlZmluZWQgZmlsZSB0eXBlcyB0aGF0IGFyZSBub3QgaW4gdGhlIGxpc3QuCi0JCQllLmcuIAotCQkJLSB0eXBlIGluICouamF2YSBhbmQgY2xpY2sgT0sKLQkJCS0gb3BlbiB0aGUgZGlhbG9nIGFnYWluIGFuZCBlbnN1cmUgdGhhdCB0aGUgLmphdmEgY2hlY2sgYm94IGlzIGNoZWNrZWQgYW5kIHRoZSB0ZXh0Ym94IGRvZXMgTk9UIGhhdmUgLmphdmEgaW4gaXQuCi0JCQktIGluIHRoZSBkaWFsb2csIHR5cGUgaW4gKi5lY2xpcHNlIGFuZCBjbGljayBPSwotCQkJLSBvcGVuIHRoZSBkaWFsb2cgYWdhaW4gYW5kIGVuc3VyZSB0aGF0IHRoZSB0ZXh0Ym94IGhhcyAuZWNsaXBzZSBpbiBpdC4KLQkJVGhlIGZpbHRlciBzZWxlY3RzIGZpbGVzIGJ5IGJvdGggY2hlY2tlZCBmaWxlIHR5cGVzIGFuZCAKLQkJCXNwZWNpZmllZCB0eXBlcyBmcm9tIGVudGlyZSByZXNvdXJjZXMuCi0JCUludm9raW5nIHRoZSBmaWx0ZXIgdXBkYXRlcyBhcHByb3ByaWF0ZSBjaGVja2JveGVzIG9mIGZpbGVzIGFuZCAKLQkJCWZvbGRlcnMuCi0JW0Rlc3RpbmF0aW9uXQotCQlUaGUgZGVzdGluYXRpb24gY29tYm8gbGlzdGJveCBpcyBwcmVzZWxlY3RlZCB3aXRoIHRoZSBtb3N0IAotCQkJcmVjZW50IGRlc3RpbmF0aW9uIHRvIHdoaWNoIHRoZSB1c2VyIGV4cG9ydGVkLgotCQlUaGUgZGVzdGluYXRpb24gY29tYm8gbGlzdGJveCBpbiB0aGUgd2l6YXJkIHN0b3JlcyB0aGUgZml2ZSAKLQkJCW1vc3QgcmVjZW50IGRlc3RpbmF0aW9ucyB0byB3aGljaCByZXNvdXJjZXMgd2VyZSBleHBvcnRlZC4KLQlbT3B0aW9uc10KLQkJVGhlIHNldHRpbmcgZm9yIGNvbW1vbiBvcHRpb25zIGFyZSBzaGFyZWQgYnkgcGFnZXMuCi0JCUlmIHRoZSBPdmVyd3JpdGUgY2hlY2tib3ggaXMgdW5jaGVja2VkLCBleHBvcnRpbmcgYSByZXNvdXJjZSAKLQkJCXRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHR3aWNlIHBvcHMgdXAgdGhlIENvbmZpcm0gT3ZlcndyaXRlIAotCQkJZGlhbG9nLgotCQlJZiB0aGUgT3ZlcndyaXRlIGNoZWNrYm94IGlzIGNoZWNrZWQsIGV4cG9ydGluZyBhIHJlc291cmNlIAotCQkJdG8gdGhlIHNhbWUgZGVzdGluYXRpb24gdHdpY2UgZG9lcyBub3QgaW52b2tlIGNvbmZpcm1hdGlvbi4KLQlbUGVyc2lzdGVuY2VdCi0JCVZlcmlmeSB0aGF0IHRoZSBmaXZlIG1vc3QgcmVjZW50IGRlc3RpbmF0aW9ucyBzdG9yZWQgaW4gCi0JCQl0aGUgZGVzdGluYXRpb24gbGlzdGJveCBhcmUgcGVyc2lzdGVudCBiZXR3ZWVuIHNlc3Npb25zLgotCQlWZXJpZnkgdGhhdCB0aGUgc2V0dGluZ3Mgb2YgdGhlIG9wdGlvbnMgYXJlIHBlcnNpc3RlbnQgCi0JCQliZXR3ZWVuIHNlc3Npb25zLgotCVtOYXZpZ2F0b3IgVmlld10KLQkJSWYgdGhlIHdpemFyZCBpcyBpbnZva2VkIHdoaWxlIHRoZXJlIGlzIGEgcmVzb3VyY2Uocykgc2VsZWN0ZWQgCi0JCQlpbiB0aGUgbmF2aWdhdG9yIHZpZXcsIHRob3NlIHJlc291cmNlKHMpIGFyZSBjaGVja2VkIGluIHRoZSBmb2xkZXIgdHJlZS4KLQotRmlsZSBTeXN0ZW0gUGFnZQotCVtFeHBvcnRdCi0JCVZlcmlmeSB0aGF0IGFsbCBmaWxlcyBhcmUgZXhwb3J0ZWQgc3VjY2Vzc2Z1bGx5IHRvIHRoZSAKLQkJCXNwZWNpZmllZCBkZXN0aW5hdGlvbi4KLQkJSWYgdGhlICdDcmVhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZScgY2hlY2tib3ggaXMgdW5jaGVja2VkLCAKLQkJCWV4cG9ydGluZyBjcmVhdGVzIGEgZGlyZWN0b3J5IHN0cnVjdHVyZSB0aGF0IHJvb3RzIGZyb20gCi0JCQl0aGUgcm9vdCBvZiB0aGUgZm9sZGVyIHRyZWUgd2l0aGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0JCUlmIHRoZSAnQ3JlYXRlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUnIGNoZWNrYm94IGlzIGNoZWNrZWQsIAotCQkJZXhwb3J0aW5nIGNyZWF0ZXMgdGhlIHNhbWUgZGlyZWN0b3J5IHN0cnVjdHVyZSBhcyB0aGUgCi0JCQl3b3Jrc3BhY2Ugd2l0aGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0JW0Jyb3dzZSBmb3IgRm9sZGVyIERpYWxvZ10KLQkJVGhlIGRlc3RpbmF0aW9uIHRleHRib3ggb2YgdGhlIGRpYWxvZyBpcyBwcmVzZWxlY3RlZCB3aXRoIAotCQkJdGhlIGN1cnJlbnQgZGVzdGluYXRpb24gZm9sZGVyIGZyb20gdGhlIGRpYWxvZy4KLQkJU3BlY2lmeWluZyB0aGUgZGVzdGluYXRpb24gaW4gdGhlIGRpYWxvZyBhbmQgdGhlbiBjbGlja2luZyBPSyAKLQkJCXVwZGF0ZXMgdGhlIGRlc3RpbmF0aW9uIHRleHRib3ggb2YgdGhlIHdpemFyZC4gT3RoZXJ3aXNlLCAKLQkJCXRoZSB3aXphcmQgaXMgbm90IHVwZGF0ZWQuCi0KLVppcCBGaWxlIFBhZ2UKLQlWZXJpZnkgdGhhdCBhIC56aXAgZmlsZSBpcyBleHBvcnRlZCBzdWNjZXNzZnVsbHkgdG8gdGhlIAotCQlzcGVjaWZpZWQgZGVzdGluYXRpb24uCQotCVVzZSBhbiBleHRlcm5hbCBaSVAgcHJvZ3JhbSB0byB2ZXJpZnkgdGhlIGZvbGxvd2luZzoKLQkJLSB0aGUgWklQIGZpbGUgaXMgZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseSBieSB0aGUgWklQIHByb2dyYW0uCi0JCS0gdGhlIFpJUCBmaWxlIG1hZGUgd2l0aCB0aGUgJ0NyZWF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlJyAKLQkJCWNoZWNrYm94IHR1cm5lZCBvbiBoYXMgdGhlIHNhbWUgZGlyZWN0b3J5IHN0cnVjdHVyZSAKLQkJCWFzIHRoZSB3b3Jrc3BhY2UuCQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL0ltcG9ydC50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL0ltcG9ydC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjUxY2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9JbXBvcnQudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotVGhpcyBpcyBhIHRlc3QgbGlzdCBmb3IgdGhlIGltcG9ydCB3aXphcmQuCi0KLUNvbW1vbiBQcm9wZXJ0aWVzIGZvciBBbGwgUGFnZXMKLQlWZXJpZnkgdGhhdCBhbGwgbGlzdGJveGVzIHNob3cgYXBwcm9wcmlhdGUgc2Nyb2xsYmFycyB3aGVuIAotCQl0aGVpciBjb250ZW50cyBleHRlbmRzIGJleW9uZCB0aGVpciBjbGllbnQgYXJlYS4KLQlUaGUgQ2FuY2VsIGJ1dHRvbiBpcyBlbmFibGVkIGFsbCB0aGUgdGltZS4KLQlWZXJpZnkgdGhhdCBDYW5jZWwgZGlzY2FyZHMgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgd2l6YXJkIGJ5IGRvaW5nIAotCQl0aGUgZm9sbG93aW5nOgotCQktIG9uIHRoZSBTZWxlY3QgcGFnZSwgY2hvb3NlIGFueSBvbmUgb2YgaXRlbXMgaW4gdGhlIGxpc3QgYW5kIAotCQkJY2xpY2sgTmV4dC4KLQkJLSBtYWtlIGNoYW5nZSB0byB0aGUgZGVzdGluYXRpb24gb3IgdGhlIG9wdGlvbiBzZXR0aW5ncyBvciBib3RoLgotCQktIGNhbmNlbCB0aGUgd2l6YXJkLgotCQktIG9wZW4gdGhlIHdpemFyZCBhZ2FpbiBhbmQgZW5zdXJlIHRoYXQgdGhlIHByZXNlbGVjdGlvbiBvZiAKLQkJCXRoZSBTZWxlY3QgcGFnZSggaWYgdGhlcmUgd2FzIGFueSApLCBhbmQgdGhlIHZhbHVlcyBvZiAKLQkJCXRoZSBkZXN0aW5hdGlvbiBhbmQgdGhlIG9wdGlvbnMgcmVtYWluIHRoZSBzYW1lIGFzIGJlZm9yZSAKLQkJCXRoZSBjaGFuZ2UuCi0KLVNlbGVjdCBQYWdlKCBmaXJzdCBwYWdlICkKLQlUaGUgTmV4dCBidXR0b24gaXMgZW5hYmxlZCBvbmx5IGlmIHRoZXJlIGlzIHNlbGVjdGlvbiBpbiB0aGUgbGlzdC4KLQlWZXJpZnkgdGhhdCB0aGUgc291cmNlIGZyb20gdGhlIG1vc3QgcmVjZW50IGltcG9ydCwgcmVnYXJkbGVzcyAKLQkJb2Ygc2Vzc2lvbiwgaXMgcHJlc2VsZWN0ZWQgaW4gdGhlIGxpc3Rib3guCi0JVmVyaWZ5IGljb25zIGZvciBpdGVtcyBpbiB0aGUgbGlzdC4KLQotQ29tbW9uIFByb3BlcnRpZXMgZm9yIEltcG9ydCBQYWdlcyggc2Vjb25kIHBhZ2UgKQotKiBQbGVhc2UgcnVuIHRoaXMgdGVzdCBzZXBhcmF0ZWx5IGZvciBlYWNoIG9mIHRoZSBwYWdlcwotCVtQcmVzZW50YXRpb25dCi0JCVRoZSBzb3VyY2UgY29tYm8gbGlzdGJveCBzdG9yZXMgdGhlIGZpdmUgbW9zdCByZWNlbnQgCi0JCQlzb3VyY2VzIGZyb20gd2hpY2ggcmVzb3VyY2VzIHdlcmUgaW1wb3J0ZWQuCi0JCVZlcmlmeSBpY29ucyBmb3IgZmlsZXMgaW4gdGhlIGZpbGUgbGlzdGJveC4KLQlbRW5hYmxlbWVudF0KLQkJVGhlIEJhY2sgYnV0dG9uIGlzIGVuYWJsZWQgYW5kIHRoZSBOZXh0IGJ1dHRvbiBpcyBncmV5ZWQgb3V0IGFsbCB0aGUgdGltZS4KLQkJQm90aCBvZiB0aGUgQnJvd3NlIGJ1dHRvbnMgYXJlIGVuYWJsZWQuCi0JCVRoZSAnU2VsZWN0IFR5cGVzJywgJ1NlbGVjdCBBbGwnLCBhbmQgJ0Rlc2VsZWN0IEFsbCcgYnV0dG9ucyBhcmUgZW5hYmxlZCBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBpdGVtIGluIHRoZSBmb2xkZXIgdHJlZS4KLQkJRmluaXNoIGlzIGVuYWJsZWQgb25seSBpZiB0aGVyZSBpcyBvbmUgb3IgbW9yZSByZXNvdXJjZXMgc2VsZWN0ZWQgYW5kIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIgaXMgbm90IGVtcHR5LgotCVtTZWxlY3Rpb24gQWN0aW9uXQkJCi0JCVZlcmlmeSB0aGF0ICdTZWxlY3QgQWxsJyBhbmQgJ0Rlc2VsZWN0IEFsbCcgd29yay4KLQkJU2VsZWN0aW5nIGEgZm9sZGVyIHJlc291cmNlIHNob3dzIGFsbCBmaWxlcyBpdCBoYXMgaW4gdGhlIGZpbGUgbGlzdGJveC4KLQkJQ2hlY2tpbmcgYSBmb2xkZXIgcmVzb3VyY2UgY2hlY2tzIGFsbCBvZiBpdHMgc3ViZm9sZGVycyBhbmQgaXRzIGZpbGVzLCBhbmQgYWx3YXlzIGdyZXktY2hlY2tzIGl0cyBhbmNlc3RvciBmb2xkZXJzLgotCQlVbmNoZWNraW5nIGEgZm9sZGVyIHVuY2hlY2tzIGZpbGVzIGFuZCBzdWJmb2xkZXJzIHVuZGVybmVhdGggaXQuIEl0IHVuY2hlY2tzIGl0cyBhbmNlc3RvciBmb2xkZXIgcmVjdXJzaXZlbHkgaWYgCi0JCQlpdCBpcyBsYXN0IHJlc291cmNlIGNoZWNrZWQuIE90aGVyd2lzZSwgaXQgZ3JleS1jaGVja3MgaXRzIGFuY2VzdG9yIHJlY3Vyc2l2ZWx5LgotCQlDaGVja2luZyBhIGZpbGUgYWx3YXlzIGdyZXktY2hlY2tzIHRoZSBmb2xkZXIgaXQgaXMgaW4uCi0JCVVuY2hlY2tpbmcgYSBmaWxlIHVuY2hlY2tzIGl0cyBhbmNlc3RvciBmb2xkZXIgcmVjdXJzaXZlbHkgaWYgaXQgaXMgbGFzdCBmaWxlIHNlbGVjdGVkLiBPdGhlcndpc2UsIGl0IGdyZXktY2hlY2tzIGl0cyBhbmNlc3RvciByZWN1cnNpdmVseS4KLQlbU2VsZWN0IFR5cGVzIERpYWxvZ10KLQkJVmVyaWZ5IHRoYXQgdGhlICdPdGhlciBFeHRlbnNpb25zJyB0ZXh0IGJveCBzaG93cyBvbmx5IHRob3NlIHVzZXItZGVmaW5lZCBmaWxlIHR5cGVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgbGlzdC4KLQkJZS5nLiAKLQkJCS0gdHlwZSBpbiAqLmphdmEgYW5kIGNsaWNrIE9LCi0JCQktIG9wZW4gdGhlIGRpYWxvZyBhZ2FpbiBhbmQgZW5zdXJlIHRoYXQgdGhlIC5qYXZhIGNoZWNrIGJveCBpcyBjaGVja2VkIGFuZCB0aGUgdGV4dGJveCBkb2VzIE5PVCBoYXZlIC5qYXZhIGluIGl0LgotCQkJLSBpbiB0aGUgZGlhbG9nLCB0eXBlIGluICouZWNsaXBzZSBhbmQgY2xpY2sgT0sKLQkJCS0gb3BlbiB0aGUgZGlhbG9nIGFnYWluIGFuZCBlbnN1cmUgdGhhdCB0aGUgdGV4dGJveCBoYXMgLmVjbGlwc2UgaW4gaXQuCi0JCVZlcmlmeSB0aGF0IHRoZSBmaWx0ZXIgc2VsZWN0cyBmaWxlcyBieSBib3RoIGNoZWNrZWQgZmlsZSB0eXBlcyBhbmQgc3BlY2lmaWVkIHR5cGVzIGFtb25nIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMgb25seS4KLQkJVmVyaWZ5IHRoYXQgaW52b2tpbmcgdGhlIGZpbHRlciB1cGRhdGVzIGFwcHJvcHJpYXRlIGNoZWNrYm94ZXMgb2YgZmlsZXMgYW5kIGZvbGRlcnMuCi0JCVZlcmlmeSB0aGF0IGludm9raW5nIHRoZSBmaWx0ZXIgYnkgb25lIHR5cGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgYnkgYSBkaWZmZXJlbnQgdHlwZSBsZWF2ZXMgYWxsIHJlc291cmNlcyB1bmNoZWNrZWQuCi0JW0Rlc3RpbmF0aW9uIEZvbGRlciBTZWxlY3Rpb24gRGlhbG9nXQotCQlHby1pbnRvIGlzIGVuYWJsZWQgb25seSBpZiB0aGUgc2VsZWN0ZWQgZm9sZGVyIGhhcyBhIHN1YmZvbGRlci4KLQkJSWYgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgd2lkZ2V0IGlzIHRoZSBzYW1lIGFzIHRoZSByb290IG9mIHRoZSB3b3Jrc3BhY2UsIEhvbWUgaXMgZW5hYmxlZCBhbmQgQmFjayBpcyBub3QuCi0JCUlmIHRoZSByb290IG9mIHRoZSB0cmVlIHdpZGdldCBpcyBOT1QgdGhlIHNhbWUgYXMgdGhlIHJvb3Qgb2YgdGhlIHdvcmtzcGFjZSwgSG9tZSBpcyBkaXNhYmxlZCBhbmQgQmFjayBpcyBlbmFibGVkLgotCQlWZXJpZnkgdGhhdCBIb21lLCBCYWNrLCBhbmQgR28tSW50byB3b3JrLgotCQlTZWxlY3RpbmcgYSBmb2xkZXIgc2hvd3MgaXRzIGNvbXBsZXRlIHBhdGggaW4gdGhlIHRleHQgYm94LgotCQlDbGlja2luZyBvbiBPSyBpbiB0aGUgZGlhbG9nIHVwZGF0ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBGb2xkZXIgdGV4dGJveCBpbiB0aGUgd2l6YXJkLgotCVtPcHRpb25zXQotCQlUaGUgc2V0dGluZyBmb3IgY29tbW9uIG9wdGlvbnMgYXJlIHNoYXJlZCBieSBwYWdlcy4KLQkJSWYgdGhlIE92ZXJ3cml0ZSBjaGVja2JveCBpcyB1bmNoZWNrZWQsIGltcG9ydGluZyBhIHJlc291cmNlIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHR3aWNlIHBvcHMgdXAgdGhlIENvbmZpcm0gT3ZlcndyaXRlIGRpYWxvZy4KLQkJSWYgdGhlIE92ZXJ3cml0ZSBjaGVja2JveCBpcyBjaGVja2VkLCB5b3UgY2FuIGltcG9ydCBhIHJlc291cmNlIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHR3aWNlIHdpdGhvdXQgY29uZmlybWluZyBpdC4KLQlbTmF2aWdhdG9yIFZpZXddCi0JCVZlcmlmeSB0aGF0IHRoZSBuYXZpZ2F0b3IgdmlldyBpcyB1cGRhdGVkIGFmdGVyIGltcG9ydGluZy4KLQlbUGVyc2lzdGVuY2VdCi0JCVZlcmlmeSB0aGF0IHRoZSBmaXZlIG1vc3QgcmVjZW50IHNvdXJjZXMgc3RvcmVkIGluIHRoZSBzb3VyY2UgY29tYm8gbGlzdGJveCBhcmUgcGVyc2lzdGVudCBiZXR3ZWVuIHNlc3Npb25zLgotCQlWZXJpZnkgdGhhdCB0aGUgc2V0dGluZ3Mgb2YgdGhlIG9wdGlvbnMgYXJlIHBlcnNpc3RlbnQgYmV0d2VlbiBzZXNzaW9ucy4KLQotRmlsZSBTeXN0ZW0gUGFnZQotCVNlbGVjdGluZyBhIHNvdXJjZSBkaXJlY3Rvcnkgc2hvd3MgaXRzIGZvbGRlciBzdHJ1Y3R1cmUgdXNpbmcgaXRzZWxmIGFzIHRoZSByb290IGluIHRoZSBsZWZ0IHRyZWUuCi0JVmVyaWZ5IHRoYXQgYWxsIG9mIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMgYXJlIGltcG9ydGVkIHN1Y2Nlc3NmdWxseS4JCi0JSWYgdGhlICdDb21wbGV0ZSBmb2xkZXIgc3RydWN0dXJlJyBjaGVja2JveCBpcyB1bmNoZWNrZWQsIGltcG9ydGluZyBhIHJlc291cmNlIGNyZWF0ZXMgYSBmb2xkZXIgc3RydWN0dXJlIHJlbGF0aXZlIAotCQl0byB0aGUgcm9vdCBvZiB0aGUgdHJlZSB3aWRnZXQgaW4gdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KLQlJZiB0aGUgJ0NvbXBsZXRlIGZvbGRlciBzdHJ1Y3R1cmUnIGNoZWNrYm94IGlzIGNoZWNrZWQsIGltcG9ydGluZyBhIHJlc291cmNlIGNyZWF0ZXMgYSBmb2xkZXIgc3RydWN0dXJlIHVzaW5nIHRoZSAKLQkJc291cmNlJ3MgYWJzb2x1dGUgcGF0aCBpbiB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgotCi1aaXAgRmlsZSBQYWdlCi0JU2VsZWN0aW5nIGEgc291cmNlIGFyY2hpdmUgc2hvd3MgaXRzIGZvbGRlciBzdHJ1Y3R1cmUgaW4gdGhlIGxlZnQgdHJlZSBBTkQgY2hlY2tzIGFsbCBvZiByZXNvdXJjZXMgaW4gaXQuCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL05hdmlnYXRvci50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL05hdmlnYXRvci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZGI0NzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9OYXZpZ2F0b3IudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotVGhpcyBpcyBhIHRlc3QgbGlzdCBmb3IgdGhlIG5hdmlnYXRvciB2aWV3LgotCi1FZGl0IEFjdGlvbnMKLQlWZXJpZnkgdGhhdCBlbmFibGVtZW50IG9mIENvcHksIERlbGV0ZSwgQWRkIEJvb2ttYXJrIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGF0IG9mIHRoZSBOYXZpZ2F0b3IgdmlldydzIGNvbnRleHQgbWVudSwgYW5kIHRoYXQgCi0JCXRoZSBzYW1lIGJlaGF2aW91ciBvY2N1cnMuCi0KLVByZXNlbnRhdGlvbgotCVZlcmlmeSB0aGF0IGFwcHJvcHJpYXRlIHN0cmluZ3MgYXBwZWFyIGluIGFsbCBtZW51IGl0ZW1zIGFuZCB0ZXh0IGZpZWxkcy4KLQlWZXJpZnkgaWNvbnMgZm9yIGZpbGUsIGZvbGRlciBhbmQgcHJvamVjdC4KLQlWZXJpZnkgdGhhdCB0aGUgdmlldyBzaG93cyBhcHByb3ByaWF0ZSBzY3JvbGxiYXJzIHdoZW4gaXRzIGNvbnRlbnRzIGV4dGVuZHMgYmV5b25kIGl0cyBjbGllbnQgYXJlYS4KLQotU3RhbmRhcmQgT2JqZWN0IEFjdGlvbnMKLQlWZXJpZnkgbWVudSBpdGVtczogQ29weSwgTW92ZSwgUmVuYW1lLCBEZWxldGUgZm9yIGFsbCByZXNvdWNlcy4KLQlWZXJpZnkgdGhhdCB0aGUgREVMRVRFIGtleSBtYXBzIHRvIHRoZSBEZWxldGUgYWN0aW9uLgotCVZlcmlmeSBEZWxldGUgb24gYSByZWFkLW9ubHkgcmVzb3VyY2UuCi0JVmVyaWZ5IFByb3BlcnRpZXMgZm9yIHByb2plY3RzLCBmb2xkZXJzLCBmaWxlcywgYW5kIGNvbWJpbmF0aW9ucyBvZiB0aGUgc2FtZS4gCi0JVmVyaWZ5IHRoYXQgd2hlbiB0aGUgdmlldyBpcyBhY3RpdmUsIHRoZSBzdGF0dXMgYmFyIHNob3dzIHRoZSBmdWxsIHBhdGggb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlLgotCi1BY3Rpb25zIG9uIE11bHRpc2VsZWN0ZWQgSXRlbXMKLQlJZiB0d28gb3IgbW9yZSByZXNvdXJjZXMgYXJlIG11bHRpc2VsZWN0ZWQsIFJlbmFtZSBpcyBkaXNhYmxlZC4KLQlJZiBhIHByb2plY3QgYW5kIGl0cyByZXNvdXJjZShzKSBhcmUgbXVsdGlzZWxlY3RlZCwgQ29weSBhbmQgTW92ZSBhcmUgZGlzYWJsZWQuCi0JSWYgYSBmb2xkZXIgYW5kIGl0cyBjaGlsZCByZXNvdXJjZShzKSBhcmUgbXVsdGlzZWxlY3RlZCwgQ29weSBhbmQgTW92ZSBhcmUgZGlzYWJsZWQuIAotCVZlcmlmeSBEZWxldGUgb24gbXVsdGlzZWxlY3RlZCByZXNvdXJjZXMuCi0JVmVyaWZ5IENvcHkgYW5kIE1vdmUgb24gbXVsdGlzZWxlY3RlZCBmaWxlcyBpbiB0aGUgc2FtZSBwcm9qZWN0LgotCi1GaWxlIFNwZWNpZmljIEFjdGlvbnMKLQlWZXJpZnkgbWVudSBjb250ZW50IHdoZW4gZmlsZSBzZWxlY3RlZC4JIAkgCi0JVmVyaWZ5IEFkZCBCb29rbWFyayBvbmx5IGFwcGVhcnMgb24gZmlsZXMgYW5kIHRoZSBib29rbWFyayBpcyBjcmVhdGVkIHdoZW4gaW52b2tlZC4KLQotRm9sZGVyIFNwZWNpZmljIEFjdGlvbnMKLQlWZXJpZnkgdGhlIGNvcHkgdG8gdGhlIHNhbWUgZm9sZGVyIGFuZCB0aGUgZGlmZmVyZW50IGZvbGRlci4KLQotUHJvamVjdCBTcGVjaWZpYyBBY3Rpb25zCi0JTWVudSBpbmNsdWRlcyBncm91cCB3aXRoIEJ1aWxkLCBSZWZyZXNoLCBDbG9zZSBQcm9qZWN0IGFuZCBPcGVuIFByb2plY3QKLQlDbG9zZSBQcm9qZWN0IGFwcGVhcnMgb25seSBvbiBhbiBvcGVuIHByb2plY3QKLQlPcGVuIFByb2plY3QgYXBwZWFycyBvbmx5IG9uIGEgY2xvc2VkIHByb2plY3QKLQlCb3RoIE9wZW4gUHJvamVjdCBhbmQgQ2xvc2UgUHJvamVjdCBhcHBlYXIgd2hlbiBzZWxlY3Rpb24gaW5jbHVkZXMgYm90aCBhbiBvcGVuIGFuZCBhIGNsb3NlZCBwcm9qZWN0Ci0JRm9yIGEgY2xvc2VkIHByb2plY3QsIFJlbmFtZSBpcyBkaXNhYmxlZCBhbmQgR28gSW50bywgQnVpbGQsIFJlZnJlc2gsIENsb3NlIFByb2plY3QgZG8gbm90IGFwcGVhcgotCi1OZXcgT2JqZWN0IEFjdGlvbnMKLQlJbnZva2UgRmlsZSBOZXcgLi4gcHJvamVjdHMsIGl0ZW1zLCBvdGhlci4JCi0JVmVyaWZ5IHRoYXQgdGhlIHZpZXcncyBOZXcgbWVudSBpcyB0aGUgc2FtZSBhcyBGaWxlIHwgTmV3IGluIHRoZSBXaW5kb3cuCi0KLVZpZXcgQWN0aW9ucwotCUludm9rZSBTb3J0IHwgYnkgTmFtZSwgfCBieSBUeXBlIGluIHRoZSBwdWxsZG93biBtZW51LiBBdm9pZCB1c2luZyBvbmx5IGEuamF2YSBhbmQgYi50eHQgZm9yIGEgdGVzdGluZyBjYXNlIHNpbmNlIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUKLQkJcmVnYXJkbGVzcyBvZiB0aGUgc29ydCBrZXkuCi0JSW52b2tlIEZpbHRlcnMuLi4gd2l0aCBTZWxlY3QgQWxsLCBEZXNlbGVjdCBBbGwgb3B0aW9ucy4KLQkKLU5hdmlnYXRpb24gQWN0aW9ucwotCVRoZSB2aWV3IGtlZXBzIHRyYWNrIG9mIG5hdmlnYXRpb24gaGlzdG9yeS4gR28gSW50byBhbmQgR28gVXAgYWRkIGFuIGl0ZW0uIEJhY2sgYW5kIEZvcndhcmQgY2hhbmdlIHRoZSBjdXJzb3IgaW4gdGhlIGhpc3RvcnkgbGlzdC4KLQlTZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlciwgaW52b2tlIEdvIEludG8sIEdvIHRvIHwgQmFjaywgR28gdG8gfCBGb3J3YXJkLCBhbmQgR28gdG8gfCBVcC4KLQlWZXJpZnkgZW5hYmxlbWVudCBvZiBHbyB4eCBhY3Rpb25zIHJlZmxlY3Qgc2VsZWN0aW9uIGFuZCBuYXZpZ2F0aW9uIGhpc3RvcnkuCi0JCS0gR28gSW50byBpcyBlbmFibGVkIHdoZW4gYW4gb3Blbiwgbm9uLWVtcHR5IHByb2plY3Qgb3IgYSBub24tZW1wdHkgZm9sZGVyIGlzIHNlbGVjdGVkIAkJCi0JCS0gR28gVXAgaXMgZW5hYmxlZCB3aGVuIHRoZSBpbnB1dCBoYXMgYSBwYXJlbnQgLiAgCi0JCS0gR28gRm9yd2FyZCBpcyBlbmFibGVkIHdoZW4gdGhlcmUgYXJlIGZvbGxvd2luZyBpdGVtcyBpbiB0aGUgbGlzdCwgR28gQmFjayBlbmFibGVkIHdoZW4gdGhlcmUgYXJlIHByZXZpb3VzIGl0ZW1zLgotCVZlcmlmeSB0aGF0IHRoZSB2aWV3J3MgdGl0bGViYXIgZGlzcGxheXMgdGhlIHNpbXBsZSBuYW1lIG9mIGl0cyBpbnB1dCwgYW5kIHRoYXQgaXRzIHRvb2x0aXAgZGlzcGxheXMgdGhlIGZ1bGwgcGF0aCBvZiBpdHMgaW5wdXQuCi0JVmVyaWZ5IHRoYXQgdGhlIGVuYWJsZW1lbnQgYW5kIHRoZSBhY3Rpb25zIG9mIHRoZSBuYXZpZ2F0aW9uIGJ1dHRvbnMgaW4gdGhlIGxvY2FsIHRvb2xiYXIgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgTmF2aWdhdGUgbWFpbiBtZW51LgotCVZlcmlmeSB0aGF0IHdoZW4gYSBuYXZpZ2F0aW9uIGJ1dHRvbiBpbiB0aGUgbG9jYWwgdG9vbGJhciBpcyBlbmFibGVkLCB0aGUgZnVsbHBhdGggb2Ygd2hlcmUgdGhlIGJ1dHRvbiBsZWFkcyB0byBpcyBhcHBlbmRlZCB0byB0aGUgYnV0dG9uJ3MgdG9vbHRpcC4KLQkJZS5nIElmIHRoZSBwYXRoIG9mIHRoZSB2aWV3J3MgaW5wdXQgaXMgUHJvamVjdC9Gb2xkZXIvTXlGb2xkZXIsIHRoZSAnVXAnIGJ1dHRvbiBoYXMgdGhlIHRvb2x0aXAgdGhhdCBzYXlzICdVcCB0byBQcm9qZWN0L0ZvbGRlcicKLQotUGVyc2lzdGVuY2UKLQlWZXJpZnkgdGhhdCB0aGUgc29ydCB0eXBlIHJlbWFpbnMgdGhlIHNhbWUgYWZ0ZXIgY2xvc2luZyBhbmQgcmVvcGVuaW5nIHRoZSBOYXZpZ2F0b3IgdmlldwotCVZlcmlmeSB0aGF0IHRoZSBpbnB1dCBpcyBwZXJzaXN0ZW50IGJldHdlZW4gc2Vzc2lvbnMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9PdXRsaW5lLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvT3V0bGluZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MzRkODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9PdXRsaW5lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLVRoaXMgaXMgYSB0ZXN0IGxpc3QgZm9yIHRoZSBvdXRsaW5lIHZpZXcuIFRoZSBvdXRpbmUgdmlldyBpcyBhIGNvbnRhaW5lciBmb3IgcGFnZXMgY29udHJpYnV0ZWQgYnkgb3BlbiBlZGl0b3JzLiAKLVdlIHRlc3QgdGhlIGNvbnRyaWJ1dGlvbiBhbmQgYWN0aXZhdGlvbiBvZiB0aG9zZSBwYWdlcy4KLQotUHJlc2VudGF0aW9uCi0JVmVyaWZ5IHRoYXQgdGhlIHZpZXcgc2hvd3MgYXBwcm9wcmlhdGUgc2Nyb2xsYmFycyB3aGVuIGl0cyBjb250ZW50cyBleHRlbmRzIGJleW9uZCBpdHMgY2xpZW50IGFyZWEuCi0KLUFjdGl2YXRpb24KLQlJZiB5b3Ugb3BlbiBhIGphdmEgZWRpdG9yIG9yIGFjdGl2YXRlIG9uZSwgaXRzIG91dGxpbmUgY29udGVudHMgYXBwZWFycyBpbiBvdXRsaW5lIHZpZXcuCQotCVN3aXRjaCBiZXR3ZWVuIHR3byBvciBtb3JlIGphdmEgZWRpdG9ycyB0byB2ZXJpZnkgdGhlIHZpZXcgaXMgdXBkYXRlZC4KLQlTd2l0Y2hpbmcgYmV0d2VlbiBqYXZhIGVkaXRvcnMgdXBkYXRlcyB0aGUgb3V0bGluZSB2aWV3J3MgbG9jYWwgdG9vbGJhciBhbmQgY29udGV4dCBtZW51LgotCUNsb3NlIG9uZSBqYXZhIGVkaXRvciwgYWN0aXZhdGluZyBhbm90aGVyLCBhbmQgc2VlIHBhZ2UgaW4gb3V0bGluZSBjaGFuZ2UuCi0JU3dpdGNoaW5nIGZyb20gYSBqYXZhIGVkaXRvciB0byBhIHRleHQgZWRpdG9yIHNob3dzIGJsYW5rIGluIHRoZSBvdXRsaW5lIHZpZXcuCi0JQ2xvc2UgbGFzdCBqYXZhIGVkaXRvciB0byBzZWUgdGhlIGRlZmF1bHQgYmxhbmsgcGFnZSBpbiBvdXRsaW5lLgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL1ByZWZlcmVuY2VzLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvUHJlZmVyZW5jZXMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2RmMTRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvUHJlZmVyZW5jZXMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotVGhpcyBpcyBhIHRlc3QgbGlzdCBmb3IgdGhlIHByZWZlcmVuY2VzIGRpYWxvZy4KLQotUHJlc2VudGF0aW9uCi0JVmVyaWZ5IHRoYXQgdGhlIGxpc3Rib3ggb24gdGhlIGxlZnQgc2hvd3MgYXBwcm9wcmlhdGUgc2Nyb2xsYmFycyAKLQkJd2hlbiBpdHMgY29udGVudHMgZXh0ZW5kcyBiZXlvbmQgaXRzIGNsaWVudCBhcmVhLgotCVZlcmlmeSB0aGF0IHRoZSB3aW5kb3cgZ3Jvd3MgdG8gZml0IHRoZSBjb250ZW50IHBhZ2Ugb2YgdGhlIAotCQlzZWxlY3RlZCBpdGVtLgotCVZlcmlmeSB0aGF0IHlvdSBjYW4gdHJhdmVyc2UgYWxsIHdpZGdldCBncm91cHMgYnkgcHJlc3NpbmcgVEFCLgotCi1BY3Rpb25zCi0JQ2xpY2tpbmcgb24gYSBpdGVtIGluIHRoZSB0cmVlIHNob3dzIHRoZSBjb3JyZXNwb25kaW5nIHBhZ2Ugb24gCi0JCXRoZSByaWdodCwgaW5jbHVkaW5nIHRoZSBwYWdlIHRpdGxlLgotCVZlcmlmeSB0aGF0IERlZmF1bHRzIHNldHMgYWxsIGZpZWxkcyB0byB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIAotCQl0aGUgY3VycmVudCBjb250ZW50IHBhZ2UgT05MWS4KLQlWZXJpZnkgdGhhdCBPSyBzdG9yZXMgYWxsIGNoYW5nZXMgbWFkZSB0byBmaWVsZHMgYnkgZG9pbmcgdGhlIGZvbGxvd2luZzoKLQkJLSBtYWtlIHNvbWUgY2hhbmdlcyB0byBjaGVja2JveGVzLCBvcHRpb24gYnV0dG9ucywgYW5kIHRleHRib3hlcy4KLQkJLSBjbGljayBPSy4KLQkJLSBvcGVuIHRoZSBkaWFsb2cgYWdhaW4gYW5kIGVuc3VyZSB0aGF0IGFsbCB0aGUgY2hhbmdlcyB3ZXJlIHNhdmVkLgotCVZlcmlmeSB0aGF0IENhbmNlbCBkaXNjYXJkcyBhbGwgY2hhbmdlcyBtYWRlIHRvIGZpZWxkcyBieSBkb2luZyAKLQkJdGhlIGZvbGxvd2luZzoKLQkJLSBtYWtlIHNvbWUgY2hhbmdlcyB0byBjaGVja2JveGVzLCBvcHRpb24gYnV0dG9ucywgYW5kIHRleHRib3hlcy4KLQkJLSBjbGljayBDYW5jZWwuCi0JCS0gb3BlbiB0aGUgZGlhbG9nIGFnYWluIGFuZCBlbnN1cmUgdGhhdCBhbGwgdGhlIGZpZWxkIHZhbHVlcyAKLQkJCWFyZSB0aGUgc2FtZSBhcyBiZWZvcmUgdGhlIGNoYW5nZS4KLQlWZXJpZnkgdGhhdCBFU0MgbWFwcyB0byBDYW5jZWwuCi0JVmVyaWZ5IHRoYXQgQXBwbHkgc3RvcmVzIGFsbCBjaGFuZ2VzIG1hZGUgdG8gdmFsdWVzIGJ5IGRvaW5nIHRoZSAKLQkJZm9sbG93aW5nOgotCQktIG1ha2Ugc29tZSBjaGFuZ2VzIHRvIGNoZWNrYm94ZXMsIG9wdGlvbiBidXR0b25zLCBhbmQgdGV4dGJveGVzLgotCQktIGNsaWNrIEFwcGx5IGFuZCB0aGVuIENhbmNlbC4KLQkJLSBvcGVuIHRoZSBkaWFsb2cgYWdhaW4gYW5kIGVuc3VyZSB0aGF0IGFsbCB0aGUgY2hhbmdlcyB3ZXJlIHNhdmVkLgotCVZlcmlmeSB0aGF0IEFwcGx5IGltbWVkaWF0ZWx5IHVwZGF0ZXMgdGhlIHdvcmtiZW5jaCBzZXR0aW5ncyBieSAKLQkJZG9pbmcgdGhlIGZvbGxvd2luZzoKLQkJLSBvcGVuIGEgdGV4dCBmaWxlIHdpdGggdGhlIGRlZmF1bHQgdGV4dCBlZGl0b3IuCi0JCS0gdHlwZSBzb21ldGhpbmcgaW4gdGhlIGVkaXRvcgotCQktIG9wZW4gdGhlIHByZWZlcmVuY2VzIGRpYWxvZywgYW5kIGNsaWNrIG9uIFdvcmtiZW5jaCB8IERlZmF1bHQgCi0JCQlUZXh0IEVkaXRvcgotCQktIGNsaWNrIENoYW5nZS4uLiBBdCB0aGUgRm9udCBkaWFsb2csIHNlbGVjdCBhIGRpZmZlcmVudCBmb250IAotCQkJYW5kIGEgZGlmZmVyZW50IGZvbnQgc2l6ZS4gQ2xpY2sgT0suCi0JCS0gYXQgdGhlIHByZWZlcmVuY2VzIGRpYWxvZywgQ2xpY2sgQXBwbHkKLQkJLSB3aXRob3V0IGNsb3NpbmcgdGhlIHByZWZlcmVuY2VzIGRpYWxvZywgZW5zdXJlIHRoYXQgdGhlIAotCQkJc2V0dGluZ3MgZm9yIHRoZSB0ZXh0IGVkaXRvciBhcmUgdXBkYXRlZC4KLQotUGVyc2lzdGVuY2UKLQlWZXJpZnkgdGhhdCBhbGwgZmllbGQgdmFsdWVzIGFyZSBwZXJzaXN0ZW50IGFsbCB0aGUgdGltZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL1Byb3BlcnRpZXNEaWFsb2cudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9Qcm9wZXJ0aWVzRGlhbG9nLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiOGFlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL1Byb3BlcnRpZXNEaWFsb2cudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotVGhpcyBpcyBhIHRlc3Qgc2NyaXB0IGZvciB0aGUgcHJvcGVydGllcyBkaWFsb2cuCi0KLVByZXNlbnRhdGlvbgotCVZlcmlmeSB0aGF0IHRoZSBsaXN0Ym94IG9uIHRoZSBsZWZ0IHNob3dzIGFwcHJvcHJpYXRlIHNjcm9sbGJhcnMgCi0JCXdoZW4gaXRzIGNvbnRlbnRzIGV4dGVuZHMgYmV5b25kIGl0cyBjbGllbnQgYXJlYS4KLQlWZXJpZnkgdGhhdCB0aGUgd2luZG93IGdyb3dzIHRvIGZpdCB0aGUgY29udGVudCBwYWdlIG9mIHRoZSAKLQkJc2VsZWN0ZWQgaXRlbS4KLQlWZXJpZnkgdGhhdCB5b3UgY2FuIHRyYXZlcnNlIGFsbCB3aWRnZXQgZ3JvdXBzIGJ5IHByZXNzaW5nIFRBQi4KLQlWZXJpZnkgdGhhdCB0aGUgdGl0bGUgYmFyIHNob3dzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBhYm91dCAKLQkJd2hpY2ggdGhlIGRpYWxvZyBzaG93cyBpbmZvcm1hdGlvbi4KLQotQWN0aW9ucwotCUNsaWNraW5nIG9uIGEgaXRlbSB0aGF0IGNvbnRyaWJ1dGVzIGluIHRoZSB0cmVlIHNob3dzIHRoZSAKLQkJY29ycmVzcG9uZGluZyBwYWdlIG9uIHRoZSByaWdodCwgaW5jbHVkaW5nIHRoZSBwYWdlIHRpdGxlLgotCUNsaWNraW5nIG9uIGEgaXRlbSB0aGF0IGRvZXMgbm90IGNvbnRyaWJ1dGUgaW4gdGhlIHRyZWUgc2hvd3MgCi0JCXRoZSBkZWZhdWx0IHBhZ2Ugb24gdGhlIHJpZ2h0LgotCQllLmcuIEluIHRoZSBwYWNrYWdlcyB2aWV3LCBvcGVuIHRoZSBkaWFsb2cgb24gYSBwYWNrYWdlLiBUaGUgCi0JCQlUZWFtIHBhZ2Ugc2hvdWxkIHNob3cgdGhlIGRlZmF1bHQgcGFnZS4KLQlWZXJpZnkgdGhhdCBPSyBzdG9yZXMgYWxsIGNoYW5nZXMgbWFkZSB0byBmaWVsZHMgYnkgZG9pbmcgdGhlIGZvbGxvd2luZzoKLQkJLSBtYWtlIHNvbWUgY2hhbmdlcyB0byBjaGVja2JveGVzLCBvcHRpb24gYnV0dG9ucywgYW5kIHRleHRib3hlcy4KLQkJLSBjbGljayBPSy4KLQkJLSBvcGVuIHRoZSBkaWFsb2cgYWdhaW4gYW5kIGVuc3VyZSB0aGF0IGFsbCB0aGUgY2hhbmdlcyB3ZXJlIHNhdmVkLgotCVZlcmlmeSB0aGF0IENhbmNlbCBkaXNjYXJkcyBhbGwgY2hhbmdlcyBtYWRlIHRvIGZpZWxkcyBieSBkb2luZyAKLQl0aGUgZm9sbG93aW5nOgotCQktIG1ha2Ugc29tZSBjaGFuZ2VzIHRvIGNoZWNrYm94ZXMsIG9wdGlvbiBidXR0b25zLCBhbmQgdGV4dGJveGVzLgotCQktIGNsaWNrIENhbmNlbC4KLQkJLSBvcGVuIHRoZSBkaWFsb2cgYWdhaW4gYW5kIGVuc3VyZSB0aGF0IGFsbCB0aGUgZmllbGQgdmFsdWVzIAotCQkJYXJlIHRoZSBzYW1lIGFzIGJlZm9yZSB0aGUgY2hhbmdlLgotCVZlcmlmeSB0aGF0IEVTQyBtYXBzIHRvIENhbmNlbC4KLQlWZXJpZnkgdGhhdCBBcHBseSBzdG9yZXMgYWxsIGNoYW5nZXMgbWFkZSB0byB2YWx1ZXMgYnkgZG9pbmcgCi0JdGhlIGZvbGxvd2luZzoKLQkJLSBtYWtlIHNvbWUgY2hhbmdlcyB0byBjaGVja2JveGVzLCBvcHRpb24gYnV0dG9ucywgYW5kIHRleHRib3hlcy4KLQkJLSBjbGljayBBcHBseSBhbmQgdGhlbiBDYW5jZWwuCi0JCS0gb3BlbiB0aGUgZGlhbG9nIGFnYWluIGFuZCBlbnN1cmUgdGhhdCBhbGwgdGhlIGNoYW5nZXMgd2VyZSBzYXZlZC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL1Byb3BlcnRpZXNWaWV3LnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvUHJvcGVydGllc1ZpZXcudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzE5MTQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvUHJvcGVydGllc1ZpZXcudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotVGhpcyBpcyBhIHRlc3QgbGlzdCBmb3IgdGhlIHByb3BlcnRpZXMgdmlldy4gVGhlIHByb3BlcnRpZXMgdmlldyBpcyBhIGNvbnRhaW5lciBmb3IgcGFnZXMgY29udHJpYnV0ZWQgYnkgb3BlbiB2aWV3cyBhbmQgZWRpdG9ycy4KLVdlIHRlc3QgdGhlIGNvbnRyaWJ1dGlvbiBhbmQgYWN0aXZhdGlvbiBvZiBwYWdlcyBpbiB0aGUgdmlldy4KLQotUHJlc2VudGF0aW9uCi0JVmVyaWZ5IHRoYXQgdGhlIHZpZXcgc2hvd3MgYXBwcm9wcmlhdGUgc2Nyb2xsYmFycyB3aGVuIGl0cyBjb250ZW50cyBleHRlbmRzIGJleW9uZCBpdHMgY2xpZW50IGFyZWEuCi0KLUFjdGl2YXRpb24KLQlJZiB5b3Ugb3BlbiBhIHZpZXcgd2l0aCBwcm9wZXJ0aWVzLCB2ZXJpZnkgdGhhdCB0aGUgcGFnZSwgdGhlIGxvY2FsIHRvb2xiYXIgYW5kIGxvY2FsIG1lbnUgYmFyIGluIHByb3BlcnRpZXMgdmlldyBhcmUgdXBkYXRlZC4KLQkJZS5nLiBPcGVuIHRoZSBuYXZpZ2F0b3IgdmlldyBhbmQgc2VlIHRoZSBjaGFuZ2UgaW4gdGhlIHByb3BlcnRpZXMgdmlldy4KLQlJZiB5b3Ugb3BlbiBhbm90aGVyIHZpZXcsIGl0cyBvd24gcHJvcGVydGllcyBwYWdlIHNob3VsZCBhcHBlYXIuCi0JU3dpdGNoIGJldHdlZW4gdHdvIG9yIG1vcmUgY29tcG9uZW50cyB0byBzZWUgcGFnZSBpbiB2aWV3IGNoYW5nZS4KLQlDbG9zZSBvbmUgcGFydCwgYWN0aXZhdGluZyBhbm90aGVyLCB0byBzZWUgcGFnZSBpbiB2aWV3IGNoYW5nZS4KLQlDbG9zZSBsYXN0IGVkaXRvciB0byBzZWUgZGVmYXVsdCBibGFuayBwYWdlIGluIHRoZSB2aWV3LgotCVZlcmlmeSB0aGF0IHRoZSB2aWV3IHNob3dzIHRoZSBkZWZhdWx0IHBhZ2Ugd2hlbiB0aGUgYWN0aXZlIHZpZXcgZG9lc24ndCBoYXZlIHNvdXJjZS4KLQlNYWtlIHN1cmUgRWRpdCBtZW51IGluIHRoZSB3b3JrYmVuY2ggdGFyZ2V0cyB0aGUgYWN0aXZlIHBhZ2UgaW4gdGhlIHZpZXcuCi0JVmVyaWZ5IHRoYXQgdGhlIGVuYWJsZW1lbnQgYW5kIGFjdGlvbiBvZiB0aGUgQ2F0ZWdvcmllcywgRmlsdGVyLCBhbmQgRGVmYXVsdHMgYnV0dG9ucyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSB2aWV3J3MgCi0KLQkJcHVsbGRvd24gbWVudS4KLQotTmF2aWdhdG9yIFZpZXcKLQlWZXJpZnkgdGhhdCB0b2dnbGluZyB0aGUgU2hvdy9IaWRlLUNhdGVnb3JpZXMgYnV0dG9uIHNob3dzL2hpZGVzIGl0ZW1zIGluIHRoZSBjb3JyZXNwb25kaW5nIGNhdGVnb3J5IHRyZWUuCi0JVmVyaWZ5IHRoYXQgdGhlIHByb3BlcnRpZXMgdmlldyBzaG93cyBjb3JyZWN0IHZhbHVlcyBpbiB0aGUgZm9sbG93aW5nIGZpZWxkcyBmb3IgYSBzZWxlY3RlZCByZXNvdXJjZSBpbiB0aGUgbmF2aWdhdG9yIHZpZXcKLQkJZWRpdGFibGUsIGxhc3QgbW9kaWZpZWQsIG5hbWUsIGFuZCBwYXRoCi0JVmVyaWZ5IHRoYXQgb25seSBmaWxlcyBoYXZlIHZhbHVlcyBpbiB0aGUgc2l6ZSBmaWVsZC4KLQotUGVyaXNpc3RlbmNlCi0JVmVyaWZ5IHRoYXQgb24gc3RhcnQtdXAgb2YgdGhlIHZpZXcsIHRoZSB2aWV3IGRpc3BsYXlzIHByb3BlcnRpZXMgZm9yIHRoZSBhY3RpdmUgcGFydCBhbmQgc2VsZWN0aW9uIG9mIHRoZSBjb250cmlidXRpbmcgdmlldy4KLQotUHJvcGVydHkgU2hlZXQgRXhhbXBsZQotCUJlZm9yZSB2ZXJpZnlpbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMsIGRvOgotCQkxLiBNYWtlIHN1cmUgdGhlIHdvcmtiZW5jaCBleGFtcGxlIGlzIGFscmVhZHkgaW5zdGFsbGVkCi0JCSAgIGkuZS4sIGNoZWNrb3V0IG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQgYW5kIGxhdW5jaCBhIHJ1bi10aW1lIHdvcmtiZW5jaAotCQkyLiBDcmVhdGUgYSAudXNyIGZpbGUgYW5kIG9wZW4gaXQgCi0JCTMuIFNob3cgYm90aCB0aGUgb3V0bGluZSB2aWV3IGFuZCB0aGUgcHJvcGVydGllcyB2aWV3CQotCi0JVmVyaWZ5IHRoYXQgdGhlICdTaG93L0hpZGUgQ2F0ZWdvcnknIHRvZ2dsZSBidXR0b24gYW5kIHRoZSAnUmVzdG9yZSBEZWZhdWx0JyBidXR0b24gd29yay4KLQlWZXJpZnkgdGhhdCBzZWxlY3RpbmcgYW4gaXRlbSBpbiB0aGUgb3V0bGluZSB2aWV3IHNob3dzIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBwcm9wZXJ0aWVzIHZpZXcuCi0JVmVyaWZ5IHRoYXQgbXVsdGlzZWxlY3RpbmcgaXRlbXMgc2hvd3Mgb25seSB0aGVpciBjb21tb24gcHJvcGVydGllcy4KLQlWZXJpZnkgdGhhdCBjaGFuZ2UgbWFkZSB0byBhIHZhbHVlIGZvciBhbiBpdGVtIGlzIHBlcnNpc3RlbnQgaW4gc2FtZSBzZXNzaW9uLgotCVZlcmlmeSB0aGF0IG1vZGlmeWluZyBhIHZhbHVlIGZvciBtdWx0aXNlbGVjdGVkIGl0ZW1zIGNoYW5nZXMgdGhlIHZhbHVlcyBmb3IgYWxsIG9mIHRoZSBzZWxlY3RlZCBpdGVtcy4KLQlWZXJpZnkgdGhhdCBjaGFuZ2luZyB0aGUgTmFtZSB2YWx1ZSBmb3IgYW4gaXRlbSB1cGRhdGVzIHRoZSBwYWdlIGluIHRoZSBvdXRsaW5lIHZpZXcuCi0JVmVyaWZ5IHRoYXQgY2hhbmdpbmcgdGhlIE5hbWUgdmFsdWVzIGZvciBtdWx0aXNlbGVjdGVkIGl0ZW1zIGluIHRoZSBvdXRsaW5lIHZpZXcgdXBkYXRlcyB0aGUgcGFnZSBpbiB0aGUgb3V0bGluZSB2aWV3LgkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL1Rhc2tzLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvVGFza3MudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGFmNDA0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvVGFza3MudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotVGhpcyBpcyBhIHRlc3QgbGlzdCBmb3IgdGhlIHRhc2tzIHZpZXcuCi0KLVByZXNlbnRhdGlvbgotCVZlcmlmeSB0aGF0IGFwcHJvcHJpYXRlIHN0cmluZ3MgYXBwZWFyIGluIGFsbCBtZW51IGl0ZW1zIGFuZCB0ZXh0IGZpZWxkcy4KLQlWZXJpZnkgaWNvbnMgZm9yIHRhc2sgaXRlbXMgYW5kIHByb2JsZW0gaXRlbXMuCi0JVmVyaWZ5IHRoYXQgdGhlIHRpdGxlIGJhciBzaG93cyB0aGUgY29ycmVjdCBudW1iZXIgb2YgZmlsdGVyZWQgaXRlbXMgYW5kIHRvdGFsIGl0ZW1zLgotCVZlcmlmeSB0aGF0IHRoZSB2aWV3IHNob3dzIGFwcHJvcHJpYXRlIHNjcm9sbGJhcnMgd2hlbiBpdHMgY29udGVudHMgZXh0ZW5kcyBiZXlvbmQgaXRzIGNsaWVudCBhcmVhLgotCi1Db21tb24gQWN0aW9ucwotCVZlcmlmeSB0aGF0IGhlYWRlciBidXR0b25zIGluIHRoZSB0YWJsZSBzb3J0IHJlY29yZHMgYnkgdGhlaXIgcmVzcGVjdGl2ZSBjb2x1bW4gdmFsdWVzIGluIGFzY2VuZGluZy9kZXNjZW5kaW5nIG9yZGVyIGFsdGVybmF0aXZlbHkuCi0JVmVyaWZ5IHRoYXQgaXRlbXMgdGhhdCBiZWxvbmcgdG8gZmlsZXMgc3VjaCBhcyBjb21waWxlIHRpbWUgZXJyb3JzIGFyZSBkaXNwbGF5ZWQgb25seSBpZiB0aGVpciBwcm9qZWN0cyBhcmUgb3Blbi4KLQlWZXJpZnkgdGhhdCBHbyBUbyBGaWxlIGlzIGVuYWJsZWQgb25seSBvbiBmaWxlLWJvdW5kIGl0ZW1zLgotCVZlcmlmeSB0aGF0IGRvdWJsZS1jbGljayBvciBHbyBUbyBGaWxlIG9uIGEgZmlsZS1ib3VuZCBpdGVtIG9wZW5zIHRoZSBmaWxlLCBpZiBub3QgYWxyZWFkbHkgb3BlbiwgYW5kIGxvY2F0ZXMgdGhlIGNvZGUgaW4gdGhlIGVkaXRvci4KLQotVGFzayBBY3Rpb25zIGluIFRhc2tzIFZpZXcKLQlWZXJpZnkgdGhhdCBOZXcgVGFzaywgRGVsZXRlLCBEZWxldGUgQ29tcGxldGVkIFRhc2tzIHdvcmsuCi0JVmVyaWZ5IHRoYXQgRGVsZXRlIGlzIGVuYWJsZWQgb25seSBvbiB0YXNrIGl0ZW1zLgotCVZlcmlmeSB0aGF0IGludm9raW5nIERlbGV0ZSBvbiBhIHRhc2sgaXRlbSBpbiBhbiBvcGVuIGZpbGUgZGVsZXRlcyB0aGUgdGFzayBtYXJrZXIgZnJvbSB0aGUgZWRpdG9yLgotCVZlcmlmeSB0aGF0IHRoZSBlbmFibGVtZW50IGFuZCBhY3Rpb24gb2YgdGhlIE5ldyBUYXNrIGFuZCBEZWxldGUgYnV0dG9ucyBhcmUgY29uc2lzdGVudCB3aXRoIHRob3NlIGluIHRoZSBjb250ZXh0IG1lbnUuCi0JVmVyaWZ5IHRoYXQgdGhlIERFTEVURSBidXR0b24gb24gdGhlIGtleWJvYXJkIG1hcHMgdG8gRGVsZXRlLgotCVZlcmlmeSB0aGF0IHRoZSB0YXNrIHN0YXR1cyggY29tcGxldGlvbiApIGFuZCBwcmlvcml0eSBjYW4gYmUgc2V0IGZvciB0YXNrIGl0ZW1zIG9ubHkuCi0KLVByb2JsZW0gQWN0aW9ucyBpbiBUYXNrcyBWaWV3Ci0JVmVyaWZ5IHRoYXQgc2VsZWN0aW5nIGEgcHJvYmxlbSBpdGVtIGRpc3BsYXlzIGl0cyBkZXNjcmlwdGlvbiBtZXNzYWdlIGluIHRoZSBzdGF0dXMgYmFyIG9mIHRoZSB3b3JrYmVuY2ggd2luZG93LgotCi1GaWx0ZXIgVGFza3MgRGlhbG9nCi0JQ2hhbmdlIHRoZSB2YWx1ZXMgdGhlbiB2ZXJpZnkgdGhhdCB0aGUgUmVzZXQgYnV0dG9uIHNldHMgdGhvc2UgdmFsdWVzIHRvIGRlZmF1bHQuCi0JVmVyaWZ5IHRoYXQgdGFza3MgYXJlIGZpbHRlcmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGNyaXRlcmlvbiBvZiB0aGUgT24tYW55LXJlc291Y2UsIE9uLXNlbGVjdGVkLXJlc291Y2Utb25seSwgYW5kIAotCQlPbi1zZWxlY3RlZC1yZXNvdWNlLWFuZC1pdHMtY2hpbGRyZW4gcmFkaW8gYnV0dG9ucy4KLQlWZXJpZnkgdGhhdCB0YXNrcyBhcmUgZmlsdGVyZWQgYmFzZWQgb24gcXVlcnkgd29yZCBpZmYgdGhlIGRlc2NyaXB0aW9uIHRleHQgYm94IGlzIG5vdCBlbXB0eS4KLQlWZXJpZnkgdGhhdCBvbmx5IHRob3NlIHRhc2tzIHRoYXQgY29udGFpbiggZG8gbm90IGNvbnRhaW4gKSB0aGUgcXVlcnkgc3RyaW5nIHNob3cgaW4gdGhlIHRhc2sgdmlldyBpZiB0aGUgZGVzY3JpcHRpb24gY29tYm8tYm94IAotCQloYXMgdGhlIHZhbHVlICJDb250YWlucyIoIERvZXMgbm90IGNvbnRhaW4gKS4KLQlWZXJpZnkgdGhhdCB0aGUgV2hlcmUtcHJvYmxlbS1zZXZlcml0eS1pcyBjaGVja2JveCBpcyBlbmFibGVkIGlmZiBhdCBsZWFzdCBvbmUgb2YgQnVpbGQtcGF0aC1Qcm9ibGVtIGFuZCBKYXZhLVByb2JsZW0gaW4gdGhlIHRyZWUgaXMgY2hlY2tlZC4KLQlWZXJpZnkgdGhhdCB0aGUgV2hlcmUtdGFzay1wcmlvcml0eS1pcyBhbmQgV2hlcmUtdGFzay1zdGF0dXMtaXMgY2hlY2sgYm94ZXMgYXJlIGVuYWJsZWQgaWZmIFRhc2sgaW4gdGhlIHRyZWUgaXMgY2hlY2tlZC4KLQlWZXJpZnkgdGhhdCB0aGUgZW5hYmxlbWVudCBvZiB0aGUgV2hlcmV+IGNoZWNrYm94ZXMgZGV0ZXJtaW5lcyB0aGUgZW5hYmxlbWVudCBvZiB0aGVpciBvcHRpb24gY2hlY2sgYm94ZXMuCi0JVmVyaWZ5IHRoYXQgYSBuZXdseSBjcmVhdGVkIHRhc2sgYnkgTmV3IFRhc2sgaXMgYWZmZWN0ZWQgYnkgdGhlIGN1cnJlbnQgc2V0dGluZyBvZiB0aGUgZmlsdGVyLgotCi1BY3Rpb25zIGluIFRleHQgRWRpdG9yCi0JVmVyaWZ5IHRoYXQgZm9yIGEgbGluZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHRhc2ssIHlvdSBjYW4gYWRkIG9uZS4gSXQgc2hvdWxkIGFwcGVhciBpbiB0aGUgdmVydGljYWwgcnVsZXIgYW5kIGluIHRoZSB2aWV3Ci0JCXdpdGggYWRlcXVhdGUgdmFsdWVzIHNldCBpbiB0aGUgUmVzb3VjZSwgSW4gRm9sZGVyLCBhbmQgTG9jYXRpb24gZmllbGRzLgotCVZlcmlmeSB0aGF0IGZvciBhIGxpbmUgdGhhdCBoYXMgYSB0YXNrLiB5b3UgY2FuIHJlbW92ZSB0aGUgdGFzay4gSXQgZGlzYXBwZWFycyBmcm9tIHRoZSB2ZXJ0aWNhbCBydWxlciBhbmQgZnJvbSB0aGUgdmlldy4KLQlWZXJpZnkgdGhhdCBzZWxlY3RpbmcgYSB0YXNrIGl0ZW0gZnJvbSB0aGUgdmlldyBvcGVucyB0aGUgZmlsZSwgaWYgbm90IGFscmVhZHkgb3BlbiwgYW5kIGxvY2F0ZXMgdGhlIGNvZGUuIAotCi1QZXJzaXN0ZW5jZQotCVZlcmlmeSB0aGF0IHRoZSB2aWV3IHJldGFpbnMgaXRzIGl0ZW1zIGFmdGVyIGJlaW5nIGNsb3NlZCBhbmQgcmVvcGVuZWQuCi0JVmVyaWZ5IHRoYXQgdGhlIHZpZXcgbWFpbnRhaW5zIHRoZSBzb3J0IG9yZGVyIGFuZCBmaWx0ZXJpbmcgYmV0d2VlbiBzZXNzaW9ucy4KLQlWZXJpZnkgdGhhdCB0aGUgdG9wIGluZGV4IGFuZCB0aGUgc2VsZWN0aW9uIG9mIHRoZSB2aWV3IGFyZSBjb25zaXN0ZW50IGJldHdlZW4gc2Vzc2lvbnMsIGFuZCBhZnRlciBpbnNlcnRpbmcgb3IgZGV0YWNoaW5nIHRoZSB2aWV3LgotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvVGV4dEVkaXRvci50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL1RleHRFZGl0b3IudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDAwNzVmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvVGV4dEVkaXRvci50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1UaGlzIGlzIGEgdGVzdCBsaXN0IGZvciB0aGUgdGV4dCBlZGl0b3IuCi0KLVByZXNlbnRhdGlvbgotCVZlcmlmeSB0aGF0IGFwcHJvcHJpYXRlIHN0cmluZ3MgYXBwZWFyIGluIGFsbCBtZW51IGl0ZW1zIGFuZCB0ZXh0IGZpZWxkcy4KLQlWZXJpZnkgdGhhdCB0aGUgdmlldyBzaG93cyBhcHByb3ByaWF0ZSBzY3JvbGxiYXJzIHdoZW4gaXRzIGNvbnRlbnRzIGV4dGVuZHMgYmV5b25kIGl0cyBjbGllbnQgYXJlYS4KLQotRWRpdG9yIEFjdGlvbnMKLQlWZXJpZnkgdGhhdCBDdXQgYW5kIENvcHkgYXJlIGVuYWJsZWQgaWZmIHRoZXJlIGlzIHNlbGVjdGVkIHRleHQuCi0JVmVyaWZ5IHRoYXQgUGFzdGUgaXMgZW5hYmxlZCBpZmYgdGhlcmUgaXMgdGV4dCBpbiB0aGUgY2xpcGJvYXJkIGJ1ZmZlci4KLQlWZXJpZnkgdGhhdCBDdXQsIENvcHksIFBhc3RlLCBTZWxlY3QtQWxsIHdvcmsgY29ycmVjdGx5LgotCVZlcmlmeSB0aGF0IFJldmVydCBpcyBlbmFibGVkIG9ubHkgaWYgaXMgdGhlIGZpbGUgZGlydHkgYW5kIHdvcmtzIGNvcnJlY3RseS4KLQotRWRpdCBNZW51IEFjdGlvbnMKLQlWZXJpZnkgdGhhdCB0aGUgZW5hYmxlbWVudCBhbmQgYWN0aW9uIG9mIEN1dCwgQ29weSwgUGFzdGUsIGFuZCBTZWxlY3QtQWxsIGluIHRoZSBFZGl0IG1lbnUgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aG9zZSBpbiB0aGUgZWRpdG9yJ3MgY29udGV4dCBtZW51LgotCi1QZXJzaXN0ZW5jZQkKLQlUaGUgZWRpdG9yIGlzIG1hcmtlZCBkaXJ0eSBpZiB0aGUgdGV4dCBpcyBtb2RpZmllZCBieSBlaXRoZXIgdGhlIGtleWJvYXJkIE9SIHRoZSBlZGl0b3IgYWN0aW9ucy4KLQlUaGUgZWRpdG9yIGlzIG1hcmtlZCBjbGVhbiBhZnRlciBlaXRoZXIgc2F2aW5nIHRoZSBmaWxlIG9yIHJldmVydGluZyBpdC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL1VuZG8gdGVzdCBmaWxlcy9BLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL1VuZG8gdGVzdCBmaWxlcy9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMTVlOWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9VbmRvIHRlc3QgZmlsZXMvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgeHh4OwotcHVibGljIGNsYXNzIEEgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9VbmRvIHRlc3QgZmlsZXMvQi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9VbmRvIHRlc3QgZmlsZXMvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTFhNjhkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvVW5kbyB0ZXN0IGZpbGVzL0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHh4eDsKLXB1YmxpYyBjbGFzcyBCIHsKLQl2b2lkIGJhcigpIHsKLQkJQSBhPW51bGw7Ci0JCWEuZm9vKCk7Ci0JfQotfSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9VbmRvIHRlc3QgZmlsZXMvQy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9VbmRvIHRlc3QgZmlsZXMvQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTNmMGJiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvVW5kbyB0ZXN0IGZpbGVzL0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHh4eDsKLXB1YmxpYyBjbGFzcyBDIHsKLQl2b2lkIGJhcigpIHsKLQkJQSBhPW51bGw7Ci0JCWEuZm9vKCk7Ci0JfQotfSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9VbmRvIHRlc3QgZmlsZXMvRC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9VbmRvIHRlc3QgZmlsZXMvRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDI1NTlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvVW5kbyB0ZXN0IGZpbGVzL0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHh4eDsKLXB1YmxpYyBjbGFzcyBEIHsKLQl2b2lkIGJhcigpIHsKLQkJQSBhPW51bGw7Ci0JCWEuZm9vKCk7Ci0JfQotfSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9VbmRvLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvVW5kby50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjI4ZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9VbmRvLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi1UaGlzIGlzIGEgdGVzdCBsaXN0IGZvciB0aGUgaW50ZWdyYXRlZCB1bmRvL3JlZG8gZnJhbWV3b3JrCi0KLUFjdGlvbnMKLQlWZXJpZnkgdGhhdCAiVW5kbyBUeXBpbmciIGFwcGVhcnMgaW4gYWN0aW9uIGJhciBlZGl0IG1lbnUgYW5kIGVkaXRvciBwb3B1cCBtZW51IG9uY2UgdGV4dCBoYXMgYmVlbiB0eXBlZC4KLQlWZXJpZnkgdGhhdCAiUmVkbyBUeXBpbmciIGFwcGVhcnMgaW4gYWN0aW9uIGJhciBlZGl0IG1lbnUgaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gdW5kbyBoYXMgYmVlbiBwZXJmb3JtZWQuCi0JTW92ZSBiZXR3ZWVuIGRpZmZlcmVudCBlZGl0b3JzIGFuZCB2ZXJpZnkgdGhhdCB0aGUgdW5kby9yZWRvIHN0YXRlIG1hdGNoZXMgdGhlIGN1cnJlbnQgZWRpdG9yIGFuZCB0aGF0IHRoZSB1bmRvIHBlcmZvcm1zIHRoZSBleHBlY3RlZCBvcGVyYXRpb24uCi0JVmVyaWZ5IHRoYXQgIlVuZG8gPG5hbWUgb2YgcmVmYWN0b3Jpbmcgb3A+IiBhcHBlYXJzIGluIGFjdGlvbiBiYXIgZWRpdCBtZW51IGFuZCBlZGl0b3IgcG9wdXAgbWVudSBpbW1lZGlhdGVseSBhZnRlciBwZXJmb3JtaW5nIGEgcmVmYWN0b3JpbmcgZnJvbSB0aGF0IGVkaXRvci4KLQlWZXJpZnkgdGhhdCAiVW5kbyA8bmFtZSBvZiByZWZhY3RvcmluZyBvcD4iIGFwcGVhcnMgaW4gYWN0aW9uIGJhciBlZGl0IG1lbnUgb2YgUGFja2FnZSBFeHBsb3JlciBhbmQgTmF2aWdhdG9yIGFmdGVyIHBlcmZvcm1pbmcgYSByZWZhY3RvcmluZyBmcm9tIGFueXdoZXJlLgotCi1QcmVmZXJlbmNlcwotCVNldCBkaWZmZXJlbnQgdGV4dCB1bmRvIGxpbWl0cyAoaW5jbHVkaW5nIDApIGluIHRoZSB0ZXh0IGVkaXRvciBwcmVmZXJlbmNlcyAoR2VuZXJhbD5FZGl0b3JzPlRleHRFZGl0b3JzPlVuZG8gaGlzdG9yeSBzaXplKSBhbmQgdmVyaWZ5IHRoZXkgd29yayBhcyBleHBlY3RlZC4KLUludGVncmF0ZWQgU2NlbmFyaW9zCi0gIDxzZXR1cD4KLQlGb3IgdGhlIGZvbGxvd2luZyB0ZXh0LXJlZmFjdG9yaW5nIGludGVncmF0ZWQgc2NlbmFyaW9zLCBkbyB0aGUgZm9sbG93aW5nIGZpcnN0OgotCWEuICBDcmVhdGUgYSBKYXZhIHByb2plY3QgIlVuZG8gU2NlbmFyaW9zIi4KLQliLiAgQ3JlYXRlIGEgcGFja2FnZSAieHh4Ii4KLQljLiAgQ29weSB0aGUgamF2YSBmaWxlcyBwcm92aWRlZCBpbiBvcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWxDb21wb25lbnRUZXN0cy9VbmRvIHRlc3QgZmlsZXMgdG8gInh4eCIuCi0gIDxzaW1wbGUgcmVmYWN0b3JpbmcgdW5kbz4KLSAgCWEuICBPcGVuIEEuSmF2YSBhbmQgQi5qYXZhCi0gIAliLiAgSW4gQSwgY2xpY2sgaW4gdGhlIG1ldGhvZCBuYW1lIGZvciAiYmFyIiBhbmQgY2hvb3NlIFJlZmFjdG9yPlJlbmFtZQotICAJYy4gIFJlbmFtZSAiYmFyIiB0byAiYmFyMiIKLSAgCWQuICBWZXJpZnkgdGhhdCAiVW5kbyBSZW5hbWUgbWV0aG9kIGJhciB0byBiYXIyIiBhcHBlYXJzIGluIEVkaXQ+VW5kbyBpbiBwdWxsZG93biBtZW51IG9mIGVkaXRvciwgZWRpdG9yIHBvcHVwLCBQYWNrYWdlIEV4cGxvcmVyLCBhbmQgTmF2aWdhdG9yLgotICAJZS4gIFNlbGVjdCAiVW5kbyBSZW5hbWUgbWV0aG9kIGJhciB0byBiYXIyIiBmcm9tIGFueSBvZiB0aGVzZSBsb2NhdGlvbnMKLSAgCWYuICBPcGVyYXRpb24gaXMgdW5kb25lIHdpdGhvdXQgcHJvbXB0aW5nIG9yIHdhcm5pbmcKLSAgCWcuICBWZXJpZnkgdGhhdCAiUmVkbyBSZW5hbWUgbWV0aG9kIGJhciB0byBiYXIyIiBhcHBlYXJzIGluIEVkaXQ+VW5kbyBwdWxsZG93biBtZW51IGZvciB0aGUgZWRpdG9yLCBOYXZpZ2F0b3IsIGFuZCBQYWNrYWdlIEV4cGxvcmVyLgotICAJaC4gIFNlbGVjdCAiUmVkbyBSZW5hbWUgbWV0aG9kIGJhciB0byBiYXIyIiBmcm9tIGFueSBvZiB0aGVzZSBsb2NhdGlvbnMKLSAgCWkuICBPcGVyYXRpb24gaXMgcmVkb25lIHdpdGhvdXQgcHJvbXB0aW5nIG9yIHdhcm5pbmcKLSAgCWouICBVbmRvIGFnYWluIHRvIHJldmVydCBmaWxlcyB0byBvcmlnaW5hbCBzdGF0ZSBhbmQgY2xvc2UgZWRpdG9ycy4KLSAgPHByb21wdCBvbiBub24tbG9jYWwgdW5kbywgcHJvY2VlZD4KLSAgICBhLiAgT3BlbiBBLkphdmEgYW5kIEIuamF2YQotICAJYi4gIEluIEEsIGNsaWNrIGluIHRoZSBtZXRob2QgbmFtZSBmb3IgImZvbyIgYW5kIGNob29zZSBSZWZhY3Rvcj5SZW5hbWUKLSAgCWMuICBSZW5hbWUgImZvbyIgdG8gImZvbzIiCi0gIAlkLiAgVmVyaWZ5IHRoYXQgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgYXBwZWFycyBpbiBFZGl0PlVuZG8gaW4gcHVsbGRvd24gbWVudSBvZiBlZGl0b3IsIGVkaXRvciBwb3B1cCwgUGFja2FnZSBFeHBsb3JlciwgYW5kIE5hdmlnYXRvci4KLSAgCWUuICBTZWxlY3QgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgZnJvbSBBJ3MgZWRpdCBtZW51LgotICAJZi4gIE9wZXJhdGlvbiBwcm9tcHRzIGFzIHRvIHdoZXRoZXIgeW91IHdhbnQgdG8gcHJvY2VlZCBzaW5jZSB0aGUgcmVmYWN0b3JpbmcgYWZmZWN0cyBvdGhlciBmaWxlcy4KLSAgCWcuICBTZWxlY3QgInllcyIgYW5kIG9wZXJhdGlvbiBpcyB1bmRvbmUuCi0gIAloLiAgU2VsZWN0ICJSZWRvIFJlbmFtZSBtZXRob2QgZm9vIHRvIGZvbzIiIGZyb20gcGFja2FnZSBleHBsb3Jlci4KLSAgCWkuICBPcGVyYXRpb24gcHJvbXB0cyBhcyB0byB3aGV0aGVyIHlvdSB3YW50IHRvIHByb2NlZWQgc2luY2UgdGhlIHJlZmFjdG9yaW5nIGFmZmVjdHMgb3RoZXIgZmlsZXMuCi0gIAlqLiAgVW5kbyBhZ2FpbiB0byByZXZlcnQgZmlsZXMgdG8gb3JpZ2luYWwgc3RhdGUgYW5kIGNsb3NlIGVkaXRvcnMuCi0gIDxwcm9tcHQgb24gbm9uLWxvY2FsIHVuZG8sIGNhbmNlbD4KLSAgICBhLiAgT3BlbiBBLkphdmEgYW5kIEIuamF2YQotICAJYi4gIEluIEEsIGNsaWNrIGluIHRoZSBtZXRob2QgbmFtZSBmb3IgImZvbyIgYW5kIGNob29zZSBSZWZhY3Rvcj5SZW5hbWUKLSAgCWMuICBSZW5hbWUgImZvbyIgdG8gImZvbzIiCi0gIAlkLiAgVmVyaWZ5IHRoYXQgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgYXBwZWFycyBpbiBFZGl0PlVuZG8gaW4gcHVsbGRvd24gbWVudSBvZiBlZGl0b3IsIGVkaXRvciBwb3B1cCwgUGFja2FnZSBFeHBsb3JlciwgYW5kIE5hdmlnYXRvci4KLSAgCWUuICBTZWxlY3QgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgZnJvbSBBJ3MgZWRpdCBtZW51LgotICAJZi4gIE9wZXJhdGlvbiBwcm9tcHRzIGFzIHRvIHdoZXRoZXIgeW91IHdhbnQgdG8gcHJvY2VlZCBzaW5jZSB0aGUgcmVmYWN0b3JpbmcgYWZmZWN0cyBvdGhlciBmaWxlcy4KLSAgCWcuICBTZWxlY3QgImNhbmNlbCIgYW5kIG9wZXJhdGlvbiBpcyBjYW5jZWxsZWQuCi0gIAloLiAgVmVyaWZ5IHRoYXQgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgaXMgc3RpbGwgaW4gdGhlIEVkaXQ+VW5kbyBtZW51LgotICAJaS4gIFNlbGVjdCAiVW5kbyBSZW5hbWUgbWV0aG9kIGZvbyB0byBmb28yIiBhZ2FpbiwgY2hvb3NpbmcgInllcyIgd2hlbiBwcm9tcHRlZC4KLSAgCWouICBDbG9zZSBlZGl0b3JzCi0gIDxwcm9tcHQgb24gbm9uLWxvY2FsIHVuZG8sIGRpc2NhcmQgdW5kbz4KLSAgICBhLiAgT3BlbiBBLkphdmEgYW5kIEIuamF2YQotICAJYi4gIEluIEEsIGNsaWNrIGluIHRoZSBtZXRob2QgbmFtZSBmb3IgImZvbyIgYW5kIGNob29zZSBSZWZhY3Rvcj5SZW5hbWUKLSAgCWMuICBSZW5hbWUgImZvbyIgdG8gImZvbzIiCi0gIAlkLiAgVmVyaWZ5IHRoYXQgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgYXBwZWFycyBpbiBFZGl0PlVuZG8gaW4gcHVsbGRvd24gbWVudSBvZiBlZGl0b3IsIGVkaXRvciBwb3B1cCwgUGFja2FnZSBFeHBsb3JlciwgYW5kIE5hdmlnYXRvci4KLSAgCWUuICBTZWxlY3QgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgZnJvbSBBJ3MgZWRpdCBtZW51LgotICAJZi4gIE9wZXJhdGlvbiBwcm9tcHRzIGFzIHRvIHdoZXRoZXIgeW91IHdhbnQgdG8gcHJvY2VlZCBzaW5jZSB0aGUgcmVmYWN0b3JpbmcgYWZmZWN0cyBvdGhlciBmaWxlcy4KLSAgCWcuICBTZWxlY3QgIkRpc2NhcmQgVW5kbyIgYW5kIG9wZXJhdGlvbiBpcyBjYW5jZWxsZWQuCi0gICAJaC4gIENob29zZSAiVW5kbyBUeXBpbmciIGZyb20gQSB0byByZXZlcnQgdGhlIHRleHQgcGFydCBvZiB0aGUgcmVmYWN0b3JpbmcKLSAgCWkuICBHbyB0byBCIGFuZCBjaG9vc2UgIlVuZG8gVHlwaW5nIiB0byByZXZlcnQgdGhlIHRleHQgcGFydCBvZiB0aGUgcmVmYWN0b3JpbmcgY2hhbmdlLgotICAJai4gIENsb3NlIGVkaXRvcnMKLSAgPHByb21wdCBvbiBub24tbG9jYWwgdW5kbywgZG8gbm90IHByb2NlZWQsIHdpdGggdW5kby9yZWRvIGluIGJldHdlZW4gKGJ1ZyA5NzkzOSkKLSAgICBhLiAgT3BlbiBBLkphdmEgYW5kIEIuamF2YQotICAJYi4gIEluIEEsIGNsaWNrIGluIHRoZSBtZXRob2QgbmFtZSBmb3IgImZvbyIgYW5kIGNob29zZSBSZWZhY3Rvcj5SZW5hbWUKLSAgCWMuICBSZW5hbWUgImZvbyIgdG8gImZvbzIiCi0gIAlkLiAgVmVyaWZ5IHRoYXQgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgYXBwZWFycyBpbiBFZGl0PlVuZG8gaW4gcHVsbGRvd24gbWVudSBvZiBlZGl0b3IsIGVkaXRvciBwb3B1cCwgUGFja2FnZSBFeHBsb3JlciwgYW5kIE5hdmlnYXRvci4KLSAgCWUuICBTZWxlY3QgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgZnJvbSBBJ3MgZWRpdCBtZW51LgotICAJZi4gIE9wZXJhdGlvbiBwcm9tcHRzIGFzIHRvIHdoZXRoZXIgeW91IHdhbnQgdG8gcHJvY2VlZCBzaW5jZSB0aGUgcmVmYWN0b3JpbmcgYWZmZWN0cyBvdGhlciBmaWxlcy4KLQlnLiAgU2VsZWN0ICJ5ZXMiIGFuZCBvcGVyYXRpb24gaXMgdW5kb25lLgotICAJaC4gIFNlbGVjdCAiUmVkbyBSZW5hbWUgbWV0aG9kIGZvbyB0byBmb28yIiBmcm9tIHBhY2thZ2UgZXhwbG9yZXIuCi0gIAlpLiAgT3BlcmF0aW9uIHByb21wdHMgYXMgdG8gd2hldGhlciB5b3Ugd2FudCB0byBwcm9jZWVkIHNpbmNlIHRoZSByZWZhY3RvcmluZyBhZmZlY3RzIG90aGVyIGZpbGVzLgotICAgIGouICBTZWxlY3QgInllcyIgYW5kIG9wZXJhdGlvbiBpcyByZWRvbmUuCi0gIAlrLiAgU2VsZWN0ICJVbmRvIFJlbmFtZSBtZXRob2QgZm9vIHRvIGZvbzIiIGZyb20gQSdzIGVkaXQgbWVudS4KLSAgCWwuICBPcGVyYXRpb24gcHJvbXB0cyBhcyB0byB3aGV0aGVyIHlvdSB3YW50IHRvIHByb2NlZWQgc2luY2UgdGhlIHJlZmFjdG9yaW5nIGFmZmVjdHMgb3RoZXIgZmlsZXMuCi0gCW0uICBTZWxlY3QgIkRpc2NhcmQgVW5kbyIgYW5kIG9wZXJhdGlvbiBpcyBjYW5jZWxsZWQuCi0gIAluLiAgQ2hvb3NlICJVbmRvIFR5cGluZyIgZnJvbSBBIHRvIHJldmVydCB0aGUgdGV4dCBwYXJ0IG9mIHRoZSByZWZhY3RvcmluZwotICAJby4gIEdvIHRvIEIgYW5kIGNob29zZSAiVW5kbyBUeXBpbmciIHRvIHJldmVydCB0aGUgdGV4dCBwYXJ0IG9mIHRoZSByZWZhY3RvcmluZyBjaGFuZ2UuCi0gIAlwLiAgQ2xvc2UgZWRpdG9ycwotICA8ZGV0ZWN0aW9uIG9mIGNoYW5nZWQgZmlsZT4KLSAgICBhLiAgT3BlbiBBLkphdmEgYW5kIEIuamF2YQotICAJYi4gIEluIEEsIGNsaWNrIGluIHRoZSBtZXRob2QgbmFtZSBmb3IgImZvbyIgYW5kIGNob29zZSBSZWZhY3Rvcj5SZW5hbWUKLSAgCWMuICBSZW5hbWUgImZvbyIgdG8gImZvbzIiCi0gIAlkLiAgSW4gQiwgdHlwZSBzb21lIHRleHQgYW55d2hlcmUuCi0gIAllLiAgR28gYmFjayB0byBBIGFuZCBTZWxlY3QgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgZnJvbSBBJ3MgZWRpdCBtZW51LgotICAJZi4gIE9wZXJhdGlvbiBpbmZvcm1zIHlvdSB0aGF0IGl0IGNhbm5vdCBiZSBjb21wbGV0ZWQgc2luY2UgQiBoYXMgY2hhbmdlZC4KLSAgCWcuICBTZWxlY3QgT0sKLSAgCWguICBDaG9vc2UgIlVuZG8gVHlwaW5nIiBmcm9tIEEgdG8gcmV2ZXJ0IHRoZSB0ZXh0IHBhcnQgb2YgdGhlIHJlZmFjdG9yaW5nCi0gIAlpLiAgR28gdG8gQiBhbmQgY2hvb3NlICJVbmRvIFR5cGluZyIgdG8gcmV2ZXJ0IHRoZSB0eXBlZCBjaGFuZ2VzIGZvbGxvd2VkIGJ5IHRoZSB0ZXh0IHBhcnQgb2YgdGhlIHJlZmFjdG9yaW5nIGNoYW5nZS4KLSAgPGRldGVjdGlvbiBvZiBjaGFuZ2VkIGZpbGUgd2l0aCB1bmRvL3JlZG8gaW4gYmV0d2VlbiAoYnVnIDk3OTM5KT4KLSAgICBhLiAgT3BlbiBBLkphdmEgYW5kIEIuamF2YQotICAJYi4gIEluIEEsIGNsaWNrIGluIHRoZSBtZXRob2QgbmFtZSBmb3IgImZvbyIgYW5kIGNob29zZSBSZWZhY3Rvcj5SZW5hbWUKLSAgCWMuICBSZW5hbWUgImZvbyIgdG8gImZvbzIiCi0gIAlkLiAgVmVyaWZ5IHRoYXQgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgYXBwZWFycyBpbiBFZGl0PlVuZG8gaW4gcHVsbGRvd24gbWVudSBvZiBlZGl0b3IsIGVkaXRvciBwb3B1cCwgUGFja2FnZSBFeHBsb3JlciwgYW5kIE5hdmlnYXRvci4KLSAgCWUuICBTZWxlY3QgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgZnJvbSBBJ3MgZWRpdCBtZW51LgotICAJZi4gIE9wZXJhdGlvbiBwcm9tcHRzIGFzIHRvIHdoZXRoZXIgeW91IHdhbnQgdG8gcHJvY2VlZCBzaW5jZSB0aGUgcmVmYWN0b3JpbmcgYWZmZWN0cyBvdGhlciBmaWxlcy4KLQlnLiAgU2VsZWN0ICJ5ZXMiIGFuZCBvcGVyYXRpb24gaXMgdW5kb25lLgotICAJaC4gIFNlbGVjdCAiUmVkbyBSZW5hbWUgbWV0aG9kIGZvbyB0byBmb28yIiBmcm9tIHBhY2thZ2UgZXhwbG9yZXIuCi0gIAlpLiAgT3BlcmF0aW9uIHByb21wdHMgYXMgdG8gd2hldGhlciB5b3Ugd2FudCB0byBwcm9jZWVkIHNpbmNlIHRoZSByZWZhY3RvcmluZyBhZmZlY3RzIG90aGVyIGZpbGVzLgotICAgIGouICBTZWxlY3QgInllcyIgYW5kIG9wZXJhdGlvbiBpcyByZWRvbmUuCi0gIAlrLiAgSW4gQiwgdHlwZSBzb21lIHRleHQgYW55d2hlcmUuCi0gIAlsLiAgR28gYmFjayB0byBBIGFuZCBTZWxlY3QgIlVuZG8gUmVuYW1lIG1ldGhvZCBmb28gdG8gZm9vMiIgZnJvbSBBJ3MgZWRpdCBtZW51LgotICAJbS4gIE9wZXJhdGlvbiBpbmZvcm1zIHlvdSB0aGF0IGl0IGNhbm5vdCBiZSBjb21wbGV0ZWQgc2luY2UgQiBoYXMgY2hhbmdlZC4KLSAgCW4uICBTZWxlY3QgT0sKLSAgCW8uICBDaG9vc2UgIlVuZG8gVHlwaW5nIiBmcm9tIEEgdG8gcmV2ZXJ0IHRoZSB0ZXh0IHBhcnQgb2YgdGhlIHJlZmFjdG9yaW5nCi0gIAlwLiAgR28gdG8gQiBhbmQgY2hvb3NlICJVbmRvIFR5cGluZyIgdG8gcmV2ZXJ0IHRoZSB0eXBlZCBjaGFuZ2VzIGZvbGxvd2VkIGJ5IHRoZSB0ZXh0IHBhcnQgb2YgdGhlIHJlZmFjdG9yaW5nIGNoYW5nZS4KLQotTWFudWFsIFRlc3Rpbmcgb2YgRXhhbXBsZXMKLQotQW4gdW5yZWxlYXNlZCBleGFtcGxlIGFwcCBpcyB1c2VkIHRvIG1hbnVhbGx5IHRlc3QgY2VydGFpbiB1c2VyIG9wZXJhdGlvbnMgYW5kIHRvIHdhdGNoIHRoZSB1bmRvCi1oaXN0b3J5IHVzaW5nIGFuIE9wZXJhdGlvbnNMb2dWaWV3LiAgVG8gZG8gdGhlIHRlc3RpbmcgYmVsb3csIHlvdSBtdXN0IGhhdmUgYWNjZXNzIHRvIHRoZSBPdHRhd2EKLUNWUyByZXBvc2l0b3J5IChob3N0OiBvdHRjdnMxLm90dC5vdGkuY29tLCByZXBvc2l0b3J5IHBhdGg6IC9ob21lL2N2cy9kZXNrdG9wKS4KLUNoZWNrIG91dCB0aGUgcHJvamVjdCBvcmcuZWNsaXBzZS51aS5vcGVyYXRpb25zLmV4YW1wbGVzIGZyb20gSEVBRCBhbmQgdGhlbiBydW4gYSB3b3JrYmVuY2guICBUaGVyZQotbXVzdCBiZSBhdCBsZWFzdCBzb21lICoueG1sIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSAoY3JlYXRlIGEgcGx1Zy1pbiBwcm9qZWN0IGlmIHlvdXIgd29ya3NwYWNlIGlzIGVtcHR5KS4KLVRoZSBzY2VuYXJpb3MgYXJlIGRlc2lnbmVkIHRvIGJlIHJ1biBzZXF1ZW50aWFsbHksIGFzIHRoZSBleGFtcGxlIG9wZXJhdGlvbnMgY3ljbGUgdGhyb3VnaCB0aHJlZQotc3RhdHVzZXMgLSBJTkZPLCBXQVJOSU5HLCBFUlJPUi4KLQotICAxIC0gPGNvcnJlY3QgaGFuZGxpbmcgb2YgbG9uZyBsYWJlbCBuYW1lcz4KLSAgCWEuICBTZWxlY3QgYSAqLnhtbCBmaWxlIGluIHRoZSBuYXZpZ2F0b3Igb3IgcGFja2FnZSBleHBsb3Jlci4KLSAgCWIuICBQb3B1cCB0aGUgbWVudSBhbmQgY2hvb3NlIE9wZXJhdGlvbnM+RXhhbXBsZSBPcGVyYXRpb24uIAotICAJYy4gIEEgbWVzc2FnZSBib3ggYXBwZWFycyBjb25maXJtaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbi4KLSAgCWQuICBDaGVjayB0aGUgdW5kbyBtZW51IGZvciB0aGUgcGFja2FnZSBleHBsb3JlciBhbmQgdmVyaWZ5IHRoYXQgdGhlIGxvbmcgbmFtZSAKLSAgCWhhcyBlbGxpcHNpcyAoLi4uKSBpbiB0aGUgbWlkZGxlIG9mIGl0Ci0gIAkKLSAgMiAtIDxjb3JyZWN0IGhhbmRsaW5nIG9mIHVuZG8gYW5kIHByb2dyZXNzIG1vbml0b3I+Ci0gICAgZS4gIFVuZG8gdGhlIG9wZXJhdGlvbiBmcm9tIHRoZSBwYWNrYWdlIGV4cGxvcmVyCi0gICAgZi4gIFZlcmlmeSB0aGF0IGFuIGhvdXIgZ2xhc3MgYXBwZWFycwotICAgIGcuICBBZnRlciBhIHNob3J0IHdhaXQsIGEgcHJvZ3Jlc3MgbW9uaXRvciBzaG91bGQgYXBwZWFyCi0gICAgaC4gIEEgbWVzc2FnZSBib3ggYXBwZWFycyBjb25maXJtaW5nIHRoZSB1bmRvLgotICAgIAotICAzIC0gPHZlcmlmeSBhbnl0aGluZyBtaXNzZWQgYWJvdmUgYW5kIGFkZCByZWRvPgotICAgIGkuICByZXBlYXQgc3RlcHMgKGEpIHRocm91Z2ggKGgpIGFib3ZlIHRvIGRvdWJsZSBjaGVjayBob3VyIGdsYXNzLCBldGMuCi0gICAgai4gIENoZWNrIHRoYXQgdGhlIHJlZG8gbWVudSBmb3IgdGhlIHBhY2thZ2UgZXhwbG9yZXIgc2hvd3MgdGhlIG9wZXJhdGlvbgotICAgCWsuICBSZWRvIHRoZSBvcGVyYXRpb24KLSAgICBsLiAgQSBtZXNzYWdlIGJveCBhcHBlYXJzIGNvbmZpcm1pbmcgdGhlIHJlZG8KLSAgICAKLSAgNCAtIDxwcm9wZXIgaGFuZGxpbmcgb2Ygb3BlcmF0aW9uIGV4Y2VwdGlvbnM+Ci0gICAgbS4gIHJlcGVhdCBzdGVwcyAoYSkgdGhyb3VnaCAoZykgYWJvdmUuCi0Jbi4gIEFmdGVyIHRoZSBwcm9ncmVzcyBkaWFsb2cgZGlzYXBwZWFycywgeW91IHNob3VsZCBnZXQgYSBtZXNzYWdlIGluZm9ybWluZwotCXlvdSBvZiBhbiBlcnJvci9BYm5vcm1hbCBXb3JrYmVuY2ggQ29uZGl0aW9uCi0Jby4gIFZlcmlmeSB0aGF0IHVuZG8vcmVkbyBhcmUgZGlzYWJsZWQgYWZ0ZXIgdGhpcyBlcnJvci4KLSAgICAgCi0gIDUgLSA8Y29ycmVjdCBoYW5kbGluZyBvZiBJTkZPLCBXQVJOSU5HIHN0YXR1cyBmcm9tIEFkdmFuY2VkVmFsaWRhdGluZ09wZXJhdGlvbkFwcHJvdmVyPgotICAgIGEuICBTZWxlY3QgYSAqLnhtbCBmaWxlIGluIHRoZSBuYXZpZ2F0b3Igb3IgcGFja2FnZSBleHBsb3Jlci4KLSAgCWIuICBQb3B1cCB0aGUgbWVudSBhbmQgY2hvb3NlIE9wZXJhdGlvbnM+QWR2YW5jZWQgRXhhbXBsZSBPcGVyYXRpb24uIAotICAJYy4gIEEgbWVzc2FnZSBib3ggYXBwZWFycyBjb25maXJtaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbi4KLSAgCWQuICBDaGVjayB0aGUgdW5kbyBtZW51IGZvciB0aGUgcGFja2FnZSBleHBsb3JlciBhbmQgdmVyaWZ5IHRoYXQgdGhlIGxvbmcgbmFtZSAKLSAgCWhhcyBlbGxpcHNpcyAoLi4uKSBpbiB0aGUgbWlkZGxlIG9mIGl0Ci0gICAgZS4gIFVuZG8gdGhlIG9wZXJhdGlvbiBmcm9tIHRoZSBwYWNrYWdlIGV4cGxvcmVyCi0gICAgZi4gIFNlbGVjdCAiVW5kbyBBIHZlcnkgbG9uZyBzdHIuLi4KLSAgICBnLiAgWW91IHNob3VsZCBpbW1lZGlhdGVseSBzZWUgYSBkaWFsb2cgdGl0bGVkICJVbmRvIEluZm9ybWF0aW9uIiBhbmQgYmUgYXNrZWQgd2hldGhlciB0byBwcm9jZWVkLgotICAgIGguICBDaG9vc2UgeWVzLgotICAgIGkuICBZb3Ugc2hvdWxkIHNlZSBhIHByb2dyZXNzIGRpYWxvZyBhbmQgdGhlbiBhIG1lc3NhZ2UgYm94IHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZQotICAgIGouICBBdCB0aGlzIHBvaW50IHlvdSBzaG91bGQgc2VlIHRoZSBSZWRvIEFjdGlvbiBhdmFpbGFibGUKLSAgICBrLiAgUmVwZWF0IHN0ZXBzIChhKSB0aHJvdWdoIChqKS4gIFRoZSBvbmx5IGRpZmZlcmVuY2Ugc2hvdWxkIGJlIHRoYXQgdGhlCi0gICAgICAgZGlhbG9nIGluIChlKSBpcyB0aXRsZWQgIlVuZG8gV2FybmluZyIgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBtZXNzYWdlLgotICAgICAgIElmIHlvdSBhcmUgZmFzdCBlbm91Z2gsIGNhbmNlbCB0aGUgcHJvZ3Jlc3MgZGlhbG9nIHRvIHZlcmlmeSBpdCBzdG9wcyB0aGUgb3BlcmF0aW9uCi0gICAgICAgKG5vIHByb21wdCBhdCB0aGUgZW5kKS4KLSAgNiAtIDxjb3JyZWN0IGhhbmRsaW5nIG9mIEVSUk9SIHN0YXR1cyBmcm9tIEFkdmFuY2VkVmFsaWRhdGluZ09wZXJhdGlvbkFwcHJvdmVyPgotICAgIGEuICBTZWxlY3QgYSAqLnhtbCBmaWxlIGluIHRoZSBuYXZpZ2F0b3Igb3IgcGFja2FnZSBleHBsb3Jlci4KLSAgCWIuICBQb3B1cCB0aGUgbWVudSBhbmQgY2hvb3NlIE9wZXJhdGlvbnM+QWR2YW5jZWQgRXhhbXBsZSBPcGVyYXRpb24uIAotICAJYy4gIEEgbWVzc2FnZSBib3ggYXBwZWFycyBjb25maXJtaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbi4KLSAgICBkLiAgU2VsZWN0ICJVbmRvIEEgdmVyeSBsb25nIHN0ci4uLgotCWUuICBZb3Ugc2hvdWxkIGZpcnN0IHNlZSBhIHByb2dyZXNzIGRpYWxvZyB3aGlsZSB0aGUgb3BlcmF0aW9uIGNvbXB1dGVzIHZhbGlkaXR5Ci0JZi4gIFlvdSBzaG91bGQgdGhlbiBzZWUgYSBkaWFsb2cgdGl0bGVkICJVbmRvIFByb2JsZW0iIGluZm9ybWluZyB5b3UgdGhlIG9wZXJhdGlvbiBjYW5ub3QgdW5kbwotCWcuICBVbmRvIGFuZCBSZWRvIHNob3VsZCBubyBsb25nZXIgYmUgYXZhaWxhYmxlIGluIHRoZSBtZW51LgotCQotICA3IC0gPGNvcnJlY3QgaGFuZGxpbmcgb2YgY2FuY2VsL2ZsdXNoIGluc2lkZSBMaW5lYXJVbmRvVmlvbGF0aW9uVXNlckFwcHJvdmVyPgotICAgIGEuICBTZWxlY3QgYSAqLnhtbCBmaWxlIGluIHRoZSBuYXZpZ2F0b3Igb3IgcGFja2FnZSBleHBsb3Jlci4KLSAgCWIuICBQb3B1cCB0aGUgbWVudSBhbmQgY2hvb3NlIE9wZXJhdGlvbnM+SW52YWxpZCBFeGFtcGxlIE9wZXJhdGlvbi4gCi0gIAljLiAgQSBtZXNzYWdlIGJveCBhcHBlYXJzIGNvbmZpcm1pbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgb3BlcmF0aW9uLgotICAJZC4gIFNlbGVjdCAiVW5kbyBBIHZlcnkgbG9uZyBzdHIuLi4KLSAgCWUuICBBIG1lc3NhZ2UgYm94IGFwcGVhcnMgaW5mb3JtaW5nIHlvdSBvZiBtb3JlIHJlY2VudCBjaGFuZ2VzIHRvIHRoZSBwYWNrYWdlIGV4cGxvcmVyIGFuZAotCWFza3MgaWYgeW91IHdpc2ggdG8gdW5kbyB0aG9zZSBsb2NhbCBjaGFuZ2VzIGZpcnN0LgotICAJZi4gIEFuc3dlciBuby4KLSAgCWcuICBWZXJpZnkgdGhhdCB0aGUgdW5kbyBtZW51IGl0ZW0gcmVtYWlucyB0aGUgc2FtZS4KLSAgCQotICA4IC0gPGNvcnJlY3QgaGFuZGxpbmcgb2Ygcm9sbGJhY2sgZmFpbHVyZSBpbnNpZGUgTGluZWFyVW5kb1Zpb2xhdGlvblVzZXJBcHByb3Zlcj4KLSAgICBhLiAgU2VsZWN0IGEgKi54bWwgZmlsZSBpbiB0aGUgbmF2aWdhdG9yIG9yIHBhY2thZ2UgZXhwbG9yZXIuCi0gIAliLiAgUG9wdXAgdGhlIG1lbnUgYW5kIGNob29zZSBPcGVyYXRpb25zPkludmFsaWQgRXhhbXBsZSBPcGVyYXRpb24uIAotICAJYy4gIEEgbWVzc2FnZSBib3ggYXBwZWFycyBjb25maXJtaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbi4KLSAgCWQuICBTZWxlY3QgIlVuZG8gQSB2ZXJ5IGxvbmcgc3RyLi4uCi0gIAllLiAgQSBtZXNzYWdlIGJveCBhcHBlYXJzIGluZm9ybWluZyB5b3Ugb2YgbW9yZSByZWNlbnQgY2hhbmdlcyB0byB0aGUgcGFja2FnZSBleHBsb3JlciBhbmQKLQlhc2tzIGlmIHlvdSB3aXNoIHRvIHVuZG8gdGhvc2UgbG9jYWwgY2hhbmdlcyBmaXJzdC4KLSAgCWYuICBBbnN3ZXIgeWVzLgotICAJZy4gIFZlcmlmeSB0aGF0IHVuZG8gaXMgc3RpbGwgYXZhaWxhYmxlIChkdWUgdG8gZmFpbHVyZSBpbiB0aGUgcm9sbGJhY2spCi0gIAloLiAgVW5kbyB0aGUgaXRlbSBhZ2FpbiwgdGhpcyB0aW1lIGl0IHNob3VsZCBiZSBzdWNjZXNzZnVsIGFuZCByZWRvIHNob3VsZCBiZSBhdmFpbGFibGUuCi0gIAkKLQkKLSAgCi0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9XZWxjb21lRWRpdG9yLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvV2VsY29tZUVkaXRvci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OTE2YWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9XZWxjb21lRWRpdG9yLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLVRoaXMgaXMgYSB0ZXN0IGxpc3QgZm9yIHRoZSB3ZWxjb21lIGVkaXRvci4KLQotUHJlc2VudGF0aW9uCi0JVmVyaWZ5IHRoYXQgdGhlIGVkaXRvciBhcHBlYXJzIHdoZW4gdGhlIHdvcmtiZW5jaCBydW5zIGZvciB0aGUgZmlyc3QgdGltZS4KLQlWZXJpZnkgdGhhdCB0aGUgZWRpdG9yIHNob3dzIGFwcHJvcHJpYXRlIHNjcm9sbGJhcnMgd2hlbiBpdHMgY29udGVudHMgZXh0ZW5kcyBiZXlvbmQgaXRzIGNsaWVudCBhcmVhLgotCVZlcmlmeSB0aGF0IGlmIHRoZSBlZGl0b3IgaXMgY2xvc2VkIHdoZW4gdGhlIHdvcmtiZW5jaCBjbG9zZXMsIHRoZSBlZGl0b3IgcmVtYWlucyBjbG9zZWQgaW4gbmV4dCBzZXNzaW9uLgotCVZlcmlmeSB0aGF0IG1vZGlmeWluZyB0aGUgZWRpdG9yJ3MgZW50cnkgaW4gdGhlIHByb2R1Y3QuaW5pIGZpbGUgdXBkYXRlcyB0aGUgd29ya2JlbmNoIGJ5IGZvbGxvd2luZyB0aGUgc3RlcHMgYmVsb3cuCi0JCTEuIE1ha2Ugc3VyZSB0aGUgZWRpdG9yIGlzIGNsb3NlZCB3aGVuIGV4aXRpbmcgRWNsaXBzZS4KLQkJMi4gT3BlbiBwcm9kdWN0LmluaSB3aXRoIGEgdGV4dCBlZGl0b3IgYW5kIHJlbW92ZSB0aGUgd2Vjb21lIGVkaXRvcidzIGVudHJ5IGZyb20gdGhlIGZpbGUsIHdoaWNoIGlzOgotCQkJd2VsY29tZVBhZ2UgPSB3ZWxjb21lLnhtbAotCQkzLiBSZXN0YXJ0IEVjbGlwc2UuCi0JCTQuIFZlcmlmeSB0aGF0IFdlbGNvbWUgZG9lc24ndCBzaG93IHVuZGVyIEhlbHAgaW4gdGhlIHdvcmtiZW5jaCBwdWxsZG93biBtZW51LgotCQk1LiBFeGl0IEVjbGlwc2UKLQkJNi4gQWRkIHRoZSBlbnRyeSBhcyBpbiBzdGVwIDIgYmFjayB0byBwcm9kdWN0LmluaQotCQk3LiBSZXNhcnQgRWNsaXBzZQotCQk4LiBWZXJpZnkgdGhhdCBXZWxjb21lIHNob3dzIGFnYWluIHVuZGVyIEhlbHAuCi0KLUFjdGlvbnMKLQlWZXJpZnkgdGhhdCBIZWxwLT5XZWxjb21lIGludm9rZXMgdGhlIGVkaXRvci4KLQlWZXJpZnkgdGhhdCBhbGwgbGlua3MgaW52b2tlIHRoZWlyIGNvcnJlc3BvbmRpbmcgYWN0aW9ucy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL1dvcmtiZW5jaEFjdGlvbi50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL1dvcmtiZW5jaEFjdGlvbi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzA3MDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIENvbXBvbmVudCBUZXN0cy9Xb3JrYmVuY2hBY3Rpb24udHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotVGhpcyBpcyBhIHRlc3Qgc2NyaXB0IGZvciBhY3Rpb25zIGluIHRoZSB3b3JrYmVuY2guCi0KLUZpbGUgQWN0aW9ucyAuLgotCUludm9rZSBGaWxlIE5ldyAuLiBwcm9qZWN0cywgaXRlbXMsIG90aGVyLgotCUludm9rZSBUb29sYmFyIGJ1dHRvbiBmb3IgRmlsZSBOZXcgLi4gcHJvamVjdHMsIGl0ZW1zLCBvdGhlci4KLQlWZXJpZnkgY2xvc2UgYW5kIHNhdmUgYWN0aW9uIGVuYWJsZW1lbnQgd2l0aCAKLQkJLSBubyBlZGl0b3JzIG9wZW4KLQkJLSBvbmUgZWRpdG9yCi0JCS0gb25lIGRpcnR5IGVkaXRvcgotCQktIGFmdGVyIHJldmVydAotCQktIHR3byBlZGl0b3JzCi0JCS0gdHdvIGRpcnR5IGVkaXRvcnMKLQkJLSBhZnRlciBjbG9zZSBhbGwKLQlWZXJpZnkgYWN0aW9ucyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIHBlcnNwZWN0aXZlcyAoIG9uZSB3aXRoIGRpcnR5IAotCQllZGl0b3IsIG90aGVyIHdpdGhvdXQgKS4KLQlWZXJpZnkgYWZ0ZXIgYWxsIHBlcnNwZWN0aXZlcyBjbG9zZWQuCi0JT3BlbiBtYW55IGVkaXRvcnMsIGNsb3NlIGFsbCwgdGVzdCBNUlUgbGlzdC4KLQlPcGVuIGFuIGVkaXRvciBhbmQgdHJ5IHRvIHByaW50IHRoZSBjb250ZW50cy4KLQkKLUVkaXQgQWN0aW9ucyAuLgotCVZlcmlmeSBnbG9iYWwgYWN0aW9ucyB0cmFjayBnbG9iYWwgcGFydC4KLQlWZXJpZnkgZWRpdG9yIGNvbnRyaWJ1dGlvbnMgYXBwZWFyIGluIGFjdGlvbiBiYXJzIHdoZW4gaXMgb3BlbmVkLgotCVZlcmlmeSBlZGl0b3JzIG9mIHNhbWUgdHlwZSByZXVzZSBjb250cmlidXRpb25zLgotCVZlcmlmeSBlZGl0b3JzIG9mIGRpZmZlcmVudCB0eXBlIGNhdXNlIGNvbnRyaWJ1dGlvbiBjaGFuZ2UuCi0JVmVyaWZ5IGVkaXRvciBjb250cmlidXRpb25zIGFyZSByZW1vdmVkIHdoZW4gZWRpdG9yIGlzIGNsb3NlZC4KLQlWZXJpZnkgZWRpdCBhY3Rpb25zIGFyZSBjb25zaXN0ZW50IHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gcGVyc3BlY3RpdmVzLgotCi1QZXJzcGVjdGl2ZSBBY3Rpb25zIChvbiB0aGUgV2luZG93IG1lbnUpIC4uCi0JT3BlbiA9IGFsd2F5cyBlbmFibGVkCi0JVmVyaWZ5IG90aGVyIGFjdGlvbnMgb25seSBlbmFibGVkIHdoZW4gYSBwZXJzcGVjdGl2ZSBpcyBvcGVuLgotCVZlcmlmeSAib3BlbiBuZXcgd2luZG93IiwgIm9wZW4gcGVyc3BlY3RpdmUiCi0JVmVyaWZ5ICJTYXZlIEFzIiBieSBtb2RpZnlpbmcgY3VycmVudCBwZXJzcCwgc2F2ZSBhcywgY2xvc2UsIHJlb3Blbi4KLQlWZXJpZnkgIlJlc2V0IiBieSBtb2RpZnlpbmcgY3VycmVudCBwZXJzcCwgdGhlbiByZXNldC4KLQlUZXN0IFdvcmtiZW5jaC9QZXJzcGVjdGl2ZXMgcHJlZmVyZW5jZSBwYWdlLgotCi1UaGUgbmV4dCB0d28gaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgV2luZG93IG1lbnUgKGJ1ZyA2MzgyNyksIGJ1dCBjYW4KLXN0aWxsIGJlIHRlc3RlZCBieSBhc3NpZ25pbmcgYSBrZXkgYmluZGluZy4KLQlIaWRlIEVkaXRvcnMsIFNob3cgRWRpdG9ycwotCUhpZGUgRWRpdG9ycywgT3BlbiBuZXcgZWRpdG9yLCB2ZXJpZnkgaW1wbGljaXQgc2hvdyBlZGl0b3JzLgotCi1BY3Rpb24gU2V0cyAob24gV2luZG93IC0+IEN1c3RvbWl6ZSBQZXJzcGVjdGl2ZSAtPiBTaG9ydGN1dHMpIC4uCi0JQ29uZmlybSBvcmRlciBpcyBjb25zaXN0ZW50LiAgQWRkIGFsbCBhY3Rpb25zLCByZWNvcmQgb3JkZXIsIAotCQl0aGVuIHJlbW92ZSBhbmQgcmUtYWRkLiAgU2VsZWN0IGFjdGlvbiBzZXRzIHRvIHZlcmlmeSBvcmRlci4KLQlUZXN0IEN1c3RvbWl6YXRpb24gb2YgRmlsZSBOZXcsIFBlcnNwZWN0aXZlIE9wZW4sIGFuZCBTaG93IFZpZXcuCi0JQ29uZmlybSBlZGl0b3IgYWN0aW9ucyBoYXZlIGNvbnNpc3RlbnQgcGxhY2UgLi4KLQkJLSBzdGFydCB3aXRoIG5vIGVkaXRvcnMKLQkJLSBzaG93IHggYWN0aW9uIHNldHMKLQkJLSBvcGVuIGVkaXRvciwgdmVyaWZ5IGVkaXRvciBhY3Rpb25zIGFmdGVyIHNldHMKLQkJLSBoaWRlIHggYWN0aW9uIHNldHMKLQkJLSBzaG93IHggYWN0aW9uIHNldHMKLQlWZXJpZnkgYWN0aW9uIHNldCBvcmRlciBwZXJzaXN0ZWQgYmV0d2VlbiBzZXNzaW9ucy4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvV29ya2JlbmNoTGF5b3V0LnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBDb21wb25lbnQgVGVzdHMvV29ya2JlbmNoTGF5b3V0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmNjYwZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgQ29tcG9uZW50IFRlc3RzL1dvcmtiZW5jaExheW91dC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi1UaGlzIGlzIGEgdGVzdCBzY3JpcHQgZm9yIGxheW91dCBpbiB0aGUgd29ya2JlbmNoLgotCi1Gb2xkZXIgQ3JlYXRpb24gLi4KLQktIERuRCB2aWV3IG92ZXIgdmlldwotCS0gRG5EIHZpZXcgb3ZlciBmb2xkZXIKLQktIERuRCB2aWV3IG92ZXIgdmlldyBpbiBmbG9hdGluZyB3aW5kb3cKLQktIE5FRyBURVNUIC0gRG5EIHZpZXcgb3ZlciBlZGl0b3IgYXJlYS4gCi0JLSBEbkQgZWRpdG9yIG92ZXIgZWRpdG9yCi0JLSBEbkQgZWRpdG9yIG92ZXIgZWRpdG9yIGZvbGRlcgotCS0gTkVHIFRFU1QgLSBEbkQgZWRpdG9yIG92ZXIgdmlldyBhcmVhLiAgCi0KLUZvbGRlciBCcmVha2Rvd24gLi4KLQktIERuRCB2aWV3IG91dCBvZiBmb2xkZXIgd2l0aCAyCi0JLSBEbkQgdmlldyBvdXQgb2YgZm9sZGVyIHdpdGggMy4gIEZvbGRlciBzaG91bGQgcmVtYWluLgotCS0gRG5EIHZpZXcgb3V0IG9mIGZvbGRlciBpbiBmbG9hdGluZyB3aW5kb3cKLQktIERuRCBlZGl0b3Igb3V0IG9mIGVkaXRvciBmb2xkZXIgd2l0aCAyCi0JLSBEbkQgZWRpdG9yIG91dCBvZiBlZGl0b3IgZm9sZGVyIHdpdGggMy4gIEZvbGRlciBzaG91bGQgcmVtYWluCi0KLVJlbGF0aXZlIERyYWcgYW5kIERyb3AgLi4KLQktIERuRCB2aWV3IHRvIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCBvZiBhbm90aGVyIHZpZXcKLQktIERuRCB2aWV3IHRvIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCBvZiBmb2xkZXIKLQktIERuRCB2aWV3IHRvIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCBvZiBlZGl0b3IgYXJlYS4gCi0JLSBEbkQgZWRpdG9yIHdpdGhpbiBlZGl0b3IgYXJlYQotCi1EZXRhY2hlZCBXaW5kb3dzIC4uCi0JLSBEbkQgdmlldyBvdXQgb2Ygd2luZG93LCBvcGVuIGRldGFjaGVkIHdpbmRvdwotCS0gRG5EIHZpZXcgYmFjayBpbnRvIHdpbmRvdywgY2xvc2UgZGV0YWNoZWQgd2luZG93Ci0JLSBEbkQgc2Vjb25kIHZpZXcgb3ZlciBmbG9hdGluZyB3aW5kb3cgCi0JLSBEbkQgc2Vjb25kIHZpZXcgb3V0IG9mIGZsb2F0aW5nIHdpbmRvdyB0byBjcmVhdGUgc2Vjb25kIAotCQlkZXRhY2hlZCB3aW5kb3cKLQktIERuRCBzZWNvbmQgdmlldyBvdXQgb2YgZmxvYXRpbmcgd2luZG93IG9udG8gbWFpbi4gIAotCi1UYWIgSXRlbXMKLQktIHJlb3JkZXIgaXRlbXMgaW4gdmlldyBmb2xkZXIgYnkgZHJhZ2dpbmcgdGFicwotCS0gcmVvcmRlciBpdG1lcyBpbiBlZGl0b3IgZm9sZGVyIGJ5IGRyYWdnaW5nIHRhYnMKLQotRmFzdCBWaWV3cwotCS0gRG5EIHZpZXcgb3ZlciBzaG9ydGN1dCBiYXIuICBJdCBzaG91bGQgYmVjb21lIGZhc3QgdmlldwotCS0gT3BlbiBmYXN0IHZpZXcuICBVbnBpbi4gIEl0IHNob3VsZCByZXR1cm4gdG8gbGFzdCBwb3NpdGlvbiBpbiAKLQkJcm9vdCBsYXlvdXQuCi0KLVBhZ2UgU3dpdGNoCi0JLSBWZXJpZnkgbGF5b3V0IHBlcnNpc3RhbmNlIG9mIG1haW4gd2luZG93IHdoZW4gc3dpdGNoaW5nIHBhZ2VzCi0JLSBWZXJpZnkgbGF5b3V0IHBlcnNpc3RhbmNlIG9mIGRldGFjaGVkIHdpbmRvd3Mgd2hlbiBzd2l0Y2hpbmcgcGFnZXMKLQotWm9vbQotCS0gem9vbSAvIHVuem9vbSB2aWV3IGluIHJvb3QgbGF5b3V0Ci0JLSB6b29tIC8gdW56b29tIHZpZXcgaW4gZm9sZGVyLiAgVmVyaWZ5IGZvbGRlciBub3QgdmlzaWJsZQotCS0gem9vbSAvIHVuem9vbSBlZGl0b3IgaW4gc2luZ2xlIGZvbGRlci4gIFZlcmlmeSBubyBvdGhlciAKLQkJZWRpdG9ycyB2aXNpYmxlCi0JLSB6b29tIC8gdW56b29tIGVkaXRvciBpbiBtdWx0LWZvbGRlciBlZGl0b3IgYXJlYS4gIFZlcmlmeSBubyAKLQkJb3RoZXIgZWRpdG9ycyB2aXNpYmxlCi0JLSBORUcgVEVTVCAtIHpvb20gLyB1bnpvb20gdmlldyBpbiBkZXRhY2hlZCB3aW5kb3cuICBTaG91bGQgaGF2ZSAKLQkJbm8gZWZmZWN0Ci0KLVRoZSBmb2xsb3dpbmcgYWN0aW9ucyBzaG91bGQgbWFpbnRhaW4gem9vbQotCS0gU2hvdyBWaWV3ICggaWYgaXQgaXMgem9vbWVkIFZpZXcgKQotCS0gU2hvdyBWaWV3ICggaWYgdmlldyBpcyB2aXNpYmxlIGluIERldGFjaGVkIFdpbmRvdyApCi0JLSBzd2l0Y2ggdG8gYW5vdGhlciBwYWdlIGFuZCBiYWNrCi0JLSBjbGljayBvbiBhbnkgdmlzaWJsZSB2aWV3IG9yIGVkaXRvcgotCS0gU2hvdyAvIGhpZGUgZmFzdCB2aWV3Ci0KLVRoZSBmb2xsb3dpbmcgYWN0aW9ucyBzaG91bGQgY2F1c2UgdW56b29tCi0JLSBPcGVuIGVkaXRvcgotCS0gQ2xvc2UgZWRpdG9yCi0JLSBDbG9zZSBhbGwgZWRpdG9ycwotCS0gU2hvdyAvIEhpZGUgZWRpdG9yIGFyZWEKLQktIFNob3cgdmlldyAvIGVkaXRvciB3aGljaCBpcyBub3QgdmlzaWJsZQotCS0gQWN0aXZhdGUgdmlldyAvIGVkaXRvciB3aGljaCBpcyBub3QgdmlzaWJsZQotCS0gUmVzZXQgcGVyc3BlY3RpdmUKLQktIFNhdmUgcGVyc3BlY3RpdmUKLQktIENoYW5nZSBwZXJzcGVjdGl2ZQotCS0gRG5EIHpvb20gdmlldyBvdXQgb2YgbWFpbiB3aW5kb3cgdG8gZGV0YWNoZWQgd2luZG93Ci0JLSBEbkQgdmlldyBpbiBkZXRhY2hlZCB3aW5kb3cgb250byB6b29tIHZpZXcKLQotVGhlIGZvbGxvd2luZyBhY3Rpb25zIGNhdXNlIHVuem9vbSBub3csIGJ1dCBpdCB3b3VsZCBiZSBjb252ZW5pZW50IAotaWYgdGhleSBkaWRuJ3QgaW4gZnV0dXJlCi0JLSBDbG9zZSBkZXRhY2hlZCB2aWV3LgotCS0gQWxsIERuRAotCi1QZXJzaXN0YW5jZSBCZXR3ZWVuIFNlc3Npb25zCi0JLSBlbnN1cmUgbGF5b3V0IGlzIHBlcnNpc3RlZCBiZXR3ZWVuIHNlc3Npb25zCi0JLSBmYXN0IHZpZXdzCi0JLSB2aWV3IGxheW91dAotCS0gZGV0YWNoZWQgd2luZG93cwotCS0gb3BlbiBlZGl0b3JzCi0KLVBsYWNlaG9sZGVycwotCS0gRHJhZyB2aWV3IHRvIG5ldyBwb3NpdGlvbiwgY2xvc2UsIHJlb3Blbi4KLQktIERyYWcgdmlldyB0byBmb2xkZXIsIGNsb3NlLCByZW9wZW4uCi0JLSBEcmFnIHZpZXcgdG8gZGV0YWNoZWQsIGNsb3NlLCByZW9wZW4uCi0JLSBDbG9zZSBhbGwgdmlld3MgaW4gZm9sZGVyLCByZW9wZW4gb25lIGJ5IG9uZS4KLQktIE1ha2UgdmlldyBmYXN0LCByZXN0b3JlLgotCS0gTWFrZSBmb2xkZXIgZmFzdCwgcmVzdG9yZSB2aWV3cyBvbmUgYnkgb25lLgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL0Jvb2ttYXJrcyBWaWV3Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvQm9va21hcmtzIFZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5ODUwZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvQm9va21hcmtzIFZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+VGVzdCBTY2VuYXJpbzogQm9va21hcmtzIFZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMz4KLUJvb2ttYXJrcyBWaWV3PC9oMz4KLVB1cnBvc2U6IFRvIHRlc3QgdGhlIEJvb2ttYXJrIHZpZXcgaW4gRWNsaXBzZS4mbmJzcDsgV2Ugd2lsbCBvcGVuIHRoZSB2aWV3LAotYWRkIGEgbnVtYmVyIG9mIGJvb2ttYXJrcyB0byBzb21lIGZpbGVzLCBvcGVuIHRoZSBzb3VyY2UgZmlsZSBmb3IgZWFjaAotYm9va21hcmsgYW5kIHRoZW4gZGVsZXRlIHRob3NlIGJvb2ttYXJrcy4KLTxwPlNldHVwOgotPG9sPgotPGxpPgotSW5zdGFsbCBFY2xpcHNlIFBsYXRmb3JtLjwvbGk+Ci0KLTxsaT4KLUNyZWF0ZSBhIGphdmEgcHJvamVjdCBjb250YWluaW5nIHRocmVlIGphdmEgZmlsZXMgYW5kIGEgdGV4dCBmaWxlLjwvbGk+Ci08L29sPgotTWV0aG9kOgotPG9sPgotPGxpPgotU3RhcnQgdGhlIHdvcmtiZW5jaC48L2xpPgotCi08bGk+Ci1JbnZva2UgUGVyc3BlY3RpdmUgPiBTaG93IFZpZXcgPiBCb29rbWFya3MgYW5kIHZlcmlmeSB0aGF0IHRoZSBCb29rbWFya3MKLXZpZXcgYXBwZWFycy48L2xpPgotCi08bGk+Ci1TZWxlY3QgYSBqYXZhIGZpbGUgaW4gdGhlIG5hdmlnYXRvciBhbmQgaW52b2tlIEVkaXQgPiBBZGQgQm9va21hcmsuJm5ic3A7Ci1WZXJpZnkgdGhhdCBhIG5ldyBib29rbWFyayBhcHBlYXJzIGluIHRoZSBCb29rbWFya3MgdmlldyBmb3IgdGhlIHNlbGVjdGVkCi1qYXZhIGZpbGUuPC9saT4KLQotPGxpPgotRG91YmxlIGNsaWNrIHRoZSBib29rbWFyayBpbiB0aGUgYm9va21hcmtzIHZpZXcgYW5kIHZlcmlmeSB0aGF0IGFuIGVkaXRvcgotb3BlbnMgb24gdGhlIHNvdXJjZSBmaWxlLjwvbGk+Ci0KLTxsaT4KLVNlbGVjdCB0aGUgMTB0aCBsaW5lIG9mIHRleHQgaW4gdGhlIGVkaXRvciBhbmQgaW52b2tlIEFkZCBCb29rbWFyayBpbiB0aGUKLWNvbnRleHQgbWVudS4mbmJzcDsgQSBkaWFsb2cgc2hvdWxkIGFwcGVhciB3aGVyZSB5b3UgY2FuIHR5cGUgdGhlIGJvb2ttYXJrCi1sYWJlbC4mbmJzcDsgRW50ZXIgIkxpbmUgMTAiIGFuZCBwcmVzcyBPSy4mbmJzcDsgVmVyaWZ5IHRoYXQgYW5vdGhlciBib29rbWFyawotYXBwZWFycyBpbiB0aGUgQm9va21hcmtzIHZpZXcgd2l0aCB0aGUgbGFiZWwgIkxpbmUgMTAiLiZuYnNwOyBBIGJvb2ttYXJrCi1pY29uIHNob3VsZCBhbHNvIGFwcGVhciBpbiB0aGUgZWRpdG9yIHRvIHRoZSBsZWZ0IG9mIGxpbmUgMTAuPC9saT4KLQotPGxpPgotQ2xvc2UgdGhlIGVkaXRvci48L2xpPgotCi08bGk+Ci1TZWxlY3QgIkxpbmUgMTAiIGluIHRoZSBib29rbWFya3MgdmlldyBhbmQgcHJlc3MgdGhlICJHbyB0byBGaWxlIiBidXR0b24KLWluIHRoZSB0b29sYmFyLiZuYnNwOyBWZXJpZnkgdGhhdCBhbiBlZGl0b3Igb3BlbnMgb24gdGhlIHNvdXJjZSBmaWxlIGFuZAotdGhhdCBsaW5lIDEwIGlzIHNlbGVjdGVkLjwvbGk+Ci0KLTxsaT4KLVJpZ2h0IGNsaWNrIG9uIHRoZSBib29rbWFyayBpY29uIGluIHRoZSBlZGl0b3IgYW5kIGludm9rZSAiUmVtb3ZlIEJvb2ttYXJrIi4mbmJzcDsKLVZlcmlmeSB0aGF0IHRoZSBib29rbWFyayBkaXNhcHBlYXJzIGluIHRoZSBlZGl0b3IgYW5kIHRoZSBib29rbWFya3Mgdmlldy48L2xpPgotCi08bGk+Ci1JbiB0aGUgbmF2aWdhdG9yIHNlbGVjdCBhbGwgdGhyZWUgamF2YSBmaWxlcywgdmVyaWZ5IHRoYXQgIkFkZCBCb29rbWFyayIKLWlzIGVuYWJsZWQsIGFuZCB0aGVuIGludm9rZSBpdC4mbmJzcDsgVmVyaWZ5IHRoYXQgMyBib29rbWFya3MgYXJlIGFwcGVhcgotaW4gdGhlIGJvb2ttYXJrcyB2aWV3LjwvbGk+Ci0KLTxsaT4KLVNlbGVjdCBhIHByb2plY3QsIGZvbGRlciwgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHByb2plY3QgfCBmb2xkZXIgd2l0aCBmaWxlLiZuYnNwOwotVmVyaWZ5IHRoYXQgIkFkZCBCb29rbWFyayBpcyBkaXNhYmxlZC48L2xpPgotCi08bGk+Ci1HbyB0byB0aGUgYm9va21hcmtzIHZpZXcgYW5kIGludm9rZSAiU2VsZWN0IEFsbCIgZnJvbSB0aGUgY29udGV4dCBtZW51LiZuYnNwOwotVmVyaWZ5IHRoYXQgZXZlcnl0aGluZyBpcyBzZWxlY3RlZC48L2xpPgotCi08bGk+Ci1UaGVuIHByZXNzICJSZXR1cm4iIGluIHRoZSBib29rbWFya3MgdmlldyBhbmQgdmVyaWZ5IHRoYXQgYWxsIG9mIHRoZSBib29rbWFya3MKLWFyZSBvcGVuZWQgaW4gZWRpdG9ycy48L2xpPgotCi08bGk+Ci1JbnZva2UgIkRlbGV0ZSIgaW4gdGhlIGJvb2ttYXJrcyB2aWV3IGFuZCB2ZXJpZnkgdGhhdCBhbGwgYm9va21hcmtzIGFyZQotZGVsZXRlZC48L2xpPgotPC9vbD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL0NvbW1vbiBOYXZpZ2F0b3IgUmVzb3VyY2UgVmlldy5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL0NvbW1vbiBOYXZpZ2F0b3IgUmVzb3VyY2UgVmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODg4ODc4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9Db21tb24gTmF2aWdhdG9yIFJlc291cmNlIFZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlRlc3QgU2NlbmFyaW86IENvbW1vbiBOYXZpZ2F0b3IgUmVzb3VyY2UgVmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz4KLUNvbW1vbiBOYXZpZ2F0b3IgUmVzb3VyY2UgVmlldzwvaDM+Ci1QdXJwb3NlOiBUbyB0ZXN0IHRoZSBDb21tb24gTmF2aWdhdG9yIFJlc291cmNlIHZpZXcgaW4gRWNsaXBzZS4mbmJzcDsgV2Ugd2lsbCBzdGFydCBvdXQKLXdpdGggYW4gZW1wdHkgd29ya3NwYWNlLCBjcmVhdGUgc29tZSBwcm9qZWN0cyBhbmQgZmlsZXMsIG9wZW4gZmlsZXMsIG9wZW4KLXNvbWUgbmV3IHBlcnNwZWN0aXZlcywgZGVsZXRlIHNvbWUgZmlsZXMsIHRlc3QgdGhlIGZpbHRlcmluZyBhbmQgc29ydGluZwotb3B0aW9ucywgYW5kIHRlc3QgdGhlIHBlcnNpc3RhbmNlIG9mIHZpZXcgc3RhdGUgYmV0d2VlbiBzZXNzaW9ucy4gVGhlIENvbW1vbgotTmF2aWdhdG9yIFJlc291cmNlIHZpZXcgdGVzdHMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgTmF2aWdhdG9yIFZpZXcgdGVzdHMuIFRoZSBmb2xsb3dpbmcKLXRlc3QgcGxhbiBpcyBhIHRyaW1tZWQgZG93biB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IFJlc291cmNlIHZpZXcgdGVzdCBwbGFuLiAKLTxwPlNldHVwOgotPG9sPgotPGxpPgotSW5zdGFsbCBFY2xpcHNlIFBsYXRmb3JtLjwvbGk+Ci0KLTxsaT4KLURlbGV0ZSB0aGUgbWV0YWRhdGEgZm9yIG9yZy5lY2xpcHNlLnVpLjwvbGk+Ci08L29sPgotTWV0aG9kOgotPG9sPgotPGxpPgotU3RhcnQgdGhlIHdvcmtiZW5jaC4mbmJzcDsgQ29uZmlybSB0aGF0IHRoZSBkZWZhdWx0IHBlcnNwZWN0aXZlIChSZXNvdXJjZSkKLWFuZCB3ZWxjb21lIGVkaXRvciBib3RoIGFwcGVhci48L2xpPgotCi0KLTxsaT4KLU9wZW4gdGhlIENvbW1vbiBOYXZpZ2F0b3IgUmVzb3VyY2UgVmlldyAoV2luZG93PlNob3cgVmlldz5CYXNpYz5FeHBlcmltZW50YWwgUmVzb3VyY2UgTmF2aWdhdG9yKTwvbGk+Ci0KLTxsaT4KLUNyZWF0ZSBhIHByb2plY3QgdXNpbmcgdGhlIEZpbGUgPiBOZXcgd2l6YXJkIGFuZCB2ZXJpZnkgdGhhdCBpdCBhcHBlYXJzCi1pbiB0aGUgbmF2aWdhdG9yLjwvbGk+Ci0KLTxsaT4KLUNyZWF0ZSBhbm90aGVyIHByb2plY3QgYnkgaW52b2tpbmcgTmV3ID4gUHJvamVjdCBmcm9tIHRoZSBuYXZpZ2F0b3IgcG9wdXAKLW1lbnUuJm5ic3A7IFZlcmlmeSB0aGF0IGl0IGFwcGVhcnMgaW4gdGhlIG5hdmlnYXRvci48L2xpPgotCi08bGk+Ci1DcmVhdGUgYSAudHh0IGZpbGUsIGEgLmh0bWwgZmlsZSwgYW5kIGEgLmphdmEgZmlsZSBieSBpbnZva2luZyBOZXcgPiBGaWxlCi1mcm9tIHRoZSBuYXZpZ2F0b3IgcG9wdXAgbWVudS4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlc2UgZmlsZXMgYXBwZWFyIGluCi10aGUgbmF2aWdhdG9yIGFuZCB0aGF0IGFuIGVkaXRvciBpcyBvcGVuZWQgb24gZWFjaC4mbmJzcDsgQ2xvc2UgYWxsIG9mCi10aGVzZSBlZGl0b3JzLjwvbGk+Ci08IS0tICBOb3QgeWV0IHN1cHBvcnRlZCAKLTxsaT4KLUluIHRoZSBOYXZpZ2F0b3IgeW91IGNhbiBjaGFuZ2UgdGhlIGlucHV0LiZuYnNwOyBUbyB0ZXN0IHRoaXMgY3JlYXRlIGEKLWNvdXBsZSBvZiBuZXN0ZWQgZm9sZGVycyBpbiBhIHByb2plY3QgdXNpbmcgdGhlIE5ldyA+IEZvbGRlciBhY3Rpb24gaW4KLXRoZSBuYXZpZ2F0b3IgY29udGV4dCBtZW51LiZuYnNwOyBUaGVuIHNlbGVjdCB0aGUgdG9wIGxldmVsIGZvbGRlciBhbmQKLWFuZCBpbnZva2UgR28gSW50by4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlIGlucHV0IGZvciB0aGUgdmlldyBjaGFuZ2VzIChpdAotaXMgc2hvd24gaW4gdGhlIHZpZXcgdGl0bGUpIGFuZCB0aGF0IG9ubHkgdGhlIHJlc291cmNlcyBpbiB0aGUgaW5wdXQgZm9sZGVyCi1hcmUgdmlzaWJsZS4mbmJzcDsgSWYgeW91IHBlcmZvcm0gdGhlIHNhbWUgb3BlcmF0aW9uIG1hbnkgdGltZXMgeW91IGNyZWF0ZQotYSBoaXN0b3J5IGxpc3QgaW4gdGhlIG5hdmlnYXRvci4mbmJzcDsgVHJ5IG5hdmlnYXRpbmcgdXAgYW5kIGRvd24gdGhlIGhpc3RvcnkKLWJ5IHVzaW5nIHRoZSBCYWNrIGFuZCBGb3J3YXJkIGJ1dHRvbnMgb24gdGhlIHZpZXcgdG9vbGJhci48L2xpPgotIC0tPgotPGxpPgotSWYgeW91IHNlbGVjdCBhIGZpbGUgeW91IGNhbiBvcGVuIGl0IGZyb20gdGhlIGNvbnRleHQgbWVudS4mbmJzcDsgT3BlbgotYSAudHh0IGZpbGUgYW5kIHZlcmlmeSB0aGF0IHRoZSBkZWZhdWx0IHRleHQgZWRpdG9yIG9wZW5zLiZuYnNwOyBPcGVuIGEKLS5qYXZhIGZpbGUgYW5kIHZlcmlmeSB0aGF0IHRoZSBqYXZhIGVkaXRvciBvcGVucy48L2xpPgotCi08bGk+Ci1Zb3UgY2FuIGFsc28gb3BlbiBhIGZpbGUgaW4gYSBzcGVjaWZpYyBlZGl0b3IuJm5ic3A7IFNlbGVjdCBhIC5qYXZhIGZpbGUKLWFuZCBpbnZva2UgT3BlbiBXaXRoID4gRGVmYXVsdCBUZXh0IEVkaXRvci4mbmJzcDsgVGhlIGRlZmF1bHQgdGV4dCBlZGl0b3IKLXNob3VsZCBvcGVuIHJhdGhlciB0aGFuIHRoZSBqYXZhIGVkaXRvci4mbmJzcDsgSWYgeW91IHNlbGVjdCBPcGVuIFdpdGgKLT4gU3lzdGVtIEVkaXRvciBzb21ldGhpbmcgbGlrZSBub3RlcGFkIHNob3VsZCBvcGVuLiZuYnNwOyBUaGUgcHJlZmVycmVkCi1lZGl0b3IgZm9yIGEgZmlsZSBpcyBhbHdheXMgaW5kaWNhdGVkIHdpdGggYSBjaGVjayBtYXJrIGluIHRoZSBPcGVuIFdpdGgKLW1lbnUuPC9saT4KLTwhLS0gIE5vdCB5ZXQgc3VwcG9ydGVkIAotPGxpPgotSW4gdGhlIG5hdmlnYXRvciB5b3UgY2FuIG9wZW4gbmV3IHBlcnNwZWN0aXZlcy4mbmJzcDsgU2VsZWN0IGEgcHJvamVjdAotb3IgZm9sZGVyIGluIHRoZSBuYXZpZ2F0b3IgYW5kIGludm9rZSBPcGVuIFBlcnNwZWN0aXZlID4gSmF2YSBmcm9tIHRoZQotY29udGV4dCBtZW51LiBWZXJpZnkgdGhhdCBhIG5ldyBwZXJzcGVjdGl2ZSBhcHBlYXJzIHdpdGggdGhlIEphdmEgUGVyc3BlY3RpdmUKLWFuZCB0aGF0IHRoZSBpbnB1dCBmb3IgdGhlIG5hdmlnYXRvciBpcyB0aGUgcHJvamVjdC4mbmJzcDsmbmJzcDsmbmJzcDsKLUNsb3NlIGl0IGFuZCBnbyBiYWNrIHRvIHRoZSBmaXJzdCBwZXJzcGVjdGl2ZS48L2xpPgotLS0+Ci08IS0tICBOb3QgeWV0IHN1cHBvcnRlZCAKLTxsaT4KLVRoZSBjb250ZW50cyBvZiB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBtZW51IGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBwZXJzcGVjdGl2ZQotcHJvcGVydGllcy4mbmJzcDsgTm90ZSB0aGUgY29udGVudHMgb2YgdGhpcyBtZW51LiZuYnNwOyBUaGVuIGludm9rZSBQZXJzcGVjdGl2ZQotPiBDdXN0b21pemUgYW5kIGNoYW5nZSB0aGUgY2hlY2tlZCBwZXJzcGVjdGl2ZXMuJm5ic3A7IFByZXNzIE9LIGFuZCB2ZXJpZnkKLXRoYXQgdGhlIGNvbnRlbnRzIG9mIE9wZW4gUGVyc3BlY3RpdmUgcmVmbGVjdCB0aGUgbmV3IG9wdGlvbnMuPC9saT4KLS0tPgotPCEtLSAgTm90IHlldCBzdXBwb3J0ZWQgCi08bGk+Ci1UaGUgTmF2aWdhdG9yIGhhcyBzdXBwb3J0IGZvciBkcmFnIGFuZCBkcm9wLiZuYnNwOyBUcnkgZHJhZ2dpbmcgYSBmaWxlCi1mcm9tIG9uZSBwcm9qZWN0IHRvIGFub3RoZXIuJm5ic3A7IEEgY3Vyc29yIHNob3VsZCBhcHBlYXIgdG8gaW5kaWNhdGUgdGhlCi1kcm9wIHRhcmdldC4mbmJzcDsgSWYgeW91IHJlbGVhc2UgdGhlIGZpbGUgaXQgd2lsbCBiZSBtb3ZlZCB0byB0aGUgdGFyZ2V0LjwvbGk+Ci0tLT4KLTwhLS0gIE5vdCB5ZXQgc3VwcG9ydGVkIAotPGxpPgotSW4gdGhlIG5hdmlnYXRvciBzZWxlY3QgYSBwcm9qZWN0LCBmb2xkZXIgb3IgZmlsZSBhbmQgdHJ5IG91dCBDb3B5LCBNb3ZlCi1hbmQgUmVuYW1lIGluIHRoZSBjb250ZXh0IG1lbnUuPC9saT4KLS0tPgotPCEtLSAgTm90IHlldCBzdXBwb3J0ZWQgCi08bGk+Ci1TZWxlY3QgYSBwcm9qZWN0LCBmb2xkZXIgb3IgZmlsZSBhbmQgaW52b2tlIERlbGV0ZSBpbiB0aGUgY29udGV4dCBtZW51Ci10byBkZWxldGUgaXQuJm5ic3A7IFZlcmlmeSB0aGF0IHRoZSBpdGVtIGRpc2FwcGVhcnMgZnJvbSB0aGUgbmF2aWdhdG9yLiZuYnNwOwotVGhlIGRlbGV0ZSBhY3Rpb24gaXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIHdpbmRvdyBFZGl0IG1lbnUuJm5ic3A7IFNlbGVjdAotYW4gaXRlbSwgaW52b2tlIEVkaXQgPiBEZWxldGUsIGFuZCB2ZXJpZnkgdGhhdCBpdCBoYXMgdGhlIHNhbWUgYmVoYXZpb3IuPC9saT4KLS0tPgotPCEtLSAgTm90IHlldCBzdXBwb3J0ZWQgCi08bGk+Ci1TZWxlY3QgYSBmaWxlIGluIHRoZSBuYXZpZ2F0b3IgYW5kIGludm9rZSBBZGQgQm9va21hcmsgZnJvbSB0aGUgY29udGV4dAotbWVudS4mbmJzcDsgT3BlbiB1cCB0aGUgQm9va21hcmsgdmlldyBhbmQgdmVyaWZ5IHRoYXQgYSBib29rbWFyayBub3cgZXhpc3RzLiZuYnNwOwotSWYgeW91IGRvdWJsZSBjbGljayBvbiB0aGUgYm9va21hcmsgYW4gZWRpdG9yIHNob3VsZCBvcGVuIG9uIHRoZSBib29rbWFyawotc291cmNlIGZpbGUuJm5ic3A7IFZlcmlmeSB0aGF0IEFkZCBCb29rbWFyayBpcyBub3QgYXZhaWxhYmxlIGlmIGEgcHJvamVjdAotb3IgZm9sZGVyIGlzIHNlbGVjdGVkIGluIHRoZSBuYXZpZ2F0b3IuPC9saT4KLS0tPgotPCEtLSAgTm90IHlldCBzdXBwb3J0ZWQgCi08bGk+Ci1TZWxlY3QgYSBwcm9qZWN0IGFuZCBpbnZva2UgQ2xvc2UgUHJvamVjdCBmcm9tIHRoZSBjb250ZXh0IG1lbnUuJm5ic3A7Ci1BdCB0aGlzIHBvaW50IHRoZSBpY29uIHNob3VsZCBjaGFuZ2UgdG8gYSBjbG9zZWQgZm9sZGVyIGFuZCBhbGwgb2YgdGhlCi1jb250ZW50cyB3aWxsIGJlIGhpZGRlbi4mbmJzcDsgSW52b2tlIE9wZW4gUHJvamVjdCB0byByZW9wZW4gaXQgYW5kIG5hdmlnYXRlCi10aGUgY29udGVudHMuPC9saT4KLS0tPgotPCEtLSAgTm90IHlldCBzdXBwb3J0ZWQgCi08bGk+Ci1JZiB5b3Ugc2VsZWN0IGEgcmVzb3VyY2UgYW5kIGludm9rZSBQcm9wZXJ0aWVzLi4gYSBwcm9wZXJ0aWVzIGRpYWxvZyBzaG91bGQKLWFwcGVhci4mbmJzcDsgSXQgd2lsbCBjb250YWluIGF0IGxlYXN0IGFuIEluZm8sIFByb2plY3QgUmVmZXJlbmVzIGFuZCBUZWFtCi1wYWdlIGZvciBwcm9qZWN0cywgYW5kIGFuIEluZm8gYW5kIFRlYW0gcGFnZSBmb3IgZm9sZGVycyBvciBmaWxlcy48L2xpPgotLS0+Ci08IS0tICBOb3QgeWV0IHN1cHBvcnRlZCAKLTxsaT4KLUluIHRoZSBuYXZpZ2F0b3IgeW91IGNhbiBzb3J0IGl0ZW1zIGJ5IG5hbWUgb3IgdHlwZS4mbmJzcDsgVHJ5IG91dCB0aGVzZQotb3B0aW9ucyBpbiB0aGUgcHVsbGRvd24gbWVudSBhbmQgdmVyaWZ5IHRoYXQgdGhleSBoYXZlIHRoZSBjb3JyZWN0IGFmZmVjdC4mbmJzcDsKLUFsbCBzb3J0aW5nIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyLiZuYnNwOyBZb3UgY2FuIGFsc28gZmlsdGVyIGl0ZW1zCi1vdXQuJm5ic3A7IENyZWF0ZSBhIGNvdXBsZSBvZiAuY2xhc3MgYW5kIC4qIGZpbGVzIGFuZCBleHBlcmltZW50IHdpdGggdGhlCi1maWx0ZXIgb3B0aW9ucy4mbmJzcDsgWW91IHNob3VsZCBiZSBhYmxlIHRvIGhpZGUgb3Igc2hvdyB0aGVzZSBmaWxlcyBhcwotZGVzaXJlZC48L2xpPgotLS0+Ci08IS0tICBOb3QgeWV0IHN1cHBvcnRlZCAKLTxsaT4KLVRoZSBzZWxlY3Rpb24gaW4gdGhlIG5hdmlnYXRvciBpcyBsaW5rZWQgdG8gdGhlIGFjdGl2ZSBlZGl0b3IuJm5ic3A7IE9wZW4KLWEgY291cGxlIG9mIGZpbGVzLiZuYnNwOyBUaGVuIHN3aXRjaCBiZXR3ZWVuIHRoZSBlZGl0b3JzIGFuZCB2ZXJpZnkgdGhhdAotdGhlIGVkaXRvciBpbnB1dCBpcyBzZWxlY3RlZCBpbiB0aGUgbmF2aWdhdG9yLiZuYnNwOyBOb3cgc2VsZWN0IG9uZSBvZgotdGhlIG9wZW4gZmlsZXMgaW4gdGhlIG5hdmlnYXRvciBhbmQgdmVyaWZ5IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgZWRpdG9yCi1pcyBhY3RpdmF0ZWQuJm5ic3A7IFlvdSBjYW4gZGlzYWJsZSB0aGlzIG9wdGlvbiBieSB0dXJuaW5nIG9mZiAiTGluayBuYXZpZ2F0b3IKLXNlbGVjdGlvbiB0byBhY3RpdmUgZWRpdG9yIiBpbiB0aGUgd29ya2JlbmNoIHByZWZlcmVuY2VzLiZuYnNwOyBUaGVuIHZlcmlmeQotdGhhdCBubyBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZSBuYXZpZ2F0b3IgYXMgeW91IHN3aXRjaCBiZXR3ZWVuIGVkaXRvcnMuJm5ic3A7Ci1UdXJuIGl0IGJhY2sgb24gYW5kIHZlcmlmeSB0aGF0IHNlbGVjdGlvbiB3b3JrcyBhZ2Fpbi48L2xpPgotLS0+Ci08IS0tICBOb3QgeWV0IHN1cHBvcnRlZCAKLTxsaT4KLVRoZSBzdGF0ZSBvZiB0aGUgbmF2aWdhdG9yIChpbnB1dCwgZXhwYW5zaW9uKSBzaG91bGQgYmUgc3RvcmVkIGJldHdlZW4KLXNlc3Npb25zLiZuYnNwOyBUbyB0ZXN0IHRoaXMgb3BlbiBhIHBlcnNwZWN0aXZlIHdpdGggdGhlIG5hdmlnYXRvciwgY2hhbmdlCi10aGUgaW5wdXQgYW5kIGV4cGFuc2lvbnMgc3RhdGUsIGFuZCB0aGVuIGNsb3NlIHRoZSB3b3JrYmVuY2guJm5ic3A7IFJlc3RhcnQKLXRoZSB3b3JrYmVuY2ggYW5kIHZlcmlmeSB0aGF0IHRoZSBpbnB1dCBhbmQgZXhwYW5zaW9uIHN0YXRlIGlzIHJlc3RvcmVkLjwvbGk+Ci0tLT4KLQotPC9vbD4KLQotPGgzPkNvbW1vbiBOYXZpZ2F0b3IgVGVzdCBWaWV3ZXIgPC9oMz4KLTxvbD4KLTxsaT5DcmVhdGUgYSBmaWxlIG5hbWVkICdtb2RlbC5wcm9wZXJ0aWVzJyBpbiB0aGUgcm9vdCBvZiBhIHByb2plY3QuIEFkZCAKLXRoZSBmb2xsb3dpbmcgZW50cmllcyB0byB0aGUgZmlsZToKLTxwcmU+Ci1yb290PVBhcmVudAotUGFyZW50PUNoaWxkMSxDaGlsZDIsQ2hpbGQzCi1DaGlsZDE9R3JhbmRjaGlsZDEsR3JhbmRjaGlsZDIKLUNoaWxkMj1HcmFuZGNoaWxkMwotPC9wcmU+Ci08L2xpPgotCi08bGk+QWZ0ZXIgY3JlYXRpbmcgdGhlIGZpbGUsIG9wZW4gdGhlICdUZXN0IE5hdmlnYXRvciBWaWV3ZXInIAotKFNob3cgVmlldz5PdGhlcj5UZXN0IE5hdmlnYXRvciBWaWV3KS48L2xpPgotCi08bGk+RXhwYW5kIHRoZSBwcm9qZWN0IGluIHRlc3Qgdmlld2VyLiBWZXJpZnkgdGhhdCBpbiBhZGRpdGlvbiB0byAKLXRoZSByZXNvdXJjZXMsIGEgbG9naWNhbCBtb2RlbCBtYXRjaGluZyB0aGUgc3RydWN0dXJlIGZyb20gdGhlIHByb3BlcnRpZXMKLWZpbGUgaXMgcHJlc2VudGVkLiBWZXJpZnkgdGhhdCBlYWNoIGl0ZW0gaGFzIHRoZSBjb3JyZWN0IGxhYmVsICgnUGFyZW50JywgCi0nQ2hpbGQxJywgZXRjKSBhbmQgdGhlIGNvcnJlY3QgaWNvbiAoZWFjaCBlbGVtZW50IHNob3VsZCBoYXZlIHRoZSBzaGFyZWQKLSdlbGVtZW50JyBpY29uIGZyb20gdGhlIHdvcmtiZW5jaCkuPC9saT4KLQotPGxpPlZlcmlmeSB0aGF0IG5vIGNvbnRleHQgbWVudSBhcHBlYXJzIHdoZW4gYSBsb2dpY2FsIG5vZGUgaXMgc2VsZWN0ZWQuPC9saT4KLQotPGxpPkRlYWN0aXZhdGV0aGUgJ1Rlc3QgTmF2aWdhdG9yIEV4dGVuc2lvbicgYnkgb3BlbmluZyB0aGUgRmlsdGVycyBkaWFsb2csIGdvaW5nCi10byB0aGUgJ1R5cGVzIG9mIENvbnRlbnQnIHRhYiwgYW5kIHVuY2hlY2tpbmcgdGhlICdUZXN0IE5hdmlnYXRvciBFeHRlbnNpb24nCi1pdGVtLiBWZXJpZnkgdGhhdCB0aGUgbG9naWNhbCBtb2RlbCBlbGVtZW50cyBkaXNhcHBlYXIgZnJvbSB0aGUgdHJlZS48L2xpPgotCi08bGk+UmVhY3RpdmF0ZXRoZSAnVGVzdCBOYXZpZ2F0b3IgRXh0ZW5zaW9uJyBieSBvcGVuaW5nIHRoZSBGaWx0ZXJzIGRpYWxvZywgZ29pbmcKLXRvIHRoZSAnVHlwZXMgb2YgQ29udGVudCcgdGFiLCBhbmQgY2hlY2tpbmcgdGhlICdUZXN0IE5hdmlnYXRvciBFeHRlbnNpb24nCi1pdGVtLiBWZXJpZnkgdGhhdCB0aGUgbG9naWNhbCBtb2RlbCBlbGVtZW50cyByZWFwcGVhciBmcm9tIHRoZSB0cmVlLjwvbGk+ICAKLQotPGxpPkRlYWN0aXZhdGV0aGUgJ1Jlc291cmNlcyBleHRlbnNpb24nLiBWZXJpZnkgdGhhdCB0aGUgdHJlZSBiZWNvbWVzIGVtcHR5LjwvbGk+Ci0KLTwvb2w+Ci0KLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvRmlsZSBTeXN0ZW0gRXhwb3J0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvRmlsZSBTeXN0ZW0gRXhwb3J0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMzAxMTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL0ZpbGUgU3lzdGVtIEV4cG9ydC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iT1RJIEVtcGxveWVlIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5GaWxlIFN5c3RlbSBFeHBvcnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxjZW50ZXI+Ci08aDE+Ci1GaWxlIFN5c3RlbSBFeHBvcnQ8L2gxPjwvY2VudGVyPgotCi08aDI+Ci1QdXJwb3NlPC9oMj4KLVRoZSBwbGFuIGlzIHRvIGV4cG9ydCBhIHByb2plY3Qgd2l0aCBhIGxhcmdlIG51bWJlciBmaWxlcy9mb2xkZXJzIGF0IGEKLXRpbWUsIHVzaW5nIHRoZSBmaWxlIHN5c3RlbSB3aXphcmQuIFRoZSByZXN1bHRzIHNob3VsZCBiZSBpbmRlbnRpY2FsIGluCi1sYXlvdXQgYW5kIGNvbnRlbnQgYXMgdGhlIG9yaWdpbmFsIHByb2plY3QgdXNlZC4KLTxoMj4KLVNldHVwPC9oMj4KLQotPHVsPgotPGxpPgotRG93bmxvYWQgdGhlIEpVbml0IHppcCBmaWxlIHNvdXJjZSBjb2RlIGZyb20gd3d3Lmp1bml0Lm9yZy48L2xpPgotCi08bGk+Ci1TdGFydCB0aGUgRWNsaXBzZSB3b3JrYmVuY2g8L2xpPgotCi08bGk+Ci1DcmVhdGUgYSBuZXcgdGVtcG9yYXJ5ICJzaW1wbGUiIHByb2plY3QgY2FsbGVkICJKVW5pdCBUZXN0IjwvbGk+Ci0KLTxsaT4KLUltcG9ydCB0aGUgSlVuaXQgemlwIGZpbGUgaW50byB0aGUgcHJvamVjdDwvbGk+Ci0KLTxsaT4KLVNlbGVjdCBGaWxlIC0+IEV4cG9ydCwgc2VsZWN0IEZpbGUgU3lzdGVtIGFuZCBwcmVzcyBOZXh0LjwvbGk+Ci08L3VsPgotCi08aDI+Ci1FeHBvcnQgZnJvbSBhIHByb2plY3QgdG8gYSBuZXcgZGlyZWN0b3J5PC9oMj4KLQotPG9sPgotPGxpPgotU2VsZWN0IHRoZSAiSlVuaXQgVGVzdCIgcHJvamVjdCBhbmQgbWFyayBpdCBhcyBjaGVja2VkLjwvbGk+Ci0KLTxsaT4KLUluIHRoZSBEaXJlY3RvcnkgZmllbGQsIHR5cGUgaW4gdGhlIGRpcmVjdG9yeSB0byBleHBvcnQgdG8uPC9saT4KLQotPGxpPgotUHJlc3MgRmluaXNoPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlIGNvbnRlbnRzIG9uIHRoZSBmaWxlIHN5c3RlbSBtYXRjaCB0aGUgc2FtZSBmaWxlIGFuZCBmb2xkZXIKLXN0cnVjdHVyZSBhcyB0aGUgc291cmNlIHByb2plY3Q8L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGVzLjwvbGk+Ci08L29sPgotCi08aDI+Ci1FeHBvcnQgZnJvbSBhIHByb2plY3QgdG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5PC9oMj4KLQotPG9sPgotPGxpPgotU2VsZWN0IHRoZSAiSlVuaXQgVGVzdCIgcHJvamVjdCBhbmQgbWFyayBpdCBhcyBjaGVja2VkLjwvbGk+Ci0KLTxsaT4KLUluIHRoZSBEaXJlY3RvcnkgZmllbGQsIHR5cGUgaW4gdGhlIGRpcmVjdG9yeSB0byBleHBvcnQgdG8uPC9saT4KLQotPGxpPgotQ2hlY2sgdGhlIG9wdGlvbiAiT3ZlcndyaXRlIGV4aXN0aW5nIHJlc291cmNlcyB3aXRob3V0IHdhcm5pbmciPC9saT4KLQotPGxpPgotUHJlc3MgRmluaXNoPC9saT4KLQotPGxpPgotVmVyaWZ5IHlvdSB3ZXJlIG5vdCBwcm9tcHRlZCB0byBvdmVyd3JpdGUgZmlsZXM8L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgY29udGVudHMgb24gdGhlIGZpbGUgc3lzdGVtIG1hdGNoIHRoZSBzYW1lIGZpbGUgYW5kIGZvbGRlcgotc3RydWN0dXJlIGFzIHRoZSBzb3VyY2UgcHJvamVjdC48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGVzLjwvbGk+Ci08L29sPgotCi08aDI+Ci1DbGVhbnVwPC9oMj4KLQotPHVsPgotPGxpPgotRGVsZXRlIHRoZSB0ZW1wb3JhcnkgcHJvamVjdCAiSlVuaXQgVGVzdCI8L2xpPgotPC91bD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL0ZpbGUgU3lzdGVtIEltcG9ydC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL0ZpbGUgU3lzdGVtIEltcG9ydC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDBmMTc0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9GaWxlIFN5c3RlbSBJbXBvcnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJPVEkgRW1wbG95ZWUiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzUgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPkZpbGUgU3lzdGVtIEltcG9ydDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGNlbnRlcj4KLTxoMT4KLUZpbGUgU3lzdGVtIEltcG9ydDwvaDE+PC9jZW50ZXI+Ci0KLTxoMj4KLVB1cnBvc2U8L2gyPgotVGhlIHBsYW4gaXMgdG8gaW1wb3J0IGEgbGFyZ2UgbnVtYmVyIGZpbGVzL2ZvbGRlcnMgYXQgYSB0aW1lLCB1c2luZyB0aGUKLWZpbGUgc3lzdGVtIHdpemFyZC4gVGhlIHJlc3VsdHMgc2hvdWxkIGJlIGluZGVudGljYWwgaW4gbGF5b3V0IGFuZCBjb250ZW50Ci1hcyB0aGUgb3JpZ2luYWwgc291cmNlIHVzZWQuCi08aDI+Ci1TZXR1cDwvaDI+Ci0KLTx1bD4KLTxsaT4KLURvd25sb2FkIHRoZSBKVW5pdCBzb3VyY2UgY29kZSBmcm9tIHd3dy5qdW5pdC5vcmcgYW5kIGV4dHJhY3QgdGhlIGNvbnRlbnRzCi1pbnRvIGEgZm9sZGVyIGluIHRoZSBmaWxlIHN5c3RlbS48L2xpPgotCi08bGk+Ci1TdGFydCB0aGUgRWNsaXBzZSB3b3JrYmVuY2g8L2xpPgotCi08bGk+Ci1DcmVhdGUgYSBuZXcgdGVtcG9yYXJ5ICJzaW1wbGUiIHByb2plY3QgY2FsbGVkICJKVW5pdCBUZXN0IjwvbGk+Ci0KLTxsaT4KLVNlbGVjdCBGaWxlIC0+IEltcG9ydCwgc2VsZWN0IEZpbGUgU3lzdGVtIGFuZCBwcmVzcyBOZXh0LjwvbGk+Ci08L3VsPgotCi08aDI+Ci1JbXBvcnQgaW50byBhbiBlbXB0eSBwcm9qZWN0PC9oMj4KLQotPG9sPgotPGxpPgotQ2xpY2sgdGhlIEJyb3dzZSBidXR0b24gYW5kIHNlbGVjdCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBzb3VyY2UgZmlsZXMKLWFyZSBsb2NhdGVkLjwvbGk+Ci0KLTxsaT4KLUV4cGFuZCB0aGUgZm9sZGVycyBpbiB0aGUgdHJlZSB2aWV3IGFuZCB1bnRpbCAianVuaXQiIGZvbGRlciBpcyB2aXNpYmxlCi1hbmQgY2hlY2sgbWFyayB0aGUgYm94IG5leHQgdG8gaXQ8L2xpPgotCi08bGk+Ci1UeXBlIGluICJKVW5pdCBUZXN0IiBpbiB0aGUgRm9sZGVyIGZpZWxkPC9saT4KLQotPGxpPgotUHJlc3MgRmluaXNoPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9qZWN0IG1hdGNoIHRoZSBzYW1lIGZpbGUgYW5kIGZvbGRlcgotc3RydWN0dXJlIGFzIHRoZSBzb3VyY2UgaW4gdGhlIGZpbGUgc3lzdGVtLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSBmaWxlcy48L2xpPgotPC9vbD4KLQotPGgyPgotSW1wb3J0IGludG8gYSBwcm9qZWN0IHdpdGggc2FtZSBjb250ZW50cyAob3ZlcndyaXRlKTwvaDI+Ci0KLTxvbD4KLTxsaT4KLUNsaWNrIG9uIHRoZSBEaXJlY3RvcnkgZHJvcCBkb3duIGJveCBhbmQgc2VsZWN0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlCi1zb3VyY2UgZmlsZXMgYXJlIGxvY2F0ZWQ8L2xpPgotCi08bGk+Ci1FeHBhbmQgdGhlIGZvbGRlcnMgaW4gdGhlIHRyZWUgdmlldyBhbmQgdW50aWwgImp1bml0IiBmb2xkZXIgaXMgdmlzaWJsZQotYW5kIGNoZWNrIG1hcmsgdGhlIGJveCBuZXh0IHRvIGl0PC9saT4KLQotPGxpPgotVHlwZSBpbiAiSlVuaXQgVGVzdCIgaW4gdGhlIEZvbGRlciBmaWVsZDwvbGk+Ci0KLTxsaT4KLUNoZWNrIHRoZSBvcHRpb24gIk92ZXJ3cml0ZSBleGlzdGluZyByZXNvdXJjZXMgd2l0aG91dCB3YXJuaW5nIjwvbGk+Ci0KLTxsaT4KLVByZXNzIEZpbmlzaDwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB5b3Ugd2VyZSBub3QgcHJvbXB0ZWQgdG8gb3ZlcndyaXRlIGZpbGVzPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9qZWN0IG1hdGNoIHRoZSBzYW1lIGZpbGUgYW5kIGZvbGRlcgotc3RydWN0dXJlIGFzIHRoZSBzb3VyY2UgaW4gdGhlIGZpbGUgc3lzdGVtLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSBmaWxlcy48L2xpPgotPC9vbD4KLQotPGgyPgotQ2xlYW51cDwvaDI+Ci0KLTx1bD4KLTxsaT4KLURlbGV0ZSB0aGUgdGVtcG9yYXJ5IHByb2plY3QgIkpVbml0IFRlc3QiPC9saT4KLTwvdWw+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9OYXZpZ2F0b3IgVmlldy5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL05hdmlnYXRvciBWaWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MGViNjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL05hdmlnYXRvciBWaWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5UZXN0IFNjZW5hcmlvOiBOYXZpZ2F0b3IgVmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz4KLU5hdmlnYXRvciBWaWV3PC9oMz4KLVB1cnBvc2U6IFRvIHRlc3QgdGhlIE5hdmlnYXRvciB2aWV3IGluIEVjbGlwc2UuJm5ic3A7IFdlIHdpbGwgc3RhcnQgb3V0Ci13aXRoIGFuIGVtcHR5IHdvcmtzcGFjZSwgY3JlYXRlIHNvbWUgcHJvamVjdHMgYW5kIGZpbGVzLCBvcGVuIGZpbGVzLCBvcGVuCi1zb21lIG5ldyBwZXJzcGVjdGl2ZXMsIGRlbGV0ZSBzb21lIGZpbGVzLCB0ZXN0IHRoZSBmaWx0ZXJpbmcgYW5kIHNvcnRpbmcKLW9wdGlvbnMsIGFuZCB0ZXN0IHRoZSBwZXJzaXN0YW5jZSBvZiB2aWV3IHN0YXRlIGJldHdlZW4gc2Vzc2lvbnMuCi08cD5TZXR1cDoKLTxvbD4KLTxsaT4KLUluc3RhbGwgRWNsaXBzZSBQbGF0Zm9ybS48L2xpPgotCi08bGk+Ci1EZWxldGUgdGhlIG1ldGFkYXRhIGZvciBvcmcuZWNsaXBzZS51aS48L2xpPgotPC9vbD4KLU1ldGhvZDoKLTxvbD4KLTxsaT4KLVN0YXJ0IHRoZSB3b3JrYmVuY2guJm5ic3A7IENvbmZpcm0gdGhhdCB0aGUgZGVmYXVsdCBwZXJzcGVjdGl2ZSAoUmVzb3VyY2UpCi1hbmQgd2VsY29tZSBlZGl0b3IgYm90aCBhcHBlYXIuPC9saT4KLQotPGxpPgotQ3JlYXRlIGEgcHJvamVjdCB1c2luZyB0aGUgRmlsZSA+IE5ldyB3aXphcmQgYW5kIHZlcmlmeSB0aGF0IGl0IGFwcGVhcnMKLWluIHRoZSBuYXZpZ2F0b3IuPC9saT4KLQotPGxpPgotQ3JlYXRlIGFub3RoZXIgcHJvamVjdCBieSBpbnZva2luZyBOZXcgPiBQcm9qZWN0IGZyb20gdGhlIG5hdmlnYXRvciBwb3B1cAotbWVudS4mbmJzcDsgVmVyaWZ5IHRoYXQgaXQgYXBwZWFycyBpbiB0aGUgbmF2aWdhdG9yLjwvbGk+Ci0KLTxsaT4KLUNyZWF0ZSBhIC50eHQgZmlsZSwgYSAuaHRtbCBmaWxlLCBhbmQgYSAuamF2YSBmaWxlIGJ5IGludm9raW5nIE5ldyA+IEZpbGUKLWZyb20gdGhlIG5hdmlnYXRvciBwb3B1cCBtZW51LiZuYnNwOyBWZXJpZnkgdGhhdCB0aGVzZSBmaWxlcyBhcHBlYXIgaW4KLXRoZSBuYXZpZ2F0b3IgYW5kIHRoYXQgYW4gZWRpdG9yIGlzIG9wZW5lZCBvbiBlYWNoLiZuYnNwOyBDbG9zZSBhbGwgb2YKLXRoZXNlIGVkaXRvcnMuPC9saT4KLQotPGxpPgotSW4gdGhlIE5hdmlnYXRvciB5b3UgY2FuIGNoYW5nZSB0aGUgaW5wdXQuJm5ic3A7IFRvIHRlc3QgdGhpcyBjcmVhdGUgYQotY291cGxlIG9mIG5lc3RlZCBmb2xkZXJzIGluIGEgcHJvamVjdCB1c2luZyB0aGUgTmV3ID4gRm9sZGVyIGFjdGlvbiBpbgotdGhlIG5hdmlnYXRvciBjb250ZXh0IG1lbnUuJm5ic3A7IFRoZW4gc2VsZWN0IHRoZSB0b3AgbGV2ZWwgZm9sZGVyIGFuZAotYW5kIGludm9rZSBHbyBJbnRvLiZuYnNwOyBWZXJpZnkgdGhhdCB0aGUgaW5wdXQgZm9yIHRoZSB2aWV3IGNoYW5nZXMgKGl0Ci1pcyBzaG93biBpbiB0aGUgdmlldyB0aXRsZSkgYW5kIHRoYXQgb25seSB0aGUgcmVzb3VyY2VzIGluIHRoZSBpbnB1dCBmb2xkZXIKLWFyZSB2aXNpYmxlLiZuYnNwOyBJZiB5b3UgcGVyZm9ybSB0aGUgc2FtZSBvcGVyYXRpb24gbWFueSB0aW1lcyB5b3UgY3JlYXRlCi1hIGhpc3RvcnkgbGlzdCBpbiB0aGUgbmF2aWdhdG9yLiZuYnNwOyBUcnkgbmF2aWdhdGluZyB1cCBhbmQgZG93biB0aGUgaGlzdG9yeQotYnkgdXNpbmcgdGhlIEJhY2sgYW5kIEZvcndhcmQgYnV0dG9ucyBvbiB0aGUgdmlldyB0b29sYmFyLjwvbGk+Ci0KLTxsaT4KLUlmIHlvdSBzZWxlY3QgYSBmaWxlIHlvdSBjYW4gb3BlbiBpdCBmcm9tIHRoZSBjb250ZXh0IG1lbnUuJm5ic3A7IE9wZW4KLWEgLnR4dCBmaWxlIGFuZCB2ZXJpZnkgdGhhdCB0aGUgZGVmYXVsdCB0ZXh0IGVkaXRvciBvcGVucy4mbmJzcDsgT3BlbiBhCi0uamF2YSBmaWxlIGFuZCB2ZXJpZnkgdGhhdCB0aGUgamF2YSBlZGl0b3Igb3BlbnMuPC9saT4KLQotPGxpPgotWW91IGNhbiBhbHNvIG9wZW4gYSBmaWxlIGluIGEgc3BlY2lmaWMgZWRpdG9yLiZuYnNwOyBTZWxlY3QgYSAuamF2YSBmaWxlCi1hbmQgaW52b2tlIE9wZW4gV2l0aCA+IERlZmF1bHQgVGV4dCBFZGl0b3IuJm5ic3A7IFRoZSBkZWZhdWx0IHRleHQgZWRpdG9yCi1zaG91bGQgb3BlbiByYXRoZXIgdGhhbiB0aGUgamF2YSBlZGl0b3IuJm5ic3A7IElmIHlvdSBzZWxlY3QgT3BlbiBXaXRoCi0+IFN5c3RlbSBFZGl0b3Igc29tZXRoaW5nIGxpa2Ugbm90ZXBhZCBzaG91bGQgb3Blbi4mbmJzcDsgVGhlIHByZWZlcnJlZAotZWRpdG9yIGZvciBhIGZpbGUgaXMgYWx3YXlzIGluZGljYXRlZCB3aXRoIGEgY2hlY2sgbWFyayBpbiB0aGUgT3BlbiBXaXRoCi1tZW51LjwvbGk+Ci0KLTxsaT4KLUluIHRoZSBuYXZpZ2F0b3IgeW91IGNhbiBvcGVuIG5ldyBwZXJzcGVjdGl2ZXMuJm5ic3A7IFNlbGVjdCBhIHByb2plY3QKLW9yIGZvbGRlciBpbiB0aGUgbmF2aWdhdG9yIGFuZCBpbnZva2UgT3BlbiBQZXJzcGVjdGl2ZSA+IEphdmEgZnJvbSB0aGUKLWNvbnRleHQgbWVudS4gVmVyaWZ5IHRoYXQgYSBuZXcgcGVyc3BlY3RpdmUgYXBwZWFycyB3aXRoIHRoZSBKYXZhIFBlcnNwZWN0aXZlCi1hbmQgdGhhdCB0aGUgaW5wdXQgZm9yIHRoZSBuYXZpZ2F0b3IgaXMgdGhlIHByb2plY3QuJm5ic3A7Jm5ic3A7Jm5ic3A7Ci1DbG9zZSBpdCBhbmQgZ28gYmFjayB0byB0aGUgZmlyc3QgcGVyc3BlY3RpdmUuPC9saT4KLQotPGxpPgotVGhlIGNvbnRlbnRzIG9mIHRoZSBPcGVuIFBlcnNwZWN0aXZlIG1lbnUgYXJlIGRldGVybWluZWQgYnkgdGhlIHBlcnNwZWN0aXZlCi1wcm9wZXJ0aWVzLiZuYnNwOyBOb3RlIHRoZSBjb250ZW50cyBvZiB0aGlzIG1lbnUuJm5ic3A7IFRoZW4gaW52b2tlIFBlcnNwZWN0aXZlCi0+IEN1c3RvbWl6ZSBhbmQgY2hhbmdlIHRoZSBjaGVja2VkIHBlcnNwZWN0aXZlcy4mbmJzcDsgUHJlc3MgT0sgYW5kIHZlcmlmeQotdGhhdCB0aGUgY29udGVudHMgb2YgT3BlbiBQZXJzcGVjdGl2ZSByZWZsZWN0IHRoZSBuZXcgb3B0aW9ucy48L2xpPgotCi08bGk+Ci1UaGUgTmF2aWdhdG9yIGhhcyBzdXBwb3J0IGZvciBkcmFnIGFuZCBkcm9wLiZuYnNwOyBUcnkgZHJhZ2dpbmcgYSBmaWxlCi1mcm9tIG9uZSBwcm9qZWN0IHRvIGFub3RoZXIuJm5ic3A7IEEgY3Vyc29yIHNob3VsZCBhcHBlYXIgdG8gaW5kaWNhdGUgdGhlCi1kcm9wIHRhcmdldC4mbmJzcDsgSWYgeW91IHJlbGVhc2UgdGhlIGZpbGUgaXQgd2lsbCBiZSBtb3ZlZCB0byB0aGUgdGFyZ2V0LjwvbGk+Ci0KLTxsaT4KLUluIHRoZSBuYXZpZ2F0b3Igc2VsZWN0IGEgcHJvamVjdCwgZm9sZGVyIG9yIGZpbGUgYW5kIHRyeSBvdXQgQ29weSwgTW92ZQotYW5kIFJlbmFtZSBpbiB0aGUgY29udGV4dCBtZW51LjwvbGk+Ci0KLTxsaT4KLVNlbGVjdCBhIHByb2plY3QsIGZvbGRlciBvciBmaWxlIGFuZCBpbnZva2UgRGVsZXRlIGluIHRoZSBjb250ZXh0IG1lbnUKLXRvIGRlbGV0ZSBpdC4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlIGl0ZW0gZGlzYXBwZWFycyBmcm9tIHRoZSBuYXZpZ2F0b3IuJm5ic3A7Ci1UaGUgZGVsZXRlIGFjdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgd2luZG93IEVkaXQgbWVudS4mbmJzcDsgU2VsZWN0Ci1hbiBpdGVtLCBpbnZva2UgRWRpdCA+IERlbGV0ZSwgYW5kIHZlcmlmeSB0aGF0IGl0IGhhcyB0aGUgc2FtZSBiZWhhdmlvci48L2xpPgotCi08bGk+Ci1TZWxlY3QgYSBmaWxlIGluIHRoZSBuYXZpZ2F0b3IgYW5kIGludm9rZSBBZGQgQm9va21hcmsgZnJvbSB0aGUgY29udGV4dAotbWVudS4mbmJzcDsgT3BlbiB1cCB0aGUgQm9va21hcmsgdmlldyBhbmQgdmVyaWZ5IHRoYXQgYSBib29rbWFyayBub3cgZXhpc3RzLiZuYnNwOwotSWYgeW91IGRvdWJsZSBjbGljayBvbiB0aGUgYm9va21hcmsgYW4gZWRpdG9yIHNob3VsZCBvcGVuIG9uIHRoZSBib29rbWFyawotc291cmNlIGZpbGUuJm5ic3A7IFZlcmlmeSB0aGF0IEFkZCBCb29rbWFyayBpcyBub3QgYXZhaWxhYmxlIGlmIGEgcHJvamVjdAotb3IgZm9sZGVyIGlzIHNlbGVjdGVkIGluIHRoZSBuYXZpZ2F0b3IuPC9saT4KLQotPGxpPgotU2VsZWN0IGEgcHJvamVjdCBhbmQgaW52b2tlIENsb3NlIFByb2plY3QgZnJvbSB0aGUgY29udGV4dCBtZW51LiZuYnNwOwotQXQgdGhpcyBwb2ludCB0aGUgaWNvbiBzaG91bGQgY2hhbmdlIHRvIGEgY2xvc2VkIGZvbGRlciBhbmQgYWxsIG9mIHRoZQotY29udGVudHMgd2lsbCBiZSBoaWRkZW4uJm5ic3A7IEludm9rZSBPcGVuIFByb2plY3QgdG8gcmVvcGVuIGl0IGFuZCBuYXZpZ2F0ZQotdGhlIGNvbnRlbnRzLjwvbGk+Ci0KLTxsaT4KLUlmIHlvdSBzZWxlY3QgYSByZXNvdXJjZSBhbmQgaW52b2tlIFByb3BlcnRpZXMuLiBhIHByb3BlcnRpZXMgZGlhbG9nIHNob3VsZAotYXBwZWFyLiZuYnNwOyBJdCB3aWxsIGNvbnRhaW4gYXQgbGVhc3QgYW4gSW5mbywgUHJvamVjdCBSZWZlcmVuZXMgYW5kIFRlYW0KLXBhZ2UgZm9yIHByb2plY3RzLCBhbmQgYW4gSW5mbyBhbmQgVGVhbSBwYWdlIGZvciBmb2xkZXJzIG9yIGZpbGVzLjwvbGk+Ci0KLTxsaT4KLUluIHRoZSBuYXZpZ2F0b3IgeW91IGNhbiBzb3J0IGl0ZW1zIGJ5IG5hbWUgb3IgdHlwZS4mbmJzcDsgVHJ5IG91dCB0aGVzZQotb3B0aW9ucyBpbiB0aGUgcHVsbGRvd24gbWVudSBhbmQgdmVyaWZ5IHRoYXQgdGhleSBoYXZlIHRoZSBjb3JyZWN0IGFmZmVjdC4mbmJzcDsKLUFsbCBzb3J0aW5nIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyLiZuYnNwOyBZb3UgY2FuIGFsc28gZmlsdGVyIGl0ZW1zCi1vdXQuJm5ic3A7IENyZWF0ZSBhIGNvdXBsZSBvZiAuY2xhc3MgYW5kIC4qIGZpbGVzIGFuZCBleHBlcmltZW50IHdpdGggdGhlCi1maWx0ZXIgb3B0aW9ucy4mbmJzcDsgWW91IHNob3VsZCBiZSBhYmxlIHRvIGhpZGUgb3Igc2hvdyB0aGVzZSBmaWxlcyBhcwotZGVzaXJlZC48L2xpPgotCi08bGk+Ci1UaGUgc2VsZWN0aW9uIGluIHRoZSBuYXZpZ2F0b3IgaXMgbGlua2VkIHRvIHRoZSBhY3RpdmUgZWRpdG9yLiZuYnNwOyBPcGVuCi1hIGNvdXBsZSBvZiBmaWxlcy4mbmJzcDsgVGhlbiBzd2l0Y2ggYmV0d2VlbiB0aGUgZWRpdG9ycyBhbmQgdmVyaWZ5IHRoYXQKLXRoZSBlZGl0b3IgaW5wdXQgaXMgc2VsZWN0ZWQgaW4gdGhlIG5hdmlnYXRvci4mbmJzcDsgTm93IHNlbGVjdCBvbmUgb2YKLXRoZSBvcGVuIGZpbGVzIGluIHRoZSBuYXZpZ2F0b3IgYW5kIHZlcmlmeSB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGVkaXRvcgotaXMgYWN0aXZhdGVkLiZuYnNwOyBZb3UgY2FuIGRpc2FibGUgdGhpcyBvcHRpb24gYnkgdHVybmluZyBvZmYgIkxpbmsgbmF2aWdhdG9yCi1zZWxlY3Rpb24gdG8gYWN0aXZlIGVkaXRvciIgaW4gdGhlIHdvcmtiZW5jaCBwcmVmZXJlbmNlcy4mbmJzcDsgVGhlbiB2ZXJpZnkKLXRoYXQgbm8gc2VsZWN0aW9uIG9jY3VycyBpbiB0aGUgbmF2aWdhdG9yIGFzIHlvdSBzd2l0Y2ggYmV0d2VlbiBlZGl0b3JzLiZuYnNwOwotVHVybiBpdCBiYWNrIG9uIGFuZCB2ZXJpZnkgdGhhdCBzZWxlY3Rpb24gd29ya3MgYWdhaW4uPC9saT4KLQotPGxpPgotVGhlIHN0YXRlIG9mIHRoZSBuYXZpZ2F0b3IgKGlucHV0LCBleHBhbnNpb24pIHNob3VsZCBiZSBzdG9yZWQgYmV0d2Vlbgotc2Vzc2lvbnMuJm5ic3A7IFRvIHRlc3QgdGhpcyBvcGVuIGEgcGVyc3BlY3RpdmUgd2l0aCB0aGUgbmF2aWdhdG9yLCBjaGFuZ2UKLXRoZSBpbnB1dCBhbmQgZXhwYW5zaW9ucyBzdGF0ZSwgYW5kIHRoZW4gY2xvc2UgdGhlIHdvcmtiZW5jaC4mbmJzcDsgUmVzdGFydAotdGhlIHdvcmtiZW5jaCBhbmQgdmVyaWZ5IHRoYXQgdGhlIGlucHV0IGFuZCBleHBhbnNpb24gc3RhdGUgaXMgcmVzdG9yZWQuPC9saT4KLTwvb2w+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9OZXcgRmlsZSBXaXphcmQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9OZXcgRmlsZSBXaXphcmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxMTg0MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvTmV3IEZpbGUgV2l6YXJkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJPVEkgRW1wbG95ZWUiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzUgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPk5ldyBGaWxlIFdpemFyZDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGNlbnRlcj4KLTxoMT4KLU5ldyBGaWxlIFdpemFyZDwvaDE+PC9jZW50ZXI+Ci0KLTxoMj4KLVB1cnBvc2U8L2gyPgotVGhlIHBsYW4gaXMgdG8gY3JlYXRlIGEgc2luZ2xlIGVtcHR5IGZpbGUuIFRoZSBlbmQgcmVzdWx0IG9mIHRoaXMgd2l6YXJkCi1zaG91bGQgYmUgYW4gZW1wdHkgZmlsZSBvcGVuZWQgaW4gdGhlIHByb3BlciBlZGl0b3IgZm9yIGl0cyB0eXBlLgotPGgyPgotU2V0dXA8L2gyPgotCi08dWw+Ci08bGk+Ci1TdGFydCB0aGUgRWNsaXBzZSB3b3JrYmVuY2g8L2xpPgotCi08bGk+Ci1DcmVhdGUgYSB0ZW1wb3JhcnkgcHJvamVjdCBjYWxsZWQgIkZpbGUgVGVzdCI8L2xpPgotCi08bGk+Ci1TZWxlY3QgRmlsZS0+TmV3LT5GaWxlIGZyb20gdGhlIHJlc291cmNlIHBlcnNwZWN0aXZlPC9saT4KLTwvdWw+Ci0KLTxoMj4KLUNyZWF0ZSBmaWxlIGF0IHByb2plY3Qgcm9vdDwvaDI+Ci0KLTxvbD4KLTxsaT4KLVNlbGVjdCB0aGUgcHJvamVjdCBGaWxlIFRlc3Q8L2xpPgotCi08bGk+Ci1JbiB0aGUgRmlsZSBOYW1lIGZpZWxkLCB0eXBlIGluIGYxLnR4dDwvbGk+Ci0KLTxsaT4KLVByZXNzIHRoZSBGaW5pc2ggYnV0dG9uPC9saT4KLQotPGxpPgotVmVyaWZ5IGEgbmV3IGYxLnR4dCBmaWxlIGlzIGNyZWF0ZWQgdW5kZXIgdGhlIEZpbGUgVGVzdCBwcm9qZWN0IChpbiBuYXZpZ2F0b3IKLXZpZXcgYW5kIGluIHRoZSBmaWxlIHN5c3RlbSk8L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhlIGRlZmF1bHQgdGV4dCBlZGl0b3Igb3BlbmVkIG9uIGYxLnR4dDwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGUgY29udGVudCBvZiBmMS50eHQgaXMgZW1wdHk8L2xpPgotPC9vbD4KLQotPGgyPgotQ3JlYXRlIGZpbGUgaW4gbmV3IGZvbGRlcjwvaDI+Ci0KLTxvbD4KLTxsaT4KLUluIHRoZSAiRW50ZXIgb3Igc2VsZWN0IHRoZSBmb2xkZXIiIGZpZWxkLCB0eXBlIGluIEZpbGUgVGVzdC9mb2xkZXI8L2xpPgotCi08bGk+Ci1JbiB0aGUgRmlsZSBOYW1lIGZpZWxkLCB0eXBlIGluIGYxLnR4dDwvbGk+Ci0KLTxsaT4KLVByZXNzIHRoZSBGaW5pc2ggYnV0dG9uPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgImZvbGRlciIgd2FzIGNyZWF0ZWQgdW5kZXIgdGhlIEZpbGUgVGVzdCBwcm9qZWN0IChpbiBuYXZpZ2F0b3IKLXZpZXcgYW5kIGluIHRoZSBmaWxlIHN5c3RlbSk8L2xpPgotCi08bGk+Ci1WZXJpZnkgYSBuZXcgZjEudHh0IGZpbGUgaXMgY3JlYXRlZCB1bmRlciAiZm9sZGVyIiAoaW4gbmF2aWdhdG9yIHZpZXcgYW5kCi1pbiB0aGUgZmlsZSBzeXN0ZW0pPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoZSBkZWZhdWx0IHRleHQgZWRpdG9yIG9wZW5lZCBvbiBmMS50eHQ8L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhlIGNvbnRlbnQgb2YgZjEudHh0IGlzIGVtcHR5PC9saT4KLTwvb2w+Ci0KLTxoMj4KLUNsZWFudXA8L2gyPgotCi08dWw+Ci08bGk+Ci1EZWxldGUgdGhlIHRlbXBvcmFyeSBwcm9qZWN0ICJGaWxlIFRlc3QiPC9saT4KLTwvdWw+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9OZXcgRm9sZGVyIFdpemFyZC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL05ldyBGb2xkZXIgV2l6YXJkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzI2MDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL05ldyBGb2xkZXIgV2l6YXJkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJPVEkgRW1wbG95ZWUiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzUgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPk5ldyBGb2xkZXIgV2l6YXJkPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08Y2VudGVyPgotPGgxPgotTmV3IEZvbGRlciBXaXphcmQ8L2gxPjwvY2VudGVyPgotCi08aDI+Ci1QdXJwb3NlPC9oMj4KLVRoZSBwbGFuIGlzIHRvIGNyZWF0ZSBhIHNpbmdsZSBlbXB0eSBmb2xkZXIuIFRoZSBlbmQgcmVzdWx0IG9mIHRoaXMgd2l6YXJkCi1zaG91bGQgYmUgYW4gZW1wdHkgZm9sZGVyLgotPGgyPgotU2V0dXA8L2gyPgotCi08dWw+Ci08bGk+Ci1TdGFydCB0aGUgRWNsaXBzZSB3b3JrYmVuY2g8L2xpPgotCi08bGk+Ci1DcmVhdGUgYSB0ZW1wb3JhcnkgcHJvamVjdCBjYWxsZWQgIkZvbGRlciBUZXN0IjwvbGk+Ci0KLTxsaT4KLVNlbGVjdCBGaWxlLT5OZXctPkZvbGRlciBmcm9tIHRoZSByZXNvdXJjZSBwZXJzcGVjdGl2ZTwvbGk+Ci08L3VsPgotCi08aDI+Ci1DcmVhdGUgZm9sZGVyIGF0IHByb2plY3Qgcm9vdDwvaDI+Ci0KLTxvbD4KLTxsaT4KLVNlbGVjdCB0aGUgcHJvamVjdCBGb2xkZXIgVGVzdDwvbGk+Ci0KLTxsaT4KLUluIHRoZSBGb2xkZXIgTmFtZSBmaWVsZCwgdHlwZSBpbiBmMTwvbGk+Ci0KLTxsaT4KLVByZXNzIHRoZSBGaW5pc2ggYnV0dG9uPC9saT4KLQotPGxpPgotVmVyaWZ5IGEgbmV3IGYxIGZvbGRlciBpcyBjcmVhdGVkIHVuZGVyIHRoZSBGb2xkZXIgVGVzdCBwcm9qZWN0IChpbiBuYXZpZ2F0b3IKLXZpZXcgYW5kIGluIHRoZSBmaWxlIHN5c3RlbSk8L2xpPgotPC9vbD4KLQotPGgyPgotQ2xlYW51cDwvaDI+Ci0KLTx1bD4KLTxsaT4KLURlbGV0ZSB0aGUgdGVtcG9yYXJ5IHByb2plY3QgIkZvbGRlciBUZXN0IjwvbGk+Ci08L3VsPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvTmV3IFByb2plY3QgV2l6YXJkLmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvTmV3IFByb2plY3QgV2l6YXJkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNDZhYmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL05ldyBQcm9qZWN0IFdpemFyZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iT1RJIEVtcGxveWVlIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5OZXcgUHJvamVjdCBXaXphcmQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxjZW50ZXI+Ci08aDE+Ci1OZXcgUHJvamVjdCBXaXphcmQ8L2gxPjwvY2VudGVyPgotCi08aDI+Ci1QdXJwb3NlPC9oMj4KLVRoZSBwbGFuIGlzIHRvIGNyZWF0ZSBhIHNpbmdsZSBlbXB0eSBwcm9qZWN0LiBUaGUgZW5kIHJlc3VsdCBvZiB0aGlzIHdpemFyZAotc2hvdWxkIGJlIGFuIGVtcHR5IHByb2plY3QuCi08aDI+Ci1TZXR1cDwvaDI+Ci0KLTx1bD4KLTxsaT4KLVN0YXJ0IHRoZSBFY2xpcHNlIHdvcmtiZW5jaDwvbGk+Ci0KLTxsaT4KLUV4dHJhY3QgdGhlIGp1bml0LmphciBmaWxlIGludG8gYSBkaXJlY3Rvcnkgb24gdGhlIGZpbGUgc3lzdGVtPC9saT4KLQotPGxpPgotU2VsZWN0IEZpbGUtPk5ldy0+UHJvamVjdCBmcm9tIHRoZSByZXNvdXJjZSBwZXJzcGVjdGl2ZTwvbGk+Ci0KLTxsaT4KLVNlbGVjdCBTaW1wbGUgYW5kIHRoZW4gUHJvamVjdCBhbmQgUHJlc3MgTmV4dDwvbGk+Ci08L3VsPgotCi08aDI+Ci1DcmVhdGUgcHJvamVjdCBhdCBkZWZhdWx0IGxvY2F0aW9uPC9oMj4KLQotPG9sPgotPGxpPgotSW4gUHJvamVjdCBOYW1lIGZpZWxkLCB0eXBlIGluIFByb2plY3QgVGVzdDwvbGk+Ci0KLTxsaT4KLVByZXNzIE5leHQgYW5kIHNlbGVjdCBhbm90aGVyIHByb2plY3QgYXMgYSByZWZlcmVuY2UgcHJvamVjdDwvbGk+Ci0KLTxsaT4KLVByZXNzIHRoZSBGaW5pc2ggYnV0dG9uPC9saT4KLQotPGxpPgotVmVyaWZ5IGEgbmV3IFByb2plY3QgVGVzdCBwcm9qZWN0IGlzIGNyZWF0ZWQgKGluIG5hdmlnYXRvciB2aWV3IGFuZCBpbgotdGhlIGZpbGUgc3lzdGVtKTwvbGk+Ci0KLTxsaT4KLVZlcmlmeSwgaW4gdGhlIHByb2plY3QncyBwcm9wZXJ0aWVzIGRpYWxvZywgdGhhdCB0aGUgUHJvamVjdCBSZWZlcmVuY2VzCi1wYWdlIGluY2x1ZGVzIHRoZSBwcm9qZWN0IHJlZmVyZW5jZWQuPC9saT4KLTwvb2w+Ci0KLTxoMj4KLUNyZWF0ZSBwcm9qZWN0IGF0IHNwZWNpZmljIGxvY2F0aW9uPC9oMj4KLQotPG9sPgotPGxpPgotSW4gUHJvamVjdCBOYW1lIGZpZWxkLCB0eXBlIGluIFByb2plY3QgVGVzdDI8L2xpPgotCi08bGk+Ci1VbmNoZWNrIHRoZSBVc2UgRGVmYXVsdCBMb2NhdGlvbiBvcHRpb248L2xpPgotCi08bGk+Ci1JbiB0aGUgTG9jYXRpb24gZmllbGQsIHR5cGUgaW4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBqdW5pdCBzb3VyY2UKLWNvZGUuPC9saT4KLQotPGxpPgotUHJlc3MgdGhlIEZpbmlzaCBidXR0b248L2xpPgotCi08bGk+Ci1WZXJpZnkgYSBuZXcgUHJvamVjdCBUZXN0MiBwcm9qZWN0IGlzIGNyZWF0ZWQgKGluIG5hdmlnYXRvciB2aWV3KTwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGUgY29udGVudHMgb2YgdGhlIHByb2plY3QgbWF0Y2ggdGhlIGZpbGVzL2ZvbGRlcnMgZm9yIGp1bml0IG9uCi10aGUgZmlsZSBzeXN0ZW08L2xpPgotPC9vbD4KLQotPGgyPgotQ2xlYW51cDwvaDI+Ci0KLTx1bD4KLTxsaT4KLURlbGV0ZSBwcm9qZWN0cyBQcm9qZWN0IFRlc3QgYW5kIFByb2plY3QgVGVzdDI8L2xpPgotPC91bD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL091dGxpbmUgVmlldy5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL091dGxpbmUgVmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2FhMGI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9PdXRsaW5lIFZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+VGVzdCBTY2VuYXJpbzogT3V0bGluZSBWaWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDM+Ci1PdXRsaW5lIFZpZXc8L2gzPgotUHVycG9zZTogVG8gdGVzdCB0aGUgT3V0bGluZSB2aWV3IGluIEVjbGlwc2UuJm5ic3A7IFRoZSBPdXRsaW5lIHZpZXcgaXMKLWp1c3QgYSBjb250YWluZXIgZm9yIHRoZSBwYWdlcyBjb250cmlidXRlZCBieSBvcGVuIGVkaXRvcnMuJm5ic3A7IFRoZXJlZm9yZSwKLXRoaXMgdGVzdCB3aWxsIGZvY3VzIG9uIHRoZSBjcmVhdGlvbiwgc2hvdywgYW5kIGNsb3N1cmUgb2YgdGhvc2UgcGFnZXMuCi08cD5TZXR1cDoKLTxvbD4KLTxsaT4KLUluc3RhbGwgRWNsaXBzZSBQbGF0Zm9ybS48L2xpPgotCi08bGk+Ci1DcmVhdGUgYSBqYXZhIHByb2plY3QgY29udGFpbmluZyB0aHJlZSBqYXZhIGZpbGVzIGFuZCBhIHRleHQgZmlsZS48L2xpPgotPC9vbD4KLU1ldGhvZDoKLTxvbD4KLTxsaT4KLVN0YXJ0IHRoZSB3b3JrYmVuY2guPC9saT4KLQotPGxpPgotSWYgYW55IGVkaXRvciBpcyBvcGVuIGNsb3NlIGl0LjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZSBPdXRsaW5lIHZpZXcgaXMgZW1wdHkgYW5kIGNvbnRhaW5zIHRoZSB0ZXh0ICJBbiBPdXRsaW5lCi1pcyBub3QgYXZhaWxhYmxlIi48L2xpPgotCi08bGk+Ci1PcGVuIGFuIGVkaXRvciBvbiBhIGphdmEgZmlsZS4gVmVyaWZ5IHRoYXQgYSBqYXZhIHBhZ2UgYXBwZWFycyBpbiB0aGUgb3V0bGluZQotdmlldy4mbmJzcDsgSWYgeW91IHNlbGVjdCBpdGVtcyBpbiB0aGlzIHBhZ2UgdGhlIHNjcm9sbCBhbmQgc2VsZWN0ZWQgdGV4dAotd2l0aGluIHRoZSBlZGl0b3Igc2hvdWxkIGNoYW5nZS48L2xpPgotCi08bGk+Ci1PcGVuIGEgc2Vjb25kIGZpbGUgaW4gYSBqYXZhIGVkaXRvci4mbmJzcDsgVmVyaWZ5IHRoYXQgYSBzZWNvbmQgamF2YSBwYWdlCi1hcHBlYXJzIGluIHRoZSBvdXRsaW5lIHZpZXcuPC9saT4KLQotPGxpPgotSWYgeW91IHN3aXRjaCBiZXR3ZWVuIHRoZSB0d28gZWRpdG9ycyB0aGUgdmlzaWJsZSBwYWdlIHNob3VsZCBjaGFuZ2UuPC9saT4KLQotPGxpPgotT3BlbiBhIC50eHQgZmlsZSBpbiBhIHRleHQgZWRpdG9yLiZuYnNwOyBXaGVuIHRoaXMgZWRpdG9yIGlzIGFjdGl2ZSB0aGUKLW91dGxpbmUgdmlldyB3aWxsIGJlIGVtcHR5IGFuZCBjb250YWluIHRoZSBzdGFuZGFyZCBlbXB0eSB0ZXh0IGFzIGRlc2NyaWJlZAotaW4gc3RlcCAyLjwvbGk+Ci0KLTxsaT4KLUlmIHlvdSBzd2l0Y2ggYmV0d2VlbiBhIHRleHQgYW5kIGphdmEgZWRpdG9yIHRoZSB2aXNpYmxlIHBhZ2Ugc2hvdWxkIGNoYW5nZS4mbmJzcDsKLVZlcmlmeSB0aGF0IHRoZSB0b29sYmFyIGFuZCBtZW51IGl0ZW1zIGluIHRoZSBvdXRsaW5lIGFsc28gY2huYWdlLiZuYnNwOwotVGhlIGphdmEgZWRpdG9yIGhhcyBGaWVsZCBhbmQgTWVtYmVyIHRvb2xiYXIgaXRlbXMuPC9saT4KLQotPGxpPgotQ2xvc2Ugb25lIGVkaXRvci4mbmJzcDsgSWYgYW5vdGhlciBlZGl0b3IgaXMgYWN0aXZhdGVkIHZlcmlmeSB0aGF0IGl0cwotb3V0bGluZSBwYWdlIGlzIG5vdyB2aXNpYmxlLiZuYnNwOyBJZiBubyBlZGl0b3IgaXMgYWN0aXZhdGVkIHZlcmlmeSB0aGF0Ci10aGUgb3V0bGluZSBpcyBlbXB0eS48L2xpPgotCi08bGk+Ci1DbG9zZSB0aGUgbGFzdCBlZGl0b3IgYW5kIHZlcmlmeSB0aGF0IHRoZSBkZWZhdWx0IGJsYW5rIHBhZ2UgaXMgdmlzaWJsZQotaW4gdGhlIG91dGxpbmUuPC9saT4KLTwvb2w+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9QZXJzaXN0ZW5jZS5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1BlcnNpc3RlbmNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNWMyYjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1BlcnNpc3RlbmNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlRlc3QgU2NlbmFyaW86IFBlcnNpc3RlbmNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPgotUGVyc2lzdGVuY2U8L2gzPgotUHVycG9zZTogVG8gdGVzdCBwZXJzaXN0ZW5jZSBpbiB0aGUgd29ya2JlbmNoLgotPHA+U2V0dXA6Ci08b2w+Ci08bGk+Ci1JbnN0YWxsIEVjbGlwc2UgUGxhdGZvcm0uPC9saT4KLQotPGxpPgotRGVsZXRlIHRoZSBtZXRhZGF0YSBmb3Igb3JnLmVjbGlwc2UudWkuPC9saT4KLTwvb2w+Ci1NZXRob2Q6Ci08b2w+Ci08bGk+Ci1TdGFydCB0aGUgd29ya2JlbmNoLiZuYnNwOyBDb25maXJtIHRoYXQgdGhlIGRlZmF1bHQgcGVyc3BlY3RpdmUgKFJlc291cmNlKQotYW5kIHdlbGNvbWUgZWRpdG9yIGJvdGggYXBwZWFyLjwvbGk+Ci0KLTxsaT4KLUNyZWF0ZSBhIHByb2plY3Qgd2l0aCAzIGZpbGVzLCBvbmUudHh0LCB0d28udHh0LCBhbmQgdGhyZWUudHh0LiZuYnNwOyBPcGVuCi1vbmUudHh0IGluIHRoZSBkZWZhdWx0IHBlcnNwZWN0aXZlLjwvbGk+Ci0KLTxsaT4KLUluIHRoZSBuYXZpZ2F0b3Igc2VsZWN0IHRoZSBwcm9qZWN0IGFuZCBpbnZva2UgT3BlbiBQZXJzcGVjdGl2ZSA+IEphdmEKLWZyb20gdGhlIGNvbnRleHQgbWVudS4mbmJzcDsgVmVyaWZ5IHRoYXQgYSBuZXcgSmF2YSBwZXJzcGVjdGl2ZSBhcHBlYXJzCi1pbiB0aGUgY3VycmVudCB3aW5kb3cuJm5ic3A7IFRoZSBpbnB1dCBmb3IgdGhlIFBhY2thZ2VzIHZpZXcgYW5kIG5hdmlnYXRvcgotc2hvdWxkIGJlIHRoZSBwcm9qZWN0LjwvbGk+Ci0KLTxsaT4KLU9wZW4gdHdvLnR4dCBpbiB0aGUgSmF2YSBwZXJzcGVjdGl2ZS48L2xpPgotCi08bGk+Ci1DaGFuZ2UgdGhlIFdvcmtiZW5jaCBQcmVmZXJlbmNlcyBmb3IgIk9wZW4gUGVyc3BlY3RpdmUiIHRvICJPcGVuIGluIE5ldwotV2luZG93Ii4mbmJzcDsgVGhlbiBvcGVuIGEgSmF2YSBwZXJzcGVjdGl2ZSBhbmQgdmVyaWZ5IHRoYXQgYSBuZXcgd2luZG93Ci1pcyBjcmVhdGVkLjwvbGk+Ci0KLTxsaT4KLU5vdyB3ZSBoYXZlIHR3byB3aW5kb3dzLiZuYnNwOyBUaGUgZmlyc3Qgd2luZG93IGhhcyB0d28gcGVyc3BlY3RpdmVzIChyZXNvdXJjZQotYW5kIGphdmEpLiZuYnNwOyBJbiB0aGUgcmVzb3VyY2UgcGVyc3BlY3RpdmUgb25lLnR4dCBpcyBvcGVuIGluIGFuIGVkaXRvci4mbmJzcDsKLUluIHRoZSBqYXZhIHBlcnNwZWN0aXZlIHR3by50eHQgaXMgb3BlbiBpbiBhbiBlZGl0b3IuJm5ic3A7IEluIHRoZSBzZWNvbmQKLXdpbmRvdyBoZXJlIGlzIG9uZSBKYXZhIHBlcnNwZWN0aXZlIHdpdGggbm8gb3BlbiBlZGl0b3JzLjwvbGk+Ci0KLTxsaT4KLUludm9rZSBGaWxlID4gRXhpdC4mbmJzcDsgVGhlbiByZXN0YXJ0IHRoZSB3b3JrYmVuY2ggYW5kIHZlcmlmeSB0aGF0IHRoZQotd2luZG93LCBwZXJzcGVjdGl2ZSBhbmQgZWRpdG9yIHN0YXRlIG9mIHRoZSB3b3JrYmVuY2ggaXMgcmVzdG9yZWQuPC9saT4KLTwvb2w+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9QcmVmZXJlbmNlcy5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1ByZWZlcmVuY2VzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2YxMWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1ByZWZlcmVuY2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlRlc3QgU2NlbmFyaW86IFByZWZlcmVuY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDM+Ci1QcmVmZXJlbmNlczwvaDM+Ci1QdXJwb3NlOiBUbyB0ZXN0IHRoZSBQcmVmZXJlbmNlcyBpbiBFY2xpcHNlLiZuYnNwOyBXZSB3aWxsIG9wZW4gdGhlIFByZWZlcmVuY2VzCi1kaWFsb2csIHNlbGVjdCBzb21lIHBhZ2VzLCBjaGFuZ2UgYW5kIGFwcGx5IHByZWZlcmVuY2VzLCB2ZXJpZnkgdGhlaXIgYWZmZWN0LAotYW5kIHRlc3QgcGVyc2lzdGVuY2UgYmV0d2VlbiBzZXNzaW9ucy4KLTxwPlNldHVwOgotPG9sPgotPGxpPgotSW5zdGFsbCBFY2xpcHNlIFBsYXRmb3JtLjwvbGk+Ci08L29sPgotTWV0aG9kOgotPG9sPgotPGxpPgotU3RhcnQgdGhlIHdvcmtiZW5jaC48L2xpPgotCi08bGk+Ci1JbnZva2UgV2luZG93ID4gUHJlZmVyZW5jZXMgYW5kIHZlcmlmeSB0aGF0IHRoZSBQcmVmZXJlbmNlcyBkaWFsb2cgYXBwZWFycy4mbmJzcDsKLUNsaWNrIG9uIGFsbCBvZiB0aGUgaXRlbXMgaW4gdGhlIGxlZnQgaGFuZCB2aWV3ZXIgdG8gZGVtb25zdHJhdGUgdGhhdCBlYWNoCi1pdGVtIGhhcyBhIHZhbGlkIHBhZ2UgYW5kIG5vIGV4Y2VwdGlvbnMgb2NjdXIgaW4gdGhlaXIgY3JlYXRpb24uJm5ic3A7Ci1Ob3cgY2xvc2UgdGhlIGRpYWxvZy48L2xpPgotCi08bGk+Ci1UaGUgYmVoYXZpb3Igb2YgdGhlIHdvcmtiZW5jaCBjYW4gYmUgY3VzdG9taXplZCB1c2luZyB0aGUgcHJlZmVyZW5jZXMuJm5ic3A7Ci1UbyBzZWUgdGhpcyBpbiBhY3Rpb24gd2Ugd2lsbCBleGFtaW5lIHZhcmlvdXMgcHJlZmVyZW5jZXMgd2hpY2ggc2hpcCB3aXRoCi1FY2xpcHNlLjwvbGk+Ci0KLTxsaT4KLVRoZSBzZWxlY3Rpb24gaW4gdGhlIG5hdmlnYXRvciBpcyBsaW5rZWQgdG8gdGhlIGFjdGl2ZSBlZGl0b3IuJm5ic3A7IE9wZW4KLWEgY291cGxlIG9mIGZpbGVzLiZuYnNwOyBUaGVuIHN3aXRjaCBiZXR3ZWVuIHRoZSBlZGl0b3JzIGFuZCB3YXRjaCBob3cKLXRoZSBpbnB1dCBmb3IgdGhlIGFjdGl2ZSBlZGl0b3IgaXMgc2VsZWN0ZWQgaW4gdGhlIG5hdmlnYXRvci4mbmJzcDsgWW91Ci1jYW4gZGlzYWJsZSB0aGlzIG9wdGlvbiBpbiB0aGUgUHJlZmVyZW5jZXMuJm5ic3A7IFRvIGRvIHRoaXMgLi48L2xpPgotCi08b2w+Ci08bGk+Ci1PcGVuIHRoZSBwcmVmZXJlbmNlcyBkaWFsb2cuPC9saT4KLQotPGxpPgotVHVybmluZyBvZmYgIkxpbmsgbmF2aWdhdG9yIHNlbGVjdGlvbiB0byBhY3RpdmUgZWRpdG9yIiBpbiB0aGUgd29ya2JlbmNoCi1wcmVmZXJlbmNlcy48L2xpPgotCi08bGk+Ci1QcmVzcyBPSy4mbmJzcDsgVGhlIGRpYWxvZyBzaG91bGQgY2xvc2UuPC9saT4KLQotPGxpPgotTm93IHN3aXRjaCBiZXR3ZWVuIHRoZSBlZGl0b3JzLiZuYnNwOyBOb3RpY2UgdGhhdCB0aGUgc2VsZWN0aW9uIGluIHRoZQotbmF2aWdhdG9yIGRvZXMgbm90IGNoYW5nZS48L2xpPgotPC9vbD4KLQotPGxpPgotVGhlIFBlcnNwZWN0aXZlID4gT3BlbiBtZW51IGFjdGlvbiBjYW4gYWxzbyBiZSBjdXN0b21pemVkLiZuYnNwOyBCeSBkZWZhdWx0Ci10aGlzIGFjdGlvbiB3aWxsIG9wZW4gYSBuZXcgcGVyc3BlY3RpdmUgaW4gdGhlIGN1cnJlbnQgd2luZG93LiZuYnNwOyBZb3UKLWNhbiBjaGFuZ2UgdGhpcyB0byAib3BlbiBpbiBuZXcgd2luZG93IiBvciAicmVwbGFjZSBvdGhlciIuJm5ic3A7IFRvIHNlZQotdGhpcyBiZWhhdmlvciAuLjwvbGk+Ci0KLTxvbD4KLTxsaT4KLU9wZW4gdGhlIHByZWZlcmVuY2VzIGRpYWxvZy4mbmJzcDsgQ2hhbmdlIHRoZSB3b3JrYmVuY2ggcHJlZmVyZW5jZXMgZm9yCi0iT3BlbiBQZXJzcGVjdGl2ZSIgdG8gIk9wZW4gaW4gTmV3IFdpbmRvdyIuJm5ic3A7IFRoZW4gcHJlc3MgT0s8L2xpPgotCi08bGk+Ci1JbnZva2UgUGVyc3BlY3RpdmUgPiBPcGVuID4gSmF2YS4mbmJzcDsgTm90aWNlIGhvdyBhIG5ldyB3aW5kb3cgaXMgY3JlYXRlZAotZm9yIHRoZSBwZXJzcGVjdGl2ZS4mbmJzcDsgVGhlIGxpc3Qgb2Ygb3BlbiB3aW5kb3dzIGlzIHNob3duIGluIHRoZSBXaW5kb3cKLW1lbnUuJm5ic3A7IFNlbGVjdCB0aGVzZSBpdGVtcyB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgd2luZG93cy48L2xpPgotPC9vbD4KLQotPGxpPgotSWYgeW91IGRvbid0IGxpa2UgdGhlIGN1cnJlbnQgcHJlZmVyZW5jZXMgeW91IGNhbiByZXNldCB0aGVtLiZuYnNwOyBPcGVuCi10aGUgcHJlZmVyZW5jZXMgZGlhbG9nIGFnYWluLiZuYnNwOyBUbyByZXNldCB0aGUgc3RhdGUgb2YgIkxpbmsgbmF2aWdhdG9yCi0uLiIgYW5kICJPcGVuIFBlcnNwZWN0aXZlIC4uIiBwcmVzcyB0aGUgUmVzdG9yZSBEZWZhdWx0cyBidXR0b24uJm5ic3A7Ci1JZiB5b3UgcHJlc3MgT0sgdGhlIG9wdGlvbnMgd2lsbCBiZSBzYXZlZC4mbmJzcDsgSG93ZXZlciwgbGV0J3MgYXNzdW1lCi10aGF0IHlvdSBkZWNpZGUgbm90IHRvIGNoYW5nZSB0aGVtLiZuYnNwOyBQcmVzcyBDYW5jZWwuJm5ic3A7IFRoZW4gdmVyaWZ5Ci10aGF0IHRoZSBkZXZpYW50IG9wdGlvbnMgaGF2ZSBub3QgYmVlbiByZXN0b3JlZCB0byBkZWZhdWx0IGJ5IHN3aXRjaGluZwotYmV0d2VlbiBlZGl0b3JzIGFuZCBvcGVuaW5nIGEgbmV3IHBlcnNwZWN0aXZlLjwvbGk+Ci0KLTxsaT4KLUludm9rZSBGaWxlID4gRXhpdC4mbmJzcDsgVGhlbiByZXN0YXJ0IHRoZSB3b3JrYmVuY2guPC9saT4KLQotPGxpPgotT3BlbiB0aGUgcHJlZmVyZW5jZXMgZGlhbG9nIGFuZCBjb25maXJtIHRoYSAiTGluayBuYXZpZ2F0b3IgLi4gIiBhbmQgIk9wZW4KLVBlcnNwZWN0aXZlIC4uIiBzdGlsbCByZWZsZWN0IHRoZSBjdXN0b21pemVkIHZhbHVlcy4mbmJzcDsgVGhlIHdvcmtiZW5jaAotd2lsbCBhdXRvbWF0aWNhbGx5IHNhdmUgeW91ciBwcmVmZXJlbmNlcyBiZXR3ZWVuIHNlc3Npb25zLjwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1Byb2JsZW1zIFZpZXcuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9Qcm9ibGVtcyBWaWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjU1NjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1Byb2JsZW1zIFZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlRlc3QgU2NlbmFyaW86IFRhc2tzIFZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMz4KLVRhc2tzIFZpZXc8L2gzPgotUHVycG9zZTogVG8gdGVzdCB0aGUgVGFza3MgdmlldyBpbiBFY2xpcHNlLiZuYnNwOyBXZSB3aWxsIGNyZWF0ZSBhIGphdmEKLXByb2plY3Qgd2l0aCBqYXZhIGNsYXNzZXMsIGludHJvZHVjZSBlcnJvcnMgaW4gdGhvc2UgY2xhc3NlcywgYWRkIHRhc2tzCi10byB0aGUgZmlsZXMsIGFuZCB0aGVuIHZlcmlmeSB0aGVtIGluIHRoZSB0YXNrcyBsaXN0LiZuYnNwOyBXZSBhbHNvIHRlc3QKLXRoZSBwZXJzaXN0YW5jZSBvZiB0YXNrIGZpbHRlcmluZyBiZXR3ZWVuIHNlc3Npb25zLgotPHA+U2V0dXA6Ci08b2w+Ci08bGk+Ci1JbnN0YWxsIEVjbGlwc2UgUGxhdGZvcm0uPC9saT4KLTwvb2w+Ci1NZXRob2Q6Ci08b2w+Ci08bGk+Ci1TdGFydCB0aGUgd29ya2JlbmNoLjwvbGk+Ci0KLTxsaT4KLUNyZWF0ZSBhIEphdmEgUHJvamVjdCBuYW1lZCBUYXNrUHJvamVjdC4mbmJzcDsgVGhlbiBjcmVhdGUgYSBjbGFzcyBuYW1lZAotVGFza0NsYXNzIHdpdGggdGhlIGZvbGxvd2luZyBjb250ZW50LjwvbGk+Ci0KLTxwPjxicj48dHQ+cHVibGljIGNsYXNzIFRhc2tDbGFzcyB7PC90dD4KLTxicj48dHQ+Jm5ic3A7cHJpdmF0ZSBpbnQgeTs8L3R0PgotPGJyPjx0dD4mbmJzcDtwdWJsaWMgVGFza0NsYXNzKCkgezwvdHQ+Ci08YnI+PHR0PiZuYnNwO308L3R0PgotPGJyPjx0dD4mbmJzcDtwdWJsaWMgdm9pZCBkb1RoaXMoKSB7PC90dD4KLTxicj48dHQ+Jm5ic3A7fTwvdHQ+Ci08YnI+PHR0PiZuYnNwO2Fic3RyYWN0IHB1YmxpYyB2b2lkIGRvVGhhdCgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwO3B1YmxpYyBpbnQgZ2V0WCgpIHs8L3R0PgotPGJyPjx0dD4mbmJzcDsgcmV0dXJuIHg7PC90dD4KLTxicj48dHQ+Jm5ic3A7fTwvdHQ+Ci08YnI+PHR0Pn08L3R0PgotPGJyPiZuYnNwOwotPGxpPgotSWYgeW91IHNhdmUgdGhpcyBmaWxlIDIgZXJyb3JzIHdpbGwgYXBwZWFyIGluIHRoZSBzb3VyY2UuJm5ic3A7IE9uIGxpbmUKLTcgdGhlcmUgaXMgYW4gZXJyb3IgYmVjYXVzZSBhYnN0cmFjdCBtZXRob2RzIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gYW4KLWFic3RyYWN0IGNsYXNzLiZuYnNwOyBPbiBsaW5lIDkgdGhlcmUgaXMgYW4gZXJyb3IgYmVjYXVzZSB4IGlzIHVua25vd24uPC9saT4KLQotPGxpPgotT3BlbiB0aGUgVGFza3MgdmlldyBieSBpbnZva2luZyBQZXJzcGVjdGl2ZSA+IFNob3cgVmlldyA+IFRhc2tzLiZuYnNwOwotVmVyaWZ5IHRoYXQgdGhlIHRhc2tzIHZpZXdzIGFwcGVhcnMgYW5kIHRoYXQgaXQgc2hvd3MgdGhlIDIgZXJyb3JzIGluIHRoZQotVGFza0NsYXNzLjwvbGk+Ci0KLTxsaT4KLVNlbGVjdCB0aGUgZmlyc3QgbGluZSBvZiBUYXNrQ2xhc3MgYW5kIGludm9rZSAiQWRkIFRhc2siIGZyb20gdGhlIGNvbnRleHQKLW1lbnUuJm5ic3A7IE92ZXJyaWRlIHRoZSBsYWJlbCB3aXRoICJUZXN0IExhYmVsIiBhbmQgcHJlc3MgT0suJm5ic3A7IFZlcmlmeQotdGhhdCBhIG5ldyB0YXNrIGljb24gYXBwZWFycyBvbiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBlZGl0b3IgYW5kIGluIHRoZQotdGFza3Mgdmlldy48L2xpPgotCi08bGk+Ci1JZiBhIHByb2JsZW0gaXMgcmVzb2x2ZWQgb3IgYSB0YXNrIHJlbW92ZWQgaXQgc2hvdWxkIGRpc2FwcGVhciBmcm9tIHRoZQotdGFzayB2aWV3LiZuYnNwOyBPcGVuIHRoZSBUYXNrIHZpZXcgZmlsdGVyIGRpYWxvZyBhbmQgcmVzZXQgYWxsIG9wdGlvbnMKLXdpdGggdGhlIFJlc2V0IGJ1dHRvbi4mbmJzcDsgUHJlc3MgT0sgYW5kIGdvIGJhY2sgdG8gdGhlIGVkaXRvciBmb3IgVGFza0NsYXNzLmphdmEuJm5ic3A7Ci1EZWxldGUgdGhlICJkb1RoYXQiIG1ldGhvZCBhbmQgc2F2ZSB0aGUgZmlsZS4mbmJzcDsgVmVyaWZ5IHRoYXQgb25lIG9mCi10aGUgZXJyb3JzIG9uIFRhc2tDbGFzcy5qYXZhIGlzIGRlbGV0ZWQuPC9saT4KLQotPGxpPgotTm93IHNlbGVjdCB0aGUgVGFza3MgdmlldyBhbmQgc2VsZWN0IHRoZSB0YXNrIGl0ZW0gbGFiZWxsZWQgIlRlc3QgTGFiZWwiLiZuYnNwOwotSW52b2tlIEVkaXQgPiBEZWxldGUgdG8gZGVsZXRlIHRoaXMgdGFzayBhbmQgdGhlbiB2ZXJpZnkgdGhhdCBpdCBkaXNhcHBlYXJzCi1mcm9tIHRoZSB0YXNrcyB2aWV3IGFuZCBmcm9tIHRoZSBvcGVuIGVkaXRvci48L2xpPgotCi08bGk+Ci1XaXRoaW4gdGhlIFRhc2tzIHZpZXcgeW91IGNhbiBhbHNvIGNyZWF0ZSBuZXcgdGFza3MuJm5ic3A7IFRvIHRlc3QgdGhpcwotcHJlc3MgdGhlICJOZXcgVGFzayIgYnV0dG9uIG9uIHRoZSB0b29sYmFyLiZuYnNwOyBBIG5ldyB0YXNrIHNob3VsZCBhcHBlYXIuJm5ic3A7Ci1UeXBlIGluIHRoZSBsYWJlbCBmb3IgdGhpcyB0YXNrIGFuZCBwcmVzcyBSZXR1cm4uJm5ic3A7IFZlcmlmeSB0aGF0IGEgbmV3Ci10YXNrIGlzIGNyZWF0ZWQuJm5ic3A7IERvIHRoaXMgYSBjb3VwbGUgb2YgdGltZXMgdG8gY3JlYXRlIG1vcmUgdGhhbiBvbmUKLXRhc2suPC9saT4KLQotPGxpPgotQSB0YXNrIGlzIHZlcnkgc2ltaWxhciB0byBhIGJvb2ttYXJrLiZuYnNwOyBJZiB5b3Ugc2VsZWN0IGEgdGFzayB5b3UgY2FuCi1vcGVuIGFuIGVkaXRvciBvbiB0aGUgdGFzayBzb3VyY2UuJm5ic3A7IFRvIHRlc3QgdGhpcyBjbG9zZSBhbGwgZWRpdG9ycy4mbmJzcDsKLVRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgamF2YSBwcm9ibGVtcyBmb3IgVGFza0NsYXNzLmphdmEgYW5kIGludm9rZSBHbyBUbwotRmlsZSBpbiB0aGUgY29udGV4dCBtZW51LiZuYnNwOyBWZXJpZnkgdGhhdCBhbiBlZGl0b3Igb3BlbnMgb24gdGhlIHByb2JsZW0KLWFuZCB0aGF0IHRoZSBwcm9ibGVtIGlzIGluZGljYXRlZCBieSBzZWxlY3Rpb24gaW4gdGhlIGVkaXRvci48L2xpPgotCi08bGk+Ci1Ob3cgaW52b2tlIHRoZSBGaWx0ZXJzIHRvb2xiYXIgYWN0aW9uIGFuZCBjaGFuZ2UgdGhlICJzaG93IGVudHJpZXMgb2YgdHlwZSIKLW9wdGlvbiB0byAiSmF2YSBQcm9ibGVtIiBhbmQgbm90aGluZyBlbHNlLiZuYnNwOyBQcmVzcyBPSyBhbmQgdmVyaWZ5IHRoYXQKLW9ubHkgSmF2YSBwcm9ibGVtcyBhcHBlYXIgaW4gdGhlIHRhc2sgbGlzdCBub3cuPC9saT4KLQotPGxpPgotUmVvcGVuIHRoZSBGaWx0ZXJzIGRpYWxvZyBhbmQgc2VsZWN0ICJPbiBTZWxlY3RlZCBSZXNvdXJjZSBPbmx5Ii4mbmJzcDsKLVByZXNzIE9LLiZuYnNwOyBOb3cgc2VsZWN0IFRhc2tDbGFzcy5qYXZhIGluIHRoZSBuYXZpZ2F0b3IgYW5kIHZlcmlmeSB0aGF0Ci10aGUgamF2YSBwcm9ibGVtcyBmb3IgdGhpcyBmaWxlIGFyZSB2aXNpYmxlIGluIHRoZSBuYXZpZ2F0b3IuJm5ic3A7IFNlbGVjdAotdGhlIFRhc2tQcm9qZWN0IGFuZCB2ZXJpZnkgdGhhdCB0aGUgamF2YSBwcm9ibGVtcyBmb3IgVGFza0NsYXNzLmphdmEgYXJlCi1ub3QgdmlzaWJsZS48L2xpPgotCi08bGk+Ci1Ob3cgdGhlIHRhc2sgbGlzdCBjb250YWlucyBhIG51bWJlciBvZiBlcnJvcnMgYW5kIHRhc2tzLiZuYnNwOyBJdCBhbHNvCi1oYXMgYSBjb3VwbGUgb2YgZmlsdGVyaW5nIG9wdGlvbnMgKGphdmEgcHJvYmxlbXMgb25seSBhbmQgc2VsZWN0ZWQgcmVzb3VyY2UKLW9ubHkpLiZuYnNwOyBUaGlzIHN0YXRlIGlzIHBlcnNpc3RlZCBiZXR3ZWVuIHNlc3Npb25zLiZuYnNwOyBUbyB0ZXN0IHRoaXMKLW5vdGUgdGhlIHN0YXRlIG9mIHRoZSB0YXNrIHZpZXcuJm5ic3A7IFRoZW4gY2xvc2UgdGhlIHdvcmtiZW5jaCBhbmQgcmVzdGFydAotaXQuJm5ic3A7IFZlcmlmeSB0aGF0IHRoZSB2aXNpYmxlIHNldCBvZiB0YXNrcyBhbmQgdGhlIGZpbHRlcmluZyBvcHRpb25zCi1hcmUgcmVzdG9yZWQuPC9saT4KLTwvb2w+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9Qcm9wZXJ0aWVzIERpYWxvZy5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1Byb3BlcnRpZXMgRGlhbG9nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTJlYTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1Byb3BlcnRpZXMgRGlhbG9nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iT1RJIEVtcGxveWVlIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5Qcm9wZXJ0aWVzIERpYWxvZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGNlbnRlcj4KLTxoMT4KLVByb3BlcnRpZXMgRGlhbG9nPC9oMT48L2NlbnRlcj4KLQotPGgyPgotUHVycG9zZTwvaDI+Ci1UaGUgcGxhbiBpcyB0byBjb25maXJtIHRoZSBkZWZhdWx0IHByb3BlcnR5IHBhZ2VzIGZvciBzaW1wbGUgZmlsZSwgZm9sZGVyLAotYW5kIHByb2plY3QgcmVzb3VyY2VzLgotPGgyPgotU2V0dXA8L2gyPgotCi08dWw+Ci08bGk+Ci1TdGFydCB0aGUgRWNsaXBzZSB3b3JrYmVuY2g8L2xpPgotCi08bGk+Ci1DcmVhdGUgYSBzaW1wbGUgUHJvamVjdCwgRm9sZGVyLCBhbmQgRmlsZTwvbGk+Ci08L3VsPgotCi08aDI+Ci1Qcm9qZWN0IHByb3BlcnR5IHBhZ2VzPC9oMj4KLQotPG9sPgotPGxpPgotU2VsZWN0IHRoZSBzaW1wbGUgUHJvamVjdCwgZnJvbSB0aGUgY29udGV4dCBtZW51IHNlbGVjdCBQcm9wZXJ0aWVzPC9saT4KLQotPGxpPgotQ2xpY2sgb24gdGhlIFByb2plY3QgUmVmZXJlbmNlcyBwYWdlPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlIFByb2plY3QgUmVmZXJlbmNlcyBwYWdlIGluY2x1ZGVzIG5vIHByb2plY3QgcmVmZXJlbmNlczwvbGk+Ci0KLTxsaT4KLUNsaWNrIG9uIHRoZSBJbmZvIHBhZ2U8L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhlIGNvbnRlbnQgaXMgY29ycmVjdDwvbGk+Ci0KLTxsaT4KLUNoZWNrIHRoZSBSZWFkIE9ubHkgb3B0aW9uIGFuZCBwcmVzcyBPSzwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IGNyZWF0aW5nIGFub3RoZXIgc2ltcGxlIGZpbGUgaW4gdGhlIHNpbXBsZSBQcm9qZWN0IGlzIGRpc2FsbG93ZWQ8L2xpPgotPC9vbD4KLQotPGgyPgotRm9sZGVyIHByb3BlcnR5IHBhZ2VzPC9oMj4KLQotPG9sPgotPGxpPgotU2VsZWN0IHRoZSBzaW1wbGUgRm9sZGVyLCBmcm9tIHRoZSBjb250ZXh0IG1lbnUgc2VsZWN0IFByb3BlcnRpZXM8L2xpPgotCi08bGk+Ci1DbGljayBvbiB0aGUgSW5mbyBwYWdlPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoZSBjb250ZW50IGlzIGNvcnJlY3Q8L2xpPgotCi08bGk+Ci1DaGVjayB0aGUgUmVhZCBPbmx5IG9wdGlvbiBhbmQgcHJlc3MgT0s8L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCBjcmVhdGluZyBhbm90aGVyIHNpbXBsZSBmaWxlIGluIHRoZSBzaW1wbGUgRm9sZGVyIGlzIGRpc2FsbG93ZWQ8L2xpPgotPC9vbD4KLQotPGgyPgotRmlsZSBwcm9wZXJ0eSBwYWdlczwvaDI+Ci0KLTxvbD4KLTxsaT4KLVNlbGVjdCB0aGUgc2ltcGxlIEZpbGUsIGZyb20gdGhlIGNvbnRleHQgbWVudSBzZWxlY3QgUHJvcGVydGllczwvbGk+Ci0KLTxsaT4KLUNsaWNrIG9uIHRoZSBJbmZvIHBhZ2U8L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhlIGNvbnRlbnQgaXMgY29ycmVjdDwvbGk+Ci0KLTxsaT4KLUNoZWNrIHRoZSBSZWFkIE9ubHkgb3B0aW9uIGFuZCBwcmVzcyBPSzwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IGVkaXRpbmcgdGhlIHNpbXBsZSBGaWxlIGlzIGRpc2FsbG93ZWQgKGVkaXRvciBpcyBvcGVuZWQgYnV0Ci1jYW5ub3QgdHlwZSBpbiBpdCk8L2xpPgotPC9vbD4KLQotPGgyPgotQ2xlYW51cDwvaDI+Ci0KLTx1bD4KLTxsaT4KLURlbGV0ZSB0aGUgc2ltcGxlIEZpbGUsIEZvbGRlciwgYW5kIFByb2plY3Q8L2xpPgotPC91bD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1Byb3BlcnRpZXMgVmlldy5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1Byb3BlcnRpZXMgVmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGMyYWRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9Qcm9wZXJ0aWVzIFZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+VGVzdCBTY2VuYXJpbzogUHJvcGVydGllcyBWaWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDM+Ci1Qcm9wZXJ0aWVzIFZpZXc8L2gzPgotUHVycG9zZTogVG8gdGVzdCB0aGUgUHJvcGVydGllcyB2aWV3IGluIEVjbGlwc2UuJm5ic3A7IFRoZSBPdXRsaW5lIHZpZXcKLWlzIGp1c3QgYSBjb250YWluZXIgZm9yIHRoZSBwYWdlcyBjb250cmlidXRlZCBieSBvdGhlciBlZGl0b3JzIGFuZCB2aWV3cwotd2l0aGluIHRoZSB3b3JrYmVuY2guJm5ic3A7IFRoZXJlZm9yZSwgdGhpcyB0ZXN0IHdpbGwgZm9jdXMgb24gdGhlIGNyZWF0aW9uLAotc2hvdywgYW5kIGNsb3N1cmUgb2YgdGhvc2UgcGFnZXMuCi08cD5TZXR1cDoKLTxvbD4KLTxsaT4KLUluc3RhbGwgRWNsaXBzZSBQbGF0Zm9ybS48L2xpPgotCi08bGk+Ci1DcmVhdGUgYSBwcm9qZWN0IGNvbnRhaW5pbmcgc29tZSBmaWxlcy48L2xpPgotPC9vbD4KLU1ldGhvZDoKLTxvbD4KLTxsaT4KLVN0YXJ0IHRoZSB3b3JrYmVuY2guPC9saT4KLQotPGxpPgotT3BlbiB0aGUgTmF2aWdhdG9yLCBQYWNrYWdlcyBhbmQgUHJvcGVydGllcyB2aWV3cy48L2xpPgotCi08bGk+Ci1TZWxlY3QgYSBmaWxlIGluIHRoZSBOYXZpZ2F0b3IuJm5ic3A7IFZlcmlmeSB0aGF0IHRoZSBwcm9wZXJ0aWVzIGZvciB0aGlzCi1maWxlIGFyZSB2aXNpYmxlIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcuPC9saT4KLQotPGxpPgotU2VsZWN0IGEgcHJvamVjdCBpbiB0aGUgUGFja2FnZXMgdmlldy4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlIHByb3BlcnRpZXMKLWZvciB0aHMgZmlsZSBhcmUgb253IHZpc2libGUgaW4gdGhlIHByb3BlcnRpZXMgdmlldy48L2xpPgotCi08bGk+Ci1BY3RpdmF0ZSB0aGUgTmF2aWdhdG9yLCBQYWNrYWdlcywgTmF2aWdhdG9yLCBhbmQgUGFja2FnZXMgdmlldyBieSBjbGlja2luZwotaW4gdGhlIHRpdGxlIGFyZWEgb2YgdGhlIHZpZXcuJm5ic3A7IFZlcmlmeSB0aGF0IHRoZSB2aXNpYmxlIHByb3ByZXRpZXMKLWluIHRoZSBwcm9wZXJ0aWVzIHZpZXcgY2hhbmdlIHRvIHJlZmxlY3QgdGhlIGFjdGl2ZSBwYXJ0LjwvbGk+Ci0KLTxsaT4KLUNsb3NlIHRoZSBwcm9wZXJ0aWVzIHZpZXcuPC9saT4KLQotPGxpPgotT3BlbiB0aGUgdmlldyBhbmQgdmVyaWZ5IHRoYXQgaXQgc2hvd3MgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBsYXN0IHNlbGVjdGlvbgotaW4gdGhlIHdvcmtiZW5jaC48L2xpPgotPC9vbD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1Rhc2tzIFZpZXcuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9UYXNrcyBWaWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3N2U4NzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1Rhc2tzIFZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+VGVzdCBTY2VuYXJpbzogVGFza3MgVmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgzPgotVGFza3MgVmlldzwvaDM+Ci1QdXJwb3NlOiBUbyB0ZXN0IHRoZSBUYXNrcyB2aWV3IGluIEVjbGlwc2UuJm5ic3A7IFdlIHdpbGwgY3JlYXRlIGEgamF2YQotcHJvamVjdCB3aXRoIGphdmEgY2xhc3NlcywgaW50cm9kdWNlIGVycm9ycyBpbiB0aG9zZSBjbGFzc2VzLCBhZGQgdGFza3MKLXRvIHRoZSBmaWxlcywgYW5kIHRoZW4gdmVyaWZ5IHRoZW0gaW4gdGhlIHRhc2tzIGxpc3QuJm5ic3A7IFdlIGFsc28gdGVzdAotdGhlIHBlcnNpc3RhbmNlIG9mIHRhc2sgZmlsdGVyaW5nIGJldHdlZW4gc2Vzc2lvbnMuCi08cD5TZXR1cDoKLTxvbD4KLTxsaT4KLUluc3RhbGwgRWNsaXBzZSBQbGF0Zm9ybS48L2xpPgotPC9vbD4KLU1ldGhvZDoKLTxvbD4KLTxsaT4KLVN0YXJ0IHRoZSB3b3JrYmVuY2guPC9saT4KLQotPGxpPgotQ3JlYXRlIGEgSmF2YSBQcm9qZWN0IG5hbWVkIFRhc2tQcm9qZWN0LiZuYnNwOyBUaGVuIGNyZWF0ZSBhIGNsYXNzIG5hbWVkCi1UYXNrQ2xhc3Mgd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRlbnQuPC9saT4KLQotPHA+PGJyPjx0dD5wdWJsaWMgY2xhc3MgVGFza0NsYXNzIHs8L3R0PgotPGJyPjx0dD4mbmJzcDtwcml2YXRlIGludCB5OzwvdHQ+Ci08YnI+PHR0PiZuYnNwO3B1YmxpYyBUYXNrQ2xhc3MoKSB7PC90dD4KLTxicj48dHQ+Jm5ic3A7fTwvdHQ+Ci08YnI+PHR0PiZuYnNwO3B1YmxpYyB2b2lkIGRvVGhpcygpIHs8L3R0PgotPGJyPjx0dD4mbmJzcDt9PC90dD4KLTxicj48dHQ+Jm5ic3A7YWJzdHJhY3QgcHVibGljIHZvaWQgZG9UaGF0KCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7cHVibGljIGludCBnZXRYKCkgezwvdHQ+Ci08YnI+PHR0PiZuYnNwOyByZXR1cm4geDs8L3R0PgotPGJyPjx0dD4mbmJzcDt9PC90dD4KLTxicj48dHQ+fTwvdHQ+Ci08YnI+Jm5ic3A7Ci08bGk+Ci1JZiB5b3Ugc2F2ZSB0aGlzIGZpbGUgMiBlcnJvcnMgd2lsbCBhcHBlYXIgaW4gdGhlIHNvdXJjZS4mbmJzcDsgT24gbGluZQotNyB0aGVyZSBpcyBhbiBlcnJvciBiZWNhdXNlIGFic3RyYWN0IG1ldGhvZHMgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBhbgotYWJzdHJhY3QgY2xhc3MuJm5ic3A7IE9uIGxpbmUgOSB0aGVyZSBpcyBhbiBlcnJvciBiZWNhdXNlIHggaXMgdW5rbm93bi48L2xpPgotCi08bGk+Ci1PcGVuIHRoZSBUYXNrcyB2aWV3IGJ5IGludm9raW5nIFBlcnNwZWN0aXZlID4gU2hvdyBWaWV3ID4gVGFza3MuJm5ic3A7Ci1WZXJpZnkgdGhhdCB0aGUgdGFza3Mgdmlld3MgYXBwZWFycyBhbmQgdGhhdCBpdCBkb2VzIG5vdCBzaG93IHRoZSAyIAotZXJyb3JzIGluIHRoZSBUYXNrQ2xhc3MuPC9saT4KLQotPGxpPgotU2VsZWN0IHRoZSBmaXJzdCBsaW5lIG9mIFRhc2tDbGFzcyBhbmQgaW52b2tlICJBZGQgVGFzayIgZnJvbSB0aGUgY29udGV4dAotbWVudS4mbmJzcDsgT3ZlcnJpZGUgdGhlIGxhYmVsIHdpdGggIlRlc3QgTGFiZWwiIGFuZCBwcmVzcyBPSy4mbmJzcDsgVmVyaWZ5Ci10aGF0IGEgbmV3IHRhc2sgaWNvbiBhcHBlYXJzIG9uIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGVkaXRvciBhbmQgaW4gdGhlCi10YXNrcyB2aWV3LjwvbGk+Ci0KLTxsaT4KLU5vdyBzZWxlY3QgdGhlIFRhc2tzIHZpZXcgYW5kIHNlbGVjdCB0aGUgdGFzayBpdGVtIGxhYmVsbGVkICJUZXN0IExhYmVsIi4mbmJzcDsKLUludm9rZSBFZGl0ID4gRGVsZXRlIHRvIGRlbGV0ZSB0aGlzIHRhc2sgYW5kIHRoZW4gdmVyaWZ5IHRoYXQgaXQgZGlzYXBwZWFycwotZnJvbSB0aGUgdGFza3MgdmlldyBhbmQgZnJvbSB0aGUgb3BlbiBlZGl0b3IuPC9saT4KLQotPGxpPgotV2l0aGluIHRoZSBUYXNrcyB2aWV3IHlvdSBjYW4gYWxzbyBjcmVhdGUgbmV3IHRhc2tzLiZuYnNwOyBUbyB0ZXN0IHRoaXMKLXByZXNzIHRoZSAiTmV3IFRhc2siIGJ1dHRvbiBvbiB0aGUgdG9vbGJhci4mbmJzcDsgQSBuZXcgdGFzayBzaG91bGQgYXBwZWFyLiZuYnNwOwotVHlwZSBpbiB0aGUgbGFiZWwgZm9yIHRoaXMgdGFzayBhbmQgcHJlc3MgUmV0dXJuLiZuYnNwOyBWZXJpZnkgdGhhdCBhIG5ldwotdGFzayBpcyBjcmVhdGVkLiZuYnNwOyBEbyB0aGlzIGEgY291cGxlIG9mIHRpbWVzIHRvIGNyZWF0ZSBtb3JlIHRoYW4gb25lCi10YXNrLjwvbGk+Ci0KLTxsaT4KLUEgdGFzayBpcyB2ZXJ5IHNpbWlsYXIgdG8gYSBib29rbWFyay4mbmJzcDsgSWYgeW91IHNlbGVjdCBhIHRhc2sgeW91IGNhbgotb3BlbiBhbiBlZGl0b3Igb24gdGhlIHRhc2sgc291cmNlLiZuYnNwOyBUbyB0ZXN0IHRoaXMgY2xvc2UgYWxsIGVkaXRvcnMuJm5ic3A7Ci1UaGVuIHNlbGVjdCBvbmUgb2YgdGhlIGphdmEgcHJvYmxlbXMgZm9yIFRhc2tDbGFzcy5qYXZhIGFuZCBpbnZva2UgR28gVG8KLUZpbGUgaW4gdGhlIGNvbnRleHQgbWVudS4mbmJzcDsgVmVyaWZ5IHRoYXQgYW4gZWRpdG9yIG9wZW5zIG9uIHRoZSB0YXNrCi1hbmQgdGhhdCB0aGUgdGFzayBpcyBpbmRpY2F0ZWQgYnkgc2VsZWN0aW9uIGluIHRoZSBlZGl0b3IuPC9saT4KLQotPGxpPgotTm93IGludm9rZSB0aGUgRmlsdGVycyB0b29sYmFyIGFjdGlvbiBhbmQgY2hhbmdlIHRoZSAiV2hlcmUgcHJpb3JpdHkgaXM6Igotb3B0aW9uIHRvICJIaWdoIiBhbmQgbm90aGluZyBlbHNlLiZuYnNwOyBQcmVzcyBPSyBhbmQgdmVyaWZ5IHRoYXQKLW9ubHkgaGlnaCBwcmlvcml0eSB0YXNrcyBhcHBlYXIgaW4gdGhlIHRhc2sgbGlzdCBub3cuPC9saT4KLQotPGxpPgotUmVvcGVuIHRoZSBGaWx0ZXJzIGRpYWxvZyBhbmQgc2VsZWN0ICJPbiBTZWxlY3RlZCBSZXNvdXJjZSBPbmx5Ii4mbmJzcDsKLVByZXNzIE9LLiZuYnNwOyBOb3cgc2VsZWN0IFRhc2tDbGFzcy5qYXZhIGluIHRoZSBuYXZpZ2F0b3IgYW5kIHZlcmlmeSB0aGF0Ci10aGUgdGFza3MgZm9yIHRoaXMgZmlsZSBhcmUgdmlzaWJsZSBpbiB0aGUgdGFzayB2aWV3LiZuYnNwOyBTZWxlY3QKLXRoZSBUYXNrUHJvamVjdCBhbmQgdmVyaWZ5IHRoYXQgdGhlIHRhc2tzIGZvciBUYXNrQ2xhc3MuamF2YSBhcmUKLW5vdCB2aXNpYmxlIGluIHRoZSB0YXNrcyB2aWV3LjwvbGk+Ci0KLTxsaT4KLU5vdyB0aGUgdGFzayBsaXN0IGNvbnRhaW5zIGEgbnVtYmVyIG9mIHRhc2tzLiZuYnNwOyBJdCBhbHNvIGhhcyBhIGNvdXBsZSAKLW9mIGZpbHRlcmluZyBvcHRpb25zLiZuYnNwOyBUaGlzIHN0YXRlIGlzIHBlcnNpc3RlZCBiZXR3ZWVuIAotc2Vzc2lvbnMuJm5ic3A7IFRvIHRlc3QgdGhpcyBub3RlIHRoZSBzdGF0ZSBvZiB0aGUgdGFzayB2aWV3LiZuYnNwOyAKLVRoZW4gY2xvc2UgdGhlIHdvcmtiZW5jaCBhbmQgcmVzdGFydCBpdC4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlIHZpc2libGUgCi1zZXQgb2YgdGFza3MgYW5kIHRoZSBmaWx0ZXJpbmcgb3B0aW9ucyBhcmUgcmVzdG9yZWQuPC9saT4KLTwvb2w+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvVGVzdCBTY2VuYXJpb3MuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9UZXN0IFNjZW5hcmlvcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDNjNjZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9UZXN0IFNjZW5hcmlvcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5Xb3JrYmVuY2ggTWFudWFsIFRlc3QgU2NlbmFyaW9zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+Ci08Yj5NYW51YWwgVGVzdCBTY2VuYXJpb3MgZm9yIHRoZSBXb3JrYmVuY2ggKG9yZy5lY2xpcHNlLnVpKTwvYj48L2gyPgotTGFzdCB1cGRhdGVkIEp1bmUgMiwgMjAwMgotCi08cD4KLTxicj48YSBocmVmPSJXZWxjb21lIEVkaXRvci5odG1sIj5XZWxjb21lIEVkaXRvcjwvYT4KLTxicj48YSBocmVmPSJXaW5kb3cgQWN0aW9ucy5odG1sIj5XaW5kb3cgQWN0aW9uczwvYT4KLTxicj48YSBocmVmPSJXaW5kb3cgTGF5b3V0Lmh0bWwiPldpbmRvdyBMYXlvdXQ8L2E+Ci08YnI+PGEgaHJlZj0iUGVyc2lzdGVuY2UuaHRtbCI+UGVyc2lzdGVuY2U8L2E+Ci08YnI+PGEgaHJlZj0iTmF2aWdhdG9yIFZpZXcuaHRtbCI+TmF2aWdhdG9yIFZpZXc8L2E+Ci08YnI+PGEgaHJlZj0iQ29tbW9uIE5hdmlnYXRvciBSZXNvdXJjZSBWaWV3Lmh0bWwiPkNvbW1vbiBOYXZpZ2F0b3IgUmVzb3VyY2UgVmlldzwvYT4KLTxicj48YSBocmVmPSJPdXRsaW5lIFZpZXcuaHRtbCI+T3V0bGluZSBWaWV3PC9hPgotPGJyPjxhIGhyZWY9IlByb3BlcnRpZXMgVmlldy5odG1sIj5Qcm9wZXJ0aWVzIFZpZXc8L2E+Ci08YnI+PGEgaHJlZj0iQm9va21hcmtzIFZpZXcuaHRtbCI+Qm9va21hcmtzIFZpZXc8L2E+Ci08YnI+PGEgaHJlZj0iVGFza3MgVmlldy5odG1sIj5UYXNrcyBWaWV3PC9hPgotCi08YnI+PGEgaHJlZj0iTmV3IEZpbGUgV2l6YXJkLmh0bWwiPk5ldyBGaWxlIFdpemFyZDwvYT4KLTxicj48YSBocmVmPSJOZXcgRm9sZGVyIFdpemFyZC5odG1sIj5OZXcgRm9sZGVyIFdpemFyZDwvYT4KLTxicj48YSBocmVmPSJOZXcgUHJvamVjdCBXaXphcmQuaHRtbCI+TmV3IFByb2plY3QgV2l6YXJkPC9hPgotPGJyPjxhIGhyZWY9IkZpbGUgU3lzdGVtIEV4cG9ydC5odG1sIj5GaWxlIFN5c3RlbSBFeHBvcnQ8L2E+Ci08YnI+PGEgaHJlZj0iRmlsZSBTeXN0ZW0gSW1wb3J0Lmh0bWwiPkZpbGUgU3lzdGVtIEltcG9ydDwvYT4KLTxicj48YSBocmVmPSJaSVAgRXhwb3J0Lmh0bWwiPlppcCBFeHBvcnQ8L2E+Ci08YnI+PGEgaHJlZj0iWklQIEltcG9ydC5odG1sIj5aaXAgSW1wb3J0PC9hPgotPGJyPjxhIGhyZWY9IlByb3BlcnRpZXMgRGlhbG9nLmh0bWwiPlByb3BlcnRpZXMgRGlhbG9nPC9hPgotPGJyPjxhIGhyZWY9IlByZWZlcmVuY2VzLmh0bWwiPlByZWZlcmVuY2VzPC9hPgotPGJyPiZuYnNwOwotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvVGV4dCBFZGl0b3IgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvVGV4dCBFZGl0b3IKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjc0MjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1RleHQgRWRpdG9yCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4NCi08aHRtbD4NCi08aGVhZD4NCi0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi0gICA8dGl0bGU+VGVzdCBTY2VuYXJpbzogVGV4dCBFZGl0b3I8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi0NCi08aDM+DQotVGV4dCBFZGl0b3I8L2gzPg0KLVB1cnBvc2U6IFRvIHRlc3QgdGhlIFRleHQgRWRpdG9yIGluIEVjbGlwc2UuJm5ic3A7IFdlIHdpbGwgb3BlbiBhIHRleHQNCi1maWxlLCBhZGRpbmcgc29tZSB0ZXh0LCBwbGF5IHdpdGggdGhlIGVkaXQgYWN0aW9ucywgdmVyaWZ5IHRoZSBzYXZlIGFuZA0KLXNhdmUgYXMsIGFuZCB0aGVuIHRlc3QgcGVyc2lzdGFuY2UgYmV0d2VlbiBzZXNzaW9ucy4NCi08cD5TZXR1cDoNCi08b2w+DQotPGxpPg0KLUluc3RhbGwgRWNsaXBzZSBQbGF0Zm9ybS48L2xpPg0KLQ0KLTxsaT4NCi1DcmVhdGUgYSBwcm9qZWN0LjwvbGk+DQotPC9vbD4NCi1NZXRob2Q6DQotPG9sPg0KLTxsaT4NCi1TdGFydCB0aGUgd29ya2JlbmNoLjwvbGk+DQotDQotPGxpPg0KLUludm9rZSBGaWxlID4gTmV3ID4gRmlsZS4mbmJzcDsgQ3JlYXRlIGEgbmV3IHRleHQgZmlsZSB3aXRoIHNvbWUgbmFtZSBsaWtlDQotdGVzdDEudHh0LiZuYnNwOyBWZXJpZnkgdGhhdCBhIG5ldyBlZGl0b3Igb3BlbnMgb24gdGhlIGZpbGUuPC9saT4NCi0NCi08bGk+DQotQ29weSBhbmQgcGFzdGUgdGhlIGZvbGxvd2luZyB0ZXh0IGludG8gdGhlIGVkaXRvciAuLjwvbGk+DQotPC9vbD4NCi0NCi08YmxvY2txdW90ZT5CZXdhcmUgdGhlIGJlYXN0IG1hbiwgZm9yIGhlIGlzIHRoZSBkZXZpbCdzIHBhd24uIEFsb25lIGFtb25nDQotR29kJ3MgcHJpbWF0ZXMsDQotPGJyPmhlIGtpbGxzIGZvciBzcG9ydCwgb3IgbHVzdCBvciBncmVlZC4gWWVzLCBoZSB3aWxsIG11cmRlciBoaXMgYnJvdGhlcg0KLXRvIHBvc3Nlc3MgaGlzDQotPGJyPmJyb3RoZXIncyBsYW5kLiBMZXQgaGltIG5vdCBicmVlZCBpbiBncmVhdCBudW1iZXJzLCBmb3IgaGUgd2lsbCBtYWtlDQotYSBkZXNlcnQgb2YNCi08YnI+aGlzIGhvbWUgYW5kIHlvdXJzLiBTaHVuIGhpbS4gRHJpdmUgaGltIGJhY2sgaW50byBoaXMganVuZ2xlIGxhaXI6DQotRm9yIGhlIGlzIHRoZQ0KLTxicj5oYXJiaW5nZXIgb2YgZGVhdGguDQotPHA+KFBsYW5ldCBvZiB0aGUgQXBlcyk8L2Jsb2NrcXVvdGU+DQotDQotPG9sPg0KLTxsaT4NCi1BZnRlciBwYXN0ZSBoYXMgYmVlbiBwZXJmb3JtZWQgdGhlIGVkaXRvciBzdGF0ZSBzaG91bGQgYmUgZGlydHkuJm5ic3A7DQotVmVyaWZ5IHRoYXQgRmlsZSA+IFNhdmUgaXMgZW5hYmxlZCBhbmQgdGhhdCBTYXZlIGlzIGVuYWJsZWQgaW4gdGhlIGNvbnRleHQNCi1tZW51LiZuYnNwOyBJbnZva2UgU2F2ZSBhbmQgdmVyaWZ5IHRoYXQgc2F2ZSBpcyBkaXNhYmxlZC48L2xpPg0KLQ0KLTxsaT4NCi1UaGUgU2F2ZSBBcyBtZW51IGFjdGlvbiBpcyBhbHdheXMgZW5hYmxlZC4mbmJzcDsgSW52b2tlIHRoaXMgYWN0aW9uIHRvDQotY3JlYXRlIGEgbmV3IGZpbGUsIHNheSB0ZXN0Mi50eHQsIGFuZCB2ZXJpZnkgdGhhdCB0aGUgbmFtZSBvZiB0aGUgbmV3IGZpbGUNCi1uYW1lIGlzIHJlZmxlY3RlZCBpbiB0aGUgZWRpdG9yIHRhYi48L2xpPg0KLQ0KLTxsaT4NCi1Nb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRlc3QyLnR4dCBhbmQgc2F2ZS4mbmJzcDsgVGhlbiBvcGVuIHRlc3QxLnR4dCBhbmQNCi12ZXJpZnkgdGhhdCBpdCBzdGlsbCBjb250YWlucyB0aGUgb3JpZ2luYWwgdGV4dC48L2xpPg0KLQ0KLTxsaT4NCi1JbiB0ZXh0MS50eHQgc2VsZWN0IHRoZSBmaXJzdCAzIGxpbmVzIGFuZCBpbnZva2UgRWRpdCBDb3B5LiZuYnNwOyBBY3RpdmF0ZQ0KLXRleHQyLnR4dCwgcHV0IHRoZSBjdXJzb3IgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGludm9rZSBFZGl0IFBhc3RlLiZuYnNwOw0KLVZlcmlmeSB0aGF0IHRoZSBmaXJzdCAzIGxpbmVzIG9mIHRleHQxLnR4dCBhcmUgY29waWVkIHRvIHRleHQyLnR4dC48L2xpPg0KLQ0KLTxsaT4NCi1JbnZva2UgVW5kbyBhbmQgUmVkbyBhIGZldyB0aW1lcyBpbiB0ZXh0Mi50eHQgdG8gdW5kbyBhbmQgcmVkbyB0aGUgcGFzdGUuPC9saT4NCi0NCi08bGk+DQotU2VsZWN0IGEgZmV3IGxpbmVzIG9mIHRleHQgYW5kIGludm9rZSBTaGlmdCBSaWdodCBhbmQgU2hpZnQgTGVmdCBhIGZldw0KLXRpbWVzLjwvbGk+DQotDQotPGxpPg0KLU5vdyBjbG9zZSB0ZXh0Mi50eHQuJm5ic3A7IFRoZSBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkLCBzbyBhIFNhdmUgZGlhbG9nDQotc2hvdWxkIGFwcGVhci4mbmJzcDsgUHJlc3MgTm8gdG8gYXZvaWQgc2F2aW5nLjwvbGk+DQotDQotPGxpPg0KLU5vdyB3ZSBuZWVkIHRvIHRlc3QgRmluZCAvIFJlcGxhY2UuJm5ic3A7IFNlbGVjdCB0aGUgdGV4dDEudHh0IGVkaXRvci4mbmJzcDsNCi1UaGlzIGZpbGUgY29udGFpbnMgbWFueSBpbnN0YW5jZXMgb2YgaGUgYW5kIGhpcy4mbmJzcDsgSW52b2tlIEZpbmQgLyBSZXBsYWNlDQotYW5kIHJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiBoZSBieSAic2hlIi4mbmJzcDsgWW91IG1heSBmaW5kIHRoYXQgdmFyaW91cw0KLXdvcmRzIGxpa2UgInRoZSIgYXJlIG1vZGlmaWVkIHRvICJ0c2hlIi4mbmJzcDsgQ2xvc2UgdGhlIGZpbmQgZGlhbG9nIGFuZA0KLWludm9rZSBSZXZlcnQgaW4gdGhlIGNvbnRleHQgbWVudS4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlIGZpbGUgY29udGVudHMNCi1hcmUgbm93IGVxdWFsIHRvIHRoZSBvcmlnaW5hbCB0ZXh0LiZuYnNwOyBUaGVuIHRyeSBGaW5kIC8gUmVwbGFjZSBhZ2Fpbg0KLXdpdGggIndob2xlIHdvcmQiIHNlbGVjdGVkIGFuZCB2ZXJpZnkgdGhlIHJlc3VsdHMuPC9saT4NCi0NCi08bGk+DQotT3BlbiB1cCB0ZXh0Mi50eHQuJm5ic3A7IE5vdyB0aGVyZSBzaG91bGQgYmUgb25lIG9wZW4gZWRpdG9yIHdpdGggY2hhbmdzDQotYW5kIG9uZSB3aXRob3V0LjwvbGk+DQotDQotPGxpPg0KLUludm9rZSBGaWxlID4gQ2xvc2UgQWxsLiZuYnNwOyBBdCB0aGlzIHBvaW50IGEgIlNhdmUgUmVzb3VyY2VzIiBkaWFsb2cNCi1zaG91bGQgYXBwZWFyIHdoZXJlIHlvdSBjYW4gc2F2ZSB0aGUgbW9kaWZpZWQgZmlsZXMuJm5ic3A7IENoZWNrIGFsbCBtb2RpZmljYXRpb25zDQotYW5kIHRoZW4gcHJlc3MgIlllcyIuJm5ic3A7IFZlcmlmeSB0aGF0IGFsbCBlZGl0b3JzIGFyZSBjbG9zZWQuJm5ic3A7IFRoZW4NCi1vcGVuIHVwIGFueSBlZGl0b3Igd2hpY2ggd2FzIHNhdmVkIGFuZCB2ZXJpZnkgY2hhbmdlcy48L2xpPg0KLTwvb2w+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvV2VsY29tZSBFZGl0b3IuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9XZWxjb21lIEVkaXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWMzNzU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9XZWxjb21lIEVkaXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5UZXN0IFNjZW5hcmlvOiBXZWxjb21lIEVkaXRvcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz4KLVdlbGNvbWUgRWRpdG9yPC9oMz4KLVB1cnBvc2U6IFRvIHRlc3QgdGhlIFdlbGNvbWUgZWRpdG9yIGluIEVjbGlwc2UuJm5ic3A7IFdlIHdpbGwgc3RhcnQgdGhlCi13b3JrYmVuY2ggYWZ0ZXIgYSBmcmVzaCBpbnN0YWxsLCB2ZXJpZnkgdGhlIHZpc2liaWxpdHkgb2YgdGhlIFdlbGNvbWUgZWRpdG9yLAotYW5kIHRoZW4gdGVzdCB0aGUgZm9ybWF0IGFuZCBsaW5rcy4KLTxwPlNldHVwOgotPG9sPgotPGxpPgotSW5zdGFsbCBFY2xpcHNlIFBsYXRmb3JtLjwvbGk+Ci0KLTxsaT4KLURlbGV0ZSB0aGUgbWV0YWRhdGEgZm9yIG9yZy5lY2xpcHNlLnVpLiZuYnNwOyBUaGlzIHdpbGwgc2ltdWxhdGUgYSBmcmVzaAotaW5zdGFsbC48L2xpPgotPC9vbD4KLU1ldGhvZDoKLTxvbD4KLTxsaT4KLVN0YXJ0IHRoZSB3b3JrYmVuY2guJm5ic3A7IENvbmZpcm0gdGhhdCB0aGUgZGVmYXVsdCBwZXJzcGVjdGl2ZSAoUmVzb3VyY2UpCi1hbmQgV2VsY29tZSBlZGl0b3IgYm90aCBhcHBlYXIuPC9saT4KLQotPGxpPgotQ2xvc2UgdGhlIGVkaXRvciBhbmQgZXhpdCB0aGUgd29ya2JlbmNoLjwvbGk+Ci0KLTxsaT4KLVJlc3RhcnQgdGhlIHdvcmtiZW5jaCBhbmQgdmVyaWZ5IHRoYXQgdGhlIFdlbGNvbWUgZWRpdG9yIGRvZXMgbm90IGFwcGVhci4mbmJzcDsKLVRoZSBlZGl0b3Igb25seSBhcHBlYXJzIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgYSBmcmVzaCBpbnN0YWxsLjwvbGk+Ci0KLTxsaT4KLUludm9rZSBIZWxwID4gV2VsY29tZSBhbmQgdmVyaWZ5IHRoYXQgdGhlIFdlbGNvbWUgZWRpdG9yIG9wZW5zLjwvbGk+Ci0KLTxsaT4KLVRoZSBXZWxjb21lIGVkaXRvciBjb250YWlucyBhIG51bWJlciBvZiBsaW5rcy4gVGVzdCBlYWNoIG9mIHRoZXNlIGxpbmtzCi10byBlbnN1cmUgdGhhdCB0aGUgbGluayBpbnZva2VzIGFuIGFwcHJvcHJpYXRlIGFjdGlvbi48L2xpPgotPC9vbD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1dpbmRvdyBBY3Rpb25zLmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvV2luZG93IEFjdGlvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1OTI1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvV2luZG93IEFjdGlvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlRlc3QgU2NlbmFyaW86IFdpbmRvdyBBY3Rpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPgotV2luZG93IEFjdGlvbnM8L2gzPgotUHVycG9zZTogVG8gdGVzdCB0aGUgc3RhbmRhcmQgbWVudSBhbmQgdG9vbGJhciBhY3Rpb25zIGluIEVjbGlwc2UuJm5ic3A7Ci1XZSB3aWxsIGNyZWF0ZSBhIHByb2plY3QsIG9wZW4gc29tZSBlZGl0b3JzLCB0ZXN0IHRoZSBnbG9iYWwgYWN0aW9ucywgdGVzdAotdGhlIHBlcnNpc3RhbmNlIG9mIHdvcmtiZW5jaCBzdGF0ZSBiZXR3ZWVuIHNlc3Npb25zLgotPHA+U2V0dXA6Ci08b2w+Ci08bGk+Ci1JbnN0YWxsIEVjbGlwc2UgUGxhdGZvcm0uPC9saT4KLQotPGxpPgotRGVsZXRlIHRoZSBtZXRhZGF0YSBmb3Igb3JnLmVjbGlwc2UudWkuPC9saT4KLTwvb2w+Ci1UZXN0aW5nIHRoZSBGaWxlIE1lbnU6Ci08b2w+Ci08bGk+Ci1TdGFydCB0aGUgd29ya2JlbmNoLjwvbGk+Ci0KLTxsaT4KLUludm9rZSBGaWxlID4gTmV3ID4gUHJvamVjdC4mbmJzcDsgQSB3aXphcmQgd2lsbCBhcHBlYXIgd2hlcmUgeW91IGNhbiBzZWxlY3QKLWEgcHJvamVjdCB0eXBlLiZuYnNwOyBTZWxlY3QgZWFjaCBpdGVtIGluIHRoZSBsZWZ0IGhhbmQgdmlld2VyIHRvIHZlcmlmeQotdGhlIGJhc2ljIHBhZ2Ugb3BlcmF0aW9uLiZuYnNwOyBUaGVuIHNlbGVjdCBTaW1wbGUgPiBQcm9qZWN0IGFuZCBwcmVzcwotTmV4dC4mbmJzcDsgVHlwZSAiU2ltcGxlUHJvamVjdCIgYXMgdGhlIG5hbWUgZm9yIHRoZSBwcm9qZWN0IGFuZCBwcmVzcwotRmluaXNoLiZuYnNwOyBWZXJpZnkgdGhhdCBhIG5ldyBSZXNvdXJjZSBwZXJzcGVjdGl2ZSBpcyBjcmVhdGVkIGFuZCB0aGF0Ci1TaW1wbGVQcm9qZWN0IGFwcGVhcnMgaW4gdGhlIE5hdmlnYXRvciB2aWV3LjwvbGk+Ci0KLTxsaT4KLUNyZWF0ZSBhIGZldyBmb2xkZXJzIGFuZCBmaWxlcyAob25lLnR4dCwgdHdvLnR4dCwgdGhyZWUudHh0KSB3aXRoaW4gU2ltcGxlUHJvamVjdC4mbmJzcDsKLUZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgcHJvY2VzcyByZWZlciB0byBTaW1vbidzIHdvcmsgb24gdGhlIE5ldyBXaXphcmQuPC9saT4KLQotPGxpPgotT3BlbiBvbmUudHh0IHdpdGhpbiBhIHRleHQgZWRpdG9yLiZuYnNwOyBWZXJpZnkgdGhhdCBGaWxlID4gQ2xvc2UgYW5kIFNhdmUKLUFzIGFyZSBlbmFibGVkLiZuYnNwOyBWZXJpZnkgdGhhdCBTYXZlIGlzIGRpc2FibGVkLjwvbGk+Ci0KLTxsaT4KLUFkZCB0aGUgZm9sbG93aW5nIHRleHQgdG8gdGhlIGZpbGUuLjwvbGk+Ci0KLTxwPjxicj5GaWxlIE9uZQotPGJyPiZuYnNwOwotPGxpPgotT25jZSB5b3UgbW9kaWZ5IGEgZmlsZSB0aGUgRmlsZSA+IFNhdmUgYWN0aW9uIHNob3VsZCBiZWNvbWUgZW5hYmxlZCBhbmQKLWEgc21hbGwgYXN0ZXJpeCBzaG91bGQgYXBwZWFyIGluIHRoZSBlZGl0b3IgdGFiLiZuYnNwOyBJbnZva2UgU2F2ZSBhbmQKLXZlcmlmeSB0aGF0IHRoZSBhc3Rlcml4IGRpc2FwcGVhcnMgYW5kIHRoYXQgdGhlIEZpbGUgPiBTYXZlIGFjdGlvbiBpcyBkaXNhYmxlZC48L2xpPgotCi08bGk+Ci1PcGVuIHR3by50eHQuJm5ic3A7IEFkZCB0aGUgZm9sbG93aW5nIHRleHQgdG8gdGhlIGZpbGUuLjwvbGk+Ci0KLTxwPjxicj5GaWxlIFR3bwotPGJyPiZuYnNwOwotPGxpPgotT3BlbiB0aHJlZS50eHQgYW5kIGFkZCB0aGUgZm9sbG93aW5nIHRleHQgdG8gdGhlIGZpbGUuLjwvbGk+Ci0KLTxwPjxicj5GaWxlIFRocmVlCi08YnI+Jm5ic3A7Ci08bGk+Ci1JZiB5b3UgY2xvc2UgYW4gZWRpdG9yIHdoaWNoIGlzIGRpcnR5IHRoZSB3b3JrYmVuY2ggc2hvdWxkIGFzayBpZiB5b3Ugd2FudAotdG8gc2F2ZSBpdC4mbmJzcDsgV2l0aCB0aHJlZS50eHQgYWN0aXZlIGludm9rZSBGaWxlID4gQ2xvc2UuJm5ic3A7IFZlcmlmeQotdGhhdCB0aGUgU2F2ZSBkaWFsb2cgYXBwZWFycy4mbmJzcDsgUHJlc3MgWWVzLiZuYnNwOyBUaGVuIHJlb3BlbiB0aGUgZmlsZQotdG8gdmVyaWZ5IHRoYXQgdGhlIHRleHQgd2FzIHNhdmVkLjwvbGk+Ci0KLTxsaT4KLUludm9rZSBGaWxlID4gQ2xvc2UgQWxsLiZuYnNwOyBBdCB0aGlzIHBvaW50IHRoZXJlIGlzIDEgZGlydHkgZWRpdG9yLiZuYnNwOwotVmVyaWZ5IHRoYXQgdGhlIFNhdmUgUmVzb3VyY2VzIGRpYWxvZyBhcHBlYXJzLiZuYnNwOyBQcmVzcyBZZXMuJm5ic3A7IFRoZQotZGlydHkgZWRpdG9ycyBzaG91bGQgYmUgc2F2ZWQgYW5kIGFsbCBlZGl0b3JzIHdpbGwgY2xvc2UuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgRmlsZSA+IENsb3NlLCBDbG9zZSBBbGwsIFNhdmUsIFNhdmUgQXMsIGFuZCBTYXZlIEFsbCBhcmUgZGlzYWJsZWQuPC9saT4KLTwvb2w+Ci1UZXN0aW5nIHRoZSBFZGl0IE1lbnU6Ci08b2w+Ci08bGk+Ci1UaGUgZWRpdCBhY3Rpb25zIHNob3VsZCB0YXJnZXQgdGhlIGFjdGl2ZSB2aWV3IG9yIGVkaXRvci4mbmJzcDsgVG8gdGVzdAotdGhpcyAuLjwvbGk+Ci0KLTxvbD4KLTxsaT4KLVNlbGVjdCBhIGZpbGUgaW4gdGhlIG5hdmlnYXRvciB2aWV3LiZuYnNwOyBJbnZva2UgRWRpdCA+IERlbGV0ZSBhbmQgdmVyaWZ5Ci10aGF0IHRoZSBEZWxldGUgRmlsZSBkaWFsb2cgYXBwZWFycyBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIHRoZSBuYXZpZ2F0b3IuJm5ic3A7Jm5ic3A7Ci1DbG9zZSB0aGUgZGlhbG9nIHdpdGhvdXQgY29tcGxldGluZyB0aGUgZGVsZXRlLjwvbGk+Ci0KLTxsaT4KLVNlbGVjdCB0aGUgZmlsZSBhZ2FpbiBhbmQgaW52b2tlIEVkaXQgPiBBZGQgQm9va21hcmsuJm5ic3A7IE9wZW4gdGhlIEJvb2ttYXJrcwotdmlldyBhbmQgdmVyaWZ5IHRoYXQgYSBib29rbWFyayBleGlzdHMgZm9yIHRoZSBmaWxlLiZuYnNwOyBTZWxlY3QgdGhlIGJvb2ttYXJrLiZuYnNwOwotSW52b2tlIEVkaXQgPiBEZWxldGUgYW5kIHZlcmlmeSB0aGF0IHRoZSBib29rbWFyayBpcyBkZWxldGVkIGluIHRoZSBib29rbWFya3MKLXZpZXcuPC9saT4KLQotPGxpPgotT3BlbiBvbmUudHh0IGluIGEgdGV4dCBlZGl0b3IuJm5ic3A7IFNlbGVjdCBhIHBpZWNlIG9mIHRleHQgYW5kIGludm9rZQotRWRpdCA+IEN1dC4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGV4dCBlZGl0b3IgaXMgY3V0LjwvbGk+Ci08L29sPgotCi08bGk+Ci1DcmVhdGUgYSBmaWxlIG5hbWVkIFguamF2YS4mbmJzcDsgT3BlbiBpdCBpbiBhbiBlZGl0b3IgYW5kIHRoZW4gdmVyaWZ5Ci10aGF0IHRoZSBKYXZhIGVkaXRvciBhY3Rpb25zIGFyZSBjb250cmlidXRlZCB0byB0aGUgd29ya2JlbmNoIG1lbnUgYW5kCi10b29sYmFyLjwvbGk+Ci0KLTxsaT4KLU9wZW4gb25lLnR4dCBpbiBhbiBlZGl0b3IuJm5ic3A7IFZlcmlmeSB0aGF0IHRoZSBqYXZhIGVkaXRvciBhY3Rpb25zIGFyZQotbm8gbG9uZ2VyIHZpc2libGUgaW4gdGhlIHdvcmtiZW5jaC48L2xpPgotCi08bGk+Ci1BY3RpdmF0ZSB0aGUgamF2YSBlZGl0b3IgYW5kIHZlcmlmeSB0aGF0IGl0cyBjb250cmlidXRpb25zIGFwcGVhciBvbmNlCi1hZ2Fpbi48L2xpPgotCi08bGk+Ci1DbG9zZSB0aGUgamF2YSBlZGl0b3IgYW5kIHZlcmlmeSB0aGF0IHRoZSBjb250cmlidXRpb25zIGRpc2FwcGVhci48L2xpPgotPC9vbD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1dpbmRvdyBMYXlvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9XaW5kb3cgTGF5b3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODgxOTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1dpbmRvdyBMYXlvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlRlc3QgU2NlbmFyaW86IFdpbmRvdyBMYXlvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+Ci1XaW5kb3cgTGF5b3V0PC9oMz4KLVB1cnBvc2U6IFRvIHRlc3Qgd2luZG93IGxheW91dCBpbiBFY2xpcHNlLiZuYnNwOyBXZSB3aWxsIG9wZW4gYSBwZXJzcGVjdGl2ZSwKLXRlc3QgdGhlIGxheW91dCBmZWF0dXJlcywgb3BlbiBhIHNlY29uZCBwZXJzcGVjdGl2ZSwgc3dpdGNoIGJldHdlZW4gcGVyc3BlY3RpdmVzLAotYW5kIHRoZW4gY3JlYXRlIHNvbWUgd2luZG93cy4KLTxwPlNldHVwOgotPG9sPgotPGxpPgotSW5zdGFsbCBFY2xpcHNlIFBsYXRmb3JtLjwvbGk+Ci0KLTxsaT4KLUNyZWF0ZSBhIHByb2plY3Qgd2l0aCAzIC50eHQgZmlsZXMuPC9saT4KLQotPGxpPgotRGVsZXRlIHRoZSBtZXRhZGF0YSBmb3Igb3JnLmVjbGlwc2UudWkuPC9saT4KLTwvb2w+Ci1UZXN0aW5nIGEgU2luZ2xlIFBlcnNwZWN0aXZlOgotPG9sPgotPGxpPgotU3RhcnQgdGhlIHdvcmtiZW5jaC48L2xpPgotCi08bGk+Ci1EcmFnIHRoZSBuYXZpZ2F0b3Igb3ZlciB0aGUgc2hvcnRjdXQgYmFyICh0aGUgdmVydGljYWwgdG9vbGJhciBhdCBsZWZ0KS4mbmJzcDsgCi1WZXJpZnkgdGhhdCBhIHN0YWNrIGljb24gYXBwZWFycy4mbmJzcDsgRHJvcCB0aGUgdmlldyBvbiB0aGUgc2hvcnRjdXQgYmFyLiAKLUl0IHNob3VsZCBiZWNvbWUgYSBmYXN0IHZpZXcuPC9saT4KLQotPGxpPgotQ2xpY2sgb24gdGhlIG5hdmlnYXRvciBmYXN0IHZpZXcgYnV0dG9uIHRvIHNob3cgdGhlIHZpZXcuJm5ic3A7IENsaWNrIG9uCi1hbm90aGVyIHZpZXcgdG8gaGlkZSBpdC4mbmJzcDsgWW91IGNhbiBhbHNvIGhpZGUgdGhlIHZpZXcgYnkgY2xpY2tpbmcgb24KLXRoZSAiaGlkZSIgYnV0dG9uIG9yIHRoZSBmYXN0IHZpZXcgYnV0dG9uLjwvbGk+Ci0KLTxsaT4KLUNsb3NlIHRoZSBPdXRsaW5lIHZpZXcuJm5ic3A7IFRoZW4gaW52b2tlIFBlcnNwZWN0aXZlID4gU2hvdyBWaWV3ID4gT3V0bGluZQotdG8gc2hvdyBpdCBhZ2Fpbi4mbmJzcDsgVmVyaWZ5IHRoYXQgaXQgaGFzIHRoZSBzYW1lIHBvc2l0aW9uIGFzIGJlZm9yZS48L2xpPgotCi08bGk+Ci1TZWxlY3QgYSB0ZXh0IGZpbGUgaW4gdGhlIG5hdmlnYXRvciBhbmQgb3BlbiBpdC4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlCi1uYXZpZ2F0b3IgZmFzdCB2aWV3IGlzIGhpZGRlbiBhbmQgYW4gZWRpdG9yIGFwcGVhcnMgaW4gdGhlIGVkaXRvciBhcmVhLjwvbGk+Ci0KLTxsaT4KLU1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciBhbmQgdmVyaWZ5IHRoYXQgRmlsZSA+IFNhdmUgYmVjb21lcyBlbmFibGVkLiZuYnNwOwotU2F2ZSB0aGUgZmlsZSBhbmQgdmVyaWZ5IHRoYXQgRmlsZSA+IFNhdmUgaXMgZGlzYWJsZWQuPC9saT4KLQotPGxpPgotTW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yIGFnYWluIGFuZCBjbG9zZSB0aGUgZWRpdG9yLiZuYnNwOyBWZXJpZnkKLXRoYXQgdGhlIFNhdmUgZGlhbG9nIGFwcGVhcnMgYW5kIHlvdSBjYW4gYW5zd2VyLCB5ZXMsIG5vLCBhbmQgY2FuY2VsLjwvbGk+Ci0KLTxsaT4KLU9wZW4gMyB0ZXh0IGZpbGVzIHdpdGhpbiAzIGVkaXRvcnMuJm5ic3A7IFRoZSBlZGl0b3JzIGFwcGVhciBpbiBhIHNpbmdsZQotZm9sZGVyLjwvbGk+Ci0KLTxsaT4KLURyYWcgb25lIGVkaXRvciBvdXQgb2YgdGhlIGZvbGRlci4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlIHJlbGF0aXZlIHBsYWNlbWVudAotaWNvbnMgYXJlIHNob3duIHdoZW4geW91IGFyZSB0byB0aGUgdG9wLCByaWdodCwgYm90dG9tLCBvciBsZWZ0IG9mIHRoZQotZXhpc3RpbmcgZWRpdG9yIGZvbGRlci4mbmJzcDsgVGhlICJubyBkcm9wIiBpY29uIHNob3VsZCBhcHBlYXIgaWYgeW91IGFyZQotb3ZlciBhIHZpZXcuJm5ic3A7IERyb3AgdGhlIGVkaXRvciBiZWxvdyB0aGUgZXhpc3RpbmcgZm9sZGVyLjwvbGk+Ci0KLTxsaT4KLURyYWcgYW5vdGhlciBlZGl0b3Igb3VyIG9mIHRoZSBmb2xkZXIgb250byB0aGUgc2luZ2xlIHZpZXcuJm5ic3A7IFZlcmlmeQotdGhhdCB0aGUgZmlyc3QgZm9sZGVyIGlzIGRlY29uc3RydWN0ZWQgYW5kIHRoYXQgYSBuZXcgZm9sZGVyIGlzIGNvbnN0cnVjdGVkLjwvbGk+Ci0KLTxsaT4KLU1heGltaXplIHRoZSBhY3RpdmUgZWRpdG9yIGJ5IGNsaWNraW5nIG9uIHRoZSB0aXRsZSBhcmVhLiZuYnNwOyBNaW5pbWl6ZQotaXQgYnkgY2xpY2tpbmcgaW4gdGhlIGFyZWEgYWdhaW4uJm5ic3A7IE1heGltaXplIGl0IGFnYWluIGFuZCB0aGVuIGNsb3NlCi1pdC4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlIHBlcnNwZWN0aXZlIGxheW91dCBpcyByZXN0b3JlZC48L2xpPgotCi08bGk+Ci1EcmFnIGEgYnVuY2ggb2Ygdmlld3Mgb3V0IG9mIHRoZSB3aW5kb3cgdG8gY3JlYXRlIGRldGFjaGVkIHdpbmRvd3MuJm5ic3A7Ci1UcnkgZHJhZ2dpbmcgdGhlc2Ugdmlld3Mgb24gdG9wIG9mIG9uZSBhbm90aGVyIHRvIGNyZWF0ZSBkZXRhY2hlZCBmb2xkZXJzLjwvbGk+Ci0KLTxsaT4KLUludm9rZSBQZXJzcGVjdGl2ZSA+IFJlc2V0LiZuYnNwOyBBbnN3ZXIgeWVzIHRvIHRoZSBkaWFsb2cgYW5kIHZlcmlmeSB0aGF0Ci10aGUgbGF5b3V0IG9mIHRoZSBwZXJzcGVjdGl2ZSBpcyByZXN0b3JlZCB0byB0aGUgb3JpZ2luYWwuPC9saT4KLQotPGxpPgotSW52b2tlIFBlcnNwZWN0aXZlID4gQ2xvc2UgdG8gY2xvc2UgdGhlIHBhZ2UuPC9saT4KLTwvb2w+Ci1QZXJzcGVjdGl2ZSBTYXZlIEFzOgotPG9sPgotPGxpPgotT3BlbiB0aGUgcmVzb3VyY2UgcGVyc3BlY3RpdmUuPC9saT4KLQotPGxpPgotRHJhZyBhIHZpZXcgb250byB0aGUgbGVmdCB0b29sIGJhci4mbmJzcDsgRHJhZyBhbm90aGVyIG91dCBpbnRvIGEgZGV0YWNoZWQKLXdpbmRvdy48L2xpPgotCi08bGk+Ci1JbiBFY2xpcHNlIHlvdSBjYW4gY3VzdG9taXplIHRoZSBhY3Rpb25zIHZpc2libGUgaW4gYSBwZXJzcGVjdGl2ZS4mbmJzcDsKLUludm9rZSBQZXJzcGVjdGl2ZSA+IEN1c3RvbWl6ZSBhbmQgc2VsZWN0IHNvbWUgbmV3IHZpZXdzIGFuZCBhY3Rpb25zLiZuYnNwOwotUHJlc3MgT0sgYW5kIHZlcmlmeSB0aGF0IHRoZSBuZXcgYWN0aW9ucyBhcHBlYXIgaW4gdGhlIG1lbnUgYW5kIHRvb2xiYXIuPC9saT4KLQotPGxpPgotSW52b2tlIFBlcnNwZWN0aXZlID4gU2F2ZSBBcyBhbmQgc2VsZWN0IHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZS4mbmJzcDsKLVByZXNzIE9LIGFuZCBhbnN3ZXIgeWVzIHRvIHRoZSB2ZXJpZnkgZGlhbG9nLjwvbGk+Ci0KLTxsaT4KLUNsb3NlIHRoZSBwZXJzcGVjdGl2ZS48L2xpPgotCi08bGk+Ci1PcGVuIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZS4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlIG5ldyBwYWdlIGhhcyB0aGUgc2FtZQotbGF5b3V0IGFuZCB2aXNpYmxlIGFjdGlvbiBzZXRzIGFzIHlvdSBjcmVhdGVkIGFuZCBzYXZlZC48L2xpPgotCi08bGk+Ci1DbG9zZSB0aGUgcGVyc3BlY3RpdmUuPC9saT4KLQotPGxpPgotT3BlbiB1cCB0aGUgUHJlZmVyZW5jZXMgZGlhbG9nIGFuZCB2aWV3IHRoZSBQZXJzcGVjdGl2ZXMgcGFnZS4mbmJzcDsgU2VsZWN0Ci10aGUgUmVzb3VyY2Ugb25lIGFuZCBwcmVzcyBSZXNldC48L2xpPgotCi08bGk+Ci1PcGVuIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZS4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlIG5ldyBwYWdlIGhhcyB0aGUgZGVmYXVsdAotbGF5b3V0LjwvbGk+Ci0KLTxsaT4KLURyYWcgYSB2aWV3IG9udG8gdGhlIGxlZnQgdG9vbCBiYXIuJm5ic3A7IERyYWcgYW5vdGhlciBvdXQgaW50byBhIGRldGFjaGVkCi13aW5kb3cuPC9saT4KLQotPGxpPgotSW52b2tlIFBlcnNwZWN0aXZlID4gU2F2ZSBBcyBhbmQgdHlwZSB0aGUgbmFtZSBvZiBhIG5ldyBwZXJzcGVjdGl2ZSAoaWUKLUJvYikuJm5ic3A7IFByZXNzIE9LIGFuZCB0aGVuIHZlcmlmeSB0aGF0IHRoZSB3aW5kb3cgdGl0bGUgY2hhbmdlcyB0byByZWZsZWN0Ci10aGUgbmV3IHBlcnNwZWN0aXZlLjwvbGk+Ci0KLTxsaT4KLUNsb3NlIGFsbCBwZXJzcGVjdGl2ZXM8L2xpPgotCi08bGk+Ci1PcGVuIGEgbmV3IFJlc291cmNlIHBlcnNwZWN0aXZlIGFuZCBhIEJvYiBwZXJzcGVjdGl2ZS4mbmJzcDsgVmVyaWZ5IHRoYXQKLXRoZSBmaXJzdCBoYXMgdGhlIGRlZmF1bHQgbGF5b3V0IGFuZCB0aGF0IHRoZSBzZWNvbmQgaGFzIHlvdXIgY3VzdG9tIGxheW91dC48L2xpPgotPC9vbD4KLVRlc3RpbmcgVHdvIG9yIE1vcmUgUGVyc3BlY3RpdmVzOgotPG9sPgotPGxpPgotQ2xvc2UgYWxsIFBlcnNwZWN0aXZlczwvbGk+Ci0KLTxsaT4KLU9wZW4gYSBSZXNvdXJjZSBwZXJzcGVjdGl2ZS4mbmJzcDsgVmVyaWZ5IHRoYXQgYSBuZXcgcGFnZSBhcHBlYXJzIGluIHRoZQotd2luZG93IHdpdGggdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLjwvbGk+Ci0KLTxsaT4KLUluIHRoZSBOYXZpZ2F0b3Igc2VsZWN0IHlvdXIgcHJvamVjdCBhbmQgaW52b2tlIE9wZW4gUGVyc3BlY3RpdmUgPiBKYXZhLiZuYnNwOwotVmVyaWZ5IHRoYXQgYSBuZXcgcGVyc3BlY3RpdmUgYXBwZWFycyB3aXRoIHRoZSBKYXZhIFBlcnNwZWN0aXZlIGFuZCB0aGF0Ci10aGUgaW5wdXQgZm9yIHRoZSBuYXZpZ2F0b3IgaXMgdGhlIHByb2plY3QuJm5ic3A7IENvb2w6IFBlcnNwZWN0aXZlcyBzdXBwb3J0Ci1zY29waW5nICEhPC9saT4KLQotPGxpPgotSW4gdGhlIEphdmEgcGVyc3BlY3RpdmUgb3BlbiBvbmUgb2YgdGhlIHRleHQgZmlsZXMgaW4gYW4gZWRpdG9yLjwvbGk+Ci0KLTxsaT4KLURyYWcgYSBjb3VwbGUgb2Ygdmlld3Mgb3V0IG9mIHRoZSB3aW5kb3cgdG8gY3JlYXRlIGRldGFjaGVkIHdpbmRvd3MuPC9saT4KLQotPGxpPgotTW9kaWZ5IHRoZSBhY3Rpb24gc2V0cy48L2xpPgotCi08bGk+Ci1Td2l0Y2ggYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgdHdvIHBhZ2VzIGluIHRoZSB3aW5kb3cgYnkgY2xpY2tpbmcgaW4KLXRoZSBsZWZ0IGhhbmQgdG9vbCBiYXIuJm5ic3A7IFRoZSBhY3RpdmUgcGVyc3BlY3RpdmUgY29udHJvbHMgdGhlIHZpc2libGUKLWFjdGlvbiBzZXRzLCB2aWV3cyBhbmQgZWRpdG9ycyBpbiB0aGUgd2luZG93LiZuYnNwOyBJZiB5b3Ugc3dpdGNoIGJldHdlZW4KLXR3byBwYWdlcyB0aGVzZSBhdHRyaWJ1dGVzIHNob3VsZCBjaGFuZ2UuPC9saT4KLQotPGxpPgotVHJ5IFBlcnNwZWN0aXZlID4gTmV4dCBhbmQgUHJldmlvdXMuPC9saT4KLQotPGxpPgotQ2xvc2UgdGhlIHNlY29uZCBwZXJzcGVjdGl2ZSBieSBpbnZva2luZyBQZXJzcGVjdGl2ZSA+IENsb3NlLiZuYnNwOyBWZXJpZnkKLXRoYXQgdGhlIGZpcnN0IHBlcnNwZWN0aXZlIGlzIGFjdGl2YXRlZC48L2xpPgotPC9vbD4KLU11bHRpcGxlIFdpbmRvd3MKLTxvbD4KLTxsaT4KLVN0YXJ0IHdpdGggb25lIG9wZW4gd2luZG93IHdoaWNoIGhhcyBvbmUgcGVyc3BlY3RpdmUuPC9saT4KLQotPGxpPgotQ2hhbmdlIHRoZSBXb3JrYmVuY2ggUHJlZmVyZW5jZXMgZm9yICJPcGVuIFBlcnNwZWN0aXZlIiB0byAiT3BlbiBpbiBOZXcKLVdpbmRvdyIuJm5ic3A7IFRoZW4gb3BlbiBhIEphdmEgcGVyc3BlY3RpdmUgYW5kIHZlcmlmeSB0aGF0IGEgbmV3IHdpbmRvdwotaXMgY3JlYXRlZC48L2xpPgotCi08bGk+Ci1BIGxpc3Qgb2YgdGhlIG9wZW4gd2luZG93cyBzaG91bGQgYXBwZWFyIGluIHRoZSBXaW5kb3cgbWVudS4mbmJzcDsgU2VsZWN0Ci10aGVzZSBpdGVtcyB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgd2luZG93cy48L2xpPgotCi08bGk+Ci1DbG9zZSBvbmUgd2luZG93IGFuZCB2ZXJpZnkgdGhhdCB0aGUgb3RoZXIgaXMgYWN0aXZhdGVkLjwvbGk+Ci0KLTxsaT4KLUNsb3NlIHRoZSBsYXN0IHdpbmRvdyBhbmQgdmVyaWZ5IHRoYXQgdGhlIHdvcmtiZW5jaCBzaHV0cyBkb3duLjwvbGk+Ci08L29sPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvWklQIEV4cG9ydC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvTWFudWFsIFNjZW5hcmlvIFRlc3RzL1pJUCBFeHBvcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1Y2M0Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvWklQIEV4cG9ydC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9Ik9USSBFbXBsb3llZSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NSBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+WklQIEV4cG9ydDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGNlbnRlcj4KLTxoMT4KLVpJUCBFeHBvcnQ8L2gxPjwvY2VudGVyPgotCi08aDI+Ci1QdXJwb3NlPC9oMj4KLVRoZSBwbGFuIGlzIHRvIGV4cG9ydCBhIHByb2plY3Qgd2l0aCBhIGxhcmdlIG51bWJlciBmaWxlcy9mb2xkZXJzIGF0IGEKLXRpbWUsIHVzaW5nIHRoZSB6aXAgZmlsZSB3aXphcmQuIFRoZSByZXN1bHRzIHNob3VsZCBiZSBpbmRlbnRpY2FsIGluIGxheW91dAotYW5kIGNvbnRlbnQgYXMgdGhlIG9yaWdpbmFsIHByb2plY3QgdXNlZC4KLTxoMj4KLVNldHVwPC9oMj4KLQotPHVsPgotPGxpPgotRG93bmxvYWQgdGhlIEpVbml0IHppcCBmaWxlIHNvdXJjZSBjb2RlIGZyb20gd3d3Lmp1bml0Lm9yZy48L2xpPgotCi08bGk+Ci1TdGFydCB0aGUgRWNsaXBzZSB3b3JrYmVuY2g8L2xpPgotCi08bGk+Ci1DcmVhdGUgYSBuZXcgdGVtcG9yYXJ5ICJzaW1wbGUiIHByb2plY3QgY2FsbGVkICJKVW5pdCBUZXN0IjwvbGk+Ci0KLTxsaT4KLUltcG9ydCB0aGUgSlVuaXQgemlwIGZpbGUgaW50byB0aGUgcHJvamVjdDwvbGk+Ci0KLTxsaT4KLVNlbGVjdCBGaWxlIC0+IEV4cG9ydCwgc2VsZWN0IFppcCBGaWxlIGFuZCBwcmVzcyBOZXh0LjwvbGk+Ci08L3VsPgotCi08aDI+Ci1FeHBvcnQgZnJvbSBhIHByb2plY3QgdG8gYSBuZXcgemlwIGZpbGU8L2gyPgotCi08b2w+Ci08bGk+Ci1TZWxlY3QgdGhlICJKVW5pdCBUZXN0IiBwcm9qZWN0IGFuZCBtYXJrIGl0IGFzIGNoZWNrZWQuPC9saT4KLQotPGxpPgotSW4gdGhlIFppcCBGaWxlIGZpZWxkLCB0eXBlIGluIHRoZSBmaWxlbmFtZSBmb3IgdGhlIG5ldyB6aXAgZmlsZS48L2xpPgotCi08bGk+Ci1QcmVzcyBGaW5pc2g8L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgY29udGVudHMgaW4gdGhlIHppcCBmaWxlIG1hdGNoIHRoZSBzYW1lIGZpbGUgYW5kIGZvbGRlcgotc3RydWN0dXJlIGFzIHRoZSBzb3VyY2UgcHJvamVjdDwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGUgY29udGVudCBvZiB0aGUgZmlsZXMuPC9saT4KLTwvb2w+Ci0KLTxoMj4KLUV4cG9ydCBmcm9tIGEgcHJvamVjdCB0byBhbiBleGlzdGluZyB6aXAgZmlsZTwvaDI+Ci0KLTxvbD4KLTxsaT4KLVNlbGVjdCB0aGUgIkpVbml0IFRlc3QiIHByb2plY3QgYW5kIG1hcmsgaXQgYXMgY2hlY2tlZC48L2xpPgotCi08bGk+Ci1JbiB0aGUgWmlwIEZpbGUgZmllbGQsIHR5cGUgaW4gdGhlIGZpbGVuYW1lIGZvciB0aGUgZXhpc3RpbmcgemlwIGZpbGUuPC9saT4KLQotPGxpPgotUHJlc3MgRmluaXNoPC9saT4KLQotPGxpPgotQ2xpY2sgT0sgaW4gdGhlIGRpYWxvZyB0aGF0IGFwcGVhcnMgY29uZmlybWluZyB0aGUgb3ZlcndyaXRlPC9saT4KLQotPGxpPgotVmVyaWZ5IHlvdSB3ZXJlIHByb21wdGVkIHRvIG92ZXJ3cml0ZSBmaWxlczwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZSBjb250ZW50cyBpbiB0aGUgemlwIGZpbGUgbWF0Y2ggdGhlIHNhbWUgZmlsZSBhbmQgZm9sZGVyCi1zdHJ1Y3R1cmUgYXMgdGhlIHNvdXJjZSBwcm9qZWN0LjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGUgY29udGVudCBvZiB0aGUgZmlsZXMuPC9saT4KLTwvb2w+Ci0KLTxoMj4KLUNsZWFudXA8L2gyPgotCi08dWw+Ci08bGk+Ci1EZWxldGUgdGhlIHRlbXBvcmFyeSBwcm9qZWN0ICJKVW5pdCBUZXN0IjwvbGk+Ci0KLTxsaT4KLURlbGV0ZSB0aGUgdGVtcG9yYXJ5IGphciBmaWxlPC9saT4KLTwvdWw+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9aSVAgSW1wb3J0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9NYW51YWwgU2NlbmFyaW8gVGVzdHMvWklQIEltcG9ydC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDVhMmRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL01hbnVhbCBTY2VuYXJpbyBUZXN0cy9aSVAgSW1wb3J0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iT1RJIEVtcGxveWVlIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5aSVAgSW1wb3J0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08Y2VudGVyPgotPGgxPgotWklQIEltcG9ydDwvaDE+PC9jZW50ZXI+Ci0KLTxoMj4KLVB1cnBvc2U8L2gyPgotVGhlIHBsYW4gaXMgdG8gaW1wb3J0IGEgbGFyZ2UgbnVtYmVyIGZpbGVzL2ZvbGRlcnMgYXQgYSB0aW1lLCB1c2luZyB0aGUKLVpJUCBmaWxlIHdpemFyZC4gVGhlIHJlc3VsdHMgc2hvdWxkIGJlIGluZGVudGljYWwgaW4gbGF5b3V0IGFuZCBjb250ZW50Ci1hcyB0aGUgb3JpZ2luYWwgc291cmNlIHVzZWQuCi08aDI+Ci1TZXR1cDwvaDI+Ci0KLTx1bD4KLTxsaT4KLURvd25sb2FkIHRoZSBKVW5pdCB6aXAgZmlsZSBzb3VyY2UgY29kZSBmcm9tIHd3dy5qdW5pdC5vcmcuPC9saT4KLQotPGxpPgotU3RhcnQgdGhlIEVjbGlwc2Ugd29ya2JlbmNoPC9saT4KLQotPGxpPgotQ3JlYXRlIGEgbmV3IHRlbXBvcmFyeSAic2ltcGxlIiBwcm9qZWN0IGNhbGxlZCAiSlVuaXQgVGVzdCI8L2xpPgotCi08bGk+Ci1TZWxlY3QgRmlsZSAtPiBJbXBvcnQsIHNlbGVjdCBaaXAgRmlsZSBhbmQgcHJlc3MgTmV4dC48L2xpPgotPC91bD4KLQotPGgyPgotSW1wb3J0IGludG8gYW4gZW1wdHkgcHJvamVjdDwvaDI+Ci0KLTxvbD4KLTxsaT4KLUNsaWNrIHRoZSBCcm93c2UgYnV0dG9uIGFuZCBzZWxlY3QgdGhlIFpJUCBmaWxlLjwvbGk+Ci0KLTxsaT4KLUV4cGFuZCB0aGUgZm9sZGVycyBpbiB0aGUgdHJlZSB2aWV3IGFuZCB1bnRpbCAianVuaXQiIGZvbGRlciBpcyB2aXNpYmxlCi1hbmQgY2hlY2sgbWFyayB0aGUgYm94IG5leHQgdG8gaXQuIERlc2VsZWN0IHRoZSAiZG9jIiBhbmQgImphdmFkb2MiIGZvbGRlcnMuPC9saT4KLQotPGxpPgotVHlwZSBpbiAiSlVuaXQgVGVzdCIgaW4gdGhlIEZvbGRlciBmaWVsZDwvbGk+Ci0KLTxsaT4KLVByZXNzIEZpbmlzaDwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgcHJvamVjdCBtYXRjaCB0aGUgc2FtZSBmaWxlIGFuZCBmb2xkZXIKLXN0cnVjdHVyZSBhcyB0aGUgc291cmNlIGluIHRoZSBmaWxlIHN5c3RlbS48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgZmlsZXMuPC9saT4KLTwvb2w+Ci0KLTxoMj4KLUltcG9ydCBpbnRvIGEgcHJvamVjdCB3aXRoIHNhbWUgY29udGVudHMgKG92ZXJ3cml0ZSk8L2gyPgotCi08b2w+Ci08bGk+Ci1DbGljayBvbiB0aGUgWmlwIEZpbGUgZHJvcCBkb3duIGJveCBhbmQgc2VsZWN0IHRoZSB6aXAgZmlsZTwvbGk+Ci0KLTxsaT4KLUV4cGFuZCB0aGUgZm9sZGVycyBpbiB0aGUgdHJlZSB2aWV3IGFuZCB1bnRpbCAianVuaXQiIGZvbGRlciBpcyB2aXNpYmxlCi1hbmQgY2hlY2sgbWFyayB0aGUgYm94IG5leHQgdG8gaXQuJm5ic3A7IERlc2VsZWN0IHRoZSAiZG9jIiBhbmQgImphdmFkb2MiCi1mb2xkZXJzLjwvbGk+Ci0KLTxsaT4KLVR5cGUgaW4gIkpVbml0IFRlc3QiIGluIHRoZSBGb2xkZXIgZmllbGQ8L2xpPgotCi08bGk+Ci1DaGVjayB0aGUgb3B0aW9uICJPdmVyd3JpdGUgZXhpc3RpbmcgcmVzb3VyY2VzIHdpdGhvdXQgd2FybmluZyI8L2xpPgotCi08bGk+Ci1QcmVzcyBGaW5pc2g8L2xpPgotCi08bGk+Ci1WZXJpZnkgeW91IHdlcmUgbm90IHByb21wdGVkIHRvIG92ZXJ3cml0ZSBmaWxlczwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgcHJvamVjdCBtYXRjaCB0aGUgc2FtZSBmaWxlIGFuZCBmb2xkZXIKLXN0cnVjdHVyZSBhcyB0aGUgc291cmNlIGluIHRoZSBmaWxlIHN5c3RlbS48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgZmlsZXMuPC9saT4KLTwvb2w+Ci0KLTxoMj4KLUNsZWFudXA8L2gyPgotCi08dWw+Ci08bGk+Ci1EZWxldGUgdGhlIHRlbXBvcmFyeSBwcm9qZWN0ICJKVW5pdCBUZXN0IjwvbGk+Ci08L3VsPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmMzkyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLnVpdGVzdHMuamFyID0gRWNsaXBzZSBKRmFjZSBUZXN0cy8sXAotICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZSBVSSBUZXN0cy8sXAotICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZSBQYXJ0IFJlZmVyZW5jZXMgVGVzdC8KLWJpbi5pbmNsdWRlcyA9IGljb25zLyxcCi0gICAgICAgICAgICAgICBkb2MvLFwKLSAgICAgICAgICAgICAgIGRhdGEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5odG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgICoueG1sLFwKLSAgICAgICAgICAgICAgIHVpU25pZmYsXAotICAgICAgICAgICAgICAgdWlTbmlmZi5iYXQsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL1BlcnNwZWN0aXZlU3dpdGNoU291cmNlQ29kZS50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL1BlcnNwZWN0aXZlU3dpdGNoU291cmNlQ29kZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNzhjZjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9QZXJzcGVjdGl2ZVN3aXRjaFNvdXJjZUNvZGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hQaXBlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVXRpbCB7Ci0JCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTb3J0ZWRNYXAgRU1QVFlfU09SVEVEX01BUCA9IENvbGxlY3Rpb25zCi0gICAgICAgICAgICAudW5tb2RpZmlhYmxlU29ydGVkTWFwKG5ldyBUcmVlTWFwKCkpOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTb3J0ZWRTZXQgRU1QVFlfU09SVEVEX1NFVCA9IENvbGxlY3Rpb25zCi0gICAgICAgICAgICAudW5tb2RpZmlhYmxlU29ydGVkU2V0KG5ldyBUcmVlU2V0KCkpOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWkVST19MRU5HVEhfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCBhIHN0cmluZyBpcyBub3QgbnVsbC4gQ29udmVydHMgbnVsbCBzdHJpbmdzIGludG8gZW1wdHkKLQkgKiBzdHJpbmdzLCBhbmQgbGVhdmVzIGFueSBvdGhlciBzdHJpbmcgdW5tb2RpZmllZC4gVXNlIHRoaXMgdG8gaGVscAotCSAqIHdyYXAgY2FsbHMgdG8gbWV0aG9kcyB0aGF0IHJldHVybiBudWxsIGluc3RlYWQgb2YgdGhlIGVtcHR5IHN0cmluZy4KLQkgKiBDYW4gYWxzbyBoZWxwIHByb3RlY3QgYWdhaW5zdCBpbXBsZW1lbnRhdGlvbiBlcnJvcnMgaW4gbWV0aG9kcyB0aGF0Ci0JICogYXJlIG5vdCBzdXBwb3NlZCB0byByZXR1cm4gbnVsbC4gCi0JICogCi0JICogQHBhcmFtIGlucHV0IGlucHV0IHN0cmluZyAobWF5IGJlIG51bGwpCi0JICogQHJldHVybiBpbnB1dCBpZiBub3QgbnVsbCwgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBpbnB1dCBpcyBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2FmZVN0cmluZyhTdHJpbmcgaW5wdXQpIHsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCXJldHVybiBpbnB1dDsKLQkJfQotCQkKLQkJcmV0dXJuIFpFUk9fTEVOR1RIX1NUUklORzsKLQl9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEluc3RhbmNlKE9iamVjdCBvYmplY3QsIENsYXNzIGMpIHsKLSAgICAgICAgYXNzZXJ0SW5zdGFuY2Uob2JqZWN0LCBjLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEluc3RhbmNlKE9iamVjdCBvYmplY3QsIENsYXNzIGMsIGJvb2xlYW4gYWxsb3dOdWxsKSB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCAmJiBhbGxvd051bGwpIHJldHVybjsKLQotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwgfHwgYyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIGVsc2UgaWYgKCFjLmlzSW5zdGFuY2Uob2JqZWN0KSkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoYm9vbGVhbiBsZWZ0LCBib29sZWFuIHJpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBsZWZ0ID09IGZhbHNlID8gKHJpZ2h0ID09IHRydWUgPyAtMSA6IDApIDogMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKENvbXBhcmFibGUgbGVmdCwgQ29tcGFyYWJsZSByaWdodCkgewotICAgICAgICBpZiAobGVmdCA9PSBudWxsICYmIHJpZ2h0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgZWxzZSBpZiAobGVmdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBlbHNlIGlmIChyaWdodCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBsZWZ0LmNvbXBhcmVUbyhyaWdodCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShDb21wYXJhYmxlW10gbGVmdCwgQ29tcGFyYWJsZVtdIHJpZ2h0KSB7Ci0gICAgICAgIGlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBlbHNlIGlmIChsZWZ0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGVsc2UgaWYgKHJpZ2h0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpbnQgbCA9IGxlZnQubGVuZ3RoOwotICAgICAgICAgICAgaW50IHIgPSByaWdodC5sZW5ndGg7Ci0KLSAgICAgICAgICAgIGlmIChsICE9IHIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGwgLSByOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBhcmVUbyA9IGNvbXBhcmUobGVmdFtpXSwgcmlnaHRbaV0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJlVG8gIT0gMCkgcmV0dXJuIGNvbXBhcmVUbzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoaW50IGxlZnQsIGludCByaWdodCkgewotICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoTGlzdCBsZWZ0LCBMaXN0IHJpZ2h0KSB7Ci0gICAgICAgIGlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBlbHNlIGlmIChsZWZ0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGVsc2UgaWYgKHJpZ2h0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpbnQgbCA9IGxlZnQuc2l6ZSgpOwotICAgICAgICAgICAgaW50IHIgPSByaWdodC5zaXplKCk7Ci0KLSAgICAgICAgICAgIGlmIChsICE9IHIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGwgLSByOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBhcmVUbyA9IGNvbXBhcmUoKENvbXBhcmFibGUpIGxlZnQuZ2V0KGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb21wYXJhYmxlKSByaWdodC5nZXQoaSkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJlVG8gIT0gMCkgcmV0dXJuIGNvbXBhcmVUbzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoT2JqZWN0IGxlZnQsIE9iamVjdCByaWdodCkgewotICAgICAgICBpZiAobGVmdCA9PSBudWxsICYmIHJpZ2h0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgZWxzZSBpZiAobGVmdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBlbHNlIGlmIChyaWdodCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBsZWZ0LnRvU3RyaW5nKCkuY29tcGFyZVRvKHJpZ2h0LnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaWZmKE1hcCBsZWZ0LCBNYXAgcmlnaHQsIFNldCBsZWZ0T25seSwgU2V0IGRpZmZlcmVudCwKLSAgICAgICAgICAgIFNldCByaWdodE9ubHkpIHsKLSAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsIHx8IGxlZnRPbmx5ID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCBkaWZmZXJlbnQgPT0gbnVsbCB8fCByaWdodE9ubHkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGxlZnQua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0gaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoIXJpZ2h0LmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgICAgICAgICAgbGVmdE9ubHkuYWRkKGtleSk7Ci0gICAgICAgICAgICBlbHNlIGlmICghVXRpbC5lcXVhbHMobGVmdC5nZXQoa2V5KSwgcmlnaHQuZ2V0KGtleSkpKQotICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQuYWRkKGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpdGVyYXRvciA9IHJpZ2h0LmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKCFsZWZ0LmNvbnRhaW5zS2V5KGtleSkpIHJpZ2h0T25seS5hZGQoa2V5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaWZmKFNldCBsZWZ0LCBTZXQgcmlnaHQsIFNldCBsZWZ0T25seSwgU2V0IHJpZ2h0T25seSkgewotICAgICAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwgfHwgbGVmdE9ubHkgPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8IHJpZ2h0T25seSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGxlZnQuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoIXJpZ2h0LmNvbnRhaW5zKG9iamVjdCkpIGxlZnRPbmx5LmFkZChvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaXRlcmF0b3IgPSByaWdodC5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmICghbGVmdC5jb250YWlucyhvYmplY3QpKSByaWdodE9ubHkuYWRkKG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGgoTGlzdCBsZWZ0LCBMaXN0IHJpZ2h0LCBib29sZWFuIGVxdWFscykgewotICAgICAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaW50IGwgPSBsZWZ0LnNpemUoKTsKLSAgICAgICAgICAgIGludCByID0gcmlnaHQuc2l6ZSgpOwotCi0gICAgICAgICAgICBpZiAociA+IGwgfHwgIWVxdWFscyAmJiByID09IGwpIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbHMobGVmdC5nZXQobCAtIGkgLSAxKSwgcmlnaHQuZ2V0KHIgLSBpIC0gMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmRzV2l0aChPYmplY3RbXSBsZWZ0LCBPYmplY3RbXSByaWdodCwgYm9vbGVhbiBlcXVhbHMpIHsKLSAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGludCBsID0gbGVmdC5sZW5ndGg7Ci0gICAgICAgICAgICBpbnQgciA9IHJpZ2h0Lmxlbmd0aDsKLQotICAgICAgICAgICAgaWYgKHIgPiBsIHx8ICFlcXVhbHMgJiYgciA9PSBsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcjsgaSsrKQotICAgICAgICAgICAgICAgIGlmICghZXF1YWxzKGxlZnRbbCAtIGkgLSAxXSwgcmlnaHRbciAtIGkgLSAxXSkpIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGJvb2xlYW4gbGVmdCwgYm9vbGVhbiByaWdodCkgewotICAgICAgICByZXR1cm4gbGVmdCA9PSByaWdodDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKLSAgICAgICAgcmV0dXJuIGxlZnQgPT0gcmlnaHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBsZWZ0ID09IG51bGwgPyByaWdodCA9PSBudWxsIDogKChyaWdodCAhPSBudWxsKSAmJiBsZWZ0Ci0gICAgICAgICAgICAgICAgLmVxdWFscyhyaWdodCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGJvb2xlYW4gYikgewotICAgICAgICByZXR1cm4gYiA/IEJvb2xlYW4uVFJVRS5oYXNoQ29kZSgpIDogQm9vbGVhbi5GQUxTRS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsID8gb2JqZWN0Lmhhc2hDb2RlKCkgOiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBzYWZlQ29weShDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIENsYXNzIGMpIHsKLSAgICAgICAgcmV0dXJuIHNhZmVDb3B5KGNvbGxlY3Rpb24sIGMsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gc2FmZUNvcHkoQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBDbGFzcyBjLAotICAgICAgICAgICAgYm9vbGVhbiBhbGxvd051bGxFbGVtZW50cykgewotICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsIHx8IGMgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgY29sbGVjdGlvbiA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24obmV3IEFycmF5TGlzdChjb2xsZWN0aW9uKSk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgICBhc3NlcnRJbnN0YW5jZShpdGVyYXRvci5uZXh0KCksIGMsIGFsbG93TnVsbEVsZW1lbnRzKTsKLQotICAgICAgICByZXR1cm4gY29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Qgc2FmZUNvcHkoTGlzdCBsaXN0LCBDbGFzcyBjKSB7Ci0gICAgICAgIHJldHVybiBzYWZlQ29weShsaXN0LCBjLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHNhZmVDb3B5KExpc3QgbGlzdCwgQ2xhc3MgYywgYm9vbGVhbiBhbGxvd051bGxFbGVtZW50cykgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsIHx8IGMgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgbGlzdCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobmV3IEFycmF5TGlzdChsaXN0KSk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgICBhc3NlcnRJbnN0YW5jZShpdGVyYXRvci5uZXh0KCksIGMsIGFsbG93TnVsbEVsZW1lbnRzKTsKLQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBzYWZlQ29weShNYXAgbWFwLCBDbGFzcyBrZXlDbGFzcywgQ2xhc3MgdmFsdWVDbGFzcykgewotICAgICAgICByZXR1cm4gc2FmZUNvcHkobWFwLCBrZXlDbGFzcywgdmFsdWVDbGFzcywgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBzYWZlQ29weShNYXAgbWFwLCBDbGFzcyBrZXlDbGFzcywgQ2xhc3MgdmFsdWVDbGFzcywKLSAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dOdWxsS2V5cywgYm9vbGVhbiBhbGxvd051bGxWYWx1ZXMpIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsIHx8IGtleUNsYXNzID09IG51bGwgfHwgdmFsdWVDbGFzcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0gICAgICAgIG1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChuZXcgSGFzaE1hcChtYXApKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGFzc2VydEluc3RhbmNlKGVudHJ5LmdldEtleSgpLCBrZXlDbGFzcywgYWxsb3dOdWxsS2V5cyk7Ci0gICAgICAgICAgICBhc3NlcnRJbnN0YW5jZShlbnRyeS5nZXRWYWx1ZSgpLCB2YWx1ZUNsYXNzLCBhbGxvd051bGxWYWx1ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNldCBzYWZlQ29weShTZXQgc2V0LCBDbGFzcyBjKSB7Ci0gICAgICAgIHJldHVybiBzYWZlQ29weShzZXQsIGMsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNldCBzYWZlQ29weShTZXQgc2V0LCBDbGFzcyBjLCBib29sZWFuIGFsbG93TnVsbEVsZW1lbnRzKSB7Ci0gICAgICAgIGlmIChzZXQgPT0gbnVsbCB8fCBjID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0gICAgICAgIHNldCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldChzZXQpKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXQuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICAgICAgYXNzZXJ0SW5zdGFuY2UoaXRlcmF0b3IubmV4dCgpLCBjLCBhbGxvd051bGxFbGVtZW50cyk7Ci0KLSAgICAgICAgcmV0dXJuIHNldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZE1hcCBzYWZlQ29weShTb3J0ZWRNYXAgc29ydGVkTWFwLCBDbGFzcyBrZXlDbGFzcywKLSAgICAgICAgICAgIENsYXNzIHZhbHVlQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIHNhZmVDb3B5KHNvcnRlZE1hcCwga2V5Q2xhc3MsIHZhbHVlQ2xhc3MsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRNYXAgc2FmZUNvcHkoU29ydGVkTWFwIHNvcnRlZE1hcCwgQ2xhc3Mga2V5Q2xhc3MsCi0gICAgICAgICAgICBDbGFzcyB2YWx1ZUNsYXNzLCBib29sZWFuIGFsbG93TnVsbEtleXMsIGJvb2xlYW4gYWxsb3dOdWxsVmFsdWVzKSB7Ci0gICAgICAgIGlmIChzb3J0ZWRNYXAgPT0gbnVsbCB8fCBrZXlDbGFzcyA9PSBudWxsIHx8IHZhbHVlQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotICAgICAgICBzb3J0ZWRNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRNYXAobmV3IFRyZWVNYXAoc29ydGVkTWFwKSk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc29ydGVkTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBhc3NlcnRJbnN0YW5jZShlbnRyeS5nZXRLZXkoKSwga2V5Q2xhc3MsIGFsbG93TnVsbEtleXMpOwotICAgICAgICAgICAgYXNzZXJ0SW5zdGFuY2UoZW50cnkuZ2V0VmFsdWUoKSwgdmFsdWVDbGFzcywgYWxsb3dOdWxsVmFsdWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzb3J0ZWRNYXA7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRTZXQgc2FmZUNvcHkoU29ydGVkU2V0IHNvcnRlZFNldCwgQ2xhc3MgYykgewotICAgICAgICByZXR1cm4gc2FmZUNvcHkoc29ydGVkU2V0LCBjLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRTZXQgc2FmZUNvcHkoU29ydGVkU2V0IHNvcnRlZFNldCwgQ2xhc3MgYywKLSAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dOdWxsRWxlbWVudHMpIHsKLSAgICAgICAgaWYgKHNvcnRlZFNldCA9PSBudWxsIHx8IGMgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgc29ydGVkU2V0ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU29ydGVkU2V0KG5ldyBUcmVlU2V0KHNvcnRlZFNldCkpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNvcnRlZFNldC5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgICBhc3NlcnRJbnN0YW5jZShpdGVyYXRvci5uZXh0KCksIGMsIGFsbG93TnVsbEVsZW1lbnRzKTsKLQotICAgICAgICByZXR1cm4gc29ydGVkU2V0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdGFydHNXaXRoKExpc3QgbGVmdCwgTGlzdCByaWdodCwgYm9vbGVhbiBlcXVhbHMpIHsKLSAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGludCBsID0gbGVmdC5zaXplKCk7Ci0gICAgICAgICAgICBpbnQgciA9IHJpZ2h0LnNpemUoKTsKLQotICAgICAgICAgICAgaWYgKHIgPiBsIHx8ICFlcXVhbHMgJiYgciA9PSBsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcjsgaSsrKQotICAgICAgICAgICAgICAgIGlmICghZXF1YWxzKGxlZnQuZ2V0KGkpLCByaWdodC5nZXQoaSkpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXJ0c1dpdGgoT2JqZWN0W10gbGVmdCwgT2JqZWN0W10gcmlnaHQsCi0gICAgICAgICAgICBib29sZWFuIGVxdWFscykgewotICAgICAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaW50IGwgPSBsZWZ0Lmxlbmd0aDsKLSAgICAgICAgICAgIGludCByID0gcmlnaHQubGVuZ3RoOwotCi0gICAgICAgICAgICBpZiAociA+IGwgfHwgIWVxdWFscyAmJiByID09IGwpIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbHMobGVmdFtpXSwgcmlnaHRbaV0pKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdHJhbnNsYXRlU3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLAotICAgICAgICAgICAgU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4gVXRpbC50cmFuc2xhdGVTdHJpbmcocmVzb3VyY2VCdW5kbGUsIGtleSwga2V5LCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFuc2xhdGVTdHJpbmcoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsCi0gICAgICAgICAgICBTdHJpbmcga2V5LCBTdHJpbmcgc3RyaW5nLCBib29sZWFuIHNpZ25hbCwgYm9vbGVhbiB0cmltKSB7Ci0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsICYmIGtleSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0cmFuc2xhdGVkU3RyaW5nID0gcmVzb3VyY2VCdW5kbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKGtleSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0ZWRTdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJpbSA/IHRyYW5zbGF0ZWRTdHJpbmcudHJpbSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRyYW5zbGF0ZWRTdHJpbmc7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGVNaXNzaW5nUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25hbCkgU3lzdGVtLmVyci5wcmludGxuKGVNaXNzaW5nUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJpbSA/IHN0cmluZy50cmltKCkgOiBzdHJpbmc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBVdGlsKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvZHJhZ3Rlc3RzLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvZHJhZ3Rlc3RzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5MmJiMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL2RyYWd0ZXN0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxkcmFndGVzdHM+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIGZvbGRlciB0byBjZW50ZXIgb2YgUHJvYmxlbXMiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyBmb2xkZXIgdG8gUHJvYmxlbXMgdmlldyB0YWIgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIGZvbGRlciB0byByaWdodCBvZiBlZGl0b3IgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgqTmF2aWdhdG9yKXwobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpfGFjdGl2ZSAoKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIGZvbGRlciB0byByaWdodCBvZiBQcm9ibGVtcyIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIGZvbGRlciB0byBsZWZ0IG9mIHdpbmRvdyIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0IChhY3RpdmUgKCpNb2NrIEVkaXRvciAyKXwoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciBmb2xkZXIgdG8gYm90dG9tIG9mIHdpbmRvdyIgcmVzdWx0PSJsYXlvdXQgKChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpLWFjdGl2ZSAoKk5hdmlnYXRvcikpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIHRvIHRvcCBvZiB3aW5kb3ciIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoYWN0aXZlICgqTW9jayBFZGl0b3IgMSktKCgqTW9jayBFZGl0b3IgMil8KCpNb2NrIEVkaXRvciAyKSkpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIHRvIGJvdHRvbSBvZiBOYXZpZ2F0b3IiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyB0byBsZWZ0IG9mIGVkaXRvciBhcmVhIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXwoYWN0aXZlICgqUHJvYmxlbXMpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSkpLSgqT3V0bGluZSwgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIHRvIHRvcCBvZiBlZGl0b3IgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8KGFjdGl2ZSAoKlByb2JsZW1zKS1sYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpKS0oKk91dGxpbmUsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCB0byB0b3Agb2YgZWRpdG9yIDIiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKCpNb2NrIEVkaXRvciAyKXwoYWN0aXZlICgqTW9jayBFZGl0b3IgMSktKCpNb2NrIEVkaXRvciAyKSkpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDAgZm9sZGVyIHRvIGJvdHRvbSBvZiBlZGl0b3IgMiIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoKk1vY2sgRWRpdG9yIDIpLWFjdGl2ZSAoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIGZvbGRlciB0byBsZWZ0IG9mIGVkaXRvciBhcmVhIiByZXN1bHQ9ImxheW91dCAoKCpOYXZpZ2F0b3IpfChhY3RpdmUgKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcyl8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgdG8gdG9wIG9mIE5hdmlnYXRvciIgcmVzdWx0PSJsYXlvdXQgKCgoYWN0aXZlICgqUHJvYmxlbXMpLSgqTmF2aWdhdG9yKSl8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMiBmb2xkZXIgdG8gY2VudGVyIG9mIGVkaXRvciAwIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgYWN0aXZlIChNb2NrIEVkaXRvciAxLCBNb2NrIEVkaXRvciAyLCAqTW9jayBFZGl0b3IgMikpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgZm9sZGVyIHRvIHRvcCBvZiBOYXZpZ2F0b3IiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCB0byBib3R0b20gb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKCgoKk1vY2sgRWRpdG9yIDIpfCgqTW9jayBFZGl0b3IgMikpLWFjdGl2ZSAoKk1vY2sgRWRpdG9yIDEpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIGZvbGRlciB0byBib3R0b20gb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpLWFjdGl2ZSAoKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDIgZm9sZGVyIHRvIGxlZnQgb2YgZWRpdG9yIDIiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgZm9sZGVyIHRvIHRvcCBvZiBlZGl0b3IgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKChhY3RpdmUgKCpOYXZpZ2F0b3IpLWxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIGZvbGRlciB0byBib3R0b20gb2YgZWRpdG9yIDIiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCBmb2xkZXIgdG8gcmlnaHQgb2YgZWRpdG9yIDAiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgdG8gZmFzdCB2aWV3IGJhciIgcmVzdWx0PSJmYXN0dmlld3MgKE5hdmlnYXRvciksIGxheW91dCAobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgdG8gcmlnaHQgb2YgTmF2aWdhdG9yIiByZXN1bHQ9ImxheW91dCAoKCgoKk5hdmlnYXRvcil8YWN0aXZlICgqUHJvYmxlbXMpKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciBmb2xkZXIgdG8gbGVmdCBvZiBlZGl0b3IgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKChhY3RpdmUgKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciB0byBjZW50ZXIgb2YgUHJvYmxlbXMiIHJlc3VsdD0ibGF5b3V0IChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktYWN0aXZlIChPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcywgKk5hdmlnYXRvcikpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIGZvbGRlciB0byBjZW50ZXIgb2YgZWRpdG9yIDIiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyBmb2xkZXIgdG8gYm90dG9tIG9mIE5hdmlnYXRvciIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvciktYWN0aXZlICgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIGZvbGRlciB0byBsZWZ0IG9mIGVkaXRvciAwIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIGZvbGRlciB0byBjZW50ZXIgb2YgTmF2aWdhdG9yIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDAgZm9sZGVyIHRvIGxlZnQgb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKGFjdGl2ZSAoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfCgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDAgdG8gYm90dG9tIG9mIGVkaXRvciAyIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKCgqTW9jayBFZGl0b3IgMil8KCgqTW9jayBFZGl0b3IgMiktYWN0aXZlICgqTW9jayBFZGl0b3IgMSkpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciB0byB0b3Agb2YgZWRpdG9yIGFyZWEiIHJlc3VsdD0ibGF5b3V0ICgoYWN0aXZlICgqTmF2aWdhdG9yKS1sYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMiBmb2xkZXIgdG8gbGVmdCBvZiBlZGl0b3IgMCIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0IChhY3RpdmUgKCpNb2NrIEVkaXRvciAyKXwoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIHRvIHJpZ2h0IG9mIGVkaXRvciAyIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIGZvbGRlciB0byByaWdodCBvZiB3aW5kb3ciIHJlc3VsdD0ibGF5b3V0ICgobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKXxhY3RpdmUgKCpOYXZpZ2F0b3IpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCB0byBjZW50ZXIgb2YgTmF2aWdhdG9yIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDEpfCgoKk1vY2sgRWRpdG9yIDIpfCgqTW9jayBFZGl0b3IgMikpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIGZvbGRlciB0byBjZW50ZXIgb2YgTmF2aWdhdG9yIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKGFjdGl2ZSAoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfCgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDAgdG8gY2VudGVyIG9mIGVkaXRvciAyIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKCgqTW9jayBFZGl0b3IgMil8YWN0aXZlIChNb2NrIEVkaXRvciAyLCAqTW9jayBFZGl0b3IgMSkpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDIgdG8gbGVmdCBvZiBlZGl0b3IgMCIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0IChhY3RpdmUgKCpNb2NrIEVkaXRvciAyKXwoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIHRvIHJpZ2h0IG9mIHdpbmRvdyIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoKCpNb2NrIEVkaXRvciAyKXwoKk1vY2sgRWRpdG9yIDIpKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAxKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgdG8gYm90dG9tIG9mIHdpbmRvdyIgcmVzdWx0PSJsYXlvdXQgKChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpLWFjdGl2ZSAoKk5hdmlnYXRvcikpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciBmb2xkZXIgdG8gYm90dG9tIG9mIFByb2JsZW1zIiByZXN1bHQ9ImxheW91dCAobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpLSgoKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKS1hY3RpdmUgKCpOYXZpZ2F0b3IpKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgdG8gYm90dG9tIG9mIE5hdmlnYXRvciIgcmVzdWx0PSJsYXlvdXQgKCgoKCpOYXZpZ2F0b3IpLWFjdGl2ZSAoKlByb2JsZW1zKSl8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyBmb2xkZXIgdG8gY2VudGVyIG9mIE5hdmlnYXRvciIgcmVzdWx0PSJsYXlvdXQgKGFjdGl2ZSAoTmF2aWdhdG9yLCAqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgbWF4aW1pemVkIE5hdmlnYXRvciBmb2xkZXIgdG8gcmlnaHQgb2YgZWRpdG9yIGFyZWEiIHJlc3VsdD0ibGF5b3V0ICgobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpfGFjdGl2ZSAoKk5hdmlnYXRvcikpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMiB0byBjZW50ZXIgb2YgZWRpdG9yIDIiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMiBmb2xkZXIgdG8gcmlnaHQgb2YgZWRpdG9yIDAiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCB0byBib3R0b20gb2YgZWRpdG9yIDAiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKCgqTW9jayBFZGl0b3IgMiktYWN0aXZlICgqTW9jayBFZGl0b3IgMSkpfCgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgdG8gYm90dG9tIG9mIFByb2JsZW1zIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpLSgoKk91dGxpbmUsIFByb3BlcnRpZXMpLWFjdGl2ZSAoKlByb2JsZW1zKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIHRvIGNlbnRlciBvZiBlZGl0b3IgMCIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0IGFjdGl2ZSAoTW9jayBFZGl0b3IgMSwgTW9jayBFZGl0b3IgMiwgKk1vY2sgRWRpdG9yIDIpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDAgdG8gY2VudGVyIG9mIGVkaXRvciAwIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDAgdG8gcmlnaHQgb2YgZWRpdG9yIDAiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKCgqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMSkpfCgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIGZvbGRlciB0byBOYXZpZ2F0b3IgdmlldyB0YWIgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciB0byByaWdodCBvZiBlZGl0b3IgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSl8YWN0aXZlICgqTmF2aWdhdG9yKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIGZvbGRlciB0byBjZW50ZXIgb2YgTmF2aWdhdG9yIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpfChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDAgZm9sZGVyIHRvIHRvcCBvZiBlZGl0b3IgMiIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0IChhY3RpdmUgKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKS0oKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIG1heGltaXplZCBQcm9ibGVtcyB0byByaWdodCBvZiBlZGl0b3IgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8KGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKXxhY3RpdmUgKCpQcm9ibGVtcykpKS0oKk91dGxpbmUsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyB0byByaWdodCBvZiBQcm9ibGVtcyIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKS0oKCpPdXRsaW5lLCBQcm9wZXJ0aWVzKXxhY3RpdmUgKCpQcm9ibGVtcykpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMiB0byByaWdodCBvZiB3aW5kb3ciIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCBmb2xkZXIgdG8gcmlnaHQgb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKCgqTW9jayBFZGl0b3IgMil8YWN0aXZlIChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDIgZm9sZGVyIHRvIHRvcCBvZiB3aW5kb3ciIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoYWN0aXZlICgqTW9jayBFZGl0b3IgMiktKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyBmb2xkZXIgdG8gdG9wIG9mIGVkaXRvciBhcmVhIiByZXN1bHQ9ImxheW91dCAoKCpOYXZpZ2F0b3IpfChhY3RpdmUgKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcyktbGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIGZvbGRlciB0byByaWdodCBvZiBOYXZpZ2F0b3IiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCB0byBsZWZ0IG9mIGVkaXRvciAyIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKCgqTW9jayBFZGl0b3IgMil8KGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDEpfCgqTW9jayBFZGl0b3IgMikpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIGZvbGRlciB0byBOYXZpZ2F0b3IgdmlldyB0YWIgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKChhY3RpdmUgKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcyl8KCpOYXZpZ2F0b3IpKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIHRvIHRvcCBvZiB3aW5kb3ciIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoYWN0aXZlICgqTW9jayBFZGl0b3IgMiktKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgdG8gbGVmdCBvZiBlZGl0b3IgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKChhY3RpdmUgKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIGZvbGRlciB0byBsZWZ0IG9mIFByb2JsZW1zIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgZm9sZGVyIHRvIGJvdHRvbSBvZiBlZGl0b3IgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgqTmF2aWdhdG9yKXwobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpLWFjdGl2ZSAoKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIGZvbGRlciB0byByaWdodCBvZiBlZGl0b3IgMiIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIGZvbGRlciB0byBib3R0b20gb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMiktYWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDAgdG8gcmlnaHQgb2YgZWRpdG9yIDIiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKCpNb2NrIEVkaXRvciAyKXwoKCpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAxKSkpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIHRvIGxlZnQgb2YgUHJvYmxlbXMiIHJlc3VsdD0ibGF5b3V0IChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktKGFjdGl2ZSAoKk5hdmlnYXRvcil8KCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMiB0byBsZWZ0IG9mIHdpbmRvdyIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0IChhY3RpdmUgKCpNb2NrIEVkaXRvciAyKXwoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciBmb2xkZXIgdG8gbGVmdCBvZiBOYXZpZ2F0b3IiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgdG8gdG9wIG9mIE5hdmlnYXRvciIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciBmb2xkZXIgdG8gbGVmdCBvZiB3aW5kb3ciIHJlc3VsdD0ibGF5b3V0IChhY3RpdmUgKCpOYXZpZ2F0b3IpfChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyB0byBjZW50ZXIgb2YgTmF2aWdhdG9yIiByZXN1bHQ9ImxheW91dCAoKGFjdGl2ZSAoTmF2aWdhdG9yLCAqUHJvYmxlbXMpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgZm9sZGVyIHRvIHRvcCBvZiB3aW5kb3ciIHJlc3VsdD0ibGF5b3V0IChhY3RpdmUgKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcyktKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyB0byBsZWZ0IG9mIFByb2JsZW1zIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpLShhY3RpdmUgKCpQcm9ibGVtcyl8KCpPdXRsaW5lLCBQcm9wZXJ0aWVzKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciB0byBib3R0b20gb2YgZWRpdG9yIGFyZWEiIHJlc3VsdD0ibGF5b3V0ICgobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpLWFjdGl2ZSAoKk5hdmlnYXRvcikpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgdG8gcmlnaHQgb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoKGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSl8YWN0aXZlICgqTmF2aWdhdG9yKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDAgdG8gbGVmdCBvZiBlZGl0b3IgMCIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoYWN0aXZlICgqTW9jayBFZGl0b3IgMSl8KCpNb2NrIEVkaXRvciAyKSl8KCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyB0byBmYXN0IHZpZXcgYmFyIiByZXN1bHQ9ImZhc3R2aWV3cyAoUHJvYmxlbXMpLCBsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgZm9sZGVyIHRvIGxlZnQgb2YgTmF2aWdhdG9yIiByZXN1bHQ9ImxheW91dCAoKGFjdGl2ZSAoKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKXwoKk5hdmlnYXRvcikpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIHRvIHRvcCBvZiB3aW5kb3ciIHJlc3VsdD0ibGF5b3V0IChhY3RpdmUgKCpOYXZpZ2F0b3IpLShsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyBmb2xkZXIgdG8gbGVmdCBvZiB3aW5kb3ciIHJlc3VsdD0ibGF5b3V0IChhY3RpdmUgKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcyl8KCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCBmb2xkZXIgdG8gbGVmdCBvZiBlZGl0b3IgMiIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0IChhY3RpdmUgKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXwoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIHRvIGJvdHRvbSBvZiBlZGl0b3IgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8KGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKS1hY3RpdmUgKCpQcm9ibGVtcykpKS0oKk91dGxpbmUsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMiB0byByaWdodCBvZiBlZGl0b3IgMCIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIG1heGltaXplZCBOYXZpZ2F0b3IgdG8gcmlnaHQgb2YgZWRpdG9yIGFyZWEiIHJlc3VsdD0ibGF5b3V0ICgobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpfGFjdGl2ZSAoKk5hdmlnYXRvcikpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyBmb2xkZXIgdG8gZmFzdCB2aWV3IGJhciIgcmVzdWx0PSJmYXN0dmlld3MgKE91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSwgbGF5b3V0ICgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgZm9sZGVyIHRvIHRvcCBvZiBOYXZpZ2F0b3IiIHJlc3VsdD0ibGF5b3V0ICgoYWN0aXZlICgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpLSgqTmF2aWdhdG9yKSl8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCBmb2xkZXIgdG8gY2VudGVyIG9mIGVkaXRvciAyIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgYWN0aXZlIChNb2NrIEVkaXRvciAyLCBNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMikpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyB0byBsZWZ0IG9mIE5hdmlnYXRvciIgcmVzdWx0PSJsYXlvdXQgKCgoYWN0aXZlICgqUHJvYmxlbXMpfCgqTmF2aWdhdG9yKSl8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgZm9sZGVyIHRvIGZhc3QgdmlldyBiYXIiIHJlc3VsdD0iZmFzdHZpZXdzIChOYXZpZ2F0b3IpLCBsYXlvdXQgKGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciBmb2xkZXIgdG8gcmlnaHQgb2YgUHJvYmxlbXMiIHJlc3VsdD0ibGF5b3V0IChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktKCgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpfGFjdGl2ZSAoKk5hdmlnYXRvcikpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgdG8gY2VudGVyIG9mIE5hdmlnYXRvciIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciBmb2xkZXIgdG8gdG9wIG9mIHdpbmRvdyIgcmVzdWx0PSJsYXlvdXQgKGFjdGl2ZSAoKk5hdmlnYXRvciktKGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciBmb2xkZXIgdG8gY2VudGVyIG9mIFByb2JsZW1zIiByZXN1bHQ9ImxheW91dCAobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpLWFjdGl2ZSAoT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMsICpOYXZpZ2F0b3IpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMiB0byBsZWZ0IG9mIGVkaXRvciAyIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIHRvIHJpZ2h0IG9mIE5hdmlnYXRvciIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIGZvbGRlciB0byBib3R0b20gb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKCgqTW9jayBFZGl0b3IgMiktYWN0aXZlIChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgbWF4aW1pemVkIFByb2JsZW1zIGZvbGRlciB0byByaWdodCBvZiBlZGl0b3IgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgqTmF2aWdhdG9yKXwobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpfGFjdGl2ZSAoT3V0bGluZSwgKlByb2JsZW1zLCBQcm9wZXJ0aWVzKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIGZvbGRlciB0byB0b3Agb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKGFjdGl2ZSAoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpLSgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDAgZm9sZGVyIHRvIHJpZ2h0IG9mIGVkaXRvciAyIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKCgqTW9jayBFZGl0b3IgMil8YWN0aXZlIChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDIgdG8gY2VudGVyIG9mIE5hdmlnYXRvciIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0IChhY3RpdmUgKCpNb2NrIEVkaXRvciAyKXwoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIGZvbGRlciB0byB0b3Agb2YgZWRpdG9yIDIiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyBmb2xkZXIgdG8gcmlnaHQgb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpfGFjdGl2ZSAoKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIGZvbGRlciB0byBsZWZ0IG9mIFByb2JsZW1zIiByZXN1bHQ9ImxheW91dCAobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpLShhY3RpdmUgKCpOYXZpZ2F0b3IpfCgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgZm9sZGVyIHRvIGJvdHRvbSBvZiBQcm9ibGVtcyIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIGZvbGRlciB0byByaWdodCBvZiBOYXZpZ2F0b3IiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGFjdGl2ZSAoKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSl8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgdG8gbGVmdCBvZiB3aW5kb3ciIHJlc3VsdD0ibGF5b3V0IChhY3RpdmUgKCpOYXZpZ2F0b3IpfChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgdG8gUHJvYmxlbXMgdmlldyB0YWIgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKS1hY3RpdmUgKE91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzLCAqTmF2aWdhdG9yKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDIgZm9sZGVyIHRvIHJpZ2h0IG9mIHdpbmRvdyIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIGZvbGRlciB0byBjZW50ZXIgb2YgZWRpdG9yIDAiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyB0byB0b3Agb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoYWN0aXZlICgqUHJvYmxlbXMpLSgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9wZXJ0aWVzKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciBmb2xkZXIgdG8gUHJvYmxlbXMgdmlldyB0YWIgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKS0oYWN0aXZlICgqTmF2aWdhdG9yKXwoKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIHRvIGxlZnQgb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoYWN0aXZlICgqUHJvYmxlbXMpfCgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9wZXJ0aWVzKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciB0byByaWdodCBvZiBQcm9ibGVtcyIgcmVzdWx0PSJsYXlvdXQgKGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKS0oKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcyl8YWN0aXZlICgqTmF2aWdhdG9yKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIHRvIGNlbnRlciBvZiBQcm9ibGVtcyIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIHRvIGJvdHRvbSBvZiBlZGl0b3IgMCIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpLWFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIHRvIHJpZ2h0IG9mIGVkaXRvciBhcmVhIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXwobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpfGFjdGl2ZSAoKlByb2JsZW1zKSkpLSgqT3V0bGluZSwgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIHRvIGxlZnQgb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDEpfCgoKk1vY2sgRWRpdG9yIDIpfCgqTW9jayBFZGl0b3IgMikpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciB0byBOYXZpZ2F0b3IgdmlldyB0YWIgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIGZvbGRlciB0byBib3R0b20gb2YgZWRpdG9yIDAiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKS1hY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgZm9sZGVyIHRvIGJvdHRvbSBvZiBlZGl0b3IgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktYWN0aXZlICgqTmF2aWdhdG9yKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciBmb2xkZXIgdG8gYm90dG9tIG9mIE5hdmlnYXRvciIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciB0byBib3R0b20gb2YgUHJvYmxlbXMiIHJlc3VsdD0ibGF5b3V0IChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktKCgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpLWFjdGl2ZSAoKk5hdmlnYXRvcikpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgdG8gbGVmdCBvZiBOYXZpZ2F0b3IiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgZm9sZGVyIHRvIHJpZ2h0IG9mIGVkaXRvciBhcmVhIiByZXN1bHQ9ImxheW91dCAoKGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKXxhY3RpdmUgKCpOYXZpZ2F0b3IpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDIgdG8gdG9wIG9mIGVkaXRvciAyIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDIgdG8gYm90dG9tIG9mIGVkaXRvciAyIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgdG8gUHJvYmxlbXMgdmlldyB0YWIgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIHRvIGJvdHRvbSBvZiB3aW5kb3ciIHJlc3VsdD0ibGF5b3V0ICgoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvcGVydGllcykpLWFjdGl2ZSAoKlByb2JsZW1zKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgdG8gcmlnaHQgb2Ygd2luZG93IiByZXN1bHQ9ImxheW91dCAoKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb3BlcnRpZXMpKXxhY3RpdmUgKCpQcm9ibGVtcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIHRvIE5hdmlnYXRvciB2aWV3IHRhYiBhcmVhIiByZXN1bHQ9ImxheW91dCAoKGFjdGl2ZSAoTmF2aWdhdG9yLCAqUHJvYmxlbXMpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDIgdG8gYm90dG9tIG9mIHdpbmRvdyIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpLWFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIGZvbGRlciB0byBib3R0b20gb2YgZWRpdG9yIDAiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyBmb2xkZXIgdG8gdG9wIG9mIFByb2JsZW1zIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIGZvbGRlciB0byB0b3Agb2YgUHJvYmxlbXMiIHJlc3VsdD0ibGF5b3V0IChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktKGFjdGl2ZSAoKk5hdmlnYXRvciktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyB0byB0b3Agb2YgUHJvYmxlbXMiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKGFjdGl2ZSAoKlByb2JsZW1zKS0oKk91dGxpbmUsIFByb3BlcnRpZXMpKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIHRvIHRvcCBvZiBQcm9ibGVtcyIgcmVzdWx0PSJsYXlvdXQgKGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKS0oYWN0aXZlICgqTmF2aWdhdG9yKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIHRvIFByb2JsZW1zIHZpZXcgdGl0bGUgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKS0oKCpPdXRsaW5lLCBQcm9wZXJ0aWVzKXxhY3RpdmUgKCpQcm9ibGVtcykpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCB0byBlZGl0b3IgMCB0aXRsZSBhcmVhIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKCgoKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDEpKXwoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciBmb2xkZXIgdG8gUHJvYmxlbXMgdmlldyB0aXRsZSBhcmVhIiByZXN1bHQ9ImxheW91dCAobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpLSgoKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKXxhY3RpdmUgKCpOYXZpZ2F0b3IpKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDAgZm9sZGVyIHRvIGVkaXRvciAwIHRhYiBhcmVhIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgZm9sZGVyIHRvIFByb2JsZW1zIHZpZXcgdGl0bGUgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIGZvbGRlciB0byBlZGl0b3IgMCB0YWIgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0IChhY3RpdmUgKCpNb2NrIEVkaXRvciAyKXwoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIHRvIGVkaXRvciAwIHRhYiBhcmVhIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIHRvIFByb2JsZW1zIHZpZXcgdGl0bGUgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKS0oKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcyl8YWN0aXZlICgqTmF2aWdhdG9yKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIGZvbGRlciB0byBlZGl0b3IgMCB0aXRsZSBhcmVhIiByZXN1bHQ9ImxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDIgdG8gZWRpdG9yIDAgdGFiIGFyZWEiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCBhY3RpdmUgKE1vY2sgRWRpdG9yIDEsIE1vY2sgRWRpdG9yIDIsICpNb2NrIEVkaXRvciAyKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIHRvIGVkaXRvciAwIHRpdGxlIGFyZWEiIHJlc3VsdD0ibGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmUgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCBmb2xkZXIgdG8gZWRpdG9yIDAgdGl0bGUgYXJlYSIgcmVzdWx0PSJsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZSAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci0KLTwhLS0gZGV0YWNoZWQgdGVzdHMgLS0+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciB0byBjZW50ZXIgb2YgTW9jayBWaWV3IDMgLSBkZXRhY2hlZCIgcmVzdWx0PSJkZXRhY2hlZFdpbmRvd3MgKGRXaW5kb3cgKE1vY2sgVmlldyAxLCBNb2NrIFZpZXcgMilkV2luZG93IChNb2NrIFZpZXcgMywgTmF2aWdhdG9yKSksIGxheW91dCAobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgdG8gY2VudGVyIG9mIE1vY2sgVmlldyAxIC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIsIE5hdmlnYXRvcilkV2luZG93IChNb2NrIFZpZXcgMykpLCBsYXlvdXQgKGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDAgZm9sZGVyIHRvIGNlbnRlciBvZiBNb2NrIFZpZXcgMyAtIGRldGFjaGVkIiByZXN1bHQ9ImRldGFjaGVkV2luZG93cyAoZFdpbmRvdyAoTW9jayBWaWV3IDEsIE1vY2sgVmlldyAyKWRXaW5kb3cgKE1vY2sgVmlldyAzKSksIGxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCBmb2xkZXIgdG8gY2VudGVyIG9mIE1vY2sgVmlldyAxIC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIpZFdpbmRvdyAoTW9jayBWaWV3IDMpKSwgbGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIHRvIG91dCBvZiB0aGUgd2luZG93IC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIpZFdpbmRvdyAoTW9jayBWaWV3IDMpKSwgbGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIGZvbGRlciB0byBNb2NrIFZpZXcgMSB2aWV3IHRhYiBhcmVhIC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIpZFdpbmRvdyAoTW9jayBWaWV3IDMpKSwgbGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIHRvIE1vY2sgVmlldyAxIHZpZXcgdGFiIGFyZWEgLSBkZXRhY2hlZCIgcmVzdWx0PSJkZXRhY2hlZFdpbmRvd3MgKGRXaW5kb3cgKE1vY2sgVmlldyAxLCBNb2NrIFZpZXcgMiwgUHJvYmxlbXMpZFdpbmRvdyAoTW9jayBWaWV3IDMpKSwgbGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgZm9sZGVyIHRvIG91dCBvZiB0aGUgd2luZG93IC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIpZFdpbmRvdyAoTW9jayBWaWV3IDMpZFdpbmRvdyAoT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSwgbGF5b3V0ICgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMiB0byBvdXQgb2YgdGhlIHdpbmRvdyAtIGRldGFjaGVkIiByZXN1bHQ9ImRldGFjaGVkV2luZG93cyAoZFdpbmRvdyAoTW9jayBWaWV3IDEsIE1vY2sgVmlldyAyKWRXaW5kb3cgKE1vY2sgVmlldyAzKSksIGxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCB0byBNb2NrIFZpZXcgMSB2aWV3IHRhYiBhcmVhIC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIpZFdpbmRvdyAoTW9jayBWaWV3IDMpKSwgbGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAyIHRvIGNlbnRlciBvZiBNb2NrIFZpZXcgMyAtIGRldGFjaGVkIiByZXN1bHQ9ImRldGFjaGVkV2luZG93cyAoZFdpbmRvdyAoTW9jayBWaWV3IDEsIE1vY2sgVmlldyAyKWRXaW5kb3cgKE1vY2sgVmlldyAzKSksIGxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgZm9sZGVyIHRvIG91dCBvZiB0aGUgd2luZG93IC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIpZFdpbmRvdyAoTW9jayBWaWV3IDMpZFdpbmRvdyAoTmF2aWdhdG9yKSksIGxheW91dCAobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMiBmb2xkZXIgdG8gY2VudGVyIG9mIE1vY2sgVmlldyAxIC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIpZFdpbmRvdyAoTW9jayBWaWV3IDMpKSwgbGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIHRvIG91dCBvZiB0aGUgd2luZG93IC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIpZFdpbmRvdyAoTW9jayBWaWV3IDMpZFdpbmRvdyAoUHJvYmxlbXMpKSwgbGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDIgdG8gY2VudGVyIG9mIE1vY2sgVmlldyAxIC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIpZFdpbmRvdyAoTW9jayBWaWV3IDMpKSwgbGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIHRvIGNlbnRlciBvZiBNb2NrIFZpZXcgMSAtIGRldGFjaGVkIiByZXN1bHQ9ImRldGFjaGVkV2luZG93cyAoZFdpbmRvdyAoTW9jayBWaWV3IDEsIE1vY2sgVmlldyAyLCBQcm9ibGVtcylkV2luZG93IChNb2NrIFZpZXcgMykpLCBsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCB0byBjZW50ZXIgb2YgTW9jayBWaWV3IDMgLSBkZXRhY2hlZCIgcmVzdWx0PSJkZXRhY2hlZFdpbmRvd3MgKGRXaW5kb3cgKE1vY2sgVmlldyAxLCBNb2NrIFZpZXcgMilkV2luZG93IChNb2NrIFZpZXcgMykpLCBsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDIgZm9sZGVyIHRvIE1vY2sgVmlldyAxIHZpZXcgdGFiIGFyZWEgLSBkZXRhY2hlZCIgcmVzdWx0PSJkZXRhY2hlZFdpbmRvd3MgKGRXaW5kb3cgKE1vY2sgVmlldyAxLCBNb2NrIFZpZXcgMilkV2luZG93IChNb2NrIFZpZXcgMykpLCBsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgZWRpdG9yIDIgZm9sZGVyIHRvIGNlbnRlciBvZiBNb2NrIFZpZXcgMyAtIGRldGFjaGVkIiByZXN1bHQ9ImRldGFjaGVkV2luZG93cyAoZFdpbmRvdyAoTW9jayBWaWV3IDEsIE1vY2sgVmlldyAyKWRXaW5kb3cgKE1vY2sgVmlldyAzKSksIGxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMiB0byBNb2NrIFZpZXcgMSB2aWV3IHRhYiBhcmVhIC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIpZFdpbmRvdyAoTW9jayBWaWV3IDMpKSwgbGF5b3V0ICgoKCpOYXZpZ2F0b3IpfGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIHRvIGNlbnRlciBvZiBNb2NrIFZpZXcgMyAtIGRldGFjaGVkIiByZXN1bHQ9ImRldGFjaGVkV2luZG93cyAoZFdpbmRvdyAoTW9jayBWaWV3IDEsIE1vY2sgVmlldyAyKWRXaW5kb3cgKE1vY2sgVmlldyAzLCBQcm9ibGVtcykpLCBsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMCBmb2xkZXIgdG8gb3V0IG9mIHRoZSB3aW5kb3cgLSBkZXRhY2hlZCIgcmVzdWx0PSJkZXRhY2hlZFdpbmRvd3MgKGRXaW5kb3cgKE1vY2sgVmlldyAxLCBNb2NrIFZpZXcgMilkV2luZG93IChNb2NrIFZpZXcgMykpLCBsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgTmF2aWdhdG9yIHRvIE1vY2sgVmlldyAxIHZpZXcgdGFiIGFyZWEgLSBkZXRhY2hlZCIgcmVzdWx0PSJkZXRhY2hlZFdpbmRvd3MgKGRXaW5kb3cgKE1vY2sgVmlldyAxLCBNb2NrIFZpZXcgMiwgTmF2aWdhdG9yKWRXaW5kb3cgKE1vY2sgVmlldyAzKSksIGxheW91dCAobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgdG8gb3V0IG9mIHRoZSB3aW5kb3cgLSBkZXRhY2hlZCIgcmVzdWx0PSJkZXRhY2hlZFdpbmRvd3MgKGRXaW5kb3cgKE1vY2sgVmlldyAxLCBNb2NrIFZpZXcgMilkV2luZG93IChNb2NrIFZpZXcgMylkV2luZG93IChOYXZpZ2F0b3IpKSwgbGF5b3V0IChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIGVkaXRvciAwIHRvIGNlbnRlciBvZiBNb2NrIFZpZXcgMSAtIGRldGFjaGVkIiByZXN1bHQ9ImRldGFjaGVkV2luZG93cyAoZFdpbmRvdyAoTW9jayBWaWV3IDEsIE1vY2sgVmlldyAyKWRXaW5kb3cgKE1vY2sgVmlldyAzKSksIGxheW91dCAoKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBlZGl0b3IgMiBmb2xkZXIgdG8gb3V0IG9mIHRoZSB3aW5kb3cgLSBkZXRhY2hlZCIgcmVzdWx0PSJkZXRhY2hlZFdpbmRvd3MgKGRXaW5kb3cgKE1vY2sgVmlldyAxLCBNb2NrIFZpZXcgMilkV2luZG93IChNb2NrIFZpZXcgMykpLCBsYXlvdXQgKCgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTwhLS0gZW5kIG9mIGRldGFjaGVkIHRlc3RzIC0tPgotCi08IS0tIFRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHJlY29yZGVkIGhlcmUgYnV0IGFyZSBhY3R1YWxseSBpbmNvcnJlY3QKLQkgZHVlIHRvIGFuIGV4aXN0aW5nIGRlZmVjdCBwcmV2ZW50aW5nIHRoZSBkcm9wIG9mIHN0YWNrcyBvbnRvIGRldGFjaGVkIHZpZXdzIC0tPgotPHRlc3QgbmFtZT0iZHJhZyBQcm9ibGVtcyBmb2xkZXIgdG8gY2VudGVyIG9mIE1vY2sgVmlldyAxIC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIpZFdpbmRvdyAoTW9jayBWaWV3IDMpZFdpbmRvdyAoT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSwgbGF5b3V0ICgoKk5hdmlnYXRvcil8bGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgZm9sZGVyIHRvIE1vY2sgVmlldyAxIHZpZXcgdGFiIGFyZWEgLSBkZXRhY2hlZCIgcmVzdWx0PSJkZXRhY2hlZFdpbmRvd3MgKGRXaW5kb3cgKE1vY2sgVmlldyAxLCBNb2NrIFZpZXcgMilkV2luZG93IChNb2NrIFZpZXcgMylkV2luZG93IChOYXZpZ2F0b3IpKSwgbGF5b3V0IChsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSktKCpPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIE5hdmlnYXRvciBmb2xkZXIgdG8gY2VudGVyIG9mIE1vY2sgVmlldyAzIC0gZGV0YWNoZWQiIHJlc3VsdD0iZGV0YWNoZWRXaW5kb3dzIChkV2luZG93IChNb2NrIFZpZXcgMSwgTW9jayBWaWV3IDIpZFdpbmRvdyAoTW9jayBWaWV3IDMpZFdpbmRvdyAoTmF2aWdhdG9yKSksIGxheW91dCAobGF5b3V0ICgoTW9jayBFZGl0b3IgMSwgKk1vY2sgRWRpdG9yIDIpfGFjdGl2ZV9ub2ZvY3VzICgqTW9jayBFZGl0b3IgMikpLSgqT3V0bGluZSwgUHJvYmxlbXMsIFByb3BlcnRpZXMpKSIvPgotPHRlc3QgbmFtZT0iZHJhZyBOYXZpZ2F0b3IgZm9sZGVyIHRvIGNlbnRlciBvZiBNb2NrIFZpZXcgMSAtIGRldGFjaGVkIiByZXN1bHQ9ImRldGFjaGVkV2luZG93cyAoZFdpbmRvdyAoTW9jayBWaWV3IDEsIE1vY2sgVmlldyAyKWRXaW5kb3cgKE1vY2sgVmlldyAzKWRXaW5kb3cgKE5hdmlnYXRvcikpLCBsYXlvdXQgKGxheW91dCAoKE1vY2sgRWRpdG9yIDEsICpNb2NrIEVkaXRvciAyKXxhY3RpdmVfbm9mb2N1cyAoKk1vY2sgRWRpdG9yIDIpKS0oKk91dGxpbmUsIFByb2JsZW1zLCBQcm9wZXJ0aWVzKSkiLz4KLTx0ZXN0IG5hbWU9ImRyYWcgUHJvYmxlbXMgZm9sZGVyIHRvIE1vY2sgVmlldyAxIHZpZXcgdGFiIGFyZWEgLSBkZXRhY2hlZCIgcmVzdWx0PSJkZXRhY2hlZFdpbmRvd3MgKGRXaW5kb3cgKE1vY2sgVmlldyAxLCBNb2NrIFZpZXcgMilkV2luZG93IChNb2NrIFZpZXcgMylkV2luZG93IChPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpLCBsYXlvdXQgKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpIi8+Ci08dGVzdCBuYW1lPSJkcmFnIFByb2JsZW1zIGZvbGRlciB0byBjZW50ZXIgb2YgTW9jayBWaWV3IDMgLSBkZXRhY2hlZCIgcmVzdWx0PSJkZXRhY2hlZFdpbmRvd3MgKGRXaW5kb3cgKE1vY2sgVmlldyAxLCBNb2NrIFZpZXcgMilkV2luZG93IChNb2NrIFZpZXcgMylkV2luZG93IChPdXRsaW5lLCBQcm9ibGVtcywgUHJvcGVydGllcykpLCBsYXlvdXQgKCgqTmF2aWdhdG9yKXxsYXlvdXQgKChNb2NrIEVkaXRvciAxLCAqTW9jayBFZGl0b3IgMil8YWN0aXZlX25vZm9jdXMgKCpNb2NrIEVkaXRvciAyKSkpIi8+Ci08IS0tIEVuZCBvZiBlcnJvciB0ZXN0cyAtLT4KLQotPC9kcmFndGVzdHM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL2R5bmFtaWNfY2xhc3Nlcy50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL2R5bmFtaWNfY2xhc3Nlcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTI1YzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9keW5hbWljX2NsYXNzZXMudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZHlhbm1pY19jbGFzc2VzLnppcCBjb250YWlucyBhIHByb2plY3QgdGhhdCBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGFueSBvZiB0aGUgamFycyB0aGF0IGFyZSBjb250YWluZWQgd2l0aGluIHRoZSBhYm92ZSBkeW5hbWljIHBsdWdpbiBkaXJlY3Rvcmllcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL2R5bmFtaWNfY2xhc3Nlcy56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL2R5bmFtaWNfY2xhc3Nlcy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZTQ4YWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9keW5hbWljX2NsYXNzZXMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5hY2NlbGVyYXRvckNvbmZpZ3VyYXRpb25zRXh0ZW5zaW9uRHluYW1pY1Rlc3QvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuYWNjZWxlcmF0b3JDb25maWd1cmF0aW9uc0V4dGVuc2lvbkR5bmFtaWNUZXN0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZTQxZGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5hY2NlbGVyYXRvckNvbmZpZ3VyYXRpb25zRXh0ZW5zaW9uRHluYW1pY1Rlc3QvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuYWNjZWxlcmF0b3JTY29wZXNFeHRlbnNpb25EeW5hbWljVGVzdC9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5hY2NlbGVyYXRvclNjb3Blc0V4dGVuc2lvbkR5bmFtaWNUZXN0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhM2U1NjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5hY2NlbGVyYXRvclNjb3Blc0V4dGVuc2lvbkR5bmFtaWNUZXN0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmFjdGlvbkRlZmluaXRpb25zRXh0ZW5zaW9uRHluYW1pY1Rlc3QvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuYWN0aW9uRGVmaW5pdGlvbnNFeHRlbnNpb25EeW5hbWljVGVzdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmM0ODhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuYWN0aW9uRGVmaW5pdGlvbnNFeHRlbnNpb25EeW5hbWljVGVzdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5iaW5kaW5nc0V4dGVuc2lvbkR5bmFtaWNUZXN0L3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmJpbmRpbmdzRXh0ZW5zaW9uRHluYW1pY1Rlc3QvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViN2U2My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmJpbmRpbmdzRXh0ZW5zaW9uRHluYW1pY1Rlc3QvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuY29tbWFuZHNFeHRlbnNpb25EeW5hbWljVGVzdC9jb21tYW5kcy5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmNvbW1hbmRzRXh0ZW5zaW9uRHluYW1pY1Rlc3QvY29tbWFuZHMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDIwZmQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuY29tbWFuZHNFeHRlbnNpb25EeW5hbWljVGVzdC9jb21tYW5kcy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmNvbW1hbmRzRXh0ZW5zaW9uRHluYW1pY1Rlc3QvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuY29tbWFuZHNFeHRlbnNpb25EeW5hbWljVGVzdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzNjZWU2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuY29tbWFuZHNFeHRlbnNpb25EeW5hbWljVGVzdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5jb250ZXh0c0V4dGVuc2lvbkR5bmFtaWNUZXN0L3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmNvbnRleHRzRXh0ZW5zaW9uRHluYW1pY1Rlc3QvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y5NmNlMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmNvbnRleHRzRXh0ZW5zaW9uRHluYW1pY1Rlc3QvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuZGF0YXRyYW5zZmVyQXJjaGl2ZXMvQXJjaGl2ZVRlc3RTb3VyY2UudGFyIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5kYXRhdHJhbnNmZXJBcmNoaXZlcy9BcmNoaXZlVGVzdFNvdXJjZS50YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZTM1MzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5kYXRhdHJhbnNmZXJBcmNoaXZlcy9BcmNoaXZlVGVzdFNvdXJjZS50YXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmRhdGF0cmFuc2ZlckFyY2hpdmVzL0FyY2hpdmVUZXN0U291cmNlLnppcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuZGF0YXRyYW5zZmVyQXJjaGl2ZXMvQXJjaGl2ZVRlc3RTb3VyY2UuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDI4MmNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuZGF0YXRyYW5zZmVyQXJjaGl2ZXMvQXJjaGl2ZVRlc3RTb3VyY2UuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5kYXRhdHJhbnNmZXJBcmNoaXZlcy9FbXB0eUZvbGRlckluQXJjaGl2ZS50YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmRhdGF0cmFuc2ZlckFyY2hpdmVzL0VtcHR5Rm9sZGVySW5BcmNoaXZlLnRhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiMWVjNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmRhdGF0cmFuc2ZlckFyY2hpdmVzL0VtcHR5Rm9sZGVySW5BcmNoaXZlLnRhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuZGF0YXRyYW5zZmVyQXJjaGl2ZXMvRW1wdHlGb2xkZXJJbkFyY2hpdmUuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5kYXRhdHJhbnNmZXJBcmNoaXZlcy9FbXB0eUZvbGRlckluQXJjaGl2ZS56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2Y0N2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5kYXRhdHJhbnNmZXJBcmNoaXZlcy9FbXB0eUZvbGRlckluQXJjaGl2ZS56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmRhdGF0cmFuc2ZlckFyY2hpdmVzL0ZpbGVBdFJvb3RUZXN0LnRhciBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuZGF0YXRyYW5zZmVyQXJjaGl2ZXMvRmlsZUF0Um9vdFRlc3QudGFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTcwMGNjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuZGF0YXRyYW5zZmVyQXJjaGl2ZXMvRmlsZUF0Um9vdFRlc3QudGFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5kYXRhdHJhbnNmZXJBcmNoaXZlcy9GaWxlQXRSb290VGVzdC56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmRhdGF0cmFuc2ZlckFyY2hpdmVzL0ZpbGVBdFJvb3RUZXN0LnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5ZjJkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmRhdGF0cmFuc2ZlckFyY2hpdmVzL0ZpbGVBdFJvb3RUZXN0LnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuZGF0YXRyYW5zZmVyQXJjaGl2ZXMvaGVsbG93b3JsZC50YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmRhdGF0cmFuc2ZlckFyY2hpdmVzL2hlbGxvd29ybGQudGFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmIzMGRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuZGF0YXRyYW5zZmVyQXJjaGl2ZXMvaGVsbG93b3JsZC50YXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmRhdGF0cmFuc2ZlckFyY2hpdmVzL2hlbGxvd29ybGQuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5kYXRhdHJhbnNmZXJBcmNoaXZlcy9oZWxsb3dvcmxkLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBmMzFlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLmRhdGF0cmFuc2ZlckFyY2hpdmVzL2hlbGxvd29ybGQuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5oYW5kbGVyc0V4dGVuc2lvbkR5bmFtaWNUZXN0L2hhbmRsZXJzLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuaGFuZGxlcnNFeHRlbnNpb25EeW5hbWljVGVzdC9oYW5kbGVycy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTU1YjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5oYW5kbGVyc0V4dGVuc2lvbkR5bmFtaWNUZXN0L2hhbmRsZXJzLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UuaGFuZGxlcnNFeHRlbnNpb25EeW5hbWljVGVzdC9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5oYW5kbGVyc0V4dGVuc2lvbkR5bmFtaWNUZXN0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTQ4YjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5oYW5kbGVyc0V4dGVuc2lvbkR5bmFtaWNUZXN0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0FjdGlvblNldDEvV2hhdERvZXNJdERvLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3QWN0aW9uU2V0MS9XaGF0RG9lc0l0RG8udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQxZWE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3QWN0aW9uU2V0MS9XaGF0RG9lc0l0RG8udHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1UaGlzIHRlc3Qgc2hvdWxkIGFkZCBhIG5ldyBhY3Rpb24gY2FsbGVkICJBIE5ldyBBY3Rpb24gZnJvbSBBY3Rpb25TZXQxIgotdG8gdGhlIEZpbGUgbWVudSBpdGVtLgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdBY3Rpb25TZXQxL2FueXRoaW5nLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3QWN0aW9uU2V0MS9hbnl0aGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzc3YTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdBY3Rpb25TZXQxL2FueXRoaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3QWN0aW9uU2V0MS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdBY3Rpb25TZXQxL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjA2MzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdBY3Rpb25TZXQxL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im5ld0FjdGlvblNldDEiCi0gICBuYW1lPSJuZXdBY3Rpb25TZXQxIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ibmV3QWN0aW9uU2V0MS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyIgaWQ9InRlc3REeW5hbWljQWN0aW9uU2V0QWRkaXRpb24iPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IkEgTmV3IEFjdGlvblNldCBmcm9tIEFjdGlvblNldDEiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhpcyBpcyBhbiBhY3Rpb25zZXQgYWRkZWQgYnkgYSBkeW5hbWljIHBsdWctaW4iCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm5ld0FjdGlvblNldDEubmV3QWN0aW9uU2V0MSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iQSBOZXcgQWN0aW9uIGZyb20gQWN0aW9uU2V0MSIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IlRoaXMgaXMgdGhlIHRvb2x0aXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmFjdGlvbnMuT3BlblR5cGVJbkhpZXJhcmNoeUFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJmaWxlL25ldy5leHQiCi0gICAgICAgICAgICAgICBpZD0ibmV3QWN0aW9uMSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm5ld0FjdGlvblNldDEubmV3QWN0aW9uU2V0MiIKLSAgICAgICAgICAgIGxhYmVsPSJBbm90aGVyIE5ldyBBY3Rpb24gU2V0IEZyb20gQWN0aW9uU2V0IDEiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJzb21lLmJvZ3VzLmNsYXNzIgotICAgICAgICAgICAgICAgaWNvbj0iYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFjdGlvbjEiCi0gICAgICAgICAgICAgICBsYWJlbD0iQW5vdGhlciBOZXcgQWN0aW9uIEZyb20gQWN0aW9uU2V0MSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJtZW51MS9zZXAxIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0ibmV3QWN0aW9uU2V0MSIvPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGlkPSJtZW51MSIKLSAgICAgICAgICAgICAgIGxhYmVsPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51MSI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9InNlcDEiLz4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0gICAgICA8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uIHRhcmdldElEPSJvcmcuZWNsaXBzZS5uZXdBY3Rpb25TZXQxLm5ld0FjdGlvblNldDEiPgotICAgICAgICAgPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnBhcnQxIi8+Ci0gICAgICA8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotIAotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3QWN0aXZpdHlTdXBwb3J0MS9hbnl0aGluZy5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0FjdGl2aXR5U3VwcG9ydDEvYW55dGhpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM3N2E3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3QWN0aXZpdHlTdXBwb3J0MS9hbnl0aGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0FjdGl2aXR5U3VwcG9ydDEvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3QWN0aXZpdHlTdXBwb3J0MS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDAxZTJlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3QWN0aXZpdHlTdXBwb3J0MS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJuZXdBY3Rpdml0eVN1cHBvcnQxIgotICAgbmFtZT0ibmV3QWN0aXZpdHlTdXBwb3J0MSBQbHVnLWluIgotICAgdmVyc2lvbj0iMS4wLjAiPgotICAgCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ0ZXN0TmV3QWN0aXZpdHlTdXBwb3J0QWRkaXRpb24iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aXZpdHlTdXBwb3J0Ij4KLSAgICAgIDxjYXRlZ29yeUltYWdlQmluZGluZwotICAgICAgICAgICAgaWNvbj0iYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNhdGVnb3J5MiIvPgotICAgICAgPGFjdGl2aXR5SW1hZ2VCaW5kaW5nCi0gICAgICAgICAgICBpY29uPSJhbnl0aGluZy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0aXZpdHkyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0Jyb3dzZXIxL2Jyb3dzZXIuamFyIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdCcm93c2VyMS9icm93c2VyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlZGMyMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0Jyb3dzZXIxL2Jyb3dzZXIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdCcm93c2VyMS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdCcm93c2VyMS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2QyZDYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3QnJvd3NlcjEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ibmV3QnJvd3NlcjEiCi0gICBuYW1lPSJuZXdCcm93c2VyMSBQbHVnLWluIgotICAgdmVyc2lvbj0iMS4wLjAiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImJyb3dzZXIuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICA8L3JlcXVpcmVzPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InRlc3REeW5hbWljQnJvd3NlckFkZGl0aW9uIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXJTdXBwb3J0Ij4KLSAgICAgIDxzdXBwb3J0Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZHluYW1pYy5EeW5hbWljQnJvd3NlclN1cHBvcnQiCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0RlY29yYXRvcjEvYW55dGhpbmcuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdEZWNvcmF0b3IxL2FueXRoaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNzdhNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0RlY29yYXRvcjEvYW55dGhpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdEZWNvcmF0b3IxL2RlY29yYXRvci5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0RlY29yYXRvcjEvZGVjb3JhdG9yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzYzIzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0RlY29yYXRvcjEvZGVjb3JhdG9yLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3RGVjb3JhdG9yMS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdEZWNvcmF0b3IxL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNTJhZjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdEZWNvcmF0b3IxL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im5ld0RlY29yYXRvcjEiCi0gICBuYW1lPSJuZXdEZWNvcmF0b3IxIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iZGVjb3JhdG9yLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgPC9yZXF1aXJlcz4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ0ZXN0RHluYW1pY0RlY29yYXRvckFkZGl0aW9uIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMiPgotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9ImZhbHNlIgotICAgICAgICAgICAgbGFiZWw9ImZ1bGwxIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmR5bmFtaWMuRHluYW1pY0xhYmVsRGVjb3JhdG9yIgotICAgICAgICAgICAgc3RhdGU9InRydWUiCi0gICAgICAgICAgICBpZD0iZnVsbERlY29yYXRvcjEiPgotCQk8ZW5hYmxlbWVudD4KLQkJCTxvYmplY3RDbGFzcyBuYW1lPSJqYXZhLmxhbmcuT2JqZWN0Ii8+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4gCi0gICAgICA8L2RlY29yYXRvcj4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgbGFiZWw9ImxpZ2h0MSIKLSAgICAgICAgICAgIGljb249ImFueXRoaW5nLmdpZiIKLSAgICAgICAgICAgIHN0YXRlPSJ0cnVlIgotICAgICAgICAgICAgbG9jYXRpb249IlRPUF9MRUZUIgotICAgICAgICAgICAgaWQ9ImxpZ2h0RGVjb3JhdG9yMSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgIDxvYmplY3RDbGFzcyBuYW1lPSJqYXZhLmxhbmcuT2JqZWN0Ii8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2RlY29yYXRvcj4gCi0gICAgICAKLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgbGFiZWw9ImxpZ2h0MiIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5keW5hbWljLkR5bmFtaWNMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIgotICAgICAgICAgICAgc3RhdGU9InRydWUiCi0gICAgICAgICAgICBsb2NhdGlvbj0iVE9QX0xFRlQiCi0gICAgICAgICAgICBpZD0ibGlnaHREZWNvcmF0b3IyIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPG9iamVjdENsYXNzIG5hbWU9ImphdmEubGFuZy5PYmplY3QiLz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvZGVjb3JhdG9yPiAgICAgICAgICAgICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdFZGl0b3IxL2FueXRoaW5nLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3RWRpdG9yMS9hbnl0aGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzc3YTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdFZGl0b3IxL2FueXRoaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3RWRpdG9yMS9lZGl0b3IuamFyIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdFZGl0b3IxL2VkaXRvci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZWQzNDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdFZGl0b3IxL2VkaXRvci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0VkaXRvcjEvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3RWRpdG9yMS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzkyOTMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3RWRpdG9yMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJuZXdFZGl0b3IxIgotICAgbmFtZT0ibmV3RWRpdG9yMSBQbHVnLWluIgotICAgdmVyc2lvbj0iMS4wLjAiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImVkaXRvci5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idGVzdER5bmFtaWNFZGl0b3JBZGRpdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGljb249ImFueXRoaW5nLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5keW5hbWljLkR5bmFtaWNFZGl0b3IiCi0gICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmVkaXRvcjEiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UubmV3RWRpdG9yMS5uZXdFZGl0b3IxIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0VuY29kaW5nMS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdFbmNvZGluZzEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzNTI2OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0VuY29kaW5nMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJuZXdFbmNvZGluZzEiCi0gICBuYW1lPSJuZXdFbmNvZGluZzEgUGx1Zy1pbiIKLSAgIHZlcnNpb249IjEuMC4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idGVzdER5bmFtaWNFbmNvZGluZ0FkZGl0aW9uIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVuY29kaW5ncyI+Ci0gICAgICA8ZW5jb2RpbmcgbmFtZT0iQ3AxMjU3Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLSAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0hlbHBTdXBwb3J0MS9oZWxwLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3SGVscFN1cHBvcnQxL2hlbHAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDhlZWI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3SGVscFN1cHBvcnQxL2hlbHAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdIZWxwU3VwcG9ydDEvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3SGVscFN1cHBvcnQxL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYThkNGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdIZWxwU3VwcG9ydDEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ibmV3SGVscFN1cHBvcnQxIgotICAgbmFtZT0ibmV3SGVscFN1cHBvcnQxIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iaGVscC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idGVzdER5bmFtaWNIZWxwU3VwcG9ydEFkZGl0aW9uIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhlbHBTdXBwb3J0Ij4KLSAgICAgIDxjb25maWcgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmR5bmFtaWMuRHluYW1pY0hlbHBTdXBwb3J0Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLSAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0ludHJvMS9pbnRyby5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0ludHJvMS9pbnRyby5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTBmNjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdJbnRybzEvaW50cm8uamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdJbnRybzEvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3SW50cm8xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjhlYmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdJbnRybzEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ibmV3SW50cm8xIgotICAgbmFtZT0ibmV3SW50cm8xIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iaW50cm8uamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICA8L3JlcXVpcmVzPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InRlc3REeW5hbWljSW50cm9BZGRpdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbnRybyI+Ci0gICAgICA8aW50cm8KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5keW5hbWljLkR5bmFtaWNJbnRybyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5uZXdJbnRybzEubmV3SW50cm8xIi8+Ci0gICAgICA8aW50cm9Qcm9kdWN0QmluZGluZwotICAgICAgICAgICAgaW50cm9JZD0ib3JnLmVjbGlwc2UubmV3SW50cm8xLm5ld0ludHJvMSIKLSAgICAgICAgICAgIHByb2R1Y3RJZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuc29tZVByb2R1Y3QiLz4KLSAgIDwvZXh0ZW5zaW9uPgotIAotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3S2V5d29yZDEvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3S2V5d29yZDEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMzNiNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld0tleXdvcmQxL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im5ld0tleXdvcmQxIgotICAgbmFtZT0ibmV3S2V5d29yZDEgUGx1Zy1pbiIKLSAgIHZlcnNpb249IjEuMC4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idGVzdER5bmFtaWNLZXl3b3JkQWRkaXRpb24iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkua2V5d29yZHMiPgotICAgICAgPGtleXdvcmQKLSAgICAgICAgICAgIGxhYmVsPSJkeW5hbWljS2V5d29yZDEiCi0gICAgICAgICAgICBpZD0iZHluYW1pY0tleXdvcmQxIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld01hcmtlclN1cHBvcnQvbWFya2VyU3VwcG9ydC5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld01hcmtlclN1cHBvcnQvbWFya2VyU3VwcG9ydC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NWE2ZWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdNYXJrZXJTdXBwb3J0L21hcmtlclN1cHBvcnQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdNYXJrZXJTdXBwb3J0L3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld01hcmtlclN1cHBvcnQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExZjA3My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld01hcmtlclN1cHBvcnQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luCi0gICBpZD0ibmV3UHJvYmxlbUZpbHRlciIKLSAgIG5hbWU9Im5ld1Byb2JsZW1GaWx0ZXIgUGx1Zy1pbiIKLSAgIHZlcnNpb249IjEuMC4wIj4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJtYXJrZXJTdXBwb3J0LmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJkeW5hbWljVGVzdE1hcmtlciIKLSAgICAgICAgIG5hbWU9IkR5bmFtaWMgVGVzdCBNYXJrZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAJCSBpZD0idGVzdER5bmFtaWNGaWx0ZXJBZGRpdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VyU3VwcG9ydCI+Ci0gICAgPHByb2JsZW1GaWx0ZXIKLSAgICAgICAgICAgIGVuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBpZD0iZmlsdGVyMSIKLSAgICAgICAgICAgIG5hbWU9IkZpbHRlciAxIgotICAgICAgICAgICAgb25EZXNjcmlwdGlvbj0ibWV0aG9kIi8+Ci0gICAgICA8cHJvYmxlbUZpbHRlcgotICAgICAgICAgICAgaWQ9ImZpbHRlcjIiCi0gICAgICAgICAgICBuYW1lPSJGaWx0ZXIgMiIKLSAgICAgICAgICAgIG9uRGVzY3JpcHRpb249IiFtZXRob2QiLz4KLSAgICAgIDxwcm9ibGVtRmlsdGVyCi0gICAgICAgICAgICBlbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgaWQ9ImZpbHRlcjMiCi0gICAgICAgICAgICBuYW1lPSJGaWx0ZXIgMyI+Ci0gICAgICAgICA8c2VsZWN0ZWRUeXBlIG1hcmtlcklkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljVGVzdE1hcmtlciIvPgotICAgICAgPC9wcm9ibGVtRmlsdGVyPgotICAgICAgPG1hcmtlckNhdGVnb3J5IG5hbWU9ImR5bmFtaWNDYXRlZ29yeSI+Ci0gICAgICAgICA8bWFya2VyVHlwZVJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY1Rlc3RNYXJrZXIiLz4KLSAgICAgIDwvbWFya2VyQ2F0ZWdvcnk+Ci0gICAgICA8aGllcmFyY2h5PgotICAgICAgICAgPGhpZXJhcmNoeVJlZmVyZW5jZQotICAgICAgICAgICAgICAgZGlyZWN0aW9uPSJBU0NFTkRJTkciCi0gICAgICAgICAgICAgICB0eXBlPSJQUk9KRUNUIi8+Ci0gICAgICAgICA8bWFya2VyVHlwZVJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuZHluYW1pY1Rlc3RNYXJrZXIiLz4KLSAgICAgIDwvaGllcmFyY2h5PgotICAgICAgPG1hcmtlckdyb3VwaW5nCi0gICAgICAgICAgICBhdHRyaWJ1dGU9InRlc3RBdHR0cmlidXRlIgotICAgICAgICAgICAgbmFtZT0iRHluYW1pYyBUZXN0IEdyb3VwaW5nIj4KLSAgICAgICAgIDxtYXJrZXJUeXBlUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5keW5hbWljVGVzdE1hcmtlciIvPgotICAgICAgPC9tYXJrZXJHcm91cGluZz4KLSAgCi0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdNdWx0aUVkaXRvci9idWlsZC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld011bHRpRWRpdG9yL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyNzk2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld011bHRpRWRpdG9yL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgIEp1biAyNywgMjAwNSAxMDoyMzoxMyBBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgcHJvamVjdCAgICAKLSAgICAgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAKLSAgICAgcHdlYnN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJwcm9qZWN0IiBkZWZhdWx0PSJkZWZhdWx0Ij4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbgotICAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAgICAgICAgICB0YXJnZXQ6IGRlZmF1bHQgICAgICAgICAgICAgIAotICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0YXJnZXQgbmFtZT0iZGVmYXVsdCIgZGVwZW5kcz0iZGVwZW5kcyIgZGVzY3JpcHRpb249Ii0tPiBkZXNjcmlwdGlvbiI+Ci0gICAgICAgIAotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCi0gICAgICAgICAgdGFyZ2V0OiBkZXBlbmRzICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iZGVwZW5kcyI+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdNdWx0aUVkaXRvci90ZXN0MDEudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdNdWx0aUVkaXRvci90ZXN0MDEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTMzZDdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3TXVsdGlFZGl0b3IvdGVzdDAxLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotdGVzdCBmaWxlIDAxCi0KLXRlc3QgZm9yIE11bHRpRWRpdG9yCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld011bHRpRWRpdG9yL3Rlc3QwMi50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld011bHRpRWRpdG9yL3Rlc3QwMi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMWExMTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdNdWx0aUVkaXRvci90ZXN0MDIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi10ZXN0IGZpbGUgMDIKLQotdGVzdCBmb3IgTXVsdGlFZGl0b3IKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3TXVsdGlFZGl0b3IvdGVzdDAzLmV0ZXN0IGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdNdWx0aUVkaXRvci90ZXN0MDMuZXRlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmODhhNmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdNdWx0aUVkaXRvci90ZXN0MDMuZXRlc3QKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXRlc3QgZmlsZSAwMwotCi10ZXN0IGZvciBNdWx0aUVkaXRvcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdNdWx0aUVkaXRvci90ZXN0MDQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3TXVsdGlFZGl0b3IvdGVzdDA0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYjQ1ZWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdNdWx0aUVkaXRvci90ZXN0MDQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3JnLmVjbGlwc2UudWkudGVzdHMubXVsdGllZGl0b3IuZ29vZCA9IE11bHRpRWRpdG9yVGVzdAotb3JnLmVjbGlwc2UudWkudGVzdHMubXVsdGllZGl0b3IuYmFkID0gVGlsZWRFZGl0b3IKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3TmV3V2l6YXJkMS9hbnl0aGluZy5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld05ld1dpemFyZDEvYW55dGhpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM3N2E3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3TmV3V2l6YXJkMS9hbnl0aGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld05ld1dpemFyZDEvbmV3V2l6YXJkLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3TmV3V2l6YXJkMS9uZXdXaXphcmQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTVhNzI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3TmV3V2l6YXJkMS9uZXdXaXphcmQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdOZXdXaXphcmQxL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld05ld1dpemFyZDEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZkNTcwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld05ld1dpemFyZDEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ibmV3TmV3V2l6YXJkMSIKLSAgIG5hbWU9Im5ld05ld1dpemFyZDEgUGx1Zy1pbiIKLSAgIHZlcnNpb249IjEuMC4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJuZXdXaXphcmQuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICA8L3JlcXVpcmVzPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InRlc3REeW5hbWljTmV3V2l6YXJkQWRkaXRpb24iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IkNhdGVnb3J5MSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5uZXdOZXdXaXphcmQxLmNhdGVnb3J5Ii8+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBoZWxwSHJlZj0iZm9vYmFyIgotICAgICAgICAgICAgaWNvbj0iYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLk5ld1dpemFyZDEiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UubmV3TmV3V2l6YXJkMS5jYXRlZ29yeSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uSW1hZ2U9ImFueXRoaW5nLmdpZiIKLSAgICAgICAgICAgIG5hbWU9Ik5ld1dpemFyZDEiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UubmV3TmV3V2l6YXJkMS5uZXdOZXdXaXphcmQxIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld09DMS9vYy5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld09DMS9vYy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYWJjNjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdPQzEvb2MuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdPQzEvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3T0MxL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTk4NTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdPQzEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ibmV3T0MxIgotICAgbmFtZT0ibmV3T0MxIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ib2MuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICA8L3JlcXVpcmVzPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InRlc3REeW5hbWljT0NBZGRpdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0iamF2YS51dGlsLlJhbmRvbSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5uZXdPQzEiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFjdGlvbjEiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZHluYW1pYy5Nb2NrT2JqZWN0QWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UubmV3T0MxIi8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDx2aWV3ZXJDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSIjT0MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UubmV3T0MyIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hY3Rpb24xIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmR5bmFtaWNpLk1vY2tWaWV3QWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib2MiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UubmV3T0MyIi8+Ci0gICAgICA8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotIAotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3UGVyc3BlY3RpdmUxL3BlcnNwZWN0aXZlLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3UGVyc3BlY3RpdmUxL3BlcnNwZWN0aXZlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4ODRhNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1BlcnNwZWN0aXZlMS9wZXJzcGVjdGl2ZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1BlcnNwZWN0aXZlMS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdQZXJzcGVjdGl2ZTEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwZGY1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1BlcnNwZWN0aXZlMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJuZXdQZXJzcGVjdGl2ZTEiCi0gICBuYW1lPSJOZXdQZXJzcGVjdGl2ZSBPbmUgUGx1Zy1pbiIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwZXJzcGVjdGl2ZS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyIgaWQ9InRlc3REeW5hbWljUGVyc3BlY3RpdmVBZGRpdGlvbiI+Ci0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIG5hbWU9Ik5ld1BlcnNwZWN0aXZlMSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5keW5hbWljLkR5bmFtaWNQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5uZXdQZXJzcGVjdGl2ZTEubmV3UGVyc3BlY3RpdmUxIj4KLSAgICAgIDwvcGVyc3BlY3RpdmU+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1BlcnNwZWN0aXZlRXh0ZW5zaW9uMS9hbnl0aGluZy5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1BlcnNwZWN0aXZlRXh0ZW5zaW9uMS9hbnl0aGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzc3YTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdQZXJzcGVjdGl2ZUV4dGVuc2lvbjEvYW55dGhpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdQZXJzcGVjdGl2ZUV4dGVuc2lvbjEvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3UGVyc3BlY3RpdmVFeHRlbnNpb24xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNzU2NjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdQZXJzcGVjdGl2ZUV4dGVuc2lvbjEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ibmV3UGVyc3BlY3RpdmVFeHRlbnNpb24xIgotICAgbmFtZT0ibmV3UGVyc3BlY3RpdmVFeHRlbnNpb24xIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCI+Ci0KLSAgIDxydW50aW1lPgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudGVzdHMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkucmVzb3VyY2VQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICA8YWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hY3Rpb25TZXQxIi8+Ci0gICAgICAgICA8cGVyc3BlY3RpdmVTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UudWkucmVzb3VyY2VQZXJzcGVjdGl2ZSIvPgotICAgICAgICAgPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJzb21lLm5ldy53aXphcmQiLz4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgcmF0aW89Ii4yNSIKLSAgICAgICAgICAgICAgIHJlbGF0aXZlPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzcyIKLSAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD0ibGVmdCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1ZpZXdQYXJ0Ii8+Ci0gICAgICAgICA8c2hvd0luUGFydCBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydCIvPgotICAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgaWNvbj0iYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLk5ld1dpemFyZDEiCi0gICAgICAgICAgICBuYW1lPSJTb21lIE5ldyBXaXphcmQiCi0gICAgICAgICAgICBpZD0ic29tZS5uZXcud2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1ByZWZlcmVuY2VQYWdlMS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdQcmVmZXJlbmNlUGFnZTEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1ZjBhZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1ByZWZlcmVuY2VQYWdlMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJuZXdQcmVmZXJlbmNlUGFnZTEiCi0gICBuYW1lPSJOZXdQcmVmZXJlbmNlUGFnZSBPbmUgUGx1Zy1pbiIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwcmVmZXJlbmNlUGFnZS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idGVzdER5bmFtaWNQcmVmZXJlbmNlUGFnZUFkZGl0aW9uIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmR5bmFtaWMuRHluYW1pY1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iZHluYW1pYy5wYXJlbnRQYWdlIgotICAgICAgICAgICAgaWQ9ImR5bmFtaWMucGFyZW50UGFnZSIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5keW5hbWljLkR5bmFtaWNQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJkeW5hbWljLnBhcmVudFBhZ2UiCi0gICAgICAgICAgICBuYW1lPSJkeW5hbWljLmNoaWxkUGFnZSIKLSAgICAgICAgICAgIGlkPSJkeW5hbWljLmNoaWxkUGFnZSIvPgotICAgPC9leHRlbnNpb24+Ci0KLQotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3UHJlZmVyZW5jZVBhZ2UxL3ByZWZlcmVuY2VQYWdlLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3UHJlZmVyZW5jZVBhZ2UxL3ByZWZlcmVuY2VQYWdlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY3M2E1Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1ByZWZlcmVuY2VQYWdlMS9wcmVmZXJlbmNlUGFnZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1Byb3BlcnR5UGFnZTEvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3UHJvcGVydHlQYWdlMS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjgyODY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3UHJvcGVydHlQYWdlMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJuZXdQcm9wZXJ0eVBhZ2UxIgotICAgbmFtZT0iTmV3UHJvcGVydHlQYWdlIE9uZSBQbHVnLWluIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InByb3BlcnR5UGFnZS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idGVzdER5bmFtaWNQcm9wZXJ0eVBhZ2VBZGRpdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0iamF2YS5sYW5nLk9iamVjdCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5keW5hbWljLkR5bmFtaWNQcm9wZXJ0eVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5wYWdlMSIKLSAgICAgICAgICAgIGlkPSJkeW5hbWljUHJvcGVydHlQYWdlMSIvPgotICAgPC9leHRlbnNpb24+Ci0KLQotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3UHJvcGVydHlQYWdlMS9wcm9wZXJ0eVBhZ2UuamFyIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdQcm9wZXJ0eVBhZ2UxL3Byb3BlcnR5UGFnZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDQ3MjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdQcm9wZXJ0eVBhZ2UxL3Byb3BlcnR5UGFnZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1N0YXJ0dXAxL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1N0YXJ0dXAxL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MDFjYzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdTdGFydHVwMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJuZXdTdGFydHVwMSIKLSAgIG5hbWU9Im5ld1N0YXJ0dXAxIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ic3RhcnR1cC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idGVzdER5bmFtaWNTdGFydHVwQWRkaXRpb24iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+Ci0gICAgICA8c3RhcnR1cCBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZHluYW1pYy5EeW5hbWljU3RhcnR1cCIvPgotICAgPC9leHRlbnNpb24+Ci0gCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdTdGFydHVwMS9zdGFydHVwLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3U3RhcnR1cDEvc3RhcnR1cC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMGViZTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdTdGFydHVwMS9zdGFydHVwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3VmlldzEvYW55dGhpbmcuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdWaWV3MS9hbnl0aGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzc3YTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdWaWV3MS9hbnl0aGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1ZpZXcxL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL29yZy5lY2xpcHNlLm5ld1ZpZXcxL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNTIxNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdWaWV3MS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJuZXdWaWV3MSIKLSAgIG5hbWU9Ik5ldyBWaWV3IE9uZSBQbHVnLUluIgotICAgdmVyc2lvbj0iMy4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InZpZXcuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiIGlkPSJ0ZXN0RHluYW1pY1ZpZXdBZGRpdGlvbiI+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmR5bmFtaWMuRHluYW1pY1ZpZXciCi0gICAgICAgICAgICBpY29uPSJhbnl0aGluZy5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UubmV3VmlldzEubmV3Q2F0ZWdvcnkxIgotICAgICAgICAgICAgbmFtZT0iTmV3VmlldzEiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UubmV3VmlldzEubmV3VmlldzEiPgotICAgICA8L3ZpZXc+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9Ik5ld0NhdGVnb3J5MSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5uZXdWaWV3MS5uZXdDYXRlZ29yeTEiLz4KLSAgICAgIDxzdGlja3lWaWV3Ci0gICAgICAgICAgICBjbG9zZWFibGU9ImZhbHNlIgotICAgICAgICAgICAgbW92ZWFibGU9ImZhbHNlIgotICAgICAgICAgICAgbG9jYXRpb249IkJPVFRPTSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5uZXdWaWV3MS5uZXdWaWV3MSIvPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgPHZpZXcKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5keW5hbWljLkR5bmFtaWNWaWV3IgotICAgICAgICAgICAgaWNvbj0iYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgbmFtZT0iTmV3VmlldzIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UubmV3VmlldzEubmV3VmlldzIiPgotICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdWaWV3MS92aWV3LmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvb3JnLmVjbGlwc2UubmV3VmlldzEvdmlldy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmE5OTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS9vcmcuZWNsaXBzZS5uZXdWaWV3MS92aWV3LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvdGVzdENvbnRlbnRUeXBlLnppcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvdGVzdENvbnRlbnRUeXBlLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlMzIzYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL3Rlc3RDb250ZW50VHlwZS56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL3dvcmtzcGFjZXMvZWRpdG9yU2Vzc2lvblRlc3RzLnppcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvd29ya3NwYWNlcy9lZGl0b3JTZXNzaW9uVGVzdHMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTIzNTIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvd29ya3NwYWNlcy9lZGl0b3JTZXNzaW9uVGVzdHMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS93b3Jrc3BhY2VzL2ltcG9ydEV4aXN0aW5nRnJvbURpclRlc3QuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZGF0YS93b3Jrc3BhY2VzL2ltcG9ydEV4aXN0aW5nRnJvbURpclRlc3QuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGIzNDQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvd29ya3NwYWNlcy9pbXBvcnRFeGlzdGluZ0Zyb21EaXJUZXN0LnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvd29ya3NwYWNlcy9pbnRyb1Nlc3Npb25UZXN0cy56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kYXRhL3dvcmtzcGFjZXMvaW50cm9TZXNzaW9uVGVzdHMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTIzNTIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RhdGEvd29ya3NwYWNlcy9pbnRyb1Nlc3Npb25UZXN0cy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kb2MvSW50cm9kdWN0aW9uLmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kb2MvSW50cm9kdWN0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NDBlNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvZG9jL0ludHJvZHVjdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IkJ1aWxkIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luTlQ7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlRoZSBXb3JrYmVuY2ggVGVzdCBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj4KLVRoZSBXb3JrYmVuY2ggVGVzdCBTdWl0ZTwvaDI+Ci1EYXZlIFNwcmluZ2dheQotPGJyPlNlcHRlbWJlciAyMDAxCi08aDM+Ci1JbiBCcmllZjwvaDM+Ci1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgVUkgVGVzdCBTdWl0ZS4mbmJzcDsgVGhpcyB0ZXN0IHN1aXRlIGlzIGF2YWlsYWJsZQotZnJvbSA8dHQ+b3JnLmVjbGlwc2UudWkudGVzdHM8L3R0PiBpbiB0aGUgZGVza3RvcCByZXBvc2l0b3J5IGFuZCBjb25zaXN0Ci1vZiBhIHNlcmllcyBvZiBub24taW50ZXJhY3RpdmUgc25pZmYgdGVzdHMgd2hpY2ggYXJlIHJ1biBhZnRlciBhIGJ1aWxkLAotcGx1cyBhIHNldCBvZiBpbnRlcmFjdGl2ZSB0ZXN0cyB3aGljaCByZXF1aXJlIGh1bWFuIGZlZWRiYWNrLiZuYnNwOyBZb3UKLWNhbiBydW4gYW55IG9mIHRoZXNlIGZyb20gdGhlIEpVbml0IEVjbGlwc2UgUGx1Z2luIFRlc3RzIGxhdW5jaGVyIG9yIGZyb20KLXRoZSBjb21tYW5kIGxpbmUuCi08cD5UaGUgPHR0Pm9yZy5lY2xpcHNlLnVpLnRlc3RzPC90dD4gcHJvamVjdCBpcyBvcmdhbml6ZWQgaW4gaGllcmFyY2hpY2FsCi1mYXNoaW9uLiZuYnNwOyBUaGUgcm9vdCBpcyA8dHQ+VWlUZXN0U3VpdGU8L3R0PiBpbiA8dHQ+b3JnLmVjbGlwc2UudWkudGVzdHM8L3R0Pi4mbmJzcDsKLVRoaXMgdGVzdCBzdWl0ZSBjb250YWlucyBhIGNvbGxlY3Rpb24gb2YgInNwZWNpYWxpemVkIHN1aXRlcyIgd2hpY2ggdGVzdAotc3BlY2lmaWMgYXJlYXMgb2YgZnVuY3Rpb25hbGl0eSBvciBjb21wb25lbnRzIGluIHRoZSB3b3JrYmVuY2guJm5ic3A7IEN1cnJlbnRseQotdGhlcmUgaXMgb25seSBvbmUgc3VpdGUsIDx0dD5BcGlUZXN0U3VpdGUKLTwvdHQ+aW48dHQ+IG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaTwvdHQ+LAotd2hpY2ggY29udGFpbnMgYSBudW1iZXIgb2YgdGVzdCBjYXNlcyB3aGljaCBkZWFsIHNwZWNpZmljYWxseSB3aXRoIHdvcmtiZW5jaAotQVBJLiZuYnNwOyBBIDx0dD51aVRlc3Q8L3R0PiBleHRlbnNpb24gaXMgZGVjbGFyZWQgZm9yIGVhY2ggc3VpdGUgc28gdGhhdAoteW91IGNhbiBydW4gZXZlcnkgdGVzdCBpbiB0aGUgd29ya2JlbmNoIG9yIGEgc3Vic2V0IG9mIHRoZSB0ZXN0cy4KLTxwPlRvIHJ1biB0aGUgVWlUZXN0U3VpdGUgZnJvbSB3aXRoaW4gRWNsaXBzZSBqdXN0IHNlbGVjdCBVaVRlc3RTdWl0ZS5qYXZhCi1pbiB0aGUgbmF2aWdhdG9yIGFuZCBpbnZva2UgUnVuID4gSlVuaXQgRWNsaXBzZSBQbHVnaW4gVGVzdHMuJm5ic3A7IFRoZQotcmVzdWx0cyBvZiB0aGUgdGVzdCBzdWl0ZSB3aWxsIGFwcGVhciBpbiB0aGUgSlVuaXQgdmlldy4KLTxoMz4KLUF1dG9tYXRlZCBTbmlmZiBUZXN0czwvaDM+Ci1UaGUgZm9sbG93aW5nIHByb2Nlc3MgaXMgdXNlZCB0byBydW4gdGhlIHdvcmtiZW5jaCBVSSBzbmlmZiB0ZXN0cyBhZnRlcgotYSBidWlsZC4KLTxwPlRvIGNyZWF0ZSB0aGUgc25pZmYgdGVzdCBmaWxlcyAuLgotPG9sPgotPGxpPgotRXhwb3J0IHRoZSA0IHRlc3QgcHJvamVjdHMgaW50byBhIHppcCBmaWxlLiZuYnNwOyBUaGUgb3B0aW9ucyBpbiB0aGUgZXhwb3J0Ci13aXphcmQgc2hvdWxkIGJlIHNldCB0byAiQ29tcHJlc3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIiBhbmQgbm90ICJDcmVhdGUKLWRpcmVjdG9yeSBTdHJ1Y3R1cmUiLjwvbGk+Ci08L29sPgotVG8gcnVuIHRoZSBzbmlmZiB0ZXN0cyBpbiBhIGZyZXNoIGJ1aWxkIG9mIEVjbGlwc2UgLi4KLTxvbD4KLTxsaT4KLVVuemlwIHRoZSB6aXAgZmlsZSBpbiB0aGUgRWNsaXBzZSBwbHVnaW5zIGRpcmVjdG9yeS48L2xpPgotCi08bGk+Ci1PbiBXaW5kb3dzIGNvcHkgdWlTbmlmZi5iYXQgaW4gdGhlIG9yZy5lY2xpcHNlLnVpLnRlc3RzIHBsdWdpbiBkaXJlY3RvcnkKLXRvIHRoZSBFY2xpcHNlIGhvbWUgZGlyZWN0b3J5LiZuYnNwOyBPbiBMaW51eCBjb3B5IHVpU25pZmYgaW5zdGVhZC48L2xpPgotCi08bGk+Ci1SdW4gdWlTbmlmZi5iYXQgKCBvciB1aVNuaWZmICkuJm5ic3A7IFJlZGlyZWN0IHRoZSByZXN1bHRzIGludG8gYSBmaWxlLjwvbGk+Ci08L29sPgotCi08aDM+Ci1UZXN0IFBhdHRlcm5zPC9oMz4KLUluIG91ciBvd24gdGVzdGluZyB3ZSBoYXZlIGRpc2NvdmVyZWQgYSBudW1iZXIgb2YgY29tbW9uIHRlc3QgcGF0dGVybnMuJm5ic3A7Ci1JbiBvcmRlciB0byBlbmNvdXJhZ2UgYSBjb25zaXN0ZW50IGFwcHJvYWNoIGZvciB0ZXN0aW5nIHRoZXkgYXJlIHB1Ymxpc2hlZAotYmVsb3cuCi08cD48Yj5TaW1wbGUgU2V0dGVycywgR2V0dGVycyBhbmQgQ29tbWFuZHM8L2I+Ci08cD5TY2VuYXJpbzogWW91IHdhbnQgdG8gdGVzdCBzZXR0ZXJzLCBjb21tYW5kcyBhbmQgZ2V0dGVycyBvbiBhbiBpbnRlcmZhY2UuCi08cD5NZXRob2Q6IENhbGwgdGhlIHNldHRlciBvciBjb21tYW5kIHdoaWNoIGFmZmVjdHMgdGhlIG9iamVjdCBzdGF0ZS4mbmJzcDsKLUNhbGwgdGhlIGdldHRlciB0byB2ZXJpZnkgdGhhdCBzdGF0ZS4KLTxwPjxiPlRvcCBEb3duIENvdmVyYWdlPC9iPgotPHA+U2NlbmFyaW86IFlvdSB3YW50IHRvIGRlbW9uc3RyYXRlIHRob3JvdWdoIGNvdmVyYWdlIG9mIGEgY29tcG9uZW50LgotPHA+TWV0aG9kOiBTdGFydCBhdCB0aGUgb2JqZWN0IHJvb3Qgb2YgdGhlIGluc3RhbmNlIGhpZXJhcmNoeSBhbmQgdGVzdAotZXZlcnkgY2xhc3MgZG93bndhcmRzIHRvIHRoZSBsZWFmIGNsYXNzZXMuJm5ic3A7IFN0b3Agd2hlbiB5b3UgZW5jb3VudGVyCi1hIGxheWVyIHdoaWNoIGFscmVhZHkgaGFzIEpVbml0IHRlc3QgY2FzZXMuJm5ic3A7IEZvciBpbnN0YW5jZSwgaW4gdGhlCi13b3JrYmVuY2ggVUkgZG9uJ3QgdGVzdCBKRmFjZSwgU1dULCBvciBjb3JlLiZuYnNwOyBUaGV5IHNob3VsZCBoYXZlIHRoZWlyCi1vd24gdGVzdCBzdWl0ZXMgYW5kIGFyZSBhc3N1bWVkIHRvIHdvcmsuCi08cD48Yj5TdXBlcmNsYXNzIFN1YmNsYXNzPC9iPgotPHA+U2NlbmFyaW86IFlvdSB3YW50IHRvIHRlc3QgRCwgd2hpY2ggaXMgYSBzdWJjbGFzcyBvZiBCLgotPHA+TWV0aG9kOiBJbXBsZW1lbnQgYSB0ZXN0IGNhc2UgZm9yIEIgY2FsbGVkIEJUZXN0LiZuYnNwOyBUaGVuIGNyZWF0ZQotYSBzdWJjbGFzcyBvZiBCVGVzdCBjYWxsZWQgRFRlc3Qgd2hpY2ggdGVzdHMgRC4mbmJzcDsgSWYgQiBpcyBhbiBhYnN0cmFjdAotY2xhc3MgdXNlIGEgZmFjdG9yeSBtZXRob2QgaW4gQlRlc3QgdG8gY3JlYXRlIHRoZSB0ZXN0IG9iamVjdC4KLTxwPjxiPkxpc3RlbmVyIFNvdXJjZTwvYj4KLTxwPlNjZW5hcmlvOiBZb3Ugd2FudCB0byB0ZXN0IFMsIGEgY2xhc3Mgd2hpY2ggZmlyZXMgZXZlbnRzIHdoZW4gYSBwYXJ0aWN1bGFyCi1zaXR1YXRpb24gb2NjdXJzLgotPHA+TWV0aG9kOiBJbXBsZW1lbnQgYSBsaXN0ZW5lciBmb3IgUyB3aGljaCByZWNvcmRzIHRoZSByZWNlcHRpb24gb2YgZXZlbnRzLgotVGhlbiB3cml0ZSBhIHRlc3QgY2xhc3MgZm9yIFMgY2FsbGVkIFNUZXN0IHdoaWNoIGRvZXMgc29tZXRoaW5nIHdoaWNoIHNob3VsZAotY2F1c2UgdGhvc2UgZXZlbnRzIHRvIGZpcmUuJm5ic3A7IFZlcmlmeSB0aGUgcmVjZXB0aW9uIG9mIGV2ZW50cyBhZnRlcndhcmRzLgotPHA+PGI+TXVsdGlwbGUgU2Vzc2lvbjwvYj4KLTxwPlNjZW5hcmlvOiBZb3Ugd2FudCB0byB0ZXN0IHRoZSBwZXJzaXN0YW5jZSBvZiBzdGF0ZSBmcm9tIG9uZSBzZXNzaW9uCi10byB0aGUgbmV4dC4KLTxwPk1ldGhvZDogWW91IG5lZWQgdG8gY3JlYXRlIHR3byB0ZXN0IHN1aXRlcy4mbmJzcDsgT25lIHRlc3Qgc3VpdGUgd2lsbAotc2V0IHVwIHRoZSBzdGF0ZS4mbmJzcDsgVGhlIG90aGVyIHdpbGwgdmVyaWZ5IHRoZSBzdGF0ZS4mbmJzcDsgUnVuIHRoZW0KLXNlcXVlbnRpYWxseSBpbiB0d28gc2VwYXJhdGUgcHJvY2Vzc2VzLgotPHA+PGI+R2xvYmFsIFN0YXRlPC9iPgotPHA+U2NlbmFyaW86IEluIEVjbGlwc2UgdGhlIHdvcmtiZW5jaCBpcyBhIGdsb2JhbCBvYmplY3QuJm5ic3A7IFVuZm9ydHVuYXRlbHksCi10aGlzIG1lYW5zIHRoYXQgb25lIHRlc3QgY2FzZSBtYXkgbW9kaWZ5IHRoYXQgc3RhdGUgYW5kIGFmZmVjdCB0aGUgb3V0Y29tZQotb2YgYW5vdGhlciB1bnJlbGF0ZWQgdGVzdCBjYXNlLiZuYnNwOyBIb3cgY2FuIHlvdSBhdm9pZCB0aGlzIHByb2JsZW0/Ci08cD5NZXRob2Q6IElmIHRoZSB0ZXN0IGNhc2UgbW9kaWZpZXMgdGhlIHN0YXRlIG9mIGEgd2luZG93IG9yIHNvbWV0aGluZwotaW4gdGhlIHdpbmRvdyB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyB3aW5kb3cgYXMgcGFydCBvZiB0aGUgc2V0VXAgZm9yIHRoZQotdGVzdCBjYXNlLiZuYnNwOyBSdW4gdGhlIHRlc3QgY29kZSB3aXRoaW4gdGhhdCB3aW5kb3cgYW5kIHRoZW4gY2xvc2UgdGhlCi10ZXN0IHdpbmRvdyBpbiB0aGUgdGVhckRvd24gbWV0aG9kLiZuYnNwOyBUaGUgbW9kaWZpZWQgc3RhdGUgd2lsbCBiZSBkaXNjYXJkZWQKLXdoZW4gdGhlIHdpbmRvdyBpcyBjbG9zZWQKLTxwPjxiPkxpZmVjeWNsZTwvYj4KLTxwPlNjZW5hcmlvOiBXaXRoaW4gdGhlIHdvcmtiZW5jaCB0aGVyZSBhcmUgdmFyaW91cyBpbnRlcmZhY2VzLCBzdWNoIGFzCi1JVmlld1BhcnQsIHdoaWNoIGFyZSBkZWZpbmVkIGFzIEFQSSBhbmQgaW1wbGVtZW50ZWQgYnkgcGx1Z2luIGNvZGUuJm5ic3A7Ci1UaGVyZSBpcyBubyBuZWVkIHRvIHRlc3QgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UsIGJ1dCBpdCBpcwotZ29vZCB0byB0ZXN0IHRoZSBsaWZlY3ljbGUgYXMgaW1wbGVtZW50ZWQgYnkgb2JqZWN0cyB3aGljaCBjYWxsIHRoZSBpbnRlcmZhY2UuCi08cD5NZXRob2Q6IERlZmluZSBhIGNsYXNzIFggd2hpY2ggaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIGFuZCByZWNvcmRzCi10aGUgaW52b2NhdGlvbiBvZiB2YXJpb3VzIG1ldGhvZHMuJm5ic3A7IENyZWF0ZSBhIHNjZW5hcmlvIHdoZXJlIHRoaXMgY2xhc3MKLWlzIGxvYWRlZCBhbmQgc2hvdWxkIHJlY2VpdmUgZXZlbnRzLiZuYnNwOyBBZnRlcndhcmRzLCB0ZXN0IHRoYXQgdGhvc2UKLW1ldGhvZHMgd2VyZSBjYWxsZWQuCi08cD48Yj5QaWVyY2luZyB0aGUgRW5jYXBzdWxhdGlvbjwvYj4KLTxwPlNjZW5hcmlvOiBUbyB0ZXN0IHRoZSBiZWhhdmlvciBvZiBjb21tYW5kcyB3aGljaCBtb2RpZnkgdGhlIHN0YXRlIG9mCi10aGUgb2JqZWN0IHdoZW4gdGhlcmUgYXJlIG5vIHB1YmxpYyBpbnRlcmZhY2VzIHRvIHF1ZXJ5IHRoYXQgc3RhdGUuCi08cD5NZXRob2Q6IElmIHBvc3NpYmxlLCBjYXN0IHRoZSBpbnRlcmZhY2UgdG8gYSBjb25jcmV0ZSBjbGFzcyB3aXRoIGFkZGl0aW9uYWwKLXB1YmxpYyBtZXRob2RzLiZuYnNwOyBGb3IgaW5zdGFuY2UsIGluIHRoZSB3b3JrYmVuY2ggdGhlIHVuZGVybHlpbmcgc3RydWN0dXJlCi1mb3IgSVdvcmtiZW5jaCBpcyBleHBvc2VkIGluIFdvcmtiZW5jaC4mbmJzcDsgR2l2ZW4gYSBXb3JrYmVuY2ggb2JqZWN0LAoteW91IGNhbiBnZXQgdGhlIG1lbnUsIHRvb2xiYXIsIGV0YywgYW5kIGludGVyYWN0IGRpcmVjdGx5IHdpdGggdGhlIGFjdGlvbnMKLXRvIHZlcmlmeSB0aGVpciBzdGF0ZSBvciBpbnZva2UgdGhlbSBkaXJlY3RseS4mbmJzcDsgVGhpcyBpcyBhbHNvIGEgdXNlZnVsCi13YXkgdG8gc2ltdWxhdGUgYWN0aW9uIGludm9jYXRpb24gZnJvbSB0aGUgVUkuCi08cD48Yj5Nb2NrIE9iamVjdHM8L2I+Ci08cD5TY2VuYXJpbzogVG8gdGVzdCB0aGUgaW1wbGVtZW50YXRpb24gb2YgYW4gaW50ZXJmYWNlIHdoaWNoIGluc3RhbnRpYXRlcwotYW4gZXh0ZW5zaW9uLiZuYnNwOyBGb3IgaW5zdGFuY2UsIGluIHRoZSB0ZXN0IGNhc2UgZm9yIElXb3JrYmVuY2hQYWdlIHdlCi1uZWVkIHRvIG9wZW4gdmlld3MgYW5kIGVkaXRvcnMuCi08cD5NZXRob2Q6IElmIHdlIHJlZmVyZW5jZSB2aWV3cyBhbmQgZWRpdG9ycyB3aGljaCBleGlzdCB3aXRoaW4gdGhlIFdvcmtiZW5jaAotVUkgU3RhbmRhcmQgQ29tcG9uZW50cyBwcm9qZWN0IHRoZSB0ZXN0IGNhc2UgaXMgdnVsbmVyYWJsZSB0byBjaGFuZ2UgaW4KLXRob3NlIGNvbXBvbmVudHMuJm5ic3A7IEluIHRoaXMgY2FzZSB3ZSdyZSBub3QgdGVzdGluZyB0aGUgY29tcG9uZW50cywKLXdlJ3JlIHRlc3RpbmcgSVdvcmtiZW5jaFBhZ2UsIHNvIHdlIGltcGxlbWVudGVkIHNvbWUgbGlnaHQgd2VpZ2h0IG1vY2sKLXZpZXdzIGFuZCBlZGl0b3JzIHdoaWNoIGRvIG5vdGhpbmcgbW9yZSB0aGFuIHJlY29yZCB0aGVpciBvd24gY3JlYXRpb24KLWFuZCBsaWZlY3ljbGUuCi08YnI+Jm5ic3A7Ci08YnI+Jm5ic3A7Ci08YnI+Jm5ic3A7Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9kb2MvSlVuaXRQcmFjdGljZXMuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RvYy9KVW5pdFByYWN0aWNlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmUwYjA1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2RvYy9KVW5pdFByYWN0aWNlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IkJ1aWxkIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTWljcm9zb2Z0IEZyb250UGFnZSA0LjAiPgotICAgPHRpdGxlPlRoZSBXb3JrYmVuY2ggVGVzdCBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMz4KLVBsdWdpbiBUZXN0IFByYWN0aWNlczwvaDM+Ci1JbiBvdXIgb3duIHRlc3Rpbmcgd2UgaGF2ZSBkaXNjb3ZlcmVkIGEgbnVtYmVyIG9mIGNvbW1vbiB0ZXN0IHBhdHRlcm5zLiZuYnNwOwotSW4gb3JkZXIgdG8gZW5jb3VyYWdlIGEgY29uc2lzdGVudCBhcHByb2FjaCBmb3IgdGVzdGluZyB0aGV5IGFyZSBwdWJsaXNoZWQKLWJlbG93LgotPHA+PGI+U2V0dGVycywgR2V0dGVycyBhbmQgQ29tbWFuZHM8L2I+Ci08cD5TY2VuYXJpbzogWW91IHdhbnQgdG8gdGVzdCBzZXR0ZXJzLCBnZXR0ZXJzLCBhbmQgY29tbWFuZHMgaW4gYW4gaW50ZXJmYWNlLgotPHA+TWV0aG9kOiBDYWxsIHRoZSBzZXR0ZXIgb3IgY29tbWFuZCB3aGljaCBhZmZlY3RzIHRoZSBvYmplY3Qgc3RhdGUuJm5ic3A7Ci1DYWxsIHRoZSBnZXR0ZXIgdG8gdmVyaWZ5IHRoYXQgc3RhdGUuJm5ic3A7IElmIHlvdSBjYW4ndCBzZWUgdGhpcyBzdGF0ZQotc2VlIHRvICJQaWVyY2luZyBhbiBJbnRlcmZhY2UiLgotPHA+PGI+U3ViY2xhc3MgU3VwZXJjbGFzczwvYj4KLTxwPlNjZW5hcmlvOiBZb3Ugd2FudCB0byB0ZXN0IEQsIHdoaWNoIGlzIGEgc3ViY2xhc3Mgb2YgQi4KLTxwPk1ldGhvZDogSW1wbGVtZW50IGEgdGVzdCBjYXNlIGZvciBCIGNhbGxlZCBCVGVzdC4mbmJzcDsgVGhlbiBjcmVhdGUKLWEgc3ViY2xhc3Mgb2YgQlRlc3QgY2FsbGVkIERUZXN0IHdoaWNoIHRlc3RzIEQgdGhlIGFkZGl0aW9uYWwgbWV0aG9kcyBvbgotRC4mbmJzcDsgQWRkIGEgZmFjdG9yeSBtZXRob2QgdG8gQlRlc3QgdG8gY3JlYXRlIGFueSByZXF1aXJlZCB0ZXN0IG9iamVjdHMKLXdoaWNoIG1heSBiZSBzcGVjaWZpYyB0byB0aGUgdGVzdCBjYXNlIGFuZCBvdmVycmlkZSBpdCBpbiBEVGVzdC4mbmJzcDsKLVdoZW4gdGhpcyBhcHByb2FjaCBpcyB0YWtlbiB5b3UgaW5oZXJpdCBhbGwgb2YgdGhlIEJUZXN0IG1ldGhvZHMgd2l0aGluCi10aGUgc3ViY2xhc3MgRFRlc3QuCi08cD48Yj5FdmVudCBOb3RpZmljYXRpb248L2I+Ci08cD5TY2VuYXJpbzogWW91IHdhbnQgdG8gdGVzdCBTb3VyY2UsIGEgY2xhc3Mgd2hpY2ggZmlyZXMgZXZlbnRzIHdoZW4gYQotcGFydGljdWxhciBzaXR1YXRpb24gb2NjdXJzLgotPHA+TWV0aG9kOiBJbXBsZW1lbnQgYSBsaXN0ZW5lciBmb3IgU291cmNlIHdoaWNoIGNhbiByZWNvcmQgdGhlIHJlY2VwdGlvbgotb2YgZXZlbnRzLiBUaGVuIHdyaXRlIGEgdGVzdCBjbGFzcyBmb3IgU291cmNlIGNhbGxlZCBTb3VyY2VUZXN0IHdoaWNoIGRvZXMKLXNvbWV0aGluZyB3aGljaCBzaG91bGQgY2F1c2UgdGhvc2UgZXZlbnRzIHRvIGZpcmUuJm5ic3A7IFZlcmlmeSB0aGUgcmVjZXB0aW9uCi1vZiBldmVudHMgYWZ0ZXJ3YXJkcy4KLTxwPkFkZGl0aW9uYWwgVGlwczogVGhlIENhbGxIaXN0b3J5IGNsYXNzIGluIG9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwgY2FuCi1iZSB1c2VkIHRvIHJlY29yZCB0aGUgbWV0aG9kcyBpbnZva2VkIGluIGEgdGFyZ2V0IG9iamVjdC4mbmJzcDsgSWYgdGhlCi1saXN0ZW5lciBjYW4gYmUgYWRkZWQgdGhlbiB0ZXN0IHRoZSByZW1vdmFsIG9mIHRoZSBsaXN0ZW5lciBhbHNvLiZuYnNwOwotTWFrZSBzdXJlIHRoYXQgZXZlbnRzIGFyZSBub3QgcmVjZWl2ZWQgYWZ0ZXIgdGhlIGxpc3RlbmVyIGhhcyBiZWVuIHJlbW92ZWQuCi08cD48Yj5Bdm9pZGluZyBHbG9iYWwgU3RhdGU8L2I+Ci08cD5TY2VuYXJpbzogSW4gRWNsaXBzZSB0aGUgd29ya2JlbmNoIGlzIGEgZ2xvYmFsIG9iamVjdC4mbmJzcDsgVW5mb3J0dW5hdGVseSwKLXRoaXMgbWVhbnMgdGhhdCBvbmUgdGVzdCBjYXNlIG1heSBtb2RpZnkgdGhhdCBzdGF0ZSBvZiB0aGUgd29ya2JlbmNoIGFuZAotYWZmZWN0IHRoZSBvdXRjb21lIG9mIG90aGVyIHVucmVsYXRlZCB0ZXN0IGNhc2VzLiZuYnNwOyBIb3cgY2FuIHlvdSBhdm9pZAotdGhpcyBwcm9ibGVtPwotPHA+TWV0aG9kOiBJZiB0aGUgdGVzdCBjYXNlIG1vZGlmaWVzIHRoZSBzdGF0ZSBvZiBhIHdpbmRvdyBvciBzb21ldGhpbmcKLWluIHRoZSB3aW5kb3cgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgd2luZG93IGFzIHBhcnQgb2YgdGhlIHNldFVwIGZvciB0aGUKLXRlc3QgY2FzZS4mbmJzcDsgUnVuIHRoZSB0ZXN0IGNvZGUgd2l0aGluIHRoYXQgd2luZG93IGFuZCB0aGVuIGNsb3NlIHRoZQotdGVzdCB3aW5kb3cgaW4gdGhlIHRlYXJEb3duIG1ldGhvZC4mbmJzcDsgVGhlIG1vZGlmaWVkIHN0YXRlIHdpbGwgYmUgZGlzY2FyZGVkCi13aGVuIHRoZSB3aW5kb3cgaXMgY2xvc2VkLgotPHA+QWRkaXRpb25hbCBUaXBzOiBUaGUgVUlUZXN0Q2FzZSBjbGFzcyBpbiBvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsIGNhbgotYmUgdXNlZCBhcyBhIHN1cGVyY2xhc3MgZm9yIHlvdXIgdGVzdCBjYXNlLiZuYnNwOyBJdCBwcm92aWRlcyB1c2VmdWwgbWV0aG9kcwotZm9yIHRoZSBjcmVhdGlvbiBvZiBuZXcgd2luZG93cywgcGFnZXMsIGV0YywgYW5kIHRoZWlyIGRpc3Bvc2FsLgotPHA+PGI+UGllcmNpbmcgdGhlIEVuY2Fwc3VsYXRpb248L2I+Ci08cD5TY2VuYXJpbzogVG8gdGVzdCB0aGUgYmVoYXZpb3Igb2YgY29tbWFuZHMgd2hpY2ggbW9kaWZ5IHRoZSBzdGF0ZSBvZgotdGhlIG9iamVjdCB3aGVuIHRoZXJlIGFyZSBubyBwdWJsaWMgaW50ZXJmYWNlcyB0byBxdWVyeSB0aGF0IHN0YXRlLgotPHA+TWV0aG9kOiBJZiBwb3NzaWJsZSwgY2FzdCB0aGUgaW50ZXJmYWNlIHRvIGEgY29uY3JldGUgY2xhc3Mgd2l0aCBhZGRpdGlvbmFsCi1wdWJsaWMgbWV0aG9kcy4mbmJzcDsgRm9yIGluc3RhbmNlLCBpbiB0aGUgd29ya2JlbmNoIHRoZSB1bmRlcmx5aW5nIHN0cnVjdHVyZQotZm9yIElXb3JrYmVuY2ggaXMgZXhwb3NlZCBpbiBXb3JrYmVuY2guJm5ic3A7IEdpdmVuIGEgV29ya2JlbmNoIG9iamVjdCwKLXlvdSBjYW4gZ2V0IHRoZSBtZW51LCB0b29sYmFyLCBldGMsIGFuZCBpbnRlcmFjdCBkaXJlY3RseSB3aXRoIHRob3NlIG9iamVjdHMKLXRvIHZlcmlmeSB0aGVpciBzdGF0ZSBvciBpbnZva2UgdGhlbSBkaXJlY3RseS4KLTxwPkFkZGl0aW9uYWwgVGlwczogVGhlIEFjdGlvblV0aWwgY2xhc3MgaW4gb3JnLmVjbGlwc2UudWkudGVzdHMudXRpbCBjYW4KLWJlIHVzZWQgdG8gaW52b2tlIGFjdGlvbnMgd2l0aGluIGEgd2luZG93IG9yIG1lbnUgbWFuYWdlci4KLTxwPjxiPkV4dGVuc2lvbiBDcmVhdGlvbjwvYj4KLTxwPlNjZW5hcmlvOiBZb3Ugd2FudCB0byB0ZXN0IHRoZSBjcmVhdGlvbiBvZiBhbiBleHRlbnNpb24uJm5ic3A7IEZvciBpbnN0YW5jZSwKLXRoZSBJV29ya2JlbmNoUGFnZSBoYXMgYSBtZXRob2QgY2FsbGVkIG9wZW5FZGl0b3Igd2hpY2ggY3JlYXRlcyBhbiBlZGl0b3IKLWV4dGVuc2lvbiwgYW5kIGFub3RoZXIgY2FsbGVkIHNob3dWaWV3IHdoaWNoIGNyZWF0ZXMgYSB2aWV3IGV4dGVuc2lvbi4mbmJzcDsKLUhvdyBkbyB5b3UgdGVzdCB0aGVzZT8KLTxwPk1ldGhvZDogT2J2aW91c2x5IHdlIGNhbiB0ZXN0IHRoZXNlIG1ldGhvZHMgYnkgaW52b2tpbmcgdGhlbS4mbmJzcDsKLUhvd2V2ZXIsIGVhY2ggb2YgdGhlbSB0YWtlIGFuIGVkaXRvciBvciB2aWV3IGlkLiZuYnNwOyBXaGljaCBpZCdzIGRvIHdlCi11c2U/Jm5ic3A7IElmIHdlIHJlZmVyZW5jZSB2aWV3cyBhbmQgZWRpdG9ycyB3aGljaCBleGlzdCB3aXRoaW4gdGhlIFdvcmtiZW5jaAotVUkgU3RhbmRhcmQgQ29tcG9uZW50cyBwcm9qZWN0IHRoZSB0ZXN0IGNhc2UgaXMgdnVsbmVyYWJsZSB0byBjaGFuZ2UgaW4KLXRob3NlIGNvbXBvbmVudHMuJm5ic3A7IEJ1dCB3ZSdyZSBub3QgdGVzdGluZyB0aG9zZSBzdGFuZGFyZCBjb21wb25lbnRzLAotd2UncmUgYWN0dWFsbHkgdGVzdGluZyBJV29ya2JlbmNoUGFnZSwgc28gaXQgaXMgYmV0dGVyIHRvIGltcGxlbWVudCBzb21lCi1saWdodCB3ZWlnaHQgbW9jayB2aWV3cyBhbmQgZWRpdG9ycyB3aGljaCBkbyBub3RoaW5nIG1vcmUgdGhhbiByZWNvcmQgdGhlaXIKLW93biBjcmVhdGlvbiBhbmQgbGlmZWN5Y2xlLgotPHA+PGI+RXh0ZW5zaW9uIExpZmVjeWNsZTwvYj4KLTxwPlNjZW5hcmlvOiBXaXRoaW4gdGhlIHdvcmtiZW5jaCB0aGVyZSBhcmUgdmFyaW91cyBpbnRlcmZhY2VzLCBzdWNoIGFzCi1JVmlld1BhcnQsIHdoaWNoIGFyZSBkZWZpbmVkIGFzIEFQSSBhbmQgaW1wbGVtZW50ZWQgYnkgcGx1Z2luIGNvZGUuJm5ic3A7Ci1UaGVyZSBpcyBubyBuZWVkIHRvIHRlc3QgdGhlIGltcGxlbWVudGF0aW9uIG9mIGFuIGludGVyZmFjZSBsaWtlIHRoaXMgaWYKLXlvdSBkZWZpbmUgaXQgYW5kIGV4cGVjdCBvdGhlcnMgdG8gaW1wbGVtZW50IGl0LiZuYnNwOyBIb3dldmVyLCBpdCBpcyBpbXBvcnRhbnQKLXRvIHRlc3QgdGhlIGxpZmVjeWNsZSBvZiB0aGUgb2JqZWN0IGFzIGltcGxlbWVudGVkIGJ5IHRob3NlIG9iamVjdHMgd2hpY2gKLWNyZWF0ZSBhbmQgY2FsbCB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgotPHA+TWV0aG9kOiBEZWZpbmUgYSBjbGFzcyBYIHdoaWNoIGltcGxlbWVudHMgdGhlIGludGVyZmFjZSBhbmQgcmVjb3JkcwotdGhlIGludm9jYXRpb24gb2YgdmFyaW91cyBtZXRob2RzLiZuYnNwOyBDcmVhdGUgYSBzY2VuYXJpbyB3aGVyZSB0aGlzIGNsYXNzCi1pcyBpbnN0YW50aWF0ZWQgYW5kIHNob3VsZCByZWNlaXZlIGV2ZW50cy4mbmJzcDsgQWZ0ZXJ3YXJkcywgdGVzdCB0aGF0Ci10aG9zZSBtZXRob2RzIHdlcmUgY2FsbGVkLgotPHA+QWRkaXRpb25hbCBUaXBzOiBUaGUgQ2FsbEhpc3RvcnkgY2xhc3MgaW4gb3JnLmVjbGlwc2UudWkudGVzdHMudXRpbCBjYW4KLWJlIHVzZWQgdG8gcmVjb3JkIHRoZSBtZXRob2RzIGludm9rZWQgaW4gYSB0YXJnZXQgb2JqZWN0LgotPHA+PGI+U2Vzc2lvbiBQZXJzaXN0ZW5jZTwvYj4KLTxwPlNjZW5hcmlvOiBZb3Ugd2FudCB0byB0ZXN0IHRoZSBwZXJzaXN0ZW5jZSBvZiBzdGF0ZSBmcm9tIG9uZSBzZXNzaW9uCi10byB0aGUgbmV4dC4KLTxwPk1ldGhvZDogWW91IG5lZWQgdG8gY3JlYXRlIHR3byB0ZXN0IGNhc2VzLiZuYnNwOyBPbmUgdGVzdCBjYXNlIHdpbGwKLXNldCB1cCB0aGUgc3RhdGUuJm5ic3A7IFRoZSBvdGhlciB3aWxsIHZlcmlmeSB0aGUgc3RhdGUuJm5ic3A7IFJ1biB0aGVtCi1zZXF1ZW50aWFsbHkgaW4gdHdvIHNlcGFyYXRlIHByb2Nlc3Nlcy4KLTxwPjxiPlRlc3RpbmcgTWl4aW5zPC9iPgotPHA+U2NlbmFyaW86IFdpdGhpbiB0aGUgd29ya2JlbmNoIHRoZXJlIGFyZSBtYW55IGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50Ci1hIHBhcnRpY3VsYXIgaW50ZXJmYWNlLiZuYnNwOyBHaXZlbiB0aGUgcmVzcG9uc2FiaWxpdHkgZGVmaW5lZCBieSB0aGUgY2xhc3MKLWFuZCB0aGUgaW50ZXJmYWNlcyBzZXBhcmF0ZWx5LCBob3cgZG8geW91IG9yZ2FuaXplIHRoZSB0ZXN0IGNhc2VzPwotPHA+TWV0aG9kOiBZb3UgbWF5IGNob29zZSB0byB1c2UgYSBvbmUgdG8gb25lIHJ1bGUgb2YgdGh1bWIuJm5ic3A7IENyZWF0ZQotb25lIHRlc3QgY2FzZSBjbGFzcyBmb3IgZWFjaCBjbGFzcyBvciBpbnRlcmZhY2UgaW4gdGhlIG1peGluLiZuYnNwOyBUaGlzCi1oaWVyYXJjaGljYWwgc2VwYXJhdGlvbiBtYWtlcyBpdCBlYXNpZXIgdG8gcmV1c2UgZWFjaCB0ZXN0IGNhc2Ugd2hlbiBhbgotaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IG1vcmUgdGhhbiBvbmUgY2xhc3MuJm5ic3A7IEl0IGFsc28gc2ltcGxpZmllcwotdGhlIGFjY291bnRpbmcgcmVxdWlyZWQgdG8gdHJhY2sgd2hpY2ggdGVzdCBjYXNlcyBoYXZlIGJlZW4gd3JpdHRlbi4KLTxwPjxiPldoZXJlIERvIEkgU3RvcD88L2I+Ci08cD5TY2VuYXJpbzogVGhlIHdvcmtiZW5jaCBoYXMgbWFueSBsYXllcnMuJm5ic3A7IElmIHlvdSBhcmUgYSBwbHVnaW4gZGV2ZWxvcGVyCi13aGF0IGFyZSB0aGUgYm91bmRzIG9mIHRoZSBhcmVhIHlvdSBzaG91bGQgdGVzdD8KLTxwPk1ldGhvZDogSW4gZ2VuZXJhbCwgeW91IHNob3VsZCBhc3N1bWUgdGhhdCBldmVyeXRoaW5nIHlvdSByZWx5IHVwb24KLXdvcmtzLiZuYnNwOyBJZiB5b3UgZG9uJ3QgdGFrZSB0aGlzIGFwcHJvYWNoIHlvdSB3aWxsIHNwZW5kIGVuZGxlc3MgaG91cnMKLXRlc3RpbmcgY29kZSB3cml0dGVuIGJ5IG90aGVyIHBlb3BsZS4gRm9yIGluc3RhbmNlLCBpbiB0aGUgd29ya2JlbmNoIFVJCi13ZSBkb24ndCB0ZXN0IEpGYWNlLCBTV1QsIG9yIGNvcmUuJm5ic3A7IFRoZXkgaGF2ZSB0aGVpciBvd24gdGVzdCBzdWl0ZXMKLWFuZCBhcmUgYXNzdW1lZCB0byB3b3JrLiZuYnNwOyBPbiB0aGUgb3RoZXIgaGFuZCwgeW91IHNob3VsZCBhdCBsZWFzdCB3cml0ZQotdGVzdHMgZm9yIGV2ZXJ5IEFQSSB3aGljaCB5b3UgcHJvdmlkZSB0byBvdGhlcnMuJm5ic3A7IEluIEVjbGlwc2Ugd2UgaGF2ZQotdmVyeSBzdHJvbmcgcnVsZXMgZm9yIEFQSSBjb21wYXRhYmlsaXR5LCBhbmQgeW91ciBvd24gdGVzdCBjYXNlcyBhbGxvdwoteW91IHRvIGNoYW5nZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgQVBJIHdpdGggc29tZSBjb25maWRlbmNlLgotPGJyPiZuYnNwOwotPGJyPiZuYnNwOwotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvaWNvbnMvYW55dGhpbmcuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvaWNvbnMvYW55dGhpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM3N2E3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2ljb25zL2FueXRoaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2ljb25zL2JpbmFyeV9jby5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9pY29ucy9iaW5hcnlfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2E1MDhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2ljb25zL2JpbmFyeV9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9pY29ucy9keW5hbWljLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2ljb25zL2R5bmFtaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM3N2E3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2ljb25zL2R5bmFtaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvaWNvbnMvZWRpdG9yLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2ljb25zL2VkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDkyYmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvaWNvbnMvZWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUdJRjg5YRANCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9pY29ucy9tb2NrZWRpdG9ycGFydDEuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvaWNvbnMvbW9ja2VkaXRvcnBhcnQxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNzdhNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9pY29ucy9tb2NrZWRpdG9ycGFydDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvaWNvbnMvbW9ja2VkaXRvcnBhcnQyLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2ljb25zL21vY2tlZGl0b3JwYXJ0Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzc3YTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvaWNvbnMvbW9ja2VkaXRvcnBhcnQyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL2ljb25zL3ZpZXcuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvaWNvbnMvdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzc3YTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvaWNvbnMvdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiYjZiZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgIAotPCEtLSBTdGFydHVwIHRlc3RpbmcgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+Ci0gICAgICA8c3RhcnR1cD4KLSAgICAgIDwvc3RhcnR1cD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPgotICAgICAgPHN0YXJ0dXAKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RhcnR1cENsYXNzIj4KLSAgICAgIDwvc3RhcnR1cD4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSBVdGlscyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPgotIAotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBuYW1lPSJVSSBUZXN0IERyYWcgVGVzdCBQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2FueXRoaW5nLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kbmQuRHJhZ0Ryb3BQZXJzcGVjdGl2ZUZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuZG5kLmRyYWdkcm9wIj4KLSAgICAgIDwvcGVyc3BlY3RpdmU+Ci0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIG5hbWU9IlVJIFRlc3QgWm9vbSBUZXN0IFBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnpvb20uWm9vbVBlcnNwZWN0aXZlRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy56b29tLlpvb21QZXJzcGVjdGl2ZUZhY3RvcnkiPgotICAgICAgPC9wZXJzcGVjdGl2ZT4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgbmFtZT0iVUkgVGVzdCBWaWV3IEFycmFuZ2VtZW50IFBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5WaWV3UGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlZpZXdQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L3BlcnNwZWN0aXZlPgotICAgPC9leHRlbnNpb24+Ci08IS0tIFV0aWxzIEVuZCAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPgotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBuYW1lPSJVSSBUZXN0IFNlc3Npb24gUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlNlc3Npb25QZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU2Vzc2lvblBlcnNwZWN0aXZlIj4KLSAgICAgIDwvcGVyc3BlY3RpdmU+Ci0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuUGVyc3BlY3RpdmVXaXRoRmFzdFZpZXciCi0gICAgICAgICAgICBuYW1lPSJVSSBUZXN0IFBlcnNwZWN0aXZlIHdpdGggRmFzdCBWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmZhc3R2aWV3X3BlcnNwZWN0aXZlIj4KLSAgICAgIDwvcGVyc3BlY3RpdmU+ICAgICAgCi0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuUGVyc3BlY3RpdmVXaXRoTXVsdGlWaWV3UGxhY2Vob2xkZXJzQXRUb3BMZXZlbCIKLSAgICAgICAgICAgIG5hbWU9IlVJIFRlc3QgUGVyc3BlY3RpdmUgd2l0aCBNdWx0aSBWaWV3IFBsYWNlaG9sZGVycyBBdCBUb3AgTGV2ZWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuUGVyc3BlY3RpdmVXaXRoTXVsdGlWaWV3UGxhY2Vob2xkZXJzQXRUb3BMZXZlbCI+Ci0gICAgICA8L3BlcnNwZWN0aXZlPiAgICAgIAotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlBlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0luUGxhY2Vob2xkZXJGb2xkZXIiCi0gICAgICAgICAgICBuYW1lPSJVSSBUZXN0IFBlcnNwZWN0aXZlIHdpdGggTXVsdGkgVmlldyBQbGFjZWhvbGRlcnMgSW4gUGxhY2Vob2xkZXIgRm9sZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlBlcnNwZWN0aXZlV2l0aE11bHRpVmlld1BsYWNlaG9sZGVyc0luUGxhY2Vob2xkZXJGb2xkZXIiPgotICAgICAgPC9wZXJzcGVjdGl2ZT4gICAgICAKLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5QZXJzcGVjdGl2ZVdpdGhNdWx0aVZpZXdQbGFjZWhvbGRlcnNJbkZvbGRlciIKLSAgICAgICAgICAgIG5hbWU9IlVJIFRlc3QgUGVyc3BlY3RpdmUgd2l0aCBNdWx0aSBWaWV3IFBsYWNlaG9sZGVycyBJbiBGb2xkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuUGVyc3BlY3RpdmVXaXRoTXVsdGlWaWV3UGxhY2Vob2xkZXJzSW5Gb2xkZXIiPgotICAgICAgPC9wZXJzcGVjdGl2ZT4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5QZXJzcGVjdGl2ZVZpZXdzQnVnODgzNDUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlBlcnNwZWN0aXZlVmlld3NCdWc4ODM0NSIKLSAgICAgICAgICAgIG5hbWU9IlVJIFRlc3QgUGVyc3BlY3RpdmUgZm9yIGNsb3NhYmxlIHZpZXciLz4gIAotICAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5QZXJzcGVjdGl2ZVZpZXdzQnVnMTIwOTM0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5QZXJzcGVjdGl2ZVZpZXdzQnVnMTIwOTM0IgotICAgICAgICAgICAgbmFtZT0iVUkgVGVzdCBQZXJzcGVjdGl2ZSBmb3IgcHJlc2VudGF0aW9uIE5QRSIvPiAKLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5TdGFuZGFsb25lVmlld1BlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRuZC5TdGFuZGFsb25lVmlld1BlcnNwZWN0aXZlIgotICAgICAgICAgICAgbmFtZT0iU3RhbmRhbG9uZSBWaWV3IERuRCBQZXJzcGVjdGl2ZSIvPiAgICAgICAgIAotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuQnVnNzg0NzBUZXN0JE15UGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuQnVnNzg0NzBUZXN0Lk15UGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5CdWc3ODQ3MFRlc3QuTXlQZXJzcGVjdGl2ZSIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotCi0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IkVycm9yIGhhbmRsaW5nIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmVycm9yaGFuZGxpbmciLz4KLQotICAgICAgPHZpZXcKLSAgICAgIAkJbmFtZT0iRVJST1I6IFZpZXcgdGhhdCBjYWNoZXMgaXRzIHNoZWxsIgotICAgICAgCQlpY29uPSJpY29uc1x2aWV3LmdpZiIKLSAgICAgIAkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmVycm9yaGFuZGxpbmciCi0gICAgICAJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb21wb25lbnRzLmZyYW1ld29yay5SZWZsZWN0aW9uRmFjdG9yeTpvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydC5WaWV3VGhhdENhY2hlc0l0c1NoZWxsIgotICAgICAgCQlpZD0ib3JnLmVjbGlwc2UudWkudGVzdC5hcGkud29ya2JlbmNocGFydC5WaWV3VGhhdENhY2hlc0l0c1NoZWxsIj4KLSAgICAgIDwvdmlldz4KLQotICAgICAgPHZpZXcKLSAgICAgICAJCW5hbWU9IkVSUk9SOiBWaWV3IHRoYXQgYWxsb2NhdGVzIGFsbCBhdmFpbGFibGUgZ3JhcGhpY3MgaGFuZGxlcyIKLSAgICAgICAJCWljb249Imljb25zXHZpZXcuZ2lmIgotICAgICAgCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkudGVzdHMuZXJyb3JoYW5kbGluZyIKLSAgICAgICAJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydC5IZWF2eVJlc291cmNlVmlldyIKLSAgICAgICAJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydC5IZWF2eVJlc291cmNlVmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICAKLSAgICAgIDx2aWV3Ci0gICAgICAgCQluYW1lPSJFUlJPUjogVmlldyB0aGF0IHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiBpbiBpbml0IgotICAgICAgIAkJaWNvbj0iaWNvbnNcdmlldy5naWYiCi0gICAgICAJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS50ZXN0cy5lcnJvcmhhbmRsaW5nIgotICAgICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0LlZpZXdXaXRoSW5pdEV4Y2VwdGlvbiIKLSAgICAgICAJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydC5WaWV3V2l0aEluaXRFeGNlcHRpb24iPgotICAgICAgPC92aWV3PgotCi0gICAgICA8dmlldwotICAgICAgIAkJbmFtZT0iRVJST1I6IFZpZXcgdGhhdCB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpbiBpbml0IgotICAgICAgIAkJaWNvbj0iaWNvbnNcdmlldy5naWYiCi0gICAgICAJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS50ZXN0cy5lcnJvcmhhbmRsaW5nIgotICAgICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0LlZpZXdXaXRoSW5pdFJ1bnRpbWVFeGNlcHRpb24iCi0gICAgICAgCQlpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuVmlld1dpdGhJbml0UnVudGltZUV4Y2VwdGlvbiI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgIAkJbmFtZT0iRVJST1I6IFZpZXcgcG9pbnRpbmcgdG8gaW52YWxpZCBjbGFzcyIKLSAgICAgICAJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS50ZXN0cy5lcnJvcmhhbmRsaW5nIgotICAgICAgIAkJaWNvbj0iaWNvbnNcdmlldy5naWYiCi0gICAgICAgCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuVmlld1dpdGhNaXNzaW5nQ2xhc3MiCi0gICAgICAgCQlpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuVmlld1dpdGhNaXNzaW5nQ2xhc3MiPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAJCW5hbWU9IkVSUk9SOiBWaWV3IHRoYXQgdGhyb3dzIGV4Y2VwdGlvbiBpbiBkaXNwb3NlIgotICAgICAgIAkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmVycm9yaGFuZGxpbmciCi0gICAgICAgCQlpY29uPSJpY29uc1x2aWV3LmdpZiIKLSAgICAgICAJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydC5WaWV3V2l0aERpc3Bvc2VFeGNlcHRpb24iCi0gICAgICAgCQlpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuVmlld1dpdGhEaXNwb3NlRXhjZXB0aW9uIj4KLSAgICAgIDwvdmlldz4KLSAgICAgIDx2aWV3Ci0gICAgICAgCQluYW1lPSJFUlJPUjogVmlldyB0aGF0IHRocm93cyBleGNlcHRpb24gaW4gY3JlYXRlUGFydENvbnRyb2xzIgotICAgICAgCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkudGVzdHMuZXJyb3JoYW5kbGluZyIKLSAgICAgICAJCWljb249Imljb25zXHZpZXcuZ2lmIgotICAgICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0LlZpZXdXaXRoQ3JlYXRlQ29udHJvbHNFeGNlcHRpb24iCi0gICAgICAgCQlpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuVmlld1dpdGhDcmVhdGVDb250cm9sc0V4Y2VwdGlvbiI+Ci0gICAgICA8L3ZpZXc+Ci0KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5DeWNsaWNEZXBlbmRlbmN5VmlldyIKLSAgICAgIAkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmVycm9yaGFuZGxpbmciCi0gICAgICAgICAgICBuYW1lPSJFUlJPUjogQ3ljbGljIGRlcGVuZGVuY3kgdmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLkN5Y2xpY0RlcGVuZGVuY3lWaWV3Ii8+ICAgICAgCi0gICAgICA8dmlldwotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlJlZmxlY3Rpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBvbmVudHMuTWlzc2luZ0RlcGVuZGVuY3lWaWV3IgotICAgICAgCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkudGVzdHMuZXJyb3JoYW5kbGluZyIKLSAgICAgICAgICAgIG5hbWU9IkVSUk9SOiBNaXNzaW5nIGRlcGVuZGVuY3kiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5NaXNzaW5nRGVwZW5kZW5jeVZpZXciLz4gICAgICAKLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5WaWV3VGhhdFRocm93c0FuRXhjZXB0aW9uIgotICAgICAgCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkudGVzdHMuZXJyb3JoYW5kbGluZyIKLSAgICAgICAgICAgIG5hbWU9IkVSUk9SOiBWaWV3IHRoYXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLlZpZXdUaGF0VGhyb3dzQW5FeGNlcHRpb24iLz4gICAgICAKLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5EZXBlbmRzT25Tb21ldGhpbmdUaGF0VGhyb3dzRXhjZXB0aW9ucyIKLSAgICAgIAkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmVycm9yaGFuZGxpbmciCi0gICAgICAgICAgICBuYW1lPSJFUlJPUjogRGVwZW5kZW5jeSB0aGF0IHRocm93cyBhbiBleGNlcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5EZXBlbmRzT25Tb21ldGhpbmdUaGF0VGhyb3dzRXhjZXB0aW9ucyIvPiAgICAgIAotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb21wb25lbnRzLmZyYW1ld29yay5SZWZsZWN0aW9uRmFjdG9yeTpvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLkRlcGVuZHNPbk1pc3NpbmdJbXBsZW1lbnRhdGlvbiIKLSAgICAgIAkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmVycm9yaGFuZGxpbmciCi0gICAgICAgICAgICBuYW1lPSJFUlJPUjogRGVwZW5kZW5jeSB3aXRoIG1pc3NpbmcgaW1wbGVtZW50YXRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5EZXBlbmRzT25NaXNzaW5nSW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5WaWV3UmVxdWlyaW5nQ29tcG9uZW50SW5Xcm9uZ1Njb3BlIgotICAgICAgCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkudGVzdHMuZXJyb3JoYW5kbGluZyIKLSAgICAgICAgICAgIG5hbWU9IkVSUk9SOiBWaWV3IHJlcXVpcmluZyBjb21wb25lbnQgaW4gd3Jvbmcgc2NvcGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5WaWV3UmVxdWlyaW5nQ29tcG9uZW50SW5Xcm9uZ1Njb3BlIi8+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotCi0gICAgICA8dmlldwotICAgICAgIAkJbmFtZT0iVGl0bGUgVGVzdCBWaWV3IgotICAgICAgIAkJaWNvbj0iaWNvbnNcdmlldy5naWYiCi0gICAgICAgCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuVGl0bGVUZXN0VmlldyIKLSAgICAgICAJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuVGl0bGVUZXN0VmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSJNb2NrIFZpZXcgMSIKLSAgICAgICAgICAgIGljb249Imljb25zXHZpZXcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrVmlld1BhcnQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydCI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iTW9jayBWaWV3IDIiCi0gICAgICAgICAgICBpY29uPSJpY29uc1x2aWV3LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1ZpZXdQYXJ0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrVmlld1BhcnQyIj4KLSAgICAgIDwvdmlldz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSJNb2NrIFZpZXcgMyIKLSAgICAgICAgICAgIGljb249Imljb25zXHZpZXcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrVmlld1BhcnQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydDMiPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9Ik1vY2sgVmlldyA0IgotICAgICAgICAgICAgaWNvbj0iaWNvbnNcdmlldy5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1ZpZXdQYXJ0NCI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgYWxsb3dNdWx0aXBsZT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9Ik1vY2sgVmlldyBNdWx0IgotICAgICAgICAgICAgaWNvbj0iaWNvbnNcdmlldy5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydE11bHQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydE11bHQiPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IlNhdmVhYmxlIE1vY2sgVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zXHZpZXcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TYXZlYWJsZU1vY2tWaWV3UGFydCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU2F2ZWFibGVNb2NrVmlld1BhcnQiPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGFsbG93TXVsdGlwbGU9InRydWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlVzZXJTYXZlYWJsZU1vY2tWaWV3UGFydCIKLSAgICAgICAgICAgIGljb249Imljb25zXHZpZXcuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Vc2VyU2F2ZWFibGVNb2NrVmlld1BhcnQiCi0gICAgICAgICAgICBuYW1lPSJVc2VyIFNhdmVhYmxlIE1vY2sgVmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgYWxsb3dNdWx0aXBsZT0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuVXNlclNhdmVhYmxlU2hhcmVkVmlld1BhcnQiCi0gICAgICAgICAgICBpY29uPSJpY29uc1x2aWV3LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuVXNlclNhdmVhYmxlU2hhcmVkVmlld1BhcnQiCi0gICAgICAgICAgICBuYW1lPSJVc2VyIFNoYXJlZCBNb2NrIFZpZXciPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IlNlc3Npb24gVGVzdCBWaWV3IgotICAgICAgICAgICAgaWNvbj0iaWNvbnNcdmlldy5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlNlc3Npb25WaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TZXNzaW9uVmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iSVZpZXdBY3Rpb25EZWxlZ2F0ZVRlc3QgVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zXHZpZXcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrVmlld1BhcnQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLklWaWV3QWN0aW9uRGVsZWdhdGVUZXN0Ij4KLSAgICAgIDwvdmlldz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSJBY3Rpb24gRmlsdGVyIFRlc3QgVmlldyAxIgotICAgICAgICAgICAgaWNvbj0iaWNvbnNcdmlldy5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLkxpc3RWaWV3Oi1zdGF0aWNNZW51IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5JQWN0aW9uRmlsdGVyVGVzdDEiPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IkFjdGlvbiBFeHByZXNzaW9uIFRlc3QgVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zXHZpZXcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5BY3Rpb25FeHByZXNzaW9uVGVzdCI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iQWN0aW9uIEZpbHRlciBUZXN0IFZpZXcgMiIKLSAgICAgICAgICAgIGljb249Imljb25zXHZpZXcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0VmlldzotZHluYW1pY01lbnUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLklBY3Rpb25GaWx0ZXJUZXN0MiI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iU2VsZWN0aW9uIFByb3ZpZGVyIFRlc3QgVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zXHZpZXcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlNlbGVjdGlvblByb3ZpZGVyVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5TZWxlY3Rpb25Qcm92aWRlclZpZXciPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IlNlbGVjdGlvbiBQcm92aWRlciBUZXN0IFZpZXcgMiIKLSAgICAgICAgICAgIGljb249Imljb25zXHZpZXcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlNlbGVjdGlvblByb3ZpZGVyVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5TZWxlY3Rpb25Qcm92aWRlclZpZXcyIj4KLSAgICAgIDwvdmlldz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSJBZGFwdGVkIFJlc291cmNlIE5hdmlnYXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zXHZpZXcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFkYXB0YWJsZS5BZGFwdGVkUmVzb3VyY2VOYXZpZ2F0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYWRhcHRhYmxlLmFkYXB0ZWRIaWVyYXJjaHkiPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IkVtcHR5VmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL3ZpZXcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0LkVtcHR5VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy53b3JrYmVuY2hwYXJ0LkVtcHR5VmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iT3ZlcnJpZGRlblRpdGxlVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL3ZpZXcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0Lk92ZXJyaWRkZW5UaXRsZVZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMud29ya2JlbmNocGFydC5PdmVycmlkZGVuVGl0bGVWaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSJSYXdJVmlld1BhcnQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy92aWV3LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydC5SYXdJVmlld1BhcnQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMud29ya2JlbmNocGFydC5SYXdJVmlld1BhcnQiPgotICAgICAgPC92aWV3PgotICAgICAgICAgICAgCi0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iU3RpY2t5Vmlld1JpZ2h0MSIKLSAgICAgICAgICAgIGljb249Imljb25zL3ZpZXcuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrVmlld1BhcnQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlN0aWNreVZpZXdSaWdodDEiPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IlN0aWNreVZpZXdSaWdodDIiCi0gICAgICAgICAgICBpY29uPSJpY29ucy92aWV3LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1ZpZXdQYXJ0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TdGlja3lWaWV3UmlnaHQyIj4KLSAgICAgIDwvdmlldz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZS5Db25jdXJyZW50VGFibGVUZXN0VmlldyIKLSAgICAgICAgICAgIG5hbWU9IkNvbmN1cnJlbnQgVGFibGUgVGVzdCBWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbmN1cnJlbnRUYWJsZVRlc3QiLz4gICAgICAKLSAgICAgIAotICAgICAgCi0gICAgICA8c3RpY2t5VmlldwotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TdGlja3lWaWV3UmlnaHQxIgotICAgICAgICAgICAgbG9jYXRpb249IlJJR0hUIgotICAgICAgICAgICAgY2xvc2VhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbW92ZWFibGU9InRydWUiPgotICAgICAgPC9zdGlja3lWaWV3PgotICAgICAgPHN0aWNreVZpZXcKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RpY2t5Vmlld1JpZ2h0MiIKLSAgICAgICAgICAgIGxvY2F0aW9uPSJSSUdIVCIKLSAgICAgICAgICAgIGNsb3NlYWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBtb3ZlYWJsZT0iZmFsc2UiPgotICAgICAgPC9zdGlja3lWaWV3PgotCi0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iU3RpY2t5Vmlld0xlZnQxIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvdmlldy5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RpY2t5Vmlld0xlZnQxIj4KLSAgICAgIDwvdmlldz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSJTdGlja3lWaWV3TGVmdDIiCi0gICAgICAgICAgICBpY29uPSJpY29ucy92aWV3LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1ZpZXdQYXJ0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TdGlja3lWaWV3TGVmdDIiPgotICAgICAgPC92aWV3PgotICAgICAgPHN0aWNreVZpZXcKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RpY2t5Vmlld0xlZnQxIgotICAgICAgICAgICAgbG9jYXRpb249IkxFRlQiPgotICAgICAgPC9zdGlja3lWaWV3PgotICAgICAgPHN0aWNreVZpZXcKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RpY2t5Vmlld0xlZnQyIgotICAgICAgICAgICAgbG9jYXRpb249IkxFRlQiPgotICAgICAgPC9zdGlja3lWaWV3PgotICAgICAgCi0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iU3RpY2t5Vmlld1RvcDEiCi0gICAgICAgICAgICBpY29uPSJpY29ucy92aWV3LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1ZpZXdQYXJ0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TdGlja3lWaWV3VG9wMSI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iU3RpY2t5Vmlld1RvcDIiCi0gICAgICAgICAgICBpY29uPSJpY29ucy92aWV3LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1ZpZXdQYXJ0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TdGlja3lWaWV3VG9wMiI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8c3RpY2t5VmlldwotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TdGlja3lWaWV3VG9wMSIKLSAgICAgICAgICAgIGxvY2F0aW9uPSJUT1AiPgotICAgICAgPC9zdGlja3lWaWV3PgotICAgICAgPHN0aWNreVZpZXcKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RpY2t5Vmlld1RvcDIiCi0gICAgICAgICAgICBsb2NhdGlvbj0iVE9QIj4KLSAgICAgIDwvc3RpY2t5Vmlldz4gICAgICAKLSAgICAgIAotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IlN0aWNreVZpZXdCb3R0b20xIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvdmlldy5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RpY2t5Vmlld0JvdHRvbTEiPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IlN0aWNreVZpZXdCb3R0b20yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvdmlldy5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tWaWV3UGFydCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RpY2t5Vmlld0JvdHRvbTIiPgotICAgICAgPC92aWV3PgotICAgICAgPHN0aWNreVZpZXcKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuU3RpY2t5Vmlld0JvdHRvbTEiCi0gICAgICAgICAgICBsb2NhdGlvbj0iQk9UVE9NIj4KLSAgICAgIDwvc3RpY2t5Vmlldz4KLSAgICAgIDxzdGlja3lWaWV3Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlN0aWNreVZpZXdCb3R0b20yIgotICAgICAgICAgICAgbG9jYXRpb249IkJPVFRPTSI+Ci0gICAgICA8L3N0aWNreVZpZXc+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IkRlY29yYXRvciBUZXN0cyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JDYXRlZ29yeSIvPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzLkRlY29yYXRvclRyZWVWaWV3IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvckNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iVHJlZSBWaWV3IFRlc3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5UcmVlVmlld1Rlc3QiLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5EZWNvcmF0b3JUYWJsZVZpZXciCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yQ2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJUYWJsZSBWaWV3IFRlc3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9yLlRhYmxlVmlld1Rlc3QiLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5EZWNvcmF0b3JUYWJsZVRyZWVWaWV3IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvckNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iVGFibGUgVHJlZSBUZXN0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvci5UYWJsZVRyZWVUZXN0Ii8+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpmYWNlLnRlc3RzLnZpZXdlcnMuaW50ZXJhY3RpdmUuVmlydHVhbFRhYmxlVmlldyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS50ZXN0cy50YWJsZVZpZXdlclZpZXdzIgotICAgICAgICAgICAgbmFtZT0iVmlydHVhbCBUYWJsZSBWaWV3IHRlc3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMudmlldzEiLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZS5MYXp5VmlydHVhbFRhYmxlVmlldyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS50ZXN0cy50YWJsZVZpZXdlclZpZXdzIgotICAgICAgICAgICAgbmFtZT0iTGF6eSBWaXJ0dWFsIFRhYmxlIFZpZXcgdGVzdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5sYXp5VmlldyIvPgotICAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamZhY2UudGVzdHMudmlld2Vycy5pbnRlcmFjdGl2ZS5MYXp5RGVmZXJyZWRWaXJ0dWFsVGFibGVWaWV3IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnRhYmxlVmlld2VyVmlld3MiCi0gICAgICAgICAgICBuYW1lPSJMYXp5IFZpcnR1YWwgVGFibGUgd2l0aCBEZWZlcnJlZCBVcGRhdGVzIGFuZCBSYW5nZXMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubGF6eVZpZXdEZWZlcnJlZCIvPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSJUYWJsZSBWaWV3ZXIgVGVzdHMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMudGFibGVWaWV3ZXJWaWV3cyIvPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSJDb21wb25lbnQgVGVzdHMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cyIvPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5zZXNzaW9uLlZpZXdXaXRoU3RhdGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuc2Vzc2lvbi5WaWV3V2l0aFN0YXRlIgotICAgICAgICAgICAgbmFtZT0iVmlld1dpdGhTdGF0ZSIvPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5CdWc3ODQ3MFRlc3QkTXlWaWV3UGFydCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5CdWc3ODQ3MFRlc3QuTXlWaWV3UGFydCIKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLkJ1Zzc4NDcwVGVzdC5NeVZpZXdQYXJ0Ii8+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLkJ1Zzc4NDcwVGVzdCRNeVZpZXdQYXJ0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLkJ1Zzc4NDcwVGVzdC5NeVZpZXdQYXJ0MiIKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLkJ1Zzc4NDcwVGVzdC5NeVZpZXdQYXJ0MiIvPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5CdWc3ODQ3MFRlc3QkTXlWaWV3UGFydCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5CdWc3ODQ3MFRlc3QuTXlWaWV3UGFydDMiCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5CdWc3ODQ3MFRlc3QuTXlWaWV3UGFydDMiLz4KLQotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBuYW1lPSJNb2NrIEVkaXRvciAxIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0ibW9jazEiCi0gICAgICAgICAgICBpY29uPSJpY29uc1xtb2NrZWRpdG9ycGFydDEuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrRWRpdG9yUGFydCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0VkaXRvclBhcnQxIj4KLSAgICAgIDwvZWRpdG9yPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgbmFtZT0iTW9jayBFZGl0b3IgMiIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Im1vY2syIgotICAgICAgICAgICAgaWNvbj0iaWNvbnNcbW9ja2VkaXRvcnBhcnQyLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0VkaXRvclBhcnQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tFZGl0b3JQYXJ0MiI+Ci0gICAgICA8L2VkaXRvcj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIG5hbWU9IklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvclRlc3QiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJtb2NrMyIKLSAgICAgICAgICAgIGljb249Imljb25zXG1vY2tlZGl0b3JwYXJ0Mi5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tFZGl0b3JQYXJ0IgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yVGVzdCI+Ci0gICAgICA8L2VkaXRvcj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIG5hbWU9IklFZGl0b3JBY3Rpb25EZWxlZ2F0ZVRlc3QiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJtb2NrMyIKLSAgICAgICAgICAgIGljb249Imljb25zXG1vY2tlZGl0b3JwYXJ0Mi5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tFZGl0b3JQYXJ0IgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuSUVkaXRvckFjdGlvbkRlbGVnYXRlVGVzdCI+Ci0gICAgICA8L2VkaXRvcj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIG5hbWU9IklFZGl0b3JBY3Rpb25CYXJzVGVzdCIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Im1vY2szIgotICAgICAgICAgICAgaWNvbj0iaWNvbnNcbW9ja2VkaXRvcnBhcnQyLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0VkaXRvclBhcnQiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLkVkaXRvckFjdGlvbkJhcnNUZXN0Ij4KLSAgICAgIDwvZWRpdG9yPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgbmFtZT0iRXh0ZW5kZWRUZXh0RWRpdG9yIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0iZXh0dHh0IgotICAgICAgICAgICAgaWNvbj0iaWNvbnNcbW9ja2VkaXRvcnBhcnQyLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5FeHRlbmRlZFRleHRFZGl0b3IiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJhc2ljVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLkV4dGVuZGVkVGV4dEVkaXRvciI+Ci0gICAgICA8L2VkaXRvcj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIG5hbWU9IlRlc3QgTXVsdGktUGFnZSBFZGl0b3IiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJtdWx0aSIKLSAgICAgICAgICAgIGljb249Imljb25zXG1vY2tlZGl0b3JwYXJ0MS5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMubXVsdGlwYWdlZWRpdG9yLlRlc3RNdWx0aVBhZ2VFZGl0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubXVsdGlwYWdlZWRpdG9yLlRlc3RNdWx0aVBhZ2VFZGl0b3IiPgotICAgICAgPC9lZGl0b3I+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuVGl0bGVUZXN0RWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IlRpdGxlIFRlc3QgRWRpdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlRpdGxlVGVzdEVkaXRvciIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9InRpdGxldGVzdCIvPgotCi0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuVGl0bGVUZXN0RWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaW52YWxpZHBhdGgvaWNvblRoYXREb2VzTm90RXhpc3QuZ2lmIgotICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IkVSUk9SOiBFZGl0b3Igd2l0aCBtaXNzaW5nIGljb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuRWRpdG9yV2l0aE1pc3NpbmdJY29uIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0idGVzdCIvPgotCi0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuTWlzc2luZ0NsYXNzIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IkVSUk9SOiBFZGl0b3Igd2l0aCBtaXNzaW5nIGNsYXNzIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0Lk1pc3NpbmdDbGFzcyIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9InRlc3QiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydC5FZGl0b3JXaXRoSW5pdFJ1bnRpbWVFeGNlcHRpb24iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbnl0aGluZy5naWYiCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iRVJST1I6IFJ1bnRpbWVFeGNlcHRpb24gaW4gaW5pdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydC5FZGl0b3JXaXRoSW5pdFJ1bnRpbWVFeGNlcHRpb24iCi0gICAgICAgICAgICBleHRlbnNpb25zPSJ0ZXN0Ii8+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuRWRpdG9yV2l0aElucHV0RXhjZXB0aW9uIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IkVSUk9SOiBleGNlcHRpb24gaW4gZ2V0RWRpdG9ySW5wdXQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuRWRpdG9yV2l0aElucHV0RXhjZXB0aW9uIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0idGVzdCIvPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0LkVkaXRvcldpdGhJbml0RXhjZXB0aW9uIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IkVSUk9SOiBQYXJ0SW5pdEV4Y2VwdGlvbiBpbiBpbml0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0LkVkaXRvcldpdGhJbml0RXhjZXB0aW9uIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0idGVzdCIvPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0LkVkaXRvcldpdGhDcmVhdGVDb250cm9sc0V4Y2VwdGlvbiIKLSAgICAgICAgICAgIGljb249Imljb25zL2FueXRoaW5nLmdpZiIKLSAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICBuYW1lPSJFUlJPUjogRXhjZXB0aW9uIGluIGNyZWF0ZVBhcnRDb250cm9scyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkud29ya2JlbmNocGFydC5FZGl0b3JXaXRoQ3JlYXRlQ29udHJvbHNFeGNlcHRpb24iCi0gICAgICAgICAgICBleHRlbnNpb25zPSJ0ZXN0Ii8+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLndvcmtiZW5jaHBhcnQuRWRpdG9yV2l0aERpc3Bvc2VFeGNlcHRpb24iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbnl0aGluZy5naWYiCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iRVJST1I6IEV4Y2VwdGlvbiBpbiBkaXNwb3NlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS53b3JrYmVuY2hwYXJ0LkVkaXRvcldpdGhEaXNwb3NlRXhjZXB0aW9uIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0idGVzdCIvPgotIAotCSAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0VkaXRvclBhcnQiCi0gICAgICAgICAgICBpY29uPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udC5naWYiCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iUGx1Z2luIEljb24gVGVzdCAxIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLkljb25UZXN0RWRpdG9yMSIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Imljb250ZXN0MSIvPiAgICAgICAgICAgIAotICAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0VkaXRvclBhcnQiCi0gICAgICAgICAgICBpY29uPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmpkdC51aS9pY29ucy9mdWxsL29iajE2L2NsYXNzX29iai5naWYiCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iUGx1Z2luIEljb24gVGVzdCAyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLkljb25UZXN0RWRpdG9yMSIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Imljb250ZXN0MiIvPiAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tFZGl0b3JQYXJ0IgotICAgICAgICAgICAgaWNvbj0iYmFkIgotICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IlBsdWdpbiBJY29uIFRlc3QgMyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5JY29uVGVzdEVkaXRvcjMiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJpY29udGVzdDMiLz4KLSAgICAgICA8ZWRpdG9yCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrRWRpdG9yUGFydCIKLSAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgICBpY29uPSJpY29ucy9hbnl0aGluZy5naWYiCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRlbnRUeXBlMUVkaXRvciIKLSAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb250ZW50VHlwZTFFZGl0b3IiPgotICAgICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29udGVudC10eXBlMSIvPgotICAgICAgIDwvZWRpdG9yPgotICAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgIGV4dGVuc2lvbnM9ImNvbnRlbnQtdHlwZTEiCi0gICAgICAgICAgICAgZmlsZW5hbWVzPSJjb250ZW50LXR5cGUxLmJsYWgiCi0gICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb250ZW50VHlwZTFFZGl0b3ItZmFsbGJhY2siCi0gICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29udGVudFR5cGUxRWRpdG9yLWZhbGxiYWNrIi8+ICAgICAgIAotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgbmFtZT0iTW9jayBNYXRjaGluZyBFZGl0b3IgMSIKLSAgICAgICAgICAgIGljb249Imljb25zXG1vY2tlZGl0b3JwYXJ0MS5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tFZGl0b3JQYXJ0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrTWF0Y2hpbmdFZGl0b3JQYXJ0MSIKLSAgICAgICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSIvPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TZXNzaW9uRWRpdG9yUGFydCIKLSAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0ic2Vzc2lvbiIKLSAgICAgICAgICAgIGljb249Imljb25zL2JpbmFyeV9jby5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlNlc3Npb25FZGl0b3JQYXJ0IgotICAgICAgICAgICAgbmFtZT0iU2Vzc2lvbkVkaXRvciIvPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrRWRpdG9yUGFydCIKLSAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRlbnRUeXBlMkVkaXRvciIKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRlbnRUeXBlMkVkaXRvciI+Ci0gICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRlbnQtdHlwZTIiLz4KLSAgICAgIDwvZWRpdG9yPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpZWRpdG9yLlRpbGVkRWRpdG9yIgotICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9iaW5hcnlfY28uZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpZWRpdG9yLlRpbGVkRWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJUVkaXRvcnMuVGlsZWRFZGl0b3IiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tdWx0aWVkaXRvci5UZXN0RWRpdG9yIgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMubXVsdGllZGl0b3IuVGVzdEFjdGlvbkJhckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJldGVzdCIKLSAgICAgICAgICAgIGljb249Imljb25zL2JpbmFyeV9jby5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubXVsdGllZGl0b3IuVGVzdEVkaXRvciIKLSAgICAgICAgICAgIG5hbWU9IiVFZGl0b3JzLlRlc3RFZGl0b3IiLz4KLSAgICAgIDwhLS0gdGhlIG9yZGVyIG9mIHRoZSBmb2xsb3dpbmcgaXMgdmVyeSBpbXBvcnRhbnQuICBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSAKLSAgICAgIGRlZmF1bHQgZWRpdG9yIGdldHMgcHVzaGVkIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdC4gLS0+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tFZGl0b3JQYXJ0IgotICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbnl0aGluZy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubm9uZGVmYXVsdGVkQ29udGVudFR5cGVFZGl0b3IxIgotICAgICAgICAgICAgbmFtZT0iZGVmYXVsdGVkQ29udGVudFR5cGVFZGl0b3IiPgotICAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZyBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWZhdWx0ZWRDb250ZW50VHlwZSIvPgotICAgICAgPC9lZGl0b3I+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tFZGl0b3JQYXJ0IgotICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbnl0aGluZy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubm9uZGVmYXVsdGVkQ29udGVudFR5cGVFZGl0b3IyIgotICAgICAgICAgICAgbmFtZT0iZGVmYXVsdGVkQ29udGVudFR5cGVFZGl0b3IiPgotICAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZyBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWZhdWx0ZWRDb250ZW50VHlwZSIvPgotICAgICAgPC9lZGl0b3I+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tFZGl0b3JQYXJ0IgotICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2FueXRoaW5nLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWZhdWx0ZWRDb250ZW50VHlwZUVkaXRvciIKLSAgICAgICAgICAgIG5hbWU9ImRlZmF1bHRlZENvbnRlbnRUeXBlRWRpdG9yIj4KLSAgICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVmYXVsdGVkQ29udGVudFR5cGUiLz4KLSAgICAgIDwvZWRpdG9yPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrRWRpdG9yUGFydCIKLSAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm5vbmRlZmF1bHRlZENvbnRlbnRUeXBlRWRpdG9yMyIKLSAgICAgICAgICAgIG5hbWU9ImRlZmF1bHRlZENvbnRlbnRUeXBlRWRpdG9yIj4KLSAgICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVmYXVsdGVkQ29udGVudFR5cGUiLz4KLSAgICAgIDwvZWRpdG9yPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpcGFnZWVkaXRvci5NdWx0aVZhcmlhYmxlUGFnZUVkaXRvciIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Im11bHRpdmFyIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvbW9ja2VkaXRvcnBhcnQxLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tdWx0aXBhZ2VlZGl0b3IuTXVsdGlWYXJpYWJsZVBhZ2VFZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSJNdWx0aSBWYXJpYWJsZSBQYWdlIEVkaXRvciIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBsYWJlbD0iTW9jayBBY3Rpb24gU2V0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uU2V0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJNb2NrIEFjdGlvbiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1dvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1dpbmRvd0FjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvYWN0aW9uU2V0PiAgICAgIAotICAgICAgPGFjdGlvblNldAotICAgICAgCQlsYWJlbD0iSG9zdGlsZSBBY3Rpb24gU2V0IgotICAgICAgCQlpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYWN0aW9uU2V0cy5icm9rZW5BY3Rpb25TZXQiCi0gICAgICAJCXZpc2libGU9InRydWUiPgotICAgICAgCTxhY3Rpb24KLSAgICAgIAkJCWxhYmVsPSJIb3N0aWxlIEFjdGlvbiIKLSAgICAgIAkJCXN0eWxlPSJwdWxsZG93biIKLSAgICAgIAkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51cy5Ccm9rZW5Xb3JrYmVuY2hXaW5kb3dQdWxsZG93bkRlbGVnYXRlIgotICAgICAgCQkJbWVudWJhclBhdGg9ImhlbHAvaGVscFN0YXJ0IgotICAgICAgCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFjdGlvblNldHMuYnJva2VuQWN0aW9uIj4KLSAgICAgIAk8L2FjdGlvbj4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IlRlc3QgQWN0aW9ucyIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubWFya2VycyI+Ci0gICAgICAgICA8bWVudSBpZD0idGVzdCIKLSAgICAgICAgICAgIGxhYmVsPSImYW1wO1Rlc3QiPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJhZGRpdGlvbnMiIC8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iQ3JlYXRlIFRlc3QgTWFya2VycyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51cy5BZGRNYXJrZXJzQWN0aW9uIgotICAgICAgICAgICAgICAgYWxsb3dMYWJlbFVwZGF0ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0idGVzdC9hZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubWFya2Vycy5jcmVhdGUiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iRGVsZXRlIFRlc3QgTWFya2VycyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51cy5SZW1vdmVNYXJrZXJzQWN0aW9uIgotICAgICAgICAgICAgICAgYWxsb3dMYWJlbFVwZGF0ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0idGVzdC9hZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubWFya2Vycy5kZWxldGUiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSJUZXN0RWRpdG9yTXVsdGkiCi0gICAgICAgICAgICB2aXNpYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tdWx0aWVkaXRvci5hY3Rpb25TZXQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrRWRpdG9yQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBkaXNhYmxlZEljb249Imljb25zL2JpbmFyeV9jby5naWYiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy92aWV3LmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tdWx0aWVkaXRvci5lZGl0b3JBY3Rpb24uYWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9Ik1vY2tNdWx0aUVkaXRvckFjdGlvbiIKLSAgICAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9Ik5vcm1hbC9QcmVzZW50YXRpb24iCi0gICAgICAgICAgICAgICB0b29sdGlwPSJNdWx0aUVkaXRvckFjdGlvblRoaW5nIi8+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld0FjdGlvbnMiPgotICAgICAgPHZpZXdDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuSVZpZXdBY3Rpb25EZWxlZ2F0ZVRlc3QiCi0gICAgICAgICAgICBpZD0idmExIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJNb2NrIEFjdGlvbiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja1ZpZXdBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0iYTEiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L3ZpZXdDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLSAgICAgIDxlZGl0b3JDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuSUVkaXRvckFjdGlvbkRlbGVnYXRlVGVzdCIKLSAgICAgICAgICAgIGlkPSJlYTEiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9Ik1vY2sgQWN0aW9uIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrRWRpdG9yQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9ImExIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTGlzdEVsZW1lbnQiCi0gICAgICAgICAgICBpZD0ib2MxIj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICB2YWx1ZT0icmVkIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9InJlZEFjdGlvbl92MSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgaWQ9Im9jMSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0RWxlbWVudCIKLSAgICAgICAgICAgIGlkPSJvYzIiPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgbmFtZT0ibmFtZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJibHVlIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9ImJsdWVBY3Rpb25fdjEiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIGlkPSJvYzIiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTGlzdEVsZW1lbnQiCi0gICAgICAgICAgICBpZD0ib2MzIj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG5hbWU9ImZsYWciCi0gICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJ0cnVlQWN0aW9uX3YxIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpZD0ib2MzIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLkxpc3RFbGVtZW50IgotICAgICAgICAgICAgaWQ9Im9jNCI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBuYW1lPSJmbGFnIgotICAgICAgICAgICAgICAgdmFsdWU9ImZhbHNlIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9ImZhbHNlQWN0aW9uX3YxIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpZD0ib2M0Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLkxpc3RFbGVtZW50IgotICAgICAgICAgICAgaWQ9Im9jNSI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBuYW1lPSJuYW1lIgotICAgICAgICAgICAgICAgdmFsdWU9InJlZCI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG5hbWU9ImZsYWciCi0gICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJyZWRUcnVlQWN0aW9uX3YxIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpZD0ib2M1Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci08IS0tIEFkYXB0YWJsZSB0ZXN0LS0+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFkYXB0YWJsZS5SZXNvdXJjZUNvbnRyaWJ1dGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IlJlc291cmNlIEFjdGlvbiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hZGFwdGFibGUuUmVzb3VyY2VBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UudWkuT3BlbkZpbGVBY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icmVzb3VyY2UgYWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwhLS0gT2JqZWN0Q29udHJpYnV0aW9uVGVzdDogVGhpcyBpcyB0aGUgY29udGVudC10eXBlLWJhc2VkIG9iamVjdCBjb250cmlidXRpb24gLS0+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy50ZXN0T2JqZWN0U3RhdGVDb250ZW50VHlwZSI+Ci0gICAgICAgICA8dmlzaWJpbGl0eT4KLSAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgbmFtZT0iY29udGVudFR5cGVJZCIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy50ZXN0T2JqZWN0U3RhdGVDb250ZW50VHlwZSI+Ci0gICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IlhNTCBUb3AgTGV2ZWwgRWxlbWVudCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iVGhpcyBpcyBhIGNvbnRyaWJ1dGlvbiBmb3IgT2JqZWN0Q29udHJpYnV0aW9uVGVzdC50ZXN0T2JqZWN0U3RhdGVDb250ZW50VHlwZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnRlc3RPYmplY3RTdGF0ZUNvbnRlbnRUeXBlIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAJCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLSAgIAkJCi0gICAgICAJPCEtLSBPYmplY3RDb250cmlidXRpb25UZXN0OiBUaGlzIGlzIHRoZSBjb250ZW50LXR5cGUtYmFzZWQgb2JqZWN0IGNvbnRyaWJ1dGlvbiAtLT4KLQkJPGNvbnRlbnQtdHlwZSAKLQkJCWlkPSJ0ZXN0T2JqZWN0U3RhdGVDb250ZW50VHlwZSIKLQkJCW5hbWU9IlRlc3RzIHRvcC1sZXZlbCBlbGVtZW50IHJlY29nbml0aW9uIiAJCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQlwcmlvcml0eT0iaGlnaCI+Ci0JCQk8ZGVzY3JpYmVyIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5YTUxSb290RWxlbWVudENvbnRlbnREZXNjcmliZXIiPgotCQkJCTxwYXJhbWV0ZXIgbmFtZT0iZWxlbWVudCIgdmFsdWU9InRlc3RPYmplY3RTdGF0ZUNvbnRlbnRUeXBlRWxlbWVudCIgLz4KLQkJCTwvZGVzY3JpYmVyPgotCQk8L2NvbnRlbnQtdHlwZT4KLSAgICAgICA8Y29udGVudC10eXBlCi0gICAgICAgICAgICAgZmlsZS1leHRlbnNpb25zPSJjb250ZW50LXR5cGUxIgotICAgICAgICAgICAgIGZpbGUtbmFtZXM9ImNvbnRlbnQtdHlwZTEuYmxhaCIKLSAgICAgICAgICAgICBpZD0iY29udGVudC10eXBlMSIKLSAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb250ZW50LXR5cGUxIgotICAgICAgICAgICAgIHByaW9yaXR5PSJub3JtYWwiPgotICAgICAgICAJCTxkZXNjcmliZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LlhNTFJvb3RFbGVtZW50Q29udGVudERlc2NyaWJlciI+Ci0JCQkJPHBhcmFtZXRlciBuYW1lPSJlbGVtZW50IiB2YWx1ZT0iY29udGVudFR5cGUxIiAvPgotCQkJPC9kZXNjcmliZXI+Ci0gICAgICAgIDwvY29udGVudC10eXBlPgotICAgICAgIDxjb250ZW50LXR5cGUKLSAgICAgICAgICAgICBmaWxlLWV4dGVuc2lvbnM9ImNvbnRlbnQtdHlwZTIiCi0gICAgICAgICAgICAgZmlsZS1uYW1lcz0iY29udGVudC10eXBlMi5ibGFoIgotICAgICAgICAgICAgIGlkPSJjb250ZW50LXR5cGUyIgotICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRlbnQtdHlwZTIiCi0gICAgICAgICAgICAgcHJpb3JpdHk9Im5vcm1hbCI+Ci0gICAgICAgICAgICAgPGRlc2NyaWJlciBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuWE1MUm9vdEVsZW1lbnRDb250ZW50RGVzY3JpYmVyIj4KLQkJCQk8cGFyYW1ldGVyIG5hbWU9ImVsZW1lbnQiIHZhbHVlPSJjb250ZW50VHlwZTEiIC8+Ci0JCQk8L2Rlc2NyaWJlcj4KLSAgICAgICA8L2NvbnRlbnQtdHlwZT4KLSAgICAgICA8Y29udGVudC10eXBlCi0gICAgICAgICAgICAgZmlsZS1leHRlbnNpb25zPSJkZWZhdWx0ZWRDb250ZW50VHlwZSIKLSAgICAgICAgICAgICBpZD0iZGVmYXVsdGVkQ29udGVudFR5cGUiCi0gICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVmYXVsdGVkQ29udGVudFR5cGUiCi0gICAgICAgICAgICAgcHJpb3JpdHk9Im5vcm1hbCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAJCQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotPCEtLSBBY3Rpb25TZXRFeHByZXNzaW9uVGVzdCAtLT4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSJMaXN0IEVsZW1lbnQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuTGlzdEVsZW1lbnRBY3Rpb25zIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBsYWJlbD0iTGlzdCBFbGVtZW50IgotICAgICAgICAgICAgICAgcGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLkxpc3RFbGVtZW50TWVudSI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICBuYW1lPSJncm91cDEiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iYWxsQWN0aW9uX3YyIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBhY2NlbGVyYXRvcj0iQUxUK1NISUZUKy0iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuTGlzdEVsZW1lbnRNZW51L2dyb3VwMSIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuYWMxIj4KLSAgICAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTGlzdEVsZW1lbnQiPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9InJlZEFjdGlvbl92MiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLkxpc3RFbGVtZW50TWVudS9ncm91cDEiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLmFjMiI+Ci0gICAgICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0RWxlbWVudCI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJuYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9InJlZCI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJub3RSZWRBY3Rpb25fdjIiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5MaXN0RWxlbWVudE1lbnUvZ3JvdXAxIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5hYzMiPgotICAgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTGlzdEVsZW1lbnQiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgICAgIDxub3Q+Ci0gICAgICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0icmVkIj4KLSAgICAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICAgICA8L25vdD4KLSAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0idHJ1ZUFjdGlvbl92MiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLkxpc3RFbGVtZW50TWVudS9ncm91cDEiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLmFjNCI+Ci0gICAgICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0RWxlbWVudCI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJmbGFnIgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0icmVkT3JCbHVlQWN0aW9uX3YyIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuTGlzdEVsZW1lbnRNZW51L2dyb3VwMSIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuYWM1Ij4KLSAgICAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLkxpc3RFbGVtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0icmVkIj4KLSAgICAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0RWxlbWVudCI+Ci0gICAgICAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJuYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImJsdWUiPgotICAgICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9InJlZEFuZFRydWVBY3Rpb25fdjIiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5MaXN0RWxlbWVudE1lbnUvZ3JvdXAxIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5hYzYiPgotICAgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTGlzdEVsZW1lbnQiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJyZWQiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZmxhZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9InBsdWdpbk5vdEluc3RhbGxlZEFjdGlvbl92MiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLkxpc3RFbGVtZW50TWVudS9ncm91cDEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuYWM3Ij4KLSAgICAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgICAgPHBsdWdpblN0YXRlCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iaW5zdGFsbGVkIgotICAgICAgICAgICAgICAgICAgICAgaWQ9Ijc3Nzd4eGYiPgotICAgICAgICAgICAgICAgPC9wbHVnaW5TdGF0ZT4KLSAgICAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9InBsdWdpbkluc3RhbGxlZEFjdGlvbl92MiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLkxpc3RFbGVtZW50TWVudS9ncm91cDEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuYWM4Ij4KLSAgICAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgICAgPHBsdWdpblN0YXRlCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iaW5zdGFsbGVkIgotICAgICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpIj4KLSAgICAgICAgICAgICAgIDwvcGx1Z2luU3RhdGU+Ci0gICAgICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJwbHVnaW5Ob3RBY3RpdmF0ZWRBY3Rpb25fdjIiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5MaXN0RWxlbWVudE1lbnUvZ3JvdXAxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLmFjOSI+Ci0gICAgICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgICAgIDxwbHVnaW5TdGF0ZQotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImFjdGl2YXRlZCIKLSAgICAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUiPgotICAgICAgICAgICAgICAgPC9wbHVnaW5TdGF0ZT4KLSAgICAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9InBsdWdpbkFjdGl2YXRlZEFjdGlvbl92MiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLkxpc3RFbGVtZW50TWVudS9ncm91cDEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuYWMxMCI+Ci0gICAgICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgICAgIDxwbHVnaW5TdGF0ZQotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImFjdGl2YXRlZCIKLSAgICAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aSI+Ci0gICAgICAgICAgICAgICA8L3BsdWdpblN0YXRlPgotICAgICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0ic3lzdGVtUHJvcGVydHlBY3Rpb25fdjIiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5MaXN0RWxlbWVudE1lbnUvZ3JvdXAxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLmFjMTEiPgotICAgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkFjdGlvbkV4cHJlc3Npb25WYXIiCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iYnViYmEiPgotICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9hY3Rpb25TZXQ+Ci08IS0tIFRleHRTZWxlY3Rpb25BY3Rpb25GaWx0ZXJUZXh0IC0tPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IlRleHQgU2VsZWN0aW9uIFRlc3RzIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLlRleHRTZWxlY3Rpb25BY3Rpb25zIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBsYWJlbD0iVGV4dCBTZWxlY3Rpb24gVGVzdHMiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuVGV4dFNlbGVjdGlvbk1lbnUiPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgbmFtZT0iZ3JvdXAxIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9ImFueVRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5UZXh0U2VsZWN0aW9uTWVudS9ncm91cDEiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLmFzXzEiPgotICAgICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb24iPgotICAgICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJlbXB0eVRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5UZXh0U2VsZWN0aW9uTWVudS9ncm91cDEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW50ZXJuYWwuYWNfMiI+Ci0gICAgICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb24iPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iaXNFbXB0eSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9ImhlbGxvVGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmludGVybmFsLlRleHRTZWxlY3Rpb25NZW51L2dyb3VwMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRlcm5hbC5hY18zIj4KLSAgICAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ0ZXh0IgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IkhlbGxvIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLTwhLS0gUG9wdXBNZW51RXhwcmVzc2lvblRlc3QgLS0+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLkxpc3RFbGVtZW50IgotICAgICAgICAgICAgaWQ9Im9jMSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iYWxsQWN0aW9uX3YyIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpZD0ib2MxIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLkxpc3RFbGVtZW50IgotICAgICAgICAgICAgaWQ9Im9jMiI+Ci0gICAgICAgICA8dmlzaWJpbGl0eT4KLSAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgbmFtZT0ibmFtZSIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJyZWQiPgotICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgIDwvdmlzaWJpbGl0eT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJyZWRBY3Rpb25fdjIiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIGlkPSJvYzIiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTGlzdEVsZW1lbnQiCi0gICAgICAgICAgICBpZD0ib2MzIj4KLSAgICAgICAgIDx2aXNpYmlsaXR5PgotICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJyZWQiPgotICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgIDwvbm90PgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9Im5vdFJlZEFjdGlvbl92MiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgaWQ9Im9jMyI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0RWxlbWVudCIKLSAgICAgICAgICAgIGlkPSJvYzQiPgotICAgICAgICAgPHZpc2liaWxpdHk+Ci0gICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgIG5hbWU9ImZsYWciCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9InRydWVBY3Rpb25fdjIiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIGlkPSJvYzQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTGlzdEVsZW1lbnQiCi0gICAgICAgICAgICBpZD0ib2M1Ij4KLSAgICAgICAgIDx2aXNpYmlsaXR5PgotICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJuYW1lIgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9InJlZCI+Ci0gICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJuYW1lIgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImJsdWUiPgotICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L3Zpc2liaWxpdHk+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0icmVkT3JCbHVlQWN0aW9uX3YyIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpZD0ib2M0Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLkxpc3RFbGVtZW50IgotICAgICAgICAgICAgaWQ9Im9jNiI+Ci0gICAgICAgICA8dmlzaWJpbGl0eT4KLSAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0icmVkIj4KLSAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImZsYWciCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICA8L3Zpc2liaWxpdHk+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0icmVkQW5kVHJ1ZUFjdGlvbl92MiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgaWQ9Im9jNCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0RWxlbWVudCIKLSAgICAgICAgICAgIGlkPSJvYzciPgotICAgICAgICAgPHZpc2liaWxpdHk+Ci0gICAgICAgICAgICA8cGx1Z2luU3RhdGUKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJpbnN0YWxsZWQiCi0gICAgICAgICAgICAgICAgICBpZD0iNzc3N3h4ZiI+Ci0gICAgICAgICAgICA8L3BsdWdpblN0YXRlPgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9InBsdWdpbk5vdEluc3RhbGxlZEFjdGlvbl92MiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgaWQ9Im9jNCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0RWxlbWVudCIKLSAgICAgICAgICAgIGlkPSJvYzgiPgotICAgICAgICAgPHZpc2liaWxpdHk+Ci0gICAgICAgICAgICA8cGx1Z2luU3RhdGUKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJpbnN0YWxsZWQiCi0gICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkiPgotICAgICAgICAgICAgPC9wbHVnaW5TdGF0ZT4KLSAgICAgICAgIDwvdmlzaWJpbGl0eT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJwbHVnaW5JbnN0YWxsZWRBY3Rpb25fdjIiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIGlkPSJvYzQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTGlzdEVsZW1lbnQiCi0gICAgICAgICAgICBpZD0ib2M5Ij4KLSAgICAgICAgIDx2aXNpYmlsaXR5PgotICAgICAgICAgICAgPHBsdWdpblN0YXRlCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0iYWN0aXZhdGVkIgotICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZSI+Ci0gICAgICAgICAgICA8L3BsdWdpblN0YXRlPgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9InBsdWdpbk5vdEFjdGl2YXRlZEFjdGlvbl92MiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgaWQ9Im9jNCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0RWxlbWVudCIKLSAgICAgICAgICAgIGlkPSJvYzEwIj4KLSAgICAgICAgIDx2aXNpYmlsaXR5PgotICAgICAgICAgICAgPHBsdWdpblN0YXRlCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0iYWN0aXZhdGVkIgotICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpIj4KLSAgICAgICAgICAgIDwvcGx1Z2luU3RhdGU+Ci0gICAgICAgICA8L3Zpc2liaWxpdHk+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0icGx1Z2luQWN0aXZhdGVkQWN0aW9uX3YyIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpZD0ib2M0Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLkxpc3RFbGVtZW50IgotICAgICAgICAgICAgaWQ9Im9jMTEiPgotICAgICAgICAgPHZpc2liaWxpdHk+Ci0gICAgICAgICAgICA8c3lzdGVtUHJvcGVydHkKLSAgICAgICAgICAgICAgICAgIG5hbWU9IkFjdGlvbkV4cHJlc3Npb25WYXIiCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0iYnViYmEiPgotICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4KLSAgICAgICAgIDwvdmlzaWJpbGl0eT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJzeXN0ZW1Qcm9wZXJ0eUFjdGlvbl92MiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgaWQ9Im9jNCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5MaXN0RWxlbWVudCIKLSAgICAgICAgICAgIGlkPSJvYzEyIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS50ZXN0aW5nLm5hbWUiIHZhbHVlPSJyZWQiLz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJleHByZXNzaW9uRW5hYmxlbWVudEFjdGlvbl92MiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgaWQ9Im9jMTMiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPiAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLSAgICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkudGVzdGluZyIKLSAgICAgICAgICAgIHByb3BlcnRpZXM9Im5hbWUiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTGlzdEVsZW1lbnQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLkxpc3RFbGVtZW50UHJvcGVydHlUZXN0ZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLnByb3BlcnR5VGVzdGVyIj4KLSAgICAgIDwvcHJvcGVydHlUZXN0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS0gRGVjb3JhdG9yIHRlc3RzIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMiPgotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIKLSAgICAgICAgICAgIGxhYmVsPSJUZXN0IERlY29yYXRvciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzLlRlc3REZWNvcmF0b3JDb250cmlidXRvciIKLSAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hZGFwdGFibGUuZGVjb3JhdG9yIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSB0ZXN0IGRlY29yYXRvcgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIKLSAgICAgICAgICAgIGxhYmVsPSJOdWxsIERlY29yYXRvciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hZGFwdGFibGUuTnVsbExhYmVsRGVjb3JhdG9yIgotICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFkYXB0YWJsZS5udWxsZGVjb3JhdG9yIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIEEgbnVsbCB0ZXN0IGRlY29yYXRvcgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9InRydWUiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBsYWJlbD0iTGlnaHR3ZWlnaHQgVGVzdCBEZWNvcmF0b3IiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5UZXN0TGlnaHR3ZWlnaHREZWNvcmF0b3JDb250cmlidXRvciIKLSAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzLmxpZ2h0d2VpZ2h0ZGVjb3JhdG9yIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIEEgbGlnaHR3ZWlnaHQgdGVzdCBkZWNvcmF0b3IKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2RlY29yYXRvcj4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgbG9jYXRpb249IlRPUF9MRUZUIgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbGFiZWw9IkRlY2xhcmF0aXZlIFRlc3QgRGVjb3JhdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYmluYXJ5X2NvLmdpZiIKLSAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzLmRlY2xhcmVkZGVjb3JhdG9yIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIEEgbGlnaHR3ZWlnaHQgdGVzdCBkZWNvcmF0b3IKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2RlY29yYXRvcj4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIKLSAgICAgICAgICAgIGxhYmVsPSJCdWcgNDE1NDUgTGlnaHR3ZWlnaHQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5OdWxsSW1hZ2VEZWNvcmF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubGlnaHROdWxsSW1hZ2VEZWNvcmF0b3IiPgotICAgICAgPC9kZWNvcmF0b3I+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBsaWdodHdlaWdodD0iZmFsc2UiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIgotICAgICAgICAgICAgbGFiZWw9IkJ1ZyA0MTU0NSBIZWF2eSBJbWFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzLkhlYXZ5TnVsbEltYWdlRGVjb3JhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmhlYXZ5TnVsbEltYWdlRGVjb3JhdG9yIj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9ImZhbHNlIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIKLSAgICAgICAgICAgIGxhYmVsPSJCdWcgNDE1NDUgSGVhdnkgVGV4dCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzLkhlYXZ5TnVsbFRleHREZWNvcmF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaGVhdnlOdWxsVGV4dERlY29yYXRvciI+Ci0gICAgICA8L2RlY29yYXRvcj4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbGFiZWw9IkxpZ2h0d2VpZ2h0IFRlc3QgRGVjb3JhdG9yIE11bHRpcGxlIFF1YWRyYW50IgotICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuVGVzdExpZ2h0d2VpZ2h0RGVjb3JhdG9yTXVsdGlwbGVRdWFkcmFudENvbnRyaWJ1dG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMubGlnaHR3ZWlnaHRkZWNvcmF0b3IyIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIEEgbGlnaHR3ZWlnaHQgdGVzdCBkZWNvcmF0b3IgZm9yIG11bHRpcGxlIHF1YWRyYW50cwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9InRydWUiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0iamF2YS5sYW5nLk9iamVjdCIKLSAgICAgICAgICAgIGxhYmVsPSJCYWNrZ3JvdW5kIERlY29yYXRvciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzLkJhY2tncm91bmRDb2xvckRlY29yYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5iYWNrZ3JvdW5kRGVjb3JhdG9yIi8+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBsaWdodHdlaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJqYXZhLmxhbmcuT2JqZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbGFiZWw9IkZvcmVncm91bmQgRGVjb3JhdG9yIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuRm9yZWdyb3VuZENvbG9yRGVjb3JhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmZvcmVncm91bmREZWNvcmF0b3IiLz4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9ImphdmEubGFuZy5PYmplY3QiCi0gICAgICAgICAgICBsYWJlbD0iRm9udCBEZWNvcmF0b3IiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5Gb250RGVjb3JhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmZvbnREZWNvcmF0b3IiLz4KLSAgICAgICAgICAgIAotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9InRydWUiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBsYWJlbD0iVGVzdCBEZWNvcmF0b3IgRm9yIEdlbmVyYWwgQWRhcHRhYmlsaXR5IE9uIgotICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuVGVzdEFkYXB0YWJsZURlY29yYXRvckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuZ2VuZXJhbEFkYXB0YWJpbGl0eU9uIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51cy5PYmplY3RDb250cmlidXRpb25DbGFzc2VzJElDb21tb24iPgotICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIEEgdGVzdCBkZWNvcmF0b3IgZm9yIHN1Y2Nlc3NmdWwgZ2VuZXJhbCBhZGFwdGFiaWxpdHkKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2RlY29yYXRvcj4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGxhYmVsPSJUZXN0IERlY29yYXRvciBGb3IgR2VuZXJhbCBBZGFwdGFiaWxpdHkgT2ZmIgotICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuVGVzdFVuYWRhcHRhYmxlRGVjb3JhdG9yQ29udHJpYnV0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5nZW5lcmFsQWRhcHRhYmlsaXR5T2ZmIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51cy5PYmplY3RDb250cmlidXRpb25DbGFzc2VzJElDb21tb24iPgotICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIEEgdGVzdCBkZWNvcmF0b3IgZm9yIHVuc3VjY2Vzc2Z1bCBnZW5lcmFsIGFkYXB0YWJpbGl0eQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9InRydWUiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBsYWJlbD0iVGVzdCBSZXNvdXJjZSBBZGFwdGF0aW9uIgotICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRlY29yYXRvcnMuVGVzdFJlc291cmNlRGVjb3JhdG9yQ29udHJpYnV0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGVjb3JhdG9ycy5yZXNvdXJjZURlc2NvcmF0b3IiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgQSB0ZXN0IGRlY29yYXRvciBmb3IgcmVzb3VyY2VzCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9kZWNvcmF0b3I+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBsaWdodHdlaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGxhYmVsPSJUZXN0IFJlc291cmNlIE1hcHBpbmcgQWRhcHRhdGlvbiIKLSAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzLlRlc3RSZXNvdXJjZU1hcHBpbmdEZWNvcmF0b3JDb250cmlidXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kZWNvcmF0b3JzLnJlc291cmNlTWFwcGluZ0Rlc2NvcmF0b3IiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nIj4KLSAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBBIHRlc3QgZGVjb3JhdG9yIGZvciByZXNvdXJjZSBtYXBwaW5ncwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLTwhLS0gV29ya2luZyBzZXQgdGVzdHMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2luZ1NldHMiPgotICAgICAgPHdvcmtpbmdTZXQKLSAgICAgICAgICAgIG5hbWU9Ik1vY2sgV29ya2luZyBTZXQiCi0gICAgICAgICAgICBwYWdlQ2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrV29ya2luZ1NldFBhZ2UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbnl0aGluZy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tXb3JraW5nU2V0Ij4KLSAgICAgIDwvd29ya2luZ1NldD4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSBQcmVmZXJlbmNlIHRlc3RzIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iRWRpdG9ycyBUZXN0IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRpYWxvZ3MuRW5hYmxlVGVzdFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRpYWxvZ3MuRW5hYmxlVGVzdFByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSJCYWQgTGlzdGVuZXJzIFRlc3QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMubWFudWFsLkJyb2tlblVwZGF0ZVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm1hbnVhbC5Ccm9rZW5VcGRhdGVQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iRm9udCBFZGl0b3JzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRpYWxvZ3MuRm9udEZpZWxkRWRpdG9yVGVzdFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRpYWxvZ3MuRm9udEZpZWxkRWRpdG9yVGVzdFByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSBNdWx0aS1wYWdlIGVkaXRvciB0ZXN0cyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0gICAgICA8a2V5QmluZGluZwotICAgICAgICAgICAgc3RyaW5nPSJDdHJsK1NoaWZ0KzQiCi0gICAgICAgICAgICBzY29wZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuc2NvcGUxIgotICAgICAgICAgICAgY29tbWFuZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdENvbW1hbmRJZCIKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb249Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotICAgICAgPC9rZXlCaW5kaW5nPgotICAgICAgPGtleUJpbmRpbmcKLSAgICAgICAgICAgIHN0cmluZz0iQ3RybCtTaGlmdCs1IgotICAgICAgICAgICAgc2NvcGU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnNjb3BlMiIKLSAgICAgICAgICAgIGNvbW1hbmQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RDb21tYW5kSWQiCi0gICAgICAgICAgICBjb25maWd1cmF0aW9uPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLSAgICAgIDwva2V5QmluZGluZz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIj4KLSAgICAgIDxjb250ZXh0Ci0gICAgICAgICAgICBuYW1lPSJTY29wZSAxIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IlRlc3QgU2NvcGUgIzEiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuc2NvcGUxIj4KLSAgICAgIDwvY29udGV4dD4KLSAgICAgIDxjb250ZXh0Ci0gICAgICAgICAgICBuYW1lPSJTY29wZSAyIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IlRlc3QgU2NvcGUgIzIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuc2NvcGUyIj4KLSAgICAgIDwvY29udGV4dD4KLSAgICAgIDxjb250ZXh0Ci0gICAgICAgICAJaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRleHRzLmNvbnRleHQxIgotICAgICAgICAgCW5hbWU9IlRlc3QgQ29udGV4dCAxIgotICAgICAgICAgCWRlc2NyaXB0aW9uPSJBIHRlc3QgZm9yIHRoZSBwcmVmZXJyZWQgY29udGV4dCBzdXBwb3J0IiAvPgotICAgICAgPGNvbnRleHQKLSAgICAgICAgIAlpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29udGV4dHMuY29udGV4dDIiCi0gICAgICAgICAJbmFtZT0iVGVzdCBDb250ZXh0IDIiCi0gICAgICAgICAJZGVzY3JpcHRpb249IkEgdGVzdCBmb3IgdGhlIHByZWZlcnJlZCBjb250ZXh0IHN1cHBvcnQiCi0gICAgICAgICAJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbnRleHRzLmNvbnRleHQxIiAvPgotICAgPC9leHRlbnNpb24+Ci08IS0tIE1hcmtlciBJbWFnZSBQcm92aWRlciB0ZXN0cyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ0ZXN0bWFya2VyIgotICAgICAgICAgbmFtZT0iVGVzdCBNYXJrZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VySW1hZ2VQcm92aWRlcnMiPgotICAgICAgPGltYWdlcHJvdmlkZXIKLSAgICAgICAgICAgIG1hcmtlcnR5cGU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnRlc3RtYXJrZXIiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbnl0aGluZy5naWYiCi0gICAgICAgICAgICBpZD0idGVzdG1hcmtlci5pbWFnZVByb3ZpZGVyIj4KLSAgICAgIDwvaW1hZ2Vwcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InRlc3RtYXJrZXIyIgotICAgICAgICAgbmFtZT0iVGVzdCBNYXJrZXIgMiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJJbWFnZVByb3ZpZGVycyI+Ci0gICAgICA8aW1hZ2Vwcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFkYXB0YWJsZS5UZXN0TWFya2VySW1hZ2VQcm92aWRlciIKLSAgICAgICAgICAgIGljb249Imljb25zXGR5bmFtaWMuZ2lmIgotICAgICAgICAgICAgaWQ9InRlc3RtYXJrZXIuaW1hZ2VQcm92aWRlcjIiCi0gICAgICAgICAgICBtYXJrZXJ0eXBlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy50ZXN0bWFya2VyMiI+Ci0gICAgICA8L2ltYWdlcHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbnRybyI+Ci0gICAgICA8aW50cm8KLSAgICAgICAgICAgIGljb249Imljb25zL2FueXRoaW5nLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbnRyby5Nb2NrSW50cm9QYXJ0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RpbnRybyI+Ci0gICAgICA8L2ludHJvPgotICAgPC9leHRlbnNpb24+Ci08IS0tIEFjdGl2aXRpZXMgdGVzdGluZyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iQ2F0ZWdvcnkgMSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yeTEiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iQ2F0ZWdvcnkgMiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yeTIiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iQ2F0ZWdvcnkgMyIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yeTMiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iQ2F0ZWdvcnkgNCIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yeTQiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iQ2F0ZWdvcnkgNSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yeTUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iQ2F0ZWdvcnkgNiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yeTYiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgMSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTEiPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgMiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTIiPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgMyIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTMiPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgNCIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTQiPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgNSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTUiPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgNiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTYiPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgNyIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTciPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgOCIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTgiPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgOSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTkiPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgMTAiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0aXZpdHkxMCI+Ci0gICAgICA8L2FjdGl2aXR5PgotICAgICAgPGFjdGl2aXR5Ci0gICAgICAgICAgICBuYW1lPSJBY3Rpdml0eSAxMSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTExIj4KLSAgICAgIDwvYWN0aXZpdHk+Ci0gICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgIG5hbWU9IkFjdGl2aXR5IDEyIgotICAgICAgICAgICAgZGVzY3JpcHRpb249ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFjdGl2aXR5MTIiPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgMTMiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0aXZpdHkxMyI+Ci0gICAgICA8L2FjdGl2aXR5PgotICAgICAgPGFjdGl2aXR5Ci0gICAgICAgICAgICBuYW1lPSJBY3Rpdml0eSAxNCIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTE0Ij4KLSAgICAgIDwvYWN0aXZpdHk+Ci0gICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgIG5hbWU9IkFjdGl2aXR5IDE1IgotICAgICAgICAgICAgZGVzY3JpcHRpb249ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFjdGl2aXR5MTUiPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgMTYiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0aXZpdHkxNiI+Ci0gICAgICA8L2FjdGl2aXR5PgotICAgICAgPGFjdGl2aXR5Ci0gICAgICAgICAgICBuYW1lPSJBY3Rpdml0eSAxNyIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTE3Ij4KLSAgICAgIDwvYWN0aXZpdHk+Ci0gICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgIG5hbWU9IkFjdGl2aXR5IDE4IgotICAgICAgICAgICAgZGVzY3JpcHRpb249ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFjdGl2aXR5MTgiPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTEiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5wYXR0ZXJuMSI+Ci0gICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0gICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UuYWN0aXZpdHkyIgotICAgICAgICAgICAgcGF0dGVybj0ib3JnLmVjbGlwc2UucGF0dGVybjEiPgotICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLmFjdGl2aXR5MyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZy5lY2xpcHNlLnBhdHRlcm4xIj4KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgIDxkZWZhdWx0RW5hYmxlbWVudAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFjdGl2aXR5MSI+Ci0gICAgICA8L2RlZmF1bHRFbmFibGVtZW50PgotICAgICAgPGRlZmF1bHRFbmFibGVtZW50Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0aXZpdHkyIj4KLSAgICAgIDwvZGVmYXVsdEVuYWJsZW1lbnQ+Ci0gICAgICA8ZGVmYXVsdEVuYWJsZW1lbnQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTMiPgotICAgICAgPC9kZWZhdWx0RW5hYmxlbWVudD4KLSAgICAgIDxkZWZhdWx0RW5hYmxlbWVudAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFjdGl2aXR5NCI+Ci0gICAgICA8L2RlZmF1bHRFbmFibGVtZW50PgotICAgICAgPGNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTEiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yeTEiPgotICAgICAgPC9jYXRlZ29yeUFjdGl2aXR5QmluZGluZz4KLSAgICAgIDxjYXRlZ29yeUFjdGl2aXR5QmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UuYWN0aXZpdHkyIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuY2F0ZWdvcnkxIj4KLSAgICAgIDwvY2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmc+Ci0gICAgICA8Y2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLmFjdGl2aXR5MyIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmNhdGVnb3J5MSI+Ci0gICAgICA8L2NhdGVnb3J5QWN0aXZpdHlCaW5kaW5nPgotICAgICAgPGNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTQiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yeTEiPgotICAgICAgPC9jYXRlZ29yeUFjdGl2aXR5QmluZGluZz4KLSAgICAgIDxhY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZwotICAgICAgICAgICAgcmVxdWlyZWRBY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTIiCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTEiPgotICAgICAgPC9hY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZz4KLSAgICAgIDxhY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZwotICAgICAgICAgICAgcmVxdWlyZWRBY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTMiCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTEiPgotICAgICAgPC9hY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZz4KLSAgICAgIDxhY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZwotICAgICAgICAgICAgcmVxdWlyZWRBY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTQiCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTEiPgotICAgICAgPC9hY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZz4KLSAgICAgIDxhY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZwotICAgICAgICAgICAgcmVxdWlyZWRBY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTUiCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTEiPgotICAgICAgPC9hY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZz4KLSAgICAgIDxhY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZwotICAgICAgICAgICAgcmVxdWlyZWRBY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTYiCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTEiPgotICAgICAgPC9hY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZz4KLSAgICAgIDxhY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZwotICAgICAgICAgICAgcmVxdWlyZWRBY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTciCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTEiPgotICAgICAgPC9hY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZz4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgZGVzY3JpcHRpb249IkFjdGl2aXR5IGZvciB0ZXN0aW5nIHRoZSBwcm9ibGVtIGZpbHRlcnMiCi0gICAgICAgICAgICBpZD0icHJvYmxlbUZpbHRlclRlc3RBY3Rpdml0eSIKLSAgICAgICAgICAgIG5hbWU9IlByb2JsZW1GaWx0ZXJUZXN0Ii8+Ci0gICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0icHJvYmxlbUZpbHRlclRlc3RBY3Rpdml0eSIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwudWlcLnRlc3RzLy4qcHJvYmxlbVRlc3QuKiIvPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iY2F0ZWdvcnkgZm9yIHRoZSBwcm9ibGVtIGZpbHRlciB0ZXN0cyIKLSAgICAgICAgICAgIGlkPSJwcm9ibGVtQ2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJQcm9ibGVtIEZpbHRlciBUZXN0cyIvPgotICAgICAgPGNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJwcm9ibGVtRmlsdGVyVGVzdEFjdGl2aXR5IgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0icHJvYmxlbUNhdGVnb3J5Ii8+Ci0gICAgICA8ZGVmYXVsdEVuYWJsZW1lbnQgaWQ9InByb2JsZW1GaWx0ZXJUZXN0QWN0aXZpdHkiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS50aGVtZXMiPgotICAgICAgPHRoZW1lCi0gICAgICAJCW5hbWU9IkV4dGVuZGVkIFRoZW1lIDEiCi0gICAgICAgICAgICBpZD0iZXh0ZW5kZWRUaGVtZTEiPgotICAgICAgICAgPGRhdGEKLSAgICAgICAgICAgICAgIG5hbWU9ImQxIgotICAgICAgICAgICAgICAgdmFsdWU9ImQxIj4KLSAgICAgICAgIDwvZGF0YT4KLSAgICAgICAgIDxjb2xvck92ZXJyaWRlCi0gICAgICAgICAgICAgICB2YWx1ZT0iQ09MT1JfREFSS19HUkVFTiIKLSAgICAgICAgICAgICAgIGlkPSJzd3Rjb2xvciI+Ci0gICAgICAgICA8L2NvbG9yT3ZlcnJpZGU+Ci0gICAgICAgICA8Zm9udE92ZXJyaWRlCi0gICAgICAgICAgICAgICB2YWx1ZT0iU2Fucy1yZWd1bGFyLTEwIgotICAgICAgICAgICAgICAgaWQ9InZhbGZvbnQiPgotICAgICAgICAgPC9mb250T3ZlcnJpZGU+Ci0gICAgICAgICAKLSAgICAgIDwvdGhlbWU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS50aGVtZXMiPgotICAgICAgPHRoZW1lICAgICAgCQkKLSAgICAgICAgICAgIGlkPSJleHRlbmRlZFRoZW1lMSI+Ci0gICAgICAgICA8ZGF0YQotICAgICAgICAgICAgICAgbmFtZT0iZDEiCi0gICAgICAgICAgICAgICB2YWx1ZT0ibm90IGhvbm91cmVkIj4KLSAgICAgICAgIDwvZGF0YT4gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgPGRhdGEKLSAgICAgICAgICAgICAgIG5hbWU9ImQyIgotICAgICAgICAgICAgICAgdmFsdWU9ImQyIj4KLSAgICAgICAgIDwvZGF0YT4gIAotICAgICAgICAgCi0gICAgICAgICA8Y29sb3JPdmVycmlkZQotICAgICAgICAgICAgICAgdmFsdWU9Im5vdCBob25vdXJlZCIKLSAgICAgICAgICAgICAgIGlkPSJzd3Rjb2xvciI+Ci0gICAgICAgICA8L2NvbG9yT3ZlcnJpZGU+Ci0KLSAgICAgICAgIDxjb2xvck92ZXJyaWRlCi0gICAgICAgICAgICAgICB2YWx1ZT0iQ09MT1JfREFSS19HUkVFTiIKLSAgICAgICAgICAgICAgIGlkPSJyZ2Jjb2xvciI+Ci0gICAgICAgICA8L2NvbG9yT3ZlcnJpZGU+Ci0gICAgICAgICAKLSAgICAgICAgIDxmb250T3ZlcnJpZGUKLSAgICAgICAgICAgICAgIHZhbHVlPSJub3QgaG9ub3VyZWQiCi0gICAgICAgICAgICAgICBpZD0idmFsZm9udCI+Ci0gICAgICAgICA8L2ZvbnRPdmVycmlkZT4KLSAgICAgICAgIAotICAgICAgICAgPGZvbnRPdmVycmlkZQotICAgICAgICAgICAgICAgdmFsdWU9IlNhbnMtcmVndWxhci0xMCIKLSAgICAgICAgICAgICAgIGlkPSJub3ZhbGZvbnQiPgotICAgICAgICAgPC9mb250T3ZlcnJpZGU+Ci0gICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIDwvdGhlbWU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnRoZW1lcyI+Ci0gICAgICA8dGhlbWUgICAgICAJCQotICAgICAgICAgICAgaWQ9ImV4dGVuZGVkVGhlbWUxIj4KLSAgICAgIDwvdGhlbWU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS50aGVtZXMiPgotICAgICAgPHRoZW1lICAgICAgCQkKLSAgICAgIAkJbmFtZT0iRXh0ZW5kZWQgVGhlbWUgMiIKLSAgICAgICAgICAgIGlkPSJleHRlbmRlZFRoZW1lMiI+Ci0gICAgICA8L3RoZW1lPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS50aGVtZXMiPgotICAgICAgPHRoZW1lCi0gICAgICAJCW5hbWU9IkV4dGVuZGVkIFRoZW1lIDMiCi0gICAgICAgICAgICBpZD0iZXh0ZW5kZWRUaGVtZTMiPgotICAgICAgPC90aGVtZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnRoZW1lcyI+Ci0gICAgICA8dGhlbWUgCi0JICAgICAgICBuYW1lPSJub3QgaG9ub3VyZWQiICAgICAJCQotICAgICAgICAgICAgaWQ9ImV4dGVuZGVkVGhlbWUzIj4KLSAgICAgIDwvdGhlbWU+Ci0gICA8L2V4dGVuc2lvbj4gIAotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudGhlbWVzIj4KLSAgICAgIDx0aGVtZQotICAgICAgICAgICAgbmFtZT0idGVzdCB0aGVtZSAxIgotICAgICAgICAgICAgaWQ9InRoZW1lMSI+Ci0gICAgICAgICA8ZGF0YQotICAgICAgICAgICAgICAgbmFtZT0iZGF0YTEiCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3ZlcnJpZGUxIj4KLSAgICAgICAgIDwvZGF0YT4KLSAgICAgICAgIDxjb2xvck92ZXJyaWRlCi0gICAgICAgICAgICAgICB2YWx1ZT0iMiwxLDEiCi0gICAgICAgICAgICAgICBpZD0icmdiY29sb3IiPgotICAgICAgICAgPC9jb2xvck92ZXJyaWRlPgotICAgICAgICAgPGNvbG9yT3ZlcnJpZGUKLSAgICAgICAgICAgICAgIHZhbHVlPSJDT0xPUl9EQVJLX0dSRUVOIgotICAgICAgICAgICAgICAgaWQ9InN3dGNvbG9yIj4KLSAgICAgICAgIDwvY29sb3JPdmVycmlkZT4KLSAgICAgICAgIDxjb2xvck92ZXJyaWRlCi0gICAgICAgICAgICAgICB2YWx1ZT0iOSw5LDkiCi0gICAgICAgICAgICAgICBpZD0iZGVmYXVsdGVkY29sb3IyIj4KLSAgICAgICAgIDwvY29sb3JPdmVycmlkZT4KLSAgICAgICAgIDxmb250T3ZlcnJpZGUKLSAgICAgICAgICAgICAgIHZhbHVlPSJDb3VyaWVyLWl0YWxpYy0xMCIKLSAgICAgICAgICAgICAgIGlkPSJub3ZhbGZvbnQiPgotICAgICAgICAgPC9mb250T3ZlcnJpZGU+Ci0gICAgICAgICA8Zm9udE92ZXJyaWRlCi0gICAgICAgICAgICAgICB2YWx1ZT0iQ291cmllci1yZWd1bGFyLTE2IgotICAgICAgICAgICAgICAgaWQ9ImRlZmF1bHRlZGZvbnQyIj4KLSAgICAgICAgIDwvZm9udE92ZXJyaWRlPgotICAgICAgICAgPGZvbnRPdmVycmlkZQotICAgICAgICAgICAgICAgdmFsdWU9IlNhbnMtcmVndWxhci01IgotICAgICAgICAgICAgICAgaWQ9InZhbGZvbnQiPgotICAgICAgICAgPC9mb250T3ZlcnJpZGU+Ci0gICAgICA8L3RoZW1lPgotICAgICAgPGRhdGEKLSAgICAgICAgICAgIG5hbWU9ImRhdGExIgotICAgICAgICAgICAgdmFsdWU9InZhbHVlMSI+Ci0gICAgICA8L2RhdGE+Ci0gICAgICA8ZGF0YQotICAgICAgICAgICAgbmFtZT0iZGF0YTIiCi0gICAgICAgICAgICB2YWx1ZT0idmFsdWUyIj4KLSAgICAgIDwvZGF0YT4KLSAgICAgIDxkYXRhCi0gICAgICAgICAgICBuYW1lPSJpbnQxIgotICAgICAgICAgICAgdmFsdWU9IjMxMzMiPgotICAgICAgPC9kYXRhPgotICAgICAgPGRhdGEKLSAgICAgICAgICAgIG5hbWU9ImJvb2wxIgotICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgPC9kYXRhPgotICAgICAgPGNvbG9yRGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9InJnYmNvbG9yIgotICAgICAgICAgICAgdmFsdWU9IjEsMSwyIgotICAgICAgICAgICAgaWQ9InJnYmNvbG9yIj4KLSAgICAgIDwvY29sb3JEZWZpbml0aW9uPgotICAgICAgPGNvbG9yRGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9Im5vdCBob25vdXJlZCIKLSAgICAgICAgICAgIHZhbHVlPSJub3QgaG9ub3VyZWQiCi0gICAgICAgICAgICBpZD0icmdiY29sb3IiPiAgICAgICAgICAgIAotICAgICAgPC9jb2xvckRlZmluaXRpb24+Ci0gICAgICA8Y29sb3JEZWZpbml0aW9uCi0gICAgICAgICAgICBsYWJlbD0ic3d0Y29sb3IiCi0gICAgICAgICAgICB2YWx1ZT0iQ09MT1JfREFSS19CTFVFIgotICAgICAgICAgICAgaWQ9InN3dGNvbG9yIj4KLSAgICAgIDwvY29sb3JEZWZpbml0aW9uPgotICAgICAgPGNvbG9yRGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9ImRlZmF1bHRlZGNvbG9yIgotICAgICAgICAgICAgZGVmYXVsdHNUbz0icmdiY29sb3IiCi0gICAgICAgICAgICBpZD0iZGVmYXVsdGVkY29sb3IiPgotICAgICAgPC9jb2xvckRlZmluaXRpb24+Ci0gICAgICA8Y29sb3JEZWZpbml0aW9uCi0gICAgICAgICAgICBsYWJlbD0iZGVmYXVsdGVkY29sb3IyIgotICAgICAgICAgICAgZGVmYXVsdHNUbz0iZGVmYXVsdGVkY29sb3IiCi0gICAgICAgICAgICBpZD0iZGVmYXVsdGVkY29sb3IyIj4KLSAgICAgIDwvY29sb3JEZWZpbml0aW9uPgotICAgICAgPGNvbG9yRGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9ImRlZmF1bHRlZGNvbG9yMyIKLSAgICAgICAgICAgIGRlZmF1bHRzVG89ImRlZmF1bHRlZGNvbG9yMiIKLSAgICAgICAgICAgIGlkPSJkZWZhdWx0ZWRjb2xvcjMiPgotICAgICAgPC9jb2xvckRlZmluaXRpb24+Ci0gICAgICA8Y29sb3JEZWZpbml0aW9uCi0gICAgICAgICAgICBsYWJlbD0icGxhdGZvcm1jb2xvciIKLSAgICAgICAgICAgIHZhbHVlPSIwLDAsMCIKLSAgICAgICAgICAgIGlkPSJwbGF0Zm9ybWNvbG9yIj4KLSAgICAgICAgIDxjb2xvclZhbHVlCi0gICAgICAgICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICAgICAgICB2YWx1ZT0iNTAsNTAsNTAiCi0gICAgICAgICAgICAgICBvcz0id2luMzIiPgotICAgICAgICAgPC9jb2xvclZhbHVlPgotICAgICAgICAgPGNvbG9yVmFsdWUKLSAgICAgICAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICAgICAgICB2YWx1ZT0iMjUsMjUsMjUiCi0gICAgICAgICAgICAgICBvcz0ibGludXgiPgotICAgICAgICAgPC9jb2xvclZhbHVlPgotICAgICAgICAgPGNvbG9yVmFsdWUKLSAgICAgICAgICAgICAgIHZhbHVlPSI3NSw3NSw3NSIKLSAgICAgICAgICAgICAgIG9zPSJsaW51eCI+Ci0gICAgICAgICA8L2NvbG9yVmFsdWU+Ci0gICAgICA8L2NvbG9yRGVmaW5pdGlvbj4KLSAgICAgIDxjb2xvckRlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSJmYWN0b3J5Y29sb3IiCi0gICAgICAgICAgICBjb2xvckZhY3Rvcnk9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnRoZW1lcy5UZXN0Q29sb3JGYWN0b3J5IgotICAgICAgICAgICAgaWQ9ImZhY3Rvcnljb2xvciI+Ci0gICAgICA8L2NvbG9yRGVmaW5pdGlvbj4KLSAgICAgIDxmb250RGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9Im5vdmFsZm9udCIKLSAgICAgICAgICAgIGlkPSJub3ZhbGZvbnQiPgotICAgICAgPC9mb250RGVmaW5pdGlvbj4KLSAgICAgIDxmb250RGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9InZhbGZvbnQiCi0gICAgICAgICAgICB2YWx1ZT0iVGFob21hLWJvbGQtMjAiCi0gICAgICAgICAgICBpZD0idmFsZm9udCI+Ci0gICAgICA8L2ZvbnREZWZpbml0aW9uPgotICAgICAgPGZvbnREZWZpbml0aW9uCi0gICAgICAgICAgICBsYWJlbD0ibm90IGhvbm91cmVkIgotICAgICAgICAgICAgdmFsdWU9Im5vdCBob25vdXJlZCIKLSAgICAgICAgICAgIGlkPSJ2YWxmb250Ij4KLSAgICAgIDwvZm9udERlZmluaXRpb24+ICAgICAgCi0gICAgICA8Zm9udERlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSJwbGF0Zm9ybWZvbnQiCi0gICAgICAgICAgICB2YWx1ZT0iU2Fucy1ib2xkLTE1IgotICAgICAgICAgICAgaWQ9InBsYXRmb3JtZm9udCI+Ci0gICAgICAgICA8Zm9udFZhbHVlCi0gICAgICAgICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICAgICAgICB2YWx1ZT0iQ291cmllciBOZXctcmVndWxhci0xMiI+Ci0gICAgICAgICA8L2ZvbnRWYWx1ZT4KLSAgICAgIDwvZm9udERlZmluaXRpb24+Ci0gICAgICA8Zm9udERlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSJkZWZhdWx0ZWRmb250IgotICAgICAgICAgICAgZGVmYXVsdHNUbz0idmFsZm9udCIKLSAgICAgICAgICAgIGlkPSJkZWZhdWx0ZWRmb250Ij4KLSAgICAgIDwvZm9udERlZmluaXRpb24+Ci0gICAgICA8Zm9udERlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSJkZWZhdWx0ZWRmb250MiIKLSAgICAgICAgICAgIGRlZmF1bHRzVG89ImRlZmF1bHRlZGZvbnQiCi0gICAgICAgICAgICBpZD0iZGVmYXVsdGVkZm9udDIiPgotICAgICAgPC9mb250RGVmaW5pdGlvbj4KLSAgICAgIDxmb250RGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9ImRlZmF1bHRlZGZvbnQzIgotICAgICAgICAgICAgZGVmYXVsdHNUbz0iZGVmYXVsdGVkZm9udDIiCi0gICAgICAgICAgICBpZD0iZGVmYXVsdGVkZm9udDMiPgotICAgICAgPC9mb250RGVmaW5pdGlvbj4KLSAgICAgIDxmb250RGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9Im5vb3ZlcnJpZGVmb250IgotICAgICAgICAgICAgaWQ9Im5vb3ZlcnJpZGVmb250Ij4KLSAgICAgIDwvZm9udERlZmluaXRpb24+Ci0gICAgICA8Y29sb3JEZWZpbml0aW9uCi0gICAgICAgICAgICBsYWJlbD0ibm9vdmVycmlkZWNvbG9yIgotICAgICAgICAgICAgdmFsdWU9Ijk5LDk5LDk5IgotICAgICAgICAgICAgaWQ9Im5vb3ZlcnJpZGVjb2xvciI+Ci0gICAgICA8L2NvbG9yRGVmaW5pdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWNjZWxlcmF0b3JTY29wZXMiPgotICAgICAgICAgPGFjY2VsZXJhdG9yU2NvcGUKLSAgICAgICAgIAlpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuYWNjZWxlcmF0b3JTY29wZXMudGVzdDEiCi0gICAgICAgICAJbmFtZT0iVGVzdCBBY2NlbGVyYXRvciBTY29wZSAxIgotICAgICAgICAgCWRlc2NyaXB0aW9uPSJBIHRlc3QgZm9yIHRoZSBkZXByZWNhdGVkIGFjY2VsZXJhdG9yIHNjb3BlIHN1cHBvcnQiIC8+Ci0gICAgICAgICA8YWNjZWxlcmF0b3JTY29wZQotICAgICAgICAgCWlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hY2NlbGVyYXRvclNjb3Blcy50ZXN0MiIKLSAgICAgICAgIAluYW1lPSJUZXN0IEFjY2VsZXJhdG9yIFNjb3BlIDIiCi0gICAgICAgICAJZGVzY3JpcHRpb249IkEgdGVzdCBmb3IgdGhlIGRlcHJlY2F0ZWQgYWNjZWxlcmF0b3Igc2NvcGUgc3VwcG9ydCIKLSAgICAgICAgIAlwYXJlbnRTY29wZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuYWNjZWxlcmF0b3JTY29wZXMudGVzdDEiIC8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgICAgIDxzY29wZQotICAgICAgICAgCWlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kcy5zY29wZTEiCi0gICAgICAgICAJbmFtZT0iVGVzdCBTY29wZSAxIgotICAgICAgICAgCWRlc2NyaXB0aW9uPSJBIHRlc3QgZm9yIHRoZSBkZXByZWNhdGVkIGNvbW1hbmQgc2NvcGUgc3VwcG9ydCIgLz4KLSAgICAgICAgIDxzY29wZQotICAgICAgICAgCWlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kcy5zY29wZTIiCi0gICAgICAgICAJbmFtZT0iVGVzdCBTY29wZSAyIgotICAgICAgICAgCWRlc2NyaXB0aW9uPSJBIHRlc3QgZm9yIHRoZSBkZXByZWNhdGVkIGNvbW1hbmQgc2NvcGUgc3VwcG9ydCIKLSAgICAgICAgIAlwYXJlbnQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzLnNjb3BlMSIgLz4KLSAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSJDYXRlZ29yeS1MZXNzIENvbW1hbmQiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQSBjb21tYW5kIHdpdGggbm8gY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tbWFuZHMuY2F0ZWdvcnlMZXNzQ29tbWFuZCI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLWNvbW1hbmQgcGFyYW1ldGVyIHR5cGVzIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tbWFuZHMuU3VidHJhY3RJbnRlZ2VySGFuZGxlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kcy5zdWJ0cmFjdEludGVnZXIiCi0gICAgICAgICAgICBuYW1lPSJTdWJ0cmFjdCAyIEludGVnZXJzIj4KLSAgICAgICAgIDxjb21tYW5kUGFyYW1ldGVyCi0gICAgICAgICAgICAgICBpZD0ibWludWVuZCIKLSAgICAgICAgICAgICAgIG5hbWU9Ik1pbnVlbmQiCi0gICAgICAgICAgICAgICBvcHRpb25hbD0iZmFsc2UiCi0gICAgICAgICAgICAgICB0eXBlSWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzLkludGVnZXIiLz4KLSAgICAgICAgIDxjb21tYW5kUGFyYW1ldGVyCi0gICAgICAgICAgICAgICBpZD0ic3VidHJhaGVuZCIKLSAgICAgICAgICAgICAgIG5hbWU9IlN1YnRyYWhlbmQiCi0gICAgICAgICAgICAgICBvcHRpb25hbD0iZmFsc2UiCi0gICAgICAgICAgICAgICB0eXBlSWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzLkludGVnZXIiLz4KLSAgICAgIDwvY29tbWFuZD4KLSAgICAgIDxjb21tYW5kUGFyYW1ldGVyVHlwZQotICAgICAgICAgICAgY29udmVydGVyPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kcy5JbnRlZ2VyQ29udmVydGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzLkludGVnZXIiCi0gICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS1wYXJhbWV0ZXJpemVkIGNvbW1hbmQgc2VyaWFsaXphdGlvbiAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0gICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iWmVybyBQYXJhbWV0ZXIgQ29tbWFuZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kcy56ZXJvUGFyYW1ldGVyQ29tbWFuZCI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbW1hbmRzLm9uZVBhcmFtZXRlckNvbW1hbmQiCi0gICAgICAgICAgICAgICBuYW1lPSJPbmUgUGFyYW1ldGVyIENvbW1hbmQiPgotICAgICAgICAgICAgPGNvbW1hbmRQYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgIGlkPSJwYXJhbTEuMSIKLSAgICAgICAgICAgICAgICAgIG5hbWU9IlBhcmFtZXRlcjEiCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgICAgPC9jb21tYW5kPgotICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kcy50d29QYXJhbWV0ZXJDb21tYW5kIgotICAgICAgICAgICAgICAgbmFtZT0iVHdvIFBhcmFtZXRlciBDb21tYW5kIj4KLSAgICAgICAgICAgIDxjb21tYW5kUGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICBpZD0icGFyYW0yLjEiCi0gICAgICAgICAgICAgICAgICBuYW1lPSJQYXJhbWV0ZXIxIgotICAgICAgICAgICAgICAgICAgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgICAgICAgIDxjb21tYW5kUGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICBpZD0icGFyYW0yLjIiCi0gICAgICAgICAgICAgICAgICBuYW1lPSJQYXJhbWV0ZXIyIgotICAgICAgICAgICAgICAgICAgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tbWFuZHMudGhyZWVQYXJhbWV0ZXJDb21tYW5kIgotICAgICAgICAgICAgICAgbmFtZT0iVGhyZWUgUGFyYW1ldGVyIENvbW1hbmQiPgotICAgICAgICAgICAgPGNvbW1hbmRQYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgIGlkPSJwYXJhbTMuMSIKLSAgICAgICAgICAgICAgICAgIG5hbWU9IlBhcmFtZXRlcjEiCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGNvbW1hbmRQYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgIGlkPSJwYXJhbTMuMiIKLSAgICAgICAgICAgICAgICAgIG5hbWU9IlBhcmFtZXRlcjIiCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGNvbW1hbmRQYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgIGlkPSJwYXJhbTMuMyIKLSAgICAgICAgICAgICAgICAgIG5hbWU9IlBhcmFtZXRlcjMiCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgICAgPC9jb21tYW5kPgotICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21tYW5kLndpdGguZj0lKSgsdW5ueS5uYW1lIgotICAgICAgICAgICAgICAgbmFtZT0iQ29tbWFuZCB3aXRoIGZ1bm55IG5hbWUiPgotICAgICAgICAgICAgPGNvbW1hbmRQYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgIGlkPSJwYXJhbS53aXRoLkYoeyZhcG9zOyZndDsmbHQ7K3wuKT0sJS5uYW1lIgotICAgICAgICAgICAgICAgICAgbmFtZT0iUGFyYW0gd2l0aCBmdW5ueSBuYW1lIgotICAgICAgICAgICAgICAgICAgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgICAgIDwvY29tbWFuZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0JPCEtLW1hbGZvcm1lZCBhY3Rpdml0eSBkZWZpbml0aW9ucyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIG5hbWU9IkFjdHZpdGllcyBmb3IgUGVyc2lzdGFuY2VUZXN0IgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMiPgotICAgICAgPGFjdGl2aXR5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuUFQuQTEiLz4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuYWN0aXZpdHkzIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLlBULkEyIi8+ICAgCi0gICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLlBULkEzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAKLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLlBULkMxIi8+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNhdGVnb3J5MiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5QVC5DMiIvPiAgICAgICAgICAgIAotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS51aS5QVC5DMyIvPgotICAgICAgICAgICAgCi0gICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UudWkuUFQuQTIiLz4KLSAgICAgICAgICAgIAotICAgICAgPGFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS51aS5QVC5BMiIvPiAKLSAgICAgICAgICAgIAotICAgICAgPGNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nCi0gICAgICAJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLlBULkMyIiAvPgotICAgICAgCQkgICAgICAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gIAotICAgPCEtLSBwYXJ0IG9mIHRlc3QgZm9yIGJ1ZyA3NTExOCAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxwcmltYXJ5V2l6YXJkIGlkPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5wcm9qZWN0Ii8+Ci0gICAgICA8cHJpbWFyeVdpemFyZCBpZD0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXcucHJvamVjdCIvPgotICAgICAgPHByaW1hcnlXaXphcmQgaWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LnByb2plY3QiLz4KLSAgICAgIDxwcmltYXJ5V2l6YXJkIGlkPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5wcm9qZWN0Ii8+Ci0gICAgICA8cHJpbWFyeVdpemFyZCBpZD0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXcucHJvamVjdCIvPgotICAgICAgPHByaW1hcnlXaXphcmQgaWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LnByb2plY3QiLz4KLSAgICAgIDxwcmltYXJ5V2l6YXJkIGlkPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5wcm9qZWN0Ii8+Ci0gICAgICA8cHJpbWFyeVdpemFyZCBpZD0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXcucHJvamVjdCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgIAkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSJUZXN0IEltcG9ydCBDYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0SW1wb3J0Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IlRlc3QgSW1wb3J0IFBhcmVudGVkIENhdGVnb3J5IgotICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkJhc2ljIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RJbXBvcnRQYXJlbnRlZCI+Ci0gICAgICA8L2NhdGVnb3J5PiAgICAKLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iVGVzdCBJbXBvcnQgRHVwbGljYXRlIENhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RJbXBvcnREdXAiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iVGVzdCBJbXBvcnQgRHVwbGljYXRlIENhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RJbXBvcnREdXAiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgICAgICAgICAgCi0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSJUZXN0IEltcG9ydCBXaXphcmQgTm8gQ2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGF0YXRyYW5zZmVyLlRlc3RJbXBvcnRXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW1wb3J0Lk5vQ2F0ZWdvcnkiPgotICAgICAgPC93aXphcmQ+ICAKLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IlRlc3QgSW1wb3J0IENhdGVnb3J5IE5vdCBWYWxpZCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kYXRhdHJhbnNmZXIuVGVzdEltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5JbnZhbGlkQ2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuaW1wb3J0LkludmFsaWRDYXRlZ29yeSI+Ci0gICAgICA8L3dpemFyZD4gIAotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iVGVzdCBJbXBvcnQgQWRkIFRvIE5ldyBDYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kYXRhdHJhbnNmZXIuVGVzdEltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0SW1wb3J0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmltcG9ydC5OZXdDYXRlZ29yeSI+Ci0gICAgICA8L3dpemFyZD4gCi0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSJUZXN0IEltcG9ydCBBZGQgVG8gUGFyZW50ZWQgQ2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGF0YXRyYW5zZmVyLlRlc3RJbXBvcnRXaXphcmQiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuQmFzaWMvb3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdEltcG9ydFBhcmVudGVkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmltcG9ydC5OZXdQYXJlbnRlZENhdGVnb3J5Ij4KLSAgICAgIDwvd2l6YXJkPiAgICAgICAKLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IlRlc3QgSW1wb3J0IER1cGxpY2F0ZSBDYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kYXRhdHJhbnNmZXIuVGVzdEltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0SW1wb3J0RHVwIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmltcG9ydC5EdXBsaWNhdGVDYXRlZ29yeSI+Ci0gICAgICA8L3dpemFyZD4gCi0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSJUZXN0IEltcG9ydCBVc2luZyBFeHBvcnQgQ2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGF0YXRyYW5zZmVyLlRlc3RJbXBvcnRXaXphcmQiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdEV4cG9ydCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5pbXBvcnQuVXNpbmdFeHBvcnRDYXRlZ29yeSI+Ci0gICAgICA8L3dpemFyZD4gICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgCTwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iVGVzdCBFeHBvcnQgQ2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdEV4cG9ydCI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSJUZXN0IEV4cG9ydCBQYXJlbnRlZCBDYXRlZ29yeSIKLSAgICAgICAgICAgIHBhcmVudENhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5CYXNpYyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5UZXN0RXhwb3J0UGFyZW50ZWQiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iVGVzdCBFeHBvcnQgRHVwbGljYXRlIENhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RFeHBvcnREdXAiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iVGVzdCBFeHBvcnQgRHVwbGljYXRlIENhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RFeHBvcnREdXAiPgotICAgICAgPC9jYXRlZ29yeT4gICAgICAKLSAKLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IlRlc3QgRXhwb3J0IFdpemFyZCBObyBDYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kYXRhdHJhbnNmZXIuVGVzdEV4cG9ydFdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5leHBvcnQuTm9DYXRlZ29yeSI+Ci0gICAgICA8L3dpemFyZD4gICAgICAKLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IlRlc3QgRXhwb3J0IENhdGVnb3J5IE5vdCBWYWxpZCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5kYXRhdHJhbnNmZXIuVGVzdEV4cG9ydFdpemFyZCIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5JbnZhbGlkQ2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuZXhwb3J0LkludmFsaWRDYXRlZ29yeSI+Ci0gICAgICA8L3dpemFyZD4gICAKLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IlRlc3QgRXhwb3J0IEFkZCBUbyBOZXcgQ2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGF0YXRyYW5zZmVyLlRlc3RFeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdEV4cG9ydCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5leHBvcnQuTmV3Q2F0ZWdvcnkiPgotICAgICAgPC93aXphcmQ+IAotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iVGVzdCBFeHBvcnQgQWRkIFRvIFBhcmVudGVkIENhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRhdGF0cmFuc2Zlci5UZXN0RXhwb3J0V2l6YXJkIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkJhc2ljL29yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RFeHBvcnRQYXJlbnRlZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5leHBvcnQuTmV3UGFyZW50ZWRDYXRlZ29yeSI+Ci0gICAgICA8L3dpemFyZD4gIAotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iVGVzdCBFeHBvcnQgRHVwbGljYXRlIENhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmRhdGF0cmFuc2Zlci5UZXN0RXhwb3J0V2l6YXJkIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlRlc3RFeHBvcnREdXAiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuZXhwb3J0LkR1cGxpY2F0ZUNhdGVnb3J5Ij4KLSAgICAgIDwvd2l6YXJkPiAgICAgICAgCi0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSJUZXN0IEV4cG9ydCBVc2luZyBJbXBvcnQgQ2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuZGF0YXRyYW5zZmVyLlRlc3RFeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkudGVzdHMuVGVzdEltcG9ydCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5leHBvcnQuVXNpbmdJbXBvcnRDYXRlZ29yeSI+Ci0gICAgICA8L3dpemFyZD4gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIAk8L2V4dGVuc2lvbj4KLSAgIAkgICAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZW5jb2RpbmdzIj4KLSAgICAgIDxlbmNvZGluZyBuYW1lPSJCbG9yZiIvPgotICAgICAgPGVuY29kaW5nIG5hbWU9IiIvPgotICAgPC9leHRlbnNpb24+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICAgPHZpZXcKLSAgICAgICAgICAgICBpY29uPSJpY29ucy9hbnl0aGluZy5naWYiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLnBhcnRzLlBlcmZvcm1hbmNlVmlld1BhcnQiCi0gICAgICAgICAgICAgbmFtZT0iQmFzaWMgUGVyZm9ybWFuY2UgVmlldyIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMucGVyZl9iYXNpYyIvPgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgIDwhLS0gT2JqZWN0Q29udHJpYnV0aW9uVGVzdHMgLS0+Ci0gICAgCi0gICAgPGV4dGVuc2lvbgotICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm1lbnVzLk9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UudWkudGVzdHMubWVudXMuT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3NlcyRJQSI+Ci0gICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UudWkudGVzdHMubWVudXMuT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3NlcyRJQ29tbW9uIi8+Ci0gICAgICAgPC9mYWN0b3J5PgotICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm1lbnVzLk9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UudWkudGVzdHMubWVudXMuT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3NlcyRJQiI+Ci0gICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UudWkudGVzdHMubWVudXMuT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3NlcyRJQ29tbW9uIi8+Ci0gICAgICAgPC9mYWN0b3J5PgotICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm1lbnVzLk9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UudWkudGVzdHMubWVudXMuT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3NlcyRJTW9kZWxFbGVtZW50Ij4KLSAgICAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KLSAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMubWVudXMuT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3NlcyIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51cy5PYmplY3RDb250cmlidXRpb25DbGFzc2VzJElNb2RlbEVsZW1lbnQiPgotICAgICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nIi8+Ci0gICAgICAgPC9mYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51cy5PYmplY3RDb250cmlidXRpb25DbGFzc2VzJElDb21tb24iCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0iYWRhdGFibGVPYmplY3RDb250cmlidXRpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJJQ29tbW9uIEl0ZW0gMSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hcGkuTW9ja0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgaWQ9IklDb21tb24uMSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm1lbnVzLk9iamVjdENvbnRyaWJ1dGlvbkNsYXNzZXMkSUNvbW1vbiIKLSAgICAgICAgICAgIGlkPSJhZGF0YWJsZU9iamVjdENvbnRyaWJ1dGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IklDb21tb24gSXRlbSAyIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpZD0iSUNvbW1vbi4yIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMubWVudXMuT2JqZWN0Q29udHJpYnV0aW9uQ2xhc3NlcyRDb21tb24iCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0iYWRhdGFibGVPYmplY3RDb250cmlidXRpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJDb21tb24gSXRlbSAxIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpZD0iQ29tbW9uLjEiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tZW51cy5PYmplY3RDb250cmlidXRpb25DbGFzc2VzJENvbW1vbiIKLSAgICAgICAgICAgIGlkPSJhZGF0YWJsZU9iamVjdENvbnRyaWJ1dGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IkNvbW1vbiBJdGVtIDIiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIGlkPSJDb21tb24uMiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJhZGF0YWJsZU9iamVjdENvbnRyaWJ1dGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IlJlc291cmNlIEl0ZW0iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLk1vY2tBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIGlkPSJJUmVzb3VyY2UuMSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9ImFkYXRhYmxlT2JqZWN0Q29udHJpYnV0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iUHJvamVjdCBJdGVtIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpZD0iSVByb2plY3QuMSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9ImFkYXRhYmxlT2JqZWN0Q29udHJpYnV0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iRmlsZSBJdGVtIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpZD0iSUZpbGUuMSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nIgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9ImFkYXRhYmxlT2JqZWN0Q29udHJpYnV0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iUmVzb3VyY2UgTWFwcGluZyBJdGVtIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5Nb2NrQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpZD0iUmVzb3VyY2VNYXBwaW5nLjEiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAJPC9leHRlbnNpb24+Ci0gCQotICAJPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAJCTx2aWV3Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5NdWx0aXBsZXhBbGxWaWV3IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmNvbXBvbmVudHMuY29udGV4dCIKLSAgICAgICAgICAgIG5hbWU9Ik11bHRpcGxleEFsbFZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5NdWx0aXBsZXhBbGxWaWV3Ii8+Ci0gICAgICAgICAgICAKLSAgICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb21wb25lbnRzLmZyYW1ld29yay5SZWZsZWN0aW9uRmFjdG9yeTpvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLk11bHRpcGxleE5hbWVWaWV3IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmNvbXBvbmVudHMuY29udGV4dCIKLSAgICAgICAgICAgIG5hbWU9Ik11bHRpcGxleE5hbWVWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBvbmVudHMuTXVsdGlwbGV4TmFtZVZpZXciLz4KLSAgICAgICAgICAgIAotICAgICAgICA8dmlldwotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlJlZmxlY3Rpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBvbmVudHMuTXVsdGlwbGV4ZXJUZXN0VmlldyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5jb21wb25lbnRzLmNvbXBvbmVudEV4YW1wbGVzIgotICAgICAgICAgICAgbmFtZT0iVGVzdCBtdWx0aXBsZXhlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLk11bHRpcGxleGVyVGVzdFZpZXciLz4KLSAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnJlc291cmNlVGVzdHMiCi0gICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tYXJrZXJzLlJlc291cmNlTWFwcGluZ1Rlc3RWaWV3IgotICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMucmVzb3VyY2VNYXBwaW5nVmlldyIKLSAgICAgICAgICAgICAgbmFtZT0iUmVzb3VyY2UgTWFwcGluZyBUZXN0Ii8+Ci0gICAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMucmVzb3VyY2VUZXN0cyIKLSAgICAgICAgICAgICAgbmFtZT0iUmVzb3VyY2UgVGVzdHMiLz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCTwvZXh0ZW5zaW9uPiAgICAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzIj4KLSAgICAgICAgICAKLSAgICAgICAgICA8c2NvcGUgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBvbmVudHMuRXJyb3JUZXN0U2NvcGUiLz4KLSAgICAgICA8Y29tcG9uZW50Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlJlZmxlY3Rpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBvbmVudHMuQ3ljbGVUZXN0MiIKLSAgICAgICAgICAgICBpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBvbmVudHMuQ3ljbGVUZXN0MiIKLSAgICAgICAgICAgICBzY29wZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5FcnJvclRlc3RTY29wZSIvPgotICAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5DeWNsZVRlc3QxIgotICAgICAgICAgICAgIGludGVyZmFjZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5DeWNsZVRlc3QxIgotICAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLkVycm9yVGVzdFNjb3BlIi8+Ci0gICAgICAgPGNvbXBvbmVudAotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb21wb25lbnRzLmZyYW1ld29yay5SZWZsZWN0aW9uRmFjdG9yeTpvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLk1pc3NpbmdEZXBlbmRlbmN5VmlldyIKLSAgICAgICAgICAgICBpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBvbmVudHMuTWlzc2luZ0RlcGVuZGVuY3lWaWV3IgotICAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLkVycm9yVGVzdFNjb3BlIi8+Ci0gICAgICAgPGNvbXBvbmVudAotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb21wb25lbnRzLmZyYW1ld29yay5SZWZsZWN0aW9uRmFjdG9yeTpvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLkluc3RhbmNlQ291bnRDb21wb25lbnQiCi0gICAgICAgICAgICAgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLkluc3RhbmNlQ291bnRDb21wb25lbnQiCi0gICAgICAgICAgICAgc2NvcGU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBvbmVudHMuRXJyb3JUZXN0U2NvcGUiLz4KLSAgICAgICA8Y29tcG9uZW50Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbXBvbmVudHMuZnJhbWV3b3JrLlJlZmxlY3Rpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBvbmVudHMuVmlld1RoYXRUaHJvd3NBbkV4Y2VwdGlvbiIKLSAgICAgICAgICAgICBpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBvbmVudHMuSUludGVyZmFjZVRoYXRUaHJvd3NBbkV4Y2VwdGlvbiIKLSAgICAgICAgICAgICBzY29wZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5FcnJvclRlc3RTY29wZSIvPgotICAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5WYWxpZERlcGVuZGVuY3kiCi0gICAgICAgICAgICAgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLlZhbGlkRGVwZW5kZW5jeSIKLSAgICAgICAgICAgICBzY29wZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5FcnJvclRlc3RTY29wZSIvPgotICAgICAgIDxjb21wb25lbnQKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5WYWxpZERlcGVuZGVuY3kyIgotICAgICAgICAgICAgIGludGVyZmFjZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5WYWxpZERlcGVuZGVuY3kyIgotICAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLkVycm9yVGVzdFNjb3BlIi8+Ci0JICAgPGNvbXBvbmVudAotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb21wb25lbnRzLmZyYW1ld29yay5SZWZsZWN0aW9uRmFjdG9yeTpvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLkNvbXBvbmVudFRoYXREb2VzTm90RXhpc3QiCi0gICAgICAgICAgICAgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLklJbnRlcmZhY2VUaGF0Tm9ib2R5SW1wbGVtZW50cyIKLSAgICAgICAgICAgICBzY29wZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5FcnJvclRlc3RTY29wZSIvPgotCSAgIDxjb21wb25lbnQKLSAgICAgICAgICAgICBpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmNvbXBvbmVudHMuVmlld1Njb3BlRGVwZW5kZW5jeSIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5WaWV3U2NvcGVEZXBlbmRlbmN5IgotICAgICAgICAgICAgIHNjb3BlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jb21wb25lbnRzLkVycm9yVGVzdFNjb3BlIi8+Ci0JICAgPGNvbXBvbmVudAotICAgICAgICAgICAgIGludGVyZmFjZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5Xcm9uZ1Njb3BlRGVwZW5kZW5jeSIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY29tcG9uZW50cy5mcmFtZXdvcmsuUmVmbGVjdGlvbkZhY3Rvcnk6b3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5Xcm9uZ1Njb3BlRGVwZW5kZW5jeSIKLSAgICAgICAgICAgICBzY29wZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuY29tcG9uZW50cy5FcnJvclRlc3RTY29wZSIvPiAgICAgICAgICAgICAKLSAgICAgICA8L2V4dGVuc2lvbj4KLQotICAgIDwhLS0gUHJlZmVyZW5jZSBUcmFuc2ZlciBleGFtcGxlcyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVRyYW5zZmVyIj4KLSAgICAgICA8dHJhbnNmZXIKLSAgICAgICAgICAgIGljb249ImFueXRoaW5nLmdpZiIKLSAgICAgICAgICAgIG5hbWU9IkV4cG9ydCBBbGwgVHJhbnNmZXIgVGVzdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5hbGwiPgotICAgICAgICAgICAgPG1hcHBpbmcgc2NvcGU9Imluc3RhbmNlIj4KLSAgICAgICAgICAgIDwvbWFwcGluZz4KLSAgICAgICAgICAgIDxtYXBwaW5nIHNjb3BlPSJjb25maWd1cmF0aW9uIj4KLSAgICAgICAgICAgIDwvbWFwcGluZz4KLSAgICAgICAgICAgIDxtYXBwaW5nIHNjb3BlPSJwcm9qZWN0Ij4KLSAgICAgICAgICAgIDwvbWFwcGluZz4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICBFeHBvcnQgYWxsIHRyYW5mZXIsIGV4cG9ydHMgYWxsIG5vZGVzIGZvciBzcGVjaWZpZWQgc2NvcGVzCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvdHJhbnNmZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlVHJhbnNmZXIiPgotICAgICAgIDx0cmFuc2ZlcgotICAgICAgICAgICAgbmFtZT0iQmFyZSBCb25lcyBUcmFuc2ZlciBUZXN0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmJvbmVzIj4KLSAgICAgICAgICAgIDxtYXBwaW5nIHNjb3BlPSJpbnN0YW5jZSI+Ci0gICAgICAgICAgICA8L21hcHBpbmc+Ci0gICAgPC90cmFuc2Zlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VUcmFuc2ZlciI+Ci0gICAgICAgPHRyYW5zZmVyCi0gICAgICAgICAgICBpY29uPSJiaW5hcnlfY28uZ2lmIgotICAgICAgICAgICAgbmFtZT0iRXhwb3J0IG1hbnkgcHJlZmVyZW5jZXMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubWFueSI+Ci0gICAgICAgICAgICA8bWFwcGluZyBzY29wZT0iaW5zdGFuY2UiPgotICAgICAgICAgICAgICAgIDxlbnRyeSBub2RlPSJvcmcuZWNsaXBzZS51aSI+Ci0gICAgICAgICAgICAgICAgIDxrZXkgbmFtZT0ic2hvd0ludHJvIi8+Ci0gICAgICAgICAgICAgICAgIDxrZXkgbmFtZT0iUlVOX0lOX0JBQ0tHUk9VTkQiLz4KLSAgICAgICAgICAgICAgICAgPGtleSBuYW1lPSJib2d1cyBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgPC9lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZW50cnkgbm9kZT0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICAgICAgICA8L21hcHBpbmc+Ci0gICAgICAgICAgICA8bWFwcGluZyBzY29wZT0iY29uZmlndXJhdGlvbiI+Ci0gICAgICAgICAgICA8L21hcHBpbmc+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgRXhwb3J0IG1hbnkgY29tYmluYXRpb25zIG9mIGtleXMgYW5kIG5vZGVzCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvdHJhbnNmZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuMSIKLSAgICAgICAgICAgIG5hbWU9IlV0aWwgQ2F0ZWdvcnkgMSIvPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC4yIgotICAgICAgICAgICAgbmFtZT0iVXRpbCBDYXRlZ29yeSAyIi8+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjMiCi0gICAgICAgICAgICBuYW1lPSJVdGlsIENhdGVnb3J5IDMiLz4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuNCIKLSAgICAgICAgICAgIG5hbWU9IlV0aWwgQ2F0ZWdvcnkgNCIvPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC41IgotICAgICAgICAgICAgbmFtZT0iVXRpbCBDYXRlZ29yeSA1Ii8+Ci0gICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjEiCi0gICAgICAgICAgICBuYW1lPSJVdGlsIEFjdGl2aXR5IDEiLz4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuMiIKLSAgICAgICAgICAgIG5hbWU9IlV0aWwgQWN0aXZpdHkgMiIvPgotICAgICAgPGFjdGl2aXR5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC40IgotICAgICAgICAgICAgbmFtZT0iVXRpbCBBY3Rpdml0eSA0Ii8+Ci0gICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjUiCi0gICAgICAgICAgICBuYW1lPSJVdGlsIEFjdGl2aXR5IDUiLz4KLSAgICAgIDxhY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC4yIgotICAgICAgICAgICAgcmVxdWlyZWRBY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjEiLz4KLSAgICAgIDxjYXRlZ29yeUFjdGl2aXR5QmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC4xIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC4xIi8+Ci0gICAgICA8Y2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuMiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuMiIvPgotICAgICAgPGNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjEiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjMiLz4KLSAgICAgIDxjYXRlZ29yeUFjdGl2aXR5QmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC40IgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkudGVzdHMudXRpbC40Ii8+Ci0gICAgICA8Y2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuNCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLnV0aWwuNSIvPgotICAgICAgPGNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjUiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy51dGlsLjUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGl2aXR5U3VwcG9ydCI+Ci0gICAgICA8YWN0aXZpdHlJbWFnZUJpbmRpbmcKLSAgICAgICAgICAgIGljb249Imljb25zL2FueXRoaW5nLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3Rpdml0eTEiLz4KLSAgICAgIDxjYXRlZ29yeUltYWdlQmluZGluZwotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW55dGhpbmcuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNhdGVnb3J5MSIvPiAgIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMubXVsdGllZGl0b3IuQVNQQSIKLSAgICAgICAgIG5hbWU9IkFTUEEiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0gICAgICA8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5tdWx0aWVkaXRvci5hY3Rpb25TZXQiPgotICAgICAgICAgPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm11bHRpZWRpdG9yLlRlc3RFZGl0b3IiLz4KLSAgICAgIDwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotICAgPC9leHRlbnNpb24+Ci0KLQotICAgPCEtLSAKLSAgIHRoaXMgY29udGVudCB0eXBlIHdhcyBhZGRlZCB0byBwcm92aWRlCi0gICAicmVncmVzc2lvbiB0ZXN0IiBmb3IgYnVnIDEwNzEyMS4gU2VlIE9wZW5OYXZpZ2F0b3JGb2xkZXJUZXN0Ci0gICBmb3IgbW9yZSBkZXRhaWxzLiAKLSAgIC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0gICAJPGNvbnRlbnQtdHlwZSAKLSAgIAkJZmlsZS1leHRlbnNpb25zPSJodG1sdGVzdG9ubHkiIAotICAgCQlwcmlvcml0eT0iaGlnaCIKLSAgIAkJbmFtZT0iQ29udGVudCBUeXBlIGZvciBUZXN0IE9ubHkiIAotICAgCQlpZD0idGVzdE9ubHlDb250ZW50VHlwZSIKLSAgIAkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUudGV4dCI+Ci0gICAJCTxkZXNjcmliZXIKLSAgIAkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5Db250ZW50RGVzY3JpYmVyRm9yVGVzdHNPbmx5IiAvPgotICAgCTwvY29udGVudC10eXBlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLm1hcmtlclN1cHBvcnQiPgotICAgICAgPHByb2JsZW1GaWx0ZXIKLSAgICAgICAgICAgIGVuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBpZD0icHJvYmxlbVRlc3Qub25BbnlFcnJvciIKLSAgICAgICAgICAgIG5hbWU9Ik9uIEFueSBFcnJvciIKLSAgICAgICAgICAgIHNjb3BlPSJPTl9BTlkiCi0gICAgICAgICAgICBzZXZlcml0eT0iRVJST1IiLz4KLSAgICAgIDxwcm9ibGVtRmlsdGVyCi0gICAgICAgICAgICBlbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgaWQ9InByb2JsZW1UZXN0Lm9uU2VsZWN0ZWRXYXJuaW5nIgotICAgICAgICAgICAgbmFtZT0iT24gU2VsZWN0ZWQgV2FybmluZyIKLSAgICAgICAgICAgIHNjb3BlPSJPTl9TRUxFQ1RFRF9PTkxZIgotICAgICAgICAgICAgc2V2ZXJpdHk9IldBUk5JTkciLz4KLSAgICAgIDxwcm9ibGVtRmlsdGVyCi0gICAgICAgICAgICBlbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgaWQ9InByb2JsZW1UZXN0LmluZm9BbmRDaGlsZHJlbiIKLSAgICAgICAgICAgIG5hbWU9Ik9uIFNlbGVjdGVkIEluZm8gQW5kIENoaWxkcmVuIgotICAgICAgICAgICAgc2NvcGU9Ik9OX1NFTEVDVEVEX0FORF9DSElMRFJFTiIKLSAgICAgICAgICAgIHNldmVyaXR5PSJJTkZPIi8+Ci0gICAgICA8cHJvYmxlbUZpbHRlcgotICAgICAgICAgICAgZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJwcm9ibGVtVGVzdC5zYW1lQ29udGFpbmVyTm9TZXZlcml0eSIKLSAgICAgICAgICAgIG5hbWU9IlNhbWUgQ29udGFpbmVyIE5vIFNldmVyaXR5IgotICAgICAgICAgICAgc2NvcGU9Ik9OX0FOWV9JTl9TQU1FX0NPTlRBSU5FUiIvPgotICAgICAgPHByb2JsZW1GaWx0ZXIKLSAgICAgICAgICAgIGVuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBpZD0icHJvYmxlbVRlc3Qub25NZXRob2QiCi0gICAgICAgICAgICBuYW1lPSJPbiBNZXRob2QiCi0gICAgICAgICAgICBvbkRlc2NyaXB0aW9uPSJtZXRob2QiLz4KLSAgICAgIDxwcm9ibGVtRmlsdGVyCi0gICAgICAgICAgICBpZD0icHJvYmxlbVRlc3Qubm90T25NZXRob2QiCi0gICAgICAgICAgICBuYW1lPSJOb3QgT24gTWV0aG9kIgotICAgICAgICAgICAgb25EZXNjcmlwdGlvbj0iIW1ldGhvZCIvPgotICAgICAgPHByb2JsZW1GaWx0ZXIKLSAgICAgICAgICAgIGVuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBpZD0icHJvYmxlbVRlc3Qub25Qcm9ibGVtIgotICAgICAgICAgICAgbmFtZT0iT24gTWFya2VyVHlwZSI+Ci0gICAgICAgICA8c2VsZWN0ZWRUeXBlIG1hcmtlcklkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIi8+Ci0gICAgICA8L3Byb2JsZW1GaWx0ZXI+Ci0gICAgIAotICAgICAgIDxtYXJrZXJUeXBlQ2F0ZWdvcnkgbmFtZT0iVGVzdCBNYXJrZXJzIj4KLSAgICAgICAgIDxtYXJrZXJUeXBlUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jYXRlZ29yeVRlc3RNYXJrZXIiLz4KLSAgICAgICAgIDxtYXJrZXJUeXBlUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy50ZXN0bWFya2VyIi8+Ci0gICAgICAgICA8bWFya2VyVHlwZVJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMudGVzdG1hcmtlcjIiLz4KLSAgICAgIDwvbWFya2VyVHlwZUNhdGVnb3J5PgotICAgICAgIDxtYXJrZXJHcm91cGluZwotICAgICAgICAgICAgIGF0dHJpYnV0ZT0idGVzdEF0dHJpYnV0ZSIKLSAgICAgICAgICAgICBuYW1lPSJUZXN0IE1hcmtlcnMiPgotICAgICAgICAgIDxtYXJrZXJBdHRyaWJ1dGVNYXBwaW5nCi0gICAgICAgICAgICAgICAgbmFtZT0iRmlyc3QgY2F0ZWdvcnkiCi0gICAgICAgICAgICAgICAgdmFsdWU9IjAiLz4KLSAgICAgICAgICA8bWFya2VyQXR0cmlidXRlTWFwcGluZwotICAgICAgICAgICAgICAgIG5hbWU9IlNlY29uZCBDYXRlZ29yeSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxtYXJrZXJUeXBlUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51aS50ZXN0cy50ZXN0bWFya2VyIi8+Ci0gICAgICAgPC9tYXJrZXJHcm91cGluZz4KLSAgICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJjYXRlZ29yeVRlc3RNYXJrZXIiCi0gICAgICAgICBuYW1lPSJDYXRlZ29yeSBUZXN0IE1hcmtlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VyUmVzb2x1dGlvbiI+Ci0gICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLm1hcmtlcnMuVGVzdFJlc29sdXRpb25HZW5lcmF0b3IiCi0gICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS51aS50ZXN0cy5jYXRlZ29yeVRlc3RNYXJrZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0KLQotPC9wbHVnaW4+ICAgICAgICAgICAgCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDE0NGRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KLQotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS51aS50ZXN0cyIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiPgotICAgIDwhLS0gQ29tbWVudGVkIG91dCB1bnRpbCBzb3VyY2Ugb2YgcHJvYmxlbSBmb3VuZCAobm90IHJldXNpbmcgc2FtZSB3b3Jrc3BhY2UgZGlyKQotICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXNzaW9uLWZvbGRlciIgCi0gICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vdWlfc2Vzc2lvbl9zbmlmZl9mb2xkZXIiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtzZXNzaW9uLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtzZXNzaW9uLWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiAKLSAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlNlc3Npb25DcmVhdGVUZXN0Ii8+Ci0gIAotICAgIDwvYW50PgotICAgIAotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7c2Vzc2lvbi1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlNlc3Npb25SZXN0b3JlVGVzdCIvPgotICAgIDwvYW50PgotICAgIC0tPgotCi0gICAgPHByb3BlcnR5IG5hbWU9InNuaWZmLWZvbGRlciIKLSAgICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS91aV9zbmlmZl9mb2xkZXIiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtzbmlmZi1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7c25pZmYtZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiCi0gICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlVpVGVzdFN1aXRlIi8+Ci0KLSAgICA8L2FudD4KLSAgICAKLSAgICA8cHJvcGVydHkgbmFtZT0iamZhY2Utc25pZmYtZm9sZGVyIgotICAgICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pmYWNlX3NuaWZmX2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2pmYWNlLXNuaWZmLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pmYWNlLXNuaWZmLWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIgotICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXN0cy5BbGxUZXN0cyIvPgotICAgIDwvYW50PgotICAgIAotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0icGFydHNfZGF0YV9mb2xkZXIiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIgotICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS51aS5wYXJ0cy50ZXN0cy5QYXJ0c1JlZmVyZW5jZXNUZXN0U3VpdGUiLz4KLSAgICA8L2FudD4KLSAgICAKLSAgICA8YW50IHRhcmdldD0idWktdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSJzZXNzaW9uX2RhdGFfZm9sZGVyIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuc2Vzc2lvbi5TZXNzaW9uVGVzdHMiLz4KLSAgICA8L2FudD4KLSAgICAKLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotCi0JCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy91aVNuaWZmIGIvdGVzdHMvb3JnLmVjbGlwc2UudWkudGVzdHMvdWlTbmlmZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhMjRkOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy91aVNuaWZmCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotZWNobyBSdW5uaW5nIHVpLlRlc3RTdWl0ZQotcm0gLXJmICd1aV9zbmlmZl9mb2xkZXInCi0uL2pyZS9iaW4vamF2YSAtY3Agc3RhcnR1cC5qYXIgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5VSU1haW4gLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLnVpLmp1bml0LnJ1bm5lciAtZGV2IGJpbiAtZGF0YSAlTE9DQVRJT04lIC10ZXN0UGx1Z2luTmFtZSBvcmcuZWNsaXBzZS51aS50ZXN0cyAtY2xhc3NOYW1lIG9yZy5lY2xpcHNlLnVpLnRlc3RzLlVpVGVzdFN1aXRlIC1jb25zb2xlICAKLQotZWNobyBSdW5uaW5nIHVpLmFwaS5TZXNzaW9uQ3JlYXRlVGVzdAotcm0gLXJmIHVpX3Nlc3Npb25fc25pZmZfZm9sZGVyCi0uL2pyZS9iaW4vamF2YSAtY3Agc3RhcnR1cC5qYXIgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5VSU1haW4gLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLnVpLmp1bml0LnJ1bm5lciAtZGV2IGJpbiAtZGF0YSAlTE9DQVRJT04lIC10ZXN0UGx1Z2luTmFtZSBvcmcuZWNsaXBzZS51aS50ZXN0cyAtY2xhc3NOYW1lIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TZXNzaW9uQ3JlYXRlVGVzdCAtY29uc29sZSAgCi0KLWVjaG8gUnVubmluZyB1aS5hcGkuU2Vzc2lvblJlc3RvcmVUZXN0Ci0uL2pyZS9iaW4vamF2YSAtY3Agc3RhcnR1cC5qYXIgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5VSU1haW4gLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLnVpLmp1bml0LnJ1bm5lciAtZGV2IGJpbiAtZGF0YSAlTE9DQVRJT04lIC10ZXN0UGx1Z2luTmFtZSBvcmcuZWNsaXBzZS51aS50ZXN0cyAtY2xhc3NOYW1lIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TZXNzaW9uUmVzdG9yZVRlc3QgLWNvbnNvbGUgCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS51aS50ZXN0cy91aVNuaWZmLmJhdCBiL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL3VpU25pZmYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2QzZjEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnVpLnRlc3RzL3VpU25pZmYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotQGVjaG8gb2ZmCi1yZW0gVGhpcyBpcyB0aGUgVUkgU25pZmYgdGVzdCBiYXRjaCBmaWxlLiAgCi0KLXNldCBDTEFTU1BBVEg9c3RhcnR1cC5qYXIKLQotc2V0IExPQ0FUSU9OPXVpX3NuaWZmX2ZvbGRlcgotZGVsIC9RIC9TICVMT0NBVElPTiUKLWVjaG8gUnVubmluZyBVaVRlc3RTdWl0ZQotLlxqcmVcYmluXGphdmEgLWNwICVDTEFTU1BBVEglIG9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIuVUlNYWluIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS51aS5qdW5pdC5ydW5uZXIgLWRldiBiaW4gLWRhdGEgJUxPQ0FUSU9OJSAtdGVzdFBsdWdpbk5hbWUgb3JnLmVjbGlwc2UudWkudGVzdHMgLWNsYXNzTmFtZSBvcmcuZWNsaXBzZS51aS50ZXN0cy5VaVRlc3RTdWl0ZSAtY29uc29sZQotCi1zZXQgTE9DQVRJT049dWlfc2Vzc2lvbl9zbmlmZl9mb2xkZXIKLWRlbCAvUSAvUyAlTE9DQVRJT04lCi1lY2hvIFJ1bm5pbmcgU2Vzc2lvbkNyZWF0ZVRlc3QKLS5canJlXGJpblxqYXZhIC1jcCAlQ0xBU1NQQVRIJSBvcmcuZWNsaXBzZS5jb3JlLmxhdW5jaGVyLlVJTWFpbiAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UudWkuanVuaXQucnVubmVyIC1kZXYgYmluIC1kYXRhICVMT0NBVElPTiUgLXRlc3RQbHVnaW5OYW1lIG9yZy5lY2xpcHNlLnVpLnRlc3RzIC1jbGFzc05hbWUgb3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlNlc3Npb25DcmVhdGVUZXN0IC1jb25zb2xlCi1lY2hvIFJ1bm5pbmcgU2Vzc2lvblJlc3RvcmVUZXN0Ci0uXGpyZVxiaW5camF2YSAtY3AgJUNMQVNTUEFUSCUgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5VSU1haW4gLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLnVpLmp1bml0LnJ1bm5lciAtZGV2IGJpbiAtZGF0YSAlTE9DQVRJT04lIC10ZXN0UGx1Z2luTmFtZSBvcmcuZWNsaXBzZS51aS50ZXN0cyAtY2xhc3NOYW1lIG9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TZXNzaW9uUmVzdG9yZVRlc3QgLWNvbnNvbGUKLQo=